From 71a26fd7bce2688522350ce43c6804aeaa449387 Mon Sep 17 00:00:00 2001 From: Ahad Bawany Date: Fri, 19 Nov 2021 16:33:50 -0800 Subject: [PATCH 01/11] Adding dirty updates --- __init__.py | 79 + __pycache__/__init__.cpython-37.pyc | Bin 0 -> 1381 bytes __pycache__/deprecated.cpython-37.pyc | Bin 0 -> 2190 bytes api/__init__.py | 38 + api/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 341 bytes api/__pycache__/api.cpython-37.pyc | Bin 0 -> 13302 bytes api/api.py | 443 + api/cloud_cache/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 192 bytes .../__pycache__/cloud_cache.cpython-37.pyc | Bin 0 -> 38354 bytes .../file_attributes.cpython-37.pyc | Bin 0 -> 2509 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 7232 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 2626 bytes api/cloud_cache/cloud_cache.py | 1301 + api/cloud_cache/file_attributes.py | 69 + api/cloud_cache/manifest.py | 240 + api/cloud_cache/utils.py | 89 + api/queries/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 188 bytes ...tated_section_data_sets_api.cpython-37.pyc | Bin 0 -> 7099 bytes .../biophysical_api.cpython-37.pyc | Bin 0 -> 9375 bytes .../brain_observatory_api.cpython-37.pyc | Bin 0 -> 23607 bytes .../__pycache__/cell_types_api.cpython-37.pyc | Bin 0 -> 12059 bytes .../connected_services.cpython-37.pyc | Bin 0 -> 7933 bytes .../__pycache__/glif_api.cpython-37.pyc | Bin 0 -> 6069 bytes .../__pycache__/grid_data_api.cpython-37.pyc | Bin 0 -> 7159 bytes .../image_download_api.cpython-37.pyc | Bin 0 -> 14717 bytes .../mouse_atlas_api.cpython-37.pyc | Bin 0 -> 3855 bytes .../mouse_connectivity_api.cpython-37.pyc | Bin 0 -> 17591 bytes .../__pycache__/ontologies_api.cpython-37.pyc | Bin 0 -> 7575 bytes .../reference_space_api.cpython-37.pyc | Bin 0 -> 7957 bytes .../__pycache__/rma_api.cpython-37.pyc | Bin 0 -> 15835 bytes .../__pycache__/rma_pager.cpython-37.pyc | Bin 0 -> 1543 bytes .../__pycache__/rma_template.cpython-37.pyc | Bin 0 -> 2892 bytes .../__pycache__/svg_api.cpython-37.pyc | Bin 0 -> 1971 bytes .../synchronization_api.cpython-37.pyc | Bin 0 -> 7296 bytes .../tree_search_api.cpython-37.pyc | Bin 0 -> 1864 bytes .../annotated_section_data_sets_api.py | 234 + api/queries/biophysical_api.py | 390 + api/queries/brain_observatory_api.py | 780 + api/queries/cell_types_api.py | 400 + api/queries/connected_services.py | 1119 + api/queries/glif_api.py | 250 + api/queries/grid_data_api.py | 252 + api/queries/image_download_api.py | 500 + api/queries/mouse_atlas_api.py | 150 + api/queries/mouse_connectivity_api.py | 505 + api/queries/ontologies_api.py | 314 + api/queries/reference_space_api.py | 293 + api/queries/rma_api.py | 600 + api/queries/rma_pager.py | 99 + api/queries/rma_template.py | 134 + api/queries/svg_api.py | 96 + api/queries/synchronization_api.py | 239 + api/queries/tree_search_api.py | 98 + api/warehouse_cache/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 196 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 17034 bytes .../caching_utilities.cpython-37.pyc | Bin 0 -> 4489 bytes api/warehouse_cache/cache.py | 674 + api/warehouse_cache/caching_utilities.py | 188 + brain_observatory/__init__.py | 95 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1800 bytes .../argschema_utilities.cpython-37.pyc | Bin 0 -> 5607 bytes ...rain_observatory_exceptions.cpython-37.pyc | Bin 0 -> 1079 bytes .../brain_observatory_plotting.cpython-37.pyc | Bin 0 -> 28944 bytes .../chisquare_categorical.cpython-37.pyc | Bin 0 -> 3683 bytes .../__pycache__/circle_plots.cpython-37.pyc | Bin 0 -> 18293 bytes .../comparison_utils.cpython-37.pyc | Bin 0 -> 2151 bytes .../__pycache__/demixer.cpython-37.pyc | Bin 0 -> 10764 bytes .../__pycache__/dff.cpython-37.pyc | Bin 0 -> 9555 bytes .../drifting_gratings.cpython-37.pyc | Bin 0 -> 14806 bytes .../__pycache__/findlevel.cpython-37.pyc | Bin 0 -> 626 bytes .../locally_sparse_noise.cpython-37.pyc | Bin 0 -> 12889 bytes .../__pycache__/natural_movie.cpython-37.pyc | Bin 0 -> 5288 bytes .../__pycache__/natural_scenes.cpython-37.pyc | Bin 0 -> 11787 bytes .../observatory_plots.cpython-37.pyc | Bin 0 -> 14344 bytes .../__pycache__/r_neuropil.cpython-37.pyc | Bin 0 -> 7774 bytes .../__pycache__/roi_masks.cpython-37.pyc | Bin 0 -> 13151 bytes .../__pycache__/running_speed.cpython-37.pyc | Bin 0 -> 944 bytes .../session_analysis.cpython-37.pyc | Bin 0 -> 19801 bytes .../session_api_utils.cpython-37.pyc | Bin 0 -> 7513 bytes .../static_gratings.cpython-37.pyc | Bin 0 -> 17141 bytes .../stimulus_analysis.cpython-37.pyc | Bin 0 -> 17211 bytes .../__pycache__/stimulus_info.cpython-37.pyc | Bin 0 -> 24051 bytes .../__pycache__/sync_dataset.cpython-37.pyc | Bin 0 -> 21327 bytes brain_observatory/argschema_utilities.py | 156 + brain_observatory/behavior/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1468 bytes .../behavior_ophys_analysis.cpython-37.pyc | Bin 0 -> 3774 bytes .../behavior_ophys_experiment.cpython-37.pyc | Bin 0 -> 25519 bytes .../behavior_ophys_session.cpython-37.pyc | Bin 0 -> 966 bytes .../behavior_session.cpython-37.pyc | Bin 0 -> 33180 bytes .../__pycache__/criteria.cpython-37.pyc | Bin 0 -> 9121 bytes .../__pycache__/dprime.cpython-37.pyc | Bin 0 -> 3961 bytes .../event_detection.cpython-37.pyc | Bin 0 -> 1468 bytes .../eye_tracking_processing.cpython-37.pyc | Bin 0 -> 7580 bytes .../__pycache__/image_api.cpython-37.pyc | Bin 0 -> 1803 bytes .../__pycache__/mtrain.cpython-37.pyc | Bin 0 -> 7912 bytes .../ophys_experiment.cpython-37.pyc | Bin 0 -> 24818 bytes .../__pycache__/ophys_session.cpython-37.pyc | Bin 0 -> 31717 bytes .../rewards_processing.cpython-37.pyc | Bin 0 -> 1444 bytes .../__pycache__/schemas.cpython-37.pyc | Bin 0 -> 8167 bytes .../session_metrics.cpython-37.pyc | Bin 0 -> 1820 bytes .../stimulus_processing.cpython-37.pyc | Bin 0 -> 15607 bytes .../__pycache__/trial_masks.cpython-37.pyc | Bin 0 -> 1800 bytes .../trials_processing.cpython-37.pyc | Bin 0 -> 36163 bytes .../behavior/behavior_ophys_analysis.py | 115 + .../behavior/behavior_ophys_experiment.py | 755 + .../behavior/behavior_ophys_session.py | 18 + .../behavior_project_cache/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 363 bytes .../behavior_project_cache.cpython-37.pyc | Bin 0 -> 21797 bytes .../behavior_project_cache.py | 617 + .../external/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 235 bytes ...ior_project_metadata_writer.cpython-37.pyc | Bin 0 -> 6722 bytes .../behavior_project_metadata_writer.py | 220 + .../project_apis/abcs/__init__.py | 1 + .../abcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 386 bytes .../behavior_project_base.cpython-37.pyc | Bin 0 -> 3376 bytes .../abcs/behavior_project_base.py | 67 + .../project_apis/data_io/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 553 bytes .../behavior_project_cloud_api.cpython-37.pyc | Bin 0 -> 14644 bytes .../behavior_project_lims_api.cpython-37.pyc | Bin 0 -> 25588 bytes .../data_io/behavior_project_cloud_api.py | 402 + .../data_io/behavior_project_lims_api.py | 637 + .../behavior_project_cache/tables/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 233 bytes .../experiments_table.cpython-37.pyc | Bin 0 -> 2549 bytes .../__pycache__/ophys_mixin.cpython-37.pyc | Bin 0 -> 823 bytes .../ophys_sessions_table.cpython-37.pyc | Bin 0 -> 2150 bytes .../__pycache__/project_table.cpython-37.pyc | Bin 0 -> 1885 bytes .../__pycache__/sessions_table.cpython-37.pyc | Bin 0 -> 4659 bytes .../tables/experiments_table.py | 70 + .../tables/ophys_mixin.py | 20 + .../tables/ophys_sessions_table.py | 51 + .../tables/project_table.py | 49 + .../tables/sessions_table.py | 119 + .../tables/util/__init__.py | 0 .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 238 bytes .../experiments_table_utils.cpython-37.pyc | Bin 0 -> 2806 bytes .../prior_exposure_processing.cpython-37.pyc | Bin 0 -> 5850 bytes .../tables/util/experiments_table_utils.py | 126 + .../tables/util/prior_exposure_processing.py | 180 + .../behavior/behavior_session.py | 946 + brain_observatory/behavior/criteria.py | 216 + .../behavior/data_files/__init__.py | 3 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 494 bytes .../__pycache__/_data_file_abc.cpython-37.pyc | Bin 0 -> 3283 bytes .../avg_projection_file.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/demix_file.cpython-37.pyc | Bin 0 -> 3025 bytes .../__pycache__/dff_file.cpython-37.pyc | Bin 0 -> 3114 bytes .../event_detection_file.cpython-37.pyc | Bin 0 -> 3158 bytes .../eye_tracking_file.cpython-37.pyc | Bin 0 -> 2535 bytes .../max_projection_file.cpython-37.pyc | Bin 0 -> 225 bytes ...rigid_motion_transform_file.cpython-37.pyc | Bin 0 -> 3058 bytes .../__pycache__/stimulus_file.cpython-37.pyc | Bin 0 -> 3032 bytes .../__pycache__/sync_file.cpython-37.pyc | Bin 0 -> 3081 bytes .../behavior/data_files/_data_file_abc.py | 94 + .../data_files/avg_projection_file.py | 0 .../behavior/data_files/demix_file.py | 66 + .../behavior/data_files/dff_file.py | 65 + .../data_files/event_detection_file.py | 73 + .../behavior/data_files/eye_tracking_file.py | 50 + .../data_files/max_projection_file.py | 0 .../data_files/rigid_motion_transform_file.py | 62 + .../behavior/data_files/stimulus_file.py | 73 + .../behavior/data_files/sync_file.py | 71 + .../behavior/data_objects/__init__.py | 9 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 977 bytes .../__pycache__/licks.cpython-37.pyc | Bin 0 -> 4047 bytes .../motion_correction.cpython-37.pyc | Bin 0 -> 2440 bytes .../__pycache__/projections.cpython-37.pyc | Bin 0 -> 5111 bytes .../__pycache__/rewards.cpython-37.pyc | Bin 0 -> 2858 bytes .../task_parameters.cpython-37.pyc | Bin 0 -> 7521 bytes .../behavior/data_objects/base/__init__.py | 0 .../base/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 221 bytes .../_data_object_abc.cpython-37.pyc | Bin 0 -> 5082 bytes .../readable_interfaces.cpython-37.pyc | Bin 0 -> 4340 bytes .../writable_interfaces.cpython-37.pyc | Bin 0 -> 1739 bytes .../data_objects/base/_data_object_abc.py | 160 + .../data_objects/base/readable_interfaces.py | 105 + .../data_objects/base/writable_interfaces.py | 40 + .../data_objects/cell_specimens/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 231 bytes .../__pycache__/cell_specimens.cpython-37.pyc | Bin 0 -> 17680 bytes .../__pycache__/events.cpython-37.pyc | Bin 0 -> 4351 bytes .../__pycache__/rois_mixin.cpython-37.pyc | Bin 0 -> 2518 bytes .../cell_specimens/cell_specimens.py | 606 + .../data_objects/cell_specimens/events.py | 137 + .../data_objects/cell_specimens/rois_mixin.py | 89 + .../cell_specimens/traces/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 238 bytes ...rrected_fluorescence_traces.cpython-37.pyc | Bin 0 -> 3024 bytes .../__pycache__/dff_traces.cpython-37.pyc | Bin 0 -> 3485 bytes .../traces/corrected_fluorescence_traces.py | 83 + .../cell_specimens/traces/dff_traces.py | 88 + .../data_objects/eye_tracking/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 229 bytes .../eye_tracking_table.cpython-37.pyc | Bin 0 -> 5486 bytes .../__pycache__/rig_geometry.cpython-37.pyc | Bin 0 -> 9016 bytes .../eye_tracking/eye_tracking_table.py | 198 + .../data_objects/eye_tracking/rig_geometry.py | 284 + .../behavior/data_objects/licks.py | 124 + .../data_objects/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../behavior_ophys_metadata.cpython-37.pyc | Bin 0 -> 4910 bytes .../metadata/behavior_metadata/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 243 bytes .../behavior_metadata.cpython-37.pyc | Bin 0 -> 14599 bytes .../behavior_session_id.cpython-37.pyc | Bin 0 -> 2625 bytes .../behavior_session_uuid.cpython-37.pyc | Bin 0 -> 2296 bytes .../date_of_acquisition.cpython-37.pyc | Bin 0 -> 4289 bytes .../__pycache__/equipment.cpython-37.pyc | Bin 0 -> 3002 bytes .../__pycache__/foraging_id.cpython-37.pyc | Bin 0 -> 1616 bytes .../__pycache__/session_type.cpython-37.pyc | Bin 0 -> 1837 bytes .../stimulus_frame_rate.cpython-37.pyc | Bin 0 -> 1849 bytes .../behavior_metadata/behavior_metadata.py | 320 + .../behavior_metadata/behavior_session_id.py | 54 + .../behavior_session_uuid.py | 49 + .../behavior_metadata/date_of_acquisition.py | 116 + .../metadata/behavior_metadata/equipment.py | 73 + .../metadata/behavior_metadata/foraging_id.py | 32 + .../behavior_metadata/session_type.py | 36 + .../behavior_metadata/stimulus_frame_rate.py | 33 + .../metadata/behavior_ophys_metadata.py | 167 + .../ophys_experiment_metadata/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 251 bytes .../experiment_container_id.cpython-37.pyc | Bin 0 -> 2029 bytes .../field_of_view_shape.cpython-37.pyc | Bin 0 -> 2352 bytes .../__pycache__/imaging_depth.cpython-37.pyc | Bin 0 -> 1991 bytes .../__pycache__/imaging_plane.cpython-37.pyc | Bin 0 -> 4108 bytes .../ophys_experiment_metadata.cpython-37.pyc | Bin 0 -> 4840 bytes .../ophys_session_id.cpython-37.pyc | Bin 0 -> 1916 bytes .../__pycache__/project_code.cpython-37.pyc | Bin 0 -> 1525 bytes .../experiment_container_id.py | 35 + .../field_of_view_shape.py | 48 + .../imaging_depth.py | 35 + .../imaging_plane.py | 107 + .../multi_plane_metadata/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 272 bytes .../imaging_plane_group.cpython-37.pyc | Bin 0 -> 3088 bytes .../multi_plane_metadata.cpython-37.pyc | Bin 0 -> 3564 bytes .../imaging_plane_group.py | 77 + .../multi_plane_metadata.py | 102 + .../ophys_experiment_metadata.py | 147 + .../ophys_session_id.py | 36 + .../ophys_experiment_metadata/project_code.py | 26 + .../metadata/subject_metadata/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 242 bytes .../__pycache__/age.cpython-37.pyc | Bin 0 -> 2901 bytes .../__pycache__/driver_line.cpython-37.pyc | Bin 0 -> 2333 bytes .../__pycache__/full_genotype.cpython-37.pyc | Bin 0 -> 2548 bytes .../__pycache__/mouse_id.cpython-37.pyc | Bin 0 -> 2010 bytes .../__pycache__/reporter_line.cpython-37.pyc | Bin 0 -> 3972 bytes .../__pycache__/sex.cpython-37.pyc | Bin 0 -> 2107 bytes .../subject_metadata.cpython-37.pyc | Bin 0 -> 5312 bytes .../metadata/subject_metadata/age.py | 77 + .../metadata/subject_metadata/driver_line.py | 47 + .../subject_metadata/full_genotype.py | 57 + .../metadata/subject_metadata/mouse_id.py | 42 + .../subject_metadata/reporter_line.py | 113 + .../metadata/subject_metadata/sex.py | 41 + .../subject_metadata/subject_metadata.py | 162 + .../data_objects/motion_correction.py | 71 + .../behavior/data_objects/projections.py | 128 + .../behavior/data_objects/rewards.py | 92 + .../data_objects/running_speed/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 230 bytes .../running_acquisition.cpython-37.pyc | Bin 0 -> 5922 bytes .../running_processing.cpython-37.pyc | Bin 0 -> 13457 bytes .../__pycache__/running_speed.cpython-37.pyc | Bin 0 -> 4806 bytes .../running_speed/running_acquisition.py | 209 + .../running_speed/running_processing.py | 407 + .../running_speed/running_speed.py | 176 + .../behavior/data_objects/stimuli/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 224 bytes .../__pycache__/presentations.cpython-37.pyc | Bin 0 -> 7122 bytes .../__pycache__/stimuli.cpython-37.pyc | Bin 0 -> 2556 bytes .../stimulus_templates.cpython-37.pyc | Bin 0 -> 11069 bytes .../__pycache__/templates.cpython-37.pyc | Bin 0 -> 4381 bytes .../stimuli/__pycache__/util.cpython-37.pyc | Bin 0 -> 1999 bytes .../data_objects/stimuli/presentations.py | 215 + .../behavior/data_objects/stimuli/stimuli.py | 62 + .../stimuli/stimulus_templates.py | 290 + .../data_objects/stimuli/templates.py | 139 + .../behavior/data_objects/stimuli/util.py | 63 + .../behavior/data_objects/task_parameters.py | 234 + .../data_objects/timestamps/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 227 bytes .../ophys_timestamps.cpython-37.pyc | Bin 0 -> 3833 bytes .../__pycache__/util.cpython-37.pyc | Bin 0 -> 438 bytes .../timestamps/ophys_timestamps.py | 104 + .../stimulus_timestamps/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 247 bytes .../stimulus_timestamps.cpython-37.pyc | Bin 0 -> 4788 bytes .../timestamps_processing.cpython-37.pyc | Bin 0 -> 1965 bytes .../stimulus_timestamps.py | 142 + .../timestamps_processing.py | 49 + .../behavior/data_objects/timestamps/util.py | 5 + .../behavior/data_objects/trials/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 223 bytes .../trials/__pycache__/trial.cpython-37.pyc | Bin 0 -> 12464 bytes .../__pycache__/trial_table.cpython-37.pyc | Bin 0 -> 5263 bytes .../behavior/data_objects/trials/trial.py | 423 + .../data_objects/trials/trial_table.py | 150 + brain_observatory/behavior/dprime.py | 106 + brain_observatory/behavior/event_detection.py | 41 + .../behavior/eye_tracking_processing.py | 243 + brain_observatory/behavior/image_api.py | 45 + brain_observatory/behavior/mtrain.py | 409 + .../behavior/ophys_experiment.py | 749 + brain_observatory/behavior/ophys_session.py | 881 + .../behavior/rewards_processing.py | 43 + brain_observatory/behavior/schemas.py | 314 + brain_observatory/behavior/session_metrics.py | 37 + .../behavior/stimulus_processing.py | 540 + .../__pycache__/analysis_tools.cpython-37.pyc | Bin 0 -> 2690 bytes .../behavior_project_cache.cpython-37.pyc | Bin 0 -> 17478 bytes .../create_multi_session_df.cpython-37.pyc | Bin 0 -> 1569 bytes .../run_multi_session_df.cpython-37.pyc | Bin 0 -> 954 bytes ...d_stimulus_presentations_df.cpython-37.pyc | Bin 0 -> 1554 bytes .../run_save_flash_response_df.cpython-37.pyc | Bin 0 -> 1516 bytes .../run_save_trial_response_df.cpython-37.pyc | Bin 0 -> 1515 bytes .../run_summary_figures.cpython-37.pyc | Bin 0 -> 1654 bytes ...d_stimulus_presentations_df.cpython-37.pyc | Bin 0 -> 5393 bytes .../save_flash_response_df.cpython-37.pyc | Bin 0 -> 11142 bytes .../save_trial_response_df.cpython-37.pyc | Bin 0 -> 8378 bytes .../summary_figures.cpython-37.pyc | Bin 0 -> 18318 bytes .../swdb/__pycache__/utilities.cpython-37.pyc | Bin 0 -> 12743 bytes .../behavior/swdb/analysis_tools.py | 92 + .../behavior/swdb/behavior_project_cache.py | 549 + .../behavior/swdb/create_multi_session_df.py | 26 + .../behavior/swdb/run_multi_session_df.py | 27 + ...save_extended_stimulus_presentations_df.py | 35 + .../swdb/run_save_flash_response_df.py | 35 + .../swdb/run_save_trial_response_df.py | 35 + .../behavior/swdb/run_summary_figures.py | 40 + ...save_extended_stimulus_presentations_df.py | 250 + .../behavior/swdb/save_flash_response_df.py | 446 + .../behavior/swdb/save_trial_response_df.py | 338 + .../behavior/swdb/summary_figures.py | 560 + brain_observatory/behavior/swdb/utilities.py | 365 + brain_observatory/behavior/sync/__init__.py | 255 + .../sync/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 8452 bytes .../__pycache__/process_sync.cpython-37.pyc | Bin 0 -> 2609 bytes .../behavior/sync/process_sync.py | 127 + brain_observatory/behavior/trial_masks.py | 63 + .../behavior/trials_processing.py | 1348 + .../behavior/write_behavior_nwb/__init__.py | 0 .../behavior/write_behavior_nwb/__main__.py | 87 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 222 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 2493 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 3167 bytes .../behavior/write_behavior_nwb/_schemas.py | 81 + .../behavior/write_nwb/__init__.py | 0 .../behavior/write_nwb/__main__.py | 93 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 213 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 2708 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 5132 bytes .../behavior/write_nwb/_schemas.py | 144 + .../behavior/write_nwb/extensions/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 224 bytes .../extensions/event_detection/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 240 bytes .../extension_builder.cpython-37.pyc | Bin 0 -> 1454 bytes .../ndx_ophys_events.cpython-37.pyc | Bin 0 -> 542 bytes .../event_detection/extension_builder.py | 54 + ...aibs-ophys-event-detection.extensions.yaml | 16 + ...-aibs-ophys-event-detection.namespace.yaml | 14 + .../event_detection/ndx_ophys_events.py | 15 + .../extensions/stimulus_template/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 242 bytes .../extension_builder.cpython-37.pyc | Bin 0 -> 1732 bytes .../ndx_stimulus_template.cpython-37.pyc | Bin 0 -> 565 bytes .../stimulus_template/extension_builder.py | 55 + ...ndx-aibs-stimulus-template.extensions.yaml | 16 + .../ndx-aibs-stimulus-template.namespace.yaml | 13 + .../ndx_stimulus_template.py | 15 + .../brain_observatory_exceptions.py | 48 + .../brain_observatory_plotting.py | 1007 + brain_observatory/chisquare_categorical.py | 178 + brain_observatory/circle_plots.py | 753 + brain_observatory/comparison_utils.py | 70 + brain_observatory/demixer.py | 411 + brain_observatory/dff.py | 423 + brain_observatory/drifting_gratings.py | 505 + brain_observatory/ecephys/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 676 bytes .../ecephys_project_cache.cpython-37.pyc | Bin 0 -> 28065 bytes .../ecephys_session.cpython-37.pyc | Bin 0 -> 41377 bytes .../__pycache__/stimulus_sync.cpython-37.pyc | Bin 0 -> 4404 bytes .../ecephys/align_timestamps/__init__.py | 0 .../ecephys/align_timestamps/__main__.py | 111 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 2447 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 3702 bytes .../__pycache__/barcode.cpython-37.pyc | Bin 0 -> 7497 bytes .../barcode_sync_dataset.cpython-37.pyc | Bin 0 -> 2267 bytes .../__pycache__/channel_states.cpython-37.pyc | Bin 0 -> 1644 bytes .../probe_synchronizer.cpython-37.pyc | Bin 0 -> 4448 bytes .../ecephys/align_timestamps/_schemas.py | 92 + .../ecephys/align_timestamps/barcode.py | 303 + .../align_timestamps/barcode_sync_dataset.py | 70 + .../align_timestamps/channel_states.py | 60 + .../align_timestamps/probe_synchronizer.py | 164 + .../ecephys/copy_utility/__init__.py | 0 .../ecephys/copy_utility/__main__.py | 171 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 215 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 4443 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 2874 bytes .../ecephys/copy_utility/_schemas.py | 74 + .../current_source_density/__init__.py | 0 .../current_source_density/__main__.py | 188 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 4907 bytes .../_current_source_density.cpython-37.pyc | Bin 0 -> 6561 bytes .../__pycache__/_filter_utils.cpython-37.pyc | Bin 0 -> 2531 bytes .../_interpolation_utils.cpython-37.pyc | Bin 0 -> 5345 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 4293 bytes .../_current_source_density.py | 182 + .../current_source_density/_filter_utils.py | 74 + .../_interpolation_utils.py | 175 + .../current_source_density/_schemas.py | 103 + .../ecephys/ecephys_project_api/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 532 bytes .../ecephys_project_api.cpython-37.pyc | Bin 0 -> 2689 bytes .../ecephys_project_fixed_api.cpython-37.pyc | Bin 0 -> 2644 bytes .../ecephys_project_lims_api.cpython-37.pyc | Bin 0 -> 23103 bytes ...ephys_project_warehouse_api.cpython-37.pyc | Bin 0 -> 10094 bytes .../__pycache__/http_engine.cpython-37.pyc | Bin 0 -> 7753 bytes .../__pycache__/rma_engine.cpython-37.pyc | Bin 0 -> 4238 bytes .../__pycache__/utilities.cpython-37.pyc | Bin 0 -> 3182 bytes .../ecephys_project_api.py | 71 + .../ecephys_project_fixed_api.py | 38 + .../ecephys_project_lims_api.py | 629 + .../ecephys_project_warehouse_api.py | 310 + .../ecephys_project_api/http_engine.py | 235 + .../ecephys/ecephys_project_api/rma_engine.py | 136 + .../ecephys/ecephys_project_api/utilities.py | 93 + .../ecephys/ecephys_project_cache.py | 777 + brain_observatory/ecephys/ecephys_session.py | 1239 + .../ecephys/ecephys_session_api/__init__.py | 3 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 414 bytes .../ecephys_nwb1_session_api.cpython-37.pyc | Bin 0 -> 9717 bytes .../ecephys_nwb_session_api.cpython-37.pyc | Bin 0 -> 14887 bytes .../ecephys_session_api.cpython-37.pyc | Bin 0 -> 3770 bytes .../ecephys_nwb1_session_api.py | 298 + .../ecephys_nwb_session_api.py | 421 + .../ecephys_session_api.py | 72 + brain_observatory/ecephys/file_io/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../continuous_file.cpython-37.pyc | Bin 0 -> 4145 bytes .../ecephys_sync_dataset.cpython-37.pyc | Bin 0 -> 3993 bytes .../__pycache__/stim_file.cpython-37.pyc | Bin 0 -> 2699 bytes .../ecephys/file_io/continuous_file.py | 140 + .../ecephys/file_io/ecephys_sync_dataset.py | 114 + .../ecephys/file_io/stim_file.py | 73 + .../ecephys/lfp_subsampling/__init__.py | 35 + .../ecephys/lfp_subsampling/__main__.py | 142 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 218 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 2705 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 3591 bytes .../__pycache__/subsampling.cpython-37.pyc | Bin 0 -> 5218 bytes .../ecephys/lfp_subsampling/_schemas.py | 88 + .../ecephys/lfp_subsampling/subsampling.py | 239 + brain_observatory/ecephys/nwb/__init__.py | 20 + .../nwb/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 634 bytes ...ephys_nwb_extension_builder.cpython-37.pyc | Bin 0 -> 3525 bytes .../nwb/ecephys_nwb_extension_builder.py | 155 + .../nwb/ndx-aibs-ecephys.extension.yaml | 126 + .../nwb/ndx-aibs-ecephys.namespace.yaml | 9 + .../ecephys/optotagging_table/__init__.py | 0 .../ecephys/optotagging_table/__main__.py | 61 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 220 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 1934 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 1900 bytes .../ecephys/optotagging_table/_schemas.py | 48 + .../ecephys/stimulus_analysis/__init__.py | 7 + .../ecephys/stimulus_analysis/__main__.py | 215 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 588 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 5042 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 4129 bytes .../__pycache__/dot_motion.cpython-37.pyc | Bin 0 -> 8561 bytes .../drifting_gratings.cpython-37.pyc | Bin 0 -> 20723 bytes .../__pycache__/flashes.cpython-37.pyc | Bin 0 -> 8551 bytes .../__pycache__/natural_movies.cpython-37.pyc | Bin 0 -> 4284 bytes .../__pycache__/natural_scenes.cpython-37.pyc | Bin 0 -> 7499 bytes .../receptive_field_mapping.cpython-37.pyc | Bin 0 -> 18406 bytes .../static_gratings.cpython-37.pyc | Bin 0 -> 16793 bytes .../stimulus_analysis.cpython-37.pyc | Bin 0 -> 25683 bytes .../ecephys/stimulus_analysis/_schemas.py | 83 + .../ecephys/stimulus_analysis/dot_motion.py | 216 + .../stimulus_analysis/drifting_gratings.py | 751 + .../ecephys/stimulus_analysis/flashes.py | 221 + .../stimulus_analysis/natural_movies.py | 92 + .../stimulus_analysis/natural_scenes.py | 192 + .../receptive_field_mapping.py | 585 + .../stimulus_analysis/static_gratings.py | 454 + .../stimulus_analysis/stimulus_analysis.py | 847 + brain_observatory/ecephys/stimulus_sync.py | 159 + .../ecephys/stimulus_table/__init__.py | 0 .../ecephys/stimulus_table/__main__.py | 104 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 217 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 2612 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 3793 bytes .../ephys_pre_spikes.cpython-37.pyc | Bin 0 -> 13027 bytes .../naming_utilities.cpython-37.pyc | Bin 0 -> 5305 bytes .../output_validation.cpython-37.pyc | Bin 0 -> 1668 bytes ...imulus_parameter_extraction.cpython-37.pyc | Bin 0 -> 2591 bytes .../ecephys/stimulus_table/_schemas.py | 109 + .../stimulus_table/ephys_pre_spikes.py | 437 + .../stimulus_table/naming_utilities.py | 188 + .../stimulus_table/output_validation.py | 47 + .../stimulus_parameter_extraction.py | 104 + .../stimulus_table/visualization/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 231 bytes .../__pycache__/view_blocks.cpython-37.pyc | Bin 0 -> 2851 bytes .../visualization/view_blocks.py | 121 + .../ecephys/visualization/__init__.py | 111 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3780 bytes .../ecephys/write_nwb/__init__.py | 0 .../ecephys/write_nwb/__main__.py | 1050 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 212 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 28995 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 7687 bytes .../ecephys/write_nwb/_schemas.py | 236 + .../extract_running_speed/__init__.py | 0 .../extract_running_speed/__main__.py | 147 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 216 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 3177 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 1753 bytes .../extract_running_speed/_schemas.py | 36 + brain_observatory/eye_tracking/__main__.py | 113 + .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 500 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 1721 bytes .../__pycache__/build.cpython-37.pyc | Bin 0 -> 4118 bytes brain_observatory/eye_tracking/_schemas.py | 21 + brain_observatory/eye_tracking/build.py | 150 + .../eye_tracking/stage_1/DLC_Eye_Tracking.py | 75 + .../DLC_Eye_Tracking.cpython-37.pyc | Bin 0 -> 2092 bytes .../stage_2/DLC_Ellipse_Fitting.py | 147 + .../DLC_Ellipse_Fitting.cpython-37.pyc | Bin 0 -> 3992 bytes .../eye_tracking/stage_3/DLC_Labeled_Video.py | 65 + .../DLC_Labeled_Video.cpython-37.pyc | Bin 0 -> 2227 bytes .../eye_tracking/stage_4/DLC_Ellipse_Video.py | 108 + .../DLC_Ellipse_Video.cpython-37.pyc | Bin 0 -> 3389 bytes brain_observatory/findlevel.py | 51 + brain_observatory/gaze_mapping/__init__.py | 0 brain_observatory/gaze_mapping/__main__.py | 346 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 207 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 9892 bytes .../__pycache__/_filter_utils.cpython-37.pyc | Bin 0 -> 3522 bytes .../__pycache__/_gaze_mapper.cpython-37.pyc | Bin 0 -> 13557 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 3276 bytes .../gaze_mapping/_filter_utils.py | 132 + .../gaze_mapping/_gaze_mapper.py | 403 + brain_observatory/gaze_mapping/_schemas.py | 109 + brain_observatory/locally_sparse_noise.py | 476 + brain_observatory/natural_movie.py | 212 + brain_observatory/natural_scenes.py | 408 + brain_observatory/nwb/__init__.py | 1117 + .../nwb/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 27883 bytes ...ophys_nwb_extension_builder.cpython-37.pyc | Bin 0 -> 828 bytes .../nwb/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 3114 bytes .../nwb/__pycache__/nwb_api.cpython-37.pyc | Bin 0 -> 3803 bytes .../nwb/__pycache__/nwb_utils.cpython-37.pyc | Bin 0 -> 2666 bytes .../nwb/__pycache__/schemas.cpython-37.pyc | Bin 0 -> 663 bytes .../behavior_ophys_nwb_extension_builder.py | 24 + .../nwb/eye_tracking/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 211 bytes .../extension_builder.cpython-37.pyc | Bin 0 -> 2324 bytes .../ndx_ellipse_eye_tracking.cpython-37.pyc | Bin 0 -> 546 bytes .../nwb/eye_tracking/extension_builder.py | 99 + .../ndx-ellipse-eye-tracking.extensions.yaml | 56 + .../ndx-ellipse-eye-tracking.namespace.yaml | 15 + .../eye_tracking/ndx_ellipse_eye_tracking.py | 17 + brain_observatory/nwb/metadata.py | 125 + .../ndx-aibs-behavior-ophys.extension.yaml | 213 + .../ndx-aibs-behavior-ophys.namespace.yaml | 9 + brain_observatory/nwb/nwb_api.py | 117 + brain_observatory/nwb/nwb_utils.py | 85 + brain_observatory/nwb/schemas.py | 8 + brain_observatory/observatory_plots.py | 511 + brain_observatory/ophys/__init__.py | 0 .../ophys/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes .../ophys/trace_extraction/__init__.py | 8 + .../ophys/trace_extraction/__main__.py | 163 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 503 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 5065 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 2909 bytes .../ophys/trace_extraction/_schemas.py | 74 + brain_observatory/r_neuropil.py | 370 + .../receptive_field_analysis/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/chisquarerf.cpython-37.pyc | Bin 0 -> 12512 bytes .../__pycache__/eventdetection.cpython-37.pyc | Bin 0 -> 2766 bytes .../__pycache__/fit_parameters.cpython-37.pyc | Bin 0 -> 1864 bytes .../__pycache__/fitgaussian2D.cpython-37.pyc | Bin 0 -> 4093 bytes .../__pycache__/postprocessing.cpython-37.pyc | Bin 0 -> 2934 bytes .../receptive_field.cpython-37.pyc | Bin 0 -> 4920 bytes .../__pycache__/tools.cpython-37.pyc | Bin 0 -> 1344 bytes .../__pycache__/utilities.cpython-37.pyc | Bin 0 -> 7274 bytes .../__pycache__/visualization.cpython-37.pyc | Bin 0 -> 6954 bytes .../receptive_field_analysis/chisquarerf.py | 510 + .../eventdetection.py | 157 + .../fit_parameters.py | 86 + .../receptive_field_analysis/fitgaussian2D.py | 175 + .../postprocessing.py | 137 + .../receptive_field.py | 204 + .../receptive_field_analysis/tools.py | 67 + .../receptive_field_analysis/utilities.py | 293 + .../receptive_field_analysis/visualization.py | 266 + brain_observatory/roi_masks.py | 523 + brain_observatory/running_speed.py | 22 + brain_observatory/session_analysis.py | 599 + brain_observatory/session_api_utils.py | 231 + brain_observatory/static_gratings.py | 594 + brain_observatory/stimulus_analysis.py | 606 + brain_observatory/stimulus_info.py | 873 + brain_observatory/sync_dataset.py | 854 + brain_observatory/sync_utilities/__init__.py | 65 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2092 bytes brain_observatory/visualization/__init__.py | 36 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1180 bytes config/__init__.py | 61 + config/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 826 bytes config/__pycache__/manifest.cpython-37.pyc | Bin 0 -> 9070 bytes .../manifest_builder.cpython-37.pyc | Bin 0 -> 2812 bytes config/app/__init__.py | 40 + .../app/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 328 bytes .../application_config.cpython-37.pyc | Bin 0 -> 8870 bytes config/app/application_config.py | 367 + config/app/logging.conf | 35 + config/manifest.py | 416 + config/manifest_builder.py | 110 + config/model/__init__.py | 35 + .../model/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 189 bytes .../__pycache__/description.cpython-37.pyc | Bin 0 -> 3205 bytes .../description_parser.cpython-37.pyc | Bin 0 -> 2457 bytes config/model/description.py | 132 + config/model/description_parser.py | 106 + config/model/formats/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 197 bytes .../__pycache__/hdf5_util.cpython-37.pyc | Bin 0 -> 1390 bytes .../json_description_parser.cpython-37.pyc | Bin 0 -> 3585 bytes .../pycfg_description_parser.cpython-37.pyc | Bin 0 -> 2924 bytes config/model/formats/hdf5_util.py | 67 + .../model/formats/json_description_parser.py | 142 + .../model/formats/pycfg_description_parser.py | 125 + core/__init__.py | 35 + core/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 181 bytes core/__pycache__/auth_config.cpython-37.pyc | Bin 0 -> 600 bytes .../__pycache__/authentication.cpython-37.pyc | Bin 0 -> 4577 bytes .../brain_observatory_cache.cpython-37.pyc | Bin 0 -> 22270 bytes ...in_observatory_nwb_data_set.cpython-37.pyc | Bin 0 -> 32463 bytes .../cache_method_utilities.cpython-37.pyc | Bin 0 -> 1025 bytes .../cell_types_cache.cpython-37.pyc | Bin 0 -> 11150 bytes core/__pycache__/dat_utilities.cpython-37.pyc | Bin 0 -> 948 bytes core/__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 1475 bytes core/__pycache__/h5_utilities.cpython-37.pyc | Bin 0 -> 3164 bytes .../__pycache__/json_utilities.cpython-37.pyc | Bin 0 -> 6191 bytes .../mouse_connectivity_cache.cpython-37.pyc | Bin 0 -> 25307 bytes core/__pycache__/nwb_data_set.cpython-37.pyc | Bin 0 -> 9914 bytes core/__pycache__/obj_utilities.cpython-37.pyc | Bin 0 -> 2040 bytes core/__pycache__/ontology.cpython-37.pyc | Bin 0 -> 5036 bytes ...periment_session_id_mapping.cpython-37.pyc | Bin 0 -> 21632 bytes .../reference_space.cpython-37.pyc | Bin 0 -> 13332 bytes .../reference_space_cache.cpython-37.pyc | Bin 0 -> 9374 bytes core/__pycache__/simple_tree.cpython-37.pyc | Bin 0 -> 11810 bytes .../__pycache__/sitk_utilities.cpython-37.pyc | Bin 0 -> 3502 bytes .../__pycache__/structure_tree.cpython-37.pyc | Bin 0 -> 14567 bytes core/__pycache__/swc.cpython-37.pyc | Bin 0 -> 25986 bytes core/__pycache__/typing.cpython-37.pyc | Bin 0 -> 709 bytes core/auth_config.py | 31 + core/authentication.py | 112 + core/brain_observatory_cache.py | 665 + core/brain_observatory_nwb_data_set.py | 1128 + core/cache_method_utilities.py | 18 + core/cell_types_cache.py | 419 + core/dat_utilities.py | 58 + core/exceptions.py | 26 + core/h5_utilities.py | 128 + core/json_utilities.py | 262 + core/lazy_property/__init__.py | 3 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 306 bytes .../__pycache__/lazy_property.cpython-37.pyc | Bin 0 -> 1318 bytes .../lazy_property_mixin.cpython-37.pyc | Bin 0 -> 1200 bytes core/lazy_property/lazy_property.py | 33 + core/lazy_property/lazy_property_mixin.py | 29 + core/mouse_connectivity_cache.py | 794 + core/nwb_data_set.py | 391 + core/obj_utilities.py | 101 + core/ontology.py | 227 + core/ophys_experiment_session_id_mapping.py | 1377 + core/reference_space.py | 418 + core/reference_space_cache.py | 330 + core/simple_tree.py | 398 + core/sitk_utilities.py | 175 + core/structure_tree.py | 458 + core/swc.py | 1031 + core/typing.py | 16 + deprecated.py | 103 + ephys/__init__.py | 35 + ephys/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 182 bytes .../ephys_extractor.cpython-37.pyc | Bin 0 -> 34738 bytes .../__pycache__/ephys_features.cpython-37.pyc | Bin 0 -> 32573 bytes .../extract_cell_features.cpython-37.pyc | Bin 0 -> 5480 bytes .../feature_extractor.cpython-37.pyc | Bin 0 -> 12307 bytes ephys/ephys_extractor.py | 1108 + ephys/ephys_features.py | 1191 + ephys/extract_cell_features.py | 230 + ephys/feature_extractor.py | 694 + internal/__init__.py | 0 internal/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 185 bytes internal/api/__init__.py | 126 + .../api/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4446 bytes .../__pycache__/api_prerelease.cpython-37.pyc | Bin 0 -> 1070 bytes .../api/__pycache__/lims_api.cpython-37.pyc | Bin 0 -> 2355 bytes .../api/__pycache__/mtrain_api.cpython-37.pyc | Bin 0 -> 6437 bytes internal/api/api_prerelease.py | 24 + internal/api/lims_api.py | 45 + internal/api/mtrain_api.py | 188 + internal/api/queries/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 197 bytes .../biophysical_module_api.cpython-37.pyc | Bin 0 -> 3091 bytes .../biophysical_module_reader.cpython-37.pyc | Bin 0 -> 12306 bytes .../grid_data_api_prerelease.cpython-37.pyc | Bin 0 -> 4012 bytes ...connectivity_api_prerelease.cpython-37.pyc | Bin 0 -> 7052 bytes .../optimize_config_reader.cpython-37.pyc | Bin 0 -> 11155 bytes .../__pycache__/pre_release.cpython-37.pyc | Bin 0 -> 5043 bytes .../api/queries/biophysical_module_api.py | 111 + .../api/queries/biophysical_module_reader.py | 419 + .../api/queries/grid_data_api_prerelease.py | 115 + .../mouse_connectivity_api_prerelease.py | 186 + .../api/queries/optimize_config_reader.py | 409 + internal/api/queries/pre_release.py | 170 + internal/brain_observatory/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 203 bytes .../annotated_region_metrics.cpython-37.pyc | Bin 0 -> 3623 bytes .../__pycache__/demix_report.cpython-37.pyc | Bin 0 -> 6793 bytes .../__pycache__/demixer.cpython-37.pyc | Bin 0 -> 10452 bytes .../eye_calibration.cpython-37.pyc | Bin 0 -> 10310 bytes .../__pycache__/fit_ellipse.cpython-37.pyc | Bin 0 -> 6019 bytes .../__pycache__/frame_stream.cpython-37.pyc | Bin 0 -> 10543 bytes .../__pycache__/itracker.cpython-37.pyc | Bin 0 -> 18821 bytes .../__pycache__/itracker_utils.cpython-37.pyc | Bin 0 -> 6910 bytes .../__pycache__/mask_set.cpython-37.pyc | Bin 0 -> 5572 bytes ...ophys_session_decomposition.cpython-37.pyc | Bin 0 -> 2828 bytes .../__pycache__/roi_filter.cpython-37.pyc | Bin 0 -> 10098 bytes .../roi_filter_utils.cpython-37.pyc | Bin 0 -> 9255 bytes .../__pycache__/run_itracker.cpython-37.pyc | Bin 0 -> 5140 bytes .../__pycache__/time_sync.cpython-37.pyc | Bin 0 -> 13290 bytes .../annotated_region_metrics.py | 131 + internal/brain_observatory/demix_report.py | 250 + internal/brain_observatory/demixer.py | 359 + internal/brain_observatory/eye_calibration.py | 346 + internal/brain_observatory/fit_ellipse.py | 238 + internal/brain_observatory/frame_stream.py | 334 + internal/brain_observatory/itracker.py | 810 + internal/brain_observatory/itracker_utils.py | 268 + internal/brain_observatory/mask_set.py | 196 + .../ophys_session_decomposition.py | 97 + .../brain_observatory/resources/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 213 bytes .../roi_filter_training_criteria.json | 38 + internal/brain_observatory/roi_filter.py | 327 + .../brain_observatory/roi_filter_utils.py | 302 + internal/brain_observatory/run_itracker.py | 189 + internal/brain_observatory/time_sync.py | 443 + internal/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 190 bytes .../lims_pipeline_module.cpython-37.pyc | Bin 0 -> 3462 bytes .../__pycache__/lims_utilities.cpython-37.pyc | Bin 0 -> 5903 bytes ...nnectivity_cache_prerelease.cpython-37.pyc | Bin 0 -> 7816 bytes .../__pycache__/simpletree.cpython-37.pyc | Bin 0 -> 3222 bytes internal/core/__pycache__/swc.cpython-37.pyc | Bin 0 -> 2663 bytes internal/core/lims_pipeline_module.py | 125 + internal/core/lims_utilities.py | 194 + .../mouse_connectivity_cache_prerelease.py | 208 + internal/core/simpletree.py | 82 + internal/core/swc.py | 103 + internal/ephys/__init__.py | 0 .../ephys/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 191 bytes .../core_feature_extract.cpython-37.pyc | Bin 0 -> 10096 bytes .../plot_qc_figures.cpython-37.pyc | Bin 0 -> 25934 bytes .../plot_qc_figures3.cpython-37.pyc | Bin 0 -> 25343 bytes internal/ephys/core_feature_extract.py | 325 + internal/ephys/plot_qc_figures.py | 805 + internal/ephys/plot_qc_figures3.py | 839 + internal/model/AIC.py | 33 + internal/model/GLM.py | 148 + internal/model/__init__.py | 0 internal/model/__pycache__/AIC.cpython-37.pyc | Bin 0 -> 1040 bytes internal/model/__pycache__/GLM.cpython-37.pyc | Bin 0 -> 3508 bytes .../model/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 191 bytes .../__pycache__/data_access.cpython-37.pyc | Bin 0 -> 3991 bytes internal/model/biophysical/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 203 bytes .../biophysical_archiver.cpython-37.pyc | Bin 0 -> 3571 bytes .../__pycache__/check_fi_shift.cpython-37.pyc | Bin 0 -> 3189 bytes .../__pycache__/deap_utils.cpython-37.pyc | Bin 0 -> 8242 bytes .../__pycache__/ephys_utils.cpython-37.pyc | Bin 0 -> 1680 bytes .../__pycache__/fit_stage_1.cpython-37.pyc | Bin 0 -> 9862 bytes .../__pycache__/fit_stage_2.cpython-37.pyc | Bin 0 -> 3220 bytes .../make_deap_fit_json.cpython-37.pyc | Bin 0 -> 6725 bytes .../neuron_parallel.cpython-37.pyc | Bin 0 -> 1852 bytes .../__pycache__/optimize.cpython-37.pyc | Bin 0 -> 7958 bytes .../__pycache__/run_optimize.cpython-37.pyc | Bin 0 -> 7248 bytes .../run_optimize_workflow.cpython-37.pyc | Bin 0 -> 485 bytes .../run_passive_fit.cpython-37.pyc | Bin 0 -> 3974 bytes .../run_simulate_lims.cpython-37.pyc | Bin 0 -> 4224 bytes .../run_simulate_workflow.cpython-37.pyc | Bin 0 -> 485 bytes .../model/biophysical/biophysical_archiver.py | 89 + internal/model/biophysical/check_fi_shift.py | 83 + internal/model/biophysical/deap_utils.py | 226 + internal/model/biophysical/ephys_utils.py | 39 + internal/model/biophysical/fit_stage_1.py | 397 + internal/model/biophysical/fit_stage_2.py | 115 + internal/model/biophysical/fits/__init__.py | 0 .../fits/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../model/biophysical/fits/config_base.json | 25 + .../biophysical/fits/fit_styles/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../fits/fit_styles/f12_fit_style.json | 43 + .../fits/fit_styles/f12_noapic_fit_style.json | 42 + .../fits/fit_styles/f13_fit_style.json | 48 + .../fits/fit_styles/f13_noapic_fit_style.json | 47 + .../fits/fit_styles/f6_fit_style.json | 139 + .../fits/fit_styles/f6_noapic_fit_style.json | 132 + .../fits/fit_styles/f9_fit_style.json | 144 + .../fits/fit_styles/f9_noapic_fit_style.json | 137 + .../model/biophysical/make_deap_fit_json.py | 208 + internal/model/biophysical/neuron_parallel.py | 46 + internal/model/biophysical/optimize.py | 251 + .../biophysical/passive_fitting/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../neuron_passive_fit.cpython-37.pyc | Bin 0 -> 3393 bytes .../neuron_passive_fit2.cpython-37.pyc | Bin 0 -> 2699 bytes .../neuron_passive_fit_elec.cpython-37.pyc | Bin 0 -> 2952 bytes .../__pycache__/neuron_utils.cpython-37.pyc | Bin 0 -> 1490 bytes .../__pycache__/output_grabber.cpython-37.pyc | Bin 0 -> 1943 bytes .../__pycache__/preprocess.cpython-37.pyc | Bin 0 -> 2527 bytes .../passive_fitting/neuron_passive_fit.py | 130 + .../passive_fitting/neuron_passive_fit2.py | 104 + .../neuron_passive_fit_elec.py | 121 + .../passive_fitting/neuron_utils.py | 57 + .../passive_fitting/output_grabber.py | 70 + .../passive_fitting/passive/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 227 bytes .../biophysical/passive_fitting/preprocess.py | 80 + internal/model/biophysical/run_optimize.py | 233 + .../biophysical/run_optimize_workflow.py | 12 + internal/model/biophysical/run_passive_fit.py | 144 + .../model/biophysical/run_simulate_lims.py | 137 + .../biophysical/run_simulate_workflow.py | 12 + internal/model/data_access.py | 104 + internal/model/glif/ASGLM.py | 249 + internal/model/glif/MLIN.py | 143 + internal/model/glif/__init__.py | 0 .../glif/__pycache__/ASGLM.cpython-37.pyc | Bin 0 -> 6271 bytes .../glif/__pycache__/MLIN.cpython-37.pyc | Bin 0 -> 4321 bytes .../glif/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 196 bytes ...wo_lists_of_arrays_the_same.cpython-37.pyc | Bin 0 -> 569 bytes .../configure_model.cpython-37.pyc | Bin 0 -> 10195 bytes .../error_functions.cpython-37.pyc | Bin 0 -> 4111 bytes .../__pycache__/find_spikes.cpython-37.pyc | Bin 0 -> 5826 bytes .../__pycache__/find_sweeps.cpython-37.pyc | Bin 0 -> 6244 bytes .../glif_experiment.cpython-37.pyc | Bin 0 -> 8701 bytes .../__pycache__/glif_optimizer.cpython-37.pyc | Bin 0 -> 5287 bytes .../glif_optimizer_neuron.cpython-37.pyc | Bin 0 -> 16539 bytes .../optimize_neuron.cpython-37.pyc | Bin 0 -> 4278 bytes .../glif/__pycache__/plotting.cpython-37.pyc | Bin 0 -> 4038 bytes .../preprocess_neuron.cpython-37.pyc | Bin 0 -> 12989 bytes .../model/glif/__pycache__/rc.cpython-37.pyc | Bin 0 -> 1703 bytes .../__pycache__/spike_cutting.cpython-37.pyc | Bin 0 -> 6707 bytes .../threshold_adaptation.cpython-37.pyc | Bin 0 -> 15042 bytes .../glif/are_two_lists_of_arrays_the_same.py | 16 + internal/model/glif/configure_model.py | 411 + internal/model/glif/error_functions.py | 241 + internal/model/glif/find_spikes.py | 122 + internal/model/glif/find_sweeps.py | 201 + internal/model/glif/glif_experiment.py | 162 + internal/model/glif/glif_optimizer.py | 296 + internal/model/glif/glif_optimizer_neuron.py | 632 + internal/model/glif/optimize_neuron.py | 128 + internal/model/glif/plotting.py | 107 + internal/model/glif/preprocess_neuron.py | 494 + internal/model/glif/rc.py | 50 + internal/model/glif/spike_cutting.py | 219 + internal/model/glif/threshold_adaptation.py | 649 + internal/morphology/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 196 bytes .../__pycache__/compartment.cpython-37.pyc | Bin 0 -> 1027 bytes .../__pycache__/morphology.cpython-37.pyc | Bin 0 -> 24105 bytes .../__pycache__/morphvis.cpython-37.pyc | Bin 0 -> 9996 bytes .../__pycache__/node.cpython-37.pyc | Bin 0 -> 2942 bytes .../__pycache__/validate_swc.cpython-37.pyc | Bin 0 -> 6270 bytes internal/morphology/compartment.py | 31 + internal/morphology/morphology.py | 1001 + internal/morphology/morphvis.py | 385 + internal/morphology/node.py | 129 + internal/morphology/validate_swc.py | 248 + internal/mouse_connectivity/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 204 bytes .../interval_unionize/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 222 bytes .../__pycache__/cav_unionize.cpython-37.pyc | Bin 0 -> 1416 bytes .../__pycache__/cav_unionizer.cpython-37.pyc | Bin 0 -> 1738 bytes .../__pycache__/data_utilities.cpython-37.pyc | Bin 0 -> 3200 bytes .../interval_unionizer.cpython-37.pyc | Bin 0 -> 7683 bytes ...run_tissuecyte_unionize_cav.cpython-37.pyc | Bin 0 -> 2265 bytes ...tissuecyte_unionize_classic.cpython-37.pyc | Bin 0 -> 3441 bytes .../tissuecyte_unionize_record.cpython-37.pyc | Bin 0 -> 4877 bytes .../tissuecyte_unionizer.cpython-37.pyc | Bin 0 -> 3094 bytes .../unionize_record.cpython-37.pyc | Bin 0 -> 1747 bytes .../interval_unionize/cav_unionize.py | 34 + .../interval_unionize/cav_unionizer.py | 56 + .../interval_unionize/data_utilities.py | 104 + .../interval_unionize/interval_unionizer.py | 222 + .../run_tissuecyte_unionize_cav.py | 70 + .../run_tissuecyte_unionize_classic.py | 92 + .../tissuecyte_unionize_record.py | 155 + .../interval_unionize/tissuecyte_unionizer.py | 108 + .../interval_unionize/unionize_record.py | 39 + .../projection_thumbnail/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../generate_projection_strip.cpython-37.pyc | Bin 0 -> 3323 bytes .../__pycache__/image_sheet.cpython-37.pyc | Bin 0 -> 1487 bytes .../projection_functions.cpython-37.pyc | Bin 0 -> 1109 bytes .../visualization_utilities.cpython-37.pyc | Bin 0 -> 2766 bytes .../volume_projector.cpython-37.pyc | Bin 0 -> 2678 bytes .../volume_utilities.cpython-37.pyc | Bin 0 -> 1508 bytes .../generate_projection_strip.py | 109 + .../projection_thumbnail/image_sheet.py | 44 + .../projection_functions.py | 36 + .../visualization_utilities.py | 100 + .../projection_thumbnail/volume_projector.py | 83 + .../projection_thumbnail/volume_utilities.py | 41 + .../tissuecyte_stitching/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/stitcher.cpython-37.pyc | Bin 0 -> 3921 bytes .../__pycache__/tile.cpython-37.pyc | Bin 0 -> 2935 bytes .../tissuecyte_stitching/stitcher.py | 145 + .../tissuecyte_stitching/tile.py | 92 + .../convert_igor_nwb.cpython-37.pyc | Bin 0 -> 3351 bytes .../extract_nwb_data.cpython-37.pyc | Bin 0 -> 9262 bytes .../feature_extraction_module.cpython-37.pyc | Bin 0 -> 2725 bytes .../lab_notebook_reader.cpython-37.pyc | Bin 0 -> 4037 bytes .../__pycache__/nwb_publish.cpython-37.pyc | Bin 0 -> 13236 bytes .../ephys_nwb/__pycache__/qc.cpython-37.pyc | Bin 0 -> 4872 bytes .../__pycache__/qc_support.cpython-37.pyc | Bin 0 -> 4437 bytes .../__pycache__/resource_file.cpython-37.pyc | Bin 0 -> 6161 bytes .../IVSCC/ephys_nwb/convert_igor_nwb.py | 174 + .../IVSCC/ephys_nwb/extract_nwb_data.py | 524 + .../ephys_nwb/feature_extraction_module.py | 93 + .../IVSCC/ephys_nwb/lab_notebook_reader.py | 181 + .../IVSCC/ephys_nwb/nwb_publish.py | 667 + .../pipeline_modules/IVSCC/ephys_nwb/qc.py | 254 + .../IVSCC/ephys_nwb/qc_support.py | 189 + .../IVSCC/ephys_nwb/resource_file.py | 187 + internal/pipeline_modules/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 202 bytes ...un_annotated_region_metrics.cpython-37.pyc | Bin 0 -> 1864 bytes .../__pycache__/run_demixing.cpython-37.pyc | Bin 0 -> 6349 bytes .../run_dff_computation.cpython-37.pyc | Bin 0 -> 1651 bytes .../run_eye_tracking.cpython-37.pyc | Bin 0 -> 2207 bytes .../run_neuropil_correction.cpython-37.pyc | Bin 0 -> 5942 bytes .../run_observatory_analysis.cpython-37.pyc | Bin 0 -> 3230 bytes ...vatory_container_thumbnails.cpython-37.pyc | Bin 0 -> 2436 bytes .../run_observatory_thumbnails.cpython-37.pyc | Bin 0 -> 16804 bytes .../run_ophys_eye_calibration.cpython-37.pyc | Bin 0 -> 5098 bytes ...ophys_session_decomposition.cpython-37.pyc | Bin 0 -> 3577 bytes .../run_ophys_time_sync.cpython-37.pyc | Bin 0 -> 7315 bytes .../__pycache__/run_roi_filter.cpython-37.pyc | Bin 0 -> 8723 bytes ...jection_thumbnail_from_json.cpython-37.pyc | Bin 0 -> 3328 bytes ...issuecyte_stitching_classic.cpython-37.pyc | Bin 0 -> 3844 bytes ...cyte_unionize_cav_from_json.cpython-37.pyc | Bin 0 -> 674 bytes ...ze_classic_counts_from_json.cpython-37.pyc | Bin 0 -> 696 bytes ..._unionize_classic_from_json.cpython-37.pyc | Bin 0 -> 682 bytes .../calculate_features.cpython-37.pyc | Bin 0 -> 2579 bytes .../cortical_layers.cpython-37.pyc | Bin 0 -> 8247 bytes .../surrogate_strategy.cpython-37.pyc | Bin 0 -> 4410 bytes .../upright_transform.cpython-37.pyc | Bin 0 -> 7261 bytes .../morphology/calculate_features.py | 96 + .../cell_types/morphology/cortical_layers.py | 425 + .../morphology/surrogate_strategy.py | 150 + .../morphology/upright_transform.py | 392 + internal/pipeline_modules/gbm/__init__.py | 0 .../gbm/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes ...te_gbm_analysis_run_records.cpython-37.pyc | Bin 0 -> 1716 bytes .../generate_gbm_heatmap.cpython-37.pyc | Bin 0 -> 4151 bytes ...enerate_gbm_sample_metadata.cpython-37.pyc | Bin 0 -> 2361 bytes .../gbm/generate_gbm_analysis_run_records.py | 39 + .../gbm/generate_gbm_heatmap.py | 143 + .../gbm/generate_gbm_sample_metadata.py | 43 + .../run_annotated_region_metrics.py | 50 + internal/pipeline_modules/run_demixing.py | 198 + .../pipeline_modules/run_dff_computation.py | 59 + internal/pipeline_modules/run_eye_tracking.py | 73 + .../run_neuropil_correction.py | 250 + .../run_observatory_analysis.py | 124 + .../run_observatory_container_thumbnails.py | 67 + .../run_observatory_thumbnails.py | 547 + .../run_ophys_eye_calibration.py | 178 + .../run_ophys_session_decomposition.py | 115 + .../pipeline_modules/run_ophys_time_sync.py | 268 + internal/pipeline_modules/run_roi_filter.py | 291 + ...ssuecyte_projection_thumbnail_from_json.py | 96 + .../run_tissuecyte_stitching_classic.py | 135 + .../run_tissuecyte_unionize_cav_from_json.py | 19 + ...ecyte_unionize_classic_counts_from_json.py | 17 + ...n_tissuecyte_unionize_classic_from_json.py | 19 + model/__init__.py | 35 + model/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 182 bytes model/biophys_sim/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 194 bytes .../__pycache__/bps_command.cpython-37.pyc | Bin 0 -> 1532 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 3426 bytes model/biophys_sim/bps_command.py | 97 + model/biophys_sim/config.py | 127 + model/biophys_sim/logging.conf | 36 + model/biophys_sim/manifest_default.json | 88 + model/biophys_sim/neuron/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 201 bytes .../__pycache__/hoc_utils.cpython-37.pyc | Bin 0 -> 1575 bytes model/biophys_sim/neuron/hoc_utils.py | 95 + model/biophys_sim/scripts/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 202 bytes model/biophys_sim/scripts/bps | 3 + model/biophysical/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 194 bytes .../__pycache__/run_simulate.cpython-37.pyc | Bin 0 -> 3445 bytes .../__pycache__/runner.cpython-37.pyc | Bin 0 -> 6212 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 11520 bytes model/biophysical/logging.conf | 35 + model/biophysical/run_simulate.py | 140 + model/biophysical/runner.py | 240 + model/biophysical/utils.py | 451 + model/glif/__init__.py | 39 + .../glif/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 391 bytes .../__pycache__/glif_neuron.cpython-37.pyc | Bin 0 -> 14543 bytes .../glif_neuron_methods.cpython-37.pyc | Bin 0 -> 17142 bytes .../simulate_neuron.cpython-37.pyc | Bin 0 -> 4576 bytes model/glif/glif_neuron.py | 500 + model/glif/glif_neuron_methods.py | 513 + model/glif/simulate_neuron.py | 187 + morphology/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 187 bytes .../__pycache__/validate_swc.cpython-37.pyc | Bin 0 -> 2144 bytes morphology/validate_swc.py | 102 + mouse_connectivity/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 195 bytes mouse_connectivity/grid/__init__.py | 19 + mouse_connectivity/grid/__main__.py | 136 + .../grid/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 471 bytes .../grid/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 3891 bytes .../grid/__pycache__/_schemas.cpython-37.pyc | Bin 0 -> 4312 bytes .../image_series_gridder.cpython-37.pyc | Bin 0 -> 4859 bytes mouse_connectivity/grid/_schemas.py | 105 + .../grid/image_series_gridder.py | 157 + mouse_connectivity/grid/subimage/__init__.py | 27 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 967 bytes .../__pycache__/base_subimage.cpython-37.pyc | Bin 0 -> 8382 bytes .../__pycache__/cav_subimage.cpython-37.pyc | Bin 0 -> 1171 bytes .../classic_subimage.cpython-37.pyc | Bin 0 -> 3743 bytes .../__pycache__/count_subimage.cpython-37.pyc | Bin 0 -> 2882 bytes .../grid/subimage/base_subimage.py | 270 + .../grid/subimage/cav_subimage.py | 37 + .../grid/subimage/classic_subimage.py | 119 + .../grid/subimage/count_subimage.py | 84 + mouse_connectivity/grid/utilities/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../downsampling_utilities.cpython-37.pyc | Bin 0 -> 3069 bytes .../image_utilities.cpython-37.pyc | Bin 0 -> 6691 bytes .../grid/utilities/downsampling_utilities.py | 81 + .../grid/utilities/image_utilities.py | 291 + mouse_connectivity/grid/writers/__init__.py | 118 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3129 bytes test/__pycache__/glif_tests.cpython-37.pyc | Bin 0 -> 2217 bytes .../test_argschema_utilities.cpython-37.pyc | Bin 0 -> 6387 bytes .../test_deprecated.cpython-37.pyc | Bin 0 -> 1730 bytes .../test_inline_examples.cpython-37.pyc | Bin 0 -> 897 bytes test/__pycache__/test_temp_dir.cpython-37.pyc | Bin 0 -> 1539 bytes test/api/__init__.py | 14 + test/api/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 916 bytes ...otated_section_data_set_api.cpython-37.pyc | Bin 0 -> 2136 bytes test/api/__pycache__/test_api.cpython-37.pyc | Bin 0 -> 4947 bytes .../test_biophysical_api.cpython-37.pyc | Bin 0 -> 3067 bytes .../test_brain_observatory_api.cpython-37.pyc | Bin 0 -> 14379 bytes .../api/__pycache__/test_cache.cpython-37.pyc | Bin 0 -> 5998 bytes .../__pycache__/test_cacheable.cpython-37.pyc | Bin 0 -> 9177 bytes .../test_caching_utilities.cpython-37.pyc | Bin 0 -> 5714 bytes .../test_cell_types_api.cpython-37.pyc | Bin 0 -> 3271 bytes .../test_file_download.cpython-37.pyc | Bin 0 -> 5139 bytes .../__pycache__/test_glif_api.cpython-37.pyc | Bin 0 -> 2830 bytes .../test_grid_data_api.cpython-37.pyc | Bin 0 -> 5104 bytes .../test_image_download_api.cpython-37.pyc | Bin 0 -> 16309 bytes .../test_mouse_atlas_api.cpython-37.pyc | Bin 0 -> 2475 bytes ...test_mouse_connectivity_api.cpython-37.pyc | Bin 0 -> 11535 bytes .../test_ontologies_api.cpython-37.pyc | Bin 0 -> 6820 bytes .../api/__pycache__/test_pager.cpython-37.pyc | Bin 0 -> 6822 bytes .../test_reference_space_api.cpython-37.pyc | Bin 0 -> 5336 bytes .../test_rma_template.cpython-37.pyc | Bin 0 -> 6243 bytes .../__pycache__/test_svg_api.cpython-37.pyc | Bin 0 -> 1889 bytes .../test_synchronization_api.cpython-37.pyc | Bin 0 -> 3605 bytes .../test_tree_search_api.cpython-37.pyc | Bin 0 -> 1770 bytes test/api/cloud_cache/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 197 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 3553 bytes .../__pycache__/test_cache.cpython-37.pyc | Bin 0 -> 17348 bytes .../test_change_log.cpython-37.pyc | Bin 0 -> 4777 bytes .../test_file_attributes.cpython-37.pyc | Bin 0 -> 1818 bytes .../test_full_process.cpython-37.pyc | Bin 0 -> 5051 bytes .../test_local_cache.cpython-37.pyc | Bin 0 -> 1339 bytes .../__pycache__/test_manifest.cpython-37.pyc | Bin 0 -> 5548 bytes .../test_smart_download.cpython-37.pyc | Bin 0 -> 10124 bytes .../test_static_local_cache.cpython-37.pyc | Bin 0 -> 4163 bytes .../__pycache__/test_utils.cpython-37.pyc | Bin 0 -> 1996 bytes .../test_windows_isilon_paths.cpython-37.pyc | Bin 0 -> 2714 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 3382 bytes test/api/cloud_cache/conftest.py | 185 + test/api/cloud_cache/test_cache.py | 812 + test/api/cloud_cache/test_change_log.py | 181 + test/api/cloud_cache/test_file_attributes.py | 73 + test/api/cloud_cache/test_full_process.py | 261 + test/api/cloud_cache/test_local_cache.py | 50 + test/api/cloud_cache/test_manifest.py | 173 + test/api/cloud_cache/test_smart_download.py | 523 + .../cloud_cache/test_static_local_cache.py | 203 + test/api/cloud_cache/test_utils.py | 53 + .../cloud_cache/test_windows_isilon_paths.py | 70 + test/api/cloud_cache/utils.py | 148 + .../472451419_response.json | 227 + .../test_annotated_section_data_set_api.py | 97 + test/api/test_api.py | 175 + test/api/test_biophysical_api.py | 79 + test/api/test_brain_observatory_api.py | 547 + test/api/test_cache.py | 233 + test/api/test_cacheable.py | 317 + test/api/test_caching_utilities.py | 263 + test/api/test_cell_types_api.py | 151 + test/api/test_file_download.py | 228 + test/api/test_glif_api.py | 131 + test/api/test_grid_data_api.py | 163 + test/api/test_image_download_api.py | 611 + test/api/test_mouse_atlas_api.py | 103 + test/api/test_mouse_connectivity_api.py | 461 + test/api/test_ontologies_api.py | 217 + test/api/test_pager.py | 272 + test/api/test_reference_space_api.py | 256 + test/api/test_rma_template.py | 265 + test/api/test_svg_api.py | 109 + test/api/test_synchronization_api.py | 130 + test/api/test_tree_search_api.py | 97 + .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 1429 bytes .../test_circle_plots.cpython-37.pyc | Bin 0 -> 3397 bytes .../__pycache__/test_demixer.cpython-37.pyc | Bin 0 -> 3070 bytes .../__pycache__/test_dff.cpython-37.pyc | Bin 0 -> 3194 bytes .../test_drifting_gratings.cpython-37.pyc | Bin 0 -> 3190 bytes .../test_locally_sparse_noise.cpython-37.pyc | Bin 0 -> 3579 bytes .../test_natural_movie.cpython-37.pyc | Bin 0 -> 2800 bytes .../test_natural_scenes.cpython-37.pyc | Bin 0 -> 3190 bytes .../__pycache__/test_notebook.cpython-37.pyc | Bin 0 -> 6917 bytes .../test_observatory_plots.cpython-37.pyc | Bin 0 -> 9634 bytes .../__pycache__/test_roi_masks.cpython-37.pyc | Bin 0 -> 4778 bytes .../test_session_analysis.cpython-37.pyc | Bin 0 -> 3099 bytes ...session_analysis_regression.cpython-37.pyc | Bin 0 -> 8982 bytes .../test_session_api_utils.cpython-37.pyc | Bin 0 -> 7520 bytes .../test_static_gratings.cpython-37.pyc | Bin 0 -> 3862 bytes .../test_stimulus_analysis.cpython-37.pyc | Bin 0 -> 2679 bytes .../test_stimulus_info.cpython-37.pyc | Bin 0 -> 11670 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 2286 bytes ...st_behavior_metadata_legacy.cpython-37.pyc | Bin 0 -> 5795 bytes ...t_behavior_ophys_experiment.cpython-37.pyc | Bin 0 -> 11566 bytes .../test_behavior_session.cpython-37.pyc | Bin 0 -> 1240 bytes .../__pycache__/test_criteria.cpython-37.pyc | Bin 0 -> 4993 bytes .../__pycache__/test_dprime.cpython-37.pyc | Bin 0 -> 5443 bytes .../test_event_detection.cpython-37.pyc | Bin 0 -> 880 bytes ...est_eye_tracking_processing.cpython-37.pyc | Bin 0 -> 6857 bytes .../test_mtrain_annotate.cpython-37.pyc | Bin 0 -> 834 bytes ...r_exposure_count_processing.cpython-37.pyc | Bin 0 -> 2859 bytes .../test_rewards_processing.cpython-37.pyc | Bin 0 -> 998 bytes .../test_session_metrics.cpython-37.pyc | Bin 0 -> 1354 bytes .../test_stimulus_processing.cpython-37.pyc | Bin 0 -> 9487 bytes .../test_sync_processing.cpython-37.pyc | Bin 0 -> 3144 bytes .../test_trial_masks.cpython-37.pyc | Bin 0 -> 2144 bytes .../test_trials_processing.cpython-37.pyc | Bin 0 -> 19852 bytes .../test_write_behavior_nwb.cpython-37.pyc | Bin 0 -> 3397 bytes ...st_write_nwb_behavior_ophys.cpython-37.pyc | Bin 0 -> 3504 bytes .../behavior_project_cache/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 231 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 3644 bytes ..._behavior_project_cloud_api.cpython-37.pyc | Bin 0 -> 6298 bytes ...t_behavior_project_lims_api.cpython-37.pyc | Bin 0 -> 4087 bytes ...est_experiments_table_utils.cpython-37.pyc | Bin 0 -> 2955 bytes .../__pycache__/test_from_s3.cpython-37.pyc | Bin 0 -> 10172 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 3481 bytes .../behavior_project_cache/conftest.py | 234 + .../test_behavior_project_cloud_api.py | 237 + .../test_behavior_project_lims_api.py | 108 + .../test_experiments_table_utils.py | 160 + .../behavior_project_cache/test_from_s3.py | 363 + .../behavior/behavior_project_cache/utils.py | 154 + .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 17392 bytes ...test_behavior_project_cache.cpython-37.pyc | Bin 0 -> 4714 bytes .../conftest.py | 699 + .../test_behavior_project_cache.py | 173 + test/brain_observatory/behavior/conftest.py | 94 + .../test_stimulus_file.cpython-37.pyc | Bin 0 -> 2508 bytes .../__pycache__/test_sync_file.cpython-37.pyc | Bin 0 -> 3031 bytes .../behavior/data_files/test_stimulus_file.py | 82 + .../behavior/data_files/test_sync_file.py | 112 + .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 916 bytes .../__pycache__/lims_util.cpython-37.pyc | Bin 0 -> 1064 bytes .../__pycache__/nwb_input_json.cpython-37.pyc | Bin 0 -> 1129 bytes .../test_cell_specimens.cpython-37.pyc | Bin 0 -> 8247 bytes .../__pycache__/test_licks.cpython-37.pyc | Bin 0 -> 6296 bytes .../test_motion_correction.cpython-37.pyc | Bin 0 -> 4386 bytes .../test_ophys_timestamps.cpython-37.pyc | Bin 0 -> 3945 bytes .../test_projections.cpython-37.pyc | Bin 0 -> 3767 bytes .../__pycache__/test_rewards.cpython-37.pyc | Bin 0 -> 4058 bytes .../__pycache__/test_stimuli.cpython-37.pyc | Bin 0 -> 4180 bytes .../test_task_parameters.cpython-37.pyc | Bin 0 -> 2604 bytes .../test_trial_table.cpython-37.pyc | Bin 0 -> 6745 bytes .../test_data_object.cpython-37.pyc | Bin 0 -> 5322 bytes .../data_objects/base/test_data_object.py | 81 + .../behavior/data_objects/conftest.py | 24 + .../test_eye_tracking_table.cpython-37.pyc | Bin 0 -> 3294 bytes .../test_rig_geometry.cpython-37.pyc | Bin 0 -> 4646 bytes .../eye_tracking/test_eye_tracking_table.py | 85 + .../eye_tracking/test_rig_geometry.py | 127 + .../behavior/data_objects/lims_util.py | 16 + ...est_behavior_ophys_metadata.cpython-37.pyc | Bin 0 -> 6994 bytes .../test_behavior_metadata.cpython-37.pyc | Bin 0 -> 11156 bytes .../test_behavior_metadata.py | 307 + .../metadata/test_behavior_ophys_metadata.py | 198 + .../behavior/data_objects/nwb_input_json.py | 23 + .../test_running_acquisition.cpython-37.pyc | Bin 0 -> 4943 bytes .../test_running_processing.cpython-37.pyc | Bin 0 -> 7601 bytes .../test_running_speed.cpython-37.pyc | Bin 0 -> 5731 bytes .../running_speed/test_running_acquisition.py | 312 + .../running_speed/test_running_processing.py | 290 + .../running_speed/test_running_speed.py | 349 + .../test_stimulus_timestamps.cpython-37.pyc | Bin 0 -> 6398 bytes .../test_timestamps_processing.cpython-37.pyc | Bin 0 -> 2158 bytes .../test_stimulus_timestamps.py | 312 + .../test_timestamps_processing.py | 80 + .../data_objects/test_cell_specimens.py | 273 + .../test_data/eye_tracking_rig_geometry.json | 1 + .../test_data/rigid_motion_transform_file.csv | 4 + .../test_data/task_parameters.json | 13 + .../data_objects/test_data/test_input.json | 144 + .../behavior/data_objects/test_licks.py | 182 + .../data_objects/test_motion_correction.py | 116 + .../data_objects/test_ophys_timestamps.py | 91 + .../behavior/data_objects/test_projections.py | 107 + .../behavior/data_objects/test_rewards.py | 110 + .../behavior/data_objects/test_stimuli.py | 125 + .../data_objects/test_task_parameters.py | 67 + .../behavior/data_objects/test_trial_table.py | 181 + .../behavior/test_behavior_metadata_legacy.py | 338 + .../test_behavior_ophys_experiment.py | 387 + .../behavior/test_behavior_session.py | 34 + .../behavior/test_criteria.py | 382 + .../brain_observatory/behavior/test_dprime.py | 175 + .../behavior/test_event_detection.py | 21 + .../behavior/test_eye_tracking_processing.py | 228 + .../behavior/test_mtrain_annotate.py | 18 + .../test_prior_exposure_count_processing.py | 65 + .../behavior/test_rewards_processing.py | 38 + .../behavior/test_session_metrics.py | 71 + .../behavior/test_stimulus_processing.py | 459 + .../behavior/test_sync_processing.py | 76 + .../behavior/test_trial_masks.py | 107 + .../behavior/test_trials_processing.py | 742 + .../behavior/test_write_behavior_nwb.py | 76 + .../behavior/test_write_nwb_behavior_ophys.py | 82 + test/brain_observatory/conftest.py | 41 + test/brain_observatory/ecephys/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 207 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 502 bytes .../test_copy_utility.cpython-37.pyc | Bin 0 -> 4858 bytes ...test_current_source_density.cpython-37.pyc | Bin 0 -> 6094 bytes .../test_ecephys_project_cache.cpython-37.pyc | Bin 0 -> 17884 bytes ...t_ecephys_project_fixed_api.cpython-37.pyc | Bin 0 -> 846 bytes ...st_ecephys_project_lims_api.cpython-37.pyc | Bin 0 -> 7847 bytes ...ephys_project_warehouse_api.cpython-37.pyc | Bin 0 -> 2408 bytes .../test_ecephys_session.cpython-37.pyc | Bin 0 -> 21250 bytes ...est_ecephys_session_nwb_api.cpython-37.pyc | Bin 0 -> 1163 bytes .../test_ecephys_sync_dataset.cpython-37.pyc | Bin 0 -> 2811 bytes .../test_http_engine.cpython-37.pyc | Bin 0 -> 4101 bytes .../test_lfp_subsampling.cpython-37.pyc | Bin 0 -> 3603 bytes .../test_rma_engine.cpython-37.pyc | Bin 0 -> 1188 bytes .../__pycache__/test_stim_file.cpython-37.pyc | Bin 0 -> 1808 bytes .../test_stimulus_sync.cpython-37.pyc | Bin 0 -> 5458 bytes .../test_visualization.cpython-37.pyc | Bin 0 -> 912 bytes .../__pycache__/test_write_nwb.cpython-37.pyc | Bin 0 -> 26768 bytes .../ecephys/align_timestamps/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 224 bytes ...est_align_timestamps_module.cpython-37.pyc | Bin 0 -> 4565 bytes .../__pycache__/test_barcode.cpython-37.pyc | Bin 0 -> 2823 bytes .../test_barcode_sync_dataset.cpython-37.pyc | Bin 0 -> 1680 bytes .../test_channel_states.cpython-37.pyc | Bin 0 -> 917 bytes .../test_probe_synchronizer.cpython-37.pyc | Bin 0 -> 1785 bytes .../test_align_timestamps_module.py | 186 + .../ecephys/align_timestamps/test_barcode.py | 97 + .../test_barcode_sync_dataset.py | 60 + .../align_timestamps/test_channel_states.py | 28 + .../test_probe_synchronizer.py | 78 + test/brain_observatory/ecephys/conftest.py | 11 + ...st_ecephys_nwb1_session_api.cpython-37.pyc | Bin 0 -> 2148 bytes .../test_ecephys_nwb1_session_api.py | 61 + .../ecephys/stimulus_analysis/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 3220 bytes .../test_dot_motion.cpython-37.pyc | Bin 0 -> 3958 bytes .../test_drifting_gratings.cpython-37.pyc | Bin 0 -> 8458 bytes .../__pycache__/test_flashes.cpython-37.pyc | Bin 0 -> 3450 bytes .../test_natural_movies.cpython-37.pyc | Bin 0 -> 2067 bytes .../test_natural_scenes.cpython-37.pyc | Bin 0 -> 3884 bytes ...est_receptive_field_mapping.cpython-37.pyc | Bin 0 -> 6578 bytes .../test_static_gratings.cpython-37.pyc | Bin 0 -> 5676 bytes .../test_stimulus_analysis.cpython-37.pyc | Bin 0 -> 14012 bytes .../ecephys/stimulus_analysis/conftest.py | 66 + .../stimulus_analysis/test_dot_motion.py | 95 + .../test_drifting_gratings.py | 230 + .../ecephys/stimulus_analysis/test_flashes.py | 81 + .../stimulus_analysis/test_natural_movies.py | 57 + .../stimulus_analysis/test_natural_scenes.py | 91 + .../test_receptive_field_mapping.py | 187 + .../stimulus_analysis/test_static_gratings.py | 134 + .../test_stimulus_analysis.py | 380 + .../ecephys/stimulus_table/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 222 bytes .../test_ephys_pre_spikes.cpython-37.pyc | Bin 0 -> 5679 bytes .../test_naming_utilities.cpython-37.pyc | Bin 0 -> 2876 bytes ...imulus_parameter_extraction.cpython-37.pyc | Bin 0 -> 1924 bytes .../test_stimulus_table_module.cpython-37.pyc | Bin 0 -> 5578 bytes .../stimulus_table/test_ephys_pre_spikes.py | 270 + .../stimulus_table/test_naming_utilities.py | 191 + .../test_stimulus_parameter_extraction.py | 62 + .../test_stimulus_table_module.py | 316 + .../ecephys/test_copy_utility.py | 201 + .../ecephys/test_current_source_density.py | 267 + .../ecephys/test_ecephys_project_cache.py | 512 + .../ecephys/test_ecephys_project_fixed_api.py | 16 + .../ecephys/test_ecephys_project_lims_api.py | 227 + .../test_ecephys_project_warehouse_api.py | 73 + .../ecephys/test_ecephys_session.py | 555 + .../ecephys/test_ecephys_session_nwb_api.py | 30 + .../ecephys/test_ecephys_sync_dataset.py | 70 + .../ecephys/test_http_engine.py | 115 + .../ecephys/test_lfp_subsampling.py | 108 + .../ecephys/test_rma_engine.py | 32 + .../ecephys/test_stim_file.py | 67 + .../ecephys/test_stimulus_sync.py | 178 + .../ecephys/test_visualization.py | 14 + .../ecephys/test_write_nwb.py | 1082 + .../extract_running_speed/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 221 bytes ...xtract_running_speed_module.cpython-37.pyc | Bin 0 -> 2380 bytes .../test_extract_running_speed_module.py | 88 + .../gaze_mapping/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 212 bytes .../test_gaze_mapping.cpython-37.pyc | Bin 0 -> 8262 bytes .../__pycache__/test_main.cpython-37.pyc | Bin 0 -> 6422 bytes .../gaze_mapping/test_gaze_mapping.py | 344 + .../gaze_mapping/test_main.py | 188 + test/brain_observatory/nwb/__init__.py | 0 .../nwb/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 203 bytes .../nwb/__pycache__/conftest.cpython-37.pyc | Bin 0 -> 516 bytes .../nwb/__pycache__/test_nwb.cpython-37.pyc | Bin 0 -> 1714 bytes .../__pycache__/test_nwb_api.cpython-37.pyc | Bin 0 -> 595 bytes .../__pycache__/test_nwb_utils.cpython-37.pyc | Bin 0 -> 1144 bytes test/brain_observatory/nwb/conftest.py | 12 + test/brain_observatory/nwb/test_nwb.py | 57 + test/brain_observatory/nwb/test_nwb_api.py | 11 + test/brain_observatory/nwb/test_nwb_utils.py | 30 + .../test_chisquarerf.cpython-37.pyc | Bin 0 -> 7568 bytes .../test_fitgaussian2D.cpython-37.pyc | Bin 0 -> 4721 bytes .../test_chisquarerf.py | 309 + .../test_fitgaussian2D.py | 189 + .../sync_utilities/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 214 bytes .../test_sync_utilities.cpython-37.pyc | Bin 0 -> 3578 bytes .../sync_utilities/test_sync_utilities.py | 116 + test/brain_observatory/test_circle_plots.py | 130 + test/brain_observatory/test_demixer.py | 125 + test/brain_observatory/test_dff.py | 160 + .../test_drifting_gratings.py | 164 + .../test_locally_sparse_noise.py | 175 + test/brain_observatory/test_natural_movie.py | 144 + test/brain_observatory/test_natural_scenes.py | 163 + test/brain_observatory/test_notebook.py | 281 + .../test_observatory_plots.py | 268 + .../test_observatory_plots_data.json | 24 + test/brain_observatory/test_roi_masks.py | 215 + .../test_session_analysis.py | 141 + .../test_session_analysis_regression.py | 279 + ...test_session_analysis_regression_data.json | 18 + ...session_analysis_regression_data_list.json | 44 + .../test_session_api_utils.py | 313 + .../brain_observatory/test_static_gratings.py | 198 + .../test_stimulus_analysis.py | 140 + test/brain_observatory/test_stimulus_info.py | 399 + ...est_config_single_file_json.cpython-37.pyc | Bin 0 -> 1374 bytes .../test_json_comments.cpython-37.pyc | Bin 0 -> 4488 bytes .../__pycache__/test_manifest.cpython-37.pyc | Bin 0 -> 1930 bytes .../test_multi_file_config.cpython-37.pyc | Bin 0 -> 2472 bytes .../test_pyconfig_parser.cpython-37.pyc | Bin 0 -> 2483 bytes test/config/test_config_single_file_json.py | 73 + test/config/test_json_comments.py | 209 + test/config/test_manifest.py | 96 + test/config/test_multi_file_config.py | 134 + test/config/test_pyconfig_parser.py | 136 + .../test_authentication.cpython-37.pyc | Bin 0 -> 2570 bytes ...est_brain_observatory_cache.cpython-37.pyc | Bin 0 -> 10384 bytes ...in_observatory_nwb_data_set.cpython-37.pyc | Bin 0 -> 9944 bytes .../test_cell_filters.cpython-37.pyc | Bin 0 -> 7230 bytes .../test_cell_types_cache_unit.cpython-37.pyc | Bin 0 -> 16409 bytes .../test_h5_utilities.cpython-37.pyc | Bin 0 -> 2919 bytes .../test_json_utilities.cpython-37.pyc | Bin 0 -> 2063 bytes .../test_lazy_property.cpython-37.pyc | Bin 0 -> 1697 bytes ...st_mouse_connectivity_cache.cpython-37.pyc | Bin 0 -> 17243 bytes ...mouse_connectivity_notebook.cpython-37.pyc | Bin 0 -> 4519 bytes .../test_nwb_data_set.cpython-37.pyc | Bin 0 -> 4578 bytes .../test_obj_utilities.cpython-37.pyc | Bin 0 -> 1732 bytes .../test_reference_space.cpython-37.pyc | Bin 0 -> 5902 bytes .../test_reference_space_cache.cpython-37.pyc | Bin 0 -> 5988 bytes ...st_reference_space_notebook.cpython-37.pyc | Bin 0 -> 2761 bytes .../test_simple_tree.cpython-37.pyc | Bin 0 -> 5793 bytes .../test_sitk_utilities.cpython-37.pyc | Bin 0 -> 4477 bytes .../test_structure_tree.cpython-37.pyc | Bin 0 -> 6514 bytes test/core/nwb_ephys_files.txt | 1 + test/core/nwb_files.txt | 4 + test/core/test_authentication.py | 75 + test/core/test_brain_observatory_cache.py | 379 + .../test_brain_observatory_nwb_data_set.py | 360 + test/core/test_cell_filters.py | 360 + test/core/test_cell_types_cache_unit.py | 622 + test/core/test_h5_utilities.py | 87 + test/core/test_json_utilities.py | 124 + test/core/test_lazy_property.py | 42 + test/core/test_mouse_connectivity_cache.py | 525 + test/core/test_mouse_connectivity_notebook.py | 307 + test/core/test_nwb_data_set.py | 233 + test/core/test_obj_utilities.py | 94 + test/core/test_reference_space.py | 232 + test/core/test_reference_space_cache.py | 222 + test/core/test_reference_space_notebook.py | 264 + test/core/test_simple_tree.py | 194 + test/core/test_sitk_utilities.py | 182 + test/core/test_structure_tree.py | 250 + .../__pycache__/test_extractor.cpython-37.pyc | Bin 0 -> 4898 bytes .../__pycache__/test_features.cpython-37.pyc | Bin 0 -> 8468 bytes test/ephys/data/spike_test_high_init_dvdt.txt | 28000 ++++++++++++++++ test/ephys/data/spike_test_pair.txt | 4000 +++ test/ephys/data/spike_test_var_dt.txt | 911 + test/ephys/test_extractor.py | 175 + test/ephys/test_features.py | 268 + test/glif_tests.py | 114 + .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 533 bytes ...st_annotated_region_metrics.cpython-37.pyc | Bin 0 -> 2246 bytes .../test_biophysical_modules.cpython-37.pyc | Bin 0 -> 2174 bytes .../test_core_feature_extract.cpython-37.pyc | Bin 0 -> 2578 bytes .../test_eye_calibration.cpython-37.pyc | Bin 0 -> 3197 bytes .../__pycache__/test_internal.cpython-37.pyc | Bin 0 -> 742 bytes .../test_mtrain_api.cpython-37.pyc | Bin 0 -> 3201 bytes ...test_optimize_config_reader.cpython-37.pyc | Bin 0 -> 4213 bytes .../test_optimize_manifest.cpython-37.pyc | Bin 0 -> 6623 bytes .../test_roi_filter.cpython-37.pyc | Bin 0 -> 6063 bytes .../test_simulate_manifest.cpython-37.pyc | Bin 0 -> 8608 bytes ...test_simulate_update_output.cpython-37.pyc | Bin 0 -> 5020 bytes .../test_api_prerelease.cpython-37.pyc | Bin 0 -> 837 bytes ...st_grid_data_api_prerelease.cpython-37.pyc | Bin 0 -> 3098 bytes ...connectivity_api_prerelease.cpython-37.pyc | Bin 0 -> 4183 bytes .../test_pre_release.cpython-37.pyc | Bin 0 -> 4172 bytes test/internal/api/test_api_prerelease.py | 25 + .../api/test_grid_data_api_prerelease.py | 95 + .../test_mouse_connectivity_api_prerelease.py | 138 + test/internal/api/test_pre_release.py | 168 + .../__pycache__/conftest.cpython-37.pyc | Bin 0 -> 323 bytes .../test_ephys_utils.cpython-37.pyc | Bin 0 -> 1076 bytes .../test_optimize_run.cpython-37.pyc | Bin 0 -> 256238 bytes .../test_simulate_run.cpython-37.pyc | Bin 0 -> 19472 bytes test/internal/biophysical/conftest.py | 6 + test/internal/biophysical/test_ephys_utils.py | 28 + .../internal/biophysical/test_optimize_run.py | 6869 ++++ .../internal/biophysical/test_simulate_run.py | 753 + .../test_roi_filter_utils.cpython-37.pyc | Bin 0 -> 1475 bytes .../test_run_ophys_time_sync.cpython-37.pyc | Bin 0 -> 4295 bytes .../__pycache__/test_time_sync.cpython-37.pyc | Bin 0 -> 17805 bytes .../test_roi_filter_utils.py | 43 + .../test_run_ophys_time_sync.py | 158 + .../brain_observatory/test_time_sync.py | 693 + .../time_sync_test_data.json | 20 + test/internal/conftest.py | 9 + ...nnectivity_cache_prerelease.cpython-37.pyc | Bin 0 -> 5712 bytes ...est_mouse_connectivity_cache_prerelease.py | 204 + .../test_generate_gbm_heatmap.cpython-37.pyc | Bin 0 -> 3559 bytes .../internal/gbm/test_generate_gbm_heatmap.py | 112 + .../test_apply_affine.cpython-37.pyc | Bin 0 -> 934 bytes test/internal/morphology/test_apply_affine.py | 32 + .../test_interval_unionizer.cpython-37.pyc | Bin 0 -> 4063 bytes ..._tissuecyte_unionize_record.cpython-37.pyc | Bin 0 -> 4343 bytes .../test_unionize_record.cpython-37.pyc | Bin 0 -> 682 bytes .../test_interval_unionizer.py | 120 + .../test_projection_functions.cpython-37.pyc | Bin 0 -> 1390 bytes ...est_visualization_utilities.cpython-37.pyc | Bin 0 -> 2202 bytes .../test_volume_projector.cpython-37.pyc | Bin 0 -> 2912 bytes .../test_volume_utilities.cpython-37.pyc | Bin 0 -> 3060 bytes .../test_projection_functions.py | 36 + .../test_visualization_utilities.py | 61 + .../test_volume_projector.py | 79 + .../test_volume_utilities.py | 92 + .../test_tissuecyte_unionize_record.py | 170 + .../test_unionize_record.py | 15 + .../internal/test_annotated_region_metrics.py | 67 + test/internal/test_biophysical_modules.py | 45 + test/internal/test_core_feature_extract.py | 106 + test/internal/test_eye_calibration.py | 80 + test/internal/test_internal.py | 26 + test/internal/test_mtrain_api.py | 117 + test/internal/test_optimize_config_reader.py | 146 + test/internal/test_optimize_manifest.py | 203 + test/internal/test_roi_filter.py | 166 + test/internal/test_simulate_manifest.py | 266 + test/internal/test_simulate_update_output.py | 162 + .../__pycache__/test_stitcher.cpython-37.pyc | Bin 0 -> 4715 bytes .../__pycache__/test_tile.cpython-37.pyc | Bin 0 -> 3202 bytes .../tissuecyte_stitching/test_stitcher.py | 150 + .../tissuecyte_stitching/test_tile.py | 106 + .../__pycache__/check_parser.cpython-37.pyc | Bin 0 -> 459 bytes ...est_biophysical_perisomatic.cpython-37.pyc | Bin 0 -> 1690 bytes .../__pycache__/test_glif.cpython-37.pyc | Bin 0 -> 2643 bytes .../__pycache__/test_runner.cpython-37.pyc | Bin 0 -> 632 bytes test/model/aa_model/468193142_fit.json | 297 + ...test_biophysical_all_active.cpython-37.pyc | Bin 0 -> 1720 bytes test/model/aa_model/manifest.json | 131 + .../aa_model/test_biophysical_all_active.py | 85 + test/model/check_parser.py | 8 + test/model/peri_model/468193142_fit.json | 145 + .../test_biophysical_peri.cpython-37.pyc | Bin 0 -> 1712 bytes test/model/peri_model/manifest.json | 131 + .../model/peri_model/test_biophysical_peri.py | 85 + test/model/test_biophysical_perisomatic.py | 90 + test/model/test_glif.py | 144 + test/model/test_runner.py | 14 + test/mouse_connectivity/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes test/mouse_connectivity/grid/__init__.py | 0 .../grid/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 205 bytes .../test_base_subimage.cpython-37.pyc | Bin 0 -> 6027 bytes .../test_cav_subimage.cpython-37.pyc | Bin 0 -> 1404 bytes .../test_classic_subimage.cpython-37.pyc | Bin 0 -> 5349 bytes .../test_image_series_gridder.cpython-37.pyc | Bin 0 -> 5402 bytes .../test_image_utilities.cpython-37.pyc | Bin 0 -> 5439 bytes .../grid/test_base_subimage.py | 231 + .../grid/test_cav_subimage.py | 47 + .../grid/test_classic_subimage.py | 208 + .../grid/test_image_series_gridder.py | 191 + .../grid/test_image_utilities.py | 176 + test/test_argschema_utilities.py | 182 + test/test_deprecated.py | 85 + test/test_inline_examples.py | 23 + test/test_temp_dir.py | 39 + test_utilities/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 191 bytes .../custom_comparators.cpython-37.pyc | Bin 0 -> 3755 bytes .../regression_fixture.cpython-37.pyc | Bin 0 -> 935 bytes .../__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 1029 bytes test_utilities/custom_comparators.py | 124 + test_utilities/regression_fixture.py | 16 + test_utilities/temp_dir.py | 72 + 1577 files changed, 184911 insertions(+) create mode 100644 __init__.py create mode 100644 __pycache__/__init__.cpython-37.pyc create mode 100644 __pycache__/deprecated.cpython-37.pyc create mode 100644 api/__init__.py create mode 100644 api/__pycache__/__init__.cpython-37.pyc create mode 100644 api/__pycache__/api.cpython-37.pyc create mode 100644 api/api.py create mode 100644 api/cloud_cache/__init__.py create mode 100644 api/cloud_cache/__pycache__/__init__.cpython-37.pyc create mode 100644 api/cloud_cache/__pycache__/cloud_cache.cpython-37.pyc create mode 100644 api/cloud_cache/__pycache__/file_attributes.cpython-37.pyc create mode 100644 api/cloud_cache/__pycache__/manifest.cpython-37.pyc create mode 100644 api/cloud_cache/__pycache__/utils.cpython-37.pyc create mode 100644 api/cloud_cache/cloud_cache.py create mode 100644 api/cloud_cache/file_attributes.py create mode 100644 api/cloud_cache/manifest.py create mode 100644 api/cloud_cache/utils.py create mode 100644 api/queries/__init__.py create mode 100644 api/queries/__pycache__/__init__.cpython-37.pyc create mode 100644 api/queries/__pycache__/annotated_section_data_sets_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/biophysical_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/brain_observatory_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/cell_types_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/connected_services.cpython-37.pyc create mode 100644 api/queries/__pycache__/glif_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/grid_data_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/image_download_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/mouse_atlas_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/mouse_connectivity_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/ontologies_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/reference_space_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/rma_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/rma_pager.cpython-37.pyc create mode 100644 api/queries/__pycache__/rma_template.cpython-37.pyc create mode 100644 api/queries/__pycache__/svg_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/synchronization_api.cpython-37.pyc create mode 100644 api/queries/__pycache__/tree_search_api.cpython-37.pyc create mode 100644 api/queries/annotated_section_data_sets_api.py create mode 100644 api/queries/biophysical_api.py create mode 100644 api/queries/brain_observatory_api.py create mode 100644 api/queries/cell_types_api.py create mode 100644 api/queries/connected_services.py create mode 100644 api/queries/glif_api.py create mode 100644 api/queries/grid_data_api.py create mode 100644 api/queries/image_download_api.py create mode 100644 api/queries/mouse_atlas_api.py create mode 100644 api/queries/mouse_connectivity_api.py create mode 100644 api/queries/ontologies_api.py create mode 100644 api/queries/reference_space_api.py create mode 100644 api/queries/rma_api.py create mode 100644 api/queries/rma_pager.py create mode 100644 api/queries/rma_template.py create mode 100644 api/queries/svg_api.py create mode 100644 api/queries/synchronization_api.py create mode 100644 api/queries/tree_search_api.py create mode 100644 api/warehouse_cache/__init__.py create mode 100644 api/warehouse_cache/__pycache__/__init__.cpython-37.pyc create mode 100644 api/warehouse_cache/__pycache__/cache.cpython-37.pyc create mode 100644 api/warehouse_cache/__pycache__/caching_utilities.cpython-37.pyc create mode 100644 api/warehouse_cache/cache.py create mode 100644 api/warehouse_cache/caching_utilities.py create mode 100644 brain_observatory/__init__.py create mode 100644 brain_observatory/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/argschema_utilities.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/brain_observatory_exceptions.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/brain_observatory_plotting.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/chisquare_categorical.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/circle_plots.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/comparison_utils.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/demixer.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/dff.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/drifting_gratings.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/findlevel.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/locally_sparse_noise.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/natural_movie.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/natural_scenes.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/observatory_plots.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/r_neuropil.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/roi_masks.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/running_speed.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/session_analysis.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/session_api_utils.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/static_gratings.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/stimulus_analysis.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/stimulus_info.cpython-37.pyc create mode 100644 brain_observatory/__pycache__/sync_dataset.cpython-37.pyc create mode 100644 brain_observatory/argschema_utilities.py create mode 100644 brain_observatory/behavior/__init__.py create mode 100644 brain_observatory/behavior/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/behavior_ophys_analysis.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/behavior_ophys_experiment.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/behavior_ophys_session.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/behavior_session.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/criteria.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/dprime.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/event_detection.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/eye_tracking_processing.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/image_api.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/mtrain.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/rewards_processing.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/schemas.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/session_metrics.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/stimulus_processing.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/trial_masks.cpython-37.pyc create mode 100644 brain_observatory/behavior/__pycache__/trials_processing.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_ophys_analysis.py create mode 100644 brain_observatory/behavior/behavior_ophys_experiment.py create mode 100644 brain_observatory/behavior/behavior_ophys_session.py create mode 100644 brain_observatory/behavior/behavior_project_cache/__init__.py create mode 100644 brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/__pycache__/behavior_project_cache.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py create mode 100644 brain_observatory/behavior/behavior_project_cache/external/__init__.py create mode 100644 brain_observatory/behavior/behavior_project_cache/external/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/external/__pycache__/behavior_project_metadata_writer.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/behavior_project_base.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_cloud_api.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_lims_api.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py create mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__init__.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/experiments_table.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_mixin.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_sessions_table.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/project_table.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/sessions_table.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/project_table.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/experiments_table_utils.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/prior_exposure_processing.cpython-37.pyc create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py create mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py create mode 100644 brain_observatory/behavior/behavior_session.py create mode 100644 brain_observatory/behavior/criteria.py create mode 100644 brain_observatory/behavior/data_files/__init__.py create mode 100644 brain_observatory/behavior/data_files/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/_data_file_abc.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/avg_projection_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/demix_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/dff_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/event_detection_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/eye_tracking_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/max_projection_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/rigid_motion_transform_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/stimulus_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/__pycache__/sync_file.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_files/_data_file_abc.py create mode 100644 brain_observatory/behavior/data_files/avg_projection_file.py create mode 100644 brain_observatory/behavior/data_files/demix_file.py create mode 100644 brain_observatory/behavior/data_files/dff_file.py create mode 100644 brain_observatory/behavior/data_files/event_detection_file.py create mode 100644 brain_observatory/behavior/data_files/eye_tracking_file.py create mode 100644 brain_observatory/behavior/data_files/max_projection_file.py create mode 100644 brain_observatory/behavior/data_files/rigid_motion_transform_file.py create mode 100644 brain_observatory/behavior/data_files/stimulus_file.py create mode 100644 brain_observatory/behavior/data_files/sync_file.py create mode 100644 brain_observatory/behavior/data_objects/__init__.py create mode 100644 brain_observatory/behavior/data_objects/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/__pycache__/licks.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/__pycache__/motion_correction.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/__pycache__/projections.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/__pycache__/rewards.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/__pycache__/task_parameters.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/base/__init__.py create mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/_data_object_abc.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/readable_interfaces.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/writable_interfaces.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/base/_data_object_abc.py create mode 100644 brain_observatory/behavior/data_objects/base/readable_interfaces.py create mode 100644 brain_observatory/behavior/data_objects/base/writable_interfaces.py create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__init__.py create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/cell_specimens.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/events.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/rois_mixin.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/events.py create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/corrected_fluorescence_traces.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/dff_traces.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py create mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py create mode 100644 brain_observatory/behavior/data_objects/eye_tracking/__init__.py create mode 100644 brain_observatory/behavior/data_objects/eye_tracking/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/eye_tracking/__pycache__/eye_tracking_table.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/eye_tracking/__pycache__/rig_geometry.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py create mode 100644 brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py create mode 100644 brain_observatory/behavior/data_objects/licks.py create mode 100644 brain_observatory/behavior/data_objects/metadata/__init__.py create mode 100644 brain_observatory/behavior/data_objects/metadata/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/__pycache__/behavior_ophys_metadata.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_metadata.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_id.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_uuid.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/date_of_acquisition.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/equipment.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/foraging_id.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/session_type.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/stimulus_frame_rate.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py create mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/experiment_container_id.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/field_of_view_shape.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_depth.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_plane.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_experiment_metadata.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_session_id.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/project_code.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/multi_plane_metadata.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py create mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/age.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/driver_line.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/full_genotype.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/mouse_id.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/reporter_line.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/sex.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/subject_metadata.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py create mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py create mode 100644 brain_observatory/behavior/data_objects/motion_correction.py create mode 100644 brain_observatory/behavior/data_objects/projections.py create mode 100644 brain_observatory/behavior/data_objects/rewards.py create mode 100644 brain_observatory/behavior/data_objects/running_speed/__init__.py create mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/running_speed.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/running_speed/running_acquisition.py create mode 100644 brain_observatory/behavior/data_objects/running_speed/running_processing.py create mode 100644 brain_observatory/behavior/data_objects/running_speed/running_speed.py create mode 100644 brain_observatory/behavior/data_objects/stimuli/__init__.py create mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/presentations.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/stimuli.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/stimulus_templates.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/templates.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/util.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/stimuli/presentations.py create mode 100644 brain_observatory/behavior/data_objects/stimuli/stimuli.py create mode 100644 brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py create mode 100644 brain_observatory/behavior/data_objects/stimuli/templates.py create mode 100644 brain_observatory/behavior/data_objects/stimuli/util.py create mode 100644 brain_observatory/behavior/data_objects/task_parameters.py create mode 100644 brain_observatory/behavior/data_objects/timestamps/__init__.py create mode 100644 brain_observatory/behavior/data_objects/timestamps/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/timestamps/__pycache__/ophys_timestamps.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/timestamps/__pycache__/util.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py create mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py create mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py create mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py create mode 100644 brain_observatory/behavior/data_objects/timestamps/util.py create mode 100644 brain_observatory/behavior/data_objects/trials/__init__.py create mode 100644 brain_observatory/behavior/data_objects/trials/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/trials/__pycache__/trial.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/trials/__pycache__/trial_table.cpython-37.pyc create mode 100644 brain_observatory/behavior/data_objects/trials/trial.py create mode 100644 brain_observatory/behavior/data_objects/trials/trial_table.py create mode 100644 brain_observatory/behavior/dprime.py create mode 100644 brain_observatory/behavior/event_detection.py create mode 100644 brain_observatory/behavior/eye_tracking_processing.py create mode 100644 brain_observatory/behavior/image_api.py create mode 100644 brain_observatory/behavior/mtrain.py create mode 100644 brain_observatory/behavior/ophys_experiment.py create mode 100644 brain_observatory/behavior/ophys_session.py create mode 100644 brain_observatory/behavior/rewards_processing.py create mode 100644 brain_observatory/behavior/schemas.py create mode 100644 brain_observatory/behavior/session_metrics.py create mode 100644 brain_observatory/behavior/stimulus_processing.py create mode 100644 brain_observatory/behavior/swdb/__pycache__/analysis_tools.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/behavior_project_cache.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/create_multi_session_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/run_multi_session_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/run_save_extended_stimulus_presentations_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/run_save_flash_response_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/run_save_trial_response_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/run_summary_figures.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/save_extended_stimulus_presentations_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/save_flash_response_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/save_trial_response_df.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/summary_figures.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/__pycache__/utilities.cpython-37.pyc create mode 100644 brain_observatory/behavior/swdb/analysis_tools.py create mode 100644 brain_observatory/behavior/swdb/behavior_project_cache.py create mode 100644 brain_observatory/behavior/swdb/create_multi_session_df.py create mode 100644 brain_observatory/behavior/swdb/run_multi_session_df.py create mode 100644 brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py create mode 100644 brain_observatory/behavior/swdb/run_save_flash_response_df.py create mode 100644 brain_observatory/behavior/swdb/run_save_trial_response_df.py create mode 100644 brain_observatory/behavior/swdb/run_summary_figures.py create mode 100644 brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py create mode 100644 brain_observatory/behavior/swdb/save_flash_response_df.py create mode 100644 brain_observatory/behavior/swdb/save_trial_response_df.py create mode 100644 brain_observatory/behavior/swdb/summary_figures.py create mode 100644 brain_observatory/behavior/swdb/utilities.py create mode 100644 brain_observatory/behavior/sync/__init__.py create mode 100644 brain_observatory/behavior/sync/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/sync/__pycache__/process_sync.cpython-37.pyc create mode 100644 brain_observatory/behavior/sync/process_sync.py create mode 100644 brain_observatory/behavior/trial_masks.py create mode 100644 brain_observatory/behavior/trials_processing.py create mode 100644 brain_observatory/behavior/write_behavior_nwb/__init__.py create mode 100644 brain_observatory/behavior/write_behavior_nwb/__main__.py create mode 100644 brain_observatory/behavior/write_behavior_nwb/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_behavior_nwb/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_behavior_nwb/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_behavior_nwb/_schemas.py create mode 100644 brain_observatory/behavior/write_nwb/__init__.py create mode 100644 brain_observatory/behavior/write_nwb/__main__.py create mode 100644 brain_observatory/behavior/write_nwb/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/_schemas.py create mode 100644 brain_observatory/behavior/write_nwb/extensions/__init__.py create mode 100644 brain_observatory/behavior/write_nwb/extensions/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/extension_builder.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/ndx_ophys_events.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml create mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/extension_builder.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/ndx_stimulus_template.cpython-37.pyc create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml create mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py create mode 100644 brain_observatory/brain_observatory_exceptions.py create mode 100644 brain_observatory/brain_observatory_plotting.py create mode 100644 brain_observatory/chisquare_categorical.py create mode 100644 brain_observatory/circle_plots.py create mode 100644 brain_observatory/comparison_utils.py create mode 100644 brain_observatory/demixer.py create mode 100644 brain_observatory/dff.py create mode 100644 brain_observatory/drifting_gratings.py create mode 100644 brain_observatory/ecephys/__init__.py create mode 100644 brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/__pycache__/ecephys_project_cache.cpython-37.pyc create mode 100644 brain_observatory/ecephys/__pycache__/ecephys_session.cpython-37.pyc create mode 100644 brain_observatory/ecephys/__pycache__/stimulus_sync.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/__init__.py create mode 100644 brain_observatory/ecephys/align_timestamps/__main__.py create mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/barcode.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/barcode_sync_dataset.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/channel_states.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/probe_synchronizer.cpython-37.pyc create mode 100644 brain_observatory/ecephys/align_timestamps/_schemas.py create mode 100644 brain_observatory/ecephys/align_timestamps/barcode.py create mode 100644 brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py create mode 100644 brain_observatory/ecephys/align_timestamps/channel_states.py create mode 100644 brain_observatory/ecephys/align_timestamps/probe_synchronizer.py create mode 100644 brain_observatory/ecephys/copy_utility/__init__.py create mode 100644 brain_observatory/ecephys/copy_utility/__main__.py create mode 100644 brain_observatory/ecephys/copy_utility/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/copy_utility/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/copy_utility/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/copy_utility/_schemas.py create mode 100644 brain_observatory/ecephys/current_source_density/__init__.py create mode 100644 brain_observatory/ecephys/current_source_density/__main__.py create mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_current_source_density.cpython-37.pyc create mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_filter_utils.cpython-37.pyc create mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_interpolation_utils.cpython-37.pyc create mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/current_source_density/_current_source_density.py create mode 100644 brain_observatory/ecephys/current_source_density/_filter_utils.py create mode 100644 brain_observatory/ecephys/current_source_density/_interpolation_utils.py create mode 100644 brain_observatory/ecephys/current_source_density/_schemas.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/__init__.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_api.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_fixed_api.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_lims_api.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_warehouse_api.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/http_engine.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/rma_engine.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/utilities.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/http_engine.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/rma_engine.py create mode 100644 brain_observatory/ecephys/ecephys_project_api/utilities.py create mode 100644 brain_observatory/ecephys/ecephys_project_cache.py create mode 100644 brain_observatory/ecephys/ecephys_session.py create mode 100644 brain_observatory/ecephys/ecephys_session_api/__init__.py create mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb1_session_api.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb_session_api.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_session_api.cpython-37.pyc create mode 100644 brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py create mode 100644 brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py create mode 100644 brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py create mode 100644 brain_observatory/ecephys/file_io/__init__.py create mode 100644 brain_observatory/ecephys/file_io/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/file_io/__pycache__/continuous_file.cpython-37.pyc create mode 100644 brain_observatory/ecephys/file_io/__pycache__/ecephys_sync_dataset.cpython-37.pyc create mode 100644 brain_observatory/ecephys/file_io/__pycache__/stim_file.cpython-37.pyc create mode 100644 brain_observatory/ecephys/file_io/continuous_file.py create mode 100644 brain_observatory/ecephys/file_io/ecephys_sync_dataset.py create mode 100644 brain_observatory/ecephys/file_io/stim_file.py create mode 100644 brain_observatory/ecephys/lfp_subsampling/__init__.py create mode 100644 brain_observatory/ecephys/lfp_subsampling/__main__.py create mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/subsampling.cpython-37.pyc create mode 100644 brain_observatory/ecephys/lfp_subsampling/_schemas.py create mode 100644 brain_observatory/ecephys/lfp_subsampling/subsampling.py create mode 100644 brain_observatory/ecephys/nwb/__init__.py create mode 100644 brain_observatory/ecephys/nwb/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/nwb/__pycache__/ecephys_nwb_extension_builder.cpython-37.pyc create mode 100644 brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py create mode 100644 brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml create mode 100644 brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml create mode 100644 brain_observatory/ecephys/optotagging_table/__init__.py create mode 100644 brain_observatory/ecephys/optotagging_table/__main__.py create mode 100644 brain_observatory/ecephys/optotagging_table/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/optotagging_table/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/optotagging_table/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/optotagging_table/_schemas.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/__init__.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/__main__.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/dot_motion.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/drifting_gratings.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/flashes.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_movies.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_scenes.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/receptive_field_mapping.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/static_gratings.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/stimulus_analysis.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_analysis/_schemas.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/dot_motion.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/flashes.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/natural_movies.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/natural_scenes.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/static_gratings.py create mode 100644 brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py create mode 100644 brain_observatory/ecephys/stimulus_sync.py create mode 100644 brain_observatory/ecephys/stimulus_table/__init__.py create mode 100644 brain_observatory/ecephys/stimulus_table/__main__.py create mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/ephys_pre_spikes.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/naming_utilities.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/output_validation.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/stimulus_parameter_extraction.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/_schemas.py create mode 100644 brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py create mode 100644 brain_observatory/ecephys/stimulus_table/naming_utilities.py create mode 100644 brain_observatory/ecephys/stimulus_table/output_validation.py create mode 100644 brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py create mode 100644 brain_observatory/ecephys/stimulus_table/visualization/__init__.py create mode 100644 brain_observatory/ecephys/stimulus_table/visualization/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/visualization/__pycache__/view_blocks.cpython-37.pyc create mode 100644 brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py create mode 100644 brain_observatory/ecephys/visualization/__init__.py create mode 100644 brain_observatory/ecephys/visualization/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/write_nwb/__init__.py create mode 100644 brain_observatory/ecephys/write_nwb/__main__.py create mode 100644 brain_observatory/ecephys/write_nwb/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/write_nwb/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ecephys/write_nwb/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ecephys/write_nwb/_schemas.py create mode 100644 brain_observatory/extract_running_speed/__init__.py create mode 100644 brain_observatory/extract_running_speed/__main__.py create mode 100644 brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/extract_running_speed/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/extract_running_speed/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/extract_running_speed/_schemas.py create mode 100644 brain_observatory/eye_tracking/__main__.py create mode 100644 brain_observatory/eye_tracking/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/eye_tracking/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/eye_tracking/__pycache__/build.cpython-37.pyc create mode 100644 brain_observatory/eye_tracking/_schemas.py create mode 100644 brain_observatory/eye_tracking/build.py create mode 100644 brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py create mode 100644 brain_observatory/eye_tracking/stage_1/__pycache__/DLC_Eye_Tracking.cpython-37.pyc create mode 100644 brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py create mode 100644 brain_observatory/eye_tracking/stage_2/__pycache__/DLC_Ellipse_Fitting.cpython-37.pyc create mode 100644 brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py create mode 100644 brain_observatory/eye_tracking/stage_3/__pycache__/DLC_Labeled_Video.cpython-37.pyc create mode 100644 brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py create mode 100644 brain_observatory/eye_tracking/stage_4/__pycache__/DLC_Ellipse_Video.cpython-37.pyc create mode 100644 brain_observatory/findlevel.py create mode 100644 brain_observatory/gaze_mapping/__init__.py create mode 100644 brain_observatory/gaze_mapping/__main__.py create mode 100644 brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/gaze_mapping/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/gaze_mapping/__pycache__/_filter_utils.cpython-37.pyc create mode 100644 brain_observatory/gaze_mapping/__pycache__/_gaze_mapper.cpython-37.pyc create mode 100644 brain_observatory/gaze_mapping/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/gaze_mapping/_filter_utils.py create mode 100644 brain_observatory/gaze_mapping/_gaze_mapper.py create mode 100644 brain_observatory/gaze_mapping/_schemas.py create mode 100644 brain_observatory/locally_sparse_noise.py create mode 100644 brain_observatory/natural_movie.py create mode 100644 brain_observatory/natural_scenes.py create mode 100644 brain_observatory/nwb/__init__.py create mode 100644 brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/nwb/__pycache__/behavior_ophys_nwb_extension_builder.cpython-37.pyc create mode 100644 brain_observatory/nwb/__pycache__/metadata.cpython-37.pyc create mode 100644 brain_observatory/nwb/__pycache__/nwb_api.cpython-37.pyc create mode 100644 brain_observatory/nwb/__pycache__/nwb_utils.cpython-37.pyc create mode 100644 brain_observatory/nwb/__pycache__/schemas.cpython-37.pyc create mode 100644 brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py create mode 100644 brain_observatory/nwb/eye_tracking/__init__.py create mode 100644 brain_observatory/nwb/eye_tracking/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/nwb/eye_tracking/__pycache__/extension_builder.cpython-37.pyc create mode 100644 brain_observatory/nwb/eye_tracking/__pycache__/ndx_ellipse_eye_tracking.cpython-37.pyc create mode 100644 brain_observatory/nwb/eye_tracking/extension_builder.py create mode 100644 brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml create mode 100644 brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml create mode 100644 brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py create mode 100644 brain_observatory/nwb/metadata.py create mode 100644 brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml create mode 100644 brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml create mode 100644 brain_observatory/nwb/nwb_api.py create mode 100644 brain_observatory/nwb/nwb_utils.py create mode 100644 brain_observatory/nwb/schemas.py create mode 100644 brain_observatory/observatory_plots.py create mode 100644 brain_observatory/ophys/__init__.py create mode 100644 brain_observatory/ophys/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ophys/trace_extraction/__init__.py create mode 100644 brain_observatory/ophys/trace_extraction/__main__.py create mode 100644 brain_observatory/ophys/trace_extraction/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/ophys/trace_extraction/__pycache__/__main__.cpython-37.pyc create mode 100644 brain_observatory/ophys/trace_extraction/__pycache__/_schemas.cpython-37.pyc create mode 100644 brain_observatory/ophys/trace_extraction/_schemas.py create mode 100644 brain_observatory/r_neuropil.py create mode 100644 brain_observatory/receptive_field_analysis/__init__.py create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/chisquarerf.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/eventdetection.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/fit_parameters.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/fitgaussian2D.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/postprocessing.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/receptive_field.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/tools.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/utilities.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/__pycache__/visualization.cpython-37.pyc create mode 100644 brain_observatory/receptive_field_analysis/chisquarerf.py create mode 100644 brain_observatory/receptive_field_analysis/eventdetection.py create mode 100644 brain_observatory/receptive_field_analysis/fit_parameters.py create mode 100644 brain_observatory/receptive_field_analysis/fitgaussian2D.py create mode 100644 brain_observatory/receptive_field_analysis/postprocessing.py create mode 100644 brain_observatory/receptive_field_analysis/receptive_field.py create mode 100644 brain_observatory/receptive_field_analysis/tools.py create mode 100644 brain_observatory/receptive_field_analysis/utilities.py create mode 100644 brain_observatory/receptive_field_analysis/visualization.py create mode 100644 brain_observatory/roi_masks.py create mode 100644 brain_observatory/running_speed.py create mode 100644 brain_observatory/session_analysis.py create mode 100644 brain_observatory/session_api_utils.py create mode 100644 brain_observatory/static_gratings.py create mode 100644 brain_observatory/stimulus_analysis.py create mode 100644 brain_observatory/stimulus_info.py create mode 100644 brain_observatory/sync_dataset.py create mode 100644 brain_observatory/sync_utilities/__init__.py create mode 100644 brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc create mode 100644 brain_observatory/visualization/__init__.py create mode 100644 brain_observatory/visualization/__pycache__/__init__.cpython-37.pyc create mode 100644 config/__init__.py create mode 100644 config/__pycache__/__init__.cpython-37.pyc create mode 100644 config/__pycache__/manifest.cpython-37.pyc create mode 100644 config/__pycache__/manifest_builder.cpython-37.pyc create mode 100644 config/app/__init__.py create mode 100644 config/app/__pycache__/__init__.cpython-37.pyc create mode 100644 config/app/__pycache__/application_config.cpython-37.pyc create mode 100644 config/app/application_config.py create mode 100644 config/app/logging.conf create mode 100644 config/manifest.py create mode 100644 config/manifest_builder.py create mode 100644 config/model/__init__.py create mode 100644 config/model/__pycache__/__init__.cpython-37.pyc create mode 100644 config/model/__pycache__/description.cpython-37.pyc create mode 100644 config/model/__pycache__/description_parser.cpython-37.pyc create mode 100644 config/model/description.py create mode 100644 config/model/description_parser.py create mode 100644 config/model/formats/__init__.py create mode 100644 config/model/formats/__pycache__/__init__.cpython-37.pyc create mode 100644 config/model/formats/__pycache__/hdf5_util.cpython-37.pyc create mode 100644 config/model/formats/__pycache__/json_description_parser.cpython-37.pyc create mode 100644 config/model/formats/__pycache__/pycfg_description_parser.cpython-37.pyc create mode 100644 config/model/formats/hdf5_util.py create mode 100644 config/model/formats/json_description_parser.py create mode 100644 config/model/formats/pycfg_description_parser.py create mode 100644 core/__init__.py create mode 100644 core/__pycache__/__init__.cpython-37.pyc create mode 100644 core/__pycache__/auth_config.cpython-37.pyc create mode 100644 core/__pycache__/authentication.cpython-37.pyc create mode 100644 core/__pycache__/brain_observatory_cache.cpython-37.pyc create mode 100644 core/__pycache__/brain_observatory_nwb_data_set.cpython-37.pyc create mode 100644 core/__pycache__/cache_method_utilities.cpython-37.pyc create mode 100644 core/__pycache__/cell_types_cache.cpython-37.pyc create mode 100644 core/__pycache__/dat_utilities.cpython-37.pyc create mode 100644 core/__pycache__/exceptions.cpython-37.pyc create mode 100644 core/__pycache__/h5_utilities.cpython-37.pyc create mode 100644 core/__pycache__/json_utilities.cpython-37.pyc create mode 100644 core/__pycache__/mouse_connectivity_cache.cpython-37.pyc create mode 100644 core/__pycache__/nwb_data_set.cpython-37.pyc create mode 100644 core/__pycache__/obj_utilities.cpython-37.pyc create mode 100644 core/__pycache__/ontology.cpython-37.pyc create mode 100644 core/__pycache__/ophys_experiment_session_id_mapping.cpython-37.pyc create mode 100644 core/__pycache__/reference_space.cpython-37.pyc create mode 100644 core/__pycache__/reference_space_cache.cpython-37.pyc create mode 100644 core/__pycache__/simple_tree.cpython-37.pyc create mode 100644 core/__pycache__/sitk_utilities.cpython-37.pyc create mode 100644 core/__pycache__/structure_tree.cpython-37.pyc create mode 100644 core/__pycache__/swc.cpython-37.pyc create mode 100644 core/__pycache__/typing.cpython-37.pyc create mode 100644 core/auth_config.py create mode 100644 core/authentication.py create mode 100644 core/brain_observatory_cache.py create mode 100644 core/brain_observatory_nwb_data_set.py create mode 100644 core/cache_method_utilities.py create mode 100644 core/cell_types_cache.py create mode 100644 core/dat_utilities.py create mode 100644 core/exceptions.py create mode 100644 core/h5_utilities.py create mode 100644 core/json_utilities.py create mode 100644 core/lazy_property/__init__.py create mode 100644 core/lazy_property/__pycache__/__init__.cpython-37.pyc create mode 100644 core/lazy_property/__pycache__/lazy_property.cpython-37.pyc create mode 100644 core/lazy_property/__pycache__/lazy_property_mixin.cpython-37.pyc create mode 100644 core/lazy_property/lazy_property.py create mode 100644 core/lazy_property/lazy_property_mixin.py create mode 100644 core/mouse_connectivity_cache.py create mode 100644 core/nwb_data_set.py create mode 100644 core/obj_utilities.py create mode 100644 core/ontology.py create mode 100644 core/ophys_experiment_session_id_mapping.py create mode 100644 core/reference_space.py create mode 100644 core/reference_space_cache.py create mode 100644 core/simple_tree.py create mode 100644 core/sitk_utilities.py create mode 100644 core/structure_tree.py create mode 100644 core/swc.py create mode 100644 core/typing.py create mode 100644 deprecated.py create mode 100644 ephys/__init__.py create mode 100644 ephys/__pycache__/__init__.cpython-37.pyc create mode 100644 ephys/__pycache__/ephys_extractor.cpython-37.pyc create mode 100644 ephys/__pycache__/ephys_features.cpython-37.pyc create mode 100644 ephys/__pycache__/extract_cell_features.cpython-37.pyc create mode 100644 ephys/__pycache__/feature_extractor.cpython-37.pyc create mode 100644 ephys/ephys_extractor.py create mode 100644 ephys/ephys_features.py create mode 100644 ephys/extract_cell_features.py create mode 100644 ephys/feature_extractor.py create mode 100644 internal/__init__.py create mode 100644 internal/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/api/__init__.py create mode 100644 internal/api/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/api/__pycache__/api_prerelease.cpython-37.pyc create mode 100644 internal/api/__pycache__/lims_api.cpython-37.pyc create mode 100644 internal/api/__pycache__/mtrain_api.cpython-37.pyc create mode 100644 internal/api/api_prerelease.py create mode 100644 internal/api/lims_api.py create mode 100644 internal/api/mtrain_api.py create mode 100644 internal/api/queries/__init__.py create mode 100644 internal/api/queries/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/api/queries/__pycache__/biophysical_module_api.cpython-37.pyc create mode 100644 internal/api/queries/__pycache__/biophysical_module_reader.cpython-37.pyc create mode 100644 internal/api/queries/__pycache__/grid_data_api_prerelease.cpython-37.pyc create mode 100644 internal/api/queries/__pycache__/mouse_connectivity_api_prerelease.cpython-37.pyc create mode 100644 internal/api/queries/__pycache__/optimize_config_reader.cpython-37.pyc create mode 100644 internal/api/queries/__pycache__/pre_release.cpython-37.pyc create mode 100644 internal/api/queries/biophysical_module_api.py create mode 100644 internal/api/queries/biophysical_module_reader.py create mode 100644 internal/api/queries/grid_data_api_prerelease.py create mode 100644 internal/api/queries/mouse_connectivity_api_prerelease.py create mode 100644 internal/api/queries/optimize_config_reader.py create mode 100644 internal/api/queries/pre_release.py create mode 100644 internal/brain_observatory/__init__.py create mode 100644 internal/brain_observatory/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/annotated_region_metrics.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/demix_report.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/demixer.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/eye_calibration.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/fit_ellipse.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/frame_stream.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/itracker.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/itracker_utils.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/mask_set.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/ophys_session_decomposition.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/roi_filter.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/roi_filter_utils.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/run_itracker.cpython-37.pyc create mode 100644 internal/brain_observatory/__pycache__/time_sync.cpython-37.pyc create mode 100644 internal/brain_observatory/annotated_region_metrics.py create mode 100644 internal/brain_observatory/demix_report.py create mode 100644 internal/brain_observatory/demixer.py create mode 100644 internal/brain_observatory/eye_calibration.py create mode 100644 internal/brain_observatory/fit_ellipse.py create mode 100644 internal/brain_observatory/frame_stream.py create mode 100644 internal/brain_observatory/itracker.py create mode 100644 internal/brain_observatory/itracker_utils.py create mode 100644 internal/brain_observatory/mask_set.py create mode 100644 internal/brain_observatory/ophys_session_decomposition.py create mode 100644 internal/brain_observatory/resources/__init__.py create mode 100644 internal/brain_observatory/resources/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/brain_observatory/resources/roi_filter_training_criteria.json create mode 100644 internal/brain_observatory/roi_filter.py create mode 100644 internal/brain_observatory/roi_filter_utils.py create mode 100644 internal/brain_observatory/run_itracker.py create mode 100644 internal/brain_observatory/time_sync.py create mode 100644 internal/core/__init__.py create mode 100644 internal/core/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/core/__pycache__/lims_pipeline_module.cpython-37.pyc create mode 100644 internal/core/__pycache__/lims_utilities.cpython-37.pyc create mode 100644 internal/core/__pycache__/mouse_connectivity_cache_prerelease.cpython-37.pyc create mode 100644 internal/core/__pycache__/simpletree.cpython-37.pyc create mode 100644 internal/core/__pycache__/swc.cpython-37.pyc create mode 100644 internal/core/lims_pipeline_module.py create mode 100644 internal/core/lims_utilities.py create mode 100644 internal/core/mouse_connectivity_cache_prerelease.py create mode 100644 internal/core/simpletree.py create mode 100644 internal/core/swc.py create mode 100644 internal/ephys/__init__.py create mode 100644 internal/ephys/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/ephys/__pycache__/core_feature_extract.cpython-37.pyc create mode 100644 internal/ephys/__pycache__/plot_qc_figures.cpython-37.pyc create mode 100644 internal/ephys/__pycache__/plot_qc_figures3.cpython-37.pyc create mode 100644 internal/ephys/core_feature_extract.py create mode 100644 internal/ephys/plot_qc_figures.py create mode 100644 internal/ephys/plot_qc_figures3.py create mode 100644 internal/model/AIC.py create mode 100644 internal/model/GLM.py create mode 100644 internal/model/__init__.py create mode 100644 internal/model/__pycache__/AIC.cpython-37.pyc create mode 100644 internal/model/__pycache__/GLM.cpython-37.pyc create mode 100644 internal/model/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/model/__pycache__/data_access.cpython-37.pyc create mode 100644 internal/model/biophysical/__init__.py create mode 100644 internal/model/biophysical/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/biophysical_archiver.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/check_fi_shift.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/deap_utils.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/ephys_utils.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/fit_stage_1.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/fit_stage_2.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/make_deap_fit_json.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/neuron_parallel.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/optimize.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/run_optimize.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/run_optimize_workflow.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/run_passive_fit.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/run_simulate_lims.cpython-37.pyc create mode 100644 internal/model/biophysical/__pycache__/run_simulate_workflow.cpython-37.pyc create mode 100644 internal/model/biophysical/biophysical_archiver.py create mode 100644 internal/model/biophysical/check_fi_shift.py create mode 100644 internal/model/biophysical/deap_utils.py create mode 100644 internal/model/biophysical/ephys_utils.py create mode 100644 internal/model/biophysical/fit_stage_1.py create mode 100644 internal/model/biophysical/fit_stage_2.py create mode 100644 internal/model/biophysical/fits/__init__.py create mode 100644 internal/model/biophysical/fits/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/model/biophysical/fits/config_base.json create mode 100644 internal/model/biophysical/fits/fit_styles/__init__.py create mode 100644 internal/model/biophysical/fits/fit_styles/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/model/biophysical/fits/fit_styles/f12_fit_style.json create mode 100644 internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json create mode 100644 internal/model/biophysical/fits/fit_styles/f13_fit_style.json create mode 100644 internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json create mode 100644 internal/model/biophysical/fits/fit_styles/f6_fit_style.json create mode 100644 internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json create mode 100644 internal/model/biophysical/fits/fit_styles/f9_fit_style.json create mode 100644 internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json create mode 100644 internal/model/biophysical/make_deap_fit_json.py create mode 100644 internal/model/biophysical/neuron_parallel.py create mode 100644 internal/model/biophysical/optimize.py create mode 100644 internal/model/biophysical/passive_fitting/__init__.py create mode 100644 internal/model/biophysical/passive_fitting/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit2.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit_elec.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_utils.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/__pycache__/output_grabber.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/__pycache__/preprocess.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/neuron_passive_fit.py create mode 100644 internal/model/biophysical/passive_fitting/neuron_passive_fit2.py create mode 100644 internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py create mode 100644 internal/model/biophysical/passive_fitting/neuron_utils.py create mode 100644 internal/model/biophysical/passive_fitting/output_grabber.py create mode 100644 internal/model/biophysical/passive_fitting/passive/__init__.py create mode 100644 internal/model/biophysical/passive_fitting/passive/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/model/biophysical/passive_fitting/preprocess.py create mode 100644 internal/model/biophysical/run_optimize.py create mode 100644 internal/model/biophysical/run_optimize_workflow.py create mode 100644 internal/model/biophysical/run_passive_fit.py create mode 100644 internal/model/biophysical/run_simulate_lims.py create mode 100644 internal/model/biophysical/run_simulate_workflow.py create mode 100644 internal/model/data_access.py create mode 100644 internal/model/glif/ASGLM.py create mode 100644 internal/model/glif/MLIN.py create mode 100644 internal/model/glif/__init__.py create mode 100644 internal/model/glif/__pycache__/ASGLM.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/MLIN.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/are_two_lists_of_arrays_the_same.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/configure_model.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/error_functions.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/find_spikes.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/find_sweeps.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/glif_experiment.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/glif_optimizer.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/glif_optimizer_neuron.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/optimize_neuron.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/plotting.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/preprocess_neuron.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/rc.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/spike_cutting.cpython-37.pyc create mode 100644 internal/model/glif/__pycache__/threshold_adaptation.cpython-37.pyc create mode 100644 internal/model/glif/are_two_lists_of_arrays_the_same.py create mode 100644 internal/model/glif/configure_model.py create mode 100644 internal/model/glif/error_functions.py create mode 100644 internal/model/glif/find_spikes.py create mode 100644 internal/model/glif/find_sweeps.py create mode 100644 internal/model/glif/glif_experiment.py create mode 100644 internal/model/glif/glif_optimizer.py create mode 100644 internal/model/glif/glif_optimizer_neuron.py create mode 100644 internal/model/glif/optimize_neuron.py create mode 100644 internal/model/glif/plotting.py create mode 100644 internal/model/glif/preprocess_neuron.py create mode 100644 internal/model/glif/rc.py create mode 100644 internal/model/glif/spike_cutting.py create mode 100644 internal/model/glif/threshold_adaptation.py create mode 100644 internal/morphology/__init__.py create mode 100644 internal/morphology/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/morphology/__pycache__/compartment.cpython-37.pyc create mode 100644 internal/morphology/__pycache__/morphology.cpython-37.pyc create mode 100644 internal/morphology/__pycache__/morphvis.cpython-37.pyc create mode 100644 internal/morphology/__pycache__/node.cpython-37.pyc create mode 100644 internal/morphology/__pycache__/validate_swc.cpython-37.pyc create mode 100644 internal/morphology/compartment.py create mode 100644 internal/morphology/morphology.py create mode 100644 internal/morphology/morphvis.py create mode 100644 internal/morphology/node.py create mode 100644 internal/morphology/validate_swc.py create mode 100644 internal/mouse_connectivity/__init__.py create mode 100644 internal/mouse_connectivity/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__init__.py create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionize.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionizer.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/data_utilities.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/interval_unionizer.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_cav.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_classic.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionize_record.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionizer.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/unionize_record.cpython-37.pyc create mode 100644 internal/mouse_connectivity/interval_unionize/cav_unionize.py create mode 100644 internal/mouse_connectivity/interval_unionize/cav_unionizer.py create mode 100644 internal/mouse_connectivity/interval_unionize/data_utilities.py create mode 100644 internal/mouse_connectivity/interval_unionize/interval_unionizer.py create mode 100644 internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py create mode 100644 internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py create mode 100644 internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py create mode 100644 internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py create mode 100644 internal/mouse_connectivity/interval_unionize/unionize_record.py create mode 100644 internal/mouse_connectivity/projection_thumbnail/__init__.py create mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/generate_projection_strip.cpython-37.pyc create mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/image_sheet.cpython-37.pyc create mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/projection_functions.cpython-37.pyc create mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/visualization_utilities.cpython-37.pyc create mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_projector.cpython-37.pyc create mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_utilities.cpython-37.pyc create mode 100644 internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py create mode 100644 internal/mouse_connectivity/projection_thumbnail/image_sheet.py create mode 100644 internal/mouse_connectivity/projection_thumbnail/projection_functions.py create mode 100644 internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py create mode 100644 internal/mouse_connectivity/projection_thumbnail/volume_projector.py create mode 100644 internal/mouse_connectivity/projection_thumbnail/volume_utilities.py create mode 100644 internal/mouse_connectivity/tissuecyte_stitching/__init__.py create mode 100644 internal/mouse_connectivity/tissuecyte_stitching/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/mouse_connectivity/tissuecyte_stitching/__pycache__/stitcher.cpython-37.pyc create mode 100644 internal/mouse_connectivity/tissuecyte_stitching/__pycache__/tile.cpython-37.pyc create mode 100644 internal/mouse_connectivity/tissuecyte_stitching/stitcher.py create mode 100644 internal/mouse_connectivity/tissuecyte_stitching/tile.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/convert_igor_nwb.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/extract_nwb_data.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/feature_extraction_module.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/lab_notebook_reader.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/nwb_publish.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc_support.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/resource_file.cpython-37.pyc create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/qc.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py create mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py create mode 100644 internal/pipeline_modules/__init__.py create mode 100644 internal/pipeline_modules/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_annotated_region_metrics.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_demixing.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_dff_computation.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_eye_tracking.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_neuropil_correction.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_observatory_analysis.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_observatory_container_thumbnails.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_observatory_thumbnails.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_ophys_eye_calibration.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_ophys_session_decomposition.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_ophys_time_sync.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_roi_filter.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_projection_thumbnail_from_json.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_stitching_classic.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_cav_from_json.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_counts_from_json.cpython-37.pyc create mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_from_json.cpython-37.pyc create mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/calculate_features.cpython-37.pyc create mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/cortical_layers.cpython-37.pyc create mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/surrogate_strategy.cpython-37.pyc create mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/upright_transform.cpython-37.pyc create mode 100644 internal/pipeline_modules/cell_types/morphology/calculate_features.py create mode 100644 internal/pipeline_modules/cell_types/morphology/cortical_layers.py create mode 100644 internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py create mode 100644 internal/pipeline_modules/cell_types/morphology/upright_transform.py create mode 100644 internal/pipeline_modules/gbm/__init__.py create mode 100644 internal/pipeline_modules/gbm/__pycache__/__init__.cpython-37.pyc create mode 100644 internal/pipeline_modules/gbm/__pycache__/generate_gbm_analysis_run_records.cpython-37.pyc create mode 100644 internal/pipeline_modules/gbm/__pycache__/generate_gbm_heatmap.cpython-37.pyc create mode 100644 internal/pipeline_modules/gbm/__pycache__/generate_gbm_sample_metadata.cpython-37.pyc create mode 100644 internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py create mode 100644 internal/pipeline_modules/gbm/generate_gbm_heatmap.py create mode 100644 internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py create mode 100644 internal/pipeline_modules/run_annotated_region_metrics.py create mode 100644 internal/pipeline_modules/run_demixing.py create mode 100644 internal/pipeline_modules/run_dff_computation.py create mode 100644 internal/pipeline_modules/run_eye_tracking.py create mode 100644 internal/pipeline_modules/run_neuropil_correction.py create mode 100644 internal/pipeline_modules/run_observatory_analysis.py create mode 100644 internal/pipeline_modules/run_observatory_container_thumbnails.py create mode 100644 internal/pipeline_modules/run_observatory_thumbnails.py create mode 100644 internal/pipeline_modules/run_ophys_eye_calibration.py create mode 100644 internal/pipeline_modules/run_ophys_session_decomposition.py create mode 100644 internal/pipeline_modules/run_ophys_time_sync.py create mode 100644 internal/pipeline_modules/run_roi_filter.py create mode 100644 internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py create mode 100644 internal/pipeline_modules/run_tissuecyte_stitching_classic.py create mode 100644 internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py create mode 100644 internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py create mode 100644 internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py create mode 100644 model/__init__.py create mode 100644 model/__pycache__/__init__.cpython-37.pyc create mode 100644 model/biophys_sim/__init__.py create mode 100644 model/biophys_sim/__pycache__/__init__.cpython-37.pyc create mode 100644 model/biophys_sim/__pycache__/bps_command.cpython-37.pyc create mode 100644 model/biophys_sim/__pycache__/config.cpython-37.pyc create mode 100644 model/biophys_sim/bps_command.py create mode 100644 model/biophys_sim/config.py create mode 100644 model/biophys_sim/logging.conf create mode 100644 model/biophys_sim/manifest_default.json create mode 100644 model/biophys_sim/neuron/__init__.py create mode 100644 model/biophys_sim/neuron/__pycache__/__init__.cpython-37.pyc create mode 100644 model/biophys_sim/neuron/__pycache__/hoc_utils.cpython-37.pyc create mode 100644 model/biophys_sim/neuron/hoc_utils.py create mode 100644 model/biophys_sim/scripts/__init__.py create mode 100644 model/biophys_sim/scripts/__pycache__/__init__.cpython-37.pyc create mode 100644 model/biophys_sim/scripts/bps create mode 100644 model/biophysical/__init__.py create mode 100644 model/biophysical/__pycache__/__init__.cpython-37.pyc create mode 100644 model/biophysical/__pycache__/run_simulate.cpython-37.pyc create mode 100644 model/biophysical/__pycache__/runner.cpython-37.pyc create mode 100644 model/biophysical/__pycache__/utils.cpython-37.pyc create mode 100644 model/biophysical/logging.conf create mode 100644 model/biophysical/run_simulate.py create mode 100644 model/biophysical/runner.py create mode 100644 model/biophysical/utils.py create mode 100644 model/glif/__init__.py create mode 100644 model/glif/__pycache__/__init__.cpython-37.pyc create mode 100644 model/glif/__pycache__/glif_neuron.cpython-37.pyc create mode 100644 model/glif/__pycache__/glif_neuron_methods.cpython-37.pyc create mode 100644 model/glif/__pycache__/simulate_neuron.cpython-37.pyc create mode 100644 model/glif/glif_neuron.py create mode 100644 model/glif/glif_neuron_methods.py create mode 100644 model/glif/simulate_neuron.py create mode 100644 morphology/__init__.py create mode 100644 morphology/__pycache__/__init__.cpython-37.pyc create mode 100644 morphology/__pycache__/validate_swc.cpython-37.pyc create mode 100644 morphology/validate_swc.py create mode 100644 mouse_connectivity/__init__.py create mode 100644 mouse_connectivity/__pycache__/__init__.cpython-37.pyc create mode 100644 mouse_connectivity/grid/__init__.py create mode 100644 mouse_connectivity/grid/__main__.py create mode 100644 mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc create mode 100644 mouse_connectivity/grid/__pycache__/__main__.cpython-37.pyc create mode 100644 mouse_connectivity/grid/__pycache__/_schemas.cpython-37.pyc create mode 100644 mouse_connectivity/grid/__pycache__/image_series_gridder.cpython-37.pyc create mode 100644 mouse_connectivity/grid/_schemas.py create mode 100644 mouse_connectivity/grid/image_series_gridder.py create mode 100644 mouse_connectivity/grid/subimage/__init__.py create mode 100644 mouse_connectivity/grid/subimage/__pycache__/__init__.cpython-37.pyc create mode 100644 mouse_connectivity/grid/subimage/__pycache__/base_subimage.cpython-37.pyc create mode 100644 mouse_connectivity/grid/subimage/__pycache__/cav_subimage.cpython-37.pyc create mode 100644 mouse_connectivity/grid/subimage/__pycache__/classic_subimage.cpython-37.pyc create mode 100644 mouse_connectivity/grid/subimage/__pycache__/count_subimage.cpython-37.pyc create mode 100644 mouse_connectivity/grid/subimage/base_subimage.py create mode 100644 mouse_connectivity/grid/subimage/cav_subimage.py create mode 100644 mouse_connectivity/grid/subimage/classic_subimage.py create mode 100644 mouse_connectivity/grid/subimage/count_subimage.py create mode 100644 mouse_connectivity/grid/utilities/__init__.py create mode 100644 mouse_connectivity/grid/utilities/__pycache__/__init__.cpython-37.pyc create mode 100644 mouse_connectivity/grid/utilities/__pycache__/downsampling_utilities.cpython-37.pyc create mode 100644 mouse_connectivity/grid/utilities/__pycache__/image_utilities.cpython-37.pyc create mode 100644 mouse_connectivity/grid/utilities/downsampling_utilities.py create mode 100644 mouse_connectivity/grid/utilities/image_utilities.py create mode 100644 mouse_connectivity/grid/writers/__init__.py create mode 100644 mouse_connectivity/grid/writers/__pycache__/__init__.cpython-37.pyc create mode 100644 test/__pycache__/glif_tests.cpython-37.pyc create mode 100644 test/__pycache__/test_argschema_utilities.cpython-37.pyc create mode 100644 test/__pycache__/test_deprecated.cpython-37.pyc create mode 100644 test/__pycache__/test_inline_examples.cpython-37.pyc create mode 100644 test/__pycache__/test_temp_dir.cpython-37.pyc create mode 100644 test/api/__init__.py create mode 100644 test/api/__pycache__/__init__.cpython-37.pyc create mode 100644 test/api/__pycache__/test_annotated_section_data_set_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_biophysical_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_brain_observatory_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_cache.cpython-37.pyc create mode 100644 test/api/__pycache__/test_cacheable.cpython-37.pyc create mode 100644 test/api/__pycache__/test_caching_utilities.cpython-37.pyc create mode 100644 test/api/__pycache__/test_cell_types_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_file_download.cpython-37.pyc create mode 100644 test/api/__pycache__/test_glif_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_grid_data_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_image_download_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_mouse_atlas_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_mouse_connectivity_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_ontologies_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_pager.cpython-37.pyc create mode 100644 test/api/__pycache__/test_reference_space_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_rma_template.cpython-37.pyc create mode 100644 test/api/__pycache__/test_svg_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_synchronization_api.cpython-37.pyc create mode 100644 test/api/__pycache__/test_tree_search_api.cpython-37.pyc create mode 100644 test/api/cloud_cache/__init__.py create mode 100644 test/api/cloud_cache/__pycache__/__init__.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/conftest.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_cache.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_change_log.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_file_attributes.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_full_process.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_local_cache.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_manifest.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_smart_download.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_static_local_cache.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_utils.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/test_windows_isilon_paths.cpython-37.pyc create mode 100644 test/api/cloud_cache/__pycache__/utils.cpython-37.pyc create mode 100644 test/api/cloud_cache/conftest.py create mode 100644 test/api/cloud_cache/test_cache.py create mode 100644 test/api/cloud_cache/test_change_log.py create mode 100644 test/api/cloud_cache/test_file_attributes.py create mode 100644 test/api/cloud_cache/test_full_process.py create mode 100644 test/api/cloud_cache/test_local_cache.py create mode 100644 test/api/cloud_cache/test_manifest.py create mode 100644 test/api/cloud_cache/test_smart_download.py create mode 100644 test/api/cloud_cache/test_static_local_cache.py create mode 100644 test/api/cloud_cache/test_utils.py create mode 100644 test/api/cloud_cache/test_windows_isilon_paths.py create mode 100644 test/api/cloud_cache/utils.py create mode 100644 test/api/response_test_data/472451419_response.json create mode 100644 test/api/test_annotated_section_data_set_api.py create mode 100644 test/api/test_api.py create mode 100644 test/api/test_biophysical_api.py create mode 100644 test/api/test_brain_observatory_api.py create mode 100644 test/api/test_cache.py create mode 100644 test/api/test_cacheable.py create mode 100644 test/api/test_caching_utilities.py create mode 100644 test/api/test_cell_types_api.py create mode 100644 test/api/test_file_download.py create mode 100644 test/api/test_glif_api.py create mode 100644 test/api/test_grid_data_api.py create mode 100644 test/api/test_image_download_api.py create mode 100644 test/api/test_mouse_atlas_api.py create mode 100644 test/api/test_mouse_connectivity_api.py create mode 100644 test/api/test_ontologies_api.py create mode 100644 test/api/test_pager.py create mode 100644 test/api/test_reference_space_api.py create mode 100644 test/api/test_rma_template.py create mode 100644 test/api/test_svg_api.py create mode 100644 test/api/test_synchronization_api.py create mode 100644 test/api/test_tree_search_api.py create mode 100644 test/brain_observatory/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_circle_plots.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_demixer.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_dff.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_drifting_gratings.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_locally_sparse_noise.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_natural_movie.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_natural_scenes.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_notebook.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_observatory_plots.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_roi_masks.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_session_analysis.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_session_analysis_regression.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_session_api_utils.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_static_gratings.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_stimulus_analysis.cpython-37.pyc create mode 100644 test/brain_observatory/__pycache__/test_stimulus_info.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_behavior_metadata_legacy.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_behavior_ophys_experiment.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_behavior_session.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_criteria.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_dprime.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_event_detection.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_eye_tracking_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_mtrain_annotate.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_prior_exposure_count_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_rewards_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_session_metrics.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_stimulus_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_sync_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_trial_masks.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_trials_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_write_behavior_nwb.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/__pycache__/test_write_nwb_behavior_ophys.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__init__.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_cloud_api.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_lims_api.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_experiments_table_utils.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_from_s3.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/utils.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache/conftest.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache/utils.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/test_behavior_project_cache.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py create mode 100644 test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py create mode 100644 test/brain_observatory/behavior/conftest.py create mode 100644 test/brain_observatory/behavior/data_files/__pycache__/test_stimulus_file.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_files/__pycache__/test_sync_file.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_files/test_stimulus_file.py create mode 100644 test/brain_observatory/behavior/data_files/test_sync_file.py create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/lims_util.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/nwb_input_json.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_cell_specimens.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_licks.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_motion_correction.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_ophys_timestamps.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_projections.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_rewards.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_stimuli.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_task_parameters.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_trial_table.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/base/__pycache__/test_data_object.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/base/test_data_object.py create mode 100644 test/brain_observatory/behavior/data_objects/conftest.py create mode 100644 test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_eye_tracking_table.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_rig_geometry.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py create mode 100644 test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py create mode 100644 test/brain_observatory/behavior/data_objects/lims_util.py create mode 100644 test/brain_observatory/behavior/data_objects/metadata/__pycache__/test_behavior_ophys_metadata.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/test_behavior_metadata.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py create mode 100644 test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py create mode 100644 test/brain_observatory/behavior/data_objects/nwb_input_json.py create mode 100644 test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_acquisition.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_speed.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py create mode 100644 test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py create mode 100644 test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py create mode 100644 test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_stimulus_timestamps.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_timestamps_processing.cpython-37.pyc create mode 100644 test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py create mode 100644 test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py create mode 100644 test/brain_observatory/behavior/data_objects/test_cell_specimens.py create mode 100644 test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json create mode 100644 test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv create mode 100644 test/brain_observatory/behavior/data_objects/test_data/task_parameters.json create mode 100644 test/brain_observatory/behavior/data_objects/test_data/test_input.json create mode 100644 test/brain_observatory/behavior/data_objects/test_licks.py create mode 100644 test/brain_observatory/behavior/data_objects/test_motion_correction.py create mode 100644 test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py create mode 100644 test/brain_observatory/behavior/data_objects/test_projections.py create mode 100644 test/brain_observatory/behavior/data_objects/test_rewards.py create mode 100644 test/brain_observatory/behavior/data_objects/test_stimuli.py create mode 100644 test/brain_observatory/behavior/data_objects/test_task_parameters.py create mode 100644 test/brain_observatory/behavior/data_objects/test_trial_table.py create mode 100644 test/brain_observatory/behavior/test_behavior_metadata_legacy.py create mode 100644 test/brain_observatory/behavior/test_behavior_ophys_experiment.py create mode 100644 test/brain_observatory/behavior/test_behavior_session.py create mode 100644 test/brain_observatory/behavior/test_criteria.py create mode 100644 test/brain_observatory/behavior/test_dprime.py create mode 100644 test/brain_observatory/behavior/test_event_detection.py create mode 100644 test/brain_observatory/behavior/test_eye_tracking_processing.py create mode 100644 test/brain_observatory/behavior/test_mtrain_annotate.py create mode 100644 test/brain_observatory/behavior/test_prior_exposure_count_processing.py create mode 100644 test/brain_observatory/behavior/test_rewards_processing.py create mode 100644 test/brain_observatory/behavior/test_session_metrics.py create mode 100644 test/brain_observatory/behavior/test_stimulus_processing.py create mode 100644 test/brain_observatory/behavior/test_sync_processing.py create mode 100644 test/brain_observatory/behavior/test_trial_masks.py create mode 100644 test/brain_observatory/behavior/test_trials_processing.py create mode 100644 test/brain_observatory/behavior/test_write_behavior_nwb.py create mode 100644 test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py create mode 100644 test/brain_observatory/conftest.py create mode 100644 test/brain_observatory/ecephys/__init__.py create mode 100644 test/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_copy_utility.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_current_source_density.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_cache.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_fixed_api.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_lims_api.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_warehouse_api.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_session.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_session_nwb_api.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_sync_dataset.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_http_engine.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_lfp_subsampling.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_rma_engine.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_stim_file.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_stimulus_sync.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_visualization.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/__pycache__/test_write_nwb.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/align_timestamps/__init__.py create mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_align_timestamps_module.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode_sync_dataset.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_channel_states.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_probe_synchronizer.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py create mode 100644 test/brain_observatory/ecephys/align_timestamps/test_barcode.py create mode 100644 test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py create mode 100644 test/brain_observatory/ecephys/align_timestamps/test_channel_states.py create mode 100644 test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py create mode 100644 test/brain_observatory/ecephys/conftest.py create mode 100644 test/brain_observatory/ecephys/ecephys_session_api/__pycache__/test_ecephys_nwb1_session_api.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__init__.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_dot_motion.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_drifting_gratings.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_flashes.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_movies.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_scenes.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_receptive_field_mapping.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_static_gratings.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_stimulus_analysis.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/conftest.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py create mode 100644 test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py create mode 100644 test/brain_observatory/ecephys/stimulus_table/__init__.py create mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_ephys_pre_spikes.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_naming_utilities.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_parameter_extraction.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_table_module.cpython-37.pyc create mode 100644 test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py create mode 100644 test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py create mode 100644 test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py create mode 100644 test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py create mode 100644 test/brain_observatory/ecephys/test_copy_utility.py create mode 100644 test/brain_observatory/ecephys/test_current_source_density.py create mode 100644 test/brain_observatory/ecephys/test_ecephys_project_cache.py create mode 100644 test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py create mode 100644 test/brain_observatory/ecephys/test_ecephys_project_lims_api.py create mode 100644 test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py create mode 100644 test/brain_observatory/ecephys/test_ecephys_session.py create mode 100644 test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py create mode 100644 test/brain_observatory/ecephys/test_ecephys_sync_dataset.py create mode 100644 test/brain_observatory/ecephys/test_http_engine.py create mode 100644 test/brain_observatory/ecephys/test_lfp_subsampling.py create mode 100644 test/brain_observatory/ecephys/test_rma_engine.py create mode 100644 test/brain_observatory/ecephys/test_stim_file.py create mode 100644 test/brain_observatory/ecephys/test_stimulus_sync.py create mode 100644 test/brain_observatory/ecephys/test_visualization.py create mode 100644 test/brain_observatory/ecephys/test_write_nwb.py create mode 100644 test/brain_observatory/extract_running_speed/__init__.py create mode 100644 test/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/extract_running_speed/__pycache__/test_extract_running_speed_module.cpython-37.pyc create mode 100644 test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py create mode 100644 test/brain_observatory/gaze_mapping/__init__.py create mode 100644 test/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/gaze_mapping/__pycache__/test_gaze_mapping.cpython-37.pyc create mode 100644 test/brain_observatory/gaze_mapping/__pycache__/test_main.cpython-37.pyc create mode 100644 test/brain_observatory/gaze_mapping/test_gaze_mapping.py create mode 100644 test/brain_observatory/gaze_mapping/test_main.py create mode 100644 test/brain_observatory/nwb/__init__.py create mode 100644 test/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/nwb/__pycache__/conftest.cpython-37.pyc create mode 100644 test/brain_observatory/nwb/__pycache__/test_nwb.cpython-37.pyc create mode 100644 test/brain_observatory/nwb/__pycache__/test_nwb_api.cpython-37.pyc create mode 100644 test/brain_observatory/nwb/__pycache__/test_nwb_utils.cpython-37.pyc create mode 100644 test/brain_observatory/nwb/conftest.py create mode 100644 test/brain_observatory/nwb/test_nwb.py create mode 100644 test/brain_observatory/nwb/test_nwb_api.py create mode 100644 test/brain_observatory/nwb/test_nwb_utils.py create mode 100644 test/brain_observatory/receptive_field_analysis/__pycache__/test_chisquarerf.cpython-37.pyc create mode 100644 test/brain_observatory/receptive_field_analysis/__pycache__/test_fitgaussian2D.cpython-37.pyc create mode 100644 test/brain_observatory/receptive_field_analysis/test_chisquarerf.py create mode 100644 test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py create mode 100644 test/brain_observatory/sync_utilities/__init__.py create mode 100644 test/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc create mode 100644 test/brain_observatory/sync_utilities/__pycache__/test_sync_utilities.cpython-37.pyc create mode 100644 test/brain_observatory/sync_utilities/test_sync_utilities.py create mode 100644 test/brain_observatory/test_circle_plots.py create mode 100644 test/brain_observatory/test_demixer.py create mode 100644 test/brain_observatory/test_dff.py create mode 100644 test/brain_observatory/test_drifting_gratings.py create mode 100644 test/brain_observatory/test_locally_sparse_noise.py create mode 100644 test/brain_observatory/test_natural_movie.py create mode 100644 test/brain_observatory/test_natural_scenes.py create mode 100644 test/brain_observatory/test_notebook.py create mode 100644 test/brain_observatory/test_observatory_plots.py create mode 100644 test/brain_observatory/test_observatory_plots_data.json create mode 100644 test/brain_observatory/test_roi_masks.py create mode 100644 test/brain_observatory/test_session_analysis.py create mode 100644 test/brain_observatory/test_session_analysis_regression.py create mode 100644 test/brain_observatory/test_session_analysis_regression_data.json create mode 100644 test/brain_observatory/test_session_analysis_regression_data_list.json create mode 100644 test/brain_observatory/test_session_api_utils.py create mode 100644 test/brain_observatory/test_static_gratings.py create mode 100644 test/brain_observatory/test_stimulus_analysis.py create mode 100644 test/brain_observatory/test_stimulus_info.py create mode 100644 test/config/__pycache__/test_config_single_file_json.cpython-37.pyc create mode 100644 test/config/__pycache__/test_json_comments.cpython-37.pyc create mode 100644 test/config/__pycache__/test_manifest.cpython-37.pyc create mode 100644 test/config/__pycache__/test_multi_file_config.cpython-37.pyc create mode 100644 test/config/__pycache__/test_pyconfig_parser.cpython-37.pyc create mode 100644 test/config/test_config_single_file_json.py create mode 100644 test/config/test_json_comments.py create mode 100644 test/config/test_manifest.py create mode 100644 test/config/test_multi_file_config.py create mode 100644 test/config/test_pyconfig_parser.py create mode 100644 test/core/__pycache__/test_authentication.cpython-37.pyc create mode 100644 test/core/__pycache__/test_brain_observatory_cache.cpython-37.pyc create mode 100644 test/core/__pycache__/test_brain_observatory_nwb_data_set.cpython-37.pyc create mode 100644 test/core/__pycache__/test_cell_filters.cpython-37.pyc create mode 100644 test/core/__pycache__/test_cell_types_cache_unit.cpython-37.pyc create mode 100644 test/core/__pycache__/test_h5_utilities.cpython-37.pyc create mode 100644 test/core/__pycache__/test_json_utilities.cpython-37.pyc create mode 100644 test/core/__pycache__/test_lazy_property.cpython-37.pyc create mode 100644 test/core/__pycache__/test_mouse_connectivity_cache.cpython-37.pyc create mode 100644 test/core/__pycache__/test_mouse_connectivity_notebook.cpython-37.pyc create mode 100644 test/core/__pycache__/test_nwb_data_set.cpython-37.pyc create mode 100644 test/core/__pycache__/test_obj_utilities.cpython-37.pyc create mode 100644 test/core/__pycache__/test_reference_space.cpython-37.pyc create mode 100644 test/core/__pycache__/test_reference_space_cache.cpython-37.pyc create mode 100644 test/core/__pycache__/test_reference_space_notebook.cpython-37.pyc create mode 100644 test/core/__pycache__/test_simple_tree.cpython-37.pyc create mode 100644 test/core/__pycache__/test_sitk_utilities.cpython-37.pyc create mode 100644 test/core/__pycache__/test_structure_tree.cpython-37.pyc create mode 100644 test/core/nwb_ephys_files.txt create mode 100644 test/core/nwb_files.txt create mode 100644 test/core/test_authentication.py create mode 100644 test/core/test_brain_observatory_cache.py create mode 100644 test/core/test_brain_observatory_nwb_data_set.py create mode 100644 test/core/test_cell_filters.py create mode 100644 test/core/test_cell_types_cache_unit.py create mode 100644 test/core/test_h5_utilities.py create mode 100644 test/core/test_json_utilities.py create mode 100644 test/core/test_lazy_property.py create mode 100644 test/core/test_mouse_connectivity_cache.py create mode 100644 test/core/test_mouse_connectivity_notebook.py create mode 100644 test/core/test_nwb_data_set.py create mode 100644 test/core/test_obj_utilities.py create mode 100644 test/core/test_reference_space.py create mode 100644 test/core/test_reference_space_cache.py create mode 100644 test/core/test_reference_space_notebook.py create mode 100644 test/core/test_simple_tree.py create mode 100644 test/core/test_sitk_utilities.py create mode 100644 test/core/test_structure_tree.py create mode 100644 test/ephys/__pycache__/test_extractor.cpython-37.pyc create mode 100644 test/ephys/__pycache__/test_features.cpython-37.pyc create mode 100644 test/ephys/data/spike_test_high_init_dvdt.txt create mode 100644 test/ephys/data/spike_test_pair.txt create mode 100644 test/ephys/data/spike_test_var_dt.txt create mode 100644 test/ephys/test_extractor.py create mode 100644 test/ephys/test_features.py create mode 100644 test/glif_tests.py create mode 100644 test/internal/__pycache__/conftest.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_annotated_region_metrics.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_biophysical_modules.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_core_feature_extract.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_eye_calibration.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_internal.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_mtrain_api.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_optimize_config_reader.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_optimize_manifest.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_roi_filter.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_simulate_manifest.cpython-37.pyc create mode 100644 test/internal/__pycache__/test_simulate_update_output.cpython-37.pyc create mode 100644 test/internal/api/__pycache__/test_api_prerelease.cpython-37.pyc create mode 100644 test/internal/api/__pycache__/test_grid_data_api_prerelease.cpython-37.pyc create mode 100644 test/internal/api/__pycache__/test_mouse_connectivity_api_prerelease.cpython-37.pyc create mode 100644 test/internal/api/__pycache__/test_pre_release.cpython-37.pyc create mode 100644 test/internal/api/test_api_prerelease.py create mode 100644 test/internal/api/test_grid_data_api_prerelease.py create mode 100644 test/internal/api/test_mouse_connectivity_api_prerelease.py create mode 100644 test/internal/api/test_pre_release.py create mode 100644 test/internal/biophysical/__pycache__/conftest.cpython-37.pyc create mode 100644 test/internal/biophysical/__pycache__/test_ephys_utils.cpython-37.pyc create mode 100644 test/internal/biophysical/__pycache__/test_optimize_run.cpython-37.pyc create mode 100644 test/internal/biophysical/__pycache__/test_simulate_run.cpython-37.pyc create mode 100644 test/internal/biophysical/conftest.py create mode 100644 test/internal/biophysical/test_ephys_utils.py create mode 100644 test/internal/biophysical/test_optimize_run.py create mode 100644 test/internal/biophysical/test_simulate_run.py create mode 100644 test/internal/brain_observatory/__pycache__/test_roi_filter_utils.cpython-37.pyc create mode 100644 test/internal/brain_observatory/__pycache__/test_run_ophys_time_sync.cpython-37.pyc create mode 100644 test/internal/brain_observatory/__pycache__/test_time_sync.cpython-37.pyc create mode 100644 test/internal/brain_observatory/test_roi_filter_utils.py create mode 100644 test/internal/brain_observatory/test_run_ophys_time_sync.py create mode 100644 test/internal/brain_observatory/test_time_sync.py create mode 100644 test/internal/brain_observatory/time_sync_test_data.json create mode 100644 test/internal/conftest.py create mode 100644 test/internal/core/__pycache__/test_mouse_connectivity_cache_prerelease.cpython-37.pyc create mode 100644 test/internal/core/test_mouse_connectivity_cache_prerelease.py create mode 100644 test/internal/gbm/__pycache__/test_generate_gbm_heatmap.cpython-37.pyc create mode 100644 test/internal/gbm/test_generate_gbm_heatmap.py create mode 100644 test/internal/morphology/__pycache__/test_apply_affine.cpython-37.pyc create mode 100644 test/internal/morphology/test_apply_affine.py create mode 100644 test/internal/mouse_connectivity/__pycache__/test_interval_unionizer.cpython-37.pyc create mode 100644 test/internal/mouse_connectivity/__pycache__/test_tissuecyte_unionize_record.cpython-37.pyc create mode 100644 test/internal/mouse_connectivity/__pycache__/test_unionize_record.cpython-37.pyc create mode 100644 test/internal/mouse_connectivity/test_interval_unionizer.py create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_projection_functions.cpython-37.pyc create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_visualization_utilities.cpython-37.pyc create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_projector.cpython-37.pyc create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_utilities.cpython-37.pyc create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py create mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py create mode 100644 test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py create mode 100644 test/internal/mouse_connectivity/test_unionize_record.py create mode 100644 test/internal/test_annotated_region_metrics.py create mode 100644 test/internal/test_biophysical_modules.py create mode 100644 test/internal/test_core_feature_extract.py create mode 100644 test/internal/test_eye_calibration.py create mode 100644 test/internal/test_internal.py create mode 100644 test/internal/test_mtrain_api.py create mode 100644 test/internal/test_optimize_config_reader.py create mode 100644 test/internal/test_optimize_manifest.py create mode 100644 test/internal/test_roi_filter.py create mode 100644 test/internal/test_simulate_manifest.py create mode 100644 test/internal/test_simulate_update_output.py create mode 100644 test/internal/tissuecyte_stitching/__pycache__/test_stitcher.cpython-37.pyc create mode 100644 test/internal/tissuecyte_stitching/__pycache__/test_tile.cpython-37.pyc create mode 100644 test/internal/tissuecyte_stitching/test_stitcher.py create mode 100644 test/internal/tissuecyte_stitching/test_tile.py create mode 100644 test/model/__pycache__/check_parser.cpython-37.pyc create mode 100644 test/model/__pycache__/test_biophysical_perisomatic.cpython-37.pyc create mode 100644 test/model/__pycache__/test_glif.cpython-37.pyc create mode 100644 test/model/__pycache__/test_runner.cpython-37.pyc create mode 100644 test/model/aa_model/468193142_fit.json create mode 100644 test/model/aa_model/__pycache__/test_biophysical_all_active.cpython-37.pyc create mode 100644 test/model/aa_model/manifest.json create mode 100644 test/model/aa_model/test_biophysical_all_active.py create mode 100644 test/model/check_parser.py create mode 100644 test/model/peri_model/468193142_fit.json create mode 100644 test/model/peri_model/__pycache__/test_biophysical_peri.cpython-37.pyc create mode 100644 test/model/peri_model/manifest.json create mode 100644 test/model/peri_model/test_biophysical_peri.py create mode 100644 test/model/test_biophysical_perisomatic.py create mode 100644 test/model/test_glif.py create mode 100644 test/model/test_runner.py create mode 100644 test/mouse_connectivity/__init__.py create mode 100644 test/mouse_connectivity/__pycache__/__init__.cpython-37.pyc create mode 100644 test/mouse_connectivity/grid/__init__.py create mode 100644 test/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc create mode 100644 test/mouse_connectivity/grid/__pycache__/test_base_subimage.cpython-37.pyc create mode 100644 test/mouse_connectivity/grid/__pycache__/test_cav_subimage.cpython-37.pyc create mode 100644 test/mouse_connectivity/grid/__pycache__/test_classic_subimage.cpython-37.pyc create mode 100644 test/mouse_connectivity/grid/__pycache__/test_image_series_gridder.cpython-37.pyc create mode 100644 test/mouse_connectivity/grid/__pycache__/test_image_utilities.cpython-37.pyc create mode 100644 test/mouse_connectivity/grid/test_base_subimage.py create mode 100644 test/mouse_connectivity/grid/test_cav_subimage.py create mode 100644 test/mouse_connectivity/grid/test_classic_subimage.py create mode 100644 test/mouse_connectivity/grid/test_image_series_gridder.py create mode 100644 test/mouse_connectivity/grid/test_image_utilities.py create mode 100644 test/test_argschema_utilities.py create mode 100644 test/test_deprecated.py create mode 100644 test/test_inline_examples.py create mode 100644 test/test_temp_dir.py create mode 100644 test_utilities/__init__.py create mode 100644 test_utilities/__pycache__/__init__.cpython-37.pyc create mode 100644 test_utilities/__pycache__/custom_comparators.cpython-37.pyc create mode 100644 test_utilities/__pycache__/regression_fixture.cpython-37.pyc create mode 100644 test_utilities/__pycache__/temp_dir.cpython-37.pyc create mode 100644 test_utilities/custom_comparators.py create mode 100644 test_utilities/regression_fixture.py create mode 100644 test_utilities/temp_dir.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000000..afef589b0b --- /dev/null +++ b/__init__.py @@ -0,0 +1,79 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging + +__version__ = '2.13.1' + + +try: + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + + +class OneResultExpectedError(RuntimeError): + pass + + +def one(x): + if isinstance(x, str): + return x + try: + xlen = len(x) + except TypeError: + return x + if xlen != 1: + raise OneResultExpectedError("Expected length one result, received: " + f"{x} results from query") + if isinstance(x, set): + return list(x)[0] + else: + return x[0] + + +logging.getLogger(__name__).addHandler(NullHandler()) + +if True: + file_download_log = logging.getLogger( + 'allensdk.api.api.retrieve_file_over_http') + file_download_log.setLevel(logging.INFO) + console = logging.StreamHandler() + formatter = logging.Formatter("%(asctime)s %(name)-12s " + "%(levelname)-8s %(message)s") + console.setFormatter(formatter) + file_download_log.addHandler(console) diff --git a/__pycache__/__init__.cpython-37.pyc b/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2b5a59b88b5e4ed8af10ababe76c3f90f359d63 GIT binary patch literal 1381 zcmYjQPiq`E6qjaZcV}nE_Bsiny_7vP!2|JvV+tjN;3gzZAZ#FMX)-Jk%IJAL@%)RV zb-c^=(#>bcp`~D73cd6L>Dp7iLQj2?y|y*HH&1%f`}5OJ57*Wrg5$5>Kl9H$LjJXr z)dr5=78~q(pcro%M0%7o_x3kCI7B6x~lG?EpCmp?gYCBJh^vlu}|>M085i9`sIPjIwsVx_(O1 z4fOU!551ePadHhdov(+dH>@S-E0V-tux2uvx9<*jc85C&HNDZaD4z046d*I}Tn!J6 zJrs2V6_At)l6ry)4@>ifkHG?I_heStVgD565sC^>34)vG=x>sECQwl9o3@0kmO}dI zb?U!2kM50sRv^`wA8;{z$3OCFHvXaFSzQUfJBI2=jq3&~m7%VigP9r^`Ma^oHEcIL zJLD6j#bnniOT#N!9dIr+vXbnexaKgmoo62;BJx()v$-Nq?g*P7C9_)omL=1YhI+ z1rpo--G#SCUu+rk+pDeycsCP$FsLgSNZ0Qj{AZ9Kfw(uAUq4?|gMC?-gAY@XGif6v z9TVj$uaxFh2F6!f8Xses?oYD@99FJt^nf-&kt>a;(&IEZ#$8uHvv?UF(|?DCx`~R= zhz8W7FGQ1>nTEW{ok-9!ha+J7Ig+D30?7`vZsxnUwz$f4UP7V< zx3(-d7RpCZ@+2#!`7*G3Kaade6$HmfH1Z zI_Iy_#4o3n&2rhYtJHKSpr2zbkd81W;zFFCNjF`sqW)MFH5Uw1nh;@nZtF6^v(b|m zX6==hz{}N%4!$^57ht+iYFTovL7MLVg&E`N3&$03FBoaU`)AMR!M7IXZ%~C^;Cr-> VAb-{B2Vwu3A0XT@0v;jY{{!~xRO$c# literal 0 HcmV?d00001 diff --git a/__pycache__/deprecated.cpython-37.pyc b/__pycache__/deprecated.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d107d244cd950293049af13a0ae3375f1d3837b2 GIT binary patch literal 2190 zcmcIlPj3@P6rY)0+Z*FRfRa*?iaq2|BM78bFBPIqL5NCKRH>qsTuZC*&e+*_|7m8O z$R;^djTCcerGA4%J@qT?wI{v;C*GS~8*d;8s&?dg`*!^P&iv-L-!3mV35@8kU-_RG z3Hb+KX2SyI8<_er2tfo5NvC+y4mIzr!{Et6E3!K_C1Ocf!aky%nrMoesDoA)7eqri zpfv>jk+fScAQstf)BKa40v+^1`ADWp`aBDg_-C%-ARhP>ZD25%SOiYJ24V{7hmL9q z`kWk-J{3$@N6sNVz|i(~PAaZ8cwC*iX5@rU$tgW1$F$D`xE?vb(bCo0_QB2!%vpnZ z6Q*7Vk&#_0=n0#WU295DS!QF_-z^H&9FPP0N0EDS^YJM5u?zRvy+b$9t|%LmV#9s5 zdH4b&w^{B$uX2#6ao*G!_lKd}lVQ7-JNrfVI=4~F>-|JUJj)%=i+LnHPn7{|t_C`< z55a1nAt39=c_Wfq^MU-Ey!_?iSKX&tD&6HfTx|6CK99%Ut(f~sEch2)8Sm+ClFC^7 zAd_@wth?U_y{-;2c_)Q}APo41Ay|mv-GwgFao*ThJWZwA#NBZ~5X+$sZL-Oi3x@Z@ z#OI-Yu#t?ibd-5Q`ibIMqBiFLlyRW^r9SRkl7u?1;VQJGmLagZ45CdHpb{TuX$ACr zOFsgu*No*_27sd>!W&7!=(yhuW;QtggXI1#2Gy zQ-#JA?>SOGhkpvB?y^(*oMzUE4Zs5(aeK`A)*^DJ!~<9Y^v}cZXC~YNepv;-w7@T1 zTnu7wPu3oWT$Ui8d^nt5pCtt$GC2=u=@6tkHDa;y2aKSbvn5>E9!l#t^n}{CVT^kD`#VV{W`6I z<3)wsSOL_31V@bfzZ2*1EODkP*$adeE-;|m14aU-6Ln_G;gXXKUsR#nou9^x3O9?g z-T>^oXs`mvchR3=s}AOzGhVq3=jW?{?Coq`_. +''' diff --git a/api/__pycache__/__init__.cpython-37.pyc b/api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3177edbe0387fcde39e6332ac2ad0a4f150a7d6 GIT binary patch literal 341 zcmXv}u}%Xq3{6=mmHH2vkUBIsuvJyX6-I=RDi#!!`VzMnHJ5}-%275xf-hj=m%8!^ zY)rTnSbCN%`}z6Jhrzw1HD7vl_)nRAcKop@}7o=2JZ}3IbxpA|l5`)`OZ-1(k30kR7)}GMM$Mo}f zHIerT+a#d|BP!^??_}vg2XEj)qJK^@M6#eMhgk2Dys?!`Hsd&g-oP4(`)Beft(5gP VD<$G?-=8+YY#q+dN%5P&egT)eYvcd` literal 0 HcmV?d00001 diff --git a/api/__pycache__/api.cpython-37.pyc b/api/__pycache__/api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed0afb71917e9dbcaffe4919bc2cf740e79075e6 GIT binary patch literal 13302 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 EPkubWlK=n! literal 0 HcmV?d00001 diff --git a/api/api.py b/api/api.py new file mode 100644 index 0000000000..c69e53b75b --- /dev/null +++ b/api/api.py @@ -0,0 +1,443 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from contextlib import closing +import logging +import os +import errno +import warnings +import io +import zipfile + +import requests +import pandas as pd +from requests_toolbelt import exceptions +from requests_toolbelt.downloadutils import stream + +import allensdk.core.json_utilities as json_utilities + + +class Api(object): + _log = logging.getLogger('allensdk.api.api') + _file_download_log = logging.getLogger('allensdk.api.api.retrieve_file_over_http') + default_api_url = 'http://api.brain-map.org' + download_url = 'http://download.alleninstitute.org' + + def __init__(self, api_base_url_string=None): + if api_base_url_string is None: + api_base_url_string = Api.default_api_url + + self.set_api_urls(api_base_url_string) + self.default_working_directory = os.getcwd() + + def set_api_urls(self, api_base_url_string): + '''Set the internal RMA and well known file download endpoint urls + based on a api server endpoint. + + Parameters + ---------- + api_base_url_string : string + url of the api to point to + ''' + self.api_url = api_base_url_string + + # http://help.brain-map.org/display/api/Downloading+a+WellKnownFile + self.well_known_file_endpoint = api_base_url_string + \ + '/api/v2/well_known_file_download' + + # http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data + self.grid_data_endpoint = api_base_url_string + '/grid_data' + + # http://help.brain-map.org/display/api/Downloading+and+Displaying+SVG + self.svg_endpoint = api_base_url_string + '/api/v2/svg' + self.svg_download_endpoint = api_base_url_string + '/api/v2/svg_download' + + # http://help.brain-map.org/display/api/Downloading+an+Ontology%27s+Structure+Graph + self.structure_graph_endpoint = api_base_url_string + \ + '/api/v2/structure_graph_download' + + # http://help.brain-map.org/display/api/Searching+a+Specimen+or+Structure+Tree + self.tree_search_endpoint = api_base_url_string + '/api/v2/tree_search' + + # http://help.brain-map.org/display/api/Searching+Annotated+SectionDataSets + self.annotated_section_data_sets_endpoint = api_base_url_string + \ + '/api/v2/annotated_section_data_sets' + self.compound_annotated_section_data_sets_endpoint = api_base_url_string + \ + '/api/v2/compound_annotated_section_data_sets' + + # http://help.brain-map.org/display/api/Image-to-Image+Synchronization#Image-to-ImageSynchronization-ImagetoImage + self.image_to_atlas_endpoint = api_base_url_string + '/api/v2/image_to_atlas' + self.image_to_image_endpoint = api_base_url_string + '/api/v2/image_to_image' + self.image_to_image_2d_endpoint = api_base_url_string + '/api/v2/image_to_image_2d' + self.reference_to_image_endpoint = api_base_url_string + '/api/v2/reference_to_image' + self.image_to_reference_endpoint = api_base_url_string + '/api/v2/image_to_reference' + self.structure_to_image_endpoint = api_base_url_string + '/api/v2/structure_to_image' + + # http://help.brain-map.org/display/mouseconnectivity/API + self.section_image_download_endpoint = api_base_url_string + \ + '/api/v2/section_image_download' + self.atlas_image_download_endpoint = api_base_url_string + \ + '/api/v2/atlas_image_download' + self.projection_image_download_endpoint = api_base_url_string + \ + '/api/v2/projection_image_download' + self.image_download_endpoint = api_base_url_string + \ + '/api/v2/image_download' + self.informatics_archive_endpoint = Api.download_url + '/informatics-archive' + + self.rma_endpoint = api_base_url_string + '/api/v2/data' + + def set_default_working_directory(self, working_directory): + '''Set the working directory where files will be saved. + + Parameters + ---------- + working_directory : string + the absolute path string of the working directory. + ''' + self.default_working_directory = working_directory + + def read_data(self, parsed_json): + '''Return the message data from the parsed query. + + Parameters + ---------- + parsed_json : dict + A python structure corresponding to the JSON data returned from the API. + + Notes + ----- + See `API Response Formats - Response Envelope `_ + for additional documentation. + ''' + return parsed_json['msg'] + + def json_msg_query(self, url, dataframe=False): + ''' Common case where the url is fully constructed + and the response data is stored in the 'msg' field. + + Parameters + ---------- + url : string + Where to get the data in json form + dataframe : boolean + True converts to a pandas dataframe, False (default) doesn't + + Returns + ------- + dict or DataFrame + returned data; type depends on dataframe option + ''' + + data = self.do_query(lambda *a, **k: url, + self.read_data) + + if dataframe is True: + warnings.warn("dataframe argument is deprecated", DeprecationWarning) + data = pd.DataFrame(data) + + return data + + def do_query(self, url_builder_fn, json_traversal_fn, *args, **kwargs): + '''Bundle an query url construction function + with a corresponding response json traversal function. + + Parameters + ---------- + url_builder_fn : function + A function that takes parameters and returns an rma url. + json_traversal_fn : function + A function that takes a json-parsed python data structure and returns data from it. + post : boolean, optional kwarg + True does an HTTP POST, False (default) does a GET + args : arguments + Arguments to be passed to the url builder function. + kwargs : keyword arguments + Keyword arguments to be passed to the rma builder function. + + Returns + ------- + any type + The data extracted from the json response. + + Examples + -------- + `A simple Api subclass example + `_. + ''' + api_url = url_builder_fn(*args, **kwargs) + + post = kwargs.get('post', False) + + json_parsed_data = self.retrieve_parsed_json_over_http(api_url, post) + + return json_traversal_fn(json_parsed_data) + + def do_rma_query(self, rma_builder_fn, json_traversal_fn, *args, **kwargs): + '''Bundle an RMA query url construction function + with a corresponding response json traversal function. + + ..note:: Deprecated in AllenSDK 0.9.2 + `do_rma_query` will be removed in AllenSDK 1.0, it is replaced by + `do_query` because the latter is more general. + + Parameters + ---------- + rma_builder_fn : function + A function that takes parameters and returns an rma url. + json_traversal_fn : function + A function that takes a json-parsed python data structure and returns data from it. + args : arguments + Arguments to be passed to the rma builder function. + kwargs : keyword arguments + Keyword arguments to be passed to the rma builder function. + + Returns + ------- + any type + The data extracted from the json response. + + Examples + -------- + `A simple Api subclass example + `_. + ''' + return self.do_query(rma_builder_fn, json_traversal_fn, *args, **kwargs) + + def load_api_schema(self): + '''Download the RMA schema from the current RMA endpoint + + Returns + ------- + dict + the parsed json schema message + + Notes + ----- + This information and other + `Allen Brain Atlas Data Portal Data Model `_ + documentation is also available as a + `Class Hierarchy `_ + and `Class List `_. + + ''' + schema_url = self.rma_endpoint + '/enumerate.json' + json_parsed_schema_data = self.retrieve_parsed_json_over_http( + schema_url) + + return json_parsed_schema_data + + def construct_well_known_file_download_url(self, well_known_file_id): + '''Join data api endpoint and id. + + Parameters + ---------- + well_known_file_id : integer or string representing an integer + well known file id + + Returns + ------- + string + the well-known-file download url for the current api api server + + See Also + -------- + retrieve_file_over_http: Can be used to retrieve the file from the url. + ''' + return self.well_known_file_endpoint + '/' + str(well_known_file_id) + + def cleanup_truncated_file(self, file_path): + '''Helper for removing files. + + Parameters + ---------- + file_path : string + Absolute path including the file name to remove.''' + try: + os.remove(file_path) + except OSError as e: + if e.errno != errno.ENOENT: + raise + + def retrieve_file_over_http(self, url, file_path, zipped=False): + '''Get a file from the data api and save it. + + Parameters + ---------- + url : string + Url[1]_ from which to get the file. + file_path : string + Absolute path including the file name to save. + zipped : bool, optional + If true, assume that the response is a zipped directory and attempt + to extract contained files into the directory containing file_path. + Default is False. + + See Also + -------- + construct_well_known_file_download_url: Can be used to construct the url. + + References + ---------- + .. [1] Allen Brain Atlas Data Portal: `Downloading a WellKnownFile `_. + ''' + + self._file_download_log.info("Downloading URL: %s", url) + + try: + if zipped: + stream_zip_directory_over_http(url, os.path.dirname(file_path)) + else: + stream_file_over_http(url, file_path) + + except exceptions.StreamingError as e: + self._file_download_log.error("Couldn't retrieve file %s from %s (streaming)." % (file_path,url)) + self.cleanup_truncated_file(file_path) + raise + + except requests.exceptions.ConnectionError as e: + self._file_download_log.error("Couldn't retrieve file %s from %s (connection)." % (file_path,url)) + self.cleanup_truncated_file(file_path) + raise + + except requests.exceptions.ReadTimeout as e: + self._file_download_log.error("Couldn't retrieve file %s from %s (timeout)." % (file_path,url)) + self.cleanup_truncated_file(file_path) + raise + + except requests.exceptions.RequestException as e: + self._file_download_log.error("Couldn't retrieve file %s from %s (request)." % (file_path,url)) + self.cleanup_truncated_file(file_path) + raise + + except Exception as e: + self._file_download_log.error("Couldn't retrieve file %s from %s" % (file_path, url)) + self.cleanup_truncated_file(file_path) + raise + + + def retrieve_parsed_json_over_http(self, url, post=False): + '''Get the document and put it in a Python data structure + + Parameters + ---------- + url : string + Full API query url. + post : boolean + True does an HTTP POST, False (default) encodes the URL and does a GET + + Returns + ------- + dict + Result document as parsed by the JSON library. + ''' + self._log.info("Downloading URL: %s", url) + + if post is False: + data = json_utilities.read_url_get( + requests.utils.quote(url, + ';/?:@&=+$,')) + else: + data = json_utilities.read_url_post(url) + + return data + + def retrieve_xml_over_http(self, url): + '''Get the document and put it in a Python data structure + + Parameters + ---------- + url : string + Full API query url. + + Returns + ------- + string + Unparsed xml string. + ''' + self._log.info("Downloading URL: %s", url) + + response = requests.get(url) + + return response.content + + +def stream_zip_directory_over_http(url, directory, members=None, timeout=(9.05, 31.1)): + ''' Supply an http get request and stream the response to a file. + + Parameters + ---------- + url : str + Send the request to this url + directory : str + Extract the response to this directory + members : list of str, optional + Extract only these files + timeout : float or tuple of float, optional + Specify a timeout for the request. If a tuple, specify seperate connect + and read timeouts. + + ''' + + buf = io.BytesIO() + + with closing( requests.get(url, stream=True, timeout=timeout) ) as request: + stream.stream_response_to_file( request, buf ) + + zipper = zipfile.ZipFile(buf) + zipper.extractall(path=directory, members=members) + zipper.close() + + +def stream_file_over_http(url, file_path, timeout=(9.05, 31.1)): + ''' Supply an http get request and stream the response to a file. + + Parameters + ---------- + url : str + Send the request to this url + file_path : str + Stream the response to this path + timeout : float or tuple of float, optional + Specify a timeout for the request. If a tuple, specify seperate connect + and read timeouts. + + ''' + + with closing(requests.get(url, stream=True, timeout=timeout)) as response: + + response.raise_for_status() + with open(file_path, 'wb') as fil: + stream.stream_response_to_file(response, path=fil) diff --git a/api/cloud_cache/__init__.py b/api/cloud_cache/__init__.py new file mode 100644 index 0000000000..fa81adaff6 --- /dev/null +++ b/api/cloud_cache/__init__.py @@ -0,0 +1 @@ +# empty file diff --git a/api/cloud_cache/__pycache__/__init__.cpython-37.pyc b/api/cloud_cache/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd1a7e31dbb0c542feb563847a14ae01d634e082 GIT binary patch literal 192 zcmZ?b<>g`kg51T8iM&AiF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j)7dH}v^ce> zI3_V8F-0#au{<%aGR844F*!dkCDAx0HLt8VCchvxuQ(Y<<`-mC7RUHxCdCwImZa(y zBqnDkrl$h+=HviXq-5(S7G&xt=j4~B#3v^vXQb-K$7kkcmc+;F6;$5hu*uC&Da}c> L13BR{5HkP(<99Y0 literal 0 HcmV?d00001 diff --git a/api/cloud_cache/__pycache__/cloud_cache.cpython-37.pyc b/api/cloud_cache/__pycache__/cloud_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b27a9122fe13dba9f3ae8fa4425b7270fd87c1b9 GIT binary patch literal 38354 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 JeZF+;{{Vg>=rI5Q literal 0 HcmV?d00001 diff --git a/api/cloud_cache/__pycache__/file_attributes.cpython-37.pyc b/api/cloud_cache/__pycache__/file_attributes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c8bba1911a88eb1fe5cabd270f26e57ab9cd5f2 GIT binary patch literal 2509 zcma)8Pj4JG6t`z)H=E6$rYQ(e1M&ex=g{O3Bv6Z>Ap$NXs%Xk#wUXr>JK5RH&J4Dv z=|t2+3AEwgzlk?3LjJ|c zv_v8C^u3CDl@qY+O>=luH-UIqfXhD=oR~SK9STTdw$(6<9$z zcy3j$`L$KKF7I5B&YIi+&F;E;`y%P9AJR1C7CdWou*mF zk|MVv&6({hChGmHIAVfnH7u;kM$FhkE6I*PrWaxg*e@&|8nHy=ObL_1K9NflXi{TU zZegLPSP4*YR_LMvZco`$rE)I?A&1KL3u)L;oTT|Nt4goP1lZ$&c(BGx9*R6YQpQfy zSElWyJQG@g6s3)yKCGLcRyunG>T5rl*ss`81%|))`6*h7O3cCeeJ?>+TI4*H*U#>u zBvjLsDoKw<_=)GQ_D{v3o7jU=7d_DfA0#46s!UiVYbAOk_Ix+?Q{2q^!t}309fH^g zef3I6KpKiHo;U+H&ck>SSpg8d6c%J4&C=fXGZZ?C0SgAQ)4tNmFQFQr z8_&U);KtOA53Dy3Ubl=M?YrAg=J@3 zGb0yp@7HE8V171pM9rNK<^&;byLM{Q+*pw(%7u`RuKkP1D)qhAg?5o0mC7w$9dr?< zfr~f>V1>_=b8TMh0*o1S+;EXm*^v&x?HYriF&erFpgZldjS2kHpafrA|Q!zbFz{Cl2CutdbmFLe8PO`LK``JS^O;a{g;2vMUZC$Rgof zd;L~WNyO3b0dXyOvPz}x=%z6kB)x?MFMv7XOJN!cgF9NAQ5aDCZEQk^?`hu*HSPq5 jV-;(}20!!$DzTn1C)T5&Y}fjFV#qgGqXuiCMO)$j6J&yV literal 0 HcmV?d00001 diff --git a/api/cloud_cache/__pycache__/manifest.cpython-37.pyc b/api/cloud_cache/__pycache__/manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..044a9ffe6988ddf385ce2a6044124621a522f43f GIT binary patch literal 7232 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 HtB-#HD}&h4 literal 0 HcmV?d00001 diff --git a/api/cloud_cache/__pycache__/utils.cpython-37.pyc b/api/cloud_cache/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7acabcb6333108bdf8f8080573c5c77f64b47d7 GIT binary patch literal 2626 zcma)7TW=gS81-ECl1+LMO-qA#unH(F+6y8Q5&@w$r2<41N|F+^-74~qy_sp|R@H_t zjvo)5n|RgtXgJ|cOcJN(ByP`j%-D^+#P9jG@5Pl~1#@0p?N#l6EvfhBX5SjUhL{(Q zm|r5?|Hb7MUj5PUEnsfmj%&P*@de>x#vi&%1oLxP*WmM*zsS8!(p-3fC`i*S>R;zN z%2E~=mHR0=O{ehhF&(bsn>UhiQI$fEWEwbT1D?w4y^Vi0M5D=}!<{4NsiWOPZ%WW} zr|u*FsW){FD^m|+f9i90uP#5+)x+ArFbejB zrje$37NuHIosF5~s?)IM?lFlyT1aJw?UTn2;bN64E$zT~zeRUNDr6KG?=7lEk!FKf z&|xM`95NF7QM!w;jO%RhNCcYhM+_4uCcfC(x<^01vxW7KM?&dYARD&Q=c2G%&UsJi z`K(O79lD-ru}Y&MT~;d{maqdH=~#7wELo;J6N;vprdbe-Bno#DhpCrMLWhx}s6m)< zI*#J_xS;DzAH5Uq5dI+`7)oQnEk}A_PxpfC|wyVr!x14ONm39vF zwzbD=h*FRsz z^@G>{T}TRo(1JAQ3s;JwhKTYg7R4NSwt~Re(0j!-?wOjRt)cX@N2Zdu&%= zZyaL<-|MnG>IQK(;yVGud38rRid83{6pJOnb_^7EhB8Zb5F_-DsMpYtYYnI2RGo%f zcNQJrU3BC%%$^7eSWS#LT0yyvju8|qBhJ)$mkR4|8j-x@x2ss^q2P0L|2qXp}F|zF3g(w;cIMu1I z#DtmygbgscL%$qiF$izH8*9dDSykg_J4$&rR#Z)t7D>w*TkbBG5@M}OmMTN{8K0rP z8C_m(SrxFB;k;w5zc3ffdef8U3YGI{3g38Yx|Rd-ikUXBE}N@n!L{R)HtYybpx44T z<)a~28;)GUKQ6PmA*gBB$tq?};Ahqutlq|}zC~l;cSOu>HpMOd%>DU8bDtf0+{I1i zJ$YOEQ}3C>y**#99p7*cIbHFXZj)`?%-@g=@*Tm7>X89&<=`)yXNeA5s!%*(Tm(_V zVrrtJAyc8fN0=SI3Rq9FTBY{>egHJIs5z>K)}6tcJunphtkqWnsR90JVDGNQY)^bJ z_?Vsvym`zDv(9>i77n7DYnO;DPqbFlOkO}vQ5%#N3g4(s;Y(cPg$H>ls-v7U4e5kw z9zk|=)0c1HGH;eCzVkKT&zwu>b%7 literal 0 HcmV?d00001 diff --git a/api/cloud_cache/cloud_cache.py b/api/cloud_cache/cloud_cache.py new file mode 100644 index 0000000000..207ec81c90 --- /dev/null +++ b/api/cloud_cache/cloud_cache.py @@ -0,0 +1,1301 @@ +from typing import List, Tuple, Dict, Optional, Union +from abc import ABC, abstractmethod +from pathlib import Path +import os +import pathlib +import pandas as pd +import boto3 +import semver +import tqdm +import re +import json +import warnings +from botocore import UNSIGNED +from botocore.client import Config +from allensdk.internal.core.lims_utilities import safe_system_path +from allensdk.api.cloud_cache.manifest import Manifest +from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes +from allensdk.api.cloud_cache.utils import file_hash_from_path +from allensdk.api.cloud_cache.utils import bucket_name_from_url +from allensdk.api.cloud_cache.utils import relative_path_from_url + + +class OutdatedManifestWarning(UserWarning): + pass + + +class MissingLocalManifestWarning(UserWarning): + pass + + +class BasicLocalCache(ABC): + """ + A class to handle the loading and accessing a project's data and + metadata from a local cache directory. Does NOT include any 'smart' + features like: + 1. Keeping track of last loaded manifest + 2. Constructing symlinks for valid data from previous dataset versions + 3. Warning of outdated manifests + + For those features (and more) see the CloudCacheBase class + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data and metadata are stored on the + local system + + project_name: str + the name of the project this cache is supposed to access. This will + be the root directory for all files stored in the bucket. + + ui_class_name: Optional[str] + Name of the class users are actually using to manipulate this + functionality (used to populate helpful error messages) + """ + + def __init__( + self, + cache_dir: Union[str, Path], + project_name: str, + ui_class_name: Optional[str] = None + ): + os.makedirs(cache_dir, exist_ok=True) + + # the class users are actually interacting with + # (for warning message purposes) + if ui_class_name is None: + self._user_interface_class = type(self).__name__ + else: + self._user_interface_class = ui_class_name + + self._manifest = None + self._manifest_name = None + + self._cache_dir = cache_dir + self._project_name = project_name + + self._manifest_file_names = self._list_all_manifests() + + # ====================== BasicLocalCache properties ======================= + + @property + def ui(self): + return self._user_interface_class + + @property + def current_manifest(self) -> Union[None, str]: + """The name of the currently loaded manifest""" + return self._manifest_name + + @property + def project_name(self) -> str: + """The name of the project that this cache is accessing""" + return self._project_name + + @property + def manifest_prefix(self) -> str: + """On-line prefix for manifest files""" + return f'{self.project_name}/manifests/' + + @property + def file_id_column(self) -> str: + """The col name in metadata files used to uniquely identify data files + """ + return self._manifest.file_id_column + + @property + def version(self) -> str: + """The version of the dataset currently loaded""" + return self._manifest.version + + @property + def metadata_file_names(self) -> list: + """List of metadata file names associated with this dataset""" + return self._manifest.metadata_file_names + + @property + def manifest_file_names(self) -> list: + """Sorted list of manifest file names associated with this dataset + """ + return self._manifest_file_names + + @property + def latest_manifest_file(self) -> str: + """parses on-line available manifest files for semver string + and returns the latest one + self.manifest_file_names are assumed to be of the form + '_v.json' + + Returns + ------- + str + the filename whose semver string is the latest one + """ + return self._find_latest_file(self.manifest_file_names) + + # ====================== BasicLocalCache methods ========================== + + @abstractmethod + def _list_all_manifests(self) -> list: + """ + Return a list of all of the file names of the manifests associated + with this dataset + """ + raise NotImplementedError() + + def list_all_downloaded_manifests(self) -> list: + """ + Return a list of all of the manifest files that have been + downloaded for this dataset + """ + output = [x for x in os.listdir(self._cache_dir) + if re.fullmatch(".*_manifest_v.*.json", x)] + output.sort() + return output + + def _find_latest_file(self, file_name_list: List[str]) -> str: + """ + Take a list of files named like + + {blob}_v{version}.json + + and return the one with the latest version + """ + vstrs = [s.split(".json")[0].split("_v")[-1] + for s in file_name_list] + versions = [semver.VersionInfo.parse(v) for v in vstrs] + imax = versions.index(max(versions)) + return file_name_list[imax] + + def _load_manifest( + self, + manifest_name: str, + use_static_project_dir: bool = False + ) -> Manifest: + """ + Load and return a manifest from this dataset. + + Parameters + ---------- + manifest_name: str + The name of the manifest to load. Must be an element in + self.manifest_file_names + use_static_project_dir: bool + When determining what the local path of a remote resource + (data or metadata file) should be, the Manifest class will + typically create a versioned project subdirectory under the user + provided `cache_dir` + (e.g. f"{cache_dir}/{project_name}-{manifest_version}") + to allow the possibility of multiple manifest (and data) versions + to be used. In certain cases, like when using a project's s3 bucket + directly as the cache_dir, the project directory name needs to be + static (e.g. f"{cache_dir}/{project_name}"). When set to True, + the Manifest class will use a static project directory to determine + local paths for remote resources. Defaults to False. + + Returns + ------- + Manifest + """ + if manifest_name not in self.manifest_file_names: + raise ValueError( + f"Manifest to load ({manifest_name}) is not one of the " + "valid manifest names for this dataset. Valid names include:\n" + f"{self.manifest_file_names}" + ) + + if use_static_project_dir: + manifest_path = os.path.join( + self._cache_dir, self.project_name, "manifests", manifest_name + ) + else: + manifest_path = os.path.join(self._cache_dir, manifest_name) + + with open(manifest_path, "r") as f: + local_manifest = Manifest( + cache_dir=self._cache_dir, + json_input=f, + use_static_project_dir=use_static_project_dir + ) + + return local_manifest + + def load_manifest(self, manifest_name: str): + """ + Load a manifest from this dataset. + + Parameters + ---------- + manifest_name: str + The name of the manifest to load. Must be an element in + self.manifest_file_names + """ + self._manifest = self._load_manifest(manifest_name) + self._manifest_name = manifest_name + + def _file_exists(self, file_attributes: CacheFileAttributes) -> bool: + """ + Given a CacheFileAttributes describing a file, assess whether or + not that file exists locally. + + Parameters + ---------- + file_attributes: CacheFileAttributes + Description of the file to look for + + Returns + ------- + bool + True if the file exists and is valid; False otherwise + + Raises + ----- + RuntimeError + If file_attributes.local_path exists but is not a file. + It would be unclear how the cache should proceed in this case. + """ + file_exists = False + + if file_attributes.local_path.exists(): + if not file_attributes.local_path.is_file(): + raise RuntimeError(f"{file_attributes.local_path}\n" + "exists, but is not a file;\n" + "unsure how to proceed") + + file_exists = True + + return file_exists + + def metadata_path(self, fname: str) -> dict: + """ + Return the local path to a metadata file, and test for the + file's existence + + Parameters + ---------- + fname: str + The name of the metadata file to be accessed + + Returns + ------- + dict + + 'path' will be a pathlib.Path pointing to the file's location + + 'exists' will be a boolean indicating if the file + exists in a valid state + + 'file_attributes' is a CacheFileAttributes describing the file + in more detail + + Raises + ------ + RuntimeError + If the file cannot be downloaded + """ + file_attributes = self._manifest.metadata_file_attributes(fname) + exists = self._file_exists(file_attributes) + local_path = file_attributes.local_path + output = {'local_path': local_path, + 'exists': exists, + 'file_attributes': file_attributes} + + return output + + def data_path(self, file_id) -> dict: + """ + Return the local path to a data file, and test for the + file's existence + + Parameters + ---------- + file_id: + The unique identifier of the file to be accessed + + Returns + ------- + dict + + 'local_path' will be a pathlib.Path pointing to the file's location + + 'exists' will be a boolean indicating if the file + exists in a valid state + + 'file_attributes' is a CacheFileAttributes describing the file + in more detail + + Raises + ------ + RuntimeError + If the file cannot be downloaded + """ + file_attributes = self._manifest.data_file_attributes(file_id) + exists = self._file_exists(file_attributes) + local_path = file_attributes.local_path + output = {'local_path': local_path, + 'exists': exists, + 'file_attributes': file_attributes} + + return output + + +class CloudCacheBase(BasicLocalCache): + """ + A class to handle the downloading and accessing of data served from a cloud + storage system + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + project_name: str + the name of the project this cache is supposed to access. This will + be the root directory for all files stored in the bucket. + + ui_class_name: Optional[str] + Name of the class users are actually using to manipulate this + functionality (used to populate helpful error messages) + """ + + _bucket_name = None + + def __init__(self, cache_dir, project_name, ui_class_name=None): + super().__init__(cache_dir=cache_dir, project_name=project_name, + ui_class_name=ui_class_name) + + # what latest_manifest was the last time an OutdatedManifestWarning + # was emitted + self._manifest_last_warned_on = None + + c_path = pathlib.Path(self._cache_dir) + + # self._manifest_last_used contains the name of the manifest + # last loaded from this cache dir (if applicable) + self._manifest_last_used = c_path / '_manifest_last_used.txt' + + # self._downloaded_data_path is where we will keep a JSONized + # dict mapping paths to downloaded files to their file_hashes; + # this will be used when determining if a downloaded file + # can instead be a symlink + self._downloaded_data_path = c_path / '_downloaded_data.json' + + # if the local manifest is missing but there are + # data files in cache_dir, emit a warning + # suggesting that the user run + # self.construct_local_manifest + if not self._downloaded_data_path.exists(): + file_list = c_path.glob('**/*') + has_files = False + for fname in file_list: + if fname.is_file(): + if 'json' not in fname.name: + has_files = True + break + if has_files: + msg = 'This cache directory appears to ' + msg += 'contain data files, but it has no ' + msg += 'record of what those files are. ' + msg += 'You might want to consider running\n\n' + msg += f'{self.ui}.construct_local_manifest()\n\n' + msg += 'to avoid needlessly downloading duplicates ' + msg += 'of data files that did not change between ' + msg += 'data releases. NOTE: running this method ' + msg += 'will require hashing every data file you ' + msg += 'have currently downloaded and could be ' + msg += 'very time consuming.\n\n' + msg += 'To avoid this warning in the future, make ' + msg += 'sure that\n\n' + msg += f'{str(self._downloaded_data_path.resolve())}\n\n' + msg += 'is not deleted between instantiations of this ' + msg += 'cache' + warnings.warn(msg, MissingLocalManifestWarning) + + def construct_local_manifest(self) -> None: + """ + Construct the dict that maps between file_hash and + absolute local path. Save it to self._downloaded_data_path + """ + lookup = {} + files_to_hash = set() + c_dir = pathlib.Path(self._cache_dir) + file_iterator = c_dir.glob('**/*') + for file_name in file_iterator: + if file_name.is_file(): + if 'json' not in file_name.name: + if file_name != self._manifest_last_used: + files_to_hash.add(file_name.resolve()) + + with tqdm.tqdm(files_to_hash, + total=len(files_to_hash), + unit='(files hashed)') as pbar: + + for local_path in pbar: + hsh = file_hash_from_path(local_path) + lookup[str(local_path.absolute())] = hsh + + with open(self._downloaded_data_path, 'w') as out_file: + out_file.write(json.dumps(lookup, indent=2, sort_keys=True)) + + def _warn_of_outdated_manifest(self, manifest_name: str) -> None: + """ + Warn that manifest_name is not the latest manifest available + """ + if self._manifest_last_warned_on is not None: + if self.latest_manifest_file == self._manifest_last_warned_on: + return None + + self._manifest_last_warned_on = self.latest_manifest_file + + msg = '\n\n' + msg += 'The manifest file you are loading is not the ' + msg += 'most up to date manifest file available for ' + msg += 'this dataset. The most up to data manifest file ' + msg += 'available for this dataset is \n\n' + msg += f'{self.latest_manifest_file}\n\n' + msg += 'To see the differences between these manifests,' + msg += 'run\n\n' + msg += f"{self.ui}.compare_manifests('{manifest_name}', " + msg += f"'{self.latest_manifest_file}')\n\n" + msg += "To see all of the manifest files currently downloaded " + msg += "onto your local system, run\n\n" + msg += "self.list_all_downloaded_manifests()\n\n" + msg += "If you just want to load the latest manifest, run\n\n" + msg += "self.load_latest_manifest()\n\n" + warnings.warn(msg, OutdatedManifestWarning) + return None + + @property + def latest_downloaded_manifest_file(self) -> str: + """parses downloaded available manifest files for semver string + and returns the latest one + self.manifest_file_names are assumed to be of the form + '_v.json' + + Returns + ------- + str + the filename whose semver string is the latest one + """ + file_list = self.list_all_downloaded_manifests() + if len(file_list) == 0: + return '' + return self._find_latest_file(self.list_all_downloaded_manifests()) + + def load_last_manifest(self): + """ + If this Cache was used previously, load the last manifest + used in this cache. If this cache has never been used, load + the latest manifest. + """ + if not self._manifest_last_used.exists(): + self.load_latest_manifest() + return None + + with open(self._manifest_last_used, 'r') as in_file: + to_load = in_file.read() + + latest = self.latest_manifest_file + + if to_load not in self.manifest_file_names: + msg = 'The manifest version recorded as last used ' + msg += f'for this cache -- {to_load}-- ' + msg += 'is not a valid manifest for this dataset. ' + msg += f'Loading latest version -- {latest} -- ' + msg += 'instead.' + warnings.warn(msg, UserWarning) + self.load_latest_manifest() + return None + + if latest != to_load: + self._manifest_last_warned_on = self.latest_manifest_file + msg = f"You are loading {to_load}. A more up to date " + msg += f"version of the dataset -- {latest} -- exists " + msg += "online. To see the changes between the two " + msg += "versions of the dataset, run\n" + msg += f"{self.ui}.compare_manifests('{to_load}'," + msg += f" '{latest}')\n" + msg += "To load another version of the dataset, run\n" + msg += f"{self.ui}.load_manifest('{latest}')" + warnings.warn(msg, OutdatedManifestWarning) + self.load_manifest(to_load) + return None + + def load_latest_manifest(self): + latest_downloaded = self.latest_downloaded_manifest_file + latest = self.latest_manifest_file + if latest != latest_downloaded: + if latest_downloaded != '': + msg = f'You are loading\n{self.latest_manifest_file}\n' + msg += 'which is newer than the most recent manifest ' + msg += 'file you have previously been working with\n' + msg += f'{latest_downloaded}\n' + msg += 'It is possible that some data files have changed ' + msg += 'between these two data releases, which will ' + msg += 'force you to re-download those data files ' + msg += '(currently downloaded files will not be overwritten).' + msg += f' To continue using {latest_downloaded}, run\n' + msg += f"{self.ui}.load_manifest('{latest_downloaded}')" + warnings.warn(msg, OutdatedManifestWarning) + self.load_manifest(self.latest_manifest_file) + + @abstractmethod + def _download_manifest(self, + manifest_name: str): + """ + Download a manifest from the dataset + + Parameters + ---------- + manifest_name: str + The name of the manifest to load. Must be an element in + self.manifest_file_names + """ + raise NotImplementedError() + + @abstractmethod + def _download_file(self, file_attributes: CacheFileAttributes) -> bool: + """ + Check if a file exists locally. If it does not, download it and + return True. Return False otherwise. + + Parameters + ---------- + file_attributes: CacheFileAttributes + Describes the file to download + + Returns + ------- + bool + True if the file was downloaded; False otherwise + + Raises + ------ + RuntimeError + If the path to the directory where the file is to be saved + points to something that is not a directory. + + RuntimeError + If it is not able to successfully download the file after + 10 iterations + """ + raise NotImplementedError() + + def load_manifest(self, manifest_name: str): + """ + Load a manifest from this dataset. + + Parameters + ---------- + manifest_name: str + The name of the manifest to load. Must be an element in + self.manifest_file_names + """ + if manifest_name not in self.manifest_file_names: + raise ValueError( + f"Manifest to load ({manifest_name}) is not one of the " + "valid manifest names for this dataset. Valid names include:\n" + f"{self.manifest_file_names}" + ) + + if manifest_name != self.latest_manifest_file: + self._warn_of_outdated_manifest(manifest_name) + + # If desired manifest does not exist, try to download it + manifest_path = os.path.join(self._cache_dir, manifest_name) + if not os.path.exists(manifest_path): + self._download_manifest(manifest_name) + + self._manifest = self._load_manifest(manifest_name) + + # Keep track of the newly loaded manifest + with open(self._manifest_last_used, 'w') as out_file: + out_file.write(manifest_name) + + self._manifest_name = manifest_name + + def _update_list_of_downloads(self, + file_attributes: CacheFileAttributes + ) -> None: + """ + Update the local file that keeps track of files that have actually + been downloaded to reflect a newly downloaded file. + + Parameters + ---------- + file_attributes: CacheFileAttributes + + Returns + ------- + None + """ + if not file_attributes.local_path.exists(): + # This file does not exist; there is nothing to do + return None + + if self._downloaded_data_path.exists(): + with open(self._downloaded_data_path, 'rb') as in_file: + downloaded_data = json.load(in_file) + else: + downloaded_data = {} + + abs_path = str(file_attributes.local_path.resolve()) + if abs_path in downloaded_data: + if downloaded_data[abs_path] == file_attributes.file_hash: + # this file has already been logged; + # there is nothing to do + return None + + downloaded_data[abs_path] = file_attributes.file_hash + with open(self._downloaded_data_path, 'w') as out_file: + out_file.write(json.dumps(downloaded_data, + indent=2, + sort_keys=True)) + return None + + def _check_for_identical_copy(self, + file_attributes: CacheFileAttributes + ) -> bool: + """ + Check the manifest of files that have been locally downloaded to + see if a file with an identical hash to the requested file has already + been downloaded. If it has, create a symlink to the downloaded file + at the requested file's localpath, update the manifest of downloaded + files, and return True. + + Else return False + + Parameters + ---------- + file_attributes: CacheFileAttributes + The file we are considering downloading + + Returns + ------- + bool + """ + if not self._downloaded_data_path.exists(): + return False + + with open(self._downloaded_data_path, 'rb') as in_file: + available_files = json.load(in_file) + + matched_path = None + for abs_path in available_files: + if available_files[abs_path] == file_attributes.file_hash: + matched_path = pathlib.Path(abs_path) + + # check that the file still exists, + # in case someone accidentally deleted + # the file at the root of a symlink + if matched_path.is_file(): + break + else: + matched_path = None + + if matched_path is None: + return False + + local_parent = file_attributes.local_path.parent.resolve() + if not local_parent.exists(): + os.makedirs(local_parent) + + file_attributes.local_path.symlink_to(matched_path.resolve()) + return True + + def _file_exists(self, file_attributes: CacheFileAttributes) -> bool: + """ + Given a CacheFileAttributes describing a file, assess whether or + not that file exists locally and is valid (i.e. has the expected + file hash) + + Parameters + ---------- + file_attributes: CacheFileAttributes + Description of the file to look for + + Returns + ------- + bool + True if the file exists and is valid; False otherwise + + Raises + ----- + RuntimeError + If file_attributes.local_path exists but is not a file. + It would be unclear how the cache should proceed in this case. + """ + file_exists = False + + if file_attributes.local_path.exists(): + if not file_attributes.local_path.is_file(): + raise RuntimeError(f"{file_attributes.local_path}\n" + "exists, but is not a file;\n" + "unsure how to proceed") + + file_exists = True + + if not file_exists: + file_exists = self._check_for_identical_copy(file_attributes) + + return file_exists + + def download_data(self, file_id) -> pathlib.Path: + """ + Return the local path to a data file, downloading the file + if necessary + + Parameters + ---------- + file_id: + The unique identifier of the file to be accessed + + Returns + ------- + pathlib.Path + The path indicating where the file is stored on the + local system + + Raises + ------ + RuntimeError + If the file cannot be downloaded + """ + super_attributes = self.data_path(file_id) + file_attributes = super_attributes['file_attributes'] + was_downloaded = self._download_file(file_attributes) + if was_downloaded: + self._update_list_of_downloads(file_attributes) + return file_attributes.local_path + + def download_metadata(self, fname: str) -> pathlib.Path: + """ + Return the local path to a metadata file, downloading the + file if necessary + + Parameters + ---------- + fname: str + The name of the metadata file to be accessed + + Returns + ------- + pathlib.Path + The path indicating where the file is stored on the + local system + + Raises + ------ + RuntimeError + If the file cannot be downloaded + """ + super_attributes = self.metadata_path(fname) + file_attributes = super_attributes['file_attributes'] + was_downloaded = self._download_file(file_attributes) + if was_downloaded: + self._update_list_of_downloads(file_attributes) + return file_attributes.local_path + + def get_metadata(self, fname: str) -> pd.DataFrame: + """ + Return a pandas DataFrame of metadata + + Parameters + ---------- + fname: str + The name of the metadata file to load + + Returns + ------- + pd.DataFrame + + Notes + ----- + This method will check to see if the specified metadata file exists + locally. If it does not, the method will download the file. Use + self.metadata_path() to find where the file is stored + """ + local_path = self.download_metadata(fname) + return pd.read_csv(local_path) + + def _detect_changes(self, + filename_to_hash: dict) -> List[Tuple[str, str]]: + """ + Assemble list of changes between two manifests + + Parameters + ---------- + filename_to_hash: dict + filename_to_hash[0] is a dict mapping file names to file hashes + for manifest 0 + + filename_to_hash[1] is a dict mapping file names to file hashes + for manifest 1 + + Returns + ------- + List[Tuple[str, str]] + List of changes between manifest 0 and manifest 1. + + Notes + ----- + Changes are tuples of the form + (fname, string describing how fname changed) + + e.g. + + ('data/f1.txt', 'data/f1.txt renamed data/f5.txt') + ('data/f2.txt', 'data/f2.txt deleted') + ('data/f3.txt', 'data/f3.txt created') + ('data/f4.txt', 'data/f4.txt changed') + """ + output = [] + n0 = set(filename_to_hash[0].keys()) + n1 = set(filename_to_hash[1].keys()) + all_file_names = n0.union(n1) + + hash_to_filename: dict = dict() + for v in (0, 1): + hash_to_filename[v] = {} + for fname in filename_to_hash[v]: + hash_to_filename[v][filename_to_hash[v][fname]] = fname + + for fname in all_file_names: + delta = None + if fname in filename_to_hash[0] and fname in filename_to_hash[1]: + h0 = filename_to_hash[0][fname] + h1 = filename_to_hash[1][fname] + if h0 != h1: + delta = f'{fname} changed' + elif fname in filename_to_hash[0]: + h0 = filename_to_hash[0][fname] + if h0 in hash_to_filename[1]: + f1 = hash_to_filename[1][h0] + delta = f'{fname} renamed {f1}' + else: + delta = f'{fname} deleted' + elif fname in filename_to_hash[1]: + h1 = filename_to_hash[1][fname] + if h1 not in hash_to_filename[0]: + delta = f'{fname} created' + else: + raise RuntimeError("should never reach this line") + + if delta is not None: + output.append((fname, delta)) + + return output + + def summarize_comparison(self, + manifest_0_name: str, + manifest_1_name: str + ) -> Dict[str, List[Tuple[str, str]]]: + """ + Compare two manifests from this dataset. Return a dict + containing the list of metadata and data files that changed + between them + + Note: this assumes that manifest_0 predates manifest_1 (i.e. + changes are listed relative to manifest_0) + + Parameters + ---------- + manifest_0_name: str + + manifest_1_name: str + + Returns + ------- + result: Dict[List[Tuple[str, str]]] + result['data_changes'] lists changes to data files + result['metadata_changes'] lists changes to metadata files + + Notes + ----- + Changes are tuples of the form + (fname, string describing how fname changed) + + e.g. + + ('data/f1.txt', 'data/f1.txt renamed data/f5.txt') + ('data/f2.txt', 'data/f2.txt deleted') + ('data/f3.txt', 'data/f3.txt created') + ('data/f4.txt', 'data/f4.txt changed') + """ + for manifest_name in [manifest_0_name, manifest_1_name]: + manifest_path = os.path.join(self._cache_dir, manifest_name) + if not os.path.exists(manifest_path): + self._download_manifest(manifest_name) + + man0 = self._load_manifest(manifest_0_name) + man1 = self._load_manifest(manifest_1_name) + + result: dict = dict() + for (result_key, + file_id_list, + attr_lookup) in zip(('metadata_changes', 'data_changes'), + ((man0.metadata_file_names, + man1.metadata_file_names), + (man0.file_id_values, + man1.file_id_values)), + ((man0.metadata_file_attributes, + man1.metadata_file_attributes), + (man0.data_file_attributes, + man1.data_file_attributes))): + + filename_to_hash: dict = dict() + for version in (0, 1): + filename_to_hash[version] = {} + for file_id in file_id_list[version]: + obj = attr_lookup[version](file_id) + file_name = relative_path_from_url(obj.url) + file_name = '/'.join(file_name.split('/')[1:]) + filename_to_hash[version][file_name] = obj.file_hash + changes = self._detect_changes(filename_to_hash) + result[result_key] = changes + return result + + def compare_manifests(self, + manifest_0_name: str, + manifest_1_name: str + ) -> str: + """ + Compare two manifests from this dataset. Return a dict + containing the list of metadata and data files that changed + between them + + Note: this assumes that manifest_0 predates manifest_1 + + Parameters + ---------- + manifest_0_name: str + + manifest_1_name: str + + Returns + ------- + str + A string summarizing all of the changes going from + manifest_0 to manifest_1 + """ + + changes = self.summarize_comparison(manifest_0_name, + manifest_1_name) + if len(changes['data_changes']) == 0: + if len(changes['metadata_changes']) == 0: + return "The two manifests are equivalent" + + data_change_dict = {} + for delta in changes['data_changes']: + data_change_dict[delta[0]] = delta[1] + metadata_change_dict = {} + for delta in changes['metadata_changes']: + metadata_change_dict[delta[0]] = delta[1] + + msg = 'Changes going from\n' + msg += f'{manifest_0_name}\n' + msg += 'to\n' + msg += f'{manifest_1_name}\n\n' + + m_keys = list(metadata_change_dict.keys()) + m_keys.sort() + for m in m_keys: + msg += f'{metadata_change_dict[m]}\n' + d_keys = list(data_change_dict.keys()) + d_keys.sort() + for d in d_keys: + msg += f'{data_change_dict[d]}\n' + return msg + + +class S3CloudCache(CloudCacheBase): + """ + A class to handle the downloading and accessing of data served from + an S3-based storage system + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + bucket_name: str + for example, if bucket URI is 's3://mybucket' this value should be + 'mybucket' + + project_name: str + the name of the project this cache is supposed to access. This will + be the root directory for all files stored in the bucket. + + ui_class_name: Optional[str] + Name of the class users are actually using to maniuplate this + functionality (used to populate helpful error messages) + """ + + def __init__(self, cache_dir, bucket_name, project_name, + ui_class_name=None): + self._manifest = None + self._bucket_name = bucket_name + + super().__init__(cache_dir=cache_dir, project_name=project_name, + ui_class_name=ui_class_name) + + _s3_client = None + + @property + def s3_client(self): + if self._s3_client is None: + s3_config = Config(signature_version=UNSIGNED) + self._s3_client = boto3.client('s3', + config=s3_config) + return self._s3_client + + def _list_all_manifests(self) -> list: + """ + Return a list of all of the file names of the manifests associated + with this dataset + """ + paginator = self.s3_client.get_paginator('list_objects_v2') + subset_iterator = paginator.paginate( + Bucket=self._bucket_name, + Prefix=self.manifest_prefix + ) + + output = [] + for subset in subset_iterator: + if 'Contents' in subset: + for obj in subset['Contents']: + output.append(pathlib.Path(obj['Key']).name) + + output.sort() + return output + + def _download_manifest(self, + manifest_name: str): + """ + Download a manifest from the dataset + + Parameters + ---------- + manifest_name: str + The name of the manifest to load. Must be an element in + self.manifest_file_names + """ + + manifest_key = self.manifest_prefix + manifest_name + response = self.s3_client.get_object(Bucket=self._bucket_name, + Key=manifest_key) + + filepath = os.path.join(self._cache_dir, manifest_name) + + with open(filepath, 'wb') as f: + for chunk in response['Body'].iter_chunks(): + f.write(chunk) + + def _download_file(self, file_attributes: CacheFileAttributes) -> bool: + """ + Check if a file exists locally. If it does not, download it + and return True. Return False otherwise. + + Parameters + ---------- + file_attributes: CacheFileAttributes + Describes the file to download + + Returns + ------- + bool + True if the file was downloaded; False otherwise + + Raises + ------ + RuntimeError + If the path to the directory where the file is to be saved + points to something that is not a directory. + + RuntimeError + If it is not able to successfully download the file after + 10 iterations + """ + was_downloaded = False + + local_path = file_attributes.local_path + + local_dir = pathlib.Path(safe_system_path(str(local_path.parents[0]))) + + # make sure Windows references to Allen Institute + # local networked file system get handled correctly + local_path = pathlib.Path(safe_system_path(str(local_path))) + + # using os here rather than pathlib because safe_system_path + # returns a str + os.makedirs(local_dir, exist_ok=True) + if not os.path.isdir(local_dir): + raise RuntimeError(f"{local_dir}\n" + "is not a directory") + + bucket_name = bucket_name_from_url(file_attributes.url) + obj_key = relative_path_from_url(file_attributes.url) + + n_iter = 0 + max_iter = 10 # maximum number of times to try download + + version_id = file_attributes.version_id + + pbar = None + if not self._file_exists(file_attributes): + response = self.s3_client.list_object_versions(Bucket=bucket_name, + Prefix=str(obj_key)) + object_info = [i for i in response["Versions"] + if i["VersionId"] == version_id][0] + pbar = tqdm.tqdm(desc=object_info["Key"].split("/")[-1], + total=object_info["Size"], + unit_scale=True, + unit_divisor=1000., + unit="MB") + + while not self._file_exists(file_attributes): + was_downloaded = True + response = self.s3_client.get_object(Bucket=bucket_name, + Key=str(obj_key), + VersionId=version_id) + + if 'Body' in response: + with open(local_path, 'wb') as out_file: + for chunk in response['Body'].iter_chunks(): + out_file.write(chunk) + pbar.update(len(chunk)) + + # Verify the hash of the downloaded file + full_path = file_attributes.local_path.resolve() + test_checksum = file_hash_from_path(full_path) + if test_checksum != file_attributes.file_hash: + file_attributes.local_path.exists() + file_attributes.local_path.unlink() + + n_iter += 1 + if n_iter > max_iter: + pbar.close() + raise RuntimeError("Could not download\n" + f"{file_attributes}\n" + "In {max_iter} iterations") + if pbar is not None: + pbar.close() + + return was_downloaded + + +class LocalCache(CloudCacheBase): + """A class to handle accessing of data that has already been downloaded + locally. Supports multiple manifest versions from a given dataset. + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + project_name: str + the name of the project this cache is supposed to access. This will + be the root directory for all files stored in the bucket. + + ui_class_name: Optional[str] + Name of the class users are actually using to maniuplate this + functionality (used to populate helpful error messages) + """ + def __init__(self, cache_dir, project_name, ui_class_name=None): + super().__init__(cache_dir=cache_dir, project_name=project_name, + ui_class_name=ui_class_name) + + def _list_all_manifests(self) -> list: + return self.list_all_downloaded_manifests() + + def _download_manifest(self, manifest_name: str): + raise NotImplementedError() + + def _download_file(self, file_attributes: CacheFileAttributes) -> bool: + raise NotImplementedError() + + +class StaticLocalCache(BasicLocalCache): + """A class to handle accessing data that has already been downloaded + locally and whose directory structure and/or contained files are not + expected to be changed in any way. Does NOT support multiple manifest + versions for a given dataset. + + Example intended use case: + Calling + VisualBehaviorOphysProjectCache.from_local_cache(use_static_cache=True) + where the cache directory is a mounted S3 public bucket. + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + project_name: str + the name of the project this cache is supposed to access. This will + be the root directory for all files stored in the bucket. + + ui_class_name: Optional[str] + Name of the class users are actually using to maniuplate this + functionality (used to populate helpful error messages) + """ + + def __init__(self, cache_dir, project_name, ui_class_name=None): + super().__init__(cache_dir=cache_dir, project_name=project_name, + ui_class_name=ui_class_name) + + def _list_all_manifests(self) -> list: + """ + Return a list of all of the file names of the manifests associated + with this dataset. For the StaticLocalCache only return only the + latest manifest. + """ + manifest_dir = os.path.join( + self._cache_dir, self.project_name, "manifests" + ) + if not os.path.exists(manifest_dir): + raise RuntimeError( + f"Expected the provided cache_dir ({self._cache_dir})" + "to have the following subfolders but it did not: " + f"{self.project_name}/manifests" + ) + + output = [x for x in os.listdir(manifest_dir) + if re.fullmatch(".*_manifest_v.*.json", x)] + + return [self._find_latest_file(output)] + + def list_all_downloaded_manifests(self) -> list: + """ + Return a list of all of the manifest files for this dataset. + For the StaticLocalCache, this will only be the latest manifest. + """ + return self._list_all_manifests() + + def load_last_manifest(self): + """For the StaticLocalCache always load the latest manifest.""" + self.load_manifest(self.latest_manifest_file) + + def load_manifest(self, manifest_name: str): + """ + Load a manifest from this dataset. + + Parameters + ---------- + manifest_name: str + The name of the manifest to load. Must be an element in + self.manifest_file_names + """ + self._manifest = self._load_manifest( + manifest_name, + use_static_project_dir=True + ) + self._manifest_name = manifest_name + + def compare_manifests(self, manifest_0_name: str, manifest_1_name: str): + raise RuntimeError( + "The ability to load many manifest versions and use the " + "`compare_manifests()` method is not available for the " + "StaticLocalCache class!" + ) diff --git a/api/cloud_cache/file_attributes.py b/api/cloud_cache/file_attributes.py new file mode 100644 index 0000000000..682ceb457d --- /dev/null +++ b/api/cloud_cache/file_attributes.py @@ -0,0 +1,69 @@ +import json +import pathlib + + +class CacheFileAttributes(object): + """ + This class will contain the attributes of a remotely stored file + so that they can easily and consistently be passed around between + the methods making up the remote file cache and manifest classes + + Parameters + ---------- + url: str + The full URL of the remote file + version_id: str + A string specifying the version of the file (probably calculated + by S3) + file_hash: str + The (hexadecimal) file hash of the file + local_path: pathlib.Path + The path to the location where the file's local copy should be stored + (probably computed by the Manifest class) + """ + + def __init__(self, + url: str, + version_id: str, + file_hash: str, + local_path: pathlib.Path): + + if not isinstance(url, str): + raise ValueError(f"url must be str; got {type(url)}") + if not isinstance(version_id, str): + raise ValueError(f"version_id must be str; got {type(version_id)}") + if not isinstance(file_hash, str): + raise ValueError(f"file_hash must be str; " + f"got {type(file_hash)}") + if not isinstance(local_path, pathlib.Path): + raise ValueError(f"local_path must be pathlib.Path; " + f"got {type(local_path)}") + + self._url = url + self._version_id = version_id + self._file_hash = file_hash + self._local_path = local_path + + @property + def url(self) -> str: + return self._url + + @property + def version_id(self) -> str: + return self._version_id + + @property + def file_hash(self) -> str: + return self._file_hash + + @property + def local_path(self) -> pathlib.Path: + return self._local_path + + def __str__(self): + output = {'url': self.url, + 'version_id': self.version_id, + 'file_hash': self.file_hash, + 'local_path': str(self.local_path)} + output = json.dumps(output, indent=2, sort_keys=True) + return f'CacheFileParameters{output}' diff --git a/api/cloud_cache/manifest.py b/api/cloud_cache/manifest.py new file mode 100644 index 0000000000..6e3160d203 --- /dev/null +++ b/api/cloud_cache/manifest.py @@ -0,0 +1,240 @@ +from typing import Dict, List, Any +import json +import pathlib +from typing import Union +from allensdk.api.cloud_cache.utils import relative_path_from_url # noqa: E501 +from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 + + +class Manifest(object): + """ + A class for loading and manipulating the online manifest.json associated + with a dataset release + + Each Manifest instance should represent the data for 1 and only 1 + manifest.json file. + + Parameters + ---------- + cache_dir: str or pathlib.Path + The path to the directory where local copies of files will be stored + json_input: + A ''.read()''-supporting file-like object containing + a JSON document to be deserialized (i.e. same as the + first argument to json.load) + use_static_project_dir: bool + When determining what the local path of a remote resource + (data or metadata file) should be, the Manifest class will typically + create a versioned project subdirectory under the user provided + `cache_dir` (e.g. f"{cache_dir}/{project_name}-{manifest_version}") + to allow the possibility of multiple manifest (and data) versions to be + used. In certain cases, like when using a project's s3 bucket + directly as the cache_dir, the project directory name needs to be + static (e.g. f"{cache_dir}/{project_name}"). When set to True, + the Manifest class will use a static project directory to determine + local paths for remote resources. Defaults to False. + """ + + def __init__( + self, + cache_dir: Union[str, pathlib.Path], + json_input, + use_static_project_dir: bool = False + ): + if isinstance(cache_dir, str): + self._cache_dir = pathlib.Path(cache_dir).resolve() + elif isinstance(cache_dir, pathlib.Path): + self._cache_dir = cache_dir.resolve() + else: + raise ValueError("cache_dir must be either a str " + "or a pathlib.Path; " + f"got {type(cache_dir)}") + + self._use_static_project_dir = use_static_project_dir + + self._data: Dict[str, Any] = json.load(json_input) + if not isinstance(self._data, dict): + raise ValueError("Expected to deserialize manifest into a dict; " + f"instead got {type(self._data)}") + self._project_name: str = self._data["project_name"] + self._version: str = self._data['manifest_version'] + self._file_id_column: str = self._data['metadata_file_id_column_name'] + self._data_pipeline: str = self._data["data_pipeline"] + + self._metadata_file_names: List[str] = [ + file_name for file_name in self._data['metadata_files'] + ] + self._metadata_file_names.sort() + + self._file_id_values: List[Any] = [ii for ii in + self._data['data_files'].keys()] + self._file_id_values.sort() + + @property + def project_name(self): + """ + The name of the project whose data and metadata files this + manifest tracks. + """ + return self._project_name + + @property + def version(self): + """ + The version of the dataset currently loaded + """ + return self._version + + @property + def file_id_column(self): + """ + The column in the metadata files used to uniquely + identify data files + """ + return self._file_id_column + + @property + def metadata_file_names(self): + """ + List of metadata file names associated with this dataset + """ + return self._metadata_file_names + + @property + def file_id_values(self): + """ + List of valid file_id values + """ + return self._file_id_values + + def _create_file_attributes(self, + remote_path: str, + version_id: str, + file_hash: str) -> CacheFileAttributes: + """ + Create the cache_file_attributes describing a file. + This method does the work of assigning a local_path for a remote file. + + Parameters + ---------- + remote_path: str + The full URL to a file + version_id: str + The string specifying the version of the file + file_hash: str + The (hexadecimal) file hash of the file + + Returns + ------- + CacheFileAttributes + """ + + if self._use_static_project_dir: + # If we only want to support 1 version of the project on disk + # like when mounting the project S3 bucket as a file system + project_dir_name = f"{self._project_name}" + else: + # If we want to support multiple versions of the project on disk + # paths should be built like: + # {cache_dir} / {project_name}-{manifest_version} / relative_path + # Example: + # my_cache_dir/visual-behavior-ophys-1.0.0/behavior_sessions/etc... + project_dir_name = f"{self._project_name}-{self._version}" + + project_dir = self._cache_dir / project_dir_name + + # The convention of the data release tool is to have all + # relative_paths from remote start with the project name which + # we want to remove since we already specified a project_dir_name + relative_path = relative_path_from_url(remote_path) + shaved_rel_path = "/".join(relative_path.split("/")[1:]) + + local_path = project_dir / shaved_rel_path + + obj = CacheFileAttributes( + remote_path, + version_id, + file_hash, + local_path + ) + + return obj + + def metadata_file_attributes( + self, + metadata_file_name: str + ) -> CacheFileAttributes: + """ + Return the CacheFileAttributes associated with a metadata file + + Parameters + ---------- + metadata_file_name: str + Name of the metadata file. Must be in self.metadata_file_names + + Return + ------ + CacheFileAttributes + + Raises + ------ + RuntimeError + If you try to run this method when self._data is None (meaning + you haven't yet loaded a manifest.json) + + ValueError + If the metadata_file_name is not a valid option + """ + if self._data is None: + raise RuntimeError("You cannot retrieve " + "metadata_file_attributes;\n" + "you have not yet loaded a manifest.json file") + + if metadata_file_name not in self._metadata_file_names: + raise ValueError(f"{metadata_file_name}\n" + "is not in self.metadata_file_names:\n" + f"{self._metadata_file_names}") + + file_data = self._data['metadata_files'][metadata_file_name] + return self._create_file_attributes(file_data['url'], + file_data['version_id'], + file_data['file_hash']) + + def data_file_attributes(self, file_id) -> CacheFileAttributes: + """ + Return the CacheFileAttributes associated with a data file + + Parameters + ---------- + file_id: + The identifier of the data file whose attributes are to be + returned. Must be a key in self._data['data_files'] + + Return + ------ + CacheFileAttributes + + Raises + ------ + RuntimeError + If you try to run this method when self._data is None (meaning + you haven't yet loaded a manifest.json file) + + ValueError + If the file_id is not a valid option + """ + if self._data is None: + raise RuntimeError("You cannot retrieve data_file_attributes;\n" + "you have not yet loaded a manifest.json file") + + if file_id not in self._data['data_files']: + valid_keys = list(self._data['data_files'].keys()) + valid_keys.sort() + raise ValueError(f"file_id: {file_id}\n" + "Is not a data file listed in manifest:\n" + f"{valid_keys}") + + file_data = self._data['data_files'][file_id] + return self._create_file_attributes(file_data['url'], + file_data['version_id'], + file_data['file_hash']) diff --git a/api/cloud_cache/utils.py b/api/cloud_cache/utils.py new file mode 100644 index 0000000000..473161c856 --- /dev/null +++ b/api/cloud_cache/utils.py @@ -0,0 +1,89 @@ +from typing import Optional, Union +from pathlib import Path +import warnings +import re +import urllib.parse as url_parse +import hashlib + + +def bucket_name_from_url(url: str) -> Optional[str]: + """ + Read in a URL and return the name of the AWS S3 bucket it points towards. + + Parameters + ---------- + URL: str + A generic URL, suitable for retrieving an S3 object via an + HTTP GET request. + + Returns + ------- + str + An AWS S3 bucket name. Note: if 's3.amazonaws.com' does not occur in + the URL, this method will return None and emit a warning. + + Note + ----- + URLs passed to this method should conform to the "new" scheme as described + here + https://aws.amazon.com/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/ + """ + s3_pattern = re.compile('\.s3[\.,a-z,0-9,\-]*\.amazonaws.com') # noqa: W605, E501 + url_params = url_parse.urlparse(url) + raw_location = url_params.netloc + s3_match = s3_pattern.search(raw_location) + + if s3_match is None: + warnings.warn(f"{s3_pattern} does not occur in url {url}") + return None + + s3_match = raw_location[s3_match.start():s3_match.end()] + return url_params.netloc.replace(s3_match, '') + + +def relative_path_from_url(url: str) -> str: + """ + Read in a url and return the relative path of the object + + Parameters + ---------- + url: str + The url of the object whose path you want + + Returns + ------- + str: + Relative path of the object + + Notes + ----- + This method returns a str rather than a pathlib.Path because + it is used to get the S3 object Key from a URL. If using + Pathlib.path on a Windows system, the '/' will get transformed + into '\', confusing S3. + """ + url_params = url_parse.urlparse(url) + return url_params.path[1:] + + +def file_hash_from_path(file_path: Union[str, Path]) -> str: + """ + Return the hexadecimal file hash for a file + + Parameters + ---------- + file_path: Union[str, Path] + path to a file + + Returns + ------- + str: + The file hash (Blake2b; hexadecimal) of the file + """ + hasher = hashlib.blake2b() + with open(file_path, 'rb') as in_file: + chunk = in_file.read(1000000) + while len(chunk) > 0: + hasher.update(chunk) + chunk = in_file.read(1000000) + return hasher.hexdigest() diff --git a/api/queries/__init__.py b/api/queries/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/api/queries/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/api/queries/__pycache__/__init__.cpython-37.pyc b/api/queries/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01ce98964f367205127caefaac2141f26b27e733 GIT binary patch literal 188 zcmZ?b<>g`kg51T8i8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU#ZSkF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>Kd~TFzpym5C^NNKKR!M)FS8^*Uaz3?7Kcr4eoARhsvXGs I&p^xo082|X4*&oF literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/annotated_section_data_sets_api.cpython-37.pyc b/api/queries/__pycache__/annotated_section_data_sets_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..958376e6b378b5171b4471878d79a7a9bb0a3cd5 GIT binary patch literal 7099 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 yFpr2gL%|}vsg?RCUG0yeuJ+r%)y)U1c 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 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/cell_types_api.cpython-37.pyc b/api/queries/__pycache__/cell_types_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11f5c7415ed955aafb4b47ecea2b3a4a4787cfb3 GIT binary patch literal 12059 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 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/connected_services.cpython-37.pyc b/api/queries/__pycache__/connected_services.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2852d1501f62eb1ede536c9908e72cf27da1f1e GIT binary patch literal 7933 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 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/glif_api.cpython-37.pyc b/api/queries/__pycache__/glif_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5029b41a45fe2a0d077a4bcf6b717987732c746e GIT binary patch literal 6069 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 E26eS^vj6}9 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/grid_data_api.cpython-37.pyc b/api/queries/__pycache__/grid_data_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85a7bc0b086527bb49f7f1f6691aeae0e1bfcb05 GIT binary patch literal 7159 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 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/image_download_api.cpython-37.pyc b/api/queries/__pycache__/image_download_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbea4a542db527936cf6eb88059d24b110bd3f1a GIT binary patch literal 14717 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 IggRONKck5mT>t<8 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/mouse_atlas_api.cpython-37.pyc b/api/queries/__pycache__/mouse_atlas_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf249a0bd96d7933fd146d504bf767365ec8da8a GIT binary patch literal 3855 zcmbtXPj4H?72khcE-8_=BwJ3LrX4tGtwj|YXb%C5qKIOts@sSTL_0v%Di))iA-U52 z>&!ALS-C)A13jhat(P8b^wclW&(QPUik$ova_W1tr| zC~Eg;Fyuuez!yD^_)EQ1T|4A`E_f2~UPc4HlZDWKWnYABm*%wmbTT?nodUE!yXsK* z2p;)w5M1+grg;X_J(C%p#Z0fpEYF5=9X!-{gVmVL>R%e{E!JSoXZlmPz2+-zZ?hG) zI&E9w4r}q%lNN8ETw!f?gU=Ty7JZFcR~e zqC%%h;Bs|=>+k9>&GKcyEBp^2SeP`5T*GscQS6KKOnS{c&1s~{-2m0`vf**y`7JzB zfH()FPaUzIYvyg6DIjKNi+0_MwKEC^{X%fd$4436oHe+RB}eZZ*&a}Npdz!B`4rK=t!K>8I>d$ zf-3>^3@4z!U=bpMLq=hb>2y0}m-i{yC!r*;wq*d|=rBb#3i9vjZJq++a&!#%BIZ+T za$&qzFfOsZfaxL6MtTg0e8k0nw@+-QQF5j5w~Tn%kvi2VjF#ux)Y{=0m`h zlT?s66(zWf)=E`L0Q4L{1suz8>X3N^bSG=GSw0Tg`(g6OC%^kz-=19AR*O~D6*U-@ zi-~nRWVgL`uZ%{duO836no@SHq86u&M}-rJ5Z96x^)Lyd5%g?BLb*<1;q;4Z2M-?g z_WYfPpX~JfPY)mLKDzg?SJ?ej#56CglQc{UGp1Q#%3Ks?mS)9@vh4qU#KqXP3rq5- z?>V#3^j0pcd|{uSQ8AF>DvYTH{+A|x0OhZvdv}i>NeK5NI;5;~OwVXCKH5oWkS2`& z{D>!C$fGpli3~ud*>Eh6J_(PHfa>`NK;5Un(a<-FK!cs$p;>qb9Rm8l6C<_x6uHfZ z`c5`3t`B(bPxIDCqJocHeh7}pO%U3qqc``|;e)ybV)+ zN*LBYxZpMCTCOFoKy#U*Ygj4?Laal%XqWu(;BbGZd%t%euA#zp6qq>T1`0U*Y2s}V zt}SlD%UiwRo%GuCu`rUvJE&d}f}(>`ybBFQ1Jg{c-4T42>AA5qJ#So2Pt~um1Hmbf z9v(spE2H@kjvVX#Fyej!o2;Luz#_2Sd8^pwpYrh;P^xQs4saZF9E=MaEC5v&P1NXz z36!f$H^D5LzK8xH9_QL~IHBbFiE*yKF!78F=Lfy(n#C zufDt2?cIO)xoau}#Vx2TTJwDtfO{3FcPiT#%rcw^T`+j~m?sp$vhJUH+ z?=Ev4j$kG1e_QbWr{C^<)zdY)UG;1fj$cNpUo?Fmw%QSdtzWGAu;J23#jjt~eV?U) z?~4r>(Yvv`_t~;-T>J=I+rNHvu+#Oc492h!c)AupL_tvC0o~ignD=4#6@rd^Jk|L4 zVqL?qMDq;GH28a$k5`|+}hNY_;-c7yzo{|J>Z2g+O_*Q+p?yA?C zZR;I4VDZwqTU8xy>2RpvL$%GTKfI2TrK31KZ=?E8@g@G};WM5siA`1iZ2Uo}>BxUK&IS%nr- literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/mouse_connectivity_api.cpython-37.pyc b/api/queries/__pycache__/mouse_connectivity_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31d501bcf6fbbb503a1972b2e812fc65dbf204e0 GIT binary patch literal 17591 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 I!C&!z0PhS3>;M1& literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/ontologies_api.cpython-37.pyc b/api/queries/__pycache__/ontologies_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..831ed16b0cb9f99c2d0d10d0aff8dc5ad4b28512 GIT binary patch literal 7575 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 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/reference_space_api.cpython-37.pyc b/api/queries/__pycache__/reference_space_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebac91f9ff742b580b4e21f710deef82821de80f GIT binary patch literal 7957 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 OtUP5);5oj2OmERF*%z3*=`{U#V#>Z( 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 bw%F;6JQLps7O%)9`S>jLCySztaLj)J8msUF literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/rma_pager.cpython-37.pyc b/api/queries/__pycache__/rma_pager.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bff305d98d3e4e7d330bb843b26811bd875808e GIT binary patch literal 1543 zcmZ`&UyCC}5U=i@nasxAva7-^{y`B@2Qj-K_#ojp?__{p-s3O-rYL$Zgb9ja1YRsHLls$bu`b*l}yroVhA z54QpSq|JJHXxv3H@1atlSOx?50u)!`3Y19Mr5JD(C{OuUY#XfSIiS zD=O=mG#hEU#HqhW_dgweV^VE~@>Htsv7F2NV)$7ulOk90<6)XVHp8M!bCaMh%F_!o z{BnFeG~+7$sFcYBug0@kh8b$IFU#@%`7G7r)a>i2j7zGlTVB{Oj>q}9isKKcDvk=+ zVs~A8cOBh)#1G3t`W3HRmuwk4dAV+V4&SzyVI4lg{+*AG;QW&# z$iH^T&!gVMvtk1J_ZLyuXc!3y{RPzD5cP+nW+Y+XwyUC&S*(k>v0*-&HkQDCY8v68 z^^;gcW5`T5*zAR$$wsEz3u_^`t&AHki!mU$^kE4oSU)YS7WCnPpYn zfO$$*(lUKR1MOp$_1&~SMAICg0veB?)On=Q6C<8(lM zVrLxZa+=1mZO8GnP_vBeP8^@lWY$D#F=~vP9Ty>7FRH7#0ypQ5| zjim_ZNgSWhP5+ckVhH3KuGuvo;d8?W6n+mYdJ3Yyp&1<@n!Q2?h?*<0Vlk{ZYF6>5 zVg=6_LcpkbgCSCd)%11|1k>GG-}n~p%ps~3oPpj`m^f+aJ=)bwu^#!EK2Y5G4`_#e z-h+yt;k6@H!_OE)cJi9LE1D6~FeC5AcHiuJ6bZe9LA{I02F;KoZhe&|g|^;kmM2Xc z-F(^n5#|{>0b&~`hT`TMu*EwxGI^Y(-CkBCGBbC&4&-J##}YQQvRi~*6-8#OKi9G} z5!bIHu6_d*mh~Fhj)1Ou)&$)QDfAG0N--2R^eT>S{Xxw>)u`-Xpv_WxvmL^rxM+*KI*KF8p2z%#U%rL~#Q0zp&{sD7AOq&1z literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/rma_template.cpython-37.pyc b/api/queries/__pycache__/rma_template.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b5a04c07695203dc35c99353928b381769e217c GIT binary patch literal 2892 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 VI$3DwqHuQ?LG68we$cjM{R=M;>=yt4 literal 0 HcmV?d00001 diff --git a/api/queries/__pycache__/synchronization_api.cpython-37.pyc b/api/queries/__pycache__/synchronization_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..919dd4417e1eb4dbc5469713fa6f5c455e64756b GIT binary patch literal 7296 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 F|1aaS0sQ~~ literal 0 HcmV?d00001 diff --git a/api/queries/annotated_section_data_sets_api.py b/api/queries/annotated_section_data_sets_api.py new file mode 100644 index 0000000000..72cefbf874 --- /dev/null +++ b/api/queries/annotated_section_data_sets_api.py @@ -0,0 +1,234 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .rma_api import RmaApi +from allensdk.api.warehouse_cache.cache import cacheable + + +class AnnotatedSectionDataSetsApi(RmaApi): + '''See: + `Searching Annotated SectionDataSets `_ + ''' + + def __init__(self, base_uri=None): + super(AnnotatedSectionDataSetsApi, self).__init__(base_uri) + + def get_annotated_section_data_sets(self, + structures, + intensity_values=None, + density_values=None, + pattern_values=None, + age_names=None): + '''For a list of target structures, find the SectionDataSet + that matches the parameters for intensity_values, density_values, pattern_values, and Age. + + Parameters + ---------- + structure_graph_id : dict of integers + what to retrieve + intensity_values : array of strings, optional + 'High','Low', 'Medium' (default) + density_values : array of strings, optional + 'High', 'Low' + pattern_values : array of strings, optional + 'Full' + age_names : array of strings, options + for example 'E11.5', '13.5' + + Returns + ------- + data : dict + The parsed JSON repsonse message. + + Notes + ----- + This method uses the non-RMA Annotated SectionDataSet endpoint. + ''' + params = ['structures=' + ','.join((str(s) for s in structures))] + + if intensity_values is not None and len(intensity_values) > 0: + params.append('intensity_values=' + + ','.join(("'%s'" % (v) for v in intensity_values))) + + if density_values is not None and len(density_values) > 0: + params.append('density_values=' + + ','.join(("'%s'" % (v) for v in density_values))) + + if pattern_values is not None and len(pattern_values) > 0: + params.append('pattern_values=' + + ','.join(("'%s'" % (v) for v in pattern_values))) + + if age_names is not None and len(age_names) > 0: + params.append('age_names=' + + ','.join(("'%s'" % (v) for v in age_names))) + + url_params = '?' + '&'.join(params) + + url = ''.join([self.annotated_section_data_sets_endpoint, + '.json', + url_params]) + + return self.json_msg_query(url) + + @cacheable() + def get_annotated_section_data_sets_via_rma(self, + structures, + intensity_values=None, + density_values=None, + pattern_values=None, + age_names=None): + '''For a list of target structures, find the SectionDataSet + that matches the parameters for intensity_values, density_values, pattern_values, and Age. + + Parameters + ---------- + structure_graph_id : dict of integers + what to retrieve + intensity_values : array of strings, optional + intensity values, 'High','Low', 'Medium' (default) + density_values : array of strings, optional + density values, 'High', 'Low' + pattern_values : array of strings, optional + pattern values, 'Full' + age_names : array of strings, options + for example 'E11.5', '13.5' + + Returns + ------- + data : dict + The parsed JSON response message. + + Notes + ----- + This method uses the RMA endpoint to search annotated SectionDataSet data. + ''' + age_include_strings = ['age'] + + if age_names is not None and len(age_names) > 0: + age_include_strings.append('[name$in') + age_include_strings.append( + ','.join(("'%s'" % (a) for a in age_names))) + age_include_strings.append(']') + age_include = ''.join(age_include_strings) + + criteria_strings = ['manual_annotations'] + + if intensity_values is not None and len(intensity_values) > 0: + criteria_strings.append('[intensity_call$in%s]' % + (','.join(("'%s'" % (v) for v in intensity_values)))) + + if density_values is not None and len(density_values) > 0: + criteria_strings.append('[density_call$in%s]' % + (','.join(("'%s'" % (v) for v in density_values)))) + + if pattern_values is not None and len(pattern_values) > 0: + criteria_strings.append('[pattern_call$in%s]' % + (','.join(("'%s'" % (v) for v in pattern_values)))) + + criteria_strings.append('(structure[id$in%s])' % + (','.join((str(s) for s in structures)))) + + criteria_clause = ''.join(criteria_strings) + + include_clause = ''.join(['specimen', + '(donor(', + age_include, + ')),', + 'probes(gene),' + 'plane_of_section']) + + order_by_array = ['genes.acronym', + 'ages.embryonic+desc', + 'ages.days', + 'data_sets.id'] + + data = self.model_query('SectionDataSet', + criteria=criteria_clause, + include=include_clause, + start_row=0, + num_rows=50, + order=order_by_array) + + return data + + def get_compound_annotated_section_data_sets(self, + queries, + fmt='json'): + '''Find the SectionDataSet that matches several annotated_section_data_sets queries + linked together with a Boolean 'and' or 'or'. + + Parameters + ---------- + queries : array of dicts + dicts with args like build_query + fmt : string, optional + 'json' or 'xml' + + Returns + ------- + data : dict + The parsed JSON repsonse message. + ''' + url_strings = ['?query='] + + for query in queries: + url_strings.append('[') + + params = ['structures $in ' + + ','.join((str(s) for s in query['structures']))] + + for key in ['intensity_values', 'density_values', 'pattern_values', 'age_names']: + if key in query and len(query[key]) > 0: + params.append('%s $in %s' % + (key, + ','.join(("'%s'" % (v) for v in query['intensity_values'])))) + + url_strings.append(' : '.join(params)) + + url_strings.append(']') + + if 'link' in query and query['link'] == 'or': + url_strings.append(' or ') + if 'link' in query and query['link'] == 'and': + url_strings.append(' and ') + + url_params = ''.join(url_strings) + + url = ''.join([self.compound_annotated_section_data_sets_endpoint, + '.', + fmt, + url_params]) + + return self.json_msg_query(url) diff --git a/api/queries/biophysical_api.py b/api/queries/biophysical_api.py new file mode 100644 index 0000000000..70fd7a4fb9 --- /dev/null +++ b/api/queries/biophysical_api.py @@ -0,0 +1,390 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.api.queries.rma_template import RmaTemplate +from allensdk.api.warehouse_cache.cache import cacheable +import os +import simplejson as json +from collections import OrderedDict +from allensdk.config.manifest import Manifest + + +class BiophysicalApi(RmaTemplate): + _NWB_file_type = 'NWBDownload' + _SWC_file_type = '3DNeuronReconstruction' + _MOD_file_type = 'BiophysicalModelDescription' + _FIT_file_type = 'NeuronalModelParameters' + _MARKER_file_type = '3DNeuronMarker' + BIOPHYSICAL_MODEL_TYPE_IDS = (491455321, 329230710,) + + rma_templates = \ + {"model_queries": [ + {'name': 'models_by_specimen', + 'description': 'see name', + 'model': 'NeuronalModel', + 'num_rows': 'all', + 'count': False, + 'criteria': '[neuronal_model_template_id$in{{biophysical_model_types}}],[specimen_id$in{{specimen_ids}}]', + 'criteria_params': ['specimen_ids', 'biophysical_model_types'] + }]} + + + def __init__(self, base_uri=None): + super(BiophysicalApi, self).__init__(base_uri, query_manifest=BiophysicalApi.rma_templates) + self.cache_stimulus = True + self.ids = {} + self.sweeps = [] + self.manifest = {} + self.model_type = None + + + @cacheable() + def get_neuronal_models(self, specimen_ids, num_rows='all', count=False, model_type_ids=None, **kwargs): + '''Fetch all of the biophysically detailed model records associated with + a particular specimen_id + + Parameters + ---------- + specimen_ids : list + One or more integer ids identifying specimen records. + num_rows : int, optional + how many records to retrieve. Default is 'all'. + count : bool, optional + If True, return a count of the lines found by the query. Default is False. + model_type_ids : list, optional + One or more integer ids identifying categories of neuronal model. Defaults + to all-active and perisomatic biophysical_models. + + Returns + ------- + List of dict + Each element is a biophysical model record, containing a unique integer + id, the id of the associated specimen, and the id of the model type to + which this model belongs. + + ''' + + if model_type_ids is None: + model_type_ids = self.BIOPHYSICAL_MODEL_TYPE_IDS + + return self.template_query('model_queries', 'models_by_specimen', + specimen_ids=specimen_ids, + biophysical_model_types=list(model_type_ids), + num_rows=num_rows, count=count) + + + def build_rma(self, neuronal_model_id, fmt='json'): + '''Construct a query to find all files related to a neuronal model. + + Parameters + ---------- + neuronal_model_id : integer or string representation + key of experiment to retrieve. + fmt : string, optional + json (default) or xml + + Returns + ------- + string + RMA query url. + ''' + include_associations = ''.join([ + 'neuronal_model_template(well_known_files(well_known_file_type)),', + 'specimen(ephys_result(well_known_files(well_known_file_type)),', + 'neuron_reconstructions(well_known_files(well_known_file_type)),', + 'ephys_sweeps),', + 'well_known_files(well_known_file_type)']) + criteria_associations = ''.join([ + ("[id$eq%d]," % (neuronal_model_id)), + include_associations]) + + return ''.join([self.rma_endpoint, + '/query.', + fmt, + '?q=', + 'model::NeuronalModel,', + 'rma::criteria,', + criteria_associations, + ',rma::include,', + include_associations]) + + def read_json(self, json_parsed_data): + '''Get the list of well_known_file ids from a response body + containing nested sample,microarray_slides,well_known_files. + + Parameters + ---------- + json_parsed_data : dict + Response from the Allen Institute Api RMA. + + Returns + ------- + list of strings + Well known file ids. + ''' + self.ids = { + 'stimulus': {}, + 'morphology': {}, + 'marker': {}, + 'modfiles': {}, + 'fit': {} + } + self.sweeps = [] + + if 'msg' in json_parsed_data: + for neuronal_model in json_parsed_data['msg']: + if 'well_known_files' in neuronal_model: + for well_known_file in neuronal_model['well_known_files']: + if ('id' in well_known_file and + 'path' in well_known_file and + self.is_well_known_file_type(well_known_file, + BiophysicalApi._FIT_file_type)): + self.ids['fit'][str(well_known_file['id'])] = \ + os.path.split(well_known_file['path'])[1] + + if 'neuronal_model_template' in neuronal_model: + neuronal_model_template = neuronal_model[ + 'neuronal_model_template'] + self.model_type = neuronal_model_template['name'] + if 'well_known_files' in neuronal_model_template: + for well_known_file in neuronal_model_template['well_known_files']: + if ('id' in well_known_file and + 'path' in well_known_file and + self.is_well_known_file_type(well_known_file, + BiophysicalApi._MOD_file_type)): + self.ids['modfiles'][str(well_known_file['id'])] = \ + os.path.join('modfiles', + os.path.split(well_known_file['path'])[1]) + + if 'specimen' in neuronal_model: + specimen = neuronal_model['specimen'] + + if 'neuron_reconstructions' in specimen: + for neuron_reconstruction in specimen['neuron_reconstructions']: + if 'well_known_files' in neuron_reconstruction: + for well_known_file in neuron_reconstruction['well_known_files']: + if ('id' in well_known_file and 'path' in well_known_file): + if self.is_well_known_file_type(well_known_file, BiophysicalApi._SWC_file_type): + self.ids['morphology'][str(well_known_file['id'])] = \ + os.path.split( + well_known_file['path'])[1] + elif self.is_well_known_file_type(well_known_file, BiophysicalApi._MARKER_file_type): + self.ids['marker'][str(well_known_file['id'])] = \ + os.path.split( + well_known_file['path'])[1] + + if 'ephys_result' in specimen: + ephys_result = specimen['ephys_result'] + if 'well_known_files' in ephys_result: + for well_known_file in ephys_result['well_known_files']: + if ('id' in well_known_file and + 'path' in well_known_file and + self.is_well_known_file_type(well_known_file, BiophysicalApi._NWB_file_type)): + self.ids['stimulus'][str(well_known_file['id'])] = \ + "%d.nwb" % (ephys_result['id']) + + self.sweeps = [sweep['sweep_number'] + for sweep in specimen['ephys_sweeps'] + if sweep['stimulus_name'] != 'Test'] + + return self.ids + + def is_well_known_file_type(self, wkf, name): + '''Check if a structure has the expected name. + + Parameters + ---------- + wkf : dict + A well-known-file structure with nested type information. + name : string + The expected type name + + See Also + -------- + read_json: where this helper function is used. + ''' + try: + return wkf['well_known_file_type']['name'] == name + except: + return False + + def get_well_known_file_ids(self, neuronal_model_id): + '''Query the current RMA endpoint with a neuronal_model id + to get the corresponding well known file ids. + + Returns + ------- + list + A list of well known file id strings. + ''' + rma_builder_fn = self.build_rma + json_traversal_fn = self.read_json + + return self.do_query(rma_builder_fn, json_traversal_fn, neuronal_model_id) + + def create_manifest(self, + fit_path='', + model_type='', + stimulus_filename='', + swc_morphology_path='', + marker_path='', + sweeps=[]): + '''Generate a json configuration file with parameters for a + a biophysical experiment. + + Parameters + ---------- + fit_path : string + filename of a json configuration file with cell parameters. + stimulus_filename : string + path to an NWB file with input currents. + swc_morphology_path : string + file in SWC format. + sweeps : array of integers + which sweeps in the stimulus file are to be used. + ''' + self.manifest = OrderedDict() + self.manifest['biophys'] = [{ + 'model_file': ['manifest.json', fit_path], + 'model_type': model_type + }] + self.manifest['runs'] = [{ + 'sweeps': sweeps + }] + self.manifest['neuron'] = [{ + 'hoc': ['stdgui.hoc', 'import3d.hoc'] + }] + self.manifest['manifest'] = [ + { + 'type': 'dir', + 'spec': '.', + 'key': 'BASEDIR' + }, + { + 'type': 'dir', + 'spec': 'work', + 'key': 'WORKDIR', + 'parent': 'BASEDIR' + }, + { + 'type': 'file', + 'spec': swc_morphology_path, + 'key': 'MORPHOLOGY' + }, + { + 'type': 'file', + 'spec': marker_path, + 'key': 'MARKER' + }, + { + 'type': 'dir', + 'spec': 'modfiles', + 'key': 'MODFILE_DIR' + }, + { + 'type': 'file', + 'format': 'NWB', + 'spec': stimulus_filename, + 'key': 'stimulus_path' + }, + { + 'parent_key': 'WORKDIR', + 'type': 'file', + 'format': 'NWB', + 'spec': stimulus_filename, + 'key': 'output_path' + } + ] + + def cache_data(self, + neuronal_model_id, + working_directory=None): + '''Take a an experiment id, query the Api RMA to get well-known-files + download the files, and store them in the working directory. + + Parameters + ---------- + neuronal_model_id : int or string representation + found in the neuronal_model table in the api + working_directory : string + Absolute path name where the downloaded well-known files will be stored. + ''' + if working_directory is None: + working_directory = self.default_working_directory + + well_known_file_id_dict = self.get_well_known_file_ids( + neuronal_model_id) + + if not well_known_file_id_dict or \ + (not any(list(well_known_file_id_dict.values()))): + raise(Exception("No data found for neuronal model id %d" % + (neuronal_model_id))) + + Manifest.safe_mkdir(working_directory) + + work_dir = os.path.join(working_directory, 'work') + Manifest.safe_mkdir(work_dir) + + modfile_dir = os.path.join(working_directory, 'modfiles') + Manifest.safe_mkdir(modfile_dir) + + for key, id_dict in well_known_file_id_dict.items(): + if (not self.cache_stimulus) and (key == 'stimulus'): + continue + + for well_known_id, filename in id_dict.items(): + well_known_file_url = self.construct_well_known_file_download_url( + well_known_id) + cached_file_path = os.path.join(working_directory, filename) + self.retrieve_file_over_http( + well_known_file_url, cached_file_path) + + fit_path = list(self.ids['fit'].values())[0] + stimulus_filename = list(self.ids['stimulus'].values())[0] + swc_morphology_path = list(self.ids['morphology'].values())[0] + marker_path = \ + list(self.ids['marker'].values())[0] if 'marker' in self.ids else '' + sweeps = sorted(self.sweeps) + + self.create_manifest(fit_path, + self.model_type, + stimulus_filename, + swc_morphology_path, + marker_path, + sweeps) + + manifest_path = os.path.join(working_directory, 'manifest.json') + with open(manifest_path, 'w') as f: + json.dump(self.manifest, f, indent=2) diff --git a/api/queries/brain_observatory_api.py b/api/queries/brain_observatory_api.py new file mode 100644 index 0000000000..e6ce48bc31 --- /dev/null +++ b/api/queries/brain_observatory_api.py @@ -0,0 +1,780 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import logging + +import pandas as pd +from six import string_types + +from allensdk.config.manifest import Manifest +import allensdk.brain_observatory.stimulus_info as stimulus_info + +from .rma_template import RmaTemplate +from allensdk.api.warehouse_cache.cache import cacheable, Cache +from .rma_pager import pageable + +from dateutil.parser import parse as parse_date + +class BrainObservatoryApi(RmaTemplate): + _log = logging.getLogger('allensdk.api.queries.brain_observatory_api') + + NWB_FILE_TYPE = 'NWBOphys' + OPHYS_ANALYSIS_FILE_TYPE = 'OphysExperimentCellRoiMetricsFile' + OPHYS_EVENTS_FILE_TYPE = 'ObservatoryEventsFile' + CELL_MAPPING_ID = 590985414 + + rma_templates = \ + {"brain_observatory_queries": [ + {'name': 'list_isi_experiments', + 'description': 'see name', + 'model': 'IsiExperiment', + 'num_rows': 'all', + 'count': False, + 'criteria_params': [] + }, + {'name': 'isi_experiment_by_ids', + 'description': 'see name', + 'model': 'IsiExperiment', + 'criteria': '[id$in{{ isi_experiment_ids }}]', + 'include': 'experiment_container(ophys_experiments,targeted_structure)', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['isi_experiment_ids'] + }, + {'name': 'ophys_experiment_by_ids', + 'description': 'see name', + 'model': 'OphysExperiment', + 'criteria': '{% if ophys_experiment_ids is defined %}[id$in{{ ophys_experiment_ids }}]{%endif%}', + 'include': 'experiment_container,well_known_files(well_known_file_type),targeted_structure,specimen(donor(age,transgenic_lines))', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['ophys_experiment_ids'] + }, + {'name': 'ophys_experiment_data', + 'description': 'see name', + 'model': 'WellKnownFile', + 'criteria': '[attachable_id$eq{{ ophys_experiment_id }}],well_known_file_type[name$eq%s]' % NWB_FILE_TYPE, + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['ophys_experiment_id'] + }, + {'name': 'ophys_analysis_file', + 'description': 'see name', + 'model': 'WellKnownFile', + 'criteria': '[attachable_id$eq{{ ophys_experiment_id }}],well_known_file_type[name$eq%s]' % OPHYS_ANALYSIS_FILE_TYPE, + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['ophys_experiment_id'] + }, + {'name': 'ophys_events_file', + 'description': 'see name', + 'model': 'WellKnownFile', + 'criteria': '[attachable_id$eq{{ ophys_experiment_id }}],well_known_file_type[name$eq%s]' % OPHYS_EVENTS_FILE_TYPE, + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['ophys_experiment_id'] + }, + {'name': 'column_definitions', + 'description': 'see name', + 'model': 'ApiColumnDefinition', + 'criteria': '[api_class_name$eq{{ api_class_name }}]', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['api_class_name'] + }, + {'name': 'column_definition_class_names', + 'description': 'see name', + 'model': 'ApiColumnDefinition', + 'only': ['api_class_name'], + 'num_rows': 'all', + 'count': False, + }, + {'name': 'stimulus_mapping', + 'description': 'see name', + 'model': 'ApiCamStimulusMapping', + 'criteria': '{% if stimulus_mapping_ids is defined %}[id$in{{ stimulus_mapping_ids }}]{%endif%}', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['stimulus_mapping_ids'] + }, + {'name': 'experiment_container', + 'description': 'see name', + 'model': 'ExperimentContainer', + 'criteria': '{% if experiment_container_ids is defined %}[id$in{{ experiment_container_ids }}]{%endif%}', + 'include': 'ophys_experiments,isi_experiment,specimen(donor(conditions,age,transgenic_lines)),targeted_structure', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['experiment_container_ids'] + }, + {'name': 'experiment_container_metric', + 'description': 'see name', + 'model': 'ApiCamExperimentContainerMetric', + 'criteria': '{% if experiment_container_metric_ids is defined %}[id$in{{ experiment_container_metric_ids }}]{%endif%}', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['experiment_container_metric_ids'] + }, + {'name': 'cell_metric', + 'description': 'see name', + 'model': 'ApiCamCellMetric', + 'criteria': '{% if cell_specimen_ids is defined %}[cell_specimen_id$in{{ cell_specimen_ids }}]{%endif%}', + 'criteria_params': ['cell_specimen_ids'] + }, + {'name': 'cell_specimen_id_mapping_table', + 'description': 'see name', + 'model': 'WellKnownFile', + 'criteria': '[id$eq{{ mapping_table_id }}],well_known_file_type[name$eqOphysCellSpecimenIdMapping]', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['mapping_table_id'] + }, + {'name': 'eye_gaze_mapping_file', + 'description': 'h5 file containing mouse eye gaze mapped onto screen coordinates (as well as pupil and eye sizes)', + 'model': 'WellKnownFile', + 'criteria': '[attachable_id$eq{{ ophys_session_id }}],well_known_file_type[name$eqEyeDlcScreenMapping]', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['ophys_session_id'] + }, + # NOTE: 'all_eye_mapping_files' query is for facilitating an ugly + # hack to get around lack of relationship between experiment id + # and session id in current warehouse. This should be removed when + # the relationship is added. + {'name': 'all_eye_mapping_files', + 'description': 'Get a list of dictionaries for all eye mapping wkfs', + 'model': 'WellKnownFile', + 'criteria': 'well_known_file_type[name$eqEyeDlcScreenMapping]', + 'num_rows': 'all', + 'count': False + } + ]} + + _QUERY_TEMPLATES = { + "=": '({0} == {1})', + "<": '({0} < {1})', + ">": '({0} > {1})', + "<=": '({0} <= {1})', + ">=": '({0} >= {1})', + "between": '({0} >= {1}) and ({0} <= {2})', + "in": '({0} == {1})', + "is": '({0} == {1})' + } + + def __init__(self, base_uri=None, datacube_uri=None): + super(BrainObservatoryApi, self).__init__(base_uri, + query_manifest=BrainObservatoryApi.rma_templates) + + self.datacube_uri = datacube_uri + + @cacheable() + def get_ophys_experiments(self, ophys_experiment_ids=None): + ''' Get OPhys Experiments by id + + Parameters + ---------- + ophys_experiment_ids : integer or list of integers, optional + only select specific experiments. + + Returns + ------- + dict : ophys experiment metadata + ''' + data = self.template_query('brain_observatory_queries', + 'ophys_experiment_by_ids', + ophys_experiment_ids=ophys_experiment_ids) + + return data + + def get_isi_experiments(self, isi_experiment_ids=None): + ''' Get ISI Experiments by id + + Parameters + ---------- + isi_experiment_ids : integer or list of integers, optional + only select specific experiments. + + Returns + ------- + dict : isi experiment metadata + ''' + data = self.template_query('brain_observatory_queries', + 'isi_experiment_by_ids', + isi_experiment_ids=isi_experiment_ids) + + return data + + def list_isi_experiments(self, isi_ids=None): + '''List ISI experiments available through the Allen Institute API + + Parameters + ---------- + neuronal_model_ids : integer or list of integers, optional + only select specific isi experiments. + + Returns + ------- + dict : neuronal model metadata + ''' + data = self.template_query('brain_observatory_queries', + 'list_isi_experiments') + + return data + + def list_column_definition_class_names(self): + ''' Get column definitions + + Parameters + ---------- + + Returns + ------- + list : api class name strings + ''' + data = self.template_query('brain_observatory_queries', + 'column_definition_class_names') + + names = list(set([n['api_class_name'] for n in data])) + + return names + + def get_column_definitions(self, api_class_name=None): + ''' Get column definitions + + Parameters + ---------- + api_class_names : string or list of strings, optional + only select specific column definition records. + + Returns + ------- + dict : column definition metadata + ''' + data = self.template_query('brain_observatory_queries', + 'column_definitions', + api_class_name=api_class_name) + + return data + + @cacheable() + def get_stimulus_mappings(self, stimulus_mapping_ids=None): + ''' Get stimulus mappings by id + + Parameters + ---------- + stimulus_mapping_ids : integer or list of integers, optional + only select specific stimulus mapping records. + + Returns + ------- + dict : stimulus mapping metadata + ''' + data = self.template_query('brain_observatory_queries', + 'stimulus_mapping', + stimulus_mapping_ids=stimulus_mapping_ids) + + return data + + @cacheable() + @pageable(num_rows=2000, total_rows='all') + def get_cell_metrics(self, cell_specimen_ids=None, *args, **kwargs): + ''' Get cell metrics by id + + Parameters + ---------- + cell_metrics_ids : integer or list of integers, optional + only select specific cell metric records. + + Returns + ------- + dict : cell metric metadata + ''' + + order = kwargs.pop('order', ['\'cell_specimen_id\'']) + + data = self.template_query('brain_observatory_queries', + 'cell_metric', + cell_specimen_ids=cell_specimen_ids, + order=order, + *args, + **kwargs) + + return data + + @cacheable() + def get_experiment_containers(self, experiment_container_ids=None): + ''' Get experiment container by id + + Parameters + ---------- + experiment_container_ids : integer or list of integers, optional + only select specific experiment containers. + + Returns + ------- + dict : experiment container metadata + ''' + data = self.template_query('brain_observatory_queries', + 'experiment_container', + experiment_container_ids=experiment_container_ids) + + return data + + def get_experiment_container_metrics(self, experiment_container_metric_ids=None): + ''' Get experiment container metrics by id + + Parameters + ---------- + isi_experiment_ids : integer or list of integers, optional + only select specific experiments. + + Returns + ------- + dict : isi experiment metadata + ''' + data = self.template_query('brain_observatory_queries', + 'experiment_container_metric', + experiment_container_metric_ids=experiment_container_metric_ids) + + return data + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=2, + path_keyword='file_name')) + def save_ophys_experiment_data(self, ophys_experiment_id, file_name): + data = self.template_query('brain_observatory_queries', + 'ophys_experiment_data', + ophys_experiment_id=ophys_experiment_id) + + try: + file_url = data[0]['download_link'] + except Exception as _: + raise Exception("ophys experiment %d has no data file" % + ophys_experiment_id) + + self._log.warning( + "Downloading ophys_experiment %d NWB. This can take some time." % ophys_experiment_id) + + self.retrieve_file_over_http(self.api_url + file_url, file_name) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=2, + path_keyword='file_name')) + def save_ophys_experiment_analysis_data(self, ophys_experiment_id, file_name): + + data = self.template_query('brain_observatory_queries', + 'ophys_analysis_file', + ophys_experiment_id=ophys_experiment_id) + + try: + file_url = data[0]['download_link'] + except Exception as _: + raise Exception("ophys experiment %d has no %s analysis file" % + (ophys_experiment_id, )) + + self._log.warning( + "Downloading ophys_experiment %d analysis file. This can take some time." % (ophys_experiment_id, )) + + self.retrieve_file_over_http(self.api_url + file_url, file_name) + + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=2, + path_keyword='file_name')) + def save_ophys_experiment_event_data(self, ophys_experiment_id, file_name): + data = self.template_query('brain_observatory_queries', + 'ophys_events_file', + ophys_experiment_id=ophys_experiment_id) + try: + file_url = data[0]['download_link'] + except Exception: + raise Exception("ophys experiment %d has no events file" % + ophys_experiment_id) + self._log.warning( + "Downloading ophys_experiment %d events file. This can take some time." % ophys_experiment_id) + + self.retrieve_file_over_http(self.api_url + file_url, file_name) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=3, + path_keyword='file_name')) + def save_ophys_experiment_eye_gaze_data(self, + ophys_experiment_id: int, + ophys_session_id: int, + file_name: str): + data = self.template_query('brain_observatory_queries', + 'eye_gaze_mapping_file', + ophys_session_id=ophys_session_id) + + experiment_session_string = f"ophys_experiment '{ophys_experiment_id}' (session '{ophys_session_id}')" + + try: + file_url = data[0]['download_link'] + except Exception: + raise Exception(f"{experiment_session_string} has no eye gaze mapping file") + self._log.warning( + f"Downloading {experiment_session_string} gaze mapping file. This can take some time." + ) + + self.retrieve_file_over_http(self.api_url + file_url, file_name) + + def filter_experiments_and_containers(self, objs, + ids=None, + targeted_structures=None, + imaging_depths=None, + cre_lines=None, + reporter_lines=None, + transgenic_lines=None, + include_failed=False): + + if not include_failed: + objs = [o for o in objs if not o.get('failed', False)] + + if ids is not None: + objs = [o for o in objs if o['id'] in ids] + + if targeted_structures is not None: + objs = [o for o in objs if o[ + 'targeted_structure']['acronym'] in targeted_structures] + + if imaging_depths is not None: + objs = [o for o in objs if o[ + 'imaging_depth'] in imaging_depths] + + if cre_lines is not None: + tls = [ tl.lower() for tl in cre_lines ] + obj_tls = [ find_specimen_cre_line(o['specimen']) for o in objs ] + obj_tls = [ o.lower() if o else None for o in obj_tls ] + objs = [o for i,o in enumerate(objs) if obj_tls[i] in tls] + + if reporter_lines is not None: + tls = [ tl.lower() for tl in reporter_lines ] + obj_tls = [ find_specimen_reporter_line(o['specimen']) for o in objs ] + obj_tls = [ o.lower() if o else None for o in obj_tls ] + objs = [o for i,o in enumerate(objs) if obj_tls[i] in tls] + + if transgenic_lines is not None: + tls = set([ tl.lower() for tl in transgenic_lines ]) + objs = [ o for o in objs + if len(tls & set([ tl.lower() + for tl in find_specimen_transgenic_lines(o['specimen']) ]) ) ] + + return objs + + def filter_experiment_containers(self, containers, + ids=None, + targeted_structures=None, + imaging_depths=None, + cre_lines=None, + reporter_lines=None, + transgenic_lines=None, + include_failed=False, + simple=False): + + containers = self.filter_experiments_and_containers(containers, + ids=ids, + targeted_structures=targeted_structures, + imaging_depths=imaging_depths, + cre_lines=cre_lines, + reporter_lines=reporter_lines, + transgenic_lines=transgenic_lines, + include_failed=include_failed) + + if simple: + containers = self.simplify_experiment_containers(containers) + + return containers + + def filter_ophys_experiments(self, experiments, + ids=None, + experiment_container_ids=None, + targeted_structures=None, + imaging_depths=None, + cre_lines=None, + reporter_lines=None, + transgenic_lines=None, + stimuli=None, + session_types=None, + include_failed=False, + require_eye_tracking=False, + simple=False): + + experiments = self.filter_experiments_and_containers(experiments, + ids=ids, + targeted_structures=targeted_structures, + imaging_depths=imaging_depths, + cre_lines=cre_lines, + reporter_lines=reporter_lines, + transgenic_lines=transgenic_lines) + + if require_eye_tracking: + experiments = [e for e in experiments + if e.get('fail_eye_tracking', None) is False] + if not include_failed: + experiments = [e for e in experiments + if not e.get('experiment_container',{}).get('failed', False)] + + if experiment_container_ids is not None: + experiments = [e for e in experiments if e[ + 'experiment_container_id'] in experiment_container_ids] + + if session_types is not None: + experiments = [e for e in experiments if e[ + 'stimulus_name'] in session_types] + + if stimuli is not None: + experiments = [e for e in experiments + if len(set(stimuli) & set(stimulus_info.stimuli_in_session(e['stimulus_name']))) > 0] + + if simple: + experiments = self.simplify_ophys_experiments(experiments) + + return experiments + + def filter_cell_specimens(self, cell_specimens, + ids=None, + experiment_container_ids=None, + include_failed=False, + filters=None): + """ + Filter a list of cell specimen records returned from the get_cell_metrics method according + some of their properties. + + Parameters + ---------- + cell_specimens: list of dicts + List of records returned by the get_cell_metrics method. + + ids: list of integers + Return only records for cells with cell specimen ids in this list + + experiment_container_ids: list of integers + Return only records for cells that belong to experiment container ids in this list + + include_failed: bool + Whether to include cells from failed experiment containers + + filters: list of dicts + Custom query used to reproduce filter sets created in the Allen Brain Observatory + web application. The general form is a list of dictionaries each of which + describes a filtering operation based on a metric. For more information, see + dataframe_query. + """ + + if not include_failed: + cell_specimens = [c for c in cell_specimens if not c.get( + 'failed_experiment_container', False)] + + if ids is not None: + cell_specimens = [c for c in cell_specimens if c[ + 'cell_specimen_id'] in ids] + + if experiment_container_ids is not None: + cell_specimens = [c for c in cell_specimens if c[ + 'experiment_container_id'] in experiment_container_ids] + + if filters is not None: + cell_specimens = self.dataframe_query(cell_specimens, + filters, + 'cell_specimen_id') + + return cell_specimens + + def dataframe_query_string(self, + filters): + """ + Convert a list of cell metric filter dictionaries into a + Pandas query string. + """ + + def _quote_string(v): + if isinstance(v, string_types): + return "'%s'" % (v) + else: + return str(v) + + def _filter_clause(op, field, value): + if op == 'in': + query_args = [field, str(value)] + elif type(value) is list: + query_args = [field] + list(map(_quote_string, value)) + else: + query_args = [field, str(value)] + + cluster_string = self._QUERY_TEMPLATES[op].\ + format(*query_args) + + return cluster_string + + query_string = ' & '.join(_filter_clause(f['op'], + f['field'], + f['value']) for f in filters) + + return query_string + + def dataframe_query(self, + data, + filters, + primary_key): + """ + Given a list of dictionary records and a list of filter dictionaries, + filter the records using Pandas and return the filtered set of records. + + Parameters + ---------- + data: list of dicts + List of dictionaries + + filters: list of dicts + Each dictionary describes a filtering operation on a field in the dictionary. + The general form is { 'field': , 'op': , 'value': }. + For example, you can apply a threshold on the "osi_dg" column with something like this: + { 'field': 'osi_dg', 'op': '>', 'value': 1.0 }. See _QUERY_TEMPLATES for a full list + of operators. + """ + + if len(filters) == 0: + return data + + queries = self.dataframe_query_string(filters) + result_dataframe = pd.DataFrame(data) + result_dataframe = result_dataframe.query(queries) + + result_keys = set(result_dataframe[primary_key]) + result = [d for d in data + if d[primary_key] + in result_keys] + + return result + + def get_cell_specimen_id_mapping(self, file_name, mapping_table_id=None): + '''Download mapping table from old to new cell specimen IDs. + + The mapping table is a CSV file that maps cell specimen ids + that have changed between processing runs of the Brain + Observatory pipeline. + + Parameters + ---------- + file_name : string + Filename to save locally. + mapping_table_id : integer + ID of the mapping table file. Defaults to the most recent + mapping table. + + Returns + ------- + pandas.DataFrame + Mapping table as a DataFrame. + ''' + if mapping_table_id is None: + mapping_table_id = self.CELL_MAPPING_ID + data = self.template_query('brain_observatory_queries', + 'cell_specimen_id_mapping_table', + mapping_table_id=mapping_table_id) + + try: + file_url = data[0]['download_link'] + except Exception as _: + raise Exception("No OphysCellSpecimenIdMapping file found.") + + self.retrieve_file_over_http(self.api_url + file_url, file_name) + + return pd.read_csv(file_name) + + def simplify_experiment_containers(self, containers): + return [{ + 'id': c['id'], + 'imaging_depth': c['imaging_depth'], + 'targeted_structure': c['targeted_structure']['acronym'], + 'cre_line': find_specimen_cre_line(c['specimen']), + 'reporter_line': find_specimen_reporter_line(c['specimen']), + 'donor_name': c['specimen']['donor']['external_donor_name'], + 'specimen_name': c['specimen']['name'], + 'tags': find_container_tags(c), + 'failed': c['failed'] + } for c in containers] + + + def simplify_ophys_experiments(self, exps): + return [{ + 'id': e['id'], + 'imaging_depth': e['imaging_depth'], + 'targeted_structure': e['targeted_structure']['acronym'], + 'cre_line': find_specimen_cre_line(e['specimen']), + 'reporter_line': find_specimen_reporter_line(e['specimen']), + 'acquisition_age_days': find_experiment_acquisition_age(e), + 'experiment_container_id': e['experiment_container_id'], + 'session_type': e['stimulus_name'], + 'donor_name': e['specimen']['donor']['external_donor_name'], + 'specimen_name': e['specimen']['name'], + 'fail_eye_tracking': e.get('fail_eye_tracking', None) + } for e in exps] + + + +def find_specimen_cre_line(specimen): + try: + return next(tl['name'] for tl in specimen['donor']['transgenic_lines'] + if tl['transgenic_line_type_name'] == 'driver' and + 'Cre' in tl['name']) + except StopIteration: + return None + + +def find_specimen_reporter_line(specimen): + try: + return next(tl['name'] for tl in specimen['donor']['transgenic_lines'] + if tl['transgenic_line_type_name'] == 'reporter') + except StopIteration: + return None + + +def find_specimen_transgenic_lines(specimen): + return [ tl['name'] for tl in specimen['donor']['transgenic_lines'] ] + + +def find_experiment_acquisition_age(exp): + try: + return (parse_date(exp['date_of_acquisition']) - parse_date(exp['specimen']['donor']['date_of_birth'])).days + except KeyError as e: + return None + + +def find_container_tags(container): + """ Custom logic for extracting tags from donor conditions. Filtering + out tissuecyte tags. """ + conditions = container['specimen']['donor'].get('conditions', []) + return [c['name'] for c in conditions if not c['name'].startswith('tissuecyte')] diff --git a/api/queries/cell_types_api.py b/api/queries/cell_types_api.py new file mode 100644 index 0000000000..de95627576 --- /dev/null +++ b/api/queries/cell_types_api.py @@ -0,0 +1,400 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .rma_api import RmaApi +from allensdk.api.warehouse_cache.cache import cacheable +from allensdk.config.manifest import Manifest +from allensdk.api.warehouse_cache.cache import Cache +from allensdk.deprecated import deprecated + + +class CellTypesApi(RmaApi): + NWB_FILE_TYPE = 'NWBDownload' + SWC_FILE_TYPE = '3DNeuronReconstruction' + MARKER_FILE_TYPE = '3DNeuronMarker' + + MOUSE = 'Mus musculus' + HUMAN = 'Homo Sapiens' + + def __init__(self, base_uri=None): + super(CellTypesApi, self).__init__(base_uri) + + + @cacheable() + def list_cells_api(self, + id=None, + require_morphology=False, + require_reconstruction=False, + reporter_status=None, + species=None): + + + criteria = None + + if id: + criteria = "[specimen__id$eq%d]" % id + + cells = self.model_query( + 'ApiCellTypesSpecimenDetail', criteria=criteria, num_rows='all') + + return cells + + @deprecated("please use list_cells_api instead") + def list_cells(self, + id=None, + require_morphology=False, + require_reconstruction=False, + reporter_status=None, + species=None): + """ + Query the API for a list of all cells in the Cell Types Database. + + Parameters + ---------- + id: int + ID of a cell. If not provided returns all matching cells. + + require_morphology: boolean + Only return cells that have morphology images. + + require_reconstruction: boolean + Only return cells that have morphological reconstructions. + + reporter_status: list + Return cells that have a particular cell reporter status. + + species: list + Filter for cells that belong to one or more species. If None, return all. + Must be one of [ CellTypesApi.MOUSE, CellTypesApi.HUMAN ]. + + Returns + ------- + list + Meta data for all cells. + """ + + if id: + criteria = "[id$eq'%d']" % id + else: + criteria = "[is_cell_specimen$eq'true'],products[name$in'Mouse Cell Types','Human Cell Types'],ephys_result[failed$eqfalse]" + + include = ('structure,cortex_layer,donor(transgenic_lines,organism,conditions),specimen_tags,cell_soma_locations,' + + 'ephys_features,data_sets,neuron_reconstructions,cell_reporter') + + cells = self.model_query( + 'Specimen', criteria=criteria, include=include, num_rows='all') + + for cell in cells: + # specimen tags + for tag in cell['specimen_tags']: + tag_name, tag_value = tag['name'].split(' - ') + tag_name = tag_name.replace(' ', '_') + cell[tag_name] = tag_value + + # morphology and reconstuction + cell['has_reconstruction'] = len( + cell['neuron_reconstructions']) > 0 + cell['has_morphology'] = len(cell['data_sets']) > 0 + + # transgenic line + cell['transgenic_line'] = None + for tl in cell['donor']['transgenic_lines']: + if tl['transgenic_line_type_name'] == 'driver': + cell['transgenic_line'] = tl['name'] + + # cell reporter status + cell['reporter_status'] = cell.get('cell_reporter', {}).get('name', None) + + # species + cell['species'] = cell.get('donor',{}).get('organism',{}).get('name', None) + + # conditions (whitelist) + condition_types = [ 'disease categories' ] + condition_keys = dict(zip(condition_types, + [ ct.replace(' ', '_') for ct in condition_types ])) + for ct, ck in condition_keys.items(): + cell[ck] = [] + + conditions = cell.get('donor',{}).get('conditions', []) + for condition in conditions: + c_type, c_val = condition['name'].split(' - ') + if c_type in condition_keys: + cell[condition_keys[c_type]].append(c_val) + + result = self.filter_cells(cells, require_morphology, require_reconstruction, reporter_status, species) + + return result + + def get_cell(self, id): + ''' + Query the API for a one cells in the Cell Types Database. + + + Returns + ------- + list + Meta data for one cell. + ''' + + cells = self.list_cells_api(id=id) + cell = None if not cells else cells[0] + return cell + + @cacheable() + def get_ephys_sweeps(self, specimen_id): + """ + Query the API for a list of sweeps for a particular cell in the Cell Types Database. + + Parameters + ---------- + specimen_id: int + Specimen ID of a cell. + + Returns + ------- + list: List of sweep dictionaries belonging to a cell + """ + criteria = "[specimen_id$eq%d]" % specimen_id + sweeps = self.model_query( + 'EphysSweep', criteria=criteria, num_rows='all') + return sorted(sweeps, key=lambda x: x['sweep_number']) + + + @deprecated("please use filter_cells_api") + def filter_cells(self, cells, require_morphology, require_reconstruction, reporter_status, species): + """ + Filter a list of cell specimens to those that optionally have morphologies + or have morphological reconstructions. + + Parameters + ---------- + + cells: list + List of cell metadata dictionaries to be filtered + + require_morphology: boolean + Filter out cells that have no morphological images. + + require_reconstruction: boolean + Filter out cells that have no morphological reconstructions. + + reporter_status: list + Filter for cells that have a particular cell reporter status + + species: list + Filter for cells that belong to one or more species. If None, return all. + Must be one of [ CellTypesApi.MOUSE, CellTypesApi.HUMAN ]. + """ + + if require_morphology: + cells = [c for c in cells if c['has_morphology']] + + if require_reconstruction: + cells = [c for c in cells if c['has_reconstruction']] + + if reporter_status: + cells = [c for c in cells if c[ + 'reporter_status'] in reporter_status] + + if species: + species_lower = [ s.lower() for s in species ] + cells = [c for c in cells if c['donor']['organism']['name'].lower() in species_lower] + + return cells + + def filter_cells_api(self, cells, + require_morphology=False, + require_reconstruction=False, + reporter_status=None, + species=None, + simple=True): + """ + """ + if require_morphology or require_reconstruction: + cells = [c for c in cells if c.get('nr__reconstruction_type') is not None] + + if reporter_status: + cells = [c for c in cells if c.get('cell_reporter_status') in reporter_status] + + if species: + species_lower = [ s.lower() for s in species ] + cells = [c for c in cells if c.get('donor__species',"").lower() in species_lower] + + if simple: + cells = self.simplify_cells_api(cells) + + return cells + + def simplify_cells_api(self, cells): + return [{ + 'reporter_status': cell['cell_reporter_status'], + 'cell_soma_location': [ cell['csl__x'], cell['csl__y'], cell['csl__z'] ], + 'species': cell['donor__species'], + 'id': cell['specimen__id'], + 'name': cell['specimen__name'], + 'structure_layer_name': cell['structure__layer'], + 'structure_area_id': cell['structure_parent__id'], + 'structure_area_abbrev': cell['structure_parent__acronym'], + 'transgenic_line': cell['line_name'], + 'dendrite_type': cell['tag__dendrite_type'], + 'apical': cell['tag__apical'], + 'reconstruction_type': cell['nr__reconstruction_type'], + 'disease_state': cell['donor__disease_state'], + 'donor_id': cell['donor__id'], + 'structure_hemisphere': cell['specimen__hemisphere'], + 'normalized_depth': cell['csl__normalized_depth'] + } for cell in cells ] + + @cacheable() + def get_ephys_features(self): + """ + Query the API for the full table of EphysFeatures for all cells. + """ + + return self.model_query( + 'EphysFeature', + criteria='specimen(ephys_result[failed$eqfalse])', + num_rows='all') + + @cacheable() + def get_morphology_features(self): + """ + Query the API for the full table of morphology features for all cells + + Notes + ----- + by default the tags column is removed because it isn't useful + """ + return self.model_query( + 'NeuronReconstruction', + criteria="specimen(ephys_result[failed$eqfalse])", + excpt='tags', + num_rows='all') + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=2, + path_keyword='file_name')) + def save_ephys_data(self, specimen_id, file_name): + """ + Save the electrophysology recordings for a cell as an NWB file. + + Parameters + ---------- + specimen_id: int + ID of the specimen, from the Specimens database model in the Allen Institute API. + + file_name: str + Path to save the NWB file. + """ + criteria = '[id$eq%d],ephys_result(well_known_files(well_known_file_type[name$eq%s]))' % ( + specimen_id, self.NWB_FILE_TYPE) + includes = 'ephys_result(well_known_files(well_known_file_type))' + + results = self.model_query('Specimen', + criteria=criteria, + include=includes, + num_rows='all') + + try: + file_url = results[0]['ephys_result'][ + 'well_known_files'][0]['download_link'] + except Exception as _: + raise Exception("Specimen %d has no ephys data" % specimen_id) + + self.retrieve_file_over_http(self.api_url + file_url, file_name) + + def save_reconstruction(self, specimen_id, file_name): + """ + Save the morphological reconstruction of a cell as an SWC file. + + Parameters + ---------- + specimen_id: int + ID of the specimen, from the Specimens database model in the Allen Institute API. + + file_name: str + Path to save the SWC file. + """ + + Manifest.safe_make_parent_dirs(file_name) + + criteria = '[id$eq%d],neuron_reconstructions(well_known_files)' % specimen_id + includes = 'neuron_reconstructions(well_known_files(well_known_file_type[name$eq\'%s\']))' % self.SWC_FILE_TYPE + + results = self.model_query('Specimen', + criteria=criteria, + include=includes, + num_rows='all') + + try: + file_url = results[0]['neuron_reconstructions'][ + 0]['well_known_files'][0]['download_link'] + except: + raise Exception("Specimen %d has no reconstruction" % specimen_id) + + self.retrieve_file_over_http(self.api_url + file_url, file_name) + + def save_reconstruction_markers(self, specimen_id, file_name): + """ + Save the marker file for the morphological reconstruction of a cell. These are + comma-delimited files indicating points of interest in a reconstruction (truncation + points, early tracing termination, etc). + + Parameters + ---------- + specimen_id: int + ID of the specimen, from the Specimens database model in the Allen Institute API. + + file_name: str + Path to save the marker file. + """ + + Manifest.safe_make_parent_dirs(file_name) + + criteria = '[id$eq%d],neuron_reconstructions(well_known_files)' % specimen_id + includes = 'neuron_reconstructions(well_known_files(well_known_file_type[name$eq\'%s\']))' % self.MARKER_FILE_TYPE + + results = self.model_query('Specimen', + criteria=criteria, + include=includes, + num_rows='all') + + try: + file_url = results[0]['neuron_reconstructions'][ + 0]['well_known_files'][0]['download_link'] + except: + raise LookupError("Specimen %d has no marker file" % specimen_id) + + self.retrieve_file_over_http(self.api_url + file_url, file_name) diff --git a/api/queries/connected_services.py b/api/queries/connected_services.py new file mode 100644 index 0000000000..17060012b5 --- /dev/null +++ b/api/queries/connected_services.py @@ -0,0 +1,1119 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .rma_api import RmaApi + + +class ConnectedServices(object): + ''' + A class representing a schema of informatics web services. + + Notes + ----- + See `Connected Services and Pipes `_ + for a human-readable list of services and parameters. + + The URL format is documented at + `Service Pipelines `_. + + Connected Services only include API services that are accessed + via the RMA endpoint using an rma::services stage. + ''' + ARRAY = 'array' + STRING = 'string' + INTEGER = 'integer' + FLOAT = 'float' + BOOLEAN = 'boolean' + + def __init__(self): + pass + + def build_url(self, service_name, kwargs): + '''Create a single stage RMA url from a service name and parameters. + ''' + rma = RmaApi() + fmt = kwargs.get('fmt', 'json') + + schema_entry = ConnectedServices._schema[service_name] + + params = [] + + for parameter in schema_entry['parameters']: + value = kwargs.get(parameter['name'], None) + if value is not None: + params.append((parameter['name'], value)) + + service_stage = rma.service_stage(service_name, + params) + + url = rma.build_query_url([service_stage], fmt) + + return url + + @classmethod + @property + def schema(cls): + '''Dictionary of service names and parameters. + + Notes + ----- + See `Connected Services and Pipes `_ + for a human-readable list of connected services and their parameters. + ''' + return cls._schema + + _schema = { + 'dev_human_correlation': { + 'parameters': [ + {'name': 'set', + 'optional': True, + 'type': STRING, + 'values': ['rna_seq_genes', + 'rna_seq_exons', + 'exon_microarray_genes' + 'exon_microarray_exons'] + }, + {'name': 'donors', + 'optional': True, + 'type': ARRAY + }, + {'name': 'structures', + 'optional': False, + 'type': ARRAY + }, + {'name': 'probes', + 'optional': False, + 'type': INTEGER + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': ['desc'] + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'dev_human_differential': { + 'parameters': [ + {'name': 'set', + 'type': STRING, + 'values': ['rna_seq_genes', + 'rna_seq_exons', + 'exon_microarray_genes', + 'exon_microarray_exons'] + }, + {'name': 'donors1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'donors2', + 'type': ARRAY, + 'optional': True, + 'array_type': INTEGER + }, + {'name': 'structures2', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'sort_by', + 'type': STRING, + 'optional': True, + 'values': ['p-value', 'fold-change'], + 'default': 'p-value' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'dev_human_expression': { + 'parameters': [ + {'name': 'set', + 'type': STRING, + 'values': ['rna_seq_genes', + 'rna_seq_exons', + 'exon_microarray_genes', + 'exon_microarray_exons'] + }, + {'name': 'probes', + 'type': INTEGER + }, + {'name': 'donors', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'dev_human_microarray_correlation': { + 'parameters': [ + {'name': 'donors', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING] + }, + {'name': 'probes', + 'type': INTEGER + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'dev_human_microarray_differential': { + 'parameters': [ + {'name': 'donors1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'donors2', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures2', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'sort_by', + 'type': STRING, + 'optional': True, + 'values': ['p-value', 'fold-change'], + 'default': 'p-value' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'dev_human_microarray_expression': { + 'parameters': [ + {'name': 'probes', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + }, + {'name': 'donors', + 'type': INTEGER, + 'optional': True, + }, + {'name': 'structures', + 'type': INTEGER, + 'optional': True + } + ] + }, + 'dev_mouse_agea': { + 'parameters': [ + {'name': 'seed_age', + 'type': STRING + }, + {'name': 'map_age', + 'type': STRING + }, + {'name': 'seed_point', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'seed_threshold', + 'type': ARRAY, + 'array_type': FLOAT + }, + {'name': 'map_threshold', + 'type': ARRAY, + 'array_type': FLOAT + }, + {'name': 'contrast_threshold', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'target_threshold', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'dev_mouse_correlation': { + 'parameters': [ + {'name': 'row', + 'type': INTEGER + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'ages', + 'type': ARRAY, + 'array_type': STRING, + 'optional': True + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'gbm_correlation': { + 'parameters': [ + {'name': 'donors', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING] + }, + {'name': 'probes', + 'type': INTEGER + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'gbm_differential': { + 'parameters': [ + {'name': 'donors1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'donors2', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures2', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'sort_by', + 'type': STRING, + 'optional': True, + 'values': ['p-value', 'fold-change'], + 'default': 'p-value' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'gbm_expression': { + 'parameters': [ + {'name': 'probes', + 'type': INTEGER, + 'array_type': INTEGER + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + }, + {'name': 'donors', + 'type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': INTEGER, + 'optional': True + } + ] + }, + 'gbm_ish_differential': { + 'parameters': [ + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'structures2', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'threshold1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'threshold2', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'gbm_ish_expression': { + 'parameters': [ + {'name': 'structures', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'threshold', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'human_microarray_correlation': { + 'parameters': [ + {'name': 'donors', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING] + }, + {'name': 'probes', + 'type': INTEGER + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'human_microarray_differential': { + 'parameters': [ + {'name': 'donors1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'donors2', + 'type': ARRAY, + 'optional': True, + 'array_type': INTEGER + }, + {'name': 'structures2', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'sort_by', + 'type': STRING, + 'values': ['p-value', 'fold-change'], + 'default': 'p-value' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'human_microarray_expression': { + 'parameters': [ + {'name': 'probes', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'donors', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'mouse_agea': { + 'parameters': [ + {'name': 'set', + 'type': STRING + }, + {'name': 'seed_age', + 'type': STRING + }, + {'name': 'map_age', + 'type': STRING + }, + {'name': 'seed_point', + 'type': ARRAY, + 'array_type': FLOAT + }, + {'name': 'correlation_threshold1', + 'type': FLOAT, + 'optional': True, + }, + {'name': 'correlation_threshold2', + 'type': FLOAT, + 'optional': True + }, + {'name': 'threshold1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'threshold2', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'mouse_correlation': { + 'parameters': [ + {'name': 'set', + 'type': STRING, + 'values': ['mouse', 'mouse_coronal'] + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'row', + 'type': INTEGER + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'mouse_differential': { + 'parameters': [ + {'name': 'set', + 'type': STRING, + 'values': ['mouse', 'mouse_coronal'] + }, + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'structures2', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'threshold1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'threshold2', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'mouse_connectivity_correlation': { + 'parameters': [ + {'name': 'row', + 'type': INTEGER + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'product_ids', + 'type': ARRAY, + 'array_type': [INTEGER], + 'optional': True + }, + {'name': 'hemisphere', + 'type': STRING, + 'optional': True, + 'values': ['right', 'left'] + }, + {'name': 'transgenic_lines', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'injection_structures', + 'type': 'Array', + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'primary_structure_only', + 'type': BOOLEAN, + 'optional': True, + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'mouse_connectivity_injection_coordinate': { + 'parameters': [ + {'name': 'seed_point', + 'type': ARRAY, + 'array_type': FLOAT, + 'optional': False, + }, + {'name': 'transgenic_lines', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'injection_structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'product_ids', + 'type': ARRAY, + 'array_type': [INTEGER], + 'optional': True + }, + {'name': 'primary_structure_only', + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'mouse_connectivity_injection_structure': { + 'parameters': [ + {'name': 'injection_structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING] + }, + {'name': 'target_domain', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'injection_hemisphere', + 'type': STRING, + 'optional': True, + 'values': ['right', 'left'] + }, + {'name': 'target_hemisphere', + 'type': STRING, + 'optional': True, + 'values': ['right', 'left'] + }, + {'name': 'transgenic_lines', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'injection_domain', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'product_ids', + 'type': ARRAY, + 'array_type': [INTEGER], + 'optional': True + }, + {'name': 'primary_structure_only', + 'type': BOOLEAN, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'mouse_connectivity_target_spatial': { + 'parameters': [ + {'name': 'seed_point', + 'type': ARRAY, + 'array_type': FLOAT, + }, + {'name': 'transgenic_lines', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'section_data_set', + 'type': INTEGER, + 'optional': True + }, + {'name': 'injection_structures', + 'type': ARRAY, + 'array_type': [INTEGER, STRING], + 'optional': True + }, + {'name': 'product_ids', + 'type': ARRAY, + 'array_type': [INTEGER], + 'optional': True + }, + {'name': 'primary_structure_only', + 'type': BOOLEAN, + 'optional': True + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'nhp_lmd_microarray_correlation': { + 'parameters': [ + {'name': 'donors', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': INTEGER, + }, + {'name': 'probes', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'nhp_lmd_microarray_differential': { + 'parameters': [ + {'name': 'donors1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'donors2', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures2', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'sort_by', + 'type': STRING, + 'optional': True, + 'values': ['p-value', 'fold-change'], + 'default': 'p-value' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'nhp_lmd_microarray_expression': { + 'parameters': [ + {'name': 'probes', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'nhp_macro_microarray_correlation': { + 'parameters': [ + {'name': 'donors', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'probes', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'sort_order', + 'type': STRING, + 'optional': True, + 'values': ['asc', 'desc'], + 'default': 'desc' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'nhp_macro_microarray_differential': { + 'parameters': [ + {'name': 'donors1', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures1', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'donors2', + 'type': ARRAY, + 'array_type': INTEGER, + 'optional': True + }, + {'name': 'structures2', + 'array_type': INTEGER, + 'type': ARRAY + }, + {'name': 'sort_by', + 'type': STRING, + 'optional': True, + 'values': ['p-value', 'fold-change'], + 'default': 'p-value' + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'nhp_macro_microarray_expression': { + 'parameters': [ + {'name': 'probes', + 'type': ARRAY, + 'array_type': INTEGER + }, + {'name': 'start_row', + 'type': INTEGER, + 'optional': True, + 'default': 0 + }, + {'name': 'num_rows', + 'type': INTEGER, + 'optional': True, + 'default': 2000 + } + ] + }, + 'text_search': { + 'parameters': [ + {'name': 'query_string', + 'type': STRING + }, + {'name': 'k', + 'type': STRING + } + ] + } + } diff --git a/api/queries/glif_api.py b/api/queries/glif_api.py new file mode 100644 index 0000000000..35d682bad5 --- /dev/null +++ b/api/queries/glif_api.py @@ -0,0 +1,250 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import simplejson as json +import logging +from ...deprecated import deprecated +from .rma_template import RmaTemplate + + +class GlifApi(RmaTemplate): + + _log = logging.getLogger('allensdk.api.queries.glif_api') + + NWB_FILE_TYPE = None + GLIF_TYPES = [ 395310498, 395310469, 395310475, 395310479, 471355161 ] + + rma_templates = \ + {"glif_queries": [ + {'name': 'neuronal_model_templates', + 'description': 'see name', + 'model': 'NeuronalModelTemplate', + 'num_rows': 'all', + 'count': False, + }, + {'name': 'neuronal_models', + 'description': 'see name', + 'model': 'Specimen', + 'include': 'neuronal_models(well_known_files,neuronal_model_template[id$in' + ','.join(map(str,GLIF_TYPES)) + '],neuronal_model_runs(well_known_files))', + 'criteria':'{% if ephys_experiment_ids is defined %}[id$in{{ ephys_experiment_ids }}]{%endif%}', + 'num_rows': 'all', + 'criteria_params':['ephys_experiment_ids'], + 'count': False, + }, + {'name': 'neuron_config', + 'description': 'see name', + 'model': 'NeuronalModel', + 'include': 'well_known_files(well_known_file_type)', + 'criteria':'[id$in{{ neuronal_model_ids }}]', + 'num_rows': 'all', + 'criteria_params':['neuronal_model_ids'], + 'count': False, + } + ] + } + + def __init__(self, base_uri=None): + super(GlifApi, self).__init__(base_uri, query_manifest=GlifApi.rma_templates) + + def get_neuronal_model_templates(self): + + return self.template_query('glif_queries', + 'neuronal_model_templates') + + def get_neuronal_models(self, ephys_experiment_ids=None): + return self.template_query('glif_queries', + 'neuronal_models', ephys_experiment_ids=ephys_experiment_ids) + + def get_neuronal_models_by_id(self, neuronal_model_ids=None): + return self.template_query('glif_queries', + 'neuron_config', neuronal_model_ids=neuronal_model_ids) + + def get_neuron_configs(self, neuronal_model_ids=None): + + data = self.template_query('glif_queries', + 'neuron_config', neuronal_model_ids=neuronal_model_ids) + + return_dict = {} + for curr_config in data: + neuron_config_url = curr_config['well_known_files'][0]['download_link'] + return_dict[curr_config['id']] = self.retrieve_parsed_json_over_http(self.api_url + + neuron_config_url) + + return return_dict + + + @deprecated() + def list_neuronal_models(self): + ''' DEPRECATED Query the API for a list of all GLIF neuronal models. + + Returns + ------- + list + Meta data for all GLIF neuronal models. + ''' + + include = "specimen(ephys_result[failed$eqfalse]),neuronal_model_template[name$il'*LIF*']" + + return self.model_query('NeuronalModel', + include=include, + num_rows='all') + + @deprecated() + def get_neuronal_model(self, neuronal_model_id): + '''DEPRECATED Query the current RMA endpoint with a neuronal_model id + to get the corresponding well known files and meta data. + + Returns + ------- + dict + A dictionary containing + ''' + + + include = ('neuronal_model_template(well_known_files(well_known_file_type)),' + + 'specimen(ephys_sweeps,ephys_result(well_known_files(well_known_file_type))),' + + 'well_known_files(well_known_file_type)') + + criteria = "[id$eq%d]" % neuronal_model_id + + self.neuronal_model = self.model_query('NeuronalModel', + criteria=criteria, + include=include, + num_rows='all')[0] + + self.ephys_sweeps = None + self.neuron_config_url = None + self.stimulus_url = None + + # sweeps come from the specimen + try: + specimen = self.neuronal_model['specimen'] + self.ephys_sweeps = specimen['ephys_sweeps'] + except Exception as e: + logging.info(e.args) + self.ephys_sweeps = None + + if self.ephys_sweeps is None: + logging.warning( + "Could not find ephys_sweeps for this model (%d)" % self.neuronal_model['id']) + + # neuron config file comes from the neuronal model's well known files + try: + for wkf in self.neuronal_model['well_known_files']: + if wkf['path'].endswith('neuron_config.json'): + self.neuron_config_url = wkf['download_link'] + break + except Exception as e: + self.neuron_config_url = None + + if self.neuron_config_url is None: + logging.warning( + "Could not find neuron config well_known_file for this model (%d)" % self.neuronal_model['id']) + + # NWB file comes from the ephys_result's well known files + try: + ephys_result = specimen['ephys_result'] + for wkf in ephys_result['well_known_files']: + if wkf['well_known_file_type']['name'] == 'NWBDownload': + self.stimulus_url = wkf['download_link'] + break + except Exception as e: + self.stimulus_url = None + + if self.stimulus_url is None: + logging.warning( + "Could not find stimulus well_known_file for this model (%d)" % self.neuronal_model['id']) + + self.metadata = { + 'neuron_config_url': self.neuron_config_url, + 'stimulus_url': self.stimulus_url, + 'ephys_sweeps': self.ephys_sweeps, + 'neuronal_model': self.neuronal_model + } + + return self.metadata + + @deprecated() + def get_ephys_sweeps(self): + ''' DEPRECATED Retrieve ephys sweep information out of downloaded metadata for a neuronal model + + Returns + ------- + list + A list of sweeps metadata dictionaries + ''' + + return self.ephys_sweeps + + @deprecated() + def get_neuron_config(self, output_file_name=None): + ''' DEPRECATED Retrieve a model configuration file from the API, optionally save it to disk, and + return the contents of that file as a dictionary. + + Parameters + ---------- + output_file_name: string + File name to store the neuron configuration (optional). + ''' + + if self.neuron_config_url is None: + raise Exception("URL for neuron config file is empty.") + + logging.info(self.api_url + self.neuron_config_url) + + neuron_config = self.retrieve_parsed_json_over_http( + self.api_url + self.neuron_config_url) + + if output_file_name: + with open(output_file_name, 'wb') as f: + f.write(json.dumps(neuron_config, indent=2)) + + return neuron_config + + @deprecated() + def cache_stimulus_file(self, output_file_name): + ''' DEPRECATED Download the NWB file for the current neuronal model and save it to a file. + + Parameters + ---------- + output_file_name: string + File name to store the NWB file. + ''' + + if self.stimulus_url is None: + raise Exception("URL for stimulus file is empty.") + + self.retrieve_file_over_http( + self.api_url + self.metadata['stimulus_url'], output_file_name) diff --git a/api/queries/grid_data_api.py b/api/queries/grid_data_api.py new file mode 100644 index 0000000000..9702326a72 --- /dev/null +++ b/api/queries/grid_data_api.py @@ -0,0 +1,252 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from allensdk.api.warehouse_cache.cache import cacheable +from allensdk.deprecated import deprecated +from .rma_api import RmaApi + + +class GridDataApi(RmaApi): + '''HTTP Client for the Allen 3-D Expression Grid Data Service. + + See: `Downloading 3-D Expression Grid Data `_ + ''' + + INJECTION_DENSITY = 'injection_density' + PROJECTION_DENSITY = 'projection_density' + INJECTION_FRACTION = 'injection_fraction' + INJECTION_ENERGY = 'injection_energy' + PROJECTION_ENERGY = 'projection_energy' + DATA_MASK = 'data_mask' + + ENERGY = 'energy' + DENSITY = 'density' + INTENSITY = 'intensity' + + def __init__(self, + resolution=None, + base_uri=None): + super(GridDataApi, self).__init__(base_uri) + + if resolution is None: + resolution = 25 + self.resolution = resolution + + + def download_gene_expression_grid_data(self, + section_data_set_id, + volume_type, + path): + ''' Download a metaimage file containing registered gene expression grid data + + Parameters + ---------- + section_data_set_id : int + Download data from this experiment + volume_type : str + Download this type of data (options are GridDataApi.ENERGY, + GridDataApi.DENSITY, GridDataApi.INTENSITY) + path : str + Download to this path + + ''' + + include = '?include={}'.format(volume_type) + url = ''.join([self.grid_data_endpoint, '/download/', str(section_data_set_id), include]) + self.retrieve_file_over_http(url, path, zipped=True) + + + @deprecated(message='Use download_gene_expression_grid_data instead') + def download_expression_grid_data(self, + section_data_set_id, + include=None, + path=None): + '''Download in zipped metaimage format. + + Parameters + ---------- + section_data_set_id : integer + What to download. + include : list of strings, optional + Image volumes. 'energy' (default), 'density', 'intensity'. + path : string, optional + File name to save as. + + Returns + ------- + file : 3-D expression grid data packaged into a compressed archive file (.zip). + + Notes + ----- + ''' + if include is not None: + include_clause = ''.join(['?include=', + ','.join(include)]) + else: + include_clause = '' + + url = ''.join([self.grid_data_endpoint, + '/download/', + str(section_data_set_id), + include_clause]) + + if path is None: + path = str(section_data_set_id) + '.zip' + + self.retrieve_file_over_http(url, path) + + def download_projection_grid_data(self, + section_data_set_id, + image=None, + resolution=None, + save_file_path=None): + '''Download in NRRD format. + + Parameters + ---------- + section_data_set_id : integer + What to download. + image : list of strings, optional + Image volume. 'projection_density', 'projection_energy', 'injection_fraction', 'injection_density', 'injection_energy', 'data_mask'. + resolution : integer, optional + in microns. 10, 25, 50, or 100 (default). + save_file_path : string, optional + File name to save as. + + Notes + ----- + See `Downloading 3-D Projection Grid Data `_ + for additional documentation. + ''' + params_list = [] + + if image is not None: + params_list.append('image=' + ','.join(image)) + + if resolution is not None: + params_list.append('resolution=%d' % (resolution)) + + if len(params_list) > 0: + params_clause = '?' + '&'.join(params_list) + else: + params_clause = '' + + url = ''.join([self.grid_data_endpoint, + '/download_file/', + str(section_data_set_id), + params_clause]) + + if save_file_path is None: + save_file_path = str(section_data_set_id) + '.nrrd' + + self.retrieve_file_over_http(url, save_file_path) + + + def download_deformation_field(self, + section_data_set_id, + header_path=None, + voxel_path=None, + voxel_type='DeformationFieldVoxels', + header_type='DeformationFieldHeader' + ): + ''' Download the local alignment parameters for this dataset. This a 3D vector image (3 components) describing + a deformable local mapping from CCF voxels to this section data set's affine-aligned image stack. + + Parameters + ---------- + section_data_set_id : int + Download the deformation field for this data set + header_path : str, optional + If supplied, the deformation field header will be downloaded to this path. + voxel_path : str, optiona + If supplied, the deformation field voxels will be downloaded to this path. + voxel_type : str + WellKnownFileType of this dataset's data file + header_type : str + WellKnownFileType of this dataset's header file + ''' + + header_path = '{}_dfmfld.mhd'.format(section_data_set_id) if header_path is None else header_path + voxel_path = '{}_dfmfld.raw'.format(section_data_set_id) if voxel_path is None else voxel_path + + well_known_files = self.model_query( + model='WellKnownFile', + filters={'attachable_id': section_data_set_id}, + criteria='well_known_file_type[name$in\'DeformationFieldHeader\',\'DeformationFieldVoxels\']', + include='well_known_file_type' + ) + + well_known_file_urls = { + wkf['well_known_file_type']['name']: + self.construct_well_known_file_download_url(wkf['id']) for wkf in well_known_files + } + + self.retrieve_file_over_http(well_known_file_urls[header_type], header_path) + self.retrieve_file_over_http(well_known_file_urls[voxel_type], voxel_path) + + + @cacheable() + def download_alignment3d(self, section_data_set_id, num_rows='all', count=False, **kwargs): + ''' Download the parameters of the 3D affine tranformation mapping this section data set's image-space stack to + CCF-space (or vice-versa). + + Parameters + ---------- + section_data_set_id : int + download the parameters for this data set. + + Returns + ------- + dict : + parameters of this section data set's alignment3d + ''' + + results = self.model_query( + model='SectionDataSet', + filters={'id': section_data_set_id}, + include='alignment3d', + num_rows=num_rows, + count=count, + **kwargs + ) + + results = [result for result in results if 'alignment3d' in result] + if len(results) == 0: + raise ValueError('no SectionDataSet with attached alignment3d found for id {}'.format(section_data_set_id)) + elif len(results) > 1: + raise ValueError('found multiple SectionDataSets with attached alignment3ds for id {}: {}'.format(section_data_set_id, results)) + + return results[0]['alignment3d'] diff --git a/api/queries/image_download_api.py b/api/queries/image_download_api.py new file mode 100644 index 0000000000..d4685e3b62 --- /dev/null +++ b/api/queries/image_download_api.py @@ -0,0 +1,500 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .rma_template import RmaTemplate +from allensdk.api.warehouse_cache.cache import cacheable +from six import string_types + + +class ImageDownloadApi(RmaTemplate): + '''HTTP Client to download whole or partial two-dimensional images from the Allen Institute + with the SectionImage, AtlasImage and ProjectionImage Download Services. + + See `Downloading an Image `_ + for more documentation. + ''' + + _FILTER_TYPES = [ 'range', 'rgb', 'contrast' ] + COLORMAPS = { "gray": 0, + "hotmetal": 1, + "jet": 2, + "redtemp": 3, + "expression": 4, + "red": 5, + "blue": 6, + "green": 7, + "aba": 8, + "aibsmap_alt": 9, + "colormap": 10, + "projection": 11 + } + + rma_templates = \ + {"image_queries": [ + {'name': 'section_image_ranges', + 'description': 'see name', + 'model': 'Equalization', + 'num_rows': 'all', + 'count': False, + 'only': ['blue_lower', 'blue_upper', 'red_lower', 'red_upper', 'green_lower', 'green_upper'], + 'criteria': 'section_data_set(section_images[id$in{{ section_image_ids }}])', + 'criteria_params': ['section_image_ids'] + }, + {'name': 'section_images_by_data_set_id', + 'description': 'see name', + 'model': 'SectionImage', + 'num_rows': 'all', + 'count': False, + 'criteria': '[data_set_id$eq{{ data_set_id }}]', + 'criteria_params': ['data_set_id'] + }, + {'name': 'section_data_sets_by_product_id', + 'description': 'see name', + 'model': 'SectionDataSet', + 'num_rows': 'all', + 'count': False, + 'criteria': '[failed$in{{failed}}],products[id$in{{ product_ids }}]', + 'criteria_params': ['product_ids', 'failed'] + }]} + + def __init__(self, base_uri=None): + super(ImageDownloadApi, self).__init__(base_uri, query_manifest=ImageDownloadApi.rma_templates) + + @cacheable() + def get_section_image_ranges(self, section_image_ids, num_rows='all', count=False, as_lists=True, **kwargs): + '''Section images from the Mouse Connectivity Atlas are displayed on connectivity.brain-map.org after having been + linearly windowed and leveled. This method obtains parameters defining channelwise upper and lower bounds of the windows used for + one or more images. + + Parameters + ---------- + section_image_ids : list of int + Each element is a unique identifier for a section image. + num_rows : int, optional + how many records to retrieve. Default is 'all'. + count : bool, optional + If True, return a count of the lines found by the query. Default is False. + as_lists : bool, optional + If True, return the window parameters in a list, rather than a dict + (this is the format of the range parameter on ImageDownloadApi.download_image). + Default is False. + + Returns + ------- + list of dict or list of list : + For each section image id provided, return the window bounds for each channel. + + ''' + + dict_ranges = self.template_query('image_queries', 'section_image_ranges', + section_image_ids=section_image_ids, + num_rows=num_rows, count=count) + + if not as_lists: + return dict_ranges + + list_ranges = [] + for rng in dict_ranges: + list_ranges.append([ rng['red_lower'], rng['red_upper'], rng['green_lower'], rng['green_upper'], rng['blue_lower'], rng['blue_upper'] ]) + + return list_ranges + + + @cacheable() + def get_section_data_sets_by_product(self, product_ids, include_failed=False, num_rows='all', count=False, **kwargs): + '''List all of the section data sets produced as part of one or more products + + Parameters + ---------- + product_ids : list of int + Integer specifiers for Allen Institute products. A product is a set of related data. + include_failed : bool, optional + If True, find both failed and passed datasets. Default is False + num_rows : int, optional + how many records to retrieve. Default is 'all'. + count : bool, optional + If True, return a count of the lines found by the query. Default is False. + + Returns + ------- + list of dict : + Each returned element is a section data set record. + + Notes + ----- + See http://api.brain-map.org/api/v2/data/query.json?criteria=model::Product for a list of products. + + ''' + + if include_failed: + failed_crit = "\'false\',\'true\'" + else: + failed_crit = "\'false\'" + + return self.template_query('image_queries', 'section_data_sets_by_product_id', + product_ids=product_ids, + failed=failed_crit, + num_rows=num_rows, count=count) + + + @cacheable() + def section_image_query(self, section_data_set_id, num_rows='all', count=False, **kwargs): + '''List section images belonging to a specified section data set + + Parameters + ---------- + atlas_id : integer, optional + Find images from this section data set. + num_rows : int + how many records to retrieve. Default is 'all' + count : bool + If True, return a count of the lines found by the query. + + Returns + ------- + list of dict : + Each element is an SectionImage record. + + Notes + ----- + The SectionDataSet model is used to represent single experiments which produce an array of images. + This includes Mouse Connectivity and Mouse Brain Atlas experiments, among other projects. + You may see references to the ids of experiments from those projects. + These are the same as section data set ids. + ''' + + return self.template_query('image_queries', 'section_images_by_data_set_id', + data_set_id=section_data_set_id, + num_rows=num_rows, count=count) + + def download_section_image(self, + section_image_id, + file_path=None, + **kwargs): + self.download_image(section_image_id, + file_path, + endpoint=self.section_image_download_endpoint, + **kwargs) + + def download_atlas_image(self, + atlas_image_id, + file_path=None, + **kwargs): + self.download_image(atlas_image_id, + file_path, + endpoint=self.atlas_image_download_endpoint, + **kwargs) + + def download_projection_image(self, + projection_image_id, + file_path=None, + **kwargs): + self.download_image(projection_image_id, + file_path, + endpoint=self.projection_image_download_endpoint, + **kwargs) + + def download_image(self, + image_id, + file_path=None, + endpoint=None, + **kwargs): + ''' Download whole or partial two-dimensional images + from the Allen Institute with the SectionImage or AtlasImage service. + + Parameters + ---------- + image_id : integer + SubImage to download. + file_path : string, optional + where to put it, defaults to image_id.jpg + downsample : int, optional + Number of times to downsample the original image. + quality : int, optional + jpeg quality of the returned image, 0 to 100 (default) + expression : boolean, optional + Request the expression mask for the SectionImage. + view : string, optional + 'expression', 'projection', 'tumor_feature_annotation' + or 'tumor_feature_boundary' + top : int, optional + Index of the topmost row of the region of interest. + left :int, optional + Index of the leftmost column of the region of interest. + width : int, optional + Number of columns in the output image. + height : int, optional + Number of rows in the output image. + range : list of ints, optional + Filter to specify the RGB channels. low,high,low,high,low,high + colormap : list of floats, optional + Filter to specify the RGB channels. [lower_threshold,colormap] + gain 0-1, colormap id is a string from ImageDownloadApi.COLORMAPS + rgb : list of floats, optional + Filter to specify the RGB channels. [red,green,blue] 0-1 + contrast : list of floats, optional + Filter to specify contrast parameters. [gain,bias] 0-1 + annotation : boolean, optional + Request the annotated AtlasImage + atlas : int, optional + Specify the desired Atlas' annotations. + projection : boolean, optional + Request projection for the specified image. + downsample_dimensions : boolean, optional + Indicates if the width and height should be adjusted + to account for downsampling. + + Returns + ------- + None + the file is downloaded and saved to the path. + + Notes + ----- + By default, an unfiltered full-sized image with the highest quality + is returned as a download if no parameters are provided. + + 'downsample=1' halves the number of pixels of the original image + both horizontally and vertically. range_list = kwargs.get('range', None) + + + Specifying 'downsample=2' quarters the height and width values. + + Quality must be an integer from 0, for the lowest quality, + up to as high as 100. If it is not specified, + it defaults to the highest quality. + + Top is specified in full-resolution (largest tier) pixel coordinates. + SectionImage.y is the default value. + + Left is specified in full-resolution (largest tier) pixel coordinates. + SectionImage.x is the default value. + + Width is specified in tier-resolution (desired tier) pixel coordinates. + SectionImage.width is the default value. It is automatically adjusted when downsampled. + + Height is specified in tier-resolution (desired tier) pixel coordinates. + SectionImage.height is the default value. It is automatically adjusted when downsampled. + + The range parameter consists of 6 comma delimited integers + that define the lower (0) and upper (4095) bound for each channel in red-green-blue order + (i.e. "range=0,1500,0,1000,0,4095"). + The default range values can be determined by referring to the following fields + on the Equalization model associated with the SectionDataSet: + red_lower, red_uppper, green_lower, green_upper, blue_lower, blue_upper. + For more information, see the + `Image Controls `_ + section of the Allen Mouse Brain Connectivity Atlas: + `Projection Dataset `_ + help topic. + See: `Image Download Service `_ + ''' + params = [] + + if endpoint is None: + endpoint = self.image_download_endpoint + + downsample = kwargs.get('downsample', None) + + if downsample is not None: + params.append('downsample=%d' % (downsample)) + + quality = kwargs.get('quality', None) + + if quality is not None: + params.append('quality=%d' % (quality)) + + tumor_feature_annotation = kwargs.get('tumor_feature_annotation', None) + + if tumor_feature_annotation is not None: + if tumor_feature_annotation: + params.append('tumor_feature_annotation=true') + else: + params.append('tumor_feature_annotation=false') + + tumor_feature_boundary = kwargs.get('tumor_feature_boundary', None) + + if tumor_feature_boundary is not None: + if tumor_feature_boundary: + params.append('tumor_feature_boundary=true') + else: + params.append('tumor_feature_boundary=false') + + annotation = kwargs.get('annotation', None) + + if annotation is not None: + if annotation is True: + params.append('annotation=true') + else: + params.append('annotation=false') + + atlas = kwargs.get('atlas', None) + + if atlas is not None: + params.append('atlas=%d' % (atlas)) + + projection = kwargs.get('projection', None) + + if projection is not None: + if projection is True: + params.append('projection=true') + else: + params.append('projection=false') + + expression = kwargs.get('expression', None) + + if expression is not None: + if expression: + params.append('expression=true') + else: + params.append('expression=false') + + colormap_filter = kwargs.get('colormap', None) + + if colormap_filter is not None: + if isinstance(colormap_filter, string_types): + params.append('colormap=%s' % (colormap_filter)) + else: + lower_threshold = colormap_filter[0] + colormap_id = ImageDownloadApi.COLORMAPS[colormap_filter[1]] + filter_values_list = '0.5,%s,0,256,%d' % (str(lower_threshold), + colormap_id) + params.append('colormap=%s' % (filter_values_list)) + + # see + # http://api.brain-map.org/api/v2/data/SectionDataSet/100141599.xml?include=equalization,section_images + for filter_type in ImageDownloadApi._FILTER_TYPES: + filter_values = kwargs.get(filter_type, None) + + if filter_values is not None: + filter_values_list = ','.join(str(r) for r in filter_values) + params.append('%s=%s' % (filter_type, filter_values_list)) + + view = kwargs.get('view', None) + + if view is not None: + if view in ['expression', + 'projection', + 'tumor_feature_annotation', + 'tumor_feature_boundary']: + params.append('view=%s' % (view)) + else: + raise ValueError("view argument should be 'expression', 'projection', 'tumor_feature_annotation' or 'tumor_feature_boundary'") + + # region of interest + for roi_key in ['left', 'top', 'width', 'height']: + roi_value = kwargs.get(roi_key, None) + if roi_value is not None: + params.append('%s=%d' % (roi_key, roi_value)) + + downsample_dimensions = kwargs.get('downsample_dimensions', None) + + if downsample_dimensions is not None: + if downsample_dimensions: + params.append('downsample_dimensions=true') + else: + params.append('downsample_dimensions=false') + + if len(params) > 0: + url_params = "?" + "&".join(params) + else: + url_params = '' + + image_url = ''.join([endpoint, + '/', + str(image_id), + url_params]) + + if file_path is None: + file_path = '%d.jpg' % (image_id) + + self.retrieve_file_over_http(image_url, file_path) + + + def atlas_image_query(self, atlas_id, image_type_name=None): + '''List atlas images belonging to a specified atlas + + Parameters + ---------- + atlas_id : integer, optional + Find images from this atlas. + image_type_name : string, optional + Restrict response to images of this type. If not provided, + the query will get it from the atlas id. + + Returns + ------- + list of dict : + Each element is an AtlasImage record. + + Notes + ----- + See `Downloading Atlas Images and Graphics `_ + for additional documentation. + :py:meth:`allensdk.api.queries.ontologies_api.OntologiesApi.get_atlases` can also be used to list atlases along with their ids. + ''' + + stages = [] + + if image_type_name is None: + atlas_stage = self.model_stage('Atlas', + criteria='[id$eq%d]' % (atlas_id), + only=['image_type']) + stages.append(atlas_stage) + + atlas_name_pipe_stage = self.pipe_stage('list', + parameters=[('type_name', + self.IS, + self.quote_string('image_type'))]) + stages.append(atlas_name_pipe_stage) + + image_type_name = '$type_name' + else: + image_type_name = self.quote_string(image_type_name) + + criteria_list = ['[annotated$eqtrue],', + 'atlas_data_set(atlases[id$eq%d]),' % (atlas_id), + "alternate_images[image_type$eq%s]" % (image_type_name)] + + atlas_image_model_stage = self.model_stage('AtlasImage', + criteria=criteria_list, + order=[ + 'sub_images.section_number'], + num_rows='all') + + stages.append(atlas_image_model_stage) + + return self.json_msg_query( + self.build_query_url(stages)) diff --git a/api/queries/mouse_atlas_api.py b/api/queries/mouse_atlas_api.py new file mode 100644 index 0000000000..b02dada34f --- /dev/null +++ b/api/queries/mouse_atlas_api.py @@ -0,0 +1,150 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2018. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from allensdk.core import sitk_utilities +from allensdk.api.warehouse_cache.cache import Cache, cacheable + +from .reference_space_api import ReferenceSpaceApi +from .grid_data_api import GridDataApi +from .rma_pager import pageable + + + +class MouseAtlasApi(ReferenceSpaceApi, GridDataApi): + ''' Downloads Mouse Brain Atlas grid data, reference volumes, and metadata. + ''' + + MOUSE_ATLAS_PRODUCTS = (1,) + DEVMOUSE_ATLAS_PRODUCTS = (3,) + MOUSE_ORGANISM = (2,) + HUMAN_ORGANISM = (1,) + + @cacheable() + @pageable(num_rows=2000, total_rows='all') + def get_section_data_sets(self, gene_ids=None, product_ids=None, **kwargs): + ''' Download a list of section data sets (experiments) from the Mouse Brain + Atlas project. + + Parameters + ---------- + gene_ids : list of int, optional + Filter results based on the genes whose expression was characterized + in each experiment. Default is all. + product_ids : list of int, optional + Filter results to a subset of products. Default is the Mouse Brain Atlas. + + Returns + ------- + list of dict : + Each element is a section data set record, with one or more gene + records nested in a list. + + ''' + + if product_ids is None: + product_ids = list(self.MOUSE_ATLAS_PRODUCTS) + criteria = 'products[id$in{}]'.format(','.join(map(str, product_ids))) + + if gene_ids is not None: + criteria += ',genes[id$in{}]'.format(','.join(map(str, gene_ids))) + + order = kwargs.pop('order', ['\'id\'']) + + return self.model_query(model='SectionDataSet', + criteria=criteria, + include='genes', + order=order, + **kwargs) + + @cacheable() + @pageable(num_rows=2000, total_rows='all') + def get_genes(self, organism_ids=None, chromosome_ids=None, **kwargs): + ''' Download a list of genes + + Parameters + ---------- + organism_ids : list of int, optional + Filter genes to those appearing in these organisms. Defaults to mouse (2). + chromosome_ids : list of int, optional + Filter genes to those appearing on these chromosomes. Defaults to all. + + Returns + ------- + list of dict: + Each element is a gene record, with a nested chromosome record (also a dict). + + ''' + + if organism_ids is None: + organism_ids = list(self.MOUSE_ORGANISM) + criteria = '[organism_id$in{}]'.format(','.join(map(str, organism_ids))) + + if chromosome_ids is not None: + criteria += ',[chromosome_id$in{}]'.format(','.join(map(str, chromosome_ids))) + + order = kwargs.pop('order', ['\'id\'']) + + return self.model_query(model='Gene', + criteria=criteria, + include='chromosome', + order=order, + **kwargs) + + @cacheable(strategy='create', + reader = sitk_utilities.read_ndarray_with_sitk, + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_expression_density(self, path, experiment_id): + self.download_gene_expression_grid_data( + experiment_id, GridDataApi.DENSITY, path) + + + @cacheable(strategy='create', + reader = sitk_utilities.read_ndarray_with_sitk, + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_expression_energy(self, path, experiment_id): + self.download_gene_expression_grid_data( + experiment_id, GridDataApi.ENERGY, path) + + + @cacheable(strategy='create', + reader = sitk_utilities.read_ndarray_with_sitk, + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_expression_intensity(self, path, experiment_id): + self.download_gene_expression_grid_data( + experiment_id, GridDataApi.INTENSITY, path) diff --git a/api/queries/mouse_connectivity_api.py b/api/queries/mouse_connectivity_api.py new file mode 100644 index 0000000000..5fb6a8c0ed --- /dev/null +++ b/api/queries/mouse_connectivity_api.py @@ -0,0 +1,505 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .reference_space_api import ReferenceSpaceApi +from .grid_data_api import GridDataApi +from allensdk.api.warehouse_cache.cache import cacheable, Cache +import numpy as np +import nrrd +import six + + +class MouseConnectivityApi(ReferenceSpaceApi, GridDataApi): + ''' + HTTP Client for the Allen Mouse Brain Connectivity Atlas. + + See: `Mouse Connectivity API `_ + ''' + PRODUCT_IDS = [5, 31] + + def __init__(self, base_uri=None): + super(MouseConnectivityApi, self).__init__(base_uri=base_uri) + + + @cacheable() + def get_experiments(self, + structure_ids, + **kwargs): + ''' + Fetch experiment metadata from the Mouse Brain Connectivity Atlas. + + Parameters + ---------- + structure_ids : integer or list, optional + injection structure + + Returns + ------- + url : string + The constructed URL + ''' + criteria_list = ['[failed$eqfalse]', + 'products[id$in%s]' % (','.join(str(i) for i in MouseConnectivityApi.PRODUCT_IDS))] + + if structure_ids is not None: + if type(structure_ids) is not list: + structure_ids = [structure_ids] + criteria_list.append('[id$in%s]' % ','.join(str(i) + for i in structure_ids)) + + criteria_string = ','.join(criteria_list) + + return self.model_query('SectionDataSet', + criteria=criteria_string, + **kwargs) + + @cacheable() + def get_experiments_api(self): + ''' + Fetch experiment metadata from the Mouse Brain Connectivity Atlas via the ApiConnectivity table. + + Returns + ------- + url : string + The constructed URL + ''' + return self.model_query('ApiConnectivity', num_rows='all') + + @cacheable() + def get_manual_injection_summary(self, experiment_id): + ''' Retrieve manual injection summary. ''' + + criteria = '[id$in%d]' % (experiment_id) + + include = ['specimen(donor(transgenic_mouse(transgenic_lines)),', + 'injections(structure,age)),', + 'equalization,products'] + + only = ['id', + 'failed', + 'storage_directory', + 'red_lower', + 'red_upper', + 'green_lower', + 'green_upper', + 'blue_lower', + 'blue_upper', + 'products.id', + 'specimen_id', + 'structure_id', + 'reference_space_id', + 'primary_injection_structure_id', + 'registration_point', + 'coordinates_ap', + 'coordinates_dv', + 'coordinates_ml', + 'angle', + 'sex', + 'strain', + 'injection_materials', + 'acronym', + 'structures.name', + 'days', + 'transgenic_mice.name', + 'transgenic_lines.name', + 'transgenic_lines.description', + 'transgenic_lines.id', + 'donors.id'] + + return self.model_query('SectionDataSet', + criteria=criteria, + include=include, + only=only) + + @cacheable() + def get_experiment_detail(self, experiment_id): + '''Retrieve the experiments data.''' + + criteria = '[id$eq%d]' % (experiment_id) + include = ['specimen(stereotaxic_injections(primary_injection_structure,structures,stereotaxic_injection_coordinates)),', + 'equalization,', + 'sub_images'] + order = ["'sub_images.section_number$asc'"] + + return self.model_query('SectionDataSet', + criteria=criteria, + include=include, + order=order) + + @cacheable() + def get_projection_image_info(self, + experiment_id, + section_number): + '''Fetch meta-information of one projection image. + + Parameters + ---------- + experiment_id : integer + + section_number : integer + + Notes + ----- + See: image examples under + `Experimental Overview and Metadata `_ + for additional documentation. + Download the image using :py:meth:`allensdk.api.queries.image_download_api.ImageDownloadApi.download_section_image` + ''' + + criteria = '[id$eq%d]' % (experiment_id) + include = ['equalization,sub_images[section_number$eq%d]' % + (section_number)] + + return self.model_query('SectionDataSet', + criteria=criteria, + include=include) + + + def download_reference_aligned_image_channel_volumes(self, + data_set_id, + save_file_path=None): + ''' + Returns + ------- + The well known file is downloaded + ''' + well_known_file_url = self.get_reference_aligned_image_channel_volumes_url( + data_set_id) + + if save_file_path is None: + save_file_path = str(data_set_id) + '.zip' + + self.retrieve_file_over_http(well_known_file_url, save_file_path) + + def build_reference_aligned_image_channel_volumes_url(self, + data_set_id): + '''Construct url to download the red, green, and blue channels + aligned to the 25um adult mouse brain reference space volume. + + Parameters + ---------- + data_set_id : integerallensdk.api.queries + aka attachable_id + + Notes + ----- + See: `Reference-aligned Image Channel Volumes `_ + for additional documentation. + ''' + + criteria = ['well_known_file_type', + "[name$eq'ImagesResampledTo25MicronARA']", + "[attachable_id$eq%d]" % (data_set_id)] + + model_stage = self.model_stage('WellKnownFile', + criteria=criteria) + + url = self.build_query_url([model_stage]) + + return url + + def get_reference_aligned_image_channel_volumes_url(self, + data_set_id): + '''Retrieve the download link for a specific data set.\ + + Notes + ----- + See `Reference-aligned Image Channel Volumes `_ + for additional documentation. + ''' + download_link = self.do_query(self.build_reference_aligned_image_channel_volumes_url, + lambda parsed_json: str( + parsed_json['msg'][0]['download_link']), + data_set_id) + + url = self.api_url + download_link + + return url + + def experiment_source_search(self, **kwargs): + '''Search over the whole projection signal statistics dataset + to find experiments with specific projection profiles. + + Parameters + ---------- + injection_structures : list of integers or strings + Integer Structure.id or String Structure.acronym. + target_domain : list of integers or strings, optional + Integer Structure.id or String Structure.acronym. + injection_hemisphere : string, optional + 'right' or 'left', Defaults to both hemispheres. + target_hemisphere : string, optional + 'right' or 'left', Defaults to both hemispheres. + transgenic_lines : list of integers or strings, optional + Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. + injection_domain : list of integers or strings, optional + Integer Structure.id or String Structure.acronym. + primary_structure_only : boolean, optional + product_ids : list of integers, optional + Integer Product.id + start_row : integer, optional + For paging purposes. Defaults to 0. + num_rows : integer, optional + For paging purposes. Defaults to 2000. + + Notes + ----- + See `Source Search `_, + `Target Search `_, + and + `service::mouse_connectivity_injection_structure `_. + + ''' + tuples = [(k, v) for k, v in six.iteritems(kwargs)] + return self.service_query('mouse_connectivity_injection_structure', parameters=tuples) + + def experiment_spatial_search(self, **kwargs): + '''Displays all SectionDataSets + with projection signal density >= 0.1 at the seed point. + This service also returns the path + along the most dense pixels from the seed point + to the center of each injection site.. + + Parameters + ---------- + seed_point : list of floats + The coordinates of a point in 3-D SectionDataSet space. + transgenic_lines : list of integers or strings, optional + Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. + section_data_sets : list of integers, optional + Ids to filter the results. + injection_structures : list of integers or strings, optional + Integer Structure.id or String Structure.acronym. + primary_structure_only : boolean, optional + product_ids : list of integers, optional + Integer Product.id + start_row : integer, optional + For paging purposes. Defaults to 0. + num_rows : integer, optional + For paging purposes. Defaults to 2000. + + Notes + ----- + See `Spatial Search `_ + and + `service::mouse_connectivity_target_spatial `_. + + ''' + + tuples = [(k, v) for k, v in six.iteritems(kwargs)] + return self.service_query('mouse_connectivity_target_spatial', parameters=tuples) + + def experiment_injection_coordinate_search(self, **kwargs): + '''User specifies a seed location within the 3D reference space. + The service returns a rank list of experiments + by distance of its injection site to the specified seed location. + + Parameters + ---------- + seed_point : list of floats + The coordinates of a point in 3-D SectionDataSet space. + transgenic_lines : list of integers or strings, optional + Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. + injection_structures : list of integers or strings, optional + Integer Structure.id or String Structure.acronym. + primary_structure_only : boolean, optional + product_ids : list of integers, optional + Integer Product.id + start_row : integer, optional + For paging purposes. Defaults to 0. + num_rows : integer, optional + For paging purposes. Defaults to 2000. + + Notes + ----- + See `Injection Coordinate Search `_ + and + `service::mouse_connectivity_injection_coordinate `_. + + ''' + tuples = [(k, v) for k, v in six.iteritems(kwargs)] + return self.service_query('mouse_connectivity_injection_coordinate', parameters=tuples) + + def experiment_correlation_search(self, **kwargs): + '''Select a seed experiment and a domain over + which the similarity comparison is to be made. + + + Parameters + ---------- + row : integer + SectionDataSet.id to correlate against. + structures : list of integers or strings, optional + Integer Structure.id or String Structure.acronym. + hemisphere : string, optional + Use 'right' or 'left'. Defaults to both hemispheres. + transgenic_lines : list of integers or strings, optional + Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. + injection_structures : list of integers or strings, optional + Integer Structure.id or String Structure.acronym. + primary_structure_only : boolean, optional + product_ids : list of integers, optional + Integer Product.id + start_row : integer, optional + For paging purposes. Defaults to 0. + num_rows : integer, optional + For paging purposes. Defaults to 2000. + + Notes + ----- + See `Correlation Search `_ + and + `service::mouse_connectivity_correlation `_. + + ''' + tuples = sorted(six.iteritems(kwargs)) + return self.service_query('mouse_connectivity_correlation', + parameters=tuples) + + @cacheable() + def get_structure_unionizes(self, + experiment_ids, + is_injection=None, + structure_name=None, + structure_ids=None, + hemisphere_ids=None, + normalized_projection_volume_limit=None, + include=None, + debug=None, + order=None): + + experiment_filter = '[section_data_set_id$in%s]' %\ + ','.join(str(i) for i in experiment_ids) + + if is_injection is True: + is_injection_filter = '[is_injection$eqtrue]' + elif is_injection is False: + is_injection_filter = '[is_injection$eqfalse]' + else: + is_injection_filter = '' + + if normalized_projection_volume_limit is not None: + volume_filter = '[normalized_projection_volume$gt%f]' %\ + (normalized_projection_volume_limit) + else: + volume_filter = '' + + if hemisphere_ids is not None: + hemisphere_filter = '[hemisphere_id$in%s]' %\ + ','.join(str(h) for h in hemisphere_ids) + else: + hemisphere_filter = '' + + if structure_name is not None: + structure_filter = ",structure[name$eq'%s']" % (structure_name) + elif structure_ids is not None: + structure_filter = '[structure_id$in%s]' %\ + ','.join(str(i) for i in structure_ids) + else: + structure_filter = '' + + return self.model_query( + 'ProjectionStructureUnionize', + criteria=''.join([experiment_filter, + is_injection_filter, + volume_filter, + hemisphere_filter, + structure_filter]), + include=include, + order=order, + num_rows='all', + debug=debug, + count=False) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_injection_density(self, path, experiment_id, resolution): + self.download_projection_grid_data( + experiment_id, [GridDataApi.INJECTION_DENSITY], resolution, path) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_projection_density(self, path, experiment_id, resolution): + self.download_projection_grid_data( + experiment_id, [GridDataApi.PROJECTION_DENSITY], resolution, path) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_injection_fraction(self, path, experiment_id, resolution): + self.download_projection_grid_data( + experiment_id, [GridDataApi.INJECTION_FRACTION], resolution, path) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_data_mask(self, path, experiment_id, resolution): + self.download_projection_grid_data( + experiment_id, [GridDataApi.DATA_MASK], resolution, path) + + def calculate_injection_centroid(self, + injection_density, + injection_fraction, + resolution=25): + ''' + Compute the centroid of an injection site. + + Parameters + ---------- + + injection_density: np.ndarray + The injection density volume of an experiment + + injection_fraction: np.ndarray + The injection fraction volume of an experiment + + ''' + + # find all voxels with injection_fraction > 0 + injection_voxels = np.nonzero(injection_fraction) + injection_density_computed = np.multiply(injection_density[injection_voxels], + injection_fraction[injection_voxels]) + sum_density = np.sum(injection_density_computed) + + # compute centroid in CCF coordinates + if sum_density > 0: + centroid = np.dot(injection_density_computed, + list(zip(*injection_voxels))) / sum_density * resolution + else: + centroid = None + + return centroid diff --git a/api/queries/ontologies_api.py b/api/queries/ontologies_api.py new file mode 100644 index 0000000000..7a5cb27239 --- /dev/null +++ b/api/queries/ontologies_api.py @@ -0,0 +1,314 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .rma_template import RmaTemplate +from allensdk.api.warehouse_cache.cache import cacheable + +from allensdk.core.structure_tree import StructureTree + + +class OntologiesApi(RmaTemplate): + ''' + See: `Atlas Drawings and Ontologies + `_ + ''' + + rma_templates = \ + {"ontology_queries": [ + {'name': 'structures_by_graph_ids', + 'description': 'see name', + 'model': 'Structure', + 'criteria': '[graph_id$in{{ graph_ids }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['graph_ids'] + }, + {'name': 'structures_by_graph_names', + 'description': 'see name', + 'model': 'Structure', + 'criteria': 'graph[structure_graphs.name$in{{ graph_names }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['graph_names'] + }, + {'name': 'structures_by_set_ids', + 'description': 'see name', + 'model': 'Structure', + 'criteria': '[structure_set_id$in{{ set_ids }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['set_ids'] + }, + {'name': 'structures_by_set_names', + 'description': 'see name', + 'model': 'Structure', + 'criteria': 'structure_sets[name$in{{ set_names }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['set_names'] + }, + {'name': 'structure_graphs_list', + 'description': 'see name', + 'model': 'StructureGraph', + 'num_rows': 'all', + 'count': False + }, + {'name': 'structure_sets_list', + 'description': 'see name', + 'model': 'StructureSet', + 'num_rows': 'all', + 'count': False + }, + {'name': 'atlases_list', + 'description': 'see name', + 'model': 'Atlas', + 'num_rows': 'all', + 'count': False + }, + {'name': 'atlases_table', + 'description': 'see name', + 'model': 'Atlas', + 'criteria': '{% if atlas_ids is defined %}[id$in{{ atlas_ids }}],{%endif%}structure_graph(ontology),graphic_group_labels', + 'include': 'structure_graph(ontology),graphic_group_labels', + 'only': ['atlases.id', + 'atlases.name', + 'atlases.image_type', + 'ontologies.id', + 'ontologies.name', + 'structure_graphs.id', + 'structure_graphs.name', + 'graphic_group_labels.id', + 'graphic_group_labels.name'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['atlas_ids'] + }, + {'name': 'structures_with_sets', + 'description': 'see name', + 'model': 'Structure', + 'include': 'structure_sets', + 'criteria': '[graph_id$in{{ graph_ids }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['graph_ids'] + }, + {'name': 'structure_sets_by_id', + 'description': 'see name', + 'model': 'StructureSet', + 'criteria': '[id$in{{ set_ids }}]', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['set_ids'] + } + ]} + + def __init__(self, base_uri=None): + super(OntologiesApi, self).__init__(base_uri, + query_manifest=OntologiesApi.rma_templates) + + @cacheable() + def get_structures(self, + structure_graph_ids=None, + structure_graph_names=None, + structure_set_ids=None, + structure_set_names=None, + order=['structures.graph_order'], + num_rows='all', + count=False, + **kwargs): + '''Retrieve data about anatomical structures. + + Parameters + ---------- + structure_graph_ids : int or list of ints, optional + database keys to get all structures in particular graphs + structure_graph_names : string or list of strings, optional + list of graph names to narrow the query + structure_set_ids : int or list of ints, optional + database keys to get all structures in a particular set + structure_set_names : string or list of strings, optional + list of set names to narrow the query. + order : list of strings + list of RMA order clauses for sorting + num_rows : int + how many records to retrieve + + Returns + ------- + dict + the parsed json response containing data from the API + + Notes + ----- + Only one of the methods of limiting the query should be used at a time. + ''' + if structure_graph_ids is not None: + data = self.template_query('ontology_queries', + 'structures_by_graph_ids', + graph_ids=structure_graph_ids, + order=order, + num_rows=num_rows, + count=count) + elif structure_graph_names is not None: + data = self.template_query('ontology_queries', + 'structures_by_graph_names', + graph_names=structure_graph_names, + order=order, + num_rows=num_rows, + count=count) + elif structure_set_ids is not None: + data = self.template_query('ontology_queries', + 'structures_by_set_ids', + set_ids=structure_set_ids, + order=order, + num_rows=num_rows, + count=count) + elif structure_set_names is not None: + data = self.template_query('ontology_queries', + 'structures_by_set_names', + set_names=structure_set_names, + order=order, + num_rows=num_rows, + count=count) + + return data + + + @cacheable() + def get_structures_with_sets(self, structure_graph_ids, order=['structures.graph_order'], + num_rows='all', count=False, **kwargs): + '''Download structures along with the sets to which they belong. + + Parameters + ---------- + structure_graph_ids : int or list of int + Only fetch structure records from these graphs. + order : list of strings + list of RMA order clauses for sorting + num_rows : int + how many records to retrieve + + Returns + ------- + dict + the parsed json response containing data from the API + + ''' + + return self.template_query('ontology_queries', 'structures_with_sets', + graph_ids=structure_graph_ids, + order=order, num_rows=num_rows, + count=count) + + + def unpack_structure_set_ancestors(self, structure_dataframe): + '''Convert a slash-separated structure_id_path field to a list. + + Parameters + ---------- + structure_dataframe : DataFrame + structure data from the API + + Returns + ------- + None + A new column is added to the dataframe containing the ancestor list. + ''' + ancestors = structure_dataframe['structure_id_path'].apply( + lambda e: [int(a) for a in e.split('/')[1:-1]]) + structure_ancestors = [ + [n for n in ancestors_n] for ancestors_n in ancestors + ] + structure_dataframe['structure_set_ancestor'] = structure_ancestors + + @cacheable() + def get_atlases_table(self, atlas_ids=None, brief=True): + '''List Atlases available through the API + with associated ontologies and structure graphs. + + Parameters + ---------- + atlas_ids : integer or list of integers, optional + only select specific atlases + brief : boolean, optional + True (default) requests only name and id fields. + + Returns + ------- + dict : atlas metadata + + Notes + ----- + This query is based on the + `table of available Atlases `_. + See also: `Class: Atlas `_ + ''' + if brief is True: + data = self.template_query('ontology_queries', + 'atlases_table', + atlas_ids=atlas_ids) + else: + data = self.template_query('ontology_queries', + 'atlases_table', + atlas_ids=atlas_ids, + only=None) + + return data + + @cacheable() + def get_atlases(self): + return self.template_query('ontology_queries', + 'atlases_list') + + @cacheable() + def get_structure_graphs(self): + return self.template_query('ontology_queries', + 'structure_graphs_list') + + @cacheable() + def get_structure_sets(self, structure_set_ids=None): + + if structure_set_ids is None: + return self.template_query('ontology_queries', + 'structure_sets_list') + else: + return self.template_query('ontology_queries', + 'structure_sets_by_id', + set_ids=list(structure_set_ids)) diff --git a/api/queries/reference_space_api.py b/api/queries/reference_space_api.py new file mode 100644 index 0000000000..1a5d5811c6 --- /dev/null +++ b/api/queries/reference_space_api.py @@ -0,0 +1,293 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .rma_api import RmaApi +from allensdk.api.warehouse_cache.cache import cacheable, Cache +from allensdk.core.obj_utilities import read_obj +import allensdk.core.sitk_utilities as sitk_utilities +import numpy as np +import nrrd +import six + + +class ReferenceSpaceApi(RmaApi): + + AVERAGE_TEMPLATE = 'average_template' + ARA_NISSL = 'ara_nissl' + MOUSE_2011 = 'annotation/mouse_2011' + DEVMOUSE_2012 = 'annotation/devmouse_2012' + CCF_2015 = 'annotation/ccf_2015' + CCF_2016 = 'annotation/ccf_2016' + CCF_2017 = 'annotation/ccf_2017' + CCF_VERSION_DEFAULT = CCF_2017 + + VOXEL_RESOLUTION_10_MICRONS = 10 + VOXEL_RESOLUTION_25_MICRONS = 25 + VOXEL_RESOLUTION_50_MICRONS = 50 + VOXEL_RESOLUTION_100_MICRONS = 100 + + + def __init__(self, base_uri=None): + super(ReferenceSpaceApi, self).__init__(base_uri=base_uri) + + + @cacheable(strategy='create', + reader=nrrd.read, + pathfinder=Cache.pathfinder(file_name_position=3, + path_keyword='file_name')) + def download_annotation_volume(self, + ccf_version, + resolution, + file_name): + ''' + Download the annotation volume at a particular resolution. + + Parameters + ---------- + ccf_version: string + Which reference space version to download. Defaults to "annotation/ccf_2017" + resolution: int + Desired resolution to download in microns. + Must be 10, 25, 50, or 100. + file_name: string + Where to save the annotation volume. + + Note: the parameters must be used as positional parameters, not keywords + ''' + + if ccf_version is None: + ccf_version = ReferenceSpaceApi.CCF_VERSION_DEFAULT + + self.download_volumetric_data(ccf_version, + 'annotation_%d.nrrd' % resolution, + save_file_path=file_name) + + + @cacheable(strategy='create', reader=sitk_utilities.read_ndarray_with_sitk, + pathfinder=Cache.pathfinder(file_name_position=3, + path_keyword='file_name')) + def download_mouse_atlas_volume(self, age, volume_type, file_name): + '''Download a reference volume (annotation, grid annotation, atlas volume) + from the mouse brain atlas project + + Parameters + ---------- + age : str + Specify a mouse age for which to download the reference volume + volume_type : str + Specify the type of volume to download + file_name : str + Specify the path to the downloaded volume + ''' + + remote_file_name = '{}_{}.zip'.format(age, volume_type) + url = '/'.join([ self.informatics_archive_endpoint, + 'current-release', 'mouse_annotation', + remote_file_name ]) + + self.retrieve_file_over_http(url, file_name, zipped=True) + + + @cacheable(strategy='create', + reader=nrrd.read, + pathfinder=Cache.pathfinder(file_name_position=2, + path_keyword='file_name')) + def download_template_volume(self, resolution, file_name): + ''' + Download the registration template volume at a particular resolution. + + Parameters + ---------- + + resolution: int + Desired resolution to download in microns. Must be 10, 25, 50, or 100. + + file_name: string + Where to save the registration template volume. + ''' + self.download_volumetric_data(ReferenceSpaceApi.AVERAGE_TEMPLATE, + 'average_template_%d.nrrd' % resolution, + save_file_path=file_name) + + @cacheable(strategy='create', + reader=nrrd.read, + pathfinder=Cache.pathfinder(file_name_position=4, + path_keyword='file_name')) + def download_structure_mask(self, structure_id, ccf_version, resolution, file_name): + '''Download an indicator mask for a specific structure. + + Parameters + ---------- + structure_id : int + Unique identifier for the annotated structure + ccf_version : string + Which reference space version to download. Defaults to "annotation/ccf_2017" + resolution : int + Desired resolution to download in microns. Must be 10, 25, 50, or 100. + file_name : string + Where to save the downloaded mask. + + ''' + + if ccf_version is None: + ccf_version = ReferenceSpaceApi.CCF_VERSION_DEFAULT + + structure_mask_dir = 'structure_masks_{0}'.format(resolution) + data_path = '{0}/{1}/{2}'.format(ccf_version, 'structure_masks', structure_mask_dir) + remote_file_name = 'structure_{0}.nrrd'.format(structure_id) + + try: + self.download_volumetric_data(data_path, remote_file_name, save_file_path=file_name) + except Exception as e: + self._file_download_log.error('''We weren't able to download a structure mask for structure {0}. + You can instead build the mask locally using + ReferenceSpace.many_structure_masks''') + raise + + + @cacheable(strategy='create', + reader=read_obj, + pathfinder=Cache.pathfinder(file_name_position=3, + path_keyword='file_name')) + def download_structure_mesh(self, structure_id, ccf_version, file_name): + '''Download a Wavefront obj file containing a triangulated 3d mesh built + from an annotated structure. + + Parameters + ---------- + structure_id : int + Unique identifier for the annotated structure + ccf_version : string + Which reference space version to download. Defaults to "annotation/ccf_2017" + file_name : string + Where to save the downloaded mask. + + ''' + + if ccf_version is None: + ccf_version = ReferenceSpaceApi.CCF_VERSION_DEFAULT + + data_path = '{0}/{1}'.format(ccf_version, 'structure_meshes') + remote_file_name = '{0}.obj'.format(structure_id) + + try: + self.download_volumetric_data(data_path, remote_file_name, save_file_path=file_name) + except Exception as e: + self._file_download_log.error('unable to download a structure mesh for structure {0}.'.format(structure_id)) + raise + + + def build_volumetric_data_download_url(self, + data_path, + file_name, + voxel_resolution=None, + release=None, + coordinate_framework=None): + '''Construct url to download 3D reference model in NRRD format. + + Parameters + ---------- + data_path : string + 'average_template', 'ara_nissl', 'annotation/ccf_{year}', + 'annotation/mouse_2011', or 'annotation/devmouse_2012' + voxel_resolution : int + 10, 25, 50 or 100 + coordinate_framework : string + 'mouse_ccf' (default) or 'mouse_annotation' + + Notes + ----- + See: `3-D Reference Models `_ + for additional documentation. + ''' + + if voxel_resolution is None: + voxel_resolution = ReferenceSpaceApi.VOXEL_RESOLUTION_10_MICRONS + + if release is None: + release = 'current-release' + + if coordinate_framework is None: + coordinate_framework = 'mouse_ccf' + + url = ''.join([self.informatics_archive_endpoint, + '/%s/%s/' % (release, coordinate_framework), + data_path, + '/', + file_name]) + + return url + + + def download_volumetric_data(self, + data_path, + file_name, + voxel_resolution=None, + save_file_path=None, + release=None, + coordinate_framework=None): + '''Download 3D reference model in NRRD format. + + Parameters + ---------- + data_path : string + 'average_template', 'ara_nissl', 'annotation/ccf_{year}', + 'annotation/mouse_2011', or 'annotation/devmouse_2012' + file_name : string + server-side file name. 'annotation_10.nrrd' for example. + voxel_resolution : int + 10, 25, 50 or 100 + coordinate_framework : string + 'mouse_ccf' (default) or 'mouse_annotation' + + Notes + ----- + See: `3-D Reference Models `_ + for additional documentation. + ''' + url = self.build_volumetric_data_download_url(data_path, + file_name, + voxel_resolution, + release, + coordinate_framework) + + if save_file_path is None: + save_file_path = file_name + + if save_file_path is None: + save_file_path = 'volumetric_data.nrrd' + + self.retrieve_file_over_http(url, save_file_path) + diff --git a/api/queries/rma_api.py b/api/queries/rma_api.py new file mode 100644 index 0000000000..3ea14337ad --- /dev/null +++ b/api/queries/rma_api.py @@ -0,0 +1,600 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from ..api import Api +import warnings + + +class RmaApi(Api): + ''' + See: `RESTful Model Access (RMA) `_ + ''' + MODEL = 'model::' + PIPE = 'pipe::' + SERVICE = 'service::' + CRITERIA = 'rma::criteria' + INCLUDE = 'rma::include' + OPTIONS = 'rma::options' + ORDER = 'order' + NUM_ROWS = 'num_rows' + ALL = 'all' + START_ROW = 'start_row' + COUNT = 'count' + ONLY = 'only' + EXCEPT = 'except' + EXCPT = 'excpt' + TABULAR = 'tabular' + DEBUG = 'debug' + PREVIEW = 'preview' + TRUE = 'true' + FALSE = 'false' + IS = '$is' + EQ = '$eq' + + def __init__(self, base_uri=None): + super(RmaApi, self).__init__(base_uri) + + def build_query_url(self, + stage_clauses, + fmt='json'): + '''Combine one or more RMA query stages into a single RMA query. + + Parameters + ---------- + stage_clauses : list of strings + subqueries + fmt : string, optional + json (default), xml, or csv + + Returns + ------- + string + complete RMA url + ''' + if not type(stage_clauses) is list: + stage_clauses = [stage_clauses] + + url = ''.join([ + self.rma_endpoint, + '/query.', + fmt, + '?q=', + ','.join(stage_clauses)]) + + return url + + def model_stage(self, + model, + **kwargs): + '''Construct a model stage of an RMA query string. + + Parameters + ---------- + model : string + The top level data type + filters : dict + key, value comparisons applied to the top-level model to narrow the results. + criteria : string + raw RMA criteria clause to choose what object are returned + include : string + raw RMA include clause to return associated objects + only : list of strings, optional + to be joined into an rma::options only filter to limit what data is returned + except : list of strings, optional + to be joined into an rma::options except filter to limit what data is returned + tabular : list of string, optional + return columns as a tabular data structure rather than a nested tree. + count : boolean, optional + False to skip the extra database count query. + debug : string, optional + 'true', 'false' or 'preview' + num_rows : int or string, optional + how many database rows are returned (may not correspond directly to JSON tree structure) + start_row : int or string, optional + which database row is start of returned data (may not correspond directly to JSON tree structure) + + + Notes + ----- + See `RMA Path Syntax `_ + for a brief overview of the normalized RMA syntax. + Normalized RMA syntax differs from the legacy syntax + used in much of the RMA documentation. + Using the &debug=true option with an RMA URL will include debugging information in the + response, including the normalized query. + ''' + clauses = [RmaApi.MODEL + model] + + filters = kwargs.get('filters', None) + + if filters is not None: + clauses.append(self.filters(filters)) + + criteria = kwargs.get('criteria', None) + + if criteria is not None: + clauses.append(',') + clauses.append(RmaApi.CRITERIA) + clauses.append(',') + clauses.extend(criteria) + + include = kwargs.get('include', None) + + if include is not None: + clauses.append(',') + clauses.append(RmaApi.INCLUDE) + clauses.append(',') + clauses.extend(include) + + options_clause = self.options_clause(**kwargs) + + if options_clause != '': + clauses.append(',') + clauses.append(options_clause) + + stage = ''.join(clauses) + + return stage + + def pipe_stage(self, + pipe_name, + parameters): + '''Connect model and service stages via their JSON responses. + + Notes + ----- + See: `Service Pipelines `_ + and + `Connected Services and Pipes `_ + ''' + clauses = [RmaApi.PIPE + pipe_name] + + clauses.append(self.tuple_filters(parameters)) + + stage = ''.join(clauses) + + return stage + + def service_stage(self, + service_name, + parameters=None): + '''Construct an RMA query fragment to send a request to a connected service. + + Parameters + ---------- + service_name : string + Name of a documented connected service. + parameters : dict + key-value pairs as in the online documentation. + + Notes + ----- + See: `Service Pipelines `_ + and + `Connected Services and Pipes `_ + ''' + clauses = [RmaApi.SERVICE + service_name] + + if parameters is not None: + clauses.append(self.tuple_filters(parameters)) + + stage = ''.join(clauses) + + return stage + + def model_query(self, *args, **kwargs): + '''Construct and execute a model stage of an RMA query string. + + Parameters + ---------- + model : string + The top level data type + filters : dict + key, value comparisons applied to the top-level model to narrow the results. + criteria : string + raw RMA criteria clause to choose what object are returned + include : string + raw RMA include clause to return associated objects + only : list of strings, optional + to be joined into an rma::options only filter to limit what data is returned + except : list of strings, optional + to be joined into an rma::options except filter to limit what data is returned + excpt : list of strings, optional + synonym for except parameter to avoid a reserved word conflict. + tabular : list of string, optional + return columns as a tabular data structure rather than a nested tree. + count : boolean, optional + False to skip the extra database count query. + debug : string, optional + 'true', 'false' or 'preview' + num_rows : int or string, optional + how many database rows are returned (may not correspond directly to JSON tree structure) + start_row : int or string, optional + which database row is start of returned data (may not correspond directly to JSON tree structure) + + + Notes + ----- + See `RMA Path Syntax `_ + for a brief overview of the normalized RMA syntax. + Normalized RMA syntax differs from the legacy syntax + used in much of the RMA documentation. + Using the &debug=true option with an RMA URL will include debugging information in the + response, including the normalized query. + ''' + return self.json_msg_query( + self.build_query_url( + self.model_stage(*args, **kwargs))) + + def service_query(self, *args, **kwargs): + '''Construct and Execute a single-stage RMA query + to send a request to a connected service. + + Parameters + ---------- + service_name : string + Name of a documented connected service. + parameters : dict + key-value pairs as in the online documentation. + + Notes + ----- + See: `Service Pipelines `_ + and + `Connected Services and Pipes `_ + ''' + return self.json_msg_query( + self.build_query_url( + self.service_stage(*args, **kwargs))) + + def options_clause(self, **kwargs): + '''build rma:: options clause. + + Parameters + ---------- + only : list of strings, optional + except : list of strings, optional + tabular : list of string, optional + count : boolean, optional + debug : string, optional + 'true', 'false' or 'preview' + num_rows : int or string, optional + start_row : int or string, optional + ''' + clause = '' + options_params = [] + + only = kwargs.get(RmaApi.ONLY, None) + + if only is not None: + options_params.append( + self.only_except_tabular_clause(RmaApi.ONLY, + only)) + + # handle alternate 'except' spelling to avoid reserved word conflict + excpt = kwargs.get(RmaApi.EXCEPT, None) + excpt2 = kwargs.get(RmaApi.EXCPT, None) + + if excpt is not None and excpt2 is not None: + warnings.warn('excpt and except options should not be used together', + Warning) + elif excpt2 is not None: + excpt = excpt2 + + if excpt is not None: + options_params.append( + self.only_except_tabular_clause(RmaApi.EXCEPT, + excpt)) + + tabular = kwargs.get(RmaApi.TABULAR, None) + + if tabular is not None: + options_params.append( + self.only_except_tabular_clause(RmaApi.TABULAR, + tabular)) + + num_rows = kwargs.get(RmaApi.NUM_ROWS, None) + + if num_rows is not None: + if num_rows == RmaApi.ALL: + options_params.append("[%s$eq'all']" % (RmaApi.NUM_ROWS)) + else: + options_params.append('[%s$eq%d]' % (RmaApi.NUM_ROWS, + num_rows)) + + start_row = kwargs.get(RmaApi.START_ROW, None) + + if start_row is not None: + options_params.append('[%s$eq%d]' % (RmaApi.START_ROW, + start_row)) + + order = kwargs.get(RmaApi.ORDER, None) + + if order is not None: + options_params.append(self.order_clause(order)) + + debug = kwargs.get(RmaApi.DEBUG, None) + + if debug is not None: + options_params.append(self.debug_clause(debug)) + + cnt = kwargs.get(RmaApi.COUNT, None) + + if cnt is not None: + if cnt is True or cnt == 'true': + options_params.append('[%s$eq%s]' % (RmaApi.COUNT, + RmaApi.TRUE)) + elif cnt is False or cnt == 'false': + options_params.append('[%s$eq%s]' % (RmaApi.COUNT, + RmaApi.FALSE)) + else: + pass + + if len(options_params) > 0: + clause = RmaApi.OPTIONS + ''.join(options_params) + + return clause + + def only_except_tabular_clause(self, filter_type, attribute_list): + '''Construct a clause to filter which attributes are returned + for use in an rma::options clause. + + Parameters + ---------- + filter_type : string + 'only', 'except', or 'tabular' + attribute_list : list of strings + for example ['acronym', 'products.name', 'structure.id'] + + Returns + ------- + clause : string + The query clause for inclusion in an RMA query URL. + + Notes + ----- + The title of tabular columns can be set by adding '+as+' + to the attribute. + The tabular filter type requests a response that is row-oriented + rather than a nested structure. + Because of this, the tabular option can mask the lazy query behavior + of an rma::include clause. + The tabular option does not mask the inner-join behavior of an rma::include + clause. + The tabular filter is required for .csv format RMA requests. + ''' + clause = '' + + if attribute_list is not None: + clause = '[%s$eq%s]' % (filter_type, + ','.join(attribute_list)) + + return clause + + def order_clause(self, order_list=None): + '''Construct a debug clause for use in an rma::options clause. + + Parameters + ---------- + order_list : list of strings + for example ['acronym', 'products.name+asc', 'structure.id+desc'] + + Returns + ------- + clause : string + The query clause for inclusion in an RMA query URL. + + Notes + ----- + Optionally adding '+asc' (default) or '+desc' after an attribute + will change the sort order. + ''' + clause = '' + + if order_list is not None: + clause = '[order$eq%s]' % (','.join(order_list)) + + return clause + + def debug_clause(self, debug_value=None): + '''Construct a debug clause for use in an rma::options clause. + Parameters + ---------- + debug_value : string or boolean + True, False, None (default) or 'preview' + + Returns + ------- + clause : string + The query clause for inclusion in an RMA query URL. + + Notes + ----- + True will request debugging information in the response. + False will request no debugging information. + None will return an empty clause. + 'preview' will request debugging information without the query being run. + + ''' + clause = '' + + if debug_value is None: + clause = '' + if debug_value is True or debug_value == 'true': + clause = '[debug$eqtrue]' + elif debug_value is False or debug_value == 'false': + clause = '[debug$eqfalse]' + elif debug_value == 'preview': + clause = "[debug$eq'preview']" + + return clause + + # TODO: deprecate for something that can preserve order + def filters(self, filters): + '''serialize RMA query filter clauses. + + Parameters + ---------- + filters : dict + keys and values for narrowing a query. + + Returns + ------- + string + filter clause for an RMA query string. + ''' + filters_builder = [] + + for (key, value) in filters.items(): + filters_builder.append(self.filter(key, value)) + + return ''.join(filters_builder) + + # TODO: this needs to be more rigorous. + def tuple_filters(self, filters): + '''Construct an RMA filter clause. + + Notes + ----- + + See `RMA Path Syntax - Square Brackets for Filters <http://help.brain-map.org/display/api/RMA+Path+Syntax#RMAPathSyntax-SquareBracketsforFilters>`_ for additional documentation. + ''' + filters_builder = [] + + for filt in sorted(filters): + if filt[-1] is None: + continue + if len(filt) == 2: + val = filt[1] + if type(val) is list: + val_array = [] + for v in val: + if type(v) is str: + val_array.append(v) + else: + val_array.append(str(v)) + val = ','.join(val_array) + filters_builder.append("[%s$eq%s]" % (filt[0], val)) + elif type(val) is int: + filters_builder.append("[%s$eq%d]" % (filt[0], val)) + elif type(val) is bool: + if val: + filters_builder.append("[%s$eqtrue]" % (filt[0])) + else: + filters_builder.append("[%s$eqfalse]" % (filt[0])) + elif type(val) is str: + filters_builder.append("[%s$eq%s]" % (filt[0], filt[1])) + elif len(filt) == 3: + filters_builder.append("[%s%s%s]" % (filt[0], + filt[1], + str(filt[2]))) + + return ''.join(filters_builder) + + def quote_string(self, the_string): + '''Wrap a clause in single quotes. + + Parameters + ---------- + the_string : string + a clause to be included in an rma query that needs to be quoted + + Returns + ------- + string + input wrapped in single quotes + ''' + return ''.join(["'", the_string, "'"]) + + def filter(self, key, value): + '''serialize a single RMA query filter clause. + + Parameters + ---------- + key : string + keys for narrowing a query. + value : string + value for narrowing a query. + + Returns + ------- + string + a single filter clause for an RMA query string. + ''' + return "".join(['[', + key, + RmaApi.EQ, + str(value), + ']']) + + def build_schema_query(self, clazz=None, fmt='json'): + '''Build the URL that will fetch the data schema. + + Parameters + ---------- + clazz : string, optional + Name of a specific class or None (default). + fmt : string, optional + json (default) or xml + + Returns + ------- + url : string + The constructed URL + + Notes + ----- + If a class is specified, only the schema information for that class + will be requested, otherwise the url requests the entire schema. + ''' + if clazz is not None: + class_clause = '/' + clazz + else: + class_clause = '' + + url = ''.join([self.rma_endpoint, + class_clause, + '.', + fmt]) + + return url + + def get_schema(self, clazz=None): + '''Retrieve schema information.''' + schema_data = self.do_query(self.build_schema_query, + self.read_data, + clazz) + + return schema_data diff --git a/api/queries/rma_pager.py b/api/queries/rma_pager.py new file mode 100644 index 0000000000..1edb58bedb --- /dev/null +++ b/api/queries/rma_pager.py @@ -0,0 +1,99 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import functools + + +class RmaPager(object): + def __init__(self): + pass + + @staticmethod + def pager(fn, + *args, + **kwargs): + total_rows = kwargs.pop('total_rows', None) + num_rows = kwargs.get('num_rows', None) + + if total_rows == 'all': + start_row = 0 + result_count = num_rows + kwargs = kwargs + kwargs['count'] = False + + while result_count == num_rows: + kwargs['start_row'] = start_row + data = fn(*args, **kwargs) + + start_row = start_row + num_rows + result_count = len(data) + for r in data: + yield r + + else: + start_row = 0 + kwargs = kwargs + kwargs['count'] = False + + while start_row < total_rows: + kwargs['start_row'] = start_row + + data = fn(*args, **kwargs) + result_count = len(data) + + start_row = start_row + result_count + for r in data: + yield r + +def pageable(total_rows=None, + num_rows=None): + def decor(func): + decor.total_rows=total_rows + decor.num_rows=num_rows + + @functools.wraps(func) + def w(*args, + **kwargs): + if decor.num_rows and not 'num_rows' in kwargs: + kwargs['num_rows'] = decor.num_rows + if decor.total_rows and not 'total_rows' in kwargs: + kwargs['total_rows'] = decor.total_rows + + result = RmaPager.pager(func, + *args, + **kwargs) + return result + return w + return decor diff --git a/api/queries/rma_template.py b/api/queries/rma_template.py new file mode 100644 index 0000000000..1b3c44f1c6 --- /dev/null +++ b/api/queries/rma_template.py @@ -0,0 +1,134 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .rma_api import RmaApi +from jinja2 import Template + + +class RmaTemplate(RmaApi): + ''' + See: `Atlas Drawings and Ontologies + <http://help.brain-map.org/display/api/Atlas+Drawings+and+Ontologies>`_ + ''' + + def __init__(self, base_uri=None, query_manifest=None): + super(RmaTemplate, self).__init__(base_uri) + self.templates = query_manifest + + def to_filter_rhs(self, rhs): + if type(rhs) == list: + return ','.join(str(r) for r in rhs) + + return rhs + + def template_query(self, template_name, entry_name, **kwargs): + cb = self.templates[template_name] + templates = [e for e in cb if e['name'] == entry_name] + + if len(templates) > 0: + template = templates[0] + else: + raise Exception('Entry %s not found.' % (entry_name)) + + query_args = {'model': template['model']} + + if 'criteria' in template: + criteria_template = Template(template['criteria']) + + if 'criteria_params' in template: + criteria_params = {key: self.to_filter_rhs(kwargs.get(key)) + for key in template['criteria_params'] + if key in kwargs and kwargs.get(key) is not None} + else: + criteria_params = {} + + criteria_str = str(criteria_template.render(**criteria_params)) + if criteria_str: + query_args['criteria'] = criteria_str + + if 'include' in template: + include_template = Template(template['include']) + + if 'include_params' in template: + include_params = {key: self.to_filter_rhs(kwargs.get(key)) + for key in template['include_params'] + if key in kwargs and kwargs.get(key) is not None} + else: + include_params = {} + + include_str = str(include_template.render(**include_params)) + if include_str: + query_args['include'] = include_str + + if 'only' in kwargs: + if kwargs.get('only') is not None: + query_args['only'] = [self.quote_string( + ','.join(kwargs.get('only')))] + elif 'only' in template: + query_args['only'] = [ + self.quote_string(','.join(template['only']))] + + if 'except' in kwargs: + if kwargs.get('except') is not None: + query_args['except'] = [self.quote_string( + ','.join(kwargs.get('except')))] + elif 'except' in template: + query_args['except'] = template['except'] + + if 'start_row' in kwargs: + query_args['start_row'] = kwargs.get('start_row') + elif 'start_row' in template: + query_args['start_row'] = template['start_row'] + + if 'num_rows' in kwargs: + query_args['num_rows'] = kwargs.get('num_rows') + elif 'num_rows' in template: + query_args['num_rows'] = template['num_rows'] + + if 'count' in kwargs: + query_args['count'] = kwargs.get('count') + elif 'count' in template: + query_args['count'] = template['count'] + + if 'order' in kwargs: + query_args['order'] = kwargs.get('order') + elif 'order' in template: + query_args['order'] = template['order'] + + query_args.update(kwargs) + + data = self.model_query(**query_args) + + return data diff --git a/api/queries/svg_api.py b/api/queries/svg_api.py new file mode 100644 index 0000000000..29678b9ea7 --- /dev/null +++ b/api/queries/svg_api.py @@ -0,0 +1,96 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from ..api import Api + + +class SvgApi(Api): + + def __init__(self, base_uri=None): + super(SvgApi, self).__init__(base_uri) + + def build_query(self, section_image_id, groups=None, download=False): + '''Build the URL that will fetch meta data for the specified structure. + + Parameters + ---------- + section_image_id : integer + Key of the object to be retrieved. + groups : array of integers + Keys of the group labels to filter the svg types that are returned. + + Returns + ------- + url : string + The constructed URL + ''' + if download is True: + endpoint = self.svg_download_endpoint + else: + endpoint = self.svg_endpoint + + if groups is None: + groups = [] + + if groups and len(groups) > 0: + url_params = '?groups=' + ','.join([str(g) for g in groups]) + else: + url_params = '' + + url = ''.join([endpoint, + '/', + str(section_image_id), + url_params]) + + return url + + def download_svg(self, + section_image_id, + groups=None, + file_path=None): + '''Download the svg file''' + if file_path is None: + file_path = '%d.svg' % (section_image_id) + + svg_url = self.build_query(section_image_id, groups, download=True) + self.retrieve_file_over_http(svg_url, file_path) + + def get_svg(self, + section_image_id, + groups=None): + '''Get the svg document.''' + svg_url = self.build_query(section_image_id, groups) + + return self.retrieve_xml_over_http(svg_url) diff --git a/api/queries/synchronization_api.py b/api/queries/synchronization_api.py new file mode 100644 index 0000000000..5895783789 --- /dev/null +++ b/api/queries/synchronization_api.py @@ -0,0 +1,239 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from ..api import Api + + +class SynchronizationApi(Api): + '''HTTP client for image synchronization services uses the image alignment results from + the Informatics Data Processing Pipeline. + Note: all locations on SectionImages are reported in pixel coordinates + and all locations in 3-D ReferenceSpaces are reported in microns. + + See `Image to Image Synchronization <http://help.brain-map.org/display/api/Image-to-Image+Synchronization>`_ + for additional documentation. + ''' + + def __init__(self, base_uri=None): + super(SynchronizationApi, self).__init__(base_uri) + + def get_image_to_atlas(self, + section_image_id, + x, y, + atlas_id): + '''For a specified Atlas, find the closest annotated SectionImage + and (x,y) location as defined by a seed SectionImage and seed (x,y) location. + + Parameters + ---------- + section_image_id : integer + Seed for spatial sync. + x : float + Pixel coordinate of the seed location in the seed SectionImage. + y : float + Pixel coordinate of the seed location in the seed SectionImage. + atlas_id : int + Target Atlas for image sync. + + Returns + ------- + dict + The parsed json response + ''' + url = ''.join([self.image_to_atlas_endpoint, + '/', + str(section_image_id), + '.json', + '?x=%f&y=%f' % (x, y), + '&atlas_id=', + str(atlas_id)]) + + return self.json_msg_query(url) + + def get_image_to_image(self, + section_image_id, + x, y, + section_data_set_ids): + '''For a list of target SectionDataSets, find the closest SectionImage + and (x,y) location as defined by a seed SectionImage and seed (x,y) pixel location. + + Parameters + ---------- + section_image_id : integer + Seed for spatial sync. + x : float + Pixel coordinate of the seed location in the seed SectionImage. + y : float + Pixel coordinate of the seed location in the seed SectionImage. + section_data_set_ids : list of integers + Target SectionDataSet IDs for image sync. + + Returns + ------- + dict + The parsed json response + ''' + url = ''.join([self.image_to_image_endpoint, + '/', + str(section_image_id), + '.json', + '?x=%f&y=%f' % (x, y), + '§ion_data_set_ids=', + ','.join(str(i) for i in section_data_set_ids)]) + + return self.json_msg_query(url) + + def get_image_to_image_2d(self, + section_image_id, + x, y, + section_image_ids): + '''For a list of target SectionImages, find the closest (x,y) location + as defined by a seed SectionImage and seed (x,y) location. + + Parameters + ---------- + section_image_id : integer + Seed for image sync. + x : float + Pixel coordinate of the seed location in the seed SectionImage. + y : float + Pixel coordinate of the seed location in the seed SectionImage. + section_image_ids : list of ints + Target SectionImage IDs for image sync. + + Returns + ------- + dict + The parsed json response + ''' + url = ''.join([self.image_to_image_2d_endpoint, + '/', + str(section_image_id), + '.json', + '?x=%f&y=%f' % (x, y), + '§ion_image_ids=', + ','.join(str(i) for i in section_image_ids)]) + + return self.json_msg_query(url) + + def get_reference_to_image(self, + reference_space_id, + x, y, z, + section_data_set_ids): + '''For a list of target SectionDataSets, find the closest SectionImage + and (x,y) location as defined by a (x,y,z) location in a specified ReferenceSpace. + + Parameters + ---------- + reference_space_id : integer + Seed for spatial sync. + x : float + Coordinate (in microns) of the seed location in the seed ReferenceSpace. + y : float + Coordinate (in microns) of the seed location in the seed ReferenceSpace. + z : float + Coordinate (in microns) of the seed location in the seed ReferenceSpace. + section_data_set_ids : list of ints + Target SectionDataSets IDs for image sync. + + Returns + ------- + dict + The parsed json response + ''' + url = ''.join([self.reference_to_image_endpoint, + '/', + str(reference_space_id), + '.json', + '?x=%f&y=%f&z=%f' % (x, y, z), + '§ion_data_set_ids=', + ','.join(str(i) for i in section_data_set_ids)]) + + return self.json_msg_query(url) + + def get_image_to_reference(self, + section_image_id, + x, y): + '''For a specified SectionImage and (x,y) location, + return the (x,y,z) location in the ReferenceSpace of the associated SectionDataSet. + + Parameters + ---------- + section_image_id : integer + Seed for image sync. + x : float + Pixel coordinate on the specified SectionImage. + y : float + Pixel coordinate on the specified SectionImage. + + Returns + ------- + dict + The parsed json response + ''' + url = ''.join([self.image_to_reference_endpoint, + '/', + str(section_image_id), + '.json', + '?x=%f&y=%f' % (x, y)]) + + return self.json_msg_query(url) + + def get_structure_to_image(self, + section_data_set_id, + structure_ids): + '''For a list of target structures, find the closest SectionImage + and (x,y) location as defined by the centroid of each Structure. + + Parameters + ---------- + section_data_set_id : integer + primary key + structure_ids : list of integers + primary key + + Returns + ------- + dict + The parsed json response + ''' + url = ''.join([self.structure_to_image_endpoint, + '/', + str(section_data_set_id), + '.json', + '?structure_ids=', + ','.join([str(i) for i in structure_ids])]) + + return self.json_msg_query(url) diff --git a/api/queries/tree_search_api.py b/api/queries/tree_search_api.py new file mode 100644 index 0000000000..1b84c248f3 --- /dev/null +++ b/api/queries/tree_search_api.py @@ -0,0 +1,98 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from ..api import Api + + +class TreeSearchApi(Api): + ''' + + See `Searching a Specimen or Structure Tree <http://help.brain-map.org/display/api/Image-to-Image+Synchronization>`_ + for additional documentation. + ''' + + def __init__(self, base_uri=None): + super(TreeSearchApi, self).__init__(base_uri) + + def get_tree(self, + kind, + db_id, + ancestors=None, + descendants=None): + '''Fetch meta data for the specified structure or specimen. + + Parameters + ---------- + kind : string + 'Structure' or 'Specimen' + db_id : integer + The id of the structure or specimen to search. + ancestors : boolean, optional + whether to include ancestors in the response (defaults to False) + descendants : boolean, optional + whether to include descendants in the response (defaults to False) + + Returns + ------- + dict + parsed json response data + ''' + params = [] + url_params = '' + + if ancestors is True: + params.append('ancestors=true') + elif ancestors is False: + params.append('ancestors=false') + + if descendants is True: + params.append('descendants=true') + elif descendants is False: + params.append('descendants=false') + + if len(params) > 0: + url_params = '?' + '&'.join(params) + else: + url_params = '' + + url = ''.join([self.tree_search_endpoint, + '/', + kind, + '/', + str(db_id), + '.json', + url_params]) + + return self.json_msg_query(url) diff --git a/api/warehouse_cache/__init__.py b/api/warehouse_cache/__init__.py new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/api/warehouse_cache/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/api/warehouse_cache/__pycache__/__init__.cpython-37.pyc b/api/warehouse_cache/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b924ea7a6f09ad708fb12d1ff04c13869a66dad7 GIT binary patch literal 196 zcmZ?b<>g`kg51T8i5x)sF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j*V!s2v^ce> zI3_V8F-0#au{<%aGR844F*!dkCDAx0HLt8VCchvxuQ(Y<<`-mC7RUHxCdCwImZa(y zBqnDkrl$h+=HviXq-5(S7G&y|Cl;k<<d+tw#wRBxXQb-K$7kkcmc+;F6;$5hu*uC& PDa}c>13BX}5HkP((2+OP literal 0 HcmV?d00001 diff --git a/api/warehouse_cache/__pycache__/cache.cpython-37.pyc b/api/warehouse_cache/__pycache__/cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da2035cd936e4a85e0b032934cdef18714bf37e0 GIT binary patch literal 17034 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 Y>eo1G_?Ig^HT6}C|FqHmSXN&CUo_qNWdHyG literal 0 HcmV?d00001 diff --git a/api/warehouse_cache/__pycache__/caching_utilities.cpython-37.pyc b/api/warehouse_cache/__pycache__/caching_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ec255adf5e94b81511346294698e8ee333bbeb8 GIT binary patch literal 4489 zcmbVPOOG4J5uP3n$>EUu)UF-~5Of^G5EF?CkQ@ZT5UdDV#D=ooSZiA$7FaZ=o6E`0 zgXkIVio|SyWCh5VB)(e#B>3b@PWb`;2|466ha8+-{1<%6S3P{J?3FEL22<0os;;W8 zSO02h$+Pf8pZ!tnY*^NRs55(7XuORt{Wr5LX-O7ZUHaQ0i|nq=%CSnfV&<H#WB%1{ z75_?Di|XBa<aXVt(QQOt*Nd9nX4LAo44xA%Ma$h~W~r8}p0e%={x$qpm8WdA*0--% z-E~!$>&iW_)GGCrt5y$~WMvzpE2h;f$ICTXh5i9}r8)F2s13EIR;2f|A)B)GnD*KP z-3#Z_m5lIdpYNh4nW48dqbE1cr&jV(@>z2BeUyQ*a>X*#mx+3JQ*Npkb+8T^_EZbR z>pFNfns}`pR-SrtRjy%&i;_LC+84i~Q{Qg0!r2kopj|86<Vfi-5wdXaiZB$tP!*Ls z@wljd5C=(IxbF=!{6$#QcgI8Zq0m5fe<R|cuhOhwI|cjg?pLrJtFYRQqS{xPKPall zI>=PvXa&NJp;r6lK-~|Oh)2W13B_bwG~!XTpXorQ#Y$fU;Rp*Om8RlA6*aB0k&b<r zIL1SN+U734)B!L8*^{5}yCPNmc%Zc6g42#l^C0Czog4*HNsr^%{@iN2dKqYXg}^F- zH3I7dE)alYSbCGdr5X78=<cn(4^pMmJuwin(-X%c9`D_Wg`dPy{9;eVN9kTNRB`G9 zCd0uv-Mb(3_ELy{eJK1xhyvU�q(MLkxo($3m+?GD_9HFZ_YJK`@99_D5L|1{rkG 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 Kt#=o_9riyVv2oY{ literal 0 HcmV?d00001 diff --git a/api/warehouse_cache/cache.py b/api/warehouse_cache/cache.py new file mode 100644 index 0000000000..2c12f70895 --- /dev/null +++ b/api/warehouse_cache/cache.py @@ -0,0 +1,674 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.config.manifest import Manifest, ManifestVersionError +from allensdk.config.manifest_builder import ManifestBuilder +import allensdk.core.json_utilities as ju +from allensdk.deprecated import deprecated + +import pandas as pd +import pandas.io.json as pj + +import functools +from functools import wraps, _make_key +import os +import logging +import csv + + +def memoize(f): + """ + Creates an unbound cache of function calls and results. Note that arguments + of different types are not cached separately (so f(3.0) and f(3) are not + treated as distinct calls) + + Arguments to the cached function must be hashable. + + View the cache size with f.cache_size(). + Clear the cache with f.cache_clear(). + Access the underlying function with f.__wrapped__. + """ + cache = {} + sentinel = object() # unique object for cache misses + make_key = _make_key # efficient key building from function args + cache_get = cache.get + cache_len = cache.__len__ + + @wraps(f) + def wrapper(*args, **kwargs): + + # Don't consider 3.0 and 3 different + key = make_key(args, kwargs, typed=False) + + result = cache_get(key, sentinel) + if result is not sentinel: + return result + result = f(*args, **kwargs) + cache[key] = result + return result + + def cache_clear(): + cache.clear() + + def cache_size(): + return cache_len() + + wrapper.cache_clear = cache_clear + wrapper.cache_size = cache_size + + return wrapper + + +class Cache(object): + _log = logging.getLogger('allensdk.api.cache') + + def __init__(self, + manifest=None, + cache=True, + version=None, + **kwargs): + self.cache = cache + if version is None and hasattr(self, 'MANIFEST_VERSION'): + version = self.MANIFEST_VERSION + self.load_manifest(manifest, version) + + def get_cache_path(self, file_name, manifest_key, *args): + '''Helper method for accessing path specs from manifest keys. + + Parameters + ---------- + file_name : string + manifest_key : string + args : ordered parameters + + Returns + ------- + string or None + path + ''' + if self.cache: + if file_name: + return file_name + elif self.manifest: + return self.manifest.get_path(manifest_key, *args) + + return None + + def load_manifest(self, file_name, version=None): + '''Read a keyed collection of path specifications. + + Parameters + ---------- + file_name : string + path to the manifest file + + Returns + ------- + Manifest + ''' + if file_name is not None: + if not os.path.exists(file_name): + + # make the directory if it doesn't exist already + dirname = os.path.dirname(file_name) + if dirname: + Manifest.safe_mkdir(dirname) + + self.build_manifest(file_name) + + try: + self.manifest = Manifest( + ju.read(file_name)['manifest'], + os.path.dirname(file_name), + version=version) + except ManifestVersionError as e: + if e.outdated is True: + intro = "is out of date" + elif e.outdated is False: + intro = "was made with a newer version of the AllenSDK" + elif e.outdated is None: + intro = "version did not match the expected version" + + ref_url = "https://github.com/alleninstitute/allensdk/wiki" + raise ManifestVersionError(("Your manifest file (%s) %s" + + " (its version is '%s', but" + + " version '%s' is expected). " + + " Please remove this file" + + " and it will be regenerated for" + + " you the next time you" + + " instantiate this class." + + " WARNING: There may be new data" + + " files available that replace" + + " the ones you already have" + + " downloaded. Read the notes" + + " for this release for more" + + " details on what has changed" + + " (%s).") % + (file_name, intro, + e.found_version, e.version, + ref_url), + e.version, e.found_version) + + self.manifest_path = file_name + + else: + self.manifest = None + + def build_manifest(self, file_name): + '''Creation of default path specifications. + + Parameters + ---------- + file_name : string + where to save it + ''' + + manifest_builder = ManifestBuilder() + manifest_builder.set_version(self.MANIFEST_VERSION) + + manifest_builder = self.add_manifest_paths(manifest_builder) + + manifest_builder.write_json_file(file_name) + + def add_manifest_paths(self, manifest_builder): + '''Add cache-class specific paths to the manifest. In derived classes, + should call super. + ''' + manifest_builder.add_path('BASEDIR', '.') + if hasattr(self, 'MANIFEST_CONFIG'): + for key, config in self.MANIFEST_CONFIG.items(): + manifest_builder.add_path(key, **config) + return manifest_builder + + def manifest_dataframe(self): + '''Convenience method to view manifest as a pandas dataframe. + ''' + return pd.DataFrame.from_dict(self.manifest.path_info, + orient='index') + + @staticmethod + def json_remove_keys(data, keys): + for r in data: + for key in keys: + del r[key] + + return data + + @staticmethod + def remove_keys(data, keys=None): + ''' DataFrame version + ''' + if keys is None: + keys = [] + + for key in keys: + del data[key] + + @staticmethod + def json_rename_columns(data, + new_old_name_tuples=None): + '''Convenience method to rename columns in a pandas dataframe. + + Parameters + ---------- + data : dataframe + edited in place. + new_old_name_tuples : list of string tuples (new, old) + ''' + if new_old_name_tuples is None: + new_old_name_tuples = [] + + for new_name, old_name in new_old_name_tuples: + for r in data: + r[new_name] = r[old_name] + del r[old_name] + + @staticmethod + def rename_columns(data, + new_old_name_tuples=None): + '''Convenience method to rename columns in a pandas dataframe. + + Parameters + ---------- + data : dataframe + edited in place. + new_old_name_tuples : list of string tuples (new, old) + ''' + if new_old_name_tuples is None: + new_old_name_tuples = [] + + for new_name, old_name in new_old_name_tuples: + data.columns = [new_name if c == old_name else c + for c in data.columns] + + def load_csv(self, + path, + rename=None, + index=None): + '''Read a csv file as a pandas dataframe. + + Parameters + ---------- + rename : list of string tuples (new old), optional + columns to rename + index : string, optional + post-rename column to use as the row label. + ''' + data = pd.read_csv(path, parse_dates=True) + + Cache.rename_columns(data, rename) + + if index is not None: + data.set_index([index], inplace=True) + + return data + + def load_json(self, + path, + rename=None, + index=None): + '''Read a json file as a pandas dataframe. + + Parameters + ---------- + rename : list of string tuples (new old), optional + columns to rename + index : string, optional + post-rename column to use as the row label. + ''' + data = pj.read_json(path, orient='records') + + Cache.rename_columns(data, rename) + + if index is not None: + data.set_index([index], inplace=True) + + return data + + @staticmethod + def cacher(fn, + *args, + **kwargs): + '''make an rma query, save it and return the dataframe. + + Parameters + ---------- + fn : function reference + makes the actual query using kwargs. + path : string + where to save the data + strategy : string or None, optional + 'create' always generates the data, + 'file' loads from disk, + 'lazy' queries the server if no file exists, + None generates the data and bypasses all caching behavior + pre : function + df|json->df|json, takes one data argument and returns + filtered version, None for pass-through + post : function + df|json->?, takes one data argument and returns Object + reader : function, optional + path -> data, default NOP + writer : function, optional + path, data -> None, default NOP + kwargs : objects + passed through to the query function + + Returns + ------- + Object or None + data type depends on fn, reader and/or post methods. + ''' + path = kwargs.pop('path', None) + strategy = kwargs.pop('strategy', None) + pre = kwargs.pop('pre', lambda d: d) + post = kwargs.pop('post', None) + reader = kwargs.pop('reader', None) + writer = kwargs.pop('writer', None) + + if strategy is None: + if writer or path: + strategy = 'lazy' + else: + strategy = 'pass_through' + + if strategy not in ['lazy', 'pass_through', + 'file', 'create']: + raise ValueError("Unknown query strategy: {}.".format(strategy)) + + if 'lazy' == strategy: + if os.path.exists(path): + strategy = 'file' + else: + strategy = 'create' + + if strategy == 'pass_through': + data = fn(*args, **kwargs) + elif strategy in ['create']: + Manifest.safe_make_parent_dirs(path) + + if writer: + data = fn(*args, **kwargs) + data = pre(data) + writer(path, data) + else: + data = fn(*args, **kwargs) + + if reader: + data = reader(path) + + # Note: don't provide post if fn or reader doesn't return data + if post: + data = post(data) + return data + + try: + data + return data + except Exception: + pass + + return + + @staticmethod + def csv_writer(pth, gen): + csv_writer = None + + first_row = True + row_count = 1 + + with open(pth, 'w') as output: + for row in gen: + if first_row: + field_names = [str(k) for k in row.keys()] + csv_writer = csv.DictWriter(output, + fieldnames=field_names, + delimiter=',', + quoting=csv.QUOTE_ALL) + csv_writer.writeheader() + first_row = False + Cache._log.info('row: {}'.format(row_count)) + row_count = row_count + 1 + csv_writer.writerow(row) + + @staticmethod + def cache_csv_json(): + + def reader(f): + return pd.read_csv(f, parse_dates=True).to_dict('records') + + return { + 'writer': Cache.csv_writer, + 'reader': reader + } + + @staticmethod + def cache_csv_dataframe(): + return { + 'writer': Cache.csv_writer, + 'reader': lambda f: pd.read_csv(f, parse_dates=True) + } + + @staticmethod + def nocache_dataframe(): + return { + 'post': pd.DataFrame + } + + @staticmethod + def nocache_json(): + return { + } + + @staticmethod + def cache_json_dataframe(): + return { + 'writer': ju.write, + 'reader': lambda p: pj.read_json(p, orient='records') + } + + @staticmethod + def cache_json(): + return { + 'writer': ju.write, + 'reader': ju.read + } + + @staticmethod + def cache_csv(): + return { + 'writer': Cache.csv_writer, + 'reader': lambda f: pd.read_csv(f, parse_dates=True) + } + + @staticmethod + def pathfinder(file_name_position, + secondary_file_name_position=None, + path_keyword=None): + '''helper method to find path argument in legacy methods written + prior to the @cacheable decorator. Do not use for new + @cacheable methods. + + Parameters + ---------- + file_name_position : integer + zero indexed position in the decorated method args + where file path may be found. + secondary_file_name_position : integer + zero indexed position in the decorated method args where + the file path may be found. + path_keyword : string + kwarg that may have the file path. + + Notes + ----- + This method is only intended to provide backward-compatibility + for some methods that otherwise do not follow the path conventions + of the @cacheable decorator. + ''' + def pf(*args, **kwargs): + file_name = None + + if path_keyword is not None and path_keyword in kwargs: + file_name = kwargs[path_keyword] + else: + if file_name_position < len(args): + file_name = args[file_name_position] + + if (file_name is None and + secondary_file_name_position and + secondary_file_name_position < len(args)): # noqa E129 + file_name = args[secondary_file_name_position] + + return file_name + return pf + + @deprecated() + def wrap(self, fn, path, cache, + save_as_json=True, + return_dataframe=False, + index=None, + rename=None, + **kwargs): + '''make an rma query, save it and return the dataframe. + + Parameters + ---------- + fn : function reference + makes the actual query using kwargs. + path : string + where to save the data + cache : boolean + True will make the query, False just loads from disk + save_as_json : boolean, optional + True (default) will save data as json, False as csv + return_dataframe : boolean, optional + True will cast the return value to a pandas dataframe, + False (default) will not + index : string, optional + column to use as the pandas index + rename : list of string tuples, optional + (new, old) columns to rename + kwargs : objects + passed through to the query function + + Returns + ------- + dict or DataFrame + data type depends on return_dataframe option. + + Notes + ----- + Column renaming happens after the file is reloaded for json + ''' + if cache is True: + json_data = fn(**kwargs) + + if save_as_json is True: + ju.write(path, json_data) + else: + df = pd.DataFrame(json_data) + Cache.rename_columns(df, rename) + + if index is not None: + df.set_index([index], inplace=True) + + df.to_csv(path) + + # read it back in + if save_as_json is True: + if return_dataframe is True: + data = pj.read_json(path, orient='records') + Cache.rename_columns(data, rename) + if index is not None: + data.set_index([index], inplace=True) + else: + data = ju.read(path) + elif return_dataframe is True: + data = pd.read_csv(path, parse_dates=True) + else: + raise ValueError( + 'save_as_json=False cannot be used with ' + 'return_dataframe=False') + + return data + + +def cacheable(strategy=None, + pre=None, + writer=None, + reader=None, + post=None, + pathfinder=None): + '''decorator for rma queries, save it and return the dataframe. + + Parameters + ---------- + fn : function reference + makes the actual query using kwargs. + path : string + where to save the data + strategy : string or None, optional + 'create' always gets the data from the source (server or generated), + 'file' loads from disk, + 'lazy' creates the data and saves to file if no file exists, + None queries the server and bypasses all caching behavior + pre : function + df|json->df|json, takes one data argument and returns + filtered version, None for pass-through + post : function + df|json->?, takes one data argument and returns Object + reader : function, optional + path -> data, default NOP + writer : function, optional + path, data -> None, default NOP + kwargs : objects + passed through to the query function + + Returns + ------- + dict or DataFrame + data type depends on dataframe option. + + Notes + ----- + Column renaming happens after the file is reloaded for json + ''' + def decor(func): + decor.strategy = strategy + decor.pre = pre + decor.writer = writer + decor.reader = reader + decor.post = post + decor.pathfinder = pathfinder + + @functools.wraps(func) + def w(*args, + **kwargs): + if decor.pathfinder and 'pathfinder' not in kwargs: + pathfinder = decor.pathfinder + else: + pathfinder = kwargs.pop('pathfinder', None) + + if pathfinder and 'path' not in kwargs: + found_path = pathfinder(*args, **kwargs) + + if found_path: + kwargs['path'] = found_path + if decor.strategy and 'strategy' not in kwargs: + kwargs['strategy'] = decor.strategy + if decor.pre and 'pre' not in kwargs: + kwargs['pre'] = decor.pre + if decor.writer and 'writer' not in kwargs: + kwargs['writer'] = decor.writer + if decor.reader and 'reader' not in kwargs: + kwargs['reader'] = decor.reader + if decor.post and not 'post in kwargs': + kwargs['post'] = decor.post + + result = Cache.cacher(func, + *args, + **kwargs) + return result + + return w + return decor + + +def get_default_manifest_file(cache_name): + return os.environ.get( + '{}_MANIFEST'.format(cache_name.upper()), + '{}/manifest.json'.format(cache_name.lower()) + ) diff --git a/api/warehouse_cache/caching_utilities.py b/api/warehouse_cache/caching_utilities.py new file mode 100644 index 0000000000..a457294510 --- /dev/null +++ b/api/warehouse_cache/caching_utilities.py @@ -0,0 +1,188 @@ +import functools +from pathlib import Path +import warnings +import os +import logging + +from typing import overload, Callable, Any, Union, Optional, TypeVar + +from allensdk.config.manifest import Manifest + + +P = TypeVar("P") +Q = TypeVar("Q") + +AnyPath = Union[Path, str] + + +@overload +def call_caching( + fetch: Callable[[], Q], + write: Callable[[Q], None], + read: Callable[[], P], + pre_write: Optional[Callable[[Q], Q]] = None, + cleanup: Optional[Callable[[], None]] = None, + lazy: bool = True, + num_tries: int = 1, + failure_message: str = "" +) -> P: + """ Case where a reader is provided + """ + + +@overload +def call_caching( + fetch: Callable[[], Q], + write: Callable[[Q], None], + read: None = None, + pre_write: Optional[Callable[[Q], Q]] = None, + cleanup: Optional[Callable[[], None]] = None, + lazy: bool = True, + num_tries: int = 1, + failure_message: str = "" +) -> None: + """ Case where no reader is provided (fetches and writes, but returns nothing) + """ + + +def call_caching( + fetch: Callable[[], Q], + write: Callable[[Q], None], + read: Optional[Callable[[], P]] = None, + pre_write: Optional[Callable[[Q], Q]] = None, + cleanup: Optional[Callable[[], None]] = None, + lazy: bool = True, + num_tries: int = 1, + failure_message: str = "" +) -> Optional[P]: + """ Access data, caching on a local store for future accesses. + + Parameters + ---------- + fetch : + Function which pulls data from a remote/expensive source. + write : + Function which stores data in a local/inexpensive store. + read : + Function which pulls data from a local/inexpensive store. + pre_write : + Function applied to obtained data after fetching, but before writing. + cleanup : + Function for fixing a failed fetch. e.g. unlinking a partially + downloaded file. Exceptions raised by cleanup are not themselves + handled + lazy : + If True, attempt to read the data from the local/inexpensive store + before fetching it. If False, forcibly fetch from the + remote/expensive store. + num_tries : + How many fetches to attempt before (re)raising an exception. A fetch + is failed if reading the result raises an exception. + failure_message : + Provides additional context in the event of a failed download. Emitted + when retrying, and when a fetch failure occurs after tries are + exhausted + + Returns + ------- + The result of calling read + + """ + logger = logging.getLogger("call_caching") + + try: + if not lazy or read is None: + logger.info("Fetching data from remote") + data = fetch() + if pre_write is not None: + data = pre_write(data) + logger.info("Writing data to cache") + write(data) + + if read is not None: + logger.info("Reading data from cache") + return read() + except Exception as e: + if isinstance(e, FileNotFoundError): + logger.info("No cache file found.") + # Pandas throws ValueError rather than FileNotFoundError + elif (isinstance(e, ValueError) + and str(e) == "Expected object or value"): + logger.info("No cache file found.") + if cleanup is not None and not lazy: + cleanup() + + num_tries -= 1 - lazy # don't count fetchless reads + + if num_tries <= 0: + if failure_message: + warnings.warn(failure_message) + raise + + retry_message = f"retrying fetch ({num_tries} tries remaining)" + if failure_message: + retry_message = f"{failure_message} {retry_message}" + + if not lazy: + warnings.warn(retry_message) + + return call_caching( + fetch, + write, + read, + pre_write=pre_write, + cleanup=cleanup, + lazy=False, + num_tries=num_tries, + failure_message=failure_message, + ) + + return None # required by mypy + + +def one_file_call_caching( + path: AnyPath, + fetch: Callable[[], Q], + write: Callable[[AnyPath, Q], None], + read: Optional[Callable[[AnyPath], P]] = None, + pre_write: Optional[Callable[[Q], Q]] = None, + cleanup: Optional[Callable[[], None]] = None, + lazy: bool = True, + num_tries: int = 1, + failure_message: str = "", +) -> Optional[P]: + """ A call_caching variant where the local store is a single file. See + call_caching for complete documentation. + + Parameters + ---------- + path : + Path at which the data will be stored + + """ + def safe_unlink(): + try: + os.unlink(path) + except IOError: + pass + + def safe_write(data: Q): + Manifest.safe_make_parent_dirs(path) + write(path, data) + + if read is not None: + read = functools.partial(read, path) + + if cleanup is None: + cleanup = safe_unlink + + return call_caching( + fetch, + safe_write, + read, + pre_write=pre_write, + cleanup=cleanup, + lazy=lazy, + num_tries=num_tries, + failure_message=failure_message, + ) diff --git a/brain_observatory/__init__.py b/brain_observatory/__init__.py new file mode 100644 index 0000000000..180adeeb9d --- /dev/null +++ b/brain_observatory/__init__.py @@ -0,0 +1,95 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import numpy as np +import sys +if sys.version_info < (3, 3): + from collections import Iterable +else: + from collections.abc import Iterable +import json +import uuid +import datetime +import dateutil + + +def dict_to_indexed_array(dc, order=None): + ''' Given a dictionary and an ordered arr, build a concatenation of the dictionary's values and an index describing + how that concatenation can be unpacked + ''' + + if order is None: + order = dc.keys() + + data = [] + index = [] + counter = 0 + + for key in order: + + if isinstance(dc[key], (np.ndarray, list)): + extended = dc[key] + if isinstance(dc[key], Iterable): + extended = [x for x in dc[key]] + else: + extended = [dc[key]] + + counter += len(extended) + index.append(counter) + data.append(extended) + + data = np.concatenate(data) + return index, data + + +class JSONEncoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, datetime.datetime): + return o.isoformat() + elif isinstance(o, uuid.UUID): + return str(o) + return json.JSONEncoder.default(self, o) + + +def hook(json_dict): + for key, value in json_dict.items(): + if key == 'experiment_date': + json_dict[key] = dateutil.parser.parse(value) + elif key == 'behavior_session_uuid': + json_dict[key] = uuid.UUID(value) + else: + pass + return json_dict diff --git a/brain_observatory/__pycache__/__init__.cpython-37.pyc b/brain_observatory/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8896a64c40aab79cd89cf6006b7ef7423c9d15a9 GIT binary patch literal 1800 zcmZuxUvJws5GN_gmK7%rx^#chK`2nH2D)^^fDI^uqHDVq9SZj$C<+KJ1X`pM#WLlP zbQ%}(!;pM|eFF#E%f1p{_tdY@r`^#@Y80bzNAh?l9)I`e(dK4CU`+n}o!{Cd<R9Ez zjt~|PflLET5J4-FQ9rYcNp=(nHYWNGNP;SyL|H_M>iS)4wez~|tnKGGi~ZcmI(|;F zL?j{<(K*dFo)Xa#?Q<g9vVGJ&3$m_=MdzGkn}Y6>-o`udfb@IpT>!IYz<Sih&#csZ zSjhqfINCrF&|@I;7qEs3I*#>rLzd)%Ea(AQFd*=J5uVzHJ|VBGMPzA1n&=B+;Y~Ii zu`{M0tt5-q)ma2mAp#MelhxT1az+;|m8^CLux>)zYFcOXC$b2eVA*cM3rb1DVAaCa z@vT>I$1-l%1zoTvXxNCs>!P>I^l5n_RmxLQ7PhPv*YlJs0hHESNG)Nh_1$zhD=S#0 zMXd^MrQ)cZ)}z!O$~D_>OnSnrnKYL_DV30?sgS17<*-x-Nebhzegk&ge)P8jE*;8r zrl!0YOW{@fngW^yG8~9EMq(exYy&$0OkT$e+R#7Pakx+ZCK|J+#~j=J&e2o9^X&cj z@%_O|BefauLoRlQ{0&$0!Ox1rn*{%1Ak~Q()KjTU0lc0b&duO?IUJbM%5TvnejvfN zsz5`G?+rCCRbCI_k0;#LdVVj@OI6xD-<{6iCwo<CY*A094<4bf=y;2~?IFy$tw9rT zks=3h`FwY;staD32e7!b>UCT=mUH8h(v-?rt_taxnr3Zq7L8npx*E}N0r=!vd<xEs zY~w?WWUuX*C|u-Y=|aIRcagu_wTpVDAdg)D*SJ`oLR5tm9{|&s)b7Urdi*`UDFsHN zn8qxm@UevL(3oz~9awc~Lbq5#^{1dypyK5~Bpw2p9bnQIcE$u142mug0i<Q<Hh$ZG z(f>siHDusbjiDjN_Awg&2+Ts2S$agFK6V<qWEYSYUKSjMAiHCuhMqwc+tyJVav!uW zFzac**U{K~Tnu<fTTZ0wl%^ildcv&>XR}hc@a4;APh0>1yYR@=N`Hn1Z6QZ|R#`}| z(8y}!X#Ejh`fJd80c3o8qg_A*>Fp<LPul(OH+^_&oac&9WS+Yu&nLB*Rk-fv`SFZb zs}ujvwR;c*9~|#gA1^~}V(Rx-wSt*(h1YY~oc_A%M$mii57+`b0d^^-?*fW!30>g= z`w`tE#|fM;I7w`{jMnAH$t$QhKr!fN*W~F`YJgAK9Ffd!4CNs|DQle@X$&-o9I@=R zAmyx_m=)eLTUM?$<r)gdMXUKs@J@dPtQTY*ggeKq)0iPH@(pF}`93Yf!@3^7f^)M4 zjL_?VG14~VqV9nN!@QM6YBrh9^#%wam{3jK6KDYFS*b>~gHnNV_KnZ1D(TvqWS0*M veG^Qz_wRFD-A0Bv?XmVZt+{p;85i%ZV)+0K3>rY4_?p0M@L!PJyx#d2m2t#e literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/argschema_utilities.cpython-37.pyc b/brain_observatory/__pycache__/argschema_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3daeadc52038626d50701baeb53150a7571f4a76 GIT binary patch literal 5607 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/brain_observatory_exceptions.cpython-37.pyc b/brain_observatory/__pycache__/brain_observatory_exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae2be117b7dec7acc212547cbac31d6aa1ec4a85 GIT binary patch literal 1079 zcma)5y^hmB5Z+zeiE~N>H0TPNLkJNBp`b$u9S0E&gd)&HmR1|@UShJb&8~fiQ6z-! zr0aMF5EV~Dzb$V;#f(F8Iew&!HRJj0_56N5=yY}n$o%U^@jWEu2ZELO;Ov9ir(m8D zNhCc5Rpi7QQNT=kfV~<sz`hIs2Q~HpH)IoVv&Oy*hoswzA<|kXc>AEX4Mvd>m1M*u zg>%g99T<_MFUMAyBT;0gdYlSf*~IqW#VRk7EFE+`7jmA8x#HaIa6ZpusnKt9{<ai) z`Q{rj0fev3&ks)?M6V&Fjl@*Q-dG%qw2B~foTXCSk5qbOqbygcjlpL5w6f9jWE|O~ zP<L|?&%{K*w_3vqIlDK;8hLhJ<lj%YTGeZNd1bKW8`v@f6OtNlJ(JxRiM2^O85YUB z)a8Xy7z}7UG`P0&o|j$&pEbeU1YIRZymj)cgREbvR|bXvC2VeCo76xpa%&?s;tQ#< zauj<F%!&(V<d8}#*=acP&WKM&K5)ZxyZt<ir$dzsBajK}VqzRG3PwY{1ZuB?S+LK* z+%I%NI4xM=EyxLb<1grfeWDbYjhq{}Kq_5`Zs5E;%MJb*F0f^;jA@|{Y)jIl;2di3 zt<s0i7iMBzV|I-9E_E%=V=b)Zd}Hh#`1TH{#l;ZTX7Bg@*FbNbA^3Bu7{zsd$B&iP zs~pJgE;U!+X6iL#t+zp!Yi4!r18AzXo>NV`nhpjRQJ?r1V_f)f`BOcrIg8ORGrWEQ D9P97I literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/brain_observatory_plotting.cpython-37.pyc b/brain_observatory/__pycache__/brain_observatory_plotting.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9ee61d6e5052926ad5d7219cb7155e0f5a0c0e0 GIT binary patch literal 28944 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 V$;flDlacTD9f^IvZ#RB#{6A9Z(menG literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/chisquare_categorical.cpython-37.pyc b/brain_observatory/__pycache__/chisquare_categorical.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86a544586ffabd5b38907ab037bf925404b318b6 GIT binary patch literal 3683 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 aM&Cr`!ma|J@vt6#5Izjnf@Tl~_5T7pID@wU literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/circle_plots.cpython-37.pyc b/brain_observatory/__pycache__/circle_plots.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a246f6e65edf14205fd7f1dbe958a6c1846b42d5 GIT binary patch literal 18293 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 E1E+Z%iU0rr literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/comparison_utils.cpython-37.pyc b/brain_observatory/__pycache__/comparison_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3577798de3f598d57ff9343b695ce665e860388f GIT binary patch literal 2151 zcmZuy&2Jnv6t_Jy`<3rBv`Jgqp$F(nZK{@AsSu$b&{9gJ1QkY$w%#3Yc6MhxQ`_6_ zRuc)bTr2IpASFUV;>wW|e?b2N3!zG!%AdfAXU`@Lq8|C#@A>)nKK#c1cy6wSpd~+j zM?a_{^p{}{S_vi}L6;ej5QR8KK{4V015aX-IDwP6ftz@Nhl{mRP`0|2plZijFk{Er zU=Btno=+Bn1<<W92R@g1Y;g^(q0sxm2}@!5doNfD@g}NQUx8J0ukL7PgO7COi%dl+ zr?GZ6nW|&GOr>N(H9LYPtjQh?U<rXX8D55dMbAXrJQb|jXCv8m4Hh&A5mlgHhb|uy zgmNdu{fd}ZXpD9og>$4x&lwYOf3&RJ9OXD9q4Uha=mFwqT%^2yP29oAe5#a_F~(>Y zeT_Kz3QY)~wFu>21rUTP_o}^`!N^JI8jK0%e_M^2-YjTL)J(6sH)k~ViCukRSLfA2 zhrs$vwV0zZ28zeHPvoy^X%`RAtK~vI#y8M6t2?eb1_<t&u>&;po&naQ-yaxjxy4)Q zz16{EGQq;n(cbZW&@{9U5?NDACW>8%JO>*SA{z%1*niFLKhZk@Sy?qc0miph2E66& z0OHy{+Cd=2M$1Ycf(0YBsH<r2B+NZ^D)+`XEcGE%#>y_{e^{*3Q}14?xA)HEXdi=L zKifGrbMfM}JpJuJzEjFep!es2w|x2k5lrJhYw?M=GmI4ifBk*P>fSpr$Hjc#Wb*1x zIWOl<zceA@^n^UBg}^_DLe0r@^rO2|v3V}rJR4e>o+)TTZM?yHQO0x+BlIbYGba4b zfVWK*`zrO@X_8UF{HWurC#m0wSR6|KJXK0Wt$|{)Uh|<D6<ge9Ps*83d8)chtk>-F zeQL^IF(EB`@vvETc-g<|!{1{WgSORWU`a?-*ejH-yg|v@IHJUaXeM$SG^G+3{B-&= z{s$OzQsE~|O1jOAyI~}=n2ruYoJJfT#2ThP#8O0e2y`UG3w~?lhpa;fvGUKIgWPbR zC7Bu-A0ob8B<RR*eh6|4{0JkPYAQz4R7W!97yLrqhZIWYo4dhoy0=xwL9N|o?S3<k z`V8)u@-*Z+5oNe7gt<0eT?6v;)aQ{*sA_lpCtb#Uy9?YgX#P{O?$^(0M>3^rk&L)h zl((5CSr}ArP(^Q<^AaB5=<3a3o7qHaFN1)TCOiwuJfuR<QBZ~&P=Fh(O>a6YZqhhO zrJ7!NWGD*Q4ZCIGKr@cpaVnX1<47v)sX-Pq?Zk}h`3-w*LJ{6H$E7_%`8Lz@)5B>N zb*Nn#sea(yPT(km@+VAfMo*cpgj6vVB}`YhfI@6Z7R;%%nT-xtfK@bZO4d$!D78ad zQhS{^rAoVywXXIe$tl;aIUwztBhcP}gG2S|>r4ytED3X6Ya9hNW3w5uSka);g4%2v z1PAs8GeDZtqxuDjcVWjr^7_@rm+&~q2JO;ty+xl;K5A@mYFwi4HyD2`8)?S4Yy(ZR z?npN7My&?K%r0iM-G`uIZw&d8VgFJ~(1<tF79c*RDixzkMY2pmH3uq+<$5*}t6+H+ zy1WYnEmd%d%wmF<@jR~JS@@1aH{1%)(|8e|1j&kBwHn0CS3$ODXFjfB7qre0iwsq0 zp5uG<WpNTlaTbU!sZj<6BH$fE!ZF0Wb3t`8O5nV2Z+#}#4Dazl0uC;jc`2ii0x9M# zGqfcomJM^PSXnm#txrp@s8a`iH|vDW?h*1H?9-KNNg57f_90wzNE)aL1iV5FHQ%g* F@V~eMT|fW; literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/demixer.cpython-37.pyc b/brain_observatory/__pycache__/demixer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5677e98c6d49c0cc62df7c303d2fecb1795b3211 GIT binary patch literal 10764 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/dff.cpython-37.pyc b/brain_observatory/__pycache__/dff.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b1055ef6a3713493a9bf0161216b0ff35edfaa8 GIT binary patch literal 9555 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/drifting_gratings.cpython-37.pyc b/brain_observatory/__pycache__/drifting_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..304fe6203124c84569568449b9999cb7f8b0cfa3 GIT binary patch literal 14806 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/findlevel.cpython-37.pyc b/brain_observatory/__pycache__/findlevel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05ef614283dd1751718ddc92e4296adb5a064ee9 GIT binary patch literal 626 zcmZ`$J#Q2-5cStyZh@nq;3J}-KtfxP2q94*gn%>@C{09TtrU58e7ENI?3KNDr$d_p zLCYVYK#8c}C%L7{U!Y=q0Ym{Ky*HkDGvl%RVlufz&=z0bDU%cOJq5pw<KY=1Tt@-| zv?Y>41{}l(DjCotQjE?~BZpB`u5aqpkt{=u5C@3x4QU_)y-7~^z)o?_83lHO_(wfG zWj%ev(Tjm&7AJpXz~|zOo(TJLTb=!?hW}QRZT0TI^`!OLAl~EjISZfC8Tc)75&O?T zj>ttOWz&leC0lmq6u0(?3M$9FJFfK1SSi4*Z83^sYAi%%JGo<>eXG5bI~vS%`T(K` zW@aOAwJkC^GIp(2I_7=jb!c1*F$d#y-5Y14==GwLdF@>Y#?Hc5;xFTsKiY%G<?En* zC{?3iuTpDeH|2AyYG*+`EVW&Q(skN~8rgNtCX}yCRR+`R`<<%iYNoNb#T^37_bacA zJ$4mNT&dpq&3;<H)hpfZb(@&~iSFU$;TjU5V|ta|NnpF|HWkcIFk4X1lH)S7%SE^G d>7%#GcJIIF3JP)jWZ_`h>Zf-x3aN9<e*#Epq0;~W literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/locally_sparse_noise.cpython-37.pyc b/brain_observatory/__pycache__/locally_sparse_noise.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e35be8d82c27a0bb42bf4d676f385781f4e39c0c GIT binary patch literal 12889 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 ZAvrHh6CJ+0(X&+ILF8qizY3+5{|7abI*kAT literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/natural_movie.cpython-37.pyc b/brain_observatory/__pycache__/natural_movie.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d90f9322e8d295f4b9b481799344198a0d5b950 GIT binary patch literal 5288 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 I`>AI92ZfGu8~^|S literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/natural_scenes.cpython-37.pyc b/brain_observatory/__pycache__/natural_scenes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88cfc506b9bdb2302817b14f49330fbe19687dd5 GIT binary patch literal 11787 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/observatory_plots.cpython-37.pyc b/brain_observatory/__pycache__/observatory_plots.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc6d446c6191080c4d29f4696df921628a23c519 GIT binary patch literal 14344 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 RHq&Wm1^{1&8G69h{}vcOz%2j( literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/r_neuropil.cpython-37.pyc b/brain_observatory/__pycache__/r_neuropil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..479568217b184a7eb966fff89a76a758111b7535 GIT binary patch literal 7774 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 D^O8As literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/roi_masks.cpython-37.pyc b/brain_observatory/__pycache__/roi_masks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e76ad122e8511fdcb8e044e1daacc8692c6fb4a0 GIT binary patch literal 13151 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 E0qkCbS^xk5 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/running_speed.cpython-37.pyc b/brain_observatory/__pycache__/running_speed.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d582328d081a69f8447a20f5589b81bde6551beb GIT binary patch literal 944 zcmZ`%KX2496t|t^?v!2yQon#F)Ch4M*s2N@io}9$pzRVxvYgoTa!s6IJJ+T<21Gvy zh>5S{m5Gg+iRau^y@hA_>HV>P@9&%a{TKn&Kfdti1fgGEd7u!4Q@G|3m_PzosKzPA zUM3YugLg;-BD_Z;l=y3qhJu`<B>D}nQG#7O=d~0UU0ca{;cX8TfN%=e%z#OhVu4a} z3HWIs!(}8#f}EhO6r2FMi0)B379&6(yXl8csZw2?w^E9`KlH6Mg)Vbxs9i{^xs{Y# zdb22t1?7s$+g9qbmdf&qnl4|;!on*>MW+FUa%!Y8Wus<sOo3Ls>HzDQs&=LX*P8c( z-TU+=GBrLlJuK=YllWkgLoCB<sFb!%sqFB>LR4eH`X96lNY}r4Om`ROh8tQmRR!t# zSSH!#=i*0PH`-)dz~lz<6Z7{B?l3irzTq`mk~LnE@8mPt>H+8h=)sya&(;C-70;8< z5!I%9L&;2j>UgC+mX3gdGc>aL=%NO?tR3bK=Rc9&1K;2F>^QqLQk#q~xR~YqhO0h% zt$5Ku2VZ7VtxVRmQkepH(=K|Gy)X03lvciId2!9JB>aV1l@ZrRx#p!}O%8}FZX4Yn zZTrrKzR%j;jTj`z*nux|1PtM)aPAIvS7Ww$GfyUN!kB_xWX#2k)s5&XFHafsMQ%M~ z#za#vrafLd-j3cqVT>!)SZ-lO47m5fJ(Rt}rrzea+W$2ZVDTg*F^<V#O(Hk4eGA*B j{h-oFb#>bhfd>B$lJBSXaBgz4N%R#4&G<n~$t3s(%ryW> literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/session_analysis.cpython-37.pyc b/brain_observatory/__pycache__/session_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b58b560dcefb5ea502510a242565e955ed202643 GIT binary patch literal 19801 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 YnNOjsN;#{}*1jjv|JO>ZwP{uUU;3<T;{X5v literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/session_api_utils.cpython-37.pyc b/brain_observatory/__pycache__/session_api_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88919a17f1bb94a333f1db926ffe95e8be2de453 GIT binary patch literal 7513 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/static_gratings.cpython-37.pyc b/brain_observatory/__pycache__/static_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c407682d5128664c3217cd0c4c9ffb9564e7b08b GIT binary patch literal 17141 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/stimulus_analysis.cpython-37.pyc b/brain_observatory/__pycache__/stimulus_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5273a1214fc4c7065c1b500f7119795acc87e629 GIT binary patch literal 17211 zcmds9O^_VPRj#V8{+aHc|9@#D)r_=SwN{#4Y1j5z)~;8(l8o^(S}b`N8ZAvtXZ1|A z`cGNa(#%kUf3%AYcnL-D6JQK66L0{6fSZE@MEKw!9KnqPha!RtTy)^-2z;>lUS|FE zpQP2A1B{}xvNB)3dhg|XnJ+V6>do=-yn?^xpMTx_VNFr~gI>Zv9ho=qbH0XzDNJoB zW%*Q_S~;c4yk6EtUAmkR&ulp-o@3=Prm<8b-^`cufYq4ZC^U=ZqR6Kk<IRckWPoF; zIbEJnl`kkP!?GVJENjg^NR{VUj*Wewl;@dxQz_*ifeK~gk&3jW`eQY_#TwQ<tAUr* zH@RuIZfrUhzh}B_zI&x*Hg+A`xwccaI<DPr0cg4%*H=1?w(C?0WB3<wyN54WN?Bz} zSz~HBW$6cLrX8x_FICPmouxrj&Ki@nK2Xbf<OQY37m&}h!UqcSMdXWYT;#`*pJ0<B zKY{!dn-=*=Hp6CtZwh5|Y+jU2Bfr2FMScePCAKW`v&bJ|M@4=P`4x6d<mZt;&Q6H@ z0`dl175PQv*VsvsUqb#Adrst+kw49z7x^Q|pJ64DKZ^WW_JYW-Ab*aX7x`nzud^3L z{y2MyT>!l&*hTg-o(6k`eG1Q2_G$JRJlEK(?6Y{DWLMee*yRt@@+o$Wz0N+5+;i+T z_L_CN{yctXYC3y^T|sGyU1x8yw~#x_UPC{B!JoS6+RbjG>x8{%zM(0K@uulmMzvu& zj!|oK!)!DRZaJNH3&m#8-$u2~taamNcT)gbj$v{u1hY3AR^GrLHLtdtovv%Qwv49b za=Qx17BgIKR?&!C&@8j%8gAP#jgHA(yV`A-+;9TQ)&-th+m^8zQ&nxZT&ST#7`NL@ zlG)~4X3O5A4>|WOs}mAKUuoYr+BJd6j4&f(f==VimgQDNi%Q64Y28S2W;Z(xt7#FH z+mbJ85&{QAoC_Gm=KzI5v(-n3;1RME-x4$j6j^3<J0=UvF`F!DJum9tF}VpoE$)cd z^U<GpWu|LZ9Lv3A^jqe}{mrYWylJ@xMCF>TswELR9m`@Bx7&iKE*YEcb_2AYGnm!k zR@HPZCJ>|d-rI(FEpDI_TW!%rvM((|pfDr~W7~Gz_7;eAB>uf~&={-busiFUG+I;= z!@+vkua!`d%Gr0meC_QUSFTo}dg70s^m_|G=X*#z)l({ptJXC<Q^8XYp6TG337*;D znG2p{!80E`3&FD(Jja9QMDUypo>PpzIvu>t1kc&vITt+VgXco<Tx3M!5>sGbsSVpm zDa!TIvY!jPiD$r%pQ{8s`-KYh+(Pd(I}To|R-+*;!=J90)w^BW5vow(=oi0OX?2^M z7AGjj&sKQbuGkFNsDN_$3aizE_UQ`SsWt({cIXrScxBUWwb1cwr{Z+{sqj@GqmqfR z1OWGJ2LuESBm@<WRXUb=r^34}d=#~gy=Q@H>eGraCP0K{;ZOD%l|NS@qv$V9S3391 zhK~nO`==}YLsF%3-{eGhQf*6`uRB(w#<LLTUn$(c<Hzn>mu`Or6O(h>+&0<zrg`6N z?cT=FMiynheA{Z>b8fdg(99~*c4vFnx&5}ic^e|O&Ueh}9dpY<+dy|;9MIht2XuG6 zvkO5~?3V3TDsO@YXB~;6X4Kqc{$;d8t-iP1&+&SQu}U*A{n0bBh$DFMl)A8oJ2^h* zDF>-TfKVB<PTeT!d<if@)p!m$f3ef<U{rN2(N#3y%kC<v`~*Q7QL;+l`M5(Xcy~x= z6|Jb|w7sJP#Ky2a<kBQB4EQuM333fd?(GzrG=4gM>6r8kC-xGg&kT;v{3wB}AQ?gb zMDJ)0Z!6+Ko747A4DvwpMWneOn-AiFc<JFo5J{2~UBI8CoZ#&-gwGB!kX9e{rv|7W z(&(930Qtm5s6`ne;<zgkED&!aWUrGo-|M4!et>3z>LD^xZxT;JUlydk^pd9YWkAKG z`NiafJc6=ZI5Pc4f;u&?4KctF@{>?_te3(ZQAk7F2<mjI`>>C)A#wv$4^@$!T}E4y z+ktwh+@?uLOqMi>)pe#WQ=QJVWo1b@ihL#QW>AuSK$Bc9n65Z=0;j>IG$uyY@+whX zZF4vV@Cz!nMz;;wR4w=t6*<rFF=|6g8$TaUWxPNIDR=>Xo~Dlgwn(Ulk2zEHr6m4u z16GbasTuW%y0<!@L;Wp!<Pz!A(+rn_huBtM8c8NUkE-8`C>u2<#)5cunn<LvhV#eJ z^dca?^F*5BZg_T@s8^qgCV#5mc{%JOaIic3TRc0Nq-IY?W+CBF{be78D+3Cb03J@< zaiAa@Bxev)^Ahr@1O1TfO_a;&InBp=2_z?`Tp)Fp9-TA7Ml!Pc?~;TTwY|jwLM7ZM zqj6%8Mt@!m2jpzR8LPspY{BasMQxTe4)x^0M=k`&T^b-a0F3A*+l}mZ4KE3qu7onZ zt?i3t0o8?aogAdOJV7+WEe^)3k|tapU#;|eJ!6sY{EtbBr?kBz0~AM~5zRDe!r7NT z&naXQG#`&?mYUG(DNF%6p{}G2{<P4BZj07v((~ohC?BC1I=T8kKz$_V8EtQH@*t>Z zAb7wpAWHfO=C4v2aWaC$j9iBNb03j|x+~#&$fS{3_>!+6laT8=$rV4$Zy%|*12Rdr z70hjwEPgqHhIVKh*p|u$D;7*{Ge8t`;ETy8xxV0w1Tag<93}IVEFc-dT`{?~`WL{3 z9g$ko_KppxPZIhWISsiT#wq_CQ935+kEb>A5F}%Q{ikAVG9Z;q)PW-YTOV)6DBi*b zpMX7L4c$G^ks*76fsyQq&U;e7jmJHK_3eN5F?W0vb8?0J30WikB=(Xz8nPznemrY} z`^Tu{R8P-=yZ`FrZg2+fZ}Br=5X?nW9~oiDAQ2uLAn#MnUc(z<bGdLY;zxaq4KAod z$R38G8HU^i7n|-6)NiOv!)TG(TQR;E?)h2F*xWUoXrFW4*n57&a$4+?MVo~dBYw$0 zAI<<jiK?Fx?L>*9?VTA=w-Mj@8L_b<=9q9}mv;D`p7s(bPGQaqX&)TplE{BX1TPUz z>dTKQ=odh2HbLy5f`o{pJ;>8&LaPEX?d(89Xd-b8u_p-k?m%Ojo2u)7qOjDTrVdqA zantq80nRK$K35+DeBLd%MLfqJsBZ3Hf=XEWP<x=UG|POH+Q$N|K6x<3vWMz^%AKyy zxCNBVK2Yh5<0EY!+Y0q@FIAtb&$B!haH;x&%zcPu+<w~ASb-Hj)P_UU2quH?5+&n! zE)Ih`)DE@%tV{H2qhSJibKoWg>e6@ghbsSjv|92o4Mj8-BN~w-8rituGc6!9ef0K0 z6TQKAB-NlQqPYh)L33_2Oh~hrlTrfYvIj{|Dnc?jkMIX2kW`kX-6BekcxmvLK2+KG zGESB}^@y^l?2mci;ozu;a=_-jOoUUE35*3mkaIfg;ryuvo!BRQE8-1jTKnS<)tw)p zhsPeMSCxnA``_E2K>acNmc9I;dZ<3sc*{M`CTSRQPk7K3HuWI2Kj}@f!krvy|0vM0 zX`y39FaJPA?F1XYqdiRVtH5NSRl%Di*&nLjIMvm(%L-~%lQno>^Ck~fYy=QYTEf%~ z5BfwJC2>SOqItzY(+FRR@YPpG!6tCWt<u!0^?i@1O)p_Te~zR&B`Nl%@K0S78Z$_B zZ>_)%S&gDRhJHHghruVl(Z|6<?e4~VB+ZjyKeL${EPj6)eOq@6Y$oX2+xs)Ij?_;b zJcl+DD1r4KszO_4z1bl;GzUB@2_2b$jtpvo&i^8*3Eo`&G)qG-LtRL7XdZfVZbWZR z$Gz!+{-8gf44szHEqAaV<F5^qsQ1_}KA}bM)rb0B{+@#L?0Xm|0$YXE4zX3T?4xAs z!d7GZ7iB{F^ML5J)df*PmP@v}h<^C%L_d6YXg_55*<?RpbWB=ghW{&Y_FClPQ&=Ry z#1=U}q7N71K8!4K1T3fstvzn_aV)Zr>bSpXlo8maMGmDrhE7;yOh-JP1k?|MPkbY8 zDL8nTzWd{$7P*8T+)h|z85S97LS&J-kroN<5t>34c_g6;#i5#z<F7nM6LS2!kG038 zxG$f=9%JZdx5pUA_}~|Z^?(<*2<<U<SBE`j@BYJkN@(AKu8zxRO<z{(t70Bj*~F}} zzYHln?=7?0U~WDV&MRTNTB@(b(eS$=#0bnQ0`p3Q`Ir~zN!V@x^YMq;&L5&*g};UQ zSbP6B_fL4oy%X?Zj!_C9C(p4c@bvl_@5E)Lr%pxP3Y&}Sj*50iqIR!}b|uj+Sx4<| ziFUHC=$%MXxNmsI!P!G)e--ocD$U)XMz6mh@E8Z@P_u@bwW#L2s1XnX67PcY0xx<6 z?}WEXGc7Qs7sZ_Wp(b?tB<yL7>H}%wE09DV>;v))Pr2*fN$=DH4V!Jxfsz;Ld#$p- zy(Vz4Jr(Xg*wMJXg^()pG%$Y05?M@0<fR^oEG8s!A&>|lghcQzBvRygZ~h4qLH&~@ z(z-72^l{W9*?v5IutT}ONOV6OyZi63rg5+6EkY7{Ese$Ky!q`kVshTXd6_uEb$Ws? z&f$%MVOmzZ>lpWN_)QPn>EalB*I?YfXSEQ_Lh&=)a=W}`*oeO|K6T#hBBmt_^gwV- zfR#dX*!35$CxSYHFcidth`)Hp#OYiz&fwKKcd=x&I_o%O=iJ;SWQY);olA+-F=QKq zb-65zDK@LFeb08Wz{Z&g9Zbu3pYUTucg^OGODGUv6NLSMxd^q@Kyc3mquPAY0i#!G zQ`$lBjPVk2Dxz?Dh(Rojh|dAO-cQ9XFHlR0;h~@z@Wc#@bHu=aFDfOR!(|fgd5siH z@_g$Vq;Y+?Bq+8-L|Ta*Oh~&&Br#vHM0)7>UlfSkCmSh_o{n*hcGq=mW=UoIf2|@g z&`W(5)6*qSDT!VM{=cIg;db05qr=uIM(sL9xJ84|c?1Pg7@E=Hh|@ttAVTV3d!|A5 zm9V@oivdkW#nFHf1ja>!ni%2`;Fbt`Iv2i$rWzGURgGR{J^JaK5mFoBy|uUORPD~L zabf*s<IHZm%f-NpLFbaO_x+NAT{Pal2m0On?eh*IyAWjfrFNs)-fE-#{LQA#TkRSK z6U2QP9RraNU2sUDl1`IGHX4JQ7PGs}^Aupk42c87+dCAX7t8}FrZ~PZ2rt6Z#0X4# zdFB?kEaSfIZj)gl0uw^qq^L=>>9!cc`hbjL8YM3@b$|nBb??=1s)+{h;2V8&&A>b( z!UsxfSvPkOD^^HMOr@M(l*cPgQ$(MIZwL-V<XNsmqM%%+*``1*e>{dpA4IPJr`ItF zPuVOrKn4L}X@n_TJASs>ZgiV1=h08`xAEvFNJU7)Bid!%TVOjhy4P$(c`+%S4RgaO zYu(P?tEg)s&KV)AyzMyXlMClW@T(NG7-qNHBo(`ba8(C6^eoit(GP)o>pOppzyJQF zH?Egn=5!G3=O}OuK#s3d&QA+TBVMi&2)j}dTj0K4X|%U|-EP&|zSe>i7@}ek@c9|S zlICV>%i<JR#y?91Iw^$=&yc}U!OR&%;AtJ^k3~ksFA5x($+%nA?MA!mr>qt$XAo2h zw0_3yARvxGcuva%iT4rjX_d1k-*VdA_0#xL+woISOR<y9Q-T7T0?R4KWgzA*fmzLt zyX$9wleL@W0<5;#bxjIl1=rhV$13MhM(SoaEdKMv%XK6~#uik9(>AMov0MBqePg!O zZXtM-gj~7fR4$SY@N3lY3zYmEC0|5RIxR!k=*X))LuM;uO>o?6H(^EmO@h2awQ1P6 z(<zT9fbfcgNm8KlM5359E8RlRItZ;tBZ$Ic<+%ieECM?II^ll}iLcsz26l~LT>d_N zZz&jgs2R@Aw!5_&l#WQy>7_iI#23_-j|?dc37AjT37Uv<{svL-dHUk=@Gla3bJ6$j zncSveU?OBbdU3ZA*t6Yk2>Ry20H{h-Pr!pH2=hV&6XT%r`9UNohJsgp-G#!G$Anf^ z(Em}^Zj}pSERcg@x!8us#X$uPk^Ixds1YTrl%tcQ0`2X0kSIqph`rR+DIHHOuO3eo zMTpLEL}RX~MT8NdOq~G4X{2j-lO;>)lt$$X>I~8u{L|3B2n>WThvyNrG4MNs-z(Y_ zu;}V3{LbNbS(`(PoVtV`wGP|m(N0&-5)@kK>N<XxdcG4vKI<2#-QX7{1hqwVO^b6x zVZQH|6I9QDYYi>t#B)xI^CX9Un59Jhk~ShJOAg*LIy^f1p;I<GQK1pUc?q5MO{JzX z9Jqau+gC+C#dPE~SE<wa3ijG@s)93?Zz*-0t<<rr=Z?8JQ^9+YWfrkJ|3JfOL>4C{ zDV%MLyLqai(-T`|xEu13rYbvsL#+=c4wb9Q`+tU2tiGRiC$Yz0SXNLowFE3UC5cO> z7ezT?-_P#cl3$};-S@BW=g?vXusNIyWV~#!=EKbsZ_J%Nn8Qy0IN_AL??-XNW=X;7 zJLTr71+7LeD|i3)J;FaP+oLSSazRZ8E5Fpif``2{oG?(1b|MR2%FBC&S_&({3G*oC zu;faRmLs8+(d`0xkw9F22)z1mS!Kw(4&-DAAR0;JJ&a&Q6XA)S%3A_^yl8w`E*jyB zU6O(R;VSK{ywVT_&<^@_5s_kTDMx5rD-ahpFc0H^RS<MW&fO(JnY_et26s0~{hu2W z@p?(F^#W%qSgHjdk}F?)2SVu$4em!wVX2^A`ea6px0}X=^Y`IVUD>$t?iF#v1EVKA zfS93RO)G?sE{G~R+=j5pPoS#!Lr?Nr11VqXqx78MuP=BW&M63v9Mj0wXegxU0Xj!_ z){wXe3-w6zwBVN#daj43F3>K-ji<50jv<vH@eA;AERF!qEq5Ef9PtpoSUZrbd_h!= zy3=#Ky-JO<tSw^wi_q8bg!q+#(``C*?d^{B%WzQ4hV%M*fFR<CMhyy#5**PyAUR@! zC$hN5a7VjWDo$JJXrH+BHODRIYL#}&Lf7&(u<;HhcafA*oKv2@;j5iN-tr)=BWI*3 zVvppkV5BtEz0Z7H76Uwcr;;vrs6lc`5Sz4guQmQ9BJXV^xHPwO3-N3spS4?^2Ch^I z*W(d&;YMjuMp%4>8oW!%uTXNEl2eorCO;!h#@8FT#^a}&X2*wT$N4W4gzz3S+-hNc zR?gv`1U5qM!ykllB;-Z`sIlq@FSVS5W7*gRwo*|#Xbu70qlC`Z<+oG7CJ5%gN@Yz- zDBhhvPstfd3?yMEkZy@6^q)Y%9b!S5DC)&@5mWn$rmJ&eB3{B|OH<mqdPJisc<<y> zbj$TBX&C+K_+i6Mp8OlgcpBG9+pzme^Ni++S&OAUO3|H4=#;)u&bBOEe}h_O&<R+@ zVL37`45-t_QWkD-S+9~TQhut_fRwkYW;tUw;c(r@Z4J7EQHGQ|j@>Nh!Xew&;20AD zG7*Ml&}~YLv$(0{z?l}PO+;hbO&gcyu#fgatde>vr|w-C;QdJ$HhLsM+D*>6Ls|pQ z6@<0oW)#!5DEv|r?<)+k3_TK}usq1g)$3`df28AXO6nj(GaF`f1yK@mZdVR+EJI~N zirEeON3>SEj}JYft}ms^I=SFN6a6%%hBn`u>)A6h&d|1BX|F&5*G30xGuJ`f+t<*V ze;tXh)7><=Y|6C7P1JJ!=B+ROLglR+Z{PSbWQ`$cr(rk!%ud6^zL}rd70<9!bgJZa z!uJhIj3^P^u_A?;4AZPcx8W{QSInS+0xydG>A3f^051$Gd45E<498R@eWX9?jVLPR z_wj<u5$F|o3L1I<UK7qUAbH#h#%a1tX&0T*DFB5@Cd<W`S*IwHWN8ddcZ_2!1fBBq z!wh;bdys=Ir18YPW6`JCgFF*aFo8XYP8`u!#b6;QwwX%>e+pwjg=X6D790O27%R^T z(c-=#R3N<k6|Z#SRae~E{99<pe+x+|BTZ_GoC+*+qEO|sxQu}NTG%MSrQv(+J3uWI zt2~|9u8>7Tdwg1um2_}lr*5WTX+<w;7cuJO(9P)Lwc%ZyY#Lb_jXlwrvw;_3X=D7f znB`zM&S~_YM)$l9bo|m}OE)nx!T!ehMVi^%3{%~#hafhj@QZ8O0(@8mw8`+-z31O* zcN<LX4AFgVaV1vV&c&ANndcnrTCp8^mU40=|20q{HW~OU$oUz!P4j~sw#TB&-u%~5 zi7AstFki0%7v=`mKWy>eLG{}tC%V+2Xfs%BkU0!lKJ+U?NxhEX-3{@3f$rMTOjN1h zreg&=Kivl9i<Qb<oOc8@*-C}At0>N5Q)LUjnm-0d<89<Id5Nho2O9Vq5^Oxl9mZWb zABu@7o_fv_+&M~KqJ*w~a52?gpd3w&{AEf$MG5WIh=GP*q8x1qNF}9(xm4UMlsidD zi4uxRlYx)VQSJdHzfFnI|KhcGZ+z+6)nK5SzWL6LjayeXuHE>`O<BahO`s&$#Gqu* zD~(KI;wM@iat?BnIy4f)&#_{*m=pi9#cU40fq!Gg;9pJ`|GtWFm-G2-zNleF)zyiD zz#N6ik>b*XNuGp55^)h6=Rxt1LKP9}rry!`nyb}Q^sAAgVp8y+;59g8zY8TUX?y=9 z_aJdM*mRxsaJL7#df%WeAZ)~$#=Eoya7~=U*fj&L8*K^G`Uieb7rUKw^5hu86~_J^ z>ZF5eyd-u_@7XvW!-1HM?M{0OSJ<%_a4}LFRk~D;<%e7%kY|r=FzmG6qDq0S)@|X8 z3I|Fwztim}@m1;FZ(7?XP;<Fvk~gO^@S(7YCHCvco%U0}$X(>hxsWwXZE4z0ydWPJ z{mdQg5N<h%t`xm!qt&})H#G1onFaVcoXScI{1@>k7sQUDlp8kMNPOZ;{3g|=abKmg zE6f>w2_0oQ(gXYh)QX+F^2)#^*NPSXM-GnI@$(f<Ba>9h>89z@0NAiMarKpQKrEhO z7{>P3W*s-hq}xe^CKxj4Rm_^X%hGgTClAh{t<oGA3-82|GlzfL)K?Yx?}h&XIgdAp literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/stimulus_info.cpython-37.pyc b/brain_observatory/__pycache__/stimulus_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5dcc5f19c7517d6a3bea45cd1f81b0701c67048 GIT binary patch literal 24051 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/__pycache__/sync_dataset.cpython-37.pyc b/brain_observatory/__pycache__/sync_dataset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dae25ed6ba34192a27572c24d8eb8475b245a2c GIT binary patch literal 21327 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 VV8Ax5Jb*Mg_0z`S@8NRp{{lV;MP>j1 literal 0 HcmV?d00001 diff --git a/brain_observatory/argschema_utilities.py b/brain_observatory/argschema_utilities.py new file mode 100644 index 0000000000..e581fdc462 --- /dev/null +++ b/brain_observatory/argschema_utilities.py @@ -0,0 +1,156 @@ +import argparse +import os +import pathlib + +import marshmallow +from argschema import ArgSchemaParser +from argschema.schemas import DefaultSchema +from marshmallow import RAISE, ValidationError + + +class InputFile(marshmallow.fields.String): + """A marshmallow String field subclass which deserializes json str fields + that represent a desired input path to pathlib.Path. + Also performs read access checking. + """ + + def _deserialize(self, value, attr, obj, **kwargs) -> pathlib.Path: + return pathlib.Path(value) + + def _serialize(self, value, attr, obj, **kwargs) -> str: + return str(value) + + def _validate(self, value: pathlib.Path): + check_read_access(str(value)) + + +class OutputFile(marshmallow.fields.String): + """A marshmallow String field subclass which deserializes json str fields + that represent a desired output file path to a pathlib.Path. + Also performs write access checking. + """ + + def _deserialize(self, value, attr, obj, **kwargs) -> pathlib.Path: + return pathlib.Path(value) + + def _serialize(self, value, attr, obj, **kwargs) -> str: + return str(value) + + def _validate(self, value: pathlib.Path): + check_write_access_overwrite(str(value)) + + +def write_or_print_outputs(data, parser): + data.update({'input_parameters': parser.args}) + if 'output_json' in parser.args: + parser.output(data, indent=2) + else: + print(parser.get_output_json(data)) + + +def check_write_access_dir(dirpath): + if os.path.exists(dirpath): + test_filepath = pathlib.Path(dirpath, 'test_file.txt') + try: + with test_filepath.open() as _: + pass + os.remove(test_filepath) + return True + except PermissionError: + raise ValidationError( + f'don\'t have permissions to write in directory {dirpath}') + else: + try: + pathlib.Path(dirpath).mkdir(parents=True) + pathlib.Path(dirpath).rmdir() + return True + except PermissionError: + raise ValidationError( + f'Can\'t build path to requested location {dirpath}') + + raise RuntimeError('Unhandled case; this should not happen') + + +def check_write_access(filepath, allow_exists=False): + try: + fd = os.open(filepath, os.O_CREAT | os.O_EXCL) + os.close(fd) + os.remove(filepath) + return True + except FileExistsError: + + if not allow_exists: + raise ValidationError(f'file at {filepath} already exists') + else: + return True + + except (FileNotFoundError, PermissionError): + base_dir = os.path.dirname(filepath) + return check_write_access_dir(base_dir) + except Exception as e: + raise e + + raise RuntimeError('Unhandled case; this should not happen') + + +def check_write_access_overwrite(path): + return check_write_access(path, allow_exists=True) + + +def check_read_access(path): + try: + f = open(path, mode='r') + f.close() + return True + except Exception as err: + raise ValidationError( + f'file at #{path} not readable (#{type(err)}: {err}') + + +class RaisingSchema(DefaultSchema): + class Meta: + unknown = RAISE + + +class ArgSchemaParserPlus(ArgSchemaParser): # pragma: no cover + + def __init__(self, *args, **kwargs): + parser = argparse.ArgumentParser() + [known_args, extra_args] = parser.parse_known_args() + self.args = known_args + + super(ArgSchemaParserPlus, self).__init__(args=extra_args, **kwargs) + + +def optional_lims_inputs(argv, input_schema, output_schema, lims_input_getter): + remaining_args = argv[1:] + input_data = {} + + if "--get_inputs_from_lims" in argv: + lims_parser = argparse.ArgumentParser(add_help=False) + lims_parser.add_argument("--host", type=str, default="http://lims2") + lims_parser.add_argument("--job_queue", type=str, default=None) + lims_parser.add_argument("--strategy", type=str, default=None) + lims_parser.add_argument("--ecephys_session_id", type=int, + default=None) + lims_parser.add_argument("--output_root", type=str, default=None) + + lims_args, remaining_args = lims_parser.parse_known_args( + remaining_args) + remaining_args = [ + item for item in remaining_args if item != "--get_inputs_from_lims" + ] + input_data = lims_input_getter(**lims_args.__dict__) + + try: + parser = ArgSchemaParser( + args=remaining_args, + input_data=input_data, + schema_type=input_schema, + output_schema_type=output_schema, + ) + except ValidationError: + print(input_data) + raise + + return parser diff --git a/brain_observatory/behavior/__init__.py b/brain_observatory/behavior/__init__.py new file mode 100644 index 0000000000..0ac0fbbaf3 --- /dev/null +++ b/brain_observatory/behavior/__init__.py @@ -0,0 +1,11 @@ + +IMAGE_SETS = {'Natural_Images_Lum_Matched_set_ophys_6_2017.07.14': '//allen/programs/braintv/workgroups/nc-ophys/Doug/Stimulus_Code/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_6_2017.07.14.pkl', + 'Natural_Images_Lum_Matched_set_training_2017.07.14': '//allen/programs/braintv/workgroups/nc-ophys/Doug/Stimulus_Code/image_dictionaries/Natural_Images_Lum_Matched_set_training_2017.07.14.pkl', + 'Natural_Images_Lum_Matched_set_training_2017.07.14_2': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_training_2017.07.14.pkl', + 'Natural_Images_Lum_Matched_set_ophys_6_2017.07.14_2': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_6_2017.07.14.pkl', + 'Natural_Images_Lum_Matched_set_ophys_H_2019.05.26': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_H_2019.05.26.pkl', + 'Natural_Images_Lum_Matched_set_ophys_G_2019.05.26': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_G_2019.05.26.pkl'} + + + +assert len(IMAGE_SETS) == len(set(IMAGE_SETS.keys())) == len(set(IMAGE_SETS.values())) \ No newline at end of file diff --git a/brain_observatory/behavior/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9b0c04889d2302f66ebc335705b05bdc3038278 GIT binary patch literal 1468 zcmc&!%TC-d6m=dGMyT{ZW<fkNP*AI?>Oe<;G_aX=gCbc@Y-Ow@c4Rw2$*x7M%0IAZ z#fo3bwtvx8olq)7i(t9{TR!qb$2!;d`s}Q&tpd}si;sBN1K>xyxNa+E^41JBGe7{b zh)o>gk{<ESy<<Qv3QjG9HU;0D?`D2#xxfL5Eq8wJx>vi2t@gQX0p0s#k(D_Z^y{w> z;xwfk=2FBGX9|WAGp<W`B4iRvQRE8pXkFxsO2K!ch~ZqbtVj!mb_Jo3WjLmYut+n( zv1C-iBdiOFQ*_WCDKslGbcl7dpadzZQFj&ELgV3R+aGTGqfI|g()#T2mFPB9#^c*k zzAPoBWU4UHhID~TCggv-$Xz-<KeCQHGV?St_S>wy^oK9}@m5zLPa|XRmW+W{kCra* zdVCM%9~Dq<F3&;ZdgC6}-#Ip<hedQVBM+q9e7&QAcf5LVIN6(``Sks~ag6OWj&X#> zO=zVWuf%CVRr7qJ6qT)=Or;d^5=hVZUI#z*?yKN~IaL8(VB&}P1oJAGa2yFv@J2v+ zsREHxt|Eh7tig<hfnu7j=Qv7QM+!Q}QzW_aIwV4KV~Mqp75wvy5i-`G5%Tk@>A%hd SDN_2zZe9490o%InefJknyaN6J literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/behavior_ophys_analysis.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_ophys_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc711f6c727e0a5639aeed457dafa44e2bb0852b GIT binary patch literal 3774 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 H$!Grsb-dp| literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/behavior_ophys_experiment.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_ophys_experiment.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06218e1cb21adc37de722ac331af721941e0d221 GIT binary patch literal 25519 zcmeHwS&$q@dR|xcF+DRqJ@*A(1rQ|AB&Gp^Aa|Eba*30RU2;ef*j>4nyM>yr>Y19U zKDMfQ2Gh~wSQ(H3*+%FLNw%pFD2ElHS1A<XM?dJzesJi;ih9t)IvkFTkV3Bty~yAH zXPte_fu$XK&>$+iDl04V&&>bMKNHucrY17@Yy78Q(f?;Jllfot5dP(G^8qgRT`7|> zGKOSl8j>nWbT8Yon&sb|n#XU}E;Po}F@Be`i;Z!0obU7YL}OB&<okkMYD}q9d_QKF z8`J7E-xuwf#;iKqm{aHYdEB0FET{{OMRk#%C+wxhvbxOollDquRXxS`CHuL?^Xl`B z7t|N{dCGpV@sj!y-<NHraauji_tW;7#>?u<d_QBKZM>qs!uPZGtBrH&IliB>&o?S+ zh41I>*BY;@uQx8J7x;O>UTaj<D&H^K7aNz<OMJg%ztOm?UgrB{`_0A`^@^1FFk`G3 zs}D2AsyY53tG;E(cQTbzKc_LRNPh8?wr91Py1kBvvGpHZyJguXZl|xATl%ima_*R} zivm>i&VI8NzP`C{-gWfaj@8@@vQ|E`HZ9}h7FCB=O}E~18vIW7XZvcqZTNF{Jgd>M zJMLYpVY;5)XuB2JpSo_^_MNs_LuS+UOE-7TrssaDJ9@(f2s4Rh@9G;2=_K0y&}=nK z&)G)}OE+}S{G@)h_LGj~S_I4|?X7*+pB>0YeTyMnT;^lb(+%Cz@nZINL*GQ-KDG6x z`JvP5w2?XYamV(oHf1G>&WJ8wZ#j-xqxMj8@>8d^EuIMM<(h8SIyL~)8m*?~wH(bb zZJofK=9c3z@K^gX;x<vy(nq&HzN6i^rd|K+=8c={cW+<)Nc;Her+8Da%}u?wkGnj9 zPE)vOY-qJsvnk-vYL2O+<r+<V_{XG%2loRxlQA=@WMov?kkqW1GxKJ_95ajNxH(}? zu4a&ykWLx$7vqmIb;-yYxrZgSY)%{bFC@+>7-PtpF=vh2=A1b%E|6mRi-Iw2%sk9L zkkkdd{f;@Ecsq-?bH+TsUBuh(noEhd3wXO|Eb-fAbA{S6mW`E%Id#=MWvo7sjE{`x zjOQOpsQWqd)Ps!ig7M<R44$6H`<L)uF;4UI3+9XF9Djetc==%tC0>eh&Kj?9j$*#Z zJ$cnQ_ppc(r%^(*dETgSi8E2oYsTxG^D=VIZok4cUoh4<?^WcT+dj{ERpTP(RT6oZ zj5j#%wM5=!<4w+cJ&||Cc#HEcB=X)izQ%cL$P=)A-S`IQR1>A%F}}%p7m>HbaJ*~0 z$2pf0rQSEb#d&X-m$}Rb##M~$o8}esE%R;T+845M-MGOez7~|YY1~4IubWql4~=j0 zxPIeNCYMp)0aN+dUry1}&HHWBAwu@Lzy6uoc1)LuSs@Zr>Q1Yn=!y#(vrXmumfO*7 zCHz`p8c-}jgNiFyP<2AV-)+#3rQ255R5tdN4ppGkY~6JgaDc6r;VSp2Zq2qD?meaD z1dq+V4Xv$vTlYjQm2rP&Bj9jaP`^Lfj;Yq4X%XAdz@!51<d<vUO`01qry?3;e&NqH znCpSsLLT7Hnfs>Z1sqcIh*$ZmsXWKp)HVaY<<DbKOs!Sd^q6neLh7X7GOjF9>J}0& z^B}V=^`vbXR~A<eR~}aZ*BGuMu5nxwxF&IxdgF%lq$Fi}`CdlL^<<<|y)4plFNbux zS3o+`8$&wVD<YjUGMG_$y;Ab$`v*$13^i|CwH?<v4QSL^N8i(&PP2)*pz$#cb<8pM zbjNVjsdWB)_?YOYI_9z{u>5&((@74yI_>H14(1Lb!1PSVRSTX21aO^K&~|0s&$}I< znP1d23#g%K>Vh^5-~uoL5c}g=IBn{jHVAl83n4G}b!j1bPQqT)0^rf?Fz9D6_i6CQ zfEEP5U(%BJHmeOF+_ct*adQwKBw><>Hl-!8%0HEQ)RIV6necP2Y1f?>FmTR`l)OZV zLJ3WzbB2<aDLG3C53qz0)0n_C?N2iQ@T=F~`TTn>rr~paOE;<;`kvn0|NLrGhomv| zH$OL<yYA<$HiUN#DR=4fkF1T)A&SklHWUWPCVXq#C}Hee+;DWOskJsx<1R_3{fpt; zMK{5?m=QCnw)dS1;Cm03dmc$<q9Eml{wrn+Qv9zQF&O4AF?*_pxI==}F};q{tU<%% zKL|$fw}AMzaU+P&kPP{WbRhLI+cJ@&k$nO^6i?aIQ;wdHn>TV#WPV>ry&p?G6%$Vq z$S=Qst0Ji--7q4g1%zYZWp&chWan+b!;@GUcW5O1g4fdU+Ifv$yiUm)B^M~EQgV@! zOGxnb8+1=qR3zsz-M>l66-vH_<j1(&IV2gWESIISRFo!=;-B1o@mjz<`$tl=|9|MK zOs4q3&uRFAr_2XGU%=DdTa|)8FOWT+RPYpkC5g#eSM#<YGPYW_;Xj{xV^~n7hz#n) z6I_4ZWGzv{pnySWF0?JvKb6jGGA9R#nr+v43t-fWNa$}B*Ca0Hu6Hr*k1~(4k8<@a zP4UCxL6M(i)^~~r<6ed&<s<2l%=tNkwVs0sPx54=_(b}(tOq1`oPC@##-GRslU@#- zdD6%OSxR0Z@n))5e2_UPdt=DUJ<j&Z#>A8C!L(QGP4=d@$G0bpNqj%!O^WwM2~V?L ziE8LgZBO+|y_w#uG4&*WFxM+P|HCU&JNR;Xdxq0lqm26In<Z~9f?(d8Pt>;HEd*`P z_ZGGnx0k$SNQ1mF{Y35+jF~5egT>xBU|i~r{f6Y6F=h{zaji60dJ{p9mc5lkeJkE- zZ?3o4o9|8c7J5s)<=zS)oO?13RG!zb02Nq*lN4u-p4oYnwHEzFSwoN{dY8h81g=B{ zsF^#asoWcds;nk}Snfrir0VR$vZ&Cr)H{fuUtM)c%>IRHy<f9Ch6yRU3-!v-oR;OL z>ifYK6fDzGyq02$vPw`^NtJbXtaeHYrD}ojFsKSDr3hY2DjbGh3DqUm5TlQ3M5Odb z9GN)rJTCVX5)hj7Sbi))wUG}pkHLw1@B=&{&Y4{Ye|r~Y{4r7lHDd#eb0ttHH8$b2 zO)~44u~xFqER`LPG)I3~vs?}Ksb>YH10@lx@*0X(vVOJ(9pozRxt#>>yn(z&xLoEi zkV_M|y4MaxLjtn;uH6Fba^J6xX#0qfkRHP$LL=eHPznb}Lgqnu4k`g=H&7%n<ib!V z=4n=P&KPy*IwdsBewjyvG<H!yay~>h#&$@@{UzwLURZOi3qQdZ@mR<hi>oIYi=lO5 zHpgAKBN(bkRuc;^;9?9R6(+zCuyTwG7&Ix%z06}8Dfvn6K<<$*gmL8-O7lcka{hSK zU*|i>_9qkU#h>ou3m7wMQjA%N?!Ju#7{#B?rdSG%G3!_O=zS_mD$LNKT;`!neatq* z@8AP>21zEsD_Np{Mfqg-MPoWxIdqMMI#ja_sA=RbFkr5cri$r~hbJr0o#x-43TcE1 z3dOk3<0f1$Z8G};8sr{U@}i@!;zQ>gf1UD$2yHVMwn;&owN|I;!7L+>iy&8cOiC#+ zKOa0LxnQLb!^ql^|B`EN5<o(2XplxuyugIDqSwHF{HZ`&U^Bz@7Xk*CVutHbvRHLi zs0*w*pQbz3q|eaZ%ajn_iO!sI@^t?kB`cILU5(=|psNUj9by#@&8xFWuV*(x+cY#* zoL{1sWCc3J1N}UhbjNg->Ao!FWLVT+9meOxSk4c5<t$OHq?$PsTwO!IpD<1Qv0#uK z(vtk8o3ZCF;dyhO$IHs9bCaqe#w&1}vHV-~_yHyV0*OC6ARruKna*uWKB0urh;hUr zZ1ERUXcn34IqI<U8I>hVMa&IP3(tr`d41DD3N8?lfgDDFtoza|*|^+YB$?-C3gxkt zNusd=G~gUx6R;}C;wZ{8^kKo_W&8?Sq&G53l(SSqycIe09<`t*`o18OWSBr5{r|eB zkK~X*a@PKth4c+G>$k+o>5nw{NWc9HJV3vd>T;mnjxmd5^W~rj1}Q<D!jyrY3q$6y z)EnQ1{^}K2FN6sLy)X~PIRULTEIH}HY(Yu6mo*B|I7{Am^lqv*#yai<mna)!V8heU zR(}gxZTS5RG}Kc3<V{8QvtAj#2<V#7b*G?H&h*BiPZn999M}I6+<qd`5{{=(29{Iw zRf-2DxV-X?Qny>WcR^_d?(ygoQvdF5nM!vpGEbDfEwiZ@q|P?rgMc=(w`J9~;Nv3m zM6s<M)81ELAbT)&Qx&y3o^8RHR^TgV6$n4=PTR5-9o|~E3U5~(WZtZynq-}+N>G$4 zcP+yN&sNR_?QPgrbH_bbRj%y=wz>{oMtQS(Df%?k_dcP9{#(say}uE36fi*_RGOW} z2DHLfUD1tgy#_8DcHG<2J!Q|bZDqq$8oIM%8d2*sjJg{Ft1+<W#6ZHELrVuVj-1US z%bs-_rc@30lAXB6dgBFh3x@r@9F<O6gKQ!mG0As4!`!8AZRvKs34j#Ca^bq!=#cFR z&!f;|G4i`Dd)EY}z+b3{cF=2YD{7njs=Q$+HNE4)%}EumZQ|aw^rj*N7^}pMR?FK` zEDRv<V3&QOR+nYgg;Zt99wuirWo9HL;-T}o9!(%QI~6vO2^{p00TDeEy~c1P`x!ws zOkPGWssG0{9%{t0=ug503KzN@NzZ^$NnlO`y1o>;F@$a|wE1Fa;IViK6?a*1f99Pe z4urph1Q0bD>8Zr&kI+-WOpa99(JHkBMd*9f*7xZ?Cm8n+DC3tYA*l$3kwN;1GCrn^ zz`OG)-6s`~vsB_`N?5qD3KB~_l7y9M))AaK6^i7#bB`W%N=O_y8<eoZO6syuK1iJq z>HupREYs%_12#<95cEQTvvL&6-abGLDi=e`BAexLaz<DH6Wl+;<?^h&ST2;L5~hPh zCks%SgepxCr6m@nBuGh=qU11fI@0kMq6l14rNF||Nc$hEy`<bmO8_tus}n#SavMcr z6;7jIiLB3M1h-P?Fe2+UOD>~>Np=O5So~&tC3YN5d07a)DH6YM49Rd5!E?xNB615& z_e##cgAgWX(G)q0IGu!(D0?6TD&DZuX@&)=Xa@q7>wx2k+(h0ii}fiM>t%K%k-KNU zH|G46F@3OrYq7Z$IeQl1ND3id^vKCG2a!D0n}x$?0dAk^?FBfE$k{WiUzATSoRi}p z@s1>ePr3x70>oVY+0ApPx|sHH{S$NZL=*XpoFCS@Rr9cF({@4@pYrBxyRGIh0kBEz zC@lcK11e4nfWw_ORP~V(;D~OK%LW3i-(@2?TYwK8Vs}g6mazzAX4dRt2wqA~UsuSE z`gEWxhx=Umx-!D&!iL#!ZwtvH;cej#9pY;Vx|VakOWk2pFBW=%GlhG~vMJ$Aan|Vr zl6(-BvGvy1dom!uPrVPlBqS(=eRZUlWXLF__z$~aFeyAYGXFR%pM~dxZFI<OhKTIa zzzgKuA;9laMp6&RiwanFr<H*ddm0vnr-6r!`psSh=ZAF1euEs{v2a)E?njjTm=cW= z5@ko|38V>Ng>%R%b!AED2i)nA`T<daP!b3`6IMQJ1t#UOA<rsAtj#F&f>0~rT49|b z*Kfmf^Q=A4AgmDrP**cAKzk@GO@>;6FxO$s!!%DC=|aDVGz>P;se~}m$;|KncZ7*f zs1#8OpkaOXI)0hKU_}tpACgk){;jTDzM*VbP2Jh&hzD2_Fr{ELu^V2YC14m&?v5K9 zyPxqAW$c}gR!-I;ZW^wzRtHvCtD$eHDqLWC+p69sXV^Q@$0SpA$I<uK$d)8i5GEN+ zJ2q1KJ!t{Zq%|peGi~98E~%(y5CAPm`pY96av-iZ@Ln+Hh&%hw5kngB$?wrzL*2+^ z#=CEhl7okQ-#vRhFrI^Gk~2oV&Y>Hodj@@nJ%oks^%^&UR>p7<J@I7z6gOD>&FmDN znO^2;=F1E(2}@7qFTvS2rPT~MnR~K<yQgqIe@VYN1HT8^UKZ<eneBpswMD3OIdAM~ zv6nM)tC{U_yr*{)2L%uD8xJI;g$MB3^zz%K9ofC_P5mngF&p_hIk5BV>P#w9fEH78 zwpsV!CeLoQ_7E6ZuUE?cA`L@-NvxlyvzW`NlN7Gw!2xQR_x&6~>6+?zB4fK{HT{Wr zq<p#ARtvib<g4xY1$Iul!uOiRQa^$;w)D2?m#?~5=_mX7rsK4n${5eKKbr=?Lfpti z4gL%fH=|DRz1!Ikkd1Sz6j9?i7=Cpkj?wAIn=*Ac2J(*xRmdR9WQ$+{GrXQXBh7%! zPf6WZ4?~`~k_Zt9A+o{6>*O3d#*4;1=>|g3cx@qK0#rPYiv&0?Uu_~>;74-@Sd1WM z@D#B;UrN6z|0H)upg)913q}1rPk}l{UBLnoJm7NmlAoh7Nl^<izkir`*M^g#)@roh z|MQS83R3sxVO{GR{3i4%GqD&I*T|y_3T6tukLE;1K(f@nzd8iNM1_Aw;1Jzp;Pvdj zabkeF-|8dNG}w$9KRlPtw2X5<iYRzsBA9^5RV}#jHmwk4pCXj%DIA_(VltkNeVM^> zJf`P?v?DuT_Yg!yMEM^xe;_}QK!7yE@_M(@-zu^04%}nSmIo)7Yi%~+D<YpxWs>LA z>7rG~qr^pmDR!HBQ!VJOw+|}Gv+vQ*x}Ap8q4yKtr}~&=*tb3~2LkVD2An36|3YI; zzI=?eJO>kbM((biV8jhK8Z6Wli!Q1%94vHQ>VEvaruCB!Bm^%N)#1wIZhBi5JYiA5 z4qRS=Z6|{7NW8q`P*>T_7z>B2h+ARxgeE41-;p%nA^3|ByEFOj>!Z3hB!1wS9lLc% z$Akmy#61cl3PUruk9_0qJwVU@TcUgC5AR-FU(`3^O4GRL*Zr?Zf`CDaRid>}5w`@- z!gc}Sf*JBLz>^?;3kV#fauWy~6u%_|n}m1e;BMN3xT8|u>;u`^4sz$3vXM!>c^JHz z#~ZB9bG-}r6>TpDIZMIsa`a}!$bM0V=)|(Z?~;hiAv|5^vxJZkW#izAR*gc&{Asgc zag4fV>x~UV_h;daw1Tz1AZt0sMv93hM?4~h5XZOxq_qu-yxg_SJ#EXhHn%(#tBT3o zJ<IU6u-Yl&Q4zb{hVP$MXI7#KRm0h3pFiRXp)t`s`lTSo53L%eKL^heIHYMH5XtG( z5NKv%&FnlCoDz%YK}e|}1XkcVfQvL_H3EPaM4gAobAFYQe@zKf%_Az;2fYxz1<^G> z&z*4|qo6-QVjUtI>kAGo6ZQ4U`8CR;ZaDvjl7EW?Qi<5VI<=8pp;RXXsgb^iiMmXs zV}w49$G;?mrjBN?_*H@kD1tT7g*yo2IlAZ>9=)PGla-~>!Fr)m8KFC&1YOs0^{dw= zlxwVKDsiZ#&{qdJ(KBewG3Sy+u-!dCFoJ2(tG}l~U_CNFTH8pkz8<TSe}GQ1GEb%h zt;sa3n$zM4Oe`+|lPRC@`+}nHnhtb*L(!=Oui!+zh-oCs3fc5mFgR*i-`z~CD-Rzh ze=dM9QSu+7VJmcB8^sI<KRedY)$T?C-XyA9H4CI`@cK=-j8)UyM5qQWETso`V3@EL z*50oo5SEOm=q<$c1<bzl`DpAQlXnc55n{&?JU`ZWkJCy0&rmZ3S3xBKBGk6@<|bKn zSmW%pOczUbFzqh#6O?{_Jkr*TI@dO;H(>hRqP5N_lO#MDgv<>YDWle*NT-UOPlFQz z&<9T?1}I&3tz~x_O*d`3Qjr0j?1!vJ|L7g%JnY#@3I-}qf1RcUaxtLJ5X^zSiD#-S zB$${;V*6WsEz(He)9a7{q51CBwy>T#&?p0m;5kU5!{CbBRCxPA-Kq`1h+5K%gdtE7 zKpQ4hP%IS-hr$SmFg<{Tj0hS6Rz!!772!@aS(s;DpoOLvsJ;&NH+dG8MX`{$p(E@Z z0(YSM1mbz!*|30|@P1(UJvTAafwO?Eyy4t}UzH=eS?Zn{#U2v&8;J_~qhGp)hz<Rh zVX0kBpm3lw(3-T{wrJN|xY7$U3P=mf@91#s0HL)dW*FXHOKESlJggcwT42L2!U~*C zy@@?6%v5+r!hI!}*jP5*g3ZvNNwb=my9O@>E2xH7nG@^ckZvGu+6xnnaoa`!0akMn z0ZUA4;ENWU;Y^!&jo<>$RNAo7ooY;KBm7Kp8>48S@jC1gkXt!|_<m8sJ0BtW5UNY# z?=eX3nB)f34Q#t;Kth@uMrvs=M4SLft=X=!v^a#^#N08KQG^80L41v<59~K`+t_(Q zWJc5MSeSE?4g(;8nso#q*fpyItfa6{i$XOBees=f>*6he#}|a`(+4Vm@(cPzgfOCg zJDXdGXaUx>1sZ|wSu#dN&>AuZ>ad!$3lSiqS!y!IbQ(Dk2?6E!B!hF4gC2ytG64PP zP>TV;+|i*IRRtl-E(R}*0~z=@6&He_mOVBipj(MK5#36CC9Dz`)6X3C?JH^Ipuup= zP3#zTg7^=?Rzb}+c5{Mjpz4MW*DQ}ZVvZV}Mydg-L7<JxJLSOk?G~X%OIcT5gJS}C z0vjY|R`fxXdnjPo4hLP6fZ+0o7lGFod%eJpcA-2`Yz(<N2(kc88FOQ<60mi@AYPB) z?7s=l{A$G6mC-v+L@meCgZ>o0+v_C$QtUKh#n1~{nCD1wsVaBL%Ls;R$I4tF30#VK z*C6b`+}=~}I&gx3oE&EEK!GqY{<BYRyB9G~O%}V+6ve7VYlHR)yFf0;$_*27WFZwO z2o8$}?U`9|)EjV%e`2aq#6OiIxi+EaF*r9BJ0|yz=7PQn|6+)a=HT>=u&EDI-9!mu z?m&f$)CJ;wZR@^i59*JJz+^V@535*&0}88;3uEzx+5qFANI+=%&8qSVtUX(Ax08xN z*jM@`^rTQj5HYk2XuV*|R=o}p1JOXx1ZE{SFbv-NVk;u=#xh!a&5)xF@-u3V3~{mX zK!`38)JL)apQ7bp1O1^R6tu{nYP81jj7`#~&(b8ePi#GFoBZvwG}>uDV=p`HV>L&- zjHVl{M9RoUt7Q+LMj)ENJ5iRyJRt*tBnW^czEAsDSP+a*0|*z;WPo8p14;QQ28fdx zEp15xgrflqe1brJ3uZ3S8gE>MQ5V2d$A$t3Pk<P4;DM$HIHDuS0)(wXXQFx_(8!s8 zo*DgnoOeOFg}o6bxIew2QkAqiLlv>J4KR;1Ik`Z<9uC3#`-jgz{97$?*hQkM)QHA) zE9bpdduXqjB%o8mH99!)`-ejSZSemU1fjl==QW-Y>H;m5eLGSYE{t9ipoxk$@rwn< z<LC~ZVivlC*xwIEnX-NZ`%iFW;-*cr1JxK&+`%TOgi#1x35rq!{NJc5cW~+n4C76O z{KZhtn}l%!N5K?BKW8*oKl|zL3pZ=*Wd7Mt|NU2>Baj0}xN4Y|BNc}TCF;VkK1ZMt zu9Mc6j$3dOwj`DKXI*5t<0dtXG*I++Qe7mPC@qPcpxTo<a{>>}(T*Aah2d=m!4o4W z^|wK(yAh=>ci$T2vN^Q!<It@B9^5+#eIB^XD?dbWgxdEhUPajl%d8`^0g6x?)Cl4> zI!;ny8qiq20*X5ZB@oLWDK-SPx?2{M7~O86L+H%?z74yCMZ~sGP|JS07O>tbrt2`z z^%=bX^=LZF-O8xx95}k-I8)f&y{cS>lk7O*QPf@f`-;{qc-?Iqy&HkY^y&|zj_11< zM|FHe+|qHnuiu5mI>HYLIcBw?f7G#GBt9J_w!Qbw3t}%(#9av6K~zl>?i$CelPiI& z_475SQdMrj_sXU~;Ks!22e~hU6Ko*efkm+ez%O;>hH17x(l@SmU@c&M6HfAggrGd_ z!U}1HYbfk}LIe*PyXWF+ghGrM%c}C3zSrLxlP8X7Nms=J78)1qJa{x>4@R&$bLYl) z6H;fr<(Y}afi>kSDTTriCeH<&pr9Svt)radjaS+^3{7xUkurRUqwyps4SBhVod{PC zR}pK0hc-u%rN2;Pr~uxFW42avezC>|@dl1U-sOf+58BrRzKIzi)1V3F1Y<HWOds96 z5vhkL2LufKL&;75H7p=GdVhC9ty177v?5+4AT3we(Ea7nGTbkOBZFms9B&5`GZRR< zptR6-T8;r`19gmcy>cuj<zuX4>=ckDS6kLUxyurz)*AkKcrp--F*cLHldHgaj+4Ro z!GK7N)~1fLtwIy368K}!U%H@Nsz5&sg;%EyU;SD_Wv4L#sELXI^jbu~Y_TOr>n^$# z>=g{R-wDD{01?|ctk5<0VXE!HQArDYmB9Z@L&CV8XpQ(#UB?c0L;2)09<X!{P$Ssx z$SiA*ykue65PKfdz>95=P$_BXQByzYf?8?1FDO86af7ma7m+wkEo3|UJ@s_~J$xbw zu=|GKJ>kq7-5Q-46}2cH!dB@iYB^G(p%N#W6WyYb3Dqq4#BuHhvmy5F4+kh=TMFDw z@TQ~rHV}ihV$#w9=AaFBy%Bpf5$ik1$i)YkBOnl#?s$T*ZfvaSO<*g#e@TZCQX;un z047fZ4rC;ZqizKOO5~B^?X*~gz;f6=PL;G<o4_t>6Lx|S-HNitf*>JRA_Nu^h)J6a z?sf;8Lu*)t(074!<fl!r{ZIvH17d8WCHv-9YJnPx&BenN8^1);8n*t&k)S`@Jv&O! zCqGC@cYG{X8Oyjqj8o>RMB%}!e8igmH_%dvpzwLjW1=$@l<<tWI6R?$g=Q1Wjx@Bq z|1^ra3&%Y%EJrz!X(vrI6Eq`~0TqE3XIVxPnDv%zxAtgacg+2SYz=2na7R8~B4plL zqmghdjaXC;zH<n>&?cg+Hjn-&9;WlOH@CSt=(qqw(n3Ivt}r~4BK+c5pobqF4|cT# zl#h=7114SqR`_E$Ig5sSgtmDWW&V4FgfpW9Xp=~oI{qz%k#J_DF_Ml0*pwL~v+L?4 zdr8PEh!DAA=p6)T<YpNTp+6oLbN@PmQy#rbA}XDNE20z%HT8&A5d2P|rZ~?B0kNJV z;$MgF5}4)?x=5%vKa1dyy5~j_ZQnPTj%#RI91%v*0rW?|5o8o7htqYWo$(gMK;k5s z9fWLGvfXb5<V8{jghDC~Bxzzf0#8uXnK$YRpDiRD_W^@k|2egTLs(`xJ2;<+&+WjF zGgKT?7YEkeK>7boo#eRcTu~Zrgp4{;DA`52zmAJThpB7ZIAKx@eh`^U0f}m~QI;Zj zM<By24{I2jN(KLh;G{v!NTY4Ufv;-xLHI|}^9&!cQ9@Wclg-F)<^f}&yZBvme-G-H zI7|U28PiId*)3jP6R{WF>2UQs5KP@EvBjQjBG0_97B_;BMn6YqHi`hoc*LV&4?;D; z{kXZmizWbv4R&8S6wktMaCpbp(Ff-nl)OX9H<93Ey!_Dok;Oq4-=vc-o6yZP&7aV4 z`jXMH>As|CKf#%*!J9EnGg>uG6C1-9s72oOMPw$ne$Ue#&5zg<zCm{sL(E4lI>ayd zP(Xi@UFz^n;;dCa3!~8aDZQh4;SJ}0j<}e^ThUHY<_;yRl<ZUTFDaoQb-zgQ1K16+ z&onLKOi$C>dzAbJB`y+mEQqHQ+ezfMp^iraodbXzS}PWT^}kJbXDA`_-1!|!h;=%@ zOUdt1^7}}z*_)(HO>{#X7m%ZM1&2t=`45zQLFJ}`voDz+YB5Rx?K#MmL++nPNt#ag zw~%0G8KPI?e{|H#+{#>8&Vr2u{}7PhkmbbFjlQ>fc@j~wGv)kDNtR{`bj`dP+>Oc7 z9CGHCah=AshHC}aw0J-F3VvttoGoW%c`jehilcen#@Uejv=GRXtmZjXQ4DZFs7cO$ z2KZ{ey^sCEJmKn<<Ai;NR1==d!ziX!kMk*MkbHud%ljAA4^H+`H6`na+W9Ch^*bl5 z2I6?siD-NtntJKj6$Z=s;ykBu8qf8Uep^kgP`G`Md_)r;;Glkb;+m7=l^#4^T4BmR z!RQ5@P1RIQ>Nd_4Mt~2RP_+{S8!mrD`xT=zP^-Y3{=<^R(OAT=)L;4vnu^2O2}hYj zs=a5gS5z0P0&!Q8M+`<i4g^&4oI>VN>cRgv5Qf3Udj!;LCx@Z`&|==iuD*NXisB%C zm-j2H@13}c;I!r{j<d0Om$drPiR*}?ud8BW;|w8HX{WWi8r2K^!mR2YZ;Q5`)U8cE z3{IVo-eW%rA|J@6W;v;@MQ@I?dDkH+t1d?0KqQ+E{zHc<Huj3M=SV)qqAT8*;TPW( q>cab^`MG3<lw|C`!2S&Uqcl5%y%;6@<1|;w;U4esgiU4mm;JxV5}eWi literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/behavior_ophys_session.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_ophys_session.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de23bc69d8475d61e5db50ada59198d2912d3b89 GIT binary patch literal 966 zcmbVLF>ezw6t?f2>KYo55E2VW5fe9X9oP^c2vjVn9V&!$I>~a*PI8UoJNzywsaT+u zI>Db{Vq@j6cxCEeVB$HsBr0@)C%t!{W&3;YeSX*LblL=M^7W(m9uV@=FIL77JVS^3 z7$lKYlhl6$O(#JbQu2z(P_i>3nF>$Clu3F>;?@P8Ci^jUw|i<NW<_Zas?i+w-dD;N z6J_e$A6Qw~0Jwudk(5f32IpizC6&Qhl!oVok(42E=x$viJX8QhX>!^yVELqlehnS& zVW`OwvebbLWcV4&t;17t#0KO8{X!`=f}Cvs<cH8&8Ia?oZ$)8v*#~83qAu+`={F6m z0WW<k9G0n*tLo_%(3PsPDi^hqNp}jW`yVOPTCU4kHZmp`UOUve4YkO}TFsP>TP`{l z))Zz4j(Oy6zHEv?t==xTTnnc77%t+xFh$LI95@C_58T!m?+gJ+w>i(X0O0%^`St0= zqwEdJ0+|>Ine@f6F!SuW5qW8(c$g_OgRHDj#vJ29qwICj&!DK)g9?iiLxp!6p?Cih zdUqxC8vG%2HMf3Fy~AQ)DWd@kXhcu$UiApcx-%4nb0a2-bJym4Qp&0Jc!%?MQ=ykT z3v$<KTF#Z$oZIV|Y!PB=J09Qg!E3&a4u0Gsx>(08yM?Rt$*RMD7^TfSThEw=y@S04 Z=_daY`Rp!wylmj9AA0aVXcX*h{RX(GAeI0C literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/behavior_session.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_session.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6646f9eee659b4b9b3283178fa47ff53758d45c8 GIT binary patch literal 33180 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 I(=c-X4`TX>AOHXW literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/criteria.cpython-37.pyc b/brain_observatory/behavior/__pycache__/criteria.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da88027d2c5aa908ad07bcfc16d216a1866a8fb2 GIT binary patch literal 9121 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/dprime.cpython-37.pyc b/brain_observatory/behavior/__pycache__/dprime.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e56d31fb993b573a37f29b5f90b67e21b3f0448a GIT binary patch literal 3961 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 CZk8he literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/event_detection.cpython-37.pyc b/brain_observatory/behavior/__pycache__/event_detection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..371a112c4a3ce75fdc748af442112929a70de642 GIT binary patch literal 1468 zcmZ`(O>g8h7`BtiOghZ=u)vCsi;s-hw(4?$(Fy@&Z%|fzO3|Q^Cw|j$o7lm2(oRVa zP&o1n_|R6I_)EER>R;f*YtL@CNQ<R7ejWSq`#kUCe01l|m|&~^{DF@WLjLx_vo^%R z2l&_r*a;$NNivG>sEn#OizyK)(BlClF!XPc{5B9nG5RUVMuL7prd!vzj~q^EpIFD8 zy^b)veg(VfppUsRIG^(p`iWXNS;4|OsBJ$q;2NXy*zd+R!pEm_fRFtHJ4ZTlOfRXR zCy}}5A`xBEA88k1Ow4_Z<1YG@{2pdqjEN08Dw1EKCy5(A8FkSWy`mR!7h{xm@fCfO zT=?;pN5wCLvv=LNBbW4J^6mY3bdg*P@#{++>5|t8u8+jfXW*kt`g4SHgD!bUzB~Q~ zM@W0b-$SBfhV4MBR+lX>x5CHp92nB(Yj!H#igC6tSk4>EOSa-=v2%oDE4gBYEFG8t z;WV?A*0@|cR%pXoX&YY3bMB;8<FMu{3l`BlhSH{DLRx3!vhgbzx9k+;(aKqdSU!=b z=wa)pTF63zV1>~YlS(>?*~qFcp#p_f^AO85JCykedyI6zxXq!Dx#1OHnl=FK+_VrP z%^6emt`dQ8nDdH!8APZ!=6A+)fvMs#)*qra0$Fy3!@^^4fP+P5tSB{iH!#)-CZLs@ z{1E4b+{5zQ-kKr9=OC)7mSB7q-hC{%&ui3J)CiUKTIHdF8zprO=9cQ82b;c-{d3~8 zo0LCmT-~^E+W+Eug{~=D{QT`lXEo#w3&Yt1?1F2sqRc=JvJLa-o-lvDf14w#8td2+ zoyIDxXVp~x%zgHs&Bh-xjrzFMx$&3la5}*N6kf>{uc04*&C3QJ8KaHy*EUO^DV)W% zDEdg%*$^F|j-ZciQ}xL?7;XD4Kvlg=kfj^#T9}Ru{#r;l$N1Zv4ZH=j$;OBv7D%I~ zvQNSl`HL9;kND^NgV`LNZS0({xY%9tQ?AzY4;4pT!QYvKYV90rqHK=6u2*Y2|3oh5 zRyx?Jd49r=0QZ*2%8HY{rQuR7^b!$U?zCC&En&r5sm&g=X!V6aGw0s#yY;$%d6U~B ze6l`4zV;-nPmR2`P17i)+wmK8n@;Fm`W7|!aDEz@7++@K$7z<J7WLX}W0c{qPU1Ld pIeL04`XsozkI|K3e;|IVdlh%~>BCBkriAx>&8#n0N+&U){{nzEt{?ya literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/eye_tracking_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/eye_tracking_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5837b70f8ded6f2fbfe614a8684358f909305420 GIT binary patch literal 7580 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 YCXQNnPL@{QDBCONSI(}S6~eOr4f_Cd*Z=?k literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/image_api.cpython-37.pyc b/brain_observatory/behavior/__pycache__/image_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f9b4656301993646522293a273a581adba5681f GIT binary patch literal 1803 zcmZuxOK&7K5N^94)6+9cvde-52xz1|>>NnY!f6$)5)!dm0TEJmFRhVUp0+pBNx!gr z0u#+1P;%uzB;v$h>MJLH02fYt<#_-Bw_L7v*;W3^U-`>>_aX<a{N*Qc;yKQ5^s{dG zclOcEGYIKORyYZ>BTrn6yzojt@tO17k*@Tv9qB3m%1r|N`!c|PaK)3JWGBw3_d9$z z$0OE7$D&m7<*X@GMsw@tLfJ<*B$SPm@K=bMxXL^8RUrAEqk0(KJw!@E)ramw4`lD! zNg^4_KE{EJ5O2`=FG_K$F8_#+l*x2HQ6?7glcU&9M^TI>MJwW`an<ZpQfMvac9tx5 z(bC@3dDR+gF^$Ob>J(dAI{s$$$!cD1BDGT$H`BSvGf~7Qzf^JkI#wc^#!ddCD(uc# zmA7zZTD@`f-Fl0)VGH?LM}3^lv{qGH%;T)CuubHZl5tzd6BXyCZgt({*~mKUJi^xX zR(m^MmYqjVGmh+1^U>*o57EsR5Uq2=7S0)8urq$k-*D(IboZRUaiM$AJ?P$o*H0EM zx`#Bg<B{L-s!0Ymf2sO@CJIe{H3iT;2(0joDqeSf4LG`EqGOYeWxqQ5EtvnD9X=hu zGD@4Vm<qWw5kH7(K0c@fP)hOnSXCEhTsNvR8Dvdq9e<Ng#wKsor^x&{t{Hoa0xRVC z?u7D^))RQV5N)mJyAw4P7kRCBb7Dj)ntZ33cR`BNrs+F4f(aoUw#|n4E{FE=cb4Xi zkqM1PqNvT+5Xw4Vw?uE`!PVrY^KBw*3Pw!#F=bIM#TKpTr|B|T=?C~V_Cna@);j9S zc03w(VVYJbmNf06G%ag6D@Y%vDP?(O>7}Wxvoy8QlirHR-4=pWRo#j<2UoDmx0JOP z(zzgy-ln5H`1kqfJ~SOt6Vw3R5Y(ve@rZ?N$iu)|GE8n7E!{^qk092Ct6a$>zjm%z z;z76119V^d$X3vW7VQD}O1r5MXDHwyy7>%ZncrIm_PIB_b%}wHzGOf1TgDvB;z?M5 ztE9uLi`NAK+Igdvyz7B?d3&DRf38{^?<-xG2UO=tbfVf-)!M}A`-s>DvYt%}l?-70 zR<+^?H8k?>(7AK-^7KD<3by5<K%sv^=eK-9%HAbDJy>Ji*(}<yicnLxs2@Ywphhj; z@LPxK@CLc0JhaHbf-l@FLd%a=#ifZw7Ndnm7;V5L0_+vWWB`4Q$lf4eeTaQ`u-%0< zz>Bs9MyJ~V3t7Z2A8vsCW7+X2&~KCHha{-Fx}hN&W~FMUwbUQc{Kq6L+x`}ockjbM zMnhQ%`LL&HW)vp<lf1;6`{L!-OTd0LE1UVU<^tR~-epatWYO78|L4C8_m*|^jOy9K L35nS5_IrN;{ARAk literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/mtrain.cpython-37.pyc b/brain_observatory/behavior/__pycache__/mtrain.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b700346d8cc508f9e925afc954ebb427be0ea57d GIT binary patch literal 7912 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 JTXYxQ{{p(ZMLqxk literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc b/brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..486eacba326fcdfbc33a953a447b0615645c49b0 GIT binary patch literal 24818 zcmeHPON<;zTCU7`bX9kC^}E}TdF0qLW7mwk#^aftogL=k_pEov?ZNi$LaujnvMaN? zvz_&r%&cyAsajfLgS`lYfCYBNfIQ*?;(&M@IC4O6<G=}}5J(__R)PyBKpgn~Kk`|R zcH6rk4pb|nGb17+{`ljM{}q4a`RVD&41Se&zpwxPUMBO8^br1XxH*f<{j!wF7#Tyd zGfhdAB)XSvS<UkQoSMh~tX*hMs1sb4vy07=TH^b>J=vU6r}(~Lmz&e-G~Z9ymFA2( z!}mpdwmGNH@qNjjZ!V|{%|&&QpC|35=CZonTv1o}dCET2Jggq(`?7tcc~pId@2Bl& zo6o7wHJ?|X=jV#8G+$6(;QJZ-So64gobPAt7n?7sFY*1H{c`h!dV=rg?UT)_TIKr% z`<3Ra>Z^ReXrF4Xs;kYKTI1&>`?cn2^)%lv+pjmzsAu?o#eSptrurt|AF{vDd`o>x z%6ynH4jV`AWsD={)ZMK5MMJ)ksUH0y;kPRJ#cLhUYPWQI4G$A*-#CBSvQ6C1oHsZ1 zZL96vFkKfFkX63c+1z#G=i-gsRz0kKY1h2z==IxHYa_@ybluvpjH_*G9z`v;(RP|# zCi|6SQ&$Xs{)T5YyLQ*TX*EsP)0-W)D*MwHOxwQEG3&@|xqkW5w%PLBk99|Hx`1ak z(dSKloxz?$ryrW_rs+AmXkq!H?wQvb=jxw!E!QGQxMP2AC?D<3U1{nYfd6A#Z<!xD z?QRE|^H;mJXLTs+s_E&5?&-)~;btz~>6i||<|T?|#fUGo9mlLwkElNNvD4lXPXzc% zUAOC98=z^;cFXeGj%Jv)P5{qv!!Z{8!vh&HIB013qbpZ$Xcy0G7p`BrcxmnCm2)3y zSI>Qnl7ek+==ELP<!Mwjqf5rRR&Tdj0uHV2m^yl{6CH%VQgGwGDQ7ZfMwN_=DjSlT zHFIX(ESM8!(JYyhhWy#Y{Y*nLvPSM+S)DS=M*cI2a|*@;a;D9SamAc5XT^n;S^2DB z%owxx@^>Y54y9i)%ZbuCl+GIqTsn`^ubK;q(nXXm8OvO{Xf9D-#)@(1UQS&$SB%4V zCF3LGsPW7_32h%TSMFwvXN~9XW$<(u<<FyBF<#*3Bj!<ahTlJC9KV-Cjc1~q7mb%V z=UMY8kK|?J#JwVFJck;h&yz-#Ydjz2ykfk{ISO)K*gD27pE6cC?>O>a+<J-gYQ}4v z_i`fdwDCIUok--JG2Y<3lZm`HjW2LsHIet0@kP#i1$hFtw~a4x&Z~)9?-)P9d8d%K zz;L{4yvI4KiCXU)A8=mHe2wdzHO>LEr_I;RGv*t{`OjqIf^m^+ycyKEWL!p#FPN_z z9~xg~yuNimlgp@I1YfxtP;k67dcSnt>^P=NOIM-gqcog$Q_&R{OU*WwuUl?cx0R6H zC`|8)C6=P%3hq;zRPeikwPNYE)iag#U8PG6D0N$RT?OlXvu(J_C)BoPTTS;9rR@Zd zt(|qPqkEg5h*qi-{_J|d+_a#5f2tF&P=B^fj7|ef3V4xUse=<~Zp4a;=#Y7VKi6ai zhm{qscYgt+G_`g^(_^+%F9u7C{?nDk<z7bOW$tFSq`tHz<I3X7;mYGG;F>U`hXpCq z&-XK0wl5<s_OnP!{T$NCegWx}kpbf6wQ9j%7#x>o8O||uqRu(`j^=b*E#QpCVH)am z`f(wAOhD}~xB*{IAfsCL^KKWM&o644g(=ZAbx|A9vtQCeG^z92FaVVSfEJ_Y1PEw) z1Pp#zOHSCFHZ)^1+Q5{}gVz!}PRvxb=;vJ1ZaB{YMb7h-D3rWF38Bq7PRWZ%z&}fx z#>A#+znA&X{)KmLea$r;_m;k?8?|+PM{n)kI@i*{VGaF_TV`w9z18kOY}Ju6bhm74 z{T76fx!Qr81W(4hwv8Ib?OW@PZnd=bI$GQ&uDp9I#3vddS~Me3Q|s(HCjrq}T<#$x znaP5b3;*QFd_fX_y+haN)p#Y=!s)_b3XbV@omL$>75~8Rv4jJ%T*HkZOG7f`hti(Z z&uqy=q(=53G%q}5Q%^a1LT=v3J(Rh;kSLcxp82)QRY@)Dh7r*OpqRkYY>>VoJ8z&* z#(s6eIe~k>;I%arJ5?%pg_2X0yh_O`61-ERdwQ`dIj_<EX-ZzF<V_^s#^qL!WTc8* zkt$MAnv^QJ-tr(`L{I-rHL*C){*aInJY~-Qa1l>8FVpH8oC>Ti|B$(BYF?oEXg$r_ z1h3m{+lK#4s>HA$?}_{x&|XZ}Uocsj(J*|^bTk(#f$1MfXSR6Nf&R^o>zn}?5f@p( z0|{&9A}?bS?`Q63@8=p>ny`Dty&^x!ETD^fB`-s){l0Wx=KP$&VtQ}VlRVidK9s(j z^)RImvJY}b>7l$g<>kPEri?tMzT7X~&FoEk1(fF=WQ|FbSG<YD(~MUX@Ak|68Dr{U zZf~|f?fkA+qBi=Ktw~%{M)_fOZ?0AL%2CU6-gKgsd9Na#`g8sHt(mP^Zw@>zZ%jXw z`vs%&u&}q#F9DLp{)F@I#?0OluI1LD{$v2>k~g1dZP{Ds&-NG4R;54RUj$sU4<|r| zbNV7CmxT!l6jmio;NOk1R-<2(HDcPMveX<WW<RPx-P|xu<V@U-9|0JrKYHNUA zqDoKF-Y|vz=*=W)@~K+8Q@6W@3Bj=qNp5IP+lrA-gZsuNWVz`mURyCmT_vcir0Tl2 zt&WyNSqd8PW`mlbT8iLxq%EMn5-wI&MxvMMSWWyRj!2wv0hfCO36_TRKz<-W6w7;= z2jGN#Se_4wt7X@~g}#J3{sie9nz0V1b|}zYG&UNv4KgH{=~c7N9MvsFN{YXtS*`}d z$FqXkfj$C;_5rF^vwpU2yUzQ#=YA3#?i}*&<8oQE0RNxF)q7_onGtZcckMQqjQf6V zOrMXzfb;;iH(|h&p{5LDK<2?8b;#%oMJ-S*%sygsW;N#!tj<|Vh^zV)#sn#aqJrdH zL^g0bV!-~gwqbf<%dxuk5O2gdkb#3Q9Rvp>+rsRXTo|<sO(YwM$rf-iMUXNOPz0DQ z@BtP|YFj_^fG{M3{mFf@u$eY4pf*ojHRqS2aXKF&+n-9X3x8%{y#rSh^zK<orYX6E z1Qf)t&L!!df%WH8Sst6iIp-(n&37mnh0ztp=<ti*!wc>#l1xBWvP6GH`C#Nls2y$; z;(xILg=Zbg4;h~Z3<4<gu=AZ5OJX%Ku)qMr{1QR`G9`ri5Cc<US=HO!mIvjX%yY5Q zU_+NvGIb$%N;0l$L98b3KtZ$q^RBr;hP;r`P2Ih%(K0rnE9-S|4u3ij%^mhW_=^E= zO7XEZ=q}F@q%TlH?FucDHOu4l$U|6kh?<;dC^<~YSxU$Q7A%N}1f6**nV}?438{Pj z;ZgiWAYx%ekwdzIvqZ@hy<TbRcM{68KM{=3DO2h4rPz;?aHTlUqOiK+oTp}p;R&K* z@_LsZ-=pLv5`S)pF+0Sn9I|zstCSE4^NjjSA@>s#7#d?aG8-6I0-XxIz({1oGA2Jl zo_{z+W?(%aXyN-|Mp?}ZfJdzY))LR65gV7=K$1B+Tc}JNnj%6kKv&F3#Vl#oli(@D zTf;>_y0(m~oJEbGjB*NG18?GOs#B2Ztw~wD7o^#qaOfno@<<whDoL3giCWhFh$GOC zsDkD)i_86UB+&k(h8*aA6U?4iRo^RuIY|&*P}`veLTP^>^-EjO?z{qPS5ViXUFE^F zCZW@XHK(A_QBAp@H44z%%FyM)vg!T=w6Kad$u%m*1X$oqzvBFgHx<>HWj!x^V-|W| zct7V=`bE;&pes)IXP~2%`g71gOJJBK{jV{g$w(p}OgRfIi0G{pMI<<^@{ZE5+q!p3 zX$KC^=oQjBZf=@NZ#7chm7Ptqr5L0dHeupIbJ*Fm>YH#~kn*nB)@{??RbcCRu-j4% zwY#2eL7`OO?PPTW|2o}{Wh*)yZf*@ujE3DcTXi&(Y%|pes#4>wWtd=;%88)Ab=zv) zc2Crl^Sgkpp+j#_-l(09UQLaCK%ij!R%_hoF9rhzOwhfQR=2qh4XoWzbYn}egDr*w z_cnD;*|BU}SvQrY?%XzwsCPo6?uNi>4D1PkNH`0~`Ac}@Y{o1*M+r@-7CuQ1;uF@< zPLa1K9PgQ^cG^~A1L`r8e8V%$Z5r05ZZ}#0NHHwebFB3)S!Qr337rv`-)`I6CMX5= zvm*MzsJ+doZyu}ix}ntdt_$xKHMqKgd)LxiijX+0em2`}Z&R^=K+wT9ySl6%3z<`? z#*!mU&S*-7Pl~X8=W{KZK=NTJY(Nq?7$E~9Mkq!NbR@?aK{ZOiMTIo}gDUEEFev^> zNQq^!9z~)oU{n&A(~w>*g@(P*gN5c?42>ohDWQ@q3og&R^E8?j9sm+L|Ai~k4T+<V z(G9^w9;+UsH|hcE%E#2lPttu(FzoA;af1?)fKX8wlq;0+70M9a4SzZ%?W(1OuJCQD zOCn8poQ~0*LJ3Pf)*5Dn3ZPMLB+Z?lqQ{@6gv7U_Qo`yY>(@)?13xEg#8(5KC94ra zEnwAxW&3;riL5Y=knKW{vxXB(;{nib5d<;(1iFyL$ys9IOC$L^T<%3Andd5nvQ)+t zMS@f&;YyQ6X&K^Gh+z_`sF@b4EP96>ULm=_c~cIQ3yrk!@gkOuDS)$#D-yAjpj>jW zL?RaMm0<T{z_|hkOz2u6t1(N?mAxr;p_Ew^XZvM#u}phe2*GI*#equ&9<vA8egzH` z5~yY87a)*}T&DyV%Jfz#aH0s|iV}9u2;nOFfpFzEX8Us^94Ps{d3K;Iz=85NaGorZ z6Q#8rIZzhiKnWpUg8O6!juSX?;6hn|17)c{v$Y5(3JK~teTJMU5i>ZLpibgHdNs-H zlg_iK0x_EZcb_DDME}R!C(%SbC6|X)Y}Gx@!4^@-&Qo5JEw|ko#q8IyJ_np3m$6FI z%zm^pgqnOTw|~rV$Q1&iHRuYFcsmsXA(j@pI}8Gq*s(C-gF?v}7y{Wx9}Nv*v@c^| z2xEL1Y-o-4Vi1ECUJM?{K0b_KNIB=rGy*o=V!;+TDR_i~P73F%^a9B=2*lU|8yGbi zgx6`*p}T<?erRcpaW{+@eTt6==SKjz%v0igLU72!dr~qH4bUNLA2|e%Kb_u&7hV>J zwn3b0;>B3z=S71G6{ZFMT1upI1;VqC;m7HYB|Hnv7x7qK5{>{ypHAf@b^N(->nGYN zaZD<VJOIwus9J@!wz$sMsm?bjNgMnlRRj|G*jXE~QCVFUiU7~kSViEQ)XzCe2F!XE z|KFklGO71B-yOyTX>3?3=c)PtnXsBb*g-^0#wFb*^DNYa!tzw84#?QmA$lpo78j~R zg{^X-NJOf{fK6T;r96zb%Zb*aB?KrkbX~y3oCaH75c3d;Qtw}N<;+E8-D>I1F7IB$ ze1QD~ONss53hhS1VsdZ0vEaPUdvLM)JKB0!jo50qLs%QyA*_XDQWK6Uy<^p`kjv_w z=w%X~y5s1(t7Jfu{RcY?_8eO#gZ{1nXi|?9y_GiW!fo8BWh|UiK!U$A#%%@`$eVLC zxiOpej}oUE^UAN%9LuPmDfM1ueKp}D+2_69ix&b*Ifw{2W;7bSBWJqDFlHD(*q~jj zbJJ*@oG3Y5Jc-}I4R$p%w~NkfKl3Q_d4~5orAPATVDTH$;S70m`?7(%NAU7~PXBWT z{_kb`S!`uxwh9Ke*`TxKyopD}e$L1p&TN%XPGysO1#ha4xD=#?yKvF;^IPTHvU|sy z{uv3I_xT2Sit}sgY-+Qb_7!us+3?^q&2F}L5aZTpR4e`xp<%Elwi44>%>L9V3c2v$ zo;1umeh$G;Ewz-$*lJrXe=^3DFSj~=VH=@W_1pNb!$sk;1>$G1MU4&rO}%6Km2)n3 zsL5Eq<Tz~y?oOIze=ZGxWw`2O9nK3)fHKYZZg*Wgmbh1PP&*yGtxm>q7J^imXlU*G z6&i31<Zly+kR;7yi&*lrw4E!>;;$edk$TUKBAWQ+hyaKXvcct&D~-c_c;B=yT}0Rr zrX;%-Eqba>takyIdj!b__P@V1zXxwWE&fLc+xT4iW%<+Gjlj^!I!)B_^Nf0Rf`)*d z7x<;++G#&WxJa!I8t8vczH7r1QExXp@Bd-A4hmB5y-`CNKz0iXl$qGwiCbc9Vx{s* z+(9=YBUqY@;KL&*N;LQf1O}~>4BVK#>VX02eK4>b)8H}*eDg#)(=twcD_W^Ti06e$ zPG-Svw`j{H`v_4okKo1p9LRq(@p;B8Qt4gkw(Pv^l?)0-nEcJmZ^?HhEHs)?d97C+ z?3GwE=v-;FJ$SBMYoi4R5IJh9Q#^;xE+NgO<WnS=Qn#hI{DSU!yI2i*b}0H;x7&0) zDxds1wZ}_CZ2Ao1K4yiEjTioeaLkdf@}xWu8+TUjy>tLf8*YRov@ljAUHw|i`m_ta z&s!}GcqMso-lheoRuoSH?^R%$iSQ^A8t*tXK=v3WSw4qikoP}Dz|nH$G5=XezL|XQ z_~2OD1F<Y%bO##A<$XrNZ9dTu!uYPxA{|(e@p$fHsDGIlkBCi6h$S(exSeP)#9u17 z=)e1?NP;LY3ZtQILlIH~<A1BLH33?sJECBbQ^K9RHMuplRgUhagS(11BksJ}yU<>P z+_{!)WKt#lpky8;*s$jI7Vuy6uo&bl1^<_$k`*KS*))V6y#K#W!YPNiU}pm(aER2Z z(|!qj&8kz7l0RcMEe;OWY`wW|=>8m>hE}kLCbF>SXPLG^(Qw<Axub2G*2bo%VpA@e zyJH#NCj4U}=nuiL9eCndmu0P%NG_Z-_P`^U45|!Gk6#Yrz!27DnEpI`J78(1fuI?u zTSthKSv|z@MC!EIJ`R0gOv^kjQe+%bS=9&t-i~taQNhnr@^h4IQk4O~SuCmrF)BaL z<8bbyqCZI@7vdC-ezA*}9**;Xnxqjp-=*Z|k-$zOR;^BlnjI_m>ZG7D(!nql1948r z@WNjaiN1`R40fK%VAn;k6Z}C$7NvQ*;7Y?2@@KQMH0&k|)w_s%X{zbEfNN0EHKFEW z3sH&V?}X+!%srk$cTIAeSI{{dFJrh3xjz4mhR&K@epvpeH#!eAxZlFySe+*2owh=n zR^4fH3?IDuAX&;MLO!MF+ol6;+fa0>!5b$L^f7mhvO<>nV?c^p(YH4eTezd~<Ie{W zCTjjigswvG*tLP^z~Sl#LRtN06edeTv|YEbHVxh`33rX^dWTk`LHjsqqz<76TTh+c z8bT<^Y>7&t#Jq~x_VX;TM~|1aRSC2Z(!&^T9c!Bh8J_;fXptg@peA7I>zjIOgDfd* zCU)DVi@h<JQ?Kz86mEWetbG>^t7FtI!rZz{n~G5;$zL+Un9(sAM!iFsO;tOY1}6ky z0G?_LP`d4U+wL}7ZrWa?DnokGH(8hc);r2c*pSr}3{;<f-Ij#~VnEp-m;)OR&(v19 zMB-%;+q~j!kw!Y0-T-?KO=hpYiH*adP8mo<gh7Yc53aaRg~PWSR(%LYw36P93xSFN zS~sB<Voz2W@nayu^Z*i4<Ov0=9FE2n(M~j3m}lMzg&r2DqYlo3coy~_v17NcBS6_| zrO6`%@1*XmTOdw&9Dsh$P0Vy)ptFTFX1$Q{RgBila_`6>LrB<8Bn;?B|LGbb81$cl zm2@say4Yl--ErFVbvqUv3<|eWv3!Chh5c;|G<G)7h7Gd_Z>OzvHrpPyWt(j<To?QH z&W7GX>_4*+o{2CX9}^l&pUcqSn>1Ng3v<@wy;cRy@HTE@;~DY`i<-_5M5NWRu|tpT zQiN*~n;Lqf&89D}NfcxE-ZPaB>|&=DFR?K`ow$#2Yo6&j91)0GdCa2wQ5W3Fh`2|r zwlv)yV5uE&nJH1P5kf*@9<{{MV2F))EU{Ln#`0mGWhUm1sf<DpKn~(<gjL|2hTB1u zJ}obrX2-&ulT;W239DGg4!>Qux}ZvmWwa<3g2)%|8JAzXEa>=@kaqe|1JGx&E)njE z(ADn7CPGF)bsa%QSnn(gqbleP8AEMYEjp<M5Ya7l8B;o8PJ|jj-+dC~T;iw#;TjA; ze|#*%5Mb{3*oK;d_*)mq3j-~NUQPvGAZlcX?E+{~Vot=cQf~=+!o~D6XMO9<G;t6z z9CHJw>YO0JLa<Y;W*aBoz%|fxQ->Rru@1h}>^4&!Pz!==Ts~n0c5k<dG}_9V@(P>; zpc9xCF|(o<qTGD}!!aUgl>`LWM?eNVth$49Y34T6B?>+vw*x^IkSSAc%vC~vYe5u` z;po2v&a6ZnT^T;;Al^QZ-t$NBlU^Wkmtvz43x*!h#{5Q#N=>;*9z8HxJ678Q3E)!T zwg%w_ruLq4(}7C@%gAA-j;Rl$yRTon;=Tq1wOGtXQxmHa?R7ds>4K;r8`n()Xob|T zAnGbc)>E_KXf)sw|Ho9Lh;J&7<<>-&2jJLL?SNc6nhSa-{KXJGo^#VX!baXtRTDLc zse=?=qahH_>sWV8dstsggy^!hzF)&4&Q92MTp1f2)CU*_h1fx}Z`G7*u;*;O(@81> z;aKTEktfCQVevw{fR+n(Y&9AXEf5I=O<*{32czJ<BTk<2At0l@(+WA+Fdw7t$ix;0 z)`Z9s(Q+gM@G5!^4j1o>p`b^8Ripicr|gnmeVQ&2kh}S`ee%0c(`mQ!l%wo+4%8j- zGMaAm5-B0;?Y2F78bN4+?nGUVpM>lKksz{=_&puUU;!{j{1Yvp%Yed!=8^J53@uJ( zv~;cp5RL~d@Zy2^Ets{m*7$HEjJN=v214s0Gy!77frq*x;AkB|79buJx)QYmK}HVs zlg#Mf<GfSKWkmX$;QmxXwW?_~h8kk$8DJi3VseFmJ?umGclMuuc&^&wQvivkQW%Zf zR!(~D&d5>ol7KGRGM(Xx-`yVqXo3Gz5QKU{p7&YCs0p+^bv{xPP7S;1X@a7|&SDeq zAUZ?0n1#+D&Ow7grmWn+-V>adxM<7lLKQ|>ba0X<VFW@qf@0JJ-#2Q?4SWj%2JnVL zE?+3)Euu6*n_z~a=Q5h3fB4S#g}XHN6aT|^e(+<^4aiX=Tr#|dBh`i$NHl~|V~#*0 z8Ye9;9TVUtY)7i`|2oKM2Tcl%gedwwsSXlNl$In;tkx%W+611O$2(yBXGixL1SpJI zp}&k3+KE=^N^f=0HM4J{2U)B7dvN0<^mov3<gFo+zC$q}$}U)B15pD|d^%W#Sky+> zNh(M~8p@Ahr5#`e5Q`rxCd4XrH!UbFy4?orz+mnSoH8ZqAvXO4t?Z^-0jpibG&#SB zWXv=kN6~kqX{_{K7@WqTFA^MN>U!JflrwOG9VFC<hDpC4)9wRrm09BlOhrG42AuDm z7##4J*q?(8TfYg5bc}xy^2+K!zi8l~1s~AkGu^RGy=$Hlhj1b;Lez~#)H30Qam)s} z2*?UQS$C>6<uZJ!tm+5uN$g{gTQWH059tl6i8XvK)Rl{-+4)FcztDv>fUQV4y@MqK z<!BpLMmyXMVXqRRVaS+05jP_gUIa4Ml<WG=U~jw}@d=G|Q!GfKQNfObry}-D1p6#E zE`Bv3UDn#3nQ->6D(6V)6NWB%B;ee{TA^bu$_YNPq@4h2f={<7qfs2;lbkQ)wMGjV zFL4lVBG&Tu?GB^<(K<r|@Gcy%x4QGAbv8^lZ~*f0Fa%c6fgtcn%mAtWEifY(iwQJ+ zbm?NG{-GWSF!1{%Po~$gA>`<T!wI!UL7UKi*y&GNtgw*>>!WA5SBOT2>wY^vM<r$^ zkZ3_|q1Ch<155^L7abAhct*+xu4C#HkS2Fe)~?;;`LDM}zaD<g1;!SeLEynP&^$+_ z0DmwL64=_%@vWcGM5+dU)|01CDW|K@1DV<YQMUsh{AxlaC!7G(L_+|2HCn)IktMNp z6O9Ci?80+vVqqwNi0v3w+*-RZ#dhF;qz$`j;8!M;Fs&zgBR<s7apc`lu3cw@rE@?U z!8t)@Sv%wf3xjmnvycW}oF9bhNT^3kgP@DmO4EHx0db2P)aAQqiPO|Vma{)oUlY*7 z=aB$=00r*}XWjVT=$k%KkK!Thm7b!WBV`$?Z=yRfEW%8vPQllWk3%pUVxRqJfD*Q& zpxp#-dOY6-VbB>y+7iGVbil6HV~-``WrrELcmZ<+0>V}tPZ0Kjja9t`YGt=B=`2D@ zBsT%T<O$&*Mxr<xRuC#g9w$DBip>RVbM4{-dv<#R)MahJ9uOj1QC3+HB;-m&z(NA? z(k6qt)5WREI(8TIZ4e##VH0dW6#X4QjPs{t$6QWrI9FxF#?ZWl&F`bq_~m59N0F$1 zvG>fNs83c*$#=XY_75pQ3UNo7M-m0w9_FuD>Hh+~l$I1;kGV_~u&;#YyW>!U!M&Fa zY$y_P`RHa8<rZQ-ftbg+iRoZUG#4}{lmR7ywp&?B5}1v)ZMS!5YHypn3F#Wnq2P~< z-jIE3&1S-NG-jJPc+VmFLZ1kU+Iaj+F`7=&vDVhcuxkP=Necmae1qY!i13XAfgZke zFxb^Hh(0>D4_Z8uqD3uPs!rfbO*9K*^lds%@D~wH&JIVdCTTL&a*9CV#Yht<9jxDw znLx8^>J+<2$PH*2YB6*N0wnUQjE2lFh1J}@iQtomKLrrgO2HE?7z!2jXvrX=9HDs< zzCMHKQ_m5>rlUjdXE^LFk}l5QM*T~@=Lgs9KwX$PAD~O|=_%Uwryu=~AfoVTd<#ap zU1}qKehc3}xs5pJYPR=5u)0XhV4aYT15ujTZ@?2Yb!Lvb!e77<p80@7uKkeuLHzq1 zX9r)=;jdf(#S9h4X~w~t=TQIeX>c60oGVJh*2lOH-z0}d_ZM(+TrLf13t#3F$j*vy zkx|f~8XYI4K-n>qKF8<`qeH3UKP8YqWDE|~uA`&qM<M787jaD@Ncy&yk>AJzwnA^| ztLE+w^eyq(0er=kw#Lj}@yx0SqUg<p+t`65>P?Ho=wt+WI3Z9BV-D4v2j_Mo5I>D( zUxZPD*>QLDsWgFbd@7^&>_~bF>*DhkUjXdRTa<i}lDCoI%WC<N`D3et?BAwO54NC$ zX_`N&;hR84*QWcjrhST!Nd_eonr5`?nkG(8@tNrr>Xy#+ikM73l{ZU|Cn=$Y&tH!7 zr`Q<|?;^e`>1Sc?Ip3kOvy{-eWj{x3$T8^oC?#8z(CGl@4kde(P>8o*q#b{pnb;Md zO}R@2$0(ujMdu+U99upS#Jq_^7jnl?OOdGNC?1D)cSTq_xrf9-aWc4_U!jE0QvE93 zeUFk~LxMBUBt7b47~%wdj&=mZ$*td@dOx6g)4`VwnXzf{+=H$;-1K#-Nk_)$e3nZN z51h9`Bx&@QonM--$XW1);18kfmMkZpE)JCHl_|uk&Q|iXWm%dn&^7yFa5o`K^T?TB z!Sw>JRa}Q~&4}{(m+*fM&)G^=mgn=8toS<3+xTSQE^XgAAj*uN=TJgMu38YvkMlcR z(AlN$3ese&ZyqEZGh7<s$3h+AFzV|Ed6m_W=sjA)YV9EJkv_@ab#nQLpnCSnUaF-8 z9kBxbnw0vLCu|17cihLk_)}i$=>s<yY~DL1;DEn%q^>>byS3E5ggfvkmUWp>{P7dF zoWxfedAyOrpHz4P>;;2OwNy)LG7fQZ{#t{oJu$H1rbl!FFggTU1KkXMc~*QrikO_* zfBLQjA;<DN?lSrHx(KpB$|OI5$NWd#`(FcL6kN>p)#m>M3}X@GED-9?KY5>nU#sOa z<m$Um+)x~-@A8L3)c2ma3E{J`YWQM|&4-lLkDj=VIPSV8a202W6U&DPPluy+p_rI8 zz3XivY@*e$HuzI%>OxeGLn4TQAnTjuuDTkP9OS4hOKo*2dIuujbnq4Y8jjJ5FSC)n zi$!64a?3BiEA)-`NmX>uASuf@TY-}o{73(@vp8u{#vjrg|7EERPdMa-zwCblr;yPE literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc b/brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55cdda6b321a9e797ff85ceaebd5a903bd98e9d1 GIT binary patch literal 31717 zcmeHw+ix6KdS~C+yo%yQmSjsVTlSE&sWxqo?TO;?SQl%oj3qe|GZXa4+bVVy$(H)& zs%p_BC}aT}NU{rUHV?rDfq|8PV37parv%v7oj+k8w_fuQ%)c<m!~TBXsZ*D(?q*Z= z0@>MVqKj44r_TA#cfR}i&Z#T2vr`#-{>P91+Wh<foXPw%FZ8F3laKLrKh9<{R>sOU zGgbc2HM6Z;HP^~l^Q}U)&?;7oS@nCVT9R@T)w2AbtWL@Q>FPB8=bNS0Om#-e7MioI zx$2yp7n>(q^VRv*$?D10LUlpzm70sKrRtKLPc)ZXr>dvqyxe@Db-H@Gb*6eot|yyk zTQ62$l=G?PORaO&b8<f2Jl}e``m&tQG>z6P)mP+vw)tx7LiK{2&oy6by<UA?&QCOd z&|0akv{tLDay{Q%YrRo@qxEL>&DMH#y>+pAu~n&7<hPT}w^|$34LM(EzTJAK`cCWJ z>bu#@Pczn{we(HKTCywlf_>7Sx0k-2sQ%E(-p#Bn|C)HcwN~)+m)rY(;j@P8`GsqZ zy62Z~cfCfZZ8q1k{=}_cT)Ez8+BluL>or=vX3v%DyubVhZl`_6HZ60jY2RpjwzF;4 zZGY+3-d6hV@@I{fo4So!S^O7H!%I|x`^C>1^@r|S&Y!<x@0yPq9p|R)p)Jq!mv(Hg zW`EW7YL@NRorXY*M^0WdJ^S|d<@%SshTC8laC730y=OX>%Tv{X22STTP50sFren5j zz|9}0Hl2pq+$0#dTDaM3dW~+=Y}>k7fMV1;ZP#;pb+6`hn$1Rgr`AQUJ5I}N*X^3M z?Vqok&3dm1IBJfxTXT56-T123Hrwu6(Vx5B-Q9QZ+O7-uZdm?;#_DFHWxJl)>bm~S zonE_*+V6I48zq9PSik%!bk)4Q^}w!sfcDg9H*VgoUAt1ddgqgCpWNEKarv{_&C8zy z;$>^A2B6z0hvsT^$2Pr=<1c*PalIYKcK@(vJNq{qUp3lwl7s$C1}E<MTqa{@s#z;j z%~{!M-Y(chyJSz`uWaSME&XX`J8R{w!Z$P3Nqfq=Y){)W_Usw5U+LStHDQ&%DSn-; z&f&K!_6htpe<p)tQI05w^OI6~^4pR%Wlc-z1$)X~L=7|F=B!z3?wbN?Si-$!+&h7L z^VUhZcgnhoa*N+)ttD&un_~3^`?S4`+IZ)b^};uW>KXg&gBRucv~>p8FWKiFoR{mf z){D4)*}7)W+SArK)Oy}}8Fd);EA|N~VOXz7E3e{?e(F{0g50|hyZ4&)y4-s$cJBw) zirjlWc5l^MlY2ji-Fw4&Q|_(A?yXxF<=!gpY3M7~TXJs=_ofB94eM>W^G58+cdU2i z-kZ3$ZZF#xw{rnDerUZXzf^$5w=jaU*83Qp53C=_-3?%tIQu>85^(Z%aP|Avhq!vj ze%Jc3_0cyOjKL3a{uAqCIe+g@Glfj`eF&0I{FyjOAN+?qb{CXow>{S&yBgb0r)8Li z3xaOi#?KpW&uki+sg13GyA4;dL}kjr=SCa+Yc?APwz0Ku^!Th%Z<?-afMIt#mTTN+ zwY4Us%6+5b1efi-ty<UgcJHfN)=K`OuD=%4Uu#(Yq8muE8vbjhTXYoD)yznK_$M86 zucm)+g&k*;mt_DXVyQk6Fb)3~@Xh1v{s;#z^L6Gy*2*42S3SvPGlw{<<qq>W<`0WF z77hzI77uecmJUlePFNYBHh;^X?}r~uU1&pW`Nc<OvuCfB{i5506!OcpS_4?C)%>Me z|3mEbQrM4p2j{}Os&@+zSp7X-stv-|WKH*cZNe|Oc5~Y?&{^jd9$w|)0uQh8@H!5V zQ<Jrt3}UVJ_nF`9U%hnik6Z}fd*-fbRkqAMv%P=sa@&Nwvdnky+3iQ}y-wF|yLB8p zl$!UNjjel-?Doa3S$}Bm*m$<tL<#HRy)DOVv}>I$)cA-pZvUP}0xH3?di*Qhedi5; z^8vo@91fY;`CKV0f4NfbU^!0A6^+wdYk7Z0Q;;a3*;WVG?l{mvO>^HbIkwkx+I0>( zKePDKl(~wp`wuvHAb~>=!ISLcyq62l3tm1vFM5UWyyO+-JZI&f<Q`81SA4qcmBLb! zhdHb8u<UFfW}Z$w%RB}FJt%{iKuT8eN&a5$@zmpKZ&H_kFooap52mdW>YVXrK!Qb( z+r(k{aO!aSaK@T=QU=+T&0oR7ni57NGe&wcymc}Bgty|@32*Xo+7w1-+i0}AJx_@Q z=p%5u>FgU`CsL{ggoF|T;qwV3hj&@)O@)3#&|fibY#Z&4XLOy;qlRT$>&9NA*@WP* z4YO^4#TzZ?VI>v#G(VdiUEJ_?8?GVzv<?t#11jCHzk)7q+KEOrwN+BoR?*Z}A$5Qb zshZu2Vw^^$=QWzi)+0k9*~hTGJ3>%ycpYFoyuKeN)ce3Lj0adD(Xf%>EZ`oNNY}Z( zmUAeJ{PK3A36saRNYb+*W8<zZtm`j&G=ypisPOP5JS+^pRvyad{zTAU|AYto3ZhsW zSpFi=V%Iv`ap}4?>%2gaCPkD#fHmn*b~>kdILpHs9+q(M7iu*65<vOq&@<Dj3Bsj{ zWN%LJxiUtz!M2@M*7Y(DYqNg7-gKS!c;kH@3?8I|!-SXfA&dN&hmUx8H$421XFtK= zF1{{{Wlj~c<?KwBNA;b`&17eC<!m`$$mZ}jlf(U7E<1&9;xBh_Dn6=}5HV{d0n(qK z!mC+ZO3DiG0uQBGy~M`xq1>UfB(mobP9P1kkP-`C#>+wlWgq7tf$~s8O1hN1!qYsI zPxhITG;;o+WI<LyiWDGmiYSfWACz#X^d$dy@~|K^ZUu6u;FVEZ9<rniX)*~pQW80` z1aTM<<alyKGm;kA&|M+TlWni`84O13_W(PI^4GwRTP6fSWCy3jg_0Ix9YbIkZF|q? zv}58TB&^6@NVIV`uqTY@_f#8!NDBGh(3K`?iYicclP+YCK_dy0V1z^kH-AgzB8Q%z z0dgeKe+;)xZ4)zch7AR!hhRBTK|lSuhWMrt?vE7AnnLd?Wfqgostbm33$l4>8`@+G zb_~5T3+6JUF8$p_Wv;-#wH;WeZ4V6KTmu(Vg#RA?3-7OG)juT{lsKT3rHn2yzi4@_ zO*-dz_az=gkSbwIMu~}7k&Pd-j0ngnhoVD?MYh~8ZKR<-6R%Gq{uGb>CBE)D4w>_1 z$T>>CDUp1Xie;RYaKu?5E&~TiKtc=5Ou)PsJtfi(o~eAMaiqli8NRNAgO_;<OY51~ zS-}~stl%uPv1p1vrsPv)wS|?BSy()u^d`i5;`tP$TwbgzWiw44PFV%9n2NWqV?a1K z`1dLQ4OfzVsstk>O0X=l9zE<=e<x9$v%mutni`;KH9&01FFizjW5-paHAsJrR$Vtx z$N$3D<#=XtQ(6Aa;Y*b@lU7hk`&a{w(J5=^%SjAR5w$X$Aj6})p{H37%H(Sp!_RVm zasF}sF#j|U;}t&8gTgj^q{Bi3s_DPv{uAO<f0((G`D4WDpiT-0zdo)m(I6!l{Bt;n zv^(*mNY(I1g~;%d%=$CIElY3NMi>64ZSg`mpQzw|1kq7q;c`2$(ZJ{o#)yzIl2%;U zwx4x`j&31hRP64fC4Ul;xKFQLfA7X^KaU`kU!eGMIDBhGMGi!<^9MNi6Ji)4W=0C> zGgkarJ!s-8{~9G+u^dh;fGrQsrVS8{Mbda;Y@yv{Y$+|=&v5V%m4!)=eU_nt@w5QL zq4>1)Eb|N_p1j5=i_5~`(US?~xICacQ+$$zhn&NBmk$1Ggx&FM2h*}buQbFZ$MLT1 zDI*_)cO7!p<|rae@d)zOz*CGbXm^%BdAm00BT<L8up>=yFe}JH?Gnv9c;zy^Q3Nlb zwY?tn5dDZNbWDxA^@a`W{9sn3yY_S7IWLBOQxwber{KdtA#69`*DvS-u<spDA{PEU z#h{AjA?yf^=T8$lHVVq}%Mb1Sy$*t&{;8N6Nd!xkl$vrl^8N`iu48Q$y8GUNpYM5f zzufG=WI-UtFS8-qCw{)&+4E=RA>ESm7Aq=wof^=#mUrIf<xG4$2GOEpqS(LU>ryvm zrl<%?*?Ii&e>p!ld9awEM^%3v?x}o8fCYT{-`&K)f_+Pp+AaKf=Fc)uVefjmub~UF z`YNBeLS&J@c_7-avyZb9%`94_Z(z+{<DHxk;)MCPXz*&M4Qi2541!R~O>A2i;buB8 z6FNo{L3G3P;6ZI+_+9v(mJV2jq~z_Io>7Na3W);DHkCv%>-30&fElR94DH;2xGE7Z z+`7H_$tC<=H|gJMYeVq#NoX}d*zCf9KoE}X9+nDfTaSSQ*H;DAlobr_5NT&VG8;{X z!^sQ|Y|rqKqa+=t5`GC0^+osuS@5#L4o$Ox2tqSJj2)trC<?Fwd=OKK>VR!{go3b$ zA;l4MXnQz!aPXx`<se3l)-WoR5)31TltgQSs%jBmQH491!^{_FAHzEMv&_Q@r*N2k zim3Lptc$b1%zasafXe#W8V*y!nC@P~+l3m;RW=-oLj3R|+jQg2)j+?Eop#5ul~AVh z_?xK@NjCLPtNYQrpfi^QUCQLL2bUA1&qAZRQu$Cg)%^%3x;|)+Qm-olB5ySuhl<#t z!Q{M%gJ#o76_i5(|6~ee0ThCNhffh+r;Y<=xB{M?Q^s2<HwUX>4hG#q{@~)V01wB2 zT+Pm3#n(NBgNHGI^_6)5{}qvJM6<u9V#u5S9z~6xicGf+HPK>lqJ=t@qTB6B{6!d) z*NjGxgw)iGWpp0dV6l*%-g(cEpobC6>VOg2R%cJxH;5>Km%$~b+jGK3RJ&1t#x|Wc zm>Fif(L-oZd_iLsvY%HjK?|OEtJP>jJggmqrP|#Jf})ON?uS5=r#8{Ic=uQPS{Q<l zL>+^1V+_Gb#B2T{qWoP<h}kuTE;#IUhhqr3;^;veFp}g-*aQ?rmC$dCoM2Q(0WC9S zmq=G)jZEhdJUMtNK}mgu6NE$N6~Z}>lQiK75#>QZVo93k5NJ|j4C4xy(Y($`6+;9b zv^A{(MG%;L2u^g=L3cXDVQdDFa@1+m-D3=F*Q$ighgB+Z*@c`k-GR_uN)%;rg=)Bp z#xFs;_E%qABI$W+se&wggC#U=$deTVrb|%CI#fr!*%O<{-0C<UHI$5Gq%~NJ{+M71 zSjLcRC<vh~?IXGYYlVn}P~Qj{al7F_L#ifIpvCFHSlw=R%pvgKQB%4`z;R$PGC9q; zMyKb7r0cFDCXBgRS}zvnkx~t^2YeC{{H|E`Fm5zjT+)MP0=HuPkuWj(I<S@`-$hKK zakPtx8JP*j><UI^MBhM&GFMADc3_AK;*CA3V1c!T9@@}r^@r$_>iH0e6mtf$Y&|9Z z5-59nV`E?~?N0k*k_IZqFQDi;h~x`sV3{6F=z7O-)Eu*6cDv1nZ4Jl4Z$tl&-FXCi zASlhI>9n4M5bCB^htK-kLks=r7@sD_L&ZR1CdF&<{cndYbS8<_Ww>uNB4AyxP@I?5 z+_-d2rKA{I*3f(zhzD)u#0J3-qKxS+r$uc|Z63{gdiz})x_z0yw0Yos$PmSTR&@2i zB$*r3@nt-kd5t=LCVQ}w*75_N{1-li&&RN{FWBuJ%m7<8;flBoQS){&%DbJWm5f%< zLI};vzXlKuOqeQ5;cHHXWIq&h^FfZ$C|u`)YfO&Fbw0Q*2G@n)x)fX&gX@Xlx)fZO zgX@XldNQ~!2iLm3$q$v?G9}PV$*)rnri0ScynZ@^I2qz)*321X5j-qBE_ky~=hXFs z6VKR-S(MWd&*408oj8+uIxjt#mun>41lJ4t_rpSXZ&B_oh1bh+eJZ?uLH{0m=Cs^9 z6P7uvuVZCi)c2mA6j)x;*HT8^JBNET@XwonfmkQ)d(+?yCSn?#D~?%brZ(|c+$e)Y z^L9w|Zm-qigK&V%7;TRiOB#c|j7x@S@^zyVWXy$4Q}J&?-n4tIEjR>`@h|>?asZ&u zVH~xQ<0ZiZ!~@`c!Thw7Y`bM6jD+8Gmkl`VK!uBV4JHnZl>pF{b*9Q#_O^-CHRGMi z#`q39ah!lW@bCll6Z!#GE<`8;sp#Z3xU~Z(U<dJ3yJ@*Y%u{5d!B&8T8)}#mV~C*b zpkB1es+Ez!0o<mAo`6ytSEw(vS7F7j>~w&O6;Tv8VGL#^uwhmL9hx?acRGO}ITFTO z;fS&!t(0MjnGq!hA-fc`0@HIer1}ydgJKwwqMjqx_0f$|A1EPtjJ|1GgF|dmr9|zd z*i4TD{}VWxrDGtY)o|VK3K;A7{vnGg#^(pH&tgZ86ObY`8)62gh=b_UlaHaDk}4Hg z+E94RFnNCP)W8O{p*hwTHlJ#hu<3C>2I-kS1iS*bP7&Y0nj@CdWY>p0_!f5Kk#a9t z=fGN2I}{vy2n9K52SmAx-v>N<@XPIHW2YhE(GE}}@Wnz(M40{vI4HwBWMefZHP%Ep zS#a9J3XrTMVWfdQj8~K@;B`Et?R>AuPPM@v#epzZ0~eeTYm7_KN!v;b*aUcwI?diu zw(ifR42Kh;-$bjfMwb<m;y_44W(ve{2rX5@5#YAWuaN8xUoFbw9&MUab#-m?p;lbl z$PR{GqLcmMxfIk%o8vjebsyirQV6O{HN~L};8CH|kBoPM;d6C>GW8H5pzWIWFOJ3s zi}&M0KRvqcTCW|5CfiC|6NH`k9#uaan!O|12vGCg`mv5gL2Z55-A;Ws3J4QS{Xqan zMX3hS1;xph4HGIg1cQ4J*H0v@=j%a#EwP@Ynq@as?-+_2t0x2NP~4yiELBA4s~@fe zEsTtv4Wo%vjYDZ8Rq{L0NPlgE<EQ=fGZMoolyPK^OF!d;8iwK0s!0eU1&0iss<`%@ zkQOxXJyBx{PU34^UNgU{jf<*5qJJo=!g|NY)QI|Hm<o7wV5i6B+dd@_*5yyfoCtp| z=`i^xQ?8AFqR;X0=ld;w|Ajb*#H&9$+|0!sWxrMFFAgy6{Dp+cA<7iV&2cM9nIZmk zOv(F;12jMCPXwD(U1hDx{8=IX@N!0<Q3v^F5<kX;nZKO;DQE=Q9eu&#pkV4YQwUR0 zW&ahaHT6?Wqx$Ct7tsLBC1aBQv=mpY00hwpNOHPA1*`@4{DtUT)A!nfpNC&BQA0ns z(?JGPujLnoX8b(R<rhdB{&Wm#e=bP_{%maAu`CWbPO`AiFR5X4zC?V_&$YXL2}|t& z1AgEN85eZ}Vn2^t$dr;<NS8$yV=)cp190XJSyf#u<6B6McMH?U{WF&@Fu*yW2F6Tf z)lcSb0rTO^Wx-!g{z~(_lPhz*Np1=Gb-cS29(lHuJ9sS>4IR)-V(yb++N=0VR24Iw zm^5d4!ojDQwED6Ke>}`4l8Ly;H^)M(z&4J&rArQd_)Bo&qnHpfPv1oSl0!c@;4A5e zzhU1cFSB@HBzmDu@mNy#I6W|bhT1Mm{7%9@@em-Vz=C}17N+mSm6Af3_QT{ImTp90 zG=$mS-!MKshy?*v63ulcXa!TdL23*hcVy`W+|5`vHfK4p!Xy-jm{pVsPdGjHS8zA6 zT-I1|_uKVd2N~E0lH#|5nzj+7L*iGgstDD0!{X_-I_>7Z5#`_@1Q<500Tv8L89&FF zb{>*Xa5Sp9J~iq9m1!88!{ETHYY&S4Va@{c!FY7ErAl<uU*OPk78=BfK&O?qsAZf{ z*U&(sqL!elC=iNygA&#ZVqx(JQud2dA`8+}#Jqg4kRWFHc`Wk%RbJ8zoCXpN>9vZ$ zQVCf^o1~wDSS7N-1Vv0m!!-riI1Pte^G?L7;ZOg66Y+@Li8xV4DIFmh62(|JhL92? z=)t%o$$B#?Ox6!13bPsB-$)3OF?nE|kcTQm;E+Snz(O{zlug82z!R;$g=B1>pN-1K z#s@}YTW3Y6Uaiah_jo@R@kn-+Pe+n&3>F>1nQTP049DGA-Rg9j=~xgO+;pgzw!sWo zZ>OFRKPDO$CeO+Yi5P}ykXg&^dcB9#%ODs|22vR&K|+^gU74D3hE9lL!m!iZk)#HA z;+&9y?g*KTx$Qw5Xq4D+{stQIbSN}lI#@~wjey9;5*z;$wFHa)4Ox~e$}JkAP{D=d zXj}=WenPlaA_f!J-Uh`Q3@<Q)ok9otN@qEfQz~2w3410Xc7kQj0RWuqk)#hnF)LV? z)s^>Q;wG06W9@Ya!tdl0uzNi<adk~kXT|NAB)%D<j0QYJC}}<}+rAHlJA#{q_(lr^ zMW3jn-g*n_I)oG^<HaLP#@F!s`ys<D_bok0EVCbrZLXp&P8#>xio_|})tdf*h!w5h zRmNe+JHI1WQk7v0Ri^{Vbtsa58z{GO1m#}9?>9rrT|79S6!rZgaWM6A(VBAB9x&-4 zYu-WPt874n2w(?Eeoki((woKyBmp<xVTvO+))42yh51{tD-iEHuw#&R*+M!@6k(+H z)IUKz$|LKXo^3Fdejllg8wOU@iDpsF1?D?j47oVopi$q&dhR+zKhn#;r!3cFbT@>F zv^uEkfp4p@F`~<fib$=g?kDg(qT7UI3~8)~50TT@@Qs<PoATXtZ3!R~eIi)=tj61; zRmtRBQc2n()94y4>vgGkT?sH4oj2Xxbo~S;(lf@Y>vg)al*zcLGKJ-0tzz6VZ_z63 zv>G1rj#J%&dsNfT--sky>17f!I#%*zs!l14y;G1AjqVS1DOH^+xp{Tt;s<L9dJDoR z5&yBr`XhlXrsGOZH6sQl(m7Ry+{<MMNUqIf87!nhqQ?-Fax`JydIF2=V$ts{rt3bc zqhShnnAEKy9*^{bu><HwTmS7&fCf%sAZKr{9rZ-Fmg)h~8Yk^k0ku+2)5#Gd8m~#w z;t)DfwbCdX%_RefPaYL}F2)4|zz&$=*!7dR3D}_8vCT(0*ubaZ&&GQ@%A4^|Y4j(h z)>f$XRt_#CwBF$I3Dt*ZRh*Lh?r7D={6<lKUj*ixuE_9gMDZ}a2~F3+wk|dUdv&{Q zLu*mH^;3Gx?>K6O+E7#HGF+s-RTpY2m$;=)H!}oMMjK9*IIBrcj@DkrKqK*vp);gf z>=}nKjTUr_5(QF}kpmG4!7y_p97xlZfF)N_Bu8k_oi;+7F-8oZPL=Pq5yI+<YcH#j zRIFmiG7SYvSWZ9Nhr3i8&)<T2vcLYYfwhA3cOX1}G9)aC0{SyZQVNG;aCjT5a045x z7C!tRLsnQiczG}@gk=+KFeF@WPNBlhSlG#RJ9VrThZ_@ST52ei{PO}+5Sx{Rog{Gv zyMrLC0^Nboqs87mXRy)uox4OPF^vBGmxhGUM+{(c@Io^lTLHudEgVQV&|FhJB2X>c zay$#EaK3NOMK>4Q<Ss#mcrYoAxo)2eEg_9_=3gO0pU$)_4~#Z)f^NiW;*s<e_JF<W z7t%t7F>!d5q)w$KV~S#6MtBTFERcda>@XJ^$<%^e=>>uTRFWZl990cpI=mR0ZLEzG zy#0BUuNGy(xzxymBDP!DTJ&K}8`NAniDdFsF5IO^71P!oZ1Y_UoVl2;52P@HdV0+9 zBm6YXf2RAzUf<xa7gL4d>cH<r@-BmhShWhJ)<SX^*21>b?r4K++p@hqTPFpXZCIoV z^IUVMu)o()&-YCo5fpxYF7veF>Z;YzSlPC1+}H3W(1hJ|5Tflh2lPxQsK(Z#j)~Jd z0yPkinbt-JjzXBwu3aX2f#_L$R%)=VuU6`*ReBmAjK(%*qA?AKM1L;gG7w6|g74Ud zP6`p~cwH7r%H%afc%Y0qeUw<yhq1;A%fTaZSLV$W&PP=NyK!&@!H9&dE9){?iC{Hc z*k$`h)7-&eB-lxJ0}J<=>kmGZI0Veoq00i>(e9FBv2%`asL8&`^o`h}ibrZUQB5hz zau4GqXdWB}?`bfMA@l1Af;28DHvrEl!)ucn?;xFiQ21!N!oW|gsX6wM6$d+|hJE8B z3~1`v4lTNdLm!xZHF3)6H_K8Q^k;<Y{JGQFGPfGdhDYATbQh*i0@EjHTLwWWaAVL+ zy0fH)tHL)y9SyY{gNh+mY0I`~<{&5qTCd}R%dcY-pqi-oU$dc1$HTP2(i#;iNVl$A zsDWO=b=Z*u>xhmR%xkftLb?{_HwcevSB2!$O%bwBFhc@xR$%pG?>O1cYlS=0uI$+0 zbO2CaNk16D7)W($g3$vsME*-iL030mq*5%PCZvw3+JbcNapoj7EJtAct|l%aZ)C?a zRN3Bf74DRGwG!VdL9IH(zTh=-SbUGk3EJ^64hEa>^4vd$)>5T!Z-Ktb5|+|1gZ;!z zU?Zu8xksBu39?S}Z#YIrSw$oK*U*tkc&wsy80*xHLW+j^gpVYZ8T5ADM%Fzhcj~a1 z5H^g>hmzRitqhxk5~Lu?2?7`@&y_ZeVw@oc*a$z&wNM5ustH}m5%Mc6!zUHL#w{hK z50qq+#?w5>W<P0lA^%ieFh$@UOVWqY;e2zbRydqWp{HvJ*oy`yAZJ(;vS0+<n<yyt z1#{t$tMRFDy}-`Iu*y>V6s8DvIHYI`ZbfXypBAwU$WTbfv2mjW1r4QGw?U49sQSqE z9SEVyQeeqIl&FeQWswsIv<(j+Ug_VDLsp(ujN6!qj26qo6V|&W47O9~Si?dOdZYF+ zNn<FMmH2N5C?-rkFEp4K3bvM54^U)__DT%{iOTB0Y~|+4!cnvcnoX>Dbpn<!x8X}9 zF_@}G>w=n6qa(rAi6MQKw_?3Ss)rDCsx5-N3Z4ylQ>DjuWFcd;_)4WzX#O2o3uDsk zcd&Rg?T!UMjO@-ZLe<?Qm`71*V0W{qTi>;<9ybk(StMzS-RX=3YE$$9H7-&=f<zqD zj;TiW88Sv0ZJe<Q)bl_DsQ{mn-Vm1($bj4$JTAhP-vKHaiLoJ*jMpP!iuw5ekEbi8 zNg$a$JreQ5XcWQ}v=E8YKv)c<1tmZR3X8$AVqh&w0;hf&cj_fJ&jODuk^s@v<AAEi znsf<gSjMean4qQ>vjh1fG(Sud@ulcQ%2RQBB|cLcVIeJwwB{FEX>@xuNhHW5VFnTE zz)z}WT8nBnHia{aSXDldfT<FE69wWNHIWc9jRBZOdC^0rFPNmG22~>`)s&J|&)br? zxR6<@76}`oNm5Qsz9x-h_MRVzJFP_{;{wTo6KYZRsM$4H2=ULMFLJGamrJqK5-v!- zKUj<DGi;#ygo*w+^8_+S;A6^rNL0inND2wU4N;2IQJ%%M{;eQ}#ap!_p`#DVSJ-aU zxe1y8k{GF2&=y;U4#*M5L^kH&F%N?uM>q_e?*=I-jR~@4`9wn;84X*w+Mw4P?S>%M zIdYwZ?&Q%e{a<PaTZAKTy-inQ6c?eGVL41|hH-|_w^-z0RlIs?2YZ)dY-kUsdI4{) z|J@8|h<8=oPfdZQg${8or6?=3Sczsm<9o0VW}$t2F1A`1Ez8*5z0_)5a?^vU`lEZV zBjls7!1dxWEU3v@^Jp~KcyCx&c3h`4Is(;^&nj3BpH*`sG^3DD)x@R>Fx6tyb3_?G z+lXLe16>$3ve;(isIn~5b5&WTC5{+S8RjEg?_o4Qm_!f>=1zc)9*0r**JY1IgU1Mr zrXsBjj0QpJ$T!zQAVuv&zm|(UkAGar0UFggl#n6NW_zl7Z857nCD~UCq%=bROVnGf z!C(FK02z56GSV8{?+tDA_jO3TJ?wo54)&itsZkK_i4E<fwr$oj+S!0!84@phoj*bE zs6{X<eQ!q6HDE)q=*=m=k4Ng<V~Zbd;~DO^^(rpZE0DO;7Pj6m1TR72>qv^+RDWBx zc0IWGsolgZ47CV0=;bt?yrzKxCpGt|@hdZlm?RBbM>lv5fKK9{zaZP3>(Y1yA6{_7 zZS?Ufm8<v{J?9YW*slEV@=^}6-R)&u-XR(g>_eyc1{d{SmxDJFlm1vDF#KgS30)pe zyfOn+Z$QQrm|N)1ZQOIX*lx(ERPmD;j!ORyseK!HCz>4+#bl$T0;fB)QU9dW8)s1~ z20}9XHC42ZdczMMQ<Ki@yV|XLM{VxE{Ig)wa*?Ol>|O>Ki#TP9$1iJQ_6rQv#+GCD zjn{otyc0r~@5?F|==7%L3CKe9kY+8ht8VT5$^ZWG{vZF{U;Siwb04F0Gi<KdmkA=x zC0^FTQ7+uVXD!S9^!dVywGa66HtHO_yltw6w;a*K$N5aH_9d181;0$xYF4LStI7K! z`ri_<gnHz?X8yG7=B(JqFVOCCxbvM~6cHplWczspWF2mltKKOg8)lPT<#hsz1i62< zY|rj+$Yj%J=UbfNEgWhiVyDBaT-Wj^uYozQbCrXv!FB$YKa{a?GWgirmzAN;e`6(o z!^3MlT;Sm!c=+!;yuyRLT}k#8<On$A5_xf)dMOmy&>`_V|AYfJC1e(KU3JsB&-)+q z{%r7yIfk!+s*pB->UUU3Seh?6;W}WK*e@3g`S1lKg@uJ&ekwbEDVNJ+`S%jfvkNca zyD<Oq!prj~=HJA+-apBda@l!&7f#`OF8IHM|Eu^e<9ianzlHyw<g%w%bMhXI`RTd* zTz;mg-r@0{^Y73)Hc3WGc6S5Pgz=a4x!rGUyvbAH8(BKDKR3+y-$&M$f3sQDFG zJn|O2Bi~C#Dd-A9{TpLHq+e#nw<uL8<+v+6jCGg;eB-O@a5G1>w>Y`_d28Ma-U1u1 znR}J{?;jgd3D!Fl*!~yCepqX^@Re?%`b^((X4!S7Gy2%vb<9D~_#Dv?t?ItFr3tJ0 zKRR|RDz@!9^91taV?VAGXhXlrPU+U;SJOAWCYsp4dTeMU>fl!7ALjo+ht4AV_4wE| zg~;#7+aV*bB^qt4x$qh_c?t07o9fL<?~Mb4>Hu<TJAB^*8DF+jmHpB;#;JgYkbb>j zOcThP^3IYNxwF52Cael!K)ZrC=Pus^yxrK5S3&v9;qSu6SiD{_yAAcODA5ZPk&*ON zXOx|O`9r0iKBB&KX*iU#r};i7{^5l|GufrWOnxRipXZUU5W@e$eD0+p?iJ=>J^dfo C9HcA& literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/rewards_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/rewards_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16c51772308d986f27d4e4f0da65ac63a2b1b56c GIT binary patch literal 1444 zcmZux&2Aev5GMCeD_KT=4o1`yuL2SoL4Y2NplD*FrywZW6a_YNTxv;4w0Fr3$(15N z3J@TV;e(By`bvAvDX-8|hg>O9;!+?*a%R4n`G&Jk4-b0?M)~(U`d5t52Y1+w2sS^% zG(W<^5W@v3afY$m2St#D{y)lMj(K>Q@c6RB!t0PlEPfwlDGPo_!{j5_q9JagGm+cp z!?1}MwY2G3QF3ExS(zr$+}2v=fm4Oig_*!Sg=wx~vFHY`!T$jK!VCxK7H@(Xaz7Sb zhnw)t<vO?tZqXS!e>Dy^(I#HUEFPduvQG5<b;yzdx(U|_>wrDXTgU=#Q-6!M_uT>7 zN@CUny#uiCfL7mYb)3!X`+v64gb+cxP9eiXdJcj22#ixDjn#E-36+erSrJMqI8j5+ zAn#u^Ejh`Rv{XnTXP~sCni0ndnJP`}To{jKxG_S>o<ICbot@>nl|9%EFLbsi#L?@I zE)YUq%sF9j1%T9o7gHD3kf~NB94K?HEvOhMLtWH{R3g7BIGKuq@1am*R4%CHj4Xwn zw<i06eXimOk<|$D)S9kdK4j;6C~ZXK36XVKt%z44YDzvElmB(JjqNVd)UjcRke)8G zrE0VX_)>^-B8(3>FI0ZzWp|NW6hMP;$$8XKOZad8MSj7yH?G*|QyK4~?bX$x`l5cF zSzB;JW@5qRE`_^LUzERzh2^Em(g~l_g-|-{S}kaCQK%VoRI*S-U2^UEwdvE^s@4f- zO=s&)cR;4GTb$NM*J@e61*zQQGTDJMylC}x3i4sp1Qlz#pAybe2t#YNgqEdM#U&ed zb-2UK(iV<Qv;NlWg?oWbDA=1U_CoDiJL|TdmYQV&oBo6JH*ov!+tZWr9|oTIn9eC1 zP3V%!)%b~|z$&AU##}DUSb<lQ!>X$J%8Z|h$=E<p4=S2p(HRHZq5utcbv)6~VHauw zhzkmgtd4i&9q*#6w94IMma|c{Y7S=HZqqmJ>tl{!LHCYuAAgV2Ai_uZ2e%J;f&LC8 z!)}w<RRz}Cvl;u>-2}4AlD6aZ0jOo2ZBytzoV=yacW?O?1Wo$5RID!ePp(MD@!!WO IPQw8I2fN0RmH+?% literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/schemas.cpython-37.pyc b/brain_observatory/behavior/__pycache__/schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e619b4b29d9e849768b2093c00530eba33e4f95 GIT binary patch literal 8167 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 I<C8}He^1K?ga7~l literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/session_metrics.cpython-37.pyc b/brain_observatory/behavior/__pycache__/session_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2cf19a846ddce2172e055af131866ee718d2ed0 GIT binary patch literal 1820 zcmah~L2uhO6sBZ5N!_N00V~#G2g18VL#uSyE$E7MDFzf63aslcf&qsTX`2W|dL-q* zSaulDACjP_{v};^8u|}*+Iy4~%geA4&?99&e){;{_nyByJRB1k<@?{+#}Ofa;7d0K zu=o}p_azukc%(=c!5pi&9Av|Y@B=>Nqjym@;(L7m9m)21^b<+${0aW#brRKgy_HPO zO6Jbphq#UxrXCf{7s~>%aSYq%6lV817*DREOL7@s$G;6=9y}zM(L-_-UlTx%*k^EX zOktcdRaA<3LH$xtE8NOxCulC2qjO^^qpr%G@YKv{U_t$6C1B5*5;k+OWNT?GQvuCe zCbiTH%9&?#%Sw@k-(T2;I|(cNX25auXvH*VE`15U-=lAGLUA3=(ZXoof(8F4O00#V zQUj}!d1>?w9%A0&17B&6JK-F-r}T~ZrIJ=~z*beMdyEia(gYc=H+f9YxbULzGjKg? z?tnhqAL)_v76`uv-WZz(vd=m<MhT|r4o!%tu1aBL0j?Y(1z~u4{8bWSeX$gf1WVD$ z_>hp&RFI7&;}Gi|pe|EeZd>|*DZQ{PSK=A4d=4~UweNj`u!X4#=bEhUe8C%9EJbl1 zsNE7rO5dU;UC>2P1X7l|P!)#=OAYj;+X3u2(F>^*D2K|0Hjs{#z7%s-DgVvUWMLro zlc4QM5>CGnzOs5Np0~GTdW14v!+jTmu9>PrK9F!fhYc9!5LF%S?2zSISk8i|+e9aW zdK5~ntGlq74NJ&oGR*dx!`XN%2D=XxR}b;f2V(EQ%U{2qo=kss!n!Gg?4>!oV0trs zp&96!v#+N@uiezFgmwj3vs!N4^aq(w9YpELiWTQ@8#t>Jc<}S%9K}2{P>FWUys?|( zuJVpsdCy7##0r<LHuYhrjv3Z5_J&}{C-)+I7v72p3=W)e`xGAc0L&${CukGUocLf7 zUq@F_Xc$BGBe?eR;et9r$~o$FPBC#5%DKy3FTxDgyOkJl{<A}LcWU$WZ=HhCf3^>( zPFGl&qo{9$*M(_IqQQI&D)h^6i?$Bh3huXo8<ZY03JV2s(-4~qY-Ea+r#-fX|BFn3 z&c=aEP@ly-SorTCNn8)5le!+bs!XEn{%$maz8Zu7IrXQI1!z;+!@Y&}v*vz}V9Ui| z$k^Ton?!bi(|$Grf6z#*SJ@YxzS3LzO1r>W1hIQ)P&xsuM*+od1CN7erQwwl&rwtk M4;)1I;_-vO0niK^hX4Qo literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/stimulus_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/stimulus_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a32069964586a28e1b7291f2ce97d6f0e00a1ef GIT binary patch literal 15607 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/trial_masks.cpython-37.pyc b/brain_observatory/behavior/__pycache__/trial_masks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b0dd6fd5ebee6c281dc38311aaeb1b2e6dbd8c8 GIT binary patch literal 1800 zcmcIkO>Z1E81~H0ZZ?~yO$92dxL7?@j7T>X+@cD#4T2s}K~1@gR*Jl1Z^l`#J+i%- zE?N#Kz4kwVIPr71&Xoh=2XKHBk3HE0xW|(1vB&TC^SsY@cSi(c@$(Pt&psi)g~Mj_ z@bMJWjj?dT6Ge(7?rG8EDet`{MaDDU$KL1Le2Wj?CdGg!$0Q&90U7eLOv8o|cIYQZ znC=CZb;6VRwte97b&>FNp4kU$!h840kI6du2|9dw*7Mm}A1}y7GE4k`XYXKjP0qG> z|6T7G9>LOp-AM?cMynN-x>QRpsJD_SN6n0u!g?lkcSHTE7H%}67~e3<7Qzeb;_=bd zh{sC>hqPvzGe<vXo_!Gn;@=?8aWe}y!Akf1TJj_sqK8yT=c%#O_)1tRVUBrYN1Y3= zgkM_yANx_og1I?lFHIi{D@BZDYK#(0yM4sT#T&t?H=9te9gHeoTI7Tjqv%-lCQneK z;8vctnTFqOKWfQ`ZBGf^X3|OBrZq1Hoy9iQb&(k@T$=^UHoyVGgD%*1=UTV>h1ebZ z{ku6joP6t$(+R5>A5U4s^lI`<v(g}qpH756cN0?!?Mkesu2ydHm7Go-GV`cr<(!=g z$SOGG`21jMQMwZ|g~s!cx7EQ^RP0<Dd(asVnR4TLWdn#aOgF?r_TEo!r}vV0TZTl0 z5%v&5L|}LyaK)306c|ds`;~tAHGN2rp1nSLvB_zG)Xjk<*69Wzkf%j@YKnfzd|BmP zGO%qU@>r~HxrJkU7v=F%p9<|yy6S$2YZtk@Yj^SeJ7yS9uLvDd86L!R?%^XO^FGKt z&%RIBF{$jYK+IU9O-dWk0Q9T`wW48`Q}991k7|%(A@$OWoJvQhLYam-19JJw3RfA$ z$6X~}SNIQx&sYiYn}zglqZ=%5Dp^)hJ=1c*6m7s=Z9I5b&JiG;fs5je7vK-4uqqAj z_=o$;Ba{gAi%P6$6P(?Mf-TaOR>DuFy;@y5bYp!a297o`Q-=9{YHBZyW-7uaG@z@@ z&?Ta=o7lU~*GQ#e;8U?_ihLh=o3W+xhxC*2;~Q^5?M_$XlThLaw!9b7R}4DW+blri ze^|740Hu#HU7$00?^Y6T0NmR+=37NyFBc&E7EZ;WYms(<LnM2|Y83dF+R&M7#QE^a W!tkXMpM_o!Tg5OLro#`0d;b8gf9jn8 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/__pycache__/trials_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/trials_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d66ca5b24cb0f323a6eb9a567be17a755f8cf05 GIT binary patch literal 36163 zcmdUY3w&JHS?An44~<5nhh<r|9LJeBPHefhV#|*>u9Mi2A9b)5V<~Za<8(aIxspa2 z&B*7DY)c)b5T`UPq@<KbX&sPxl-Kg^F2BM83x&2oVGFwp?1g;*yFgf$1%Atq-NLf_ z|9|J+I}giF(k}bkO20Yx+;h)8@AIAS`+wg#_sP!AObmbX-~F|P_xxfk_D8%4|DJ&7 z7=B(?JQh<iWtC#{mSfG^j&1SYF2$WVuJKZ0KItTbu#}UMXKhZKT+>dwTr*Awu8C51 zzSHTHxXDu2e7Dm*-{bVmuXEPT_d31v>z(yhtQd3pR7$m}v}#uw)uFPgQ+26s)uYy_ zUbSBJsST=MZB(1ofZD9?QCrl#YOA_W<<$LZn|eTPR}ZR()DE>%4XR!0ZECmLqlVPO zYOmU-hSh#`Kpj+v)FbM!dQ=@zZ&ydvW9o7BggT~<t0&cnIx+o(vq7Cyr_^cn4s}L7 zrM^m?Rp->GdRm=VU#%{vF*UB9QO~N2>YeIc%2Cg$OX_*`Zk1P;RY6UtNyR@`O{r-$ zql#))&8d=_S7lXE3+jr}%2QRfsIIDO>bhD|%j!L<cJr{)uU6CxFU8#c)s44eCt^1& zr{CSA-mAW*F$|#t>TA`DFU6eA>V|p=*L&3a)Ysv<MZI6WjO)Fw<!&8_x%atS)dz0I z)d$trzm#xt?xraGK0Gu39kcf%);HYDs8`g75Nn%jyAQYzOxXi5^^G?z^{V<XLbu~h zOMTN#TYW@*GwvUB+h-q==ij2f756*Tuc>cSAAQMkcB*ezA43@i)yLIMTz9G0)OX<e zHuarq71!PBmijJS_o(ky--GLr`d;-3Tpw27r@kN8z3K<l58}E{{gC=6xDKlyRzHI4 ze)Xg3$8bHMeq8+ot_RiU)hE?IMUIEmud7d~pN8)d^)u?9<Jn>Lv+Cz?eN_F1`g!#) z@Z^a4m+BYPFT(eBmfYQn+I$)<^GoWNQTn4n7}`QYKcha2(8nZ{_52*_{VVEM5%##U z$6|wDc%8Fk(DoB&i(b`FoG4CKM+YrGtz36uva+xQf4ow52a|s9v|G*VN~u&VPv_Nw zF3!9DE{0Wgu~5oSRu;=uxLUiDRafPw3MJ3Y7fJ;^pVx(|>u<Yr+?gU$W}GbJM0b6> zyDgn$v8>$dex_8MoXb~H3eWE>ELJOd?OrQrj8%W#<l_8dsZcFmb@Nv%r9~8UQ$vu6 zmoG2QPq^Ce3~qyn+2A%vIJleA1?H1Bx5y$}S*TW~-LhLPP9lHpdJB~@>RVk}a2s#g zNF9?ih4M6>@g^JGNQ!<>^dgGumM53|cCT8{Rf(DruZfs7ja+ie)72S&gEu+js>KqT zxiRfFx2)vNG(6_L{$jaUW%m^43n;=Qa+$8^CBL^hyo~Ch*-SZ2R0-P96coLk34$xS z=ywPH$x6AZ3m8KkVbXls6W&CR+m&0Y7V><Up06yT&5FwJj@scGdbe`TPgD!uoS#Gs zOuK%M=XzeTQqHSIj1qYKHoT|#V*2cf@%(&6xqjb7sZgHFdz0FA%hJ}B#j4-wp+V~J z1(CvZFzC=R{<;N>SyT6Uly`n{9xaUb7E6m>USVG7;>4oln+}8hb&cWqdACsZJ0~mi z3yW10%(UHvJ5#t?tmu4L{KZ9-7$rgnD|Cc(Rf0Z0vE&xCpPWY<&iHXvSn?Ayl|}8h z!&{lU=DKtKIx}ALm8oE$dwxn6r`ZS@GdN`Ib;z^`#%nm38Rq%xg25~?WV-t68-v0j z*bxNEjKq*PL)%YIR!SA^+sF6eH|!)%ROVgBKE5Bn1Na@p?~r3Zxevc#{1E;m!k<L= zlL#L{_z1#B5I%zN5rmH*`~<>JAp8WvPaymR!cQRlB*IT3{3OCpBK#!6Pa^yj!cQUm z6v9s-{1n1ZA^bGLPb2&^!cQaoG{R3GTJF49RPI#KEvY^GhaYt^Cn}56XA79S3r>pu z^CM38xq>d13&ZF0V~bVvo)aHFf5>THaN#fIhZlIipUwd~2c7sRZ_kbG^V>_6$wFzS z;#CI^I~^AvIWd0jseO-L7(Nx=>_7Ofz2i>SJlVVdsYmu+Snj&`$g^X6#@;n{_UY4S zMuuDN_qW_1Xt_Vwa{oxn{o$7TN0+;s^4qt!HDF(Bz;J88{?>p4tpNvH0}izYJklC) zxHX`)q{FQx9d0e@aBE42TT43JTGIWkY3y%JV}ENJ`)^C5wYK{YIT?2GzP-bb?mdXU z-?ulqsXsW-5NUtizpo*D-+rfE5*j}6=p*$gdmGbl3_siu2V*-d!@j)@{?-Z)A6o8t zdhDHN$Hz|{8b357BRCqN!-vj3b2hr$f9U+!S*Mf94xb+#**7+R=3F?khxZ>iciP-w zc8rY|gD03J^=Ozaa?>d-GInm?zQe<hVrpS2t?VNu)n~zcOj=|?@CWWZmc(xaKW{Uf zVyqT>zW0*7Vy)OUyJoG%ZpA)gUrCI`ejo<EBw4ClbM;`{w}<xn)|_u$)#vb*IA2^D zIdbV4EE3+O!c0L8O%$#b%1f7ymkU^kRAK)mw|v#RR9SG#9=II0vM{scT{>Hwxa1Y9 z?w*Ch<Qx_ryj#MG>#4biCv>4$&Q~Uo;?+VGE9k=^b$?ihua{rYl}RpB<>{e?r7vcV zDsWO<5FRhEIyRhCOpoExRA1J4k`Y+n=Gso#&&I6S6<fu?r&*&?t--i{8WHt*I$upE zs<FO++b^~sB~x;JK|el$Tgf&N)8p_@vIzX6pp?K*n)xMost}28pox{e62~urU-G)D z#a1n{?$5sy9gtdSyFOZLQ}F?YJh_strBz}ew$ff}uUT`J-ixa}m&7%#k^@M7CBBlV zrB;%)q)N@%x~$r2iI2x#L+Z8m75mEGi?J(PFUD%gTD+E+ilc(*!sjs#j)MTtFI2r; zwUWcaQz>0_bJZC)7jO|dVNG&V6`d>OrorBobF!M|WxWf+r9U#69RAK1$hU!xdvd!c z`jcC;mKTrY&J`9G&~FmR*N}c;8Ue#OZ>F%|A`kKc#oT;DyoP*_pm^2jWqFV@1*%L* z=^ILP!L2Upa#L~S&5%uMX48a`ID-6jL-K|%$%V{V4w*DH&l>4X>&oInb2<`~Bcs9u zZfoN;5@FotH17WPa$--hJmtsyHV<rksWSaK2m9-s?S9)d8M*Sb-yV3pJY<mMRH;&^ z`bkW|d2cX-7fr)E9SyAw@=>^MI^0>`+-y=OeLpj}r};_PSkj<QFVl^9VZ*I~?<S*& zN$a$;ye<Y;72G%_5Duc2iRNzzhG)JhBNuslTj0djr>zA4?Ov<PN?SegEbh`)#>(27 z6d|GlS={g^)A950C`;Kdffks_hKXsZ1SVMu6ErE;xJt=2fl0;iq)N**r8pTeRcmc} zTxBo`)A+ToWXd~{S_h=yEPkDHX-r#l--RihskLWgmE~F{i}<zn%1gC4d>yrn{+Og; zBaH-p9V>AVif&W3RZI0u$8On_>~C10&6viR%&A&i4QbRewGOrJW(THqZ{aUNYh*N? zDNngNCvzc((NLVkB&p2T1BP<J<iOl!KY-6K=%pbulXrm}P`b+*G3`ij<=DLj23qGJ zRe&C7SLG_@`lQ>9sgavMYtlGbn4Ad*`xNBZ3S^Dx+|@#9(e-jgFE>%Cl)%RyF|o%f z)z)WO5Urry-27s75evgo&b>Yf2?5zk{dVQ1D@TIrTq}5_P?g|zr>XU|Vs!?=W>hbF zIU{on25)1GPR=wZAVF)VF;keoJt0XcOg<0|9|jG>U>ETwch};#ym$n?prk3o2SI^z zJID1R$VNH0W4f}#6c5vtlyes;W|$j^ML?{WQn^wM64;%CI7Rv{GBY~R%eib{bfl7G zm{h}GJwIuXdX^Gdy45uBWTBj!V9DIv&O(_(0lh@@;<j!-5)>C$LvCkOOw&qgcdh^_ z5WR1T2uOj$s9s(XQNs$)7d`JTNrW{IlDbPm4M0ajdg1$~XuH>Hp0`lg0G@#aISZ8L zt!0A_333X{^u~26OjI;FmA%o@pc5`uSvMR}7$<JnpiNj#Zf7v>Wkvzzna8>Tp$q+5 zpYip{%yrDP)X-WjmCKFKV4`0umP)yaB8DB~o1$?xR*I9nRT#vT#gZAZ6J~NZj7H-P zR+Qp0YKMd{jvnSnFqMdiJ9#ehTIBn@J~-24^0F&d%~G*}*oTFg9ketTMZ@6P!r=LF z%!igG2Rvm7ScLGDKfv@1Pr1B9#(o|+LIF!vWu8mz&{1LRy~p7R-|<tjrg?rGh4nic zhMS*Y(fy8wxeLrCn7aY#P<~Q6^OPSzQ48d)JfH$3TjPF5L$`hT)wgs@<@F?L{B!kM z`)y`ic!M3fhmFUTS5MKIrZWS_?{2As-xiEV-v$U)V!Teq>uR1B;6&mcFrYZ#$HA<h zl=gMjnP!$Y6qdnTD^I<^RIkv{bfQeO$J=IZ-Cw^(*L?%xc?aOc?(GG`5dGT;tIO`O zvS1)G@b|<wS@v!J`WoJgn!gP<Dg3?)Kd%gDI<{h8-)00U@bUfN?8&DmbXUz@wQBKO z76gv2i?J%its9oI=Hhy`8b|!ZEiCk4H0)aP<6ul)i?5_=DX=9r?vk|_+|+ByM`A0f zDwu#9){B;EBTv740n*bVrg?RyP>rZDiScM|p#ouPqEuf_Wx_^FYOv~2S_6OyY?UiC z*B$*%RAhM<WE{bnu?QC?s~`vaTHnY4|6^8Pv~tURkSDM(@O`obUeztA+;VRY@}mjO z1xxf7t-;a3l)i*K{1n)I0I7Z)GN7N}Jn|EB?vm$s9rqvyvQ#IvuIRxwr^9rlAk$8d zxv3Z3w*gtUNB4eGm<gu~WDJ0LSV2EN?@hOkknM<CBt#gY>_PN=*iyyn61hgN7fvjm zuzJB~cG(yv`0uy$4TMg{`3!#~MQQv-@biwqsX_Q#weYiRG4PJ)N{DgRE&G-Q&M=Oy zkIOKy^>7tp;SFmnh7Lv;Iyb(&&Akr97t2UMqDjQjO<=#^$qBS7gw2na3+2I-Z<iPR z<h2<zx!)lSAYf@wTm2psL_bG|(*Iz>>C^5+!2`H$5)MFq1BV+F9o%|lLA-h$Uu>CI z8|tcth9rIuF+Em4mdIEsG?M-x{J;;Af{)6q1*R$zS|lx#$nqymwiBM3rL#t2Mq^kt z%nQ8*>@<{2xED!!3^N1`lqhtg-DOl8#@4W<Y#S~+Q$_7nbIdtcnVejN+C;dF0{Eoz zo^1i4+GYl|S<H^tSrBPqObGH+roeccVlkL9@Ic|~=Iw2}bATnVv`s8YX$Xi?D^Mx# zZdd@NC`ct(nCmNP#Ki@yc#BZ|So9}}OH&@nQJeIfh;z?NFc(dR2_wdFQZ39caQy{c zD73T!(0MZERW8*smFjExI2w)<F<hZBd#V6ta+pbyNRVRGpx0)KpfIe9Boq}zxCw|D zfERX7xK#k`U}nv<6;X4CumM2`Xuu9IsE`MP<vr+}BO)<GX<nRhkrBE;OSeRs3V$2+ z$hINFf>2=)6c!PqG$I}|szF0{gsWM|G~Jm~DNw2b%N-_X8ZZ#AB(tE?#4p_x6=9qM z6lAkud=>>D0HriyO>^42a}`$mTG6XlW3(_jlpAwF1fZjWBs5XE>Y6fW0!~5|Mh9&( z={f!3|9U=<g|lTc_vSg9!>Y)n|6|1UMB(30p&I|Teuc?o{ES(kDL|SeTbAKEpTNAJ zI*A6O-wE|g5!hZHoMmBYQqo5pvKJB2%z#sac)h8X^m=M3{1SSTne{JPwWQuzOX;1s z2dTuptq<4Y`Y`T6GUfgqi2n}UC*&S$Cj|182;ni+7Wg|rRjgXu4SOY9vptPBJ_Ibz zR_R-oYDe5oh}fM2v0D4a*h*J<FLL-1d7fGGc~3R2I<R(k1=mib`Gr~>zl8S%m0jsB zZ>s`c0GaQcOXxoXU&^$*HpTEHjd!~6ZZ`#b{AV`BYS~(6t*h3px^HrY?<xE?nnuRX z$zU;P6y9aFiyVz+=A0&zY6b#Fhna9qjB9}5DHnRY;sR-uq!CWw9CcjYn<7N@aX>+K zvJTLlh_Hov@yzU&wF_BYb4#T?bLGmla_;iNT<J3ALdgv7yHGbFOPDu8(d(mXcYtyr z*~=WqlEUR^X0pD~)Fa7wGEf>mO+@-6m>lZa%hjR6LeVrFK?Wif(OV*nV~TE@t^~`) z?%XLV-|G`|D0l8Q%mPwSbtX#Wvas=&O%~$6Q!euGtz;DCA@IlL>B`V$32G1+Ty>}1 znj+mXS4j_2&7D%gqdUDTuQtd+cS@om%3YIMdu@pNsCiw#t)rwg^}%x_S6&!`x<c#1 z(sTP%eJMT85Ds5Lo)B28dJ)i4{Y9BZ98Q7iS<>Yiywh7MPnw8egr{<atA%2z05;qR zu1ys1NUmjNKzcz03g0LIR$k8~2MZeSd6mf`5gZv<vgU@FOYV1CeVXQ`!FgGa*34P> zaTI{h>I*t}6DZS>=gx+rplA!=9%bT173cfV@>jGX9g^2fmH8mzCf{VP;0V6#JPq+P z1|4f<dm^xPXr_PlYDP6{S{c_$iOm*9lJ)~l5+<d*Cm4=~5_<t}0=CP&0)#WlflUMf zisPw~D`>!3hjOQ=lL^osshUSd$oQHPA{C%yCWLTz?s8Z%S=cXA$|Ls>y<*TDgTXf| zT39Mp&8S+8bp*-?hLQzsVV3H+Vvyh)j<I@6zllVnN(43(K{v1oMu9&@wF%2Cqqrf5 zkOy6(<id#}yeSQXS?%!5Y7^!zGnz?Av$H7+vMTJ(Z8KCGyjp#=VOh4d(pN06L%B0X zA+$Ey*9<`#;UjlhD8<fgQ21;cyo?kKOD>!tFmw=t-57#YeMx%+3;1ZI>Kav;u%lAL zarS5g&I`yS3cNc&*SVdc{7=vq_^%`aQ6Ci19W*E}D~c6hcaA6*#(v!}4M49MvhXxo zkVzuTBRhhpA>hpPDRCkB9Y}D;?%a-s#Bhu5-qDoMj^(ilG(zq&qF<Jtyxj1{<%R^g zLWnrFbf=o43u(JmbiL)XCei6ikf!wRmz>&oOKMFu_)=2^h!%h%LTmLi<hI*6?r}fA zfXD5I0)m#xLx=!H#4!<*GN}<X69$RkFdE<q7-oZQ`ei=*03B-FbU&R<bT-l%fHRoX zFVIifKrhk}m_a0t9{nK(h}dyg89{#|<Go6!p5q#swSo{mbr1s8#;TKm?BG3)bYdrZ zfj<C)u!A3zgGBYxP!)C&z5zBtnI?-^S^DEd`ceVfr@s{`05c{~7{L@-+z>qxnBt@G zP>VQY!)`+Kh*Z{7*q{y%!bSXseF?zdN)mt_APkBi5C9TT)IScTeOvjw3FBLr5&#LI zF@&3e4loIoei|52N|&I0Y!{V2^?eL^0U;d{(g7VH)c)QFt2V@*4rnBy8C2<;v^Z@q zd<5+vGwifWO+O}lqaryX+%U@X!1-dK4M_Tg3#ELS%QqOGI+=qQEU8^1=?Be&M#s>2 zutk;dU5v7(x6A_50%b(z0ed7t8J|aT$3t=onue)wZ2EFyG1A0dnS#TdfFvxq$pw`V zt3_%(BgQOB=#ETMP#P%;N!alQttdDz@J*sZ4^}&{L1>wL)OrL5q(#_JQE1VSTP9a; zqktManHf-*Wg;piCk<VyC|b0_U^4oNi}2m17x1)$V9eC}8E+f?aZzv^SdY_hFsrZf z;q!2uY@qO`0jL*(>Ovv{J^Q;6%eV6N^qjP4HK2+2+r`Jx;-p~k%b+$~8PGcW8X!Pp zQ^82yBB$V1<PhtIP977g3vMd0B~Hz}Xy>g2CY$~^V$?|#`pwKXye)qO)}z_>`?vwH zZe9Pb8jWK<20gvC62JaX4F)x0F0+{sJGJ>T!?wULGx2=v$`+Ww!~wIX^<`y@W!eCu z!)S)UI(?X}NkRpL1TaJ65YaydUAx5;=3>y$r^Upk-MpnTgyLVb8{Y(Y5AD1F`<aW- z`l~E#3n1hx>wUC~PflAKQECYJDGK|1N;m)@zHM~-n6cf3lR!Xa93EG*i$LEDe=$MP z1GbYuctn$5FyYic<vg;BX5Iof!mKP;ATt1T=L#T6MJx~TfjfxwYfVTde*}DwSC{BH z;ml&ftTnR%ZzW~o=%+ZJGva)G)}b6U@69a$fCWS-626qHQBG-`f=xM!&e<)w6wO1_ zKmY*YxvGl`NHQQ&V72F?ISf@ZCaM|fyK^8)#yi;9ULasIxghQ6#UL@sgN9FrZc1vx zR*=5QnhCahDte2xXKK<o<nCSOX&B}(MVM>{{YkZG^eT9qJ^QFDX`nNtuMzYLW2jIl zC?SpL#b}8S+a)A$Bs!xF<mAJcH?RM1{4GB?5~*8(OoQIHV6lSE<d%hY66uxd7)?Xi z^Q5hr<!#LvZqOhY3ueG_bS!VC4FtJ31Q)zXw1=!H*f^k<vw<bG46#U!hQTkkiK4_M z8YoKKG?lnUfm^3Npo6r}^W#Nzy&fv2d7{DmEa?x^OU0JA*ZBjPN#0sYThVq!C5hwB zNS#bpM@rIzwV4)@034_6+e&0C27Sx(tyUr_MfzO5NZ90&d6wodqSi75d>Ogu8XP~q zTwDOxbrXIk+c1tjq3#ZhwPa}fN$D>ABI9MEA?~#_hu^>+nd-mBg6zawvAzTtBeFqR z(Bu?;1bIQ9?M>o?J(b;MZ?W|EAa2w)n{m^HAKS?LF0`@G<eaiVlQ*r{prp`k-LSn3 zC?Z-aq=-;;lCs*Mtg|Y<0*#kSfPV5yg=YNv<{DGzMf=7@-I)^l8ozQDYEsdUfy0SW zK?*7#TTS8$E!t}8R_p`FakUNiDO}UI!Y)fd-Zbbgf!uV%eFpdKRhUzP5@V;>w1slP z-$zTV<ZNcP17L81_FM3EzG_{+S<UkKiP)>w^B+S0cdc~4KQ=|W-t|(N@GMszq}8K( zaJOzCR<u^uflq_Q7gwc~-oW1r|N7c`)E_D7cQ=#>aP&%_T3_p1?YtG6OUYB*<Ndzq zodiN(s&=h*<JSXdxOXlAcfHXdu52iG@tFy~Wvy(0Zv)=#N8S2Oo8$d|_HwM&56F3) z+Hf>h?yYvsuA7ckdsY7{wh61Q2jtwNHX`Ruh}WYAjPFJq&o>{%o2z}*4YlqY7W-80 z`fELWS5m!4+%4kXD=zkv;pu(i<_2QOKXn7(dGPMWT6ZmdL&irjwzBd1W_7>x|EAiy z8uQ;++jKPcsxAG$sn#`R)i!=e-UUG3bu@P6k1;L=RyWr=Zdt4Ms2<dNpf)hOW%XXQ z?Uq#=$Zx3)s0SX4)dsM#ZZG^D*a#t=BUrYouFP%h*az{J6}<OD$TQ?x<M1?nym zETZO=UKb7JC8ZC@;_XNr7Nw8~OI~+pdy8dkVu89D3M#H$bs74288j2Kyo?P+Au?ac zO@jIdnyg|Oil8ERdRcm1tUPWVZU}*G)@D3RoDy^RKoIYyr*#xa%yudhVzgwecibGd z011Z=G8%IE(kNxuB{~-<J9GFGO(N`oXDadnb_lVl8=8#o$zl<(!gt~U7Ss?6D4h{4 zc*p>(d6>d&eFOxbDoXZQfT0EbME<BTk@><LDuqRrde5f*s^cWWkjP71%UgOX7c|g3 zSu}_#riyhi#k7DI*f+MkJd_W4qezCxM`{l?;>DRF%qPv*G~5S~TLgHEC5j%V)5(1C zhHGv^J$BUPj!+g6gQeTquhwF5kqk_IqQ+`23KULvY<!s@C?icrJ!3H*rP8Qo4w@VM z&Jge~jtopJOoK*d3Y^Cq?ga>PYTOLaSOLj<tr`j#8kOu#)sKb5j;zIb=#ejz=?d{B zQVOGCVYew4yp9Y$QV4?Q4N&=@&>I=~xd1=~j|ZhWdb+ttkv@8jRx|dpYgH@i>xe0= zkAv1qBL9V@P}w2ObBGneyb{AHP&A;(k)|PPFwrcrL8K~R>Lci&WgG_cd#$oIsXn5V zn@h<of_P$o2o=a3iWVtBqLgT`WOR8nEG?Sd2H?0l8U_f=;X@UnzmeWG8qi<I2Ti5* zH{N0Lirl`ubHu=wdNE*xn>MR3HA9gy%e%%=!GMY^RTi-T!O#i(IC*W(1`sA<s2onq zGE3^jMMGs!qzy|%Wqd1R?5NTqWf25G7|2lp)gs=_aKtd0C-1fwj_mx|xnf~$7DGv_ zyK+_5P4H{vVBkWcp0dq;puvPDIsx|kn{d(JOozg{u+PGI2AsKGMJT{C!Suw?-~ywO zwI4t!3~z2P57%1-5*lnONn+}2Vgsj6A}A)AMzRs0qk~D(Obu3+Xe(D^vvj%YbP0!y zfB@+rW;bX#NkyeL%141n;7_Rp0zMK3_~DjJ&ZAbt!e)yG7_UiySV4+Cq{mb`>CocA zF|ezLeWL=d4sP|^W(r=RTGd*3eS)L<7M<^<^9efNN9X(L(C}3FZfRpb1zQkU&-?8z zrmxElqk4rg-bd%_=)4~eOh>7&G~g?3uKd*E0$LPSBaA{kQxF$1R`cxz<+q;*msztL zLk#OQ+m!}dgmMNqJKZhQ*y#%fr|B*1nsI5N+F?edL5W^O5>6&0(`w2|3!TeDC?>+| zb31OKK2Dv$*wsiV#$rz<i)5ikSn_przJrc*K2c?-tqLm=rX+pJestm!GgqB<v7JHN zUw1l;SF(3tfeJa4OqFaw@#C;F^iyV9n&BG^S&mkJ>)l7^uThYqolR^gVP#<JMnTHh z$z)(2m?pMt{$WqrV?&stcxCqkfzI;Z%64V|i{Y&#-|d31CCIehYZHe?8hC?fbgJp! zM#?=2<e2IOnw>@3h-K@aMmZvwn!+muG&Y<}bebR5VqlVCaXM>zJFD^8#A;H3m4^ss z&!!-T*{{e`ic(;i<D<*#k7K9-{e1Xr#mgVZ{DO@UwgaZB%g_r{2GjZ{kvg;w6?TE_ zverMtkTh?xkGtgC)nzA%MyxK=j(DL|m~{R2qE{imTd2YUu@g6<ki?XoU+~kMcR)s6 zlZMPfCfO>}X2j}RUYsR05fdT;{pf(Kr9X{VnrI%ILz?0tc!0UX>XNjLlx>ApnX>a| z3bM$meG6FKJ#2u~s8Ch?LwLo(UVF?Uj3jT~6N1NSkJC=R@fc88PC_R&gDOnU`6(QL z0HbDrnrW;=GB};oRayhwCYh&Yc#+bu4lH8~!$E%r*QSn)N<WMz&83g@4T4IbHqblF zLhk@fG=&o=+FqdrX}Yl{Sxy8Xx@E7TO;sGTmED-;fEo(PCS?ct{wZE;>1h2)`V$g_ zV*^-hHmN3cZS9{<&dEFmhRnKatX>+?V%8?ifRv>_2Y=K-Tt5)QbP&OomMXHNpddj- zk_{C>Ls!aE#c4f=H^Qm=%c0*CNG7oybrBwb@B)j%%wm@QRk%?h7?#3MM#(5V#4*Bg zg7FbAViy+Vd|*+u;ca-5;1f!<X4ja0iiX_8jj>+~SIEumgT~S1r$pTfYCc)Y8?WAl zEYY~^YNJ5=3Hpc!q4}j+zs3MrNu%Y|&u|2p6kcS_WF7#$*$iUSW9whXD^U%ZbR0ja z;ZyL`YhmWW^#iCIcK$*N-wC7xChNp#24s7xN<wF~8TZg&sW#}KHmmel?8;^!-R-Dd zX8ALxAsu1{Q~~t@@#J92dzjKZ#KiEecNc~^VD7d-w9eIq5(D2bDc?zor1e%^st!$q znu<nF3(Fkra*S@PKILU?^3!0_<g5{=N5SldXM2RKqLU8mH)uNvrs^js$c>*uk6l9h zY7V1d!Wf;5?1#h#*Su_?H2WbFOs}<Hh4pMI=!e+7oNBSI9;_|cpMWmbzlr;ZRB-r` zzDWmvD`r(o2ZQpnJJGGt@D&9~LWa6@tV+LPSIqziaHas3t;RtRJ8p5v2O&sBwl{(` zgd$^rY77o_QNj=ogW-CVKCCHa;@~RN1XlnxQEb3v^|%TU8DTF>8USB#0V}}{GD=GU zyfWaF8bHpQad%Ijn8_=EPDnGZ2s_0UVW&7@Cl#xvc*GMFF$u0}M$v-uB?uD&7$a~M zSKGuzdO;l?ko)c8K1dg(#^F$CgSgr$p@ZV?68CN5?nb?_+4F`~&8&8y%zFl~)*}88 zo|=|>_~wIDAz`xYZJ=WMSI}X8{6uBM@Io)+_73Z={sl(u#3EYd@`?ShxIDtJw#Bk& zUC6Rg0GEwAPH%&GL2x>cp_L>xV4QI73wcu^E4vY-U!y}}tUpg@2#%AY3{rAWHEi)Q z2gelu6tqNhLGrsH1vVa!<McF`{>ZT|PI%%CR}GvTQz*F+St8+W!*2{f+0iRddmoo& z0>}#RG6`?EgUd-PUARWw6lPf!?+CSopXvbpophRMq+su#=ImikDQkIqxHf@ZEzsW} zWKiuRLWbXkhMdnYV(){f&HSv{4~qqD9-F$lr(n&8{Wd^M7JzYiPDU(4AaA%={B?~D zFZO$eSwQxFFJka5c2k&i4{R3lWwTZaOXF<d&THu)pa22^<`Ku=C}uKw@UA$-rnD59 zYWtnx-e@_R2TFtB7#}$Yr;Fln1>#eF3JBuN;Dh>6w$gDr96lkJ&N1S2H<ld%GCce? zSw1mXICS*e=y1gNIHd>2Goeo*XJDfaPRJP$?n1$mXi}g}!Q;%iLH$y=;MgG4f$stQ z(fgR345Usp7T5+<6*|LteSleHf-sozJ6(Z95VVQ24oeJDk<)_=AfXR3vEQZh+jRad z9UqR<UGJbpp8uqOkB@$z&cEaHJ~nySZegqIe~(9gbhMK>_$YknY-l3T`Cu8*hnePo zr1P)fKqvocT>SKfGpF;T$IqQKt2>tlS)OHyHv{=c875L4$-1AA-b+05%$XCAHOYwS z&(bjz1FKQ6LWRS)W!(Ect>gR?oCK7XV-Oj*Q=Y6CcQIvzbEcupcKo=Hz869V1rT!7 z{D;T^zM8^_nA1dVD42)=O<ey4(vFrR&<D|>$#QfEH`jNAsDtwcf03gYVmNT{60mCF z!URGIcM~YV6==|5ybq1M;hYrS7RrQq?$SR6=XK6!{Vj07r#{C^JUaA?JySL6vaZl* z&zv;S+DdZtSrjF(D)iY>!mvUB%UXSw{wt*4M6x1Y@d%!PbCP9>oRe%h71=^+2FU_7 z6Mm2c4NHX0V>nntl|t>>8Z@=2T@k4nTde;^-$gi(#71#aoD=~uME3nlK5V9Q{zK#i z8!4|$iHJz#gS!18>n4nZ)Qvp|nd7gK;3PRj{*jAJ;wL@#EIiQ9VEM*jB`2bK9=?>| zVI{O!k|RkheE???;3yJukkHQbA~cQzOL`HCt%_mjm0nn4-~@vyS}57eKPRZ&TCn>b z!jFJDz)f;*dG%T)GWDTe86B*-H|d(OL)=4c04-@?i3xzkY#XH-Ku)fqU8H2RCx<o) zETKf1QPqKYPM}I5?kM09dDy_rBGe{O^Is2@^fVg>T_cQMM(1%ShH(zyC~P`2@RO6F z+CK1SLrTqJI^ltJyz$$klAF^o1n~irN!XCW)@7#N(&q#0^N0pY0%inwf6i|1#VfH6 z9*)tE2~6~%%TCz(Zx9+y({|iMoz20;NeX7aC)`~_!?hX(W(dpRnP|KQv$ZgU9Hf}8 zL0o{)Af|3m#0CddOeL^a54<DNOl-o?mq8=LMh>vRAr_1w2k$^YA_KB~?^u0Lxad|U zxMwWf#HzmyaSYf<PK8tc0**sO`_xtGzO;%lMk14hrU$SnYsX-_prXJfihf3d%~2-b zj<f(iR19OTKgLWx3dhNSx4CLUaZ(xmYuG^PzeUt!91Y$DPfSb-`w}@jo9wscS=88M zbfU(-jGH&n*rRXQ*gX6vMyk@-)Gf_AFj@(>vtg@`u`ZV;8M?hmGiP}4V?%=qL=HPL z;W-<d(^x6!|ACqS$_Y+DlqU6~BV%Yu3sW~@Zccb8qlwZRP^*R*(&{avT>m|i-^}I} zvV~Ecw%NQHTb@LXyAjbinn&>SE`gXCVif^BFipT%wh8g@FcpmCxZVw8EMxeUfLvhH zoPf_TlDS_S;_h6Veim`sR@-RY73?Mp;iJ&N01^ddB^n@vzyObdfgwVYvJwmslHBbD zQkkH{L@8+{Q%$e7SBbxMyc)m$iE0Kr(JYu5#Gn5ta?fJ-S%>O@{MAwG<W<z>IP8TX zJkl02O(*3f$~3_<NHY>Ukdt1uye`Dy9n|S%TZL&rtuOI#4c>(8BOy@X2O*HCRy(R$ z9Fr?Kt#+!d^<!v)IFPVVmRwL4NL>wOxnG`bTk{#@tHyGw?Q__12cv)v1!*gMf*c=I z+YPXSClB!nN?_vcXu5+;hO(lr=u@<85C<|^6pAG{2!+fRg+g)*LLt3LzL46Of~r4( z{MPj3;pm;c4Nvx&chK4mDQpT;AC{Onu4g0rjQxQUZw#OAzdfCxR0mp~gn6gb!8!ZY zxYpHfP|>VVRhXr$^uX|>LmiU0x`Q+xk-M(o?y%gg3+^73JILeG_D6UZjghxE-5qVZ zd#vg1@%r7BPvWeCCs4M8KDyLb?FmX3U+G<0ztVRxR^F9}RoBgBQ1+j;aO4{D%?Ki~ zp|$~rG8<ObE11H(3uE=291T)-bu1{K)GNA^nnZU}lju%rQtJ)gTcakm^}(|>YEtXt zvn!ue$1&qmn4SIAUK-K7XkGavn9}vDeKa@$^YUb)6#qO(j;u<{_dFdOg%hzW-r~Z7 z9L_QXoG4`=B>gVDuzc?`IJ6;n7)9s$awPYjl_6pD^=~od-=K4o&hOCq4|K?S7-_wO zK9a^J29?a5$kcuCyvfs092~wdIoC>lCy~H$l3z01u&2A9OotJR^H=w-B|RHs|4u~L zb972{=IL;O)ZK8L-rEie_5`>1vMZs>%%ho65)j}_R0m5}7-t=vx11dXC`moU9R5uh zVDh}cTQ=F*hV00Qz2%%l0$@GfD5s|za$1l0r!@OqZ=lmphbyDmu`xiOB)pkE5v=Z^ z?;@QobjXG2d+E@ATi*xA=>b4>hT!K|Aa5J1@f;&;qw@fr?Q|ZbLl{!;ptBQ>(~H+n zn}g`01fIczwPpbDW2$L61qL@5)5sbVTA_0bj-SA}i#Q<!hu3MN_f8pg63&0dekK49 z;549(#OVtKSj<pwtbdFzFVl%2BN2IoI}<KK{~eQF4^iX{Kx?r#c9mg)ev<Ef63*bp z1~Hsd9y(LBhhYi7z*v9Iz-*DQH%`@HJsPI%pPGjOm&7;qr}z@NCnMJVPx`){&KKzj z8~P9Q{VzDqIs=6?a7#`{!;Kh%wv2nfvuUmla-e)O(xRTJk8G5P1byIGi3p?<*c@Z^ z<0QQ;xZ4b+VlPyXhzUs%%1Qh-BNSJhcfx<(^)nrjA#oSaB#0g~|Mvhzu;YD#H}IrB zQFS)O=|QeItq&grxP6k0ps?Nq9BSzddv(jwyU6L1vBQ#2Tm9`Sv0`0$w@R*9Wy<14 zOOe(`sHMO?q3bqS|39TN(S00(jH7UNo&qQ<I-2aLnJJ{DhO}OR&rizkI??Qp`&j~H z2ETKa=4`8*2|yLdvErwSUU{)plEDi-pbd@xlZ@C*ll(qFQnJx(*#)K-96a+OcF`up zj-iRLWx`HDPn-Y<AwN4|X`YPmCyapO439-8&Jd3v$(QzeH#`LO(K;f^O=BgX7zh0o zbyH|J$mZC6V0<-uBlb8Pqg}041FJ*^S#~?vNgSP3iywyC=qUC_F!n5@3=!AjW{a38 z3!&q94|0@KW&8vWv)4b0d!SaNu(BBVDFYkpA4Z7N69AwB7S02RcG3{qMOWC`NEsTc zn@6i`njX9#V{>54QbC?2deK#Hl0SXob<()kiD67q)Z!mkod~euL^X{=K;{M-$m^?e z>xaDx%?Jgun^5OrO9=Gihym#Ucd2RuI&yrdqLz4{eKdCcgH?bX<|#LDJb!(q4e`@B zw+V8>CYa0Moisw)dB2hQAsq>Ar<pMiZ{)TRNCDu1YA`#-#x68AItZsf%w}gZl(qvO z;^CBtEX-cB_W&Y;sd6U_b+OS4Fw1$sDTI-dJmrHG*Fx9P9)^&=eiXjJPSZaxFf^iO zqPF&v%dW0?0;Bm!b4q(0P$<qw0^pn|LeE}LcCf4N*Z3p{NS#4sP2W0Qp#*4{1ILE3 z$7$plMl+UgI9C*Sw-}n3BSww4P2s$C&~LvjI3x^jL9EXQo6Mb!!I+`#3n6e?Jp$8O zXdN&cpk0{cM+qXBop1aw#}1dbSgOwkhS}Z~@3Q+q-}<etcyD}DoaPvM0CkF%X}nRN zQGbjZv2*|ZT5OgG=5GPPq^6y70s{w1GS0NUP+8#oCSf77(Q_!of|w~#EBhE&MTwWV zYrHt(eT~FRw#Lh1ZnvcPgAx-AE11`YoLgct&3`R1+k%)ZuZUk)vKUHaY}-eT{ZiM- z;}_1pD}UkS*!ibN$4(kMtN1(4jQfdmXU4{S`_ysY9=V`XXf$kBAQy@gyf9vb){WxU zthhoW-+^0@$4@a-_>%9SuZ19r)-%FlxqALi)NP=A1Y)yTn#^x2uK2-bM&HM7vymYG zc;#;dKkqCYE*j{XEI-2mKgs?k1=I<CDz(vNa&q!+o}?Bo7YKg`!ZWy@kR>7;kiE{J zaoS78>6t3F*e&Tc<PNP=LC;OVM9ZuOn-R9$_Q1h|g~Nvq!!tQK@#rH53?ID3Jexdl zz&$vOX9p%98J^fHZGkx~jVCSC(l}}PDgZVE{TH^0tPmi9B!m3PA-KU+=hz-x4ERSx zgs>Bbv-d1QX&?d<2GBXmvfNBjjjzHbdB0_Kg9^<i6%_xkShBgodfA$7<MuUtU<WwJ zD{(9Ke(U|%0K<>%yp*n{tL-m?iW0lHfw(GjG)5QZ{uVKiO}xSgLQ=^zrXnF(Y?L#f z>anL&x8=~YW)4{_MsXq`ABf3Tj9$ii*;>sQ4KMOre>C>Nu#|mkrqOXUe7<4L=bd<N zW1C06Nt=4-pnlkTAWt?0PoS|5o^(qsiJGL;z$-S&flU(<_nsgwP?aFAEv<wWU+t{6 z-(tJn8-~mh%ZMZIt&+xl5>BiojG3#4@bg74q1W*K185aXZI^a`Q2fA5rY+Muee8vY zBox>Q{5!-C90LBG;s;&=|1R+Z|A2qD_<?A^KO}x25b*C6KQIsY_lX|}M^jG25(;Dk zF%F3Tp!g4pACf%64~ZW#KKzHp4=Eo0N5u~r9{wZnCvdfRUG2Wbu(#7c+XLTG@vVdJ zG4b`n_qh1h!}kPzt9|m$G59TYT+%!)t@k9_bAvn^IT}+Z&_77KVFaC&SSQ))_^4CZ z#-}CpG}$8L03^?_MlzC5)<-Yfd{#cl1O^P-vtNyS%hgTbFa~BfuijJLf~WV+ZiTJD z!0LUbe{SI@K#OUf#_Zd=l7tU)2fkD_NA-z%hm3_YM`JG}Ur3pFs1bUYtnQq(($*CA z6vC3=KQONmj&gEd2Y1MUcgJG2G=6QzVypL~T-#&}eHGGgdm&wY0B>#PC#<Fg^T*ve zw9@Ept@Je8qlz(yW#jy)(JPbX8;6x(Lg~taktiuLgAYy=u45;18;nV52N<ohB-Uiq zxK4P7;0RbTL_Jy+dxp@2AR^d<yX$2Tax@C9ssNt>(quzm3I(PCaibOx{^vC$17a#% z=|)h)P=cnYg_6Yaoh_qG6(Spn>?x2(gL1@|cbVNQIQ|je3&K8^0P$E0?r=I0LztC` z#p&rK!-7$6HWIW*-;^oVuJRE)ktz?ri7JC%B(-Ie1l6`pwJF5kxyJedG{Ran?yuKa z42`2Aa=9Q6Exl4NBA{s)iN1_QWED2!kiq~flWm<#1b65m++jGQr{Yl&Svo-yAS%3% z{`bSd=1nMRMN$a9w(wC2)s<@;Kl##JU@;l>&z7jPw%8s<rEMBRTak)1Xg}=QQA(C@ z76f1b*U*eaOM6-R_Q7$-rg|{S-1;)|<*<Op@Ga!K^NsS|71no~v1P46VDYv}e_*I^ zo<M<tUWw}d63bvZ0^b1eaA>IB&hhaa!-I{r_T&_b`B{V*E-mVVp{O`<ft233Eo70# z+{J!LVG_bo(ex%#HDis?RR~vdS3=llb!IUt;#6_%BJPih7+XI0=BF{Hc4+<+a$`@U zFb)nw04AG<Y5f~zXCcBiwj{Z@rs_omu5obwBQ*?)DPwGn&O7{nw`HJ0Wy`SH)^3`5 zey{{Uo9JV3IJpaY+S4Z(auQC|R4BMGs$;myms%hma|I9-gSdk+P80y%HV6cyiuW)b zAuIh-bH@hw(#k#`EfwY`RN?U_*aY|q2DZHOjfaPMO`l>We?VuD4kumR5=#FeZ}-so zBRWHL{u7;t>HKFpd+F?>GfamPrQT2H0G)$${)7&fKrzfRmPDkz`t5Wm%InAIJWl5c zI>+e{6A@%RYR4vexE+sWMr|SW4wz<{k1vZX8&L-Pjo#-1#dpBeV;v@41@;EiD55Ov zKTJ<q@z_GaR7Ho(q1SDgIW#Z0`LHumG28kQ=PE`X7uO)Gx&j&DyHTF{nE;X*TP9`u zeP&ZgBy0-y6jh(qU_=>)L=75-A+REIKr<vJ5GQaxAr$s4h=@|iXcSUv`POZR6TA&+ zQ#K2RAWVyh+TgW1cyk&727aW}Y%oSjgi-OhHj|)8@#+M{tj#E@O>AHmd+<%a7-AL| zv9K;*V&0ItnfAI$U-OI+9mWS)QfV?vpFtcL5B@AJV!#fAKR*fEb6kItucuKn2m7aJ zup*F-&a(OMr_)D=4dbT;wy#{nf%Z7{yR;;5CeS7TIYjaForb&L#*g#iD}DNxnAxLJ zip6sA3PkP~7{d7vt5%w4m#1O;Dkq1NXcw09a>|~uv=e0+c@8IqbM?7rjGzy0JmL*b zo1Cw9=zw4fe#glZr}86DpMB=s=om~#1ikpL%uGn@*VD&>IO)*1%E`bQ2d6WT8Fb?L zQWeg$8T4rHhgiV}=*atAQvLq53D7^FkG=0l1lsE5;=noMeL(Ab<Kf{{I8jH!xS^;g zX#>6L<1d+s6HV{I79w%6;iA{>Px6Fv?u@DbH{a8`kJf(tXPlmR3i}88ktdJ8hp7d^ z0l*|-6$m81FTTy{r5{KdPxgTYSzJGYdNqMCZ7BQ*ejdpkd3NCMFe(xh8t3d7Ta_C& zc1z&t4FD1}B&SbVuK=DIv`4|CtkL8+YwR;fQ8E;rftVf2mJ&>(pW-8F-sa)#ucs!Y zg_-{_hc}5w3;;?RwM?Tv`Y>vO-eT7B^&#`YQG;=s?rlC2EQN?j$RI42;gQq-pT%Jm zW;4Z8n3(YoSnmho0MrE3gJ{L9utF;dG(!Rl98sxbVAJ3)^8gCSU5EplDFE^IDhzxC zuEQ4tYBriCS@?OB5y~ZV6v1w6KE{`vie(-F&5h#bb1#9x-<#QeVF24Bxi$CQ2Ztfx z!yUmc=xu`AbBuf2WMlKT2D3wNn=y?GKh)aTZmoxAJ{RmYejbHJX?aR`uyvnjv*W{` zkQA5plnT>(Xq1gDOF(i}4rW+9uS_h8B(EI)f>U-(LH3B2{qCDX!e$Dmu5d9e=N(}m z`p&`JW5IzBL-=gRg8SUw`suJ@qQ@;HJ78zFgU7tWfDqP+=H#2;Y;ajx%szcokJjX- zU=cYdedYLBkDr{G6$&p{Y%R0cHZHS<oI`{_^l;G|;*hoVqqz81>mvK(9OcYF7TNuc z_;~O!-C(3h6RaiRn$<|wx0K$8Ow6XQXr(g?{xS=cGE-Jc!cTXZ$<vsDS#kC-l>xkA zs$<Hok1$l|;(c#W%#X8D)a%67<5LWFf1*!Riux#0h{zBt&4p6P5cw~XACedxQ-dWE zAi6z^W5Hg*{4}3ksKu+vRqTblMZ}5U7Kj)A012)+(`YMdbQ1UkLltLAnhlOvebCuc z{P+zHgo144{o_tRo;hkhscR<WZZjig84|<MubBBLdm`ABji)h36WqfWfZohhM2mAG zHV&UC;pppEura8ZNozW%iT`>D0|g2VjwE3Y%xRS58O+9NavGGI(aYfq#o?~sPUkeE zwJbeb*DMT9{kRU(fwK2A9LnV3W9w;kZ&vs$Z1DBtND)PoMerN&Jks`Z&58y#nX71E zV>O*MpuVUxXA}Iw2ttz8Bovql40b9rle17uGA0K<;6=dE)imz0g$c^Z*en*HSK?4< zG9HZ>O{@fBVRKVUthB_UiKB@Hupeh8#b!J4>yormNUL39LHQZPg7OmPYpt;|5-StM zN@E(@t55?#=l|cU_UbwqW2JA1(PTM;^NP~73?_4jyoK|dg0!K65T$5G;ZtBj%<e!e zj3=<y=M)9j#-n3|Ama=hLz(NxPKKmQ#vkUtn3(X}9@uVyJ<)IB96j$#SysP-W;Ive zaN~@z+-dxbW_WlIzN3y0u*eFD_0oLbf~Q_^%@5wb`+B`5YjXT<M>o~CezJ&$#leoZ z+;bwGJm377QO?lpIpicH{!s3CbPOKP=)-3S<<y<vyy76y=98M45*YwiZo14<J$RfG zQx=-c^#NzU?2Qg6ZM4OXs2vk&P<Y>7)(gQ=JJ<=vJmmNlm#h&!gbov`;e%n>a0DOr z+Lz?}X$?m;F$4Z_6${UC=K>N|AA4KfdMZP?XJEDj?ou}&kIfWJF+F^ht&DH7*N>9o zGn~eZPrp+YU$}OA9WWWiSc`dvpK!$35EhE%l3izVK2B7_rUo*(haWdY8&|IFt`mOj z*5D=)CKNTxzP)>IOM$FrbAJxyE@JKG+3AKl$S2%EH1O#lQ(j80Fz{Ntu3u^Od`p#V zI8^&hcC75X3kKs?Y~Qw4`|f@G=Bj+#Kr{^H|1ZOtwm6_wd4)4|V3B-VX(@-1UPQc& z!a;E)Zc+{Nay0+Rlirp>kVE4+@i`e(!QoK=@C2<PO9gq{#l?JcP^|K@jkLv2hj)lL z#fTmqiP+cLc_c=DPiv^t7A!}8S98?|`-BfOWg+i}^D_8VU3^pxCw`ePDG31fNj^)B zVIQpPX_{R$6gkaX>eCuZ2i^pD7*vNIMFqW{?4yWO1Qf7uRM<Xpmh}z2Vo}QW2u!MQ zx)4_u?1ZgU^8pbHg8CbnmVCgp@bsN0n9VUd$LTytXM|1*(@G`@3;81U@rLcun4+5c zU9zpmP?p$UVOs$i^~SS_J{;>TW}di<e2F!Dae=A;ROyq*9v@z3f76#79o5||Q4gJU z3`$@NB%Y5BK7rF`miP^E9+?u;aXNoSN3cf9dm4)Ln4pvnj@jV3jsj0QNjdk-z=Y}W zh&eG?basWeL$`f>ekeRrYskz4&A!p>IW1i(-OPS<?j65y=J?qFEzF-dIW}_P%=z&% zPmktLoEaI{hghoD`Q9Zs(2m0_+36g4`rP?v#!p@_JA(^+e2vZxIv=D%AlXmwBnvrQ z-)RfJQX_{s;q#fWE&Vv-eGeUuKsg6U_8c3S>~jqJRXV>;=Qrv61)aa5^Vf9#hR)y8 z`FlFF!xdQ8AhH9zrHPdRkcsmNL}mmeiYU^74dX{fl1TCCqw^JoPm?hgfMmF|Gv;Zt zaySwY%PlFIFY)YI^Go1r_84;z(a*ibaOG%z4z&L_|7qF=#?w2}$I{*Dj{f^>DF@EV zE%op08R~g&ESE{Alj*i}BArcdN*_q4)0y-@dIMs+>E2AIY;VC9m&`-yzV!Ocdt-f> Mj=o&~mW2I(023w&82|tP literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_ophys_analysis.py b/brain_observatory/behavior/behavior_ophys_analysis.py new file mode 100644 index 0000000000..016a665a66 --- /dev/null +++ b/brain_observatory/behavior/behavior_ophys_analysis.py @@ -0,0 +1,115 @@ +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns + +from allensdk.core.lazy_property import LazyProperty, LazyPropertyMixin +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ + BehaviorOphysExperiment + +def plot_trace(timestamps, trace, ax=None, xlabel='time (seconds)', ylabel='fluorescence', title='roi'): + if ax is None: + fig, ax = plt.subplots(figsize=(15, 5)) + colors = sns.color_palette() + ax.plot(timestamps, trace, color=colors[0], linewidth=3) + ax.set_xlabel(xlabel) + ax.set_ylabel(ylabel) + ax.set_title(title) + ax.set_xlim([timestamps[0], timestamps[-1]]) + return ax + + +def plot_example_traces_and_behavior(dataset, cell_roi_ids, xmin_seconds, length_mins, save_dir=None, + include_running=False, cell_label=False): + suffix = '' + if include_running: + n = 2 + else: + n = 1 + interval_seconds = 20 + xmax_seconds = xmin_seconds + (length_mins * 60) + 1 + xlim = [xmin_seconds, xmax_seconds] + + figsize = (15, 10) + fig, ax = plt.subplots(len(cell_roi_ids) + n, 1, figsize=figsize, sharex=True) + ax = ax.ravel() + + ymins = [] + ymaxs = [] + for i, cell_roi_id in enumerate(cell_roi_ids): + trace = dataset.dff_traces[dataset.dff_traces['cell_roi_id']==cell_roi_id]['dff'].values[0] + ax[i] = plot_trace(dataset.ophys_timestamps, trace, ax=ax[i], + title='', ylabel=str(cell_roi_id)) + ax[i] = add_stim_color_span(dataset, ax=ax[i], xlim=xlim) + ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) + ax[i].set_xlabel('') + ymin, ymax = ax[i].get_ylim() + ymins.append(ymin) + ymaxs.append(ymax) + if cell_label: + ax[i].set_ylabel(str(cell_index)) + else: + ax[i].set_ylabel('dF/F') + sns.despine(ax=ax[i]) + + for i, cell_roi_id in enumerate(cell_roi_ids): + ax[i].set_ylim([np.amin(ymins), np.amax(ymaxs)]) + + i += 1 + ax[i].set_ylim([np.amin(ymins), 1]) + ax[i] = plot_behavior_events(dataset, ax=ax[i], behavior_only=True) + ax[i] = add_stim_color_span(dataset, ax=ax[i], xlim=xlim) + ax[i].set_xlim(xlim) + ax[i].set_ylabel('') + ax[i].axes.get_yaxis().set_visible(False) + ax[i].legend(loc='upper left', fontsize=14) + sns.despine(ax=ax[i]) + + if include_running: + i += 1 + ax[i].plot(dataset.stimulus_timestamps, dataset.running_speed) + ax[i] = add_stim_color_span(dataset, ax=ax[i], xlim=xlim) + ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) + ax[i].set_ylabel('run speed\n(cm/s)') + # ax[i].axes.get_yaxis().set_visible(False) + sns.despine(ax=ax[i]) + + ax[i].set_xlabel('time (seconds)') + ax[0].set_title(dataset.ophys_experiment_id) + fig.tight_layout() + plt.subplots_adjust(wspace=0, hspace=0) + if save_dir is not None: + save_figure(fig, figsize, save_dir, 'example_traces', 'example_traces_' + str(xlim[0]) + suffix) + save_figure(fig, figsize, save_dir, 'example_traces', + str(dataset.ophys_experiment_id) + '_' + str(xlim[0]) + suffix) + plt.close() + +class BehaviorOphysAnalysis(LazyPropertyMixin): + + def __init__(self, session, api=None): + + self.session = session + self.api = self if api is None else api + # self.active_cell_roi_ids = LazyProperty(self.api.get_active_cell_roi_ids, ophys_experiment_id=self.ophys_experiment_id) + + + + + + def plot_example_traces_and_behavior(self, N=10): + dff_traces_df = self.session.dff_traces + dff_traces_df['mean'] = dff_traces_df['dff'].apply(np.mean) + dff_traces_df['std'] = dff_traces_df['dff'].apply(np.std) + dff_traces_df['snr'] = dff_traces_df['mean']/dff_traces_df['std'] + active_cell_roi_ids = dff_traces_df.sort_values('snr', ascending=False)['cell_roi_id'].values[:N] + + length_mins = 1 + for xmin_seconds in np.arange(0, 5000, length_mins * 60): + plot_example_traces_and_behavior(self.session, active_cell_roi_ids, xmin_seconds, length_mins, cell_label=False, include_running=True) + + +if __name__ == "__main__": + + session = BehaviorOphysExperiment(789359614) + analysis = BehaviorOphysAnalysis(session) + analysis.plot_example_traces_and_behavior() + diff --git a/brain_observatory/behavior/behavior_ophys_experiment.py b/brain_observatory/behavior/behavior_ophys_experiment.py new file mode 100644 index 0000000000..f13171ff57 --- /dev/null +++ b/brain_observatory/behavior/behavior_ophys_experiment.py @@ -0,0 +1,755 @@ +from typing import Optional + +import numpy as np +import pandas as pd +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.behavior_session import ( + BehaviorSession) +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ + EyeTrackingFile +from allensdk.brain_observatory.behavior.data_files\ + .rigid_motion_transform_file import \ + RigidMotionTransformFile +from allensdk.brain_observatory.behavior.data_objects import \ + BehaviorSessionId, StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.cell_specimens \ + .cell_specimens import \ + CellSpecimens, EventsParams +from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ + .eye_tracking_table import \ + EyeTrackingTable +from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ + .rig_geometry import \ + RigGeometry as EyeTrackingRigGeometry +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.date_of_acquisition import \ + DateOfAcquisitionOphys, DateOfAcquisition +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_ophys_metadata import \ + BehaviorOphysMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata.imaging_plane_group \ + import \ + ImagingPlaneGroup +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata.multi_plane_metadata \ + import \ + MultiplaneMetadata +from allensdk.brain_observatory.behavior.data_objects.motion_correction \ + import \ + MotionCorrection +from allensdk.brain_observatory.behavior.data_objects.projections import \ + Projections +from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ + calculate_monitor_delay +from allensdk.brain_observatory.behavior.data_objects.timestamps \ + .ophys_timestamps import \ + OphysTimestamps, OphysTimestampsMultiplane +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.deprecated import legacy +from allensdk.brain_observatory.behavior.image_api import Image +from allensdk.internal.api import db_connection_creator + + +class BehaviorOphysExperiment(BehaviorSession): + """Represents data from a single Visual Behavior Ophys imaging session. + Initialize by using class methods `from_lims` or `from_nwb_path`. + """ + + def __init__(self, + behavior_session: BehaviorSession, + projections: Projections, + ophys_timestamps: OphysTimestamps, + cell_specimens: CellSpecimens, + metadata: BehaviorOphysMetadata, + motion_correction: MotionCorrection, + eye_tracking_table: Optional[EyeTrackingTable], + eye_tracking_rig_geometry: Optional[EyeTrackingRigGeometry], + date_of_acquisition: DateOfAcquisition): + super().__init__( + behavior_session_id=behavior_session._behavior_session_id, + licks=behavior_session._licks, + metadata=behavior_session._metadata, + raw_running_speed=behavior_session._raw_running_speed, + rewards=behavior_session._rewards, + running_speed=behavior_session._running_speed, + running_acquisition=behavior_session._running_acquisition, + stimuli=behavior_session._stimuli, + stimulus_timestamps=behavior_session._stimulus_timestamps, + task_parameters=behavior_session._task_parameters, + trials=behavior_session._trials, + date_of_acquisition=date_of_acquisition + ) + + self._metadata = metadata + self._projections = projections + self._ophys_timestamps = ophys_timestamps + self._cell_specimens = cell_specimens + self._motion_correction = motion_correction + self._eye_tracking = eye_tracking_table + self._eye_tracking_rig_geometry = eye_tracking_rig_geometry + + def to_nwb(self) -> NWBFile: + nwbfile = super().to_nwb(add_metadata=False) + + self._metadata.to_nwb(nwbfile=nwbfile) + self._projections.to_nwb(nwbfile=nwbfile) + self._cell_specimens.to_nwb(nwbfile=nwbfile, + ophys_timestamps=self._ophys_timestamps) + self._motion_correction.to_nwb(nwbfile=nwbfile) + self._eye_tracking.to_nwb(nwbfile=nwbfile) + self._eye_tracking_rig_geometry.to_nwb(nwbfile=nwbfile) + + return nwbfile + # ==================== class and utility methods ====================== + + @classmethod + def from_lims(cls, + ophys_experiment_id: int, + eye_tracking_z_threshold: float = 3.0, + eye_tracking_dilation_frames: int = 2, + events_filter_scale: float = 2.0, + events_filter_n_time_steps: int = 20, + exclude_invalid_rois=True, + skip_eye_tracking=False) -> \ + "BehaviorOphysExperiment": + """ + Parameters + ---------- + ophys_experiment_id + eye_tracking_z_threshold + See `BehaviorOphysExperiment.from_nwb` + eye_tracking_dilation_frames + See `BehaviorOphysExperiment.from_nwb` + events_filter_scale + See `BehaviorOphysExperiment.from_nwb` + events_filter_n_time_steps + See `BehaviorOphysExperiment.from_nwb` + exclude_invalid_rois + Whether to exclude invalid rois + skip_eye_tracking + Used to skip returning eye tracking data + """ + def _is_multi_plane_session(): + imaging_plane_group_meta = ImagingPlaneGroup.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + return cls._is_multi_plane_session( + imaging_plane_group_meta=imaging_plane_group_meta) + + def _get_motion_correction(): + rigid_motion_transform_file = RigidMotionTransformFile.from_lims( + ophys_experiment_id=ophys_experiment_id, db=lims_db + ) + return MotionCorrection.from_data_file( + rigid_motion_transform_file=rigid_motion_transform_file) + + def _get_eye_tracking_table(sync_file: SyncFile): + eye_tracking_file = EyeTrackingFile.from_lims( + db=lims_db, ophys_experiment_id=ophys_experiment_id) + eye_tracking_table = EyeTrackingTable.from_data_file( + data_file=eye_tracking_file, + sync_file=sync_file, + z_threshold=eye_tracking_z_threshold, + dilation_frames=eye_tracking_dilation_frames + ) + return eye_tracking_table + + lims_db = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP + ) + sync_file = SyncFile.from_lims(db=lims_db, + ophys_experiment_id=ophys_experiment_id) + stimulus_timestamps = StimulusTimestamps.from_sync_file( + sync_file=sync_file) + behavior_session_id = BehaviorSessionId.from_lims( + db=lims_db, ophys_experiment_id=ophys_experiment_id) + is_multiplane_session = _is_multi_plane_session() + meta = BehaviorOphysMetadata.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, + is_multiplane=is_multiplane_session + ) + monitor_delay = calculate_monitor_delay( + sync_file=sync_file, equipment=meta.behavior_metadata.equipment) + date_of_acquisition = DateOfAcquisitionOphys.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + behavior_session = BehaviorSession.from_lims( + lims_db=lims_db, + behavior_session_id=behavior_session_id.value, + stimulus_timestamps=stimulus_timestamps, + monitor_delay=monitor_delay, + date_of_acquisition=date_of_acquisition + ) + if is_multiplane_session: + ophys_timestamps = OphysTimestampsMultiplane.from_sync_file( + sync_file=sync_file, + group_count=meta.ophys_metadata.imaging_plane_group_count, + plane_group=meta.ophys_metadata.imaging_plane_group + ) + else: + ophys_timestamps = OphysTimestamps.from_sync_file( + sync_file=sync_file) + + projections = Projections.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + cell_specimens = CellSpecimens.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, + ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=projections.max_projection.spacing, + events_params=EventsParams( + filter_scale=events_filter_scale, + filter_n_time_steps=events_filter_n_time_steps), + exclude_invalid_rois=exclude_invalid_rois + ) + motion_correction = _get_motion_correction() + if skip_eye_tracking: + eye_tracking_table = None + eye_tracking_rig_geometry = None + else: + eye_tracking_table = _get_eye_tracking_table(sync_file=sync_file) + eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + + return BehaviorOphysExperiment( + behavior_session=behavior_session, + cell_specimens=cell_specimens, + ophys_timestamps=ophys_timestamps, + metadata=meta, + projections=projections, + motion_correction=motion_correction, + eye_tracking_table=eye_tracking_table, + eye_tracking_rig_geometry=eye_tracking_rig_geometry, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile, + eye_tracking_z_threshold: float = 3.0, + eye_tracking_dilation_frames: int = 2, + events_filter_scale: float = 2.0, + events_filter_n_time_steps: int = 20, + exclude_invalid_rois=True + ) -> "BehaviorOphysExperiment": + """ + + Parameters + ---------- + nwbfile + eye_tracking_z_threshold : float, optional + The z-threshold when determining which frames likely contain + outliers for eye or pupil areas. Influences which frames + are considered 'likely blinks'. By default 3.0 + eye_tracking_dilation_frames : int, optional + Determines the number of adjacent frames that will be marked + as 'likely_blink' when performing blink detection for + `eye_tracking` data, by default 2 + events_filter_scale : float, optional + Stdev of halfnorm distribution used to convolve ophys events with + a 1d causal half-gaussian filter to smooth it for visualization, + by default 2.0 + events_filter_n_time_steps : int, optional + Number of time steps to use for convolution of ophys events + exclude_invalid_rois + Whether to exclude invalid rois + """ + def _is_multi_plane_session(): + imaging_plane_group_meta = ImagingPlaneGroup.from_nwb( + nwbfile=nwbfile) + return cls._is_multi_plane_session( + imaging_plane_group_meta=imaging_plane_group_meta) + + behavior_session = BehaviorSession.from_nwb(nwbfile=nwbfile) + projections = Projections.from_nwb(nwbfile=nwbfile) + cell_specimens = CellSpecimens.from_nwb( + nwbfile=nwbfile, + segmentation_mask_image_spacing=projections.max_projection.spacing, + events_params=EventsParams( + filter_scale=events_filter_scale, + filter_n_time_steps=events_filter_n_time_steps + ), + exclude_invalid_rois=exclude_invalid_rois + ) + eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_nwb( + nwbfile=nwbfile) + eye_tracking_table = EyeTrackingTable.from_nwb( + nwbfile=nwbfile, z_threshold=eye_tracking_z_threshold, + dilation_frames=eye_tracking_dilation_frames) + motion_correction = MotionCorrection.from_nwb(nwbfile=nwbfile) + is_multiplane_session = _is_multi_plane_session() + metadata = BehaviorOphysMetadata.from_nwb( + nwbfile=nwbfile, is_multiplane=is_multiplane_session) + if is_multiplane_session: + ophys_timestamps = OphysTimestampsMultiplane.from_nwb( + nwbfile=nwbfile) + else: + ophys_timestamps = OphysTimestamps.from_nwb(nwbfile=nwbfile) + date_of_acquisition = DateOfAcquisitionOphys.from_nwb(nwbfile=nwbfile) + + return BehaviorOphysExperiment( + behavior_session=behavior_session, + cell_specimens=cell_specimens, + eye_tracking_rig_geometry=eye_tracking_rig_geometry, + eye_tracking_table=eye_tracking_table, + motion_correction=motion_correction, + metadata=metadata, + ophys_timestamps=ophys_timestamps, + projections=projections, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_json(cls, + session_data: dict, + eye_tracking_z_threshold: float = 3.0, + eye_tracking_dilation_frames: int = 2, + events_filter_scale: float = 2.0, + events_filter_n_time_steps: int = 20, + exclude_invalid_rois=True, + skip_eye_tracking=False) -> \ + "BehaviorOphysExperiment": + """ + + Parameters + ---------- + session_data + eye_tracking_z_threshold + See `BehaviorOphysExperiment.from_nwb` + eye_tracking_dilation_frames + See `BehaviorOphysExperiment.from_nwb` + events_filter_scale + See `BehaviorOphysExperiment.from_nwb` + events_filter_n_time_steps + See `BehaviorOphysExperiment.from_nwb` + exclude_invalid_rois + Whether to exclude invalid rois + skip_eye_tracking + Used to skip returning eye tracking data + + """ + def _is_multi_plane_session(): + imaging_plane_group_meta = ImagingPlaneGroup.from_json( + dict_repr=session_data) + return cls._is_multi_plane_session( + imaging_plane_group_meta=imaging_plane_group_meta) + + def _get_motion_correction(): + rigid_motion_transform_file = RigidMotionTransformFile.from_json( + dict_repr=session_data) + return MotionCorrection.from_data_file( + rigid_motion_transform_file=rigid_motion_transform_file) + + def _get_eye_tracking_table(sync_file: SyncFile): + eye_tracking_file = EyeTrackingFile.from_json( + dict_repr=session_data) + eye_tracking_table = EyeTrackingTable.from_data_file( + data_file=eye_tracking_file, + sync_file=sync_file, + z_threshold=eye_tracking_z_threshold, + dilation_frames=eye_tracking_dilation_frames + ) + return eye_tracking_table + + sync_file = SyncFile.from_json(dict_repr=session_data) + is_multiplane_session = _is_multi_plane_session() + meta = BehaviorOphysMetadata.from_json( + dict_repr=session_data, is_multiplane=is_multiplane_session) + monitor_delay = calculate_monitor_delay( + sync_file=sync_file, equipment=meta.behavior_metadata.equipment) + behavior_session = BehaviorSession.from_json( + session_data=session_data, + monitor_delay=monitor_delay + ) + + if is_multiplane_session: + ophys_timestamps = OphysTimestampsMultiplane.from_sync_file( + sync_file=sync_file, + group_count=meta.ophys_metadata.imaging_plane_group_count, + plane_group=meta.ophys_metadata.imaging_plane_group + ) + else: + ophys_timestamps = OphysTimestamps.from_sync_file( + sync_file=sync_file) + + projections = Projections.from_json(dict_repr=session_data) + cell_specimens = CellSpecimens.from_json( + dict_repr=session_data, + ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=projections.max_projection.spacing, + events_params=EventsParams( + filter_scale=events_filter_scale, + filter_n_time_steps=events_filter_n_time_steps), + exclude_invalid_rois=exclude_invalid_rois + ) + motion_correction = _get_motion_correction() + if skip_eye_tracking: + eye_tracking_table = None + eye_tracking_rig_geometry = None + else: + eye_tracking_table = _get_eye_tracking_table(sync_file=sync_file) + eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_json( + dict_repr=session_data) + + return BehaviorOphysExperiment( + behavior_session=behavior_session, + cell_specimens=cell_specimens, + ophys_timestamps=ophys_timestamps, + metadata=meta, + projections=projections, + motion_correction=motion_correction, + eye_tracking_table=eye_tracking_table, + eye_tracking_rig_geometry=eye_tracking_rig_geometry, + date_of_acquisition=behavior_session._date_of_acquisition + ) + + # ========================= 'get' methods ========================== + + def get_segmentation_mask_image(self) -> Image: + """a 2D binary image of all valid cell masks + + Returns + ---------- + allensdk.brain_observatory.behavior.image_api.Image: + array-like interface to segmentation_mask image data and + metadata + """ + return self._cell_specimens.segmentation_mask_image + + @legacy('Consider using "dff_traces" instead.') + def get_dff_traces(self, cell_specimen_ids=None): + + if cell_specimen_ids is None: + cell_specimen_ids = self.get_cell_specimen_ids() + + csid_table = \ + self.cell_specimen_table.reset_index()[['cell_specimen_id']] + csid_subtable = csid_table[csid_table['cell_specimen_id'].isin( + cell_specimen_ids)].set_index('cell_specimen_id') + dff_table = csid_subtable.join(self.dff_traces, how='left') + dff_traces = np.vstack(dff_table['dff'].values) + timestamps = self.ophys_timestamps + + assert (len(cell_specimen_ids), len(timestamps)) == dff_traces.shape + return timestamps, dff_traces + + @legacy() + def get_cell_specimen_indices(self, cell_specimen_ids): + return [self.cell_specimen_table.index.get_loc(csid) + for csid in cell_specimen_ids] + + @legacy("Consider using cell_specimen_table['cell_specimen_id'] instead.") + def get_cell_specimen_ids(self): + cell_specimen_ids = self.cell_specimen_table.index.values + + if np.isnan(cell_specimen_ids.astype(float)).sum() == \ + len(self.cell_specimen_table): + raise ValueError("cell_specimen_id values not assigned " + f"for {self.ophys_experiment_id}") + return cell_specimen_ids + + # ====================== properties ======================== + + @property + def ophys_experiment_id(self) -> int: + """Unique identifier for this experimental session. + :rtype: int + """ + return self._metadata.ophys_metadata.ophys_experiment_id + + @property + def ophys_session_id(self) -> int: + """Unique identifier for this ophys session. + :rtype: int + """ + return self._metadata.ophys_metadata.ophys_session_id + + @property + def metadata(self): + behavior_meta = super()._get_metadata( + behavior_metadata=self._metadata.behavior_metadata) + ophys_meta = { + 'indicator': self._cell_specimens.meta.imaging_plane.indicator, + 'emission_lambda': self._cell_specimens.meta.emission_lambda, + 'excitation_lambda': + self._cell_specimens.meta.imaging_plane.excitation_lambda, + 'experiment_container_id': + self._metadata.ophys_metadata.experiment_container_id, + 'field_of_view_height': + self._metadata.ophys_metadata.field_of_view_shape.height, + 'field_of_view_width': + self._metadata.ophys_metadata.field_of_view_shape.width, + 'imaging_depth': self._metadata.ophys_metadata.imaging_depth, + 'imaging_plane_group': + self._metadata.ophys_metadata.imaging_plane_group + if isinstance(self._metadata.ophys_metadata, + MultiplaneMetadata) else None, + 'imaging_plane_group_count': + self._metadata.ophys_metadata.imaging_plane_group_count + if isinstance(self._metadata.ophys_metadata, + MultiplaneMetadata) else 0, + 'ophys_experiment_id': + self._metadata.ophys_metadata.ophys_experiment_id, + 'ophys_frame_rate': + self._cell_specimens.meta.imaging_plane.ophys_frame_rate, + 'ophys_session_id': self._metadata.ophys_metadata.ophys_session_id, + 'project_code': self._metadata.ophys_metadata.project_code, + 'targeted_structure': + self._cell_specimens.meta.imaging_plane.targeted_structure + } + return { + **behavior_meta, + **ophys_meta + } + + @property + def max_projection(self) -> Image: + """2D max projection image. + :rtype: allensdk.brain_observatory.behavior.image_api.Image + """ + return self._projections.max_projection + + @property + def average_projection(self) -> Image: + """2D image of the microscope field of view, averaged across the + experiment + :rtype: allensdk.brain_observatory.behavior.image_api.Image + """ + return self._projections.avg_projection + + @property + def ophys_timestamps(self) -> np.ndarray: + """Timestamps associated with frames captured by the microscope + :rtype: numpy.ndarray + """ + return self._ophys_timestamps.value + + @property + def dff_traces(self) -> pd.DataFrame: + """traces of change in fluoescence / fluorescence + + Returns + ------- + pd.DataFrame + dataframe of traces of dff + (change in fluorescence / fluorescence) + + dataframe columns: + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + assigned after cell matching + cell_roi_id: (int) + experiment specific id of segmented roi, + assigned before cell matching + dff: (list of float) + fluorescence fractional values relative to baseline + (arbitrary units) + + """ + return self._cell_specimens.dff_traces + + @property + def events(self) -> pd.DataFrame: + """A dataframe containing spiking events in traces derived + from the two photon movies, organized by cell specimen id. + For more information on event detection processing + please see the event detection portion of the white paper. + + Returns + ------- + pd.DataFrame + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + (assigned after cell matching) + cell_roi_id: (int) + experiment specific id of segmented roi (assigned + before cell matching) + events: (np.array of float) + event trace where events correspond to the rise time + of a calcium transient in the dF/F trace, with a + magnitude roughly proportional the magnitude of the + increase in dF/F. + filtered_events: (np.array of float) + Events array with a 1d causal half-gaussian filter to + smooth it for visualization. Uses a halfnorm + distribution as weights to the filter + lambdas: (float64) + regularization value selected to make the minimum + event size be close to N * noise_std + noise_stds: (float64) + estimated noise standard deviation for the events trace + + """ + return self._cell_specimens.events + + @property + def cell_specimen_table(self) -> pd.DataFrame: + """Cell information organized into a dataframe. Table only + contains roi_valid = True entries, as invalid ROIs/ non cell + segmented objects have been filtered out + + Returns + ------- + pd.DataFrame + dataframe columns: + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + (assigned after cell matching) + cell_roi_id: (int) + experiment specific id of segmented roi + (assigned before cell matching) + height: (int) + height of ROI/cell in pixels + mask_image_plane: (int) + which image plane an ROI resides on. Overlapping + ROIs are stored on different mask image planes + max_corretion_down: (float) + max motion correction in down direction in pixels + max_correction_left: (float) + max motion correction in left direction in pixels + max_correction_right: (float) + max motion correction in right direction in pixels + max_correction_up: (float) + max motion correction in up direction in pixels + roi_mask: (array of bool) + an image array that displays the location of the + roi mask in the field of view + valid_roi: (bool) + indicates if cell classification found the segmented + ROI to be a cell or not (True = cell, False = not cell). + width: (int) + width of ROI in pixels + x: (float) + x position of ROI in field of view in pixels (top + left corner) + y: (float) + y position of ROI in field of view in pixels (top + left corner) + """ + return self._cell_specimens.table + + @property + def corrected_fluorescence_traces(self) -> pd.DataFrame: + """Corrected fluorescence traces which are neuropil corrected + and demixed. Sampling rate can be found in metadata + ‘ophys_frame_rate’ + + Returns + ------- + pd.DataFrame + Dataframe that contains the corrected fluorescence traces + for all valid cells. + + dataframe columns: + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + (assigned after cell matching) + cell_roi_id: (int) + experiment specific id of segmented roi + (assigned before cell matching) + corrected_fluorescence: (list of float) + fluorescence values (arbitrary units) + + """ + return self._cell_specimens.corrected_fluorescence_traces + + @property + def motion_correction(self) -> pd.DataFrame: + """a dataframe containing the x and y offsets applied during + motion correction + + Returns + ------- + pd.DataFrame + dataframe columns: + x: (int) + frame shift along x axis + y: (int) + frame shift along y axis + """ + return self._motion_correction.value + + @property + def segmentation_mask_image(self) -> Image: + """A 2d binary image of all valid cell masks + :rtype: allensdk.brain_observatory.behavior.image_api.Image + """ + return self._cell_specimens.segmentation_mask_image + + @property + def eye_tracking(self) -> pd.DataFrame: + """A dataframe containing ellipse fit parameters for the eye, pupil + and corneal reflection (cr). Fits are derived from tracking points + from a DeepLabCut model applied to video frames of a subject's + right eye. Raw tracking points and raw video frames are not exposed + by the SDK. + + Notes: + - All columns starting with 'pupil_' represent ellipse fit parameters + relating to the pupil. + - All columns starting with 'eye_' represent ellipse fit parameters + relating to the eyelid. + - All columns starting with 'cr_' represent ellipse fit parameters + relating to the corneal reflection, which is caused by an infrared + LED positioned near the eye tracking camera. + - All positions are in units of pixels. + - All areas are in units of pixels^2 + - All values are in the coordinate space of the eye tracking camera, + NOT the coordinate space of the stimulus display (i.e. this is not + gaze location), with (0, 0) being the upper-left corner of the + eye-tracking image. + - The 'likely_blink' column is True for any row (frame) where the pupil + fit failed OR eye fit failed OR an outlier fit was identified on the + pupil or eye fit. + - The pupil_area, cr_area, eye_area columns are set to NaN wherever + 'likely_blink' == True. + - The pupil_area_raw, cr_area_raw, eye_area_raw columns contains all + pupil fit values (including where 'likely_blink' == True). + - All ellipse fits are derived from tracking points that were output by + a DeepLabCut model that was trained on hand-annotated data from a + subset of imaging sessions on optical physiology rigs. + - Raw DeepLabCut tracking points are not publicly available. + + :rtype: pandas.DataFrame + """ + return self._eye_tracking.value + + @property + def eye_tracking_rig_geometry(self) -> dict: + """the eye tracking equipment geometry associate with a + given ophys experiment session. + + Returns + ------- + dict + dictionary with the following keys: + camera_eye_position_mm (array of float) + camera_rotation_deg (array of float) + equipment (string) + led_position (array of float) + monitor_position_mm (array of float) + monitor_rotation_deg (array of float) + """ + return self._eye_tracking_rig_geometry.to_dict()['rig_geometry'] + + @property + def roi_masks(self) -> pd.DataFrame: + return self.cell_specimen_table[['cell_roi_id', 'roi_mask']] + + def _get_identifier(self) -> str: + return str(self.ophys_experiment_id) + + @staticmethod + def _is_multi_plane_session( + imaging_plane_group_meta: ImagingPlaneGroup) -> bool: + """Returns whether this experiment is part of a multiplane session""" + return imaging_plane_group_meta is not None and \ + imaging_plane_group_meta.plane_group_count > 1 + + def _get_session_type(self) -> str: + return self._metadata.behavior_metadata.session_type + + @staticmethod + def _get_keywords(): + """Keywords for NWB file""" + return ["2-photon", "calcium imaging", "visual cortex", + "behavior", "task"] diff --git a/brain_observatory/behavior/behavior_ophys_session.py b/brain_observatory/behavior/behavior_ophys_session.py new file mode 100644 index 0000000000..30186cfb48 --- /dev/null +++ b/brain_observatory/behavior/behavior_ophys_session.py @@ -0,0 +1,18 @@ +import warnings + +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ + BehaviorOphysExperiment as BOE + +# alias as BOE prevents someone becoming comfortable with +# import BehaviorOphysExperiment from this to-be-deprecated module + +class BehaviorOphysSession(BOE): + def __init__(self, **kwargs): + warnings.warn( + "allensdk.brain_observatory.behavior.behavior_ophys_session." + "BehaviorOphysSession is deprecated. use " + "allensdk.brain_observatory.behavior.behavior_ophys_experiment." + "BehaviorOphysExperiment.", + DeprecationWarning, + stacklevel=3) + super().__init__(**kwargs) diff --git a/brain_observatory/behavior/behavior_project_cache/__init__.py b/brain_observatory/behavior/behavior_project_cache/__init__.py new file mode 100644 index 0000000000..ff862b37ca --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/__init__.py @@ -0,0 +1,2 @@ +from allensdk.brain_observatory.behavior.behavior_project_cache.\ + behavior_project_cache import VisualBehaviorOphysProjectCache # noqa F401 diff --git a/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2beec5b6d8cb71153e45744291d63631b0c5e800 GIT binary patch literal 363 zcmZ{eJxc>Y5QcXzjR*n%LFy~KE9^wXB(3;?Xb~2c*$=!md%Mf-<>X3hD}RHPe<`h1 zYCEgUX%dj&z`XO$z&kvX;qZ`P)$cFxhV!#uww0l|z)nXfiYRJHO=px6mEDniu)-_J z>2ma7(gN&6SI`<CuS3<Po9LgkY^ES9eU)dkTd-EUq~?W)U>x@%>DWT!V^@exaA$b< zO>^1D|2fB=?t{bujvx7cou0CLe47|lpb7!c;5s&TAiYy?!nA7>^8qm=s_!w`r4cNd sMjr=|b9mI4-GG*Rpyd{HXa0hgoEv8v&Wq4356)_@7FM5A<om)VYwas`iU0rr literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/__pycache__/behavior_project_cache.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/__pycache__/behavior_project_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f15aefbeb78b670d67e86b27ea2affd7545962f9 GIT binary patch literal 21797 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 S&7|b_*v#)H)ZdZ(?*9YW^~ah3 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py b/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py new file mode 100644 index 0000000000..db8e737690 --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py @@ -0,0 +1,617 @@ +from functools import partial +from typing import Optional, List, Union +from pathlib import Path +import pandas as pd +import logging + +from allensdk.api.warehouse_cache.cache import Cache +from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ + .experiments_table import \ + ExperimentsTable +from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ + .sessions_table import \ + SessionsTable +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import ( # noqa: E501 + BehaviorProjectLimsApi, BehaviorProjectCloudApi) +from allensdk.api.warehouse_cache.caching_utilities import \ + one_file_call_caching, call_caching +from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ + .ophys_sessions_table import \ + BehaviorOphysSessionsTable +from allensdk.core.authentication import DbCredentials + + +class VBOLimsCache(Cache): + """ + A class that ineherits from the warehouse Cache and provides + that functionality to VisualBehaviorOphysProjectCache + """ + + MANIFEST_VERSION = "0.0.1-alpha.3" + OPHYS_SESSIONS_KEY = "ophys_sessions" + BEHAVIOR_SESSIONS_KEY = "behavior_sessions" + OPHYS_EXPERIMENTS_KEY = "ophys_experiments" + OPHYS_CELLS_KEY = "ophys_cells" + + MANIFEST_CONFIG = { + OPHYS_SESSIONS_KEY: { + "spec": f"{OPHYS_SESSIONS_KEY}.csv", + "parent_key": "BASEDIR", + "typename": "file" + }, + BEHAVIOR_SESSIONS_KEY: { + "spec": f"{BEHAVIOR_SESSIONS_KEY}.csv", + "parent_key": "BASEDIR", + "typename": "file" + }, + OPHYS_EXPERIMENTS_KEY: { + "spec": f"{OPHYS_EXPERIMENTS_KEY}.csv", + "parent_key": "BASEDIR", + "typename": "file" + }, + OPHYS_CELLS_KEY: { + "spec": f"{OPHYS_CELLS_KEY}.csv", + "parent_key": "BASEDIR", + "typename": "file" + } + } + + +class VisualBehaviorOphysProjectCache(object): + + def __init__( + self, + fetch_api: Optional[Union[BehaviorProjectLimsApi, + BehaviorProjectCloudApi]] = None, + fetch_tries: int = 2, + manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None, + cache: bool = True): + """ Entrypoint for accessing visual behavior data. Supports + access to summaries of session data and provides tools for + downloading detailed session data (such as dff traces). + + Likely you will want to use a class constructor, such as `from_lims`, + to initialize a VisualBehaviorOphysProjectCache, rather than calling + this directly. + + --- NOTE --- + Because NWB files are not currently supported for this project (as of + 11/2019), this cache will not actually save any files of session data + to the local machine. Only summary tables will be saved to the local + cache. File retrievals for specific sessions will be handled by + the fetch api used for the Session object, and cached in-memory + only to enable fast retrieval for subsequent calls. + + If you are looping over session objects, be sure to clean up + your memory when it is not needed by calling `cache_clear` from + your session object. + + Parameters + ========== + fetch_api : + Used to pull data from remote sources, after which it is locally + cached. Any object inheriting from BehaviorProjectBase is + suitable. Current options are: + BehaviorProjectLimsApi :: Fetches bleeding-edge data from the + Allen Institute"s internal database. Only works if you are + on our internal network. + fetch_tries : + Maximum number of times to attempt a download before giving up and + raising an exception. Note that this is total tries, not retries. + Default=2. + manifest : str or Path + full path at which manifest json will be stored. Defaults + to "behavior_project_manifest.json" in the local directory. + version : str + version of manifest file. If this mismatches the version + recorded in the file at manifest, an error will be raised. + Defaults to the manifest version in the class. + cache : bool + Whether to write to the cache. Default=True. + """ + if cache: + manifest_ = manifest or "behavior_project_manifest.json" + else: + manifest_ = None + + self.fetch_api = fetch_api + self.cache = None + + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + if cache: + self.cache = VBOLimsCache(manifest=manifest_, + version=version, + cache=cache) + self.fetch_tries = fetch_tries + self.logger = logging.getLogger(self.__class__.__name__) + + @property + def manifest(self): + if self.cache is None: + api_name = type(self.fetch_api).__name__ + raise NotImplementedError(f"A {type(self).__name__} " + f"based on {api_name} " + "does not have an accessible manifest " + "property") + return self.cache.manifest + + @classmethod + def from_s3_cache(cls, cache_dir: Union[str, Path], + bucket_name: str = "visual-behavior-ophys-data", + project_name: str = "visual-behavior-ophys" + ) -> "VisualBehaviorOphysProjectCache": + """instantiates this object with a connection to an s3 bucket and/or + a local cache related to that bucket. + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + bucket_name: str + for example, if bucket URI is 's3://mybucket' this value should be + 'mybucket' + + project_name: str + the name of the project this cache is supposed to access. This + project name is the first part of the prefix of the release data + objects. I.e. s3://<bucket_name>/<project_name>/<object tree> + + Returns + ------- + VisualBehaviorOphysProjectCache instance + + """ + fetch_api = BehaviorProjectCloudApi.from_s3_cache( + cache_dir, bucket_name, project_name, + ui_class_name=cls.__name__) + return cls(fetch_api=fetch_api) + + @classmethod + def from_local_cache( + cls, + cache_dir: Union[str, Path], + project_name: str = "visual-behavior-ophys", + use_static_cache: bool = False + ) -> "VisualBehaviorOphysProjectCache": + """instantiates this object with a local cache. + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + project_name: str + the name of the project this cache is supposed to access. This + project name is the first part of the prefix of the release data + objects. I.e. s3://<bucket_name>/<project_name>/<object tree> + + Returns + ------- + VisualBehaviorOphysProjectCache instance + + """ + fetch_api = BehaviorProjectCloudApi.from_local_cache( + cache_dir, + project_name, + ui_class_name=cls.__name__, + use_static_cache=use_static_cache + ) + return cls(fetch_api=fetch_api) + + @classmethod + def from_lims(cls, manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None, + cache: bool = False, + fetch_tries: int = 2, + lims_credentials: Optional[DbCredentials] = None, + mtrain_credentials: Optional[DbCredentials] = None, + host: Optional[str] = None, + scheme: Optional[str] = None, + asynchronous: bool = True, + data_release_date: Optional[Union[str, List[str]]] = None + ) -> "VisualBehaviorOphysProjectCache": + """ + Construct a VisualBehaviorOphysProjectCache with a lims api. Use this + method to create a VisualBehaviorOphysProjectCache instance rather + than calling VisualBehaviorOphysProjectCache directly. + + Parameters + ========== + manifest : str or Path + full path at which manifest json will be stored + version : str + version of manifest file. If this mismatches the version + recorded in the file at manifest, an error will be raised. + cache : bool + Whether to write to the cache + fetch_tries : int + Maximum number of times to attempt a download before giving up and + raising an exception. Note that this is total tries, not retries + lims_credentials : DbCredentials + Optional credentials to access LIMS database. + If not set, will look for credentials in environment variables. + mtrain_credentials: DbCredentials + Optional credentials to access mtrain database. + If not set, will look for credentials in environment variables. + host : str + Web host for the app_engine. Currently unused. This argument is + included for consistency with EcephysProjectCache.from_lims. + scheme : str + URI scheme, such as "http". Currently unused. This argument is + included for consistency with EcephysProjectCache.from_lims. + asynchronous : bool + Whether to fetch from web asynchronously. Currently unused. + data_release_date: str or list of str + Use to filter tables to only include data released on date + ie 2021-03-25 or ['2021-03-25', '2021-08-12'] + Returns + ======= + VisualBehaviorOphysProjectCache + VisualBehaviorOphysProjectCache instance with a LIMS fetch API + """ + if host and scheme: + app_kwargs = {"host": host, "scheme": scheme, + "asynchronous": asynchronous} + else: + app_kwargs = None + fetch_api = BehaviorProjectLimsApi.default( + lims_credentials=lims_credentials, + mtrain_credentials=mtrain_credentials, + data_release_date=data_release_date, + app_kwargs=app_kwargs) + return cls(fetch_api=fetch_api, manifest=manifest, version=version, + cache=cache, fetch_tries=fetch_tries) + + def _cache_not_implemented(self, method_name: str) -> None: + """ + Raise a NotImplementedError explaining that method_name + does not exist for VisualBehaviorOphysProjectCache + that does not have a fetch_api based on LIMS + """ + msg = f"Method {method_name} does not exist for this " + msg += f"{type(self).__name__}, which is based on " + msg += f"{type(self.fetch_api).__name__}" + raise NotImplementedError(msg) + + def construct_local_manifest(self) -> None: + """ + Construct the local file used to determine if two files are + duplicates of each other or not. Save it into the expected + place in the cache. (You will see a warning if the cache + thinks that you need to run this method). + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('construct_local_manifest') + self.fetch_api.cache.construct_local_manifest() + + def compare_manifests(self, + manifest_0_name: str, + manifest_1_name: str + ) -> str: + """ + Compare two manifests from this dataset. Return a dict + containing the list of metadata and data files that changed + between them + + Note: this assumes that manifest_0 predates manifest_1 + + Parameters + ---------- + manifest_0_name: str + + manifest_1_name: str + + Returns + ------- + str + A string summarizing all of the changes going from + manifest_0 to manifest_1 + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('compare_manifests') + return self.fetch_api.cache.compare_manifests(manifest_0_name, + manifest_1_name) + + def load_latest_manifest(self) -> None: + """ + Load the manifest corresponding to the most up to date + version of the dataset. + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('load_latest_manifest') + self.fetch_api.cache.load_latest_manifest() + + def latest_downloaded_manifest_file(self) -> str: + """ + Return the name of the most up to date data manifest + available on your local system. + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('latest_downloaded_manifest_file') + return self.fetch_api.cache.latest_downloaded_manifest_file + + def latest_manifest_file(self) -> str: + """ + Return the name of the most up to date data manifest + corresponding to this dataset, checking in the cloud + if this is a cloud-backed cache. + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('latest_manifest_file') + return self.fetch_api.cache.latest_manifest_file + + def load_manifest(self, manifest_name: str): + """ + Load a specific versioned manifest for this dataset. + + Parameters + ---------- + manifest_name: str + The name of the manifest to load. Must be an element in + self.manifest_file_names + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('load_manifest') + self.fetch_api.load_manifest(manifest_name) + + def list_all_downloaded_manifests(self) -> list: + """ + Return a sorted list of the names of the manifest files + that have been downloaded to this cache. + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('list_all_downloaded_manifests') + return self.fetch_api.cache.list_all_downloaded_manifests() + + def list_manifest_file_names(self) -> list: + """ + Return a sorted list of the names of the manifest files + associated with this dataset. + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('list_manifest_file_names') + return self.fetch_api.cache.manifest_file_names + + def current_manifest(self) -> Union[None, str]: + """ + Return the name of the dataset manifest currently being + used by this cache. + """ + if not isinstance(self.fetch_api, BehaviorProjectCloudApi): + self._cache_not_implemented('current_manifest') + return self.fetch_api.cache.current_manifest + + def get_ophys_session_table( + self, + suppress: Optional[List[str]] = None, + index_column: str = "ophys_session_id", + as_df=True, + include_behavior_data=True, + passed_only=True) -> \ + Union[pd.DataFrame, BehaviorOphysSessionsTable]: + """ + Return summary table of all ophys_session_ids in the database. + :param suppress: optional list of columns to drop from the resulting + dataframe. + :type suppress: list of str + :param index_column: (default="ophys_session_id"). Column to index + on, either + "ophys_session_id" or "ophys_experiment_id". + If index_column="ophys_experiment_id", then each row will only have + one experiment id, of type int (vs. an array of 1>more). + :type index_column: str + :param as_df: whether to return as df or as BehaviorOphysSessionsTable + :param include_behavior_data + Whether to include behavior data + :rtype: pd.DataFrame + """ + if isinstance(self.fetch_api, BehaviorProjectCloudApi): + return self.fetch_api.get_ophys_session_table() + if self.cache is not None: + path = self.cache.get_cache_path(None, + self.cache.OPHYS_SESSIONS_KEY) + ophys_sessions = one_file_call_caching( + path, + self.fetch_api.get_ophys_session_table, + _write_json, + lambda path: _read_json(path, index_name='ophys_session_id')) + else: + ophys_sessions = self.fetch_api.get_ophys_session_table() + + if include_behavior_data: + # Merge behavior data in + behavior_sessions_table = self.get_behavior_session_table( + suppress=suppress, as_df=True, include_ophys_data=False) + ophys_sessions = behavior_sessions_table.merge( + ophys_sessions, + left_index=True, + right_on='behavior_session_id', + suffixes=('_behavior', '_ophys')) + + sessions = BehaviorOphysSessionsTable(df=ophys_sessions, + suppress=suppress, + index_column=index_column) + if passed_only: + oet = self.get_ophys_experiment_table(passed_only=True) + for i in sessions.table.index: + sub_df = oet.query(f"ophys_session_id=={i}") + values = list(set(sub_df["ophys_container_id"].values)) + values.sort() + sessions.table.at[i, "ophys_container_id"] = values + + return sessions.table if as_df else sessions + + def get_ophys_experiment_table( + self, + suppress: Optional[List[str]] = None, + as_df=True, + passed_only=True) -> Union[pd.DataFrame, SessionsTable]: + """ + Return summary table of all ophys_experiment_ids in the database. + :param suppress: optional list of columns to drop from the resulting + dataframe. + :type suppress: list of str + :param as_df: whether to return as df or as SessionsTable + :param passed_only: if True, return only experiments flagged as + 'passed' and containers flagged as 'published' + (default=True) + :rtype: pd.DataFrame + """ + if isinstance(self.fetch_api, BehaviorProjectCloudApi): + return self.fetch_api.get_ophys_experiment_table() + if self.cache is not None: + path = self.cache.get_cache_path(None, + self.cache.OPHYS_EXPERIMENTS_KEY) + experiments = one_file_call_caching( + path, + self.fetch_api.get_ophys_experiment_table, + _write_json, + lambda path: _read_json(path, + index_name='ophys_experiment_id')) + else: + experiments = self.fetch_api.get_ophys_experiment_table() + + # Merge behavior data in + behavior_sessions_table = self.get_behavior_session_table( + suppress=suppress, as_df=True, include_ophys_data=False) + experiments = behavior_sessions_table.merge( + experiments, left_index=True, right_on='behavior_session_id', + suffixes=('_behavior', '_ophys')) + experiments = ExperimentsTable(df=experiments, + suppress=suppress, + passed_only=passed_only) + return experiments.table if as_df else experiments + + def get_ophys_cells_table(self) -> pd.DataFrame: + """ + Return summary table of all cells in this project cache + :rtype: pd.DataFrame + """ + if isinstance(self.fetch_api, BehaviorProjectCloudApi): + return self.fetch_api.get_ophys_cells_table() + if self.cache is not None: + path = self.cache.get_cache_path(None, + self.cache.OPHyS_CELLS_KEY) + ophys_cells_table = one_file_call_caching( + path, + self.fetch_api.get_ophys_cells_table, + _write_json, + lambda path: _read_json(path, + index_name='cell_roi_id')) + else: + ophys_cells_table = self.fetch_api.get_ophys_cells_table() + + return ophys_cells_table + + def get_behavior_session_table( + self, + suppress: Optional[List[str]] = None, + as_df=True, + include_ophys_data=True, + passed_only=True) -> Union[pd.DataFrame, SessionsTable]: + """ + Return summary table of all behavior_session_ids in the database. + :param suppress: optional list of columns to drop from the resulting + dataframe. + :param as_df: whether to return as df or as SessionsTable + :param include_ophys_data + Whether to include ophys data + :type suppress: list of str + :rtype: pd.DataFrame + """ + if isinstance(self.fetch_api, BehaviorProjectCloudApi): + return self.fetch_api.get_behavior_session_table() + if self.cache is not None: + path = self.cache.get_cache_path(None, + self.cache.BEHAVIOR_SESSIONS_KEY) + sessions = one_file_call_caching( + path, + self.fetch_api.get_behavior_session_table, + _write_json, + lambda path: _read_json(path, + index_name='behavior_session_id')) + else: + sessions = self.fetch_api.get_behavior_session_table() + + if include_ophys_data: + ophys_session_table = self.get_ophys_session_table( + suppress=suppress, + as_df=False, + include_behavior_data=False, + passed_only=passed_only) + else: + ophys_session_table = None + sessions = SessionsTable(df=sessions, suppress=suppress, + fetch_api=self.fetch_api, + ophys_session_table=ophys_session_table) + + return sessions.table if as_df else sessions + + def get_behavior_ophys_experiment(self, ophys_experiment_id: int, + fixed: bool = False): + """ + Note -- This method mocks the behavior of a cache. Future + development will include an NWB reader to read from + a true local cache (once nwb files are created). + TODO: Using `fixed` will raise a NotImplementedError since there + is no real cache. + """ + if fixed: + raise NotImplementedError + fetch_session = partial(self.fetch_api.get_behavior_ophys_experiment, + ophys_experiment_id) + return call_caching( + fetch_session, + lambda x: x, # not writing anything + lazy=False, # can't actually read from file cache + read=fetch_session + ) + + def get_behavior_session(self, behavior_session_id: int, + fixed: bool = False): + """ + Note -- This method mocks the behavior of a cache. Future + development will include an NWB reader to read from + a true local cache (once nwb files are created). + TODO: Using `fixed` will raise a NotImplementedError since there + is no real cache. + """ + if fixed: + raise NotImplementedError + + fetch_session = partial(self.fetch_api.get_behavior_session, + behavior_session_id) + return call_caching( + fetch_session, + lambda x: x, # not writing anything + lazy=False, # can't actually read from file cache + read=fetch_session + ) + + +def _write_json(path, df): + """Wrapper to change the arguments for saving a pandas json + dataframe so that it conforms to expectations of the internal + cache methods. Can't use partial with the native `to_json` method + because the dataframe is not yet created at the time we need to + pass in the save method. + Saves a dataframe in json format to `path`, in split orientation + to save space on disk. + Converts dates to seconds from epoch. + NOTE: Date serialization is a big pain. Make sure if columns + are being added, the _read_json is updated to properly deserialize + them back to the expected format by adding them to `convert_dates`. + In the future we could schematize this data using marshmallow + or something similar.""" + df.to_json(path, orient="split", date_unit="s", date_format="epoch") + + +def _read_json(path, index_name: Optional[str] = None): + """Reads a dataframe file written to the cache by _write_json.""" + df = pd.read_json(path, date_unit="s", orient="split", + convert_dates=["date_of_acquisition"]) + if index_name: + df = df.rename_axis(index=index_name) + return df diff --git a/brain_observatory/behavior/behavior_project_cache/external/__init__.py b/brain_observatory/behavior/behavior_project_cache/external/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/behavior_project_cache/external/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/external/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a73aa76203e7e6f055f5416804f5b140b9b8da57 GIT binary patch literal 235 zcmYL@JqiLb5QQUHh~PmibPGEX@uw9Vu?vJrGPrTqBqVWlOYh(fth|z~N3gSUwoo6u zZyv+UFpFNV%SeaY1)BP7@KuY#j2znp%{HvxTHje{+JC&S%Q4?Z43R?)dMM!pw&rsS z%2^E~j<$;2d9+axozLsYS4Q$^5)M450(MBdWl0md$YcOxg_Cr#g5*M-Nz9=#F8qS< m!R=8cp+M!B;W=TjP-a3HYmyK{Uq3pNgVV<nr_Hx7GW!51BuB^q literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/external/__pycache__/behavior_project_metadata_writer.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/external/__pycache__/behavior_project_metadata_writer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7994b3fa0fcf8e654161541f70f0b90e19002330 GIT binary patch literal 6722 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 aVIyi~3--pQWRW^!ORV~Dv^i(q(f<o?)I*v8 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py b/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py new file mode 100644 index 0000000000..c46379bdad --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py @@ -0,0 +1,220 @@ +import argparse +import json +import logging +import os +import warnings +from typing import List, Union + +import pandas as pd + +import allensdk +from allensdk.brain_observatory.behavior.behavior_project_cache import \ + VisualBehaviorOphysProjectCache + +######### +# These columns should be dropped from external-facing metadata +######### +SESSION_SUPPRESS = ( + 'donor_id', + 'foraging_id', + 'session_name', + 'specimen_id' +) +OPHYS_EXPERIMENTS_SUPPRESS = SESSION_SUPPRESS + ( + 'behavior_session_uuid', + 'published_at', + 'isi_experiment_id' +) +OPHYS_EXPERIMENTS_SUPPRESS_FINAL = [ + 'container_workflow_state', + 'experiment_workflow_state'] +######### + +OUTPUT_METADATA_FILENAMES = { + 'behavior_session_table': 'behavior_session_table.csv', + 'ophys_session_table': 'ophys_session_table.csv', + 'ophys_experiment_table': 'ophys_experiment_table.csv', + 'ophys_cells_table': 'ophys_cells_table.csv' +} + + +class BehaviorProjectMetadataWriter: + """Class to write project-level metadata to csv""" + + def __init__(self, behavior_project_cache: VisualBehaviorOphysProjectCache, + out_dir: str, project_name: str, + data_release_date: Union[str, List[str]], + overwrite_ok=False): + + self._behavior_project_cache = behavior_project_cache + self._out_dir = out_dir + self._project_name = project_name + self._data_release_date = data_release_date + self._overwrite_ok = overwrite_ok + self._logger = logging.getLogger(self.__class__.__name__) + + self._release_behavior_only_nwb = self._behavior_project_cache \ + .fetch_api.get_release_files(file_type='BehaviorNwb') + self._release_behavior_with_ophys_nwb = self._behavior_project_cache \ + .fetch_api.get_release_files(file_type='BehaviorOphysNwb') + + def write_metadata(self): + """Writes metadata to csv""" + os.makedirs(self._out_dir, exist_ok=True) + + self._write_behavior_sessions() + self._write_ophys_sessions() + self._write_ophys_experiments() + self._write_ophys_cells() + + self._write_manifest() + + def _write_behavior_sessions(self, suppress=SESSION_SUPPRESS, + output_filename=OUTPUT_METADATA_FILENAMES[ + 'behavior_session_table']): + behavior_sessions = self._behavior_project_cache. \ + get_behavior_session_table(suppress=suppress, + as_df=True) + + # Add release files + behavior_sessions = behavior_sessions \ + .merge(self._release_behavior_only_nwb, + left_index=True, + right_index=True, + how='left') + if "file_id" in behavior_sessions.columns: + if behavior_sessions["file_id"].isnull().values.any(): + msg = (f"{output_filename} field `file_id` contains missing " + "values and pandas.to_csv() converts it to float") + warnings.warn(msg) + self._write_metadata_table(df=behavior_sessions, + filename=output_filename) + + def _write_ophys_cells(self, + output_filename=OUTPUT_METADATA_FILENAMES[ + 'ophys_cells_table']): + ophys_cells = self._behavior_project_cache. \ + get_ophys_cells_table() + self._write_metadata_table(df=ophys_cells, + filename=output_filename) + + def _write_ophys_sessions(self, suppress=SESSION_SUPPRESS, + output_filename=OUTPUT_METADATA_FILENAMES[ + 'ophys_session_table' + ]): + ophys_sessions = self._behavior_project_cache. \ + get_ophys_session_table(suppress=suppress, as_df=True) + self._write_metadata_table(df=ophys_sessions, + filename=output_filename) + + def _write_ophys_experiments(self, suppress=OPHYS_EXPERIMENTS_SUPPRESS, + output_filename=OUTPUT_METADATA_FILENAMES[ + 'ophys_experiment_table' + ]): + ophys_experiments = \ + self._behavior_project_cache.get_ophys_experiment_table( + suppress=suppress, as_df=True) + + # Add release files + ophys_experiments = ophys_experiments.merge( + self._release_behavior_with_ophys_nwb + .drop('behavior_session_id', axis=1), + left_index=True, + right_index=True, + how='left') + + # users don't need to see these + ophys_experiments.drop( + labels=OPHYS_EXPERIMENTS_SUPPRESS_FINAL, + inplace=True, + axis=1) + + self._write_metadata_table(df=ophys_experiments, + filename=output_filename) + + def _write_metadata_table(self, df: pd.DataFrame, filename: str): + """ + Writes file to csv + + Parameters + ---------- + df + The dataframe to write + filename + Filename to save as + """ + filepath = os.path.join(self._out_dir, filename) + self._pre_file_write(filepath=filepath) + + self._logger.info(f'Writing {filepath}') + + df = df.reset_index() + df.to_csv(filepath, index=False) + + self._logger.info('Writing successful') + + def _write_manifest(self): + def get_abs_path(filename): + return os.path.abspath(os.path.join(self._out_dir, filename)) + + metadata_filenames = OUTPUT_METADATA_FILENAMES.values() + metadata_files = [get_abs_path(f) for f in metadata_filenames] + data_pipeline = [{ + 'name': 'AllenSDK', + 'version': allensdk.__version__, + 'comment': 'AllenSDK version used to produce data NWB and ' + 'metadata CSV files for this release' + }] + + manifest = { + 'metadata_files': metadata_files, + 'data_pipeline_metadata': data_pipeline, + 'project_name': self._project_name, + } + + save_path = os.path.join(self._out_dir, 'manifest.json') + self._pre_file_write(filepath=save_path) + + with open(save_path, 'w') as f: + f.write(json.dumps(manifest, indent=4)) + + def _pre_file_write(self, filepath: str): + """Checks if file exists at filepath. If so, and overwrite_ok is False, + raises an exception""" + if os.path.exists(filepath): + if self._overwrite_ok: + pass + else: + raise RuntimeError(f'{filepath} already exists. In order ' + f'to overwrite this file, pass the ' + f'--overwrite_ok flag') + + +def main(): + parser = argparse.ArgumentParser(description='Write project metadata to ' + 'csvs') + parser.add_argument('--out_dir', help='directory to save csvs', + required=True) + parser.add_argument('--project_name', help='project name', required=True) + parser.add_argument('--data_release_date', help='Project release date. ' + 'Ie 2021-03-25', + required=True, + nargs="+") + parser.add_argument('--overwrite_ok', help='Whether to allow overwriting ' + 'existing output files', + dest='overwrite_ok', action='store_true') + args = parser.parse_args() + + bpc = VisualBehaviorOphysProjectCache.from_lims( + data_release_date=args.data_release_date) + bpmw = BehaviorProjectMetadataWriter( + behavior_project_cache=bpc, + out_dir=args.out_dir, + project_name=args.project_name, + data_release_date=args.data_release_date, + overwrite_ok=args.overwrite_ok) + bpmw.write_metadata() + + +if __name__ == '__main__': + main() diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py new file mode 100644 index 0000000000..53b4621b76 --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py @@ -0,0 +1 @@ +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.abcs.behavior_project_base import BehaviorProjectBase # noqa: F401, E501 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b70703aaf2f411e1b9050af8dead894572a3a746 GIT binary patch literal 386 zcmZXOze)r#5XO_eMuY>wr`W=zuoDqoTM<EQjzF0F!Hu_@gk)XW(x<SpvhtO#wX(Le za`wDElpC0DzDe?tUp1fa6Rh^_8D4OHjLTF7nse-YfMSTD4Qc6uQeui*QqDf{l$3OJ zSlJqS7t&1%4_0>-WP4o}3k6MMeKt#`5;!k|$~N`Tg)}g=iENFGzhS9C*OpBiM3)&T zop&E9{3eZv?<CD|tmXUl@<iO>MHWzlVG5qW58}du4&K1Au)fbCMC8(_A=X0{S5ArS xI(rmBFX7%|c0<m0$oWLRHUG)^UvfT@b19v7os=vNtG&}Un8(JRQ6&DtCO;+de_#Lr literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/behavior_project_base.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/behavior_project_base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e83227e6140b8b3aef883ae6db080bc812af111e GIT binary patch literal 3376 zcmb_e&2Hm15SHXW*>V0C4YI%jJjU48X|X*SZP6s#76poQ(R43@0f7?fNW1zgNhh^$ z#qP1_6YQ<0_F4J_y7tsp=&3_Wq8&$0Qeb6^qNw2v=bLXhJl)*v8F0nF|APPO8phx9 zrMjBX`4Vpa0vcivGcsb+F=NZIO!;m_jkxJFRlgCn;<nRP{btmOZO2yqR@8NR-x#D# zI&Tfqq2`;0vq4%H#=!muv>F2|Z=9T-<y+X}f?;38R0Js*n7RF}pbUEvh5o@Q4e(W% zvhTBC#=rVGqb!VRBH+_@_346g9;V5;FV$9;cHvhTp@w4;!?9?CHff8P?<``G#@pr_ z(`mz4=ao&G?@ZDnZ8g?aay`-kIh%CV*v67vk8G&1zLMLdTZabegX|{RQsdhz<J)9M zjqi|MaDOk~uU7torLU+jPBEtd$9^h(bg6dI4N2Z+R7_doTcu<2X~KO5H<wNl6Lebm z5C(rxq8wpV8CXFLrJl5hM1TeI(?sAf;iv$f_fUC>6yXF%vpEG#JWMVlio7xmPt_U` zFCZW4Iin0S9HSZ!MkpkeLB=T0(u8oNY!u>X;qXG8m}PX0wnQw%n3Nl>b63lq{~_tt z<TRQv8!%&%`l|W&&$H3^C8vy!ae&Ft!`C>OjZYE`@DTiLOp_}<PBWTtA6n(#_`A>> z^H9)_GVH&`mlWnk5lE2N#~uSn-P8k(S6HNMc3dH+J8o7)-Sx2_(BtY2XCXhvp3iR! zdccoiHp`z}QsGwm+*Pdmk`am~-T5aK0hSmxymR)zWUvbuzT}p?<g<on^Opt5fEgJX zKF0!2Anp_inXl+N6afM(%E*;00U84*6M`6x=oMayA21IS&@nt$!GJYvfZ0WKnDi+> zkP9!otu!ig2k^0QxH*5i&f%JQGSxJSmBx@1{@<5pumRTO*+r2LcjgyxUK4U{eyz={ zngy@VES;{EI&FBQ602U>QeZ|aiB<Zi)s*qFig<0;1ntocwv{M9(Gly;kJd$Ob#eDn z^0&plS90>}I!;!4D@+tEVIL9!)qYJOZ%Y;v5(=m)IFkEg!BQ<&!Lw{mf4q~+kLzG@ z6`hYXIPLlHq2Lr#fzj<`8heyIjKq6DV)Q({PNEbONM%9eEW(1KNy;Q1D8W#4r0eNb zND&udJdLJ&h<*%0j^MwH8I<m+7FCty8gs-0P>;xzLH$rF8TC^}<XcIGTg9XBK(ZPN zd^iaq6vcYLAoppq2vfmgEq{Z!MGYLGlLWyQt<Di>7Sc$W#tBNY8JdK!S-~Q`nV^fh zcazk6HKbP2E3t7EHf{yo$2xlU`sme9y|=b=2-icRr9gUEw89wb7Q_Y40q-GNla*){ zv^h#rpp>#9O5OneVIn@%xgt*-98xevkQa(36`m^eD|iKr0vUsJ8WEIX&e5}h*7Oic z)bIfT(I)SQ4+?$Fhmqz(_kKRyoO(Xk&286Bpsu=Z-gALzWE#nS-*tb2Tr0k?2AIej zfG2B7u5QX#D<e)<mSwdCvMu?cEt?(L?8-(S8uON-KHHZAk7T1yL`6>)Ue<v|7G(Yy z8r!tsx6`%Ey_RL|$!EthKY*u_8}#!AoL-o$pT)}BP--CEl|AS4>V!1BbwV0e8?)}* xI@%})olpOlj&he#-aG9K&L5bwL%BNXR-M1O{aJzZ7xLi4B_ca!-;zJO@gK!l(~<xH literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py new file mode 100644 index 0000000000..7f701aa27a --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py @@ -0,0 +1,67 @@ +from abc import ABC, abstractmethod +from typing import Iterable + +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( + BehaviorOphysExperiment) +from allensdk.brain_observatory.behavior.behavior_session import ( + BehaviorSession) +import pandas as pd + + +class BehaviorProjectBase(ABC): + @abstractmethod + def get_behavior_ophys_experiment(self, ophys_experiment_id: int + ) -> BehaviorOphysExperiment: + """Returns a BehaviorOphysExperiment object that contains methods + to analyze a single behavior+ophys session. + :param ophys_experiment_id: id that corresponds to an ophys experiment + :type ophys_experiment_id: int + :rtype: BehaviorOphysExperiment + """ + pass + + @abstractmethod + def get_ophys_session_table(self) -> pd.DataFrame: + """Return a pd.Dataframe table with all ophys_session_ids and relevant + metadata.""" + pass + + @abstractmethod + def get_behavior_session( + self, behavior_session_id: int) -> BehaviorSession: + """Returns a BehaviorSession object that contains methods to + analyze a single behavior session. + :param behavior_session_id: id that corresponds to a behavior session + :type behavior_session_id: int + :rtype: BehaviorSession + """ + pass + + @abstractmethod + def get_behavior_session_table(self) -> pd.DataFrame: + """Returns a pd.DataFrame table with all behavior session_ids to the + user with additional metadata. + :rtype: pd.DataFrame + """ + pass + + @abstractmethod + def get_natural_movie_template(self, number: int) -> Iterable[bytes]: + """ Download a template for the natural movie stimulus. This is the + actual movie that was shown during the recording session. + :param number: identifier for this scene + :type number: int + :returns: An iterable yielding an npy file as bytes + """ + pass + + @abstractmethod + def get_natural_scene_template(self, number: int) -> Iterable[bytes]: + """Download a template for the natural scene stimulus. This is the + actual image that was shown during the recording session. + :param number: idenfifier for this movie (note that this is an int, + so to get the template for natural_movie_three should pass 3) + :type number: int + :returns: iterable yielding a tiff file as bytes + """ + pass diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py new file mode 100644 index 0000000000..929b6e69e1 --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py @@ -0,0 +1,2 @@ +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io.behavior_project_lims_api import BehaviorProjectLimsApi # noqa: F401, E501 +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io.behavior_project_cloud_api import BehaviorProjectCloudApi # noqa: F401, E501 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f9e67847083e860c45d1da086b921b242897fcf GIT binary patch literal 553 zcmcJNu};G<5Qgn01449#g%{{RGO!_pXv<h3B*YR~vM#no+&Z>pr$rfg6C@^HsVft& zz{I7b70?+=KL4jX-}ydyG8`TfT=nZS+)zT^J7>EFD6VnGQ#6uDYDi5BN;^F;gE}b^ z)X6;=r5~6<Ms$5VQ5CGT3wOcIm1t(Vj$^Mea`GoKHEt;}bUR854aO)N<svHsXv<w0 zRaimeLYtL+!JXj#yEGRdDwS<L@H%D^8sOUP=Nfzm$CS{`RLuXqpXjFBG)%DJ8wn{M z8}s=xy<iVGUt~~$%u09y+p@6*;jDynrtB&*=aGj%>wMKlHq#}Gx>08y!~z}_-tCFy qd&KfBv7Pu$EdNO??}_D{YpWa1GvBTcE^8;3MqS~DAh9EMM85#mL%ZYv literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_cloud_api.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_cloud_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8618cf2437a9a6e7766fe530a1df91d9b844b7f7 GIT binary patch literal 14644 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 Xj~|@#TPoK|jY>s-ae+4ft@-}}{8j^- literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_lims_api.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_lims_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f73e2af81cdd03e34056aa2d5cab2335f92f2e8 GIT binary patch literal 25588 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 a8vB59R}!YGd5cOJzG%ijUg2b0Ed4V#(QP3B literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py new file mode 100644 index 0000000000..0979334dbd --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py @@ -0,0 +1,402 @@ +import pandas as pd +from typing import Iterable, Union, List, Optional +from pathlib import Path +import logging +import ast +import semver + +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.abcs import BehaviorProjectBase # noqa: E501 +from allensdk.brain_observatory.behavior.behavior_session import ( + BehaviorSession) +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( + BehaviorOphysExperiment) +from allensdk.api.cloud_cache.cloud_cache import ( + S3CloudCache, LocalCache, StaticLocalCache) + + +# [min inclusive, max exclusive) +MANIFEST_COMPATIBILITY = ["1.0.0", "2.0.0"] + + +class BehaviorCloudCacheVersionException(Exception): + pass + + +def version_check(manifest_version: str, + data_pipeline_version: str, + cmin: str = MANIFEST_COMPATIBILITY[0], + cmax: str = MANIFEST_COMPATIBILITY[1]): + mver_parsed = semver.VersionInfo.parse(manifest_version) + cmin_parsed = semver.VersionInfo.parse(cmin) + cmax_parsed = semver.VersionInfo.parse(cmax) + if (mver_parsed < cmin_parsed) | (mver_parsed >= cmax_parsed): + estr = (f"the manifest has manifest_version {manifest_version} but " + "this version of AllenSDK is compatible only with manifest " + f"versions {cmin} <= X < {cmax}. \n" + "Consider using a version of AllenSDK closer to the version " + f"used to release the data: {data_pipeline_version}") + raise BehaviorCloudCacheVersionException(estr) + + +def literal_col_eval(df: pd.DataFrame, + columns: List[str] = ["ophys_experiment_id", + "ophys_container_id", + "driver_line"]) -> pd.DataFrame: + def converter(x): + if isinstance(x, str): + x = ast.literal_eval(x) + return x + + for column in columns: + if column in df.columns: + df.loc[df[column].notnull(), column] = \ + df[column][df[column].notnull()].apply(converter) + return df + + +class BehaviorProjectCloudApi(BehaviorProjectBase): + """API for downloading data released on S3 and returning tables. + + Parameters + ---------- + cache: S3CloudCache + an instantiated S3CloudCache object, which has already run + `self.load_manifest()` which populates the columns: + - metadata_file_names + - file_id_column + skip_version_check: bool + whether to skip the version checking of pipeline SDK version + vs. running SDK version, which may raise Exceptions. (default=False) + local: bool + Whether to operate in local mode, where no data will be downloaded + and instead will be loaded from local + """ + def __init__( + self, + cache: Union[S3CloudCache, LocalCache, StaticLocalCache], + skip_version_check: bool = False, + local: bool = False + ): + + self.cache = cache + self.skip_version_check = skip_version_check + self._local = local + self.load_manifest() + + def load_manifest(self, manifest_name: Optional[str] = None): + """ + Load the specified manifest file into the CloudCache + + Parameters + ---------- + manifest_name: Optional[str] + Name of manifest file to load. If None, load latest + (default: None) + """ + if manifest_name is None: + self.cache.load_last_manifest() + else: + self.cache.load_manifest(manifest_name) + + expected_metadata = set(["behavior_session_table", + "ophys_session_table", + "ophys_experiment_table", + "ophys_cells_table"]) + + if self.cache._manifest.metadata_file_names is None: + raise RuntimeError("S3CloudCache object has no metadata " + "file names. BehaviorProjectCloudApi " + "expects a S3CloudCache passed which " + "has already run load_manifest()") + cache_metadata = set(self.cache._manifest.metadata_file_names) + + if cache_metadata != expected_metadata: + raise RuntimeError("expected S3CloudCache object to have " + f"metadata file names: {expected_metadata} " + f"but it has {cache_metadata}") + + if not self.skip_version_check: + data_sdk_version = [i for i in self.cache._manifest._data_pipeline + if i['name'] == "AllenSDK"][0]["version"] + version_check(self.cache._manifest.version, data_sdk_version) + + # version_check(self.cache._manifest._data_pipeline) + self.logger = logging.getLogger("BehaviorProjectCloudApi") + self._get_ophys_session_table() + self._get_behavior_session_table() + self._get_ophys_experiment_table() + self._get_ophys_cells_table() + + @staticmethod + def from_s3_cache(cache_dir: Union[str, Path], + bucket_name: str, + project_name: str, + ui_class_name: str) -> "BehaviorProjectCloudApi": + """instantiates this object with a connection to an s3 bucket and/or + a local cache related to that bucket. + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + bucket_name: str + for example, if bucket URI is 's3://mybucket' this value should be + 'mybucket' + + project_name: str + the name of the project this cache is supposed to access. This + project name is the first part of the prefix of the release data + objects. I.e. s3://<bucket_name>/<project_name>/<object tree> + + ui_class_name: str + Name of user interface class (used to populate error messages) + + Returns + ------- + BehaviorProjectCloudApi instance + + """ + cache = S3CloudCache(cache_dir, + bucket_name, + project_name, + ui_class_name=ui_class_name) + return BehaviorProjectCloudApi(cache) + + @staticmethod + def from_local_cache( + cache_dir: Union[str, Path], + project_name: str, + ui_class_name: str, + use_static_cache: bool = False + ) -> "BehaviorProjectCloudApi": + """instantiates this object with a local cache. + + Parameters + ---------- + cache_dir: str or pathlib.Path + Path to the directory where data will be stored on the local system + + project_name: str + the name of the project this cache is supposed to access. This + project name is the first part of the prefix of the release data + objects. I.e. s3://<bucket_name>/<project_name>/<object tree> + + ui_class_name: str + Name of user interface class (used to populate error messages) + + Returns + ------- + BehaviorProjectCloudApi instance + + """ + if use_static_cache: + cache = StaticLocalCache( + cache_dir, + project_name, + ui_class_name=ui_class_name + ) + else: + cache = LocalCache( + cache_dir, + project_name, + ui_class_name=ui_class_name + ) + return BehaviorProjectCloudApi(cache, local=True) + + def get_behavior_session( + self, behavior_session_id: int) -> BehaviorSession: + """get a BehaviorSession by specifying behavior_session_id + + Parameters + ---------- + behavior_session_id: int + the id of the behavior_session + + Returns + ------- + BehaviorSession + + Notes + ----- + entries in the _behavior_session_table represent + (1) ophys_sessions which have a many-to-one mapping between nwb files + and behavior sessions. (file_id is NaN) + AND + (2) behavior only sessions, which have a one-to-one mapping with + nwb files. (file_id is not Nan) + In the case of (1) this method returns an object which is just behavior + data which is shared by all experiments in 1 session. This is extracted + from the nwb file for the first-listed ophys_experiment. + + """ + row = self._behavior_session_table.query( + f"behavior_session_id=={behavior_session_id}") + if row.shape[0] != 1: + raise RuntimeError("The behavior_session_table should have " + "1 and only 1 entry for a given " + "behavior_session_id. For " + f"{behavior_session_id} " + f" there are {row.shape[0]} entries.") + row = row.squeeze() + has_file_id = not pd.isna(row[self.cache.file_id_column]) + if not has_file_id: + oeid = row.ophys_experiment_id[0] + row = self._ophys_experiment_table.query(f"index=={oeid}") + file_id = str(int(row[self.cache.file_id_column])) + data_path = self._get_data_path(file_id=file_id) + return BehaviorSession.from_nwb_path(str(data_path)) + + def get_behavior_ophys_experiment(self, ophys_experiment_id: int + ) -> BehaviorOphysExperiment: + """get a BehaviorOphysExperiment by specifying ophys_experiment_id + + Parameters + ---------- + ophys_experiment_id: int + the id of the ophys_experiment + + Returns + ------- + BehaviorOphysExperiment + + """ + row = self._ophys_experiment_table.query( + f"index=={ophys_experiment_id}") + if row.shape[0] != 1: + raise RuntimeError("The behavior_ophys_experiment_table should " + "have 1 and only 1 entry for a given " + f"ophys_experiment_id. For " + f"{ophys_experiment_id} " + f" there are {row.shape[0]} entries.") + file_id = str(int(row[self.cache.file_id_column])) + data_path = self._get_data_path(file_id=file_id) + return BehaviorOphysExperiment.from_nwb_path( + str(data_path)) + + def _get_ophys_session_table(self): + session_table_path = self._get_metadata_path( + fname="ophys_session_table") + df = literal_col_eval(pd.read_csv(session_table_path)) + self._ophys_session_table = df.set_index("ophys_session_id") + + def get_ophys_session_table(self) -> pd.DataFrame: + """Return a pd.Dataframe table summarizing ophys_sessions + and associated metadata. + + Notes + ----- + - Each entry in this table represents the metadata of an ophys_session. + Link to nwb-hosted files in the cache is had via the + 'ophys_experiment_id' column (can be a list) + and experiment_table + """ + return self._ophys_session_table + + def _get_behavior_session_table(self): + session_table_path = self._get_metadata_path( + fname='behavior_session_table') + df = literal_col_eval(pd.read_csv(session_table_path)) + self._behavior_session_table = df.set_index("behavior_session_id") + + def get_behavior_session_table(self) -> pd.DataFrame: + """Return a pd.Dataframe table with both behavior-only + (BehaviorSession) and with-ophys (BehaviorOphysExperiment) + sessions as entries. + + Notes + ----- + - In the first case, provides a critical mapping of + behavior_session_id to file_id, which the cache uses to find the + nwb path in cache. + - In the second case, provides a critical mapping of + behavior_session_id to a list of ophys_experiment_id(s) + which can be used to find file_id mappings in ophys_experiment_table + see method get_behavior_session() + """ + return self._behavior_session_table + + def _get_ophys_experiment_table(self): + experiment_table_path = self._get_metadata_path( + fname="ophys_experiment_table") + df = literal_col_eval(pd.read_csv(experiment_table_path)) + self._ophys_experiment_table = df.set_index("ophys_experiment_id") + + def _get_ophys_cells_table(self): + ophys_cells_table_path = self._get_metadata_path( + fname="ophys_cells_table") + df = literal_col_eval(pd.read_csv(ophys_cells_table_path)) + # NaN's for invalid cells force this to float, push to int + df['cell_specimen_id'] = pd.array(df['cell_specimen_id'], + dtype="Int64") + self._ophys_cells_table = df.set_index("cell_roi_id") + + def get_ophys_cells_table(self): + return self._ophys_cells_table + + def get_ophys_experiment_table(self): + """returns a pd.DataFrame where each entry has a 1-to-1 + relation with an ophys experiment (i.e. imaging plane) + + Notes + ----- + - the file_id column allows the underlying cache to link + this table to a cache-hosted NWB file. There is a 1-to-1 + relation between nwb files and ophy experiments. See method + get_behavior_ophys_experiment() + """ + return self._ophys_experiment_table + + def get_natural_movie_template(self, number: int) -> Iterable[bytes]: + """ Download a template for the natural movie stimulus. This is the + actual movie that was shown during the recording session. + :param number: identifier for this scene + :type number: int + :returns: An iterable yielding an npy file as bytes + """ + raise NotImplementedError() + + def get_natural_scene_template(self, number: int) -> Iterable[bytes]: + """Download a template for the natural scene stimulus. This is the + actual image that was shown during the recording session. + :param number: idenfifier for this movie (note that this is an int, + so to get the template for natural_movie_three should pass 3) + :type number: int + :returns: iterable yielding a tiff file as bytes + """ + raise NotImplementedError() + + def _get_metadata_path(self, fname: str): + if self._local: + path = self._get_local_path(fname=fname) + else: + path = self.cache.download_metadata(fname=fname) + return path + + def _get_data_path(self, file_id: str): + if self._local: + data_path = self._get_local_path(file_id=file_id) + else: + data_path = self.cache.download_data(file_id=file_id) + return data_path + + def _get_local_path(self, fname: Optional[str] = None, file_id: + Optional[str] = None): + if fname is None and file_id is None: + raise ValueError('Must pass either fname or file_id') + + if fname is not None and file_id is not None: + raise ValueError('Must pass only one of fname or file_id') + + if fname is not None: + path = self.cache.metadata_path(fname=fname) + else: + path = self.cache.data_path(file_id=file_id) + + exists = path['exists'] + local_path = path['local_path'] + if not exists: + raise FileNotFoundError(f'You started a cache without a ' + f'connection to s3 and {local_path} is ' + 'not already on your system') + return local_path diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py new file mode 100644 index 0000000000..99b8b02e1b --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py @@ -0,0 +1,637 @@ +import pandas as pd +from typing import Optional, List, Dict, Any, Iterable, Union +import logging + +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.abcs import BehaviorProjectBase # noqa: E501 +from allensdk.brain_observatory.behavior.behavior_session import ( + BehaviorSession) +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( + BehaviorOphysExperiment) +from allensdk.internal.api import db_connection_creator +from allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine \ + import (HttpEngine) +from allensdk.core.typing import SupportsStr +from allensdk.core.authentication import DbCredentials +from allensdk.core.auth_config import ( + MTRAIN_DB_CREDENTIAL_MAP, LIMS_DB_CREDENTIAL_MAP) + + +class BehaviorProjectLimsApi(BehaviorProjectBase): + def __init__(self, lims_engine, mtrain_engine, app_engine, + data_release_date: Optional[Union[str, List[str]]] = None): + """ Downloads visual behavior data from the Allen Institute's + internal Laboratory Information Management System (LIMS). Only + functional if connected to the Allen Institute Network. Used to load + data into BehaviorProjectCache. + + Typically want to construct an instance of this class by calling + `BehaviorProjectLimsApi.default()`. + + Set log level to debug to see SQL queries dumped by + "BehaviorProjectLimsApi" logger. + + Note -- Currently the app engine is unused because we aren't yet + supporting the download of stimulus templates for visual behavior + data. This feature will be added at a later date. + + Parameters + ---------- + lims_engine : + used for making queries against the LIMS postgres database. Must + implement: + select : takes a postgres query as a string. Returns a pandas + dataframe of results + fetchall : takes a postgres query as a string. If there is + exactly one column in the response, return the values as a + list. + mtrain_engine : + used for making queries against the mtrain postgres database. Must + implement: + select : takes a postgres query as a string. Returns a pandas + dataframe of results + fetchall : takes a postgres query as a string. If there is + exactly one column in the response, return the values as a + list. + app_engine : + used for making queries agains the lims web application. Must + implement: + stream : takes a url as a string. Returns an iterable yielding + the response body as bytes. + data_release_date: str or list of str + Use to filter tables to only include data released on date + ie 2021-03-25 or ['2021-03-25', '2021-08-12'] + """ + self.lims_engine = lims_engine + self.mtrain_engine = mtrain_engine + self.app_engine = app_engine + self.data_release_date = data_release_date + self.logger = logging.getLogger("BehaviorProjectLimsApi") + + @classmethod + def default( + cls, + lims_credentials: Optional[DbCredentials] = None, + mtrain_credentials: Optional[DbCredentials] = None, + app_kwargs: Optional[Dict[str, Any]] = None, + data_release_date: Optional[Union[str, List[str]]] = None) -> \ + "BehaviorProjectLimsApi": + """Construct a BehaviorProjectLimsApi instance with default + postgres and app engines. + + Parameters + ---------- + lims_credentials: Optional[DbCredentials] + Credentials to pass to the postgres connector to the lims database. + If left unspecified, will check environment variables for the + appropriate values. + mtrain_credentials: Optional[DbCredentials] + Credentials to pass to the postgres connector to the mtrain + database. If left unspecified, will check environment variables + for the appropriate values. + data_release_date: Optional[Union[str, List[str]] + Filters tables to include only data released on date + ie 2021-03-25 or ['2021-03-25', '2021-08-12'] + app_kwargs: Dict + Dict of arguments to pass to the app engine. Currently unused. + + Returns + ------- + BehaviorProjectLimsApi + """ + + _app_kwargs = {"scheme": "http", "host": "lims2"} + if app_kwargs: + _app_kwargs.update(app_kwargs) + + lims_engine = db_connection_creator( + credentials=lims_credentials, + fallback_credentials=LIMS_DB_CREDENTIAL_MAP) + mtrain_engine = db_connection_creator( + credentials=mtrain_credentials, + fallback_credentials=MTRAIN_DB_CREDENTIAL_MAP) + + app_engine = HttpEngine(**_app_kwargs) + return cls(lims_engine, mtrain_engine, app_engine, + data_release_date=data_release_date) + + @staticmethod + def _build_in_list_selector_query( + col, + valid_list: Optional[SupportsStr] = None, + operator: str = "WHERE") -> str: + """ + Filter for rows where the value of a column is contained in a list. + If no list is specified in `valid_list`, return an empty string. + + NOTE: if string ids are used, then the strings in `valid_list` must + be enclosed in single quotes, or else the query will throw a column + does not exist error. E.g. ["'mystringid1'", "'mystringid2'"...] + + :param col: name of column to compare if in a list + :type col: str + :param valid_list: iterable of values that can be mapped to str + (e.g. string, int, float). + :type valid_list: list + :param operator: SQL operator to start the clause. Default="WHERE". + Valid inputs: "AND", "OR", "WHERE" (not case-sensitive). + :type operator: str + """ + if not valid_list: + return "" + session_query = ( + f"""{operator} {col} IN ({",".join( + sorted(set(map(str, valid_list))))})""") + return session_query + + def _build_experiment_from_session_query(self) -> str: + """Aggregate sql sub-query to get all ophys_experiment_ids associated + with a single ophys_session_id.""" + if self.data_release_date: + release_filter = self._get_ophys_experiment_release_filter() + else: + release_filter = '' + query = f""" + -- -- begin getting all ophys_experiment_ids -- -- + SELECT + (ARRAY_AGG(DISTINCT(oe.id))) AS experiment_ids, os.id + FROM ophys_sessions os + RIGHT JOIN ophys_experiments oe ON oe.ophys_session_id = os.id + {release_filter} + GROUP BY os.id + -- -- end getting all ophys_experiment_ids -- -- + """ + return query + + def _build_container_from_session_query(self) -> str: + """Aggregate sql sub-query to get all ophys_container_ids associated + with a single ophys_session_id.""" + if self.data_release_date: + release_filter = self._get_ophys_experiment_release_filter() + else: + release_filter = '' + query = f""" + -- -- begin getting all ophys_container_ids -- -- + SELECT + (ARRAY_AGG( + DISTINCT(oec.visual_behavior_experiment_container_id)) + ) AS container_ids, os.id + FROM ophys_experiments_visual_behavior_experiment_containers oec + JOIN visual_behavior_experiment_containers vbc + ON oec.visual_behavior_experiment_container_id = vbc.id + JOIN ophys_experiments oe ON oe.id = oec.ophys_experiment_id + JOIN ophys_sessions os ON os.id = oe.ophys_session_id + {release_filter} + GROUP BY os.id + -- -- end getting all ophys_container_ids -- -- + """ + return query + + @staticmethod + def _build_line_from_donor_query(line="driver") -> str: + """Sub-query to get a line from a donor. + :param line: 'driver' or 'reporter' + """ + query = f""" + -- -- begin getting {line} line from donors -- -- + SELECT ARRAY_AGG (g.name) AS {line}_line, d.id AS donor_id + FROM donors d + LEFT JOIN donors_genotypes dg ON dg.donor_id=d.id + LEFT JOIN genotypes g ON g.id=dg.genotype_id + LEFT JOIN genotype_types gt ON gt.id=g.genotype_type_id + WHERE gt.name='{line}' + GROUP BY d.id + -- -- end getting {line} line from donors -- -- + """ + return query + + def _get_behavior_summary_table(self) -> pd.DataFrame: + """Build and execute query to retrieve summary data for all data, + or a subset of session_ids (via the session_sub_query). + Should pass an empty string to `session_sub_query` if want to get + all data in the database. + :rtype: pd.DataFrame + """ + query = f""" + SELECT + bs.id AS behavior_session_id, + equipment.name as equipment_name, + bs.date_of_acquisition, + d.id as donor_id, + d.full_genotype, + d.external_donor_name AS mouse_id, + reporter.reporter_line, + driver.driver_line, + g.name AS sex, + DATE_PART('day', bs.date_of_acquisition - d.date_of_birth) + AS age_in_days, + bs.foraging_id + FROM behavior_sessions bs + JOIN donors d on bs.donor_id = d.id + JOIN genders g on g.id = d.gender_id + LEFT OUTER JOIN ( + {self._build_line_from_donor_query("reporter")} + ) reporter on reporter.donor_id = d.id + LEFT OUTER JOIN ( + {self._build_line_from_donor_query("driver")} + ) driver on driver.donor_id = d.id + LEFT OUTER JOIN equipment ON equipment.id = bs.equipment_id + """ + + if self.data_release_date is not None: + query += self._get_behavior_session_release_filter() + + self.logger.debug(f"get_behavior_session_table query: \n{query}") + return self.lims_engine.select(query) + + def _get_foraging_ids_from_behavior_session( + self, behavior_session_ids: List[int]) -> List[str]: + behav_ids = self._build_in_list_selector_query("id", + behavior_session_ids, + operator="AND") + forag_ids_query = f""" + SELECT foraging_id + FROM behavior_sessions + WHERE foraging_id IS NOT NULL + {behav_ids}; + """ + self.logger.debug("get_foraging_ids_from_behavior_session query: \n" + f"{forag_ids_query}") + foraging_ids = self.lims_engine.fetchall(forag_ids_query) + + self.logger.debug(f"Retrieved {len(foraging_ids)} foraging ids for" + f" behavior stage query. Ids = {foraging_ids}") + return foraging_ids + + def _get_behavior_stage_table( + self, + behavior_session_ids: Optional[List[int]] = None): + # Select fewer rows if possible via behavior_session_id + if behavior_session_ids: + foraging_ids = self._get_foraging_ids_from_behavior_session( + behavior_session_ids) + foraging_ids = [f"'{fid}'" for fid in foraging_ids] + # Otherwise just get the full table from mtrain + else: + foraging_ids = None + + foraging_ids_query = self._build_in_list_selector_query( + "bs.id", foraging_ids) + + query = f""" + SELECT + stages.name as session_type, + bs.id AS foraging_id + FROM behavior_sessions bs + JOIN stages ON stages.id = bs.state_id + {foraging_ids_query}; + """ + self.logger.debug(f"_get_behavior_stage_table query: \n {query}") + return self.mtrain_engine.select(query) + + def get_behavior_stage_parameters(self, + foraging_ids: List[str]) -> pd.Series: + """Gets the stage parameters for each foraging id from mtrain + + Parameters + ---------- + foraging_ids + List of foraging ids + + + Returns + --------- + Series with index of foraging id and values stage parameters + """ + foraging_ids_query = self._build_in_list_selector_query( + "bs.id", foraging_ids) + + query = f""" + SELECT + bs.id AS foraging_id, + stages.parameters as stage_parameters + FROM behavior_sessions bs + JOIN stages ON stages.id = bs.state_id + {foraging_ids_query}; + """ + df = self.mtrain_engine.select(query) + df = df.set_index('foraging_id') + return df['stage_parameters'] + + def get_behavior_ophys_experiment(self, ophys_experiment_id: int + ) -> BehaviorOphysExperiment: + """Returns a BehaviorOphysExperiment object that contains methods + to analyze a single behavior+ophys session. + :param ophys_experiment_id: id that corresponds to an ophys experiment + :type ophys_experiment_id: int + :rtype: BehaviorOphysExperiment + """ + return BehaviorOphysExperiment.from_lims( + ophys_experiment_id=ophys_experiment_id) + + def _get_ophys_experiment_table(self) -> pd.DataFrame: + """ + Helper function for easier testing. + Return a pd.Dataframe table with all ophys_experiment_ids and relevant + metadata. + Return columns: ophys_session_id, behavior_session_id, + ophys_experiment_id, project_code, session_name, + session_type, equipment_name, date_of_acquisition, + specimen_id, full_genotype, sex, age_in_days, + reporter_line, driver_line, mouse_id + + :rtype: pd.DataFrame + """ + query = """ + SELECT + oe.id as ophys_experiment_id, + os.id as ophys_session_id, + os.stimulus_name as session_type, + bs.id as behavior_session_id, + oec.visual_behavior_experiment_container_id as + ophys_container_id, + pr.code as project_code, + vbc.workflow_state as container_workflow_state, + oe.workflow_state as experiment_workflow_state, + os.name as session_name, + os.date_of_acquisition, + os.isi_experiment_id, + id.depth as imaging_depth, + st.acronym as targeted_structure, + vbc.published_at + FROM ophys_experiments_visual_behavior_experiment_containers oec + JOIN visual_behavior_experiment_containers vbc + ON oec.visual_behavior_experiment_container_id = vbc.id + JOIN ophys_experiments oe ON oe.id = oec.ophys_experiment_id + JOIN ophys_sessions os ON os.id = oe.ophys_session_id + JOIN behavior_sessions bs ON os.id = bs.ophys_session_id + LEFT OUTER JOIN projects pr ON pr.id = os.project_id + LEFT JOIN imaging_depths id ON id.id = oe.imaging_depth_id + JOIN structures st ON st.id = oe.targeted_structure_id + """ + + if self.data_release_date is not None: + query += self._get_ophys_experiment_release_filter() + + self.logger.debug(f"get_ophys_experiment_table query: \n{query}") + return self.lims_engine.select(query) + + def _get_ophys_cells_table(self): + """ + Helper function for easier testing. + Return a pd.Dataframe table with all cell_roi_id and associated + cell_specimen_id and ophys_experiment_id + metadata. + Return columns: ophys_experiment_id, + cell_roi_id, + cell_specimen_id + + :rtype: pd.DataFrame + """ + query = """ + SELECT + cr.id as cell_roi_id, + cr.cell_specimen_id, + cr.ophys_experiment_id + FROM cell_rois AS cr + JOIN ophys_cell_segmentation_runs AS ocsr + ON ocsr.id=cr.ophys_cell_segmentation_run_id + JOIN ophys_experiments AS oe + ON oe.id=cr.ophys_experiment_id + """ + if self.data_release_date is not None: + query += self._get_ophys_experiment_release_filter() + query += "\nAND cr.valid_roi = True" + else: + query += "\nWHERE cr.valid_roi = True" + query += "\nAND ocsr.current=True" + + self.logger.debug(f"get_ophys_experiment_table query: \n{query}") + df = self.lims_engine.select(query) + + # NaN's for invalid cells force this to float, push to int + df['cell_specimen_id'] = pd.array(df['cell_specimen_id'], + dtype="Int64") + return df + + def get_ophys_cells_table(self): + df = self._get_ophys_cells_table() + df = df.set_index("cell_roi_id") + return df + + def _get_ophys_session_table(self) -> pd.DataFrame: + """Helper function for easier testing. + Return a pd.Dataframe table with all ophys_session_ids and relevant + metadata. + Return columns: ophys_session_id, behavior_session_id, + ophys_experiment_id, project_code, session_name, + session_type, equipment_name, date_of_acquisition, + specimen_id, full_genotype, sex, age_in_days, + reporter_line, driver_line, mouse_id + + :rtype: pd.DataFrame + """ + query = f""" + SELECT + os.id as ophys_session_id, + bs.id as behavior_session_id, + exp_ids.experiment_ids as ophys_experiment_id, + cntr_ids.container_ids as ophys_container_id, + pr.code as project_code, + os.name as session_name, + os.date_of_acquisition, + os.specimen_id, + os.stimulus_name as session_type + FROM ophys_sessions os + JOIN behavior_sessions bs ON os.id = bs.ophys_session_id + LEFT OUTER JOIN projects pr ON pr.id = os.project_id + JOIN ( + {self._build_experiment_from_session_query()} + ) exp_ids ON os.id = exp_ids.id + JOIN ( + {self._build_container_from_session_query()} + ) cntr_ids ON os.id = cntr_ids.id + """ + + if self.data_release_date is not None: + query += self._get_ophys_session_release_filter() + self.logger.debug(f"get_ophys_session_table query: \n{query}") + return self.lims_engine.select(query) + + def get_ophys_session_table(self) -> pd.DataFrame: + """Return a pd.Dataframe table with all ophys_session_ids and relevant + metadata. + Return columns: ophys_session_id, behavior_session_id, + ophys_experiment_id, project_code, session_name, + session_type, equipment_name, date_of_acquisition, + specimen_id, full_genotype, sex, age_in_days, + reporter_line, driver_line + :rtype: pd.DataFrame + """ + # There is one ophys_session_id from 2018 that has multiple behavior + # ids, causing duplicates -- drop all dupes for now; # TODO + table = (self._get_ophys_session_table() + .drop_duplicates(subset=["ophys_session_id"], keep=False) + .set_index("ophys_session_id")) + return table + + def get_behavior_session( + self, behavior_session_id: int) -> BehaviorSession: + """Returns a BehaviorSession object that contains methods to + analyze a single behavior session. + :param behavior_session_id: id that corresponds to a behavior session + :type behavior_session_id: int + :rtype: BehaviorSession + """ + return BehaviorSession.from_lims( + behavior_session_id=behavior_session_id) + + def get_ophys_experiment_table( + self, + ophys_experiment_ids: Optional[List[int]] = None) -> pd.DataFrame: + """Return a pd.Dataframe table with all ophys_experiment_ids and + relevant metadata. This is the most specific and most informative + level to examine the data. + Return columns: + ophys_experiment_id, ophys_session_id, behavior_session_id, + ophys_container_id, project_code, container_workflow_state, + experiment_workflow_state, session_name, session_type, + equipment_name, date_of_acquisition, isi_experiment_id, + specimen_id, sex, age_in_days, full_genotype, reporter_line, + driver_line, imaging_depth, targeted_structure, published_at + :param ophys_experiment_ids: optional list of ophys_experiment_ids + to include + :rtype: pd.DataFrame + """ + df = self._get_ophys_experiment_table() + return df.set_index("ophys_experiment_id") + + def get_behavior_session_table(self) -> pd.DataFrame: + """Returns a pd.DataFrame table with all behavior session_ids to the + user with additional metadata. + + Can't return age at time of session because there is no field for + acquisition date for behavior sessions (only in the stimulus pkl file) + :rtype: pd.DataFrame + """ + summary_tbl = self._get_behavior_summary_table() + stimulus_names = self._get_behavior_stage_table( + behavior_session_ids=summary_tbl.index.tolist()) + return (summary_tbl.merge(stimulus_names, + on=["foraging_id"], how="left") + .set_index("behavior_session_id")) + + def get_release_files(self, file_type='BehaviorNwb') -> pd.DataFrame: + """Gets the release nwb files. + + Parameters + ---------- + file_type + NWB files to return ('BehaviorNwb', 'BehaviorOphysNwb') + + Returns + --------- + Dataframe of release files and file metadata + -index of behavior_session_id or ophys_experiment_id + -columns file_id and isilon filepath + """ + if self.data_release_date is None: + raise RuntimeError('data_release_date must be set in constructor') + + if file_type not in ('BehaviorNwb', 'BehaviorOphysNwb'): + raise ValueError(f'cannot retrieve file type {file_type}') + + if file_type == 'BehaviorNwb': + attachable_id_alias = 'behavior_session_id' + select_clause = f''' + SELECT attachable_id as {attachable_id_alias}, id as file_id, + filename, storage_directory + ''' + join_clause = '' + else: + attachable_id_alias = 'ophys_experiment_id' + select_clause = f''' + SELECT attachable_id as {attachable_id_alias}, + bs.id as behavior_session_id, wkf.id as file_id, + filename, wkf.storage_directory + ''' + join_clause = """ + JOIN ophys_experiments oe ON oe.id = attachable_id + JOIN ophys_sessions os ON os.id = oe.ophys_session_id + JOIN behavior_sessions bs on bs.ophys_session_id = os.id + """ + + if isinstance(self.data_release_date, str): + release_date_list = [self.data_release_date] + else: + release_date_list = self.data_release_date + release_date_str = ",".join([f"'{i}'" for i in release_date_list]) + + query = f''' + {select_clause} + FROM well_known_files wkf + {join_clause} + WHERE published_at IN ({release_date_str}) AND + well_known_file_type_id IN ( + SELECT id + FROM well_known_file_types + WHERE name = '{file_type}' + ); + ''' + + res = self.lims_engine.select(query) + res['isilon_filepath'] = res['storage_directory'] \ + .str.cat(res['filename']) + res = res.drop(['filename', 'storage_directory'], axis=1) + return res.set_index(attachable_id_alias) + + def _get_behavior_session_release_filter(self): + # 1) Get release behavior only session ids + behavior_only_release_files = self.get_release_files( + file_type='BehaviorNwb') + release_behavior_only_session_ids = \ + behavior_only_release_files.index.tolist() + + # 2) Get release behavior with ophys session ids + ophys_release_files = self.get_release_files( + file_type='BehaviorOphysNwb') + release_behavior_with_ophys_session_ids = \ + ophys_release_files['behavior_session_id'].tolist() + + # 3) release behavior session ids is combination + release_behavior_session_ids = \ + release_behavior_only_session_ids + \ + release_behavior_with_ophys_session_ids + + return self._build_in_list_selector_query( + "bs.id", release_behavior_session_ids) + + def _get_ophys_session_release_filter(self): + release_files = self.get_release_files( + file_type='BehaviorOphysNwb') + return self._build_in_list_selector_query( + "bs.id", release_files['behavior_session_id'].tolist()) + + def _get_ophys_experiment_release_filter(self): + release_files = self.get_release_files( + file_type='BehaviorOphysNwb') + return self._build_in_list_selector_query( + "oe.id", release_files.index.tolist()) + + def get_natural_movie_template(self, number: int) -> Iterable[bytes]: + """ Download a template for the natural movie stimulus. This is the + actual movie that was shown during the recording session. + :param number: identifier for this scene + :type number: int + :returns: An iterable yielding an npy file as bytes + """ + raise NotImplementedError() + + def get_natural_scene_template(self, number: int) -> Iterable[bytes]: + """Download a template for the natural scene stimulus. This is the + actual image that was shown during the recording session. + :param number: idenfifier for this movie (note that this is an int, + so to get the template for natural_movie_three should pass 3) + :type number: int + :returns: iterable yielding a tiff file as bytes + """ + raise NotImplementedError() diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__init__.py b/brain_observatory/behavior/behavior_project_cache/tables/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c6abad52b3cea2622934254212d0a59d243e50f GIT binary patch literal 233 zcmYL@JqiLb5QVc~A%X|7aJR4%5r0~-5xYQ`B!e4WlaR!fExm$Qu<}Z_9>LDa*+PBr zzIhBY!z}v!9wQxZ7ijCV#a9`H898<cnr+x1Ti;n|+kd>T%Q4?Z43R?#I+t(;+wi#s z<*bGgM_WhkJld#;&X-N(D<gR{35Ook0d`2cRYeo}P{;tr3Mc7e4atS3kXS-(T=)gy kgWID@LV+r=NFXbWg%HM?Bt-6;M|W~``c&bx{q;p=AC1ID-T(jq literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/experiments_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/experiments_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94061e4bfbcd6e46ff4ee4b7fbe99221bc8a15a3 GIT binary patch literal 2549 zcmbtWPj4JG6t`#g&t$U+DHNn~K&}u<7Bw5B-Xe;CLQzqhRwBJjw;1o(+nsb~Jhi<^ zca;ljuY3YHwBp2f;FHXi6JLQ7?|FA8NfYJLiN<4lp5MIpd%ySFe7m;RA#mk?{wktX zLjJ+U@@m55Yq)I;gCvq>B&RXWgE*kL4ze(Az%$I6c`I)Dy++o~qd4;OX10=d;!eIA zujbvjOUVyJwq*Mik!=;J*2_k`CWD_yFZvh!lU`6o4@#HnLS$9rUTWQ5k5-)r<#=lE zr!Ue1R^5k2AE?Cbi(#gEVYMZs<myGKOsa}R@k|}6j61#9%T?jHL)+?ev@C_S>7nAI zOgu#^jlR#@UPs$B7f%(p3LKnwmterltA^<g>?jgbN#a1#IFxIuanMvP1?gTR*N9q? zjXy%!l&x3IxFg##dPU+@xgtC8?8;Tyh36cS^=jjLpBAQIeY&$>Zf6ib8)?I=(<UvR zGEqpDiy|#2nQ*vK&hgpyKrkts=rFj1V{WY2P>sc5s?D}foXvs5FEDSvw-1m8a#Tfj zQkF(pTdg8wN^)If)1<M;7@wH*ZMf|X7>>hZ!il2?!7(|e$B_JQAtf$+4eK|Ql4J6^ z@rD2=u-c(`L<#X>VQ3G95xH{8*m`TbzUnPG+GVBee+LQOLHqgzy4b%gwYQ<b1IzSw z*^+RNk#CQ!Gf$qJah>RFk{6aa&7{#K8yTH5&nUJf)ksV-cWX}<s#l*n1=ubdYMs?@ z@XPG(i0zw+y1@`pW|W(l;#46lI~r?yHa&O^{PtWv(&pJH(?{Go;S@`)cUFI)7Z~hj z1C31fdd;fq8NVo>!ID)G=V_5T&J9+v+8CwKZX9TnK)HcIy++lrDjS_RGF>qIi<m3$ z`0w}IyMsp-iZu{pA^SsdB#P<an?fYIkmBY*6^C}9OI6qeMo+WBy>vLRsZ-mfNS;Ac z!PzVW3;AqkXhd3YJp_-30ysV0SyHr~U~Jg(JQ2xQ?Rf0%&IxtxyuthB)T~2<AHr=T z7|42yZqN>$U3<Hc`b!8B;Gw_piMJ;-;vy*!HJJTfBYW2|k+=y2K1I|^4Pb$+_-4e; zvcO4pPEJx;I{*UZqC_6$+9>EoQ2+%L1Kb>7pv(<sH9JyF>SEI|fE8L+*T+?s=1?i9 zxtx?)n)vD$zyeS`%k;>%cUnmGqCT?cE7qfC0}}G{`S3n0s}0D&Evn9k!m2IUwE+yI zHM@QevA3-+L5=`&^wMvCblMw8Z93QdFX{;BZ1d6xPR^W(BLoM&f<MB<f#@92mlTAF zI*_4y4pOz8!>nQM;QDn_(l_3Au?prZiP?mEvrkX>#?SWPty`P(j^CVpR@d?Zo5?Us z?O4gpUdyx~zBuG^WZEz@$X2rkL)CmfQD%B^$;^9TaT9Kf{Ycij6#jx1U8fh+>s(g{ zpzZ6}`~?t|^QyynuH_`dd6)C&!0g4FHs?|&upN{#Ua1AwAU6y`T!kQ$RRg8XcbxeE z-(1B3Lp;SaR1AZ3Gb=FQ#K#^5jeyWku0&B3`Zo|+%S}sApOde|trC9Rgf$<-vH1Q{ zG5Y5eqrX&)dU94V`g6tT&zm#He<Zy0#Sh-y=Te&dC%nGKKfk-ziA%Ho3E>t3$8p<w h?wq0x0(%kSRrKY&zF(oPS^QPl2%?}HcEhXf{{bz+)fE5$ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_mixin.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_mixin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23a3d8897993d9cf71bc324a797c02f7b821a49c GIT binary patch literal 823 zcmZuvJ8u&~5Z>K8JH|>7N<bnK#T7IzunRgAA%_$+;1q~vb<(i6vyRU`-(GIdCXQ$j zX({;yRQ#oDsi^6wm_0w_A|rh>v-8}U-8V-^T}Cwj`Be=A#(w+5mgvle1b0mAEklO< zj_^%LhT;S31)A(T5~K|Y?kO?DBu6F%av7k&;Eu@<L&|B@-OFOKa_`fdG{1d*9?iWH z=}b8njcplO?~RJmPK~Z2RF%@43VQM~BwP?25<~ulP1&qnenPR;yhL%z8X255a>|jT zxDps*>pMll+S}el9qghy*xrvqMmK&ilF#TG2J9G=zFwp*tx}sqVkT;t+ESk0=WWK2 zC-=Di_%V81hUzAD^4J;Ye7R~>Pzyi2Jlwa*C;O*e*Pf68;Fz{r+M>tn(3x!fi<N#q z|9)J&ia$D2x>!vV_7nA4<*WESSK8*NUdAS0y4V&bcba(9G=7&RF->M(6iUz3m7&}$ zqX?W0l2WBP*n}!BRb|W7U_1Lxfz5+~R(fIvl}a+>22EvXUbtVZ>JC7frxk$zSne?~ zCc3;EKH_aI_`{97J-OU{kp4DfL?4IJb2T>rbr)c6agllb5a4>DvW@2e0Idcn+f=++ n#vW^Vo8P{N^PB4MkT;f5Z!Pzty}$G+b?0o|?X}PQOJM&2=)K@~ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_sessions_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_sessions_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b457da35d01b9fc93d265a3cf9134783513afef GIT binary patch literal 2150 zcmbtVPj4eN6t`z4nMs;1T^1@8BxGq<sz%zTAULhi3bqIY>ZU8Ta2N%7ow3tQI{&aI z*(S;bu~$9;f0T+7UumwK_zGO$*^^8gXir%3v*+1<e(&e^d-H62yN#eFzkSbK7ok7& z$GSCO@(Fa+1Hlo;F$(l(#W=A7E3pF`S9&LCfZmRqi5s{^=fqyp3R)O_fp~*AUnAZW zE#dy)1Z|E_k?;NqHc`*FO7A2uqAX=`=^RI@@NwBb$wxEwJi3fh`0Bin*;s_d85_hR z)Th?1_U|cZ1PU-mfyHrP^DW_w8=@&(;q9S4Bs}i?Y#TosL5sWGdyT-47H`A2#Vzos zQ@-;|jMy~Fq`Cc6C<R_AbL;%uqnIg0hM6R)$YhkB6P9w4ur$giF)OqpuiQL{#Z<(E zvx2n=G**yeB*<W8{2<e@5mlKdW^=FHF<QFP(un(ZY4Ks{sY#wo*jsj@l#5FmX7MCR zLuUnn9yJO_(A7sE3be!vG`7a}6^ztb*dQB4bL=kA0xtlaAK}dkZwcR57+y-pZqNTV zu4;E*Fv${82&rn-LEUN<AJ$WS=<Ln_|BZ&;y^d+aL=~7KMMk*Hax#=zLJIxl^|qS` z)JkpeR0zU_3T0$6i9{(`zvU`-j#xMn-E&dY5O13HE$IPzvIU~&w@Nq8&d=dd%NCqD zhPjYsi_%bM0i~r!X$mO8%%yrKtZvhr?n(V9dRvr61*KBIlkb#{67lf*CaJ0SJCYAz z`0LlBC;hJ#;NE8=#=8Udilwvurzs1wl(P@}BAu#!mWxz{AWgpXkE20fMTI!XS$M(D z1)Pmz*ugIj2a-i8%?4m`${=NDhwBWiCv=suG}P!E8bs9LMkXq1wB39r?}L*&(3J)X z-P^%Uyo2Wt*Fc}>wB8_1cO89*^$BQtw4j@8?Z9M#mgox996=W19+3SJz1twA;xdmj zE_^KCgwqDMO1uT1<!+v-0%8h*FO+c}Rb}NNtSNmhvgRM$ZM}Q@=?&*=s(l64fM!q< zFD%(fpP0D?^Y>wfm(~?p+T6OrOGitfAWnB-rLk;sAmkYRgt+qyP;?b~qbH&EqToRV zK7=V`l!&x|N-*F1GM%zG;soSGm>TqQFnjr!?9ZqBk4X+GDY)j%t+AQRKhr$wl5dQe zaFj&=QEiAYDaigUH}9Jow_3R_P5WKnl{ymwoAP0>1?35NWwJkTS1%N_YMp!owwCTI zCQ~5P?N1i~w^k?jVYkxO5pH7(dK(h0Z8h=y(XH`Sq1DHItAf(+$b0(UHl<0%C$Z*g zhtlsREUuYLc@~1&%6ZWG49fNAy7Eb#Dbm(wZB<B<_HtM2-qu1>^@h-SCz~L)p({;i z&vGn;-@ETQM(=OQEzp+DVwOYr*Vcn(4u24)<h!sOJYVy+`ybwR2dh6vJ=x@Kx8iNL wdcZ{gG)=h)PX52mb%8Kfn3`sSx&eT}!?4f$xB~jAW_bk#-myHZV|Sc?0JMQ($^ZZW literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/project_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/project_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b6750525d0b518f5b007157aa2ce48b9bc09599 GIT binary patch literal 1885 zcmZ`)OK&7K5VqZq>3Jj>7Fg{{3u*}=F-S>-5Erx{vf-hX&=84mX^qr!x1CH+-0jBh z3Cw6XKyu{@7Y<o*;xF};6MumdRXvYPP-4k;b@@^C)mP<yv9r@5(DFZj<_8`jf8)ox zxgdN7-9Cpw5J45mX+(1tF^b<zIk_9TxfglOx1;>1^%W7W@UDsQB)f8=Kseu$f&UNO zKnASd<%z8fPpe#3V=Zdu=*2OpgKx?z(*;*`@UoJICrS=eJhE=!+R~L%5G0AHAQ2NZ za>TB5C!X|WO9oHLQzD!{SmS^fwPi>6qIFHKXw(&fXkU}4Cpw}F^N!pVJ+afQ?Fj}h z?$x~$qbD-0PSO1QqhrOb4bQX*ZKX|CoQJ#+Va|)JoGM<SqFf%>SMpM-Q1FTm0Spso zbzrAuX{5EOvx0y#gMJL%z6ZmCE=Wukfa0QU9#?e1uINu}!9WZB#(6~`s1!V7^WQq* zs-1AdA#~E%jcR|>HY#zp5%JvVSl;96X3N^ujRMc4T21r9hLsM5(PemMbRJe1na*b4 zaNyQX3}{`I*{W{G>znFssci+(Ng)CQr*^GWXQl<9O#s7R#O%WK@9)PSkG`{jWyHr^ z93=b)Ud%>E1y6M$_=h7|T-uQ?Wnohobvd5d(brirvRNhfOP*fva|vgaf*s=GFflwU zVx7Q^mmDaY9VT+jFEed6LcC%uPI)?(hYcQkxK=iw2j#2|;y5d^DvsOWrfmwO>$89c z)MxWIPqxzJV7)V?uoWB5*c+aG5Ef)YfJHhSP=oiuv;$KUg5|IWpS9Ome+Ht(G$CyM z=#HUg`HmILsK(0MAfOfO6MDm5kv*sc%plCLRStb{a!U#3E)dJhQq3Acse2Lx=xrRX zy{r)O$EYKwrOHxXNm0AN$m{_m{Vnq2gj*Sce@jr#{H;5n{=f4MKCJl$-$8@#hG0cN zWzgk3Vdi~6>`Yu3p^5|(&aV#Cj0@5B=KU?aq0+iMt^Mr0&_+T+wpQsKwX&jAJe9RC zjnT#q2cCHY%+-&#UE@Mz%lFB2VX=uy<YHai9|F^ZUGG9)<_=~K^J$OHpFD*A4)9I- zVCGfiiu^)XBz|(V@g&@G5c#xYJyjx1WT-CzOD2RY!ekcOX_Deg29*dISie5h)yuq8 zGM5Dq`30hW0K^lpj-g*u_s&Dk$G7ppH1A{m6!1*NaovgIT#KnfxfjRZPq|vHwBlIk z6x6H~QTuavJHN!I&EQYRAoaBae+tt_DJUV-(o{3^8m=NiO^6Lvia|fOstKPKgC%9K z`tZ@QNJl_j_Uuv54ZNV;tPI+<!;^G*2i8*USF;jAdFw*tm+<CuYp}waL-*OKgXc?( OpCWM<t@df31<rqQ1K%(J literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/sessions_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/sessions_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5de75c8eb490ad8e5609fdca59c565c21a0ab744 GIT binary patch literal 4659 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 I9j8<K516J_82|tP literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py b/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py new file mode 100644 index 0000000000..bd60be859f --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py @@ -0,0 +1,70 @@ +from typing import Optional, List + +import pandas as pd + +from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ + .ophys_mixin import \ + OphysMixin +from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ + .project_table import \ + ProjectTable +from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ + .util.experiments_table_utils import ( + add_experience_level_to_experiment_table, + add_passive_flag_to_ophys_experiment_table, + add_image_set_to_experiment_table) + + +class ExperimentsTable(ProjectTable, OphysMixin): + """Class for storing and manipulating project-level data + at the behavior-ophys experiment level""" + def __init__(self, df: pd.DataFrame, + suppress: Optional[List[str]] = None, + passed_only: bool = True): + """ + Parameters + ---------- + df: pd.DataFrame + The behavior-ophys experiment-level data + suppress: Optional[List[str]] + columns to drop from table (default=None) + passed_only: bool + If True, only return experiments whose + exeriment_workflow_state is True + """ + self._passed_only = passed_only + ProjectTable.__init__(self, df=df, suppress=suppress) + OphysMixin.__init__(self) + self.final_processing() + + def postprocess_base(self): + """ + It actually is possible for the same ophys_experiment_id + to map to more than one container, so we don't want to + eliminate duplicate instances of the index + """ + pass + + def postprocess_additional(self): + pass + + def final_processing(self): + # This method is necessary because self.post_process_additional() + # is called by the ProjectTable.__init__(), which is called + # before OphysMixin.__init__(). OphysMixin.__init__() joins + # some of the Behavior and Ophys columns into sigle, session-wide + # columns, which the functions below must access (specifically, + # OphysMixin.__init__() joins session_type_behavior and + # session_type_ophys into session_type, which is the column + # that add_image_set_to_experiment acts on. A future ticket + # should revisit the workflow of these classes to make it + # possible for the function calls below to be incorporated + # into post_process_additional + + self._df = add_experience_level_to_experiment_table(self._df) + self._df = add_passive_flag_to_ophys_experiment_table(self._df) + self._df = add_image_set_to_experiment_table(self._df) + + if self._passed_only: + self._df = self._df.query("experiment_workflow_state=='passed'") + self._df = self._df.query("container_workflow_state=='published'") diff --git a/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py b/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py new file mode 100644 index 0000000000..68438bba29 --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py @@ -0,0 +1,20 @@ +class OphysMixin: + """A mixin class for ophys project data""" + def __init__(self): + # If we're in the state of combining behavior and ophys data + if 'date_of_acquisition_behavior' in self._df and \ + 'date_of_acquisition_ophys' in self._df: + + # Prioritize ophys_date_of_acquisition + self._df['date_of_acquisition'] = \ + self._df['date_of_acquisition_ophys'] + self._df = self._df.drop( + ['date_of_acquisition_behavior', + 'date_of_acquisition_ophys'], axis=1) + + # Prioritize ophys session_type + self._df['session_type'] = \ + self._df['session_type_ophys'] + self._df = self._df.drop( + ['session_type_behavior', + 'session_type_ophys'], axis=1) diff --git a/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py b/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py new file mode 100644 index 0000000000..dc5760f6d1 --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py @@ -0,0 +1,51 @@ +import logging +from typing import Optional, List + +import pandas as pd + +from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ + .ophys_mixin import \ + OphysMixin +from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ + .project_table import ProjectTable + + +class BehaviorOphysSessionsTable(ProjectTable, OphysMixin): + """Class for storing and manipulating project-level data + at the behavior-ophys session level""" + def __init__(self, df: pd.DataFrame, + suppress: Optional[List[str]] = None, + index_column: str = 'ophys_session_id'): + """ + Parameters + ---------- + df + The behavior-ophys session-level data + suppress + columns to drop from table + index_column + See description in BehaviorProjectCache.get_session_table + """ + + self._logger = logging.getLogger(self.__class__.__name__) + self._index_column = index_column + ProjectTable.__init__(self, df=df, suppress=suppress) + OphysMixin.__init__(self) + + def postprocess_additional(self): + # Possibly explode and reindex + self.__explode() + + def __explode(self): + if self._index_column == "ophys_session_id": + pass + elif self._index_column == "ophys_experiment_id": + self._df = (self._df.reset_index() + .explode("ophys_experiment_id") + .set_index("ophys_experiment_id")) + else: + self._logger.warning( + f"Invalid value for `by`, '{self._index_column}', passed to " + f"BehaviorOphysSessionsCacheTable." + " Valid choices for `by` are 'ophys_experiment_id' and " + "'ophys_session_id'.") diff --git a/brain_observatory/behavior/behavior_project_cache/tables/project_table.py b/brain_observatory/behavior/behavior_project_cache/tables/project_table.py new file mode 100644 index 0000000000..c14380590f --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/tables/project_table.py @@ -0,0 +1,49 @@ +from abc import abstractmethod, ABC +from typing import Optional, Iterable + +import pandas as pd + + +class ProjectTable(ABC): + """Class for storing and manipulating project-level data""" + def __init__(self, df: pd.DataFrame, + suppress: Optional[Iterable[str]] = None): + """ + Parameters + ---------- + df + The project-level data + suppress + columns to drop from table + + """ + self._df = df + + if suppress is not None: + suppress = list(suppress) + self._suppress = suppress + + self.postprocess() + + @property + def table(self): + return self._df + + def postprocess_base(self): + """Postprocessing to apply to all project-level data""" + # Make sure the index is not duplicated (it is rare) + self._df = self._df[~self._df.index.duplicated()].copy() + + def postprocess(self): + """Postprocess loop""" + self.postprocess_base() + self.postprocess_additional() + + if self._suppress: + self._df.drop(columns=self._suppress, inplace=True, + errors="ignore") + + @abstractmethod + def postprocess_additional(self): + """Additional postprocessing should be overridden by subclassess""" + raise NotImplementedError() diff --git a/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py b/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py new file mode 100644 index 0000000000..22d1c026cc --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py @@ -0,0 +1,119 @@ +import re +from typing import Optional, List + +import pandas as pd + +from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ + .ophys_sessions_table import \ + BehaviorOphysSessionsTable +from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ + .util.prior_exposure_processing import \ + get_prior_exposures_to_session_type, get_prior_exposures_to_image_set, \ + get_prior_exposures_to_omissions +from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ + .project_table import \ + ProjectTable +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import BehaviorProjectLimsApi # noqa: E501 + +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.full_genotype import \ + FullGenotype + +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.reporter_line import \ + ReporterLine + + +class SessionsTable(ProjectTable): + """Class for storing and manipulating project-level data + at the session level""" + + def __init__( + self, df: pd.DataFrame, + fetch_api: BehaviorProjectLimsApi, + suppress: Optional[List[str]] = None, + ophys_session_table: Optional[BehaviorOphysSessionsTable] = None): + """ + Parameters + ---------- + df + The session-level data + fetch_api + The api needed to call mtrain db + suppress + columns to drop from table + ophys_session_table + BehaviorOphysSessionsTable, to optionally merge in ophys data + """ + self._fetch_api = fetch_api + self._ophys_session_table = ophys_session_table + super().__init__(df=df, suppress=suppress) + + def postprocess_additional(self): + self._df['reporter_line'] = self._df['reporter_line'].apply( + ReporterLine.parse) + self._df['cre_line'] = self._df['full_genotype'].apply( + lambda x: FullGenotype(x).parse_cre_line()) + self._df['indicator'] = self._df['reporter_line'].apply( + lambda x: ReporterLine(x).parse_indicator()) + + self.__add_session_number() + + self._df['prior_exposures_to_session_type'] = \ + get_prior_exposures_to_session_type(df=self._df) + self._df['prior_exposures_to_image_set'] = \ + get_prior_exposures_to_image_set(df=self._df) + self._df['prior_exposures_to_omissions'] = \ + get_prior_exposures_to_omissions(df=self._df, + fetch_api=self._fetch_api) + + if self._ophys_session_table is not None: + # Merge in ophys data + self._df = self._df.reset_index() \ + .merge(self._ophys_session_table.table.reset_index(), + on='behavior_session_id', + how='left', + suffixes=('_behavior', '_ophys')) + self._df = self._df.set_index('behavior_session_id') + + # Prioritize behavior date_of_acquisition + self._df['date_of_acquisition'] = \ + self._df['date_of_acquisition_behavior'] + self._df = self._df.drop(['date_of_acquisition_behavior', + 'date_of_acquisition_ophys'], axis=1) + + self._df['session_type'] = \ + self.__get_session_type() + self._df = self._df.drop( + ['session_type_behavior', + 'session_type_ophys'], axis=1) + + def __add_session_number(self): + """Parses session number from session type and and adds to dataframe""" + + def parse_session_number(session_type: str): + """Parse the session number from session type""" + match = re.match(r'OPHYS_(?P<session_number>\d+)', + session_type) + if match is None: + return None + return int(match.group('session_number')) + + session_type = self._df['session_type'] + session_type = session_type[session_type.notnull()] + + self._df.loc[session_type.index, 'session_number'] = \ + session_type.apply(parse_session_number) + + def __get_session_type(self) -> pd.Series: + """Session type is returned by both mtrain for behavior sessions + as well as in LIMS table ophys_sessions. + + This method applies logic to use the mtrain value for behavior-only + sessions and LIMS value otherwise + """ + behavior_only = self._df['ophys_session_id'].isnull() + behavior_only_session = \ + self._df[behavior_only]['session_type_behavior'] + behavior_ophys_session = self._df[~behavior_only]['session_type_ophys'] + return pd.concat([behavior_only_session, behavior_ophys_session]) diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py b/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ab4f78784d5b01e495eb703556bb2c5238a1d53 GIT binary patch literal 238 zcmYL@v5EpQ5QZaMA%YKbg`2`oL{4qRM(hG%k_@-en1m#|vZYVq16cV=wm!mjS2<hU z`NRLs&oDF0YCIk>(&=`AzCL^WX+YtNoIePL?bzpFduOR{zwvur&%{1s$^vRIm4Y+) zPAom>;0;U#`ZkLY(PvEzvF@_iSS7M8IEkQ-@Qt+V98H)bR|%|_LD9t)N=O}7SVL<= q`VTUua6nz823;dBpd4o26zjN@*4rXw6}!i9ehQ{>xac4LA+r|-A4t#u literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/experiments_table_utils.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/experiments_table_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..641cfa5ef826f0322c49717e7c71e5663f840f2a GIT binary patch literal 2806 zcmd5;OOM<{5VqSM&m*&wO$d*b_Fx237_`|XFC?O6m6sw8Xaxi=)<mXfx_8F2o^I3K zv&pVz4=7wYaOaQ+fy9jizs6Ti^A|W#)gF5viIxb2gr%<OZdaANtG@bb?k+909C#)_ zeM^7uIL;rqC?5|dw_)f{Krn~7sS~-}9TOak{79I`{O|n8JF!<|0qprF_Ufzwdo|`h zbh^zscyqS9B)`C)WLzZ^E{u*1?Wa5s6gN{P1}^Hr(}YojaSw+64aCeD!$BDN-aT}f zH*=W3iF@ud!r;TKKJ=cuhwjXoxhu}t8~cZZHQ;@1Mwq`t3SHLRC5K=;4p<9jK4^P0 z|F*NRsIha_qIP5f-kYq=maO++Vd)*#!7`ZDE6WD!Sj$Ff3D-SOe}>DnLU<@+I;7!1 zrqhWCjSOWr+Sl<>6pA2(W<(8W2}2Ws2HL1Z46Tbquw+0DEW^hmZbn?;d#-gNML41? z1ZPrD6%SLs$J0>mgb(N>NfWBptb=Wd+gH~@slsBu1&cn_oQ2?`bS0*fKKd5ST4gGc z3J+?1$417<gbsPExoKI2�mkZn)BRd8K;n^5}+(Jl_g4wtk-)`T)%e7hl-SpRj** z<85j9F;i=JUveD^385TOG2{?d9ws82ny~sZtgmD#9dK*#W!KGp#(9?e+fwjoxi~i$ z10LIO&JmV#g2Dq4HOkn|eOM}ddr)6Qc#g202e{QJ1Kq9X{y=8?d1n#lxQKJ^Cpr;% z4YJFh<iQ?Ir(EZRnrQW8<RN^=Lf>sFJWF)0^mg^y^=Nr#k?+`Ih3lwUzP=H44!DwW z<uh6m2!~3ua&+V7htUNg#VPfRh5FFMS4*2;9d!}T@aHf0ZuP#>kpCV97_Rr}V=DH0 zcLW6-GkU$p#h&iTj0+6`;1>A3Pm_L6Cx&0i=wKJ%1h#1k8f<r?uK@e8?1RTWYNXoV z=<^ZX0~A&hxP~0_fr$rnFyb4QKlH}bB<aQrc#CmcuS4YDgCbm1+)-XJsz)|O6=Fv9 zyC9sEw$~sR-8SivmfIr4C2rg6z)lNh#avwiy^6FD8)$wHhQ12|NZ}098j=?%3kd8u zWdV)U>7##3BX^}tITaS_XY$Bns>6%|r|fa02`r)01Yw;N;Qjv)fISp4kDdIJ@>iI) z2T^@-dsT;}!Uow5R2%0@D4<U|>O6{N6c<2ry`mIbWvyMi8J%BvDNDr`N+DhYll*;z zVyUx}(jmg|<t^c3(ARhX=dCtrkY%^+c8Gc%))nZGd@9hb!Qv$7pi$dCIVR6M<3D%r zJ5K>*tcD#C;1$r%OL*Nm(WNd|M1L7O7INt6N?8jTGXEqI&_gUxZ2X~{SjNRh0e!`U zX`&5iB*lIiD6^mOvL!AWoi+b&I!XbJqZ^#jkIrl<G=&?#Qb)0ns<MQ9jahmK!?Mc| z;{Ry%&^7Rn<*Cb@U0<!v;CIClgt<SEZ+yrOnIqZ`yzPxU(4suxNci_e)<4MG$D?=( zUw^hXG2#O`$+iygbNKCm9Na|MRat!*^{sEFazInP1(VW4)T~UpwW1bQz@M#vD4-hC zn0t`Gu4^md)M4_s|Msh2;~5(uoHyHE;Jx9hRhV~!D9GS%2!(!_v8Y+KZcDkg1gze% d?_obuw!#{l6UnA2-@@Y1*ozzfrH?MX^A{L66I=iQ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/prior_exposure_processing.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/prior_exposure_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22fa6e0c984d3242f9dca80417c870e718b37309 GIT binary patch literal 5850 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 E2PjHhkpKVy literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py b/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py new file mode 100644 index 0000000000..d767154448 --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py @@ -0,0 +1,126 @@ +import pandas as pd + + +def add_experience_level_to_experiment_table( + experiments_table: pd.DataFrame) -> pd.DataFrame: + """ + adds a column to ophys_experiment_table that contains a string + indicating whether a session had exposure level of Familiar, + Novel 1, or Novel >1, based on session number and + prior_exposure_to_image_set + + Parameters + ---------- + experiments_table: pd.DataFrame + + Returns + ------- + experiments_table: pd.DataFrame + + Notes + ----- + Does not change the input DataFrame in-place + """ + # Ported from + # https://github.com/AllenInstitute/visual_behavior_analysis/ + # blob/master/visual_behavior/data_access/utilities.py#L1307 + + # do not modify in place + experiments_table = experiments_table.copy(deep=True) + + # add experience_level column with strings indicating relevant conditions + experiments_table['experience_level'] = 'None' + + session_123 = experiments_table.session_number.isin([1, 2, 3]) + familiar_indices = experiments_table[session_123].index.values + + experiments_table.at[familiar_indices, 'experience_level'] = 'Familiar' + + session_4 = (experiments_table.session_number == 4) + zero_prior_exp = (experiments_table.prior_exposures_to_image_set == 0) + + novel_indices = experiments_table[ + session_4 + & zero_prior_exp].index.values + + experiments_table.at[novel_indices, + 'experience_level'] = 'Novel 1' + + session_456 = experiments_table.session_number.isin([4, 5, 6]) + nonzero_prior_exp = (experiments_table.prior_exposures_to_image_set != 0) + novel_gt_1_indices = experiments_table[ + session_456 + & nonzero_prior_exp].index.values + + experiments_table.at[novel_gt_1_indices, + 'experience_level'] = 'Novel >1' + + return experiments_table + + +def add_passive_flag_to_ophys_experiment_table( + experiments_table: pd.DataFrame) -> pd.DataFrame: + """ + adds a column to ophys_experiment_table that contains a Boolean + indicating whether a session was passive or not based on session + number + + Parameters + ---------- + experiments_table: pd.DataFrame + + Returns + ------- + experiments_table: pd.DataFrame + + Note + ---- + Does not change the input DataFrame in-place + """ + + # Ported from + # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master + # /visual_behavior/data_access/utilities.py#L1344 + + experiments_table = experiments_table.copy(deep=True) + + experiments_table['passive'] = False + + session_25 = experiments_table.session_number.isin([2, 5]) + passive_indices = experiments_table[session_25].index.values + experiments_table.at[passive_indices, 'passive'] = True + + return experiments_table + + +def add_image_set_to_experiment_table( + experiments_table: pd.DataFrame) -> pd.DataFrame: + """ + Adds a column 'image_set' to the experiment_table, determined based + on the image set listed in the session_type column string + + Parameters + ---------- + experiments_table: pd.DataFrame + + Returns + -------- + experiments_table: pd.DataFrame + + Notes + ----- + Does not alter the input DataFrame in-place + """ + + # Ported from + # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/ + # visual_behavior/data_access/utilities.py#L1403 + + experiments_table = experiments_table.copy(deep=True) + + experiments_table['image_set'] = [ + session_type[15] + if len(session_type) > 15 else 'N/A' + for session_type + in experiments_table.session_type.values.astype(str)] + return experiments_table diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py b/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py new file mode 100644 index 0000000000..037e338aca --- /dev/null +++ b/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py @@ -0,0 +1,180 @@ +import re +from typing import Optional + +import pandas as pd + +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import BehaviorProjectLimsApi # noqa: E501 + + +def get_prior_exposures_to_session_type(df: pd.DataFrame) -> pd.Series: + """Get prior exposures to session type + + Parameters + ---------- + df + The sessions df + + Returns + --------- + Series with index same as df and values prior exposure counts to + session type + """ + return __get_prior_exposure_count(df=df, to=df['session_type']) + + +def get_prior_exposures_to_image_set(df: pd.DataFrame) -> pd.Series: + """Get prior exposures to image set + + The image set here is the letter part of the session type + ie for session type OPHYS_1_images_B, it would be "B" + + Some session types don't have an image set name, such as + gratings, which will be set to null + + Parameters + ---------- + df + The session df + + Returns + -------- + Series with index same as df and values prior exposure counts to image set + """ + + def __get_image_set_name(session_type: Optional[str]): + match = re.match(r'.*images_(?P<image_set>\w)', session_type) + if match is None: + return None + return match.group('image_set') + + session_type = df['session_type'][ + df['session_type'].notnull()] + image_set = session_type.apply(__get_image_set_name) + return __get_prior_exposure_count(df=df, to=image_set) + + +def get_prior_exposures_to_omissions(df: pd.DataFrame, + fetch_api: BehaviorProjectLimsApi) -> \ + pd.Series: + """Get prior exposures to omissions + + Parameters + ---------- + df + The session df + fetch_api + API needed to query mtrain + + Returns + --------- + Series with index same as df and values prior exposure counts to omissions + """ + df = df[df['session_type'].notnull()] + + contains_omissions = pd.Series(False, index=df.index) + + def __get_habituation_sessions(df: pd.DataFrame): + """Returns all habituation sessions""" + return df[ + df['session_type'].str.lower().str.contains('habituation')] + + def __get_habituation_sessions_contain_omissions( + habituation_sessions: pd.DataFrame, + fetch_api: BehaviorProjectLimsApi) -> pd.Series: + """Habituation sessions are not supposed to include omissions but + because of a mistake omissions were included for some habituation + sessions. + + This queries mtrain to figure out if omissions were included + for any of the habituation sessions + + Parameters + ---------- + habituation_sessions + the habituation sessions + + Returns + --------- + series where index is same as habituation sessions and values + indicate whether omissions were included + """ + + def __session_contains_omissions( + mtrain_stage_parameters: dict) -> bool: + return 'flash_omit_probability' in mtrain_stage_parameters \ + and \ + mtrain_stage_parameters['flash_omit_probability'] > 0 + + foraging_ids = habituation_sessions['foraging_id'].tolist() + foraging_ids = [f'\'{x}\'' for x in foraging_ids] + mtrain_stage_parameters = fetch_api. \ + get_behavior_stage_parameters(foraging_ids=foraging_ids) + return habituation_sessions.apply( + lambda session: __session_contains_omissions( + mtrain_stage_parameters=mtrain_stage_parameters[ + session['foraging_id']]), axis=1) + + habituation_sessions = __get_habituation_sessions(df=df) + if not habituation_sessions.empty: + contains_omissions.loc[habituation_sessions.index] = \ + __get_habituation_sessions_contain_omissions( + habituation_sessions=habituation_sessions, + fetch_api=fetch_api) + + contains_omissions.loc[ + (df['session_type'].str.lower().str.contains('ophys')) & + (~df.index.isin(habituation_sessions.index)) + ] = True + return __get_prior_exposure_count(df=df, to=contains_omissions, + agg_method='cumsum') + + +def __get_prior_exposure_count(df: pd.DataFrame, to: pd.Series, + agg_method='cumcount') -> pd.Series: + """Returns prior exposures a subject had to something + i.e can be prior exposures to a stimulus type, a image_set or + omission + + Parameters + ---------- + df + The sessions df + to + The array to calculate prior exposures to + Needs to have the same index as self._df + agg_method + The aggregation method to apply on the groups (cumcount or cumsum) + + Returns + --------- + Series with index same as self._df and with values of prior + exposure counts + """ + index = df.index + df = df.sort_values('date_of_acquisition') + df = df[df['session_type'].notnull()] + + # reindex "to" to df + to = to.loc[df.index] + + # exclude missing values from cumcount + to = to[to.notnull()] + + # reindex df to match "to" index with missing values removed + df = df.loc[to.index] + + if agg_method == 'cumcount': + counts = df.groupby(['mouse_id', to]).cumcount() + elif agg_method == 'cumsum': + df['to'] = to + + def cumsum(x): + return x.cumsum().shift(fill_value=0).astype('int64') + + counts = df.groupby(['mouse_id'])['to'].apply(cumsum) + counts.name = None + else: + raise ValueError(f'agg method {agg_method} not supported') + + # reindex to original index + return counts.reindex(index) diff --git a/brain_observatory/behavior/behavior_session.py b/brain_observatory/behavior/behavior_session.py new file mode 100644 index 0000000000..36f875eed1 --- /dev/null +++ b/brain_observatory/behavior/behavior_session.py @@ -0,0 +1,946 @@ +import datetime +from typing import Any, List, Dict, Optional +import pynwb +import pandas as pd +import numpy as np +import pytz + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, NwbReadableInterface, \ + LimsReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.licks import Licks +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.behavior_metadata import \ + BehaviorMetadata, get_expt_description +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.date_of_acquisition import \ + DateOfAcquisition +from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards +from allensdk.brain_observatory.behavior.data_objects.stimuli.stimuli import \ + Stimuli +from allensdk.brain_observatory.behavior.data_objects.task_parameters import \ + TaskParameters +from allensdk.brain_observatory.behavior.data_objects.trials.trial_table \ + import \ + TrialTable +from allensdk.brain_observatory.behavior.trials_processing import ( + construct_rolling_performance_df, calculate_reward_rate_fix_nans) +from allensdk.brain_observatory.behavior.data_objects import ( + BehaviorSessionId, StimulusTimestamps, RunningSpeed, RunningAcquisition, + DataObject +) + +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator, PostgresQueryMixin + + +class BehaviorSession(DataObject, LimsReadableInterface, + NwbReadableInterface, + JsonReadableInterface, NwbWritableInterface): + """Represents data from a single Visual Behavior behavior session. + Initialize by using class methods `from_lims` or `from_nwb_path`. + """ + def __init__( + self, + behavior_session_id: BehaviorSessionId, + stimulus_timestamps: StimulusTimestamps, + running_acquisition: RunningAcquisition, + raw_running_speed: RunningSpeed, + running_speed: RunningSpeed, + licks: Licks, + rewards: Rewards, + stimuli: Stimuli, + task_parameters: TaskParameters, + trials: TrialTable, + metadata: BehaviorMetadata, + date_of_acquisition: DateOfAcquisition + ): + super().__init__(name='behavior_session', value=self) + + self._behavior_session_id = behavior_session_id + self._licks = licks + self._rewards = rewards + self._running_acquisition = running_acquisition + self._running_speed = running_speed + self._raw_running_speed = raw_running_speed + self._stimuli = stimuli + self._stimulus_timestamps = stimulus_timestamps + self._task_parameters = task_parameters + self._trials = trials + self._metadata = metadata + self._date_of_acquisition = date_of_acquisition + + # ==================== class and utility methods ====================== + + @classmethod + def from_json(cls, + session_data: dict, + monitor_delay: Optional[float] = None) \ + -> "BehaviorSession": + """ + + Parameters + ---------- + session_data + Dict of input data necessary to construct a session + monitor_delay + Monitor delay. If not provided, will use an estimate. + To provide this value, see for example + allensdk.brain_observatory.behavior.data_objects.stimuli.util. + calculate_monitor_delay + + Returns + ------- + `BehaviorSession` instance + + """ + behavior_session_id = BehaviorSessionId.from_json( + dict_repr=session_data) + stimulus_file = StimulusFile.from_json(dict_repr=session_data) + stimulus_timestamps = StimulusTimestamps.from_json( + dict_repr=session_data) + running_acquisition = RunningAcquisition.from_json( + dict_repr=session_data) + raw_running_speed = RunningSpeed.from_json( + dict_repr=session_data, filtered=False + ) + running_speed = RunningSpeed.from_json(dict_repr=session_data) + metadata = BehaviorMetadata.from_json(dict_repr=session_data) + + if monitor_delay is None: + monitor_delay = cls._get_monitor_delay() + + licks, rewards, stimuli, task_parameters, trials = \ + cls._read_data_from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + trial_monitor_delay=monitor_delay + ) + date_of_acquisition = DateOfAcquisition.from_json( + dict_repr=session_data)\ + .validate( + stimulus_file=stimulus_file, + behavior_session_id=behavior_session_id.value) + + return BehaviorSession( + behavior_session_id=behavior_session_id, + stimulus_timestamps=stimulus_timestamps, + running_acquisition=running_acquisition, + raw_running_speed=raw_running_speed, + running_speed=running_speed, + metadata=metadata, + licks=licks, + rewards=rewards, + stimuli=stimuli, + task_parameters=task_parameters, + trials=trials, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: Optional[PostgresQueryMixin] = None, + stimulus_timestamps: Optional[StimulusTimestamps] = None, + monitor_delay: Optional[float] = None, + date_of_acquisition: Optional[DateOfAcquisition] = None) \ + -> "BehaviorSession": + """ + + Parameters + ---------- + behavior_session_id + Behavior session id + lims_db + Database connection. If not provided will create a new one. + stimulus_timestamps + Stimulus timestamps. If not provided, will calculate stimulus + timestamps from stimulus file. + monitor_delay + Monitor delay. If not provided, will use an estimate. + To provide this value, see for example + allensdk.brain_observatory.behavior.data_objects.stimuli.util. + calculate_monitor_delay + date_of_acquisition + Date of acquisition. If not provided, will read from + behavior_sessions table. + Returns + ------- + `BehaviorSession` instance + """ + if lims_db is None: + lims_db = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP + ) + + behavior_session_id = BehaviorSessionId(behavior_session_id) + stimulus_file = StimulusFile.from_lims( + db=lims_db, behavior_session_id=behavior_session_id.value) + if stimulus_timestamps is None: + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file) + running_acquisition = RunningAcquisition.from_lims( + lims_db, behavior_session_id.value + ) + raw_running_speed = RunningSpeed.from_lims( + lims_db, behavior_session_id.value, filtered=False, + stimulus_timestamps=stimulus_timestamps + ) + running_speed = RunningSpeed.from_lims( + lims_db, behavior_session_id.value, + stimulus_timestamps=stimulus_timestamps + ) + behavior_metadata = BehaviorMetadata.from_lims( + behavior_session_id=behavior_session_id, lims_db=lims_db + ) + + if monitor_delay is None: + monitor_delay = cls._get_monitor_delay() + + licks, rewards, stimuli, task_parameters, trials = \ + cls._read_data_from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + trial_monitor_delay=monitor_delay + ) + if date_of_acquisition is None: + date_of_acquisition = DateOfAcquisition.from_lims( + behavior_session_id=behavior_session_id.value, lims_db=lims_db) + date_of_acquisition = date_of_acquisition.validate( + stimulus_file=stimulus_file, + behavior_session_id=behavior_session_id.value) + + return BehaviorSession( + behavior_session_id=behavior_session_id, + stimulus_timestamps=stimulus_timestamps, + running_acquisition=running_acquisition, + raw_running_speed=raw_running_speed, + running_speed=running_speed, + metadata=behavior_metadata, + licks=licks, + rewards=rewards, + stimuli=stimuli, + task_parameters=task_parameters, + trials=trials, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile, **kwargs) -> "BehaviorSession": + behavior_session_id = BehaviorSessionId.from_nwb(nwbfile) + stimulus_timestamps = StimulusTimestamps.from_nwb(nwbfile) + running_acquisition = RunningAcquisition.from_nwb(nwbfile) + raw_running_speed = RunningSpeed.from_nwb(nwbfile, filtered=False) + running_speed = RunningSpeed.from_nwb(nwbfile) + metadata = BehaviorMetadata.from_nwb(nwbfile) + licks = Licks.from_nwb(nwbfile=nwbfile) + rewards = Rewards.from_nwb(nwbfile=nwbfile) + stimuli = Stimuli.from_nwb(nwbfile=nwbfile) + task_parameters = TaskParameters.from_nwb(nwbfile=nwbfile) + trials = TrialTable.from_nwb(nwbfile=nwbfile) + date_of_acquisition = DateOfAcquisition.from_nwb(nwbfile=nwbfile) + + return BehaviorSession( + behavior_session_id=behavior_session_id, + stimulus_timestamps=stimulus_timestamps, + running_acquisition=running_acquisition, + raw_running_speed=raw_running_speed, + running_speed=running_speed, + metadata=metadata, + licks=licks, + rewards=rewards, + stimuli=stimuli, + task_parameters=task_parameters, + trials=trials, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_nwb_path(cls, nwb_path: str, **kwargs) -> "BehaviorSession": + """ + + Parameters + ---------- + nwb_path + Path to nwb file + kwargs + Kwargs to be passed to `from_nwb` + + Returns + ------- + An instantiation of a `BehaviorSession` + """ + with pynwb.NWBHDF5IO(str(nwb_path), 'r') as read_io: + nwbfile = read_io.read() + return cls.from_nwb(nwbfile=nwbfile, **kwargs) + + def to_nwb(self, add_metadata=True) -> NWBFile: + """ + + Parameters + ---------- + add_metadata + Set this to False to prevent adding metadata to the nwb + instance. + """ + nwbfile = NWBFile( + session_description=self._get_session_type(), + identifier=self._get_identifier(), + session_start_time=self._date_of_acquisition.value, + file_create_date=pytz.utc.localize(datetime.datetime.now()), + institution="Allen Institute for Brain Science", + keywords=self._get_keywords(), + experiment_description=get_expt_description( + session_type=self._get_session_type()) + ) + + self._stimulus_timestamps.to_nwb(nwbfile=nwbfile) + self._running_acquisition.to_nwb(nwbfile=nwbfile) + self._raw_running_speed.to_nwb(nwbfile=nwbfile) + self._running_speed.to_nwb(nwbfile=nwbfile) + + if add_metadata: + self._metadata.to_nwb(nwbfile=nwbfile) + + self._licks.to_nwb(nwbfile=nwbfile) + self._rewards.to_nwb(nwbfile=nwbfile) + self._stimuli.to_nwb(nwbfile=nwbfile) + self._task_parameters.to_nwb(nwbfile=nwbfile) + self._trials.to_nwb(nwbfile=nwbfile) + + return nwbfile + + def list_data_attributes_and_methods(self) -> List[str]: + """Convenience method for end-users to list attributes and methods + that can be called to access data for a BehaviorSession. + + NOTE: Because BehaviorOphysExperiment inherits from BehaviorSession, + this method will also be available there. + + Returns + ------- + List[str] + A list of attributes and methods that end-users can access or call + to get data. + """ + attrs_and_methods_to_ignore: set = { + "from_json", + "from_lims", + "from_nwb_path", + "list_data_attributes_and_methods" + } + attrs_and_methods_to_ignore.update(dir(NwbReadableInterface)) + attrs_and_methods_to_ignore.update(dir(NwbWritableInterface)) + attrs_and_methods_to_ignore.update(dir(DataObject)) + class_dir = dir(self) + attrs_and_methods = [ + r for r in class_dir + if (r not in attrs_and_methods_to_ignore and not r.startswith("_")) + ] + return attrs_and_methods + + # ========================= 'get' methods ========================== + + def get_reward_rate(self) -> np.ndarray: + """ Get the reward rate of the subject for the task calculated over a + 25 trial rolling window and provides a measure of the rewards + earned per unit time (in units of rewards/minute). + + Returns + ------- + np.ndarray + The reward rate (rewards/minute) of the subject for the + task calculated over a 25 trial rolling window. + """ + return calculate_reward_rate_fix_nans( + self.trials, + self.task_parameters['response_window_sec'][0]) + + def get_rolling_performance_df(self) -> pd.DataFrame: + """Return a DataFrame containing trial by trial behavior response + performance metrics. + + Returns + ------- + pd.DataFrame + A pandas DataFrame containing: + trials_id [index]: (int) + Index of the trial. All trials, including aborted trials, + are assigned an index starting at 0 for the first trial. + reward_rate: (float) + Rewards earned in the previous 25 trials, normalized by + the elapsed time of the same 25 trials. Units are + rewards/minute. + hit_rate_raw: (float) + Fraction of go trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + hit_rate: (float) + Fraction of go trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. With trial count correction applied. + false_alarm_rate_raw: (float) + Fraction of catch trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + false_alarm_rate: (float) + Fraction of catch trials where the mouse licked in + the response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + rolling_dprime: (float) + d prime calculated using the rolling hit_rate and + rolling false_alarm _rate. + + """ + return construct_rolling_performance_df( + self.trials, + self.task_parameters['response_window_sec'][0], + self.task_parameters["session_type"]) + + def get_performance_metrics( + self, + engaged_trial_reward_rate_threshold: float = 2.0 + ) -> dict: + """Get a dictionary containing a subject's behavior response + summary data. + + Parameters + ---------- + engaged_trial_reward_rate_threshold : float, optional + The number of rewards per minute that needs to be attained + before a subject is considered 'engaged', by default 2.0 + + Returns + ------- + dict + Returns a dict of performance metrics with the following fields: + trial_count: (int) + The length of the trial dataframe + (including all 'go', 'catch', and 'aborted' trials) + go_trial_count: (int) + Number of 'go' trials in a behavior session + catch_trial_count: (int) + Number of 'catch' trial types during a behavior session + hit_trial_count: (int) + Number of trials with a hit behavior response + type in a behavior session + miss_trial_count: (int) + Number of trials with a miss behavior response + type in a behavior session + false_alarm_trial_count: (int) + Number of trials where the mouse had a false alarm + behavior response + correct_reject_trial_count: (int) + Number of trials with a correct reject behavior + response during a behavior session + auto_reward_count: + Number of trials where the mouse received an auto + reward of water. + earned_reward_count: + Number of trials where the mouse was eligible to receive a + water reward ('go' trials) and did receive an earned + water reward + total_reward_count: + Number of trials where the mouse received a + water reward (earned or auto rewarded) + total_reward_volume: (float) + Volume of all water rewards received during a + behavior session (earned and auto rewarded) + maximum_reward_rate: (float) + The peak of the rolling reward rate (rewards/minute) + engaged_trial_count: (int) + Number of trials where the mouse is engaged + (reward rate > 2 rewards/minute) + mean_hit_rate: (float) + The mean of the rolling hit_rate + mean_hit_rate_uncorrected: + The mean of the rolling hit_rate_raw + mean_hit_rate_engaged: (float) + The mean of the rolling hit_rate, excluding epochs + when the rolling reward rate was below 2 rewards/minute + mean_false_alarm_rate: (float) + The mean of the rolling false_alarm_rate, excluding + epochs when the rolling reward rate was below 2 + rewards/minute + mean_false_alarm_rate_uncorrected: (float) + The mean of the rolling false_alarm_rate_raw + mean_false_alarm_rate_engaged: (float) + The mean of the rolling false_alarm_rate, + excluding epochs when the rolling reward rate + was below 2 rewards/minute + mean_dprime: (float) + The mean of the rolling d_prime + mean_dprime_engaged: (float) + The mean of the rolling d_prime, excluding + epochs when the rolling reward rate was + below 2 rewards/minute + max_dprime: (float) + The peak of the rolling d_prime + max_dprime_engaged: (float) + The peak of the rolling d_prime, excluding epochs + when the rolling reward rate was below 2 rewards/minute + """ + performance_metrics = {} + performance_metrics['trial_count'] = len(self.trials) + performance_metrics['go_trial_count'] = self.trials.go.sum() + performance_metrics['catch_trial_count'] = self.trials.catch.sum() + performance_metrics['hit_trial_count'] = self.trials.hit.sum() + performance_metrics['miss_trial_count'] = self.trials.miss.sum() + performance_metrics['false_alarm_trial_count'] = \ + self.trials.false_alarm.sum() + performance_metrics['correct_reject_trial_count'] = \ + self.trials.correct_reject.sum() + performance_metrics['auto_reward_count'] = \ + self.trials.auto_rewarded.sum() + # Although 'earned_reward_count' will currently have the same value as + # 'hit_trial_count', in the future there may be variants of the + # task where rewards are withheld. In that case the + # 'earned_reward_count' will be smaller than (and different from) + # the 'hit_trial_count'. + performance_metrics['earned_reward_count'] = self.trials.hit.sum() + performance_metrics['total_reward_count'] = len(self.rewards) + performance_metrics['total_reward_volume'] = self.rewards.volume.sum() + + rpdf = self.get_rolling_performance_df() + engaged_trial_mask = ( + rpdf['reward_rate'] > + engaged_trial_reward_rate_threshold) + performance_metrics['maximum_reward_rate'] = \ + np.nanmax(rpdf['reward_rate'].values) + performance_metrics['engaged_trial_count'] = (engaged_trial_mask).sum() + performance_metrics['mean_hit_rate'] = \ + rpdf['hit_rate'].mean() + performance_metrics['mean_hit_rate_uncorrected'] = \ + rpdf['hit_rate_raw'].mean() + performance_metrics['mean_hit_rate_engaged'] = \ + rpdf['hit_rate'][engaged_trial_mask].mean() + performance_metrics['mean_false_alarm_rate'] = \ + rpdf['false_alarm_rate'].mean() + performance_metrics['mean_false_alarm_rate_uncorrected'] = \ + rpdf['false_alarm_rate_raw'].mean() + performance_metrics['mean_false_alarm_rate_engaged'] = \ + rpdf['false_alarm_rate'][engaged_trial_mask].mean() + performance_metrics['mean_dprime'] = \ + rpdf['rolling_dprime'].mean() + performance_metrics['mean_dprime_engaged'] = \ + rpdf['rolling_dprime'][engaged_trial_mask].mean() + performance_metrics['max_dprime'] = \ + rpdf['rolling_dprime'].max() + performance_metrics['max_dprime_engaged'] = \ + rpdf['rolling_dprime'][engaged_trial_mask].max() + + return performance_metrics + + # ====================== properties ======================== + + @property + def behavior_session_id(self) -> int: + """Unique identifier for a behavioral session. + :rtype: int + """ + return self._behavior_session_id.value + + @property + def licks(self) -> pd.DataFrame: + """A dataframe containing lick timestmaps and frames, sampled + at 60 Hz. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + np.ndarray + A dataframe containing lick timestamps. + dataframe columns: + timestamps: (float) + time of lick, in seconds + frame: (int) + frame of lick + + """ + return self._licks.value + + @property + def rewards(self) -> pd.DataFrame: + """Retrieves rewards from data file saved at the end of the + behavior session. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + pd.DataFrame + A dataframe containing timestamps of delivered rewards. + Timestamps are sampled at 60Hz. + + dataframe columns: + volume: (float) + volume of individual water reward in ml. + 0.007 if earned reward, 0.005 if auto reward. + timestamps: (float) + time in seconds + autorewarded: (bool) + True if free reward was delivered for that trial. + Occurs during the first 5 trials of a session and + throughout as needed + + """ + return self._rewards.value + + @property + def running_speed(self) -> pd.DataFrame: + """Running speed and timestamps, sampled at 60Hz. By default + applies a 10Hz low pass filter to the data. To get the + running speed without the filter, use `raw_running_speed`. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + pd.DataFrame + Dataframe containing running speed and timestamps + dataframe columns: + timestamps: (float) + time in seconds + speed: (float) + speed in cm/sec + """ + return self._running_speed.value + + @property + def raw_running_speed(self) -> pd.DataFrame: + """Get unfiltered running speed data. Sampled at 60Hz. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + pd.DataFrame + Dataframe containing unfiltered running speed and timestamps + dataframe columns: + timestamps: (float) + time in seconds + speed: (float) + speed in cm/sec + """ + return self._raw_running_speed.value + + @property + def stimulus_presentations(self) -> pd.DataFrame: + """Table whose rows are stimulus presentations (i.e. a given image, + for a given duration, typically 250 ms) and whose columns are + presentation characteristics. + + Returns + ------- + pd.DataFrame + Table whose rows are stimulus presentations + (i.e. a given image, for a given duration, typically 250 ms) + and whose columns are presentation characteristics. + + dataframe columns: + stimulus_presentations_id [index]: (int) + identifier for a stimulus presentation + (presentation of an image) + duration: (float) + duration of an image presentation (flash) + in seconds (stop_time - start_time). NaN if omitted + end_frame: (float) + image presentation end frame + image_index: (int) + image index (0-7) for a given session, + corresponding to each image name + image_set: (string) + image set for this behavior session + index: (int) + an index assigned to each stimulus presentation + omitted: (bool) + True if no image was shown for this stimulus + presentation + start_frame: (int) + image presentation start frame + start_time: (float) + image presentation start time in seconds + stop_time: (float) + image presentation end time in seconds + """ + return self._stimuli.presentations.value + + @property + def stimulus_templates(self) -> pd.DataFrame: + """Get stimulus templates (movies, scenes) for behavior session. + + Returns + ------- + pd.DataFrame + A pandas DataFrame object containing the stimulus images for the + experiment. + + dataframe columns: + image_name [index]: (string) + name of image presented, if 'omitted' + then no image was presented + unwarped: (array of int) + image array of unwarped stimulus image + warped: (array of int) + image array of warped stimulus image + + """ + return self._stimuli.templates.value.to_dataframe() + + @property + def stimulus_timestamps(self) -> np.ndarray: + """Timestamps associated with the stimulus presetntation on + the monitor retrieveddata file saved at the end of the + behavior session. Sampled at 60Hz. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + np.ndarray + Timestamps associated with stimulus presentations on the monitor + """ + return self._stimulus_timestamps.value + + @property + def task_parameters(self) -> dict: + """Get task parameters from data file saved at the end of + the behavior session file. + + Returns + ------- + dict + A dictionary containing parameters used to define the task runtime + behavior. + auto_reward_volume: (float) + Volume of auto rewards in ml. + blank_duration_sec : (list of floats) + Duration in seconds of inter stimulus interval. + Inter-stimulus interval chosen as a uniform random value. + between the range defined by the two values. + Values are ignored if `stimulus_duration_sec` is null. + response_window_sec: (list of floats) + Range of period following an image change, in seconds, + where mouse response influences trial outcome. + First value represents response window start. + Second value represents response window end. + Values represent time before display lag is + accounted for and applied. + n_stimulus_frames: (int) + Total number of visual stimulus frames presented during + a behavior session. + task: (string) + Type of visual stimulus task. + session_type: (string) + Visual stimulus type run during behavior session. + omitted_flash_fraction: (float) + Probability that a stimulus image presentations is omitted. + Change stimuli, and the stimulus immediately preceding the + change, are never omitted. + stimulus_distribution: (string) + Distribution for drawing change times. + Either 'exponential' or 'geometric'. + stimulus_duration_sec: (float) + Duration in seconds of each stimulus image presentation + reward_volume: (float) + Volume of earned water reward in ml. + stimulus: (string) + Stimulus type ('gratings' or 'images'). + + """ + return self._task_parameters.to_dict()['task_parameters'] + + @property + def trials(self) -> pd.DataFrame: + """Get trials from data file saved at the end of the + behavior session. + + Returns + ------- + pd.DataFrame + A dataframe containing trial and behavioral response data, + by cell specimen id + + dataframe columns: + trials_id: (int) + trial identifier + lick_times: (array of float) + array of lick times in seconds during that trial. + Empty array if no licks occured during the trial. + reward_time: (NaN or float) + Time the reward is delivered following a correct + response or on auto rewarded trials. + reward_volume: (float) + volume of reward in ml. 0.005 for auto reward + 0.007 for earned reward + hit: (bool) + Behavior response type. On catch trial mouse licks + within reward window. + false_alarm: (bool) + Behavior response type. On catch trial mouse licks + within reward window. + miss: (bool) + Behavior response type. On a go trial, mouse either + does not lick at all, or licks after reward window + stimulus_change: (bool) + True if an image change occurs during the trial + (if the trial was both a 'go' trial and the trial + was not aborted) + aborted: (bool) + Behavior response type. True if the mouse licks + before the scheduled change time. + go: (bool) + Trial type. True if there was a change in stimulus + image identity on this trial + catch: (bool) + Trial type. True if there was not a change in stimulus + identity on this trial + auto_rewarded: (bool) + True if free reward was delivered for that trial. + Occurs during the first 5 trials of a session and + throughout as needed. + correct_reject: (bool) + Behavior response type. On a catch trial, mouse + either does not lick at all or licks after reward + window + start_time: (float) + start time of the trial in seconds + stop_time: (float) + end time of the trial in seconds + trial_length: (float) + duration of trial in seconds (stop_time -start_time) + response_time: (float) + time of first lick in trial in seconds and NaN if + trial aborted + initial_image_name: (string) + name of image presented at start of trial + change_image_name: (string) + name of image that is changed to at the change time, + on go trials + """ + return self._trials.value + + @property + def metadata(self) -> Dict[str, Any]: + """metadata for a given session + + Returns + ------- + Dict + A dictionary containing behavior session specific metadata + dictionary keys: + age_in_days: (int) + age of mouse in days + behavior_session_uuid: (int) + unique identifier for a behavior session + behavior_session_id: (int) + unique identifier for a behavior session + cre_line: (string) + cre driver line for a transgenic mouse + date_of_acquisition: (date time object) + date and time of experiment acquisition, + yyyy-mm-dd hh:mm:ss + driver_line: (list of string) + all driver lines for a transgenic mouse + equipment_name: (string) + identifier for equipment data was collected on + full_genotype: (string) + full genotype of transgenic mouse + mouse_id: (int) + unique identifier for a mouse + reporter_line: (string) + reporter line for a transgenic mouse + session_type: (string) + visual stimulus type displayed during behavior + session + sex: (string) + sex of the mouse + stimulus_frame_rate: (float) + frame rate (Hz) at which the visual stimulus is + displayed + """ + return self._get_metadata(behavior_metadata=self._metadata) + + @classmethod + def _read_data_from_stimulus_file( + cls, stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps, + trial_monitor_delay: float): + """Helper method to read data from stimulus file""" + licks = Licks.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps) + rewards = Rewards.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps) + stimuli = Stimuli.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps) + task_parameters = TaskParameters.from_stimulus_file( + stimulus_file=stimulus_file) + trials = TrialTable.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + licks=licks, + rewards=rewards, + monitor_delay=trial_monitor_delay + ) + return licks, rewards, stimuli, task_parameters, trials + + def _get_metadata(self, behavior_metadata: BehaviorMetadata) -> dict: + """Returns dict of metadata""" + return { + 'equipment_name': behavior_metadata.equipment.value, + 'sex': behavior_metadata.subject_metadata.sex, + 'age_in_days': behavior_metadata.subject_metadata.age_in_days, + 'stimulus_frame_rate': behavior_metadata.stimulus_frame_rate, + 'session_type': behavior_metadata.session_type, + 'date_of_acquisition': self._date_of_acquisition.value, + 'reporter_line': behavior_metadata.subject_metadata.reporter_line, + 'cre_line': behavior_metadata.subject_metadata.cre_line, + 'behavior_session_uuid': behavior_metadata.behavior_session_uuid, + 'driver_line': behavior_metadata.subject_metadata.driver_line, + 'mouse_id': behavior_metadata.subject_metadata.mouse_id, + 'full_genotype': behavior_metadata.subject_metadata.full_genotype, + 'behavior_session_id': behavior_metadata.behavior_session_id + } + + def _get_identifier(self) -> str: + return str(self._behavior_session_id) + + def _get_session_type(self) -> str: + return self._metadata.session_type + + @staticmethod + def _get_keywords(): + """Keywords for NWB file""" + return ["visual", "behavior", "task"] + + @staticmethod + def _get_monitor_delay(): + # This is the median estimate across all rigs + # as discussed in + # https://github.com/AllenInstitute/AllenSDK/issues/1318 + return 0.02115 diff --git a/brain_observatory/behavior/criteria.py b/brain_observatory/behavior/criteria.py new file mode 100644 index 0000000000..6743e3717d --- /dev/null +++ b/brain_observatory/behavior/criteria.py @@ -0,0 +1,216 @@ +""" +Functions for calculating mtrain state transitions. +If criteria are met, return true. Otherwise, return false. +""" + +import logging +from allensdk.core.exceptions import DataFrameKeyError, DataFrameIndexError + + +logger = logging.getLogger(__name__) + + +def two_out_of_three_aint_bad(session_summary): + """Returns true if 2 of the last 3 days showed a peak + d-prime above 2. + + Args: + session_summary (pd.DataFrame): Pandas dataframe with daily values for 'dprime_peak', + ordered ascending by training day, for at least the past 3 days. If dataframe is not + properly ordered, criterion may not be correctly calculated. This function does not + sort the data to preserve prior behavior (sorting column was not required by mtrain function). + The mtrain implementation created the required columns if they didn't exist, so + a more informative error is raised here to assist end-users in debugging. + Returns: + bool: True if criterion is met, False otherwise + """ + if len(session_summary) < 3: + raise DataFrameIndexError("Not enough data in session_summary frame. " + "Expected >= 3 rows, got {}".format(len(session_summary))) + try: + last_three = session_summary["dprime_peak"][-3:] + except KeyError as e: + raise DataFrameKeyError("Failed accessing last three values in colum" + "'dprime_peak'.\n df length={}, df columns={}\n" + .format(len(session_summary), list(session_summary)), e) + logger.info('dprime_peak over last three days: {}'.format(list(last_three))) + criteria = bool( + ((last_three > 2).sum() > 1) # at least two of the last three + ) + logger.info("'Two out of three ain't bad' criteria met: '{}'".format(criteria)) + return criteria + +def yesterday_was_good(session_summary): + """Returns true if the last day showed a peak d-prime above 2 + Args: + session_summary (pd.DataFrame): Pandas dataframe with daily values for 'dprime_peak', + ordered ascending by training day, for at least 1 day. If dataframe is not + properly ordered, criterion may not be correctly calculated. This function does not + sort the data to preserve prior behavior (sorting column was not required by mtrain function). + The mtrain implementation created the required columns if they didn't exist, so + a more informative error is raised here to assist end-users in debugging. + Returns: + bool: True if criterion is met, False otherwise + """ + if len(session_summary) < 1: + raise DataFrameIndexError("Not enough data in session_summary frame. " + "Expected >= 1 row(s), got {}".format(len(session_summary))) + try: + last_day = session_summary['dprime_peak'].iloc[-1] + except KeyError as e: + raise DataFrameKeyError("Failed accessing last three values in colum" + "'dprime_peak'.\n df length={}, df columns={}\n" + .format(len(session_summary), list(session_summary)), e) + criteria = bool(last_day > 2) + logger.info("'Yesterday was good' criteria met: {}".format(criteria)) + return criteria + + +def no_response_bias(session_summary): + """the mouse meets this criterion if their last session exhibited a + response bias between 10% and 90% + Args: + session_summary (pd.DataFrame): Pandas dataframe with daily values for 'response_bias', + ordered ascending by training day, for at least 1 day. If dataframe is not + properly ordered, criterion may not be correctly calculated. This function does not + sort the data to preserve prior behavior (sorting column was not required by mtrain function). + The mtrain implementation created the required columns if they didn't exist, so + a more informative error is raised here to assist end-users in debugging. + Returns: + bool: True if criterion is met, False otherwise + """ + if len(session_summary) < 1: + raise DataFrameIndexError("Not enough data in session_summary frame. " + "Expected >= 1 row(s), got {}".format(len(session_summary))) + try: + response_bias = session_summary['response_bias'].iloc[-1] + except KeyError as e: + raise DataFrameKeyError("Failed accessing last values in colum" + "'response_bias'.\n df length={}, df columns={}\n" + .format(len(session_summary), list(session_summary)), e) + criteria = (response_bias < 0.9) & (response_bias > 0.1) + logger.info("'No response bias' criteria met: {} (response bias={})" + .format(criteria, response_bias)) + return criteria + + +def whole_lotta_trials(session_summary): + """ + Mouse meets this criterion if the last session has more than 300 trials. + Args: + session_summary (pd.DataFrame): Pandas dataframe with daily values for 'num_contingent_trials', + ordered ascending by training day, for at least 1 day. If dataframe is not + properly ordered, criterion may not be correctly calculated. This function does not + sort the data to preserve prior behavior (sorting column was not required by mtrain function). + The mtrain implementation created the required columns if they didn't exist, so + a more informative error is raised here to assist end-users in debugging. + Returns: + bool: True if criterion is met, False otherwise + """ + if len(session_summary) < 1: + raise DataFrameIndexError("Not enough data in session_summary frame. " + "Expected >= 1 row(s), got {}".format(len(session_summary))) + try: + num_trials = session_summary['num_contingent_trials'].iloc[-1] + except KeyError as e: + raise DataFrameKeyError("Failed accessing last values in colum" + "'num_contingent_trials'.\n df length={}, df columns={}\n" + .format(len(session_summary), list(session_summary)), e) + criteria = num_trials > 300 + logger.info("'Trials > 300' criteria met: {} (n trials={})".format(criteria, num_trials)) + return criteria + + +def mostly_useful(trials): + """ + Returns True if fewer than half the trial time on the last day were + aborted trials. + Args: + trials (pd.DataFrame): Pandas dataframe with columns 'training_day', 'trial_type', + and 'trial_length'. + Returns: + bool: True if criterion is met, False otherwise + """ + if len(trials) == 0: # empty df would return true, but shouldn't + return False + last_day = trials['training_day'].max() + group = trials.groupby('training_day').get_group(last_day) + trial_fractions = group.groupby('trial_type')['trial_length'].sum() \ + / group['trial_length'].sum() + aborted = trial_fractions['aborted'] + criteria = aborted < 0.5 + logger.info("Fewer than half the trials were aborted on the last training day: {} " + "(% aborted trials={})".format(criteria, aborted)) + return criteria + + +def consistency_is_key(session_summary): + '''need some way to judge consistency of various parameters + + - dprime + - num trials + - hit rate + - fa rate + - lick timing + ''' + raise NotImplementedError + + +def consistent_behavior_within_session(session_summary): + '''need some way to measure consistent performance within a session + + - compare peak to overall dprime? + - variance in rolling window dprime? + ''' + raise NotImplementedError + + +def n_complete(threshold, count): + """ + For compatibility with original API. If count >= threshold, return True. + Otherwise return False. + Args: + threshold (numeric): Threshold for the count to meet. + count (numeric): The count to compare to the threshold. + Returns: + True if count >= threshold, otherwise False. + """ + return count >= threshold + + +def meets_engagement_criteria(session_summary): + """ + Returns true if engagement criteria were met for the past 3 days, else false. + Args: + session_summary (pd.DataFrame): Pandas dataframe with daily values for 'dprime_peak' and 'num_engaged_trials', + ordered ascending by training day, for at least 3 days. If dataframe is not + properly ordered, criterion may not be correctly calculated. This function does not + sort the data to preserve prior behavior (sorting column was not required by mtrain function) + The mtrain implementation created the required columns if they didn't exist, so + a more informative error is raised here to assist end-users in debugging. + Returns: + bool: True if criterion is met, False otherwise + """ + criteria = 3 + if len(session_summary) < 3: + raise DataFrameIndexError("Not enough data in session_summary frame. " + "Expected >= 3 rows, got {}".format(len(session_summary))) + try: + session_summary['engagement_criteria'] = ( + (session_summary['dprime_peak'] > 1.0) + & (session_summary['num_engaged_trials'] > 100) + ) + engaged_days = session_summary['engagement_criteria'].iloc[-3:].sum() + except KeyError as e: + raise DataFrameKeyError("Failed accessing columns 'dprime_peak' and/or " + "'num_engaged_trials' for 3 days.\n df length={}, df columns={}\n" + .format(len(session_summary), list(session_summary)), e) + return engaged_days == criteria + + +def summer_over(trials): + """ + Returns true if the maximum value of 'training_day' in the trials dataframe is >= 40, + else false. + """ + return trials['training_day'].max() >= 40 diff --git a/brain_observatory/behavior/data_files/__init__.py b/brain_observatory/behavior/data_files/__init__.py new file mode 100644 index 0000000000..67cbc71759 --- /dev/null +++ b/brain_observatory/behavior/data_files/__init__.py @@ -0,0 +1,3 @@ +from allensdk.brain_observatory.behavior.data_files._data_file_abc import DataFile # noqa E501, F401 +from allensdk.brain_observatory.behavior.data_files.stimulus_file import StimulusFile # noqa E501, F401 +from allensdk.brain_observatory.behavior.data_files.sync_file import SyncFile # noqa E501, F401 diff --git a/brain_observatory/behavior/data_files/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b97a06fee2390688b6117b0241f591224c5fbfb GIT binary patch literal 494 zcmb7BJx{|h5Ve~GRVe)*WFSFeL8u_U#DrKXmdKKIi4C#p*pZzSWkUQGCjL@aCjJ5w zm(X@$>PbGoll-3UJ>Se`hXkwsc!v{8$k#AzYl7ekk3YgDh@hI(G^cdH6FsSeJQ#7H z!#c_%#NmP@(Ko&(30+U`poM#-CE|F|s=Cvi-^|lRZ^{8bCI|TiXf2Hw%d~Ky47Y`s zZUwD%eOky0R?50mpcsEfhEMqpb0|tTteMaE)bN{qMoAY85@-8LpoKqri1bh5BD}`- z^LBgAp3sD6P=QDbcm>n5YXhY<0#2DUE6;3$rc3O$sd~>IRKdJz<#7Y$5?&;7H?d^@ kV#&6#WV<MQ#<?=8<veZr^>kia(P?>!e@gtYUrb~A3vRoemjD0& literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/_data_file_abc.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/_data_file_abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65e41c12bdf3bb73c62d9ed2e927593beeda0956 GIT binary patch literal 3283 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 T$V2)W)uSeRn{L-_d+o}<2x(Lj literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/avg_projection_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/avg_projection_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2e48f70fbf5f66489c245a69e3e4ccaf5a96e89 GIT binary patch literal 225 zcmYL@zY4-Y492hEAVMF+K|8pKh<{db5x0Yq>qUFEUXHt3>FDZfIQdGhK7yN*sUUvv z{SrQskVPE#1nYRaKwF<Jeu}u6u|tQU#YXg_^<DTj{^NaJj^#F>4-#_FLj`BBjhtJ^ z$Z8l#v~`f=(1wgjE^mTd86|_MaNr;-V2`|8mOP=0M0qeaCB+wOsK_^o!W?QtKG9G? ix-%t)1nPb2JRLBr4B2lubj_nXIg&n=IBkD?vBd{S%|qw_ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/demix_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/demix_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34996076a5ff7f9339b497d463b65131147e4b47 GIT binary patch literal 3025 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 Tw@|fUj;=eaUEsp&`91%C0hi<X literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/dff_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/dff_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65e88b6bf4c097956b8a7d9f375feeafbbf43daf GIT binary patch literal 3114 zcma)8TW=h<6&`YCc4t?+tE(>x&~#d$4K_g6L6fvVV;fZ^yG`M&9m_@nLcxF<a=jzX zWld6+R$ZYeBp^TmA;`NQWaO#;puc5a`;@<sr=G*vUD*;)l)!LE9`f+x;djpApW5xF z110<6AAAxx&VR5oD;_ld2%o-yN;ra~4y*ozQRvgu%{=C1KJy8VyJ;<}v$}1QG++UY zd1)hSvSzlx7VNm6wz4*BPv>;lBFw3!OW878wqx~lC0k{y#F1+vcuhn@G|xPCL*5h% z&})e{^ltsx5goC3=7>ePdg`*<f^0k8r5^#M)9=#K+e%_n`p@&E$h)NUo^UgS;abe& zp%i8C=;`xKY=W#l<a)R-$Ix7PQfTu+N&V%4RO2s_qXZWRTio!6Ns5yj0`x{oj#Nx> zFDUp&Gi}1BJ5U+NkPA8?Z^$WvBK@wb>M&k<d%DO=UmRp34Pe|j)e24jFGu0JpZ>o2 zhn?qID!s#pT=aJNA<xG<8##}QT=0)~Wd2I;6eF4I80um)9P6D&$?lF$jQq`r$NT(+ zgtci3GsOO#UB#0;Dt1BRD{cxkzOyTb{8dt@I|5D=4d6)nju;GVt2Y{#s{>VJ5u%K& zp&~HL5+Kv|tVCfOjIe6Aj^xousw9)Si4qaJAj5)xoNmnlbOLis=*$qr8UpOm20=;1 zu3CnMJ$+Rz;&=rkO)`B6V+{l|7^~2Z;hUG*w59(I4e2l<9AGD5uJoiYYXiCtOnpth zbp}MZ!aHlRx(sAPHia*0=R_`u`Z<*?;9>BZR(v~!%VTZXf%U#!f62YYch)Z1wac*6 z%5)|$^R+7$#nPE)wXDjuOC0jX-c7L#yR3*+l(Spk0(;nPAj(=<-+K5EiFW*CBb<>g zJRBzRFa!!1xK15r(hLis!$F}!9>-GaB!3a|T!d-C1+<$X6i^fz#X;P&eWWqo_Xzyp z9p>V7;ip%iGR~>9M<zs&bAql2plH8K)D4gUVSRl7H(mx&l;nwtBJ?vY(?KN%=ZK;> z<yuG4<z=c{u=Z!TLB*ltrRf=aGc7-&3jn@)#*cJzEO8^tzS2dnq}D~snv&)~<#X&a z+?%Kxu_Nkr=Y&pxZi1ep=ehkdn9+NB3JYw?Kdabcze>Qy+z&!jkKXOL0XbftVV}!E z?fW2%2~L56e}raXp;HS2{0F0+k^~{qzWO<gqW5c~riN3uVdyG`x+$zD{u*R6+bz!a zpUU7Mc=XDNEDqcoix1yCDE$&Tf?R-M-jEY_Lg0#BL4|uxPdqS}Cp>E|zt8^(_$^<M zL$k8|;L(H4XW`-gpr;{>K#++<qGXIAC7evG0J)X(OokiV;mqXM6g_<U_>1sr?9gE$ zug(1H<Inryp-j_gKQ9jRDpcV{;bRyFAlw)T-+VWf5PQOVpre<F|4U6|#v`dwiMckv zQf@#MsKjlqK(K3J!)pt_`pbi-53J6fwZgsdgU1-2w+4e}=!NLiA6#3t(ch|o!)|{& z`Rtnf8F)nvXaXtc(g|ze_!&1W7)TQji(Gbn8%-~nQ2H-1ef<w+V`%LHDYOloohIpA z<+hzcD;4h$9EsI{&k}q94dYyp3DD~e{qD&LF?0_ICLrKK%d-@thF;*9x9%YQjK5a{ z`uU~~q1Qd}pdX032t?xy2)gB<qW~qF=XBfo(s}B9UB#h=eo0j6Vd4U-_yTXSY^WlM z(BPUa#K;!xCj#RVjw(DObAgX@|HL4KKC%s;#&q@qyz`sj1cKi8^rg4`mK%Z=+WV*^ zM^`-ar{>)>(Izgk(ftingF0)@@vmmiiE%hWpuM|k5%W~vhsJCLf=_ZGkGhT08-5B& z*F$oYG#{}#*IX$+X7vH+Fu(hxq$9!n&vAO`Cb=maHY+GN8{9fZWfmxYXx)R=s(7zH zgkhL1uHr5mb6}q#Z2Rb=9kK?uzx3Aq&u4YlG1Q|Wqo`~~QC5fp@VBUJMbXOxo=zq8 zC=x{sF(2)!et{K69vk?}1)C76oTZRE3MpqF5^$M7Y!zZ3O{g$TDa`E(pAG60tT6hO zEp50-;;EL8ar{%PeviWTH0jv;pC%p*yx=kGI0;`A3SSQxWc7Pc1+GWmb158p&AW+z zN=cKfv?;Oky6b8IW-&j9ciLF}7TRSE=mx2^!incB>zGN?WVbr&N4TJAvz93ec-GC2 z$`&t2dyvnxeF3rB2r@R;3J=3>%${sLxMQhup7!`Cu~uNcx$N3=t~Yzm^^j~;j8y2G v>K<0e?#hVPrf7n<n2aW}wkd<V)y3Y&+@;Y<0SUl3Ejq1fi?rO1*YW-f#hB_f literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/event_detection_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/event_detection_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3ae95227206851a4dda1576b403c3db08ace7b0 GIT binary patch literal 3158 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 K*I9Cx-2VgBxDh7+ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/eye_tracking_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/eye_tracking_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..181501caf88568d3a804c30e3282b740f52d756d GIT binary patch literal 2535 zcmaJ?OK%%D5GJ{+rzKf&;v^2*Vh=3>9V#DsYuci2qV$2pPGbiF76J%rNkwb#Lm}63 zWXOlY2GUDzz12PS)IZW6vDcpZ7kcUpSF#f+2?bH3;c)oP$C=@G&1Rjzi2wXWJgE@! z5B`}C7ld!&Yeq0hB56co>eHC{jN*S5IkD@zR(7J2Uk05URpP2&wYpMNi|c;f%H?P! zZuku=SE6Rz@>`UAPh?fr&WNn3)~VyKN@tgJ>i@!Nq{DLeUKnI~=}8i%Nr&d{Baw}^ zL0FGcA-S3;o@o&rgvm2Ll0#Tndz6~&nO5fKL!~DV!<QlMYa20C+)PZSVm<~RpsU^! znYbTDD!{YmqcjuDZy+e*Q%QU#sqZLPl~j4iHX!D6`icyxbfkOM@GGjSY7lkloXN7R zoVlmeud5ZXE?Mj9Ih8e8KXd&CST?~=Yqmn<%DE#OvT66Ms`lj>>dO9_Y=OsB*|w`! zUlEu1*MOTV`D$;X_GV#Y0LM?aym>I*(I^Z?UXUi42ovMQDjTKJc*9hCA_$Z*z?CNw z=^=w4*F6|Oq&FwhlfX;Ys*$B39Ds}kY{m@!I<v1?10f@)WS>r{q^~L7EnsADM;em~ zuCQbd$4ci_&ch_kILBKxDjF8+G_P?UM8X)(|04hWdiTrz6Qi{0i;<AsfjAP$q`#F2 z2uO-A`YL&0`sr9DCV)8|k0z%7ARP2fn5oalkO|_Mg1u1$7V=<opn(LQ4#49Jk)?XF zIZz|<B24urM#(Wav-wsUp{hHc=mwz2=!}h<9^YIbz57NyH3?bDwHoWZtW|cXlMA-y zOx;CS=nr|?ASY}}rcAQe6xedM^YtYRMV4BU^eXJ@IJpx<MqdH>QfrrV8+3VXsMDD5 zn>1O6zXl7Juqr*?SOk7y2X};s0*a<E@E7q~tSt~E&Bzq)_LPQ*lWps(poI%`Or~e| zr<<TEU?9u_OC?J!l3Spe6L@10$IJ!-V{(vRwU^1&OGuV5R!PP~S-?X`IIuJ^DhuyZ z5G0+l-=Q4;a88^l-6vBAOY${4ae-V{mMppDZSgk*X7d?SeLi-34|;d^yrY9**Fa`K z-f$Ue6=0Tl)2Us+Tu4N$yscd<k;`6#3rimFKi+xhEk<FyblLJj@BW_m)6S3E-jRwT zevqU`Ns)_qthWPtfF-g_1S2ts6j0%P4UW2ncY{@&CZJuy@Ghr3n~aq~m)YF)!m-w( zI0UV_?{NI|hu-7fA}n+az;5qg9qtyWZZBa%#<#ZbSpZ#2Cv15m8N6N;g<}Zn{aYb) zOTqElohA2s(51?dk5Gd1rbGSeP-Vd=O;o3(uR*Hln>cO2l$W04%kY5`io)1@43?%0 z6KOVR>wQIpmK|2OdVeM13f2+!#}ks#DLE~w34qrylQ@zBe&FpT8nb*B$6{60?4xJf zGZ@V(yv~*@{KBrYj(r#1bDq~Zk5hRF=kdJ3`SU{&%~mR$%QWCzW2x!uIANjL9+<D# z?p(Yhxr?1nV}sGy7xfLCkf+=UlT3evQp02-3xnAXHkN+PzD^oo=ugn1Icxa=W<S3S z6XM3UV|$3MfrP!qAfBq@vRe+LYwmT2F-GgO-DK3-blQ0t5)q!V0usiMSFn9X;lRe> zm&fqn38Qbrl7DCZI&_y_hwl7!=)P6$W1Y?(PJ284`h^FGS?NSXT`>+V4gP1#YeA}2 z7gL2FW?>X&p)&TW{qBYB2asI8Q@RT9ZOE656_V}$)vt=%{RZ2(K_1(*!K$pm8WcXx E|B(xmTmS$7 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/max_projection_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/max_projection_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3477f1c01ccfc5fed3e0f5a294632c27d88666c5 GIT binary patch literal 225 zcmYL@zY4-Y48~7z5Wxp=&<<`Q;-6Jq#O<KudeNS3FUMW2c69YMoO~r$AHmJZR1iP- zehD8*$fDQl3RZEuKvSO$erj<uV}~|Fi;d{F)_38X_>cE>IhNaiK1fJG4;7ri)^ctk zA**2|(N;l{LmLt%xwH;)Wt0r2#DRk(gFW(Yp7VsxBIUu@m=s^Epd?>M3R9>I`A9<v i@y_HJq5{sb^K`(ZG-SWw(AAI5q#%9FaoYU&Vv7$-2t)7y literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/rigid_motion_transform_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/rigid_motion_transform_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b70731204a35a748ba4a9b122286c703ed6c4453 GIT binary patch literal 3058 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 S5xiEh@h;jG0+&;DtM1=Kd<7Q( literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/stimulus_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/stimulus_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0fdee1ea585c3db6f29300db1de7dc10ac31d21 GIT binary patch literal 3032 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/__pycache__/sync_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/sync_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63906e75b4282408e468afc8960a2bad7d91f789 GIT binary patch literal 3081 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_files/_data_file_abc.py b/brain_observatory/behavior/data_files/_data_file_abc.py new file mode 100644 index 0000000000..bb92028980 --- /dev/null +++ b/brain_observatory/behavior/data_files/_data_file_abc.py @@ -0,0 +1,94 @@ +import abc +from typing import Any, Union +from pathlib import Path + +from allensdk.internal.core.lims_utilities import safe_system_path + + +class DataFile(abc.ABC): + """An abstract class that prototypes methods for accessing internal + data files. + + These data files contain information necessary to sucessfully instantiate + one or many `DataObject`(s). + + External users should ignore this class (and subclasses) as as they + will only ever be using `from_nwb()` and `to_nwb()` `DataObject` methods. + """ + + def __init__(self, filepath: Union[str, Path]): # pragma: no cover + self._filepath: str = safe_system_path(str(filepath)) + self._data = self.load_data(filepath=self._filepath) + + @property + def data(self) -> Any: # pragma: no cover + return self._data + + @property + def filepath(self) -> str: # pragma: no cover + return self._filepath + + @classmethod + @abc.abstractmethod + def from_json(cls, dict_repr: dict) -> "DataFile": # pragma: no cover + """Populates a DataFile from a JSON compatible dict (likely parsed by + argschema) + + Returns + ------- + DataFile: + An instantiated DataFile which has `data` and `filepath` properties + """ + # Example: + # filepath = dict_repr["my_data_file_path"] + # return cls.instantiate(filepath=filepath) + raise NotImplementedError() + + @abc.abstractmethod + def to_json(self) -> dict: # pragma: no cover + """Given an already populated DataFile, return the dict that + when used with the `from_json()` classmethod would produce the same + DataFile + + Returns + ------- + dict: + The JSON (in dict form) that would produce the DataFile. + """ + raise NotImplementedError() + + @classmethod + @abc.abstractmethod + def from_lims(cls) -> "DataFile": # pragma: no cover + """Populate a DataFile from an internal database (likely LIMS) + + Returns + ------- + DataFile: + An instantiated DataFile which has `data` and `filepath` properties + """ + # Example: + # query = """SELECT my_file FROM some_lims_table""" + # filepath = dbconn.fetchone(query, strict=True) + # return cls.instantiate(filepath=filepath) + raise NotImplementedError() + + @staticmethod + @abc.abstractmethod + def load_data(filepath: Union[str, Path]) -> Any: # pragma: no cover + """Given a filepath (that is meant to by read by the DataFile type), + load the contents of the file into a Python type. + (dict, DataFrame, list, etc...) + + Parameters + ---------- + filepath : Union[str, Path] + The filepath that the DataFile class should load. + + Returns + ------- + Any + A Python data type that has been parsed/loaded from the provided + filepath. + """ + raise NotImplementedError() diff --git a/brain_observatory/behavior/data_files/avg_projection_file.py b/brain_observatory/behavior/data_files/avg_projection_file.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_files/demix_file.py b/brain_observatory/behavior/data_files/demix_file.py new file mode 100644 index 0000000000..69aa81958d --- /dev/null +++ b/brain_observatory/behavior/data_files/demix_file.py @@ -0,0 +1,66 @@ +import json +from typing import Dict, Union +from pathlib import Path + +import h5py +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +import pandas as pd + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import DataFile + + +def from_json_cache_key(cls, dict_repr: dict): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key(cls, db, ophys_experiment_id: int): + return hashkey(ophys_experiment_id) + + +class DemixFile(DataFile): + """A DataFile which contains methods for accessing and loading + demixed traces. + """ + + def __init__(self, filepath: Union[str, Path]): + super().__init__(filepath=filepath) + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) + def from_json(cls, dict_repr: dict) -> "DemixFile": + filepath = dict_repr["demix_file"] + return cls(filepath=filepath) + + def to_json(self) -> Dict[str, str]: + return {"demix_file": str(self.filepath)} + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: Union[int, str] + ) -> "DemixFile": + query = """ + SELECT wkf.storage_directory || wkf.filename AS demix_file + FROM ophys_experiments oe + JOIN well_known_files wkf ON wkf.attachable_id = oe.id + JOIN well_known_file_types wkft + ON wkft.id = wkf.well_known_file_type_id + WHERE wkf.attachable_type = 'OphysExperiment' + AND wkft.name = 'DemixedTracesFile' + AND oe.id = {}; + """.format(ophys_experiment_id) + filepath = db.fetchone(query, strict=True) + return cls(filepath=filepath) + + @staticmethod + def load_data(filepath: Union[str, Path]) -> pd.DataFrame: + with h5py.File(filepath, 'r') as in_file: + traces = in_file['data'][()] + roi_id = in_file['roi_names'][()] + idx = pd.Index(roi_id, name='cell_roi_id', dtype=int) + return pd.DataFrame({'corrected_fluorescence': list(traces)}, + index=idx) diff --git a/brain_observatory/behavior/data_files/dff_file.py b/brain_observatory/behavior/data_files/dff_file.py new file mode 100644 index 0000000000..f36f3962af --- /dev/null +++ b/brain_observatory/behavior/data_files/dff_file.py @@ -0,0 +1,65 @@ +import json +import numpy as np +from typing import Dict, Union +from pathlib import Path + +import h5py +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +import pandas as pd + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import DataFile + + +def from_json_cache_key(cls, dict_repr: dict): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key(cls, db, ophys_experiment_id: int): + return hashkey(ophys_experiment_id) + + +class DFFFile(DataFile): + """A DataFile which contains methods for accessing and loading + DFF traces. + """ + + def __init__(self, filepath: Union[str, Path]): + super().__init__(filepath=filepath) + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) + def from_json(cls, dict_repr: dict) -> "DFFFile": + filepath = dict_repr["dff_file"] + return cls(filepath=filepath) + + def to_json(self) -> Dict[str, str]: + return {"dff_file": str(self.filepath)} + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: Union[int, str] + ) -> "DFFFile": + query = """ + SELECT wkf.storage_directory || wkf.filename AS dff_file + FROM ophys_experiments oe + JOIN well_known_files wkf ON wkf.attachable_id = oe.id + JOIN well_known_file_types wkft + ON wkft.id = wkf.well_known_file_type_id + WHERE wkft.name = 'OphysDffTraceFile' + AND oe.id = {}; + """.format(ophys_experiment_id) + filepath = db.fetchone(query, strict=True) + return cls(filepath=filepath) + + @staticmethod + def load_data(filepath: Union[str, Path]) -> pd.DataFrame: + with h5py.File(filepath, 'r') as raw_file: + traces = np.asarray(raw_file['data'], dtype=np.float64) + roi_names = np.asarray(raw_file['roi_names']) + idx = pd.Index(roi_names, name='cell_roi_id', dtype=int) + return pd.DataFrame({'dff': [x for x in traces]}, index=idx) diff --git a/brain_observatory/behavior/data_files/event_detection_file.py b/brain_observatory/behavior/data_files/event_detection_file.py new file mode 100644 index 0000000000..1956b045d8 --- /dev/null +++ b/brain_observatory/behavior/data_files/event_detection_file.py @@ -0,0 +1,73 @@ +import json +import numpy as np +from typing import Dict, Union, Tuple +from pathlib import Path + +import h5py +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +import pandas as pd + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import DataFile +from allensdk.internal.core.lims_utilities import safe_system_path + + +def from_json_cache_key(cls, dict_repr: dict): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key(cls, db, ophys_experiment_id: int): + return hashkey(ophys_experiment_id) + + +class EventDetectionFile(DataFile): + """A DataFile which contains methods for accessing and loading + events. + """ + + def __init__(self, filepath: Union[str, Path]): + super().__init__(filepath=filepath) + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) + def from_json(cls, dict_repr: dict) -> "EventDetectionFile": + filepath = dict_repr["events_file"] + return cls(filepath=filepath) + + def to_json(self) -> Dict[str, str]: + return {"events_file": str(self.filepath)} + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: Union[int, str] + ) -> "EventDetectionFile": + query = f''' + SELECT wkf.storage_directory || wkf.filename AS event_detection_filepath + FROM ophys_experiments oe + LEFT JOIN well_known_files wkf ON wkf.attachable_id = oe.id + JOIN well_known_file_types wkft ON wkf.well_known_file_type_id = wkft.id + WHERE wkft.name = 'OphysEventTraceFile' + AND oe.id = {ophys_experiment_id}; + ''' # noqa E501 + filepath = safe_system_path(db.fetchone(query, strict=True)) + return cls(filepath=filepath) + + @staticmethod + def load_data(filepath: Union[str, Path]) -> \ + Tuple[np.ndarray, pd.DataFrame]: + with h5py.File(filepath, 'r') as f: + events = f['events'][:] + lambdas = f['lambdas'][:] + noise_stds = f['noise_stds'][:] + roi_ids = f['roi_names'][:] + + df = pd.DataFrame({ + 'lambda': lambdas, + 'noise_std': noise_stds, + 'cell_roi_id': roi_ids + }) + return events, df diff --git a/brain_observatory/behavior/data_files/eye_tracking_file.py b/brain_observatory/behavior/data_files/eye_tracking_file.py new file mode 100644 index 0000000000..e8a281b786 --- /dev/null +++ b/brain_observatory/behavior/data_files/eye_tracking_file.py @@ -0,0 +1,50 @@ +from typing import Dict, Union +from pathlib import Path + +import pandas as pd + +from allensdk.brain_observatory.behavior.eye_tracking_processing import \ + load_eye_tracking_hdf +from allensdk.internal.api import PostgresQueryMixin +from allensdk.internal.core.lims_utilities import safe_system_path +from allensdk.brain_observatory.behavior.data_files import DataFile + + +class EyeTrackingFile(DataFile): + """A DataFile which contains methods for accessing and loading + eye tracking data. + """ + + def __init__(self, filepath: Union[str, Path]): + super().__init__(filepath=filepath) + + @classmethod + def from_json(cls, dict_repr: dict) -> "EyeTrackingFile": + filepath = dict_repr["eye_tracking_filepath"] + return cls(filepath=filepath) + + def to_json(self) -> Dict[str, str]: + return {"eye_tracking_filepath": str(self.filepath)} + + @classmethod + def from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: Union[int, str] + ) -> "EyeTrackingFile": + query = f""" + SELECT wkf.storage_directory || wkf.filename AS eye_tracking_file + FROM ophys_experiments oe + LEFT JOIN well_known_files wkf ON wkf.attachable_id = oe.ophys_session_id + JOIN well_known_file_types wkft ON wkf.well_known_file_type_id = wkft.id + WHERE wkf.attachable_type = 'OphysSession' + AND wkft.name = 'EyeTracking Ellipses' + AND oe.id = {ophys_experiment_id}; + """ # noqa E501 + filepath = db.fetchone(query, strict=True) + return cls(filepath=filepath) + + @staticmethod + def load_data(filepath: Union[str, Path]) -> pd.DataFrame: + filepath = safe_system_path(file_name=filepath) + # TODO move the contents of this function here + return load_eye_tracking_hdf(filepath) diff --git a/brain_observatory/behavior/data_files/max_projection_file.py b/brain_observatory/behavior/data_files/max_projection_file.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_files/rigid_motion_transform_file.py b/brain_observatory/behavior/data_files/rigid_motion_transform_file.py new file mode 100644 index 0000000000..4349bc27c5 --- /dev/null +++ b/brain_observatory/behavior/data_files/rigid_motion_transform_file.py @@ -0,0 +1,62 @@ +import json +from typing import Dict, Union +from pathlib import Path + +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +import pandas as pd + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import DataFile +from allensdk.internal.core.lims_utilities import safe_system_path + + +def from_json_cache_key(cls, dict_repr: dict): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key(cls, db, ophys_experiment_id: int): + return hashkey(ophys_experiment_id) + + +class RigidMotionTransformFile(DataFile): + """A DataFile which contains methods for accessing and loading + rigid motion transform output. + """ + + def __init__(self, filepath: Union[str, Path]): + super().__init__(filepath=filepath) + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) + def from_json(cls, dict_repr: dict) -> "RigidMotionTransformFile": + filepath = dict_repr["rigid_motion_transform_file"] + return cls(filepath=filepath) + + def to_json(self) -> Dict[str, str]: + return {"rigid_motion_transform_file": str(self.filepath)} + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: Union[int, str] + ) -> "RigidMotionTransformFile": + query = """ + SELECT wkf.storage_directory || wkf.filename AS transform_file + FROM ophys_experiments oe + JOIN well_known_files wkf ON wkf.attachable_id = oe.id + JOIN well_known_file_types wkft + ON wkft.id = wkf.well_known_file_type_id + WHERE wkf.attachable_type = 'OphysExperiment' + AND wkft.name = 'OphysMotionXyOffsetData' + AND oe.id = {}; + """.format(ophys_experiment_id) + filepath = safe_system_path(db.fetchone(query, strict=True)) + return cls(filepath=filepath) + + @staticmethod + def load_data(filepath: Union[str, Path]) -> pd.DataFrame: + motion_correction = pd.read_csv(filepath) + return motion_correction[['x', 'y']] diff --git a/brain_observatory/behavior/data_files/stimulus_file.py b/brain_observatory/behavior/data_files/stimulus_file.py new file mode 100644 index 0000000000..aa818d8654 --- /dev/null +++ b/brain_observatory/behavior/data_files/stimulus_file.py @@ -0,0 +1,73 @@ +import json +from typing import Dict, Union +from pathlib import Path + +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +import pandas as pd + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.internal.core.lims_utilities import safe_system_path +from allensdk.brain_observatory.behavior.data_files import DataFile + +# Query returns path to StimulusPickle file for given behavior session +STIMULUS_FILE_QUERY_TEMPLATE = """ + SELECT + wkf.storage_directory || wkf.filename AS stim_file + FROM + well_known_files wkf + JOIN + well_known_file_types wkft + ON wkf.well_known_file_type_id = wkft.id + WHERE + wkf.attachable_id = {behavior_session_id} + AND wkft.name = 'StimulusPickle' +""" + + +def from_json_cache_key(cls, dict_repr: dict): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key(cls, db, behavior_session_id: int): + return hashkey(behavior_session_id) + + +class StimulusFile(DataFile): + """A DataFile which contains methods for accessing and loading visual + behavior stimulus *.pkl files. + + This file type contains a number of parameters collected during a behavior + session including information about stimulus presentations, rewards, + trials, and timing for all of the above. + """ + + def __init__(self, filepath: Union[str, Path]): + super().__init__(filepath=filepath) + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) + def from_json(cls, dict_repr: dict) -> "StimulusFile": + filepath = dict_repr["behavior_stimulus_file"] + return cls(filepath=filepath) + + def to_json(self) -> Dict[str, str]: + return {"behavior_stimulus_file": str(self.filepath)} + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, db: PostgresQueryMixin, + behavior_session_id: Union[int, str] + ) -> "StimulusFile": + query = STIMULUS_FILE_QUERY_TEMPLATE.format( + behavior_session_id=behavior_session_id + ) + filepath = db.fetchone(query, strict=True) + return cls(filepath=filepath) + + @staticmethod + def load_data(filepath: Union[str, Path]) -> dict: + filepath = safe_system_path(file_name=filepath) + return pd.read_pickle(filepath) diff --git a/brain_observatory/behavior/data_files/sync_file.py b/brain_observatory/behavior/data_files/sync_file.py new file mode 100644 index 0000000000..dab04f9f71 --- /dev/null +++ b/brain_observatory/behavior/data_files/sync_file.py @@ -0,0 +1,71 @@ +import json +from typing import Dict, Union +from pathlib import Path + +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.internal.core.lims_utilities import safe_system_path +from allensdk.brain_observatory.behavior.sync import get_sync_data +from allensdk.brain_observatory.behavior.data_files import DataFile + + +# Query returns path to sync timing file associated with ophys experiment +SYNC_FILE_QUERY_TEMPLATE = """ + SELECT wkf.storage_directory || wkf.filename AS sync_file + FROM ophys_experiments oe + JOIN ophys_sessions os ON oe.ophys_session_id = os.id + JOIN well_known_files wkf ON wkf.attachable_id = os.id + JOIN well_known_file_types wkft + ON wkft.id = wkf.well_known_file_type_id + WHERE wkf.attachable_type = 'OphysSession' + AND wkft.name = 'OphysRigSync' + AND oe.id = {ophys_experiment_id}; +""" + + +def from_json_cache_key(cls, dict_repr: dict): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key(cls, db, ophys_experiment_id: int): + return hashkey(ophys_experiment_id) + + +class SyncFile(DataFile): + """A DataFile which contains methods for accessing and loading visual + behavior stimulus *.pkl files. + + This file type contains global timing information for different data + streams collected during a behavior + ophys session. + """ + + def __init__(self, filepath: Union[str, Path]): + super().__init__(filepath=filepath) + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) + def from_json(cls, dict_repr: dict) -> "SyncFile": + filepath = dict_repr["sync_file"] + return cls(filepath=filepath) + + def to_json(self) -> Dict[str, str]: + return {"sync_file": str(self.filepath)} + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: Union[int, str] + ) -> "SyncFile": + query = SYNC_FILE_QUERY_TEMPLATE.format( + ophys_experiment_id=ophys_experiment_id + ) + filepath = db.fetchone(query, strict=True) + return cls(filepath=filepath) + + @staticmethod + def load_data(filepath: Union[str, Path]) -> dict: + filepath = safe_system_path(file_name=filepath) + return get_sync_data(sync_path=filepath) diff --git a/brain_observatory/behavior/data_objects/__init__.py b/brain_observatory/behavior/data_objects/__init__.py new file mode 100644 index 0000000000..86159ca35e --- /dev/null +++ b/brain_observatory/behavior/data_objects/__init__.py @@ -0,0 +1,9 @@ +from allensdk.brain_observatory.behavior.data_objects.base._data_object_abc import DataObject # noqa: E501, F401 +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.behavior_session_id import BehaviorSessionId # noqa: E501, F401 +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.ophys_session_id import OphysSessionId +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .stimulus_timestamps.stimulus_timestamps import StimulusTimestamps # noqa: E501, F401 +from allensdk.brain_observatory.behavior.data_objects.running_speed.running_speed import RunningSpeed # noqa: E501, F401 +from allensdk.brain_observatory.behavior.data_objects.running_speed.running_acquisition import RunningAcquisition # noqa: E501, F401 diff --git a/brain_observatory/behavior/data_objects/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5aa4cea3f7fa0746a4422654588462117a5abcc0 GIT binary patch literal 977 zcmb_b&2H2%5O(&z+ifNK7JFze+$w}<K}bkdD|O*wS+XXv)it%9;BglA$Sd@~JMc=q za^e*@G0vuRQ6;2Bbrk2Dar}MG%$Ku+gDInNc>4{G`;7fa!TsnFcttm!)1;WnEOQyp zvV?oK=lZ<g;=UcYAs@DQU`KAu$1NV(iQD6QEgspa+vod)#|t)}{3J#;&+evgAi`zw zQJ0aTXJ>i|D^rDqMl_Xwrzm-NSufYPojF=W;~LxGd*d`la5d6<v#Z8?<F6OB)@k2S z7oV1&8iOVh-^F~!--5N;qq@n90LIIzKpj>PtFX?CPCi$3Dq2a$!n^>~x!g)gD9VtE z!{yFoPDe;of3)P|3~s(&8WpG|jH~}wsZ#Bv{!;5ewes;nZL_i^HAqtB&QjEht_L}G zZIS=Zg<(=U-&rYa`YSOtIR7gOqeOZ2M3nI0m@p>d?<`E{(N4d<zCIBj$TBEk35v|| z8T?wDdMGQe;JMI#g`%p-VkOOOm4!8hAP4H>8p<2E*0i@Xp?G9Mac@Gg<v0{l8gHVM adA+`yyl|CjtbUo%sWAP&vuxIDuk1J3s8GoO literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/__pycache__/licks.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/licks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ebb656f59958ef326eb6c2c1b3945b1d15ab1df GIT binary patch literal 4047 zcmbVPNpBp-6|U-S7S52P5v`b6JIrDaA`J!jMhJo}8#W9mlo2v8(4f<->8c@n*vq)8 zh7^fmkc14Jiw?Q#AR(vxrM~9mzu-&qUUl~jX)1t{Cc37&mRE22-dB%Ly4^N`C;i8t z*^llL@-O_Tp9XY3gjf9q8csM(NPxdqLQ^ZSXgOvF4vg7}n|gtlHiAal44P)nNm^+; zXq tfZZwlXioy`Sz04bS+p*dqK~9H<CMPKj>5P8R1Rdx+1(KI$}-qME}wY?sB?I z2JLS_53)0$Mf2HI$9cw*fn79qzI^g&oQR^m7pG!Z$XKYN_l3+Op;Vk5{x;{cM8Kxb zu8z}LGE=yEU={68m}bvL6A|g6U(cZorCB;vu;M56DDL>3V4RH-@p-0&9J5Fi>pQ2T zTcdCgj(;g*ePeZmy4R0ebyNZ!K?2H2U<vz`BgktSxWbz>IDJXKA!EudZeMkRrf7+_ zSOHHvFKzB}@5;HPK?g>=VwIB(!W%Cw<2f8(gVC-TY4epUC+K}c91`3CA9f1&X&fCZ zP}5DY6Iqom`0K!H!>iVz(d3d$D5rDK;RQz9hW!p(r-Zcq>e-$$$x`1)S`6YG2j7li zO88NpX%=S?311%xf1D>teu`gFp3KrrZQt03dms1^s45EE{y52*zO@F|sVbh=miuw$ zpB}~05uPQ5f6A24jC!{uJn)Tv+py)$;!E|jSvnH(E#%5B_zXbfWMFmSp0H#lcHrAp zv#F3pGYr8AIt+1%63Mt+Pm5L<MhR0Y4F5^K`{T#k`@dI0s(p6E_;AEdS$4MnQO3ZF zoPDq_vJ<tRPerC8X!GgOnc9CEkM>op#e*q}j@hAry-5Nq`0>_Ag6G401QJh}&gI$G zNF1?~IG0-(Aece)t1T11;q*-20UPci01PTx=c@)R!-ej4(XG86jxp)(E<TqrD?BOm zOlA>62_Ga9guH>)pP)0R6LMkCZB7BW7Q8mR4!rILxo|X{1BkhE?8v>j!@Uin>EFo2 zx}?XJ8EJ6uudwUFnUe`54R5}tl$c~`@%B}7?tDTn>4mG^SKizO2`ewH*Yv`hlexz` zFOW*Q>?=^_GocMO3|avWdFoG(6CVv5F7UE<6f1u`%OYeP9|AQ4Yy!NPF7X^orF{kd z&J9Ws<4Fud`FJ4$-5Zumln>Hy4Hqhwf|uu)bHnyx$8MZOC<hYMk67mCQ8bf&KGQ1Z z0z?C-wTxL}vP(SI_l-<kUnavs5Q8LudC4LThZz&`^b>WKMUWa9FO4vnx`g_H(O8^_ zOsj*XD@v_SLHRs;Py2u*fr`}03b`#I`$UG>vMHVe>|rVcKf%u?9<)%)oDT^s1+WM3 zt<=hY-)M)aF+3DHd;_os_kB1#%G2pgFJ;BrADuzav_@9JY|jLfz7&TNZvY4yNJb{A z?0atX85nJ^>vUlB2#sG4jB5@=#_R9W8E6^$@4&1Ill<@iT%SWQW=n-;Q(U8jIj1sG zT?_7ZnI3A}pYkDILZ6~~3*R8M?VaWee)Knu|G;)bY!#oDD8ewBV{YsQe4vsgd<;?z zeh_X(e}JH>T!RSMH165Fe?tZexb8NEsCx^E3n7IIoRq4dSyN8XF{rBYK*BXbf|YAP z`}W`P?3{lnMVg;rW-!PioQDemVmuZ}ay<jyfDd1?>`+7~8K3$_gSv(&WVJ&wCts~z zAejIKZIHiPUpu=*;$=6Wat(j1!Wup-Tw^(m{Q$<yynF|G-?blMY9jz2KZ9?>k{&s~ z{}dB-i1=N?*09K<B#&649uJor;fVGkWt99eo=VHhpiwwT%Y_Z}ZPY0m2(d%BK3pMX zE(>eQi`D`%gGOOTiIQkrsp`+5S2@*~pn|sXusN`>__#LK7=|_#{o88)9L7xvK-N90 zPrbDc?b8nJxP98A=kNYEYr(Qcb~-}C<+~taQCige|1rw_12kAvOvte(AK@?F0vFcY zdIg0B@HE^D6AKC*QgOUJu@_%%);t8>hu784E8zCI%k69I?ihA=cZvp@4SZ1D%JQdh z>J49eMSHra5raN5j=2({8Ys)Vatk_C{sNm{LNjQ{Ut#}!Xeu|Sro1%AEDw>t##M-` zC3uRaaWpt+7sd@9iPfg~w@Q1KLmhZ6+P3RUw_d(*BUWeVO5?@=IvVhd71{<|cie)@ z@!lLRHw_hIJw7RWaJ7OHp=#uf7w(0n;mYK#OAB2MP6Ve@$OpJA?Xrip_KxwE$<n29 z=TG)(vM(=>Itl$La4k?hGnZt^8*#>CsKE`-Vl@1cLeK4;t&aw-Tm=K9aWBTESb+;M zlCi1l3ugwUk{rPJ`6i+biM^%~II1q~{nGgm6(5CR0!wsK;hE}7Nh~^oKI8m*u?^nA zv8AA}66DA}$}r(wL!CpDIOczfpoIepmwrF8p3XyvtAM@ghtLp66vwhKn(${?O~;`g z_O0^{nxls0hCv_8LaZ0VuxN*s7SQj6;ny>kR5K0a0B}Lk0+c>Ad>}DJm$)=_Td`v5 z$W-VfP|?E$O>Ex7#>NH-QT_&-Eoh2vRe46htYNq`3g`$a(@>u5Ko6awdeAhjwza;3 zhV>s>^xhpaJ6M+=z+B<!vnggAo)UOdxLKGoDhBTK4BS)dfbl8gGOWwg;jJ=tSO<G( zauOLu8H<94Z@sCiZ6#)maYXR>|GF3IZzYCMqnLmEpnk8YLCF>h#s8fDU!kYf|A*Iw muAor#_c9dM>Elre(#LqcDGW)IcC02{w>m%{J-g%f=zjp(qGr$l literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/__pycache__/motion_correction.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/motion_correction.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66fe38a1f11db71ad3e2eeb928182149e013e730 GIT binary patch literal 2440 zcmbVOOOG2x5T5RNcszb&vsscg0b*VUBjF`*TOkBl1Oz1;DG7=+vedMv+q<)whtoaY zU9Y?cltqz{@(*%I#EHK&S5Eu|PE@rY`*1+ONK>w^>aMQ->gyWcYBT~1p7htB_?@a{ z{f>kAQvu~mc=Z5;umnl0kiaiZXljRc>VytKyPdeH7kWl_l1l1_zR}&Jng(Hz*20<@ zdr3WQgbiYSYl({RPb}d}Uk0)!8&AEkDaZq>Q~d+>vbH<4tZYBJ^-Y|}GI$uL@_|&b z)E!c;-;Z}<aW^mGJbS2krU$u7aUS@BuX(}m_4i~{K!6sG&~smM!TX84ofT3IcqGfU z?SuZ36#}6Bk&26Rvm?xC{x~y5{|JgSc!X4t(3Z}gE9eXI%o-433+JRBda@#Yz{h<- zg(oT}&QlUr!4`nc2U}GH##RFi0%NI(`iT?PpIMF-HUN!AxiUTJR<0DB3eJ4Ao|?0_ zqlKxRkBZ@_fc!5{eeBd1(OJUyi^<#Y>NOCB_0-xUf=q~@&nXnhh7FygCqaAmY!12N zX?rQ;Vgk<F%9Bx=>CJOSbR2HB2T9J0CCB)pLm>m9UQWhSS-Sf?8A&97t4BkrN}sVf ziwnkZik8V>I-itP#-fC4&Dd|&pTBHv_I}V(=^o$ZqTA;OJRA4E%6OD#f`8VN*}m@O zLz(FaWIo&->)xHX-_vm+KOXYvG2fA}Hc4QHc)Zb9JkD6&hlu;U$klkGFL(KVoU081 ztO5^`Om8fK(;bdg6V7u5VK&%Tj#_t3#ZGJ3J#(b%3i-@tfr>e!*#N2UDOrqEwkRSN z58o|}z5-%G_N-$%u_nO5=XihUc8AOXaxm47UD{Ei6(&?tF;JI5nTl03H3uqBnK=}0 z`4-r;A-Us`qZ><^pPvmSsbmLzT&R#!i$q-*U=)++cc5URg0wJM`VtuTitJIi2G-BC z1<8ZOK5G%q3wmr9_Dg31_G1SQ=m^&w(AzFuQ@*lge&)!XQl1_Dy=x2^lf#mX=P0>l zFjRRYwT`o$a&<=*Q!L_nuTXD5_9Y#PvTFJXTnX86)m5;n7P{*5G{h*8;ngKZn0V?M z&c6V?Z@>in-Up{f)>t&K9nvHYS+fK38sf}XEP(c45xxd!0m^HEwp-So4S+fVpoBi< z!q}VG*p;3;#}3$iW3QgGyHJ?Q#Cb&smZ&mujfN}>w$+=kS7?jDAoPH=0HC@K7WFoo zy<vPP6WwuC4Q&R&pnxu}3!V;j>5Sk)E2Nrw2SmqLH&Abb2(PF-W=iT|o@vS8{z2PU zAEMhvQ3p|arbp;-l?!p9Tpdqc!g*L4g}8<*)B2p*o)$MtT6}u39A1$#D8@}#q}w1Y z5<nrEloARWCBA*C1tg$H*OqR_G(x9|O$)mjV`adAp-2tT>x?}a@nq(yFedVdG4(F& zrQSn<94Kq1tEIBo&4t2Cq}EYjGf^L)_y|PVn03EMCJDq?Pz#8SjX~k%R`5l)aAbOg zPk~ld3g=mIC|PY7Z|4$Ji$jalCXLV?jsb(|W(aur{k$i3mwIA%-V?iv_MyA~(9X<Z z!cYEnz*&=3*i6FP|8*IB1GMa_*|#6QA+wLaR(M|&{<-<TK@Vns5zYqnF(~4FT8gP= bx~%{ClmuT8m|?EEPgZE%u9FqJ?l#F^|GbyQ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/__pycache__/projections.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/projections.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85dc2ceee54b2786e3d79829c3de102192448c9f GIT binary patch literal 5111 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 S(`!ae-?VCGLvNr*@BaZFausR- literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/__pycache__/rewards.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/rewards.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09d09f20f0f4e94a8608917e5621e98b50e8ae4e GIT binary patch literal 2858 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 QgKW$~y2@6q&{?H_0|b=hg#Z8m literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/__pycache__/task_parameters.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/task_parameters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c166f109c226b3c09e280eba6726856590570d9 GIT binary patch literal 7521 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 XWH6&;5#%7G(X%>QdLe<okyrl<c6cJ| literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/base/__init__.py b/brain_observatory/behavior/data_objects/base/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90539147b37184f188ec62eb38754f2921aa9296 GIT binary patch literal 221 zcmYL@I|>3Z5QZaIh~PmiG=-gr_-MsO>;hr38Qi#QvSi}QmNs6*$}8D=1UoBd3-O2l zn_*teYB1;v*6DtQHojW?)Zt{orY^&Zofvku4-wn)AD`QLs`iAD6y#vX1}@+mwe*k$ zZ(*X)*Q7#)o-$^r@`lvL8AUGPsDiA31M+TJ@`Np<iQv2rhA-BTLTseL9BLP$w2**1 eN6ZpQ1B6m*=UvizTs6<$>=f*|#CiMQn=QT}OhMcL literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/_data_object_abc.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/_data_object_abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36d3cbc91f03dd965b68862d3fefe61e6c9ba7c0 GIT binary patch literal 5082 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/readable_interfaces.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/readable_interfaces.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f47e6482dc570ac2e8dc0d5d52bd4c545c314f9 GIT binary patch literal 4340 zcmdUy%Wm676oyIaE=#^8X`8mLr#q`i<e*s;2#O%K+XN0AC5T!S5LD1Z&e)>Oi#kKe zm3FQ30^MiVRUe>>zCs^?%XZaQ=&I)oNnI?(k+X6Ma5Op`&gGo%{4?CGR?8Y(-mgE= zFDjb$H~vYlEL0xBEnh>yG^V>+3x5q)_l%aIV?E<$ylgA0>RC7E<y(1Od!n%%%fHfC zo@*zC^GvG<mI5n+rI=VsU@5UOSjvf|43;HU0ZS#ZEP<uUmcg=|SSnyyVXI(SO)OQW zH?`W@KQKeBQPZPB<GbC*j?1B1X@-v1b9*xRU;c`Q^tpAy?a;>N>6L@ZBe>;fP;jlK zGp%JXy_Mlvo;%6&0y9|VwZXD1_bPj?pX;q6%fq0B=+;vi_%AtS)N=X0A98U-Z9c3$ zqvBK&N*D}C0yQF`l8B@wITC?KPT*aEF0L6-i8*#?3f>h_UhuFdeA|F0c;T-O_a595 zV-;%W+RwULwlVzcMbPcJG~_rOt`FB5_fN^w=JN)z1FuU%2PQ~x5VGYur`#QoE)|k9 zVhze9xu`gnc87bkRvy`2s>#UF|GV)u`agE*gOLrp+wqCx%aHn^1CwKFYO(9dS;w(E zqyzpq^r^=W3H2E{>{GV~^{xoIT!aoE4~bE|(FnqQuj_J;gO}OYLIeWbma$za^5B!- zG=Z-9_m{l~?QbO)vQ0ab)h&8P{Xu)jr*_~odcV#6zHGw?zO<nXx}AY+A2?Q9Iw8N? zrS>U3=J2lTLJM}fZ3*i5W?(^&eHsR0ux;@U?K^?k#?ZnOgh_5&RPyaKx~7wYAnV;h zRKj4J80;mCpbG2KaC0s>^-<eKtrQha6CGrlQQ0)Tfc0FgS4{JV9(9u^1=D1K4dx}= zrBZr4>;x>zP|J>%sU<@}?JzNBG5i8@Joc4xSX|)51ZF`AXIO-ysAqKpZe^XHEL+fQ zHd$1v=o6_@NK@s&@#MRv%EA7#W}GUzD8RTjCInt-ay)_hY;ydWCP$JR34kj5C;|!z z>r+>yDTZ*A8#vyzO9Fv`sTl%;6lF14FN82b%>_q)g#J*dRfd~$Js+cnZ5y?ss6u<O zjKvBTt5~dIv5v(JEZ)ZglWd|;;M@Y+ZMdhwLF;^QuB@^*8)w!mIa>>fEbIoU#uofD z>j=~_CP+C4=9m(+hby=!uk=2Eb{RyZJAe@gcAMyYeXN}?sDShZ#>QHf$S3@a)H0dX zw0wTk0TCZ}O19EnjRZ#kb9Vr5DQqPVRl|v4uZLt$(kc*-3)n<OrFF25JLq{8j+Nm? zV@{}JRG}q^;v%GCU*f~*Ar-g^*AL(UA~=mJTIb_>MV-5yZo;#~nhO!zr@{$(GCn&X z1M&{>gAn%dJ{RK+oB!y@(D9FB6~kkPd<TX6{SvrCU=VjX#n+hXYlzo-)3L@dN6QK? zwM(NDcQE1#vhr~2jUkFj8@;rkGJZTg{1`P<;fFY|+ER^VOGWE^)DX+rE%lP~=f>m- zcNVzM7Xl72Qm14U=Tt1Ksnta9T|qL3f4l{$wBzfK)h7^+i>kG*uu9jUobv)BoS=2D zIq}Ic6Ob6Msh1a&v<yyVb9z2w&Nkpd181Q)OOI}7ozK}-C9OH|?Z<$@%z}pX#R!A< zC+ND;8SZTgCDXqDrwWDhR~VTXz*M2$=<x)h^rZzA>Qm@@g5)td1Ri{k15c5I*4nZ< z`?YfFtRZk>t$O-lRG;}Us;3`D^^tl?fz-C{E&NjQHKimd%Ixg!sjm-#CrN?(vq0q( ph_xVCsAY@`CHuuM;}4~W_=O<x^jb73Mn$h=)>qfp)^9?&@*jZ2GB^ML literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/writable_interfaces.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/writable_interfaces.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e924d9d3b5da99cdbb5ea7e11485f7676361079 GIT binary patch literal 1739 zcmbVMPj3`A6!*-|{%J@kgcea%NIq1EmCEj+w<tm+DIie0RL}}(wbJlr?Cnf4GahVj zR-0QJz5sV_ocKy}<-}Lu)b~7_*`RFIf_MFFKfihJ+3)xB{?^t8!<N7O3#I{M?`d(? zaLw*vH@heV6JEx~H2RsB`(xi@51D9*;1v^rWQVQO);K^-TXay<S!&wCd&c_R59oo7 z`d-x?J>P$jW-=zlS!)9QfEvlho?v5Nc;l7~4%@OL{5PHp6r6hFu4tpfPWA0$ql)J` zwGd_UQDLQ?LM%^i{R;ZXaNq(ga1|ZO*m5v@zO>|4aZCX->1b(Zx`@4H7Bo^nz;5VL zEIVa?doF(;zQe7D>9H(0;6Kw6#DbTqoMm98;6G!uCob5Jy!Oj&BDqL0x=p}t@MW7P z=wfE@lX+?rXY^vKRURJVac=it@Hhiwa%mHVCTf-mUTP&~v2?Zua@qJ=1>I<LPu-zR zv%XWeW=$FGG%HH#cg*wgvnL~dJ1y#jr%LC2m-d<rRzU}i8!GIzk+P5SGLyN)Vu<@% zD~;;F$ZYzK=`LRA$JYltlRu2qW&#O_K?HLs7L&aKVpRzEX(EebGf|~1OpH>M$-+#2 zNu!BLt-Mo0d<1_={5H$bLL3bv4QUao2t6KyReCXuWCF*j(nG2~?ojp3FajfoX8;J( zGpv|Fxv08UxvTF{)qND~(#g%W&>Ac)NBv&a3&R2{5r)-980J`>jOLqR_;Lo>a;F=H zLdB?VK@?Y)Au?7&Z0pii0Tn`jh4I|goD-CZZlUO4HzayqfIp{OPn%n4bdffWIQ|9V zd^4IyU(Or9>K5~8iVW7o+SpwgPH6mh_DnyUJ;<_hfkfpLYRTgUZ^S5$2y%S|$eQyY zgcO4nBYp#orNZ~&0x6Ihjmzbs_zt}e^guN`#F4#%)Su+i?Ee?z{-3{^ZVA3rbS{D~ zr)R;D{@e-O;hNBt8op<#{e+6TjkW0enxLb%Nf7yJLEx%7h-5tP4V>4IzjE^ZI#3Ye z(GCHx={?k!NNkeWB5|3-*CeR;`WlH<BsX(dzKR>yv7g5>>G~b#V%#nl7{xiMT6_Bk Z4(OUJ*14;CyEWnN65MK^{$^|Y%0CMRypjL_ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/base/_data_object_abc.py b/brain_observatory/behavior/data_objects/base/_data_object_abc.py new file mode 100644 index 0000000000..3119ee77a3 --- /dev/null +++ b/brain_observatory/behavior/data_objects/base/_data_object_abc.py @@ -0,0 +1,160 @@ +import abc +from collections import deque +from enum import Enum +from typing import Any, Optional, Set + +from allensdk.brain_observatory.comparison_utils import compare_fields + + +class DataObject(abc.ABC): + """An abstract class that prototypes properties that represent a + category of experimental data/metadata (e.g. running speed, + rewards, licks, etc.) and that prototypes methods to allow conversion of + the experimental data/metadata to and from various + data sources and sinks (e.g. LIMS, JSON, NWB). + """ + + def __init__(self, name: str, value: Any, + exclude_from_equals: Optional[Set[str]] = None): + """ + :param name + Name + :param value + Value + :param exclude_from_equals + Optional set which will exclude these properties from comparison + checks to another DataObject + """ + self._name = name + self._value = value + + efe = exclude_from_equals if exclude_from_equals else set() + self._exclude_from_equals = efe + + @property + def name(self) -> str: + return self._name + + @property + def value(self) -> Any: + return self._value + + def to_dict(self) -> dict: + """ + Serialize DataObject to dict + :return + A nested dict serializing the DataObject + + notes + If a DataObject contains properties, these properties will either: + 1) be serialized to nested dict with "name" attribute of + DataObject if the property is itself a DataObject + 2) Value for property will be added with name of property + :examples + >>> class Simple(DataObject): + ... def __init__(self): + ... super().__init__(name='simple', value=1) + >>> s = Simple() + >>> assert s.to_dict() == {'simple': 1} + + >>> class B(DataObject): + ... def __init__(self): + ... super().__init__(name='b', value='!') + + >>> class A(DataObject): + ... def __init__(self, b: B): + ... super().__init__(name='a', value=self) + ... self._b = b + ... @property + ... def prop1(self): + ... return self._b + ... @property + ... def prop2(self): + ... return '@' + >>> a = A(b=B()) + >>> assert a.to_dict() == {'a': {'b': '!', 'prop2': '@'}} + """ + res = dict() + q = deque([(self._name, self, [])]) + + while q: + name, value, path = q.popleft() + if isinstance(value, DataObject): + # The path stores the nested key structure + # Here, build onto the nested key structure + newpath = path + [name] + + def _get_keys_and_values(base_value: DataObject): + properties = [] + for name, value in base_value._get_properties().items(): + if value is base_value: + # skip properties that return self + # (leads to infinite recursion) + continue + if name == 'name': + # The name is the key + continue + + if isinstance(value, DataObject): + # The key will be the DataObject "name" field + name = value._name + else: + # The key will be the property name + pass + properties.append((name, value, newpath)) + return properties + properties = _get_keys_and_values(base_value=value) + + # Find the nested dict + cur = res + for p in path: + cur = cur[p] + + if isinstance(value._value, DataObject): + # it's nested + cur[value._name] = dict() + for p in properties: + q.append(p) + else: + # it's flat + cur[name] = value._value + + else: + cur = res + for p in path: + cur = cur[p] + + if isinstance(value, Enum): + # convert to string + value = value.value + cur[name] = value + + return res + + def _get_properties(self): + """Returns all property names and values""" + def is_prop(attr): + return isinstance(getattr(type(self), attr, None), property) + props = [attr for attr in dir(self) if is_prop(attr)] + return {name: getattr(self, name) for name in props} + + def __eq__(self, other: "DataObject"): + if type(self) != type(other): + msg = f'Do not know how to compare with type {type(other)}' + raise NotImplementedError(msg) + + d_self = self.to_dict() + d_other = other.to_dict() + + for p in d_self: + if p in self._exclude_from_equals: + continue + x1 = d_self[p] + x2 = d_other[p] + + try: + compare_fields(x1=x1, x2=x2, + ignore_keys=self._exclude_from_equals) + except AssertionError: + return False + return True diff --git a/brain_observatory/behavior/data_objects/base/readable_interfaces.py b/brain_observatory/behavior/data_objects/base/readable_interfaces.py new file mode 100644 index 0000000000..f7c589802c --- /dev/null +++ b/brain_observatory/behavior/data_objects/base/readable_interfaces.py @@ -0,0 +1,105 @@ +import abc + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject + + +class JsonReadableInterface(abc.ABC): + """Marks a data object as readable from json""" + @classmethod + @abc.abstractmethod + def from_json(cls, dict_repr: dict) -> "DataObject": # pragma: no cover + """Populates a DataFile from a JSON compatible dict (likely parsed by + argschema) + + Returns + ------- + DataObject: + An instantiated DataObject which has `name` and `value` properties + """ + raise NotImplementedError() + + +class LimsReadableInterface(abc.ABC): + """Marks a data object as readable from LIMS""" + @classmethod + @abc.abstractmethod + def from_lims(cls, *args) -> "DataObject": # pragma: no cover + """Populate a DataObject from an internal database (likely LIMS) + + Returns + ------- + DataObject: + An instantiated DataObject which has `name` and `value` properties + """ + # Example: + # return cls(name="my_data_object", value=42) + raise NotImplementedError() + + +class NwbReadableInterface(abc.ABC): + """Marks a data object as readable from NWB""" + @classmethod + @abc.abstractmethod + def from_nwb(cls, nwbfile: NWBFile) -> "DataObject": # pragma: no cover + """Populate a DataObject from a pyNWB file object. + + Parameters + ---------- + nwbfile: + The file object (NWBFile) of a pynwb dataset file. + + Returns + ------- + DataObject: + An instantiated DataObject which has `name` and `value` properties + """ + raise NotImplementedError() + + +class DataFileReadableInterface(abc.ABC): + """Marks a data object as readable from various data files, not covered by + existing interfaces""" + @classmethod + @abc.abstractmethod + def from_data_file(cls, *args) -> "DataObject": + """Populate a DataObject from the data file + + Returns + ------- + DataObject: + An instantiated DataObject which has `name` and `value` properties + """ + raise NotImplementedError() + + +class StimulusFileReadableInterface(abc.ABC): + """Marks a data object as readable from stimulus file""" + @classmethod + @abc.abstractmethod + def from_stimulus_file(cls, stimulus_file: StimulusFile) -> "DataObject": + """Populate a DataObject from the stimulus file + + Returns + ------- + DataObject: + An instantiated DataObject which has `name` and `value` properties + """ + raise NotImplementedError() + + +class SyncFileReadableInterface(abc.ABC): + """Marks a data object as readable from sync file""" + @classmethod + @abc.abstractmethod + def from_sync_file(cls, *args) -> "DataObject": + """Populate a DataObject from the sync file + + Returns + ------- + DataObject: + An instantiated DataObject which has `name` and `value` properties + """ + raise NotImplementedError() diff --git a/brain_observatory/behavior/data_objects/base/writable_interfaces.py b/brain_observatory/behavior/data_objects/base/writable_interfaces.py new file mode 100644 index 0000000000..04d04fef96 --- /dev/null +++ b/brain_observatory/behavior/data_objects/base/writable_interfaces.py @@ -0,0 +1,40 @@ +import abc + +from pynwb import NWBFile + + +class JsonWritableInterface(abc.ABC): + """Marks a data object as writable to NWB""" + @abc.abstractmethod + def to_json(self) -> dict: # pragma: no cover + """Given an already populated DataObject, return the dict that + when used with the `from_json()` classmethod would produce the same + DataObject + + Returns + ------- + dict: + The JSON (in dict form) that would produce the DataObject. + """ + raise NotImplementedError() + + +class NwbWritableInterface(abc.ABC): + """Marks a data object as writable to NWB""" + @abc.abstractmethod + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: # pragma: no cover + """Given an already populated DataObject, return an pyNWB file object + that had had DataObject data added. + + Parameters + ---------- + nwbfile : NWBFile + An NWB file object + + Returns + ------- + NWBFile + An NWB file object that has had data from the DataObject added + to it. + """ + raise NotImplementedError() diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__init__.py b/brain_observatory/behavior/data_objects/cell_specimens/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7524c9416663ab193eebc76ead558c451bdc92e GIT binary patch literal 231 zcmYL@F>XRJ42FZmP$6*;2FSoxA=J{f>VnuJMNVS%rQ{`193FZjH{cFTT&XKZVCz)B z0r5-zY}x)TZ>H0UV6~SM4EZ+Tp%E8v95iM)u@$q?*Hx6E{lwq-<5lel3n^&8EesqX z_Ub)?P0_(pVeCkyjFBue<)$a~>5U>^ah}2M;Tzc-0&lpzGzEOr$?(MvYAU@n*g)q~ pkq#>G<OgjfX)y#%8Le;GD7E&{SFIPh|9x4t$sGc&hfnVu;ve;QMiBr2 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/cell_specimens.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/cell_specimens.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcdd678e1c9022c7020be6310a6a992b733a2680 GIT binary patch literal 17680 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/events.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/events.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..125cd3958c2f54b759e946df78f27bf0f61f7e74 GIT binary patch literal 4351 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 K36a?{yY&AS0)@x` literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/rois_mixin.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/rois_mixin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36ede10d36d8dae3e129969df0a4c26146defba5 GIT binary patch literal 2518 zcma)8&u<(x6t-t(XD6GMmb68xfHD_;ENV9gE(k?cN=s1%1eCU_GzuDd$KK6sW@onc zB+W(}2}q=tLoZwbDG?|Bi5~bf=E{kGffL{JZYD_^Rg7e>{cJzK_kHg@@8{>ww-~<R zA3uujImZ5`$<gOxu#9FtMkkr%8H=XBJaX*Zjl3_Jbfmk_q`T)t4ax7bw)YSAvz3JU zqtC-&8O?OiDHd_bBIhA=My~P(4dqK`iOE1U2Z8i{<FX<B{YEq=o6t8`&8-%x`6k^? z^PT&*!XXX9UZFz~CPkL1q)dxEEPA2Fw$PM?Rx%U@%Tko0r^QgULVO=};w_PFst~(Q zthFnDDu2-CRTDbmRGP$vq4YJ;XiUxgh3+YP%AYztS90m>2fOYwXTS!0;Ou&{k-OWl zBkyN6@ua&E=uf4$>tWp3aP=y!9W)NvfiD|}{FxIoD``&niCJ*S26NJv&F6gApZEuJ zhfM!4arYP}ouuc*v7U){d~(1KS`({xz+#TQ-iD)J$eEQfxB{YqxD9u{)lzA5j8Q0( zq|h?W`(asxX+GL42~k3$WAP&lAEj9qip&&YFU?A&PaMagq{vGFa*8|~Pub|FTPhE` zc6M6RL!*eq>tU)wwVh;}_U1GPMX9uhTlKBq2_g~KnObzC{%X<8*m_R(-nCXPY6Z_= z?JNLbYPqgpz{^LpNR5iqUW^434^v|R$0>!6))kIwg2-+r+ttWMVA><CT7?3Q6aYk$ zoW}B$w!A2hHXX-my<?>))oVSrY;=oq{fG^b1G<^7wL-FWU2Lh)0K{+#1kwYR)i=Gw zb}hem(j}WbXFCODqO^XW<<a$8AMUh}OrZ}ETHzCls4hV2=hMW63nF|XbWV|Yw3-$D zzLK5ekXR+AUJK6ZW?rU4^@Y|b72xJfZbL%sn6*<lgz%-d98}hT*1`n!z<v(;2HGVw zvyV>l5_!GH2mDu5$lu*v_KfRmr88lB{3l+z2i}Aoa!$G582Hka-gBx2jqST6xx>C+ z+T|0}L1gdB<7JXf_*FJ&K4bKY{I6vP!Bj>yfOajh$IFjUr;+FW%FeZWHjihCX(%i$ z>NA=u-q9T9qVjoSJ2h1!&86B#&GpLhNL4``=LniOuFjo=vkGSXn98G(rs^2^QWv9K zR1Im*`ohp}+o{~4=~p~yyVZq4r~Nb+S#0;1>dKj{RGv{;?@#vcFSkEiL!r=SO{@#q z>53;JAFtiY1ssy%lQorZnYCi1a+9DhM(bm<_I27_Gij-Aj6|{_`U+?9NaRLtEOv2Q z9v59`+!A;v#*1Br%t#BpNaSK=fY-z<CMwHfGg1lSCpU|;Vt{9-Ga6U#uOntMH7yZP zXJaM?pcut<jC@Fua2Xxr3y#MF-f}N`=bV5$&Sk#y)#}lU)|uAP7&_xw=605{B0-J4 z+4)~Lt!R3qqIqjHOhuWUajJbRwC625c2ngMoBBNM_ooa*^BRSaYzObr-0`rf)l}xC z2Bf+GUcW*5nwp|q)03_jsCx@tbg5?6p0Z){ijd+VYM`>_LK8M^SHD@Sv0ATSS}nYa z3I3cg^8q^c_QlIB-U6Tj_W)<h3EVfF1t)NPG@32&z}b1{bpWrl`Ga;#&(U42I35;q z6MQ1Z<M{EW$Yv4WjAL0O5IZ9o&D}wK+@)8jx)6gb&@HIw8(PmtQ4`^)wHWKGP-=ZU z(UDV{N(2#Qh?EvWqUBmy+t>4uM2&oNI2!BsXzY&=4#MbnF|nIYC?njog(+B?T7Hu< L*s2WxNZ|elmgdP) literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py b/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py new file mode 100644 index 0000000000..a626083a9f --- /dev/null +++ b/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py @@ -0,0 +1,606 @@ +from typing import Optional, Tuple + +import numpy as np +import pandas as pd +from pynwb import NWBFile, ProcessingModule +from pynwb.ophys import OpticalChannel, ImageSegmentation + +import allensdk.brain_observatory.roi_masks as roi +from allensdk.brain_observatory.behavior.data_files.demix_file import DemixFile +from allensdk.brain_observatory.behavior.data_files.dff_file import DFFFile +from allensdk.brain_observatory.behavior.data_files.event_detection_file \ + import \ + EventDetectionFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.cell_specimens.events \ + import \ + Events +from allensdk.brain_observatory.behavior.data_objects.cell_specimens.traces \ + .corrected_fluorescence_traces import \ + CorrectedFluorescenceTraces +from allensdk.brain_observatory.behavior.data_objects.cell_specimens.traces \ + .dff_traces import \ + DFFTraces +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.field_of_view_shape import \ + FieldOfViewShape +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.imaging_plane import \ + ImagingPlane +from allensdk.brain_observatory.behavior.data_objects.timestamps \ + .ophys_timestamps import \ + OphysTimestamps +from allensdk.brain_observatory.behavior.image_api import Image +from allensdk.brain_observatory.nwb import CELL_SPECIMEN_COL_DESCRIPTIONS +from allensdk.brain_observatory.nwb.nwb_utils import add_image_to_nwb +from allensdk.internal.api import PostgresQueryMixin + + +class EventsParams: + """Container for arguments to event detection""" + + def __init__(self, + filter_scale: float = 2, + filter_n_time_steps: int = 20): + """ + :param filter_scale + See Events.filter_scale + :param filter_n_time_steps + See Events.filter_n_time_steps + """ + self._filter_scale = filter_scale + self._filter_n_time_steps = filter_n_time_steps + + @property + def filter_scale(self): + return self._filter_scale + + @property + def filter_n_time_steps(self): + return self._filter_n_time_steps + + +class CellSpecimenMeta(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface): + """Cell specimen metadata""" + def __init__(self, imaging_plane: ImagingPlane, emission_lambda=520.0): + super().__init__(name='cell_spcimen_meta', value=self) + self._emission_lambda = emission_lambda + self._imaging_plane = imaging_plane + + @property + def emission_lambda(self): + return self._emission_lambda + + @property + def imaging_plane(self): + return self._imaging_plane + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin, + ophys_timestamps: OphysTimestamps) -> "CellSpecimenMeta": + imaging_plane_meta = ImagingPlane.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, + ophys_timestamps=ophys_timestamps) + return cls(imaging_plane=imaging_plane_meta) + + @classmethod + def from_json(cls, dict_repr: dict, + ophys_timestamps: OphysTimestamps) -> "CellSpecimenMeta": + imaging_plane_meta = ImagingPlane.from_json( + dict_repr=dict_repr, ophys_timestamps=ophys_timestamps) + return cls(imaging_plane=imaging_plane_meta) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "CellSpecimenMeta": + ophys_module = nwbfile.processing['ophys'] + image_seg = ophys_module.data_interfaces['image_segmentation'] + plane_segmentations = image_seg.plane_segmentations + cell_specimen_table = plane_segmentations['cell_specimen_table'] + + imaging_plane = cell_specimen_table.imaging_plane + optical_channel = imaging_plane.optical_channel[0] + emission_lambda = optical_channel.emission_lambda + + imaging_plane = ImagingPlane.from_nwb(nwbfile=nwbfile) + return CellSpecimenMeta(emission_lambda=emission_lambda, + imaging_plane=imaging_plane) + + +class CellSpecimens(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface, + NwbWritableInterface): + def __init__(self, + cell_specimen_table: pd.DataFrame, + meta: CellSpecimenMeta, + dff_traces: DFFTraces, + corrected_fluorescence_traces: CorrectedFluorescenceTraces, + events: Events, + ophys_timestamps: OphysTimestamps, + segmentation_mask_image_spacing: Tuple, + exclude_invalid_rois=True): + """ + A container for cell specimens including traces, events, metadata, etc. + + Parameters + ---------- + cell_specimen_table + index cell_specimen_id + columns: + - cell_roi_id + - height + - mask_image_plane + - max_correction_down + - max_correction_left + - max_correction_right + - max_correction_up + - roi_mask + - valid_roi + - width + - x + - y + meta + dff_traces + corrected_fluorescence_traces + events + ophys_timestamps + segmentation_mask_image_spacing + Spacing to pass to sitk when constructing segmentation mask image + exclude_invalid_rois + Whether to exclude invalid rois + + """ + super().__init__(name='cell_specimen_table', value=self) + + # Validate ophys timestamps, traces + ophys_timestamps = ophys_timestamps.validate( + number_of_frames=dff_traces.get_number_of_frames()) + self._validate_traces( + ophys_timestamps=ophys_timestamps, dff_traces=dff_traces, + corrected_fluorescence_traces=corrected_fluorescence_traces, + cell_roi_ids=cell_specimen_table['cell_roi_id'].values) + + if exclude_invalid_rois: + cell_specimen_table = cell_specimen_table[ + cell_specimen_table['valid_roi']] + + # Filter/reorder rois according to cell_specimen_table + dff_traces.filter_and_reorder( + roi_ids=cell_specimen_table['cell_roi_id'].values) + corrected_fluorescence_traces.filter_and_reorder( + roi_ids=cell_specimen_table['cell_roi_id'].values) + + # Note: setting raise_if_rois_missing to False for events, since + # there seem to be cases where cell_specimen_table contains rois not in + # events + # See ie https://app.zenhub.com/workspaces/allensdk-10-5c17f74db59cfb36f158db8c/issues/alleninstitute/allensdk/2139 # noqa + events.filter_and_reorder( + roi_ids=cell_specimen_table['cell_roi_id'].values, + raise_if_rois_missing=False) + + self._meta = meta + self._cell_specimen_table = cell_specimen_table + self._dff_traces = dff_traces + self._corrected_fluorescence_traces = corrected_fluorescence_traces + self._events = events + self._segmentation_mask_image = self._get_segmentation_mask_image( + spacing=segmentation_mask_image_spacing) + + @property + def table(self) -> pd.DataFrame: + return self._cell_specimen_table + + @property + def roi_masks(self) -> pd.DataFrame: + return self._cell_specimen_table[['cell_roi_id', 'roi_mask']] + + @property + def meta(self) -> CellSpecimenMeta: + return self._meta + + @property + def dff_traces(self) -> pd.DataFrame: + df = self.table[['cell_roi_id']].join(self._dff_traces.value, + on='cell_roi_id') + return df + + @property + def corrected_fluorescence_traces(self) -> pd.DataFrame: + df = self.table[['cell_roi_id']].join( + self._corrected_fluorescence_traces.value, on='cell_roi_id') + return df + + @property + def events(self) -> pd.DataFrame: + df = self.table.reset_index() + df = df[['cell_roi_id', 'cell_specimen_id']] \ + .merge(self._events.value, on='cell_roi_id') + df = df.set_index('cell_specimen_id') + return df + + @property + def segmentation_mask_image(self) -> Image: + return self._segmentation_mask_image + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin, + ophys_timestamps: OphysTimestamps, + segmentation_mask_image_spacing: Tuple, + exclude_invalid_rois=True, + events_params: Optional[EventsParams] = None) \ + -> "CellSpecimens": + def _get_ophys_cell_segmentation_run_id() -> int: + """Get the ophys cell segmentation run id associated with an + ophys experiment id""" + query = """ + SELECT oseg.id + FROM ophys_experiments oe + JOIN ophys_cell_segmentation_runs oseg + ON oe.id = oseg.ophys_experiment_id + WHERE oseg.current = 't' + AND oe.id = {}; + """.format(ophys_experiment_id) + return lims_db.fetchone(query, strict=True) + + def _get_cell_specimen_table(): + ophys_cell_seg_run_id = _get_ophys_cell_segmentation_run_id() + query = """ + SELECT * + FROM cell_rois cr + WHERE cr.ophys_cell_segmentation_run_id = {}; + """.format(ophys_cell_seg_run_id) + initial_cs_table = pd.read_sql(query, lims_db.get_connection()) + cst = initial_cs_table.rename( + columns={'id': 'cell_roi_id', 'mask_matrix': 'roi_mask'}) + cst.drop(['ophys_experiment_id', + 'ophys_cell_segmentation_run_id'], + inplace=True, axis=1) + cst = cst.to_dict() + fov_shape = FieldOfViewShape.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + cst = cls._postprocess( + cell_specimen_table=cst, fov_shape=fov_shape) + return cst + + def _get_dff_traces(): + dff_file = DFFFile.from_lims( + ophys_experiment_id=ophys_experiment_id, + db=lims_db) + return DFFTraces.from_data_file( + dff_file=dff_file) + + def _get_corrected_fluorescence_traces(): + demix_file = DemixFile.from_lims( + ophys_experiment_id=ophys_experiment_id, + db=lims_db) + return CorrectedFluorescenceTraces.from_data_file( + demix_file=demix_file) + + def _get_events(): + events_file = EventDetectionFile.from_lims( + ophys_experiment_id=ophys_experiment_id, + db=lims_db) + return cls._get_events(events_file=events_file, + events_params=events_params) + + cell_specimen_table = _get_cell_specimen_table() + meta = CellSpecimenMeta.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, + ophys_timestamps=ophys_timestamps) + dff_traces = _get_dff_traces() + corrected_fluorescence_traces = _get_corrected_fluorescence_traces() + events = _get_events() + + return CellSpecimens( + cell_specimen_table=cell_specimen_table, meta=meta, + dff_traces=dff_traces, + corrected_fluorescence_traces=corrected_fluorescence_traces, + events=events, + ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=segmentation_mask_image_spacing, + exclude_invalid_rois=exclude_invalid_rois + ) + + @classmethod + def from_json(cls, dict_repr: dict, + ophys_timestamps: OphysTimestamps, + segmentation_mask_image_spacing: Tuple, + exclude_invalid_rois=True, + events_params: Optional[EventsParams] = None) \ + -> "CellSpecimens": + cell_specimen_table = dict_repr['cell_specimen_table_dict'] + fov_shape = FieldOfViewShape.from_json(dict_repr=dict_repr) + cell_specimen_table = cls._postprocess( + cell_specimen_table=cell_specimen_table, fov_shape=fov_shape) + + def _get_dff_traces(): + dff_file = DFFFile.from_json(dict_repr=dict_repr) + return DFFTraces.from_data_file( + dff_file=dff_file) + + def _get_corrected_fluorescence_traces(): + demix_file = DemixFile.from_json(dict_repr=dict_repr) + return CorrectedFluorescenceTraces.from_data_file( + demix_file=demix_file) + + def _get_events(): + events_file = EventDetectionFile.from_json(dict_repr=dict_repr) + return cls._get_events(events_file=events_file, + events_params=events_params) + + meta = CellSpecimenMeta.from_json(dict_repr=dict_repr, + ophys_timestamps=ophys_timestamps) + dff_traces = _get_dff_traces() + corrected_fluorescence_traces = _get_corrected_fluorescence_traces() + events = _get_events() + return CellSpecimens( + cell_specimen_table=cell_specimen_table, meta=meta, + dff_traces=dff_traces, + corrected_fluorescence_traces=corrected_fluorescence_traces, + events=events, + ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=segmentation_mask_image_spacing, + exclude_invalid_rois=exclude_invalid_rois) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile, + segmentation_mask_image_spacing: Tuple, + exclude_invalid_rois=True, + events_params: Optional[EventsParams] = None) \ + -> "CellSpecimens": + # NOTE: ROI masks are stored in full frame width and height arrays + ophys_module = nwbfile.processing['ophys'] + image_seg = ophys_module.data_interfaces['image_segmentation'] + plane_segmentations = image_seg.plane_segmentations + cell_specimen_table = plane_segmentations['cell_specimen_table'] + + def _read_table(cell_specimen_table): + df = cell_specimen_table.to_dataframe() + + # Ensure int64 used instead of int32 + df = df.astype( + {col: 'int64' for col in df.select_dtypes('int32').columns}) + + # Because pynwb stores this field as "image_mask", it is renamed + # here + df = df.rename(columns={'image_mask': 'roi_mask'}) + + df.index.rename('cell_roi_id', inplace=True) + df['cell_specimen_id'] = [None if id_ == -1 else id_ + for id_ in df['cell_specimen_id'].values] + + df.reset_index(inplace=True) + df.set_index('cell_specimen_id', inplace=True) + return df + + df = _read_table(cell_specimen_table=cell_specimen_table) + meta = CellSpecimenMeta.from_nwb(nwbfile=nwbfile) + dff_traces = DFFTraces.from_nwb(nwbfile=nwbfile) + corrected_fluorescence_traces = CorrectedFluorescenceTraces.from_nwb( + nwbfile=nwbfile) + + def _get_events(): + ep = EventsParams() if events_params is None else events_params + return Events.from_nwb( + nwbfile=nwbfile, filter_scale=ep.filter_scale, + filter_n_time_steps=ep.filter_n_time_steps) + + events = _get_events() + ophys_timestamps = OphysTimestamps.from_nwb(nwbfile=nwbfile) + + return CellSpecimens( + cell_specimen_table=df, meta=meta, dff_traces=dff_traces, + corrected_fluorescence_traces=corrected_fluorescence_traces, + events=events, + ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=segmentation_mask_image_spacing, + exclude_invalid_rois=exclude_invalid_rois) + + def to_nwb(self, nwbfile: NWBFile, + ophys_timestamps: OphysTimestamps) -> NWBFile: + """ + :param nwbfile + In-memory nwb file object + :param ophys_timestamps + ophys timestamps + """ + # 1. Add cell specimen table + cell_roi_table = self.table.reset_index().set_index( + 'cell_roi_id') + metadata = nwbfile.lab_meta_data['metadata'] + + device = nwbfile.get_device() + + # FOV: + fov_width = metadata.field_of_view_width + fov_height = metadata.field_of_view_height + imaging_plane_description = \ + "{} field of view in {} at depth {} " \ + "um".format( + (fov_width, fov_height), + self._meta.imaging_plane.targeted_structure, + metadata.imaging_depth) + + # Optical Channel: + optical_channel = OpticalChannel( + name='channel_1', + description='2P Optical Channel', + emission_lambda=self._meta.emission_lambda) + + # Imaging Plane: + imaging_plane = nwbfile.create_imaging_plane( + name='imaging_plane_1', + optical_channel=optical_channel, + description=imaging_plane_description, + device=device, + excitation_lambda=self._meta.imaging_plane.excitation_lambda, + imaging_rate=self._meta.imaging_plane.ophys_frame_rate, + indicator=self._meta.imaging_plane.indicator, + location=self._meta.imaging_plane.targeted_structure) + + # Image Segmentation: + image_segmentation = ImageSegmentation(name="image_segmentation") + + if 'ophys' not in nwbfile.processing: + ophys_module = ProcessingModule('ophys', 'Ophys processing module') + nwbfile.add_processing_module(ophys_module) + else: + ophys_module = nwbfile.processing['ophys'] + + ophys_module.add_data_interface(image_segmentation) + + # Plane Segmentation: + plane_segmentation = image_segmentation.create_plane_segmentation( + name='cell_specimen_table', + description="Segmented rois", + imaging_plane=imaging_plane) + + for col_name in cell_roi_table.columns: + # the columns 'roi_mask', 'pixel_mask', and 'voxel_mask' are + # already defined in the nwb.ophys::PlaneSegmentation Object + if col_name not in ['id', 'mask_matrix', 'roi_mask', + 'pixel_mask', 'voxel_mask']: + # This builds the columns with name of column and description + # of column both equal to the column name in the cell_roi_table + plane_segmentation.add_column( + col_name, + CELL_SPECIMEN_COL_DESCRIPTIONS.get( + col_name, + "No Description Available")) + + # go through each roi and add it to the plan segmentation object + for cell_roi_id, table_row in cell_roi_table.iterrows(): + # NOTE: The 'roi_mask' in this cell_roi_table has already been + # processing by the function from + # allensdk.brain_observatory.behavior.session_apis.data_io + # .ophys_lims_api + # get_cell_specimen_table() method. As a result, the ROI is + # stored in + # an array that is the same shape as the FULL field of view of the + # experiment (e.g. 512 x 512). + mask = table_row.pop('roi_mask') + + csid = table_row.pop('cell_specimen_id') + table_row['cell_specimen_id'] = -1 if csid is None else csid + table_row['id'] = cell_roi_id + plane_segmentation.add_roi(image_mask=mask, **table_row.to_dict()) + + # 2. Add DFF traces + self._dff_traces.to_nwb(nwbfile=nwbfile, + ophys_timestamps=ophys_timestamps) + + # 3. Add Corrected fluorescence traces + self._corrected_fluorescence_traces.to_nwb(nwbfile=nwbfile) + + # 4. Add events + self._events.to_nwb(nwbfile=nwbfile) + + # 5. Add segmentation mask image + add_image_to_nwb(nwbfile=nwbfile, + image_data=self._segmentation_mask_image, + image_name='segmentation_mask_image') + + return nwbfile + + def _get_segmentation_mask_image(self, spacing: tuple) -> Image: + """a 2D binary image of all cell masks + + Parameters + ---------- + spacing + See image_api.Image for details + + Returns + ---------- + allensdk.brain_observatory.behavior.image_api.Image: + array-like interface to segmentation_mask image data and + metadata + """ + mask_data = np.sum(self.roi_masks['roi_mask']).astype(int) + + mask_image = Image( + data=mask_data, + spacing=spacing, + unit='mm' + ) + return mask_image + + @staticmethod + def _postprocess(cell_specimen_table: dict, + fov_shape: FieldOfViewShape) -> pd.DataFrame: + """Converts raw cell_specimen_table dict to dataframe""" + cell_specimen_table = pd.DataFrame.from_dict( + cell_specimen_table).set_index( + 'cell_roi_id').sort_index() + fov_width = fov_shape.width + fov_height = fov_shape.height + + # Convert cropped ROI masks to uncropped versions + roi_mask_list = [] + for cell_roi_id, table_row in cell_specimen_table.iterrows(): + # Deserialize roi data into AllenSDK RoiMask object + curr_roi = roi.RoiMask(image_w=fov_width, image_h=fov_height, + label=None, mask_group=-1) + curr_roi.x = table_row['x'] + curr_roi.y = table_row['y'] + curr_roi.width = table_row['width'] + curr_roi.height = table_row['height'] + curr_roi.mask = np.array(table_row['roi_mask']) + roi_mask_list.append(curr_roi.get_mask_plane().astype(np.bool)) + + cell_specimen_table['roi_mask'] = roi_mask_list + cell_specimen_table = cell_specimen_table[ + sorted(cell_specimen_table.columns)] + + cell_specimen_table.index.rename('cell_roi_id', inplace=True) + cell_specimen_table.reset_index(inplace=True) + cell_specimen_table.set_index('cell_specimen_id', inplace=True) + return cell_specimen_table + + def _validate_traces( + self, ophys_timestamps: OphysTimestamps, + dff_traces: DFFTraces, + corrected_fluorescence_traces: CorrectedFluorescenceTraces, + cell_roi_ids: np.ndarray): + """validates traces""" + trace_col_map = { + 'dff_traces': 'dff', + 'corrected_fluorescence_traces': 'corrected_fluorescence' + } + for traces in (dff_traces, corrected_fluorescence_traces): + # validate traces contain expected roi ids + if not np.in1d(traces.value.index, cell_roi_ids).all(): + raise RuntimeError(f"{traces.name} contains ROI IDs that " + f"are not in " + f"cell_specimen_table.cell_roi_id") + if not np.in1d(cell_roi_ids, traces.value.index).all(): + raise RuntimeError(f"cell_specimen_table contains ROI IDs " + f"that are not in {traces.name}") + + # validate traces contain expected timepoints + num_trace_timepoints = len(traces.value.iloc[0] + [trace_col_map[traces.name]]) + num_ophys_timestamps = ophys_timestamps.value.shape[0] + if num_trace_timepoints != num_ophys_timestamps: + raise RuntimeError(f'{traces.name} contains ' + f'{num_trace_timepoints} ' + f'but there are {num_ophys_timestamps} ' + f'ophys timestamps') + + @staticmethod + def _get_events(events_file: EventDetectionFile, + events_params: Optional[EventsParams] = None): + if events_params is None: + events_params = EventsParams() + return Events.from_data_file( + events_file=events_file, + filter_scale=events_params.filter_scale, + filter_n_time_steps=events_params.filter_n_time_steps) diff --git a/brain_observatory/behavior/data_objects/cell_specimens/events.py b/brain_observatory/behavior/data_objects/cell_specimens/events.py new file mode 100644 index 0000000000..ac45f255ae --- /dev/null +++ b/brain_observatory/behavior/data_objects/cell_specimens/events.py @@ -0,0 +1,137 @@ +import numpy as np +import pandas as pd +from hdmf.backends.hdf5 import H5DataIO +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files.event_detection_file \ + import \ + EventDetectionFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + DataFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ + .rois_mixin import \ + RoisMixin +from allensdk.brain_observatory.behavior.event_detection import \ + filter_events_array +from allensdk.brain_observatory.behavior.write_nwb.extensions\ + .event_detection.ndx_ophys_events import \ + OphysEventDetection + + +class Events(DataObject, RoisMixin, DataFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + """Events + columns: + events: np.array + lambda: float + noise_std: float + cell_roi_id: int + """ + def __init__(self, + events: np.ndarray, + events_meta: pd.DataFrame, + filter_scale: float = 2, + filter_n_time_steps: int = 20): + """ + Parameters + ---------- + events + events + events_meta + lambda, noise_std, cell_roi_id for each roi + filter_scale + See filter_events_array for description + filter_n_time_steps + See filter_events_array for description + """ + + filtered_events = filter_events_array( + arr=events, scale=filter_scale, n_time_steps=filter_n_time_steps) + + # Convert matrix to list of 1d arrays so that it can be stored + # in a single column of the dataframe + events = [x for x in events] + filtered_events = [x for x in filtered_events] + + df = pd.DataFrame({ + 'events': events, + 'filtered_events': filtered_events, + 'lambda': events_meta['lambda'], + 'noise_std': events_meta['noise_std'], + 'cell_roi_id': events_meta['cell_roi_id'] + }) + super().__init__(name='events', value=df) + + @classmethod + def from_data_file(cls, + events_file: EventDetectionFile, + filter_scale: float = 2, + filter_n_time_steps: int = 20) -> "Events": + events, events_meta = events_file.data + return cls(events=events, events_meta=events_meta, + filter_scale=filter_scale, + filter_n_time_steps=filter_n_time_steps) + + @classmethod + def from_nwb(cls, + nwbfile: NWBFile, + filter_scale: float = 2, + filter_n_time_steps: int = 20) -> "Events": + event_detection = nwbfile.processing['ophys']['event_detection'] + # NOTE: The rois with events are stored in event detection + partial_cell_specimen_table = event_detection.rois.to_dataframe() + + events = event_detection.data[:] + + # events stored time x roi. Change back to roi x time + events = events.T + + events_meta = pd.DataFrame({ + 'cell_roi_id': partial_cell_specimen_table.index, + 'lambda': event_detection.lambdas[:], + 'noise_std': event_detection.noise_stds[:] + }) + return cls(events=events, events_meta=events_meta, + filter_scale=filter_scale, + filter_n_time_steps=filter_n_time_steps) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + events = self.value.set_index('cell_roi_id') + + ophys_module = nwbfile.processing['ophys'] + dff_interface = ophys_module.data_interfaces['dff'] + traces = dff_interface.roi_response_series['traces'] + seg_interface = ophys_module.data_interfaces['image_segmentation'] + + cell_specimen_table = ( + seg_interface.plane_segmentations['cell_specimen_table']) + cell_specimen_df = cell_specimen_table.to_dataframe() + + # We only want to store the subset of rois that have events data + rois_with_events_indices = [cell_specimen_df.index.get_loc(label) + for label in events.index] + roi_table_region = cell_specimen_table.create_roi_table_region( + description="Cells with detected events", + region=rois_with_events_indices) + + events_data = np.vstack(events['events']) + events = OphysEventDetection( + # time x rois instead of rois x time + # store using compression since sparse + data=H5DataIO(events_data.T, compression=True), + + lambdas=events['lambda'].values, + noise_stds=events['noise_std'].values, + unit='N/A', + rois=roi_table_region, + timestamps=traces.timestamps + ) + + ophys_module.add_data_interface(events) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py b/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py new file mode 100644 index 0000000000..dda58a7a67 --- /dev/null +++ b/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py @@ -0,0 +1,89 @@ +import warnings + +import numpy as np +import pandas as pd + + +class RoisMixin: + """A mixin for a collection of rois stored as a dataframe + (._value is a dataframe)""" + _value: pd.DataFrame + + def filter_and_reorder(self, roi_ids: np.ndarray, + raise_if_rois_missing=True): + """Orders dataframe according to input roi_ids. + Will also filter dataframe to contain only rois given by roi_ids. + Use for, ie excluding invalid rois + + Parameters + ---------- + roi_ids + Filter/reorder _value to these roi_ids + raise_if_rois_missing + Whether to raise exception if there are rois in the input roi_ids + not in the dataframe + + Notes + ---------- + Will both filter and reorder dataframe to have same order as the + input roi_ids. + + If there are values in the input roi_ids that are not in the dataframe, + then these roi ids will be ignored and a warning will be logged. + + Raises + ---------- + RuntimeError if raise_if_rois_missing and there are input roi_ids not + in dataframe + """ + def handle_rois_in_input_not_in_dataframe(): + msg = f'Input contains roi ids not in ' \ + f'{type(self).__name__}.' + if raise_if_rois_missing: + raise RuntimeError(msg) + warnings.warn(msg) + + # Drop rows where NaN + self._value = self._value.dropna(axis=0) + + # Make sure dtypes same after dropping NaN rows + # (adding NaN records coerces int to float) + for c in self._value: + # Skipping column added due to reset_index + if c == 'index': + continue + + if self._value[c].dtype != original_dtypes[c]: + self._value[c] = self._value[c].astype(original_dtypes[c]) + + original_index_name = self._value.index.name + original_index_type = self._value.index.dtype + original_dtypes = self._value.dtypes + if original_index_name is None: + original_index_name = 'index' + + if original_index_name != 'cell_roi_id': + self._value = (self._value + .reset_index() + .set_index('cell_roi_id')) + + # Reorders dataframe according to roi_ids + self._value = self._value.reindex(roi_ids) + + is_na = self._value.isna().any(axis=0) + + if is_na.any(): + # There are some roi ids in input not in index. + handle_rois_in_input_not_in_dataframe() + + if original_index_name != 'cell_roi_id': + # Set it back to the original index + self._value = (self._value + .reset_index() + .set_index(original_index_name)) + # Set index back to original dtype + # (can get coerced from int to float) + self._value.index = self._value.index.astype(original_index_type) + if original_index_name == 'index': + # Set it back to None + self._value.index.name = None diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py b/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af9d047f347219d25e0d760f3aa09fc5580270ca GIT binary patch literal 238 zcmYL@v1$V`42FG>Ar$UGGBh5tl@Quy4OvPygOP2~bK|p(<zBckPtga+lvnE7N9fk6 zx*_BTeG-y>q1U#35Ul=khAIC{xT)ddnS*8wC*H)O*<VGO+IReYZJ*SEu#kcd+|s}a z;;3FC*c2VC6vly6${5KqQ|?AmJ8u;EijNuW5#Eu#A@GJfN>ji`oeW<bpr$fPgB=V$ u73rV?Pd?CAk`_bIl+pU0jj|T7NK$JbebsuI$M5;NPwq3|W_tLSL;M2)NJz;5 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/corrected_fluorescence_traces.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/corrected_fluorescence_traces.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6813fcf849a1f7036d28646633cc72fd984b2116 GIT binary patch literal 3024 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/dff_traces.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/dff_traces.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9eaa61c9ac2a92bd20cb2519f635ae5c838513d0 GIT binary patch literal 3485 zcmbVONpBp-74E9;o~38uh@=+^a6%&vl8K?AfGh?CL5P+xP@qtOEW<#7Nuy_~hU`%< z<EkcQ62n761$GVu5+IiVLSP}M{H4C;l)vDUzgImAY2{$02VL{3>Q(hyzPH@#bOHxY z`maAm*E^2$ADS$l28dtcHGjn*9mx_$F#FGii+`SYsV{s+du~!o>!NOHFKMJr(X_Om z1ZhjOEL}_5X-9O@uISo%Jy}b8qG#zwaxGmK>y~aN8|kLlWX`W08OYWPN48W;t*ege zs@{2Byd~MkPQU$MNagJHSy|uv^xkfqC?X$>A0I2dYsuZ+`D*YWDx$~3i5eAsUT)Eh zcAlt6M#Drs%nGH)(MXk>d(Vfjt>P|P|5V4t6>h9IpX9OmZTxwhVY2pkdU#@<#;Gzz zlupfv<Xb%6oG=LpW$h@qawnc-FWDE)m`N_(7j5CInyRas^j^Bsm$et3Xs9OUj;z1r zvLTx<ymKZ3thKNfV67$FcCD>Cvh$M3u3W>Z?iY^dh&9-$S2iE)?mpGf&p^srVW|<H z3q=1UoQv0NVkn$*XTl_#L8J=~hq$=JJN<jGJ%4@|=_pk&nOQE~SU$_8>NCqJosBc8 zKHnaxBnfpMhq1h}JIa%zG&8rZEYdMK9^cx26q{l@A8(J7JSvtfWq{4F`V>6tWe}|N zkE7&B?P2blqp8wmBMjp#F2aylj7rA34L!+yVK_=6W5V#?&e#9Ae{25}1FiO>!$=N> z(eo%f*}t1bqdb$*Pxn=JZ1(f1%FGC3PQKoM6c6`JT&Nq<X!I;PP&k_;;E>ODhB}I~ zFdyQ^<EY5>$<9z6M#pikcO>wK9fG6TvF0#SH3Dujvs3A^vr=m?J<-=7?iTsSI<0xS zzI5ndshV5Xv**JxU|sgCaAC1TVp-FwIMUgOoJ<czb{(&E`aeO;oC)IlfNeQ{ab^te z=UdL1Tkx-3i%nO0FB)Gu6K~=_aL(B)cIGX(CN=4AIg`4q;e<c)Ck<IInnmy>_|BPZ zT=27+J=v1YXWV2(`%kRsNG5{|c2=LcUv+2oSByEc`eaSEX5OSH+q2q?L!QnBa?6Zj zy}MVsFiGiK%|;9o)3d<t259pxh65<_``#JD2XPQ$vA^-pypJ7Cz=rqTBp+$ABxpXk zS+*{LvClLTV8yE60`+xpI|1rOc{;uG6U?pkYwYxcmGz4}gwY4Lacz{CJ0KPZ#Cn_p z5TQ{A@M{qjah{bMSDYQ%baMLPoJC0+8fH6*hAP2qcv8j60vre!h~1LPjC4Gu3kCdo zfPeiSsl;@b<R@$kzIV6p+j;2`+)D2V5m0)FJ0pS>GWyr_8u-g#s&nKA6K4k{&!(jx zX&s%Ez75&3W+Td!YZkfjB3&A>F-@ZEs**;$Gtw$5l#Ow#VpvIua7<z(Sr-vfiPpVq z5FVt-ue8p!COC@qNXqc)hs5<uS88RZd1mOVI##A+Px}qMPMW_>!#i|GyNZA`mq&?$ zzLfIpo%;K<-J|q#Sv1k1fLkh7!DWsIf&#Lp_4Egz&5toSyv+mNWnCVy8h#$*tmpPv zzyeM*y&Uvu@7rMM^GZ&F>oN)ZnAGsz$7}w80nvqcBmh$+PEZ>VT^vzCb=Ubbt$Bz~ zAJNAVL-kiq%rI+!qd5sCR2wXp^rU~mWerj2744ZP>lYMHjXixGU$LQJ0aGD}>-TAu zU<5S%sQR<HvZG0L-Nzs{$a>%MLUr&4wo5*hs5n$&sZ5aNC@6&gkg~u20kQbj_9c&{ zZeiZ{OLvqQYZp-`PavplFbXcm)*01cUC|ipJSC2MIBG~%2PR*4dvM1lYqQJQalwkX zY0$lt9`zN=6XfW%mhXWe%b)Rr&A4RNRvaxxRWRn}u_C+rXJFR9pkb9ZD9za1QFiU8 zEsW`-kFjBF55SQ@-d%y>DjU9JrCTI8`d>;%9-uruVY*j9x^sq1>e>~LP(m0vC+~Wv z{U<ixo9*IIZD&X6P-$B{$s-1J*siDfajZ_?zaM2;UTjOM=xLn2&aX*|Dr@>xw(wOt zEl$ezlcS7MNfo>wf=hTYQX#ak@o25FGRfwFD#A*bFo!R!Fi&yH5cD11U=4Qqy_ISH z7dyHcRC6lxVOR!XSVcJKb{Kwk6eZP;-obtPCJj_NHPs1CeXbs0K-Q<Cj~3=Im-^?l zOrFsn(VmMWpl=b?nKuVEXNM~kLOZHA*3A~aly(e3r{Qk4kOto4Y`u-wtHAxXs7)hu z5XMR+d{_V_{fFQe{`7>9PU4A{r3W@~Rf+JUMK3XUt(O=qdWpdjVP>!dIB6qpe&^Hk zPDE1@5)a?>7#by`2FUofm0smgqsgn9x{Uw#(&zJz`|_pKxrpDqv5;2^uNhDo3{&dc zb(1c9^u`yiN@(S>OWjt5G|Cby&|J=6w=2-zp|G-D3jx2)+8i&6NSl6s7bWByL{_TO literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py b/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py new file mode 100644 index 0000000000..36f9a2cd9a --- /dev/null +++ b/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py @@ -0,0 +1,83 @@ +import numpy as np +import pandas as pd +from pynwb import NWBFile +from pynwb.ophys import Fluorescence + +from allensdk.brain_observatory.behavior.data_files.demix_file import DemixFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + DataFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ + .rois_mixin import \ + RoisMixin + + +class CorrectedFluorescenceTraces(DataObject, RoisMixin, + DataFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + def __init__(self, traces: pd.DataFrame): + """ + + Parameters + ---------- + traces + index cell_roi_id + columns: + - corrected_fluorescence + list of float + """ + super().__init__(name='corrected_fluorescence_traces', value=traces) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) \ + -> "CorrectedFluorescenceTraces": + corr_fluorescence_nwb = nwbfile.processing[ + 'ophys'].data_interfaces[ + 'corrected_fluorescence'].roi_response_series['traces'] + # f traces stored as timepoints x rois in NWB + # We want rois x timepoints, hence the transpose + f_traces = corr_fluorescence_nwb.data[:].T + df = pd.DataFrame({'corrected_fluorescence': f_traces.tolist()}, + index=pd.Index( + data=corr_fluorescence_nwb.rois.table.id[:], + name='cell_roi_id')) + return cls(traces=df) + + @classmethod + def from_data_file(cls, + demix_file: DemixFile) \ + -> "CorrectedFluorescenceTraces": + corrected_fluorescence_traces = demix_file.data + return cls(traces=corrected_fluorescence_traces) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + corrected_fluorescence_traces = self.value['corrected_fluorescence'] + + # Convert from Series of lists to numpy array + # of shape ROIs x timepoints + traces = np.stack( + [x for x in corrected_fluorescence_traces]) + + # Create/Add corrected_fluorescence_traces modules and interfaces: + ophys_module = nwbfile.processing['ophys'] + + roi_table_region = \ + nwbfile.processing['ophys'].data_interfaces[ + 'dff'].roi_response_series[ + 'traces'].rois # noqa: E501 + ophys_timestamps = ophys_module.get_data_interface( + 'dff').roi_response_series['traces'].timestamps + f_interface = Fluorescence(name='corrected_fluorescence') + ophys_module.add_data_interface(f_interface) + + f_interface.create_roi_response_series( + name='traces', + data=traces.T, # Should be stored as timepoints x rois + unit='NA', + rois=roi_table_region, + timestamps=ophys_timestamps) + return nwbfile diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py b/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py new file mode 100644 index 0000000000..8b8f5af6aa --- /dev/null +++ b/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py @@ -0,0 +1,88 @@ +import pandas as pd +import numpy as np +from pynwb import NWBFile +from pynwb.ophys import DfOverF + +from allensdk.brain_observatory.behavior.data_files.dff_file import DFFFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + DataFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ + .rois_mixin import \ + RoisMixin +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .ophys_timestamps import \ + OphysTimestamps + + +class DFFTraces(DataObject, RoisMixin, + DataFileReadableInterface, NwbReadableInterface, + NwbWritableInterface): + def __init__(self, traces: pd.DataFrame): + """ + Parameters + ---------- + traces + index cell_roi_id + columns: + dff: List of float + """ + super().__init__(name='dff_traces', value=traces) + + def to_nwb(self, nwbfile: NWBFile, + ophys_timestamps: OphysTimestamps) -> NWBFile: + dff_traces = self.value[['dff']] + + ophys_module = nwbfile.processing['ophys'] + # trace data in the form of rois x timepoints + trace_data = np.array([dff_traces.loc[cell_roi_id].dff + for cell_roi_id in dff_traces.index.values]) + + cell_specimen_table = nwbfile.processing['ophys'].data_interfaces[ + 'image_segmentation'].plane_segmentations[ + 'cell_specimen_table'] # noqa: E501 + roi_table_region = cell_specimen_table.create_roi_table_region( + description="segmented cells labeled by cell_specimen_id", + region=slice(len(dff_traces))) + + # Create/Add dff modules and interfaces: + assert dff_traces.index.name == 'cell_roi_id' + dff_interface = DfOverF(name='dff') + ophys_module.add_data_interface(dff_interface) + + dff_interface.create_roi_response_series( + name='traces', + data=trace_data.T, # Should be stored as timepoints x rois + unit='NA', + rois=roi_table_region, + timestamps=ophys_timestamps.value) + + return nwbfile + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "DFFTraces": + dff_nwb = nwbfile.processing[ + 'ophys'].data_interfaces['dff'].roi_response_series['traces'] + # dff traces stored as timepoints x rois in NWB + # We want rois x timepoints, hence the transpose + dff_traces = dff_nwb.data[:].T + + df = pd.DataFrame({'dff': dff_traces.tolist()}, + index=pd.Index(data=dff_nwb.rois.table.id[:], + name='cell_roi_id')) + return DFFTraces(traces=df) + + @classmethod + def from_data_file(cls, dff_file: DFFFile) -> "DFFTraces": + dff_traces = dff_file.data + return DFFTraces(traces=dff_traces) + + def get_number_of_frames(self) -> int: + """Returns the number of frames in the movie""" + if self.value.empty: + raise RuntimeError('Cannot determine number of frames') + return len(self.value.iloc[0]['dff']) diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__init__.py b/brain_observatory/behavior/data_objects/eye_tracking/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d127419c0f2976f76d3563f5fe57ee9ccc9de37 GIT binary patch literal 229 zcmYL@zX}2|490ulAi_O}gLZHe5&x{>B5s9}UV~TfY>&2{bo2#$2`694)kko1GB=1H z<d=}-3t8p)fRRr3D|GqQ;irs>1x4r)G~2OZwtX<)wg33s)>E+$=!1X~^jN_KY!XWg zg|iwa0&N?FYtV**=$bMGu`x;n6LHi)QNaPpTi3LqE3P~kE1jZ?Ekx%NS6D)8oaY)M l(Bz0k3>*{6=*e#EflFzuiBgW6^z6@0PM>R>cYnSq*cW1FMLqxk literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/eye_tracking_table.cpython-37.pyc b/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/eye_tracking_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29ff8601b7c79247c73f337b6404e9a8a1c2e47f GIT binary patch literal 5486 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/rig_geometry.cpython-37.pyc b/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/rig_geometry.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76085e3e4a9dfc2c122957f9833ccd5a1d38d0b4 GIT binary patch literal 9016 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 Kp|{!#>i+?`BIE}E literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py b/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py new file mode 100644 index 0000000000..6a765afe28 --- /dev/null +++ b/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py @@ -0,0 +1,198 @@ +import logging +import warnings +from pathlib import Path +from typing import Optional + +import numpy as np +import pandas as pd +from pynwb import NWBFile, TimeSeries + +from allensdk.brain_observatory import sync_utilities +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ + EyeTrackingFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + NwbReadableInterface, DataFileReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.eye_tracking_processing import \ + process_eye_tracking_data, determine_outliers, determine_likely_blinks +from allensdk.brain_observatory.nwb.eye_tracking.ndx_ellipse_eye_tracking \ + import \ + EllipseSeries, EllipseEyeTracking +from allensdk.brain_observatory.sync_dataset import Dataset + + +class EyeTrackingTable(DataObject, DataFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + """corneal, eye, and pupil ellipse fit data""" + _logger = logging.getLogger(__name__) + + def __init__(self, eye_tracking: pd.DataFrame): + super().__init__(name='eye_tracking', value=eye_tracking) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + eye_tracking_df = self.value + + eye_tracking = EllipseSeries( + name='eye_tracking', + reference_frame='nose', + data=eye_tracking_df[['eye_center_x', 'eye_center_y']].values, + area=eye_tracking_df['eye_area'].values, + area_raw=eye_tracking_df['eye_area_raw'].values, + width=eye_tracking_df['eye_width'].values, + height=eye_tracking_df['eye_height'].values, + angle=eye_tracking_df['eye_phi'].values, + timestamps=eye_tracking_df['timestamps'].values + ) + + pupil_tracking = EllipseSeries( + name='pupil_tracking', + reference_frame='nose', + data=eye_tracking_df[['pupil_center_x', 'pupil_center_y']].values, + area=eye_tracking_df['pupil_area'].values, + area_raw=eye_tracking_df['pupil_area_raw'].values, + width=eye_tracking_df['pupil_width'].values, + height=eye_tracking_df['pupil_height'].values, + angle=eye_tracking_df['pupil_phi'].values, + timestamps=eye_tracking + ) + + corneal_reflection_tracking = EllipseSeries( + name='corneal_reflection_tracking', + reference_frame='nose', + data=eye_tracking_df[['cr_center_x', 'cr_center_y']].values, + area=eye_tracking_df['cr_area'].values, + area_raw=eye_tracking_df['cr_area_raw'].values, + width=eye_tracking_df['cr_width'].values, + height=eye_tracking_df['cr_height'].values, + angle=eye_tracking_df['cr_phi'].values, + timestamps=eye_tracking + ) + + likely_blink = TimeSeries(timestamps=eye_tracking, + data=eye_tracking_df['likely_blink'].values, + name='likely_blink', + description='blinks', + unit='N/A') + + ellipse_eye_tracking = EllipseEyeTracking( + eye_tracking=eye_tracking, + pupil_tracking=pupil_tracking, + corneal_reflection_tracking=corneal_reflection_tracking, + likely_blink=likely_blink + ) + + nwbfile.add_acquisition(ellipse_eye_tracking) + return nwbfile + + @classmethod + def from_nwb(cls, nwbfile: NWBFile, + z_threshold: float = 3.0, + dilation_frames: int = 2) -> Optional["EyeTrackingTable"]: + """ + Parameters + ----------- + nwbfile + z_threshold + See from_lims for description + dilation_frames + See from_lims for description + """ + try: + eye_tracking_acquisition = nwbfile.acquisition['EyeTracking'] + except KeyError as e: + warnings.warn("This ophys session " + f"'{int(nwbfile.identifier)}' has no eye " + f"tracking data. (NWB error: {e})") + return None + + eye_tracking = eye_tracking_acquisition.eye_tracking + pupil_tracking = eye_tracking_acquisition.pupil_tracking + corneal_reflection_tracking = \ + eye_tracking_acquisition.corneal_reflection_tracking + + eye_tracking_dict = { + "timestamps": eye_tracking.timestamps[:], + "cr_area": corneal_reflection_tracking.area_raw[:], + "eye_area": eye_tracking.area_raw[:], + "pupil_area": pupil_tracking.area_raw[:], + "likely_blink": eye_tracking_acquisition.likely_blink.data[:], + + "pupil_area_raw": pupil_tracking.area_raw[:], + "cr_area_raw": corneal_reflection_tracking.area_raw[:], + "eye_area_raw": eye_tracking.area_raw[:], + + "cr_center_x": corneal_reflection_tracking.data[:, 0], + "cr_center_y": corneal_reflection_tracking.data[:, 1], + "cr_width": corneal_reflection_tracking.width[:], + "cr_height": corneal_reflection_tracking.height[:], + "cr_phi": corneal_reflection_tracking.angle[:], + + "eye_center_x": eye_tracking.data[:, 0], + "eye_center_y": eye_tracking.data[:, 1], + "eye_width": eye_tracking.width[:], + "eye_height": eye_tracking.height[:], + "eye_phi": eye_tracking.angle[:], + + "pupil_center_x": pupil_tracking.data[:, 0], + "pupil_center_y": pupil_tracking.data[:, 1], + "pupil_width": pupil_tracking.width[:], + "pupil_height": pupil_tracking.height[:], + "pupil_phi": pupil_tracking.angle[:], + + } + + eye_tracking_data = pd.DataFrame(eye_tracking_dict) + eye_tracking_data.index = eye_tracking_data.index.rename('frame') + + # re-calculate likely blinks for new z_threshold and dilate_frames + area_df = eye_tracking_data[['eye_area_raw', 'pupil_area_raw']] + outliers = determine_outliers(area_df, z_threshold=z_threshold) + likely_blinks = determine_likely_blinks( + eye_tracking_data['eye_area_raw'], + eye_tracking_data['pupil_area_raw'], + outliers, + dilation_frames=dilation_frames) + + eye_tracking_data["likely_blink"] = likely_blinks + eye_tracking_data.at[likely_blinks, "eye_area"] = np.nan + eye_tracking_data.at[likely_blinks, "pupil_area"] = np.nan + eye_tracking_data.at[likely_blinks, "cr_area"] = np.nan + + return EyeTrackingTable(eye_tracking=eye_tracking_data) + + @classmethod + def from_data_file(cls, data_file: EyeTrackingFile, + sync_file: SyncFile, + z_threshold: float = 3.0, dilation_frames: int = 2 + ) -> "EyeTrackingTable": + """ + Parameters + ---------- + data_file + sync_file + z_threshold : float, optional + See EyeTracking.from_lims + dilation_frames : int, optional + See EyeTracking.from_lims + """ + cls._logger.info(f"Getting eye_tracking_data with " + f"'z_threshold={z_threshold}', " + f"'dilation_frames={dilation_frames}'") + + sync_path = Path(sync_file.filepath) + + frame_times = sync_utilities.get_synchronized_frame_times( + session_sync_file=sync_path, + sync_line_label_keys=Dataset.EYE_TRACKING_KEYS, + trim_after_spike=False) + + eye_tracking_data = process_eye_tracking_data(data_file.data, + frame_times, + z_threshold, + dilation_frames) + return EyeTrackingTable(eye_tracking=eye_tracking_data) diff --git a/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py b/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py new file mode 100644 index 0000000000..692e818eb8 --- /dev/null +++ b/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py @@ -0,0 +1,284 @@ +import warnings + +import numpy as np +import pandas as pd +from typing import Optional + +import pynwb +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + LimsReadableInterface, JsonReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.schemas import \ + OphysEyeTrackingRigMetadataSchema +from allensdk.brain_observatory.nwb import load_pynwb_extension +from allensdk.internal.api import PostgresQueryMixin + + +class Coordinates: + """Represents coordinates in 3d space""" + def __init__(self, x: float, y: float, z: float): + self._x = x + self._y = y + self._z = z + + @property + def x(self): + return self._x + + @property + def y(self): + return self._y + + @property + def z(self): + return self._z + + def __iter__(self): + yield self._x + yield self._y + yield self._z + + def __eq__(self, other): + if type(other) not in (type(self), list): + raise ValueError(f'Do not know how to compare with type ' + f'{type(other)}') + if isinstance(other, list): + return self._x == other[0] and \ + self._y == other[1] and \ + self._z == other[2] + else: + return self._x == other.x and \ + self._y == other.y and \ + self._z == other.z + + def __str__(self): + return f'[{self._x}, {self._y}, {self._z}]' + + +class RigGeometry(DataObject, LimsReadableInterface, JsonReadableInterface, + NwbReadableInterface, NwbWritableInterface): + def __init__(self, equipment: str, + monitor_position_mm: Coordinates, + monitor_rotation_deg: Coordinates, + camera_position_mm: Coordinates, + camera_rotation_deg: Coordinates, + led_position: Coordinates): + super().__init__(name='rig_geometry', value=self) + self._monitor_position_mm = monitor_position_mm + self._monitor_rotation_deg = monitor_rotation_deg + self._camera_position_mm = camera_position_mm + self._camera_rotation_deg = camera_rotation_deg + self._led_position = led_position + self._equipment = equipment + + @property + def monitor_position_mm(self): + return self._monitor_position_mm + + @property + def monitor_rotation_deg(self): + return self._monitor_rotation_deg + + @property + def camera_position_mm(self): + return self._camera_position_mm + + @property + def camera_rotation_deg(self): + return self._camera_rotation_deg + + @property + def led_position(self): + return self._led_position + + @property + def equipment(self): + return self._equipment + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + eye_tracking_rig_mod = pynwb.ProcessingModule( + name='eye_tracking_rig_metadata', + description='Eye tracking rig metadata module') + + nwb_extension = load_pynwb_extension( + OphysEyeTrackingRigMetadataSchema, 'ndx-aibs-behavior-ophys') + + rig_metadata = nwb_extension( + name="eye_tracking_rig_metadata", + equipment=self._equipment, + monitor_position=list(self._monitor_position_mm), + monitor_position__unit_of_measurement="mm", + camera_position=list(self._camera_position_mm), + camera_position__unit_of_measurement="mm", + led_position=list(self._led_position), + led_position__unit_of_measurement="mm", + monitor_rotation=list(self._monitor_rotation_deg), + monitor_rotation__unit_of_measurement="deg", + camera_rotation=list(self._camera_rotation_deg), + camera_rotation__unit_of_measurement="deg" + ) + + eye_tracking_rig_mod.add_data_interface(rig_metadata) + nwbfile.add_processing_module(eye_tracking_rig_mod) + return nwbfile + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> Optional["RigGeometry"]: + try: + et_mod = \ + nwbfile.get_processing_module("eye_tracking_rig_metadata") + except KeyError as e: + warnings.warn("This ophys session " + f"'{int(nwbfile.identifier)}' has no eye " + f"tracking rig metadata. (NWB error: {e})") + return None + + meta = et_mod.get_data_interface("eye_tracking_rig_metadata") + + monitor_position = meta.monitor_position[:] + monitor_position = (monitor_position.tolist() + if isinstance(monitor_position, np.ndarray) + else monitor_position) + + monitor_rotation = meta.monitor_rotation[:] + monitor_rotation = (monitor_rotation.tolist() + if isinstance(monitor_rotation, np.ndarray) + else monitor_rotation) + + camera_position = meta.camera_position[:] + camera_position = (camera_position.tolist() + if isinstance(camera_position, np.ndarray) + else camera_position) + + camera_rotation = meta.camera_rotation[:] + camera_rotation = (camera_rotation.tolist() + if isinstance(camera_rotation, np.ndarray) + else camera_rotation) + + led_position = meta.led_position[:] + led_position = (led_position.tolist() + if isinstance(led_position, np.ndarray) + else led_position) + + return RigGeometry( + equipment=meta.equipment, + monitor_position_mm=Coordinates(*monitor_position), + camera_position_mm=Coordinates(*camera_position), + led_position=Coordinates(*led_position), + monitor_rotation_deg=Coordinates(*monitor_rotation), + camera_rotation_deg=Coordinates(*camera_rotation) + ) + + @classmethod + def from_json(cls, dict_repr: dict) -> "RigGeometry": + rg = dict_repr['eye_tracking_rig_geometry'] + return RigGeometry( + equipment=rg['equipment'], + monitor_position_mm=Coordinates(*rg['monitor_position_mm']), + monitor_rotation_deg=Coordinates(*rg['monitor_rotation_deg']), + camera_position_mm=Coordinates(*rg['camera_position_mm']), + camera_rotation_deg=Coordinates(*rg['camera_rotation_deg']), + led_position=Coordinates(*rg['led_position']) + ) + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> Optional["RigGeometry"]: + query = f''' + SELECT oec.*, oect.name as config_type, equipment.name as + equipment_name + FROM ophys_sessions os + JOIN observatory_experiment_configs oec ON oec.equipment_id = + os.equipment_id + JOIN observatory_experiment_config_types oect ON oect.id = + oec.observatory_experiment_config_type_id + JOIN ophys_experiments oe ON oe.ophys_session_id = os.id + JOIN equipment ON equipment.id = oec.equipment_id + WHERE oe.id = {ophys_experiment_id} AND + oec.active_date <= os.date_of_acquisition AND + oect.name IN ('eye camera position', 'led position', 'screen position') + ''' # noqa E501 + # Get the raw data + rig_geometry = pd.read_sql(query, lims_db.get_connection()) + + if rig_geometry.empty: + # There is no rig geometry for this experiment + return None + + # Map the config types to new names + rig_geometry_config_type_map = { + 'eye camera position': 'camera', + 'screen position': 'monitor', + 'led position': 'led' + } + rig_geometry['config_type'] = rig_geometry['config_type'] \ + .map(rig_geometry_config_type_map) + + rig_geometry = cls._select_most_recent_geometry( + rig_geometry=rig_geometry) + + # Construct dictionary for positions + position = rig_geometry[['center_x_mm', 'center_y_mm', 'center_z_mm']] + position.index = [ + f'{v}_position_mm' if v != 'led' + else f'{v}_position' for v in position.index] + position = position.to_dict(orient='index') + position = { + config_type: + Coordinates( + values['center_x_mm'], + values['center_y_mm'], + values['center_z_mm']) + for config_type, values in position.items() + } + + # Construct dictionary for rotations + rotation = rig_geometry[['rotation_x_deg', 'rotation_y_deg', + 'rotation_z_deg']] + rotation = rotation[rotation.index != 'led'] + rotation.index = [f'{v}_rotation_deg' for v in rotation.index] + rotation = rotation.to_dict(orient='index') + rotation = { + config_type: + Coordinates( + values['rotation_x_deg'], + values['rotation_y_deg'], + values['rotation_z_deg'] + ) + for config_type, values in rotation.items() + } + + # Combine the dictionaries + rig_geometry = { + **position, + **rotation, + 'equipment': rig_geometry['equipment_name'].iloc[0] + } + return RigGeometry(**rig_geometry) + + @staticmethod + def _select_most_recent_geometry(rig_geometry: pd.DataFrame): + """There can be multiple geometry entries in LIMS for a rig. + Select most recent one. + + Parameters + ---------- + rig_geometry + Table of geometries for rig as returned by LIMS + + Notes + ---------- + The geometries in rig_geometry are assumed to precede the + date_of_acquisition of the session + (only relevant for retrieving from LIMS) + """ + rig_geometry = rig_geometry.sort_values('active_date', ascending=False) + rig_geometry = rig_geometry.groupby('config_type') \ + .apply(lambda x: x.iloc[0]) + return rig_geometry diff --git a/brain_observatory/behavior/data_objects/licks.py b/brain_observatory/behavior/data_objects/licks.py new file mode 100644 index 0000000000..1d93240140 --- /dev/null +++ b/brain_observatory/behavior/data_objects/licks.py @@ -0,0 +1,124 @@ +import logging +from typing import Optional + +import pandas as pd +from pynwb import NWBFile, TimeSeries, ProcessingModule + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + StimulusFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface + + +class Licks(DataObject, StimulusFileReadableInterface, NwbReadableInterface, + NwbWritableInterface): + _logger = logging.getLogger(__name__) + + def __init__(self, licks: pd.DataFrame): + """ + :param licks + dataframe containing the following columns: + - timestamps: float + stimulus timestamps in which there was a lick + - frame: int + frame number in which there was a lick + """ + super().__init__(name='licks', value=licks) + + @classmethod + def from_stimulus_file(cls, stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps) -> "Licks": + """Get lick data from pkl file. + This function assumes that the first sensor in the list of + lick_sensors is the desired lick sensor. + + Since licks can occur outside of a trial context, the lick times + are extracted from the vsyncs and the frame number in `lick_events`. + Since we don't have a timestamp for when in "experiment time" the + vsync stream starts (from self.get_stimulus_timestamps), we compute + it by fitting a linear regression (frame number x time) for the + `start_trial` and `end_trial` events in the `trial_log`, to true + up these time streams. + + :returns: pd.DataFrame + Two columns: "time", which contains the sync time + of the licks that occurred in this session and "frame", + the frame numbers of licks that occurred in this session + """ + data = stimulus_file.data + + lick_frames = (data["items"]["behavior"]["lick_sensors"][0] + ["lick_events"]) + + # there's an occasional bug where the number of logged + # frames is one greater than the number of vsync intervals. + # If the animal licked on this last frame it will cause an + # error here. This fixes the problem. + # see: https://github.com/AllenInstitute/visual_behavior_analysis + # /issues/572 # noqa: E501 + # & https://github.com/AllenInstitute/visual_behavior_analysis + # /issues/379 # noqa:E501 + # + # This bugfix copied from + # https://github.com/AllenInstitute/visual_behavior_analysis/blob + # /master/visual_behavior/translator/foraging2/extract.py#L640-L647 + + if len(lick_frames) > 0: + if lick_frames[-1] == len(stimulus_timestamps.value): + lick_frames = lick_frames[:-1] + cls._logger.error('removed last lick - ' + 'it fell outside of stimulus_timestamps ' + 'range') + + lick_times = \ + [stimulus_timestamps.value[frame] for frame in lick_frames] + df = pd.DataFrame({"timestamps": lick_times, "frame": lick_frames}) + return cls(licks=df) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> Optional["Licks"]: + if 'licking' in nwbfile.processing: + lick_module = nwbfile.processing['licking'] + licks = lick_module.get_data_interface('licks') + timestamps = licks.timestamps[:] + frame = licks.data[:] + else: + timestamps = [] + frame = [] + + df = pd.DataFrame({ + 'timestamps': timestamps, + 'frame': frame + }) + + return cls(licks=df) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + + # If there is no lick data, do not write + # anything to the NWB file (this is + # expected for passive sessions) + if len(self.value['frame']) == 0: + return nwbfile + + lick_timeseries = TimeSeries( + name='licks', + data=self.value['frame'].values, + timestamps=self.value['timestamps'].values, + description=('Timestamps and stimulus presentation ' + 'frame indices for lick events'), + unit='N/A' + ) + + # Add lick interface to nwb file, by way of a processing module: + licks_mod = ProcessingModule('licking', + 'Licking behavior processing module') + licks_mod.add_data_interface(lick_timeseries) + nwbfile.add_processing_module(licks_mod) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/metadata/__init__.py b/brain_observatory/behavior/data_objects/metadata/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ed241ec6cea4010cdda0a6f4b10c8d48405d95f GIT binary patch literal 225 zcmYL@I|>3Z5Qej0A;KQSLQ~j@h>uom#4Zpfo579lCQA}mwzTycR$j^0BiLCvDa3*Q zo8g}av&!=Uqp0s!NcolUi;Ri|Df9@M?btBeKA2DTAD`QLD)s?=5Kw|1E4YB|#L`0H ztcHm|+Xmqpw4ornrtE^)7$t&<IBK9c!2xNvs%S!=xbk4Ebc!yv5S{P1!V+5JJl7C` hI!7#G;59}_2A9%U6QvwC-LpTdojzAMPd~m%><c}QLxunV literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/__pycache__/behavior_ophys_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/__pycache__/behavior_ophys_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83808a0861e79e1d27b135ef5681068b8cc23e07 GIT binary patch literal 4910 zcmd5=TW=gm74F+yJu@ELV>?ck>;MbPXt5nw2_b|KWFaW4jT1InMQRzfdZubTJ=@(g zTU8Us*7yP0(mv&p2c$fJcmat&M8ER1KY*8&5PYZlGQK4wE3Kf%RekDoT~3|z)j6kp zx7n;4c%nc5&j0-l!}td^@}~;o=P2@TsF=ab(1=XeG>NuCE3#c%({|`YCASon-Lh^w zVI``%)u`syqPknxyi&LnHQa`#%V9HWxh+js!sV##wl!T1SE5ySRnxU_E$X-(P1nQq zXv5vm^isGP-EeQ1#;*<5V9hgwHF=5Gd6n0A<Fw*#vDRawxBLYpHhN}K`Xmk}F^J0E zle_nVkoT;l{!3r^5Bp<2P|3<&KJuRi6Y-c!iJtda&ra4ql#}>l?lZq1^82ykV(1Te z(%C!gU*)cU6h!h08!J-xCn8W6CIP>lFZqBgETMexRv*kl6-+}v=I6MZ52vFe`KxDB zE`o^1>fEPW`qSl^9uG!5qWL=E#An|0C_e0a{F&l0?TyxXG?D5+aQT}V7e^0*XF)t5 zP32EHBjjH|aKkm3;ac404s=`|T3f)t3+r=ZXfli0XAQRkz1z%rVX_h{pE;+dTLZ^o z74#%-mDM!2&X?E*Z}29Nv-HB&mMfum3;a#K3~uX%#g<w7jJR!ZZ}1gxSHN9mYnr>t zSHL4qhpnGE?%L;uW4Ikydn;MbHKEl~=*db}`k8&bDARV*nvhnD_Q1~eOm7E;-m;5I z8K=hBWab=be{Pw^9F%9xEz~wMu&%x5ZWi-joE0#0Vn5<Z>8T&ic+W{nat1plRnH6J zKzUxW>J?)P*_ORa)7Xh4c{mg+kVmYdf)Q(;Hwb+xJ@2o^mw))+C;OjBF66#H^4U(` zKlJ0H{a?iXU=lO`{e2!kmHU$^5HLWkXW#!Q=<mxw@$IQU_|!k(7#oJ@!9LyX3qOdx zNgp#l_0>ci?dC%65>)Ypj*Z;SB`!W+5`1TRBsL)KH&LWUmEE?==JD;jnLQqo5pqNA z<VwNr%7UwzhzBM{(nD`5AE4-&=Ej(mZ|?O>u?Z$#TX>0EMfDa@q_G}~v``t=@w?Zr zoNuqdL(dWo3=m7GUQY<P&6f#57TZQig|Ls`xn78iM!yFaw3f1XarV7{C6y4a#$$c) z4U&zpN>2raXsw_RK`5XWShbk>+&XcTg_eUBFnm&)+v1M0v+p)I<+!Ds^X<7YFU`x$ zd2T_;rQ?6r>)q^m<O?7g-cS~-?cym|*9cyG%j7TG0ghqe_zEs9_hiJ?h>Nb8bcb9G zM%^56-Qh%Z{kXf(OjnJ3)eU5K>I>DK47>h?nQ#siFpaq~Du@rd*{Zx7ME(IWwCi2$ z3m~`+O(quW<0P*YAdzX5fHB0|_?~sk>BS)}i4qO34aFq#XxD<Gtj3f^SFe)TgHY;4 z^ys8{K^KC~&En8s#`d@H^@k{uj+oJM%(|5p$82QO@!Qu!t&j-&s<B|8Ji(_TMHG2H zdPw#HQ9nW>MHKL4p4fA!Mq>(|5p5@Kq<BhOK#x6l2y5gYkN@?i=qV&BY<NL01^0i5 zkwS)#wWC^qCOZp@EyFW?2igNl7RYck5;A0rk!PF(MM-=c-Srsp4pGIh%K-Q;zCJ>c zZB#~^jGh9Z3hI@nrzK(f3NnKs(xI=*@PA)u;q}}`CQqT<|2wm1POuB3z6+gSXVj`b zT-eD~o6?Z~V$<)TONf%%v~kI%FA1FaiUS?xFq(390)>tSl*LiF9GhcnuFos77;4*# zwsKU7S*O+s@|v-M^KFdFh#Hl-qpGKt*qb}!8sdgCt|L}dnSFxTfVRbmw}jFdH+9{j zxG}fK%V@PxRzR<!*yA;{I%*yC#;J*Vla-&hPAYTrk2mI(Kbe$S!CO=)pp%}CH)Hl} z+YkD3J9oU>I;sfD1HSk-o}`+`gI-Ilft$3`xU+E3?%FWmA@e3f?`gmfy~BX1k=wb* z9P!{_q>{BP40t*Wcn4xKn<iV=FulQK7NfsZ0Yb=3dP53{p70e<HWwiY-LjxVkwQn3 zMlP8;nsVg5pUr|P<@BD;5}Wy2j8D}lS<m<F<)daZOhiGUx22OFw=HKn6)W<Vq^u?$ zu!jshpIfvrKs2eM93`m-GKi(};{i_*`hEID`H6TB)n$#zkv~NOs}+}&Q&ou_>b*-9 zZA;vtszcQeP$jlhLQrJVvbrliV_xX@wUC~^>r~TZjqL0;A@1UO;x>z2lX2a8YEhy^ zA*kD+F}d+CyT$i0>luptF)G7sn{CT7tH?XcR^2Rvf|~@#g0ln<Z=%v)8Sg6MXx%z~ z>-xx<s<&s}%l_6WmnZ8Xm#=$XG-0!l=!WNgHuJ;uOB(m-a4xb+ofs$8sX#(5)X~Dr zCrdi7$L>ZGme@h8#4?SfaGy978U;CiL2+7;yAZVDq?z3Z20RQsZ=n+$r<>GCr^DnE z$YPRORhu@xQMSxBsE%XV8@DX0a}#AlP|v;IP2lNhiquGu@NP-pCH2bgo&2`2bLF<M zlbdko{B1!{GNCgf_x_uX#f?Vt9g$tead*mY<5JMALR6?CpZ8T~KFn_D=Vz|be7}8T zNpn;dN+@u8m7{Uto_zH+uB6$;>N>a0JlQLm+6TDN*CE48rPHUteeZSFl=`0;Qu{CW z_A5qEz$H)Tt{0s&OkzLW@uxw0h6vS*qmfc{6q4#s)06u%3NDfkOv7qeZL8xnZ2YLU L8fL?8;l%t0!u~+r literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9516c7d7b03b97016390e9c9577ed26cd3b61f8 GIT binary patch literal 243 zcmYLDJqyAx5RKp<LVt*Zc5o9BKUQ%Ow?McwhmCEMlEg|!|A(8Cf63LK;O69Ius(S2 zj`!}4TPMko5vuzYVtqyVp-0V<==&s!?b)cedoUO6zkF_+89#V*o<k05BH;q2<tqc3 zH43I2P2;(((fEwi)_LpsR!i=6z;O*(0Y{|WvZM)Bq|$*l!b-Z>K(MY&CFam*>rw>) kC^=ykd|F|EXmqjY93iyPL5NA+J_qy4s&k2p`1PB}zJSw8w*UYD literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..453131db697ee323ecd2ad297e65918fc4b5c44b GIT binary patch literal 14599 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 NdSkwE`#`!@`){96LQwz! literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_id.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcb1188958aa4b8ea2e1af09d853d081a1647fc7 GIT binary patch literal 2625 zcmbVO-ESL35Z~Q9+h^zOIA1_p5Ed#R3)MmD8()Hk6jG&5Nn1raSvsw6H}$3W;qIQ3 zI!Yx_B2_}lUqE=`0r4;0D^L9wcw%P#kvIkkvC{4B?aa;nX684ucduHl5E$`qKk=GF z$e;Ky8SqTLhD-kplOTddB&HsvxMmTHEzgQ=&o<9iREUdS(X8#L6g!?1m%Vaa@hWDo z5G};6=bCjfs>U_1X4a)>F|K=cO5~DoE~qGr%9-sge@DcEaL<TvWnGq~BP-H9EqN=V z`j|9pZvYQz(!A8(yLUf~WRvB^fCoJ(a%X$@=>{%Q+~d0UTn?L7zV<+;$*$yrcO$u# zWK!+(K;~=PVXWu3SKCM3xm_@5tn8^Uo3R3d<wvQ`o++t+7)UjI7`_Y>*sXlaGrrS3 zkU<7dD`~$s)V_S#mnw{9lKG(sEc65h-WgmQaA}NtMo!o%1!rlyNmT)MzzZvgbk0Oq zx$yi4QHyZ<>-UY%I#0D!y2E>1w7UF=C&SJ+2@ldl@VgzE9O_Qmmx&HwHXu6NVYj2h zOy249;5mOL;oT?#4e@-vt9Y3BX%{RW@+?)u^{(vk!!T9r0^9)!`lHulnL#u&J{9}( zJ6dWTrU^LO>JRgkeU-+31QGX5vV2HQ9X!zJIH76@<^Y$IQ5-MykFb!$qk?!$T7q8C z*JPgxCag2pvt>aRfsytF69rK`vrnm4f}Iku$q{8>lLH!MSrHYna84!g>YPaz>=04C zutZHP;ydtG74&MbTL()^V%b<)d`)cP)gcip`O>{{Bp#3a+7g)7NqGEAZv*2IfX2HG z7p7OQ!jzFyazF(=0rck#D*!B8ZM6b2V6mO>SmuR89u1Jx1w8<=<c{x$NtpRQYG@hl zkJM>i_WdB@TKm4Cg2HI3w_$n*u5nn8Z_c4^U9nddVUYPs_Ela~G8?F520Q{coUFm( zgaB-M1B(9~nK^+?4IG1@$y5~-)lHm`otL=svPu5|)Zr}<jL@;;Tl46qdO&<s4Jb@F z@IEaPY+DdVazH`^!^SbBY7GSNCWhcTgi@CJ2;hB?O~P|y9>7@Z4SoVLT#ETi9Uhy6 z7~<xZX(|e1VoGrY6Jvz~ixrb@;&vMr0F(U!QTx?;Wu4Fia$*Tf*yrq(4H30P!9=sz z=C{GYO5@6Syt%!(@ubn!tx(Je?(gnAY+Uarx{=Bmtvh!b@(}vboMuD!(m^B|P}j1- zld*iv-x(7RcDCBHV)%+~?7*gMjR0KIzVRi<u0u5zuGfeLpNtVyhu6Tv>&9ka?0vtv zyNRDP+Q*g8r_v{oprXzcuo#kV%7}W-zRZGNn#g8h#K&o-^1=)3(3gyzBPjN#4<KpU zbf2nAYxG}9in>sfrR1o)5694m29w%HI^bn!@D?mE^;kZy7^Iy+7nqb$?o3+e#0BP6 zBi=O~)yF0~a?Bbz^C8$$AK`SZ!W>gM0Ol?THBykU3jL=BFi~tSVRONz<NJBV_v2Iy zB3!$^|6;(SvBV0K%=DFf!Sow|+e<}mWA9M!B9ixTLT?p**0gek<)e`Q3PYkkhAFR( zJ60g0XwtRN3vm1fDwz(p3@dDw8l&de%NC={Rt@GlV-(gdqY8D}%~h|^AA-Z?3tq)k zXO^aszQp1!UhcM_ZnZf~y{*ZC*P1)<S`)Umt{!-Buxi;-<6j79$m4$qt&k|HgcBaz z|JU--__yM!<uck^n<6#eOnB7d{m?|$`*bS%k6x$+#Q6zMc-)#WUZIg86y_jzz8G=g aD{Q(Z5iYA!m#tc^<x<zG*)>Q7qkjWnOrw(k literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_uuid.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_uuid.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63c141a124d84e84d4f037b22652f8db374d9873 GIT binary patch literal 2296 zcmb7GOK&4Z5bo}ou_u0Hm+S)jgb_lJLBc^GaabY5J^-zRvJzp1G_usRr`z#3^YC`J z6WMYOu#xt}jT=E)#A*N1TsiR<I8ikoo3IHIj5RgY-PP6g)vJB4+iekevfsWJizXqz z<6!kPfcXqw^BoXLBuz<#UzXC0MT{cvq)z5WZpFK)mo=hB#d~Qp^CQ3F8|g;YidtDa zYE$whkxl8J5a}ylwN>k>7j-1vBjLs$a0=NCY3V<j*rdos3Vd_-+k0OmsRFjMXOnE2 zPE9>-JrGtr8jMwJLsnkhJsNzigcO5RJ<P4rLlLX;_Srq>mSa3|^>{U7M!+Z%QAr{u zY2+wZdE>@)z<o-eks+0ibWb`_6YSpr4|u0cHe~a}eM+MiVuCpz<~C%jn(L@8{7|xe z>dKDnp19HGGvboy5}@8JuiR53ahMc(PZ<NSA3uKhV7_ffDwyWUq0&aA=?wWNQxzmq z<u(~6N(b907=mA39n=cAS!&?ZX(D4*<H4^BuLG~S3dEA9WK1PpP|1F*q6l_4yLtoG zz>#h)GF5tqBAqH2dS*INy7W0u^2BnE5=N!Nr8q4&IFD0d4CgP%pD*s;=|47Lb6<>v z><z?`$Y=e#xrmEgijVp#KQ#SfqH+@hEheLx>3@|B`X;gJ{fUSV#J+;PX$lhZU}vC3 zlJjB!8V`jn^lWDZbw@(%VFiP4b~0rl@K&ss`T3c%zUfV7x(jG8qf5{?g!*)T>w-Y^ z&cN=PI{)|(60&S)Wv4n{`x*U<?|pd9+dvj{OrC?Ef2GH4!SoHwo;wRxjmUz5?=kD0 z-KcZcw2&?x>y|DeDxH00OBVxLx>dlP(uq@}x8Q)1B~l}XC3yv>wuZXM_&+Sgm>VAm zaXQqcEjoYaBBbXxLa3Yh(E!ovE3kbHb(KyP)Bsixs-)M+F|+hJfE_yk(^-&(vxZsv ztC*}IM%`2ls!(yns$T<5`gJ5#D!Td_@;8y(LUJ9+OL+atY_Jj~40bHSTD0>o(Oe0K zZh2*uO6#ft7q^Fn7W+xQ&%v|k;wA1XMPP(20v%c5{umf2A~GgFLu*(#V+vmgFi>{^ z{4f5oi>nKEz|4o1EucaC0P+xYZ~jv&sGmInWi<=pk%|ujTLh5#Q>_9!5;m9|qyc(A zK=%ZhupniE=_EKx>}ah4Tg3`YQ0LNeKd!8GjD!I(l?PC)MVtt$WTmIKRy4o)%|)s( z?Sk$3yJ3*zp!e)ybwLF0_14F1&%-c~1=v}Uys%5dtDP(N2DQ#>VE|L-tiKb4j&6g0 zOCRA+gdLTecMY@wyca&#y3nDgH$gzZf#gjj7_Mj&z=0H3TJy~8pUW2LY6&<~y#>O{ zZ1Dqci(Op%E8*}mwm)o(oR=-mvqDZ&<U5={nToVtX>u-$m~)LC_e?TlrzzW2lY|l& z6;fk9=^IF}Vd&c^;3T=#Xja*+J8G=b6tt}q9_r>2iesH?OhZ&`5Vp@;dd+2QtHJ1& z$0(!Kdf2V3C>wS*ft;@FioD4Ts--$O>a99$?_8(ttum^IxmR^OQ`sGT@Siu;?O9{l zL=XS(Hn=^E>goDQhuf#V(~ZU|*YIa$>4m=?wB)Kb=zp>d(x()}3}%W?I}Co%8ZLXA F^e_8Ac!~f3 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/date_of_acquisition.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/date_of_acquisition.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5a941955082bf932e1c7a12fc937243cf8da450 GIT binary patch literal 4289 zcmb7ITW=f372Yekq)6&!w~3RY+n`EKqoy3BXj-LB?buG^K$cp|LC}SO^>Sxut-Kd{ zW@%Xr^-#z_iWdF_aR3>8DEd&K5B)X!+Nb`7KJ`1Z<m%enLVGxS=FFKh=RW$l-EL}l zl0W`7SY6VzzthL;sbg>xulzj#)0iG>9{n1zp6H&gmpH>SfHPw=u{=xRtk_O!UQLbd zxSlwkqsFzkku<$#GUv@DEw80;^|+mMypFE@QezHlywF&KJA95edF!y|%>&zHbHL8= z`9srNVEUHUZT$oCXd7L<a9EJ@JW4pm^^Gq+{v?WN*xCYa6p!TeyLl(bgU$Xf5A&{B zT>eaE=>s0Hpda&lY0kwU2zhaNJxb(x^relx{y8l6So&2a^T&eAUyr!hzaKr1(vZZO zJ@#}Ue}@6rJe_G!l<t|_V#X`|D{Y`NlUXlXp3Q5#4i(z33|3?H7uKQfIlwh|6Ikb! z$r`Mwuyeq+fSUtli?tQ5%{#mSTnBXXY~h9F&GQB9vG_`7OKe%uEPka~nzsbiT`Cr# z3%)tH6+RtBGRmVY9p4}g$~;Jh?jRHH-VRS){(Q&<&}r`O1=7W=$T@SP)cyS7Z5)4@ zH1B5vKR9L-8q+h=uZ7pdD=z`$+M%|qGku~n<E24{hb-oXn8RGxD6BL{cws*a;t|KE zEl1eAaC|>Xqulq2Lh^V}lIumo_ro}l()a(Y{qs+^*S0^GT*&QUCt$sPuotBJ+qcpn z%u*J-zs=KUayuLHREB`raA#j`uSflDoSk1E2H}(7F~{0C1_gVv+805T`dJ?wp9Og) z_E-CSCwLZRVihM2FhgD>R}-GYf%2f5_AAT<n&}Pq#XQc62-Bp}l0Lq2=d2-mCl1_T zQJDLJ4@FTEJRga)(k^M1-rL0NBLHYse^Wa!a_vZ;7|eKWU~C+j%zUjMm=p8Jniv=v z6XVFvjoq3WYoN4VQaIVA9mb0*zq!7WTwh`C%BO29_t#do#>=-7ctIGfu4mG}l|JS% zmtDQILtW583P<K*NDfq3!~J|*I5Zw-DKDHj3xhZs^P(BZ3Tuw?uxk}&7)wE}QJ5?X z3L_s2Qcek$3EvoqEb(^{tC#U9TL7Bj=q<geH_etYe(SvcsuhUx<(b`l$)$vw`w=VZ zF=E_jeL*Zka!-0FR4aw{@WJ#WC{-!X*wrT{Gno0(IIt$#t}(GlZ8XNnRtl_bjQ`Md z&pcaq*YDnb==Npr0)IG1{mFyP`|eqZC03uK{NmHQ5AG7%h`B#^zdZQx9K}O~XAM?? z1Ho2gq?yUgqJ{uZg1m4BJP&usN>}_L64_8>A=KoT`k5tFTfB|c!X@xMfWm%C$qpH& z$__rA?qbssFIpv4g>jljN4IoG|F?!CdW3pC-RlpK$4eWjU;z{QC3`8SCtra6^<7v> zS-?Osm}UoWX=ZPgvwU*Au2CN3D%PEq)lp7^J#S#Lj7{UB*qo8Uwc6y(R9<`~r%PN< zIaC7}I<yk@Zy1oM6p1QMtz4g2xp8QScXM;sI<hAgT+L2DR`^<8AJE)7BG^$gwJ8<F zt)0Hji~~Dw95tCavA))r1>SRCYu|u}u1#$5S2$^FV!xpswO?xo^}I8wAL`70VqwNO zaMa2g(O_+T;s81m8?Z6u<0w9qpPS?7NQRQT0ZM>Kqx7*G4cvT(yJT~hMS}s-uA66> zn~cI8mo!Avl|vF4so%}|IkGCs$Bd+MbrhCTmG0GRz2TF%>yk=)Mf2Er8{=!Yvr)|4 zG|Sy#ARrLQaH8%gdDKQ%$6av9MyaY)L^jCcINKxHtDV$FYi_jA(X?^*A&4Gb5TcJD z3CFIec<cA>Z@E{;ZxCy7Li94PVCI9a%lNYh$3@8QyGbTU#vpa^x08*;@wp!zpX(78 zzTb7_kcSbrsw75X%R=JC&WNm3v*vc^3k&iFMHBTq1-~@pD$2#T$r0Zo@FqZEMrmHy zgE&LHw@LG)BG4zp!kHRW78Z?=4xsg6kne~#t!(F69>hqTR6}K927TFWhy~(&jerZ_ zIWQMRf8Z_9NCbP-3#feHwFpyvEi0=r{}i%A)1@}Zlf33EY$J9qM9~;TWTGEoU-=Gz zX4Q~MntI3Rm;^0kmP@u}bc_~8mi|utq7a_3nP$aMCr)_ix5_Pa${fwgkulK_aL6+V z1%3S9t>G|^VBZtjlDsO<j=fKyrz}lP9@90?7-YKbnbV0CZ0O;YRDv`MmF<UjaMn{T zTJJw3>1Aq^sDbkRqUrld#zrxXTfYBv6vWe+y6>|r^!?IPs23^bR1<}^WhY~BDU=KG zUEl>(KtU-?{D1&yMsx{~fa1phMGJ<@qp)17PEfR`O<Bm}7~53E9H(BSbyU*@B}Lj> zUIB1mwk6Zhm*xxuu!R?23oC}M=t7WG50&Vfc;&kQr@Lv6{u%wRf&Q2JY3iQq%!biw z#kbBWa+CVM@t5l7M2{<7WjpdQHyfPFEmg`=t>dhjDC=@gH;5`jP%x4QfB|Km^VM9D zQ)^PPI#ER7^HeEMR}ngM<(6ezGSQK#jc-iU5@T0GJu%Bx1Wn4cEy<}tsoIjiRJoYC zlW9wm{r8qcwIgSxlx}vM+lk+2oA)-{(`s=u>23nad#CW|z0j;+<A|M-sBC6Ht>(wg z<7NhKL#Cd_41UyA!4%&oHBrcjU(oclL%B%^r9oOGzC)n$z|!@|mmlLTyOBl<jil;E z+>3prM|M~3&_>r09}vTz5cny9H3A<JI1?+!d#aK0d6JWSSvmmlc{n>fTuHwu-XkW| z+o)XO*~5KwA}Zv(-t11&J9j7P&3ub`%RqG@QbnhC<9}W>y~qgiGVk91yA1a%$$Jzu z6au)XO>fas)aWqup94YX^)6SO6-^q%y<ixX>4ma^Qp5>cReCF&pOvZXBTCQe7K!Gc RE&#~!E&Y<&GCR7n^)CVchc5sC literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/equipment.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/equipment.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2720cd9bfd78db7137db45eac12d8e7191223dd GIT binary patch literal 3002 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/foraging_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/foraging_id.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c918717dde3b482237f13ea198c440ef20d5ec0 GIT binary patch literal 1616 zcmb7EOK;mo5Z>jI6h%pH>IYKv<f{&)1LW2h+B#07!f{$BMgc;=V#QrqRQOPKDJK%- zLtz6s`4_}RTlCbw#A{Fe3q5s)dQ_@&=>j{PotYiZd^5A(v|2uamHz&dcwiIqCmxo| z1?DT*<_Qo<Buz+&Un`-h6<QQ|max<g?bHdK>TD-&S_^BGd`qMw-D@IUWhqD5S5D|j z`kb_De}Ol0(x#>VNEG5(Z>XZ8ZIyf9nLImHLW*9ZI$5D~Uqq_hJC0LxM+~>Ozt2r^ zu9f*=tn}n*{3gyK^t@cof-$GSC=yahLQB$+DSPNh>z2MHeJYu>ubZK(YRZFboLft} zvUY7>(Xb9OUo}AL-7;C1ekE<bB{m6LkVm8RALm+}$Ju#DP8&;pKb8<&qrXt`SVq<& z68r+jguynuKnik2hE&oSmDWv#C-`M2x&}Hx#Lh&jO6Ni(V+BXYj7LhB9_Miu7o4Mo zQAvMpPRlyyQ6h}t{15W?FNdFY&y3QhD+WRaJ@Hy(lkV4<i1JK|hh3Fjm~K8&nTder zqrt><kK<m~#D)4~B%+t%T*2KW0So!^pr=Kg@w^8fFGP{+$w5yI#6_Iz0|`Y04OY<{ zq^f`d7GkC5E6Exn!DylzkYf{psL-L)oh5)B8LVYkmvK~Ztwy?ZwJOFs+klgThePy& zxJm->(G$G|Jb=TZ#OQm#SAseD0FGt7uk(}-q22H}55Su4t_83%XtQ!>nJG8Qm^ja% zq-8CEuH>?(KLigE78Dn@90pQF6aa&zeFp>cGrMFnYe;4c8}7!sv<v#HHM4)Cm-dXz zZ0X$KXt*cSTYrCTJwG}=I()GqLhTxq8@k7*&z^1w(D=XMn+=N}pB$YYZAjjGCy3?# z7yDEHvz6%!=yKN-8p_kA^A=>G*H=X}$TL;i<1xTwpPh9cwH>_;SZM5cy$7UpUg5}A zm)>6+M0W=)jR%DIO}a&WdbdJo*51O2z)9h}^f^y+IZlvoa{g*8l7*(mxy&QZ^?h)t zKSF{XST?GWfhHZ~5H2>G#vhj~&I*n7)F0!qwV16)B?&me4yy>H-a;N5N#lEouc<+` zM{T;xEV>QbqLr>)ul^oBSdLY2XRLx{wSx7r(l{ew=l@=VsW&RnizgLcjm4X4G&Zcp rP7U`~PAhdLl0b~&dFGhUzp2i-YJj}Y=O}-P<5$(lvzqiCYqEa;1E-~) literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/session_type.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/session_type.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c2008438f26cfb70574ab068ec5493e9795f10a GIT binary patch literal 1837 zcmb7F&u<$=6rP#gwKt9(N)##*erS6k7zqc7TZK?*ps1oUQd3mAbu}9AjO&eOcg@T= zk)!kgiBvBA3n&tT6aUg)Iq@%W;=Q#uahnUQwc|H$-ps!5d*965?sQrNp6rhw#qR+j ze_^M78erUl*WQCh5=k}5XiO>EOtZ|3y~_5qp9OJH*}iUM&A6F`aY)J6L<X{PPGmy` zDpbw0AYPNr1JVuuh80Pdmd*ad+jml}z-%A5G@I#}UG`gF3MalD9;(E3S-I6e9^O|% zilJ6_bEnKmB&vLGb<UOH1V2(g{?f30FcgWYBr%gT_LMK#OZuFQsPv?N-i`y+P)&ds zykxQ=o9F%+jYIIQfiDE#nrv0R)^p;Mcpc!Zm+J@0+O)_Y%%|$)EjLz?U80Gsa?#8x zi4g4~iaQ8P*fJyh$Lu_K?G`kSoRLE+=_!@$1w&fl8(!apFa}ikxyV!*90@&B&<*Tt zs!SPjp603J93!mKqeVC^*EmnKu$J>b$v?mC-yD2rm9Yac7P2=K$0DB(zQ{#V<WhV( zQ2CJ^6jPPk1lnRcp4-8_bU3i7Qy))7G7(P|%+(qq<YaGXM4Izr2rC{5SD5+UP>sb= zT9`cv)q@c%pWVxpgVH&1G0ZPKtCaMnbJGTp9b}@Shn{S$Fxy+f*r^HTBhXLTFv`tL zenBddiG1zjQmEhg&M7?v4R3>X;q~D4x5+d1kmMiu#L-F1+@b`3j>!OGy<b4Lzj|l% zC;Euw?0a%bPMK`Jps3$|82}@hjl&vnyq0J_6-IzFunu@SxwBu)w2bn?Ma9qoQx~G( zSi-$3DoXQFVKU)BJ<-S%S%m8Os5hPH2$4k}p8VX6Af)owUjtQDdW&2US#hKyVI$Z| zH=+kHc~od!9H;qHh%%|NQ89{gWu21IM9pm^(?wFpg_+!p9`9C2cAq@ntyf3;0u6Sm zOn0Aj=|WU~>0>p^@EbM%%9z5G?fbJF1g{po5EGvYH|~0+muPF=gaX8u6+`sq4e%|R zYhaa|h@HPuRP<Za1MwN#p&OLZ>y4B5R|Ro(63D-q9}h7Dvk6mQQ3R@@Qp9yIYCSw- zSXtO`tg5ZoFT+}$HDDHZv=~;R<%oPigJ<4`Wy}sX?_l#9q_D~klDPqcwmN`V>orB! zA>B6aU?hg~vc-8;$eBjF&G`>Ap_d~~&SjB++q2G8d!<~jb~j`^E~G(#W*ZyaKIUC$ z%FgltNR-x`UnU9QHZTZjHce>oCaCxhnNK%8=51~;T8;F(tvHy@0ZO%Q+^bK3-jx%e zSBt1uod8$|Tcs6$@}DOyj}3#A#drVjG&t3)>Y3$b0jJ{fwy*{+IAZWtt3X{cu_D9p Vvjy{?QzQc!X|pzM(`&&7{TGLJ25|rY literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/stimulus_frame_rate.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/stimulus_frame_rate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e06669c56ac7c7bffe9d2aee076bfdfa14f25f0d GIT binary patch literal 1849 zcmbtVPmA0(6qjUs?D2Xw$!z*3g_clqnM1vW-byKHQc?nC3Q0>r3<%lMbiI-7spQ#Z zmf1tQ3pwpK$gPLcujFe_{R%zxNn_7!*w8=Jpf^uX($jmt_j{U0qfw0DD}VWk{~RFn zyPfpk0F;L?i~u2!zzUU^Vr+GyNa<0}>7Me-fCf(Y)u0S%SVlB*^FR&Dn8r>YsJ$|w z2}WNb5sK&%iAV-AlHo-_M`HLKP2xY`CN#lqIQ{<7lR`;QljluQF4fX>^Y}~N@NcqX znKu*C-kqLi&m<Q-Q}SumNImDdY~R0r=EgEO9rqi)ElOz`UM>t+Z{=L&Y_54JndXhm zZ8ZJocZ!*UA`!&`Q6ez)q%X)T{1VNv@PvPv&_E7k2p9#gh!}|Q(!ano0^1O55!i+z zcDDE>@)6yGy!YBWeLzp_?a$!yvxDAr-$iuaMg&0~m=2HYfs!sb`)dRBV3@lg8gzk< zvA}CA$Q7|=fa|=ewp9oC{0eSsgA=Zn5~hJ!E~IWF#)_(F7_&Q!RP)Vt+zuJb6*q>l z-_W1GKK^v}osrti_z@Rr#!q>*ntf66ysiZQWG1T<GpiS}GC9b4akMhCuZwJEibj64 z;Q0&wgM_n6!4C1_Fw?xKSe=2#6W-K%b(qN`ep1x>P(a0D#g^P0ma>6zH+;Lyww5;_ zlP*?zA95XAKpaZ=?7be?E!OF^ghx9sK)`mOWwX>(-Xq+j``9}C5JUs`0=oDLpOc2H z$*~7W<8yC~)}HXLFyQS^Cs-fA-U+5LRBy|;4X(ZpVXYm{bzQR8Zr2ek=)|7%TQ66} zd7(QB?3~ef$6I~J9&^Ixt=|G+hq3OE@8bw3`0T+=7;Z)Y3<#^!Yz|Op%cm_4mSJ`{ z9Nq?HjgR4pxQEUOWKMu{fP&*%8}$VO6gIr0BgHdUH)cz@v3lCN(eGICt`)Cm(MB#h z2<8J=G_D;<{Kjhb8z+gSvZXj<ZOm9%i>0!9!q|^XuDX?wF;VAW4(6)njpIwZ=ZFrG zAJszJL>-FS(m>w>(T=)a$fZ(@?Sh3QZ`(}{`5|bxU>IA&i1>Ky5pO&oSlgB9WS<6$ z6{O_+(zI`e^hPtJeKVx48Eid_3yXgIuMc${q%Cyx>3=;24Q^zrySEk|i0-j98vZws zwtp5B-p@@p|6>AOEa{HG>6ZC_Z*$E;AO4@4mQA5Ht!1mQE8VVT+UT<lSw6?G!`K%j PAqjNNZ7=Z>e;@w^PDu=! literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py new file mode 100644 index 0000000000..d7a77c9234 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py @@ -0,0 +1,320 @@ +import uuid +from typing import Dict, Optional +import re +import numpy as np +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + BehaviorSessionId +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, NwbReadableInterface, \ + LimsReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + JsonWritableInterface, NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.behavior_session_uuid import \ + BehaviorSessionUUID +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.equipment import \ + Equipment +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.foraging_id import \ + ForagingId +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.session_type import \ + SessionType +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.stimulus_frame_rate import \ + StimulusFrameRate +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.subject_metadata import \ + SubjectMetadata +from allensdk.brain_observatory.behavior.schemas import BehaviorMetadataSchema +from allensdk.brain_observatory.nwb import load_pynwb_extension +from allensdk.internal.api import PostgresQueryMixin + +description_dict = { + # key is a regex and value is returned on match + r"\AOPHYS_0_images": "A behavior training session performed on the 2-photon calcium imaging setup but without recording neural activity, with the goal of habituating the mouse to the experimental setup before commencing imaging of neural activity. Habituation sessions are change detection with the same image set on which the mouse was trained. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 + r"\AOPHYS_[1|3]_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse performs a visual change detection task with a set of natural images upon which it has been previously trained. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 + r"\AOPHYS_2_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse is passively shown changes in natural scene images upon which it was previously trained as the change detection task is played in open loop mode, with the lick-response sensory withdrawn and the mouse is unable to respond to changes or receive reward feedback. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 + r"\AOPHYS_[4|6]_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse performs a visual change detection task with natural scene images that are unique from those on which the mouse was trained prior to the imaging phase of the experiment. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 + r"\AOPHYS_5_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse is passively shown changes in natural scene images that are unique from those on which the mouse was trained prior to the imaging phase of the experiment. In this session, the change detection task is played in open loop mode, with the lick-response sensory withdrawn and the mouse is unable to respond to changes or receive reward feedback. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 + r"\ATRAINING_0_gratings": "An associative training session where a mouse is automatically rewarded when a grating stimulus changes orientation. Grating stimuli are full-field, square-wave static gratings with a spatial frequency of 0.04 cycles per degree, with orientation changes between 0 and 90 degrees, at two spatial phases. Delivered rewards are 5ul in volume, and the session lasts for 15 minutes.", # noqa: E501 + r"\ATRAINING_1_gratings": "An operant behavior training session where a mouse must lick following a change in stimulus identity to earn rewards. Stimuli consist of full-field, square-wave static gratings with a spatial frequency of 0.04 cycles per degree. Orientation changes between 0 and 90 degrees occur with no intervening gray period. Delivered rewards are 10ul in volume, and the session lasts 60 minutes", # noqa: E501 + r"\ATRAINING_2_gratings": "An operant behavior training session where a mouse must lick following a change in stimulus identity to earn rewards. Stimuli consist of full-field, square-wave static gratings with a spatial frequency of 0.04 cycles per degree. Gratings of 0 or 90 degrees are presented for 250 ms with a 500 ms intervening gray period. Delivered rewards are 10ul in volume, and the session lasts 60 minutes.", # noqa: E501 + r"\ATRAINING_3_images": "An operant behavior training session where a mouse must lick following a change in stimulus identity to earn rewards. Stimuli consist of 8 natural scene images, for a total of 64 possible pairwise transitions. Images are shown for 250 ms with a 500 ms intervening gray period. Delivered rewards are 10ul in volume, and the session lasts for 60 minutes", # noqa: E501 + r"\ATRAINING_4_images": "An operant behavior training session where a mouse must lick a spout following a change in stimulus identity to earn rewards. Stimuli consist of 8 natural scene images, for a total of 64 possible pairwise transitions. Images are shown for 250 ms with a 500 ms intervening gray period. Delivered rewards are 7ul in volume, and the session lasts for 60 minutes", # noqa: E501 + r"\ATRAINING_5_images": "An operant behavior training session where a mouse must lick a spout following a change in stimulus identity to earn rewards. Stimuli consist of 8 natural scene images, for a total of 64 possible pairwise transitions. Images are shown for 250 ms with a 500 ms intervening gray period. Delivered rewards are 7ul in volume. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session." # noqa: E501 + } + + +def get_expt_description(session_type: str) -> str: + """Determine a behavior ophys session's experiment description based on + session type. Matches the regex patterns defined as the keys in + description_dict + + Parameters + ---------- + session_type : str + A session description string (e.g. OPHYS_1_images_B ) + + Returns + ------- + str + A description of the experiment based on the session_type. + + Raises + ------ + RuntimeError + Behavior ophys sessions should only have 6 different session types. + Unknown session types (or malformed session_type strings) will raise + an error. + """ + match = dict() + for k, v in description_dict.items(): + if re.match(k, session_type) is not None: + match.update({k: v}) + + if len(match) != 1: + emsg = (f"session type should match one and only one possible pattern " + f"template. '{session_type}' matched {len(match)} pattern " + "templates.") + if len(match) > 1: + emsg += f"{list(match.keys())}" + emsg += f"the regex pattern templates are {list(description_dict)}" + raise RuntimeError(emsg) + + return match.popitem()[1] + + +def get_task_parameters(data: Dict) -> Dict: + """ + Read task_parameters metadata from the behavior stimulus pickle file. + + Parameters + ---------- + data: dict + The nested dict read in from the behavior stimulus pickle file. + All of the data expected by this method lives under + data['items']['behavior'] + + Returns + ------- + dict + A dict containing the task_parameters associated with this session. + """ + behavior = data["items"]["behavior"] + stimuli = behavior['stimuli'] + config = behavior["config"] + doc = config["DoC"] + + task_parameters = {} + + task_parameters['blank_duration_sec'] = \ + [float(x) for x in doc['blank_duration_range']] + + if 'images' in stimuli: + stim_key = 'images' + elif 'grating' in stimuli: + stim_key = 'grating' + else: + msg = "Cannot get stimulus_duration_sec\n" + msg += "'images' and/or 'grating' not a valid " + msg += "key in pickle file under " + msg += "['items']['behavior']['stimuli']\n" + msg += f"keys: {list(stimuli.keys())}" + raise RuntimeError(msg) + + stim_duration = stimuli[stim_key]['flash_interval_sec'] + + # from discussion in + # https://github.com/AllenInstitute/AllenSDK/issues/1572 + # + # 'flash_interval' contains (stimulus_duration, gray_screen_duration) + # (as @matchings said above). That second value is redundant with + # 'blank_duration_range'. I'm not sure what would happen if they were + # set to be conflicting values in the params. But it looks like + # they're always consistent. It should always be (0.25, 0.5), + # except for TRAINING_0 and TRAINING_1, which have statically + # displayed stimuli (no flashes). + + if stim_duration is None: + stim_duration = np.NaN + else: + stim_duration = stim_duration[0] + + task_parameters['stimulus_duration_sec'] = stim_duration + + task_parameters['omitted_flash_fraction'] = \ + behavior['params'].get('flash_omit_probability', float('nan')) + task_parameters['response_window_sec'] = \ + [float(x) for x in doc["response_window"]] + task_parameters['reward_volume'] = config["reward"]["reward_volume"] + task_parameters['auto_reward_volume'] = doc['auto_reward_volume'] + task_parameters['session_type'] = behavior["params"]["stage"] + task_parameters['stimulus'] = next(iter(behavior["stimuli"])) + task_parameters['stimulus_distribution'] = doc["change_time_dist"] + + task_id = config['behavior']['task_id'] + if 'DoC' in task_id: + task_parameters['task'] = 'change detection' + else: + msg = "metadata.get_task_parameters does not " + msg += f"know how to parse 'task_id' = {task_id}" + raise RuntimeError(msg) + + n_stimulus_frames = 0 + for stim_type, stim_table in behavior["stimuli"].items(): + n_stimulus_frames += sum(stim_table.get("draw_log", [])) + task_parameters['n_stimulus_frames'] = n_stimulus_frames + + return task_parameters + + +class BehaviorMetadata(DataObject, LimsReadableInterface, + JsonReadableInterface, + NwbReadableInterface, + JsonWritableInterface, + NwbWritableInterface): + """Container class for behavior metadata""" + def __init__(self, + subject_metadata: SubjectMetadata, + behavior_session_id: BehaviorSessionId, + equipment: Equipment, + stimulus_frame_rate: StimulusFrameRate, + session_type: SessionType, + behavior_session_uuid: BehaviorSessionUUID): + super().__init__(name='behavior_metadata', value=self) + self._subject_metadata = subject_metadata + self._behavior_session_id = behavior_session_id + self._equipment = equipment + self._stimulus_frame_rate = stimulus_frame_rate + self._session_type = session_type + self._behavior_session_uuid = behavior_session_uuid + + self._exclude_from_equals = set() + + @classmethod + def from_lims( + cls, + behavior_session_id: BehaviorSessionId, + lims_db: PostgresQueryMixin + ) -> "BehaviorMetadata": + subject_metadata = SubjectMetadata.from_lims( + behavior_session_id=behavior_session_id, lims_db=lims_db) + equipment = Equipment.from_lims( + behavior_session_id=behavior_session_id.value, lims_db=lims_db) + + stimulus_file = StimulusFile.from_lims( + db=lims_db, behavior_session_id=behavior_session_id.value) + stimulus_frame_rate = StimulusFrameRate.from_stimulus_file( + stimulus_file=stimulus_file) + session_type = SessionType.from_stimulus_file( + stimulus_file=stimulus_file) + + foraging_id = ForagingId.from_lims( + behavior_session_id=behavior_session_id.value, lims_db=lims_db) + behavior_session_uuid = BehaviorSessionUUID.from_stimulus_file( + stimulus_file=stimulus_file)\ + .validate(behavior_session_id=behavior_session_id.value, + foraging_id=foraging_id.value, + stimulus_file=stimulus_file) + + return cls( + subject_metadata=subject_metadata, + behavior_session_id=behavior_session_id, + equipment=equipment, + stimulus_frame_rate=stimulus_frame_rate, + session_type=session_type, + behavior_session_uuid=behavior_session_uuid, + ) + + @classmethod + def from_json(cls, dict_repr: dict) -> "BehaviorMetadata": + subject_metadata = SubjectMetadata.from_json(dict_repr=dict_repr) + behavior_session_id = BehaviorSessionId.from_json(dict_repr=dict_repr) + equipment = Equipment.from_json(dict_repr=dict_repr) + + stimulus_file = StimulusFile.from_json(dict_repr=dict_repr) + stimulus_frame_rate = StimulusFrameRate.from_stimulus_file( + stimulus_file=stimulus_file) + session_type = SessionType.from_stimulus_file( + stimulus_file=stimulus_file) + session_uuid = BehaviorSessionUUID.from_stimulus_file( + stimulus_file=stimulus_file) + + return cls( + subject_metadata=subject_metadata, + behavior_session_id=behavior_session_id, + equipment=equipment, + stimulus_frame_rate=stimulus_frame_rate, + session_type=session_type, + behavior_session_uuid=session_uuid, + ) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "BehaviorMetadata": + subject_metadata = SubjectMetadata.from_nwb(nwbfile=nwbfile) + + behavior_session_id = BehaviorSessionId.from_nwb(nwbfile=nwbfile) + equipment = Equipment.from_nwb(nwbfile=nwbfile) + stimulus_frame_rate = StimulusFrameRate.from_nwb(nwbfile=nwbfile) + session_type = SessionType.from_nwb(nwbfile=nwbfile) + session_uuid = BehaviorSessionUUID.from_nwb(nwbfile=nwbfile) + + return cls( + subject_metadata=subject_metadata, + behavior_session_id=behavior_session_id, + equipment=equipment, + stimulus_frame_rate=stimulus_frame_rate, + session_type=session_type, + behavior_session_uuid=session_uuid + ) + + @property + def equipment(self) -> Equipment: + return self._equipment + + @property + def stimulus_frame_rate(self) -> float: + return self._stimulus_frame_rate.value + + @property + def session_type(self) -> str: + return self._session_type.value + + @property + def behavior_session_uuid(self) -> Optional[uuid.UUID]: + return self._behavior_session_uuid.value + + @property + def behavior_session_id(self) -> int: + return self._behavior_session_id.value + + @property + def subject_metadata(self): + return self._subject_metadata + + def to_json(self) -> dict: + pass + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + self._subject_metadata.to_nwb(nwbfile=nwbfile) + self._equipment.to_nwb(nwbfile=nwbfile) + extension = load_pynwb_extension(BehaviorMetadataSchema, + 'ndx-aibs-behavior-ophys') + nwb_metadata = extension( + name='metadata', + behavior_session_id=self.behavior_session_id, + behavior_session_uuid=str(self.behavior_session_uuid), + stimulus_frame_rate=self.stimulus_frame_rate, + session_type=self.session_type, + equipment_name=self.equipment.value + ) + nwbfile.add_lab_meta_data(nwb_metadata) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py new file mode 100644 index 0000000000..058462494a --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py @@ -0,0 +1,54 @@ +from pynwb import NWBFile + +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + JsonWritableInterface +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_objects import DataObject + + +def from_lims_cache_key(cls, db, ophys_experiment_id: int): + return hashkey(ophys_experiment_id) + + +class BehaviorSessionId(DataObject, LimsReadableInterface, + JsonReadableInterface, + NwbReadableInterface, + JsonWritableInterface): + def __init__(self, behavior_session_id: int): + super().__init__(name="behavior_session_id", value=behavior_session_id) + + @classmethod + def from_json(cls, dict_repr: dict) -> "BehaviorSessionId": + return cls(behavior_session_id=dict_repr["behavior_session_id"]) + + def to_json(self) -> dict: + return {"behavior_session_id": self.value} + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: int + ) -> "BehaviorSessionId": + query = f""" + SELECT bs.id + FROM ophys_experiments oe + -- every ophys_experiment should have an ophys_session + JOIN ophys_sessions os ON oe.ophys_session_id = os.id + JOIN behavior_sessions bs ON os.id = bs.ophys_session_id + WHERE oe.id = {ophys_experiment_id}; + """ + behavior_session_id = db.fetchone(query, strict=True) + return cls(behavior_session_id=behavior_session_id) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "BehaviorSessionId": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(behavior_session_id=metadata.behavior_session_id) diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py new file mode 100644 index 0000000000..0129e8d104 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py @@ -0,0 +1,49 @@ +import uuid +from typing import Optional + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + NwbReadableInterface, StimulusFileReadableInterface + + +class BehaviorSessionUUID(DataObject, StimulusFileReadableInterface, + NwbReadableInterface): + """the universally unique identifier (UUID)""" + def __init__(self, behavior_session_uuid: Optional[uuid.UUID]): + super().__init__(name="behavior_session_uuid", + value=behavior_session_uuid) + + @classmethod + def from_stimulus_file( + cls, stimulus_file: StimulusFile) -> "BehaviorSessionUUID": + id = stimulus_file.data.get('session_uuid') + if id: + id = uuid.UUID(id) + return cls(behavior_session_uuid=id) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "BehaviorSessionUUID": + metadata = nwbfile.lab_meta_data['metadata'] + id = uuid.UUID(metadata.behavior_session_uuid) + return cls(behavior_session_uuid=id) + + def validate(self, behavior_session_id: int, + foraging_id: int, + stimulus_file: StimulusFile) -> "BehaviorSessionUUID": + """ + Sanity check to ensure that pkl file data matches up with + the behavior session that the pkl file has been associated with. + """ + assert_err_msg = ( + f"The behavior session UUID ({self.value}) in the " + f"behavior stimulus *.pkl file " + f"({stimulus_file.filepath}) does " + f"does not match the foraging UUID ({foraging_id}) for " + f"behavior session: {behavior_session_id}") + assert self.value == foraging_id, assert_err_msg + + return self diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py new file mode 100644 index 0000000000..7f2789c9a0 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py @@ -0,0 +1,116 @@ +import warnings +from datetime import datetime + +import pytz +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class DateOfAcquisition(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface): + """timestamp for when experiment was started in UTC""" + def __init__(self, date_of_acquisition: datetime): + super().__init__(name="date_of_acquisition", value=date_of_acquisition) + + @classmethod + def from_json(cls, dict_repr: dict) -> "DateOfAcquisition": + doa = dict_repr['date_of_acquisition'] + doa = datetime.strptime(doa, "%Y-%m-%d %H:%M:%S") + tz = pytz.timezone("America/Los_Angeles") + doa = tz.localize(doa) + + # NOTE: LIMS writes to JSON in local time. Needs to be converted to UTC + doa = doa.astimezone(pytz.utc) + + return cls(date_of_acquisition=doa) + + @classmethod + def from_lims( + cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "DateOfAcquisition": + query = """ + SELECT bs.date_of_acquisition + FROM behavior_sessions bs + WHERE bs.id = {}; + """.format(behavior_session_id) + + experiment_date = lims_db.fetchone(query, strict=True) + experiment_date = cls._postprocess_lims_datetime( + datetime=experiment_date) + return cls(date_of_acquisition=experiment_date) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "DateOfAcquisition": + return cls(date_of_acquisition=nwbfile.session_start_time) + + def validate(self, stimulus_file: StimulusFile, + behavior_session_id: int) -> "DateOfAcquisition": + """raise a warning if the date differs too much from the + datetime obtained from the behavior stimulus (*.pkl) file.""" + pkl_data = stimulus_file.data + pkl_raw_acq_date = pkl_data["start_time"] + if isinstance(pkl_raw_acq_date, datetime): + pkl_acq_date = pytz.utc.localize(pkl_raw_acq_date) + + elif isinstance(pkl_raw_acq_date, (int, float)): + # We are dealing with an older pkl file where the acq time is + # stored as a Unix style timestamp string + parsed_pkl_acq_date = datetime.fromtimestamp(pkl_raw_acq_date) + pkl_acq_date = pytz.utc.localize(parsed_pkl_acq_date) + else: + pkl_acq_date = None + warnings.warn( + "Could not parse the acquisition datetime " + f"({pkl_raw_acq_date}) found in the following stimulus *.pkl: " + f"{stimulus_file.filepath}" + ) + + if pkl_acq_date: + acq_start_diff = ( + self.value - pkl_acq_date).total_seconds() + # If acquisition dates differ by more than an hour + if abs(acq_start_diff) > 3600: + session_id = behavior_session_id + warnings.warn( + "The `date_of_acquisition` field in LIMS " + f"({self.value}) for behavior session " + f"({session_id}) deviates by more " + f"than an hour from the `start_time` ({pkl_acq_date}) " + "specified in the associated stimulus *.pkl file: " + f"{stimulus_file.filepath}" + ) + return self + + @staticmethod + def _postprocess_lims_datetime(datetime: datetime): + """Applies postprocessing to datetime read from LIMS""" + # add utc tz + datetime = pytz.utc.localize(datetime) + + return datetime + + +class DateOfAcquisitionOphys(DateOfAcquisition): + """Ophys experiments read date of acquisition from the ophys_sessions + table in LIMS instead of the behavior_sessions table""" + + @classmethod + def from_lims( + cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "DateOfAcquisitionOphys": + query = f""" + SELECT os.date_of_acquisition + FROM ophys_experiments oe + JOIN ophys_sessions os ON oe.ophys_session_id = os.id + WHERE oe.id = {ophys_experiment_id}; + """ + doa = lims_db.fetchone(query=query) + doa = cls._postprocess_lims_datetime( + datetime=doa) + return DateOfAcquisitionOphys(date_of_acquisition=doa) diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py new file mode 100644 index 0000000000..4b8020fc6b --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py @@ -0,0 +1,73 @@ +from enum import Enum + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + JsonWritableInterface, NwbWritableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class EquipmentType(Enum): + MESOSCOPE = 'MESOSCOPE' + OTHER = 'OTHER' + + +class Equipment(DataObject, JsonReadableInterface, LimsReadableInterface, + NwbReadableInterface, JsonWritableInterface, + NwbWritableInterface): + """the name of the experimental rig.""" + def __init__(self, equipment_name: str): + super().__init__(name="equipment_name", value=equipment_name) + + @classmethod + def from_json(cls, dict_repr: dict) -> "Equipment": + return cls(equipment_name=dict_repr["rig_name"]) + + def to_json(self) -> dict: + return {"eqipment_name": self.value} + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "Equipment": + query = f""" + SELECT e.name AS device_name + FROM behavior_sessions bs + JOIN equipment e ON e.id = bs.equipment_id + WHERE bs.id = {behavior_session_id}; + """ + equipment_name = lims_db.fetchone(query, strict=True) + return cls(equipment_name=equipment_name) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "Equipment": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(equipment_name=metadata.equipment_name) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + if self.type == EquipmentType.MESOSCOPE: + device_config = { + "name": self.value, + "description": "Allen Brain Observatory - Mesoscope 2P Rig" + } + else: + device_config = { + "name": self.value, + "description": "Allen Brain Observatory - Scientifica 2P " + "Rig", + "manufacturer": "Scientifica" + } + nwbfile.create_device(**device_config) + return nwbfile + + @property + def type(self): + if self.value.startswith('MESO'): + et = EquipmentType.MESOSCOPE + else: + et = EquipmentType.OTHER + return et diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py new file mode 100644 index 0000000000..3b2bae4200 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py @@ -0,0 +1,32 @@ +import uuid + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class ForagingId(DataObject, LimsReadableInterface, JsonReadableInterface): + """Foraging id""" + def __init__(self, foraging_id: uuid.UUID): + super().__init__(name="foraging_id", value=foraging_id) + + @classmethod + def from_json(cls, dict_repr: dict) -> "ForagingId": + pass + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "ForagingId": + query = f""" + SELECT + foraging_id + FROM + behavior_sessions + WHERE + behavior_sessions.id = {behavior_session_id}; + """ + foraging_id = lims_db.fetchone(query, strict=True) + foraging_id = uuid.UUID(foraging_id) + return cls(foraging_id=foraging_id) diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py new file mode 100644 index 0000000000..67c43d2308 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py @@ -0,0 +1,36 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + NwbReadableInterface, StimulusFileReadableInterface + + +class SessionType(DataObject, StimulusFileReadableInterface, + NwbReadableInterface): + """the stimulus set used""" + def __init__(self, session_type: str): + super().__init__(name="session_type", value=session_type) + + @classmethod + def from_stimulus_file( + cls, + stimulus_file: StimulusFile) -> "SessionType": + try: + stimulus_name = \ + stimulus_file.data["items"]["behavior"]["cl_params"]["stage"] + except KeyError: + raise RuntimeError( + f"Could not obtain stimulus_name/stage information from " + f"the *.pkl file ({stimulus_file.filepath}) " + f"for the behavior session to save as NWB! The " + f"following series of nested keys did not work: " + f"['items']['behavior']['cl_params']['stage']" + ) + return cls(session_type=stimulus_name) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "SessionType": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(session_type=metadata.session_type) diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py new file mode 100644 index 0000000000..a9e75b5145 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py @@ -0,0 +1,33 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + NwbReadableInterface, StimulusFileReadableInterface +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .stimulus_timestamps.stimulus_timestamps import \ + StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.timestamps.util import \ + calc_frame_rate + + +class StimulusFrameRate(DataObject, StimulusFileReadableInterface, + NwbReadableInterface): + """Stimulus frame rate""" + def __init__(self, stimulus_frame_rate: float): + super().__init__(name="stimulus_frame_rate", value=stimulus_frame_rate) + + @classmethod + def from_stimulus_file( + cls, + stimulus_file: StimulusFile) -> "StimulusFrameRate": + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file) + frame_rate = calc_frame_rate(timestamps=stimulus_timestamps.value) + return cls(stimulus_frame_rate=frame_rate) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "StimulusFrameRate": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(stimulus_frame_rate=metadata.stimulus_frame_rate) diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py b/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py new file mode 100644 index 0000000000..1a28168e06 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py @@ -0,0 +1,167 @@ +from typing import Union + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + BehaviorSessionId +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, NwbReadableInterface, \ + LimsReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.behavior_metadata import \ + BehaviorMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata\ + .multi_plane_metadata import \ + MultiplaneMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.ophys_experiment_metadata import \ + OphysExperimentMetadata +from allensdk.brain_observatory.behavior.schemas import \ + OphysBehaviorMetadataSchema +from allensdk.brain_observatory.nwb import load_pynwb_extension +from allensdk.internal.api import PostgresQueryMixin + + +class BehaviorOphysMetadata(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface, + NwbWritableInterface): + def __init__(self, behavior_metadata: BehaviorMetadata, + ophys_metadata: Union[OphysExperimentMetadata, + MultiplaneMetadata]): + super().__init__(name='behavior_ophys_metadata', value=self) + + self._behavior_metadata = behavior_metadata + self._ophys_metadata = ophys_metadata + + @property + def behavior_metadata(self) -> BehaviorMetadata: + return self._behavior_metadata + + @property + def ophys_metadata(self) -> Union["OphysExperimentMetadata", + "MultiplaneMetadata"]: + return self._ophys_metadata + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin, + is_multiplane=False) -> "BehaviorOphysMetadata": + """ + + Parameters + ---------- + ophys_experiment_id + lims_db + is_multiplane + Whether to fetch metadata for an experiment that is part of a + container containing multiple imaging planes + """ + behavior_session_id = BehaviorSessionId.from_lims( + ophys_experiment_id=ophys_experiment_id, db=lims_db) + + behavior_metadata = BehaviorMetadata.from_lims( + behavior_session_id=behavior_session_id, lims_db=lims_db) + + if is_multiplane: + ophys_metadata = MultiplaneMetadata.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + else: + ophys_metadata = OphysExperimentMetadata.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + + return cls(behavior_metadata=behavior_metadata, + ophys_metadata=ophys_metadata) + + @classmethod + def from_json(cls, dict_repr: dict, + is_multiplane=False) -> "BehaviorOphysMetadata": + """ + + Parameters + ---------- + dict_repr + is_multiplane + Whether to fetch metadata for an experiment that is part of a + container containing multiple imaging planes + + Returns + ------- + + """ + behavior_metadata = BehaviorMetadata.from_json(dict_repr=dict_repr) + + if is_multiplane: + ophys_metadata = MultiplaneMetadata.from_json( + dict_repr=dict_repr) + else: + ophys_metadata = OphysExperimentMetadata.from_json( + dict_repr=dict_repr) + + return cls(behavior_metadata=behavior_metadata, + ophys_metadata=ophys_metadata) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile, + is_multiplane=False) -> "BehaviorOphysMetadata": + """ + + Parameters + ---------- + nwbfile + is_multiplane + Whether to fetch metadata for an experiment that is part of a + container containing multiple imaging planes + """ + behavior_metadata = BehaviorMetadata.from_nwb(nwbfile=nwbfile) + + if is_multiplane: + ophys_metadata = MultiplaneMetadata.from_nwb( + nwbfile=nwbfile) + else: + ophys_metadata = OphysExperimentMetadata.from_nwb( + nwbfile=nwbfile) + + return cls(behavior_metadata=behavior_metadata, + ophys_metadata=ophys_metadata) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + self._behavior_metadata.subject_metadata.to_nwb(nwbfile=nwbfile) + self._behavior_metadata.equipment.to_nwb(nwbfile=nwbfile) + + nwb_extension = load_pynwb_extension( + OphysBehaviorMetadataSchema, 'ndx-aibs-behavior-ophys') + + behavior_meta = self._behavior_metadata + ophys_meta = self._ophys_metadata + + if isinstance(ophys_meta, MultiplaneMetadata): + imaging_plane_group = ophys_meta.imaging_plane_group + imaging_plane_group_count = ophys_meta.imaging_plane_group_count + else: + imaging_plane_group_count = 0 + imaging_plane_group = -1 + + nwb_metadata = nwb_extension( + name='metadata', + ophys_session_id=ophys_meta.ophys_session_id, + field_of_view_width=ophys_meta.field_of_view_shape.width, + field_of_view_height=ophys_meta.field_of_view_shape.height, + imaging_plane_group=imaging_plane_group, + imaging_plane_group_count=imaging_plane_group_count, + stimulus_frame_rate=behavior_meta.stimulus_frame_rate, + experiment_container_id=ophys_meta.experiment_container_id, + ophys_experiment_id=ophys_meta.ophys_experiment_id, + session_type=behavior_meta.session_type, + equipment_name=behavior_meta.equipment.value, + imaging_depth=ophys_meta.imaging_depth, + behavior_session_uuid=str(behavior_meta.behavior_session_uuid), + behavior_session_id=behavior_meta.behavior_session_id + ) + nwbfile.add_lab_meta_data(nwb_metadata) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73ccc9a9defc648266520723b0f4ddd40e389e5b GIT binary patch literal 251 zcmYLDv5EpQ5RG7Q2!4pgnZi!wP_I2~#4Zpfo579lCLxKdTly{9_)E5af}NEU;q<}0 z8Qz<D%)H<4F+zPhLhiRr|LD*#rHWl5&6aG?SzK7i@`oPh-?3Ol3{gM{dZ=IzwiPoA zg|iw)0&Nq8^Jrs1?0nfq@n@8XCgHb-Vhd}e+p3}sz2z!^vC=6@Y#_PNa)l){#s#h+ t0XZ8iQsgxz$O3;QN<4TBrbe6O+mX^(lcXH__WCuco!(XWlfS=Hu_qF&PC@_x literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/experiment_container_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/experiment_container_id.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ccc6f1a779a70e4efb646f310ff0adebd91258c GIT binary patch literal 2029 zcmb7FOK%)S5bo}I?t0gNV-w6HS>?6|)=1oV31Ze@<T&7fB8^sR^-TB1<IH2zJ!@yp z`haXHC;tN<K%6-9JNN^0<-}j$MAhuWn{0@nrLL{1s;T|zId_}QI)Rh^`jc333HcKr zX2%2ObGYUJh$NCGB&7kR$g_l{R$x`UmDs5hIH?=BsTX*a%uf8Y7St&DibzMg7eu<s zQm%58ckTvt={+EA|1a=M+O+icAKu-G69sJjOHqjX;gO1pwpDI?WAf}k2`R!v?Pi72 zeG#d0V=qq4vUq*}BwUh$&$VxJQ#{hjd^c2jbT57yXA%DM>^M`#NMIBRs3ZZCG_aH{ z*%f_8`czudzGwsvL|`iq;&-kr=}PayKBs{X(i+J8D<*5QUdiepTLIY$$QrU)$r{gy zO@bywzFKZ{pAM9cQ<W9lc~*!xQ+ijPzI8{<<*jI@XvGr3xOuJOa}|$e#HRT1*M@7s zHS0hMa!!t@q+=@CCBwSFe_Q*y2D&yY?M$SqbdE(bRPgASAwVj9&f_dDI7bVklK#Y; zmNm|!L>R;QZ{+Xaw?FFrV3amJaVTUb6el7Z^}fgiAd}+5p306*FCVDPL_qVw;mGv% z;;?7pLcKo_(PQyQ!MjNU7V_~{s38M955eQHC~`g83e}-Fj&r>wp&>wn9bvXoRX{To zVyp7V7cw%}EXWqK)ESI)6XM2eFiV8`^z>GDp6=~gws&P`o&u}9vGh-|EWHF8kjt=i zwJL@>i!kMQu$9pHHe7QDh@?N0G5v*}Sz~rY$ChN$x@2een2c>{Us5QDvw!+Wz4gL* z(B129f8RQe%}^wKmW;)K7lT`Redpl*z1EA!4gW9h%#yQ*Uw03>OWvUKTA#LlJo|Xb zeg~S>HHD60hUu)?+<vZ8Q3QTp713dyskT#EQDXEOWJ%uuQaVp?KFh{pWcqbfSL6+} zsr7Z9a!fxy8dzC`cy+o;PjA1xlyiG%=b8jaT&scBI3CXp4py+L+A1(m9T=NUSaVf{ zU}QEyIt`{m(`Nc6i1a&1UW)MuR@b|rHPv{sSK>okz~^NrVITJ3^XL%S9NnAnFs4V) zSDWOF0Z!<uIm*(XO~E|xK{F8{M={5_nN-7?V1Ey>-$L?20DhG;0Mi2HWLQ}JUx#I8 z3|kF$2ksQk%R1+2E{6&74bGoH7f&@F=Q58#Y{gkojbyn}?G*rdm`jac9sM?t(#CRW z%%R2{>f0!6PPb5`l7#bX<Ph;|XoPK{eIWQ<GuT`{v+0`6D5GmNxE7<8e!smEID-*H zS$PjWm@T8u(lYAI=C8B3j5HP{*!{n+!LBr_qo*G=*tOHIn$fs8G;R=$Z5?dPJy$lF lNIGH=Px6BSUdKM+s`>CgnWX(Q3Kj-)&|nR^ZZ)h``VZ7GD0Tn< literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/field_of_view_shape.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/field_of_view_shape.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45b52d143e03c15bccefb96f27ca400f98f13bf2 GIT binary patch literal 2352 zcmb7GOK%%D5GJ`VNnSgSV<&a`h;D^|MlR4>Ur3WWZHh!`owflM0tjkJMeFQCA=h?f zD2E~ja>}Wf0!>dn_0<2f*Pi+pdg=`Iuxuqjy8>rthqE)B*SEU4y4oOcWxxL<e(?$U z3m;}z0L%?oW)FxYlBOi15v9nplx0rjSl&t9%!|CtkNhl%0xNUVT2_zhlzc^`C;by5 zedQ=$1<HHwM-3S~Ag$WpV3)LL6?7inyq%;9*v6Nl6!&}kDlS`2we^iD@;xP_=%wmT zUMk%ev8uN2CYf0lZ+4D)OH#18@oizsM_QTh4wN3<OP(fqjGkwgH)YH*Fp5M}l8C`+ z9Z6rY7o<-mlg>#PxyqBS^iIfg8u`HcGO&E0YM@<*tkhmPvMw7ZE@(7Bx&pG5S4@U- z)yhJUt%7U~WEbSRm94!XE{QHcJ}y@4w-c4h`~4pib@X5$hN{IXf1r{_gR=6D5?Kyn zXL?w?yRh(Xnm|hOoa|Fc$55P?jFK^MoQ)Y!M-njabfQarw9kt^KLiilOkKFS$W-MW ziu6FW+{!ZtL#3-4=SiNFoL2##p26q#5KtM{sI;%^;8$Y<L6+;B$Eh%e^FPQxf8P4I z`-4&1bj3i(c269MeAN9S7jcnG@ljXhho)N$Rc>OS#c(h(-MdMzYm!o3ABy;~c%<On zGzAU$c&DdDlJlYm77s;P=+RD34a8wm=p70D0z23+W+zi6^hzmqtVOP#LL5n^@{-SY zUXy|LaHQ8Dh!B>6As~dVGoK!BpRY!HmXVmE7F>A8bqkh#bxig#*R<23`T_{yb`fs+ z(wuA}hl$&OWf%~`j;}1anq>UHIa&uBZ*YXgxeROO=<<@ISw$}`<t&j^kiw*K*{gi5 z$^)Ix+Yhk;+s_7m0~lyL`YW{FZ_YDk%=XFHk<Lr{%pJSXl<qd5z&3g2&7XXD^2cQC zjbVyjGDL&U@z0Isx$D91-Q8Q?Hw)Fy3TW9$`!$7W+EagUx-m%??o7BPOSkv#-)o)^ z(SU&^&4*v_?(L%GL^eNb9&dcIqygRTJwYtdSo?)3V2ga^!;C;%MsAW8aVw~tI5m0; z-@uCKw}3=UE=<w6E~)B$U1S_fa20foMd~1=Azg#t@zteL&eZ`ng8Zo02Tavh;MLf+ z889={uw_G|W4aHegJJ+qK-nlPhWKIeqN>ftrnMNE6RoDAXGe<Tv_+f!Gq5tLz<IEl z_L)Yn`W+<iA~`!4Rn5i#XMZ0yC&S1Z^tHn{(}ZB_GKovB)li=e7sH-+DGnY42@tuB zltE8AHc+<{g_HK0o_uAY*%l+WhXsKR;o56XKPlKge6+6P@zFJ5wKtXu6<g~Fv<Sce zv<=R)LLQ{Zhnzn-5b1QsN%GQyR8<>lfJ|MEPJ69dvB(R>8Wd9FXzI6-VEFnyAeD;= z(oJMnr#Ky}H0As>{{SF}NZR644LEE!gHJWK>4$FUGRo-23M`LNjT)WSO5_bkP%Y~! z`fvu=?Ipl&&j7o<2-q6?F}m}AUxV+7QEff_UjSdJ=^q25G2<G)=NfT5+L~LoI=M*O jVwg-agaMpJKjARis`lxm2A|__+o20tNH?9(S)=~~W<XFc literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_depth.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_depth.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8d47121f37673e9eca861705f2655434402d90a GIT binary patch literal 1991 zcmb7FOK%%D5GMDbmnAoK>=f<`LT@^BRiL-N(8jS_2aeo2E&?nBu-qkOt+Nk>T-i}7 z9|{}D$^XEI6g}lH?X{==g`PUYm6XWJr35%4XNIG1o_oL5Y7kh-Uw`mdE+K#8WxlF# z_#U=C0wRc@F-fRTDW0v^N^IXYXFGNh*LRbOUrDNd)$p9Smel<^B|j43ipmuc6=}<g ztV;K?;x|O~G3nI)0lTC_i)!!5{k<rbaBMu_IX?_eWteyDV(X#K(j&<Q4`R8W=28uK zD2uIwDAB9z&E9#i!UdZfKW92WQBwahmTK}SdLE@A{_}i+-)8CG;71al3gTPR7W9U` zBm*ieVP7?UN4n?%`0m`;#wX{J`rwbO0k3*viJGWiA+HX+2JjldTN6#gTYE_y;y1zT zR?*x~_(_zWJdmS&2>4o2d1nF{p;e+G`0K#7Ve3sGIk_aKRM06vy0$RPV9xHTI><U! z;iNo~g?q;1v4pFu$0MnV8e>r!<&2?*mhqrer$wEyFy>k__L}_rdgrVDuUabI=R+>M zfS>bp(*GglVU`O1WnZRex}S|?szadJXgJaRgDB|hD3_m)c=(i`NO&8^pdp@i1I441 zWdT?`<9Vhg-9QfcS(K@+fc%046Rf+5%ptcq?;49tJ_p26BGa5LBulaJMibQnZ<`nr z6DRs&>+NWI3vcb>?uyY!6xA3?hl!x5D4CB{8e(*DVG&@ocVO$!fC&1EOzEHW!k${E zbZTQ6Tw52;luRArTvLd>+vDq$kVgB~dc1qEyK~%*gl96kBHueYeAK>;PPa3;qWSP} zzc<s=QtK#7K~1+0fhoPx!i>)%(f$@>UL;nm9PI8Lw~eW#Xlg)+rT}O8Sb9rxFu7vt z$xpjSyZGnk#qSqiuV@@YMOSpLBIsZ`ug%IJQwh)g+Cb*vFiT~}E$lGXY6Bvz?gA;? zXV{(Qfx3fSL*7SGeW0?0Vdmb0tF8bc^#)z1FYYZRf1w7oUKap>DLGOKduOSuFy|)E z>u`X4LQieONHaOLd;WUP)rridC>wI-g~8LY)CcfJeTd|pC{JNxeGJmFJgs*jL=`|- zP0xb?Ouc1%h;4!I9$cpM6l!ssTv&h<Dsh3csLh*X5of;@^T6~D!?r4;Z<mk}l==k8 zE!;H|HUQHGp~fB{R^xVG&2?aW!9>AH!&uQ^EXl+;#&eUgXJa1EBzBbMrc;YGGh_hi zFcS*DC~6x>;b3~yM|j6RR-YoXH5*BxjAO>$-~|6L@d}GU)qvnPOQRb#Ys0pvMK{)9 z!^uc{oi*PbO~4~#+y7!dm%Np^<jv=j_x4;;m;itO|2~7Usimi8pDP%<v+tEw7*vH5 vMq%yxTMNrZC*`rnM^PCabnlJl<;gTb?VB>z-@(Ko8Y9rOnsn1{+IQ%GZaW9t literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_plane.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_plane.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..515bdaf5d5b86e29594a3dfdcb0b51620f3fa9cc GIT binary patch literal 4108 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_experiment_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_experiment_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ffe45577cb37f27d8b97088ac5805dea478d2dc GIT binary patch literal 4840 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_session_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_session_id.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87eebfb5aefa34a1dbb093e3290a56675349c590 GIT binary patch literal 1916 zcmb7F&2Jk;6yKTI^{yQ|v}poFe3{;igoVV7FF`{BL9GJ`RmIBEXm)4ZY`P!r%sQ!q zb4pN8xpK+@j!67H9OlZ2e}NP4t?h)`y>z5`o_X)h^Y4A`y;iH?z<T)Cui_`qasI~3 zeED$r61Ld~A{|LmCnF&tc%~`MSjeg~OWn*1y{s12GC%Yyo|^_)J**Sw8%KJwcHzjH zVydP*<)7EWhV&1dPVf)dbvnfQy+`+Ul2pO5@wF($UUa15vcv4gcc#eqm5?Gz)oxxY zJrJ?78~2mUEVI{pC(#lYY_5G@nDVh!=7*8e;|IyJB#-f*=L`I<mXYwIoRCN-q>_Y8 zxsqOy=gxpgCf$o>=z#~W^1*-aipiSvFWhqy2EeTYFSw$zE*llE0lXF9tpKknTNSVQ z+;N?-1)i_k)xF{2*c>Qhk|N)gr?>A`jJBC_+KI$q%x*l9F`a?LUl%rmZPtO5&bf0$ zB$*INFDV8e{($v#9b_G9-CShKddDIiDY$xOG*sFKoF{owa*i5CrGu$Dv31VlR2akg zAI`sjZhg{!Xp}a6aVTUr5+@=b_rJ<TT;x)G+*kRr=@&zln;2+;9`(~C>YJog9}Y$Q zL_AjTHcdf8KIunVBsni4uy`!WLXZ2AIuyrAq5BfD4iZee>1V2hjF$pTgGH{M0pcW6 zdC3<fH{t0H$GQa$<2D!`hXmyGjTeL5y>^<}J4?0`Y5f%Hip$8>v?@nBk1@!&utL!4 z7HsnY5J`S>CggW=#!50_=g<=qdPFBoQpqmqnLBYNu5>R6q{8c+{?ceKtb^_Q+gm@j z3)P+Cxbb93b!UI?L3<Icfu~EFkG|dB--gO*f8PH2?9(Oj4pdallsbXdBGY^`TN@NQ z6Q%WrI>}2L3{)8(7P;zpmc^;jYv8QD1H^hyv3sg_`WA94avMeUfi5zR!NaQwfH-~w zGO$Wc-(1MSwJKCzT>=)a)lh4!<QHljLtlk^6%G(isPIh~J5@+o&)!;$+svg3Rfp<L zc%|P)@=~lvFjw9Isj1qEz8obg0ZKnVi3Tv8Uc`v_t}(t2mkBw7ve<OaD4?a#k=Iy* zdD+gxPHig{QB}<x3tc0W4x56056-%cWC3|lg$}^H55j4Y)5da<&$VF4K$m0pb8Z`) zXN4T4cy4n3bR^Q5#OGWVF|Zlrzv>~oQcVB=eOO419|8Rq5bI*L^t*V+sOh`NY|Z9H ztkRV88_3}5Yp8?;p|K$FGh?ut0_u`Aml8_W8n789mAuzkfg&7(dzE$j(R^%lm&QhS zJ~q1l9~&C8VRv8k8B8^!x_b7FfvGtA$QX?cud(xW4J~h6Tds6+k#@x}nZ^elyzzZ{ ZsyZY1Y#R122xu6LL6bJgI%~33@*mjx`*#2U literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/project_code.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/project_code.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de67c68e30777f7cbc7607e7d33c077a568a3744 GIT binary patch literal 1525 zcmb7EOK;mo5Z>jIvaHZ)k;dp%haRd!siL_QK@&7_-PVO;r*?`0gn-40JBrrfL)oRA z$WRW24dmos(Dc+x^Otzdsehq|qBGRPl6~p|JKW_w_|4<v<E^b0!<GH{oBCHU_JJ;o z72x4p-0nUK%`{J0#$(Ru?4@2NVo{$(>SsY5aP|Y!z78&!4uFF=_v40c9J9{G-{{Xe zylQ=?N_E&jfuzLS_P)v75h$(tDeUDX*nvs_6?dK%u6%C6{X7Ocd179hJfR4SMYw3W zuTcPtxn{8kLi2b0EgNv{X>k$8J_OK!4aDld6FSh13;&$Q&9}^F@g||FZauXHVc97( zeKs7;t}?-U;?<vEjGjJjEDm#bQIzbQop8;k_@PUW3V^}Hfo-6!<5hmHGN^)6m5u?g zfg6v&R!u2QZb~W1!a+Kine%E>$|P0JN%@}r^ViP(-Y*WU>#3pAQD41M`K0$KS4oj; zb*~5csp}OZ$X$Z67!4<`w{QAAXG-{Dq>>lvIiPQvqJ@6Z?OSDXS@bdDsVWOQ>Gol$ zPEBFE8XJKc%HDM|D6t8p>edk@yhg+(gS?bW&1z|)(ZtfwY*Iz)GV!y!E2WH<xr*wO z8zGIZHd1W7)cvYqp&Z*hq1w`-#!{_!aJ$b?P?dkjVf#b85mWDkO@$WPzx3YtQ#Qp> zyX08=#)0~ZGuCRatmEDN-JNIcIcyhEOWTi*7cc4-uQ_~wboit_1M9#!Q{-+<|I^{# z!NS|M53kOV(d`G<JflUqj9v@!>yNufyVq@N|IgR#D3N&v1w?D8<h77wx`O?xcdlK) zji7S?Fav$|>6$@jd3%OzXt>fE;^}-+<K_U$WLV_T2`Z7K&VGaqvLB<Uf|o?p+R$#% z+gjWv)#kt!nWTn?cy&Y)7KZ#bKigg%nWa^yMO+~cNm;d|%nChD=^RS=a;(z1Mj*O+ z2&-E)eQ;2Rg|39jOG^`Ew^3AEb8;n+rcz!(!=wm}C4`oSu8G@`X!1M4;~uZy9&|S1 zFBfczZm=m@uqj$)lO;yPd;ixB$?hPs^S>efEatyMXNer~_A*|r$yFMuk(s4R30&p2 UQv2pNv+6xWcFam2@=%20KSzP0LjV8( literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py new file mode 100644 index 0000000000..dc358de3ee --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py @@ -0,0 +1,35 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class ExperimentContainerId(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface): + """"experiment container id""" + def __init__(self, experiment_container_id: int): + super().__init__(name='experiment_container_id', + value=experiment_container_id) + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "ExperimentContainerId": + query = """ + SELECT visual_behavior_experiment_container_id + FROM ophys_experiments_visual_behavior_experiment_containers + WHERE ophys_experiment_id = {}; + """.format(ophys_experiment_id) + container_id = lims_db.fetchone(query, strict=False) + return cls(experiment_container_id=container_id) + + @classmethod + def from_json(cls, dict_repr: dict) -> "ExperimentContainerId": + return cls(experiment_container_id=dict_repr['container_id']) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "ExperimentContainerId": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(experiment_container_id=metadata.experiment_container_id) diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py new file mode 100644 index 0000000000..f085e4aca2 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py @@ -0,0 +1,48 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class FieldOfViewShape(DataObject, LimsReadableInterface, + NwbReadableInterface, JsonReadableInterface): + def __init__(self, height: int, width: int): + super().__init__(name='field_of_view_shape', value=self) + + self._height = height + self._width = width + + @property + def height(self): + return self._height + + @property + def width(self): + return self._width + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "FieldOfViewShape": + query = f""" + SELECT oe.movie_width as width, oe.movie_height as height + FROM ophys_experiments oe + WHERE oe.id = {ophys_experiment_id}; + """ + df = lims_db.select(query=query) + height = df.iloc[0]['height'] + width = df.iloc[0]['width'] + return cls(height=height, width=width) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "FieldOfViewShape": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(height=metadata.field_of_view_height, + width=metadata.field_of_view_width) + + @classmethod + def from_json(cls, dict_repr: dict) -> "FieldOfViewShape": + return cls(height=dict_repr['movie_height'], + width=dict_repr['movie_width']) diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py new file mode 100644 index 0000000000..f5b265a2d2 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py @@ -0,0 +1,35 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class ImagingDepth(DataObject, LimsReadableInterface, NwbReadableInterface, + JsonReadableInterface): + def __init__(self, imaging_depth: int): + super().__init__(name='imaging_depth', value=imaging_depth) + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "ImagingDepth": + query = """ + SELECT id.depth + FROM ophys_experiments oe + JOIN ophys_sessions os ON oe.ophys_session_id = os.id + LEFT JOIN imaging_depths id ON id.id = oe.imaging_depth_id + WHERE oe.id = {}; + """.format(ophys_experiment_id) + imaging_depth = lims_db.fetchone(query, strict=True) + return cls(imaging_depth=imaging_depth) + + @classmethod + def from_json(cls, dict_repr: dict) -> "ImagingDepth": + return cls(imaging_depth=dict_repr['targeted_depth']) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "ImagingDepth": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(imaging_depth=metadata.imaging_depth) diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py new file mode 100644 index 0000000000..7c48b6df3a --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py @@ -0,0 +1,107 @@ +from typing import Optional + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + BehaviorSessionId +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, NwbReadableInterface, \ + LimsReadableInterface +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.reporter_line import \ + ReporterLine +from allensdk.brain_observatory.behavior.data_objects.timestamps \ + .ophys_timestamps import OphysTimestamps +from allensdk.brain_observatory.behavior.data_objects.timestamps.util import \ + calc_frame_rate +from allensdk.internal.api import PostgresQueryMixin + + +class ImagingPlane(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface): + def __init__(self, ophys_frame_rate: float, + targeted_structure: str, + excitation_lambda: float, + indicator: Optional[str]): + super().__init__(name='imaging_plane', value=self) + self._ophys_frame_rate = ophys_frame_rate + self._targeted_structure = targeted_structure + self._excitation_lambda = excitation_lambda + self._indicator = indicator + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin, + ophys_timestamps: OphysTimestamps, + excitation_lambda=910.0) -> "ImagingPlane": + behavior_session_id = BehaviorSessionId.from_lims( + db=lims_db, ophys_experiment_id=ophys_experiment_id) + ophys_frame_rate = calc_frame_rate(timestamps=ophys_timestamps.value) + targeted_structure = cls._get_targeted_structure_from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + reporter_line = ReporterLine.from_lims( + behavior_session_id=behavior_session_id.value, lims_db=lims_db) + indicator = reporter_line.parse_indicator(warn=True) + return cls(ophys_frame_rate=ophys_frame_rate, + targeted_structure=targeted_structure, + excitation_lambda=excitation_lambda, + indicator=indicator) + + @classmethod + def from_json(cls, dict_repr: dict, + ophys_timestamps: OphysTimestamps, + excitation_lambda=910.0) -> "ImagingPlane": + targeted_structure = dict_repr['targeted_structure'] + ophys_fame_rate = calc_frame_rate(timestamps=ophys_timestamps.value) + reporter_line = ReporterLine.from_json(dict_repr=dict_repr) + indicator = reporter_line.parse_indicator(warn=True) + return cls(targeted_structure=targeted_structure, + ophys_frame_rate=ophys_fame_rate, + excitation_lambda=excitation_lambda, + indicator=indicator) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "ImagingPlane": + ophys_module = nwbfile.processing['ophys'] + image_seg = ophys_module.data_interfaces['image_segmentation'] + imaging_plane = image_seg.plane_segmentations[ + 'cell_specimen_table'].imaging_plane + ophys_frame_rate = imaging_plane.imaging_rate + targeted_structure = imaging_plane.location + excitation_lambda = imaging_plane.excitation_lambda + + reporter_line = ReporterLine.from_nwb(nwbfile=nwbfile) + indicator = reporter_line.parse_indicator(warn=True) + return cls(ophys_frame_rate=ophys_frame_rate, + targeted_structure=targeted_structure, + excitation_lambda=excitation_lambda, + indicator=indicator) + + @property + def ophys_frame_rate(self) -> float: + return self._ophys_frame_rate + + @property + def targeted_structure(self) -> str: + return self._targeted_structure + + @property + def excitation_lambda(self) -> float: + return self._excitation_lambda + + @property + def indicator(self) -> Optional[str]: + return self._indicator + + @staticmethod + def _get_targeted_structure_from_lims(ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> str: + query = """ + SELECT st.acronym + FROM ophys_experiments oe + LEFT JOIN structures st ON st.id = oe.targeted_structure_id + WHERE oe.id = {}; + """.format(ophys_experiment_id) + targeted_structure = lims_db.fetchone(query, strict=True) + return targeted_structure diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9814f62a3c7bf20aabe1ac2c13f2a0055267bff GIT binary patch literal 272 zcmYLEF-}7<3{545s!|Wa&}Lvm2mxKIE>*Wkk@I8m(<V-oq`&;JXJO(9T!ob*urc8v zL7(Jj>plBPewxo`f)QTN(E4YiKTLRd;3`*4R&2%fWb-C+lP~oBzPeSrg1IQ@!7dG) zfJXI5&_%LvqmYK8VnQk%b4>kM)Y=(UT*XC#?f}oox8C!HJxG(mk&cEF2dFWR(qIpR zi&<Kzz|J1KT4cZqO_0Bd8ebA-7m%v{cf!$Er;`W5i>S3DSG8WI@nd=yqCI-NZ!dju Fi61OAR=@xN literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8eff3adb80ddb663317e7d6ae33d637d93aebe6 GIT binary patch literal 3088 zcmb6bU2hvjaQ8m!^H-Xr2_-FsqwNEhsDs2CqKLMnB~|N`1XSr{aa!N5opbN2yXUly z93<38ed;fuNUeC{nZLlVxL2O|3p_EqXJ70%t>8|(J3Bi&voo_hGq)OzDuOTk?Pu}^ zpugl~`jr9r8k+bKI*KR`P>3CjC9DNns5`oX^}q;C$5gNpl)|!84lTzDD^5k>%%B?9 zoEk=V5iQa3F`{K=GK-a2<$1}eQ)>@3D}RFw)Wn&!lcatekpSRw`_ZjCe!u{%enV2S z(;YA`ZR*+jJrPH{j8M`I*mjgM-Xk8%*6;hFSVXV2pLQ3pz;pFsEYdz_;=3W^qX+&o zKl0=$rk^<h#7_V)<Y0;%jp<CM_?7ko^)S__eq479W>SNi$LKkBN&qVz0WO1%I;*fM zMH`4(uXI|W)nfxzYOqoVE7o3Vv`!le*8toS;FbV)jxH<QxfjSl&NA3%C0p4JN#Bq9 z4+9dhyF4ByO)aY>a_08sG+UXOxL!PrQcs_#AV&k59EA;Cik_nZrg#jle5qkH2FTUM z8uU6vAW&~}c{4zU5s{E(<^c(YtZ8JX7$%Homh1YFpSo^VcW2~gtFyEG6yPvJu%M?H z@|xs|vx@6_0TIG=e@FlPdHajb4}x*gA^U{3y5uQ|MxC1x@#2V*&pRwS5S=(-k?^38 zll_tC-1oa3;iv3+LcGVM&tPv500n)#+2zEK+_(!I4@esG(Po$JlLJ5In-s1QtjK#L zHba)e6-vpb;^?wxpqL-BD0PdKa2TZiM5O}h=bo6=w3UqbInZngnkYes@G>sp!;1@E zYfTO3VMzv`9A&!=P3;|{fph_GH!)uZBn+!C@U@~_myq<&d1yj|4rzy%7iG<O=D&$s z0ZwlbCmnYI+Em=tcZw@qe}2KZKF!Jjyi}KVvl3_NkVnNul`%(NRAq}@0N{$^U*MAd zsvqfNZGgr))nDQxV{8mCze0^YG&Wvq)O?fU^f9KTp0<IG%&|dB8|bz11|5~gXl#z* zUB1-7t`>o~gsN40@;xLRZa4%HQJ}6DUx7M9jbd%0%?Zn0rPTtzV#9*zY(Ekyi9BZe zJ^QpMyYC;c$nK7c{qp3esa&7hzOWO*Q#<b2#8%F?Rct6WvOqAq9Y^fstmF@Ajj1u@ zxVLqG>-P6{%v!*bh_fVpYA5}cV(rG9GH&18%jM;<XpY^T-JJ)E#|5@*j_lsfc6%a9 zFd-lb0Ew`70LfapvJ<@2^aiZK@fJBuSon)?6l~L<qnEk@d(b3jI2CioUJyCA_0hLm zyIc7Y;3%KWt<9V8^vM@Um3dA(bHO^2=|re<%MJVR!W^q+F@xx8K9MP{&EJC;G>PLg z(bvpM5RV}QW+n@hbmUY7OCg+7_AJwb*mKI!F!F&#vz+N(AaXYH?eh)j9F5Mz@>5YM ztMqsry7EO_0$L#h7rI=>b%=%ruHq$t419QL;RUpceUNi1)b~=CvxM{aVZWy$8~`#j z6yf0mn80(#@YppN<)hc(p=&Bc$cJvUv-4;8GEYI;i9wVKO@m(shWsPh$<V6E&em=K z<;N``5f*evv#|9pog_8rRF0l@dr-~HYa}yrq0vQ{jPU@1p3(_)8DMCd%+V?*XVx?c zHD}J>)SX5^x+-hAGNExB7&#kf=spe0xvp1$j9-=Ad}_%o<qSCRHZ11(Osl>npG`@j zMuDP077I`mR9!cW=`fIR-F2S~NibQ_{U}wbGP4p6*_@}N6LV)ZRTO}d`!VIxx?H-R ze+XS>$V<ULmUC$}eoZ19lRCm<LEyS4dO#ABxsj_(SpldHP006PX=`TPs2duV|JpST zua-2-B~828$V%xbfig?Ub<AW0Mo{9M&!+W7YoWeqP3w!+Y<<C{U!Cp$yA8@8!CHJ$ z-NLh+l(&M*f|SeRg3C1NtQVXW4b;pnlK8pRq&6qU$RTNp%=$9-%U81E5Yi}h4Su|) I*Yzd*FB`lgEdT%j literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/multi_plane_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/multi_plane_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97d435b4588454f819899c3e5208d7c039cd975c GIT binary patch literal 3564 zcmcImOOG2x5T5QC+vC@+?cL3T1PHI7L0}|uiy}l4NW>wVpa_sgM$LG-y*rzEnC|f= zUO5s{R>~<?#9{vcKZGNHps$?x3!JFx@r#Xj1qY8+H8s^eUFEM{bEny?S#bSv<JaJ` zEz9~7A7+;W!WTg5XJFjoB(@Ub6M{00X=3}fk?q(?N`A@6PFzkZe#OY8*iEW_)yU<z zmel>akt=Z{Y5GkgyYWV{>2Dgj8n=?R-zL_5i`RJl*y43je_{I_-gs<z&A-44%Okq7 z`~97JQ7k~*`RdtF$S4tMem6_=AWDV&n!`ftUL<1vaPVCuo<80WhPb)$brS4F>E4%O znD4`Ld;0t+4pMPnW}_h}FFqXZkJaMX2O<x6kO#1|VU`{XrJ^h~R_c#rb|6Bq&Cx*T zQKs@eDbzP3A;%A*XHgoW&$FvC71S>v2+Jqj@~N<eBTAwyD#GRDr2Ntv5Kg&$-0-WS z2CH>I+c~j$iI<O^7sPLXwh6k*2{n6NUOjGregpKIps!8!b>1-gmS_u`H%|!P;G5=z z&Ro;tZKK(GX*rg^4JdbX=fNn>qalJa|MO+Nl_4%n%<*Os*R4XS3P@11H9*{1HeiQ< zJW~k0Zbk+0j3e@TYxZbtusuXxH--h2ECejW8B%yhvVqh!V7c|eIv^7=p%Z)JOv;?R zg1noQCKjXI0{`i*SCS3bDVxYPkZmGs1M_TMQX|M1?J^dnQO=m&W-HwBD%w#Z9;`g6 zH9wB%Dq~?BD8<-s*5AM1z1jO#38{L)e!#o^;AxPKd$-dd%u*iQ=!x`D^|GNzRS4W* z*NdZmPer--WEg}`f;|E6#xd;RPkMa``OLCDoOl@InH=}}Vm~;HGTFn7gcZy^)k~%+ z3P+y`(R?Mrkg@{rbCuoUSV9}H-ULzzp5>MaC6odYmmXbtJvq8FC_UT2r7LliD8~D` zEJZ$&X^7Fos|4f%-33xNf#uU!LKNw9JEuit&66{+Cia01<N%d`%0QKg!|AIs#M$2U zXc3*uaFADC87Yjp#Bh18#5B^?fy@$y{>d_~VWQ|Zdo7K(*{VF=n5RmS$W6AKv|dTu zVXPKT>C0yZ#5g4{q6>yyLg@;yPl410V3y;M8bPAK9SQ`$qpK_MpZ_P1>MD=IoJld1 z@(nm7q<9ou*vhLwrjTxdFe@Ygn>?ol^hUM;cnZK%0G<Ny6o97yJUwtHHh^C#z$fxu zIK`_haMu@?nge8f(T$-goGQX1AXV9c_oo3lP+7VNh`fp`mzI0YzmCJ)ly4z>8<^+F zYbc{T@*QL*;6x&dOX$82kGFx;HZY5BkVb*5!S#G>(LKPnl0NMZVD79P+3VooGP3eL zP@IRNYf=E*I|ZWr0AE~<7aBPauMc7UA<)@)t?C6cM?6xXMBoIx@Q!3kAA7*WI)LJb zTq0P=7!zGzng{Uy4(Lvo2!{3tAZ7BJ9$jBi4lCMu_<!7JFS!BJXq4uwoza(9SSnr! z<}Q|wKK^emPA%==WJ-fXz+|d1mSlVsqugNZr%@13SL`UwC88*?t|j)>BJx<`rhn_Y z8B5UX_cJc>6VJ34?O=b9SPK#%lo)00LK}mjn2(FL^bzWs)4>*sIA&}S2f)G<mg!h^ z*onoeu=re@5oS(M(y61=*`(w`v!IquiNyW8-j*&6$C#|>f&XMS@4BzeyY6h>b(iN| zcQ(MfXSUbwS)B;mpTD;bi!0`Z363AE!`dwK%p5ZD*OPVFNmhI}bZ5qw>cnK9PS)YV znL#clI$xj7#b>RlHUGzTm|FgVkXXKYXKn_nT*x$tyTLFjY8VS>QHzV|rrldbtN0u{ Qox;)Dpbgvnoax>E2N%NCR{#J2 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py new file mode 100644 index 0000000000..176325c586 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py @@ -0,0 +1,77 @@ +from typing import Optional + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class ImagingPlaneGroup(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface): + def __init__(self, plane_group: int, plane_group_count: int): + super().__init__(name='plane_group', value=self) + self._plane_group = plane_group + self._plane_group_count = plane_group_count + + @property + def plane_group(self): + return self._plane_group + + @property + def plane_group_count(self): + return self._plane_group_count + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> \ + Optional["ImagingPlaneGroup"]: + """ + + Parameters + ---------- + ophys_experiment_id + lims_db + + Returns + ------- + ImagingPlaneGroup instance if ophys_experiment given by + ophys_experiment_id is part of a plane group + else None + + """ + query = f''' + SELECT oe.id as ophys_experiment_id, pg.group_order AS plane_group + FROM ophys_experiments oe + JOIN ophys_sessions os ON oe.ophys_session_id = os.id + JOIN ophys_imaging_plane_groups pg + ON pg.id = oe.ophys_imaging_plane_group_id + WHERE os.id = ( + SELECT oe.ophys_session_id + FROM ophys_experiments oe + WHERE oe.id = {ophys_experiment_id} + ) + ''' + df = lims_db.select(query=query) + if df.empty: + return None + df = df.set_index('ophys_experiment_id') + plane_group = df.loc[ophys_experiment_id, 'plane_group'] + plane_group_count = df['plane_group'].nunique() + return cls(plane_group=plane_group, + plane_group_count=plane_group_count) + + @classmethod + def from_json(cls, dict_repr: dict) -> "ImagingPlaneGroup": + plane_group = dict_repr['imaging_plane_group'] + plane_group_count = dict_repr['plane_group_count'] + return cls(plane_group=plane_group, + plane_group_count=plane_group_count) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "ImagingPlaneGroup": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(plane_group=metadata.imaging_plane_group, + plane_group_count=metadata.imaging_plane_group_count) diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py new file mode 100644 index 0000000000..c6f35a3609 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py @@ -0,0 +1,102 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.experiment_container_id import \ + ExperimentContainerId +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.field_of_view_shape import \ + FieldOfViewShape +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.imaging_depth import \ + ImagingDepth +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.multi_plane_metadata \ + .imaging_plane_group import \ + ImagingPlaneGroup +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.ophys_experiment_metadata import \ + OphysExperimentMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.ophys_session_id import \ + OphysSessionId +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .ophys_experiment_metadata.project_code import \ + ProjectCode +from allensdk.internal.api import PostgresQueryMixin + + +class MultiplaneMetadata(OphysExperimentMetadata): + def __init__(self, + ophys_experiment_id: int, + ophys_session_id: OphysSessionId, + #experiment_container_id: ExperimentContainerId, + field_of_view_shape: FieldOfViewShape, + imaging_depth: ImagingDepth, + imaging_plane_group: ImagingPlaneGroup, + project_code: ProjectCode): + super().__init__( + ophys_experiment_id=ophys_experiment_id, + ophys_session_id=ophys_session_id, + #experiment_container_id=experiment_container_id, + field_of_view_shape=field_of_view_shape, + imaging_depth=imaging_depth, + project_code=project_code + ) + self._imaging_plane_group = imaging_plane_group + + @classmethod + def from_lims( + cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "MultiplaneMetadata": + ophys_experiment_metadata = OphysExperimentMetadata.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + imaging_plane_group = ImagingPlaneGroup.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + return cls( + ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, + ophys_session_id=ophys_experiment_metadata._ophys_session_id, + #experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 + field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, + imaging_depth=ophys_experiment_metadata._imaging_depth, + project_code=ophys_experiment_metadata._project_code, + imaging_plane_group=imaging_plane_group + ) + + @classmethod + def from_json(cls, dict_repr: dict) -> "MultiplaneMetadata": + ophys_experiment_metadata = super().from_json(dict_repr=dict_repr) + imaging_plane_group = ImagingPlaneGroup.from_json(dict_repr=dict_repr) + return cls( + ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, + ophys_session_id=ophys_experiment_metadata._ophys_session_id, + experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 + field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, + imaging_depth=ophys_experiment_metadata._imaging_depth, + project_code=ophys_experiment_metadata._project_code, + imaging_plane_group=imaging_plane_group + ) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "MultiplaneMetadata": + ophys_experiment_metadata = super().from_nwb(nwbfile=nwbfile) + imaging_plane_group = ImagingPlaneGroup.from_nwb(nwbfile=nwbfile) + return cls( + ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, + ophys_session_id=ophys_experiment_metadata._ophys_session_id, + experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 + field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, + imaging_depth=ophys_experiment_metadata._imaging_depth, + project_code=ophys_experiment_metadata._project_code, + imaging_plane_group=imaging_plane_group + ) + + @property + def imaging_plane_group(self) -> int: + return self._imaging_plane_group.plane_group + + @property + def imaging_plane_group_count(self) -> int: + # TODO this is at the wrong level of abstraction. + # It is an attribute of the session, not the experiment. + # Currently, an Ophys Session metadata abstraction doesn't exist + return self._imaging_plane_group.plane_group_count diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py new file mode 100644 index 0000000000..c30417474c --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py @@ -0,0 +1,147 @@ +from typing import Optional + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, NwbReadableInterface, \ + LimsReadableInterface +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.experiment_container_id import \ + ExperimentContainerId +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.field_of_view_shape import \ + FieldOfViewShape +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.imaging_depth import \ + ImagingDepth +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.ophys_session_id import \ + OphysSessionId +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.project_code import \ + ProjectCode +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.nwb import load_pynwb_extension +from allensdk.brain_observatory.behavior.schemas import OphysMetadataSchema + + +class OphysExperimentMetadata(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface): + """Container class for ophys experiment metadata""" + def __init__(self, + ophys_experiment_id: int, + ophys_session_id: OphysSessionId, + field_of_view_shape: FieldOfViewShape, + imaging_depth: ImagingDepth, + project_code: Optional[ProjectCode] = None): + super().__init__(name='ophys_experiment_metadata', value=self) + self._ophys_experiment_id = ophys_experiment_id + self._ophys_session_id = ophys_session_id + self._field_of_view_shape = field_of_view_shape + self._imaging_depth = imaging_depth + self._project_code = project_code + + # project_code needs to be excluded from comparison + # since it's only exposed internally + self._exclude_from_equals = {'project_code'} + + @classmethod + def from_lims( + cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "OphysExperimentMetadata": + ophys_session_id = OphysSessionId.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + field_of_view_shape = FieldOfViewShape.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + imaging_depth = ImagingDepth.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + project_code = ProjectCode.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + + return cls( + ophys_experiment_id=ophys_experiment_id, + ophys_session_id=ophys_session_id, + field_of_view_shape=field_of_view_shape, + imaging_depth=imaging_depth, + project_code=project_code + ) + + @classmethod + def from_json(cls, dict_repr: dict) -> "OphysExperimentMetadata": + ophys_session_id = OphysSessionId.from_json(dict_repr=dict_repr) + ophys_experiment_id = dict_repr['ophys_experiment_id'] + field_of_view_shape = FieldOfViewShape.from_json(dict_repr=dict_repr) + imaging_depth = ImagingDepth.from_json(dict_repr=dict_repr) + + return OphysExperimentMetadata( + ophys_experiment_id=ophys_experiment_id, + ophys_session_id=ophys_session_id, + field_of_view_shape=field_of_view_shape, + imaging_depth=imaging_depth + ) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "OphysExperimentMetadata": + ophys_experiment_id = int(nwbfile.identifier) + ophys_session_id = OphysSessionId.from_nwb(nwbfile=nwbfile) + field_of_view_shape = FieldOfViewShape.from_nwb(nwbfile=nwbfile) + imaging_depth = ImagingDepth.from_nwb(nwbfile=nwbfile) + + return OphysExperimentMetadata( + ophys_experiment_id=ophys_experiment_id, + ophys_session_id=ophys_session_id, + field_of_view_shape=field_of_view_shape, + imaging_depth=imaging_depth + ) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + extension = load_pynwb_extension(OphysMetadataSchema, + 'ndx-aibs-behavior-ophys') + nwb_metadata = extension( + name='metadata', + ophys_experiment_id =self._ophys_experiment_id, + ophys_session_id = self._ophys_session_id.value, + experiment_container_id = 0, + field_of_view_height = self._field_of_view_shape.value._height, + field_of_view_width = self._field_of_view_shape.value._width, + imaging_depth = self._imaging_depth.value, + imaging_plane_group = -1, + imaging_plane_group_count = 0 + ) + device_config = { + "name": "MESO.2", + "description": "Allen Brain Observatory - Mesoscope 2P Rig" + } + nwbfile.create_device(**device_config) + nwbfile.add_lab_meta_data(nwb_metadata) + + return nwbfile + + @property + def field_of_view_shape(self) -> FieldOfViewShape: + return self._field_of_view_shape + + @property + def imaging_depth(self) -> int: + return self._imaging_depth.value + + @property + def ophys_experiment_id(self) -> int: + return self._ophys_experiment_id + + @property + def ophys_session_id(self) -> int: + # TODO this is at the wrong layer of abstraction. + # Should be at ophys session level + # (need to create ophys session class) + return self._ophys_session_id.value + + @property + def project_code(self) -> Optional[str]: + if self._project_code is None: + pc = self._project_code + else: + pc = self._project_code.value + return pc diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py new file mode 100644 index 0000000000..fa730ebd92 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py @@ -0,0 +1,36 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class OphysSessionId(DataObject, LimsReadableInterface, + JsonReadableInterface, NwbReadableInterface): + """"Ophys session id""" + def __init__(self, session_id: int): + super().__init__(name='session_id', + value=session_id) + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "OphysSessionId": + query = """ + SELECT oe.ophys_session_id + FROM ophys_experiments oe + WHERE id = {}; + """.format(ophys_experiment_id) + print(query) + session_id = lims_db.fetchone(query, strict=False) + return cls(session_id=session_id) + + @classmethod + def from_json(cls, dict_repr: dict) -> "OphysSessionId": + return cls(session_id=dict_repr['ophys_session_id']) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "OphysSessionId": + metadata = nwbfile.lab_meta_data['metadata'] + return cls(session_id=metadata.ophys_session_id) diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py new file mode 100644 index 0000000000..60216326e6 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py @@ -0,0 +1,26 @@ +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base\ + .readable_interfaces import \ + LimsReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class ProjectCode(DataObject, LimsReadableInterface): + def __init__(self, project_code: str): + super().__init__(name='project_code', value=project_code) + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "ProjectCode": + query = f""" + SELECT projects.code AS project_code + FROM ophys_sessions + JOIN projects ON projects.id = ophys_sessions.project_id + WHERE ophys_sessions.id = ( + SELECT oe.ophys_session_id + FROM ophys_experiments oe + WHERE oe.id = {ophys_experiment_id} + ) + """ + project_code = lims_db.fetchone(query, strict=True) + return cls(project_code=project_code) diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e36a9bc94359679a37a94e42ef5ee62799989371 GIT binary patch literal 242 zcmYL@zls7e5XK`|$bk=Hp((Bt5$|l}n!_#-CY!;H?j}nnu55YFaix{7Wa}f?Sve8Z zf$y8)H-DJ#;qXIn)W<)_`I7A!JuVh3>a$t#D@MJalZY9=?e@Q%sx@IG1tr*tfdlwX zeR(K?xA3XZx1>UYo(lHRlpU#+Gm2coaRbE;HpshG#S?ZXO$6t4FnqCv6k;b0me9Ho prG*6C*<z7M)|emzN&5%UFQB#aE@?e!y7ORG2fMFuo}a$5#2qvIN>%^> literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/age.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/age.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c8b5f18174f271f2f24a56f63bc28805a4732be GIT binary patch literal 2901 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 S6t5aX?*#;!?6}i(R@grsF5Ywi literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/driver_line.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/driver_line.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..266eb716844ce235dfbf2a64145c2bc02cff6046 GIT binary patch literal 2333 zcmb7GTW=dh6rS0Oy}q@fNeV?EEfOfWDh?7)6pDIFp;hWY3aYfSG}_%6+nemgof)Tf z<UT+u^{Kyr7J+!;FYPN&{R@5KoUxra1caDqj%UuCIWy<m@0`iaR;x~+WxxLzeqJTy zPn;|o%*l1=Dgwa?rzy#3Kq-!`)XMC@He)+=GB<F|*hwo{HK=A@;AOR-W^`^^&l*7^ zYX(h9z9ziFtIr6p3RifdDr!fSpvAohq+NRr=a4ono$W+v_^oyy-n^5f0*3Y5p$>PV zJrV1+U9R6#MZPOS9!9CSn`<HaVJyn^?IcrY)ob0y(HU*qDldFnC_RuueK!_zazA;J z<mG!ix!95S3n_Mm8mD^e$q0@Vd`rqg#(2L)bLRs!gn=Ld<s`5;4Q$~E_YxrVl0GMW z%5CmEYX%jF)C1hymzIg&Iif)gbal}Ht@qOAHC}&)+9qgQplg6-lediS+;ifP;5=Y- z4v>(^fsortE)Fm2q3{PHFZ5(2{5;IW$ExiYeINDQ*!d|Kf)+4r%rp!&u{FOw{yNZY z=xPmwCP!qCayq5ldST%Qgk$ZlY`_|T=HMx%dl05$0aI6vM?#h!V@aN9#?V5Ev_CVa zWsR{o4V7Z-5Ax=hTUUEOC?QoZ9EQ9Tg^$C0(z}s|agp=zv!2KgRIeC`T*V-Z(Qu-A z+ey?@i58!X!gxO%2-usZV8Qn{BN-++D<bfC5b8osHX|_%50XM|a$pOrAYIgECNwZb zhns3_H0)Th1W0Ezk>?@A6~w`SLl0L^pzbUMSmQ~onG_>gR;18lnV&)vk-UXo&ViT` zz>y*yUeF~Rsli8H01H6Oj#DKOd!v|%RhX8wzAQ4f2V}?T>{{00+S0X-4InF47vVD{ zluC-6CA_SrkQ0nYaveOxcsFd7c{lgmg$aJ|pW&9T?5FnB`jt%W-{@0k>Tt5}smq#9 zftuXjC-S<sIOxIFo!THPuiPX06V*0aJar*nmsd@!UN=lAA$5PLJ=ogby7j$3=pc*y z8xQ6rHIzJMcxQL#zW?`llpm>6R`+)9c70ytg;YNGce=3NF;j^A8t)|h->lgpX<**~ zH}b)MZ9LgwHVnY~HQ2RK!-;1PJ6^>6RQ^DpGC^G6=z&I8OP<ge-1#@Uw{g)xb<N+H zk#*ygi-+HA?QUVz;Nh_T#qru}0G=Fvw5VQwkqf_&eg<{ziXV-&FGVb%jPR@e#^L!5 zA8F)2!ZLWZzVU``v}XiuJAv01IvzsKl{TcEtbyOMq6!H$v0afDVJhE2aS0b(;{vk+ zYv&2a&rljk`8Mn@IYOFETBmE&qHC5%&(a%>Axo<H<ERg>!Hmg^`h|?fZkYTo3^W0@ z(miX>KBB-#3m6Gy*)Y=T9>*o$2h-9?;h`z3^SUsrS@tZb4`BTt1Mp1B!CkI^g~HNF ztd-NXVqwu<!NQ2&kFm1OSXS_HisL3@kH%p-U#T+2i<mKqF_pH`(o~|dVJasSt6{-Q z2aAqG%t|}Swe(;leH0kI{18Ohnitzxq$#+=>S6>${T7a~h)8_zThJ9QdzM2l+7`V4 z9ptJ-&3YH!nF`P_$p_|AfjgQ&#OA2r(?tR9oGHMaMaFiP3$R3xg1i5B8@vxnbmaV% zhxcXv%qxjcuf!52@n4i+{n)dy$-}f0j*=Nd$X6562^vde^uC;ZlCLmbR1-wgf<L-u IuQ)68FXSp|*Z=?k literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/full_genotype.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/full_genotype.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a06179cb6ad889e82c144b68be42a7e38b59ac4c GIT binary patch literal 2548 zcmb7GQEwYX5Z=8z+h@m4)3hm|7I7+w%A#?Qka(bgpdl%#ic^x7N+(OF_3b)7_k4HV zJtwv0KA=YGQ-1+LO2iWn{Gog0iNDY%X4XC@t}7(Yy7lbr?9S}WH#2v)R;v(r`hWb& z{wfjjH%{^g=HxqgRR;!6I1P!5|3*mrhHFry&Cu*yuBB-!EcA<RQPYL6)VE!`Uv|s= zid)gVVz|_=x>ZW<5nkf<G2yl-in6dp<z>;Wak@|H<$pjIY1V0G?<Q#wM=S)o)O>Px zI|v1kl^<BjcH2GSr*$)1yRYJCPcY8fq1cI1Av??$+1i7kuNK)?n@8;hE}XggFjnb- z6zb=Jki(yX=RxG78TnI~66!e+g1D3u*WlDOg~g2%`igWYH@S6ObqjEz61b&sV(=m_ z9a}G{JGo>9xb}(3%e<nwOCVVV-V#Vwc}??bd{rz9>jT0solw5QFCQ1&ORtDU+!b)m zm8`lw2*Z0Kiql~tMmN*0a3a<hPTX;jRs-#pTgo|@%D~-f9oXaL4Bwbu1^+F0O?cH+ z7*g_*^eCre%8l1LwxH5%N`yz<$ShQp6%JWA5HKyMK_X;kdtML)spp}D5@BZ|PP4M- z`5{xv^Zq1nPB*`5Jyt@h7V9$JXtN_04O`zw%#S0^zG#W)P_^PjM9POTPP#+YdJwc* zDoDk8!u+S~K)~KG1PT6hqb*qwd2t&~JY;DshZ}9tWrsm5H#lGeRuCL&qc2jxManj& ze(`3EIhQn&p<ISbuAnEhd+2EGqN5uZE?MS*pL$XxGAl}v4rDavQS{~}o`VOD3HXvi zFpbxU?A(`B`$%2}3GkZfhe}=nS~DiYDonF-N5*}x2k^$#iDAa*+MHoC5y*rqxf47k zl!C<Z0-lvZ$ODhJB}Ujs>+nH1W9+r1p8$bT{|)T?-F#t=jUE}B2<O+v3k&XG@q)I$ z*c_czoVT9+tp{71j~w2ZbLoQE_TKJK&f5kmr>zzw@9*w39Ue!qR1SA`fo=r+o3?6b z9^7eR$CDqo_O{?ClygR_cNPR5K^7EMDj{<9iSz4_lpT@!-8d5Uf?NX^$oFt~ABL>( z468t9=Q;E4$e?F&k1E1I>?&QR?}`qJL6}R?QM&^LY!ZlzNw@%+o=!vUas%pMo`9t( zisf}sS2rd`e+cy3=Ght*pzmW?%yBah=v-nOj@QV@4MJmP$oLW_W6~oppwx|xrzPo( zsl1WWQ-d346e_y8PsYZn$>|y8P_#|~DZF@Q0M<*aL<yNi;vthzJ)k(B$9sMD%%qN( zjAj$W*^{n-vL>B0cH%*r3{nS0g6O~rI!?l*LbAhxP*rC8_H<JIrygGlFAO3v+k?7# z1C{C`x+#T&tG6A|IA}P(1j+i&-q!v)@NYY@beez})DK12Nn*$}Xgpxy++k?j`SEY) zozZ8HBkWLk6}{->MmQJ?XD)l15`0HS=EhN)5rAhEW|=*`y2>o1pa3UfkY*()MIm&& zx+yP#n8cW$*Ov?BWLc~Aa<#WWPT|3%R-`tyXa(NU^||UYzoSmK>zA?MV<Ygqtm1k7 zm=8jvtDg64z{2TD$@6&Z1KWh8)1@_A(#-%M(2aR!VGWhnKzC*aQ7Ubq<P97Ue)1z6 z5Rmdy7_!>5llTJKn0F3#fG$>SiN#WuVW`2YJDF`*bk#KU3u6T-Em2>VH$f;XLi+^h zXeDkT8A7gT)$Zqck7+FQm_}Z`8W($v#AI=I{_i$ufl4&w^s@z8==8fqNi5A0D~iOA tFL!NrvX+65p$1EWiO2BH=kB-=YWwR+V7^5d=}u(RssTTG)vTH;^k24fkOu$& literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/mouse_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/mouse_id.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fa5298757429dd3201e5e9a6771c1aee3001ed7 GIT binary patch literal 2010 zcmb7FOK;mo5a#kBQnHjfj-5VH@E9E`7wD}oG_jplflRlyf&heo#ge;<sPLieQg&p> zhr$Me9`Xy~o_gvZ>Vemu`WJfY3?(Xd+!QE*9Svt^NArC<Gknl$H8gmV-+pGl)HLl+ ze5oEAl<#1vLl9i!B-Rq*6N0)P>xtnTrEbJ#V)<55^J|Ii+ojEnouuy9iT1t5End6O zcug3hCM;o}*Zc;zkF>V)7sS=tq_Djw4<1Ib0JX8pa&{1mMVPmZV(XF0(nG;G3u4ht zb0LQ;6vb9AO4LpBrgswDutLm@A2XFdl|ubA6>_#8y@=8f|G9dsrJ^_}Lh}jNe4P{D z5GL0z$xCfWxWUbfrf&fP8_-*qI<Im2!aOIw12$9C!RlNZyv`e?wE@;Ou&se-lebD+ z^QC5LehZM_D(wAiszjHcuID4+_E^xDEPSTi?k*(kB)CZ<9_q`~@YjT8z*3taa_w9j z6HexY>#uaA9Ksr&tixVgFU*uBqOguxJQeV2sp&+>!l5)uqnuLoP$C{K+(}WVG>n;2 zl>V;${d(ui!DA()8n6-Loq(ONbT+u3vM@_I`(hx{V>QSoB2^*CY%-duK`#mhD$2!Y z6F|Y93OF0b;K8452a-i8%>syc%<@dmwgWL@$5AG?Iovhu;AN}rMC5SKIonp#(n42; zijB@>CR>0HmnxYdr|U}|J6E99c@*YUiis?0Qsh&au6RWLaP44-k3ax_<U{RD&$YRJ zPR{f>`~st-WYfPZUO>&IET(EA!YC0bMPl2eBF>0XtWzV5mE3@ErCqM0R*Ku874@Oa z5;}%bMw@~*(=^>74mrJDWxw)(V0S8hs1iy=Sqg<v*fEqm<$=5dheL#b4^}R&63#tP zupnMTcm8Ue83<`i<_6a8D+Ff(IFnl?xSDtRN5j4H9PRb?cKYsa_o(0XcKY|!r1K8& z*N#0rJlJ>NPFT5ty5{xhpzFCjOEall?jCrs-zi@K+Bdut@tfWi;mTDLJOTN<`^1wU z_73+jD1<xRy%y}gw~J^09gEvNa=nAT>pkxEzPfg-4{caexr9opZd;ewc)l|fc{s{a z(YE9k807mXJ^)cz&vC%~M-AX5-UZJ^4cuyyjkjw6J)k@7^duO<L|k0=)hV#5UM#mc z%z-%>lQCQ`C*{TJUX`y==3Cgye)1btV@15JFH-*mQ-7;kow63;|FNDHZKl6zvuYDY z7)%pv21<(trAfx8G3rf9pHEr5+_5R;Sx9M_O4+={S~+Q;xkni<Ol(z<}#A$d6GV zT=^-8qP3h$p@?G$vdR=7zK2fOUeW=9A2EfDIJ!wT44rIPIsv(^lXBl{uld$w2B^yD z{^!+r>f9JlovNBUSI3h?-u>?XJqFWLiH=-;!C?9>KVeGZG?&=B66b-xwTfK&z{u&a hNwgpZ0lvY0Ww1D3FKGXkfQLd3ntGFL8ck!J`~&JX3oHNt literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/reporter_line.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/reporter_line.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90cd0e3a2aaf0af8f49081e8e8c0c5ae65fdb562 GIT binary patch literal 3972 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 SHH3%Sp^kvEVlO#M=Klb78Yc$; literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/sex.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/sex.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e160953083c243ecca38b4ea221c72dd19e6ef9 GIT binary patch literal 2107 zcmbVNOK&4Z5T2fg$M0mb3Cki7b3g(g)<)vSOYDXOvPv9C7DXCa>TOTA?eWgT+dWR= zD0@JOw5J@na3P#H@jLhzbLGTe;6zp1-q^{BZEJekRn^tiUwu{cq*f~%FycRcX1_Rw z@i+dNk0LC-fk!=ui5r|mMofG{aBW6rZ26X6Tag_*z7rSxLhSmkmf2A;F8L+BcA|1z z@himm&fo>^UK-pLmM92ExT197`c+;$G#aIU;1r`la<_f-WIK!mEX&`rjO}-aBFGw6 zzVTG0$$?;;btAEpWJ2~>Ao7jfFjjZP>+O^79Vz(KUXEm#EqMXO+7GG9`ckML$3jl_ z!qYGbFr@hac=S*bUc&GRH++*5-x4-AugPnpN4Ul9%c}3d<y-*Cxi<BM?F-@;K~lUX zyu{0wwqF8^vZ#Pf<=Wy^Ub{q_DoAS}tHZt(zN%&Q*M@EQD*({F+&UDeXAhJ(_0pb~ z4TQ&%FlLeW$zE%_0XMKf6_~Ry@omFn!K2n;%8UzRNH{qs+`KX|GvL%}OC&(U%<Y85 zB6p5iG#2pJQR9)2d6CjE2{TI3LW!t1H79wA(ja0=QTnIx@2{JmcYabrsty}4-t4jy zmP|U26BeWiXP<RMa;!S(NF*wNIUNlqs<Rt*J1We?qY(>Uu)cu3Q3MwJMXM`Wn9#Hf z9*<d;%1Ns$2JARYWs3tLK!c1>typA0hK#k;SWD=QK%6#56Iq9=t>XPPDCDdP05%tH zRN`TfQ7J|;FG!J%WwHbxLbr+A(a*U7z>$YQ{VTEn9MOQtdtd<&SwW=aeOPP3bXtSI zd8sGUm=1x!sGY`Rp4Bj(H<|{Kn5Tfigah9gxDElc1i3SYMu^9ov%C>m1qJL}f!FOr z-7M8dJ^<Yuf(jlvlS572pCe0^P%2Cl8uHwYprR=6PQyVIa3KGYP&%BCV1ZQn4e<Eg zdS#uPL*v{+{$H7|Y{1Iqj>f6bKKrZeEsVph-L1`MUcZTa^By01K-wjP?SuV2?{-+q z>#8NIr~5l?kEcm0mB+pPHt3uBFI>R;%Hz$D-?i_Hgab>xK5poPiME_dVc*h*qwlv4 zw$Q7#I;(%Nq<seER#2G){s8#8grLTIA`1p-A{vg|0D$DXI6Z_ZcV1#sx#7wkY9QqA zfu$<IWR$9;P8R5aTA-JkoOFB88mEa_taMD0PRyLDLtX1S1!j95B6ygU$~0ti8s-PE z`8IconwD_h$Do|^RoBm4(OAXqfLWw8FH;()d>rArO6kini)I>^Ql17Nwg4_&k$FXT z4k*?^%5xiQP`-m9AWw5EOfrd|9{D~_cuDyoDr&Qi6No6H^d?@o9M-tRI+G=sYVhce zS2S(1W|{ERVTO0bB-*0gsQJ!l0=Lut{ZHqur+KIKH0MlgF18+tc>6p5cN=s@C7N>f z34_i$`-Ulrg(b1VB<BBZJ)g`zYm1&;^tbUQQhjE^q9z-KQ<xF58#EV)S^RRE(yy@* QDeN;<vr5*jD*RT-f875S<^TWy literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/subject_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/subject_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1f3db82d4df7e04806a156bc323e6cb1d6dae3c GIT binary patch literal 5312 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 Z7fm2_t)kVndA+Vz@?U&Q(Cbi&d=CsnCXN6A literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py new file mode 100644 index 0000000000..111ac436fb --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py @@ -0,0 +1,77 @@ +import re +import warnings +from typing import Optional + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class Age(DataObject, JsonReadableInterface, LimsReadableInterface, + NwbReadableInterface): + """Age of animal (in days)""" + def __init__(self, age: int): + super().__init__(name="age_in_days", value=age) + + @classmethod + def from_json(cls, dict_repr: dict) -> "Age": + age = dict_repr["age"] + age = cls._age_code_to_days(age=age) + return cls(age=age) + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "Age": + query = f""" + SELECT a.name AS age + FROM behavior_sessions bs + JOIN donors d ON d.id = bs.donor_id + JOIN ages a ON a.id = d.age_id + WHERE bs.id = {behavior_session_id}; + """ + age = lims_db.fetchone(query, strict=True) + age = cls._age_code_to_days(age=age) + return cls(age=age) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "Age": + age = cls._age_code_to_days(age=nwbfile.subject.age) + return cls(age=age) + + @staticmethod + def to_iso8601(age: int): + if age is None: + return 'null' + return f'P{age}D' + + @staticmethod + def _age_code_to_days(age: str, warn=False) -> Optional[int]: + """Converts the age code into a numeric days representation + + Parameters + ---------- + age + age code, ie P123 + warn + Whether to output warning if parsing fails + """ + if not age.startswith('P'): + if warn: + warnings.warn('Could not parse numeric age from age code ' + '(age code does not start with "P")') + return None + + match = re.search(r'\d+', age) + + if match is None: + if warn: + warnings.warn('Could not parse numeric age from age code ' + '(no numeric values found in age code)') + return None + + start, end = match.span() + return int(age[start:end]) diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py new file mode 100644 index 0000000000..1d0a8a34c2 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py @@ -0,0 +1,47 @@ +from typing import List + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin, \ + OneOrMoreResultExpectedError + + +class DriverLine(DataObject, LimsReadableInterface, JsonReadableInterface, + NwbReadableInterface): + """the genotype name(s) of the driver line(s)""" + def __init__(self, driver_line: List[str]): + super().__init__(name="driver_line", value=driver_line) + + @classmethod + def from_json(cls, dict_repr: dict) -> "DriverLine": + return cls(driver_line=dict_repr['driver_line']) + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "DriverLine": + query = f""" + SELECT g.name AS driver_line + FROM behavior_sessions bs + JOIN donors d ON bs.donor_id=d.id + JOIN donors_genotypes dg ON dg.donor_id=d.id + JOIN genotypes g ON g.id=dg.genotype_id + JOIN genotype_types gt + ON gt.id=g.genotype_type_id AND gt.name = 'driver' + WHERE bs.id={behavior_session_id}; + """ + result = lims_db.fetchall(query) + if result is None or len(result) < 1: + raise OneOrMoreResultExpectedError( + f"Expected one or more, but received: '{result}' " + f"from query:\n'{query}'") + driver_line = sorted(result) + return cls(driver_line=driver_line) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "DriverLine": + driver_line = sorted(list(nwbfile.subject.driver_line)) + return cls(driver_line=driver_line) diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py new file mode 100644 index 0000000000..be9977fc24 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py @@ -0,0 +1,57 @@ +import warnings +from typing import Optional + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class FullGenotype(DataObject, LimsReadableInterface, JsonReadableInterface, + NwbReadableInterface): + """the name of the subject's genotype""" + def __init__(self, full_genotype: str): + super().__init__(name="full_genotype", value=full_genotype) + + @classmethod + def from_json(cls, dict_repr: dict) -> "FullGenotype": + return cls(full_genotype=dict_repr['full_genotype']) + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "FullGenotype": + query = f""" + SELECT d.full_genotype + FROM behavior_sessions bs + JOIN donors d ON d.id=bs.donor_id + WHERE bs.id= {behavior_session_id}; + """ + genotype = lims_db.fetchone(query, strict=True) + return cls(full_genotype=genotype) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "FullGenotype": + return cls(full_genotype=nwbfile.subject.genotype) + + def parse_cre_line(self, warn=False) -> Optional[str]: + """ + Parameters + ---------- + warn + Whether to output warning if parsing fails + + Returns + ---------- + cre_line + just the Cre line, e.g. Vip-IRES-Cre, or None if not possible to + parse + """ + full_genotype = self.value + if ';' not in full_genotype: + if warn: + warnings.warn('Unable to parse cre_line from full_genotype') + return None + return full_genotype.split(';')[0].replace('/wt', '') diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py new file mode 100644 index 0000000000..d29b9069df --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py @@ -0,0 +1,42 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class MouseId(DataObject, LimsReadableInterface, JsonReadableInterface, + NwbReadableInterface): + """the LabTracks ID""" + def __init__(self, mouse_id: int): + super().__init__(name="mouse_id", value=mouse_id) + + @classmethod + def from_json(cls, dict_repr: dict) -> "MouseId": + mouse_id = dict_repr['external_specimen_name'] + mouse_id = int(mouse_id) + return cls(mouse_id=mouse_id) + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "MouseId": + # TODO: Should this even be included? + # Found sometimes there were entries with NONE which is + # why they are filtered out; also many entries in the table + # match the donor_id, which is why used DISTINCT + query = f""" + SELECT DISTINCT(sp.external_specimen_name) + FROM behavior_sessions bs + JOIN donors d ON bs.donor_id=d.id + JOIN specimens sp ON sp.donor_id=d.id + WHERE bs.id={behavior_session_id} + AND sp.external_specimen_name IS NOT NULL; + """ + mouse_id = int(lims_db.fetchone(query, strict=True)) + return cls(mouse_id=mouse_id) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "MouseId": + return cls(mouse_id=int(nwbfile.subject.subject_id)) diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py new file mode 100644 index 0000000000..961c935de7 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py @@ -0,0 +1,113 @@ +import warnings +from typing import Optional, List, Union + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.internal.api import PostgresQueryMixin, \ + OneOrMoreResultExpectedError + + +class ReporterLine(DataObject, LimsReadableInterface, JsonReadableInterface, + NwbReadableInterface): + """the genotype name(s) of the reporter line(s)""" + def __init__(self, reporter_line: Optional[str]): + super().__init__(name="reporter_line", value=reporter_line) + + @classmethod + def from_json(cls, dict_repr: dict) -> "ReporterLine": + reporter_line = dict_repr['reporter_line'] + reporter_line = cls.parse(reporter_line=reporter_line, warn=True) + return cls(reporter_line=reporter_line) + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "ReporterLine": + query = f""" + SELECT g.name AS reporter_line + FROM behavior_sessions bs + JOIN donors d ON bs.donor_id=d.id + JOIN donors_genotypes dg ON dg.donor_id=d.id + JOIN genotypes g ON g.id=dg.genotype_id + JOIN genotype_types gt + ON gt.id=g.genotype_type_id AND gt.name = 'reporter' + WHERE bs.id={behavior_session_id}; + """ + result = lims_db.fetchall(query) + if result is None or len(result) < 1: + raise OneOrMoreResultExpectedError( + f"Expected one or more, but received: '{result}' " + f"from query:\n'{query}'") + reporter_line = cls.parse(reporter_line=result, warn=True) + return cls(reporter_line=reporter_line) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "ReporterLine": + return cls(reporter_line=nwbfile.subject.reporter_line) + + @staticmethod + def parse(reporter_line: Union[Optional[List[str]], str], + warn=False) -> Optional[str]: + """There can be multiple reporter lines, so it is returned from LIMS + as a list. But there shouldn't be more than 1 for behavior. This + tries to convert to str + + Parameters + ---------- + reporter_line + List of reporter line + warn + Whether to output warnings if parsing fails + + Returns + --------- + single reporter line, or None if not possible + """ + if reporter_line is None: + if warn: + warnings.warn('Error parsing reporter line. It is null.') + return None + + if len(reporter_line) == 0: + if warn: + warnings.warn('Error parsing reporter line. ' + 'The array is empty') + return None + + if isinstance(reporter_line, str): + return reporter_line + + if len(reporter_line) > 1: + if warn: + warnings.warn('More than 1 reporter line. Returning the first ' + 'one') + + return reporter_line[0] + + def parse_indicator(self, warn=False) -> Optional[str]: + """Parses indicator from reporter""" + reporter_line = self.value + reporter_substring_indicator_map = { + 'GCaMP6f': 'GCaMP6f', + 'GC6f': 'GCaMP6f', + 'GCaMP6s': 'GCaMP6s' + } + if reporter_line is None: + if warn: + warnings.warn( + 'Could not parse indicator from reporter because ' + 'there is no reporter') + return None + + for substr, indicator in reporter_substring_indicator_map.items(): + if substr in reporter_line: + return indicator + return 'GCaMP6f' + if warn: + warnings.warn( + 'Could not parse indicator from reporter because none' + 'of the expected substrings were found in the reporter') + return None diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py new file mode 100644 index 0000000000..aa81242fb8 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py @@ -0,0 +1,41 @@ +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + JsonWritableInterface +from allensdk.internal.api import PostgresQueryMixin + + +class Sex(DataObject, LimsReadableInterface, JsonReadableInterface, + NwbReadableInterface, JsonWritableInterface): + """sex of the animal (M/F)""" + def __init__(self, sex: str): + super().__init__(name="sex", value=sex) + + @classmethod + def from_json(cls, dict_repr: dict) -> "Sex": + return cls(sex=dict_repr["sex"]) + + def to_json(self) -> dict: + return {"sex": self.value} + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: PostgresQueryMixin) -> "Sex": + query = f""" + SELECT g.name AS sex + FROM behavior_sessions bs + JOIN donors d ON bs.donor_id = d.id + JOIN genders g ON g.id = d.gender_id + WHERE bs.id = {behavior_session_id}; + """ + sex = lims_db.fetchone(query, strict=True) + return cls(sex=sex) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "Sex": + return cls(sex=nwbfile.subject.sex) diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py b/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py new file mode 100644 index 0000000000..710a07ed44 --- /dev/null +++ b/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py @@ -0,0 +1,162 @@ +from typing import Optional, List + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + BehaviorSessionId +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + JsonWritableInterface, NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.age import \ + Age +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.driver_line import \ + DriverLine +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.full_genotype import \ + FullGenotype +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.mouse_id import \ + MouseId +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.reporter_line import \ + ReporterLine +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.sex import \ + Sex +from allensdk.brain_observatory.behavior.schemas import SubjectMetadataSchema +from allensdk.brain_observatory.nwb import load_pynwb_extension +from allensdk.internal.api import PostgresQueryMixin + + +class SubjectMetadata(DataObject, LimsReadableInterface, NwbReadableInterface, + NwbWritableInterface, JsonReadableInterface, + JsonWritableInterface): + """Subject metadata""" + + def __init__(self, + sex: Sex, + age: Age, + reporter_line: ReporterLine, + full_genotype: FullGenotype, + driver_line: DriverLine, + mouse_id: MouseId): + super().__init__(name='subject_metadata', value=self) + self._sex = sex + self._age = age + self._reporter_line = reporter_line + self._full_genotype = full_genotype + self._driver_line = driver_line + self._mouse_id = mouse_id + + @classmethod + def from_lims(cls, + behavior_session_id: BehaviorSessionId, + lims_db: PostgresQueryMixin) -> "SubjectMetadata": + sex = Sex.from_lims(behavior_session_id=behavior_session_id.value, + lims_db=lims_db) + age = Age.from_lims(behavior_session_id=behavior_session_id.value, + lims_db=lims_db) + reporter_line = ReporterLine.from_lims( + behavior_session_id=behavior_session_id.value, lims_db=lims_db) + full_genotype = FullGenotype.from_lims( + behavior_session_id=behavior_session_id.value, lims_db=lims_db) + driver_line = DriverLine.from_lims( + behavior_session_id=behavior_session_id.value, lims_db=lims_db) + mouse_id = MouseId.from_lims( + behavior_session_id=behavior_session_id.value, + lims_db=lims_db) + return cls( + sex=sex, + age=age, + full_genotype=full_genotype, + driver_line=driver_line, + mouse_id=mouse_id, + reporter_line=reporter_line + ) + + @classmethod + def from_json(cls, dict_repr: dict) -> "SubjectMetadata": + sex = Sex.from_json(dict_repr=dict_repr) + age = Age.from_json(dict_repr=dict_repr) + reporter_line = ReporterLine.from_json(dict_repr=dict_repr) + full_genotype = FullGenotype.from_json(dict_repr=dict_repr) + driver_line = DriverLine.from_json(dict_repr=dict_repr) + mouse_id = MouseId.from_json(dict_repr=dict_repr) + + return cls( + sex=sex, + age=age, + full_genotype=full_genotype, + driver_line=driver_line, + mouse_id=mouse_id, + reporter_line=reporter_line + ) + + def to_json(self) -> dict: + pass + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "SubjectMetadata": + mouse_id = MouseId.from_nwb(nwbfile=nwbfile) + sex = Sex.from_nwb(nwbfile=nwbfile) + age = Age.from_nwb(nwbfile=nwbfile) + reporter_line = ReporterLine.from_nwb(nwbfile=nwbfile) + driver_line = DriverLine.from_nwb(nwbfile=nwbfile) + genotype = FullGenotype.from_nwb(nwbfile=nwbfile) + + return cls( + mouse_id=mouse_id, + sex=sex, + age=age, + reporter_line=reporter_line, + driver_line=driver_line, + full_genotype=genotype + ) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + BehaviorSubject = load_pynwb_extension(SubjectMetadataSchema, + 'ndx-aibs-behavior-ophys') + nwb_subject = BehaviorSubject( + description="A visual behavior subject with a LabTracks ID", + age=Age.to_iso8601(age=self.age_in_days), + driver_line=self.driver_line, + genotype=self.full_genotype, + subject_id=str(self.mouse_id), + reporter_line=self.reporter_line, + sex=self.sex, + species='Mus musculus') + nwbfile.subject = nwb_subject + return nwbfile + + @property + def sex(self) -> str: + return self._sex.value + + @property + def age_in_days(self) -> Optional[int]: + return self._age.value + + @property + def reporter_line(self) -> Optional[str]: + return self._reporter_line.value + + @property + def full_genotype(self) -> str: + return self._full_genotype.value + + @property + def cre_line(self) -> Optional[str]: + return self._full_genotype.parse_cre_line(warn=True) + + @property + def driver_line(self) -> List[str]: + return self._driver_line.value + + @property + def mouse_id(self) -> int: + return self._mouse_id.value diff --git a/brain_observatory/behavior/data_objects/motion_correction.py b/brain_observatory/behavior/data_objects/motion_correction.py new file mode 100644 index 0000000000..a6121aa491 --- /dev/null +++ b/brain_observatory/behavior/data_objects/motion_correction.py @@ -0,0 +1,71 @@ +import pandas as pd +from pynwb import NWBFile, TimeSeries + +from allensdk.brain_observatory.behavior.data_files\ + .rigid_motion_transform_file import \ + RigidMotionTransformFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + DataFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface + + +class MotionCorrection(DataObject, DataFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + """motion correction output""" + def __init__(self, motion_correction: pd.DataFrame): + """ + :param motion_correction + Columns: + x: float + y: float + """ + super().__init__(name='motion_correction', value=motion_correction) + + @classmethod + def from_data_file( + cls, rigid_motion_transform_file: RigidMotionTransformFile) \ + -> "MotionCorrection": + df = rigid_motion_transform_file.data + return cls(motion_correction=df) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "MotionCorrection": + ophys_module = nwbfile.processing['ophys'] + + motion_correction_data = { + 'x': ophys_module.get_data_interface( + 'ophys_motion_correction_x').data[:], + 'y': ophys_module.get_data_interface( + 'ophys_motion_correction_y').data[:] + } + + df = pd.DataFrame(motion_correction_data) + return cls(motion_correction=df) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + ophys_module = nwbfile.processing['ophys'] + ophys_timestamps = ophys_module.get_data_interface( + 'dff').roi_response_series['traces'].timestamps + + t1 = TimeSeries( + name='ophys_motion_correction_x', + data=self.value['x'].values, + timestamps=ophys_timestamps, + unit='pixels' + ) + + t2 = TimeSeries( + name='ophys_motion_correction_y', + data=self.value['y'].values, + timestamps=ophys_timestamps, + unit='pixels' + ) + + ophys_module.add_data_interface(t1) + ophys_module.add_data_interface(t2) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/projections.py b/brain_observatory/behavior/data_objects/projections.py new file mode 100644 index 0000000000..97ae9536cb --- /dev/null +++ b/brain_observatory/behavior/data_objects/projections.py @@ -0,0 +1,128 @@ +from matplotlib import image as mpimg +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, NwbReadableInterface, \ + LimsReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.image_api import ImageApi, Image +from allensdk.brain_observatory.nwb.nwb_utils import get_image, \ + add_image_to_nwb +from allensdk.internal.api import PostgresQueryMixin +from allensdk.internal.core.lims_utilities import safe_system_path + + +class Projections(DataObject, LimsReadableInterface, JsonReadableInterface, + NwbReadableInterface, NwbWritableInterface): + def __init__(self, max_projection: Image, avg_projection: Image): + super().__init__(name='projections', value=self) + self._max_projection = max_projection + self._avg_projection = avg_projection + + @property + def max_projection(self) -> Image: + return self._max_projection + + @property + def avg_projection(self) -> Image: + return self._avg_projection + + @classmethod + def from_lims(cls, ophys_experiment_id: int, + lims_db: PostgresQueryMixin) -> "Projections": + def _get_filepaths(): + query = """ + SELECT + wkf.storage_directory || wkf.filename AS filepath, + wkft.name as wkfn + FROM ophys_experiments oe + JOIN ophys_cell_segmentation_runs ocsr + ON ocsr.ophys_experiment_id = oe.id + JOIN well_known_files wkf ON wkf.attachable_id = ocsr.id + JOIN well_known_file_types wkft + ON wkft.id = wkf.well_known_file_type_id + WHERE ocsr.current = 't' + AND wkf.attachable_type = 'OphysCellSegmentationRun' + AND wkft.name IN ('OphysMaxIntImage', + 'OphysAverageIntensityProjectionImage') + AND oe.id = {}; + """.format(ophys_experiment_id) + res = lims_db.select(query=query) + res['filepath'] = res['filepath'].apply(safe_system_path) + return res + + def _get_pixel_size(): + query = """ + SELECT sc.resolution + FROM ophys_experiments oe + JOIN scans sc ON sc.image_id=oe.ophys_primary_image_id + WHERE oe.id = {}; + """.format(ophys_experiment_id) + return lims_db.fetchone(query, strict=True) + + res = _get_filepaths() + pixel_size = _get_pixel_size() + + max_projection_filepath = \ + res[res['wkfn'] == 'OphysMaxIntImage'].iloc[0]['filepath'] + max_projection = cls._from_filepath(filepath=max_projection_filepath, + pixel_size=pixel_size) + + avg_projection_filepath = \ + (res[res['wkfn'] == 'OphysAverageIntensityProjectionImage'].iloc[0] + ['filepath']) + avg_projection = cls._from_filepath(filepath=avg_projection_filepath, + pixel_size=pixel_size) + return Projections(max_projection=max_projection, + avg_projection=avg_projection) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "Projections": + max_projection = get_image(nwbfile=nwbfile, name='max_projection', + module='ophys') + avg_projection = get_image(nwbfile=nwbfile, name='average_image', + module='ophys') + return Projections(max_projection=max_projection, + avg_projection=avg_projection) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + add_image_to_nwb(nwbfile=nwbfile, + image_data=self._max_projection, + image_name='max_projection') + add_image_to_nwb(nwbfile=nwbfile, + image_data=self._avg_projection, + image_name='average_image') + + return nwbfile + + @classmethod + def from_json(cls, dict_repr: dict) -> "Projections": + max_projection_filepath = dict_repr['max_projection_file'] + avg_projection_filepath = \ + dict_repr['average_intensity_projection_image_file'] + pixel_size = dict_repr['surface_2p_pixel_size_um'] + + max_projection = cls._from_filepath(filepath=max_projection_filepath, + pixel_size=pixel_size) + avg_projection = cls._from_filepath(filepath=avg_projection_filepath, + pixel_size=pixel_size) + return Projections(max_projection=max_projection, + avg_projection=avg_projection) + + @staticmethod + def _from_filepath(filepath: str, pixel_size: float) -> Image: + """ + :param filepath + path to image + :param pixel_size + pixel size in um + """ + img = mpimg.imread(filepath) + img = ImageApi.serialize(img, [pixel_size / 1000., + pixel_size / 1000.], 'mm') + img = ImageApi.deserialize(img=img) + return img diff --git a/brain_observatory/behavior/data_objects/rewards.py b/brain_observatory/behavior/data_objects/rewards.py new file mode 100644 index 0000000000..c117b94cde --- /dev/null +++ b/brain_observatory/behavior/data_objects/rewards.py @@ -0,0 +1,92 @@ +from typing import Optional + +import pandas as pd +from pynwb import NWBFile, TimeSeries, ProcessingModule + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + StimulusFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface + + +class Rewards(DataObject, StimulusFileReadableInterface, NwbReadableInterface, + NwbWritableInterface): + def __init__(self, rewards: pd.DataFrame): + super().__init__(name='rewards', value=rewards) + + @classmethod + def from_stimulus_file( + cls, stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps) -> "Rewards": + """Get reward data from pkl file, based on timestamps + (not sync file). + """ + data = stimulus_file.data + + trial_df = pd.DataFrame(data["items"]["behavior"]["trial_log"]) + rewards_dict = {"volume": [], "timestamps": [], "autorewarded": []} + for idx, trial in trial_df.iterrows(): + rewards = trial["rewards"] + # as i write this there can only ever be one reward per trial + if rewards: + rewards_dict["volume"].append(rewards[0][0]) + rewards_dict["timestamps"].append( + stimulus_timestamps.value[rewards[0][2]]) + auto_rwrd = trial["trial_params"]["auto_reward"] + rewards_dict["autorewarded"].append(auto_rwrd) + + df = pd.DataFrame(rewards_dict) + return cls(rewards=df) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> Optional["Rewards"]: + if 'rewards' in nwbfile.processing: + rewards = nwbfile.processing['rewards'] + time = rewards.get_data_interface('autorewarded').timestamps[:] + autorewarded = rewards.get_data_interface('autorewarded').data[:] + volume = rewards.get_data_interface('volume').data[:] + else: + volume = [] + time = [] + autorewarded = [] + + df = pd.DataFrame({ + 'volume': volume, + 'timestamps': time, + 'autorewarded': autorewarded}) + return cls(rewards=df) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + + # If there is no rewards data, do not + # write anything to the NWB file (this + # is expected for passive sessions) + if len(self.value['timestamps']) == 0: + return nwbfile + + reward_volume_ts = TimeSeries( + name='volume', + data=self.value['volume'].values, + timestamps=self.value['timestamps'].values, + unit='mL' + ) + + autorewarded_ts = TimeSeries( + name='autorewarded', + data=self.value['autorewarded'].values, + timestamps=reward_volume_ts.timestamps, + unit='mL' + ) + + rewards_mod = ProcessingModule('rewards', + 'Licking behavior processing module') + rewards_mod.add_data_interface(reward_volume_ts) + rewards_mod.add_data_interface(autorewarded_ts) + nwbfile.add_processing_module(rewards_mod) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/running_speed/__init__.py b/brain_observatory/behavior/data_objects/running_speed/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6268a64b0428d82ecbb3f09b235a01ad5903514 GIT binary patch literal 230 zcmYL@zls7e5XK`|9D)yGp(*U-I8LuUt`WOHm}~|&x=unSu59TO_z+h2O4s@bc2+lA zh#!2v8Rj3e8jnXxbhw_OkGCFA4J7##^HAW`T1^H&zbg0T7ao_dh1oD>Hc*3~IXD4z zW=T**@-R0@Et{B-xDv)xcWl0cGaL#|6I6THqU<(}O!&Qa83Nhp<YEgY=1x1Tp$#!> o4+W&N!>X{(N1{Mm%L&nIYXgO1?JRYFZ|{fbj}3nGkKV=VAFql<y8r+H literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5110a4be0cff6d9077e751e476bd0d54509c992d GIT binary patch literal 5922 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54070fe5ce704fe8dc406422821a6158c3618c15 GIT binary patch literal 13457 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 F{{sn<Ggtrs literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_speed.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_speed.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe52b97bdc3313ca10cb75758ec55a0b768a46c6 GIT binary patch literal 4806 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py b/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py new file mode 100644 index 0000000000..2f640e1586 --- /dev/null +++ b/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py @@ -0,0 +1,209 @@ + +import json +from typing import Optional + +from cachetools import cached, LRUCache +from cachetools.keys import hashkey + +import pandas as pd + +from pynwb import NWBFile, ProcessingModule +from pynwb.base import TimeSeries + +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + LimsReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + JsonWritableInterface, NwbWritableInterface +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_objects import ( + DataObject, StimulusTimestamps +) +from allensdk.brain_observatory.behavior.data_files import ( + StimulusFile +) +from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 + get_running_df +) + + +def from_json_cache_key( + cls, dict_repr: dict +): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key( + cls, db, + behavior_session_id: int, ophys_experiment_id: Optional[int] = None +): + return hashkey( + behavior_session_id, ophys_experiment_id + ) + + +class RunningAcquisition(DataObject, LimsReadableInterface, + NwbReadableInterface, NwbWritableInterface, + JsonWritableInterface): + """A DataObject which contains properties and methods to load, process, + and represent running acquisition data. + + Running aquisition data is represented as: + + Pandas Dataframe with an index of timestamps and the following columns: + "dx": Angular change, computed during data collection + "v_sig": Voltage signal from the encoder + "v_in": The theoretical maximum voltage that the encoder + will reach prior to "wrapping". This should + theoretically be 5V (after crossing 5V goes to 0V, or + vice versa). In practice the encoder does not always + reach this value before wrapping, which can cause + transient spikes in speed at the voltage "wraps". + """ + + def __init__( + self, + running_acquisition: pd.DataFrame, + stimulus_file: Optional[StimulusFile] = None, + stimulus_timestamps: Optional[StimulusTimestamps] = None, + ): + super().__init__(name="running_acquisition", value=running_acquisition) + self._stimulus_file = stimulus_file + self._stimulus_timestamps = stimulus_timestamps + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) + def from_json( + cls, + dict_repr: dict, + ) -> "RunningAcquisition": + stimulus_file = StimulusFile.from_json(dict_repr) + stimulus_timestamps = StimulusTimestamps.from_json(dict_repr) + running_acq_df = get_running_df( + data=stimulus_file.data, time=stimulus_timestamps.value, + ) + running_acq_df.drop("speed", axis=1, inplace=True) + + return cls( + running_acquisition=running_acq_df, + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + ) + + def to_json(self) -> dict: + """[summary] + + Returns + ------- + dict + [description] + + Raises + ------ + RuntimeError + [description] + """ + if self._stimulus_file is None or self._stimulus_timestamps is None: + raise RuntimeError( + "RunningAcquisition DataObject lacks information about the " + "StimulusFile or StimulusTimestamps. This is likely due to " + "instantiating from NWB which prevents to_json() functionality" + ) + output_dict = dict() + output_dict.update(self._stimulus_file.to_json()) + output_dict.update(self._stimulus_timestamps.to_json()) + return output_dict + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_lims( + cls, + db: PostgresQueryMixin, + behavior_session_id: int, + ophys_experiment_id: Optional[int] = None, + ) -> "RunningAcquisition": + + stimulus_file = StimulusFile.from_lims(db, behavior_session_id) + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file + ) + running_acq_df = get_running_df( + data=stimulus_file.data, time=stimulus_timestamps.value, + ) + running_acq_df.drop("speed", axis=1, inplace=True) + + return cls( + running_acquisition=running_acq_df, + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + ) + + @classmethod + def from_nwb( + cls, + nwbfile: NWBFile + ) -> "RunningAcquisition": + running_module = nwbfile.modules['running'] + dx_interface = running_module.get_data_interface('dx') + + dx = dx_interface.data + v_in = nwbfile.get_acquisition('v_in').data + v_sig = nwbfile.get_acquisition('v_sig').data + timestamps = dx_interface.timestamps[:] + + running_acq_df = pd.DataFrame( + { + 'dx': dx, + 'v_in': v_in, + 'v_sig': v_sig + }, + index=pd.Index(timestamps, name='timestamps') + ) + return cls(running_acquisition=running_acq_df) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + running_acquisition_df: pd.DataFrame = self.value + + running_dx_series = TimeSeries( + name='dx', + data=running_acquisition_df['dx'].values, + timestamps=running_acquisition_df.index.values, + unit='cm', + description=( + 'Running wheel angular change, computed during data collection' + ) + ) + v_sig = TimeSeries( + name='v_sig', + data=running_acquisition_df['v_sig'].values, + timestamps=running_acquisition_df.index.values, + unit='V', + description='Voltage signal from the running wheel encoder' + ) + v_in = TimeSeries( + name='v_in', + data=running_acquisition_df['v_in'].values, + timestamps=running_acquisition_df.index.values, + unit='V', + description=( + 'The theoretical maximum voltage that the running wheel ' + 'encoder will reach prior to "wrapping". This should ' + 'theoretically be 5V (after crossing 5V goes to 0V, or ' + 'vice versa). In practice the encoder does not always ' + 'reach this value before wrapping, which can cause ' + 'transient spikes in speed at the voltage "wraps".') + ) + + if 'running' in nwbfile.processing: + running_mod = nwbfile.processing['running'] + else: + running_mod = ProcessingModule('running', + 'Running speed processing module') + nwbfile.add_processing_module(running_mod) + + running_mod.add_data_interface(running_dx_series) + nwbfile.add_acquisition(v_sig) + nwbfile.add_acquisition(v_in) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/running_speed/running_processing.py b/brain_observatory/behavior/data_objects/running_speed/running_processing.py new file mode 100644 index 0000000000..7222cb7d10 --- /dev/null +++ b/brain_observatory/behavior/data_objects/running_speed/running_processing.py @@ -0,0 +1,407 @@ +import scipy.signal as signal +from scipy.stats import zscore +import numpy as np +import pandas as pd +import warnings +from typing import Iterable, Union, Optional + + +def calc_deriv(x, time): + dx = np.diff(x, prepend=np.nan) + dt = np.diff(time, prepend=np.nan) + return dx / dt + + +def _angular_change(summed_voltage: np.ndarray, + vmax: Union[np.ndarray, float]) -> np.ndarray: + """ + Compute the change in degrees in radians at each point from the + summed voltage encoder data. + + Parameters + ---------- + summed_voltage: 1d np.ndarray + The "unwrapped" voltage signal from the encoder, cumulatively + summed. See `_unwrap_voltage_signal`. + vmax: 1d np.ndarray or float + Either a constant float, or a 1d array (typically constant) + of values. These values represent the theoretical max voltage + value of the encoder. If an array, needs to be the same length + as the summed_voltage array. + Returns + ------- + np.ndarray + 1d array of change in degrees in radians from each point + """ + delta_theta = np.diff(summed_voltage, prepend=np.nan) / vmax * 2 * np.pi + return delta_theta + + +def _shift( + arr: Iterable, + periods: int = 1, + fill_value: float = np.nan) -> np.ndarray: + """ + Shift index of an iterable (array-like) by desired number of + periods with an optional fill value (default = NaN). + + Parameters + ---------- + arr: Iterable (array-like) + Iterable containing numeric data. If int, will be converted to + float in returned object. + periods: int (default=1) + The number of elements to shift. + fill_value: float (default=np.nan) + The value to fill at the beginning of the shifted array + Returns + ------- + np.ndarray (1d) + Copy of input object as a 1d array, shifted. + """ + if periods <= 0: + raise ValueError("Can only shift for periods > 0.") + if fill_value is None: + fill_value = np.nan + if isinstance(fill_value, float): + # Circumvent issue if int-like array with np.nan as fill + shifted = np.roll(arr, periods).astype(float) + else: + shifted = np.roll(arr, periods) + shifted[:periods] = fill_value + return shifted + + +def deg_to_dist(angular_speed: np.ndarray) -> np.ndarray: + """ + Takes the angular speed (radians/s) at each step in radians, and + computes the linear speed in cm/s. + + Parameters + ---------- + angular_speed: np.ndarray (1d) + 1d array of angular speed in radians/s + Returns + ------- + np.ndarray (1d) + Linear speed in cm/s at each time point. + """ + wheel_diameter = 6.5 * 2.54 # 6.5" wheel diameter, 2.54 = cm/in + running_radius = 0.5 * ( + # assume the animal runs at 2/3 the distance from the wheel center + 2.0 * wheel_diameter / 3.0) + running_speed_cm_per_sec = angular_speed * running_radius + return running_speed_cm_per_sec + + +def _identify_wraps(vsig: Iterable, *, + min_threshold: float = 1.5, + max_threshold: float = 3.5): + """ + Identify "wraps" in the voltage signal. In practice, this is when + the encoder voltage signal crosses 5V and wraps to 0V, or + vice-versa. + + Argument defaults and implementation suggestion via @dougo + + Parameters + ---------- + vsig: Iterable (array-like) + 1d array-like iterable of voltage signal + min_threshold: float (default=1.5) + The min_threshold value that must be crossed to be considered + a possible wrapping point. + max_threshold: float (default=3.5) + The max threshold value that must be crossed to be considered + a possible wrapping point. + + Returns + ------- + Tuple + Tuple of ([indices of positive wraps], [indices of negative wraps]) + """ + # Compare against previous value + shifted_vsig = _shift(vsig) + if not isinstance(vsig, np.ndarray): + vsig = np.array(vsig) + # Suppress warnings for when comparing to nan values + with np.errstate(invalid='ignore'): + pos_wraps = np.asarray( + np.logical_and(vsig < min_threshold, shifted_vsig > max_threshold) + ).nonzero()[0] + neg_wraps = np.asarray( + np.logical_and(vsig > max_threshold, shifted_vsig < min_threshold) + ).nonzero()[0] + return pos_wraps, neg_wraps + + +def _local_boundaries(time, index, span: float = 0.25) -> tuple: + """ + Given a 1d array of monotonically increasing timestamps, and a + point in that array (`index`), compute the indices that form the + inclusive boundary around `index` for timespan `span`. + + Values in `time` must monotonically increase. Flat lines (same value + multiple times) are OK. The neighborhood may terminate around the + index if the `span` is too small for the sampling rate. A warning + will be raised in this case. + + Returns + ------- + Tuple + Tuple of corresponding to the start, end indices that bound + a time span of length `span` (maximally) + + E.g. + ``` + time = np.array([0, 1, 1.5, 2, 2.2, 2.5, 3, 3.5]) + _local_boundary(time, 3, 1.0) + >>> (1, 6) + ``` + """ + if np.diff(time[~np.isnan(time)]).min() < 0: + raise ValueError("Data do not monotonically increase. This probably " + "means there is an error in your time series.") + t_val = time[index] + max_val = t_val + abs(span) + min_val = t_val - abs(span) + eligible_indices = np.nonzero((time <= max_val) & (time >= min_val))[0] + max_ix = eligible_indices.max() + min_ix = eligible_indices.min() + if (min_ix == index) or (max_ix == index): + warnings.warn("Unable to find two data points around index " + f"for span={span} that do not include the index. " + "This could mean that your time span is too small for " + "the time data sampling rate, the data are not " + "monotonically increasing, or that you are trying " + "to find a neighborhood at the beginning/end of the " + "data stream.") + return min_ix, max_ix + + +def _clip_speed_wraps(speed, time, wrap_indices, t_span: float = 0.25): + """ + Correct for artifacts at the voltage 'wraps'. Sometimes there are + transient spikes in speed at the 'wrap' points. This doesn't make + sense since speed on a running wheel should be a smoothly varying + function. Take the neighborhood of values in +/- `t_span` seconds + around wrap points, and clip the value at the wrap point + such that it does not exceed the min/max values in the neighborhood. + """ + corrected_speed = speed.copy() + for wrap in wrap_indices: + start_ix, end_ix = _local_boundaries(time, wrap, t_span) + local_slice = np.concatenate( # Remove the wrap point + (speed[start_ix:wrap], speed[wrap+1:end_ix+1])) + corrected_speed[wrap] = np.clip( + speed[wrap], np.nanmin(local_slice), np.nanmax(local_slice)) + return corrected_speed + + +def _unwrap_voltage_signal( + vsig: Iterable, + pos_wrap_ix: Iterable, + neg_wrap_ix: Iterable, + *, + vmax: Optional[float] = None, + max_threshold: float = 5.1, + max_diff: float = 1.0) -> np.ndarray: + """ + Calculate the change in voltage at each timestamp. + 'Unwraps' the + voltage data coming from the encoder at the value `vmax`. If `vmax` + is a float, use that value to 'wrap'. If it is None, then compute + the maximum value from the observed voltage signal (`vsig`, as long + as the maximum value is under the value of `max_threshold` (to + account for possible outlier data/encoder errors). + The reason is because the rotary encoder should theoretically wrap + at 5V, but in practice does not always reach 5V before wrapping + back to 0V. If it is assumed that the encoder wraps at 5V, but + actually does not reach that voltage, then the computed running + speed can be transiently higher at the timestamps of the signal + 'wraps'. + + Parameters + ---------- + vsig: Iterable (array-like) + The raw voltage data from the rotary encoder + vmax: Optional[float] (default=None) + The value at which, upon passing this threshold, the voltage + "wraps" back to 0V on the encoder. + max_threshold: float (default=5.1) + The maximum threshold for the `vmax` value. Used only if + `vmax` is `None`. To account for the possibility of outlier + data/encoder errors, the computed `vmax` should not exceed + this value. + max_diff: float (default=1.0) + The maximum voltage difference allowed between two adjacent + points, after accounting for the voltage "wrap". Values + exceeding this threshold will be set to np.nan. + Returns + ------- + np.ndarray + 1d np.ndarray of the "unwrapped" signal from `vsig`. + """ + if not isinstance(vsig, np.ndarray): + vsig = np.array(vsig) + if vmax is None: + vmax = vsig[vsig < max_threshold].max() + unwrapped_diff = np.zeros(vsig.shape) + vsig_last = _shift(vsig) + if len(pos_wrap_ix): + # positive wraps: subtract from the previous value and add vmax + unwrapped_diff[pos_wrap_ix] = ( + (vsig[pos_wrap_ix] + vmax) - vsig_last[pos_wrap_ix]) + # negative: subtract vmax and the previous value + if len(neg_wrap_ix): + unwrapped_diff[neg_wrap_ix] = ( + vsig[neg_wrap_ix] - (vsig_last[neg_wrap_ix] + vmax)) + # Other indices, just compute straight diff from previous value + wrap_ix = np.concatenate((pos_wrap_ix, neg_wrap_ix)) + other_ix = np.array(list(set(range(len(vsig_last))).difference(wrap_ix))) + unwrapped_diff[other_ix] = vsig[other_ix] - vsig_last[other_ix] + # Correct for wrap artifacts based on allowed `max_diff` value + # (fill with nan) + # Suppress warnings when comparing with nan values to reduce noise + with np.errstate(invalid='ignore'): + unwrapped_diff = np.where( + np.abs(unwrapped_diff) <= max_diff, unwrapped_diff, np.nan) + # Get nan indices to propogate to the cumulative sum (otherwise + # treated as 0) + unwrapped_nans = np.array(np.isnan(unwrapped_diff)).nonzero() + summed_diff = np.nancumsum(unwrapped_diff) + vsig[0] # Add the baseline + summed_diff[unwrapped_nans] = np.nan + return summed_diff + + +def _zscore_threshold_1d(data: np.ndarray, + threshold: float = 5.0) -> np.ndarray: + """ + Replace values in 1d array `data` that exceed `threshold` number + of SDs from the mean with NaN. + Parameters + --------- + data: np.ndarray + 1d np array of values + threshold: float (default=5.0) + Z-score threshold to replace with NaN. + Returns + ------- + np.ndarray (1d) + A copy of `data` with values exceeding `threshold` SDs from + the mean replaced with NaN. + """ + corrected_data = data.copy().astype("float") + scores = zscore(data, nan_policy="omit") + # Suppress warnings when comparing to nan values to reduce noise + with np.errstate(invalid='ignore'): + corrected_data[np.abs(scores) > threshold] = np.nan + return corrected_data + + +def get_running_df( + data, time: np.ndarray, lowpass: bool = True, zscore_threshold=10.0 +): + """ + Given the data from the behavior 'pkl' file object and a 1d + array of timestamps, compute the running speed. Returns a + dataframe with the raw voltage data as well as the computed speed + at each timestamp. By default, the running speed is filtered with + a 10 Hz Butterworth lowpass filter to remove artifacts caused by + the rotary encoder. + + Parameters + ---------- + data + Deserialized 'behavior pkl' file data + time: np.ndarray (1d) + Timestamps for running data measurements + lowpass: bool (default=True) + Whether to apply a 10Hz low-pass filter to the running speed + data. + zscore_threshold: float + The threshold to use for removing outlier running speeds which might + be noise and not true signal. + + Returns + ------- + pd.DataFrame + Dataframe with an index of timestamps and the following + columns: + "speed": computed running speed + "dx": angular change, computed during data collection + "v_sig": voltage signal from the encoder + "v_in": the theoretical maximum voltage that the encoder + will reach prior to "wrapping". This should + theoretically be 5V (after crossing 5V goes to 0V, or + vice versa). In practice the encoder does not always + reach this value before wrapping, which can cause + transient spikes in speed at the voltage "wraps". + The raw data are provided so that the user may compute their + own speed from source, if desired. + + Notes + ----- + Though the angular change is available in the raw data + (key="dx"), this method recomputes the angular change from the + voltage signal (key="vsig") due to very specific, low-level + artifacts in the data caused by the encoder. See method + docstrings for more detailed information. The raw data is + included in the final output in case the end user wants to apply + their own corrections and compute running speed from the raw + source. + """ + v_sig = data["items"]["behavior"]["encoders"][0]["vsig"] + v_in = data["items"]["behavior"]["encoders"][0]["vin"] + + if len(v_in) > len(time) + 1: + error_string = ("length of v_in ({}) cannot be longer than length of " + "time ({}) + 1, they are off by {}").format( + len(v_in), + len(time), + abs(len(v_in) - len(time)) + ) + raise ValueError(error_string) + if len(v_in) == len(time) + 1: + warnings.warn( + "Time array is 1 value shorter than encoder array. Last encoder " + "value removed\n", UserWarning, stacklevel=1) + v_in = v_in[:-1] + v_sig = v_sig[:-1] + + # dx = 'd_theta' = angular change + # There are some issues with angular change in the raw data so we + # recompute this value + dx_raw = data["items"]["behavior"]["encoders"][0]["dx"] + # Identify "wraps" in the voltage signal that need to be unwrapped + # This is where the encoder switches from 0V to 5V or vice versa + pos_wraps, neg_wraps = _identify_wraps( + v_sig, min_threshold=1.5, max_threshold=3.5) + # Unwrap the voltage signal and apply correction for transient spikes + unwrapped_vsig = _unwrap_voltage_signal( + v_sig, pos_wraps, neg_wraps, max_threshold=5.1, max_diff=1.0) + angular_change_point = _angular_change(unwrapped_vsig, v_in) + angular_change = np.nancumsum(angular_change_point) + # Add the nans back in (get turned to 0 in nancumsum) + angular_change[np.isnan(angular_change_point)] = np.nan + angular_speed = calc_deriv(angular_change, time) # speed in radians/s + linear_speed = deg_to_dist(angular_speed) + # Artifact correction to speed data + wrap_corrected_linear_speed = _clip_speed_wraps( + linear_speed, time, np.concatenate([pos_wraps, neg_wraps]), + t_span=0.25) + outlier_corrected_linear_speed = _zscore_threshold_1d( + wrap_corrected_linear_speed, threshold=zscore_threshold) + + # Final filtering (optional) for smoothing out the speed data + if lowpass: + b, a = signal.butter(3, Wn=4, fs=60, btype="lowpass") + outlier_corrected_linear_speed = signal.filtfilt( + b, a, np.nan_to_num(outlier_corrected_linear_speed)) + + return pd.DataFrame({ + 'speed': outlier_corrected_linear_speed[:len(time)], + 'dx': dx_raw[:len(time)], + 'v_sig': v_sig[:len(time)], + 'v_in': v_in[:len(time)], + }, index=pd.Index(time, name='timestamps')) diff --git a/brain_observatory/behavior/data_objects/running_speed/running_speed.py b/brain_observatory/behavior/data_objects/running_speed/running_speed.py new file mode 100644 index 0000000000..694d5f49f5 --- /dev/null +++ b/brain_observatory/behavior/data_objects/running_speed/running_speed.py @@ -0,0 +1,176 @@ +from typing import Optional + +import pandas as pd + +from pynwb import NWBFile, ProcessingModule +from pynwb.base import TimeSeries + +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + JsonWritableInterface, NwbWritableInterface +from allensdk.core.exceptions import DataFrameIndexError +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_objects import ( + DataObject, StimulusTimestamps +) +from allensdk.brain_observatory.behavior.data_files import ( + StimulusFile +) +from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 + get_running_df +) + + +class RunningSpeed(DataObject, LimsReadableInterface, NwbReadableInterface, + NwbWritableInterface, JsonReadableInterface, + JsonWritableInterface): + """A DataObject which contains properties and methods to load, process, + and represent running speed data. + + Running speed data is represented as: + + Pandas Dataframe with the following columns: + "timestamps": Timestamps (in s) for calculated speed values + "speed": Computed running speed in cm/s + """ + + def __init__( + self, + running_speed: pd.DataFrame, + stimulus_file: Optional[StimulusFile] = None, + stimulus_timestamps: Optional[StimulusTimestamps] = None, + filtered: bool = True + ): + super().__init__(name='running_speed', value=running_speed) + self._stimulus_file = stimulus_file + self._stimulus_timestamps = stimulus_timestamps + self._filtered = filtered + + @staticmethod + def _get_running_speed_df( + stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps, + filtered: bool = True, + zscore_threshold: float = 1.0 + ) -> pd.DataFrame: + running_data_df = get_running_df( + data=stimulus_file.data, time=stimulus_timestamps.value, + lowpass=filtered, zscore_threshold=zscore_threshold + ) + if running_data_df.index.name != "timestamps": + raise DataFrameIndexError( + f"Expected running_data_df index to be named 'timestamps' " + f"But instead got: '{running_data_df.index.name}'" + ) + running_speed = pd.DataFrame({ + "timestamps": running_data_df.index.values, + "speed": running_data_df.speed.values + }) + return running_speed + + @classmethod + def from_json( + cls, + dict_repr: dict, + filtered: bool = True, + zscore_threshold: float = 10.0 + ) -> "RunningSpeed": + stimulus_file = StimulusFile.from_json(dict_repr) + stimulus_timestamps = StimulusTimestamps.from_json(dict_repr) + + running_speed = cls._get_running_speed_df( + stimulus_file, stimulus_timestamps, filtered, zscore_threshold + ) + return cls( + running_speed=running_speed, + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + filtered=filtered) + + def to_json(self) -> dict: + if self._stimulus_file is None or self._stimulus_timestamps is None: + raise RuntimeError( + "RunningSpeed DataObject lacks information about the " + "StimulusFile or StimulusTimestamps. This is likely due to " + "instantiating from NWB which prevents to_json() functionality" + ) + output_dict = dict() + output_dict.update(self._stimulus_file.to_json()) + output_dict.update(self._stimulus_timestamps.to_json()) + return output_dict + + @classmethod + def from_lims( + cls, + db: PostgresQueryMixin, + behavior_session_id: int, + filtered: bool = True, + zscore_threshold: float = 10.0, + stimulus_timestamps: Optional[StimulusTimestamps] = None + ) -> "RunningSpeed": + stimulus_file = StimulusFile.from_lims(db, behavior_session_id) + if stimulus_timestamps is None: + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file + ) + + running_speed = cls._get_running_speed_df( + stimulus_file, stimulus_timestamps, filtered, zscore_threshold + ) + return cls( + running_speed=running_speed, + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + filtered=filtered + ) + + @classmethod + def from_nwb( + cls, + nwbfile: NWBFile, + filtered=True + ) -> "RunningSpeed": + running_module = nwbfile.modules['running'] + interface_name = 'speed' if filtered else 'speed_unfiltered' + running_interface = running_module.get_data_interface(interface_name) + + timestamps = running_interface.timestamps[:] + values = running_interface.data[:] + + running_speed = pd.DataFrame( + { + "timestamps": timestamps, + "speed": values + } + ) + return cls(running_speed=running_speed, filtered=filtered) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + running_speed: pd.DataFrame = self.value + data = running_speed['speed'].values + timestamps = running_speed['timestamps'].values + + if self._filtered: + data_interface_name = "speed" + else: + data_interface_name = "speed_unfiltered" + + running_speed_series = TimeSeries( + name=data_interface_name, + data=data, + timestamps=timestamps, + unit='cm/s') + + if 'running' in nwbfile.processing: + running_mod = nwbfile.processing['running'] + else: + running_mod = ProcessingModule('running', + 'Running speed processing module') + nwbfile.add_processing_module(running_mod) + + running_mod.add_data_interface(running_speed_series) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/stimuli/__init__.py b/brain_observatory/behavior/data_objects/stimuli/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22598fe538fa8c718e0a187e7667835684936cda GIT binary patch literal 224 zcmYL@y$ZrG5XVz+5Wxp=uo>J$#E(^6#4QjmO|Y?TQgUgfqodE^<SV)Q2yRYZ2k{U8 z-yQeGZN}pfBUSe+^zqf>r-YIf83zQ-4s4R_A1w6cKR&nZTpZB^6p({X6<ok|V(lRF zPQy$X*P`&XahMT(op&g9RtdDxOl!yrI2qb4OPbIHR{^Y(UeU!Cq7NNcCWqGgz%@jm i&e>!UIYwJGrR7puXQPy9-93kk%Il^y%l^eTnSBBLUPDU& literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/presentations.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/presentations.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62a41c3eb892a96fd908271f368d6340d18e4eec GIT binary patch literal 7122 zcmbVROLH98b?(=^9~cZ?1Vzbhl`AA{YN#-doKTEx+7eYtDUfZ_W>p(byD|69OoROx z-P=PDsGdavR(X+vE4wUArGTU=t}OEdvdBNkDvMsm3zxG^RTf$KJGW<gW+2IyJ*d8Y z`##QnoO8bO-HUIxT6GP-@Sp$2i@&02zod`(uY%0C@W_8b!ZfA_TBtjEXgG#W-$r0M z7T#u13d>Gem03Y0tU6VdF9o%*?$pDE(@@{#pc%HDR@iph>bnxGg&n7(^3`BH>^j|W z!`TQoolR9%3%0^-XFJ?+cGP!0xEAg@ySnzi#u}{oLSs!{=PlmmowKrYof(g`z1FWW zS8dP8svnILKaRX0vp)1?vcIQimHj8*e&`1r+2*6f4=2Gys&6B!zw0I5M~6qepJd&6 z-D5xGGV#K(guGYhrPSm5++*Hhz(0r*E(TtoXPf)Sho36NKve!j_{mD^Ju|yL<cTY1 zlW@m^OCBX2%~)nzD|I1HFj(ScYrb^*BQF|qmp?;mOzNwB!M%ikwjdYMx$DyupJ5x; zNNPV0CSl}8UP!x8#^fH1{XT8k{6|WspZq5zTyu1$IR?`mlUqk6X1vsYstt5zGV4Xt zDf0@iu+mF|m09J5<y3hM-<m3^vf2ylOn2(M#<qEbH%U>uWHybL7HhKBixO(rP`g8t zc}L0byfoQ5>#DkS-euR8>NZff$+lG8#!od%b2g#y-K_Q9<=s2oo-4{;*;OpJwNlVG z)H*ed-WDDckK9C(XlL4y&h%7g#<?<ejAQPLF6yx97VTbE!k$hzK1*^k<|3=Q*lIs< zU1}kDFvy$hS<Q9(fhVQw{;T%?Kl{$TgC9sP<bgNxSntp~_M(%62a(s0Bj)|d0gs-^ zgLup%*+&|WM<?>&L;vtV`U!ty?Dd~|Lyo>dfEMiOokQXIksBXE;xjLa#mSvRKJuRV zvA9DfgBr4Ec_%kC|IW$=^u{M*8%x@yb*s(LPq$b0vbVIRN_2cUfazyt!IO!IitX#5 zdlk=jNX+ZHrls1EcA;NtQzO-nU^=_ng~^OdeQJ`~jEt$3SgCPTO06?vT1t(ygcfDA zFF*h9q>`4;^mnx%|JSsF8daB8o*KK_w3=3rs;oq&c5X~-&%dA6E^3z=+CDrmruAtf zsi%#LM$)|0&-7_CX{F6Got2(iVw|+o=F_qmr;VdE2E$}^QY%__lJ=#Z*3$ZY?c?zi zm}Xk}IZ)*jbJ|MQRlfC!k+#wrOuv0@PTSA#BHv|etaDDYe0{o>u3c<k?rUlLXmg;Y zYivC=S@)&!55~`QUHkZdo@l9lv6W&Re7#FwFs6;uzk9%#v^{$c0k%R2`xfH^m{Bxb zRKVqh*M}1W#r(ds2eGiZ*B{mG*^k`Z9>;KW+mA>jml8O#XD6}kMfOZ@wkK@@GzD3( zUD+!HIMw+qvN{RNG0$nuOBGyXbw7mhsr;{@Wi2ydhGgvCb6;lWC_X+l_wPJ-yr(-A zKN<%>#nao%=430`m=c>U&bJw`%@6W5-8}u?&3Q%7uJ6YQzh^JTv;`k<!J|HxHk>69 zao{p8`@&Z^PfMTA_fEn?jGu7nv{#{Z&lDRp^~O?9r=5eMbd%Wi7<&k$DESfN&z<eL z#8oJzMJL`+I{9uvGhFU%3xbZ!g5REG^|6RCQ3*vlUBX@EjS7k>T8K4jTA7WTl_!z^ z@dTbFW07!{m6?dgk%w7eA=p~UlgtdgF-AQZ^UQ?vqc9Op84ejlo>NPN7fBdKDB6(h z)X`BSlX1XhR&hPa{C?szv9=-_I9>W8g%m|{uOoKQTf9Od+KZ)A=*o-)n>miLBz!3& zkj`e&h7fTUTb6oKsdQ@8O7(Dd<e2yUf!|*QEM@jis~>PL;+PQ)=FrYiXQvEc!{%ls zS~v!r2eW0(J6p@BRxBqoMSLs>+w$Z(a#<NFhCkduUVa^kX4Q?3Ue(L^YZ`6cqSWZ> zZG96@*Jzdv)Eau-?CMpctZ$<BbaUCLWiJ<5z#&BvdK4VqLnc8iK_t=7bpWDqVE`=5 z!~{qf=Q>jJJ^`kMoW)82HZv(9Up^<8sDQO7b-*MSwz#}pnbitb@NmyiF(=y~vvA|k zPhd^1ic=DTRQM_j!fU5F5HXaJL%L|7NVJe-O&2;&X4Wg#QM6}eW<QX*Rg}@g8~d5T z23NPXI+ysD=p+@Xw3^toHa7BVSeZB7hwuf;sOYj$*wg}vvbDg+V#q%g9!Nn7?9(pO zkH#wFQ9FJ_0mwMYgO83-W26W+6lfCj!b(dNjxP0!(xoO2W+ezNdC8h49-{@mFUpGH zpqzT#*P?0yo^z)Et)5g7w)AN^EgjX4>IhP$i^ipP)J)6tX8KTv?u?68T0y`=$YPZ| z;IPIJVeY7n;M4SV);iZO*3hp7Ce&tY(0dgUn`mFdcZaQ?Thm(7NiinU+L`{;6#s`g zbn`L<sg1lGxy?`VnXRWawgsC4--1omk}mbbm>X<|U1PfxG+|lSpVt0f$2x0hN1=H$ zH81hTXy(yYvW@Vz!(Q3d&LD?Y$Znh)Y0a&{Mz5jAtFYo)vYY2%p|5$rz=prilLCBK zSeH$>*Q*zi=H3{wEG*i(r1GnkS9D!eQ?&ai3QiCRh=1gvLE1wfT-ZK5v6B%vbY5yJ z<SBYy9d%(@^`)uhV&y%1%zE!)+7B^PZolzHA%-UKnDEIy9>o|6_<{&7c(I(7rOTCm zxBMROAvWi;RaSgkMe=zOn+V1JZ`*)6zmL#*V&DDKH|<dFtq7v%nGZjU9%=^5kYHaS z42w7~UW1o7jTn$RJ8SeQkkgOeL;)Y+QO*nYtNmR2gpO3kzEd00?4qG`mD>Z3^yi-f zfct?L9y0Hp31s{)9_{q*DpD%9FZ`Qy-@6~gSgU*onY{DqTMvT3&M`}E(9IY@KR+4W zRNUd_f)k(s+aFDWpob|LaRf9}B!wboBhRWxp4Gu=1P}xPFDs2lp5)HD9Aiyh;0^>w z^o{x_;#Eu<KzR!<(3s4kIGkAlA0&IGQ=zvTM@~cd!%>1j1BxJCr*+={kVnI0WXA*h zCo0;JK3q2Vi7iL*Bw%(FC!`h}-E41w*ldSf4EfvkF-X~I<u>Y%Z9CJk3h@mH6n{p^ zmngB30N1}vc^Ye9kgCv*c+4Esug|y#d7A?B%osDL>`U4jB_b<%<8c6D@<TecyeC8~ zM3ZEGg%Xm5Wx;=D%gRb>f{5Kk3246x$#o(rv&FwjohfdJuTt_gB$?%d^*D9V%(uS& z0c}xM0y!CC+vUi^L5V_Q9$4z)ZOXqx$u}wa79}4daXP{~RvbamH|*pR*O;G&skG{| z=Q*`lFYHR`g({oNs<>*c-A^0i4=}Q%IcQzt1Bm>UE+T$a?-*6HYS3RtFXOw8k~+9T z8Qh?wzh)VF)7sYS;0>03U2p2A_V2R$$G@UsH0?jX2}VkBIoq0tYcf%Hjs~lNj)Gi4 zEokqFS}^@3j;YLiVNETBx}0d>R3&Z$vT=SQVxdkuCAf0Q`*)a60Vsdmvmg2a?C}n+ z5rk3`xHa7nEYRz2&z|3;0FvOefgSpa*)DtOZ1(m5CtcvMeJhIXh;za!9u?yef?^~_ z=NsC88y7M*%%u;v2&f_-fU~^?E`OII2FDy1Q+lKL6_S?$aM6&)TTzA021OTI$`z7S z)KSMLBaV<F=oF<^Et7bxjxY*^<{DBMb!GL1n9tN{QA>k72;&LPZ2%6^J00Heo&>(_ zOS_PY10S7kINcEtk-HDouOK(^w?}y7T_kk;Ry+ho0o9vRl;p?eITNAV7uFuu5%p0A zvsl~DaexpfEBnI;m^%ZVtjq~4q<Ej|z~$p{j-u814ydRi9->;oR#utK+iB#OJ0Sfz zH6Ae_EwbW0G{q`D$X~RWtIoMY!~iOHXGS?YTF8GxTS@#?)4R$;EqI&-FFbvFMa{is z7Q2WspCc73Rg-uExp2q7!Yiv43?REj-2!)J^fNl`;;>a1&&=re$~mBsKZ`%7gd~a| zQ}P+BR7m)bsFVc6+D4~Nm|_84POpFdYB0fKvN<}an;Qr)@f7Ir7CxYMB6bEDL~1Z& z0Aic!JIX-tZ4M03M1*-&YpE|XhLX1lk%g5$9>Ej`lc-O3lQ6<W64Qd6&b@)|BRnEQ zDEDv$0ZtUnZMTpzN9UgXpr~B%ChD{J0%Rbndp2By2;IV+5loNKn>Zk7li(*dj{h9& zk4RBY{{TOUa!JLVpf`W!HVYQ?Sn)&#d_qtL_5>4_JKoH)ZMt8X8>=1oPq`f{AShgO z0ciP7<TuH)8yq&_1R1zsfFB{~$389smMHKS!?PuvBA9qILxmNXQ{-B?RI$x}FyKt& z=Oa!bT^zuw6c7l9az8=>nq-2*t(c{1wtDgwF53PF9!Xb)TDNN4pmX6{R}B4&dYZn! zXFL`^gd_lodTr4KED;pf&FZcj#%zLn3Ks`j_v4ADZWHiTaa|VoT~|4|_-pi6H=u(2 zMv%{B4Ru$GfHR7j_zNm7Q9`%kf;>%_ln_<ON`oNw66MAjxCY2%f7Xu{o3&>5zI_h# z$a(XOJd0~2gDxZ#5!yyZ-at|{EPd1L^bEaQH>?})8HNUI>wd`q=g2A3E4abH@gN#5 z=HiscFn>>~B{`+>36AJ$Jx*_aP2Bs`HF0l#P23~OsE%P$E!27Q3wN5`Eem2LYJZ#$ ze&4>h|CYQ*fuD|5`PB{Gk4ZsRB5FwfP@%`O|G6v+rHcaR8((CSbGQQioZsW+mn4ca z6XSJW`z>-v1#}Uo?)jWQ`t2=yXzk)sMP1A&H7|uj<wayES@nKy)9(=fmt-@brMRwY Rf{b>|rnzZ!jHcPve*>Xl2T}k4 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimuli.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimuli.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f95dbe5a2f6c5ced381ffe72ecf76d8ebe2abbe6 GIT binary patch literal 2556 zcmbVOTW=dh6rP#gwb%CAah$Z!(n7fi$p{=Io<Imeii#>#E}})1MwV7<&!pLOcfHK4 z6FEvAP$G(u@(=RH6Mt!5dEzhd#5uEGI~O6fU2D#qIXiQ%-<<V!yWJ%4q<{VzISoSo z#zpnif%z7O{tbvAf+i%ToTiL3iffiQsmoo<JBgRpc+K)|Qcr#Erw!h)YcFZ0E#684 z9@up)X{R0Dv3xyQOS`;lc|TcCd%Q=<4@5LX^OT6D^kqv1vU5`78>01u^n-uE7t&|O zf1DTbG>a1BK8khGr=~u9w*4SZB(TAgB2H(?Oxrax&F`ZkdOY5flfv|>cTeL~>LN;W z4eIVzQatgKj6^g}<io6xYA2dVvpGB%Uz36%ls{8(acMWm+dnF)WmZJ!qXt3asZ8@E zDx{uZ0M&yj#z+4FL=sK~;Y>Qx74)3FBs)|v;hYBClQroG_nZn()K1+K%IhF;t)wn| zEAeGRHlZwyb0(UiWo0ed5Ism>TXy8yEi795+!Y<McIttSu57{y+}{=Jr!HTANnFBv zkme0jFB1|&Zrb_9U`(S}hT>S~3BlQgfwR5`q#!3`j|zGOC^-YP903=yBL>tF1PnMs zUe~rrXu-{*R2pwTN@lX}8c)x1sf-_naTXV0Xgc9#7n<SHhrVN6Et4J90kdii2xdDB zCrPAr82&~6{r&z|qo1`@dKB$OVla*lqHI3;E{i79OhjLdWVWwI(_ChH0(6@1&h_X~ zJRa$|ke}tz<VEyc!r3H&9pc5-SVeIbPRF2eKPskbzBQJ+(SAHtTLMr9ZxCjBYY|;F z5AwO%0Po(0p=&@0>(UxM>@M;=sDcIeYf2U~l}#vag9m3E_hHzxM`RC^NQZr@HbDr} zO_&raFUc+BFeUH8&<qG+hc_x)m$Lb4W^RCn|1pC}{{Tj1X1y}ADiSmG>|neDcT3%d zofGR2FbEnPHnNX^DF8M{0Gu;=%nG*Tox%a|I0z;S9`NKH*xhFr%I>Nbh>X9ZrfCS) zQ~*oW#%-=~CW*F349yKKu4d{E?D`nSqA~#uE>xycI0QZIvaB;5VlZZ7xdbdPx`|m! z;uK(8Ov5-u?35v6nD}7rJs39RPk<>yw&Bq;=h!X7E`vSxAaM7{6OIks9rhh{56-Cf zkzmpx1y-=&SGQo1j-K^?>835gDls*67Zq6zOO*;SquxVu1yCP?>{A#T%@EI}41PYq z*r$iLtEyi&xGXo8{ZhFR$XH~U85ErzTh5l90R-SpS#D-)$8Rp<xP;&e4UR&Tni^yt z>u+xcD{ls(<!UsDw=ZF69|(ac0@`7Rohpt}3tqAfY(?0jpcOU4FrA87f_xB$zs#bf zd}Gm9Vh-=Q@pA?3L>2QDL`}<frBoKXQ=u>s3W28(4hla73KOIpB$#T29-8)|nN4Jp zgyAX(i25zuWUo5H99w`!;xk5j9;02S9KgGG8uls-`<sxTc^+raSH`%P&oN=>5g$~Y zZg8#B4XREzu$>OEq^<M(^H)B!Xpai7fsL6zeBHCq!nGWz#YY;x5sR<1R#->{e`Cm- zDm_?y%P%U$KS=z+Ydcv&H6C0-ss#z(eq&|Jj=E}YD?pSS!om1ommvKHKO4FSq{{*p N&@Ssb0sg!W{SS)$i4p(+ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimulus_templates.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimulus_templates.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..937bbb64700ec1bff770e25eb86ec4658de4bc25 GIT binary patch literal 11069 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/templates.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/templates.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67296f6bc2582b35d2df155d580098afd4fd1cf0 GIT binary patch literal 4381 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/util.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e21b81538e233c33713e2908b296e3fee6d2a54 GIT binary patch literal 1999 zcma)7O^n+_6!zGT<2cDSE#*%jVO8P~iDsdtLMn)5yDF#>-Ii`ki-}}SGL!7=`X|hc zca_KiL0gFnM-b2=we-XpPF#B6L@#gzAL#*c<c9Xdn@OB@fddm|=K1-(@BPm6sb<qN zV8wSn#Lu{fabG=@%Ld{#_=^E-#2_d#0(F`Zip{`8inbyvwgX$!c2tR-z|nLis>W{M z0_~9MH6y4|k9x$tX_6Z8uGvAI+SH*9Qom`D25ADPNzjJTUit%U8S8CS*ypj_gwx#^ zC;iu1M1iiIelKIAm?jb)TIWWaV{wtibTwkbgz`R8y0Fx#oL_^#Xuy^mx4?a3-ZsI6 zwH~+^FRY$fKePTu;7X2J!jd5XRyiF-xDSSc`Tz_jIHn;>zA<<eF!rvmo$Ou`l#4Fj z#H7>1yEqwlR}<V%6M~O-X|f}_>4+wx4|}Sd>%Pf)UBM(hI>P;JJfxr-0k9z3%ROZ{ zOnZR1gJsIc%RRb@cUa1o36>b%Y|*|H%R;g^i`a4|S=1Sg3m?qwP%cB|;s|mS_OYNW z5dh01+o5$8wF#Sncn$WpSuC*_jE92CP-zqnr!wQozJw_aoiNo95>j>*ZK;Z&$qCPg zwIMkh314nfUq~AJ1D?kEX@TvRNz?LelPk!=R?=<66|7F=Y=dSqibF&2XrUjfgdYI@ z%zK+Rfo@wxO+W|eaElr(8-S}Y`#MY@RGi9y4&Y}XQ~+Cupij`$9DBLBWlpWjM)I9) zNNd~U_mDA#rk#A2qb++{A?DP{9b&y?=+n;a8wRO-RX#g&el@QE-<|PQBa^ynUa~|E z+;pb!Hm`11`RBPab#s@rwDdtO?aE5-UPT|F9HgE!rWRN`lv{xI$P7(7x2m~w8zJMe zK@O9{Q~Q1Uit&z-m{*M4f-*ch`Ed<L{Vc+g3O`O020h~w8sV{@320znWl5Ky<DVHo zWw7)Im__0_KT6YW;b$XVm;I``irY!LoA^68$^d!*u!}5rJgsv9GeLzWkIvVOpC!<p z^fc!w*9_GtV4NkROg=#I8CXxW6)gqbumm-l9637+V?2+eKM#<liFTb5f704za?^iX z`8G2%sVE~y_Rx{Zv!04f#lAnNY&7pq+>59`si}}S8=my{kU#t@{`k)?FMql+G!OoE z@7I^_tPH=u`pXxmeg{tTt?Mg4+yLVK`MdRZzXbw4@zbr_AAG&ib|%%e)w9RWcU~xo zV<mCCBwj3u6BFm`>5X$B+wvBv)ZOh*4*N+eAwjw*;HXqSPFzn{@}xg;eL>Yg5$kQ2 zS0GD;TVC{_IS(_`!iD!BD@8?DuV`F&s3L{Ci@BO@qOcX!uIaRMb;W`zo(;{SG6ORy z4VLyh8`S6eVJwD0L(7FK<JqXNfc4MY{CHVE8t!xSF|a3|ht2RBrinb%LXK%87f$$B zOjQ0{(?z!Cs&`MD{3+0BFL4D>RMq5)SWi!tpi|D#&cEhpr<|i5Jx5jc1h)Vpxb(l3 z=EJuWQ;8MI0yA827P;c;QxhCrV6#M0p5W*|JX4n?RQFU@R!`@`5|ZmlS5yX3ilq+v lq138x57*PueI-sw7SUJL_f525b5X-=poZ13T)R~@(ci{hKz0BC literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/stimuli/presentations.py b/brain_observatory/behavior/data_objects/stimuli/presentations.py new file mode 100644 index 0000000000..7797bf7631 --- /dev/null +++ b/brain_observatory/behavior/data_objects/stimuli/presentations.py @@ -0,0 +1,215 @@ +from typing import Optional, List + +import pandas as pd +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + StimulusFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.stimulus_processing import \ + get_stimulus_presentations, get_stimulus_metadata, is_change_event +from allensdk.brain_observatory.nwb import \ + create_stimulus_presentation_time_interval, get_column_name +from allensdk.brain_observatory.nwb.nwb_api import NwbApi + + +class Presentations(DataObject, StimulusFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + """Stimulus presentations""" + def __init__(self, presentations: pd.DataFrame): + super().__init__(name='presentations', value=presentations) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + """Adds a stimulus table (defining stimulus characteristics for each + time point in a session) to an nwbfile as TimeIntervals. + """ + stimulus_table = self.value.copy() + + ts = nwbfile.processing['stimulus'].get_data_interface('timestamps') + possible_names = {'stimulus_name', 'image_name'} + stimulus_name_column = get_column_name(stimulus_table.columns, + possible_names) + stimulus_names = stimulus_table[stimulus_name_column].unique() + + for stim_name in sorted(stimulus_names): + specific_stimulus_table = stimulus_table[stimulus_table[ + stimulus_name_column] == stim_name] # noqa: E501 + # Drop columns where all values in column are NaN + cleaned_table = specific_stimulus_table.dropna(axis=1, how='all') + # For columns with mixed strings and NaNs, fill NaNs with 'N/A' + for colname, series in cleaned_table.items(): + types = set(series.map(type)) + if len(types) > 1 and str in types: + series.fillna('N/A', inplace=True) + cleaned_table[colname] = series.transform(str) + + interval_description = (f"Presentation times and stimuli details " + f"for '{stim_name}' stimuli. " + f"\n" + f"Note: image_name references " + f"control_description in " + f"stimulus/templates") + presentation_interval = create_stimulus_presentation_time_interval( + name=f"{stim_name}_presentations", + description=interval_description, + columns_to_add=cleaned_table.columns + ) + + for row in cleaned_table.itertuples(index=False): + row = row._asdict() + + presentation_interval.add_interval( + **row, tags='stimulus_time_interval', timeseries=ts) + + nwbfile.add_time_intervals(presentation_interval) + + return nwbfile + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "Presentations": + # Note: using NwbApi class because ecephys uses this method + # TODO figure out how behavior and ecephys can share this method + nwbapi = NwbApi.from_nwbfile(nwbfile=nwbfile) + df = nwbapi.get_stimulus_presentations() + + df['is_change'] = is_change_event(stimulus_presentations=df) + df = cls._postprocess(presentations=df, fill_omitted_values=False) + return Presentations(presentations=df) + + @classmethod + def from_stimulus_file( + cls, stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps, + limit_to_images: Optional[List] = None) -> "Presentations": + """Get stimulus presentation data. + + :param stimulus_file + :param limit_to_images + Only return images given by these image names + :param stimulus_timestamps + + + :returns: pd.DataFrame -- + Table whose rows are stimulus presentations + (i.e. a given image, for a given duration, typically 250 ms) + and whose columns are presentation characteristics. + """ + stimulus_timestamps = stimulus_timestamps.value + data = stimulus_file.data + raw_stim_pres_df = get_stimulus_presentations( + data, stimulus_timestamps) + + # Fill in nulls for image_name + # This makes two assumptions: + # 1. Nulls in `image_name` should be "gratings_<orientation>" + # 2. Gratings are only present (or need to be fixed) when all + # values for `image_name` are null. + if pd.isnull(raw_stim_pres_df["image_name"]).all(): + if ~pd.isnull(raw_stim_pres_df["orientation"]).all(): + raw_stim_pres_df["image_name"] = ( + raw_stim_pres_df["orientation"] + .apply(lambda x: f"gratings_{x}")) + else: + raise ValueError("All values for 'orentation' and 'image_name'" + " are null.") + + stimulus_metadata_df = get_stimulus_metadata(data) + + idx_name = raw_stim_pres_df.index.name + stimulus_index_df = ( + raw_stim_pres_df + .reset_index() + .merge(stimulus_metadata_df.reset_index(), on=["image_name"]) + .set_index(idx_name)) + stimulus_index_df = ( + stimulus_index_df[["image_set", "image_index", "start_time", + "phase", "spatial_frequency"]] + .rename(columns={"start_time": "timestamps"}) + .sort_index() + .set_index("timestamps", drop=True)) + stim_pres_df = raw_stim_pres_df.merge( + stimulus_index_df, left_on="start_time", right_index=True, + how="left") + if len(raw_stim_pres_df) != len(stim_pres_df): + raise ValueError("Length of `stim_pres_df` should not change after" + f" merge; was {len(raw_stim_pres_df)}, now " + f" {len(stim_pres_df)}.") + + stim_pres_df['is_change'] = is_change_event( + stimulus_presentations=stim_pres_df) + + # Sort columns then drop columns which contain only all NaN values + stim_pres_df = \ + stim_pres_df[sorted(stim_pres_df)].dropna(axis=1, how='all') + if limit_to_images is not None: + stim_pres_df = \ + stim_pres_df[stim_pres_df['image_name'].isin(limit_to_images)] + stim_pres_df.index = pd.Int64Index( + range(stim_pres_df.shape[0]), name=stim_pres_df.index.name) + stim_pres_df = cls._postprocess(presentations=stim_pres_df) + return Presentations(presentations=stim_pres_df) + + @classmethod + def _postprocess(cls, presentations: pd.DataFrame, + fill_omitted_values=True, + omitted_time_duration: float = 0.25) \ + -> pd.DataFrame: + """ + 1. Filter/rearrange columns + 2. Optionally fill missing values for omitted flashes (no need when + reading from NWB since already filled) + + Parameters + ---------- + presentations + Presentations df + fill_omitted_values + Whether to fill stop time and duration for omitted flashes + omitted_time_duration + Amount of time a stimuli is omitted for in seconds""" + + def _filter_arrange_columns(df: pd.DataFrame): + df = df.drop(['index'], axis=1, errors='ignore') + df = df[['start_time', 'stop_time', + 'duration', + 'image_name', 'image_index', + 'is_change', 'omitted', + 'start_frame', 'end_frame', + 'image_set']] + return df + + df = _filter_arrange_columns(df=presentations) + if fill_omitted_values: + cls._fill_missing_values_for_omitted_flashes( + df=df, omitted_time_duration=omitted_time_duration) + return df + + @staticmethod + def _fill_missing_values_for_omitted_flashes( + df: pd.DataFrame, omitted_time_duration: float = 0.25) \ + -> pd.DataFrame: + """ + This function sets the stop time for a row that is an omitted + stimulus. An omitted stimulus is a stimulus where a mouse is + shown only a grey screen and these last for 250 milliseconds. + These do not include a stop_time or end_frame like other stimuli in + the stimulus table due to design choices. + + Parameters + ---------- + df + Stimuli presentations dataframe + omitted_time_duration + Amount of time a stimulus is omitted for in seconds + """ + omitted = df['omitted'] + df.loc[omitted, 'stop_time'] = \ + df.loc[omitted, 'start_time'] + omitted_time_duration + df.loc[omitted, 'duration'] = omitted_time_duration + return df diff --git a/brain_observatory/behavior/data_objects/stimuli/stimuli.py b/brain_observatory/behavior/data_objects/stimuli/stimuli.py new file mode 100644 index 0000000000..330e3a6795 --- /dev/null +++ b/brain_observatory/behavior/data_objects/stimuli/stimuli.py @@ -0,0 +1,62 @@ +from typing import Optional, List + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + StimulusFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.stimuli.presentations \ + import \ + Presentations +from allensdk.brain_observatory.behavior.data_objects.stimuli.templates \ + import \ + Templates + + +class Stimuli(DataObject, StimulusFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + def __init__(self, presentations: Presentations, + templates: Templates): + super().__init__(name='stimuli', value=self) + self._presentations = presentations + self._templates = templates + + @property + def presentations(self) -> Presentations: + return self._presentations + + @property + def templates(self) -> Templates: + return self._templates + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "Stimuli": + p = Presentations.from_nwb(nwbfile=nwbfile) + t = Templates.from_nwb(nwbfile=nwbfile) + return Stimuli(presentations=p, templates=t) + + @classmethod + def from_stimulus_file( + cls, stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps, + limit_to_images: Optional[List] = None) -> "Stimuli": + p = Presentations.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + limit_to_images=limit_to_images) + t = Templates.from_stimulus_file(stimulus_file=stimulus_file, + limit_to_images=limit_to_images) + return Stimuli(presentations=p, templates=t) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + nwbfile = self._templates.to_nwb( + nwbfile=nwbfile, stimulus_presentations=self._presentations) + nwbfile = self._presentations.to_nwb(nwbfile=nwbfile) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py b/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py new file mode 100644 index 0000000000..d5a7bfa69e --- /dev/null +++ b/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py @@ -0,0 +1,290 @@ +from typing import Dict, List + +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ + convert_filepath_caseinsensitive +from allensdk.brain_observatory.stimulus_info import BrainObservatoryMonitor + + +class StimulusImage: + """Container class for image stimuli""" + + def __init__(self, warped: np.ndarray, unwarped: np.ndarray, name: str): + """ + Parameters + ---------- + warped: + The warped stimulus image + unwarped: + The unwarped stimulus image + name: + Name of the stimulus image + """ + self._name = name + self.warped = warped + self.unwarped = unwarped + + @property + def name(self): + return self._name + + +class StimulusImageFactory: + """Factory for StimulusImage""" + _monitor = BrainObservatoryMonitor() + + def from_unprocessed(self, input_array: np.ndarray, + name: str) -> StimulusImage: + """Creates a StimulusImage from unprocessed input (usually pkl). + Image needs to be warped and preprocessed""" + resized, unwarped = self._get_unwarped(arr=input_array) + warped = self._get_warped(arr=resized) + image = StimulusImage(name=name, warped=warped, unwarped=unwarped) + return image + + @staticmethod + def from_processed(warped: np.ndarray, unwarped: np.ndarray, + name: str) -> StimulusImage: + """Creates a StimulusImage from processed input (usually nwb). + Image has already been warped and preprocessed""" + image = StimulusImage(name=name, warped=warped, unwarped=unwarped) + return image + + def _get_warped(self, arr: np.ndarray): + """Note: The Stimulus image is warped when shown to the mice to account + "for distance of the flat screen to the eye at each point on + the monitor.""" + return self._monitor.warp_image(img=arr) + + def _get_unwarped(self, arr: np.ndarray): + """This produces the pixels that would be visible in the unwarped image + post-warping""" + # 1. Resize image to the same size as the monitor + resized_array = self._monitor.natural_scene_image_to_screen( + arr, origin='upper') + # 2. Remove unseen pixels + arr = self._exclude_unseen_pixels(arr=resized_array) + + return resized_array, arr + + def _exclude_unseen_pixels(self, arr: np.ndarray): + """After warping, some pixels are not visible on the screen. + This sets those pixels to nan to make downstream analysis easier.""" + mask = self._monitor.get_mask() + arr = arr.astype(np.float) + arr *= mask + arr[arr == 0] = np.nan + return arr + + def _warp(self, arr: np.ndarray) -> np.ndarray: + """The Stimulus image is warped when shown to the mice to account + "for distance of the flat screen to the eye at each point on + the monitor." This applies the warping.""" + return self._monitor.warp_image(img=arr) + + +class StimulusTemplate: + """Container class for a collection of image stimuli""" + + def __init__(self, image_set_name: str, images: List[StimulusImage]): + """ + Parameters + ---------- + image_set_name: + the name of the image set + images + List of images + """ + self._image_set_name = image_set_name + + image_set_name = convert_filepath_caseinsensitive( + image_set_name) + self._image_set_filepath = image_set_name + + self._images: Dict[str, StimulusImage] = {} + + for image in images: + self._images[image.name] = image + + @property + def image_set_name(self) -> str: + return self._image_set_name + + @property + def image_names(self) -> List[str]: + return list(self.keys()) + + @property + def images(self) -> List[StimulusImage]: + return list(self.values()) + + def keys(self): + return self._images.keys() + + def values(self): + return self._images.values() + + def items(self): + return self._images.items() + + def to_dataframe(self) -> pd.DataFrame: + index = pd.Index(self.image_names, name='image_name') + warped = [img.warped for img in self.images] + unwarped = [img.unwarped for img in self.images] + df = pd.DataFrame({'unwarped': unwarped, 'warped': warped}, + index=index) + df.name = self._image_set_name + return df + + def __add_image(self, warped_values: np.ndarray, + unwarped_values: np.ndarray, name: str): + """ + Parameters + ---------- + name : str + Name of the image + warped_values : np.ndarray + The image array corresponding to the 'warped' version of the + stimuli. + unwarped_values : np.ndarray + The image array corresponding to the 'unwarped' version of the + stimuli. + """ + image = StimulusImage(warped=warped_values, + unwarped=unwarped_values, + name=name) + self._images[name] = image + + def __getitem__(self, item) -> StimulusImage: + """ + Given an image name, returns the corresponding StimulusImage + """ + return self._images[item] + + def __len__(self): + return len(self._images) + + def __iter__(self): + yield from self._images + + def __repr__(self): + return f'{self._images}' + + def __eq__(self, other: object): + if isinstance(other, StimulusTemplate): + if self.image_set_name != other.image_set_name: + return False + + if sorted(self.image_names) != sorted(other.image_names): + return False + + for (img_name, self_img) in self.items(): + other_img = other._images[img_name] + warped_equal = np.array_equal( + self_img.warped, other_img.warped) + unwarped_equal = np.allclose(self_img.unwarped, + other_img.unwarped, + equal_nan=True) + if not (warped_equal and unwarped_equal): + return False + + return True + else: + raise NotImplementedError( + "Cannot compare a StimulusTemplate with an object of type: " + f"{type(other)}!") + + +class StimulusTemplateFactory: + """Factory for StimulusTemplate""" + + @staticmethod + def from_unprocessed(image_set_name: str, image_attributes: List[dict], + images: List[np.ndarray]) -> StimulusTemplate: + """Create StimulusTemplate from pkl or unprocessed input. Stimulus + templates created this way need to be processed to acquire unwarped + versions of the images presented. + + NOTE: The ordering of image_attributes and images matter! + + NOTE: Warped images display what was seen on a monitor by a subject. + Unwarped images display a 'diagnostic' version of the stimuli to be + presented. + + Parameters + ---------- + image_set_name : str + The name of the image set. Example: + Natural_Images_Lum_Matched_set_TRAINING_2017.07.14 + image_attributes : List[dict] + A list of dictionaries containing image metadata. Must at least + contain the key: + image_name + But will usually also contain: + image_category, orientation, phase, + spatial_frequency, image_index + images : List[np.ndarray] + A list of image arrays + + Returns + ------- + StimulusTemplate + A StimulusTemplate object + """ + stimulus_images = [] + for i, image in enumerate(images): + name = image_attributes[i]['image_name'] + stimulus_image = StimulusImageFactory().from_unprocessed( + name=name, input_array=image) + stimulus_images.append(stimulus_image) + return StimulusTemplate(image_set_name=image_set_name, + images=stimulus_images) + + @staticmethod + def from_processed(image_set_name: str, image_attributes: List[dict], + unwarped: List[np.ndarray], + warped: List[np.ndarray]) -> StimulusTemplate: + """Create StimulusTemplate from nwb or other processed input. + Stimulus templates created this way DO NOT need to be processed + to acquire unwarped versions of the images presented. + + NOTE: The ordering of image_attributes, unwarped, and warped matter! + + NOTE: Warped images display what was seen on a monitor by a subject. + Unwarped images display a 'diagnostic' version of the stimuli to be + presented. + + Parameters + ---------- + image_set_name : str + The name of the image set. Example: + Natural_Images_Lum_Matched_set_TRAINING_2017.07.14 + image_attributes : List[dict] + A list of dictionaries containing image metadata. Must at least + contain the key: + image_name + But will usually also contain: + image_category, orientation, phase, + spatial_frequency, image_index + unwarped : List[np.ndarray] + A list of unwarped image arrays + warped : List[np.ndarray] + A list of warped image arrays + + Returns + ------- + StimulusTemplate + A StimulusTemplate object + """ + stimulus_images = [] + for i, attrs in enumerate(image_attributes): + warped_image = warped[i] + unwarped_image = unwarped[i] + name = attrs['image_name'] + stimulus_image = StimulusImageFactory.from_processed( + name=name, warped=warped_image, unwarped=unwarped_image) + stimulus_images.append(stimulus_image) + return StimulusTemplate(image_set_name=image_set_name, + images=stimulus_images) diff --git a/brain_observatory/behavior/data_objects/stimuli/templates.py b/brain_observatory/behavior/data_objects/stimuli/templates.py new file mode 100644 index 0000000000..168a9d367d --- /dev/null +++ b/brain_observatory/behavior/data_objects/stimuli/templates.py @@ -0,0 +1,139 @@ +import os +import numpy as np +from typing import Optional, List + +import imageio +from pynwb import NWBFile + +from allensdk.brain_observatory import nwb +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + StimulusFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.stimuli.presentations \ + import \ + Presentations +from allensdk.brain_observatory.behavior.stimulus_processing import \ + get_stimulus_templates +from allensdk.brain_observatory.behavior.data_objects.stimuli \ + .stimulus_templates import \ + StimulusTemplate, StimulusTemplateFactory +from allensdk.brain_observatory.behavior.write_nwb.extensions\ + .stimulus_template.ndx_stimulus_template import \ + StimulusTemplateExtension +from allensdk.internal.core.lims_utilities import safe_system_path + + +class Templates(DataObject, StimulusFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + def __init__(self, templates: StimulusTemplate): + super().__init__(name='stimulus_templates', value=templates) + + @classmethod + def from_stimulus_file( + cls, stimulus_file: StimulusFile, + limit_to_images: Optional[List] = None) -> "Templates": + """Get stimulus templates (movies, scenes) for behavior session.""" + + # TODO: Eventually the `grating_images_dict` should be provided by the + # BehaviorLimsExtractor/BehaviorJsonExtractor classes. + # - NJM 2021/2/23 + + gratings_dir = "/allen/programs/braintv/production/visualbehavior" + gratings_dir = os.path.join(gratings_dir, + "prod5/project_VisualBehavior") + grating_images_dict = { + "gratings_0.0": { + "warped": np.asarray(imageio.imread( + safe_system_path(os.path.join(gratings_dir, + "warped_grating_0.png")))), + "unwarped": np.asarray(imageio.imread( + safe_system_path(os.path.join( + gratings_dir, "masked_unwarped_grating_0.png")))) + }, + "gratings_90.0": { + "warped": np.asarray(imageio.imread( + safe_system_path(os.path.join(gratings_dir, + "warped_grating_90.png")))), + "unwarped": np.asarray(imageio.imread( + safe_system_path(os.path.join( + gratings_dir, "masked_unwarped_grating_90.png")))) + }, + "gratings_180.0": { + "warped": np.asarray(imageio.imread( + safe_system_path(os.path.join(gratings_dir, + "warped_grating_180.png")))), + "unwarped": np.asarray(imageio.imread( + safe_system_path(os.path.join( + gratings_dir, "masked_unwarped_grating_180.png")))) + }, + "gratings_270.0": { + "warped": np.asarray(imageio.imread( + safe_system_path(os.path.join(gratings_dir, + "warped_grating_270.png")))), + "unwarped": np.asarray(imageio.imread( + safe_system_path(os.path.join( + gratings_dir, "masked_unwarped_grating_270.png")))) + } + } + + pkl = stimulus_file.data + t = get_stimulus_templates(pkl=pkl, + grating_images_dict=grating_images_dict, + limit_to_images=limit_to_images) + return Templates(templates=t) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "Templates": + image_set_name = list(nwbfile.stimulus_template.keys())[0] + image_data = list(nwbfile.stimulus_template.values())[0] + + image_attributes = [{'image_name': image_name} + for image_name in image_data.control_description] + t = StimulusTemplateFactory.from_processed( + image_set_name=image_set_name, image_attributes=image_attributes, + warped=image_data.data[:], unwarped=image_data.unwarped[:] + ) + return Templates(templates=t) + + def to_nwb(self, nwbfile: NWBFile, + stimulus_presentations: Presentations) -> NWBFile: + stimulus_templates = self.value + + unwarped_images = [] + warped_images = [] + image_names = [] + for image_name, image_data in stimulus_templates.items(): + image_names.append(image_name) + unwarped_images.append(image_data.unwarped) + warped_images.append(image_data.warped) + + image_index = np.zeros(len(image_names)) + image_index[:] = np.nan + + visual_stimulus_image_series = \ + StimulusTemplateExtension( + name=stimulus_templates.image_set_name, + data=warped_images, + unwarped=unwarped_images, + control=list(range(len(image_names))), + control_description=image_names, + unit='NA', + format='raw', + timestamps=image_index) + + nwbfile.add_stimulus_template(visual_stimulus_image_series) + + # Add index for this template to NWB in-memory object: + nwb_template = nwbfile.stimulus_template[ + stimulus_templates.image_set_name] + stimulus_index = stimulus_presentations.value[ + stimulus_presentations.value[ + 'image_set'] == nwb_template.name] + nwb.add_stimulus_index(nwbfile, stimulus_index, nwb_template) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/stimuli/util.py b/brain_observatory/behavior/data_objects/stimuli/util.py new file mode 100644 index 0000000000..b3f38b7eb6 --- /dev/null +++ b/brain_observatory/behavior/data_objects/stimuli/util.py @@ -0,0 +1,63 @@ +import warnings +from pathlib import Path + +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.equipment import \ + Equipment +from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner + + +def convert_filepath_caseinsensitive(filename_in): + return filename_in.replace('TRAINING', 'training') + + +def get_image_set_name(image_set_path: str) -> str: + """ + Strips the stem from the image_set filename + """ + return Path(image_set_path).stem + + +def calculate_monitor_delay(sync_file: SyncFile, + equipment: Equipment) -> float: + """Calculates monitor delay using sync file. If that fails, looks up + monitor delay from known values for equipment. + + Raises + -------- + RuntimeError + If input equipment is unknown + """ + aligner = OphysTimeAligner(sync_file=sync_file.filepath) + + try: + delay = aligner.monitor_delay + except ValueError as ee: + equipment_name = equipment.value + + warning_msg = 'Monitory delay calculation failed ' + warning_msg += 'with ValueError\n' + warning_msg += f' "{ee}"' + warning_msg += '\nlooking monitor delay up from table ' + warning_msg += f'for rig: {equipment_name} ' + + # see + # https://github.com/AllenInstitute/AllenSDK/issues/1318 + # https://github.com/AllenInstitute/AllenSDK/issues/1916 + delay_lookup = {'CAM2P.1': 0.020842, + 'CAM2P.2': 0.037566, + 'CAM2P.3': 0.021390, + 'CAM2P.4': 0.021102, + 'CAM2P.5': 0.021192, + 'MESO.1': 0.03613} + + if equipment_name not in delay_lookup: + msg = warning_msg + msg += f'\nequipment_name {equipment_name} not in lookup table' + raise RuntimeError(msg) + delay = delay_lookup[equipment_name] + warning_msg += f'\ndelay: {delay} seconds' + warnings.warn(warning_msg) + + return delay diff --git a/brain_observatory/behavior/data_objects/task_parameters.py b/brain_observatory/behavior/data_objects/task_parameters.py new file mode 100644 index 0000000000..a1780ff491 --- /dev/null +++ b/brain_observatory/behavior/data_objects/task_parameters.py @@ -0,0 +1,234 @@ +from enum import Enum +import numpy as np +from typing import List + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + StimulusFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.schemas import \ + BehaviorTaskParametersSchema +from allensdk.brain_observatory.nwb import load_pynwb_extension + + +class BehaviorStimulusType(Enum): + IMAGES = 'images' + GRATING = 'grating' + + +class StimulusDistribution(Enum): + EXPONENTIAL = 'exponential' + GEOMETRIC = 'geometric' + + +class TaskType(Enum): + CHANGE_DETECTION = 'change detection' + + +class TaskParameters(DataObject, StimulusFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + def __init__(self, + blank_duration_sec: List[float], + stimulus_duration_sec: float, + omitted_flash_fraction: float, + response_window_sec: List[float], + reward_volume: float, + auto_reward_volume: float, + session_type: str, + stimulus: str, + stimulus_distribution: StimulusDistribution, + task_type: TaskType, + n_stimulus_frames: int): + super().__init__(name='task_parameters', value=self) + self._blank_duration_sec = blank_duration_sec + self._stimulus_duration_sec = stimulus_duration_sec + self._omitted_flash_fraction = omitted_flash_fraction + self._response_window_sec = response_window_sec + self._reward_volume = reward_volume + self._auto_reward_volume = auto_reward_volume + self._session_type = session_type + self._stimulus = BehaviorStimulusType(stimulus) + self._stimulus_distribution = StimulusDistribution( + stimulus_distribution) + self._task = TaskType(task_type) + self._n_stimulus_frames = n_stimulus_frames + + @property + def blank_duration_sec(self) -> List[float]: + return self._blank_duration_sec + + @property + def stimulus_duration_sec(self) -> float: + return self._stimulus_duration_sec + + @property + def omitted_flash_fraction(self) -> float: + return self._omitted_flash_fraction + + @property + def response_window_sec(self) -> List[float]: + return self._response_window_sec + + @property + def reward_volume(self) -> float: + return self._reward_volume + + @property + def auto_reward_volume(self) -> float: + return self._auto_reward_volume + + @property + def session_type(self) -> str: + return self._session_type + + @property + def stimulus(self) -> str: + return self._stimulus + + @property + def stimulus_distribution(self) -> float: + return self._stimulus_distribution + + @property + def task(self) -> TaskType: + return self._task + + @property + def n_stimulus_frames(self) -> int: + return self._n_stimulus_frames + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + nwb_extension = load_pynwb_extension( + BehaviorTaskParametersSchema, 'ndx-aibs-behavior-ophys' + ) + task_parameters = self.to_dict()['task_parameters'] + task_parameters_clean = BehaviorTaskParametersSchema().dump( + task_parameters + ) + + new_task_parameters_dict = {} + for key, val in task_parameters_clean.items(): + if isinstance(val, list): + new_task_parameters_dict[key] = np.array(val) + else: + new_task_parameters_dict[key] = val + nwb_task_parameters = nwb_extension( + name='task_parameters', **new_task_parameters_dict) + nwbfile.add_lab_meta_data(nwb_task_parameters) + return nwbfile + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "TaskParameters": + metadata_nwb_obj = nwbfile.lab_meta_data['task_parameters'] + data = BehaviorTaskParametersSchema().dump(metadata_nwb_obj) + data['task_type'] = data['task'] + del data['task'] + return TaskParameters(**data) + + @classmethod + def from_stimulus_file(cls, + stimulus_file: StimulusFile) -> "TaskParameters": + data = stimulus_file.data + + behavior = data["items"]["behavior"] + config = behavior["config"] + doc = config["DoC"] + + blank_duration_sec = [float(x) for x in doc['blank_duration_range']] + stim_duration = cls._calculate_stimulus_duration( + stimulus_file=stimulus_file) + omitted_flash_fraction = \ + behavior['params'].get('flash_omit_probability', float('nan')) + response_window_sec = [float(x) for x in doc["response_window"]] + reward_volume = config["reward"]["reward_volume"] + auto_reward_volume = doc['auto_reward_volume'] + session_type = behavior["params"]["stage"] + stimulus = next(iter(behavior["stimuli"])) + stimulus_distribution = doc["change_time_dist"] + task = cls._parse_task(stimulus_file=stimulus_file) + n_stimulus_frames = cls._calculuate_n_stimulus_frames( + stimulus_file=stimulus_file) + return TaskParameters( + blank_duration_sec=blank_duration_sec, + stimulus_duration_sec=stim_duration, + omitted_flash_fraction=omitted_flash_fraction, + response_window_sec=response_window_sec, + reward_volume=reward_volume, + auto_reward_volume=auto_reward_volume, + session_type=session_type, + stimulus=stimulus, + stimulus_distribution=stimulus_distribution, + task_type=task, + n_stimulus_frames=n_stimulus_frames + ) + + @staticmethod + def _calculate_stimulus_duration(stimulus_file: StimulusFile) -> float: + data = stimulus_file.data + + behavior = data["items"]["behavior"] + stimuli = behavior['stimuli'] + + def _parse_stimulus_key(): + if 'images' in stimuli: + stim_key = 'images' + elif 'grating' in stimuli: + stim_key = 'grating' + else: + msg = "Cannot get stimulus_duration_sec\n" + msg += "'images' and/or 'grating' not a valid " + msg += "key in pickle file under " + msg += "['items']['behavior']['stimuli']\n" + msg += f"keys: {list(stimuli.keys())}" + raise RuntimeError(msg) + + return stim_key + stim_key = _parse_stimulus_key() + stim_duration = stimuli[stim_key]['flash_interval_sec'] + + # from discussion in + # https://github.com/AllenInstitute/AllenSDK/issues/1572 + # + # 'flash_interval' contains (stimulus_duration, gray_screen_duration) + # (as @matchings said above). That second value is redundant with + # 'blank_duration_range'. I'm not sure what would happen if they were + # set to be conflicting values in the params. But it looks like + # they're always consistent. It should always be (0.25, 0.5), + # except for TRAINING_0 and TRAINING_1, which have statically + # displayed stimuli (no flashes). + + if stim_duration is None: + stim_duration = np.NaN + else: + stim_duration = stim_duration[0] + return stim_duration + + @staticmethod + def _parse_task(stimulus_file: StimulusFile) -> TaskType: + data = stimulus_file.data + config = data["items"]["behavior"]["config"] + + task_id = config['behavior']['task_id'] + if 'DoC' in task_id: + task = TaskType.CHANGE_DETECTION + else: + msg = "metadata.get_task_parameters does not " + msg += f"know how to parse 'task_id' = {task_id}" + raise RuntimeError(msg) + return task + + @staticmethod + def _calculuate_n_stimulus_frames(stimulus_file: StimulusFile) -> int: + data = stimulus_file.data + behavior = data["items"]["behavior"] + + n_stimulus_frames = 0 + for stim_type, stim_table in behavior["stimuli"].items(): + n_stimulus_frames += sum(stim_table.get("draw_log", [])) + return n_stimulus_frames diff --git a/brain_observatory/behavior/data_objects/timestamps/__init__.py b/brain_observatory/behavior/data_objects/timestamps/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/timestamps/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce722a8303952a9d7fa5eedcbd376f1c54d03bcd GIT binary patch literal 227 zcmYL@y@~=c5XZA%AqV>)7MkKZ5%HrH8@VnJCY!;H?j|7<_t^6KdkZUH$@U)MIxA-j z@elvs4D-co%JM_7+UpMt@o&IO1t%*ujTlxO#H85YL>kI(Jbt%x^+lLSK@E0h;2V6e z)*h<hEqp5U9jOq}Q^gFi?n&*OQRFgCBUEQNBJVa0PuR0G37pr#@Wl>tNWC;zL+3)0 m7BX<>gjFV)U5k{VjU=^p-es+4vA>TOZLpUHm&2F;Z1DuuFGP+2 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/timestamps/__pycache__/ophys_timestamps.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/__pycache__/ophys_timestamps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10d542d8e262bd9c5e64586d0dcc822d01c84564 GIT binary patch literal 3833 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/timestamps/__pycache__/util.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2598dd89ec5cf01c100a9985154a55d0c6c4c55c GIT binary patch literal 438 zcmYjNu};G<5Vez(R+TC~0Dd3?&A^5b0=l9uh$XUAU2-l>o7j=<6h*KgG4K%#R80I* zR;K;}6X!?>PI~Wbzq_Y9Ur#1uMp1n{!z1M{fBB7&4wnRbOoR-1$x<%)I>6wKV~Ej9 zl!nM}Sv=TN1)Imb8@r;C)<IR<ocl)#pGSllq4#p^og*g>2;mdk@f|;680-S_3g>&@ zU_8Z97pS@$7~LpLqe_BGBP^E7n45s~Pi77%eZS7m#GRGK3RnS7Gk5^iiYo=VRtTp; zs;w2emdfVDx?Z(b+!UFxg_9>W<Quq`)LWKRftw^VP^g8@$Z-o!n>NYh3butd34#Ms z)-rcC`P(&VTv1NzwmZzB%oj@om0TEbGNSRUAC+<A{~(UifoiI{HC{=FG@dcg_FBKo VKN?a+H#)C0Hl@7q|Is^*!XH)eargiL literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py b/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py new file mode 100644 index 0000000000..7e9ad3e243 --- /dev/null +++ b/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py @@ -0,0 +1,104 @@ +import logging + +import numpy as np +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + SyncFileReadableInterface, NwbReadableInterface + + +class OphysTimestamps(DataObject, SyncFileReadableInterface, + NwbReadableInterface): + _logger = logging.getLogger(__name__) + + def __init__(self, timestamps: np.ndarray): + """ + :param timestamps + ophys timestamps + """ + super().__init__(name='ophys_timestamps', value=timestamps) + + @classmethod + def from_sync_file(cls, sync_file: SyncFile) -> "OphysTimestamps": + ophys_timestamps = sync_file.data['ophys_frames'] + return cls(timestamps=ophys_timestamps) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "OphysTimestamps": + ts = nwbfile.processing[ + 'ophys'].get_data_interface('dff').roi_response_series[ + 'traces'].timestamps[:] + return cls(timestamps=ts) + + def validate(self, number_of_frames: int) -> "OphysTimestamps": + """Validates that number of ophys timestamps do not exceed number of + dff traces. If so, truncates number of ophys timestamps to the same + length as dff traces + + :param number_of_frames + number of frames in the movie + + Notes + --------- + Modifies self._value if ophys timestamps exceed length of + number_of_frames + """ + # Scientifica data has extra frames in the sync file relative + # to the number of frames in the video. These sentinel frames + # should be removed. + # NOTE: This fix does not apply to mesoscope data. + # See http://confluence.corp.alleninstitute.org/x/9DVnAg + ophys_timestamps = self.value + num_of_timestamps = len(ophys_timestamps) + if number_of_frames < num_of_timestamps: + self._logger.info( + "Truncating acquisition frames ('ophys_frames') " + f"(len={num_of_timestamps}) to the number of frames " + f"in the df/f trace ({number_of_frames}).") + self._value = ophys_timestamps[:number_of_frames] + elif number_of_frames > num_of_timestamps: + raise RuntimeError( + f"dff_frames (len={number_of_frames}) is longer " + f"than timestamps (len={num_of_timestamps}).") + return self + + +class OphysTimestampsMultiplane(OphysTimestamps): + def __init__(self, timestamps: np.ndarray): + super().__init__(timestamps=timestamps) + + @classmethod + def from_sync_file(cls, sync_file: SyncFile, + group_count: int, + plane_group: int) -> "OphysTimestampsMultiplane": + if group_count == 0: + raise ValueError('Group count cannot be 0') + + ophys_timestamps = sync_file.data['ophys_frames'] + cls._logger.info( + "Mesoscope data detected. Splitting timestamps " + f"(len={len(ophys_timestamps)} over {group_count} " + "plane group(s).") + + # Resample if collecting multiple concurrent planes + # because the frames are interleaved + ophys_timestamps = ophys_timestamps[plane_group::group_count] + + return cls(timestamps=ophys_timestamps) + + def validate(self, number_of_frames: int) -> "OphysTimestampsMultiplane": + """ + Raises error if length of timestamps and number of frames are not equal + :param number_of_frames + See super().validate + """ + ophys_timestamps = self.value + num_of_timestamps = len(ophys_timestamps) + if number_of_frames != num_of_timestamps: + raise RuntimeError( + f"dff_frames (len={number_of_frames}) is not equal to " + f"number of split timestamps (len={num_of_timestamps}).") + return self diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec387fde1785c115f82d69707fad481407311e71 GIT binary patch literal 247 zcmYjLJ&OV{5RGt!2>y^OG=-groZ5<w*agC5Gu%dZlaR@-Z0SD{to%#1{)FqUa<(|m z2k*_}%?Gm{k4J)0-!9PCXD@#ku=!%r2a6SZ@j2MtMe5^!`MqxD>Oh!CK?!zh;0(S~ zD-T8R7G?^4ODaV4RIr9vcBHn>C~_Gm5sDLhBkxufPuP<*37pr#@WmE#NS!oTLhC}3 s7BX<>h(#uuU5%8XjwFeFQ#GXDGOe9=S?g)+9>YZ)Y*XQ~|NMt3Ufq#Q{Qv*} literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..346c6e0b5629ae6c4e26d69d7d65157a0298a602 GIT binary patch literal 4788 zcmbVQ-EJGl72a7ce??IgDcP1SJ8LIJ&D5dOv}g+>2pYR_kv37%*g=4S(8ZE75?9(E zc4ldZs&vuFMXvk=HBcG7D*6t6kiG3yZ~6ee>UU<jq%6rmnzeU0JHO|A=bUfO=>GC@ z!@?8&?N9z+yO#AY`Y4_yRDOw9{|AMz1Pd)rzjnwXo7;@)rLYt^+%a_)mU#tjPFRg< zycX4Y-L#j(MzqA2OuZ5|qh-DvwRkI9;VV&_x1&|QYWk{SC+hO9sn^1_Xq~S|m-r>~ zT@NouSNN4^gKwDcMtC*4#;--2eA9d{h1a7S{06h+8>0DwiDl7x=5SZ6$(z!aH#aP? z^1>EvvHGmcZ~fX59npPeiLUI*wp^9Vaz(b}hP-mz;BN}{$m*^C8#-HCJ(krz8>c}M z`yuMpk*`Pla@w=A>eg5H9|ob!+MlarD76ma-A@xS2_?og9tV+pBvl}Fubi#_MknzX z(ii?9lpn{bR6G7qX6v5>kv`wNw)J#yzV-T}G>9hQMAM$<yEh(9<Kcx}B+ak<)c<U- zCx<BnZ=PN$s}&Q`W90lw1?j7Dl0fHLG2GpisW*@#|4EQ2PtWA@@GEudM`N8`rxD3` zG}RY%L$c22iB5Nw)W4fZHT^XBI*8F)7r`*~lpL#}O;*4|zYg99cy$X!YNhPNK4dT1 zF`0{P^-8LQ_RQG>*jZUjAOM6c4MVNg(D8RmUBS<P|MB47_Lo{Jz3q>D(I5Cv{dl_l zVeAi+SolBLmhlt4os4CyhbWEk+n)r3Z5^cYov}aM_je`ch9O3X{ksF@2eFq7u;LRx zP1N*mfyi9})X_t*>$?k7?p}b@MQ#1@H0$oDB=SfjZ|Dz4(u419LJMthVd^UCP_kR> z>1lFAj1ENB&4HI+kKu=rj8ilY2}645m*6sZ5(A{xp?z37wsS0*!LsM5%jn8%F;Le~ zQM9!|F)uc#GZ!(0D=$QJ(UFVjs2ivc@y?&htfv2oinKTr7PkfCC2>_cdu3UX)eQ?} z4KZ7KQTo=}VZssRXUn`U8?p+1sUVW8qV~)=W_$^4HMG^y)(}gkt%<f}v^CLYcmU&C z;u>PSjdj~tm)O9Wu>qoAbif#0u?EKIU~U)v>zI2<TsG^ifhD@8<%-zAnDuXgAHM{s zHnUC<O^@ep@4v?^>qB=DbneqpFdVsXuoTXs-LZmasTAbk`mt~$nT`^n-86B-#20s{ zp9tkn!^J}*C={fI3Ed}wp7^0#*xN09$({R`OK#V1n7M^)XL{X0FP4<T_4U1c{1$>{ z>iSCgQ^=fX>B7r*(-BROf1r&aV>*&<Jc$NUxyjCAWexoh6vI@Cx!n00PyBE~sw#PU z^z9&awWOfaJu?9joHgcZ=xn*r&D$ZGt!prxslMXGg(GVh-jrI$)*ch=kO})a&L_CE z<-x5{mV^a+mA10(eA&fb2q7o-Bbk+rtUV_y>j_Mh)jThVgVgh~)`G!|I1O(u4~9Eh zhC7NxP&cW#g@TC8^M;|XwdXAYM*R?dKgFv}AXM6{!Vaz#mRfjGzu3BGn>DkFlIcXn zb4sM}ol_!F8$y_o_RrZ7^oH&R1*3J3@#b9b@qUOkUCb~GqrQrI=8)rnMJeQSE#9OW zt-O#v>lj9wuSHmVfDzhc5su9oC7apo;0G5dbbcnbCZyCI6yH~`+%Lv{Ix3Vh;M=N$ zMY9?SXgX(#nf)$Otd)ybIN5LKO4(2fFO<6ZTBV9v5P{B`R~0H;^Z_mTJ_>Ts{fcr^ zIIA&|G1#7cXp7QwoMvfh-VWE@a}G<wp?2fK<*k`_nVov9_#(gSl@*<hS$%$NsCV(L zmZ|8|fSl2DAqfgzCsUfRI%8?|V|0IsH#e<aV@=kyo9tlobtup=g$=G_&Z*<V*p?um zhg^Q{v-j|kS|@<u(0*wjK~42`YLn_vm_4_T%22*^SVk;Ec>{!#17v`3wt%+TjE<#q zK#<NeAn0&1z~pEcAS$_^pAmK*yl26953BtiuWq8SDoxvA4r>6A*TX@(LMo#_4g~Yq zDChb=#0Rv3S@&zIlOl4D**7e;kF6tMa6+cHPMnw4O9m#h_R1JnSNCT<<#`XKKlawa zU(TE5^br&ybJ1=P?<6YnDW7%yK{81Vn-?=5B3AnD;}O^%|HEKkhErEeK-&psBBzVf z0CVGAm;B2`0z5m}a5_D~=|o4ENmg$6+?`20%+ux|o%Sl~Hk8epUrew>BtKFrQ6L<o zd0AyL2Jy(OI-9F{7zxY1jUT=Q5yz9%qmgG#@-qyG@ai@S3&yZnrCecc)Y|OeYN6CA zMxE^dwy(xd2gD4o25K4W5UZL%CA)!75v&^)_|!fDo4#a6rNh#mjr_p+vyFBKJUjEr zp0kzJG_<26-LNZ+?_v=;)@CO<pyM6NiHT})vdnG*`LJ^Ckw3>2zC;Uok-1LrRr8VR z#RR^RH_cOyGuVLkC~t(4f5d9KhQhKN0H$^EQB#bbb1?ZR#i~JqfX3O9pR808O*uz) zYExczY!fE%R-gkvWhaQ^yavClY#H4$ra=tvU>)@q6)uX*nc!qqzd-e1<IxN^*I27a zfB+X5jpWEGo;jHnnTU6MA<jU^*Qsp*^9(!eN`9mkpptdGRC8l08g&-B3cLiseS>M5 zjt~oe<(RitA_yDyLR=%Qx$5-uSqMa28Mk_uDRZEV0+~a@n+bz@)AJ~en)OsYPb5P$ z+wquJar>aeOA$xpj7?l_(uHivq!D?dXox&#GD;&1Ppd9!SqUDch^Z8rOpy^4k*uN< zI$NG4BSRU6MM6S{JKXd~G>Ec!^#%$`Q1lHHwI!!)v0D|p)M?nPQ^(tEvR0$jLak!P zlCp29bqvlb>2wT>8Tt8&xvr#166!wgEZW>Bco}))c&f;&czHYp%(;-pstwbC3mL9b zWOM#;amnhRyJYo?1h{V^X?DpnbNgy`(O!g$R#mL0C=67c3QATK{dI%C`~U8t=m6mT z?>voIMla0yeU*ATyOp0-YK62Q^5gP5i&G$lc$;0)`$Q#qR4m#S-KS#8q=_c2LbT29 zzkNeu_~S_59|y(@m2pbCn5vJcAV)H;aw^bFPHAqBwfA$9`+&S&-$H>r!)_wmXybR& UX|i^S{xwUj%B6A(k?64h0akDVH2?qr literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bc2c79adb66c14a1551b8815f0d6d08d8ffbacc GIT binary patch literal 1965 zcmcgtPjBQj6pxen*XdN0MOvs3!bh^SnFHDbD}=V}6|oiUUc#WrlXzy_I!<Ievx?L? zAaPyo7vQifP8|3ue1Kdz@e$y}d!9+!(sDpZSaQb6v)}u@=il$m7Y7Gp4@Ume_w3Vw z=lzB+?FeA;7^a!QBl9vMy`02^;M$jd9>jrL2eKFU;ag7*@?ktA9v|`k`Ciul(a#3i z@P}SJ=7jI_VBsHm&N2eaUN#2HBn!Ur!u{VNf)|pe|6GYe!J>D@?CL9696l{qwRt9T zek#RMaUJ^2#8{D6vNB0|A)A5bw$dsk=mQ4A?!kNl(>#F3B|tv{$S{K=Z$qs2nq<98 zvhd%K*ZvzX>%Z@9{7WBz4A>vw=IPurq3Bweib*=>E4CJerrW53LU5s$RH#Lvb7lcB zUFagGtlK)KFj|oGK?E@ALP#Eso#l*amUGLsajz%cxN#1XqmO7NQtQ5>&r|mb5t*)O zS}4ScSh`rH=7z&(hw3)a&QVrrJa+||8g2|Yj_BDxxS+y7oI>-AvMq2##1v&(vzitQ zEDSeL1p9(>tO+D(=tu6?*`Q>Q^qNT%!m`7X3n_)+kWOZH75ds;>5cNZ?W&Aa=Hhjy zpJ7nT@)AP9rS1HL6fTGEssV_*0_{+B`L}61e@$Olo||~o-g&&=LC%dvhAm-&EM7eh zgT_~7JXk^S^dcUlRc@+040Ipt@nCIgm73<AHgMvK<8c1$X%yX`zdU&~dv1UQGqz$` zG-ofEs%NK)VI|lnGp^QVR+L<s6rKg@VD_b$&kTS(DIq9ZayTm`?8q*ra}8ujiaB^( zGq|UE+Ga7$m}Ou&=czT*D<IQ5z+E#Zr7lurg<3{s-OwesN$WDX<LDkFWuS?8-rI-d zKG73cfm-*l5=jYq)@bZ>iW)_&I-R};3+t5nl5EH&IVUrJ<8K0|N}v7uUsQ?lL4>P^ z|3ZT;WDuZhN#7c)k0~~#@2;4);uO=Owg4gBj6&^-*;b*3E@d%?RsyB}Tj%JUv3XHh z3SG^LQgVtn2Bg)T<-ltmEu*fv98*VyW6EouSPeV?pJC_dHnW}Se^XQkq@@b|cni4e zFm6Xk;w>?-FNVHGHpK6yQj{gn9J{V5ChX}0v=7<#KR_eZ8j?62Z6Evi<pZRstIl2g z{1CQm`FS`dW1`=J_wb+@*t&!YY9Boe@j|7TYh-5JS5;otdW7qfR%nrH35v<+mf|AR zR)S1$`7}Lj-tlnPvYa5A0B+TVz6KuKfp!^;KFf=&lKgY*H3q*=$iyG{li=R{zX0_B BOOXHo literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py new file mode 100644 index 0000000000..2df1042c40 --- /dev/null +++ b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py @@ -0,0 +1,142 @@ + +import json +from typing import Optional + +from cachetools.keys import hashkey + +import numpy as np +from pynwb import NWBFile, ProcessingModule +from pynwb.base import TimeSeries + +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, LimsReadableInterface, NwbReadableInterface, \ + StimulusFileReadableInterface, SyncFileReadableInterface +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_files import ( + StimulusFile, SyncFile +) +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + JsonWritableInterface, NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .stimulus_timestamps.timestamps_processing import ( + get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps) +from allensdk.internal.api import PostgresQueryMixin + + +def from_json_cache_key(cls, dict_repr: dict): + return hashkey(json.dumps(dict_repr)) + + +def from_lims_cache_key( + cls, db, behavior_session_id: int, + ophys_experiment_id: Optional[int] = None +): + return hashkey(behavior_session_id, ophys_experiment_id) + + +class StimulusTimestamps(DataObject, StimulusFileReadableInterface, + SyncFileReadableInterface, JsonReadableInterface, + NwbReadableInterface, LimsReadableInterface, + NwbWritableInterface, JsonWritableInterface): + """A DataObject which contains properties and methods to load, process, + and represent visual behavior stimulus timestamp data. + + Stimulus timestamp data is represented as: + + Numpy array whose length is equal to the number of timestamps collected + and whose values are timestamps (in seconds) + """ + + def __init__( + self, + timestamps: np.ndarray, + stimulus_file: Optional[StimulusFile] = None, + sync_file: Optional[SyncFile] = None + ): + super().__init__(name="stimulus_timestamps", value=timestamps) + self._stimulus_file = stimulus_file + self._sync_file = sync_file + + @classmethod + def from_stimulus_file( + cls, + stimulus_file: StimulusFile) -> "StimulusTimestamps": + stimulus_timestamps = get_behavior_stimulus_timestamps( + stimulus_pkl=stimulus_file.data + ) + + return cls( + timestamps=stimulus_timestamps, + stimulus_file=stimulus_file + ) + + @classmethod + def from_sync_file(cls, sync_file: SyncFile) -> "StimulusTimestamps": + stimulus_timestamps = get_ophys_stimulus_timestamps( + sync_path=sync_file.filepath + ) + return cls( + timestamps=stimulus_timestamps, + sync_file=sync_file + ) + + @classmethod + def from_json(cls, dict_repr: dict) -> "StimulusTimestamps": + if 'sync_file' in dict_repr: + sync_file = SyncFile.from_json(dict_repr=dict_repr) + return cls.from_sync_file(sync_file=sync_file) + else: + stim_file = StimulusFile.from_json(dict_repr=dict_repr) + return cls.from_stimulus_file(stimulus_file=stim_file) + + def from_lims( + cls, + db: PostgresQueryMixin, + behavior_session_id: int, + ophys_experiment_id: Optional[int] = None + ) -> "StimulusTimestamps": + stimulus_file = StimulusFile.from_lims(db, behavior_session_id) + + if ophys_experiment_id: + sync_file = SyncFile.from_lims( + db=db, ophys_experiment_id=ophys_experiment_id) + return cls.from_sync_file(sync_file=sync_file) + else: + return cls.from_stimulus_file(stimulus_file=stimulus_file) + + def to_json(self) -> dict: + if self._stimulus_file is None: + raise RuntimeError( + "StimulusTimestamps DataObject lacks information about the " + "StimulusFile. This is likely due to instantiating from NWB " + "which prevents to_json() functionality" + ) + + output_dict = dict() + output_dict.update(self._stimulus_file.to_json()) + if self._sync_file is not None: + output_dict.update(self._sync_file.to_json()) + return output_dict + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "StimulusTimestamps": + stim_module = nwbfile.processing["stimulus"] + stim_ts_interface = stim_module.get_data_interface("timestamps") + stim_timestamps = stim_ts_interface.timestamps[:] + return cls(timestamps=stim_timestamps) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + stimulus_ts = TimeSeries( + data=self._value, + name="timestamps", + timestamps=self._value, + unit="s" + ) + + stim_mod = ProcessingModule("stimulus", "Stimulus Times processing") + stim_mod.add_data_interface(stimulus_ts) + nwbfile.add_processing_module(stim_mod) + + return nwbfile diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py new file mode 100644 index 0000000000..b34f9b0e1b --- /dev/null +++ b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py @@ -0,0 +1,49 @@ +from typing import Union +from pathlib import Path + +import numpy as np + +from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner + + +def get_behavior_stimulus_timestamps(stimulus_pkl: dict) -> np.ndarray: + """Obtain visual behavior stimuli timing information from a behavior + stimulus *.pkl file. + + Parameters + ---------- + stimulus_pkl : dict + A dictionary containing stimulus presentation timing information + during a behavior session. Presentation timing info is stored as + an array of times between frames (frame time intervals) in + milliseconds. + + Returns + ------- + np.ndarray + Timestamps (in seconds) for presented stimulus frames during a session. + """ + vsyncs = stimulus_pkl["items"]["behavior"]["intervalsms"] + stimulus_timestamps = np.hstack((0, vsyncs)).cumsum() / 1000.0 + return stimulus_timestamps + + +def get_ophys_stimulus_timestamps(sync_path: Union[str, Path]) -> np.ndarray: + """Obtain visual behavior stimuli timing information from a sync *.h5 file. + + Parameters + ---------- + sync_path : Union[str, Path] + The path to a sync *.h5 file that contains global timing information + about multiple data streams (e.g. behavior, ophys, eye_tracking) + during a session. + + Returns + ------- + np.ndarray + Timestamps (in seconds) for presented stimulus frames during a + behavior + ophys session. + """ + aligner = OphysTimeAligner(sync_file=sync_path) + stimulus_timestamps, _ = aligner.clipped_stim_timestamps + return stimulus_timestamps diff --git a/brain_observatory/behavior/data_objects/timestamps/util.py b/brain_observatory/behavior/data_objects/timestamps/util.py new file mode 100644 index 0000000000..8e162adde2 --- /dev/null +++ b/brain_observatory/behavior/data_objects/timestamps/util.py @@ -0,0 +1,5 @@ +import numpy as np + + +def calc_frame_rate(timestamps: np.ndarray): + return np.round(1 / np.mean(np.diff(timestamps)), 0) diff --git a/brain_observatory/behavior/data_objects/trials/__init__.py b/brain_observatory/behavior/data_objects/trials/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/data_objects/trials/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/trials/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb7b657663b70220edef669e0306a2159b485ae9 GIT binary patch literal 223 zcmYL@y$ZrG5XVz+5TOs^U^BRhh##xCh+80BnqXtwq~v0yqnq#H<SV)Q2yRYZ2k{U8 z-yQeGt<!YGNcH^+eSG!!DWPOZ#sNXIJsT&x2Mc}qkI!v069+T_1r(q&1s8CgSUJeO z(=ZjrwJ3aJ9Ogvd6dj7KRRV1^lLqn<j)r!tiY9c)RRHUxS9Gz3=tIYqDWJ7Ja19Zt gb252E9)pDnxs=w~C}q}k&*8lG`dpbs|KXd=zOx8I(f|Me literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/trials/__pycache__/trial.cpython-37.pyc b/brain_observatory/behavior/data_objects/trials/__pycache__/trial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29a8201443166f7bb3f801fe41c9e9344111fa9e GIT binary patch literal 12464 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 PRl){}6^)#c^soOfcMcv? literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/trials/__pycache__/trial_table.cpython-37.pyc b/brain_observatory/behavior/data_objects/trials/__pycache__/trial_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa51285f2c24230dbbf3678285953d51f078cc4e GIT binary patch literal 5263 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 E0owhSnE(I) literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/data_objects/trials/trial.py b/brain_observatory/behavior/data_objects/trials/trial.py new file mode 100644 index 0000000000..e8d3729995 --- /dev/null +++ b/brain_observatory/behavior/data_objects/trials/trial.py @@ -0,0 +1,423 @@ +from typing import List, Dict, Any, Tuple + +import numpy as np + +from allensdk import one +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.licks import Licks +from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards + + +class Trial: + def __init__(self, trial: dict, start: float, end: float, + behavior_stimulus_file: StimulusFile, + index: int, monitor_delay: float, + stimulus_timestamps: StimulusTimestamps, + licks: Licks, rewards: Rewards, stimuli: dict): + self._trial = trial + self._start = start + self._end = self._calculate_trial_end( + trial_end=end, behavior_stimulus_file=behavior_stimulus_file) + self._index = index + self._data = self._match_to_sync_timestamps( + monitor_delay=monitor_delay, + stimulus_timestamps=stimulus_timestamps, licks=licks, + rewards=rewards, stimuli=stimuli) + + @property + def data(self): + return self._data + + def _match_to_sync_timestamps( + self, monitor_delay: float, + stimulus_timestamps: StimulusTimestamps, + licks: Licks, rewards: Rewards, + stimuli: dict) -> Dict[str, Any]: + event_dict = { + (e[0], e[1]): { + 'timestamp': stimulus_timestamps.value[e[3]], + 'frame': e[3]} for e in self._trial['events'] + } + + tr_data = {"trial": self._trial["index"]} + lick_frames = licks.value['frame'].values + timestamps = stimulus_timestamps.value + reward_times = rewards.value['timestamps'].values + + # this block of code is trying to mimic + # https://github.com/AllenInstitute/visual_behavior_analysis + # /blob/master/visual_behavior/translator/foraging2 + # /stimulus_processing.py + # #L377-L381 + # https://github.com/AllenInstitute/visual_behavior_analysis + # /blob/master/visual_behavior/translator/foraging2 + # /extract_movies.py#L59-L94 + # https://github.com/AllenInstitute/visual_behavior_analysis + # /blob/master/visual_behavior/translator/core/annotate.py#L11-L36 + # + # In summary: there are cases where an "epilogue movie" is shown + # after the proper stimuli; we do not want licks that occur + # during this epilogue movie to be counted as belonging to + # the last trial + # https://github.com/AllenInstitute/visual_behavior_analysis + # /issues/482 + + # select licks that fall between trial_start and trial_end; + # licks on the boundary get assigned to the trial that is ending, + # rather than the trial that is starting + if self._end > 0: + valid_idx = np.where(np.logical_and(lick_frames > self._start, + lick_frames <= self._end)) + else: + valid_idx = np.where(lick_frames > self._start) + + valid_licks = lick_frames[valid_idx] + if len(valid_licks) > 0: + tr_data["lick_times"] = timestamps[valid_licks] + else: + tr_data["lick_times"] = np.array([], dtype=float) + + tr_data["reward_time"] = self._get_reward_time( + reward_times, + event_dict[('trial_start', '')]['timestamp'], + event_dict[('trial_end', '')]['timestamp'] + ) + tr_data.update(self._get_trial_data()) + tr_data.update(self._get_trial_timing( + event_dict, + tr_data['lick_times'], + tr_data['go'], + tr_data['catch'], + tr_data['auto_rewarded'], + tr_data['hit'], + tr_data['false_alarm'], + tr_data["aborted"], + timestamps, + monitor_delay + )) + tr_data.update(self._get_trial_image_names(stimuli)) + + self._validate_trial_condition_exclusivity(tr_data=tr_data) + + return tr_data + + @staticmethod + def _get_reward_time(rebased_reward_times, + start_time, + stop_time) -> float: + """extract reward times in time range""" + reward_times = rebased_reward_times[np.where(np.logical_and( + rebased_reward_times >= start_time, + rebased_reward_times <= stop_time + ))] + return float('nan') if len(reward_times) == 0 else one( + reward_times) + + @staticmethod + def _calculate_trial_end(trial_end, + behavior_stimulus_file: StimulusFile) -> int: + if trial_end < 0: + bhv = behavior_stimulus_file.data['items']['behavior']['items'] + if 'fingerprint' in bhv.keys(): + trial_end = bhv['fingerprint']['starting_frame'] + return trial_end + + def _get_trial_data(self) -> Dict[str, Any]: + """ + Infer trial logic from trial log. Returns a dictionary. + + * reward volume: volume of water delivered on the trial, in mL + + Each of the following values is boolean: + + Trial category values are mutually exclusive + * go: trial was a go trial (trial with a stimulus change) + * catch: trial was a catch trial (trial with a sham stimulus change) + + stimulus_change/sham_change are mutually exclusive + * stimulus_change: did the stimulus change (True on 'go' trials) + * sham_change: stimulus did not change, but response was evaluated + (True on 'catch' trials) + + Each trial can be one (and only one) of the following: + * hit (stimulus changed, animal responded in response window) + * miss (stimulus changed, animal did not respond in response window) + * false_alarm (stimulus did not change, + animal responded in response window) + * correct_reject (stimulus did not change, + animal did not respond in response window) + * aborted (animal responded before change time) + * auto_rewarded (reward was automatically delivered following the + change. + This will bias the animals choice and should not be + categorized as hit/miss) + """ + trial_event_names = [val[0] for val in self._trial['events']] + hit = 'hit' in trial_event_names + false_alarm = 'false_alarm' in trial_event_names + miss = 'miss' in trial_event_names + sham_change = 'sham_change' in trial_event_names + stimulus_change = 'stimulus_changed' in trial_event_names + aborted = 'abort' in trial_event_names + + if aborted: + go = catch = auto_rewarded = False + else: + catch = self._trial["trial_params"]["catch"] is True + auto_rewarded = self._trial["trial_params"]["auto_reward"] + go = not catch and not auto_rewarded + + correct_reject = catch and not false_alarm + + if auto_rewarded: + hit = miss = correct_reject = false_alarm = False + + return { + "reward_volume": sum([ + r[0] for r in self._trial.get("rewards", [])]), + "hit": hit, + "false_alarm": false_alarm, + "miss": miss, + "sham_change": sham_change, + "stimulus_change": stimulus_change, + "aborted": aborted, + "go": go, + "catch": catch, + "auto_rewarded": auto_rewarded, + "correct_reject": correct_reject, + } + + @staticmethod + def _get_trial_timing( + event_dict: dict, + licks: List[float], go: bool, catch: bool, auto_rewarded: bool, + hit: bool, false_alarm: bool, aborted: bool, + timestamps: np.ndarray, + monitor_delay: float) -> Dict[str, Any]: + """ + Extract a dictionary of trial timing data. + See trial_data_from_log for a description of the trial types. + + Parameters + ========== + event_dict: dict + Dictionary of trial events in the well-known `pkl` file + licks: List[float] + list of lick timestamps, from the `get_licks` response for + the BehaviorOphysExperiment.api. + go: bool + True if "go" trial, False otherwise. Mutually exclusive with + `catch`. + catch: bool + True if "catch" trial, False otherwise. Mutually exclusive + with `go.` + auto_rewarded: bool + True if "auto_rewarded" trial, False otherwise. + hit: bool + True if "hit" trial, False otherwise + false_alarm: bool + True if "false_alarm" trial, False otherwise + aborted: bool + True if "aborted" trial, False otherwise + timestamps: np.ndarray[1d] + Array of ground truth timestamps for the session + (sync times, if available) + monitor_delay: float + The monitor delay in seconds associated with the session + + Returns + ======= + dict + start_time: float + The time the trial started (in seconds elapsed from + recording start) + stop_time: float + The time the trial ended (in seconds elapsed from + recording start) + trial_length: float + Duration of the trial in seconds + response_time: float + The response time, for non-aborted trials. This is equal + to the first lick in the trial. For aborted trials or trials + without licks, `response_time` is NaN. + change_frame: int + The frame number that the stimulus changed + change_time: float + The time in seconds that the stimulus changed + response_latency: float or None + The time in seconds between the stimulus change and the + animal's lick response, if the trial is a "go", "catch", or + "auto_rewarded" type. If the animal did not respond, + return `float("inf")`. In all other cases, return None. + + Notes + ===== + The following parameters are mutually exclusive (exactly one can + be true): + hit, miss, false_alarm, aborted, auto_rewarded + """ + assert not (aborted and (hit or false_alarm or auto_rewarded)), ( + "'aborted' trials cannot be 'hit', 'false_alarm', " + "or 'auto_rewarded'") + assert not (hit and false_alarm), ( + "both `hit` and `false_alarm` cannot be True, they are mutually " + "exclusive categories") + assert not (go and catch), ( + "both `go` and `catch` cannot be True, they are mutually " + "exclusive " + "categories") + assert not (go and auto_rewarded), ( + "both `go` and `auto_rewarded` cannot be True, they are mutually " + "exclusive categories") + + def _get_response_time(licks: List[float], aborted: bool) -> float: + """ + Return the time the first lick occurred in a non-"aborted" trial. + A response time is not returned for on an "aborted trial", since by + definition, the animal licked before the change stimulus. + """ + if aborted: + return float("nan") + if len(licks): + return licks[0] + else: + return float("nan") + + start_time = event_dict["trial_start", ""]['timestamp'] + stop_time = event_dict["trial_end", ""]['timestamp'] + + response_time = _get_response_time(licks, aborted) + + if go or auto_rewarded: + change_frame = event_dict.get(('stimulus_changed', ''))['frame'] + change_time = timestamps[change_frame] + monitor_delay + elif catch: + change_frame = event_dict.get(('sham_change', ''))['frame'] + change_time = timestamps[change_frame] + monitor_delay + else: + change_time = float("nan") + change_frame = float("nan") + + if not (go or catch or auto_rewarded): + response_latency = None + elif len(licks) > 0: + response_latency = licks[0] - change_time + else: + response_latency = float("inf") + + return { + "start_time": start_time, + "stop_time": stop_time, + "trial_length": stop_time - start_time, + "response_time": response_time, + "change_frame": change_frame, + "change_time": change_time, + "response_latency": response_latency, + } + + def _get_trial_image_names(self, stimuli) -> Dict[str, str]: + """ + Gets the name of the stimulus presented at the beginning of the + trial and + what is it changed to at the end of the trial. + Parameters + ---------- + stimuli: The stimuli presentation log for the behavior session + + Returns + ------- + A dictionary indicating the starting_stimulus and what the + stimulus is + changed to. + + """ + grating_oris = {'horizontal', 'vertical'} + trial_start_frame = self._trial["events"][0][3] + initial_image_category_name, _, initial_image_name = \ + self._resolve_initial_image( + stimuli, trial_start_frame) + if len(self._trial["stimulus_changes"]) == 0: + change_image_name = initial_image_name + else: + ((from_set, from_name), + (to_set, to_name), + _, _) = self._trial["stimulus_changes"][0] + + # do this to fix names if the stimuli is a grating + if from_set in grating_oris: + from_name = f'gratings_{from_name}' + if to_set in grating_oris: + to_name = f'gratings_{to_name}' + assert from_name == initial_image_name + change_image_name = to_name + + return { + "initial_image_name": initial_image_name, + "change_image_name": change_image_name + } + + @staticmethod + def _resolve_initial_image(stimuli, start_frame) -> Tuple[str, str, str]: + """Attempts to resolve the initial image for a given start_frame for + a trial + + Parameters + ---------- + stimuli: Mapping + foraging2 shape stimuli mapping + start_frame: int + start frame of the trial + + Returns + ------- + initial_image_category_name: str + stimulus category of initial image + initial_image_group: str + group name of the initial image + initial_image_name: str + name of the initial image + """ + max_frame = float("-inf") + initial_image_group = '' + initial_image_name = '' + initial_image_category_name = '' + + for stim_category_name, stim_dict in stimuli.items(): + for set_event in stim_dict["set_log"]: + set_frame = set_event[3] + if start_frame >= set_frame >= max_frame: + # hack assumes initial_image_group == initial_image_name, + # only initial_image_name is present for natual_scenes + initial_image_group = initial_image_name = set_event[1] + initial_image_category_name = stim_category_name + if initial_image_category_name == 'grating': + initial_image_name = f'gratings_{initial_image_name}' + max_frame = set_frame + + return initial_image_category_name, initial_image_group, \ + initial_image_name + + def _validate_trial_condition_exclusivity(self, tr_data: dict) -> None: + """ensure that only one of N possible mutually + exclusive trial conditions is True""" + trial_conditions = {} + for key in ['hit', + 'miss', + 'false_alarm', + 'correct_reject', + 'auto_rewarded', + 'aborted']: + trial_conditions[key] = tr_data[key] + + on = [] + for condition, value in trial_conditions.items(): + if value: + on.append(condition) + + if len(on) != 1: + all_conditions = list(trial_conditions.keys()) + msg = f"expected exactly 1 trial condition out of " \ + f"{all_conditions} " + msg += f"to be True, instead {on} were True (trial {self._index})" + raise AssertionError(msg) diff --git a/brain_observatory/behavior/data_objects/trials/trial_table.py b/brain_observatory/behavior/data_objects/trials/trial_table.py new file mode 100644 index 0000000000..6650020bd7 --- /dev/null +++ b/brain_observatory/behavior/data_objects/trials/trial_table.py @@ -0,0 +1,150 @@ +from typing import List, Tuple + +import pandas as pd +from pynwb import NWBFile + +from allensdk.brain_observatory import dict_to_indexed_array +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import DataObject, \ + StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + StimulusFileReadableInterface, NwbReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base\ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.licks import Licks +from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards +from allensdk.brain_observatory.behavior.data_objects.trials.trial import Trial + + +class TrialTable(DataObject, StimulusFileReadableInterface, + NwbReadableInterface, NwbWritableInterface): + def __init__(self, trials: pd.DataFrame): + super().__init__(name='trials', value=trials) + + def to_nwb(self, nwbfile: NWBFile) -> NWBFile: + trials = self.value + order = list(trials.index) + for _, row in trials[['start_time', 'stop_time']].iterrows(): + row_dict = row.to_dict() + nwbfile.add_trial(**row_dict) + + for c in trials.columns: + if c in ['start_time', 'stop_time']: + continue + index, data = dict_to_indexed_array(trials[c].to_dict(), order) + if data.dtype == '<U1': # data type is composed of unicode + # characters + data = trials[c].tolist() + if not len(data) == len(order): + if len(data) == 0: + data = [''] + nwbfile.add_trial_column( + name=c, + description='NOT IMPLEMENTED: %s' % c, + data=data, + index=index) + else: + nwbfile.add_trial_column( + name=c, + description='NOT IMPLEMENTED: %s' % c, + data=data) + return nwbfile + + @classmethod + def from_nwb(cls, nwbfile: NWBFile) -> "TrialTable": + trials = nwbfile.trials.to_dataframe() + if 'lick_events' in trials.columns: + trials.drop('lick_events', inplace=True, axis=1) + trials.index = trials.index.rename('trials_id') + return TrialTable(trials=trials) + + @classmethod + def from_stimulus_file(cls, stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps, + licks: Licks, + rewards: Rewards, + monitor_delay: float + ) -> "TrialTable": + bsf = stimulus_file.data + + stimuli = bsf["items"]["behavior"]["stimuli"] + trial_log = bsf["items"]["behavior"]["trial_log"] + + trial_bounds = cls._get_trial_bounds(trial_log=trial_log) + + all_trial_data = [None] * len(trial_log) + + for idx, trial in enumerate(trial_log): + trial_start, trial_end = trial_bounds[idx] + t = Trial(trial=trial, start=trial_start, end=trial_end, + behavior_stimulus_file=stimulus_file, + index=idx, + monitor_delay=monitor_delay, + stimulus_timestamps=stimulus_timestamps, + licks=licks, rewards=rewards, + stimuli=stimuli + ) + all_trial_data[idx] = t.data + + trials = pd.DataFrame(all_trial_data).set_index('trial') + trials.index = trials.index.rename('trials_id') + + # Order/Filter columns + trials = trials[['initial_image_name', 'change_image_name', + 'stimulus_change', 'change_time', + 'go', 'catch', 'lick_times', 'response_time', + 'response_latency', 'reward_time', 'reward_volume', + 'hit', 'false_alarm', 'miss', 'correct_reject', + 'aborted', 'auto_rewarded', 'change_frame', + 'start_time', 'stop_time', 'trial_length']] + + return TrialTable(trials=trials) + + @staticmethod + def _get_trial_bounds(trial_log: List) -> List[Tuple[int, int]]: + """ + Adjust trial boundaries from a trial_log so that there is no dead time + between trials. + + Parameters + ---------- + trial_log: list + The trial_log read in from the well known behavior stimulus + pickle file + + Returns + ------- + list + Each element in the list is a tuple of the form + (start_frame, end_frame) so that the ith element + of the list gives the start and end frames of + the ith trial. The endframe of the last trial will + be -1, indicating that it should map to the last + timestamp in the session + """ + start_frames = [] + + for trial in trial_log: + start_f = None + for event in trial['events']: + if event[0] == 'trial_start': + start_f = event[-1] + break + if start_f is None: + msg = "Could not find a 'trial_start' event " + msg += "for all trials in the trial log\n" + msg += f"{trial}" + raise ValueError(msg) + + if len(start_frames) > 0 and start_f < start_frames[-1]: + msg = "'trial_start' frames in trial log " + msg += "are not in ascending order" + msg += f"\ntrial_log: {trial_log}" + raise ValueError(msg) + + start_frames.append(start_f) + + end_frames = [idx for idx in start_frames[1:] + [-1]] + return list([(s, e) for s, e in zip(start_frames, end_frames)]) diff --git a/brain_observatory/behavior/dprime.py b/brain_observatory/behavior/dprime.py new file mode 100644 index 0000000000..9519cd703b --- /dev/null +++ b/brain_observatory/behavior/dprime.py @@ -0,0 +1,106 @@ +import pandas as pd +import numpy as np +from scipy.stats import norm + +from allensdk import one + + +SLIDING_WINDOW = 100 + +def get_go_responses(hit=None, miss=None, aborted=None): + assert len(hit) == len(miss) == len(aborted) + not_aborted = np.logical_not(np.array(aborted, dtype=np.bool)) + hit = np.array(hit, dtype=np.bool)[not_aborted] + miss = np.array(miss, dtype=np.bool)[not_aborted] + + # Go responses are nan when catch (aborted are masked out); 0 for miss, 1 for hit + # This allows pd.Series.rolling to ignore non-go trial data + go_responses = np.empty_like(hit, dtype=np.float) + go_responses.fill(float('nan')) + go_responses[hit] = 1 + go_responses[miss] = 0 + return go_responses + + +def get_hit_rate(hit=None, miss=None, aborted=None, sliding_window=SLIDING_WINDOW): + go_responses = get_go_responses(hit=hit, miss=miss, aborted=aborted) + hit_rate = pd.Series(go_responses).rolling(window=sliding_window, min_periods=0).mean().values + return hit_rate + + +def get_trial_count_corrected_hit_rate(hit=None, miss=None, aborted=None, sliding_window=SLIDING_WINDOW): + go_responses = get_go_responses(hit=hit, miss=miss, aborted=aborted) + go_responses_count = pd.Series(go_responses).rolling(window=sliding_window, min_periods=0).count() + hit_rate = pd.Series(go_responses).rolling(window=sliding_window, min_periods=0).mean().values + trial_count_corrected_hit_rate = np.vectorize(trial_number_limit)(hit_rate, go_responses_count) + return trial_count_corrected_hit_rate + + +def get_catch_responses(correct_reject=None, false_alarm=None, aborted=None): + assert len(correct_reject) == len(false_alarm) == len(aborted) + not_aborted = np.logical_not(np.array(aborted, dtype=np.bool)) + correct_reject = np.array(correct_reject, dtype=np.bool)[not_aborted] + false_alarm = np.array(false_alarm, dtype=np.bool)[not_aborted] + + # Catch responses are nan when go (aborted are masked out); 0 for correct-rejection, 1 for false-alarm + # This allows pd.Series.rolling to ignore non-catch trial data + catch_responses = np.empty_like(correct_reject, dtype=np.float) + catch_responses.fill(float('nan')) + catch_responses[false_alarm] = 1 + catch_responses[correct_reject] = 0 + return catch_responses + + +def get_false_alarm_rate(correct_reject=None, false_alarm=None, aborted=None, sliding_window=SLIDING_WINDOW): + catch_responses = get_catch_responses(correct_reject=correct_reject, false_alarm=false_alarm, aborted=aborted) + false_alarm_rate = pd.Series(catch_responses).rolling(window=sliding_window, min_periods=0).mean().values + return false_alarm_rate + + +def get_trial_count_corrected_false_alarm_rate(correct_reject=None, false_alarm=None, aborted=None, sliding_window=SLIDING_WINDOW): + catch_responses = get_catch_responses(correct_reject=correct_reject, false_alarm=false_alarm, aborted=aborted) + catch_responses_count = pd.Series(catch_responses).rolling(window=sliding_window, min_periods=0).count() + false_alarm_rate = pd.Series(catch_responses).rolling(window=sliding_window, min_periods=0).mean().values + trial_count_corrected_false_alarm_rate = np.vectorize(trial_number_limit)(false_alarm_rate, catch_responses_count) + return trial_count_corrected_false_alarm_rate + + +def get_rolling_dprime(rolling_hit_rate, rolling_fa_rate, sliding_window=SLIDING_WINDOW): + return np.array([get_dprime(hr, far, sliding_window=SLIDING_WINDOW) for hr, far in zip(rolling_hit_rate, rolling_fa_rate)]) + + +def get_dprime(hit_rate, fa_rate, sliding_window=SLIDING_WINDOW): + """ calculates the d-prime for a given hit rate and false alarm rate + https://en.wikipedia.org/wiki/Sensitivity_index + Parameters + ---------- + hit_rate : float + rate of hits in the True class + fa_rate : float + rate of false alarms in the False class + limits : tuple, optional + limits on extreme values, which distort. default: (0.01,0.99) + Returns + ------- + d_prime + """ + + limits = (1/SLIDING_WINDOW, 1 - 1/SLIDING_WINDOW) + assert limits[0] > 0.0, 'limits[0] must be greater than 0.0' + assert limits[1] < 1.0, 'limits[1] must be less than 1.0' + Z = norm.ppf + + # Limit values in order to avoid d' infinity + hit_rate = np.clip(hit_rate, limits[0], limits[1]) + fa_rate = np.clip(fa_rate, limits[0], limits[1]) + d_prime = Z(pd.Series(hit_rate)) - Z(pd.Series(fa_rate)) + return one(d_prime) + + +def trial_number_limit(p, N): + if N == 0: + return np.nan + if not pd.isnull(p): + p = np.max((p, 1. / (2 * N))) + p = np.min((p, 1 - 1. / (2 * N))) + return p diff --git a/brain_observatory/behavior/event_detection.py b/brain_observatory/behavior/event_detection.py new file mode 100644 index 0000000000..9fd88b730b --- /dev/null +++ b/brain_observatory/behavior/event_detection.py @@ -0,0 +1,41 @@ +import numpy as np +from scipy import stats + + +def filter_events_array(arr: np.ndarray, scale: float = 2, + n_time_steps: int = 20) -> np.ndarray: + """ + Convolve the trace array with a 1d causal half-gaussian filter + to smooth it for visualization + + Uses a halfnorm distribution as weights to the filter + + Modified from initial implementation by Nick Ponvert + + Parameters + ---------- + arr: np.ndarray + Trace matrix of dimension n traces x n frames + scale: float + std deviation of halfnorm distribution + n_time_steps: int + number of time steps to use for the convolution operation + + Returns + ---------- + np.ndarray: + Output of the convolution operation + """ + if len(arr.shape) == 1: + raise ValueError('Expected a 2d array but received a 1d array') + + if n_time_steps < 1: + raise ValueError(f'n_time_steps must be a minimum of 1 but received ' + f'{n_time_steps}') + + filt = stats.halfnorm(loc=0, scale=scale).pdf(np.arange(n_time_steps)) + filt = filt / np.sum(filt) # normalize filter + filtered_arr = np.zeros(arr.shape) + for i, trace in enumerate(arr): + filtered_arr[i] = np.convolve(arr[i], filt)[:len(arr[i])] + return filtered_arr diff --git a/brain_observatory/behavior/eye_tracking_processing.py b/brain_observatory/behavior/eye_tracking_processing.py new file mode 100644 index 0000000000..7333487794 --- /dev/null +++ b/brain_observatory/behavior/eye_tracking_processing.py @@ -0,0 +1,243 @@ +from pathlib import Path + +import numpy as np +import pandas as pd + +from scipy import ndimage, stats + + +def load_eye_tracking_hdf(eye_tracking_file: Path) -> pd.DataFrame: + """Load a DeepLabCut hdf5 file containing eye tracking data into a + dataframe. + + Note: The eye tracking hdf5 file contains 3 separate dataframes. One for + corneal reflection (cr), eye, and pupil ellipse fits. This function + loads and returns this data as a single dataframe. + + Parameters + ---------- + eye_tracking_file : Path + Path to an hdf5 file produced by the DeepLabCut eye tracking pipeline. + The hdf5 file will contain the following keys: "cr", "eye", "pupil". + Each key has an associated dataframe with the following + columns: "center_x", "center_y", "height", "width", "phi". + + Returns + ------- + pd.DataFrame + A dataframe containing combined corneal reflection (cr), eyelid (eye), + and pupil data. Column names for each field will be renamed by + prepending the field name. (e.g. center_x -> eye_center_x) + """ + eye_tracking_fields = ["cr", "eye", "pupil"] + + eye_tracking_dfs = [] + for field_name in eye_tracking_fields: + field_data = pd.read_hdf(eye_tracking_file, key=field_name) + new_col_name_map = {col_name: f"{field_name}_{col_name}" + for col_name in field_data.columns} + field_data.rename(new_col_name_map, axis=1, inplace=True) + eye_tracking_dfs.append(field_data) + + eye_tracking_data = pd.concat(eye_tracking_dfs, axis=1) + eye_tracking_data.index.name = 'frame' + + # Values in the hdf5 may be complex (likely an artifact of the ellipse + # fitting process). Take only the real component. + eye_tracking_data = eye_tracking_data.apply(lambda x: np.real(x.to_numpy())) # noqa: E501 + + return eye_tracking_data.astype(float) + + +def determine_outliers(data_df: pd.DataFrame, + z_threshold: float) -> pd.Series: + """Given a dataframe and some z-score threshold return a pandas boolean + Series where each entry indicates whether a given row contains at least + one outlier (where outliers are calculated along columns). + + Parameters + ---------- + data_df : pd.DataFrame + A dataframe containing only columns where outlier detection is + desired. (e.g. "cr_area", "eye_area", "pupil_area") + z_threshold : float + z-score values higher than the z_threshold will be considered outliers. + + Returns + ------- + pd.Series + A pandas boolean Series whose length == len(data_df.index). + True denotes that a row in the data_df contains at least one outlier. + """ + + outliers = data_df.apply(stats.zscore, + nan_policy='omit').apply(np.abs) > z_threshold + return pd.Series(outliers.any(axis=1)) + + +def compute_circular_area(df_row: pd.Series) -> float: + """Calculate the area of the pupil as a circle using the max of the + height/width as radius. + + Note: This calculation assumes that the pupil is a perfect circle + and any eccentricity is a result of the angle at which the pupil is + being viewed. + + Parameters + ---------- + df_row : pd.Series + A row from an eye tracking dataframe containing only "pupil_width" + and "pupil_height". + + Returns + ------- + float + The circular area of the pupil in pixels^2. + """ + max_dim = max(df_row.iloc[0], df_row.iloc[1]) + return np.pi * max_dim * max_dim + + +def compute_elliptical_area(df_row: pd.Series) -> float: + """Calculate the area of corneal reflection (cr) or eye ellipse fits using + the ellipse formula. + + Parameters + ---------- + df_row : pd.Series + A row from an eye tracking dataframe containing either: + "cr_width", "cr_height" + or + "eye_width", "eye_height" + + Returns + ------- + float + The elliptical area of the eye or cr in pixels^2 + """ + return np.pi * df_row.iloc[0] * df_row.iloc[1] + + +def determine_likely_blinks(eye_areas: pd.Series, + pupil_areas: pd.Series, + outliers: pd.Series, + dilation_frames: int = 2) -> pd.Series: + """Determine eye tracking frames which contain likely blinks or outliers + + Parameters + ---------- + eye_areas : pd.Series + A pandas series of eye areas. + pupil_areas : pd.Series + A pandas series of pupil areas. + outliers : pd.Series + A pandas series containing bool values of outlier rows. + dilation_frames : int, optional + Determines the number of additional adjacent frames to mark as + 'likely_blink', by default 2. + + Returns + ------- + pd.Series + A pandas series of bool values that has the same length as the number + of eye tracking dataframe rows (frames). + """ + blinks = pd.isnull(eye_areas) | pd.isnull(pupil_areas) | outliers + if dilation_frames > 0: + likely_blinks = ndimage.binary_dilation(blinks, + iterations=dilation_frames) + else: + likely_blinks = blinks + return pd.Series(likely_blinks) + + +def process_eye_tracking_data(eye_data: pd.DataFrame, + frame_times: pd.Series, + z_threshold: float = 3.0, + dilation_frames: int = 2) -> pd.DataFrame: + """Processes and refines raw eye tracking data by adding additional + computed feature columns. + + Parameters + ---------- + eye_data : pd.DataFrame + A 'raw' eye tracking dataframe produced by load_eye_tracking_hdf() + frame_times : pd.Series + A series of frame times acquired from a behavior + ophy session + 'sync file'. + z_threshold : float + z-score values higher than the z_threshold will be considered outliers, + by default 3.0. + dilation_frames : int, optional + Determines the number of additional adjacent frames to mark as + 'likely_blink', by default 2. + + Returns + ------- + pd.DataFrame + A refined eye tracking dataframe that contains additional information + about frame times, eye areas, pupil areas, and frames with likely + blinks/outliers. + + Raises + ------ + RuntimeError + If the number of sync file frame times does not match the number of + eye tracking frames. + """ + + n_sync = len(frame_times) + n_eye_frames = len(eye_data.index) + + # If n_sync exceeds n_eye_frames by <= 15, + # just trim the excess sync pulses from the end + # of the timestamps array. + # + # This solution was discussed in + # https://github.com/AllenInstitute/AllenSDK/issues/1545 + + if n_sync > n_eye_frames and n_sync <= n_eye_frames+15: + frame_times = frame_times[:n_eye_frames] + n_sync = len(frame_times) + + if n_sync != n_eye_frames: + raise RuntimeError(f"Error! The number of sync file frame times " + f"({len(frame_times)}) does not match the " + f"number of eye tracking frames " + f"({len(eye_data.index)})!") + + cr_areas = (eye_data[["cr_width", "cr_height"]] + .apply(compute_elliptical_area, axis=1)) + eye_areas = (eye_data[["eye_width", "eye_height"]] + .apply(compute_elliptical_area, axis=1)) + pupil_areas = (eye_data[["pupil_width", "pupil_height"]] + .apply(compute_circular_area, axis=1)) + + # only use eye and pupil areas for outlier detection + area_df = pd.concat([eye_areas, pupil_areas], axis=1) + outliers = determine_outliers(area_df, z_threshold=z_threshold) + + likely_blinks = determine_likely_blinks(eye_areas, + pupil_areas, + outliers, + dilation_frames=dilation_frames) + + # remove outliers/likely blinks `pupil_area`, `cr_area`, `eye_area` + pupil_areas_raw = pupil_areas.copy() + cr_areas_raw = cr_areas.copy() + eye_areas_raw = eye_areas.copy() + + pupil_areas[likely_blinks] = np.nan + cr_areas[likely_blinks] = np.nan + eye_areas[likely_blinks] = np.nan + + eye_data.insert(0, "timestamps", frame_times) + eye_data.insert(1, "cr_area", cr_areas) + eye_data.insert(2, "eye_area", eye_areas) + eye_data.insert(3, "pupil_area", pupil_areas) + eye_data.insert(4, "likely_blink", likely_blinks) + eye_data.insert(5, "pupil_area_raw", pupil_areas_raw) + eye_data.insert(6, "cr_area_raw", cr_areas_raw) + eye_data.insert(7, "eye_area_raw", eye_areas_raw) + + return eye_data diff --git a/brain_observatory/behavior/image_api.py b/brain_observatory/behavior/image_api.py new file mode 100644 index 0000000000..8418d1bcdf --- /dev/null +++ b/brain_observatory/behavior/image_api.py @@ -0,0 +1,45 @@ +import SimpleITK as sitk +import numpy as np +from typing import NamedTuple + + +class Image(NamedTuple): + ''' Describes a 2D Image + + data : np.ndarray + Image data points + spacing : tuple + Spacing describes the physical size of each pixel + unit : str + Physical unit of the spacing (currently constrained to be isotropic) + ''' + + data: np.ndarray + spacing: tuple + unit: str = 'mm' + + def __eq__(self, other): + a = np.array_equal(self.data, other.data) + b = self.spacing == other.spacing + c = self.unit == other.unit + return a and b and c + + def __array__(self): + return np.array(self.data) + + +class ImageApi: + + @staticmethod + def serialize(data, spacing, unit): + img = sitk.GetImageFromArray(data) + img.SetSpacing(np.array(spacing, dtype=np.double)) + img.SetMetaData('unit', unit) + return img + + @staticmethod + def deserialize(img): + data = sitk.GetArrayFromImage(img) + spacing = img.GetSpacing() + unit = img.GetMetaData('unit') + return Image(data, spacing, unit) diff --git a/brain_observatory/behavior/mtrain.py b/brain_observatory/behavior/mtrain.py new file mode 100644 index 0000000000..002e4bf8b1 --- /dev/null +++ b/brain_observatory/behavior/mtrain.py @@ -0,0 +1,409 @@ +from marshmallow import Schema, fields +from datetime import datetime, date +import numpy as np + + +def annotate_change_detect(trials): + """ adds `change` and `detect` columns to dataframe + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + inplace : bool, optional + modify `trials` in place. if False, returns a copy. default: True + + See Also + -------- + io.load_trials + """ + + trials['change'] = trials['trial_type'] == 'go' + trials['detect'] = trials['response'] == 1.0 + + return trials + + +def assign_session_id(trials): + """ adds a column with a unique ID for the session defined as + a combination of the mouse ID and startdatetime + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + inplace : bool, optional + modify `trials` in place. if False, returns a copy. default: True + + See Also + -------- + io.load_trials + """ + trials['session_id'] = (trials['mouse_id'] + + '_' + + trials['startdatetime'].map( + lambda x: x.isoformat())) + + return trials + + +def fix_change_time(trials): + """ forces `None` values in the `change_time` column to numpy NaN + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + inplace : bool, optional + modify `trials` in place. if False, returns a copy. default: True + + See Also + -------- + io.load_trials + """ + trials['change_time'] = trials['change_time'].map( + lambda x: np.nan if x is None else x) + + return trials + + +def explode_response_window(trials): + """ explodes the `response_window` column in lower & upper columns + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + inplace : bool, optional + modify `trials` in place. if False, returns a copy. default: True + + See Also + -------- + io.load_trials + """ + trials['response_window_lower'] = \ + trials['response_window'].map(lambda x: x[0]) + trials['response_window_upper'] = \ + trials['response_window'].map(lambda x: x[1]) + + return trials + + +def annotate_trials(trials): + """ performs multiple annotatations: + + - annotate_change_detect + - fix_change_time + - explode_response_window + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + inplace : bool, optional + modify `trials` in place. if False, returns a copy. default: True + + See Also + -------- + io.load_trials + """ + # build arrays for change detection + trials = annotate_change_detect(trials) + + # assign a session ID to each row + trials = assign_session_id(trials) + + # calculate reaction times + trials = fix_change_time(trials) + + # unwrap the response window + trials = explode_response_window(trials) + + return trials + + +class FriendlyDateTime(fields.DateTime): + def _deserialize(self, value, attr, data, **kwargs): + if isinstance(value, datetime): + return value + result = super(FriendlyDateTime, self)._deserialize(value, attr, data) + return result + + +class FriendlyDate(fields.Date): + def _deserialize(self, value, attr, data, **kwargs): + if isinstance(value, date): + return value + result = super(FriendlyDate, self)._deserialize(value, attr, data) + return result + + +class ExtendedTrialSchema(Schema): + """ + This schema describes the edf core trial structure + """ + + index = fields.Int( + description='Trial number in this session', + required=True, + ) + startframe = fields.Int( + description='frame when this trial starts', + required=True, + ) + starttime = fields.Float( + description='time in seconds when this trial starts', + required=True, + ) + endframe = fields.Int( + description='frame when this trial ends', + required=True, + ) + endtime = fields.Float( + description='time in seconds when this trial ends', + required=True, + ) + trial_length = fields.Float( + required=True, + ) + + # timing paramters + change_frame = fields.Float( + description='The stimulus frame when the change occured on this trial', + required=True, + allow_nan=True, + ) + scheduled_change_time = fields.Float( + description=("The time when the change was scheduled to occur " + "on this trial"), + required=True, + ) + change_time = fields.Float( + description='The time when the change occured on this trial', + required=True, + allow_nan=True, + ) + + # image parameters + initial_image_category = fields.String( + description='The category of the initial images on this trial', + required=True, + allow_none=True, + ) + initial_image_name = fields.String( + description=("The name of the last initial image before the " + "change on this trial"), + required=True, + allow_none=True, + ) + change_image_category = fields.String( + description='The category of the change images on this trial', + required=True, + allow_none=True, + ) + change_image_name = fields.String( + description='The name of the first change image on this trial', + required=True, + allow_none=True, + ) + + # oriented gratings paramters + initial_contrast = fields.Float( + description='The contrast of the initial orientation on this trial', + required=True, + allow_none=True, + ) + change_contrast = fields.Float( + description='The contrast of the change orientation on this trial', + required=True, + allow_none=True, + ) + initial_ori = fields.Float( + description='The orientation of the initial orientation on this trial', + required=True, + allow_none=True, + ) + change_ori = fields.Float( + description='The orientation of the change orientation on this trial', + required=True, + allow_none=True, + allow_nan=True, + ) + delta_ori = fields.Float( + description=("The difference between the initial and change " + "orientations on this trial"), + required=True, + allow_none=True, + ) + + # licks + lick_times = fields.List( + fields.Float, + description='times of licks on this trial', + required=True, + ) + response_latency = fields.Float( + description=("The latency between the change and the first lick " + "on this trial"), + required=True, + allow_nan=True, + ) + response_time = fields.List( + fields.Float, + description='need to check this with Doug', + required=True, + ) + reward_frames = fields.List( + fields.Int, + required=True, + ) + reward_times = fields.List( + fields.Float, + required=True, + ) + reward_volume = fields.Float( + required=True, + ) + rewarded = fields.Bool( + required=True, + ) + + auto_rewarded = fields.Bool( + description='whether this trial was an auto_rewarded trial', + required=True, + allow_none=True, + ) + cumulative_reward_number = fields.Int( + description=("the cumulative number of rewards in the session at " + "trial end"), + required=True, + ) + cumulative_volume = fields.Float( + description='the total volume of rewards in the session at trial end', + required=True, + ) + + # optogenetics + optogenetics = fields.Bool( + description=("whether optogenetic stimulation was applied " + "on this trial"), + required=True, + ) + + blank_duration_range = fields.List( + fields.Float, + required=True, + ) + blank_screen_timeout = fields.Bool( + required=True, + ) + color = fields.String( + required=True, + ) + computer_name = fields.String( + required=True, + ) + distribution_mean = fields.Float( + required=True, + ) + LDT_mode = fields.String( + required=True, + ) + lick_frames = fields.List( + fields.Integer(strict=True), + required=True, + ) + mouse_id = fields.String( + required=True, + ) + number_of_rewards = fields.Integer( + required=True, + strict=True, + ) + prechange_minimum = fields.Float( + required=True, + ) + response = fields.Float( + required=True, + ) + response_type = fields.String( + required=True, + ) + response_window = fields.List( + fields.Float, + required=True, + ) + reward_licks = fields.List( + fields.Float, + required=True, + allow_none=True, + ) + reward_lick_count = fields.Integer( + required=True, + # strict=True, + allow_none=True, + ) + reward_lick_latency = fields.Float( + allow_none=True, + allow_nan=True, + ) + reward_rate = fields.Float( + allow_none=True, + allow_nan=True, + ) + rig_id = fields.String( + required=True, + ) + session_duration = fields.Float( + required=True, + ) + stage = fields.String( + required=True, + ) + stim_duration = fields.Float( + required=True, + ) + stimulus = fields.String( + required=True, + ) + stimulus_distribution = fields.String( + required=True, + ) + task = fields.String( + required=True, + ) + trial_type = fields.String( + required=True, + ) + user_id = fields.String( + required=True, + ) + startdatetime = FriendlyDateTime( + required=True, + strict=True, + ) + date = FriendlyDate( + required=True, + ) + year = fields.Integer( + strict=True + ) + month = fields.Integer( + required=True, + strict=True, + ) + day = fields.Integer( + required=True, + strict=True, + ) + hour = fields.Integer( + required=True, + strict=True, + ) + dayofweek = fields.Integer( + strict=True, + required=True, + ) + behavior_session_uuid = fields.UUID( + required=True, + ) diff --git a/brain_observatory/behavior/ophys_experiment.py b/brain_observatory/behavior/ophys_experiment.py new file mode 100644 index 0000000000..5dcb0aafc4 --- /dev/null +++ b/brain_observatory/behavior/ophys_experiment.py @@ -0,0 +1,749 @@ +from typing import Optional + +import numpy as np +import pandas as pd +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.behavior_session import ( + BehaviorSession) +from allensdk.brain_observatory.behavior.ophys_session import ( + OphysSession) +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ + EyeTrackingFile +from allensdk.brain_observatory.behavior.data_files\ + .rigid_motion_transform_file import \ + RigidMotionTransformFile +from allensdk.brain_observatory.behavior.data_objects import \ + OphysSessionId, StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.cell_specimens \ + .cell_specimens import \ + CellSpecimens, EventsParams +from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ + .eye_tracking_table import \ + EyeTrackingTable +from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ + .rig_geometry import \ + RigGeometry as EyeTrackingRigGeometry +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.date_of_acquisition import \ + DateOfAcquisitionOphys, DateOfAcquisition +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata.imaging_plane_group \ + import \ + ImagingPlaneGroup +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata.multi_plane_metadata \ + import \ + MultiplaneMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.ophys_experiment_metadata \ + import \ + OphysExperimentMetadata +from allensdk.brain_observatory.behavior.data_objects.motion_correction \ + import \ + MotionCorrection +from allensdk.brain_observatory.behavior.data_objects.projections import \ + Projections +from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ + calculate_monitor_delay +from allensdk.brain_observatory.behavior.data_objects.timestamps \ + .ophys_timestamps import \ + OphysTimestamps, OphysTimestampsMultiplane +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.deprecated import legacy +from allensdk.brain_observatory.behavior.image_api import Image +from allensdk.internal.api import db_connection_creator + + +class OphysExperiment(OphysSession): + """Represents data from a single Visual Behavior Ophys imaging session. + Initialize by using class methods `from_lims` or `from_nwb_path`. + """ + + def __init__(self, + behavior_session: OphysSession, + projections: Projections, + ophys_timestamps: OphysTimestamps, + cell_specimens: CellSpecimens, + metadata: MultiplaneMetadata, + motion_correction: MotionCorrection, + #eye_tracking_table: Optional[EyeTrackingTable], + #eye_tracking_rig_geometry: Optional[EyeTrackingRigGeometry], + date_of_acquisition: DateOfAcquisition): + super().__init__( + behavior_session_id=behavior_session._behavior_session_id, + metadata=behavior_session._metadata, + raw_running_speed=behavior_session._raw_running_speed, + running_speed=behavior_session._running_speed, + running_acquisition=behavior_session._running_acquisition, + #stimuli=behavior_session._stimuli, + stimulus_timestamps=behavior_session._stimulus_timestamps, + #task_parameters=behavior_session._task_parameters, + #date_of_acquisition=date_of_acquisition + ) + + self._metadata = metadata + self._projections = projections + self._ophys_timestamps = ophys_timestamps + self._cell_specimens = cell_specimens + self._motion_correction = motion_correction + #self._eye_tracking = eye_tracking_table + #self._eye_tracking_rig_geometry = eye_tracking_rig_geometry + + def to_nwb(self) -> NWBFile: + nwbfile = super().to_nwb(add_metadata=False) + + self._metadata.to_nwb(nwbfile=nwbfile) + self._projections.to_nwb(nwbfile=nwbfile) + self._cell_specimens.to_nwb(nwbfile=nwbfile, + ophys_timestamps=self._ophys_timestamps) + self._motion_correction.to_nwb(nwbfile=nwbfile) + #self._eye_tracking.to_nwb(nwbfile=nwbfile) + #self._eye_tracking_rig_geometry.to_nwb(nwbfile=nwbfile) + + return nwbfile + # ==================== class and utility methods ====================== + + @classmethod + def from_lims(cls, + ophys_experiment_id: int, + eye_tracking_z_threshold: float = 3.0, + eye_tracking_dilation_frames: int = 2, + events_filter_scale: float = 2.0, + events_filter_n_time_steps: int = 20, + exclude_invalid_rois=True, + skip_eye_tracking=False) -> \ + "OphysExperiment": + """ + Parameters + ---------- + ophys_experiment_id + eye_tracking_z_threshold + See `OphysExperiment.from_nwb` + eye_tracking_dilation_frames + See `OphysExperiment.from_nwb` + events_filter_scale + See `OphysExperiment.from_nwb` + events_filter_n_time_steps + See `OphysExperiment.from_nwb` + exclude_invalid_rois + Whether to exclude invalid rois + skip_eye_tracking + Used to skip returning eye tracking data + """ + def _is_multi_plane_session(): + imaging_plane_group_meta = ImagingPlaneGroup.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + return cls._is_multi_plane_session( + imaging_plane_group_meta=imaging_plane_group_meta) + + def _get_motion_correction(): + rigid_motion_transform_file = RigidMotionTransformFile.from_lims( + ophys_experiment_id=ophys_experiment_id, db=lims_db + ) + return MotionCorrection.from_data_file( + rigid_motion_transform_file=rigid_motion_transform_file) + + def _get_eye_tracking_table(sync_file: SyncFile): + eye_tracking_file = EyeTrackingFile.from_lims( + db=lims_db, ophys_experiment_id=ophys_experiment_id) + eye_tracking_table = EyeTrackingTable.from_data_file( + data_file=eye_tracking_file, + sync_file=sync_file, + z_threshold=eye_tracking_z_threshold, + dilation_frames=eye_tracking_dilation_frames + ) + return eye_tracking_table + + lims_db = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP + ) + sync_file = SyncFile.from_lims(db=lims_db, + ophys_experiment_id=ophys_experiment_id) + stimulus_timestamps = StimulusTimestamps.from_sync_file( + sync_file=sync_file) + #behavior_session_id = OphysSessionId.from_lims( + # lims_db=lims_db, ophys_experiment_id=ophys_experiment_id) + is_multiplane_session = _is_multi_plane_session() + meta = MultiplaneMetadata.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, + ) + date_of_acquisition = DateOfAcquisitionOphys.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + behavior_session = OphysSession.from_lims( + lims_db=lims_db, + behavior_session_id=ophys_experiment_id, + stimulus_timestamps=stimulus_timestamps, + date_of_acquisition=date_of_acquisition + ) + if is_multiplane_session: + ophys_timestamps = OphysTimestampsMultiplane.from_sync_file( + sync_file=sync_file, + group_count=meta.imaging_plane_group_count, + plane_group=meta.imaging_plane_group + ) + else: + ophys_timestamps = OphysTimestamps.from_sync_file( + sync_file=sync_file) + + projections = Projections.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + cell_specimens = CellSpecimens.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, + ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=projections.max_projection.spacing, + events_params=EventsParams( + filter_scale=events_filter_scale, + filter_n_time_steps=events_filter_n_time_steps), + exclude_invalid_rois=exclude_invalid_rois + ) + motion_correction = _get_motion_correction() + if skip_eye_tracking: + eye_tracking_table = None + eye_tracking_rig_geometry = None + else: + eye_tracking_table = _get_eye_tracking_table(sync_file=sync_file) + eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) + + return OphysExperiment( + behavior_session=behavior_session, + cell_specimens=cell_specimens, + ophys_timestamps=ophys_timestamps, + metadata=meta, + projections=projections, + motion_correction=motion_correction, + #eye_tracking_table=eye_tracking_table, + #eye_tracking_rig_geometry=eye_tracking_rig_geometry, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile, + eye_tracking_z_threshold: float = 3.0, + eye_tracking_dilation_frames: int = 2, + events_filter_scale: float = 2.0, + events_filter_n_time_steps: int = 20, + exclude_invalid_rois=True + ) -> "OphysExperiment": + """ + + Parameters + ---------- + nwbfile + eye_tracking_z_threshold : float, optional + The z-threshold when determining which frames likely contain + outliers for eye or pupil areas. Influences which frames + are considered 'likely blinks'. By default 3.0 + eye_tracking_dilation_frames : int, optional + Determines the number of adjacent frames that will be marked + as 'likely_blink' when performing blink detection for + `eye_tracking` data, by default 2 + events_filter_scale : float, optional + Stdev of halfnorm distribution used to convolve ophys events with + a 1d causal half-gaussian filter to smooth it for visualization, + by default 2.0 + events_filter_n_time_steps : int, optional + Number of time steps to use for convolution of ophys events + exclude_invalid_rois + Whether to exclude invalid rois + """ + def _is_multi_plane_session(): + imaging_plane_group_meta = ImagingPlaneGroup.from_nwb( + nwbfile=nwbfile) + return cls._is_multi_plane_session( + imaging_plane_group_meta=imaging_plane_group_meta) + + behavior_session = OphysSession.from_nwb(nwbfile=nwbfile) + projections = Projections.from_nwb(nwbfile=nwbfile) + cell_specimens = CellSpecimens.from_nwb( + nwbfile=nwbfile, + segmentation_mask_image_spacing=projections.max_projection.spacing, + events_params=EventsParams( + filter_scale=events_filter_scale, + filter_n_time_steps=events_filter_n_time_steps + ), + exclude_invalid_rois=exclude_invalid_rois + ) + eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_nwb( + nwbfile=nwbfile) + eye_tracking_table = EyeTrackingTable.from_nwb( + nwbfile=nwbfile, z_threshold=eye_tracking_z_threshold, + dilation_frames=eye_tracking_dilation_frames) + motion_correction = MotionCorrection.from_nwb(nwbfile=nwbfile) + is_multiplane_session = _is_multi_plane_session() + metadata = BehaviorOphysMetadata.from_nwb( + nwbfile=nwbfile, is_multiplane=is_multiplane_session) + if is_multiplane_session: + ophys_timestamps = OphysTimestampsMultiplane.from_nwb( + nwbfile=nwbfile) + else: + ophys_timestamps = OphysTimestamps.from_nwb(nwbfile=nwbfile) + date_of_acquisition = DateOfAcquisitionOphys.from_nwb(nwbfile=nwbfile) + + return OphysExperiment( + behavior_session=behavior_session, + cell_specimens=cell_specimens, + eye_tracking_rig_geometry=eye_tracking_rig_geometry, + eye_tracking_table=eye_tracking_table, + motion_correction=motion_correction, + metadata=metadata, + ophys_timestamps=ophys_timestamps, + projections=projections, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_json(cls, + session_data: dict, + eye_tracking_z_threshold: float = 3.0, + eye_tracking_dilation_frames: int = 2, + events_filter_scale: float = 2.0, + events_filter_n_time_steps: int = 20, + exclude_invalid_rois=True, + skip_eye_tracking=False) -> \ + "OphysExperiment": + """ + + Parameters + ---------- + session_data + eye_tracking_z_threshold + See `OphysExperiment.from_nwb` + eye_tracking_dilation_frames + See `OphysExperiment.from_nwb` + events_filter_scale + See `OphysExperiment.from_nwb` + events_filter_n_time_steps + See `OphysExperiment.from_nwb` + exclude_invalid_rois + Whether to exclude invalid rois + skip_eye_tracking + Used to skip returning eye tracking data + + """ + def _is_multi_plane_session(): + imaging_plane_group_meta = ImagingPlaneGroup.from_json( + dict_repr=session_data) + return cls._is_multi_plane_session( + imaging_plane_group_meta=imaging_plane_group_meta) + + def _get_motion_correction(): + rigid_motion_transform_file = RigidMotionTransformFile.from_json( + dict_repr=session_data) + return MotionCorrection.from_data_file( + rigid_motion_transform_file=rigid_motion_transform_file) + + def _get_eye_tracking_table(sync_file: SyncFile): + eye_tracking_file = EyeTrackingFile.from_json( + dict_repr=session_data) + eye_tracking_table = EyeTrackingTable.from_data_file( + data_file=eye_tracking_file, + sync_file=sync_file, + z_threshold=eye_tracking_z_threshold, + dilation_frames=eye_tracking_dilation_frames + ) + return eye_tracking_table + + sync_file = SyncFile.from_json(dict_repr=session_data) + is_multiplane_session = _is_multi_plane_session() + meta = BehaviorOphysMetadata.from_json( + dict_repr=session_data, is_multiplane=is_multiplane_session) + monitor_delay = calculate_monitor_delay( + sync_file=sync_file, equipment=meta.behavior_metadata.equipment) + behavior_session = OphysSession.from_json( + session_data=session_data, + monitor_delay=monitor_delay + ) + + if is_multiplane_session: + ophys_timestamps = OphysTimestampsMultiplane.from_sync_file( + sync_file=sync_file, + group_count=meta.ophys_metadata.imaging_plane_group_count, + plane_group=meta.ophys_metadata.imaging_plane_group + ) + else: + ophys_timestamps = OphysTimestamps.from_sync_file( + sync_file=sync_file) + + projections = Projections.from_json(dict_repr=session_data) + cell_specimens = CellSpecimens.from_json( + dict_repr=session_data, + ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=projections.max_projection.spacing, + events_params=EventsParams( + filter_scale=events_filter_scale, + filter_n_time_steps=events_filter_n_time_steps), + exclude_invalid_rois=exclude_invalid_rois + ) + motion_correction = _get_motion_correction() + if skip_eye_tracking: + eye_tracking_table = None + eye_tracking_rig_geometry = None + else: + eye_tracking_table = _get_eye_tracking_table(sync_file=sync_file) + eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_json( + dict_repr=session_data) + + return OphysExperiment( + behavior_session=behavior_session, + cell_specimens=cell_specimens, + ophys_timestamps=ophys_timestamps, + metadata=meta, + projections=projections, + motion_correction=motion_correction, + eye_tracking_table=eye_tracking_table, + eye_tracking_rig_geometry=eye_tracking_rig_geometry, + date_of_acquisition=behavior_session._date_of_acquisition + ) + + # ========================= 'get' methods ========================== + + def get_segmentation_mask_image(self) -> Image: + """a 2D binary image of all valid cell masks + + Returns + ---------- + allensdk.brain_observatory.behavior.image_api.Image: + array-like interface to segmentation_mask image data and + metadata + """ + return self._cell_specimens.segmentation_mask_image + + @legacy('Consider using "dff_traces" instead.') + def get_dff_traces(self, cell_specimen_ids=None): + + if cell_specimen_ids is None: + cell_specimen_ids = self.get_cell_specimen_ids() + + csid_table = \ + self.cell_specimen_table.reset_index()[['cell_specimen_id']] + csid_subtable = csid_table[csid_table['cell_specimen_id'].isin( + cell_specimen_ids)].set_index('cell_specimen_id') + dff_table = csid_subtable.join(self.dff_traces, how='left') + dff_traces = np.vstack(dff_table['dff'].values) + timestamps = self.ophys_timestamps + + assert (len(cell_specimen_ids), len(timestamps)) == dff_traces.shape + return timestamps, dff_traces + + @legacy() + def get_cell_specimen_indices(self, cell_specimen_ids): + return [self.cell_specimen_table.index.get_loc(csid) + for csid in cell_specimen_ids] + + @legacy("Consider using cell_specimen_table['cell_specimen_id'] instead.") + def get_cell_specimen_ids(self): + cell_specimen_ids = self.cell_specimen_table.index.values + + if np.isnan(cell_specimen_ids.astype(float)).sum() == \ + len(self.cell_specimen_table): + raise ValueError("cell_specimen_id values not assigned " + f"for {self.ophys_experiment_id}") + return cell_specimen_ids + + # ====================== properties ======================== + + @property + def ophys_experiment_id(self) -> int: + """Unique identifier for this experimental session. + :rtype: int + """ + return self._metadata.ophys_experiment_id + + @property + def ophys_session_id(self) -> int: + """Unique identifier for this ophys session. + :rtype: int + """ + return self._metadata.ophys_session_id + + @property + def metadata(self): + behavior_meta = super()._get_metadata( + behavior_metadata=self._metadata.behavior_metadata) + ophys_meta = { + 'indicator': self._cell_specimens.meta.imaging_plane.indicator, + 'emission_lambda': self._cell_specimens.meta.emission_lambda, + 'excitation_lambda': + self._cell_specimens.meta.imaging_plane.excitation_lambda, + 'field_of_view_height': + self._metadata.ophys_metadata.field_of_view_shape.height, + 'field_of_view_width': + self._metadata.ophys_metadata.field_of_view_shape.width, + 'imaging_depth': self._metadata.ophys_metadata.imaging_depth, + 'imaging_plane_group': + self._metadata.ophys_metadata.imaging_plane_group + if isinstance(self._metadata.ophys_metadata, + MultiplaneMetadata) else None, + 'imaging_plane_group_count': + self._metadata.ophys_metadata.imaging_plane_group_count + if isinstance(self._metadata.ophys_metadata, + MultiplaneMetadata) else 0, + 'ophys_experiment_id': + self._metadata.ophys_metadata.ophys_experiment_id, + 'ophys_frame_rate': + self._cell_specimens.meta.imaging_plane.ophys_frame_rate, + 'ophys_session_id': self._metadata.ophys_metadata.ophys_session_id, + 'project_code': self._metadata.ophys_metadata.project_code, + 'targeted_structure': + self._cell_specimens.meta.imaging_plane.targeted_structure + } + return { + **behavior_meta, + **ophys_meta + } + + @property + def max_projection(self) -> Image: + """2D max projection image. + :rtype: allensdk.brain_observatory.behavior.image_api.Image + """ + return self._projections.max_projection + + @property + def average_projection(self) -> Image: + """2D image of the microscope field of view, averaged across the + experiment + :rtype: allensdk.brain_observatory.behavior.image_api.Image + """ + return self._projections.avg_projection + + @property + def ophys_timestamps(self) -> np.ndarray: + """Timestamps associated with frames captured by the microscope + :rtype: numpy.ndarray + """ + return self._ophys_timestamps.value + + @property + def dff_traces(self) -> pd.DataFrame: + """traces of change in fluoescence / fluorescence + + Returns + ------- + pd.DataFrame + dataframe of traces of dff + (change in fluorescence / fluorescence) + + dataframe columns: + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + assigned after cell matching + cell_roi_id: (int) + experiment specific id of segmented roi, + assigned before cell matching + dff: (list of float) + fluorescence fractional values relative to baseline + (arbitrary units) + + """ + return self._cell_specimens.dff_traces + + @property + def events(self) -> pd.DataFrame: + """A dataframe containing spiking events in traces derived + from the two photon movies, organized by cell specimen id. + For more information on event detection processing + please see the event detection portion of the white paper. + + Returns + ------- + pd.DataFrame + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + (assigned after cell matching) + cell_roi_id: (int) + experiment specific id of segmented roi (assigned + before cell matching) + events: (np.array of float) + event trace where events correspond to the rise time + of a calcium transient in the dF/F trace, with a + magnitude roughly proportional the magnitude of the + increase in dF/F. + filtered_events: (np.array of float) + Events array with a 1d causal half-gaussian filter to + smooth it for visualization. Uses a halfnorm + distribution as weights to the filter + lambdas: (float64) + regularization value selected to make the minimum + event size be close to N * noise_std + noise_stds: (float64) + estimated noise standard deviation for the events trace + + """ + return self._cell_specimens.events + + @property + def cell_specimen_table(self) -> pd.DataFrame: + """Cell information organized into a dataframe. Table only + contains roi_valid = True entries, as invalid ROIs/ non cell + segmented objects have been filtered out + + Returns + ------- + pd.DataFrame + dataframe columns: + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + (assigned after cell matching) + cell_roi_id: (int) + experiment specific id of segmented roi + (assigned before cell matching) + height: (int) + height of ROI/cell in pixels + mask_image_plane: (int) + which image plane an ROI resides on. Overlapping + ROIs are stored on different mask image planes + max_corretion_down: (float) + max motion correction in down direction in pixels + max_correction_left: (float) + max motion correction in left direction in pixels + max_correction_right: (float) + max motion correction in right direction in pixels + max_correction_up: (float) + max motion correction in up direction in pixels + roi_mask: (array of bool) + an image array that displays the location of the + roi mask in the field of view + valid_roi: (bool) + indicates if cell classification found the segmented + ROI to be a cell or not (True = cell, False = not cell). + width: (int) + width of ROI in pixels + x: (float) + x position of ROI in field of view in pixels (top + left corner) + y: (float) + y position of ROI in field of view in pixels (top + left corner) + """ + return self._cell_specimens.table + + @property + def corrected_fluorescence_traces(self) -> pd.DataFrame: + """Corrected fluorescence traces which are neuropil corrected + and demixed. Sampling rate can be found in metadata + ‘ophys_frame_rate’ + + Returns + ------- + pd.DataFrame + Dataframe that contains the corrected fluorescence traces + for all valid cells. + + dataframe columns: + cell_specimen_id [index]: (int) + unified id of segmented cell across experiments + (assigned after cell matching) + cell_roi_id: (int) + experiment specific id of segmented roi + (assigned before cell matching) + corrected_fluorescence: (list of float) + fluorescence values (arbitrary units) + + """ + return self._cell_specimens.corrected_fluorescence_traces + + @property + def motion_correction(self) -> pd.DataFrame: + """a dataframe containing the x and y offsets applied during + motion correction + + Returns + ------- + pd.DataFrame + dataframe columns: + x: (int) + frame shift along x axis + y: (int) + frame shift along y axis + """ + return self._motion_correction.value + + @property + def segmentation_mask_image(self) -> Image: + """A 2d binary image of all valid cell masks + :rtype: allensdk.brain_observatory.behavior.image_api.Image + """ + return self._cell_specimens.segmentation_mask_image + + @property + def eye_tracking(self) -> pd.DataFrame: + """A dataframe containing ellipse fit parameters for the eye, pupil + and corneal reflection (cr). Fits are derived from tracking points + from a DeepLabCut model applied to video frames of a subject's + right eye. Raw tracking points and raw video frames are not exposed + by the SDK. + + Notes: + - All columns starting with 'pupil_' represent ellipse fit parameters + relating to the pupil. + - All columns starting with 'eye_' represent ellipse fit parameters + relating to the eyelid. + - All columns starting with 'cr_' represent ellipse fit parameters + relating to the corneal reflection, which is caused by an infrared + LED positioned near the eye tracking camera. + - All positions are in units of pixels. + - All areas are in units of pixels^2 + - All values are in the coordinate space of the eye tracking camera, + NOT the coordinate space of the stimulus display (i.e. this is not + gaze location), with (0, 0) being the upper-left corner of the + eye-tracking image. + - The 'likely_blink' column is True for any row (frame) where the pupil + fit failed OR eye fit failed OR an outlier fit was identified on the + pupil or eye fit. + - The pupil_area, cr_area, eye_area columns are set to NaN wherever + 'likely_blink' == True. + - The pupil_area_raw, cr_area_raw, eye_area_raw columns contains all + pupil fit values (including where 'likely_blink' == True). + - All ellipse fits are derived from tracking points that were output by + a DeepLabCut model that was trained on hand-annotated data from a + subset of imaging sessions on optical physiology rigs. + - Raw DeepLabCut tracking points are not publicly available. + + :rtype: pandas.DataFrame + """ + return self._eye_tracking.value + + @property + def eye_tracking_rig_geometry(self) -> dict: + """the eye tracking equipment geometry associate with a + given ophys experiment session. + + Returns + ------- + dict + dictionary with the following keys: + camera_eye_position_mm (array of float) + camera_rotation_deg (array of float) + equipment (string) + led_position (array of float) + monitor_position_mm (array of float) + monitor_rotation_deg (array of float) + """ + return self._eye_tracking_rig_geometry.to_dict()['rig_geometry'] + + @property + def roi_masks(self) -> pd.DataFrame: + return self.cell_specimen_table[['cell_roi_id', 'roi_mask']] + + def _get_identifier(self) -> str: + return str(self.ophys_experiment_id) + + @staticmethod + def _is_multi_plane_session( + imaging_plane_group_meta: ImagingPlaneGroup) -> bool: + """Returns whether this experiment is part of a multiplane session""" + return imaging_plane_group_meta is not None and \ + imaging_plane_group_meta.plane_group_count > 1 + + def _get_session_type(self) -> str: + return self._metadata.behavior_metadata.session_type + + @staticmethod + def _get_keywords(): + """Keywords for NWB file""" + return ["2-photon", "calcium imaging", "visual cortex", + "behavior", "task"] diff --git a/brain_observatory/behavior/ophys_session.py b/brain_observatory/behavior/ophys_session.py new file mode 100644 index 0000000000..d31daa6931 --- /dev/null +++ b/brain_observatory/behavior/ophys_session.py @@ -0,0 +1,881 @@ +import datetime +from typing import Any, List, Dict, Optional +import pynwb +import pandas as pd +import numpy as np +import pytz + +from pynwb import NWBFile + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects.base \ + .readable_interfaces import \ + JsonReadableInterface, NwbReadableInterface, \ + LimsReadableInterface +from allensdk.brain_observatory.behavior.data_objects.base \ + .writable_interfaces import \ + NwbWritableInterface +from allensdk.brain_observatory.behavior.data_objects.licks import Licks +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.behavior_metadata import \ + BehaviorMetadata, get_expt_description +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.date_of_acquisition import \ + DateOfAcquisition +from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards +from allensdk.brain_observatory.behavior.data_objects.stimuli.stimuli import \ + Stimuli +from allensdk.brain_observatory.behavior.data_objects.task_parameters import \ + TaskParameters +from allensdk.brain_observatory.behavior.data_objects.trials.trial_table \ + import \ + TrialTable +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata.multi_plane_metadata \ + import \ + MultiplaneMetadata +from allensdk.brain_observatory.behavior.trials_processing import ( + construct_rolling_performance_df, calculate_reward_rate_fix_nans) +from allensdk.brain_observatory.behavior.data_objects import ( + OphysSessionId, StimulusTimestamps, RunningSpeed, RunningAcquisition, + DataObject +) + +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator, PostgresQueryMixin + + + +class OphysSession(DataObject, LimsReadableInterface, + NwbReadableInterface, + JsonReadableInterface, NwbWritableInterface): + """Represents data from a single Visual Behavior behavior session. + Initialize by using class methods `from_lims` or `from_nwb_path`. + """ + def __init__( + self, + behavior_session_id: OphysSessionId, + stimulus_timestamps: StimulusTimestamps, + running_acquisition: RunningAcquisition, + raw_running_speed: RunningSpeed, + running_speed: RunningSpeed, + #stimuli: Stimuli, + #task_parameters: TaskParameters, + #trials: TrialTable, + metadata: MultiplaneMetadata, + #date_of_acquisition: DateOfAcquisition + ): + super().__init__(name='behavior_session', value=self) + + self._behavior_session_id = behavior_session_id + self._running_acquisition = running_acquisition + self._running_speed = running_speed + self._raw_running_speed = raw_running_speed + #self._stimuli = stimuli + self._stimulus_timestamps = stimulus_timestamps + #self._task_parameters = task_parameters + self._metadata = metadata + #self._trials = trials + #self._date_of_acquisition = date_of_acquisition + + # ==================== class and utility methods ====================== + + @classmethod + def from_json(cls, + session_data: dict, + monitor_delay: Optional[float] = None) \ + -> "OphysSession": + """ + + Parameters + ---------- + session_data + Dict of input data necessary to construct a session + monitor_delay + Monitor delay. If not provided, will use an estimate. + To provide this value, see for example + allensdk.brain_observatory.behavior.data_objects.stimuli.util. + calculate_monitor_delay + + Returns + ------- + `OphysSession` instance + + """ + behavior_session_id = OphysSessionId.from_json( + dict_repr=session_data) + stimulus_file = StimulusFile.from_json(dict_repr=session_data) + stimulus_timestamps = StimulusTimestamps.from_json( + dict_repr=session_data) + running_acquisition = RunningAcquisition.from_json( + dict_repr=session_data) + raw_running_speed = RunningSpeed.from_json( + dict_repr=session_data, filtered=False + ) + running_speed = RunningSpeed.from_json(dict_repr=session_data) + metadata = MultiplaneMetadata.from_json(dict_repr=session_data) + + if monitor_delay is None: + monitor_delay = cls._get_monitor_delay() + + stimuli, task_parameters = \ + cls._read_data_from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + trial_monitor_delay=monitor_delay + ) + date_of_acquisition = DateOfAcquisition.from_json( + dict_repr=session_data)\ + .validate( + stimulus_file=stimulus_file, + behavior_session_id=behavior_session_id.value) + + return OphysSession( + behavior_session_id=behavior_session_id, + stimulus_timestamps=stimulus_timestamps, + running_acquisition=running_acquisition, + raw_running_speed=raw_running_speed, + running_speed=running_speed, + stimuli=stimuli, + task_parameters=task_parameters, + #trials=trials, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_lims(cls, behavior_session_id: int, + lims_db: Optional[PostgresQueryMixin] = None, + stimulus_timestamps: Optional[StimulusTimestamps] = None, + monitor_delay: Optional[float] = None, + date_of_acquisition: Optional[DateOfAcquisition] = None) \ + -> "OphysSession": + """ + + Parameters + ---------- + behavior_session_id + Behavior session id + lims_db + Database connection. If not provided will create a new one. + stimulus_timestamps + Stimulus timestamps. If not provided, will calculate stimulus + timestamps from stimulus file. + monitor_delay + Monitor delay. If not provided, will use an estimate. + To provide this value, see for example + allensdk.brain_observatory.behavior.data_objects.stimuli.util. + calculate_monitor_delay + date_of_acquisition + Date of acquisition. If not provided, will read from + behavior_sessions table. + Returns + ------- + `BehaviorSession` instance + """ + if lims_db is None: + lims_db = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP + ) + + metadata = MultiplaneMetadata.from_lims( + ophys_experiment_id=behavior_session_id, lims_db=lims_db + ) + running_acquisition = RunningAcquisition.from_lims( + lims_db, behavior_session_id + ) + raw_running_speed = RunningSpeed.from_lims( + lims_db, behavior_session_id.value, filtered=False, + stimulus_timestamps=stimulus_timestamps + ) + running_speed = RunningSpeed.from_lims( + lims_db, behavior_session_id.value, + stimulus_timestamps=stimulus_timestamps + ) + if monitor_delay is None: + monitor_delay = cls._get_monitor_delay() + + + + return OphysSession( + behavior_session_id=behavior_session_id, + stimulus_timestamps=stimulus_timestamps, + metadata=metadata, + raw_running_speed=raw_running_speed, + running_acquisition=running_acquisition, + running_speed=running_speed + #trials=trials, + ) + + @classmethod + def from_nwb(cls, nwbfile: NWBFile, **kwargs) -> "OphysSession": + behavior_session_id = OphysSessionId.from_nwb(nwbfile) + stimulus_timestamps = StimulusTimestamps.from_nwb(nwbfile) + running_acquisition = RunningAcquisition.from_nwb(nwbfile) + raw_running_speed = RunningSpeed.from_nwb(nwbfile, filtered=False) + running_speed = RunningSpeed.from_nwb(nwbfile) + stimuli = Stimuli.from_nwb(nwbfile=nwbfile) + task_parameters = TaskParameters.from_nwb(nwbfile=nwbfile) + #trials = TrialTable.from_nwb(nwbfile=nwbfile) + date_of_acquisition = DateOfAcquisition.from_nwb(nwbfile=nwbfile) + + return OphysSession( + behavior_session_id=behavior_session_id, + stimulus_timestamps=stimulus_timestamps, + running_acquisition=running_acquisition, + raw_running_speed=raw_running_speed, + running_speed=running_speed, + stimuli=stimuli, + task_parameters=task_parameters, + #trials=trials, + date_of_acquisition=date_of_acquisition + ) + + @classmethod + def from_nwb_path(cls, nwb_path: str, **kwargs) -> "OphysSession": + """ + + Parameters + ---------- + nwb_path + Path to nwb file + kwargs + Kwargs to be passed to `from_nwb` + + Returns + ------- + An instantiation of a `OphysSession` + """ + with pynwb.NWBHDF5IO(str(nwb_path), 'r') as read_io: + nwbfile = read_io.read() + return cls.from_nwb(nwbfile=nwbfile, **kwargs) + + def to_nwb(self, add_metadata=False) -> NWBFile: + """ + + Parameters + ---------- + add_metadata + Set this to False to prevent adding metadata to the nwb + instance. + """ + #TODO: Updates session description, start time, and experiment description + nwbfile = NWBFile( + session_description='Ophys Session', + identifier=self._get_identifier(), + session_start_time=pytz.utc.localize(datetime.datetime.now()), + file_create_date=pytz.utc.localize(datetime.datetime.now()), + institution="Allen Institute for Brain Science", + keywords=self._get_keywords(), + experiment_description="ophys session" + ) + + self._stimulus_timestamps.to_nwb(nwbfile=nwbfile) + #self._running_acquisition.to_nwb(nwbfile=nwbfile) + #self._raw_running_speed.to_nwb(nwbfile=nwbfile) + #self._running_speed.to_nwb(nwbfile=nwbfile) + + #self._stimuli.to_nwb(nwbfile=nwbfile) + #self._task_parameters.to_nwb(nwbfile=nwbfile) + #self._trials.to_nwb(nwbfile=nwbfile) + + return nwbfile + + def list_data_attributes_and_methods(self) -> List[str]: + """Convenience method for end-users to list attributes and methods + that can be called to access data for a BehaviorSession. + + NOTE: Because BehaviorOphysExperiment inherits from BehaviorSession, + this method will also be available there. + + Returns + ------- + List[str] + A list of attributes and methods that end-users can access or call + to get data. + """ + attrs_and_methods_to_ignore: set = { + "from_json", + "from_lims", + "from_nwb_path", + "list_data_attributes_and_methods" + } + attrs_and_methods_to_ignore.update(dir(NwbReadableInterface)) + attrs_and_methods_to_ignore.update(dir(NwbWritableInterface)) + attrs_and_methods_to_ignore.update(dir(DataObject)) + class_dir = dir(self) + attrs_and_methods = [ + r for r in class_dir + if (r not in attrs_and_methods_to_ignore and not r.startswith("_")) + ] + return attrs_and_methods + + # ========================= 'get' methods ========================== + + def get_reward_rate(self) -> np.ndarray: + """ Get the reward rate of the subject for the task calculated over a + 25 trial rolling window and provides a measure of the rewards + earned per unit time (in units of rewards/minute). + + Returns + ------- + np.ndarray + The reward rate (rewards/minute) of the subject for the + task calculated over a 25 trial rolling window. + """ + return calculate_reward_rate_fix_nans( + self.trials, + self.task_parameters['response_window_sec'][0]) + + def get_rolling_performance_df(self) -> pd.DataFrame: + """Return a DataFrame containing trial by trial behavior response + performance metrics. + + Returns + ------- + pd.DataFrame + A pandas DataFrame containing: + trials_id [index]: (int) + Index of the trial. All trials, including aborted trials, + are assigned an index starting at 0 for the first trial. + reward_rate: (float) + Rewards earned in the previous 25 trials, normalized by + the elapsed time of the same 25 trials. Units are + rewards/minute. + hit_rate_raw: (float) + Fraction of go trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + hit_rate: (float) + Fraction of go trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. With trial count correction applied. + false_alarm_rate_raw: (float) + Fraction of catch trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + false_alarm_rate: (float) + Fraction of catch trials where the mouse licked in + the response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + rolling_dprime: (float) + d prime calculated using the rolling hit_rate and + rolling false_alarm _rate. + + """ + return construct_rolling_performance_df( + self.trials, + self.task_parameters['response_window_sec'][0], + self.task_parameters["session_type"]) + + def get_performance_metrics( + self, + engaged_trial_reward_rate_threshold: float = 2.0 + ) -> dict: + """Get a dictionary containing a subject's behavior response + summary data. + + Parameters + ---------- + engaged_trial_reward_rate_threshold : float, optional + The number of rewards per minute that needs to be attained + before a subject is considered 'engaged', by default 2.0 + + Returns + ------- + dict + Returns a dict of performance metrics with the following fields: + trial_count: (int) + The length of the trial dataframe + (including all 'go', 'catch', and 'aborted' trials) + go_trial_count: (int) + Number of 'go' trials in a behavior session + catch_trial_count: (int) + Number of 'catch' trial types during a behavior session + hit_trial_count: (int) + Number of trials with a hit behavior response + type in a behavior session + miss_trial_count: (int) + Number of trials with a miss behavior response + type in a behavior session + false_alarm_trial_count: (int) + Number of trials where the mouse had a false alarm + behavior response + correct_reject_trial_count: (int) + Number of trials with a correct reject behavior + response during a behavior session + auto_reward_count: + Number of trials where the mouse received an auto + reward of water. + earned_reward_count: + Number of trials where the mouse was eligible to receive a + water reward ('go' trials) and did receive an earned + water reward + total_reward_count: + Number of trials where the mouse received a + water reward (earned or auto rewarded) + total_reward_volume: (float) + Volume of all water rewards received during a + behavior session (earned and auto rewarded) + maximum_reward_rate: (float) + The peak of the rolling reward rate (rewards/minute) + engaged_trial_count: (int) + Number of trials where the mouse is engaged + (reward rate > 2 rewards/minute) + mean_hit_rate: (float) + The mean of the rolling hit_rate + mean_hit_rate_uncorrected: + The mean of the rolling hit_rate_raw + mean_hit_rate_engaged: (float) + The mean of the rolling hit_rate, excluding epochs + when the rolling reward rate was below 2 rewards/minute + mean_false_alarm_rate: (float) + The mean of the rolling false_alarm_rate, excluding + epochs when the rolling reward rate was below 2 + rewards/minute + mean_false_alarm_rate_uncorrected: (float) + The mean of the rolling false_alarm_rate_raw + mean_false_alarm_rate_engaged: (float) + The mean of the rolling false_alarm_rate, + excluding epochs when the rolling reward rate + was below 2 rewards/minute + mean_dprime: (float) + The mean of the rolling d_prime + mean_dprime_engaged: (float) + The mean of the rolling d_prime, excluding + epochs when the rolling reward rate was + below 2 rewards/minute + max_dprime: (float) + The peak of the rolling d_prime + max_dprime_engaged: (float) + The peak of the rolling d_prime, excluding epochs + when the rolling reward rate was below 2 rewards/minute + """ + performance_metrics = {} + performance_metrics['trial_count'] = len(self.trials) + performance_metrics['go_trial_count'] = self.trials.go.sum() + performance_metrics['catch_trial_count'] = self.trials.catch.sum() + performance_metrics['hit_trial_count'] = self.trials.hit.sum() + performance_metrics['miss_trial_count'] = self.trials.miss.sum() + performance_metrics['false_alarm_trial_count'] = \ + self.trials.false_alarm.sum() + performance_metrics['correct_reject_trial_count'] = \ + self.trials.correct_reject.sum() + performance_metrics['auto_reward_count'] = \ + self.trials.auto_rewarded.sum() + # Although 'earned_reward_count' will currently have the same value as + # 'hit_trial_count', in the future there may be variants of the + # task where rewards are withheld. In that case the + # 'earned_reward_count' will be smaller than (and different from) + # the 'hit_trial_count'. + performance_metrics['earned_reward_count'] = self.trials.hit.sum() + performance_metrics['total_reward_count'] = len(self.rewards) + performance_metrics['total_reward_volume'] = self.rewards.volume.sum() + + rpdf = self.get_rolling_performance_df() + engaged_trial_mask = ( + rpdf['reward_rate'] > + engaged_trial_reward_rate_threshold) + performance_metrics['maximum_reward_rate'] = \ + np.nanmax(rpdf['reward_rate'].values) + performance_metrics['engaged_trial_count'] = (engaged_trial_mask).sum() + performance_metrics['mean_hit_rate'] = \ + rpdf['hit_rate'].mean() + performance_metrics['mean_hit_rate_uncorrected'] = \ + rpdf['hit_rate_raw'].mean() + performance_metrics['mean_hit_rate_engaged'] = \ + rpdf['hit_rate'][engaged_trial_mask].mean() + performance_metrics['mean_false_alarm_rate'] = \ + rpdf['false_alarm_rate'].mean() + performance_metrics['mean_false_alarm_rate_uncorrected'] = \ + rpdf['false_alarm_rate_raw'].mean() + performance_metrics['mean_false_alarm_rate_engaged'] = \ + rpdf['false_alarm_rate'][engaged_trial_mask].mean() + performance_metrics['mean_dprime'] = \ + rpdf['rolling_dprime'].mean() + performance_metrics['mean_dprime_engaged'] = \ + rpdf['rolling_dprime'][engaged_trial_mask].mean() + performance_metrics['max_dprime'] = \ + rpdf['rolling_dprime'].max() + performance_metrics['max_dprime_engaged'] = \ + rpdf['rolling_dprime'][engaged_trial_mask].max() + + return performance_metrics + + # ====================== properties ======================== + + @property + def behavior_session_id(self) -> int: + """Unique identifier for a behavioral session. + :rtype: int + """ + return self._behavior_session_id.value + + @property + def licks(self) -> pd.DataFrame: + """A dataframe containing lick timestmaps and frames, sampled + at 60 Hz. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + np.ndarray + A dataframe containing lick timestamps. + dataframe columns: + timestamps: (float) + time of lick, in seconds + frame: (int) + frame of lick + + """ + return self._licks.value + + @property + def rewards(self) -> pd.DataFrame: + """Retrieves rewards from data file saved at the end of the + behavior session. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + pd.DataFrame + A dataframe containing timestamps of delivered rewards. + Timestamps are sampled at 60Hz. + + dataframe columns: + volume: (float) + volume of individual water reward in ml. + 0.007 if earned reward, 0.005 if auto reward. + timestamps: (float) + time in seconds + autorewarded: (bool) + True if free reward was delivered for that trial. + Occurs during the first 5 trials of a session and + throughout as needed + + """ + return self._rewards.value + + @property + def running_speed(self) -> pd.DataFrame: + """Running speed and timestamps, sampled at 60Hz. By default + applies a 10Hz low pass filter to the data. To get the + running speed without the filter, use `raw_running_speed`. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + pd.DataFrame + Dataframe containing running speed and timestamps + dataframe columns: + timestamps: (float) + time in seconds + speed: (float) + speed in cm/sec + """ + return self._running_speed.value + + @property + def raw_running_speed(self) -> pd.DataFrame: + """Get unfiltered running speed data. Sampled at 60Hz. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + pd.DataFrame + Dataframe containing unfiltered running speed and timestamps + dataframe columns: + timestamps: (float) + time in seconds + speed: (float) + speed in cm/sec + """ + return self._raw_running_speed.value + + @property + def stimulus_presentations(self) -> pd.DataFrame: + """Table whose rows are stimulus presentations (i.e. a given image, + for a given duration, typically 250 ms) and whose columns are + presentation characteristics. + + Returns + ------- + pd.DataFrame + Table whose rows are stimulus presentations + (i.e. a given image, for a given duration, typically 250 ms) + and whose columns are presentation characteristics. + + dataframe columns: + stimulus_presentations_id [index]: (int) + identifier for a stimulus presentation + (presentation of an image) + duration: (float) + duration of an image presentation (flash) + in seconds (stop_time - start_time). NaN if omitted + end_frame: (float) + image presentation end frame + image_index: (int) + image index (0-7) for a given session, + corresponding to each image name + image_set: (string) + image set for this behavior session + index: (int) + an index assigned to each stimulus presentation + omitted: (bool) + True if no image was shown for this stimulus + presentation + start_frame: (int) + image presentation start frame + start_time: (float) + image presentation start time in seconds + stop_time: (float) + image presentation end time in seconds + """ + return self._stimuli.presentations.value + + @property + def stimulus_templates(self) -> pd.DataFrame: + """Get stimulus templates (movies, scenes) for behavior session. + + Returns + ------- + pd.DataFrame + A pandas DataFrame object containing the stimulus images for the + experiment. + + dataframe columns: + image_name [index]: (string) + name of image presented, if 'omitted' + then no image was presented + unwarped: (array of int) + image array of unwarped stimulus image + warped: (array of int) + image array of warped stimulus image + + """ + return self._stimuli.templates.value.to_dataframe() + + @property + def stimulus_timestamps(self) -> np.ndarray: + """Timestamps associated with the stimulus presetntation on + the monitor retrieveddata file saved at the end of the + behavior session. Sampled at 60Hz. + + NOTE: For BehaviorSessions, returned timestamps are not + aligned to external 'synchronization' reference timestamps. + Synchronized timestamps are only available for + BehaviorOphysExperiments. + + Returns + ------- + np.ndarray + Timestamps associated with stimulus presentations on the monitor + """ + return self._stimulus_timestamps.value + + @property + def task_parameters(self) -> dict: + """Get task parameters from data file saved at the end of + the behavior session file. + + Returns + ------- + dict + A dictionary containing parameters used to define the task runtime + behavior. + auto_reward_volume: (float) + Volume of auto rewards in ml. + blank_duration_sec : (list of floats) + Duration in seconds of inter stimulus interval. + Inter-stimulus interval chosen as a uniform random value. + between the range defined by the two values. + Values are ignored if `stimulus_duration_sec` is null. + response_window_sec: (list of floats) + Range of period following an image change, in seconds, + where mouse response influences trial outcome. + First value represents response window start. + Second value represents response window end. + Values represent time before display lag is + accounted for and applied. + n_stimulus_frames: (int) + Total number of visual stimulus frames presented during + a behavior session. + task: (string) + Type of visual stimulus task. + session_type: (string) + Visual stimulus type run during behavior session. + omitted_flash_fraction: (float) + Probability that a stimulus image presentations is omitted. + Change stimuli, and the stimulus immediately preceding the + change, are never omitted. + stimulus_distribution: (string) + Distribution for drawing change times. + Either 'exponential' or 'geometric'. + stimulus_duration_sec: (float) + Duration in seconds of each stimulus image presentation + reward_volume: (float) + Volume of earned water reward in ml. + stimulus: (string) + Stimulus type ('gratings' or 'images'). + + """ + return self._task_parameters.to_dict()['task_parameters'] + + @property + def trials(self) -> pd.DataFrame: + """Get trials from data file saved at the end of the + behavior session. + + Returns + ------- + pd.DataFrame + A dataframe containing trial and behavioral response data, + by cell specimen id + + dataframe columns: + trials_id: (int) + trial identifier + lick_times: (array of float) + array of lick times in seconds during that trial. + Empty array if no licks occured during the trial. + reward_time: (NaN or float) + Time the reward is delivered following a correct + response or on auto rewarded trials. + reward_volume: (float) + volume of reward in ml. 0.005 for auto reward + 0.007 for earned reward + hit: (bool) + Behavior response type. On catch trial mouse licks + within reward window. + false_alarm: (bool) + Behavior response type. On catch trial mouse licks + within reward window. + miss: (bool) + Behavior response type. On a go trial, mouse either + does not lick at all, or licks after reward window + stimulus_change: (bool) + True if an image change occurs during the trial + (if the trial was both a 'go' trial and the trial + was not aborted) + aborted: (bool) + Behavior response type. True if the mouse licks + before the scheduled change time. + go: (bool) + Trial type. True if there was a change in stimulus + image identity on this trial + catch: (bool) + Trial type. True if there was not a change in stimulus + identity on this trial + auto_rewarded: (bool) + True if free reward was delivered for that trial. + Occurs during the first 5 trials of a session and + throughout as needed. + correct_reject: (bool) + Behavior response type. On a catch trial, mouse + either does not lick at all or licks after reward + window + start_time: (float) + start time of the trial in seconds + stop_time: (float) + end time of the trial in seconds + trial_length: (float) + duration of trial in seconds (stop_time -start_time) + response_time: (float) + time of first lick in trial in seconds and NaN if + trial aborted + initial_image_name: (string) + name of image presented at start of trial + change_image_name: (string) + name of image that is changed to at the change time, + on go trials + """ + return self._trials.value + + @property + def metadata(self) -> Dict[str, Any]: + """metadata for a given session + + Returns + ------- + Dict + A dictionary containing behavior session specific metadata + dictionary keys: + age_in_days: (int) + age of mouse in days + behavior_session_uuid: (int) + unique identifier for a behavior session + behavior_session_id: (int) + unique identifier for a behavior session + cre_line: (string) + cre driver line for a transgenic mouse + date_of_acquisition: (date time object) + date and time of experiment acquisition, + yyyy-mm-dd hh:mm:ss + driver_line: (list of string) + all driver lines for a transgenic mouse + equipment_name: (string) + identifier for equipment data was collected on + full_genotype: (string) + full genotype of transgenic mouse + mouse_id: (int) + unique identifier for a mouse + reporter_line: (string) + reporter line for a transgenic mouse + session_type: (string) + visual stimulus type displayed during behavior + session + sex: (string) + sex of the mouse + stimulus_frame_rate: (float) + frame rate (Hz) at which the visual stimulus is + displayed + """ + return self._get_metadata(behavior_metadata=self._metadata) + + @classmethod + def _read_data_from_stimulus_file( + cls, stimulus_file: StimulusFile, + stimulus_timestamps: StimulusTimestamps, + trial_monitor_delay: float): + """Helper method to read data from stimulus file""" + stimuli = Stimuli.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps) + task_parameters = TaskParameters.from_stimulus_file( + stimulus_file=stimulus_file) + return stimuli, task_parameters + + + + def _get_identifier(self) -> str: + return str(self._behavior_session_id) + + def _get_session_type(self) -> str: + return self._metadata.session_type + + @staticmethod + def _get_keywords(): + """Keywords for NWB file""" + return ["visual", "behavior", "task"] + + @staticmethod + def _get_monitor_delay(): + # This is the median estimate across all rigs + # as discussed in + # https://github.com/AllenInstitute/AllenSDK/issues/1318 + return 0.02115 diff --git a/brain_observatory/behavior/rewards_processing.py b/brain_observatory/behavior/rewards_processing.py new file mode 100644 index 0000000000..81b66bb9dc --- /dev/null +++ b/brain_observatory/behavior/rewards_processing.py @@ -0,0 +1,43 @@ +from typing import Dict +import numpy as np +import pandas as pd + + +def get_rewards(data: Dict, + timestamps: np.ndarray) -> pd.DataFrame: + """ + Construct and return a pandas DataFrame containing reward data for this + session + + Parameters + --------- + data: Dict + The dict that results from reading the stimulus pickle file + associated with the session + + timestamps: np.ndarray[1d] + A numpy array of timestamps associated with the stimulus + frames in this session. timestamps[ii] is the clock time + of the iith frame. + + Returns + ------- + pd.DataFrame + containing the data associated with rewards given in this + session + + """ + trial_df = pd.DataFrame(data["items"]["behavior"]["trial_log"]) + rewards_dict = {"volume": [], "timestamps": [], "autorewarded": []} + for idx, trial in trial_df.iterrows(): + rewards = trial["rewards"] + # as i write this there can only ever be one reward per trial + if rewards: + rewards_dict["volume"].append(rewards[0][0]) + rewards_dict["timestamps"].append(timestamps[rewards[0][2]]) + auto_rwrd = trial["trial_params"]["auto_reward"] + rewards_dict["autorewarded"].append(auto_rwrd) + + df = pd.DataFrame(rewards_dict) + + return df diff --git a/brain_observatory/behavior/schemas.py b/brain_observatory/behavior/schemas.py new file mode 100644 index 0000000000..be80665355 --- /dev/null +++ b/brain_observatory/behavior/schemas.py @@ -0,0 +1,314 @@ +from marshmallow import Schema, fields, RAISE +import numpy as np + + +STYPE_DICT = {fields.Float: 'float', fields.Int: 'int', + fields.String: 'text', fields.List: 'text', + fields.DateTime: 'text', fields.UUID: 'text'} +TYPE_DICT = {fields.Float: float, fields.Int: int, fields.String: str, + fields.List: np.ndarray, fields.DateTime: str, fields.UUID: str} + + +class RaisingSchema(Schema): + class Meta: + unknown = RAISE + + +class SubjectMetadataSchema(RaisingSchema): + """This schema contains metadata pertaining to a subject in either a + behavior or behavior + ophys experiment. + """ + + neurodata_type = 'BehaviorSubject' + neurodata_type_inc = 'Subject' + neurodata_doc = "Metadata for an AIBS behavior or behavior + ophys subject" + # Fields to skip converting to extension + # In this case they already exist in the 'Subject' builtin pyNWB class + neurodata_skip = {"age_in_days", "genotype", "sex", "subject_id"} + + age_in_days = fields.String( + doc='Age of the specimen donor/subject (in days)', + required=True, + ) + driver_line = fields.List( + fields.String, + doc="Driver line of subject", + required=True, + shape=(None,), + ) + # 'full_genotype' will be stored in pynwb Subject 'genotype' attr + genotype = fields.String( + doc='full genotype of subject', + required=True, + ) + # 'mouse_id' will be stored in pynwb Subject 'subject_id' attr + subject_id = fields.Int( + doc='Mouse ID of subject', + required=True, + ) + reporter_line = fields.String( + doc="Reporter line of subject", + required=True, + ) + sex = fields.String( + doc='Sex of the specimen donor/subject', + required=True, + ) + + +class BehaviorMetadataSchema(RaisingSchema): + """This schema contains metadata pertaining to behavior. + """ + neurodata_type = 'BehaviorMetadata' + neurodata_type_inc = 'LabMetaData' + neurodata_doc = "Metadata for behavior and behavior + ophys experiments" + neurodata_skip = {"date_of_acquisition"} + + behavior_session_id = fields.Int( + doc='The unique ID for the behavior session', + required=True + ) + behavior_session_uuid = fields.UUID( + doc='MTrain record for session, also called foraging_id', + required=True, + ) + stimulus_frame_rate = fields.Float( + doc=('Frame rate (frames/second) of the ' + 'visual_stimulus from the monitor'), + required=True, + ) + session_type = fields.String( + doc='Experimental session description', + allow_none=True, + required=True, + ) + # 'date_of_acquisition' will be stored in + # pynwb NWBFile 'session_start_time' attr + date_of_acquisition = fields.DateTime( + doc='Date of the experiment (UTC, as string)', + required=True, + ) + equipment_name = fields.String( + doc='Name of behavior or optical physiology experiment rig', + required=True, + ) + + +class NwbOphysMetadataSchema(RaisingSchema): + """This schema contains fields that will be stored in pyNWB base classes + pertaining to optical physiology.""" + # 'emission_lambda' will be stored in + # pyNWB OpticalChannel 'emission_lambda' attr + emission_lambda = fields.Float( + doc='Emission lambda of fluorescent indicator', + required=True, + ) + # 'excitation_lambda' will be stored in the pyNWB ImagingPlane + # 'excitation_lambda' attr + excitation_lambda = fields.Float( + doc='Excitation lambda of fluorescent indicator', + required=True, + ) + # 'indicator' will be stored in the pyNWB ImagingPlane 'indicator' attr + indicator = fields.String( + doc='Name of optical physiology fluorescent indicator', + required=True, + ) + # 'targeted_structure' will be stored in the pyNWB + # ImagingPlane 'location' attr + targeted_structure = fields.String( + doc='Anatomical structure targeted for two-photon acquisition', + required=True, + ) + # 'ophys_frame_rate' will be stored in the pyNWB ImagingPlane + # 'imaging_rate' attr + ophys_frame_rate = fields.Float( + doc='Frame rate (frames/second) of the two-photon microscope', + required=True, + ) + + +class OphysMetadataSchema(NwbOphysMetadataSchema): + neurodata_type = 'OphysMetadata' + neurodata_type_inc = 'LabMetaData' + neurodata_doc = "Metadata for ophys experiments" + neurodata_skip = {"date_of_acquisition"} + + """This schema contains metadata pertaining to optical physiology (ophys). + """ + ophys_experiment_id = fields.Int( + doc='Unique ID for the ophys experiment (aka imaging plane)', + required=True + ) + ophys_session_id = fields.Int( + doc='Unique ID for the ophys session', + required=True + ) + experiment_container_id = fields.Int( + doc='Container ID for the container that contains this ophys session', + required=True, + ) + imaging_depth = fields.Int( + doc=('Depth (microns) below the cortical surface ' + 'targeted for two-photon acquisition'), + required=True, + ) + field_of_view_width = fields.Int( + doc='Width of optical physiology imaging plane in pixels', + required=True, + ) + field_of_view_height = fields.Int( + doc='Height of optical physiology imaging plane in pixels', + required=True, + ) + imaging_plane_group = fields.Int( + doc=('A numeric index which indicates the order that an imaging plane ' + 'was acquired for a mesoscope experiment. Will be -1 for ' + 'non-mesoscope data'), + required=True + ) + imaging_plane_group_count = fields.Int( + doc=('The total number of plane groups collected in a session ' + 'for a mesoscope experiment. Will be 0 if the scope did not ' + 'capture multiple concurrent imaging planes.'), + required=True + ) + + +class OphysBehaviorMetadataSchema(BehaviorMetadataSchema, OphysMetadataSchema): + """ This schema contains fields pertaining to ophys+behavior. It is used + as a template for generating our custom NWB behavior + ophys extension. + """ + + neurodata_type = 'OphysBehaviorMetadata' + neurodata_type_inc = 'BehaviorMetadata' + neurodata_doc = "Metadata for behavior + ophys experiments" + # Fields to skip converting to extension + # They already exist as attributes for the following pyNWB classes: + # OpticalChannel, ImagingPlane, NWBFile + neurodata_skip = {"emission_lambda", "excitation_lambda", "indicator", + "targeted_structure", "date_of_acquisition", + "ophys_frame_rate"} + + +class CompleteOphysBehaviorMetadataSchema(OphysBehaviorMetadataSchema, + SubjectMetadataSchema): + """This schema combines fields from behavior, ophys, and subject schemas. + Metadata info is passed by the behavior+ophys session in a combined lump + containing all the field types. + """ + pass + + +class BehaviorTaskParametersSchema(RaisingSchema): + """This schema encompasses task parameters used for behavior or + ophys + behavior. + """ + neurodata_type = 'BehaviorTaskParameters' + neurodata_type_inc = 'LabMetaData' + neurodata_doc = "Metadata for behavior or behavior + ophys task parameters" + + blank_duration_sec = fields.List( + fields.Float, + doc=('The lower and upper bound (in seconds) for a randomly chosen ' + 'inter-stimulus interval duration for a trial'), + required=True, + shape=(2,), + ) + stimulus_duration_sec = fields.Float( + doc='Duration of each stimulus presentation in seconds', + required=True, + allow_nan=True + ) + omitted_flash_fraction = fields.Float( + doc='Fraction of flashes/image presentations that were omitted', + required=True, + allow_nan=True, + ) + response_window_sec = fields.List( + fields.Float, + doc=('The lower and upper bound (in seconds) for a randomly chosen ' + 'time window where subject response influences trial outcome'), + required=True, + shape=(2,), + ) + reward_volume = fields.Float( + doc='Volume of water (in mL) delivered as reward', + required=True, + ) + auto_reward_volume = fields.Float( + doc='Volume of water (in mL) delivered as an automatic reward', + required=True, + ) + session_type = fields.String( + doc='Stage of behavioral task', + required=True, + ) + stimulus = fields.String( + doc='Stimulus type', + required=True, + ) + stimulus_distribution = fields.String( + doc=("Distribution type of drawing change times " + "(e.g. 'geometric', 'exponential')"), + required=True, + ) + task = fields.String( + doc='The name of the behavioral task', + required=True, + ) + n_stimulus_frames = fields.Int( + doc='Total number of stimuli frames', + required=True, + ) + + +class EyeTrackingRigGeometry(RaisingSchema): + """Eye tracking rig geometry""" + values = fields.Float( + doc='position/rotation with respect to (x, y, z)', + required=True, + shape=(3,) + ) + unit_of_measurement = fields.Str( + doc='Unit of measurement for the data', + required=True + ) + + +class OphysEyeTrackingRigMetadataSchema(RaisingSchema): + """This schema encompasses metadata for ophys experiment rig + """ + neurodata_type = 'OphysEyeTrackingRigMetadata' + neurodata_type_inc = 'NWBDataInterface' + neurodata_doc = "Metadata for ophys experiment rig" + + equipment = fields.Str( + doc='Description of rig', + required=True + ) + monitor_position = fields.Nested( + EyeTrackingRigGeometry, + doc='position of monitor (x, y, z)', + required=True + ) + camera_position = fields.Nested( + EyeTrackingRigGeometry, + doc='position of camera (x, y, z)', + required=True + ) + led_position = fields.Nested( + EyeTrackingRigGeometry, + doc='position of LED (x, y, z)', + required=True + ) + monitor_rotation = fields.Nested( + EyeTrackingRigGeometry, + doc='rotation of monitor (x, y, z)', + required=True + ) + camera_rotation = fields.Nested( + EyeTrackingRigGeometry, + doc='rotation of camera (x, y, z)', + required=True + ) diff --git a/brain_observatory/behavior/session_metrics.py b/brain_observatory/behavior/session_metrics.py new file mode 100644 index 0000000000..d9f523b954 --- /dev/null +++ b/brain_observatory/behavior/session_metrics.py @@ -0,0 +1,37 @@ +import numpy as np +from allensdk.brain_observatory.behavior import trial_masks as masks + +def response_bias(trials, detect_col, trial_types=("go", "catch")): + """ + Calculate the response bias for a subset of trial types from a behavioral + training dataframe. + Args: + trials (pandas.DataFrame): Dataframe containing trial-level information + from a behavioral training session. Required columns: + "trial_type", `detect_col`. + detect_col (str): Name of column containing boolean + or numeric codings (0/1) for whether or not the mouse had a + response. + trial_types (iterable<str>): Iterable containing string trial types + to check for the response bias. Trials of types not included in this + iterable will be ignored. Default=("go", "catch") + Return: + The response bias (or average value of the `detect_col`) + for trials in `trial_types`. + """ + mask = masks.trial_types(trials, trial_types) + return trials[mask][detect_col].mean() + + +def num_contingent_trials(session_trials): + """ + Returns the number of "go" and "catch" trials in a training session + dataframe. + Args: + session_trials (pandas.DataFrame): a pandas.DataFrame describing + behavior training trials, with the string column "trial_type" + describing the type of trial. + Returns (int): Number of "go" and "catch" trials + """ + return session_trials["trial_type"].isin(["go", "catch"]).sum() + diff --git a/brain_observatory/behavior/stimulus_processing.py b/brain_observatory/behavior/stimulus_processing.py new file mode 100644 index 0000000000..a95b048656 --- /dev/null +++ b/brain_observatory/behavior/stimulus_processing.py @@ -0,0 +1,540 @@ +import pickle +import warnings +from typing import Dict, List, Tuple, Union, Optional + +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.behavior.data_objects.stimuli\ + .stimulus_templates import \ + StimulusTemplate, StimulusTemplateFactory +from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ + convert_filepath_caseinsensitive, get_image_set_name + + +def load_pickle(pstream): + return pickle.load(pstream, encoding="bytes") + + +def get_stimulus_presentations(data, stimulus_timestamps) -> pd.DataFrame: + """ + This function retrieves the stimulus presentation dataframe and + renames the columns, adds a stop_time column, and set's index to + stimulus_presentation_id before sorting and returning the dataframe. + :param data: stimulus file associated with experiment id + :param stimulus_timestamps: timestamps indicating when stimuli switched + during experiment + :return: stimulus_table: dataframe containing the stimuli metadata as well + as what stimuli was presented + """ + stimulus_table = get_visual_stimuli_df(data, stimulus_timestamps) + # workaround to rename columns to harmonize with visual + # coding and rebase timestamps to sync time + stimulus_table.insert(loc=0, column='flash_number', + value=np.arange(0, len(stimulus_table))) + stimulus_table = stimulus_table.rename( + columns={'frame': 'start_frame', + 'time': 'start_time', + 'flash_number': 'stimulus_presentations_id'}) + stimulus_table.start_time = [stimulus_timestamps[int(start_frame)] + for start_frame in + stimulus_table.start_frame.values] + end_time = [] + for end_frame in stimulus_table.end_frame.values: + if not np.isnan(end_frame): + end_time.append(stimulus_timestamps[int(end_frame)]) + else: + end_time.append(float('nan')) + + stimulus_table.insert(loc=4, column='stop_time', value=end_time) + stimulus_table.set_index('stimulus_presentations_id', inplace=True) + stimulus_table = stimulus_table[sorted(stimulus_table.columns)] + return stimulus_table + + +def get_images_dict(pkl) -> Dict: + """ + Gets the dictionary of images that were presented during an experiment + along with image set metadata and the image specific metadata. This + function uses the path to the image pkl file to read the images and their + metadata from the pkl file and return this dictionary. + Parameters + ---------- + pkl: The pkl file containing the data for the stimuli presented during + experiment + + Returns + ------- + Dict: + A dictionary containing keys images, metadata, and image_attributes. + These correspond to paths to image arrays presented, metadata + on the whole set of images, and metadata on specific images, + respectively. + + """ + # Sometimes the source is a zipped pickle: + pkl_stimuli = pkl["items"]["behavior"]["stimuli"] + metadata = {'image_set': pkl_stimuli["images"]["image_path"]} + + # Get image file name; + # These are encoded case-insensitive in the pickle file :/ + filename = convert_filepath_caseinsensitive(metadata['image_set']) + + image_set = load_pickle(open(filename, 'rb')) + images = [] + images_meta = [] + + ii = 0 + for cat, cat_images in image_set.items(): + for img_name, img in cat_images.items(): + meta = dict( + image_category=cat.decode("utf-8"), + image_name=img_name.decode("utf-8"), + orientation=np.NaN, + phase=np.NaN, + spatial_frequency=np.NaN, + image_index=ii, + ) + + images.append(img) + images_meta.append(meta) + + ii += 1 + + images_dict = dict( + metadata=metadata, + images=images, + image_attributes=images_meta, + ) + + return images_dict + + +def get_gratings_metadata(stimuli: Dict, start_idx: int = 0) -> pd.DataFrame: + """ + This function returns the metadata for each unique grating that was + presented during the experiment. If no gratings were displayed during + this experiment it returns an empty dataframe with the expected columns. + Parameters + ---------- + stimuli: + The stimuli field (pkl['items']['behavior']['stimuli']) loaded + from the experiment pkl file. + start_idx: + The index to start index column + + Returns + ------- + pd.DataFrame: + DataFrame containing the unique stimuli presented during an + experiment. The columns contained in this DataFrame are + 'image_category', 'image_name', 'image_set', 'phase', + 'spatial_frequency', 'orientation', and 'image_index'. + This returns empty if no gratings were presented. + + """ + if 'grating' in stimuli: + phase = stimuli['grating']['phase'] + correct_freq = stimuli['grating']['sf'] + set_logs = stimuli['grating']['set_log'] + unique_oris = set([set_log[1] for set_log in set_logs]) + + image_names = [] + + for unique_ori in unique_oris: + image_names.append(f"gratings_{float(unique_ori)}") + + grating_dict = { + 'image_category': ['grating'] * len(unique_oris), + 'image_name': image_names, + 'orientation': list(unique_oris), + 'image_set': ['grating'] * len(unique_oris), + 'phase': [phase] * len(unique_oris), + 'spatial_frequency': [correct_freq] * len(unique_oris), + 'image_index': range(start_idx, start_idx + len(unique_oris), 1) + } + grating_df = pd.DataFrame.from_dict(grating_dict) + else: + grating_df = pd.DataFrame(columns=['image_category', + 'image_name', + 'image_set', + 'phase', + 'spatial_frequency', + 'orientation', + 'image_index']) + return grating_df + + +def get_stimulus_templates( + pkl: dict, grating_images_dict: Optional[dict] = None, + limit_to_images: Optional[List] = None) -> Optional[StimulusTemplate]: + """ + Gets images presented during experiments from the behavior stimulus file + (*.pkl) + + Parameters + ---------- + pkl : dict + Loaded pkl dict containing data for the presented stimuli. + grating_images_dict : Optional[dict] + Because behavior pkl files do not contain image versions of grating + stimuli, they must be obtained from an external source. The + grating_images_dict is a nested dictionary where top level keys + correspond to grating image names (e.g. 'gratings_0.0', + 'gratings_270.0') as they would appear in table returned by + get_gratings_metadata(). Sub-nested dicts are expected to have 'warped' + and 'unwarped' keys where values are numpy image arrays + of aforementioned warped or unwarped grating stimuli. + limit_to_images: Optional[list] + Only return images given by these image names + + Returns + ------- + StimulusTemplate: + StimulusTemplate object containing images that were presented during + the experiment + + """ + + pkl_stimuli = pkl['items']['behavior']['stimuli'] + if 'images' in pkl_stimuli: + images = get_images_dict(pkl) + image_set_filepath = images['metadata']['image_set'] + image_set_name = get_image_set_name(image_set_path=image_set_filepath) + image_set_name = convert_filepath_caseinsensitive( + image_set_name) + + attrs = images['image_attributes'] + image_values = images['images'] + if limit_to_images is not None: + keep_idxs = [ + i for i in range(len(images)) if + attrs[i]['image_name'] in limit_to_images] + attrs = [attrs[i] for i in keep_idxs] + image_values = [image_values[i] for i in keep_idxs] + + return StimulusTemplateFactory.from_unprocessed( + image_set_name=image_set_name, + image_attributes=attrs, + images=image_values + ) + elif 'grating' in pkl_stimuli: + if (grating_images_dict is None) or (not grating_images_dict): + raise RuntimeError("The 'grating_images_dict' param MUST " + "be provided to get stimulus templates " + "because this pkl data contains " + "gratings presentations.") + gratings_metadata = get_gratings_metadata( + pkl_stimuli).to_dict(orient='records') + + unwarped_images = [] + warped_images = [] + for image_attrs in gratings_metadata: + image_name = image_attrs['image_name'] + grating_imgs_sub_dict = grating_images_dict[image_name] + unwarped_images.append(grating_imgs_sub_dict['unwarped']) + warped_images.append(grating_imgs_sub_dict['warped']) + + return StimulusTemplateFactory.from_processed( + image_set_name='grating', + image_attributes=gratings_metadata, + unwarped=unwarped_images, + warped=warped_images + ) + else: + warnings.warn( + "Could not determine stimulus template images from pkl file. " + f"The pkl stimuli nested dict " + "(pkl['items']['behavior']['stimuli']) contained neither " + "'images' nor 'grating' but instead: " + f"'{pkl_stimuli.keys()}'" + ) + return None + + +def get_stimulus_metadata(pkl) -> pd.DataFrame: + """ + Gets the stimulus metadata for each type of stimulus presented during + the experiment. The metadata is return for gratings, images, and omitted + stimuli. + Parameters + ---------- + pkl: the pkl file containing the information about what stimuli were + presented during the experiment + + Returns + ------- + pd.DataFrame: + The dataframe containing a row for every stimulus that was presented + during the experiment. The row contains the following data, + image_category, image_name, image_set, phase, spatial_frequency, + orientation, and image index. + + """ + stimuli = pkl['items']['behavior']['stimuli'] + if 'images' in stimuli: + images = get_images_dict(pkl) + stimulus_index_df = pd.DataFrame(images['image_attributes']) + image_set_filename = convert_filepath_caseinsensitive( + images['metadata']['image_set']) + stimulus_index_df['image_set'] = get_image_set_name( + image_set_path=image_set_filename) + else: + stimulus_index_df = pd.DataFrame(columns=[ + 'image_name', 'image_category', 'image_set', 'phase', + 'spatial_frequency', 'image_index']) + + # get the grating metadata will be empty if gratings are absent + grating_df = get_gratings_metadata(stimuli, + start_idx=len(stimulus_index_df)) + stimulus_index_df = stimulus_index_df.append(grating_df, + ignore_index=True, + sort=False) + + # Add an entry for omitted stimuli + omitted_df = pd.DataFrame({'image_category': ['omitted'], + 'image_name': ['omitted'], + 'image_set': ['omitted'], + 'orientation': np.NaN, + 'phase': np.NaN, + 'spatial_frequency': np.NaN, + 'image_index': len(stimulus_index_df)}) + stimulus_index_df = stimulus_index_df.append(omitted_df, ignore_index=True, + sort=False) + stimulus_index_df.set_index(['image_index'], inplace=True, drop=True) + return stimulus_index_df + + +def _resolve_image_category(change_log, frame): + for change in (unpack_change_log(c) for c in change_log): + if frame < change['frame']: + return change['from_category'] + + return change['to_category'] + + +def _get_stimulus_epoch(set_log: List[Tuple[str, Union[str, int], int, int]], + current_set_index: int, start_frame: int, + n_frames: int) -> Tuple[int, int]: + """ + Gets the frame range for which a stimuli was presented and the transition + to the next stimuli was ongoing. Returns this in the form of a tuple. + Parameters + ---------- + set_log: List[Tuple[str, Union[str, int], int, int + The List of Tuples in the form of + (stimuli_type ('Image' or 'Grating'), + stimuli_descriptor (image_name or orientation of grating in degrees), + nonsynced_time_of_display (not sure, it's never used), + display_frame (frame that stimuli was displayed)) + current_set_index: int + Index of stimuli set to calculate window + start_frame: int + frame where stimuli was set, set_log[current_set_index][3] + n_frames: int + number of frames for which stimuli were displayed + + Returns + ------- + Tuple[int, int]: + A tuple where index 0 is start frame of stimulus window and index 1 is + end frame of stimulus window + + """ + try: + next_set_event = set_log[current_set_index + 1] + except IndexError: # assume this is the last set event + next_set_event = (None, None, None, n_frames,) + + return start_frame, next_set_event[3] # end frame isn't inclusive + + +def _get_draw_epochs(draw_log: List[int], start_frame: int, + stop_frame: int) -> List[Tuple[int, int]]: + """ + Gets the frame numbers of the active frames within a stimulus window. + Stimulus epochs come in the form [0, 0, 1, 1, 0, 0] where the stimulus is + active for some amount of time in the window indicated by int 1 at that + frame. This function returns the ranges for which the set_log is 1 within + the draw_log window. + Parameters + ---------- + draw_log: List[int] + A list of ints indicating for what frames stimuli were active + start_frame: int + The start frame to search within the draw_log for active values + stop_frame: int + The end frame to search within the draw_log for active values + + Returns + ------- + List[Tuple[int, int]] + A list of tuples indicating the start and end frames of every + contiguous set of active values within the specified window + of the draw log. + """ + draw_epochs = [] + current_frame = start_frame + + while current_frame <= stop_frame: + epoch_length = 0 + while current_frame < stop_frame and draw_log[current_frame] == 1: + epoch_length += 1 + current_frame += 1 + else: + current_frame += 1 + + if epoch_length: + draw_epochs.append( + (current_frame - epoch_length - 1, current_frame - 1,) + ) + + return draw_epochs + + +def unpack_change_log(change): + (from_category, from_name), (to_category, to_name,), time, frame = change + + return dict( + frame=frame, + time=time, + from_category=from_category, + to_category=to_category, + from_name=from_name, + to_name=to_name, + ) + + +def get_visual_stimuli_df(data, time) -> pd.DataFrame: + """ + This function loads the stimuli and the omitted stimuli into a dataframe. + These stimuli are loaded from the input data, where the set_log and + draw_log contained within are used to calculate the epochs. These epochs + are used as start_frame and end_frame and converted to times by input + stimulus timestamps. The omitted stimuli do not have a end_frame by design + though there duration is always 250ms. + :param data: the behavior data file + :param time: the stimulus timestamps indicating when each stimuli is + displayed + :return: df: a pandas dataframe containing the stimuli and omitted stimuli + that were displayed with their frame, end_frame, start_time, + and duration + """ + + stimuli = data['items']['behavior']['stimuli'] + n_frames = len(time) + visual_stimuli_data = [] + for stimuli_group_name, stim_dict in stimuli.items(): + for idx, (attr_name, attr_value, _time, frame,) in \ + enumerate(stim_dict["set_log"]): + orientation = attr_value if attr_name.lower() == "ori" else np.nan + image_name = attr_value if attr_name.lower() == "image" else np.nan + + stimulus_epoch = _get_stimulus_epoch( + stim_dict["set_log"], + idx, + frame, + n_frames, + ) + draw_epochs = _get_draw_epochs( + stim_dict["draw_log"], + *stimulus_epoch + ) + + for idx, (epoch_start, epoch_end,) in enumerate(draw_epochs): + # visual stimulus doesn't actually change until start of + # following frame, so we need to bump the + # epoch_start & epoch_end to get the timing right + epoch_start += 1 + epoch_end += 1 + + visual_stimuli_data.append({ + "orientation": orientation, + "image_name": image_name, + "frame": epoch_start, + "end_frame": epoch_end, + "time": time[epoch_start], + "duration": time[epoch_end] - time[epoch_start], + # this will always work because an epoch + # will never occur near the end of time + "omitted": False, + }) + + visual_stimuli_df = pd.DataFrame(data=visual_stimuli_data) + + # Add omitted flash info: + try: + omitted_flash_frame_log = \ + data['items']['behavior']['omitted_flash_frame_log'] + except KeyError: + # For sessions for which there were no omitted flashes + omitted_flash_frame_log = dict() + + omitted_flash_list = [] + for _, omitted_flash_frames in omitted_flash_frame_log.items(): + stim_frames = visual_stimuli_df['frame'].values + omitted_flash_frames = np.array(omitted_flash_frames) + + # Test offsets of omitted flash frames + # to see if they are in the stim log + offsets = np.arange(-3, 4) + offset_arr = np.add( + np.repeat(omitted_flash_frames[:, np.newaxis], + offsets.shape[0], axis=1), + offsets) + matched_any_offset = np.any(np.isin(offset_arr, stim_frames), axis=1) + + # Remove omitted flashes that also exist in the stimulus log + was_true_omitted = np.logical_not(matched_any_offset) # bool + omitted_flash_frames_to_keep = omitted_flash_frames[was_true_omitted] + + # Have to remove frames that are double-counted in omitted log + omitted_flash_list += list(np.unique(omitted_flash_frames_to_keep)) + + omitted = np.ones_like(omitted_flash_list).astype(bool) + time = [time[fi] for fi in omitted_flash_list] + omitted_df = pd.DataFrame({'omitted': omitted, + 'frame': omitted_flash_list, + 'time': time, + 'image_name': 'omitted'}) + + df = pd.concat((visual_stimuli_df, omitted_df), + sort=False).sort_values('frame').reset_index() + return df + + +def is_change_event(stimulus_presentations: pd.DataFrame) -> pd.Series: + """ + Returns whether a stimulus is a change stimulus + A change stimulus is defined as the first presentation of a new image_name + Omitted stimuli are ignored + The first stimulus in the session is ignored + + :param stimulus_presentations + The stimulus presentations table + + :return: is_change: pd.Series indicating whether a given stimulus is a + change stimulus + """ + stimuli = stimulus_presentations['image_name'] + + # exclude omitted stimuli + stimuli = stimuli[~stimulus_presentations['omitted']] + + prev_stimuli = stimuli.shift() + + # exclude first stimulus + stimuli = stimuli.iloc[1:] + prev_stimuli = prev_stimuli.iloc[1:] + + is_change = stimuli != prev_stimuli + + # reset back to original index + is_change = is_change \ + .reindex(stimulus_presentations.index) \ + .rename('is_change') + + # Excluded stimuli are not change events + is_change = is_change.fillna(False) + + return is_change diff --git a/brain_observatory/behavior/swdb/__pycache__/analysis_tools.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/analysis_tools.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb0a7e0a5f94d3e2671e1b5743fa5aad50fa7c20 GIT binary patch literal 2690 zcmai0&2Jk;6rY*3osAPa&PQ9)9+(q~QJYAO#G#@nrGnCeIPh^<j8<dM*xqKnyP6rt zwX_kT1&K@V920Tke}R8sk3~YtnHwC+o0(lF5g^9d`JOlL{oe1r%=@iY6G55$^erPT zgnl!Fs;oih06z6QR2*>}qrkN|z;;Xm&$hLoZreuC;DmeMp<s#EcpX}wH~12?%c9Bs zLn2=Z@97F(7OTAZk_4?QqqbP$E28~^1Z&V+wY`pLi?waUTZcsbpx2*c7<XXYhVhSP z%-48lM1l?Bi<UVpHuyT<cv<g}U^Cbf-sv^53H5cp$+!45ex2XoE#BsD@NIr`)I7t7 z<P57<RucXkb#I-6t?1JMF%1+Cz8ZWF;Zq%`G&;pO&e0h;COLr<m_32bO$z0a&{U5F zO$3udX*!f_BB+igFkq964pT{4GPg4{OQS?L?YS?;k)rT-7$uz1Bn2sQDt4)zmqJfv zqO4$87tbiubT*C#V>(Z#be2wIZly$t64EJPuC(&0PALdrQDV=l6gH%i3rW+Vorxo* zZ&Q`hXlTS)K~n`vgBk9&)EzY&?V-vV<*tw7n6h}r=8BF=^VNjKv9aGuTbOT50M)_H zn8^{S0K>!xk#JKs1<fnbbjM&|rCLP>ajHOG*P-=5j?_IX+F*WR>dr7uneN^L*c|8% z0SgjKK;9*P7*|{oVI8FCjx$rzB->?DvUztQt=s{)2?p3(-#Udpa~`_Tsq}y7{J#T! zF10EVb<ii`Sw#`!9x&c&)FnluA1N`=#fodgSPXU7E0!0w7R?1#DrjA~?q?($K+`|J zd3dk)B@jaO*qHI%KAQpadJhsdNP%SgJ&_!#UYdzS4WLf5@m%#jiTXViX>liGgF`kF za26byD1Nxtm%yPg?SsT4rc*iJ>x(fvic-0!X1u@05*E)@q(YshvD(e%#X8U-yrSBY zi6IkAsI!Wt5AC3CMo>%=GJP9n5;{40igNN4L6~<mevWhRxULBV9(h5I8+k)}d7a~J zl-IV<3w#3|FO_rT(wwhrr}Z4=OS%6&%%9<7WM{~wnPpgC9-2V**sUs%okuPAj#xYu ziZYo_6Am0&_<&ATl#F0z23}2Pl#5}M2o7AP;5-0X{VQE18wlWcMX!>rcGg{Wg_e%O z|H151CzlH#&{>wnkX(TMPNgf7DuQ3Wc@b|HI@=s&3GS{g6NfemF624!p}Rj^AQF~# zmr*o}^q2yD?%%)Ly@(AHvtQl0dz<cm?ebxTpG^*+rPPYvtsta*0g>v`(c&J+p)TVY zS*8d8o9-{pu%Q-m*JU5GY{M{=Oat(jbA$^|JHJS&20d%6$y0+A=s(bc?^@F(24bF@ zs@o{)YRocGv>zywb)z)-K+05FRu>*bd_j_|sJk4}Eb3OKG~}0t=f#`<gJIFU(7I^2 z&B3Od14J%B4_4xICZx+X!OAqt76Y3ktQ(ch39d3xSll$hX?6OC7jMG4{ZEJ1I;4i1 zcnf|T@ROUcGVq`>#aLlP*@%4yIypW?XXx0|_>|-b;?uM7Nlbj&k%>$@Dr2#h*G$xX zYGIYjAfj6<YLJcQ5?&(kgh*I25iF6bW~naCb0jF)5?UXZ7Fg0$<df^LO>UUIHGA4* z!%LQL7|YE<2>Hz6x(_>)*@m!>-^TJ9^a?)=Cnn{E=NyJz3@;o#&%|iols`T?82$PS zl-0)vBXba;s&n%A;QX)GuV0@VfSgs>>g4vFd{`ZLRCZ3P4g#T8)JfGrPpX-!gFZg! z-Y7gZR|QE`P*0|l3a&;5VZmTN<I=odEETQK76v8o90|jq!6ZvYqNv+ou(&!>Vpib3 zTrr2uQzvNX5OR_VYQPm$c<|3aw$0)Nq_$^hQ26goQa+8vdnP{ATTuCcru`9r)8F>% UK5pYSY2qg7;0`e>1h1060m%*d7ytkO literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/behavior_project_cache.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/behavior_project_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d9761e02d824dec7dd23c464a92eea2cf04ab5e GIT binary patch literal 17478 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/create_multi_session_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/create_multi_session_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50e84dce3abff0876e8a40d6b562165e08bf4301 GIT binary patch literal 1569 zcmcIkPjAym6!$o8>ZVDX{-Fg4i5#f}G3<(!KnOvB8v-O)tu%@>8hc*iN$s(BW|ENH z5Em}}1{_*(+Ap*RUpes=IPvT>(4ZcRt-P7ZoA>Yce$R)kR>Q$3{rsN)Rd<{(<zeyQ z*?EjV^FIpV2$DE-z7k5RvrB8Zx`~&r&^jq~HQcXKANQVE5p}UD{7)WTgZfDW)=mjs zhxK8THlaCeoot*sbQ9WQ?E@hW_`@w&hfUEC>jPIbk85;WwCE0O4|l;CUOCx=9kFrh zicQfzcJY2&Y%SSsqvZ}-?jCz|zp~svXL)7Ga<8-$<c)K%{}pR<ULKHQFNBznWu{rK zvmr#5MLdcDHESa)6KN%w*&yIa0xG~O1I<$tgqllb$H64iM+2RWaucZNc9zFe6O5%9 z@q{h>25<g(cF6v?bNBwQ8YZ~qEagh}!PstO#<N$K6G%-$)|Uxp{`PVla>bLWk><>6 z_&dC^6f7?x=?+b%4m{dgK*MrwW7;gM3b_F$q^A4JDg9Jj|3$IzS~;0r8-N1MtyF_f z3Ioopme{OR^l3YSBw;3pNT#5e6m%<!xf%eIDMzVzTGFBsWlA6|GG%7ZF9nC$jdYY) z$qX2SZV?Br=6M+=`rY^*bwwW|*N$L1I}n+I&P3X{Q>AWhbs`Pt3hF1^#AQKmY2#et zE?uoOV6=zSpLH&Xd3IqQbhiC7Ql;o%5?2d1Gt`Uk<x^VExf0wIZZ7D}YCeoO>Q<A% zve1AYbDQaDcQFWEGZCS7F*vP-d8BK&E8LN#jcVdp*>$>mcs7o&=hOJK9L8d$x>5KG zLeQOR)EK<WL6_aK*sh{JQu5ys(2b?PO|g<|99DY0!U@;~g=6<Omf2AFhL7h=tJ{pl zqF;C=3kz?UNp*Jn2h{&Lx{cLT;@iik4|;!N`KHHXF1jI~a5e2cQM@D$|FZ{bY<gJ^ z%0wuuLV7P`*fY|??VLwPNH(-BKR5{J{8Mut&|m>*Py!lUSQXMHpBDbZG!vr)9uZ8= g+(hA%@@<l4%_ZgQ*BYcw8m>=viAS!YZm(Lu14i)?m;e9( literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/run_multi_session_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_multi_session_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52508de6fe5ed14503fb9afafdf8ac6f740e09e1 GIT binary patch literal 954 zcmbVKy^hmB5cWED;^cC`H9P`Rin|R*cOb;^R{%mtCz@3xYwevlo7lT%cb(vL6qL}? zTmhouQFsNnRQC#0jFa3+APU6JdUp25^UZuS5BK*69**McJN~`nc|Y3C<>;aD06(ix z2~UvRW80N50%Y!g?g;-2A?;Zw4~me58=K@^))N7XM9BK0D|#Xledvq9dB_G3LNp~} zPY{%$*gp?o@X7y3=6m9rxc;H_M$Wv^jSIx|Uap@|p68%wX>?|IVQFHxRBlOE+AK1o ztI|@H9_n&dqaoA9QK{7ujHA}1v`nniI=3Uz^k3C(rqwf@tQno@0%*aFR6L`nEx_61 z=UXHz7FCl<_-J8f#3z>F`YHq@>}LQ@0WL0nY1ld%PBrB<<+9+mYv{_l9xys{2V zJV#u*ls1W5tk_ls23p5cnN<cX>+J|&!R_%lTlbDn#$%ip1nC-uP57pQ3RtIrf<-Ij z&dCC|WvQAjdKS{G@BW@XS3K29@M8*Uxk0XY9$zLLZ}^Z{fDL`@;LoJ(C}<A0modDB zv~oPjf$i;%xXCQ*ZvbNS&w3by;srb%5!Mx^HkBF;8(-U|V{6+4C3mx?%gYj!V9{m$ zjE~u|n^!?$H_Rb*amv#fW|x%d72s6nV8ZtK5TUR-&PkP_dqn!?nIYb6)X(>iPA0Fh z!gj)ETpT5Q#Z^5y-LY|J(y}qp7>7+!ZyId!LM9U{9UPWCUGNO>-?n-FrDqWSZw=E# k_X;hl9PYOTw6{=2BqBqUC<y$(_sLeGj!%M}-NhHb0G{|apa1{> literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/run_save_extended_stimulus_presentations_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_save_extended_stimulus_presentations_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cac9846cf7a39dfc9b456616fc412a0de4ecfac GIT binary patch literal 1554 zcmb_c-EQMV6!ye%;-pEp*%nqjLL|0MTachai0u|G0KrNXsx%53jXfucQ+vicGj=vc zT<`#Ji;#NJ3T}89Uck3p?JID_aegY61&N>a$j9UH@pr!Y&N*||?{^)%(jUL!zj%)G zYyGmlIym_NZ}Srx;RupAbp0fh0GT&#T+z5Cq+WBAX6jLIH77}nwndZr!lND05^dp& z4s=BK+M`{uBYL7QcCTH!1MQn0?A#LChyHw5+<U{B-=lla-h#bz=gT+g06g#~MC`#p z5HYy94})7G?q4^d`+eg(GT#^b;^141|1`Tqb{Ed@wdcsx`K<gf;7I~9$h4Yjo|+)k zJeIZy7D``DwaPOS$mpTUW=ovJ(bZw5WC7X+Mn^#w8mm-dhNS8|S=yPBAFHtZ;eTO1 zs`*@;f3gNK;%ZHasnCEfxK(-?gfQbptaM-&A`A>KfWb2hQh;E_#%Z49hGiNINXu=k zq+w!mm@P~GpQ%L%X+g6&@(7McNAHf_IXYo4ho<d~g48{Fds?<frzfM+(daorxrbim zJ<TBp>ZXuVe}UQ~TYSwjS+x*a#JZgR8;(V6a-Og|K`t)O&sa?__|q3AxaBP6GM<33 zhmk4D&tFX-xd_=LPQa9xuLclPsrecbt>nqjrTr~)mT^0yy*g;f4KP%UKH%uIG_l$I zboXI@Rkv6h8EDj5S{94)IGCvvUMyw=h?ErkBmh~M%{Iaq`(jnq<%5^YOH9~TUk{tr zVC{lIAj&Nd6QDbrC9bE2c2>X)acLVfEO`na4GC=tz0|oJ9#jowD%UJc)vUKxwRo0c zB~yRfT)Kg!Lto#f80%WiA+jvu(F{u`%%Z!1bs97tP7dv1C}zOgSR#k+%9qWJlJwwg z(>zbsIFD<X%3FC<{#NFyRq!MSLw8>g&)@;{M=`6`MCp{<%Ei6>?C3p=y)wUDKRz9Q zfgNkce8$CL$QN8L$B(u;k87RB3U_KEw5vRgKaIn&i7h<Lcyz_5fdAHq!9O_zF#KOM w<KLYFmH%F<M4rI=bz7QaG(Pc34~O4q;%Jcd@ZI|9yWK{w(ZyMFvyOh`cMK>Kn*aa+ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/run_save_flash_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_save_flash_response_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e940f1867b3a4846d0e3882ea8f7ca13b96a127c GIT binary patch literal 1516 zcmb_c%Z}qj6m`XM;-r(F&U6Ff6CyF~beIJ*8X=~qVF3sRwa`eVpi<d&lQ?Zxd8*1z z$A|?xBm`SFz33Kf_yfMhTUPT6thml&V0cJ8#$}i5<#TSGy2q#ee%HY({r*e-ljk@; z*PY$f!NxoIm>;kbjv$FcH*Z1-kVWI#6^$E0>M=KIrXKayZIZNTTQsRJJlYX0(H6ew zKu2`1JlYj|q9^)d|H`F%(7x`$-VLFB=r8ugt=FB!EqZWy7Y@#x&)%Q|@W7uEaR38B z#Nhfi3~q?Hebt2Sca3k!;!qrlqi>M^Y4!x8J9mb!Ji|zxkIHugo+KcHOskpZsR=^O zV`+<Esr1E6t2{G-jP9sxzQRTvT^wgh7NBilbQENvu}URoNUF}`m7Od3z6#5){uk!M zI-c{h4>ll1Tx>#ODm0)AZk1jIA<TIZD;=1n2m`|lVAF(~In!V;J_AflkF!+?|2dK< z$&Cfg7DyY6M<@42Z=H<TUo+A6Ry694@6Jm9WPE=#!uuIPiHBb0J<TBp>ZXuVe~EhA zIK^(3$*P6;BG%>X-vnC3Cg%xzF2ebfvr|^b82n*|32r${xs0b^>~Um@^5d67B$pwZ z#tE46la~Vsmsax)<j|%4UCb=wc20XWUC8TWjWvCZOP;JuY&Oe(n>bu&DTB)lG%74D zi$ysO<|>63Qx^duB?W&o09lyr2ErI!u+HJ~=ugSSKL29atOlETWPm8QJWPP@ZHKs? z8QNK+G6bb<JXpz7cyCB(OX!u(<?yI#C{wv+WvXVqud2nf45Xm`&PTd|8AD&)oh(CF zE+Dcj;?W#4Cd{Jegtht_|3eP#Ar&)VZ7eZ{?s_d-7$xb^>DDKYH#m=Kn95tPsQjJA zRjc4h4u<Z(pq#;f&F_`0T2rM{ZYvk}@}r{<kb7PI^7W(plTXo{X2R!O9EW_#<!bV9 zC-S5gd7^NqCc=7sNRtoaaAIN$cQPJb@EPE@weSCl-I4xpjEI)6{0FHLc>-_O<}+ig geBzTH7QfNN(jc4SyY<_5yNzC>i>>B%9M_Rw0W&!Q(f|Me literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/run_save_trial_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_save_trial_response_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58741d661fc978be7b8e906f60da59bf2b6ea9dd GIT binary patch literal 1515 zcmb_cO^@R=7>=8!O*`%EbY}qZ6DqNj&g>$wqZMLj2M&N>(Fm<%6<JRFwoNCov$m5? zgE(+QLU83WhZ(_zU%-FKmDBzOPQ2;I!tx>Uv9aPfw(~si`}low+V6KAywdN#<Ue_i z^K<>Oy*fB}2XFHOcES-Pap?L<C;>8WT)U!iLr6X6Ce75N-fB#e7Hx|r^@T?}q9xkG z7aiz`?v+QoVn_5uU+iAFbO+kkJ=nP+v=9CHuDJEOGrvXmF7LtKne*8jbO0Xs6C(Ct zAcz=T--f{r5x1|J(EYCQEt&6&eR1#&@;}X<V07os@Res6sq<0!ZorcSWRPh!)jTyp zsCg`H5iFFxm}-@0CXmq`mCcqoh@*?cOvwVY4UCS0EHqZB#0*K*dAzhUCEr(J`PKiz zd|1bGe)ho{#E6S^NKAzWbiu9C%OHdqFJh$wvk+lmcmd4nm?unw!T1a?F*(eZCH&_| zq9ivKG@B!Ba6CG?KYHtE#QvIzwl|_t_vp=O*&dzT9i5Cu&j>0!^eXRZ4mnUag_QaW zl-tHBzGj)MS_m&<T~7Z^oJDMMO!c`2=TFW~Ssh~VhZQEc<t*hgo`A83ktxcLUk;I6 zglrNgV9HNk4j^1w&DW4am-e?Yvy9sr?bUQ4uTM4B^ffMdvNW+-Z~tv!e^sOmE;G=m zu(T`|<#8}mDZE&@2oNbL_}u_xVKxbbF`8gi!sWrAYKeXR#jsfo*6YXsQEqvd0NvS4 zaXmG(vqEJEO51p_lBe+AkkFRUOP$N%LDf*Ea?R3I%{s5D#j^~gp#IiIx`7o#U)`Q8 zLsQNnvMl1!3@awgqUVIQ`Wk;j4(%ZoGhl5jF^2AHFPj@B>A~s7CXd%Rk7}68TkWX) zt;SWW;7JaK?!KU$!C%eqm8@D5rBiMz7jya1(R;|f>VEn9(aHEz^rji}85f5kUvRk` zKirBuu0<Xz%+y5KuMTPaVH}Q4Y~fDEqYFL-{I<6JKXE(K|BVmP@s<A|RU%K|?b>|i h7(1W%q=(IKG_f_vy7_MX^xbZw*XZJ?xtYg(<X2lz0@wfm literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/run_summary_figures.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_summary_figures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c63cc0d3c511446e3ec89061982ce1f87c9e5b13 GIT binary patch literal 1654 zcmcgs&u`l{6c%mSmK{5do2<it{R0M8%V}C*ON(JmvmUx(C>9I_2yX->KHG96QXwfj z_OQc%UAOBlIV31hp#PGtJM~}KX-~4<H92hqIuYUzk$T_vKEC&kI-Qn-PxA6-{<`5f ze-w+&)5OUa_?lPP2}h9Fp{tQl0%TgbtcuDNA;q_9>?So@E9WGx(}r-VCu+1Q>Y^b$ z(S)XGUDRkxY>Bq$h;4D}!lhf#xNO7L6`>vIOt;0(N6z#X-8sJxJIBuVpU^JUz#9?h zimo8y_T_EpUJ<c-;X>>8%5P-4EB3?(zaoP({Q~)&IK4Y>kgM~}@=Kq`F-SkvYOHx; z{6O<a+L=FB`gE*SmKtA%cU3xB;3Nu9`>B#M(AGCP^wYptrDD?~dGq<gPLzD6g5|gV zL?z%STt||R{l^8s$?;b!BqL5&7)%8Q^o(1j7k&T}K8uw0&0GY&$rAi|!A8+I(_s4P zV#)q9&oIu61<j_2=g%S&umXeKz@Uw_<FvZ}V7zP$4i5&0gTWhuD)nl4?JR=~Xf=U^ zdUKS_MhPy{ROWRwEF!&}{TqhJBjYi9>-Ncu<0E!&u>YAK@^Av>bnxl^K|%Q4gG_MC zS;A#B0%QB3nJs^KFSv3Zp!_kIW%yp~bIId{iOd@0?0*1Z30Pj}*Pj|CdoJy4bYv;F z6WT6(4!8k^*GWIT&hYPzk8f;jtgejgmYKrfJOzy*A}x!=^5OM_Km(zYg5UE&&dQj) zcEx3eM3|CgLM`{Kjxba(4>0ozawGQRPso02wa>U7o4mVTz&V7O<v|RzSz<7RpbZRB z$rE_mBeX8`LT9qKmsga@t7c(xw{SnN^E3r1sJBUKUBTF=cQ!G~utZEDw5*I!S`E_h zEr%jfbgekvMkr>$+DMKKZLOlY(3|cZt#kbO%FdG_(DPb(BKI~|k=JKD&cM*^YZ4kP zeD6w{*GEbx+~!sE<+Y=C5WDRD{N>5v@H;FlX2>U8^aDQUaxr|omi%B?NIq2PsR^+! zZ)^B<6bwyd;cm*qQ$7a#x2ReFq*NjN%~FEpD)$~GN@Ov7UephBA3KkDq>asU-Ktxu VkX7@lo3T}CS6cYhUGLyY@)yArGJ^mB literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/save_extended_stimulus_presentations_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/save_extended_stimulus_presentations_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30e062be17010c5789f9639154c2e219d2ca6aa6 GIT binary patch literal 5393 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 T-mHu^&uXCC%!Y3)!{7ZMnhC~| literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/save_flash_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/save_flash_response_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d69ed5f1a72ef18e44777f782428dd4396306bb GIT binary patch literal 11142 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 B%x?ey literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/save_trial_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/save_trial_response_df.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2eaf695e5f7b5ceece1c981bf296bd40e8090ea1 GIT binary patch literal 8378 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 JuK&CK{{l{Yc<}%L literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/summary_figures.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/summary_figures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..593d523c6969f475e7dc1726ee5271bffd43d453 GIT binary patch literal 18318 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 WemcchI+;!dmJFJnRfbj1+5ZPfq%92q literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/__pycache__/utilities.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6f93e248f0365beafb960d12a6e44630be53653 GIT binary patch literal 12743 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 CjxjX= literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/swdb/analysis_tools.py b/brain_observatory/behavior/swdb/analysis_tools.py new file mode 100644 index 0000000000..30c6fed88b --- /dev/null +++ b/brain_observatory/behavior/swdb/analysis_tools.py @@ -0,0 +1,92 @@ +import sys +import os +import numpy as np +import pandas as pd +import bisect + +def get_nearest_frame(timepoint, timestamps): + ''' + Get the nearest frame timestamp for any time point + + This is kinda not true. This returns the index at which you would + insert the timepoint to retain the sort order of the list, so if you + use the index on the list of timestamps you will always get the smallest + timestamps that is larger than your input timestamp (not alway the closest) + + Args: + timepoint (float): The timepoint you want a frame time for + timestamps (list or np.array) The timestamps of each frame + + Returns: + nearest_frame (int): The index of the next frame in time + ''' + nearest_frame = bisect.bisect_left(timestamps, timepoint) + return nearest_frame + +def get_trace_around_timepoint(trace, timepoint, timestamps, + window_around_timepoint_seconds, frame_rate): + ''' + Return the values around a timepoint using a window defined in seconds + + Args: + trace (np.array): The trace values + timepoint (float): The timepoint around which to apply the window + timestamps (np.array): Timestamp in seconds for each point in the trace + window_around_timepoint_seconds (list with len==2): + [-2, 3] for a window that starts 2 seconds before the timepoint and + ends 3 seconds after. + frame_rate (float): The frame rate at which the trace is collected. + ''' + + assert trace.shape == timestamps.shape + + window = window_around_timepoint_seconds + frame_for_timepoint = get_nearest_frame(timepoint, timestamps) + lower_frame = frame_for_timepoint + int((window[0] * frame_rate)) + upper_frame = frame_for_timepoint + int((window[1] * frame_rate)) + trace = np.array(trace[lower_frame:upper_frame]) + timepoints = np.array(timestamps[lower_frame:upper_frame]) + return trace, timepoints + +def get_mean_in_window(trace, window_after_trace_start_seconds, frame_rate): + window = window_after_trace_start_seconds.copy() + mean = np.nanmean(trace[int(window[0] * frame_rate): int(window[1] * frame_rate)]) + return mean + +if __name__=="__main__": + trace = np.arange(100, dtype=float) + timestamps = np.arange(100, dtype=float) + + a = get_nearest_frame(49.9, timestamps) + b = get_nearest_frame(50.1, timestamps) + + assert timestamps[a] == 50.0 + assert timestamps[b] == 51.0 + + window_around_timepoint_seconds = [-5, 5] + t_vals, t_ts = get_trace_around_timepoint(trace, 49.9, timestamps, + window_around_timepoint_seconds, + frame_rate=1) + + assert np.all(t_vals == np.array([45., 46., 47., 48., 49., 50., 51., 52., 53., 54.])) + +# def traces_around_timepoints(trace_values, trace_timestamps, event_times, window): +# ''' +# Get peri-event slices of a trace. +# +# Args: +# trace_values (1d np.array): Trace for one cell +# trace_timestamps (1d np.array): Timestamps for each trace value +# event_times (np.array): The times of events you want traces for +# window (2-tuple): Time range around event times +# +# Returns +# eventlocked_traces (np.array with shape (n_events, n_samples_in_window)) +# ''' + + + + + + + diff --git a/brain_observatory/behavior/swdb/behavior_project_cache.py b/brain_observatory/behavior/swdb/behavior_project_cache.py new file mode 100644 index 0000000000..9c63015f57 --- /dev/null +++ b/brain_observatory/behavior/swdb/behavior_project_cache.py @@ -0,0 +1,549 @@ +import os +import pandas as pd +import numpy as np +import json +import re + +from allensdk import one +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.behavior_metadata import \ + BehaviorMetadata +from allensdk.brain_observatory.behavior.session_apis.data_io import ( + BehaviorOphysNwbApi) +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ + BehaviorOphysExperiment +from allensdk.core.lazy_property import LazyProperty +from allensdk.brain_observatory.behavior.trials_processing import \ + calculate_reward_rate +from allensdk.deprecated import deprecated + +csv_io = { + 'reader': lambda path: pd.read_csv(path, index_col='Unnamed: 0'), + 'writer': lambda path, df: df.to_csv(path) +} + +cache_path_example = '/allen/programs/braintv/workgroups/nc-ophys/' \ + 'visual_behavior/SWDB_2019/cache_20190813' + + +@deprecated("swdb.behavior_project_cache.BehaviorProjectCache is deprecated " + "and will be removed in version 1.3. Please use brain_observatory." + "behavior.behavior_project_cache.BehaviorProjectCache.") +class BehaviorProjectCache(object): + def __init__(self, cache_base): + ''' + A cache-level object for the behavior/ophys data. Provides access to + the manifest of + ophys/behavior containers, as well as pre-computed analysis files + for each + experiment. + + Args: + cache_base (str): Path to the directory containing the cached + behavior/ophys data + + Attributes: + experiment_table: (pd.DataFrame) + Table containing information about all ophys experiments. + analysis_files_metadata (dict): + Metadata relating to the creation of the analysis files. + + Methods: + get_session(ophys_experiment_id): + Returns an extended BehaviorOphysExperiment object, including + trial_response_df and flash_response_df + + get_container_sessions(container_id): + Returns a dictionary with behavior stages as keys and the + corresponding session object from that container, that stage as + the value. + ''' + + self.cache_paths = { + 'manifest_path': os.path.join(cache_base, + 'visual_behavior_data_manifest.csv'), + 'nwb_base_dir': os.path.join(cache_base, 'nwb_files'), + 'analysis_files_base_dir': os.path.join(cache_base, + 'analysis_files'), + 'analysis_files_metadata_path': os.path.join( + cache_base, 'analysis_files_metadata.json'), + } + + self.experiment_table = csv_io['reader']( + self.cache_paths['manifest_path']) + + self.experiment_table['cre_line'] = self.experiment_table[ + 'full_genotype'].apply(BehaviorMetadata.parse_cre_line) + self.experiment_table['passive_session'] = self.experiment_table[ + 'stage_name'].apply(parse_passive) + self.experiment_table['image_set'] = self.experiment_table[ + 'stage_name'].apply(parse_image_set) + + self.experiment_table = self.experiment_table[[ + 'ophys_experiment_id', + 'container_id', + 'full_genotype', + 'cre_line', + 'imaging_depth', + 'targeted_structure', + 'image_set', + 'stage_name', + 'passive_session', + 'animal_name', + 'sex', + 'date_of_acquisition', + 'retake_number' + ]] + + self.nwb_base_dir = self.cache_paths['nwb_base_dir'] + self.analysis_files_base_dir = self.cache_paths[ + 'analysis_files_base_dir'] + self.analysis_files_metadata = self.get_analysis_files_metadata( + self.cache_paths['analysis_files_metadata_path'] + ) + + def get_analysis_files_metadata(self, path): + with open(path, 'r') as metadata_path: + metadata = json.load(metadata_path) + return metadata + + def get_nwb_filepath(self, experiment_id): + return os.path.join( + self.nwb_base_dir, + 'behavior_ophys_session_{}.nwb'.format(experiment_id) + ) + + def get_trial_response_df_path(self, experiment_id): + return os.path.join( + self.analysis_files_base_dir, + 'trial_response_df_{}.h5'.format(experiment_id) + ) + + def get_flash_response_df_path(self, experiment_id): + return os.path.join( + self.analysis_files_base_dir, + 'flash_response_df_{}.h5'.format(experiment_id) + ) + + def get_extended_stimulus_presentations_df(self, experiment_id): + return os.path.join( + self.analysis_files_base_dir, + 'extended_stimulus_presentations_df_{}.h5'.format(experiment_id) + ) + + def get_session(self, experiment_id): + ''' + Return a BehaviorOphysExperiment object given an ophys_experiment_id. + ''' + nwb_path = self.get_nwb_filepath(experiment_id) + trial_response_df_path = self.get_trial_response_df_path(experiment_id) + flash_response_df_path = self.get_flash_response_df_path(experiment_id) + extended_stim_df_path = self.get_extended_stimulus_presentations_df( + experiment_id) + api = ExtendedNwbApi( + nwb_path, + trial_response_df_path, + flash_response_df_path, + extended_stim_df_path + ) + session = ExtendedBehaviorOphysExperiment(api) + return session + + def get_container_sessions(self, container_id): + container_stages = {} + container_experiments = self.experiment_table.groupby( + 'container_id').get_group(container_id) + for ind_row, row in container_experiments.iterrows(): + container_stages.update( + {row['stage_name']: self.get_session( + row['ophys_experiment_id'])} + ) + return container_stages + + +def parse_passive(behavior_stage): + ''' + Args: + behavior_stage (str): the stage string, e.g. OPHYS_1_images_A or + OPHYS_1_images_A_passive + Returns: + passive (bool): whether or not the session was a passive session + ''' + r = re.compile(".*_passive") + if r.match(behavior_stage): + return True + else: + return False + + +def parse_image_set(behavior_stage): + ''' + Args: + behavior_stage (str): the stage string, e.g. OPHYS_1_images_A or + OPHYS_1_images_A_passive + Returns: + image_set (str): which image set is designated by the stage name + ''' + r = re.compile(".*images_(?P<image_set>[AB]).*") + image_set = r.match(behavior_stage).groups('image_set')[0] + return image_set + + +class ExtendedNwbApi(BehaviorOphysNwbApi): + def __init__(self, nwb_path, trial_response_df_path, + flash_response_df_path, + extended_stimulus_presentations_df_path): + ''' + Api to read data from an NWB file and associated analysis HDF5 files. + ''' + super(ExtendedNwbApi, self).__init__(path=nwb_path, + filter_invalid_rois=True) + self.trial_response_df_path = trial_response_df_path + self.flash_response_df_path = flash_response_df_path + self.extended_stimulus_presentations_df_path = \ + extended_stimulus_presentations_df_path + + def get_trial_response_df(self): + tdf = pd.read_hdf(self.trial_response_df_path, key='df') + tdf.reset_index(inplace=True) + tdf.drop(columns=['cell_roi_id'], inplace=True) + return tdf + + def get_flash_response_df(self): + fdf = pd.read_hdf(self.flash_response_df_path, key='df') + fdf.reset_index(inplace=True) + fdf.drop(columns=['image_name', 'cell_roi_id'], inplace=True) + fdf = fdf.join(self.get_stimulus_presentations(), on='flash_id', + how='left') + return fdf + + def get_extended_stimulus_presentations_df(self): + return pd.read_hdf(self.extended_stimulus_presentations_df_path, + key='df') + + def get_task_parameters(self): + ''' + The task parameters are incorrect. + See: https://github.com/AllenInstitute/AllenSDK/issues/637 + We need to hard-code the omitted flash fraction and stimulus + duration here. + ''' + task_parameters = super(ExtendedNwbApi, self).get_task_parameters() + task_parameters['omitted_flash_fraction'] = 0.05 + task_parameters['stimulus_duration_sec'] = 0.25 + task_parameters['blank_duration_sec'] = 0.5 + task_parameters.pop('task') + return task_parameters + + def get_metadata(self): + metadata = super(ExtendedNwbApi, self).get_metadata() + + # We want stage name in metadata for easy access by the students + task_parameters = self.get_task_parameters() + metadata['stage'] = task_parameters['stage'] + + # metadata should not include 'session_type' because it is 'Unknown' + metadata.pop('session_type') + + # For SWDB only + # metadata should not include 'behavior_session_uuid' because it is + # not useful to students and confusing + metadata.pop('behavior_session_uuid') + + # Rename LabTracks_ID to mouse_id to reduce student confusion + metadata['mouse_id'] = metadata.pop('LabTracks_ID') + + return metadata + + def get_running_speed(self): + # We want the running speed attribute to be a dataframe (like licks, + # rewards, etc.) instead of a + # RunningSpeed object. This will improve consistency for students. + # For SWDB we have also opted to + # have columns for both 'timestamps' and 'values' of things, + # since this is more intuitive for students + running_speed = super(ExtendedNwbApi, self).get_running_speed() + return pd.DataFrame({'speed': running_speed.speed, + 'timestamps': running_speed.timestamps}) + + def get_trials(self, filter_aborted_trials=True): + trials = super(ExtendedNwbApi, self).get_trials() + stimulus_presentations = super(ExtendedNwbApi, + self).get_stimulus_presentations() + + # Note: everything between dashed lines is a patch to deal with + # timing issues in + # the AllenSDK + # This should be removed in the future after issues #876 and #802 + # are fixed. + # -------------------------------------------------------------------------------- + + # gets start_time of next stimulus after timestamp in + # stimulus_presentations + def get_next_flash(timestamp): + query = stimulus_presentations.query('start_time >= @timestamp') + if len(query) > 0: + return query.iloc[0]['start_time'] + else: + return None + + trials['change_time'] = trials['change_time'].map( + lambda x: get_next_flash(x)) + + # This method can lead to a NaN change time for any trials at the + # end of the session. + # However, aborted trials at the end of the session also don't + # have change times. + # The safest method seems like just droping any trials that aren't + # covered by the + # stimulus_presentations + # Using start time in case last stim is omitted + last_stimulus_presentation = stimulus_presentations.iloc[-1][ + 'start_time'] + trials = trials[ + np.logical_not(trials['stop_time'] > last_stimulus_presentation)] + + # recalculates response latency based on corrected change time and + # first lick time + def recalculate_response_latency(row): + if len(row['lick_times'] > 0) and not pd.isnull( + row['change_time']): + return row['lick_times'][0] - row['change_time'] + else: + return np.nan + + trials['response_latency'] = trials.apply(recalculate_response_latency, + axis=1) + # ------------------------------------------------------------------------------- + + # asserts that every change time exists in the + # stimulus_presentations table + for change_time in ( + trials[trials['change_time'].notna()]['change_time']): + assert change_time in stimulus_presentations['start_time'].values + + # Return only non-aborted trials from this API by default + if filter_aborted_trials: + trials = trials.query('not aborted') + + # Reorder / drop some columns to make more sense to students + trials = trials[[ + 'initial_image_name', + 'change_image_name', + 'change_time', + 'lick_times', + 'response_latency', + 'reward_time', + 'go', + 'catch', + 'hit', + 'miss', + 'false_alarm', + 'correct_reject', + 'aborted', + 'auto_rewarded', + 'reward_volume', + 'start_time', + 'stop_time', + 'trial_length' + ]] + + # Calculate reward rate per trial + trials['reward_rate'] = calculate_reward_rate( + response_latency=trials.response_latency, + starttime=trials.start_time, + window=.75, + trial_window=25, + initial_trials=10 + ) + + # Response_binary is just whether or not they responded - e.g. true + # for hit or FA. + hit = trials['hit'].values + fa = trials['false_alarm'].values + trials['response_binary'] = np.logical_or(hit, fa) + + return trials + + def get_stimulus_presentations(self): + stimulus_presentations = super(ExtendedNwbApi, + self).get_stimulus_presentations() + extended_stimulus_presentations = \ + self.get_extended_stimulus_presentations_df() + extended_stimulus_presentations = extended_stimulus_presentations.drop( + columns=['omitted']) + stimulus_presentations = stimulus_presentations.join( + extended_stimulus_presentations) + + # Reorder the columns returned to make more sense to students + stimulus_presentations = stimulus_presentations[[ + 'image_name', + 'image_index', + 'start_time', + 'stop_time', + 'omitted', + 'change', + 'duration', + 'licks', + 'rewards', + 'running_speed', + 'index', + 'time_from_last_lick', + 'time_from_last_reward', + 'time_from_last_change', + 'block_index', + 'image_block_repetition', + 'repeat_within_block', + 'image_set' + ]] + + # Rename some columns to make more sense to students + stimulus_presentations = stimulus_presentations.rename( + columns={'index': 'absolute_flash_number', + 'running_speed': 'mean_running_speed'}) + # Replace image set with A/B + stimulus_presentations['image_set'] = \ + self.get_task_parameters()['stage'][15] + # Change index name for easier merge with flash_response_df + stimulus_presentations.index.rename('flash_id', inplace=True) + return stimulus_presentations + + def get_stimulus_templates(self): + # super stim templates is a dict with one annoyingly-long key, + # so pop the val out + stimulus_templates = super(ExtendedNwbApi, + self).get_stimulus_templates() + stimulus_template_array = stimulus_templates[ + list(stimulus_templates.keys())[0]] + + # What we really want is a dict with image_name as key + template_dict = {} + image_index_names = self.get_image_index_names() + for image_index, image_name in image_index_names.iteritems(): + if image_name != 'omitted': + template_dict.update( + {image_name: stimulus_template_array[image_index, :, :]}) + return template_dict + + def get_licks(self): + # Licks column 'time' should be 'timestamps' to be consistent with + # rest of session + licks = super(ExtendedNwbApi, self).get_licks() + licks = licks.rename(columns={'time': 'timestamps'}) + return licks + + def get_rewards(self): + # Rewards has timestamps in the index which is confusing and not + # consistent with the + # rest of the session. Use a normal index and have timestamps as a + # column + rewards = super(ExtendedNwbApi, self).get_rewards() + rewards = rewards.reset_index() + return rewards + + def get_dff_traces(self): + # We want to drop the 'cell_roi_id' column from the dff traces + # dataframe + # This is just for Friday Harbor, not for eventual inclusion in the + # LIMS api. + dff_traces = super(ExtendedNwbApi, self).get_dff_traces() + dff_traces = dff_traces.drop(columns=['cell_roi_id']) + return dff_traces + + def get_image_index_names(self): + image_index_names = self.get_stimulus_presentations().groupby( + 'image_index').apply( + lambda group: one(group['image_name'].unique()) + ) + return image_index_names + + +class ExtendedBehaviorOphysExperiment(BehaviorOphysExperiment): + """Represents data from a single Visual Behavior Ophys imaging session. + LazyProperty attributes access the data only on the first demand, + and then memoize the result for reuse. + + Attributes: + ophys_experiment_id : int (LazyProperty) + Unique identifier for this experimental session + max_projection : allensdk.brain_observatory.behavior.image_api.Image + (LazyProperty) + 2D max projection image + stimulus_timestamps : numpy.ndarray (LazyProperty) + Timestamps associated the stimulus presentations on the monitor + ophys_timestamps : numpy.ndarray (LazyProperty) + Timestamps associated with frames captured by the microscope + metadata : dict (LazyProperty) + A dictionary of session-specific metadata + dff_traces : pandas.DataFrame (LazyProperty) + The traces of dff organized into a dataframe; index is the cell + roi ids + segmentation_mask_image: + allensdk.brain_observatory.behavior.image_api.Image (LazyProperty) + An image with pixel value 1 if that pixel was included in an + ROI, and 0 otherwise + roi_masks: dict (LazyProperty) + A dictionary with individual ROI masks for each cell specimen + ID. Keys are cell specimen IDs, values are 2D numpy arrays. + cell_specimen_table : pandas.DataFrame (LazyProperty) + Cell roi information organized into a dataframe; index is the + cell roi ids + running_speed : pandas.DataFrame (LazyProperty) + A dataframe containing the running_speed in cm/s and the + timestamps of each data point + stimulus_presentations : pandas.DataFrame (LazyProperty) + Table whose rows are stimulus presentations (i.e. a given image, + for a given duration, typically 250 ms) and whose columns are + presentation characteristics. + stimulus_templates : dict (LazyProperty) + A dictionary containing the stimulus images presented during the + session. Keys are image names, values are 2D numpy arrays. + licks : pandas.DataFrame (LazyProperty) + A dataframe containing lick timestamps + rewards : pandas.DataFrame (LazyProperty) + A dataframe containing timestamps of delivered rewards + task_parameters : dict (LazyProperty) + A dictionary containing parameters used to define the task + runtime behavior + trials : pandas.DataFrame (LazyProperty) + A dataframe containing behavioral trial start/stop times, + and trial data + corrected_fluorescence_traces : pandas.DataFrame (LazyProperty) + The motion-corrected fluorescence traces organized into a + dataframe; index is the cell roi ids + average_projection : allensdk.brain_observatory.behavior.image_api + .Image (LazyProperty) + 2D image of the microscope field of view, averaged across the + experiment + motion_correction : pandas.DataFrame (LazyProperty) + A dataframe containing trace data used during motion correction + computation + + """ + + def __init__(self, api): + super(ExtendedBehaviorOphysExperiment, self).__init__(api) + self.api = api + + self.trial_response_df = LazyProperty(self.api.get_trial_response_df) + self.flash_response_df = LazyProperty(self.api.get_flash_response_df) + self.image_index = LazyProperty(self.api.get_image_index_names) + self.roi_masks = LazyProperty(self.get_roi_masks) + + def get_roi_masks(self): + masks = super(ExtendedBehaviorOphysExperiment, self).get_roi_masks() + return { + cell_specimen_id: masks.loc[ + {"cell_specimen_id": cell_specimen_id}].data + for cell_specimen_id in masks["cell_specimen_id"].data + } + + def get_segmentation_mask_image(self): + masks = self.roi_masks + return np.any([submask for submask in masks.values()], axis=0) + + +if __name__ == "__main__": + cache = BehaviorProjectCache(cache_path_example) + session = cache.get_session( + cache.experiment_table.iloc[0]['ophys_experiment_id']) diff --git a/brain_observatory/behavior/swdb/create_multi_session_df.py b/brain_observatory/behavior/swdb/create_multi_session_df.py new file mode 100644 index 0000000000..a7f2c844ce --- /dev/null +++ b/brain_observatory/behavior/swdb/create_multi_session_df.py @@ -0,0 +1,26 @@ +import os +import h5py +import pandas as pd +from allensdk.brain_observatory.behavior.swdb import behavior_project_cache as bpc +from allensdk.brain_observatory.behavior.swdb import utilities as ut + + +cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', + 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/analysis_files', + 'analysis_files_metadata_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/analysis_files_metadata.json', + } + +cache = bpc.BehaviorProjectCache(cache_json) +manifest = cache.manifest +experiment_ids = manifest.ophys_experiment_id.unique() + +print('generating mega_trial_mdf') +mega_trial_mdf = ut.create_multi_session_mean_df(cache, experiment_ids, conditions=['cell_specimen_id','change_image_name']) +save_dir = r'/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019' +mega_trial_mdf.to_hdf(os.path.join(save_dir, 'multi_session_mean_trials_df.h5'), key='df') +print('done with trials, creating mega_flash_mdf') +mega_flash_mdf = ut.create_multi_session_mean_df(cache, experiment_ids, flashes=True, conditions=['cell_specimen_id','image_name']) +save_dir = r'/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019' +mega_flash_mdf.to_hdf(os.path.join(save_dir, 'multi_session_mean_flashes_df.h5'), key='df') +print('done with flash df') \ No newline at end of file diff --git a/brain_observatory/behavior/swdb/run_multi_session_df.py b/brain_observatory/behavior/swdb/run_multi_session_df.py new file mode 100644 index 0000000000..5cf0b1029d --- /dev/null +++ b/brain_observatory/behavior/swdb/run_multi_session_df.py @@ -0,0 +1,27 @@ +import os +import sys +sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') +from pbstools import PythonJob +import behavior_project_cache as bpc + +# python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" + +python_file = r"/home/marinag/AllenSDK/allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py" + +jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/visb_swdb_summary_figures' + +job_settings = {'queue': 'braintv', + 'mem': '100g', + 'walltime': '2:00:00', + 'ppn':1, + 'jobdir': jobdir, + } + +PythonJob( + python_file, + python_executable = '/home/marinag/anaconda2/envs/visual_behavior_sdk/bin/python', + python_args = None, + conda_env = None, + jobname = 'multi_session_dfs', + **job_settings + ).run(dryrun=False) diff --git a/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py b/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py new file mode 100644 index 0000000000..c02b3484d2 --- /dev/null +++ b/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py @@ -0,0 +1,35 @@ +import os +import sys +sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') +from pbstools import PythonJob +import behavior_project_cache as bpc + +python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py" + +jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/20190813_save_extended_stim' + +job_settings = {'queue': 'braintv', + 'mem': '15g', + 'walltime': '0:30:00', + 'ppn':1, + 'jobdir': jobdir, + } + +cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', + 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/extra_files_final' + } + +cache = bpc.BehaviorProjectCache(cache_json) + +experiment_ids = cache.manifest['ophys_experiment_id'].values + +for experiment_id in experiment_ids: + PythonJob( + python_file, + python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', + python_args = experiment_id, + conda_env = None, + jobname = 'extended_stimulus_df_{}'.format(experiment_id), + **job_settings + ).run(dryrun=False) diff --git a/brain_observatory/behavior/swdb/run_save_flash_response_df.py b/brain_observatory/behavior/swdb/run_save_flash_response_df.py new file mode 100644 index 0000000000..48e705bc4f --- /dev/null +++ b/brain_observatory/behavior/swdb/run_save_flash_response_df.py @@ -0,0 +1,35 @@ +import os +import sys +sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') +from pbstools import PythonJob +import behavior_project_cache as bpc + +python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py" + +jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/20190810_save_flash_response_df' + +job_settings = {'queue': 'braintv', + 'mem': '24g', + 'walltime': '12:00:00', + 'ppn':1, + 'jobdir': jobdir, + } + +cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', + 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/extra_files' + } + +cache = bpc.BehaviorProjectCache(cache_json) + +experiment_ids = cache.manifest['ophys_experiment_id'].values + +for experiment_id in experiment_ids: + PythonJob( + python_file, + python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', + python_args = experiment_id, + conda_env = None, + jobname = 'flash_response_df_{}'.format(experiment_id), + **job_settings + ).run(dryrun=False) diff --git a/brain_observatory/behavior/swdb/run_save_trial_response_df.py b/brain_observatory/behavior/swdb/run_save_trial_response_df.py new file mode 100644 index 0000000000..7779ec4682 --- /dev/null +++ b/brain_observatory/behavior/swdb/run_save_trial_response_df.py @@ -0,0 +1,35 @@ +import os +import sys +sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') +from pbstools import PythonJob +import behavior_project_cache as bpc + +python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py" + +jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/20190810_save_trial_response_df' + +job_settings = {'queue': 'braintv', + 'mem': '15g', + 'walltime': '0:30:00', + 'ppn':1, + 'jobdir': jobdir, + } + +cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', + 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/extra_files' + } + +cache = bpc.BehaviorProjectCache(cache_json) + +experiment_ids = cache.manifest['ophys_experiment_id'].values + +for experiment_id in experiment_ids: + PythonJob( + python_file, + python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', + python_args = experiment_id, + conda_env = None, + jobname = 'trial_response_df_{}'.format(experiment_id), + **job_settings + ).run(dryrun=False) diff --git a/brain_observatory/behavior/swdb/run_summary_figures.py b/brain_observatory/behavior/swdb/run_summary_figures.py new file mode 100644 index 0000000000..582db74bec --- /dev/null +++ b/brain_observatory/behavior/swdb/run_summary_figures.py @@ -0,0 +1,40 @@ +import os +import sys +sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') +from pbstools import PythonJob +import behavior_project_cache as bpc + +# python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" + +python_file = r"/home/marinag/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" +# python_file = r"/home/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" + +jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/visb_swdb_summary_figures' + +job_settings = {'queue': 'braintv', + 'mem': '15g', + 'walltime': '0:30:00', + 'ppn':1, + 'jobdir': jobdir, + } + +cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/nwb_files', + 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files', + 'analysis_files_metadata_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files_metadata.json', + } + +cache = bpc.BehaviorProjectCache(cache_json) + +experiment_ids = cache.manifest['ophys_experiment_id'].values + +for experiment_id in experiment_ids: + PythonJob( + python_file, + python_args = experiment_id, + python_executable = '/home/marinag/anaconda2/envs/visual_behavior_sdk/bin/python', + conda_env = None, + jobname = 'trial_response_df_{}'.format(experiment_id), + **job_settings + ).run(dryrun=False) +# python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', diff --git a/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py b/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py new file mode 100644 index 0000000000..f8969af2d7 --- /dev/null +++ b/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py @@ -0,0 +1,250 @@ +import sys +import os +import numpy as np + +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( + BehaviorOphysExperiment) +from allensdk.brain_observatory.behavior.session_apis.data_io import ( + BehaviorOphysNwbApi) + +import behavior_project_cache as bpc +from importlib import reload + +reload(bpc) + + +def time_from_last(flash_times, other_times): + last_other_index = np.searchsorted(a=other_times, v=flash_times) - 1 + time_from_last_other = flash_times - other_times[last_other_index] + + # flashes that happened before the other thing happened should return nan + time_from_last_other[last_other_index == -1] = np.nan + + return time_from_last_other + + +def trace_average(values, timestamps, start_time, stop_time): + values_this_range = values[ + ((timestamps >= start_time) & (timestamps < stop_time))] + return values_this_range.mean() + + +test_values = np.array([1, 2, 3, 4, 5, 6]) +test_timestamps = np.array([1, 2, 3, 4, 5, 6]) +test_start_times = np.array([0, 0, 2.5]) +test_stop_times = np.array([7, 6, 4.5]) +expected = np.array([3.5, 3.0, 3.5]) + + +def find_change(image_index, omitted_index): + ''' + Args: + image_index (pd.Series): The index of the presented image for each + flash + omitted_index (int): The index value for omitted stimuli + + Returns: + change (np.array of bool): Whether each flash was a change flash + ''' + + change = np.diff(image_index) != 0 + change = np.concatenate( + [np.array([False]), change]) # First flash not a change + omitted = image_index == omitted_index + omitted_inds = np.flatnonzero(omitted) + change[omitted_inds] = False + + if image_index.iloc[-1] == omitted_index: + # If the last flash is omitted we can't set the +1 for that omitted idx + change[omitted_inds[:-1] + 1] = False + else: + change[omitted_inds + 1] = False + + return change + + +def get_extended_stimulus_presentations(session): + intermediate_df = session.stimulus_presentations.copy() + + lick_times = session.licks["time"].values + reward_times = session.rewards.index.values + flash_times = intermediate_df["start_time"].values + change_times = session.trials["change_time"].values + change_times = change_times[~np.isnan(change_times)] + + # Time from last other for each flash + + if len(lick_times) < 5: # Passive sessions + time_from_last_lick = np.full(len(flash_times), np.nan) + else: + time_from_last_lick = time_from_last(flash_times, lick_times) + + if len(reward_times) < 1: # Sometimes mice are bad + time_from_last_reward = np.full(len(flash_times), np.nan) + else: + time_from_last_reward = time_from_last(flash_times, reward_times) + + time_from_last_change = time_from_last(flash_times, change_times) + + intermediate_df["time_from_last_lick"] = time_from_last_lick + intermediate_df["time_from_last_reward"] = time_from_last_reward + intermediate_df["time_from_last_change"] = time_from_last_change + + # Was the flash a change flash? + omitted_index = intermediate_df.groupby("image_name").apply( + lambda group: group["image_index"].unique()[0] + )["omitted"] + changes = find_change(intermediate_df["image_index"], omitted_index) + omitted = intermediate_df["image_index"] == omitted_index + + intermediate_df["change"] = changes + intermediate_df["omitted"] = omitted + + # Index of each image block + changes_including_first = np.copy(changes) + changes_including_first[0] = True + change_indices = np.flatnonzero(changes_including_first) + flash_inds = np.arange(len(intermediate_df)) + block_inds = np.searchsorted(a=change_indices, v=flash_inds, + side="right") - 1 + + intermediate_df["block_index"] = block_inds + + # Block repetition number + blocks_per_image = intermediate_df.groupby("image_name").apply( + lambda group: np.unique(group["block_index"]) + ) + block_repetition_number = np.copy(block_inds) + + for image_name, image_blocks in blocks_per_image.iteritems(): + if image_name != "omitted": + for ind_block, block_number in enumerate(image_blocks): + # block_rep_number starts as a copy of block_inds, so we can + # go write over the index number with the rep number + block_repetition_number[ + block_repetition_number == block_number] = ind_block + + intermediate_df["image_block_repetition"] = block_repetition_number + + # Repeat number within a block + repeat_number = np.full(len(intermediate_df), np.nan) + + # Assuming that the row index starts at zero + assert intermediate_df.iloc[0].name == 0 + + for ind_group, group in intermediate_df.groupby("block_index"): + repeat = 0 + for ind_row, row in group.iterrows(): + if row["image_name"] != "omitted": + repeat_number[ind_row] = repeat + repeat += 1 + + intermediate_df["repeat_within_block"] = repeat_number + + # Lists of licks/rewards on each flash + licks_each_flash = intermediate_df.apply( + lambda row: lick_times[ + ((lick_times > row["start_time"]) & ( + lick_times < row["start_time"] + 0.75)) + ], + axis=1, + ) + rewards_each_flash = intermediate_df.apply( + lambda row: reward_times[ + ( + (reward_times > row["start_time"]) + & (reward_times < row["start_time"] + 0.75) + ) + ], + axis=1, + ) + + intermediate_df["licks"] = licks_each_flash + intermediate_df["rewards"] = rewards_each_flash + + # Average running speed on each flash + flash_running_speed = intermediate_df.apply( + lambda row: trace_average( + session.running_speed.values, + session.running_speed.timestamps, + row["start_time"], + row["start_time"] + 0.25, + ), + axis=1, + ) + + intermediate_df["running_speed"] = flash_running_speed + + # Do some tests + # assert sum(licks_each_flash) == len(session.licks) #something like this + + extended_stim_columns = [ + "time_from_last_lick", + "time_from_last_reward", + "time_from_last_change", + "change", + "omitted", + "block_index", + "image_block_repetition", + "repeat_within_block", + "licks", + "rewards", + "running_speed", + ] + + return intermediate_df[extended_stim_columns] + + +if __name__ == "__main__": + + case = 0 + + cache_json = { + "manifest_path": "/allen/programs/braintv/workgroups/nc-ophys" + "/visual_behavior/SWDB_2019/" + "visual_behavior_data_manifest.csv", + "nwb_base_dir": "/allen/programs/braintv/workgroups/nc-ophys" + "/visual_behavior/SWDB_2019/nwb_files", + "analysis_files_base_dir": + "/allen/programs/braintv/workgroups/nc-ophys/visual_behavior" + "/SWDB_2019/extra_files", + } + + cache = bpc.BehaviorProjectCache(cache_json) + + if case == 0: + + experiment_id = sys.argv[1] + # experiment_id = cache.manifest.iloc[5]['ophys_experiment_id'] + nwb_path = cache.get_nwb_filepath(experiment_id) + api = BehaviorOphysNwbApi(nwb_path) + session = BehaviorOphysExperiment(api) + + # output_path = "/allen/programs/braintv/workgroups/nc-ophys + # /visual_behavior/SWDB_2019/extra_files_final" + output_path = "/allen/programs/braintv/workgroups/nc-ophys" \ + "/visual_behavior/SWDB_2019/corrected_extended_stim" + + extended_stimulus_presentations_df = \ + get_extended_stimulus_presentations(session) + + output_fn = os.path.join( + output_path, + "extended_stimulus_presentations_df_{}.h5".format(experiment_id) + ) + print("Writing extended_stimulus_presentations_df to {}".format( + output_fn)) + extended_stimulus_presentations_df.to_hdf(output_fn, key="df") + + elif case == 1: + + failed_oeid = 825623170 + success_oeid = 826585773 + + # nwb_path = cache.get_nwb_filepath(success_oeid) + nwb_path = cache.get_nwb_filepath(failed_oeid) + api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) + session = BehaviorOphysExperiment(api) + + extended_stimulus_presentations_df = \ + get_extended_stimulus_presentations(session) diff --git a/brain_observatory/behavior/swdb/save_flash_response_df.py b/brain_observatory/behavior/swdb/save_flash_response_df.py new file mode 100644 index 0000000000..30fe156265 --- /dev/null +++ b/brain_observatory/behavior/swdb/save_flash_response_df.py @@ -0,0 +1,446 @@ +import sys +import os +import numpy as np +import pandas as pd +import itertools + +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ + BehaviorOphysExperiment +from allensdk.brain_observatory.behavior.session_apis.data_io import ( + BehaviorOphysNwbApi) +from allensdk.brain_observatory.behavior.swdb import \ + behavior_project_cache as bpc +from allensdk.brain_observatory.behavior.swdb.analysis_tools import \ + get_trace_around_timepoint, get_mean_in_window + +''' + This script computes the flash_response_df for a BehaviorOphysExperiment + object + +''' + + +def get_flash_response_df(session, response_analysis_params): + ''' + Builds the flash response dataframe for <session> + + INPUTS: + <session> BehaviorOphysExperiment to build the flash response + dataframe for + <response_analyis_params> A dictionary with the following keys + 'window_around_timepoint_seconds' is the time window to save + out the dff_trace around the flash onset. + 'response_window_duration_seconds' is the length of time + after the flash onset to compute the mean_response + 'baseline_window_duration_seconds' is the length of time + before the flash onset to compute the baseline response + + OUTPUTS: + A dataframe with index: (cell_specimen_id, flash_id) + and columns: + cell_roi_id, the cell's roi id for that session + mean_response, the mean df/f in the response_window + baseline_response, the mean df/f in the baseline_window + dff_trace, the dff trace in the window_around_timepoint_seconds + dff_trace_timestamps, the timestamps for the dff_trace + + ''' + frame_rate = 31. # Shouldn't hard code this here + + # get data to analyze + dff_traces = session.dff_traces.copy() + flashes = session.stimulus_presentations.copy() + + # get params to define response window, in seconds + window_around_timepoint_seconds = response_analysis_params[ + 'window_around_timepoint_seconds'] + response_window_duration_seconds = response_analysis_params[ + 'response_window_duration_seconds'] + baseline_window_duration_seconds = response_analysis_params[ + 'baseline_window_duration_seconds'] + mean_response_window_seconds = [np.abs(window_around_timepoint_seconds[0]), + np.abs(window_around_timepoint_seconds[ + 0]) + + response_window_duration_seconds] + baseline_window_seconds = [np.abs( + window_around_timepoint_seconds[0]) - baseline_window_duration_seconds, + np.abs(window_around_timepoint_seconds[0])] + + # Build a dataframe with multiindex defined as product of cell_id X + # flash_id + cell_flash_combinations = itertools.product(dff_traces.index, + flashes.index) + index = pd.MultiIndex.from_tuples(cell_flash_combinations, + names=['cell_specimen_id', 'flash_id']) + df = pd.DataFrame(index=index) + traces_list = [] + trace_timestamps_list = [] + + # Iterate though cell/flash pairs and build table + for cell_specimen_id, flash_id in itertools.product(dff_traces.index, + flashes.index): + timepoint = flashes.loc[flash_id]['start_time'] + cell_roi_id = dff_traces.loc[cell_specimen_id]['cell_roi_id'] + full_cell_trace = dff_traces.loc[cell_specimen_id, 'dff'] + trace, trace_timestamps = get_trace_around_timepoint( + full_cell_trace, + timepoint, + session.ophys_timestamps, + window_around_timepoint_seconds, + frame_rate) + mean_response = get_mean_in_window(trace, mean_response_window_seconds, + frame_rate) + baseline_response = get_mean_in_window(trace, baseline_window_seconds, + frame_rate) + traces_list.append(trace) + trace_timestamps_list.append(trace_timestamps) + df.loc[(cell_specimen_id, flash_id), 'cell_roi_id'] = int(cell_roi_id) + df.loc[(cell_specimen_id, flash_id), 'mean_response'] = mean_response + df.loc[(cell_specimen_id, + flash_id), 'baseline_response'] = baseline_response + df.insert(loc=1, column='dff_trace', value=traces_list) + df.insert(loc=2, column='dff_trace_timestamps', + value=trace_timestamps_list) + return df + + +def get_p_values_from_shuffled_spontaneous(session, flash_response_df, + response_window_duration=0.5, + number_of_shuffles=10000): + ''' + Computes the P values for each cell/flash. The P value is the + probability of observing a response of that + magnitude in the spontaneous window. The algorithm is copied from VBA + + INPUTS: + <session> a BehaviorOphysExperiment object + <flash_response_df> the flash_response_df for this session + <response_window_duration> is the duration of the + response_window that was used to compute the mean_response in + the flash_response_df. This is used here to extract an + equivalent duration df/f trace from the spontaneous timepoint + <number_of_shuffles> the number of shuffles of spontaneous + activity used to compute the pvalue + + OUTPUTS: + fdf, a copy of the flash_response_df with a new column appended + 'p_value' which is the per-flash X per-cell p-value + + ASSERTS: + each p value is bounded by 0 and 1, and does not include any NaNs + + ''' + # Organize Data + fdf = flash_response_df.copy() + st = session.stimulus_presentations.copy() + included_flashes = fdf.index.get_level_values(1).unique() + st = st[st.index.isin(included_flashes)] + + # Get Sample of Spontaneous Frames + spontaneous_frames = get_spontaneous_frames(session) + + # Compute the number of response_window frames + ophys_frame_rate = 31 # Shouldn't hard code this here + n_mean_response_window_frames = int( + np.round(response_window_duration * ophys_frame_rate, 0)) + cell_ids = np.unique(fdf.index.get_level_values(0)) + n_cells = len(cell_ids) + + # Get Shuffled responses from spontaneous frames + # get mean response for shuffles of the spontaneous activity frames + # in a window the same size as the stim response window duration + shuffled_responses = np.empty( + (n_cells, number_of_shuffles, n_mean_response_window_frames)) + idx = np.random.choice(spontaneous_frames, number_of_shuffles) + dff_traces = np.stack(session.dff_traces.to_numpy()[:, 1], axis=0) + for i in range(n_mean_response_window_frames): + shuffled_responses[:, :, i] = dff_traces[:, idx + i] + shuffled_mean = shuffled_responses.mean(axis=2) + + # compare flash responses to shuffled values and make a dataframe of + # p_value for cell_id X flash_id + iterables = [cell_ids, st.index.values] + flash_p_values = pd.DataFrame(index=pd.MultiIndex.from_product( + iterables, + names=[ + 'cell_specimen_id', + 'flash_id'])) + for i, cell_index in enumerate(cell_ids): + responses = fdf.loc[cell_index].mean_response.values + null_dist_mat = np.tile(shuffled_mean[i, :], reps=(len(responses), 1)) + actual_is_less = responses.reshape(len(responses), 1) <= null_dist_mat + p_values = np.mean(actual_is_less, axis=1) + for j in range(0, len(p_values)): + flash_p_values.at[(cell_index, j), 'p_value'] = p_values[j] + fdf = pd.concat([fdf, flash_p_values], axis=1) + + # Test to ensure p values are bounded between 0 and 1, and dont include + # NaNs + assert np.all(fdf['p_value'].values <= 1) + assert np.all(fdf['p_value'].values >= 0) + assert np.all(~np.isnan(fdf['p_value'].values)) + + return fdf + + +def get_spontaneous_frames(session): + ''' + Returns a list of the frames that occur during the before and after + spontaneous windows. This is copied from VBA. Does not use the full + spontaneous period because that is what VBA did. It only uses 4 + minutes of the before and after spontaneous period. + + INPUTS: + <session> a BehaviorOphysExperiment object to get all the + spontaneous frames + + OUTPUTS: a list of the frames during the spontaneous period + ''' + st = session.stimulus_presentations.copy() + # dont use full 5 mins to avoid fingerprint and countdown + # spont_duration_frames = 4 * 60 * 60 # 4 mins * * 60s/min * 60Hz + spont_duration = 4 * 60 # 4mins * 60sec + + # for spontaneous at beginning of session + behavior_start_time = st.iloc[0].start_time + spontaneous_start_time_pre = behavior_start_time - spont_duration + spontaneous_end_time_pre = behavior_start_time + spontaneous_start_frame_pre = get_successive_frame_list( + spontaneous_start_time_pre, session.ophys_timestamps) + spontaneous_end_frame_pre = get_successive_frame_list( + spontaneous_end_time_pre, session.ophys_timestamps) + spontaneous_frames_pre = np.arange(spontaneous_start_frame_pre, + spontaneous_end_frame_pre, 1) + + # for spontaneous epoch at end of session + behavior_end_time = st.iloc[-1].stop_time + spontaneous_start_time_post = behavior_end_time + 0.5 + spontaneous_end_time_post = behavior_end_time + spont_duration + spontaneous_start_frame_post = get_successive_frame_list( + spontaneous_start_time_post, session.ophys_timestamps) + spontaneous_end_frame_post = get_successive_frame_list( + spontaneous_end_time_post, session.ophys_timestamps) + spontaneous_frames_post = np.arange(spontaneous_start_frame_post, + spontaneous_end_frame_post, 1) + + # add them together + spontaneous_frames = list(spontaneous_frames_pre) + ( + list(spontaneous_frames_post)) + return spontaneous_frames + + +def get_successive_frame_list(timepoints_array, timestamps): + ''' + Returns the next frame after timestamps in timepoints_array + copied from VBA + ''' + # This is a modification of get_nearest_frame for speedup + # This implementation looks for the first 2p frame consecutive to the stim + successive_frames = np.searchsorted(timestamps, timepoints_array) + return successive_frames + + +def add_image_name(session, fdf): + ''' + Adds a column to flash_response_df with the image_name taken from + the stimulus_presentations table + Slow to run, could probably be improved with some more intelligent + use of pandas + + INPUTS: + <session> a BehaviorOphysExperiment object + <fdf> a flash_response_df for this session + + OUTPUTS: + fdf, with a new column appended 'image_name' which gives the image + identity (like 'im066') for each flash. + ''' + + fdf = fdf.reset_index() + fdf = fdf.set_index('flash_id') + fdf['image_name'] = '' + # So slow!!! + for stim_id in np.unique(fdf.index.values): + fdf.loc[stim_id, 'image_name'] = session.stimulus_presentations.loc[ + stim_id].image_name + fdf = fdf.reset_index() + fdf = fdf.set_index(['cell_specimen_id', 'flash_id']) + return fdf + + +def annotate_flash_response_df_with_pref_stim(fdf): + ''' + Adds a column to flash_response_df with a boolean value of whether + that flash was that cells pref image. + Computes preferred image by looking for the image that on average + evokes the largest response. + Slow to run, could probably be improved with more intelligent pandas + use + + INPUTS: + fdf, a flash_response_dataframe + + RETURNS: + fdf, appended with 'pref_stim' column + + ASSERTS: + each cell has one unique preferred_stimulus + + ''' + # Prepare dataframe + fdf = fdf.reset_index() + if 'cell_specimen_id' in fdf.keys(): + cell_key = 'cell_specimen_id' + else: + cell_key = 'cell' + + # Set up empty column + fdf['pref_stim'] = False + + # Compute average response for each image + mean_response = fdf.groupby([cell_key, 'image_name']).apply(get_mean_sem) + m = mean_response.unstack() + + # Iterate through each cell and find which image evoked the largest + # average response + for cell in m.index: + temp = np.where(m.loc[cell]['mean_response'].values == np.nanmax( + m.loc[cell]['mean_response'].values))[0] + # If the mean_response was NaN, then temp is empty, so we have this + # check here + if len(temp) > 0: + image_index = temp[0] + pref_image = m.loc[cell]['mean_response'].index[image_index] + # find all repeats of that cell X pref_image, and set + # 'pref_stim' to True + cell_flash_pairs = fdf[ + (fdf[cell_key] == cell) & (fdf.image_name == pref_image)].index + fdf.loc[cell_flash_pairs, 'pref_stim'] = True + + # Test to ensure preferred stimulus is unique for each cell + for cell in fdf['cell_specimen_id'].unique(): + assert len(fdf.set_index('cell_specimen_id').loc[cell].query( + 'pref_stim').image_name.unique()) == 1 + + # Reset the df index + fdf = fdf.set_index(['cell_specimen_id', 'flash_id']) + return fdf + + +def get_mean_sem(group): + ''' + Returns the mean and sem of the mean_response values for all entries + in the group. Copied from VBA + + INPUTS: + group is a pandas group + + Output, a pandas series with the average 'mean_response' from the + group, and the sem 'mean_response' from the group + ''' + mean_response = np.mean(group['mean_response']) + sem_response = np.std(group['mean_response'].values) / np.sqrt( + len(group['mean_response'].values)) + return pd.Series( + {'mean_response': mean_response, 'sem_response': sem_response}) + + +if __name__ == '__main__': + + case = 0 + + if case == 0: + # This is the main usage case. + + # Grab the experiment ID + experiment_id = sys.argv[1] + + # Define the cache + cache_json = { + 'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys' + '/visual_behavior/SWDB_2019/' + 'visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys' + '/visual_behavior/SWDB_2019/nwb_files', + 'analysis_files_base_dir': + '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior' + '/SWDB_2019/extra_files' + } + + # load the session + cache = bpc.BehaviorProjectCache(cache_json) + nwb_path = cache.get_nwb_filepath(experiment_id) + api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) + session = BehaviorOphysExperiment(api) + + # Where to save the results + output_path = '/allen/programs/braintv/workgroups/nc-ophys' \ + '/visual_behavior/SWDB_2019/' \ + 'flash_response_500msec_response' + + # Define parameters for dff_trace, and response_window + response_analysis_params = { + 'window_around_timepoint_seconds': [-.5, .75], # -500ms, 750ms + 'response_window_duration_seconds': 0.5, + 'baseline_window_duration_seconds': 0.5} + + # compute the base flash_response_df + flash_response_df = get_flash_response_df(session, + response_analysis_params) + + # Add p_value, image_name, and pref_stim + flash_response_df = get_p_values_from_shuffled_spontaneous( + session, + flash_response_df) + flash_response_df = add_image_name(session, flash_response_df) + flash_response_df = annotate_flash_response_df_with_pref_stim( + flash_response_df) + + # Test columns in flash_response_df + for new_key in ['cell_roi_id', 'mean_response', 'baseline_response', + 'dff_trace', 'dff_trace_timestamps', 'p_value', + 'image_name', 'pref_stim']: + assert new_key in flash_response_df.keys() + + # Save the flash_response_df to file + output_fn = os.path.join(output_path, 'flash_response_df_{}.h5'.format( + experiment_id)) + print('Writing flash response df to {}'.format(output_fn)) + flash_response_df.to_hdf(output_fn, key='df', complib='bzip2', + complevel=9) + + elif case == 1: + # This case is just for debugging. It computes the flash_response_df + # on a truncated portion of the data. + nwb_path = '/allen/programs/braintv/workgroups/nc-ophys' \ + '/visual_behavior/SWDB_2019/nwb_files' \ + '/behavior_ophys_session_880961028.nwb' + api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) + session = BehaviorOphysExperiment(api) + + # Small data for testing + session.__dict__['dff_traces'].value = session.dff_traces.iloc[:5] + session.__dict__[ + 'stimulus_presentations'].value = \ + session.stimulus_presentations.iloc[ + :20] + + response_analysis_params = { + 'window_around_timepoint_seconds': [-.5, .75], # -500ms, 750ms + 'response_window_duration_seconds': 0.5, + 'baseline_window_duration_seconds': 0.5} + + flash_response_df = get_flash_response_df(session, + response_analysis_params) + flash_response_df = get_p_values_from_shuffled_spontaneous( + session, + flash_response_df) + flash_response_df = add_image_name(session, flash_response_df) + flash_response_df = annotate_flash_response_df_with_pref_stim( + flash_response_df) + + # Test columns in flash_response_df + for new_key in ['cell_roi_id', 'mean_response', 'baseline_response', + 'dff_trace', 'dff_trace_timestamps', 'p_value', + 'image_name', 'pref_stim']: + assert new_key in flash_response_df.keys() diff --git a/brain_observatory/behavior/swdb/save_trial_response_df.py b/brain_observatory/behavior/swdb/save_trial_response_df.py new file mode 100644 index 0000000000..faa750f7c7 --- /dev/null +++ b/brain_observatory/behavior/swdb/save_trial_response_df.py @@ -0,0 +1,338 @@ +import sys +import os +import numpy as np +import pandas as pd +from scipy import stats +import itertools + +from allensdk.brain_observatory.behavior.swdb import \ + behavior_project_cache as bpc +from importlib import reload + +from allensdk.brain_observatory.behavior.swdb.analysis_tools import \ + get_trace_around_timepoint, get_mean_in_window + +reload(bpc) + +''' + This file contains functions and a script for computing the + trial_response_df dataframe. + This file was hastily constructed before friday harbor. Places where + there are known issues are flagged with PROBLEM +''' + + +def add_p_vals_tr(tr, response_window=[4, 4.5]): + ''' + Computes the p value for each cell's response on each trial. The + p-value is computed using the function 'get_p_val' + + INPUT: + tr, trial_response_dataframe + response_window, the time points in the dff trace to use for + computing the p-value. + PROBLEM: The default value here assumes that the + dff_trace starts 4 seconds before the change time. + This should be set up with more care and flexibility. + + OUTPUTS: + tr, the same trial_response_dataframe, with a new column 'p_value' + appended. + + ASSERTS: + tr['p_value'] is inclusively bounded between 0 and 1, and does not + include NaNs + ''' + + # Set up empty column + tr['p_value'] = 1. + ophys_frame_rate = 31. # Shouldn't hard code this PROBLEM + + # Iterate over trial/cell pairs, and compute p-value + for index, row in tr.iterrows(): + tr.at[index, 'p_value'] = get_p_val(row.dff_trace, response_window, + ophys_frame_rate) + + # Test to ensure p values are bounded between 0 and 1, and dont include + # NaNs + assert np.all(tr['p_value'].values <= 1) + assert np.all(tr['p_value'].values >= 0) + assert np.all(~np.isnan(tr['p_value'].values)) + + return tr + + +def get_p_val(trace, response_window, frame_rate): + ''' + Computes a p-value for the trace by comparing the dff in the + response_window to the same sized trace before the response_window. + PROBLEM: This should be computed by comparing to spontaneous + activity to be consistent with the flash_response_df + + INPUTS: + trace, the dff trace for this cell/trial + response_window, [start_time, end_time] the time in seconds from the + start of trace to asses whether the activity is significant + frame_rate, the number of samples in trace per second. + + OUTPUTS: + a p-value + ''' + response_window_duration = response_window[1] - response_window[0] + baseline_end = int(response_window[0] * frame_rate) + baseline_start = int( + (response_window[0] - response_window_duration) * frame_rate) + stim_start = int(response_window[0] * frame_rate) + stim_end = int( + (response_window[0] + response_window_duration) * frame_rate) + (_, p) = stats.f_oneway(trace[baseline_start:baseline_end], + trace[stim_start:stim_end]) + return p + + +def annotate_trial_response_df_with_pref_stim(trial_response_df): + ''' + Computes the preferred stimulus for each cell/trial combination. + Preferred image is computed by seeing which image evoked the largest + average mean_response across all change_images. + + INPUTS: + trial_response_df, the trial_response_df to be annotated + + OUTPUTS: + a copy of trial_response_df with a new column appended 'pref_stim' + which is a boolean TRUE/FALSE for whether that change_image was that + cell's preferred image. + + ASSERTS: + Each cell has one unique preferred stimulus + ''' + + # Copy the trial_response_df + rdf = trial_response_df.copy() + + # Set up empty column + rdf['pref_stim'] = False + + # get average mean_response for each cell X change_image + mean_response = rdf.groupby( + ['cell_specimen_id', 'change_image_name']).apply(get_mean_sem_trace) + m = mean_response.unstack() + + # set index to be cell/image pairs + rdf = rdf.reset_index() + rdf = rdf.set_index(['cell_specimen_id', 'change_image_name']) + + # Iterate through cells, and determine which change_image evoked the + # largest response + for cell in m.index: + image_index = np.where(m.loc[cell]['mean_response'].values == np.max( + m.loc[cell]['mean_response'].values))[0][0] + pref_image = m.loc[cell]['mean_response'].index[image_index] + + # Update the cell X change_image pairs to have the pref_stim set to + # True + rdf.at[(cell, pref_image), 'pref_stim'] = True + + # Test to ensure preferred stimulus is unique for each cell + for cell in rdf.reset_index()['cell_specimen_id'].unique(): + assert len( + rdf.reset_index().set_index('cell_specimen_id').loc[cell].query( + 'pref_stim').change_image_name.unique()) == 1 + + # Reset index to be cell/trial pairs + rdf = rdf.reset_index() + rdf = rdf.set_index(['cell_specimen_id', 'trial_id']) + return rdf + + +def get_mean_sem_trace(group): + ''' + Computes the average and sem of the mean_response column + + INPUTS: + group, a pandas group + + OUTPUT: + a pandas series with the mean_response, sem_response, mean_trace, + sem_trace, and mean_responses computed for the group. + ''' + mean_response = np.mean(group['mean_response']) + mean_responses = group['mean_response'].values + sem_response = np.std(group['mean_response'].values) / np.sqrt( + len(group['mean_response'].values)) + mean_trace = np.mean(group['dff_trace']) + sem_trace = np.std(group['dff_trace'].values) / np.sqrt( + len(group['dff_trace'].values)) + return pd.Series( + {'mean_response': mean_response, 'sem_response': sem_response, + 'mean_trace': mean_trace, 'sem_trace': sem_trace, + 'mean_responses': mean_responses}) + + +def get_trial_response_df(session, response_analysis_params): + ''' + Computes the trial_response_df for the session + PROBLEM: Ignores aborted trials + + INPUTS: + session, a behaviorOphysSession object to be analyzed + response_analysis_params, a dictionary with keys: + 'window_around_timepoint_seconds' The window around the + change_time to use in the dff trace + 'response_window_duration_seconds' The duration after the + change time to use in the mean_response + 'baseline_window_duration_seconds' The duration before the + change time to use as the baseline_response + + OUTPUTS: + trial_response_df, a pandas dataframe with multi-index ( + cell_specimen_id/trial_id), and columns: + cell_roi_id, this sessions roi_id + mean_response, the average dff in the response_window + baseline_response, the average dff in the baseline window + dff_trace, the dff_trace in the window_around_timepoint_seconds + dff_trace_timestamps, the timestamps for the dff_trace + ''' + frame_rate = 31. # PROBLEM, shouldnt hard code this here + + # get data to analyze + dff_traces = session.dff_traces.copy() + trials = session.trials.copy() + trials = trials[~trials.aborted] # PROBLEM + + # get params to define response window, in seconds + window_around_timepoint_seconds = response_analysis_params[ + 'window_around_timepoint_seconds'] + response_window_duration_seconds = response_analysis_params[ + 'response_window_duration_seconds'] + baseline_window_duration_seconds = response_analysis_params[ + 'baseline_window_duration_seconds'] + mean_response_window_seconds = [np.abs(window_around_timepoint_seconds[0]), + np.abs(window_around_timepoint_seconds[ + 0]) + + response_window_duration_seconds] + baseline_window_seconds = [np.abs( + window_around_timepoint_seconds[0]) - baseline_window_duration_seconds, + np.abs(window_around_timepoint_seconds[0])] + + # Set up multi-index dataframe + cell_trial_combinations = itertools.product(dff_traces.index, trials.index) + index = pd.MultiIndex.from_tuples(cell_trial_combinations, + names=['cell_specimen_id', 'trial_id']) + df = pd.DataFrame(index=index) + + # Iterate through cell/trial pairs, and construct the columns + traces_list = [] + trace_timestamps_list = [] + for cell_specimen_id, trial_id in itertools.product(dff_traces.index, + trials.index): + timepoint = trials.loc[trial_id]['change_time'] + cell_roi_id = dff_traces.loc[cell_specimen_id]['cell_roi_id'] + full_cell_trace = dff_traces.loc[cell_specimen_id, 'dff'] + trace, trace_timestamps = get_trace_around_timepoint( + full_cell_trace, + timepoint, + session.ophys_timestamps, + window_around_timepoint_seconds, + frame_rate) + mean_response = get_mean_in_window(trace, mean_response_window_seconds, + frame_rate) + baseline_response = get_mean_in_window(trace, baseline_window_seconds, + frame_rate) + + traces_list.append(trace) + trace_timestamps_list.append(trace_timestamps) + df.loc[(cell_specimen_id, trial_id), 'cell_roi_id'] = int(cell_roi_id) + df.loc[(cell_specimen_id, trial_id), 'mean_response'] = mean_response + df.loc[(cell_specimen_id, + trial_id), 'baseline_response'] = baseline_response + df.insert(loc=1, column='dff_trace', value=traces_list) + df.insert(loc=2, column='dff_trace_timestamps', + value=trace_timestamps_list) + return df + + +if __name__ == '__main__': + # Load cache + cache_json = { + 'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys' + '/visual_behavior/SWDB_2019/' + 'visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys' + '/visual_behavior/SWDB_2019/nwb_files', + 'analysis_files_base_dir': + '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior' + '/SWDB_2019/extra_files_final' + } + cache = bpc.BehaviorProjectCache(cache_json) + + case = 0 + if case == 0: + # this is the main use case + experiment_id = sys.argv[1] # get experiment_id to analyze + + # Load session object + # experiment_id = cache.manifest.iloc[5]['ophys_experiment_id'] + # nwb_path = cache.get_nwb_filepath(experiment_id) + # api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) + # session = BehaviorOphysExperiment(api) + + # Get the session using the cache so that the change time fix is + # applied + session = cache.get_session(experiment_id) + change_times = session.trials['change_time'][ + ~pd.isnull(session.trials['change_time'])].values + flash_times = session.stimulus_presentations['start_time'].values + assert np.all(np.isin(change_times, flash_times)) + + output_path = '/allen/programs/braintv/workgroups/nc-ophys' \ + '/visual_behavior/SWDB_2019/extra_files_final' + + response_analysis_params = {'window_around_timepoint_seconds': [-4, 8], + 'response_window_duration_seconds': 0.5, + 'baseline_window_duration_seconds': 0.5} + + trial_response_df = get_trial_response_df(session, + response_analysis_params) + + trial_metadata = session.trials.copy() + trial_metadata.index.names = ['trial_id'] + trial_response_df = trial_response_df.join(trial_metadata) + trial_response_df = add_p_vals_tr(trial_response_df) + trial_response_df = annotate_trial_response_df_with_pref_stim( + trial_response_df) + + output_fn = os.path.join(output_path, 'trial_response_df_{}.h5'.format( + experiment_id)) + print('Writing trial response df to {}'.format(output_fn)) + trial_response_df.to_hdf(output_fn, key='df', complib='bzip2', + complevel=9) + + elif case == 1: + # This is a debugging case + experiment_id = 846487947 + + session = cache.get_session(experiment_id) + + change_times = session.trials['change_time'][ + ~pd.isnull(session.trials['change_time'])].values + flash_times = session.stimulus_presentations['start_time'].values + assert np.all(np.isin(change_times, flash_times)) + + output_path = '/allen/programs/braintv/workgroups/nc-ophys' \ + '/visual_behavior/SWDB_2019/extra_files_final' + + response_analysis_params = {'window_around_timepoint_seconds': [-4, 8], + 'response_window_duration_seconds': 0.5, + 'baseline_window_duration_seconds': 0.5} + + trial_response_df = get_trial_response_df(session, + response_analysis_params) + + trial_metadata = session.trials.copy() + trial_metadata.index.names = ['trial_id'] + trial_response_df = trial_response_df.join(trial_metadata) + trial_response_df = add_p_vals_tr(trial_response_df) + trial_response_df = annotate_trial_response_df_with_pref_stim( + trial_response_df) diff --git a/brain_observatory/behavior/swdb/summary_figures.py b/brain_observatory/behavior/swdb/summary_figures.py new file mode 100644 index 0000000000..080536f498 --- /dev/null +++ b/brain_observatory/behavior/swdb/summary_figures.py @@ -0,0 +1,560 @@ +import os +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import seaborn as sns + +sns.set_context('notebook', font_scale=1.5, rc={'lines.markeredgewidth': 2}) +sns.set_style('white') +sns.set_palette('deep'); + +from allensdk.brain_observatory.behavior.swdb import behavior_project_cache as bpc +from allensdk.brain_observatory.behavior.swdb import utilities as ut + + +def get_color_for_image_name(session, image_name): + images = np.sort(session.stimulus_presentations.image_name.unique()) + images = images[images != 'omitted'] + colors = sns.color_palette("hls", len(images)) + image_index = np.where(images == image_name)[0][0] + color = colors[image_index] + return color + + +def addSpan(ax, amin, amax, color='k', alpha=0.3, axtype='x', zorder=1): + if axtype == 'x': + ax.axvspan(amin, amax, facecolor=color, edgecolor='none', alpha=alpha, linewidth=0, zorder=zorder) + if axtype == 'y': + ax.axhspan(amin, amax, facecolor=color, edgecolor='none', alpha=alpha, linewidth=0, zorder=zorder) + + +def add_stim_color_span(session, ax, xlim=None): + # xlim should be in seconds + if xlim is None: + stim_table = session.stimulus_presentations.copy() + else: + stim_table = session.stimulus_presentations.copy() + stim_table = stim_table[(stim_table.start_time >= xlim[0]) & (stim_table.stop_time <= xlim[1])] + if 'omitted' in stim_table.keys(): + stim_table = stim_table[stim_table.omitted == False].copy() + for idx in stim_table.index: + start_time = stim_table.loc[idx]['start_time'] + end_time = stim_table.loc[idx]['stop_time'] + image_name = stim_table.loc[idx]['image_name'] + color = get_color_for_image_name(session, image_name) + addSpan(ax, start_time, end_time, color=color) + return ax + + +def plot_behavior_events(session, ax, behavior_only=False): + lick_times = session.licks.timestamps.values + reward_times = session.rewards.timestamps.values + if behavior_only: + lick_y = 0 + reward_y = 0.25 + ax.set_ylim([-0.5, 1]) + else: + ymin, ymax = ax.get_ylim() + lick_y = ymin + (ymax * 0.05) + reward_y = ymin + (ymax * 0.1) + lick_y_array = np.empty(len(lick_times)) + lick_y_array[:] = lick_y + reward_y_array = np.empty(len(reward_times)) + reward_y_array[:] = reward_y + ax.plot(lick_times, lick_y_array, '|', color='g', markeredgewidth=1, label='licks') + ax.plot(reward_times, reward_y_array, 'o', markerfacecolor='purple', markeredgecolor='purple', markeredgewidth=0.1, + label='rewards') + return ax + + +def restrict_axes(xmin, xmax, interval, ax): + xticks = np.arange(xmin, xmax, interval) + ax.set_xticks(xticks) + ax.set_xlim([xmin, xmax]) + return ax + + +def plot_behavior_events_trace(session, xmin=360, length=3, ax=None, save_dir=None): + xmax = xmin + 60 * length + interval = 20 + if ax is None: + figsize = (15, 4) + fig, ax = plt.subplots(figsize=figsize) + ax.plot(session.running_speed.timestamps, session.running_speed.speed, color=sns.color_palette()[0]) + ax = add_stim_color_span(session, ax, xlim=[xmin, xmax]) + ax = plot_behavior_events(session, ax) + ax = restrict_axes(xmin, xmax, interval, ax) + ax.set_ylabel('running speed (cm/s)') + ax.set_xlabel('time (sec)') + if save_dir: + fig.tight_layout() + ut.save_figure(fig, figsize, save_dir, 'behavior_events', + str(session.metadata['ophys_experiment_id']) + '_' + str(xmin)) + plt.close() + return ax + + +def plot_traces_heatmap(session, ax=None): + dff_traces = session.dff_traces + dff_traces_array = np.vstack(dff_traces.dff.values) + if ax is None: + fig, ax = plt.subplots(figsize=(20, 5)) + cax = ax.pcolormesh(dff_traces_array, cmap='magma', vmin=0, vmax=np.percentile(dff_traces_array, 99)) + ax.set_yticks(np.arange(0, len(dff_traces_array)), 10); + ax.set_ylabel('cells') + ax.set_xlabel('time (sec)') + ax.set_xticks(np.arange(0, len(session.ophys_timestamps), 10*60*31.)); + ax.set_xticklabels(np.arange(0, session.ophys_timestamps[-1], 10*60)); + cb = plt.colorbar(cax, pad=0.015) + cb.set_label('dF/F', labelpad=3) + return ax + + +def plot_behavior_segment(session, xlims=[620, 640], ax=None): + if ax is None: + fig, ax = plt.subplots() + ax.plot(session.running_speed.timestamps, session.running_speed.speed) + ax.set_ylabel('running speed\ncm/s') + ax.set_xlabel('time (s)') + ax.set_xlim(xlims) + ax.set_ylim(-15, 60) + ax.plot(session.rewards.index.values, -10 * np.ones(np.shape(session.rewards.index.values)), 'ro') + ax.vlines(session.licks.timestamps.values, ymin=-10, ymax=-5) + image_index = -1 + last_omitted = False + for index, row in session.stimulus_presentations.iterrows(): + if row.omitted is False: + ax.axvspan(row.start_time, row.stop_time, alpha=0.3, facecolor='gray') + if not (row.image_index == image_index) and (last_omitted==False): + ax.axvspan(row.start_time, row.stop_time, alpha=0.3, facecolor='blue') + image_index = row.image_index + last_omitted = row.omitted + return ax + + +def plot_lick_raster(trials, ax=None): + trials = trials[trials.aborted == False] + trials = trials.reset_index() + if ax is None: + fig, ax = plt.subplots(figsize=(5, 10)) + for trial_index, trial_data in trials.iterrows(): + # get times relative to change time + lick_times = [(t - trial_data.change_time) for t in trial_data.lick_times] + reward_time = [(t - trial_data.change_time) for t in [trial_data.reward_time]] + # plot reward times + if len(reward_time) > 0: + ax.plot(reward_time[0], trial_index + 0.5, '.', color='b', label='reward', markersize=6) + # plot lick times + ax.vlines(lick_times, trial_index, trial_index + 1, color='k', linewidth=1) + # put a line at the change time + ax.vlines(0, trial_index, trial_index + 1, color=[.5, .5, .5], linewidth=1) + # gray bar for response window + ax.axvspan(0.15, 0.75, facecolor='gray', alpha=.3, edgecolor='none') + ax.grid(False) + ax.set_ylim(0, len(trials)) + ax.set_xlim([-1, 4]) + ax.set_ylabel('trials') + ax.set_xlabel('time (sec)') + ax.set_title('lick raster') + plt.gca().invert_yaxis() + return ax + + +def plot_trace(timestamps, trace, ax=None, xlabel='time (seconds)', ylabel='fluorescence', title='roi', + color=sns.color_palette()[0]): + if ax is None: + fig, ax = plt.subplots(figsize=(15, 5)) + ax.plot(timestamps, trace, color=color, linewidth=2) + ax.set_xlabel(xlabel) + ax.set_ylabel(ylabel) + ax.set_title(title) + ax.set_xlim([timestamps[0], timestamps[-1]]) + return ax + + +def plot_trace(timestamps, trace, ax=None, xlabel='time (seconds)', ylabel='fluorescence', title='roi', + color=sns.color_palette()[0]): + if ax is None: + fig, ax = plt.subplots(figsize=(15, 5)) + ax.plot(timestamps, trace, color=color, linewidth=2) + ax.set_xlabel(xlabel) + ax.set_ylabel(ylabel) + ax.set_title(title) + ax.set_xlim([timestamps[0], timestamps[-1]]) + return ax + + +def plot_example_traces_and_behavior(session, xmin_seconds, length_mins, cell_label=False, save_dir=None): + traces = np.stack(session.dff_traces.dff.values) + cell_indices = ut.get_active_cell_indices(traces) + + interval_seconds = 10 + xmax_seconds = xmin_seconds + (length_mins * 60) + 1 + xlim = [xmin_seconds, xmax_seconds] + + figsize = (14, 10) + fig, ax = plt.subplots(len(cell_indices) + 1, 1, figsize=figsize) + ax = ax.ravel() + + ymins = [] + ymaxs = [] + for i, cell_index in enumerate(cell_indices): + ax[i].tick_params(reset=True, which='both', bottom='off', top='off', right='off', left='off', + labeltop='off', labelright='off', labelleft='off', labelbottom='off') + ax[i] = plot_trace(session.ophys_timestamps, traces[cell_index, :], ax=ax[i], + title='', ylabel=str(cell_index), color=[.5, .5, .5]) + ax[i] = add_stim_color_span(session, ax=ax[i], xlim=xlim) + ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) + ax[i].set_xticks([]) + ax[i].set_xlabel('') + ax[i].set_xlim(xlim) + ymin, ymax = ax[i].get_ylim() + ymins.append(ymin) + ymaxs.append(ymax) + if cell_label: + ax[i].set_ylabel('cell ' + str(i), fontsize=12) + else: + ax[i].set_ylabel('') + ax[i].set_yticks([]) + sns.despine(ax=ax[i], left=True, bottom=True) + ymin, ymax = ax[i].get_ylim() + if 'Vip' in session.metadata['full_genotype']: + ax[i].vlines(x=xmin_seconds, ymin=0, ymax=2, linewidth=4) + ax[i].set_ylim(ymin=-0.5, ymax=5) + elif 'Slc' in session.metadata['full_genotype']: + ax[i].vlines(x=xmin_seconds, ymin=0, ymax=1, linewidth=4) + ax[i].set_ylim(ymin=-0.5, ymax=3) + ax[i].get_xaxis().set_ticks([]) + ax[i].get_yaxis().set_ticks([]) + ax[i].tick_params(which='both', bottom='off', top='off', right='off', left='off', + labeltop='off', labelright='off', labelleft='off', labelbottom='off') + ax[i].set_xticklabels('') + + i += 1 + ax[i].tick_params(axis="x", bottom=True, top=False, labelbottom=True, labeltop=False) + ax[i].plot(session.running_speed.timestamps, session.running_speed.speed, color=sns.color_palette()[0]) + ax[i] = plot_behavior_events(session, ax=ax[i]) + ax[i] = add_stim_color_span(session, ax=ax[i], xlim=xlim) + ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) + ax[i].set_xlim(xlim) + ax[i].set_ylabel('run speed\n(cm/s)', fontsize=12) + sns.despine(ax=ax[i], left=True, bottom=True) + ax[i].set_yticklabels('') + xticks = np.arange(xmin_seconds, xmax_seconds, interval_seconds) + ax[i].set_xticks(xticks) + ax[i].set_xticklabels(xticks) + ax[i].set_xlabel('time (seconds)') + + ax[0].set_title( + str(session.metadata['ophys_experiment_id']) + '_' + session.metadata['full_genotype'].split('-')[0]) + plt.subplots_adjust(wspace=0, hspace=0) + plt.subplots_adjust(bottom=0.2) + + if save_dir: + ut.save_figure(fig, figsize, save_dir, 'example_traces', + str(session.metadata['ophys_experiment_id']) + '_' + str(xlim[0])) + + +def plot_transitions_response_heatmap(trials, ax=None): + trials = trials[trials.aborted == False] + trials['response_binary'] = [1 if response_latency < 0.75 else 0 for response_latency in + trials.response_latency.values] + + response_matrix = pd.pivot_table(trials, + values='response_binary', + index=['initial_image_name'], + columns=['change_image_name']) + if ax is None: + fig, ax = plt.subplots(figsize=(5, 5)) + ax = sns.heatmap(response_matrix, cmap='magma', square=True, annot=False, + annot_kws={"fontsize": 10}, vmin=0, vmax=1, + robust=True, cbar_kws={"drawedges": False, "shrink": 0.7, "label": 'response probability'}, ax=ax) + return ax + + + +def plot_mean_trace_heatmap(mean_df, ax=None, save_dir=None, window=[-4, 8], interval_sec=2): + """ + There must be only one row per cell in the input df. + For example, if it is a mean of the trial_response_df, select only trials where go=True before passing to this function. + """ + data = mean_df[mean_df.pref_stim == True].copy() + if ax is None: + figsize = (3, 6) + fig, ax = plt.subplots(1, 1, figsize=figsize) + + order = np.argsort(data.mean_response.values)[::-1] + cells = data.cell_specimen_id.unique()[order] + len_trace = len(data.mean_trace.values[0]) + response_array = np.empty((len(cells), len_trace)) + for x, cell_specimen_id in enumerate(cells): + tmp = data[data.cell_specimen_id == cell_specimen_id] + if len(tmp) >= 1: + trace = tmp.mean_trace.values[0] + else: + trace = np.empty((len_trace)) + trace[:] = np.nan + response_array[x, :] = trace + + sns.heatmap(data=response_array, vmin=0, vmax=np.percentile(response_array, 99), ax=ax, cmap='magma', cbar=False) + xticks, xticklabels = ut.get_xticks_xticklabels(trace, 31., interval_sec=interval_sec, window=window) + ax.set_xticks(xticks) + ax.set_xticklabels([int(x) for x in xticklabels]) + if response_array.shape[0] < 50: + interval = 10 + else: + interval = 50 + ax.set_yticks(np.arange(0, response_array.shape[0], interval)) + ax.set_yticklabels(np.arange(0, response_array.shape[0], interval)) + ax.set_xlabel('time after change (s)', fontsize=16) + ax.set_ylabel('cells') + + if save_dir: + fig.tight_layout() + ut.save_figure(fig, figsize, save_dir, 'experiment_summary', 'mean_trace_heatmap_' + condition + suffix) + return ax + + +def plot_mean_image_response_heatmap(mean_df, title=None, ax=None, save_dir=None): + df = mean_df.copy() + if 'change_image_name' in df.keys(): + image_key = 'change_image_name' + else: + image_key = 'image_name' + images = np.sort(df[image_key].unique()) + cell_list = [] + for image in images: + tmp = df[(df[image_key] == image) & (df.pref_stim == True)] + order = np.argsort(tmp.mean_response.values)[::-1] + cell_ids = list(tmp.cell_specimen_id.values[order]) + cell_list = cell_list + cell_ids + + response_matrix = np.empty((len(cell_list), len(images))) + for i, cell in enumerate(cell_list): + responses = [] + for image in images: + response = df[(df.cell_specimen_id == cell) & (df[image_key] == image)].mean_response.values[0] + responses.append(response) + response_matrix[i, :] = np.asarray(responses) + + if ax is None: + figsize = (4, 7) + fig, ax = plt.subplots(figsize=figsize) + + vmax = 0.3 + label = 'mean dF/F' + ax = sns.heatmap(response_matrix, cmap='magma', linewidths=0, linecolor='white', square=False, + vmin=0, vmax=vmax, robust=True, + cbar_kws={"drawedges": False, "shrink": 1, "label": label}, ax=ax) + + if title is None: + title = 'mean response by image' + ax.set_title(title, va='bottom', ha='center') + ax.set_xticklabels(images, rotation=90) + ax.set_ylabel('cells') + if response_matrix.shape[0] < 50: + interval = 10 + else: + interval = 50 + ax.set_yticks(np.arange(0, response_matrix.shape[0], interval)) + ax.set_yticklabels(np.arange(0, response_matrix.shape[0], interval)) + if save_dir: + fig.tight_layout() + ut.save_figure(fig, figsize, save_dir, 'experiment_summary', 'mean_image_response_heatmap' + suffix) + + +def plot_max_proj_and_roi_masks(session, save_dir=None): + figsize = (15, 5) + fig, ax = plt.subplots(1,3,figsize=figsize) + ax = ax.ravel() + + ax[0].imshow(session.max_projection, cmap='gray', vmin=0, vmax=np.amax(session.max_projection)) + ax[0].axis('off') + ax[0].set_title('max intensity projection') + + ax[1].imshow(session.segmentation_mask_image, cmap='gray') + ax[1].set_title('roi masks') + ax[1].axis('off') + + ax[2].imshow(session.max_projection, cmap='gray', vmin=0, vmax=np.amax(session.max_projection)) + ax[2].axis('off') + ax[2].set_title(str(session.metadata['ophys_experiment_id'])) + + tmp = session.segmentation_mask_image.data.copy() + mask = np.empty(session.segmentation_mask_image.data.shape, dtype=np.float) + mask[:] = np.nan + mask[tmp > 0] = 1 + cax = ax[2].imshow(mask, cmap='hsv', alpha=0.4, vmin=0, vmax=1) + + if save_dir: + ut.save_figure(fig, figsize, save_dir, 'roi_masks', str(session.metadata['ophys_experiment_id'])) + + +def placeAxesOnGrid(fig, dim=[1, 1], xspan=[0, 1], yspan=[0, 1], wspace=None, hspace=None, sharex=False, sharey=False): + ''' + Takes a figure with a gridspec defined and places an array of sub-axes on a portion of the gridspec + + Takes as arguments: + fig: figure handle - required + dim: number of rows and columns in the subaxes - defaults to 1x1 + xspan: fraction of figure that the subaxes subtends in the x-direction (0 = left edge, 1 = right edge) + yspan: fraction of figure that the subaxes subtends in the y-direction (0 = top edge, 1 = bottom edge) + wspace and hspace: white space between subaxes in vertical and horizontal directions, respectively + + returns: + subaxes handles + ''' + import matplotlib.gridspec as gridspec + + outer_grid = gridspec.GridSpec(100, 100) + inner_grid = gridspec.GridSpecFromSubplotSpec(dim[0], dim[1], + subplot_spec=outer_grid[int(100 * yspan[0]):int(100 * yspan[1]), + # flake8: noqa: E999 + int(100 * xspan[0]):int(100 * xspan[1])], wspace=wspace, + hspace=hspace) # flake8: noqa: E999 + + # NOTE: A cleaner way to do this is with list comprehension: + # inner_ax = [[0 for ii in range(dim[1])] for ii in range(dim[0])] + inner_ax = dim[0] * [dim[1] * [ + fig]] # filling the list with figure objects prevents an error when it they are later replaced by axis handles + inner_ax = np.array(inner_ax) + idx = 0 + for row in range(dim[0]): + for col in range(dim[1]): + if row > 0 and sharex == True: + share_x_with = inner_ax[0][col] + else: + share_x_with = None + + if col > 0 and sharey == True: + share_y_with = inner_ax[row][0] + else: + share_y_with = None + + inner_ax[row][col] = plt.Subplot(fig, inner_grid[idx], sharex=share_x_with, sharey=share_y_with) + fig.add_subplot(inner_ax[row, col]) + idx += 1 + + inner_ax = np.array(inner_ax).squeeze().tolist() # remove redundant dimension + return inner_ax + + +def plot_experiment_summary_figure(session, save_dir=None): + import allensdk.brain_observatory.behavior.swdb.utilities as ut + + meta = session.metadata + title = meta['driver_line'][0] + ', ' + meta['targeted_structure'] + ', ' + str(meta['imaging_depth']) + ', ' + \ + session.task_parameters['stage'] + + interval_seconds = 600 + ophys_frame_rate = int(session.metadata['ophys_frame_rate']) + + figsize = [2 * 11, 2 * 8.5] + fig = plt.figure(figsize=figsize, facecolor='white') + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.0, .2), yspan=(0, .2)) + ax.imshow(session.max_projection, cmap='gray') + ax.set_title('max intensity projection') + ax.axis('off') + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(0, .18), yspan=(.24, .4)) + trials = session.trials.copy() + trials = trials[trials.reward_rate > 1] + plot_transitions_response_heatmap(trials, ax=ax) + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.24, .86), yspan=(0, .26)) + ax = plot_traces_heatmap(session, ax=ax) + ax.set_title(title) + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.28, .92), yspan=(.32, .44)) + ax.plot(session.running_speed.timestamps, session.running_speed.speed) + ax.set_xlabel('time (seconds)') + ax.set_ylabel('running speed\n(cm/s)') + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.86, 1.), yspan=(0, .2)) + image_index = 0 + ax.imshow(session.stimulus_templates[image_index, :, :], cmap='gray') + st = session.stimulus_presentations.copy() + image_name = st[st.image_index==image_index].image_name.values[0] + ax.set_title(image_name) + ax.axis('off') + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.0, .17), yspan=(.54, .99)) + ax = plot_lick_raster(session.trials, ax=ax) + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.24, .42), yspan=(.54, .99)) + fr = session.flash_response_df + mdf = ut.get_mean_df(fr, conditions=['cell_specimen_id', 'image_name']) + plot_mean_image_response_heatmap(mdf, title=None, ax=ax) + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.52, .68), yspan=(.54, .99)) + tr = session.trial_response_df.copy() + mdf = ut.get_mean_df(tr[tr.go], conditions=['cell_specimen_id']) + mdf['pref_stim'] = True + ax = plot_mean_trace_heatmap(mdf, ax=ax, window=[-4, 8], interval_sec=2) + ax.set_title('mean trace for pref image') + ax.set_ylabel('cells') + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.76, .98), yspan=(.5, .62)) + ax.plot(session.trials.reward_rate) + ax.set_ylabel('reward rate') + ax.set_xlabel('trials') + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.76, 0.98), yspan=(.68, .8)) + plot_behavior_segment(session, xlims=[620, 640], ax=ax) + + ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.76, .98), yspan=(.86, .99)) + traces = tr[(tr.go == True)].dff_trace.values + ax = ut.plot_mean_trace(traces, window=[-4, 8], ax=ax) + ax = ut.plot_flashes_on_trace(ax, window=[-4, 8], go_trials_only=True) + ax.set_xlabel('time after change (sec)'); + ax.set_ylabel('mean dF/F'); + + fig.tight_layout() + + if save_dir: + fig.tight_layout() + ut.save_figure(fig, figsize, save_dir, 'experiment_summary', str(experiment_id)) + + +if __name__ == '__main__': + import sys + experiment_id = sys.argv[1] + + cache_json = { + 'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/visual_behavior_data_manifest.csv', + 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/nwb_files', + 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files', + 'analysis_files_metadata_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files_metadata.json', + } + + # cache_json = { + # 'manifest_path': r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\visual_behavior_data_manifest.csv', + # 'nwb_base_dir': r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\nwb_files', + # 'analysis_files_base_dir': r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\analysis_files', + # 'analysis_files_metadata_path':r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\analysis_files_metadata.json', + # } + + from allensdk.brain_observatory.behavior.swdb import behavior_project_cache as bpc + + cache = bpc.BehaviorProjectCache(cache_json) + manifest = cache.manifest + + # experiment_id = manifest.ophys_experiment_id.values[16] + # save_dir = r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\summary_figures' + + save_dir = r'/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/summary_figures' + print('loading session') + session = cache.get_session(experiment_id) + print('plotting experiment summary') + plot_experiment_summary_figure(session, save_dir=save_dir) + plot_max_proj_and_roi_masks(session, save_dir=save_dir) + print('plotting example traces') + for xmin_seconds in np.arange(500, 1000, 60): + plot_example_traces_and_behavior(session, xmin_seconds=xmin_seconds, length_mins=1, save_dir=save_dir) + for xmin_seconds in np.arange(1600, 1800, 18): + plot_example_traces_and_behavior(session, xmin_seconds=xmin_seconds, length_mins=.3, save_dir=save_dir) + print('plotting behavior events') + for xmin in np.arange(0, 1200, 30): + plot_behavior_events_trace(session, xmin=xmin, length=0.5, ax=None, save_dir=save_dir) + print('done') diff --git a/brain_observatory/behavior/swdb/utilities.py b/brain_observatory/behavior/swdb/utilities.py new file mode 100644 index 0000000000..36fd9e3f7f --- /dev/null +++ b/brain_observatory/behavior/swdb/utilities.py @@ -0,0 +1,365 @@ +import os +import numpy as np +import pandas as pd +import seaborn as sns +import matplotlib as mpl + +''' + This file contains a set of functions that are useful in analyzing visual behavior data +''' + + +def save_figure(fig, figsize, save_dir, folder, filename, formats=['.png']): + ''' + Function for saving a figure + + INPUTS: + fig: a figure object + figsize: tuple of desired figure size + save_dir: string, the directory to save the figure + folder: string, the sub-folder to save the figure in. if the folder does not exist, it will be created + filename: string, the desired name of the saved figure + formats: a list of file formats as strings to save the figure as, ex: ['.png','.pdf'] + ''' + fig_dir = os.path.join(save_dir, folder) + if not os.path.exists(fig_dir): + os.mkdir(fig_dir) + mpl.rcParams['pdf.fonttype'] = 42 + fig.set_size_inches(figsize) + for f in formats: + fig.savefig(os.path.join(fig_dir, fig_title + f), transparent=True, orientation='landscape') + + +def get_dff_matrix(session): + ''' + Returns the dff_trace of a session as a numpy matrix + + INPUTS: + session: a behaviorOphysSession object + + OUTPUTS: + dff: a matrix of cells x dff_trace for the entire session + ''' + dff = np.stack(session.dff_traces.dff, axis=0) + return dff + + +def get_mean_df(response_df, conditions=['cell_specimen_id', 'image_name']): + ''' + Computes an analysis on a selection of responses (either flashes or trials). Computes mean_response, sem_response, the pref_stim, fraction_active_responses. + + INPUTS + response_df: the dataframe to group + conditions: the conditions to group by, the first entry should be 'cell_specimen_id', the second could be 'image_name' or 'change_image_name' + + OUTPUTS: + mdf: a dataframe with the following columns: + mean_response: the average mean_response for each condition + sem_response: the sem of the mean_response + mean_trace: the average dff trace for each condition + sem_trace: the sem of the mean_trace + mean_responses: the list of mean_responses for each element of each group + pref_stim: if conditions includes image_name or change_image_name, sets a boolean column for whether that was the cell's preferred stimulus + fraction_significant_responses: the fraction of individual image presentations or trials that were significant (p_value > 0.05) + ''' + + # Group by conditions + rdf = response_df.copy() + mdf = rdf.groupby(conditions).apply(get_mean_sem_trace) + mdf = mdf[['mean_response', 'sem_response', 'mean_trace', 'sem_trace', 'mean_responses']] + mdf = mdf.reset_index() + + # Add preferred stimulus if we can + if ('image_name' in conditions) or ('change_image_name' in conditions): + mdf = annotate_mean_df_with_pref_stim(mdf) + + # What fraction of individual responses were significant? + fraction_significant_responses = rdf.groupby(conditions).apply(get_fraction_significant_responses) + fraction_significant_responses = fraction_significant_responses.reset_index() + mdf['fraction_significant_responses'] = fraction_significant_responses.fraction_significant_responses + + if 'index' in mdf.keys(): + mdf = mdf.drop(columns=['index']) + return mdf + + +def get_mean_sem_trace(group): + ''' + Computes the average and sem of the mean_response column + + INPUTS: + group: a pandas groupby object + + OUTPUT: + a pandas series with the mean_response, sem_response, mean_trace, sem_trace, and mean_responses computed for the group. + ''' + mean_response = np.mean(group['mean_response']) + mean_responses = group['mean_response'].values + sem_response = np.std(group['mean_response'].values) / np.sqrt(len(group['mean_response'].values)) + mean_trace = np.mean(group['dff_trace']) + sem_trace = np.std(group['dff_trace'].values) / np.sqrt(len(group['dff_trace'].values)) + return pd.Series({'mean_response': mean_response, 'sem_response': sem_response, + 'mean_trace': mean_trace, 'sem_trace': sem_trace, + 'mean_responses': mean_responses}) + + +def annotate_mean_df_with_pref_stim(mean_df): + ''' + Computes the preferred stimulus for each cell/trial or cell/flash combination. Preferred image is computed by seeing which image evoked the largest average mean_response across all images. + + INPUTS: + mean_df: the mean_df to be annotated + + OUTPUTS: + mean_df with a new column appended 'pref_stim' which is a boolean TRUE/FALSE for whether that image was that cell's preferred image. + + ASSERTS: + Each cell has one unique preferred stimulus + ''' + + # Are we dealing with flash_response or trial_response + if 'image_name' in mean_df.keys(): + image_name = 'image_name' + else: + image_name = 'change_image_name' + + # set up dataframe + mdf = mean_df.reset_index() + mdf['pref_stim'] = False + + # Iterate through cells in df + for cell in mdf['cell_specimen_id'].unique(): + mc = mdf[(mdf['cell_specimen_id'] == cell)] + mc = mc[mc[image_name] != 'omitted'] + temp = mc[(mc.mean_response == np.max(mc.mean_response.values))][image_name].values + if len(temp) > 0: # need this test if the mean_response was nan + pref_image = temp[0] + # PROBLEM, this is slow, and sets on slice, better to use mdf.at[test, 'pref_stim'] + row = mdf[(mdf['cell_specimen_id'] == cell) & (mdf[image_name] == pref_image)].index + mdf.loc[row, 'pref_stim'] = True + + # Test to ensure preferred stimulus is unique for each cell + for cell in mdf.reset_index()['cell_specimen_id'].unique(): + if image_name == 'image_name': + assert len( + mdf.reset_index().set_index('cell_specimen_id').loc[cell].query('pref_stim').image_name.unique()) == 1 + else: + assert len(mdf.reset_index().set_index('cell_specimen_id').loc[cell].query( + 'pref_stim').change_image_name.unique()) == 1 + return mdf + + +def get_fraction_significant_responses(group, threshold=0.05): + ''' + Calculates the fraction of trials or flashes that have a p_value below threshold + Note that this function does not handle multiple comparisons + + INPUT: + group: a pandas groupby object + threshold: the p_value threshold for significance for an individual response + + OUTPUT: + a pandas series with column 'fraction_significant_responses' + ''' + fraction_significant_responses = len(group[group.p_value < threshold]) / float(len(group)) + return pd.Series({'fraction_significant_responses': fraction_significant_responses}) + + +def get_xticks_xticklabels(trace, ophys_frame_rate=31., interval_sec=1, window=[-4, 8]): + """ + Function that accepts a timeseries, evaluates the number of points in the trace, + and converts from acquisition frames to timestamps relative to a given window of time covered by the trace. + + :param trace: a single trace where length = the number of timepoints + :param ophys_frame_rate: ophys frame rate if plotting a calcium trace, stimulus frame rate if plotting running speed + :param interval_sec: interval in seconds in between labels + + :return: xticks, xticklabels = xticks in units of ophys frames frames, xticklabels in seconds relative + """ + interval_frames = interval_sec * ophys_frame_rate + n_frames = len(trace) + n_sec = n_frames / ophys_frame_rate + xticks = np.arange(0, n_frames + 1, interval_frames) + xticklabels = np.arange(0, n_sec + 0.1, interval_sec) + if not window: + xticklabels = xticklabels - n_sec / 2 + else: + xticklabels = xticklabels + window[0] + if interval_sec >= 1: + xticklabels = [int(x) for x in xticklabels] + return xticks, xticklabels + + +def plot_mean_trace(traces, window=[-4, 8], interval_sec=1, ylabel='dF/F', legend_label=None, color='k', ax=None): + """ + Function that accepts an array of single trial traces and plots the mean and SEM of the trace, with xticklabels in seconds + + :param traces: array of individual trial traces to average and plot. traces must be of equal length + :param frame_rate: ophys frame rate if plotting a calcium trace, stimulus frame rate if plotting running speed + :param y_label: 'dF/F' for calcium trace, 'running speed (cm/s)' for running speed trace + :param legend_label: string describing trace for legend (ex: 'go', 'catch', image name or other condition identifier) + :param color: color to plot the trace + :param interval_sec: interval in seconds for x_axis labels + :param xlims: range in seconds to plot. Must be <= the length of the traces + :param ax: if None, create figure and axes to plot. If axis handle is provided, plot is created on that axis + + :return: axis handle + """ + ophys_frame_rate = 31. # PROBLEM, shouldn't hard code this here + if ax is None: + fig, ax = plt.subplots() + if len(traces) > 0: + trace = np.mean(traces, axis=0) + times = np.arange(0, len(trace), 1) + sem = (traces.std()) / np.sqrt(float(len(traces))) + ax.plot(trace, label=legend_label, linewidth=3, color=color) + ax.fill_between(times, trace + sem, trace - sem, alpha=0.5, color=color) + + xticks, xticklabels = get_xticks_xticklabels(trace, ophys_frame_rate, interval_sec, window=window) + ax.set_xticks(xticks) + if interval_sec < 1: + ax.set_xticklabels(xticklabels) + else: + ax.set_xticklabels([int(x) for x in xticklabels]) + ax.set_xlim(0, len(trace)) + ax.set_xlabel('time (sec)') + ax.set_ylabel(ylabel) + sns.despine(ax=ax) + return ax + + +def plot_flashes_on_trace(ax, window=[-4, 8], go_trials_only=False, omitted=False, flashes=False, alpha=0.25, + facecolor='gray'): + """ + Function to create transparent gray bars spanning the duration of visual stimulus presentations to overlay on existing figure + + :param ax: axis on which to plot stimulus presentation times + :param window: window of time the trace covers, in seconds + :param trial_type: 'go' or 'catch'. If 'go', different alpha levels are used for stimulus presentations before and after change time + :param omitted: boolean, use True if plotting response to omitted flashes + :param alpha: value between 0-1 to set transparency level of gray bars demarcating stimulus times + + :return: axis handle + """ + # PROBLEM: shouldn't hard code these things here + frame_rate = 31. + stim_duration = .25 + blank_duration = .5 + change_frame = np.abs(window[0]) * frame_rate + end_frame = (window[1] + np.abs(window[0])) * frame_rate + interval = blank_duration + stim_duration + if omitted: + array = np.arange((change_frame + interval), end_frame, interval * frame_rate) + array = array[1:] + else: + array = np.arange(change_frame, end_frame, interval * frame_rate) + for i, vals in enumerate(array): + amin = array[i] + amax = array[i] + (stim_duration * frame_rate) + ax.axvspan(amin, amax, facecolor=facecolor, edgecolor='none', alpha=alpha, linewidth=0, zorder=1) + if go_trials_only: + alpha = alpha * 3 + else: + alpha + array = np.arange(change_frame - ((blank_duration) * frame_rate), 0, -interval * frame_rate) + for i, vals in enumerate(array): + amin = array[i] + amax = array[i] - (stim_duration * frame_rate) + ax.axvspan(amin, amax, facecolor=facecolor, edgecolor='none', alpha=alpha, linewidth=0, zorder=1) + return ax + + +def create_multi_session_mean_df(cache, experiment_ids, conditions=['cell_specimen_id', 'change_image_name'], + flashes=False): + ''' + Creates a mean response dataframe by combining multiple sessions. + + INPUTS: + cache: the cache object for the dataset + experiment_ids: a list of experiment_ids for sessions to merge + conditions: the set of conditions to group by. The first entry should be 'cell_specimen_id' + flashes: if TRUE, uses the flash_response_df to merge, otherwise uses the trial_response_df + + OUTPUTS + mega_mdf, a dataframe with index given by the session experiment ids. This allows for easy analysis like: + mega_mdf.groupby('experiment_id').mean_response.mean() + ''' + manifest = cache.experiment_table + mega_mdf = pd.DataFrame() + # Iterate through experiments + for experiment_id in experiment_ids: + # load the session object + session = cache.get_session(experiment_id) + print(session.metadata['ophys_experiment_id']) + # Get the individual session mean_df + if flashes: + mdf = get_mean_df(session.flash_response_df, conditions=conditions) + else: + mdf = get_mean_df(session.trial_response_df, conditions=conditions) + + # Append metadata + mdf['experiment_id'] = session.metadata['ophys_experiment_id'] + mdf['experiment_container_id'] = session.metadata['experiment_container_id'] + stage = manifest[manifest.ophys_experiment_id == session.metadata['ophys_experiment_id']].stage_name.values[0] + mdf['stage_name'] = stage + mdf['passive'] = parse_stage_for_passive(stage) + mdf['image_set'] = parse_stage_for_image_set(stage) + mdf['targeted_structure'] = session.metadata['targeted_structure'] + mdf['imaging_depth'] = session.metadata['imaging_depth'] + mdf['full_genotype'] = session.metadata['full_genotype'] + mdf['cre_line'] = session.metadata['full_genotype'].split('/')[0] + mdf['retake_number'] = \ + manifest[manifest.ophys_experiment_id == session.metadata['ophys_experiment_id']].retake_number.values[0] + + # Concatenate this session to the other sessions + mega_mdf = pd.concat([mega_mdf, mdf]) + + # Clean up indexes + mega_mdf = mega_mdf.reset_index() + mega_mdf = mega_mdf.set_index('experiment_id') + if 'index' in mega_mdf.keys(): + mega_mdf = mega_mdf.drop(columns=['index']) + if 'level_0' in mega_mdf.keys(): + mega_mdf = mega_mdf.drop(columns=['level_0']) + + return mega_mdf + + +def parse_stage_for_passive(stage): + ''' + Returns TRUE if the stage_name indicates a passive sessions + ''' + return 'passive' in stage + + +def parse_stage_for_image_set(stage): + ''' + Returns the character for the image_set, for example 'A' + ''' + return stage[15] + + +def get_active_cell_indices(dff_traces): + ''' + Returns the ten most active cells. + Computes active cells by SNR = mean/std over all timepoints. + ''' + snr_values = [] + for i, trace in enumerate(dff_traces): + mean = np.mean(trace, axis=0) + std = np.std(trace, axis=0) + snr = mean / std + snr_values.append(snr) + active_cell_indices = np.argsort(snr_values)[-10:] + return active_cell_indices + + +def compute_lifetime_sparseness(image_responses): + # image responses should be an array of the trial averaged responses to each image + # sparseness = 1-(sum of trial averaged responses to images / N)squared / (sum of (squared mean responses / n)) / (1-(1/N)) + # N = number of images + # after Vinje & Gallant, 2000; Froudarakis et al., 2014 + N = float(len(image_responses)) + ls = ((1 - (1 / N) * ((np.power(image_responses.sum(axis=0), 2)) / (np.power(image_responses, 2).sum(axis=0)))) / ( + 1 - (1 / N))) + return ls diff --git a/brain_observatory/behavior/sync/__init__.py b/brain_observatory/behavior/sync/__init__.py new file mode 100644 index 0000000000..0969a89aad --- /dev/null +++ b/brain_observatory/behavior/sync/__init__.py @@ -0,0 +1,255 @@ +""" +Created on Sunday July 15 2018 + +@author: marinag +""" +from itertools import chain +from typing import Dict, Any, Optional, List, Union +from allensdk.brain_observatory.behavior.sync.process_sync import ( + filter_digital, calculate_delay) # NOQA: E402 +from allensdk.brain_observatory.sync_dataset import Dataset as SyncDataset # NOQA: E402 +import numpy as np +import scipy.stats as sps + + +def get_raw_stimulus_frames( + dataset: SyncDataset, + permissive: bool = False +) -> np.ndarray: + """ Report the raw timestamps of each stimulus frame. This corresponds to + the time at which the psychopy window's flip method returned, but not + necessarily to the time at which the stimulus frame was displayed. + + Parameters + ---------- + dataset : describes experiment timing + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Returns + ------- + array of timestamps (floating point; seconds; relative to experiment start). + + """ + try: + return dataset.get_edges("falling",['stim_vsync', 'vsync_stim'], "seconds") + except KeyError: + if not permissive: + raise + return + + +def get_ophys_frames( + dataset: SyncDataset, + permissive: bool = False +) -> np.ndarray: + """ Report the timestamps of each optical physiology video frame + + Parameters + ---------- + dataset : describes experiment timing + + Returns + ------- + array of timestamps (floating point; seconds; relative to experiment start). + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Notes + ----- + use rising edge for Scientifica, falling edge for Nikon + http://confluence.corp.alleninstitute.org/display/IT/Ophys+Time+Sync + This function uses rising edges + + """ + try: + print(dataset) + return dataset.get_edges("rising", ['2p_vsync', 'vsync_2p'], "seconds") + except KeyError: + if not permissive: + raise + return + + +def get_lick_times( + dataset: SyncDataset, + permissive: bool = False +) -> Optional[np.ndarray]: + """ Report the timestamps of each detected lick + + Parameters + ---------- + dataset : describes experiment timing + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Returns + ------- + array of timestamps (floating point; seconds; relative to experiment start) + or None. If None, no lick timestamps were found in this sync + dataset. + + """ + return dataset.get_edges( + "rising", ["lick_times", "lick_sensor"], "seconds", permissive) + + +def get_stim_photodiode( + dataset: SyncDataset, + permissive: bool = False +) -> Optional[List[float]]: + """ Report the timestamps of each detected sync square transition (both + black -> white and white -> black) in this experiment. + + Parameters + ---------- + dataset : describes experiment timing + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Returns + ------- + array of timestamps (floating point; seconds; relative to experiment start) + or None. If None, no photodiode timestamps were found in this sync + dataset. + + """ + return dataset.get_edges( + "all", ["stim_photodiode", "photodiode"], "seconds", permissive) + + +def get_trigger( + dataset: SyncDataset, + permissive: bool = False +) -> Optional[np.ndarray]: + """ Returns (as a 1-element array) the time at which optical physiology + acquisition was started. + + Parameters + ---------- + dataset : describes experiment timing + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Returns + ------- + timestamps (floating point; seconds; relative to experiment start) + or None. If None, no timestamps were found in this sync dataset. + + Notes + ----- + Ophys frame timestamps can be recorded before acquisition start when + experimenters are setting up the recording session. These do not + correspond to acquired ophys frames. + + """ + return dataset.get_edges( + "rising", ["2p_trigger", "acq_trigger", "stim_running"], "seconds", permissive) + + +def get_eye_tracking( + dataset: SyncDataset, + permissive: bool = False +) -> Optional[np.ndarray]: + """ Report the timestamps of each frame of the eye tracking video + + Parameters + ---------- + dataset : describes experiment timing + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Returns + ------- + array of timestamps (floating point; seconds; relative to experiment start) + or None. If None, no eye tracking timestamps were found in this sync + dataset. + + """ + return dataset.get_edges( + "rising", ["cam2_exposure", "eye_tracking", "eye_cam_exposing"], "seconds", permissive) + + +def get_behavior_monitoring( + dataset: SyncDataset, + permissive: bool = False +) -> Optional[np.ndarray]: + """ Report the timestamps of each frame of the behavior + monitoring video + + Parameters + ---------- + dataset : describes experiment timing + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Returns + ------- + array of timestamps (floating point; seconds; relative to experiment start) + or None. If None, no behavior monitoring timestamps were found in this + sync dataset. + + """ + return dataset.get_edges( + "rising", ["cam1_exposure", "behavior_monitoring", "face_cam_exposing"], "seconds", + permissive) + + +def get_sync_data( + sync_path: str, + permissive: bool = False +) -> Dict[str, Union[List, np.ndarray, None]]: + """ Convenience function for extracting several timestamp arrays from a + sync file. + + Parameters + ---------- + sync_path : The hdf5 file here ought to be a Visual Behavior sync output + file. See allensdk.brain_observatory.sync_dataset for more details of + this format. + permissive : If True, None will be returned if timestamps are not found. If + False, a KeyError will be raised + + Returns + ------- + A dictionary with the following keys. All timestamps in seconds: + ophys_frames : timestamps of each optical physiology frame + lick_times : timestamps of each detected lick + ophys_trigger : The time at which ophys acquisition was started + eye_tracking : timestamps of each eye tracking video frame + behavior_monitoring : timestamps of behavior monitoring video frame + stim_photodiode : timestamps of each photodiode transition + stimulus_times_no_delay : raw stimulus frame timestamps + Some values may be None. This indicates that the corresponding timestamps + were not located in this sync file. + + """ + + sync_dataset = SyncDataset(sync_path) + return { + 'ophys_frames': get_ophys_frames(sync_dataset, permissive), + 'lick_times': get_lick_times(sync_dataset, True), + 'ophys_trigger': get_trigger(sync_dataset, permissive), + 'eye_tracking': get_eye_tracking(sync_dataset, permissive), + 'behavior_monitoring': get_behavior_monitoring(sync_dataset, permissive), + 'stim_photodiode': get_stim_photodiode(sync_dataset, permissive), + 'stimulus_times_no_delay': get_raw_stimulus_frames(sync_dataset, permissive) + } +{'ni_daq': {'device': 'Dev1', 'counter_output_freq': 100000.0, + 'sample_rate': 100000.0, 'counter_bits': 32, 'event_bits': 32}, + 'start_time': '2021-09-29 10:52:09.689200', 'stop_time': '2021-09-29 12:07:58.586810', + 'line_labels': ['vsync_2p', '', 'vsync_stim', '', 'stim_photodiode', 'stim_running', '', + '', 'beh_frame_received', 'eye_frame_received', 'face_frame_received', '', '', '', '', '', + '', 'stim_running_opto', 'stim_trial_opto', '', '', 'beh_cam_frame_readout', + 'face_cam_frame_readout', '', '', 'eye_cam_frame_readout', '', 'beh_cam_exposing', + 'face_cam_exposing', 'eye_cam_exposing', '', 'lick_sensor'], 'timeouts': [], + 'version': '2.2.1+g1bc7438.b42257', 'sampling_type': 'frequency', 'file_version': '1.0.0', + 'line_label_revision': 3, 'total_samples': 454880000} +{'total_samples': 483310000, 'sampling_type': 'frequency', + 'timeouts': [], 'start_time': '2018-11-08 11:21:58.256000', + 'ni_daq': {'device': 'Dev1', 'event_bits': 32, 'counter_bits': 32, + 'sample_rate': 100000.0, 'counter_output_freq': 100000.0}, + 'version': {'sync': 1.06, 'dataset': 1.04}, 'stop_time': '2018-11-08 12:42:31.568000', + 'line_labels': ['2p_vsync', '', 'stim_vsync', '', 'stim_photodiode', 'acq_trigger', '', '', + 'cam1_exposure', 'cam2_exposure', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + '', '', '', '', '', '', '', 'lick_sensor']} \ No newline at end of file diff --git a/brain_observatory/behavior/sync/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/sync/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3aebc4bffb9df66bb01f83865f9787029d6030b GIT binary patch literal 8452 zcmeHNOKcm*8Q$ev)Wfpmx1D$#C$Skz6iHjQEGLc~J8tuUlSWQa5CVwh&XC-Axx1cO zN}-`%n%;YBFFqtlFD+1@rvkn9&|}eCfxYGw^b!<EQS{XBpXFm|$*&+tfFh(gyF0V< z&&)sH{~WzBJ6kmH`PbLKv2L9<j4$Y6_&I}{Yxt>L$}qT5H@L}DuGvl1QzqS~-E=oo z&vdi(Y&TcWb@TOnw@@$Wwv0Q~E!K<O>H4&O&bl+*+4`Km&$;{R^XQ**_jecSi>SLP z=EMOp|ItBSc#!5(y!gv({Sbe1qIR0kp!P7orE7Ea_EAH>Kg;LPa)keA(2^HNj~auv zeS98m$M}zT_1e!D&~lu=wX0>3A3)0q{`RhxgZvO$p5yO`=P}<5%7V!2dFNW`qed%* zQ4eDUNBB{^cak6D$MHRZ?{g2b{CR$oGk%J{fZu8UBFa<zCH^u$qwna6zGrz!Uti(p z^mPg4GB5KLTq|wXHh7iS_<4STukwozis0TQUPJ8~Mx&8v#LF0MonPUvK1lJ`_*L|L z9lz838p>1rI)6i7ha*1ziZS_(2ehlX4Wsn#{aW#c6jmrW^F6lF^SIS#Z};3jtFE$I zrMgxuUbA{($CvA@Ye~nm+QlykQ6)3V+8xXBO4%rL)3L)SeckIvh4+Hc@jc6pGVeMn zjItkkcr2x&xt8OGLN>V5c0x4ovn|)|xfr>@g=_UeFMrbtEhWO+w@T?K&*O)v7zo*Q zlybI2l#?RtNzVp=^@pwn{BGc<YAE^(JI1FP*gV}%@yuuG4I^WO=G~%PG7b9fnCk2= z44&OEex}P(&YA%k_JIg|8M3e=n6$Q8=yZh&t!|*0-(teDJ4~Uj=k^q9NvkW$>`uo~ z%=V=eD)2q7Sm?7N!-r^4e`bYjyW^lM)dZ?<cl@BwwjGcA+h;(>bpqBEU@m9z!USJp z&0fenKa5Fv!WK$_@7NHK-<$H}#Mri_7<W_vrV3sz>M6Z%(VW45r5~3^AN@FBHCty~ zC|f#Bp_up>e8(a@@WkmlUR%F8-V40^R*T({J+Z`Y`<}qET$eS$J-tQ1lhaCa(UL+h ztK|b@W$LR562ER)t^yT{y(9W>O6kinEz41Y$4mG?)18>VreH}4$YPTcTXweP`c{ZZ zv%q(}@CsAHrY*XH*#UBZ5^*!JL~OMTO9N)r^DWDD(K{*<Ya3gt@7YmNUm8>s<p=a` z1K3k-5jF&G3l$ZH3n-=JG|(t#Q2fr2i@5x^e`9^~LxmmKv^o|qH?3{U>u+B7ESi~h zep7f`YSRydr)-pd(CMp9*J*AlClt$pW#6?h#3m+&H~8JnriAP@{3a-FS)nicn@!QN zwj5t>(sVZ)4aalBMxz|`qr)^spjuC!Al%RpR{Jn7MRPP3Q|5v>XJ*WlDG%a#ZwXsR zOaEAC>=>VzkR;<%lT65jq@^Hf7e<m+c}UV$9+I@gmJOxMhyH+SV6=Y6cl~ysZ8=={ zvDAHgXx7;IPB29f{~qP$wjYXw)aZ5h6y(%VBp`%b)`HA!*bao<X@UDoY#;#R*4xfq z*azLY6NbV1$_ilHa(lwFMHxykC~IUo9^@nJg`(`s_R2sDt-N(-<vrTZb9bOn&TRmm znvhnYt)6F-#bB6|N={0}dkvkhCmI!M!9WrVu_V?4IS)YIhOx*7uuP%ck4L$HA}N1b z`r_gMnxc6U1}$C#DR>37Y7T{QIAs>ba&Qba6LOG4g|;+AXVT8>n4e`}PP5jZ%t>3a z2f{h@uuTTnb?m#}9-zNxn0*JLG`1LkE7=@vM(Ab<rbV+eX#}<fOpZ1;%<*74VXa9s zj;RdH-azZiL)g`*NSo5oyB1CBdj)+9BTrB(nHpk`L)RRkYfR&9^imlV#$v{l&*A#a zh?;-0&Kx01uTS0Uk+BV><-vB4Xq|2PVJBX9(}g8r%U8)U3E`o5d~k;<-BubgYiu5W za3Y?;i5TN+Pm~57KlHid^Vmlm_?XX#)hG>Z8|~BH$(UfhIKF>cye<-6AEIN8Kzjh7 zWsd|c3Cvgx@=QC;vjat#vwk1LmfUs4&cY?NSan&rLVJ|jXDjXD&hBCTwW+Y|dp(!| zjb`$1wZHa%<lR0>dnU}sH}q+r0LR1tkHX-jn%v8s(8fJ>(2@$+w!AnXfPcVY@0tRB z26RqhFZDh`1BroeK}Kw>ci=2DQe}t<wKLxfG-M>4dCAFnfy)3V(W6*Qz@_2-IC3IN z<KT?keLb$EK$m=xc)BX7{Od)y7@>69Z6Tv+ygquE(Gntio`+GNR<x!`v<Bq*Bau1^ zkvjd&MC$KP_ARtuuY(~(oT9I-fPI%(rJd*>yp5+12A?1}6U==IDbi|;KshN+vDYzc zTisd%!1q;8if9JJfgD(B>|8WYPk142e+B?*Pd7>G*CP~?H$wTqy}gmgD)uj)5rxCB zH0Ed5M^x&=TmJ!(#Dix_PdovUBSt59{CHrFFsc2<M**`s2Ik^$jK+A3Xn)JHzZpPv zUSbcDe;}Mvv}M2nnK9)#+#$-FqG>h)E9~gRikwCD2*7DPOyQ>kv|G4|(-c2Xh2~Cb z$NVG}rgl=CuIa&ZW^m08uDQWAA76RuK^`Gp+WHCncXq?~wuFZW*+xt;3|T2`79W$K zYV)MTmXJtYjF=ANh1?XG8ovwwN3&bA8o5yMR8IA1#Ynfo#<31>tupG(Iuzaby><ur zIiJj|#eV9j9)^EokOzvR9lsX_$S97sS`W=O1Ud{-N#$Lsq_Q4%fCrr%=#t?^m|;1t zPKb`k>97iX=vrY}SAIX44pOXo_(wTX*O3y{c?L^T1{UEE<x*R|>-xyYw%J|LS7mk` zDa_ICDT;&!iN5vGf|Hp8Y)azo$7HaySssxXhlhI;7=?56;;2_V@W7uKz=1{|XPINa zCh1-!T;&m+q(Rtwe7r%?W5RD3B;Sb3^w~pXcTpO?!^WCoB9RwUVmhnd7{@KU=;+jY zqJ13Jj#fm@na*nJ&1iUje4+qSl*u2q?($D{{|z4;+_I3!QaIn}lOV;J1)ZEirXJ}q z<j;T>B=ZR}W1o^>lh}SuPW#Z5y?1@;ha`A1^N<kxJEeSmCW$3^96GB$JF(01CDh3h z6(_0n@Ng}0f?~ANQX!h&fNs1QADKwXT<K(k_B6Gj*E&?kayq|TO3NjBiITtdnWVTs zoGzQy0U{}0(g%OV`-)N_#`A?#0ok(QSC)xV=BC)HwyD|p=s(xKWVqsZD96Q?V~c3f zM(&@^fMT75^qaUBO)DI-xB}_v5RT9AjiwW-s0e-Pg$=sDf2>xiRhKK5mur_<wX(ii zTd!O$UtGIft5hc2&~Ryeb*;R*c5$s*kw-9v$dHuj);yFi;I6&^bjI1g27(EJ^8j97 zAi>arI<8yPrtP81{mEbenZ(eq$B{T>({kgAgERp7Y{R}5$D-?pMy7JI{veIL`}O%D z73~=UZ<2DA@?|PcptygqR<4z+=i1e#ed)sawQ}=9t+slpK1H0R)NKELwpy-~D_@dz zbc}zVI9@77InTjf-lM|}9C~Od!L)`xVjrjz%6fUC;aW}M;zWb0Fmn~<VcRIyie~kO zVKR-dABg%4fx0nhtS^o`gNs`T*{Mh9<HWBKZ?tm$_~*Z!pgpUuEmyInYphybuT^Q! zYO5D3l}afqE40E3RGg=RPWEIKMf=}pH-Gh)ufKY|{oCNR;y*tB>UA8zWC*_cyk(MV zZT&)R{d~2&dT|X@<zXU1X<m7XinCO_h@w=GSLyyWDy~qmM#Uv6UZvtP6?F7bGH>nu z$D(|r!F{{Yh^CNLlcDdsN+JPbL^&{tHjXwxQX)`hsUYV@=26sFA7h4xI#k=^av*&= z3~cD-(y6B;f2V%tF$5+AoBlIEE~ALDUayN|p_CUu{A?%amjMOraW=lBRiL6w6N`xQ zIGQ3KMk|f6UWu~$fGyT1r-?2F6I#baX%$MX4HBAUky>^3z3^(+=RH?kB{rz{QILms z!kkadK$py9bLRXp{7&Y~1BY_vp~JYIi0=;^$(b*_lrf7qrJ6&Qenx+D`Z;6f(7R~P Ho6P(lGQziR literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/sync/__pycache__/process_sync.cpython-37.pyc b/brain_observatory/behavior/sync/__pycache__/process_sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e462a68c92c919c3535749ffde4b9c85f7b60ca0 GIT binary patch literal 2609 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 I)vm7mA6?J}iU0rr literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/sync/process_sync.py b/brain_observatory/behavior/sync/process_sync.py new file mode 100644 index 0000000000..d054f33b2b --- /dev/null +++ b/brain_observatory/behavior/sync/process_sync.py @@ -0,0 +1,127 @@ + + +import numpy as np + + +import logging +logger = logging.getLogger(__name__) + + +def filter_digital(rising, falling, threshold=0.0001): + """ + Removes short transients from digital signal. + + Rising and falling should be same length and units + in seconds. + + Kwargs: + threshold (float): transient width + """ + # forwards (removes low-to-high transients) + dif_f = falling - rising + falling_f = falling[np.abs(dif_f) > threshold] + rising_f = rising[np.abs(dif_f) > threshold] + # backwards (removes high-to-low transients ) + dif_b = rising_f[1:] - falling_f[:-1] + dif_br = np.append([threshold * 2], dif_b) + dif_bf = np.append(dif_b, [threshold * 2]) + rising_f = rising_f[np.abs(dif_br) > threshold] + falling_f = falling_f[np.abs(dif_bf) > threshold] + + return rising_f, falling_f + + +def calculate_delay(sync_data, stim_vsync_fall, sample_frequency): + # from http://stash.corp.alleninstitute.org/projects/INF/repos/lims2_modules/browse/CAM/ophys_time_sync/ophys_time_sync.py + ASSUMED_DELAY = 0.0351 + DELAY_THRESHOLD = 0.001 + FIRST_ELEMENT_INDEX = 0 + ROUND_PRECISION = 4 + ONE = 1 + + logger.info('calculating monitor delay') + + # try: + # photodiode transitions + photodiode_rise = sync_data.get_rising_edges('stim_photodiode') / sample_frequency + + # Find start and stop of stimulus + # test and correct for photodiode transition errors + photodiode_rise_diff = np.ediff1d(photodiode_rise) + min_short_photodiode_rise = 0.1 + max_short_photodiode_rise = 0.3 + min_medium_photodiode_rise = 0.5 + max_medium_photodiode_rise = 1.5 + + # find the short and medium length photodiode rises + short_rise_indexes = np.where(np.logical_and(photodiode_rise_diff > min_short_photodiode_rise, + photodiode_rise_diff < max_short_photodiode_rise))[ + FIRST_ELEMENT_INDEX] + medium_rise_indexes = np.where(np.logical_and(photodiode_rise_diff > min_medium_photodiode_rise, + photodiode_rise_diff < max_medium_photodiode_rise))[ + FIRST_ELEMENT_INDEX] + + short_set = set(short_rise_indexes) + + # iterate through the medium photodiode rise indexes to find the start and stop indexes + # lookng for three rise pattern + next_frame = ONE + start_pattern_index = 2 + end_pattern_index = 3 + ptd_start = None + ptd_end = None + + for medium_rise_index in medium_rise_indexes: + if set(range(medium_rise_index - start_pattern_index, medium_rise_index)) <= short_set: + ptd_start = medium_rise_index + next_frame + elif set(range(medium_rise_index + next_frame, medium_rise_index + end_pattern_index)) <= short_set: + ptd_end = medium_rise_index + + # if the photodiode signal exists + if ptd_start is not None and ptd_end is not None: + # check to make sure there are no there are no photodiode errors + # sometimes two consecutive photodiode events take place close to each other + # correct this case if it happens + photodiode_rise_error_threshold = 1.8 + last_frame_index = -1 + + # iterate until all of the errors have been corrected + while any(photodiode_rise_diff[ptd_start:ptd_end] < photodiode_rise_error_threshold): + error_frames = np.where(photodiode_rise_diff[ptd_start:ptd_end] < photodiode_rise_error_threshold)[ + FIRST_ELEMENT_INDEX] + ptd_start + # remove the bad photodiode event + photodiode_rise = np.delete(photodiode_rise, error_frames[last_frame_index]) + ptd_end -= 1 + photodiode_rise_diff = np.ediff1d(photodiode_rise) + + # Find the delay + # calculate monitor delay + first_pulse = ptd_start + number_of_photodiode_rises = ptd_end - ptd_start + half_vsync_fall_events_per_photodiode_rise = 60 + vsync_fall_events_per_photodiode_rise = half_vsync_fall_events_per_photodiode_rise * 2 + + delay_rise = np.empty(number_of_photodiode_rises) + for photodiode_rise_index in range(number_of_photodiode_rises): + delay_rise[photodiode_rise_index] = photodiode_rise[photodiode_rise_index + first_pulse] - \ + stim_vsync_fall[(photodiode_rise_index * vsync_fall_events_per_photodiode_rise) + half_vsync_fall_events_per_photodiode_rise] + + # get a single delay value by finding the mean of all of the delays - skip the last element in the array (the end of the experimenet) + delay = np.mean(delay_rise[:last_frame_index]) + delay_std = np.std(delay_rise[:last_frame_index]) + + if (delay_std > DELAY_THRESHOLD or np.isnan(delay)): + + logger.error("Sync photodiode error needs to be fixed. Using assumed monitor delay: {}".format(round(delay, ROUND_PRECISION))) + raise + + # assume delay + else: + raise + # delay = ASSUMED_DELAY + # except Exception as e: + # logger.info(e) + # delay = ASSUMED_DELAY + # logger.error("Process without photodiode signal. Assumed delay: {}".format(round(delay, ROUND_PRECISION))) + + return delay diff --git a/brain_observatory/behavior/trial_masks.py b/brain_observatory/behavior/trial_masks.py new file mode 100644 index 0000000000..363b10b436 --- /dev/null +++ b/brain_observatory/behavior/trial_masks.py @@ -0,0 +1,63 @@ +import numpy as np +import pandas as pd + +def trial_types(trials, trial_types): + """ only include trials of certain trial types + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + trial_types : list or other iterator + + + Returns + ------- + mask : pandas Series of booleans, indexed to trials DataFrame + + """ + + if trial_types is not None and len(trial_types) > 0: + return trials['trial_type'].isin(trial_types) + else: + return pd.Series(np.ones((len(trials), ), dtype=bool), + name="trial_type", index=trials.index) + + +def contingent_trials(trials): + """ GO & CATCH trials only + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + + Returns + ------- + mask : pandas Series of booleans, indexed to trials DataFrame + + """ + return trial_types(trials, ('go', 'catch')) + + +def reward_rate(trials, thresh=2.0): + """ masks trials where the reward rate (per minute) is below some threshold. + + This de facto omits trials in which the animal was not licking for extended periods + or periods when they were licking indiscriminantly. + + Parameters + ---------- + trials : pandas DataFrame + dataframe of trials + thresh : float, optional + threshold under which trials will not be included, default: 2.0 + + Returns + ------- + mask : pandas Series of booleans, indexed to trials DataFrame + + """ + + mask = trials['reward_rate'] > thresh + return mask diff --git a/brain_observatory/behavior/trials_processing.py b/brain_observatory/behavior/trials_processing.py new file mode 100644 index 0000000000..78de900423 --- /dev/null +++ b/brain_observatory/behavior/trials_processing.py @@ -0,0 +1,1348 @@ +from typing import List, Dict +import uuid +from copy import deepcopy +import collections +import dateutil + +import pandas as pd +import numpy as np + +from allensdk import one +from allensdk.brain_observatory.behavior.dprime import ( + get_rolling_dprime, get_trial_count_corrected_false_alarm_rate, + get_trial_count_corrected_hit_rate, + get_hit_rate, get_false_alarm_rate) + +# TODO: add trial column descriptions +TRIAL_COLUMN_DESCRIPTION_DICT = {} + +EDF_COLUMNS = ['index', 'lick_times', 'auto_rewarded', 'cumulative_volume', + 'cumulative_reward_number', 'reward_volume', 'reward_times', + 'reward_frames', 'rewarded', 'optogenetics', 'response_type', + 'response_time', 'change_time', 'change_frame', + 'response_latency', 'starttime', 'startframe', 'trial_length', + 'scheduled_change_time', 'endtime', 'endframe', + 'initial_image_category', 'initial_image_name', + 'change_image_name', 'change_image_category', 'change_ori', + 'change_contrast', 'initial_ori', 'initial_contrast', + 'delta_ori', 'mouse_id', 'response_window', 'task', 'stage', + 'session_duration', 'user_id', 'LDT_mode', + 'blank_screen_timeout', 'stim_duration', + 'blank_duration_range', 'prechange_minimum', + 'stimulus_distribution', 'stimulus', 'distribution_mean', + 'computer_name', 'behavior_session_uuid', 'startdatetime', + 'date', 'year', 'month', 'day', 'hour', 'dayofweek', + 'number_of_rewards', 'rig_id', 'trial_type', + 'lick_frames', 'reward_licks', 'reward_lick_count', + 'reward_lick_latency', 'reward_rate', 'response', 'color'] + +RIG_NAME = { + 'W7DTMJ19R2F': 'A1', + 'W7DTMJ35Y0T': 'A2', + 'W7DTMJ03J70R': 'Dome', + 'W7VS-SYSLOGIC2': 'A3', + 'W7VS-SYSLOGIC3': 'A4', + 'W7VS-SYSLOGIC4': 'A5', + 'W7VS-SYSLOGIC5': 'A6', + 'W7VS-SYSLOGIC7': 'B1', + 'W7VS-SYSLOGIC8': 'B2', + 'W7VS-SYSLOGIC9': 'B3', + 'W7VS-SYSLOGIC10': 'B4', + 'W7VS-SYSLOGIC11': 'B5', + 'W7VS-SYSLOGIC12': 'B6', + 'W7VS-SYSLOGIC13': 'C1', + 'W7VS-SYSLOGIC14': 'C2', + 'W7VS-SYSLOGIC15': 'C3', + 'W7VS-SYSLOGIC16': 'C4', + 'W7VS-SYSLOGIC17': 'C5', + 'W7VS-SYSLOGIC18': 'C6', + 'W7VS-SYSLOGIC19': 'D1', + 'W7VS-SYSLOGIC20': 'D2', + 'W7VS-SYSLOGIC21': 'D3', + 'W7VS-SYSLOGIC22': 'D4', + 'W7VS-SYSLOGIC23': 'D5', + 'W7VS-SYSLOGIC24': 'D6', + 'W7VS-SYSLOGIC31': 'E1', + 'W7VS-SYSLOGIC32': 'E2', + 'W7VS-SYSLOGIC33': 'E3', + 'W7VS-SYSLOGIC34': 'E4', + 'W7VS-SYSLOGIC35': 'E5', + 'W7VS-SYSLOGIC36': 'E6', + 'W7DT102905': 'F1', + 'W10DT102905': 'F1', + 'W7DT102904': 'F2', + 'W7DT102903': 'F3', + 'W7DT102914': 'F4', + 'W7DT102913': 'F5', + 'W7DT12497': 'F6', + 'W7DT102906': 'G1', + 'W7DT102907': 'G2', + 'W7DT102908': 'G3', + 'W7DT102909': 'G4', + 'W7DT102910': 'G5', + 'W7DT102911': 'G6', + 'W7VS-SYSLOGIC26': 'Widefield-329', + 'OSXLTTF6T6.local': 'DougLaptop', + 'W7DTMJ026LUL': 'DougPC', + 'W7DTMJ036PSL': 'Marina2P_Sutter', + 'W7DT2PNC1STIM': '2P6', + 'W7DTMJ234MG': 'peterl_2p', + 'W7DT2P3STiM': '2P3', + 'W7DT2P4STIM': '2P4', + 'W7DT2P5STIM': '2P5', + 'W10DTSM118296': 'NP3', + 'meso1stim': 'MS1', + 'localhost': 'localhost' +} +RIG_NAME = {k.lower(): v for k, v in RIG_NAME.items()} +COMPUTER_NAME = dict((v, k) for k, v in RIG_NAME.items()) + + +def resolve_initial_image(stimuli, start_frame): + """Attempts to resolve the initial image for a given start_frame for a trial + + Parameters + ---------- + stimuli: Mapping + foraging2 shape stimuli mapping + start_frame: int + start frame of the trial + + Returns + ------- + initial_image_category_name: str + stimulus category of initial image + initial_image_group: str + group name of the initial image + initial_image_name: str + name of the initial image + """ + max_frame = float("-inf") + initial_image_group = '' + initial_image_name = '' + initial_image_category_name = '' + + for stim_category_name, stim_dict in stimuli.items(): + for set_event in stim_dict["set_log"]: + set_frame = set_event[3] + if set_frame <= start_frame and set_frame >= max_frame: + # hack assumes initial_image_group == initial_image_name, + # only initial_image_name is present for natual_scenes + initial_image_group = initial_image_name = set_event[1] + initial_image_category_name = stim_category_name + if initial_image_category_name == 'grating': + initial_image_name = f'gratings_{initial_image_name}' + max_frame = set_frame + + return initial_image_category_name, initial_image_group, initial_image_name + + +def trial_data_from_log(trial): + ''' + Infer trial logic from trial log. Returns a dictionary. + + * reward volume: volume of water delivered on the trial, in mL + + Each of the following values is boolean: + + Trial category values are mutually exclusive + * go: trial was a go trial (trial with a stimulus change) + * catch: trial was a catch trial (trial with a sham stimulus change) + + stimulus_change/sham_change are mutually exclusive + * stimulus_change: did the stimulus change (True on 'go' trials) + * sham_change: stimulus did not change, but response was evaluated + (True on 'catch' trials) + + Each trial can be one (and only one) of the following: + * hit (stimulus changed, animal responded in response window) + * miss (stimulus changed, animal did not respond in response window) + * false_alarm (stimulus did not change, + animal responded in response window) + * correct_reject (stimulus did not change, + animal did not respond in response window) + * aborted (animal responded before change time) + * auto_rewarded (reward was automatically delivered following the change. + This will bias the animals choice and should not be + categorized as hit/miss) + ''' + trial_event_names = [val[0] for val in trial['events']] + hit = 'hit' in trial_event_names + false_alarm = 'false_alarm' in trial_event_names + miss = 'miss' in trial_event_names + sham_change = 'sham_change' in trial_event_names + stimulus_change = 'stimulus_changed' in trial_event_names + aborted = 'abort' in trial_event_names + + if aborted: + go = catch = auto_rewarded = False + else: + catch = trial["trial_params"]["catch"] is True + auto_rewarded = trial["trial_params"]["auto_reward"] + go = not catch and not auto_rewarded + + correct_reject = catch and not false_alarm + + if auto_rewarded: + hit = miss = correct_reject = false_alarm = False + + return { + "reward_volume": sum([r[0] for r in trial.get("rewards", [])]), + "hit": hit, + "false_alarm": false_alarm, + "miss": miss, + "sham_change": sham_change, + "stimulus_change": stimulus_change, + "aborted": aborted, + "go": go, + "catch": catch, + "auto_rewarded": auto_rewarded, + "correct_reject": correct_reject, + } + + +def validate_trial_condition_exclusivity(trial_index, **trial_conditions): + '''ensure that only one of N possible mutually + exclusive trial conditions is True''' + on = [] + for condition, value in trial_conditions.items(): + if value: + on.append(condition) + + if len(on) != 1: + all_conditions = list(trial_conditions.keys()) + msg = f"expected exactly 1 trial condition out of {all_conditions} " + msg += f"to be True, instead {on} were True (trial {trial_index})" + raise AssertionError(msg) + + +def get_trial_reward_time(rebased_reward_times, + start_time, + stop_time): + '''extract reward times in time range''' + reward_times = rebased_reward_times[np.where(np.logical_and( + rebased_reward_times >= start_time, + rebased_reward_times <= stop_time + ))] + return float('nan') if len(reward_times) == 0 else one(reward_times) + + +def _get_response_time(licks: List[float], aborted: bool) -> float: + """ + Return the time the first lick occurred in a non-"aborted" trial. + A response time is not returned for on an "aborted trial", since by + definition, the animal licked before the change stimulus. + + Parameters + ========== + licks: List[float] + List of timestamps that a lick occurred during this trial. + The list should contain all licks that occurred while the trial + was active (between 'trial_start' and 'trial_end' events) + aborted: bool + Whether or not the trial was "aborted". This means that the + response occurred before the stimulus change and should not be + a valid response. + Returns + ======= + float + Time of first lick if there was a valid response, otherwise + NaN. See rules above. + """ + if aborted: + return float("nan") + if len(licks): + return licks[0] + else: + return float("nan") + + +def get_trial_timing( + event_dict: dict, + licks: List[float], go: bool, catch: bool, auto_rewarded: bool, + hit: bool, false_alarm: bool, aborted: bool, + timestamps: np.ndarray, + monitor_delay: float): + """ + Extract a dictionary of trial timing data. + See trial_data_from_log for a description of the trial types. + + Parameters + ========== + event_dict: dict + Dictionary of trial events in the well-known `pkl` file + licks: List[float] + list of lick timestamps, from the `get_licks` response for + the BehaviorOphysExperiment.api. + go: bool + True if "go" trial, False otherwise. Mutually exclusive with + `catch`. + catch: bool + True if "catch" trial, False otherwise. Mutually exclusive + with `go.` + auto_rewarded: bool + True if "auto_rewarded" trial, False otherwise. + hit: bool + True if "hit" trial, False otherwise + false_alarm: bool + True if "false_alarm" trial, False otherwise + aborted: bool + True if "aborted" trial, False otherwise + timestamps: np.ndarray[1d] + Array of ground truth timestamps for the session + (sync times, if available) + monitor_delay: float + The monitor delay in seconds associated with the session + + Returns + ======= + dict + start_time: float + The time the trial started (in seconds elapsed from + recording start) + stop_time: float + The time the trial ended (in seconds elapsed from + recording start) + trial_length: float + Duration of the trial in seconds + response_time: float + The response time, for non-aborted trials. This is equal + to the first lick in the trial. For aborted trials or trials + without licks, `response_time` is NaN. + change_frame: int + The frame number that the stimulus changed + change_time: float + The time in seconds that the stimulus changed + response_latency: float or None + The time in seconds between the stimulus change and the + animal's lick response, if the trial is a "go", "catch", or + "auto_rewarded" type. If the animal did not respond, + return `float("inf")`. In all other cases, return None. + + Notes + ===== + The following parameters are mutually exclusive (exactly one can + be true): + hit, miss, false_alarm, aborted, auto_rewarded + """ + assert not (aborted and (hit or false_alarm or auto_rewarded)), ( + "'aborted' trials cannot be 'hit', 'false_alarm', or 'auto_rewarded'") + assert not (hit and false_alarm), ( + "both `hit` and `false_alarm` cannot be True, they are mutually " + "exclusive categories") + assert not (go and catch), ( + "both `go` and `catch` cannot be True, they are mutually exclusive " + "categories") + assert not (go and auto_rewarded), ( + "both `go` and `auto_rewarded` cannot be True, they are mutually " + "exclusive categories") + + start_time = event_dict["trial_start", ""]['timestamp'] + stop_time = event_dict["trial_end", ""]['timestamp'] + + response_time = _get_response_time(licks, aborted) + + if go or auto_rewarded: + change_frame = event_dict.get(('stimulus_changed', ''))['frame'] + change_time = timestamps[change_frame] + monitor_delay + elif catch: + change_frame = event_dict.get(('sham_change', ''))['frame'] + change_time = timestamps[change_frame] + monitor_delay + else: + change_time = float("nan") + change_frame = float("nan") + + if not (go or catch or auto_rewarded): + response_latency = None + elif len(licks) > 0: + response_latency = licks[0] - change_time + else: + response_latency = float("inf") + + return { + "start_time": start_time, + "stop_time": stop_time, + "trial_length": stop_time - start_time, + "response_time": response_time, + "change_frame": change_frame, + "change_time": change_time, + "response_latency": response_latency, + } + + +def get_trial_image_names(trial, stimuli) -> Dict[str, str]: + """ + Gets the name of the stimulus presented at the beginning of the trial and + what is it changed to at the end of the trial. + Parameters + ---------- + trial: A trial in a behavior ophys session + stimuli: The stimuli presentation log for the behavior session + + Returns + ------- + A dictionary indicating the starting_stimulus and what the stimulus is + changed to. + + """ + grating_oris = {'horizontal', 'vertical'} + trial_start_frame = trial["events"][0][3] + initial_image_category_name, _, initial_image_name = resolve_initial_image( + stimuli, trial_start_frame) + if len(trial["stimulus_changes"]) == 0: + change_image_name = initial_image_name + else: + ((from_set, from_name), + (to_set, to_name), + _, _) = trial["stimulus_changes"][0] + + # do this to fix names if the stimuli is a grating + if from_set in grating_oris: + from_name = f'gratings_{from_name}' + if to_set in grating_oris: + to_name = f'gratings_{to_name}' + assert from_name == initial_image_name + change_image_name = to_name + + return { + "initial_image_name": initial_image_name, + "change_image_name": change_image_name + } + + +def get_trial_bounds(trial_log: List) -> List: + """ + Adjust trial boundaries from a trial_log so that there is no dead time + between trials. + + Parameters + ---------- + trial_log: list + The trial_log read in from the well known behavior stimulus pickle file + + Returns + ------- + list + Each element in the list is a tuple of the form + (start_frame, end_frame) so that the ith element + of the list gives the start and end frames of + the ith trial. The endframe of the last trial will + be -1, indicating that it should map to the last + timestamp in the session + """ + start_frames = [] + + for trial in trial_log: + start_f = None + for event in trial['events']: + if event[0] == 'trial_start': + start_f = event[-1] + break + if start_f is None: + msg = "Could not find a 'trial_start' event " + msg += "for all trials in the trial log\n" + msg += f"{trial}" + raise ValueError(msg) + + if len(start_frames) > 0 and start_f < start_frames[-1]: + msg = "'trial_start' frames in trial log " + msg += "are not in ascending order" + msg += f"\ntrial_log: {trial_log}" + raise ValueError(msg) + + start_frames.append(start_f) + + end_frames = [idx for idx in start_frames[1:]+[-1]] + return list([(s, e) for s, e in zip(start_frames, end_frames)]) + + +def get_trials_from_data_transform(input_transform) -> pd.DataFrame: + """ + Create and return a pandas DataFrame containing data about + the trials associated with this session + + Parameters + ---------- + input_transform: + An instantiation of a class that inherits from either + BehaviorDataTransform or BehaviorOphysDataTransform. + This object will be used to get at the data needed by + this method to create the trials dataframe. + + Returns + ------- + pd.DataFrame + A dataframe containing data pertaining to the trials that + make up this session + + Notes + ----- + The input_transform object must have the following methods: + + input_transform._behavior_stimulus_file + Which returns the dict resulting from reading in this session's + stimulus_data pickle file + + input_transform.get_rewards + Which returns a dataframe containing data about rewards given + during this session, i.e. the output of + allensdk/brain_observatory/behavior/rewards_processing.get_rewards + + input_transform.get_licks + Which returns a dataframe containing the columns `time` and `frame` + denoting the time (in seconds) and frame number at which licks + occurred during this session + + input_transform.get_stimulus_timestamps + Which returns a numpy.ndarray of timestamps (in seconds) associated + with the frames presented in this session. + + input_transform.get_monitor_delay + Which returns the monitory delay (in seconds) associated with the + experimental rig + """ + + missing_data_streams = [] + for method_name in ('get_rewards', 'get_licks', + 'get_stimulus_timestamps', + 'get_monitor_delay', + '_behavior_stimulus_file'): + if not hasattr(input_transform, method_name): + missing_data_streams.append(method_name) + if len(missing_data_streams) > 0: + msg = 'Cannot run trials_processing.get_trials\n' + msg += 'The object you passed as input is missing ' + msg += 'the following required methods:\n' + for method_name in missing_data_streams: + msg += f'{method_name}\n' + raise ValueError(msg) + + rewards_df = input_transform.get_rewards() + licks_df = input_transform.get_licks() + timestamps = input_transform.get_stimulus_timestamps() + monitor_delay = input_transform.get_monitor_delay() + data = input_transform._behavior_stimulus_file() + + stimuli = data["items"]["behavior"]["stimuli"] + trial_log = data["items"]["behavior"]["trial_log"] + + trial_bounds = get_trial_bounds(trial_log) + + all_trial_data = [None] * len(trial_log) + lick_frames = licks_df.frame.values + reward_times = rewards_df['timestamps'].values + + for idx, trial in enumerate(trial_log): + # match each event in the trial log to the sync timestamps + event_dict = {(e[0], e[1]): {'timestamp': timestamps[e[3]], + 'frame': e[3]} + for e in trial['events']} + + tr_data = {"trial": trial["index"]} + + trial_start = trial_bounds[idx][0] + trial_end = trial_bounds[idx][1] + + # this block of code is trying to mimic + # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/visual_behavior/translator/foraging2/__init__.py#L377-L381 + # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/visual_behavior/translator/foraging2/extract_movies.py#L59-L94 + # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/visual_behavior/translator/core/annotate.py#L11-L36 + # + # In summary: there are cases where an "epilogue movie" is shown + # after the proper stimuli; we do not want licks that occur + # during this epilogue movie to be counted as belonging to + # the last trial + # https://github.com/AllenInstitute/visual_behavior_analysis/issues/482 + + if trial_end < 0: + bhv = data['items']['behavior']['items'] + if 'fingerprint' in bhv.keys(): + trial_end = bhv['fingerprint']['starting_frame'] + + # select licks that fall between trial_start and trial_end; + # licks on the boundary get assigned to the trial that is ending, + # rather than the trial that is starting + if trial_end > 0: + valid_idx = np.where(np.logical_and(lick_frames > trial_start, + lick_frames <= trial_end)) + else: + valid_idx = np.where(lick_frames > trial_start) + + valid_licks = lick_frames[valid_idx] + if len(valid_licks) > 0: + tr_data["lick_times"] = timestamps[valid_licks] + else: + tr_data["lick_times"] = np.array([], dtype=float) + + tr_data["reward_time"] = get_trial_reward_time( + reward_times, + event_dict[('trial_start', '')]['timestamp'], + event_dict[('trial_end', '')]['timestamp'] + ) + tr_data.update(trial_data_from_log(trial)) + tr_data.update(get_trial_timing( + event_dict, + tr_data['lick_times'], + tr_data['go'], + tr_data['catch'], + tr_data['auto_rewarded'], + tr_data['hit'], + tr_data['false_alarm'], + tr_data["aborted"], + timestamps, + monitor_delay + )) + tr_data.update(get_trial_image_names(trial, stimuli)) + + # ensure that only one trial condition is True + # (they are mutually exclusive) + condition_dict = {} + for key in ['hit', + 'miss', + 'false_alarm', + 'correct_reject', + 'auto_rewarded', + 'aborted']: + condition_dict[key] = tr_data[key] + validate_trial_condition_exclusivity(idx, **condition_dict) + + all_trial_data[idx] = tr_data + + trials = pd.DataFrame(all_trial_data).set_index('trial') + trials.index = trials.index.rename('trials_id') + del trials["sham_change"] + + return trials + + +def local_time(iso_timestamp, timezone=None): + datetime = pd.to_datetime(iso_timestamp) + if not datetime.tzinfo: + tzinfo = dateutil.tz.gettz('America/Los_Angeles') + datetime = datetime.replace(tzinfo=tzinfo) + return datetime.isoformat() + + +def get_time(exp_data): + vsyncs = exp_data["items"]["behavior"]["intervalsms"] + return np.hstack((0, vsyncs)).cumsum() / 1000.0 + + +def data_to_licks(data, time): + lick_frames = data['items']['behavior']['lick_sensors'][0]['lick_events'] + lick_times = time[lick_frames] + return pd.DataFrame(data={"timestamps": lick_times, + "frame": lick_frames}) + + +def get_mouse_id(exp_data): + return exp_data["items"]["behavior"]['config']['behavior']['mouse_id'] + + +def get_params(exp_data): + + params = deepcopy(exp_data["items"]["behavior"].get("params", {})) + params.update(exp_data["items"]["behavior"].get("cl_params", {})) + + if "response_window" in params: + # tuple to list + params["response_window"] = list(params["response_window"]) + + return params + + +def get_even_sampling(data): + """Get status of even_sampling + + Parameters + ---------- + data: Mapping + foraging2 experiment output data + + Returns + ------- + bool: + True if even_sampling is enabled + """ + + stimuli = data['items']['behavior']['stimuli'] + for stimuli_group_name, stim in stimuli.items(): + if (stim['obj_type'].lower() == 'docimagestimulus' + and stim['sampling'] in ['even', 'file']): + + return True + + return False + + +def data_to_metadata(data, time): + + config = data['items']['behavior']['config'] + doc = config['DoC'] + stimuli = data['items']['behavior']['stimuli'] + + metadata = { + "startdatetime": local_time(data["start_time"], + timezone='America/Los_Angeles'), + "rig_id": RIG_NAME.get(data['platform_info']['computer_name'].lower(), + 'unknown'), + "computer_name": data['platform_info']['computer_name'], + "reward_vol": config["reward"]["reward_volume"], + "auto_reward_vol": doc["auto_reward_volume"], + "params": get_params(data), + "mouseid": config['behavior']['mouse_id'], + "response_window": list(data["items"]["behavior"].get("config", {}).get("DoC", {}).get("response_window")), # noqa: E501 + "task": config["behavior"]['task_id'], + "stage": data["items"]["behavior"]["params"]["stage"], + "stoptime": time[-1] - time[0], + "userid": data["items"]["behavior"]['cl_params']['user_id'], + "lick_detect_training_mode": "single", + "blankscreen_on_timeout": False, + "stim_duration": doc['stimulus_window'] * 1000, + "blank_duration_range": list(doc['blank_duration_range']), + "delta_minimum": doc['pre_change_time'], + "stimulus_distribution": doc["change_time_dist"], + "delta_mean": doc["change_time_scale"], + "trial_duration": None, + "n_stimulus_frames": sum([sum(s.get("draw_log", [])) + for s in stimuli.values()]), + "stimulus": list(stimuli.keys())[0], + "warm_up_trials": doc["warm_up_trials"], + "stimulus_window": doc["stimulus_window"], + "volume_limit": config["behavior"]["volume_limit"], + "failure_repeats": doc["failure_repeats"], + "catch_frequency": doc["catch_freq"], + "auto_reward_delay": doc.get("auto_reward_delay", 0.0), + "free_reward_trials": doc["free_reward_trials"], + "min_no_lick_time": doc["min_no_lick_time"], + "max_session_duration": doc["max_task_duration_min"], + "abort_on_early_response": doc["abort_on_early_response"], + "initial_blank_duration": doc["initial_blank"], + "even_sampling_enabled": get_even_sampling(data), + "behavior_session_uuid": uuid.UUID(data["session_uuid"]), + "periodic_flash": doc['periodic_flash'], + "platform_info": data['platform_info'] + } + + return metadata + + +def get_response_latency(change_event, trial): + + for response_event in trial['events']: + if response_event[0] in ['hit', 'false_alarm']: + return response_event[2] - change_event[2] + return float('inf') + + +def get_change_time_frame_response_latency(trial): + + for change_event in trial['events']: + if change_event[0] in ['stimulus_changed', 'sham_change']: + return (change_event[2], + change_event[3], + get_response_latency(change_event, trial)) + return None, None, None + + +def get_stimulus_attr_changes(stim_dict, + change_frame, + first_frame, + last_frame): + """ + Notes + ----- + - assumes only two stimuli are ever shown + - converts attr_names to lowercase + - gets the net attr changes from the start of a trial to the end of a trial + """ + initial_attr = {} + change_attr = {} + + for attr_name, set_value, set_time, set_frame in stim_dict["set_log"]: + if set_frame <= first_frame: + initial_attr[attr_name.lower()] = set_value + elif set_frame <= last_frame: + change_attr[attr_name.lower()] = set_value + else: + pass + + return initial_attr, change_attr + + +def get_image_info_from_trial(trial_log, ti): + + if ti == -1: + raise RuntimeError('Should not have been possible') + + if len(trial_log[ti]["stimulus_changes"]) == 1: + + ((from_group, from_name, ), + (to_group, to_name), + _, _) = trial_log[ti]["stimulus_changes"][0] + + return from_group, from_name, to_group, to_name + else: + + (_, _, + prev_group, + prev_name) = get_image_info_from_trial(trial_log, ti - 1) + + return prev_group, prev_name, prev_group, prev_name + + +def get_ori_info_from_trial(trial_log, ti, ): + if ti == -1: + raise IndexError('No change on first trial.') + + if len(trial_log[ti]["stimulus_changes"]) == 1: + + ((initial_group, initial_orientation), + (change_group, change_orientation, ), + _, _) = trial_log[ti]["stimulus_changes"][0] + + return change_orientation, change_orientation, None + else: + return get_ori_info_from_trial(trial_log, ti - 1) + + +def get_trials_v0(data, time): + stimuli = data["items"]["behavior"]["stimuli"] + if len(list(stimuli.keys())) != 1: + raise ValueError('Only one stimuli supported.') + + stim_name, stim = next(iter(stimuli.items())) + if stim_name not in ['images', 'grating', ]: + raise ValueError('Unsupported stimuli name: {}.'.format(stim_name)) + + doc = data["items"]["behavior"]["config"]["DoC"] + + implied_type = stim["obj_type"] + trial_log = data["items"]["behavior"]["trial_log"] + pre_change_time = doc['pre_change_time'] + initial_blank_duration = doc["initial_blank"] + + # we need this for the situations where a + # change doesn't occur in the first trial + initial_stim = stim['set_log'][0] + + trials = collections.defaultdict(list) + for ti, trial in enumerate(trial_log): + + trials['index'].append(trial["index"]) + trials['lick_times'].append([lick[0] for lick in trial["licks"]]) + trials['auto_rewarded'].append(trial["trial_params"]["auto_reward"] + if not trial['trial_params']['catch'] + else None) + + trials['cumulative_volume'].append(trial["cumulative_volume"]) + trials['cumulative_reward_number'].append(trial["cumulative_rewards"]) + + trials['reward_volume'].append(sum([r[0] + for r in trial.get("rewards", [])])) + + trials['reward_times'].append([reward[1] + for reward in trial["rewards"]]) + + trials['reward_frames'].append([reward[2] + for reward in trial["rewards"]]) + + trials['rewarded'].append(trial["trial_params"]["catch"] is False) + trials['optogenetics'].append(trial["trial_params"].get("optogenetics", False)) # noqa: E501 + trials['response_type'].append([]) + trials['response_time'].append([]) + trials['change_time'].append(get_change_time_frame_response_latency(trial)[0]) # noqa: E501 + trials['change_frame'].append(get_change_time_frame_response_latency(trial)[1]) # noqa: E501 + trials['response_latency'].append(get_change_time_frame_response_latency(trial)[2]) # noqa: E501 + trials['starttime'].append(trial["events"][0][2]) + trials['startframe'].append(trial["events"][0][3]) + trials['trial_length'].append(trial["events"][-1][2] - + trial["events"][0][2]) + trials['scheduled_change_time'].append(pre_change_time + + initial_blank_duration + + trial["trial_params"]["change_time"]) # noqa: E501 + trials['endtime'].append(trial["events"][-1][2]) + trials['endframe'].append(trial["events"][-1][3]) + + # Stimulus: + if implied_type == 'DoCImageStimulus': + (from_group, + from_name, + to_group, + to_name) = get_image_info_from_trial(trial_log, ti) + trials['initial_image_name'].append(from_name) + trials['initial_image_category'].append(from_group) + trials['change_image_name'].append(to_name) + trials['change_image_category'].append(to_group) + trials['change_ori'].append(None) + trials['change_contrast'].append(None) + trials['initial_ori'].append(None) + trials['initial_contrast'].append(None) + trials['delta_ori'].append(None) + elif implied_type == 'DoCGratingStimulus': + try: + (change_orientation, + initial_orientation, + delta_orientation) = get_ori_info_from_trial(trial_log, ti) + except IndexError: + # shape: group_name, orientation, + # stimulus time relative to start, frame + orientation = initial_stim[1] + change_orientation = orientation + initial_orientation = orientation + delta_orientation = None + trials['initial_image_category'].append('') + trials['initial_image_name'].append('') + trials['change_image_name'].append('') + trials['change_image_category'].append('') + trials['change_ori'].append(change_orientation) + trials['change_contrast'].append(None) + trials['initial_ori'].append(initial_orientation) + trials['initial_contrast'].append(None) + trials['delta_ori'].append(delta_orientation) + else: + msg = 'Unsupported stimulus type: {}'.format(implied_type) + raise NotImplementedError(msg) + + return pd.DataFrame(trials) + + +def categorize_one_trial(tr): + if pd.isnull(tr['change_time']): + if (len(tr['lick_times']) > 0): + trial_type = 'aborted' + else: + trial_type = 'other' + else: + if (tr['auto_rewarded'] is True): + return 'autorewarded' + elif (tr['rewarded'] is True): + return 'go' + elif (tr['rewarded'] == 0): + return 'catch' + else: + return 'other' + return trial_type + + +def find_licks(reward_times, licks, window=3.5): + if len(reward_times) == 0: + return [] + else: + reward_time = one(reward_times) + reward_lick_mask = ((licks['timestamps'] > reward_time) & + (licks['timestamps'] < (reward_time + window))) + + tr_licks = licks[reward_lick_mask].copy() + tr_licks['timestamps'] -= reward_time + return tr_licks['timestamps'].values + + +def calculate_reward_rate(response_latency=None, + starttime=None, + window=0.75, + trial_window=25, + initial_trials=10): + + assert len(response_latency) == len(starttime) + + df = pd.DataFrame({'response_latency': response_latency, + 'starttime': starttime}) + + # adds a column called reward_rate to the input dataframe + # the reward_rate column contains a rolling average of rewards/min + # window sets the window in which a response is considered correct, + # so a window of 1.0 means licks before 1.0 second are considered correct + # + # Reorganized into this unit-testable form by Nick Cain April 25 2019 + + reward_rate = np.zeros(len(df)) + # make the initial reward rate infinite, + # so that you include the first trials automatically. + reward_rate[:initial_trials] = np.inf + + for trial_number in range(initial_trials, len(df)): + + min_index = np.max((0, trial_number - trial_window)) + max_index = np.min((trial_number + trial_window, len(df))) + df_roll = df.iloc[min_index:max_index] + + # get a rolling number of correct trials + correct = len(df_roll[df_roll.response_latency < window]) + + # get the time elapsed over the trials + time_elapsed = df_roll.starttime.iloc[-1] - df_roll.starttime.iloc[0] + + # calculate the reward rate, rewards/min + reward_rate_on_this_lap = correct / time_elapsed * 60 + + reward_rate[trial_number] = reward_rate_on_this_lap + return reward_rate + + +def get_response_type(trials): + + response_type = [] + for idx in trials.index: + if trials.loc[idx].trial_type.lower() == 'aborted': + response_type.append('EARLY_RESPONSE') + elif (trials.loc[idx].rewarded) & (trials.loc[idx].response == 1): + response_type.append('HIT') + elif (trials.loc[idx].rewarded) & (trials.loc[idx].response != 1): + response_type.append('MISS') + elif (not trials.loc[idx].rewarded) & (trials.loc[idx].response == 1): + response_type.append('FA') + elif (not trials.loc[idx].rewarded) & (trials.loc[idx].response != 1): + response_type.append('CR') + else: + response_type.append('other') + + return response_type + + +def colormap(trial_type, response_type): + + if trial_type == 'aborted': + return 'lightgray' + + if trial_type == 'autorewarded': + return 'darkblue' + + if trial_type == 'go': + if response_type == 'HIT': + return '#55a868' + return '#ccb974' + + if trial_type == 'catch': + if response_type == 'FA': + return '#c44e52' + return '#4c72b0' + + +def create_extended_trials(trials=None, metadata=None, time=None, licks=None): + + startdatetime = dateutil.parser.parse(metadata['startdatetime']) + edf = trials[~pd.isnull(trials['reward_times'])].reset_index(drop=True).copy() # noqa: E501 + + # Buggy computation of trial_length (for backwards compatibility) + edf.drop(['trial_length'], axis=1, inplace=True) + + edf['endtime_buggy'] = [edf['starttime'].iloc[ti + 1] + if ti < len(edf) - 1 + else time[-1] + for ti in range(len(edf))] + + edf['trial_length'] = edf['endtime_buggy'] - edf['starttime'] + edf.drop(['endtime_buggy'], axis=1, inplace=True) + + # Make trials contiguous, and rebase time: + edf.drop(['endframe', + 'starttime', + 'endtime', + 'change_time', + 'lick_times', + 'reward_times'], axis=1, inplace=True) + + edf['endframe'] = [edf['startframe'].iloc[ti + 1] + if ti < len(edf) - 1 + else len(time) - 1 + for ti in range(len(edf))] + + _lks = licks['frame'] + edf['lick_frames'] = [_lks[np.logical_and(_lks > int(row['startframe']), + _lks <= int(row['endframe']))].values + for _, row in edf.iterrows()] + + # this variable was created to bring code into + # line with pep8; deleting to protect against + # changing logic + del _lks + + edf['starttime'] = [time[edf['startframe'].iloc[ti]] + for ti in range(len(edf))] + + edf['endtime'] = [time[edf['endframe'].iloc[ti]] + for ti in range(len(edf))] + + # Proper computation of trial_length: + # edf['trial_length'] = edf['endtime'] - edf['starttime'] + + edf['change_time'] = [time[int(cf)] + if not np.isnan(cf) + else float('nan') + for cf in edf['change_frame']] + + edf['lick_times'] = [[time[fi] for fi in frame_arr] + for frame_arr in edf['lick_frames']] + + edf['trial_type'] = edf.apply(categorize_one_trial, axis=1) + + edf['reward_times'] = [[time[fi] for fi in frame_list] + for frame_list in edf['reward_frames']] + + edf['number_of_rewards'] = edf['reward_times'].map(len) + edf['reward_licks'] = edf['reward_times'].apply(find_licks, args=(licks,)) + edf['reward_lick_count'] = edf['reward_licks'].map(len) + + edf['reward_lick_latency'] = edf['reward_licks'].map(lambda ll: None + if len(ll) == 0 + else np.min(ll)) + + # Things that dont depend on time/trial: + edf['mouse_id'] = metadata['mouseid'] + edf['response_window'] = [metadata['response_window']] * len(edf) + edf['task'] = metadata['task'] + edf['stage'] = metadata['stage'] + edf['session_duration'] = metadata['stoptime'] + edf['user_id'] = metadata['userid'] + edf['LDT_mode'] = metadata['lick_detect_training_mode'] + edf['blank_screen_timeout'] = metadata['blankscreen_on_timeout'] + edf['stim_duration'] = metadata['stim_duration'] + edf['blank_duration_range'] = [metadata['blank_duration_range']] * len(edf) + edf['prechange_minimum'] = metadata['delta_minimum'] + edf['stimulus_distribution'] = metadata['stimulus_distribution'] + edf['stimulus'] = metadata['stimulus'] + edf['distribution_mean'] = metadata['delta_mean'] + edf['computer_name'] = metadata['computer_name'] + edf['behavior_session_uuid'] = metadata['behavior_session_uuid'] + edf['startdatetime'] = startdatetime + edf['date'] = startdatetime.date() + edf['year'] = startdatetime.year + edf['month'] = startdatetime.month + edf['day'] = startdatetime.day + edf['hour'] = startdatetime.hour + edf['dayofweek'] = startdatetime.weekday() + edf['rig_id'] = metadata['rig_id'] + edf['cumulative_volume'] = edf['reward_volume'].cumsum() + + # Compute response latency (kinda tricky): + edf['valid_response_licks'] = [[lk for lk in tt.lick_times + if lk - tt.change_time > tt.response_window[0]] # noqa: E50 + for _, tt in edf.iterrows()] + + edf['response_latency'] = edf['valid_response_licks'].map(lambda x: float('inf') # noqa: E501 + if len(x) == 0 + else x[0]) + edf['response_latency'] -= edf['change_time'] + + edf.drop('valid_response_licks', axis=1, inplace=True) + + # Complicated: + assert len(edf.startdatetime.unique()) == 1 + np.testing.assert_array_equal(list(edf.index.values), np.arange(len(edf))) + + _latency = edf['response_latency'].values + _starttime = edf['starttime'].values + edf['reward_rate'] = calculate_reward_rate(response_latency=_latency, + starttime=_starttime) + + # this variable was created to bring code into + # line with pep8; deleting to protect against + # changing logic + del _latency + del _starttime + + # Response/trial metadata encoding: + _lt = edf['response_latency'] <= metadata['response_window'][1] + _gt = edf['response_latency'] >= metadata['response_window'][0] + edf['response'] = (~pd.isnull(edf['change_time']) & + ~pd.isnull(edf['response_latency']) & + _gt & + _lt).astype(np.float64) + + # this variable was created to bring code into + # line with pep8; deleting to protect against + # changing logic + del _lt + del _gt + + edf['response_type'] = get_response_type(edf[['trial_type', + 'response', + 'rewarded']]) + edf['color'] = [colormap(trial.trial_type, trial.response_type) + for _, trial in edf.iterrows()] + + # Reorder columns for backwards-compatibility: + return edf[EDF_COLUMNS] + + +def get_extended_trials(data, time=None): + if time is None: + time = get_time(data) + + return create_extended_trials(trials=get_trials_v0(data, time), + metadata=data_to_metadata(data, time), + time=time, + licks=data_to_licks(data, time)) + + +def calculate_response_latency_list( + trials: pd.DataFrame, response_window_start: float) -> List: + """per trial, detemines a response latency + + Parameters + ---------- + trials: pd.DataFrame + contains columns "lick_times" and "change_times" + response_window_start: float + [seconds] relative to the non-display-lag-compensated presentation + of the change-image + + Returns + ------- + response_latency_list: list + len() = trials.shape[0] + value is 'inf' if there are no valid licks in the trial + + """ + response_latency_list = [] + for _, t in trials.iterrows(): + valid_response_licks = \ + [x for x in t.lick_times + if x - t.change_time > response_window_start] + response_latency = ( + float('inf') + if len(valid_response_licks) == 0 + else valid_response_licks[0] - t.change_time) + response_latency_list.append(response_latency) + return response_latency_list + + +def calculate_reward_rate_fix_nans( + trials: pd.DataFrame, response_window_start: float) -> np.ndarray: + """per trial, detemines the reward rate, replacing infs with nans + + Parameters + ---------- + trials: pd.DataFrame + contains columns "lick_times", "change_times", and "start_time" + response_window_start: float + [seconds] relative to the non-display-lag-compensated presentation + of the change-image + + Returns + ------- + reward_rate: np.ndarray + size = trials.shape[0] + value is nan if calculate_reward_rate evaluates to 'inf' + + """ + response_latency_list = calculate_response_latency_list( + trials, + response_window_start) + reward_rate = calculate_reward_rate( + response_latency=response_latency_list, + starttime=trials.start_time.values) + reward_rate[np.isinf(reward_rate)] = float('nan') + return reward_rate + + +def construct_rolling_performance_df(trials: pd.DataFrame, + response_window_start, + session_type) -> pd.DataFrame: + """Return a DataFrame containing trial by trial behavior response + performance metrics. + + Parameters + ---------- + trials: pd.DataFrame + contains columns "lick_times", "change_times", and "start_time" + response_window_start: float + [seconds] relative to the non-display-lag-compensated presentation + of the change-image + session_type: str + used to check if this was a passive session + + Returns + ------- + pd.DataFrame + A pandas DataFrame containing: + trials_id [index]: + Index of the trial. All trials, including aborted trials, + are assigned an index starting at 0 for the first trial. + reward_rate: + Rewards earned in the previous 25 trials, normalized by + the elapsed time of the same 25 trials. Units are + rewards/minute. + hit_rate_raw: + Fraction of go trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + hit_rate: + Fraction of go trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. With trial count correction applied. + false_alarm_rate_raw: + Fraction of catch trials where the mouse licked in the + response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + false_alarm_rate: + Fraction of catch trials where the mouse licked in + the response window, calculated over the previous 100 + non-aborted trials. Without trial count correction applied. + rolling_dprime: + d prime calculated using the rolling hit_rate and + rolling false_alarm _rate. + + """ + reward_rate = calculate_reward_rate_fix_nans( + trials, + response_window_start) + + # Indices to build trial metrics dataframe: + trials_index = trials.index + not_aborted_index = \ + trials[np.logical_not(trials.aborted)].index + + # Initialize dataframe: + performance_metrics_df = pd.DataFrame(index=trials_index) + + # Reward rate: + performance_metrics_df['reward_rate'] = \ + pd.Series(reward_rate, index=trials.index) + + # Hit rate raw: + hit_rate_raw = get_hit_rate( + hit=trials.hit, + miss=trials.miss, + aborted=trials.aborted) + performance_metrics_df['hit_rate_raw'] = \ + pd.Series(hit_rate_raw, index=not_aborted_index) + + # Hit rate with trial count correction: + hit_rate = get_trial_count_corrected_hit_rate( + hit=trials.hit, + miss=trials.miss, + aborted=trials.aborted) + performance_metrics_df['hit_rate'] = \ + pd.Series(hit_rate, index=not_aborted_index) + + # False-alarm rate raw: + false_alarm_rate_raw = \ + get_false_alarm_rate( + false_alarm=trials.false_alarm, + correct_reject=trials.correct_reject, + aborted=trials.aborted) + performance_metrics_df['false_alarm_rate_raw'] = \ + pd.Series(false_alarm_rate_raw, index=not_aborted_index) + + # False-alarm rate with trial count correction: + false_alarm_rate = \ + get_trial_count_corrected_false_alarm_rate( + false_alarm=trials.false_alarm, + correct_reject=trials.correct_reject, + aborted=trials.aborted) + performance_metrics_df['false_alarm_rate'] = \ + pd.Series(false_alarm_rate, index=not_aborted_index) + + # Rolling-dprime: + if session_type.endswith('passive'): + # It does not make sense to calculate d' for a passive session + # So just set it to zeros + rolling_dprime = np.zeros(len(hit_rate)) + else: + rolling_dprime = get_rolling_dprime(hit_rate, false_alarm_rate) + performance_metrics_df['rolling_dprime'] = \ + pd.Series(rolling_dprime, index=not_aborted_index) + + return performance_metrics_df diff --git a/brain_observatory/behavior/write_behavior_nwb/__init__.py b/brain_observatory/behavior/write_behavior_nwb/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/write_behavior_nwb/__main__.py b/brain_observatory/behavior/write_behavior_nwb/__main__.py new file mode 100644 index 0000000000..9932f64eaa --- /dev/null +++ b/brain_observatory/behavior/write_behavior_nwb/__main__.py @@ -0,0 +1,87 @@ +import os +import logging +import sys +import argschema +import marshmallow +from pynwb import NWBHDF5IO + +from allensdk.brain_observatory.behavior.behavior_session import ( + BehaviorSession) +from allensdk.brain_observatory.behavior.write_behavior_nwb._schemas import ( + InputSchema, OutputSchema) +from allensdk.brain_observatory.argschema_utilities import ( + write_or_print_outputs) +from allensdk.brain_observatory.session_api_utils import sessions_are_equal + + +def write_behavior_nwb(session_data, nwb_filepath): + + nwb_filepath_inprogress = nwb_filepath+'.inprogress' + nwb_filepath_error = nwb_filepath+'.error' + + # Clean out files from previous runs: + for filename in [nwb_filepath_inprogress, + nwb_filepath_error, + nwb_filepath]: + if os.path.exists(filename): + os.remove(filename) + + try: + json_session = BehaviorSession.from_json(session_data) + + behavior_session_id = session_data['behavior_session_id'] + lims_session = BehaviorSession.from_lims(behavior_session_id) + + logging.info("Comparing a BehaviorSession created from JSON " + "with a BehaviorSession created from LIMS") + assert sessions_are_equal(json_session, lims_session, reraise=True) + + nwbfile = lims_session.to_nwb() + with NWBHDF5IO(nwb_filepath_inprogress, 'w') as nwb_file_writer: + nwb_file_writer.write(nwbfile) + + logging.info("Comparing a BehaviorSession created from JSON " + "with a BehaviorSession created from NWB") + nwb_session = BehaviorSession.from_nwb_path(nwb_filepath_inprogress) + assert sessions_are_equal(json_session, nwb_session, reraise=True) + + os.rename(nwb_filepath_inprogress, nwb_filepath) + return {'output_path': nwb_filepath} + except Exception as e: + if os.path.isfile(nwb_filepath_inprogress): + os.rename(nwb_filepath_inprogress, nwb_filepath_error) + raise e + + +def main(): + + logging.basicConfig( + format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') + + args = sys.argv[1:] + try: + parser = argschema.ArgSchemaParser( + args=args, + schema_type=InputSchema, + output_schema_type=OutputSchema, + ) + logging.info('Input successfully parsed') + except marshmallow.exceptions.ValidationError as err: + logging.error('Parsing failure') + print(err) + raise err + + try: + output = write_behavior_nwb(parser.args['session_data'], + parser.args['output_path']) + logging.info('File successfully created') + except Exception as err: + logging.error('NWB write failure') + print(err) + raise err + + write_or_print_outputs(output, parser) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/behavior/write_behavior_nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_behavior_nwb/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4947da5440feda3ff8c032a4a094662bd428b480 GIT binary patch literal 222 zcmYL@y$ZrG5XVz+5TOs^U^}>ph##xCh+80BnqWigB_y?_qmvKf<SV)Q2yRYZhT<RY zcOTsUxNVwF7zrOYi1{5cD4}9a5k>^Xj%=D7p3KMbAK&|K!B0W^z@Y?{N$3E3zCkD~ zDwuPPZQ#~v3<c4;vJZT3BoC(1GY3TlXHDL^rVUl)(t|-^C0%TxvA)lxE}=En=ba~u d7+Qgy%!M#$8X+>*zsAdpRo7at;)5Rw_5*n!La_h< literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_behavior_nwb/__pycache__/__main__.cpython-37.pyc b/brain_observatory/behavior/write_behavior_nwb/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18216fc6ad24975362b0bcbcd17cca1010b9eb57 GIT binary patch literal 2493 zcmb_dTW{P%6rLG-y<XeNCfh0{B~+`b6<w*_NL)mPDxghUQB+bO^uj2}a@LcL6JNG7 zvq^X5twh5`LaN}Ir$jvQH~0xW`VpS`7kJ{#c%8OXYI(qx=bX8mGc)I$@AH+J83)0W z{`yU@>>~7+>QoN_<s<mSkI;lD#4)0!#1!j3p+rlA8d{pv1WDprVo?jLwMJY|Y-(%W zj2nqVoy4WC?$=^3nV~aUx8m8PNt>Y8L;G7q=fXzlfShNo(A^>Ydp5t1U>2{Tj`sx4 zgH}7ZXsq77^6}N{@7}lto#qv`73@YCUt>Z<S=u3mdm|kT<yvoxB|+ic8p@*{tY6sU zkz{_x{Q-|s>1TRcz)VY&9)uro=Ck|5AnvJPsK<j(g=_^rv4j!IafnZ#2?0q!8V}Cp zBsX&0H?E?uPfkpUw($YU%|pzWBswsZhSB|{yJ+-_G!JSyI>ZxbLt_z5EEutJ3r6a) zeqe`st!(7AydKs<>#-rEbROZne&8OWi7maHg!O&$)7+$yHx6cUTlu~Vf&UzRf$kyg zLyv*q*_?o1M|*Ro-hNl!;8aaGGd?5`;6{!k2(pRf+>Y}z<_j22AYJ3r`X2Mj2aJ-b zjiGFE_YqcmhOqLXdk=kuQgRP^kSb?&>~^Dcz_UJwn2xP3<2>WVv5jf2{AsBDC>-Be z$&x_;x#+ip_P>(Z?r|1K7PdEemb5=vyS3Whi{#d;7T&z^>Drf&(K=^5hy*L}-uU+a zzYUaO;g<E|4+6Q>X%!?Bg{kzyVh<uAMPYH4WV?(TP&q|I-NWA&SxQSajuKJS<E-C@ z`xj=EZf3l$R?c1)f^i82eNBaqS~By~y$!AkvZ(1ArZd_bjOyLhPHB*^qH*m(j}4S* zVMSsyidn}iyei^hAOq?tBQ>LrN>4o7^PlF8ww{|Pb7(6wwGZ{wJ*rG{8xBT2b)Ra8 z*1=q@rp?NauMf_ts|KbgDlq#E@z=rp?;lp)U%w647VE)Q5Oz0$y&xT}UrvKwmWILG z>nz<B>)C*%q6cj@*cyrTo6*L)07PFH1ihW0&%ic@1B!5Gc>|K4`q>6}+zn*LN6S_H zEte!vbyZ}SeLqpl{qA5?v|gN_hXabYph3jOwqas|9qi#*0un|X;*b_d4<853!7bup z8@KQ*jPN(Ws;5lVW5RbtC4WLkK`aCsc?=+yWZMXVRlg%Z3utson%h7U(vtPid~8e< zXzj38!acnNaBXZm+wP9TB>)ycIX($1yb!1ae9h!!A7oCBfJz<$L`$HK&dAvuZ#TpG zB9IwKdlBuEiJ^CBOn10g5(59@Iq%M^y~}w;hWm<I6d|~)<M+;<3q(&w3G0aVh4$HV zzz#hihiNZnyDU~^HSH%b1=;K<VzvMjNg$s9?V^rRm;vt#>I%*8z8no0ZB0@5%-DEQ z{{`A&*i+kV4&!*#2A&Zt95+7$sR(B?h~goT#B1Q0!;cV+7q3IXK5sPTpz%E5y{!wQ zvg@?CDvQG12t?Fd$<ocJUl?Kp8~|tBEgI^i`k1tNnfJ>-lG+=fq{@KTRMXNf5*Xe} zpmwvp!eJGH1#R95;s`)nF+ou)aahy8FI`%^t=ufA#)76}>Vd-2x8;Qa28C5dNaL(* zmSAaNs+zwDnm7*)A||%UER?n?Z=&_%Q06vXP-U*l9nVesTp1L0g__PWuKtla9{jY@ z&Zy=rG_*Dt0l+kM(RV6zc3(hew}Ru5Qc;8^Px|41F?|uZUB66$cp7rreTl21ocTi; z#gUAd&|#(LUt(0TYcPnknb0g=W~U02s&3zZCIgD|xK4w8DapcN%sx;hE>1!N95a1A Q;*mM{Ji~s|K4s&705^Zm%m4rY literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_behavior_nwb/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/behavior/write_behavior_nwb/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10819da4ef9a1af225f8e2b35929eb5764abc3af GIT binary patch literal 3167 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 SBC2EGf_}bp)$85wb^i;^<!o>O literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_behavior_nwb/_schemas.py b/brain_observatory/behavior/write_behavior_nwb/_schemas.py new file mode 100644 index 0000000000..df45dabda0 --- /dev/null +++ b/brain_observatory/behavior/write_behavior_nwb/_schemas.py @@ -0,0 +1,81 @@ +from argschema import ArgSchema +from argschema.fields import (LogLevel, String, Int, Nested, List) +import marshmallow as mm +import pandas as pd + +from allensdk.brain_observatory.argschema_utilities import ( + check_read_access, check_write_access_overwrite, RaisingSchema) + + +class BehaviorSessionData(RaisingSchema): + behavior_session_id = Int(required=True, + description=("Unique identifier for the " + "behavior session to write into " + "NWB format")) + foraging_id = String(required=True, + description=("The foraging_id for the behavior " + "session")) + driver_line = List(String, + required=True, + description='Genetic driver line(s) of subject') + reporter_line = List(String, + required=True, + description='Genetic reporter line(s) of subject') + full_genotype = String(required=True, + description='Full genotype of subject') + rig_name = String(required=True, + description=("Name of experimental rig used for " + "the behavior session")) + date_of_acquisition = String(required=True, + description=("Date of acquisition of " + "behavior session, in string " + "format")) + external_specimen_name = Int(required=True, + description='LabTracks ID of the subject') + behavior_stimulus_file = String(required=True, + validate=check_read_access, + description=("Path of behavior_stimulus " + "camstim *.pkl file")) + date_of_birth = String(required=True, description="Subject date of birth") + sex = String(required=True, description="Subject sex") + age = String(required=True, description="Subject age") + stimulus_name = String(required=True, + description=("Name of stimulus presented during " + "behavior session")) + + @mm.pre_load + def set_stimulus_name(self, data, **kwargs): + if data.get("stimulus_name") is None: + pkl = pd.read_pickle(data["behavior_stimulus_file"]) + try: + stimulus_name = pkl["items"]["behavior"]["cl_params"]["stage"] + except KeyError: + raise mm.ValidationError( + f"Could not obtain stimulus_name/stage information from " + f"the *.pkl file ({data['behavior_stimulus_file']}) " + f"for the behavior session to save as NWB! The " + f"following series of nested keys did not work: " + f"['items']['behavior']['cl_params']['stage']" + ) + data["stimulus_name"] = stimulus_name + return data + + +class InputSchema(ArgSchema): + class Meta: + unknown = mm.RAISE + log_level = LogLevel(default='INFO', + description='Logging level of the module') + session_data = Nested(BehaviorSessionData, + required=True, + description='Data pertaining to a behavior session') + output_path = String(required=True, + validate=check_write_access_overwrite, + description='Path of output.json to be written') + + +class OutputSchema(RaisingSchema): + input_parameters = Nested(InputSchema) + output_path = String(required=True, + validate=check_write_access_overwrite, + description='Path of output.json to be written') diff --git a/brain_observatory/behavior/write_nwb/__init__.py b/brain_observatory/behavior/write_nwb/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/write_nwb/__main__.py b/brain_observatory/behavior/write_nwb/__main__.py new file mode 100644 index 0000000000..127ddcad8a --- /dev/null +++ b/brain_observatory/behavior/write_nwb/__main__.py @@ -0,0 +1,93 @@ +import os +import logging +import sys +import argschema +import marshmallow +from pynwb import NWBHDF5IO + +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( + BehaviorOphysExperiment) +from allensdk.brain_observatory.behavior.write_nwb._schemas import ( + InputSchema, OutputSchema) +from allensdk.brain_observatory.argschema_utilities import ( + write_or_print_outputs) +from allensdk.brain_observatory.session_api_utils import sessions_are_equal + + +def write_behavior_ophys_nwb(session_data: dict, + nwb_filepath: str, + skip_eye_tracking: bool): + + nwb_filepath_inprogress = nwb_filepath+'.inprogress' + nwb_filepath_error = nwb_filepath+'.error' + + # Clean out files from previous runs: + for filename in [nwb_filepath_inprogress, + nwb_filepath_error, + nwb_filepath]: + if os.path.exists(filename): + os.remove(filename) + + try: + json_session = BehaviorOphysExperiment.from_json( + session_data=session_data, skip_eye_tracking=skip_eye_tracking) + lims_session = BehaviorOphysExperiment.from_lims( + ophys_experiment_id=session_data['ophys_experiment_id'], + skip_eye_tracking=skip_eye_tracking) + + logging.info("Comparing a BehaviorOphysExperiment created from JSON " + "with a BehaviorOphysExperiment created from LIMS") + assert sessions_are_equal(json_session, lims_session, reraise=True, + ignore_keys={'metadata': {'project_code'}}) + + nwbfile = json_session.to_nwb() + with NWBHDF5IO(nwb_filepath_inprogress, 'w') as nwb_file_writer: + nwb_file_writer.write(nwbfile) + + logging.info("Comparing a BehaviorOphysExperiment created from JSON " + "with a BehaviorOphysExperiment created from NWB") + nwb_session = BehaviorOphysExperiment.from_nwb(nwbfile=nwbfile) + assert sessions_are_equal(json_session, nwb_session, reraise=True) + + os.rename(nwb_filepath_inprogress, nwb_filepath) + return {'output_path': nwb_filepath} + except Exception as e: + if os.path.isfile(nwb_filepath_inprogress): + os.rename(nwb_filepath_inprogress, nwb_filepath_error) + raise e + + +def main(): + + logging.basicConfig( + format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') + + args = sys.argv[1:] + try: + parser = argschema.ArgSchemaParser( + args=args, + schema_type=InputSchema, + output_schema_type=OutputSchema, + ) + logging.info('Input successfully parsed') + except marshmallow.exceptions.ValidationError as err: + logging.error('Parsing failure') + print(err) + raise err + + try: + skip_eye_tracking = parser.args['skip_eye_tracking'] + output = write_behavior_ophys_nwb(parser.args['session_data'], + parser.args['output_path'], + skip_eye_tracking) + logging.info('File successfully created') + except Exception as err: + logging.error('NWB write failure') + print(err) + raise err + + write_or_print_outputs(output, parser) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/behavior/write_nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..982eefcf79d854e0f67cb6d7aea0b394672d81d7 GIT binary patch literal 213 zcmYL@zY4-I5XMt*5Wxp=uo>J$#6PRJh+80BnqWigB_y>ai{P_3`AV)nf}4}qLHywR z-ErJ^+-5u;F%sTy(AQUwpE7Dz<TxN`c3_ii|6rjX|M9tQ=i(SmhyqH`xq=Qbi8Vsu zP{T|ZY@=}AU@VBvmnn*!RU+EPOg$78oD5~_nl^OBRRD|9DZ1D~<3i%fl+aoico!%l au~S@1i?)$6_vtxYoSnYZX4(JsCbKULfj;>F literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/__pycache__/__main__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..419105db80b2cc908189dc872611c71d1925d741 GIT binary patch literal 2708 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/behavior/write_nwb/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2095c3f6a76bc2a7044dd4f244af0f2a2c909f50 GIT binary patch literal 5132 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/_schemas.py b/brain_observatory/behavior/write_nwb/_schemas.py new file mode 100644 index 0000000000..c4b454cdb9 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/_schemas.py @@ -0,0 +1,144 @@ +from argschema import ArgSchema, InputFile +from argschema.fields import LogLevel, String, Int, Nested, \ + Boolean, \ + Float, List, Dict +from marshmallow import RAISE + +from allensdk.brain_observatory.argschema_utilities import check_read_access, \ + check_write_access_overwrite, RaisingSchema + + +class CellSpecimenTable(RaisingSchema): + cell_roi_id = Dict(String, Int, required=True) + cell_specimen_id = Dict(String, Int(allow_none=True), required=True) + x = Dict(String, Int, required=True) + y = Dict(String, Int, required=True) + max_correction_up = Dict(String, Float, required=True) + max_correction_right = Dict(String, Float, required=True) + max_correction_down = Dict(String, Float, required=True) + max_correction_left = Dict(String, Float, required=True) + valid_roi = Dict(String, Boolean, required=True) + height = Dict(String, Int, required=True) + width = Dict(String, Int, required=True) + mask_image_plane = Dict(String, Int, required=True) + roi_mask = Dict(String, List(List(Boolean)), required=True) + + +class SessionData(RaisingSchema): + ophys_experiment_id = Int(required=True, + description='unique identifier for this ophys ' + 'session') + ophys_session_id = Int(required=True, + description='The ophys session id that the ophys ' + 'experiment to be written to NWB is ' + 'from') + behavior_session_id = Int(required=True, + description='The behavior session id that the ' + 'ophys experiment to be written to ' + 'written to NWB is from') + foraging_id = String(required=True, + description='The foraging id associated with the ' + 'ophys session') + rig_name = String(required=True, description='name of ophys device') + movie_height = Int(required=True, + description='height of field-of-view for 2p movie') + movie_width = Int(required=True, + description='width of field-of-view for 2p movie') + container_id = Int(required=True, + description='container that this experiment is in') + sync_file = String(required=True, description='path to sync file') + max_projection_file = String(required=True, + description='path to max_projection file') + behavior_stimulus_file = String(required=True, + description='path to behavior_stimulus ' + 'file') + dff_file = String(required=True, description='path to dff file') + demix_file = String(required=True, description='path to demix file') + average_intensity_projection_image_file = String( + required=True, + description='path to ' + 'average_intensity_projection_image file') + rigid_motion_transform_file = String(required=True, + description='path to ' + 'rigid_motion_transform' + ' file') + targeted_structure = String(required=True, + description='Anatomical structure that the ' + 'experiment targeted') + targeted_depth = Int(required=True, + description='Cortical depth that the experiment ' + 'targeted') + stimulus_name = String(required=True, description='Stimulus Name') + date_of_acquisition = String(required=True, + description='date of acquisition of ' + 'experiment, as string (no ' + 'timezone info but relative ot ' + 'UTC)') + reporter_line = List(String, required=True, description='reporter line') + driver_line = List(String, required=True, description='driver line') + external_specimen_name = Int(required=True, + description='LabTracks ID of the animal') + full_genotype = String(required=True, description='full genotype') + surface_2p_pixel_size_um = Float(required=True, + description='the spatial extent (in um) ' + 'of the 2p field-of-view') + ophys_cell_segmentation_run_id = Int(required=True, + description='ID of the active ' + 'segmentation run used ' + 'to generate this file') + cell_specimen_table_dict = Nested(CellSpecimenTable, required=True, + description='Table of cell specimen ' + 'info') + sex = String(required=True, description='sex') + age = String(required=True, description='age') + eye_tracking_rig_geometry = Dict( + required=True, + description="Mapping containing information about session rig " + "geometry used for eye gaze mapping." + ) + eye_tracking_filepath = String( + required=True, + validate=check_read_access, + description="h5 filepath containing eye tracking ellipses" + ) + events_file = InputFile( + required=True, + description='h5 filepath to events data' + ) + imaging_plane_group = Int( + required=True, + allow_none=True, + description="A numeric index that indicates the order that the " + "frames were acquired when dealing with an imaging plane " + "in a mesoscope experiment. Will be None for Scientifica " + "experiments." + ) + plane_group_count = Int( + required=True, + description="The total number of plane groups associated with the " + "ophys session that the experiment belongs to. Will be 0 " + "for Scientifica experiments and nonzero for Mesoscope " + "experiments." + ) + + +class InputSchema(ArgSchema): + class Meta: + unknown = RAISE + + log_level = LogLevel(default='INFO', + description='set the logging level of the module') + session_data = Nested(SessionData, required=True, + description='records of the individual probes ' + 'used for this experiment') + output_path = String(required=True, validate=check_write_access_overwrite, + description='write outputs to here') + skip_eye_tracking = Boolean( + required=True, default=False, + description="Whether or not to skip processing eye tracking data. " + "If True, no eye tracking data will be written to NWB") + + +class OutputSchema(RaisingSchema): + input_parameters = Nested(InputSchema) + output_path = String(required=True, description='write outputs to here') diff --git a/brain_observatory/behavior/write_nwb/extensions/__init__.py b/brain_observatory/behavior/write_nwb/extensions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/write_nwb/extensions/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38923dbfc63049c15be8956fdeee66d219517ae3 GIT binary patch literal 224 zcmYL@zY4-I5XMt*5TOs^U^BRhh<{db5w}3NG{J_}OG#>LMn|8+$yajq5!{@-4&uT0 zyW{x2<JM_9VpMp)Lf>CKewEO$B!vM%vppLpy9e|A`j5|TGZTkkd=OB8&J=WjQLGSh zhZ?5BU>k(14ThZP>LLcQwMqorm`M$J2}eWOsv?Ijx$<C9Iz<;-Xq=B+nF3ntJnuY3 iBzB6MOG9q!FmNd?+D6K(j?dxz<n*~Ri~hwoiG2YE;zNS~ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py b/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d9740e8bb723249a43ac40af58aedba4ac2a6ac GIT binary patch literal 240 zcmYLDy9xp^5R70Uf*)d`DeOeVM=LgB7YLin;swvmk;FT%^fRoj{3TmI!OqIPLL8Xc zWtdrZH5l{-gYH*o=c|<;I=n2HvCCq`P7FKShX}3xm(OiIRr`n`D#*c(4b(u5S`uWQ zEKC$q6_qcMV#eyryoqY#jEXMdsD$hY2jp&1aKav?3E)V3!xt+^J~Yx`4wdsk)`2UU pY9sNIIPE+|i4{`P787QP4XL#wm$V+2&9gT<d3!E!-oE^1iZ8L1N&)}? literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/extension_builder.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/extension_builder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f2ef6e5b27dab2600beacc439049916a760eaf0 GIT binary patch literal 1454 zcmZWpNpBlB6rNQh$-CV)3D9M76avX9dI^FcjW-kqTBop56d(i)IKwB2_J|yi9LW;w zLy=tl3wr5tD$rjv*Pi+pdg|jSR+4rEKJjth`n`{HxUtc8@DacNMBg+V=P#?=Jsxge z;L^`gFo(IhLtOm#a&O`je-e;j5|VJzAPv`HK8aYs!Z!|SLW?ynJ@pituN{2j_MJ}j zH^y+zIzhE}_T%9hoq#TA28Sij8K`Ovt_rD4q6^5Xb+q_K$+GBMZ4<R)YN!Td^~L9c zU3Do>bypVSx$eRggy}LckQpvTX7ku5z_pI+2$%j7g~3XU`!m+hd|T;lc;j3<7anV{ zh&69Lcd4~L(ApnpYj>LQ**f}duuT)NEw;^e*e=_<4N&_CwU3wD$YY;i7Wdj6xi_8( zFB-o@wQSb1W!k^G_IKl(wQJ|vyY^rEh?j$S-8)-+eO&hhEUsJB@leT0EDOUkn#Z<x zE^|4W$LB9k<6&M(1v&$fL2ML4s~6$p-j}_{i-!k!4kA7k+Hg}Eh=)?ehl+9$_cLxC z77u20E@1Y8T1$Rs*pq712`it;tO^8<tcs?fFsrB<v@~O>swk7f(9DpXbIH$frc!9= zgW{m8Aj66}Zq>4`^|Z<E@f;PNy`pIj=P<%hr2UFd-nx+Ox3fMK2GkInAbT%uqbGL8 zOE|2{Rt-q9n)%|hzOmgefr?k>u`Eqd8WQDnk}|5RaF|PK77r1?tjwuFY!!@fr}%<e z_QW&bqp{H)7pbZuWDN<KnHQk&ayV6}$Fu;_7Lsd7v|)Pj#e1>p;~0;zgek8B>P|>@ z1(ZrM<Zxm`Vco<3opF)X>FPYBX^oNay0fnAEv#B+2j89azdtxSA?s+GmkjDy%CcOA z*2I$tc|py%ifD>(<0iO}TvQR`s-9jmNrpU!BvC#(bOP){C+YGAlAZcCB}=N+_mFHN zC6ZOyx@s@sOfcRbj=G02{`u|b>EH*Aq!`dKWxbTnsF)891Vvsj`qco$R1ahULT4!J z6oYShI?&ue7e4@(bOh*YX{Xucerj2n$P^<^DUNi$pTd|<xm5czg)WJhrTcJY&>DxO z_y5C#cdzc+>J{@Um|)NrR;!<&a6HfT+yIy7HvLVv{?%vp#9QqetKDYU@IQ6c1N5yB zLK`hfI_)Zwx@Tcl+xUjGi#Zn8vmdZ}WHrX`#-p~-Xcfbb1IJ(?d{5l3Gd!C}R_5^B SMNQj}bJM%;2Y&NW)B6{oK(=uJ literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/ndx_ophys_events.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/ndx_ophys_events.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ac4465f7b2f03eeea0d6af110eebc63786cc696 GIT binary patch literal 542 zcmaJ;F>c&25F{zxSw6r{fK+bMU!hZxE(ikKvAe)7f;55vVkK^Tv?)>`l{?E_;E&|s z%3ttP*rv)CQe`E;E>dIx4oPrkI9#3{94r`>efR-SoUvcy=DB9HIHnQK2ozJ?uyUM* z;jJh|o0JJ>$gb0$vkB+8x8o|=i84ch**&MzM5StWFUozzzp&-}H#xD3rHHSL10^lA z7&>S$#QiJmWn&<OyWFbV9CRIW*R6+;;|6V?E9|l9wX>@i)oOsb2C>wF}gJ#+5f z{@-J{h{A<()(v)BdqJUmLJ-pq`gKgNowjjLX+K^SGbz7mgHo19<SM67atak>=&%_z zJ|+1h^J6zB__O=;zWN%_hYHr9RyAzF4%LZ;##sgLDzuwWxeje;2q)9(v#zV4d(5dP zH*kfdHHH}Krl>t=D_u>F8|a-MiW=9j(aslJPZCKFDe$%@HuWeJQ$G39wBq07t8R$d bht{d@20zlzvv5d|@z=?mFZevol9c}io6xMw literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py b/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py new file mode 100644 index 0000000000..e04eaa82e8 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py @@ -0,0 +1,54 @@ +import os.path + +from pynwb.spec import NWBNamespaceBuilder, export_spec, NWBGroupSpec, \ + NWBDatasetSpec + +NAMESPACE = 'ndx-aibs-ophys-event-detection' + + +def main(): + + ns_builder = NWBNamespaceBuilder( + doc="Detected events from optical physiology ROI fluorescence traces", + name=f"""{NAMESPACE}""", + version="""0.1.0""", + author="""Allen Institute for Brain Science""", + contact="""waynew@alleninstitute.org""" + ) + + ns_builder.include_type('RoiResponseSeries', namespace='core') + ns_builder.include_type('DynamicTableRegion', namespace='core') + ns_builder.include_type('TimeSeries', namespace='core') + ns_builder.include_type('NWBDataInterface', namespace='core') + + ophys_events_spec = NWBGroupSpec( + neurodata_type_def='OphysEventDetection', + neurodata_type_inc='RoiResponseSeries', + name='event_detection', + doc='Stores event detection output', + datasets=[ + NWBDatasetSpec( + name='lambdas', + dtype='float', + doc='calculated regularization weights', + shape=(None,) + ), + NWBDatasetSpec( + name='noise_stds', + dtype='float', + doc='calculated noise std deviations', + shape=(None,) + ) + ] + ) + + new_data_types = [ophys_events_spec] + + # export the spec to yaml files in the spec folder + output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) + export_spec(ns_builder, new_data_types, output_dir) + + +if __name__ == "__main__": + # usage: python create_extension_spec.py + main() diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml b/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml new file mode 100644 index 0000000000..38004437d9 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml @@ -0,0 +1,16 @@ +groups: +- neurodata_type_def: OphysEventDetection + neurodata_type_inc: RoiResponseSeries + name: event_detection + doc: Stores event detection output + datasets: + - name: lambdas + dtype: float + shape: + - null + doc: calculated regularization weights + - name: noise_stds + dtype: float + shape: + - null + doc: calculated noise std deviations diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml b/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml new file mode 100644 index 0000000000..0120333451 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml @@ -0,0 +1,14 @@ +namespaces: +- author: Allen Institute for Brain Science + contact: waynew@alleninstitute.org + doc: Detected events from optical physiology ROI fluorescence traces + name: ndx-aibs-ophys-event-detection + schema: + - namespace: core + neurodata_types: + - RoiResponseSeries + - DynamicTableRegion + - TimeSeries + - NWBDataInterface + - source: ndx-aibs-ophys-event-detection.extensions.yaml + version: 0.1.0 diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py b/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py new file mode 100644 index 0000000000..142c234173 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py @@ -0,0 +1,15 @@ +import os +from pynwb import load_namespaces, get_class + +# Set path of the namespace.yaml file to the expected install location +ndx_ophys_events_specpath = os.path.join( + os.path.dirname(__file__), + 'ndx-aibs-ophys-event-detection.namespace.yaml' +) + +# Load the namespace +load_namespaces(ndx_ophys_events_specpath) + + +OphysEventDetection = get_class('OphysEventDetection', + 'ndx-aibs-ophys-event-detection') diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..084a39ee90523a1a3781714e12556e9ab64c8a15 GIT binary patch literal 242 zcmYL@v1$V`42B)Z5DIya42g$srIfZ=Lzd9ZVC1vtnfPR5`R;mSpQB@@yi(UbLbp!U z4W)wrlMw$e^t@i*C@H$U!`#1S{MAB+M-eXtUY*otalEQBumAD$vA;7fjD-!f;CBv2 zpvgQDG>JUi8l-_u%1GP@Q*I|Vhu{o{irWm$8D3GcF^a>VwJQ+FCMOpMsHsfaVGBb@ wMUO=ymPV)Xt%^G&V$C&leeBs*>~e&P+S)*&TD!~B=jy&ozK{4YKm9FIzgJaD1poj5 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/extension_builder.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/extension_builder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2746e3f0b8f9fb23949e782257640680253633e6 GIT binary patch literal 1732 zcmb_cOK&7K5bo!^@?=+9b`b}297JXoaf{GulMtauFd$73QfpAl-L9E-(rveF_e^G# z99GK-Df|I0Ah^I!>MJMy0w>CynPky&q+51(+2yLQzAD%8&Q8z4NBsJV{?K-uKdrEN zJp6fyL%+a@In2$S$i=UhdxanQMGyr=7==YEYPk;cqc#gz_`MT#pvzj9o;rliYX^7S zvD0t=g*Kc~Kd2v%zC9k%0(41JIIeikK-F7tRZ3-IT|!!KqsHe-R^`}AyC{7|4b@<* zyn0Wts{_gteV`35s=U$%28uGL22$(8J^>CJ*9i{&BTfcU822Z{&U}mVHoS4JoePh( zSetcjJ@-!P{!8j@B;&I!)Z8`!+hMzGkL|N}ZiAW29^D2v?zKB}Z#)xTw0>?kbElcR zruU0$-y7d-T|3v_wg1{jHXLN*@o2R-UZW?xpfk{`@cH25!SmGzM|lo{oC%E1R0haY zDsrqS7i64r5GkylE$C9f;w813e4{v!YSs^HpUJci1QJ}g=b$u~qHfX3WKz}bR0=~= z6K$PYpJPxQbRDEpLEo*r_E3|RsCUkb^>(zs=Ko9>P*coVw7-FVzUH0&;bLy3fy29C zNMng0Wb07LJZ7L%#Y=-|2vtB7OhMUT7)h37lgMGIKm$T-^bAdMAXJkD<hlKFi(pQ3 zO?sy^&DOqjCKrMjNlb>?0@*|bj;E+9(L8R@G?kSw4U>#(L(wm4G6G8=rPRD}rvOWc z&tYS#kb)bj2IM?LYXq(g2+Jm-MZR?7ZtdePgSbKsg2nLu1Jj#<P(doOKD*8lky8Q> zK_PXEjAM+H6jWc548u<V>w=bL&M_=q;b!AdihS9CDfty(=yR@lL);YEYFOZ6){xFc znpX^1)Y*8i!)Y$5S$+4F;xjI2zUFknO?Kz_|M1uMM<cxX3j2!_h0H8VP%ZqgL!HqQ z`a$$aK&2$ZTOQk8ESKq9Ylyx%6?Lp0b_3ntR<=de-O<sPr{k}WPEMokb&QP}W!r!X zt%@hH&P!^tx=j<Tar_A`Bo}p?an)RwP8?5p4son}Jb;*bLdVHndy1ZHDm31-nx<1l zyLb)bd)T_}$;y<KiP7lqj(Qgj{r%g?;p7{Q7jZ%}$_5EtP_djG35r*P(N88I=6WJa ztgRGhS!PQ;`GO}CtV%e*7I|r#!=$<Dnq3YP+X-Tspv5`GLR=0L$mpC)HC!k>5{pGL zysuR~d<*!)<|ev9xvYZ%&2|y5{tzd}^IXpjaCmOV-*xeAR#5KQHGI9@u;st+s%NNO zBX{<E9QS*5Tk3)3SMB3Y)GL<=XkgoVldFc@hrFmgRJyle^ML$Y+TNI+HXc4LB&%|G UfsMw|wzYS>r+(mfKI(Y?0FVA800000 literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/ndx_stimulus_template.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/ndx_stimulus_template.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a23c4f3bfc52d4381e134b7516ea695888a5ce2 GIT binary patch literal 565 zcmZ`%J#Q2-5VgH~m%Wn$X`x7e#oZQk2q8W@L=$LMD_OJaA?L(vuRMEq*>os>gop-y z2!CQ*s{92iW}_TMfRX&hmfxFsWBJwL;aqU|ub<(E6yoQ2*vEu7FL==#1|y7gq8PJs zvQdR<k|L1;#aa4ga*I<uxRxflRz-#ivn$EBiAl}mN)<CBPsCz+!<EGQg&H2Z07iRg zkXopbhS@20x^_Txx$x#<3AUmob+*~K4J|utS_d7j{wP*GG_E*0xnq2|BV0cIzj!ep zRG?zg_I_7I#ZF?vFr+PX>mfZ0)(;29#<9ncY5mDM)Vet4ihA!v@11CBu^xrRqx&A- zUUcZm2LD~e+1O=-U*BFoEk6=QDq#&~RlyE?U%vEE2XEj>iGE9EXjxe^hIZXk`Oa1) z*$$WdM(1#ftaXkV<~*+=Sg%9H6}QlZ*yk0lVQWLocabHUXUuW$gz~=z$p1Oks_lpD aSrg30;dA~Ff*vqr@+g_gxtyk1lFHv6bGQ}& literal 0 HcmV?d00001 diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py new file mode 100644 index 0000000000..954a2ac25f --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py @@ -0,0 +1,55 @@ +import os.path + +from pynwb.spec import NWBNamespaceBuilder, export_spec, NWBGroupSpec, \ + NWBDatasetSpec + +NAMESPACE = 'ndx-aibs-stimulus-template' + + +def main(): + + ns_builder = NWBNamespaceBuilder( + doc="Stimulus images", + name=f"""{NAMESPACE}""", + version="""0.1.0""", + author="""Allen Institute for Brain Science""", + contact="""waynew@alleninstitute.org""" + ) + + ns_builder.include_type('ImageSeries', namespace='core') + ns_builder.include_type('TimeSeries', namespace='core') + ns_builder.include_type('NWBDataInterface', namespace='core') + + stimulus_template_spec = NWBGroupSpec( + neurodata_type_def='StimulusTemplate', + neurodata_type_inc='ImageSeries', + doc='Note: image names in control_description are referenced by ' + 'stimulus/presentation table as well as intervals ' + '\n' + 'Each image shown to the animals is warped to account for ' + 'distance and eye position relative to the monitor. This ' + 'extension stores the warped images that were shown to the animal ' + 'as well as an unwarped version of each image in which a mask has ' + 'been applied such that only the pixels visible after warping are ' + 'included', + datasets=[ + NWBDatasetSpec( + name='unwarped', + dtype='float', + doc='Original image with mask applied such that only the ' + 'pixels visible after warping are included', + shape=(None, None, None) + ) + ] + ) + + new_data_types = [stimulus_template_spec] + + # export the spec to yaml files in the spec folder + output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) + export_spec(ns_builder, new_data_types, output_dir) + + +if __name__ == "__main__": + # usage: python create_extension_spec.py + main() diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml new file mode 100644 index 0000000000..23d3c63a04 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml @@ -0,0 +1,16 @@ +groups: +- neurodata_type_def: StimulusTemplate + neurodata_type_inc: ImageSeries + doc: Each image shown to the animals is warped to account for distance and eye position + relative to the monitor. This extension stores the warped images that were shown + to the animal as well as an unwarped version of each image in which a mask has + been applied such that only the pixels visible after warping are included + datasets: + - name: unwarped + dtype: float + shape: + - null + - null + - null + doc: Original image with mask applied such that only the pixels visible after + warping are included diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml new file mode 100644 index 0000000000..bf40bfa516 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml @@ -0,0 +1,13 @@ +namespaces: +- author: Allen Institute for Brain Science + contact: waynew@alleninstitute.org + doc: Stimulus images + name: ndx-aibs-stimulus-template + schema: + - namespace: core + neurodata_types: + - ImageSeries + - TimeSeries + - NWBDataInterface + - source: ndx-aibs-stimulus-template.extensions.yaml + version: 0.1.0 diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py new file mode 100644 index 0000000000..1e90c78da9 --- /dev/null +++ b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py @@ -0,0 +1,15 @@ +import os +from pynwb import load_namespaces, get_class + +# Set path of the namespace.yaml file to the expected install location +ndx_stimulus_template_specpath = os.path.join( + os.path.dirname(__file__), + 'ndx-aibs-stimulus-template.namespace.yaml' +) + +# Load the namespace +load_namespaces(ndx_stimulus_template_specpath) + + +StimulusTemplateExtension = get_class('StimulusTemplate', + 'ndx-aibs-stimulus-template') diff --git a/brain_observatory/brain_observatory_exceptions.py b/brain_observatory/brain_observatory_exceptions.py new file mode 100644 index 0000000000..aa170b079f --- /dev/null +++ b/brain_observatory/brain_observatory_exceptions.py @@ -0,0 +1,48 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +class BrainObservatoryAnalysisException(Exception): pass + +class MissingStimulusException(Exception): pass + +class NoEyeTrackingException(Exception): pass + +class EpochSeparationException(Exception): + + def __init__(self, *args, **kwargs): + + self.delta = kwargs.pop('delta') + + super(EpochSeparationException, self).__init__(*args, **kwargs) \ No newline at end of file diff --git a/brain_observatory/brain_observatory_plotting.py b/brain_observatory/brain_observatory_plotting.py new file mode 100644 index 0000000000..9985d23d15 --- /dev/null +++ b/brain_observatory/brain_observatory_plotting.py @@ -0,0 +1,1007 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import matplotlib.pyplot as plt +from matplotlib.ticker import MaxNLocator +import numpy as np +import pandas as pd +import os +import logging + + +def plot_drifting_grating_traces(dg, save_dir): + '''saves figures with a Ori X TF grid of mean resposes''' + logging.info("Plotting Ori and TF mean response for all cells") + + blank = dg.sweep_response[dg.stim_table.temporal_frequency == 0] + for nc in range(dg.numbercells): + if np.mod(nc, 20) == 0: + logging.info("Cell #%s", str(nc)) + xtime = np.arange(-1 * dg.interlength / dg.acquisition_rate, (dg.sweeplength + + dg.interlength) / dg.acquisition_rate, 1 / dg.acquisition_rate) + plt.figure(nc, figsize=(20, 16)) + vmax = 0 + vmin = 0 + try: + blank_p = blank[str(nc)].mean() + \ + (blank[str(nc)].std() / len(blank[str(nc)])) + blank_n = blank[str(nc)].mean() - \ + (blank[str(nc)].std() / len(blank[str(nc)])) + except: + blank_p = blank.iloc[:, nc].apply( + np.mean) + (blank.iloc[:, nc].apply(np.std) / blank.iloc[:, nc].apply(len)) + blank_n = blank.iloc[:, nc].apply( + np.mean) - (blank.iloc[:, nc].apply(np.std) / blank.iloc[:, nc].apply(len)) + for ori in dg.orivals: + ori_pt = np.where(dg.orivals == ori)[0][0] + for tf in dg.tfvals[1:]: + tf_pt = np.where(dg.tfvals == tf)[0][0] + sp_pt = (5 * ori_pt) + tf_pt + subset_response = dg.sweep_response[ + (dg.stim_table.temporal_frequency == tf) & (dg.stim_table.orientation == ori)] + try: + subset_response_p = subset_response[str(nc)].mean( + ) + (subset_response[str(nc)][:-1].std() / len(subset_response[str(nc)])) + subset_response_n = subset_response[str(nc)].mean( + ) - (subset_response[str(nc)][:-1].std() / len(subset_response[str(nc)])) + except: + subset_response_p = subset_response.iloc[:, nc].apply( + np.mean) + (subset_response.iloc[:, nc].apply(np.std) / subset_response.iloc[:, nc].apply(len)) + subset_response_n = subset_response.iloc[:, nc].apply( + np.mean) - (subset_response.iloc[:, nc].apply(np.std) / subset_response.iloc[:, nc].apply(len)) + ax = plt.subplot(8, 5, sp_pt) + while len(xtime) > len(subset_response[str(nc)].mean()): + xtime = np.delete(xtime, -1) + try: + ax.fill_between(xtime, subset_response_p, + subset_response_n, color='b', alpha=0.5) + except: + pass + try: + ax.fill_between(xtime, blank_p, blank_n, + color='k', alpha=0.5) + except: + pass + try: + ax.plot(xtime, subset_response[ + str(nc)].mean(), color='b', lw=2) + except: + pass + ax.plot(xtime, subset_response[ + str(nc)].mean(), color='b', lw=2) + # TODO: remove the [:119] and [:-1] and the try/except + ax.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) + ax.axvspan(0, dg.sweeplength / dg.acquisition_rate, + ymin=0, ymax=1, facecolor='gray', alpha=0.3) + ax.set_xlim(-1, 3) + ax.set_xticks(range(-1, 4)) + ax.yaxis.set_major_locator(MaxNLocator(4)) + vmax = np.where(np.amax(subset_response_p) > + vmax, np.amax(subset_response_p), vmax) + vmin = np.where(np.amin(subset_response_n) < + vmin, np.amin(subset_response_n), vmin) + + if ori_pt < 7: + ax.set_xticks([]) + else: + ax.set_xlabel("Time (s)", fontsize=20) + if tf_pt > 1: + ax.set_yticks([]) + else: + ax.set_ylabel(str(dg.orivals[ori_pt]), fontsize=24) + if ori_pt == 0: + ax.set_title(str(dg.tfvals[tf_pt]), fontsize=24) + + for i in range(1, sp_pt + 1): + ax = plt.subplot(8, 5, i) + ax.set_ylim(vmin, vmax) + plt.tick_params(labelsize=16) + plt.tight_layout() + plt.suptitle("Cell " + str(nc + 1), fontsize=20) + plt.subplots_adjust(top=0.9) + filename = 'Traces DG Cell_' + str(nc + 1) + '.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() + + +def plot_ns_traces(nsa, save_dir): + logging.info("Plotting Natural Scene traces for each cell") + xtime = np.arange(-1 * nsa.interlength / nsa.acquisition_rate, (nsa.sweeplength + + nsa.interlength) / nsa.acquisition_rate, 1 / nsa.acquisition_rate) + blank = nsa.sweep_response[nsa.stim_table.frame == -1] + for nc in range(nsa.numbercells): + if np.mod(nc, 20) == 0: + logging.info("Cell #%s", str(nc)) + vmax = 0 + vmin = 0 + blank_p = blank[str(nc)].mean() + \ + (blank[str(nc)].std() / len(blank[str(nc)])) + blank_n = blank[str(nc)].mean() - \ + (blank[str(nc)].std() / len(blank[str(nc)])) + plt.figure(nc, figsize=(30, 25)) + for ns in range(nsa.number_scenes - 1): + subset_response = nsa.sweep_response[nsa.stim_table.frame == ns] + subset_response_p = subset_response[str(nc)].mean( + ) + (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) + subset_response_n = subset_response[str(nc)].mean( + ) - (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) + ax = plt.subplot(10, 12, ns + 1) + try: + ax.fill_between(xtime, subset_response_p, + subset_response_n, color='b', alpha=0.5) + except: + xtime = xtime[:-1] + ax.fill_between(xtime, subset_response_p, + subset_response_n, color='b', alpha=0.5) + ax.fill_between(xtime, blank_p, blank_n, color='k', alpha=0.5) + ax.plot(xtime, subset_response[str(nc)].mean(), color='b', lw=2) + ax.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) + ax.axvspan(0, nsa.sweeplength / nsa.acquisition_rate, + ymin=0, ymax=1, facecolor='gray', alpha=0.3) + ax.yaxis.set_major_locator(MaxNLocator(4)) + vmax = np.where(np.amax(subset_response_p) > vmax, + np.amax(subset_response_p), vmax) + vmin = np.where(np.amin(subset_response_n) < vmin, + np.amin(subset_response_n), vmin) + if ns < 108: + ax.set_xticks([]) + if np.mod(ns, 12): + ax.set_yticks([]) + for i in range(1, nsa.number_scenes): + ax = plt.subplot(10, 12, i) + ax.set_ylim(vmin, vmax) + plt.tight_layout() + plt.suptitle("Cell " + str(nc + 1), fontsize=20) + plt.subplots_adjust(top=0.9) + filename = 'NS Traces Cell_' + str(nc + 1) + '.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() + + +def plot_sg_traces(sg, save_dir): + logging.info("Plotting Static Grating traces for each cell") + xtime = np.arange(-1 * sg.interlength / sg.acquisition_rate, (sg.sweeplength + + sg.interlength) / sg.acquisition_rate, 1 / sg.acquisition_rate) + blank = sg.sweep_response[sg.stim_table.spatial_frequency == 0] + for nc in range(sg.numbercells): + if np.mod(nc, 20) == 0: + logging.info("Cell #%s", str(nc)) + vmax = 0 + vmin = 0 + blank_p = blank[str(nc)].mean() + \ + (blank[str(nc)].std() / len(blank[str(nc)])) + blank_n = blank[str(nc)].mean() - \ + (blank[str(nc)].std() / len(blank[str(nc)])) + while len(xtime) > len(blank_p): + xtime = np.delete(xtime, -1) + plt.figure(nc, figsize=(30, 30)) + ph_dict = {0: 0, 0.25: 6, 0.5: 77, 0.75: 83} + for ori in sg.orivals: + ori_pt = np.where(sg.orivals == ori)[0][0] + for sf in sg.sfvals[1:]: + sf_pt = np.where(sg.sfvals == sf)[0][0] + for phase in sg.phasevals: + ph_pt = ph_dict[phase] + subplotnum = sf_pt + (ori_pt * 11) + ph_pt + subset_response = sg.sweep_response[(sg.stim_table.spatial_frequency == sf) & ( + sg.stim_table.orientation == ori) & (sg.stim_table.phase == phase)] + subset_response_p = subset_response[str(nc)].mean( + ) + (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) + subset_response_n = subset_response[str(nc)].mean( + ) - (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) + ax = plt.subplot(13, 11, subplotnum) + ax.fill_between(xtime, subset_response_p, + subset_response_n, color='b', alpha=0.5) + ax.fill_between(xtime, blank_p, blank_n, + color='k', alpha=0.5) + ax.plot(xtime, subset_response[ + str(nc)].mean(), color='b', lw=2) + ax.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) + ax.axvspan(0, sg.sweeplength / sg.acquisition_rate, + ymin=0, ymax=1, facecolor='gray', alpha=0.3) + ax.yaxis.set_major_locator(MaxNLocator(4)) + vmax = np.where(np.amax(subset_response_p) + > vmax, np.amax(subset_response_p), vmax) + vmin = np.where(np.amin(subset_response_n) + < vmin, np.amin(subset_response_n), vmin) + if np.mod(subplotnum, 11) != 1: + ax.set_yticks([]) + else: + ax.set_ylabel(ori, fontsize=20) + if subplotnum < 133: + ax.set_xticks([]) + if subplotnum < 12: + ax.set_title(sf, fontsize=20) + if subplotnum == 3: + ax.set_title("Phase 0.0", fontsize=20) + if subplotnum == 9: + ax.set_title("Phase 0.25", fontsize=20) + if subplotnum == 80: + ax.set_title("Phase 0.5", fontsize=20) + if subplotnum == 86: + ax.set_title("Phase 0.75", fontsize=20) + for i in range(1, 144): + ax = plt.subplot(13, 11, i) + ax.set_ylim(vmin, vmax) + plt.tight_layout() + plt.suptitle("Cell " + str(nc + 1), fontsize=20) + plt.subplots_adjust(top=0.9) + filename = 'SG Traces Cell_' + str(nc + 1) + '.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() + + +def plot_lsn_traces(lsn, save_dir, suffix=''): + logging.info("Plotting LSN traces for all cells") + xtime = np.arange(-lsn.interlength / lsn.acquisition_rate, + (lsn.interlength + lsn.sweeplength) / lsn.acquisition_rate, + 1.0 / lsn.acquisition_rate) + + for nc in range(lsn.numbercells): + if np.mod(nc, 20) == 0: + logging.info("Cell #%s", str(nc)) + + plt.figure(nc, figsize=(24, 20)) + vmax = 0 + vmin = 0 + one_cell = lsn.sweep_response[str(nc)] + + for yp in range(16): + for xp in range(28): + sp_pt = (yp * 28) + xp + 1 + on_frame = np.where(lsn.LSN[:, yp, xp] == 255)[0] + off_frame = np.where(lsn.LSN[:, yp, xp] == 0)[0] + subset_on = one_cell[lsn.stim_table.frame.isin(on_frame)] + subset_off = one_cell[lsn.stim_table.frame.isin(off_frame)] + + subset_on_mean = subset_on.mean() + subset_off_mean = subset_off.mean() + + ax = plt.subplot(16, 28, sp_pt) + ax.plot(xtime, subset_on_mean, color='r', lw=2) + ax.plot(xtime, subset_off_mean, color='b', lw=2) + ax.axvspan(0, lsn.sweeplength / lsn.acquisition_rate, + ymin=0, ymax=1, facecolor='gray', alpha=0.3) + vmax = np.where(np.amax(subset_on_mean) > vmax, + np.amax(subset_on_mean), vmax) + vmax = np.where(np.amax(subset_off_mean) > vmax, + np.amax(subset_off_mean), vmax) + vmin = np.where(np.amin(subset_on_mean) < vmin, + np.amin(subset_on_mean), vmin) + vmin = np.where(np.amin(subset_off_mean) < vmin, + np.amin(subset_off_mean), vmin) + ax.set_xticks([]) + ax.set_yticks([]) + + for i in range(1, sp_pt + 1): + ax = plt.subplot(16, 28, i) + ax.set_ylim(vmin, vmax) + + plt.tight_layout() + plt.suptitle("Cell " + str(nc + 1), fontsize=20) + plt.subplots_adjust(top=0.9) + filename = 'Traces LSN Cell_' + str(nc + 1) + suffix + '.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() + + +def _plot_3sa(dg, nm1, nm3, save_dir): + logging.info("Plotting for all cell") + for nc in range(dg.numbercells): + if np.mod(nc, 20) == 0: + logging.info("Cell #%s", str(nc)) + plt.figure(nc, figsize=(20, 20)) + ax1 = plt.subplot2grid((6, 6), (0, 0), colspan=4) # full trace + ax2 = plt.subplot2grid((6, 6), (0, 4)) # histogram of F + ax3 = plt.subplot2grid((6, 6), (1, 0), colspan=4) # running speed + ax4 = plt.subplot2grid((6, 6), (1, 4)) + ax5 = plt.subplot2grid((6, 6), (1, 5), sharex=ax4, sharey=ax4) + ax6 = plt.subplot2grid((6, 6), (2, 0), colspan=2) + ax7 = plt.subplot2grid((6, 6), (2, 2), colspan=2) + ax8 = plt.subplot2grid((6, 6), (2, 4), colspan=2) + ax9 = plt.subplot2grid((6, 6), (3, 0)) + ax10 = plt.subplot2grid((6, 6), (4, 0), colspan=3) + ax11 = plt.subplot2grid((6, 6), (5, 0), colspan=3) + ax12 = plt.subplot2grid((6, 6), (4, 3), colspan=3) + ax13 = plt.subplot2grid((6, 6), (5, 3), colspan=3) + + xtime = np.arange(0, np.size(dg.celltraces, 1), 1.) + xtime /= dg.acquisition_rate + dif = np.ediff1d(dg.stim_table.start.values, + to_begin=8000, to_end=8000) + test = np.argwhere(dif > 5000) + ax1.plot(xtime, dg.celltraces[nc, :]) + for i in range(len(test) - 1): + ax1.axvspan(xmin=(dg.stim_table.start.iloc[test[i]].values / dg.acquisition_rate), xmax=( + dg.stim_table.end.iloc[test[i + 1] - 1].values / dg.acquisition_rate), color='gray', alpha=0.3) + ax1.axvspan(xmin=nm1.stim_table.start.min() / nm1.acquisition_rate, xmax=( + (nm1.stim_table.start.max() + nm1.sweeplength) / nm1.acquisition_rate), color='red', alpha=0.3) + dif = np.ediff1d(nm3.stim_table.start.values, + to_begin=8000, to_end=8000) + test = np.argwhere(dif > 5000) + for i in range(len(test) - 1): + ax1.axvspan(xmin=(nm3.stim_table.start.iloc[test[i]].values / nm3.acquisition_rate), xmax=( + (nm3.stim_table.end.iloc[test[i + 1] - 1].values + nm3.sweeplength) / nm3.acquisition_rate), color='blue', alpha=0.3) + ax1.set_xlabel("Time (s)", fontsize=20) + ax1.set_ylabel("Fluorescence", fontsize=20) + + ax2.hist(dg.celltraces[nc, :], bins=70) + ax2.set_yscale('log') + ax2.set_xlabel("Fluorescence", fontsize=20) + ax2.set_ylabel("Count", fontsize=20) + + xtime = np.arange(0, np.size(dg.dxcm), 1.) + xtime /= dg.acquisition_rate + ax3.plot(xtime, dg.dxcm, color='k') + ax3.set_xlabel("Time (s)", fontsize=20) + ax3.set_xlabel("Speed (cm/s)", fontsize=20) + + smax = nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[ + nc, :, 0]), 0] + nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[nc, :, 0]), 1] + vmax = nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[ + nc, :, 0]), 0] + nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[nc, :, 0]), 1] + rmax = np.where(smax > vmax, smax, vmax) + smin = nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[ + nc, :, 0]), 0] - nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[nc, :, 0]), 1] + vmin = nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[ + nc, :, 0]), 0] - nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[nc, :, 0]), 1] + rmin = np.where(smin < vmin, smin, vmin) + + ax4.errorbar(nm1.binned_dx_sp[:, 0], nm1.binned_cells_sp[ + nc, :, 0], yerr=nm1.binned_cells_sp[nc, :, 1], fmt='.', color='k') + ax4.set_ylim(rmin, rmax) + ax4.set_xlabel("Speed (cm/s)", fontsize=20) + ax4.set_ylabel("DF/F", fontsize=20) + ax4.set_title("Spontaneous", fontsize=20) + + ax5.errorbar(nm1.binned_dx_vis[:, 0], nm1.binned_cells_vis[ + nc, :, 0], yerr=nm1.binned_cells_vis[nc, :, 1], fmt='.') + ax5.set_ylim(rmin, rmax) + ax5.set_xlabel("Speed (cm/s)", fontsize=20) + ax5.set_ylabel("DF/F", fontsize=20) + ax5.set_title("Visual Stimuli", fontsize=20) + + peakori = dg.peak.ori_dg[nc] + peaktf = dg.peak.tf_dg[nc] + ax6.errorbar(dg.orivals, dg.response[:, peaktf, nc, 0], yerr=dg.response[ + :, peaktf, nc, 1], fmt='bo-', lw=2) + ax6.fill_between(dg.orivals, np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], dg.number_ori), np.repeat( + dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], dg.number_ori), color='gray', alpha=0.5) + ax6.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k') + ax6.annotate(str(dg.tfvals[peaktf]) + " Hz", + xy=(0, 0.9), xycoords='axes fraction', fontsize=14) + ax6.set_xticks(dg.orivals) + ax7.set_xlim(-10, 325) + ax6.set_xlabel("Direction (d)", fontsize=20) + ax6.set_ylabel("Mean DF/F (%)", fontsize=20) + ax6.yaxis.set_major_locator(MaxNLocator(6)) + + ax7.errorbar(range(5), dg.response[peakori, 1:, nc, 0], yerr=dg.response[ + peakori, 1:, nc, 1], fmt='bo-', lw=2) + ax7.fill_between(range(5), np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], 5), np.repeat( + dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], 5), color='gray', alpha=0.5) + ax7.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k', lw=2) + ax7.annotate(str(dg.orivals[peakori]) + " Deg", + xy=(0, 0.9), xycoords='axes fraction', fontsize=14) + ax7.set_xlim(-0.2, 4.2) + ax7.set_xticks(range(5)) + ax7.set_xticklabels(dg.tfvals[1:]) + ax7.set_xlabel("Temporal frequency (Hz)", fontsize=20) + + subset = dg.sweep_response[(dg.stim_table.orientation == dg.orivals[peakori]) & ( + dg.stim_table.temporal_frequency == dg.tfvals[peaktf])] + xtime = np.arange(-1 * dg.interlength / dg.acquisition_rate, (dg.sweeplength + + dg.interlength) / dg.acquisition_rate, 1 / dg.acquisition_rate) + while len(xtime) > len(subset[str(nc)].mean()): + xtime = np.delete(xtime, -1) + for index, row in subset.iterrows(): + ax8.plot(xtime, subset[str(nc)][index], lw=2) + ax8.set_xlim(-1, 3) + ax8.annotate(str(dg.orivals[peakori]) + " Deg / " + str( + dg.tfvals[peaktf]) + " Hz", xy=(0, 0.9), xycoords='axes fraction', fontsize=14) + ax8.set_xlabel("Time (s)", fontsize=20) + ax8.set_ylabel("DF/F (%)", fontsize=20) + ax8.axvspan(0, dg.sweeplength / dg.acquisition_rate, + ymin=0, ymax=1, facecolor='gray', alpha=0.3) + ax8.yaxis.set_major_locator(MaxNLocator(6)) + ax8.set_title("Trial responses to prefered ori/tf", fontsize=20) + + im = ax9.imshow(dg.response[:, 1:, nc, 0], + cmap='gray', interpolation='none') + ax9.set_ylabel("Direction (d)", fontsize=20) + ax9.set_yticks(range(8)) + ax9.set_yticklabels(dg.orivals) + ax9.set_xlabel("Temporal frequency (Hz)", fontsize=20) + ax9.set_xticks(range(5)) + ax9.set_xticklabels(dg.tfvals[1:]) + cbar = plt.colorbar(im, ax=ax9) + cbar.ax.set_ylabel('DF/F (%)', fontsize=8) + for t in cbar.ax.get_yticklabels(): + t.set_fontsize(8) + + xtime = np.arange(0, nm1.sweeplength / + nm1.acquisition_rate, 1 / nm1.acquisition_rate) + while len(xtime) > len(nm1.sweep_response[str(nc)].mean()): + xtime = np.delete(xtime, -1) + for index, row in nm1.sweep_response.iterrows(): + ax10.plot(xtime, nm1.sweep_response[str(nc)][index], lw=2) + ax10.set_xlabel("Time (s)", fontsize=20) + ax10.set_ylabel("DF/F", fontsize=20) + ax10.set_title("Natural Movie 1", fontsize=20, color='red') + + temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) + for i in range(len(nm1.stim_table)): + temp[i, :] = nm1.sweep_response[str(nc)].iloc[i] + ax11.imshow(temp, cmap='gray', interpolation='none', aspect=40) + ax11.set_ylabel("Trials", fontsize=20) + ax11.set_xticks([]) + + xtime = np.arange(0, nm3.sweeplength / + nm3.acquisition_rate, 1 / nm3.acquisition_rate) + while len(xtime) > len(nm3.sweep_response[str(nc)].mean()): + xtime = np.delete(xtime, -1) + for index, row in nm3.sweep_response.iterrows(): + ax12.plot(xtime, nm3.sweep_response[str(nc)][index], lw=2) + ax12.set_xlabel("Time (s)", fontsize=20) + ax12.set_ylabel("DF/F", fontsize=20) + ax12.set_title("Natural Movie Long", fontsize=20, color='blue') + + temp = np.empty((len(nm3.stim_table), nm3.sweeplength)) + for i in range(len(nm3.stim_table)): + temp[i, :] = nm3.sweep_response[str(nc)].iloc[i] + ax13.imshow(temp, cmap='gray', interpolation='none', aspect=100) + ax13.set_ylabel("Trials", fontsize=20) + ax13.set_xticks([]) + + plt.tick_params(labelsize=16) + plt.tight_layout() + filename = 'Cell_' + str(nc + 1) + '_3SA.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() + + +def _plot_3sc(lsn, nm1, nm2, save_dir, suffix=''): + logging.info("Plotting for all cells") + for nc in range(lsn.numbercells): + if np.mod(nc, 20) == 0: + logging.info("Cell #%s", str(nc)) + + plt.figure(nc, figsize=(20, 20)) + ax1 = plt.subplot2grid((6, 6), (0, 0), colspan=4) # full trace + ax2 = plt.subplot2grid((6, 6), (0, 4)) # histogram of F + ax11 = plt.subplot2grid((6, 6), (1, 0), colspan=4) + ax12 = plt.subplot2grid((6, 6), (1, 4)) + ax13 = plt.subplot2grid((6, 6), (1, 5), sharex=ax12, sharey=ax12) + ax3 = plt.subplot2grid((6, 6), (2, 0), colspan=3) # movie 1 + ax4 = plt.subplot2grid((6, 6), (3, 0), colspan=3) + ax5 = plt.subplot2grid((6, 6), (2, 3), colspan=3) # movie 2 + ax6 = plt.subplot2grid((6, 6), (3, 3), colspan=3) + ax7 = plt.subplot2grid((6, 6), (4, 0), colspan=3) # receptive fields + ax8 = plt.subplot2grid((6, 6), (4, 3), colspan=3) + ax9 = plt.subplot2grid((6, 6), (5, 0), colspan=3) + ax10 = plt.subplot2grid((6, 6), (5, 3), colspan=3) + + xtime = np.arange(0, np.size(lsn.celltraces, 1), 1.) + xtime /= lsn.acquisition_rate + dif = np.ediff1d(lsn.stim_table.start.values, + to_begin=8000, to_end=8000) + test = np.argwhere(dif > 5000) + ax1.plot(xtime, lsn.celltraces[nc, :]) + for i in range(len(test) - 1): + ax1.axvspan(xmin=(lsn.stim_table.start.iloc[test[i]].values / lsn.acquisition_rate), xmax=( + lsn.stim_table.end.iloc[test[i + 1] - 1].values / lsn.acquisition_rate), color='gray', alpha=0.3) + ax1.axvspan(nm1.stim_table.start.min() / nm1.acquisition_rate, nm1.stim_table.end.max() / + nm1.acquisition_rate, ymin=0, ymax=1, color='red', alpha=0.3) + ax1.axvspan(nm2.stim_table.start.min() / nm2.acquisition_rate, nm2.stim_table.end.max() / + nm2.acquisition_rate, ymin=0, ymax=1, color='green', alpha=0.3) + ax1.set_xlabel("Time (s)", fontsize=20) + ax1.set_ylabel("Fluorescence", fontsize=20) + + ax2.hist(lsn.celltraces[nc, :], bins=70) + ax2.set_yscale('log') + ax2.set_xlabel("Fluorescence", fontsize=20) + ax2.set_ylabel("Count", fontsize=20) + + xtime = np.arange(0, np.size(lsn.dxcm), 1.) + xtime /= lsn.acquisition_rate + ax11.plot(xtime, lsn.dxcm, color='k') + ax11.set_xlabel("Time (s)", fontsize=20) + ax11.set_xlabel("Speed (cm/s)", fontsize=20) + + smax = nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[ + nc, :, 0]), 0] + nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[nc, :, 0]), 1] + vmax = nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[ + nc, :, 0]), 0] + nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[nc, :, 0]), 1] + rmax = np.where(smax > vmax, smax, vmax) + smin = nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[ + nc, :, 0]), 0] - nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[nc, :, 0]), 1] + vmin = nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[ + nc, :, 0]), 0] - nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[nc, :, 0]), 1] + rmin = np.where(smin < vmin, smin, vmin) + + ax12.errorbar(nm1.binned_dx_sp[:, 0], nm1.binned_cells_sp[ + nc, :, 0], yerr=nm1.binned_cells_sp[nc, :, 1], fmt='.', color='k') + ax12.set_ylim(rmin, rmax) + ax12.set_xlabel("Speed (cm/s)", fontsize=20) + ax12.set_ylabel("DF/F", fontsize=20) + ax12.set_title("Spontaneous", fontsize=20) + + ax13.errorbar(nm1.binned_dx_vis[:, 0], nm1.binned_cells_vis[ + nc, :, 0], yerr=nm1.binned_cells_vis[nc, :, 1], fmt='.') + ax13.set_ylim(rmin, rmax) + ax13.set_xlabel("Speed (cm/s)", fontsize=20) + ax13.set_ylabel("DF/F", fontsize=20) + ax13.set_title("Visual Stimuli", fontsize=20) + + xtime = np.arange(0, nm1.sweeplength / + nm1.acquisition_rate, 1 / nm1.acquisition_rate) + for index, row in nm1.sweep_response.iterrows(): + ax3.plot(xtime, nm1.sweep_response[str(nc)][index], lw=2) + ax3.set_xlabel("Time (s)", fontsize=20) + ax3.set_ylabel("DF/F", fontsize=20) + ax3.set_title("Natural Movie 1", fontsize=20, color='red') + + temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) + for i in range(len(nm1.stim_table)): + temp[i, :] = nm1.sweep_response[str(nc)].iloc[i] + ax4.imshow(temp, cmap='gray', interpolation='none', aspect=40) + ax4.set_ylabel("Trials", fontsize=20) + ax4.set_xticks([]) + + xtime = np.arange(0, nm2.sweeplength / + nm2.acquisition_rate, 1 / nm2.acquisition_rate) + for index, row in nm2.sweep_response.iterrows(): + ax5.plot(xtime, nm2.sweep_response[str(nc)][index], lw=2) + ax5.set_xlabel("Time (s)", fontsize=20) + ax5.set_ylabel("DF/F", fontsize=20) + ax5.set_title("Natural Movie 2", fontsize=20, color='green') + + temp = np.empty((len(nm2.stim_table), nm2.sweeplength)) + for i in range(len(nm2.stim_table)): + temp[i, :] = nm2.sweep_response[str(nc)].iloc[i] + ax6.imshow(temp, cmap='gray', interpolation='none', aspect=40) + ax6.set_ylabel("Trials", fontsize=20) + ax6.set_xticks([]) + + vMax = np.where(np.amax(lsn.receptive_field[:, :, nc, 0]) > np.amax(lsn.receptive_field[ + :, :, nc, 1]), np.amax(lsn.receptive_field[:, :, nc, 0]), np.amax(lsn.receptive_field[:, :, nc, 1])) + vMin = np.where(np.amin(lsn.receptive_field[:, :, nc, 0]) < np.amin(lsn.receptive_field[ + :, :, nc, 1]), np.amin(lsn.receptive_field[:, :, nc, 0]), np.amin(lsn.receptive_field[:, :, nc, 1])) + + imon = ax7.imshow(lsn.receptive_field[ + :, :, nc, 0], cmap='gray', interpolation='None', vmin=vMin, vmax=vMax) + ax7.set_title("ON", fontsize=20) + ax7.set_xticks([]) + ax7.set_yticks([]) + cbar = plt.colorbar(imon, ax=ax7, fraction=0.046, pad=0.04) + cbar.ax.set_ylabel('DF/F (%)', fontsize=10) + for t in cbar.ax.get_yticklabels(): + t.set_fontsize(8) + + imoff = ax8.imshow(lsn.receptive_field[ + :, :, nc, 1], cmap='gray', interpolation='None', vmin=vMin, vmax=vMax) + ax8.set_title("OFF", fontsize=20) + ax8.set_xticks([]) + ax8.set_yticks([]) + cbar = plt.colorbar(imoff, ax=ax8, fraction=0.046, pad=0.04) + cbar.ax.set_ylabel('DF/F (%)', fontsize=10) + for t in cbar.ax.get_yticklabels(): + t.set_fontsize(8) + + zon = (lsn.receptive_field[:, :, nc, 0] - np.mean(lsn.receptive_field[ + :, :, nc, 0])) / np.std(lsn.receptive_field[:, :, nc, 0]) + zon = np.where(abs(zon) > 2, zon, 0) + Vmax_on = np.where(abs(np.amax(zon)) > abs( + np.amin(zon)), np.amax(zon), -1 * np.amin(zon)) + zoff = (lsn.receptive_field[:, :, nc, 1] - np.mean(lsn.receptive_field[ + :, :, nc, 1])) / np.std(lsn.receptive_field[:, :, nc, 1]) + zoff = np.where(abs(zoff) > 2, zoff, 0) + Vmax_off = np.where(abs(np.amax(zoff)) > abs( + np.amin(zoff)), np.amax(zoff), -1 * np.amin(zoff)) + Vmax = np.where(Vmax_on > Vmax_off, Vmax_on, Vmax_off) + imzon = ax9.imshow(zon, cmap='RdBu_r', + interpolation='none', vmin=-1 * Vmax, vmax=Vmax) + ax9.set_title("On Z-score", fontsize=20) + ax9.set_xticks([]) + ax9.set_yticks([]) + cbar = plt.colorbar(imzon, ax=ax9, fraction=0.046, pad=0.04) + + zoff = (lsn.receptive_field[:, :, nc, 1] - np.mean(lsn.receptive_field[ + :, :, nc, 1])) / np.std(lsn.receptive_field[:, :, nc, 1]) + zoff = np.where(abs(zoff) > 2, zoff, 0) + imzoff = ax10.imshow( + zoff, cmap='RdBu', interpolation='none', vmin=-1 * Vmax, vmax=Vmax) + ax10.set_title("Off Z-score", fontsize=20) + ax10.set_xticks([]) + ax10.set_yticks([]) + cbar = plt.colorbar(imzoff, ax=ax10, fraction=0.046, pad=0.04) + + plt.tick_params(labelsize=16) + plt.tight_layout() + filename = 'Cell_' + str(nc + 1) + '_3SC' + suffix + '.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() + + +def _plot_3sb(sg, nm1, ns, save_dir): + logging.info("Plotting for all cells") + for nc in range(sg.numbercells): + if np.mod(nc, 20) == 0: + logging.info("Cell #%s", str(nc)) + plt.figure(nc, figsize=(20, 24)) + ax1 = plt.subplot2grid((6, 6), (0, 0), colspan=4) # full trace + ax2 = plt.subplot2grid((6, 6), (0, 4)) # histogram of F + ax14 = plt.subplot2grid((6, 6), (1, 4)) # speed tuning + ax16 = plt.subplot2grid((6, 6), (1, 5), sharex=ax14, sharey=ax14) + ax15 = plt.subplot2grid((6, 6), (1, 0), colspan=4) + ax3 = plt.subplot2grid((6, 6), (2, 0), colspan=2) # Ori tuning + ax4 = plt.subplot2grid((6, 6), (2, 2), colspan=2) # sf tuning + ax13 = plt.subplot2grid((6, 6), (2, 4), colspan=2) # response at peak + ax5 = plt.subplot2grid((6, 6), (3, 0)) + ax6 = plt.subplot2grid((6, 6), (3, 1)) + ax7 = plt.subplot2grid((6, 6), (3, 2)) + ax8 = plt.subplot2grid((6, 6), (3, 3)) + ax9 = plt.subplot2grid((6, 6), (4, 0), colspan=3) # movie + ax10 = plt.subplot2grid((6, 6), (5, 0), colspan=3) + ax11 = plt.subplot2grid((6, 6), (4, 3), colspan=2) # natural scenes + ax12 = plt.subplot2grid((6, 6), (5, 3), colspan=2) + + xtime = np.arange(0, np.size(sg.celltraces, 1), 1.) + xtime /= sg.acquisition_rate + dif = np.ediff1d(sg.stim_table.start.values, + to_begin=8000, to_end=8000) + test = np.argwhere(dif > 5000) + ax1.plot(xtime, sg.celltraces[nc, :]) + for i in range(len(test) - 1): + ax1.axvspan(xmin=(sg.stim_table.start.iloc[test[i]].values / sg.acquisition_rate), xmax=( + sg.stim_table.end.iloc[test[i + 1] - 1].values / sg.acquisition_rate), color='gray', alpha=0.3) + ax1.axvspan(nm1.stim_table.start.min() / nm1.acquisition_rate, nm1.stim_table.end.max() / + nm1.acquisition_rate, ymin=0, ymax=1, color='red', alpha=0.3) + dif = np.ediff1d(ns.stim_table.start.values, + to_begin=8000, to_end=8000) + test = np.argwhere(dif > 5000) + for i in range(len(test) - 1): + ax1.axvspan(xmin=(ns.stim_table.start.iloc[test[i]].values / ns.acquisition_rate), xmax=( + ns.stim_table.end.iloc[test[i + 1] - 1].values / ns.acquisition_rate), color='blue', alpha=0.3) + ax1.set_xlabel("Time (s)", fontsize=20) + ax1.set_ylabel("Fluorescence", fontsize=20) + + ax2.hist(sg.celltraces[nc, :], bins=70) + ax2.set_yscale('log') + ax2.set_xlabel("Fluorescence", fontsize=20) + ax2.set_ylabel("Count", fontsize=20) + + xtime = np.arange(0, np.size(sg.dxcm), 1.) + xtime /= sg.acquisition_rate + ax15.plot(xtime, sg.dxcm, color='k') + ax15.set_xlabel("Time (s)", fontsize=20) + ax15.set_xlabel("Speed (cm/s)", fontsize=20) + + peakori = sg.peak.ori_sg[nc] + peaksf = sg.peak.sf_sg[nc] + ax3.errorbar(sg.orivals, sg.response[:, peaksf, 0, nc, 0], yerr=sg.response[ + :, peaksf, 0, nc, 1], color='blue', fmt='o-', lw=2) + ax3.errorbar(sg.orivals, sg.response[:, peaksf, 1, nc, 0], yerr=sg.response[ + :, peaksf, 1, nc, 1], color='cornflowerblue', fmt='o-', lw=2) + ax3.errorbar(sg.orivals, sg.response[:, peaksf, 2, nc, 0], yerr=sg.response[ + :, peaksf, 2, nc, 1], color='steelblue', fmt='o-', lw=2) + ax3.errorbar(sg.orivals, sg.response[:, peaksf, 3, nc, 0], yerr=sg.response[ + :, peaksf, 3, nc, 1], color='lightskyblue', fmt='o-', lw=2) + ax3.fill_between(sg.orivals, np.repeat(sg.response[0, 0, 0, nc, 0] + sg.response[0, 0, 0, nc, 1], sg.number_ori), np.repeat( + sg.response[0, 0, 0, nc, 0] - sg.response[0, 0, 0, nc, 1], sg.number_ori), color='gray', alpha=0.5) + ax3.axhline(y=sg.response[0, 0, 0, nc, 0], ls='--', color='k', lw=2) + ax3.set_xlim(-10, 160) + ax3.set_xticks(sg.orivals) + ax3.set_xlabel("Orientation (d)", fontsize=20) + ax3.set_ylabel("DF/F (%)", fontsize=20) + + ax4.errorbar(range(5), sg.response[peakori, 1:, 0, nc, 0], yerr=sg.response[ + peakori, 1:, 0, nc, 1], color='blue', fmt='o-', lw=2) + ax4.errorbar(range(5), sg.response[peakori, 1:, 1, nc, 0], yerr=sg.response[ + peakori, 1:, 1, nc, 1], color='cornflowerblue', fmt='o-', lw=2) + ax4.errorbar(range(5), sg.response[peakori, 1:, 2, nc, 0], yerr=sg.response[ + peakori, 1:, 2, nc, 1], color='steelblue', fmt='o-', lw=2) + ax4.errorbar(range(5), sg.response[peakori, 1:, 3, nc, 0], yerr=sg.response[ + peakori, 1:, 3, nc, 1], color='lightskyblue', fmt='o-', lw=2) + ax4.fill_between(range(5), np.repeat(sg.response[0, 0, 0, nc, 0] + sg.response[0, 0, 0, nc, 1], 5), np.repeat( + sg.response[0, 0, 0, nc, 0] - sg.response[0, 0, 0, nc, 1], 5), color='gray', alpha=0.5) + ax4.axhline(y=sg.response[0, 0, 0, nc, 0], ls='--', color='k', lw=2) + ax4.set_xlim(-0.2, 4.2) + ax4.set_xticks(range(5)) + ax4.set_xticklabels(sg.sfvals[1:]) + ax4.set_xlabel("Spatial frequency (cpd)", fontsize=20) + + xtime = np.arange(-1 * sg.interlength / sg.acquisition_rate, (sg.sweeplength + + sg.interlength) / sg.acquisition_rate, 1 / sg.acquisition_rate) + peakori = sg.peak.ori_sg[nc] + peaksf = sg.peak.sf_sg[nc] + peakphase = sg.peak.phase_sg[nc] + subset = sg.sweep_response[(sg.stim_table.orientation == sg.orivals[peakori]) & ( + sg.stim_table.spatial_frequency == sg.sfvals[peaksf]) & (sg.stim_table.phase == sg.phasevals[peakphase])] + subset_p = subset[str(nc)].mean( + ) + (subset[str(nc)].std() / np.sqrt(len(subset[str(nc)]))) + subset_n = subset[str(nc)].mean( + ) - (subset[str(nc)].std() / np.sqrt(len(subset[str(nc)]))) + try: + ax13.fill_between(xtime, subset_p, subset_n, color='b', alpha=0.5) + except: + xtime = xtime[:-1] + ax13.fill_between(xtime, subset_p, subset_n, color='b', alpha=0.5) + blank = sg.sweep_response[(sg.stim_table.orientation == 0) & ( + sg.stim_table.spatial_frequency == 0) & (sg.stim_table.phase == 0)] + blank_p = blank[str(nc)].mean() + \ + (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) + blank_n = blank[str(nc)].mean() - \ + (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) + ax13.fill_between(xtime, blank_p, blank_n, color='gray', alpha=0.5) + ax13.plot(xtime, subset[str(nc)].mean(), color='b', lw=2) + ax13.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) + ax13.axvspan(0, sg.sweeplength / sg.acquisition_rate, + ymin=0, ymax=1, facecolor='gray', alpha=0.3) + ax13.yaxis.set_major_locator(MaxNLocator(4)) + ax13.set_xlabel("Time (s)", fontsize=20) + ax13.set_ylabel("DF/F (%)", fontsize=20) + + Vmax = sg.response[:, 1:, :, nc, 0].max() + ax5.imshow(sg.response[:, 1:, 0, nc, 0], cmap='gray', + interpolation='none', vmin=0, vmax=Vmax) + ax5.set_ylabel("Orientation (d)", fontsize=20) + ax5.set_yticks(range(6)) + ax5.set_yticklabels(sg.orivals) + ax5.set_xlabel("Spatial frequency (cpd)", fontsize=20) + ax5.set_xticks(range(5)) + ax5.set_xticklabels(sg.sfvals[1:]) + ax5.set_title("Phase 0.0", color='blue', fontsize=20) + + ax6.imshow(sg.response[:, 1:, 1, nc, 0], cmap='gray', + interpolation='none', vmin=0, vmax=Vmax) + ax6.set_xlabel("Spatial frequency (cpd)", fontsize=20) + ax6.set_xticks(range(5)) + ax6.set_xticklabels(sg.sfvals[1:]) + ax6.set_yticks(range(6)) + ax6.set_yticklabels(sg.orivals) + ax6.set_title("Phase 0.25", color='cornflowerblue', fontsize=20) + + ax7.imshow(sg.response[:, 1:, 2, nc, 0], cmap='gray', + interpolation='none', vmin=0, vmax=Vmax) + ax7.set_xlabel("Spatial frequency (cpd)", fontsize=20) + ax7.set_xticks(range(5)) + ax7.set_xticklabels(sg.sfvals[1:]) + ax7.set_yticks(range(6)) + ax7.set_yticklabels(sg.orivals) + ax7.set_title("Phase 0.5", color='steelblue', fontsize=20) + + ax8.imshow(sg.response[:, 1:, 3, nc, 0], cmap='gray', + interpolation='none', vmin=0, vmax=Vmax) + ax8.set_xlabel("Spatial frequency (cpd)", fontsize=20) + ax8.set_xticks(range(5)) + ax8.set_xticklabels(sg.sfvals[1:]) + ax8.set_yticks(range(6)) + ax8.set_yticklabels(sg.orivals) + ax8.set_title("Phase 0.75", color='lightskyblue', fontsize=20) + + xtime = np.arange(0, nm1.sweeplength / + nm1.acquisition_rate, 1 / nm1.acquisition_rate) + while len(xtime) > nm1.sweeplength: + xtime = np.delete(xtime, -1) + for index, row in nm1.sweep_response.iterrows(): + ax9.plot(xtime, nm1.sweep_response[str(nc)][index], lw=2) + ax9.set_xlabel("Time (s)", fontsize=20) + ax9.set_ylabel("DF/F", fontsize=20) + ax9.set_title("Natural Movie 1", fontsize=20, color='red') + + temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) + for i in range(len(nm1.stim_table)): + temp[i, :] = nm1.sweep_response[str(nc)].iloc[i] + ax10.imshow(temp, cmap='gray', interpolation='none', aspect=40) + ax10.set_ylabel("Trials", fontsize=20) + ax10.set_xticks([]) + + temp = np.copy(ns.response[1:, nc, :2]) + scene_response = pd.DataFrame(temp, columns=('response', 'error')) + scene_response = scene_response.sort( + columns='response', ascending=False) + ax11.errorbar(range(ns.number_scenes - 1), scene_response.response, + yerr=scene_response.error, fmt='o', color='k') + ax11.fill_between(range(ns.number_scenes - 1), np.repeat(ns.response[0, nc, 0] + ns.response[0, nc, 1], ns.number_scenes - 1), np.repeat( + ns.response[0, nc, 0] - ns.response[0, nc, 1], ns.number_scenes - 1), color='gray', alpha=0.3) + ax11.axhline(y=ns.response[0, nc, 0], ls='--', lw=2, color='k') + ax11.set_xlim(-2, 120) + ax11.set_title("Natural Scenes", fontsize=20, color='blue') + ax11.set_xlabel("Scene", fontsize=20) + ax11.set_ylabel("DF/F (%)", fontsize=20) + + xtime = np.arange(-1 * ns.interlength / ns.acquisition_rate, (ns.sweeplength + + ns.interlength) / ns.acquisition_rate, 1 / ns.acquisition_rate) + nsp = np.argmax(ns.response[1:, nc, 0]) + subset_response = ns.sweep_response[ns.stim_table.frame == nsp] + subset_response_p = subset_response[str(nc)].mean( + ) + (subset_response[str(nc)][:].std() / np.sqrt(len(subset_response[str(nc)]))) + subset_response_n = subset_response[str(nc)].mean( + ) - (subset_response[str(nc)][:].std() / np.sqrt(len(subset_response[str(nc)]))) + try: + ax12.fill_between(xtime, subset_response_p, + subset_response_n, color='b', alpha=0.5) + except: + xtime = xtime[:-1] + ax12.fill_between(xtime, subset_response_p, + subset_response_n, color='b', alpha=0.5) + blank = ns.sweep_response[ns.stim_table.frame == -1] + blank_p = blank[str(nc)].mean() + \ + (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) + blank_n = blank[str(nc)].mean() - \ + (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) + ax12.fill_between(xtime, blank_p, blank_n, color='gray', alpha=0.5) + ax12.plot(xtime, subset_response[str(nc)].mean(), color='b', lw=2) + ax12.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) + ax12.axvspan(0, ns.sweeplength / ns.acquisition_rate, + ymin=0, ymax=1, facecolor='gray', alpha=0.3) + ax12.yaxis.set_major_locator(MaxNLocator(4)) + ax12.set_xlabel("Time (s)", fontsize=20) + ax12.set_ylabel("DF/F (%)", fontsize=20) + + plt.tick_params(labelsize=16) + plt.tight_layout() + filename = 'Cell_' + str(nc + 1) + '_3SB.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() + + +def plot_running_a(dg, nm1, nm3, save_dir): + logging.info("Plotting running data summary") + nc = -1 + plt.figure(1, figsize=(10, 8)) + ax1 = plt.subplot2grid((4, 4), (0, 0), colspan=3) + ax2 = plt.subplot2grid((4, 4), (0, 3)) + ax3 = plt.subplot2grid((4, 4), (1, 0)) + ax4 = plt.subplot2grid((4, 4), (1, 1)) + ax5 = plt.subplot2grid((4, 4), (1, 2)) + ax6 = plt.subplot2grid((4, 4), (2, 0), colspan=2) + ax7 = plt.subplot2grid((4, 4), (3, 0), colspan=2) + ax8 = plt.subplot2grid((4, 4), (2, 2), colspan=2) + ax9 = plt.subplot2grid((4, 4), (3, 2), colspan=2) + + xtime = np.arange(0, np.size(dg.dxcm), 1.) + xtime /= dg.acquisition_rate + dif = np.ediff1d(dg.stim_table.start.values, to_begin=8000, to_end=8000) + test = np.argwhere(dif > 5000) + ax1.plot(xtime, dg.dxcm, color='k') + for i in range(len(test) - 1): + ax1.axvspan(xmin=(dg.stim_table.start.iloc[test[i]].values / dg.acquisition_rate), xmax=( + dg.stim_table.end.iloc[test[i + 1] - 1].values / dg.acquisition_rate), color='gray', alpha=0.3) + ax1.axvspan(xmin=nm1.stim_table.start.min() / nm1.acquisition_rate, xmax=( + (nm1.stim_table.start.max() + nm1.sweeplength) / nm1.acquisition_rate), color='red', alpha=0.3) + dif = np.ediff1d(nm3.stim_table.start.values, to_begin=8000, to_end=8000) + test = np.argwhere(dif > 5000) + for i in range(len(test) - 1): + ax1.axvspan(xmin=(nm3.stim_table.start.iloc[test[i]].values / nm3.acquisition_rate), xmax=( + (nm3.stim_table.end.iloc[test[i + 1] - 1].values + nm3.sweeplength) / nm3.acquisition_rate), color='blue', alpha=0.3) + ax1.set_xlabel("Time (s)", fontsize=20) + ax1.set_ylabel("Speed (cm/s)", fontsize=20) + + dx = dg.dxcm[np.logical_not(np.isnan(dg.dxcm))] + ax2.hist(dx, bins=80, range=(-20, 100), color='gray') + ax2.set_xlabel("Speed (cm/s)", fontsize=20) + + run_peak = np.where(dg.response[:, 1:, nc, 0] + == np.nanmax(dg.response[:, 1:, nc, 0])) + peakori = run_peak[0][0] + peaktf = run_peak[1][0] + 1 + + ax3.errorbar(dg.orivals, dg.response[:, peaktf, nc, 0], yerr=dg.response[ + :, peaktf, nc, 1], fmt='b.-', lw=2) + ax3.fill_between(dg.orivals, np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], dg.number_ori), np.repeat( + dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], dg.number_ori), color='gray', alpha=0.5) + ax3.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k') + ax3.annotate(str(dg.tfvals[peaktf]) + " Hz", + xy=(0, 0.9), xycoords='axes fraction', fontsize=14) + ax3.set_xtick = (dg.orivals) + ax3.set_xlabel("Direction (deg)", fontsize=20) + ax3.set_ylabel("Speed (cm/s)", fontsize=20) + ax3.yaxis.set_major_locator(MaxNLocator(6)) + + ax4.errorbar(dg.tfvals[1:], dg.response[peakori, 1:, nc, 0], yerr=dg.response[ + peakori, 1:, nc, 1], fmt='b.-', lw=2) + ax4.fill_between(dg.tfvals[1:], np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], dg.number_tf - 1), + np.repeat(dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], dg.number_tf - 1), color='gray', alpha=0.5) + ax4.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k') + ax4.annotate(str(dg.orivals[peakori]) + " Deg", + xy=(0, 0.9), xycoords='axes fraction', fontsize=14) + ax4.set_xticks = (dg.tfvals[1:]) + ax4.set_xlabel("Temporal frequency (Hz)", fontsize=20) + ax4.yaxis.set_major_locator(MaxNLocator(6)) + + im = ax5.imshow(dg.response[:, 1:, nc, 0], + cmap='gray', interpolation='none') + ax5.set_ylabel("Direction", fontsize=16) + ax5.set_xlabel("TF", fontsize=16) + ax5.set_yticks(range(dg.number_ori)) + ax5.set_yticklabels(list(dg.orivals.astype(int).astype(str))) + ax5.set_xticks(range(dg.number_tf - 1)) + ax5.set_xticklabels(list(dg.tfvals[1:].astype(int).astype(str))) + cbar = plt.colorbar(im, ax=ax5) + cbar.ax.set_ylabel('Speed (cm/s)', fontsize=8) + for t in cbar.ax.get_yticklabels(): + t.set_fontsize(8) + + xtime = np.arange(0, nm1.sweeplength / + nm1.acquisition_rate, 1 / nm1.acquisition_rate) + while len(xtime) > len(nm1.sweep_response['dx'].mean()): + xtime = np.delete(xtime, -1) + for index, row in nm1.sweep_response.iterrows(): + ax6.plot(xtime, nm1.sweep_response['dx'][index], lw=2) + ax6.set_xlabel("Time (s)", fontsize=20) + ax6.set_ylabel("DF/F", fontsize=20) + ax6.set_title("Natural Movie 1", fontsize=20, color='red') + + temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) + for i in range(len(nm1.stim_table)): + temp[i, :] = nm1.sweep_response['dx'].iloc[i][:, 0] + ax7.imshow(temp, cmap='gray', interpolation='none', aspect=40) + ax7.set_ylabel("Trials", fontsize=20) + ax7.set_xticks([]) + + xtime = np.arange(0, nm3.sweeplength / + nm3.acquisition_rate, 1 / nm3.acquisition_rate) + while len(xtime) > len(nm3.sweep_response['dx'].mean()): + xtime = np.delete(xtime, -1) + for index, row in nm3.sweep_response.iterrows(): + ax8.plot(xtime, nm3.sweep_response['dx'][index], lw=2) + ax8.set_xlabel("Time (s)", fontsize=20) + ax8.set_ylabel("DF/F", fontsize=20) + ax8.set_title("Natural Movie Long", fontsize=20, color='blue') + + temp = np.empty((len(nm3.stim_table), nm3.sweeplength)) + for i in range(len(nm3.stim_table)): + temp[i, :] = nm3.sweep_response['dx'].iloc[i][:, 0] + ax9.imshow(temp, cmap='gray', interpolation='none', aspect=100) + ax9.set_ylabel("Trials", fontsize=20) + ax9.set_xticks([]) + + plt.tick_params(labelsize=16) + plt.tight_layout() + plt.suptitle("Running Summary", fontsize=20) + plt.subplots_adjust(top=0.9) + filename = 'Running Summary.png' + fullfilename = os.path.join(save_dir, filename) + plt.savefig(fullfilename) + plt.close() diff --git a/brain_observatory/chisquare_categorical.py b/brain_observatory/chisquare_categorical.py new file mode 100644 index 0000000000..4400cdc889 --- /dev/null +++ b/brain_observatory/chisquare_categorical.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- +""" +Created on Wed Jun 5 15:52:22 2019 + +@author: dan +""" +# TODO: Fix header + +import numpy as np +import warnings + + +def chisq_from_stim_table(stim_table, + columns, + mean_sweep_events, + num_shuffles=1000, + verbose=False): + # stim_table is a pandas DataFrame with len = num_sweeps + # columns is a list of column names that define the categories (e.g. ['Ori','Contrast']) + # mean_sweep_events is a numpy array with shape (num_sweeps,num_cells) + + sweep_categories = stim_table_to_categories(stim_table,columns,verbose=verbose) + p_vals = compute_chi_shuffle(mean_sweep_events,sweep_categories,num_shuffles=num_shuffles) + + return p_vals + +def compute_chi_shuffle(mean_sweep_events, + sweep_categories, + num_shuffles=1000): + + # mean_sweep_events is a numpy array with shape (num_sweeps,num_cells) + # sweep_conditions is a numpy array with shape (num_sweeps) + # sweep_conditions gives the category label for each sweep + + (num_sweeps,num_cells) = np.shape(mean_sweep_events) + + if len(sweep_categories) != num_sweeps: + warnings.warn('sweep_categories and num_sweeps do not match') + return np.nan + + + sweep_categories_dummy = make_category_dummy(sweep_categories) + + expected = compute_expected(mean_sweep_events,sweep_categories_dummy) + observed = compute_observed(mean_sweep_events,sweep_categories_dummy) + chi_actual = compute_chi(observed,expected) + + chi_shuffle = np.zeros((num_cells,num_shuffles)) + for ns in range(num_shuffles): + shuffle_sweeps = np.random.choice(num_sweeps,size=(num_sweeps,)) + shuffle_sweep_events = mean_sweep_events[shuffle_sweeps] + + shuffle_expected = compute_expected(shuffle_sweep_events,sweep_categories_dummy) + shuffle_observed = compute_observed(shuffle_sweep_events,sweep_categories_dummy) + + chi_shuffle[:,ns] = compute_chi(shuffle_observed,shuffle_expected) + + p_vals = np.mean(chi_actual.reshape(num_cells,1)<chi_shuffle,axis=1) + + return p_vals + +def stim_table_to_categories(stim_table, + columns, + verbose=False): + # get the categories for all sweeps with each unique combination of + # parameters in 'columns' being one category + # sweeps with non-finite values in ANY column (e.g. np.NaN) are labeled + # as blank sweeps (category = -1) + # TODO: Replace with EcephysSession.get_stimulus_conditions + + num_sweeps = len(stim_table) + num_params = len(columns) + + unique_params = [] + options_per_column = [] + max_combination = 1 + for column in columns: + column_params = np.unique(stim_table[column].values) + # column_params = column_params[np.isfinite(column_params)] + unique_params.append(column_params) + options_per_column.append(len(column_params)) + max_combination*=len(column_params) + + category = 0 + sweep_categories = -1*np.ones((num_sweeps,)) + curr_combination = np.zeros((num_params,),dtype=np.int) + options_per_column = np.array(options_per_column).astype(np.int) + all_tried = False + while not all_tried: + + matches_combination = np.ones((num_sweeps,),dtype=np.bool) + for i_col,column in enumerate(columns): + param = unique_params[i_col][curr_combination[i_col]] + matches_param = stim_table[column].values == param + matches_combination *= matches_param + + if np.any(matches_combination): + sweep_categories[matches_combination] = category + if verbose: + print('Category ' + str(category)) + for i_col,column in enumerate(columns): + param = unique_params[i_col][curr_combination[i_col]] + print(column + ': ' + str(param)) + + category+=1 + + #advance the combination + curr_combination = advance_combination(curr_combination,options_per_column) + all_tried = curr_combination[0]==options_per_column[0] + + if verbose: + blank_sweeps = sweep_categories==-1 + print('num blank: ' + str(blank_sweeps.sum())) + + return sweep_categories + +def advance_combination(curr_combination, + options_per_column): + + num_cols = len(curr_combination) + + might_carry = True + col = num_cols-1 + while might_carry: + curr_combination[col] += 1 + if col==0 or curr_combination[col]<options_per_column[col]: + might_carry = False + else: + curr_combination[col] = 0 + col-=1 + + return curr_combination + + +def make_category_dummy(sweep_categories): + #makes a dummy variable version of the sweep category list + + num_sweeps = len(sweep_categories) + categories = np.unique(sweep_categories) + num_categories = len(categories) + + sweep_category_mat = np.zeros((num_sweeps,num_categories),dtype=np.bool) + for i_cat,category in enumerate(categories): + category_idx = np.argwhere(sweep_categories==category)[:,0] + sweep_category_mat[category_idx,i_cat] = True + + return sweep_category_mat + +def compute_observed(mean_sweep_events,sweep_conditions): + + (num_sweeps,num_conditions) = np.shape(sweep_conditions) + num_cells = np.shape(mean_sweep_events)[1] + + observed_mat = (mean_sweep_events.T).reshape(num_cells,num_sweeps,1) * sweep_conditions.reshape(1,num_sweeps,num_conditions) + observed = np.sum(observed_mat,axis=1) + + return observed + +def compute_expected(mean_sweep_events,sweep_conditions): + + num_conditions = np.shape(sweep_conditions)[1] + num_cells = np.shape(mean_sweep_events)[1] + + sweeps_per_condition = np.sum(sweep_conditions,axis=0) + events_per_sweep = np.mean(mean_sweep_events,axis=0) + + expected = sweeps_per_condition.reshape(1,num_conditions) * events_per_sweep.reshape(num_cells,1) + + return expected + +def compute_chi(observed,expected): + + chi = (observed - expected) ** 2 /expected + chi = np.where(expected>0,chi,0.0) + return np.sum(chi,axis=1) + +# %% \ No newline at end of file diff --git a/brain_observatory/circle_plots.py b/brain_observatory/circle_plots.py new file mode 100644 index 0000000000..dff091c0e3 --- /dev/null +++ b/brain_observatory/circle_plots.py @@ -0,0 +1,753 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import math + +try: + xrange +except: + from past.builtins import xrange + +import numpy as np +import pandas as pd +from matplotlib.colors import LinearSegmentedColormap +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches +from matplotlib.collections import PatchCollection, LineCollection +import matplotlib.transforms as mxfms +import matplotlib.colors as mcolors +import skimage.transform +from six import iteritems + + +DEFAULT_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[.7,0,.7,0.0],[.7,0,0,1]]) +DEFAULT_MEAN_RESP_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[0.0,0.0,0.5,0.0],[0.0,0.0,0.5,1]]) +DEFAULT_AXIS_COLOR = (0.8, 0.8, 0.8) +DEFAULT_LABEL_COLOR = (0.8, 0.8, 0.8) +LSN_ON_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[.7,0,.7,0.0],[.7,0,0,1]]) +LSN_OFF_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[0.0,0.7,.7,0.0],[0,0,0.7,1]]) +HEX_POSITIONS = [] + + +def polar_to_xy(angles, radius): + """ Convert an array of angles (in radians) and a radius in polar coordinates + to an array of x,y coordinates. + """ + + x = radius*np.cos(angles) + y = radius*np.sin(angles) + return np.array([x,y]).T + + +def polar_linspace(radius, start_angle, stop_angle, num, endpoint=False, degrees=True): + """ Evenly distributed list of x,y coordinates from an input range of angles + and a radius in polar coordinates. + """ + angles = np.linspace(start_angle, stop_angle, num=num, endpoint=endpoint) + + if degrees is True: + angles *= np.pi / 180.0 + + return polar_to_xy(angles, radius) + + +def spiral_trials(radii, x=0.0, y=0.0): + radii = np.array(radii) + circles = [] + + if radii.size > 0: + spiral = hex_pack(radii[0], len(radii)) + + for i,radius in enumerate(radii): + circles.append(mpatches.Circle((spiral[i][0], spiral[i][1]), radii[i])) + + pos_xfm = mxfms.Affine2D().translate(x,y) + + collection = PatchCollection(circles) + collection.set_transform(pos_xfm) + + return collection + + +def spiral_trials_polar(r, theta, radii, offset=None): + if offset is None: + offset = [0,0] + + collection = spiral_trials(radii, r + offset[0], offset[1]) + + rot_xfm = mxfms.Affine2D().rotate(theta) + collection.set_transform(collection.get_transform() + rot_xfm) + + return collection + + +def angle_lines(angles, inner_radius, outer_radius): + inner_pos = polar_to_xy(angles, inner_radius) + outer_pos = polar_to_xy(angles, outer_radius) + + segments = np.array(list(zip(inner_pos, outer_pos))) + + return LineCollection(segments) + + +def radial_arcs(rs, start_theta, end_theta): + arcs = [] + + for r in rs: + arcs.append(mpatches.Arc((0,0), 2*r, 2*r, + theta1=start_theta*180.0/np.pi, + theta2=end_theta*180.0/np.pi)) + + + return PatchCollection(arcs) + +def rings_in_hex_pack(ct): + return np.ceil((-3.0 + np.sqrt(9.0 - 12.0*(1.0 - ct))) / 6.0 + 1.0) + +def radial_circles(rs): + circles = [ mpatches.Circle((0,0), r) for r in rs ] + + return PatchCollection(circles) + +def reset_hex_pack(): + global HEX_POSITIONS + HEX_POSITIONS = [] + +def hex_pack(radius, n): + global HEX_POSITIONS + + if len(HEX_POSITIONS) < n: + HEX_POSITIONS = build_hex_pack(n) + + return HEX_POSITIONS[:n]*radius*2.0 + +def build_hex_pack(n): + pos = [] + sq32 = math.sqrt(3.0) / 2.0 + + N = 1 + + vs = [ [-0.5, -sq32], [-1.0, 0.0], [-0.5, sq32], [0.5, sq32], [1, 0], [0.5, -sq32] ] + pos.append([0,0]) + while len(pos) < n: + layer_pos = [ ] + + for i,v in enumerate(vs): + x = - N * v[1] * sq32 + y = N * v[0] * sq32 + + if N % 2 == 1: + x -= 0.5 * v[0] + y -= 0.5 * v[1] + + layer_pos.append([]) + layer_pos[i].append([x,y]) + mag = 1 + sign = 1 + + for j in xrange(N-1): + x += v[0] * mag * sign + y += v[1] * mag * sign + mag += 1 + sign = -sign + layer_pos[i].append([x,y]) + + for j in range(N): + for i in range(len(vs)): + if j < len(layer_pos[i]): + pos.append(layer_pos[i][j]) + N+=1 + + return np.array(pos) + + +def polar_line_circles(radii, theta, start_r=0): + circles = [ mpatches.Circle( (0,0), radii[0] ) ] + + line_xfm = mxfms.Affine2D().translate(start_r,0).rotate(theta) + + x = 0 + for ri in range(1, len(radii)): + x += radii[ri-1] + radii[ri] + + circles.append(mpatches.Circle( (x,0), radii[ri] )) + + collection = PatchCollection(circles) + collection.set_transform(line_xfm) + + return collection + + +def wedge_ring(N, inner_radius, outer_radius, start=0, stop=360): + degs = np.linspace(start, stop, N+1, endpoint=True) + wedges = [] + + if stop > start: + for i in range(len(degs)-1): + wedges.append( mpatches.Wedge( (0,0), outer_radius, degs[i], degs[i+1], width=outer_radius-inner_radius ) ) + else: + for i in range(1,len(degs)): + wedges.append( mpatches.Wedge( (0,0), outer_radius, degs[i], degs[i-1], width=outer_radius-inner_radius ) ) + + return PatchCollection(wedges) + + +def add_angle_labels(ax, angles, labels, radius, color=None, fontdict=None, offset=0.05): + angle_pos = polar_to_xy(angles, radius) + + for i in range(len(angle_pos)): + xy = angle_pos[i,:] + u = xy + xy / np.linalg.norm(xy) * offset + ax.text(u[0], u[1], + labels[i], color=color, + horizontalalignment='center', + verticalalignment='center', + fontdict=fontdict) + + +def add_arrow(ax, radius, start_angle, end_angle, color=None, width=18.0): + if color is None: + color = DEFAULT_LABEL_COLOR + + fig = ax.get_figure() + size = fig.get_size_inches() + dpi = fig.get_dpi() + mutation_scale = size[0] * dpi / 500.0 * width + + d_angle = end_angle - start_angle + + start_pos = (radius * np.cos(start_angle), radius * np.sin(start_angle)) + end_pos = (radius * np.cos(end_angle), radius * np.sin(end_angle)) + + connstyle = mpatches.ConnectionStyle.Angle3(angleA=0, angleB=(d_angle*180.0/np.pi)) + arrowstyle = mpatches.ArrowStyle.Simple(tail_width=0.33, head_length=0.66, head_width=1.0) + ax.add_patch(mpatches.FancyArrowPatch(posA=start_pos, posB=end_pos, + arrowstyle=arrowstyle, + connectionstyle=connstyle, + facecolor=color, + linewidth=0, + mutation_scale=mutation_scale)) + +def make_pincushion_plot(data, trials, on, nrows, ncols, clim=None, color_map=None, radius=None): + if radius is None: + max_sweeps = 0 + for sweeps in trials.itervalues(): + max_sweeps = max(max_sweeps, len(sweeps[0])) + + rings = rings_in_hex_pack(max_sweeps) + radius = 0.5 / (2.0 * rings - 1.0) + + if clim is None: + clim = [ data.min(), data.max() ] + + if color_map is None: + color_map = LSN_ON_COLOR_MAP if on else LSN_OFF_COLOR_MAP + + ax = plt.gca() + for (col,row,on_state), sweeps in iteritems(trials): + if on_state != on: + continue + + valid_sweeps = sweeps[0][sweeps[0] < data.size] + responses = np.sort(data[valid_sweeps])[::-1] + responses = responses[responses >= clim[0]] + + if responses.size > 0: + coll = spiral_trials(np.ones(responses.shape)*radius, col+0.5, row+0.5) + coll.set_transform(coll.get_transform() + ax.transData) + coll.set_array(responses) + coll.set_cmap(color_map) + coll.set_clim(clim) + coll.set_linewidths(0) + ax.add_collection(coll) + + ax.set_ylim((0,nrows)) + ax.set_xlim((0,ncols)) + + + +class PolarPlotter( object ): + DIR_CW = -1 + DIR_CCW = 1 + + def __init__(self, + direction=DIR_CW, + angle_start=0, + circle_scale=1.1, + inner_radius=None, + plot_center=(0.0,0.0), + plot_scale=0.9): + + self.plot_scale = plot_scale + self.plot_center = plot_center + + self.angle_transform = np.vectorize(lambda x: ((x + angle_start)*direction)*np.pi/180.0) + self.inner_radius = inner_radius + self.circle_scale = circle_scale + + def finalize(self): + ax = plt.gca() + fig = plt.gcf() + figsize = fig.get_size_inches() + + aspect = figsize[0] / figsize[1] + w = 2.0 / self.plot_scale + h = w / aspect + + bounds = ( self.plot_center[0] - w*.5, + self.plot_center[0] + w*.5, + self.plot_center[1] - h*.5, + self.plot_center[1] + h*.5 ) + + ax.set_xlim(bounds[0], bounds[1]) + ax.set_ylim(bounds[2], bounds[3]) + + plt.subplots_adjust(left=0,right=1,bottom=0,top=1) + + @classmethod + def _clim(self, clim, data): + + if clim is None: + clim = [ data.min(), data.max() ] + + if clim[0] == clim[1]: + clim[0] = 0 + if clim[0] == clim[1]: + clim[1] = 1 + + return clim + + +class TrackPlotter( PolarPlotter ): + def __init__(self, + direction=PolarPlotter.DIR_CW, + angle_start=270.0, + inner_radius=.45, + ring_length=None, + *args, **kwargs): + super(TrackPlotter, self).__init__(direction=direction, + angle_start=angle_start, + inner_radius=inner_radius, + *args, **kwargs) + + self.ring_length = ring_length + + def show_arrow(self, color=None): + start, end = self.angle_transform([0.0, 40.0]) + add_arrow(plt.gca(), self.inner_radius * .85, start, end, color) + + def plot(self, data, + clim=None, + cmap=DEFAULT_COLOR_MAP, + mean_cmap=DEFAULT_MEAN_RESP_COLOR_MAP, + norm=None): + + ax = plt.gca() + + clim = self._clim(clim, data) + if self.ring_length: + data = skimage.transform.resize(data.astype(np.float64), + (data.shape[0], self.ring_length), + mode='constant', + anti_aliasing=False) + + data_mean = data.mean(axis=0) + data = np.vstack((data, data_mean)) + + radii = np.linspace(self.inner_radius, 1.0, data.shape[0]+2) + start,stop = self.angle_transform([0,360])*180.0/np.pi + + if norm is None: + norm = mcolors.PowerNorm(0.5, vmin=clim[0], vmax=clim[1], clip=True) + + for i, row_data in enumerate(data): + inner_radius = radii[i] + + if i < data.shape[0] - 1: + outer_radius = radii[i+1] + ring_cmap = cmap + else: + outer_radius = radii[i+2] + ring_cmap = mean_cmap + + + wedges = wedge_ring(len(row_data), + inner_radius, outer_radius, + start=start, stop=stop) + + wedges.set_array(row_data) + #wedges.set_clim(clim) + wedges.set_cmap(ring_cmap) + wedges.set_norm(norm) + wedges.set_edgecolors((0,0,0,0)) + + ax.add_collection(wedges) + + self.finalize() + + +class CoronaPlotter( PolarPlotter ): + def __init__(self, + angle_start=270, + plot_scale=1.2, + inner_radius=.3, + *args, **kwargs): + super(CoronaPlotter, self).__init__(inner_radius=inner_radius, angle_start=angle_start, plot_scale=plot_scale, *args, **kwargs) + + self.categories = None + self.cat_idx_map = None + + def infer_dims(self, category_data): + self.set_dims(np.sort(np.unique(category_data))) + + def set_dims(self, categories): + self.categories = categories + self.cat_idx_map = dict(zip(categories, range(len(categories)))) + + def show_arrow(self, color=None): + start, end = self.angle_transform([0.0, 40.0]) + add_arrow(plt.gca(), self.inner_radius * .85, start, end, color) + + def show_circle(self, color=None): + if color is None: + color = DEFAULT_LABEL_COLOR + ax = plt.gca() + collection = radial_circles([0.96 * self.inner_radius]) + collection.set_facecolor((0,0,0,0)) + collection.set_edgecolor(color) + collection.set_zorder(1) + ax.add_collection(collection) + + def plot(self, category_data, + data=None, + clim=None, + cmap=DEFAULT_COLOR_MAP): + + ax = plt.gca() + + if self.categories is None: + self.infer_dims(category_data) + + if data is None: + data = np.ones(len(category_data)) + + clim = self._clim(clim, data) + + num_cats = len(self.categories) + hth = 180.0 / num_cats + degs = np.linspace(hth, 360.0-hth, num_cats) + degs = self.angle_transform(degs) + circle_radius = self.inner_radius * abs(np.sin((degs[1] - degs[0]) * .5)) + + radii = np.ones(len(data)) * circle_radius * self.circle_scale + + df = pd.DataFrame({ 'category': category_data }) + gb = df.groupby(['category']) + + for category, trials in iteritems(gb.groups): + idx = self.cat_idx_map[category] + order = np.argsort(data[trials])[::-1] + trial_order = np.array(trials)[order] + + circles = polar_line_circles(radii[trial_order], + degs[idx], + self.inner_radius) + + circles.set_transform(circles.get_transform() + ax.transData) + circles.set_array(data[trial_order]) + circles.set_cmap(cmap) + circles.set_clim(clim) + circles.set_edgecolors((0,0,0,0)) + circles.set_zorder(2) + + ax.add_collection(circles) + + self.finalize() + +class FanPlotter( PolarPlotter ): + def __init__(self, group_scale=0.9, *args, **kwargs): + super(FanPlotter, self).__init__(*args, **kwargs) + + self.group_scale = group_scale + + self.angles = None + self.xangles = None + self.angle_map = None + + self.rs = None + self.radii = None + self.r_radius_map = None + + self.groups = None + self.group_offsets = None + self.group_offset_map = None + + self.group_radius = None + + def infer_dims(self, r_data, angle_data, group_data): + rs = np.sort(np.unique(r_data)) + angles = np.sort(np.unique(angle_data)) + groups = np.sort(np.unique(group_data)) if group_data is not None else None + + self.set_dims(rs, angles, groups) + + def set_dims(self, rs, angles, groups): + self.angles = angles + self.xangles = self.angle_transform(angles) + self.angle_map = dict(zip(self.angles, self.xangles)) + + self.rs = rs + num_rs = len(rs) + + # map r value to radius + if self.inner_radius is None: + self.inner_radius = 1.0 / ( 2 * num_rs ) + + hdr = ( 1.0 - self.inner_radius ) / num_rs / 2.0 + self.radii = np.linspace(self.inner_radius + hdr, + 1.0 - hdr, + num_rs) + + self.r_radius_map = dict(zip(rs, self.radii)) + self.group_radius = hdr * self.group_scale + self.groups = groups if groups is not None else [ np.nan ] + num_groups = len(self.groups) + + # map group to group offset + if num_groups == 1: + self.group_offsets = [ [ 0, 0 ] ] + else: + offset_radius = self.group_radius * self.circle_scale + + self.group_offsets = polar_linspace(offset_radius/np.sqrt(2), + -45, -45-360, num_groups) + + self.group_radius = offset_radius * 0.5 + + self.group_offset_map = dict(zip(self.groups, self.group_offsets)) + + + def show_axes(self, angles=None, radii=None, closed=False, color=None): + ax = plt.gca() + + if self.angles is None: + raise Exception("dimensions not set!") + + if color is None: + color = DEFAULT_AXIS_COLOR + + if angles is None: + angles = self.xangles + + if radii is None: + radii = self.radii + + lines = angle_lines(angles, radii[0], radii[-1]) + lines.set_zorder(1) + lines.set_edgecolors(color) + ax.add_collection(lines) + + if closed: + collection = radial_circles(radii) + else: + collection = radial_arcs(radii, min(angles), max(angles)) + + collection.set_facecolors((0,0,0,0.0)) + collection.set_edgecolors(color) + collection.set_zorder(1) + ax.add_collection(collection) + + + def show_angle_labels(self, angles=None, labels=None, color=None, offset=.05, fontdict=None): + if angles is None: + angles = self.xangles + + if labels is None: + labels = self.angles.astype(int) + + if color is None: + color = DEFAULT_LABEL_COLOR + + add_angle_labels(plt.gca(), angles, labels, 1.0, offset=offset, color=color, fontdict=fontdict) + + + def show_group_labels(self, groups=None, color=None, fontdict=None): + ax = plt.gca() + + if groups is None: + groups = self.groups + + if color is None: + color = DEFAULT_LABEL_COLOR + + r = self.inner_radius*.5 + angle = 90.0 + + x = r * np.cos(angle) + y = r * np.sin(angle) + + for group in groups: + off = self.group_offset_map[group] + + xfm = mxfms.Affine2D().translate(r+off[0]*2.0,off[1]*2.0).rotate(self.angle_transform(angle)) + p = xfm.transform_point([0,0]) + + ax.text(p[0], p[1], + group, color=color, + horizontalalignment='center', + verticalalignment='center', + fontdict=fontdict) + + start_theta = self.angle_transform(angle+20) + end_theta = self.angle_transform(angle-20) + + ax.add_patch(mpatches.Arc((0,0), 2*r, 2*r, + theta1=start_theta*180.0/np.pi, + theta2=end_theta*180.0/np.pi, + color=color)) + + ax.add_collection(LineCollection([[[0, .7*r], [0, 1.3*r]]], color=color)) + + + + + def show_r_labels(self, radii=None, labels=None, color=None, offset=.1, fontdict=None): + ax = plt.gca() + + if radii is None: + radii = self.radii + + if labels is None: + labels = self.rs + + if color is None: + color = DEFAULT_LABEL_COLOR + + if labels is None: + labels = self.rs + + line_th = self.xangles[0] + line_x = radii * np.cos(line_th) + line_y = radii * np.sin(line_th) + for i,(x,y) in enumerate(zip(line_x,line_y)): + ax.text(x, y-offset, + labels[i], color=color, + horizontalalignment='center', + verticalalignment='center', + fontdict=fontdict) + + def plot(self, + r_data, + angle_data, + group_data=None, + data=None, + cmap=DEFAULT_COLOR_MAP, + clim=None, + rmap=None, + rlim=None, + axis_color=None, + label_color=None): + + ax = plt.gca() + + if data is None: + data = np.ones(len(r_data)) + + clim = self._clim(clim, data) + + if rmap is None: + rnorm = np.vectorize(lambda x: 1.0) + else: + if rlim is None: + rlim = clim + norm = mcolors.Normalize(clim[0], clim[1]) + rnorm = np.vectorize(lambda x: rmap(norm(x))) + + if self.angles is None: + self.infer_dims(r_data, angle_data, group_data) + + num_groups = len(self.groups) + num_rs = len(self.rs) + num_angles = len(self.angles) + + df = pd.DataFrame({ 'group': group_data, + 'angle': angle_data, + 'r': r_data }) + + # compute circle radius + trials_per_group = float(len(df)) / num_groups / num_rs / num_angles + rings = rings_in_hex_pack(trials_per_group) + circle_radius = self.group_radius / (2*rings - 1) * self.circle_scale + + gb = df.groupby(['group', 'angle', 'r']) + + for (group, angle, r), trials in iteritems(gb.groups): + responses = np.sort(data[trials])[::-1] + + circles = spiral_trials_polar(self.r_radius_map[r], + self.angle_map[angle], + rnorm(responses) * circle_radius, + offset=self.group_offset_map[group]) + + circles.set_transform(circles.get_transform() + ax.transData) + circles.set_array(responses) + circles.set_cmap(cmap) + circles.set_clim(clim) + circles.set_zorder(2) + circles.set_linewidths(0) + + ax.add_collection(circles) + + self.finalize() + + @staticmethod + def for_static_gratings(): + return FanPlotter(angle_start=180, + plot_scale=0.9, + circle_scale=2.0, + group_scale=0.4, + plot_center=[0,.45], + inner_radius=.2) + + @staticmethod + def for_drifting_gratings(): + return FanPlotter() + + + + + + diff --git a/brain_observatory/comparison_utils.py b/brain_observatory/comparison_utils.py new file mode 100644 index 0000000000..a9b6b1ab22 --- /dev/null +++ b/brain_observatory/comparison_utils.py @@ -0,0 +1,70 @@ +import datetime +import math +from typing import Any, Optional, Set + +import SimpleITK as sitk +import numpy as np +import pandas as pd +import xarray as xr +from pandas.util.testing import assert_frame_equal + + +def compare_fields(x1: Any, x2: Any, err_msg="", + ignore_keys: Optional[Set[str]] = None): + """Helper function to compare if two fields (attributes) + are equal to one another. + + Parameters + ---------- + x1 : Any + The first field + x2 : Any + The other field + err_msg : str, optional + The error message to display if two compared fields do not equal + one another, by default "" (an empty string) + ignore_keys + For dictionary comparison, ignore these keys + """ + if ignore_keys is None: + ignore_keys = set() + + if isinstance(x1, pd.DataFrame): + try: + assert_frame_equal(x1, x2, check_like=True) + except Exception: + print(err_msg) + raise + elif isinstance(x1, np.ndarray): + np.testing.assert_array_almost_equal(x1, x2, err_msg=err_msg) + elif isinstance(x1, xr.DataArray): + xr.testing.assert_allclose(x1, x2) + elif isinstance(x1, (list, tuple)): + assert len(x1) == len(x2) + for i in range(len(x1)): + compare_fields(x1=x1[i], x2=x2[i]) + elif isinstance(x1, (sitk.Image,)): + assert x1.GetSize() == x2.GetSize(), err_msg + assert x1 == x2, err_msg + elif isinstance(x1, (datetime.datetime, pd.Timestamp)): + if isinstance(x1, pd.Timestamp): + x1 = x1.to_pydatetime() + if isinstance(x2, pd.Timestamp): + x2 = x2.to_pydatetime() + time_delta = (x1 - x2).total_seconds() + # Timestamp differences should be less than 60 seconds + assert abs(time_delta) < 60 + elif isinstance(x1, (float,)): + if math.isnan(x1) or math.isnan(x2): + both_nan = (math.isnan(x1) and math.isnan(x2)) + assert both_nan, err_msg + else: + assert x1 == x2, err_msg + elif isinstance(x1, (dict,)): + for key in set(x1.keys()).union(set(x2.keys())): + if key in ignore_keys: + continue + key_err_msg = f"Mismatch when checking key {key}. {err_msg}" + compare_fields(x1[key], x2[key], err_msg=key_err_msg) + else: + assert x1 == x2, err_msg diff --git a/brain_observatory/demixer.py b/brain_observatory/demixer.py new file mode 100644 index 0000000000..e661d035b7 --- /dev/null +++ b/brain_observatory/demixer.py @@ -0,0 +1,411 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from typing import Tuple, Optional +import os +import logging + +import numpy as np +import scipy.sparse as sparse +import scipy.linalg as linalg +import matplotlib.pyplot as plt +import matplotlib.colors as colors + +import allensdk.internal.brain_observatory.mask_set as mask_set +from allensdk.config.manifest import Manifest + + +def identify_valid_masks(mask_array): + ms = mask_set.MaskSet(masks=mask_array.astype(bool)) + valid_masks = np.ones(mask_array.shape[0]).astype(bool) + + # detect duplicates + duplicates = ms.detect_duplicates(overlap_threshold=0.9) + if len(duplicates) > 0: + valid_masks[duplicates.keys()] = False + + # detect unions, only for remaining valid masks + valid_idxs = np.where(valid_masks) + ms = mask_set.MaskSet(masks=mask_array[valid_idxs].astype(bool)) + unions = ms.detect_unions() + + if len(unions) > 0: + un_idxs = unions.keys() + valid_masks[valid_idxs[0][un_idxs]] = False + + return valid_masks + + +def _demix_point(source_frame: np.ndarray, mask_traces: np.ndarray, + flat_masks: sparse, + pixels_per_mask: np.ndarray) -> Optional[np.ndarray]: + """ + Helper function to run demixing for single point in time for a + source with overlapping traces. + + Parameters + ========== + source_frame: values of movie source at the single time point, + unraveled in the x-y dimension (1d array of length HxW ) + flat_masks: 2d-array of binary masks unraveled in the x-y dimension + mask traces: values of mask trace at single time point (1d-array of + length n, where `n` is number of masks) + pixels_per_mask: Number of pixels for each mask associated with + trace (1d-array of length `n`) + + Returns + ======= + Array of demixed trace values for each mask if all trace data is + nonzero. Otherwise, returns None. + """ + mask_weighted_trace = mask_traces * pixels_per_mask + + # Skip if there is zero signal anywhere in one of the traces + if (mask_weighted_trace == 0).any(): + return None + norm_mat = sparse.diags(pixels_per_mask / mask_weighted_trace, offsets=0) + source_mat = sparse.diags(source_frame, offsets=0) + source_mask_projection = flat_masks.dot(source_mat) + weighted_masks = norm_mat.dot(source_mask_projection) + # cast to dense numpy array for linear solver because solution is dense + overlap = flat_masks.dot(weighted_masks.T).toarray() + try: + demix_traces = linalg.solve(overlap, mask_weighted_trace) + except linalg.LinAlgError: + logging.warning("Singular matrix, using least squares to solve.") + x, _, _, _ = linalg.lstsq(overlap, mask_weighted_trace) + demix_traces = x + return demix_traces + + +def demix_time_dep_masks(raw_traces: np.ndarray, stack: np.ndarray, + masks: np.ndarray, + max_block_size: int = 1000) -> Tuple[np.ndarray, list]: + """ + Demix traces of potentially overlapping masks extraced from a single + 2p recording. + + :param raw_traces: 2d array of traces for each mask, of dimensions + (n, t), where `t` is the number of time points and `n` is the + number of masks. + :param stack: 3d array representing a 1p recording movie, of + dimensions (t, H, W) or corresponding hdf5 dataset. + :param masks: 3d array of binary roi masks, of shape (n, H, W), + where `n` is the number of masks, and HW are the dimensions of + an individual frame in the movie `stack`. + :max_block_size: int representing maximum number of movie frames to read + at a time (-1 for full length `t` of `stack`) (the default is 1000) + :return: Tuple of demixed traces and whether each frame was skipped + in the demixing calculation. + """ + N, T = raw_traces.shape + _, x, y = masks.shape + P = x * y + + if max_block_size == -1: + max_block_size = T + elif max_block_size < 1: + raise ValueError("Invalid maximum block size {}. Must be strictly " + "positive (>= 1), or -1 for full length block " + "size.".format(max_block_size)) + + num_pixels_in_mask = np.sum(masks, axis=(1, 2)) + + flat_masks = masks.reshape(N, P) + flat_masks = sparse.csr_matrix(flat_masks) + + drop_frames = [] + demix_traces = np.zeros((N, T)) + + for t in range(T): + + block_t = t % max_block_size + if block_t == 0: # load next block into memory and reshape + block_T = np.min([(T - t), max_block_size]) + stack_block = stack[t : t+block_T].reshape(block_T, P) + + demixed_point = _demix_point( + stack_block[block_t], raw_traces[:, t], flat_masks, + num_pixels_in_mask) + if demixed_point is not None: + demix_traces[:, t] = demixed_point + drop_frames.append(False) + else: + drop_frames.append(True) + return demix_traces, drop_frames + + +def plot_traces(raw_trace, demix_trace, roi_id, roi_ind, save_file): + fig, ax = plt.subplots() + + ax.plot(raw_trace, label='Fluoresence') + ax.plot(demix_trace, label='Demixed') + ax.set_title("ROI ID(%d) index (%d)" % (roi_id, roi_ind)) + ax.legend() + plt.savefig(save_file) + plt.close(fig) + + +def find_zero_baselines(traces): + means = traces.mean(axis=1) + stds = traces.std(axis=1) + return np.where((means-stds) < 0) + + +def plot_negative_baselines(raw_traces, demix_traces, mask_array, + roi_ids_mask, plot_dir, ext='png'): + N, T = raw_traces.shape + _, x, y = mask_array.shape + + logging.debug("finding negative baselines") + neg_inds = find_negative_baselines(demix_traces)[0] + + overlap_inds = set() + logging.debug("detected negative baselines: %s", str(neg_inds)) + for roi_ind in neg_inds: + Manifest.safe_mkdir(plot_dir) + + save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative.' + ext) + plot_traces(raw_traces[roi_ind], demix_traces[roi_ind], roi_ids_mask[roi_ind], roi_ind, save_file) + + ''' plot overlapping masks ''' + save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative_masks.' + ext) + roi_overlap_inds = plot_overlap_masks_lengthOne(roi_ind, mask_array, save_file) + + overlap_inds.update(roi_overlap_inds) + + zero_inds = find_zero_baselines(demix_traces)[0] + logging.debug("detected zero baselines: %s", str(zero_inds)) + overlap_inds.update(zero_inds) + + return list(overlap_inds) + + +def plot_negative_transients(raw_traces, demix_traces, valid_roi, mask_array, + roi_ids_mask, plot_dir, ext='png'): + + N, T = raw_traces.shape + _, x, y = mask_array.shape + + logging.debug("finding negative transients") + trans_ind_list1 = [find_negative_transients_threshold(trace=demix_traces[n]) for n in range(N)] + rois_with_trans1 = [i for i in range(N) if len(trans_ind_list1[i]) > 0] + rois_with_trans = np.unique(rois_with_trans1) + rois_with_trans = [r for r in rois_with_trans if len(trans_ind_list1[r][0]) > 0] + + logging.debug("plotting negative transients") + + flat_masks = mask_array.reshape(N, x*y) + overlap = flat_masks.dot(flat_masks.T) + overlap ^= np.diag(np.diag(overlap)) + + for roi_ind in rois_with_trans: + + ''' plot biggest negative transient of this roi ''' + trans_ind_list = trans_ind_list1[roi_ind] + + trans_ind_list = trans_ind_list[0] + trans_list = [] + for i in trans_ind_list: + if i > 100 and i < T - 100: + trans_list.append(demix_traces[roi_ind, i - 100:i + 100]) + elif i > 100 and i >= T - 100: + trans_list.append(demix_traces[roi_ind, i - 100:]) + else: + trans_list.append(demix_traces[roi_ind, :i + 100]) + + # trans_list = [demix_traces[roi_ind, i-100:i+100] for i in trans_ind_list if i > 100 and i < Nt] + Ntrans = len(trans_list) + biggest_trans = 0 + for i in range(1, Ntrans): + if np.amin(trans_list[i]) < np.amin(trans_list[biggest_trans]): + biggest_trans = i + + trans_ind = trans_ind_list[biggest_trans] + + # trans_ind_list = np.concatenate((trans_ind_list1[roi_ind][0], trans_ind_list2[roi_ind][0])) + # trans_list_min = np.where(demix_traces[roi_ind, trans_ind_list] == min(demix_traces[roi_ind, trans_ind_list]))[0] + + if np.sum(overlap[roi_ind]) > 0: + + if valid_roi[roi_ind]: + + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_valid.' + ext) + plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) + + ''' plot overlapping masks ''' + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_valid.' + ext) + plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) + # plot_overlap_masks(roi_ind, mask_test, savefile) + else: + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_invalid.' + ext) + plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) + + ''' plot overlapping masks ''' + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_invalid.' + ext) + plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) + # plot_overlap_masks(roi_ind, mask_test, savefile) + # + else: + continue + + return rois_with_trans + + +def rolling_window(trace, window=500): + ''' + + :param trace: + :param window: + :return: + ''' + + shape = trace.shape[:-1] + (trace.shape[-1] - window + 1, window) + strides = trace.strides + (trace.strides[-1], ) + + return np.lib.stride_tricks.as_strided(trace, shape=shape, strides=strides) + + +def find_negative_baselines(trace): + means = trace.mean(axis=1) + stds = trace.std(axis=1) + return np.where((means+stds) < 0) + + +def find_negative_transients_threshold(trace, window=500, length=10, std_devs=3): + trace = np.pad(trace, pad_width=(window-1, 0), mode='constant', constant_values=[np.mean(trace[:window])]) + rolling_mean = np.mean(rolling_window(trace, window), -1) + rolling_std = np.std(rolling_window(trace, window), -1) + + below_thresh = (trace[window-1:] < rolling_mean - std_devs*rolling_std) + below_thresh = np.pad(below_thresh, pad_width=(window-1, 0), mode='constant') + trans_length = np.sum(rolling_window(below_thresh, length), -1) + trans_length = trans_length[window-length:] + + trans_ind = np.where(trans_length == length) + + return trans_ind + + +def plot_overlap_masks_lengthOne(roi_ind, masks, savefile=None, weighted=False): + + masks = np.array(masks).astype(float) + N, x, y = masks.shape + if np.sum(masks[-1]) == x*y: + masks = masks[:-1] + N -= 1 + + flat_masks = masks.reshape(N, x*y) + masks_overlap = flat_masks.dot(flat_masks.T) + + ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with + for i in ind_plot: # rois that overlap with each roi k + ind_k = np.where(masks_overlap[i, :] > 0)[0] + ind_plot = np.concatenate((ind_plot, ind_k)) + + ind_plot = np.unique(ind_plot) + ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) + + plt.figure() + color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] + Ncol = len(color_list) + for num, i in enumerate(ind_plot): + mask_plot = masks[i] + if not weighted: + mask_plot = ((num % Ncol)+1)*np.ma.array(masks[i], mask=(masks[i] == 0)) + plt.imshow(mask_plot, clim=(1., Ncol+1), cmap=colors.ListedColormap(color_list), alpha=0.5, interpolation='nearest') + # plt.imshow(mask_plot, clim=(1., len(ind_plot)), alpha=.5) + + elif weighted: + mask_plot = np.ma.array(masks[i], mask=(masks[i] == 0)) + plt.imshow(mask_plot, cmap='gray_r', alpha=.5, interpolation='nearest') + + plt.text(np.mean(np.where(np.sum(mask_plot, axis=0))), np.mean(np.where(np.sum(mask_plot, axis=1))) ,str(i)) + + mask_tot = np.sum(masks[ind_plot, :, :], axis=0) + mask_x = np.sum(mask_tot, axis=0) + mask_y = np.sum(mask_tot, axis=1) + + plt.xlim((np.amin(np.where(mask_x))-5, np.amax(np.where(mask_x))+5)) + plt.ylim((np.amin(np.where(mask_y))-5, np.amax(np.where(mask_y))+5)) + plt.title('Masks') + + if savefile is not None: + plt.savefig(savefile) + plt.close() + + return ind_plot + + +def plot_transients(roi_ind, t_trans, masks, traces, demix_traces, savefile): + + masks = np.array(masks).astype(float) + N, x, y = masks.shape + _, Nt = traces.shape + + flat_masks = masks.reshape(N, x*y) + masks_overlap = flat_masks.dot(flat_masks.T) + + ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with + for i in ind_plot: # rois that overlap with each roi k + ind_k = np.where(masks_overlap[i, :] > 0)[0] + ind_plot = np.concatenate((ind_plot, ind_k)) + + ind_plot = np.unique(ind_plot) + ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) + + if t_trans > 150 and t_trans < Nt - 150: + plot_t = range(t_trans - 150, t_trans + 150) + elif t_trans > 150 and t_trans >= Nt - 150: + plot_t = range(t_trans - 150, Nt) + else: + plot_t = range(0, t_trans + 150) + + fig, ax = plt.subplots(1, 2, figsize=(12, 6), sharex=True, sharey=True) + color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] + Ncol = len(color_list) + + for num, i in enumerate(ind_plot): + ax[0].plot(plot_t, traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) + ax[1].plot(plot_t, demix_traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) + + ax[0].set_title('Raw') + ax[0].set_ylabel('Fluorescence') + ax[1].set_title('Demixed') + ax[1].set_xlabel('Time') + ax[0].legend(loc=0) + + plt.savefig(savefile) + plt.close(fig) diff --git a/brain_observatory/dff.py b/brain_observatory/dff.py new file mode 100644 index 0000000000..a41dc6eb7c --- /dev/null +++ b/brain_observatory/dff.py @@ -0,0 +1,423 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +import os +import argparse +import matplotlib.pyplot as plt +import warnings +import h5py +import numpy as np +from functools import partial +from scipy.ndimage.filters import median_filter + +from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet + +GAUSSIAN_MAD_STD_SCALE = 1.4826 + + +def movingmode_fast(x, kernelsize, y): + """Compute the windowed mode of an array. A running mode is initialized + with a histogram of values over the initial kernelsize/2 values. The mode + is then updated as the kernel moves by adding and subtracting values from + the histogram. + + Parameters + ---------- + x : np.ndarray + Array to be analyzed + kernelsize : int + Size of the moving window + y : np.ndarray + Output array to store the results + """ + + # offset so that the trace is non-negative + minval = min(x.min(), 0) + if minval < 0: + x = x - minval + + maxval = x.max() + + # compute a histogram of a half kernel + halfsize = int(kernelsize / 2) + histo = np.bincount(np.rint(x[:halfsize]).astype( + np.uint32), minlength=int(maxval + 2)) + + # find the mode of the first half kernel + mode = np.argmax(histo) + + # here initial mode is available + for m in range(0, halfsize): + q = int(round(x[halfsize + m])) + + histo[q] += 1 + + if histo[q] > histo[mode]: + mode = q + + y[m] = mode + + for m in range(halfsize, x.shape[0] - halfsize): + p = int(round(x[m - halfsize])) + histo[p] -= 1 + + # need to find possibly new mode value + if p == mode: + mode = np.argmax(histo) + + q = int(round(x[m + halfsize])) + + histo[q] += 1 + + if histo[q] > histo[mode]: + mode = q + + y[m] = mode + + for m in range(x.shape[0] - halfsize, x.shape[0]): + p = int(round(x[m - halfsize])) + histo[p] -= 1 + + # need to find possibly new mode value + if p == mode: + mode = np.argmax(histo) + + y[m] = mode + + # undo the offset + if minval < 0: + y += minval + + return 0 + + +def movingaverage(x, kernelsize, y): + """Compute the windowed average of an array. + + Parameters + ---------- + x : np.ndarray + Array to be analyzed + kernelsize : int + Size of the moving window + y : np.ndarray + Output array to store the results + """ + + halfsize = int(kernelsize / 2) + sumkernel = np.sum(x[0:halfsize]) + for m in range(0, halfsize): + sumkernel = sumkernel + x[m + halfsize] + y[m] = sumkernel / (halfsize + m) + + sumkernel = np.sum(x[0:kernelsize]) + for m in range(halfsize, x.shape[0] - halfsize): + sumkernel = sumkernel - x[m - halfsize] + x[m + halfsize] + y[m] = sumkernel / kernelsize + + for m in range(x.shape[0] - halfsize, x.shape[0]): + sumkernel = sumkernel - x[m - halfsize] + y[m] = sumkernel / (halfsize - 1 + (x.shape[0] - m)) + + return 0 + + +def plot_onetrace(dff, fc): + """Debug plotting function""" + qs = np.rint(np.linspace(0, len(dff), 5)).astype(int) + + dff_max = dff.max() + dff_min = dff.min() + fc_max = fc.max() + fc_min = fc.min() + + for qi in range(len(qs) - 1): + r = qs[qi], qs[qi + 1] + + frames = np.arange(r[0], r[1]) + ax = plt.subplot(len(qs), 1, qi + 1) + ax.plot(frames, dff[r[0]:r[1]], 'g') + ax.set_ylim(dff_min, dff_max) + ax.set_xlim(r[0], r[1]) + ax.set_xlabel('frames', fontsize=18) + ax.set_ylabel('DF/F', fontsize=18, color='g') + + ax = ax.twinx() + ax.plot(frames, fc[r[0]:r[1]], 'b') + ax.set_ylim(fc_min, fc_max) + ax.set_xlim(r[0], r[1]) + ax.set_ylabel('FC', fontsize=18, color='b') + + return 0 + + +def compute_dff_windowed_mode(traces, + mode_kernelsize=5400, + mean_kernelsize=3000): + """Compute dF/F of a set of traces using a low-pass windowed-mode operator. + + The operation is basically: + + T_mm = windowed_mean(windowed_mode(T)) + + T_dff = (T - T_mm) / T_mm + + Parameters + ---------- + traces : np.ndarray + 2D array of traces to be analyzed. + mode_kernelsize : int + Window size to use for windowed_mode. + mean_kernelsize : int + Window size to use for windowed_mean. + + Returns + ------- + dff : np.ndarray + 2D array of dF/F traces. + """ + if mode_kernelsize >= traces.shape[1]: + mode_kernelsize = traces.shape[1] // 2 + logging.warning("Changing mode_kernelsize to " + str(mode_kernelsize)) + + if mean_kernelsize >= traces.shape[1]: + mean_kernelsize = traces.shape[1] // 4 + logging.warning("Changing mean_kernelsize to " + str(mean_kernelsize)) + + if mode_kernelsize == 0 or mean_kernelsize == 0: + raise ValueError("Kernel length is 0!") + + logging.debug("trace matrix shape: %d %d" % + (traces.shape[0], traces.shape[1])) + + modeline = np.zeros(traces.shape[1]) + modelineLP = np.zeros(traces.shape[1]) + dff = np.zeros((traces.shape[0], traces.shape[1])) + + logging.debug("computing df/f") + + for n in range(0, traces.shape[0]): + if np.any(np.isnan(traces[n])): + logging.warning( + "trace for roi %d contains NaNs, setting to NaN", n) + dff[n, :] = np.nan + continue + + movingmode_fast(traces[n, :], mode_kernelsize, modeline[:]) + movingaverage(modeline[:], mean_kernelsize, modelineLP[:]) + dff[n, :] = (traces[n, :] - modelineLP[:]) / modelineLP[:] + + logging.debug("finished trace %d/%d" % (n + 1, traces.shape[0])) + + return dff + + +def compute_dff_windowed_median(traces, + median_kernel_long=5401, + median_kernel_short=101, + noise_stds=None, + n_small_baseline_frames=None, + **kwargs): + """Compute dF/F of a set of traces with median filter detrending. + + The operation is basically: + + T_long = windowed_median(T) # long timescale kernel + + T_dff1 = (T - T_long) / elementwise_max(T_long, noise_std(T)) + + T_short = windowed_median(T_dff1) # short timescale kernel + + T_dff = T_dff1 - elementwise_min(T_short, 2.5*noise_std(T_dff1)) + + Parameters + ---------- + traces : np.ndarray + 2D array of traces to be analyzed. + median_kernel_long : int + Window size to use for long timescale median detrending. + median_kernel_short : int + Window size to use for short timescale median detrending. + noise_stds : list + List that will contain noise_std(T_dff1) for each trace. The + value for each trace will be appended to the list if provided. + n_small_baseline_frames : list + List that will contain the number of frames for each trace where + the long-timescale median window is less than noise_std(T). The + value for each trace will be appended to the list if provided. + kwargs: + Additional keyword arguments are passed to :func:`noise_std` . + + Returns + ------- + dff : np.ndarray + 2D array of dF/F traces. + """ + _check_kernel(median_kernel_long, traces.shape[1]) + _check_kernel(median_kernel_short, traces.shape[1]) + + dff_traces = np.copy(traces) + + for dff in dff_traces: + sigma_f = noise_std(dff, **kwargs) + + # long timescale median filter for baseline subtraction + tf = median_filter(dff, median_kernel_long, mode='constant') + dff -= tf + dff /= np.maximum(tf, sigma_f) + + if n_small_baseline_frames is not None: + n_small_baseline_frames.append(np.sum(tf <= sigma_f)) + + sigma_dff = noise_std(dff, **kwargs) + if noise_stds is not None: + noise_stds.append(sigma_dff) + + # short timescale detrending + tf = median_filter(dff, median_kernel_short, mode='constant') + tf = np.minimum(tf, 2.5*sigma_dff) + dff -= tf + + return dff_traces + + +def _check_kernel(kernel_size, data_size): + if kernel_size % 2 == 0 or kernel_size <= 0 or kernel_size >= data_size: + raise ValueError("Invalid kernel length {} for data length {}. Kernel " + "length must be positive and odd, and less than data " + "length.".format(kernel_size, data_size)) + + +def noise_std(x, noise_kernel_length=31, positive_peak_scale=1.5, + outlier_std_scale=2.5): + """Robust estimate of the standard deviation of the trace noise.""" + _check_kernel(noise_kernel_length, len(x)) + if any(np.isnan(x)): + return np.NaN + x = x - median_filter(x, noise_kernel_length, mode='constant') + # first pass removing big pos peak outliers + x = x[x < positive_peak_scale*np.abs(x.min())] + rstd = robust_std(x) + # second pass removing remaining pos and neg peak outliers + x = x[abs(x) < outlier_std_scale*rstd] + return robust_std(x) + + +def robust_std(x): + """Robust estimate of standard deviation. + + Estimate of the standard deviation using the median absolute + deviation of x. + """ + median_absolute_deviation = np.median(np.abs(x - np.median(x))) + return GAUSSIAN_MAD_STD_SCALE*median_absolute_deviation + + +def calculate_dff(traces, dff_computation_cb=None, save_plot_dir=None): + """Apply dF/F computation to a set of traces. + + The default computation method is :func:`compute_dff_windowed_median` + using default window parameters. + + Parameters + ---------- + traces : np.ndarray + 2D array of traces to be analyzed. + dff_computation_cb : function + Function that takes traces as an argument and returns an array + of the same shape that is the calculated dF/F. + save_plot_dir : str + Directory to save dF/F plots to. By default no plots are saved. + + Returns + ------- + dff : np.ndarray + 2D array of dF/F traces. + """ + if dff_computation_cb is None: + dff_computation_cb = compute_dff_windowed_median + + dff = dff_computation_cb(traces) + + if save_plot_dir is not None: + if not os.path.exists(save_plot_dir): + os.makedirs(save_plot_dir) + + for n in range(0, traces.shape[0]): + if np.any(np.isnan(traces[n])): + continue + + fig = plt.figure(figsize=(150, 40)) + plot_onetrace(dff[n, :], traces[n, :]) + + plt.title('ROI ' + str(n) + ' ', fontsize=18) + fig.savefig(os.path.join(save_plot_dir, 'dff_%d.png' % + n), orientation='landscape') + plt.close(fig) + + return dff + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input_h5") + parser.add_argument("output_h5") + parser.add_argument("--plot_dir") + parser.add_argument("--log_level", default=logging.INFO) + + args = parser.parse_args() + + logging.getLogger().setLevel(args.log_level) + + # read from "data" + if args.input_h5.endswith("nwb"): + timestamps, traces = BrainObservatoryNwbDataSet( + args.input_h5).get_corrected_fluorescence_traces() + else: + input_h5 = h5py.File(args.input_h5, "r") + traces = input_h5["data"].value + input_h5.close() + + dff = calculate_dff(traces, save_plot_dir=args.plot_dir) + + # write to "data" + output_h5 = h5py.File(args.output_h5, "w") + output_h5["data"] = dff + output_h5.close() + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/drifting_gratings.py b/brain_observatory/drifting_gratings.py new file mode 100644 index 0000000000..7e2a72e9cb --- /dev/null +++ b/brain_observatory/drifting_gratings.py @@ -0,0 +1,505 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .stimulus_analysis import StimulusAnalysis +import scipy.stats as st +import pandas as pd +import numpy as np +import h5py +from math import sqrt +import logging +from . import observatory_plots as oplots +from . import circle_plots as cplots +from .brain_observatory_exceptions import MissingStimulusException +import matplotlib.pyplot as plt + +class DriftingGratings(StimulusAnalysis): + """ Perform tuning analysis specific to drifting gratings stimulus. + + Parameters + ---------- + data_set: BrainObservatoryNwbDataSet object + """ + + _log = logging.getLogger('allensdk.brain_observatory.drifting_gratings') + + def __init__(self, data_set, **kwargs): + super(DriftingGratings, self).__init__(data_set, **kwargs) + + self.sweeplength = 60 + self.interlength = 30 + self.extralength = 0 + + self._orivals = DriftingGratings._PRELOAD + self._tfvals = DriftingGratings._PRELOAD + self._number_ori = DriftingGratings._PRELOAD + self._number_tf = DriftingGratings._PRELOAD + + @property + def orivals(self): + if self._orivals is DriftingGratings._PRELOAD: + self.populate_stimulus_table() + + return self._orivals + + @property + def tfvals(self): + if self._tfvals is DriftingGratings._PRELOAD: + self.populate_stimulus_table() + + return self._tfvals + + @property + def number_ori(self): + if self._number_ori is DriftingGratings._PRELOAD: + self.populate_stimulus_table() + + return self._number_ori + + @property + def number_tf(self): + if self._number_tf is DriftingGratings._PRELOAD: + self.populate_stimulus_table() + + return self._number_tf + + def populate_stimulus_table(self): + stimulus_table = self.data_set.get_stimulus_table('drifting_gratings') + self._stim_table = stimulus_table.fillna(value=0.) + self._orivals = np.unique(self.stim_table.orientation).astype(int) + self._tfvals = np.unique(self.stim_table.temporal_frequency).astype(int) + self._number_ori = len(self.orivals) + self._number_tf = len(self.tfvals) + + def get_response(self): + ''' Computes the mean response for each cell to each stimulus condition. Return is + a (# orientations, # temporal frequencies, # cells, 3) np.ndarray. The final dimension + contains the mean response to the condition (index 0), standard error of the mean of the response + to the condition (index 1), and the number of trials with a significant response (p < 0.05) + to that condition (index 2). + + Returns + ------- + Numpy array storing mean responses. + ''' + DriftingGratings._log.info("Calculating mean responses") + + response = np.empty( + (self.number_ori, self.number_tf, self.numbercells + 1, 3)) + + def ptest(x): + return len(np.where(x < (0.05 / (8 * 5)))[0]) + + for ori in self.orivals: + ori_pt = np.where(self.orivals == ori)[0][0] + for tf in self.tfvals: + tf_pt = np.where(self.tfvals == tf)[0][0] + subset_response = self.mean_sweep_response[ + (self.stim_table.temporal_frequency == tf) & (self.stim_table.orientation == ori)] + subset_pval = self.pval[(self.stim_table.temporal_frequency == tf) & ( + self.stim_table.orientation == ori)] + response[ori_pt, tf_pt, :, 0] = subset_response.mean(axis=0) + response[ori_pt, tf_pt, :, 1] = subset_response.std( + axis=0) / sqrt(len(subset_response)) + response[ori_pt, tf_pt, :, 2] = subset_pval.apply( + ptest, axis=0) + return response + + def get_peak(self): + ''' Computes metrics related to each cell's peak response condition. + + Returns + ------- + Pandas data frame containing the following columns (_dg suffix is + for drifting grating): + * ori_dg (orientation) + * tf_dg (temporal frequency) + * reliability_dg + * osi_dg (orientation selectivity index) + * dsi_dg (direction selectivity index) + * peak_dff_dg (peak dF/F) + * ptest_dg + * p_run_dg + * run_modulation_dg + * cv_dg (circular variance) + ''' + DriftingGratings._log.info('Calculating peak response properties') + + peak = pd.DataFrame(index=range(self.numbercells), columns=('ori_dg', 'tf_dg', 'reliability_dg', + 'osi_dg', 'dsi_dg', 'peak_dff_dg', + 'ptest_dg', 'p_run_dg', 'run_modulation_dg', + 'cv_os_dg', 'cv_ds_dg', 'tf_index_dg', + 'cell_specimen_id')) + cids = self.data_set.get_cell_specimen_ids() + + orivals_rad = np.deg2rad(self.orivals) + for nc in range(self.numbercells): + cell_peak = np.where(self.response[:, 1:, nc, 0] == np.nanmax( + self.response[:, 1:, nc, 0])) + prefori = cell_peak[0][0] + preftf = cell_peak[1][0] + 1 + peak.cell_specimen_id.iloc[nc] = cids[nc] + peak.ori_dg.iloc[nc] = prefori + peak.tf_dg.iloc[nc] = preftf + + pref = self.response[prefori, preftf, nc, 0] + orth1 = self.response[np.mod(prefori + 2, 8), preftf, nc, 0] + orth2 = self.response[np.mod(prefori - 2, 8), preftf, nc, 0] + orth = (orth1 + orth2) / 2 + null = self.response[np.mod(prefori + 4, 8), preftf, nc, 0] + + tuning = self.response[:, preftf, nc, 0] + tuning = np.where(tuning>0, tuning, 0) + #new circular variance below + CV_top_os = np.empty((8), dtype=np.complex128) + CV_top_ds = np.empty((8), dtype=np.complex128) + for i in range(8): + CV_top_os[i] = (tuning[i]*np.exp(1j*2*orivals_rad[i])) + CV_top_ds[i] = (tuning[i]*np.exp(1j*orivals_rad[i])) + peak.cv_os_dg.iloc[nc] = np.abs(CV_top_os.sum())/tuning.sum() + peak.cv_ds_dg.iloc[nc] = np.abs(CV_top_ds.sum())/tuning.sum() + + peak.osi_dg.iloc[nc] = (pref - orth) / (pref + orth) + peak.dsi_dg.iloc[nc] = (pref - null) / (pref + null) + peak.peak_dff_dg.iloc[nc] = pref + + groups = [] + for ori in self.orivals: + for tf in self.tfvals[1:]: + groups.append(self.mean_sweep_response[(self.stim_table.temporal_frequency == tf) & ( + self.stim_table.orientation == ori)][str(nc)]) + groups.append(self.mean_sweep_response[ + self.stim_table.temporal_frequency == 0][str(nc)]) + _, p = st.f_oneway(*groups) + peak.ptest_dg.iloc[nc] = p + + subset = self.mean_sweep_response[(self.stim_table.temporal_frequency == self.tfvals[ + preftf]) & (self.stim_table.orientation == self.orivals[prefori])] + #running modulation + subset_stat = subset[subset.dx < 1] + subset_run = subset[subset.dx >= 1] + if (len(subset_run) > 2) & (len(subset_stat) > 2): + (_,peak.p_run_dg.iloc[nc]) = st.ttest_ind(subset_run[str(nc)], subset_stat[str(nc)], equal_var=False) + + if subset_run[str(nc)].mean()>subset_stat[str(nc)].mean(): + peak.run_modulation_dg.iloc[nc] = (subset_run[str(nc)].mean() - subset_stat[str(nc)].mean())/np.abs(subset_run[str(nc)].mean()) + elif subset_run[str(nc)].mean()<subset_stat[str(nc)].mean(): + peak.run_modulation_dg.iloc[nc] = -1*((subset_stat[str(nc)].mean() - subset_run[str(nc)].mean())/np.abs(subset_stat[str(nc)].mean())) + + else: + peak.p_run_dg.iloc[nc] = np.NaN + peak.run_modulation_dg.iloc[nc] = np.NaN + + #reliability + subset = self.sweep_response[(self.stim_table.temporal_frequency == self.tfvals[ + preftf]) & (self.stim_table.orientation == self.orivals[prefori])] + corr_matrix = np.empty((len(subset),len(subset))) + for i in range(len(subset)): + for j in range(len(subset)): + r,p = st.pearsonr(subset[str(nc)].iloc[i][30:90], subset[str(nc)].iloc[j][30:90]) + corr_matrix[i,j] = r + mask = np.ones((len(subset), len(subset))) + for i in range(len(subset)): + for j in range(len(subset)): + if i>=j: + mask[i,j] = np.NaN + corr_matrix *= mask + peak.reliability_dg.iloc[nc] = np.nanmean(corr_matrix) + + #TF index + tf_tuning = self.response[prefori,1:,nc,0] + trials = self.mean_sweep_response[(self.stim_table.temporal_frequency!=0)&(self.stim_table.orientation==self.orivals[prefori])][str(nc)].values + SSE_part = np.sqrt(np.sum((trials-trials.mean())**2)/(len(trials)-5)) + peak.tf_index_dg.iloc[nc] = (np.ptp(tf_tuning))/(np.ptp(tf_tuning) + 2*SSE_part) + + return peak + + def open_star_plot(self, cell_specimen_id=None, include_labels=False, cell_index=None): + cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) + + df = self.mean_sweep_response[str(cell_index)] + st = self.data_set.get_stimulus_table('drifting_gratings') + mask = st.dropna(subset=['orientation']).index + + data = df.values + + cmin = self.response[0,0,cell_index,0] + cmax = max(cmin, data.mean() + data.std()*3) + + fp = cplots.FanPlotter.for_drifting_gratings() + fp.plot(r_data=st.temporal_frequency.ix[mask].values, + angle_data=st.orientation.ix[mask].values, + data=df.ix[mask].values, + clim=[cmin, cmax]) + fp.show_axes(closed=True) + + if include_labels: + fp.show_r_labels() + fp.show_angle_labels() + + def plot_orientation_selectivity(self, + si_range=oplots.SI_RANGE, + n_hist_bins=oplots.N_HIST_BINS, + color=oplots.STIM_COLOR, + p_value_max=oplots.P_VALUE_MAX, + peak_dff_min=oplots.PEAK_DFF_MIN): + # responsive cells + vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) + + # orientation selective cells + osi_cells = vis_cells & (self.peak.osi_dg > si_range[0]) & (self.peak.osi_dg < si_range[1]) + + peak_osi = self.peak.ix[osi_cells] + osis = peak_osi.osi_dg.values + + oplots.plot_selectivity_cumulative_histogram(osis, + "orientation selectivity index", + si_range=si_range, + n_hist_bins=n_hist_bins, + color=color) + + def plot_direction_selectivity(self, + si_range=oplots.SI_RANGE, + n_hist_bins=oplots.N_HIST_BINS, + color=oplots.STIM_COLOR, + p_value_max=oplots.P_VALUE_MAX, + peak_dff_min=oplots.PEAK_DFF_MIN): + + # responsive cells + vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) + + # direction selective cells + dsi_cells = vis_cells & (self.peak.dsi_dg > si_range[0]) & (self.peak.dsi_dg < si_range[1]) + + peak_dsi = self.peak.ix[dsi_cells] + dsis = peak_dsi.dsi_dg.values + + oplots.plot_selectivity_cumulative_histogram(dsis, + "direction selectivity index", + si_range=si_range, + n_hist_bins=n_hist_bins, + color=color) + + def plot_preferred_direction(self, + include_labels=False, + si_range=oplots.SI_RANGE, + color=oplots.STIM_COLOR, + p_value_max=oplots.P_VALUE_MAX, + peak_dff_min=oplots.PEAK_DFF_MIN): + vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) + pref_dirs = self.peak.ix[vis_cells].ori_dg.values + pref_dirs = [ self.orivals[pref_dir] for pref_dir in pref_dirs ] + + angles, counts = np.unique(pref_dirs, return_counts=True) + oplots.plot_radial_histogram(angles, + counts, + include_labels=include_labels, + all_angles=self.orivals, + direction=-1, + offset=0.0, + closed=True, + color=color) + + def plot_preferred_temporal_frequency(self, + si_range=oplots.SI_RANGE, + color=oplots.STIM_COLOR, + p_value_max=oplots.P_VALUE_MAX, + peak_dff_min=oplots.PEAK_DFF_MIN): + + vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) + pref_tfs = self.peak.ix[vis_cells].tf_dg.values + + oplots.plot_condition_histogram(pref_tfs, + self.tfvals[1:], + color=color) + + plt.xlabel("temporal frequency (Hz)") + plt.ylabel("number of cells") + + def reshape_response_array(self): + ''' + :return: response array in cells x stim x repetition for noise correlations + ''' + + mean_sweep_response = self.mean_sweep_response.values[:, :self.numbercells] + + reps = [] + stim_table = self.stim_table + + tfvals = self.tfvals + tfvals = tfvals[tfvals != 0] # blank sweep + + response_new = np.zeros((self.numbercells, self.number_ori, self.number_tf-1), dtype='object') + + for i, ori in enumerate(self.orivals): + for j, tf in enumerate(tfvals): + ind = (stim_table.orientation.values == ori) * (stim_table.temporal_frequency.values == tf) + for c in range(self.numbercells): + response_new[c, i, j] = mean_sweep_response[ind, c] + + ind = (stim_table.temporal_frequency.values == 0) + response_blank = mean_sweep_response[ind, :].T + + return response_new, response_blank + + def get_signal_correlation(self, corr='spearman'): + logging.debug("Calculating signal correlation") + + response = self.response[:, 1:, :self.numbercells, 0] # orientation x freq x cell, no blank + response = response.reshape(self.number_ori * (self.number_tf-1), self.numbercells).T + N, Nstim = response.shape + + signal_corr = np.zeros((N, N)) + signal_p = np.empty((N, N)) + if corr == 'pearson': + for i in range(N): + for j in range(i, N): # matrix is symmetric + signal_corr[i, j], signal_p[i, j] = st.pearsonr(response[i], response[j]) + + elif corr == 'spearman': + for i in range(N): + for j in range(i, N): # matrix is symmetric + signal_corr[i, j], signal_p[i, j] = st.spearmanr(response[i], response[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + signal_corr = np.triu(signal_corr) + np.triu(signal_corr, 1).T # fill in lower triangle + signal_p = np.triu(signal_p) + np.triu(signal_p, 1).T # fill in lower triangle + + return signal_corr, signal_p + + + def get_representational_similarity(self, corr='spearman'): + logging.debug("Calculating representational similarity") + + response = self.response[:, 1:, :self.numbercells, 0] # orientation x freq x phase x cell, no blank + response = response.reshape(self.number_ori * (self.number_tf-1), self.numbercells) + Nstim, N = response.shape + + rep_sim = np.zeros((Nstim, Nstim)) + rep_sim_p = np.empty((Nstim, Nstim)) + if corr == 'pearson': + for i in range(Nstim): + for j in range(i, Nstim): # matrix is symmetric + rep_sim[i, j], rep_sim_p[i, j] = st.pearsonr(response[i], response[j]) + + elif corr == 'spearman': + for i in range(Nstim): + for j in range(i, Nstim): # matrix is symmetric + rep_sim[i, j], rep_sim_p[i, j] = st.spearmanr(response[i], response[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + rep_sim = np.triu(rep_sim) + np.triu(rep_sim, 1).T # fill in lower triangle + rep_sim_p = np.triu(rep_sim_p) + np.triu(rep_sim_p, 1).T # fill in lower triangle + + return rep_sim, rep_sim_p + + + def get_noise_correlation(self, corr='spearman'): + logging.debug("Calculating noise correlations") + + response, response_blank = self.reshape_response_array() + noise_corr = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_tf-1)) + noise_corr_p = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_tf-1)) + + noise_corr_blank = np.zeros((self.numbercells, self.numbercells)) + noise_corr_blank_p = np.zeros((self.numbercells, self.numbercells)) + + if corr == 'pearson': + for k in range(self.number_ori): + for l in range(self.number_tf-1): + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr[i, j, k, l], noise_corr_p[i, j, k, l] = st.pearsonr(response[i, k, l], response[j, k, l]) + + noise_corr[:, :, k, l] = np.triu(noise_corr[:, :, k, l]) + np.triu(noise_corr[:, :, k, l], 1).T + + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.pearsonr(response_blank[i], response_blank[j]) + + elif corr == 'spearman': + for k in range(self.number_ori): + for l in range(self.number_tf-1): + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr[i, j, k, l], noise_corr_p[i, j, k, l] = st.spearmanr(response[i, k, l], response[j, k, l]) + + noise_corr[:, :, k, l] = np.triu(noise_corr[:, :, k, l]) + np.triu(noise_corr[:, :, k, l], 1).T + + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.spearmanr(response_blank[i], response_blank[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + noise_corr_blank[:, :] = np.triu(noise_corr_blank[:, :]) + np.triu(noise_corr_blank[:, :], 1).T + + return noise_corr, noise_corr_p, noise_corr_blank, noise_corr_blank_p + + + @staticmethod + def from_analysis_file(data_set, analysis_file): + dg = DriftingGratings(data_set) + + try: + dg.populate_stimulus_table() + + dg._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_dg") + dg._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_dg") + dg._peak = pd.read_hdf(analysis_file, "analysis/peak") + + with h5py.File(analysis_file, "r") as f: + dg._response = f["analysis/response_dg"].value + dg._binned_dx_sp = f["analysis/binned_dx_sp"].value + dg._binned_cells_sp = f["analysis/binned_cells_sp"].value + dg._binned_dx_vis = f["analysis/binned_dx_vis"].value + dg._binned_cells_vis = f["analysis/binned_cells_vis"].value + if "analysis/noise_corr_dg" in f: + dg.noise_correlation = f["analysis/noise_corr_dg"].value + if "analysis/signal_corr_dg" in f: + dg.signal_correlation = f["analysis/signal_corr_dg"].value + if "analysis/rep_similarity_dg" in f: + dg.representational_similarity = f["analysis/rep_similarity_dg"].value + + except Exception as e: + raise MissingStimulusException(e.args) + + return dg + diff --git a/brain_observatory/ecephys/__init__.py b/brain_observatory/ecephys/__init__.py new file mode 100644 index 0000000000..62f154428e --- /dev/null +++ b/brain_observatory/ecephys/__init__.py @@ -0,0 +1,30 @@ +import numpy as np + + + +UNIT_FILTER_DEFAULTS = { + "amplitude_cutoff_maximum": { + "value": 0.1, + "missing": np.inf + }, + "presence_ratio_minimum": { + "value": 0.95, + "missing": -np.inf + }, + "isi_violations_maximum": { + "value": 0.5, + "missing": np.inf + } +} + + +def get_unit_filter_value(key, pop=True, replace_none=True, **source): + if pop: + value = source.pop(key, UNIT_FILTER_DEFAULTS[key]["value"]) + else: + value = source.get(key, UNIT_FILTER_DEFAULTS[key]["value"]) + + if value is None and replace_none: + value = UNIT_FILTER_DEFAULTS[key]["missing"] + + return value diff --git a/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..010bc6d7150bbf003b19bd51412290d073e20bab GIT binary patch literal 676 zcmZ8f&2G~`5Z)iVq)FOSS`psB2bu#nR1sQeq(YPfbuN~r)yBI?m)N`3t{sTv9*}qg zPM{t@oOlFY#U~_ATzCLZj9rQlBh9CoZ@(Gu%=&b1uZzI+=QsQvLFjvv+?o%;V{ms2 zAdtW*im)IOza)ZQ6X7*c54ExXm)*Ih5fxq05xZ}3<OzI%g5D44fM%-??;HC%4oK~9 zcv{N(PNtkwdbL`%_H(>yln8wr2Q<3NvpiKrDI`nE!Yr38<F8d#X3=48rIR|5%<@7R zmMMM1E2r2-nY3ZGyVZvYy=jY@nHql%?w$cu*xsw?M^vE#S7-=R4$&ua<>>*i<bSsE z1X_3Oq#}0mM^A?6%Bwt>lFlrw5ZUHi0j+6n@_I0zori34J`K-au%~B}lle5fsOd@; zfnU?L+*%LRQQyiu<uHymTGl(xls1uVw=c-<g5sBZ@-Ut|X<f`Oxj0(zS6px76U`H& z1%D7ry>YS0rFIFR$uGAqo~lLcR3Y!@JX!OVgxWL(g;<XkmMhK70y=JZVeED!6WJ7v z7=v9Fj2-3M`T*|9$|hZ^w2+pyk9Gj}aeV-UJ$y(8q>uZ=_8<>P7zTdi>oS9CqVt+6 ny|m53+w*pmf1vsI>dtXyM48G*7&5mH(AgolLkaGJ@B6<27_YYI literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/__pycache__/ecephys_project_cache.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/ecephys_project_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..442230e8ee0c87cbec1fa415ab22a18a13609b20 GIT binary patch literal 28065 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 Z=Xf`soBHWY^zZrVcy(e5%24$0{{kjLQPltd literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/__pycache__/ecephys_session.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/ecephys_session.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6649e0fde67f8d5d89f53650ca391b54a9407eb GIT binary patch literal 41377 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%0DCyUC@RW7<i)JN%BDZInoie#9ztmF@sB#<3R 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/__pycache__/stimulus_sync.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/stimulus_sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60482e34fd934a5c68b4502cce6c9abead12844c GIT binary patch literal 4404 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 Ys(Gs5drr^_eE%@m3ceAzzUOcK7hAn6S^xk5 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/__init__.py b/brain_observatory/ecephys/align_timestamps/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/align_timestamps/__main__.py b/brain_observatory/ecephys/align_timestamps/__main__.py new file mode 100644 index 0000000000..31773553c5 --- /dev/null +++ b/brain_observatory/ecephys/align_timestamps/__main__.py @@ -0,0 +1,111 @@ +import numpy as np + +from allensdk.brain_observatory.argschema_utilities import \ + ArgSchemaParserPlus, \ + write_or_print_outputs +from ._schemas import InputParameters, OutputParameters +from .barcode_sync_dataset import BarcodeSyncDataset +from .channel_states import extract_barcodes_from_states, \ + extract_splits_from_states +from .probe_synchronizer import ProbeSynchronizer + + +def align_timestamps(args): + sync_dataset = BarcodeSyncDataset.factory(args["sync_h5_path"]) + sync_times, sync_codes = sync_dataset.extract_barcodes() + + probe_output_info = [] + for probe in args["probes"]: + print(probe["name"]) + this_probe_output_info = {} + + channel_states = np.load(probe["barcode_channel_states_path"]) + timestamps = np.load(probe["barcode_timestamps_path"]) + + probe_barcode_times, probe_barcodes = extract_barcodes_from_states( + channel_states, timestamps, probe["sampling_rate"] + ) + probe_split_times = extract_splits_from_states( + channel_states, timestamps, probe["sampling_rate"] + ) + + print("Split times:") + print(probe_split_times) + + synchronizers = [] + + for idx, split_time in enumerate(probe_split_times): + + min_time = probe_split_times[idx] + + if idx == (len(probe_split_times) - 1): + max_time = np.Inf + else: + max_time = probe_split_times[idx + 1] + + synchronizer = ProbeSynchronizer.compute( + sync_times, + sync_codes, + probe_barcode_times, + probe_barcodes, + min_time, + max_time, + probe["start_index"], + probe["sampling_rate"], + ) + + synchronizers.append(synchronizer) + + mapped_files = {} + + for timestamp_file in probe["mappable_timestamp_files"]: + # print(timestamp_file["name"]) + timestamps = np.load(timestamp_file["input_path"]) + aligned_timestamps = np.copy(timestamps).astype("float64") + + for synchronizer in synchronizers: + aligned_timestamps = synchronizer(aligned_timestamps) + print( + "total time shift: " + str(synchronizer.total_time_shift)) + print( + "actual sampling rate: " + + str(synchronizer.global_probe_sampling_rate) + ) + + np.save( + timestamp_file["output_path"], aligned_timestamps, + allow_pickle=False + ) + mapped_files[timestamp_file["name"]] = timestamp_file[ + "output_path"] + + lfp_sampling_rate = ( + probe["lfp_sampling_rate"] * synchronizer.sampling_rate_scale + ) + + this_probe_output_info[ + "total_time_shift"] = synchronizer.total_time_shift + this_probe_output_info[ + "global_probe_sampling_rate" + ] = synchronizer.global_probe_sampling_rate + this_probe_output_info[ + "global_probe_lfp_sampling_rate"] = lfp_sampling_rate + this_probe_output_info["output_paths"] = mapped_files + this_probe_output_info["name"] = probe["name"] + + probe_output_info.append(this_probe_output_info) + + return {"probe_outputs": probe_output_info} + + +def main(): + mod = ArgSchemaParserPlus( + schema_type=InputParameters, output_schema_type=OutputParameters + ) + output = align_timestamps(mod.args) + + write_or_print_outputs(data=output, parser=mod) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2df64801a246282deb25a622c3025391db66f295 GIT binary patch literal 219 zcmYL@JqiLr424Iq5W$03=oWS&;!i6!VmB~kcY+SPn;ABvvZdfnth|z~N3gRpQ-}}V zmk{zoR)axbiRgZXR9^`{b);E{xht@0r-q&FLp5pq$LF@5>OEt_8jfJcIb48Ry(B0+ zS(s>~Gix7^xDfhqY*}wyuGvK#1t>~5pk%8`Hf)*Y4LCABmy2hJzG*WoFoiOx+<{DV dHFAVHaAu4n7mXQ*_Su`&-kvI)r|;fk^#!M-L4W`N literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e0300d2e2f1516e9eb9971b1b1e4afc6067c9dd GIT binary patch literal 2447 zcmZWrOK%%D5GHq5tJP|?*2{LBrh$P11yrCm&_@nNP&5w|2vDQ}j3Nc0bU|q;Ywdl7 zq!Y<l9SY|fz`vld(NnMe1wHjg?6s%#C-l@IS90W3#*)LC;c#a7&Cm~9Ef>Kr{p}aJ z>m&5HTC9Es5Z}TlI1C{Qaf}Ft*@%tABxYg}3!~5st+<xh#7^p@uGh8LNgAY~X*+h4 zCTS)f@$|YLw-TTDKs#aM4I&$%8#ZBXvrg!p7(8X|a|BX+hz6~9a4vc}Fv{KoesnmV zvV=aPTrmDDJ{9HGYaU4!WIV`ul*%AGmHDX@?=WnFJsVF_Sb{!Hm}Fd(?H{zld(Hrt z-G`KqvydIm)A3^}sbCVe-eEJz=~xD%N-Ba0&yqk$Dw!y6ucRW6BY8sx7CX;)Hq!Q{ zJWHc9#>dJb_1l841>Yn1#6Q55=n@wY>khiY3tZq!;|dLpg|RS?(89XFvp+#<?4ZZ! z0>AiUQIlp-3(XyLjxmbR!j{%$4LFwGUtg|jdgVyFs22`MZO}KtYGdKb`Z{mXlxA30 zw!m&v&2XwWJC=@GJw`8nhFz_NUo?x>4q9v!E!j|#(7A=+rv8%FvAbxeo|1>oHUgct zY+ibWQJ6)eaEpzi4d*v@Q02vyv*;AwWvl31!C5bVeXe5Y&MrXesu*9qS@d)ay|B5A z!MgMd=L%nLgdSw5KRYNq(E9@Hbc+5ta3F$~Y!{v5&N<%Jc>#{EIo%cK0>8ZX9D%pJ zq8Dy}H~p|3cHWv8E!SO`A*=Tx%P;-s%G)kzb&mUewAfU(3p?!HSDY?TeV{gB-h^4L zw_w({0<;OV1rgdh!q1+gaJ#S~h2>jMi6;PL!Sw4Or*cZ{T;W8NRtoqeA1#p<jHfhB zS-iwrrMkTm$|zv~!Xy`!pe2Bgqx2}?fXp-RPyupRYaMV4P)3@d&Sem#A)Ap~3C(jl zidk@ND40Ys6U2>FtyD(qlQ^UD-dAT`nMoRJbGu?1P2|Du*%nmADKJ+D@2Z0jc1g1; zK5gN<0VW=e<Lq^iN8^*2m7RE!2dgdG*RrjRYexcYyu5uBXCoRzF+*N%YLmM+WdE~9 zytU&6X;mhc{a~=k>yV1FJ^|k|K8IHGL3Nik-9Sns%}Wb{54i&ycth=Ku=F%xD$3G~ zSxU?&>4dA6N$TS)fuyn0hODwQEUj^t&xuWioadk|B<HHyIkZ(&T7te}q<13;ff&=6 z4Yo>)@*}atM_6?s;%c<$i(1mEPYKdl4-PJNk`ZtpQbxAqGy-7g^eywD#HD`|Q^dW# zeL;Ga`VD{){|58=NZsx#=#ZB3Zq?vKX-44;yj1Yh3dBjGbVbowMQQx6_7G2jk%dbD z`qw^b2I<l`I!Zx&%@^E*JpPXO9hm-o^XOpsBRm9RNT)R18`0M^oev+RbeyFj{c_0C zS7MmKwFtNrmgUpA7=9m(h5}xU&vQCHp+^k%#&D$~JlP*{3jSszu=t89knFQDQ=9g+ zA8TIh2SK8AgS~uSwm+1r`xY?_2>aMGEZoH&whSNphJm~A`KE&%!!o*tW3+)%I>y?c zja}0Rxet5VhKn7LwY9u&TCj4!M&I-;*K`e7!5O~6@4|Uwb*TEOM_ZM?eq=rcLL!N! z5#qPTLN$7HY(eA1vR0_4$9QYNV~e0cnefg+yU>qppb$*DOAxK`;BB-NKubH<@9@Cp z>O5XkgRKVT3*S+L2?OYxNfwrNWlG;&HGB-x(o(5pKnYcF2;y`N*WjNhnX^jtpi62{ zgZZ3yfKT>Tm$vu6OWRXrR0VJ<Bfw(BMCG6Ig*Z@e>R$-)-d)mPAzxS9vi5Yp;J0DV z`$j;zRZ*<tUiX12;+4y)nFqmIoC>X62kYF2Oq|B-8};vi=)wRHFxvo-w&9u1Pfo+Z F{{dx^#C!k% literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea29563f66133b05142d1bec7d9903de2c478401 GIT binary patch literal 3702 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 H?$G-$K@|z= literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/barcode.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/barcode.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98b6f0bb5d279929b856911e0bd3717f835d56c2 GIT binary patch literal 7497 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/barcode_sync_dataset.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/barcode_sync_dataset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..762c78a73c52baf98d375c180367e0904c7b0b3d GIT binary patch literal 2267 zcmaJ?&2Jk;6yMn|Z(XNN14XJT!61-YN3C<<0E#MT(o_h60%}Vutt_p^J7asB^{hKH zPHW3KKyt3QaO04O6aUg)IrU%Q#C!YU#7@<*cJ}%0oA>#9Z+6$#nieei_it<?u&jUa zPrY0q9>Sv^z{V|3QY$RqB(%BBozxk*p-YhGrryX8ePVrYagX~a7WajJ?1T+Yo?7k3 zJJ4Y5zay}>N#5u&6=z%kx$!s_<Ka|4oyvHR8K#AaQMO(V5D($ecVQD&NVpZ+!r_G5 zC)P0uUG8xA#0tIAYUuL@*bDNF-O|KGy=Wa5zESTZc=R{0aWc1FS_i)R1mCBGlQZy| z+ZFd-#kG-ZAns%GJK-+a@n$>p=bmASq-H2+BDr`&vwrcXijk&?6ttfyU?!UKGR97` zNvoyMl{~1#_3Wn1=*roN<oj(Wyo#!#l=VcabFVO#H=na~A|5N1DafX)McV(zQdraf z{&=+A{Z$L4yKKmKr^jA1IqmL97H5*Puew4W>TWg`Qpd1oScUFSNw2FDBkqq`e82_* z&Za3y@Pn<Mf-s}32O1BV$<%a9l%?BZX)=(JNk&2&HX7@#%Kb<~QKLHI@icGMA25&> zX1@TR-y|&pk3IWr_fpls?*c0ko{8%c0#u6<{)kHUU^5mJi5!z7ESi1f%&k*r?wpY$ z7bv%&ytzBKZ(B$H+$-J<<Gu9f{=Ct*=j1KIl(4s8fIbn7*Co)DNsjeQpnw=5?W=6G zRLeWM7A|Uip|rm+#YVzF2^Q79zgP>_=4Kt@!E2@lnr_p@H^j(`Bu!~g&@t0mfG-)X zbJ7uSjAF5gDg`=1=gLZ)1MG<~6D9Sz(#nN}kut7rD#slFhEi<0_=NVK0kWa6%2Wve zd<zy2DTl~n10Ge@JBw4;+Ze_N6dodMHTKGTb)9?PZscA+&6o+-HGnG>5TkfC5i*`C zgiyFX5GGQIPUIjG93UIsKu#ZkyI>VP7T*3qy4r!d0^0Ix%e4qUx?nWo$sjQ-4X@Wi z@sLR=((p<qBXKCC(P1;|_iH);c9C2V0B%7Ry;*Ko(ct>3Q@4Pt*I~16G>LCFNz)EU zV7p}Y#qQ<qSUtVy5FFkfJVl3W0%2gV8T%AQ=NbG6_KVxM5cysE2s_4^!%+XrhCXm+ zf6^TaV*)}-Ak%^Ziia65#uy~mKw|5vSD?TyDa#JCkWrq*CdnjI(+lmepBb^z2@A+P z!{Jz2!7(YuO2iD%^*KGq!YnDo`V(1br%QsAX*z)sA+!dw^e%d&Q&ds7t;8q;(6u}C z2dNEo_&ur<z|)jYw4keL?6mFNE8@w$qHJw151>0GM6Poesoa+1@YZtxUN04UmA?@4 zi&9Emhn%<F0#)i7(BWE*ni2;-@K(W4Aa^0gK=IcgRZhvkB`yivbu#<%JvczfFCE;6 z#tEWG!T^e*yctEKj8C9@qP!JFuO=+5z64_h(_fjgn+mVh&1KhcNGk-ZLO>y*(fNS1 z)`Cw99(2zJa6(T`M&qga80g$8o9?^%0_j}3Kswb0(&;DQSd!KMm+lRPKrW12NY=um WJa|yX^)22E8n1=G4(t|bdH(~ZI)R4( literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/channel_states.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/channel_states.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23e3c3f8b5ce84335b85e17bbf5c6a79cae3b333 GIT binary patch literal 1644 zcmeHHPjAyO6px*_?Mhb-af0n&aiWN|nvgh52r)P^0b=74MT*?mX+u+|vb{f*vI80? z4txd>C%#fH960SOaDiuc4J(2(7cBWD&whUY{QLRI`g+@gAwR!mUy0{^v&wQ{_<0Od z-vPlrj&d(V9CJU%Q$O^P#{*8@d11gCya`{z(Sg@%U4XUs`~rdOp{hA#Dk-=~e7g*z z1v7y845r=(VZ4v11n(3437rL(8g?2fQ5oFy3@-6G+VsvEppz?l)A(<KvQaiuT>2ku zbf3*3@Qa~gnWUGYHBD79r6!vSZP;`sI8~X><Y<txJcln8d?a+g-KH>JGR3CC2&J96 zT@R-wV<x4@V{l}Irn^)gO=t7I<V-0xcP7@!E9ajw$>~ardz1@V7|3A9ZEo+lBXw$j z_jmw_=YnREi&I*pRIp@B#j%j4?_6lR54FS!5?kaYRF>2kEzWB?pjsq_<Zk2c-OCom zlM|*!HhO(vkMqoAg=9IM)h&Vab)vGNZJHU2y2H>rcTic(T>OC1BNdjjikysv5*11F zf*EBo5N?W7qgZ0%<@Ln&dScguUaRV^wzz8lYEHGjQf1X$%|2W!Wb9g^!*-FT%m3go zE@VhRrs)??bs&lF@1O2QuQgn9#Kw&GhwOyOd9){)?G3vh33;reVkV?cKo+y{Tu1xa zFw&V3+cTC-7$7DB_<#kU42BBu78gVCc+5<p<^z!kduYJ&Y$O-OS?uY-YI*(HyxRJ6 zLlzKgK(^X(^hOtT@dnz!stap1pR7U6r(IB1`Scrui1ABujx5{M1F#G@8X@2vDG9I# z|7XuXWsiF^iGqjNQ}$j}6GY_$$SUF<m|jEK_fxG|VNs#3fe1SqxNnwtZyv@@cSv7| zb+D>#Epg^{^@4T_l--8?CCcyy?w}4<*I}*K2#I^)Tuzne80_%pwy#96tWqva>*2KE RN4a=ptI@WM7Vh}1t)E2j*9HIp literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/probe_synchronizer.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/probe_synchronizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e579b563d0d9994e57b0094a11e155048aabd0fa GIT binary patch literal 4448 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 b9iH=0X^u?-bN9pIpdaDC9wdtIny&SKnU?XJ literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/align_timestamps/_schemas.py b/brain_observatory/ecephys/align_timestamps/_schemas.py new file mode 100644 index 0000000000..5cb0e75632 --- /dev/null +++ b/brain_observatory/ecephys/align_timestamps/_schemas.py @@ -0,0 +1,92 @@ +from argschema import ArgSchema, ArgSchemaParser +from argschema.schemas import DefaultSchema +from argschema.fields import Nested, InputDir, String, Float, Dict, Int, List + + +class ProbeMappable(DefaultSchema): + name = String( + required=True, + help='What kind of mappable data is this? e.g. "spike_timestamps"', + ) + input_path = String( + required=True, + help="Input path for this file. Should point to a file containing a 1D timestamps array with values in probe samples.", + ) + output_path = String( + required=True, + help="Output path for the mapped version of this file. Will write a 1D timestamps array with values in seconds on the master clock.", + ) + + +class ProbeInputParameters(DefaultSchema): + name = String(required=True, help="Identifier for this probe") + sampling_rate = Float( + required=True, + help="The sampling rate of the probe, in Hz, assessed on the probe clock.", + ) + lfp_sampling_rate = Float( + required=True, help="The sampling rate of the LFP collected on this probe." + ) + start_index = Int( + default=0, help="Sample index of probe recording start time. Defaults to 0." + ) + barcode_channel_states_path = String( + required=True, + help="Path to the channel states file. This file contains a 1-dimensional array whose axis is events and whose " + "values indicate the state of the channel line (rising or falling) at that event.", + ) + barcode_timestamps_path = String( + required=True, + help="Path to the timestamps file. This file contains a 1-dimensional array whose axis is events and whose " + "values indicate the sample on which each event was detected.", + ) + mappable_timestamp_files = Nested( + ProbeMappable, + many=True, + help="Timestamps files for this probe. Describe the times (in probe samples) when e.g. lfp samples were taken or spike events occured", + ) + + +class InputParameters(ArgSchema): + probes = Nested( + ProbeInputParameters, + many=True, + help="Probes whose data will be aligned to the master clock.", + ) + sync_h5_path = String( + required=True, help="path to h5 file containing syncronization information" + ) + + +class ProbeOutputParameters(DefaultSchema): + name = String(required=True, help="Identifier for this probe") + output_paths = Dict( + required=True, + help="Paths of each mappable file written by this run of the module.", + ) + total_time_shift = Float( + required=True, + help="Translation (in seconds) from master->probe times computed for this probe.", + ) + global_probe_sampling_rate = Float( + required=True, + help="The sampling rate of this probe in Hz, assessed on the master clock.", + ) + global_probe_lfp_sampling_rate = Float( + required=True, + help="The sampling rate of LFP collected on this probe in Hz, assessed on the master clock.", + ) + + +class OutputSchema(DefaultSchema): + input_parameters = Nested( + InputParameters, + description="Input parameters the module was run with", + required=True, + ) + + +class OutputParameters(OutputSchema): + probe_outputs = Nested( + ProbeOutputParameters, many="True", help="Probewise outputs." + ) diff --git a/brain_observatory/ecephys/align_timestamps/barcode.py b/brain_observatory/ecephys/align_timestamps/barcode.py new file mode 100644 index 0000000000..850308ee31 --- /dev/null +++ b/brain_observatory/ecephys/align_timestamps/barcode.py @@ -0,0 +1,303 @@ +import numpy as np + + +def extract_barcodes_from_times( + on_times, + off_times, + inter_barcode_interval=10, + bar_duration=0.03, + barcode_duration_ceiling=2, + nbits=32, +): + """Read barcodes from timestamped rising and falling edges. + + Parameters + ---------- + on_times : numpy.ndarray + Timestamps of rising edges on the barcode line + off_times : numpy.ndarray + Timestamps of falling edges on the barcode line + inter_barcode_interval : numeric, optional + Minimun duration of time between barcodes. + bar_duration : numeric, optional + A value slightly shorter than the expected duration of each bar + barcode_duration_ceiling : numeric, optional + The maximum duration of a single barcode + nbits : int, optional + The bit-depth of each barcode + + Returns + ------- + barcode_start_times : list of numeric + For each detected barcode, the time at which that barcode started + barcodes : list of int + For each detected barcode, the value of that barcode as an integer. + + Notes + ----- + ignores first code in prod (ok, but not intended) + ignores first on pulse (intended - this is needed to identify that a barcode is starting) + + """ + + start_indices = np.diff(on_times) + a = np.where(start_indices > inter_barcode_interval)[0] + barcode_start_times = on_times[a + 1] + + barcodes = [] + + for i, t in enumerate(barcode_start_times): + + oncode = on_times[ + np.where( + np.logical_and(on_times > t, on_times < t + barcode_duration_ceiling) + )[0] + ] + offcode = off_times[ + np.where( + np.logical_and(off_times > t, off_times < t + barcode_duration_ceiling) + )[0] + ] + + currTime = offcode[0] + + bits = np.zeros((nbits,)) + + for bit in range(0, nbits): + + nextOn = np.where(oncode > currTime)[0] + nextOff = np.where(offcode > currTime)[0] + + if nextOn.size > 0: + nextOn = oncode[nextOn[0]] + else: + nextOn = t + inter_barcode_interval + + if nextOff.size > 0: + nextOff = offcode[nextOff[0]] + else: + nextOff = t + inter_barcode_interval + + if nextOn < nextOff: + bits[bit] = 1 + + currTime += bar_duration + + barcode = 0 + + # least sig left + for bit in range(0, nbits): + barcode += bits[bit] * pow(2, bit) + + barcodes.append(barcode) + + return barcode_start_times, barcodes + + +def find_matching_index(master_barcodes, probe_barcodes, alignment_type="start"): + """Given a set of barcodes for the master clock and the probe clock, find the + indices of a matching set, either starting from the beginning or the end + of the list. + + Parameters + ---------- + master_barcodes : np.ndarray + barcode values on the master line. One per barcode + probe_barcodes : np.ndarray + barcode values on the probe line. One per barcode + alignment_type : string + 'start' or 'end' + + Returns + ------- + master_barcode_index : int + matching index for master barcodes (None if not found) + probe_barcode_index : int + matching index for probe barcodes (None if not found) + + """ + + foundMatch = False + master_barcode_index = None + + if alignment_type == "start": + probe_barcode_index = 0 + direction = 1 + else: + probe_barcode_index = -1 + direction = -1 + + while not foundMatch and abs(probe_barcode_index) < len(probe_barcodes): + + master_barcode_index = np.where( + master_barcodes == probe_barcodes[probe_barcode_index] + )[0] + + assert len(master_barcode_index) < 2 + + if len(master_barcode_index) == 1: + foundMatch = True + else: + probe_barcode_index += direction + + if foundMatch: + return master_barcode_index, probe_barcode_index + else: + return None, None + + +def match_barcodes(master_times, master_barcodes, probe_times, probe_barcodes): + """Given sequences of barcode values and (local) times on a probe line and a master + line, find the time points on each clock corresponding to the first and last shared + barcode. + + If there's only one probe barcode, only the first matching timepoint is returned. + + Parameters + ---------- + master_times : np.ndarray + start times of barcodes (according to the master clock) on the master line. + One per barcode. + master_barcodes : np.ndarray + barcode values on the master line. One per barcode + probe_times : np.ndarray + start times (according to the probe clock) of barcodes on the probe line. + One per barcode + probe_barcodes : np.ndarray + barcode values on the probe_line. One per barcode + + Returns + ------- + probe_interval : np.ndarray + Start and end times of the matched interval according to the probe_clock. + master_interval : np.ndarray + Start and end times of the matched interval according to the master clock + + """ + + master_start_index, probe_start_index = find_matching_index( + master_barcodes, probe_barcodes, alignment_type="start" + ) + + if master_start_index is not None: + t_m_start = master_times[master_start_index] + t_p_start = probe_times[probe_start_index] + else: + t_m_start, t_p_start = None, None + + # print(master_barcodes) + # print(probe_barcodes) + + print("Master start index: " + str(master_start_index)) + if len(probe_barcodes) > 2: + master_end_index, probe_end_index = find_matching_index(master_barcodes, probe_barcodes, alignment_type='end') + + if probe_end_index is not None: + print("Probe end index: " + str(probe_end_index)) + t_m_end = master_times[master_end_index] + t_p_end = probe_times[probe_end_index] + else: + t_m_end = None + t_p_end = None + else: + t_m_end, t_p_end = None, None + + return np.array([t_p_start, t_p_end]), np.array([t_m_start, t_m_end]) + + +def linear_transform_from_intervals(master, probe): + """Find a scale and translation which aligns two 1d segments + + Parameters + ---------- + master : iterable + Pair of floats defining the master interval. Order is [start, end]. + probe : iterable + Pair of floats defining the probe interval. Order is [start, end]. + + Returns + ------- + scale : float + Scale factor. If > 1.0, the probe clock is running fast compared to the + master clock. If < 1.0, the probe clock is running slow. + translation : float + If > 0, the probe clock started before the master clock. If > 0, after. + + Notes + ----- + solves + (master + translation) * scale = probe + for scale and translation + """ + + if probe[1] is not None: + scale = (probe[1] - probe[0]) / (master[1] - master[0]) + else: + scale = 1.0 + + if master[0] is not None: + translation = probe[0] / scale - master[0] + else: + translation = None + + return scale, translation + + +def get_probe_time_offset( + master_times, + master_barcodes, + probe_times, + probe_barcodes, + acq_start_index, + local_probe_rate, +): + """Time offset between master clock and recording probes. For converting probe time to master clock. + + Parameters + ---------- + master_times : np.ndarray + start times of barcodes (according to the master clock) on the master line. + One per barcode. + master_barcodes : np.ndarray + barcode values on the master line. One per barcode + probe_times : np.ndarray + start times (according to the probe clock) of barcodes on the probe line. + One per barcode + probe_barcodes : np.ndarray + barcode values on the probe_line. One per barcode + acq_start_index : int + sample index of probe acquisition start time + local_probe_rate : float + the probe's apparent sampling rate + + + Returns + ------- + total_time_shift : float + Time at which the probe started acquisition, assessed on + the master clock. If < 0, the probe started earlier than the master line. + probe_rate : float + The probe's sampling rate, assessed on the master clock + master_endpoints : iterable + Defines the start and end times of the sync interval on the master clock + + """ + + probe_endpoints, master_endpoints = match_barcodes( + master_times, master_barcodes, probe_times, probe_barcodes + ) + rate_scale, time_offset = linear_transform_from_intervals( + master_endpoints, probe_endpoints + ) + + if time_offset is not None: + probe_rate = local_probe_rate * rate_scale + acq_start_time = acq_start_index / probe_rate + + total_time_shift = time_offset - acq_start_time + else: + print("Not enough barcodes...setting sampling rate to 0") + total_time_shift = 0 + probe_rate = 0 + + return total_time_shift, probe_rate, master_endpoints diff --git a/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py b/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py new file mode 100644 index 0000000000..2f151c8807 --- /dev/null +++ b/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py @@ -0,0 +1,70 @@ +import warnings + +import numpy as np + +from . import barcode +from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import ( + EcephysSyncDataset, +) + + +class BarcodeSyncDataset(EcephysSyncDataset): + @property + def barcode_line(self): + """ Obtain the index of the barcode line for this dataset. + + """ + + if "barcode" in self.line_labels: + return self.line_labels.index("barcode") + elif "barcodes" in self.line_labels: + return self.line_labels.index("barcodes") + else: + raise ValueError("no barcode line found") + + def extract_barcodes(self, **barcode_kwargs): + """ Read barcodes and their times from this dataset's barcode line. + + Parameters + ---------- + **barcode_kwargs : + Will be passed to .barcode.extract_barcodes_from_times + + Returns + ------- + times : np.ndarray + The start times of each detected barcode. + codes : np.ndarray + The values of each detected barcode + + """ + + sample_freq_digital = float(self.sample_frequency) + barcode_channel = self.barcode_line + + on_events = self.get_rising_edges(barcode_channel) + off_events = self.get_falling_edges(barcode_channel) + + on_times = on_events / sample_freq_digital + off_times = off_events / sample_freq_digital + + return barcode.extract_barcodes_from_times( + on_times, off_times, **barcode_kwargs + ) + + def get_barcode_table(self, **barcode_kwargs): + """ A convenience method for getting barcode times and codes in a dictionary. + + Notes + ----- + This method is deprecated! + + """ + warnings.warn( + np.VisibleDeprecationWarning( + "This function is deprecated as unecessary (and slated for removal). Instead, simply use extract_barcodes." + ) + ) + + barcode_times, barcodes = self.extract_barcodes(**barcode_kwargs) + return {"codes": barcodes, "times": barcode_times} diff --git a/brain_observatory/ecephys/align_timestamps/channel_states.py b/brain_observatory/ecephys/align_timestamps/channel_states.py new file mode 100644 index 0000000000..ce33d09e5e --- /dev/null +++ b/brain_observatory/ecephys/align_timestamps/channel_states.py @@ -0,0 +1,60 @@ +import numpy as np + +from . import barcode + + +def extract_barcodes_from_states( + channel_states, timestamps, sampling_rate, **barcode_kwargs +): + """Obtain barcodes from timestamped rising/falling edges. + + Parameters + ---------- + channel_states : numpy.ndarray + Rising and falling edges, denoted 1 and -1 + timestamps : numpy.ndarray + Sample index of each event. + sampling_rate : numeric + Samples / second + **barcode_kwargs : + Additional parameters describing the barcodes. + + + """ + + on_events = np.where(channel_states == 1) + off_events = np.where(channel_states == -1) + + T_on = timestamps[on_events] / float(sampling_rate) + T_off = timestamps[off_events] / float(sampling_rate) + + return barcode.extract_barcodes_from_times(T_on, T_off, **barcode_kwargs) + + +def extract_splits_from_states( + channel_states, timestamps, sampling_rate, **barcode_kwargs +): + """Obtain barcodes from timestamped rising/falling edges. + + Parameters + ---------- + channel_states : numpy.ndarray + Rising and falling edges, denoted 1 and -1 + timestamps : numpy.ndarray + Sample index of each event. + sampling_rate : numeric + Samples / second + **barcode_kwargs : + Additional parameters describing the barcodes. + + + """ + + split_events = np.where(channel_states == 0) + + T_split = timestamps[split_events] / float(sampling_rate) + + if len(T_split) == 0: + T_split = np.array([0]) + + return T_split diff --git a/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py b/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py new file mode 100644 index 0000000000..a624e94863 --- /dev/null +++ b/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py @@ -0,0 +1,164 @@ +from . import barcode + +import numpy as np + + +class ProbeSynchronizer(object): + @property + def sampling_rate_scale(self): + """ The ratio of the probe's sampling rate assessed on the global clock to the + probe's locally assessed sampling rate. + """ + + return self.global_probe_sampling_rate / self.local_probe_sampling_rate + + def __init__( + self, + global_probe_sampling_rate, + local_probe_sampling_rate, + total_time_shift, + min_time, + max_time, + ): + """Converts probe sample indices to master clock times. + + Parameters + ---------- + global_probe_sampling_rate : float + The sampling rate of the probe (Hz) assessed on the master clock. + local_probe_sampling_rate : float + The sampling rate of the probe (Hz) assessed on the probe clock. + total_time_shift : float + Offset (s) from probe to master times. + min_time : float + minimum time for this synchronizer + max_time : float + maximum time for this synchronizer + + """ + + self.global_probe_sampling_rate = global_probe_sampling_rate + self.local_probe_sampling_rate = local_probe_sampling_rate + self.total_time_shift = total_time_shift + self.min_time = min_time + self.max_time = max_time + + def __call__(self, samples, sync_condition="master"): + """Applies a computed transform to input probe sample indices. + + Parameters + ---------- + samples : numpy.ndarray + Array of timestamps in probe samples. + sync_condition : str, optional + How to synchronize the timestamps. Available options are: + 'master': Default, synchronize to master clock + 'probe': adjust probe samples -> probe times + + Returns + ------- + numpy.ndarray : + Sample timestamps in seconds on the master (default) or probe clock. + + """ + + in_range = np.where( + ((samples / self.local_probe_sampling_rate) >= self.min_time) + * ((samples / self.local_probe_sampling_rate) < self.max_time) + )[0] + + if self.global_probe_sampling_rate > 0: + + if sync_condition == "probe": + samples[in_range] = samples[in_range] / self.local_probe_sampling_rate + + elif sync_condition == "master": + samples[in_range] = ( + samples[in_range] / self.global_probe_sampling_rate + - self.total_time_shift + ) + + else: + raise ValueError( + "unrecognized sync condition: {}".format(sync_condition) + ) + + else: + samples[in_range] = -1 + + return samples + + @classmethod + def compute( + cls, + master_barcode_times, + master_barcodes, + probe_barcode_times, + probe_barcodes, + min_time, + max_time, + probe_start_index, + local_probe_sampling_rate, + ): + """Compute a transform from probe samples to master times by aligning barcodes. + + Parameters + ---------- + master_barcode_times : np.ndarray + start times of barcodes (according to the master clock) on the master line. + One per barcode. + master_barcodes : np.ndarray + barcode values on the master line. One per barcode + probe_barcode_times : np.ndarray + start times (according to the probe clock) of barcodes on the probe line. + One per barcode + probe_barcodes : np.ndarray + barcode values on the probe_line. One per barcode + min_time : Float + time (in seconds) of first barcode to align + max_time : Float + time (in seconds) of last barcode to align + probe_start_index : int + sample index of probe acquisition start time + local_probe_sampling_rate : float + the probe's apparent sampling rate + + Returns + ------- + ProbeSynchronizer : + When called, applies the transform computed here to samples on the probe clock. + + """ + + times_array = np.array(probe_barcode_times) + barcodes_array = np.array(probe_barcodes) + + ok_barcodes = np.where((times_array > min_time) * (times_array < max_time))[0] + times_to_align = list(times_array[ok_barcodes]) + barcodes_to_align = list(barcodes_array[ok_barcodes]) + + if len(barcodes_to_align) > 0: + + print("Num barcodes: " + str(len(barcodes_to_align))) + + total_time_shift, global_probe_sampling_rate, _ = barcode.get_probe_time_offset( + master_barcode_times, + master_barcodes, + times_to_align, + barcodes_to_align, + probe_start_index, + local_probe_sampling_rate, + ) + + else: + print("Not enough barcodes...setting sampling rate to 0") + total_time_shift = 0 + global_probe_sampling_rate = 0 + + return cls( + global_probe_sampling_rate, + local_probe_sampling_rate, + total_time_shift, + min_time, + max_time, + ) diff --git a/brain_observatory/ecephys/copy_utility/__init__.py b/brain_observatory/ecephys/copy_utility/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/copy_utility/__main__.py b/brain_observatory/ecephys/copy_utility/__main__.py new file mode 100644 index 0000000000..fdc59e5eaf --- /dev/null +++ b/brain_observatory/ecephys/copy_utility/__main__.py @@ -0,0 +1,171 @@ +import logging +import subprocess as sp +import shutil +import warnings +import copy as cp +from pathlib import Path + +import argschema + +from allensdk.config.manifest import Manifest +from ._schemas import ( + SessionUploadInputSchema, + SessionUploadOutputSchema, + available_hashers +) + + +def hash_file(path, hasher_cls, blocks_per_chunk=128): + """ + + """ + hasher = hasher_cls() + with open(path, 'rb') as f: + # TODO: Update to new assignment syntax if drop < python 3.8 support + for chunk in iter( + lambda: f.read(hasher.block_size*blocks_per_chunk), b""): + hasher.update(chunk) + return hasher.digest() + + +def walk_fs_tree(root, fn): + root = Path(root) + fn(root) + + if root.is_dir(): + for item in root.iterdir(): + walk_fs_tree(item, fn) + + +def copy_file_entry(source, dest, use_rsync, make_parent_dirs, chmod=None): + + leftmost = None + if make_parent_dirs: + leftmost = Manifest.safe_make_parent_dirs(dest) + + if use_rsync: + sp.check_call(['rsync', '-a', source, dest]) + else: + if Path(source).is_dir(): + shutil.copytree(source, dest) + else: + shutil.copy(source, dest) + + if chmod is not None: + chmod_target = leftmost if leftmost is not None else dest + + def apply_permissions(path): + return path.chmod(int(f"0o{chmod}", 0)) + + walk_fs_tree(chmod_target, apply_permissions) + + logging.info(f"copied from {source} to {dest}") + + +def raise_or_warn(message, do_raise, typ=None): + if do_raise is False: + typ = UserWarning if typ is None else typ + warnings.warn(message, typ) + + else: + typ = ValueError if typ is None else typ + raise typ(message) + + +def compare(source, dest, hasher_cls, raise_if_comparison_fails): + source_path = Path(source) + dest_path = Path(dest) + + if source_path.is_dir() and dest_path.is_dir(): + return compare_directories( + source, dest, hasher_cls, raise_if_comparison_fails) + elif (not source_path.is_dir()) and (not dest_path.is_dir()): + return compare_files( + source, dest, hasher_cls, raise_if_comparison_fails) + else: + raise_or_warn( + f"unable to compare files with directories: {source}, {dest}", + raise_if_comparison_fails + ) + + +def compare_files(source, dest, hasher_cls, raise_if_comparison_fails): + source_hash = hash_file(source, hasher_cls) + dest_hash = hash_file(dest, hasher_cls) + + if source_hash != dest_hash: + raise_or_warn( + f"comparison of {source} and {dest} " + f"using {hasher_cls.__name__} failed", raise_if_comparison_fails) + + return source_hash, dest_hash + + +def compare_directories(source, dest, hasher_cls, raise_if_comparison_fails): + source_contents = sorted([node for node in Path(source).iterdir()]) + dest_contents = sorted([node for node in Path(dest).iterdir()]) + + if len(source_contents) != len(dest_contents): + raise_or_warn( + f"{source} contains {len(source_contents)} items " + f"while {dest} contains {len(dest_contents)} items", + raise_if_comparison_fails + ) + + for sitem, ditem in zip(source_contents, dest_contents): + spath = str(Path(source, sitem)) + dpath = str(Path(dest, ditem)) + + if sitem != ditem: + raise_or_warn( + f"mismatch between {spath} and {dpath}", + raise_if_comparison_fails + ) + compare(spath, dpath, hasher_cls, raise_if_comparison_fails) + + +def main( + files, + use_rsync=True, + hasher_key=None, + raise_if_comparison_fails=True, + make_parent_dirs=True, + chmod=775, + **kwargs +): + hasher_cls = available_hashers[hasher_key] + output = [] + + for file_entry in files: + record = cp.deepcopy(file_entry) + + copy_file_entry( + file_entry['source'], file_entry['destination'], + use_rsync, make_parent_dirs, chmod=chmod + ) + + if hasher_cls is not None: + hashes = compare( + file_entry['source'], file_entry['destination'], + hasher_cls, raise_if_comparison_fails + ) + if hashes is not None: + record['source_hash'] = [int(ii) for ii in hashes[0]] + record['destination_hash'] = [int(ii) for ii in hashes[1]] + + output.append(record) + + return {'files': output} + + +if __name__ == '__main__': + logging.basicConfig( + format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') + + parser = argschema.ArgSchemaParser( + schema_type=SessionUploadInputSchema, + output_schema_type=SessionUploadOutputSchema, + ) + + output = main(**parser.args) + parser.output(output, indent=2) diff --git a/brain_observatory/ecephys/copy_utility/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/copy_utility/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65071403fa5b409e594947360cb6b9a63ed2b507 GIT binary patch literal 215 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NHbFz<B{XRzn?8$^ujJ|@xH)+l#1FpT z9mjpgt@C`uNO-?Ns;`8fGHRA&KOji9XX9-5U~L-z@wskh{NPpVIh;Ti6<h!#Um?^M zB}}=(-gD~|`kH9nDSE!u756%*iG#X<qoS-av>}_aYC)s06<zEh*fy4`Rw-0cJc=%8 aqeCo((5QnDg^SPO{A^`s)FOTMCbKV@kU#kV literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/copy_utility/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/copy_utility/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..959fd2e538090b3ed09748bc79befb9ebb407c42 GIT binary patch literal 4443 zcmbtX&2t<_6`$_;*xAu)CEJQE`6F2zoOoTa><Ux`Qo`g5iVq_Ub}%)iFg4olmByN# z*>sO=Yikw)Qk9*mI21P^l`08N{3%>H&WS3x_{=RQey?YxwUwM;cBj9)r{C+}`@Pri z%+3ZDp6su`jsJeqvi?Pt!^cJ8Exh{QNQ5O=YK3*qLT>7IXq( h1AEhn%O4fgk#; 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/copy_utility/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/copy_utility/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b5d38c3ea6794895b34f0f2a74b1850d2e6535c GIT binary patch literal 2874 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 VwQttCAU4sv@ASL<R{z?j`xl>B&sqQg literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/copy_utility/_schemas.py b/brain_observatory/ecephys/copy_utility/_schemas.py new file mode 100644 index 0000000000..ea3c7f7c14 --- /dev/null +++ b/brain_observatory/ecephys/copy_utility/_schemas.py @@ -0,0 +1,74 @@ +import hashlib +from argschema import ArgSchema +from argschema.fields import ( + LogLevel, String, Int, Nested, Boolean, List, InputFile) +from argschema.schemas import DefaultSchema + + +available_hashers = { + 'sha3_256': hashlib.sha3_256, + 'sha256': hashlib.sha256, + None: None +} + + +class FileExists(InputFile): + pass + + +class FileToCopy(DefaultSchema): + source = InputFile( + required=True, + description='copy from here') + destination = String( + required=True, + description='copy to here (full path, not just directory!)') + key = String(required=True, + description='will be passed through to outputs, allowing a ' + 'name or kind to be associated with this file') + + +class CopiedFile(DefaultSchema): + source = InputFile(required=True, description='copied from here') + destination = FileExists(required=True, description='copied to here') + key = String(required=False, description='passed from inputs') + source_hash = List(Int, + required=False) # int array vs bytes for JSONability + destination_hash = List(Int, required=False) + + +class NonFileParameters(DefaultSchema): + use_rsync = Boolean(default=True, + description='copy files using rsync rather than ' + 'shutil (this is not likely to work if ' + 'you are running windows!)' + ) + hasher_key = String(default='sha256', + validate=lambda st: st in available_hashers, + allow_none=True, + description='select a hash function to compute over ' + 'base64-encoded pre- and post-copy files' + ) + raise_if_comparison_fails = Boolean(default=True, + description='if a hash comparison ' + 'fails, throw an error (' + 'vs. a warning)') + make_parent_dirs = Boolean(default=True, + description='build missing parent directories ' + 'for destination') + chmod = Int(default=775, + description="destination files (and any created parents will " + "have these permissions") + + +class SessionUploadInputSchema(ArgSchema, NonFileParameters): + log_level = LogLevel(default='INFO', + description='set the logging level of the module') + files = Nested(FileToCopy, many=True, required=True, + description='files to be copied') + + +class SessionUploadOutputSchema(DefaultSchema): + input_parameters = Nested(NonFileParameters) + files = Nested(CopiedFile, many=True, required=True, + description='copied files') diff --git a/brain_observatory/ecephys/current_source_density/__init__.py b/brain_observatory/ecephys/current_source_density/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/current_source_density/__main__.py b/brain_observatory/ecephys/current_source_density/__main__.py new file mode 100644 index 0000000000..1d6eef4f3b --- /dev/null +++ b/brain_observatory/ecephys/current_source_density/__main__.py @@ -0,0 +1,188 @@ +import numpy as np +import requests +import logging +import sys + +import os +import pandas as pd +import h5py + +from pathlib import Path + +from typing import Optional + +from ._schemas import InputParameters, OutputParameters +from ._current_source_density import ( + accumulate_lfp_data, + compute_csd, + extract_trial_windows +) +from ._filter_utils import filter_lfp_channels, select_good_channels +from ._interpolation_utils import ( + interp_channel_locs, + make_actual_channel_locations, + make_interp_channel_locations +) +from allensdk.brain_observatory.ecephys.file_io.continuous_file import ( + ContinuousFile +) +from allensdk.brain_observatory.argschema_utilities import ( + write_or_print_outputs, optional_lims_inputs +) + + +def get_inputs_from_lims(args) -> dict: + + session_id = args.session_id + output_root = args.output_root + host = args.host + + request_str = ''.join(''' + {}/input_jsons? + strategy_class=EcephysCurrentSourceDensityStrategy& + object_id={}& + object_class=EcephysSession& + job_queue_name=ECEPHYS_CURRENT_SOURCE_DENSITY_QUEUE + '''.format(host, session_id).split()) + + response = requests.get(request_str) + data = response.json() + + if data['num_trials'] == 'null': + data['num_trials'] = None + else: + data['num_trials'] = int(data['num_trials']) + + data['pre_stimulus_time'] = float(data['pre_stimulus_time']) + data['post_stimulus_time'] = float(data['post_stimulus_time']) + data['surface_channel_adjustment'] = int(data['surface_channel_adjustment']) + + for probe in data['probes']: + probe['surface_channel_adjustment'] = int(probe['surface_channel_adjustment']) + probe['csd_output_path'] = os.path.join(output_root, os.path.split(probe['csd_output_path'])[-1]) + probe['phase'] = str(probe['phase']) + + return data + + +def run_csd(args: dict) -> dict: + + stimulus_table = pd.read_csv(args['stimulus']['stimulus_table_path']) + + probewise_outputs = [] + for probe_idx, probe in enumerate(args['probes']): + logging.info('Processing probe: {} (index: {})'.format(probe['name'], + probe_idx)) + + time_step = 1.0 / probe['sampling_rate'] + logging.info('Calculated time step: {}'.format(time_step)) + + logging.info('Extracting trial windows') + trial_windows, relative_window = extract_trial_windows( + stimulus_table=stimulus_table, + stimulus_name=args['stimulus']['key'], + time_step=time_step, + pre_stimulus_time=args['pre_stimulus_time'], + post_stimulus_time=args['post_stimulus_time'], + num_trials=args['num_trials'], + stimulus_index=args['stimulus']['index'] + ) + + logging.info('Loading LFP data') + lfp_data_file = ContinuousFile(probe['lfp_data_path'], + probe['lfp_timestamps_path'], + probe['total_channels']) + lfp_raw, timestamps = lfp_data_file.load(memmap=args['memmap'], + memmap_thresh=args['memmap_thresh']) + + if probe['phase'].lower() == '3a': + lfp_channels = lfp_data_file.get_lfp_channel_order() + else: + lfp_channels = np.arange(0, probe['total_channels']) + + logging.info('Accumulating LFP data') + accumulated_lfp_data = accumulate_lfp_data(timestamps=timestamps, + lfp_raw=lfp_raw, + lfp_channels=lfp_channels, + trial_windows=trial_windows, + volts_per_bit=args['volts_per_bit']) + + logging.info('Removing noisy and reference channels') + clean_lfp, clean_channels = select_good_channels(lfp=accumulated_lfp_data, + reference_channels=probe['reference_channels'], + noisy_channel_threshold=args['noisy_channel_threshold']) + + logging.info('Bandpass filtering LFP channel data') + filt_lfp = filter_lfp_channels(lfp=clean_lfp, + sampling_rate=probe['sampling_rate'], + filter_cuts=args['filter_cuts'], + filter_order=args['filter_order']) + + logging.info('Interpolating LFP channel locations') + actual_locs = make_actual_channel_locations(0, accumulated_lfp_data.shape[1]) + clean_actual_locs = actual_locs[clean_channels, :] + interp_locs = make_interp_channel_locations(0, accumulated_lfp_data.shape[1]) + interp_lfp, spacing = interp_channel_locs(lfp=filt_lfp, + actual_locs=clean_actual_locs, + interp_locs=interp_locs) + + logging.info('Averaging LFPs over trials') + trial_mean_lfp = np.nanmean(interp_lfp, axis=0) + + logging.info('Computing CSD') + current_source_density, csd_channels = compute_csd(trial_mean_lfp=trial_mean_lfp, + spacing=spacing) + + logging.info('Saving data') + write_csd_to_h5( + path=probe["csd_output_path"], + csd=current_source_density, + relative_window=relative_window, + channels=csd_channels, + csd_locations=interp_locs, + stimulus_name=args['stimulus']['key'], + stimulus_index=args["stimulus"]["index"], + num_trials=args["num_trials"] + ) + + probewise_outputs.append({ + 'name': probe['name'], + 'csd_path': probe['csd_output_path'], + }) + + return { + 'probe_outputs': probewise_outputs, + } + + +def write_csd_to_h5(path: Path, csd: np.ndarray, relative_window, + channels: np.ndarray, csd_locations: np.ndarray, + stimulus_name: str, stimulus_index: Optional[int], + num_trials: Optional[int]): + with h5py.File(str(path), "w") as output: + output.create_dataset("current_source_density", data=csd) + output.create_dataset("timestamps", data=relative_window) + output.create_dataset("channels", data=channels) + output.create_dataset("csd_locations", data=csd_locations) + + output.attrs["stimulus_name"] = str(stimulus_name) + + if num_trials is not None: + output.attrs["num_trials"] = int(num_trials) + + if stimulus_index is not None: + output.attrs["stimulus_index"] = int(stimulus_index) + + +def main(): + + logging.basicConfig(format=('%(asctime)s:%(funcName)s' + ':%(levelname)s:%(message)s')) + parser = optional_lims_inputs(sys.argv, InputParameters, + OutputParameters, get_inputs_from_lims) + output = run_csd(parser.args) + write_or_print_outputs(output, parser) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbb92d7853a3692738ef63338b85e0c25f372c96 GIT binary patch literal 225 zcmYL@zX}2|48|)sh~R@b=nZZn;-6Jq#H~<rZP0ROdbB;IqpPps<SV)Q2yRZMgBbXJ z3E}%fR)axbaMAq=xxX@g)!|{m3SEW~J2C8RAHwJLAD`QLD)#|>kZ=SuF5v={<dQ%; zGBA-y=OA5!6g1N{#}wqomNM9gqXu*Z2jpyBv%^$H>A{k6C0{&4bUqcRF^3A>dXE%U gaIM#<4Et?Ng;JJmRBGI$XK!|Lrmb<Fe|)pV7g+&BCjbBd literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11fb91e157783ec5a989090e772aaf03b6ad2a8d GIT binary patch literal 4907 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 S&?+`BwA_-GXt$hd)%-8g&rXj3 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_current_source_density.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_current_source_density.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f35cecbefb22c1aebae02904aed7d0378303ee57 GIT binary patch literal 6561 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_filter_utils.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_filter_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa7ea5dde65e9ea185730b7d2f5213faf4871ee7 GIT binary patch literal 2531 zcmb_e%WfMt6dle>Bik`j$9*{6u-OS|>_xi@il9k~u8cNt+Ra48fErTPI3tcgQg#H4 z7X`Wv`U6?i=&FCxZ<uX?0{(@rddShpa#I&YQ39kyioCq{+;b20<kqbX4^963J^Quq zdB537*J6D699@?fxW`H9O-V|oe(DoD_sbv+@fnoSG)`mUiSVQ+h)DK4(HFj(VP)*^ zc|3d*@`%Sjgz1J`?_*yd`w~0jy*Ck0cptxRa{swE*to=v-oS6d!$O-T`er^W#a9E; z#JV_^tQ>?*P>yHKjuK;`gv>>jPneXV)Xn>{D)ge8XJ(>=o>V1oVkOL6$vm*O(Gv6? z`crflqVawr=zfh*FMRG__~!xUK^@fo%kYA51acl?#rCKs7o-ly{slRYFptrD9A{4w z9_)D+ejVXFR!`#Et0Nxp@O5zBt9x}kwjoCBci;1l#I!mUbQK2e!k|p@tBIK~LzxoP zR26mc(Xpzg6c|v>4BOw>plHvSVpCy+(r)@-)!fu>en{nfI$P{Z&Xi&cw{A}!e)-H9 zqJ^YpBIvkMQ(BE5Qlko1YWnKRmsivjQ$aPGA}8%dEB8CpH7>H5dr?U9-RhE~E?J#1 z+{TMsXnP&5Ei|2}Y9#jEi5t=g%j2?QW@YuTIuqK^sbG?71K612l#A1XnWD1M0J^-A z+7xDPa2KQZ@)DcxxuBPLxA+}7f?Na7UE}EY!krR41CAfl<ErA>(*3Il*S6e*bcgoY z1jJoSyv=u;*%bvQ4AdA2A+gQUgtx$03$}fM#3SOOEN#|q%ouX_R>JJ@^$7mS*~gYB z;KEx;Tai+V0-RB6!ARuO1=D(b38s6BV7Rmc>NsSt3O(pIzMQ3@O<fvj!<)#Vl5Qej zIWt0{H<4p%6LV35+Gz}q%VR9-37d&Qq9SYCN|mz3oZeo-mz^?D7s`-sUt^L^`=-iT zK+~;t5OA&KMVsMYJoOID{qf_|hr@3*Dr(3kjPH-w8Iz0QW69tmXP*p(Jk`T$CZx_W zR<p@M4-bpcP!~o#n6dmNI~F)wme|2x9*h(#WLAw}@sycLEe=F3?4g5vt{`M4)74x- z&N%iLW^s^>ixLH$&5>ulKU*}r8aU)8bDnopv61U74BiL3WXInncZ1u$x`X*3asV~A zT)h_ZI8zqX&869VZgjJ?oK%VnrK~LGp|ypEC&9DWI*ojUFE!!h!&U`J4ehH#%p&7E zm5iX7!4Rr<-ZTD5SjSL1Xekd~hv!M1K=nfQDY)<iWS=pOx_7}j8C!<(Kg*e^P(aIT z1plkLtu*9csoXUL-;$x{Ru6$MwfH(g>%`gJvW9o3jZVg{v;#WkM1N8oPbl)@Y>ciW zwQkB~3$`G!t2n;48T{LWZp%&j);iY`|0XH0FNCZ33Dd18b-n@D&H!a)1qkd5(!LMW z*7=oeJ@3@&KfE!PifPhaIv{Ej3!t~9z1p^eC2bmy<^~0mCe|n02mMwecI}pT?eL!6 z=by=RyY)K*+SPch8!~DLOPA%)!r@e)9d>Z6xwAZi<gOmO`}je-zfpS$*+%{C_-YSp zgRLeuiy26voB-NC9%<wrVCQuj>AaXNTEBbCC%Flb&?a)^a24!Kt+`=kNjYDV&!!ch bm*SBXRc+(DO%i`A2uVzQa`&SUV@&=8lz`-9 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_interpolation_utils.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_interpolation_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb13c77df07fa1dc7a2dcf539a10a738cbe387db GIT binary patch literal 5345 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 KpM4ki`o961J*UV3 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c009cf29cdcdc10ad185f85eca7a832eee038fae GIT binary patch literal 4293 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 A+W-In literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/current_source_density/_current_source_density.py b/brain_observatory/ecephys/current_source_density/_current_source_density.py new file mode 100644 index 0000000000..c80f6b019e --- /dev/null +++ b/brain_observatory/ecephys/current_source_density/_current_source_density.py @@ -0,0 +1,182 @@ +import logging + +import numpy as np +import pandas as pd + +from typing import Callable, List, Optional, Tuple + +from ._interpolation_utils import regular_grid_extractor_factory + + +def extract_trial_windows( + stimulus_table: pd.DataFrame, stimulus_name: str, + time_step: float, pre_stimulus_time: float, post_stimulus_time: float, + num_trials: Optional[int] = None, + stimulus_index: Optional[int] = None, + name_field: str = 'stimulus_name', index_field: str = 'stimulus_index', + start_field: str = 'Start', end_field: str = 'End' +) -> Tuple[List[np.ndarray], np.ndarray]: + '''Obtains time interval surrounding stimulus sweep onsets + + Parameters + ---------- + stimulus_table : pandas.DataFrame + Each row is a stimulus sweep. Columns report stimulus name and + parameters for that sweep, as well as its start and end times. + stimulus_name : str + Obtain sweeps from stimuli with this name + (identifies the kind of stimulus presented). + stimulus_index : Optional[int], optional + Obtain sweeps from stimuli with this index + (used to disambiguate presentations of stimuli with the same name), + by default None. + time_step : float + Specifies the step of the resulting temporal domain (seconds). + pre_stimulus_time : float + How far before stimulus onset to begin the temporal domain (seconds). + post_stimulus_time : float + How far after stimulus onset to end the temporal domain + (exclusive, seconds). + num_trials : Optional[int], optional + A window will be computed for this many sweeps, by default None + name_field : str, optional + Column from which to extract stimulus name, by default 'stimulus_name' + index_field : str, optional + Column from which to extract stimulus index, + by default 'stimulus_index' + start_field : str, optional + Column from which to extract start times, by default 'Start' + end_field : str, optional + Column from which to extract end times, by default 'End' + + Returns + ------- + Tuple[trial_windows, relative_times] + trial_windows : List[numpy.ndarray] + For each trial, an array of timestamps surrounding that + trial's onset. + relative_times : numpy.ndarray + The basic time domain, centered on 0. + ''' + + if stimulus_index is None: + stimulus_index = np.amin(stimulus_table[stimulus_table[name_field] + == stimulus_name][index_field].values) + + stimulus_name_mask = (stimulus_table[name_field] == stimulus_name) + stimulus_index_mask = (stimulus_table[index_field] == stimulus_index) + trials = stimulus_table[stimulus_name_mask & stimulus_index_mask] + + if num_trials is not None: + trials = trials.iloc[:num_trials, :] + trials = trials.to_dict('record') + + relative_times = np.arange(-pre_stimulus_time, + post_stimulus_time, + time_step) + trial_windows = [relative_times + trial[start_field] for trial in trials] + + msg = 'calculated relative timestamps: {} ({} timestamps per trial)' + logging.info(msg.format(relative_times, len(relative_times))) + msg = 'setup {} trial windows spanning {} to {}' + logging.info(msg.format(len(trial_windows), + trial_windows[0][0], + trial_windows[-1][-1])) + return (trial_windows, relative_times) + + +def accumulate_lfp_data(timestamps: np.ndarray, lfp_raw: np.ndarray, + lfp_channels: np.ndarray, + trial_windows: List[np.ndarray], + volts_per_bit: float = 1.0, + extractor_factory: Callable = ( + regular_grid_extractor_factory) + ) -> np.ndarray: + ''' Extracts slices of LFP data at defined channels and times. + + Parameters + ---------- + timestamps : numpy.ndarray + Associates LFP sample indices with times in seconds. + lfp_raw : numpy.ndarray + Dimensions are samples X channels. + lfp_channels : numpy.ndarray + Indices of channels to be used in accumulation + trial_windows : List[numpy.ndarray] + Each window is a list of times from which LFP data will be extracted. + volts_per_bit: float, optional + Scaling factor for raw integers into microvolts, defaults to 1.0 + (no conversion) + extractor_factory: Callable + The LFP extractor function to use, defaults to + regular_grid_extractor_factory + + Returns + ------- + accumulated : numpy.ndarray + Extracted data. Dimensions are trials X channels X samples + + ''' + + num_samples = min(len(tw) for tw in trial_windows) + num_trials = len(trial_windows) + num_channels = len(lfp_channels) + + accumulated = np.zeros((num_trials, num_channels, num_samples), + dtype=lfp_raw.dtype) + + for channel_idx, chan in enumerate(lfp_channels): + logging.info('extracting lfp for channel {}'.format(chan)) + extractor = extractor_factory(timestamps, lfp_raw, chan) + + for trial_index, trial_window in enumerate(trial_windows): + current = extractor(trial_window)[:num_samples] + + if np.issubdtype(accumulated.dtype, np.integer): + current = np.around(current).astype(accumulated.dtype) + accumulated[trial_index, channel_idx, :] = current + + msg = 'extracted lfp data for {} trials, {} channels, and {} samples' + logging.info(msg.format(*accumulated.shape)) + return accumulated * volts_per_bit + + +def compute_csd(trial_mean_lfp: np.ndarray, + spacing: float) -> Tuple[np.ndarray, np.ndarray]: + '''Compute current source density for real or virtual channels from + a neuropixels probe. + + Compute a second spatial derivative along the probe length + as a 1D approximation of the Laplacian, after Pitts (1952). + + Parameters + ---------- + trial_mean_lfp: numpy.ndarray + LFP traces surrounding presentation of a common stimulus that + have been averaged over trials. Dimensions are channels X time samples. + spacing : float + Distance between channels, in millimeters. This spacing may be + physical distances between channels or a virtual distance if channels + have been interpolated to new virtual positions. + + Returns + ------- + Tuple[csd, csd_channels]: + csd : numpy.ndarray + Current source density. Dimensions are channels X time samples. + csd_channels: numpy.ndarray + Array of channel indices for CSD. + ''' + + # Need to pad lfp channels for Laplacian approx. + padded_lfp = np.pad(trial_mean_lfp, + pad_width=((1, 1), (0, 0)), + mode='edge') + + csd = (1 / (spacing ** 2)) * (padded_lfp[2:, :] + - (2 * padded_lfp[1:-1, :]) + + padded_lfp[:-2, :]) + + csd_channels = np.arange(0, trial_mean_lfp.shape[0]) + + return (csd, csd_channels) diff --git a/brain_observatory/ecephys/current_source_density/_filter_utils.py b/brain_observatory/ecephys/current_source_density/_filter_utils.py new file mode 100644 index 0000000000..262422cd64 --- /dev/null +++ b/brain_observatory/ecephys/current_source_density/_filter_utils.py @@ -0,0 +1,74 @@ +from typing import List, Tuple +import numpy as np + +from scipy import signal + + +def select_good_channels(lfp: np.ndarray, + reference_channels: List[int], + noisy_channel_threshold: float + ) -> Tuple[np.ndarray, np.ndarray]: + """Remove reference channels and channels that are too noisy from lfp data. + + Parameters + ---------- + lfp : numpy.ndarray + LFP data in the form of: trials x channels x time samples + reference_channels : List[int] + Reference channel indices for this probe. + noisy_channel_threshold : float + Lowest mean standard deviation that constitutes a "clean" LFP channel + + Returns + ------- + Tuple[cleaned_lfp, good_indices] + cleaned_lfp: numpy.ndarray + LFP where reference and noisy channels have been removed. + Data still in form of: trials x channel x time samples + good_indices: numpy.ndarray + Array of channel indices that are neither reference nor noisy. + """ + channel_variance = np.mean(np.std(lfp, 2), 0) + noisy_channels = np.where(channel_variance > noisy_channel_threshold)[0] + + to_remove = np.concatenate((np.array(reference_channels), noisy_channels)) + good_indices = np.delete(np.arange(0, lfp.shape[1]), to_remove) + + # Remove noisy or reference channels (axis=1) + cleaned_lfp = np.delete(lfp, to_remove, axis=1) + + return (cleaned_lfp, good_indices) + + +def filter_lfp_channels(lfp: np.ndarray, + sampling_rate: float, + filter_cuts: List[float], + filter_order: int) -> np.ndarray: + '''Bandpass filter lfp channel data. + + Parameters + ---------- + lfp : numpy.ndarray + LFP data to be filtered in the form of: + trials x channels x time samples + sampling_rate : float + Sampling rate for lfp data + filter_cuts : List[float] + Low and high cut for bandpass filter + filter_order : int + Order for bandpass filter + + Returns + ------- + filtered_lfp: numpy.ndarray + LFP that has been bandpassed filtered along the sample axis. + Still in the form of: trials x channels x time samples + ''' + + wn = (sampling_rate / 2) + filter_cutoffs = np.array(filter_cuts) / wn + b, a = signal.butter(filter_order, filter_cutoffs, 'bandpass') + # Bandpass filter time samples (axis=2) + filtered_lfp = signal.filtfilt(b, a, lfp, axis=2) + + return filtered_lfp diff --git a/brain_observatory/ecephys/current_source_density/_interpolation_utils.py b/brain_observatory/ecephys/current_source_density/_interpolation_utils.py new file mode 100644 index 0000000000..6f6545af49 --- /dev/null +++ b/brain_observatory/ecephys/current_source_density/_interpolation_utils.py @@ -0,0 +1,175 @@ +from typing import Tuple + +import numpy as np + +from scipy.interpolate import RegularGridInterpolator, griddata + + +def regular_grid_extractor_factory(timestamps: np.ndarray, + lfp_raw: np.ndarray, + channel: int, + method: str = 'linear') -> np.ndarray: + '''Builds an LFP data extractor using interpolation on a regular grid + + Ignores timestamps less than zero (which result from unaligned + data segments) + + Parameters + ---------- + timestamps : numpy.ndarray + Associates LFP sample indices with times in seconds. + lfp_raw : numpy.ndarray + Dimensions are samples X channels. + channel : int + Index of channel to interpolate to regular grid. + method : str, optional + Interpolation method ['linear', 'cubic', 'nearest'], + by default 'linear'. + + Returns + ------- + numpy.ndarray + LFP data that has been interpolated to a regular grid. + ''' + + valid_timestamps = (timestamps >= 0) + + return RegularGridInterpolator((timestamps[valid_timestamps],), + lfp_raw[valid_timestamps, channel], + method=method, + bounds_error=False, + fill_value=np.nan) + + +def make_actual_channel_locations(min_chan: int = 0, + max_chan: int = 384) -> np.ndarray: + '''Generate x/y locations of Neuropixels recording sites. + + 0 8 16 24 32 40 48 + 60 * - - - * - - + 50 - - - - - - - + 40 - - * - - - * <-- actual recording site (*) + 30 - - - - - - - + 20 * - - - * - - + 10 - - - - - - - + 0 - - * - - - * + + Parameters + ---------- + min_chan : int, optional + Lowest channel number to use, by default 0 + max_chan : int, optional + Highest channel number to use, by default 384 + + Returns + ------- + actual_channel_locations: numpy.ndarray + column 1 = x positions in microns + column 2 = y positions in microns + ''' + + actual_channel_locations = np.zeros((max_chan, 2)) + + x_locations = [16, 48, 0, 32] + + for ch in range(min_chan, max_chan): + actual_channel_locations[ch, 0] = x_locations[ch % 4] + actual_channel_locations[ch, 1] = np.floor(ch / 2) * 20 + + return actual_channel_locations[min_chan:, :] + + +def make_interp_channel_locations(min_chan: int = 0, + max_chan: int = 384) -> np.ndarray: + '''Generate x/y locations for interpolated Neuropixels recording sites. + + This version just returns the central column of interpolated sites. + + 0 8 16 24 32 40 48 + 60 * - - o * - - + 50 - - - o - - - + 40 - - * o - - * <-- actual recording site (*) + 30 - - - o - - - + 20 * - - o * - - + 10 - - - o - - - + 0 - - * o - - * + ^ + interpolated column sites (o) + + Parameters + ---------- + min_chan : int, optional + Lowest channel number to use, by default 0 + max_chan : int, optional + Highest channel number to use, by default 384 + + Returns + ------- + interp_channel_locations: numpy.ndarray + column 1 = interpolated x positions in microns + column 2 = y positions in microns + ''' + + interp_channel_locations = np.zeros((max_chan, 2)) + + for ch in range(min_chan, max_chan): + interp_channel_locations[ch, 0] = 24 + interp_channel_locations[ch, 1] = ch * 10 + + return interp_channel_locations[min_chan:, :] + + +def interp_channel_locs(lfp: np.ndarray, + actual_locs: np.ndarray, + interp_locs: np.ndarray, + method: str = 'cubic') -> Tuple[np.ndarray, float]: + '''Interpolates single-trial lfp channel locations to account for + channel stagger. + + Parameters + ---------- + lfp : numpy.ndarray + LFP data in the form of: trials x channels x time samples + actual_locs: numpy.ndarray + An array of actual x, y locations for all channels in lfp. The + number of actual_locs should equal the number of channels in the 'lfp'. + interp_locs: numpy.ndarray + An array of virtual x, y locations for where channels in lfp + should be interpolated to. + + method : str, optional + Interpolation method ['cubic', 'linear', 'nearest'], by default 'cubic' + + Returns + ------- + Tuple[interp_lfp, spacing] + interp_lfp: numpy.ndarray + Channel location interpolated lfp data in the form of: + trials x channels x time samples + spacing: float + Distance between new interpolated virtual channel sites + (in millimeters) + ''' + + if lfp.shape[1] != actual_locs.shape[0]: + e_msg = (f"Number of 'lfp' channels ({lfp.shape[1]}) does not " + f"match number of 'actual_locs' ({actual_locs.shape[0]})!") + raise RuntimeError(e_msg) + + spacing = np.mean(np.diff(interp_locs[:, 1])) / 1000 + + interp_lfp = np.zeros((lfp.shape[0], # number of interp trials + interp_locs.shape[0], # number of interp channels + lfp.shape[2])) # number of interp samples + + for trial in range(lfp.shape[0]): # trials + trial_data = lfp[trial, :, :] + for t in range(0, lfp.shape[2]): # time samples + interp_lfp[trial, :, t] = griddata(points=actual_locs, + values=trial_data[:, t], + xi=interp_locs, + method=method, + fill_value=0, + rescale=False) + + return (interp_lfp, spacing) diff --git a/brain_observatory/ecephys/current_source_density/_schemas.py b/brain_observatory/ecephys/current_source_density/_schemas.py new file mode 100644 index 0000000000..6d5c0b0bc0 --- /dev/null +++ b/brain_observatory/ecephys/current_source_density/_schemas.py @@ -0,0 +1,103 @@ +import numpy as np +from argschema import ArgSchema +from argschema.fields import Nested, String, Float, Int, List, Bool +from argschema.schemas import DefaultSchema + + +class ProbeInputParameters(DefaultSchema): + name = String(required=True, help='Identifier for this probe.') + lfp_data_path = String(required=True, + help='Path to lfp data for this probe') + lfp_timestamps_path = String(required=True, + help="Path to aligned lfp timestamps for " + "this probe.") + surface_channel = Int(required=True, + help='Estimate of surface (pia boundary) channel ' + 'index') + reference_channels = List(Int, many=True, + help='Indices of reference channels for this ' + 'probe') + csd_output_path = String(required=True, + help='CSD output will be written here.') + sampling_rate = Float(required=True, + help='sampling rate assessed on master clock') + total_channels = Int(default=384, + help='Total channel count for this probe.') + surface_channel_adjustment = Int(default=40, + help='Erring up in the surface channel ' + 'estimate is less dangerous for ' + 'the CSD calculation than erring ' + 'down, so an adjustment is ' + 'provided.') + spacing = Float(default=0.04, + help='distance (in millimiters) between ' + 'lengthwise-adjacent rows of recording sites on ' + 'this probe.') + phase = String(required=True, + help='The probe type (3a or PXI) which determines if ' + 'channels need to be reordered') + + +class StimulusInputParameters(DefaultSchema): + stimulus_table_path = String(required=True, help='Path to stimulus table') + key = String(required=True, + help='CSD is calculated from a specific stimulus, defined (' + 'in part) by this key.') + index = Int(default=None, allow_none=True, + help='CSD is calculated from a specific stimulus, defined (' + 'in part) by this index.') + + +class InputParameters(ArgSchema): + stimulus = Nested(StimulusInputParameters, required=True, + help='Defines the stimulus from which CSD is calculated') + probes = Nested(ProbeInputParameters, many=True, required=True, + help='Probewise parameters.') + pre_stimulus_time = Float(required=True, + help='how much time pre stimulus onset is used ' + 'for CSD calculation ') + post_stimulus_time = Float(required=True, + help='how much time post stimulus onset is ' + 'used for CSD calculation ') + num_trials = Int(default=None, allow_none=True, + help='Number of trials after stimulus onset from which ' + 'to compute CSD') + volts_per_bit = Float(default=1.0, + help='If the data are not in units of volts, ' + 'they must be converted. In the past, ' + 'this value was 0.195') + memmap = Bool(default=False, + help='whether to memory map the data file on disk or load ' + 'it directly to main memory') + memmap_thresh = Float(default=np.inf, + help='files larger than this threshold (bytes) ' + 'will be memmapped, regardless of the memmap ' + 'setting.') + filter_cuts = List(Float, default=[5.0, 150.0], + cli_as_single_argument=True, + help='Cutoff frequencies for bandpass filter') + filter_order = Int(default=5, help='Order for bandpass filter') + reorder_channels = Bool(default=True, + help='Determines whether LFP channels should be ' + 're-ordered') + noisy_channel_threshold = Float(default=1500.0, + help='Threshold for removing noisy ' + 'channels from analysis') + + +class ProbeOutputParameters(DefaultSchema): + name = String(required=True, help='Identifier for this probe.') + csd_path = String(required=True, + help='Path to current source density file.') + + +class OutputSchema(DefaultSchema): + input_parameters = Nested(InputParameters, + description=("Input parameters the module " + "was run with"), + required=True) + + +class OutputParameters(OutputSchema): + probe_outputs = Nested(ProbeOutputParameters, many=True, required=True, + help='probewise outputs') diff --git a/brain_observatory/ecephys/ecephys_project_api/__init__.py b/brain_observatory/ecephys/ecephys_project_api/__init__.py new file mode 100644 index 0000000000..72a218f380 --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/__init__.py @@ -0,0 +1,4 @@ +from .ecephys_project_api import EcephysProjectApi +from .ecephys_project_lims_api import EcephysProjectLimsApi +from .ecephys_project_warehouse_api import EcephysProjectWarehouseApi +from .ecephys_project_fixed_api import EcephysProjectFixedApi, MissingDataError diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cad0cff067bfbb399871bc524e8fda477a9bf69f GIT binary patch literal 532 zcmZ9JPfNov6u{GV-KIEDL{Y&Hu!Gydi-?F*=V^){B9uaTZQ~Y~CL!rId-UW7@#I(P z)stVrlP{eEw}iaByx;qm<g(RTCpg5%8~6?(U-qyVE-Dwe%n6E=qz)&U6F835UG8RH z;8nWEYndNlINEExo;89-)(o0>_8&;Q{*8G_+bOsD300%Q+-vzllf0)G8h4hB1D2UN zI9LWxpy^0X47JoPcbDl6d!;Foa`ToM!^H3!a_DO<^<8@{*rxNsk(yVIKrwAE7woMP zj`b_-S$w#PXNxW>pPKdAU-fymy;R&suIng1iEdckil6tZ)9}$yZ9*79+KFKXq6m8e z5-CzR4yl-$P%0`+f>PQS3kNI?4a@0~f@BOsim{xdM>_7t8kmS=j2WkpOI>vT8d~iC eZ{3X|CRiRt9aWUgvrMKFPS5TC7~AKDW9Ki%Yo?I^ literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..927ca21fc363c447bcc6df087ec16e67e4e6a5a1 GIT binary patch literal 2689 zcmbVOOK%%D5avF$dRn%Whiu1j(iav@odUfSZ4tyx(;`Kn6iC~{LcoGrGWOc5)s|d2 zm2R#53wqYAr~ZTf7G8VmU+AebT+4RUtsR(xhU9W)_M30W;eOd{)(Eup_h0Cr9wC3> zWYJt0Jchsg76c>ANXW<tjFB0bBP*~Bd}bzg;OO2BD%@li_qcOV<&}dPuOB->;~T<k z=A01b9GgLtnJ<a&{tf<!Zz=CZmdE3iCaUuNG~+)~p}c1~7j&5LzN+pDL8s5-Lmr|2 zqE%q<82*wNgm4lVj07gz;ug1i1f<ggRC7SW>=P$&d4+q-fw{{nCw5R}9;=>^pvLZ= zSrm2`CHkn%9ad)z@KI;mrMjrqoZGC$RzR!4?k#EIdV6lMRkjA}O^u`jNV@C>AZY=v zn{$KRVz*(oaysj=b(po;{Uu+BZuMY|ZNU3B*&XoLVFqydj#_;h@oax8zZ2sF9_71P z-1kjYmt0EVHjJ56jchVZV!6**Nb|@#WfFU!kUT*$aTny|nEVQKf?K2S8>-VE=g&r2 z!bd#KIeRL^SU}cn$&*(C(;#5SkUxm1L-)^bPd*#`Ai0nOx=-28kiMqrbg-M!Xq+<o z$$+Ovaxl(#DkG3%ggkg24+k>N`9~Rz4(T2T+av)EcKC28Xq<-QA$UBZ`B+RJ@*>Vf zA7(|sA<g2lXFJ(cHTHNOo-!fZfKr+uh%?*z4{19WRe`|TIf2R*JfDa((#Bwq{bkIF zDk%7-KvG2u1u|5K28>ku!plNNb9xJ&7TAp0{Y$ZF^$6dNZIQzlFfPksfyB~ClugB+ zRPNzx?3W>R5K=7TkpG-<5o5~bI(pSX8?*PyQ7u{cj`AjH44z=y)uVlyraaM;Dx_=3 zad^IUBCIgju)ms6w;;3&%Hjr!n<&mU;&Mb)j0nNVJD^v@;mtP6<IsA(UFJ7(z#JR) zSEF<aly3o0@6J<><Okrqz*zae-MLWpt)<8#8{t92{%VAFf$(znYRI0>nfw^M7SP<; zW;uO@A{-lUk!G<1R@XZ*xb2pcxpoF8OkQRB5PW(D%b2};39K^%-?%;~<))L-kc(wp z>xe6*P#$O!j>bnZ4|5JRlji*M3-}(C<10739&4K=ti6FwMm#-7_vr1>y=e%C1W%yq z@S+|s>Z?BG%|+GB;XaoI-PhWj`jFqnkhW1Q)z9AIXonQO9;Pyu;fUuVj^r+AFZSw( z<)rKSv~1^_{l4$?vH7-^77n%ODldc_k9ZiWS_oNYlLW_&F#KsklVU|+ofKFilqGW^ zntBwcxxn}ZUOu9O0!zKPjiQHQ0|gc+u?0ez84Idk!Hw{>fES8;xNsi49^nlluwvo~ zlRF?hix}&6+wvSZ{rdO7E&BI$zYS|GtEE@FhPL%v%7q-o>0SXGFA|M3aA2du)oG?# z;ARxAZYi)fDI2~Z@}L3_@Utv%U&1ZHrE>BKd?Dz-wc|3h%KM@q?GY9yiC+y}(=$A; GYyAsT_He8K literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_fixed_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_fixed_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d1429e52bc48284dc0372a5642ca7570d0de385 GIT binary patch literal 2644 zcmcImOK;Oa5cVTU-87-;gCY<TDF~rZ5kN>B5JKgBfdE2qh$2}V&o(u6)@Ii!wBo|! zM<5|iocK$=a^f#=VrE^ZPTEEkDQkIV*E>7@zL|a9t5(Yf7V+aFdr>ruU)0D-0W0hH zs%t2~05dT9X4^E4#|Btne=)%3)@QqIW4i!FY!|tS?E;iu8jYFXILc_4$-+aAN1Hq9 zxeVWMFTNZ39`$6!#L7Cps)B+WZ4->P1txm1lG;;WDPQy+u$VoRGL)@`oj9&5Sf9IY zQg+>b2!nv?71w<`U_sjR(~vXhO^ZKY@89aYQe3JI+how}vUg1EbnXh~g#y@(4j0?1 z6GmJp4`oPDJ5T&>NBJ?o5;1R!^*D|V0<?gwt6j-_;f7uGxXt2F?p)<5zf8MPO4MbM zf8g7O|DFT&G@~79BSs3cvQRjtZjZ!<zOR!(2gQDD!1`jeZLpz$8Y2%S)J2#92XzT% zp^SP4=AeSwfhwFpJqz<tLtTaiSVTPsOR$W(0w*!nE6K`enjR5Q$`xUtLO|(#hOb&i z5#x;bV1C27@ZJ7we!{$=AG@`?0GO@%MkwowWA;K(-<_+AFvd><0jrIaXQPl56c0Aq z<vlCchorz{PbH<Tcck}IC>{J=QtR>9&5Y?EG;?+640HF=;pm&=V~$T}DcFeWLrR$2 zE<b{hBtUIPn;;uGhfPVddYs83p-Rorxl7KgIWCO}Tt-KEw0Nk{Ork{T<j^lEIm4t_ zt=;(tl$3*6ur=tTp;mGMR5f&*1^mJUkb6l|(}%ZA@M4@TJjP`uc@L+XTFSv(n*eis z-1Olt5nNySE`J|!>G!#a)k+TS<q2rVhD{&rEP)*eKUSx65bF~lYUAkx({s|>WJ2&j zoy}pJG$%9r>BB2i-1ItC=W^gyCj>6F9@(2{MeEhPh?Q)s{ch#g^qOGtK(e6T54U|@ zk9j`|Sj_iVx!#1+&f%`B*LzYDgMOFGqu2czBC+Qm4_Wl@X8zCTNL`;m>hRJ3O;UMW z97!_m93?4FBG7+isK*Z(UOXnl(b26&RnkEz@jhk95((Pf<p~n=BxoO%3nVDHlJ+Y} zC#s~qK%OEoyuPG0IsoM?3aaSS*RdRX{LvPzMzMV}yR9@2+*X=Ay{%+Ae_N4sge2wH fEEsTo-O@J_?e#D~iE}%>e%+yCND=3XT`T+rnjn5c literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_lims_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_lims_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..474a6440bab51ae440381adc1f9f6715c8b6253c GIT binary patch literal 23103 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 OB1?Z+QUCsYss4X;0pV`| literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_warehouse_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_warehouse_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6797ffdfe84f91e69a75ab54c5a421759cfc494e GIT binary patch literal 10094 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 PhjA7i$svLXA}{?fFfU-_ literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/http_engine.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/http_engine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..322e45d8d6e85450a293643e12ff4f0ae68ba26f GIT binary patch literal 7753 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/rma_engine.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/rma_engine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cb2f4aaebb83fcb19fdf53463f12519de0058be GIT binary patch literal 4238 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 LJ@3pvSUC4DQhO0v literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/utilities.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc5c8ac5b91712beb8259156ce6bd0c97b9a9a45 GIT binary patch literal 3182 zcmcImPjBNy6!+MU<2uQ<T{yr2$*Kr#P}54l0j;(x*yYcGDi;<GA;_9|rdc=k*qxbl z8{#0L?tu$?<-(yWPJ97AjIW%y@BujSX56%Cno6wHj_jH7%zMxCd+*JA?{TBy8PM48 zKjCW4F#b{>vu45M6L`h9&=G^6*yth{&Dcz=u9etbJE?Rl$RHN6Ul?77REPs(l~jof zqf1uF3h`c`?h08WHByI}N7hM$+=E$-ps$VA{l7uB(P>#l?Q?b<@suT$$-;Y#1>H|E zp}g=ui$Yn>Lq$AmCQP2dD_rOZB4(rnTAjj4aL7}E|3rr2`Eza3Z2Nl857Q*UfuPwI z!4hx#N265Iy)SSqXv=Rmr&rjN1jTxgav#V?i61dF!AmJiYCk$Cg*K;~lO|;ZzL&|> z)Dtardi}4nKhK2uTAE*qTXM?Ff3sBjahhg3F%}ZowkOS-*%UaCsqihH@qDY)+Oo}Z zM@YVPa)ah3ZU4mo(cjqc+Y1nH6#j?79Wd%;_wUb79`wEul#3pIhRIGJKgVp``;_4@ zWdwiNqwHAp(u^_@LZ4>O#-g_$^?M?cw4LE_hzAsS;}|H&aJSEK#DcUB5|6P=`FNLx zR58uQAmiyF4P}6{Xm=!|IFb<+JK305;9%--!iLT;&AMK>;+g8=XwO`O2|?00g-i1` zT$A5S@KC#hKL*|_E(X?#k}T!Y-z=SX)5pS3z;KIXrM}ZlMk&K_0PrP15nDq#-qudJ z;LHmWE<Hp$a3p-?DJ*65n&}m(YM2p!G6DJ1sdD_S$t2lXdVgBeY3s^y757bkSFV?6 z7S0G;3n=N)2(D&{@fgP=xTFg_=f8rBqWAsR1-1teHRpnh-Wmi@bHGM%JO^U$DZc|G zfP4a1Zc`g}Q^lcDBXIeAb%49EP)z55-MV!i-nn@OcY6Luw|IUXZdzusnx#SxI2Az| zG0JtMhs(fO&Z-cHxJr|6!CMBdcTA*LUMq0@@Xr<Rxx1*fm}$yu*jC<rEp9cZ-<^l2 zcO$kWIO*IDvFZDZP_!uh#ym9Bwa1}a_@8QC0Tn;EP;(X3tX4vm6I4^_LuHPy;1%yd zCm}=RMuc*xV16;DwnVv2(1A&;94eaJ`qg}?>KeP#tp<TivLI-o!tO(TR5+9kB1XX( z*88I<CIMu@ixO&`p3rb4X&`Bm#aL3(suY!@5#?j9YCaC-o>4f%=a>&fVFBx$*C>aX z35EC{oXh$WmP_|RYlyGISE#Bm)zql4>Ad$5OaPBDbosr=m?Gv$;|vhKLR09^%-nc| zkRdH;=jaqc?WV9>x_WyGrJxh*%CFmqp{|IspdY8<P;_hXk(_@37BkEWmr$BP#vd2X zC<D)+T%Cg}1-H!Z+6;Q2<gkG#fnSyu`d-w5cpqM&D`Dg!$Mj4OakU=mBo7lssZ6NN z_C8E<OT()JJS#WO04{*5<ds8oVC42oG<9+_cTSb*PzTOZA5eK=io)SgZ&BW=7PWbs z*$gLC8>ZVRZ5x#K;j8e=!kytM+>)P?1)K2((5Z6$0*nn%>ZV?AnVpV03_SJ1R$Ak4 z0BP4bjMyRmpj4d#sr6R|5*0MG18Zw*ooHEe|JCZ$4&y#dQZkC^BPhHLaSuAzeA9C8 LyBlu9t9agj^n3eE literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py new file mode 100644 index 0000000000..6db0e473d3 --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py @@ -0,0 +1,71 @@ +from typing import Optional, TypeVar, Iterable + +import numpy as np +import pandas as pd + + +# TODO: This should be a generic over the type of the values, but there is not +# good support currently for numpy and pandas type annotations +# we should investigate numpy and pandas typing support and migrate +# https://github.com/numpy/numpy-stubs +# https://github.com/pandas-dev/pandas/blob/master/pandas/_typing.py +ArrayLike = TypeVar("ArrayLike", list, np.ndarray, pd.Series, tuple) + + +class EcephysProjectApi: + def get_sessions( + self, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ): + raise NotImplementedError() + + def get_session_data(self, session_id: int) -> Iterable: + raise NotImplementedError() + + def get_isi_experiments(self, *args, **kwargs): + raise NotImplementedError() + + def get_units( + self, + unit_ids: Optional[ArrayLike] = None, + channel_ids: Optional[ArrayLike] = None, + probe_ids: Optional[ArrayLike] = None, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ): + raise NotImplementedError() + + def get_channels( + self, + channel_ids: Optional[ArrayLike] = None, + probe_ids: Optional[ArrayLike] = None, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ): + raise NotImplementedError() + + def get_probes( + self, + probe_ids: Optional[ArrayLike] = None, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ): + raise NotImplementedError() + + def get_probe_lfp_data(self, probe_id: int) -> Iterable: + raise NotImplementedError() + + def get_natural_movie_template(self, number) -> Iterable: + raise NotImplementedError() + + def get_natural_scene_template(self, number) -> Iterable: + raise NotImplementedError() + + def get_unit_analysis_metrics( + self, + unit_ids: Optional[ArrayLike] = None, + ecephys_session_ids: Optional[ArrayLike] = None, + session_types: Optional[ArrayLike] = None + ) -> pd.DataFrame: + raise NotImplementedError() \ No newline at end of file diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py new file mode 100644 index 0000000000..9e7431c995 --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py @@ -0,0 +1,38 @@ +from allensdk.brain_observatory.ecephys.ecephys_project_api import EcephysProjectApi + + +class MissingDataError(ValueError): + pass + + +class EcephysProjectFixedApi(EcephysProjectApi): + + def get_session_data(self, session_id, *args, **kwargs): + raise MissingDataError(f"data for session {session_id} not found!") + + def get_probe_lfp_data(self, probe_id, *args, **kwargs): + raise MissingDataError(f"lfp data for probe {probe_id} not found!") + + def get_sessions(self, *args, **kwargs): + raise MissingDataError(f"Data not found!") + + def get_targeted_regions(self, *args, **kwargs): + raise MissingDataError(f"Data not found!") + + def get_isi_experiments(self, *args, **kwargs): + raise MissingDataError(f"Data not found!") + + def get_units(self, *args, **kwargs): + raise MissingDataError(f"Data not found!") + + def get_channels(self, *args, **kwargs): + raise MissingDataError(f"Data not found!") + + def get_probes(self, *args, **kwargs): + raise MissingDataError(f"Data not found!") + + def get_natural_movie_template(self, number, *args, **kwargs): + raise MissingDataError(f"natural movie template not found for movie {number}") + + def get_natural_scene_template(self, number, *args, **kwargs): + raise MissingDataError(f"natural scene template not found for scene {number}") diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py new file mode 100644 index 0000000000..6eb6a854cf --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py @@ -0,0 +1,629 @@ +from typing import Optional, Iterable, NamedTuple + +import pandas as pd + +from .ecephys_project_api import EcephysProjectApi, ArrayLike +from .http_engine import HttpEngine, AsyncHttpEngine +from .utilities import postgres_macros, build_and_execute + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.core.authentication import credential_injector, DbCredentials +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP + + +class EcephysProjectLimsApi(EcephysProjectApi): + + STIMULUS_TEMPLATE_NAMESPACE = "brain_observatory_1.1" + + def __init__(self, postgres_engine, app_engine): + """ Downloads extracellular ephys data from the Allen Institute's + internal Laboratory Information Management System (LIMS). If you are + on our network you can use this class to get bleeding-edge data into + an EcephysProjectCache. If not, it won't work at all + + Parameters + ---------- + postgres_engine : + used for making queries against the LIMS postgres database. Must + implement: + select : takes a postgres query as a string. Returns a pandas + dataframe of results + select_one : takes a postgres query as a string. If there is + exactly one record in the response, returns that record as + a dict. Otherwise returns an empty dict. + app_engine : + used for making queries agains the lims web application. Must + implement: + stream : takes a url as a string. Returns an iterable yielding + the response body as bytes. + + Notes + ----- + You almost certainly want to construct this class by calling + EcephysProjectLimsApi.default() rather than this constructor directly. + + """ + + + self.postgres_engine = postgres_engine + self.app_engine = app_engine + + def get_session_data(self, session_id: int) -> Iterable[bytes]: + """ Download an NWB file containing detailed data for an ecephys + session. + + Parameters + ---------- + session_id : + Download an NWB file for this session + + Returns + ------- + An iterable yielding an NWB file as bytes. + + """ + + nwb_response = build_and_execute( + """ + select wkf.id, wkf.filename, wkf.storage_directory, wkf.attachable_id from well_known_files wkf + join ecephys_analysis_runs ear on ( + ear.id = wkf.attachable_id + and wkf.attachable_type = 'EcephysAnalysisRun' + ) + join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id + where ear.current + and wkft.name = 'EcephysNwb' + and ear.ecephys_session_id = {{session_id}} + """, + engine=self.postgres_engine.select, + session_id=session_id, + ) + + if nwb_response.shape[0] != 1: + raise ValueError( + f"expected exactly 1 current NWB file for session {session_id}, " + f"found {nwb_response.shape[0]}: {pd.DataFrame(nwb_response)}" + ) + + nwb_id = nwb_response.loc[0, "id"] + return self.app_engine.stream( + f"well_known_files/download/{nwb_id}?wkf_id={nwb_id}" + ) + + def get_probe_lfp_data(self, probe_id: int) -> Iterable[bytes]: + """ Download an NWB file containing detailed data for the local field + potential recorded from an ecephys probe. + + Parameters + ---------- + probe_id : + Download an NWB file for this probe's LFP + + Returns + ------- + An iterable yielding an NWB file as bytes. + + """ + + nwb_response = build_and_execute( + """ + select wkf.id from well_known_files wkf + join ecephys_analysis_run_probes earp on ( + earp.id = wkf.attachable_id + and wkf.attachable_type = 'EcephysAnalysisRunProbe' + ) + join ecephys_analysis_runs ear on ear.id = earp.ecephys_analysis_run_id + join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id + where wkft.name ~ 'EcephysLfpNwb' + and ear.current + and earp.ecephys_probe_id = {{probe_id}} + """, + engine=self.postgres_engine.select, + probe_id=probe_id + ) + + if nwb_response.shape[0] != 1: + raise ValueError( + f"expected exactly 1 current LFP NWB file for probe {probe_id}, " + f"found {nwb_response.shape[0]}: {pd.DataFrame(nwb_response)}" + ) + + nwb_id = nwb_response.loc[0, "id"] + return self.app_engine.stream( + f"well_known_files/download/{nwb_id}?wkf_id={nwb_id}" + ) + + def get_units( + self, + unit_ids: Optional[ArrayLike] = None, + channel_ids: Optional[ArrayLike] = None, + probe_ids: Optional[ArrayLike] = None, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ) -> pd.DataFrame: + """ Download a table of records describing sorted ecephys units. + + Parameters + ---------- + unit_ids : + A collection of integer identifiers for sorted ecephys units. If + provided, only return records describing these units. + channel_ids : + A collection of integer identifiers for ecephys channels. If + provided, results will be filtered to units recorded from these + channels. + probe_ids : + A collection of integer identifiers for ecephys probes. If + provided, results will be filtered to units recorded from these + probes. + session_ids : + A collection of integer identifiers for ecephys sessions. If + provided, results will be filtered to units recorded during + these sessions. + published_at : + A date (rendered as "YYYY-MM-DD"). If provided, only units + recorded during sessions published before this date will be + returned. + + Returns + ------- + a pd.DataFrame whose rows are ecephys channels. + + """ + + response = build_and_execute( + """ + {%- import 'postgres_macros' as pm -%} + {%- import 'macros' as m -%} + select + eu.id, + eu.ecephys_channel_id, + eu.quality, + eu.snr, + eu.firing_rate, + eu.isi_violations, + eu.presence_ratio, + eu.amplitude_cutoff, + eu.isolation_distance, + eu.l_ratio, + eu.d_prime, + eu.nn_hit_rate, + eu.nn_miss_rate, + eu.silhouette_score, + eu.max_drift, + eu.cumulative_drift, + eu.epoch_name_quality_metrics, + eu.epoch_name_waveform_metrics, + eu.duration, + eu.halfwidth, + eu.\"PT_ratio\", + eu.repolarization_slope, + eu.recovery_slope, + eu.amplitude, + eu.spread, + eu.velocity_above, + eu.velocity_below + from ecephys_units eu + join ecephys_channels ec on ec.id = eu.ecephys_channel_id + join ecephys_probes ep on ep.id = ec.ecephys_probe_id + join ecephys_sessions es on es.id = ep.ecephys_session_id + where + not es.habituation + and ec.valid_data + and ep.workflow_state != 'failed' + and es.workflow_state != 'failed' + {{pm.optional_not_null('es.published_at', published_at_not_null)}} + {{pm.optional_le('es.published_at', published_at)}} + {{pm.optional_contains('eu.id', unit_ids) -}} + {{pm.optional_contains('ec.id', channel_ids) -}} + {{pm.optional_contains('ep.id', probe_ids) -}} + {{pm.optional_contains('es.id', session_ids) -}} + """, + base=postgres_macros(), + engine=self.postgres_engine.select, + unit_ids=unit_ids, + channel_ids=channel_ids, + probe_ids=probe_ids, + session_ids=session_ids, + **_split_published_at(published_at)._asdict() + ) + return response.set_index("id", inplace=False) + + def get_channels( + self, + channel_ids: Optional[ArrayLike] = None, + probe_ids: Optional[ArrayLike] = None, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ) -> pd.DataFrame: + """ Download a table of ecephys channel records. + + Parameters + ---------- + channel_ids : + A collection of integer identifiers for ecephys channels. If + provided, results will be filtered to these channels. + probe_ids : + A collection of integer identifiers for ecephys probes. If + provided, results will be filtered to channels on these probes. + session_ids : + A collection of integer identifiers for ecephys sessions. If + provided, results will be filtered to channels recorded from during + these sessions. + published_at : + A date (rendered as "YYYY-MM-DD"). If provided, only channels + recorded from during sessions published before this date will be + returned. + + Returns + ------- + a pd.DataFrame whose rows are ecephys channels. + + """ + + response = build_and_execute( + """ + {%- import 'postgres_macros' as pm -%} + select + ec.id, + ec.ecephys_probe_id, + ec.local_index, + ec.probe_vertical_position, + ec.probe_horizontal_position, + ec.manual_structure_id as ecephys_structure_id, + st.acronym as ecephys_structure_acronym, + ec.anterior_posterior_ccf_coordinate, + ec.dorsal_ventral_ccf_coordinate, + ec.left_right_ccf_coordinate + from ecephys_channels ec + join ecephys_probes ep on ep.id = ec.ecephys_probe_id + join ecephys_sessions es on es.id = ep.ecephys_session_id + left join structures st on ec.manual_structure_id = st.id + where + not es.habituation + and valid_data + and ep.workflow_state != 'failed' + and es.workflow_state != 'failed' + {{pm.optional_not_null('es.published_at', published_at_not_null)}} + {{pm.optional_le('es.published_at', published_at)}} + {{pm.optional_contains('ec.id', channel_ids) -}} + {{pm.optional_contains('ep.id', probe_ids) -}} + {{pm.optional_contains('es.id', session_ids) -}} + """, + base=postgres_macros(), + engine=self.postgres_engine.select, + channel_ids=channel_ids, + probe_ids=probe_ids, + session_ids=session_ids, + **_split_published_at(published_at)._asdict() + ) + return response.set_index("id") + + def get_probes( + self, + probe_ids: Optional[ArrayLike] = None, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ) -> pd.DataFrame: + """ Download a table of ecephys probe records. + + Parameters + ---------- + probe_ids : + A collection of integer identifiers for ecephys probes. If + provided, results will be filtered to these probes. + session_ids : + A collection of integer identifiers for ecephys sessions. If + provided, results will be filtered to probes recorded from during + these sessions. + published_at : + A date (rendered as "YYYY-MM-DD"). If provided, only probes + recorded from during sessions published before this date will be + returned. + + Returns + ------- + a pd.DataFrame whose rows are ecephys probes. + + """ + + response = build_and_execute( + """ + {%- import 'postgres_macros' as pm -%} + select + ep.id, + ep.ecephys_session_id, + ep.name, + ep.global_probe_sampling_rate as sampling_rate, + ep.global_probe_lfp_sampling_rate as lfp_sampling_rate, + ep.phase, + ep.air_channel_index, + ep.surface_channel_index, + ep.use_lfp_data as has_lfp_data, + ep.temporal_subsampling_factor as lfp_temporal_subsampling_factor + from ecephys_probes ep + join ecephys_sessions es on es.id = ep.ecephys_session_id + where + not es.habituation + and ep.workflow_state != 'failed' + and es.workflow_state != 'failed' + {{pm.optional_not_null('es.published_at', published_at_not_null)}} + {{pm.optional_le('es.published_at', published_at)}} + {{pm.optional_contains('ep.id', probe_ids) -}} + {{pm.optional_contains('es.id', session_ids) -}} + """, + base=postgres_macros(), + engine=self.postgres_engine.select, + probe_ids=probe_ids, + session_ids=session_ids, + **_split_published_at(published_at)._asdict() + ) + return response.set_index("id") + + + def get_sessions( + self, + session_ids: Optional[ArrayLike] = None, + published_at: Optional[str] = None + ) -> pd.DataFrame: + """ Download a table of ecephys session records. + + Parameters + ---------- + session_ids : + A collection of integer identifiers for ecephys sessions. If + provided, results will be filtered to these sessions. + published_at : + A date (rendered as "YYYY-MM-DD"). If provided, only sessions + published before this date will be returned. + + Returns + ------- + a pd.DataFrame whose rows are ecephys sessions. + + """ + + response = build_and_execute( + """ + {%- import 'postgres_macros' as pm -%} + {%- import 'macros' as m -%} + select + es.id, + es.specimen_id, + es.stimulus_name as session_type, + es.isi_experiment_id, + es.date_of_acquisition, + es.published_at, + dn.full_genotype as genotype, + gd.name as sex, + ages.days as age_in_days, + case + when nwb_id is not null then true + else false + end as has_nwb + from ecephys_sessions es + join specimens sp on sp.id = es.specimen_id + join donors dn on dn.id = sp.donor_id + join genders gd on gd.id = dn.gender_id + join ages on ages.id = dn.age_id + left join ( + select ecephys_sessions.id as ecephys_session_id, + wkf.id as nwb_id + from ecephys_sessions + join ecephys_analysis_runs ear on ( + ear.ecephys_session_id = ecephys_sessions.id + and ear.current + ) + join well_known_files wkf on ( + wkf.attachable_id = ear.id + and wkf.attachable_type = 'EcephysAnalysisRun' + ) + join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id + where wkft.name = 'EcephysNwb' + ) nwb on es.id = nwb.ecephys_session_id + where + not es.habituation + and es.workflow_state != 'failed' + {{pm.optional_contains('es.id', session_ids) -}} + {{pm.optional_not_null('es.published_at', published_at_not_null)}} + {{pm.optional_le('es.published_at', published_at)}} + """, + base=postgres_macros(), + engine=self.postgres_engine.select, + session_ids=session_ids, + **_split_published_at(published_at)._asdict() + ) + + response.set_index("id", inplace=True) + response["genotype"].fillna("wt", inplace=True) + return response + + + def get_unit_analysis_metrics( + self, + unit_ids: Optional[ArrayLike] = None, + ecephys_session_ids: Optional[ArrayLike] = None, + session_types: Optional[ArrayLike] = None + ) -> pd.DataFrame: + """ Fetch analysis metrics (stimulus set-specific characterizations of + unit response patterns) for ecephys units. Note that the metrics + returned depend on the stimuli that were presented during recording ( + and thus on the session_type) + + Parameters + --------- + unit_ids : + integer identifiers for a set of ecephys units. If provided, the + response will only include metrics calculated for these units + ecephys_session_ids : + integer identifiers for a set of ecephys sessions. If provided, the + response will only include metrics calculated for units identified + during these sessions + session_types : + string names identifying ecephys session types (e.g. + "brain_observatory_1.1" or "functional_connectivity") + + Returns + ------- + a pandas dataframe indexed by ecephys unit id whose columns are + metrics. + + """ + + response = build_and_execute( + """ + {%- import 'postgres_macros' as pm -%} + {%- import 'macros' as m -%} + select eumb.data, eumb.ecephys_unit_id from ecephys_unit_metric_bundles eumb + join ecephys_analysis_runs ear on eumb.ecephys_analysis_run_id = ear.id + join ecephys_units eu on eumb.ecephys_unit_id = eu.id + join ecephys_channels ec on eu.ecephys_channel_id = ec.id + join ecephys_probes ep on ec.ecephys_probe_id = ep.id + join ecephys_sessions es on es.id = ep.ecephys_session_id + where ear.current + {{pm.optional_contains('eumb.id', unit_ids) -}} + {{pm.optional_contains('es.id', ecephys_session_ids) -}} + {{pm.optional_contains('es.stimulus_name', session_types, True) -}} + """, + base=postgres_macros(), + engine=self.postgres_engine.select, + unit_ids=unit_ids, + ecephys_session_ids=ecephys_session_ids, + session_types=session_types + ) + + data = pd.DataFrame(response.pop("data").values.tolist(), index=response.index) + response = pd.merge(response, data, left_index=True, right_index=True) + response.set_index("ecephys_unit_id", inplace=True) + + return response + + + def _get_template(self, name, namespace): + """ Identify the WellKnownFile record associated with a stimulus + template and stream its data if present. + """ + + try: + well_known_file = build_and_execute( + f""" + select + st.well_known_file_id + from stimuli st + join stimulus_namespaces sn on sn.id = st.stimulus_namespace_id + where + st.name = '{name}' + and sn.name = '{namespace}' + """, + base=postgres_macros(), + engine=self.postgres_engine.select_one + ) + wkf_id = well_known_file["well_known_file_id"] + except (KeyError, IndexError): + raise ValueError(f"expected exactly 1 template for {name}") + + download_link = f"well_known_files/download/{wkf_id}?wkf_id={wkf_id}" + return self.app_engine.stream(download_link) + + + def get_natural_movie_template(self, number: int) -> Iterable[bytes]: + """ Download a template for the natural movie stimulus. This is the + actual movie that was shown during the recording session. + + Parameters + ---------- + number : + idenfifier for this movie (note that this is an integer, so to get + the template for natural_movie_three you should pass in 3) + + Returns + ------- + An iterable yielding an npy file as bytes + + """ + + return self._get_template( + f"natural_movie_{number}", self.STIMULUS_TEMPLATE_NAMESPACE + ) + + + def get_natural_scene_template(self, number: int) -> Iterable[bytes]: + """ Download a template for the natural scene stimulus. This is the + actual image that was shown during the recording session. + + Parameters + ---------- + number : + idenfifier for this scene + + Returns + ------- + An iterable yielding a tiff file as bytes. + + """ + return self._get_template( + f"natural_scene_{int(number)}", self.STIMULUS_TEMPLATE_NAMESPACE + ) + + + @classmethod + def default(cls, lims_credentials: Optional[DbCredentials] = None, + app_kwargs=None, asynchronous=False): + """ Construct a "straightforward" lims api that can fetch data from + lims2. + + Parameters + ---------- + lims_credentials : DbCredentials + Credentials and configuration for postgres queries against + the LIMS database. If left unspecified will attempt to provide + credentials from environment variables. + app_kwargs : dict + High-level configuration for http requests. See + allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine.HttpEngine + and AsyncHttpEngine for details. + asynchronous : bool + If true, (http) queries will be made asynchronously. + + Returns + ------- + EcephysProjectLimsApi + + """ + + _app_kwargs = {"scheme": "http", "host": "lims2", "asynchronous": asynchronous} + if app_kwargs is not None: + if "asynchronous" in app_kwargs: + raise TypeError("please specify asynchronicity option at the api level rather than for the http engine") + _app_kwargs.update(app_kwargs) + + app_engine_cls = AsyncHttpEngine if _app_kwargs["asynchronous"] else HttpEngine + app_engine = app_engine_cls(**_app_kwargs) + + if lims_credentials is not None: + pg_engine = PostgresQueryMixin( + dbname=lims_credentials.dbname, user=lims_credentials.user, + host=lims_credentials.host, password=lims_credentials.password, + port=lims_credentials.port) + else: + # Currying is equivalent to decorator syntactic sugar + pg_engine = (credential_injector(LIMS_DB_CREDENTIAL_MAP) + (PostgresQueryMixin)()) + + return cls(pg_engine, app_engine) + + +class SplitPublishedAt(NamedTuple): + published_at: Optional[str] + published_at_not_null: Optional[bool] + + +def _split_published_at(published_at: Optional[str]) -> SplitPublishedAt: + """ LIMS queries that filter on published_at need a couple of + reformattings of the argued date string. + """ + + return SplitPublishedAt( + published_at=f"'{published_at}'" if published_at is not None else None, + published_at_not_null=None if published_at is None else True + ) diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py new file mode 100644 index 0000000000..bad7c764ce --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py @@ -0,0 +1,310 @@ +import re +import json +import ast + +import pandas as pd +import numpy as np + +from .rma_engine import RmaEngine, AsyncRmaEngine +from .ecephys_project_api import EcephysProjectApi +from .utilities import rma_macros, build_and_execute + + +class EcephysProjectWarehouseApi(EcephysProjectApi): + + movie_re = re.compile(r".*natural_movie_(?P<num>\d+).npy") + scene_re = re.compile(r".*/(?P<num>\d+).tiff") + + def __init__(self, rma_engine=None): + if rma_engine is None: + rma_engine = RmaEngine(scheme="http", host="api.brain-map.org") + self.rma_engine = rma_engine + + def get_session_data(self, session_id, **kwargs): + well_known_files = build_and_execute( + ( + "criteria=model::WellKnownFile" + ",rma::criteria,well_known_file_type[name$eq'EcephysNwb']" + "[attachable_type$eq'EcephysSession']" + r"[attachable_id$eq{{session_id}}]" + ), + engine=self.rma_engine.get_rma_tabular, session_id=session_id + ) + + if well_known_files.shape[0] != 1: + raise ValueError(f"expected exactly 1 nwb file for session {session_id}, found: {well_known_files}") + + download_link = well_known_files.iloc[0]["download_link"] + return self.rma_engine.stream(download_link) + + def get_natural_movie_template(self, number): + well_known_files = self.stimulus_templates[self.stimulus_templates["movie_number"] == number] + if well_known_files.shape[0] != 1: + raise ValueError(f"expected exactly one natural movie template with number {number}, found {well_known_files}") + + download_link = well_known_files.iloc[0]["download_link"] + return self.rma_engine.stream(download_link) + + def get_natural_scene_template(self, number): + well_known_files = self.stimulus_templates[self.stimulus_templates["scene_number"] == number] + if well_known_files.shape[0] != 1: + raise ValueError(f"expected exactly one natural scene template with number {number}, found {well_known_files}") + + download_link = well_known_files.iloc[0]["download_link"] + return self.rma_engine.stream(download_link) + + @property + def stimulus_templates(self): + if not hasattr(self, "_stimulus_templates_list"): + self._stimulus_templates_list = self._list_stimulus_templates() + return self._stimulus_templates_list + + def _list_stimulus_templates(self, ecephys_product_id=714914585): + well_known_files = build_and_execute( + ( + "criteria=model::WellKnownFile" + ",rma::criteria,well_known_file_type[name$eq'Stimulus']" + "[attachable_type$eq'Product']" + r"[attachable_id$eq{{ecephys_product_id}}]" + ), + engine=self.rma_engine.get_rma_tabular, + ecephys_product_id=ecephys_product_id + ) + + scene_number = [] + movie_number = [] + for _, row in well_known_files.iterrows(): + scene_match = self.scene_re.match(row["path"]) + movie_match = self.movie_re.match(row["path"]) + + if scene_match is not None: + scene_number.append(int(scene_match["num"])) + movie_number.append(None) + + elif movie_match is not None: + movie_number.append(int(movie_match["num"])) + scene_number.append(None) + + well_known_files["scene_number"] = scene_number + well_known_files["movie_number"] = movie_number + return well_known_files + + def get_probe_lfp_data(self, probe_id): + well_known_files = build_and_execute( + ( + "criteria=model::WellKnownFile" + ",rma::criteria,well_known_file_type[name$eq'EcephysLfpNwb']" + "[attachable_type$eq'EcephysProbe']" + r"[attachable_id$eq{{probe_id}}]" + ), + engine=self.rma_engine.get_rma_tabular, probe_id=probe_id + ) + + if well_known_files.shape[0] != 1: + raise ValueError(f"expected exactly 1 LFP NWB file for probe {probe_id}, found: {well_known_files}") + + download_link = well_known_files.loc[0, "download_link"] + return self.rma_engine.stream(download_link) + + def get_sessions(self, session_ids=None, has_eye_tracking=None, stimulus_names=None): + response = build_and_execute( + ( + "{% import 'rma_macros' as rm %}" + "{% import 'macros' as m %}" + "criteria=model::EcephysSession" + r"{{rm.optional_contains('id',session_ids)}}" + r"{%if has_eye_tracking is not none%}[fail_eye_tracking$eq{{m.str(not has_eye_tracking).lower()}}]{%endif%}" + r"{{rm.optional_contains('stimulus_name',stimulus_names,True)}}" + ",rma::include,specimen(donor(age))" + ",well_known_files(well_known_file_type)" + ), + base=rma_macros(), + engine=self.rma_engine.get_rma_tabular, + session_ids=session_ids, + has_eye_tracking=has_eye_tracking, + stimulus_names=stimulus_names + ) + + response.set_index("id", inplace=True) + + age_in_days = [] + sex = [] + genotype = [] + has_nwb = [] + + for idx, row in response.iterrows(): + age_in_days.append(row["specimen"]["donor"]["age"]["days"]) + sex.append(row["specimen"]["donor"]["sex"]) + + gt = row["specimen"]["donor"]["full_genotype"] + if gt is None: + gt = "wt" + genotype.append(gt) + + current_has_nwb = False + for wkf in row["well_known_files"]: + if wkf["well_known_file_type"]["name"] == "EcephysNwb": + current_has_nwb = True + has_nwb.append(current_has_nwb) + + response["age_in_days"] = age_in_days + response["sex"] = sex + response["genotype"] = genotype + response["has_nwb"] = has_nwb + + response.drop(columns=["specimen", "fail_eye_tracking", "well_known_files"], inplace=True) + response.rename(columns={"stimulus_name": "session_type"}, inplace=True) + + return response + + def get_probes(self, probe_ids=None, session_ids=None): + response = build_and_execute( + ( + "{% import 'rma_macros' as rm %}" + "{% import 'macros' as m %}" + "criteria=model::EcephysProbe" + r"{{rm.optional_contains('id',probe_ids)}}" + r"{{rm.optional_contains('ecephys_session_id',session_ids)}}" + ), + base=rma_macros(), + engine=self.rma_engine.get_rma_tabular, + session_ids=session_ids, + probe_ids=probe_ids + ) + response.set_index("id", inplace=True) + # Clarify name for external users + response.rename(columns={"use_lfp_data": "has_lfp_data"}, inplace=True) + return response + + def get_channels(self, channel_ids=None, probe_ids=None): + response = build_and_execute( + ( + "{% import 'rma_macros' as rm %}" + "{% import 'macros' as m %}" + "criteria=model::EcephysChannel" + r"{{rm.optional_contains('id',channel_ids)}}" + r"{{rm.optional_contains('ecephys_probe_id',probe_ids)}}" + ",rma::include,structure" + ",rma::options[tabular$eq'" + "ecephys_channels.id" + ",ecephys_probe_id" + ",local_index" + ",probe_horizontal_position" + ",probe_vertical_position" + ",anterior_posterior_ccf_coordinate" + ",dorsal_ventral_ccf_coordinate" + ",left_right_ccf_coordinate" + ",structures.id as ecephys_structure_id" + ",structures.acronym as ecephys_structure_acronym" + "']" + ), + base=rma_macros(), + engine=self.rma_engine.get_rma_tabular, + probe_ids=probe_ids, + channel_ids=channel_ids + ) + + response.set_index("id", inplace=True) + return response + + def get_units(self, unit_ids=None, channel_ids=None, probe_ids=None, session_ids=None, *a, **k): + response = build_and_execute( + ( + "{% import 'macros' as m %}" + "criteria=model::EcephysUnit" + r"{% if unit_ids is not none %},rma::criteria[id$in{{m.comma_sep(unit_ids)}}]{% endif %}" + r"{% if channel_ids is not none %},rma::criteria[ecephys_channel_id$in{{m.comma_sep(channel_ids)}}]{% endif %}" + r"{% if probe_ids is not none %},rma::criteria,ecephys_channel(ecephys_probe[id$in{{m.comma_sep(probe_ids)}}]){% endif %}" + r"{% if session_ids is not none %},rma::criteria,ecephys_channel(ecephys_probe(ecephys_session[id$in{{m.comma_sep(session_ids)}}])){% endif %}" + ), + base=rma_macros(), engine=self.rma_engine.get_rma_tabular, + session_ids=session_ids, + probe_ids=probe_ids, + channel_ids=channel_ids, + unit_ids=unit_ids + ) + + response.set_index("id", inplace=True) + + return response + + def get_unit_analysis_metrics(self, unit_ids=None, ecephys_session_ids=None, session_types=None): + """ Download analysis metrics - precalculated descriptions of unitwise responses to visual stimulation. + + Parameters + ---------- + unit_ids : array-like of int, optional + Unique identifiers for ecephys units. If supplied, only download + metrics for these units. + ecephys_session_ids : array-like of int, optional + Unique identifiers for ecephys sessions. If supplied, only download + metrics for units collected during these sessions. + session_types : array-like of str, optional + Names of session types. e.g. "brain_observatory_1.1" or + "functional_connectivity". If supplied, only download + metrics for units collected during sessions of these types + + Returns + ------- + pd.DataFrame : + A table of analysis metrics, indexed by unit_id. + + """ + + response = build_and_execute( + ( + "{% import 'macros' as m %}" + "criteria=model::EcephysUnitMetricBundle" + r"{% if unit_ids is not none %},rma::criteria[ecephys_unit_id$in{{m.comma_sep(unit_ids)}}]{% endif %}" + r"{% if session_ids is not none %},rma::criteria,ecephys_unit(ecephys_channel(ecephys_probe(ecephys_session[id$in{{m.comma_sep(session_ids)}}]))){% endif %}" + r"{% if session_types is not none %},rma::criteria,ecephys_unit(ecephys_channel(ecephys_probe(ecephys_session[stimulus_name$in{{m.comma_sep(session_types, True)}}]))){% endif %}" + ), + base=rma_macros(), + engine=self.rma_engine.get_rma_list, + session_ids=ecephys_session_ids, + unit_ids=unit_ids, + session_types=session_types + ) + + output = [] + for item in response: + data = json.loads(item.pop("data")) + item.update(data) + output.append(item) + + output = pd.DataFrame(output) + output.set_index("ecephys_unit_id", inplace=True) + output.drop(columns="id", inplace=True) + + for colname in output.columns: + try: + output[colname] = output.apply(lambda row: ast.literal_eval(str(row[colname])), axis=1) + except ValueError: + pass + + # TODO: remove this + # on_screen_rf and p_value_rf were correctly calculated, + # but switched with one another. This snippet unswitches them. + columns = set(output.columns.values.tolist()) + if "p_value_rf" in columns and "on_screen_rf" in columns: + + pv_is_bool = np.issubdtype(output["p_value_rf"].values[0], np.bool) + on_screen_is_float = np.issubdtype(output["on_screen_rf"].values[0].dtype, np.floating) + + # this is not a good test, but it avoids the case where we fix + # these in the data for a future release, but + # reintroduce the bug by forgetting to update the code. + if pv_is_bool and on_screen_is_float: + p_value_rf = output["p_value_rf"].copy() + output["p_value_rf"] = output["on_screen_rf"].copy() + output["on_screen_rf"] = p_value_rf + + return output + + @classmethod + def default(cls, asynchronous=False, **rma_kwargs): + _rma_kwargs = {"scheme": "http", "host": "api.brain-map.org"} + _rma_kwargs.update(rma_kwargs) + + engine_cls = AsyncRmaEngine if asynchronous else RmaEngine + return cls(engine_cls(**_rma_kwargs)) diff --git a/brain_observatory/ecephys/ecephys_project_api/http_engine.py b/brain_observatory/ecephys/ecephys_project_api/http_engine.py new file mode 100644 index 0000000000..d2fe54d6a7 --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/http_engine.py @@ -0,0 +1,235 @@ +import functools +import os +import asyncio +import time +import warnings +import logging +from typing import Optional, Iterable, Callable, AsyncIterator, Awaitable + +import requests +import aiohttp +import nest_asyncio +from tqdm.auto import tqdm + +DEFAULT_TIMEOUT = 20 * 60 # seconds +DEFAULT_CHUNKSIZE = 1024 * 10 # bytes + + +class HttpEngine: + def __init__( + self, + scheme: str, + host: str, + timeout: float = DEFAULT_TIMEOUT, + chunksize: int = DEFAULT_CHUNKSIZE, + **kwargs + ): + """ Simple tool for making streaming http requests. + + Parameters + ---------- + scheme : + e.g "http" or "https" + host : + will be used as the base for request urls + timeout : + requests taking longer than this (in seconds) will raise a + `requests.Timeout` error. The clock on this timeout starts running + when the initial request is made. + chunksize : + When streaming data, how many bytes ought to be requested at once. + **kwargs : + unused. Defined here so that parameters can fall through from + subclasses + """ + + self.scheme = scheme + self.host = host + self.timeout = timeout + self.chunksize = chunksize + + def _build_url(self, route): + return f"{self.scheme}://{self.host}/{route}" + + def stream(self, route): + """ Makes an http request and returns an iterator over the response. + + Parameters + ---------- + route : + the http route (under this object's host) to request against. + + """ + + url = self._build_url(route) + + start_time = time.perf_counter() + response = requests.get(url, stream=True) + response_b = None + if "Content-length" in response.headers: + response_b = float(response.headers["Content-length"]) + + size_message = f"{response_b / 1024 ** 2:3.3f}MiB" if response_b is not None else "potentially large" + logging.warning(f"downloading a {size_message} file from {url}") + progress = tqdm( unit="B", total=response_b, unit_scale=True, desc="Downloading") + + for chunk in response.iter_content(self.chunksize): + if chunk: # filter out keep-alive new chunks + progress.update(len(chunk)) + yield chunk + + elapsed = time.perf_counter() - start_time + if elapsed > self.timeout: + raise requests.Timeout(f"Download took {elapsed} seconds, but timeout was set to {self.timeout}") + + @staticmethod + def write_bytes(path: str, stream: Iterable[bytes]): + write_from_stream(path, stream) + + +AsyncStreamCallbackType = Callable[[AsyncIterator[bytes]], Awaitable[None]] + + +class AsyncHttpEngine(HttpEngine): + + def __init__( + self, + scheme: str, + host: str, + session: Optional[aiohttp.ClientSession] = None, + **kwargs + ): + """ Simple tool for making asynchronous streaming http requests. + + Parameters + ---------- + scheme : + e.g "http" or "https" + host : + will be used as the base for request urls + session : + If provided, this preconstructed session will be used rather than + a new one. Keep in mind that AsyncHttpEngine closes its session + when it is garbage collected! + **kwargs : + Will be passed to parent. + + """ + + super(AsyncHttpEngine, self).__init__(scheme, host, **kwargs) + + if session: + self.session = session + warnings.warn( + "Recieved preconstructed session, ignoring timeout parameter." + ) + else: + self.session = aiohttp.ClientSession( + timeout=aiohttp.client.ClientTimeout(self.timeout) + ) + + async def _stream_coroutine( + self, + route: str, + callback: AsyncStreamCallbackType + ): + url = self._build_url(route) + + async with self.session.get(url) as response: + await callback(response.content.iter_chunked(self.chunksize)) + + def stream( + self, + route: str + ) -> Callable[[AsyncStreamCallbackType], Awaitable[None]]: + """ Returns a coroutine which + - makes an http request + - exposes internally an asynchronous iterator over the response + - takes a callback parameter, which should consume the iterator. + + Parameters + ---------- + route : + the http route (under this object's host) to request against. + + Notes + ----- + To use this method, you will need an appropriate consumer. For + instance, If you want to write the streamed data to a local file, you + can use write_bytes_from_coroutine. + + Examples + -------- + >>> engine = AsyncHttpEngine("http", "examplehost") + >>> stream_coro = engine.stream("example/route") + >>> write_bytes_from_coroutine("example/file/path.txt", stream_coro) + + """ + + return functools.partial(self._stream_coroutine, route) + + def __del__(self): + if hasattr(self, "session"): + nest_asyncio.apply() + loop = asyncio.get_event_loop() + loop.run_until_complete(self.session.close()) + + @staticmethod + def write_bytes( + path: str, + coroutine: Callable[[AsyncStreamCallbackType], Awaitable[None]]): + write_bytes_from_coroutine(path, coroutine) + + +def write_bytes_from_coroutine( + path: str, + coroutine: Callable[[AsyncStreamCallbackType], Awaitable[None]] +): + """ Utility for streaming http from an asynchronous requester to a file. + + Parameters + ---------- + path : + Write to this file + coroutine : + The source of the data. Needs to have a specific structure, namely: + - the first-position parameter of the coroutine ought to accept a + callback. This callback ought to itself be awaitable. + - within the coroutine, this callback ought to be called with a + single argument. That single argument should be an asynchronous + iterator. + Please see AsyncHttpEngine.stream (and + AsyncHttpEngine._stream_coroutine) for an example. + + """ + + os.makedirs(os.path.dirname(path), exist_ok=True) + + async def callback(file_, iterable): + async for chunk in iterable: + file_.write(chunk) + + async def wrapper(): + with open(path, "wb") as file_: + callback_ = functools.partial(callback, file_) + await coroutine(callback_) + + nest_asyncio.apply() + loop = asyncio.get_event_loop() + loop.run_until_complete(wrapper()) + + +def write_from_stream(path: str, stream: Iterable[bytes]): + """ Write bytes to a file from an iterator + + Parameters + ---------- + path : + write to this file + stream : + iterable yielding bytes to be written + + """ + with open(path, "wb") as fil: + for chunk in stream: + fil.write(chunk) diff --git a/brain_observatory/ecephys/ecephys_project_api/rma_engine.py b/brain_observatory/ecephys/ecephys_project_api/rma_engine.py new file mode 100644 index 0000000000..9126d6ab5b --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/rma_engine.py @@ -0,0 +1,136 @@ +import sys +import logging +import time +import ast + +import requests +import pandas as pd + +from .http_engine import HttpEngine, AsyncHttpEngine + + +class RmaRequestError(Exception): + pass + + +class RmaEngine(HttpEngine): + + @property + def format_query_string(self): + return f"query.{self.rma_format}" + + def __init__( + self, + scheme, + host, + rma_prefix: str = "api/v2/data", + rma_format: str = "json", + page_size: int = 5000, + **kwargs + ): + """ Simple tool for making rma and streaming http requests. + + Parameters + ---------- + scheme : + e.g "http" or "https" + host : + will be used as the base for request urls + rma_prefix : + rma request routes will be prefixed with this string + rma_format : + Format of reuturned response. e.g. "json", "xml", "csv" + page_size : + how many rma records to request in one query. + **kwargs : + will be passed to parent + """ + + super(RmaEngine, self).__init__(scheme, host, **kwargs) + self.rma_prefix = rma_prefix + self.rma_format = rma_format + self.page_size = page_size + + def add_page_params(self, url, start, count=None): + if count is None: + count = self.page_size + return f"{url},rma::options[start_row$eq{start}][num_rows$eq{count}][order$eq'id']" + + def get_rma(self, query: str): + """ Makes a paging rma query + + Parameters + ---------- + query : + The RMA query parameters + + """ + url = f"{self.scheme}://{self.host}/{self.rma_prefix}/{self.format_query_string}?{query}" + logging.debug(url) + + start_row = 0 + total_rows = None + + start_time = time.time() + while total_rows is None or start_row < total_rows: + current_url = self.add_page_params(url, start_row) + response_json = requests.get(current_url).json() + if not response_json["success"]: + raise RmaRequestError(response_json["msg"]) + + start_row += response_json["num_rows"] + if total_rows is None: + total_rows = response_json["total_rows"] + + logging.debug(f"downloaded {start_row} of {total_rows} records ({time.time() - start_time:.3f} seconds)") + yield response_json["msg"] + + + def get_rma_list(self, query): + response = [] + for chunk in self.get_rma(query): + response.extend(chunk) + return response + + def get_rma_tabular(self, query, try_infer_dtypes=True): + response = pd.DataFrame(self.get_rma_list(query)) + + if try_infer_dtypes: + response = infer_column_types(response) + + return response + + +class AsyncRmaEngine(RmaEngine, AsyncHttpEngine): + + def __init__(self, scheme: str, host: str, **kwargs): + """ Simple tool for making rma and asynchronous streaming http + requests. + + Parameters + ---------- + scheme : + e.g "http" or "https" + host : + will be used as the base for request urls + **kwargs : + will be passed to parent + """ + + super(AsyncRmaEngine, self).__init__(scheme, host, **kwargs) + + +def infer_column_types(dataframe): + """ RMA queries often come back with string-typed columns. This utility tries to infer numeric types. + """ + + dataframe = dataframe.copy() + + for colname in dataframe.columns: + try: + dataframe[colname] = dataframe[colname].apply(ast.literal_eval) + except (ValueError, SyntaxError): + continue + + dataframe = dataframe.infer_objects() + return dataframe \ No newline at end of file diff --git a/brain_observatory/ecephys/ecephys_project_api/utilities.py b/brain_observatory/ecephys/ecephys_project_api/utilities.py new file mode 100644 index 0000000000..826e4fc56c --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_api/utilities.py @@ -0,0 +1,93 @@ +import copy as cp + +from jinja2 import Environment, BaseLoader, DictLoader + + +def macros(): + return { + "macros": """ + {%- macro comma_sep(data, quote=False) -%} + {%- for datum in data -%} + {% if quote%}\'{%endif -%} + {{datum}} + {%- if quote %}\'{% endif %} + {% if not loop.last %},{% endif %} + {%- endfor -%} + {%- endmacro -%} + {%- macro str(x) -%} + {{- x ~ "" -}} + {%- endmacro -%} + """ + } + + +def postgres_macros(): + return { + "postgres_macros": """ + {% import 'macros' as m %} + {% macro optional_contains(key, data, quote=False) %} + {% if data is not none -%} + and {{key}} in ({{m.comma_sep(data, quote)}}) + {% endif %} + {% endmacro %} + {% macro optional_equals(key, value) %} + {% if value is not none -%} + and {{key}} = {{value}} + {% endif %} + {% endmacro %} + {% macro optional_not_null(key, value=True) %} + {% if value is not none -%} + and {{key}} is {{- ' not ' if value -}} null + {% endif %} + {% endmacro %} + {% macro optional_le(key, value) %} + {% if value is not none -%} + and {{key}} <= {{value}} + {% endif %} + {% endmacro %} + {% macro optional_ge(key, value) %} + {% if value is not none -%} + and {{key}} >= {{value}} + {% endif %} + {% endmacro %} + """, + "macros": macros()["macros"] + } + + +def rma_macros(): + return { + "rma_macros": """ + {% import 'macros' as m %} + {% macro optional_contains(key, data, quote=False) -%} + {%- if data is not none %}[{{key}}$in{{m.comma_sep(data,quote)}}]{% endif -%} + {%- endmacro -%} + """, + "macros": macros()["macros"] + } + + + +def build_and_execute(query, base=None, engine=None, **kwargs): + env = build_environment({"__tmp__": query}, base=base) + return execute_templated(env, "__tmp__", engine=engine, **kwargs) + + +def build_environment(template_strings, base=None): + if base is None: + base = {} + else: + base = cp.deepcopy(base) + + base.update(template_strings) + return Environment(loader=DictLoader(base), lstrip_blocks=True, trim_blocks=True) + + +def execute_templated(environment, name, engine, engine_kwargs=None, **kwargs): + if engine_kwargs is None: + engine_kwargs = {} + + template = environment.get_template(name) + rendered = template.render(**kwargs) + + return engine(rendered) diff --git a/brain_observatory/ecephys/ecephys_project_cache.py b/brain_observatory/ecephys/ecephys_project_cache.py new file mode 100644 index 0000000000..89cb62210a --- /dev/null +++ b/brain_observatory/ecephys/ecephys_project_cache.py @@ -0,0 +1,777 @@ +from functools import partial +from pathlib import Path +from typing import Any, List, Optional, Union, Callable +import ast + +import pandas as pd +import SimpleITK as sitk +import numpy as np +import pynwb + +from allensdk.api.warehouse_cache.cache import Cache +from allensdk.core.authentication import DbCredentials +from allensdk.brain_observatory.ecephys.ecephys_project_api import ( + EcephysProjectApi, EcephysProjectLimsApi, EcephysProjectWarehouseApi, + EcephysProjectFixedApi +) +from allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine import ( + write_bytes_from_coroutine, write_from_stream +) +from allensdk.brain_observatory.ecephys.ecephys_session_api import ( + EcephysNwbSessionApi +) +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession +from allensdk.brain_observatory.ecephys import get_unit_filter_value +from allensdk.api.warehouse_cache.caching_utilities import one_file_call_caching + + +class EcephysProjectCache(Cache): + + SESSIONS_KEY = 'sessions' + PROBES_KEY = 'probes' + CHANNELS_KEY = 'channels' + UNITS_KEY = 'units' + + SESSION_DIR_KEY = 'session_data' + SESSION_NWB_KEY = 'session_nwb' + PROBE_LFP_NWB_KEY = "probe_lfp_nwb" + + NATURAL_MOVIE_DIR_KEY = "movie_dir" + NATURAL_MOVIE_KEY = "natural_movie" + + NATURAL_SCENE_DIR_KEY = "natural_scene_dir" + NATURAL_SCENE_KEY = "natural_scene" + + SESSION_ANALYSIS_METRICS_KEY = "session_analysis_metrics" + TYPEWISE_ANALYSIS_METRICS_KEY = "typewise_analysis_metrics" + + MANIFEST_VERSION = '0.3.0' + + SUPPRESS_FROM_UNITS = ("air_channel_index", + "surface_channel_index", + "has_nwb", + "lfp_temporal_subsampling_factor", + "epoch_name_quality_metrics", + "epoch_name_waveform_metrics", + "isi_experiment_id") + SUPPRESS_FROM_CHANNELS = ( + "air_channel_index", "surface_channel_index", "name", + "date_of_acquisition", "published_at", "specimen_id", "session_type", "isi_experiment_id", "age_in_days", + "sex", "genotype", "has_nwb", "lfp_temporal_subsampling_factor" + ) + SUPPRESS_FROM_PROBES = ( + "air_channel_index", "surface_channel_index", + "date_of_acquisition", "published_at", "specimen_id", "session_type", "isi_experiment_id", "age_in_days", + "sex", "genotype", "has_nwb", "lfp_temporal_subsampling_factor" + ) + SUPPRESS_FROM_SESSION_TABLE = ( + "has_nwb", + "isi_experiment_id", + "date_of_acquisition" + ) + + def __init__( + self, + fetch_api: Optional[EcephysProjectApi] = None, + fetch_tries: int = 2, + stream_writer: Optional[Callable] = None, + manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None, + cache: bool = True): + """ Entrypoint for accessing ecephys (neuropixels) data. Supports + access to cross-session data (like stimulus templates) and high-level + summaries of sessionwise data and provides tools for downloading detailed + sessionwise data (such as spike times). + + To ensure correct configuration, it is recommended to use one of the + class constructors rather than to initialize this class directly. + + Parameters + ========== + fetch_api : Optional[EcephysProjectApi] + Used to pull data from remote sources, after which it is locally + cached. Any object exposing the EcephysProjectApi interface is + suitable. Standard options are: + EcephysProjectWarehouseApi :: The default. Fetches publically + available Allen Institute data + EcephysProjectFixedApi :: Refuses to fetch any data - only the + existing local cache is accessible. Useful if you want to + settle on a fixed dataset for analysis + EcephysProjectLimsApi :: Fetches bleeding-edge data from the + Allen Institute's internal database. Only works if you are + on our internal network. + By default None. If None, then fetch_api will be set to: + EcephysProjectWarehouseApi.default() + fetch_tries : int + Maximum number of times to attempt a download before giving up and + raising an exception. Note that this is total tries, not retries + stream_writer: Callable + The method used to write from stream. Depends on whether the + engine is synchronous or asynchronous. If not set, will use the + `write_bytes` method native to the `fetch_api`'s `rma_engine`. + If the method is incompatible with the `fetch_api`'s `rma_engine`, + will likely encounter errors. For this reason it is recommended + to leave this field unspecified, or to use one of the class + constructors. + manifest : str or Path + full path at which manifest json will be stored (default = + "ecephys_project_manifest.json" in the local directory.) + version : str + version of manifest file. If this mismatches the version + recorded in the file at manifest, an error will be raised. + cache: bool + Whether to write to the cache (default=True) + + Notes + ===== + It is highly recommended to construct an instance of this class + using one of the following constructor methods: + + from_warehouse(scheme: Optional[str] = None, + host: Optional[str] = None, + asynchronous: bool = True, + manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None, + cache: bool = True, + fetch_tries: int = 2) + Create an instance of EcephysProjectCache with an + EcephysProjectWarehouseApi. Retrieves released data stored + in the warehouse. Suitable for all users downloading + published Allen Institute data. + from_lims(lims_credentials: Optional[DbCredentials] = None, + scheme: Optional[str] = None, + host: Optional[str] = None, + asynchronous: bool = True, + manifest: Optional[str] = None, + version: Optional[str] = None, + cache: bool = True, + fetch_tries: int = 2) + Create an instance of EcephysProjectCache with an + EcephysProjectLimsApi. Retrieves bleeding-edge data stored + locally on Allen Institute servers. Suitable for internal + users on-site at the Allen Institute or using the corporate + vpn. Requires Allen Institute database credentials. + fixed(manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None) + Create an instance of EcephysProjectCache that will only + use locally stored data, downloaded previously from LIMS + or warehouse using the EcephysProjectCache. + Suitable for users who want to analyze a fixed dataset they + have previously downloaded using EcephysProjectCache. + """ + manifest_ = manifest or "ecephys_project_manifest.json" + version_ = version or self.MANIFEST_VERSION + + super(EcephysProjectCache, self).__init__(manifest=manifest_, + version=version_, + cache=cache) + self.fetch_api = (EcephysProjectWarehouseApi.default() + if fetch_api is None else fetch_api) + self.fetch_tries = fetch_tries + self.stream_writer = (stream_writer + or self.fetch_api.rma_engine.write_bytes) + if stream_writer is not None: + self.stream_writer = stream_writer + else: + if hasattr(self.fetch_api, "rma_engine"): # EcephysProjectWarehouseApi # noqa + self.stream_writer = self.fetch_api.rma_engine.write_bytes + # TODO: Make these names consistent in the different fetch apis + elif hasattr(self.fetch_api, "app_engine"): # EcephysProjectLimsApi # noqa + self.stream_writer = self.fetch_api.app_engine.write_bytes + else: + raise ValueError( + "Must either set value for `stream_writer`, or use a " + "`fetch_api` with an rma_engine or app_engine attribute " + "that implements `write_bytes`. See `HttpEngine` and " + "`AsyncHttpEngine` from " + "allensdk.brain_observatory.ecephys.ecephys_project_api." + "http_engine for examples.") + + def _get_sessions(self): + path = self.get_cache_path(None, self.SESSIONS_KEY) + response = one_file_call_caching(path, self.fetch_api.get_sessions, write_csv, read_csv, num_tries=self.fetch_tries) + + if "structure_acronyms" in response.columns: # unfortunately, structure_acronyms is a list of str + response["ecephys_structure_acronyms"] = [ast.literal_eval(item) for item in response["structure_acronyms"]] + response.drop(columns=["structure_acronyms"], inplace=True) + + return response + + def _get_probes(self): + path: str = self.get_cache_path(None, self.PROBES_KEY) + probes = one_file_call_caching(path, self.fetch_api.get_probes, write_csv, read_csv, num_tries=self.fetch_tries) + # Divide the lfp sampling by the subsampling factor for clearer presentation (if provided) + if all(c in list(probes) for c in + ["lfp_sampling_rate", "lfp_temporal_subsampling_factor"]): + probes["lfp_sampling_rate"] = ( + probes["lfp_sampling_rate"] / probes["lfp_temporal_subsampling_factor"]) + return probes + + def _get_channels(self): + path = self.get_cache_path(None, self.CHANNELS_KEY) + return one_file_call_caching(path, self.fetch_api.get_channels, write_csv, read_csv, num_tries=self.fetch_tries) + + def _get_units(self, filter_by_validity: bool = True, **unit_filter_kwargs) -> pd.DataFrame: + path = self.get_cache_path(None, self.UNITS_KEY) + + units = one_file_call_caching(path, self.fetch_api.get_units, write_csv, read_csv, num_tries=self.fetch_tries) + units = units.rename(columns={ + 'PT_ratio': 'waveform_PT_ratio', + 'amplitude': 'waveform_amplitude', + 'duration': 'waveform_duration', + 'halfwidth': 'waveform_halfwidth', + 'recovery_slope': 'waveform_recovery_slope', + 'repolarization_slope': 'waveform_repolarization_slope', + 'spread': 'waveform_spread', + 'velocity_above': 'waveform_velocity_above', + 'velocity_below': 'waveform_velocity_below', + 'l_ratio': 'L_ratio', + }) + + units = units[ + (units["amplitude_cutoff"] <= get_unit_filter_value("amplitude_cutoff_maximum", **unit_filter_kwargs)) + & (units["presence_ratio"] >= get_unit_filter_value("presence_ratio_minimum", **unit_filter_kwargs)) + & (units["isi_violations"] <= get_unit_filter_value("isi_violations_maximum", **unit_filter_kwargs)) + ] + + if "quality" in units.columns and filter_by_validity: + units = units[units["quality"] == "good"] + units.drop(columns="quality", inplace=True) + + if "ecephys_structure_id" in units.columns and unit_filter_kwargs.get("filter_out_of_brain_units", True): + units = units[~(units["ecephys_structure_id"].isna())] + + return units + + def _get_annotated_probes(self): + sessions = self._get_sessions() + probes = self._get_probes() + + return pd.merge(probes, sessions, left_on="ecephys_session_id", right_index=True, suffixes=['_probe', '_session']) + + def _get_annotated_channels(self): + channels = self._get_channels() + probes = self._get_annotated_probes() + + return pd.merge(channels, probes, left_on="ecephys_probe_id", right_index=True, suffixes=['_channel', '_probe']) + + def _get_annotated_units(self, filter_by_validity: bool = True, **unit_filter_kwargs) -> pd.DataFrame: + units = self._get_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) + channels = self._get_annotated_channels() + annotated_units = pd.merge(units, channels, left_on='ecephys_channel_id', right_index=True, suffixes=['_unit', '_channel']) + annotated_units = annotated_units.rename(columns={ + 'name': 'probe_name', + 'phase': 'probe_phase', + 'sampling_rate': 'probe_sampling_rate', + 'lfp_sampling_rate': 'probe_lfp_sampling_rate', + 'local_index': 'peak_channel' + }) + + return pd.merge(units, channels, left_on='ecephys_channel_id', right_index=True, suffixes=['_unit', '_channel']) + + def get_session_table(self, suppress=None) -> pd.DataFrame: + sessions = self._get_sessions() + + count_owned(sessions, self._get_annotated_units(), "ecephys_session_id", "unit_count", inplace=True) + count_owned(sessions, self._get_annotated_channels(), "ecephys_session_id", "channel_count", inplace=True) + count_owned(sessions, self._get_annotated_probes(), "ecephys_session_id", "probe_count", inplace=True) + + get_grouped_uniques(sessions, self._get_annotated_channels(), "ecephys_session_id", "ecephys_structure_acronym", "ecephys_structure_acronyms", inplace=True) + + if suppress is None: + suppress = list(self.SUPPRESS_FROM_SESSION_TABLE) + sessions.drop(columns=suppress, inplace=True, errors="ignore") + sessions = sessions.rename(columns={'genotype': 'full_genotype'}) + return sessions + + def get_probes(self, suppress=None): + probes = self._get_annotated_probes() + + count_owned(probes, self._get_annotated_units(), "ecephys_probe_id", "unit_count", inplace=True) + count_owned(probes, self._get_annotated_channels(), "ecephys_probe_id", "channel_count", inplace=True) + + get_grouped_uniques(probes, self._get_annotated_channels(), "ecephys_probe_id", "ecephys_structure_acronym", "ecephys_structure_acronyms", inplace=True) + + if suppress is None: + suppress = list(self.SUPPRESS_FROM_PROBES) + probes.drop(columns=suppress, inplace=True, errors="ignore") + + return probes + + def get_channels(self, suppress=None): + """ Load (potentially downloading and caching) a table whose rows are individual channels. + """ + + channels = self._get_annotated_channels() + count_owned(channels, self._get_annotated_units(), "ecephys_channel_id", "unit_count", inplace=True) + + if suppress is None: + suppress = list(self.SUPPRESS_FROM_CHANNELS) + channels.drop(columns=suppress, inplace=True, errors="ignore") + channels.rename(columns={"name": "probe_name"}, inplace=True, errors="ignore") + + return channels + + def get_units(self, suppress: Optional[List[str]] = None, filter_by_validity: bool = True, **unit_filter_kwargs) -> pd.DataFrame: + """Reports a table consisting of all sorted units across the entire extracellular electrophysiology project. + + Parameters + ---------- + suppress : Optional[List[str]], optional + A list of dataframe column names to hide, by default None + (None will hide dataframe columns specified in: SUPPRESS_FROM_UNITS) + + filter_by_validity : bool, optional + Filter units so that only 'valid' units are returned, by default True + + **unit_filter_kwargs : + Additional keyword arguments that can be used to filter units (for power users). + + Returns + ------- + pd.DataFrame + A table consisting of sorted units across the entire extracellular electrophysiology project + """ + if suppress is None: + suppress = list(self.SUPPRESS_FROM_UNITS) + + units = self._get_annotated_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) + units.drop(columns=suppress, inplace=True, errors="ignore") + + return units + + def get_session_data(self, session_id: int, filter_by_validity: bool = True, **unit_filter_kwargs): + """ Obtain an EcephysSession object containing detailed data for a single session + """ + + def read(_path): + session_api = self._build_nwb_api_for_session(_path, session_id, filter_by_validity, **unit_filter_kwargs) + return EcephysSession(api=session_api, test=True) + + return one_file_call_caching( + self.get_cache_path(None, self.SESSION_NWB_KEY, session_id, session_id), + partial(self.fetch_api.get_session_data, session_id), + self.stream_writer, + read, + num_tries=self.fetch_tries + ) + + def _build_nwb_api_for_session(self, path, session_id, filter_by_validity, **unit_filter_kwargs): + + get_analysis_metrics = partial( + self.get_unit_analysis_metrics_for_session, + session_id=session_id, + annotate=False, + filter_by_validity=True, + **unit_filter_kwargs + ) + + return EcephysNwbSessionApi( + path=path, + probe_lfp_paths=self._setup_probe_promises(session_id), + additional_unit_metrics=get_analysis_metrics, + external_channel_columns=partial(self._get_substitute_channel_columns, session_id), + filter_by_validity=filter_by_validity, + **unit_filter_kwargs + ) + + def _setup_probe_promises(self, session_id): + probes = self.get_probes() + probe_ids = probes[probes["ecephys_session_id"] == session_id].index.values + + return { + probe_id: partial( + one_file_call_caching, + self.get_cache_path(None, self.PROBE_LFP_NWB_KEY, session_id, probe_id), + partial(self.fetch_api.get_probe_lfp_data, probe_id), + self.stream_writer, + read_nwb, + num_tries=self.fetch_tries + ) + for probe_id in probe_ids + } + + def _get_substitute_channel_columns(self, session_id): + channels = self.get_channels() + return channels.loc[channels["ecephys_session_id"] == session_id, [ + "ecephys_structure_id", + "ecephys_structure_acronym", + "anterior_posterior_ccf_coordinate", + "dorsal_ventral_ccf_coordinate", + "left_right_ccf_coordinate" + ]] + + def get_natural_movie_template(self, number): + return one_file_call_caching( + self.get_cache_path(None, self.NATURAL_MOVIE_KEY, number), + partial(self.fetch_api.get_natural_movie_template, number=number), + self.stream_writer, + read_movie, + num_tries=self.fetch_tries + ) + + def get_natural_scene_template(self, number): + return one_file_call_caching( + self.get_cache_path(None, self.NATURAL_SCENE_KEY, number), + partial(self.fetch_api.get_natural_scene_template, number=number), + self.stream_writer, + read_scene, + num_tries=self.fetch_tries + ) + + def get_all_session_types(self, **session_kwargs): + return self._get_all_values("session_type", self.get_session_table, **session_kwargs) + + def get_all_full_genotypes(self, **session_kwargs): + return self._get_all_values("full_genotype", self.get_session_table, **session_kwargs) + + def get_structure_acronyms(self, **channel_kwargs) -> List[str]: + return self._get_all_values("ecephys_structure_acronym", self.get_channels, **channel_kwargs) + + def get_all_ages(self, **session_kwargs): + return self._get_all_values("age_in_days", self.get_session_table, **session_kwargs) + + def get_all_sexes(self, **session_kwargs): + return self._get_all_values("sex", self.get_session_table, **session_kwargs) + + def _get_all_values(self, key, method=None, **method_kwargs) -> List[Any]: + if method is None: + method = self.get_session_table + data = method(**method_kwargs) + return data[key].unique().tolist() + + def get_unit_analysis_metrics_for_session(self, session_id, annotate: bool = True, filter_by_validity: bool = True, **unit_filter_kwargs): + """ Cache and return a table of analysis metrics calculated on each unit from a specified session. See + get_session_table for a list of sessions. + + Parameters + ---------- + session_id : int + identifies the session from which to fetch analysis metrics. + annotate : bool, optional + if True, information from the annotated units table will be merged onto the outputs + filter_by_validity : bool, optional + Filter units used by analysis so that only 'valid' units are returned, by default True + **unit_filter_kwargs : + Additional keyword arguments that can be used to filter units (for power users). + + Returns + ------- + metrics : pd.DataFrame + Each row corresponds to a single unit, describing a set of analysis metrics calculated on that unit. + + """ + + path = self.get_cache_path(None, self.SESSION_ANALYSIS_METRICS_KEY, session_id, session_id) + fetch_metrics = partial(self.fetch_api.get_unit_analysis_metrics, ecephys_session_ids=[session_id]) + + metrics = one_file_call_caching(path, fetch_metrics, write_metrics_csv, read_metrics_csv, num_tries=self.fetch_tries) + + if annotate: + units = self.get_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) + units = units[units["ecephys_session_id"] == session_id] + metrics = pd.merge(units, metrics, left_index=True, right_index=True, how="inner") + metrics.index.rename("ecephys_unit_id", inplace=True) + + return metrics + + def get_unit_analysis_metrics_by_session_type(self, session_type, annotate: bool = True, filter_by_validity: bool = True, **unit_filter_kwargs): + """ Cache and return a table of analysis metrics calculated on each unit from a specified session type. See + get_all_session_types for a list of session types. + + Parameters + ---------- + session_type : str + identifies the session type for which to fetch analysis metrics. + annotate : bool, optional + if True, information from the annotated units table will be merged onto the outputs + filter_by_validity : bool, optional + Filter units used by analysis so that only 'valid' units are returned, by default True + **unit_filter_kwargs : + Additional keyword arguments that can be used to filter units (for power users). + + Returns + ------- + metrics : pd.DataFrame + Each row corresponds to a single unit, describing a set of analysis metrics calculated on that unit. + + """ + + known_session_types = self.get_all_session_types() + if session_type not in known_session_types: + raise ValueError(f"unrecognized session type: {session_type}. Available types: {known_session_types}") + + path = self.get_cache_path(None, self.TYPEWISE_ANALYSIS_METRICS_KEY, session_type) + fetch_metrics = partial(self.fetch_api.get_unit_analysis_metrics, session_types=[session_type]) + + metrics = one_file_call_caching( + path, + fetch_metrics, + write_metrics_csv, + read_metrics_csv, + num_tries=self.fetch_tries + ) + + if annotate: + units = self.get_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) + metrics = pd.merge(units, metrics, left_index=True, right_index=True, how="inner") + metrics.index.rename("ecephys_unit_id", inplace=True) + + return metrics + + def add_manifest_paths(self, manifest_builder): + manifest_builder = super(EcephysProjectCache, self).add_manifest_paths(manifest_builder) + + manifest_builder.add_path( + self.SESSIONS_KEY, 'sessions.csv', parent_key='BASEDIR', typename='file' + ) + + manifest_builder.add_path( + self.PROBES_KEY, 'probes.csv', parent_key='BASEDIR', typename='file' + ) + + manifest_builder.add_path( + self.CHANNELS_KEY, 'channels.csv', parent_key='BASEDIR', typename='file' + ) + + manifest_builder.add_path( + self.UNITS_KEY, 'units.csv', parent_key='BASEDIR', typename='file' + ) + + manifest_builder.add_path( + self.SESSION_DIR_KEY, 'session_%d', parent_key='BASEDIR', typename='dir' + ) + + manifest_builder.add_path( + self.SESSION_NWB_KEY, 'session_%d.nwb', parent_key=self.SESSION_DIR_KEY, typename='file' + ) + + manifest_builder.add_path( + self.SESSION_ANALYSIS_METRICS_KEY, 'session_%d_analysis_metrics.csv', parent_key=self.SESSION_DIR_KEY, typename='file' + ) + + manifest_builder.add_path( + self.PROBE_LFP_NWB_KEY, 'probe_%d_lfp.nwb', parent_key=self.SESSION_DIR_KEY, typename='file' + ) + + manifest_builder.add_path( + self.NATURAL_MOVIE_DIR_KEY, "natural_movie_templates", parent_key="BASEDIR", typename="dir" + ) + + manifest_builder.add_path( + self.TYPEWISE_ANALYSIS_METRICS_KEY, "%s_analysis_metrics.csv", parent_key='BASEDIR', typename="file" + ) + + manifest_builder.add_path( + self.NATURAL_MOVIE_KEY, "natural_movie_%d.h5", parent_key=self.NATURAL_MOVIE_DIR_KEY, typename="file" + ) + + manifest_builder.add_path( + self.NATURAL_SCENE_DIR_KEY, "natural_scene_templates", parent_key="BASEDIR", typename="dir" + ) + + manifest_builder.add_path( + self.NATURAL_SCENE_KEY, "natural_scene_%d.tiff", parent_key=self.NATURAL_SCENE_DIR_KEY, typename="file" + ) + + return manifest_builder + + @classmethod + def _from_http_source_default(cls, fetch_api_cls, fetch_api_kwargs, **kwargs): + fetch_api_kwargs = { + "asynchronous": True + } if fetch_api_kwargs is None else fetch_api_kwargs + + if kwargs.get("stream_writer") is None: + if fetch_api_kwargs.get("asynchronous", True): + kwargs["stream_writer"] = write_bytes_from_coroutine + else: + kwargs["stream_writer"] = write_from_stream + + return cls( + fetch_api=fetch_api_cls.default(**fetch_api_kwargs), + **kwargs + ) + + @classmethod + def from_lims(cls, lims_credentials: Optional[DbCredentials] = None, + scheme: Optional[str] = None, + host: Optional[str] = None, + asynchronous: bool = False, + manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None, + cache: bool = True, + fetch_tries: int = 2): + """ + Create an instance of EcephysProjectCache with an + EcephysProjectLimsApi. Retrieves bleeding-edge data stored + locally on Allen Institute servers. Only available for use + on-site at the Allen Institute or through a vpn. Requires Allen + Institute database credentials. + + Parameters + ========== + lims_credentials : DbCredentials + Credentials to access LIMS database. If not provided will + attempt to find credentials in environment variables. + scheme : str + URI scheme, such as "http". Defaults to + EcephysProjectLimsApi.default value if unspecified. + Will not be used unless `host` is also specified. + host : str + Web host. Defaults to EcephysProjectLimsApi.default + value if unspecified. Will not be used unless `scheme` is + also specified. + asynchronous : bool + Whether to fetch file asynchronously. Defaults to False. + manifest : str or Path + full path at which manifest json will be stored + version : str + version of manifest file. If this mismatches the version + recorded in the file at manifest, an error will be raised. + cache: bool + Whether to write to the cache (default=True) + fetch_tries : int + Maximum number of times to attempt a download before giving up and + raising an exception. Note that this is total tries, not retries + """ + if scheme and host: + app_kwargs = {"scheme": scheme, "host": host} + else: + app_kwargs = None + return cls._from_http_source_default( + EcephysProjectLimsApi, + {"lims_credentials": lims_credentials, + "app_kwargs": app_kwargs, + "asynchronous": asynchronous, + }, # expects dictionary of kwargs + manifest=manifest, version=version, cache=cache, + fetch_tries=fetch_tries) + + @classmethod + def from_warehouse(cls, + scheme: Optional[str] = None, + host: Optional[str] = None, + asynchronous: bool = False, + manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None, + cache: bool = True, + fetch_tries: int = 2, + timeout: int = 1200): + """ + Create an instance of EcephysProjectCache with an + EcephysProjectWarehouseApi. Retrieves released data stored in + the warehouse. + + Parameters + ========== + scheme : str + URI scheme, such as "http". Defaults to + EcephysProjectWarehouseAPI.default value if unspecified. + Will not be used unless `host` is also specified. + host : str + Web host. Defaults to EcephysProjectWarehouseApi.default + value if unspecified. Will not be used unless `scheme` is also + specified. + asynchronous : bool + Whether to fetch file asynchronously. Defaults to False. + manifest : str or Path + full path at which manifest json will be stored + version : str + version of manifest file. If this mismatches the version + recorded in the file at manifest, an error will be raised. + cache: bool + Whether to write to the cache (default=True) + fetch_tries : int + Maximum number of times to attempt a download before giving up and + raising an exception. Note that this is total tries, not retries + timeout : int + Amount of time (in seconds) to wait on an HTTP request before raising + an error. Increase this duration if you find that warehouse servers + are not responding quickly. Defaults to 1200 seconds (20 minutes). + """ + if scheme and host: + app_kwargs = {"scheme": scheme, "host": host, + "asynchronous": asynchronous} + else: + app_kwargs = {"asynchronous": asynchronous} + app_kwargs['timeout'] = timeout + return cls._from_http_source_default( + EcephysProjectWarehouseApi, app_kwargs, manifest=manifest, + version=version, cache=cache, fetch_tries=fetch_tries + ) + + @classmethod + def fixed(cls, manifest: Optional[Union[str, Path]] = None, + version: Optional[str] = None): + """ + Creates a EcephysProjectCache that refuses to fetch any data + - only the existing local cache is accessible. Useful if you + want to settle on a fixed dataset for analysis. + + Parameters + ========== + manifest : str or Path + full path to existing manifest json + version : str + version of manifest file. If this mismatches the version + recorded in the file at manifest, an error will be raised. + """ + return cls(fetch_api=EcephysProjectFixedApi(), manifest=manifest, + version=version) + + +def count_owned(this, other, foreign_key, count_key, inplace=False): + if not inplace: + this = this.copy() + + counts = other.loc[:, foreign_key].value_counts() + this[count_key] = 0 + this.loc[counts.index.values, count_key] = counts.values + + if not inplace: + return this + + +def get_grouped_uniques(this, other, foreign_key, field_key, unique_key, inplace=False): + if not inplace: + this = this.copy() + + uniques = other.groupby(foreign_key)\ + .apply(lambda grp: pd.DataFrame(grp)[field_key].unique()) + this[unique_key] = 0 + this.loc[uniques.index.values, unique_key] = uniques.values + + if not inplace: + return this + + +def read_csv(path) -> pd.DataFrame: + return pd.read_csv(path, index_col="id") + + +def write_csv(path, df): + df.to_csv(path) + + +def write_metrics_csv(path, df): + df.to_csv(path) + + +def read_metrics_csv(path): + return pd.read_csv(path, index_col='ecephys_unit_id') + + +def read_scene(path): + return sitk.GetArrayFromImage(sitk.ReadImage(path)) + + +def read_movie(path): + return np.load(path, allow_pickle=False) + + +def read_nwb(path): + reader = pynwb.NWBHDF5IO(str(path), 'r') + nwbfile = reader.read() + nwbfile.identifier # if the file is corrupt, make sure an exception gets raised during read + return nwbfile diff --git a/brain_observatory/ecephys/ecephys_session.py b/brain_observatory/ecephys/ecephys_session.py new file mode 100644 index 0000000000..8f9a8429aa --- /dev/null +++ b/brain_observatory/ecephys/ecephys_session.py @@ -0,0 +1,1239 @@ +import warnings +from collections.abc import Collection +from collections import defaultdict +from typing import Optional + +import xarray as xr +import numpy as np +import pandas as pd +import scipy.stats + +from allensdk.core.lazy_property import LazyPropertyMixin +from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi, EcephysNwbSessionApi, EcephysNwb1Api +from allensdk.brain_observatory.ecephys.stimulus_table import naming_utilities +from allensdk.brain_observatory.ecephys.stimulus_table._schemas import default_stimulus_renames, default_column_renames + + +NON_STIMULUS_PARAMETERS = tuple([ + 'start_time', + 'stop_time', + 'duration', + 'stimulus_block', + "stimulus_condition_id" +]) # stimulus_presentation column names not describing a parameter of a stimulus + + +class EcephysSession(LazyPropertyMixin): + ''' Represents data from a single EcephysSession + + Attributes + ---------- + units : pd.Dataframe + A table whose rows are sorted units (putative neurons) and whose columns are characteristics + of those units. + Index is: + unit_id : int + Unique integer identifier for this unit. + Columns are: + firing_rate : float + This unit's firing rate (spikes / s) calculated over the window of that unit's activity + (the time from its first detected spike to its last). + isi_violations : float + Estamate of this unit's contamination rate (larger means that more of the spikes assigned + to this unit probably originated from other neurons). Calculated as a ratio of the firing + rate of the unit over periods where spikes would be isi-violating vs the total firing + rate of the unit. + peak_channel_id : int + Unique integer identifier for this unit's peak channel. A unit's peak channel is the channel on + which its peak-to-trough amplitude difference is maximized. This is assessed using the kilosort 2 + templates rather than the mean waveforms for a unit. + snr : float + Signal to noise ratio for this unit. + probe_horizontal_position : numeric + The horizontal (short-axis) position of this unit's peak channel in microns. + probe_vertical_position : numeric + The vertical (long-axis, lower values are closer to the probe base) position of + this unit's peak channel in microns. + probe_id : int + Unique integer identifier for this unit's probe. + probe_description : str + Human-readable description carrying miscellaneous information about this unit's probe. + location : str + Gross-scale location of this unit's probe. + spike_times : dict + Maps integer unit ids to arrays of spike times (float) for those units. + running_speed : RunningSpeed + NamedTuple with two fields + timestamps : numpy.ndarray + Timestamps of running speed data samples + values : np.ndarray + Running speed of the experimental subject (in cm / s). + mean_waveforms : dict + Maps integer unit ids to xarray.DataArrays containing mean spike waveforms for that unit. + stimulus_presentations : pd.DataFrame + Table whose rows are stimulus presentations and whose columns are presentation characteristics. + A stimulus presentation is the smallest unit of distinct stimulus presentation and lasts for + (usually) 1 60hz frame. Since not all parameters are relevant to all stimuli, this table + contains many 'null' values. + Index is + stimulus_presentation_id : int + Unique identifier for this stimulus presentation + Columns are + start_time : float + Time (s) at which this presentation began + stop_time : float + Time (s) at which this presentation ended + duration : float + stop_time - start_time (s). Included for convenience. + stimulus_name : str + Identifies the stimulus family (e.g. "drifting_gratings" or "natural_movie_3") used + for this presentation. The stimulus family, along with relevant parameter values, provides the + information required to reconstruct the stimulus presented during this presentation. The empty + string indicates a blank period. + stimulus_block : numeric + A stimulus block is made by sequentially presenting presentations from the same stimulus family. + This value is the index of the block which contains this presentation. During a blank period, + this is 'null'. + TF : float + Temporal frequency, or 'null' when not appropriate. + SF : float + Spatial frequency, or 'null' when not appropriate + Ori : float + Orientation (in degrees) or 'null' when not appropriate + Contrast : float + Pos_x : float + Pos_y : float + Color : numeric + Image : numeric + Phase : float + stimulus_condition_id : integer + identifies the session-unique stimulus condition (permutation of parameters) to which this presentation + belongs + stimulus_conditions : pd.DataFrame + Each row is a unique permutation (within this session) of stimulus parameters presented during this experiment. + Columns are as stimulus presentations, sans start_time, end_time, stimulus_block, and duration. + inter_presentation_intervals : pd.DataFrame + The elapsed time between each immediately sequential pair of stimulus presentations. This is a dataframe with a + two-level multiindex (levels are 'from_presentation_id' and 'to_presentation_id'). It has a single column, + 'interval', which reports the elapsed time between the two presentations in seconds on the experiment's master + clock. + + ''' + + DETAILED_STIMULUS_PARAMETERS = ( + "colorSpace", + "flipHoriz", + "flipVert", + "depth", + "interpolate", + "mask", + "opacity", + "rgbPedestal", + "tex", + "texRes", + "units", + "rgb", + "signalDots", + "noiseDots", + "fieldSize", + "fieldShape", + "fieldPos", + "nDots", + "dotSize", + "dotLife", + "color_triplet" + ) + + @property + def num_units(self): + return self._units.shape[0] + + @property + def num_probes(self): + return self.probes.shape[0] + + @property + def num_channels(self): + return self.channels.shape[0] + + @property + def num_stimulus_presentations(self): + return self.stimulus_presentations.shape[0] + + @property + def stimulus_names(self): + return self.stimulus_presentations['stimulus_name'].unique().tolist() + + @property + def stimulus_conditions(self): + self.stimulus_presentations + return self._stimulus_conditions + + @property + def rig_geometry_data(self): + if self._rig_metadata: + return self._rig_metadata["geometry"] + else: + return None + + @property + def rig_equipment_name(self): + if self._rig_metadata: + return self._rig_metadata["equipment"] + else: + return None + + @property + def specimen_name(self): + return self._metadata["specimen_name"] + + @property + def age_in_days(self): + return self._metadata["age_in_days"] + + @property + def sex(self): + return self._metadata["sex"] + + @property + def full_genotype(self): + return self._metadata["full_genotype"] + + @property + def session_type(self): + return self._metadata["stimulus_name"] + + @property + def units(self): + return self._units.drop(columns=['width_rf', 'height_rf', + 'on_screen_rf', 'time_to_peak_fl', + 'time_to_peak_rf', 'time_to_peak_sg', + 'sustained_idx_fl', 'time_to_peak_dg'], + errors='ignore') + + @property + def structure_acronyms(self): + return self.channels["ecephys_structure_acronym"].unique().tolist() + + @property + def structurewise_unit_counts(self): + return self.units["ecephys_structure_acronym"].value_counts() + + @property + def metadata(self): + return { + "specimen_name": self.specimen_name, + "session_type": self.session_type, + "full_genotype": self.full_genotype, + "sex": self.sex, + "age_in_days": self.age_in_days, + "rig_equipment_name": self.rig_equipment_name, + "num_units": self.num_units, + "num_channels": self.num_channels, + "num_probes": self.num_probes, + "num_stimulus_presentations": self.num_stimulus_presentations, + "session_start_time": self.session_start_time, + "ecephys_session_id": self.ecephys_session_id, + "structure_acronyms": self.structure_acronyms, + "stimulus_names": self.stimulus_names + } + + @property + def stimulus_presentations(self): + return self.__class__._remove_detailed_stimulus_parameters(self._stimulus_presentations) + + @property + def spike_times(self): + if not hasattr(self, "_accessed_spike_times"): + self._accessed_spike_times = True + self._warn_invalid_spike_intervals() + + return self._spike_times + + def __init__( + self, + api: EcephysSessionApi, + test: bool = False, + **kwargs + ): + """ Construct an EcephysSession object, which provides access to + detailed data for a single extracellular electrophysiology + (neuropixels) session. + + Parameters + ---------- + api : + Used to access data, which is then cached on this object. Must + expose the EcephysSessionApi interface. Standard options include + instances of: + EcephysSessionNwbApi :: reads data from a neurodata without + borders 2.0 file. + test : + If true, check during construction that this session's api is + valid. + + """ + + self.api: EcephysSessionApi = api + + self.ecephys_session_id = self.LazyProperty(self.api.get_ecephys_session_id) + self.session_start_time = self.LazyProperty(self.api.get_session_start_time) + self.running_speed = self.LazyProperty(self.api.get_running_speed) + self.mean_waveforms = self.LazyProperty(self.api.get_mean_waveforms, wrappers=[self._build_mean_waveforms]) + self._spike_times = self.LazyProperty(self.api.get_spike_times, wrappers=[self._build_spike_times]) + self.optogenetic_stimulation_epochs = self.LazyProperty(self.api.get_optogenetic_stimulation) + self.spike_amplitudes = self.LazyProperty(self.api.get_spike_amplitudes) + + self.probes = self.LazyProperty(self.api.get_probes) + self.channels = self.LazyProperty(self.api.get_channels) + + self._stimulus_presentations = self.LazyProperty(self.api.get_stimulus_presentations, + wrappers=[self._build_stimulus_presentations, self._mask_invalid_stimulus_presentations]) + self.inter_presentation_intervals = self.LazyProperty(self._build_inter_presentation_intervals) + self.invalid_times = self.LazyProperty(self.api.get_invalid_times) + + self._units = self.LazyProperty(self.api.get_units, wrappers=[self._build_units_table]) + self._rig_metadata = self.LazyProperty(self.api.get_rig_metadata) + self._metadata = self.LazyProperty(self.api.get_metadata) + + if test: + self.api.test() + + def get_current_source_density(self, probe_id): + """ Obtain current source density (CSD) of trial-averaged response to a flash stimuli for this probe. + See allensdk.brain_observatory.ecephys.current_source_density for details of CSD calculation. + + CSD is computed with a 1D method (second spatial derivative) without prior spatial smoothing + User should apply spatial smoothing of their choice (e.g., Gaussian filter) to the computed CSD + + + Parameters + ---------- + probe_id : int + identify the probe whose CSD data ought to be loaded + + Returns + ------- + xr.DataArray : + dimensions are channel (id) and time (seconds, relative to stimulus onset). Values are current source + density assessed on that channel at that time (V/m^2) + + """ + + return self.api.get_current_source_density(probe_id) + + def get_lfp(self, probe_id, mask_invalid_intervals=True): + ''' Load an xarray DataArray with LFP data from channels on a single probe + + Parameters + ---------- + probe_id : int + identify the probe whose LFP data ought to be loaded + mask_invalid_intervals : bool + if True (default) will mask data in the invalid intervals with np.nan + Returns + ------- + xr.DataArray : + dimensions are channel (id) and time (seconds). Values are sampled LFP data. + + Notes + ----- + Unlike many other data access methods on this class. This one does not cache the loaded data in memory due to + the large size of the LFP data. + + ''' + + if mask_invalid_intervals: + probe_name = self.probes.loc[probe_id]["description"] + fail_tags = ["all_probes", probe_name] + invalid_time_intervals = self._filter_invalid_times_by_tags(fail_tags) + lfp = self.api.get_lfp(probe_id) + time_points = lfp.time + valid_time_points = self._get_valid_time_points(time_points, invalid_time_intervals) + return lfp.where(cond=valid_time_points) + else: + return self.api.get_lfp(probe_id) + + def _get_valid_time_points(self, time_points, invalid_time_intevals): + + all_time_points = xr.DataArray( + name="time_points", + data=[True] * len(time_points), + dims=['time'], + coords=[time_points] + ) + + valid_time_points = all_time_points + for ix, invalid_time_interval in invalid_time_intevals.iterrows(): + invalid_time_points = (time_points >= invalid_time_interval['start_time']) & (time_points <= invalid_time_interval['stop_time']) + valid_time_points = np.logical_and(valid_time_points, np.logical_not(invalid_time_points)) + + return valid_time_points + + def _filter_invalid_times_by_tags(self, tags): + """ + Parameters + ---------- + invalid_times: pd.DataFrame + of invalid times + tags: list + of tags + + Returns + ------- + pd.DataFrame of invalid times having tags + """ + invalid_times = self.invalid_times.copy() + if not invalid_times.empty: + mask = invalid_times['tags'].apply(lambda x: any([t in x for t in tags])) + invalid_times = invalid_times[mask] + + return invalid_times + + def get_inter_presentation_intervals_for_stimulus(self, stimulus_names): + ''' Get a subset of this session's inter-presentation intervals, filtered by stimulus name. + + Parameters + ---------- + stimulus_names : array-like of str + The names of stimuli to include in the output. + + Returns + ------- + pd.DataFrame : + inter-presentation intervals, filtered to the requested stimulus names. + + ''' + + stimulus_names = coerce_scalar(stimulus_names, f'expected stimulus_names to be a collection (list-like), but found {type(stimulus_names)}: {stimulus_names}') + filtered_presentations = self.stimulus_presentations[self.stimulus_presentations['stimulus_name'].isin(stimulus_names)] + filtered_ids = set(filtered_presentations.index.values) + + return self.inter_presentation_intervals[ + (self.inter_presentation_intervals.index.isin(filtered_ids, level='from_presentation_id')) + & (self.inter_presentation_intervals.index.isin(filtered_ids, level='to_presentation_id')) + ] + + def get_stimulus_table(self, stimulus_names=None, include_detailed_parameters=False, include_unused_parameters=False): + '''Get a subset of stimulus presentations by name, with irrelevant parameters filtered off + + Parameters + ---------- + stimulus_names : array-like of str + The names of stimuli to include in the output. + + Returns + ------- + pd.DataFrame : + Rows are filtered presentations, columns are the relevant subset of stimulus parameters + + ''' + + if stimulus_names is None: + stimulus_names = self.stimulus_names + + stimulus_names = coerce_scalar(stimulus_names, f'expected stimulus_names to be a collection (list-like), but found {type(stimulus_names)}: {stimulus_names}') + presentations = self._stimulus_presentations[self._stimulus_presentations['stimulus_name'].isin(stimulus_names)] + + if not include_detailed_parameters: + presentations = self.__class__._remove_detailed_stimulus_parameters(presentations) + + if not include_unused_parameters: + presentations = removed_unused_stimulus_presentation_columns(presentations) + + return presentations + + def get_stimulus_epochs(self, duration_thresholds=None): + """ Reports continuous periods of time during which a single kind of stimulus was presented +flipVert + Parameters + --------- + duration_thresholds : dict, optional + keys are stimulus names, values are floating point durations in seconds. All epochs with + - a given stimulus name + - a duration shorter than the associated threshold + will be removed from the results + + """ + + if duration_thresholds is None: + duration_thresholds = {"spontaneous_activity": 90.0} + + presentations = self.stimulus_presentations.copy() + diff_indices = nan_intervals(presentations["stimulus_block"].values) + + epochs = [] + for left, right in zip(diff_indices[:-1], diff_indices[1:]): + epochs.append({ + "start_time": presentations.iloc[left]["start_time"], + "stop_time": presentations.iloc[right - 1]["stop_time"], + "stimulus_name": presentations.iloc[left]["stimulus_name"], + "stimulus_block": presentations.iloc[left]["stimulus_block"] + }) + epochs = pd.DataFrame(epochs) + epochs["duration"] = epochs["stop_time"] - epochs["start_time"] + + for key, threshold in duration_thresholds.items(): + epochs = epochs[ + (epochs["stimulus_name"] != key) + | (epochs["duration"] >= threshold) + ] + + return epochs.loc[:, ["start_time", "stop_time", "duration", "stimulus_name", "stimulus_block"]] + + def get_invalid_times(self): + """ Report invalid time intervals with tags describing the scope of invalid data + + The tags format: [scope,scope_id,label] + + scope: + 'EcephysSession': data is invalid across session + 'EcephysProbe': data is invalid for a single probe + label: + 'all_probes': gain fluctuations on the Neuropixels probe result in missed spikes and LFP saturation events + 'stimulus' : very long frames (>3x the normal frame length) make any stimulus-locked analysis invalid + 'probe#': probe # stopped sending data during this interval (spikes and LFP samples will be missing) + 'optotagging': missing optotagging data + + Returns + ------- + pd.DataFrame : + Rows are invalid intervals, columns are 'start_time' (s), 'stop_time' (s), 'tags' + """ + + return self.invalid_times + + def get_screen_gaze_data(self, include_filtered_data=False) -> Optional[pd.DataFrame]: + """Return a dataframe with estimated gaze position on screen. + + Parameters + ---------- + include_filtered_data : bool, optional + Whether to include filtered version of data (where filtered + values are replaced by NaN), by default False. + + Returns + ------- + pd.DataFrame + Contains columns for estimated gaze position: + *_eye_area + *_pupil_area + *_screen_coordinates_x_cm + *_screen_coordinates_y_cm + *_screen_coordinates_spherical_x_deg + *_screen_coorindates_spherical_y_deg + """ + return self.api.get_screen_gaze_data(include_filtered_data=include_filtered_data) + + def get_pupil_data(self) -> Optional[pd.DataFrame]: + """Return a dataframe with eye tracking ellipse fit data + + + Returns + ------- + pd.DataFrame + Contains eye, pupil and corneal reflection (cr) ellipse fits: + *_center_x + *_center_y + *_height + *_width + *_phi + """ + return self.api.get_pupil_data() + + def _mask_invalid_stimulus_presentations(self, stimulus_presentations): + """Mask invalid stimulus presentations + + Find stimulus presentations overlapping with invalid times + Mask stimulus names with "invalid_presentation", keep "start_time" and "stop_time", mask remaining data with np.nan + + Parameters + ---------- + stimulus_presentations : pd.DataFrame + table including all stimulus presentations + + Returns + ------- + pd.DataFrame : + table with masked invalid presentations + + """ + + fail_tags = ["stimulus"] + invalid_times = self._filter_invalid_times_by_tags(fail_tags) + + for ix_sp, sp in stimulus_presentations.iterrows(): + stim_epoch = sp['start_time'], sp['stop_time'] + + for ix_it, it in invalid_times.iterrows(): + invalid_interval = it['start_time'], it['stop_time'] + if _overlap(stim_epoch, invalid_interval): + stimulus_presentations.iloc[ix_sp, :] = np.nan + stimulus_presentations.at[ix_sp, "stimulus_name"] = "invalid_presentation" + stimulus_presentations.at[ix_sp, "start_time"] = stim_epoch[0] + stimulus_presentations.at[ix_sp, "stop_time"] = stim_epoch[1] + + return stimulus_presentations + + def presentationwise_spike_counts( + self, + bin_edges, + stimulus_presentation_ids, + unit_ids, + binarize=False, + dtype=None, + large_bin_size_threshold=0.001, + time_domain_callback=None + ): + ''' Build an array of spike counts surrounding stimulus onset per unit and stimulus frame. + + Parameters + --------- + bin_edges : numpy.ndarray + Spikes will be counted into the bins defined by these edges. Values are in seconds, relative + to stimulus onset. + stimulus_presentation_ids : array-like + Filter to these stimulus presentations + unit_ids : array-like + Filter to these units + binarize : bool, optional + If true, all counts greater than 0 will be treated as 1. This results in lower storage overhead, + but is only reasonable if bin sizes are fine (<= 1 millisecond). + large_bin_size_threshold : float, optional + If binarize is True and the largest bin width is greater than this value, a warning will be emitted. + time_domain_callback : callable, optional + The time domain is a numpy array whose values are trial-aligned bin + edges (each row is aligned to a different trial). This optional function will be + applied to the time domain before counting spikes. + + Returns + ------- + xarray.DataArray : + Data array whose dimensions are stimulus presentation, unit, + and time bin and whose values are spike counts. + + ''' + + stimulus_presentations = self._filter_owned_df('stimulus_presentations', ids=stimulus_presentation_ids) + units = self._filter_owned_df('units', ids=unit_ids) + + largest_bin_size = np.amax(np.diff(bin_edges)) + if binarize and largest_bin_size > large_bin_size_threshold: + warnings.warn( + f'You\'ve elected to binarize spike counts, but your maximum bin width is {largest_bin_size:2.5f} seconds. ' + 'Binarizing spike counts with such a large bin width can cause significant loss of accuracy! ' + f'Please consider only binarizing spike counts when your bins are <= {large_bin_size_threshold} seconds wide.' + ) + + bin_edges = np.array(bin_edges) + domain = build_time_window_domain(bin_edges, stimulus_presentations['start_time'].values, callback=time_domain_callback) + + out_of_order = np.where(np.diff(domain, axis=1) < 0) + if len(out_of_order[0]) > 0: + out_of_order_time_bins = [(row, col) for row, col in zip(out_of_order)] + raise ValueError(f"The time domain specified contains out-of-order bin edges at indices: {out_of_order_time_bins}") + + ends = domain[:, -1] + starts = domain[:, 0] + time_diffs = starts[1:] - ends[:-1] + overlapping = np.where(time_diffs < 0)[0] + + if len(overlapping) > 0: + # Ignoring intervals that overlaps multiple time bins because trying to figure that out would take O(n) + overlapping = [(s, s + 1) for s in overlapping] + warnings.warn(f"You've specified some overlapping time intervals between neighboring rows: {overlapping}, " + f"with a maximum overlap of {np.abs(np.min(time_diffs))} seconds.") + + tiled_data = build_spike_histogram( + domain, self.spike_times, units.index.values, dtype=dtype, binarize=binarize + ) + + tiled_data = xr.DataArray( + name='spike_counts', + data=tiled_data, + coords={ + 'stimulus_presentation_id': stimulus_presentations.index.values, + 'time_relative_to_stimulus_onset': bin_edges[:-1] + np.diff(bin_edges) / 2, + 'unit_id': units.index.values + }, + dims=['stimulus_presentation_id', 'time_relative_to_stimulus_onset', 'unit_id'] + ) + + return tiled_data + + def presentationwise_spike_times(self, stimulus_presentation_ids=None, unit_ids=None): + ''' Produce a table associating spike times with units and stimulus presentations + + Parameters + ---------- + stimulus_presentation_ids : array-like + Filter to these stimulus presentations + unit_ids : array-like + Filter to these units + + Returns + ------- + pandas.DataFrame : + Index is + spike_time : float + On the session's master clock. + Columns are + stimulus_presentation_id : int + The stimulus presentation on which this spike occurred. + unit_id : int + The unit that emitted this spike. + ''' + + stimulus_presentations = self._filter_owned_df('stimulus_presentations', ids=stimulus_presentation_ids) + units = self._filter_owned_df('units', ids=unit_ids) + + presentation_times = np.zeros([stimulus_presentations.shape[0] * 2]) + presentation_times[::2] = np.array(stimulus_presentations['start_time']) + presentation_times[1::2] = np.array(stimulus_presentations['stop_time']) + all_presentation_ids = np.array(stimulus_presentations.index.values) + + presentation_ids = [] + unit_ids = [] + spike_times = [] + + for ii, unit_id in enumerate(units.index.values): + data = self.spike_times[unit_id] + indices = np.searchsorted(presentation_times, data) - 1 + + index_valid = indices % 2 == 0 + presentations = all_presentation_ids[np.floor(indices / 2).astype(int)] + + sorder = np.argsort(presentations) + presentations = presentations[sorder] + index_valid = index_valid[sorder] + data = data[sorder] + + changes = np.where(np.ediff1d(presentations, to_begin=1, to_end=1))[0] + for ii, jj in zip(changes[:-1], changes[1:]): + values = data[ii:jj][index_valid[ii:jj]] + if values.size == 0: + continue + + unit_ids.append(np.zeros([values.size]) + unit_id) + presentation_ids.append(np.zeros([values.size]) + presentations[ii]) + spike_times.append(values) + + if not spike_times: + # If there are no units firing during the given stimulus return an empty dataframe + return pd.DataFrame(columns=['spike_times', 'stimulus_presentation', + 'unit_id', 'time_since_stimulus_presentation_onset']) + + spike_df = pd.DataFrame({ + 'stimulus_presentation_id': np.concatenate(presentation_ids).astype(int), + 'unit_id': np.concatenate(unit_ids).astype(int) + }, index=pd.Index(np.concatenate(spike_times), name='spike_time')) + + # Add time since stimulus presentation onset + onset_times = self._filter_owned_df( + "stimulus_presentations", ids=all_presentation_ids)["start_time"] + spikes_with_onset = spike_df.join(onset_times, + on=["stimulus_presentation_id"]) + spikes_with_onset["time_since_stimulus_presentation_onset"] = ( + spikes_with_onset.index - spikes_with_onset["start_time"] + ) + spikes_with_onset.sort_values('spike_time', axis=0, inplace=True) + spikes_with_onset.drop(columns=["start_time"], inplace=True) + return spikes_with_onset + + def conditionwise_spike_statistics(self, stimulus_presentation_ids=None, unit_ids=None, use_rates=False): + """ Produce summary statistics for each distinct stimulus condition + + Parameters + ---------- + stimulus_presentation_ids : array-like + identifies stimulus presentations from which spikes will be considered + unit_ids : array-like + identifies units whose spikes will be considered + use_rates : bool, optional + If True, use firing rates. If False, use spike counts. + + Returns + ------- + pd.DataFrame : + Rows are indexed by unit id and stimulus condition id. Values are summary statistics describing spikes + emitted by a specific unit across presentations within a specific condition. + + """ + # TODO: Need to return an empty df if no matching unit-ids or presentation-ids are found + # TODO: To use filter_owned_df() make sure to convert the results from a Series to a Dataframe + stimulus_presentation_ids = (stimulus_presentation_ids if stimulus_presentation_ids is not None + else self.stimulus_presentations.index.values) # In case + presentations = self.stimulus_presentations.loc[stimulus_presentation_ids, ["stimulus_condition_id", "duration"]] + + spikes = self.presentationwise_spike_times( + stimulus_presentation_ids=stimulus_presentation_ids, unit_ids=unit_ids + ) + + if spikes.empty: + # In the case there are no spikes + spike_counts = pd.DataFrame({'spike_count': 0}, + index=pd.MultiIndex.from_product([stimulus_presentation_ids, unit_ids], + names=['stimulus_presentation_id', 'unit_id'])) + + else: + spike_counts = spikes.copy() + spike_counts["spike_count"] = np.zeros(spike_counts.shape[0]) + spike_counts = spike_counts.groupby(["stimulus_presentation_id", "unit_id"]).count() + unit_ids = unit_ids if unit_ids is not None else spikes['unit_id'].unique() # If not explicity stated get unit ids from spikes table. + spike_counts = spike_counts.reindex(pd.MultiIndex.from_product([stimulus_presentation_ids, + unit_ids], + names=['stimulus_presentation_id', + 'unit_id']), fill_value=0) + + sp = pd.merge(spike_counts, presentations, left_on="stimulus_presentation_id", right_index=True, how="left") + sp.reset_index(inplace=True) + + if use_rates: + sp["spike_rate"] = sp["spike_count"] / sp["duration"] + sp.drop(columns=["spike_count"], inplace=True) + extractor = _extract_summary_rate_statistics + else: + sp.drop(columns=["duration"]) + extractor = _extract_summary_count_statistics + + summary = [] + for ind, gr in sp.groupby(["stimulus_condition_id", "unit_id"]): + summary.append(extractor(ind, gr)) + + return pd.DataFrame(summary).set_index(keys=["unit_id", "stimulus_condition_id"]) + + def get_parameter_values_for_stimulus(self, stimulus_name, drop_nulls=True): + """ For each stimulus parameter, report the unique values taken on by that + parameter while a named stimulus was presented. + + Parameters + ---------- + stimulus_name : str + filter to presentations of this stimulus + + Returns + ------- + dict : + maps parameters (column names) to their unique values. + + """ + + presentation_ids = self.get_stimulus_table([stimulus_name]).index.values + return self.get_stimulus_parameter_values(presentation_ids, drop_nulls=drop_nulls) + + def get_stimulus_parameter_values(self, stimulus_presentation_ids=None, drop_nulls=True): + ''' For each stimulus parameter, report the unique values taken on by that + parameter throughout the course of the session. + + Parameters + ---------- + stimulus_presentation_ids : array-like, optional + If provided, only parameter values from these stimulus presentations will be considered. + + Returns + ------- + dict : + maps parameters (column names) to their unique values. + + ''' + + stimulus_presentations = self._filter_owned_df('stimulus_presentations', ids=stimulus_presentation_ids) + stimulus_presentations = stimulus_presentations.drop(columns=list(NON_STIMULUS_PARAMETERS) + ['stimulus_name']) + stimulus_presentations = removed_unused_stimulus_presentation_columns(stimulus_presentations) + + parameters = {} + for colname in stimulus_presentations.columns: + uniques = stimulus_presentations[colname].unique() + + non_null = np.array(uniques[uniques != "null"]) + non_null = non_null + non_null = np.sort(non_null) + + if not drop_nulls and "null" in uniques: + non_null = np.concatenate([non_null, ["null"]]) + + parameters[colname] = non_null + + return parameters + + def channel_structure_intervals(self, channel_ids): + + """ find on a list of channels the intervals of channels inserted into particular structures + + Parameters + ---------- + channel_ids : list + A list of channel ids + structure_id_key : str + use this column for numerically identifying structures + structure_label_key : str + use this column for human-readable structure identification + + Returns + ------- + labels : np.ndarray + for each detected interval, the label associated with that interval + intervals : np.ndarray + one element longer than labels. Start and end indices for intervals. + + """ + structure_id_key = "ecephys_structure_id" + structure_label_key = "ecephys_structure_acronym" + np.array(channel_ids).sort() + table = self.channels.loc[channel_ids] + + unique_probes = table["probe_id"].unique() + if len(unique_probes) > 1: + warnings.warn("Calculating structure boundaries across channels from multiple probes.") + + intervals = nan_intervals(table[structure_id_key].values) + labels = table[structure_label_key].iloc[intervals[:-1]].values + + return labels, intervals + + def _build_spike_times(self, spike_times): + retained_units = set(self._units.index.values) + output_spike_times = {} + + for unit_id in list(spike_times.keys()): + data = spike_times.pop(unit_id) + if unit_id not in retained_units: + continue + output_spike_times[unit_id] = data + + return output_spike_times + + def _build_stimulus_presentations(self, stimulus_presentations, nonapplicable="null"): + stimulus_presentations.index.name = 'stimulus_presentation_id' + stimulus_presentations = stimulus_presentations.drop(columns=['stimulus_index']) + + # TODO: putting these here for now; after SWDB 2019, will rerun stimulus table module for all sessions + # and can remove these + stimulus_presentations = naming_utilities.collapse_columns(stimulus_presentations) + stimulus_presentations = naming_utilities.standardize_movie_numbers(stimulus_presentations) + stimulus_presentations = naming_utilities.add_number_to_shuffled_movie(stimulus_presentations) + stimulus_presentations = naming_utilities.map_stimulus_names( + stimulus_presentations, default_stimulus_renames + ) + stimulus_presentations = naming_utilities.map_column_names(stimulus_presentations, default_column_renames) + + # pandas groupby ops ignore nans, so we need a new "nonapplicable" value that pandas does not recognize as null ... + stimulus_presentations.replace("", nonapplicable, inplace=True) + stimulus_presentations.fillna(nonapplicable, inplace=True) + + stimulus_presentations['duration'] = stimulus_presentations['stop_time'] - stimulus_presentations['start_time'] + + # TODO: database these + stimulus_conditions = {} + presentation_conditions = [] + cid_counter = -1 + + # TODO: Can we have parameters on what columns to omit? If stimulus_block or duration is left in it can affect + # how conditionwise_spike_statistics counts spikes + params_only = stimulus_presentations.drop(columns=["start_time", "stop_time", "duration", "stimulus_block"]) + for row in params_only.itertuples(index=False): + + if row in stimulus_conditions: + cid = stimulus_conditions[row] + else: + cid_counter += 1 + stimulus_conditions[row] = cid_counter + cid = cid_counter + + presentation_conditions.append(cid) + + cond_ids = [] + cond_vals = [] + + for cv, ci in stimulus_conditions.items(): + cond_ids.append(ci) + cond_vals.append(cv) + + self._stimulus_conditions = pd.DataFrame(cond_vals, index=pd.Index(data=cond_ids, name="stimulus_condition_id")) + stimulus_presentations["stimulus_condition_id"] = presentation_conditions + + return stimulus_presentations + + def _build_units_table(self, units_table): + channels = self.channels.copy() + probes = self.probes.copy() + + self._unmerged_units = units_table.copy() + table = pd.merge(units_table, channels, left_on='peak_channel_id', right_index=True, suffixes=['_unit', '_channel']) + table = pd.merge(table, probes, left_on='probe_id', right_index=True, suffixes=['_unit', '_probe']) + + table.index.name = 'unit_id' + table = table.rename(columns={ + 'description': 'probe_description', + 'local_index_channel': 'channel_local_index', + 'PT_ratio': 'waveform_PT_ratio', + 'amplitude': 'waveform_amplitude', + 'duration': 'waveform_duration', + 'halfwidth': 'waveform_halfwidth', + 'recovery_slope': 'waveform_recovery_slope', + 'repolarization_slope': 'waveform_repolarization_slope', + 'spread': 'waveform_spread', + 'velocity_above': 'waveform_velocity_above', + 'velocity_below': 'waveform_velocity_below', + 'sampling_rate': 'probe_sampling_rate', + 'lfp_sampling_rate': 'probe_lfp_sampling_rate', + 'has_lfp_data': 'probe_has_lfp_data', + 'l_ratio': 'L_ratio', + 'pref_images_multi_ns': 'pref_image_multi_ns', + }) + + return table.sort_values(by=['probe_description', 'probe_vertical_position', 'probe_horizontal_position']) + + def _build_nwb1_waveforms(self, mean_waveforms): + # _build_mean_waveforms() assumes every unit has the same number of waveforms and that a unit-waveform exists + # for all channels. This is not true for NWB 1 files where each unit has ONE waveform on ONE channel + units_df = self._units + output_waveforms = {} + sampling_rate_lu = {uid: self.probes.loc[r['probe_id']]['sampling_rate'] for uid, r in units_df.iterrows()} + + for uid in list(mean_waveforms.keys()): + data = mean_waveforms.pop(uid) + output_waveforms[uid] = xr.DataArray( + data=data, + dims=['channel_id', 'time'], + coords={ + 'channel_id': [units_df.loc[uid]['peak_channel_id']], + 'time': np.arange(data.shape[1]) / sampling_rate_lu[uid] + } + ) + + return output_waveforms + + def _build_mean_waveforms(self, mean_waveforms): + if isinstance(self.api, EcephysNwb1Api): + return self._build_nwb1_waveforms(mean_waveforms) + + channel_id_lut = defaultdict(lambda: -1) + for cid, row in self.channels.iterrows(): + channel_id_lut[(row["local_index"], row["probe_id"])] = cid + + probe_id_lut = {uid: row['probe_id'] for uid, row in self._units.iterrows()} + + output_waveforms = {} + for uid in list(mean_waveforms.keys()): + data = mean_waveforms.pop(uid) + + if uid not in probe_id_lut: # It's been filtered out during unit table generation! + continue + + probe_id = probe_id_lut[uid] + output_waveforms[uid] = xr.DataArray( + data=data, + dims=['channel_id', 'time'], + coords={ + 'channel_id': [channel_id_lut[(ii, probe_id)] for ii in range(data.shape[0])], + 'time': np.arange(data.shape[1]) / self.probes.loc[probe_id]['sampling_rate'] + } + ) + output_waveforms[uid] = output_waveforms[uid][output_waveforms[uid]["channel_id"] != -1] + + return output_waveforms + + def _build_inter_presentation_intervals(self): + intervals = pd.DataFrame({ + 'from_presentation_id': self.stimulus_presentations.index.values[:-1], + 'to_presentation_id': self.stimulus_presentations.index.values[1:], + 'interval': self.stimulus_presentations['start_time'].values[1:] - self.stimulus_presentations['stop_time'].values[:-1] + }) + return intervals.set_index(['from_presentation_id', 'to_presentation_id'], inplace=False) + + def _filter_owned_df(self, key, ids=None, copy=True): + df = getattr(self, key) + + if copy: + df = df.copy() + + if ids is None: + return df + + ids = coerce_scalar(ids, f'a scalar ({ids}) was provided as ids, filtering to a single row of {key}.') + + df = df.loc[ids] + + if df.shape[0] == 0: + warnings.warn(f'filtering to an empty set of {key}!') + + return df + + @classmethod + def _remove_detailed_stimulus_parameters(cls, presentations): + columns = list(cls.DETAILED_STIMULUS_PARAMETERS) + return presentations.drop(columns=columns, errors="ignore") + + @classmethod + def from_nwb_path(cls, path, nwb_version=2, api_kwargs=None, **kwargs): + api_kwargs = {} if api_kwargs is None else api_kwargs + # TODO: Is there a way for pynwb to check the file before actually loading it with io read? If so we could + # automatically check what NWB version is being inputed + + nwb_version = int(nwb_version) # only use major version + if nwb_version >= 2: + NWBAdaptorCls = EcephysNwbSessionApi + + elif nwb_version == 1: + NWBAdaptorCls = EcephysNwb1Api + + else: + raise Exception(f'specified NWB version {nwb_version} not supported. Supported versions are: 2.X, 1.X') + + return cls(api=NWBAdaptorCls.from_path(path=path, **api_kwargs), **kwargs) + + def _warn_invalid_spike_intervals(self): + + fail_tags = list(self.probes["description"]) + fail_tags.append("all_probes") + invalid_time_intervals = self._filter_invalid_times_by_tags(fail_tags) + + if not invalid_time_intervals.empty: + warnings.warn("Session includes invalid time intervals that could be accessed with the attribute 'invalid_times'," + "Spikes within these intervals are invalid and may need to be excluded from the analysis.") + + +def build_spike_histogram(time_domain, spike_times, unit_ids, dtype=None, binarize=False): + + time_domain = np.array(time_domain) + unit_ids = np.array(unit_ids) + + tiled_data = np.zeros( + (time_domain.shape[0], time_domain.shape[1] - 1, unit_ids.size), + dtype=(np.uint8 if binarize else np.uint16) if dtype is None else dtype + ) + + starts = time_domain[:, :-1] + ends = time_domain[:, 1:] + + for ii, unit_id in enumerate(unit_ids): + data = np.array(spike_times[unit_id]) + + start_positions = np.searchsorted(data, starts.flat) + end_positions = np.searchsorted(data, ends.flat, side="right") + counts = (end_positions - start_positions) + + tiled_data[:, :, ii].flat = counts > 0 if binarize else counts + + return tiled_data + + +def build_time_window_domain(bin_edges, offsets, callback=None): + callback = (lambda x: x) if callback is None else callback + domain = np.tile(bin_edges[None, :], (len(offsets), 1)) + domain += offsets[:, None] + return callback(domain) + + +def removed_unused_stimulus_presentation_columns(stimulus_presentations): + to_drop = [] + for cn in stimulus_presentations.columns: + if np.all(stimulus_presentations[cn].isna()): + to_drop.append(cn) + elif np.all(stimulus_presentations[cn].astype(str).values == ''): + to_drop.append(cn) + elif np.all(stimulus_presentations[cn].astype(str).values == 'null'): + to_drop.append(cn) + return stimulus_presentations.drop(columns=to_drop) + + +def nan_intervals(array, nan_like=["null"]): + """ find interval bounds (bounding consecutive identical values) in an array, which may contain nans + + Parameters + ----------- + array : np.ndarray + + Returns + ------- + np.ndarray : + start and end indices of detected intervals (one longer than the number of intervals) + + """ + + intervals = [0] + current = array[0] + for ii, item in enumerate(array[1:]): + if is_distinct_from(item, current): + intervals.append(ii + 1) + current = item + intervals.append(len(array)) + + return np.unique(intervals) + + +def is_distinct_from(left, right): + if type(left) != type(right): + return True + if pd.isna(left) and pd.isna(right): + return False + if left is None and right is None: + return False + + return left != right + + +def array_intervals(array): + """ find interval bounds (bounding consecutive identical values) in an array + + Parameters + ----------- + array : np.ndarray + + Returns + ------- + np.ndarray : + start and end indices of detected intervals (one longer than the number of intervals) + + """ + + changes = np.flatnonzero(np.diff(array)) + 1 + return np.concatenate([[0], changes, [len(array)]]) + + +def coerce_scalar(value, message, warn=False): + if not isinstance(value, Collection) or isinstance(value, str): + if warn: + warnings.warn(message) + return [value] + return value + + +def _extract_summary_count_statistics(index, group): + return { + "stimulus_condition_id": index[0], + "unit_id": index[1], + "spike_count": group["spike_count"].sum(), + "stimulus_presentation_count": group.shape[0], + "spike_mean": np.mean(group["spike_count"].values), + "spike_std": np.std(group["spike_count"].values, ddof=1), + "spike_sem": scipy.stats.sem(group["spike_count"].values) + } + + +def _extract_summary_rate_statistics(index, group): + return { + "stimulus_condition_id": index[0], + "unit_id": index[1], + "stimulus_presentation_count": group.shape[0], + "spike_mean": np.mean(group["spike_rate"].values), + "spike_std": np.std(group["spike_rate"].values, ddof=1), + "spike_sem": scipy.stats.sem(group["spike_rate"].values) + } + + +def _overlap(a, b): + """Check if the two intervals overlap + + Parameters + ---------- + a : tuple + start, stop times + b : tuple + start, stop times + Returns + ------- + bool : True if overlap, otherwise False + """ + return max(a[0], b[0]) <= min(a[1], b[1]) diff --git a/brain_observatory/ecephys/ecephys_session_api/__init__.py b/brain_observatory/ecephys/ecephys_session_api/__init__.py new file mode 100644 index 0000000000..fcfc68ab3f --- /dev/null +++ b/brain_observatory/ecephys/ecephys_session_api/__init__.py @@ -0,0 +1,3 @@ +from .ecephys_session_api import EcephysSessionApi +from .ecephys_nwb_session_api import EcephysNwbSessionApi +from .ecephys_nwb1_session_api import EcephysNwb1Api \ No newline at end of file diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7139e883d9f1af436fb9cbc92a55cfebf1d3431c GIT binary patch literal 414 zcmY*VO-lnY5Z&yDh_r$z=udDDb}8OO#46sTm*Qm!gk%$JXf_F(waXqo`8%X1|5C4> z{0p9(v|a2DWaj0)nc*c5!{Jc?p;zzp6Y96WbP)o$hvP0G@qi;0lqg5Y<4}cVlt&vJ zsklt?1aLeH(&Pt0dy3X4Pld4a*3E=-(&&kmK%VW$X~TN_@jpL?&S`p(pNj1~aoYui zT3LBd`FW@4hV|6Qs~3CfxF^RTe+5+nWs`nC9&hlA6P3esPWgz@hUykiG%bwg^coAj zbl6y-T>;tn*WhQ#u#>g8vb0#xR{^t1K?h%CtfEpA!(ii*)~0H+ot3WcyU7TVTGoV& WY`Z?ZEe(HD;?Dn_^F9Y?fc^mS6MrQD literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb1_session_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb1_session_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..434432b9245c8ccf6d6b1207097c1039c45dd91d GIT binary patch literal 9717 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 wK6Xo0r<L9la*?JvO$j+g zdBgKW-1j{GI{-Op^tu-Siy#pPQk4i0$H*U2GGX^Wq2f;{ArmbL>*gj<8cP&>f4o|T zIh5PfNLX8rDY-|<4ifw$Vt`lK!yw&=h1{d+i527=9Z{Y|Lhz3N24v3zY@F&?9m}@t zmU8gR)Hdf{o|~V0b*a77ntN`p*0p$SZ!WLHJtoLYI|Qhrm);4V!>u94GTKur;5@BH z!PguXU($b)68F^c%fvr#B(u+@@^3rKkNs`u=xYZ_7MJlVzfa;lopjLLzNY@D@jCG> Rb4Q0^6@x2?Xvds8{r~DTupj^c literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb_session_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb_session_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60cf71c59617d7e13f994a3ec5f22c04c036dff0 GIT binary patch literal 14887 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_session_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_session_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdbd379f584a39bb50e40b218b2ed1ee6be379e0 GIT binary patch literal 3770 zcmb_fOK;mo5avry%eMS}#_u{&5<5VP0!14bag#VGP&h!0TnGW%wRSBtrk3n3<wUu) z@h|8(x1Rc!c<sr5p_g`MY00!r0YO0$9PSKfcD|ii4u?OEj#dpg#Gk*>y^>-4jZFWr zVekwt^#%wtnCTlG(=|JmYnjMfzTL51TaRtuaSI@`{i0ja_p)1I4lDT8&WJl=8m|mi zWTgv(l|ET+joC*=qkIYT8VxIUUU;o2F24>VFA&skm~olWh(}(BA6_B~kksCEh44iC zDCC^A(6E0vFn9)+`o%O1Zn!2hT<a~sb#3mnjZdaq;0`Y`>nXrv&V}KYc$pPGn;MYg zR(Mr&WmdUx+!0>WT$POgH_FG}jcdNfMuD#n_%SvP{KSB-vkBlQ2mB<P0)C25^BF$- zZtlcdF!VgrYzE}>cjU8d4&)01`+2qi{34&xR*P&2xFwit`Q1IX{Mlmn*a}Ei2KuXP z4fxeN^RBZEkgxG|zHx<MlWl=ylkI>ER(B=cX7?`&?$!<21J(e|uh>KO2%@&l9z)W0 z<B69o9-j8p5myTGwI6zy|H2Vh2vL3zDMDJ12z_AgaQqrBg?VBIOkp1WWi;&AQQSX? z9V*)@E}p%|yTr|?$v=NQ|GxQFajBa0l(OAp`ksnjb6?O_AQ=6o$;G*91|b)!1vEfF z&7ZyFrt%`b6VlchZF8{oeb8WMPmU$^1PP8|#&a44viF21tLWc}N|r-t=w-=v!(Ln_ z#1mdb$ONv(0%DjS7w?2)x331<wkUbjm0}PPj0RrM;ZkKFk?}ihSREBmpE?YppE{w> zJ6uGZy_7PL4O5PQ;&p7~7_hMuaTQJDG*>`o?*c)UFLW(&O+#GGws|y&kBX>_2)>(h zDd!LFI?p!B0nP-@ER%9T6xM^q6q3zsBscVP0I{f-2Vv;?T}4946=aNJ0aN!<XdY*y zQJIE0z|yht#5wgnrjw-BQfP+6=7xR_AgUOfPzJ|bZKk|0XU8H@%)xC9-L_7t5ZqVW zDaR|>j{B-PxSmAU9Zm&#PtW;DAUmp&0<e`0;HE(iFvj(!481d+<o<CA!+JIbb*-HP zfC>WWLXA{UQm&V>U2DA@oa*w#lX5;NQy%*|g<wc|x@!d8NLg=4;xSo=8Ctr!!T|5X zD|b>pt)x<80k~bROBfmdB>Wbh^(*#5c3eO!ho~%}!yt@;HW$!JwMbHPbcy;d1!5-~ z#1P9IfK6X-QVO3sFX}R`en=tO&PJ5%)N7L*pwtnH^xE+1Mig33x|f2nkqslQe(*nb zhdbkmmJe$tC!Qa1$r(Y<xA#jDrIzGekT(6uwbFhH-moa$GRYxIV;H5d8+yJ5@gfCc zEjvcn$~m~#Wxb!ES1IR1%6eb*uwfoF?qky?XonLLR|)9^tn1^rM#!&S>L*X!YQOmt zG%iG4=)YtI9L3{=z}F<W`mPfq$5HAW2Z1jqVJNYul~YKHNU$A?t&q8u7m(5e34Y}a zKA1&<{gRwVg0&>JJrTv02;CAiv{KTZT)=18%g7}p%cy02kjZTOT4e<vtRh)Mf(>@; zF!+6v>&R~)!EdhILNaKllM(if68`cG>?hSjAXUq;>Q>nv(`VgI&Ut$tMq~CQ(0QP< z_Oz|-8l!PB>V@zdrk9}I>lnBN(d~pixdU^$#gM{^lzgO_56Rkgkr}<wg(WdVJXt{F X^3x<+dsuZ<4M^RrS!EMWt7iWP?iyq^ literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py b/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py new file mode 100644 index 0000000000..dfde475749 --- /dev/null +++ b/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py @@ -0,0 +1,298 @@ +from typing import Dict +import pandas as pd +import numpy as np +import h5py +import collections +import warnings + +# from allensdk.brain_observatory.nwb.nwb_api import NwbApi +from .ecephys_session_api import EcephysSessionApi +from allensdk.brain_observatory.running_speed import RunningSpeed + + +class IDCreator(object): + def __init__(self, init_id=0): + self._c_id = init_id + self._map = {} + + def get_id(self, key): + if key in self._map: + return self._map[key] + else: + id_val = self._c_id + self._c_id += 1 + self._map[key] = id_val + return id_val + + def __getitem__(self, key): + return self.get_id(key) + + def __contains__(self, key): + return isinstance(key, collections.Hashable) + + +class EcephysNwb1Api(EcephysSessionApi): + """An EcephySession adaptor for reading NWB1.0 files. + + Was created by sight using an assortment of existing NWB1 files. It is possible that parts of the NWB1 standard (?!) + is missing or not properly implemented. + + NWB1 vs NWB2 issues: + * In NWB 1 there is no difference between global unit-ids and probe's local-index. A unit is unique to one channel + * Units are missing information about firing_rate, isi_violation, and quality. + - So that EcephysSession._build_units() actually return values I had to set quality=good for all units + * NWB Stimulus_presentations missing stimulus_block, stimulus_index and Image column + - To get EcephysSession.conditionwise_spikes() working had to make up a block number for every stimulus type + * NWB1 missing a 'valid_data' tag for channels. Had to set to True otherwise EcephysSession won't see any channels + * There were no 'channels' table/group in NWB1. Instead we had to iterate through all the units and pull out the + distinct channel info. + * In NWB2 each unit has a mean-waveform for every channel on the probe. In NWB1 A unit only has a single waveform + * The NWB1 identifier is a string + """ + + def __init__(self, path, *args, **kwargs): + self._path = path + self._h5_root = h5py.File(self._path, 'r') + try: + # check file is a valid NWB 1 file + version_str = self._h5_root['nwb_version'][()] + if not (version_str.startswith('NWB-1.') or version_str.startswith('1.')): + raise Exception('{} is not a valid NWB 1 file path'.format(self._path)) + except Exception: + raise + + # EcephysSession requires session wide ids for units/channels/etc but NWB 1 doesn't have such a thing (ids + # are relative to the probe). The following data-stuctures are used build and fetch session ids without having + # to parse all the tables. + self._unit_ids = IDCreator() + self._channel_ids = IDCreator() + self._probe_ids = IDCreator() + + + @property + def processing_grp(self): + return self._h5_root['/processing'] + + @property + def running_speed_grp(self): + return self._h5_root['/acquisition/timeseries/RunningSpeed'] + + def _probe_groups(self): + return [(pname, pgrp) for pname, pgrp in self.processing_grp.items() + if isinstance(pgrp, h5py.Group) and pname.lower().startswith('probe')] + + def get_running_speed(self): + running_speed_grp = self.running_speed_grp + + return pd.DataFrame({ + "start_time": running_speed_grp['timestamps'][:], + "velocity": running_speed_grp['data'][:] # average velocities over a given interval + }) + + __stim_col_map = { + # Used for mapping column names from NWB 1.0 features ds to their appropiate NWB 2.0 name + b'temporal_frequency': 'TF', + b'spatial_frequency': 'SF', + b'pos_x': 'Pos_x', + b'pos_y': 'Pos_y', + b'orientation': 'Ori', + b'color': 'Color', + b'phase': 'Phase', + b'frame': 'Image' + } + + def get_stimulus_presentations(self) -> pd.DataFrame: + # TODO: Missing 'stimulus_block', 'stimulus_index, Image, + stimulus_presentations_df = None + presentation_ids = 0 # make up a id for every stim-presentation + stim_pres_grp = self._h5_root['/stimulus/presentation'] + + # Stimulus-presentations are heirarchily grouped by presentation name. Iterate through all of them and build + # a single table. + for block_i, (stim_name, stim_grp) in enumerate(stim_pres_grp.items()): + timestamps = stim_grp['timestamps'][()] + start_times = timestamps[:, 0] + if timestamps.shape[1] == 2: + stop_times = timestamps[:, 1] + else: + # Some of the datasets have an optotagging stimulus with no stop time. + continue + stop_times = np.nan + + n_stims = stim_grp['num_samples'][()] + try: + # parse the features/data datasets, map old column names (temporal freq->TF, phase-> phase, etc). + stim_props = {self.__stim_col_map.get(ftr_name, ftr_name): stim_grp['data'][:, i] + for i, ftr_name in enumerate(stim_grp['features'][()])} + except Exception: + stim_props = {} + + stim_df = pd.DataFrame({ + 'stimulus_presentation_id': np.arange(presentation_ids, presentation_ids + n_stims), + 'start_time': start_times, + 'stop_time': stop_times, + 'stimulus_name': stim_name, + 'TF': stim_props.get('TF', np.nan), + 'SF': stim_props.get('SF', np.nan), + 'Ori': stim_props.get('Ori', np.nan), + 'Pos_x': stim_props.get('Pos_x', np.nan), + 'Pos_y': stim_props.get('Pos_y', np.nan), + 'Color': stim_props.get('Color', np.nan), + 'Phase': stim_props.get('Phase', np.nan), + 'Image': stim_props.get('Image', np.nan), + 'stimulus_block': block_i # Required by conditionwise_spike_counts(), add made-up number + }) + + presentation_ids += n_stims + if stimulus_presentations_df is None: + stimulus_presentations_df = stim_df + else: + stimulus_presentations_df = stimulus_presentations_df.append(stim_df) + + stimulus_presentations_df['stimulus_index'] = 0 # I'm not sure what column is, but is droped by EcephysSession + stimulus_presentations_df.set_index('stimulus_presentation_id', inplace=True) + return stimulus_presentations_df + + + def get_probes(self) -> pd.DataFrame: + probe_ids = [] + locations = [] + for prb_name, prb_grp in self._probe_groups(): + probe_ids.append(self._probe_ids[prb_name]) + locations.append(prb_name) + + probes_df = pd.DataFrame({ + 'id': pd.Series(probe_ids, dtype=np.uint64), + 'location': pd.Series(locations, dtype=object), + 'description': "" # TODO: Find description + }) + probes_df.set_index('id', inplace=True) + probes_df['sampling_rate'] = 30000.0 # TODO: calculate real sampling rate for each probe. + return probes_df + + + def get_channels(self) -> pd.DataFrame: + # TODO: Missing: manual_structure_id + processing_grp = self.processing_grp + + max_channels = sum(len(prb_grp['unit_list']) for prb_grp in processing_grp.values()) + channel_ids = np.zeros(max_channels, dtype=np.uint64) + local_channel_indices = np.zeros(max_channels, dtype=np.int64) + prb_ids = np.zeros(max_channels, dtype=np.uint64) + prb_hrz_pos = np.zeros(max_channels, dtype=np.int64) + prb_vert_pos = np.zeros(max_channels, dtype=np.int64) + struct_acronyms = np.empty(max_channels, dtype=object) + + channel_indx = 0 + existing_channels = set() + # In NWB 1.0 files I used I couldn't find a channel group/dataset. Instead we have to iterate through all units + # to get information about all available channels + for prb_name, prb_grp in self._probe_groups(): + prb_id = self._probe_ids[prb_name] + unit_list = prb_grp['unit_list'][()] + for indx, uid in enumerate(unit_list): + unit_grp = prb_grp['UnitTimes'][str(uid)] + local_channel_index = unit_grp['channel'][()] + channel_id = self._channel_ids[(prb_name, local_channel_index)] + if channel_id in existing_channels: + # If a channel has already been processed (ie it's shared by another unit) skip it. I'm assuming + # position/ccf info is the same for every probe/channel_id. + continue + else: + channel_ids[channel_indx] = channel_id + local_channel_indices[channel_indx] = local_channel_index + prb_ids[channel_indx] = prb_id + prb_hrz_pos[channel_indx] = unit_grp['xpos_probe'][()] + prb_vert_pos[channel_indx] = unit_grp['ypos_probe'][()] + try: + struct_acronyms[channel_indx] = str(unit_grp['ccf_structure'][()], encoding='ascii') + except TypeError: + struct_acronyms[channel_indx] = unit_grp['ccf_structure'][()] + + + existing_channels.add(channel_id) + channel_indx += 1 + + n_channels = len(existing_channels) + channels_df = pd.DataFrame({ + 'id': channel_ids[:n_channels], + 'local_index': local_channel_indices[:n_channels], + 'probe_id': prb_ids[:n_channels], + 'probe_horizontal_position': prb_hrz_pos[:n_channels], + 'probe_vertical_position': prb_vert_pos[:n_channels], + 'ecephys_structure_acronym': struct_acronyms[:n_channels], + 'valid_data': True # TODO: Pull out valid table column from NWB + }) + channels_df.set_index('id', inplace=True) + return channels_df + + def get_mean_waveforms(self) -> Dict[int, np.ndarray]: + waveforms = {} + for prb_name, prb_grp in self._probe_groups(): + # There is one waveform for any given spike, but still calling it "mean" wavefor + for indx, uid in enumerate(prb_grp['unit_list']): + unit_grp = prb_grp['UnitTimes'][str(uid)] + unit_id = self._unit_ids[(prb_name, uid)] + waveforms[unit_id] = np.array([unit_grp['waveform'][()],]) # EcephysSession is expecting an array of waveforms + + return waveforms + + def get_spike_times(self) -> Dict[int, np.ndarray]: + spike_times = {} + for prb_name, prb_grp in self._probe_groups(): + for indx, uid in enumerate(prb_grp['unit_list']): + unit_grp = prb_grp['UnitTimes'][str(uid)] + unit_id = self._unit_ids[(prb_name, uid)] + spike_times[unit_id] = unit_grp['times'][()] + + return spike_times + + def get_units(self) -> pd.DataFrame: + # TODO: Missing properties: firing_rate, isi_violations + unit_ids = np.zeros(0, dtype=np.uint64) + local_indices = np.zeros(0, dtype=np.int64) + peak_channel_ids = np.zeros(0, dtype=np.int64) + snrs = np.zeros(0, dtype=np.float64) + + for prb_name, prb_grp in self._probe_groups(): + # visit every /processing/probeN/UnitList/N/ group to build + # TODO: Since just visting the tree is so expensive, maybe build the channels and probes at the same time. + unit_list = prb_grp['unit_list'][()] + prb_uids = np.zeros(len(unit_list), dtype=np.uint64) + prb_channels = np.zeros(len(unit_list), dtype=np.int64) + prb_snr = np.zeros(len(unit_list), dtype=np.float64) + for indx, uid in enumerate(unit_list): + unit_grp = prb_grp['UnitTimes'][str(uid)] + prb_uids[indx] = self._unit_ids[(prb_name, uid)] + prb_channels[indx] = self._channel_ids[(prb_name, unit_grp['channel'][()])] + prb_snr[indx] = unit_grp['snr'][()] + + unit_ids = np.append(unit_ids, prb_uids) + local_indices = np.append(local_indices, unit_list) + peak_channel_ids = np.append(peak_channel_ids, prb_channels) + snrs = np.append(snrs, prb_snr) + + units_df = pd.DataFrame({ + 'unit_id': pd.Series(unit_ids, dtype=np.int64), + 'local_index': local_indices, + 'peak_channel_id': peak_channel_ids, + 'snr': snrs, + 'quality': "good" # TODO: NWB 1.0 is missing quality table, need to find an equivelent + }) + + units_df.set_index('unit_id', inplace=True) + return units_df + + def get_invalid_times(self) -> pd.DataFrame: + # ecephys nwb v1 files do not appear to contain any + # info on invalid_times + return pd.DataFrame() + + def get_ecephys_session_id(self) -> int: + # Doesn't look like the session_id is stored + return EcephysSessionApi.session_na + + @classmethod + def from_path(cls, path, **kwargs): + # TODO: Validate that file is proper NWB1 + return cls(path=path, **kwargs) diff --git a/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py b/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py new file mode 100644 index 0000000000..34a2f06f98 --- /dev/null +++ b/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py @@ -0,0 +1,421 @@ +from typing import Dict, Union, List, Optional, Callable +import re +import ast +import warnings + +import h5py +import pandas as pd +import numpy as np +import xarray as xr +import pynwb + +from .ecephys_session_api import EcephysSessionApi +from allensdk.brain_observatory.nwb.nwb_api import NwbApi +import allensdk.brain_observatory.ecephys.nwb # noqa Necessary to import pyNWB namespaces +from allensdk.brain_observatory.ecephys import get_unit_filter_value +from allensdk.brain_observatory.nwb import check_nwbfile_version + +color_triplet_re = re.compile(r"\[(-{0,1}\d*\.\d*,\s*)*(-{0,1}\d*\.\d*)\]") + +# TODO: If ecephys write_nwb is revisited, need to re-add `manual_structure_id` +# column and add the structure ids to the nwbfile for the +# add_ecephys_electrodes() function. +STRUCTURE_ACRONYM_ID_MAP = { + "grey": 8, "SCig": 10, "SCiw": 17, "IGL": 27, "LT": 66, "VL": 81, + "MRN": 128, "LD": 155, "LGd": 170, "LGv": 178, "APN": 215, "LP": 218, + "RT": 262, "MB": 313, "SGN": 325, "BMAa": 327, "CA": 375, "CA1": 382, + "VISp": 385, "VISam": 394, "VISal": 402, "VISl": 409, "VISrl": 417, + "CA2": 423, "CA3": 463, "SUB": 502, "VISpm": 533, "TH": 549, + "NOT": 628, "COAa": 639, "COApm": 663, "VIS": 669, "CP": 672, + "OLF": 698, "OP": 706, "VPL": 718, "DG": 726, "VPM": 733, "ZI": 797, + "SCzo": 834, "SCsg": 842, "SCop": 851, "PF": 930, "PO": 1020, + "POL": 1029, "POST": 1037, "PP": 1044, "PPT": 1061, "MGd": 1072, + "MGv": 1079, "PRE": 1084, "MGm": 1088, "HPF": 1089, + "VISli": 312782574, "VISmma": 480149258, "VISmmp": 480149286, + "ProS": 484682470, "RPF": 549009203, "Eth": 560581551, + "PIL": 560581563, "PoT": 563807435, "IntG": 563807439 +} + + +class EcephysNwbSessionApi(NwbApi, EcephysSessionApi): + + def __init__(self, + path, + probe_lfp_paths: Optional[Dict[int, Callable[[], pynwb.NWBFile]]] = None, + additional_unit_metrics=None, + external_channel_columns=None, + **kwargs): + + self.filter_out_of_brain_units = kwargs.pop("filter_out_of_brain_units", True) + self.filter_by_validity = kwargs.pop("filter_by_validity", True) + self.amplitude_cutoff_maximum = get_unit_filter_value("amplitude_cutoff_maximum", **kwargs) + self.presence_ratio_minimum = get_unit_filter_value("presence_ratio_minimum", **kwargs) + self.isi_violations_maximum = get_unit_filter_value("isi_violations_maximum", **kwargs) + + super(EcephysNwbSessionApi, self).__init__(path, **kwargs) + self.probe_lfp_paths = probe_lfp_paths + + self.additional_unit_metrics = additional_unit_metrics + self.external_channel_columns = external_channel_columns + + if hasattr(self, "path") and self.path: + check_nwbfile_version( + nwbfile_path=self.path, + desired_minimum_version="2.2.2", + warning_msg=( + f"It looks like the Visual Coding Neuropixels nwbfile " + f"you are trying to access ({self.path})" + f"was created by a previous (and incompatible) version of " + f"AllenSDK and pynwb. You will need to either 1) use " + f"AllenSDK version < 2.0.0 or 2) re-download an updated " + f"version of the nwbfile to access the desired data.")) + + def test(self): + """ A minimal test to make sure that this API's NWB file exists and is + readable. Ecephys NWB files use the required session identifier field + to store the session id, so this is guaranteed to be present for any + uncorrupted NWB file. + + Of course, this does not ensure that the file as a whole is correct. + """ + self.get_ecephys_session_id() + + def get_session_start_time(self): + return self.nwbfile.session_start_time + + def get_stimulus_presentations(self): + table = super(EcephysNwbSessionApi, self).get_stimulus_presentations() + + if "color" in table.columns: + # the color column actually contains two parameters. One is coded as rgb triplets and the other as -1 or 1 + if "color_triplet" not in table.columns: + table["color_triplet"] = pd.Series("", index=table.index) + rgb_color_match = table["color"].str.match(color_triplet_re) + table.loc[rgb_color_match, "color_triplet"] = table.loc[rgb_color_match, "color"] + table.loc[rgb_color_match, "color"] = "" + + # make sure the color column's values are numeric + table.loc[table["color"] != "", "color"] = table.loc[table["color"] != "", "color"].apply(ast.literal_eval) + + return table + + def _probe_nwbfile(self, probe_id: int): + if self.probe_lfp_paths is None: + raise TypeError( + "EcephysNwbSessionApi assumes a split NWB file, with " + "probewise LFP stored in individual files. " + "this object was not configured with probe_lfp_paths" + ) + elif probe_id not in self.probe_lfp_paths: + raise KeyError(f"no probe lfp file path is recorded for probe {probe_id}") + + return self.probe_lfp_paths[probe_id]() + + def get_probes(self) -> pd.DataFrame: + probes: Union[List, pd.DataFrame] = [] + for k, v in self.nwbfile.electrode_groups.items(): + probes.append({ + 'id': v.probe_id, + 'name': v.name, + 'location': v.location, + "sampling_rate": v.device.sampling_rate, + "lfp_sampling_rate": v.lfp_sampling_rate, + "has_lfp_data": v.has_lfp_data + }) + probes = pd.DataFrame(probes) + probes = probes.set_index(keys='id', drop=True) + probes = probes.rename(columns={"name": "description"}) + return probes + + def get_channels(self) -> pd.DataFrame: + channels = self.nwbfile.electrodes.to_dataframe() + channels.drop(columns=['imp', 'group', + 'group_name', 'filtering'], inplace=True) + + # Rename columns for clarity/compatibility with example notebooks + channels.rename( + columns={"location": "ecephys_structure_acronym", + "x": "anterior_posterior_ccf_coordinate", + "y": "dorsal_ventral_ccf_coordinate", + "z": "left_right_ccf_coordinate", + "name": "description"}, + inplace=True) + + channels["ecephys_structure_acronym"] = [ + ch_acr if ch_acr not in set(["None", ""]) + else np.nan + for ch_acr in channels["ecephys_structure_acronym"] + ] + + channels["ecephys_structure_id"] = [ + np.nan if ch_acr is np.nan else STRUCTURE_ACRONYM_ID_MAP.get(ch_acr, np.nan) + for ch_acr in channels["ecephys_structure_acronym"] + ] + + if self.external_channel_columns is not None: + external_channel_columns = self.external_channel_columns() + channels = clobbering_merge(channels, external_channel_columns, left_index=True, right_index=True) + + if self.filter_by_validity: + channels = channels[channels["valid_data"]] + channels = channels.drop(columns=["valid_data"]) + + return channels + + def get_mean_waveforms(self) -> Dict[int, np.ndarray]: + units_table = self._get_full_units_table() + return units_table['waveform_mean'].to_dict() + + def get_spike_times(self) -> Dict[int, np.ndarray]: + units_table = self._get_full_units_table() + return units_table['spike_times'].to_dict() + + def get_spike_amplitudes(self) -> Dict[int, np.ndarray]: + units_table = self._get_full_units_table() + return units_table["spike_amplitudes"].to_dict() + + def get_units(self) -> pd.DataFrame: + units = self._get_full_units_table() + + to_drop = set(["spike_times", "spike_amplitudes", "waveform_mean"]) & set(units.columns) + units.drop(columns=list(to_drop), inplace=True) + + if self.additional_unit_metrics is not None: + additional_metrics = self.additional_unit_metrics() + units = pd.merge(units, additional_metrics, left_index=True, right_index=True) + + return units + + def get_lfp(self, probe_id: int) -> xr.DataArray: + lfp_file = self._probe_nwbfile(probe_id) + lfp = lfp_file.get_acquisition(f'probe_{probe_id}_lfp') + series = lfp.get_electrical_series(f'probe_{probe_id}_lfp_data') + + electrodes = lfp_file.electrodes.to_dataframe() + + data = series.data[:] + timestamps = series.timestamps[:] + + return xr.DataArray( + name="LFP", + data=data, + dims=['time', 'channel'], + coords=[timestamps, electrodes.index.values] + ) + + def get_running_speed(self, include_rotation=False) -> pd.DataFrame: + running_module = self.nwbfile.get_processing_module("running") + running_speed_series = running_module["running_speed"] + running_speed_start_times = running_speed_series.timestamps[:] + + running_speed_end_series = running_module["running_speed_end_times"] + running_speed_end_times = running_speed_end_series.timestamps[:] + + running = pd.DataFrame({ + "start_time": running_speed_start_times, + "end_time": running_speed_end_times, + "velocity": running_speed_series.data[:] + }) + + if include_rotation: + rotation_series = running_module["running_wheel_rotation"] + running["net_rotation"] = rotation_series.data[:] + + return running + + def get_raw_running_data(self): + rotation_series = self.nwbfile.get_acquisition("raw_running_wheel_rotation") + signal_voltage_series = self.nwbfile.get_acquisition("running_wheel_signal_voltage") + supply_voltage_series = self.nwbfile.get_acquisition("running_wheel_supply_voltage") + + return pd.DataFrame({ + "frame_time": rotation_series.timestamps[:], + "net_rotation": rotation_series.data[:], + "signal_voltage": signal_voltage_series.data[:], + "supply_voltage": supply_voltage_series.data[:] + }) + + def get_rig_metadata(self) -> Optional[dict]: + try: + et_mod = self.nwbfile.get_processing_module("eye_tracking_rig_metadata") + except KeyError as e: + print(f"This ecephys session '{int(self.nwbfile.identifier)}' has no eye tracking rig metadata. (NWB error: {e})") + return None + + meta = et_mod.get_data_interface("eye_tracking_rig_metadata") + + rig_geometry = pd.DataFrame({ + f"monitor_position_{meta.monitor_position__unit}": meta.monitor_position, + f"camera_position_{meta.camera_position__unit}": meta.camera_position, + f"led_position_{meta.led_position__unit}": meta.led_position, + f"monitor_rotation_{meta.monitor_rotation__unit}": meta.monitor_rotation, + f"camera_rotation_{meta.camera_rotation__unit}": meta.camera_rotation + }) + + rig_geometry = rig_geometry.rename(index={0: 'x', 1: 'y', 2: 'z'}) + + returned_metadata = { + "geometry": rig_geometry, + "equipment": meta.equipment + } + + return returned_metadata + + def get_screen_gaze_data(self, include_filtered_data=False) -> Optional[pd.DataFrame]: + try: + rgm_mod = self.nwbfile.get_processing_module("raw_gaze_mapping") + fgm_mod = self.nwbfile.get_processing_module("filtered_gaze_mapping") + except KeyError as e: + print(f"This ecephys session '{int(self.nwbfile.identifier)}' has no eye tracking data. (NWB error: {e})") + return None + + raw_eye_area_ts = rgm_mod.get_data_interface("eye_area") + raw_pupil_area_ts = rgm_mod.get_data_interface("pupil_area") + raw_screen_coordinates_ts = rgm_mod.get_data_interface("screen_coordinates") + raw_screen_coordinates_spherical_ts = rgm_mod.get_data_interface("screen_coordinates_spherical") + + filtered_eye_area_ts = fgm_mod.get_data_interface("eye_area") + filtered_pupil_area_ts = fgm_mod.get_data_interface("pupil_area") + filtered_screen_coordinates_ts = fgm_mod.get_data_interface("screen_coordinates") + filtered_screen_coordinates_spherical_ts = fgm_mod.get_data_interface("screen_coordinates_spherical") + + gaze_data = { + "raw_eye_area": raw_eye_area_ts.data[:], + "raw_pupil_area": raw_pupil_area_ts.data[:], + "raw_screen_coordinates_x_cm": raw_screen_coordinates_ts.data[:, 1], + "raw_screen_coordinates_y_cm": raw_screen_coordinates_ts.data[:, 0], + "raw_screen_coordinates_spherical_x_deg": raw_screen_coordinates_spherical_ts.data[:, 1], + "raw_screen_coordinates_spherical_y_deg": raw_screen_coordinates_spherical_ts.data[:, 0] + } + + if include_filtered_data: + gaze_data.update( + { + "filtered_eye_area": filtered_eye_area_ts.data[:], + "filtered_pupil_area": filtered_pupil_area_ts.data[:], + "filtered_screen_coordinates_x_cm": filtered_screen_coordinates_ts.data[:, 1], + "filtered_screen_coordinates_y_cm": filtered_screen_coordinates_ts.data[:, 0], + "filtered_screen_coordinates_spherical_x_deg": filtered_screen_coordinates_spherical_ts.data[:, 1], + "filtered_screen_coordinates_spherical_y_deg": filtered_screen_coordinates_spherical_ts.data[:, 0] + } + ) + + index = pd.Index(data=raw_eye_area_ts.timestamps[:], name="Time (s)") + return pd.DataFrame(gaze_data, index=index) + + def get_pupil_data(self) -> Optional[pd.DataFrame]: + try: + et_mod = self.nwbfile.get_processing_module("eye_tracking") + rgm_mod = self.nwbfile.get_processing_module("raw_gaze_mapping") + except KeyError as e: + print(f"This ecephys session '{int(self.nwbfile.identifier)}' has no eye tracking data. (NWB error: {e})") + return None + + cr_ellipse_fits = et_mod.get_data_interface("cr_ellipse_fits").to_dataframe() + eye_ellipse_fits = et_mod.get_data_interface("eye_ellipse_fits").to_dataframe() + pupil_ellipse_fits = et_mod.get_data_interface("pupil_ellipse_fits").to_dataframe() + + # NOTE: ellipse fit "height" and "width" parameters describe the + # "half-height" and "half-width" of fitted ellipse. + eye_tracking_data = { + "corneal_reflection_center_x": cr_ellipse_fits["center_x"].values, + "corneal_reflection_center_y": cr_ellipse_fits["center_y"].values, + "corneal_reflection_height": 2 * cr_ellipse_fits["height"].values, + "corneal_reflection_width": 2 * cr_ellipse_fits["width"].values, + "corneal_reflection_phi": cr_ellipse_fits["phi"].values, + + "pupil_center_x": pupil_ellipse_fits["center_x"].values, + "pupil_center_y": pupil_ellipse_fits["center_y"].values, + "pupil_height": 2 * pupil_ellipse_fits["height"].values, + "pupil_width": 2 * pupil_ellipse_fits["width"].values, + "pupil_phi": pupil_ellipse_fits["phi"].values, + + "eye_center_x": eye_ellipse_fits["center_x"].values, + "eye_center_y": eye_ellipse_fits["center_y"].values, + "eye_height": 2 * eye_ellipse_fits["height"].values, + "eye_width": 2 * eye_ellipse_fits["width"].values, + "eye_phi": eye_ellipse_fits["phi"].values + } + + timestamps = rgm_mod.get_data_interface("eye_area").timestamps[:] + index = pd.Index(data=timestamps, name="Time (s)") + return pd.DataFrame(eye_tracking_data, index=index) + + def get_ecephys_session_id(self) -> int: + return int(self.nwbfile.identifier) + + def get_current_source_density(self, probe_id): + csd_mod = self._probe_nwbfile(probe_id).get_processing_module("current_source_density") + nwb_csd = csd_mod["ecephys_csd"] + csd_data = nwb_csd.time_series.data[:].T # csd data stored as (timepoints x channels) but we want (channels x timepoints) + + csd = xr.DataArray( + name="CSD", + data=csd_data, + dims=["virtual_channel_index", "time"], + coords={ + "virtual_channel_index": np.arange(csd_data.shape[0]), + "time": nwb_csd.time_series.timestamps[:], + "vertical_position": (("virtual_channel_index",), nwb_csd.virtual_electrode_y_positions), + "horizontal_position": (("virtual_channel_index",), nwb_csd.virtual_electrode_x_positions) + } + ) + return csd + + def get_optogenetic_stimulation(self) -> pd.DataFrame: + mod = self.nwbfile.get_processing_module("optotagging") + table = mod.get_data_interface("optogenetic_stimulation").to_dataframe() + table.drop(columns=["tags", "timeseries"], inplace=True) + return table + + def _get_full_units_table(self) -> pd.DataFrame: + units = self.nwbfile.units.to_dataframe() + units.index = units.index.astype(int) + + if self.filter_by_validity or self.filter_out_of_brain_units: + channels = self.get_channels() + + if self.filter_out_of_brain_units: + channels = channels[~(channels["ecephys_structure_id"].isna())] + + channel_ids = set(channels.index.values.tolist()) + units = units[units["peak_channel_id"].isin(channel_ids)] + + if self.filter_by_validity: + units = units[units["quality"] == "good"] + units.drop(columns=["quality"], inplace=True) + + units = units[units["amplitude_cutoff"] <= self.amplitude_cutoff_maximum] + units = units[units["presence_ratio"] >= self.presence_ratio_minimum] + units = units[units["isi_violations"] <= self.isi_violations_maximum] + + return units + + def get_metadata(self): + nwb_subject = self.nwbfile.subject + metadata = { + "specimen_name": nwb_subject.specimen_name, + "age_in_days": nwb_subject.age_in_days, + "full_genotype": nwb_subject.genotype, + "strain": nwb_subject.strain, + "sex": nwb_subject.sex, + "stimulus_name": self.nwbfile.stimulus_notes, + "subject_id": nwb_subject.subject_id, + "age": nwb_subject.age, + "species": nwb_subject.species + } + return metadata + + +def clobbering_merge(to_df, from_df, **kwargs): + overlapping = set(to_df.columns) & set(from_df.columns) + + for merge_param in ["on", "left_on", "right_on"]: + if merge_param in kwargs: + merge_arg = kwargs.get(merge_param) + if isinstance(merge_arg, str): + merge_arg = [merge_arg] + overlapping = overlapping - set(list(merge_arg)) + + to_df = to_df.drop(columns=list(overlapping)) + return pd.merge(to_df, from_df, **kwargs) diff --git a/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py b/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py new file mode 100644 index 0000000000..5334aa00f0 --- /dev/null +++ b/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py @@ -0,0 +1,72 @@ +from typing import Dict, Optional +from datetime import datetime + +import numpy as np +import pandas as pd +import xarray as xr + +from ...running_speed import RunningSpeed + + +class EcephysSessionApi: + + session_na = -1 + + __slots__: tuple = tuple([]) + + def __init__(self, *args, **kwargs): + pass + + def test(self) -> bool: + raise NotImplementedError + + def get_session_start_time(self) -> datetime: + raise NotImplementedError + + def get_running_speed(self) -> RunningSpeed: + raise NotImplementedError + + def get_stimulus_presentations(self) -> pd.DataFrame: + raise NotImplementedError + + def get_invalid_times(self) -> pd.DataFrame: + raise NotImplementedError + + def get_probes(self) -> pd.DataFrame: + raise NotImplementedError + + def get_channels(self) -> pd.DataFrame: + raise NotImplementedError + + def get_mean_waveforms(self) -> Dict[int, np.ndarray]: + raise NotImplementedError + + def get_spike_times(self) -> Dict[int, np.ndarray]: + raise NotImplementedError + + def get_units(self) -> pd.DataFrame: + raise NotImplementedError + + def get_ecephys_session_id(self) -> int: + raise NotImplementedError + + def get_lfp(self, probe_id: int) -> xr.DataArray: + raise NotImplementedError + + def get_optogenetic_stimulation(self) -> pd.DataFrame: + raise NotImplementedError + + def get_spike_amplitudes(self) -> Dict[int, np.ndarray]: + raise NotImplementedError + + def get_rig_metadata(self) -> Optional[dict]: + raise NotImplementedError + + def get_screen_gaze_data(self, include_filtered_data=False) -> Optional[pd.DataFrame]: + raise NotImplementedError + + def get_pupil_data(self) -> Optional[pd.DataFrame]: + raise NotImplementedError + + def get_metadata(self): + raise NotImplementedError diff --git a/brain_observatory/ecephys/file_io/__init__.py b/brain_observatory/ecephys/file_io/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/file_io/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8bb53ba06bb421395253f907fe3b4134651735a GIT binary patch literal 210 zcmYL@zY4-Y492hEAc7C#U^}>ph<{db5x0XQy^Ho}&6T@aDNa6%ldt6JBe*%48^jO3 zUqZ+ivKkHtf<^Zm#QKW(DdA?p4n2kuJ26VO58>nZkI!{ImHU7`NGQOhIb47`xg^kz z3``_a8>Fj|f@Zq9=z`qXTn5|VxCULq5jk5`ykW{L_h3o6oG-S}INxQcF@~~(tx#E) YDP_qvN~Lx8?9WcloGYBir`~Mw1wgtzod5s; literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/file_io/__pycache__/continuous_file.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/continuous_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abb9ba01aff2fa694a9a4ec9a8818f0b55783ff2 GIT binary patch literal 4145 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 SD)%xi?_(Y+%;pM0U*W$8vVj5s literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/file_io/__pycache__/ecephys_sync_dataset.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/ecephys_sync_dataset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..287284e74a1039bb75d4c75300f314bb04a5944c GIT binary patch literal 3993 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 R=$cKyY}0I7&;miO{a>{8S=Rsn literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/file_io/__pycache__/stim_file.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/stim_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..322c4e5f327492298151874bd43d57244b11d575 GIT binary patch literal 2699 zcma)8&5s*36t`z4$u#@X584%r+R8{RYWUcdKmrL6DpW0?mIYA|5Jeg}V<(wr;u&lw zZKCu5?U{c7Ar*1rU-Fd`SB{)`&yz&E%VxD6*?u#Aw%_}`ulZzat4W}#KYrr>)Cu_u zUzRNb;x=@10|r3^%}Ja3IcSHU5)p{-IT4|Zo`vn2pbtqa`WraOL5kzDg+SbfZsssZ ze?mKup`apoPM*<r1av4OPuGC1iMprjKsQ9}=?2i}MAOqT&>LdY)8~NR65F0`iu2;a zbJE@r7sVx*H|3UiNnG}8+u{mHx8q*E!$%KoHu_S@ud;NQOMJPP<uaup95$Q-=y#wS zgl0}2f#$me_6M^s9%RO{qQ^v*+N@AqXVS2=P?l#ZQ+<}HUZF=E*BI{>V+&tIHp#@8 z=gh!m<2-A!MRSeCmlk!A;FjZTWZwIeXs`wOcYf#n&bLNt)8PXy_PYErSJTeNio=b9 zztfRwVmd`Bl}TYN%E8oh9%S8)$*g><<mr(2CG5>};1I+8t_CTSq6;TZxGnT_U#1c_ z?e_qJBrEn&o&;a^%Be=f#Rvo9L82L32j1R7jWdGy#y!nPQgbU2$!hP|uu@AS0Z7Dd z1yMWfm8L~Cx*|+9m^?Jq(12HWv4_W*q?9@_5|KF%pO-?vzE<e}Z9Aj*?|zewB)er= ztSiCT5-gnAY-Qecnz$`cFzM!84N=Tfb<*cRgPlWKytY=0BZr=>!6qDpUJRXHMn9&r zKD+zGYMxqV2a=5>2X9sVan3cH$h=51J4M^zq8=;n*^dWO=IoY`eJ#P~_Za{H>NCmH z0bAM2gSxkRZ3P-V$n7jnPy8u~E-EvxvFI`Gr9{_OfYfIDYXLcW({k?-WYDn>#rF${ z@82<d1+&kN;9^0{oGpbt84!qbkH9g-+ktoj(Y%w$3g=`2W5TuO)06eqm~L*al#I@- z<Wj;jDtYtkg-J~*rC=uOD^PP%<QCG!%5*N8zzRr;?z2YVEm(T<kigg0S_RKKn|KE< zoMh_sd$-}vw^#QDv#aax%~a~s7jUE5k-m>ReQKw3l0ad@kT`%FeUb^QB!jf84<B>g zH^(zhoFo|YN%9_^<d3JbSJ%q0<US(E25j{{I00gMeOYBhunQFxdbCUCP<5UL-x2j7 zB9_{q7Yv*F5rq;($#mOC^pfKSa=@ynRxK5^IsKK0`fuSg`ZN83sNj22jW&D{%>(c6 zjRRMMN-;9+7$TYXp@6wqs<aSLax_-L*`=}K-CQzTu!SeH*(<E4ixDJ;%pA(zzMQsd z9z+-4m(#mi7uq#HS3*9i=s=aORs}$XvI~cD>gtgA$GJU*viG|W5a0_i5E{_y^b(BQ z@LUZ}iH(y(ZUsIX7Cpgx0p?gsUeGxtfT!V{%)=g?2ftu40FMY<P>S}3mRuxdrC;R2 zG&e3PxgBV%GhW|gqPs>9QY+Ngd%$4uLJ~CTDfM%~e$YDaz_%2Xvm|lNBpDTA423yy zn@RE`{6Q>M;!;Do*S0FrKEwKoq0y;)7SR})8pA{*dLB!+k>=c(k+g$C=&Se{e=-gY zSWY#%GnQF%8HPCAZ1^XJvA$W0qj<w}wCe48$>Ar&=w0Az*VK3fzYJG^cJ-qBNT$~F X9Xj1#<|}smVWrqd=wcq9n8x9M&bXP> literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/file_io/continuous_file.py b/brain_observatory/ecephys/file_io/continuous_file.py new file mode 100644 index 0000000000..fa950f3b8f --- /dev/null +++ b/brain_observatory/ecephys/file_io/continuous_file.py @@ -0,0 +1,140 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2019. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from pathlib import Path +import logging + + +class ContinuousFile(): + + """ + Represents a continuous (.dat) file, and its associated timestamps + + """ + + def __init__(self, data_path, timestamps_path, total_num_channels=384, dtype=np.int16): + + """ + data_path : str + Path to file containing LFP data. The file is expected to be a raw binary with channels as its fast axis and samples as its slow axis. + timestamps_path : str + Path to file containing timestamps for the associated LFP samples. The file is expected to be a .npy file. + total_num_channels : int, optional + Count of channels on this probe. + dtype : type, optional + The data array will be interpreted as containing samples of this type. + """ + + self.data_path = data_path + self.timestamps_path = timestamps_path + self.total_num_channels = total_num_channels + self.dtype = dtype + + + def load(self, memmap=False, memmap_thresh = 10e9): + + """ + Reads lfp data and timestamps from the filesystem + + Parameters: + ---------- + + memmap : bool, optional + If True, the returned data array will be a memory map of the file on disk. Default is True. + memmap_thresh : float, optional + Files above this size in bytes will be memory-mapped, regardless of memmap setting + + Returns: + -------- + lfp_raw : numpy.ndarray + Contains LFP data read directly off of disk. Dimensions are samples X channels. + timestamps : numpy.ndarray + 1D array defining the times at which each LFP sample was taken. + + """ + + logging.info('loading timestamps from {}'.format(self.timestamps_path)) + timestamps = np.load(self.timestamps_path, allow_pickle=False) + logging.info('done loading timestamps from {}. Count: {}'.format(self.timestamps_path, timestamps.size)) + + bytes_per_sample = self.dtype(0).nbytes + num_samples = timestamps.size * self.total_num_channels + expected_num_bytes = num_samples * bytes_per_sample + logging.info('calculated LFP filesize: {} bytes'.format(expected_num_bytes)) + + num_bytes = Path(self.data_path).stat().st_size + if not expected_num_bytes == num_bytes: + raise IOError('expected LFP data filesize to be {} bytes, but its size was {} bytes'.format(expected_num_bytes, num_bytes)) + + shape = (timestamps.size, self.total_num_channels) + logging.info('calculated LFP data shape: {}'.format(shape)) + + if memmap or num_bytes > memmap_thresh: + logging.info('memmaping LFP file at {}'.format(self.data_path)) + lfp_raw = np.memmap(self.data_path, dtype=self.dtype, shape=shape, mode='r') + logging.info('done memmaping LFP file at {}'.format(self.data_path)) + else: + with open(self.data_path, 'rb') as data_file: + logging.info('reading LFP file at {}'.format(self.data_path)) + lfp_raw = np.frombuffer(data_file.read(), dtype=self.dtype) + logging.info('done reading LFP file at {}'.format(self.data_path)) + lfp_raw = lfp_raw.reshape(shape) + + return lfp_raw, timestamps + + + def get_lfp_channel_order(self): + + """ + Returns the channel ordering for LFP data extracted from NPX files. + + Parameters: + ---------- + None + + Returns: + --------- + channel_order : numpy.ndarray + Contains the actual channel ordering. + """ + + remapping_pattern = np.array([0, 12, 1, 13, 2, 14, 3, 15, 4, 16, 5, 17, 6, 18, 7, 19, + 8, 20, 9, 21, 10, 22, 11, 23, 24, 36, 25, 37, 26, 38, + 27, 39, 28, 40, 29, 41, 30, 42, 31, 43, 32, 44, 33, 45, 34, 46, 35, 47]) + + channel_order = np.concatenate([remapping_pattern + 48*i for i in range(0,8)]) + + return channel_order diff --git a/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py b/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py new file mode 100644 index 0000000000..fcafbbd4b1 --- /dev/null +++ b/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py @@ -0,0 +1,114 @@ +from itertools import product +import functools +from collections import defaultdict +import logging +import warnings + +import numpy as np + +from allensdk.brain_observatory.sync_dataset import Dataset +from allensdk.brain_observatory.ecephys import stimulus_sync +from allensdk.brain_observatory import sync_utilities + + +class EcephysSyncDataset(Dataset): + + @property + def sample_frequency(self): + return self.meta_data['ni_daq']['counter_output_freq'] + + + @sample_frequency.setter + def sample_frequency(self, value): + if not hasattr(self, 'meta_data'): + self.meta_data = defaultdict(dict) + self.meta_data['ni_daq']['counter_output_freq'] = value + + + def __init__(self): + '''In-memory representation of a sync h5 file as produced by the sync package. + + Notes + ----- + base is from here: http://aibspi/mpe_apps/sync/blob/master/sync/dataset.py + Construction works slightly differently for this class as its base. In particular, + this class' __init__ method merely constructs the object. To make a new SyncDataset in client code, use the + factory classmethod. This is done for ease of testability. + + ''' + pass + + + def extract_led_times(self, keys=Dataset.OPTOGENETIC_STIMULATION_KEYS, fallback_line=18): + + try: + led_times = self.get_edges( + kind="rising", + keys=keys, + units="seconds" + ) + except KeyError: + warnings.warn(f"unable to find LED times using line labels {keys}, returning line {fallback_line}") + led_times = self.get_rising_edges(fallback_line, units="seconds") + + return led_times + + + def extract_frame_times_from_photodiode(self, photodiode_cycle=60, frame_keys=Dataset.FRAME_KEYS, photodiode_keys=Dataset.PHOTODIODE_KEYS): + photodiode_times = self.get_edges('all', photodiode_keys) + vsync_times = self.get_edges('falling', frame_keys) + vsync_times = sync_utilities.trim_discontiguous_times(vsync_times) + + logging.info(f"Total vsyncs: {len(vsync_times)}") + + photodiode_times = stimulus_sync.trim_border_pulses(photodiode_times, vsync_times) + photodiode_times = stimulus_sync.correct_on_off_effects(photodiode_times) + photodiode_times = stimulus_sync.fix_unexpected_edges(photodiode_times, cycle=photodiode_cycle) + + frame_duration = stimulus_sync.estimate_frame_duration(photodiode_times, cycle=photodiode_cycle) + irregular_interval_policy = functools.partial(stimulus_sync.allocate_by_vsync, np.diff(vsync_times)) + frame_indices, frame_start_times, frame_end_times = stimulus_sync.compute_frame_times( + photodiode_times, frame_duration, len(vsync_times), + cycle=photodiode_cycle, irregular_interval_policy=irregular_interval_policy + ) + + return frame_start_times + + + def extract_frame_times_from_vsyncs(self, photodiode_cycle=60, + frame_keys=Dataset.FRAME_KEYS, photodiode_keys=Dataset.PHOTODIODE_KEYS + ): + raise NotImplementedError() + + + def extract_frame_times(self, strategy, photodiode_cycle=60, + frame_keys=Dataset.FRAME_KEYS, photodiode_keys=Dataset.PHOTODIODE_KEYS + ): + + if strategy == 'use_photodiode': + return self.extract_frame_times_from_photodiode( + photodiode_cycle=photodiode_cycle, frame_keys=frame_keys, photodiode_keys=photodiode_keys + ) + elif strategy == 'use_vsyncs': + return self.extract_frame_times_from_vsyncs( + photodiode_cycle=photodiode_cycle, frame_keys=frame_keys, photodiode_keys=photodiode_keys + ) + else: + raise ValueError('unrecognized strategy: {}'.format(strategy)) + + + @classmethod + def factory(cls, path): + ''' Build a new SyncDataset. + + Parameters + ---------- + path : str + Filesystem path to the h5 file containing sync information to be loaded. + + ''' + + obj = cls() + obj.load(path) + return obj + diff --git a/brain_observatory/ecephys/file_io/stim_file.py b/brain_observatory/ecephys/file_io/stim_file.py new file mode 100644 index 0000000000..a9298169ba --- /dev/null +++ b/brain_observatory/ecephys/file_io/stim_file.py @@ -0,0 +1,73 @@ +import pandas as pd +import numpy as np + + +class CamStimOnePickleStimFile(object): + + + @property + def stimuli(self): + '''List of dictionaries containing information about individual stimuli + ''' + return self.data['stimuli'] + + + @property + def frames_per_second(self): + '''Framerate of stimulus presentation + ''' + return self.data['fps'] + + + @property + def pre_blank_sec(self): + '''Time (s) before initial stimulus presentation + ''' + return self.data['pre_blank_sec'] + + + @property + def angular_wheel_velocity(self): + ''' Extract the mean angular velocity of the running wheel (degrees / s) for each + frame. + ''' + return self.frames_per_second * self.angular_wheel_rotation + + + @property + def angular_wheel_rotation(self): + ''' Extract the total rotation of the running wheel on each frame. + ''' + return self._extract_running_array("dx") + + + @property + def vsig(self): + """Running speed signal voltage + """ + return self._extract_running_array("vsig") + + @property + def vin(self): + return self._extract_running_array("vin") + + + def __init__(self, data, **kwargs): + self.data = data + + + def _extract_running_array(self, key): + try: + result = self.data['items']['foraging']['encoders'][0][key] + except (KeyError, IndexError): + try: + result = self.data[key] + except KeyError: + raise KeyError(f'unable to extract {key} from this stimulus pickle') + + return np.array(result) + + @classmethod + def factory(cls, path, **kwargs): + data = pd.read_pickle(path) + return cls(data, **kwargs) \ No newline at end of file diff --git a/brain_observatory/ecephys/lfp_subsampling/__init__.py b/brain_observatory/ecephys/lfp_subsampling/__init__.py new file mode 100644 index 0000000000..6afec2b7ff --- /dev/null +++ b/brain_observatory/ecephys/lfp_subsampling/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2019. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# diff --git a/brain_observatory/ecephys/lfp_subsampling/__main__.py b/brain_observatory/ecephys/lfp_subsampling/__main__.py new file mode 100644 index 0000000000..7ac8c2e245 --- /dev/null +++ b/brain_observatory/ecephys/lfp_subsampling/__main__.py @@ -0,0 +1,142 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2019. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging + +import numpy as np + +from allensdk.brain_observatory.argschema_utilities import \ + ArgSchemaParserPlus, \ + write_or_print_outputs +from allensdk.brain_observatory.ecephys.file_io.continuous_file import \ + ContinuousFile +from ._schemas import InputParameters, OutputParameters +from .subsampling import select_channels, subsample_timestamps, \ + subsample_lfp, \ + remove_lfp_offset, remove_lfp_noise + +logger = logging.getLogger(__name__) + + +def subsample(args): + """ + + :param args: + :return: + """ + params = args['lfp_subsampling'] + + probe_outputs = [] + for probe in args['probes']: + logging.info("Sub-sampling LFP for " + probe['name']) + lfp_data_file = ContinuousFile(probe['lfp_input_file_path'], + probe['lfp_timestamps_input_path'], + probe['total_channels']) + + logging.info("loading lfp data...") + lfp_raw, timestamps = lfp_data_file.load() + if params['reorder_channels']: + lfp_channel_order = lfp_data_file.get_lfp_channel_order() + else: + lfp_channel_order = np.arange(0, probe['total_channels']) + + logging.info("selecting channels...") + channels_to_save, actual_channels = select_channels( + probe['total_channels'], + probe['surface_channel'], + params['surface_padding'], + params['start_channel_offset'], + params['channel_stride'], + lfp_channel_order, + probe.get('noisy_channels', []), + params['remove_noisy_channels'], + probe['reference_channels'], + params['remove_reference_channels']) + + ts_subsampled = subsample_timestamps(timestamps, params[ + 'temporal_subsampling_factor']) + + logging.info("subsampling data...") + lfp_subsampled = subsample_lfp(lfp_raw, channels_to_save, + params['temporal_subsampling_factor']) + + del lfp_raw + + logging.info("removing offset...") + lfp_filtered = remove_lfp_offset(lfp_subsampled, + probe['lfp_sampling_rate'] / params[ + 'temporal_subsampling_factor'], + params['cutoff_frequency'], + params['filter_order']) + + del lfp_subsampled + + logging.info("Surface channel: " + str(probe['surface_channel'])) + + logging.info("removing noise...") + lfp = remove_lfp_noise(lfp_filtered, probe['surface_channel'], + actual_channels) + del lfp_filtered + + if params['remove_channels_out_of_brain']: + channels_to_keep = actual_channels < ( + probe['surface_channel'] + 10) + actual_channels = actual_channels[channels_to_keep] + lfp = lfp[:, channels_to_keep] + + logging.info('Writing to disk...') + lfp.tofile(probe['lfp_data_path']) + np.save(probe['lfp_timestamps_path'], ts_subsampled) + np.save(probe['lfp_channel_info_path'], actual_channels) + + probe_outputs.append({'name': probe['name'], + 'lfp_data_path': probe['lfp_data_path'], + 'lfp_timestamps_path': probe[ + 'lfp_timestamps_path'], + 'lfp_channel_info_path': probe[ + 'lfp_channel_info_path']}) + + return {'probe_outputs': probe_outputs} + + +def main(): + mod = ArgSchemaParserPlus(schema_type=InputParameters, + output_schema_type=OutputParameters) + output = subsample(mod.args) + write_or_print_outputs(data=output, parser=mod) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb9b7b517221bd08b08c31b8372f39090bdede71 GIT binary patch literal 218 zcmYL@zX}2|48|)6ir|AdcsIC-h<{db5w}7~uk|eU(sH>|ZWJHI$yajq5!{^24dMsi zk0j&^Sq+B+!NU6$ik=X!w)v^U#ez*;h7mh4>TDmPY{!3mZtJPslPyWY5lo`t0@%nU zLKe`#L|QzP4ACNG%n*+a$&J&JTxG`*vJ>Q%v)=QDIi<P;hbm~kc!nyJO=>gShEjis fifT<zMDH+9m2&7RrIOe@`?DgL+S_^i+?y@FzyLvr literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9276f90c3614bb7520e794015a303b7094d8d412 GIT binary patch literal 2705 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca429e3d4fae771337dc00b793a493def1a4c185 GIT binary patch literal 3591 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/subsampling.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/subsampling.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81df8c03f442fc5fc000fdae03ce40998af712d0 GIT binary patch literal 5218 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 F{SUKC<(L2f literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/lfp_subsampling/_schemas.py b/brain_observatory/ecephys/lfp_subsampling/_schemas.py new file mode 100644 index 0000000000..6c7424fef2 --- /dev/null +++ b/brain_observatory/ecephys/lfp_subsampling/_schemas.py @@ -0,0 +1,88 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2019. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from argschema import ArgSchema, ArgSchemaParser +from argschema.schemas import DefaultSchema +from argschema.fields import Nested, InputDir, String, Boolean, Float, Dict, Int, NumpyArray + + +class ProbeInputParameters(DefaultSchema): + name = String(required=True, help='Identifier for this probe') + lfp_input_file_path = String(required=True, description="path to original LFP .dat file") + lfp_timestamps_input_path = String(required=True, description="path to LFP timestamps") + lfp_data_path = String(required=True, help="Path to LFP data continuous file") + lfp_timestamps_path = String(required=True, help="Path to LFP timestamps aligned to master clock") + lfp_channel_info_path = String(required=True, help="Path to LFP channel info") + total_channels = Int(default=384, help='Total channel count for this probe.') + surface_channel = Int(required=True, help="Probe surface channel") + reference_channels = NumpyArray(required=False, help="Probe reference channels") + lfp_sampling_rate = Float(required=True, help="Sampling rate of LFP data") + noisy_channels = NumpyArray(required=False, help="Noisy channels to remove") + + +class LfpSubsamplingParameters(DefaultSchema): + temporal_subsampling_factor = Int(default=2, description="Ratio of input samples to output samples in time") + channel_stride = Int(default=4, description="Distance between channels to keep") + surface_padding = Int(default=40, description="Number of channels above surface to include") + start_channel_offset = Int(default=2, description="Offset of first channel (from bottom of the probe)") + reorder_channels = Boolean(default=True, description="Implement channel reordering") + cutoff_frequency = Float(default=0.1, description="Cutoff frequency for DC offset filter (Butterworth)") + filter_order = Int(default=1, description="Order of DC offset filter (Butterworth)") + remove_reference_channels = Boolean(default=False, + description="indicates whether references should be removed from output") + remove_channels_out_of_brain = Boolean(default=False, + description="indicates whether to remove channels outside the brain") + remove_noisy_channels = Boolean(default=False, + description="indicates whether noisy channels should be removed from output") + + +class InputParameters(ArgSchema): + probes = Nested(ProbeInputParameters, many=True, help='Probes for LFP subsampling') + lfp_subsampling = Nested(LfpSubsamplingParameters, help='Parameters for this module') + + +class OutputSchema(DefaultSchema): + input_parameters = Nested(InputParameters, description="Input parameters the module was run with", required=True) + + +class ProbeOutputParameters(DefaultSchema): + name = String(required=True, help='Identifier for this probe.') + lfp_data_path = String(required=True, help='Output subsampled data file.') + lfp_timestamps_path = String(required=True, help='Timestamps for subsampled data.') + lfp_channel_info_path = String(required=True, help='LFP channels from that was subsampled.') + + +class OutputParameters(OutputSchema): + probe_outputs = Nested(ProbeOutputParameters, many=True, required=True, help='probewise outputs') diff --git a/brain_observatory/ecephys/lfp_subsampling/subsampling.py b/brain_observatory/ecephys/lfp_subsampling/subsampling.py new file mode 100644 index 0000000000..032af9d0b5 --- /dev/null +++ b/brain_observatory/ecephys/lfp_subsampling/subsampling.py @@ -0,0 +1,239 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2019. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging + +import numpy as np +from scipy.signal import decimate, butter, filtfilt + + +logger = logging.getLogger(__name__) + + +def select_channels(total_channels, + surface_channel, + surface_padding, + start_channel_offset, + channel_stride, + channel_order, + noisy_channels=np.array([]), + remove_noisy_channels=False, + reference_channels=np.array([]), + remove_references=False): + """ + Selects a subset of channels for spatial downsampling + + Parameters: + ---------- + + total_channels : int + Number of channels in the original data file + surface_channel : int + Index of channel at brain surface + surface_padding : int + Number of channels above surface to save + start_channel_offset : int + First channel to save + channel_stride : int + Number of channels to skip in output + channel_order : np.ndarray + Actual order of LFP channels (needed to account for the bug in NPX extraction) + noisy_channels : numpy.ndarray + Array indicating noisy channels + remove_noisy_channels : bool + Flag to remove noisy channels + reference_channels : numpy.ndarray + Array indicating refence channels + remove_references : bool + Flag to remove reference channels + + Returns: + -------- + selected_channels : numpy.ndarray + Indices of channels to select (relative to non-remapped data) + actual_channel_numbers : numpy.ndarray + Actual probe channels in subsampled data + + """ + assert surface_channel <= total_channels + + max_channel = np.min([total_channels, surface_channel + surface_padding]) + + selected_channels = channel_order[start_channel_offset:max_channel:channel_stride] + + actual_channel_numbers = np.arange(total_channels) + actual_channel_numbers = actual_channel_numbers[start_channel_offset:max_channel:channel_stride] + + if remove_references or remove_noisy_channels: + # TODO: Is there a case that reference/noisy channels won't be removed? If not then we should remove flags and + # just check if the arrays are empty + logger.info("Before:") + logger.info(actual_channel_numbers) + # create mask to filter out reference channels + mask = (not remove_references) or np.isin(actual_channel_numbers, reference_channels, assume_unique=True, + invert=True) + + # mask to remove noisy channels + mask &= (not remove_noisy_channels) or np.isin(actual_channel_numbers, noisy_channels, assume_unique=True, + invert=True) + actual_channel_numbers = actual_channel_numbers[mask] + selected_channels = selected_channels[mask] + logger.info("After:") + logger.info(actual_channel_numbers) + + return selected_channels, actual_channel_numbers + + +def subsample_timestamps(timestamps, subsampling_factor): + """ + Subsamples an array of timestamps + + Parameters: + ---------- + + timestamps : numpy.ndarray + 1D array of timestamp values + downsampling_factor : int + Factor by which to subsample the timestamps + + Returns: + + timestamps_sub : numpy.ndarray + New 1D array of timestamps + + """ + return timestamps[::subsampling_factor] + + +def subsample_lfp(lfp_raw, selected_channels, subsampling_factor): + """ + Subsamples LFP data + + Parameters: + ---------- + + lfp_raw : numpy.ndarray + 2D array of LFP values (time x channels) + selected_channels : numpy.ndarray + Indices of channels to select (spatial subsampling) + downsampling_factor : int + Factor by which to subsample in time + + Returns: + + lfp_subsampled : numpy.ndarray + New 2D array of LFP values + + """ + + num_samples = len(lfp_raw[::subsampling_factor, 0]) # np.round(lfp_raw.shape[0] / subsampling_factor).astype('int') + num_channels = selected_channels.size + + lfp_subsampled = np.zeros((num_samples, num_channels), dtype='int16') + + for new_ch, old_ch in enumerate(selected_channels): + tmp = decimate(lfp_raw[:, old_ch], subsampling_factor, ftype='iir', zero_phase=True) + assert(len(tmp) == num_samples) + lfp_subsampled[:, new_ch] = tmp.astype('int16') + + return lfp_subsampled + + +def remove_lfp_offset(lfp, sampling_frequency, cutoff_frequency, filter_order): + """ + High-pass filters LFP data to remove offset + + Parameters: + ---------- + + lfp : numpy.ndarray + 2D array of LFP values (time x channels) + sampling_frequency : float + Sampling frequency in Hz + cutoff_frequency : float + Cutoff frequency for highpass filter + filter_order : int + Butterworth filter order + + Returns: + + lfp_filtered : numpy.ndarray + New 2D array of LFP values + + """ + lfp_filtered = np.zeros(lfp.shape, dtype='int16') + b, a = butter(filter_order, cutoff_frequency / (sampling_frequency/2), btype='high') + + for ch in range(lfp.shape[1]): + tmp = filtfilt(b, a, lfp[:, ch]) + lfp_filtered[:, ch] = tmp.astype('int16') + + return lfp_filtered + + +def remove_lfp_noise(lfp, surface_channel, channel_numbers, channel_max=384, channel_limit=380): + """ + Subtract mean of channels out of brain to remove noise + + Parameters: + ---------- + + lfp : numpy.ndarray + 2D array of LFP values (time x channels) + surface_channel : int + Surface channel (relative to original probe) + channel_numbers : numpy.ndarray + Channel numbers in 'lfp' array (relative to original probe) + + Returns: + + lfp_noise_removed : numpy.ndarray + New 2D array of LFP values + + """ + + lfp_noise_removed = np.zeros(lfp.shape, dtype='int16') + + surface_channel = channel_limit if surface_channel >= channel_max else surface_channel + + channel_selection = np.where(channel_numbers > surface_channel)[0] + + median_signal_out_of_brain = np.median(lfp[:, channel_selection], 1) + + for ch in range(lfp.shape[1]): + tmp = lfp[:, ch] - median_signal_out_of_brain + lfp_noise_removed[:, ch] = tmp.astype('int16') + + return lfp_noise_removed diff --git a/brain_observatory/ecephys/nwb/__init__.py b/brain_observatory/ecephys/nwb/__init__.py new file mode 100644 index 0000000000..bc79a7ed5e --- /dev/null +++ b/brain_observatory/ecephys/nwb/__init__.py @@ -0,0 +1,20 @@ +from pathlib import Path + +import pynwb + + +file_dir = Path(__file__).parent +namespace_path = (file_dir / "ndx-aibs-ecephys.namespace.yaml").resolve() +pynwb.load_namespaces(str(namespace_path)) + +EcephysProbe = pynwb.get_class('EcephysProbe', 'ndx-aibs-ecephys') + +EcephysElectrodeGroup = pynwb.get_class('EcephysElectrodeGroup', + 'ndx-aibs-ecephys') + +EcephysSpecimen = pynwb.get_class('EcephysSpecimen', 'ndx-aibs-ecephys') + +EcephysEyeTrackingRigMetadata = pynwb.get_class('EcephysEyeTrackingRigMetadata', + 'ndx-aibs-ecephys') + +EcephysCSD = pynwb.get_class('EcephysCSD', 'ndx-aibs-ecephys') diff --git a/brain_observatory/ecephys/nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/nwb/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8644577555c128b46b353c4de809e752a3dafb2f GIT binary patch literal 634 zcmZ9Jy^a$x5XbFJ_9J1FTmub4)G3k_bO<4i<3t1KM4(x%WX-OJ#Kf^z_Fi&(9l95} zh>BNoOT{Zt;oZw!!ASn=Hy^gg<F}*Hka$x+f50Ii<ag`bTi?SQzwDJ4PB@ihOEXGa z4rGu8NU?WAzxT5cL*9EzZleRqVhnB*9AJDy55CrWL*D1%A;=ze9Ce&_9CtkGIO%xY z@u1@g50+#){NryYQ|kH`P_I8-KUe%}2BNStEU{WQcCKKHwt^Dp4Q!=L&+p<FMi+Q} z@_)H|e9WIqENi1VzBl@^a+70tSz#%*sNA#rx(2@(C^tf_K8w{ytbs!fZg@<eE#FN~ zTwM9)q$rFZBFVz4QTxIrjC~Ul8FNtu234IUozI1Fu|ccl4&C^neb%0lO{50S9)i~O zY;Cf^3TswMu-5ea4W|7Y6Sfky5_|bY%(&%N{_f9S=3gxuo5LFTynsEZCO=hBYQ^D2 zj%sIfU7@n2SKZDr{~(IoiW+BrmK#{1-z%lB;G0EZKq#gQf8q{mZJGt%4SC_;xnN8v jQ8PBL8kfA<YJMs4HT7-SCtlJZ=?!U0$3YrIG&<@(8*RW) literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/nwb/__pycache__/ecephys_nwb_extension_builder.cpython-37.pyc b/brain_observatory/ecephys/nwb/__pycache__/ecephys_nwb_extension_builder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bde23ee1dd141b9170cdbc387c2fb0eafa6a157 GIT binary patch literal 3525 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 TifKNV?Q;#wr<l$BM{$1wG;wRQ literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py b/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py new file mode 100644 index 0000000000..fbe4520c7a --- /dev/null +++ b/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py @@ -0,0 +1,155 @@ +from pynwb.spec import (NWBAttributeSpec, NWBDatasetSpec, + NWBGroupSpec, NWBNamespaceBuilder) + +# This is the script used to generate the AIBS ecephys NWB extension .yaml +# files. It can be run by installing pynwb and executing +# `nwb_extension_builder.py`. It will generate the .yaml extension files in +# the same directory which the script is run in. For more details see: +# https://pynwb.readthedocs.io/en/stable/extensions.html + +ns_builder = NWBNamespaceBuilder(doc="Allen Institute Ecephys Extension", + version="0.2.0", + name="ndx-aibs-ecephys", + author="Allen Institute for Brain Science", + contact="waynew@alleninstitute.org") + +probe_id_attr = NWBAttributeSpec(name="probe_id", + doc="Unique ID of the neuropixels probe", + dtype="int") + +# Ecephys probe device extension (inherits from NWB `Device`) +sampling_rate_attr = NWBAttributeSpec(name="sampling_rate", + doc="The sampling rate for the device", + dtype="float64") + +ecephys_probe_attributes = [sampling_rate_attr, probe_id_attr] + +ecephys_probe_ext = NWBGroupSpec(doc="A neuropixels probe device", + attributes=ecephys_probe_attributes, + neurodata_type_def="EcephysProbe", + neurodata_type_inc="Device") + +# Ecephys electrode group extension (inherits from NWB `ElectrodeGroup`) +has_lfp_data_attr = NWBAttributeSpec(name="has_lfp_data", + doc="Indicates availability of LFP data", + dtype="bool") + +lfp_sampling_rate = NWBAttributeSpec(name="lfp_sampling_rate", + doc=("The sampling rate at which data " + "were acquired on this electrode " + "group's channels"), + dtype="float64") + +ecephys_egroup_attributes = [has_lfp_data_attr, probe_id_attr, + lfp_sampling_rate] + +ecephys_egroup_ext = NWBGroupSpec(doc=("A group consisting of the channels " + "on a single neuropixels probe"), + attributes=ecephys_egroup_attributes, + neurodata_type_def="EcephysElectrodeGroup", + neurodata_type_inc="ElectrodeGroup") + +# Ecephys specimen metadata extension (inherits from NWB `Subject`) +specimen_name_attr = NWBAttributeSpec(name="specimen_name", + doc="Full name of specimen", + dtype="text") + +age_in_days_attr = NWBAttributeSpec(name="age_in_days", + doc="Age of specimen in days", + dtype="float") + +strain_attr = NWBAttributeSpec(name="strain", + doc="Specimen strain", + dtype="text") + +ecephys_specimen_attributes = [specimen_name_attr, age_in_days_attr, + strain_attr] + +ecephys_specimen_ext = NWBGroupSpec(doc="Metadata for ecephys specimen", + attributes=ecephys_specimen_attributes, + neurodata_type_def="EcephysSpecimen", + neurodata_type_inc="Subject") + +# Ecephys eye tracking rig metadata extension (inherits from `NWBDataInterface`) +rig_equipment_attr = NWBAttributeSpec(name="equipment", + doc="Description of rig", + dtype="text") + +unit_attr = NWBAttributeSpec('unit', 'Unit of measurement for the data', 'text') + +rig_monitor_position_dset = NWBDatasetSpec(name="monitor_position", + doc="position of monitor (x, y, z)", + attributes=[unit_attr], + dtype='float32', + dims=(3,)) + +rig_camera_position_dset = NWBDatasetSpec(name="camera_position", + doc="position of camera (x, y, z)", + attributes=[unit_attr], + dtype='float32', + dims=(3,)) + +rig_led_position_dset = NWBDatasetSpec(name="led_position", + doc="position of LED (x, y, z)", + attributes=[unit_attr], + dtype='float32', + dims=(3,)) + +rig_monitor_rotation_dset = NWBDatasetSpec(name="monitor_rotation", + doc="rotation of monitor (x, y, z)", + attributes=[unit_attr], + dtype='float32', + dims=(3,)) + +rig_camera_rotation_dset = NWBDatasetSpec(name="camera_rotation", + doc="rotation of camera (x, y, z)", + attributes=[unit_attr], + dtype='float32', + dims=(3,)) + +ecephys_eye_tracking_rig_metadata_ext = NWBGroupSpec( + doc="Metadata for ecephys experiment rig", + attributes=[rig_equipment_attr], + datasets=[rig_monitor_position_dset, + rig_camera_position_dset, + rig_led_position_dset, + rig_monitor_rotation_dset, + rig_camera_rotation_dset], + neurodata_type_def="EcephysEyeTrackingRigMetadata", + neurodata_type_inc="NWBDataInterface" +) + +# Ecephys CSD extension +csd_timeseries_group = NWBGroupSpec(doc="A timeseries containing current source density (CSD) data", + neurodata_type_inc="TimeSeries") + +csd_virtual_electrode_vertical_positions = NWBDatasetSpec(name="virtual_electrode_y_positions", + doc="Virtual vertical positions of electrodes from which CSD was calculated", + attributes=[unit_attr], + dtype='float32', + shape=(None,)) + +csd_virtual_electrode_horizontal_positions = NWBDatasetSpec(name="virtual_electrode_x_positions", + doc="Virtual horizontal positions of electrodes from which CSD was calculated", + attributes=[unit_attr], + dtype='float32', + shape=(None,)) + +ecephys_csd_ext = NWBGroupSpec( + doc="A group containing current source density (CSD) data and virtual electrode locations", + groups=[csd_timeseries_group], + datasets=[csd_virtual_electrode_horizontal_positions, + csd_virtual_electrode_vertical_positions], + neurodata_type_def="EcephysCSD", + neurodata_type_inc="NWBDataInterface" +) + +ext_source = "ndx-aibs-ecephys.extension.yaml" +ns_builder.add_spec(ext_source, ecephys_probe_ext) +ns_builder.add_spec(ext_source, ecephys_egroup_ext) +ns_builder.add_spec(ext_source, ecephys_specimen_ext) +ns_builder.add_spec(ext_source, ecephys_eye_tracking_rig_metadata_ext) +ns_builder.add_spec(ext_source, ecephys_csd_ext) + +namespace_path = "ndx-aibs-ecephys.namespace.yaml" +ns_builder.export(namespace_path) diff --git a/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml b/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml new file mode 100644 index 0000000000..1fe62578f4 --- /dev/null +++ b/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml @@ -0,0 +1,126 @@ +groups: +- neurodata_type_def: EcephysProbe + neurodata_type_inc: Device + doc: A neuropixels probe device + attributes: + - name: sampling_rate + dtype: float64 + doc: The sampling rate for the device + - name: probe_id + dtype: int + doc: Unique ID of the neuropixels probe +- neurodata_type_def: EcephysElectrodeGroup + neurodata_type_inc: ElectrodeGroup + doc: A group consisting of the channels on a single neuropixels probe + attributes: + - name: has_lfp_data + dtype: bool + doc: Indicates availability of LFP data + - name: probe_id + dtype: int + doc: Unique ID of the neuropixels probe + - name: lfp_sampling_rate + dtype: float64 + doc: The sampling rate at which data were acquired on this electrode group's channels +- neurodata_type_def: EcephysSpecimen + neurodata_type_inc: Subject + doc: Metadata for ecephys specimen + attributes: + - name: specimen_name + dtype: text + doc: Full name of specimen + - name: age_in_days + dtype: float + doc: Age of specimen in days + - name: strain + dtype: text + doc: Specimen strain +- neurodata_type_def: EcephysEyeTrackingRigMetadata + neurodata_type_inc: NWBDataInterface + doc: Metadata for ecephys experiment rig + attributes: + - name: equipment + dtype: text + doc: Description of rig + datasets: + - name: monitor_position + dtype: float32 + dims: + - 3 + shape: + - null + doc: position of monitor (x, y, z) + attributes: + - name: unit + dtype: text + doc: Unit of measurement for the data + - name: camera_position + dtype: float32 + dims: + - 3 + shape: + - null + doc: position of camera (x, y, z) + attributes: + - name: unit + dtype: text + doc: Unit of measurement for the data + - name: led_position + dtype: float32 + dims: + - 3 + shape: + - null + doc: position of LED (x, y, z) + attributes: + - name: unit + dtype: text + doc: Unit of measurement for the data + - name: monitor_rotation + dtype: float32 + dims: + - 3 + shape: + - null + doc: rotation of monitor (x, y, z) + attributes: + - name: unit + dtype: text + doc: Unit of measurement for the data + - name: camera_rotation + dtype: float32 + dims: + - 3 + shape: + - null + doc: rotation of camera (x, y, z) + attributes: + - name: unit + dtype: text + doc: Unit of measurement for the data +- neurodata_type_def: EcephysCSD + neurodata_type_inc: NWBDataInterface + doc: A group containing current source density (CSD) data and virtual electrode + locations + datasets: + - name: virtual_electrode_x_positions + dtype: float32 + shape: + - null + doc: Virtual horizontal positions of electrodes from which CSD was calculated + attributes: + - name: unit + dtype: text + doc: Unit of measurement for the data + - name: virtual_electrode_y_positions + dtype: float32 + shape: + - null + doc: Virtual vertical positions of electrodes from which CSD was calculated + attributes: + - name: unit + dtype: text + doc: Unit of measurement for the data + groups: + - neurodata_type_inc: TimeSeries + doc: A timeseries containing current source density (CSD) data diff --git a/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml b/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml new file mode 100644 index 0000000000..9e87f91b99 --- /dev/null +++ b/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml @@ -0,0 +1,9 @@ +namespaces: +- author: Allen Institute for Brain Science + contact: waynew@alleninstitute.org + doc: Allen Institute Ecephys Extension + name: ndx-aibs-ecephys + schema: + - namespace: core + - source: ndx-aibs-ecephys.extension.yaml + version: 0.2.0 diff --git a/brain_observatory/ecephys/optotagging_table/__init__.py b/brain_observatory/ecephys/optotagging_table/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/optotagging_table/__main__.py b/brain_observatory/ecephys/optotagging_table/__main__.py new file mode 100644 index 0000000000..24c5813a22 --- /dev/null +++ b/brain_observatory/ecephys/optotagging_table/__main__.py @@ -0,0 +1,61 @@ +import pandas as pd + +from allensdk.brain_observatory.argschema_utilities import \ + ArgSchemaParserPlus, \ + write_or_print_outputs +from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import ( + EcephysSyncDataset, +) +from ._schemas import InputParameters, OutputParameters + + +def build_opto_table(args): + opto_file = pd.read_pickle(args['opto_pickle_path']) + sync_file = EcephysSyncDataset.factory(args['sync_h5_path']) + + start_times = sync_file.extract_led_times() + conditions = [str(item) for item in opto_file['opto_conditions']] + levels = opto_file['opto_levels'] + + assert len(conditions) == len(levels) + if len(start_times) > len(conditions): + raise ValueError( + f"there are {len(start_times) - len(conditions)} extra " + f"optotagging sync times!") + + optotagging_table = pd.DataFrame({ + 'start_time': start_times, + 'condition': conditions, + 'level': levels + }) + optotagging_table = optotagging_table.sort_values(by='start_time', axis=0) + + stop_times = [] + names = [] + conditions = [] + for ii, row in optotagging_table.iterrows(): + condition = args["conditions"][row["condition"]] + stop_times.append(row["start_time"] + condition["duration"]) + names.append(condition["name"]) + conditions.append(condition["condition"]) + + optotagging_table["stop_time"] = stop_times + optotagging_table["stimulus_name"] = names + optotagging_table["condition"] = conditions + optotagging_table["duration"] = \ + optotagging_table["stop_time"] - optotagging_table["start_time"] + + optotagging_table.to_csv(args['output_opto_table_path'], index=False) + return {'output_opto_table_path': args['output_opto_table_path']} + + +def main(): + mod = ArgSchemaParserPlus(schema_type=InputParameters, + output_schema_type=OutputParameters) + output = build_opto_table(mod.args) + + write_or_print_outputs(data=output, parser=mod) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/ecephys/optotagging_table/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/optotagging_table/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de2f296d62e001825da3f87ed349a94b491c0323 GIT binary patch literal 220 zcmYL@zX}2|490ulAi_O}gWljKBK}#$McfJ{y@s>gnU-r+ZglWToO~r$AHmJZbPzxI zehDF8$SThVf<^Z$r20zuDdT3r4n2kuJ2A|*57DOaAD`QLD)#}~AmIRJtl<LG$t6MQ z$iPG*or829DU?j-4_%NOt7WheM;^)=D&%a_@P?@i-GU|MG+#VJbZu8)i78Y#A6<m1 evQ()Ey1_yzOExMs_T95TJ34b}aGu_Kv&9$e>_OT9 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/optotagging_table/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/optotagging_table/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..364f6f0e1628ea50e2b0629daf92fcbecb456288 GIT binary patch literal 1934 zcmaJ?&2Jk;6rcU@dcAfW$4x^G5(KG2_<(~1NC-uR(hmt#m5PWWja;q9J5y(y_3n0N zoW|7}2~v(da0aAQoVfGX?3Gjh0S-O!n{m=cMPjY_cyHdkd0)ThFW1&0f-nE$NA^#X zkiQLa_PN-6fuZhV;)FXHp$=9zb7vm)W<K>D!}qerET94QK5t~rSxCcKi?%=qy!nLC zh=;s|wJkb4I&kH;qJ2zo>g<tW`#E%z+e5d$a8*wCl6^5_cbHT{-pS^w-g+ccE#gAP zrA%`j7js?CwHi8g|3)Ip{e{|F<jHlWnG*WB169zp{#6bkXkjy<g;aI#8++{)Coz)d z>tF;J*D%yAa5Xt`DwsAP&zz;B-4hR#Ybm#KPyA<O>2Z(yPe|qP#(-QW$IjBnJ{XW? zLpLh_*umU5b`D(itqy)NlxKN3Iq>BVy2+d8d6&qqgonRF2D0QNth~yv8oc$J2MdBK zc+lbzZ}ZMmcNt8{vWXF5_(ylE;3Rqm3+{bAc9*SX1WVTjq>6ZVKwwR~YM!(~Mc}ph z`hdIvpBz$!;I?_s_yo$g6mA&m;a}gAs#yhmV;6E*`&fOfU98|jQ(*L6GV8kGJ?P-o z3j@M8`NgL$l6ql9rzW{uw`s2^brF|oa*&C*WO|==6fzd?e`2YZi7>V1W9*qkY+{;{ zirniU1qk%9^Nah?-y?q#B;He6BFXOP!`eq}%wz~@JH7b%+GpeMP&#VN_8A{d*dvxN z##eKe6gg)fjYWQ_#ziS|m0&JR`HXL+ld*!H4@#CCu&Kb^EQ16;*qKO{=5aBB#zUqH zx!4h_n%gl>X*Qjv`83vSl8K!-o*ChIR4!gbyIHDqQq0OL8^#^uTR<LPp3KvX$2K7L z(r7m;5|*he*qmLU>-O9joa(g56>VEaCJsfW9!Gj#NU_Z@9>2XUj<jUk=Zx7lvEA0` zOsIE<UL7gTq>c?;w_d8O8&;X@nz*eXL*2=O`s^rGb@WnB$#qE7A)iZTOsV}GfTAs> zi_+?(YYM98z-eqxwpQpo=b_E<O(d<6=3E>N*J`)qv@HeWr!^r>((C4ZmY4w34eL^( z<4kb-hN?YeqwZc+$bzxrhLnY@qq{7d3%jQ+1OJ-_?6j>4_<Ly16b+G82tQJFz)B>Y z(*UKIsKa5W_L-b2+Ona&pJv7@Q<Zkxeibz(O#*4Kiay;q7wT2sDMEZ24OKTx6jbe| zY3<=%8@^Z7DNV1bd#@LP;i^wD5vS{P-O%Yfp}Xny9M^f%^D(<l<aS-(F~2_eTafER z4nKF(?K|=v+)a!E^PS<yHnjJ^&_tt+aR=>#Xf(42XhT3%qcUyIwU7nqh8|il!e{$$ ztQV!A{nKoo;{kR)N3iRlv@LoVNb{aF9aQ4qgIHVSTW05Bg1k2?cpa=%y&enSK;~n} zDFa~w|3dgGFJoVaXMh^6QM?BDDtQqHbaV#K(SP7MGD%%|FxP1Y{0Ox&&=^BM|DT(u zz#f?bh|^+pO2@V;jLZ0Yv877Gc=d#O-Rm>6O%cTLIbUsmvdIs35si5!t{BuQgTK)2 Oc^$9kh3|)9===-#gBvOU literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/optotagging_table/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/optotagging_table/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb7708ef0c564e63ebfc1da0195cb6a25e77fa53 GIT binary patch literal 1900 zcmZuyOK%%D5Z={3w0gyB$9B>pEqF+QZi`rXz?IcFi0EJq>?u8Jrpq7-h@V-J) zHmshCq(}dQ+<NLIKZv)Yr`~$*r5$qhu$@TYXlD4D`Q{tyS+Cc&;8XnmEBVi}tiQCe z{4_y1gdyI6pcb_=E4Q(oH*mw&b|Z6g7rRDxGB5YBpEq$c4{(sTa4T=)cHY4qn0Kj1 zecF8M(15mR+i0DY=F%?h8Q-n9F7Cdt=mrhnSTtnrYX|qh-lSV#Z!sI}TVUU&+hA{- z`3<ml=q}j1Yy;*)dgs`R?*0uiTTw%`p7P0YGG#eY8!PoE!Uf}zt$IgnOlFy^S46(@ z2TVvtRq(Q?X7VWI%0HGoEhftQE-Q&t?opaZ<-9E9MBiXp{~X}Xm<SnHvrI5C-+jEd zk8*)(6A_6XJw)HnBS!^v#)(YJLb(OWnQA3vK~wFR{IdP-#h-I|fIYKqzC)0JOEZSV zs~O>}K5en=%>nLlk_txSq=aQ`es4;$@q>!-w4|sUBZBG)bWYA#<SP52vL7k?v9g~e zb=0+V;O7vA_yPp8uuU!8U=Fou<I=`1^A?)F(wfu(bY0bYzKs0@U<^2WHA^|8gD6lz z9P9MrSheFgFX=4PdN+<CldPWM0o=zsT4<8-t`<EIe^~sE*0uQex949Ee}+1VA(;}o zHzMbxxEMYyh{laP8M5L`49kiYA^}-e(+e^DAsr1xD%pdIB&TG;U~iVe3VPZf0cJ&9 zj^M;IB1?YJX9?4r`eh|cNhT9OJeFjXv3@KJWyD@}!M7lmPhkijL}0h!Ykb#`gx;x< zd<M#OB&l=R04z1CuF*ZCdq($JlQ}G4t=BedQ~%Pz9ohth1GQlo2uuYmC4g`;?^i@l zku1?T1!4dQ5)y)#(Utg7T8vAc8=6H8ejB1u?v!QKe1Exny8qq*;-W}+S)_Bb@9G)z zujG_nyFkb^pJnwz0~R_@vkZ+GI_IgBtUy!78IYn$>)skfUA_%*@Et97wa`V!p$<E) z(&Q8fqJzU-9Y;LfH<sEhXA*iaHp|RS#?M>&1dX?;f(lQI^1OgfSoD&>?X|vUQ?1?A z+dcwuABNB@4D7D?8t;co`Y|k9mz24>DWG@`_NWV`@>KUn6KVa3%s)4UL)EHsNJCgR z0yLyRd{zKva(V*KQ-?B<@U+sefT`9X@^7MLa@9fOFx9UTz_2962lLZp{St;~fCy}^ z?Q5C2;5dXKG#u;97I^_#7kPzsUROEz*^)(9IrknV7R=)sxk2RJOvv>7J(&Ao_y{KY zFqYwKdk}5n7U7e+ExAsN>&FXkuAF;|mgPD-9IpN2lx0-ZjL|JzKRM<FGE~xkfcz6J ubf+607|1x%=IS|G6G#Q$)Ybgfh803nDFhB7uVFWA-?=HfUg(F-(ET5=e(WOv literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/optotagging_table/_schemas.py b/brain_observatory/ecephys/optotagging_table/_schemas.py new file mode 100644 index 0000000000..cb300838ce --- /dev/null +++ b/brain_observatory/ecephys/optotagging_table/_schemas.py @@ -0,0 +1,48 @@ +from argschema import ArgSchema, ArgSchemaParser +from argschema.schemas import DefaultSchema +from argschema.fields import Nested, InputDir, String, Float, Dict, Int + + +known_conditions = { + "0": { + "duration": 1.0, + "name": "fast_pulses", + "condition": "2.5 ms pulses at 10 Hz" + }, + "1": { + "duration": 0.005, + "name": "pulse", + "condition": "a single square pulse" + }, + "2": { + "duration": 0.01, + "name": "pulse", + "condition": "a single square pulse" + }, + "3": { + "duration": 1.0, + "name": "raised_cosine", + "condition": "half-period of a cosine wave" + } +} + + +class Condition(DefaultSchema): + duration = Float(required=True) + name = String(required=True) + condition = String(required=True) + + +class InputParameters(ArgSchema): + opto_pickle_path = String(required=True, help='path to file containing optotagging information') + sync_h5_path = String(required=True, help='path to h5 file containing syncronization information') + output_opto_table_path = String(required=True, help='the optotagging stimulation table will be written here') + conditions = Dict(String, Nested(Condition), default=known_conditions) + + +class OutputSchema(DefaultSchema): + input_parameters = Nested(InputParameters, description=('Input parameters the module was run with'), required=True) + + +class OutputParameters(OutputSchema): + output_opto_table_path = String(required=True, help='path to optotagging stimulation table') \ No newline at end of file diff --git a/brain_observatory/ecephys/stimulus_analysis/__init__.py b/brain_observatory/ecephys/stimulus_analysis/__init__.py new file mode 100644 index 0000000000..e5c88f5b3c --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/__init__.py @@ -0,0 +1,7 @@ +from .static_gratings import StaticGratings +from .natural_scenes import NaturalScenes +from .drifting_gratings import DriftingGratings +from .flashes import Flashes +from .dot_motion import DotMotion +from .natural_movies import NaturalMovies +from .receptive_field_mapping import ReceptiveFieldMapping \ No newline at end of file diff --git a/brain_observatory/ecephys/stimulus_analysis/__main__.py b/brain_observatory/ecephys/stimulus_analysis/__main__.py new file mode 100644 index 0000000000..e5197864ef --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/__main__.py @@ -0,0 +1,215 @@ +import logging +import os +import pathlib +import time + +import numpy as np +import pandas as pd +from argschema import ArgSchemaParser + +from allensdk.brain_observatory.argschema_utilities import \ + write_or_print_outputs +from .dot_motion import DotMotion +from .drifting_gratings import DriftingGratings +from .flashes import Flashes +from .natural_movies import NaturalMovies +from .natural_scenes import NaturalScenes +from .receptive_field_mapping import ReceptiveFieldMapping +from .static_gratings import StaticGratings +from ..ecephys_session import EcephysSession + +try: + from mpi4py import MPI + + comm = MPI.COMM_WORLD + MPI_rank = comm.Get_rank() + MPI_size = comm.Get_size() + barrier = comm.Barrier + gather = comm.gather +except ModuleNotFoundError: + # Run without mpi4py installed + MPI_rank = 0 + MPI_size = 1 + barrier = lambda: None # noqa F841 + gather = lambda data, root: data # noqa F841 + +logger = logging.getLogger(__name__) + +# Map between json file subsections and StimAnalysis subclass +# TODO: Try to order this list by how long each subclass takes to finish. +# Helps spread work evenly across cores +stim_classes = [ + ('receptive_field_mapping', ReceptiveFieldMapping), + ('drifting_gratings', DriftingGratings), + ('dot_motion', DotMotion), + ('static_gratings', StaticGratings), + ('natural_scenes', NaturalScenes), + ('natural_moves', NaturalMovies), + ('flashes', Flashes), +] + + +def log_info(message, all_ranks=False): + if all_ranks or MPI_rank == 0: + logger.info(message) + + +def load_session(nwb_path, stimulus_class, **session_params): + session = EcephysSession.from_nwb_path(nwb_path, api_kwargs={ + "amplitude_cutoff_maximum": np.inf, + "presence_ratio_minimum": -np.inf, + "isi_violations_maximum": np.inf, + "filter_by_validity": False + # actually you probably still want this one + }) + return stimulus_class(session, **session_params) + + +""" +NOTE: There are two version of caclulate_stimulus_metrics, both should +produce the same results but have different ways +of working across multiple cores. The best one to use will depend on the +data and the limitations of lims/ + +caclulate_stimulus_metrics_ondisk - each core calculates the individual +metrics and saves them to a temporary csv file. +Rank 0 then reads each csv and cobmines them into the final result. A more +memory efficient way, however will be slower +due to the cost of reading/writing to disk multiple times. + +caclulate_stimulus_metrics_gather - runs each metric across different cores, +but uses the MPI Gather() method to send +all the combined dataframes to Rank 0 where it is collolated and saved to +disk. Should run faster but can use up to +2x the amount of memory. +""" + + +def calculate_stimulus_metrics_ondisk(args): + """Runs the individual metrics for a given session, combines and saves + them into a single table. + + Same as below except pass the metric tables between ranks by + writing/reading to a file. + """ + log_info('ecephys: stimulus metrics module') + start = time.time() + + input_session_nwb = args['input_session_nwb'] + output_file = args['output_file'] + + # For each stimulus class that needs to be processed; calculate and save + # the metrics on a different rank (unless + # MPI_size is small and one rank has to process two or more metrics). + def _temp_csv_file(stim_class): + # filename to save temporary stim_analysis csv files before being + # merged into final + output_dir = pathlib.Path(output_file).parents[0] + session_name = pathlib.Path(input_session_nwb).stem + return os.path.join(output_dir, + '{}.{}.csv'.format(session_name, stim_class)) + + relevant_stim_class = [(sc[0], sc[1], _temp_csv_file(sc[0])) + for sc in stim_classes if sc[ + 0] in args] # only stims specified in the + # input json + for sc_name, stim_class, tmp_csv in relevant_stim_class[ + MPI_rank::MPI_size]: + analysis_obj = load_session(input_session_nwb, stim_class, + **args[sc_name]) + # analysis_obj = stim_class(input_session_nwb, **args[sc_name]) + analysis_obj.metrics.to_csv(tmp_csv) + + barrier() # wait till all the csv files have been created + + # Have the first rank go through all the created csv files and merge + # into one + if MPI_rank == 0: + final_table = pd.read_csv(relevant_stim_class[0][2]) + for _, _, tmp_csv in relevant_stim_class[1:]: + tmp_table = pd.read_csv(tmp_csv) + final_table = pd.merge(final_table, tmp_table, on='unit_id') + + final_table.to_csv(output_file) + + # Delete the temporary files + for _, _, tmp_csv in relevant_stim_class: + if os.path.exists(tmp_csv): + try: + os.remove(tmp_csv) + except Exception: + pass + + barrier() + + execution_time = time.time() - start + log_info(f'total time: {str(np.around(execution_time, 2))} seconds') + return {"execution_time": execution_time} + + +def calculate_stimulus_metrics_gather(args): + """Runs the individual metrics for a given session, combines and saves + them into a single table. + + Same as above but uses MPI Gather to send the dataframes across ranks + """ + log_info('ecephys: stimulus metrics module') + start = time.time() + + input_session_nwb = args['input_session_nwb'] + output_file = args['output_file'] + + # Divide the work across the ranks, calculate each metric and combine + # all the result on each rank. + combined_df = None + relevant_stim_class = [(sc[0], sc[1]) for sc in stim_classes if + sc[0] in args] # metrics for this rank + if MPI_rank < len(relevant_stim_class): + for sc_name, stim_class in relevant_stim_class[MPI_rank::MPI_size]: + analysis_obj = load_session(input_session_nwb, stim_class, + **args[sc_name]) + analysis_df = analysis_obj.metrics + + if combined_df is None: + combined_df = analysis_df + else: + combined_df = pd.merge(combined_df, analysis_df, on='unit_id') + + barrier() + + if MPI_size == 1: + combined_df.to_csv(output_file) + execution_time = time.time() - start + return {"execution_time": execution_time} + + # Use MPI Gather to send the combined_df on each rank to Rank 0 where it + # will be collolated and saved + all_ranks_data = gather(combined_df, root=0) + if MPI_rank == 0: + final_df = all_ranks_data[0] + for df in all_ranks_data[1:]: + if df is None: + continue + final_df = pd.merge(final_df, df, on='unit_id') + + final_df.to_csv(output_file) + + barrier() + execution_time = time.time() - start + return {"execution_time": execution_time} + + +def main(): + from ._schemas import InputParameters, OutputParameters + + mod = ArgSchemaParser(schema_type=InputParameters, + output_schema_type=OutputParameters) + # output = calculate_stimulus_metrics_ondisk(mod.args) + output = calculate_stimulus_metrics_gather(mod.args) + if MPI_rank == 0: + write_or_print_outputs(data=output, parser=mod) + barrier() + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb833a3b508426a0cfe46bf85cd76a633d48eac6 GIT binary patch literal 588 zcmY*WyG|o96rIUyG9eS7Sn&-hAO+oOh1dl_Lnt;vLe@yu&DcpS{219z(3BK>$yWPI zv{d{871s_3@W^M5&wU-se~My|;L`sdV4Nn&b2xmg7Lrrk?iPV1ER~5$Nty=Uk}cIH z?a14*qq?LUc}MnCMzYAevafQIN8XbIwL^9y&*V@Qq(I)ECFA@B=O*LyX*BcTMRjQr z_0pkIT!UX*kh6+w9)!JfD;6R8B`Ld*;8ro5pBq0lUKstQcxpBxMt}U}6|cS6@C(5u zn?hY<r|a>E?7BFaF5gGnaC0)!+v(KB@wOerefI9)Gr1G=Y_WA=yWuoo##0rY*xt8Z zD!Q>*5D)B!A-V{TsM=bxeT@E3Y>vMOua9Rx%Nxh7D`5rfXb$(FoAS4Y%4i11CD$8Q znwo1@A)0#CxbjNOOD8-(tf9JtCC6GRF@xPr<`#seW{w><;Eio2!3Y*joEK^>*N%b) g**M`QlnO08rAKx1)c>UnTT6ZtUd#;<hUw?`2I;@9YXATM literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b6bc4059f85fdbd35efe2afcbb23e70421966ea GIT binary patch literal 5042 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2b97f215e195654f8a7798d29bdc704d962c5d7 GIT binary patch literal 4129 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 AEC2ui literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/dot_motion.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/dot_motion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d36803ac334adbcc8bfa3d0f0cbd04da0c02791 GIT binary patch literal 8561 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 GGye_E;5wlI literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/drifting_gratings.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/drifting_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..592154387c97e38acc3282a459ea63d3a8051578 GIT binary patch literal 20723 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/flashes.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/flashes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21b5d1e20cf601c6de255198270b7a73aa3aa88b GIT binary patch literal 8551 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 Sxt{-3U{98iiEf%T^M3$-S(};w literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_movies.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_movies.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2920478ddabdea76fbf128b6c81b143404513202 GIT binary patch literal 4284 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_scenes.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_scenes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12072e3961becdda0e245c37e32e0170a0ebafea GIT binary patch literal 7499 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%0D05rv$+3GIiZ1eSNs+}F zP+C%$ezd1x)WgJxFcZiuAV<ce#cp2%2#5m>;q(JV`f$MkUiD3@>aUFr-h&892-*{@ zEYh3$27T#CWYF|i(ae{4%1PHUufic5DAV!^>3S2x^etYHWt0hYhE?@H;{9)NbNp?& ztM=h*=aBgeYeB8i*=Ta2v90e=wL+O0ino!OX#|Dlp>{I}K1Kqpd{YYonYM#~^9Xsp zObH&aGU4!%ZM=S&W*1bvLIrJEZ&E=abUw?u5$J~9RO+{=n^=Z7lh2izleU6&3{Lk8 zm=y9C97YZbu_7li>dT%pztZ%Y^=7SEL0LyR+kC0%)oYw`D!7V;7vIpgWEzOe%svXZ zGZYY6W_gIT+McD?GMhpp__i+jwx}VdM=p|P?w+IHB*BA!TOo^j<e?Y*H+0tE(LHai zSQo9M%7nLDA#eAnDk}(4?BnVXV!mRnQ4m=T9|6)22Vs&$9pqF60^Tu$DiI>>ir6bE za_4-4=8D(}4f2jirT%abA;XJOr`=Fc<}%*6BHp-m?VB6omS9ezVEP)TFzN3GQ>1B; z)Z}@KM42=!90sQ@l2r6CP9q@<zUS;G$;^iMXqWQRQIQc%)Bp+8BF}p|M+&$_Qoqzf zQO3)0R(Utvr|nEcQH1QexGLV*+!B|sZ(QSq@RsPNpaK%fuuiQqpZ^2O$|;~K;9nhI zJpHL48gT>p<1*pHVN>yez;%mUtuDw$!%4(PNkU$XfN3H>Wr~W_1N~Vs(hS9Zd9|^i zV=d@K?xXp)#;J>J7gO)1u`CY2(0>t<cC<5y&^cNc*>@zQqaFMi0#aU<suRL%rg7J= zT>~-rpNryv`yukCWvci?g$#BwMTmk5oUkvH+6}>*A7eX1^z!tG#=KP?_k<*)i<_^p z>7rgrp|DR$dYuD-<s*dJ#|Qz2_MSH#!8oN&A>CQ}O}UMLC7+!*r$V6FOpu%Z2i&8G z<*Q#%Q|Cr2gsWA9>52|jv7(!VN$&O{D#C{_UP#Zw&3T^(>JLyAderM+jE^#WnA`XL zYH?h?tF!wI3o3>OGrD*1+3#?h6%^LevQzaqrgl6yEi1^6Y8ru0zE9PHUjcg{y-H@) zulDf|M`&`VFY_AtT;RIAj@&T$bjDvA+2ry6M%u+^dDBGne@gM6Mn3o50sUj~QSnti z16Tb$cHi_J4A$SEf^-?<IMtJ<1kUR>*?m-RlfPuh11z%wPSc%t8}8!ItfjvIMH`1D literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/receptive_field_mapping.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/receptive_field_mapping.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b119500c55906ad4515282591244b8970555c35b GIT binary patch literal 18406 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/static_gratings.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/static_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0870fdc1b0ec1fd49aac41f2ccef364017e54c32 GIT binary patch literal 16793 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 XEWpkx={bG&%gUFP&CDlrrHt{vOnGj| literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/stimulus_analysis.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/stimulus_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32d87579a4baa582d2bd2c6c213d8258ddfd666c GIT binary patch literal 25683 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_analysis/_schemas.py b/brain_observatory/ecephys/stimulus_analysis/_schemas.py new file mode 100644 index 0000000000..5403ebfede --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/_schemas.py @@ -0,0 +1,83 @@ +from argschema import ArgSchema +from argschema.schemas import DefaultSchema +from argschema.fields import Nested, String, Float, List, Int + +from .drifting_gratings import DriftingGratings +from .static_gratings import StaticGratings +from .natural_scenes import NaturalScenes +from .dot_motion import DotMotion +from .flashes import Flashes +from .receptive_field_mapping import ReceptiveFieldMapping + + +class DriftingGratings(DefaultSchema): + stimulus_key = List(String, default=DriftingGratings.known_stimulus_keys(), help='Key for the drifting gratings stimulus') + trial_duration = Float(default=2.0, help='typical length of a epoch for given stimulus in seconds') + psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') + + + +class StaticGratings(DefaultSchema): + stimulus_key = List(String, default=StaticGratings.known_stimulus_keys(), help='Key for the static gratings stimulus') + trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') + psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') + + +class NaturalScenes(DefaultSchema): + stimulus_key = List(String, default=NaturalScenes.known_stimulus_keys(), help='Key for the natural scenes stimulus') + trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') + psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') + + +#class NaturalMovies(DefaultSchema): +# stimulus_key = String(help='Key for the natural movies stimulus') +# trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') + + +class DotMotion(DefaultSchema): + stimulus_key = List(String, default=DotMotion.known_stimulus_keys(), help='Key for the dot motion stimulus') + trial_duration = Float(default=1.0, help='typical length of a epoch for given stimulus in seconds') + psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') + + +#class ContrastTuning(DefaultSchema): +# stimulus_key = String(help='Key for the contrast tuning stimulus') +# trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') + + +class Flashes(DefaultSchema): + stimulus_key = List(String, default=Flashes.known_stimulus_keys(), help='Key for the flash stimulus') + trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') + psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') + + +class ReceptiveFieldMapping(DefaultSchema): + stimulus_key = List(String, default=ReceptiveFieldMapping.known_stimulus_keys(), help='Key for the receptive field mapping stimulus') + trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') + minimum_spike_count = Int(default=10, help='Minimum number of spikes for computing receptive field parameters') + mask_threshold = Float(default=1.0, help='Threshold (as fraction of peak) for computing receptive field mask') + stimulus_step_size = Float(default=10.0, help='Distance between stimulus locations in degrees') + + +class InputParameters(ArgSchema): + drifting_gratings = Nested(DriftingGratings) + static_gratings = Nested(StaticGratings) + natural_scenes = Nested(NaturalScenes) + # natural_movies = Nested(NaturalMovies) + dot_motion = Nested(DotMotion) + # contrast_tuning = Nested(ContrastTuning) + flashes = Nested(Flashes) + receptive_field_mapping = Nested(ReceptiveFieldMapping) + + input_session_nwb = String(required=True, help='Ecephys spiking nwb file for session') + output_file = String(required=True, help='Location for saving output file') + + +class OutputSchema(DefaultSchema): + input_parameters = Nested(InputParameters, + description=("Input parameters the module was run with"), + required=True) + + +class OutputParameters(OutputSchema): + execution_time = Float() diff --git a/brain_observatory/ecephys/stimulus_analysis/dot_motion.py b/brain_observatory/ecephys/stimulus_analysis/dot_motion.py new file mode 100644 index 0000000000..feb7aab081 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/dot_motion.py @@ -0,0 +1,216 @@ +import warnings +import numpy as np +import pandas as pd +import logging +import matplotlib.pyplot as plt + +from .stimulus_analysis import StimulusAnalysis + + +warnings.simplefilter(action='ignore', category=FutureWarning) + +logger = logging.getLogger(__name__) + + +class DotMotion(StimulusAnalysis): + """ + A class for computing single-unit metrics from the dot motion stimulus of an ecephys session NWB file. + + To use, pass in a EcephysSession object:: + session = EcephysSession.from_nwb_path('/path/to/my.nwb') + dm_analysis = DotMotion(session) + + or, alternatively, pass in the file path:: + dm_analysis = DotMotion('/path/to/my.nwb') + + You can also pass in a unit filter dictionary which will only select units with certain properties. For example + to get only those units which are on probe C and found in the VISp area:: + dm_analysis = DotMotion(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) + + or a list of unit_ids: + dm_analysis = DotMotion(session, filter=[914580630, 914580280, 914580278]) + + To get a table of the individual unit metrics ranked by unit ID:: + metrics_table_df = dm_analysis.metrics() + + """ + def __init__(self, ecephys_session, col_dir='Dir', col_speeds='Speed', trial_duration=1.0, **kwargs): + super(DotMotion, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) + + self._dirvals = None + self._number_dir = None + self._speedvals = None + self._number_speed = None + + self._col_dir = col_dir + self._col_speed = col_speeds + + if self._params is not None: + self._params = self._params['dot_motion'] + self._stimulus_key = self._params['stimulus_key'] + #else: + # self._stimulus_key = 'motion_stimulus' + + @property + def name(self): + return 'Dot Motion' + + @property + def directions(self): + if self._dirvals is None: + self._get_stim_table_stats() + + return self._dirvals + + @property + def number_directions(self): + if self._number_dir is None: + self._get_stim_table_stats() + + return self._number_dir + + @property + def speeds(self): + if self._speedvals is None: + self._get_stim_table_stats() + + return self._speedvals + + @property + def number_speeds(self): + if self._number_speed is None: + self._get_stim_table_stats() + + return self._number_speed + + @property + def known_spontaneous_keys(self): + return ['dot_motion', "spontaneous_activity"] + + @property + def null_condition(self): + """ Stimulus condition ID for null stimulus (not used, so set to -1) """ + return -1 + + @property + def METRICS_COLUMNS(self): + return [('pref_speed_dm', np.float64), + ('pref_speed_multi_dm', bool), + ('pref_dir_dm', np.float64), + ('pref_dir_multi_dm', bool), + ('firing_rate_dm', np.float64), + ('fano_dm', np.float64), + ('time_to_peak_dm', np.float64), + ('lifetime_sparseness_dm', np.float64), + ('run_mod_dm', np.float64), + ('run_pval_dm', np.float64)] + + @property + def metrics(self): + if self._metrics is None: + logger.info('Calculating metrics for ' + self.name) + unit_ids = self.unit_ids + metrics_df = self.empty_metrics_table() + + if len(self.stim_table) > 0: + metrics_df['pref_speed_dm'] = [self._get_pref_speed(unit) for unit in unit_ids] + metrics_df['pref_speed_multi_dm'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_speed, self.speeds) for unit_id in unit_ids + ] + metrics_df['pref_dir_dm'] = [self._get_pref_dir(unit) for unit in unit_ids] + metrics_df['pref_dir_multi_dm'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_dir, self.directions) for unit_id in unit_ids + ] + metrics_df['firing_rate_dm'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] + metrics_df['fano_dm'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + # metrics_df['speed_tuning_idx_dm'] = [self._get_speed_tuning_index(unit) for unit in unit_ids] + metrics_df['time_to_peak_dm'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) for + unit in unit_ids] + metrics_df['lifetime_sparseness_dm'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] + metrics_df.loc[:, ['run_pval_dm', 'run_mod_dm']] = \ + [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + + + self._metrics = metrics_df + + return self._metrics + + @classmethod + def known_stimulus_keys(cls): + return ['motion_stimulus', 'dot_motion'] + + def _get_stim_table_stats(self): + """ Extract directions and speeds from the stimulus table """ + self._dirvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_dir] + != 'null'][self._col_dir].unique()) + self._number_dir = len(self._dirvals) + + self._speedvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_speed] + != 'null'][self._col_speed].unique()) + self._number_speed = len(self._speedvals) + + def _get_pref_speed(self, unit_id): + """ Calculate the preferred speed condition for a given unit + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + pref_speed : + stimulus speed driving the maximal response + """ + # TODO: Most of the _get_pref_*() methods can be combined into one method and shared among the classes + similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_speed] + == speed].tolist() for speed in self.speeds] + df = pd.DataFrame( + index=self.speeds, + data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in similar_conditions]} + ).rename_axis(self._col_speed) + + return df.idxmax().iloc[0] + + def _get_pref_dir(self, unit_id): + """Calculate the preferred direction condition for a given unit + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + pref_dir : float + stimulus direction driving the maximal response + """ + similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_dir] + == direction].tolist() for direction in self.directions] + df = pd.DataFrame( + index=self.directions, + data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in similar_conditions]} + ).rename_axis(self._col_dir) + + return df.idxmax().iloc[0] + + def _get_speed_tuning_index(self, unit_id): + """ Calculate the speed tuning for a given unit + + SEE: https://github.com/AllenInstitute/ecephys_analysis_modules/blob/master/ecephys_analysis_modules/modules/tuning/tuning_speed.py + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + speed_tuning : float + degree to which the unit's responses are modulated by stimulus speed + """ + # TODO: Not implemented yet. + return np.nan diff --git a/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py b/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py new file mode 100644 index 0000000000..4d91d1d18a --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py @@ -0,0 +1,751 @@ +import numpy as np +import pandas as pd +from six import string_types +import scipy.ndimage as ndi +import scipy.stats as st +from scipy.signal import welch +from scipy.optimize import curve_fit +from scipy.fftpack import fft +from scipy import signal +import logging + +import matplotlib.pyplot as plt + +from .stimulus_analysis import StimulusAnalysis, osi, dsi, deg2rad +from ...circle_plots import FanPlotter + +import warnings +warnings.simplefilter(action='ignore', category=FutureWarning) + + +logger = logging.getLogger(__name__) + + +class DriftingGratings(StimulusAnalysis): + """ + A class for computing single-unit metrics from the drifting gratings stimulus of an ecephys session NWB file. + + To use, pass in a EcephysSession object:: + session = EcephysSession.from_nwb_path('/path/to/my.nwb') + dg_analysis = DriftingGratings(session) + + or, alternatively, pass in the file path:: + dg_analysis = DriftingGratings('/path/to/my.nwb') + + You can also pass in a unit filter dictionary which will only select units with certain properties. For example + to get only those units which are on probe C and found in the VISp area:: + dg_analysis = DriftingGratings(session, filter={'location': 'probeC', 'structure_acronym': 'VISp'}) + + To get a table of the individual unit metrics ranked by unit ID:: + metrics_table_df = dg_analysis.metrics() + + """ + def __init__(self, ecephys_session, col_ori='orientation', col_tf='temporal_frequency', col_contrast='contrast', + trial_duration=2.0, **kwargs): + super(DriftingGratings, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) + + self._metrics = None + + self._orivals = None + self._number_ori = None + self._tfvals = None + self._number_tf = None + self._contrastvals = None + self._number_constrast = None + + self._col_ori = col_ori + self._col_tf = col_tf + self._col_contrast = col_contrast + + if self._params is not None: + # TODO: Need to make sure + self._params = self._params.get('drifting_gratings', {}) + self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars + else: + self._params = {} + + self._stim_table_contrast = None + + #stim_table = self.stim_table + #self._stim_table_contrast = stim_table[stim_table['stimulus_name'] == 'drifting_gratings_contrast'] + #self._stim_table = stim_table[stim_table['stimulus_name'] != 'drifting_gratings_contrast'] + self._conditionwise_statistics_contrast = None + self._stimulus_conditions_contrast = None + + + @property + def stim_table_contrast(self): + if self._stim_table_contrast is None: + stim_table = self.ecephys_session.stimulus_presentations + if 'drifting_gratings_contrast' in stim_table['stimulus_name'].unique(): + self._stim_table_contrast = stim_table[stim_table['stimulus_name'] == 'drifting_gratings_contrast'] + else: + self._stim_table_contrast = pd.DataFrame() + + return self._stim_table_contrast + + @property + def name(self): + return 'Drifting Gratings' + + @property + def orivals(self): + """ Array of grating orientation conditions """ + if self._orivals is None: + self._get_stim_table_stats() + + return self._orivals + + @property + def number_ori(self): + """ Number of grating orientation conditions """ + if self._number_ori is None: + self._get_stim_table_stats() + + return self._number_ori + + @property + def tfvals(self): + """ Array of grating temporal frequency conditions """ + if self._tfvals is None: + self._get_stim_table_stats() + + return self._tfvals + + @property + def number_tf(self): + """ Number of grating temporal frequency conditions """ + if self._tfvals is None: + self._get_stim_table_stats() + + return self._number_tf + + @property + def contrastvals(self): + """ Array of grating temporal frequency conditions """ + if self._contrastvals is None: + self._get_stim_table_stats() + + return self._contrastvals + + @property + def number_contrast(self): + """ Number of grating temporal frequency conditions """ + if self._number_contrast is None: + self._get_stim_table_stats() + + return self._number_contrast + + @property + def null_condition(self): + """ Stimulus condition ID for null (blank) stimulus """ + return self.stimulus_conditions[self.stimulus_conditions[self._col_tf] == 'null'].index + + @property + def stimulus_conditions_contrast(self): + """ Stimulus conditions for contrast stimulus """ + if self._stimulus_conditions_contrast is None: + # TODO: look into efficiency of using a table intersect instead. + contrast_condition_list = self.stim_table_contrast.stimulus_condition_id.unique() + + self._stimulus_conditions_contrast = self.ecephys_session.stimulus_conditions[ + self.ecephys_session.stimulus_conditions.index.isin(contrast_condition_list) + ] + + return self._stimulus_conditions_contrast + + @property + def conditionwise_statistics_contrast(self): + """ Conditionwise statistics for contrast stimulus """ + if self._conditionwise_statistics_contrast is None: + self._conditionwise_statistics_contrast = self.ecephys_session.conditionwise_spike_statistics( + self.stim_table_contrast.index.values, + self.unit_ids + ) + + return self._conditionwise_statistics_contrast + + @property + def METRICS_COLUMNS(self): + return [('pref_ori_dg', np.float64), + ('pref_ori_multi_dg', bool), + ('pref_tf_dg', np.float64), + ('pref_tf_multi_dg', bool), + ('c50_dg', np.float64), + ('f1_f0_dg', np.float64), + ('mod_idx_dg', np.float64), + ('g_osi_dg', np.float64), + ('g_dsi_dg', np.float64), + ('firing_rate_dg', np.float64), + ('fano_dg', np.float64), + ('lifetime_sparseness_dg', np.float64), + ('run_pval_dg', np.float64), + ('run_mod_dg', np.float64)] + + @property + def metrics(self): + + if self._metrics is None: + logger.info('Calculating metrics for ' + self.name) + unit_ids = self.unit_ids + metrics_df = self.empty_metrics_table() + + if len(self.stim_table) > 0: + metrics_df['pref_ori_dg'] = [self._get_pref_ori(unit) for unit in unit_ids] + metrics_df['pref_ori_multi_dg'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_ori, self.orivals) for unit_id in unit_ids + ] + metrics_df['pref_tf_dg'] = [self._get_pref_tf(unit) for unit in unit_ids] + metrics_df['pref_tf_multi_dg'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_tf, self.tfvals) for unit_id in unit_ids + ] + metrics_df['f1_f0_dg'] = [self._get_f1_f0(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['mod_idx_dg'] = [self._get_modulation_index(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['g_osi_dg'] = [self._get_selectivity(unit, metrics_df.loc[unit]['pref_tf_dg'], 'osi') + for unit in unit_ids] + metrics_df['g_dsi_dg'] = [self._get_selectivity(unit, metrics_df.loc[unit]['pref_tf_dg'], 'dsi') + for unit in unit_ids] + metrics_df['firing_rate_dg'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] + metrics_df['fano_dg'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['lifetime_sparseness_dg'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] + metrics_df.loc[:, ['run_pval_dg', 'run_mod_dg']] = [ + self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + + if len(self.stim_table_contrast) > 0: + metrics_df['c50_dg'] = [self._get_c50(unit) for unit in unit_ids] + + + self._metrics = metrics_df + + return self._metrics + + @classmethod + def known_stimulus_keys(cls): + return ['drifting_gratings', 'drifting_gratings_75_repeats'] + + def _get_stim_table_stats(self): + """ Extract orientations and temporal frequencies from the stimulus table """ + self._orivals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_ori] + != 'null'][self._col_ori].unique()) + self._number_ori = len(self._orivals) + + self._tfvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_tf] + != 'null'][self._col_tf].unique()) + self._number_tf = len(self._tfvals) + + self._contrastvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_contrast] + != 'null'][self._col_contrast].unique()) + self._number_contrast = len(self._contrastvals) + + def _get_pref_ori(self, unit_id): + """ Calculate the preferred orientation condition for a given unit + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + pref_ori : float + stimulus orientation driving the maximal response + """ + # TODO: Most of the _get_pref_*() methods can be combined into one method and shared among the classes + similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_ori] == ori].tolist() + for ori in self.orivals] + df = pd.DataFrame( + index=self.orivals, + data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in similar_conditions]} + ).rename_axis(self._col_ori) + + return df.idxmax().iloc[0] + + def _get_pref_tf(self, unit_id): + """ Calculate the preferred temporal frequency condition for a given unit + + Params: + ------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + pref_tf : float + stimulus temporal frequency driving the maximal response + """ + similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_tf] == tf].tolist() + for tf in self.tfvals] + df = pd.DataFrame( + index=self.tfvals, + data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in similar_conditions]} + ).rename_axis(self._col_tf) + + return df.idxmax().iloc[0] + + def _get_selectivity(self, unit_id, pref_tf, selectivity_type='osi'): + """ Calculate the orientation or direction selectivity for a given unit + + Params: + ------- + unit_id - unique ID for the unit of interest + pref_tf - preferred temporal frequency for this unit + selectivity_type - 'osi' or 'dsi' + + Returns: + ------- + selectivity - orientation or direction selectivity value + + """ + orivals_rad = deg2rad(self.orivals).astype('complex128') + + condition_inds = self.stimulus_conditions[self.stimulus_conditions[self._col_tf] == pref_tf].index.values + df = self.conditionwise_statistics.loc[unit_id].loc[condition_inds] + df = df.assign(ori=self.stimulus_conditions.loc[df.index.values][self._col_ori]) + df = df.sort_values(by=['ori']) # do not replace with self._col_ori unless we modify the line above + + tuning = np.array(df['spike_mean'].values) + + if selectivity_type == 'osi': + return osi(orivals_rad, tuning) + elif selectivity_type == 'dsi': + return dsi(orivals_rad, tuning) + else: + warnings.warn(f'unkown selectivity function {selectivity_type}.') + return np.nan + + def _get_f1_f0(self, unit_id, condition_id): + """ Calculate F1/F0 for a given unit + + A measure of how tightly locked a unit's firing rate is to the cycles of a drifting grating + + Parameters + ---------- + unit_id - unique ID for the unit of interest + condition_id - ID for the condition of interest (usually the preferred condition) + + Returns + ------- + f1_f0 - metric + + """ + presentation_ids = self.stim_table[self.stim_table['stimulus_condition_id'] == condition_id].index.values + + tf = self.stim_table.loc[presentation_ids[0]][self._col_tf] + + dataset = self.ecephys_session.presentationwise_spike_counts( + bin_edges=np.arange(0, self.trial_duration, 0.001), + stimulus_presentation_ids=presentation_ids, + unit_ids=[unit_id] + ).drop('unit_id') + + arr = np.squeeze(dataset.values) + trial_duration = dataset.time_relative_to_stimulus_onset.max() #TODO: If there a reason not to use self.trial_duration? + return f1_f0(arr, tf, trial_duration) + + def _get_modulation_index(self, unit_id, condition_id): + """ Calculate modulation index for a given unit. + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + condition_id : + ID for the condition of interest (usually the preferred condition) + + Returns + ------- + modulation_index : metric + """ + tf = self.stimulus_conditions.loc[condition_id][self._col_tf] + + data = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=condition_id).data + sample_rate = 1 / np.mean(np.diff(self.conditionwise_psth.time_relative_to_stimulus_onset)) + + return modulation_index(data, tf, sample_rate) + + def _get_c50(self, unit_id): + """ Calculate C50 for a given unit. Only valid if the contrast tuning stimulus is present. Otherwise, + return NaN value + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns: + ------- + c50 : float + metric + + """ + + contrast_conditions = self.stim_table_contrast[ + (self.stim_table_contrast[self._col_ori] == self._get_pref_ori(unit_id))]['stimulus_condition_id'].unique() + + # contrasts = self.stimulus_conditions_contrast.loc[contrast_conditions]['contrast'].values.astype('float') + contrasts = self.stimulus_conditions_contrast.loc[contrast_conditions][self._col_contrast].values.astype('float') + mean_responses = self.conditionwise_statistics_contrast.loc[unit_id].loc[contrast_conditions]['spike_mean'].values.astype('float') + + return c50(contrasts, mean_responses) + + # Methods need to either be removed or updated to work with latest adaptor. Talked with Jsh and decision still + # pending. + ''' + def _get_tfdi(self, unit_id, pref_ori): + """ Calculate temporal frequency discrimination index for a given unit + + Only valid if the contrast tuning stimulus is present + Otherwise, return NaN value + + Params: + ------- + unit_id - unique ID for the unit of interest + pref_ori - preferred orientation for that cell + + Returns: + ------- + tfdi - metric + + """ + + ### NEEDS TO BE UPDATED FOR NEW ADAPTER + + v = list(self.spikes.keys())[nc] + tf_tuning = self.response_events[pref_ori, 1:, nc, 0] + trials = self.mean_sweep_events[(self.stim_table['Ori'] == self.orivals[pref_ori])][v].values + sse_part = np.sqrt(np.sum((trials-trials.mean())**2)/(len(trials)-5)) + return (np.ptp(tf_tuning))/(np.ptp(tf_tuning) + 2*sse_part) + ''' + + ''' + def _get_suppressed_contrast(self, unit_id, pref_ori, pref_tf): + """ Calculate two metrics used to determine if a unit is suppressed by contrast + + Params: + ------- + unit_id - unique ID for the unit of interest + pref_ori - preferred orientation for that cell + pref_tf - preferred temporal frequency for that cell + + Returns: + ------- + peak_blank - metric + all_blank - metric + + """ + + ### NEEDS TO BE UPDATED FOR NEW ADAPTER + + blank = self.response_events[0, 0, nc, 0] + peak = self.response_events[pref_ori, pref_tf+1, nc, 0] + all_resp = self.response_events[:, 1:, nc, 0].mean() + peak_blank = peak - blank + all_blank = all_resp - blank + + return peak_blank, all_blank + ''' + + ''' + def _fit_tf_tuning(self, unit_id, pref_ori, pref_tf): + + """ Performs Gaussian or exponential fit on the temporal frequency tuning curve at the preferred orientation. + + Params: + ------- + unit_id - unique ID for the unit of interest + pref_ori - preferred orientation for that cell + pref_tf - preferred temporal frequency for that cell + + Returns: + ------- + fit_tf_ind - metric + fit_tf - metric + tf_low_cutoff - metric + tf_high_cutoff - metric + """ + + ### NEEDS TO BE UPDATED FOR NEW ADAPTER + + tf_tuning = self.response_events[pref_ori, 1:, nc, 0] + fit_tf_ind = np.NaN + fit_tf = np.NaN + tf_low_cutoff = np.NaN + tf_high_cutoff = np.NaN + if pref_tf in range(1, 4): + try: + popt, pcov = curve_fit(gauss_function, range(5), tf_tuning, p0=[np.amax(tf_tuning), pref_tf, 1.], + maxfev=2000) + tf_prediction = gauss_function(np.arange(0., 4.1, 0.1), *popt) + fit_tf_ind = popt[1] + fit_tf = np.power(2, popt[1]) + low_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[:tf_prediction.argmax()].argmin() + high_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[ + tf_prediction.argmax():].argmin() + tf_prediction.argmax() + if low_cut_ind > 0: + low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] + tf_low_cutoff = np.power(2, low_cutoff) + elif high_cut_ind < 49: + high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] + tf_high_cutoff = np.power(2, high_cutoff) + except Exception: + pass + else: + fit_tf_ind = pref_tf + fit_tf = self.tfvals[pref_tf] + try: + popt, pcov = curve_fit(exp_function, range(5), tf_tuning, + p0=[np.amax(tf_tuning), 2., np.amin(tf_tuning)], maxfev=2000) + tf_prediction = exp_function(np.arange(0., 4.1, 0.1), *popt) + if pref_tf == 0: + high_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[ + tf_prediction.argmax():].argmin() + tf_prediction.argmax() + high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] + tf_high_cutoff = np.power(2, high_cutoff) + else: + low_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[ + :tf_prediction.argmax()].argmin() + low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] + tf_low_cutoff = np.power(2, low_cutoff) + except Exception: + pass + return fit_tf_ind, fit_tf, tf_low_cutoff, tf_high_cutoff + ''' + + ## VISUALIZATION ## + def plot_raster(self, stimulus_condition_id, unit_id): + """ Plot raster for one condition and one unit """ + idx_tf = np.where(self.tfvals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_tf])[0] + idx_ori = np.where(self.orivals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_ori])[0] + + if len(idx_tf) == len(idx_ori) == 1: + + presentation_ids = self.presentationwise_statistics.xs(unit_id, level=1)[ + self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] == stimulus_condition_id + ].index.values + + df = self.presentationwise_spike_times[ + (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & + (self.presentationwise_spike_times['unit_id'] == unit_id)] + + x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time + _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) + + plt.subplot(self.number_tf, self.number_ori, idx_tf*self.number_ori + idx_ori + 1) + plt.scatter(x, y, c='k', s=1, alpha=0.25) + plt.axis('off') + + def plot_response_summary(self, unit_id, bar_thickness=0.25): + """ Plot the spike counts across conditions """ + df = self.stimulus_conditions.drop(index=self.null_condition) + + df['tf_index'] = np.searchsorted(self.tfvals, df[self._col_tf].values) + df['ori_index'] = np.searchsorted(self.orivals, df[self._col_ori].values) + + cond_values = self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] + + x = df.loc[cond_values.values]['tf_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 + y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] + c = df.loc[cond_values.values]['tf_index'] + + plt.subplot(2, 1, 1) + plt.scatter(y, x, c=c, alpha=0.5, cmap='Purples', vmin=-5) + locs, labels = plt.yticks(ticks=np.arange(self.number_tf), labels=self.tfvals) + plt.ylabel('Temporal frequency') + plt.xlabel('Spikes per trial') + plt.ylim([self.number_tf, -1]) + + x = df.loc[cond_values.values]['ori_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 + y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] + c = df.loc[cond_values.values]['ori_index'] + + plt.subplot(2, 1, 2) + plt.scatter(x, y, c=c, alpha=0.5, cmap='Spectral') + locs, labels = plt.xticks(ticks=np.arange(self.number_ori), labels=self.orivals) + plt.xlabel('Orientation') + plt.ylabel('Spikes per trial') + + def make_star_plot(self, unit_id): + """ Make a 2P-style Star Plot based on presentationwise spike counts""" + angle_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_ori].values + r_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_tf].values + data = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'].values + + null_trials = np.where(angle_data == 'null')[0] + + angle_data = np.delete(angle_data, null_trials) + r_data = np.delete(r_data, null_trials) + data = np.delete(data, null_trials) + + cmin = np.min(data) + cmax = np.max(data) + + fp = FanPlotter.for_drifting_gratings() + fp.plot(r_data=r_data, angle_data=angle_data, data=data, clim=[cmin, cmax]) + fp.show_axes(closed=False) + plt.ylim([-5, 5]) + plt.axis('equal') + plt.axis('off') + + +### General functions ### +def _gauss_function(x, a, x0, sigma): + """ + fit gaussian function at log scale + good for fitting band pass, not good at low pass or high pass + """ + return a*np.exp(-(x-x0)**2/(2*sigma**2)) + + +def _exp_function(x, a, b, c): + return a*np.exp(-b*x)+c + + +def _contrast_curve(x, b, c, d, e): + """Difference of gaussian. + fit sigmoid function at log scale + not good for fitting band pass + - b: hill slope + - c: min response + - d: max response + - e: EC50 + """ + return c+(d-c)/(1+np.exp(b*(np.log(x)-np.log(e)))) + + +def c50(contrasts, responses): + """Computes C50, the halfway point between the maximum and minimum values in a curved fitted against a difference + of gaussian for the contrast values and their responese (mean spike rates) + + Parameters + ---------- + contrasts : array of floats + list of different contrast stimuli + responses : array of floats + array of responses (spike rates) + + Returns + ------- + c50 : float + """ + if contrasts.size == 0 or contrasts.size != responses.size: + warnings.warn('the contrasts and responses arrays must be of the same length') + return np.nan + + try: + # find the paraemters that best fit the contrast curve give x = contrast-vals and y = responses + fitCoefs, _ = curve_fit(_contrast_curve, contrasts, responses, maxfev=100000) + + except RuntimeError as e: + warnings.warn(str(e)) + return np.nan + + # Create the constrast curve using the optimized parameters, get the halfway range point on the curve + # resids = responses - contrast_curve(contrasts.astype('float'), *fitCoefs) + X = np.linspace(min(contrasts)*0.9, max(contrasts)*1.1, 256) # + y_fit = _contrast_curve(X, *fitCoefs) + y_middle = (np.max(y_fit) - np.min(y_fit)) / 2 + np.min(y_fit) + + try: + # y_fit is unlikely to be sorted, so to get the optimial value we should sort by y_fit and X before calling + # numpy's searchsorted() + sorted_indicies = np.argsort(y_fit) + X_sorted = X[sorted_indicies] + y_fit_sorted = y_fit[sorted_indicies] + c50 = X_sorted[np.searchsorted(y_fit_sorted, y_middle)] + + except IndexError as e: + warnings.warn(str(e)) + return np.nan + + return c50 + + +def f1_f0(arr, tf, trial_duration): + """Computes F1/F0 of a drifting grating response + + Parameters + ---------- + arr : + DataArray with trials x bin-times + tf : + temporal frequency of the stimulus + + Returns + ------- + f1_f0 : float + metric + + """ + if arr.size == 0: + return np.nan + + if arr.ndim == 1: + arr = arr.reshape(1, arr.size) + + # For each trial group the bins into blocks that will go to the length of the temporal frequency + num_bins = arr.shape[1] + num_trials = arr.shape[0] + cycles_per_trial = int(tf * trial_duration) + bins_per_cycle = int(num_bins / cycles_per_trial) + if bins_per_cycle == 0: + # can occur if temp-freq x trial duration is greater than the total trial duration + return np.nan + + arr = arr[:, :cycles_per_trial*bins_per_cycle].reshape((num_trials, cycles_per_trial, bins_per_cycle)) + avg_rate = np.mean(arr, 1) + AMP = 2*np.abs(fft(avg_rate, bins_per_cycle)) / bins_per_cycle + + f0 = 0.5*AMP[:, 0] + f1 = AMP[:, 1] + selection = f0 > 0.0 + if not np.any(selection): + # No spikes found + return np.nan + + return np.nanmean(f1[selection]/f0[selection]) + + +def modulation_index(response_psth, tf, sample_rate): + """Depth of modulation by each cycle of a drifting grating; similar to F1/F0 + + ref: Matteucci et al. (2019) Nonlinear processing of shape information + in rat lateral extrastriate cortex. J Neurosci 39: 1649-1670 + + Parameters + ---------- + response_psth : array of floats + the binned responses of a unit for a given stimuli + tf : float + the temporal frequency + sample_rate : float + the sampling rate of response_psth + + Returns + ------- + modulation_index : float + the mi value + + """ + if response_psth.size == 0: + warnings.warn('response_psth is empty') + return np.nan + + f, psd = signal.welch(response_psth, fs=sample_rate, nperseg=1024) # get freqs. and power spectral density + mean_psd = np.mean(psd) + if mean_psd == 0.0: + # TODO: Check with josh, should it be 0 or nan? + return 0.0 + + tf_index = np.searchsorted(f, tf) + if not 0 <= tf_index < psd.size: + warnings.warn('specified temporal frequency is not within the singals sampling range. Please adjust tf and/or' + 'sample_rate parameters.') + return np.nan + + return abs((psd[tf_index] - np.mean(psd))/np.sqrt(np.mean(psd**2)- mean_psd**2)) + diff --git a/brain_observatory/ecephys/stimulus_analysis/flashes.py b/brain_observatory/ecephys/stimulus_analysis/flashes.py new file mode 100644 index 0000000000..e9d7d5b2ef --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/flashes.py @@ -0,0 +1,221 @@ +import numpy as np +import pandas as pd +from six import string_types +import scipy.ndimage as ndi +import scipy.stats as st +from scipy.optimize import curve_fit +import logging + +import matplotlib.pyplot as plt + +from .stimulus_analysis import StimulusAnalysis, get_fr + +import warnings +warnings.simplefilter(action='ignore', category=FutureWarning) + + +logger = logging.getLogger(__name__) + + +class Flashes(StimulusAnalysis): + """ + A class for computing single-unit metrics from the full-field flash stimulus of an ecephys session NWB file. + + To use, pass in a EcephysSession object:: + session = EcephysSession.from_nwb_path('/path/to/my.nwb') + fl_analysis = Flashes(session) + + or, alternatively, pass in the file path:: + fl_analysis = Flashes('/path/to/my.nwb') + + You can also pass in a unit filter dictionary which will only select units with certain properties. For example + to get only those units which are on probe C and found in the VISp area:: + fl_analysis = Flashes(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) + + To get a table of the individual unit metrics ranked by unit ID:: + metrics_table_df = fl_analysis.metrics() + + """ + + def __init__(self, ecephys_session, col_color='color', trial_duration=0.25, **kwargs): + super(Flashes, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) + self._metrics = None + + self._colors = None + self._col_color = col_color + + if self._params is not None: + self._params = self._params.get('flashes', {}) + self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars + else: + self._params = {} + + @property + def name(self): + return 'Flashes' + + @property + def colors(self): + """ Array of 'color' conditions (black vs. white flash) """ + if self._colors is None: + self._get_stim_table_stats() + + return self._colors + + @property + def number_colors(self): + """ Number of 'color' conditions (black vs. white flash) """ + if self._colors is None: + self._get_stim_table_stats() + + return len(self._colors) + + @property + def null_condition(self): + """ Stimulus condition ID for null stimulus (not used, so set to -1) """ + # TODO: If null_condition is not used remove it, parent should have it set to 1 + return -1 + + @property + def METRICS_COLUMNS(self): + return [('on_off_ratio_fl', np.float64), + ('sustained_idx_fl', np.float64), + ('firing_rate_fl', np.float64), + ('time_to_peak_fl', np.float64), + ('fano_fl', np.float64), + ('lifetime_sparseness_fl', np.float64), + ('run_pval_fl', np.float64), + ('run_mod_fl', np.float64)] + + @property + def metrics(self): + if self._metrics is None: + logger.info('Calculating metrics for ' + self.name) + unit_ids = self.unit_ids + metrics_df = self.empty_metrics_table() + + if len(self. stim_table) > 0: + metrics_df['on_off_ratio_fl'] = [self._get_on_off_ratio(unit) for unit in unit_ids] + metrics_df['sustained_idx_fl'] = [self._get_sustained_index(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['firing_rate_fl'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] + metrics_df['time_to_peak_fl'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['fano_fl'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['lifetime_sparseness_fl'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] + metrics_df.loc[:, ['run_pval_fl', 'run_mod_fl']] = [ + self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + + self._metrics = metrics_df + + return self._metrics + + def _find_stimulus_key(self, stim_table): + """Tries to guess the correct stimulus_key based on the data. + + :param stim_table: + :return: + """ + known_keys_lc = [k.lower() for k in self.__class__.known_stimulus_keys()] + + for table_key in stim_table['stimulus_name'].unique(): + table_key_lc = table_key.lower() + for known_key in known_keys_lc: + if table_key_lc.startswith(known_key): + return table_key + + else: + return None + + @classmethod + def known_stimulus_keys(cls): + return ['flash', 'flashes'] + + def _get_stim_table_stats(self): + """ Extract colors from the stimulus table """ + self._colors = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_color] + != 'null'][self._col_color].unique()) + + def _get_sustained_index(self, unit_id, condition_id): + """ Calculate the sustained index for a given unit, a measure of the transience of the flash response. + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + sustained_index : + ratio of the mean PSTH and the maximum of the PSTH + A cell that fires very transiently will have a sustained index close to 0 + A cell that first continuously throughout the flash will have a sustained index closer to 1 + """ + psth = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=condition_id).data + return np.mean(psth)/np.amax(psth) + + def _get_on_off_ratio(self, unit_id): + """Gets the ratio of mean spikes for on-stimuli vs off stimuli. + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + on_off_ratio : float + """ + on_condition_id = self.stimulus_conditions[self.stimulus_conditions[self._col_color] == 1.0].index.values + off_condition_id = self.stimulus_conditions[self.stimulus_conditions[self._col_color] == -1.0].index.values + + on_mean_spikes = self.conditionwise_statistics.loc[unit_id].loc[on_condition_id]['spike_mean'].values + off_mean_spikes = self.conditionwise_statistics.loc[unit_id].loc[off_condition_id]['spike_mean'].values + + if len(on_mean_spikes) == 0 or len(off_mean_spikes) == 0: + return np.nan + + if off_mean_spikes[0] > 0: + return on_mean_spikes[0] / off_mean_spikes[0] + else: + return np.nan + + ## VISUALIZATION ## + def plot_raster(self, stimulus_condition_id, unit_id): + + """ Plot raster for one condition and one unit """ + + idx_color = np.where(self.colors == self.stimulus_conditions.loc[stimulus_condition_id][self._col_color])[0] + + if len(idx_color) == 1: + + presentation_ids = self.presentationwise_statistics.xs(unit_id, level=1)[ + self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] + == stimulus_condition_id].index.values + + df = self.presentationwise_spike_times[ + (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & + (self.presentationwise_spike_times['unit_id'] == unit_id) + ] + + x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time + _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) + + plt.subplot(self.number_colors, 1, idx_color + 1) + plt.scatter(x, y, c='k', s=1, alpha=0.25) + plt.axis('off') + + def plot_response(self, unit_id): + """ Plot a histogram for the two conditions """ + plot_colors = ('darkslateblue', 'grey') + + for idx, color in enumerate(self.colors): + + condition_id = self.stimulus_conditions[self.stimulus_conditions['color'] == color].index.values[0] + + psth = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=condition_id).values + + plt.bar(np.arange(len(psth))-0.5, psth, color=plot_colors[idx], alpha=0.5, width=1.0) + plt.step(np.arange(len(psth)), psth, color=plot_colors[idx]) + plt.axis('off') diff --git a/brain_observatory/ecephys/stimulus_analysis/natural_movies.py b/brain_observatory/ecephys/stimulus_analysis/natural_movies.py new file mode 100644 index 0000000000..cd8461a144 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/natural_movies.py @@ -0,0 +1,92 @@ +import numpy as np +import pandas as pd +from six import string_types +import scipy.ndimage as ndi +import scipy.stats as st +from scipy.optimize import curve_fit +import logging + +import matplotlib.pyplot as plt + +from .stimulus_analysis import StimulusAnalysis, get_fr + +import warnings +warnings.simplefilter(action='ignore', category=FutureWarning) + + +logger = logging.getLogger(__name__) + + +class NaturalMovies(StimulusAnalysis): + """ + A class for computing single-unit metrics from the natural movies stimulus of an ecephys session NWB file. + + To use, pass in a EcephysSession object:: + session = EcephysSession.from_nwb_path('/path/to/my.nwb') + nm_analysis = NaturalMovies(session) + + or, alternatively, pass in the file path:: + nm_analysis = Flashes('/path/to/my.nwb') + + You can also pass in a unit filter dictionary which will only select units with certain properties. For example + to get only those units which are on probe C and found in the VISp area:: + nm_analysis = NaturalMovies(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) + + To get a table of the individual unit metrics ranked by unit ID:: + metrics_table_df = nm_analysis.metrics() + + TODO: Need to find a default trial_duration otherwise class will fail + """ + + def __init__(self, ecephys_session, trial_duration=None, **kwargs): + super(NaturalMovies, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) + + self._metrics = None + + if self._params is not None: + self._params = self._params['natural_movies'] + self._stimulus_key = self._params['stimulus_key'] + #else: + # self._stimulus_key = 'natural_movies' + + @property + def name(self): + return 'Natural Movies' + + @property + def null_condition(self): + return -1 + + @property + def METRICS_COLUMNS(self): + return [('fano_nm', np.uint64), + ('firing_rate_nm', np.float64), + ('lifetime_sparseness_nm', np.float64), + ('run_pval_ns', np.float64), + ('run_mod_ns', np.float64)] + + @property + def metrics(self): + if self._metrics is None: + logger.info('Calculating metrics for ' + self.name) + + unit_ids = self.unit_ids + metrics_df = self.empty_metrics_table() + metrics_df['fano_nm'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['firing_rate_nm'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] + metrics_df['lifetime_sparseness_nm'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] + run_vals = [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + metrics_df['run_pval_nm'] = [rv[0] for rv in run_vals] + metrics_df['run_mod_nm'] = [rv[1] for rv in run_vals] + + self._metrics = metrics_df + + return self._metrics + + @classmethod + def known_stimulus_keys(cls): + return ['natural_movies', 'natural_movie_1', 'natural_movie_3'] + + def _get_stim_table_stats(self): + pass diff --git a/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py b/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py new file mode 100644 index 0000000000..f2cb2a3e89 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py @@ -0,0 +1,192 @@ +import numpy as np +import pandas as pd +import logging +import warnings + +from .stimulus_analysis import StimulusAnalysis + + +warnings.simplefilter(action='ignore', category=FutureWarning) + + +logger = logging.getLogger(__name__) + + +class NaturalScenes(StimulusAnalysis): + """ + A class for computing single-unit metrics from the natural scenes stimulus of an ecephys session NWB file. + + To use, pass in a EcephysSession object:: + session = EcephysSession.from_nwb_path('/path/to/my.nwb') + ns_analysis = NaturalScenes(session) + + or, alternatively, pass in the file path:: + ns_analysis = NaturalScenes('/path/to/my.nwb') + + You can also pass in a unit filter dictionary which will only select units with certain properties. For example + to get only those units which are on probe C and found in the VISp area:: + ns_analysis = NaturalScenes(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) + + To get a table of the individual unit metrics ranked by unit ID:: + metrics_table_df = ns_analysis.metrics() + + """ + + def __init__(self, ecephys_session, col_image='frame', trial_duration=0.25, **kwargs): + super(NaturalScenes, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) + + self._images = None + self._number_images = None + self._images_nonblank = None + self._number_nonblank = None # does not include Image number = -1. + self._mean_sweep_events = None + self._response_events = None + self._response_trials = None + self._metrics = None + + self._col_image = col_image + + if self._params is not None: + self._params = self._params.get('natural_scenes', {}) + self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars + else: + self._params = {} + + @property + def name(self): + return 'Natural Scenes' + + @property + def images(self): + """ Array of iamge labels """ + if self._images is None: + self._get_stim_table_stats() + + return self._images + + @property + def images_nonblank(self): + if self._images_nonblank is None: + self._get_stim_table_stats() + + return self._images_nonblank + + @property + def frames(self): + # Required to deal with naming difference between NWB 1 and 2 + return self.images + + @property + def number_images(self): + """ Number of images shown """ + if self._images is None: + self._get_stim_table_stats() + + return self._number_images + + @property + def number_nonblank(self): + """ Number of images shown (excluding blank condition) """ + if self._number_nonblank is None: + self._get_stim_table_stats() + + return self._number_nonblank + + @property + def null_condition(self): + """ Stimulus condition ID for null (blank) stimulus """ + return self.stimulus_conditions[self.stimulus_conditions[self._col_image] == -1].index + + @property + def METRICS_COLUMNS(self): + return [('pref_image_ns', np.uint64), + ('image_selectivity_ns', np.float64), + ('firing_rate_ns', np.float64), + ('fano_ns', np.float64), + ('time_to_peak_ns', np.float64), + ('lifetime_sparseness_ns', np.float64), + ('run_pval_ns', np.float64), + ('run_mod_ns', np.float64)] + + @property + def metrics(self): + if self._metrics is None: + logger.info('Calculating metrics for ' + self.name) + + unit_ids = self.unit_ids + metrics_df = self.empty_metrics_table() + + if len(self.stim_table) > 0: + logger.info('Calculating metrics for ' + self.name) + + metrics_df['pref_image_ns'] = [self._get_preferred_condition(unit) for unit in unit_ids] + metrics_df['pref_images_multi_ns'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_image, self.images_nonblank) + for unit_id in unit_ids + ] + metrics_df['image_selectivity_ns'] = [self._get_image_selectivity(unit) for unit in unit_ids] + metrics_df['firing_rate_ns'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] + metrics_df['fano_ns'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['time_to_peak_ns'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['lifetime_sparseness_ns'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] + metrics_df.loc[:, ['run_pval_ns', 'run_mod_ns']] = [ + self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + + self._metrics = metrics_df + + return self._metrics + + @classmethod + def known_stimulus_keys(cls): + return ['natural_scenes', 'Natural_Images', 'Natural Images'] + + def _get_stim_table_stats(self): + """ Extract image labels from the stimulus table """ + self._images = np.sort(self.stimulus_conditions[self._col_image].unique()).astype(np.int64) + self._number_images = len(self._images) + self._images_nonblank = self._images[self._images >= 0] + self._number_nonblank = len(self._images_nonblank) + + def _get_image_selectivity(self, unit_id, num_steps=1000): + """ Calculate the image selectivity for a given unit using spike means at every image""" + + unit_stats = self.conditionwise_statistics.loc[unit_id].drop(index=self.null_condition) + return image_selectivity(unit_stats['spike_mean'].values, num_steps=num_steps) + + +def image_selectivity(spike_means, num_steps=1000): + """Quantifies how selective a cell is for images, based on Quian Quiroga et al., 2007. A value of 0 indicates + the cell responds the same no mater what the image. While if the neuron only responds to a single image it + will have a selectivity of 1 - 2/N (1.0 and N goes to inf). + + Parameters + ---------- + spike_means : array of floats + Averaged spiking responses to a series of images for a given neuron + num_steps : int + Number of threshold values used to build response distribution (default to 1000 as in Quian paper) + + Returns + ------- + selectivity : float + selectivity of neuron to images + """ + if spike_means.size < 2 or num_steps < 2: + # What is the selectivity of none of 0 spikes (by definition should be 0 and 1) + return np.nan + + # Essentially creates a cumulative distribution function of responses at a given set of thresholds, finds the + # area under the response distribution and normalizes between 0 and 1. + fmin = spike_means.min() + fmax = spike_means.max() + if fmin == fmax: + # A uniform response of none for each image, make sure to return 0 + return 0.0 + + j = np.arange(num_steps) + thresh = fmin + j*((fmax - fmin) / num_steps) + rtj = [np.mean(spike_means > t) for t in thresh] + + return 1 - (2 * np.mean(rtj)) diff --git a/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py b/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py new file mode 100644 index 0000000000..3d849c1ad1 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py @@ -0,0 +1,585 @@ +import numpy as np +import scipy.ndimage as ndi +from scipy.optimize import curve_fit, leastsq +import logging +import matplotlib.pyplot as plt + +from ...chisquare_categorical import chisq_from_stim_table +from .stimulus_analysis import StimulusAnalysis + +import warnings +warnings.simplefilter(action='ignore', category=FutureWarning) + + +logger = logging.getLogger(__name__) + + +class ReceptiveFieldMapping(StimulusAnalysis): + """ + A class for computing single-unit metrics from the receptive field mapping stimulus of an ecephys session NWB file. + + To use, pass in a EcephysSession object:: + session = EcephysSession.from_nwb_path('/path/to/my.nwb') + rf_analysis = ReceptiveFieldMapping(session) + + or, alternatively, pass in the file path:: + rf_analysis = ReceptiveFieldMapping('/path/to/my.nwb') + + You can also pass in a unit filter dictionary which will only select units with certain properties. For example + to get only those units which are on probe C and found in the VISp area:: + rf_analysis = ReceptiveFieldMapping(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) + + To get a table of the individual unit metrics ranked by unit ID:: + metrics_table_df = rf_analysis.metrics() + + """ + def __init__(self, ecephys_session, col_pos_x='x_position', col_pos_y='y_position', trial_duration=0.25, + minimum_spike_count=10.0, mask_threshold=0.5, **kwargs): + super(ReceptiveFieldMapping, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) + + self._pos_x = None + self._pos_y = None + + self._rf_matrix = None + + self._col_pos_x = col_pos_x + self._col_pos_y = col_pos_y + + self._minimum_spike_count = minimum_spike_count + self._mask_threshold = mask_threshold + + #if self._params is not None: + # self._params = self._params['receptive_field_mapping'] + # self._stimulus_key = self._params['stimulus_key'] + # self._minimum_spike_count = self._params.get('minimum_spike_count', minimum_spike_count) + # self._mask_threshold = self._params.get('mask_threshold', mask_threshold) + + @property + def name(self): + return 'Receptive Field Mapping' + + @property + def elevations(self): + """ Array of stimulus elevations """ + if self._pos_y is None: + self._get_stim_table_stats() + + return self._pos_y + + @property + def azimuths(self): + """ Array of stimulus azimuths """ + if self._pos_x is None: + self._get_stim_table_stats() + + return self._pos_x + + @property + def number_elevations(self): + """ Number of stimulus elevations """ + if self._pos_y is None: + self._get_stim_table_stats() + + return len(self._pos_y) + + @property + def number_azimuths(self): + """ Number of stimulus azimuths """ + if self._pos_x is None: + self._get_stim_table_stats() + + return len(self._pos_y) # TODO: Save this instead of calculating every time. + + @property + def null_condition(self): + """ Stimulus condition ID for null stimulus (not used, so set to -1) """ + # TODO: Remove + return -1 + + @property + def receptive_fields(self): + """ Spatial receptive fields for N units (9 x 9 x N matrix of responses) """ + if self._rf_matrix is None: + bin_edges = np.linspace(0, 0.249, 3) + + self.stim_table.loc[:, self._col_pos_y] = 40.0 - self.stim_table[self._col_pos_y] + presentationwise_response_matrix = self.ecephys_session.presentationwise_spike_counts( + bin_edges=bin_edges, + stimulus_presentation_ids=self.stim_table.index.values, + unit_ids=self.unit_ids, + ) + + self._rf_matrix = self._response_by_stimulus_position(presentationwise_response_matrix, self.stim_table) + + return self._rf_matrix + + + @property + def METRICS_COLUMNS(self): + return [('azimuth_rf', np.float64), + ('elevation_rf', np.float64), + ('width_rf', np.float64), + ('height_rf', np.float64), + ('area_rf', np.float64), + ('p_value_rf', np.float64), + ('on_screen_rf', bool), + ('firing_rate_rf', np.float64), + ('fano_rf', np.float64), + ('time_to_peak_rf', np.float64), + ('lifetime_sparseness_rf', np.float64), + ('run_mod_rf', np.float64), + ('run_pval_rf', np.float64) + ] + + @property + def metrics(self): + if self._metrics is None: + logger.info('Calculating metrics for ' + self.name) + unit_ids = self.unit_ids + metrics_df = self.empty_metrics_table() + + if len(self.stim_table) > 0: + metrics_df.loc[:, ['azimuth_rf', + 'elevation_rf', + 'width_rf', + 'height_rf', + 'area_rf', + 'p_value_rf', + 'on_screen_rf', + ]] = [self._get_rf_stats(unit) for unit in unit_ids] + metrics_df['firing_rate_rf'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] + metrics_df['fano_rf'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['time_to_peak_rf'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) + for unit in unit_ids] + metrics_df['lifetime_sparseness_rf'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] + metrics_df.loc[:, ['run_pval_rf', 'run_mod_rf']] = \ + [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + + self._metrics = metrics_df + + return self._metrics + + @classmethod + def known_stimulus_keys(cls): + return ['receptive_field_mapping', 'gabor', "gabors"] + + def _find_stimulus_key(self, stim_table): + known_keys_lc = [k.lower() for k in self.__class__.known_stimulus_keys()] + + for table_key in stim_table['stimulus_name'].unique(): + table_key_lc = table_key.lower() + for known_key in known_keys_lc: + if table_key_lc.startswith(known_key): + return table_key + + else: + return None + + def _get_stim_table_stats(self): + """ Extract azimuths and elevations from stimulus table.""" + + self._pos_y = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_pos_y] + != 'null'][self._col_pos_y].unique()) + self._pos_x = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_pos_x] + != 'null'][self._col_pos_x].unique()) + + def get_receptive_field(self, unit_id): + """ Alias for _get_rf + """ + + return self._get_rf(unit_id) + + def _get_rf(self, unit_id): + """ Extract the receptive field for one unit + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + receptive_field : 9 x 9 numpy array + """ + return self.receptive_fields['spike_counts'].sel(unit_id=unit_id).data + + + def _response_by_stimulus_position(self, dataset, presentations, row_key=None, column_key=None, unit_key='unit_id', + time_key='time_relative_to_stimulus_onset', spike_count_key='spike_count'): + """ Calculate the unit's response to different locations + of the Gabor patch + + Returns + ------- + dataset : xarray + dataset of receptive fields + """ + + if row_key is None: + row_key = self._col_pos_y + if column_key is None: + column_key = self._col_pos_x + + dataset = dataset.copy() + dataset[spike_count_key] = dataset.sum(dim=time_key) + dataset = dataset.drop(time_key) + + dataset[row_key] = presentations.loc[:, row_key] + dataset[column_key] = presentations.loc[:, column_key] + dataset = dataset.to_dataframe() + + dataset = dataset.reset_index(unit_key).groupby([row_key, column_key, unit_key]).sum() + + return dataset.to_xarray() + + def _get_rf_stats(self, unit_id): + """ Calculate a variety of metrics for one unit's receptive field + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + azimuth : + preferred azimuth in degrees, based on center of mass of thresholded RF + elevation : + preferred elevation in degrees, based on center of mass of thresholded RF + width : + receptive field width in degrees, based on Gaussian fit + height : + receptive field height in degrees, based on Gaussian fit + area : + receptive field area in degrees^2, based on thresholded RF area + p_value : + probability that a significant receptive field is present, based on categorical chi-square test + on_screen : + True if the receptive field is away from the screen edge, based on Gaussian fit + """ + rf = self._get_rf(unit_id) + spikes_per_trial = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'].values + + + if np.sum(spikes_per_trial) < self._minimum_spike_count: + return np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, False + + p_value = chisq_from_stim_table(self.stim_table, [self._col_pos_x, self._col_pos_y], + np.expand_dims(spikes_per_trial,1)) + + #print(self._params) + #exit() + rf_thresh, azimuth, elevation, area = threshold_rf(rf, self._mask_threshold) + + if is_rf_inverted(rf_thresh): + rf = invert_rf(rf) + + (peak_height, center_y, center_x, width_y, width_x), success = fit_2d_gaussian(rf) + on_screen = rf_on_screen(rf, center_y, center_x) + + height_deg = convert_pixels_to_degrees(width_y) + width_deg = convert_pixels_to_degrees(width_x) + azimuth_deg = convert_azimuth_to_degrees(azimuth) + elevation_deg = convert_elevation_to_degrees(elevation) + area_deg = convert_pixel_area_to_degrees(area) + + return azimuth_deg, elevation_deg, width_deg, height_deg, area_deg, p_value[0], on_screen + + ## VISUALIZATION ## + def plot_raster(self, stimulus_condition_id, unit_id): + + """ Plot raster for one condition and one unit """ + + idx_elev = np.where(self.elevations == self.stimulus_conditions.loc[stimulus_condition_id][self._col_pos_y])[0] + idx_azi = np.where(self.azimuths == self.stimulus_conditions.loc[stimulus_condition_id][self._col_pos_x])[0] + + if len(idx_elev) == len(idx_azi) == 1: + + presentation_ids = self.presentationwise_statistics.xs(unit_id, level=1)[ + self.presentationwise_statistics.xs(unit_id, level=1)[ + 'stimulus_condition_id'] == stimulus_condition_id].index.values + + df = self.presentationwise_spike_times[ \ + (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & \ + (self.presentationwise_spike_times['unit_id'] == unit_id) ] + + x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time + _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) + + idx_elev = self.number_elevations - idx_elev - 1 # reverse the elevation index so it matches the RF + + plt.subplot(self.number_elevations, self.number_azimuths, idx_elev*self.number_azimuths + idx_azi + 1) + plt.scatter(x, y, c='k', s=1, alpha=0.25) + plt.axis('off') + + def plot_rf(self, unit_id): + """ Plot the spike counts across conditions """ + plt.imshow(self._get_rf(unit_id), cmap='Greys') + plt.axis('off') + + +#### HELPER FUNCTIONS #### +def _gaussian_function_2d(peak_height, center_y, center_x, width_y, width_x): + """Returns a 2D Gaussian function + + Parameters + ---------- + peak_height : + peak of distribution + center_y : + y-coordinate of distribution center + center_x : + x-coordinate of distribution center + width_y : + width of distribution along x-axis + width_x : + width of distribution along y-axis + + Returns + ------- + f(x,y) : function + Returns the value of the distribution at a particular x,y coordinate + + """ + + return lambda x,y: peak_height \ + * np.exp( \ + -( \ + ((center_y - y) / width_y)**2 \ + + ((center_x - x) / width_x)**2 \ + ) \ + / 2 \ + ) + + +def gaussian_moments_2d(data): + """Finds the moments of a 2D Gaussian distribution, given an input matrix + + Parameters + ---------- + data : numpy.ndarray + 2D matrix + + Returns + ------- + peak_height : + peak of distribution + center_y : + y-coordinate of distribution center + center_x : + x-coordinate of distribution center + width_y : + width of distribution along x-axis + width_x : + width of distribution along y-axis + """ + + total = data.sum() + height = data.max() + + Y, X = np.indices(data.shape) + center_y = (Y*data).sum()/total + center_x = (X*data).sum()/total + + if np.isnan(center_y) or np.isinf(center_y) or np.isnan(center_x) or np.isinf(center_x): + return None + + col = data[:, int(center_x)] + row = data[int(center_y), :] + + width_y = np.sqrt(np.abs((np.arange(row.size)-center_y)**2*row).sum()/row.sum()) + width_x = np.sqrt(np.abs((np.arange(col.size)-center_x)**2*col).sum()/col.sum()) + + return height, center_y, center_x, width_y, width_x + + +def fit_2d_gaussian(matrix): + """Fits a receptive field with a 2-dimensional Gaussian distribution + + Parameters + ---------- + matrix : numpy.ndarray + 2D matrix of spike counts + + Returns + ------- + parameters - tuple + peak_height : peak of distribution + center_y : y-coordinate of distribution center + center_x : x-coordinate of distribution center + width_y : width of distribution along x-axis + width_x : width of distribution along y-axis + success - bool + True if a fit was found, False otherwise + """ + + params = gaussian_moments_2d(matrix) + if params is None: + return (np.nan, np.nan, np.nan, np.nan, np.nan), False + + errorfunction = lambda p: np.ravel(_gaussian_function_2d(*p)(*np.indices(matrix.shape)) - matrix) + fit_params, ier = leastsq(errorfunction, params) + success = True if ier < 5 else False + + return fit_params, success + + +def is_rf_inverted(rf_thresh): + """Checks if the receptive field mapping timulus is suppressing or exciting the cell + + Parameters + ---------- + rf_thresh : matrix + matrix of spike counts at each stimulus position + + Returns + ------- + if_rf_inverted : bool + True if the receptive field is inverted + """ + edge_mask = np.zeros(rf_thresh.shape) + + edge_mask[:,0] = 1 + edge_mask[:,-1] = 1 + edge_mask[0,:] = 1 + edge_mask[-1,:] = 1 + + num_edge_pixels = np.sum(rf_thresh * edge_mask) + + return num_edge_pixels > np.sum(edge_mask) / 2 + + +def invert_rf(rf): + """Creates an inverted version of the receptive field + + Parameters + ---------- + rf - matrix of spike counts at each stimulus position + + Returns + ------- + rf_inverted - new RF matrix + + """ + return np.max(rf) - rf + + +def threshold_rf(rf, threshold): + """Creates a spatial mask based on the receptive field peak, and returns the x, y coordinates of the center of + mass, as well as the area. + + Parameters + ---------- + rf : numpy.ndarray + 2D matrix of spike counts + threshold : float + Threshold as ratio of the RF's standard deviation + + Returns + ------- + threshold_rf : numpy.ndarray + Thresholded version of the original RF + center_x : float + x-coordinate of mask center of mass + center_y : float + y-coordinate of mask center of mass + area : float + area of mask + """ + rf_filt = ndi.gaussian_filter(rf, 1) + + threshold_value = np.max(rf_filt) - np.std(rf_filt) * threshold + + rf_thresh = np.zeros(rf.shape, dtype='bool') + rf_thresh[rf_filt > threshold_value] = True + + labels, num_features = ndi.label(rf_thresh) + + best_label = np.argmax(ndi.maximum(rf_filt, labels=labels, index=np.unique(labels))) + + labels[labels != best_label] = 0 + labels[labels > 0] = 1 + + center_y, center_x = ndi.measurements.center_of_mass(labels) + area = float(np.sum(labels)) + + return labels, np.around(center_x, 4), np.around(center_y, 4), area + + +def rf_on_screen(rf, center_y, center_x): + """Checks whether the receptive field is on the screen, given the center location.""" + return 0 < center_y < rf.shape[0] and 0 < center_x < rf.shape[1] + + +def convert_elevation_to_degrees(elevation_in_pixels, elevation_offset_degrees=-30): + """Converts a pixel-based elevation into degrees relative to center of gaze + + The receptive field computed by this class is oriented such that the + pixel values are in the correct relative location when using matplotlib.pyplot.imshow(), + which places (0,0) in the upper-left corner of the figure. + + Therefore, we need to invert the elevation value prior to converting to degrees. + + Parameters + ---------- + elevation_in_pixels : float + elevation_offset_degrees: float + + Returns + ------- + elevation_in_degrees : float + """ + elevation_in_degrees = convert_pixels_to_degrees(8 - elevation_in_pixels) + elevation_offset_degrees + + return elevation_in_degrees + + +def convert_azimuth_to_degrees(azimuth_in_pixels, azimuth_offset_degrees=10): + """Converts a pixel-based azimuth into degrees relative to center of gaze + + Parameters + ---------- + azimuth_in_pixels : float + azimuth_offset_degrees: float + + Returns + ------- + azimuth_in_degrees : float + """ + azimuth_in_degrees = convert_pixels_to_degrees((azimuth_in_pixels)) + azimuth_offset_degrees + + return azimuth_in_degrees + + +def convert_pixels_to_degrees(value_in_pixels, degrees_to_pixels_ratio=10): + """Converts a pixel-based distance into degrees + + Parameters + ---------- + value_in_pixels : float + degrees_to_pixels_ratio: float + + Returns + ------- + value in degrees : float + """ + return value_in_pixels * degrees_to_pixels_ratio + + +def convert_pixel_area_to_degrees(area_in_pixels): + """Converts a pixel-based area measure into degrees + + Each pixel is a square with side of length <degrees_to_pixels_ratio> + + So the area in degrees is area_in_pixels * <degrees to_pixels_ratio>^2 + + Parameters + ---------- + area_in_pixels : float + + Returns + ------- + area_in_degrees : float + """ + return area_in_pixels * pow(convert_pixels_to_degrees(1), 2) diff --git a/brain_observatory/ecephys/stimulus_analysis/static_gratings.py b/brain_observatory/ecephys/stimulus_analysis/static_gratings.py new file mode 100644 index 0000000000..e01f41ccc7 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/static_gratings.py @@ -0,0 +1,454 @@ +from six import string_types +import numpy as np +import pandas as pd +from scipy.optimize import curve_fit +from functools import partial +import logging + +import matplotlib.pyplot as plt + +from .stimulus_analysis import StimulusAnalysis +from .stimulus_analysis import osi, deg2rad +from ...circle_plots import FanPlotter + +import warnings +warnings.simplefilter(action='ignore', category=FutureWarning) + + +logger = logging.getLogger(__name__) + + +class StaticGratings(StimulusAnalysis): + """ + A class for computing single-unit metrics from the static gratings stimulus of an ecephys session NWB file. + + To use, pass in a EcephysSession object:: + session = EcephysSession.from_nwb_path('/path/to/my.nwb') + sg_analysis = StaticGratings(session) + + or, alternatively, pass in the file path:: + sg_analysis = StaticGratings('/path/to/my.nwb') + + You can also pass in a unit filter dictionary which will only select units with certain properties. For example + to get only those units which are on probe C and found in the VISp area:: + sg_analysis = StaticGratings(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) + + To get a table of the individual unit metrics ranked by unit ID:: + metrics_table_df = sg_analysis.metrics() + + """ + + def __init__(self, ecephys_session, col_ori='orientation', col_sf='spatial_frequency', col_phase='phase', + trial_duration=0.25, **kwargs): + super(StaticGratings, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) + self._orivals = None + self._number_ori = None + self._sfvals = None + self._number_sf = None + self._phasevals = None + self._number_phase = None + # self._response_events = None + # self._response_trials = None + + self._metrics = None + + self._col_ori = col_ori + self._col_sf = col_sf + self._col_phase = col_phase + self._trial_duration = trial_duration + # self._module_name = 'Static Gratings' # TODO: module_name should be a static class variable + + if self._params is not None: + self._params = self._params.get('static_gratings', {}) + self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars + else: + self._params = {} + + @property + def name(self): + return 'Static Gratings' + + @property + def orivals(self): + """ Array of grating orientation conditions """ + if self._orivals is None: + self._get_stim_table_stats() + + return self._orivals + + @property + def number_ori(self): + """ Number of grating orientation conditions """ + if self._number_ori is None: + self._get_stim_table_stats() + + return self._number_ori + + @property + def sfvals(self): + """ Array of grating spatial frequency conditions """ + if self._sfvals is None: + self._get_stim_table_stats() + + return self._sfvals + + @property + def number_sf(self): + """ Number of grating orientation conditions """ + if self._number_sf is None: + self._get_stim_table_stats() + + return self._number_sf + + @property + def phasevals(self): + """ Array of grating phase conditions """ + if self._phasevals is None: + self._get_stim_table_stats() + + return self._phasevals + + @property + def number_phase(self): + """ Number of grating phase conditions """ + if self._number_phase is None: + self._get_stim_table_stats() + + return self._number_phase + + @property + def null_condition(self): + """ Stimulus condition ID for null (blank) stimulus """ + return self.stimulus_conditions[self.stimulus_conditions[self._col_sf] == 'null'].index + + + @property + def METRICS_COLUMNS(self): + return [('pref_sf_sg', np.float64), + ('pref_sf_multi_sg', bool), + ('pref_ori_sg', np.float64), + ('pref_ori_multi_sg', bool), + ('pref_phase_sg', np.float64), + ('pref_phase_multi_sg', bool), + ('g_osi_sg', np.float64), + ('time_to_peak_sg', np.float64), + ('firing_rate_sg', np.float64), + ('fano_sg', np.float64), + ('lifetime_sparseness_sg', np.float64), + ('run_pval_sg', np.float64), + ('run_mod_sg', np.float64)] + + @property + def metrics(self): + if self._metrics is None: + logger.info('Calculating metrics for ' + self.name) + unit_ids = self.unit_ids + metrics_df = self.empty_metrics_table() + + if len(self.stim_table) > 0: + metrics_df['pref_sf_sg'] = [self._get_pref_sf(unit) for unit in unit_ids] + metrics_df['pref_sf_multi_sg'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_sf, self.sfvals) for unit_id in unit_ids + ] + metrics_df['pref_ori_sg'] = [self._get_pref_ori(unit) for unit in unit_ids] + metrics_df['pref_ori_multi_sg'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_ori, self.orivals) for unit_id in unit_ids + ] + metrics_df['pref_phase_sg'] = [self._get_pref_phase(unit) for unit in unit_ids] + metrics_df['pref_phase_multi_sg'] = [ + self._check_multiple_pref_conditions(unit_id, self._col_phase, self.phasevals) for unit_id in unit_ids + ] + metrics_df['g_osi_sg'] = [self._get_osi(unit, metrics_df.loc[unit]['pref_sf_sg'], metrics_df.loc[unit]['pref_phase_sg']) for unit in unit_ids] + metrics_df['time_to_peak_sg'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + metrics_df['firing_rate_sg'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] + metrics_df['fano_sg'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + metrics_df['lifetime_sparseness_sg'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] + metrics_df.loc[:, ['run_pval_sg', 'run_mod_sg']] = \ + [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] + + self._metrics = metrics_df + + return self._metrics + + @classmethod + def known_stimulus_keys(cls): + return ['static_gratings'] + + def _get_stim_table_stats(self): + """ Extract orientations, spatial frequencies, and phases from the stimulus table """ + self._orivals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_ori] != 'null'][self._col_ori].unique()) + self._number_ori = len(self._orivals) + + self._sfvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_sf] != 'null'][self._col_sf].unique()) + self._number_sf = len(self._sfvals) + + self._phasevals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_phase] != 'null'][self._col_phase].unique()) + self._number_phase = len(self._phasevals) + + def _get_pref_sf(self, unit_id): + """Calculate the preferred spatial frequency condition for a given unit. + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + pref_sf : float + spatial frequency driving the maximal response + + """ + # TODO: Most of the _get_pref_*() methods can be combined into one method and shared among the classes + # Combine the stimulus_condition_id values that have the save spatial-frequency + similar_conditions_ids = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_sf] == sf].tolist() + for sf in self.sfvals] + + # For each spatial frequency average up conditionwise_statistics 'spike_mean' column using the indicies above. + # return the sf with the largest spike_mean. + df = pd.DataFrame( + index=self.sfvals, + data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in similar_conditions_ids]} + ).rename_axis(self._col_sf) + + return df.idxmax().iloc[0] + + def _get_pref_ori(self, unit_id): + """ Calculate the preferred orientation condition for a given unit + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + pref_ori :float + stimulus orientation driving the maximal response + """ + + # Combine the stimulus_condition_id values that have the save orientations + similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_ori] == ori].tolist() + for ori in self.orivals] + + # For each orientations average up conditionwise_statistics 'spike_mean' column using the indicies above. + # Return the oris with the largest spike_mean. + df = pd.DataFrame( + index=self.orivals, + data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in similar_conditions]} + ).rename_axis(self._col_ori) + + return df.idxmax().iloc[0] + + def _get_pref_phase(self, unit_id): + """Calculate the preferred phase condition for a given unit + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + + Returns + ------- + pref_phase : float + stimulus phase driving the maximal response + """ + combined_cond_ids = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_phase] == phase].tolist() + for phase in self.phasevals] + df = pd.DataFrame( + index=self.phasevals, + data = {'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in combined_cond_ids]} + ).rename_axis(self._col_phase) + + return df.idxmax().iloc[0] + + def _get_osi(self, unit_id, pref_sf, pref_phase): + """ Calculate the orientation selectivity for a given unit + + Parameters + ---------- + unit_id : int + unique ID for the unit of interest + pref_sf : float + preferred spatial frequency for this unit + pref_phase : float + preferred phase for this unit + + Returns + ------- + osi : float + orientation selectivity value + """ + orivals_rad = deg2rad(self.orivals).astype('complex128') # TODO: can we use numpy deg2rad? + + condition_inds = self.stimulus_conditions[ + (self.stimulus_conditions[self._col_sf] == pref_sf) & + (self.stimulus_conditions[self._col_phase] == pref_phase) + ].index.values + df = self.conditionwise_statistics.loc[unit_id].loc[condition_inds] + df = df.assign(ori=self.stimulus_conditions.loc[df.index.values][self._col_ori]) + df = df.sort_values(by=['ori']) + tuning = np.array(df['spike_mean'].values) + return osi(orivals_rad, tuning) + + ## VISUALIZATION ## + def plot_raster(self, stimulus_condition_id, unit_id): + """ Plot raster for one condition and one unit """ + + idx_sf = np.where(self.sfvals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_sf])[0] + idx_ori = np.where(self.orivals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_ori])[0] + + if len(idx_sf) == len(idx_ori) == 1: + + presentation_ids = \ + self.presentationwise_statistics.xs(unit_id, level=1)\ + [self.presentationwise_statistics.xs(unit_id, level=1)\ + ['stimulus_condition_id'] == stimulus_condition_id].index.values + + df = self.presentationwise_spike_times[ \ + (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & \ + (self.presentationwise_spike_times['unit_id'] == unit_id) ] + + x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time + _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) + + plt.subplot(self.number_sf, self.number_ori, idx_sf*self.number_ori + idx_ori + 1) + plt.scatter(x, y, c='k', s=1, alpha=0.25) + plt.axis('off') + + + def plot_response_summary(self, unit_id, bar_thickness=0.25): + + """ Plot the spike counts across conditions """ + df = self.stimulus_conditions.drop(index=self.null_condition) + + df['sf_index'] = np.searchsorted(self.sfvals, df[self._col_sf].values) + df['ori_index'] = np.searchsorted(self.orivals, df[self._col_ori].values) + df['phase_index'] = np.searchsorted(self.phasevals, df[self._col_phase].values) + + cond_values = self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] + + x = df.loc[cond_values.values]['sf_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 + y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] + c = df.loc[cond_values.values]['phase_index'] + + plt.subplot(2,1,1) + plt.scatter(y,x,c=c,alpha=0.5,cmap='Blues',vmin=-5) + locs, labels = plt.yticks(ticks=np.arange(self.number_sf), labels=self.sfvals) + plt.ylabel('Spatial frequency') + plt.xlabel('Spikes per trial') + plt.ylim([self.number_sf,-1]) + + x = df.loc[cond_values.values]['ori_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 + y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] + c = df.loc[cond_values.values]['phase_index'] + + plt.subplot(2,1,2) + plt.scatter(x,y,c=c,alpha=0.5,cmap='Spectral') + locs, labels = plt.xticks(ticks=np.arange(self.number_ori), labels=self.orivals) + plt.xlabel('Orientation') + plt.ylabel('Spikes per trial') + + def make_fan_plot(self, unit_id): + """ Make a 2P-style Fan Plot based on presentationwise spike counts""" + + angle_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_ori].values + r_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_sf].values + group_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_phase].values + data = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'].values + + null_trials = np.where(angle_data == 'null')[0] + + angle_data = np.delete(angle_data, null_trials) + r_data = np.delete(r_data, null_trials) + group_data = np.delete(group_data, null_trials) + data = np.delete(data, null_trials) + + cmin = np.min(data) + cmax = np.max(data) + + fp = FanPlotter.for_static_gratings() + fp.plot(r_data = r_data, angle_data = angle_data, group_data = group_data, data =data, clim=[cmin, cmax]) + fp.show_axes(closed=False) + plt.axis('off') + + +def fit_sf_tuning(sf_tuning_responses, sf_values, pref_sf_index): + """Performs gaussian or exponential fit on the spatial frequency tuning curve at preferred orientation/phase for + a given cell. + + :param sf_tuning_responses: An array of len N, with each value the (averaged) response of a cell at a given spatial + freq. stimulus. + :param sf_values: An array of len N, with each value the spatial freq. of the stimulus (corresponding to + sf_tuning_response). + :param pref_sf_index: The pre-determined prefered spatial frequency (sf_values index) of the cell. + :return: index for the preferred sf from the curve fit, prefered sf from the curve fit, low cutoff sf from the + curve fit, high cutoff sf from the curve fit + """ + fit_sf_ind = np.NaN + fit_sf = np.NaN + sf_low_cutoff = np.NaN + sf_high_cutoff = np.NaN + if pref_sf_index in range(1, len(sf_values)-1): + # If the prefered spatial freq is an interior case try to fit the tunning curve with a gaussian. + try: + popt, pcov = curve_fit(gauss_function, np.arange(len(sf_values)), sf_tuning_responses, p0=[np.amax(sf_tuning_responses), + pref_sf_index, 1.], maxfev=2000) + sf_prediction = gauss_function(np.arange(0., 4.1, 0.1), *popt) + fit_sf_ind = popt[1] + fit_sf = 0.02*np.power(2, popt[1]) + low_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[:sf_prediction.argmax()].argmin() + high_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[sf_prediction.argmax():].argmin() + sf_prediction.argmax() + if low_cut_ind > 0: + low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] + sf_low_cutoff = 0.02*np.power(2, low_cutoff) + elif high_cut_ind < 4: + high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] + sf_high_cutoff = 0.02*np.power(2, high_cutoff) + except Exception as e: + pass + else: + # If the prefered spatial freq is a boundary value try to fit the tunning curve with an exponential + fit_sf_ind = pref_sf_index + fit_sf = sf_values[pref_sf_index] + try: + popt, pcov = curve_fit(exp_function, np.arange(len(sf_values)), sf_tuning_responses, + p0=[np.amax(sf_tuning_responses), 2., np.amin(sf_tuning_responses)], maxfev=2000) + sf_prediction = exp_function(np.arange(0., 4.1, 0.1), *popt) + if pref_sf_index == 0: + high_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[sf_prediction.argmax():].argmin()+sf_prediction.argmax() + high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] + sf_high_cutoff = 0.02*np.power(2, high_cutoff) + else: + low_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[:sf_prediction.argmax()].argmin() + low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] + sf_low_cutoff = 0.02*np.power(2, low_cutoff) + except Exception as e: + pass + + return fit_sf_ind, fit_sf, sf_low_cutoff, sf_high_cutoff + + +def get_sfdi(sf_tuning_responses, mean_sweeps_trials, bias=5): + """Computes spatial frequency discrimination index for cell + + :param sf_tuning_responses: sf_tuning_responses: An array of len N, with each value the (averaged) response of a + cell at a given spatial freq. stimulus. + :param mean_sweeps_trials: The set of events (spikes) across all trials of varying + :param bias: + :return: The sfdi value (float) + """ + trial_mean = mean_sweeps_trials.mean() + sse_part = np.sqrt(np.sum((mean_sweeps_trials - trial_mean)**2) / (len(mean_sweeps_trials) - bias)) + return (np.ptp(sf_tuning_responses)) / (np.ptp(sf_tuning_responses) + 2 * sse_part) + + +def gauss_function(x, a, x0, sigma): + return a*np.exp(-(x-x0)**2/(2*sigma**2)) + + +def exp_function(x, a, b, c): + return a*np.exp(-b*x)+c diff --git a/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py b/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py new file mode 100644 index 0000000000..0d1cfdb14e --- /dev/null +++ b/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py @@ -0,0 +1,847 @@ +from six import string_types +import numpy as np +import pandas as pd +import scipy.stats as st +import scipy.ndimage as ndi +import warnings + +from scipy.optimize import curve_fit +from scipy.ndimage import gaussian_filter + + +from ..ecephys_session import EcephysSession +from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysNwbSessionApi + +import warnings +warnings.simplefilter(action='ignore', category=RuntimeWarning) + +class StimulusAnalysis(object): + def __init__(self, ecephys_session, trial_duration=None, **kwargs): + """ + :param ecephys_session: an EcephySession object or path to ece nwb file. + """ + # TODO: Create a set of a class methods. + if isinstance(ecephys_session, EcephysSession): + self._ecephys_session = ecephys_session + elif isinstance(ecephys_session, string_types): + nwb_version = kwargs.get('nwb_version', 2) + self._ecephys_session = EcephysSession.from_nwb_path(path=ecephys_session, nwb_version=nwb_version) + elif isinstance(ecephys_session, EcephysNwbSessionApi): + # nwb_version = kwargs.get('nwb_version', 2) + self._ecephys_session = EcephysSession(api=ecephys_session) + else: + raise TypeError(f"Don't know how to make a stimulus analysis object from a {type(ecephys_session)}") + + self._unit_ids = None + self._unit_filter = kwargs.get('filter', None) + self._params = kwargs.get('params', None) + self._unit_count = None + self._stim_table = None + self._conditionwise_statistics = None + self._presentationwise_statistics = None + self._presentationwise_spikes = None + self._conditionwise_psth = None + self._stimulus_conditions = None + + self._spikes = None + self._stim_table_spontaneous = None + self._stimulus_key = kwargs.get('stimulus_key', None) + self._running_speed = None + # self._sweep_events = None + # self._mean_sweep_events = None + # self._sweep_p_values = None + self._metrics = None + + # start and stop times of blocks for the relevant stimulus. Used by the overall_firing_rate functions that only + # need to be calculated once, but not accessable to the user + self._block_starts = None + self._block_stops = None + + # self._module_name = None # TODO: Remove, .name() should be hardcoded + + self._psth_resolution = kwargs.get('psth_resolution', 0.001) + + # Duration a sponteous stimulus should last for before it gets included in the analysis. + self._spontaneous_threshold = kwargs.get('spontaneous_threshold', 100.0) + + # Roughly the length of each stimulus duration, used for calculating spike statististics + self._trial_duration = trial_duration + + # Keeps track of preferred stimulus_condition_id for each unit + self._preferred_condition = {} + + @property + def ecephys_session(self): + return self._ecephys_session + + @property + def unit_ids(self): + """Returns a list of unit IDs for which to apply the analysis""" + if self._unit_ids is None: + units_df = self.ecephys_session.units + if isinstance(self._unit_filter, (list, tuple, np.ndarray, pd.Series)): + # If the user passes a list/array of ids + units_df = units_df.loc[self._unit_filter] + + elif isinstance(self._unit_filter, dict): + if 'unit_id' in self._unit_filter.keys(): + # If user wants to filter by the unit_id column which is actually the dataframe index + units_df = units_df.loc[self._unit_filter['unit_id']] + + else: + # Create a mask for all units that match the all of specified conditions. + mask = True + for col, val in self._unit_filter.items(): + if isinstance(val, (list, np.ndarray)): + mask &= units_df[col].isin(val) + else: + mask &= units_df[col] == val + units_df = units_df[mask] + + if units_df is None or units_df.empty: + # If not units are found don't proceed. + raise Exception('Could not find units for ecephys session.') + + self._unit_ids = units_df.index.values + + return self._unit_ids + + @property + def unit_count(self): + """Get the number of units.""" + if not self._unit_count: + self._unit_count = len(self.unit_ids) + return self._unit_count + + @property + def name(self): + """ Return the stimulus name.""" + return self._module_name + + @property + def trial_duration(self): + if self._trial_duration is None or self._trial_duration < 0.0: + # TODO: Should we calculate trial_duration from min(stim_table['duration']) if not set by user/subclass? + raise TypeError(f'Invalid value {self._trial_duration} for parameter "trial_duration".') + + return self._trial_duration + + @property + def spikes(self): + """Returns a dictionary of unit_id -> spike-times.""" + # TODO: This may be unecessary since we already have the presentationwise_spike_times table. + if self._spikes is None: + self._spikes = self.ecephys_session.spike_times + if len(self._spikes) > self.unit_count: + # if a filter has been applied such that not all the cells are being used in the analysis + self._spikes = {k: v for k, v in self._spikes.items() if k in self.unit_ids} + + return self._spikes + + @property + def stim_table(self): + # Stimulus table is already in EcephysSession object, just need to subselect presentations for this stimulus. + if self._stim_table is None: + if self._stimulus_key is None: + stims_table = self.ecephys_session.stimulus_presentations + self._stimulus_key = self._find_stimulus_key(stims_table) + if self._stimulus_key is None: + raise Exception('Could not find approipate stimulus_name key for current stimulus type. Please ' + 'specify using the stimulus_key parameter.') + + self._stim_table = self.ecephys_session.get_stimulus_table( + [self._stimulus_key] if isinstance(self._stimulus_key, string_types) else self._stimulus_key + ) + + if self._stim_table.empty: + raise Exception(f'Could not find stimulus data with "stimulus_key" {self._stimulus_key}') + + # TODO: Should we remove columns that are not relevant to the selected stimulus? If a feature for another + # has random junk it can mess up stimulus_conditions table. + + return self._stim_table + + def _find_stimulus_key(self, stim_table): + """Tries to guess the correct stimulus_key based on the data. + + :param stim_table: + :return: + """ + known_keys_lc = [k.lower() for k in self.__class__.known_stimulus_keys()] + for table_key in stim_table['stimulus_name'].unique(): + if table_key.lower() in known_keys_lc: + return table_key + + else: + return None + + @property + def known_spontaneous_keys(self): + return ['spontaneous', "spontaneous_activity"] + + @property + def total_presentations(self): + """ Total nmber of presentations / trials""" + return len(self.stim_table) + + @property + def metrics_names(self): + return [c[0] for c in self.METRICS_COLUMNS] + + @property + def metrics_dtypes(self): + return [c[1] for c in self.METRICS_COLUMNS] + + @property + def METRICS_COLUMNS(self): + raise NotImplementedError + + @property + def stim_table_spontaneous(self): + """Returns a stimulus table with only 'spontaneous' stimulus selected.""" + # Used by sweep_p_events for creating null dist. + # TODO: This may not be need anymore? Ask the scientists if sweep_p_events will be required in the future. + if self._stim_table_spontaneous is None: + stim_table = self.ecephys_session.get_stimulus_table(self.known_spontaneous_keys) + # TODO: If duration does not exists in stim_table create it from stop and start times + self._stim_table_spontaneous = stim_table[stim_table['duration'] > self._spontaneous_threshold] + + return self._stim_table_spontaneous + + @property + def null_condition(self): + raise NotImplementedError() + + @property + def conditionwise_psth(self): + """For every unit and stimulus-condition construction a PSTH table. ie. the spike-counts at a each time-interval + during a stimulus, averaged over all trials of the same stim condition. + + Each PSTH will count and average spikes over a time-window as determined by class parameter 'trial_duration' + which ideally be a similar value as the duration of each stimulus (in seconds). The length of each time-bin + is determined by the class parameter 'psth_resolution' (in seconds). + + Returns + ------- + conditionwise_psth xarray.DataArray + An 3D table that contains the PSTH for every unit/condition, with the following coordinates + - stimulus_condition_id + - time_relative_to_stimulus_onset + - unit_id + """ + + if self._conditionwise_psth is None: + if self._psth_resolution > self.trial_duration: + warnings.warn('parameter "psth_resolution" > "trial_duration", PSTH will not be properly created.') + + # get the spike-counts for every stimulus_presentation_id + dataset = self.ecephys_session.presentationwise_spike_counts( + bin_edges=np.arange(0, self.trial_duration, self._psth_resolution), + stimulus_presentation_ids=self.stim_table.index.values, + unit_ids=self.unit_ids + ) + + # replace the stimulus_presentation_id (which will be unique for every single stim) with the corresponding + # stimulus_condition_id (which will be shared among presenations with the same conditions. + da = dataset.assign_coords(stimulus_presentation_id=self.stim_table['stimulus_condition_id'].values) + da = da.rename({'stimulus_presentation_id': 'stimulus_condition_id'}) + + # Average spike counts across each stimulus_condition_id. + n_stimuli = len(da['stimulus_condition_id']) + n_cond_ids = len(np.unique(da.coords['stimulus_condition_id'].values)) + if n_stimuli == n_cond_ids: + # If every condition_id is unique then calling groupby().mean() is unnecessary and will raise an error. + self._conditionwise_psth = da + else: + self._conditionwise_psth = da.groupby('stimulus_condition_id').mean(dim='stimulus_condition_id') + + return self._conditionwise_psth + + @property + def conditionwise_statistics(self): + """Create a table of spike statistics, averaged and indexed by every unit_id, stimulus_condition_id pair. + + Returns + ------- + conditionwise_statistics: pd.DataFrame + A dataframe indexed by unit_id and stimulus_condition containing spike_count, spike_mean, spike_sem, + spike_std and stimulus_presentation_count information. + """ + if self._conditionwise_statistics is None: + self._conditionwise_statistics = self.ecephys_session.conditionwise_spike_statistics( + self.stim_table.index.values, self.unit_ids) + + return self._conditionwise_statistics + + @property + def presentationwise_spike_times(self): + """Constructs a table containing all the relevant spike_times plus the stimulus_presentation_id and unit_id + for the given spike. + + Returns + ------- + presentationwise_spike_times : pd.DataFrame + Indexed by spike_time, each spike containing the corresponding stimulus_presentation_id and unit_id + + """ + if self._presentationwise_spikes is None: + self._presentationwise_spikes = self.ecephys_session.presentationwise_spike_times( + stimulus_presentation_ids=self.stim_table.index.values, + unit_ids=self.unit_ids + ) + + return self._presentationwise_spikes + + @property + def presentationwise_statistics(self): + """Returns a table of the spike-counts, stimulus-conditions and running speed for every stimulus_presentation_id + , unit_id pair. + + Returns + ------- + presentationwise_statistics: pd.DataFrame + MultiIndex : unit_id, stimulus_presentation_id + Columns : spike_count, stimulus_condition_id, running_speed + + """ + if self._presentationwise_statistics is None: + # for each presentation_id and unit_id get the spike_counts across the entire duration. Since there is only + # a single bin we can drop time_relative_to_stimulus_onset. + df = self.ecephys_session.presentationwise_spike_counts( + bin_edges=np.array([0.0, self.trial_duration]), + stimulus_presentation_ids=self.stim_table.index.values, + unit_ids=self.unit_ids + ).to_dataframe().reset_index(level='time_relative_to_stimulus_onset', drop=True) + + # left join table with stimulus_condition_id and mean running_speed joined on stimulus_presentation_id + df = df.join(self.stim_table.loc[df.index.levels[0].values]['stimulus_condition_id']) + self._presentationwise_statistics = df.join(self.running_speed) + + return self._presentationwise_statistics + + @property + def stimulus_conditions(self): + """Returns a table of relevant stimulus_conditions. + + Returns + ------- + pd.DataFrame : + Index : stimulus_condition_id + Columns : stimulus parameter types + + """ + + if self._stimulus_conditions is None: + condition_list = self.stim_table['stimulus_condition_id'].unique() + self._stimulus_conditions = self.ecephys_session.stimulus_conditions[ + self.ecephys_session.stimulus_conditions.index.isin(condition_list) + ] + + return self._stimulus_conditions + + @property + def running_speed(self): + """Construct a dataframe with the averaged running speed for each stimulus_presenation_id + + Return + ------- + running_speed: pd.DataFrame: + For each stimulus_presenation_id (index) contains the averaged running velocity. + + """ + if self._running_speed is None: + def get_velocity(presentation_id): + """Helper function for getting avg. velocities for a given presenation_id""" + pres_row = self.stim_table.loc[presentation_id] + mask = (self.ecephys_session.running_speed['start_time'] >= pres_row['start_time']) \ + & (self.ecephys_session.running_speed['start_time'] < pres_row['stop_time']) + + return self.ecephys_session.running_speed[mask]['velocity'].mean() + + self._running_speed = pd.DataFrame(index=self.stim_table.index.values, + data={'running_speed': + [get_velocity(i) for i in self.stim_table.index.values] + }).rename_axis('stimulus_presentation_id') + + # TODO: The below is equivelent but uses numpy vectorization, profile to see if it's worth swapping out. + # stim_times = np.zeros(len(self.stim_table)*2, dtype=np.float64) + # stim_times[::2] = self.stim_table['start_time'].values + # stim_times[1::2] = self.stim_table['stop_time'].values + # sampled_indicies = np.where((self._ecephys_session.running_speed.start_time >= stim_times[0]) + # & (self._ecephys_session.running_speed.start_time < stim_times[-1]))[0] + # relevant_dxtimes = self._ecephys_session.running_speed.start_time[sampled_indicies] + # relevant_dxcms = self._ecephys_session.running_speed.velocity[sampled_indicies] + # + # indices = np.searchsorted(stim_times, relevant_dxtimes.values, side='right') + # rs_tmp_df = pd.DataFrame({'running_speed': relevant_dxcms, 'stim_indicies': indices}) + # + # # get averaged running speed for each stimulus + # rs_tmp_df = rs_tmp_df.groupby('stim_indicies').agg('mean') + # self._running_speed = rs_tmp_df.set_index(self.stim_table.index) + + return self._running_speed + + ''' + @property + def sweep_p_values(self): + """mean sweeps taken from randomized 'spontaneous' trial data.""" + if self._sweep_p_values is None: + self._sweep_p_values = self._calc_sweep_p_values() + + return self._sweep_p_values + + def _calc_sweep_p_values(self, n_samples=10000, step_size=0.0001, offset=0.33): + """ Calculates the probability, for each unit and stimulus presentation, that the number of spikes emitted by + that unit during that presentation could have been produced by that unit's spontaneous activity. This is + implemented as a permutation test using spontaneous activity (gray screen) periods as input data. + + Parameters + ========== + + Returns + ======= + sweep_p_values : pd.DataFrame + Each row is a stimulus presentation. Each column is a unit. Cells contain the probability that the + unit's spontaneous activity could account for its observed spiking activity during that presentation + (uncorrected for multiple comparisons). + + """ + # TODO: Code is currently a speed bottle-neck and could probably be improved. + # Recreate the mean-sweep-table but using randomly selected 'spontaneuous' stimuli. + shuffled_mean = np.empty((self.unit_count, n_samples)) + #print(self.stim_table_spontaneous) + #exit() + idx = np.random.choice(np.arange(self.stim_table_spontaneous['start_time'].iloc[0], + self.stim_table_spontaneous['stop_time'].iloc[0], + step_size), n_samples) # TODO: what step size for np.arange? + for shuf in range(n_samples): + for i, v in enumerate(self.spikes.keys()): + spikes = self.spikes[v] + shuffled_mean[i, shuf] = len(spikes[(spikes > idx[shuf]) & (spikes < (idx[shuf] + offset))]) + + sweep_p_values = pd.DataFrame(index=self.stim_table.index.values, columns=self.sweep_events.columns) + for i, unit_id in enumerate(self.spikes.keys()): + subset = self.mean_sweep_events[unit_id].values + null_dist_mat = np.tile(shuffled_mean[i, :], reps=(len(subset), 1)) + actual_is_less = subset.reshape(len(subset), 1) <= null_dist_mat + p_values = np.mean(actual_is_less, axis=1) + sweep_p_values[unit_id] = p_values + + return sweep_p_values + ''' + + @property + def metrics(self): + """Returns a pandas DataFrame of the stimulus response metrics for each unit.""" + raise NotImplementedError() + + def empty_metrics_table(self): + # pandas can have issues interpreting type and makes the column 'object' type, this should enforce the + # correct data type for each column + empty_array = np.empty(self.unit_count, dtype=np.dtype(self.METRICS_COLUMNS)) + empty_array[:] = np.nan + + return pd.DataFrame(empty_array, index=self.unit_ids).rename_axis('unit_id') + + + def _find_stimuli(self): + raise NotImplementedError() + + ## Helper functions for calling metrics of individual units. ## + def _get_preferred_condition(self, unit_id): + """Determines and caches the prefered stimulus_condition_id based on mean spikes, ignoring null conditions.""" + # TODO: Should probably be renamed to preferred_condition_id so there is no confusion. + if unit_id not in self._preferred_condition: + # Use conditionwise_statistics 'spike_mean' column to find stimulus_condition_id that gives the highest + # value. + try: + df = self.conditionwise_statistics.drop(index=self.null_condition, level=1) + except (IndexError, NotImplementedError) as err: + df = self.conditionwise_statistics + + # TODO: Calculated preferred condition_id once for all units and store in a table. + self._preferred_condition[unit_id] = df.loc[unit_id]['spike_mean'].idxmax() + + return self._preferred_condition[unit_id] + + def _check_multiple_pref_conditions(self, unit_id, stim_cond_col, valid_conditions): + # find all stimulus_condition which share the same 'stim_cond_col' (eg TF, ORI, etc) value, calculate the avg + # spiking + similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[stim_cond_col] == v].tolist() + for v in valid_conditions] + spike_means = [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() + for condition_inds in similar_conditions] + + # Check if there is more than one stimulus condition that provokes a maximum response + return len(np.argwhere(spike_means == np.amax(spike_means))) > 1 + + + def _get_running_modulation(self, unit_id, preferred_condition, threshold=1.0): + """Get running modulation for the preferred condition of a given unit""" + subset = self.presentationwise_statistics[ + self.presentationwise_statistics['stimulus_condition_id'] == preferred_condition + ].xs(unit_id, level='unit_id') + + spike_counts = subset['spike_counts'].values + running_speeds = subset['running_speed'].values + return running_modulation(spike_counts, running_speeds, threshold) + + def _get_lifetime_sparseness(self, unit_id): + """Computes lifetime sparseness of responses for one unit""" + df = self.conditionwise_statistics.drop(index=self.null_condition, level=1) + responses = df.loc[unit_id]['spike_count'].values + + return lifetime_sparseness(responses) + + def _get_reliability(self, unit_id, preferred_condition): + # Reliability calculation goes here: + # Depends on the trial-to-trial correlation of the smoothed response + # What smoothing window is appropriate for ephys? We need to test this more + # TODO: If not implemented soon should be removed + return np.nan + + def _get_fano_factor(self, unit_id, preferred_condition): + # See: https://en.wikipedia.org/wiki/Fano_factor + subset = self.presentationwise_statistics[ + self.presentationwise_statistics['stimulus_condition_id'] == preferred_condition + ].xs(unit_id, level=1) + + spike_counts = subset['spike_counts'].values + return fano_factor(spike_counts) + + def _get_time_to_peak(self, unit_id, preferred_condition): + """Equal to the time of the maximum firing rate of the average PSTH at the preferred condition""" + try: + # TODO: Try to find a way to generalize that doesn't rely on conditionwise_psth + psth = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=preferred_condition) + peak_time = psth.where(psth == psth.max(), drop=True)['time_relative_to_stimulus_onset'][0].values + except Exception as e: + peak_time = np.nan + + return peak_time + + def _get_overall_firing_rate(self, unit_id): + """ Average firing rate over the entire stimulus interval""" + if self._block_starts is None: + # For the stimulus, create a list of start and stop times for the given block of trials. Only needs to be + # calculated once TODO: see if python allows for private property variables + start_time_intervals = np.diff(self.stim_table['start_time']) + + interval_end_inds = np.concatenate((np.where(start_time_intervals > self.trial_duration * 2)[0], + np.array([self.total_presentations-1]))) + interval_start_inds = np.concatenate((np.array([0]), + np.where(start_time_intervals > self.trial_duration * 2)[0] + 1)) + + self._block_starts = self.stim_table.iloc[interval_start_inds]['start_time'].values + self._block_stops = self.stim_table.iloc[interval_end_inds]['stop_time'].values + # TODO: Check start and start times that differences are positive + + return overall_firing_rate(start_times=self._block_starts, stop_times=self._block_stops, + spike_times=self.ecephys_session.spike_times[unit_id]) + + def get_intrinsic_timescale(self, unit_ids): + """Calculates the intrinsic timescale for a subset of units""" + # TODO: Recently added by not yet being used, should indicate if/how it will be used! Maybe make protected? + dataset = self.ecephys_session.presentationwise_spike_counts( + bin_edges=np.arange(0, self.trial_duration, 0.025), + stimulus_presentation_ids = self.stim_table.index.values, + unit_ids=unit_ids + ) + rsc_time_matrix = calculate_time_delayed_correlation(dataset) + t, y, y_std, a, intrinsic_timescale, c = fit_exp(rsc_time_matrix) + return intrinsic_timescale + + ### VISUALIZATION ### + def plot_conditionwise_raster(self, unit_id): + """ Plot a matrix of rasters for each condition (orientations x temporal frequencies) """ + _ = [self.plot_raster(cond, unit_id) for cond in self.stimulus_conditions.index.values] + + def plot_raster(self, condition, unit_id): + raise NotImplementedError() + + + @classmethod + def known_stimulus_keys(cls): + """Used for discovering the correct stimulus_name key for a given StimulusAnalysis subclass (when stimulus_key + is not explicity set). Should return a list of "stimulus_name" strings. + """ + raise NotImplementedError() + + +def running_modulation(spike_counts, running_speeds, speed_threshold=1.0): + """Given a series of trials that include the spike-counts and (averaged) running-speed, does a statistical + comparison to see if there was any difference in spike firing while running and while stationary. + + Requires at least 2 trials while the mouse is running and two when the mouse is stationary. + + Parameters + ---------- + spike_counts : array of floats of size N. + The spike counts for each trial + running_speeds: array floats of size N. + The running velocities (cm/s) of each trial. + speed_threshold: float + The minimum threshold for which the animal can be considered running (default 1.0). + + Returns + ------- + p_value : float or Nan + T-test p-value between the running and stationary trials. + run_mod : float or Nan + Relative difference between running and stationary mean firing rates. + """ + if(len(spike_counts) != len(running_speeds)): + warnings.warn('spike_counts and running_speeds must be arrays of the same shape.') + return np.NaN, np.NaN + + is_running = running_speeds >= speed_threshold # keep track of when the animal is and isn't running + + # Requires at-least two periods when the mouse is running and two when the mouse is not running. + if 1 < np.sum(is_running) < (len(running_speeds) - 1): + # calculate the relative differerence between mean running and stationary spike counts + run = spike_counts[is_running] + stat = spike_counts[np.invert(is_running)] + + run_mean = np.mean(run) + stat_mean = np.mean(stat) + + if run_mean == stat_mean == 0: + return np.NaN, np.NaN + if run_mean > stat_mean: + run_mod = (run_mean - stat_mean) / run_mean + else: + run_mod = -1 * (stat_mean - run_mean) / stat_mean + + # Get the p-value between the two populations. + (_, p) = st.ttest_ind(run, stat, equal_var=False) + return p, run_mod + else: + return np.NaN, np.NaN + + +def lifetime_sparseness(responses): + """Computes the lifetime sparseness for one unit. See Olsen & Wilson 2008. + + Parameters + ---------- + responses : array of floats + An array of a unit's spike-counts over the duration of multiple trials within a given session + + Returns + ------- + lifetime_sparsness : float + The lifetime sparseness for one unit + """ + if len(responses) <= 1: + # Unable to calculate, return nan + warnings.warn('responses array must contain at least two or more values to calculate.') + return np.nan + + coeff = 1.0/len(responses) + return (1.0 - coeff*((np.power(np.sum(responses), 2)) / (np.sum(np.power(responses, 2))))) / (1.0 - coeff) + + +def fano_factor(spike_counts): + """Computers the fano factor (var/mean) for the spike-counts across a series of trials. + + Parameters + ---------- + spike_counts : array + The spike counts across a series of 2 or more trials + + Returns + ------- + fano_factor : float + """ + spike_count_mean = np.mean(spike_counts) + if spike_count_mean == 0: + return np.nan + + return np.var(spike_counts) / spike_count_mean + + +def overall_firing_rate(start_times, stop_times, spike_times): + """Computes the global firing rate of a series of spikes, for only those values within the given start and + stop times. + + Parameters + ---------- + start_times : array of N floats + A series of stimulus block start times (seconds) + stop_times : array of N floats + Times when the stimulus block ends + spike_times : array of floats + A list of spikes for a given unit + + Returns + ------- + firing_rate : float + """ + if len(start_times) != len(stop_times): + warnings.warn('start_times and stop_times must be arrays of the same length') + return np.nan + + if len(spike_times) == 0: + # No spikes, firing rate 0 + return 0.0 + + total_time = np.sum(stop_times - start_times) + if total_time <= 0: + # Probably start and stop times got inverted. + warnings.warn(f'The total duration was {total_time} seconds.') + return np.nan + + return np.sum(spike_times.searchsorted(stop_times) - spike_times.searchsorted(start_times)) / total_time + + +def get_fr(spikes, num_timestep_second=30, sweep_length=3.1, filter_width=0.1): + """Uses a gaussian convolution to convert the spike-times into a contiguous firing-rate series. + + Parameters + ---------- + spikes : array + An array of spike times (shifted to start at 0) + num_timestep_second : float + The sampling frequency + sweep_length : float + The lenght of the returned array + filter_width: float + The window of the gaussian method + + Returns + ------- + firing_rate : float + A linear-spaced array of length num_timestep_second*sweep_length of the smoothed firing rates series. + """ + spikes = spikes.astype(float) + spike_train = np.zeros((int(sweep_length*num_timestep_second))) + spike_train[(spikes*num_timestep_second).astype(int)] = 1 + filter_width = int(filter_width*num_timestep_second) + fr = ndi.gaussian_filter(spike_train, filter_width) + return fr + + +def reliability(unit_sweeps, padding=1.0, num_timestep_second=30, filter_width=0.1, window_beg=0, window_end=None): + """Computes the trial-to-trial reliability for a set of sweeps for a given cell + + :param unit_sweeps: + :param padding: + :return: + """ + if isinstance(unit_sweeps, (list, tuple)): + unit_sweeps = np.array([np.array(l) for l in unit_sweeps]) + + unit_sweeps = unit_sweeps + padding # DO NOT use the += as for python arrays that will do in-place modification + corr_matrix = np.empty((len(unit_sweeps), len(unit_sweeps))) + fr_window = slice(window_beg, window_end) + for i in range(len(unit_sweeps)): + fri = get_fr(unit_sweeps[i], num_timestep_second=num_timestep_second, filter_width=filter_width) + for j in range(len(unit_sweeps)): + frj = get_fr(unit_sweeps[j], num_timestep_second=num_timestep_second, filter_width=filter_width) + # Warning: the pearson coefficient is likely to have a denominator of 0 for some cells/stimulus and give + # a divide by 0 warning. + r, p = st.pearsonr(fri[fr_window], frj[fr_window]) + corr_matrix[i, j] = r + + inds = np.triu_indices(len(unit_sweeps), k=1) + upper = corr_matrix[inds[0], inds[1]] + return np.nanmean(upper) + + +def osi(orivals, tuning): + """Computes the orientation selectivity of a cell. The calculation of the orientation is done using the normalized + circular variance (CirVar) as described in Ringbach 2002 + + Parameters + ---------- + ori_vals : complex array of length N + Each value the oriention of the stimulus. + tuning : float array of length N + Each value the (averaged) response of the cell at a different orientation. + + Returns + ------- + osi : float + An N-dimensional array of the circular variance (scalar value, in radians) of the responses. + """ + if len(orivals) == 0 or len(orivals) != len(tuning): + warnings.warn('orivals and tunings are of different lengths') + return np.nan + + tuning_sum = tuning.sum() + if tuning_sum == 0.0: + return np.nan + + cv_top = tuning * np.exp(1j * 2 * orivals) + return np.abs(cv_top.sum()) / tuning_sum + + +def dsi(orivals, tuning): + """Computes the direction selectivity of a cell. See Ringbach 2002, Van Hooser 2014 + + Parameters + ---------- + ori_vals : complex array of length N + Each value the oriention of the stimulus. + tuning : float array of length N + Each value the (averaged) response of the cell at a different orientation. + + Returns + ------- + osi : float + An N-dimensional array of the circular variance (scalar value, in radians) of the responses. + """ + if len(orivals) == 0 or len(orivals) != len(tuning): + warnings.warn('orivals and tunings are of different lengths') + return np.nan + + tuning_sum = tuning.sum() + if tuning_sum == 0.0: + return np.nan + + cv_top = tuning * np.exp(1j * orivals) + return np.abs(cv_top.sum()) / tuning_sum + + +def deg2rad(arr): + """ Converts array-like input from degrees to radians""" + # TODO: Is there any reason not to use np.deg2rad? + return arr / 180 * np.pi + +def fit_exp(rsc_time_matrix): + + intr = abs(rsc_time_matrix) + tmp = np.nanmean(intr, axis=0) + n=intr.shape[0] + + t = np.arange(len(tmp))[1:] + y=gaussian_filter(np.nanmean(tmp, axis=0)[1:],0.8) + + p, amo = curve_fit(lambda t,a,b,c: a*np.exp(-1/b*t)+c, t, y, p0=(-4, 2, 1), maxfev = 1000000000) + + a=p[0] + b=p[1] # this is the intrinsic timescale + c=p[2] + y_std = np.nanstd(tmp, axis=0)[1:]/np.sqrt(n) + + return t, y, y_std, a, b, c + + +def calculate_time_delayed_correlation(dataset): + + nbins = dataset.time_relative_to_stimulus_onset.size + num_units = dataset.unit_id.size + + rsc_time_matrix = np.zeros((num_units, nbins, nbins)) * np.nan + + for unit_idx, unit in enumerate(dataset.unit_id): + + spikes_for_unit = dataset.sel(unit_id=unit).data + + for i in np.arange(nbins-1): + for j in np.arange(i+1, nbins): + good_trials = (spikes_for_unit[:,i] * spikes_for_unit[:,j]) > 0 # remove zero spike count bins + r, p = st.pearsonr(spikes_for_unit[good_trials,i], spikes_for_unit[good_trials,j]) + rsc_time_matrix[unit_idx, i, j] = r + + return rsc_time_matrix diff --git a/brain_observatory/ecephys/stimulus_sync.py b/brain_observatory/ecephys/stimulus_sync.py new file mode 100644 index 0000000000..ddcd15d007 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_sync.py @@ -0,0 +1,159 @@ +import warnings + +import numpy as np +import scipy.spatial.distance as distance + + +def trimmed_stats(data, pctiles=(10, 90)): + low = np.percentile(data, pctiles[0]) + high = np.percentile(data, pctiles[1]) + + trimmed = data[np.logical_and( + data <= high, + data >= low + )] + + return np.mean(trimmed), np.std(trimmed) + + +def trim_border_pulses(pd_times, vs_times, frame_interval=1/60, num_frames=5): + pd_times = np.array(pd_times) + return pd_times[np.logical_and( + pd_times >= vs_times[0], + pd_times <= vs_times[-1] + num_frames * frame_interval + )] + + +def correct_on_off_effects(pd_times): + ''' + + Notes + ----- + This cannot (without additional info) determine whether an assymmetric offset is odd-long or even-long. + ''' + + pd_diff = np.diff(pd_times) + odd_diff_mean, odd_diff_std = trimmed_stats(pd_diff[1::2]) + even_diff_mean, even_diff_std = trimmed_stats(pd_diff[0::2]) + + half_diff = np.diff(pd_times[0::2]) + full_period_mean, full_period_std = trimmed_stats(half_diff) + half_period_mean = full_period_mean / 2 + + odd_offset = odd_diff_mean - half_period_mean + even_offset = even_diff_mean - half_period_mean + + pd_times[::2] -= odd_offset / 2 + pd_times[1::2] -= even_offset / 2 + + return pd_times + + +def flag_unexpected_edges(pd_times, ndevs=10): + pd_diff = np.diff(pd_times) + diff_mean, diff_std = trimmed_stats(pd_diff) + + expected_duration_mask = np.ones(pd_diff.size) + expected_duration_mask[np.logical_or( + pd_diff < diff_mean - ndevs * diff_std, + pd_diff > diff_mean + ndevs * diff_std + )] = 0 + expected_duration_mask[1:] = np.logical_and(expected_duration_mask[:-1], expected_duration_mask[1:]) + expected_duration_mask = np.concatenate([expected_duration_mask, [expected_duration_mask[-1]]]) + + return expected_duration_mask + + +def fix_unexpected_edges(pd_times, ndevs=10, cycle=60, max_frame_offset=4): + pd_times = np.array(pd_times) + expected_duration_mask = flag_unexpected_edges(pd_times, ndevs=ndevs) + diff_mean, diff_std = trimmed_stats(np.diff(pd_times)) + frame_interval = diff_mean / cycle + + bad_edges = np.where(expected_duration_mask == 0)[0] + bad_blocks = np.sort(np.unique(np.concatenate([ + [0], + np.where(np.diff(bad_edges) > 1)[0] + 1, + [len(bad_edges)] + ]))) + + output_edges = [] + for low, high in zip(bad_blocks[:-1], bad_blocks[1:]): + current_bad_edge_indices = bad_edges[low: high-1] + current_bad_edges = pd_times[current_bad_edge_indices] + low_bound = pd_times[current_bad_edge_indices[0]] + high_bound = pd_times[current_bad_edge_indices[-1] + 1] + + edges_missing = int(np.around((high_bound - low_bound) / diff_mean)) + expected = np.linspace(low_bound, high_bound, edges_missing + 1) + + distances = distance.cdist(current_bad_edges[:, None], expected[:, None]) + distances = np.around(distances / frame_interval).astype(int) + + min_offsets = np.amin(distances, axis=0) + min_offset_indices = np.argmin(distances, axis=0) + output_edges = np.concatenate([ + output_edges, + expected[min_offsets > max_frame_offset], + current_bad_edges[min_offset_indices[min_offsets <= max_frame_offset]] + ]) + + return np.sort(np.concatenate([output_edges, pd_times[expected_duration_mask > 0]])) + + +def estimate_frame_duration(pd_times, cycle=60): + return trimmed_stats(np.diff(pd_times))[0] / cycle + + +def assign_to_last(index, starts, ends, frame_duration, irregularity, cycle): + ends[-1] += frame_duration * np.sign(irregularity) + return starts, ends + + +def allocate_by_vsync(vs_diff, index, starts, ends, frame_duration, irregularity, cycle): + current_vs_diff = vs_diff[index * cycle: (index + 1) * cycle] + sign = np.sign(irregularity) + + if sign > 0: + vs_ind = np.argmax(current_vs_diff) + elif sign < 0: + vs_ind = np.argmin(current_vs_diff) + + ends[vs_ind:] += sign * frame_duration + starts[vs_ind + 1:] += sign * frame_duration + + return starts, ends + + +def compute_frame_times(photodiode_times, frame_duration, num_frames, cycle, irregular_interval_policy=assign_to_last): + + indices = np.arange(num_frames) + starts = np.zeros(num_frames, dtype=float) + ends = np.zeros(num_frames, dtype=float) + + num_intervals = len(photodiode_times) - 1 + for start_index, (start_time, end_time) in enumerate(zip(photodiode_times[:-1], photodiode_times[1:])): + + interval_duration = end_time - start_time + irregularity = int(np.around((interval_duration) / frame_duration)) - cycle + + local_frame_duration = interval_duration / (cycle + irregularity) + durations = np.zeros(cycle + ( start_index == num_intervals - 1 )) + local_frame_duration + + current_ends = np.cumsum(durations) + start_time + current_starts = current_ends - durations + + while irregularity != 0: + current_starts, current_ends = irregular_interval_policy( + start_index, current_starts, current_ends, local_frame_duration, irregularity, cycle + ) + irregularity += -1 * np.sign(irregularity) + + early_frame = start_index * cycle + late_frame = (start_index + 1) * cycle + ( start_index == num_intervals - 1 ) + + remaining = starts[early_frame: late_frame].size + starts[early_frame: late_frame] = current_starts[:remaining] + ends[early_frame: late_frame] = current_ends[:remaining] + + return indices, starts, ends \ No newline at end of file diff --git a/brain_observatory/ecephys/stimulus_table/__init__.py b/brain_observatory/ecephys/stimulus_table/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/stimulus_table/__main__.py b/brain_observatory/ecephys/stimulus_table/__main__.py new file mode 100644 index 0000000000..167cbfe891 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_table/__main__.py @@ -0,0 +1,104 @@ +import functools + +import numpy as np + +from allensdk.brain_observatory.argschema_utilities import \ + ArgSchemaParserPlus, \ + write_or_print_outputs +from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import ( + EcephysSyncDataset, +) +from allensdk.brain_observatory.ecephys.file_io.stim_file import ( + CamStimOnePickleStimFile, +) +from . import ephys_pre_spikes +from . import naming_utilities +from . import output_validation +from ._schemas import InputParameters, OutputSchema + + +def build_stimulus_table( + stimulus_pkl_path, + sync_h5_path, + frame_time_strategy, + minimum_spontaneous_activity_duration, + extract_const_params_from_repr, + drop_const_params, + maximum_expected_spontanous_activity_duration, + stimulus_name_map, + column_name_map, + output_stimulus_table_path, + output_frame_times_path, + fail_on_negative_duration, + **kwargs +): + stim_file = CamStimOnePickleStimFile.factory(stimulus_pkl_path) + + sync_dataset = EcephysSyncDataset.factory(sync_h5_path) + frame_times = sync_dataset.extract_frame_times( + strategy=frame_time_strategy) + + def seconds_to_frames(seconds): + return \ + (np.array(seconds) + stim_file.pre_blank_sec) * \ + stim_file.frames_per_second + + minimum_spontaneous_activity_duration = ( + minimum_spontaneous_activity_duration / stim_file.frames_per_second + ) + + stimulus_tabler = functools.partial( + ephys_pre_spikes.build_stimuluswise_table, + seconds_to_frames=seconds_to_frames, + extract_const_params_from_repr=extract_const_params_from_repr, + drop_const_params=drop_const_params, + ) + spon_tabler = functools.partial( + ephys_pre_spikes.make_spontaneous_activity_tables, + duration_threshold=minimum_spontaneous_activity_duration, + ) + + stim_table_full = ephys_pre_spikes.create_stim_table( + stim_file.stimuli, stimulus_tabler, spon_tabler + ) + stim_table_full = ephys_pre_spikes.apply_frame_times( + stim_table_full, frame_times, stim_file.frames_per_second, True + ) + + output_validation.validate_epoch_durations( + stim_table_full, fail_on_negative_durations=fail_on_negative_duration) + output_validation.validate_max_spontaneous_epoch_duration( + stim_table_full, maximum_expected_spontanous_activity_duration + ) + + stim_table_full = naming_utilities.collapse_columns(stim_table_full) + stim_table_full = naming_utilities.drop_empty_columns(stim_table_full) + stim_table_full = naming_utilities.standardize_movie_numbers( + stim_table_full) + stim_table_full = naming_utilities.add_number_to_shuffled_movie( + stim_table_full) + stim_table_full = naming_utilities.map_stimulus_names( + stim_table_full, stimulus_name_map + ) + stim_table_full = naming_utilities.map_column_names(stim_table_full, + column_name_map) + + stim_table_full.to_csv(output_stimulus_table_path, index=False) + np.save(output_frame_times_path, frame_times, allow_pickle=False) + return { + "output_path": output_stimulus_table_path, + "output_frame_times_path": output_frame_times_path, + } + + +def main(): + mod = ArgSchemaParserPlus( + schema_type=InputParameters, output_schema_type=OutputSchema + ) + output = build_stimulus_table(**mod.args) + + write_or_print_outputs(data=output, parser=mod) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00ea8f869983972013d3955328ec675ae5711228 GIT binary patch literal 217 zcmYL@zX}2|490ulAc7C#pf|XQh<{db5w}7~uR+Vz_PF#;Zq!$C@|9eD1UDzsLHywR zC4_t->)~)9SpI&6R9^`{W!x;;)MFU27o%+V5Oo^=@wshg@<3RVgcF#Fh70&kt~?aM z8<<M;Ey+-!r-B)(Q%7=ZwImyHTtQL75jpD|Z<sRIHCV5L=8G-FP<J^Nm_j*4dv07q cDuQ;HD`mZnN=>Tn*`J?-X&f%nZ*R8v0wDcBx&QzG literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d49c378c92098dcb7af0f68412459b0aa6eafae GIT binary patch literal 2612 zcmb7GOOG2x5T2LE<M(4X+1>CE5<=iZya(WdqCf~lfKU=?;nG^sYEQS<v!0i_+un6F zJ^+z;NSj~4VON~^E&PMIa>`%efT)_Wy)h9;j5R$~)zw|qUp?9%w_0@rp7_^q+3zjG z_yd{sV*&9Iyy_VY+~8(tkn(F13wSHEBZoLqg;Y$G+o2m(NwuJz(2HuM26TnHVLfV) zMnPABZjxp}dqB5HtDtLPJL-^5)FoZu>%8&QAU)pXE%^4u4sTB_`LpPMZ@{d1WDGjb z!6)P4z{+>-$&(|0A|m#fNhRdtaHjH`XEM-&CX%Kyh&4@SI-O}XF!TPWzDOqvb+m~6 zPnc#(XprvTXVH-kqDQfK9Qe~vAoCyy#d8zPfI_!e1iJ~U(qJlZt8UDqAU>fp9fW}n z3R$nTMCU9FIMYEAgNvQdW3UeHu}EkkRo;A5_*1&=H}NR&?7-{7+kjX71%oy&&CIwm ze=@WMlzC+?TUqPW&Ma<Tn9KGL#@OT*x1V~;PG<jToI0-<OIue?U0pr(vQFk?74BR( z%kD~6%WPh`u$Dbty{v<NBkN|pD|^`ozM1v2HtxaQD+eU4(>6#Nyn11ohHhPUfOD^q z?q2q?KKRlHs=uLjHq`Ehx&dpdS5~2U6KD_Vtbe+f)wsuN#m@Vu2U$I917E+eO(Uyi z5dB{)h;j4bz$Bj1l4)_W@G%nj;May1;ZiqYSi=O)TYCnK_O1cT&4&Xgx8gLfFe%xB zv@m$1ki}D~grE1u7!E~KA(2mF4k4|U6h^nEAO+|ca^N@P&+qPkaQrnSmpWz>#)l(z z#^S~Cy_n%T_U^HW=ju2~MXY=n6HKt<FN4vsf-Jn9GJncW1gs51(BRX<kz_$klM(DV zXF8FKLs4esAsU@Q22;&Op*W;8LQOhM7kO{x8`TLdeIFnK4h)9XHlG}hW<kj5_71~4 zVdAq;-5tKX+Lj1m{<=5^h<#1rEK1W9(^P?lB%)HJGVgJjq+62^mOh_BSRlQro=Bl4 zNyxtf@vSinLJHDYoWS&4(6yd=0GL*Sn2U4JYXTI>8BL2?8(5^VDw~w)NxrvYibGNW z1fv8KgIltK4p+zEEr2HR=wxT@{tN1|je525EC$6SRCyInr2`hqDlXaIM(Qk3qQslL z5wR&&coJ(Civ;2Trh<8(7o~zCJzomQ#{%ZnqG}0wKzb}q!$ldK(r;NS?5(<ipdwBD z$u%bA?afTY&bRDtYf2CI>H0|+vJ|`pViv^;!ho?6Q3?*OWd{m;=S=e8iJ(z34+M>8 z(Fl^4yvjIVF_=YaG8>OW!AmXDk63!0KG58RB3+b~JJV9)!a`roC3dacQEV;-JEXVC zx^x;A!6Hos9hOesFS(uT=zxi`qRCs(J|W$st%Gj>UuTZo1xxY<0&p8pDi(<IRQMV^ zUxjKbQtO2;c!jP*DW#<I!dVKztyQvZ4p0<c;k4XCn+N}z(z!c5WAa3;jtcD_ZxhnE zKB_7zjC8g)m!yGim)RrB*^;5-Ss2P5m>rn1i^uN6kne8iYpIK<sLx<9I(4gVI;Lke z-MZ}nWx>z0kn(_U0@a3Zp<~yJuM2bddX{Ut&^)@9Wy;rJFCRC=2QPoDulw+-cVN(l zHnjy8kF_+kJvK79DxR53Q&%#$q_~C6oMYd$;Z}wd7FROWi&T*Q8slpj+=>nYmb*}y z&;|#tM2iytjYzxz3vY4<@s-%^VSybbJa@~z3Xsa7fXKl<`3>kPtP}$Ps9Q}-z6o^h zt-I)8R~~?XRG=QxMUlZ|xNgeBmzwerjh8NOuK3bRbclTTA1hbwe2CWv4U*xCr$tSy z5~XZk@BNQmFpY{EsqBMB(ann1Q1%&*mhP&5z_@{-C<FQec9?2qj(K+g-B~E^;`OTb WVel-^>e@~GnfUA4-WOiYGyet^Zyx^u literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f47b324c34bfb32b2753dfd68009f0d2ea322c8d GIT binary patch literal 3793 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 B!2JLK literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/ephys_pre_spikes.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/ephys_pre_spikes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48bcaae63b828d24bb09064da0cea99ae541b9a6 GIT binary patch literal 13027 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 E9~pAPiU0rr literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/naming_utilities.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/naming_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29d651231ad9e4a383ad643f98ac6ad68488e4c3 GIT binary patch literal 5305 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/output_validation.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/output_validation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4be6ada016a81dedc2c4dcdf4d4f4cad98875c2 GIT binary patch literal 1668 zcma)6&2Jnv6t_JeJDZPf8d8)1hq>@E2NKc3fht5Tr9GhtsX(RCqQyIQb|;zjEVehv zMzaUnN+9tkRF$&g)PHHNoH%np>WTL}>?W!>;FX`>`q|I#<M*2{*Vk7F4E6iZ{O^E} zKk(0D_@LZ_X>NlMM9_ky)U7OKVqF9xd`?qObVMZDp!wp4SQTra1%f^%$;O{>j~v#) zW6QOzy@yIX%Fro}2xbWL0ZgMnRHR}%DCrK_CNsbCFUg$Dg37Og9Wo26P|y>m?^$}u z1gnA<M0i#Bg1q#tH)oVMJJH7i&Vwy@>CIY|r+>75)p|ysQoL8S=9EGz5L|euDZF~| zi5*HU<J`nt#d2I`!#G#59m0mO`Djv1Ol*0-knu;k67u|Re6g9tXSp55VxqatOBH_+ z|CbwgM#%x3Ih9w37j9nDBni?m7w4l~)zKN(Dpvzj`>55c-x;Z&G<)^R_q>?Mhgz39 ziR!?GQ@0IPwRa+?bxSINO8U+b&x>BEdW&a!ix^GaUaILPytuUVTw3Yc^}X5~nZYZf zJ5Zt5zdg9y#b`{I54qUw^E0ld-TR7Xr4sy3SE^IfEyq%s3}iVTPEGggyx%psl^>6J zcESe|?iK}{5GQ+m&EfU34<1jsE%kIyW)d&$E$ZEK3GS5>JD%9yDKB#2>byIi*4zL7 zl|9$1Wflg&OUyP1LN{ncBNkDgc4!Fe8fX#K8(@3IG=oKZATrc&ASCg+gW{*4obOij zEAqn!GiJ#pZGd^q=5*%4f3Nc96rkvv(E3m5PvMgWP^<w|64XqMfeZQ3Q5{0G6KPVP zV~;!c4J3_-X<F&)HawQL0cH~0XVPe)reQYZY9L()8gT>8)?06+Uuq%s+h8%sB|=vq zd3_5{c9zw2{mq;m49Gi77%O1D1yM0UP9nYa3ps+c1bZIMSj8&xj3Vcdd&j`7%EuLW z*;??Zf)eO&tas@H4=M1F*#LRy*ySH)$SxeXVs+nwX*NMrq^at!WQWXw>_A3(m@tjD zI>?RUDxt1439Z{MdaTa1Dn$DQAN2)4cpt9(1(RHSzAVg$pZCnTRF*4QPRtuP+1)S7 zj2Gqrl*Y%!XIEc<_}ayoXF%NCPOqq2l-LsZIKZbO2{mTqqQ?I6bB$SQtg~)`NTQ~_ zYZ%aid+Du#w2SbT(HV`v)%YdWt02<NYjHFQ7`=v8BqS8a9e05E@PFq09$YlY01^Qq zSj4tir=i8W=+e8Q#Ut>46ZiZ>hpa105~hKgjK))!bdxT+bb!<7=NeowQtd*F_D7|d V6!HL(U~nJk>8;#cX#+Ok_Ye0Fx<&v1 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/stimulus_parameter_extraction.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/stimulus_parameter_extraction.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cc367978635301ccd59b446b0680bea0eb85016 GIT binary patch literal 2591 zcma)8&2Jnv6t`z~_A4I^rBp2{!W2|x+h&Ud92%NJNCHBHbhRm@-E6w@j=kCG?#@hY zPtu8IE543!g#$uL#EE}tuAKN6dg9r$J4vaK>S(-v_OsvbJ-_#JKAW4XB53}f-_z<0 zLVs&v+6plE6h8SFI))e?qE_~cTbQF`i&-2!woj~9!ASN*a*R|s!L1^5S|wiM1zu#u zUV)WZ`6t{ebEk({g;il((Q7@6&9GUJstj+V+T1^24{aS?T->EgNAEA)-n+4~`)FnF zMs4?IyS8`q&ZEUo8h6|wm9pd05x<+O)!K{o>+RZmM{iLfXxv^jih-}VujJkKE-dcV z+O=9CE$EG{5{*=_8SJ;pday3&VQL?G{^zcv5kM=!r^jpX$vSijB`C2Ho8e#VvGerJ z1h1pL^W$PtOq@YcTu7XxxPqQs*g=T{u2}RoMu;>yWkmHkkxF>}J`p?=TmmSnyuc?x zk5CfI*zE^l3_9K@8b*>(pAr643F@lT$&d;_uDFo(YL!51<P%0*%9|1OVI6IbENkOt zj)@@bm~$k|swf<CGq2Sq^RNY$1g|%!0$aXWH!*!_B}38VDiXdldJ_bhEf2si6EoIm zM>LdEr#K_IH$>luBq|^WbQp1&om#Wf`4>^8<td69PT!qGr{e~`R8#0Z5sW&y-?dU& z$%WR;8Q+D@Z=r9u^@gCH<ek9pM84o|u<v_EoV8}m#w=2hn|av&LZS@Yp8vMC-2O(w zRkUfJvU-;uQa^65`V{am`azrf2eKW6+?Ou&LD-LFd(-Q-rKk8(NZkS5=dgD;1PwO0 z)dduOC+Nb72UG<jzQtXxH{H@WbV_s-?GE{=n1`=3i3DU*J&e<HumJw#e!m82<t%jQ zl7(mODlX%yC3NMxmY#)XPd=0B*Fi||G35FQ9$SgU(4Zo&F`QV(_yj?oUxPV(8Epd{ z=q%q#tEc4%m*$M9a{FmzUj$LeAO&i+(52LxGq;)P3NADx6UwZsfS6vHUaCQ#shTU* zTR#E~S%ePZD!zclJd9ioT{pcQI4mpHUt!>(vHkStsUuLR&&GwMaEuu~!EI~oK-oHp zJt&Fqz%eT+g0rQh#4K=j9e(Z0Xk3ivm3>?=YsDSpUo9Zz45~t5G%jOwRM<fbcyL^P zR(^mUBHwy|fC}uyxr3f8s3I#Q&hO|C>qq<pezE|hU_-bZ`XNAW<aJ99`<~k;6l%^7 zpwzh{R1$f}d0wWTKcSBaHAq)@p(2Zsj39kt(&a9VB-cuDevm1;11dZyG!_}+(H!Ik z5hRBu9m7amO30d8zAK1S7%2i4sZThS9vnZSZr}6yk^mml8Ay78fGe((`+ZN6UgW!m z$BaQu7^6^`TGq96z=bw6BHdV*yVU$=44+bAj%AYOuf%McP4WZ>ikY&Tp4aU@xT;fT zdbmqRTK$wsgYIMQf)CqJZV;g;Bq0||TF0>OnUIsva|c6S&spq6PI{RsGX#WeWb6%8 zuE5)Fq=4e!YOk(bU6LHEQ3ZyxHzA`=y>Uu#uW;<plgc;=mjJ9s{AdIZh&dpeo<#Eh z*!hefU`-cl?xGeTFQ|xh01eRqT0sUp&R(XBr_XS?L6F@ngjpY5Cp&!(SsezDV~{pC z&BaeP>U0O5g!Irs$nC-l;KQqUz)2%keRv#I9P;T~_Z+WmrDfP<9`vJg4Bjr!1zZ}| zG6AkH^*o^7;V^Y1EGfe<sZFIyXF-IB4?7$Hq}6ZrGqWK?Aky+zJT{|R#jw<whhgSS zgtD{nAjJnM9;G%H;y>IaG&6k+pS%Jcx>T?h@Vr&FG~bpj3(w;PeBP?s=PjdIn@KGo z!Ph}GExExc^oBgGe)+}Lz2?T+>h?x!zPZt8b{ebA)vvcZ&5hQak=Hg?w~bg{Z8ldQ z>V=v0=Do&5(a^dfMq}g*MEzz7!?EQ%qku(2ei!~ZLGmJW0MMQXfK|Itv9SJ|eS5a_ EFUA1u-T(jq literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/_schemas.py b/brain_observatory/ecephys/stimulus_table/_schemas.py new file mode 100644 index 0000000000..753e0aa509 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_table/_schemas.py @@ -0,0 +1,109 @@ +import sys + +from argschema import ArgSchema, ArgSchemaParser +from argschema.schemas import DefaultSchema +from argschema.fields import Nested, InputDir, String, Float, Dict, Int, List, Bool + +from . import naming_utilities as nu + + +default_stimulus_renames = { + "": "spontaneous", + + "natural_movie_1" : "natural_movie_one", + "natural_movie_3" : "natural_movie_three", + "Natural Images": "natural_scenes", + "flash_250ms": "flashes", + "gabor_20_deg_250ms": "gabors", + "drifting_gratings" : "drifting_gratings", + "static_gratings" : "static_gratings", + + "contrast_response": "drifting_gratings_contrast", + "natural_movie_1_more_repeats" : "natural_movie_one", + "natural_movie_shuffled" : "natural_movie_one_shuffled", + "motion_stimulus" : "dot_motion", + "drifting_gratings_more_repeats" : "drifting_gratings_75_repeats", + + "signal_noise_test_0_200_repeats": "test_movie_one", + + "signal_noise_test_0": "test_movie_one", + "signal_noise_test_0": "test_movie_two", + "signal_noise_session_1" : "dense_movie_one", + "signal_noise_session_2" : "dense_movie_two", + "signal_noise_session_3" : "dense_movie_three", + "signal_noise_session_4" : "dense_movie_four", + "signal_noise_session_5" : "dense_movie_five", + "signal_noise_session_6" : "dense_movie_six", +} + + +default_column_renames = { + "Contrast": "contrast", + "Ori": "orientation", + "SF": "spatial_frequency", + "TF": "temporal_frequency", + "Phase": "phase", + "Color": "color", + "Image": "frame", + "Pos_x": "x_position", + "Pos_y": "y_position" +} + + +class InputParameters(ArgSchema): + stimulus_pkl_path = String( + required=True, help="path to pkl file containing raw stimulus information" + ) + sync_h5_path = String( + required=True, help="path to h5 file containing syncronization information" + ) + output_stimulus_table_path = String( + required=True, help="the output stimulus table csv will be written here" + ) + output_frame_times_path = String(required=True, help="output all frame times here") + minimum_spontaneous_activity_duration = Float( + default=sys.float_info.epsilon, + help="detected spontaneous activity sweeps will be rejected if they last fewer that this many seconds", + ) + maximum_expected_spontanous_activity_duration = Float( + default=1225.02541, + help="validation will fail if a spontanous activity epoch longer than this one is computed.", + ) + frame_time_strategy = String( + default="use_photodiode", + help="technique used to align frame times. Options are 'use_photodiode', which interpolates frame times between photodiode edge times (preferred when vsync times are unreliable) and 'use_vsyncs', which is preferred when reliable vsync times are available.", + ) + stimulus_name_map = Dict( + keys=String(), + values=String(), + help="optionally rename stimuli", + default=default_stimulus_renames + ) + column_name_map = Dict( + keys=String(), + values=String(), + help="optionally rename stimulus parameters", + default=default_column_renames + ) + extract_const_params_from_repr = Bool(default=True) + drop_const_params = List( + String(), + help="columns to be dropped from the stimulus table", + default=["name", "maskParams", "win", "autoLog", "autoDraw"], + ) + + fail_on_negative_duration = Bool( + default=False, + help="Determine if the module should fail if a stimulus epoch has a negative duration." + ) + + +class OutputSchema(DefaultSchema): + input_parameters = Nested( + InputParameters, + description=("Input parameters the module " "was run with"), + required=True, + ) + output_path = String(help="Path to output csv file") + output_frame_times_path = String(help="output all frame times here") + diff --git a/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py b/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py new file mode 100644 index 0000000000..a22d9d02fe --- /dev/null +++ b/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py @@ -0,0 +1,437 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Dec 16 15:11:23 2016 + +@author: Xiaoxuan Jia +""" + +import ast +import re +import logging + +import numpy as np +import pandas as pd + +import warnings + +from . import stimulus_parameter_extraction as spe + + +def create_stim_table( + stimuli, + stimulus_tabler, + spontaneous_activity_tabler, + sort_key="Start", + block_key="stimulus_block", + index_key="stimulus_index", +): + """ Build a full stimulus table + + Parameters + ---------- + stimuli : list of dict + Each element is a stimulus dictionary, as provided by the stim.pkl file. + stimulus_tabler : function + A function which takes a single stimulus dictionary as its argument and returns a stimulus table dataframe. + spontaneous_activity_tabler : function + A function which takes a list of stimulus tables as arguments and returns a list of 0 or more tables + describing spontaneous activity sweeps. + sort_key : str, optional + Sort the final stimulus table in ascending order by this key. Defaults to 'Start'. + + Returns + ------- + stim_table_full : pandas.DataFrame + Each row is a sweep. Has columns describing (in frames) the start and end times of each sweep. Other columns + describe the values of stimulus parameters on those sweeps. + + """ + + stimulus_tables = [] + max_index = 0 + + for ii, stimulus in enumerate(stimuli): + current_tables = stimulus_tabler(stimulus) + for table in current_tables: + table[index_key] = ii + + stimulus_tables.extend(current_tables) + + stimulus_tables = sorted(stimulus_tables, key=lambda df: min(df[sort_key].values)) + for ii, stim_table in enumerate(stimulus_tables): + stim_table[block_key] = ii + + stimulus_tables.extend(spontaneous_activity_tabler(stimulus_tables)) + + stim_table_full = pd.concat(stimulus_tables, ignore_index=True, sort=False) + stim_table_full.sort_values(by=[sort_key], inplace=True) + stim_table_full.reset_index(drop=True, inplace=True) + + return stim_table_full + + +def make_spontaneous_activity_tables( + stimulus_tables, start_key="Start", end_key="End", duration_threshold=0.0 +): + """ Fills in frame gaps in a set of stimulus tables. Suitable for use as the spontaneous_activity_tabler in + create_stim_table. + + Parameters + ---------- + stimulus_tables : list of pd.DataFrame + Input tables - should have start_key and end_key columns. + start_key : str, optional + Column name for the start of a sweep. Defaults to 'Start'. + end_key : str, optional + Column name for the end of a sweep. Defaults to 'End'. + duration_threshold : numeric or None + If not None (default is 0), remove spontaneous activity sweeps whose duration is + less than this threshold. + + Returns + ------- + list : + Either empty, or contains a single pd.DataFrame. The rows of the dataframe are spontenous activity sweeps. + + """ + + nstimuli = len(stimulus_tables) + if nstimuli == 0: + return [] + + spon_start = np.zeros(nstimuli + 1, dtype=int) + spon_end = np.zeros(nstimuli, dtype=int) + + for ii, table in enumerate(stimulus_tables): + spon_start[ii + 1] = table[end_key].values[-1] + spon_end[ii] = table[start_key].values[0] + + spon_start = spon_start[:-1] + spon_sweeps = pd.DataFrame({start_key: spon_start, end_key: spon_end}) + + if duration_threshold is not None: + spon_sweeps = spon_sweeps[ + np.fabs(spon_sweeps[start_key] - spon_sweeps[end_key]) > duration_threshold + ] + spon_sweeps.reset_index(drop=True, inplace=True) + + return [spon_sweeps] + + +def apply_frame_times( + stimulus_table, + frame_times, + frames_per_second=None, + extra_frame_time=False, + map_columns=("Start", "End"), +): + """ Converts sweep times from frames to seconds. + + Parameters + ---------- + stimulus_table : pd.DataFrame + Rows are sweeps. Columns are stimulus parameters as well as start and end frames for each sweep. + frame_times : numpy.ndarrray + Gives the time in seconds at which each frame (indices) began. + frames_per_second : numeric, optional + If provided, and extra_frame_time is True, will be used to calculcate the extra_frame_time. + extra_frame_time : float, optional + If provided, an additional frame time will be appended. The time will be incremented by extra_frame_time from + the previous last frame time, to denote the time at which the last frame ended. If False, no extra time will be + appended. If None (default), the increment will be 1.0/fps. + map_columns : tuple of str, optional + Which columns to replace with times. Defaults to 'Start' and 'End + + Returns + ------- + stimulus_table : pd.DataFrame + As above, but with map_columns values converted to seconds from frames. + + """ + + stimulus_table = stimulus_table.copy() + + if extra_frame_time is True and frames_per_second is not None: + extra_frame_time = 1.0 / frames_per_second + if extra_frame_time is not False: + frame_times = np.append(frame_times, frame_times[-1] + extra_frame_time) + + for column in map_columns: + stimulus_table[column] = frame_times[ + np.around(stimulus_table[column]).astype(int) + ] + + return stimulus_table + + +def apply_display_sequence( + sweep_frames_table, + frame_display_sequence, + start_key="Start", + end_key="End", + diff_key="dif", + block_key="stimulus_block", +): + """ Adjust raw sweep frames for a stimulus based on the display sequence + for that stimulus. + + Parameters + ---------- + sweep_frames_table : pd.DataFrame + Each row is a sweep. Has two columns, 'start' and 'end', + which describe (in frames) when that sweep began and ended. + frame_display_sequence : np.ndarray + 2D array. Rows are display intervals. The 0th column is the start frame of + that interval, the 1st the end frame. + + Returns + ------- + sweep_frames_table : pd.DataFrame + As above, but start and end frames have been adjusted based on the display sequence. + + Notes + ----- + The frame values in the raw sweep_frames_table are given in 0-indexed offsets from the + start of display for this stimulus. This domain only takes into account frames which are part + of a display interval for that stimulus, so the frame ids need to be adjusted to lie on the global + frame sequence. + + """ + + sweep_frames_table = sweep_frames_table.copy() + if not block_key in sweep_frames_table.columns.values: + sweep_frames_table[block_key] = np.zeros( + (sweep_frames_table.shape[0]), dtype=int + ) + + sweep_frames_table[diff_key] = ( + sweep_frames_table[end_key] - sweep_frames_table[start_key] + ) + + sweep_frames_table[start_key] += frame_display_sequence[0, 0] + for seg in range(len(frame_display_sequence) - 1): + match_inds = sweep_frames_table[start_key] >= frame_display_sequence[seg, 1] + + sweep_frames_table.loc[match_inds, start_key] += ( + frame_display_sequence[seg + 1, 0] - frame_display_sequence[seg, 1] + ) + sweep_frames_table.loc[match_inds, block_key] = seg + 1 + + sweep_frames_table[end_key] = ( + sweep_frames_table[start_key] + sweep_frames_table[diff_key] + ) + sweep_frames_table = sweep_frames_table[ + sweep_frames_table[end_key] <= frame_display_sequence[-1, 1] + ] + sweep_frames_table = sweep_frames_table[ + sweep_frames_table[start_key] <= frame_display_sequence[-1, 1] + ] + + sweep_frames_table.drop(diff_key, inplace=True, axis=1) + return sweep_frames_table + + +def read_stimulus_name_from_path(stimulus): + """Obtains a human-readable stimulus name by looking at the filename of the 'stim_path' item. + + Parameters + ---------- + stimulus : dict + must contain a 'stim_path' item. + + Returns + ------- + str : + name of stimulus + + """ + + return stimulus["stim_path"].split("\\")[-1].split(".")[0] + + +def build_stimuluswise_table( + stimulus, + seconds_to_frames, + start_key="Start", + end_key="End", + name_key="stimulus_name", + block_key="stimulus_block", + get_stimulus_name=None, + extract_const_params_from_repr=False, + drop_const_params=spe.DROP_PARAMS, +): + """ Construct a table of sweeps, including their times on the experiment-global clock + and the values of each relevant parameter. + + Parameters + ---------- + stimulus : dict + Describes presentation of a stimulus on a particular experiment. Has a number of fields, + of which we are using: + stim_path : str + windows file path to the stimulus data + sweep_frames : list of lists + rows are sweeps, columns are start and end frames of that sweep + (in the stimulus-specific frame domain). C-order. + sweep_order : list of int + indices are frames, values are the sweep on that frame + display_sequence : list of list + rows are intervals in which the stimulus was displayed. Columns are start + and end times (s, global) of the display. C-order. + dimnames : list of str + Names of parameters for this stimulus (such as "Contrast") + sweep_table : list of tuple + Each element is a tuple of parameter values (1 per dimname) describing + a single sweep. + seconds_to_frames : function + Converts experiment seconds to frames + start_key : str, optional + key to use for start frame indices. Defaults to 'Start' + end_key : str, optional + key to use for end frame indices. Defaults to 'End' + name_key : str, optional + key to use for stimulus name annotations. Defaults to 'stimulus_name' + block_key : str, optional + key to use for the 0-index position of this stimulus block + get_stimulus_name : function | dict -> str, optional + extracts stimulus name from the stimulus dictionary. Default is read_stimulus_name_from_path + + Returns + ------- + list of pandas.DataFrame : + Each table corresponds to an entry in the display sequence. + Rows are sweeps, columns are stimulus parameter values as well as "Start" and "End". + + """ + + if get_stimulus_name is None: + get_stimulus_name = read_stimulus_name_from_path + + frame_display_sequence = seconds_to_frames(stimulus["display_sequence"]) + + sweep_frames_table = pd.DataFrame( + stimulus["sweep_frames"], columns=(start_key, end_key) + ) + sweep_frames_table[block_key] = np.zeros([sweep_frames_table.shape[0]], dtype=int) + sweep_frames_table = apply_display_sequence( + sweep_frames_table, frame_display_sequence, block_key=block_key + ) + + stim_table = pd.DataFrame( + { + start_key: sweep_frames_table[start_key], + end_key: sweep_frames_table[end_key] + 1, + name_key: get_stimulus_name(stimulus), + block_key: sweep_frames_table[block_key], + } + ) + + sweep_order = stimulus["sweep_order"][: len(sweep_frames_table)] + dimnames = stimulus["dimnames"] + + if not dimnames or "ReplaceImage" in dimnames: + stim_table["Image"] = sweep_order + else: + stim_table["sweep_number"] = sweep_order + sweep_table = pd.DataFrame(stimulus["sweep_table"], columns=dimnames) + sweep_table["sweep_number"] = sweep_table.index + + stim_table = assign_sweep_values(stim_table, sweep_table) + stim_table = split_column( + stim_table, + "Pos", + {"Pos_x": lambda field: field[0], "Pos_y": lambda field: field[1]}, + ) + + if extract_const_params_from_repr: + const_params = spe.parse_stim_repr( + stimulus["stim"], drop_params=drop_const_params + ) + existing_columns = set(stim_table.columns) + for const_param_key, const_param_value in const_params.items(): + + existing_cap = const_param_key.capitalize() in existing_columns + existing_upper = const_param_key.upper() in existing_columns + existing = const_param_key in existing_columns + + if not (existing_cap or existing_upper or existing): + stim_table[const_param_key] = [const_param_value] * stim_table.shape[0] + else: + logging.info( + f"found sweep_param named: {const_param_key}, ignoring const param of the same name (value: {const_param_value})" + ) + + unique_indices = np.unique(stim_table[block_key].values) + output = [stim_table.loc[stim_table[block_key] == ii, :] for ii in unique_indices] + + return output + + +def split_column(table, column, new_columns, drop_old=True): + """ Divides a dataframe column into multiple columns. + + Parameters + ---------- + table : pandas.DataFrame + Columns will be drawn from and assigned to this dataframe. This dataframe will NOT be modified inplace. + column : str + This column will be split. + new_columns : dict, mapping strings to functions + Each key will be the name of a new column, while its value (a function) will be used to build the + new column's values. The functions should map from a single value of the original column to a single value + of the new column. + drop_old : bool, optional + If True, the original column will be dropped from the table. + + Returns + ------- + table : pd.DataFrame + The modified table + + """ + + if not column in table: + return table + table = table.copy() + + for new_column, rule in new_columns.items(): + table[new_column] = table[column].apply(rule) + + if drop_old: + table.drop(column, inplace=True, axis=1) + return table + + +def assign_sweep_values( + stim_table, + sweep_table, + on="sweep_number", + drop=True, + tmp_suffix="_stimtable_todrop", +): + """ Left joins a stimulus table to a sweep table in order to associate epochs in time with stimulus characteristics. + + Parameters + ---------- + stim_table : pd.DataFrame + Each row is a stimulus epoch, with start and end times and a foreign key onto a particular sweep. + sweep_table : pd.DataFrame + Each row is a sweep. Should have columns in common with the stim_table - the resulting table will use values from + the sweep_table. + on : str, optional + Column on which to join. + drop : bool, optional + If True (default), the join column (argument on) will be dropped from the output. + tmp_suffix : str, optional + Will be used to identify overlapping columns. Should not appear in the name of any column in either dataframe. + + """ + + joined_table = stim_table.join(sweep_table, on=on, lsuffix=tmp_suffix) + for dim in joined_table.columns.values: + if tmp_suffix in dim: + joined_table.drop(dim, inplace=True, axis=1) + + if drop: + joined_table.drop(on, inplace=True, axis=1) + return joined_table diff --git a/brain_observatory/ecephys/stimulus_table/naming_utilities.py b/brain_observatory/ecephys/stimulus_table/naming_utilities.py new file mode 100644 index 0000000000..56f68141f7 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_table/naming_utilities.py @@ -0,0 +1,188 @@ +import re +import warnings +import functools + +import pandas as pd +import numpy as np + + +GABOR_DIAMETER_RE = re.compile(r"gabor_(\d*\.{0,1}\d*)_{0,1}deg(?:_\d+ms){0,1}") +GENERIC_MOVIE_RE = re.compile( + r"natural_movie_(?P<number>\d+|one|two|three|four|five|six|seven|eight|nine)(_shuffled){0,1}(_more_repeats){0,1}" +) +DIGIT_NAMES = { + "1": "one", + "2": "two", + "3": "three", + "4": "four", + "5": "five", + "6": "six", + "7": "seven", + "8": "eight", + "9": "nine", +} +SHUFFLED_MOVIE_RE = re.compile(r"natural_movie_shuffled") +NUMERAL_RE = re.compile(r"(?P<number>\d+)") + + +def drop_empty_columns(table): + """ Remove from the stimulus table columns whose values are all nan + """ + + to_drop = [] + + for colname in table.columns: + if table[colname].isna().all(): + to_drop.append(colname) + + table.drop(columns=to_drop, inplace=True) + return table + + +def collapse_columns(table): + """ merge, where possible, columns that describe the same parameter. This is pretty conservative - it + only matches columns by capitalization and it only overrides nans. + """ + + colnames = set(table.columns) + + matches = [] + for col in table.columns: + for transformed in (col.upper(), col.capitalize()): + if transformed in colnames and col != transformed: + + col_notna = ~(table[col].isna()) + trans_notna = ~(table[transformed].isna()) + if (col_notna & trans_notna).sum() != 0: + continue + + mask = ~(col_notna) & (trans_notna) + + matches.append(transformed) + table.loc[mask, col] = table[transformed][mask] + break + + table.drop(columns=matches, inplace=True) + return table + + +def add_number_to_shuffled_movie( + table, + natural_movie_re=GENERIC_MOVIE_RE, + template_re=SHUFFLED_MOVIE_RE, + stim_colname="stimulus_name", + template="natural_movie_{}_shuffled", + tmp_colname="__movie_number__", +): + """ + """ + + if not table[stim_colname].str.contains(SHUFFLED_MOVIE_RE).any(): + return table + table = table.copy() + + table[tmp_colname] = table[stim_colname].str.extract(natural_movie_re, expand=True)[ + "number" + ] + + unique_numbers = [ + item for item in table[tmp_colname].dropna(inplace=False).unique() + ] + if len(unique_numbers) != 1: + raise ValueError( + f"unable to uniquely determine a movie number for this session. Candidates: {unique_numbers}" + ) + movie_number = unique_numbers[0] + + def renamer(row): + if not isinstance(row[stim_colname], str): + return row[stim_colname] + if not template_re.match(row[stim_colname]): + return row[stim_colname] + else: + return template.format(movie_number) + + table[stim_colname] = table.apply(renamer, axis=1) + table.drop(columns=tmp_colname, inplace=True) + return table + + +def standardize_movie_numbers( + table, + movie_re=GENERIC_MOVIE_RE, + numeral_re=NUMERAL_RE, + digit_names=DIGIT_NAMES, + stim_colname="stimulus_name", +): + """ Natural movie stimuli in visual coding are numbered using words, like "natural_movie_two" rather than + "natural_movie_2". This function ensures that all of the natural movie stimuli in an experiment are named by + that convention. + + Parameters + ---------- + table : pd.DataFrame + the incoming stimulus table + movie_re : re.Pattern, optional + regex that matches movie stimulus names + numeral_re : re.Pattern, optional + regex that extracts movie numbers from stimulus names + digit_names : dict, optional + map from numerals to english words + stim_colname : str, optional + the name of the dataframe column that contains stimulus names + + Returns + ------- + table : pd.DataFrame + the stimulus table with movie numerals having been mapped to english words + + """ + + replace = lambda match_obj: digit_names[match_obj["number"]] + + # for some reason pandas really wants us to use the captures + warnings.filterwarnings("ignore", "This pattern has match groups") + + movie_rows = table[stim_colname].str.contains(movie_re, na=False) + table.loc[movie_rows, stim_colname] = table.loc[ + movie_rows, stim_colname + ].str.replace(numeral_re, replace) + + return table + + +def map_stimulus_names(table, name_map=None, stim_colname="stimulus_name"): + """ Applies a mappting to the stimulus names in a stimulus table + + Parameters + ---------- + table : pd.DataFrame + the input stimulus table + name_map : dict, optional + rename the stimuli according to this mapping + stim_colname: str, optional + look in this column for stimulus names + + """ + + if name_map is None: + return table + + if "" in name_map: + name_map[np.nan] = name_map[""] + + table[stim_colname] = table[stim_colname].replace( + to_replace=name_map, inplace=False + ) + return table + + +def map_column_names(table, name_map=None, ignore_case=True): + + if ignore_case and name_map is not None: + name_map = {key.lower(): value for key, value in name_map.items()} + mapper = lambda name: name if name.lower() not in name_map else name_map[name.lower()] + else: + mapper = name_map + + return table.rename(columns=mapper) \ No newline at end of file diff --git a/brain_observatory/ecephys/stimulus_table/output_validation.py b/brain_observatory/ecephys/stimulus_table/output_validation.py new file mode 100644 index 0000000000..a62cc6ac8f --- /dev/null +++ b/brain_observatory/ecephys/stimulus_table/output_validation.py @@ -0,0 +1,47 @@ +import numpy as np +import warnings + + +def validate_epoch_durations(table, start_key="Start", end_key="End", fail_on_negative_durations=False): + durations = table[end_key] - table[start_key] + min_duration_index = durations.idxmin() + min_duration = durations[min_duration_index] + + if min_duration == 0: + warnings.warn( + f"there is an epoch in this stimulus table (index: {min_duration_index}) with duration = {min_duration}", + UserWarning, + ) + if min_duration < 0: + msg = f"there is an epoch with negative duration (index: {min_duration_index})" + if fail_on_negative_durations: + raise ValueError(msg) + warnings.warn(msg) + + +def validate_epoch_order(table, time_keys=("Start", "End")): + for time_key in time_keys: + change = np.diff(table[time_key].values) + assert np.amin(change) > 0 + + +def validate_max_spontaneous_epoch_duration( + table, + max_duration, + get_spontanous_epochs=None, + index_key="stimulus_index", + start_key="Start", + end_key="End", +): + if get_spontanous_epochs is None: + get_spontanous_epochs = lambda table: table[np.isnan(table[index_key])] + + spontaneous_epochs = get_spontanous_epochs(table) + durations = ( + spontaneous_epochs[end_key].values - spontaneous_epochs[start_key].values + ) + if np.amax(durations) > max_duration: + warnings.warn( + f"there is a spontaneous activity duration longer than {max_duration}", + UserWarning, + ) diff --git a/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py b/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py new file mode 100644 index 0000000000..0571e41f67 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py @@ -0,0 +1,104 @@ +import re +import ast + + +REPR_PARAMS_RE = re.compile(r"([a-z0-9]+=[^=]+)[,\)]", re.IGNORECASE) +REPR_CLASS_RE = re.compile(r"^(?P<class_name>[a-z0-9]+)\(.*\)$", re.IGNORECASE) +ARRAY_RE = re.compile(r"array\((?P<contents>\[.*\])\)") + +DROP_PARAMS = ( # psychopy boilerplate, more or less + "name", + "autoLog", + "autoDraw", + "win", +) + + +def parse_stim_repr( + stim_repr, + drop_params=DROP_PARAMS, + repr_params_re=REPR_PARAMS_RE, + array_re=ARRAY_RE, + raise_on_unrecognized=False, +): + """ Read the string representation of a psychopy stimulus and extract stimulus parameters. + + Parameters + ---------- + stim_repr : str + drop_params : tuple + repr_params_re : re.Pattern + array_re : re.Pattern + + + Returns + ------- + dict : + maps extracted parameter names to values + + """ + + stim_params = extract_const_params_from_stim_repr( + stim_repr, repr_params_re=repr_params_re, array_re=array_re + ) + + for drop_param in drop_params: + if drop_param in stim_params: + del stim_params[drop_param] + + return stim_params + + +# This is not currently in use by the stimulus_table module, but is a potentially handy utility +def extract_stim_class_from_repr(stim_repr, repr_class_re=REPR_CLASS_RE): + match = repr_class_re.match(stim_repr) + if match is not None and "class_name" in match.groupdict(): + return match["class_name"] + + +def extract_const_params_from_stim_repr( + stim_repr, repr_params_re=REPR_PARAMS_RE, array_re=ARRAY_RE +): + """Parameters which are not set as sweep_params in the stimulus script (usually because they are not + varied during the course of the session) are not output in an easily machine-readable format. This function + attempts to recover them by parsing the string repr of the stimulus. + + Parameters + ---------- + stim_repr : str + The repr of the camstim stimulus object. Served up per-stimulus in the stim pickle. + repr_params_re : re.Pattern + Extracts attributes as "="-seperated strings + array_re : re.Pattern + Extracts list reprs from numpy array reprs. + + Returns + ------- + repr_params : dict + dictionary of paramater keys and values extracted from the stim repr. Where possible, the values are converted + to native Python types. + + """ + + repr_params = {} + + for match in repr_params_re.findall(stim_repr): + k, v = match.split("=") + + if k not in repr_params: + + m = array_re.match(v) + if m is not None: + v = m["contents"] + + try: + v = ast.literal_eval(v) + except ValueError as err: + pass + + repr_params[k] = v + + else: + raise KeyError(f"duplicate key: {k}") + + return repr_params diff --git a/brain_observatory/ecephys/stimulus_table/visualization/__init__.py b/brain_observatory/ecephys/stimulus_table/visualization/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3741c9d2fbf629410136d4d0baf08a92660418b6 GIT binary patch literal 231 zcmYL@v1$V`42B)ZPy%_742g$qrIaLHOPA8kVC1t%L>&1z`L0~Iyg}ZfQ(viT9wA$& z%0uZ7|0f~z3+?9fnNjiQ8EU;&{Ar@iMlDlCG_PhcdHFJ39slF!@^tUs1UqqXfVc|q z4m`RoLz6ke+940(a*HgDGPj3O+%p9yRB+isbA&x=HYMGNM;kgI_BrUq0ZQ&hiw)M0 ql|rXJ_2LVJgmxh5A<+jE%51$SrsDmo9l!4$PC51oAM2+#wfO}OQ$~pZ literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/view_blocks.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/view_blocks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2139ebda2b91fa7375b3abaec04c5723ef449d0 GIT binary patch literal 2851 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py b/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py new file mode 100644 index 0000000000..a97fa06ca1 --- /dev/null +++ b/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py @@ -0,0 +1,121 @@ +import argparse +import itertools as it + +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import seaborn as sns + + +def build_colormap(table, existing_map={}, base_colors=sns.color_palette("pastel")): + + colormap = {} + + unique_names = table["stimulus_name"].unique() + color_iterator = iter(base_colors) + + for un in unique_names: + if un in existing_map: + colormap[un] = existing_map[un] + continue + + if isinstance(un, float) and np.isnan(un): + un = "spontaneous_activity" + + colormap[un] = next(color_iterator) + + return colormap + + +def get_blocks(table): + changes = np.where(np.diff(table["stimulus_block"].values))[0] + 1 + changes = np.sort(np.unique(np.concatenate([changes, [0, table.shape[0]]]))) + + blocks = [] + for ii, (low, high) in enumerate(zip(changes[:-1], changes[1:])): + block = table.iloc[low:high, :] + + recorded_blocks = np.unique(block["stimulus_block"].values) + if len(recorded_blocks) > 1: + raise ValueError( + "expected one recorded block per block, found: {}".format( + recorded_blocks + ) + ) + else: + recorded_block = recorded_blocks[0] + + start = block["Start"].values[0] + end = block["End"].values[-1] + + names = np.unique(block["stimulus_name"].values) + if len(names) > 1: + raise ValueError("expected one name per block, found: {}".format(names)) + else: + name = names[0] + + indices = np.unique(block["stimulus_index"].values) + if len(indices) > 1: + raise ValueError("expected one index per block, found: {}".format(indices)) + else: + index = indices[0] + + if isinstance(name, float) and np.isnan(name): + name = "spontaneous_activity" + + blocks.append({"name": name, "index": index, "start": start, "end": end}) + + return blocks + + +def plot_blocks(blocks, colormap): + fig, ax = plt.subplots(figsize=(9, 9)) + + used = set([]) + max_time = -np.inf + handles = [] + labels = [] + + for block in blocks: + + handle = ax.axvspan( + block["start"], + block["end"], + facecolor=colormap[block["name"]], + alpha=1.0, + linestyle="-", + edgecolor="black", + ) + if not block["name"] in used: + labels.append(block["name"]) + handles.append(handle) + + max_time = max([max_time, block["end"]]) + used.add(block["name"]) + + ax.set_xlim([0, max_time]) + ax.get_yaxis().set_visible(False) + ax.set_xlabel("time (s)") + + plt.legend(handles, labels) + + +def main(table_csv_path): + + table = pd.read_csv(table_csv_path) + + colormap = build_colormap(table) + blocks = get_blocks(table) + + plot_blocks(blocks, colormap) + plt.show() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "table_csv_path", type=str, help="filesystem path to stimulus table csv" + ) + + args = parser.parse_args() + main(args.table_csv_path) diff --git a/brain_observatory/ecephys/visualization/__init__.py b/brain_observatory/ecephys/visualization/__init__.py new file mode 100644 index 0000000000..ecff26ed01 --- /dev/null +++ b/brain_observatory/ecephys/visualization/__init__.py @@ -0,0 +1,111 @@ +from mpl_toolkits.axes_grid1 import make_axes_locatable +import matplotlib.pyplot as plt +import numpy as np + + +def plot_mean_waveforms(mean_waveforms, unit_ids, peak_channels): # pragma: no cover + ''' Utility for plotting mean waveforms on each unit's peak channel + + Parameters + ---------- + mean_waveforms : dictionary + Maps unit ids to channelwise averege spike waveforms for those units + unit_ids : array-like + unique integer identifiers for units to be included + + ''' + + fig, ax = plt.subplots(figsize=(10, 10)) + + for uid in unit_ids: + wf = mean_waveforms[uid] + ax.plot(wf.loc[{'channel_id': peak_channels[uid]}]) + + ax.legend(unit_ids) + ax.set_ylabel('membrane potential (uV)', fontsize=16) + ax.set_xlabel('time (s)', fontsize=16) + + ax.set_xticks(np.arange(0, len(wf['time']), 20)) + ax.set_xticklabels([f'{float(ii):1.4f}' for ii in wf['time'][::20]], rotation=45) + + return fig + + +def plot_spike_counts( + data_array, + time_coords, + cbar_label, + title, + xlabel='time relative to stimulus onset (s)', + ylabel='unit', + xtick_step=20 +): # pragma: no cover + '''Utility for making a simple spike counts plot. + + Parameters + ---------- + data_array : xarray.DataArray + 2D data array unitwise values per time bin. See EcephysSession.sweepwise_spike_counts + + ''' + + fig, ax = plt.subplots(figsize=(12, 12)) + div = make_axes_locatable(ax) + cbar_axis = div.append_axes("right", 0.2, pad=0.05) + + img = ax.imshow( + data_array.T, + interpolation='none' + ) + plt.colorbar(img, cax=cbar_axis) + + cbar_axis.set_ylabel(cbar_label, fontsize=16) + + ax.yaxis.set_major_locator(plt.NullLocator()) + ax.set_ylabel(ylabel, fontsize=16) + + reltime = np.array(time_coords) + ax.set_xticks(np.arange(0, len(reltime), xtick_step)) + ax.set_xticklabels([f'{mp:1.3f}' for mp in reltime[::xtick_step]], rotation=45) + ax.set_xlabel(xlabel, fontsize=16) + + ax.set_title(title, fontsize=20) + + return fig + + +class _VlPlotter: + def __init__(self, ax, num_objects, cmap=plt.cm.tab20, cycle_colors=False): + self.ii = 0 + self.ax = ax + self.num_objects = num_objects + self.cmap = cmap + self.cycle_colors = cycle_colors + + def __call__(self, gb): + low = self.ii / self.num_objects + high = (self.ii + 1) / self.num_objects + + cindex = self.ii % self.cmap.N if self.cycle_colors else np.random.randint(self.cmap.N) + color = self.cmap(cindex) + + self.ax.vlines(gb.index.values, low, high, colors=color) + self.ii += 1 + + +def raster_plot(spike_times, figsize=(8,8), cmap=plt.cm.tab20, title='spike raster', cycle_colors=False): + + fig, ax = plt.subplots(figsize=figsize) + plotter = _VlPlotter(ax, num_objects=len(spike_times['unit_id'].unique()), cmap=cmap, cycle_colors=cycle_colors) + # aggregate is called on each column, so pass only one (eg the stimulus_presentation_id) + # to plot each unit once + spike_times[['stimulus_presentation_id', 'unit_id']].groupby('unit_id').agg(plotter) + + ax.set_xlabel('time (s)', fontsize=16) + ax.set_ylabel('unit', fontsize=16) + ax.set_title(title, fontsize=20) + + plt.yticks([]) + plt.axis('tight') + + return fig diff --git a/brain_observatory/ecephys/visualization/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/visualization/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6525c0429fab112579b4fe85ef3f11a7996ffe20 GIT binary patch literal 3780 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 XAqA+Sbk##7xR(3A!3^eIU)}m2fV0X( literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/write_nwb/__init__.py b/brain_observatory/ecephys/write_nwb/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ecephys/write_nwb/__main__.py b/brain_observatory/ecephys/write_nwb/__main__.py new file mode 100644 index 0000000000..2840ebb68e --- /dev/null +++ b/brain_observatory/ecephys/write_nwb/__main__.py @@ -0,0 +1,1050 @@ +import logging +import sys +from typing import Any, Dict, List, Optional, Tuple +from pathlib import Path, PurePath +import multiprocessing as mp +from functools import partial + +import h5py +import pynwb +import requests +import pandas as pd +import numpy as np +from hdmf.backends.hdf5.h5_utils import H5DataIO + +from allensdk.config.manifest import Manifest + +from ._schemas import InputSchema, OutputSchema +from allensdk.brain_observatory.nwb import setup_table_for_invalid_times # noqa: F401 +from allensdk.brain_observatory.nwb import ( + add_stimulus_presentations, + add_stimulus_timestamps, + add_invalid_times, + setup_table_for_epochs, + read_eye_dlc_tracking_ellipses, + read_eye_gaze_mappings, + add_eye_tracking_ellipse_fit_data_to_nwbfile, + add_eye_gaze_mapping_data_to_nwbfile, + eye_tracking_data_is_valid +) +from allensdk.brain_observatory.argschema_utilities import ( + write_or_print_outputs, optional_lims_inputs +) +from allensdk.brain_observatory import dict_to_indexed_array +from allensdk.brain_observatory.ecephys.file_io.continuous_file import ContinuousFile +from allensdk.brain_observatory.ecephys.nwb import (EcephysProbe, + EcephysElectrodeGroup, + EcephysSpecimen, + EcephysEyeTrackingRigMetadata, + EcephysCSD) +from allensdk.brain_observatory.sync_dataset import Dataset +import allensdk.brain_observatory.sync_utilities as su + + +STIM_TABLE_RENAMES_MAP = {"Start": "start_time", "End": "stop_time"} + + +def load_and_squeeze_npy(path): + return np.squeeze(np.load(path, allow_pickle=False)) + + +def fill_df(df, str_fill=""): + df = df.copy() + + for colname in df.columns: + if not pd.api.types.is_numeric_dtype(df[colname]): + df[colname].fillna(str_fill) + + if np.all(pd.isna(df[colname]).values): + df[colname] = [str_fill for ii in range(df.shape[0])] + + if pd.api.types.is_string_dtype(df[colname]): + df[colname] = df[colname].astype(str) + + return df + + +def get_inputs_from_lims(host, ecephys_session_id, output_root, job_queue, strategy): + """ + This is a development / testing utility for running this module from the Allen Institute for Brain Science's + Laboratory Information Management System (LIMS). It will only work if you are on our internal network. + + Parameters + ---------- + ecephys_session_id : int + Unique identifier for session of interest. + output_root : str + Output file will be written into this directory. + job_queue : str + Identifies the job queue from which to obtain configuration data + strategy : str + Identifies the LIMS strategy which will be used to write module inputs. + + Returns + ------- + data : dict + Response from LIMS. Should meet the schema defined in _schemas.py + + """ + + uri = f"{host}/input_jsons?object_id={ecephys_session_id}&object_class=EcephysSession&strategy_class={strategy}&job_queue_name={job_queue}&output_directory={output_root}" + response = requests.get(uri) + data = response.json() + + if len(data) == 1 and "error" in data: + raise ValueError("bad request uri: {} ({})".format(uri, data["error"])) + + return data + + +def read_stimulus_table(path: str, + column_renames_map: Dict[str, str] = None, + columns_to_drop: List[str] = None) -> pd.DataFrame: + """ Loads from a CSV on disk the stimulus table for this session. + Optionally renames columns to match NWB epoch specifications. + + Parameters + ---------- + path : str + path to stimulus table csv + column_renames_map : Dict[str, str], optional + If provided, will be used to rename columns from keys -> values. + Default renames: ('Start' -> 'start_time') and ('End' -> 'stop_time') + columns_to_drop : List, optional + A list of column names to drop. Columns will be dropped BEFORE + any renaming occurs. If None, no columns are dropped. + By default None. + + Returns + ------- + pd.DataFrame : + stimulus table with applied renames + + """ + if column_renames_map is None: + column_renames_map = STIM_TABLE_RENAMES_MAP + + ext = PurePath(path).suffix + + if ext == ".csv": + stimulus_table = pd.read_csv(path) + else: + raise IOError(f"unrecognized stimulus table extension: {ext}") + + if columns_to_drop: + stimulus_table = stimulus_table.drop(errors='ignore', + columns=columns_to_drop) + + return stimulus_table.rename(columns=column_renames_map, index={}) + + +def read_spike_times_to_dictionary( + spike_times_path, spike_units_path, local_to_global_unit_map=None +): + """ Reads spike times and assigned units from npy files into a lookup table. + + Parameters + ---------- + spike_times_path : str + npy file identifying, per spike, the time at which that spike occurred. + spike_units_path : str + npy file identifying, per spike, the unit associated with that spike. These are probe-local, so a + local_to_global_unit_map is used to associate spikes with global unit identifiers. + local_to_global_unit_map : dict, optional + Maps probewise local unit indices to global unit ids + + Returns + ------- + output_times : dict + keys are unit identifiers, values are spike time arrays + + """ + + spike_times = load_and_squeeze_npy(spike_times_path) + spike_units = load_and_squeeze_npy(spike_units_path) + + return group_1d_by_unit(spike_times, spike_units, local_to_global_unit_map) + + +def read_spike_amplitudes_to_dictionary( + spike_amplitudes_path, spike_units_path, + templates_path, spike_templates_path, inverse_whitening_matrix_path, + local_to_global_unit_map=None, + scale_factor=1.0 +): + + spike_amplitudes = load_and_squeeze_npy(spike_amplitudes_path) + spike_units = load_and_squeeze_npy(spike_units_path) + + templates = load_and_squeeze_npy(templates_path) + spike_templates = load_and_squeeze_npy(spike_templates_path) + inverse_whitening_matrix = load_and_squeeze_npy(inverse_whitening_matrix_path) + + for temp_idx in range(templates.shape[0]): + templates[temp_idx, :, :] = np.dot( + np.ascontiguousarray(templates[temp_idx, :, :]), + np.ascontiguousarray(inverse_whitening_matrix) + ) + + scaled_amplitudes = scale_amplitudes(spike_amplitudes, templates, spike_templates, scale_factor=scale_factor) + return group_1d_by_unit(scaled_amplitudes, spike_units, local_to_global_unit_map) + + +def scale_amplitudes(spike_amplitudes, templates, spike_templates, scale_factor=1.0): + + template_full_amplitudes = templates.max(axis=1) - templates.min(axis=1) + template_amplitudes = template_full_amplitudes.max(axis=1) + + template_amplitudes = template_amplitudes[spike_templates] + spike_amplitudes = template_amplitudes * spike_amplitudes * scale_factor + return spike_amplitudes + + +def filter_and_sort_spikes(spike_times_mapping: Dict[int, np.ndarray], + spike_amplitudes_mapping: Dict[int, np.ndarray]) -> Tuple[Dict[int, np.ndarray], Dict[int, np.ndarray]]: + """Filter out invalid spike timepoints and sort spike data + (times + amplitudes) by times. + + Parameters + ---------- + spike_times_mapping : Dict[int, np.ndarray] + Keys: unit identifiers, Values: spike time arrays + spike_amplitudes_mapping : Dict[int, np.ndarray] + Keys: unit identifiers, Values: spike amplitude arrays + + Returns + ------- + Tuple[Dict[int, np.ndarray], Dict[int, np.ndarray]] + A tuple containing filtered and sorted spike_times_mapping and + spike_amplitudes_mapping data. + """ + sorted_spike_times_mapping = {} + sorted_spike_amplitudes_mapping = {} + + for unit_id, _ in spike_times_mapping.items(): + spike_times = spike_times_mapping[unit_id] + spike_amplitudes = spike_amplitudes_mapping[unit_id] + + valid = spike_times >= 0 + filtered_spike_times = spike_times[valid] + filtered_spike_amplitudes = spike_amplitudes[valid] + + order = np.argsort(filtered_spike_times) + sorted_spike_times = filtered_spike_times[order] + sorted_spike_amplitudes = filtered_spike_amplitudes[order] + + sorted_spike_times_mapping[unit_id] = sorted_spike_times + sorted_spike_amplitudes_mapping[unit_id] = sorted_spike_amplitudes + + return (sorted_spike_times_mapping, sorted_spike_amplitudes_mapping) + + +def group_1d_by_unit(data, data_unit_map, local_to_global_unit_map=None): + sort_order = np.argsort(data_unit_map, kind="stable") + data_unit_map = data_unit_map[sort_order] + data = data[sort_order] + + changes = np.concatenate( + [ + np.array([0]), + np.where(np.diff(data_unit_map))[0] + 1, + np.array([data.size]), + ] + ) + + output = {} + for jj, (low, high) in enumerate(zip(changes[:-1], changes[1:])): + local_unit = data_unit_map[low] + current = data[low:high] + + if local_to_global_unit_map is not None: + if local_unit not in local_to_global_unit_map: + logging.warning( + f"unable to find unit at local position {local_unit}" + ) + continue + global_id = local_to_global_unit_map[local_unit] + output[global_id] = current + else: + output[local_unit] = current + + return output + + +def add_metadata_to_nwbfile(nwbfile, input_metadata): + metadata = input_metadata.copy() + + if "full_genotype" in metadata: + metadata["genotype"] = metadata.pop("full_genotype") + + if "stimulus_name" in metadata: + nwbfile.stimulus_notes = metadata.pop("stimulus_name") + + if "age_in_days" in metadata: + metadata["age"] = f"P{int(metadata['age_in_days'])}D" + + if "donor_id" in metadata: + metadata["subject_id"] = str(metadata.pop("donor_id")) + + nwbfile.subject = EcephysSpecimen(**metadata) + return nwbfile + + +def read_waveforms_to_dictionary( + waveforms_path, local_to_global_unit_map=None, peak_channel_map=None +): + """ Builds a lookup table for unitwise waveform data + + Parameters + ---------- + waveforms_path : str + npy file containing waveform data for each unit. Dimensions ought to be units X samples X channels + local_to_global_unit_map : dict, optional + Maps probewise local unit indices to global unit ids + peak_channel_map : dict, optional + Maps unit identifiers to indices of peak channels. If provided, the output will contain only samples on the peak + channel for each unit. + + Returns + ------- + output_waveforms : dict + Keys are unit identifiers, values are samples X channels data arrays. + + """ + + waveforms = np.squeeze(np.load(waveforms_path, allow_pickle=False)) + output_waveforms = {} + for unit_id, waveform in enumerate( + np.split(waveforms, waveforms.shape[0], axis=0) + ): + if local_to_global_unit_map is not None: + if unit_id not in local_to_global_unit_map: + logging.warning( + f"unable to find unit at local position {unit_id} while reading waveforms" + ) + continue + unit_id = local_to_global_unit_map[unit_id] + + if peak_channel_map is not None: + waveform = waveform[:, peak_channel_map[unit_id]] + + output_waveforms[unit_id] = np.squeeze(waveform) + + return output_waveforms + + +def read_running_speed(path): + """ Reads running speed data and timestamps into a RunningSpeed named tuple + + Parameters + ---------- + path : str + path to running speed store + + + Returns + ------- + tuple : + first item is dataframe of running speed data, second is dataframe of + raw values (vsig, vin, encoder rotation) + + """ + + return ( + pd.read_hdf(path, key="running_speed"), + pd.read_hdf(path, key="raw_data") + ) + + +def add_probe_to_nwbfile(nwbfile, probe_id, sampling_rate, lfp_sampling_rate, + has_lfp_data, name, + location="See electrode locations"): + """ Creates objects required for representation of a single + extracellular ephys probe within an NWB file. + + Parameters + ---------- + nwbfile : pynwb.NWBFile + file to which probe information will be assigned. + probe_id : int + unique identifier for this probe + sampling_rate: float, + sampling rate of the neuropixels probe + lfp_sampling_rate: float + sampling rate of LFP + has_lfp_data: bool + True if LFP data is available for the probe, otherwise False + name : str, optional + human-readable name for this probe. + Practically, we use tags like "probeA" or "probeB" + location : str, optional + A required field for the `EcephysElectrodeGroup`. Because the group + contains a number of electrodes/channels along the neuropixels probe, + location will vary significantly. Thus by default this field is: + "See electrode locations" where the nwbfile.electrodes table will + provide much more detailed location information. + + Returns + ------ + nwbfile : pynwb.NWBFile + the updated file object + probe_nwb_device : pynwb.device.Device + device object corresponding to this probe + probe_nwb_electrode_group : pynwb.ecephys.ElectrodeGroup + electrode group object corresponding to this probe + + """ + probe_nwb_device = EcephysProbe(name=name, + description="Neuropixels 1.0 Probe", # required field + manufacturer="imec", + probe_id=probe_id, + sampling_rate=sampling_rate) + + probe_nwb_electrode_group = EcephysElectrodeGroup( + name=name, + description="Ecephys Electrode Group", # required field + probe_id=probe_id, + location=location, + device=probe_nwb_device, + lfp_sampling_rate=lfp_sampling_rate, + has_lfp_data=has_lfp_data + ) + + nwbfile.add_device(probe_nwb_device) + nwbfile.add_electrode_group(probe_nwb_electrode_group) + + return nwbfile, probe_nwb_device, probe_nwb_electrode_group + + +def add_ecephys_electrode_columns(nwbfile: pynwb.NWBFile, + columns_to_add: Optional[List[Tuple[str, str]]] = None): + """Add additional columns to ecephys nwbfile electrode table. + + Parameters + ---------- + nwbfile : pynwb.NWBFile + An nwbfile to add additional electrode columns to + columns_to_add : Optional[List[Tuple[str, str]]] + A list of (column_name, column_description) tuples to be added + to the nwbfile electrode table, by default None. If None, default + columns are added. + """ + default_columns = [ + ("probe_vertical_position", "Length-wise position of electrode/channel on device (microns)"), + ("probe_horizontal_position", "Width-wise position of electrode/channel on device (microns)"), + ("probe_id", "The unique id of this electrode's/channel's device"), + ("local_index", "The local index of electrode/channel on device"), + ("valid_data", "Whether data from this electrode/channel is usable") + ] + + if columns_to_add is None: + columns_to_add = default_columns + + for col_name, col_description in columns_to_add: + if (not nwbfile.electrodes) or (col_name not in nwbfile.electrodes.colnames): + nwbfile.add_electrode_column(name=col_name, + description=col_description) + + +def add_ecephys_electrodes(nwbfile: pynwb.NWBFile, + channels: List[dict], + electrode_group: EcephysElectrodeGroup, + local_index_whitelist: Optional[np.ndarray] = None): + """Add electrode information to an ecephys nwbfile electrode table. + + Parameters + ---------- + nwbfile : pynwb.NWBFile + The nwbfile to add electrodes data to + channels : List[dict] + A list of 'channel' dictionaries containing the following fields: + id: The unique id for a given electrode/channel + probe_id: The unique id for an electrode's/channel's device + valid_data: Whether the data for an electrode/channel is usable + local_index: The local index of an electrode/channel on a given device + probe_vertical_position: Length-wise position of electrode/channel on device (microns) + probe_horizontal_position: Width-wise position of electrode/channel on device (microns) + manual_structure_id: The LIMS id associated with an anatomical structure + manual_structure_acronym: Acronym associated with an anatomical structure + anterior_posterior_ccf_coordinate + dorsal_ventral_ccf_coordinate + left_right_ccf_coordinate + + Optional fields which may be used in the future: + impedence: The impedence of a given channel. + filtering: The type of hardware filtering done a channel. + (e.g. "1000 Hz low-pass filter") + + electrode_group : EcephysElectrodeGroup + The pynwb electrode group that electrodes should be associated with + local_index_whitelist : Optional[np.ndarray], optional + If provided, only add electrodes (a.k.a. channels) specified by the + whitelist (and in order specified), by default None + """ + add_ecephys_electrode_columns(nwbfile) + + channel_table = pd.DataFrame(channels) + + if local_index_whitelist is not None: + channel_table.set_index("local_index", inplace=True) + channel_table = channel_table.loc[local_index_whitelist, :] + channel_table.reset_index(inplace=True) + + for _, row in channel_table.iterrows(): + x = row["anterior_posterior_ccf_coordinate"] + y = row["dorsal_ventral_ccf_coordinate"] + z = row["left_right_ccf_coordinate"] + + nwbfile.add_electrode( + id=row["id"], + x=(np.nan if x is None else x), # Not all probes have CCF coords + y=(np.nan if y is None else y), + z=(np.nan if z is None else z), + probe_vertical_position=row["probe_vertical_position"], + probe_horizontal_position=row["probe_horizontal_position"], + local_index=row["local_index"], + valid_data=row["valid_data"], + probe_id=row["probe_id"], + group=electrode_group, + location=row["manual_structure_acronym"], + imp=row["impedence"], + filtering=row["filtering"] + ) + + +def add_ragged_data_to_dynamic_table( + table, data, column_name, column_description="" +): + """ Builds the index and data vectors required for writing ragged array data to a pynwb dynamic table + + Parameters + ---------- + table : pynwb.core.DynamicTable + table to which data will be added (as VectorData / VectorIndex) + data : dict + each key-value pair describes some grouping of data + column_name : str + used to set the name of this column + column_description : str, optional + used to set the description of this column + + Returns + ------- + nwbfile : pynwb.NWBFile + + """ + + idx, values = dict_to_indexed_array(data, table.id.data) + del data + + table.add_column( + name=column_name, description=column_description, data=values, index=idx + ) + + +DEFAULT_RUNNING_SPEED_UNITS = { + "velocity": "cm/s", + "vin": "V", + "vsig": "V", + "rotation": "radians" +} + + +def add_running_speed_to_nwbfile(nwbfile, running_speed, units=None): + if units is None: + units = DEFAULT_RUNNING_SPEED_UNITS + + running_mod = pynwb.ProcessingModule("running", "running speed data") + nwbfile.add_processing_module(running_mod) + + running_speed_timeseries = pynwb.base.TimeSeries( + name="running_speed", + timestamps=running_speed["start_time"].values, + data=running_speed["velocity"].values, + unit=units["velocity"] + ) + + # Create an 'empty' timeseries that only stores end times + # An array of nans needs to be created to avoid an nwb schema violation + running_speed_end_timeseries = pynwb.base.TimeSeries( + name="running_speed_end_times", + data=np.full(running_speed["velocity"].shape, np.nan), + timestamps=running_speed["end_time"].values, + unit=units["velocity"] + ) + + rotation_timeseries = pynwb.base.TimeSeries( + name="running_wheel_rotation", + timestamps=running_speed_timeseries, + data=running_speed["net_rotation"].values, + unit=units["rotation"] + ) + + running_mod.add_data_interface(running_speed_timeseries) + running_mod.add_data_interface(running_speed_end_timeseries) + running_mod.add_data_interface(rotation_timeseries) + + return nwbfile + + +def add_raw_running_data_to_nwbfile(nwbfile, raw_running_data, units=None): + if units is None: + units = DEFAULT_RUNNING_SPEED_UNITS + + raw_rotation_timeseries = pynwb.base.TimeSeries( + name="raw_running_wheel_rotation", + timestamps=np.array(raw_running_data["frame_time"]), + data=raw_running_data["dx"].values, + unit=units["rotation"] + ) + + vsig_ts = pynwb.base.TimeSeries( + name="running_wheel_signal_voltage", + timestamps=raw_rotation_timeseries, + data=raw_running_data["vsig"].values, + unit=units["vsig"] + ) + + vin_ts = pynwb.base.TimeSeries( + name="running_wheel_supply_voltage", + timestamps=raw_rotation_timeseries, + data=raw_running_data["vin"].values, + unit=units["vin"] + ) + + nwbfile.add_acquisition(raw_rotation_timeseries) + nwbfile.add_acquisition(vsig_ts) + nwbfile.add_acquisition(vin_ts) + + return nwbfile + + +def write_probe_lfp_file(session_id, session_metadata, session_start_time, + log_level, probe): + """ Writes LFP data (and associated channel information) for one + probe to a standalone nwb file + """ + + logging.getLogger('').setLevel(log_level) + logging.info(f"writing lfp file for probe {probe['id']}") + + nwbfile = pynwb.NWBFile( + session_description='LFP data and associated channel info for a single Ecephys probe', + identifier=f"{probe['id']}", + session_id=f"{session_id}", + session_start_time=session_start_time, + institution="Allen Institute for Brain Science" + ) + + if session_metadata is not None: + nwbfile = add_metadata_to_nwbfile(nwbfile, session_metadata) + + if probe.get("temporal_subsampling_factor", None) is not None: + probe["lfp_sampling_rate"] = probe["lfp_sampling_rate"] / probe["temporal_subsampling_factor"] + + nwbfile, probe_nwb_device, probe_nwb_electrode_group = add_probe_to_nwbfile( + nwbfile, + probe_id=probe["id"], + name=probe["name"], + sampling_rate=probe["sampling_rate"], + lfp_sampling_rate=probe["lfp_sampling_rate"], + has_lfp_data=probe["lfp"] is not None + ) + + lfp_channels = np.load(probe['lfp']['input_channels_path'], + allow_pickle=False) + + add_ecephys_electrodes(nwbfile, probe["channels"], + probe_nwb_electrode_group, + local_index_whitelist=lfp_channels) + + electrode_table_region = nwbfile.create_electrode_table_region( + region=np.arange(len(nwbfile.electrodes)).tolist(), # must use raw indices here + name='electrodes', + description=f"lfp channels on probe {probe['id']}" + ) + + lfp_data, lfp_timestamps = ContinuousFile( + data_path=probe['lfp']['input_data_path'], + timestamps_path=probe['lfp']['input_timestamps_path'], + total_num_channels=len(nwbfile.electrodes) + ).load(memmap=False) + + lfp_data = lfp_data.astype(np.float32) + lfp_data = lfp_data * probe["amplitude_scale_factor"] + + lfp = pynwb.ecephys.LFP(name=f"probe_{probe['id']}_lfp") + + nwbfile.add_acquisition(lfp.create_electrical_series( + name=f"probe_{probe['id']}_lfp_data", + data=H5DataIO(data=lfp_data, compression='gzip', compression_opts=9), + timestamps=H5DataIO(data=lfp_timestamps, compression='gzip', compression_opts=9), + electrodes=electrode_table_region + )) + + nwbfile.add_acquisition(lfp) + + csd, csd_times, csd_locs = read_csd_data_from_h5(probe["csd_path"]) + nwbfile = add_csd_to_nwbfile(nwbfile, csd, csd_times, csd_locs) + + with pynwb.NWBHDF5IO(probe['lfp']['output_path'], 'w') as lfp_writer: + logging.info(f"writing probe lfp file to {probe['lfp']['output_path']}") + lfp_writer.write(nwbfile, cache_spec=True) + return {"id": probe["id"], "nwb_path": probe["lfp"]["output_path"]} + + +def read_csd_data_from_h5(csd_path): + with h5py.File(csd_path, "r") as csd_file: + return (csd_file["current_source_density"][:], + csd_file["timestamps"][:], + csd_file["csd_locations"][:]) + + +def add_csd_to_nwbfile(nwbfile: pynwb.NWBFile, csd: np.ndarray, + times: np.ndarray, csd_virt_channel_locs: np.ndarray, + csd_unit="V/cm^2", position_unit="um") -> pynwb.NWBFile: + """Add current source density (CSD) data to an nwbfile + + Parameters + ---------- + nwbfile : pynwb.NWBFile + nwbfile to add CSD data to + csd : np.ndarray + CSD data in the form of: (channels x timepoints) + times : np.ndarray + Timestamps for CSD data (timepoints) + csd_virt_channel_locs : np.ndarray + Location of interpolated channels + csd_unit : str, optional + Units of CSD data, by default "V/cm^2" + position_unit : str, optional + Units of virtual channel locations, by default "um" (micrometer) + + Returns + ------- + pynwb.NWBFiles + nwbfile which has had CSD data added + """ + + csd_mod = pynwb.ProcessingModule("current_source_density", "Precalculated current source density from interpolated channel locations.") + nwbfile.add_processing_module(csd_mod) + + csd_ts = pynwb.base.TimeSeries( + name="current_source_density", + data=csd.T, # TimeSeries should have data in (timepoints x channels) format + timestamps=times, + unit=csd_unit + ) + + x_locs, y_locs = np.split(csd_virt_channel_locs.astype(np.uint64), 2, axis=1) + + csd = EcephysCSD(name="ecephys_csd", + time_series=csd_ts, + virtual_electrode_x_positions=x_locs.flatten(), + virtual_electrode_x_positions__unit=position_unit, + virtual_electrode_y_positions=y_locs.flatten(), + virtual_electrode_y_positions__unit=position_unit) + + csd_mod.add_data_interface(csd) + + return nwbfile + + +def write_probewise_lfp_files(probes, session_id, session_metadata, + session_start_time, pool_size=3): + + output_paths = [] + + pool = mp.Pool(processes=pool_size) + write = partial(write_probe_lfp_file, session_id, session_metadata, + session_start_time, logging.getLogger("").getEffectiveLevel()) + + for pout in pool.imap_unordered(write, probes): + output_paths.append(pout) + + return output_paths + + +ParsedProbeData = Tuple[pd.DataFrame, # unit_tables + Dict[int, np.ndarray], # spike_times + Dict[int, np.ndarray], # spike_amplitudes + Dict[int, np.ndarray]] # mean_waveforms + + +def parse_probes_data(probes: List[Dict[str, Any]]) -> ParsedProbeData: + """Given a list of probe dictionaries specifying data file locations, load + and parse probe data into intermediate data structures needed for adding + probe data to an nwbfile. + + Parameters + ---------- + probes : List[Dict[str, Any]] + A list of dictionaries (one entry for each probe), where each probe + dictionary contains metadata (id, name, sampling_rate, etc...) as well + as filepaths pointing to where probe lfp data can be found. + + Returns + ------- + ParsedProbeData : Tuple[...] + unit_tables : pd.DataFrame + A table containing unit metadata from all probes. + spike_times : Dict[int, np.ndarray] + Keys: unit identifiers, Values: spike time arrays + spike_amplitudes : Dict[int, np.ndarray] + Keys: unit identifiers, Values: spike amplitude arrays + mean_waveforms : Dict[int, np.ndarray] + Keys: unit identifiers, Values: mean waveform arrays + """ + + unit_tables = [] + spike_times = {} + spike_amplitudes = {} + mean_waveforms = {} + + for probe in probes: + unit_tables.append(pd.DataFrame(probe['units'])) + + local_to_global_unit_map = {unit['cluster_id']: unit['id'] for unit in probe['units']} + + spike_times.update(read_spike_times_to_dictionary( + probe['spike_times_path'], probe['spike_clusters_file'], local_to_global_unit_map + )) + mean_waveforms.update(read_waveforms_to_dictionary( + probe['mean_waveforms_path'], local_to_global_unit_map + )) + + spike_amplitudes.update(read_spike_amplitudes_to_dictionary( + probe["spike_amplitudes_path"], probe["spike_clusters_file"], + probe["templates_path"], probe["spike_templates_path"], probe["inverse_whitening_matrix_path"], + local_to_global_unit_map=local_to_global_unit_map, + scale_factor=probe["amplitude_scale_factor"] + )) + + units_table = pd.concat(unit_tables).set_index(keys='id', drop=True) + + return (units_table, spike_times, spike_amplitudes, mean_waveforms) + + +def add_probewise_data_to_nwbfile(nwbfile, probes): + """ Adds channel (electrode) and spike data for a single probe to the session-level nwb file. + """ + for probe in probes: + logging.info(f'found probe {probe["id"]} with name {probe["name"]}') + + if probe.get("temporal_subsampling_factor", None) is not None: + probe["lfp_sampling_rate"] = probe["lfp_sampling_rate"] / probe["temporal_subsampling_factor"] + + nwbfile, probe_nwb_device, probe_nwb_electrode_group = add_probe_to_nwbfile( + nwbfile, + probe_id=probe["id"], + name=probe["name"], + sampling_rate=probe["sampling_rate"], + lfp_sampling_rate=probe["lfp_sampling_rate"], + has_lfp_data=probe["lfp"] is not None + ) + + add_ecephys_electrodes(nwbfile, probe["channels"], probe_nwb_electrode_group) + + units_table, spike_times, spike_amplitudes, mean_waveforms = parse_probes_data(probes) + nwbfile.units = pynwb.misc.Units.from_dataframe(fill_df(units_table), name='units') + + sorted_spike_times, sorted_spike_amplitudes = filter_and_sort_spikes(spike_times, spike_amplitudes) + + add_ragged_data_to_dynamic_table( + table=nwbfile.units, + data=sorted_spike_times, + column_name="spike_times", + column_description="times (s) of detected spiking events", + ) + + add_ragged_data_to_dynamic_table( + table=nwbfile.units, + data=sorted_spike_amplitudes, + column_name="spike_amplitudes", + column_description="amplitude (s) of detected spiking events" + ) + + add_ragged_data_to_dynamic_table( + table=nwbfile.units, + data=mean_waveforms, + column_name="waveform_mean", + column_description="mean waveforms on peak channels (and over samples)", + ) + + return nwbfile + + +def add_optotagging_table_to_nwbfile(nwbfile, optotagging_table, tag="optical_stimulation"): + # "name" is a pynwb reserved column name that older versions of the + # pre-processed optotagging_table may use. + if "name" in optotagging_table.columns: + optotagging_table = optotagging_table.rename(columns={"name": "stimulus_name"}) + + opto_ts = pynwb.base.TimeSeries( + name="optotagging", + timestamps=optotagging_table["start_time"].values, + data=optotagging_table["duration"].values, + unit="seconds" + ) + + opto_mod = pynwb.ProcessingModule("optotagging", "optogenetic stimulution data") + opto_mod.add_data_interface(opto_ts) + nwbfile.add_processing_module(opto_mod) + + optotagging_table = setup_table_for_epochs(optotagging_table, opto_ts, tag) + + if len(optotagging_table) > 0: + container = pynwb.epoch.TimeIntervals.from_dataframe(optotagging_table, "optogenetic_stimulation") + opto_mod.add_data_interface(container) + + return nwbfile + + +def add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile: pynwb.NWBFile, + eye_tracking_rig_geometry: dict) -> pynwb.NWBFile: + """ Rig geometry dict should consist of the following fields: + monitor_position_mm: [x, y, z] + monitor_rotation_deg: [x, y, z] + camera_position_mm: [x, y, z] + camera_rotation_deg: [x, y, z] + led_position: [x, y, z] + equipment: A string describing rig + """ + eye_tracking_rig_mod = pynwb.ProcessingModule(name='eye_tracking_rig_metadata', + description='Eye tracking rig metadata module') + + rig_metadata = EcephysEyeTrackingRigMetadata( + name="eye_tracking_rig_metadata", + equipment=eye_tracking_rig_geometry['equipment'], + monitor_position=eye_tracking_rig_geometry['monitor_position_mm'], + monitor_position__unit="mm", + camera_position=eye_tracking_rig_geometry['camera_position_mm'], + camera_position__unit="mm", + led_position=eye_tracking_rig_geometry['led_position'], + led_position__unit="mm", + monitor_rotation=eye_tracking_rig_geometry['monitor_rotation_deg'], + monitor_rotation__unit="deg", + camera_rotation=eye_tracking_rig_geometry['camera_rotation_deg'], + camera_rotation__unit="deg" + ) + + eye_tracking_rig_mod.add_data_interface(rig_metadata) + nwbfile.add_processing_module(eye_tracking_rig_mod) + + return nwbfile + + +def add_eye_tracking_data_to_nwbfile(nwbfile: pynwb.NWBFile, + eye_tracking_frame_times: pd.Series, + eye_dlc_tracking_data: Dict[str, pd.DataFrame], + eye_gaze_data: Dict[str, pd.DataFrame]) -> pynwb.NWBFile: + + if eye_tracking_data_is_valid(eye_dlc_tracking_data=eye_dlc_tracking_data, + synced_timestamps=eye_tracking_frame_times): + add_eye_tracking_ellipse_fit_data_to_nwbfile(nwbfile, + eye_dlc_tracking_data=eye_dlc_tracking_data, + synced_timestamps=eye_tracking_frame_times) + + # --- Add gaze mapped positions to nwb file --- + if eye_gaze_data: + add_eye_gaze_mapping_data_to_nwbfile(nwbfile, + eye_gaze_data=eye_gaze_data) + + return nwbfile + + +def write_ecephys_nwb( + output_path, + session_id, session_start_time, + stimulus_table_path, + invalid_epochs, + probes, + running_speed_path, + session_sync_path, + eye_tracking_rig_geometry, + eye_dlc_ellipses_path, + eye_gaze_mapping_path, + pool_size, + optotagging_table_path=None, + session_metadata=None, + **kwargs +): + + nwbfile = pynwb.NWBFile( + session_description='Data and metadata for an Ecephys session', + identifier=f"{session_id}", + session_id=f"{session_id}", + session_start_time=session_start_time, + institution="Allen Institute for Brain Science" + ) + + if session_metadata is not None: + nwbfile = add_metadata_to_nwbfile(nwbfile, session_metadata) + + stimulus_columns_to_drop = [ + "colorSpace", "depth", "interpolate", "pos", "rgbPedestal", "tex", + "texRes", "flipHoriz", "flipVert", "rgb", "signalDots" + ] + stimulus_table = read_stimulus_table(stimulus_table_path, + columns_to_drop=stimulus_columns_to_drop) + nwbfile = add_stimulus_timestamps(nwbfile, stimulus_table['start_time'].values) # TODO: patch until full timestamps are output by stim table module + nwbfile = add_stimulus_presentations(nwbfile, stimulus_table) + nwbfile = add_invalid_times(nwbfile, invalid_epochs) + + if optotagging_table_path is not None: + optotagging_table = pd.read_csv(optotagging_table_path) + nwbfile = add_optotagging_table_to_nwbfile(nwbfile, optotagging_table) + + nwbfile = add_probewise_data_to_nwbfile(nwbfile, probes) + + running_speed, raw_running_data = read_running_speed(running_speed_path) + add_running_speed_to_nwbfile(nwbfile, running_speed) + add_raw_running_data_to_nwbfile(nwbfile, raw_running_data) + + add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile, + eye_tracking_rig_geometry) + + # Collect eye tracking/gaze mapping data from files + eye_tracking_frame_times = su.get_synchronized_frame_times(session_sync_file=session_sync_path, + sync_line_label_keys=Dataset.EYE_TRACKING_KEYS) + eye_dlc_tracking_data = read_eye_dlc_tracking_ellipses(Path(eye_dlc_ellipses_path)) + if eye_gaze_mapping_path: + eye_gaze_data = read_eye_gaze_mappings(Path(eye_gaze_mapping_path)) + else: + eye_gaze_data = None + + add_eye_tracking_data_to_nwbfile(nwbfile, + eye_tracking_frame_times, + eye_dlc_tracking_data, + eye_gaze_data) + + Manifest.safe_make_parent_dirs(output_path) + with pynwb.NWBHDF5IO(output_path, mode='w') as io: + logging.info(f"writing session nwb file to {output_path}") + io.write(nwbfile, cache_spec=True) + + probes_with_lfp = [p for p in probes if p["lfp"] is not None] + probe_outputs = write_probewise_lfp_files(probes_with_lfp, session_id, + session_metadata, + session_start_time, + pool_size=pool_size) + + return { + 'nwb_path': output_path, + "probe_outputs": probe_outputs + } + + +def main(): + logging.basicConfig( + format="%(asctime)s - %(process)s - %(levelname)s - %(message)s" + ) + + parser = optional_lims_inputs(sys.argv, InputSchema, OutputSchema, get_inputs_from_lims) + + output = write_ecephys_nwb(**parser.args) + write_or_print_outputs(output, parser) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/ecephys/write_nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/write_nwb/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a49024fac1a069f48340a77a906333ed01866d85 GIT binary patch literal 212 zcmYL@JqiLb5QVc~A;KQS!cAc(BL1{uBX)r>`9Z_3lO<Vq*}}rJSa~H|k6>rzq!1sx zZ-!ysFzY-YF%sTykm@Vpr;M5<ISvSh?b$fnJy=NNKR(yZOdO&OQNRgIp`Zio#R@@t zG%ytw+bDc(F>0c(Pkj_yr$ls(oz$R9I9ke96>XT3s{jtAS9Gz3#)qC;ZBvMMff5os Z#iexU8Yzpqe-7toZ!VQxq_^H=_65r=KA8Xj literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/write_nwb/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/write_nwb/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52a85aa1f6586dbca03ced4c32efbd2cc7a3479a GIT binary patch literal 28995 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/write_nwb/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/write_nwb/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32cfc5d39889e208f4a141a1c47f015990af4c06 GIT binary patch literal 7687 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 VTZ21;R|c)YtAqBSH~7w=@n<RJ6_o%0 literal 0 HcmV?d00001 diff --git a/brain_observatory/ecephys/write_nwb/_schemas.py b/brain_observatory/ecephys/write_nwb/_schemas.py new file mode 100644 index 0000000000..f704c16661 --- /dev/null +++ b/brain_observatory/ecephys/write_nwb/_schemas.py @@ -0,0 +1,236 @@ +import marshmallow as mm +import numpy as np + +from argschema import ArgSchema +from argschema.fields import ( + LogLevel, + Dict, + String, + Int, + DateTime, + Nested, + Boolean, + Float, +) + +from allensdk.brain_observatory.argschema_utilities import ( + check_read_access, + check_write_access, + RaisingSchema, +) + + +class Channel(RaisingSchema): + + @mm.pre_load + def set_field_defaults(self, data, **kwargs): + if data.get("filtering") is None: + data["filtering"] = ("AP band: 500 Hz high-pass; " + "LFP band: 1000 Hz low-pass") + if data.get("manual_structure_acronym") is None: + data["manual_structure_acronym"] = "" + return data + + id = Int(required=True) + probe_id = Int(required=True) + valid_data = Boolean(required=True) + local_index = Int(required=True) + probe_vertical_position = Int(required=True) + probe_horizontal_position = Int(required=True) + manual_structure_id = Int(required=True, allow_none=True) + manual_structure_acronym = String(required=True) + anterior_posterior_ccf_coordinate = Float(allow_none=True) + dorsal_ventral_ccf_coordinate = Float(allow_none=True) + left_right_ccf_coordinate = Float(allow_none=True) + impedence = Float(required=False, allow_none=True, default=None) + filtering = String(required=False) + + @mm.post_load + def set_impedence_default(self, data, **kwargs): + # This must be a post_load operation as np.nan is not a valid + # JSON format 'float' type for the Marshmallow `Float` field + # (so validation fails if this is set at pre_load) + if data.get("impedence") is None: + data["impedence"] = np.nan + return data + + +class Unit(RaisingSchema): + id = Int(required=True) + peak_channel_id = Int(required=True) + local_index = Int( + required=True, + help="within-probe index of this unit.", + ) + cluster_id = Int( + required=True, + help="within-probe identifier of this unit", + ) + quality = String(required=True) + firing_rate = Float(required=True) + snr = Float(required=True, allow_none=True) + isi_violations = Float(required=True) + presence_ratio = Float(required=True) + amplitude_cutoff = Float(required=True) + isolation_distance = Float(required=True, allow_none=True) + l_ratio = Float(required=True, allow_none=True) + d_prime = Float(required=True, allow_none=True) + nn_hit_rate = Float(required=True, allow_none=True) + nn_miss_rate = Float(required=True, allow_none=True) + max_drift = Float(required=True, allow_none=True) + cumulative_drift = Float(required=True, allow_none=True) + silhouette_score = Float(required=True, allow_none=True) + waveform_duration = Float(required=True, allow_none=True) + waveform_halfwidth = Float(required=True, allow_none=True) + PT_ratio = Float(required=True, allow_none=True) + repolarization_slope = Float(required=True, allow_none=True) + recovery_slope = Float(required=True, allow_none=True) + amplitude = Float(required=True, allow_none=True) + spread = Float(required=True, allow_none=True) + velocity_above = Float(required=True, allow_none=True) + velocity_below = Float(required=True, allow_none=True) + + +class Lfp(RaisingSchema): + input_data_path = String(required=True, validate=check_read_access) + input_timestamps_path = String(required=True, validate=check_read_access) + input_channels_path = String(required=True, validate=check_read_access) + output_path = String(required=True) + + +class Probe(RaisingSchema): + id = Int(required=True) + name = String(required=True) + spike_times_path = String(required=True, validate=check_read_access) + spike_clusters_file = String(required=True, validate=check_read_access) + mean_waveforms_path = String(required=True, validate=check_read_access) + channels = Nested(Channel, many=True, required=True) + units = Nested(Unit, many=True, required=True) + lfp = Nested(Lfp, many=False, required=True, allow_none=True) + csd_path = String(required=True, + validate=check_read_access, + allow_none=True, + help="path to h5 file containing calculated current source density") + sampling_rate = Float(default=30000.0, help="sampling rate (Hz, master clock) at which raw data were acquired on this probe") + lfp_sampling_rate = Float(default=2500.0, allow_none=True, help="sampling rate of LFP data on this probe") + temporal_subsampling_factor = Float(default=2.0, allow_none=True, help="subsampling factor applied to lfp data for this probe (across time)") + spike_amplitudes_path = String( + validate=check_read_access, + help="path to npy file containing scale factor applied to the kilosort template used to extract each spike" + ) + spike_templates_path = String( + validate=check_read_access, + help="path to file associating each spike with a kilosort template" + ) + templates_path = String( + validate=check_read_access, + help="path to file contianing an (nTemplates)x(nSamples)x(nUnits) array of kilosort templates" + ) + inverse_whitening_matrix_path = String( + validate=check_read_access, + help="Kilosort templates are whitened. In order to use them for scaling spike amplitudes to volts, we need to remove the whitening" + ) + amplitude_scale_factor = Float( + default=0.195e-6, + help="amplitude scale factor converting raw amplitudes to Volts. Default converts from bits -> uV -> V" + ) + + +class InvalidEpoch(RaisingSchema): + id = Int(required=True) + type = String(required=True) + label = String(required=True) + start_time = Float(required=True) + end_time = Float(required=True) + + +class SessionMetadata(RaisingSchema): + specimen_name = String(required=True) + age_in_days = Float(required=True) + full_genotype = String(required=True) + strain = String(required=True) + sex = String(required=True) + stimulus_name = String(required=True) + species = String(required=True) + donor_id = Int(required=True) + + +class InputSchema(ArgSchema): + class Meta: + unknown = mm.RAISE + + log_level = LogLevel( + default="INFO", help="set the logging level of the module" + ) + output_path = String( + required=True, + validate=check_write_access, + help="write outputs to here", + ) + session_id = Int( + required=True, help="unique identifier for this ecephys session" + ) + session_start_time = DateTime( + required=True, + help="the date and time (iso8601) at which the session started", + ) + stimulus_table_path = String( + required=True, + validate=check_read_access, + help="path to stimulus table file", + ) + invalid_epochs = Nested( + InvalidEpoch, + many=True, + required=True, + help="epochs with invalid data" + ) + probes = Nested( + Probe, + many=True, + required=True, + help="records of the individual probes used for this experiment", + ) + running_speed_path = String( + required=True, + help="data collected about the running behavior of the experiment's subject", + ) + session_sync_path = String( + required=True, + validate=check_read_access, + help="Path to an h5 experiment session sync file (*.sync). This file relates events from different acquisition modalities to one another in time." + ) + eye_tracking_rig_geometry = Dict( + required=True, + help="Mapping containing information about session rig geometry used for eye gaze mapping." + ) + eye_dlc_ellipses_path = String( + required=True, + validate=check_read_access, + help="h5 filepath containing raw ellipse fits produced by Deep Lab Cuts of subject eye, pupil, and corneal reflections during experiment" + ) + eye_gaze_mapping_path = String( + required=False, + allow_none=True, + help="h5 filepath containing eye gaze behavior of the experiment's subject" + ) + pool_size = Int( + default=3, + help="number of child processes used to write probewise lfp files" + ) + optotagging_table_path = String( + required=False, + validate=check_read_access, + help="file at this path contains information about the optogenetic stimulation applied during this " + ) + session_metadata = Nested(SessionMetadata, allow_none=True, required=False, help="miscellaneous information describing this session") + + +class ProbeOutputs(RaisingSchema): + nwb_path = String(required=True) + id = Int(required=True) + + +class OutputSchema(RaisingSchema): + nwb_path = String(required=True, description='path to output file') + probe_outputs = Nested(ProbeOutputs, required=True, many=True) diff --git a/brain_observatory/extract_running_speed/__init__.py b/brain_observatory/extract_running_speed/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/extract_running_speed/__main__.py b/brain_observatory/extract_running_speed/__main__.py new file mode 100644 index 0000000000..43b9ea3750 --- /dev/null +++ b/brain_observatory/extract_running_speed/__main__.py @@ -0,0 +1,147 @@ +import warnings + +import numpy as np +import pandas as pd + +from allensdk.brain_observatory import sync_utilities +from allensdk.brain_observatory.argschema_utilities import \ + ArgSchemaParserPlus, \ + write_or_print_outputs +from allensdk.brain_observatory.sync_dataset import Dataset +from ._schemas import InputParameters, OutputParameters + +DEGREES_TO_RADIANS = np.pi / 180.0 + + +def check_encoder(parent, key): + if len(parent["encoders"]) != 1: + return False + if key not in parent["encoders"][0]: + return False + if len(parent["encoders"][0][key]) == 0: + return False + return True + + +def running_from_stim_file(stim_file, key, expected_length): + if "behavior" in stim_file["items"] and check_encoder( + stim_file["items"]["behavior"], key + ): + return stim_file["items"]["behavior"]["encoders"][0][key][:] + if "foraging" in stim_file["items"] and check_encoder( + stim_file["items"]["foraging"], key + ): + return stim_file["items"]["foraging"]["encoders"][0][key][:] + if key in stim_file: + return stim_file[key][:] + + warnings.warn(f"unable to read {key} from this stimulus file") + return np.ones(expected_length) * np.nan + + +def degrees_to_radians(degrees): + return np.array(degrees) * DEGREES_TO_RADIANS + + +def angular_to_linear_velocity(angular_velocity, radius): + return np.multiply(angular_velocity, radius) + + +def extract_running_speeds( + frame_times, dx_deg, vsig, vin, wheel_radius, subject_position, + use_median_duration=False +): + # the first interval does not have a known start time, so we can't compute + # an average velocity from dx + dx_rad = degrees_to_radians(dx_deg[1:]) + + start_times = frame_times[:-1] + end_times = frame_times[1:] + + durations = end_times - start_times + if use_median_duration: + angular_velocity = dx_rad / np.median(durations) + else: + angular_velocity = dx_rad / durations + + radius = wheel_radius * subject_position + linear_velocity = angular_to_linear_velocity(angular_velocity, radius) + + df = pd.DataFrame( + { + "start_time": start_times, + "end_time": end_times, + "velocity": linear_velocity, + "net_rotation": dx_rad, + } + ) + + # due to an acquisition bug (the buffer of raw orientations may be updated + # more slowly than it is read, leading to a 0 value for the change in + # orientation over an interval) there may be exact zeros in the velocity. + df = df[~(np.isclose(df["net_rotation"], 0.0))] + + return df + + +def main( + stimulus_pkl_path, sync_h5_path, output_path, wheel_radius, + subject_position, use_median_duration, **kwargs +): + stim_file = pd.read_pickle(stimulus_pkl_path) + sync_dataset = Dataset(sync_h5_path) + + # Why the rising edge? See Sweepstim.update in camstim. This method does: + # 1. updates the stimuli + # 2. updates the "items", causing a running speed sample to be acquired + # 3. sets the vsync line high + # 4. flips the buffer + frame_times = sync_dataset.get_edges( + "rising", Dataset.FRAME_KEYS, units="seconds" + ) + + # occasionally an extra set of frame times are acquired after the rest of + # the signals. We detect and remove these + frame_times = sync_utilities.trim_discontiguous_times(frame_times) + num_raw_timestamps = len(frame_times) + + dx_deg = running_from_stim_file(stim_file, "dx", num_raw_timestamps) + + if num_raw_timestamps != len(dx_deg): + raise ValueError( + f"found {num_raw_timestamps} rising edges on the vsync line, " + f"but only {len(dx_deg)} rotation samples" + ) + + vsig = running_from_stim_file(stim_file, "vsig", num_raw_timestamps) + vin = running_from_stim_file(stim_file, "vin", num_raw_timestamps) + + velocities = extract_running_speeds( + frame_times=frame_times, + dx_deg=dx_deg, + vsig=vsig, + vin=vin, + wheel_radius=wheel_radius, + subject_position=subject_position, + use_median_duration=use_median_duration + ) + + raw_data = pd.DataFrame( + {"vsig": vsig, "vin": vin, "frame_time": frame_times, "dx": dx_deg} + ) + + store = pd.HDFStore(output_path) + store.put("running_speed", velocities) + store.put("raw_data", raw_data) + store.close() + + return {"output_path": output_path} + + +if __name__ == "__main__": + mod = ArgSchemaParserPlus( + schema_type=InputParameters, output_schema_type=OutputParameters + ) + + output = main(**mod.args) + write_or_print_outputs(data=output, parser=mod) diff --git a/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc b/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1c82427b31aa23d87554a39cce09b8260ddba0a GIT binary patch literal 216 zcmYL@zX}2|48|)sh~R@bcsIC-h<{db5w}7~uR+V5X=!_>H~K72zLKkt;O1m*5I^{S z2_av|dNdje7Ts^q)mMj~dfY78vClAKFUGyyLxgVp$LF@0$wR~tC7i%y8ZJPsToDwG z3``|b6Q%P=v0yrXYNOm*Eu&31@lcd-M9x+fZ<sRI0W2w}`C<dfg*L})3Q!~!Y9dQV b6+NQKm9k`$Qkid`gZbH+y23^G+M6xD<Pt!4 literal 0 HcmV?d00001 diff --git a/brain_observatory/extract_running_speed/__pycache__/__main__.cpython-37.pyc b/brain_observatory/extract_running_speed/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..390d1bc7ed136692df25802d6242b5196d940050 GIT binary patch literal 3177 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/extract_running_speed/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/extract_running_speed/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afd821a2d9fe304aa3a5fcba5076c08a8986d988 GIT binary patch literal 1753 zcmZuy&5q+l5VjpBasFm9%nm|;L`!g(NXyKwU^yTJ`!fQqgaXpcURsf?9(N^f#%_DN z+Y^%80^){v2u?f)Z{aKAzyomMM0GpK%m9vDsp_sy)mL9t=jmwF_wbRwykhs-p7*;o zwoi!4V|=wi!9DJ0UhY#r4`|?9JIGpjNJFQ$vUc8~oxDrCc|@bUM|*jn_VWQ9<U>02 zy)Qf-^7aoNZ-f7Ri;mFl@Gjb22+`g{JK{aGd$5Q0KJTA<lfj=D*_#A)?}=KRCn@Bt z-ruQTGo?XI{Cac-b5>=h@tAb$&J?r(UPsSmS(!7T>dv`QLN4m|=UKr_9iEBA)UD^z z)ZM2=kpYv54YhrC&@XTWJnD0g2GHU@4|waRfQC*Fo!)kO+vy$XT39?np9u9H?>oH* zeLOpG`hX7++Nj=l$sq`qg8`*4)<;Vv43MHSn6)ORASoz7_>qE_l~9N%Od%`RAC}Cd zcE7yJ$XsMVl0q6LBtj&LEr~WFud+%LA?Jn4nGuCtf3!W7KKjogy^=|)3Mtmk_x8EP zZ+{)ne*TU;UcaLl7nQz`yCli)lVVO(C0)>E3Xox@UEWZk_ONh^7w-Avvvn+O7MWNB zCtPTQ<wl%yVp1Twy8H$bL*}Z;-9iEq>#^Ow6M-B*BtjD<F!}?lHNKPek8@i_g0PW! zmY13^Wg{4nSf_%>Lg<yPSfzn5tStuSAd6f`W(s8y*`;g9ibR+dNm!OtnXAPKdB!9< zU`H|T&RfqMxWMHmEU#4KI-LybD2^rO632Bvj`M<7nbn7J{IX(Mv!l9LoqEs^9a~!H z!IrWZIc=7PmXtVs<SZ585ju2rjvF56cvHH#EVQr`tATYoM2vBhU%buiS5Mu;JtzKt z_3Y!>3mhFiV=3b&mu$)8YW74j>>|!Sn1Q_3v!Vp46O=`nuJr6naXG^v@P5gXE4BbU zn`P+1uTC!&c3xau;xAs?Vy;f%TccQF;thAPE&=#ytlb3blX9hom`n#>{WgloANm1) zqM(ttE$4Y>Hu0KjuBA6oxtUD}H`CdoZ64x;wd>(mZjzd7VSVi8jg-5AbBs3xktOy7 zW=odBq!-x70}eV-qI6XqVW8=xqsI8H4y<_13Y&;akB)`CXOO4uEZ-En(T=R^>nPsB zS6eD0hdA)v>K%N$yXOsbyTNyJ_iWIO8+5lXki+eSH=X6Cd=e;|zZ=Nur2TIYwiDH% z6}$epm9kCYU3_(bBJ!2Br;{=5F|}yeRCY(TP|$<j;>m_-WwFrl&H7wG#&uIUOTQZg q*V?LQP5Wo$n%LFV)yBpAzvSxZlZL!ceLSV@(J?mCd#&-&IQj>RH{(qJ literal 0 HcmV?d00001 diff --git a/brain_observatory/extract_running_speed/_schemas.py b/brain_observatory/extract_running_speed/_schemas.py new file mode 100644 index 0000000000..4ec30e7b27 --- /dev/null +++ b/brain_observatory/extract_running_speed/_schemas.py @@ -0,0 +1,36 @@ +from argschema import ArgSchema, ArgSchemaParser +from argschema.schemas import DefaultSchema +from argschema.fields import Nested, InputDir, String, Float, Dict, Int, Boolean + + +class InputParameters(ArgSchema): + output_path = String(required=True, help="write outputs to here") + stimulus_pkl_path = String( + required=True, + help="path to pkl file containing raw stimulus information", + ) + sync_h5_path = String( + required=True, + help="path to h5 file containing synchronization information", + ) + wheel_radius = Float(default=8.255, help="radius, in cm, of running wheel") + subject_position = Float( + default=2 / 3, + help="normalized distance of the subject from the center of the running wheel (1 is rim, 0 is center)", + ) + use_median_duration = Boolean( + default=True, + help="frame timestamps are often too noisy to use as the denominator in the velocity calculation. Can instead use the median frame duration." + ) + + +class OutputSchema(DefaultSchema): + input_parameters = Nested( + InputParameters, + description=("Input parameters the module " "was run with"), + required=True, + ) + + +class OutputParameters(OutputSchema): + output_path = String(required=True, help="path to output file") diff --git a/brain_observatory/eye_tracking/__main__.py b/brain_observatory/eye_tracking/__main__.py new file mode 100644 index 0000000000..e31c9ae41f --- /dev/null +++ b/brain_observatory/eye_tracking/__main__.py @@ -0,0 +1,113 @@ +import os +import subprocess +import shutil +import contextlib +import logging +import marshmallow +import sys +import argschema +import uuid + +from _schemas import InputSchema, OutputSchema + +raise NotImplementedError('refactoring in progress') + +# def run_rule(rule, **kwargs): + +# dockerfile = kwargs.get('dockerfile') +# modelfile = kwargs.get('modelfile') +# video_input_file = kwargs.get('video_input_file') +# ellipse_output_data_file = kwargs.get('ellipse_output_data_file') + +# # Parameters: +# dlc_hash, fork = 'dev3', 'nicain' +# token = os.environ.get('TOKEN', None) +# container = str(uuid.uuid4()) +# model = os.path.splitext(os.path.basename(modelfile))[0] +# tag = 'dlc-eye-tracking:{model}'.format(model=model) + +# dlc_filename = 'dlc-eye-tracking.zip' +# video_input_file_ext = os.path.splitext(video_input_file)[1] +# internal_video_input_file = '/workdir/video_input_file{video_input_file_ext}'.format(video_input_file_ext=video_input_file_ext) +# internal_ellipse_output_data_file = '/workdir/{}'.format(os.path.basename(ellipse_output_data_file)) + +# if rule == 'clean': + +# pipe = subprocess.Popen(['docker', 'container', 'rm', container], stdout=subprocess.PIPE, stderr=subprocess.PIPE) +# outs, errs = pipe.communicate() +# if not (errs == b'') and b'No such container' not in errs: +# raise RuntimeError + +# elif rule == 'setup': +# run_rule('clean', **kwargs) +# command = ['curl', '-H', "Authorization: token {token}".format(token=token), "-L", "https://github.com/{fork}/dlc-eye-tracking/archive/{dlc_hash}.zip".format(dlc_hash=dlc_hash, fork=fork)] +# subprocess.check_call(command, stdout=open(dlc_filename, "wb")) + +# elif rule == 'build': +# run_rule('setup', **kwargs) +# shutil.copyfile(modelfile, 'modelfile.zip') +# subprocess.check_call(['docker', 'build', +# '--build-arg', 'MODELFILE={modelfile}'.format(modelfile='modelfile.zip'), +# '--build-arg', 'DLC_FILENAME={dlc_filename}'.format(dlc_filename=dlc_filename), +# '-t', tag, '-f', dockerfile, '.']) + +# elif rule == 'run': + +# output_filename_dict = {} +# output_filename_dict[internal_ellipse_output_data_file] = ellipse_output_data_file + +# arg_list = ['--video_input_file={}'.format(internal_video_input_file), +# '--ellipse_output_data_file={}'.format(internal_ellipse_output_data_file)] + +# if 'ellipse_output_video_file' in kwargs: +# internal_ellipse_output_video_file = '/workdir/{}'.format(os.path.basename(kwargs['ellipse_output_video_file'])) +# arg_list.append('--ellipse_output_video_file={}'.format(internal_ellipse_output_video_file)) +# output_filename_dict[internal_ellipse_output_video_file] = kwargs['ellipse_output_video_file'] + +# if 'points_output_video_file' in kwargs: +# internal_points_output_video_file = '/workdir/{}'.format(os.path.basename(kwargs['points_output_video_file'])) +# arg_list.append('--points_output_video_file={}'.format(internal_points_output_video_file)) +# output_filename_dict['/workdir/video_input_fileDeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000_labeled.mp4'] = kwargs['points_output_video_file'] + +# subprocess.check_call(['docker', 'create', '--name', container, +# '--device', '/dev/nvidia0:/dev/nvidia0', +# '--runtime=nvidia', +# '-e', 'SCRIPT=DLC_Eye_Tracking_and_Ellipse_Fitting.py', +# '-e', 'ARGS={}'.format(' '.join(arg_list)), +# tag]) +# subprocess.check_call(['docker', 'cp', video_input_file, '{container}:{internal_video_input_file}'.format(container=container, internal_video_input_file=internal_video_input_file)]) +# subprocess.check_call(['docker', 'start', container, '-i']) +# for internal_file, external_file in output_filename_dict.items(): +# subprocess.check_call(['docker', 'cp', '{container}:{internal_file}'.format(container=container, internal_file=internal_file), external_file]) +# subprocess.check_call(['docker', 'container', 'rm', container]) + +# elif rule == 'debug': +# subprocess.check_call(['docker', 'run', '--name', container, '-it', tag, '/bin/bash']) + +# elif rule == 'image-size': +# subprocess.check_call(['docker', 'image', 'inspect', tag, '--format={{.Size}}']) + + +# def main(): + +# logging.basicConfig(format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') + +# args = sys.argv[1:] + +# try: +# parser = argschema.ArgSchemaParser( +# args=args, +# schema_type=InputSchema, +# output_schema_type=OutputSchema, +# ) +# logging.info('Input successfully parsed') +# except marshmallow.exceptions.ValidationError as err: +# logging.error('Parsing failure') +# print(err) +# raise err + +# run_rule(**parser.args) + +# if __name__ == "__main__": + +# main() diff --git a/brain_observatory/eye_tracking/__pycache__/__main__.cpython-37.pyc b/brain_observatory/eye_tracking/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..472c5c29a142e0663b504c79d1b5e03053b248f4 GIT binary patch literal 500 zcmZ8eJ8#=C5GEzZR%9C}&;nVrdPqEED~h5IbO;c{gOP<0AW$MB3E@NFQL)u6=}*bj zzr?ju|3apmWF$k5;P>&4_auKTmnlIpPY-<aiI9JT@+uJ?zTpOeAc&xfume*@M?GTE z$T5pYp0LTtN9<_iDVvTwW3!PHmLNy!Sf?!2b2g_$E=2r?K2kxqWHtGZmB{rf3iC_T zc79vdQuDCbbpB2Ied6RTFTHh*sZJYn+B#b~39wp*$U;b=E6`M;B}}32e4|2ITI1#3 ztELDuWvdE9*<5o6wdP9MU5KFvcFbJ`hmw=7YXnR3g9>hV3l}4VkJr{;>Q+fDF{k+D zoOOSRTMP~ZJnw&g&Tc?D$au}gdBJzw^x1dAu?fL1GHLE1v#m5xBHFg@A-igd3>q)b zT3+7qN@A>1=ppXbh2xFMZGjo@IZoZLWiNB@&=IFt=eZv4^YgY3$ro)!r{q_PeE@zZ LN$9&3eTZHF5FnI% literal 0 HcmV?d00001 diff --git a/brain_observatory/eye_tracking/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/eye_tracking/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fb80774314a6e981b8416a2d22827870f5c2caa GIT binary patch literal 1721 zcmZ`)OK&4Z5T2Lq@!NSVS+s}|oGgKJ;D!()OA-_*WYH#YXjvL{rYm+U)6?GWv4ed> zi@2@Cf8fMl>MJMy0w=0_Y-h79V@;{Pepc1@)%bb0+w$-!{`iGXYo7O)1)C>A=No+W z?`W9E{M-{h@kKxa-{K$-MMNU!hj~rZNnJEZL&PK&P0|!C(h_ab79G+NUD6dj(sOI0 zye|f1Aa=-(!?k=@?2$dOPxi$DIq<#jJXU9oUp>|U|8+>7AdXoRaT5*@f52K--mv{Q zM&%6y(>zv_t85B_n*P@PfhrAZ=$q~d+|qeoRx5^06JN;51uP&p^{Z0xVq(JcqBQXd zE#aCAF!f8&B{0)?E@ck1FtxK>($Yj1T%$eVS&6sSULK!cotpknH0O+#To$KFNi_`3 z4#tw*r3xrZX_kT3=2<m#uXqXTu~aTVxdGFCNx8;Ast_}q*5*M<Dhhr>2R!04j|5l_ zp9NTs;B`Pkh*-!XR(lhW8q{s!Sd4xH{U*e$#oBK|(p;mCL#;LHI@ETk!+H*N5j9|g zdXG?_^|9~+(>^a|^L0fZh3jv^9lRATgd}1<ZVXm~w>FNxhmu|nYbH+9f(l4e(@Ikz z**v#?Crw|?X<p5!9-e0!^Wv_M_r;%{Iz;TuKR<u_<@iUWT94_Jve6B_r^Rx7T+mDw zjD9hOVxh-!28GVh%Gq?O#~1u&tdWY(XEeK`6TrQBjw{&R(T$?KNaYQlxS*v}%OhAq zS}I(K3>~G~2~Ce?OB2}yniz-<(8Rv_&;}WuU!J{KeX5~M$|)qdoJ??Il3T?k^41Mj zNur1vtP-bbGtimhGpi#Ls(EoX4Ae7wUaa8NoGW10tNjz1-GRF0IV87IC0t<a!%%(f z)-5U_g8B&IYM1a?vR#Q6LcZEPT|%-+B@uGLVRhgnn8<mFjOwJ6$rKb^4hL!<k5LEK zJh8?mr>q=J6LU&kKB|tGL<$*GmT}Tz+X%7$?WHyZGFWg1GUZk^sU1-}cJ(3TIiG1r ztJ_m-BkHEf(|2a7{qC&8ndC*OH+vpt9yC#TPw@)1hbG2X?^?(21s%WR_qIPb|46~x zZ=O}yrr{v84aY)ktB6IY<eKTca22as_WFOyh#XpO93!aocT4K3*Ip+-qviCyDSUz_ zSS~gyv-om&NSahlDm5yrKNX@OJKMq0TB*urL<SGzw;Xb&9hHth)v&v5k(3p)vi}FF zZB56TE*kuX<L7iLuuJ5<>qXVK!=p{xjQ-O$qwR(1yyQ7AIcTR5N4>IixZ*3D&inE< Z@mE!wd~H7}+Qu?K?mqJe!G194{0pSk&Q$;a literal 0 HcmV?d00001 diff --git a/brain_observatory/eye_tracking/__pycache__/build.cpython-37.pyc b/brain_observatory/eye_tracking/__pycache__/build.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..861375f680024997c327fc587d48221cf22d1548 GIT binary patch literal 4118 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 RUm56)!UuWAdm$S$=s$|fvgQB) literal 0 HcmV?d00001 diff --git a/brain_observatory/eye_tracking/_schemas.py b/brain_observatory/eye_tracking/_schemas.py new file mode 100644 index 0000000000..6110fb1f2b --- /dev/null +++ b/brain_observatory/eye_tracking/_schemas.py @@ -0,0 +1,21 @@ +from argschema import ArgSchema, ArgSchemaParser +from argschema.schemas import DefaultSchema +from argschema.fields import LogLevel, String, Int, DateTime, Nested, Boolean, Float, List, Dict +from marshmallow import RAISE, ValidationError + +from allensdk.brain_observatory.argschema_utilities import check_read_access, check_write_access_overwrite, RaisingSchema + +class InputSchema(ArgSchema): + class Meta: + unknown = RAISE + log_level = LogLevel(default='INFO', description='set the logging level of the module') + rule = String(default='run', required=False) + dockerfile = String(required=True, validate=check_read_access, description='Dockerfile for image') + modelfile = String(required=True, validate=check_read_access, description='Zip file for model') + video_input_file = String(required=True, validate=check_read_access, description='Eye tracking movie') + ellipse_output_data_file = String(required=True, validate=check_write_access_overwrite, description='write outputs to here') + ellipse_output_video_file = String(required=False, validate=check_write_access_overwrite, description='write outputs to here') + points_output_video_file = String(required=False, validate=check_write_access_overwrite, description='write outputs to here') + +class OutputSchema(RaisingSchema): + output_path = String(required=True, description='write outputs to here') \ No newline at end of file diff --git a/brain_observatory/eye_tracking/build.py b/brain_observatory/eye_tracking/build.py new file mode 100644 index 0000000000..d2bc8b75ce --- /dev/null +++ b/brain_observatory/eye_tracking/build.py @@ -0,0 +1,150 @@ +import argparse +import os +import subprocess +import contextlib +import shutil + + +CURR_FILE_DIR = os.path.dirname(os.path.abspath(__file__)) +DOCKERFILE_STAGE_1 = os.path.join(CURR_FILE_DIR, 'stage_1', 'Dockerfile') +DOCKERFILE_STAGE_2 = os.path.join(CURR_FILE_DIR, 'stage_2', 'Dockerfile') +DOCKERFILE_STAGE_3 = os.path.join(CURR_FILE_DIR, 'stage_3', 'Dockerfile') +DOCKERFILE_STAGE_4 = os.path.join(CURR_FILE_DIR, 'stage_4', 'Dockerfile') +MODELFILE_CACHE_LOC = os.path.join(CURR_FILE_DIR, 'stage_1', 'modelfile.zip') + + +def run_rule(rule, **kwargs): + + if rule == 'clean': + + with contextlib.suppress(FileNotFoundError): + os.remove(MODELFILE_CACHE_LOC) + + elif rule == 'build:stage-1': + + # Download and cache modelfile: + modelfile = kwargs.get('modelfile') + if not modelfile: + + if not os.path.exists(MODELFILE_CACHE_LOC): + from google.cloud import storage + + source_bucketname = 'dlc-eye-tracking-models' + source_filename = 'universal_eye_tracking-peterl-2019-07-10.zip' + target_filename = MODELFILE_CACHE_LOC + + client = storage.Client() + bucket = client.get_bucket(source_bucketname) + blob = bucket.blob(source_filename) + blob.download_to_filename(target_filename) + modelfile = MODELFILE_CACHE_LOC + assert os.path.exists(modelfile) + + subprocess.check_call(['docker', 'build', + '--build-arg', 'MODELFILE={modelfile}'.format(modelfile='modelfile.zip'), + '-t', 'dlc-eye-tracking:stage-1', '-f', DOCKERFILE_STAGE_1, 'stage_1']) + + elif rule == 'build:stage-2': + subprocess.check_call(['docker', 'build', + '-t', 'dlc-eye-tracking:stage-2', '-f', DOCKERFILE_STAGE_2, 'stage_2']) + + elif rule == 'build:stage-4': + subprocess.check_call(['docker', 'build', + '-t', 'dlc-eye-tracking:stage-4', '-f', DOCKERFILE_STAGE_4, 'stage_4']) + + elif rule == 'build:stage-3': + + # Download and cache modelfile: + modelfile = kwargs.get('modelfile') + if not modelfile: + + if not os.path.exists(MODELFILE_CACHE_LOC): + from google.cloud import storage + + source_bucketname = 'dlc-eye-tracking-models' + source_filename = 'universal_eye_tracking-peterl-2019-07-10.zip' + target_filename = MODELFILE_CACHE_LOC + + client = storage.Client() + bucket = client.get_bucket(source_bucketname) + blob = bucket.blob(source_filename) + blob.download_to_filename(target_filename) + modelfile = MODELFILE_CACHE_LOC + assert os.path.exists(modelfile) + shutil.copyfile(modelfile, os.path.join(CURR_FILE_DIR, 'stage_3', 'modelfile.zip')) + + subprocess.check_call(['docker', 'build', + '--build-arg', 'MODELFILE={modelfile}'.format(modelfile='modelfile.zip'), + '-t', 'dlc-eye-tracking:stage-3', '-f', DOCKERFILE_STAGE_3, 'stage_3']) + + elif rule in ['run:stage-1', 'run:stage-2']: + assert kwargs['modelfile'] is None + video_input_file = kwargs.get('video_input_file') + stage = rule.split(':')[-1] + + subprocess.check_call(['docker', 'run', + '--runtime=nvidia', + '-e', 'VIDEO_INPUT_FILE={}'.format(video_input_file), 'dlc-eye-tracking:{}'.format(stage)]) + + elif rule in ['tag:stage-1', 'tag:stage-2', 'tag:stage-3', 'tag:stage-4']: + stage = rule.split(':')[-1] + subprocess.check_call(['docker', 'tag', 'dlc-eye-tracking:{}'.format(stage), 'us.gcr.io/aibs-pilot/dlc-eye-tracking:{}'.format(stage)]) + + elif rule in ['tag-aibs:stage-1', 'tag-aibs:stage-2', 'tag-aibs:stage-3']: + stage = rule.split(':')[-1] + subprocess.check_call(['docker', 'tag', 'dlc-eye-tracking:{}'.format(stage), 'docker.aibs-artifactory.corp.alleninstitute.org/dlc-eye-tracking:{}'.format(stage)]) + + elif rule in ['push:stage-1', 'push:stage-2', 'push:stage-3', 'push:stage-4']: + stage = rule.split(':')[-1] + subprocess.check_call(['docker', 'push', 'us.gcr.io/aibs-pilot/dlc-eye-tracking:{}'.format(stage)]) + + elif rule in ['push-aibs:stage-1', 'push-aibs:stage-2', 'push-aibs:stage-3']: + stage = rule.split(':')[-1] + subprocess.check_call(['docker', 'push', 'docker.aibs-artifactory.corp.alleninstitute.org/dlc-eye-tracking:{}'.format(stage)]) + + elif rule == 'build:all': + run_rule('build:stage-1', **kwargs) + run_rule('build:stage-2', **kwargs) + run_rule('build:stage-3', **kwargs) + run_rule('build:stage-4', **kwargs) + + elif rule == 'tag:all': + run_rule('tag:stage-1', **kwargs) + run_rule('tag:stage-2', **kwargs) + run_rule('tag:stage-3', **kwargs) + run_rule('tag:stage-4', **kwargs) + + elif rule == 'push:all': + run_rule('push:stage-1', **kwargs) + run_rule('push:stage-2', **kwargs) + run_rule('push:stage-3', **kwargs) + run_rule('push:stage-4', **kwargs) + + elif rule == 'all': + run_rule('build:all', **kwargs) + run_rule('tag:all', **kwargs) + run_rule('push:all', **kwargs) + else: + + raise RuntimeError('Invalid rule: {}'.format(rule)) + + +if __name__ == "__main__": + + # Sanity check: + for filename in [DOCKERFILE_STAGE_1, DOCKERFILE_STAGE_2]: + assert os.path.exists(filename) + + parser = argparse.ArgumentParser() + parser.add_argument("rule", help="Rule to run", choices=['build:stage-1', 'run:stage-1', 'tag:stage-1', 'push:stage-1', + 'build:stage-2', 'run:stage-2', 'tag:stage-2', 'push:stage-2', + 'build:stage-3', 'tag:stage-3', 'push:stage-3', + 'build:stage-4', 'tag:stage-4', 'push:stage-4', + 'tag-aibs:stage-1', 'tag-aibs:stage-2', 'push-aibs:stage-1', 'push-aibs:stage-2', + 'clean', 'build:all', 'tag:all', 'push:all', 'all'], nargs='+') + parser.add_argument("--modelfile", help="DLC model zip file location", type=str) + parser.add_argument("--video_input_file", help="input artifact", type=str) + + args = vars(parser.parse_args()) + for rule in args.pop('rule'): + run_rule(rule, **args) diff --git a/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py b/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py new file mode 100644 index 0000000000..9c15e39a2f --- /dev/null +++ b/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py @@ -0,0 +1,75 @@ +import time +t0 = time.time() +import tensorflow as tf +import os +os.environ["DLClight"]="True" +import deeplabcut + +from matplotlib.patches import Ellipse +import matplotlib.pyplot as plt +from moviepy.video.io.bindings import mplfig_to_npimage +from moviepy.editor import * +import numpy as np +import collections +import pandas as pd +import sys +import re +import argparse +import logging + + +ch = logging.StreamHandler() +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger = logging.getLogger('dlc-eye-tracking') +logger.setLevel(logging.INFO) +logger.addHandler(ch) +logger.propagate = False + +parser = argparse.ArgumentParser() +parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") +parser.add_argument("--ellipse_output_video_file", type=str, required=False, help="Create ellipse video file") +parser.add_argument("--points_output_video_file", type=str, required=False, help="Create ellipse video file") +args = parser.parse_args() + +video_file_path = args.video_input_file +bucket_data_blobname = video_file_path[:-4] + 'DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000.h5' +output_data_file = '/workdir/{}'.format(bucket_data_blobname) + +from google.cloud import storage +client = storage.Client() +src_bucket = client.get_bucket('brain-observatory-eye-videos') +tgt_bucket = client.get_bucket('brain-observatory-dlc-eye-tracking') +blob = src_bucket.get_blob(video_file_path) +blob.download_to_filename(video_file_path) + +path_config_file = '/workdir/model/config.yaml' + +# ### Track points in video and generate h5 file: + +initialization_time = time.time() - t0 +dlc_analysis_t0 = time.time() +deeplabcut.analyze_videos(path_config_file, [video_file_path]) +dlc_analysis_time = time.time() - dlc_analysis_t0 + + +blob2 = tgt_bucket.blob(bucket_data_blobname) +blob2.upload_from_filename(filename=output_data_file) + + +logger.info('Initialization Time: {}'.format(initialization_time)) +logger.info('DLC Analysis Time: {}'.format(dlc_analysis_time)) +logger.info('Total Walltime: {}'.format(time.time()-t0)) + +#optional: display video in notebook +#animation.ipython_display(fps=fps) + + +#optional: plot some of the ellipse parameters over time +# %matplotlib inline + +# import seaborn as sns +# sns.set() +# raw = pd.read_hdf(flat_file, key='flat') +# raw.plot(y=['pupil_area', 'pupil_center_x', 'pupil_center_y', 'reflection_x', 'reflection_y'], subplots = True, layout=(1,5), figsize=[25,5], ls='', marker='.', ms=5, title = video_file_path) + diff --git a/brain_observatory/eye_tracking/stage_1/__pycache__/DLC_Eye_Tracking.cpython-37.pyc b/brain_observatory/eye_tracking/stage_1/__pycache__/DLC_Eye_Tracking.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1943cca8111803455a5b63eaf570705fe1e86c7e GIT binary patch literal 2092 zcmZWqUr!rH5WlkzV~hbq_!A(dZkn_}VjBWU6H1z-BvDhLv{I-ltx!*E@7P}0yS?77 zLB1#teW=uze1}7Q>Q}ngKIJR4Rnyr!L!9PLw=+Bcc6RnRdtXmXlq`Jw-+!Thk6G5A zW^(=%ka>uo`q#EBW-(h>!~!d}&Mac5^Bl>i)FBSbfpav%^1GR3ffP{Vh*7UdigqR& z^Gakq<wr!>n;;V@Ul5ZAnSP2?(rD9UI;At@Qc7pZY)a?ITuSH3d`cI{0xZOrF`GrC zOKkMaCd;rGUxDQ_+qO{l5i6o>1y<sZVd1EnN>}1fV9{`F3|8E$Fdu)45w5|tqwA~$ zpRsXPW)rU+^f!`8l#H>dAxY(ZN&Go_ufpol8d-;RX0z#EbBh+6S+K|rb}7CIH!y=5 z<~u9uUV}6+ZX@16pH0||Z?QSlZl&Bja@(*K--dPM?!cY+3&UZa3*>HAb+9j6<lf)} zcAyY{33p+=W1r<PYI-iPgBH869p6dUy$|<~zJeON{MyuGC4RsbF{68D_Mj3E*b>fn zhvv&T&m!SknVi`#thFm|3@V-{&Oz7%QhdC>CwQl;*X(5Ui4Z(cfb6svh&J!ITDpF~ zJ=!rsdp+8|zDiX~a}U;3wN|~p>eCBWzzK+<xd%!aM-^3=Xw{$(H67B{G50%9qnTRm zgfoyX_k*5x+g!jwv=UI=t!i0KRaGOrS@nYLstl|2gs<fjNB09riXr^m;~}ub>4FHN z<ysB0)Lq%rCSDfX1c(;*LZBL|1B;>9(Ne7zNbYO(q1&5(-oAYsJ$MWd>|wkRln?s$ zhTHS`351FY7x&|y@8{c|*xXRvUb`(|)7{+I+Q6sYy&a7=PGxw^c-VOP%2Zfs8DdSM zE6tE{zb2as!V`+Zep;V2Z53VpQ2YN1MoSlwJ;^{cTGGb@tM{oVaG|2vx;cwz;hE1h zr-DaRbLm$P@a%S~FJDD-c=FXpJ{5h%)jRRbfz(t~f22Z~V>YI153%mZCpo=AN*a76 z!?uv8IBzF8sghCfPk1POQes#yL7T0fCNmz@fsk78W*yJ9)ddyi5qV^KSkX5oq!45@ z9|%nrJ$b?*=-1O~)VZuTxz7+aDs+th<hdRg$I6irzvl)0B<BaocuNWah)?M&3`%`Q zRgw!>l2?6XLWB+tI{^(9B%?xhIv6#Xc%cy?-ZyA1AWU+tZZh^%hM1+s=~(-MEi2GN ziVo;~41qQU6AEb&4fahJB+j$vPrpk_l(F-$V?ihb+Cd~HlaInq&jVk7ZxTWGG@&pl zqq&Rur8-Pmhe;__8KFuXGm=UM?RRZMrrv?wH4Q{&o4wXCXqQn<-KLOD1B9fIZG=<? zEs|;tOh~ySWk*20C1j6<<}X4Dcqw3lNuiZeQo_x;Sy)n1Ve5j|oeOy}wZY|xV;04$ zUY`0wQf6+Eb3BrYNzu*Fno7wf{vJYI12r;*fOqKtoi5^TGMz+_wYI_^%X<dKXT&Uf zi_G>AQ@Cn7l-|X<iNpQ2{KE=w;`Y+vuiy4|4u8P<t3%qQtlp%j)bAf+M__V{ZXF`1 z)u9X!?kyZ;(Cw?kecn7&Tth9uiwqkXeGzcJV#kfNXWgNWZVcZL4W-fC-E3gjxli!w zI2c@ob%btl7kjuT;4Az)Tk0nqigxyv>|(BLoA+EYp!uR*O5ZY$g<R2|N#A0wU{~xC U`kd=aIma=xNxPgc;a5TZe}z7zlK=n! literal 0 HcmV?d00001 diff --git a/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py b/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py new file mode 100644 index 0000000000..0ccf1b2e71 --- /dev/null +++ b/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py @@ -0,0 +1,147 @@ +import time +t0 = time.time() +import os + +from matplotlib.patches import Ellipse +import matplotlib.pyplot as plt +from moviepy.video.io.bindings import mplfig_to_npimage +from moviepy.editor import * +import numpy as np +import collections +import pandas as pd +import sys +import re +import argparse +import logging +from ellipses import LSqEllipse +from google.cloud import storage + + +ch = logging.StreamHandler() +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger = logging.getLogger('dlc-ellipse-fitting') +logger.setLevel(logging.INFO) +logger.addHandler(ch) +logger.propagate = False + +parser = argparse.ArgumentParser() +parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") +args = parser.parse_args() + +video_file_path = args.video_input_file +h5file_path = video_file_path[:-4] + 'DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000.h5' + +ellipse_bucket_data_blobname = '{}.h5'.format(os.path.splitext(video_file_path)[0]) +ellipse_output_data_file = '/workdir/{}'.format(ellipse_bucket_data_blobname) + + +client = storage.Client() +src_bucket = client.get_bucket('brain-observatory-dlc-eye-tracking') +tgt_bucket = client.get_bucket('dlc-ellipse-fitting') +blob = src_bucket.get_blob(h5file_path) +blob.download_to_filename(h5file_path) + +path_config_file = '/workdir/model/config.yaml' + + +def fit_ellipse(h5name): + + df = pd.read_hdf(h5name).DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000 + + l_threshold = 0.8 #increased likelihood threshold for points that are allowed in fit + min_num_points = 6 + + # uses https://github.com/bdhammel/least-squares-ellipse-fitting + # based on the publication Halir, R., Flusser, J.: 'Numerically Stable Direct Least Squares Fitting of Ellipses' + + cr = [] + eye = [] + pupil = [] + + #new for loop + loop_t0 = time.time() + last_loop_time = time.time() + for j in range(len(df)): + + #fit ellipses to the pupil & eye points in 4/25 + + frac_completed = max(1,float(j))/len(df) + frac_rem = 1-frac_completed + tot_time_est = (time.time() - loop_t0)/frac_completed + progress_str = "{:10.2f} {:10.2f} {:5s} {:10.2f}".format(time.time()-last_loop_time, time.time()-loop_t0, "{0:.0%}".format(frac_completed), tot_time_est) + logger.info('Ellipse fit: {}'.format(progress_str)) + last_loop_time = time.time() + + x_data = df.filter(regex=("cr*")).iloc[j].values[0::3] + y_data = df.filter(regex=("cr*")).iloc[j].values[1::3] + l = df.filter(regex=("cr*")).iloc[j].values[2::3] + try: + if len(l[l>l_threshold]) >= min_num_points: #at least 6 tracked points for annotation quality data + lsqe = LSqEllipse() #make fitting object + lsqe.fit([x_data[l>l_threshold], y_data[l>l_threshold]]) + center, width, height, phi = lsqe.parameters() + ellipse_dict = {'center_x' : center[0], 'center_y' : center[1], 'width' : width, 'height' : height, 'phi' : phi} + else: + ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} + except Exception as e: + ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} + print(e) + cr.append(ellipse_dict) + #eye + x_data = df.filter(regex=("eye*")).iloc[j].values[0::3] + y_data = df.filter(regex=("eye*")).iloc[j].values[1::3] + l = df.filter(regex=("eye*")).iloc[j].values[2::3] + try: + if len(l[l>l_threshold]) >= min_num_points: #at least 6 tracked points for annotation quality data + lsqe = LSqEllipse() #make fitting object + lsqe.fit([x_data[l>l_threshold], y_data[l>l_threshold]]) + center, width, height, phi = lsqe.parameters() + ellipse_dict = {'center_x' : center[0], 'center_y' : center[1], 'width' : width, 'height' : height, 'phi' : phi} + else: + ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} + except Exception as e: + ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} + print(e) + eye.append(ellipse_dict) + + + #pupil + x_data = df.filter(regex=("pupil*")).iloc[j].values[0::3] + y_data = df.filter(regex=("pupil*")).iloc[j].values[1::3] + l = df.filter(regex=("pupil*")).iloc[j].values[2::3] + try: + if len(l[l>l_threshold]) >= min_num_points: #at least 6 tracked points for annotation quality data + lsqe = LSqEllipse() #make fitting object + lsqe.fit([x_data[l>l_threshold], y_data[l>l_threshold]]) + center, width, height, phi = lsqe.parameters() + ellipse_dict = {'center_x' : center[0], 'center_y' : center[1], 'width' : width, 'height' : height, 'phi' : phi} + else: + ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} + except Exception as e: + ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} + print(e) + pupil.append(ellipse_dict) + + pd.DataFrame(cr).to_hdf(ellipse_output_data_file, key='cr', mode='w') #overwrite file + pd.DataFrame(eye).to_hdf(ellipse_output_data_file, key='eye', mode='a') + pd.DataFrame(pupil).to_hdf(ellipse_output_data_file, key='pupil', mode='a') + + + blob2 = tgt_bucket.blob(ellipse_bucket_data_blobname) + blob2.upload_from_filename(filename=ellipse_output_data_file) + + + return cr, eye, pupil + +initialization_time = time.time() - t0 +ellipse_fit_t0 = time.time() +cr, eye, pupil = fit_ellipse(h5file_path) +ellipse_fit_time = time.time() - ellipse_fit_t0 + +logger.info('Initialization Time: {}'.format(initialization_time)) +logger.info('Ellipse Fit Time: {}'.format(ellipse_fit_time)) +logger.info('Total Walltime: {}'.format(time.time()-t0)) + + + diff --git a/brain_observatory/eye_tracking/stage_2/__pycache__/DLC_Ellipse_Fitting.cpython-37.pyc b/brain_observatory/eye_tracking/stage_2/__pycache__/DLC_Ellipse_Fitting.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb558c34b1a54e39f9c8b81db295e40a011a81c4 GIT binary patch literal 3992 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py b/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py new file mode 100644 index 0000000000..a8032606c3 --- /dev/null +++ b/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py @@ -0,0 +1,65 @@ +import time +t0 = time.time() +import tensorflow as tf +import os +os.environ["DLClight"]="True" +import deeplabcut + +from matplotlib.patches import Ellipse +import matplotlib.pyplot as plt +from moviepy.video.io.bindings import mplfig_to_npimage +from moviepy.editor import * +import numpy as np +import collections +import pandas as pd +import sys +import re +import argparse +import logging + + +ch = logging.StreamHandler() +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger = logging.getLogger('dlc-eye-tracking') +logger.setLevel(logging.INFO) +logger.addHandler(ch) +logger.propagate = False + +parser = argparse.ArgumentParser() +parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") +parser.add_argument("--ellipse_output_video_file", type=str, required=False, help="Create ellipse video file") +parser.add_argument("--points_output_video_file", type=str, required=False, help="Create ellipse video file") +args = parser.parse_args() + +video_file_path = args.video_input_file +bucket_data_blobname = video_file_path[:-4] + 'DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000_labeled.mp4' +output_data_file = '/workdir/{}'.format(bucket_data_blobname) + +from google.cloud import storage +client = storage.Client() +src_bucket = client.get_bucket('brain-observatory-eye-videos') +tgt_bucket = client.get_bucket('dlc-labeled-videos') +blob = src_bucket.get_blob(video_file_path) +blob.download_to_filename(video_file_path) +path_config_file = '/workdir/model/config.yaml' +initialization_time = time.time() - t0 + +dlc_analysis_t0 = time.time() +deeplabcut.analyze_videos(path_config_file, [video_file_path]) +dlc_analysis_time = time.time() - dlc_analysis_t0 + +dlc_movie_t0 = time.time() +deeplabcut.create_labeled_video(path_config_file, [video_file_path]) +dlc_movie_time = time.time() - dlc_movie_t0 + + + +blob2 = tgt_bucket.blob(bucket_data_blobname) +blob2.upload_from_filename(filename=output_data_file) + + +logger.info('Initialization Time: {}'.format(initialization_time)) +logger.info('DLC Analysis Time: {}'.format(dlc_analysis_time)) +logger.info('DLC Movie Generation Time: {}'.format(dlc_movie_time)) +logger.info('Total Walltime: {}'.format(time.time()-t0)) diff --git a/brain_observatory/eye_tracking/stage_3/__pycache__/DLC_Labeled_Video.cpython-37.pyc b/brain_observatory/eye_tracking/stage_3/__pycache__/DLC_Labeled_Video.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b7652bd479a81e0acd0e077dabe3e91605b59f7 GIT binary patch literal 2227 zcmZV<O-~y~bk{b<7z2jz5g?&%o3ub;8v;p_lzft=Nk!92p{+DRT8%x=W?^<`J2M7( zqa1qZp@;kjqn`S2dfsbK{R>s4^v$eIoW?89`+oc8eeL6kiK2tQ@b_Qnp9RPH%MgQK z9+8LmR~s3}VGeV-LmY5=&Y448OJ_*d!W_x54CIbRSav7X%#%Dya(px>kb;}?#)2Xl zxA+Jz1rub#;(0!~pUS65*?OBM(-zK<3l`3jSqtaLoQ3mb-ogd401Lf~7|kNWB{q8I zl4V%zU4rE^*L9G0nH7+?0xP|bVBx4@xhuVoVbNf03|72PV7~V$dbk2tj;^vIe8$FE ziA}u8p}pZuB4><E4ROlvb9$en^(w3$t&w$DXD*xmHM8ijnFWVjV;6eY;TlFz#dv3V zEvS<^`mOgi&}I`hdpFn|O1CUFkJvVB^=`sCVz=N{?+b%roD1Z3nssn5I^<5j0(T+b z`x0)$dfPqApjTTLxQiM)eT{plasLC2d#LdMwtKg1WDnut(Icp`i*HQER(g-wBF22@ z%<bpuF<U}<XNX=#`oR!=3F-9R7+uO|?n`Iw^53S9UL?7F*#S~`vbW3q_Mu*LlhLm@ z_ag;}P6rWh`E5@NFO2+vwhhx=kGHR`Qq|Oc0BfpJtz2CV={d^b1o#jgfKtX##bw5u zRp>%hOWHj4!}im7rdmDm83@l0qmK4kK8O8yC8GMUqD94uDu#Kz5=7e-AuII6U&|&r z-HjkANcg$qOJGUv5O@?XSF4bQ?um{z{!-t@LA<ytfoiDqHHLi0OVw&5{7|b8&Hn!P z?c2BUvnK%2F8Y(8LeMuiyiVw!fK-%wcpq<YpKm&Rb3+|=S}hKn-sZ;E2L3!w8^D3p z@CNaC{Zz<f=F9r4*Cy3U3yH~zFEu3f!>VW~kS7$GU7IKyzlvu};`(mVe5rWp+*2SJ z@Oo2(SgBf<1{@t1%$-dU;)Um-uYJn>m}*~ym3=JQ-O8)i@f?=C@+hRdt9<p2ec7<T z6(>GazJ?Iw|Ey;Ag{Hjn6Xo2L-*{Tv#d;u~Wb_6pY6z8(EiO)xZY3F^l2Hgxd?`Xw zWSB?1N3)~JOh9$Sh30;vhV^b9f|6P6NHRSv=o%H0k5ZV8xF(B%2`=i^Y;tP8s5ShM zVK*t6Gxn1MIWQj+Nk+m>5OtGG7$xIP!8u^xicq0b8ZxSqOvI9`>LMbsrKoI2R4PbD zxoEf1YclatW9J0VP@98HGR?ze?5U6#rABhBb&i%4=pjKH^d7oEoxE{{uz(7CW;&AG z^A}IQONx}Sf!nc2iiozcLzBrzvfT+F)Zd#x(A)+jlM<?X7@w74$XX^vD>6)#<jhIR zY0JMGCo=VJ2s|@bWVX?19)tE6)zoWn(J+0I<kO3ga({HJ)N~OkwS{PNs5QChFloL= zB#+Ai15ENw3rP_#>!of<QOV{xuG{DQg4My-k(_xcel)~s$OUC)yA0Zulud|U+RT<q zF8J>?uxDD0OyNX$wBNiQ_T8i<Vn|0`;V0@n1!Ge(EZZE$V76)Z!C*R5J2E+>V{ArD zs5i)L2m25sZAlTF$C~8)uqFO*<aJDmJ^uM^_wK<DSTl7%4=JlP=qU}m2RLMSAx5_j za1hjih;T%jc#7z-s}A=3#)0xRR3lu9xC_u0n>1AHxNet%H?$P$!`r5=G^%@Bb(~ml zFI_U;k7k?Ju-^+ixEDGc?z<SBYT;3E)2HYbG9}kM15O`i3vSUqB|P()f;(fMLMHE) a-6Gly<V82<mQX%9ICDj}lr5uH+5Ha;K+Q1# literal 0 HcmV?d00001 diff --git a/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py b/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py new file mode 100644 index 0000000000..9bfb0cab4f --- /dev/null +++ b/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py @@ -0,0 +1,108 @@ +import time +t0 = time.time() +import os + +from matplotlib.patches import Ellipse +import matplotlib.pyplot as plt +from moviepy.video.io.bindings import mplfig_to_npimage +from moviepy.editor import * +import numpy as np +import collections +import pandas as pd +import sys +import re +import argparse +import logging +from ellipses import LSqEllipse +from google.cloud import storage + + +ch = logging.StreamHandler() +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +ch.setFormatter(formatter) +logger = logging.getLogger('dlc-ellipse-fitting') +logger.setLevel(logging.INFO) +logger.addHandler(ch) +logger.propagate = False + +parser = argparse.ArgumentParser() +parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") +args = parser.parse_args() + +video_file_path = args.video_input_file +ellipse_bucket_data_blobname = '{}.h5'.format(os.path.splitext(video_file_path)[0]) +source_ellipse_data_file = '/workdir/{}'.format(ellipse_bucket_data_blobname) +source_ellipse_data_file = ellipse_bucket_data_blobname + +client = storage.Client() +fit_src_bucket = client.get_bucket('dlc-ellipse-fitting') +blob = fit_src_bucket.get_blob(ellipse_bucket_data_blobname) +blob.download_to_filename(source_ellipse_data_file) + +movie_src_bucket = client.get_bucket('brain-observatory-eye-videos') +blob = movie_src_bucket.get_blob(video_file_path) +blob.download_to_filename(video_file_path) + +ellipse_output_blob_name = "{}_ellipse_output_video_file.mp4".format(os.path.splitext(video_file_path)[0]) +ellipse_output_video_file = "/workdir/{}".format(ellipse_output_blob_name) +ellipse_output_video_file = ellipse_output_blob_name + +cr = pd.read_hdf(source_ellipse_data_file, key='cr') +eye = pd.read_hdf(source_ellipse_data_file, key='eye') +pupil = pd.read_hdf(source_ellipse_data_file, key='pupil') + +def make_frame(t): + + fi = np.int(np.round(t*fps)) + + ax.clear() + ax.imshow(clip.get_frame(t)) + #that is the pupi; ellipse in red + try: + ellipse = Ellipse((cr.loc[fi]['center_x'], cr.loc[fi]['center_y']), 2*cr.loc[fi]['width'], 2*cr.loc[fi]['height'], np.rad2deg(cr.loc[fi]['phi']), alpha=0.8, ec='r', fc=None, lw=2, fill=False) + ax.add_patch(ellipse) + except Exception as e: + print(e) + #that is the eye ellipse in green + try: + ellipse = Ellipse((eye.loc[fi]['center_x'], eye.loc[fi]['center_y']), 2*eye.loc[fi]['width'], 2*eye.loc[fi]['height'], np.rad2deg(eye.loc[fi]['phi']), alpha=0.8, ec='g', fc=None, lw=2, fill=False) + ax.add_patch(ellipse) + except Exception as e: + print(e) + + #Corneal reflection in blue + try: + ellipse = Ellipse((pupil.loc[fi]['center_x'], pupil.loc[fi]['center_y']), 2*pupil.loc[fi]['width'], 2*pupil.loc[fi]['height'], np.rad2deg(pupil.loc[fi]['phi']), alpha=0.8, ec='b', fc=None, lw=2, fill=False) + ax.add_patch(ellipse) + ax.set_axis_off() + except Exception as e: + print(e) + + return mplfig_to_npimage(fig) + +initialization_time = time.time() - t0 +ellipse_video_t0 = time.time() + +fps = 30.0 +clip = VideoFileClip(video_file_path) +fig, ax = plt.subplots() +fig.set_size_inches([6.4, 4.8], forward=True) +ax.set_xlim(0, clip.size[0]) +ax.set_ylim(0, clip.size[1]) +fig.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=None, hspace=None) + +animation = VideoClip(make_frame, duration=clip.duration).resize(newsize=clip.size) + +animation.write_videofile(ellipse_output_video_file, fps=fps) +tgt_bucket = client.get_bucket('dlc-ellipse-videos') +blob2 = tgt_bucket.blob(ellipse_output_blob_name) +blob2.upload_from_filename(filename=ellipse_output_video_file) + +ellipse_video_time = time.time() - ellipse_video_t0 + +logger.info('Initialization Time: {}'.format(initialization_time)) +# logger.info('Ellipse Video Time: {}'.format(ellipse_video_time)) +logger.info('Total Walltime: {}'.format(time.time()-t0)) + + + diff --git a/brain_observatory/eye_tracking/stage_4/__pycache__/DLC_Ellipse_Video.cpython-37.pyc b/brain_observatory/eye_tracking/stage_4/__pycache__/DLC_Ellipse_Video.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08948e53c151ecfa7a396d4e214965def231739e GIT binary patch literal 3389 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 Ac>n+a literal 0 HcmV?d00001 diff --git a/brain_observatory/findlevel.py b/brain_observatory/findlevel.py new file mode 100644 index 0000000000..27a06c36c1 --- /dev/null +++ b/brain_observatory/findlevel.py @@ -0,0 +1,51 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np + + +def findlevel(inwave, threshold, direction='both'): + temp = inwave - threshold + if (direction.find("up") + 1): + crossings = np.nonzero(np.ediff1d(np.sign(temp), to_begin=0) > 0) + elif (direction.find("down") + 1): + crossings = np.nonzero(np.ediff1d(np.sign(temp), to_begin=0) < 0) + else: + crossings = np.nonzero(np.ediff1d(np.sign(temp), to_begin=0)) + + if len(crossings) == 0 or len(crossings[0]) == 0: + return None + + return crossings[0][0] diff --git a/brain_observatory/gaze_mapping/__init__.py b/brain_observatory/gaze_mapping/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/gaze_mapping/__main__.py b/brain_observatory/gaze_mapping/__main__.py new file mode 100644 index 0000000000..71d17fb946 --- /dev/null +++ b/brain_observatory/gaze_mapping/__main__.py @@ -0,0 +1,346 @@ +import logging +import sys +from pathlib import Path +from typing import Dict + +import numpy as np +import pandas as pd +from argschema import ArgSchemaParser + + +import allensdk +from allensdk.brain_observatory.argschema_utilities import ( + write_or_print_outputs +) +from allensdk.brain_observatory.gaze_mapping._schemas import ( + InputSchema, + OutputSchema +) +from allensdk.brain_observatory.gaze_mapping._gaze_mapper import ( + compute_circular_areas, + compute_elliptical_areas, + GazeMapper +) +from allensdk.brain_observatory.gaze_mapping._filter_utils import ( + post_process_areas, + post_process_cr, +) + +from allensdk.brain_observatory.sync_dataset import Dataset +import allensdk.brain_observatory.sync_utilities as su + + +def load_ellipse_fit_params(input_file: Path) -> Dict[str, pd.DataFrame]: + """Load Deep Lab Cut (DLC) ellipse fit h5 data as a dictionary of pandas + DataFrames. + + Parameters + ---------- + input_file : Path + Path to DLC .h5 file containing ellipse fits for pupil, + cr (corneal reflection), and eye. + + Returns + ------- + Dict[str, pd.DataFrame] + Dictionary where keys specify name of ellipse fit param type and values + are pandas DataFrames containing ellipse fit params. + + Raises + ------ + RuntimeError + If pupil, cr, and eye ellipse fits don't have the same number of rows. + """ + # TODO: Some ellipses.h5 files have the 'cr' key as complex type instead of + # float. For now, when loading ellipses.h5 files, always coerce to float + # but this should eventually be resolved upstream... + pupil_params = pd.read_hdf(input_file, key="pupil").astype(float) + cr_params = pd.read_hdf(input_file, key="cr").astype(float) + eye_params = pd.read_hdf(input_file, key="eye").astype(float) + + num_frames_match = ((pupil_params.shape[0] == cr_params.shape[0]) + and (cr_params.shape[0] == eye_params.shape[0])) + if not num_frames_match: + raise RuntimeError("The number of frames for ellipse fits don't " + "match when they should: " + f"pupil_params ({pupil_params.shape[0]}), " + f"cr_params ({cr_params.shape[0]}), " + f"eye_params ({eye_params.shape[0]}).") + + return {"pupil_params": pupil_params, + "cr_params": cr_params, + "eye_params": eye_params} + + +def preprocess_input_args(parser_args: dict) -> dict: + """Preprocess arguments obtained by argschema. + + 1) Converts individual coordinate/rotation fields to numpy + position/rotation arrays. + + 2) Convert all arguments in millimeters to centimeters + + Parameters + ---------- + parser_args (dict): Parsed args obtained from argschema. + + Returns + ------- + dict: Repackaged args. + """ + new_args: dict = {} + + new_args.update(load_ellipse_fit_params(parser_args["input_file"])) + + new_args["session_sync_file"] = parser_args["session_sync_file"] + new_args["output_file"] = parser_args["output_file"] + + monitor_position = np.array([parser_args["monitor_position_x_mm"], + parser_args["monitor_position_y_mm"], + parser_args["monitor_position_z_mm"]]) / 10 + new_args["monitor_position"] = monitor_position + + monitor_rotations_deg = np.array([parser_args["monitor_rotation_x_deg"], + parser_args["monitor_rotation_y_deg"], + parser_args["monitor_rotation_z_deg"]]) + new_args["monitor_rotations"] = np.radians(monitor_rotations_deg) + + camera_position = np.array([parser_args["camera_position_x_mm"], + parser_args["camera_position_y_mm"], + parser_args["camera_position_z_mm"]]) / 10 + new_args["camera_position"] = camera_position + + camera_rotations_deg = np.array([parser_args["camera_rotation_x_deg"], + parser_args["camera_rotation_y_deg"], + parser_args["camera_rotation_z_deg"]]) + new_args["camera_rotations"] = np.radians(camera_rotations_deg) + + led_position = np.array([parser_args["led_position_x_mm"], + parser_args["led_position_y_mm"], + parser_args["led_position_z_mm"]]) / 10 + new_args["led_position"] = led_position + new_args["eye_radius_cm"] = parser_args["eye_radius_cm"] + new_args["cm_per_pixel"] = parser_args["cm_per_pixel"] + + new_args["equipment"] = parser_args["equipment"] + new_args["date_of_acquisition"] = parser_args["date_of_acquisition"] + new_args["eye_video_file"] = parser_args["eye_video_file"] + return new_args + + +def run_gaze_mapping(pupil_parameters: pd.DataFrame, + cr_parameters: pd.DataFrame, + eye_parameters: pd.DataFrame, + monitor_position: np.ndarray, + monitor_rotations: np.ndarray, + camera_position: np.ndarray, + camera_rotations: np.ndarray, + led_position: np.ndarray, + eye_radius_cm: float, + cm_per_pixel: float) -> dict: + """Map gaze positions onto monitor coordinates and + calculate eye/pupil areas + + Note: Monitor and Camera positions/rotations are in their own coordinate + systems which have are different from the eye coordinate system. + + Example: Z-axis for monitor and camera are aligned with X-axis for eye + coordinate system + + Parameters + ---------- + pupil_parameters (pd.DataFrame): A table of pupil parameters with + 5 columns ("center_x", "center_y", "height", "phi", "width") + and n-row timepoints. + cr_parameters (pd.DataFrame): A table of corneal reflection params with + 5 columns ("center_x", "center_y", "height", "phi", "width") + and n-row timepoints. + eye_parameters (pd.DataFrame): A table of eye parameters with + 5 columns ("center_x", "center_y", "height", "phi", "width") + and n-row timepoints. + monitor_position (np.ndarray): An array describing monitor position + [x, y, z] + monitor_rotations (np.ndarray): An array describing monitor orientation + about [x, y, z] axes. + camera_position (np.ndarray): An array describing camera position + [x, y, z] + camera_rotations (np.ndarray): An array describing camera orientation + about [x, y, z] axes. + led_position (np.ndarray): An array describing LED position [x, y, z] + eye_radius_cm (float): Radius of eye being tracked in cm. + cm_per_pixel (float): Ratio of centimeters per pixel + + Returns + ------- + dict: A dictionary of gaze mapping outputs with + fields for: `pupil_areas` (in cm^2), `eye_areas` (in cm^2), + `pupil_on_monitor_cm`, and `pupil_on_monitor_deg`. + """ + output = {} + + gaze_mapper = GazeMapper(monitor_position=monitor_position, + monitor_rotations=monitor_rotations, + led_position=led_position, + camera_position=camera_position, + camera_rotations=camera_rotations, + eye_radius=eye_radius_cm, + cm_per_pixel=cm_per_pixel) + + pupil_params_in_cm = pupil_parameters * cm_per_pixel + raw_pupil_areas = compute_circular_areas(pupil_params_in_cm) + + eye_params_in_cm = eye_parameters * cm_per_pixel + raw_eye_areas = compute_elliptical_areas(eye_params_in_cm) + + raw_pupil_on_monitor_cm = gaze_mapper.pupil_position_on_monitor_in_cm( + cam_pupil_params=pupil_parameters[["center_x", "center_y"]].values, + cam_cr_params=cr_parameters[["center_x", "center_y"]].values + ) + + raw_pupil_on_monitor_deg = gaze_mapper.pupil_position_on_monitor_in_degrees( + pupil_pos_on_monitor_in_cm=raw_pupil_on_monitor_cm + ) + + # Make bool mask for all time indices where + # pupil_area or eye_area or pupil_on_monitor_* is np.nan + raw_nan_mask = (raw_pupil_areas.isna() + | raw_eye_areas.isna() + | np.isnan(raw_pupil_on_monitor_deg.T[0])) + raw_pupil_areas[raw_nan_mask] = np.nan + raw_eye_areas[raw_nan_mask] = np.nan + raw_pupil_on_monitor_cm[raw_nan_mask, :] = np.nan + raw_pupil_on_monitor_deg[raw_nan_mask, :] = np.nan + + output["raw_pupil_areas"] = pd.Series(raw_pupil_areas) + output["raw_eye_areas"] = pd.Series(raw_eye_areas) + output["raw_pupil_on_monitor_cm"] = pd.DataFrame(raw_pupil_on_monitor_cm, columns=["x_pos_cm", "y_pos_cm"]) + output["raw_pupil_on_monitor_deg"] = pd.DataFrame(raw_pupil_on_monitor_deg, columns=["x_pos_deg", "y_pos_deg"]) + + # Perform post processing of data + new_pupil_areas = raw_pupil_areas.copy() + new_eye_areas = raw_eye_areas.copy() + new_pupil_on_monitor_cm = raw_pupil_on_monitor_cm.copy() + new_pupil_on_monitor_deg = raw_pupil_on_monitor_deg.copy() + + new_pupil_areas = post_process_areas(new_pupil_areas.values) + new_eye_areas = post_process_areas(new_eye_areas.values) + _, filtered_pos_indices = post_process_cr(cr_parameters[["center_x", + "center_y", + "phi", + "width", + "height"]].values) + + new_nan_mask = (np.isnan(new_pupil_areas) + | np.isnan(new_eye_areas) + | filtered_pos_indices) + new_pupil_areas[new_nan_mask] = np.nan + new_eye_areas[new_nan_mask] = np.nan + new_pupil_on_monitor_cm[new_nan_mask, :] = np.nan + new_pupil_on_monitor_deg[new_nan_mask, :] = np.nan + + output["new_pupil_areas"] = pd.Series(new_pupil_areas) + output["new_eye_areas"] = pd.Series(new_eye_areas) + output["new_pupil_on_monitor_cm"] = pd.DataFrame(new_pupil_on_monitor_cm, columns=["x_pos_cm", "y_pos_cm"]) + output["new_pupil_on_monitor_deg"] = pd.DataFrame(new_pupil_on_monitor_deg, columns=["x_pos_deg", "y_pos_deg"]) + + return output + + +def write_gaze_mapping_output_to_h5(output_savepath: Path, + gaze_map_output: dict): + """Write output of gaze mapping to an h5 file. + + Args: + output_savepath (Path): Desired output save path + gaze_map_output (dict): A dictionary of gaze mapping outputs with + fields for: `pupil_areas`, `eye_areas`, `pupil_on_monitor_cm`, and + `pupil_on_monitor_deg`. + """ + + gaze_map_output["raw_eye_areas"].to_hdf(output_savepath, key="raw_eye_areas", mode="w") + gaze_map_output["raw_pupil_areas"].to_hdf(output_savepath, key="raw_pupil_areas", mode="a") + gaze_map_output["raw_pupil_on_monitor_cm"].to_hdf(output_savepath, key="raw_screen_coordinates", mode="a") + gaze_map_output["raw_pupil_on_monitor_deg"].to_hdf(output_savepath, key="raw_screen_coordinates_spherical", mode="a") + + gaze_map_output["new_eye_areas"].to_hdf(output_savepath, key="new_eye_areas", mode="a") + gaze_map_output["new_pupil_areas"].to_hdf(output_savepath, key="new_pupil_areas", mode="a") + gaze_map_output["new_pupil_on_monitor_cm"].to_hdf(output_savepath, key="new_screen_coordinates", mode="a") + gaze_map_output["new_pupil_on_monitor_deg"].to_hdf(output_savepath, key="new_screen_coordinates_spherical", mode="a") + + gaze_map_output["synced_frame_timestamps_sec"].to_hdf(output_savepath, key="synced_frame_timestamps", mode="a") + + version = pd.Series({"version": allensdk.__version__}) + version.to_hdf(output_savepath, key="version", mode="a") + + +def load_sync_file_timings(sync_file: Path, + pupil_params_rows: int, + truncate_timestamps: bool) -> pd.Series: + """Load sync file timings from .h5 file. + + Parameters + ---------- + sync_file : Path + Path to .h5 sync file. + pupil_params_rows : int + Number of rows in pupil params. + truncate_timestamps: bool + When True, sync time array gets truncated at large gaps + + Returns + ------- + pd.Series + A series of frame times. (New frame times according to synchronized + timings from DAQ) + + Raises + ------ + RuntimeError + If the number of eye tracking frames (pupil_params_rows) does not match + up with number of new frame times from the sync file. + """ + # Add synchronized frame times + frame_times = su.get_synchronized_frame_times(session_sync_file=sync_file, + sync_line_label_keys=Dataset.EYE_TRACKING_KEYS, + trim_after_spike=truncate_timestamps) + if (pupil_params_rows != len(frame_times)): + raise RuntimeError("The number of camera sync pulses in the " + f"sync file ({len(frame_times)}) do not match " + "with the number of eye tracking frames " + f"({pupil_params_rows})!!!") + return frame_times + + +def main(): + + logging.basicConfig(format=('%(asctime)s:%(funcName)s' + ':%(levelname)s:%(message)s')) + + parser = ArgSchemaParser(args=sys.argv[1:], + schema_type=InputSchema, + output_schema_type=OutputSchema) + + args = preprocess_input_args(parser.args) + + output = run_gaze_mapping(pupil_parameters=args["pupil_params"], + cr_parameters=args["cr_params"], + eye_parameters=args["eye_params"], + monitor_position=args["monitor_position"], + monitor_rotations=args["monitor_rotations"], + camera_position=args["camera_position"], + camera_rotations=args["camera_rotations"], + led_position=args["led_position"], + eye_radius_cm=args["eye_radius_cm"], + cm_per_pixel=args["cm_per_pixel"]) + + output["synced_frame_timestamps_sec"] = load_sync_file_timings(args["session_sync_file"], + args["pupil_params"].shape[0], + parser.args["truncate_timestamps"]) + + write_gaze_mapping_output_to_h5(args["output_file"], output) + module_output = {"screen_mapping_file": str(args["output_file"])} + write_or_print_outputs(module_output, parser) + + +if __name__ == "__main__": + main() diff --git a/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b4385e18103d1663ecaf619e6abd3713c930833 GIT binary patch literal 207 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG@*vJmypzI+<X=%U&+-+aC7oHh#!2v zJC6H~Tc_!Wk??+lzP@_=lu)xIhXFycJsT&x2lM^-kI!W@<A<Pq;BW+$NjL*WzCtK0 zDwuMOUEtPf3<c4;V+?$2BoC(569+{FrKW6M(}t>Y>A|3|k}h`8S|9Tgu39wUoWU{| X!k}q|$Xt95=Z#gTS}*#K-emR#gq%E; literal 0 HcmV?d00001 diff --git a/brain_observatory/gaze_mapping/__pycache__/__main__.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e29bb7d5b971033c2adfc370e963c6ddc62495bc GIT binary patch literal 9892 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 V_-E+dfuYZ?lZQ3`e*H>A|8E@-JlFsL literal 0 HcmV?d00001 diff --git a/brain_observatory/gaze_mapping/__pycache__/_filter_utils.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/_filter_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9ca25549a4a873bff6e7c8e6242057e88c9a2c3 GIT binary patch literal 3522 zcma)8&2JmW72gjozeJI;qQ-U-6w@SaOhA!qCoO72Xlu*$p=gZ2aZq5ZU@_zjr4^UE zo0+933d=(g_f+&h$U#C+z4lb}ALyayUiR8Up}(L&PyM}FawR1;5E47{=IhOSZ{GX8 z_jrB1ZQ&RH`S<)^J<Iwx4OYJzh+pE<PtXWU*pcOzz3n@qD_l`~Y5T6|iMnWjs)?p( zy|jE!Y)I#*E*oO)Ye#g%`b*Dm3i~swf8zq2tY;T4+Mz=<ehqwee0%uxU(w{&5iYxJ zEu7pI&Rf>P&FnLWX3y<KEyr5!3iqb<2M2pRtkHTc_s;EeTm3q-kG#Al>|HDFV!lrE z<@n@9)(~#)eC0f`zIeK*=T=_N-CL%;X}y-?*CofizH5CcE;*Lt-&%PMiq%dhFAhV^ zCQ^hvW}`65q+&{DQx$9WLCoV1*z8co@)*-Rp0i^fO(hFsmK{nqmMZ2En}s4fY%~18 zsXW7DVRkI}CfKcJp_a;qoi50N7ew`&g{KdBDhnr03-45_L>DgZDZEhQ^1?;q*Gn#i zr+9oI`;EdrDc0z283j5#m4*GH@Pv#q?t3QzHv9Ei7>i_9*x6q!bpsduZ?X4q|8v~0 z_xT|gI|Dw$E&GpRK1^c4KiZe^vEENo8S5e1Bt4w#{ojOxeH~`<!;}xl{6OMt6k&%L z-yJ9(#z8Uw$77x)YJT^CpUPmu(=?0^?gphHgJ~8<dMBM1T}VZ9!EmaxWa2?2{T3R_ zZQD(!V{hQ!ak}n?eaj(g(@}3=^*{Z8Zv5l#fBWw*DyJjUweT6I`#y-=&a5-~;AlkU zaJF0c&h0G=4{Y;4!q9s>8crjg$*YgT2RezSm=p3i<XM=+EEzG*rg3=86=tx)Gp=Q} z(>AaBDOY?V;UL-!KdgRc$k{^{PbcYo2L@G&&&@1(#b<nyMkTWyGYOmPP-ik8&I6(| z9%nc`iV~hxr}kD0S;8iKT#Ek5qbHECI-fDAvv5K$K(dohrb$YgLYs;c@rOv_ilTS! z?R@;R`#)tP9ONuc)C7JkAd?CQc(f$$FLi!ihJxX>)Ys70W&NZKpI2Lyq#{F>y7yg0 zpi#8o*-O86ajx$aHutwG&8}F+IB?l)(#hN9v0!yuP`w}dgEsKAp>Ba5QjF1$LZE`G z9J85q1W!3~2(E<lwzWmz<p_5*TG*MJ+h5s$GDp<Lj(VEa&O8A~vdPQpIs9wkfNBs0 zU~{&tn*cn+r3QEd+<{-+0G)Nz%xgKoZ(Q4@o13{;jame8qVXqZQO{brx1<~3+{U+- z*U6Iwacov|jcTrixemavd7B`XPIU4{-ZG;#jMl5Qjv1}i){PW(%yqG&P4NO9I$KsH zAxY2$ueIgc`fBa0M>1ixmqU)n)}mYT%DYS58YOkM0nUvB=iEMW7QMW?*vNbN#>hcT zHu>jxB!j!NFp2=TX~c(;eK{p>PGUYlv>2e(E3e*r&Q5^8g3aOJz$6ORS-3=91G!6o zrFgs7X9xu)^<feTCZi}!wPajL&IWV#;6ZlCQmKYA20AV0ueyE}H}}D(^tDxDm};OK zD>3Z)Qg!Gf98z+U9ACi|%|<GjP<+9^voM|}Q_YTm6}ki#68Z(Aq|6;l&7*KEqd6G| znm|?tv>i^B6m0Lg-ey{Y7owVWj3PNClj!YAjEPhLY-1w>3$NO~%@F;^p`I>dKT(DW z6UcB`Qn8}=ogqmg<In*i0UCfDx^MM7axT9ML=IJu5{By6A?2NCCqL=qrGTEqI-RCr z#LN)`yX<!-+iboKM>vQix|2}fE4%w&l<1-;`jw03f~p{sZciV-9-fe}f4n_HTBCOz zAk9H>_HDe}QN*opt99yblnCaeq3Y5l1T{q?N)8UdrD)8!ib42wAe_#G`X23}YR#my z!b3fwWYG-uD2$O^{n|t#$-A`mP1;52&95Iris86_!*5kqD{AD!g$ukZT9t$Q&69w9 zSt`GYbW&2C)to5@I;(jzT1Sn*^%yzYT)#fQHbk+(<KTpf4)k;1gIpMzZtnLaf=;Rc zs+m(zQqF>*@_Pd=f;0)^Oq+#of_4vKn+2&#hEi)BxCbTm$7rn0cipDlwA)VG-o)2- zyLQ*@pa$5ow`!mr8oy(|gE3Z}4X5U)cX94whz4oHBcte|yA0`|G)z@6(8E>Gzl{N) z3($`i1;aVu9{}zE=B?Zr*HE!qM*#8M-9<t$<pW2ycv_Z)r8^=7;O-@yP+B8QDG`i( zD4Awahzg;MJecXb#D&oSF_C_&bhz^jxCcCYgpi<!xC&-K6_Uj~h!F`RBch4i>*jcf zlJ&B*`1BI};O><tF`n(PCvwE6QAVZgg9oMXud4xGUG4m8F7K9>GHR8EsLZm&dU0tV z0>6IEgp}XD#AQXv+=LAl-zWNq)cgRA-&?W^Q00bjsBb#k<~3(CVkn%`O*B^TP4YHd z{RlK7ng9dcR@uErT}!=<&i9OdMlch(CeDrP`Hf|XSGX{%;dDg=DmIj<RGPb!L`)<3 TbE-o$K>$46ZQpLc(R}oOgj3T^ literal 0 HcmV?d00001 diff --git a/brain_observatory/gaze_mapping/__pycache__/_gaze_mapper.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/_gaze_mapper.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98e9fbbdc61c4eef320a243f6a2947fcf7f4e56f GIT binary patch literal 13557 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 MWm|jQLdE5O04U}UtN;K2 literal 0 HcmV?d00001 diff --git a/brain_observatory/gaze_mapping/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c91454ba87893f5900c7890e2b491ce664c3985 GIT binary patch literal 3276 zcmb_fOOG5i5bmD$bF-U$<h4m0gvbtr2@)U>k0hIrMUj>b$_6QEjnsJBo}MP|N9^v| zOy5wDIC0{@kprh(IPwqp6D@J##2?_miE{P!Y_dB+T41EMK9}usxm;hl=4Q9sGT;~d z^fmo?)i8e7o#Iyka05Q|B{a-nrZ9ZdGEI$3qU4vYvR|<(e$}e_HLK>=tvZgCMZ<4e zO}}Ne{I=CLjZY0$VbyO8R^{f?vekipjn$!F=WXbBS!37eHUEHJjGmb_H>JDljJZ#H z)vUTDLK<g{?a<xk6E3paZY;gP&FVM9P;eS#wH>Zv&U)pnc_)aHc*_$!Yu!!a0(b9G zPr;I0r=xc%ezOz4ZyE+SERz{liI<tlO04`{$*Lf(Ag=Nn$g7C!yaBj|xQV!qxP`cZ zxQ)1pxP!QbxQn=rcmZ(-@d?CT#EXa*5HBG<f%qiiMa0X9mk_TYK8bi0@iO8y#4CtT z@zY@QD&jMU*ASn@GoC_x4(6X`XV_Ud`#RurY#s4=eu1557Z6|M1oT`)e2Edbxl36a zJ)b-He!9IGkny`@1Q$V^Fo>xafcps-!iyAFFc3o%O2Vi73W<`)6ITcg7)+J{r-Dd6 z65NTsFi`zoDQignIPoNBS(|a?NH5YushGb_?D-H7)Q=R2L!zdEGnQfCrCe`EVo9Ax z+M0>Sct}Q)!fdkV#bel2#UvaN9*w7pfT0R@ArN#ytorHgtwac-=!BDq!fcorVvNm> z8jooVnqbxt&Mi5Gs3gNFiN~HIe#jER`{|9(z?K-!?toe@$paFF%G2i|UO+CpA{<h2 z89Wh6<^`ZakqsYo!l7Wg>K)ba@IPy?j;-N*af$~-hA}P7XWW&Xt8_N}@SlgRxx?3P z!JSC@Z#|SAT7O*s9A1B1@1*Pd_RsfCF*@Hh#pry`yt94#lVe9rimQ(81zdIPvv1|u zndCejBJF{@kq^-hl!}vxBnoH&%%l#IdJZdrZR?wQbe|XuXrNh56sG=ux`A9o8iFE8 z_fW|`qjlEVc)d?2Ua#-I@#hb}egEyR*VB!AlzEBLw8azvHb6SqP(4jM&Bc9!>3maX zd_)rw%PzbV?vL-SK6~qz&#$Mi-I`4!5l}bso^YWP+yscJ2`n`c`dQ`9&eq-Z)m<I~ z^*Irt>uNs;{e0p6AS}|s{W~LaUnY<SW0?dF927Gac`k|Vjd=h|B}sxrB~*wh5mdUI zxHN+75IRmGKO~>zCV#Az?et#B8nzt(jchw>*>=7g;EruS1{L{;Y{2oXmZu+0TPJI4 zX+P=NI%}dxHuao#p6PN)SxZ*^JdN2!_OhSYzCTAioi9$cc&$)U<PcB-DP)d(`Vx7H z@)ZXY#vxmdNYRudQnX}sU&A3oj)-$Rj)-$JmIP;qY<N+G2D~WJyUVKfXj8v&$P;T> z2fQ7QY@|p|0&4-n)y5Fd@2ac&5`)@ye5>R5HUy=OK`C`zlQkjoY>YZt(>p8|A!Z*$ z*E2(|z!)}vJ-PM4;0p!8JfLIB`a`-$gXv&1pb+DXzCGZ<L=D1-2g-pq)X(H#+ZztR zLjGn1?<#dUtQ7)gut!&i5*~g#9D>FPg(q)%)uk!7eHul;hpV>28c+43sceG{`cq#) z(<qh9lG&(WTg`FBY?Pn-Ou)tWGI<H+JpbwWl^12W@BD(0fFTD3A+J0&t-Jut3&T3A zK;cu(I(eO0R6hStk<cs24s4I<XQ$VYi@LL<o0Gb!>qdLaTFki{QC-F8@*t<{GSo<% z2Zg6|+Rm;yzi_Da4Y>x53!l>Q(a<g}p=_tOU^OAf<ToTsFlsH%`u&l|1yfQd0*o{a zV2m-e&FU8+&_5Ca{h1a!i9G>@4_BCn&~mB&i{R1FjDyfTusLgdlxMSRP_Y|Ir?8H> KURtRy4*mw?f&z;G literal 0 HcmV?d00001 diff --git a/brain_observatory/gaze_mapping/_filter_utils.py b/brain_observatory/gaze_mapping/_filter_utils.py new file mode 100644 index 0000000000..669d410015 --- /dev/null +++ b/brain_observatory/gaze_mapping/_filter_utils.py @@ -0,0 +1,132 @@ +import logging +import numpy as np + + +def medfilt_custom(x, kernel_size=3): + '''This median filter returns 'nan' whenever any value in the kernal width + is 'nan' and the median otherwise''' + T = x.shape[0] + delta = kernel_size // 2 + + x_med = np.zeros(x.shape) + window = x[0:delta + 1] + if np.any(np.isnan(window)): + x_med[0] = np.nan + else: + x_med[0] = np.median(window) + + # print window + for t in range(1, T): + window = x[t - delta:t + delta + 1] + # print window + if np.any(np.isnan(window)): + x_med[t] = np.nan + else: + x_med[t] = np.median(window) + + return x_med + + +def median_absolute_deviation(a, consistency_constant=1.4826): + '''Calculate the median absolute deviation of a univariate dataset. + + Parameters + ---------- + a : numpy.ndarray + Sample data. + consistency_constant : float + Constant to make the MAD a consistent estimator of the population + standard deviation (1.4826 for a normal distribution). + + Returns + ------- + float + Median absolute deviation of the data. + ''' + return consistency_constant * np.nanmedian(np.abs(a - np.nanmedian(a))) + + +def post_process_cr(cr_params): + """This will replace questionable values of the CR x and y position with + 'nan'. + + 1) threshold ellipse area by 99th percentile area distribution + 2) median filter using custom median filter + 3) remove deviations from discontinuous jumps + + The 'nan' values likely represent obscured CRs, secondary reflections, + merges with the secondary reflection, or visual distortions due to + the whisker or deformations of the eye + + Parameters + ---------- + cr_params: numpy.ndarray + (Nx5) array of pupil parameters [x, y, angle, axis1, axis2]. + """ + + area = np.pi * (cr_params.T[3] / 2) * (cr_params.T[4] / 2) + + # compute a threshold on the area of the cr ellipse + dev = median_absolute_deviation(area) + if dev == 0: + logging.warning("Median absolute deviation is 0," + "falling back to standard deviation.") + dev = np.nanstd(area) + threshold = np.nanmedian(area) + 3 * dev + + x_center = cr_params.T[0] + y_center = cr_params.T[1] + + # set x,y where area is over threshold to nan + x_center[area > threshold] = np.nan + y_center[area > threshold] = np.nan + + # median filter + x_center_med = medfilt_custom(x_center, kernel_size=3) + y_center_med = medfilt_custom(y_center, kernel_size=3) + + x_mask_finite = np.where(np.isfinite(x_center_med))[0] + y_mask_finite = np.where(np.isfinite(y_center_med))[0] + + # if y increases discontinuously or x decreases discontinuously, + # that is probably a CR secondary reflection + mean_x = np.mean(x_center_med[x_mask_finite]) + mean_y = np.mean(y_center_med[y_mask_finite]) + + std_x = np.std(x_center_med[x_mask_finite]) + std_y = np.std(y_center_med[y_mask_finite]) + + # set these extreme values to nan + x_center_med[np.abs(x_center_med - mean_x) > 3*std_x] = np.nan + y_center_med[np.abs(y_center_med - mean_y) > 3*std_y] = np.nan + + either_nan_mask = np.isnan(x_center_med) | np.isnan(y_center_med) + x_center_med[either_nan_mask] = np.nan + y_center_med[either_nan_mask] = np.nan + + new_cr = np.vstack([x_center_med, y_center_med]).T + + bad_points_mask = either_nan_mask + + return new_cr, bad_points_mask + + +def post_process_areas(areas: np.ndarray, percent_thresh: int = 99): + '''Filter pupil or eye area data by replacing outliers with nan + + Parameters + ---------- + areas: np.ndarray + (N x 1) Arra of ellipse areas for either eye or pupil + percent_thresh: int + Percentile to threshold at. Default is 99 + + Returns + ------- + numpy.ndarray + Eye/pupil areas with outliers replaced with nan + ''' + threshold = np.percentile(areas[np.isfinite(areas)], percent_thresh) + outlier_indices = areas > threshold + areas[outlier_indices] = np.nan + return areas diff --git a/brain_observatory/gaze_mapping/_gaze_mapper.py b/brain_observatory/gaze_mapping/_gaze_mapper.py new file mode 100644 index 0000000000..39c0b8f1a7 --- /dev/null +++ b/brain_observatory/gaze_mapping/_gaze_mapper.py @@ -0,0 +1,403 @@ +import numpy as np +import pandas as pd + +from scipy.spatial.transform import Rotation + + +class EyeTrackingRigObject(object): + """Class encompassing coordinate transforms on objects in the + eye tracking rig (camera, monitor). + + Parameters + ---------- + position_in_eye_coord_frame : numpy.ndarray + [x, y, z] position of the rig object in the eye coordinate system + rotations_in_self_coord_frame: numpy.ndarray + [x, y, z] rotations about the x, then y, then z axes to be applied + in the rig object's own coordinate system + + """ + def __init__(self, + position_in_eye_coord_frame: np.ndarray, + rotations_in_self_coord_frame: np.ndarray): + self.position = position_in_eye_coord_frame + self.rotations = rotations_in_self_coord_frame + + def generate_rotations_xform(self) -> Rotation: + return generate_object_rotation_xform(*self.rotations) + + def compute_unit_normal_in_eye_coord_frame(self) -> np.ndarray: + """Compute unit normal to the object XY plane in eye coordinates.""" + self_to_eye_frame_xform = self.generate_self_to_eye_frame_xform() + return self_to_eye_frame_xform.apply(self._compute_unit_normal()) + + def _compute_unit_normal(self) -> np.ndarray: + """Compute the unit normal vector for the object + (after its orientation rotations have been applied). + """ + # By convention Z-axis is the normal axis for both camera and monitor + # rig imaging/screen planes + unit_normal = [0, 0, 1] + + rotation_xform = self.generate_rotations_xform() + return rotation_xform.apply(unit_normal) + + def generate_self_to_eye_frame_xform(self) -> Rotation: + """Generate rotation matrix to transform base object coordinate frame + to eye coordinate frame. + + By convention, any other object's coordinate frame before rotations + is set with positive Z pointing from the object's position back + to the origin of the eye coordinate system, with X parallel to the + eye X-Y plane. + + Returns + ------- + scipy.spatial.transform.Rotation + A Rotation instance which will transform from an object's + coordinate system (CCS/MCS) to the eye coordinate system (ECS) + """ + # Determine unit normal vector representing +Z axis of CCS/MCS + # in terms of ECS + obj_norm = -(self.position / np.linalg.norm(self.position)) + + # Determine rotation in ECS needed to rotate obj_norm vector so that + # its x-axis aligns with the ECS x-axis. + theta_z = -(np.pi / 2 + np.arctan2(obj_norm[1], obj_norm[0])) + rz = Rotation.from_euler('z', theta_z, degrees=False) + obj_norm_prime = rz.apply(obj_norm) + + # Determine rotation in ECS needed to rotate transformed obj_norm + # vector so that its z-axis aligns with the ECS z-axis + theta_x = np.pi / 2 - np.arctan2(obj_norm_prime[2], obj_norm_prime[1]) + rx = Rotation.from_euler('x', theta_x, degrees=False) + + # Compose rotations, note the order! + eye_to_object_xform = rx * rz + return eye_to_object_xform.inv() + + +class GazeMapper(object): + """Class for performing eye-tracking gaze mapping. + + Provides methods for estimating the position of the pupil in + 3D space and map the gaze onto the monitor in both + 3D space and monitor space given the experimental geometry. + + Parameters + ---------- + monitor_position : numpy.ndarray + [x,y,z] position of monitor in cm. + monitor_rotations : numpy.ndarray + [x,y,z] rotations of monitor in radians. + led_position : numpy.ndarray + [x,y,z] position of LED in cm. + camera_position : numpy.ndarray + [x,y,z] position of camera in cm. + camera_rotations : numpy.ndarray + [x,y,z] rotations for camera in radians. X and Y must be 0. + eye_radius : float + Radius of the eye in cm. + cm_per_pixel : float + Pixel size of eye-tracking camera. + """ + def __init__(self, + monitor_position: np.ndarray, + monitor_rotations: np.ndarray, + led_position: np.ndarray, + camera_position: np.ndarray, + camera_rotations: np.ndarray, + eye_radius: float, + cm_per_pixel: float): + self.eye_radius = eye_radius + self.cm_per_pixel = cm_per_pixel + self.led_pos = led_position + self.monitor = EyeTrackingRigObject(position_in_eye_coord_frame=monitor_position, + rotations_in_self_coord_frame=monitor_rotations) + self.camera = EyeTrackingRigObject(position_in_eye_coord_frame=camera_position, + rotations_in_self_coord_frame=camera_rotations) + self.cr = self.compute_cr_coordinate() + + def compute_cr_coordinate(self) -> np.ndarray: + """Determine the 3D position of the corneal reflection (cr). + + Model the eye as a spherical mirror, so use the mirror + equation to determine where the virtual image of the led would + appear to be coming from if looking at the eye (like the camera is). + + Definitions: + - focal length: + radius_of_curvature/2 + - mirror equations: + 1/focal_length = 1/object_distance + 1/image_distance + magnification = image_height/object_height + = -image_distance/object_distance + + Conventions: + - Center of right eye is considered origin (x=0, y=0, z=0) + - To use mirror equation (object_distance, image_distance) variables + need to be offset so that the mirror pole is considered origin + (x=0, y=0, z=0). + - Focal length is negative for convex mirrors + - Objects in front of mirror have positive distance + - Objects behind mirror (virtual image) have negative distance + + Returns + ------- + numpy.ndarray + [x,y,z] location of the corneal reflection in eye coordinates (cm). + """ + focal_len = -(self.eye_radius / 2) + # In system conventions, Z gives the 'height' of our LED (object) + object_height = self.led_pos[-1] + # Object distance from the mirror pole is the euclidean norm of our + # x and y coordinate components minus the eye_radius. + object_dist = np.linalg.norm(self.led_pos[:2]) - self.eye_radius + # Alternate form of mirror equation + image_dist = (object_dist * focal_len) / (object_dist - focal_len) + # Undo mirror pole offset + image_dist_from_origin = self.eye_radius + image_dist + image_height = -(image_dist / object_dist) * object_height + image_dist_from_origin_mag = np.linalg.norm([image_height, + image_dist_from_origin]) + # To get full 3D position of virtual image we multiply the LED unit + # position vector with magnitude of the image distance from origin. + led_unit_position_vec = (self.led_pos / np.linalg.norm(self.led_pos)) + return led_unit_position_vec * image_dist_from_origin_mag + + def pupil_pos_in_eye_coords(self, + cam_pupil_params: np.ndarray, + cam_cr_params: np.ndarray) -> np.ndarray: + """Compute the 3D pupil position in eye coordinates. + + Parameters + ---------- + cam_pupil_params : numpy.ndarray + [nx2] Array of pupil parameters (x, y) for each eye tracking frame. + cam_cr_params : numpy.ndarray + [nx2] Array of corneal reflection parameters (x, y) for each eye + tracking frame. + + Returns + ------- + numpy.ndarray + Pupil position estimates in eye coordinates (in centimeters). + """ + # x, y are in camera image coordinates + # x increases towards the right of image + # y increases towards the bottom of image + pupil_cr_delta = (cam_pupil_params - cam_cr_params) * self.cm_per_pixel + delta_px = pupil_cr_delta.T[0] + delta_py = pupil_cr_delta.T[1] + + R_eye_to_cam = self.camera.generate_self_to_eye_frame_xform().inv() + R_cam = self.camera.generate_rotations_xform() + + cr_pos_in_cam_coord_frame = R_cam.apply(R_eye_to_cam.apply(self.cr)) + px_cam = cr_pos_in_cam_coord_frame[0] + delta_px + py_cam = cr_pos_in_cam_coord_frame[1] + delta_py + # np.sqrt(np.array([-5, 25])) will result in np.array([np.nan, 5.]) + # and an 'invalid' value RuntimeWarning which is fine + with np.errstate(invalid='ignore'): + pz_cam = np.sqrt(self.eye_radius**2 - px_cam**2 - py_cam**2) + + # Find and assign np.nan to pupil positions which land outside of eyeball radius. + # An operation like: np.array([np.nan, 5, 1]) > 2 will result in array([False, True, False]) + # and an 'invalid' value RuntimeWarning which is fine + with np.errstate(invalid='ignore'): + bad_idx = np.linalg.norm([px_cam, py_cam], axis=0) > self.eye_radius + px_cam[bad_idx] = np.nan + py_cam[bad_idx] = np.nan + pz_cam[bad_idx] = np.nan + + # Create [nx3] pupil position (x, y, z) estimates + pupil_pos_cam = np.vstack([px_cam, py_cam, pz_cam]).T + + # Undo 'cam rotation' and 'eye to cam rotation' to get + # pupil positions in eye coordinates (in centimeters) + cam_to_eye_xform = R_eye_to_cam.inv() * R_cam.inv() + return cam_to_eye_xform.apply(pupil_pos_cam) + + def pupil_position_on_monitor_in_cm(self, + cam_pupil_params: np.ndarray, + cam_cr_params: np.ndarray) -> np.ndarray: + """Compute the pupil position on the monitor in cm. + + General strategy: + 1) Figure out the positions of pupil center in eye coordinates + Using pre-calculated (compute_cr_coordinate) corneal reflection + virtual image location as a reference point. + + 2) Project a ray from origin through an estimated pupil position + and determine the point (in eye coordinate system) at which it + intersects a plane representing the monitor + + 3) Convert the intersection point into the monitor coordinate system + + Parameters + ---------- + cam_pupil_params : numpy.ndarray + [nx2] Array of pupil parameters (x, y) for each eye tracking frame. + cam_cr_params : numpy.ndarray + [nx2] Array of corneal reflection parameters (x, y) for each eye + tracking frame. + + Returns + ------- + numpy.ndarray + [nx2] Pupil position estimates (x, y) for each frame in eye + coordinates (in centimeters). Estimate values will have the + center of the monitor as the (0, 0) origin. + """ + pupil_positions = self.pupil_pos_in_eye_coords(cam_pupil_params, + cam_cr_params) + + monitor_normal = self.monitor.compute_unit_normal_in_eye_coord_frame() + # Project pupil locations from origin of eye coordinate system + line_points = np.tile([0, 0, 0], (pupil_positions.shape[0], 1)) + projected_positions = project_to_plane(plane_normal=monitor_normal, + plane_point=self.monitor.position, + line_vectors=pupil_positions, + line_points=line_points) + + monitor_positions = projected_positions - self.monitor.position + + R_monitor = self.monitor.generate_rotations_xform() + R_monitor_to_eye = self.monitor.generate_self_to_eye_frame_xform() + eye_to_monitor_xform = R_monitor.inv() * R_monitor_to_eye.inv() + result = eye_to_monitor_xform.apply(monitor_positions) + + # Discard z component of monitor locs as it's orthogonal to viewing plane + return np.delete(result, 2, axis=1) + + def pupil_position_on_monitor_in_degrees(self, + pupil_pos_on_monitor_in_cm: np.ndarray) -> np.ndarray: + """Get pupil position on monitor measured in visual degrees. + + Parameters + ---------- + pupil_pos_on_monitor_in_cm : numpy.ndarray + [nx2] Array of pupil positions mapped to monitor coordinates (x, y) + + Returns + ------- + numpy.ndarray + [nx2] Pupil position estimate (x, y) in visual degrees. + """ + x = pupil_pos_on_monitor_in_cm.T[0] + y = pupil_pos_on_monitor_in_cm.T[1] + + mag = np.linalg.norm(self.monitor.position) + meridian = np.degrees(np.arctan(x / mag)) + elevation = np.degrees(np.arctan(y / np.linalg.norm([x, mag], axis=0))) + + angles = np.vstack([meridian, elevation]).T + + return angles + + +def compute_circular_areas(ellipse_params: pd.DataFrame) -> pd.Series: + """Compute circular area of a pupil using half-major axis. + + Assume the pupil is a circle, and that as it moves off-axis + with the camera, the observed ellipse semi-major axis remains the + radius of the circle. + + Parameters + ---------- + ellipse_params (pandas.DataFrame): A table of pupil parameters consisting + of 5 columns: ("center_x", "center_y", "height", "phi", "width") + and n-row timepoints. + + NOTE: For ellipse_params produced by the Deep Lab Cut pipeline, + "width" and "height" columns, in fact, refer to the + "half-width" and "half-height". + + Returns + ------- + pandas.Series: A series of pupil areas for n-timepoints. + """ + # Take the biggest value between height and width columns and + # assume that it is the pupil circle radius. + radii = ellipse_params[["height", "width"]].max(axis=1) + return np.pi * radii * radii + + +def compute_elliptical_areas(ellipse_params: pd.DataFrame) -> pd.Series: + """Compute the elliptical area using elliptical fit parameters. + + Parameters + ---------- + ellipse_params (pandas.DataFrame): A table of pupil parameters consisting + of 5 columns: ("center_x", "center_y", "height", "phi", "width") + and n-row timepoints. + + NOTE: For ellipse_params produced by the Deep Lab Cut pipeline, + "width" and "height" columns, in fact, refer to the + "half-width" and "half-height". + + Returns + ------- + pd.Series + pandas.Series: A series of areas for n-timepoints. + """ + return np.pi * ellipse_params["height"] * ellipse_params["width"] + + +def project_to_plane(plane_normal: np.ndarray, + plane_point: np.ndarray, + line_vectors: np.ndarray, + line_points: np.ndarray) -> np.ndarray: + """Find the points of intersection between a plane and a series of lines. + + See: https://en.wikipedia.org/wiki/Line–plane_intersection + + Parameters + ---------- + plane_normal : numpy.ndarray + [x, y, z] normal vector for the plane. + plane_point : numpy.ndarray + [x, y, z] A point on the plane. + line_vectors : numpy.ndarray + [nx3] A sequence of 'n' vectors (x, y, z) each representing a line. + line_points : numpy.ndarray + [nx3] A sequence of 'n' (x, y, z) values which specify a point on the + corresponding 'n'th line vector. + + Returns + ------- + numpy.ndarray + [nx3] A sequence of 'n' (x, y, z) coordinates which represent the + point of intersection between the plane and the 'n'th line vector. + """ + factors = np.dot((plane_point - line_points), plane_normal) / np.dot(line_vectors, plane_normal) + factors = factors.reshape(-1, 1) + + return factors * line_vectors + line_points + + +def generate_object_rotation_xform(x_rotation: float, + y_rotation: float, + z_rotation: float) -> Rotation: + """Generate a matrix for rotating an object in place. + + Parameters + ---------- + x_rotation : float + Rotation about x axis in radians. + y_rotation : float + Rotation about y' axis in radians. + z_rotation : float + Rotation about z'' axis in radians. + + ------- + Rotation (scipy.spatial.transform.Rotation) + A rotation instance. See: + https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html + """ + rx = Rotation.from_euler('x', x_rotation, degrees=False) + ry = Rotation.from_euler('y', y_rotation, degrees=False) + rz = Rotation.from_euler('z', z_rotation, degrees=False) + + # Compose rotations with * operator. Note the order! + return rz * ry * rx diff --git a/brain_observatory/gaze_mapping/_schemas.py b/brain_observatory/gaze_mapping/_schemas.py new file mode 100644 index 0000000000..67829c7bb0 --- /dev/null +++ b/brain_observatory/gaze_mapping/_schemas.py @@ -0,0 +1,109 @@ +from argschema import ArgSchema +from argschema.fields import Float, LogLevel, String, Boolean, Nested + +from allensdk.brain_observatory.argschema_utilities import ( + InputFile, + OutputFile, + RaisingSchema +) + + +class InputSchema(ArgSchema): + # ============== Required fields ============== + input_file = InputFile( + required=True, + description=('An h5 file containing ellipses fits for ' + 'eye, pupil, and corneal reflections.') + ) + + session_sync_file = InputFile( + required=True, + description=('An h5 file containing timestamps to synchronize ' + 'eye tracking video frames with rest of ephys ' + 'session events.') + ) + + output_file = OutputFile( + required=True, + description=('Full save path of output h5 file that ' + 'will be created by this module.') + ) + + monitor_position_x_mm = Float(required=True, + description=("Monitor center X position in " + "'global' coordinates " + "(millimeters).")) + monitor_position_y_mm = Float(required=True, + description=("Monitor center Y position in " + "'global' coordinates " + "(millimeters).")) + monitor_position_z_mm = Float(required=True, + description=("Monitor center Z position in " + "'global' coordinates " + "(millimeters).")) + monitor_rotation_x_deg = Float(required=True, + description="Monitor X rotation in degrees") + monitor_rotation_y_deg = Float(required=True, + description="Monitor Y rotation in degrees") + monitor_rotation_z_deg = Float(required=True, + description="Monitor Z rotation in degrees") + camera_position_x_mm = Float(required=True, + description=("Camera center X position in " + "'global' coordinates " + "(millimeters)")) + camera_position_y_mm = Float(required=True, + description=("Camera center Y position in " + "'global' coordinates " + "(millimeters)")) + camera_position_z_mm = Float(required=True, + description=("Camera center Z position in " + "'global' coordinates " + "(millimeters)")) + camera_rotation_x_deg = Float(required=True, + description="Camera X rotation in degrees") + camera_rotation_y_deg = Float(required=True, + description="Camera Y rotation in degrees") + camera_rotation_z_deg = Float(required=True, + description="Camera Z rotation in degrees") + led_position_x_mm = Float(required=True, + description=("LED X position in 'global' " + "coordinates (millimeters)")) + led_position_y_mm = Float(required=True, + description=("LED Y position in 'global' " + "coordinates (millimeters)")) + led_position_z_mm = Float(required=True, + description=("LED Z position in 'global' " + "coordinates (millimeters)")) + equipment = String(required=True, + description=('String describing equipment setup used ' + 'to acquire eye tracking videos.')) + date_of_acquisition = String(required=True, + description='Acquisition datetime string.') + eye_video_file = InputFile(required=True, + description=('Full path to raw eye video ' + 'file (*.avi).')) + + # ============== Optional fields ============== + eye_radius_cm = Float(default=0.1682, + description=('Radius of tracked eye(s) in ' + 'centimeters.')) + cm_per_pixel = Float(default=(10.2 / 10000.0), + description=('Centimeter per pixel conversion ' + 'ratio.')) + log_level = LogLevel(default='INFO', + description='Set the logging level of the module.') + + truncate_timestamps = Boolean(default=True, + description=('If True, truncate sync ' + 'timestamps whenever unusually ' + 'large gapes occur; ' + 'Default=True')) + + +class OutputSchema(RaisingSchema): + input_parameters = Nested(InputSchema) + screen_mapping_file = OutputFile(required=True, + description=( + 'Full save path of output h5 ' + 'file that will be created ' + 'by this module.')) diff --git a/brain_observatory/locally_sparse_noise.py b/brain_observatory/locally_sparse_noise.py new file mode 100644 index 0000000000..7158addeaf --- /dev/null +++ b/brain_observatory/locally_sparse_noise.py @@ -0,0 +1,476 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +import allensdk.brain_observatory.stimulus_info as stimulus_info +import h5py +import numpy as np +import pandas as pd +import scipy.ndimage +from .receptive_field_analysis.receptive_field import compute_receptive_field_with_postprocessing +from .receptive_field_analysis.visualization import plot_receptive_field_data + +from . import circle_plots as cplots +from . import observatory_plots as oplots +from .brain_observatory_exceptions import MissingStimulusException +from .stimulus_analysis import StimulusAnalysis +from .receptive_field_analysis.tools import dict_generator, read_h5_group +from scipy.stats.mstats import zscore + +import matplotlib.pyplot as plt + +class LocallySparseNoise(StimulusAnalysis): + """ Perform tuning analysis specific to the locally sparse noise stimulus. + + Parameters + ---------- + data_set: BrainObservatoryNwbDataSet object + + stimulus: string + Name of locally sparse noise stimulus. See brain_observatory.stimulus_info. + + nrows: int + Number of rows in the stimulus template + + ncol: int + Number of columns in the stimulus template + """ + + LSN_ON = 255 + LSN_OFF = 0 + LSN_GREY = 127 + LSN_OFF_SCREEN = 64 + + def __init__(self, data_set, stimulus=None, **kwargs): + super(LocallySparseNoise, self).__init__(data_set, **kwargs) + if stimulus is None: + self.stimulus = stimulus_info.LOCALLY_SPARSE_NOISE + else: + self.stimulus = stimulus + + try: + lsn_dims = stimulus_info.LOCALLY_SPARSE_NOISE_DIMENSIONS[self.stimulus] + except KeyError as e: + raise KeyError("Unknown stimulus name: %s" % self.stimulus) + + self.nrows = lsn_dims[0] + self.ncols = lsn_dims[1] + + self._LSN = LocallySparseNoise._PRELOAD + self._LSN_mask = LocallySparseNoise._PRELOAD + self._sweeplength = LocallySparseNoise._PRELOAD + self._interlength = LocallySparseNoise._PRELOAD + self._extralength = LocallySparseNoise._PRELOAD + self._mean_response = LocallySparseNoise._PRELOAD + self._receptive_field = LocallySparseNoise._PRELOAD + self._cell_index_receptive_field_analysis_data = LocallySparseNoise._PRELOAD + + @property + def LSN(self): + if self._LSN is LocallySparseNoise._PRELOAD: + self.populate_stimulus_table() + + return self._LSN + + @property + def LSN_mask(self): + if self._LSN_mask is LocallySparseNoise._PRELOAD: + self.populate_stimulus_table() + + return self._LSN_mask + + @property + def sweeplength(self): + if self._sweeplength is LocallySparseNoise._PRELOAD: + self.populate_stimulus_table() + + return self._sweeplength + + @property + def interlength(self): + if self._interlength is LocallySparseNoise._PRELOAD: + self.populate_stimulus_table() + + return self._interlength + + @property + def extralength(self): + if self._extralength is LocallySparseNoise._PRELOAD: + self.populate_stimulus_table() + + return self._extralength + + @property + def receptive_field(self): + if self._receptive_field is LocallySparseNoise._PRELOAD: + self._receptive_field = self.get_receptive_field() + + return self._receptive_field + + @property + def cell_index_receptive_field_analysis_data(self): + if self._cell_index_receptive_field_analysis_data is LocallySparseNoise._PRELOAD: + self._cell_index_receptive_field_analysis_data = self.get_receptive_field_analysis_data() + + return self._cell_index_receptive_field_analysis_data + + @property + def mean_response(self): + if self._mean_response is LocallySparseNoise._PRELOAD: + self._mean_response = self.get_mean_response() + + return self._mean_response + + + def get_peak(self): + LocallySparseNoise._log.info('Calculating peak response properties') + + peak = pd.DataFrame(index=range(self.numbercells), columns=('rf_center_on_x_lsn', 'rf_center_on_y_lsn', + 'rf_center_off_x_lsn', 'rf_center_off_y_lsn', + 'rf_area_on_lsn', 'rf_area_off_lsn', + 'rf_distance_lsn', 'rf_overlap_index_lsn', + 'rf_chi2_lsn', + 'cell_specimen_id')) + csids = self.data_set.get_cell_specimen_ids() + + df = self.get_receptive_field_attribute_df() + peak.cell_specimen_id = csids + + for nc in range(self.numbercells): + peak['rf_chi2_lsn'].iloc[nc] = df['chi_squared_analysis/min_p'].iloc[nc] + + # find the index of the largest on subunit, if it exists + on_i = None + if 'on/gaussian_fit/area' in df.columns: + area_on = df['on/gaussian_fit/area'].iloc[nc] + + # watch out for NaNs and Nones + if isinstance(area_on, np.ndarray): + area_on[np.equal(area_on, None)] = np.nan + if not np.all(np.isnan(area_on.astype(float))): + on_i = np.nanargmax(area_on) + else: + on_i = None + + if on_i is None: + peak['rf_area_on_lsn'].iloc[nc] = np.nan + peak['rf_center_on_x_lsn'].iloc[nc] = np.nan + peak['rf_center_on_y_lsn'].iloc[nc] = np.nan + else: + peak['rf_area_on_lsn'].iloc[nc] = df['on/gaussian_fit/area'].iloc[nc][on_i] + peak['rf_center_on_x_lsn'].iloc[nc] = df['on/gaussian_fit/center_x'].iloc[nc][on_i] + peak['rf_center_on_y_lsn'].iloc[nc] = df['on/gaussian_fit/center_y'].iloc[nc][on_i] + + # find the index of the largest off subunit, if it exists + off_i = None + if 'off/gaussian_fit/area' in df.columns: + area_off = df['off/gaussian_fit/area'].iloc[nc] + + # watch out for NaNs and Nones + if isinstance(area_off, np.ndarray): + area_off[np.equal(area_off, None)] = np.nan + if not np.all(np.isnan(area_off.astype(float))): + off_i = np.nanargmax(area_off) + else: + off_i = None + + if off_i is None: + peak['rf_area_off_lsn'].iloc[nc] = np.nan + peak['rf_center_off_x_lsn'].iloc[nc] = np.nan + peak['rf_center_off_y_lsn'].iloc[nc] = np.nan + else: + peak['rf_area_off_lsn'].iloc[nc] = df['off/gaussian_fit/area'].iloc[nc][off_i] + peak['rf_center_off_x_lsn'].iloc[nc] = df['off/gaussian_fit/center_x'].iloc[nc][off_i] + peak['rf_center_off_y_lsn'].iloc[nc] = df['off/gaussian_fit/center_y'].iloc[nc][off_i] + + + if on_i is not None and off_i is not None: + peak['rf_distance_lsn'].iloc[nc] = df['on/gaussian_fit/distance'].iloc[nc][on_i][off_i] + peak['rf_overlap_index_lsn'].iloc[nc] = df['on/gaussian_fit/overlap'].iloc[nc][on_i][off_i] + else: + peak['rf_distance_lsn'].iloc[nc] = np.nan + peak['rf_overlap_index_lsn'].iloc[nc] = np.nan + + return peak + + def populate_stimulus_table(self): + self._stim_table = self.data_set.get_stimulus_table(self.stimulus) + self._LSN, self._LSN_mask = self.data_set.get_locally_sparse_noise_stimulus_template( + self.stimulus, mask_off_screen=False) + self._sweeplength = self._stim_table['end'][ + 1] - self._stim_table['start'][1] + self._interlength = 4 * self._sweeplength + self._extralength = self._sweeplength + + + def get_mean_response(self): + logging.debug("Calculating mean responses") + mean_response = np.empty( + (self.nrows, self.ncols, self.numbercells + 1, 2)) + + for xp in range(self.nrows): + for yp in range(self.ncols): + on_frame = np.where(self.LSN[:, xp, yp] == self.LSN_ON)[0] + off_frame = np.where(self.LSN[:, xp, yp] == self.LSN_OFF)[0] + subset_on = self.mean_sweep_response[ + self.stim_table.frame.isin(on_frame)] + subset_off = self.mean_sweep_response[ + self.stim_table.frame.isin(off_frame)] + mean_response[xp, yp, :, 0] = subset_on.mean(axis=0) + mean_response[xp, yp, :, 1] = subset_off.mean(axis=0) + return mean_response + + def get_receptive_field(self): + ''' Calculates receptive fields for each cell + ''' + + receptive_field = np.zeros((self.nrows, self.ncols, self.numbercells, 2)) + + for cell_index in range(len(self.cell_index_receptive_field_analysis_data)): + curr_rf = self.cell_index_receptive_field_analysis_data[str(cell_index)] + rf_on = curr_rf['on']['rts_convolution']['data'].copy() + rf_off = curr_rf['off']['rts_convolution']['data'].copy() + rf_on[np.logical_not(curr_rf['on']['fdr_mask']['data'].sum(axis=0))] = np.nan + rf_off[np.logical_not(curr_rf['off']['fdr_mask']['data'].sum(axis=0))] = np.nan + receptive_field[:,:,cell_index, 0] = rf_on + receptive_field[:, :, cell_index, 1] = rf_off + + return receptive_field + + + def get_receptive_field_analysis_data(self): + ''' Calculates receptive fields for each cell + ''' + + csid_rf = {} + for cell_index in range(self.data_set.number_of_cells): + csid_rf[str(cell_index)] = compute_receptive_field_with_postprocessing( + self.data_set, cell_index, self.stimulus, alpha=.05, number_of_shuffles=10000) + + return csid_rf + + + def plot_receptive_field_analysis_data(self, cell_index, **kwargs): + rf = self._cell_index_receptive_field_analysis_data[str(cell_index)] + return plot_receptive_field_data(rf, self, **kwargs) + + def get_receptive_field_attribute_df(self): + + df_list = [] + for cell_index_as_str, rf in self.cell_index_receptive_field_analysis_data.items(): + + attribute_dict = {} + for x in dict_generator(rf): + if x[-3] == 'attrs': + if len(x[:-3]) == 0: + key = x[-2] + else: + key = '/'.join(['/'.join(x[:-3]), x[-2]]) + attribute_dict[key] = x[-1] + + massaged_dict = {} + for key, val in attribute_dict.items(): + massaged_dict[key] = [val] + + massaged_dict['oeid'] = self.data_set.get_metadata()['ophys_experiment_id'] + + curr_df = pd.DataFrame.from_dict(massaged_dict) + df_list.append(curr_df) + + attribute_df = pd.concat(df_list, sort=True) + + return attribute_df.sort_values('cell_index') + + @staticmethod + def merge_mean_response(rc1, rc2): + """ Move out of this class, to session analysis + """ + + # make sure that rc1 is the larger one + if rc2.shape[0] > rc1.shape[0]: + rc1, rc2 = rc2, rc1 + + shape_mult = np.array(rc1.shape) / np.array(rc2.shape) + + rc2_zoom = scipy.ndimage.zoom(rc2, shape_mult, order=0) + + return rc1 + rc2_zoom + + def plot_cell_receptive_field(self, on, cell_specimen_id=None, color_map=None, clim=None, mask=None, cell_index=None, scalebar=True): + if color_map is None: + color_map = 'Reds' if on else 'Blues' + + onst = 'on' if on else 'off' + cell_idx = self.row_from_cell_id(cell_specimen_id, cell_index) + rf = self.cell_index_receptive_field_analysis_data[str(cell_idx)] + rts = rf[onst]['rts']['data'] + rts[np.logical_not(rf[onst]['fdr_mask']['data'].sum(axis=0))] = np.nan + + oplots.plot_receptive_field(rts, + color_map=color_map, + clim=clim, + mask=mask, + scalebar=scalebar) + + def plot_population_receptive_field(self, color_map='RdPu', clim=None, mask=None, scalebar=True): + rf = np.nansum(self.receptive_field, axis=(2,3)) + oplots.plot_receptive_field(rf, + color_map=color_map, + clim=clim, + mask=mask, + scalebar=scalebar) + + def sort_trials(self): + ds = self.data_set + + lsn_movie, lsn_mask = ds.get_locally_sparse_noise_stimulus_template(self.stimulus, + mask_off_screen=False) + + baseline_trials = np.unique(np.where(lsn_movie[:,-5:,-1] != LocallySparseNoise.LSN_GREY)[0]) + baseline_df = self.mean_sweep_response.loc[baseline_trials] + cell_baselines = np.nanmean(baseline_df.values, axis=0) + + lsn_movie[:,~lsn_mask] = LocallySparseNoise.LSN_OFF_SCREEN + + trials = {} + for row in range(self.nrows): + for col in range(self.ncols): + on_trials = np.where(lsn_movie[:,row,col] == LocallySparseNoise.LSN_ON) + off_trials = np.where(lsn_movie[:,row,col] == LocallySparseNoise.LSN_OFF) + + trials[(col,row,True)] = on_trials + trials[(col,row,False)] = off_trials + + return trials, cell_baselines + + + def open_pincushion_plot(self, on, cell_specimen_id=None, color_map=None, cell_index=None): + cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) + + trials, baselines = self.sort_trials() + data = self.mean_sweep_response[str(cell_index)].values + + cplots.make_pincushion_plot(data, trials, on, + self.nrows, self.ncols, + clim=[ baselines[cell_index], data.mean() + data.std() * 3 ], + color_map=color_map, + radius=1.0/16.0) + + @staticmethod + def from_analysis_file(data_set, analysis_file, stimulus): + lsn = LocallySparseNoise(data_set, stimulus) + + lsn.populate_stimulus_table() + + if stimulus == stimulus_info.LOCALLY_SPARSE_NOISE: + stimulus_suffix = stimulus_info.LOCALLY_SPARSE_NOISE_SHORT + elif stimulus == stimulus_info.LOCALLY_SPARSE_NOISE_4DEG: + stimulus_suffix = stimulus_info.LOCALLY_SPARSE_NOISE_4DEG_SHORT + elif stimulus == stimulus_info.LOCALLY_SPARSE_NOISE_8DEG: + stimulus_suffix = stimulus_info.LOCALLY_SPARSE_NOISE_8DEG_SHORT + + try: + + with h5py.File(analysis_file, "r") as f: + k = "analysis/mean_response_%s" % stimulus_suffix + if k in f: + lsn._mean_response = f[k].value + + lsn._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_%s" % stimulus_suffix) + lsn._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_%s" % stimulus_suffix) + + with h5py.File(analysis_file, "r") as f: + lsn._cell_index_receptive_field_analysis_data = LocallySparseNoise.read_cell_index_receptive_field_analysis(f, stimulus) + + except Exception as e: + raise MissingStimulusException(e.args) + + return lsn + + @staticmethod + def save_cell_index_receptive_field_analysis(cell_index_receptive_field_analysis_data, new_nwb, prefix): + + attr_list = [] + file_handle = h5py.File(new_nwb.nwb_file, 'a') + if prefix in file_handle['analysis']: + del file_handle['analysis'][prefix] + f = file_handle.create_group('analysis/%s' % prefix) + for x in dict_generator(cell_index_receptive_field_analysis_data): + if x[-2] == 'data': + f['/'.join(x[:-1])] = x[-1] + elif x[-3] == 'attrs': + attr_list.append(x) + else: + raise Exception + + for x in attr_list: + + # replace None => nan before writing + # set array type to float + for ii, item in enumerate(x): + if isinstance( item, np.ndarray ): + if item.dtype == np.dtype('O'): + item[ item == None ] = np.nan + x[ii] = np.array(item, dtype=float) + + if len(x) > 3: + f['/'.join(x[:-3])].attrs[x[-2]] = x[-1] + else: + assert len(x) == 3 + + if x[-1] is None: + f.attrs[x[-2]] = np.NaN + else: + f.attrs[x[-2]] = x[-1] + + file_handle.close() + + + @staticmethod + def read_cell_index_receptive_field_analysis(file_handle, prefix, path=None): + k = 'analysis/%s' % prefix + if k in file_handle: + f = file_handle['analysis/%s' % prefix] + if path is None: + rf = read_h5_group(f) + else: + rf = read_h5_group(f[path]) + + return rf + else: + return None + + + diff --git a/brain_observatory/natural_movie.py b/brain_observatory/natural_movie.py new file mode 100644 index 0000000000..474ee53903 --- /dev/null +++ b/brain_observatory/natural_movie.py @@ -0,0 +1,212 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import scipy.stats as st +import pandas as pd +import numpy as np +import h5py +from .stimulus_analysis import StimulusAnalysis +from .brain_observatory_exceptions import MissingStimulusException +from . import stimulus_info as stiminfo +from . import circle_plots as cplots + +class NaturalMovie(StimulusAnalysis): + """ Perform tuning analysis specific to natural movie stimulus. + + Parameters + ---------- + data_set: BrainObservatoryNwbDataSet object + + movie_name: string + one of [ stimulus_info.NATURAL_MOVIE_ONE, stimulus_info.NATURAL_MOVIE_TWO, + stimulus_info.NATURAL_MOVIE_THREE ] + """ + + def __init__(self, data_set, movie_name, **kwargs): + super(NaturalMovie, self).__init__(data_set, **kwargs) + + self.movie_name = movie_name + self._sweeplength = NaturalMovie._PRELOAD + self._sweep_response = NaturalMovie._PRELOAD + + @property + def sweeplength(self): + if self._sweeplength is NaturalMovie._PRELOAD: + self.populate_stimulus_table() + + return self._sweeplength + + @property + def sweep_response(self): + if self._sweep_response is NaturalMovie._PRELOAD: + self._sweep_response = self.get_sweep_response() + + return self._sweep_response + + def populate_stimulus_table(self): + stimulus_table = self.data_set.get_stimulus_table(self.movie_name) + self._stim_table = stimulus_table[stimulus_table.frame == 0] + self._sweeplength = \ + self.stim_table.start.iloc[1] - self.stim_table.start.iloc[0] + + def get_sweep_response(self): + ''' Returns the dF/F response for each cell + + Returns + ------- + Numpy array + ''' + sweep_response = pd.DataFrame(index=self.stim_table.index.values, columns=np.array( + range(self.numbercells)).astype(str)) + for index, row in self.stim_table.iterrows(): + start = row.start + end = start + self.sweeplength + for nc in range(self.numbercells): + sweep_response[str(nc)][index] = self.dfftraces[nc, start:end] + return sweep_response + + def get_peak(self): + ''' Computes properties of the peak response condition for each cell. + + Returns + ------- + Pandas data frame with the below fields. A suffix of "nm1", "nm2" or "nm3" is appended to the field name depending + on which of three movie clips was presented. + * peak_nm1 (frame with peak response) + * response_variability_nm1 + ''' + peak_movie = pd.DataFrame(index=range(self.numbercells), columns=( + 'peak', 'response_reliability', 'cell_specimen_id')) + cids = self.data_set.get_cell_specimen_ids() + + mask = np.ones((10,10)) + for i in range(10): + for j in range(10): + if i>=j: + mask[i,j] = np.NaN + + for nc in range(self.numbercells): + peak_movie.cell_specimen_id.iloc[nc] = cids[nc] + meanresponse = self.sweep_response[str(nc)].mean() + +# movie_len = len(meanresponse) / 30 +# output = np.empty((movie_len, 10)) +# for tr in range(10): +# test = self.sweep_response[str(nc)].iloc[tr] +# for i in range(movie_len): +# _, p = st.ks_2samp( +# test[i * 30:(i + 1) * 30], test[(i + 1) * 30:(i + 2) * 30]) +# output[i, tr] = p +# output = np.where(output < 0.05, 1, 0) +# ptime = np.sum(output, axis=1) +# ptime *= 10 + peak = np.argmax(meanresponse) +# if peak > 30: +# peak_movie.response_reliability.iloc[ +# nc] = ptime[(peak - 30) / 30] +# else: +# peak_movie.response_reliability.iloc[nc] = ptime[0] + peak_movie.peak.iloc[nc] = peak + + #reliability + corr_matrix = np.empty((10,10)) + for i in range(10): + for j in range(10): + r,p = st.pearsonr(self.sweep_response[str(nc)].iloc[i], self.sweep_response[str(nc)].iloc[j]) + corr_matrix[i,j] = r + corr_matrix*=mask + peak_movie.response_reliability.iloc[nc] = np.nanmean(corr_matrix) + + if self.movie_name == stiminfo.NATURAL_MOVIE_ONE: + peak_movie.rename(columns={ + 'peak': 'peak_'+stiminfo.NATURAL_MOVIE_ONE_SHORT, + 'response_reliability': 'response_reliability_'+stiminfo.NATURAL_MOVIE_ONE_SHORT}, + inplace=True) + elif self.movie_name == stiminfo.NATURAL_MOVIE_TWO: + peak_movie.rename(columns={ + 'peak': 'peak_'+stiminfo.NATURAL_MOVIE_TWO_SHORT, + 'response_reliability': 'response_reliability_'+stiminfo.NATURAL_MOVIE_TWO_SHORT}, + inplace=True) + elif self.movie_name == stiminfo.NATURAL_MOVIE_THREE: + peak_movie.rename(columns={ + 'peak': 'peak_'+stiminfo.NATURAL_MOVIE_THREE_SHORT, + 'response_reliability': 'response_reliability_'+stiminfo.NATURAL_MOVIE_THREE_SHORT}, + inplace=True) + + return peak_movie + + def open_track_plot(self, cell_specimen_id=None, cell_index=None): + cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) + + cell_rows = self.sweep_response[str(cell_index)] + data = [] + for i in range(len(cell_rows)): + data.append(cell_rows.iloc[i]) + + data = np.vstack(data) + + tp = cplots.TrackPlotter(ring_length=360) + tp.plot(data, + clim=[0, data.mean() + data.std()*3]) + tp.show_arrow() + + @staticmethod + def from_analysis_file(data_set, analysis_file, movie_name): + nm = NaturalMovie(data_set, movie_name) + nm.populate_stimulus_table() + + # TODO: deal with this properly + suffix_map = { + stiminfo.NATURAL_MOVIE_ONE: '_'+stiminfo.NATURAL_MOVIE_ONE_SHORT, + stiminfo.NATURAL_MOVIE_TWO: '_'+stiminfo.NATURAL_MOVIE_TWO_SHORT, + stiminfo.NATURAL_MOVIE_THREE: '_'+stiminfo.NATURAL_MOVIE_THREE_SHORT + } + + try: + suffix = suffix_map[movie_name] + + + nm._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response"+suffix) + nm._peak = pd.read_hdf(analysis_file, "analysis/peak") + + with h5py.File(analysis_file, "r") as f: + nm._binned_dx_sp = f["analysis/binned_dx_sp"].value + nm._binned_cells_sp = f["analysis/binned_cells_sp"].value + nm._binned_dx_vis = f["analysis/binned_dx_vis"].value + nm._binned_cells_vis = f["analysis/binned_cells_vis"].value + except Exception as e: + raise MissingStimulusException(e.args) + + return nm diff --git a/brain_observatory/natural_scenes.py b/brain_observatory/natural_scenes.py new file mode 100644 index 0000000000..9ff5651e4a --- /dev/null +++ b/brain_observatory/natural_scenes.py @@ -0,0 +1,408 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import scipy.stats as st +import numpy as np +import pandas as pd +from .stimulus_analysis import StimulusAnalysis +import logging +import h5py +from . import observatory_plots as oplots +from . import circle_plots as cplots +from .brain_observatory_exceptions import MissingStimulusException + +class NaturalScenes(StimulusAnalysis): + """ Perform tuning analysis specific to natural scenes stimulus. + + Parameters + ---------- + data_set: BrainObservatoryNwbDataSet object + """ + + _log = logging.getLogger('allensdk.brain_observatory.natural_scenes') + + def __init__(self, data_set, **kwargs): + super(NaturalScenes, self).__init__(data_set, **kwargs) + + self._number_scenes = StimulusAnalysis._PRELOAD + self._sweeplength = StimulusAnalysis._PRELOAD + self._interlength = StimulusAnalysis._PRELOAD + self._extralength = StimulusAnalysis._PRELOAD + + @property + def number_scenes(self): + if self._number_scenes is StimulusAnalysis._PRELOAD: + self.populate_stimulus_table() + + return self._number_scenes + + @property + def sweeplength(self): + if self._sweeplength is StimulusAnalysis._PRELOAD: + self.populate_stimulus_table() + + return self._sweeplength + + @property + def interlength(self): + if self._interlength is StimulusAnalysis._PRELOAD: + self.populate_stimulus_table() + + return self._interlength + + @property + def extralength(self): + if self._extralength is StimulusAnalysis._PRELOAD: + self.populate_stimulus_table() + + return self._extralength + + def populate_stimulus_table(self): + self._stim_table = self.data_set.get_stimulus_table('natural_scenes') + self._number_scenes = len(np.unique(self._stim_table.frame)) + self._sweeplength = self._stim_table.end.iloc[ + 1] - self._stim_table.start.iloc[1] + self._interlength = 4 * self._sweeplength + self._extralength = self._sweeplength + + def get_response(self): + ''' Computes the mean response for each cell to each stimulus condition. Return is + a (# scenes, # cells, 3) np.ndarray. The final dimension + contains the mean response to the condition (index 0), standard error of the mean of the response + to the condition (index 1), and the number of trials with a significant (p < 0.05) response + to that condition (index 2). + + Returns + ------- + Numpy array storing mean responses. + ''' + NaturalScenes._log.info("Calculating mean responses") + + response = np.empty((self.number_scenes, self.numbercells + 1, 3)) + + def ptest(x): + return len(np.where(x < (0.05 / (self.number_scenes - 1)))[0]) + + for ns in range(self.number_scenes): + subset_response = self.mean_sweep_response[ + self.stim_table.frame == (ns - 1)] + subset_pval = self.pval[self.stim_table.frame == (ns - 1)] + response[ns, :, 0] = subset_response.mean(axis=0) + response[ns, :, 1] = subset_response.std( + axis=0) / np.sqrt(len(subset_response)) + response[ns, :, 2] = subset_pval.apply(ptest, axis=0) + + return response + + def get_peak(self): + ''' Computes metrics about peak response condition for each cell. + + Returns + ------- + Pandas data frame with the following fields ('_ns' suffix is for + natural scene): + * scene_ns (scene number) + * reliability_ns + * peak_dff_ns (peak dF/F) + * ptest_ns + * p_run_ns + * run_modulation_ns + * time_to_peak_ns + ''' + NaturalScenes._log.info('Calculating peak response properties') + peak = pd.DataFrame(index=range(self.numbercells), columns=('scene_ns', 'reliability_ns', 'peak_dff_ns', + 'ptest_ns', 'p_run_ns', 'run_modulation_ns', + 'time_to_peak_ns', + 'cell_specimen_id','image_selectivity_ns')) + cids = self.data_set.get_cell_specimen_ids() + + for nc in range(self.numbercells): + nsp = np.argmax(self.response[1:, nc, 0]) + peak.cell_specimen_id.iloc[nc] = cids[nc] + peak.scene_ns[nc] = nsp +# peak.response_reliability_ns[nc] = self.response[ +# nsp + 1, nc, 2] / 0.50 # assume 50 trials + peak.peak_dff_ns[nc] = self.response[nsp + 1, nc, 0] +# subset = self.mean_sweep_response[self.stim_table.frame == nsp] +# subset_stat = subset[subset.dx < 2] +# subset_run = subset[subset.dx >= 2] +# if (len(subset_run) > 5) & (len(subset_stat) > 5): +# (_, peak.p_run_ns[nc]) = st.ks_2samp( +# subset_run[str(nc)], subset_stat[str(nc)]) +# peak.run_modulation_ns[nc] = subset_run[ +# str(nc)].mean() / subset_stat[str(nc)].mean() +# else: +# peak.p_run_ns[nc] = np.NaN +# peak.run_modulation_ns[nc] = np.NaN + groups = [] + for im in range(self.number_scenes): + subset = self.mean_sweep_response[ + self.stim_table.frame == (im - 1)] + groups.append(subset[str(nc)].values) + (_, peak.ptest_ns[nc]) = st.f_oneway(*groups) + test = self.sweep_response[ + self.stim_table.frame == nsp][str(nc)].mean() + peak.time_to_peak_ns[nc] = ( + np.argmax(test) - self.interlength) / self.acquisition_rate + + #running modulation + subset = self.mean_sweep_response[self.stim_table.frame==nsp] + subset_run = subset[subset.dx>=1] + subset_stat = subset[subset.dx<1] + if (len(subset_run)>4) & (len(subset_stat)>4): + (_,peak.p_run_ns.iloc[nc]) = st.ttest_ind(subset_run[str(nc)], subset_stat[str(nc)], equal_var=False) + + if subset_run[str(nc)].mean()>subset_stat[str(nc)].mean(): + peak.run_modulation_ns.iloc[nc] = (subset_run[str(nc)].mean() - subset_stat[str(nc)].mean())/np.abs(subset_run[str(nc)].mean()) + elif subset_run[str(nc)].mean()<subset_stat[str(nc)].mean(): + peak.run_modulation_ns.iloc[nc] = -1*((subset_stat[str(nc)].mean() - subset_run[str(nc)].mean())/np.abs(subset_stat[str(nc)].mean())) + else: + peak.p_run_ns.iloc[nc] = np.NaN + peak.run_modulation_ns.iloc[nc] = np.NaN + + #reliability + subset = self.sweep_response[self.stim_table.frame==nsp] + corr_matrix = np.empty((len(subset),len(subset))) + for i in range(len(subset)): + for j in range(len(subset)): + r,p = st.pearsonr(subset[str(nc)].iloc[i][28:42], subset[str(nc)].iloc[j][28:42]) + corr_matrix[i,j] = r + mask = np.ones((len(subset), len(subset))) + for i in range(len(subset)): + for j in range(len(subset)): + if i>=j: + mask[i,j] = np.NaN + corr_matrix *= mask + peak.reliability_ns.iloc[nc] = np.nanmean(corr_matrix) + + #image selectivity + fmin = self.response[1:,nc,0].min() + fmax = self.response[1:,nc,0].max() + rtj = np.empty((1000,1)) + for j in range(1000): + thresh = fmin + j*((fmax-fmin)/1000.) + theta = np.empty((118,1)) + for im in range(118): + if self.response[im+1,nc,0] > thresh: #im+1 to only look at images, not blanksweep + theta[im] = 1 + else: + theta[im] = 0 + rtj[j] = theta.mean() + + biga = rtj.mean() + bigs = 1 - (2*biga) + peak.image_selectivity_ns.iloc[nc] = bigs + + return peak + + def plot_time_to_peak(self, + p_value_max=oplots.P_VALUE_MAX, + color_map=oplots.STIMULUS_COLOR_MAP): + stimulus_table = self.data_set.get_stimulus_table('natural_scenes') + + resps = [] + + for index, row in self.peak.iterrows(): + mean_response = self.sweep_response.ix[stimulus_table.frame==row.scene_ns][str(index)].mean() + resps.append((mean_response - mean_response.mean() / mean_response.std())) + + mean_responses = np.array(resps) + + sorted_table = self.peak[self.peak.ptest_ns < p_value_max].sort_values('time_to_peak_ns') + cell_order = sorted_table.index + + # time to peak is relative to stimulus start in seconds + ttps = sorted_table.time_to_peak_ns.values + self.interlength / self.acquisition_rate + msrs_sorted = mean_responses[cell_order,:] + + oplots.plot_time_to_peak(msrs_sorted, ttps, + 0, (2*self.interlength + self.sweeplength) / self.acquisition_rate, + (self.interlength) / self.acquisition_rate, + (self.interlength + self.sweeplength) / self.acquisition_rate, + color_map) + + def open_corona_plot(self, cell_specimen_id=None, cell_index=None): + cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) + + df = self.mean_sweep_response[str(cell_index)] + data = df.values + + st = self.data_set.get_stimulus_table('natural_scenes') + mask = st[st.frame >= 0].index + + cmin = self.response[0,cell_index,0] + cmax = max(cmin, data.mean() + data.std()*3) + + cp = cplots.CoronaPlotter() + cp.plot(st.frame.ix[mask].values, + data=df.ix[mask].values, + clim=[cmin, cmax]) + cp.show_arrow() + cp.show_circle() + + def reshape_response_array(self): + ''' + :return: response array in cells x stim x repetition for noise correlations + ''' + + mean_sweep_response = self.mean_sweep_response.values[:, :self.numbercells] + + stim_table = self.stim_table + frames = np.unique(stim_table.frame.values) + + reps = [len(np.where(stim_table.frame.values == frame)[0]) for frame in frames] + Nreps = min(reps) # just in case there are different numbers of repetitions + + response_new = np.zeros((self.numbercells, self.number_scenes), dtype='object') + for i, frame in enumerate(frames): + ind = np.where(stim_table.frame.values == frame)[0][:Nreps] + for c in range(self.numbercells): + response_new[c, i] = mean_sweep_response[ind, c] + + return response_new + + def get_signal_correlation(self, corr='spearman'): + logging.debug("Calculating signal correlations") + + response = self.response[:, :, 0].T + response = response[:self.numbercells, :] + N, Nstim = response.shape + + signal_corr = np.zeros((N, N)) + signal_p = np.empty((N, N)) + if corr == 'pearson': + for i in range(N): + for j in range(i, N): # matrix is symmetric + signal_corr[i, j], signal_p[i, j] = st.pearsonr(response[i], response[j]) + + elif corr == 'spearman': + for i in range(N): + for j in range(i, N): # matrix is symmetric + signal_corr[i, j], signal_p[i, j] = st.spearmanr(response[i], response[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + signal_corr = np.triu(signal_corr) + np.triu(signal_corr, 1).T # fill in lower triangle + signal_p = np.triu(signal_p) + np.triu(signal_p, 1).T # fill in lower triangle + + return signal_corr, signal_p + + def get_representational_similarity(self, corr='spearman'): + logging.debug("Calculating representational similarity") + + response = self.response[:, :, 0] + response = response[:, :self.numbercells] + Nstim, N = response.shape + + rep_sim = np.zeros((Nstim, Nstim)) + rep_sim_p = np.empty((Nstim, Nstim)) + if corr == 'pearson': + for i in range(Nstim): + for j in range(i, Nstim): # matrix is symmetric + rep_sim[i, j], rep_sim_p[i, j] = st.pearsonr(response[i], response[j]) + + elif corr == 'spearman': + for i in range(Nstim): + for j in range(i, Nstim): # matrix is symmetric + rep_sim[i, j], rep_sim_p[i, j] = st.spearmanr(response[i], response[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + rep_sim = np.triu(rep_sim) + np.triu(rep_sim, 1).T # fill in lower triangle + rep_sim_p = np.triu(rep_sim_p) + np.triu(rep_sim_p, 1).T # fill in lower triangle + + return rep_sim, rep_sim_p + + def get_noise_correlation(self, corr='spearman'): + logging.debug("Calculating noise correlations") + + response = self.reshape_response_array() + noise_corr = np.zeros((self.numbercells, self.numbercells, self.number_scenes)) + noise_corr_p = np.zeros((self.numbercells, self.numbercells, self.number_scenes)) + + if corr == 'pearson': + for k in range(self.number_scenes): + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr[i, j, k], noise_corr_p[i, j, k] = st.pearsonr(response[i, k], response[j, k]) + + noise_corr[:, :, k] = np.triu(noise_corr[:, :, k]) + np.triu(noise_corr[:, :, k], 1).T + noise_corr_p[:, :, k] = np.triu(noise_corr_p[:, :, k]) + np.triu(noise_corr_p[:, :, k], 1).T + + elif corr == 'spearman': + for k in range(self.number_scenes): + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr[i, j, k], noise_corr_p[i, j, k] = st.spearmanr(response[i, k], response[j, k]) + + noise_corr[:, :, k] = np.triu(noise_corr[:, :, k]) + np.triu(noise_corr[:, :, k], 1).T + noise_corr_p[:, :, k] = np.triu(noise_corr_p[:, :, k]) + np.triu(noise_corr_p[:, :, k], 1).T + + else: + raise Exception('correlation should be pearson or spearman') + + return noise_corr, noise_corr_p + + @staticmethod + def from_analysis_file(data_set, analysis_file): + ns = NaturalScenes(data_set) + ns.populate_stimulus_table() + + try: + ns._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_ns") + ns._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_ns") + ns._peak = pd.read_hdf(analysis_file, "analysis/peak") + + with h5py.File(analysis_file, "r") as f: + ns._response = f["analysis/response_ns"].value + ns._binned_dx_sp = f["analysis/binned_dx_sp"].value + ns._binned_cells_sp = f["analysis/binned_cells_sp"].value + ns._binned_dx_vis = f["analysis/binned_dx_vis"].value + ns._binned_cells_vis = f["analysis/binned_cells_vis"].value + + if "analysis/noise_corr_ns" in f: + ns.noise_correlation = f["analysis/noise_corr_ns"].value + if "analysis/signal_corr_ns" in f: + ns.signal_correlation = f["analysis/signal_corr_ns"].value + if "analysis/rep_similarity_ns" in f: + ns.representational_similarity = f["analysis/rep_similarity_ns"].value + + except Exception as e: + raise MissingStimulusException(e.args) + + return ns + diff --git a/brain_observatory/nwb/__init__.py b/brain_observatory/nwb/__init__.py new file mode 100644 index 0000000000..30e4fc8471 --- /dev/null +++ b/brain_observatory/nwb/__init__.py @@ -0,0 +1,1117 @@ +import logging +import warnings +from pathlib import Path +from typing import Iterable, Optional + +import h5py +import marshmallow +import numpy as np +import pandas as pd +import datetime +import uuid +import SimpleITK as sitk +import pynwb +from pynwb.base import TimeSeries, Images +from pynwb import ProcessingModule, NWBFile +from pynwb.image import GrayscaleImage, IndexSeries +from pynwb.ophys import ( + DfOverF, ImageSegmentation, OpticalChannel, Fluorescence) + +from allensdk.brain_observatory.behavior.data_objects.stimuli\ + .stimulus_templates import StimulusTemplate +from allensdk.brain_observatory.behavior.write_nwb.extensions.stimulus_template.ndx_stimulus_template import StimulusTemplateExtension # noqa: E501 +from allensdk.brain_observatory.nwb.nwb_utils import (get_column_name) +from allensdk.brain_observatory import dict_to_indexed_array +from allensdk.brain_observatory.behavior.image_api import Image +from allensdk.brain_observatory.behavior.image_api import ImageApi +from allensdk.brain_observatory.behavior.schemas import ( + CompleteOphysBehaviorMetadataSchema, NwbOphysMetadataSchema, + BehaviorMetadataSchema, OphysBehaviorMetadataSchema, + BehaviorTaskParametersSchema, SubjectMetadataSchema +) +from allensdk.brain_observatory.nwb.metadata import load_pynwb_extension + + +log = logging.getLogger("allensdk.brain_observatory.nwb") + +CELL_SPECIMEN_COL_DESCRIPTIONS = { + 'cell_specimen_id': 'Unified id of segmented cell across experiments ' + '(after cell matching)', + 'height': 'Height of ROI in pixels', + 'width': 'Width of ROI in pixels', + 'mask_image_plane': 'Which image plane an ROI resides on. Overlapping ' + 'ROIs are stored on different mask image planes.', + 'max_correction_down': 'Max motion correction in down direction in pixels', + 'max_correction_left': 'Max motion correction in left direction in pixels', + 'max_correction_up': 'Max motion correction in up direction in pixels', + 'max_correction_right': 'Max motion correction in right direction in ' + 'pixels', + 'valid_roi': 'Indicates if cell classification found the ROI to be a cell ' + 'or not', + 'x': 'x position of ROI in Image Plane in pixels (top left corner)', + 'y': 'y position of ROI in Image Plane in pixels (top left corner)' +} + + +def check_nwbfile_version(nwbfile_path: str, + desired_minimum_version: str, + warning_msg: str): + with h5py.File(nwbfile_path, 'r') as f: + # nwb 2.x files store version as an attribute + try: + nwb_version = str(f.attrs["nwb_version"]).split(".") + except KeyError: + # nwb 1.x files store version as dataset + try: + nwb_version = str(f["nwb_version"][...].astype(str)) + # Stored in the form: `NWB-x.y.z` + nwb_version = nwb_version.split("-")[1].split(".") + except (KeyError, IndexError): + nwb_version = None + + if nwb_version is None: + warnings.warn(f"'{nwbfile_path}' doesn't appear to be a valid " + f"Neurodata Without Borders (*.nwb) format file as " + f"neither a 'nwb_version' field nor dataset could " + f"be found!") + else: + if tuple(nwb_version) < tuple(desired_minimum_version.split(".")): + warnings.warn(warning_msg) + + +def read_eye_dlc_tracking_ellipses(input_path: Path) -> dict: + """Reads eye tracking ellipse fit data from an h5 file. + + Args: + input_path (Path): Path to eye tracking ellipse fit h5 file + + Returns: + dict: Loaded h5 data. Each 'params' field contains dataframes with] + ellipse fit parameters. Dataframes contain 5 columns each + consisting of: "center_x", "center_y", "height", "phi", "width" + """ + + eye_dlc_tracking_data = {} + + # TODO: Some ellipses.h5 files have the 'cr' key as complex type instead of + # float. For now, when loading ellipses.h5 files, always coerce to float + # but this should eventually be resolved upstream... + # See: allensdk.brain_observatory.eye_tracking + pupil_params = pd.read_hdf(input_path, key="pupil").astype(float) + cr_params = pd.read_hdf(input_path, key="cr").astype(float) + eye_params = pd.read_hdf(input_path, key="eye").astype(float) + + eye_dlc_tracking_data["pupil_params"] = pupil_params + eye_dlc_tracking_data["cr_params"] = cr_params + eye_dlc_tracking_data["eye_params"] = eye_params + + return eye_dlc_tracking_data + + +def read_eye_gaze_mappings(input_path: Path) -> dict: + """Reads eye gaze mapping data from an h5 file. + + Args: + input_path (Path): Path to eye gaze mapping h5 data file produced by + 'allensdk.brain_observatory.gaze_mapping' module. + + Returns: + dict: Loaded h5 data. + *_eye_areas: Area of eye (in pixels^2) over time + *_pupil_areas: Area of pupil (in pixels^2) over time + *_screen_coordinates: y, x screen coordinates (in cm) over time + *_screen_coordinates_spherical: y, x screen coordinates (in deg) + over time + synced_frame_timestamps: synced timestamps for video frames + (in sec) + """ + + eye_gaze_data = {} + eye_gaze_data["raw_eye_areas"] = \ + pd.read_hdf(input_path, key="raw_eye_areas") + eye_gaze_data["raw_pupil_areas"] = \ + pd.read_hdf(input_path, key="raw_pupil_areas") + eye_gaze_data["raw_screen_coordinates"] = \ + pd.read_hdf(input_path, key="raw_screen_coordinates") + eye_gaze_data["raw_screen_coordinates_spherical"] = \ + pd.read_hdf(input_path, key="raw_screen_coordinates_spherical") + eye_gaze_data["new_eye_areas"] = \ + pd.read_hdf(input_path, key="new_eye_areas") + eye_gaze_data["new_pupil_areas"] = \ + pd.read_hdf(input_path, key="new_pupil_areas") + eye_gaze_data["new_screen_coordinates"] = \ + pd.read_hdf(input_path, key="new_screen_coordinates") + eye_gaze_data["new_screen_coordinates_spherical"] = \ + pd.read_hdf(input_path, key="new_screen_coordinates_spherical") + eye_gaze_data["synced_frame_timestamps"] = \ + pd.read_hdf(input_path, key="synced_frame_timestamps") + + return eye_gaze_data + + +def create_eye_gaze_mapping_dataframe(eye_gaze_data: dict) -> pd.DataFrame: + + eye_gaze_mapping_df = pd.DataFrame({ + "raw_eye_area": eye_gaze_data["raw_eye_areas"].values, + "raw_pupil_area": eye_gaze_data["raw_pupil_areas"].values, + "raw_screen_coordinates_x_cm": + eye_gaze_data["raw_screen_coordinates"]["x_pos_cm"].values, + "raw_screen_coordinates_y_cm": + eye_gaze_data["raw_screen_coordinates"]["y_pos_cm"].values, + "raw_screen_coordinates_spherical_x_deg": + eye_gaze_data["raw_screen_coordinates_spherical"]["x_pos_deg"].values, + "raw_screen_coordinates_spherical_y_deg": + eye_gaze_data["raw_screen_coordinates_spherical"]["y_pos_deg"].values, + "filtered_eye_area": eye_gaze_data["new_eye_areas"].values, + "filtered_pupil_area": eye_gaze_data["new_pupil_areas"].values, + "filtered_screen_coordinates_x_cm": + eye_gaze_data["new_screen_coordinates"]["x_pos_cm"].values, + "filtered_screen_coordinates_y_cm": + eye_gaze_data["new_screen_coordinates"]["y_pos_cm"].values, + "filtered_screen_coordinates_spherical_x_deg": + eye_gaze_data["new_screen_coordinates_spherical"]["x_pos_deg"].values, + "filtered_screen_coordinates_spherical_y_deg": + eye_gaze_data["new_screen_coordinates_spherical"]["y_pos_deg"].values + }, + index=eye_gaze_data["synced_frame_timestamps"].values + ) + return eye_gaze_mapping_df + + +def eye_tracking_data_is_valid(eye_dlc_tracking_data: dict, + synced_timestamps: pd.Series) -> bool: + is_valid = True + + pupil_params = eye_dlc_tracking_data["pupil_params"] + cr_params = eye_dlc_tracking_data["cr_params"] + eye_params = eye_dlc_tracking_data["eye_params"] + + num_frames_match = ((pupil_params.shape[0] == cr_params.shape[0]) + and (cr_params.shape[0] == eye_params.shape[0])) + if not num_frames_match: + log.warn("The number of frames for ellipse fits don't " + "match when they should. No ellipse fits will be written! " + f"pupil_params ({pupil_params.shape[0]}), " + f"cr_params ({cr_params.shape[0]}), " + f"eye_params ({eye_params.shape[0]})") + is_valid = False + + if (pupil_params.shape[0] != len(synced_timestamps)): + log.warn("The number of camera sync pulses in the " + f"sync file ({len(synced_timestamps)}) do not match " + "with the number of eye tracking frames " + f"({pupil_params.shape[0]})! No ellipse fits will be " + "written!") + is_valid = False + + return is_valid + + +def create_eye_tracking_nwb_processing_module(eye_dlc_tracking_data: dict, + synced_timestamps: pd.Series + ) -> pynwb.ProcessingModule: + + # Top level container for eye tracking processed data + eye_tracking_mod = pynwb.ProcessingModule( + name='eye_tracking', + description='Eye tracking processing module') + + # Data interfaces of dlc_fits_container + pupil_fits = eye_dlc_tracking_data["pupil_params"].assign( + timestamps=synced_timestamps) + pupil_params = pynwb.core.DynamicTable.from_dataframe( + df=pupil_fits, name="pupil_ellipse_fits") + + cr_fits = eye_dlc_tracking_data["cr_params"].assign( + timestamps=synced_timestamps) + cr_params = pynwb.core.DynamicTable.from_dataframe(df=cr_fits, + name="cr_ellipse_fits") + + eye_fits = eye_dlc_tracking_data["eye_params"].assign( + timestamps=synced_timestamps) + eye_params = pynwb.core.DynamicTable.from_dataframe( + df=eye_fits, name="eye_ellipse_fits") + + eye_tracking_mod.add_data_interface(pupil_params) + eye_tracking_mod.add_data_interface(cr_params) + eye_tracking_mod.add_data_interface(eye_params) + + return eye_tracking_mod + + +def add_eye_gaze_data_interfaces(pynwb_container: pynwb.NWBContainer, + pupil_areas: pd.Series, + eye_areas: pd.Series, + screen_coordinates: pd.DataFrame, + screen_coordinates_spherical: pd.DataFrame, + synced_timestamps: pd.Series + ) -> pynwb.NWBContainer: + + pupil_area_ts = pynwb.base.TimeSeries( + name="pupil_area", + data=pupil_areas.values, + timestamps=synced_timestamps.values, + unit="Pixels ^ 2" + ) + + eye_area_ts = pynwb.base.TimeSeries( + name="eye_area", + data=eye_areas.values, + timestamps=synced_timestamps.values, + unit="Pixels ^ 2" + ) + + screen_coord_ts = pynwb.base.TimeSeries( + name="screen_coordinates", + data=screen_coordinates.values, + timestamps=synced_timestamps.values, + unit="Centimeters" + ) + + screen_coord_spherical_ts = pynwb.base.TimeSeries( + name="screen_coordinates_spherical", + data=screen_coordinates_spherical.values, + timestamps=synced_timestamps.values, + unit="Degrees" + ) + + pynwb_container.add_data_interface(pupil_area_ts) + pynwb_container.add_data_interface(eye_area_ts) + pynwb_container.add_data_interface(screen_coord_ts) + pynwb_container.add_data_interface(screen_coord_spherical_ts) + + return pynwb_container + + +def create_gaze_mapping_nwb_processing_modules(eye_gaze_data: dict): + # Container for raw gaze mapped data + raw_gaze_mapping_mod = pynwb.ProcessingModule( + name='raw_gaze_mapping', + description='Gaze mapping processing module raw outputs') + + raw_gaze_mapping_mod = add_eye_gaze_data_interfaces( + raw_gaze_mapping_mod, + pupil_areas=eye_gaze_data["raw_pupil_areas"], + eye_areas=eye_gaze_data["raw_eye_areas"], + screen_coordinates=eye_gaze_data["raw_screen_coordinates"], + screen_coordinates_spherical=eye_gaze_data["raw_screen_coordinates_spherical"], # noqa: E501 + synced_timestamps=eye_gaze_data["synced_frame_timestamps"]) + + # Container for filtered gaze mapped data + filt_gaze_mapping_mod = pynwb.ProcessingModule( + name='filtered_gaze_mapping', + description='Gaze mapping processing module filtered outputs') + + filt_gaze_mapping_mod = add_eye_gaze_data_interfaces( + filt_gaze_mapping_mod, + pupil_areas=eye_gaze_data["new_pupil_areas"], + eye_areas=eye_gaze_data["new_eye_areas"], + screen_coordinates=eye_gaze_data["new_screen_coordinates"], + screen_coordinates_spherical=eye_gaze_data["new_screen_coordinates_spherical"], # noqa: E501 + synced_timestamps=eye_gaze_data["synced_frame_timestamps"]) + + return (raw_gaze_mapping_mod, filt_gaze_mapping_mod) + + +def add_eye_tracking_ellipse_fit_data_to_nwbfile(nwbfile: pynwb.NWBFile, + eye_dlc_tracking_data: dict, + synced_timestamps: pd.Series + ) -> pynwb.NWBFile: + eye_tracking_mod = create_eye_tracking_nwb_processing_module( + eye_dlc_tracking_data, synced_timestamps) + nwbfile.add_processing_module(eye_tracking_mod) + + return nwbfile + + +def add_eye_gaze_mapping_data_to_nwbfile(nwbfile: pynwb.NWBFile, + eye_gaze_data: dict) -> pynwb.NWBFile: + raw_gaze_mapping_mod, filt_gaze_mapping_mod = \ + create_gaze_mapping_nwb_processing_modules(eye_gaze_data) + nwbfile.add_processing_module(raw_gaze_mapping_mod) + nwbfile.add_processing_module(filt_gaze_mapping_mod) + + return nwbfile + + +def add_running_acquisition_to_nwbfile(nwbfile, + running_acquisition_df: pd.DataFrame): + + running_dx_series = TimeSeries( + name='dx', + data=running_acquisition_df['dx'].values, + timestamps=running_acquisition_df.index.values, + unit='cm', + description=( + 'Running wheel angular change, computed during data collection') + ) + + v_sig = TimeSeries( + name='v_sig', + data=running_acquisition_df['v_sig'].values, + timestamps=running_acquisition_df.index.values, + unit='V', + description='Voltage signal from the running wheel encoder' + ) + + v_in = TimeSeries( + name='v_in', + data=running_acquisition_df['v_in'].values, + timestamps=running_acquisition_df.index.values, + unit='V', + description=( + 'The theoretical maximum voltage that the running wheel encoder ' + 'will reach prior to "wrapping". This should ' + 'theoretically be 5V (after crossing 5V goes to 0V, or ' + 'vice versa). In practice the encoder does not always ' + 'reach this value before wrapping, which can cause ' + 'transient spikes in speed at the voltage "wraps".') + ) + + if 'running' in nwbfile.processing: + running_mod = nwbfile.processing['running'] + else: + running_mod = ProcessingModule('running', + 'Running speed processing module') + nwbfile.add_processing_module(running_mod) + + running_mod.add_data_interface(running_dx_series) + nwbfile.add_acquisition(v_sig) + nwbfile.add_acquisition(v_in) + + return nwbfile + + +def add_running_speed_to_nwbfile(nwbfile, running_speed, + name='speed', unit='cm/s', + from_dataframe=False): + ''' Adds running speed data to an NWBFile as a timeseries in acquisition + + Parameters + ---------- + nwbfile : pynwb.NWBFile + File to which running speeds will be written + running_speed : Union[RunningSpeed, pd.DataFrame] + Either a RunningSpeed object or pandas DataFrame. + Contains attributes 'values' and 'timestamps' + name : str, optional + Used as name of timeseries object + unit : str, optional + SI units of running speed values + from_dataframe : bool, optional + Whether `running_speed` is a dataframe or not. Default is False. + + Returns + ------- + nwbfile : pynwb.NWBFile + + ''' + + if from_dataframe: + data = running_speed['speed'].values + timestamps = running_speed['timestamps'].values + else: + data = running_speed.values + timestamps = running_speed.timestamps + + running_speed_series = pynwb.base.TimeSeries( + name=name, + data=data, + timestamps=timestamps, + unit=unit) + + if 'running' in nwbfile.processing: + running_mod = nwbfile.processing['running'] + else: + running_mod = ProcessingModule('running', + 'Running speed processing module') + nwbfile.add_processing_module(running_mod) + + running_mod.add_data_interface(running_speed_series) + + return nwbfile + + +def add_stimulus_template(nwbfile: NWBFile, + stimulus_template: StimulusTemplate): + unwarped_images = [] + warped_images = [] + image_names = [] + for image_name, image_data in stimulus_template.items(): + image_names.append(image_name) + unwarped_images.append(image_data.unwarped) + warped_images.append(image_data.warped) + + image_index = np.zeros(len(image_names)) + image_index[:] = np.nan + + visual_stimulus_image_series = \ + StimulusTemplateExtension( + name=stimulus_template.image_set_name, + data=warped_images, + unwarped=unwarped_images, + control=list(range(len(image_names))), + control_description=image_names, + unit='NA', + format='raw', + timestamps=image_index) + + nwbfile.add_stimulus_template(visual_stimulus_image_series) + return nwbfile + + +def create_stimulus_presentation_time_interval( + name: str, description: str, + columns_to_add: Iterable) -> pynwb.epoch.TimeIntervals: + column_descriptions = { + "stimulus_name": "Name of stimulus", + "stimulus_block": ("Index of contiguous presentations of " + "one stimulus type"), + "temporal_frequency": "Temporal frequency of stimulus", + "x_position": "Horizontal position of stimulus on screen", + "y_position": "Vertical position of stimulus on screen", + "mask": "Shape of mask applied to stimulus", + "opacity": "Opacity of stimulus", + "phase": "Phase of grating stimulus", + "size": "Size of stimulus (see ‘units’ field for units)", + "units": "Units of stimulus size", + "stimulus_index": "Index of stimulus type", + "orientation": "Orientation of stimulus", + "spatial_frequency": "Spatial frequency of stimulus", + "frame": "Frame of movie stimulus", + "contrast": "Contrast of stimulus", + "Speed": "Speed of moving dot field", + "Dir": "Direction of stimulus motion", + "coherence": "Coherence of moving dot field", + "dotLife": "Longevity of individual dots", + "dotSize": "Size of individual dots", + "fieldPos": "Position of moving dot field", + "fieldShape": "Shape of moving dot field", + "fieldSize": "Size of moving dot field", + "nDots": "Number of dots in moving dot field" + } + + columns_to_ignore = {'start_time', 'stop_time', 'tags', 'timeseries'} + + interval = pynwb.epoch.TimeIntervals(name=name, + description=description) + + for column_name in columns_to_add: + if column_name not in columns_to_ignore: + description = column_descriptions.get( + column_name, "No description") + interval.add_column(name=column_name, description=description) + + return interval + + +def add_stimulus_presentations(nwbfile, stimulus_table, + tag='stimulus_time_interval'): + """Adds a stimulus table (defining stimulus characteristics for each + time point in a session) to an nwbfile as TimeIntervals. + + Parameters + ---------- + nwbfile : pynwb.NWBFile + stimulus_table: pd.DataFrame + Each row corresponds to an interval of time. Columns define the + interval (start and stop time) and its characteristics. + Nans in columns with string data will be replaced with the empty + strings. + Required columns are: + start_time :: the time at which this interval started + stop_time :: the time at which this interval ended + tag : str, optional + Each interval in an nwb file has one or more tags. This string will be + applied as a tag to all TimeIntervals created here + + Returns + ------- + nwbfile : pynwb.NWBFile + + """ + stimulus_table = stimulus_table.copy() + ts = nwbfile.processing['stimulus'].get_data_interface('timestamps') + possible_names = {'stimulus_name', 'image_name'} + stimulus_name_column = get_column_name(stimulus_table.columns, + possible_names) + stimulus_names = stimulus_table[stimulus_name_column].unique() + + for stim_name in sorted(stimulus_names): + specific_stimulus_table = stimulus_table[stimulus_table[stimulus_name_column] == stim_name] # noqa: E501 + # Drop columns where all values in column are NaN + cleaned_table = specific_stimulus_table.dropna(axis=1, how='all') + # For columns with mixed strings and NaNs, fill NaNs with 'N/A' + for colname, series in cleaned_table.items(): + types = set(series.map(type)) + if len(types) > 1 and str in types: + series.fillna('N/A', inplace=True) + cleaned_table[colname] = series.transform(str) + + interval_description = (f"Presentation times and stimuli details " + f"for '{stim_name}' stimuli. " + f"\n" + f"Note: image_name references " + f"control_description in stimulus/templates") + presentation_interval = create_stimulus_presentation_time_interval( + name=f"{stim_name}_presentations", + description=interval_description, + columns_to_add=cleaned_table.columns + ) + + for row in cleaned_table.itertuples(index=False): + row = row._asdict() + + presentation_interval.add_interval(**row, tags=tag, timeseries=ts) + + nwbfile.add_time_intervals(presentation_interval) + + return nwbfile + + +def add_invalid_times(nwbfile, epochs): + """ + Write invalid times to nwbfile if epochs are not empty + Parameters + ---------- + nwbfile: pynwb.NWBFile + epochs: list of dicts + records of invalid epochs + + Returns + ------- + pynwb.NWBFile + """ + table = setup_table_for_invalid_times(epochs) + + if not table.empty: + container = pynwb.epoch.TimeIntervals('invalid_times') + + for index, row in table.iterrows(): + + container.add_interval(start_time=row['start_time'], + stop_time=row['stop_time'], + tags=row['tags'], + ) + + nwbfile.invalid_times = container + + return nwbfile + + +def setup_table_for_invalid_times(invalid_epochs): + """ + Create table with invalid times if invalid_epochs are present + + Parameters + ---------- + invalid_epochs: list of dicts + of invalid epoch records + + Returns + ------- + pd.DataFrame of invalid times if epochs are not empty, + otherwise return None + """ + + if invalid_epochs: + df = pd.DataFrame.from_dict(invalid_epochs) + + start_time = df['start_time'].values + stop_time = df['end_time'].values + tags = [[_type, str(_id), label] + for _type, _id, label + in zip(df['type'], df['id'], df['label'])] + + table = pd.DataFrame({'start_time': start_time, + 'stop_time': stop_time, + 'tags': tags} + ) + table.index.name = 'id' + + else: + table = pd.DataFrame() + + return table + + +def setup_table_for_epochs(table, timeseries, tag): + table = table.copy() + indices = np.searchsorted(timeseries.timestamps[:], + table['start_time'].values) + if len(indices > 0): + diffs = np.concatenate([np.diff(indices), + [table.shape[0] - indices[-1]]]) + else: + diffs = [] + + table['tags'] = [(tag,)] * table.shape[0] + table['timeseries'] = [[[indices[ii], diffs[ii], timeseries]] + for ii in range(table.shape[0])] + return table + + +def add_stimulus_timestamps(nwbfile, stimulus_timestamps, + module_name='stimulus'): + stimulus_ts = TimeSeries( + data=stimulus_timestamps, + name='timestamps', + timestamps=stimulus_timestamps, + unit='s' + ) + + stim_mod = ProcessingModule(module_name, 'Stimulus Times processing') + + nwbfile.add_processing_module(stim_mod) + stim_mod.add_data_interface(stimulus_ts) + + return nwbfile + + +def add_trials(nwbfile, trials, description_dict={}): + order = list(trials.index) + for _, row in trials[['start_time', 'stop_time']].iterrows(): + row_dict = row.to_dict() + nwbfile.add_trial(**row_dict) + + for c in trials.columns: + if c in ['start_time', 'stop_time']: + continue + index, data = dict_to_indexed_array(trials[c].to_dict(), order) + if data.dtype == '<U1': # data type is composed of unicode characters + data = trials[c].tolist() + if not len(data) == len(order): + if len(data) == 0: + data = [''] + nwbfile.add_trial_column( + name=c, + description=description_dict.get( + c, 'NOT IMPLEMENTED: %s' % c), + data=data, + index=index) + else: + nwbfile.add_trial_column( + name=c, + description=description_dict.get( + c, 'NOT IMPLEMENTED: %s' % c), + data=data) + + +def add_licks(nwbfile, licks): + + lick_timeseries = TimeSeries( + name='licks', + data=licks.frame.values, + timestamps=licks.timestamps.values, + description=('Timestamps and stimulus presentation ' + 'frame indices for lick events'), + unit='N/A' + ) + + # Add lick interface to nwb file, by way of a processing module: + licks_mod = ProcessingModule('licking', + 'Licking behavior processing module') + licks_mod.add_data_interface(lick_timeseries) + nwbfile.add_processing_module(licks_mod) + + return nwbfile + + +def add_rewards(nwbfile, rewards_df): + reward_volume_ts = TimeSeries( + name='volume', + data=rewards_df.volume.values, + timestamps=rewards_df['timestamps'].values, + unit='mL' + ) + + autorewarded_ts = TimeSeries( + name='autorewarded', + data=rewards_df.autorewarded.values, + timestamps=reward_volume_ts.timestamps, + unit='mL' + ) + + rewards_mod = ProcessingModule('rewards', + 'Licking behavior processing module') + rewards_mod.add_data_interface(reward_volume_ts) + rewards_mod.add_data_interface(autorewarded_ts) + nwbfile.add_processing_module(rewards_mod) + + return nwbfile + + +def add_image(nwbfile, image_data, image_name, module_name, + module_description, image_api=None): + + description = '{} image at pixels/cm resolution'.format(image_name) + + if image_api is None: + image_api = ImageApi + + if isinstance(image_data, sitk.Image): + data, spacing, unit = ImageApi.deserialize(image_data) + elif isinstance(image_data, Image): + data = image_data.data + spacing = image_data.spacing + unit = image_data.unit + else: + raise ValueError("Not a supported image_data type: " + f"{type(image_data)}") + + assert spacing[0] == spacing[1] and len(spacing) == 2 and unit == 'mm' + + if module_name not in nwbfile.processing: + ophys_mod = ProcessingModule(module_name, module_description) + nwbfile.add_processing_module(ophys_mod) + else: + ophys_mod = nwbfile.processing[module_name] + + image = GrayscaleImage(image_name, + data, + resolution=spacing[0] / 10, + description=description) + + if 'images' not in ophys_mod.containers: + images = Images(name='images') + ophys_mod.add_data_interface(images) + else: + images = ophys_mod['images'] + images.add_image(image) + + return nwbfile + + +def add_max_projection(nwbfile, max_projection, image_api=None): + add_image(nwbfile, + max_projection, + 'max_projection', + 'ophys', + 'Ophys processing module', + image_api=image_api) + + +def add_average_image(nwbfile, average_image, image_api=None): + add_image(nwbfile, + average_image, + 'average_image', + 'ophys', + 'Ophys processing module', + image_api=image_api) + + +def add_segmentation_mask_image(nwbfile, + segmentation_mask_image, + image_api=None): + add_image(nwbfile, + segmentation_mask_image, + 'segmentation_mask_image', + 'ophys', + 'Ophys processing module', + image_api=image_api) + + +def add_stimulus_index(nwbfile, stimulus_index, nwb_template): + + image_index = IndexSeries( + name=nwb_template.name, + data=stimulus_index['image_index'].values, + unit='None', + indexed_timeseries=nwb_template, + timestamps=stimulus_index['start_time'].values) + + nwbfile.add_stimulus(image_index) + + +def add_metadata(nwbfile, metadata: dict, behavior_only: bool): + # Rename or reformat incoming metadata fields to conform with pynwb fields + tmp_metadata = metadata.copy() + tmp_metadata["subject_id"] = tmp_metadata.pop("mouse_id") + tmp_metadata["genotype"] = tmp_metadata.pop("full_genotype") + + if not behavior_only: + imaging_plane_group = metadata["imaging_plane_group"] + if imaging_plane_group is None: + tmp_metadata["imaging_plane_group"] = -1 + else: + tmp_metadata["imaging_plane_group"] = imaging_plane_group + + metadata_clean = CompleteOphysBehaviorMetadataSchema().dump(tmp_metadata) + + # Subject related metadata should be saved to our BehaviorSubject + # (augmented pyNWB 'Subject') NWB class + subject_fields = {"age_in_days", "driver_line", "genotype", + "subject_id", "reporter_line", "sex"} + subject_metadata = {k: v for k, v in metadata_clean.items() + if k in subject_fields} + for subject_key in subject_metadata.keys(): + metadata_clean.pop(subject_key, None) + + BehaviorSubject = load_pynwb_extension(SubjectMetadataSchema, + 'ndx-aibs-behavior-ophys') + + def _get_age(age_in_days: Optional[int]) -> Optional[str]: + """Convert numeric age_in_days to ISO 8601""" + if age_in_days is None: + return 'null' + return f'P{age_in_days}D' + + nwb_subject = BehaviorSubject( + description="A visual behavior subject with a LabTracks ID", + age=_get_age(age_in_days=subject_metadata['age_in_days']), + driver_line=subject_metadata["driver_line"], + genotype=subject_metadata["genotype"], + subject_id=str(subject_metadata["subject_id"]), + reporter_line=subject_metadata["reporter_line"], + sex=subject_metadata["sex"], + species='Mus musculus') + nwbfile.subject = nwb_subject + + # Remove metadata that will go into pyNWB base classes + for key in OphysBehaviorMetadataSchema.neurodata_skip: + metadata_clean.pop(key, None) + + # Remaining metadata can go into our custom extension + new_metadata_dict = {} + for key, val in metadata_clean.items(): + if isinstance(val, list): + new_metadata_dict[key] = np.array(val) + elif isinstance(val, (datetime.datetime, uuid.UUID)): + new_metadata_dict[key] = str(val) + else: + new_metadata_dict[key] = val + + if behavior_only: + BehaviorMetadata = load_pynwb_extension(BehaviorMetadataSchema, + 'ndx-aibs-behavior-ophys') + nwb_metadata = BehaviorMetadata(name='metadata', **new_metadata_dict) + else: + OphysBehaviorMetadata = load_pynwb_extension( + OphysBehaviorMetadataSchema, 'ndx-aibs-behavior-ophys') + nwb_metadata = OphysBehaviorMetadata(name='metadata', + **new_metadata_dict) + nwbfile.add_lab_meta_data(nwb_metadata) + + +def add_task_parameters(nwbfile, task_parameters): + + OphysBehaviorTaskParameters = load_pynwb_extension( + BehaviorTaskParametersSchema, 'ndx-aibs-behavior-ophys' + ) + task_parameters_clean = BehaviorTaskParametersSchema().dump( + task_parameters + ) + + new_task_parameters_dict = {} + for key, val in task_parameters_clean.items(): + if isinstance(val, list): + new_task_parameters_dict[key] = np.array(val) + else: + new_task_parameters_dict[key] = val + nwb_task_parameters = OphysBehaviorTaskParameters( + name='task_parameters', **new_task_parameters_dict) + nwbfile.add_lab_meta_data(nwb_task_parameters) + + +def add_cell_specimen_table(nwbfile: NWBFile, + cell_specimen_table: pd.DataFrame, + session_metadata: dict): + """ + This function takes the cell specimen table and writes the ROIs + contained within. It writes these to a new NWB imaging plane + based off the previously supplied metadata + + Parameters + ---------- + nwbfile: NWBFile + this is the in memory NWBFile currently being written to which ROI data + is added + cell_specimen_table: pd.DataFrame + this is the DataFrame containing the cells segmented from a ophys + experiment, stored in json file and loaded. + example: /home/nicholasc/projects/allensdk/allensdk/test/ + brain_observatory/behavior/cell_specimen_table_789359614.json + session_metadata: dict + Dictionary containing cell_specimen_table related metadata. Should + include at minimum the following fields: + "emission_lambda", "excitation_lambda", "indicator", + "targeted_structure", and ophys_frame_rate" + + Returns + ------- + nwbfile: NWBFile + The altered in memory NWBFile object that now has a specimen table + """ + cell_specimen_metadata = NwbOphysMetadataSchema().load( + session_metadata, unknown=marshmallow.EXCLUDE) + cell_roi_table = cell_specimen_table.reset_index().set_index('cell_roi_id') + + # Device: + device_name: str = nwbfile.lab_meta_data['metadata'].equipment_name + if device_name.startswith("MESO"): + device_config = { + "name": device_name, + "description": "Allen Brain Observatory - Mesoscope 2P Rig" + } + else: + device_config = { + "name": device_name, + "description": "Allen Brain Observatory - Scientifica 2P Rig", + "manufacturer": "Scientifica" + } + nwbfile.create_device(**device_config) + device = nwbfile.get_device(device_name) + + # FOV: + fov_width = nwbfile.lab_meta_data['metadata'].field_of_view_width + fov_height = nwbfile.lab_meta_data['metadata'].field_of_view_height + imaging_plane_description = "{} field of view in {} at depth {} um".format( + (fov_width, fov_height), + cell_specimen_metadata['targeted_structure'], + nwbfile.lab_meta_data['metadata'].imaging_depth) + + # Optical Channel: + optical_channel = OpticalChannel( + name='channel_1', + description='2P Optical Channel', + emission_lambda=cell_specimen_metadata['emission_lambda']) + + # Imaging Plane: + imaging_plane = nwbfile.create_imaging_plane( + name='imaging_plane_1', + optical_channel=optical_channel, + description=imaging_plane_description, + device=device, + excitation_lambda=cell_specimen_metadata['excitation_lambda'], + imaging_rate=cell_specimen_metadata['ophys_frame_rate'], + indicator=cell_specimen_metadata['indicator'], + location=cell_specimen_metadata['targeted_structure']) + + # Image Segmentation: + image_segmentation = ImageSegmentation(name="image_segmentation") + + if 'ophys' not in nwbfile.processing: + ophys_module = ProcessingModule('ophys', 'Ophys processing module') + nwbfile.add_processing_module(ophys_module) + else: + ophys_module = nwbfile.processing['ophys'] + + ophys_module.add_data_interface(image_segmentation) + + # Plane Segmentation: + plane_segmentation = image_segmentation.create_plane_segmentation( + name='cell_specimen_table', + description="Segmented rois", + imaging_plane=imaging_plane) + + for col_name in cell_roi_table.columns: + # the columns 'roi_mask', 'pixel_mask', and 'voxel_mask' are + # already defined in the nwb.ophys::PlaneSegmentation Object + if col_name not in ['id', 'mask_matrix', 'roi_mask', + 'pixel_mask', 'voxel_mask']: + # This builds the columns with name of column and description + # of column both equal to the column name in the cell_roi_table + plane_segmentation.add_column( + col_name, + CELL_SPECIMEN_COL_DESCRIPTIONS.get( + col_name, + "No Description Available")) + + # go through each roi and add it to the plan segmentation object + for cell_roi_id, table_row in cell_roi_table.iterrows(): + + # NOTE: The 'roi_mask' in this cell_roi_table has already been + # processing by the function from + # allensdk.brain_observatory.behavior.session_apis.data_io.ophys_lims_api + # get_cell_specimen_table() method. As a result, the ROI is stored in + # an array that is the same shape as the FULL field of view of the + # experiment (e.g. 512 x 512). + mask = table_row.pop('roi_mask') + + csid = table_row.pop('cell_specimen_id') + table_row['cell_specimen_id'] = -1 if csid is None else csid + table_row['id'] = cell_roi_id + plane_segmentation.add_roi(image_mask=mask, **table_row.to_dict()) + + return nwbfile + + +def add_dff_traces(nwbfile, dff_traces, ophys_timestamps): + dff_traces = dff_traces.reset_index().set_index('cell_roi_id')[['dff']] + + ophys_module = nwbfile.processing['ophys'] + # trace data in the form of rois x timepoints + trace_data = np.array([dff_traces.loc[cell_roi_id].dff + for cell_roi_id in dff_traces.index.values]) + + cell_specimen_table = nwbfile.processing['ophys'].data_interfaces['image_segmentation'].plane_segmentations['cell_specimen_table'] # noqa: E501 + roi_table_region = cell_specimen_table.create_roi_table_region( + description="segmented cells labeled by cell_specimen_id", + region=slice(len(dff_traces))) + + # Create/Add dff modules and interfaces: + assert dff_traces.index.name == 'cell_roi_id' + dff_interface = DfOverF(name='dff') + ophys_module.add_data_interface(dff_interface) + + dff_interface.create_roi_response_series( + name='traces', + data=trace_data.T, # Should be stored as timepoints x rois + unit='NA', + rois=roi_table_region, + timestamps=ophys_timestamps) + + return nwbfile + + +def add_corrected_fluorescence_traces(nwbfile, corrected_fluorescence_traces): + corrected_fluorescence_traces = \ + corrected_fluorescence_traces.reset_index().set_index( + 'cell_roi_id')[['corrected_fluorescence']] + + # Create/Add corrected_fluorescence_traces modules and interfaces: + assert corrected_fluorescence_traces.index.name == 'cell_roi_id' + ophys_module = nwbfile.processing['ophys'] + # trace data in the form of rois x timepoints + f_trace_data = np.array( + [corrected_fluorescence_traces.loc[cell_roi_id].corrected_fluorescence + for cell_roi_id in corrected_fluorescence_traces.index.values]) + + roi_table_region = nwbfile.processing['ophys'].data_interfaces['dff'].roi_response_series['traces'].rois # noqa: E501 + ophys_timestamps = ophys_module.get_data_interface( + 'dff').roi_response_series['traces'].timestamps + f_interface = Fluorescence(name='corrected_fluorescence') + ophys_module.add_data_interface(f_interface) + + f_interface.create_roi_response_series( + name='traces', + data=f_trace_data.T, # Should be stored as timepoints x rois + unit='NA', + rois=roi_table_region, + timestamps=ophys_timestamps) + + return nwbfile + + +def add_motion_correction(nwbfile, motion_correction): + + ophys_module = nwbfile.processing['ophys'] + ophys_timestamps = ophys_module.get_data_interface( + 'dff').roi_response_series['traces'].timestamps + + t1 = TimeSeries( + name='ophys_motion_correction_x', + data=motion_correction['x'].values, + timestamps=ophys_timestamps, + unit='pixels' + ) + + t2 = TimeSeries( + name='ophys_motion_correction_y', + data=motion_correction['y'].values, + timestamps=ophys_timestamps, + unit='pixels' + ) + + ophys_module.add_data_interface(t1) + ophys_module.add_data_interface(t2) diff --git a/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5be6464f2ea0fd41b044a43143a80c6f36f8513 GIT binary patch literal 27883 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 D?P*_~ literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/__pycache__/behavior_ophys_nwb_extension_builder.cpython-37.pyc b/brain_observatory/nwb/__pycache__/behavior_ophys_nwb_extension_builder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32df5cb3c4b9897c6a53929de6cdb930765a99f0 GIT binary patch literal 828 zcmaJ;O>fgc6!iKlCT-eM6*$mCsvb~;k{q}pgi0!IP!K6XT3K4Hy)Vf&_S)KY(xf-U z5%C|WIPsT!<-}j$#M_V{6$C4Jy!P&!H#2Y0YBe2P>dSk6;yKPY`>|O8Zcgwq3k2Z^ zk~!4A-HhZeb#sq;xljE(pg|tekk~UXYvd7)hy%BTKXr8_0@?&00&u~Da2(Jra4xn# zw^q0VyVvBJ&^?G?3!1Pe!cQL7-WH7y1o_C&=|tbLyK~kF>bnD&@VPAXOQ^Wu6(6P( z$a#JLRXJIje;gie{-1L*ea$t`p#p8zrFVw2<O0&_55}Vv<MSn)Yo1P}8o!a_n^!ud zK2A083Rt;RmkEPK1<J@mv5_uvW>(Tn9Wj=3sTjMur^KSmWn#L?+D5mqx{)a|d=5-V zeRX_lIgzDZjM``K2JPRp?X<|t47DG1_G`B=^dZkO>?o$aMB5HUVnEM%Rp@1J)1kMP zp<Rqn<9r?MTd<SWAp(8y9~QLL!?adW>jvJoZWIQ{SRIxcMsh(L8>4>7t4ZD9iTSlb zH}<M68OaPwXq3*hwl3?S)KXPn9ldXLSorbr^l|(a4VaiuxacMPlB;F>O!2f(f<KBu z%}rdCXgEb&1sA`NNo-^V-4chy$AGo#Ncw+8(nmA>O)P9x&u)$_naNCm?v=|rdXg7n cmcdhk(#!!u<Q|6Ge&qSCPka)(2V{r*1W$zwD*ylh literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/__pycache__/metadata.cpython-37.pyc b/brain_observatory/nwb/__pycache__/metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c3c2ad9c50bc68f442aec3b3c4ff3806bd52348 GIT binary patch literal 3114 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 AdH?_b literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/__pycache__/nwb_api.cpython-37.pyc b/brain_observatory/nwb/__pycache__/nwb_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c0146459674dfe7b737439b8fb5227005201857 GIT binary patch literal 3803 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/__pycache__/nwb_utils.cpython-37.pyc b/brain_observatory/nwb/__pycache__/nwb_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abe5717931d5dff9b862bc8807104ac6a2db2713 GIT binary patch literal 2666 zcmZWqUvDEt5}%$KkH=#t8<y}V!0F~z2%Uk=BJlu<5Mo&!2pty?><MXP$v1X);@Qj} ztGm5fhw%gKz48eTq~z}Dz5$<QUU}NDfOHbSs<FM<V<K0&tE;Q3e^veKk9T$=2VeQ0 z@6tc_9p@LCY`zW#AK_;#gmk3HokAp{a1&S1+|9khPkbJGd8Y`HfX9B`Ey5%$dPz?> zDpGwlkewer8OZKG{bWZ8HNam_hClkUCnM-~q3gk_537OPf#!zX{n{Dcc!J2z&~3WM z-+cT@maAs(OI=NsF<E)~w@NN@H55(oS&^P9gVFA%I$fG+nk!aeW5|QM^Q`H#DzAxb zI?2^|TIHtMomcQh(=siTX#%b6LYGsQ;^OnyzkB#^-iNSG?K~DM*NWP`bZc=XF!QWe zdyj<_XRdk2`qHhve>p$7kHz<*_M~^<;3$6j2AoDQzWcMx#3ze#YO|`0+lVGkV`Q`_ z%9t{FJ3h@GsuD_0Ha^enEMAmnWp!S%k88HrT1r?NW#j53-kj*VI}@MJvgs^NwTjiF zxtdxf57)V<b%<*o*EuN}n_0EUWjuk=OvP21FF8H<E^V5Xu*lkcX!+L0^{uB#FsyB; zqj{>+qK(GrAF<Q+fNgXW+Y0AMHF7<vG_P;ZL#`Nzb;z~9&3aqG)+a~B?$jbvI)HkV z8N1%hUS(=GfExzlsI5c0|0L5eSEbcUf|L%Il~!p3<fvv7WzQALLkpYu3{2~bip(Ds zhHTn=)}A&;T~Ce8ibcM_(WxytmnQ<9cJbbQQf%u5^jk-p!e-?&Nxcok7NtCjHSHdD z8V?Q8_&E;V46bM2c)2Q@@ULq57p*Hj^mT|0x(AU&ZE|C5O$O^RC;wkZKL>+f=l70A ze>Xs4l+IFlI7!dbayhzNrsxQnzB^LoLo=%8sx(u`YCc<<(dXG@WHPI6&(rA{-PBQ< zBLySR?o2egXk1O;@nLE!y}VPNPv|#Z*eo}P^JR16R9R{lTn#QUSjsU>T05cG6$7#B z>gS;w`b`%bPlzRa%DD*&W(ZBjQxAeZIx7*|J^aiuMD09qYWKjo#QnVzwK#BAxXlmT zl@IByI(0|7`%WuQ-Bn=y%TDdrf%LAtRoD6tg1RgHAH=F#cX7`<$4!tiA3dSCjaw8T zCNC>ahutQcZ`mukN#~+A9CL9_(kb$$c@t@6a9-*(9gvS6;K|ZFyHH7As_kSL>U}Kh z7f8Gakq`i5gwn5(>JJc2*8p{}rGAA}RKr%>q{SZPz}d!_nq3G-?27<@doE$CNk8;B zP7|>u=e!vc&Rb}yGL$bv`!fa-)F|Ccz<VVCrx*dwRREv>-hl(@A2?^O{s3eefId4k z2ABb8^dsvMd7?PpSy%tVq8PIK*j<IS1Ng%$A)GRz)f%2wp$%%c?zDbo_^MOmW%<Eh z;dQCQ2VHphw+&?^`zRAMm%Tb-4`B^0_D6Me8Pz?~$pMPEbMZgEh<Bwlaf?sO$CG6{ zWe{3cCJ5F_9)iKvZ5XkSFNyUOkq1w2Z$F-HOk2K)H(QAZQwesZPQrw3pTf^m+H#+m ziEXHJu31qkTdU95f>o^hiXXXW@?rfkD24|~hi~ph{OxM(9!xsV9;w{inHG2+w*5(5 zqp9#u=*iRv5En0fLDxQh+UxQ9BEF2(q1*N)HS$zvbMEq&XhCoz9}oLY0PZhRt8YNv z?A|r#crs(U(yv0P={6@X0HN{IDC2b$y4^%%?F*%irbj%vNyg7!x1>iphHuz!uhO5$ z`7Ma1-+E)p(XW%5@6;b@&0mz6O?r$GMQu9lMAI?;|BCHxV~lMzM!DaDk$D5cdCnJ+ z8@V^di*6)*+_?c}zHmh(LTDn)L!sY<<?(PY>CBhdtr=!Me#8n;FyP@M_FF}p3!`v* zL$rs#Bih4>nxzl3N*}WQIGtxqHoA*=dWXaS0<VbG%&$xZoXxc(GM_M&gdenkeMqS= Rlk9;%2JW8cioN~){%<+d>b(E} literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/__pycache__/schemas.cpython-37.pyc b/brain_observatory/nwb/__pycache__/schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72ca37c2082ae15aa5a4abbbdba3e10f5c3bf93b GIT binary patch literal 663 zcmZWnJCD>b5VrFoI_*kuLZYI(CI#67DufV^f(9XUd)HWztVulVTAMgIJK5Ei2wHvx z6@Mu$6@P*1#)<X-F_K50zwvzYkl!qqXN=5z{|v|(`{^$yiwL};<DQXIO!1mETyXAj zPzOyY!X^??6N{L$cT9yU`pQ&<@t05}DqgcJ`9+y5<72Y!tu~u193NC$taj2OC<#@C z&W-0Yb+Ed}6Suqs?I>eSu?8wHbF#a(E{H)UxMCu}P;rb@@GTJWUpP@AwGoYvE(c@0 zT!*MWLcevh@KqL!sl}T?TU2AZhgvJ>@k4fROr<o?pp@g8lufIK+T(?kHv`mj#0J!X z4atdfI~S17SCAc*5Rd=mdflMwq3PTd{=w|Rr+fF?ynS9=JG8EVEvUSN1DIp++CbGB z1y2h!dsnm_8ds5TyY0~x?{!%?TG^8hsvT^Qa_gF2sNJfxpp9%xQrtt|+T+R`%9WdT z>GJMq6DsPD^UF;6f=>*ME$)Ne%n$QV8f)dIAw_=D&i~WS?=s}j>st33-Lw?z#ck}J Zuk~l#87+w$(--q<U()BByIBMe!&|F&yhi{4 literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py b/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py new file mode 100644 index 0000000000..3857c59d66 --- /dev/null +++ b/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py @@ -0,0 +1,24 @@ +import os + +from allensdk.brain_observatory.behavior.schemas import ( + BehaviorMetadataSchema, + OphysBehaviorMetadataSchema, + BehaviorTaskParametersSchema, + SubjectMetadataSchema, OphysEyeTrackingRigMetadataSchema +) +from allensdk.brain_observatory.nwb.metadata import ( + create_pynwb_extension_from_schemas +) + +if __name__ == "__main__": + + # Run this module to regenerate the extension yaml files into this dir: + prefix = 'ndx-aibs-behavior-ophys' + schemas = [ + BehaviorTaskParametersSchema, SubjectMetadataSchema, + BehaviorMetadataSchema, OphysBehaviorMetadataSchema, + OphysEyeTrackingRigMetadataSchema] + + curr_dir = os.path.abspath(os.path.dirname(__file__)) + create_pynwb_extension_from_schemas(schemas, prefix, save_dir=curr_dir) + print("Creation of NWB extension complete!") diff --git a/brain_observatory/nwb/eye_tracking/__init__.py b/brain_observatory/nwb/eye_tracking/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/nwb/eye_tracking/__pycache__/__init__.cpython-37.pyc b/brain_observatory/nwb/eye_tracking/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9887b169aed8039142de6e55f905c8132e84d517 GIT binary patch literal 211 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG@%Wxmypz!fQ!%K<SV)Q2yRYZ2l0dN zcgOMFaoaSVFcRKxFx1z8pAu@;<S-&Ac4X7!@L+xz|M9u*7W@>n4;(5`nS>rN@(n^^ zQNf&R>;kt=V<?E$RWb0rkvy1I&m0srl$v&%h7zjIr3Zt;O1juVYkkbIm${Bww4TBS Z%UlS9rWGP{@i|_et-3UNHGK6ZvoC|>J`w-` literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/eye_tracking/__pycache__/extension_builder.cpython-37.pyc b/brain_observatory/nwb/eye_tracking/__pycache__/extension_builder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3d73a86f27ef876de52b1709be46e943b27ee0 GIT binary patch literal 2324 zcma)8OK%%D5Z<RG%a8bxHqN6Bo2F?tjpd{PdI$nHacl%ZQ=@=Wv{<-UaF>)sdw01d zDa%^ehr%h^9(3rrmjpfaFY($_{z6V2t}NL>a_BDj7?L|P{N|gH)@Ns%7Ciaizu+gc zmi4a@#*YJ&htT92bi^WdYK1n8PU>WC=w@E%Wq#;qwXkMe#0~4jBmN63Y|trE+jGQy z+Bmjg$KJMr`fJc(Z3UiQ+WKLA3ujaoIHBu3mJ%xTG(9M|P?0QXqG#a56Ty4MwvpyQ z+Q14+s*GGN=j338rYS2VU7-WIq6AL%Sl&sD1@m~&&Ovjb$(C(d3VcxZU*NfNl&id5 zpSUk;#Cv5QJID59%|BfuwV{7x9a_6}QYQ^EHFWHe)O<^t9!si0X5i$knj&-L9GNEz zWRWZleUQ(S56Fk)0$Cn<AYBCM(nPup(v^wy5lA0Tq^lsIk<_V?Plnzf7FfAPnh=2| z`SdrdZIkQdvlk6=W5a@5G{`jhoZKYA(Cye4EOKjDJF<Vb4(*O}<f!KE^vjv5pRM{i zb?%jI-XmAdA6kdbp?mB?tSpGt7hC05+lmW{RF|R(YQ++qB0w9B(MG(dik?EejW#GP zp5gd$PnG_i*4@^fa(bQSXoDqPMa3KYb~zuDk?=5$(^iM?2flU*Pqdc<6Lfu_3dwk` zYq+PnT<ChjbA=NX&Tbc2F`RBw!Kl<;0$v5So-&_R1PZ4&2lV*~1H$HWmeJAKaCURV zk&#%gJk8r&WT1`b2*=<(!ujZOlA?_71A`C;N00&?+9N<YUC(<NSWe0(&jE>>2e;86 zKndr9upBEY&Fu|F3C-cAW9fvP2rEQ!(ybJtg0oz;0w<gTosqF2ORrMsY`r#_7Wkq8 zgZ7CU6jan<9(sgjQv0%t3vdYwinZTPIacMpi4j=5jrvS=Q4SZ{$7v7zVmV6L9!&=* zPFcQJxgY}@@~<)?7C?JtLM$3P4Wl{|xL<zxKD`_X+QEV##owb=`+Y`Kx16sA1Hy?8 zUF%ZT>8f&JG@jWCeVlhvTHdGzz|dediWg!M39bNMg5m+XS#((dWn(d?J;6;>B7;vv zX#1TtmM0_J8s;1n3>hwNj<lX(N%?g}Zixt0n5AImEnc%TJUQWbTkz}*%M&Om)nmdo z1#JnMyartdio{Qsj%;O_#5=TKnsRBsa)>i@|8#!#Ah}#^M{jHtxMCST7)8UxI&g%k zTe>c2kwRq*9PPC3X!`)@zH|ajB&#&2s^mY`n_nN_-}xSv<PPp)(u#2(=YyR`Ifm>Z z_}&i9_vH>RXf6}zdC?unoo6iGkxbDQsJ?r+L*d&rg%f0NH5QoV5syLRK8ExktmgfA z6|jlMIloE|6r6<&isDh>ZWV(!%?BxyD&bkN_6^)X8dPdtxtxKz)`OHo<&bMI86OJV zaOSMmaIWYTES*>hFGH5+6sM7(?UW`aV^23{M!b$HUYBc6bEquFTSKmXmqIo|217?t zA4`N$A$W}Al%6C4)BxB9inRrlkawd{6Boe!)7a=4AR6waDl#RfVwbLU%#V`{7KFK~ zp4xi!?dJA(j~;Jo&s<Ww87{Odm4M7uf)y|nDO2GL@H6cZz|$nSiMH^K0*6CogF4sM zbsR%ggNe5b<wDm96IFq1L{S@<8b!kVrUhQu%;h));l(jK&VpKTB%I4>Kbqu>)Xfp0 zBhV|Z8cnwN*tmh9)1C>Kp|jkF&T<^vu{~(#?Mv>Q4R5sqtK$*&YLof@oz3}1@5$>l zz43SRwT64e7I%#&a9!g|6a`IP=dxuW5w~C`Y!(9`Wy}0csKBrAIE7MNheHz`20DPu gT=YzbK-7%~87IAzu9;Mp<}XmgS#~|Q@nggJ4_7RxSpWb4 literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/eye_tracking/__pycache__/ndx_ellipse_eye_tracking.cpython-37.pyc b/brain_observatory/nwb/eye_tracking/__pycache__/ndx_ellipse_eye_tracking.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99ce772079731af98a7a26f395aa10e1390f06da GIT binary patch literal 546 zcmZ`#v2NQi5G5(eRvfr3I(6;TdayloD~h5`kuAuQbP)s)C-G`CrbvNQlPFt|H6M|n zQ-6tTru;&to>Hgi5(0dD1mC@TyuImk!f4rFm+)RNb~jv}Rz~Ct?Qlq-nBs;N!zm1J zL?N1_NH{}wlHO#GIKuHQSIMm?auk?fae7Tus<JCl><}A0vWenHY&O0pPj)yH@uhK~ zq=g1U3pIwgv%*f+212-aXVv)}jnQquIrcd3Jk%R)SBro8MGuXM)BV4qBlH@>#hd5q z;_Iz&zsKXP*K9Wm7mBRy?OEk%2+Su0F>Rq+$MnQ$8^=ofp=Hda{Gkm>S-hnla+^(3 zHu;oIh8F9g)~AElFvZ`@?+$!`hwE=2%kKewC}9n1QNbD5zWi#Tc2>cM676XyU5hr< zgsxrpp*+x48FYtp8qo$;NVUe0LT#3n2W_RR$ng|9=ldmnWBGre<#S0FZ6EVbjZ;4j We&&=dydcQ=t8~OCe3a$Mg#Q7M#i|Sd literal 0 HcmV?d00001 diff --git a/brain_observatory/nwb/eye_tracking/extension_builder.py b/brain_observatory/nwb/eye_tracking/extension_builder.py new file mode 100644 index 0000000000..4b28c824d3 --- /dev/null +++ b/brain_observatory/nwb/eye_tracking/extension_builder.py @@ -0,0 +1,99 @@ +import os.path + +from pynwb.spec import (NWBNamespaceBuilder, export_spec, + NWBGroupSpec, NWBDatasetSpec) + +NAMESPACE = 'ndx-ellipse-eye-tracking' + + +def main(): + # these arguments were auto-generated from your cookiecutter inputs + ns_builder = NWBNamespaceBuilder( + doc="""Store the elliptical eye tracking output of DeepLabCut""", + name=f"""{NAMESPACE}""", + version="""0.1.0""", + author=list(map(str.strip, """Ben Dichter""".split(','))), + contact=list(map(str.strip, """bdichter@lbl.gov""".split(','))) + ) + + ns_builder.include_type('SpatialSeries', namespace='core') + ns_builder.include_type('EyeTracking', namespace='core') + ns_builder.include_type('TimeSeries', namespace='core') + + ellipse_series_spec = NWBGroupSpec( + neurodata_type_def='EllipseSeries', + neurodata_type_inc='SpatialSeries', + doc='Information about an ellipse moving over time', + datasets=[ + NWBDatasetSpec( + name='data', # override SpatialSeries 'data' dataset to be more explicit + dtype='numeric', + doc='The (x, y) coordinates of the center of the ellipse at each time point.', + dims=('num_times', 'x, y'), + shape=(None, 2), + ), + NWBDatasetSpec( + name='area', + dtype='float', + doc='ellipse area, with nan values in likely blink times', + shape=(None, ) + ), + NWBDatasetSpec( + name='area_raw', + dtype='float', + doc='ellipse area, with no regard to likely blink times', + shape=(None, ) + ), + NWBDatasetSpec( + name='width', + dtype='float', + doc='width of ellipse', + shape=(None, ) + ), + NWBDatasetSpec( + name='height', + dtype='float', + doc='height of ellipse', + shape=(None, ) + ), + NWBDatasetSpec( + name='angle', + dtype='float', + doc='angle that ellipse is rotated by (phi)', + shape=(None, ) + ) + ] + ) + + ellipse_eye_tracking_spec = NWBGroupSpec( + neurodata_type_def='EllipseEyeTracking', + neurodata_type_inc='EyeTracking', + name=None, + default_name='EyeTracking', + doc='Stores detailed eye tracking information output from DeepLabCut', + groups=[ + NWBGroupSpec( + neurodata_type_inc=ellipse_series_spec, + name=x, + doc=x.replace('_', ' ') + ) for x in ('eye_tracking', 'pupil_tracking', 'corneal_reflection_tracking') + ] + [ + NWBGroupSpec( + neurodata_type_inc='TimeSeries', + name='likely_blink', + doc='Indicator of whether there was a probable blink for this frame' + ) + ] + + ) + + new_data_types = [ellipse_series_spec, ellipse_eye_tracking_spec] + + # export the spec to yaml files in the spec folder + output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) + export_spec(ns_builder, new_data_types, output_dir) + + +if __name__ == "__main__": + # usage: python create_extension_spec.py + main() diff --git a/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml b/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml new file mode 100644 index 0000000000..c0c0833222 --- /dev/null +++ b/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml @@ -0,0 +1,56 @@ +groups: +- neurodata_type_def: EllipseSeries + neurodata_type_inc: SpatialSeries + doc: Information about an ellipse moving over time + datasets: + - name: data + dtype: numeric + dims: + - num_times + - x, y + shape: + - null + - 2 + doc: The (x, y) coordinates of the center of the ellipse at each time point. + - name: area + dtype: float + shape: + - null + doc: ellipse area, with nan values in likely blink times + - name: area_raw + dtype: float + shape: + - null + doc: ellipse area, with no regard to likely blink times + - name: width + dtype: float + shape: + - null + doc: width of ellipse + - name: height + dtype: float + shape: + - null + doc: height of ellipse + - name: angle + dtype: float + shape: + - null + doc: angle that ellipse is rotated by (phi) +- neurodata_type_def: EllipseEyeTracking + neurodata_type_inc: EyeTracking + default_name: EyeTracking + doc: Stores detailed eye tracking information output from DeepLabCut + groups: + - name: eye_tracking + neurodata_type_inc: EllipseSeries + doc: eye tracking + - name: pupil_tracking + neurodata_type_inc: EllipseSeries + doc: pupil tracking + - name: corneal_reflection_tracking + neurodata_type_inc: EllipseSeries + doc: corneal reflection tracking + - name: likely_blink + neurodata_type_inc: TimeSeries + doc: Indicator of whether there was a probable blink for this frame diff --git a/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml b/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml new file mode 100644 index 0000000000..00347dc45a --- /dev/null +++ b/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml @@ -0,0 +1,15 @@ +namespaces: +- author: + - Ben Dichter + contact: + - bdichter@lbl.gov + doc: Store the elliptical eye tracking output of DeepLabCut + name: ndx-ellipse-eye-tracking + schema: + - namespace: core + neurodata_types: + - SpatialSeries + - EyeTracking + - TimeSeries + - source: ndx-ellipse-eye-tracking.extensions.yaml + version: 0.1.0 diff --git a/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py b/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py new file mode 100644 index 0000000000..3127c9640f --- /dev/null +++ b/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py @@ -0,0 +1,17 @@ +import os +from pynwb import load_namespaces, get_class +# import ndx_events + +# Set path of the namespace.yaml file to the expected install location +ndx_ellipse_eye_tracking_specpath = os.path.join( + os.path.dirname(__file__), + 'ndx-ellipse-eye-tracking.namespace.yaml' +) + +# Load the namespace +# load_namespaces(ndx_events.ndx_events_specpath) +load_namespaces(ndx_ellipse_eye_tracking_specpath) + + +EllipseSeries = get_class('EllipseSeries', 'ndx-ellipse-eye-tracking') +EllipseEyeTracking = get_class('EllipseEyeTracking', 'ndx-ellipse-eye-tracking') \ No newline at end of file diff --git a/brain_observatory/nwb/metadata.py b/brain_observatory/nwb/metadata.py new file mode 100644 index 0000000000..e9024d2fa6 --- /dev/null +++ b/brain_observatory/nwb/metadata.py @@ -0,0 +1,125 @@ +import os + +from marshmallow import fields +import pynwb +from pynwb.spec import NWBNamespaceBuilder, NWBGroupSpec, NWBAttributeSpec, NWBDatasetSpec + +from allensdk.brain_observatory.behavior.schemas import STYPE_DICT, TYPE_DICT + + +def extract_from_schema(schema): + if hasattr(schema, 'neurodata_skip'): + fields_to_skip = schema.neurodata_skip + else: + fields_to_skip = set() + + # Extract fields from Schema: + docval_list = [{'name': 'name', 'type': str, 'doc': 'name'}] + + attributes = _extract_attributes(attributes=schema().fields, fields_to_skip=fields_to_skip) + datasets = [] + nwbfields_list = [] + + for name, val in schema().fields.items(): + + if name in fields_to_skip: + continue + + if type(val) == fields.Nested: + dataset = _extract_dataset(val=val) + datasets.append(dataset) + continue + + docval_list.append({'name': name, + 'type': TYPE_DICT[type(val)], + 'doc': val.metadata['doc']}) + nwbfields_list.append(name) + + return docval_list, attributes, nwbfields_list, datasets + + +def load_pynwb_extension(schema, prefix: str): + neurodata_type = schema.neurodata_type + outdir = os.path.abspath(os.path.dirname(__file__)) + ns_path = f'{prefix}.namespace.yaml' + + # Read spec and load namespace: + ns_abs_path = os.path.join(outdir, ns_path) + pynwb.load_namespaces(ns_abs_path) + + return pynwb.get_class(neurodata_type, prefix) + + +def create_pynwb_extension_from_schemas(schema_list, prefix: str, save_dir: str): + # Initializations: + outdir = os.path.abspath(os.path.dirname(__file__)) + ext_source = f'{prefix}.extension.yaml' + ns_path = f'{prefix}.namespace.yaml' + + print(f"Saving extensions to: {save_dir}") + + extension_doc = ("Allen Institute behavior and optical " + "physiology extensions") + + ns_builder = NWBNamespaceBuilder( + doc=extension_doc, + name=prefix, + version="0.2.0", + author="Allen Institute for Brain Science", + contact="waynew@alleninstitute.org") + + # Loops through and create NWB custom group specs for schemas found in: + # allensdk.brain_observatory.behavior.schemas + for schema in schema_list: + docval_list, attributes, nwbfields_list, datasets = extract_from_schema(schema) + + # Build the spec: + ext_group_spec = NWBGroupSpec( + neurodata_type_def=schema.neurodata_type, + neurodata_type_inc=schema.neurodata_type_inc, + doc=schema.neurodata_doc, + attributes=attributes, + datasets=datasets) + + # Add spec to builder: + ns_builder.add_spec(ext_source, ext_group_spec) + + # Export spec + ns_builder.export(ns_path, outdir=save_dir) + + +def _extract_dataset(val): + if val.many: + raise NotImplementedError('many not supported') + if 'values' not in val.schema.fields: + raise ValueError('A dataset must contain an attribute called "values"') + values = val.schema.fields['values'] + attributes = _extract_attributes(attributes=val.schema.fields, fields_to_skip=['values']) + + return NWBDatasetSpec( + name=val.name, + attributes=attributes, + doc=val.metadata['doc'], + dtype=STYPE_DICT[type(values)], + dims=values.metadata['shape'] + ) + + +def _extract_attributes(attributes, fields_to_skip=None): + res = [] + for name, val in attributes.items(): + if fields_to_skip and name in fields_to_skip: + continue + + if type(val) == fields.List: + res.append(NWBAttributeSpec(name=name, + dtype=STYPE_DICT[type(val)], + doc=val.metadata['doc'], + shape=val.metadata['shape'])) + elif type(val) == fields.Nested: + continue + else: + res.append(NWBAttributeSpec(name=name, + dtype=STYPE_DICT[type(val)], + doc=val.metadata['doc'])) + return res diff --git a/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml b/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml new file mode 100644 index 0000000000..46bcc5beff --- /dev/null +++ b/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml @@ -0,0 +1,213 @@ +groups: +- neurodata_type_def: BehaviorTaskParameters + neurodata_type_inc: LabMetaData + doc: Metadata for behavior or behavior + ophys task parameters + attributes: + - name: stimulus_distribution + dtype: text + doc: Distribution type of drawing change times (e.g. 'geometric', 'exponential') + - name: task + dtype: text + doc: The name of the behavioral task + - name: reward_volume + dtype: float + doc: Volume of water (in mL) delivered as reward + - name: n_stimulus_frames + dtype: int + doc: Total number of stimuli frames + - name: auto_reward_volume + dtype: float + doc: Volume of water (in mL) delivered as an automatic reward + - name: session_type + dtype: text + doc: Stage of behavioral task + - name: response_window_sec + dtype: text + shape: + - 2 + doc: The lower and upper bound (in seconds) for a randomly chosen time window + where subject response influences trial outcome + - name: blank_duration_sec + dtype: text + shape: + - 2 + doc: The lower and upper bound (in seconds) for a randomly chosen inter-stimulus + interval duration for a trial + - name: stimulus_duration_sec + dtype: float + doc: Duration of each stimulus presentation in seconds + - name: omitted_flash_fraction + dtype: float + doc: Fraction of flashes/image presentations that were omitted + - name: stimulus + dtype: text + doc: Stimulus type +- neurodata_type_def: BehaviorSubject + neurodata_type_inc: Subject + doc: Metadata for an AIBS behavior or behavior + ophys subject + attributes: + - name: reporter_line + dtype: text + doc: Reporter line of subject + - name: driver_line + dtype: text + shape: + - null + doc: Driver line of subject +- neurodata_type_def: BehaviorMetadata + neurodata_type_inc: LabMetaData + doc: Metadata for behavior and behavior + ophys experiments + attributes: + - name: behavior_session_uuid + dtype: text + doc: MTrain record for session, also called foraging_id + - name: equipment_name + dtype: text + doc: Name of behavior or optical physiology experiment rig + - name: session_type + dtype: text + doc: Experimental session description + - name: behavior_session_id + dtype: int + doc: The unique ID for the behavior session + - name: stimulus_frame_rate + dtype: float + doc: Frame rate (frames/second) of the visual_stimulus from the monitor +- neurodata_type_def: OphysMetadata + neurodata_type_inc: LabMetaData + doc: Metadata for ophys experiments + attributes: + - name: ophys_experiment_id + dtype: int + doc: Unique ID for the ophys experiment (aka imaging plane) + - name: ophys_session_id + dtype: int + doc: Unique ID for the ophys session + - name: experiment_container_id + dtype: int + doc: Container ID for the container that contains this ophys session + - name: imaging_depth + dtype: int + doc: Depth (microns) below the cortical surface targeted for two-photon acquisition + - name: field_of_view_width + dtype: int + doc: Width of optical physiology imaging plane in pixels + - name: field_of_view_height + dtype: int + doc: Height of optical physiology imaging plane in pixels + - name: imaging_plane_group + dtype: int + doc: A numeric index which indicates the order that an imaging plane was acquired + for a mesoscope experiment. Will be -1 for non-mesoscope data + - name: imaging_plane_group_count + dtype: int + doc: The total number of plane groups collected in a session for a mesoscope experiment. + Will be 0 if the scope did not capture multiple concurrent imaging planes. +- neurodata_type_def: OphysBehaviorMetadata + neurodata_type_inc: BehaviorMetadata + doc: Metadata for behavior + ophys experiments + attributes: + - name: experiment_container_id + dtype: int + doc: Container ID for the container that contains this ophys session + - name: behavior_session_id + dtype: int + doc: The unique ID for the behavior session + - name: behavior_session_uuid + dtype: text + doc: MTrain record for session, also called foraging_id + - name: equipment_name + dtype: text + doc: Name of behavior or optical physiology experiment rig + - name: session_type + dtype: text + doc: Experimental session description + - name: field_of_view_width + dtype: int + doc: Width of optical physiology imaging plane in pixels + - name: ophys_session_id + dtype: int + doc: Unique ID for the ophys session + - name: field_of_view_height + dtype: int + doc: Height of optical physiology imaging plane in pixels + - name: imaging_plane_group_count + dtype: int + doc: The total number of plane groups collected in a session for a mesoscope experiment. + Will be 0 if the scope did not capture multiple concurrent imaging planes. + - name: ophys_experiment_id + dtype: int + doc: Unique ID for the ophys experiment (aka imaging plane) + - name: imaging_depth + dtype: int + doc: Depth (microns) below the cortical surface targeted for two-photon acquisition + - name: imaging_plane_group + dtype: int + doc: A numeric index which indicates the order that an imaging plane was acquired + for a mesoscope experiment. Will be -1 for non-mesoscope data + - name: stimulus_frame_rate + dtype: float + doc: Frame rate (frames/second) of the visual_stimulus from the monitor +- neurodata_type_def: OphysEyeTrackingRigMetadata + neurodata_type_inc: NWBDataInterface + doc: Metadata for ophys experiment rig + attributes: + - name: equipment + dtype: text + doc: Description of rig + datasets: + - name: monitor_rotation + dtype: float + dims: + - 3 + shape: + - null + doc: rotation of monitor (x, y, z) + attributes: + - name: unit_of_measurement + dtype: text + doc: Unit of measurement for the data + - name: camera_position + dtype: float + dims: + - 3 + shape: + - null + doc: position of camera (x, y, z) + attributes: + - name: unit_of_measurement + dtype: text + doc: Unit of measurement for the data + - name: led_position + dtype: float + dims: + - 3 + shape: + - null + doc: position of LED (x, y, z) + attributes: + - name: unit_of_measurement + dtype: text + doc: Unit of measurement for the data + - name: camera_rotation + dtype: float + dims: + - 3 + shape: + - null + doc: rotation of camera (x, y, z) + attributes: + - name: unit_of_measurement + dtype: text + doc: Unit of measurement for the data + - name: monitor_position + dtype: float + dims: + - 3 + shape: + - null + doc: position of monitor (x, y, z) + attributes: + - name: unit_of_measurement + dtype: text + doc: Unit of measurement for the data diff --git a/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml b/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml new file mode 100644 index 0000000000..66adbc846b --- /dev/null +++ b/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml @@ -0,0 +1,9 @@ +namespaces: +- author: Allen Institute for Brain Science + contact: waynew@alleninstitute.org + doc: Allen Institute behavior and optical physiology extensions + name: ndx-aibs-behavior-ophys + schema: + - namespace: core + - source: ndx-aibs-behavior-ophys.extension.yaml + version: 0.2.0 diff --git a/brain_observatory/nwb/nwb_api.py b/brain_observatory/nwb/nwb_api.py new file mode 100644 index 0000000000..8c74139c02 --- /dev/null +++ b/brain_observatory/nwb/nwb_api.py @@ -0,0 +1,117 @@ +from pathlib import Path + +import pandas as pd +import pynwb +import SimpleITK as sitk +import collections + +from allensdk.brain_observatory.running_speed import RunningSpeed +from allensdk.brain_observatory.behavior.image_api import ImageApi + +namespace_path = Path(__file__).parent / 'ndx-aibs-behavior-ophys.namespace.yaml' +pynwb.load_namespaces(str(namespace_path)) + + +class NwbApi: + + __slots__ = ('path', '_nwbfile') + + @property + def nwbfile(self): + if hasattr(self, '_nwbfile'): + return self._nwbfile + + io = pynwb.NWBHDF5IO(self.path, 'r') + return io.read() + + def __init__(self, path, **kwargs): + ''' Reads data for a single Brain Observatory session from an NWB 2.0 file + ''' + + self.path = path + + @classmethod + def from_nwbfile(cls, nwbfile, **kwargs): + + obj = cls(path=None, **kwargs) + obj._nwbfile = nwbfile + + return obj + + @classmethod + def from_path(cls, path, **kwargs): + with open(path, 'r'): + pass + + return cls(path=path, **kwargs) + + def get_running_speed(self, lowpass=True) -> RunningSpeed: + """ + Gets the running speed + Parameters + ---------- + lowpass: bool + Whether to return the running speed with lowpass filter applied or without + + Returns + ------- + RunningSpeed: + The running speed + """ + + interface_name = 'speed' if lowpass else 'speed_unfiltered' + values = self.nwbfile.modules['running'].get_data_interface(interface_name).data[:] + timestamps = self.nwbfile.modules['running'].get_data_interface(interface_name).timestamps[:] + + return RunningSpeed( + timestamps=timestamps, + values=values, + ) + + def get_stimulus_presentations(self) -> pd.DataFrame: + + columns_to_ignore = set(['tags', 'timeseries', 'tags_index', 'timeseries_index']) + + presentation_dfs = [] + for interval_name, interval in self.nwbfile.intervals.items(): + if interval_name.endswith('_presentations'): + presentations = collections.defaultdict(list) + for col in interval.columns: + if col.name not in columns_to_ignore: + presentations[col.name].extend(col.data) + df = pd.DataFrame(presentations).replace({'N/A': ''}) + presentation_dfs.append(df) + + table = pd.concat(presentation_dfs, sort=False) + table = table.sort_values(by=["start_time"]) + table = table.reset_index(drop=True) + table.index.name = 'stimulus_presentations_id' + table.index = table.index.astype(int) + + for colname, series in table.items(): + types = set(series.map(type)) + if len(types) > 1 and str in types: + series.fillna('', inplace=True) + table[colname] = series.transform(str) + + return table[sorted(table.columns)] + + def get_invalid_times(self) -> pd.DataFrame: + + container = self.nwbfile.invalid_times + if container: + return container.to_dataframe() + else: + return pd.DataFrame() + + def get_image(self, name, module, image_api=None) -> sitk.Image: + + if image_api is None: + image_api = ImageApi + + nwb_img = self.nwbfile.modules[module].get_data_interface('images')[name] + data = nwb_img.data + resolution = nwb_img.resolution # px/cm + spacing = [resolution * 10, resolution * 10] + + return ImageApi.serialize(data, spacing, 'mm') diff --git a/brain_observatory/nwb/nwb_utils.py b/brain_observatory/nwb/nwb_utils.py new file mode 100644 index 0000000000..5807eba461 --- /dev/null +++ b/brain_observatory/nwb/nwb_utils.py @@ -0,0 +1,85 @@ +# All of the omitted stimuli have a duration of 250ms as defined +# by the Visual Behavior team. For questions about duration contact that +# team. +from pynwb import NWBFile, ProcessingModule +from pynwb.base import Images +from pynwb.image import GrayscaleImage + +from allensdk.brain_observatory.behavior.image_api import ImageApi, Image + + +def get_column_name(table_cols: list, + possible_names: set) -> str: + """ + This function returns a column name, given a table with unknown + column names and a set of possible column names which are expected. + The table column name returned should be the only name contained in + the "expected" possible names. + :param table_cols: the table columns to search for the possible name within + :param possible_names: the names that could exist within the data columns + :return: the first entry of the intersection between the possible names + and the names of the columns of the stimulus table + """ + + column_set = set(table_cols) + column_names = list(column_set.intersection(possible_names)) + if not len(column_names) == 1: + raise KeyError("Table expected one name column in intersection, found:" + f" {column_names}") + return column_names[0] + + +def get_image(nwbfile: NWBFile, name: str, module: str) -> Image: + nwb_img = nwbfile.processing[module].get_data_interface('images')[name] + data = nwb_img.data + resolution = nwb_img.resolution # px/cm + spacing = [resolution * 10, resolution * 10] + + img = ImageApi.serialize(data, spacing, 'mm') + img = ImageApi.deserialize(img=img) + return img + + +def add_image_to_nwb(nwbfile: NWBFile, image_data: Image, image_name: str): + """ + Adds image given by image_data with name image_name to nwbfile + + Parameters + ---------- + nwbfile + nwbfile to add image to + image_data + The image data + image_name + Image name + + Returns + ------- + None + """ + module_name = 'ophys' + description = '{} image at pixels/cm resolution'.format(image_name) + + data, spacing, unit = image_data + + assert spacing[0] == spacing[1] and len( + spacing) == 2 and unit == 'mm' + + if module_name not in nwbfile.processing: + ophys_mod = ProcessingModule(module_name, + 'Ophys processing module') + nwbfile.add_processing_module(ophys_mod) + else: + ophys_mod = nwbfile.processing[module_name] + + image = GrayscaleImage(image_name, + data, + resolution=spacing[0] / 10, + description=description) + + if 'images' not in ophys_mod.containers: + images = Images(name='images') + ophys_mod.add_data_interface(images) + else: + images = ophys_mod['images'] + images.add_image(image) diff --git a/brain_observatory/nwb/schemas.py b/brain_observatory/nwb/schemas.py new file mode 100644 index 0000000000..653fa72103 --- /dev/null +++ b/brain_observatory/nwb/schemas.py @@ -0,0 +1,8 @@ +from argschema.fields import String + +from allensdk.brain_observatory.argschema_utilities import check_read_access, check_write_access, RaisingSchema + + +class RunningSpeedPathsSchema(RaisingSchema): + running_speed_path = String(required=True, validate=check_read_access) + running_speed_timestamps_path = String(required=True, validate=check_read_access) \ No newline at end of file diff --git a/brain_observatory/observatory_plots.py b/brain_observatory/observatory_plots.py new file mode 100644 index 0000000000..25ef1a8341 --- /dev/null +++ b/brain_observatory/observatory_plots.py @@ -0,0 +1,511 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import matplotlib.pyplot as plt +import matplotlib.colors as mcolors +from matplotlib.colors import LinearSegmentedColormap +from matplotlib.collections import PatchCollection +import matplotlib.lines as mlines +import matplotlib.patches as mpatches +import scipy.interpolate as si +from scipy.stats import gaussian_kde +import matplotlib.colorbar as cbar +from mpl_toolkits.axes_grid1 import ImageGrid + +import allensdk.brain_observatory.circle_plots as cplots +from contextlib import contextmanager + +import numpy as np + +SI_RANGE = [ 0, 1.5 ] +P_VALUE_MAX = 0.05 +PEAK_DFF_MIN = 3 +N_HIST_BINS = 50 +STIM_COLOR = "#ccccdd" +STIMULUS_COLOR_MAP = LinearSegmentedColormap.from_list('default',[ [1.0,1.0,1.0,0.0], [.6,.6,.85,1.0] ]) +PUPIL_COLOR_MAP = LinearSegmentedColormap.from_list( + 'custom_plasma', [[0.050383, 0.029803, 0.527975], + [0.417642, 0.000564, 0.658390], + [0.692840, 0.165141, 0.564522], + [0.881443, 0.392529, 0.383229], + [0.988260, 0.652325, 0.211364], + [0.940015, 0.975158, 0.131326]]) +EVOKED_COLOR = "#b30000" +SPONTANEOUS_COLOR = "#0000b3" + +def plot_cell_correlation(sig_corrs, labels, colors, scale=15): + if len(sig_corrs) > 1: + alpha = 1.0 / (len(sig_corrs) + 1) + else: + alpha = 1.0 + + ax = plt.gca() + ps = [] + for sig_corr, color, label in zip(sig_corrs, colors, labels): + ax.hist(sig_corr, bins=30, range=[-1,1], + histtype='stepfilled', + facecolor=(.6,.6,.6,alpha), + edgecolor=color, + linewidth=1.5, + label=label) + + ax.set_xlabel("signal correlation") + ax.set_ylabel("cell count") + ax.xaxis.grid(True) + + leg = ax.legend(loc='upper left', frameon=False) + for i, t in enumerate(leg.get_texts()): + t.set_color(colors[i]) + + plt.text(.125, .5, u'\u2014', transform=ax.transAxes, + horizontalalignment='center', verticalalignment='center', + weight='bold', size='xx-large') + plt.text(.875, .5, '+', transform=ax.transAxes, + horizontalalignment='center', verticalalignment='center', + weight='bold', size='xx-large') + +def population_correlation_scatter(sig_corrs, noise_corrs, labels, colors, scale=15): + alpha = max(0.85 - 0.15 * (len(sig_corrs)-1), 0.2) + ax = plt.gca() + for sig_corr, noise_corr, color, label in zip(sig_corrs, noise_corrs, colors, labels): + inds = np.tril_indices(len(sig_corr)) + ax.scatter(sig_corr[inds], noise_corr[inds], + s=scale, + color=color, + linewidth=0.5, edgecolor='#333333', + label=label, + alpha=alpha) + ax.set_xlabel("signal correlation") + ax.set_ylabel("noise correlation") + ax.set_xlim([-1,1]) + ax.set_ylim([-1,1]) + leg = ax.legend(loc='upper left', frameon=False) + for i, t in enumerate(leg.get_texts()): + t.set_color(colors[i]) + + +def plot_mask_outline(mask, ax, color='k'): + pim = np.pad(mask, 1, 'constant', constant_values=(0,0)) + hedges = np.argwhere(np.diff(pim, axis=0)) + vedges = np.argwhere(np.diff(pim, axis=1)) + hlines = [ [ [r-.5, c-1.5], [r-.5, c-.5] ] for r,c in hedges ] + vlines = [ [ [r-1.5, c-.5], [r-.5, c-.5] ] for r,c in vedges ] + + for p1,p2 in hlines + vlines: + ax.add_line(mlines.Line2D([ p1[1], p2[1] ], + [ p1[0], p2[0] ], + linewidth=3, + color=color, + clip_on=False)) + + +class DimensionPatchHandler(object): + def __init__(self, vals, start_color, end_color, *args, **kwargs): + super(DimensionPatchHandler, self).__init__(*args, **kwargs) + self.vals = vals + self.start_color = start_color + self.end_color = end_color + + def legend_artist(self, legend, orig_handle, fontsize, handlebox): + x0, y0 = handlebox.xdescent, handlebox.ydescent + width, height = handlebox.width, handlebox.height + + num_vals = len(self.vals) + sub_width = float(width) / num_vals + x = x0 + for i in range(len(self.vals)): + rgb = self.dim_color(i) + r = mpatches.Rectangle((x+i*sub_width, y0), + sub_width, y0+height, + facecolor=rgb, linewidth=0) + + r.set_clip_on(False) + handlebox.add_artist(r) + return r + + def dim_color(self, index): + rgb1 = np.array(mcolors.colorConverter.to_rgb(self.start_color)) + rgb2 = np.array(mcolors.colorConverter.to_rgb(self.end_color)) + t = float(index) / (len(self.vals)+1) + rgb = t * rgb2 + (1.0 - t) * rgb1 + return rgb + +def float_label(n): + if isinstance(n, int): + return str(n) + if n.is_integer(): + return str(int(n)) + else: + return "%.2f" % n + +def plot_representational_similarity(rs, dims=None, dim_labels=None, colors=None, dim_order=None, labels=True): + if np.all(np.isnan(rs)): + return # if rs is all NaN (happens with only 1 cell), there is nothing to plot + if dim_order is not None: + rsr = np.arange(len(rs)).reshape(*map(len,dims)) + rsrt = rsr.transpose(dim_order) + ri = rsrt.flatten() + rs = rs[ri,:][:,ri] + + dims = np.array(dims)[dim_order] + colors = np.array(colors)[dim_order] + dim_labels = np.array(dim_labels)[dim_order] + + # force the color map to be centered at zero + clim = np.nanpercentile(rs, [5.0,95.0], axis=None) + vrange = max(abs(clim[0]), abs(clim[1])) + + rs = rs.copy() + np.fill_diagonal(rs, np.nan) + + if labels: + grid = ImageGrid(plt.gcf(), 111, + nrows_ncols=(1,1), + cbar_location="right", + cbar_mode="single", + cbar_size="7%", + cbar_pad=0.05) + + for ax in grid: pass + else: + ax = plt.gca() + + im = ax.imshow(rs, interpolation='nearest', cmap='RdBu_r', vmin=-vrange, vmax=vrange) + ax.set_xticklabels([]) + ax.set_yticklabels([]) + ax.set_xticks([]) + ax.set_yticks([]) + + if labels: + cbar = ax.cax.colorbar(im) + cbar.set_label_text('stimulus correlation') + + if dims is not None: + dim_labels = ["%s(%s)" % (dim_labels[i],', '.join(map(float_label, dims[i].tolist()))) for i in range(len(dims)) ] + dim_handlers = [ DimensionPatchHandler(dims[i], colors[i], 'w') for i in range(len(dims)) ] + + n = len(rs) + for cell_i in range(n): + idx = np.unravel_index(cell_i, map(len, dims)) + + start = -(len(dims))*2 + width = 1.8 + for dim_i, color in enumerate(colors): + v_i = idx[dim_i] + rgb = dim_handlers[dim_i].dim_color(v_i) + r = mpatches.Rectangle((start + dim_i * width, cell_i-.5), + width, 1.2, + facecolor=rgb, linewidth=0) + r.set_clip_on(False) + ax.add_patch(r) + + r = mpatches.Rectangle((cell_i-.5, start + dim_i * width), + 1.2, width, + facecolor=rgb, linewidth=0) + r.set_clip_on(False) + ax.add_patch(r) + + if labels: + patches = [ mpatches.Patch(label=dim_labels[i]) for i in range(len(dims)) ] + ax.legend(handles=patches, + handler_map=dict(zip(patches,dim_handlers)), + loc='upper left', + bbox_to_anchor=(0,0), + ncol=2, + fontsize=9, + frameon=False) + + if labels: + plt.subplots_adjust(left=0.07, + right=.88, + wspace=0.0, hspace=0.0) + +def plot_condition_histogram(vals, bins, color=STIM_COLOR): + plt.grid() + if len(vals) > 1: + vals = [np.array(vals).flatten()] # matplotlib >= 2.1 needs this + if len(vals) > 0: + n, hbins, patches = plt.hist(vals, + bins=np.arange(len(bins)+1)+1, + align='left', + density=False, + rwidth=.8, + color=color, + zorder=3) + else: + hbins = np.arange(len(bins)+1)+1 + plt.xticks(hbins[:-1], np.round(bins, 2)) + + +def plot_selectivity_cumulative_histogram(sis, + xlabel, + si_range=SI_RANGE, + n_hist_bins=N_HIST_BINS, + color=STIM_COLOR): + if len(sis) > 1: + sis = [np.array(sis).flatten()] # matplotlib >= 2.1 needs this + + bins = np.linspace(si_range[0], si_range[1], n_hist_bins) + yticks = np.linspace(0,1,5) + xticks = np.linspace(si_range[0], si_range[1], 4) + + yscale = 1.0 + # this is for normalizing to total # cells, not just significant cells + # yscale = float(num_cells) / len(osis) + + # orientation selectivity cumulative histogram + if len(sis) > 0: + n, bins, patches = plt.hist(sis, density=True, bins=bins, + cumulative=True, histtype='stepfilled', + color=color) + plt.xlim(si_range) + plt.ylim([0,yscale]) + plt.yticks(yticks*yscale, yticks) + plt.xticks(xticks) + + plt.xlabel(xlabel) + plt.ylabel("fraction of cells") + plt.grid() + +def plot_radial_histogram(angles, + counts, + all_angles=None, + include_labels=False, + offset=180.0, + direction=-1, + closed=False, + color=STIM_COLOR): + if all_angles is None: + if len(angles) < 2: + all_angles = np.linspace(0, 315, 8) + else: + all_angles = angles + + dth = (all_angles[1] - all_angles[0]) * 0.5 + + if len(counts) == 0: + max_count = 1 + else: + max_count = max(counts) + + wedges = [] + for count, angle in zip(counts, angles): + angle = angle*direction + offset + wedge = mpatches.Wedge((0,0), count, angle-dth, angle+dth) + wedges.append(wedge) + + wedge_coll = PatchCollection(wedges) + wedge_coll.set_facecolor(color) + wedge_coll.set_zorder(2) + + angles_rad = (all_angles*direction + offset)*np.pi/180.0 + + if closed: + border_coll = cplots.radial_circles([max_count]) + else: + border_coll = cplots.radial_arcs([max_count], + min(angles_rad), + max(angles_rad)) + border_coll.set_facecolor((0,0,0,0)) + border_coll.set_zorder(1) + + line_coll = cplots.angle_lines(angles_rad, 0, max_count) + line_coll.set_edgecolor((0,0,0,1)) + line_coll.set_linestyle(":") + line_coll.set_zorder(1) + + ax = plt.gca() + ax.add_collection(wedge_coll) + ax.add_collection(border_coll) + ax.add_collection(line_coll) + + if include_labels: + cplots.add_angle_labels(ax, angles_rad, all_angles.astype(int), max_count, (0,0,0,1), offset=max_count*0.1) + ax.set(xlim=(-max_count*1.2, max_count*1.2), + ylim=(-max_count*1.2, max_count*1.2), + aspect=1.0) + else: + ax.set(xlim=(-max_count*1.05, max_count*1.05), + ylim=(-max_count*1.05, max_count*1.05), + aspect=1.0) + +def plot_time_to_peak(msrs, ttps, t_start, t_end, stim_start, stim_end, cmap): + plt.plot(ttps, np.arange(msrs.shape[0],0,-1)-0.5, color='black') + if msrs.shape[0] > 0: + plt.imshow(msrs, + cmap=cmap, clim=[0,3], + aspect=float((t_end-t_start) / msrs.shape[0]), # float to get rid of MPL error + extent=[t_start, t_end, 0, msrs.shape[0]], interpolation='nearest') + plt.ylim([0,msrs.shape[0]]) + else: + plt.ylim([0, 1]) + plt.xlim([t_start, t_end]) + + plt.axvline(stim_start, linestyle=':', color='black') + plt.axvline(stim_end, linestyle=':', color='black') + + xticks = np.array([ t_start, stim_start, stim_end, t_end ]) + plt.xticks(xticks, np.round(xticks - stim_start, 2)) + plt.xlabel("time from stimulus start (s)") + + yticks, _ = plt.yticks() + plt.ylabel("cell number") + +@contextmanager +def figure_in_px(w, h, file_name, dpi=96.0, transparent=False): + fig = plt.figure(figsize=(w/dpi, h/dpi), dpi=dpi) + + yield fig + + plt.savefig(file_name, dpi=dpi, transparent=transparent) + plt.close() + +def finalize_no_axes(pad=0.0): + plt.axis('off') + plt.subplots_adjust(left=pad, + right=1.0-pad, + bottom=pad, + top=1.0-pad, + wspace=0.0, hspace=0.0) + +def finalize_with_axes(pad=.3): + plt.tight_layout(pad=pad) + +def finalize_no_labels(pad=.3, legend=False): + ax = plt.gca() + ax.set_xlabel("") + ax.set_ylabel("") + ax.set_xticklabels([]) + ax.set_yticklabels([]) + if not legend and ax.legend_ is not None: + ax.legend_.remove() + plt.tight_layout(pad=pad) + +def plot_combined_speed(binned_resp_vis, binned_dx_vis, binned_resp_sp, binned_dx_sp, + evoked_color, spont_color): + ax = plt.gca() + num_bins = max(binned_dx_vis.shape[0], binned_dx_sp.shape[0]) + + plot_speed(binned_resp_vis, binned_dx_vis, num_bins, evoked_color) + plot_speed(binned_resp_sp, binned_dx_sp, num_bins, spont_color) + + xmin = min(binned_dx_vis[:,0].min(), binned_dx_sp[:,0].min()) + xmax = max(binned_dx_vis[:,0].max(), binned_dx_sp[:,0].max()) + + + ymin = min(binned_resp_vis[:,0].min(), binned_resp_sp[:,0].min()) + ymax = max(binned_resp_vis[:,0].max(), binned_resp_sp[:,0].max()) + + xpadding = (xmax-xmin)*.05 + ypadding = (ymax-ymin)*.20 + + ax.set_xlim([xmin - xpadding, xmax + xpadding]) + ax.set_ylim([ymin - ypadding, ymax + ypadding]) + + +def plot_speed(binned_resp, binned_dx, num_bins, color): + ax = plt.gca() + + # plot the zero bin as a dot with whiskers + ax.errorbar([ binned_dx[0,0] ], [ binned_resp[0,0] ], yerr=[ binned_resp[0,1] ], fmt='o', color=color) + + # if there's only one bin, drop out + if len(binned_dx[:,0]) <= 1: + return + + f = si.interp1d(binned_dx[:,0], binned_resp[:,0]) + x = np.linspace(min(binned_dx[:,0]), max(binned_dx[:,0]), num=num_bins, endpoint=True) + y = f(x) + + f_up = si.interp1d(binned_dx[:,0], binned_resp[:,0] + binned_resp[:,1]) + y_up = f_up(x) + + f_down = si.interp1d(binned_dx[:,0], binned_resp[:,0] - binned_resp[:,1]) + y_down = f_down(x) + + ax.plot(x, y, color=color) + ax.fill_between(x, y_down, y_up, facecolor=color, alpha=0.1) + + +def plot_receptive_field(rf, color_map=None, clim=None, + mask=None, outline_color='#cccccc', + scalebar=True): + if mask is not None: + rf = np.ma.array(rf, mask=~mask) + + if clim is None: + clim = np.nanpercentile(rf, [1.0,99.0], axis=None) + + plt.imshow(rf, interpolation='nearest', + cmap=color_map, + clim=clim, + origin='bottom') + + if mask is not None: + plot_mask_outline(mask, plt.gca(), outline_color) + + if scalebar: + scale_dims = np.array([ 28.0, 16.0 ]) + scale_p = [ 26.8, 14.8 ] + text_p = [ scale_p[0]+0.5, scale_p[1]-0.5 ] + + + ax = plt.gca() + ax.add_patch(mpatches.Rectangle(scale_p / scale_dims, + 1.0/scale_dims[0], 1.0/scale_dims[1], + facecolor='w', + transform=ax.transAxes, + linewidth=1.0, + edgecolor=outline_color)) + plt.text(text_p[0] / scale_dims[0], text_p[1] / scale_dims[1], "4deg", + horizontalalignment='center', + verticalalignment='center', + transform=ax.transAxes) + + + +def plot_pupil_location(xy_deg, s=1, c=None, cmap=PUPIL_COLOR_MAP, + edgecolor='', include_labels=True): + if c is None: + xy_deg = xy_deg[~np.isnan(xy_deg).any(axis=1)] + c = gaussian_kde(xy_deg.T)(xy_deg.T) + plt.scatter(xy_deg[:,0], xy_deg[:,1], s=s, c=c, cmap=cmap, + edgecolor=edgecolor) + plt.xlim(-70, 70) + plt.ylim(-70, 70) + + if include_labels: + plt.xlabel("azimuth (degrees)") + plt.ylabel("altitude (degrees)") diff --git a/brain_observatory/ophys/__init__.py b/brain_observatory/ophys/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/brain_observatory/ophys/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ophys/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4d5c3404a8a17234d011473cc53ff678fde87d6 GIT binary patch literal 200 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VFY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh|aS5;ODS^OJxkmL-<t7gg$mwdlvkXXa&=#K-FuRNmsS$<0qG O%}KQbIps4DGXMb1>N(E< literal 0 HcmV?d00001 diff --git a/brain_observatory/ophys/trace_extraction/__init__.py b/brain_observatory/ophys/trace_extraction/__init__.py new file mode 100644 index 0000000000..1a36940705 --- /dev/null +++ b/brain_observatory/ophys/trace_extraction/__init__.py @@ -0,0 +1,8 @@ +import warnings + +warnings.warn("trace_extraction functionality has been moved from AllenSDK " + "to https://github.com/AllenInstitute/ophys_etl_pipelines ." + "The functionality in this AllenSDK package will be removed " + "in v3.0.0.", + category=DeprecationWarning, + stacklevel=2) diff --git a/brain_observatory/ophys/trace_extraction/__main__.py b/brain_observatory/ophys/trace_extraction/__main__.py new file mode 100644 index 0000000000..b45fa05bd9 --- /dev/null +++ b/brain_observatory/ophys/trace_extraction/__main__.py @@ -0,0 +1,163 @@ +import logging +import sys +import marshmallow +import argparse +import os +import sys + +import numpy as np +import requests +import h5py +import argschema + +from allensdk.brain_observatory.argschema_utilities import write_or_print_outputs +from allensdk.brain_observatory import roi_masks + +from ._schemas import InputSchema, OutputSchema + + +def create_roi_masks(rois, w, h, motion_border): + roi_list = [] + + for roi in rois: + mask = np.array(roi["mask"], dtype=bool) + px = np.argwhere(mask) + px[:,0] += roi["y"] + px[:,1] += roi["x"] + + mask = roi_masks.create_roi_mask(w, h, motion_border, + pix_list=px[:,[1,0]], + label=str(roi["id"]), + mask_group=roi.get("mask_page",-1)) + + roi_list.append(mask) + + # sort by roi id + roi_list.sort(key=lambda x: x.label) + + return roi_list + + +def get_inputs_from_lims( + host, ophys_experiment_id, output_root, + job_queue, strategy +): + ''' This is a development / testing utility for running this module from the Allen Institute for Brain Science's + Laboratory Information Management System (LIMS). It will only work if you are on our internal network. + + Parameters + ---------- + ophys_experiment_id : int + Unique identifier for experiment of interest. + output_root : str + Output file will be written into this directory. + job_queue : str + Identifies the job queue from which to obtain configuration data + strategy : str + Identifies the LIMS strategy which will be used to write module inputs. + + Returns + ------- + data : dict + Response from LIMS. Should meet the schema defined in _schemas.py + + ''' + + uri = f'{host}/input_jsons?object_id={ophys_experiment_id}&object_class=OphysExperiment&strategy_class={strategy}&job_queue_name={job_queue}&output_directory={output_root}' + response = requests.get(uri) + data = response.json() + + if len(data) == 1 and 'error' in data: + raise ValueError('bad request uri: {} ({})'.format(uri, data['error'])) + + return data + + +def write_trace_file(data, names, path): + logging.debug("Writing {}".format(path)) + + if sys.version_info.major == 2: + utf_dtype = h5py.special_dtype(vlen=unicode) + elif sys.version_info.major == 3: + utf_dtype = h5py.special_dtype(vlen=str) + else: + raise TypeError("unable to create a variable length h5 string dtype in python version: {}", sys.version_info) + + with h5py.File(path, 'w') as fil: + fil["data"] = data + fil.create_dataset("roi_names", data=np.array(names).astype(np.string_), dtype=utf_dtype) + + +def extract_traces(motion_corrected_stack, motion_border, storage_directory, rois, log_0, **kwargs): + + # find width and height of movie + with h5py.File(motion_corrected_stack, "r") as f: + d = f["data"] + h = d.shape[1] + w = d.shape[2] + + # motion border + border = [ + motion_border["x0"], + motion_border["x1"], + motion_border["y0"], + motion_border["y1"] + ] + + # create roi mask objects + roi_mask_list = create_roi_masks(rois, w, h, border) + roi_names = [ roi.label for roi in roi_mask_list ] + + # extract traces + roi_traces, neuropil_traces, exclusions = roi_masks.calculate_roi_and_neuropil_traces( + motion_corrected_stack, roi_mask_list, border + ) + + roi_file = os.path.abspath(os.path.join(storage_directory, "roi_traces.h5")) + write_trace_file(roi_traces, roi_names, roi_file) + + np_file = os.path.abspath(os.path.join(storage_directory, "neuropil_traces.h5")) + write_trace_file(neuropil_traces, roi_names, np_file) + + return { + 'neuropil_trace_file': np_file, + 'roi_trace_file': roi_file, + 'exclusion_labels': exclusions + } + + +def main(): + logging.basicConfig(format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') + + remaining_args = sys.argv[1:] + input_data = {} + if '--get_inputs_from_lims' in sys.argv: + lims_parser = argparse.ArgumentParser(add_help=False) + lims_parser.add_argument('--host', type=str, default='http://lims2') + lims_parser.add_argument('--job_queue', type=str, default='OPHYS_EXTRACT_TRACES_QUEUE') + lims_parser.add_argument('--strategy', type=str,default='ExtractTracesStrategy') + lims_parser.add_argument('--ophys_experiment_id', type=int, default=None) + lims_parser.add_argument('--output_root', type=str, default= None) + + lims_args, remaining_args = lims_parser.parse_known_args(remaining_args) + remaining_args = [item for item in remaining_args if item != '--get_inputs_from_lims'] + input_data = get_inputs_from_lims(**lims_args.__dict__) + + + try: + parser = argschema.ArgSchemaParser( + args=remaining_args, + input_data=input_data, + schema_type=InputSchema, + output_schema_type=OutputSchema, + ) + except marshmallow.exceptions.ValidationError as err: + print(input_data) + raise + + output = extract_traces(**parser.args) + write_or_print_outputs(output, parser) + + +if __name__ == '__main__': + main() diff --git a/brain_observatory/ophys/trace_extraction/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ophys/trace_extraction/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2266d6fb325be13a249eb325a5cc68d470e353a GIT binary patch literal 503 zcmZ8ey>8nu5T@iG2nMob&cM|}qyXN6qG-}AMT0DE&>|2ZP~yd6LLUY4EJxYey-$%T z&yY9K+R3lbDQCMufgHh)N8S&=yE{KPm<Sep`l)_ILj2iY-ekneC*I+RK?@yOaU($7 zMLLF95A^W&AmZ1#n2t8=A+8=@$g2tpc-Wp~9Ln1j?i6JWb+T4LmH;T1t_3Y`y<5sN zYXRpMUnMzN6E)#9%NB;}Rhd?9neEJ9Fp!}YLFSse3k8rZ8q<I^2tlUbYIygNK}od< z|C2YWx>pO3Yhx`_kRJ9F*s-0ZC%iT>moSa{q*4S6=evFqh@&jDV5fsVSu2kQ7oi_+ zwf^t|8V~HuWq#kAo`p|1$qxSh`h1#S2k;?RwbE&+)(X4)3{~Y&t62`%hTJuPp<>+C zm0y}N4~F3QA6<^!b|>ijtn|uY;Y!ZfDq?#3R%Guxo)v{bLq(A`U7vhdI=!;+kw+`S Lm?4SB!#H{cpm3#D literal 0 HcmV?d00001 diff --git a/brain_observatory/ophys/trace_extraction/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ophys/trace_extraction/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e643ddf9ca93b951128ad4833fbb7694a6e9900 GIT binary patch literal 5065 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 Nj<e#NbDnY7e*sQfhS>lB literal 0 HcmV?d00001 diff --git a/brain_observatory/ophys/trace_extraction/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ophys/trace_extraction/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ea5340030b0414d4dd0fb7003c4b6bfd82781e7 GIT binary patch literal 2909 zcma)8TW=dh6!zZiUEkuSr65$HMGY;kXwnKHP*u^is6~-dS8Bq`DAH=}nb@oB#hqCv zw%?$<_8;)Z6Mt!6dFo%_1->(DI~QDmqn(_YIp@r|eCNzOYqjbX{L<fl4!vfj@+VD} zKO4j@KJ^<0Ug1VuNepHfM4PdhSj<XnW+x7Fk}9hvHC9Vp<|ZEVG>;Y6lLl*O+K!t^ zi?xi(j}`9l>aP`E6|J`xYhzyHF6OSDZ(#26I_7mf?_l2GP0X9Z0RJ`2TfB{VTkmi3 zje|<J^Bxvfx<=tWmBWL<NF-smR=E4wa9^B?xTqfFGD?R<wI@_Acu{+nWw8j;!g&#A zVP4q#k;;qOUYd)ckkI42e!6$?97OAN7%7OBN(Xez^0x}lW2}e@GkArW!r}%ux%JLu z_66FxKvyr&HEzRvr)a*+@+eE6Ws(ayT%J%=x@J-1;y9eddC}lP4P-PX#$MMg+#pE9 zL<B)m4}v7)lbGmc5WJa$ak(RFP{qvYgTkCXWabS2XAl3V$d9nBhrfRL;nC4gN=S7S zjzYfO56{AMcJwq22U*I)ua87}s*bX;NYwyiHXhB?(SFoFQc*7MkHf)9I24eLV{q`3 zoxTjCG|2kUcpB!Job70lom_?k5r`@MC;N8-rL&~A$1@4sRXlu(py(R5;hIgOY3TJ! z5qGe^ON<i3dBlY!?6<}u?iO=I6|}8$P}8)dX;;%#O?#TIX}T_K@VneY&Ki2XuGgEO z0X@Cm;w|K<U0AQP=y2YUAz&o^BvdEJkSoQTNhAfA8?bABZ|09P#0PHrUyh@xh*j6m zjy3mP<@d8m%7G{l)A_yW|L5I0i+Da-sr-P(J0lSdNBN5FLnnW>r~G^rDIXsBCuw$; z`g!K}g?}2x5r5J(WgE_v9^ILw(VL0zqq08yh>J9jjw6KNIFl<i@BhY6wjkE)wq=LJ zuhFncgG)mdLt#_cBqh8sW`!{=9PL<9EiGq`wxBR0&OBlb#=zJ)WJ~HMsrwiMDOa~J zxW*<y=hD|)%rxgEC|Qu$B~c&4Ig|)Q?~G;Xf&z4qc)MsnpAO=QLQeO?zK9RIhWrGQ zy>9iYqtq5yRc28D2X2U^SP+w(uGqD{kR4n26v?|r-H^0$$>tUOkFm3~8T}A8qaT`Y zO@>0?7NG9{$|wU-<5lXe?=0pD53~o`WOYr~H4VUvCUyXHaJBSKOYgLK8=h|zjlFa{ z$=CEh16J(fQ<UkYIl^M7CJ37I&IQ5kmm&{)UFT}BsN##-B-H?17ni~&$$NB+iNQ7G zZ4$BfdM{qhZ!3`leZr5k;gCuyrfyG&r^T`*UIg;te7CPVtgjKL{QG`cpMEyU6;Q3^ z7A&C@KAIpcqqKp24NIt_yq9%xYof4&vLQR50&(&=8o_`%-~8Kgh;qg5=o|kyinX>J z?U4*kbi0RsN!+A90myxoqod9rsIeHJyapll5Jmn(Xc?ywM`QP;7@n`93*kmX4?<C; zv(l=q<++y+p?0*eaiC6n-HofcpukG1i^4-Z1073AnA44zwMunC86K%&eoets7#^&= zW;YjXE7t<;l&(N#qbwA2Nd1F#*_NN<xGp~RDF)YQTU60iTnLNGHcMLbt*?zo5IhGX zT?~s0p}dsK3!%ImTwEL;st4~8V8705fUR3JU+F}afIpl+Tt;&dyEVy7#YAS~DE9R& zr!GO{tN#{9Ocs*!??R+^oJpYR*vI<)vq%YlEVF(r66JG|muTS=dd~Rg_bJZ&0*-3{ z^tz3!snuDe*s@MU)r^)Z@pJ%sRGG-@OCN&rrY5|yHZ`&Hxo$|TbETuHwRyaYv!38n zH!!%!p@~1&)FUX{ki^mJUT0n?hvi#9Qh~G1YQBvNCgw^*Qd?Pqk?s)vt|_k+x<^<e z38fk(c!p$Wl6nf;UOq{-|Meu<UY!t3@+ihdEtG7KR(gnNplVk&$h4j7TrAwjWrO*i W`k?NCO=HV!noX<Ybv8Rr=jK1@f$Dt# literal 0 HcmV?d00001 diff --git a/brain_observatory/ophys/trace_extraction/_schemas.py b/brain_observatory/ophys/trace_extraction/_schemas.py new file mode 100644 index 0000000000..89c6528b7d --- /dev/null +++ b/brain_observatory/ophys/trace_extraction/_schemas.py @@ -0,0 +1,74 @@ +from argschema import ArgSchema +from argschema.fields import LogLevel, String, Nested, Boolean, Float, List, \ + Integer +from marshmallow import RAISE + +from allensdk.brain_observatory.argschema_utilities import RaisingSchema + + +class MotionBorder(RaisingSchema): + x0 = Float(default=0.0, + description='') # TODO: be really certain about how these + # relate to physical space and then write it here + x1 = Float(default=0.0, description='') + y0 = Float(default=0.0, description='') + y1 = Float(default=0.0, description='') + + +class Roi(RaisingSchema): + mask = List(List(Boolean), required=True, description='raster mask') + y = Integer(required=True, + description='y position (pixels) of mask\'s bounding box') + x = Integer(required=True, + description='x position (pixels) of mask\'s bounding box') + width = Integer(required=True, + description='width (pixels)of mask\'s bounding box') + height = Integer(required=True, + description='height (pixels) of mask\'s bounding box') + valid = Boolean(default=True, description='Is this Roi known to be valid?') + id = Integer(required=True, + description='unique integer identifier for this Roi') + mask_page = Integer(default=-1, + description='') # TODO: this isn't in the examples + # I'm looking at. What is it? + + +class ExclusionLabel(RaisingSchema): + roi_id = String(required=True) + exclusion_label_name = String(required=True) + + +class InputSchema(ArgSchema): + class Meta: + unknown = RAISE + + log_level = LogLevel(default='INFO', + description='set the logging level of the module') + motion_border = Nested(MotionBorder, required=True, + description='border widths - pixels outside the ' + 'border are considered invalid') + storage_directory = String(required=True, + description='used to set output directory') + motion_corrected_stack = String(required=True, + description='path to h5 file containing ' + 'motion corrected image stack') + rois = Nested(Roi, many=True, + description='specifications of individual regions of ' + 'interest') + log_0 = String(required=True, + description='path to motion correction output csv') # + # TODO: is this redundant with motion border? + + +class OutputSchema(RaisingSchema): + input_parameters = Nested(InputSchema) + neuropil_trace_file = String( + required=True, + description='path to output h5 file containing neuropil traces') # + # TODO rename these to _path + roi_trace_file = String( + required=True, + description='path to output h5 file containing roi traces') + exclusion_labels = Nested( + ExclusionLabel, many=True, + description='a report of roi-wise problems detected during extraction') diff --git a/brain_observatory/r_neuropil.py b/brain_observatory/r_neuropil.py new file mode 100644 index 0000000000..7619b31217 --- /dev/null +++ b/brain_observatory/r_neuropil.py @@ -0,0 +1,370 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import scipy.sparse as sparse +from scipy.linalg import solve_banded +import logging + + +def get_diagonals_from_sparse(mat): + ''' Returns a dictionary of diagonals keyed by offsets + + Parameters + ---------- + mat: scipy.sparse matrix + + Returns + ------- + dictionary: diagonals keyed by offsets + ''' + + mat_dia = mat.todia() # make sure the matrix is in diagonal format + + offsets = mat_dia.offsets + diagonals = mat_dia.data + + mat_dict = {} + + for i, o in enumerate(offsets): + mat_dict[o] = diagonals[i] + + return mat_dict + + +def ab_from_diagonals(mat_dict): + ''' Constructs value for scipy.linalg.solve_banded + + Parameters + ---------- + mat_dict: dictionary of diagonals keyed by offsets + + Returns + ------- + ab: value for scipy.linalg.solve_banded + ''' + offsets = list(mat_dict.keys()) + l = -np.min(offsets) + u = np.max(offsets) + + T = mat_dict[offsets[0]].shape[0] + + ab = np.zeros([l + u + 1, T]) + + for o in offsets: + index = u - o + ab[index] = mat_dict[o] + + return ab + + +def error_calc(F_M, F_N, F_C, r): + + er = np.sqrt(np.mean(np.square(F_C - (F_M - r * F_N)))) / np.mean(F_M) + + return er + + +def error_calc_outlier(F_M, F_N, F_C, r): + + std_F_M = np.std(F_M) + mean_F_M = np.mean(F_M) + ind_outlier = np.where(F_M > mean_F_M + 2. * std_F_M) + + er = np.sqrt(np.mean(np.square( + F_C[ind_outlier] - (F_M[ind_outlier] - r * F_N[ind_outlier])))) / np.mean(F_M[ind_outlier]) + + return er + + +def ab_from_T(T, lam, dt): + # using csr because multiplication is fast + Ls = -sparse.eye(T - 1, T, format='csr') + \ + sparse.eye(T - 1, T, 1, format='csr') + Ls /= dt + Ls2 = Ls.T.dot(Ls) + + M = sparse.eye(T) + lam * Ls2 + mat_dict = get_diagonals_from_sparse(M) + ab = ab_from_diagonals(mat_dict) + + return ab + + +def normalize_F(F_M, F_N): + F_N_min, F_N_max = float(np.amin(F_N)), float(np.amax(F_N)) + + # rescale so F_N is [0,1] + F_M_s = (F_M - F_N_min) / (F_N_max - F_N_min) + F_N_s = (F_N - F_N_min) / (F_N_max - F_N_min) + + return F_M_s, F_N_s + + +def alpha_filter(A=1.0, alpha=0.05, beta=0.25, T=100): + return A * np.exp(-alpha * np.arange(T)) - np.exp(-beta * np.arange(T)) + + +def validate_with_synthetic_F(T, N): + """ Compute N synthetic traces of length T with known values of r, then estimate r. + TODO: docs + """ + af1 = alpha_filter() + af2 = alpha_filter(alpha=0.1, beta=0.5) + + r_truth_vals = [] + r_est_vals = [] + + for n in range(N): + F_M_truth, F_N_truth, F_C_truth, r_truth = synthesize_F(T, af1, af2) + results = estimate_contamination_ratios(F_M_truth, F_N_truth) + + r_est = results['r'] + + r_truth_vals.append(r_truth) + r_est_vals.append(r_est) + + return r_truth_vals, r_est_vals + + +def synthesize_F(T, af1, af2, p1=0.05, p2=0.1): + """ Build a synthetic F_C, F_M, F_N, and r of length T + TODO: docs + """ + x1 = np.random.random(T) < p1 + F_C = np.convolve(af1, x1, mode='full')[:T] + + x2 = np.random.random(T) < p2 + F_N = np.convolve(af2, x2, mode='full')[:T] + + r = 2.0 * np.random.random() + + F_M = F_C + r * F_N + + return F_M, F_N, F_C, r + + +class NeuropilSubtract(object): + """ TODO: docs + """ + + def __init__(self, lam=0.05, dt=1.0, folds=4): + self.lam = lam + self.dt = dt + self.folds = folds + + self.T = None + self.T_f = None + self.ab = None + + self.F_M = None + self.F_N = None + + self.r_vals = None + self.error_vals = None + self.r = None + self.error = None + + def set_F(self, F_M, F_N): + """ Break the F_M and F_N traces into the number of folds specified + in the class constructor and normalize each fold of F_M and R_N relative to F_N. + """ + + F_M_len = len(F_M) + F_N_len = len(F_N) + + if F_M_len != F_N_len: + raise Exception( + "F_M and F_N must have the same length (%d vs %d)" % (F_M_len, F_N_len)) + + if self.T != F_M_len: + logging.debug("updating ab matrix for new T=%d", F_M_len) + self.T = F_M_len + self.T_f = int(self.T / self.folds) + self.ab = ab_from_T(self.T_f, self.lam, self.dt) + + self.F_M = [] + self.F_N = [] + + for fi in range(self.folds): + # F_M_i_s, F_N_i_s = normalize_F(F_M[fi*self.T_f:(fi+1)*self.T_f], + # F_N[fi*self.T_f:(fi+1)*self.T_f]) + self.F_M.append(F_M[fi * self.T_f:(fi + 1) * self.T_f]) + self.F_N.append(F_N[fi * self.T_f:(fi + 1) * self.T_f]) + + def fit_block_coordinate_desc(self, r_init=5.0, min_delta_r=0.00000001): + F_M = np.concatenate(self.F_M) + F_N = np.concatenate(self.F_N) + + r_vals = [] + error_vals = [] + r = r_init + + delta_r = None + it = 0 + + ab = ab_from_T(self.T, self.lam, self.dt) + while delta_r is None or delta_r > min_delta_r: + F_C = solve_banded((1, 1), ab, F_M - r * F_N) + new_r = - np.sum((F_C - F_M) * F_N) / np.sum(np.square(F_N)) + error = self.estimate_error(new_r) + + error_vals.append(error) + r_vals.append(new_r) + + if r is not None: + delta_r = np.abs(r - new_r) / r + + r = new_r + it += 1 + + self.r_vals = r_vals + self.error_vals = error_vals + self.r = r_vals[-1] + self.error = error_vals.min() + + def fit(self, r_range=[0.0, 2.0], iterations=3, dr=0.1, dr_factor=0.1): + """ Estimate error values for a range of r values. Identify a new r range + around the minimum error values and repeat multiple times. + TODO: docs + """ + global_min_error = None + global_min_r = None + + r_vals = [] + error_vals = [] + + it_range = r_range + it = 0 + + it_dr = dr + while it < iterations: + it_errors = [] + + # build a set of r values evenly distributed in a current range + rs = np.arange(it_range[0], it_range[1], it_dr) + + # estimate error for each r + for r in rs: + error = self.estimate_error(r) + it_errors.append(error) + + r_vals.append(r) + error_vals.append(error) + + # find the minimum in this range and update the global minimum + min_i = np.argmin(it_errors) + min_error = it_errors[min_i] + + if global_min_error is None or min_error < global_min_error: + global_min_error = min_error + global_min_r = rs[min_i] + + logging.debug("iteration %d, r=%0.4f, e=%.6e", + it, global_min_r, global_min_error) + + # if the minimum error is on the upper boundary, + # extend the boundary and redo this iteration + if min_i == len(it_errors) - 1: + logging.debug( + "minimum error found on upper r bound, extending range") + it_range = [rs[-1], rs[-1] + (rs[-1] - rs[0])] + else: + # error is somewhere on either side of the minimum error index + it_range = [rs[max(min_i - 1, 0)], + rs[min(min_i + 1, len(rs) - 1)]] + it_dr *= dr_factor + it += 1 + + self.r_vals = r_vals + self.error_vals = error_vals + self.r = global_min_r + self.error = global_min_error + + def estimate_error(self, r): + """ Estimate error values for a given r for each fold and return the mean. """ + + errors = np.zeros(self.folds) + for fi in range(self.folds): + F_M = self.F_M[fi] + F_N = self.F_N[fi] + F_C = solve_banded((1, 1), self.ab, F_M - r * F_N) + errors[fi] = abs(error_calc(F_M, F_N, F_C, r)) + + return np.mean(errors) + + +def estimate_contamination_ratios(F_M, F_N, + lam=0.05, folds=4, iterations=3, + r_range=[0.0, 2.0], dr=0.1, dr_factor=0.1): + ''' Calculates neuropil contamination of ROI + + Parameters + ---------- + F_M: ROI trace + F_N: Neuropil trace + + Returns + ------- + dictionary: key-value pairs + * 'r': the contamination ratio -- corrected trace = M - r*N + * 'err': RMS error + * 'min_error': minimum error + * 'bounds_error': boolean. True if error or R are outside tolerance + ''' + + ns = NeuropilSubtract(lam=lam, folds=folds) + + ns.set_F(F_M, F_N) + + ns.fit(r_range=r_range, + iterations=iterations, + dr=dr, + dr_factor=dr_factor) + + # ns.fit_block_coordinate_desc() + + if ns.r < 0: + logging.warning("r is negative (%f). return 0.0.", ns.r) + ns.r = 0 + + return { + "r": ns.r, + "r_vals": ns.r_vals, + "err": ns.error, + "err_vals": ns.error_vals, + "min_error": ns.error, + "it": len(ns.r_vals) + } diff --git a/brain_observatory/receptive_field_analysis/__init__.py b/brain_observatory/receptive_field_analysis/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/brain_observatory/receptive_field_analysis/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/brain_observatory/receptive_field_analysis/__pycache__/__init__.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4038af98f265a93efa7c9b800564df22c540c4c3 GIT binary patch literal 219 zcmYL@v1$V`42FGBNGRNcbjaP1EtJwWYseC^8I10%Hs)N}SeFYP19_87d8Mp*glw6r z8%lrpKO~`F=(8-Jm59zq@DrtOWAmp%igz(T39Q<vmtuWUX&nFKaau0)mNBu09oVXY z15nl<1Z^M-bB#2x4iSl4VTilTdgU6;uE$w~wu5h!toO2EySho>$b?2N4$y~`>x3=F k-VJEJ9C~Yjz-M+`8{^3J##Aw1r>{T3?mfPZ-`&OP7YgY@4*&oF literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/chisquarerf.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/chisquarerf.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..816c5b35a46eb95040a75dc60617cd1995e662a1 GIT binary patch literal 12512 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 OSb3##wesrH#s37JGcZ{I literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/eventdetection.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/eventdetection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd02af35a0512b84991c51ca37f91910614635fb GIT binary patch literal 2766 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/fit_parameters.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/fit_parameters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d1707ed7bb577024fb2b21a72c67248f25b76b7 GIT binary patch literal 1864 zcmZWp&yO256t+Dx$!xOOU3DYT6+gO2AQ2(D6>z8!g3=bazzV5AVH9a_#!fQbiD$5# z-OXxN0<|X&J@E%*#i>{R3eFto$|*;#hy(9AlWe<qG=9&|&-U~8KEJ!2PK!WOzx~XA z-y-BM9IP4x<qrJj2j~P5G$RudkqM3Hghh-J!GxE2k?&*>HJoflO((-BbaErw5WWbW zkf<dZq6xAsLa_mIQ?x`IWJh=pNN;mN;h3IRb%v=O@u@K>SMT1hc0RB5&r<uT*14`) zm$M64LJkv*6dTGW{P*BDe?V74)O%!3N-EeMxu6s+UTyK$mY}vY)|O^%3D=g5+R|EE z+O=h~won1yf*ghB37iLhsOw+h#1482cfPu{8e95^iLEZNbnbz_J83;~r*z#4K>(fY z!>Tcs>1b?q0QZW*L@FzFJkyBUdU(1(2%_dmD(pC(ExhMOrwiY?>fCah=4yc(RX*2} zk3fUQ?)3bs!HYsFQ886itVk=54@{3$yO5Q*;F?b)oNHo{Cbpu*Gor7-%71>j_d)*~ z0~38d=HljnpKvwnf1-GjE5YCEOLc7eIc#ha=<{McGyN~pLEofSzEkkzh>s+!%`)&1 zM+XDVQx)d}*zuU#T+a@)Ok`oxV;K)qnTePyp3O{Z4qlAwW-+T?=R(9b2gm<K9Gg^) zGWj-yY%p%ZuF=cyI^AKq3)VHE5U~(`N2s4bnccQPp~v)`Sz6MPJ%(psS;?Lf>&^X= zJPI!8Q*w?8MdCF|4@vissJlL~&7+n+qXa)2&Nl?ZIowB(5fxsS;BKpxuwSbL0-(?L zM6vIHKtKflu<`}B{OrxE?_&S0T<x3bz~R%|PxutrvS>iiy|zYLxT|TrlI}oPHB$vy zl%@*Im={uS;tVpT3QxFJfRw3x)S}jz)VYbX^hg3jm>%jKaEpQhF|M{S9@MN9ajqO8 zmfbFHc4H)Myn3=ODa$0p$(So8v)kZQCxg+DwrCepvITO7>Q`ZIoeaDRa@Hl|TTn{U zXXgyT2I-#%C3COuR_WE!uVvs~;`<1oC39N(CA$ulVV9Ia=`FRF0O|)zh}ogWBGO|^ zn0)i2w!KEQQ9rpH@K~wCVbremQ@HwiFvG#-<qY_(MldxTUd3o9$tT6sN_bYra+S#Y z5P)%|nT0fD`_yOp2H4hMU>Xq+2gcW+xQoH1j$Apu@PMIsRp8;;;#stLB?DHnxqksX zhB3f~`o&TQ7Ng!JFE80P`uEx2e||am>SI@ET=D5OmcRrjW2t2o46~fuDx6F+n-<xu z^2~IiUxSc(zJ3KnwEY4>0E<Sh;z6pSCP0D8RXDa+aOB5QXS_IsT@2pVy;r8+0Ij#R zBsCJ&kva<0bW+S*Y*C}&P<ISeFj2LW9O_DfHP1kBGo$x#4L)>7FbAyL^SL;%I%vn= a@WV+irkVT*Pjy7?0!{0Wg`IFSZ2bq*jLqx- literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/fitgaussian2D.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/fitgaussian2D.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe492ee0d8d7cba7b7e53b14821d2f2aae5815fa GIT binary patch literal 4093 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/postprocessing.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/postprocessing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be7f2819e72ecc7eb36f80b7dbe3b994f613ec9d GIT binary patch literal 2934 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/receptive_field.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/receptive_field.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c90ccce81f4771d6f03f6de7e090206f7a6e01dd GIT binary patch literal 4920 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 CU<f|| literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/tools.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/tools.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eed651db4d45894c56ea3aab2114f2dffd226c02 GIT binary patch literal 1344 zcma)5&2JMs5FdLtAukXpyz)^F6$dCpf)u?Efl#RUI-*_>REid@+_jr7+3qH`o0mK} z2WS!H214Qt;sj^@n!R%3U*N=yQ>yj=!mF9}&dhIS=jZXAMxze6@()kNwZi~k=;Ox< zaB~aA%%hSZ**0`Q9+H6!w^@hDimalAOa1_wwS-|1EqW7@#GFO-0@j#hl5f{`Kn8R0 z4&K8(*kXtZmk+=y82u-~&Y?=d!Q(S8r*JA>+hGLTfj4{*BAD-CIfjQQ9y^PhE@6*M zn8WBfc<tjqf~H?<@{+f%mSJkuMw696PmR6(+ta%@qK8Il6Nz;pTdU$fk&mO>xk!p! zioYY34^33`Rc;d0MSp#4qWkG;WH8f}zDRnas}P%I7$JL$t6HRaT&!Zop|FJ>FKU&j zzD<WJUQ1ObW08w&Y*Mpmiy||v{`gzHou$Sm#YTVW0{*I@zN+y5O|r(tS}fDVn%EY8 zLk4n~Ry!*ak(s4dn*ux>Z9g(iyJnh_VZ)6B$(l?PahjON@_YFG<^MW>_^t9^F&z~P zkzIo|4p9xy{_dXYmGi$&d>&&w1;8|pCM+k^0<G$<B=|O;Q8}h(9K#WX=X?%w-h~OX zI0Ke#as6rZ%E3EML-*K4e8MLI`U3BZM(Z|kfn$z$*=g9~7*n5wE_{S@Jh;CCgG)X( z#5`|DZ5N>b{G>9PM^xn}sAq`E2uXeybopuU*)FX>UUhyi0q2)3H!Ed5HEC|F$P-nD zM1NVK$u#9r`iQ$KSDMDB42i5}wNp)V9~Shr@@H38h9cWkC6gr^dXlG#DAvbNT_l#y zpaMS2>g)u{DRu-ky=V9=_fdP7iS8}U#9b8AL6z>3`GjrZJ?@42oaGMa3n}Mq82#gj z+RGE}xD0w+-*MpZ7@l}q+b~$L;nYG1hls(#3Lcri|N0NCP*#Ms+8_bK3M3`KJETvd zLpMmBppb@ELdNU=#$8=(_M1V;x}C#X*-f4M>oA>Tnz4QDQ`gr~%nT}EAv=msoz<po klb22*@Z;rK&}7?3qR;1twbtG!<YuOp{8$n}wV;0dJJp#vb^rhX literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/utilities.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a375e3af7a05eecd0d1a0ee6a8259d6422e6fbd9 GIT binary patch literal 7274 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 L%D2i}#b5d#Pn%?z literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/visualization.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/visualization.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..106b36177bbb0522179c4ac804b7c4f61cd63243 GIT binary patch literal 6954 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 literal 0 HcmV?d00001 diff --git a/brain_observatory/receptive_field_analysis/chisquarerf.py b/brain_observatory/receptive_field_analysis/chisquarerf.py new file mode 100644 index 0000000000..97647b9c6f --- /dev/null +++ b/brain_observatory/receptive_field_analysis/chisquarerf.py @@ -0,0 +1,510 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import scipy.interpolate as si +import scipy.ndimage.filters as filt +import scipy.stats as stats + + +ON_LUMINANCE = 255 +OFF_LUMINANCE = 0 + + +def chi_square_binary(events, LSN_template): + # note: can only be applied to binary events for trial responses + # + # *****INPUT***** + # events: 2D numpy bool with shape (num_trials,num_cells) for presence + # or absence of response on a given trial + # LSN_template: 3D numpy int8 with shape (num_trials,num_y_pixels,num_x_pixels) + # for luminance at each pixel location + # + # *****OUTPUT***** + # chi_square_grid_NLL: 3D numpy float with shape (num_cells,num_y_pixels,num_x_pixels) + # that gives the p value for the hypothesis that a receptive field is contained + # within a 7x7 pixel mask centered on a given pixel location as measured + # by a chi-square test for the responses among the pixels (both on and off) + # that fall within the mask. + + num_trials = np.shape(events)[0] + num_cells = np.shape(events)[1] + num_y = np.shape(LSN_template)[1] + num_x = np.shape(LSN_template)[2] + + # for each pixel location, get a mask that is centered on that location + # disc_masks has shape (num_y,num_x,num_y,num_x) + disc_masks = get_disc_masks(LSN_template) + + # determine which trials each pixel is active (i.e not gray), + # broken up by ON and OFF pixels. + # trial_matrix has shape (num_y,num_x,2,num_trials) + trial_matrix = build_trial_matrix(LSN_template, num_trials) + + # get the total number of trials each pixel is active (i.e. not gray) + # trials_per_pixel has shape (num_y,num_x,2) + trials_per_pixel = np.sum(trial_matrix, axis=3) + + # get the sum of the number of events across all trials that each pixel is active + # events_per_pixel has shape (num_cells,num_y,num_x,2) + events_per_pixel = get_events_per_pixel(events, trial_matrix) + + # smooth stimulus-triggered average spatially with a gaussian + for n in range(num_cells): + for on_off in range(2): + events_per_pixel[n, :, :, on_off] = smooth_STA(events_per_pixel[n, :, :, on_off]) + + # calculate the p_value for each exclusion region + chi_square_grid = np.zeros((num_cells, num_y, num_x)) + for y in range(num_y): + for x in range(num_x): + exclusion_mask = np.ones((num_y, num_x, 2)) * disc_masks[y, x, :, :].reshape(num_y, num_x, 1) + p_vals, __ = chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel) + chi_square_grid[:, y, x] = p_vals + + return chi_square_grid + + +def get_peak_significance(chi_square_grid_NLL, + LSN_template, + alpha=0.05): + # ****INPUT***** + # chi_square_grid_NLL: result of chi_square_binary(events,LSN_template) + # LSN_template: 3D numpy int8 with shape (num_trials,num_y_pixels,num_x_pixels) + # for luminance at each pixel location + # + # *****OUTPUT***** + # significant_cells: 1D numpy bool with shape (num_cells,) that indicates + # whether or not each cell has a location with a significant chance of a + # true receptive field + # best_exclusion_region_list: list of 2D numpy bool with len (num_cells). For each cell, + # the array is a mask for the best pixel, or all false + + num_cells = np.shape(chi_square_grid_NLL)[0] + num_y = np.shape(chi_square_grid_NLL)[1] + num_x = np.shape(chi_square_grid_NLL)[2] + + chi_square_grid = NLL_to_pvalue(chi_square_grid_NLL) + + # get the average size of all masks in units of number of pixels + disc_masks = get_disc_masks(LSN_template) + pixels_per_mask_per_pixel = np.sum(disc_masks, axis=(2, 3)).astype(float) + + # find the smallest p-value and determine if it's significant + significant_cells = np.zeros((num_cells)).astype(bool) + best_p = np.zeros((num_cells)) + p_value_correction_factor_per_pixel = (1.0 * num_y * num_x / pixels_per_mask_per_pixel) + + best_exclusion_region_list = [] + corrected_p_value_array_list = [] + for n in range(num_cells): + + # Sidak correction: + p_value_corrected_per_pixel = 1-np.power((1-chi_square_grid[n, :,:]), p_value_correction_factor_per_pixel) + corrected_p_value_array_list.append(p_value_corrected_per_pixel) + + y, x = np.unravel_index(p_value_corrected_per_pixel.argmin(), (num_y, num_x)) + + # if more than one p-value that maxes out, use the median location + if np.sum(p_value_corrected_per_pixel == 0.0) > 1: + + y, x = np.unravel_index(np.argwhere(p_value_corrected_per_pixel.flatten() == 0.0)[:, 0], (num_y, num_x)) + center_y, center_x = locate_median(y, x) + + best_p[n] = p_value_corrected_per_pixel[y,x] + if best_p[n] < alpha: + significant_cells[n] = True + best_exclusion_region_list.append(disc_masks[y, x, :,:].astype(np.bool)) + else: + best_exclusion_region_list.append(np.zeros((disc_masks.shape[0], disc_masks.shape[1]), dtype=np.bool)) + + return significant_cells, best_p, corrected_p_value_array_list, best_exclusion_region_list + + +def locate_median(y, x): + + med_x = np.median(x) + med_y = np.median(y) + center_x = x[0] + center_y = y[0] + + for i in range(len(x)): + dx = x[i] - med_x + dy = y[i] - med_y + dc_x = center_x - med_x + dc_y = center_y - med_y + + if np.sqrt(dx ** 2 + dy ** 2) < np.sqrt(dc_x ** 2 + dc_y ** 2): + center_x = x[i] + center_y = y[i] + + return center_y, center_x + + +def pvalue_to_NLL(p_values, max_NLL=10.0): + return np.where(p_values == 0.0, max_NLL, -np.log10(p_values)) + + +def NLL_to_pvalue(NLLs, log_base=10.0): + return (log_base ** (-NLLs)) + + +def get_events_per_pixel(responses_np, trial_matrix): + '''Obtain a matrix linking cellular responses to pixel activity. + + Parameters + ---------- + responses_np : np.ndarray + Dimensions are (nTrials, nCells). Boolean values indicate presence/absence + of a response on a given trial. + trial_matrix : np.ndarray + Dimensions are (nYPixels, nXPixels, {on, off}, nTrials). Boolean values + indicate that a pixel was on/off on a particular trial. + + Returns + ------- + events_per_pixel : np.ndarray + Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Values for each + cell, pixel, and on/off state are the sum of events for that cell across + all trials where the pixel was in the on/off state. + + ''' + + num_cells = np.shape(responses_np)[1] + num_y = np.shape(trial_matrix)[0] + num_x = np.shape(trial_matrix)[1] + + events_per_pixel = np.zeros((num_cells, num_y, num_x, 2)) + for y in range(num_y): + for x in range(num_x): + for on_off in range(2): + frames = np.argwhere(trial_matrix[y, x, on_off, :])[:, 0] + events_per_pixel[:, y, x, on_off] = np.sum(responses_np[frames, :], axis=0) + + return events_per_pixel + + +def smooth_STA(STA, gauss_std=0.75, total_degrees=64): + '''Smooth an image by convolution with a gaussian kernel + + Parameters + ---------- + STA : np.ndarray + Input image + gauss_std : numeric, optional + Standard deviation of the gaussian kernel. Will be applied to the + upsampled image, so units are visual degrees. Default is 0.75 + total_degrees : int, optional + Size in visual degrees of the input image along its zeroth (row) axis. + Used to set the scale factor for up/downsampling. + + Returns + ------- + STA_smoothed : np.ndarray + Smoothed image + ''' + + deg_per_pnt = total_degrees // STA.shape[0] + STA_interpolated = interpolate_RF(STA, deg_per_pnt) + STA_interpolated_smoothed = filt.gaussian_filter(STA_interpolated, gauss_std) + STA_smoothed = deinterpolate_RF(STA_interpolated_smoothed, STA.shape[1], STA.shape[0], deg_per_pnt) + + return STA_smoothed + + +def interpolate_RF(rf_map, deg_per_pnt): + '''Upsample an image + + Parameters + ---------- + rf_map : np.ndarray + Input image + deg_per_pnt : numeric + scale factor + + Returns + ------- + interpolated : np.ndarray + Upsampled image + ''' + + x_pnts = np.shape(rf_map)[1] + y_pnts = np.shape(rf_map)[0] + + x_coor = np.arange(-(x_pnts - 1) * deg_per_pnt / 2, (x_pnts + 1) * deg_per_pnt / 2, deg_per_pnt) + y_coor = np.arange(-(y_pnts - 1) * deg_per_pnt / 2, (y_pnts + 1) * deg_per_pnt / 2, deg_per_pnt) + + x_interpolated = np.arange(-(x_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (x_pnts / 2 - 1) * deg_per_pnt + 1, 1) + y_interpolated = np.arange(-(y_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (y_pnts / 2 - 1) * deg_per_pnt + 1, 1) + + interpolated = si.interp2d(x_coor, y_coor, rf_map) + interpolated = interpolated(x_interpolated, y_interpolated) + + return interpolated + + +def deinterpolate_RF(rf_map, x_pnts, y_pnts, deg_per_pnt): + '''Downsample an image + + Parameters + ---------- + rf_map : np.ndarray + Input image + x_pnts : np.ndarray + Count of sample points along the first (column) axis + y_pnts : np.ndarray + Count of sample points along the zeroth (row) axis + deg_per_pnt : numeric + scale factor + + Returns + ------- + sampled_yx : np.ndarray + Downsampled image + ''' + + # x_pnts = 28 + # y_pnts = 16 + + x_interpolated = np.arange(-(x_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (x_pnts / 2 - 1) * deg_per_pnt + 1, 1) + y_interpolated = np.arange(-(y_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (y_pnts / 2 - 1) * deg_per_pnt + 1, 1) + + x_deinterpolate = np.arange(0, len(x_interpolated), deg_per_pnt) + y_deinterpolate = np.arange(0, len(y_interpolated), deg_per_pnt) + + sampled_y = rf_map[y_deinterpolate, :] + sampled_yx = sampled_y[:, x_deinterpolate] + + return sampled_yx + + +def chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel): + '''Determine if cells respond preferentially to on/off pixels in a mask using + a chi2 test. + + Parameters + ---------- + exclusion_mask : np.ndarray + Dimensions are (nYPixels, nXPixels, {on, off}). Integer indicator for INCLUSION (!) + of a pixel within the testing region. + events_per_pixel : np.ndarray + Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Integer values + are response counts by cell to on/off luminance at each pixel. + trials_per_pixel : np.ndarray + Dimensions are (nYPixels, nXPixels, {on, off}). Integer values are + counts of trials where a pixel is on/off. + + Returns + ------- + p_vals : np.ndarray + One-dimensional, of length nCells. Float values are p-values + for the hypothesis that a given cell has a receptive field within the + exclusion mask. + chi : np.ndarray + Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Values (float) + are squared residual event counts divided by expected event counts. + ''' + + num_y = np.shape(exclusion_mask)[0] + num_x = np.shape(exclusion_mask)[1] + + # d.f. is number of pixels in mask minus one + degrees_of_freedom = int(np.sum(exclusion_mask)) - 1 + + # observed_by_pixel has shape (num_cells,num_y,num_x,2) + expected_by_pixel = get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel) + observed_by_pixel = (events_per_pixel * exclusion_mask.reshape(1, num_y, num_x, 2)).astype(float) + + # calculate test statistic given observed and expected + residual_by_pixel = observed_by_pixel - expected_by_pixel + chi = (residual_by_pixel ** 2) / expected_by_pixel + chi_sum = np.nansum(chi, axis=(1, 2, 3)) + + # get p-value given test statistic and degrees of freedom + p_vals = 1.0 - stats.chi2.cdf(chi_sum, degrees_of_freedom) + + return p_vals, chi + + +def get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel): + '''Calculate expected number of events per pixel + + Parameters + ---------- + exclusion_mask : np.ndarray + Dimensions are (nYPixels, nXPixels, {on, off}). Integer indicator for INCLUSION (!) + of a pixel within the testing region. + events_per_pixel : np.ndarray + Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Integer values + are response counts by cell to on/off luminance at each pixel. + trials_per_pixel : np.ndarray + Dimensions are (nYPixels, nXPixels, {on, off}). Integer values are + counts of trials where a pixel is on/off. + + Returns + ------- + np.ndarray : + Dimensions (nCells, nYPixels, nXPixels, {on, off}). Float values are + pixelwise counts of events expected if events are evenly distributed + in mask across trials. + ''' + + num_y = np.shape(exclusion_mask)[0] + num_x = np.shape(exclusion_mask)[1] + num_cells = np.shape(events_per_pixel)[0] + + exclusion_mask = exclusion_mask.reshape(1, num_y, num_x, 2) + trials_per_pixel = trials_per_pixel.reshape(1, num_y, num_x, 2) + + masked_trials = exclusion_mask * trials_per_pixel + masked_events = exclusion_mask * events_per_pixel + + total_trials = np.sum(masked_trials).astype(float) + total_events_by_cell = np.sum(masked_events, axis=(1, 2, 3)).astype(float) + + expected_by_cell_per_trial = total_events_by_cell / total_trials + return masked_trials * expected_by_cell_per_trial.reshape(num_cells, 1, 1, 1) + + +def build_trial_matrix(LSN_template, + num_trials, + on_off_luminance=(ON_LUMINANCE, OFF_LUMINANCE)): + '''Construct indicator arrays for on/off pixels across trials. + + Parameters + ---------- + LSN_template : np.ndarray + Dimensions are (nTrials, nYPixels, nXPixels). Luminance values per pixel + and trial. The size of the first dimension may be larger than the num_trials + argument (in which case only the first num_trials slices will be used) + but may not be smaller. + num_trials : int + The number of trials (left-justified) to build indicators for. + on_off_luminance : array-like, optional + The zeroth element is the luminance value of a pixel when on, the first when off. + Defaults are [255, 0]. + + Returns + ------- + trial_mat : np.ndarray + Dimensions are (nYPixels, nXPixels, {on, off}, nTrials). Boolean values + indicate that a pixel was on/off on a particular trial. + ''' + + _, num_y, num_x = np.shape(LSN_template) + trial_mat = np.zeros( (num_y, num_x, 2, num_trials), dtype=bool ) + + for y in range(num_y): + for x in range(num_x): + for oo, on_off in enumerate(on_off_luminance): + + frame = np.argwhere( LSN_template[:num_trials, y, x] == on_off )[:, 0] + trial_mat[y, x, oo, frame] = True + + return trial_mat + + +def get_disc_masks(LSN_template, radius=3, on_luminance=ON_LUMINANCE, off_luminance=OFF_LUMINANCE): + '''Obtain an indicator mask surrounding each pixel. The mask is a square, excluding pixels which + are coactive on any trial with the main pixel. + + Parameters + ---------- + LSN_template : np.ndarray + Dimensions are (nTrials, nYPixels, nXPixels). Luminance values per pixel + and trial. + radius : int + The base mask will be a box whose sides are 2 * radius + 1 in length. + on_luminance : int, optional + The value of the luminance for on trials. Default is 255 + off_luminance : int, optional + The value of the luminance for off trials. Default is 0 + + + Returns + ------- + masks : np.ndarray + Dimensions are (nYPixels, nXPixels, nYPixels, nXPixels). The first 2 + dimensions describe the pixel from which the mask was computed. The last + 2 serve as the dimensions of the mask images themselves. Masks are binary + arrays of type float, with 1 indicating inside, 0 outside. + ''' + + num_y = np.shape(LSN_template)[1] + num_x = np.shape(LSN_template)[2] + + # convert template to true on trials a pixel is not gray and false when gray + LSN_binary = np.where(LSN_template == off_luminance, 1, LSN_template) + LSN_binary = np.where(LSN_binary == on_luminance, 1, LSN_binary) + LSN_binary = np.where(LSN_binary == 1, 1.0, 0.0) + + # get number of trials each pixel is not gray + on_trials = LSN_binary.sum(axis=0).astype(float) # shape is (num_y,num_x) + + masks = np.zeros((num_y, num_x, num_y, num_x)) + for y in range(num_y): + for x in range(num_x): + trials_not_gray = np.argwhere( LSN_binary[:, y, x] > 0 )[:, 0] + raw_mask = np.divide( LSN_binary[trials_not_gray, :, :].sum(axis=0), on_trials ) + + center_y, center_x = np.unravel_index( raw_mask.argmax(), (num_y, num_x) ) + + # include center pixel in mask + raw_mask[center_y, center_x] = 0.0 + + x_max = center_x + radius + 1 + if x_max > num_x: + x_max = num_x + x_min = center_x - radius + if x_min < 0: + x_min = 0 + y_max = center_y + radius + 1 + if y_max > num_y: + y_max = num_y + y_min = center_y - radius + if y_min < 0: + y_min = 0 + + # don't include far away pixels that just happen + # to not have any trials in common with center pixel + clean_mask = np.ones(np.shape(raw_mask)) + clean_mask[y_min:y_max, x_min:x_max] = raw_mask[y_min:y_max, x_min:x_max] + + masks[y, x, :, :] = clean_mask + + masks = np.where(masks > 0, 0.0, 1.0) + + return masks + diff --git a/brain_observatory/receptive_field_analysis/eventdetection.py b/brain_observatory/receptive_field_analysis/eventdetection.py new file mode 100644 index 0000000000..93b56d6f99 --- /dev/null +++ b/brain_observatory/receptive_field_analysis/eventdetection.py @@ -0,0 +1,157 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .utilities import smooth +import numpy as np +import scipy.stats as sps + +def detect_events(data, cell_index, stimulus, debug_plots=False): + + + + stimulus_table = data.get_stimulus_table(stimulus) + dff_trace = data.get_dff_traces()[1][cell_index, :] + + + + k_min = 0 + k_max = 10 + delta = 3 + + dff_trace = smooth(dff_trace, 5) + + + + var_dict = {} + debug_dict = {} + for ii, fi in enumerate(stimulus_table['start'].values): + + if ii > 0 and stimulus_table.iloc[ii].start == stimulus_table.iloc[ii-1].end: + offset = 1 + else: + offset = 0 + + if fi + k_min >= 0 and fi + k_max <= len(dff_trace): + trace = dff_trace[fi + k_min+1+offset:fi + k_max+1+offset] + + xx = (trace - trace[0])[delta] - (trace - trace[0])[0] + yy = max((trace - trace[0])[delta + 2] - (trace - trace[0])[0 + 2], + (trace - trace[0])[delta + 3] - (trace - trace[0])[0 + 3], + (trace - trace[0])[delta + 4] - (trace - trace[0])[0 + 4]) + + var_dict[ii] = (trace[0], trace[-1], xx, yy) + debug_dict[fi + k_min+1+offset] = (ii, trace) + + xx_list, yy_list = [], [] + for _, _, xx, yy in var_dict.values(): + xx_list.append(xx) + yy_list.append(yy) + + mu_x = np.median(xx_list) + mu_y = np.median(yy_list) + + xx_centered = np.array(xx_list)-mu_x + yy_centered = np.array(yy_list)-mu_y + + std_factor = 1 + std_x = 1./std_factor*np.percentile(np.abs(xx_centered), [100*(1-2*(1-sps.norm.cdf(std_factor)))]) + std_y = 1./std_factor*np.percentile(np.abs(yy_centered), [100*(1-2*(1-sps.norm.cdf(std_factor)))]) + + curr_inds = [] + allowed_sigma = 4 + for ii, (xi, yi) in enumerate(zip(xx_centered, yy_centered)): + if np.sqrt(((xi)/std_x)**2+((yi)/std_y)**2) < allowed_sigma: + curr_inds.append(True) + else: + curr_inds.append(False) + + curr_inds = np.array(curr_inds) + data_x = xx_centered[curr_inds] + data_y = yy_centered[curr_inds] + Cov = np.cov(data_x, data_y) + Cov_Factor = np.linalg.cholesky(Cov) + Cov_Factor_Inv = np.linalg.inv(Cov_Factor) + + #=================================================================================================================== + + noise_threshold = max(allowed_sigma * std_x + mu_x, allowed_sigma * std_y + mu_y) + mu_array = np.array([mu_x, mu_y]) + yes_set, no_set = set(), set() + for ii, (t0, tf, xx, yy) in var_dict.items(): + + + xi_z, yi_z = Cov_Factor_Inv.dot((np.array([xx,yy]) - mu_array)) + + # Conditions in order: + # 1) Outside noise blob + # 2) Minimum change in df/f + # 3) Change evoked by this trial, not previous + # 4) At end of trace, ended up outside of noise floor + + if np.sqrt(xi_z**2 + yi_z**2) > 4 and yy > .05 and xx < yy and tf > noise_threshold/2: + yes_set.add(ii) + else: + no_set.add(ii) + + + + assert len(var_dict) == len(stimulus_table) + b = np.zeros(len(stimulus_table), dtype=np.bool) + for yi in yes_set: + b[yi] = True + + if debug_plots == True: + import matplotlib.pyplot as plt + fig, ax = plt.subplots(1,2) + # ax[0].plot(dff_trace) + for key, val in debug_dict.items(): + ti, trace = val + if ti in no_set: + ax[0].plot(np.arange(key, key+len(trace)), trace, 'b') + elif ti in yes_set: + ax[0].plot(np.arange(key, key + len(trace)), trace, 'r', linewidth=2) + else: + raise Exception + + for ii in yes_set: + ax[1].plot([var_dict[ii][2]], [var_dict[ii][3]], 'r.') + + for ii in no_set: + ax[1].plot([var_dict[ii][2]], [var_dict[ii][3]], 'b.') + + print('number_of_events: %d' % b.sum()) + plt.show() + + return b diff --git a/brain_observatory/receptive_field_analysis/fit_parameters.py b/brain_observatory/receptive_field_analysis/fit_parameters.py new file mode 100644 index 0000000000..4d3273d709 --- /dev/null +++ b/brain_observatory/receptive_field_analysis/fit_parameters.py @@ -0,0 +1,86 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .fitgaussian2D import fitgaussian2D, GaussianFitError, gaussian2D +import numpy as np +import pandas as pd +import collections +import sys +import warnings + +def add_to_fit_parameters_dict_single(fit_parameters_dict, p): + + fit_parameters_dict['height'].append(p[0]) + fit_parameters_dict['center_y'].append(p[1]) + fit_parameters_dict['center_x'].append(p[2]) + fit_parameters_dict['width_y'].append(p[3]) + fit_parameters_dict['width_x'].append(p[4]) + fit_parameters_dict['rotation'].append(p[5]) + if (p[3] is None) or (p[4] is None): + fit_parameters_dict['area'].append(None) + else: + fit_parameters_dict['area'].append(np.pi * (3./2) ** 2 * np.abs(p[3]) * np.abs(p[4])) + +def get_gaussian_fit_single_channel(rf, fit_parameters_dict): + + try: + p_fit = fitgaussian2D(rf) + add_to_fit_parameters_dict_single(fit_parameters_dict, p_fit) + data_fitted_on = gaussian2D(*p_fit)(*np.indices(rf.shape)) + fit_parameters_dict['data'].append(data_fitted_on) + except GaussianFitError: + warnings.warn('GaussianFitError (on subfield) caught') + add_to_fit_parameters_dict_single(fit_parameters_dict, [None]*6) + fit_parameters_dict['data'].append(np.zeros_like(rf)) + +def compute_distance(center_on, center_off): + + center_x_on, center_y_on = center_on + center_x_off, center_y_off = center_off + + if (center_x_on is None) or (center_y_on is None) or (center_x_off is None) or (center_y_off is None): + return None + else: + return np.sqrt((center_x_off-center_x_on)**2+(center_y_off-center_y_on)**2) + +def compute_overlap(data_fitted_on, data_fitted_off): + + on_bin = np.where(data_fitted_on > 0.001, 1, 0) + off_bin = np.where(data_fitted_off > 0.001, 1, 0) + + return float((np.multiply(on_bin, off_bin)).sum()) / (np.sqrt(on_bin.sum()) * np.sqrt(off_bin.sum())) + + + diff --git a/brain_observatory/receptive_field_analysis/fitgaussian2D.py b/brain_observatory/receptive_field_analysis/fitgaussian2D.py new file mode 100644 index 0000000000..c0de787fd1 --- /dev/null +++ b/brain_observatory/receptive_field_analysis/fitgaussian2D.py @@ -0,0 +1,175 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from scipy import optimize + + +class GaussianFitError(RuntimeError): pass + + +def gaussian2D(height, center_x, center_y, width_x, width_y, rotation): + '''Build a function which evaluates a scaled 2d gaussian pdf + + Parameters + ---------- + height : float + scale factor + center_x : float + first coordinate of mean + center_y : float + second coordinate of mean + width_x : float + standard deviation along x axis + width_y : float + standard deviation along y axis + rotation : float + degrees clockwise by which to rotate the gaussian + + Returns + ------- + rotgauss: fn + parameters are x and y positions (row/column semantics are set by your + inputs to this function). Return value is the scaled gaussian pdf + evaluated at the argued point. + + ''' + + width_x = float(width_x) + width_y = float(width_y) + + rotation = np.deg2rad(rotation) + center_xp = center_x*np.cos(rotation) - center_y*np.sin(rotation) + center_yp = center_x*np.sin(rotation) + center_y*np.cos(rotation) + + def rotgauss(x,y): + xp = x*np.cos(rotation) - y*np.sin(rotation) + yp = x*np.sin(rotation) + y*np.cos(rotation) + g = height*np.exp(-((center_xp-xp)/width_x)**2/2.0 - ((center_yp-yp)/width_y)**2/2.) + return g + return rotgauss + + +def moments2(data): + '''Treating input image data as an independent multivariate gaussian, + estimate mean and standard deviations + + Parameters + ---------- + data : np.ndarray + 2d numpy array. + + Returns + ------- + height : float + The maximum observed value in the data + y : float + Mean row index + x : float + Mean column index + width_y : float + The standard deviation along the mean row + width_x : float + The standard deviation along the mean column + None : + This function returns an instance of None. + + Notes + ----- + uses original method from website for finding center + + ''' + + total = data.sum() + + Y,X = np.indices(data.shape) + x = ( X * data ).sum() / total + y = ( Y * data ).sum() / total + + col = data[:, int(np.around(x))] + width_x = np.sqrt( abs( ( np.arange(col.size) - y ) ** 2 * col ).sum() / col.sum() ) + + row = data[int(np.around(y)), :] + width_y = np.sqrt( abs( ( np.arange(row.size) - x ) ** 2 * row ).sum() / row.sum() ) + + height = data.max() + + return height, y, x, width_y, width_x, None + + +def fitgaussian2D(data): + '''Fit a 2D gaussian to an image + + Parameters + ---------- + data : np.ndarray + input image + + Returns + ------- + p2 : list + height + row mean + column mean + row standard deviation + column standard deviation + rotation + + Notes + ----- + see gaussian2D for details about output values + + ''' + + params = moments2(data) + def errorfunction(p): + p2 = np.array([p[0], params[1], params[2], np.abs(p[1]), np.abs(p[2]), p[3]]) + + + val = np.ravel(gaussian2D(*p2)(*np.indices(data.shape)) - data) + + return (val**2).sum() + + res = optimize.minimize(errorfunction, [ params[0], params[3], params[4], 0.0 ], method='Nelder-Mead', options={'maxfev':2500}) + p = res.x + p2 = np.array([p[0], params[1], params[2], np.abs(p[1]), np.abs(p[2]), p[3]]) + success = res.success + if not success and res.status != 2: # Status 2 is loss of precision; might need to handle this separately instead of passing... + print(success) + print(res.message) + print(res.status) + raise GaussianFitError('Gaussian optimization failed to converge:\n%s' % res.message) + + return p2 diff --git a/brain_observatory/receptive_field_analysis/postprocessing.py b/brain_observatory/receptive_field_analysis/postprocessing.py new file mode 100644 index 0000000000..ebb294b4fa --- /dev/null +++ b/brain_observatory/receptive_field_analysis/postprocessing.py @@ -0,0 +1,137 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .fit_parameters import get_gaussian_fit_single_channel, compute_distance, compute_overlap +from .chisquarerf import chi_square_binary, get_peak_significance, pvalue_to_NLL +from .utilities import upsample_image_to_degrees +import collections +import numpy as np +import sys + +def get_gaussian_fit(rf): + + fit_parameters_dict_combined = {'on':collections.defaultdict(list), 'off':collections.defaultdict(list)} + counter = {'on':0, 'off':0} + for on_off_key in ['on', 'off']: + fit_parameters_dict = fit_parameters_dict_combined[on_off_key] + for ci in range(rf[on_off_key]['fdr_mask']['attrs']['number_of_components']): + curr_component_mask = upsample_image_to_degrees(np.logical_not(rf[on_off_key]['fdr_mask']['data'][ci,:,:])) > .5 + rf_response = upsample_image_to_degrees(rf[on_off_key]['rts_convolution']['data'].copy()) + rf_response[curr_component_mask] = 0 + + if rf_response.sum() > 0: + get_gaussian_fit_single_channel(rf_response, fit_parameters_dict) + counter[on_off_key] += 1 + + for ii_off in range(counter['on']): + fit_parameters_dict_combined['on']['distance'].append([None]*counter['off']) + fit_parameters_dict_combined['on']['overlap'].append([None] * counter['off']) + + for ii_off in range(counter['off']): + fit_parameters_dict_combined['off']['distance'].append([None] * counter['on']) + fit_parameters_dict_combined['off']['overlap'].append([None]*counter['on']) + + + for ii_on in range(counter['on']): + for ii_off in range(counter['off']): + center_on = fit_parameters_dict_combined['on']['center_x'][ii_on], fit_parameters_dict_combined['on']['center_y'][ii_on] + center_off = fit_parameters_dict_combined['off']['center_x'][ii_off], fit_parameters_dict_combined['off']['center_y'][ii_off] + curr_distance = compute_distance(center_on, center_off) + fit_parameters_dict_combined['on']['distance'][ii_on][ii_off] = curr_distance + fit_parameters_dict_combined['off']['distance'][ii_off][ii_on] = curr_distance + + data_on = fit_parameters_dict_combined['on']['data'][ii_on] + data_off = fit_parameters_dict_combined['off']['data'][ii_off] + curr_overlap = compute_overlap(data_on, data_off) + fit_parameters_dict_combined['on']['overlap'][ii_on][ii_off] = curr_overlap + fit_parameters_dict_combined['off']['overlap'][ii_off][ii_on] = curr_overlap + + return fit_parameters_dict_combined, counter + +def run_postprocessing(data, rf): + + stimulus = rf['attrs']['stimulus'] + + # Gaussian fit postprocessing: + fit_parameters_dict_combined, counter = get_gaussian_fit(rf) + + for on_off_key in ['on', 'off']: + + if counter[on_off_key] > 0: + + rf[on_off_key]['gaussian_fit'] = {} + rf[on_off_key]['gaussian_fit']['attrs'] = {} + + fit_parameters_dict = fit_parameters_dict_combined[on_off_key] + for key, val in fit_parameters_dict.items(): + + if key == 'data': + rf[on_off_key]['gaussian_fit']['data'] = np.array(val) + else: + rf[on_off_key]['gaussian_fit']['attrs'][key] = np.array(val) + + # Chi squared test statistic postprocessing: + cell_index = rf['attrs']['cell_index'] + locally_sparse_noise_template = data.get_stimulus_template(stimulus) + + event_array = np.zeros((rf['event_vector']['data'].shape[0], 1), dtype=np.bool) + event_array[:,0] = rf['event_vector']['data'] + + chi_squared_grid = chi_square_binary(event_array, locally_sparse_noise_template) + alpha = rf['on']['fdr_mask']['attrs']['alpha'] + assert rf['off']['fdr_mask']['attrs']['alpha'] == alpha + chi_square_grid_NLL = pvalue_to_NLL(chi_squared_grid) + + peak_significance = get_peak_significance(chi_square_grid_NLL, locally_sparse_noise_template, alpha=alpha) + significant = peak_significance[0][0] + min_p = peak_significance[1][0] + pvalues_chi_square = peak_significance[2][0] + best_exclusion_region_mask = peak_significance[3][0] + + chi_squared_grid_dict = { + 'best_exclusion_region_mask':{'data':best_exclusion_region_mask}, + 'attrs':{'significant':significant, 'alpha': alpha, 'min_p':min_p}, + 'pvalues':{'data':pvalues_chi_square} + } + + rf['chi_squared_analysis'] = chi_squared_grid_dict + + return rf + +if __name__ == "__main__": + # csid = 517472416 # triple! + csid = 517526760 # two ON + # csid = 539917553 + # csid = 540988186 diff --git a/brain_observatory/receptive_field_analysis/receptive_field.py b/brain_observatory/receptive_field_analysis/receptive_field.py new file mode 100644 index 0000000000..6e0be15186 --- /dev/null +++ b/brain_observatory/receptive_field_analysis/receptive_field.py @@ -0,0 +1,204 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from .eventdetection import detect_events +from statsmodels.sandbox.stats.multicomp import multipletests +import numpy as np +from .utilities import get_A, get_A_blur, get_shuffle_matrix, get_components, dict_generator +from .postprocessing import run_postprocessing +import h5py + +def events_to_pvalues_no_fdr_correction(data, event_vector, A, number_of_shuffles=5000, response_detection_error_std_dev=.1, seed=1): + + number_of_pixels = A.shape[0] // 2 + + # Initializations: + number_of_events = event_vector.sum() + np.random.seed(seed) + + shuffle_data = get_shuffle_matrix(data, event_vector, A, number_of_shuffles=number_of_shuffles, response_detection_error_std_dev=response_detection_error_std_dev) + + # Build list of p-values: + response_triggered_stimulus_vector = A.dot(event_vector)/number_of_events + p_value_list = [] + for pi in range(2*number_of_pixels): + curr_p_value = 1-(shuffle_data[pi, :] < response_triggered_stimulus_vector[pi]).sum()*1./number_of_shuffles + p_value_list.append(curr_p_value) + + return np.array(p_value_list) + +def compute_receptive_field(data, cell_index, stimulus, **kwargs): + + alpha = kwargs.pop('alpha') + + event_vector = detect_events(data, cell_index, stimulus) + + A_blur = get_A_blur(data, stimulus) + number_of_pixels = A_blur.shape[0] // 2 + + pvalues = events_to_pvalues_no_fdr_correction(data, event_vector, A_blur, **kwargs) + + + stimulus_table = data.get_stimulus_table(stimulus) + stimulus_template = data.get_stimulus_template(stimulus)[stimulus_table['frame'].values, :, :] + s1, s2 = stimulus_template.shape[1], stimulus_template.shape[2] + pvalues_on, pvalues_off = pvalues[:number_of_pixels].reshape(s1, s2), pvalues[number_of_pixels:].reshape(s1, s2) + + + + fdr_corrected_pvalues = multipletests(pvalues, alpha=alpha)[1] + + fdr_corrected_pvalues_on = fdr_corrected_pvalues[:number_of_pixels].reshape(s1, s2) + _fdr_mask_on = np.zeros_like(pvalues_on, dtype=np.bool) + _fdr_mask_on[fdr_corrected_pvalues_on < alpha] = True + components_on, number_of_components_on = get_components(_fdr_mask_on) + + fdr_corrected_pvalues_off = fdr_corrected_pvalues[number_of_pixels:].reshape(s1, s2) + _fdr_mask_off = np.zeros_like(pvalues_off, dtype=np.bool) + _fdr_mask_off[fdr_corrected_pvalues_off < alpha] = True + components_off, number_of_components_off = get_components(_fdr_mask_off) + + A = get_A(data, stimulus) + A_blur = get_A_blur(data, stimulus) + + response_triggered_stimulus_field = A.dot(event_vector) + response_triggered_stimulus_field_on = response_triggered_stimulus_field[:number_of_pixels].reshape(s1, s2) + response_triggered_stimulus_field_off = response_triggered_stimulus_field[number_of_pixels:].reshape(s1, s2) + + response_triggered_stimulus_field_convolution = A_blur.dot(event_vector) + response_triggered_stimulus_field_convolution_on = response_triggered_stimulus_field_convolution[:number_of_pixels].reshape(s1, s2) + response_triggered_stimulus_field_convolution_off = response_triggered_stimulus_field_convolution[number_of_pixels:].reshape(s1, s2) + + on_dict = {'pvalues':{'data':pvalues_on}, + 'fdr_corrected':{'data':fdr_corrected_pvalues_on, 'attrs':{'alpha':alpha, 'min_p':fdr_corrected_pvalues_on.min()}}, + 'fdr_mask': {'data':components_on, 'attrs':{'alpha':alpha, 'number_of_components':number_of_components_on, 'number_of_pixels':components_on.sum(axis=1).sum(axis=1)}}, + 'rts_convolution':{'data':response_triggered_stimulus_field_convolution_on}, + 'rts': {'data': response_triggered_stimulus_field_on} + } + off_dict = {'pvalues':{'data':pvalues_off}, + 'fdr_corrected':{'data':fdr_corrected_pvalues_off, 'attrs':{'alpha':alpha, 'min_p':fdr_corrected_pvalues_off.min()}}, + 'fdr_mask': {'data':components_off, 'attrs':{'alpha':alpha, 'number_of_components':number_of_components_off, 'number_of_pixels':components_off.sum(axis=1).sum(axis=1)}}, + 'rts_convolution': {'data': response_triggered_stimulus_field_convolution_off}, + 'rts': {'data': response_triggered_stimulus_field_off} + } + + result_dict = {'event_vector': {'data':event_vector, 'attrs':{'number_of_events':event_vector.sum()}}, + 'on':on_dict, + 'off':off_dict, + 'attrs':{'cell_index':cell_index, 'stimulus':stimulus}} + + return result_dict + +def compute_receptive_field_with_postprocessing(data, cell_index, stimulus, **kwargs): + rf = compute_receptive_field(data, cell_index, stimulus, **kwargs) + rf = run_postprocessing(data, rf) + + return rf + +def get_attribute_dict(rf): + + attribute_dict = {} + for x in dict_generator(rf): + if x[-3] == 'attrs': + if len(x[:-3]) == 0: + key = x[-2] + else: + key = '/'.join(['/'.join(x[:-3]), x[-2]]) + attribute_dict[key] = x[-1] + + return attribute_dict + + +def print_summary(rf): + for key_val in sorted(get_attribute_dict(rf).iteritems(), key=lambda x:x[0]): + print("%s : %s" % key_val) + +def write_receptive_field_to_h5(rf, file_name, prefix=''): + + attr_list = [] + f = h5py.File(file_name, 'a') + for x in dict_generator(rf): + + if x[-2] == 'data': + f['/'.join([prefix]+x[:-1])] = x[-1] + elif x[-3] == 'attrs': + attr_list.append(x) + else: + raise Exception + + for x in attr_list: + if len(x) > 3: + f['/'.join([prefix]+x[:-3])].attrs[x[-2]] = x[-1] + else: + assert len(x) == 3 + if prefix == '': + + if x[-1] is None: + f.attrs[x[-2]] = np.NaN + else: + f.attrs[x[-2]] = x[-1] + else: + if x[-1] is None: + f[prefix].attrs[x[-2]] = np.NaN + else: + f[prefix].attrs[x[-2]] = x[-1] + + f.close() + +def read_h5_group(g): + return_dict = {} + if len(g.attrs) > 0: + return_dict['attrs'] = dict(g.attrs) + for key in g: + if key == 'data': + return_dict[key] = g[key].value + else: + return_dict[key] = read_h5_group(g[key]) + + return return_dict + +def read_receptive_field_from_h5(file_name, path=None): + + f = h5py.File(file_name, 'r') + if path is None: + rf = read_h5_group(f) + else: + rf = read_h5_group(f[path]) + f.close() + + return rf + + + diff --git a/brain_observatory/receptive_field_analysis/tools.py b/brain_observatory/receptive_field_analysis/tools.py new file mode 100644 index 0000000000..df15993b6d --- /dev/null +++ b/brain_observatory/receptive_field_analysis/tools.py @@ -0,0 +1,67 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +def list_of_dicts_to_dict_of_lists(list_of_dicts): + return {key:[item[key] for item in list_of_dicts] for key in list_of_dicts[0].keys() } + +def dict_generator(indict, pre=None): + + pre = pre[:] if pre else [] + if isinstance(indict, dict): + for key, value in indict.items(): + if isinstance(value, dict): + for d in dict_generator(value, pre + [key] ): + yield d + elif isinstance(value, list): + for v in value: + for d in dict_generator(v, pre + [key]): + yield d + else: + yield pre + [key, value] + else: + yield indict + +def read_h5_group(g): + return_dict = {} + if len(g.attrs) > 0: + return_dict['attrs'] = dict(g.attrs) + for key in g: + if key == 'data': + return_dict[key] = g[key].value + else: + return_dict[key] = read_h5_group(g[key]) + + return return_dict + diff --git a/brain_observatory/receptive_field_analysis/utilities.py b/brain_observatory/receptive_field_analysis/utilities.py new file mode 100644 index 0000000000..bbef432f3c --- /dev/null +++ b/brain_observatory/receptive_field_analysis/utilities.py @@ -0,0 +1,293 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from scipy.ndimage.filters import gaussian_filter +import numpy as np +import scipy.interpolate as spinterp +from .tools import dict_generator +from allensdk.api.warehouse_cache.cache import memoize +import os +import warnings +from skimage.measure import block_reduce + +def upsample_image_to_degrees(img): + + upsample = 74.4/img.shape[0] + x = np.arange(img.shape[0]) + y = np.arange(img.shape[1]) + + g = spinterp.interp2d(y, x, img, kind='linear') + ZZ_on = g(np.arange(0, img.shape[1], 1. / upsample), np.arange(0, img.shape[0], 1. / upsample)) + + return ZZ_on + +def convolve(img, sigma=4): + ''' + 2D Gaussian convolution + ''' + + if img.sum() == 0: + return img + + img_pad = np.zeros((3 * img.shape[0], 3 * img.shape[1])) + img_pad[img.shape[0]:2 * img.shape[0], img.shape[1]:2 * img.shape[1]] = img + + x = np.arange(3 * img.shape[0]) + y = np.arange(3 * img.shape[1]) + g = spinterp.interp2d(y, x, img_pad, kind='linear') + + if img.shape[0] == 16: + upsample = 4 + offset = -(1 - .625) + elif img.shape[0] == 8: + upsample = 8 + offset = -(1 - .5625) + else: + raise NotImplementedError + ZZ_on = g(offset + np.arange(0, img.shape[1] * 3, 1. / upsample), offset + np.arange(0, img.shape[0] * 3, 1. / upsample)) + ZZ_on_f = gaussian_filter(ZZ_on, float(sigma), mode='constant') + + z_on_new = block_reduce(ZZ_on_f, (upsample, upsample)) + z_on_new = z_on_new / z_on_new.sum() * img.sum() + z_on_new = z_on_new[img.shape[0]:2 * img.shape[0], img.shape[1]:2 * img.shape[1]] + + return z_on_new + + + +@memoize +def get_A(data, stimulus): + + stimulus_table = data.get_stimulus_table(stimulus) + stimulus_template = data.get_stimulus_template(stimulus)[stimulus_table['frame'].values, :,:] + + number_of_pixels = stimulus_template.shape[1]*stimulus_template.shape[2] + + A = np.zeros((2*number_of_pixels, stimulus_template.shape[0])) + for fi in range(stimulus_template.shape[0]): + A[:number_of_pixels, fi] = (stimulus_template[fi,:,:].flatten() > 127).astype(float) + A[number_of_pixels:, fi] = (stimulus_template[fi, :, :].flatten() < 127).astype(float) + + return A + +@memoize +def get_A_blur(data, stimulus): + + stimulus_table = data.get_stimulus_table(stimulus) + stimulus_template = data.get_stimulus_template(stimulus)[stimulus_table['frame'].values, :, :] + + A = get_A(data, stimulus).copy() + + + number_of_pixels = A.shape[0] // 2 + for fi in range(A.shape[1]): + A[:number_of_pixels,fi] = convolve(A[:number_of_pixels, fi].reshape(stimulus_template.shape[1], stimulus_template.shape[2])).flatten() + A[number_of_pixels:,fi] = convolve(A[number_of_pixels:, fi].reshape(stimulus_template.shape[1], stimulus_template.shape[2])).flatten() + + + return A + +def get_shuffle_matrix(data, event_vector, A, number_of_shuffles=5000, response_detection_error_std_dev=.1): + + number_of_events = event_vector.sum() + number_of_pixels = A.shape[0] // 2 + shuffle_data = np.zeros((2*number_of_pixels, number_of_shuffles)) + evr = range(len(event_vector)) + for ii in range(number_of_shuffles): + + size = number_of_events + int(np.round(response_detection_error_std_dev*number_of_events*np.random.randn())) + shuffled_event_inds = np.random.choice(evr, size=size, replace=False) + + b_tmp = np.zeros(len(event_vector), dtype=np.bool) + b_tmp[shuffled_event_inds] = True + shuffle_data[:, ii] = A[:,b_tmp].sum(axis=1)/float(size) + + return shuffle_data + +def get_sparse_noise_epoch_mask_list(st, number_of_acquisition_frames, threshold=7): + + delta = (st.start.values[1:] - st.end.values[:-1]) + cut_inds = np.where(delta > threshold)[0] + 1 + + epoch_mask_list = [] + + if len(cut_inds) > 2: + warnings.warn('more than 2 epochs cut') + print(' %d %d' % (len(delta), cut_inds)) + + for ii in range(len(cut_inds)+1): + + if ii == 0: + first_ind = st.iloc[0].start + else: + first_ind = st.iloc[cut_inds[ii-1]].start + + if ii == len(cut_inds): + last_ind_inclusive = st.iloc[-1].end + else: + last_ind_inclusive = st.iloc[cut_inds[ii]-1].end + + epoch_mask_list.append((first_ind,last_ind_inclusive)) + + return epoch_mask_list + +def smooth(x,window_len=11,window='hanning', mode='valid'): + """smooth the data using a window with requested size. + + This method is based on the convolution of a scaled window with the signal. + The signal is prepared by introducing reflected copies of the signal + (with the window size) in both ends so that transient parts are minimized + in the begining and end part of the output signal. + + input: + x: the input signal + window_len: the dimension of the smoothing window; should be an odd integer + window: the type of window from 'flat', 'hanning', 'hamming', 'bartlett', 'blackman' + flat window will produce a moving average smoothing. + + output: + the smoothed signal + + example: + + t=linspace(-2,2,0.1) + x=sin(t)+randn(len(t))*0.1 + y=smooth(x) + + see also: + + numpy.hanning, numpy.hamming, numpy.bartlett, numpy.blackman, numpy.convolve + scipy.signal.lfilter + + TODO: the window parameter could be the window itself if an array instead of a string + NOTE: length(output) != length(input), to correct this: return y[(window_len/2-1):-(window_len/2)] instead of just y. + """ + + if x.ndim != 1: + raise ValueError("smooth only accepts 1 dimension arrays.") + + if x.size < window_len: + raise ValueError("Input vector needs to be bigger than window size.") + + + if window_len<3: + return x + + + if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']: + raise ValueError("Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'") + + + s=np.r_[x[window_len-1:0:-1],x,x[-1:-window_len:-1]] + #print(len(s)) + if window == 'flat': #moving average + w=np.ones(window_len,'d') + else: + w=eval('np.'+window+'(window_len)') + + y=np.convolve(w/w.sum(),s,mode=mode) + return y + + +def get_components(receptive_field_data): + + s1, s2 = receptive_field_data.shape + + candidate_pixel_list = np.where(receptive_field_data.flatten()==True)[0] + pixel_coord_dict = dict((px, (int(px/s2), (px - s2 * int(px/s2)), px% (s1 * s2) == px)) for px in candidate_pixel_list) + + component_list = [] + + for curr_pixel in candidate_pixel_list: + + curr_x, curr_y, curr_frame = pixel_coord_dict[curr_pixel] + + component_list.append([curr_pixel]) + dist_to_component_dict = {} + for ii, curr_component in enumerate(component_list): + dist_to_component_dict[ii] = np.inf + for other_pixel in curr_component: + + other_x, other_y, other_frame = pixel_coord_dict[other_pixel] + + if other_frame == curr_frame: + x_dist = np.abs(curr_x - other_x) + y_dist = np.abs(curr_y - other_y) + curr_dist = max(x_dist, y_dist) + if curr_dist < dist_to_component_dict[ii]: + dist_to_component_dict[ii] = curr_dist + + # Merge all components with a distance leq 1 to current pixel + new_component_list = [] + tmp = [] + for ii, curr_component in enumerate(component_list): + if dist_to_component_dict[ii] <= 1: + tmp += curr_component + else: + new_component_list.append(curr_component) + + new_component_list.append(tmp) + component_list = new_component_list + + + if len(component_list) == 0: + return np.zeros((1, receptive_field_data.shape[0], receptive_field_data.shape[1])), len(component_list) + elif len(component_list) == 1: + return_array = np.zeros((1,receptive_field_data.shape[0], receptive_field_data.shape[1])) + else: + return_array = np.zeros((len(component_list), receptive_field_data.shape[0], receptive_field_data.shape[1])) + + for ii, component in enumerate(component_list): + curr_component_mask = np.zeros_like(receptive_field_data, dtype=np.bool).flatten() + curr_component_mask[component] = True + return_array[ii,:,:] = curr_component_mask.reshape(receptive_field_data.shape) + + + + return return_array, len(component_list) + +def get_attribute_dict(rf): + + attribute_dict = {} + for x in dict_generator(rf): + if x[-3] == 'attrs': + if len(x[:-3]) == 0: + key = x[-2] + else: + key = '/'.join(['/'.join(x[:-3]), x[-2]]) + attribute_dict[key] = x[-1] + + return attribute_dict + diff --git a/brain_observatory/receptive_field_analysis/visualization.py b/brain_observatory/receptive_field_analysis/visualization.py new file mode 100644 index 0000000000..a3c6cad2a2 --- /dev/null +++ b/brain_observatory/receptive_field_analysis/visualization.py @@ -0,0 +1,266 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import matplotlib.pyplot as plt +from matplotlib import ticker +import numpy as np +import matplotlib.gridspec as gridspec +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches + +DEFAULT_CMAP = 'magma' + +def plot_ellipses(gaussian_fit_dict, ax=None, show=True, close=True, save_file_name=None, color='b'): + '''Example Usage: + oeid, cell_index, stimulus = 512176430, 12, 'locally_sparse_noise' + brain_observatory_cache = BrainObservatoryCache() + data_set = brain_observatory_cache.get_ophys_experiment_data(oeid) + lsn = LocallySparseNoise(data_set, stimulus) + result = compute_receptive_field_with_postprocessing(data_set, cell_index, stimulus, alpha=.05, number_of_shuffles=5000) + plot_ellipses(result['off']['gaussian_fit'], color='r') + ''' + + if ax is None: + fig, ax = plt.subplots(1) + ax.set_xlim(0, 130) + ax.set_ylim(0, 74) + plt.axis('off') + + on_comp = len(gaussian_fit_dict['attrs']['center_x']) + for i in range(on_comp): + xy = (gaussian_fit_dict['attrs']['center_x'][i], gaussian_fit_dict['attrs']['center_y'][i]) + width = 3 * np.abs(gaussian_fit_dict['attrs']['width_x'][i]) + height = 3 * np.abs(gaussian_fit_dict['attrs']['width_y'][i]) + angle = gaussian_fit_dict['attrs']['rotation'][i] + if np.logical_not(any(np.isnan(xy))): + ellipse = mpatches.Ellipse(xy, width=width, height=height, angle=angle, lw=2, edgecolor=color, + facecolor='none') + ax.add_artist(ellipse) + + if not save_file_name is None: + fig.savefig(save_file_name) + + if show == True: + plt.show() + + if close: + plt.close(fig) + + return ax + +def pvalue_to_NLL(p_values, + max_NLL=10.0): + return np.where(p_values == 0.0, max_NLL, -np.log10(p_values)) + +def plot_chi_square_summary(rf_data, ax=None, cax=None, cmap=DEFAULT_CMAP): + if ax is None: + ax = plt.gca() + + chi_squared_grid = rf_data['chi_squared_analysis']['pvalues']['data'] + chi_square_grid_NLL = pvalue_to_NLL(chi_squared_grid) + clim = (0, max(2,chi_square_grid_NLL.max())) + img = ax.imshow(chi_square_grid_NLL, interpolation='none', origin='lower', clim=clim, cmap=cmap) + + if cax is None: + cb = ax.figure.colorbar(img, ax=ax, ticks=clim) + else: + cb = ax.figure.colorbar(img, cax=cax, ticks=clim) + + tick_locator = ticker.MaxNLocator(nbins=5) + cb.locator = tick_locator + cb.update_ticks() + ax.axes.get_xaxis().set_visible(False) + ax.axes.get_yaxis().set_visible(False) + ax.set_title('Significant: %s (min_p=%s)' % (rf_data['chi_squared_analysis']['attrs']['significant'], + rf_data['chi_squared_analysis']['attrs']['min_p']) ) + +def plot_msr_summary(lsn, cell_index, ax_on, ax_off, ax_cbar=None, cmap=None): + min_clim = lsn.mean_response[:, :, cell_index,:].min() + max_clim = lsn.mean_response[:, :, cell_index,:].max() + plot_fields(lsn.mean_response[:, :, cell_index, 0], + lsn.mean_response[:, :, cell_index, 1], + ax_on, ax_off, clim=(min_clim, max_clim), cmap=cmap, cbar_axes=ax_cbar) + +def plot_fields(on_data, off_data, on_axes, off_axes, cbar_axes=None, clim=None, cmap=DEFAULT_CMAP): + if cbar_axes is None: + on_axes.figure.subplots_adjust(right=0.9) + cbar_axes = on_axes.figure.add_axes([0.93, 0.37, 0.02, .28]) + + if clim is None: + clim_max = max(np.nanmax(on_data), np.nanmax(off_data)) + clim = (0,clim_max) + on_axes.imshow(on_data, clim=clim, cmap=cmap, interpolation='none', origin='lower') + on_axes.set_title("on") + img = off_axes.imshow(off_data, clim=clim, cmap=cmap, interpolation='none', origin='lower') + off_axes.set_title("off") + cb = cbar_axes.figure.colorbar(img, cax=cbar_axes, ticks=clim) + tick_locator = ticker.MaxNLocator(nbins=5) + cb.locator = tick_locator + cb.update_ticks() + for frame in [on_axes, off_axes]: + frame.axes.get_xaxis().set_visible(False) + frame.axes.get_yaxis().set_visible(False) + +def plot_rts_summary(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): + rts_on = rf_data['on']['rts']['data'] + rts_off = rf_data['off']['rts']['data'] + plot_fields(rts_on, rts_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) + +def plot_rts_blur_summary(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): + rts_on_blur = rf_data['on']['rts_convolution']['data'] + rts_off_blur = rf_data['off']['rts_convolution']['data'] + plot_fields(rts_on_blur, rts_off_blur, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) + +def plot_p_values(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): + pvalues_on = rf_data['on']['pvalues']['data'] + pvalues_off = rf_data['off']['pvalues']['data'] + clim_max = max(pvalues_on.max(), pvalues_off.max()) + plot_fields(pvalues_on, pvalues_off, ax_on, ax_off, cbar_axes=ax_cbar, clim=(0, clim_max/2), cmap=cmap) + +def plot_mask(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): + pvalues_on = rf_data['on']['pvalues']['data'] + pvalues_off = rf_data['off']['pvalues']['data'] + + rf_on = pvalues_on.copy() + rf_off = pvalues_off.copy() + + rf_on[np.logical_not(rf_data['on']['fdr_mask']['data'].sum(axis=0))] = np.nan + rf_off[np.logical_not(rf_data['off']['fdr_mask']['data'].sum(axis=0))] = np.nan + + plot_fields(rf_on, rf_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) + +def plot_gaussian_fit(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): + + gf_on_exists = 'gaussian_fit' in rf_data['on'] + gf_off_exists = 'gaussian_fit' in rf_data['off'] + + if not gf_on_exists and not gf_off_exists: + return + + img_data_on = rf_data['on']['gaussian_fit']['data'].sum(axis=0) if gf_on_exists else None + img_data_off = rf_data['off']['gaussian_fit']['data'].sum(axis=0) if gf_off_exists else None + + if gf_on_exists and gf_off_exists: + plot_fields(img_data_on, img_data_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) + else: + if gf_on_exists: + img_data_off = np.zeros(img_data_on.shape) + else: + img_data_on = np.zeros(img_data_off.shape) + + plot_fields(img_data_on, img_data_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) + +def plot_receptive_field_data(rf, lsn, show=True, save_file_name=None, close=True, cmap=DEFAULT_CMAP): + cell_index = rf['attrs']['cell_index'] + + # Prepare plotting figure:n + number_of_major_rows = 7 if lsn else 6 + pwidth = 1.7 + pheight = 1.0 + fig = plt.figure(figsize=(pwidth*2.3, pheight*number_of_major_rows)) + gsp = gridspec.GridSpec(number_of_major_rows, 3, width_ratios=[1,1,.1], right=0.9) + ax_list = [] + + # Plot chi-square summary: + row = 0 + curr_axes = fig.add_subplot(gsp[row,:2]) + cbar_axes = fig.add_subplot(gsp[row,-1]) + ax_list += [curr_axes] + plot_chi_square_summary(rf, ax=curr_axes, cax=cbar_axes, cmap=cmap) + + # MSR plot: + if not lsn is None: + row += 1 + curr_on_axes = fig.add_subplot(gsp[row, 0]) + curr_off_axes = fig.add_subplot(gsp[row, 1]) + cbar_axes = fig.add_subplot(gsp[row, 2]) + ax_list += [curr_on_axes, curr_off_axes] + plot_msr_summary(lsn, cell_index, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) + + # RTS no blur: + row += 1 + curr_on_axes = fig.add_subplot(gsp[row, 0]) + curr_off_axes = fig.add_subplot(gsp[row, 1]) + cbar_axes = fig.add_subplot(gsp[row,2]) + ax_list += [curr_on_axes, curr_off_axes] + plot_rts_summary(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) + + # RTS no blur: + row += 1 + curr_on_axes = fig.add_subplot(gsp[row, 0]) + curr_off_axes = fig.add_subplot(gsp[row, 1]) + cbar_axes = fig.add_subplot(gsp[row,2]) + ax_list += [curr_on_axes, curr_off_axes] + plot_rts_blur_summary(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) + + # PValues: + row += 1 + curr_on_axes = fig.add_subplot(gsp[row, 0]) + curr_off_axes = fig.add_subplot(gsp[row, 1]) + cbar_axes = fig.add_subplot(gsp[row,2]) + ax_list += [curr_on_axes, curr_off_axes] + plot_p_values(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) + + # Mask: + row += 1 + curr_on_axes = fig.add_subplot(gsp[row, 0]) + curr_off_axes = fig.add_subplot(gsp[row, 1]) + cbar_axes = fig.add_subplot(gsp[row,2]) + ax_list += [curr_on_axes, curr_off_axes] + plot_mask(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) + + # Gaussian fit: + row += 1 + curr_on_axes = fig.add_subplot(gsp[row, 0]) + curr_off_axes = fig.add_subplot(gsp[row, 1]) + cbar_axes = fig.add_subplot(gsp[row,2]) + ax_list += [curr_on_axes, curr_off_axes] + plot_gaussian_fit(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) + + # gs.tight_layout(fig) + + plt.subplots_adjust(top=0.95) + + for ax in ax_list: + ax.set_adjustable('box-forced') + + if not save_file_name is None: + fig.savefig(save_file_name) + + if show == True: + plt.show() + + if close: + plt.close(fig) diff --git a/brain_observatory/roi_masks.py b/brain_observatory/roi_masks.py new file mode 100644 index 0000000000..39d8873ec5 --- /dev/null +++ b/brain_observatory/roi_masks.py @@ -0,0 +1,523 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import math +import scipy.ndimage.morphology as morphology +import logging +import h5py + +# constants used for accessing border array +RIGHT_SHIFT = 0 +LEFT_SHIFT = 1 +DOWN_SHIFT = 2 +UP_SHIFT = 3 + + +class Mask(object): + ''' + Abstract class to represent image segmentation mask. Its two + main subclasses are RoiMask and NeuropilMask. The former represents + the mask of a region of interest (ROI), such as a cell observed in + 2-photon imaging. The latter represents the neuropil around that cell, + and is useful when subtracting the neuropil signal from the measured + ROI signal. + + This class should not be instantiated directly. + + Parameters + ---------- + image_w: integer + Width of image that ROI resides in + + image_h: integer + Height of image that ROI resides in + + label: text + User-defined text label to identify mask + + mask_group: integer + User-defined number to help put masks into different categories + ''' + + @property + def overlaps_motion_border(self): + # flags like this are now in self.flags, patch for backwards compatibility + return 'overlaps_motion_border' in self.flags + + def __init__(self, image_w, image_h, label, mask_group): + ''' + Mask class constructor. The Mask class is designed to be abstract + and it should not be instantiated directly. + ''' + + self.img_rows = image_h + self.img_cols = image_w + # initialize to invalid state. Mask must be manually initialized + # by pixel list or mask array + self.x = 0 + self.width = 0 + self.y = 0 + self.height = 0 + self.mask = None + # label is for distinguishing neuropil from ROI, in case + # these masks are mixed together + self.label = label + # auxiliary metadata. if a particula mask is part of an group, + # that data can be stored here + self.mask_group = mask_group + self.flags = set([]) + + def __str__(self): + return "%s: TL=%d,%d w,h=%d,%d\n%s" % (self.label, self.x, self.y, self.width, self.height, str(self.mask)) + + def init_by_pixels(self, border, pix_list): + ''' + Initialize mask using a list of mask pixels + + Parameters + ---------- + border: float[4] + Coordinates defining useable area of image. See create_roi_mask() + + pix_list: integer[][2] + List of pixel coordinates (x,y) that define the mask + ''' + assert pix_list.shape[1] == 2, "Pixel list not properly formed" + array = np.zeros((self.img_rows, self.img_cols), dtype=bool) + + # pix_list stores array of [x,y] coordinates + array[pix_list[:, 1], pix_list[:, 0]] = 1 + + self.init_by_mask(border, array) + + def get_mask_plane(self): + ''' + Returns mask content on full-size image plane + + Returns + ------- + numpy 2D array [img_rows][img_cols] + ''' + mask = np.zeros((self.img_rows, self.img_cols)) + mask[self.y:self.y + self.height, self.x:self.x + self.width] = self.mask + return mask + + +def create_roi_mask(image_w, image_h, border, pix_list=None, roi_mask=None, label=None, mask_group=-1): + ''' + Conveninece function to create and initializes an RoiMask + + Parameters + ---------- + + image_w: integer + Width of image that ROI resides in + + image_h: integer + Height of image that ROI resides in + + border: float[4] + Coordinates defining useable area of image. If the entire image + is usable, and masks are valid anywhere in the image, this should + be [0, 0, 0, 0]. The following constants + help describe the array order: + + RIGHT_SHIFT = 0 + + LEFT_SHIFT = 1 + + DOWN_SHIFT = 2 + + UP_SHIFT = 3 + + When parts of the image are unusable, for example due motion + correction shifting of different image frames, the border array + should store the usable image area + + pix_list: integer[][2] + List of pixel coordinates (x,y) that define the mask + + roi_mask: integer[image_h][image_w] + Image-sized array that describes the mask. Active parts of the + mask should have values >0. Background pixels must be zero + + label: text + User-defined text label to identify mask + + mask_group: integer + User-defined number to help put masks into different categories + + Returns + ------- + RoiMask object + ''' + m = RoiMask(image_w, image_h, label, mask_group) + if pix_list is not None: + m.init_by_pixels(border, pix_list) + elif roi_mask is not None: + m.init_by_mask(border, roi_mask) + else: + assert False, "Must specify either roi_mask or pix_list" + return m + + +class RoiMask(Mask): + + def __init__(self, image_w, image_h, label, mask_group): + ''' + RoiMask class constructor + + Parameters + ---------- + image_w: integer + Width of image that ROI resides in + + image_h: integer + Height of image that ROI resides in + + label: text + User-defined text label to identify mask + + mask_group: integer + User-defined number to help put masks into different categories + ''' + super(RoiMask, self).__init__(image_w, image_h, label, mask_group) + + def init_by_mask(self, border, array): + ''' + Initialize mask using spatial mask + + Parameters + ---------- + border: float[4] + Coordinates defining useable area of image. See create_roi_mask(). + + roi_mask: integer[image height][image width] + Image-sized array that describes the mask. Active parts of the + mask should have values >0. Background pixels must be zero + ''' + px = np.argwhere(array) + + if len(px) == 0: + self.flags.add('zero_pixels') + return + + (top, left), (bottom, right) = px.min(0), px.max(0) + + # left and right border insets + l_inset = math.ceil(border[RIGHT_SHIFT]) + r_inset = math.floor(self.img_cols - border[LEFT_SHIFT]) - 1 + # top and bottom border insets + t_inset = math.ceil(border[DOWN_SHIFT]) + b_inset = math.floor(self.img_rows - border[UP_SHIFT]) - 1 + + # if ROI crosses border, it's considered invalid + if left < l_inset or right > r_inset: + self.flags.add('overlaps_motion_border') + if top < t_inset or bottom > b_inset: + self.flags.add('overlaps_motion_border') + # + self.x = left + self.width = right - left + 1 + self.y = top + self.height = bottom - top + 1 + # make copy of mask + self.mask = array[top:bottom + 1, left:right + 1] + + +def create_neuropil_mask(roi, border, combined_binary_mask, label=None): + ''' + Conveninece function to create and initializes a Neuropil mask. + Neuropil masks are defined as the region around an ROI, up to 13 + pixels out, that does not include other ROIs + + Parameters + ---------- + + roi: RoiMask object + The ROI that the neuropil masks will be based on + + border: float[4] + Border widths on the [right, left, down, up] sides. The resulting + neuropil mask will not include pixels falling into a border. + + combined_binary_mask + List of pixel coordinates (x,y) that define the mask + + combined_binary_mask: integer[image_h][image_w] + Image-sized array that shows the position of all ROIs in the + image. ROI masks should have a value of one. Background pixels + must be zero. In other words, ithe combined_binary_mask is a + bitmap union of all ROI masks + + label: text + User-defined text label to identify the mask + + Returns + ------- + NeuropilMask object + ''' + # combined_binary_mask is a bitmap union of ALL ROI masks + # create a binary mask of the ROI + binary_mask = np.zeros((roi.img_rows, roi.img_cols)) + binary_mask[roi.y:roi.y + roi.height, roi.x:roi.x + roi.width] = roi.mask + binary_mask = binary_mask > 0 + # dilate the mask + binary_mask_dilated = morphology.binary_dilation( + binary_mask, structure=np.ones((3, 3)), iterations=13) # T/F + # eliminate ROIs from the dilation + binary_mask_dilated = binary_mask_dilated > combined_binary_mask + # create mask from binary dilation + m = NeuropilMask(w=roi.img_cols, h=roi.img_rows, + label=label, mask_group=roi.mask_group) + m.init_by_mask(border, binary_mask_dilated) + return m + + +class NeuropilMask(Mask): + + def __init__(self, w, h, label, mask_group): + ''' + NeuropilMask class constructor. This class should be created by + calling create_neuropil_mask() + + Parameters + ---------- + label: text + User-defined text label to identify mask + + mask_group: integer + User-defined number to help put masks into different categories + ''' + super(NeuropilMask, self).__init__(w, h, label, mask_group) + + def init_by_mask(self, border, array): + ''' + Initialize mask using spatial mask + + Parameters + ---------- + border: float[4] + Border widths on the [right, left, down, up] sides. The resulting + neuropil mask will not include pixels falling into a border. + array: integer[image height][image width] + Image-sized array that describes the mask. Active parts of the + mask should have values >0. Background pixels must be zero + ''' + px = np.argwhere(array) + + if len(px) == 0: + self.flags.add('zero_pixels') + return + + (top, left), (bottom, right) = px.min(0), px.max(0) + + # left and right border insets + l_inset = math.ceil(border[RIGHT_SHIFT]) + r_inset = math.floor(self.img_cols - border[LEFT_SHIFT]) - 1 + # top and bottom border insets + t_inset = math.ceil(border[DOWN_SHIFT]) + b_inset = math.floor(self.img_rows - border[UP_SHIFT]) - 1 + # restrict neuropil masks to center area of frame (ie, exclude + # areas that overlap with movement correction buffer) + if left < l_inset: + left = l_inset + if right < l_inset: + right = l_inset + if right > r_inset: + right = r_inset + if left > r_inset: + left = r_inset + if top < t_inset: + top = t_inset + if bottom < t_inset: + bottom = t_inset + if bottom > b_inset: + bottom = b_inset + if top > b_inset: + top = b_inset + # + self.x = left + self.width = right - left + 1 + self.y = top + self.height = bottom - top + 1 + # make copy of mask + self.mask = array[top:bottom + 1, left:right + 1] + +def validate_mask(mask): + '''Check a given roi or neuropil mask for (a subset of) disqualifying problems. + ''' + + exclusions = [] + + if 'zero_pixels' in mask.flags or mask.mask.sum() == 0: + + if isinstance(mask, NeuropilMask): + label = 'empty_neuropil_mask' + elif isinstance(mask, RoiMask): + label = 'empty_roi_mask' + else: + label = 'zero_pixels' + + exclusions.append({ + 'roi_id': mask.label, + 'exclusion_label_name': label + }) + + if 'overlaps_motion_border' in mask.flags: + exclusions.append({ + 'roi_id': mask.label, + 'exclusion_label_name': 'motion_border' + }) + + return exclusions + + +def calculate_traces(stack, mask_list, block_size=1000): + ''' + Calculates the average response of the specified masks in the + image stack + + Parameters + ---------- + stack: float[image height][image width] + Image stack that masks are applied to + + mask_list: list<Mask> + List of masks + + Returns + ------- + float[number masks][number frames] + This is the average response for each Mask in each image frame + ''' + + traces = np.zeros((len(mask_list), stack.shape[0]), dtype=float) + num_frames = stack.shape[0] + + mask_areas = np.zeros(len(mask_list), dtype=float) + valid_masks = np.ones(len(mask_list), dtype=bool) + + exclusions = [] + + for i, mask in enumerate(mask_list): + + current_exclusions = validate_mask(mask) + if len(current_exclusions) > 0: + traces[i,:] = np.nan + valid_masks[i] = False + exclusions.extend(current_exclusions) + reasons = ", ".join([item["exclusion_label_name"] for item in current_exclusions]) + logging.warning("unable to extract traces for mask \"{}\": {} ".format(mask.label, reasons)) + continue + + if not isinstance(mask.mask, np.ndarray): + mask.mask = np.array(mask.mask) + mask_areas[i] = mask.mask.sum() + + # calculate traces + for frame_num in range(0, num_frames, block_size): + if frame_num % block_size == 0: + logging.debug("frame " + str(frame_num) + " of " + str(num_frames)) + frames = stack[frame_num:frame_num+block_size] + + for i in range(len(mask_list)): + if not valid_masks[i]: + continue + + mask = mask_list[i] + subframe = frames[:,mask.y:mask.y + mask.height, + mask.x:mask.x + mask.width] + + total = subframe[:, mask.mask].sum(axis=1) + traces[i, frame_num:frame_num+block_size] = total / mask_areas[i] + + return traces, exclusions + +def calculate_roi_and_neuropil_traces(movie_h5, roi_mask_list, motion_border): + """ get roi and neuropil masks """ + + # a combined binary mask for all ROIs (this is used to + # subtracted ROIs from annuli + mask_array = create_roi_mask_array(roi_mask_list) + combined_mask = mask_array.max(axis=0) + + logging.info("%d total ROIs" % len(roi_mask_list)) + + # create neuropil masks for the central ROIs + neuropil_masks = [] + for m in roi_mask_list: + nmask = create_neuropil_mask(m, motion_border, combined_mask, "neuropil for " + m.label) + neuropil_masks.append(nmask) + + num_rois = len(roi_mask_list) + combined_list = roi_mask_list + neuropil_masks # read the large image stack only once + + with h5py.File(movie_h5, "r") as movie_f: + stack_frames = movie_f["data"] + + logging.info("Calculating %d traces (neuropil + ROI) over %d frames" % (len(combined_list), len(stack_frames))) + traces, exclusions = calculate_traces(stack_frames, combined_list) + + roi_traces = traces[:num_rois] + neuropil_traces = traces[num_rois:] + + return roi_traces, neuropil_traces, exclusions + + +def create_roi_mask_array(rois): + '''Create full image mask array from list of RoiMasks. + + Parameters + ---------- + rois: list<RoiMask> + List of roi masks. + + Returns + ------- + np.ndarray: NxWxH array + Boolean array of of len(rois) image masks. + ''' + if rois: + height = rois[0].img_rows + width = rois[0].img_cols + masks = np.zeros((len(rois), height, width), dtype=np.uint8) + for i, roi in enumerate(rois): + masks[i, :, :] = roi.get_mask_plane() + else: + masks = None + return masks + diff --git a/brain_observatory/running_speed.py b/brain_observatory/running_speed.py new file mode 100644 index 0000000000..c579a15af5 --- /dev/null +++ b/brain_observatory/running_speed.py @@ -0,0 +1,22 @@ +from typing import NamedTuple + +import numpy as np + + +class RunningSpeed(NamedTuple): + ''' Describes the rate at which an experimental subject ran during a session. + + values : np.ndarray + running speed (cm/s) at each sample point + timestamps : np.ndarray + The time at which each sample was collected (s). + + ''' + + timestamps: np.ndarray + values: np.ndarray + + def __eq__(self, other): + a = np.array_equal(self.timestamps, other.timestamps) + b = np.array_equal(self.values, other.values) + return a and b diff --git a/brain_observatory/session_analysis.py b/brain_observatory/session_analysis.py new file mode 100644 index 0000000000..eff434bc58 --- /dev/null +++ b/brain_observatory/session_analysis.py @@ -0,0 +1,599 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from .static_gratings import StaticGratings +from .locally_sparse_noise import LocallySparseNoise +from .natural_scenes import NaturalScenes +from .drifting_gratings import DriftingGratings +from .natural_movie import NaturalMovie +import six +from allensdk.core.brain_observatory_nwb_data_set \ + import BrainObservatoryNwbDataSet +from . import stimulus_info +from allensdk.brain_observatory.brain_observatory_exceptions \ + import BrainObservatoryAnalysisException +from . import brain_observatory_plotting as cp +import argparse +import logging +import os + +from allensdk.deprecated import deprecated + + + +def multi_dataframe_merge(dfs): + """ merge a number of pd.DataFrames into a single dataframe on their index columns. + If any columns are duplicated, prefer the first occuring instance of the column """ + + out_df = None + for _, df in enumerate(dfs): + if out_df is None: + out_df = df + else: + out_df = out_df.merge(df, left_index=True, + right_index=True, suffixes=['', '_deleteme']) + + bad_columns = set([c for c in out_df.columns if c.endswith('deleteme')]) + out_df.drop(list(bad_columns), axis=1, inplace=True) + + return out_df + + +class SessionAnalysis(object): + """ + Run all of the stimulus-specific analyses associated with a single experiment session. + + Parameters + ---------- + nwb_path: string, path to NWB file + + save_path: string, path to HDF5 file to store outputs. Recommended NOT to modify the NWB file. + """ + + _log = logging.getLogger('allensdk.brain_observatory.session_analysis') + + def __init__(self, nwb_path, save_path): + self.nwb = BrainObservatoryNwbDataSet(nwb_path) + self.save_path = save_path + self.save_dir = os.path.dirname(save_path) + + self.metrics_a = dict(cell={},experiment={}) + self.metrics_b = dict(cell={},experiment={}) + self.metrics_c = dict(cell={},experiment={}) + + self.metadata = self.nwb.get_metadata() + + def append_metadata(self, df): + """ Append the metadata fields from the NWB file as columns to a pd.DataFrame """ + + for k, v in six.iteritems(self.metadata): + df[k] = v + + def save_session_a(self, dg, nm1, nm3, peak): + """ Save the output of session A analysis to self.save_path. + + Parameters + ---------- + dg: DriftingGratings instance + + nm1: NaturalMovie instance + This NaturalMovie instance should have been created with + movie_name = stimulus_info.NATURAL_MOVIE_ONE + + nm3: NaturalMovie instance + This NaturalMovie instance should have been created with + movie_name = stimulus_info.NATURAL_MOVIE_THREE + + peak: pd.DataFrame + The combined peak response property table created in self.session_a(). + """ + + nwb = BrainObservatoryNwbDataSet(self.save_path) + + nwb.save_analysis_dataframes( + ('stim_table_dg', dg.stim_table), + ('sweep_response_dg', dg.sweep_response), + ('mean_sweep_response_dg', dg.mean_sweep_response), + ('peak', peak), + ('sweep_response_nm1', nm1.sweep_response), + ('stim_table_nm1', nm1.stim_table), + ('sweep_response_nm3', nm3.sweep_response)) + + nwb.save_analysis_arrays( + ('response_dg', dg.response), + ('binned_cells_sp', nm1.binned_cells_sp), + ('binned_cells_vis', nm1.binned_cells_vis), + ('binned_dx_sp', nm1.binned_dx_sp), + ('binned_dx_vis', nm1.binned_dx_vis), + ('noise_corr_dg', dg.noise_correlation), + ('signal_corr_dg', dg.signal_correlation), + ('rep_similarity_dg', dg.representational_similarity) + ) + + + def save_session_b(self, sg, nm1, ns, peak): + """ Save the output of session B analysis to self.save_path. + + Parameters + ---------- + sg: StaticGratings instance + + nm1: NaturalMovie instance + This NaturalMovie instance should have been created with + movie_name = stimulus_info.NATURAL_MOVIE_ONE + + ns: NaturalScenes instance + + peak: pd.DataFrame + The combined peak response property table created in self.session_b(). + """ + + nwb = BrainObservatoryNwbDataSet(self.save_path) + + nwb.save_analysis_dataframes( + ('stim_table_sg', sg.stim_table), + ('sweep_response_sg', sg.sweep_response), + ('mean_sweep_response_sg', sg.mean_sweep_response), + ('sweep_response_nm1', nm1.sweep_response), + ('stim_table_nm1', nm1.stim_table), + ('sweep_response_ns', ns.sweep_response), + ('stim_table_ns', ns.stim_table), + ('mean_sweep_response_ns', ns.mean_sweep_response), + ('peak', peak)) + + nwb.save_analysis_arrays( + ('response_sg', sg.response), + ('response_ns', ns.response), + ('binned_cells_sp', nm1.binned_cells_sp), + ('binned_cells_vis', nm1.binned_cells_vis), + ('binned_dx_sp', nm1.binned_dx_sp), + ('binned_dx_vis', nm1.binned_dx_vis), + ('noise_corr_sg', sg.noise_correlation), + ('signal_corr_sg', sg.signal_correlation), + ('rep_similarity_sg', sg.representational_similarity), + ('noise_corr_ns', ns.noise_correlation), + ('signal_corr_ns', ns.signal_correlation), + ('rep_similarity_ns', ns.representational_similarity) + ) + + def save_session_c(self, lsn, nm1, nm2, peak): + """ Save the output of session C analysis to self.save_path. + + Parameters + ---------- + lsn: LocallySparseNoise instance + + nm1: NaturalMovie instance + This NaturalMovie instance should have been created with + movie_name = stimulus_info.NATURAL_MOVIE_ONE + + nm2: NaturalMovie instance + This NaturalMovie instance should have been created with + movie_name = stimulus_info.NATURAL_MOVIE_TWO + + peak: pd.DataFrame + The combined peak response property table created in self.session_c(). + """ + + nwb = BrainObservatoryNwbDataSet(self.save_path) + + nwb.save_analysis_dataframes( + ('stim_table_lsn', lsn.stim_table), + ('sweep_response_nm1', nm1.sweep_response), + ('peak', peak), + ('sweep_response_nm2', nm2.sweep_response), + ('sweep_response_lsn', lsn.sweep_response), + ('mean_sweep_response_lsn', lsn.mean_sweep_response)) + + nwb.save_analysis_arrays( + ('receptive_field_lsn', lsn.receptive_field), + ('mean_response_lsn', lsn.mean_response), + ('binned_dx_sp', nm1.binned_dx_sp), + ('binned_dx_vis', nm1.binned_dx_vis), + ('binned_cells_sp', nm1.binned_cells_sp), + ('binned_cells_vis', nm1.binned_cells_vis)) + + LocallySparseNoise.save_cell_index_receptive_field_analysis(lsn.cell_index_receptive_field_analysis_data, nwb, stimulus_info.LOCALLY_SPARSE_NOISE) + + def save_session_c2(self, lsn4, lsn8, nm1, nm2, peak): + """ Save the output of session C2 analysis to self.save_path. + + Parameters + ---------- + lsn4: LocallySparseNoise instance + This LocallySparseNoise instance should have been created with + self.stimulus = stimulus_info.LOCALLY_SPARSE_NOISE_4DEG. + + lsn8: LocallySparseNoise instance + This LocallySparseNoise instance should have been created with + self.stimulus = stimulus_info.LOCALLY_SPARSE_NOISE_8DEG. + + nm1: NaturalMovie instance + This NaturalMovie instance should have been created with + movie_name = stimulus_info.NATURAL_MOVIE_ONE + + nm2: NaturalMovie instance + This NaturalMovie instance should have been created with + movie_name = stimulus_info.NATURAL_MOVIE_TWO + + peak: pd.DataFrame + The combined peak response property table created in self.session_c2(). + """ + + nwb = BrainObservatoryNwbDataSet(self.save_path) + + nwb.save_analysis_dataframes( + ('stim_table_lsn4', lsn4.stim_table), + ('stim_table_lsn8', lsn8.stim_table), + ('sweep_response_nm1', nm1.sweep_response), + ('peak', peak), + ('sweep_response_nm2', nm2.sweep_response), + ('sweep_response_lsn4', lsn4.sweep_response), + ('sweep_response_lsn8', lsn8.sweep_response), + ('mean_sweep_response_lsn4', lsn4.mean_sweep_response), + ('mean_sweep_response_lsn8', lsn8.mean_sweep_response)) + + merge_mean_response = LocallySparseNoise.merge_mean_response( + lsn4.mean_response, + lsn8.mean_response) + + nwb.save_analysis_arrays( + ('mean_response_lsn4', lsn4.mean_response), + ('mean_response_lsn8', lsn8.mean_response), + ('receptive_field_lsn4', lsn4.receptive_field), + ('receptive_field_lsn8', lsn8.receptive_field), + ('merge_mean_response', merge_mean_response), + ('binned_dx_sp', nm1.binned_dx_sp), + ('binned_dx_vis', nm1.binned_dx_vis), + ('binned_cells_sp', nm1.binned_cells_sp), + ('binned_cells_vis', nm1.binned_cells_vis)) + + LocallySparseNoise.save_cell_index_receptive_field_analysis(lsn4.cell_index_receptive_field_analysis_data, nwb, stimulus_info.LOCALLY_SPARSE_NOISE_4DEG) + LocallySparseNoise.save_cell_index_receptive_field_analysis(lsn8.cell_index_receptive_field_analysis_data, nwb, stimulus_info.LOCALLY_SPARSE_NOISE_8DEG) + + def append_metrics_drifting_grating(self, metrics, dg): + """ Extract metrics from the DriftingGratings peak response table into a dictionary. """ + + metrics["osi_dg"] = dg.peak["osi_dg"] + metrics["dsi_dg"] = dg.peak["dsi_dg"] + metrics["pref_dir_dg"] = [dg.orivals[i] + for i in dg.peak["ori_dg"].values] + metrics["pref_tf_dg"] = [dg.tfvals[i] for i in dg.peak["tf_dg"].values] + metrics["p_dg"] = dg.peak["ptest_dg"] + metrics["g_osi_dg"] = dg.peak["cv_os_dg"] + metrics["g_dsi_dg"] = dg.peak["cv_ds_dg"] + metrics["reliability_dg"] = dg.peak["reliability_dg"] + metrics["tfdi_dg"] = dg.peak["tf_index_dg"] + metrics["run_mod_dg"] = dg.peak["run_modulation_dg"] + metrics["p_run_mod_dg"] = dg.peak["p_run_dg"] + metrics["peak_dff_dg"] = dg.peak["peak_dff_dg"] + + def append_metrics_static_grating(self, metrics, sg): + """ Extract metrics from the StaticGratings peak response table into a dictionary. """ + + metrics["osi_sg"] = sg.peak["osi_sg"] + metrics["pref_ori_sg"] = [sg.orivals[i] + for i in sg.peak["ori_sg"].values] + metrics["pref_sf_sg"] = [sg.sfvals[i] for i in sg.peak["sf_sg"].values] + metrics["pref_phase_sg"] = [sg.phasevals[i] + for i in sg.peak["phase_sg"].values] + metrics["p_sg"] = sg.peak["ptest_sg"] + metrics["time_to_peak_sg"] = sg.peak["time_to_peak_sg"] + metrics["run_mod_sg"] = sg.peak["run_modulation_sg"] + metrics["p_run_mod_sg"] = sg.peak["p_run_sg"] + metrics["g_osi_sg"] = sg.peak["cv_os_sg"] + metrics["sfdi_sg"] = sg.peak["sf_index_sg"] + metrics["peak_dff_sg"] = sg.peak["peak_dff_sg"] + metrics["reliability_sg"] = sg.peak["reliability_sg"] + + def append_metrics_natural_scene(self, metrics, ns): + """ Extract metrics from the NaturalScenes peak response table into a dictionary. """ + + metrics["pref_image_ns"] = ns.peak["scene_ns"] + metrics["p_ns"] = ns.peak["ptest_ns"] + metrics["time_to_peak_ns"] = ns.peak["time_to_peak_ns"] + metrics["image_sel_ns"] = ns.peak["image_selectivity_ns"] + metrics["reliability_ns"] = ns.peak["reliability_ns"] + metrics["run_mod_ns"] = ns.peak["run_modulation_ns"] + metrics["p_run_mod_ns"] = ns.peak["p_run_ns"] + metrics["peak_dff_ns"] = ns.peak["peak_dff_ns"] + + def append_metrics_locally_sparse_noise(self, metrics, lsn): + """ Extract metrics from the LocallySparseNoise peak response table into a dictionary. """ + + metrics['rf_chi2_lsn'] = lsn.peak['rf_chi2_lsn'] + metrics['rf_area_on_lsn'] = lsn.peak['rf_area_on_lsn'] + metrics['rf_center_on_x_lsn'] = lsn.peak['rf_center_on_x_lsn'] + metrics['rf_center_on_y_lsn'] = lsn.peak['rf_center_on_y_lsn'] + metrics['rf_area_off_lsn'] = lsn.peak['rf_area_off_lsn'] + metrics['rf_center_off_x_lsn'] = lsn.peak['rf_center_off_x_lsn'] + metrics['rf_center_off_y_lsn'] = lsn.peak['rf_center_off_y_lsn'] + metrics['rf_distance_lsn'] = lsn.peak['rf_distance_lsn'] + metrics['rf_overlap_index_lsn'] = lsn.peak['rf_overlap_index_lsn'] + + def append_metrics_natural_movie_one(self, metrics, nma): + """ Extract metrics from the NaturalMovie(stimulus_info.NATURAL_MOVIE_ONE) peak response table into a dictionary. """ + metrics['reliability_nm1'] = nma.peak['response_reliability_nm1'] + + def append_metrics_natural_movie_two(self, metrics, nma): + """ Extract metrics from the NaturalMovie(stimulus_info.NATURAL_MOVIE_TWO) peak response table into a dictionary. """ + metrics['reliability_nm2'] = nma.peak['response_reliability_nm2'] + + def append_metrics_natural_movie_three(self, metrics, nma): + """ Extract metrics from the NaturalMovie(stimulus_info.NATURAL_MOVIE_THREE) peak response table into a dictionary. """ + metrics['reliability_nm3'] = nma.peak['response_reliability_nm3'] + + def append_experiment_metrics(self, metrics): + """ Extract stimulus-agnostic metrics from an experiment into a dictionary """ + dxcm, dxtime = self.nwb.get_running_speed() + metrics['mean_running_speed'] = np.nanmean(dxcm) + + def verify_roi_lists_equal(self, roi1, roi2): + """ TODO: replace this with simpler numpy comparisons """ + + if len(roi1) != len(roi2): + raise BrainObservatoryAnalysisException( + "Error -- ROI lists are of different length") + + for i in range(len(roi1)): + if roi1[i] != roi2[i]: + raise BrainObservatoryAnalysisException( + "Error -- ROI lists have different entries") + + def session_a(self, plot_flag=False, save_flag=True): + """ Run stimulus-specific analysis for natural movie one, natural movie three, and drifting gratings. + The input NWB be for a stimulus_info.THREE_SESSION_A experiment. + + Parameters + ---------- + plot_flag: bool + Whether to generate brain_observatory_plotting work plots after running analysis. + + save_flag: bool + Whether to save the output of analysis to self.save_path upon completion. + """ + + nm1 = NaturalMovie(self.nwb, 'natural_movie_one') + nm3 = NaturalMovie(self.nwb, 'natural_movie_three') + dg = DriftingGratings(self.nwb) + + dg.noise_correlation, _, _, _ = dg.get_noise_correlation() + dg.signal_correlation, _ = dg.get_signal_correlation() + dg.representational_similarity, _ = dg.get_representational_similarity() + + SessionAnalysis._log.info("Session A analyzed") + peak = multi_dataframe_merge( + [nm1.peak_run, dg.peak, nm1.peak, nm3.peak]) + + self.append_metrics_drifting_grating(self.metrics_a['cell'], dg) + self.append_metrics_natural_movie_one(self.metrics_a['cell'], nm1) + self.append_metrics_natural_movie_three(self.metrics_a['cell'], nm3) + self.append_experiment_metrics(self.metrics_a['experiment']) + self.metrics_a['cell']['roi_id'] = dg.roi_id + + self.append_metadata(peak) + + if save_flag: + self.save_session_a(dg, nm1, nm3, peak) + + if plot_flag: + cp._plot_3sa(dg, nm1, nm3, self.save_dir) + cp.plot_drifting_grating_traces(dg, self.save_dir) + + def session_b(self, plot_flag=False, save_flag=True): + """ Run stimulus-specific analysis for natural scenes, static gratings, and natural movie one. + The input NWB be for a stimulus_info.THREE_SESSION_B experiment. + + Parameters + ---------- + plot_flag: bool + Whether to generate brain_observatory_plotting work plots after running analysis. + + save_flag: bool + Whether to save the output of analysis to self.save_path upon completion. + """ + + ns = NaturalScenes(self.nwb) + sg = StaticGratings(self.nwb) + nm1 = NaturalMovie(self.nwb, 'natural_movie_one') + SessionAnalysis._log.info("Session B analyzed") + peak = multi_dataframe_merge( + [nm1.peak_run, sg.peak, ns.peak, nm1.peak]) + self.append_metadata(peak) + + self.append_metrics_static_grating(self.metrics_b['cell'], sg) + self.append_metrics_natural_scene(self.metrics_b['cell'], ns) + self.append_metrics_natural_movie_one(self.metrics_b['cell'], nm1) + self.append_experiment_metrics(self.metrics_b['experiment']) + self.verify_roi_lists_equal(sg.roi_id, ns.roi_id) + self.metrics_b['cell']['roi_id'] = sg.roi_id + + sg.noise_correlation, _, _, _ = sg.get_noise_correlation() + sg.signal_correlation, _ = sg.get_signal_correlation() + sg.representational_similarity, _ = sg.get_representational_similarity() + + ns.noise_correlation, _ = ns.get_noise_correlation() + ns.signal_correlation, _ = ns.get_signal_correlation() + ns.representational_similarity, _ = ns.get_representational_similarity() + + if save_flag: + self.save_session_b(sg, nm1, ns, peak) + + if plot_flag: + cp._plot_3sb(sg, nm1, ns, self.save_dir) + cp.plot_ns_traces(ns, self.save_dir) + cp.plot_sg_traces(sg, self.save_dir) + + def session_c(self, plot_flag=False, save_flag=True): + """ Run stimulus-specific analysis for natural movie one, natural movie two, and locally sparse noise. + The input NWB be for a stimulus_info.THREE_SESSION_C experiment. + + Parameters + ---------- + plot_flag: bool + Whether to generate brain_observatory_plotting work plots after running analysis. + + save_flag: bool + Whether to save the output of analysis to self.save_path upon completion. + """ + + lsn = LocallySparseNoise(self.nwb, stimulus_info.LOCALLY_SPARSE_NOISE) + nm2 = NaturalMovie(self.nwb, 'natural_movie_two') + nm1 = NaturalMovie(self.nwb, 'natural_movie_one') + SessionAnalysis._log.info("Session C analyzed") + peak = multi_dataframe_merge([nm1.peak_run, nm1.peak, nm2.peak, lsn.peak]) + self.append_metadata(peak) + + self.append_metrics_locally_sparse_noise(self.metrics_c['cell'], lsn) + self.append_metrics_natural_movie_one(self.metrics_c['cell'], nm1) + self.append_metrics_natural_movie_two(self.metrics_c['cell'], nm2) + self.append_experiment_metrics(self.metrics_c['experiment']) + self.metrics_c['cell']['roi_id'] = nm1.roi_id + + if save_flag: + self.save_session_c(lsn, nm1, nm2, peak) + + if plot_flag: + cp._plot_3sc(lsn, nm1, nm2, self.save_dir) + cp.plot_lsn_traces(lsn, self.save_dir) + + def session_c2(self, plot_flag=False, save_flag=True): + """ Run stimulus-specific analysis for locally sparse noise (4 deg.), locally sparse noise (8 deg.), + natural movie one, and natural movie two. The input NWB be for a stimulus_info.THREE_SESSION_C2 experiment. + + Parameters + ---------- + plot_flag: bool + Whether to generate brain_observatory_plotting work plots after running analysis. + + save_flag: bool + Whether to save the output of analysis to self.save_path upon completion. + """ + + lsn4 = LocallySparseNoise(self.nwb, stimulus_info.LOCALLY_SPARSE_NOISE_4DEG) + lsn8 = LocallySparseNoise(self.nwb, stimulus_info.LOCALLY_SPARSE_NOISE_8DEG) + + nm2 = NaturalMovie(self.nwb, 'natural_movie_two') + nm1 = NaturalMovie(self.nwb, 'natural_movie_one') + SessionAnalysis._log.info("Session C2 analyzed") + + if self.nwb.get_metadata()['targeted_structure'] == 'VISp': + lsn_peak = lsn4 + else: + lsn_peak = lsn8 + + peak = multi_dataframe_merge([nm1.peak_run, nm1.peak, nm2.peak, lsn_peak.peak]) + self.append_metadata(peak) + + self.append_metrics_locally_sparse_noise(self.metrics_c['cell'], lsn_peak) + self.append_metrics_natural_movie_one(self.metrics_c['cell'], nm1) + self.append_metrics_natural_movie_two(self.metrics_c['cell'], nm2) + self.append_experiment_metrics(self.metrics_c['experiment']) + self.metrics_c['cell']['roi_id'] = nm1.roi_id + + if save_flag: + self.save_session_c2(lsn4, lsn8, nm1, nm2, peak) + + if plot_flag: + cp._plot_3sc(lsn4, nm1, nm2, self.save_dir, '_4deg') + cp._plot_3sc(lsn8, nm1, nm2, self.save_dir, '_8deg') + cp.plot_lsn_traces(lsn4, self.save_dir, '_4deg') + cp.plot_lsn_traces(lsn4, self.save_dir, '_8deg') + + +def run_session_analysis(nwb_path, save_path, plot_flag=False, save_flag=True): + """ Inspect an NWB file to determine which experiment session was run + and compute all stimulus-specific analyses. + + Parameters + ---------- + nwb_path: string + Path to NWB file. + + save_path: string + path to save results. Recommended NOT to use NWB file. + + plot_flag: bool + Whether to save brain_observatory_plotting work plots. + + save_flag: bool + Whether to save results to save_path. + """ + + save_dir = os.path.abspath(os.path.dirname(save_path)) + + if not os.path.exists(save_dir): + os.makedirs(save_dir) + + session_analysis = SessionAnalysis(nwb_path, save_path) + + session = session_analysis.nwb.get_session_type() + + if session == stimulus_info.THREE_SESSION_A: + session_analysis.session_a(plot_flag=plot_flag, save_flag=save_flag) + metrics = session_analysis.metrics_a + elif session == stimulus_info.THREE_SESSION_B: + session_analysis.session_b(plot_flag=plot_flag, save_flag=save_flag) + metrics = session_analysis.metrics_b + elif session == stimulus_info.THREE_SESSION_C: + session_analysis.session_c(plot_flag=plot_flag, save_flag=save_flag) + metrics = session_analysis.metrics_c + elif session == stimulus_info.THREE_SESSION_C2: + session_analysis.session_c2(plot_flag=plot_flag, save_flag=save_flag) + metrics = session_analysis.metrics_c + else: + raise IndexError("Unknown session: %s" % session) + + return metrics + + +@deprecated('use the standalone version in bin/brain_observatory') +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input_nwb") + parser.add_argument("output_h5") + + parser.add_argument("--plot", action='store_true') + + args = parser.parse_args() + logging.basicConfig() + logging.getLogger().setLevel(logging.DEBUG) + + run_session_analysis(args.input_nwb, args.output_h5, args.plot) + + +if __name__ == '__main__': + main() diff --git a/brain_observatory/session_api_utils.py b/brain_observatory/session_api_utils.py new file mode 100644 index 0000000000..2b07882ca7 --- /dev/null +++ b/brain_observatory/session_api_utils.py @@ -0,0 +1,231 @@ +import inspect +import logging +import warnings +from collections import Callable + +from itertools import zip_longest +from typing import Any, Dict, List, Optional, Set, Iterable + +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.comparison_utils import compare_fields +from allensdk.brain_observatory.behavior.data_objects import DataObject + + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +def is_equal(a: Any, b: Any) -> bool: + """Function to deal with checking if two variables of possibly mixed types + have the same value.""" + + if type(a) != type(b): + return False + + if isinstance(a, (pd.Series, pd.DataFrame)): + return a.equals(b) + elif isinstance(a, np.ndarray): + return np.array_equal(a, b) + elif isinstance(a, (list, tuple)): + for a_elem, b_elem in zip_longest(a, b): + if not is_equal(a_elem, b_elem): + return False + return True + elif isinstance(a, set): + for a_elem, b_elem in zip_longest(sorted(a), sorted(b)): + if not is_equal(a_elem, b_elem): + return False + return True + elif isinstance(a, dict): + for (a_k, a_v), (b_k, b_v) in zip_longest(sorted(a.items()), + sorted(b.items())): + if (a_k != b_k) or (not is_equal(a_v, b_v)): + return False + return True + else: + return bool(a == b) + + +class ParamsMixin: + """This mixin adds parameter management functionality to the class it is + mixed into. + + This mixin expects that the class it is mixed into will have an __init__ + with type annotated parameters. It also expects for the class to have + semi-private attributes of the __init__ type annotated parameters. + + Example: + + SomeClassWhereParamManagementIsDesired(ParamsMixin): + + # Managed params should be typed (with simple types if possible)! + def __init__(self, param_to_ignore, a_param_1: int, a_param_2: float, + b_param_1: list): + # Parameters can be ignored by the mixin + super().__init__(ignore={'param_to_ignore'}) + + # Pay attention to the naming scheme! + self._a_param_1 = a_param_1 + self._a_param_2 = a_param_2 + self._b_param_1 = b_param_1 + + ... + + After being mixed in, methods like 'get_params', 'set_params', + 'needs_data_refresh', and 'clear_updated_params' will be available. + """ + + def __init__(self, ignore: set = {'api'}): + self._updated_params: set = set() + self._ignore = ignore + + @classmethod + def _get_param_signatures(cls) -> List[inspect.Parameter]: + init = getattr(cls, '__init__') + if init is object.__init__: + # Class has a default __init__ and thus no params + return [] + init_signature = inspect.signature(init) + # Filter out 'self' and '**kwargs' params + parameters = [p for p in init_signature.parameters.values() + if (p.name != 'self') and (p.kind != p.VAR_KEYWORD)] + return parameters + + @classmethod + def _get_param_type_annotations(cls) -> Dict[str, type]: + parameters = cls._get_param_signatures() + return {p.name: p.annotation for p in parameters} + + @classmethod + def _get_param_names(cls) -> List[str]: + parameters = cls._get_param_signatures() + return sorted([p.name for p in parameters]) + + def get_params(self) -> Dict[str, Any]: + """Get managed params and their values""" + out = dict() + for param in self._get_param_names(): + if param in self._ignore: + continue + value = getattr(self, f"_{param}") + out.update({param: value}) + return out + + def set_params(self, **params): + """Set managed params""" + valid_params = self.get_params().keys() + param_types = self._get_param_type_annotations() + current_params = self.get_params() + + for param, value in params.items(): + if param in valid_params: + current_value = current_params[param] + + if isinstance(value, param_types[param]): + if not is_equal(current_value, value): + setattr(self, f"_{param}", value) + self._updated_params.add(param) + else: + warnings.warn(f"The value ({value}) for parameter " + f"'{param}' should be of type " + f"'{param_types[param]}' but is instead " + f"{type(value)}. It will remain as: " + f"{current_value} " + f"({type(current_value)}).", + stacklevel=2) + else: + warnings.warn(f"The parameter '{param}' is not valid " + f"and is being ignored! " + f"Possible params are: {valid_params}", + stacklevel=2) + + def needs_data_refresh(self, data_params: set) -> bool: + """Check if specific params have been updated via `set_params()`""" + return bool(data_params & self._updated_params) + + def clear_updated_params(self, data_params: set): + """This method clears 'updated params' whose data have been updated""" + self._updated_params -= data_params + + +def sessions_are_equal(A, B, reraise=False, + ignore_keys: Optional[Dict[str, Set[str]]] = None, + skip_fields: Optional[Iterable] = None, + test_methods=False) \ + -> bool: + """Check if two Session objects are equal (have same property and + get method values). + + Parameters + ---------- + A : Session A + The first session to compare + B : Session B + The second session to compare + reraise : bool, optional + Whether to reraise when encountering an Assertion or AttributeError, + by default False + ignore_keys + Set of keys to ignore for property/method. Should be given as + {property/method name: {field_to_ignore, ...}, ...} + test_methods + Whether to test get methods + skip_fields + Do not compare these fields + + Returns + ------- + bool + Whether the two sessions are equal to one another. + """ + if ignore_keys is None: + ignore_keys = dict() + if skip_fields is None: + + skip_fields = set() + + A_data_attrs_and_methods = A.list_data_attributes_and_methods() + B_data_attrs_and_methods = B.list_data_attributes_and_methods() + field_set = set(A_data_attrs_and_methods).union(B_data_attrs_and_methods) + + logger.info(f"Comparing the following fields: {field_set}") + + for field in sorted(field_set): + if field in skip_fields: + continue + + try: + logger.info(f"Comparing field: {field}") + x1, x2 = getattr(A, field), getattr(B, field) + if test_methods: + if isinstance(x1, Callable): + x1 = x1() + x2 = x2() + else: + continue + + err_msg = (f"{field} on {A} did not equal {field} " + f"on {B} (\n{x1} vs\n{x2}\n)") + if isinstance(x1, DataObject): + x1 = x1.value + if isinstance(x2, DataObject): + x2 = x2.value + compare_fields(x1, x2, err_msg, + ignore_keys=ignore_keys.get(field, None)) + + except NotImplementedError: + A_implements_get_field = hasattr( + A.api, getattr(type(A), field).getter_name) + B_implements_get_field = hasattr( + B.api, getattr(type(B), field).getter_name) + assert ((A_implements_get_field is False) + and (B_implements_get_field is False)) + + except (AssertionError, AttributeError): + if reraise: + raise + return False + + return True diff --git a/brain_observatory/static_gratings.py b/brain_observatory/static_gratings.py new file mode 100644 index 0000000000..735bb2eb4e --- /dev/null +++ b/brain_observatory/static_gratings.py @@ -0,0 +1,594 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import scipy.stats as st +import numpy as np +import pandas as pd +from math import sqrt +import logging +from .stimulus_analysis import StimulusAnalysis +from .brain_observatory_exceptions import BrainObservatoryAnalysisException, MissingStimulusException +from . import observatory_plots as oplots +from . import circle_plots as cplots +import h5py +import matplotlib.pyplot as plt + +class StaticGratings(StimulusAnalysis): + """ Perform tuning analysis specific to static gratings stimulus. + + Parameters + ---------- + data_set: BrainObservatoryNwbDataSet object + """ + + _log = logging.getLogger('allensdk.brain_observatory.static_gratings') + + def __init__(self, data_set, **kwargs): + super(StaticGratings, self).__init__(data_set, **kwargs) + + self._sweeplength = StaticGratings._PRELOAD + self._interlength = StaticGratings._PRELOAD + self._extralength = StaticGratings._PRELOAD + self._orivals = StaticGratings._PRELOAD + self._sfvals = StaticGratings._PRELOAD + self._phasevals = StaticGratings._PRELOAD + self._number_ori = StaticGratings._PRELOAD + self._number_sf = StaticGratings._PRELOAD + self._number_phase = StaticGratings._PRELOAD + + @property + def sweeplength(self): + if self._sweeplength is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._sweeplength + + @property + def interlength(self): + if self._interlength is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._interlength + + @property + def extralength(self): + if self._extralength is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._extralength + + @property + def orivals(self): + if self._orivals is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._orivals + + @property + def sfvals(self): + if self._sfvals is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._sfvals + + @property + def phasevals(self): + if self._phasevals is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._phasevals + + @property + def number_ori(self): + if self._number_ori is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._number_ori + + @property + def number_sf(self): + if self._number_sf is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._number_sf + + @property + def number_phase(self): + if self._number_phase is StaticGratings._PRELOAD: + self.populate_stimulus_table() + + return self._number_phase + + def populate_stimulus_table(self): + stimulus_table = self.data_set.get_stimulus_table('static_gratings') + self._stim_table = stimulus_table.fillna(value=0.) + self._sweeplength = self.stim_table['end'].iloc[ + 1] - self.stim_table['start'].iloc[1] + self._interlength = 4 * self._sweeplength + self._extralength = self._sweeplength + self._orivals = np.unique(self._stim_table.orientation.dropna()) + self._sfvals = np.unique(self._stim_table.spatial_frequency.dropna()) + self._phasevals = np.unique(self._stim_table.phase.dropna()) + self._number_ori = len(self._orivals) + self._number_sf = len(self._sfvals) + self._number_phase = len(self._phasevals) + + def get_response(self): + ''' Computes the mean response for each cell to each stimulus condition. Return is + a (# orientations, # spatial frequencies, # phasees, # cells, 3) np.ndarray. The final dimension + contains the mean response to the condition (index 0), standard error of the mean of the response + to the condition (index 1), and the number of trials with a significant response (p < 0.05) + to that condition (index 2). + + Returns + ------- + Numpy array storing mean responses. + ''' + StaticGratings._log.info("Calculating mean responses") + + response = np.empty((self.number_ori, self.number_sf, + self.number_phase, self.numbercells + 1, 3)) + + def ptest(x): + return len(np.where(x < (0.05 / (self.number_ori * (self.number_sf - 1))))[0]) + + for ori in self.orivals: + ori_pt = np.where(self.orivals == ori)[0][0] + + for sf in self.sfvals: + sf_pt = np.where(self.sfvals == sf)[0][0] + + for phase in self.phasevals: + phase_pt = np.where(self.phasevals == phase)[0][0] + subset_response = self.mean_sweep_response[(self.stim_table.spatial_frequency == sf) & ( + self.stim_table.orientation == ori) & (self.stim_table.phase == phase)] + subset_pval = self.pval[(self.stim_table.spatial_frequency == sf) & ( + self.stim_table.orientation == ori) & (self.stim_table.phase == phase)] + response[ori_pt, sf_pt, phase_pt, :, + 0] = subset_response.mean(axis=0) + response[ori_pt, sf_pt, phase_pt, :, 1] = subset_response.std( + axis=0) / sqrt(len(subset_response)) + response[ori_pt, sf_pt, phase_pt, :, + 2] = subset_pval.apply(ptest, axis=0) + + return response + + def get_peak(self): + ''' Computes metrics related to each cell's peak response condition. + + Returns + ------- + Panda data frame with the following fields (_sg suffix is + for static grating): + * ori_sg (orientation) + * sf_sg (spatial frequency) + * phase_sg + * response_variability_sg + * osi_sg (orientation selectivity index) + * peak_dff_sg (peak dF/F) + * ptest_sg + * time_to_peak_sg + ''' + StaticGratings._log.info('Calculating peak response properties') + + peak = pd.DataFrame(index=range(self.numbercells), columns=('ori_sg', 'sf_sg', 'phase_sg', 'reliability_sg', + 'osi_sg', 'peak_dff_sg', 'ptest_sg', 'time_to_peak_sg', + 'cell_specimen_id','p_run_sg', 'cv_os_sg', + 'run_modulation_sg', 'sf_index_sg')) + cids = self.data_set.get_cell_specimen_ids() + + orivals_rad = np.deg2rad(self.orivals) + for nc in range(self.numbercells): + cell_peak = np.where(self.response[:, 1:, :, nc, 0] == np.nanmax( + self.response[:, 1:, :, nc, 0])) + pref_ori = cell_peak[0][0] + pref_sf = cell_peak[1][0] + 1 + pref_phase = cell_peak[2][0] + peak.cell_specimen_id.iloc[nc] = cids[nc] + peak.ori_sg[nc] = pref_ori + peak.sf_sg[nc] = pref_sf + peak.phase_sg[nc] = pref_phase + +# peak.response_reliability_sg[nc] = self.response[ +# pref_ori, pref_sf, pref_phase, nc, 2] / 0.48 # TODO: check number of trials + + pref = self.response[pref_ori, pref_sf, pref_phase, nc, 0] + orth = self.response[ + np.mod(pref_ori + 3, 6), pref_sf, pref_phase, nc, 0] + tuning = self.response[:, pref_sf, pref_phase, nc, 0] + tuning = np.where(tuning>0, tuning, 0) + CV_top_os = np.empty((6), dtype=np.complex128) + for i in range(6): + CV_top_os[i] = (tuning[i]*np.exp(1j*2*orivals_rad[i])) + peak.cv_os_sg.iloc[nc] = np.abs(CV_top_os.sum())/tuning.sum() + + peak.osi_sg[nc] = (pref - orth) / (pref + orth) + peak.peak_dff_sg[nc] = pref + groups = [] + + for ori in self.orivals: + for sf in self.sfvals[1:]: + for phase in self.phasevals: + groups.append(self.mean_sweep_response[(self.stim_table.spatial_frequency == sf) & ( + self.stim_table.orientation == ori) & (self.stim_table.phase == phase)][str(nc)]) + groups.append(self.mean_sweep_response[ + self.stim_table.spatial_frequency == 0][str(nc)]) + + _, p = st.f_oneway(*groups) + peak.ptest_sg[nc] = p + + test_rows = (self.stim_table.orientation == self.orivals[pref_ori]) & \ + (self.stim_table.spatial_frequency == self.sfvals[pref_sf]) & \ + (self.stim_table.phase == self.phasevals[pref_phase]) + + if len(test_rows) < 2: + msg = "Static grating p value requires at least 2 trials at the preferred " + "orientation/spatial frequency/phase. Cell %d (%f, %f, %f) has %d." % \ + (int(nc), self.orivals[pref_ori], self.sfvals[pref_sf], + self.phasevals[pref_phase], len(test_rows)) + + raise BrainObservatoryAnalysisException(msg) + + test = self.sweep_response[test_rows][str(nc)].mean() + peak.time_to_peak_sg[nc] = ( + np.argmax(test) - self.interlength) / self.acquisition_rate + + #running modulation + subset = self.mean_sweep_response[(self.stim_table.spatial_frequency==self.sfvals[pref_sf])&(self.stim_table.orientation==self.orivals[pref_ori])&(self.stim_table.phase==self.phasevals[pref_phase])] + subset_run = subset[subset.dx>=1] + subset_stat = subset[subset.dx<1] + if (len(subset_run)>4) & (len(subset_stat)>4): + (_,peak.p_run_sg.iloc[nc]) = st.ttest_ind(subset_run[str(nc)], subset_stat[str(nc)], equal_var=False) + + if subset_run[str(nc)].mean()>subset_stat[str(nc)].mean(): + peak.run_modulation_sg.iloc[nc] = (subset_run[str(nc)].mean() - subset_stat[str(nc)].mean())/np.abs(subset_run[str(nc)].mean()) + elif subset_run[str(nc)].mean()<subset_stat[str(nc)].mean(): + peak.run_modulation_sg.iloc[nc] = -1*((subset_stat[str(nc)].mean() - subset_run[str(nc)].mean())/np.abs(subset_stat[str(nc)].mean())) + else: + peak.p_run_sg.iloc[nc] = np.NaN + peak.run_modulation_sg.iloc[nc] = np.NaN + + #reliability + subset = self.sweep_response[(self.stim_table.spatial_frequency==self.sfvals[pref_sf])&(self.stim_table.orientation==self.orivals[pref_ori])&(self.stim_table.phase==self.phasevals[pref_phase])] + corr_matrix = np.empty((len(subset),len(subset))) + for i in range(len(subset)): + for j in range(len(subset)): + r,p = st.pearsonr(subset[str(nc)].iloc[i][28:42], subset[str(nc)].iloc[j][28:42]) + corr_matrix[i,j] = r + mask = np.ones((len(subset), len(subset))) + for i in range(len(subset)): + for j in range(len(subset)): + if i>=j: + mask[i,j] = np.NaN + corr_matrix *= mask + peak.reliability_sg.iloc[nc] = np.nanmean(corr_matrix) + + #SF index + sf_tuning = self.response[pref_ori,1:,pref_phase,nc,0] + trials = self.mean_sweep_response[(self.stim_table.spatial_frequency!=0)&(self.stim_table.orientation==self.orivals[pref_ori])&(self.stim_table.phase==self.phasevals[pref_phase])][str(nc)].values + SSE_part = np.sqrt(np.sum((trials-trials.mean())**2)/(len(trials)-5)) + peak.sf_index_sg.iloc[nc] = (np.ptp(sf_tuning))/(np.ptp(sf_tuning) + 2*SSE_part) + + return peak + + def plot_time_to_peak(self, + p_value_max=oplots.P_VALUE_MAX, + color_map=oplots.STIMULUS_COLOR_MAP): + stimulus_table = self.data_set.get_stimulus_table('static_gratings') + + resps = [] + + for index, row in self.peak.iterrows(): + pref_rows = (stimulus_table.orientation==self.orivals[row.ori_sg]) & \ + (stimulus_table.spatial_frequency==self.sfvals[row.sf_sg]) & \ + (stimulus_table.phase==self.phasevals[row.phase_sg]) + + mean_response = self.sweep_response[pref_rows][str(index)].mean() + resps.append((mean_response - mean_response.mean() / mean_response.std())) + + mean_responses = np.array(resps) + + sorted_table = self.peak[self.peak.ptest_sg < p_value_max].sort_values('time_to_peak_sg') + cell_order = sorted_table.index + + # time to peak is relative to stimulus start in seconds + ttps = sorted_table.time_to_peak_sg.values + self.interlength / self.acquisition_rate + msrs_sorted = mean_responses[cell_order,:] + + oplots.plot_time_to_peak(msrs_sorted, ttps, + 0, (2*self.interlength + self.sweeplength) / self.acquisition_rate, + (self.interlength) / self.acquisition_rate, + (self.interlength + self.sweeplength) / self.acquisition_rate, + color_map) + + + def plot_orientation_selectivity(self, + si_range=oplots.SI_RANGE, + n_hist_bins=oplots.N_HIST_BINS, + color=oplots.STIM_COLOR, + p_value_max=oplots.P_VALUE_MAX, + peak_dff_min=oplots.PEAK_DFF_MIN): + + # responsive cells + vis_cells = (self.peak.ptest_sg < p_value_max) & (self.peak.peak_dff_sg > peak_dff_min) + + # orientation selective cells + osi_cells = vis_cells & (self.peak.osi_sg > si_range[0]) & (self.peak.osi_sg < si_range[1]) + + peak_osi = self.peak.ix[osi_cells] + osis = peak_osi.osi_sg.values + + oplots.plot_selectivity_cumulative_histogram(osis, + "orientation selectivity index", + si_range=si_range, + n_hist_bins=n_hist_bins, + color=color) + + def plot_preferred_orientation(self, + include_labels=False, + si_range=oplots.SI_RANGE, + color=oplots.STIM_COLOR, + p_value_max=oplots.P_VALUE_MAX, + peak_dff_min=oplots.PEAK_DFF_MIN): + + vis_cells = (self.peak.ptest_sg < p_value_max) & (self.peak.peak_dff_sg > peak_dff_min) + pref_oris = self.peak.ix[vis_cells].ori_sg.values + pref_oris = [ self.orivals[pref_ori] for pref_ori in pref_oris ] + + angles, counts = np.unique(pref_oris, return_counts=True) + + oplots.plot_radial_histogram(angles, + counts, + include_labels=include_labels, + all_angles=self.orivals, + direction=-1, + offset=180.0, + color=color) + + if len(counts) == 0: + max_count = 1 + else: + max_count = max(counts) + + center_x = 0.0 + center_y = 0.5 * max_count + + # dimensions to get plot to fit + h = 1.6 * max_count + w = 2.4 * max_count + + plt.gca().set(xlim=(center_x - w*0.5, center_x + w*0.5), + ylim = (center_y - h*0.5, center_y + h*0.5), + aspect=1.0) + + def plot_preferred_spatial_frequency(self, + si_range=oplots.SI_RANGE, + color=oplots.STIM_COLOR, + p_value_max=oplots.P_VALUE_MAX, + peak_dff_min=oplots.PEAK_DFF_MIN): + + vis_cells = (self.peak.ptest_sg < p_value_max) & (self.peak.peak_dff_sg > peak_dff_min) + pref_sfs = self.peak.ix[vis_cells].sf_sg.values + + oplots.plot_condition_histogram(pref_sfs, + self.sfvals[1:], + color=color) + + plt.xlabel("spatial frequency (cycles/deg)") + plt.ylabel("number of cells") + + def open_fan_plot(self, cell_specimen_id=None, include_labels=False, cell_index=None): + cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) + + df = self.mean_sweep_response[str(cell_index)] + st = self.data_set.get_stimulus_table('static_gratings') + mask = st.dropna(subset=['orientation']).index + + data = df.values + + cmin = self.response[0,0,0,cell_index,0] + cmax = max(cmin, data.mean() + data.std()*3) + + fp = cplots.FanPlotter.for_static_gratings() + fp.plot(r_data=st.spatial_frequency.ix[mask].values, + angle_data=st.orientation.ix[mask].values, + group_data=st.phase.ix[mask].values, + data=df.ix[mask].values, + clim=[cmin, cmax]) + fp.show_axes(closed=False) + + if include_labels: + fp.show_r_labels() + fp.show_angle_labels() + + + def reshape_response_array(self): + ''' + :return: response array in cells x stim conditions x repetition for noise correlations + this is a re-organization of the mean sweep response table + ''' + + mean_sweep_response = self.mean_sweep_response.values[:, :self.numbercells] + + stim_table = self.stim_table + sfvals = self.sfvals + sfvals = sfvals[sfvals != 0] # blank sweep + + response_new = np.zeros((self.numbercells, self.number_ori, self.number_sf-1, self.number_phase), dtype='object') + + for i, ori in enumerate(self.orivals): + for j, sf in enumerate(sfvals): + for k, phase in enumerate(self.phasevals): + ind = (stim_table.orientation.values == ori) * (stim_table.spatial_frequency.values == sf) * (stim_table.phase.values == phase) + for c in range(self.numbercells): + response_new[c, i, j, k] = mean_sweep_response[ind, c] + + ind = (stim_table.spatial_frequency.values == 0) + response_blank = mean_sweep_response[ind, :].T + + return response_new, response_blank + + + def get_signal_correlation(self, corr='spearman'): + logging.debug("Calculating signal correlation") + + response = self.response[:, 1:, :, :self.numbercells, 0] # orientation x freq x phase x cell, no blank + response = response.reshape(self.number_ori * (self.number_sf-1) * self.number_phase, self.numbercells).T + N, Nstim = response.shape + + signal_corr = np.zeros((N, N)) + signal_p = np.empty((N, N)) + if corr == 'pearson': + for i in range(N): + for j in range(i, N): # matrix is symmetric + signal_corr[i, j], signal_p[i, j] = st.pearsonr(response[i], response[j]) + + elif corr == 'spearman': + for i in range(N): + for j in range(i, N): # matrix is symmetric + signal_corr[i, j], signal_p[i, j] = st.spearmanr(response[i], response[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + signal_corr = np.triu(signal_corr) + np.triu(signal_corr, 1).T # fill in lower triangle + signal_p = np.triu(signal_p) + np.triu(signal_p, 1).T # fill in lower triangle + + return signal_corr, signal_p + + + def get_representational_similarity(self, corr='spearman'): + logging.debug("Calculating representational similarity") + + response = self.response[:, 1:, :, :self.numbercells, 0] # orientation x freq x phase x cell + response = response.reshape(self.number_ori * (self.number_sf-1) * self.number_phase, self.numbercells) + Nstim, N = response.shape + + rep_sim = np.zeros((Nstim, Nstim)) + rep_sim_p = np.empty((Nstim, Nstim)) + if corr == 'pearson': + for i in range(Nstim): + for j in range(i, Nstim): # matrix is symmetric + rep_sim[i, j], rep_sim_p[i, j] = st.pearsonr(response[i], response[j]) + + elif corr == 'spearman': + for i in range(Nstim): + for j in range(i, Nstim): # matrix is symmetric + rep_sim[i, j], rep_sim_p[i, j] = st.spearmanr(response[i], response[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + rep_sim = np.triu(rep_sim) + np.triu(rep_sim, 1).T # fill in lower triangle + rep_sim_p = np.triu(rep_sim_p) + np.triu(rep_sim_p, 1).T # fill in lower triangle + + return rep_sim, rep_sim_p + + + def get_noise_correlation(self, corr='spearman'): + logging.debug("Calculating noise correlation") + + response, response_blank = self.reshape_response_array() + noise_corr = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_sf-1, self.number_phase)) + noise_corr_p = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_sf-1, self.number_phase)) + + noise_corr_blank = np.zeros((self.numbercells, self.numbercells)) + noise_corr_blank_p = np.zeros((self.numbercells, self.numbercells)) + + if corr == 'pearson': + for k in range(self.number_ori): + for l in range(self.number_sf-1): + for m in range(self.number_phase): + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr[i, j, k, l, m], noise_corr_p[i, j, k, l, m] = st.pearsonr(response[i, k, l, m], response[j, k, l, m]) + + noise_corr[:, :, k, l, m] = np.triu(noise_corr[:, :, k, l, m]) + np.triu(noise_corr[:, :, k, l, m], 1).T + + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.pearsonr(response_blank[i], response_blank[j]) + + elif corr == 'spearman': + for k in range(self.number_ori): + for l in range(self.number_sf-1): + for m in range(self.number_phase): + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr[i, j, k, l, m], noise_corr_p[i, j, k, l, m] = st.spearmanr(response[i, k, l, m], response[j, k, l, m]) + + noise_corr[:, :, k, l, m] = np.triu(noise_corr[:, :, k, l, m]) + np.triu(noise_corr[:, :, k, l, m], 1).T + + for i in range(self.numbercells): + for j in range(i, self.numbercells): + noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.spearmanr(response_blank[i], response_blank[j]) + + else: + raise Exception('correlation should be pearson or spearman') + + noise_corr_blank[:, :] = np.triu(noise_corr_blank[:, :]) + np.triu(noise_corr_blank[:, :], 1).T + + return noise_corr, noise_corr_p, noise_corr_blank, noise_corr_blank_p + + + @staticmethod + def from_analysis_file(data_set, analysis_file): + sg = StaticGratings(data_set) + + try: + sg.populate_stimulus_table() + + sg._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_sg") + sg._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_sg") + sg._peak = pd.read_hdf(analysis_file, "analysis/peak") + + with h5py.File(analysis_file, "r") as f: + sg._response = f["analysis/response_sg"].value + sg._binned_dx_sp = f["analysis/binned_dx_sp"].value + sg._binned_cells_sp = f["analysis/binned_cells_sp"].value + sg._binned_dx_vis = f["analysis/binned_dx_vis"].value + sg._binned_cells_vis = f["analysis/binned_cells_vis"].value + + if "analysis/noise_corr_sg" in f: + sg.noise_correlation = f["analysis/noise_corr_sg"].value + if "analysis/signal_corr_sg" in f: + sg.signal_correlation = f["analysis/signal_corr_sg"].value + if "analysis/rep_similarity_sg" in f: + sg.representational_similarity = f["analysis/rep_similarity_sg"].value + + except Exception as e: + raise MissingStimulusException(e.args) + + return sg diff --git a/brain_observatory/stimulus_analysis.py b/brain_observatory/stimulus_analysis.py new file mode 100644 index 0000000000..9a4838fb8f --- /dev/null +++ b/brain_observatory/stimulus_analysis.py @@ -0,0 +1,606 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import warnings +import scipy.stats as st +import scipy +import numpy as np +import pandas as pd +import logging +from .findlevel import findlevel +from .brain_observatory_exceptions import BrainObservatoryAnalysisException +from . import observatory_plots as oplots +import matplotlib.pyplot as plt + +class StimulusAnalysis(object): + """ Base class for all response analysis code. Subclasses are responsible + for computing metrics and traces relevant to a particular stimulus. + The base class contains methods for organizing sweep responses row of + a stimulus stable (get_sweep_response). Subclasses implement the + get_response method, computes the mean sweep response to all sweeps for + a each stimulus condition. + + Parameters + ---------- + data_set: BrainObservatoryNwbDataSet instance + + speed_tuning: boolean, deprecated + Whether or not to compute speed tuning histograms + + """ + _log = logging.getLogger('allensdk.brain_observatory.stimulus_analysis') + _PRELOAD = "PRELOAD" + + def __init__(self, data_set): + self.data_set = data_set + self._timestamps = StimulusAnalysis._PRELOAD + self._celltraces = StimulusAnalysis._PRELOAD + self._acquisition_rate = StimulusAnalysis._PRELOAD + self._numbercells = StimulusAnalysis._PRELOAD + self._roi_id = StimulusAnalysis._PRELOAD + self._cell_id = StimulusAnalysis._PRELOAD + self._dfftraces = StimulusAnalysis._PRELOAD + self._dxcm = StimulusAnalysis._PRELOAD + self._dxtime = StimulusAnalysis._PRELOAD + self._binned_dx_sp = StimulusAnalysis._PRELOAD + self._binned_cells_sp = StimulusAnalysis._PRELOAD + self._binned_dx_vis = StimulusAnalysis._PRELOAD + self._binned_cells_vis = StimulusAnalysis._PRELOAD + self._peak_run = StimulusAnalysis._PRELOAD + self._binsize = 800 + + self._stim_table = StimulusAnalysis._PRELOAD + self._response = StimulusAnalysis._PRELOAD + self._sweep_response = StimulusAnalysis._PRELOAD + self._mean_sweep_response = StimulusAnalysis._PRELOAD + self._pval = StimulusAnalysis._PRELOAD + self._peak = StimulusAnalysis._PRELOAD + + # get_speed_tuning emits a warning describing a scipy ks_2samp update. + # we only want to see this warning once + self.__warned_speed_tuning = False + + @property + def stim_table(self): + if self._stim_table is StimulusAnalysis._PRELOAD: + self.populate_stimulus_table() + + return self._stim_table + + @property + def sweep_response(self): + if self._sweep_response is StimulusAnalysis._PRELOAD: + self._sweep_response, self._mean_sweep_response, self._pval = \ + self.get_sweep_response() + + return self._sweep_response + + @property + def mean_sweep_response(self): + if self._mean_sweep_response is StimulusAnalysis._PRELOAD: + self._sweep_response, self._mean_sweep_response, self._pval = \ + self.get_sweep_response() + + return self._mean_sweep_response + + @property + def pval(self): + if self._pval is StimulusAnalysis._PRELOAD: + self._sweep_response, self._mean_sweep_response, self._pval = \ + self.get_sweep_response() + + return self._pval + + @property + def response(self): + if self._response is StimulusAnalysis._PRELOAD: + self._response = self.get_response() + + return self._response + + @property + def peak(self): + if self._peak is StimulusAnalysis._PRELOAD: + self._peak = self.get_peak() + + return self._peak + + def get_fluorescence(self): + # get fluorescence + self._timestamps, self._celltraces = \ + self.data_set.get_corrected_fluorescence_traces() + self._acquisition_rate = 1 / (self.timestamps[1] - self.timestamps[0]) + self._numbercells = len(self.celltraces) # number of cells in dataset + + @property + def timestamps(self): + if self._timestamps is StimulusAnalysis._PRELOAD: + self.get_fluorescence() + + return self._timestamps + + @property + def celltraces(self): + if self._celltraces is StimulusAnalysis._PRELOAD: + self.get_fluorescence() + + return self._celltraces + + @property + def acquisition_rate(self): + if self._acquisition_rate is StimulusAnalysis._PRELOAD: + self.get_fluorescence() + + return self._acquisition_rate + + @property + def numbercells(self): + if self._numbercells is StimulusAnalysis._PRELOAD: + self.get_fluorescence() + + return self._numbercells + + @property + def roi_id(self): + if self._roi_id is StimulusAnalysis._PRELOAD: + self._roi_id = self.data_set.get_roi_ids() + + return self._roi_id + + @property + def cell_id(self): + if self._cell_id is StimulusAnalysis._PRELOAD: + self._cell_id = self.data_set.get_cell_specimen_ids() + + return self._cell_id + + @property + def dfftraces(self): + if self._dfftraces is StimulusAnalysis._PRELOAD: + _, self._dfftraces = self.data_set.get_dff_traces() + + return self._dfftraces + + @property + def dxcm(self): + if self._dxcm is StimulusAnalysis._PRELOAD: + self._dxcm, self._dxtime = self.data_set.get_running_speed() + + return self._dxcm + + @property + def dxtime(self): + if self._dxtime is StimulusAnalysis._PRELOAD: + self._dxcm, self._dxtime = self.data_set.get_running_speed() + + return self._dxtime + + @property + def binned_dx_sp(self): + if self._binned_dx_sp is StimulusAnalysis._PRELOAD: + (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, + self._binned_cells_vis, self._peak_run) = \ + self.get_speed_tuning(binsize=self._binsize) + + return self._binned_dx_sp + + @property + def binned_cells_sp(self): + if self._binned_cells_sp is StimulusAnalysis._PRELOAD: + (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, + self._binned_cells_vis, self._peak_run) = \ + self.get_speed_tuning(binsize=self._binsize) + + return self._binned_cells_sp + + @property + def binned_dx_vis(self): + if self._binned_dx_vis is StimulusAnalysis._PRELOAD: + (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, + self._binned_cells_vis, self._peak_run) = \ + self.get_speed_tuning(binsize=self._binsize) + + return self._binned_dx_vis + + @property + def binned_cells_vis(self): + if self._binned_cells_vis is StimulusAnalysis._PRELOAD: + (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, + self._binned_cells_vis, self._peak_run) = \ + self.get_speed_tuning(binsize=self._binsize) + + return self._binned_cells_vis + + @property + def peak_run(self): + if self._peak_run is StimulusAnalysis._PRELOAD: + (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, + self._binned_cells_vis, self._peak_run) = \ + self.get_speed_tuning(binsize=self._binsize) + + return self._peak_run + + def populate_stimulus_table(self): + """ Implemented by subclasses. """ + raise BrainObservatoryAnalysisException("populate_stimulus_table not implemented") + + def get_response(self): + """ Implemented by subclasses. """ + raise BrainObservatoryAnalysisException("get_response not implemented") + + def get_peak(self): + """ Implemented by subclasses. """ + raise BrainObservatoryAnalysisException("get_peak not implemented") + + def get_speed_tuning(self, binsize): + """ Calculates speed tuning, spontaneous versus visually driven. The return is a 5-tuple + of speed and dF/F histograms. + + binned_dx_sp: (bins,2) np.ndarray of running speeds binned during spontaneous activity stimulus. + The first bin contains all speeds below 1 cm/s. Dimension 0 is mean running speed in the bin. + Dimension 1 is the standard error of the mean. + + binned_cells_sp: (bins,2) np.ndarray of fluorescence during spontaneous activity stimulus. + First bin contains all data for speeds below 1 cm/s. Dimension 0 is mean fluorescence in the bin. + Dimension 1 is the standard error of the mean. + + binned_dx_vis: (bins,2) np.ndarray of running speeds outside of spontaneous activity stimulus. + The first bin contains all speeds below 1 cm/s. Dimension 0 is mean running speed in the bin. + Dimension 1 is the standard error of the mean. + + binned_cells_vis: np.ndarray of fluorescence outside of spontaneous activity stimulu. + First bin contains all data for speeds below 1 cm/s. Dimension 0 is mean fluorescence in the bin. + Dimension 1 is the standard error of the mean. + + peak_run: pd.DataFrame of speed-related properties of a cell. + + Returns + ------- + tuple: binned_dx_sp, binned_cells_sp, binned_dx_vis, binned_cells_vis, peak_run + """ + + if not self.__warned_speed_tuning: + self.__warned_speed_tuning = True + warnings.warn( + f"scipy 1.3 (your version: {scipy.__version__}) improved two-sample Kolmogorov-Smirnoff test p values for small and medium-sized samples. " + "Precalculated speed tuning p values may not agree with outputs obtained under recent scipy versions!" + ) + + StimulusAnalysis._log.info( + 'Calculating speed tuning, spontaneous vs visually driven') + + celltraces_trimmed = np.delete(self.dfftraces, range( + len(self.dxcm), np.size(self.dfftraces, 1)), axis=1) + + # pull out spontaneous epoch(s) + spontaneous = self.data_set.get_stimulus_table('spontaneous') + + peak_run = pd.DataFrame(index=range(self.numbercells), columns=( + 'speed_max_sp', 'speed_min_sp', 'ptest_sp', 'mod_sp', 'speed_max_vis', 'speed_min_vis', 'ptest_vis', 'mod_vis')) + + dx_sp = self.dxcm[spontaneous.start.iloc[-1]:spontaneous.end.iloc[-1]] + celltraces_sp = celltraces_trimmed[ + :, spontaneous.start.iloc[-1]:spontaneous.end.iloc[-1]] + dx_vis = np.delete(self.dxcm, np.arange( + spontaneous.start.iloc[-1], spontaneous.end.iloc[-1])) + celltraces_vis = np.delete(celltraces_trimmed, np.arange( + spontaneous.start.iloc[-1], spontaneous.end.iloc[-1]), axis=1) + if len(spontaneous) > 1: + dx_sp = np.append( + dx_sp, self.dxcm[spontaneous.start.iloc[-2]:spontaneous.end.iloc[-2]], axis=0) + celltraces_sp = np.append(celltraces_sp, celltraces_trimmed[ + :, spontaneous.start.iloc[-2]:spontaneous.end.iloc[-2]], axis=1) + dx_vis = np.delete(dx_vis, np.arange( + spontaneous.start.iloc[-2], spontaneous.end.iloc[-2])) + celltraces_vis = np.delete(celltraces_vis, np.arange( + spontaneous.start.iloc[-2], spontaneous.end.iloc[-2]), axis=1) + celltraces_vis = celltraces_vis[:, ~np.isnan(dx_vis)] + dx_vis = dx_vis[~np.isnan(dx_vis)] + + nbins = 1 + len(np.where(dx_sp >= 1)[0]) // binsize + dx_sorted = dx_sp[np.argsort(dx_sp)] + celltraces_sorted_sp = celltraces_sp[:, np.argsort(dx_sp)] + binned_cells_sp = np.zeros((self.numbercells, nbins, 2)) + binned_dx_sp = np.zeros((nbins, 2)) + for i in range(nbins): + if np.all(np.isnan(dx_sorted)): + raise BrainObservatoryAnalysisException( + "dx is filled with NaNs") + + offset = findlevel(dx_sorted, 1, 'up') + + if offset is None: + StimulusAnalysis._log.info( + "dx never crosses 1, all speed data going into single bin") + offset = len(dx_sorted) + + if i == 0: + binned_dx_sp[i, 0] = np.mean(dx_sorted[:offset]) + binned_dx_sp[i, 1] = np.std( + dx_sorted[:offset]) / np.sqrt(offset) + binned_cells_sp[:, i, 0] = np.mean( + celltraces_sorted_sp[:, :offset], axis=1) + binned_cells_sp[:, i, 1] = np.std( + celltraces_sorted_sp[:, :offset], axis=1) / np.sqrt(offset) + else: + start = offset + (i - 1) * binsize + binned_dx_sp[i, 0] = np.mean(dx_sorted[start:start + binsize]) + binned_dx_sp[i, 1] = np.std( + dx_sorted[start:start + binsize]) / np.sqrt(binsize) + binned_cells_sp[:, i, 0] = np.mean( + celltraces_sorted_sp[:, start:start + binsize], axis=1) + binned_cells_sp[:, i, 1] = np.std( + celltraces_sorted_sp[:, start:start + binsize], axis=1) / np.sqrt(binsize) + + binned_cells_shuffled_sp = np.empty((self.numbercells, nbins, 2, 200)) + for shuf in range(200): + celltraces_shuffled = celltraces_sp[ + :, np.random.permutation(np.size(celltraces_sp, 1))] + celltraces_shuffled_sorted = celltraces_shuffled[ + :, np.argsort(dx_sp)] + for i in range(nbins): + offset = findlevel(dx_sorted, 1, 'up') + + if offset is None: + StimulusAnalysis._log.info( + "dx never crosses 1, all speed data going into single bin") + offset = celltraces_shuffled_sorted.shape[1] + + if i == 0: + binned_cells_shuffled_sp[:, i, 0, shuf] = np.mean( + celltraces_shuffled_sorted[:, :offset], axis=1) + binned_cells_shuffled_sp[:, i, 1, shuf] = np.std( + celltraces_shuffled_sorted[:, :offset], axis=1) + else: + start = offset + (i - 1) * binsize + binned_cells_shuffled_sp[:, i, 0, shuf] = np.mean( + celltraces_shuffled_sorted[:, start:start + binsize], axis=1) + binned_cells_shuffled_sp[:, i, 1, shuf] = np.std( + celltraces_shuffled_sorted[:, start:start + binsize], axis=1) + + nbins = 1 + len(np.where(dx_vis >= 1)[0]) // binsize + dx_sorted = dx_vis[np.argsort(dx_vis)] + celltraces_sorted_vis = celltraces_vis[:, np.argsort(dx_vis)] + binned_cells_vis = np.zeros((self.numbercells, nbins, 2)) + binned_dx_vis = np.zeros((nbins, 2)) + for i in range(nbins): + offset = findlevel(dx_sorted, 1, 'up') + + if offset is None: + StimulusAnalysis._log.info( + "dx never crosses 1, all speed data going into single bin") + offset = len(dx_sorted) + + if i == 0: + binned_dx_vis[i, 0] = np.mean(dx_sorted[:offset]) + binned_dx_vis[i, 1] = np.std( + dx_sorted[:offset]) / np.sqrt(offset) + binned_cells_vis[:, i, 0] = np.mean( + celltraces_sorted_vis[:, :offset], axis=1) + binned_cells_vis[:, i, 1] = np.std( + celltraces_sorted_vis[:, :offset], axis=1) / np.sqrt(offset) + else: + start = offset + (i - 1) * binsize + binned_dx_vis[i, 0] = np.mean(dx_sorted[start:start + binsize]) + binned_dx_vis[i, 1] = np.std( + dx_sorted[start:start + binsize]) / np.sqrt(binsize) + binned_cells_vis[:, i, 0] = np.mean( + celltraces_sorted_vis[:, start:start + binsize], axis=1) + binned_cells_vis[:, i, 1] = np.std( + celltraces_sorted_vis[:, start:start + binsize], axis=1) / np.sqrt(binsize) + + binned_cells_shuffled_vis = np.empty((self.numbercells, nbins, 2, 200)) + for shuf in range(200): + celltraces_shuffled = celltraces_vis[ + :, np.random.permutation(np.size(celltraces_vis, 1))] + celltraces_shuffled_sorted = celltraces_shuffled[ + :, np.argsort(dx_vis)] + for i in range(nbins): + offset = findlevel(dx_sorted, 1, 'up') + + if offset is None: + StimulusAnalysis._log.info( + "dx never crosses 1, all speed data going into single bin") + offset = len(dx_sorted) + + if i == 0: + binned_cells_shuffled_vis[:, i, 0, shuf] = np.mean( + celltraces_shuffled_sorted[:, :offset], axis=1) + binned_cells_shuffled_vis[:, i, 1, shuf] = np.std( + celltraces_shuffled_sorted[:, :offset], axis=1) + else: + start = offset + (i - 1) * binsize + binned_cells_shuffled_vis[:, i, 0, shuf] = np.mean( + celltraces_shuffled_sorted[:, start:start + binsize], axis=1) + binned_cells_shuffled_vis[:, i, 1, shuf] = np.std( + celltraces_shuffled_sorted[:, start:start + binsize], axis=1) + + shuffled_variance_sp = binned_cells_shuffled_sp[ + :, :, 0, :].std(axis=1)**2 + variance_threshold_sp = np.percentile( + shuffled_variance_sp, 99.9, axis=1) + response_variance_sp = binned_cells_sp[:, :, 0].std(axis=1)**2 + + shuffled_variance_vis = binned_cells_shuffled_vis[ + :, :, 0, :].std(axis=1)**2 + variance_threshold_vis = np.percentile( + shuffled_variance_vis, 99.9, axis=1) + response_variance_vis = binned_cells_vis[:, :, 0].std(axis=1)**2 + + for nc in range(self.numbercells): + if response_variance_vis[nc] > variance_threshold_vis[nc]: + peak_run.mod_vis[nc] = True + if response_variance_vis[nc] <= variance_threshold_vis[nc]: + peak_run.mod_vis[nc] = False + if response_variance_sp[nc] > variance_threshold_sp[nc]: + peak_run.mod_sp[nc] = True + if response_variance_sp[nc] <= variance_threshold_sp[nc]: + peak_run.mod_sp[nc] = False + temp = binned_cells_sp[nc, :, 0] + start_max = temp.argmax() + peak_run.speed_max_sp[nc] = binned_dx_sp[start_max, 0] + start_min = temp.argmin() + peak_run.speed_min_sp[nc] = binned_dx_sp[start_min, 0] + if peak_run.speed_max_sp[nc] > peak_run.speed_min_sp[nc]: + test_values = celltraces_sorted_sp[ + nc, start_max * binsize:(start_max + 1) * binsize] + other_values = np.delete(celltraces_sorted_sp[nc, :], range( + start_max * binsize, (start_max + 1) * binsize)) + (_, peak_run.ptest_sp[nc]) = nonraising_ks_2samp( + test_values, other_values) + else: + test_values = celltraces_sorted_sp[ + nc, start_min * binsize:(start_min + 1) * binsize] + other_values = np.delete(celltraces_sorted_sp[nc, :], range( + start_min * binsize, (start_min + 1) * binsize)) + (_, peak_run.ptest_sp[nc]) = nonraising_ks_2samp( + test_values, other_values) + temp = binned_cells_vis[nc, :, 0] + start_max = temp.argmax() + peak_run.speed_max_vis[nc] = binned_dx_vis[start_max, 0] + start_min = temp.argmin() + peak_run.speed_min_vis[nc] = binned_dx_vis[start_min, 0] + if peak_run.speed_max_vis[nc] > peak_run.speed_min_vis[nc]: + test_values = celltraces_sorted_vis[ + nc, start_max * binsize:(start_max + 1) * binsize] + other_values = np.delete(celltraces_sorted_vis[nc, :], range( + start_max * binsize, (start_max + 1) * binsize)) + else: + test_values = celltraces_sorted_vis[ + nc, start_min * binsize:(start_min + 1) * binsize] + other_values = np.delete(celltraces_sorted_vis[nc, :], range( + start_min * binsize, (start_min + 1) * binsize)) + (_, peak_run.ptest_vis[nc]) = nonraising_ks_2samp( + test_values, other_values) + + return binned_dx_sp, binned_cells_sp, binned_dx_vis, binned_cells_vis, peak_run + + def get_sweep_response(self): + """ Calculates the response to each sweep in the stimulus table for each cell and the mean response. + The return is a 3-tuple of: + + * sweep_response: pd.DataFrame of response dF/F traces organized by cell (column) and sweep (row) + + * mean_sweep_response: mean values of the traces returned in sweep_response + + * pval: p value from 1-way ANOVA comparing response during sweep to response prior to sweep + + Returns + ------- + 3-tuple: sweep_response, mean_sweep_response, pval + """ + def do_mean(x): + # +1]) + return np.mean(x[self.interlength:self.interlength + self.sweeplength + self.extralength]) + + def do_p_value(x): + (_, p) = st.f_oneway(x[:self.interlength], x[ + self.interlength:self.interlength + self.sweeplength + self.extralength]) + return p + + StimulusAnalysis._log.info('Calculating responses for each sweep') + sweep_response = pd.DataFrame(index=self.stim_table.index.values, + columns=list(map(str, range(self.numbercells + 1)))) + + sweep_response.rename( + columns={str(self.numbercells): 'dx'}, inplace=True) + + for index, row in self.stim_table.iterrows(): + start = int(row['start'] - self.interlength) + end = int(row['start'] + self.sweeplength + self.interlength) + + for nc in range(self.numbercells): + temp = self.celltraces[int(nc), start:end] + sweep_response[str(nc)][index] = 100 * \ + ((temp / np.mean(temp[:self.interlength])) - 1) + sweep_response['dx'][index] = self.dxcm[start:end] + + mean_sweep_response = sweep_response.applymap(do_mean) + + pval = sweep_response.applymap(do_p_value) + return sweep_response, mean_sweep_response, pval + + def plot_representational_similarity(self, repsim, stimulus=False): + if stimulus: + pass + + ax = plt.gca() + ax.imshow(repsim, interpolation='nearest', cmap='plasma') + + def plot_running_speed_histogram(self, xlim=None, nbins=None): + if xlim is None: + xlim = [-10,100] + if nbins is None: + nbins = 40 + + ax = plt.gca() + ax.hist(self.dxcm, bins=nbins, range=xlim, color=oplots.STIM_COLOR) + ax.set_xlim(xlim) + plt.xlabel("running speed (cm/s)") + plt.ylabel("time points") + + def plot_speed_tuning(self, cell_specimen_id=None, + cell_index=None, + evoked_color=oplots.EVOKED_COLOR, + spontaneous_color=oplots.SPONTANEOUS_COLOR): + cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) + + oplots.plot_combined_speed(self.binned_cells_vis[cell_index,:,:]*100, self.binned_dx_vis[:,:], + self.binned_cells_sp[cell_index,:,:]*100, self.binned_dx_sp[:,:], + evoked_color, spontaneous_color) + + ax = plt.gca() + plt.xlabel("running speed (cm/s)") + plt.ylabel("percent dF/F") + + def row_from_cell_id(self, csid=None, idx=None): + + if csid is not None and not np.isnan(csid): + return self.data_set.get_cell_specimen_ids().tolist().index(csid) + elif idx is not None: + return idx + else: + raise Exception("Could not find row for csid(%s) idx(%s)" % (str(csid), str(idx))) + + +def nonraising_ks_2samp(data1, data2, **kwargs): + """ scipy.stats.ks_2samp now raises a ValueError if one of the input arrays + is of length 0. Previously it signaled this case by returning nans. This + function restores the prior behavior. + """ + + if min(len(data1), len(data2)) == 0: + return (np.nan, np.nan) + return st.ks_2samp(data1, data2, **kwargs) \ No newline at end of file diff --git a/brain_observatory/stimulus_info.py b/brain_observatory/stimulus_info.py new file mode 100644 index 0000000000..595510c56f --- /dev/null +++ b/brain_observatory/stimulus_info.py @@ -0,0 +1,873 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import six +import numpy as np +import scipy.ndimage.interpolation as spndi +from PIL import Image +from allensdk.api.warehouse_cache.cache import memoize +import itertools + +# some handles for stimulus types +DRIFTING_GRATINGS = 'drifting_gratings' +DRIFTING_GRATINGS_SHORT = 'dg' +DRIFTING_GRATINGS_COLOR = '#a6cee3' + +STATIC_GRATINGS = 'static_gratings' +STATIC_GRATINGS_SHORT = 'sg' +STATIC_GRATINGS_COLOR = '#1f78b4' + +NATURAL_MOVIE_ONE = 'natural_movie_one' +NATURAL_MOVIE_ONE_SHORT = 'nm1' +NATURAL_MOVIE_ONE_COLOR = '#b2df8a' + +NATURAL_MOVIE_TWO = 'natural_movie_two' +NATURAL_MOVIE_TWO_SHORT = 'nm2' +NATURAL_MOVIE_TWO_COLOR = '#33a02c' + +NATURAL_MOVIE_THREE = 'natural_movie_three' +NATURAL_MOVIE_THREE_SHORT = 'nm3' +NATURAL_MOVIE_THREE_COLOR = '#fb9a99' + +NATURAL_SCENES = 'natural_scenes' +NATURAL_SCENES_SHORT = 'ns' +NATURAL_SCENES_COLOR = '#e31a1c' + +# note that this stimulus is equivalent to LOCALLY_SPARSE_NOISE_4DEG in session C2 files +LOCALLY_SPARSE_NOISE = 'locally_sparse_noise' +LOCALLY_SPARSE_NOISE_SHORT = 'lsn' +LOCALLY_SPARSE_NOISE_COLOR = '#fdbf6f' + +LOCALLY_SPARSE_NOISE_4DEG = 'locally_sparse_noise_4deg' +LOCALLY_SPARSE_NOISE_4DEG_SHORT = 'lsn4' +LOCALLY_SPARSE_NOISE_4DEG_COLOR = '#fdbf6f' + +LOCALLY_SPARSE_NOISE_8DEG = 'locally_sparse_noise_8deg' +LOCALLY_SPARSE_NOISE_8DEG_SHORT = 'lsn8' +LOCALLY_SPARSE_NOISE_8DEG_COLOR = '#ff7f00' + +SPONTANEOUS_ACTIVITY = 'spontaneous' +SPONTANEOUS_ACTIVITY_SHORT = 'sp' +SPONTANEOUS_ACTIVITY_COLOR = '#cab2d6' + +# handles for stimulus names +THREE_SESSION_A = 'three_session_A' +THREE_SESSION_B = 'three_session_B' +THREE_SESSION_C = 'three_session_C' +THREE_SESSION_C2 = 'three_session_C2' + +SESSION_LIST = [THREE_SESSION_A, THREE_SESSION_B, THREE_SESSION_C, THREE_SESSION_C2] + +SESSION_STIMULUS_MAP = { + THREE_SESSION_A: [DRIFTING_GRATINGS, NATURAL_MOVIE_ONE, NATURAL_MOVIE_THREE, SPONTANEOUS_ACTIVITY], + THREE_SESSION_B: [STATIC_GRATINGS, NATURAL_SCENES, NATURAL_MOVIE_ONE, SPONTANEOUS_ACTIVITY], + THREE_SESSION_C: [LOCALLY_SPARSE_NOISE, NATURAL_MOVIE_ONE, NATURAL_MOVIE_TWO, SPONTANEOUS_ACTIVITY], + THREE_SESSION_C2: [LOCALLY_SPARSE_NOISE_4DEG, LOCALLY_SPARSE_NOISE_8DEG, NATURAL_MOVIE_ONE, NATURAL_MOVIE_TWO, SPONTANEOUS_ACTIVITY] +} + +LOCALLY_SPARSE_NOISE_STIMULUS_TYPES = [LOCALLY_SPARSE_NOISE, LOCALLY_SPARSE_NOISE_4DEG, LOCALLY_SPARSE_NOISE_8DEG] +NATURAL_MOVIE_STIMULUS_TYPES = [NATURAL_MOVIE_ONE, NATURAL_MOVIE_TWO, NATURAL_MOVIE_THREE] + +LOCALLY_SPARSE_NOISE_DIMENSIONS = { + LOCALLY_SPARSE_NOISE: [ 16, 28 ], + LOCALLY_SPARSE_NOISE_4DEG: [ 16, 28 ], + LOCALLY_SPARSE_NOISE_8DEG: [ 8, 14 ], + } + +LOCALLY_SPARSE_NOISE_PIXELS = { + LOCALLY_SPARSE_NOISE: 45, + LOCALLY_SPARSE_NOISE_4DEG: 45, + LOCALLY_SPARSE_NOISE_8DEG: 90, + } + +NATURAL_SCENES_PIXELS = (918, 1174) +NATURAL_MOVIE_PIXELS = (1080, 1920) +NATURAL_MOVIE_DIMENSIONS = (304, 608) + +MONITOR_DIMENSIONS = (1200, 1920) +MONITOR_DISTANCE = 15 + +STIMULUS_GRAY = 127 +STIMULUS_BITDEPTH = 8 + +# Note: the "8deg" stimulus is actually 9.3 visual degrees on a side +LOCALLY_SPARSE_NOISE_PIXEL_SIZE = { + LOCALLY_SPARSE_NOISE: 4.65, + LOCALLY_SPARSE_NOISE_4DEG: 4.65, + LOCALLY_SPARSE_NOISE_8DEG: 9.3 +} + +RADIANS_TO_DEGREES = 57.2958 + +def sessions_with_stimulus(stimulus): + """ Return the names of the sessions that contain a given stimulus. """ + + sessions = set() + for session, session_stimuli in six.iteritems(SESSION_STIMULUS_MAP): + if stimulus in session_stimuli: + sessions.add(session) + + return sorted(list(sessions)) + + +def stimuli_in_session(session, allow_unknown=True): + """ Return a list what stimuli are available in a given session. + + Parameters + ---------- + session: string + Must be one of: [stimulus_info.THREE_SESSION_A, stimulus_info.THREE_SESSION_B, stimulus_info.THREE_SESSION_C, stimulus_info.THREE_SESSION_C2] + """ + try: + return SESSION_STIMULUS_MAP[session] + except KeyError as e: + if allow_unknown: + return [] + else: + raise + + +def all_stimuli(): + """ Return a list of all stimuli in the data set """ + return set([v for k, vl in six.iteritems(SESSION_STIMULUS_MAP) for v in vl]) + +class BinaryIntervalSearchTree(object): + + @staticmethod + def from_df(input_df): + search_list = input_df.to_dict('records') + + + + new_list = [] + for x in search_list: + if x['start'] == x['end']: + new_list.append((x['start'], x['end'], x)) + else: + # -.01 prevents endpoint-overlapping intervals; assigns ties to intervals that start at requested index + new_list.append((x['start'], x['end'] - .01, x)) + return BinaryIntervalSearchTree(new_list) + + + def __init__(self, search_list): + """Create a binary tree to search for a point within a list of intervals. Assumes that the intervals are + non-overlapping. If two intervals share an endpoint, the left-side wins the tie. + + :param search_list: list of interval tuples; in the tuple, first element is interval start, then interval + end (inclusive), then the return value for the lookup + + Example: + bist = BinaryIntervalSearchTree([(0,.5,'A'), (1,2,'B')]) + print(bist.search(1.5)) + """ + + # Double-check that the list is sorted + search_list = sorted(search_list, key=lambda x:x[0]) + + # Check that the intervals are non-overlapping (except potentially at the end point) + for x, y in zip(search_list[:-1], search_list[1:]): + assert x[1] <= y[0] + + + self.data = {} + self.add(search_list) + + def add(self, input_list, tmp=None): + if tmp is None: + tmp = [] + + if len(input_list) == 1: + self.data[tuple(tmp)] = input_list[0] + else: + self.add(input_list[:int(len(input_list)/2)], tmp=tmp+[0]) + self.add(input_list[int(len(input_list)/2):], tmp=tmp+[1]) + self.data[tuple(tmp)] = input_list[int(len(input_list)/2)-1] + + def search(self, fi, tmp=None): + if tmp is None: + tmp = [] + + if (self.data[tuple(tmp)][0] <= fi) and (fi <= self.data[tuple(tmp)][1]): + return_val = self.data[tuple(tmp)] + elif fi < self.data[tuple(tmp)][1]: + return_val = self.search(fi, tmp=tmp + [0]) + else: + return_val = self.search(fi, tmp=tmp + [1]) + + assert (return_val[0] <= fi) and (fi <= return_val[1]) + return return_val + +class StimulusSearch(object): + + def __init__(self, nwb_dataset): + + self.nwb_data = nwb_dataset + self.epoch_df = nwb_dataset.get_stimulus_epoch_table() + self.master_df = nwb_dataset.get_stimulus_table('master') + self.epoch_bst = BinaryIntervalSearchTree.from_df(self.epoch_df) + self.master_bst = BinaryIntervalSearchTree.from_df(self.master_df) + + @memoize + def search(self, fi): + + try: + + # Look in fine-grain tree: + search_result = self.master_bst.search(fi) + return search_result + except KeyError: + + # Current frame not found in a fine-grain interval; + # see if it is unregistered to a coarse-grain epoch: + try: + + # THis will thow KeyError if not in coarse-grain epoch + self.epoch_bst.search(fi) + + # Frame is in a coarse-grain epoch, but not a fine grain interval; + # look backwards to find most recent find nearest matching interval + if fi < self.epoch_df.iloc[0]['start']: + return None + else: + return self.search(fi-1) + + except KeyError: + + # Frame is unregistered at the coarse level; return None + return None + +def rotate(X, Y, theta): + x = np.array([X, Y]) + M = np.array([[np.cos(theta),-np.sin(theta)],[np.sin(theta), np.cos(theta)]]) + if len(x.shape) in [1,2]: + assert x.shape[0] == 2 + return M.dot(x) + elif len(x.shape) == 3: + M2 = M[:, :, np.newaxis, np.newaxis] + x2 = x[np.newaxis, :, :] + return (M2*x2).sum(axis=1) + else: + raise NotImplementedError + +def get_spatial_grating(height=None, aspect_ratio=None, ori=None, pix_per_cycle=None, phase=None, p2p_amp=2, baseline=0): + + aspect_ratio = float(aspect_ratio) + _height_prime = 100 + + sf = 1./(float(pix_per_cycle)/(height/float(_height_prime))) + + # Final height set by zoom below: + y, x = (_height_prime,_height_prime*aspect_ratio) + + theta = ori * np.pi / 180.0 # convert to radians + + ph = phase * np.pi * 2.0 + + X, Y = np.meshgrid(np.arange(x), np.arange(y)) + X = X - x / 2 + Y = Y - y / 2 + Xp, Yp = rotate(X, Y, theta) + + img = np.cos(2.0 * np.pi * Xp * sf + ph) + + return (p2p_amp/2.)*spndi.zoom(img, height/float(_height_prime)) + baseline + + +# def grating_to_screen(self, phase, spatial_frequency, orientation, **kwargs): + +def get_spatio_temporal_grating(t, temporal_frequency=None, **kwargs): + + kwargs['phase'] = kwargs.pop('phase', 0) + (float(t)*temporal_frequency)%1 + + return get_spatial_grating(**kwargs) + +def map_template_coordinate_to_monitor_coordinate(template_coord, monitor_shape, template_shape): + + rx, cx = template_coord + n_pixels_r, n_pixels_c = monitor_shape + tr, tc = template_shape + + rx_new = float((n_pixels_r - tr) / 2) + rx + cx_new = float((n_pixels_c - tc) / 2) + cx + + return rx_new, cx_new + +def map_monitor_coordinate_to_template_coordinate(monitor_coord, monitor_shape, template_shape): + + rx, cx = monitor_coord + n_pixels_r, n_pixels_c = monitor_shape + tr, tc = template_shape + + rx_new = rx - float((n_pixels_r - tr) / 2) + cx_new = cx - float((n_pixels_c - tc) / 2) + + return rx_new, cx_new + +def lsn_coordinate_to_monitor_coordinate(lsn_coordinate, monitor_shape, stimulus_type): + + template_shape = LOCALLY_SPARSE_NOISE_DIMENSIONS[stimulus_type] + pixels_per_patch = LOCALLY_SPARSE_NOISE_PIXELS[stimulus_type] + + rx, cx = lsn_coordinate + tr, tc = template_shape + + return map_template_coordinate_to_monitor_coordinate((rx*pixels_per_patch, cx*pixels_per_patch), + monitor_shape, + (tr*pixels_per_patch, tc*pixels_per_patch)) + +def monitor_coordinate_to_lsn_coordinate(monitor_coordinate, monitor_shape, stimulus_type): + + pixels_per_patch = LOCALLY_SPARSE_NOISE_PIXELS[stimulus_type] + tr, tc = LOCALLY_SPARSE_NOISE_DIMENSIONS[stimulus_type] + + rx, cx = map_monitor_coordinate_to_template_coordinate(monitor_coordinate, monitor_shape, (tr*pixels_per_patch, tc*pixels_per_patch)) + + return (rx/pixels_per_patch, cx/pixels_per_patch) + +def natural_scene_coordinate_to_monitor_coordinate(natural_scene_coordinate, monitor_shape): + + return map_template_coordinate_to_monitor_coordinate(natural_scene_coordinate, monitor_shape, NATURAL_SCENES_PIXELS) + +def natural_movie_coordinate_to_monitor_coordinate(natural_movie_coordinate, monitor_shape): + + local_y = 1.*NATURAL_MOVIE_PIXELS[0]*natural_movie_coordinate[0]/NATURAL_MOVIE_DIMENSIONS[0] + local_x = 1. * NATURAL_MOVIE_PIXELS[1] * natural_movie_coordinate[1] / NATURAL_MOVIE_DIMENSIONS[1] + + return map_template_coordinate_to_monitor_coordinate((local_y, local_x), monitor_shape, NATURAL_MOVIE_PIXELS) + +def map_stimulus_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape, stimulus_type): + + if stimulus_type in LOCALLY_SPARSE_NOISE_STIMULUS_TYPES: + return lsn_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape, stimulus_type) + elif stimulus_type in NATURAL_MOVIE_STIMULUS_TYPES: + return natural_movie_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape) + elif stimulus_type == NATURAL_SCENES: + return natural_scene_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape) + elif stimulus_type in [DRIFTING_GRATINGS, STATIC_GRATINGS, SPONTANEOUS_ACTIVITY]: + return template_coordinate + else: + raise NotImplementedError # pragma: no cover + +def monitor_coordinate_to_natural_movie_coordinate(monitor_coordinate, monitor_shape): + + local_y, local_x = map_monitor_coordinate_to_template_coordinate(monitor_coordinate, monitor_shape, NATURAL_MOVIE_PIXELS) + + return float(NATURAL_MOVIE_DIMENSIONS[0])*local_y/NATURAL_MOVIE_PIXELS[0], float(NATURAL_MOVIE_DIMENSIONS[1])*local_x/NATURAL_MOVIE_PIXELS[1] + +def map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, monitor_shape, stimulus_type): + + if stimulus_type in LOCALLY_SPARSE_NOISE_STIMULUS_TYPES: + return monitor_coordinate_to_lsn_coordinate(monitor_coordinate, monitor_shape, stimulus_type) + elif stimulus_type == NATURAL_SCENES: + return map_monitor_coordinate_to_template_coordinate(monitor_coordinate, monitor_shape, NATURAL_SCENES_PIXELS) + elif stimulus_type in NATURAL_MOVIE_STIMULUS_TYPES: + return monitor_coordinate_to_natural_movie_coordinate(monitor_coordinate, monitor_shape) + elif stimulus_type in [DRIFTING_GRATINGS, STATIC_GRATINGS, SPONTANEOUS_ACTIVITY]: + return monitor_coordinate + else: + raise NotImplementedError # pragma: no cover + +def map_stimulus(source_stimulus_coordinate, source_stimulus_type, target_stimulus_type, monitor_shape): + mc = map_stimulus_coordinate_to_monitor_coordinate(source_stimulus_coordinate, monitor_shape, source_stimulus_type) + return map_monitor_coordinate_to_stimulus_coordinate(mc, monitor_shape, target_stimulus_type) + +def translate_image_and_fill(img, translation=(0,0)): + # first coordinate is horizontal, second is vertical + + roll = (int(translation[0]), -int(translation[1])) + + im2 = np.roll(img, roll, (1,0)) + + if roll[1] >= 0: + im2[:roll[1],:] = STIMULUS_GRAY + else: + im2[roll[1]:,:] = STIMULUS_GRAY + + if roll[0] >= 0: + im2[:,:roll[0]] = STIMULUS_GRAY + else: + im2[:,roll[0]:] = STIMULUS_GRAY + + return im2 + +class Monitor(object): + + def __init__(self, n_pixels_r, n_pixels_c, panel_size, spatial_unit): + + self.spatial_unit = spatial_unit + if spatial_unit == 'cm': + self.spatial_conversion_factor = 1. + else: + raise NotImplementedError # pragma: no cover + + self._panel_size = panel_size + self.n_pixels_r = n_pixels_r + self.n_pixels_c = n_pixels_c + self._mask = None + + @property + def mask(self): + if self._mask is None: + self._mask = self.get_mask() + return self._mask + + @property + def panel_size(self): + return self._panel_size*self.spatial_conversion_factor + + @property + def aspect_ratio(self): + return float(self.n_pixels_c)/self.n_pixels_r + + @property + def height(self): + return self.spatial_conversion_factor*np.sqrt(self.panel_size**2/(1+self.aspect_ratio**2)) + + @property + def width(self): + return self.height*self.aspect_ratio + + def set_spatial_unit(self, new_unit): + if new_unit == self.spatial_unit: + pass + elif new_unit == 'inch' and self.spatial_unit == 'cm': + self.spatial_conversion_factor *= .393701 + elif new_unit == 'cm' and self.spatial_unit == 'inch': + self.spatial_conversion_factor *= 1./.393701 + else: + raise NotImplementedError # pragma: no cover + self.spatial_unit = new_unit + + @property + def pixel_size(self): + return float(self.width)/self.n_pixels_c + + def pixels_to_visual_degrees(self, n, distance_from_monitor, small_angle_approximation=True): + + + if small_angle_approximation == True: + return n*self.pixel_size/distance_from_monitor*RADIANS_TO_DEGREES # radians to degrees + else: + return 2*np.arctan(n*1./2*self.pixel_size / distance_from_monitor) * RADIANS_TO_DEGREES # radians to degrees + + def visual_degrees_to_pixels(self, vd, distance_from_monitor, small_angle_approximation=True): + + if small_angle_approximation == True: + return vd*(distance_from_monitor/self.pixel_size/RADIANS_TO_DEGREES) + else: + raise NotImplementedError + + + def lsn_image_to_screen(self, img, stimulus_type, origin='lower', background_color=STIMULUS_GRAY, translation=(0,0)): + + # assert img.dtype == np.uint8 + + + full_image = np.full((self.n_pixels_r, self.n_pixels_c), background_color, dtype=np.uint8) + + pixels_per_patch = float(LOCALLY_SPARSE_NOISE_PIXELS[stimulus_type]) + target_size = tuple( int(pixels_per_patch * dimsize) for dimsize in img.shape[::-1] ) + img_full_res = np.array(Image.fromarray(img).resize(target_size, 0)) # 0 -> nearest neighbor interpolator + + mr, mc = lsn_coordinate_to_monitor_coordinate((0, 0), (self.n_pixels_r, self.n_pixels_c), stimulus_type) + Mr, Mc = lsn_coordinate_to_monitor_coordinate(img.shape, (self.n_pixels_r, self.n_pixels_c), stimulus_type) + full_image[int(mr):int(Mr), int(mc):int(Mc)] = img_full_res + + full_image = translate_image_and_fill(full_image, translation=translation) + + if origin == 'lower': + return full_image + elif origin == 'upper': + return np.flipud(full_image) + else: + raise Exception + + return full_image + + def natural_scene_image_to_screen(self, img, origin='lower', translation=(0,0)): + + # assert img.dtype == np.float32 + # img = img.astype(np.uint8) + + full_image = np.full((self.n_pixels_r, self.n_pixels_c), 127, dtype=np.uint8) + mr, mc = natural_scene_coordinate_to_monitor_coordinate((0, 0), (self.n_pixels_r, self.n_pixels_c)) + Mr, Mc = natural_scene_coordinate_to_monitor_coordinate((img.shape[0], img.shape[1]), (self.n_pixels_r, self.n_pixels_c)) + full_image[int(mr):int(Mr), int(mc):int(Mc)] = img + + full_image = translate_image_and_fill(full_image, translation=translation) + + + if origin == 'lower': + return np.flipud(full_image) + elif origin == 'upper': + return full_image + else: + raise Exception + + def natural_movie_image_to_screen(self, img, origin='lower', translation=(0,0)): + + img = np.array(Image.fromarray(img).resize(NATURAL_MOVIE_PIXELS[::-1], 2)).astype(np.uint8) # 2 -> bilinear interpolator + + assert img.dtype == np.uint8 + + full_image = np.full((self.n_pixels_r, self.n_pixels_c), 127, dtype=np.uint8) + mr, mc = map_template_coordinate_to_monitor_coordinate((0, 0), (self.n_pixels_r, self.n_pixels_c), NATURAL_MOVIE_PIXELS) + Mr, Mc = map_template_coordinate_to_monitor_coordinate((img.shape[0], img.shape[1]), (self.n_pixels_r, self.n_pixels_c), NATURAL_MOVIE_PIXELS) + + full_image[int(mr):int(Mr), int(mc):int(Mc)] = img + + full_image = translate_image_and_fill(full_image, translation=translation) + + if origin == 'lower': + return np.flipud(full_image) + elif origin == 'upper': + return full_image + else: + raise Exception + + def spatial_frequency_to_pix_per_cycle(self, spatial_frequency, distance_from_monitor): + + # How many cycles do I want to see post warp: + number_of_cycles = spatial_frequency*2*np.degrees(np.arctan(self.width/2./distance_from_monitor)) + + # How many pixels to I have pre-warp to place my cycles on: + _, m_col = np.where(self.mask != 0) + number_of_pixels = (m_col.max() - m_col.min()) + + return float(number_of_pixels)/number_of_cycles + + + def grating_to_screen(self, phase, spatial_frequency, orientation, distance_from_monitor, p2p_amp=256, baseline=127, translation=(0,0)): + + pix_per_cycle = self.spatial_frequency_to_pix_per_cycle(spatial_frequency, distance_from_monitor) + + full_image = get_spatial_grating(height=self.n_pixels_r, + aspect_ratio=self.aspect_ratio, + ori=orientation, + pix_per_cycle=pix_per_cycle, + phase=phase, + p2p_amp=p2p_amp, + baseline=baseline) + + full_image = translate_image_and_fill(full_image, translation=translation) + + return full_image + + def get_mask(self): + + mask = make_display_mask(display_shape=(self.n_pixels_c, self.n_pixels_r)).T + assert mask.shape[0] == self.n_pixels_r + assert mask.shape[1] == self.n_pixels_c + + return mask + + def show_image(self, img, ax=None, show=True, mask=False, warp=False, origin='lower'): + import matplotlib.pyplot as plt + assert img.shape == (self.n_pixels_r, self.n_pixels_c) or img.shape == (self.n_pixels_r, self.n_pixels_c, 4) + + if ax is None: + fig, ax = plt.subplots(1, 1) + + if warp == True: + img = self.warp_image(img) + + if warp == True: + assert mask == False + + ax.imshow(img, origin=origin, cmap=plt.cm.gray, interpolation='none') + + if mask == True: + mask = make_display_mask(display_shape=(self.n_pixels_c, self.n_pixels_r)).T + alpha_mask = np.zeros((mask.shape[0], mask.shape[1], 4)) + alpha_mask[:, :, 2] = 1 - mask + alpha_mask[:, :, 3] = .4 + ax.imshow(alpha_mask, origin=origin, interpolation='none') + + ax.axes.get_xaxis().set_visible(False) + ax.axes.get_yaxis().set_visible(False) + + if origin == 'upper': + ax.set_ylim((img.shape[0], 0)) + elif origin == 'lower': + ax.set_ylim((0, img.shape[0])) + else: + raise Exception + ax.set_xlim((0, img.shape[1])) + + if show == True: + plt.show() + + def map_stimulus(self, source_stimulus_coordinate, source_stimulus_type, target_stimulus_type): + monitor_shape = (self.n_pixels_r, self.n_pixels_c) + return map_stimulus(source_stimulus_coordinate, source_stimulus_type, target_stimulus_type, monitor_shape) + +class ExperimentGeometry(object): + + def __init__(self, distance, mon_height_cm, mon_width_cm, mon_res, eyepoint): + + self.distance = distance + self.mon_height_cm = mon_height_cm + self.mon_width_cm = mon_width_cm + self.mon_res = mon_res + self.eyepoint = eyepoint + + self._warp_coordinates = None + + @property + def warp_coordinates(self): + if self._warp_coordinates is None: + self._warp_coordinates = self.generate_warp_coordinates() + + return self._warp_coordinates + + def generate_warp_coordinates(self): + + display_shape=self.mon_res + x = np.array(range(display_shape[0])) - display_shape[0] / 2 + y = np.array(range(display_shape[1])) - display_shape[1] / 2 + display_coords = np.array(list(itertools.product(y, x))) + + warp_coorinates = warp_stimulus_coords(display_coords, + distance=self.distance, + mon_height_cm=self.mon_height_cm, + mon_width_cm=self.mon_width_cm, + mon_res=self.mon_res, + eyepoint=self.eyepoint) + + warp_coorinates[:, 0] += display_shape[1] / 2 + warp_coorinates[:, 1] += display_shape[0] / 2 + + return warp_coorinates + +class BrainObservatoryMonitor(Monitor): + ''' + http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf + https://www.cnet.com/products/asus-pa248q/specs/ + ''' + + def __init__(self, experiment_geometry=None): + + height, width = MONITOR_DIMENSIONS + + super(BrainObservatoryMonitor, self).__init__(height, width, 61.214, 'cm') + + if experiment_geometry is None: + self.experiment_geometry = ExperimentGeometry(distance=float(MONITOR_DISTANCE), mon_height_cm=self.height, mon_width_cm=self.width, mon_res=(self.n_pixels_c, self.n_pixels_r), eyepoint=(0.5, 0.5)) + else: + self.experiment_geometry = experiment_geometry + + def lsn_image_to_screen(self, img, **kwargs): + + if img.shape == tuple(LOCALLY_SPARSE_NOISE_DIMENSIONS[LOCALLY_SPARSE_NOISE]): + return super(BrainObservatoryMonitor, self).lsn_image_to_screen(img, LOCALLY_SPARSE_NOISE, **kwargs) + elif img.shape == tuple(LOCALLY_SPARSE_NOISE_DIMENSIONS[LOCALLY_SPARSE_NOISE_4DEG]): + return super(BrainObservatoryMonitor, self).lsn_image_to_screen(img, LOCALLY_SPARSE_NOISE_4DEG, **kwargs) + elif img.shape == tuple(LOCALLY_SPARSE_NOISE_DIMENSIONS[LOCALLY_SPARSE_NOISE_8DEG]): + return super(BrainObservatoryMonitor, self).lsn_image_to_screen(img, LOCALLY_SPARSE_NOISE_8DEG, **kwargs) + else: # pragma: no cover + raise RuntimeError # pragma: no cover + + def warp_image(self, img, **kwargs): + + assert img.shape == (self.n_pixels_r, self.n_pixels_c) + assert self.spatial_unit == 'cm' + + return spndi.map_coordinates(img, self.experiment_geometry.warp_coordinates.T).reshape((self.n_pixels_r, self.n_pixels_c)) + + def grating_to_screen(self, phase, spatial_frequency, orientation, **kwargs): + + return super(BrainObservatoryMonitor, self).grating_to_screen(phase, spatial_frequency, orientation, + self.experiment_geometry.distance, + p2p_amp = 256, baseline = 127, **kwargs) + + def pixels_to_visual_degrees(self, n, **kwargs): + + return super(BrainObservatoryMonitor, self).pixels_to_visual_degrees(n, self.experiment_geometry.distance, **kwargs) + + def visual_degrees_to_pixels(self, vd, **kwargs): + + return super(BrainObservatoryMonitor, self).visual_degrees_to_pixels(vd, self.experiment_geometry.distance, **kwargs) + +def warp_stimulus_coords(vertices, + distance=15.0, + mon_height_cm=32.5, + mon_width_cm=51.0, + mon_res=(1920, 1200), + eyepoint=(0.5, 0.5)): + ''' + For a list of screen vertices, provides a corresponding list of texture coordinates. + + Parameters + ---------- + vertices: numpy.ndarray + [[x0,y0], [x1,y1], ...] A set of vertices to convert to texture positions. + distance: float + distance from the monitor in cm. + mon_height_cm: float + monitor height in cm + mon_width_cm: float + monitor width in cm + mon_res: tuple + monitor resolution (x,y) + eyepoint: tuple + + Returns + ------- + np.ndarray + x,y coordinates shaped like the input that describe what pixel coordinates + are displayed an the input coordinates after warping the stimulus. + + ''' + + mon_width_cm = float(mon_width_cm) + mon_height_cm = float(mon_height_cm) + distance = float(distance) + mon_res_x, mon_res_y = float(mon_res[0]), float(mon_res[1]) + + vertices = vertices.astype(np.float) + + # from pixels (-1920/2 -> 1920/2) to stimulus space (-0.5->0.5) + vertices[:, 0] = vertices[:, 0] / mon_res_x + vertices[:, 1] = vertices[:, 1] / mon_res_y + + x = (vertices[:, 0] + 0.5) * mon_width_cm + y = (vertices[:, 1] + 0.5) * mon_height_cm + + xEye = eyepoint[0] * mon_width_cm + yEye = eyepoint[1] * mon_height_cm + + x = x - xEye + y = y - yEye + + r = np.sqrt(np.square(x) + np.square(y) + np.square(distance)) + + azimuth = np.arctan(x / distance) + altitude = np.arcsin(y / r) + + # calculate the texture coordinates + tx = distance * (1 + x / r) - distance + ty = distance * (1 + y / r) - distance + + # prevent div0 + azimuth[azimuth == 0] = np.finfo(np.float32).eps + altitude[altitude == 0] = np.finfo(np.float32).eps + + # the texture coordinates (which are now lying on the sphere) + # need to be remapped back onto the plane of the display. + # This effectively stretches the coordinates away from the eyepoint. + + centralAngle = np.arccos(np.cos(altitude) * np.cos(np.abs(azimuth))) + # distance from eyepoint to texture vertex + arcLength = centralAngle * distance + # remap the texture coordinate + theta = np.arctan2(ty, tx) + tx = arcLength * np.cos(theta) + ty = arcLength * np.sin(theta) + + u_coords = tx / mon_width_cm + v_coords = ty / mon_height_cm + + retCoords = np.column_stack((u_coords, v_coords)) + + # back to pixels + retCoords[:, 0] = retCoords[:, 0] * mon_res_x + retCoords[:, 1] = retCoords[:, 1] * mon_res_y + + return retCoords + + +def make_display_mask(display_shape=(1920, 1200)): + ''' Build a display-shaped mask that indicates which pixels are on screen after warping the stimulus. ''' + x = np.array(range(display_shape[0])) - display_shape[0] / 2 + y = np.array(range(display_shape[1])) - display_shape[1] / 2 + display_coords = np.array(list(itertools.product(x, y))) + + warped_coords = warp_stimulus_coords(display_coords).astype(int) + + off_warped_coords = np.array([warped_coords[:, 0] + display_shape[0] / 2, + warped_coords[:, 1] + display_shape[1] / 2]) + + used_coords = set() + for i in range(off_warped_coords.shape[1]): + used_coords.add((off_warped_coords[0, i], off_warped_coords[1, i])) + + used_coords = (np.array([x for (x, y) in used_coords]).astype(int), + np.array([y for (x, y) in used_coords]).astype(int)) + + mask = np.zeros(display_shape) + + mask[used_coords] = 1 + + return mask + + +def mask_stimulus_template(template_display_coords, template_shape, display_mask=None, threshold=1.0): + ''' Build a mask for a stimulus template of a given shape and display coordinates that indicates + which part of the template is on screen after warping. + + Parameters + ---------- + template_display_coords: list + list of (x,y) display coordinates + + template_shape: tuple + (width,height) of the display template + + display_mask: np.ndarray + boolean 2D mask indicating which display coordinates are on screen after warping. + + threshold: float + Fraction of pixels associated with a template display coordinate that should remain + on screen to count as belonging to the mask. + + Returns + ------- + tuple: (template mask, pixel fraction) + ''' + if display_mask is None: + display_mask = make_display_mask() + + frac = np.zeros(template_shape) + mask = np.zeros(template_shape, dtype=bool) + for y in range(template_shape[1]): + for x in range(template_shape[0]): + tdcm = np.where((template_display_coords[0, :, :] == x) & ( + template_display_coords[1, :, :] == y)) + v = display_mask[tdcm] + f = np.sum(v) / len(v) + frac[x, y] = f + mask[x, y] = f >= threshold + + return mask, frac diff --git a/brain_observatory/sync_dataset.py b/brain_observatory/sync_dataset.py new file mode 100644 index 0000000000..24b6faaab3 --- /dev/null +++ b/brain_observatory/sync_dataset.py @@ -0,0 +1,854 @@ +""" +dataset.py + +Dataset object for loading and unpacking an HDF5 dataset generated by + sync.py + +@author: derricw + +Allen Institute for Brain Science + +Dependencies +------------ +numpy http://www.numpy.org/ +h5py http://www.h5py.org/ + +""" +import collections +from typing import Union, Sequence, Optional + +import h5py as h5 +import numpy as np + +import warnings +import logging +logger = logging.getLogger(__name__) + +dset_version = 1.04 + + +def unpack_uint32(uint32_array, endian='L'): + """ + Unpacks an array of 32-bit unsigned integers into bits. + + Default is least significant bit first. + + *Not currently used by sync dataset because get_bit is better and does + basically the same thing. I'm just leaving it in because it could + potentially account for endianness and possibly have other uses in + the future. + + """ + if not uint32_array.dtype == np.uint32: + raise TypeError("Must be uint32 ndarray.") + buff = np.getbuffer(uint32_array) + uint8_array = np.frombuffer(buff, dtype=np.uint8) + uint8_array = np.fliplr(uint8_array.reshape(-1, 4)) + bits = np.unpackbits(uint8_array).reshape(-1, 32) + if endian.upper() == 'B': + bits = np.fliplr(bits) + return bits + + +def get_bit(uint_array, bit): + """ + Returns a bool array for a specific bit in a uint ndarray. + + Parameters + ---------- + uint_array : (numpy.ndarray) + The array to extract bits from. + bit : (int) + The bit to extract. + + """ + return np.bitwise_and(uint_array, 2 ** bit).astype(bool).astype(np.uint8) + + +class Dataset(object): + """ + A sync dataset. Contains methods for loading + and parsing the binary data. + + Parameters + ---------- + path : str + Path to HDF5 file. + + Examples + -------- + >>> dset = Dataset('my_h5_file.h5') + >>> logger.info(dset.meta_data) + >>> dset.stats() + >>> dset.close() + + >>> with Dataset('my_h5_file.h5') as d: + ... logger.info(dset.meta_data) + ... dset.stats() + + The sync file documentation from MPE can be found at + sharepoint > Instrumentation > Shared Documents > Sync_line_labels_discussion_2020-01-27-.xlsx # NOQA E501 + Direct link: + https://alleninstitute.sharepoint.com/:x:/s/Instrumentation/ES2bi1xJ3E9NupX-zQeXTlYBS2mVVySycfbCQhsD_jPMUw?e=Z9jCwH + + + """ + FRAME_KEYS = ('frames', 'stim_vsync') + PHOTODIODE_KEYS = ('photodiode', 'stim_photodiode') + OPTOGENETIC_STIMULATION_KEYS = ("LED_sync", "opto_trial") + EYE_TRACKING_KEYS = ("eye_frame_received", # Expected eye tracking + # line label after 3/27/2020 + # clocks eye tracking frame pulses (port 0, line 9) + "cam2_exposure", + # previous line label for eye tracking + # (prior to ~ Oct. 2018) + "eyetracking", + "eye_tracking") # An undocumented, but possible eye tracking line label # NOQA E114 + BEHAVIOR_TRACKING_KEYS = ("beh_frame_received", # Expected behavior line label after 3/27/2020 # NOQA E127 + # clocks behavior tracking frame # NOQA E127 + # pulses (port 0, line 8) + "cam1_exposure", + "behavior_monitoring") + + DEPRECATED_KEYS = set() + + def __init__(self, path): + print(path) + self.dfile = self.load(path) + self._check_line_labels() + + def _check_line_labels(self): + if hasattr(self, "line_labels"): + deprecated_keys = set(self.line_labels) & self.DEPRECATED_KEYS + if deprecated_keys: + warnings.warn((f"The loaded sync file contains the " + f"following deprecated line label keys: " + f"{deprecated_keys}. Consider updating the " + f"sync file line labels."), stacklevel=2) + else: + warnings.warn(("The loaded sync file has no line labels and may " + "not be valid."), stacklevel=2) + + def _process_times(self): + """ + Preprocesses the time array to account for rollovers. + This is only relevant for event-based sampling. + + """ + times = self.get_all_events()[:, 0:1].astype(np.int64) + + intervals = np.ediff1d(times, to_begin=0) + rollovers = np.where(intervals < 0)[0] + + for i in rollovers: + times[i:] += 4294967296 + + return times + + def load(self, path): + """ + Loads an hdf5 sync dataset. + + Parameters + ---------- + path : str + Path to hdf5 file. + + """ + self.dfile = h5.File( + path, 'r') # MG edit 3/15 removed 'r' because some sync files were unable to load # NOQA E501 + self.meta_data = eval(self.dfile['meta'][()]) + self.line_labels = self.meta_data['line_labels'] + self.times = self._process_times() + return self.dfile + + @property + def sample_freq(self): + try: + return float(self.meta_data['ni_daq']['sample_freq']) + except KeyError: + return float(self.meta_data['ni_daq']['counter_output_freq']) + + def get_bit(self, bit): + """ + Returns the values for a specific bit. + + Parameters + ---------- + bit : int + Bit to return. + """ + return get_bit(self.get_all_bits(), bit) + + def get_line(self, line): + """ + Returns the values for a specific line. + + Parameters + ---------- + line : str + Line to return. + + """ + bit = self._line_to_bit(line) + return self.get_bit(bit) + + def get_bit_changes(self, bit): + """ + Returns the first derivative of a specific bit. + Data points are 1 on rising edges and 255 on falling edges. + + Parameters + ---------- + bit : int + Bit for which to return changes. + + """ + bit_array = self.get_bit(bit) + return np.ediff1d(bit_array, to_begin=0) + + def get_line_changes(self, line): + """ + Returns the first derivative of a specific line. + Data points are 1 on rising edges and 255 on falling edges. + + Parameters + ---------- + line : (str) + Line name for which to return changes. + + """ + bit = self._line_to_bit(line) + return self.get_bit_changes(bit) + + def get_all_bits(self): + """ + Returns the data for all bits. + + """ + return self.dfile['data'][()][:, -1] + + def get_all_times(self, units='samples'): + """ + Returns all counter values. + + Parameters + ---------- + units : str + Return times in 'samples' or 'seconds' + + """ + if self.meta_data['ni_daq']['counter_bits'] == 32: + times = self.get_all_events()[:, 0] + else: + times = self.times + units = units.lower() + if units == 'samples': + return times + elif units in ['seconds', 'sec', 'secs']: + freq = self.sample_freq + return times / freq + else: + raise ValueError("Only 'samples' or 'seconds' are valid units.") + + def get_all_events(self): + """ + Returns all counter values and their cooresponding IO state. + """ + return self.dfile['data'][()] + + def get_events_by_bit(self, bit, units='samples'): + """ + Returns all counter values for transitions (both rising and falling) + for a specific bit. + + Parameters + ---------- + bit : int + Bit for which to return events. + + """ + changes = self.get_bit_changes(bit) + return self.get_all_times(units)[np.where(changes != 0)] + + def get_events_by_line(self, line, units='samples'): + """ + Returns all counter values for transitions (both rising and falling) + for a specific line. + + Parameters + ---------- + line : str + Line for which to return events. + + """ + line = self._line_to_bit(line) + return self.get_events_by_bit(line, units) + + def _line_to_bit(self, line): + """ + Returns the bit for a specified line. Either line name and number is + accepted. + + Parameters + ---------- + line : str + Line name for which to return corresponding bit. + + """ + if type(line) is int: + return line + elif type(line) is str: + return self.line_labels.index(line) + else: + raise TypeError("Incorrect line type. Try a str or int.") + + def _bit_to_line(self, bit): + """ + Returns the line name for a specified bit. + + Parameters + ---------- + bit : int + Bit for which to return the corresponding line name. + """ + return self.line_labels[bit] + + def get_rising_edges(self, line, units='samples'): + """ + Returns the counter values for the rizing edges for a specific bit or + line. + + Parameters + ---------- + line : str + Line for which to return edges. + + """ + bit = self._line_to_bit(line) + changes = self.get_bit_changes(bit) + return self.get_all_times(units)[np.where(changes == 1)] + + def get_edges( + self, + kind: str, + keys: Union[str, Sequence[str]], + units: str = "seconds", + permissive: bool = False + ) -> Optional[np.ndarray]: + """ Utility function for extracting edge times from a line + + Parameters + ---------- + kind : One of "rising", "falling", or "all". Should this method return + timestamps for rising, falling or both edges on the appropriate + line + keys : These will be checked in sequence. Timestamps will be returned + for the first which is present in the line labels + units : one of "seconds", "samples", or "indices". The returned + "time"stamps will be given in these units. + raise_missing : If True and no matching line is found, a KeyError will + be raised + + Returns + ------- + An array of edge times. If raise_missing is False and none of the keys + were found, returns None. + + Raises + ------ + KeyError : none of the provided keys were found among this dataset's + line labels + + """ + if kind == 'falling': + fn = self.get_falling_edges + elif kind == 'rising': + fn = self.get_rising_edges + elif kind == 'all': + return np.sort(np.concatenate([ + self.get_edges('rising', keys, units), + self.get_edges('falling', keys, units) + ])) + + if isinstance(keys, str): + keys = [keys] + + for key in keys: + try: + return fn(key, units) + except ValueError: + continue + + if not permissive: + raise KeyError( + f"none of {keys} were found in this dataset's line labels") + + def get_falling_edges(self, line, units='samples'): + """ + Returns the counter values for the falling edges for a specific bit + or line. + + Parameters + ---------- + line : str + Line for which to return edges. + + """ + bit = self._line_to_bit(line) + changes = self.get_bit_changes(bit) + return self.get_all_times(units)[np.where(changes == 255)] + + def get_nearest(self, + source, + target, + source_edge="rising", + target_edge="rising", + direction="previous", + units='indices', + ): + """ + For all values of the source line, finds the nearest edge from the + target line. + + By default, returns the indices of the target edges. + + Args: + source (str, int): desired source line + target (str, int): desired target line + source_edge [Optional(str)]: "rising" or "falling" source edges + target_edge [Optional(str): "rising" or "falling" target edges + direction (str): "previous" or "next". Whether to prefer the + previous edge or the following edge. + units (str): "indices" + + """ + source_edges = getattr(self, + "get_{}_edges".format(source_edge.lower()))(source.lower(), units="samples") # NOQA E501 + target_edges = getattr(self, + "get_{}_edges".format(target_edge.lower()))(target.lower(), units="samples") # NOQA E501 + indices = np.searchsorted(target_edges, source_edges, side="right") + if direction.lower() == "previous": + indices[np.where(indices != 0)] -= 1 + elif direction.lower() == "next": + indices[np.where(indices == len(target_edges))] = -1 + if units in ["indices", 'index']: + return indices + elif units == "samples": + return target_edges[indices] + elif units in ['sec', 'seconds', 'second']: + return target_edges[indices] / self.sample_freq + else: + raise KeyError( + "Invalid units. Try 'seconds', 'samples' or 'indices'") + + def get_analog_channel(self, + channel, + start_time=0.0, + stop_time=None, + downsample=1): + """ + Returns the data from the specified analog channel between the + timepoints. + + Args: + channel (int, str): desired channel index or label + start_time (Optional[float]): start time in seconds + stop_time (Optional[float]): stop time in seconds + downsample (Optional[int]): downsample factor + + Returns: + ndarray: slice of data for specified channel + + Raises: + KeyError: no analog data present + + """ + if isinstance(channel, str): + channel_index = self.analog_meta_data['analog_labels'].index( + channel) + channel = self.analog_meta_data['analog_channels'].index( + channel_index) + + if "analog_data" in self.dfile.keys(): + dset = self.dfile['analog_data'] + analog_meta = self.get_analog_meta() + sample_rate = analog_meta['analog_sample_rate'] + start = int(start_time * sample_rate) + if stop_time: + stop = int(stop_time * sample_rate) + return dset[start:stop:downsample, channel] + else: + return dset[start::downsample, channel] + else: + raise KeyError("No analog data was saved.") + + def get_analog_meta(self): + """ + Returns the metadata for the analog data. + """ + if "analog_meta" in self.dfile.keys(): + return eval(self.dfile['analog_meta'].value) + else: + raise KeyError("No analog data was saved.") + + @property + def analog_meta_data(self): + return self.get_analog_meta() + + def line_stats(self, line, print_results=True): + """ + Quick-and-dirty analysis of a bit. + + ##TODO: Split this up into smaller functions. + + """ + # convert to bit + bit = self._line_to_bit(line) + + # get the bit's data + bit_data = self.get_bit(bit) + total_data_points = len(bit_data) + + # get the events + events = self.get_events_by_bit(bit) + total_events = len(events) + + # get the rising edges + rising = self.get_rising_edges(bit) + total_rising = len(rising) + + # get falling edges + falling = self.get_falling_edges(bit) + total_falling = len(falling) + + if total_events <= 0: + if print_results: + logger.info("*" * 70) + logger.info("No events on line: %s" % line) + logger.info("*" * 70) + return None + elif total_events <= 10: + if print_results: + logger.info("*" * 70) + logger.info("Sparse events on line: %s" % line) + logger.info("Rising: %s" % total_rising) + logger.info("Falling: %s" % total_falling) + logger.info("*" * 70) + return { + 'line': line, + 'bit': bit, + 'total_rising': total_rising, + 'total_falling': total_falling, + 'avg_freq': None, + 'duty_cycle': None, + } + else: + + # period + period = self.period(line) + + avg_period = period['avg'] + max_period = period['max'] + min_period = period['min'] + period_sd = period['sd'] + + # freq + avg_freq = self.frequency(line) + + # duty cycle + duty_cycle = self.duty_cycle(line) + + if print_results: + logger.info("*" * 70) + + logger.info("Quick stats for line: %s" % line) + logger.info("Bit: %i" % bit) + logger.info("Data points: %i" % total_data_points) + logger.info("Total transitions: %i" % total_events) + logger.info("Rising edges: %i" % total_rising) + logger.info("Falling edges: %i" % total_falling) + logger.info("Average period: %s" % avg_period) + logger.info("Minimum period: %s" % min_period) + logger.info("Max period: %s" % max_period) + logger.info("Period SD: %s" % period_sd) + logger.info("Average freq: %s" % avg_freq) + logger.info("Duty cycle: %s" % duty_cycle) + + logger.info("*" * 70) + + return { + 'line': line, + 'bit': bit, + 'total_data_points': total_data_points, + 'total_events': total_events, + 'total_rising': total_rising, + 'total_falling': total_falling, + 'avg_period': avg_period, + 'min_period': min_period, + 'max_period': max_period, + 'period_sd': period_sd, + 'avg_freq': avg_freq, + 'duty_cycle': duty_cycle, + } + + def period(self, line, edge="rising"): + """ + Returns a dictionary with avg, min, max, and st of period for a line. + """ + bit = self._line_to_bit(line) + + if edge.lower() == "rising": + edges = self.get_rising_edges(bit) + elif edge.lower() == "falling": + edges = self.get_falling_edges(bit) + + if len(edges) > 2: + + timebase_freq = self.meta_data['ni_daq']['counter_output_freq'] + avg_period = np.mean(np.ediff1d(edges[1:])) / timebase_freq + max_period = np.max(np.ediff1d(edges[1:])) / timebase_freq + min_period = np.min(np.ediff1d(edges[1:])) / timebase_freq + period_sd = np.std(avg_period) + + else: + raise IndexError("Not enough edges for period: %i" % len(edges)) + + return { + 'avg': avg_period, + 'max': max_period, + 'min': min_period, + 'sd': period_sd, + } + + def frequency(self, line, edge="rising"): + """ + Returns the average frequency of a line. + """ + + period = self.period(line, edge) + return 1.0 / period['avg'] + + def duty_cycle(self, line): + """ + Doesn't work right now. Freezes python for some reason. + + Returns the duty cycle of a line. + + """ + return "fix me" + bit = self._line_to_bit(line) + + rising = self.get_rising_edges(bit) + falling = self.get_falling_edges(bit) + + total_rising = len(rising) + total_falling = len(falling) + + if total_rising > total_falling: + rising = rising[:total_falling] + elif total_rising < total_falling: + falling = falling[:total_rising] + else: + pass + + if rising[0] < falling[0]: + # line starts low + high = falling - rising + else: + # line starts high + high = np.concatenate(falling, self.get_all_events()[-1, 0]) - \ + np.concatenate(0, rising) + + total_high_time = np.sum(high) + all_events = self.get_events_by_bit(bit) + total_time = all_events[-1] - all_events[0] + return 1.0 * total_high_time / total_time + + def stats(self): + """ + Quick-and-dirty analysis of all bits. Prints a few things about each + bit where events are found. + """ + bits = [] + for i in range(32): + bits.append(self.line_stats(i, print_results=False)) + active_bits = [x for x in bits if x is not None] + logger.info("Active bits: ", len(active_bits)) + for bit in active_bits: + logger.info("*" * 70) + logger.info("Bit: %i" % bit['bit']) + logger.info("Label: %s" % self.line_labels[bit['bit']]) + logger.info("Rising edges: %i" % bit['total_rising']) + logger.info("Falling edges: %i" % bit["total_falling"]) + logger.info("Average freq: %s" % bit['avg_freq']) + logger.info("Duty cycle: %s" % bit['duty_cycle']) + logger.info("*" * 70) + return active_bits + + def plot_all(self, + start_time, + stop_time, + auto_show=True, + ): + """ + Plot all active bits. + + Yikes. Come up with a better way to show this. + + """ + import matplotlib.pyplot as plt + for bit in range(32): + if len(self.get_events_by_bit(bit)) > 0: + self.plot_bit(bit, + start_time, + stop_time, + auto_show=False, ) + if auto_show: + plt.show() + + def plot_bits(self, + bits, + start_time=0.0, + end_time=None, + auto_show=True, + ): + """ + Plots a list of bits. + """ + import matplotlib.pyplot as plt + + subplots = len(bits) + f, axes = plt.subplots(subplots, sharex=True, sharey=True) + if not isinstance(axes, collections.Iterable): + axes = [axes] + + for bit, ax in zip(bits, axes): + self.plot_bit(bit, + start_time, + end_time, + auto_show=False, + axes=ax) + # f.set_size_inches(18, 10, forward=True) + f.subplots_adjust(hspace=0) + + if auto_show: + plt.show() + + return f, axes + + def plot_bit(self, + bit, + start_time=0.0, + end_time=None, + auto_show=True, + axes=None, + name="", + ): + """ + Plots a specific bit at a specific time period. + """ + import matplotlib.pyplot as plt + + times = self.get_all_times(units='sec') + if not end_time: + end_time = 2 ** 32 + + window = (times < end_time) & (times > start_time) + + if axes: + ax = axes + else: + ax = plt + + if not name: + name = self._bit_to_line(bit) + if not name: + name = str(bit) + + bit = self.get_bit(bit) + ax.step(times[window], bit[window], where='post') + if hasattr(ax, "set_ylim"): + ax.set_ylim(-0.1, 1.1) + else: + axes_obj = plt.gca() + axes_obj.set_ylim(-0.1, 1.1) + # ax.set_ylabel('Logic State') + # ax.yaxis.set_ticks_position('none') + plt.setp(ax.get_yticklabels(), visible=False) + ax.set_xlabel('time (seconds)') + ax.legend([name]) + + if auto_show: + plt.show() + + return plt.gcf() + + def plot_line(self, + line, + start_time=0.0, + end_time=None, + auto_show=True, + ): + """ + Plots a specific line at a specific time period. + """ + import matplotlib.pyplot as plt + bit = self._line_to_bit(line) + self.plot_bit(bit, start_time, end_time, auto_show=False) + + # plt.legend([line]) + if auto_show: + plt.show() + + def plot_lines(self, + lines, + start_time=0.0, + end_time=None, + auto_show=True, + ): + """ + Plots specific lines at a specific time period. + """ + import matplotlib.pyplot as plt + bits = [] + for line in lines: + bits.append(self._line_to_bit(line)) + f, axes = self.plot_bits(bits, + start_time, + end_time, + auto_show=False, ) + + plt.subplots_adjust(left=0.025, right=0.975, bottom=0.05, top=0.95) + if auto_show: + plt.show() + + return f, axes + + def close(self): + """ + Closes the dataset. + """ + self.dfile.close() + + def __enter__(self): + """ + So we can use context manager (with...as) like any other open file. + + Examples + -------- + >>> with Dataset('my_data.h5') as d: + ... d.stats() + + """ + return self + + def __exit__(self, type, value, traceback): + """ + Exit statement for context manager. + """ + self.close() + + +if __name__ == '__main__': + pass diff --git a/brain_observatory/sync_utilities/__init__.py b/brain_observatory/sync_utilities/__init__.py new file mode 100644 index 0000000000..8403d1c9fb --- /dev/null +++ b/brain_observatory/sync_utilities/__init__.py @@ -0,0 +1,65 @@ +from pathlib import Path +from typing import Tuple + +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.sync_dataset import Dataset + + +def trim_discontiguous_times(times, threshold=100): + times = np.array(times) + intervals = np.diff(times) + + med_interval = np.median(intervals) + interval_threshold = med_interval * threshold + + gap_indices = np.where(intervals > interval_threshold)[0] + + # A special case for when the first element is a discontiguity + if np.abs(intervals[0]) > interval_threshold: + gap_indices = [0] + + if len(gap_indices) == 0: + return times + + return times[:gap_indices[0] + 1] + + +def get_synchronized_frame_times(session_sync_file: Path, + sync_line_label_keys: Tuple[str, ...], + trim_after_spike: bool = True) -> pd.Series: + """Get experimental frame times from an experiment session sync file. + + Parameters + ---------- + session_sync_file : Path + Path to an ephys session sync file. + The sync file contains rising/falling edges from a daq system which + indicates when certain events occur (so they can be related to + each other). + sync_line_label_keys : Tuple[str, ...] + Line label keys to get times for. See class attributes of + allensdk.brain_observatory.sync_dataset.Dataset for a listing of + possible keys. + trim_after_spike : bool = True + If True, will call trim_discontiguous_times on the frame times + before returning them, which will detect any spikes in the data + and remove all elements for the list which come after the spike. + + Returns + ------- + pd.Series + An array of times when frames for the eye tracking camera were acquired. + """ + sync_dataset = Dataset(str(session_sync_file)) + + frame_times = sync_dataset.get_edges( + "rising", sync_line_label_keys, units="seconds" + ) + + # Occasionally an extra set of frame times are acquired after the rest of + # the signals. We detect and remove these. + frame_times = trim_discontiguous_times(frame_times) if trim_after_spike else frame_times + + return pd.Series(frame_times) diff --git a/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc b/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39c204575deb1c47b5c41911a1eadc8851d78e57 GIT binary patch literal 2092 zcma)7&u<(x6duoy-DI<A+E8eVK=O^Q)J_hSI8=ZrMM6kbRgrKR77d>9+l(8JXKH&B zwwfGJ%8@e%I8broUz#hY{tKLV_HH(z1qn;@=GpW7-uwJMzxix?dlcYMzyH8~*$9F^ z-Q;`>Q27)eQ=s4hCo-r>Mu^ix8P-u2c|DSGmf%_>2iXwcvD~OPvrYWA%?Et=f@C9p z1qej2#W!c+tpLU_e7em?zs7uvk6$F&6&~#elbu%>Czy~ve!^^p@8n?KN_dRg@N;IF z0sD%hMHxCf94^5apNIGui^2xKkuG>iPMsEdEkrHqLR^cws3X^d(->FcF6`o?_$A@w zR&bi&O45Z+e@WcBe!|Hi!Sz9xoT1H8sK4ui{h&kWUE=I`cq8}`p<vq4V@)vjD<>wy zK2&X=Fs<1li@BK1vOx`8Fx4j~6=>)qR+v7LpeBPpv7!dkZ`w+OsT#?%O`$C4V<t^D z#(nwuG}}Gb@(bgwL)M}N7bTcK0(}J&`0M$@`_r!tXftIM<7vT8m|9F9C{{L#vwKre z$7b5JpiGIfX{&{qJ`%;$2n%;xRvxiKz`YU^H2i3<&`hYjDbV9FvyEQtnT0CzxfN1a z0cJ191cc4=v|aQ!trm681-e#N9L}4$$vr~HF>@V7Kt^N~j>ty18|{)oI3{tZuj2Ya zI*I#h28<Dn%6*KPkkDWEsuT)x$qJD95iCr9)dylTJgVHZ;t2YI20PcPj9d^L$?Eac z_z)*Hut<$Fa^{Kf6pP&v9`fj?=oHDIZ`-Jg&xk@=AVFfJ1Cj%a8?&F$<riQneBT1X z17(?{GtFwC9vkXSO_{o6Kvy`ZOP)F$>1af8JYjAhW^MfR?t1v?8|dkM++i#Kak<@A z)HXhtE8M@uadvJTRB#cVx`JRK4b{R3b+|Xf0^^$k$7-(-P|lv=7Gt5NCzU8K;(CfP zi<U@XMN81m8HHm!3`3i;oNId9G}KnGpd}tf0aSy;9URkLrw^>GXoE(2k}d%|D!o=) z#O!bVH^%BaG)>cQ*ZUtK3#exSbu4fvafpRkRiV)--3OqhWX4ctks`(1<=o8H9?of< zzCr8M^NcUMOuFhebk=Cfs1(M!!@A_CZIGyi1fR$f%<GgyAVt$i`Y}Dwb6BVF<;>6T z&=Vmg9u|uKx;3;>?np0_ZSAH2%*~y$W4%ib4Qq7j>b7*vk!Phvt}Lj(B8FngoI3|{ z?T0CjPU_|us7nPTIEEu75V<pU*jHZ51}X3Fod4pTu6X^GPvak?_7Pg1?&GC_<rhcG z2a5XMh=;i<oTrq(PZv>PftO2TGjhmEyfT{66KtN8mCxov1799_HdxZR9~yA&%}hv^ z%&{Gr$w0dwLmwfFvQ1=3?wRgeO&_+rA1w2lB>EcK>0Kw@LXnLx6CvC3i7lI$@2^X- z<9xs8+&b$@H%dImW_`){eY7zC*ZS@_jLA5;8tPlPHX+)zrU^Ni?DWGHZ?_bMc0aU! zU>7ao)vkqQiJI5#LJyrjXt7Gn=o@bG!T;p2$M5m#cbxawkx}17)#q^ujQee9k7(ng Zy5VyPpSWL{8KW4JakzoqdK``3{u?wgX5|0? literal 0 HcmV?d00001 diff --git a/brain_observatory/visualization/__init__.py b/brain_observatory/visualization/__init__.py new file mode 100644 index 0000000000..53bda7c47e --- /dev/null +++ b/brain_observatory/visualization/__init__.py @@ -0,0 +1,36 @@ +import matplotlib.pyplot as plt + +def plot_running_speed( + timestamps, values, + start_index=0, stop_index=None, step=1, + ylabel='running speed (cm/s)', + xlabel='time (s)', + title=None +): # pragma: no cover + ''' Make a simple plot of a running speed trace + + Parameters + ---------- + timestamps : numpy.ndarray + Times at which running speed samples were collected + values : numpy.ndarray + Running speed values (by default: linear cm / s with negative values indicating backwards movement) + + ''' + + stop_index = len(timestamps) if stop_index is None else stop_index + if title is None: + title = f'running speed from {timestamps[start_index]:2.2f} to {timestamps[stop_index-1]:2.2f} seconds' + + fig, ax = plt.subplots(figsize=(8, 8)) + plt.plot( + timestamps[start_index:stop_index:step], + values[start_index:stop_index:step], + ) + + ax.set_ylabel(ylabel, fontsize=16) + ax.set_xlabel(xlabel, fontsize=16) + ax.set_title(title, fontsize=20) + plt.axis('tight') + + return fig \ No newline at end of file diff --git a/brain_observatory/visualization/__pycache__/__init__.cpython-37.pyc b/brain_observatory/visualization/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..796d7b5e2e5ada5a61a1abc04a5453e9eff84b27 GIT binary patch literal 1180 zcmZ`3O>fgM)K1bg?KT*&1LI_IT98<!aT^E$yTXL{xI~pICw5y?$BAsWTdM4Ufa87v zLINQn@t1n#w7;+u&uQ5h5-;-0`~GzDY-6K~0Mz&Q^j?6_FUS0W5Qrym%pE`sF)UGz z6AvTSW-S(e#EH-FYZOOkpht&i81VU)o+>5Oh?tUdMs~8iXX5k7iky=j6K9dL1#oHG za1P*@AAo8IHi`76MK$_>l~?;Ge%)?lkC|7a+S^9V{~WLYXrHxiqZJ>1X`Qq!e&<11 z(JAhGC(%jA;;+8*sr@?m<Zq)IU((;8g}U=Ds9UVVx~EI7Rfm6ZA!J@#>L5~^t$)Md z6G5{Z^da;~UeF0Alo*khl9N&vmJ~w}T<zX!n(=Oz0KBA{=G<~^8utDLG^`tsu{19Y z*(Yk6m({LfRBKu_Y8T**Ga=NHqp`@w|0FWtDnWh3H78jiCC@Bpjqi-gDQNx|_SKbj zt&DfliZDK;Q)%~!6pB+#vYhk?WDs^t6dzG5W}K|-g<>KD39LP(+2n|7W=LMlc+QoL zFIs4b!}+bNLmKKLC-Y!$cW*ckh%Jcr;5y7BVt7_4W@7KmT^ij26yu~l6eA<%{A_c{ zN5ewdMz95fq-DiuY~yI*ORg4vDQyy&Y3ep)lEA%^uHkl2Nt$xGq>meV(Q$GstmH{R zkA;c5N%wLwi*VU&vIdLNb^tx|WAL{{xuh3?vAj&eRpf9L6$)|@eJDHe=<!dauR)#X z)xm!Mt%2*%r(?=?Q+h;I)qkp}>zO|2b2T&lqU6eCfQxcmnf`N;_KmRoehEXSBM!c> zX=T`?muf21phzL&jM_q1y_qmmD#aYuQmEblY7}-b*e$EYO*e(XY6*kpJN2O?a~lx4 zxrHNq*W1JaUdNmMHSC_Qr<-Yq+I{1P&4RS^(eTeehjEbH$f<Q<rAQ$~Gv;vl)*WZ( d+?&S#Lf1jIh#utyn@axJMK*5H>jA><`3)(dOQ`?= literal 0 HcmV?d00001 diff --git a/config/__init__.py b/config/__init__.py new file mode 100644 index 0000000000..66d0b42cfd --- /dev/null +++ b/config/__init__.py @@ -0,0 +1,61 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +import sys + +_console_handler = logging.StreamHandler(sys.stdout) + +def enable_console_log(level=None): + '''configure allensdk logging to output to the console. + + Parameters + ---------- + level : int + logging level 0-50 (logging.INFO, logging.DEBUG, etc.) + + Notes + ----- + See: `Logging Cookbook <https://docs.python.org/2/howto/logging-cookbook.html>`_ + ''' + + sdk_logger = logging.getLogger('allensdk') + + if level is None: + sdk_logger.setLevel(logging.DEBUG) + else: + sdk_logger.setLevel(level) + + sdk_logger.addHandler(_console_handler) \ No newline at end of file diff --git a/config/__pycache__/__init__.cpython-37.pyc b/config/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d1e9b7d491f6e8c2fae0e0e7f55948c220b299b GIT binary patch literal 826 zcmZ8f&5qMB5VqZRHybEIJb@1!DB30~5E80ZE7<ZYtqM}Lmnc%|#wN)&wWHYGRi$!3 z;z7FN#4F{>2_AtH<1`J3k!Cy|kH7IZp7Va+MIiFq7xwE2p&xd$mku~DK=orV9C4hZ zV7KA`3$!HyUv+MA(B)lDc;_n)dK^#Dp!XB<(Im!p0U@9kYYeKNgE44}Iljf8@dk0S za7wztTVjw!!$`Vzw?WniuWNeN;{=d9%mdI^$xm6bDg|YEE~MrQnyVzqWI~OiYGsO* zv7Si<g<P$2;khnt<RdHDQW#O{HZ*Ld4dvom<a9(cY1)_t*caNJpA4U!&__+odp~*e z;dr0ny?T9q`SzF!6MF;txBNsI@n7Y(z*LA4on16s#!4;bp!75~rqCnb=PK4-u{Noa zo+=aniJz()qx|Lp!??NOrDmC*&7vAOaQ0oA3=XQpCbv3Dgt3)GSveY9%eU&)kFH$C z`8y_g4u|)nriD?uiwsEBtJw!GbUw0pqWq3Zm>%?dHXenS8hRVDlyPs)ZkSw$FC_yI z&Yp%sUh7a5@M$qvRitYjUS#u7XGRPQ7B5&L;BND+{_dy!D9U7Jq6oNG4}@g%T(qx( z`U5*x^%(bE;^2G4CFLE64KOe+?etY0z1CHKYD&SDdu9jPa2S^I5EAPAn!-QELRQY{ TQt?$T&K|-}AAoVNL++A4LXzSh literal 0 HcmV?d00001 diff --git a/config/__pycache__/manifest.cpython-37.pyc b/config/__pycache__/manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6493b2d7992d1ded447bf30aa1310e1f51ebea4c GIT binary patch literal 9070 zcmcgyU2h!Md7kf?T`oUFQL+>(^4K*ctt!)PthA}?22mu+Wg;_%C|k;c?RvOpmRxc; zvpi>3BDcc=HC+TKnxa3z2uQRjP#`FZUgsAiw?R?NMQ_@Ry2w?5-WUba=RId;c9&t4 z$QK!6&Yqd`Ip;j@^L`wDb9%b2;fnw6FM|Esn)V;`P+k@?-@q+CLc%nrM_Nn$>MdP9 z8!bcrnk`fQS}jZd+ARmaM&#~#El=0p)tJewPc&wQwIj1t$Ft2GJUihOo*PVG)0*yQ z7)4uc>bdoPkZyJ8sl3c0BW@rQYBYMw2u-Fl;}h*jZ&}~dy1E?0YuVq^EUo3BM>}75 zFNk~HP^2G*T=bH7ne&8q^rAQV^>E+CEv_LsXk^;9hFjm!*3e68?9{ohYxKwP=7~(3 z`fAh6r@P4@X6>h{<J>JXwMPg2P>w@iBEqQqj~b^@KL6<M+v^_))L##_0=BdfJPYE3 z^*eFUNn#efwI0S##d^{YW6?pH^tTSg`h(uay6C0h8~vcO6KsZP8%3zWcHTs*Zg2C= z-Qo+E`Ukm}3{n=PA$ya)hz8XRLvQFa`tZwVt;AAUze8J17yZ&=(=B`?sg~-Qc4QnI znSP?{T4rWi+sq84*lH{?7Q@bMG3bY!Q>)x-w|j9fZMQjf#%&}`i@Q|h?uJ6(E96UA zj5VsY+np#70u5-!yhcd_$?xG74iZhD)16=T3FT-_mqw0*-LT!x>+SY#!UhrL8}0Vq zAc%?*ug|f#JU!rqdpS-%UCf{pMo~Enno3jWGgL{=h`#L&+=9N!Ga9b^+72G7i%PzM zTl^D}5~WOsY#5LWvt=_2a$&dJ&^xY$+KJw(vqk2y+9!Hzid|!MHicXxv{-{V%;{Qe zn$6(NG@E5}pJ=TacAcGL^LR7M&a(x)nPV5&Mf{!%=h;i_l9Yw>$X{k(lKBPpGP{EE z3+x8F%3eXsi>%3BWv?Ok68kOoI?66Fl9ijeS0ZHi0dj;jKivxbDCq<#M8{9Mez>28 zJPsni+lxX`_vzwcH{@a537OxE{UG-55J3I4d*AjILI+&6&rR0jxkXKL4_Ucat+^7v zr6jH9`qBg(X;tsis*;5EAf0VZ!cWh@0y{PS8srt=%)kcUH<X+<4bX@}o|)JBU=u*H zo8;$s7-2F`!}dlX!ZyukDoO&@Rx>SO>ZnKlB@C#bDuFqP&Ua}_^hyIZ9mCUy=gI|K zDlyq1(9lI#BNWN+m<R7L{m|V1S*G99{^UOot;}M^W$n<$TZfsMwd3%ccxU3BlL0k5 z2HyrZS<J>8_puhw6`Z6Wy5H4e;|W&fSVOsUnNk<2n>i<zuI<&)-b4Ez|BCjq)giEW zSj#+CzpSw-wE7`y;8{D?C;GOtTIOW#iKF_b^+(-*N1bWR&)lo0=C*Zgvzg4k2$WN; z$3z^)j`_Db_fm(=Vh7D5^J87^q$~M<Zuler0XD;@{Sp9Enn(ba0P(v#**yzjz6d*n z(51RUBtZFoz(E86YXMTcdZW6kT56m9xBa`4N~`y%?U#F5c24j=1Kdkhqt)C>!Th<? zP55q*@{8E+yxtEW8)<tdJjhK-EYS};`~u4Eb5cK_>u)~F?WaLB2#2qJ5bwmvvsf;G zPo0rOm7o8%zbJC8>E&L)SX)UE<!H5X_rv9fYb)Pb<qI^b86}&!`z+vbFW!_irDUNl zS(slzoe=}`%hW^(iTr>mDKEuWyh3$fr5awaA(Ci-H9aK^FQar7xA+zk&9n5n?&%h8 z4?;oO$I<IX9jQU@sy9@pfm@XrREk=4v}u@ilng7~y)-7Gk2<7C=pu2VycDT_Lnd?h zN1G6jgDX;rLll?}IC_~2_<96G2+ma{IH|F19z*CdM*;L>tq>#k*v^b&2;qs;cB#AV zZPzmQZ?r=L@V0h5{*>Mw*E8cpKQ!V?>Pe;$l<g_JmnE5rF&Yqyzn5jxsy+z;vp<FQ zgqfkg1ED~z8PxhI#MA+q;a8Pm_U=0{kU-5|aNE$dl^CW&>IZ%tKJ$Soe(=J02LJ(f zk#fMI!YzS)g`vY<w-<6B`(9Bxs!0hfMx&Z^5kAiDXAR&+H-*BWt^!qiAgHfJam!z1 zn7~04`eLvl(q1}HlB;@FeYYj_%ZcJ!2fLxtArq6n4*I_C-(X=k7({8)$7t6{EUs6z zO2lHa8%Yv{L0lElcq>Z5kwoH?m16J<(t(xGfvw_q2Al-g$5<elgcf~bs!B|%)wty+ zefppvs;bG6Vn&M+VmXwA(>#@g(;{^T9GaG6sbHkWo8v>2>`{#{(eFdjy)@+@PGk?K zc1lX_@Rd#wqa5D|0e%{ezQrd%EDHV_q~}r7;9thCY_iI)BHNr*+~5R#7^O^d3%`Ma z+=i`}@Z2GLAZD=s`cW^<jYQ;@q$6uP>BYH=^`}RvM|1by%EQ$=?=9yp){=~|+`7N= zV7XaSq~z1sU!mkCCATQ~ZAyrN3VI6orpQ50a#3W@r>KZ5gd^P2P0-F;x&`xh27l1d zl9uK`E}lMPTmscJsLYrj*V`qZb|7!^BI~mvnSDI$^GrY1PBiH4?z(Yk9Kz~2BqA}P zv#-GhAw6!T`nGXwLX*Smfi5;lZ)aB5RAe*$mN}mqhc>81hwyhZ3p8MW7Kj9_3^~%A z$~zkVz{m8U5ftReA`3QPze@oV5UPYL6O4?uQfWM&A_$tajM6v)!T{2A0$&Qdrw60~ zh=i!=NWUt~3~$|GjAWe(mwbtF(p<NQSfCbFo<xpvBgBoPkNgR^JiB5HahCjUQdLby z0Y<7VPfi~&ZYc!@=O>V`0Yr%+PwA?>R_?I)7jz}az|-7$z(i>)1rrC*py%OyX#^}) z%{t`H&_&3rknzuWfa<X`lix4Y4{SH7eqg^r{Wwbf>_w;4Pk{(hKYP&=ExrcjW0Ud` ze@g9AXWONgF)S(h1Z70ec!B~to~qQ812xsiY^W(03S~NTnKh<lEdE0vOR5~q$}ZH3 z8$5#rGND!^EfpM60pZuPrKl;HInN;~auP~@Jw;TqHIc&E&DRDSrK%8Qh!FxOlnI>T z<XOl@%n6Qpf!QcZ86(D1(~~Gu0InwZOQ`<-ugB~!z|7;KA$fVVIU|XglRG++5x#`S zye=RCsd&}{@BS{maG=7l8j@RcQ-pm^!2$j|l)OdB?;~k?Qm9&9xs7?P+L9I#HZ7*& z<FBE*^51Axih7hiC2M>U6@P+TypBYhw+st5-iVB0>w$h}3{WykW^j)=P$X|Ofr^Mp z?1+@##Vru0g2O`=R3T(!RT&`ATZmN{M+gM%nEV#mS{Fgav6Y$RV!@KKf<FV~ABM1i zLMTGm^KzqoTCE9#L_D83D_7!;N=iy1s_;>j5Q$cbnvko;gx2Q8L`JYB4Tl~O7m~~g z+C0miKrNU=aSHn-@i)dyDX9QT3kF-_OWOv(Eu`g^AEuqLPs2(Kcs%0p;=8J;pJ6J# zPu<G(Duf1g1|4)m%L&_V%&HSU42P&UE|!ILL7op_Eh*eYw4iA#PJajQb4#ju#pg7C zWfe?n`rO+LQ|bErF9CwwYi)MMSb+av8DlsqYgIU+U;^RjE^a|~Pl=;L1Bx8#8&0aj zuM(cfmCa0`#vJ}@1sU2uX`YfhD3#n7w8fu~mnx_-!IvZd_6uxWMNA{K6=t3;H=+oB zaN2_w{8pF+5~xb*Pc46)7FH4BG&WOhz;wM(q{H)-;vChhw!p*ybjvLuJ2OSRRfQMf zWEo<C?41<u8M#bYeq)&XcX_DH=Tl7GLy(H#O<XaC>laX2lS-#T{;yi#DD0-YiAXDP z_p7EP@3M#|NeU;Njp>z+{0=tSNCZzMO)HR7#8VPFXguhK?cE(vFJjGRCldUdR48kl z+KdaTZm<(VBBX7MR^m0<7pkevHcYaFhgYjzIkQ2vLF8GJM9B@JU{wmHJ<_+~?;-~| zxr~teCIzryt}ug{e+gNEL3|M`Yhojn(QCb|LO<7Fz?z5l{*}x`odpE6oMZC@(Sp>< zoFo0v-uu>L?O-Ogj~x|ZhL`>+LhtTQ9l@f84wFXLhFJ>JhuQFy{~>d?>uG(P!c&w- zsFZT?hq8u?{LhLS)09u`?V00Qq;v4s5etBsgm9SnZ<RYfhw!U&LgB0b+WWtc5m+nQ z&g0GJvGFlt1~^tQ58Xd^pTJ0yp*9<!tPOu&V3H)o?{$6hu!0Et%fQ|6=3X3+*fr&2 zR-l@|l){eROKCKuED1$?Jw;HqC(;q3epASm;j7Px$yY!7Ij-Dc0e{wur8k+|$i4NI z&-L}@c}{$r+kj>&q{%{lBc?21jig)|Dc&y7OQ_A=@2ttg6BHhZ-0Q<FC!UcmXPmU0 z<&`x!lDRZgq!;Nd-?@8tc})orSqA(Ljpy<ZZ99m^EiXS=S$hOO^V{^kR;@CBi04)f z8cQk?>AUi@<&~n{^2(xI5AzyHv#fa9&Y`f^ACRz-Nu|xfs?q25i?C-X4kn#Ude-Zf zfpi9M=S>5p4c#ynj4`SlNqi-V6I6K#y~{8!B2$n=qD&AZ0^W)w|N1>Fp&yKq4H08$ z;=C|9K3_jcd*(UzJPyeCA7j4CI;9oD3v!pFdf~(@r<O6VD|}N>ewS90G_~f{^|2Ki z)wo|p)~OoZlB~!!t(M4CUU){{)a}&T2Ej0#5)?i-hzr5I+o^j*XM3dPt>ORRl(5%5 z7+XZrFA}WsTd|&{ITjtz`}8-wtSo8MsNjdQ;#rTkf|Tq9mJmabrBY$t?+HmzeZ+vE z)kh}4aPeNnI*USbimWI<`VZwdQbg*}Dm(<aq2yC2SzDtV#hZ(mP#3;;lv{g)UOHh* zxW%l`-1S;#E9~shrtj0H)3KjcuNw^+D#n@0$OW$|<`y|46#z(ERRDN`hZM&Z*l5`P zkP~zN9s)Lo4A^`P0UL{)^kW>cpbVObUxGG5_y$idfMaJia$e@)I0?~Lq}Cs4dzVND z5I}-O%<*v$?H~%%N908YDWusO?)S<1O}7#O`;hiQT5z-*K^2Vof|eo+MThrfSP|>g zq22$5K+PRE3}melUZrtPo;cAX;EUKJ;xRZ$5QA>Fw~z8DBCkQsdE7cLDwL7e3GK5| zgfLaiv>Z$MAHUes(7myAv$-f<=kH-hR+~<4@Gy5f$!;H(8h;xva~t8H&Q@-3@?_AL z;3{H)IMqD$$+@GZ)|$e15ed^VBo0Bxs-d9O*e%Y&2_U(?+w!1}Bk8)fFyd*(nJxmN zivItK@HdBQTAiYTuw`)*g%2-QcGE<IiGL%g5IBzx$e_iMq_!>pLE-xbuw$+wrWLbr zzp1yJ1p5?2NOGgkTD5zSoBMQJ1z#E`Tyl?<MXoE#JZ0`R0@0>8SC`uSprT65b$Fqg z>3AIs&PjRTOmr0|qxiXx)6p*8G%xd6{BZhgehx|Qw%aV}wA(EcT2_Vz_*bd$x-7)G z(k8%^*I?E^KptV>8&pbS%jq15Qv{ZOof2~Y6=kd-mruzvew@i|C5%6yGSUisgOZSv zT}t*S8GWzJk$_8{A<snIMB>58gGEb!29B28`d1BoZppi%>Gf;gCGSGxrN(V<sy<&| zknNh&%EW$59c@w~DETgumP2wI2%g{}cS-3*y$xlt)Ry-<p%gpye+^Euu?_o7QQjGI Z%)NKi{~Ub%b#x}7MCV=QU&EZ6{eM=&&n5r> literal 0 HcmV?d00001 diff --git a/config/__pycache__/manifest_builder.cpython-37.pyc b/config/__pycache__/manifest_builder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3b08a057a9d25bbd5d3b4a849c0460475bb6999 GIT binary patch literal 2812 zcmZ`*TW=Fb6rS0e*N)?GD+CCjR!FS{gi7=#6t$GAT2WU83UuXawehTzb?mj7Srcrn zA1df$)jz;PqCWL6&1;|f7y8ui%-T*cu-2TN9iN#w=R4myGdGu)D-2Ki*Kg5ig|UC= zWA-@c+(1*`LkK2#m-V>CIO|z~&5IEyaPW`Sb$edmO~*=sZ?wxn`5qIta9%Ot#FdwJ zuq60HR(Jo!daP0B+W#R+lXk4K7LCjv7o8huDuswyzy%8|!G%R@33tm4Y~hL0D~7#& zQO4U9=R{R3zv6)>YGMT=C2?LH6~{2*i{s)1M#|y?aT4!}I3-r`UJ|Fp8N93FtXRW) zSuDY}3wmW{)6HSh6|vOzPCU|;K_ufe3#sp@LEO?#HX6j*YxiX@%32(z(nD_>?G~C^ zgUHw(&#Zl(v(VmRkWNC<6%4!aM%~k;ZhvblNw;))E6(ntk3Ib`Oru^LhS~}7w=NH& zY&%TSc3=A{Ze>Y7Rlv_taku?9lSi=8f7`dNH-A>KRLy8R66>4MZj_Fi-=<NkpNi;O zGftnYW`7W;ss-5}Y>!m)ezMtANfuujM6I1@E5_Vz7aC&cDrU8lt*gChgu=}Nj`hKa ztV_})3&VBt(t}{U$~`__UBGUArr5Gb2@ky~z6PIFbaK`)2zBh73;r5N5sQG0)u>yt z1P$#zkGjLS?#N~O@}dEJ5Rz8XrN?(3JpArQQU!aNJWhhpD8y0HSyFKpJ_jxU?HUG@ zv4xM%E*g7CPun7qjh1l@Q^*X;24nRGIyukn9GrY@PrMwl+$qbo+|4~<ZLk~}f$z(? zgKrz(#>3p3d*(Fiwxs2Zdy+PhJ_!N_o{*dJ1ocaWS4NlAv`?fXW*A*FOS|Bu94&h7 zM?!?enlCU<5hTpDxW#?TpSHK7HJj2R2Gc`tYR2yxI=MyO<b0!u5%|j`jl&_rUpr)* z_Q9PDR;fj!mS~45fA2y6y`eaycXw_LAy7s$*0j+Pd_qyMc6@n6*yyu8w$CO`#wk88 ztv|0%+)*ue_pIC@^q;WwqQf$Kry?J7q$+3hU*;fU&P&6*Us!5Ag`QwPu?OsF;icQq z*6!w`vAw%_Y3vTO_LZ;du0FaekvL&T_0v#gk`maV?9#6JLzf>RRClE8OYLrsvRKu< zDMl0(UG9UDg{IT%i#S+1yb^COLbq~gyLQrzsV1vq5R5wrDVkM9cx(8LFDx>9VeY(I zQEcbDzKjonI@MtbpYRuJ=<z*kpWSA^)+ScY_kcB_`0V5pFu-J}_Gjf`nw^FW+A|5O zv^N}xD2r$0DD6thU8ze`3M~3qK>-Yly7LsqC`t;(EBpwrS>rQ{P8}%E{h{hh*=-m? z2U|wj$6u1Q;HqVchRHAR))b6|T2ZA%XFi2kV8+n3ckMn?obOM26Q*W=3eJ>~JOh$B z-=ErHODde&>I{Qw5t@QP(<-LD0)qv3<ONLHL{k(p#(h5iaM7wmfi9Mun?}&gLrtb- z00!V#ncZ;&|HCRuF4v`2zdP*VcyYBg5JCBNltp(Xl^j!-$UR*VZN#Zidk>J23K9FL zO*1K14~%{b%EPMjgMwmD%|O{e#~hpN#mxfBj*Tk@`yI*Kaog5uw$DM+i%oB0P3(y? zaVOrS1n)eQX_RG@;u3sxLEeujxeH%yNe7Vjilf~WQ&e1Y$k-}*q07i`%JH7kcDLV> z<huNf#2JXXZy1D|Nn7(!^Bv6xnk&sS`7!A%Fss&<{oVm29jHuCPS3i`$LAL#`KCHj z=oDr&P;c+nYjO#FT?s=Jj$xN>3Dq!sHjKK(ouROiVk}RRAZz705}%MD?#Zhph*0u# z65o(Gu-NqI@H9SOLPyaeKJw6aeTPbCrRLjcCExZP-!XdiYOprDKCHL;GF~?&ZI~t9 zBuiqY9U2U3Z;r}OX&<WV!Rn#ebop4HC78+E0D;0qMoBuv<(ClJ>u+{&8!9664)e9Y UQ9$(dMW`#P2*;2&RW#rJA9x6u{{R30 literal 0 HcmV?d00001 diff --git a/config/app/__init__.py b/config/app/__init__.py new file mode 100644 index 0000000000..6177de1ae7 --- /dev/null +++ b/config/app/__init__.py @@ -0,0 +1,40 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +''' +allensdk.config.app is a package that assists in +configuring application software, as opposed to +domain-specific configuration. +''' diff --git a/config/app/__pycache__/__init__.cpython-37.pyc b/config/app/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aef4c2ed1c875b4e62d10961c25e0e4229d4cdd9 GIT binary patch literal 328 zcmXv}yJ`b55Y)M`5%?ce#t`2X=}ZWDv>{DM69i%{>FySvC2=dqTsnVCs{E4Md_qW* zDjPo*X4r+9-P!x;R0^)}v4fwn5MTepxe9J>88l&X;#IifS<FW7I|*Iq1G!acW2mty zAti;RKqas%XuQfTWCcV>nG^<j)NOhUjbd?!7Ba@5DAsuky}x9!iYZ0%PUR?FTmyzV zC2z4ttIqy|tCUZ(Vm~&<MQhBb=trFIK)>!`p<l@Nq@e{@E@2B{(02iNfrBgU!yD<C xIJ{+!sU1i^;!+c4KR<<M@9Dkjc(&ril`$AF8&jrXKe=8<x9R-N1t0!qh(BD#Y4rdA literal 0 HcmV?d00001 diff --git a/config/app/__pycache__/application_config.cpython-37.pyc b/config/app/__pycache__/application_config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f01785fdcc136a25e0f321b288d36cd8c2752c2 GIT binary patch literal 8870 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 literal 0 HcmV?d00001 diff --git a/config/app/application_config.py b/config/app/application_config.py new file mode 100644 index 0000000000..0f6781e889 --- /dev/null +++ b/config/app/application_config.py @@ -0,0 +1,367 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2014-2015. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.core.json_utilities import JsonComments +import argparse +import os +import io +import logging +import logging.config as lc +from pkg_resources import resource_filename # @UnresolvedImport + +try: + from configparser import ConfigParser # @UnresolvedImport +except: + from ConfigParser import ConfigParser # @UnresolvedImport + + +class ApplicationConfig(object): + ''' Convenience class that handles of application configuration + from environment variables, .conf files and the command line + using Python standard libraries and formats. + ''' + + _log = logging.getLogger(__name__) + _DEFAULT_LOG_CONFIG = os.getenv( + 'LOG_CFG', resource_filename(__name__, 'logging.conf')) + + def __init__(self, + defaults, + name="app", + halp="Run application.", + default_log_config=None): + + self.application_name = name + self.help = halp + self.debug_enabled = False + + if default_log_config is None: + default_log_config = ApplicationConfig._DEFAULT_LOG_CONFIG + lc.fileConfig(_DEFAULT_LOG_CONFIG) + + ApplicationConfig._log.info( + "default log config: %s" % (default_log_config)) + + self.defaults = { + 'config_file_path': { + 'default': "%s.conf" % (self.application_name), + 'help': 'configuration file path' + }, + 'log_config_path': { + 'default': default_log_config, + 'help': 'logging configuration path' + } + } + + self.defaults.update(defaults) + + logging.info("defaults: %s" % (self.defaults)) + + self.argparser = self.create_argparser() + + for key, value in self.defaults.items(): + setattr(self, key, value['default']) + + def load(self, command_line_args, disable_existing_loggers=True): + ''' Load application configuration options, first from the environment, + then from the configuration file, then from the command line. + + Each stage of loading can override the previous stage. + + Parameters + ---------- + command_line_args : dict + Parameters passed to the application. + disable_existing_loggers : boolean + Reset the logging system or not. + + Returns + ------- + fileConfig + Configuration object with all levels applied + ''' + # read and apply options from the environment + self.apply_configuration_from_environment() + + # command line so we can find the config file. + parsed_args = self.parse_command_line_args(command_line_args) + + try: + # read and apply the configuration file options + config_file_path = parsed_args.config_file_path + + if config_file_path: + self.config_file_path = config_file_path + + self.apply_configuration_from_file(self.config_file_path) + + # apply the remaining command line options + self.apply_configuration_from_command_line(parsed_args) + except Exception as e: + ApplicationConfig._log.error("Could not load configuration file: %s\n%s" % + (parsed_args.config_file_path, + e)) + raise + + if parsed_args.log_config_path: + try: + lc.fileConfig(self.log_config_path, + disable_existing_loggers=disable_existing_loggers) + except: + logging.error("Could not load log configuration file: %s" % + (parsed_args.log_config_path)) + else: + # TODO: configure default logging + pass + + def create_argparser(self): + '''Initialization for the command-line parsing stage. + + An application specific prefix is applied to argument names. + + Parameters + ---------- + prog : string + Application specific prefix for argument names. + description : string + A brief 'help' description of the application. + + Returns + ------- + argParse.ArgumentParser + The initialized argument parser object. + + Notes + ----- + Defaults are set at the first environment reading. + Command line args only override them when present + ''' + parser = argparse.ArgumentParser(prog=self.application_name, + description=self.help) + for key, value in self.defaults.items(): + if key == 'config_file_path': + parser.add_argument( + "%s" % (key), default=None, help=value['help']) + else: + parser.add_argument("--%s" % + (key), default=None, help=value['help']) + + return parser + + def parse_command_line_args(self, args): + '''Simply call the internal argparser object. + + Parameters + ---------- + args : array + Parameters passed to the application. + + Returns + ------- + Namespace + Parsed paramenters. + ''' + return self.argparser.parse_args(args) + + def apply_configuration_from_command_line(self, parsed_args): + '''Read application configuration variables from the command line. + + Unassigned variables are left unchanged if previously assigned, + set to their default values, + or None if no default is specified at init time. + Assigned variables will overwrite the previous value. + + see: https://docs.python.org/2/howto/argparse.html + + Parameters + ---------- + parsed_args : dict + the arguments as parsed from the command line. + + ''' + logging.info('command_line args: %s' % (parsed_args)) + + for key in self.defaults: + parsed_value = getattr(parsed_args, key) + if parsed_value and getattr(self, key) is None: + setattr(self, key, parsed_value) + + def apply_configuration_from_environment(self): + '''Read application configuration variables from the environment. + + The variable names are upper case and have a + prefix defined by the application. + + See: https://docs.python.org/2/library/os.html + ''' + for key in self.defaults: + environment_variable = "%s_%s" % ( + self.application_name.upper(), key.upper()) + environment_value = os.environ.get(environment_variable) + if environment_value: + setattr(self, key, environment_value) + + def from_json_file(self, json_path): + '''Read an application configuration from a JSON format file. + + Parameters + ---------- + json_path : string + Path to the JSON file. + + Returns + ------- + string + An application configuration in INI format + + ''' + description = JsonComments.read_file(json_path) + + return self.to_config_string(description) + + def from_json_string(self, json_string): + '''Read a configuration from a JSON format string. + + Parameters + ---------- + json_string : string + A JSON-formatted string containing an application configuration. + + Returns + ------- + string + An application configuration in INI format + ''' + description = JsonComments.read_string(json_string) + + return self.to_config_string(description) + + def to_config_string(self, description): + '''Create a configuration string from a dict. + + Parameters + ---------- + description : dict + Configuration options for an application. + + Returns + ------- + string + Equivalent configuration as an INI format string + + Notes + ----- + The Python configparser library natively supports this functionality in Python 3. + ''' + if 'biophys' not in description: + bps_config_string = '[biophys]\n\n' + return bps_config_string + + bps_config = description['biophys'][0] + + cfg_array = ['[biophys]'] + + if 'log_config_path' in bps_config: + cfg_array.append(str('log_config_path: %s' % + bps_config['log_config_path'])) + + if 'debug' in bps_config: + cfg_array.append(str('debug: %s' % bps_config['debug'])) + + if 'model_file' in bps_config: + cfg_array.append(str('model_file: %s' % + ','.join(bps_config['model_file']))) + + cfg_array.append("\n") + + bps_cfg_string = "\n".join(cfg_array) + ApplicationConfig._log.info(bps_cfg_string) + + return bps_cfg_string + + def apply_configuration_from_file(self, config_file_path): + ''' Read application configuration variables from a .conf file. + + Unassigned variables are set to their default values + or None if no default is specified at init time. + The variables are found in a section named by the application. + + Parameters + ---------- + config_file_path : string + path to to an INI (.conf) or JSON format application config file. + + Returns + ------- + + see: https://docs.python.org/2/library/configparser.html + ''' + none_defaults = {} + + # defaults are set in environment + # they are only overriden by the config file if present + for key in self.defaults: + none_defaults[key] = None + + logging.info("none_defaults: %s" % (none_defaults)) + + config = None + + try: + config = ConfigParser(defaults=none_defaults, + allow_no_value=True) + except: + logging.warn( + "This python installation does not support configuration defaults.") + config = ConfigParser() + + if config_file_path.endswith('.json'): + cfg_string = self.from_json_file(config_file_path) + try: + config.readfp(io.BytesIO(cfg_string)) + except (NameError, TypeError): + config.read_string(cfg_string) # Python 3 + else: + config.read(config_file_path) + + for key in self.defaults: + try: + file_value = config.get(self.application_name, key) + if file_value: + logging.info("setting %s to %s" % (key, file_value)) + setattr(self, key, file_value) + except: + logging.info("Configuration option not specified: %s" % + (key)) diff --git a/config/app/logging.conf b/config/app/logging.conf new file mode 100644 index 0000000000..065236fb3a --- /dev/null +++ b/config/app/logging.conf @@ -0,0 +1,35 @@ +[loggers] +keys=root,allensdk + +[handlers] +keys=consoleHandler,logFileHandler + +[formatters] +keys=simpleFormatter + +[logger_root] +level=ERROR +#handlers=consoleHandler,logFileHandler +handlers=consoleHandler + +[logger_allensdk] +level=ERROR +#handlers=consoleHandler,logFileHandler +handlers=consoleHandler +qualname=allensdk +propagate=0 + +[handler_consoleHandler] +class=StreamHandler +level=DEBUG +formatter=simpleFormatter +args=(sys.stdout,) + +[handler_logFileHandler] +class=FileHandler +formatter=simpleFormatter +args=('debug.log', 'w') + +[formatter_simpleFormatter] +format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s +datefmt=%m-%d %H:%M \ No newline at end of file diff --git a/config/manifest.py b/config/manifest.py new file mode 100644 index 0000000000..bbb8b2b6be --- /dev/null +++ b/config/manifest.py @@ -0,0 +1,416 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2014-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import sys +import re +import logging +import errno +import pandas as pd +from pathlib import Path + + +class ManifestVersionError(Exception): + + @property + def outdated(self): + try: + return self.found_version < self.version + except TypeError: + return + + def __init__(self, message, version, found_version): + super(ManifestVersionError, self).__init__(message) + self.found_version = found_version + self.version = version + + +class Manifest(object): + """Manages the location of external files + referenced in an Allen SDK configuration """ + + DIR = 'dir' + FILE = 'file' + DIRNAME = 'dir_name' + VERSION = 'manifest_version' + + log = logging.getLogger(__name__) + + def __init__(self, config=None, relative_base_dir='.', version=None): + self.path_info = {} + self.relative_base_dir = relative_base_dir + + if config is not None: + self.load_config(config, version=version) + + def load_config(self, config, version=None): + ''' Load paths into the manifest from an Allen SDK config section. + + Parameters + ---------- + config : Config + Manifest section of an Allen SDK config. + ''' + found_version = None + for path_info in config: + path_type = path_info['type'] + path_format = None + if 'format' in path_info: + path_format = path_info['format'] + + if path_type == 'file': + try: + parent_key = path_info['parent_key'] + except: + parent_key = None + + self.add_file(path_info['key'], + path_info['spec'], + parent_key, + path_format) + elif path_type == 'dir': + try: + parent_key = path_info['parent_key'] + except: + parent_key = None + + spec = path_info['spec'] + absolute = False + if spec[0] == '/': + absolute = True + self.add_path(path_info['key'], + path_info['spec'], + path_type, + absolute, + path_format, + parent_key) + + elif path_type == self.VERSION: + found_version = path_info['value'] + else: + Manifest.log.warning("Unknown path type in manifest: %s" % + (path_type)) + + + if found_version != version: + raise ManifestVersionError("", version, found_version) + self.version = version + + def add_path(self, key, path, path_type=DIR, + absolute=True, path_format=None, parent_key=None): + '''Insert a new entry. + + Parameters + ---------- + key : string + Identifier for referencing the entry. + path : string + Specification for a path using %s, %d style substitution. + path_type : string enumeration + 'dir' (default) or 'file' + absolute : boolean + Is the spec relative to the process current directory. + path_format : string, optional + Indicate a known file type for further parsing. + parent_key : string + Refer to another entry. + ''' + if parent_key: + path_args = [] + + try: + parent_path = self.path_info[parent_key]['spec'] + path_args.append(parent_path) + except: + Manifest.log.error( + "cannot resolve directory key %s" % (parent_key)) + raise + path_args.extend(path.split('/')) + path = os.path.join(*path_args) + + # TODO: relative paths need to be considered better + if absolute is True: + path = os.path.abspath(path) + else: + path = os.path.abspath(os.path.join(self.relative_base_dir, path)) + + if path_type == Manifest.DIRNAME: + path = os.path.dirname(path) + + self.path_info[key] = {'type': path_type, + 'spec': path} + + if path_type == Manifest.FILE and path_format is not None: + self.path_info[key]['format'] = path_format + + def add_paths(self, path_info): + ''' add information about paths stored in the manifest. + + Parameters + path_info : dict + Information about the new paths + ''' + for path_key, path_data in path_info.items(): + path_format = None + + if 'format' in path_data: + path_format = path_data['format'] + + Manifest.log.info("Adding path. type: %s, format: %s, spec: %s" % + (path_data['type'], + path_data['spec'], + path_format)) + entry = {'type': path_data['type'], + 'spec': path_data['spec'] + } + if path_format is not None: + entry['format'] = path_format + + self.path_info[path_key] = entry + + def add_file(self, + file_key, + file_name, + dir_key=None, + path_format=None): + '''Insert a new file entry. + + Parameters + ---------- + file_key : string + Reference to the entry. + file_name : string + Subtitutions of the %s, %d style allowed. + dir_key : string + Reference to the parent directory entry. + path_format : string, optional + File type for further parsing. + ''' + path_args = [] + + if dir_key: + try: + dir_path = self.path_info[dir_key]['spec'] + path_args.append(dir_path) + except: + Manifest.log.error( + "cannot resolve directory key %s" % (dir_key)) + raise + elif not file_name.startswith('/'): + path_args.append(os.curdir) + else: + path_args.append(os.path.sep) + + path_args.extend(file_name.split('/')) + file_path = os.path.join(*path_args) + + self.path_info[file_key] = {'type': Manifest.FILE, + 'spec': file_path} + + if path_format: + self.path_info[file_key]['format'] = path_format + + def get_path(self, path_key, *args): + '''Retrieve an entry with substitutions. + + Parameters + ---------- + path_key : string + Refer to the entry to retrieve. + args : any types, optional + arguments to be substituted into the path spec for %s, %d, etc. + + Returns + ------- + string + Path with parent structure and substitutions applied. + ''' + path_spec = self.path_info[path_key]['spec'] + + if args is not None and len(args) != 0: + path = path_spec % args + else: + path = path_spec + + return path + + def get_format(self, path_key): + '''Retrieve the type of a path entry. + + Parameters + ---------- + path_key : string + reference to the entry + + Returns + ------- + string + File type. + ''' + path_entry = self.path_info[path_key] + path_format = None + + if 'format' in path_entry: + path_format = path_entry['format'] + + return path_format + + @classmethod + def safe_make_parent_dirs(cls, file_name): + ''' Create a parent directories for file. + + Parameters + ---------- + file_name : string + + Returns + ------- + leftmost : string + most rootward directory created + + ''' + + dirname = os.path.dirname(file_name) + + # do nothing if there are no parent directories + if not dirname: + return + + return Manifest.safe_mkdir(dirname) + + @classmethod + def safe_mkdir(cls, directory): + '''Create path if not already there. + + Parameters + ---------- + directory : string + create it if it doesn't exist + + Returns + ------- + leftmost : string + most rootward directory created + + ''' + + parts = Path(directory).parts + sub_paths = [Path(parts[0])] + for part in parts[1:]: + sub_paths.append(sub_paths[-1] / part) + + leftmost = None + for sub_path in sub_paths: + if not sub_path.exists(): + leftmost = str(sub_path) + + try: + os.makedirs(directory) + except OSError as e: + if ((sys.platform == "darwin") and (e.errno == errno.EISDIR) and \ + (e.filename == "/")): + # undocumented behavior of mkdir on OSX where for / it raises + # EISDIR and not EEXIST + # https://bugs.python.org/issue24231 (old but still holds true) + pass + elif sys.platform == "win32" and e.errno == errno.EACCES: + root_path = os.path.abspath(os.sep) + if e.filename == root_path or \ + e.filename == root_path.replace("\\", "/"): + # When attempting to os.makedirs the root drive letter on + # Windows, EACCES is raised, not EEXIST + pass + else: + raise + elif e.errno == errno.EEXIST: + pass + else: + raise + + return leftmost + + + def create_dir(self, path_key): + '''Make a directory for an entry. + + Parameters + ---------- + path_key : string + Reference to the entry. + ''' + dir_path = self.get_path(path_key) + Manifest.safe_mkdir(dir_path) + + def check_dir(self, path_key, do_exit=False): + '''Verify a directories existence or optionally exit. + + Parameters + ---------- + path_key : string + Reference to the entry. + do_exit : boolean + What to do if the directory is not present. + ''' + dir_path = self.get_path(path_key) + + if not os.path.exists(dir_path): + Manifest.log.fatal('Directory %s does not exist; exiting.' % + (dir_path)) + if do_exit is True: + quit() + + def resolve_paths(self, description_dict, suffix='_key'): + '''Walk input items and expand those that refer to a manifest entry. + + Parameters + ---------- + description_dict : dict + Any entries with key names ending in suffix will be expanded. + suffix : string + Indicates the entries to be expanded. + ''' + key_pattern = re.compile('(.*)%s$' % (suffix)) + + for description_key, manifest_key in description_dict.items(): + m = key_pattern.match(description_key) + if m: + real_key = m.group(1) # i.e. job_dir_key -> job_dir + filename = self.get_path(manifest_key) + description_dict[real_key] = filename + del description_dict[description_key] + + def as_dataframe(self): + return pd.DataFrame.from_dict(self.path_info, + orient='index') diff --git a/config/manifest_builder.py b/config/manifest_builder.py new file mode 100644 index 0000000000..328f07b063 --- /dev/null +++ b/config/manifest_builder.py @@ -0,0 +1,110 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import allensdk.core.json_utilities as ju +import logging +from allensdk.config.manifest import Manifest +import pandas as pd +import six + + +class ManifestBuilder(object): + df_columns = ['key', 'parent_key', 'spec', 'type', 'format'] + + def __init__(self): + self._log = logging.getLogger(__name__) + self.path_info = [] + self.sections = {} + + def set_version(self, value): + self.path_info.append({'type': Manifest.VERSION, 'value': value}) + + def add_path(self, key, spec, + typename='dir', + parent_key=None, + format=None): + entry = { + 'key': key, + 'type': typename, + 'spec': spec} + + if format is not None: + entry['format'] = format + + if parent_key is not None: + entry['parent_key'] = parent_key + + self.path_info.append(entry) + + def add_section(self, name, contents): + self.sections[name] = contents + + def write_json_file(self, path, overwrite=False): + mode = 'wb' + + if overwrite is True: + mode = 'wb+' + + json_string = self.write_json_string() + + with open(path, mode) as f: + try: + f.write(json_string) # Python 2.7 + except TypeError: + f.write(bytes(json_string, 'utf-8')) # Python 3 + + def get_config(self): + wrapper = {"manifest": self.path_info} + for section in self.sections.values(): + wrapper.update(section) + + return wrapper + + def get_manifest(self): + return Manifest(self.path_info) + + def write_json_string(self): + config = self.get_config() + return ju.write_string(config) + + def as_dataframe(self): + return pd.DataFrame(self.path_info, + columns=ManifestBuilder.df_columns) + + def from_dataframe(self, df): + self.path_info = {} + + for _, k, p, s, t, f in six.iteritems(df.loc[:, ManifestBuilder.df_columns]): + self.add_path(k, s, typename=t, parent=p, format=f) diff --git a/config/model/__init__.py b/config/model/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/config/model/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/config/model/__pycache__/__init__.cpython-37.pyc b/config/model/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dbbb392f852ff5bba23c57c9fa178c47e9f7d33 GIT binary patch literal 189 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUun)(F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>AE+xWGhIJ7KP5FsKR!M)FS8^*Uaz3?7KaT`tTZRp4rKpl HAZ7pnf?_pb literal 0 HcmV?d00001 diff --git a/config/model/__pycache__/description.cpython-37.pyc b/config/model/__pycache__/description.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e587b2199fc8f62d39ce1bd33ece9036cedbc6e0 GIT binary patch literal 3205 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 CcSJ(~ literal 0 HcmV?d00001 diff --git a/config/model/__pycache__/description_parser.cpython-37.pyc b/config/model/__pycache__/description_parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f21f0f2b441fec53b4bdc3c88c4bc1790f4da6d GIT binary patch literal 2457 zcmb_eL2u(k6!wfA$4%2kyX+RJV#OdKM8vKuKyX+g)ZH#1K^0Z35Rw(intCRQTgNst zPP?_-1GEQD{DxMXIPrgc<;0CMC*B(;X|}0ANQ^Y&$;^9i-hA(SZ}Mzoqhmo!fBAv` z_L^n=jz8wjfyoYZ{T>X$5+tz#{L+L>Xh4ber6p|PTv)=9_PHH6g1oSLtv^88>i0;! z{#@!v#d#5DX@raOX2WC$x_$<Ov;rcmfJ*z)k=7LnT7n3AVFj+}3P-dqNYEA=!WC_p zdBPKGu(u{UVjaF6VZ)Jk>bpxv?Q^B2iU`=ohF|Qv&^2C3SfE1szrs*ES|&q<t7iBs z-+eOp7PR$%kGb#<_z6!>2TxNTWvSpF4P<((2U#vt9l@C8<5NA@iw_1mF685!M@M`l zK{rW2LL6;_)-WDzPck8sZE=l8m>VDc{IvGMFiztl4BtopC=3=Uw^pv>&&B!?dW)?E z9p_&|*B`=AQ9+J8b*He-tutC#m!u+Bq_RSoAJRj+A{DLdp<OvY69Uoz1LY3^8-o}V zyx=UAQb@sunPQyjcrr~mhR^SG*sOstpU46*S}Z+Yw8hfWW!V!Z;;2|`p`Bd=%v2fU zY^bscLrCIu#BwE%<7}$gFixcQ7iwBY=m}WUg#y7xEHljF$wCAze>dg@YjB^NpKBHw zQ<4i77c5TUM?7T3SekQ~$fRazRxq8*C?1|(pWE*_3d2(0Z-N#AHlci3K!m}a+C`I6 z)ee4pErn63*U)zeaxt#gmyoF2GgoT&=!C10zGj|sK~G^W`p~sW%8o}|+9mgCxw*;* zJTAh+u;CYdG#u~3q=0NaCqF_WL6Gh8gMW{369kC40oN~CAHawwc_Jq=Eu?tFrdlE= zrUxuaxYn5AYoEW2q=~}p=D|9$C~S-<^h9mIP`hJ;(vADp>v)Tq^bW{1{HNu^+wVJ* zjBF6ahU~{~uDt~l;Jk&LKeH<v*<aBsC{v~^(ekGk{8*ZZze11yOl^#93MsH);w${? z<4(53EFjv6g7UD;D5^a0wr-gX;FlqdH#cl>t6j6HZa}8)f#P%Mrj%J;hn8=wf@M@A zQ%pb<ts`UxrahQoflaIlIWyo0JE0T%%m$#GGp8b#P;{?|@+%5u#7VcziVG_{m2FnM zq9xkMuF3&+dF7wG<1Cw#!*Byo#w_G%lW-=>GBx4F{|ojPP^HlJA{&>?e<O>jN>^&s zB33J)Eq1VqJk4{J<tpZdM8=y-T?bI%djj--@RiQe6+^JGxqliBM=Lx1vgIFwO6fx7 z2Z8dfD4Qn2)E$8(brPqudIUuV;Oe=-$MeU;Z&>S_$HZ^;wJ{fpm6t_501tyt{#n=f zaGUZbDA%4$g+7Ukv4Z~v@T?n>s@Gv|j4LDLHZ}1kNs-<A&^5Bvy3-|H>d+4H2z2Vv z^4%3^{M(9akM{dLyAQ)UzLS`AVOV#<5HOfRfeq_!7=AzH$!w>cWTO#04fWbc7JD#< zx@^OmYJ(T1xT?E2L$6E*F8Pghq$$FfD)^5_WBCG?sb_cYbsVp&a0h^R6F$M)w`02$ gissdDvx7r;xs2{@$JO4a&22t=2hT(|JkquQ2Bb@iS^xk5 literal 0 HcmV?d00001 diff --git a/config/model/description.py b/config/model/description.py new file mode 100644 index 0000000000..3de0d2fe3f --- /dev/null +++ b/config/model/description.py @@ -0,0 +1,132 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2014-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging + +from allensdk.config.manifest import Manifest + + +class Description(object): + _log = logging.getLogger(__name__) + + def __init__(self): + self.data = {} + self.reserved_data = [] + self.manifest = Manifest() + + def update_data(self, data, section=None): + '''Merge configuration data possibly from multiple files. + + Parameters + ---------- + data : dict + Configuration structure to add. + section : string, optional + What configuration section to read it into if the file does not specify. + ''' + if section is None: + for (section, entries) in data.items(): + if section not in self.data: + self.data[section] = entries + else: + self.data[section].extend(entries) + else: + if section not in self.data: + self.data[section] = [] + + self.data[section].append(data) + + def is_empty(self): + '''Check if anything is in the object. + + Returns + ------- + boolean + true if self.data is missing or empty + ''' + if self.data: + return False + + return True + + def unpack(self, data, section=None): + '''Read the manifest and other stand-alone configuration structure, + or insert a configuration object into a section of an existing configuration. + + Parameters + ---------- + data : dict + A configuration object including top level sections, + or an configuration object to be placed within a section. + section : string, optional. + If this is present, place data within an existing section array. + ''' + if section is None: + self.unpack_manifest(data) + self.update_data(data) + else: + self.update_data(data, section) + + def unpack_manifest(self, data): + '''Pull the manifest configuration section into a separate place. + + Parameters + ---------- + data : dict + A configuration structure that still has a manifest section. + ''' + data_manifest = data.pop("manifest", {}) + reserved_data = {"manifest": data_manifest} + self.reserved_data.append(reserved_data) + self.manifest.load_config(data_manifest) + + def fix_unary_sections(self, section_names=None): + ''' Wrap section contents that don't have the proper + array surrounding them in an array. + + Parameters + ---------- + section_names : list of strings, optional + Keys of sections that might not be in array form. + ''' + if section_names is None: + section_names = [] + + for section in section_names: + if section in self.data: + if type(self.data[section]) is dict: + self.data[section] = [self.data[section]] + Description._log.warn( + "wrapped description section %s in an array." % (section)) diff --git a/config/model/description_parser.py b/config/model/description_parser.py new file mode 100644 index 0000000000..2a2ae864dd --- /dev/null +++ b/config/model/description_parser.py @@ -0,0 +1,106 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2014-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +from allensdk.config.model.description import Description + + +class DescriptionParser(object): + log = logging.getLogger(__name__) + + def __init__(self): + pass + + def read(self, file_path, description=None, section=None, **kwargs): + '''Parse data needed for a simulation. + + Parameters + ---------- + description : dict + Configuration from parsing previous files. + section : string, optional + What configuration section to read it into if the file does not specify. + ''' + if description is None: + description = Description() + + self.reader = self.parser_for_extension(file_path) + self.reader.read(file_path, description, section, **kwargs) + + return description + + def read_string(self, data_string, description=None, section=None, header=None): + '''Parse data needed for a simulation from a string.''' + raise Exception("Not implemented, use a sub class") + + def write(self, filename, description): + """Save the configuration. + + Parameters + ---------- + filename : string + Name of the file to write. + """ + writer = self.parser_for_extension(filename) + + writer.write(filename, description) + + def parser_for_extension(self, filename): + '''Choose a subclass that can read the format. + + Parameters + ---------- + filename : string + For the extension. + + Returns + ------- + DescriptionParser + Appropriate subclass. + ''' + # Circular imports + from allensdk.config.model.formats.json_description_parser import JsonDescriptionParser + from allensdk.config.model.formats.pycfg_description_parser import PycfgDescriptionParser + + parser = None + + if filename.endswith('.json'): + parser = JsonDescriptionParser() + elif filename.endswith('.pycfg'): + parser = PycfgDescriptionParser() + else: + raise Exception('could not determine file format') + + return parser diff --git a/config/model/formats/__init__.py b/config/model/formats/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/config/model/formats/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/config/model/formats/__pycache__/__init__.cpython-37.pyc b/config/model/formats/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5498742df72ea28a3dbe3e8c61a6aee0346f95a8 GIT binary patch literal 197 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUwO_}F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>AE+xWGhIJ7KP5FsKP|r~H?gExKR!M)FS8^*Uaz3?7KaT` Pt~4jr4&;u{K+FIDR;@Ub literal 0 HcmV?d00001 diff --git a/config/model/formats/__pycache__/hdf5_util.cpython-37.pyc b/config/model/formats/__pycache__/hdf5_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c10a96dac0861c310eb8725646cb91e7428e3240 GIT binary patch literal 1390 zcma)6UyB<z5SLck^`7rflX4A7`(jG}IkYxSI0#1xNiIzT4F}B;a$O9IZYA66TWhzH z+=~w<(B@uCzrr1T>Q~ZhpZXR0)R|rETp*MRG#brlB+c(P(u2*-Hi4%9_(hzr6Y>{M zmW_jQ54ybrLJ~;}k~AYt0+<H{oAQLy#ug^wcSJJD&xqtIdd-rSqz9xM{teM&ze{~P zvnHJiXYv;r+LkQ<<sNkV2?#|JDhcdQWpG9k*6f&Y8OjLep=`mPv5z0i;m$Lc7a4^h zY&bILd(iC_5RRNv7hKQ<Ntq-NMfbbhw~BH!%Js;vjg)%=x-vdaQ!S<{O+5oI+>~2Y z4F4o%4Yv8G+}j;Iv&z_k7z^1u5+_2>2luteN-f3hfzm(QL0KtnGmvF9p4-8b{Agfv zr@pF0b}U8;Vv7P+$m2dl4f9cdT1r*)hou2PY<~>dq%%mTSIzM{xz1gheu=3dI)t8H zT_)UHdb8RCPRtr_T4z21WqucPUr<Reg5SS*8Mt5($lwOBbAy1!S6bL;L-rb&`hh$p zhvYfYpK;>Yaob1=pi;6R6MhcpFX%OLK`Hr_{77_g2&@C9t$k08=TbP)^Q~OVJX6+3 zpj6JBe!W-D3aLML9ixQo+(!%!9)90>{P59EXYb%?rvYPTgv(34+xgUXBhSY>00MuM z7s_CYe(l>AnW}JwY2iFn#+0VZOk8`1urRHJ8+!%?R&&+}tZdKm<UVNjeGr5Obc=4# zHvJIB2*%UR6|lH6Lol&n@vlHVgUS5x5~vSevIUy}sEc629G`@e{l)+)v~jRSU~65n zg<y-{*q#G;Z^69=aKBo?-9BIc54cavCS0c*)B`*SH?Nf00+V?U#ObXS<|hU!@PC26 zVerA2t00oC3~+ENMM|x5^(j8kRT9o}?e5ekB@ybkZ`CIn1h!#@p9rJ7ye7tMgW1!m z`2gJr<t0|a`fj^myhO`3-KHNeY1vxQQZL=_Mkc}y+i40<X9kp~ej`nPnu(%$y9T~5 zVy>b12*sNdYYmIRAh|c8TihxRVivF0wr*Slkc4_Rt>)%Bc#{pA<<-1rD`DXAV<8%> g2_Kb56P39-?p=rY_?zZ}ckw&3SfeqGq2^-tFRZpdwEzGB literal 0 HcmV?d00001 diff --git a/config/model/formats/__pycache__/json_description_parser.cpython-37.pyc b/config/model/formats/__pycache__/json_description_parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29513ce37904313b1d3230d1d91d851ed8d34b19 GIT binary patch literal 3585 zcmeGfOK;pncxG(xdLIdW&?4GWxe=5uv>PEfMF;@_AxgC^Ev3bZWKBG?Stnk5neh^K z*&HB|daAha0}^rKFZs%;SB{+czVSZXHc$`};?Rlw`P=c#_kQKWrKLK7mHhlYe{`CV zU-8Fm*?_zckG=&!5J6+&<D12_&wSRme2e05E4KTN?-<;UEB&fpHMkSI{hD8+<P#z) zqIy6?RXY2YUl;TaX}OPpD(SRXZi``mkUI!<i{>Xkk~&n;AdAxE7FSv-*ld(G;b-%@ zPLuVt-<L_ILnJg?))dj#0g=R~g7{2Yhqfd~)OQ|`E)`U;1J|#Jrm%%`K>ey%G6GWH z6|Sfq5Wgnsq5<#v17Z`u0pc#_XOL$}j6$}MP8s4Gnd75R0mw*3CuE-;vLk}_03x*0 zvT{cc2U4jj9Le1vh>|D^0?^6UGVa2=76f6;wGM(`$nSgWYa4gL1bTz_xM*+kU7n0K zK1g_&CW61cA(L<PMmms*4gscv-bioUh&DHLl*wxY9`5ih33uZdPKcdVxYdoeR{N=t z@oG0!eV*ynZO|(a3!?`EWA*l6q-r2!8x>*z2pwNM)&}jF7M&1d23G|h#6N>aUjZ;- zg6_C#IV1aIk7e|bP3RHbb0+N2nm7~dh*3BLHe&oPFf+#WxEH4VK`b-rrOE@bvWUm9 zhe`|;#|UZH>)v$19o~ntO3$~h&DVU(Xsa_7C0pK_S0M9`Na@pLFwDFxMSfbg=if>e zf{Ud<xay@QSb01@i*)Ywq>_dXlIzKWo_Ioh;Mes!X(B<{MDBWsMcNCM<e3x;?plVZ z?p)-5!_?c2vR;%Jp-NhnOnF;oLzO&b$GLtb?dN-_^B16IWb9X>YuFvDy~l+>CFeBm zOtl0Hq)9yT^gxDDH<H4GVD(luxsoehy15O<G>FeL4|dSTn_xerg*f+S#^Orx(ZYtE zmaQC!MTOCs*TBRg=ti;3E5ihHrBzW_4f7gqLKbAbyiw94uTJUam7QI#wlq{Oo^jPg zk_If{Z5!#n1(-Ia^|VVXtWKM3eD3(<!Q;>K2BW7~&+}&5{QjqT(=d5c6i)R5#Q7|3 z8l}>zPGVAE8&oh>5cML0#}h@Jg}oc_l=Fl^o?QC#JP8W6AvRfD*kZ6pt;3_g1TcCd zBNOQG`|QWFdloccw#_D%V8VI`!^%A(?9a(<av!kdvQ08;r><^MXwT4m$hLjx2xmgi z!lXdS59BM7u={WWno?!_(>(<(^~sW1l$+~!ZgxDZ8Kp}0_nJ|ux;)-f<`ofh;-)Eh z$ZHpcSQNCJ?moiK3{yiTN(2l;o$=N6bQp`|^{hDT&3eCw-tkHd*SyzstCHI|Jt(AN zoRrr-{x+1RpXFAZZsj(Vx&#WRsf;danLw8{{>^Fk37_VUk+6sEI01mTj5g^-woEIu zPF*%Wf4pzat<Ve^a0$KZ!ehL;2FU0XdUe}OZV%ZW!$ASO$H05<%)JLQp0J+soHPFI zS)MCm>c8^c+_TT>u}_aCCeC0Ogdr#zo9V|(yCx(}&t1fYdKrw?qUs#H{#ihDT8={V z7YTa-u~!gW1kkcf5EQBX67D{p(0S9iahjvw!2!JtfGjcazDsSo46!g?`HKjcUTv`s z{9gc169;4rw;;&tK>%ax5E^rkH-q5oA&;kDst~4IFwW(*Et%Z_9Hwg{G*$+61_72D zbqT==fP85>Vuv!0gJ7Wsn5=<^u#cMo{Y^kLYU$ECYg+a5^$YH4^QF~LmtjA*F|CU9 zLA&`^X8G1G#?-c%wcDk<n~v8CYnOlNna9n<;$JA8Q?iXrgJBlMQ5H#U<{2Z^LX`qD Y1Bv@?VYv5R1&*fJy7UCN0{*N&01Jb_1^@s6 literal 0 HcmV?d00001 diff --git a/config/model/formats/__pycache__/pycfg_description_parser.cpython-37.pyc b/config/model/formats/__pycache__/pycfg_description_parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e312b02d5b2695e744e1dbe65bf1b38e824431d8 GIT binary patch literal 2924 zcmcguUys{F5Z_%pj+4tB{l`%#v~HoauDBc$FX#jadPPW3Mb}o)Vns5pca!+evBR#z zHIah^cT%4!zQUb&;sfwy_LZl81)i9(lU&+f3q^vJcD-xwcxGpQ`<uDGyj&;Hl3#xc z)=v`h2QFsKgvqDS)eRUp;WQ>5K3Por)T4doF^X#=Hu|P#7IQPM^exY#<O{+p+}bDH z64svKRXM#w-0EZa6KT0jTZ4g&l1x_zomBRN%%ytihESo523eFQuspf2+zO-;GDP87 zGo};uB}@eIC?_5h#(^owA@wQ`Nr!UE*}m;ryunRg*{5K{GPigYW;VBZZJ&5GUgt~j ztUn|s@s_~E6}`GO3On6rwbQ9ae4=*j>J$ta$!JdY*a15v=mhu+ZMlZ7sNq0JX~7n4 z`+k%}neW5NOeNwDJZrum#(`44{~P)9$IXrQ*KkPH4tfD^-Vb(zWYqpF3Bokt!3S-T z{Gi(DKqM-JF&*?qs(mxM-&Rp3)&@bi6Lba0#xd;RJL@3TiMs3kl#6)1bg^0=;K6); z<Ys?RIJP+$NgJ$O!xJ$W2pwNI-V4pyIa(pY16vh(4f<Em)rT<T<^h0(vqLtifM+N- z_Si3HCst0jS#BK|ha_jYkyp6+$h<>tk=x`RfCao}1>iq&TLjz*9PmXH#L-xAXTf5p zBhx;7-5O=RG;ywi>2N03=|r(;*6Yr+0bqi@$iSWRS8MY&e}zH`>~l68l>r>P^Dp?D z7Jf-PPSz7nspe@dw?#IT$ulbEe_6oL{2l&zvk1;m1_*U0y}vEOtU2EScSDL!^gt6$ zCBVe$fkT9Bxu!O{BGV?KKrcyn>z8J06Blk(Vi>$v$}r>MAih~oFD>{_R~0A&wc6U* z4P;lz6Ck5$M=rs$92z(~1H=2!6~dP+H&}y?&pihdsC^Cxv;m<}z~LTDa>nV7EmtzK zM<xuw0np$Ef`glRC8r&>N+vWS6Dwl?7GRA%V^YnGyqa5kz%V&n+1JU$&e?&P+c`+W zI|gvEgLD5DE~VdI8Zd(bbyKe&kD4hkO9jqul=YsA<puTs4U$?#aODaFVf@x*Rj<$J zVUYuzkDbd(TQeky2O{*&9JkS}NQ|q5G(mJVO#1^sn0y0Q)-XW|a%&|5m!I&Hd=;fu zad-`f0&px*+6;l6w8?`kcp81DVdHh^3dP8ZO)b`7jMkY+8?;Vs+F;{LFF@loL?LoC zHZ&Z8xd~l;1H<TAMgVLSm}zxl08268CIf-_$e`pd;bzH8cS-WDNit)nF1IMK6F`q_ zn+FvRz+Ht*L&?wNTaqwfFyJ!R8Xw-3z{mw@EL=M$OaFh;LIyy^yJ*n@ztG*sNb*Q6 zQNl%%wZ_fObQtsGN>*-mX7P8*NG>w)2EfI&BqlzIzmXSU(6!GWgrZ2@+KAJxHi29c z*DUa$?HSRQP&kWHPtuL96h?jrUlihl*bD-Fo~=*|!_CHTJ}20PSXksNkiu|dsEaU{ zsX3?HMIrEr0rwzl7~|hx5F()7EE}yA#R+7dCvNk?ef?+oWf1@y&dX$jW5Omc!ogfB zFX4kpJZj;3*C?D^xYlcw++SYir+wTgoHe}~3gi{~ir6b`{Pv67JC$%*3o1A04XkD` zZ~DHj`##hdLr68gZutK9!yul1sR9hTkW+OHlGaU_Ln-tQ8jY1kkzOR;a(M-Zt1#&0 zX+0E*IQIP`>*3H?q{<>MVLG}7UE#_GMrauIQ}y%q>7veZZTTK<Er5wG@-EJx+$>9? vW>FF~7eZ68ns@bY_f3l>SwRJ8#*u~P3@y_3N2NbL!Luqnt4&V;mK(-jCOh@P literal 0 HcmV?d00001 diff --git a/config/model/formats/hdf5_util.py b/config/model/formats/hdf5_util.py new file mode 100644 index 0000000000..2842b04be0 --- /dev/null +++ b/config/model/formats/hdf5_util.py @@ -0,0 +1,67 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import numpy as np +from scipy.sparse import csr_matrix +import logging + + +class Hdf5Util(object): + + def __init__(self): + self.log = logging.getLogger(__name__) + + def read(self, file_path): + try: + with h5py.File(file_path, 'r') as csr: + return csr_matrix((csr['data'][...], + csr['indices'][...], + csr['indptr'][...])) + except Exception: + self.log.error( + "Couldn't read AllenSDK HDF5 CSR configuration: %s" % file_path) + raise + + def write(self, file_path, m): + try: + with h5py.File(file_path, 'w') as csr: + csr.create_dataset('data', data=m.data, dtype=np.uint8) + csr.create_dataset('indices', data=m.indices, dtype=np.uint32) + csr.create_dataset('indptr', data=m.indptr, dtype=np.uint32) + except Exception: + self.log.warn( + "Couldn't write AllenSDK HDF5 CSR configuration: %s" % file_path) + raise diff --git a/config/model/formats/json_description_parser.py b/config/model/formats/json_description_parser.py new file mode 100644 index 0000000000..cda7448143 --- /dev/null +++ b/config/model/formats/json_description_parser.py @@ -0,0 +1,142 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +from json import dump, dumps +from allensdk.config.model.description_parser import DescriptionParser +from allensdk.config.model.description import Description +from allensdk.core.json_utilities import JsonComments + + +class JsonDescriptionParser(DescriptionParser): + log = logging.getLogger(__name__) + + def __init__(self): + super(JsonDescriptionParser, self).__init__() + + def read(self, file_path, description=None, section=None, **kwargs): + '''Parse a complete or partial configuration. + + Parameters + ---------- + json_string : string + Input to parse. + description : Description, optional + Where to put the parsed configuration. If None a new one is created. + section : string, optional + Where to put the parsed configuration within the description. + + Returns + ------- + Description + The input description with parsed configuration added. + + Section is only specified for "bare" objects that are to be added to a section array. + ''' + if description is None: + description = Description() + + data = JsonComments.read_file(file_path) + description.unpack(data, section) + + return description + + def read_string(self, json_string, description=None, section=None, **kwargs): + '''Parse a complete or partial configuration. + + Parameters + ---------- + json_string : string + Input to parse. + description : Description, optional + Where to put the parsed configuration. If None a new one is created. + section : string, optional + Where to put the parsed configuration within the description. + + Returns + ------- + Description + The input description with parsed configuration added. + + Section is only specified for "bare" objects that are to be added to a section array. + ''' + if description is None: + description = Description() + + data = JsonComments.read_string(json_string) + + description.unpack(data, section) + + return description + + def write(self, filename, description): + '''Write the description to a JSON file. + + Parameters + ---------- + description : Description + Object to write. + ''' + try: + with open(filename, 'w') as f: + dump(description.data, f, indent=2) + + except Exception: + self.log.warn( + "Couldn't write allensdk json description: %s" % filename) + raise + + return + + def write_string(self, description): + '''Write the description to a JSON string. + + Parameters + ---------- + description : Description + Object to write. + + Returns + ------- + string + JSON serialization of the input. + ''' + try: + json_string = dumps(description.data, + indent=2) + return json_string + except Exception: + self.log.warn("Couldn't write allensdk json description: %s") + raise diff --git a/config/model/formats/pycfg_description_parser.py b/config/model/formats/pycfg_description_parser.py new file mode 100644 index 0000000000..e84c96cd32 --- /dev/null +++ b/config/model/formats/pycfg_description_parser.py @@ -0,0 +1,125 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +from pprint import pprint, pformat +from allensdk.config.model.description import Description +from allensdk.config.model.description_parser import DescriptionParser + + +class PycfgDescriptionParser(DescriptionParser): + log = logging.getLogger(__name__) + + def __init__(self): + super(PycfgDescriptionParser, self).__init__() + + def read(self, pycfg_file_path, description=None, section=None, **kwargs): + '''Read a serialized description from a Python (.pycfg) file. + + Parameters + ---------- + filename : string + Name of the .pycfg file. + + Returns + ------- + Description + Configuration object. + ''' + header = kwargs.get('prefix', '') + + with open(pycfg_file_path, 'r') as f: + return self.read_string(f.read(), description, section, header=header) + + def read_string(self, python_string, description=None, section=None, **kwargs): + '''Read a serialized description from a Python (.pycfg) string. + + Parameters + ---------- + python_string : string + Python string with a serialized description. + + Returns + ------- + Description + Configuration object. + ''' + + if description is None: + description = Description() + + header = kwargs.get('header', '') + + python_string = "%s\n\nallensdk_description = %s" % ( + header, python_string) + + ns = {} + code = compile(python_string, 'string', 'exec') + exec(code, ns) + data = ns['allensdk_description'] + description.unpack(data, section) + + return description + + def write(self, filename, description): + '''Write the description to a Python (.pycfg) file. + + Parameters + ---------- + filename : string + Name of the file to write. + ''' + try: + with open(filename, 'w') as f: + pprint(description.data, f, indent=2) + + except Exception: + self.log.warn( + "Couldn't write allensdk python description: %s" % filename) + raise + + return + + def write_string(self, description): + '''Write the description to a pretty-printed Python string. + + Parameters + ---------- + description : Description + Configuration object to write. + ''' + pycfg_string = pformat(description.data, indent=2) + + return pycfg_string diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/core/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/core/__pycache__/__init__.cpython-37.pyc b/core/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e607e3f5b29820233e6ca590f4cc6f656db96ede GIT binary patch literal 181 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUvbV>F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KRLfBRX;vHGcU6wK3=b&@)n0pZhlH>PO2Tq-p@eH007FC BGD`pe literal 0 HcmV?d00001 diff --git a/core/__pycache__/auth_config.cpython-37.pyc b/core/__pycache__/auth_config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2438cd65202c24ca3878647b10cc237461738d1 GIT binary patch literal 600 zcmZ9I%}&BV6orS<LIG?2gZKm{EX0KyV~DXp6Nykr3o$lL$iS_%0orB;BrJUocdmRA z-=SOI!j&_G0%4l@(lhtmlbKsnlssZ9`1-&<0z$uBB#T!b*``$nK#&3f(jbBa8OVYR zxpCe`kcR>sfda>%eoA%<PT&;I;2bX2T7aU3%B8Xp7h27>HE7fft*skO=hnJ!>E=#7 zb*$b_bvtIyzbhid+{)VB)hz3!V>Y-)Y4=R6Y3wByHYZ7DqLb7_@8_zUo^3KovBwfN z3PjQz5{Jl8mh21+13YtMaY0=Yi(W|Qu^eGammz^zj6yOe8Sc+=$Q*ozB*$Qs)3#bS z^@eWrnp$h{tiM`zX)}|-UZJgZ?aS@k4l3V>s63J557+OVKD!BZu!o^C#7i8k94)}3 zFaUh(xWPMh!pIHih%t=36?Izv(4qd^y^io`g2yiFolcnpCO4yyxHot)_Xe#0%^z2y bRV-I$AuOiu1D^%GVh~b?Uq(t!<n7--ew3J@ literal 0 HcmV?d00001 diff --git a/core/__pycache__/authentication.cpython-37.pyc b/core/__pycache__/authentication.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39e27f2b8d862e05325fba3059bb1ff077eaecf8 GIT binary patch literal 4577 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/brain_observatory_cache.cpython-37.pyc b/core/__pycache__/brain_observatory_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10f8172714a4797da87eed44cdd6cb67034571bf GIT binary patch literal 22270 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 a-yHU227k&-ZUP>#>A#XP^8?BMyZt}=a=*_2 literal 0 HcmV?d00001 diff --git a/core/__pycache__/brain_observatory_nwb_data_set.cpython-37.pyc b/core/__pycache__/brain_observatory_nwb_data_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5946a060074d662f272a7bc5e9c0ec26d3286fc GIT binary patch literal 32463 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 AWB>pF literal 0 HcmV?d00001 diff --git a/core/__pycache__/cache_method_utilities.cpython-37.pyc b/core/__pycache__/cache_method_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebe5b7126047c6ed977764de7a624dbff8b30a06 GIT binary patch literal 1025 zcmZ`&&2AGh5Vm*IkcJc?!~rA@z92OR(gQbCp_cHYN;DThg=k^dSvy^~j-A@xrm5Nk z&<AP7iC5YyCtiUQ<K1k?1xp@}$1~qIGxEIH*k~hI>c?05EkNj(ztpP%$_{M%2n0h6 zOEg4p5DQp%g;>b(_iz|6{0?;+zrh0yQZMTTXjSxmP&gW5hP*cmuFx=Kp^qva_Gy}N zwx_J4D&_m!Wt#1aGoezvzzN~>DfVI8*C5Vz9J<CA$f2X)CU}WH_oCnuUk3BeMQ|P7 zAdC*s$=wEW4YxK9j@xD%gAJokVEqXD015%}fPMjrHd(AbmC}+V_4&l9<kTc&Ql>++ zBJfB?I#+CAvqUK3GU3lE^(D~eEaQfgQz`}P_Lk;7<+x&;5vNHBPtuaHBxGbJTn2!g zBojW-;+!Xh@l+e?wD|`z(2j!_brttaKw4DV8gZPf)CsL@9Sd|Na3W0}mrMzviY=2$ z<alYX3rZ!mmTYPRo^zrhCqruB1=?zpmRQs|BSyL7D@6~w&EghxXv$Mpv=6z1;zr!q zq9ttA+~W2MSaD~!26<(SHpTk;`IMJxH!K>K%W;9@qFIIhM5Y7Z;g9S;i#}LDjc7($ zZ$xL1c(ki%suiP8Bd$(uq^Dfj6r`SJa~r)CqsR)!pG;|bOb<E4N(mn9cng}&x2mKn zo;Y_x3MaVjP3NWwlxzMgmSeO200+2(@8R>u{r~;s-b#f7`17qeR&>JSxM;`mM6+Ca zy%WbLIhEB*$x>FgA~t~4_@VM+X}!|I<-HpkKO{v{kB*?xrEMk7H_7<mqP1PoJ@>O! HA%uScDP<k= literal 0 HcmV?d00001 diff --git a/core/__pycache__/cell_types_cache.cpython-37.pyc b/core/__pycache__/cell_types_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c65df2b0dd822ebcfd15907b41f41df0e7491c50 GIT binary patch literal 11150 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 LF8xgUndJO0)(RfE literal 0 HcmV?d00001 diff --git a/core/__pycache__/dat_utilities.cpython-37.pyc b/core/__pycache__/dat_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44c83815795a0f2940dd5e52409414a36b5aad33 GIT binary patch literal 948 zcmaJ<J8u**5Vm*sj^rLfLKGlTxIjWz<WfKtAruG_4T^vefmSQ6d~08B$)3H~vzr{c z6e#KW1xTEz_)Bi7_zP5w@3Fdyk!Cy|fAjRb==VDWN&WoFzwZ+A+g~;mp>l|9AD|FK z(1OI|6%m05Z-@vby$<6*&=WF<{vd)JXI^e7MCB0K-a{ctOa+Mp844<b8*)wKNQB<g z^<Hu~g}lfimp1b`J++as9&&_i4^RO4L6L)bI1k3bf-dM)1mT<tdL4YbbJfDPXx^Gf zi-3|3SmRsrj(o%ubA<c}CFF$Hl5u8pbyi4L>jL<hWV(W~0%oMG3ShYcy~IpQ#DKg6 zHr8g!Vc6-gHNBrSUgI25xn)`*nANQ0xnZR=tjLwza(TlIpGuI%Hc|E(YD}wA(vri3 z9WV<9D{UTq@?|=Ok$h3>${Rq9KB}6QGscbKv&QZn*UdII_zxEHsce9bUK|fvuC)vt z?}FjVmfFg=U0dMUxr=luRea0hY~d0HZ5L*Rjk{Z|I9fXjE)pELqvK!1bn!R;W=99f zsl|yTe8R<W#4os-CC?Slv=aPrB2{e@AKYdrbvc>Y<aItuYz}g-#MJnC=vx$s5a;`u zHgX?Rq}67VhULuld|m0f`+?sizgFb-UD~5x?r-nia2x4c-bqtG=`?knG@WWu6<+V9 z>F0_U>z8g;aBJ~nCt8?3241$dC3@Z#pm>CAy|NQ5?}O0zMR#pI`Xn=0+P3`sgp7A~ PJ5N`+pFPCeDnj@V5i<Kw literal 0 HcmV?d00001 diff --git a/core/__pycache__/exceptions.cpython-37.pyc b/core/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a90846595ca37231ba2cf791f5e04f19dd3a0154 GIT binary patch literal 1475 zcmd5+KW`H;6u0j#ZJH(}Edv5ESPV!RNC%iIgbJk~M4P38A&O+&vy+^1v4efrHf=JX zR_emQM`+cFuXHQlf{FJoZK6O2Cd8Bclb`MP_xJ8zRVpO{qOZP)E1!@bsN6^Zn@w2m z8Ngd2iKJ(+6gl;q6m(Dep!>P*fgZ>L=mq7&eIOV1NNq6$%c-D06!!=~ktUU-=}Fr3 zW#OE(sq|%Vw$u#HNkEzfuwKYkUyDS%v7)cutKqh_#vXs&HCC|$W%rF!tgn);k*sYj z6Je;Fi*$!Y`ar~yWY!!y1~;LJ)4q1B#6Tj=1e4&ljc)5~uWQm+vVFx;rzAV<DtypW zLxtg3<XF-LN1B;=!`xXT^z(`cq&!)uyT<?{&#p;&K}K}sU3z0*2O~Q66M9N6ypexN zDfAO+^cu(aPR6Azk#@QX+dc}_Ac>6LU?=06pDjRPeUW4ZmkyN8ikwF}N;t0tS>ROM z&iuaXWYsXY=IX{eE9c2`mssdWjb=-nhp}*u^Y7&6r>%|F2dAuSiLQ|KeQ_xCu=P@l z&}b>1wv;|_Ei+Ksg@9(z9lF*|wBK@3qMi&y*b^NEws8zEWN$qLKGvt9U41aL*o*=; zq6k1}Kv%qg9zXbl%=)w*+5onpJPn+1o|QQ78=1zqFLVAm74h}WBInYCoaZsJ%5`0# zieos#QO==8?Go;n5h&&W%VAnYKcM+Z2+CCO2IcQ3^X{~mcUr2W$!vc67qh8hgdrmP z59ZT)&@+o8pVLtbEV6DF5Ec=T{~IoHa&khj+pDnV$K&BG9i1N#TSlK1gcXE42<XgK z5pHK61EI-`eLR_CABSTTpP>KQe+j?NthyWJKNU<aC%IAcf6rqYc#=Y1;~KcSk3O+Q xMQTxR)C$@1jxoJ-kh{v~&|*4S>7$5KH95tnvtnjGv*Po~NAY4h&DC<X{0k7EX%qke literal 0 HcmV?d00001 diff --git a/core/__pycache__/h5_utilities.cpython-37.pyc b/core/__pycache__/h5_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec247c5829d29b0c66404b56006a5583106a4573 GIT binary patch literal 3164 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 G(fl10&<e-^ literal 0 HcmV?d00001 diff --git a/core/__pycache__/json_utilities.cpython-37.pyc b/core/__pycache__/json_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e440bb3db6aa4a507b8cc9fca9a120e2ee64e33 GIT binary patch literal 6191 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/mouse_connectivity_cache.cpython-37.pyc b/core/__pycache__/mouse_connectivity_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66838176aea375e41b25db17bfff600edc945aae GIT binary patch literal 25307 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 E2cMZ6X#fBK literal 0 HcmV?d00001 diff --git a/core/__pycache__/nwb_data_set.cpython-37.pyc b/core/__pycache__/nwb_data_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d75938068182fbb2af84a8fb08765434dabdca61 GIT binary patch literal 9914 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 Y6(RVS4Ukzk<dSZZ5swWNFvI%)0^NH{mH+?% literal 0 HcmV?d00001 diff --git a/core/__pycache__/obj_utilities.cpython-37.pyc b/core/__pycache__/obj_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c78056c01f64b187b14d4c487953d26fe8556ce GIT binary patch literal 2040 zcmcIlO>Z1E7`A6-H=89XRTWi5Dv}Qfb)|Mw)LR9JCgp$>MUX&?R*NEM#+!9BYfo*@ zCL2u-sBq>lWCa%_e$iYx<uCNaWA8^22@pNtmA!u7vEPs9eQa;7ueS-B`t?VC@;)Jd zdSTHbOuj(3_c3H7qdDo(EXv}aNH5BgtbzYHqx+=Oyu=E!n^OOWmY}bqZ=>7C7#yjv z|4sDE{c~E;3pyniQ5H?<dF0|MdPC3Sm+<fn*(2YRDu%^)x2C41?M_lBx)7>PjNn<_ zuthFiy;^W%#eqJ2<-Zr)4SOvJ2LqXlx{*sIY~9qQD@yk}G4COOx9RrN{&!Xw+vh`` zbr1OoSCjrT#Z#>^{-iI|*!I0An_|?(aANyA^005E6ORg>9`hrCy?Krm+3{wojo9=q zOD7SL6t-JT>Xr{Ogyj=&VIXvk-lBJ?S;u^dPZPoldcfxnP&*>$6g@(Z(Ua3ZD)OBC z@Y{K#YGlCt=ja2H#mAA^0(zuscmz=a>h)7f$?LmeT_db(V%@7M`j>Sxdn;IneW*k$ zTb)MNZNhKt_rtgM9?!f~NzlRXmG1T3m&C;vNkymhqT!mTDGf5JJC{*oe2;^?GNoB^ z4_O9Xazh6jRaC`QGDyIHHs1t|zV?M?oSpEo7#OV_1L(}xnMvg|zBnU`TtGiyV_}?3 zg?-4BHY1*6!d1ow9J(%RGqi7q(z3uF!!WajNaaAL45k)_EjtoQ814kN8a-mVG_a$z z<4$VD#yT%Y!nT7w#K%X%fmcC%v}{2POk_`4E^P?VIurChk{!=dAGK7V>C*em?4EF? zQ8#Rcjf)InQx#nh*BCxontU!tU?*a<j2poosC_;HHXe^{txYBslCqyY>2%qSPD3^p z?wK13X2d`kp;7@%fY;LIHCUGsh|_~P!0!|X!uT>52+_@Acp*}!jhz?Emtc`zH@Nb3 zJ6Ndxn<pC*hNBmADuiVB7P-xEIg(?ceBM%Jo-Q+H_?kR;{0KU6ipmdx#zS_9%6zia z&7tz_>s;p>0OXF1__1JR!30l-fpgcgcqh1)N$k#8{J-ZQP8SE}A2SIB+0~#=m<5`L z+20)~p35^ph=O`%U7f1{lUF_S*C_i+StniT1RH3>whRZp`>6~h47L~N&|aNGeWDmn zQJLa=;9gjsN;?C4_tHOFXVI8l`nTvZ_EJ1n>?|6fZ*IP&tkbHSyueML8GjGgD@GJK zs8&a+s2kx#^_tweNrAUykZbPh7<WylY5bGcYb_YryX9wBXQ8)#gRs4|AkHgaC;l!7 zPtj~xgDvCV0RKGNk1&uA6B>R|JGxEpE&E28-=-UMBMLh@Nw1;GQ86(a*cD!upuc9_ aKY7Nxs9T?obXMl#^N%4}|1h`W*2-VT$wg-X literal 0 HcmV?d00001 diff --git a/core/__pycache__/ontology.cpython-37.pyc b/core/__pycache__/ontology.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dc9c30c5756743561cd1ffeab31c9e4c4fef3f0 GIT binary patch literal 5036 zcmd^DO^@V88Ftxjx4Wn3V`slN(PBY})FRuHWD_Bc5XzDzAQWvPW??03z+2<0nf9#P z?yaiMe8_!3vmE&a2r;9a$e9y=fGbyg<+Ohx7kFNGx4UP;j>rKdz*3c~TyK57@AE$O zmVdCk+_vy!pZ|(~{te6e8&zgc1BDNe^ry&#C0J?=SjZTa?bIGPp;MKe)D0W>=A>TO z#M@2%K`U%AOSVMgg#E}8o@l<XL{qj;oD&u<31`dd`Y$o6)n(<9kh^@88j-{X)s8kQ z$@U_1G?e-gKCHzl*E$k%sASBI6vuadre&~Y)F?J1B_As(gCx^Na?y)v(Ai_7@Bxzk zF*0d|Ojw~USm+2_I4`Ww6|QLD-Iy#e^n@>3s5eDhEaB~oj#$RKC04{L-fgjlg<mQC zPcoCI`QFj7Y_|hEy<U*zMs98f59?J1yDA?9Z};ALxA%S}M1oIeJ)Z`Bu7e#Zvp~sV z%3~>loulCCxm`W&O@@zYBlNV8Jfshi^cTnqR#=f`n6XdT*q*+f!{dUTI%n2H>lfL! zJ$A>9qOtFey`mx5ZEM^#jZ?2^o-y@v(=3|k*(~g$dD}Ym3-63E%e3&lA#8kU3+IfH zntqMii9PlY?-V}9T}K~hvCs3vC)V@eiDi}wtOcv;pag59v@9&B&3hDH9dacz6T!k0 z(?y9WuPoN0AvgUm*~UwT&At3Pp6*I%i(N$;C><?L=qE-hl^^KR&G<l;b~Y^iMDHdU z8cHY0OzChTN@u`_WkV0s#FQ>!t8B&nBo&xbmn%Z*SZ0D_HK=!6rK@GStH>GDHOj8j zge)qV4jqkUwx(-OM7UBHqcqXx50<(E;V*yr;pR4gsq{AQ1BpBQfM-YB4>BI-nCSkt z%s$iG`A}v$MxGD*M|%6?WM^Ar-S>t(e#ZAC`lcx)#Iub!S8^kt0<AYZD*Y&;Jx0;{ zm`%Tq%wnGHGv8ik9`jinX~llsZnGOm$5&=h>&^PrFe1mMRKe&kC>Q|AuoGLqQI+hv z<WQ+#yKKyib7GC{J!|Y7eq1m>;NjSXv}@e`#)+*S7dAlUo;J@cg3$B#sx}`j`-OAb zD%{CeNVNeB_k>OA08EEqqW)A^`^%IFqNghbU<ar=Xa$^v{mfQh6rhc27H5BTHV^gK zUn>C4{VU|v!u^d6ur>I7Af|S^pGpu#7Vtoic7UNE-wkTi!3&RqL<G4Cc&zg5XwVBD zjsP3tn&2~@j-(EN+aTG?U=lI)N%H1TxdH+KM_tc!uYM-3OJeh>HUoo^Wi3suKTPES zPN9RCXCQ=N$blB!+mb55#QDy?jE#OPIOr#FzgmYp9O4uB!sH}hkB&{~-laoB6wG?r zU{eiT80SHn2D#}=70B6Q2P180_LysPkME?CRs-K#T&Pi!=sEz=U07tj%86mVqQ1HA zrrLPO4gZLgUH2r_Jy@_OF~Wp$vCtsS2hcO@H*=uC^tlNJ+(3!DNeY`m6G5zqOcFj< zTiBecKoJ9hNz$}yhb})%bm{c-gYJ6SPBfi1Jd0)7sO(v~!~<%Hde}n|dK2T7-e@SG zfzrciK>`j5czg&B5NZt-wOUOAkFS`gbZO|)2HiMm9^*Vx`7q<%hPpv=?OKbvT&~N+ zU*Qs}bZFwG)h!yCC~1<tMtzr}XipmKb`V8B!3P~6vu@sHp5xgrxTE8&v9{fD*B#%v z;dGemtl7uc7C5BtUekz+5t>L9jnENG<N;@8aMpD=Cfl-bE`c--->eAZ?%09*I@EIN zng+Q&wV&A)72JIS=iWkO0rz$I@1g$M)*mGq&<?XseV2;Z^#wPsEKH6%=k`h@&j14z z4B)(T94;XIF-B7rK>({X!$AVPCs~}11Yk{bWy6t~_nkOey}HX;fN)CBIeTpeggbJZ zdK8j*kb#M&4FSbJ6V&4TFdUGZk5TQu+V7M!$PK3+DEGie3ncX_7o!R3!H&-@Vr#;W zb0waicJ3;bhdk<f>P?uwIxi~^P~SqebO4tM-Cef=ulf$YBJ!(`U0nrwbr^6Fuj}ZK zkZ<vjet{A63NmZ0gM-flXxr=>JASPO=~w&wN3i<IWmqMg*2qi-11S<ZSE^71!4P5i zRRFEc^1q3&N(JY^RqyybwyJ=P*tNozx<@5q&P8mM{!FE+N9`B*Z<(-B$A7<rgzg}- zR%cMU%Z_iH15zzqV~FURQpI=cC=}Ky81D>`cLDCYO;Il6zr73%H47|&Vvh2E4_z&i z!GAfDE{z5*A+80s?=rOk({-IWEls%V0$^6plZpN#I%zubtThDJx6VOj!Gd2CEKk2K zSpGj5<X^G-1v;6>l(6_a7cE{f$_0yeYKj0a|G75zD$ITToVjO26B8NGLwBi~7~Vq# zbWq)13J1YZOT8`Z!oFdRUDO@iRPc)gcN|7{BH=!3Am~BrddFeSf71)gL0=;NP}K=h zQwI+JAi<SnA<m&wgyRnc$u7#x59>$A?#8#phN8a*6}f)YwM%buyD42<p2alE3@1E_ zs8ZdAY}u%G8@7k_)%_y1-mGVw9oRaee;<EEcU}Ema(%j{vRn3XP%H8kogQ_U=%PzE z`zR{gQ8dWKD5Y{Iik^>nI&Eo2k;vmHQgjbiZ&5~WU0GVaOQrjieV4MiovRYX!-`Bs zy)=d4e$%!6>;9&H+rQ~w_1CM`Zl_#|bKJ&bljND6{eeght1v!nWTV0GNG+p#=uPmc vzDbp<vm1PG{>MrYag^TVGFOfM&lXks-<$0A`)@$JI-feM1I76^Md$wjt)5M4 literal 0 HcmV?d00001 diff --git a/core/__pycache__/ophys_experiment_session_id_mapping.cpython-37.pyc b/core/__pycache__/ophys_experiment_session_id_mapping.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbee602d68fb27c1123212e3f9ff5c742beff1be GIT binary patch literal 21632 zcmeI)WpET}+vxEC!QC~Jkz@=A?hZi{2n2TmH*ygOfdqGVcXwOd-95Ow`{EA4-v9Mh zozLg%sXF^?{r=T6)7{hEGd-E<d!MbCI&}&k{ui}$aKzbhK0c52#{c<W<HSBb<+%|P zozcg~_?QGHp-E(XO=6S8BsIxQa+AWOG^tE#lg6Yq=}dZ)!DKX<OlFhCWHs4Lc9X;8 zG`WnQu^4}2H8x{64ijJkjnlY{+jxxE<TiOsUK3>Unf#`JDQF6r!lsBRYKocSri3YJ zN}1B8j45l%newKBsc0&hU{l#tF;z`9Q{B`sAtuz+G__2ascq_*a8uXRGxbda)6g_B zjZG8N)HE~AO$*b~v@#K<wP|CFX=~b<_NIdo)6qnlPNuVoGF?ox>1w)}7!zx{n;xd8 z>1BGGKBlkfXZo7~W}q2l2Ad&fs2OI4n-OND8D&PBF=nh8XU3ZeW}=y7CYvc{s+ne{ zn;B-NnPq01IcBbzXXcv)W}#VR7Mmqzsaa;0n-ylIS!Gt6f6N-Q)~qw@%?7j4Y%-h8 z7PHlCGuzD$v(xM{yUiZ6*X%R<%>i@J95RQ^5p&cWGsn#dbJCnLaptr+W6qj$=DfLJ zE}Bc`vbkcenrr5|xnXXaTjsX8WA2)J=DvAg9-2qyv3X*inrG&@d0}3ff6XiN+PpDu z%{%knd@vu)C-d2SF<;F$^WFR~@#d%bWqzAK=I^8g#s>+I5Q*T6#7KgqNQUG{fs{yv z)JTK0NQd;ufQ-n5%*cYQ$cF65ft<(%KUm-oD{QdCfdB-;2^ZY(z>D0-gS-erKIBIM z6ht8uMiCT6F%(A$ltd|%Mj4bvIh02QR752NqcW<XDypG6Y9IumsEJw#Lv7SSIO?Jv z>Z1V~q7fRS37VoAnxh3;q7@?08f{?E7VXd;9U$n4NOVGHM4=0!(G}eggIIJ&5A;MY z^hO`_ML+b%01U(+48{-)#V`!V2#mxijK&y@#W;+|1Wd#vOvV&U#WYOE49vtV%*Gtd z#XQW%0xZNLEXEQn#WF0%3arE`tj0fBgSA+P_1J)o*o4j4g00ww?bv~x*oEELgT2^? z{WySwIE2GEf}=Qw<2ZqnIE6Tz#u=Q&Ih@A@T*M_@#uZ$}HC)FH+{7*1#vR<nJ>16w zJj5eB#uGfnGd#x&yu`nFh1Yn4w|Iy5_<)c2gwObbulR=V_<?x*#4r5DAN-w^kn=ww z=YK-ZfBp`@7m1MsNs$c6kpd}^3aOC>X^{@;kpUTz37L@vS&<FdkpnrA3x2S`A6D34 zhXVl!gcB~f;ei*qkq3DZgnY=40w{<=D2yT~iee~^5-5pMD2*~Gi*hKB3aE%m2u5X8 zK~+>kb<{uzLQxa75Qf^QgK*SEJ=8}7G(;mbMiVqeGc-pFv_vaJpf%dSpe@>=Jvu<p z5s~PG&WJ)6M58OZAqKJNjvnZVUg(WJ=!<^nj{z8nK^Tl77>Z#Sju9A%Q5cOe7>jWj zj|rHFNtlc&n2Kqbjv1JVS(uGEn2ULsj|EtWMOcg_Sc+v>julvmRalLGum)?f4(qW2 z8?gzSu?1VP4coB;JFyG9u?Ksx5BqTd2XP38aRf(k499T-CvggKIE^zni*q=S3%H0& zxQr{fifg!z8@P#ExQ#owi+i|_2Y84_c#J1_if4F^7kG((@d~f;25<2W@9_a2@d=;t z1z+(E-|++S_=#WmjX(H1DG}#?BF_Irod1b9|M@0}#7KgqNQUG{fs{yv)JTK0NQd;u zfQ-n5%*cYQ$cF65ft<(%KUm-oD{QdCfdB-;2^ZY(z>D0-gS-erKIBIM6ht8uMiCT6 zF%(A$ltd|%Mj4bvIh02QR752NqcW<XDypG6Y9IumsEJw#Lv7SSIO?Jv>Z1V~q7fRS z37VoAnxh3;q7@?08f{?E7VXd;9U$n4NOVGHM4=0!(G}eggIIJ&5A;MY^hO`_ML+b% z01U(+48{-)#V`!V2#mxijK&y@#W;+|1Wd#vOvV&U#WYOE49vtV%*Gtd#XQW%0xZNL zEXEQn#WF0%3arE`tj0fBgSA+P_1J)o*o4j4g00ww?bv~x*oEELgT2^?{WySwIE2GE zf}=Qw<2ZqnIE6Tz#u=Q&Ih@A@T*M_@#uZ$}HC)FH+{7*1#vR<nJ>16wJj5eB#uGfn zGd#x&yu`nFh1Yn4w|Iy5_<)c2gwObbulR=V_<?x*#4r5DAN-x<%lYri`R~j5@5}k` z%lXf5K_o#^BtvqfKuV-SYNSD0q(gdSKt^OjW@JHDWJ7l3Ku+X>A1v^P6*k!6KmY>a zgbQwX;6-laL0$wQAM&FB3Zf7SqX>$k7>c6=N}?1>qYTQT9Ll2tDxwmCQ5jWG71dB3 zH4uVO)I=?Wp*HFu9Cc9-_0a$g(Fl#v1WnNl&Cvoa(Fzf0jW#f7i*{&_4iI!iBs!rp zqR<7==!$NLK`gqX2YR9xdZQ2eq96KW00v?Z24e_@Vi<;F1V&;MMq>=dVjRX}0w!V- zCSwYwVj8An24-RwW@8TKVjkvW0TyBr7GnvPVi}fW1y*7eR^uP6!CI`tdThW(Y{F)2 z!B%X;cI?1T?80vB!CvgcejLC-9KvB7!BHH;ah$+OoI)H<;|$K?9M0ncF5(g{;|i|g z8m{98ZsHbh;|}iP9`54-9^w%m;|ZSP8J^<>UgBT8!fU+2TfD=2e85M1!e@NJSA4^F z{6IW@;un775B^R{%=w>~^FJ}?e`3!6#GL<$IsdsDgrrD@<Vb;(NQKl$gS1G8^vHmW z$b`(uf~?4f?8t$f$OS)G;14Tou)~1>1i}dy-0;AQ+{lBx2tq#OM*$Q>ArwXt6h$!< zM+uZfDU?PTltnp|M+H<wB?O}~s-P;Wp*m_H1fi&jS_ngJ)Im7vq8{p_0UDywq{Q<Y zHPNHoxUP@830L3bpSV*2(%)9hEgxDXcFIv(8MoxxQOPa+8xC<xyQl$f8B{0KE%);d zbjys|Om)0B(k;HnnWf!>aJRgUuE(-_>$s(>-n_hfj9aXYCc7m=0IRChyM|j@b)4^( zBk@DsvgCP9w{+_6<B{GE$GN3wk)>{_-f5y+l0DqymTr$1b93@ap1emAkF<Nf&@H{P zEqBX}@%MR-gm>JMW!7D{Jbb>&Ep_IMaLM~Sm)$aY+8mdJ4dOmetJiMXyy2Z&PK3O5 z%kJ`5*{Y)7dESYB9vQl6yIY>D{Fk+SD(MlwbWh!q-Q(+$U9H_7xg*b5X_6Oi`B~|& zTh8Q8=#eWS6J3&EZ8ncQclmPj&ONtSY?(Z=Wf+M%U4ab``R$TvcXN28S5O6ytlAdf z5uagcJW_rhH@!DAd*t&|k4v^McX{M>`@AkGZ(&>7_f6rFbBpqLWLA>!KzXw0bD)%} zmfs~44kUBS#q#-FvgkohkK~$|p8d#E%q7`kMtY=h*>8dJGIb%ByjnKjBdxtRT~hJD zFQ?p0P=e>k@yjLdWbd3(bt5+`-7W8uG{>2`a&Ul0Zsj`Qkxw5_2gs4fpPbSt#Oact z`CC1bdf#`a^gI2<DdCGgJ0-ct?UJK$0d8sT|JErhH#c<2;J7@j?*&W5ZsO52IelDG zBeIA~0)KUINmPawPTBA$w@YeOV8a)jV&)aGUYF!Z!<HtxJKiOAdvOf<`mrAc65aMl zpSjEzd~tzCe1)})nZ1I|$oSJE3u<r-+V!l#&g3rYl9akcqPpC-Bs;4rIGCI%{M;jT zlFwi>cCl}3hSX)J_pqf;b=k6Qm?duqR(k3yQ<F~@cS)Dq%s1W}<`Vw_cU`jkIr9~K znu@n*0ao8}BrBMAv7Jjw40+;`l{s0}#_45PBAz{u-BFeoYCFsRD!<qz#X4tm%dh71 zoD!Rx`y!59cgYl8^P(FqTvGZ6OPmPh*+M5&a7pDYUtH2~WDk#YILAAp#K)R0IpksH zXZ;&+AZ|puq`|39E=ix1XM6LVWyAg0jBGi18IQ$q^P&%r?%TQ4BU3jd^2(;cY-z<U zon2C`UUIi2)n!wR9OjZ-a|XF&XNJX2$r!iYC8Hm$@yPMwLtT<8cdSeDg&g+Ct9g07 z(tdjrr|etY(IrO)ym3iPbYGVYTgJ^qU6|V3eY8vdR2}D%-Yt2Kb(J~9-BM0*i5bCj ztljg_BZ<%6cgg+QuRK!w38_|%nb+1DOWv;b$n<ZlpoMLSOU@2siGZgZuq1^h@owrk z(Ix4|ZF9*g-M%1Q=|4eRct`9=;FZH=e7y3x1oQQpwv63R*2N`VH*@H!1@Ka|bF6d8 z%&0tWY4ofIM`PDomkb@U(Iu@9MDuFxWtQ!$c@@I*rgh8EbFW;oM^B-HIo|RLCgBLV zPOfIF+VgC`K7Dn`;$K}|a(V)%Rhxpm$G>d);1SO`j?l;lYg`gCa}RIeh}2%GHR-cU zB9k0&$<|H@+#-kna<H%Prnxc3-z#0)#q%l9$>Wtzt{==Yoz1u&oR4?x%j90!-iM=G zx;u-7UH`yhb@+@Jl+o&zv$iaJxOHY{LgwalOOm_!-LiOT2DdaF#LF{m6FYq)xz{Tf zDmuK<a#W~SV)8H*wkp3@j;(fZ4BWi%2aAbQN*Ch3*&V{YQnz9quVmTUgl%cn$}5>t zH)YvM9ldfpeNC^7-Q3M9$r6Wo<!JdBuWZrNs%;sj-UaUT%J-%0Z{rpHyb|A%Ro&g) z+$;NcwDpR8_$;sZZSLWfrAr2QrPDhO-7<Z)l|z_i<Dm{-nSW%lS5}<Z;+0VWyS-9S zPmOR-F_*;E=3^vo%RaC4$$FACC+8eoI+PE9&y#{UUGxL$<5FfBnTXGbKOgeD<WhR3 z4i(~~rOqurw92MniJ0%)^wl#o@?{;Dd<`U-e)8fKnts?NJ@g<x%$36}MYi!~?c&Ru z=J@<J0ph#igi9v&JIM#du3Y@FIknX(AExs_hg%%%j?-AS#4jElxV5-jYCHD1<X#T` z`X#)>eBX*jI;H8d&Q4jofo$4#jPqkplvBzLJ<fdjx;o{{vuLMenMW3H>gkj%sf|+x zEnmXTSv*I%TVDgEVX6a8S)a8FGbd$<QeiPp$+Z4wplq7JEG<|44wRCudpTu7L~o}& z*-B39ve`;bb;|gjJi7A3Os9;wf7B__qXs*rXKx;zadNy<UL>C4l+|}8IVCFBYp3k) zebXua6~{Rxy$=t(Zkmb%8=c81?@P0)*v}K4($KM+H|CM+PN_7JwN&$GFY{Jk;gp1< zuCj#g(S`S$ol;&m=wRZ5PH|;t%?mQWa7xyL-JCKw!x{GN7>kYWI)Eo{ci$<a8s2k? z<>YXu%(EYM%AY<gF=PIArz9DA*D14f&Brs{=FiEb5l;Di{)SVY>6RYZ$fJ=BS;4Sc z|2pMH<~L4huN!$W!&9d`O#6zH-SvQ@QSBi!M{(2YWtJ$NxvYz+lFhkq_-ytgC<`}_ z>eOP*GtHzh=9_(mLw8eeemtC=Rq53Av1H9S@>6fF(u3Wv?<1$2Exybt#hbGA2gYz; zXhwG0HHWFWlZa<Bd0uOqQ-0{9QB&B+VpEu^qqDTs9M=bm>*_yDC5v=wvA)-C=(EjQ zRE^Ijz1h8o$0@02FttfDvm#p>m69jVs_%%9ndFrwkKTN)Yc8#6q*<z)@m8l&%q7J% ze~;bb?9rKH=aF;^$k&CWP(hB%oKIr|B+ECFUuXWM%kI#r-<n&RI=a|{<h<OYb?USx zK+m4En!%ceny31}D4qJ8pm%^&+}<@n_UB=0%%FY&Qe!LmQ+ZH;WKK%%f9W3}wI?w( z{Nm66Ih)};_Z^DkovlwfSz|OVUFj^HYNS)Hliir=Fp%f{cLw{>ab$orb<PZsJvT|u zM+>;G(jxXU<w6c|fujL3uX9+Sq&&@6p^!NKpk+ASoVSmzZ;a-QX5}uHUE!X@uIhmp zZey|8AC3gbi73ABru&D?Kg@j@`!5TSmk$pHNY~+q1EhNJAzoEqz9YTTng6Zh2$UL& zU4im`W!^yPe~#>H85AfR9@Y+&Bn|2YO0|=<0;TzrI^1l_7rF9#It9v}$$Xo8RsTz% zw4F*;Bw$Mu+~AX;=TxTl^(IBu@Oe;d7E{eaeg(?Hm7O^ktXrJ&vIQsN)0TWF+-*#P zpY?T0((jyklY22$$iKf+)*R++bWS|R`PS(aC+GS<fs#?*e|z62c8cHM6i&X-b6##) z&pB9sE$3VK7f!2GI!km`U#Cnep2R8V3o>(;M9G~JnuKJ%nSoE5YAk#11yhNqq~iS0 zcl&!yV_kNnz7tzbBbW4MI-S}vDhr#|Dw|VswjhOGvh2d;d<0FK!_Dx{IoOZ(eokp} zo3nAq2&+>9V(m`p+=1A(IGnOqaycdUE6$G+K2@Ev;vNaTSlBIp{C4n5r1NvWUg{G) z)TGW_gAbmkwfLZD7v_|=MZ!4{8*4kI!LoX+;Bf<|#2*Ubqva0|9MdJvXx?c`>xsBE zoYQ_)7d}P~H6ShQoGw=_WTDQ|U2{k0tEaiDDWoTC9!;3WXl`q+XsYOE$u&K7$7@7y zPSwoORMS}kHA^+`HHme;RGKZCGMWXNLz<?#SihS?10+(<>Dbqt3*FKT4-lU?-lu)X zbKe5ZZcTFi09dP2cQng2S2gMMf$5q^O_-*nW}YTqb4Bx1lT80EwA3`x%+z$&Y}YK- z9MpW!B+(DXlA2bUJetOu)tZf(Gn!+XV)}lmtC^rFtBG98d*g#nrPlXVNXL}CPgjzE z^u7qaFL^VPN7FzPsadMosX4BBq<OFTqe<1AWYpx)xHb7SWi-K>5KXwIv8KJIyQZIJ zsAi02vSyZMp=PV*u;!HJp603MwI*JZtOZG{$)fSo1ZZ+=3TjGd%4@1>YH6Bj+Gsjz z25LrVrfHUFc4&@i&S)-cZfPEBUTD5*ertSNk_?*cnjlRjO$|*WO=rz$%_PkN%}LF9 z&0Wn$%@2)FE0RW&S(8iS)fCVa*Ob%L)YQ{7)wI@#CR#H<GgY%#vr4mFvrltL^IY>* zlOlqo*Z6A+Ybt80Yies^G=nvxGzT^3G#@m7HK|(@k7l-JujYv6qUOHlrzUwDl2v2T z<k6JWRM1q@L~6Qe25ClWCTQkq{?Y8zoYmacJkq?>yx08EBsL_KCZi^Y#-?#=@@a}{ z%4mW$;hIjG7|meKM9mD%e9bb=X3YuBznTx4@0!$YNhVEBjYpGTQ(0426QSwXp3Knv ztLfi?EYiejo@oMw?9?34+}6C;*gBG6%^1xr%|guz%>_-oreGv#rWvo9tGTRsr}?e1 zb|OKVADRN4Nwj91W~yefW`ky*=BDPkrePF`(e%-b(#+7z*DTYl(QMX)b|L*W>opfO zmS~bk6Q*gdF`7utAk9CTE1E}|_nK5)Nh?iv%}~uk%^uAu%>~U<O~G!Ygr<$Aqo%87 znr5zMwdR=Sq2{;78be%~mYTkr1)AlW-I|k{Cz@B9Qn94ErnaW7rjsT{GfFdGvrMx_ zvrBVAb53(rb4T-6lcYPzsqtv?Yl>;gYC<&~G+i|PHB&URHH$PWHS0CoG<!8iG;x~y znrE7ynshx#R!ucc15I<yNX<OWQq3mKam`uHZOwa4j-F(wW|n4!=9K2OCP6QfOp{g< zped-Ss;Q-^uW6<kty!))sky63)0^bdG}VY^xMr$mm1d4+yXL6olIDvhTOU$NQ(ZGy zGefgkb3&7(FUhGXtLdN_tC_7iqPeK~rb*n7xHb7SWi*X7?KML+voz~8_cTv6pELpe zNqJ3uO)t%5%`MFfP0#>RMAJyqS<_cDS~F9#T(efQTXRzLO7l_kLz8qM$*jqxDWEB? zDW|EYX|0LY4A9KctkP`IT+-ase9@#BL<(yvYHDj*Xa;LWY36HoX-;U)X+CJaYf=v; zc1?awsHV4Oo@SHgxaO=T;}DWh6RZi>w9>TKOxCQ>?9n{ce9|NsO6qGmYPxC$YQ}4( zX*O!^YMyA)3?rE}xik(<0ZmO!Jxx<hPt9=69L;vkTg@*`-r=OMrn)9ZGfFc<Gheez zvqp1Jb4T-7^RMQ+=C3Bn2$EXk(d5?@)0EYOY9cgUH2pPGG%Gb1H8(WRG;cJYH9s{8 zN0Q{4begOhizZN$M^i!5Kw~t$HG?!0G}AQ)G-oweG`BU6G`m}pu2ac!P4F}lu9>V^ zr}?VMFr8$|!nf<GI<;>WnKqOB(6rW@4>VI}lTHu#73f^ZRNx|gpdP<hHzgg+SN7Q1 zd{mv|$K%M@fI#^X<P4O!O71|JS(2Z9(=X-=l-o62TvNCj?3C^?{N(wg8<}bp$*8eu z+?t}A#+p`|_L}aRF`CJmS(+7^!<ti?7n%g4NfwQtCby=brk19@rky5MGgGrbvs|-Q zvs-gg^F!ktLrQ5{Xu4>6XvS)mYBp)Ak0ot2nKfxN4K;l<@tU-H9b~;uCDW<dI#p1o zs%kcCo@qX7;xuK(lYE*tdef#;?KH8P&YHkxZ35hlbnvSFtTTLEFDcCs$@irEi2G5| zEd#<s++w;i*z~43@tMb<)W7YS3RuL{yB1>@ysFPE;}bHp6>1^7^no(Xn59Vo<5rJ9 z&19+$v;5nTlpV~V)Y&R57PXl9LZ7AZ$hJV{OIw|Rs^?Co>dxN91>LgTY`AulTPCzm z<&mHfES9<+_xbF4;FjY%$rH`Vt;~|{8Q09SpTF&vDwDZL?%u+E#oK>yOUaHT)kJde zHjf6Ic(?dfwlUzbj_25}kG}0)$|I$#F^tu&dUCFXUn}U5;jOt@wKA#rgzX!oTd?c$ zWUeMJu`*DlH;+c}sC3Kf5o>GGJDy{;(#|F7v5%Q$O`~9sjJ?aM5|-rA?~S>+AeyNY zRk$*{=?M?)`_0AMN|o4_{?q*#ckwCYk@uG(17*$@E^W9z738vO+VpN2RfG$=u78*> zNdc}1Z&|^$-02f1d8BT&ct*PJ6?RGCd5ru#-~8AmcUmQ4c;$PrOS0J57HjGcPRSoo znK6uT(m=B{Jp*59iyraFjk~<u&E+!}Dzb5HIP3ZC9vPA~-YM%ck;xf!DmRyz+gfwG zW!q9N$uBy`D9W@SY<T-(?1z6PGSBdo{!6$F-t=;JmkdbT#wi85<zZaoHM`I>o|)Hl z;bzEPwlwJ#4&sbbEVgPU`!W0NQ;#?cu!AG2tnkQIUCYA?Yq@V{La#J@qbo=e=8~ez zc)({COPqPjec5UiaY=k4;#$nG$(A@?^J@jT(48xe?K_p0o$m0C`7R}9mQ_DkwoXH) zTJ7h!T&~D`XC8$!v~Y+6mh3(Ag=FG5-<!?qqfWDe92p{6RcXc?)~#Tt3kXZNXEGl3 zLZ>RcW7!Xrc*<@q{N0k`<9w&w*7ZGqaf8e6@l4H}-Ig&vU1DfwmUv#5!+xi2JeSpn zFmSjxAMb+$+1Rb!<r#oVc$TNUvYU~WJ8S#6WJ3>@c(sUSck5>O>dSceHnS}2#I^c# zEjUc!w=;TW)<y0M|JH+n5i48YYCMnnT;nu|%*R;Kx3No{Qv1+uHn$RoGp-i*g|6+z zz>@zdk0f8fm_wK7W=>hMl&7rO`3nPhABXa6%eYxMo~a3XM&&)jtCi<6Yc7~z4ky^H z*^Ik9;DN30c-`{Ear|QR1sI?8qeqH<V&*>|c(h(HPuU>JI0h&>@Vt|Ma$kufD|z8> zF-wjwWb4@N3>`IQu;jCwHP8LL+a=BR^O`3)Lkd4*mf5FR;><xds7Skbmpop@OVM{U zi^VNu;33%+9@yu%-X)#&zMChxxiJMVe1^BY3c<NKBvZ@s3ZALVRLdxK@KYSK6w1pI ziS@}t+OyJ)=eVy`Ax^6^!r;|=-H%2A9HBWu%(vj=A(vR1_%V9Zg%voiaI<Pw2E+b( z^gPeUn#-gLVB}{%gI6aGGS0NA11p`qoGtB_pEtGdzLZ{R*NbIu`LbAeAEwIaviJ1a zh8E*__v+5PZNnR>(TSpN$yAj4e7_d(%A>)o>Z-1ENjje6{g>Ka@nmGGYm$NtRCQtn zW5d{jC!0Dk2APKY!k#tqO4D47DMhAW+^SImhOCOFW~$K7ZVW|5G-ei^s@##Ot~D5i zvi>g0z>Q8tUD)H5ziZjS$fn$kiDs4@X;}7sLe}zi#T>6R)(0}=8|9UY)7iA!-I?W< z&SLXrmR`2CUg_`I;gy3AS=EZ;>``4kqZ}RieA$2bfLB`ei}T95x!hO00v`a$eHh-m z(w#?d7UPqqU_<WP|ADiyP7|iO7vqEHw4ShSR<gwD%G~Tfhp9>RIcJuKk<#mU@fy8l zB<bZ+4q~;FJmp8dZ^GTKoS{Jl`9|CBET>h_8BUG!JeoNrqYqbJ-*d>YGaT$Dc^KMi zx`0R1?BH+S*sjc+;0RN-voPPoeH_>$BN>_cJBq9gVdl^=Ox13})cBs=xM~{6c#p3? z8CZ(T%)yg7I3-)`at4BW{&0w6$B#fs)rrBY=@VHji<9|QU+K=+PTGV{srM(sAw#k; zH6o@T$6yxu5Jj42jd#e*5wjVE%EY5P)-o0Sm#fqL77ph+aE?JX8F-OVp2<4PlYu0~ z8HQZ8<<&tXePHw1DGXdM$iNaVE*jri!7N#}ao_FA`?zdf@+Ko#ImIEDlChU*Myz(q z+@jo9c`SR>`X$%QZ#jFjN1mfx#XifL|4x5N%EmCplI}7Wp^LEC!p;n&O?=3}(!D$6 z`r@&Sp#EYbgD$hg>0qA7H;@ggQGzwMwlh_76|?+PikpM{xp_=CciUr@EqsF|BJXg~ zxWqy>@|_Q(MyVcf-~OjO+UyPKb^8?~Y!8?v;T5JDKV)jp4W<Tf`sI-Ex4F4^(I1C& zEKZ)s|8+?6t30}6@@$?mA2%}=&*2ou9Uh(f#p#gvOJy9A`ga1pF!$kwD)s0&14~PI z-5#9hd2eP(=#bDE?DUjT3Hd%$ZKy-``%Z9358bWp+0r^>!Y`IsmvNRuYPC+r55RuO z`9bbxv2qPFIV7U<Zif_e+a0nu<gP;^eakx}Rkd0SBTVJ3_hSs-Uj16$cSy>4j~pTw z+0vZ-dGe5%%^cGF)V~f1>igLtPh2e=l5TWruAJ0P%+G?HJV%mCQyemU2KSj<>G*xL zHVeNx^f)ie-^wAGd;_=!Rjn4+EGsnO*WELYOZc=YT)2!Q+rDJrTi;`rO%#`tZ|k-E zxh#^xkDs7L?flgD@^V)y$qE88<mRGD-@IJbbm!qW?2jP6m2M?@d-6cP)cN@Jl(sKF zOTFFstu~RVuqi|MmOF~vJw*PlBeAzgmLx;j@R?(HO2eQ}=~8Ez<pmoa;**1^3)%S9 zVYBfYA|p3PhT6IBODsPhcCc)P$XQ&b(q$_wWa`>r5*M+UUx5oqjUMDe@e>@JD|}@d zyN6TlT)E~9;l%RwW5Zx}>+PNFT<uw(i%SQ(Yymw6?eu75YRh7C_mQUq_yY89D=DY< zjl8g&&CPp+p9-~!tt9!YkM4ZLqcOrR><`M#pi~s2RneWvD$VPwY{5p|jO98Nrc;?T zFE5S`l<{u9&E3#^Jwbw}vZa27`R0~$K2zgQkPE3f&u6C~%k-0Bw|-ibJj03jO87k3 zF@kjLN3!)IS-K5ota2_>XF4$zp&x0n363-5yyrCY<zNMUm#^bpmz8huN&Ql?mZUto zqag2+hdz&-;(5UtRkJy>wE4!kRk9?^7o3y%EIM<zPI)RZst}luslzpxO0ba6k_9(c zIOOHo)egzqeZ52MKPNjR&7f<X70-6Es_%OpGVXsrZi;ZKjW0@~I<Ra)uMT6C<Yq_; zKZc2(+njQ;JU2g$3E+cq8mYF6Y?w`kr(%{TOM;!!y9r~xk(yU0`J}$EkZ<eLs_^%` z!gik0TkZxYaTd;~cT4N=DX@t6M%Hsmx-m>$-Nv|8ipI?t4D&Ec>SjEUI2}vmc9J}i zq?PxULqdLY5{KV;#Rubca^)wd%iY)H?YQd>`LKg0s&t7Hwplf1UObzreHkC{$&i-x zs86;=k!I$JLyFcSeaC*|kfh+$ZFB#vLni&?=BT&d9kL*vRH)6&*DiC~PZ;^oA=lrr zM3W0oInVDrXR%kGSl@Wg{jLv~s{Mw1`^XBq=o!$vd~JRw|I5_q<cz+)d&2v)>F`<( zS=2GiAz}M#JLHX(505>&xtXzaU5Bjd#?<{nOnnaGfse&oIi!AIONX31&!<YS4y4*s z?rWE@okRN7Z_TPQwqZX?aWn6*PVD&_{z5cA-rFH_=W}!OpFSM5z9hum*CF@p{TyO_ z*x$ilx<L;4`gyQJM#M68{5@0Qb@;@bvy41CIm{vJw~>$K`2h8CO=PQVe1=Uv$W5D# zmwWp5=?<y!p46Vp+stnznQ?<zq8xJ^Qeey?KUqEEmY*!ib;nQM#FK|{5By~K`G<Z| z@bP0m8CB_tpXAH;)K3zJk*%Fbu6ED;_*V}|+7qNgj~9N@W*ymcj6AtRI&^&LC$D44 zo#|v#l7IaqJ{@@yL`oMYyRVQj*T{t@q+7yQeiHHewV(7{|He;ReR}IB%Tl~!u{csN z^n;(Q9Z6EJA|(%zy_(iFKKaS__oQKgFMbj}i<C<H)lbr7A_udQu#(^Wq;`_;e)3Nh z(s52aGoK<UdjIs3$Jc)O$yI+Ji^TU#V3A@)5?LhHkmjG0SR`OWQi~MdM;bRvW|3uW z$o20jE%H25D(=fqP6lPL$kv=0EmFE4sq}+9E|JM1YmR5JNN8+Uiv)kkPWo9a(%`wj zMYdHAu*j`i<a-!7_BzlaJ<>T@Y&!WQ9*bOc<+ez-`lQ;PJQg`#Ft0@_Gz_xHEJJc` z%x96CFG;T_`7JU~6I-Z&MKX>pWRXMr3tME^A#x<Nh(*Q>CBZ|AS!6}Nk`_64yEL0t zy_`joEh%r2Tn8(%>>(0#m|WMCJVLUCSGCBED>c~M9w8i!m!Uj)nVJ?^buP>znKIP2 z$i*q7!<TT2L{DpJk>L|sStS3>2#XYY-J11HY{L!?GZv}Qq^(8fwI^A_+F9hOv}db^ zcd&?S1sPL8ERwWBq(ugOB%K>~vdEt+oh{<MO2*zN@{suaB5QL+@#JpO*F)}V!vA!! z$m`|N7Wu7NypPxplWcd$vku)X(mQ*MMMlJv>?L9?@+Fj9F4D^)4d0U<&wI055Bl=F z--xSBKaN3JlCoWYi}d_UZr2}RkzHX!EK=4n%p#*T_uXV#yAc+tvy1dRLHhZQWX}tb z?Tbe7ycI_CO7|u8Tvhy~@Pumqa<^}7e|d8`!e7kow*GRbS_glz+B*76lj`04rR9kM z{?hixKz|ADFxX!Plo;wS^Y#w&m#+Ora$o(4{&Kp*6o1Lnk31VY)n9@h%=G8qc$@7n zR};_kmxT!z`%AB`OZ=tYH&S8z3V+!hzRF+5^dK{qt?`#byUBn$zE&yI-_I&F2Ux8# z>Q#VMUcc46c3CAuMz>X-H6|DKkUpVas|*h>Xq5t~N?2t}{*qRCaF4WpS=K5ka+kA8 z=sr^3UC}Bb(Uq+7>2`aoyc!W}mGE0btn%glFsrN>Jc+3^lbOmg-72>}ljkL8SmnFV z9II4mzR=3W{zX>t$+eURYLVI1*IC8P+hCPxF$b-(*LvJ4r>n$SC93ghtK>>`&MH-_ zp11PNoFuJx)hhiT-?hr;#Sg7gHvEZIMmnEb<>1wqR!Ow&l~t~uAsPJMSmj6rnKkyE zRa$oc$b6QsR;gQ)WMB8gD*h+_SS5IRVw=3&M6$dmgLWmeNr!UDZPI)@Irt)zO=8Pr zw#m{e<bK&~Hn}&Elv<G8CXdtQu*r|KR-2T#Lkgv|*+kB`ZSpjw$0my$q;~+>RfUXB z5oD9r)5ywK1#HqbPeGfk&r4<nkw8Zwn`C-h#3tpY7qv;Qg`~&nVm28ZS==U*0!rAV zVGwEFldPOf`eiL;lf!|fxo<2<zKu-DQl977TY)X`R<uc?+SP1ww+V?~Q{5(~zt*rx zP~{MtxR-_6<kRbLn>6vMYm?Hm>)GU2|Ay?_dNOxNQ=1%n*TN>DjU#O0Iw&@2<J-|D z`MX8h<aS6Wo0PvxV)Ash$@AjmV=#$yMA@Wg4YFV{S@n`k{y{dR?P8NHA7k0U(%o&6 zzGV-Ni|J{Tvt@eOB&<4F*<>I;$p(;5Wd_;g^)u2Y-4L6k3LDH?&N3B$ja>RVl&z{d z+$J{{jI>Gip`$rCA!FEI|A{sk*JiR!GJB@jq}lnY>`eU`?AFYgHvXN(+3e+?r8X%L zyUZq6im&7tTwZ6BH)q$|B<1jpHt}rP#9N^1R-2r(Y`00h`#V_ur+uu&eTWyY*AW{d zibrjdrtWc@ROxWSCKbDr;h)IYF_$<76RvTr-jR^Nn>P8`_ZjzHCMliId5yBZ<rU09 z)?OwJzQ41{-dgW%T-qRAuaOibKXCjs!zU1lBd2G4vdN~8q)(2|HmOtOi%phQB^gJO z&9%O=M~z8?g(SyblK1U5o7@@j-6jtb{jf>#5@hZ?(r+or9T{(v%lpY)zuz_~>Q9ax zCdKmp;i#qbu}i64<Y0!Rb{U<KTy9M=ZAfO9W_QU%P0?y8?6RXVS#g&<?48ms+4_<^ zt5eyffhVn9*40U8momxH+a>dq40h>XETdgQHfOO*zzILQysd1pi{BuByDVEyy6z?G ztJ>`HEVaWf-r50nnL5$UQ~n^QtK_!J-l_%d^2uA+E(a=-xISc6Ka#RtQ8u?m3A>bd zQkv&oT-Gj!6I8H^Ct*dqY|T;0F1KuC_MBk53|~>%E>Ww=#|KsI(yD27JO3w(8g?nW zu(qB5zeXLq4E;zpwyA3ur=y--#?2>%veviD_7M&2(xq%8o+xc&yOb_XQXXo;`WiIl z2+eP07x$X>b~$yJoXaV88IrT3U1oNRvdiC|Bwtt;yQI1nZI>opy4v|lLRNn4VVC^l zd)g&^?ml+O@P~{`*3T|G@AbFK@2P|BvT536yKI|J&V^24(+-n-kIBLbQ(1xL@o(~S z)-=0Be4oxPoS9>nH4$^|(tS7SIcOm}c$BygEw)Qd-=%i>T7b-2PJ%X($ER1Y8BJHR z(|!K2%heid?0giE9=mc`B*(PPe9?TnjW4NB4>{yjf4<e{xA6VG_a;&<iXQ{=o0K`u zx9crW_@*Cxol64IzV95;VkqC`hkoK)_|(er4)M$I$01kS@hkB2z<La$4vJuy_a47j zSLyH7=^6M%db~Y98B2C&mRTdnmm0YPWmExv_C3%G`+b+Y`8m>#A2r{u@oUH5Z#M^L zIH@&?Jd=IAUv7}NCHw92`Su~Z6#GKLzmb;C!*<ydaFj#bj<|c1uU$^?(hfdl7uUu( zrfiq&{GlgN9k21;Jweh`xz20em0Z7c!_F86$(`^vM=g#tsCU;chenfD_Iq}D?jRfA zkoGg~+a;OpwOs<=lVl^`*k#|!x4ildKiH*n;!mt}{Aas-zx3NK(-Qn)7H<}Z<a?dV zAv+IdbjZMQBu4@63l8yjNRjrr`2|!VuS5J@fgIf?c^q=+vCSdw;RPKsy;dQIlpaym zA$Ka5cgVA^WW}3u%rd&7Lk8C(ErxPmHwRNyw^!l^%&;mB*>$_JL(0b7@~h=Z(8Rw> zbcfzCE!*~rZre>dw~dNz8Phf<M!H0`6w|VEMD%K(ZVC7=BmHmUdsiyitbR<}ZZXXw zIz*VD))74;qIx&05Eap;OO%Ny)U0h(kC<j%qT5Erw4wjI=4PSNx>=0Gw#^$I(IzsY zeOs38)QLGvWWF|Cy0y*se|i3BMva1^d*4b{x^oxPy;Iw=$@Ra}w4VQ#Q^ExQ{qz6x j5%5j$-#`Byf&Y%ce@EcIBk<o5`0oh(cLe@lJ_7#(^keqD literal 0 HcmV?d00001 diff --git a/core/__pycache__/reference_space.cpython-37.pyc b/core/__pycache__/reference_space.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2d118e86806fa7a6361e89542d2cfae37048bda GIT binary patch literal 13332 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/reference_space_cache.cpython-37.pyc b/core/__pycache__/reference_space_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86b5191a08151db595216afd393f0231924b6bda GIT binary patch literal 9374 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 b&04DPTe_J^z}s|aDvw@)7O6i=-R*w?TP!_C literal 0 HcmV?d00001 diff --git a/core/__pycache__/simple_tree.cpython-37.pyc b/core/__pycache__/simple_tree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..401d220aaefcc2dabaa90fc45d641e686a22751e GIT binary patch literal 11810 zcmd5?%WvGq8Ru(PtCcLv@*{ELIE<ZG-o)NGZBZny?Z%e!aO)^W>@<NQVN2~$60Kcw zJ><&PW`&}$i#R|oMNhp+EqZ8+UV7}M|3QIXc`A@o&b{T*{=OM<NUk1Mjnwf1<nl4| z%{TMCe&08|vTt8i!_WWyFP*Pm)wHkZCjD8scoRqXE>28idP|#?|N5+fd!uExtyxQ_ zXJ)I^F3*<5wbdGGS7s}^_KwC%tbAW%Wq0_VIa_7=4XrlxHK=JbH9a0-?xNFeMa*kP zxE=N)m*Z%MxT!L?!`-G6xvWX;)1Tt$uXy5WvpUnji_VPu+N{Y;X5rtGqt2GtB&)FD z`}%B|RoMvM47n9HdQWHj*w}sTo<2Lw_Oo$3ud)Md0{<iIAUlNrQFfRe!T&zAe+unS zv!~h7`#O4zu^M}ZJqw!q@$MMjJ;#m<TI1|_W~0vm_5wSB{|R=Iy@>yV>?L*z|A*KR zX8&?rz2UVxE%zpO-6qY3eq|hVZQ=+&!|8KvQ5UnS^z~_Q+SeM|=Q^I5m}w=#{VhCA z-WbfH`O~xHiFx-N?u=<|{?xifSAFZKwqEL&SZQULzl$ekzjRdFu=>`fu4}j7{YZO& z{*BTD8mY`m;I!=g87y74BQR=*5$`smE_bVT@>3Vr9qzPUh%Qu*&Z?h!<Oj?R?elia z3nM#Nv`OabC6Ro~X)cSWwinutP3>*Zx1(iOa8S2z;%dcR3#m6fB?`8Wp~YQ+R)+^2 zmq#8(Od1Pvj?e6HIq0^Sz2Mr-zz@NU>qoZJ<UtsUF~ho|M12|_Ycv<Y_hQ#?Mqc3C zeaV^_{p_WLPo_H2RHmF(%k!7SyMzEbCUc^WpyTj0JLoPgM|Kq0;FooqE}C?G?{?R< z3*<Zo9=%1+<@RF0F<S@orsX+(2eZIfc!V{hHKE6oq3yAnT(4-YGe9iA9v-8$?skZU zwV->(Ug$zLDO1}nQGqcU4YI<jw!4rjIxIWkva`@~vqkJU9Nh1;j194j7cbeeS;l{1 zoXb))l8EGzyHG}7P8!q5%?i_(#4;X8CW_!p5V-@Is@`3VXhB>jToY1ppc4+L`OFFJ zX(w{tCQY|-ldg4Gw|_!Y?}h_f7zJ`_FpT9u@y9@8QP604D=@0yyc(K#B->~Ni^-yp zNO(hasV5{)Pr@w*oK4mWeMMtosu%6d!JN*MJY(1E^{m%a;IERAKvA87SqkkW+kska zGkr48Rv6gmyp}C1Et=H1Y@x`)gx`SHvH%3VNN6y4El#{RQ~P4F=5<A?Fpq2sv}hR% zO&yMteg=*bj)OSDBRF~RZS!O6dS8c^gBSmeaof6~{ZZrOcWXv$)X&AbPf;hcdGYQW zXX^aihar61oU`n(`hs)E@z>@q`wr&DobS)M{%SY}XXA%WoP*BtS~z#jTbK(G$If<~ z=8CiAqHn8(7Hs8J2+n;q6#l<K!m4-HzNuayBWMQg&ZVCc!^C}A>rG}-tT!5-??sJ9 z{X#2%!H1XXSsyiP6a6TLh*>{_3o+}7Ib&U4H!yDlQ6!nUn46ru$%oK1Hhqur3a+pS zqj{T^O$j6L5uC2!NH|mj6T>v{4SF|$lNh+Vt}kJ+<x=McG{k^>6z#I7Tn+FZ5s^zU zQyYrQ4dG-sO)eg3D9*yT+Gs9&Ee59$#$~4i5imYXMEBuTE5}yowie@(?5<vjabvTC z*-F`GeFP72C0*;Y#0bqsJAO!iMxQW7^{QUc4;f{>cW@ioG>K{Y(LZV56pru^PLYOq zO%dDJFgLY(kOQKt?%amDzP}JT2y&VINte3lwGdBTgsC++3Amgl;UW&hR5q_JuJ0-Q zDgrx&GWg(yAZRJFWLfX~tu^72Lt(aemOX^%jFR%f91-h|hd6`?ARoGH2k-lV^xJBf z1SqKcJUp<APU0#dLmS~l20s-?g{PvJ*nz*snvrjo3z+es=+~^+qA}vKY{JJNpt!v1 zw7PCsGdKx69#(T4(9n2P_L55ZF$q{meShz%oJQo^G)ZykM^;9M(2DE0@U(UF?%U7` zZA0G#ZkvA{NKNls_jKSi;5Gc0`=!3QQs!?)K)4%bzuXt7Z4(;wnJ(`xXt&2d()uPe z%5c5}GnqyO!OB^R?G%q8mX?#a`i|pq3Yes7ggjEDlz<?$R6-Tiox0eYzAf^g-B|Q@ z(Y6#S*kbJ!dD6R^14u9EMjap%CGj<-ZGo^KX()t*D3}#UrF;N?xdbq2Qg!==0)Y~5 zWr~6zyB*gGr)<xxRG$=uB<w20n3~2znU#YVSS?IO-8{^S1ga`p&wEZMgDt7p*KA~9 zo-fxgT`ENV6y9X*)X*fKTqntL5kIT8y(=kAU<N+`Op@rf(A=I1Ah(d9^@1DSab4g3 z^xV2Ym7l)0UawigMETP&nRxVrE|75BeT(ye!-NCgcB0ylwA!I$u(%|cnl)D2u|@KZ zO{5KRNeF4spohiNM%(G!!T{3WAGY*yc>0P_(aZXnK5Fz1<*ZwEm{Hjqd3%+;QLfxK znZ8ot<IG^@eb{+~?CPE#o)TG|g=dv@%eNkAl$&k9=KJQR@r5q(JIa?UeS`8i*z}Nd z5;pygD*=B<@xZaej@zVkfGP1*)spYcI<X$GOl5(9XQ{F(La7}l4q}ZUE)!v(1;^6u zY-2?B)kScZQaU4zv_KH?!Sh#x6;Rq<%M(MAX=0)44Y%bY--Emn_F?6?Z6mQjWP+y= z3Y+kydJUTL89V5R%&QpWriBGa+mMzUq9w&-IL5QWNiH}@6zeuxQnf<hVj1SPxEnH@ zJIetau5dKqMX~cRn-!7oeAb=>p!j)Bti14Go=?6|EL1&{`;0<k1cK=hXpFS7kIR}q zBk_(N>vsojpmL$*v=^9j>33-TZyZ{$o>O?5N!VCeYow}>L!n8>!r&AU1qLNJ*@xyI zEik}O;&DyqHvS|h0{gv)+dt5wmvB<_h!)L3&?77bNU6<_t_vK0RQt8S@!5P3zy+E$ zR#!2?3AE2f0M4c*7C8G)c$0w4-nqR_HSLUip+d2S;;I;<RuT?K&WQXJKTfCT(&53C zP1k}SnrwVv%bI?P$01=6?XdJbV}=F9**mrycWRkP-n3LxI6@jB!ZO`LqC=AJ{Wie_ z%Bur1Q>;<}F<)m<`l>GWrnss(>8&zOh1O_D)kIxjWhgxp9v%WC@RbQO!Q-@41oHnv zbE8RW)dK!b-}g=+Ps^pg^(<Gw{7~mX`c}Z`CP=9TgC9n+vMCmfN|V*BcY+G}%V<By z-LPu*H@ubX6~l#Uuw`r-Uj&@NS|5aFIv-})0m&^9S>U@iymcFCr0_7|WK!(NDjI5W zukR@_NS6=sKzJbNMH&|rB@$_dz7tl23X`+Ls>?}+RIz~950|NO09=tv0u-%1X;Y2~ z@TK~0%ZK!bf*Z9Mq|hjlxI6=Piik2A(k10vNDYN=L6zVEFnM1uco!(=ezZvZi%231 z`bsv(Cvo}*4xt9f;A=VCRca9Cy=UrDgj#LUvvdSO{1p)XdrDl}-#ff5@&8fDmiDS- zBGpDAPpzW5c#K+>GO>%Ak%lPN_Nr=wdcU*EQA^=E3rd&rB?_;(`f-7oM^(FV$o%1I z_peklpmwKonju&t@A+t2hfFxFvHUX~0lJrm!>WN&Jwn4O)BPE4mb7)_?ls!Sn4exZ z`{t6qZrwfAw-{`U8Q70F-?!j>1rnxbOYp;DSK<gVTVn&cFmSZ~E90mpo>u9p@R4u8 zgmbZNXCLYKO*f2!+zy3OlE<jOii=$oSn>6^lvgn|Nik*{f4N(|{2gx<=^Di+DrRO0 z=Vco^BUk7&r6y$m9JkZiZDyx8(O<Daz+_5Pc|MssV_!LAU!Ip`<wA?gvPJq%Q7tr@ zmW`%~hH9ZMzWxt>Gc_|VyLYh(#5j3aegLNw&r!gSO<-_YG#qMnIqhW(Vt~<fP_nbH z&`099r!BpTTHzRKhewP;eJI~vSq)hX6<7r#S-^#`nvVhG0OMde*HFhbkuO@Xo|3c` zvJ<iw)QQUcdcU+`MCOJSm2Q=zp{Rm3!~OE6e$Uu6$ZlXs)qY7>&{$$YhV$%REeI(< z6N}^^<5DZAE*_%|<@k7#tSHCUcWXyEM#z#9JAoO&n5Gj;8fcSP+x#}R&ndB}jl{#Q z-)*}boAI2=;v63eph_w-ebkIme@Cqv`<Jm1bYjzCEH+V45zsy!%SI#nkOn3zHWE>v zBU*;%$sK{$=&q7R)B#iDZ{RIHF-Yn(Pg$tSm-TUj>NVrWnBF^@3w_0Ld&dT{0|{S~ z#6Vdg%t7qI@01sCN<_B+HOZ!cY0u;RE5spD(v05z97i<dmXSmjZ~|@nuw|+lJwPV1 zsjcfGE1>#O@&y1Qo+YvZss?S72P}3`fLA3_DvGC-5tMtkckPeGZjlP)w*}HFirD3E zwKAnEpryS=KUwI^LJ1McG8HLf?749_>|no+$~Cm7$(OpQKo!;`tDlhIR9Zk)36T~Y zlbeUPG?e3yr3r#>u%rZm`U=oG<?j#2YL`>>09Jc(Ks~m_X`oD@Xp7nv@&i)Lb3~c8 zwX`uRBJ{=wsrQZ#SV2eZ&SPU%CdgZ~b0<59hmxLKn96J+F3UF4>3m@h2XY+Aw}l}I zItqiJDhe6GU}`K9bklhcBnxJMos2>TDDPB&QWw`Be@>iM{}+R9J|X@;sCyz3^80(# ze6=o*nw{(|DgHRs0BHQFEgG<s&Ts2#3p#%RT5>g|jl5)HEA4`Mk!c8xrfgsA%F>rn z8g|xzq}0Cb{LacH;?fhKTWNe$`(WROa;0hT?mktez`3=+r&N1zu}aynr6a0-uR{tV zpbAj2iznefLd#Ebg3j;1r)%*DlD@UGq%-vJ1c*ChCj2fXp0Tl4|59*rTg6UrZWpoB z_n|85Xy?R#BxmQjCXb*2Y-bHfv$Q8b{wXWpsq|AOz9rdz?;)}uPR9#>k&}GB@}wFF z@CE!eQ#(wb@6acqjRw9CYP9iHWs9yy8;#ptrzPL;!{m4911V0po7d<>0E-js<7en3 zY5^kEAwEUk!3o++cXg4jDEJ7+#4pj+kLg4KCU+7U0bv@V84{KREPJIgQ8`h4p|Wqh zgsX|l$;wM*eblNRO715(^{9>TAK)*p(B~NrN>}`cbUV_-W;ymjv0EN;LaMPDdUwUw wQL_irugvP%r_*9eaXDDHg-(KSjy=IG@fcSw$fdeOJcjfLjOwG<`W`j^3lMW#egFUf literal 0 HcmV?d00001 diff --git a/core/__pycache__/sitk_utilities.cpython-37.pyc b/core/__pycache__/sitk_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6edc394b8d1eb508c4d1129575cadd091e80fc42 GIT binary patch literal 3502 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 L_>JVv`1Zd5X7an4 literal 0 HcmV?d00001 diff --git a/core/__pycache__/structure_tree.cpython-37.pyc b/core/__pycache__/structure_tree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f71db43aa19fbc6b60b29a97f969316f67c9a3de GIT binary patch literal 14567 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/swc.cpython-37.pyc b/core/__pycache__/swc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..232a223a6f2e23c66e927ca7feea128be44a3721 GIT binary patch literal 25986 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 P@~O!`VI=?Fot*mLXqr58 literal 0 HcmV?d00001 diff --git a/core/__pycache__/typing.cpython-37.pyc b/core/__pycache__/typing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab1a13c4bf7c44770e0e910fade8843b19cfe686 GIT binary patch literal 709 zcmZuv&59H;5Khv+J3Bip`T~s?nS-+jFCrqVgNPu5Fo@bTgiMm%877^yNk-|t$?ju# z^W-b#>d9B|WTj^o_h2>kb^UZzeO2_!lamnw(LcVi3yjdO=-f&P#yO~~0R$3Qp&Iq4 zU=f8|QWK0mAYG+MCfkvHf>C@Rn?N>=*-uE5k1>*}tj+5jqt{4eBELZ*m*hIB3xStt zTKtCoXfeg1d}oa}+$gY*=pARmR?b_-eJlOi2p$V=B?aRg)I9)@sKx@-MBqA+smuiV zjzuEUoAesjxyWE#9*&p0t~1uVrMFiP=ZZNeUFFxzS8ksHM^===OiHW$OrVro>33Fh zIMg8V9d!=sA`O9{KVJL<2&t3m!WIx6;7>Du+Prttx`wTpn621Xru*iFX547O9yd~d zagFJub{x=j>)thQH><{NynNI#zGasZYL$X7#P*CEE6;r2ZS>`=>qBuMJBd^X03uiS z@2ojH<QLN-l$2`LN=n0s($<KbiuRb&&pW0L8R#brr_{!^LIQ`d@kjZ$&)zzUu?%1g z>T-Y*r<mX&HZ7sBcOl=?w2@Xge$&R&zp~a?o5V=MR(u#U6#Z{PD4*?VK9ARSaaM^5 LImHulkBpPQ9$l_< literal 0 HcmV?d00001 diff --git a/core/auth_config.py b/core/auth_config.py new file mode 100644 index 0000000000..845090065d --- /dev/null +++ b/core/auth_config.py @@ -0,0 +1,31 @@ +CREDENTIAL_KEYS = [ + # key, default value + ("LIMS_DBNAME", None), + ("LIMS_USER", None), + ("LIMS_HOST", None), + ("LIMS_PORT", 5432), + ("LIMS_PASSWORD", None), + ("MTRAIN_DBNAME", None), + ("MTRAIN_USER", None), + ("MTRAIN_HOST", None), + ("MTRAIN_PORT", 5432), + ("MTRAIN_PASSWORD", None) +] + +# For PostgresQueryMixin +LIMS_DB_CREDENTIAL_MAP = { + "dbname": "LIMS_DBNAME", + "user": "LIMS_USER", + "host": "LIMS_HOST", + "password": "LIMS_PASSWORD", + "port": "LIMS_PORT" +} + +# For PostgresQueryMixin +MTRAIN_DB_CREDENTIAL_MAP = { + "dbname": "MTRAIN_DBNAME", + "user": "MTRAIN_USER", + "host": "MTRAIN_HOST", + "password": "MTRAIN_PASSWORD", + "port": "MTRAIN_PORT" +} \ No newline at end of file diff --git a/core/authentication.py b/core/authentication.py new file mode 100644 index 0000000000..48867c2eab --- /dev/null +++ b/core/authentication.py @@ -0,0 +1,112 @@ +import os +from typing import Optional, Dict, Any +import logging +from functools import wraps +from abc import ABC, abstractmethod +from collections import namedtuple +from allensdk.core.auth_config import CREDENTIAL_KEYS + + +logger = logging.getLogger(__name__) + +DbCredentials = namedtuple("DbCredentials", + ["dbname", "user", "host", "port", "password"]) + + +class CredentialProvider(ABC): + METHOD = "custom" + @abstractmethod + def provide(self, credential): + pass + + +class EnvCredentialProvider(CredentialProvider): + """ + Provides credentials from environment variables for variables listed + in CREDENTIAL_KEYS. + """ + METHOD = "env" + + def __init__(self, environ: Optional[Dict[str, Any]] = None): + """ + Parameters + ---------- + environ: dictionary or os.environ + A dictionary that provides the values for keys in + CREDENTIAL_KEYS. If not provided, defaults to os.environ to + provide environment variables. + """ + if environ is None: + environ = os.environ + self.credentials = dict((k[0], environ.get(k[0], k[1])) + for k in CREDENTIAL_KEYS) + + def provide(self, credential): + return self.credentials.get(credential) + + +CREDENTIAL_PROVIDER = EnvCredentialProvider() + + +def set_credential_provider(provider): + logger.info(f"Setting provider to method '{provider.METHOD}.") + global CREDENTIAL_PROVIDER + CREDENTIAL_PROVIDER = provider + + +def get_credential_provider(): + return CREDENTIAL_PROVIDER + + +def credential_injector(credential_map: Dict[str, Any], + provider: Optional[CredentialProvider] = None): + """ + Decorator used to inject credentials from another source if not + explicitly provided in the function call. This function will only supply + values for keyword arguments. All keys defined in `credential_map` must + correspond to keyword arguments in the function signature. + + PARAMETERS + ---------- + credential_map: Dict[Str: Any] + Dictionary where the keys are the keyword of a credential kwarg + passed to the decorated function, and the values are the name + of the credential in the credential provider (see CREDENTIAL_KEYS). + + Example of credential_map for PostgresQueryMixin connecting to + LIMS database: + { + "dbname": "LIMS_DBNAME", + "user": "LIMS_USER", + "host": "LIMS_HOST", + "password": "LIMS_PASSWORD", + "port": "LIMS_PORT" + } + provider: Optional[CredentialProvider] + Subclass of CredentialProvider to provide credentials to the + wrapped function. If left unspecified, will default to + EnvCredentialProvider, which provides credentials from environment + variables. + """ + if provider is None: + provider = get_credential_provider() + + def injector_decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + for kw, credential in credential_map.items(): + if kw not in kwargs.keys(): + logger.info(f"No explicit value provided for {kw}. " + "Searching credential provider.") + secret = provider.provide(credential) + if secret is not None: + logger.info("Found value in credential provider, " + f"from '{provider.METHOD}' method.") + kwargs.update({kw: provider.provide(credential)}) + else: + logger.warning( + f"Value for {kw} was neither explicitly provided " + "nor found in credential provider.") + return func(*args, **kwargs) + return wrapper + return injector_decorator diff --git a/core/brain_observatory_cache.py b/core/brain_observatory_cache.py new file mode 100644 index 0000000000..bdc6b67b93 --- /dev/null +++ b/core/brain_observatory_cache.py @@ -0,0 +1,665 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import six +import numpy as np +import pandas as pd + +from pathlib import Path + +from allensdk.api.warehouse_cache.cache import Cache, get_default_manifest_file +from allensdk.api.queries.brain_observatory_api import BrainObservatoryApi +from allensdk.config.manifest_builder import ManifestBuilder +from .brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet +import allensdk.brain_observatory.stimulus_info as stim_info + +from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise +from allensdk.brain_observatory.natural_scenes import NaturalScenes +from allensdk.brain_observatory.natural_movie import NaturalMovie +from allensdk.brain_observatory.static_gratings import StaticGratings +from allensdk.brain_observatory.drifting_gratings import DriftingGratings + +from allensdk.brain_observatory.nwb import (read_eye_gaze_mappings, + create_eye_gaze_mapping_dataframe) + +# NOTE: This is a really ugly hack to get around the fact that warehouse does +# not have Ophys session ids associated with experiment ids. +from .ophys_experiment_session_id_mapping import ophys_experiment_session_id_map + +ANALYSIS_CLASS_DICT = {stim_info.LOCALLY_SPARSE_NOISE: LocallySparseNoise, + stim_info.LOCALLY_SPARSE_NOISE_4DEG: LocallySparseNoise, + stim_info.LOCALLY_SPARSE_NOISE_8DEG: LocallySparseNoise, + stim_info.NATURAL_MOVIE_ONE:NaturalMovie, + stim_info.NATURAL_MOVIE_TWO:NaturalMovie, + stim_info.NATURAL_MOVIE_THREE:NaturalMovie, + stim_info.NATURAL_SCENES:NaturalScenes, + stim_info.STATIC_GRATINGS:StaticGratings, + stim_info.DRIFTING_GRATINGS:DriftingGratings} + +class BrainObservatoryCache(Cache): + """ + Cache class for storing and accessing data from the Brain Observatory. + By default, this class will cache any downloaded metadata or files in + well known locations defined in a manifest file. This behavior can be + disabled. + + Attributes + ---------- + + api: BrainObservatoryApi instance + The object used for making API queries related to the Brain + Observatory. + + Parameters + ---------- + + cache: boolean + Whether the class should save results of API queries to locations specified + in the manifest file. Queries for files (as opposed to metadata) must have a + file location. If caching is disabled, those locations must be specified + in the function call (e.g. get_ophys_experiment_data(file_name='file.nwb')). + + manifest_file: string + File name of the manifest to be read. Default is "brain_observatory_manifest.json". + """ + + EXPERIMENT_CONTAINERS_KEY = 'EXPERIMENT_CONTAINERS' + EXPERIMENTS_KEY = 'EXPERIMENTS' + CELL_SPECIMENS_KEY = 'CELL_SPECIMENS' + EXPERIMENT_DATA_KEY = 'EXPERIMENT_DATA' + ANALYSIS_DATA_KEY = 'ANALYSIS_DATA' + EVENTS_DATA_KEY = 'EVENTS_DATA' + STIMULUS_MAPPINGS_KEY = 'STIMULUS_MAPPINGS' + EYE_GAZE_DATA_KEY = 'EYE_GAZE_DATA' + MANIFEST_VERSION = '1.3' + + def __init__(self, cache=True, manifest_file=None, base_uri=None, api=None): + + if manifest_file is None: + manifest_file = get_default_manifest_file('brain_observatory') + + super(BrainObservatoryCache, self).__init__( + manifest=manifest_file, cache=cache, version=self.MANIFEST_VERSION) + + if api is None: + self.api = BrainObservatoryApi(base_uri=base_uri) + else: + self.api = api + + def get_all_targeted_structures(self): + """ Return a list of all targeted structures in the data set. """ + containers = self.get_experiment_containers(simple=False) + targeted_structures = set( + [c['targeted_structure']['acronym'] for c in containers]) + return sorted(list(targeted_structures)) + + def get_all_cre_lines(self): + """ Return a list of all cre driver lines in the data set. """ + containers = self.get_experiment_containers(simple=True) + cre_lines = set([c['cre_line'] for c in containers]) + return sorted(list(cre_lines)) + + def get_all_reporter_lines(self): + """ Return a list of all reporter lines in the data set. """ + containers = self.get_experiment_containers(simple=True) + reporter_lines = set([c['reporter_line'] for c in containers]) + return sorted(list(reporter_lines)) + + def get_all_imaging_depths(self): + """ Return a list of all imaging depths in the data set. """ + containers = self.get_experiment_containers(simple=True) + imaging_depths = set([c['imaging_depth'] for c in containers]) + return sorted(list(imaging_depths)) + + def get_all_session_types(self): + """ Return a list of all stimulus sessions in the data set. """ + exps = self.get_ophys_experiments(simple=False) + names = set([exp['stimulus_name'] for exp in exps]) + return sorted(list(names)) + + def get_all_stimuli(self): + """ Return a list of all stimuli in the data set. """ + return sorted(list(stim_info.all_stimuli())) + + def get_experiment_containers(self, file_name=None, + ids=None, + targeted_structures=None, + imaging_depths=None, + cre_lines=None, + reporter_lines=None, + transgenic_lines=None, + include_failed=False, + simple=True): + """ Get a list of experiment containers matching certain criteria. + + Parameters + ---------- + file_name: string + File name to save/read the experiment containers. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + ids: list + List of experiment container ids. + + targeted_structures: list + List of structure acronyms. Must be in the list returned by + BrainObservatoryCache.get_all_targeted_structures(). + + imaging_depths: list + List of imaging depths. Must be in the list returned by + BrainObservatoryCache.get_all_imaging_depths(). + + cre_lines: list + List of cre lines. Must be in the list returned by + BrainObservatoryCache.get_all_cre_lines(). + + reporter_lines: list + List of reporter lines. Must be in the list returned by + BrainObservatoryCache.get_all_reporter_lines(). + + transgenic_lines: list + List of transgenic lines. Must be in the list returned by + BrainObservatoryCache.get_all_cre_lines() or. + BrainObservatoryCache.get_all_reporter_lines(). + + include_failed: boolean + Whether or not to include failed experiment containers. + + simple: boolean + Whether or not to simplify the dictionary properties returned by this method + to a more concise subset. + + Returns + ------- + list of dictionaries + """ + _assert_not_string(targeted_structures, "targeted_structures") + _assert_not_string(cre_lines, "cre_lines") + _assert_not_string(reporter_lines, "reporter_lines") + _assert_not_string(transgenic_lines, "transgenic_lines") + + file_name = self.get_cache_path( + file_name, self.EXPERIMENT_CONTAINERS_KEY) + + containers = self.api.get_experiment_containers(path=file_name, + strategy='lazy', + **Cache.cache_json()) + + containers = self.api.filter_experiment_containers(containers, ids=ids, + targeted_structures=targeted_structures, + imaging_depths=imaging_depths, + cre_lines=cre_lines, + reporter_lines=reporter_lines, + transgenic_lines=transgenic_lines, + include_failed=include_failed, + simple=simple) + + return containers + + def get_ophys_experiment_stimuli(self, experiment_id): + """ For a single experiment, return the list of stimuli present in that experiment. """ + exps = self.get_ophys_experiments(ids=[experiment_id]) + + if len(exps) == 0: + return None + + return stim_info.stimuli_in_session(exps[0]['session_type']) + + def get_ophys_experiments(self, file_name=None, + ids=None, + experiment_container_ids=None, + targeted_structures=None, + imaging_depths=None, + cre_lines=None, + reporter_lines=None, + transgenic_lines=None, + stimuli=None, + session_types=None, + cell_specimen_ids=None, + include_failed=False, + require_eye_tracking=False, + simple=True): + """ Get a list of ophys experiments matching certain criteria. + + Parameters + ---------- + file_name: string + File name to save/read the ophys experiments. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + ids: list + List of ophys experiment ids. + + experiment_container_ids: list + List of experiment container ids. + + targeted_structures: list + List of structure acronyms. Must be in the list returned by + BrainObservatoryCache.get_all_targeted_structures(). + + imaging_depths: list + List of imaging depths. Must be in the list returned by + BrainObservatoryCache.get_all_imaging_depths(). + + cre_lines: list + List of cre lines. Must be in the list returned by + BrainObservatoryCache.get_all_cre_lines(). + + reporter_lines: list + List of reporter lines. Must be in the list returned by + BrainObservatoryCache.get_all_reporter_lines(). + + transgenic_lines: list + List of transgenic lines. Must be in the list returned by + BrainObservatoryCache.get_all_cre_lines() or. + BrainObservatoryCache.get_all_reporter_lines(). + + stimuli: list + List of stimulus names. Must be in the list returned by + BrainObservatoryCache.get_all_stimuli(). + + session_types: list + List of stimulus session type names. Must be in the list returned by + BrainObservatoryCache.get_all_session_types(). + + cell_specimen_ids: list + Only include experiments that contain cells with these ids. + + include_failed: boolean + Whether or not to include experiments from failed experiment containers. + + simple: boolean + Whether or not to simplify the dictionary properties returned by this method + to a more concise subset. + + require_eye_tracking: boolean + If True, only return experiments that have eye tracking results. Default: False. + + Returns + ------- + list of dictionaries + """ + _assert_not_string(targeted_structures, "targeted_structures") + _assert_not_string(cre_lines, "cre_lines") + _assert_not_string(reporter_lines, "reporter_lines") + _assert_not_string(transgenic_lines, "transgenic_lines") + _assert_not_string(stimuli, "stimuli") + _assert_not_string(session_types, "session_types") + + file_name = self.get_cache_path(file_name, self.EXPERIMENTS_KEY) + + exps = self.api.get_ophys_experiments(path=file_name, + strategy='lazy', + **Cache.cache_json()) + + # NOTE: Ugly hack to update the 'fail_eye_tracking' field + # which is using True/False values for the previous eye mapping + # implementation. This will also need to be fixed in warehouse. + # ----- Start of ugly hack ----- + response = self.api.template_query('brain_observatory_queries', + 'all_eye_mapping_files') + + session_ids_with_eye_tracking: set = {entry['attachable_id'] + for entry in response + if entry['attachable_type'] == "OphysSession"} + + for indx, exp in enumerate(exps): + try: + ophys_session_id = ophys_experiment_session_id_map[exp['id']] + if ophys_session_id in session_ids_with_eye_tracking: + exps[indx]['fail_eye_tracking'] = False + else: + exps[indx]['fail_eye_tracking'] = True + except KeyError: + exps[indx]['fail_eye_tracking'] = True + # ----- End of ugly hack ----- + + if cell_specimen_ids is not None: + cells = self.get_cell_specimens(ids=cell_specimen_ids) + cell_container_ids = set([cell['experiment_container_id'] for cell in cells]) + if experiment_container_ids is not None: + experiment_container_ids = list(set(experiment_container_ids) - cell_container_ids) + else: + experiment_container_ids = list(cell_container_ids) + + exps = self.api.filter_ophys_experiments(exps, + ids=ids, + experiment_container_ids=experiment_container_ids, + targeted_structures=targeted_structures, + imaging_depths=imaging_depths, + cre_lines=cre_lines, + reporter_lines=reporter_lines, + transgenic_lines=transgenic_lines, + stimuli=stimuli, + session_types=session_types, + include_failed=include_failed, + require_eye_tracking=require_eye_tracking, + simple=simple) + + return exps + + def _get_stimulus_mappings(self, file_name=None): + """ Returns a mapping of which metrics are related to which stimuli. Internal use only. """ + + file_name = self.get_cache_path(file_name, self.STIMULUS_MAPPINGS_KEY) + + mappings = self.api.get_stimulus_mappings(path=file_name, + strategy='lazy', + **Cache.cache_json()) + + return mappings + + def get_cell_specimens(self, + file_name=None, + ids=None, + experiment_container_ids=None, + include_failed=False, + simple=True, + filters=None): + """ Return cell specimens that have certain properies. + + Parameters + ---------- + file_name: string + File name to save/read the cell specimens. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + ids: list + List of cell specimen ids. + + experiment_container_ids: list + List of experiment container ids. + + include_failed: bool + Whether to include cells from failed experiment containers + + simple: boolean + Whether or not to simplify the dictionary properties returned by this method + to a more concise subset. + + filters: list of dicts + List of filter dictionaries. The Allen Brain Observatory web site can + generate filters in this format to reproduce a filtered set of cells + found there. To see what these look like, visit + http://observatory.brain-map.org/visualcoding, perform a cell search + and apply some filters (e.g. find cells in a particular area), then + click the "view these cells in the AllenSDK" link on the bottom-left + of the search results page. This will take you to a page that contains + a code sample you can use to apply those same filters via this argument. + For more detail on the filter syntax, see BrainObservatoryApi.dataframe_query. + + + Returns + ------- + list of dictionaries + """ + + file_name = self.get_cache_path(file_name, self.CELL_SPECIMENS_KEY) + + cell_specimens = self.api.get_cell_metrics(path=file_name, + strategy='lazy', + pre= lambda x: [y for y in x], + **Cache.cache_json()) + + cell_specimens = self.api.filter_cell_specimens(cell_specimens, + ids=ids, + experiment_container_ids=experiment_container_ids, + include_failed=include_failed, + filters=filters) + + # drop the thumbnail columns + if simple: + mappings = self._get_stimulus_mappings() + thumbnails = [m['item'] for m in mappings if m[ + 'item_type'] == 'T' and m['level'] == 'R'] + for cs in cell_specimens: + for t in thumbnails: + del cs[t] + + return cell_specimens + + + def get_nwb_filepath(self, ophys_experiment_id=None): + cache_nwb_filepath = self.get_cache_path(None, self.EXPERIMENT_DATA_KEY, ophys_experiment_id) + if os.path.exists(cache_nwb_filepath): + return cache_nwb_filepath + else: + return None + + + def get_ophys_experiment_data(self, ophys_experiment_id, file_name=None): + """ Download the NWB file for an ophys_experiment (if it hasn't already been + downloaded) and return a data accessor object. + + Parameters + ---------- + file_name: string + File name to save/read the data set. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + ophys_experiment_id: integer + id of the ophys_experiment to retrieve + + Returns + ------- + BrainObservatoryNwbDataSet + """ + file_name = self.get_cache_path( + file_name, self.EXPERIMENT_DATA_KEY, ophys_experiment_id) + + self.api.save_ophys_experiment_data(ophys_experiment_id, file_name, strategy='lazy') + + return BrainObservatoryNwbDataSet(file_name) + + def get_ophys_experiment_analysis(self, ophys_experiment_id, stimulus_type, file_name=None): + """ Download the h5 analysis file for a stimulus set, for a particular ophys_experiment + (if it hasn't already been downloaded) and return a data accessor object. + + Parameters + ---------- + file_name: string + File name to save/read the data set. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + ophys_experiment_id: int + id of the ophys_experiment to retrieve + + stimulus_name: str + stimulus type; should be an element of self.list_stimuli() + + Returns + ------- + BrainObservatoryNwbDataSet + """ + data_set = self.get_ophys_experiment_data(ophys_experiment_id, file_name=None) + session_type = data_set.get_session_type() + + if not stimulus_type in stim_info.SESSION_STIMULUS_MAP[session_type]: + raise RuntimeError('Stimulus %s not available session type: %s' % (stimulus_type, stim_info.SESSION_STIMULUS_MAP[stimulus_type])) + + # Use manifest to figure out where to cache the file: + file_name = self.get_cache_path(file_name, self.ANALYSIS_DATA_KEY, ophys_experiment_id, session_type) + + # Cache the analsis file from an RMA query: + self.api.save_ophys_experiment_analysis_data(ophys_experiment_id, file_name, strategy='lazy') + + # Get the analysis class from ANALYSIS_CLASS_DICT, and build from the static method: + if stimulus_type in stim_info.LOCALLY_SPARSE_NOISE_STIMULUS_TYPES+stim_info.NATURAL_MOVIE_STIMULUS_TYPES: + return ANALYSIS_CLASS_DICT[stimulus_type].from_analysis_file(data_set, file_name, stimulus_type) + else: + return ANALYSIS_CLASS_DICT[stimulus_type].from_analysis_file(data_set, file_name) + + def get_ophys_experiment_events(self, ophys_experiment_id, file_name=None): + """ Download the npz events file for an ophys_experiment if it hasn't + already been downloaded and return the events array. + + Parameters + ---------- + file_name: string + File name to save/read the data set. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + ophys_experiment_id: int + id of the ophys_experiment to retrieve events for + Returns + ------- + events: numpy.ndarray + [N_cells,N_times] array of events. + """ + file_name = self.get_cache_path( + file_name, self.EVENTS_DATA_KEY, ophys_experiment_id) + + self.api.save_ophys_experiment_event_data(ophys_experiment_id, file_name, strategy='lazy') + + return np.load(file_name, allow_pickle=False)["ev"] + + def get_ophys_pupil_data(self, + ophys_experiment_id: int, + file_name: str = None, + suppress_pupil_data: bool = True) -> pd.DataFrame: + """Download the h5 eye gaze mapping file for an ophys_experiment if + it hasn't already been downloaded and return it as a pandas.DataFrame. + + Parameters + ---------- + file_name: string + File name to save/read the data set. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + ophys_experiment_id: int + id of the ophys_experiment to retrieve pupil data for. + + suppress_pupil_data: bool + Whether or not to suppress pupil data from dataset. + Default is True. + + Returns + ------- + pd.DataFrame + If 'suppress_eye_gaze_data' is set to 'False': + Contains raw/filtered columns for gaze mapping: + *_eye_area + *_pupil_area + *_screen_coordinates_x_cm + *_screen_coordinates_y_cm + *_screen_coordinates_spherical_x_deg + *_screen_coorindates_spherical_y_deg + Otherwise: + An empty pandas DataFrame + """ + + if suppress_pupil_data: + print("This pupil data is obtained using a new eye " + "tracking algorithm and is in the process of being validated. " + "If you would like to view the data anyways, " + "please set the 'suppress_pupil_data' parameter to 'False'.") + return pd.DataFrame() + + # NOTE: This is a really ugly hack to get around the fact that warehouse does + # not have Ophys session ids associated with experiment ids. This should be + # removed when warehouse session ids have associations with experiment ids. + # ----- Start of ugly hack ----- + try: + ophys_session_id = ophys_experiment_session_id_map[ophys_experiment_id] + except KeyError: + raise RuntimeError(f"Experiment id '{ophys_experiment_id}' has no associated session!") + # ----- End of ugly hack ----- + + file_name = self.get_cache_path(file_name, + self.EYE_GAZE_DATA_KEY, + ophys_session_id) + + if not file_name: + raise RuntimeError("Could not obtain a file_name for pupil data " + f"with experiment id: {ophys_experiment_id} " + f"(session id: {ophys_session_id})") + + # NOTE: `save_ophys_experiment_eye_gaze_data` will also need to be + # updated to remove ophy_session_id param when ugly hack is removed. + self.api.save_ophys_experiment_eye_gaze_data(ophys_experiment_id, + ophys_session_id, + file_name, + strategy='lazy') + + gaze_mapping_data = read_eye_gaze_mappings(Path(file_name)) + + return create_eye_gaze_mapping_dataframe(gaze_mapping_data) + + def build_manifest(self, file_name): + """ + Construct a manifest for this Cache class and save it in a file. + + Parameters + ---------- + + file_name: string + File location to save the manifest. + + """ + + mb = ManifestBuilder() + mb.set_version(self.MANIFEST_VERSION) + mb.add_path('BASEDIR', '.') + mb.add_path(self.EXPERIMENT_CONTAINERS_KEY, + 'experiment_containers.json', typename='file', parent_key='BASEDIR') + mb.add_path(self.EXPERIMENTS_KEY, 'ophys_experiments.json', + typename='file', parent_key='BASEDIR') + mb.add_path(self.EXPERIMENT_DATA_KEY, 'ophys_experiment_data/%d.nwb', + typename='file', parent_key='BASEDIR') + mb.add_path(self.ANALYSIS_DATA_KEY, 'ophys_experiment_analysis/%d_%s_analysis.h5', + typename='file', parent_key='BASEDIR') + mb.add_path(self.EVENTS_DATA_KEY, 'ophys_experiment_events/%d_events.npz', + typename='file', parent_key='BASEDIR') + mb.add_path(self.CELL_SPECIMENS_KEY, 'cell_specimens.json', + typename='file', parent_key='BASEDIR') + mb.add_path(self.STIMULUS_MAPPINGS_KEY, 'stimulus_mappings.json', + typename='file', parent_key='BASEDIR') + mb.add_path(self.EYE_GAZE_DATA_KEY, 'ophys_eye_gaze_mapping/%d_eyetracking_dlc_to_screen_mapping.h5', + typename='file', parent_key='BASEDIR') + + mb.write_json_file(file_name) + + +def _assert_not_string(arg, name): + if isinstance(arg, six.string_types): + raise TypeError( + "Argument '%s' with value '%s' is a string type, but should be a list." % (name, arg)) diff --git a/core/brain_observatory_nwb_data_set.py b/core/brain_observatory_nwb_data_set.py new file mode 100644 index 0000000000..69729cfc85 --- /dev/null +++ b/core/brain_observatory_nwb_data_set.py @@ -0,0 +1,1128 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import functools +import dateutil +import re +import os +import six +import itertools +import logging +from pkg_resources import parse_version + +import h5py +import pandas as pd +import numpy as np + +import allensdk.brain_observatory.roi_masks as roi +from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise +import allensdk.brain_observatory.stimulus_info as si + +from allensdk.brain_observatory.brain_observatory_exceptions import (MissingStimulusException, + NoEyeTrackingException) +from allensdk.api.warehouse_cache.cache import memoize +from allensdk.core import h5_utilities + +from allensdk.brain_observatory.stimulus_info import mask_stimulus_template as si_mask_stimulus_template +from allensdk.brain_observatory.brain_observatory_exceptions import EpochSeparationException + +_STIMULUS_PRESENTATION_PATH = 'stimulus/presentation' +_STIMULUS_PRESENTATION_PATTERNS = ('{}', '{}_stimulus',) + + +def get_epoch_mask_list(st, threshold, max_cuts=2): + '''Convenience function to cut a stim table into multiple epochs + + :param st: input stimtable + :param threshold: threshold on the max duration of a subepoch + :param max_cuts: maximum number of allowed epochs to cut into + :return: epoch_mask_list, a list of indices that define the start and end of sub-epochs + ''' + + if threshold is None: + raise NotImplementedError('threshold not set for this type of session') + + delta = (st.start.values[1:] - st.end.values[:-1]) + cut_inds = np.where(delta > threshold)[0] + 1 + + epoch_mask_list = [] + + if len(cut_inds) > max_cuts: + + # See: https://gist.github.com/nicain/bce66cd073e422f07cf337b476c63be7 + # https://github.com/AllenInstitute/AllenSDK/issues/66 + raise EpochSeparationException('more than 2 epochs cut', delta=delta) + + for ii in range(len(cut_inds)+1): + + if ii == 0: + first_ind = st.iloc[0].start + else: + first_ind = st.iloc[cut_inds[ii-1]].start + + if ii == len(cut_inds): + last_ind_inclusive = st.iloc[-1].end + else: + last_ind_inclusive = st.iloc[cut_inds[ii]-1].end + + epoch_mask_list.append((first_ind,last_ind_inclusive)) + + return epoch_mask_list + + +class BrainObservatoryNwbDataSet(object): + PIPELINE_DATASET = 'brain_observatory_pipeline' + SUPPORTED_PIPELINE_VERSION = "3.0" + + FILE_METADATA_MAPPING = { + 'age': 'general/subject/age', + 'sex': 'general/subject/sex', + 'imaging_depth': 'general/optophysiology/imaging_plane_1/imaging depth', + 'targeted_structure': 'general/optophysiology/imaging_plane_1/location', + 'ophys_experiment_id': 'general/session_id', + 'experiment_container_id': 'general/experiment_container_id', + 'device_string': 'general/devices/2-photon microscope', + 'excitation_lambda': 'general/optophysiology/imaging_plane_1/excitation_lambda', + 'indicator': 'general/optophysiology/imaging_plane_1/indicator', + 'fov': 'general/fov', + 'genotype': 'general/subject/genotype', + 'session_start_time': 'session_start_time', + 'session_type': 'general/session_type', + 'specimen_name': 'general/specimen_name', + 'generated_by': 'general/generated_by' + } + + STIMULUS_TABLE_TYPES = { + 'abstract_feature_series': [si.DRIFTING_GRATINGS, si.STATIC_GRATINGS], + 'indexed_time_series': [si.NATURAL_SCENES, si.LOCALLY_SPARSE_NOISE, + si.LOCALLY_SPARSE_NOISE_4DEG, si.LOCALLY_SPARSE_NOISE_8DEG], + 'repeated_indexed_time_series':[si.NATURAL_MOVIE_ONE, si.NATURAL_MOVIE_TWO, si.NATURAL_MOVIE_THREE] + + } + + # this array was moved before file versioning was in place + MOTION_CORRECTION_DATASETS = [ "MotionCorrection/2p_image_series/xy_translations", + "MotionCorrection/2p_image_series/xy_translation" ] + + def __init__(self, nwb_file): + + self.nwb_file = nwb_file + self.pipeline_version = None + + if os.path.exists(self.nwb_file): + meta = self.get_metadata() + if meta and 'pipeline_version' in meta: + pipeline_version_str = meta['pipeline_version'] + self.pipeline_version = parse_version(pipeline_version_str) + + if self.pipeline_version > parse_version(self.SUPPORTED_PIPELINE_VERSION): + logging.warning("File %s has a pipeline version newer than the version supported by this class (%s vs %s)." + " Please update your AllenSDK." % (nwb_file, pipeline_version_str, self.SUPPORTED_PIPELINE_VERSION)) + + self._stimulus_search = None + + def get_stimulus_epoch_table(self): + '''Returns a pandas dataframe that summarizes the stimulus epoch duration for each acquisition time index in + the experiment + + Parameters + ---------- + None + + Returns + ------- + timestamps: 2D numpy array + Timestamp for each fluorescence sample + + traces: 2D numpy array + Fluorescence traces for each cell + ''' + + + # These are thresholds used by get_epoch_mask_list to set a maximum limit on the delta aqusistion frames to + # count as different trials (rows in the stim table). This helps account for dropped frames, so that they dont + # cause the cutting of an entire experiment into too many stimulus epochs. If these thresholds are too low, + # the assert statment in get_epoch_mask_list will halt execution. In that case, make a bug report!. + threshold_dict = {si.THREE_SESSION_A:32+7, + si.THREE_SESSION_B:15, + si.THREE_SESSION_C:7, + si.THREE_SESSION_C2:7} + + stimulus_table_dict = {} + for stimulus in self.list_stimuli(): + + stimulus_table_dict[stimulus] = self.get_stimulus_table(stimulus) + + if stimulus == si.SPONTANEOUS_ACTIVITY: + stimulus_table_dict[stimulus]['frame'] = 0 + + interval_list = [] + interval_stimulus_dict = {} + for stimulus in self.list_stimuli(): + stimulus_interval_list = get_epoch_mask_list(stimulus_table_dict[stimulus], threshold=threshold_dict.get(self.get_session_type(), None)) + for stimulus_interval in stimulus_interval_list: + interval_stimulus_dict[stimulus_interval] = stimulus + interval_list += stimulus_interval_list + interval_list.sort(key=lambda x: x[0]) + + stimulus_signature_list = ['gap'] + duration_signature_list = [int(interval_list[0][0])] + interval_signature_list = [(0,int(interval_list[0][0]))] + for ii, interval in enumerate(interval_list): + stimulus_signature_list.append(interval_stimulus_dict[interval]) + duration_signature_list.append(int(interval[1] - interval[0])) + interval_signature_list.append((int(interval[0]), int(interval[1]))) + + if ii != len(interval_list)-1: + stimulus_signature_list.append('gap') + duration_signature_list.append((int(interval_list[ii+1][0] - interval_list[ii][1]))) + interval_signature_list.append((int(interval_list[ii][1]), int(interval_list[ii+1][0]))) + + stimulus_signature_list.append('gap') + interval_signature_list.append((int(interval_list[-1][1]), len(self.get_fluorescence_timestamps()))) + duration_signature_list.append(interval_signature_list[-1][1]-interval_signature_list[-1][0]) + + interval_df = pd.DataFrame({'stimulus':stimulus_signature_list, + 'duration':duration_signature_list, + 'interval':interval_signature_list}) + + # Gaps are uninformative; remove them: + interval_df = interval_df[interval_df.stimulus != 'gap'] + interval_df['start'] = [x[0] for x in interval_df['interval'].values] + interval_df['end'] = [x[1] for x in interval_df['interval'].values] + + interval_df.reset_index(inplace=True, drop=True) + interval_df.drop(['interval', 'duration'], axis=1, inplace=True) + return interval_df + + + def get_fluorescence_traces(self, cell_specimen_ids=None): + ''' Returns an array of fluorescence traces for all ROI and + the timestamps for each datapoint + + Parameters + ---------- + cell_specimen_ids: list or array (optional) + List of cell IDs to return traces for. If this is None (default) + then all are returned + + Returns + ------- + timestamps: 2D numpy array + Timestamp for each fluorescence sample + + traces: 2D numpy array + Fluorescence traces for each cell + ''' + timestamps = self.get_fluorescence_timestamps() + with h5py.File(self.nwb_file, 'r') as f: + ds = f['processing'][self.PIPELINE_DATASET][ + 'Fluorescence']['imaging_plane_1']['data'] + + if cell_specimen_ids is None: + cell_traces = ds[()] + else: + inds = self.get_cell_specimen_indices(cell_specimen_ids) + cell_traces = ds[inds, :] + + return timestamps, cell_traces + + def get_fluorescence_timestamps(self): + ''' Returns an array of timestamps in seconds for the fluorescence traces ''' + + with h5py.File(self.nwb_file, 'r') as f: + timestamps = f['processing'][self.PIPELINE_DATASET][ + 'Fluorescence']['imaging_plane_1']['timestamps'][()] + return timestamps + + def get_neuropil_traces(self, cell_specimen_ids=None): + ''' Returns an array of neuropil fluorescence traces for all ROIs + and the timestamps for each datapoint + + Parameters + ---------- + cell_specimen_ids: list or array (optional) + List of cell IDs to return traces for. If this is None (default) + then all are returned + + Returns + ------- + timestamps: 2D numpy array + Timestamp for each fluorescence sample + + traces: 2D numpy array + Neuropil fluorescence traces for each cell + ''' + + timestamps = self.get_fluorescence_timestamps() + + with h5py.File(self.nwb_file, 'r') as f: + if self.pipeline_version >= parse_version("2.0"): + ds = f['processing'][self.PIPELINE_DATASET][ + 'Fluorescence']['imaging_plane_1_neuropil_response']['data'] + else: + ds = f['processing'][self.PIPELINE_DATASET][ + 'Fluorescence']['imaging_plane_1']['neuropil_traces'] + + if cell_specimen_ids is None: + np_traces = ds[()] + else: + inds = self.get_cell_specimen_indices(cell_specimen_ids) + np_traces = ds[inds, :] + + return timestamps, np_traces + + + def get_neuropil_r(self, cell_specimen_ids=None): + ''' Returns a scalar value of r for neuropil correction of flourescence traces + + Parameters + ---------- + cell_specimen_ids: list or array (optional) + List of cell IDs to return traces for. If this is None (default) + then results for all are returned + + Returns + ------- + r: 1D numpy array, len(r)=len(cell_specimen_ids) + Scalar for neuropil subtraction for each cell + ''' + + with h5py.File(self.nwb_file, 'r') as f: + if self.pipeline_version >= parse_version("2.0"): + r_ds = f['processing'][self.PIPELINE_DATASET][ + 'Fluorescence']['imaging_plane_1_neuropil_response']['r'] + else: + r_ds = f['processing'][self.PIPELINE_DATASET][ + 'Fluorescence']['imaging_plane_1']['r'] + + if cell_specimen_ids is None: + r = r_ds[()] + else: + inds = self.get_cell_specimen_indices(cell_specimen_ids) + r = r_ds[inds] + + return r + + def get_demixed_traces(self, cell_specimen_ids=None): + ''' Returns an array of demixed fluorescence traces for all ROIs + and the timestamps for each datapoint + + Parameters + ---------- + cell_specimen_ids: list or array (optional) + List of cell IDs to return traces for. If this is None (default) + then all are returned + + Returns + ------- + timestamps: 2D numpy array + Timestamp for each fluorescence sample + + traces: 2D numpy array + Demixed fluorescence traces for each cell + ''' + + timestamps = self.get_fluorescence_timestamps() + + with h5py.File(self.nwb_file, 'r') as f: + ds = f['processing'][self.PIPELINE_DATASET][ + 'Fluorescence']['imaging_plane_1_demixed_signal']['data'] + if cell_specimen_ids is None: + traces = ds[()] + else: + inds = self.get_cell_specimen_indices(cell_specimen_ids) + traces = ds[inds, :] + + return timestamps, traces + + def get_corrected_fluorescence_traces(self, cell_specimen_ids=None): + ''' Returns an array of demixed and neuropil-corrected fluorescence traces + for all ROIs and the timestamps for each datapoint + + Parameters + ---------- + cell_specimen_ids: list or array (optional) + List of cell IDs to return traces for. If this is None (default) + then all are returned + + Returns + ------- + timestamps: 2D numpy array + Timestamp for each fluorescence sample + + traces: 2D numpy array + Corrected fluorescence traces for each cell + ''' + + # starting in version 2.0, neuropil correction follows trace demixing + if self.pipeline_version >= parse_version("2.0"): + timestamps, cell_traces = self.get_demixed_traces(cell_specimen_ids) + else: + timestamps, cell_traces = self.get_fluorescence_traces(cell_specimen_ids) + + r = self.get_neuropil_r(cell_specimen_ids) + + _, neuropil_traces = self.get_neuropil_traces(cell_specimen_ids) + + fc = cell_traces - neuropil_traces * r[:, np.newaxis] + + return timestamps, fc + + def get_cell_specimen_indices(self, cell_specimen_ids): + ''' Given a list of cell specimen ids, return their index based on their order in this file. + + Parameters + ---------- + cell_specimen_ids: list of cell specimen ids + + ''' + + all_cell_specimen_ids = list(self.get_cell_specimen_ids()) + + try: + inds = [list(all_cell_specimen_ids).index(i) + for i in cell_specimen_ids] + except ValueError as e: + raise ValueError("Cell specimen not found (%s)" % str(e)) + + return inds + + def get_dff_traces(self, cell_specimen_ids=None): + ''' Returns an array of dF/F traces for all ROIs and + the timestamps for each datapoint + + Parameters + ---------- + cell_specimen_ids: list or array (optional) + List of cell IDs to return data for. If this is None (default) + then all are returned + + Returns + ------- + timestamps: 2D numpy array + Timestamp for each fluorescence sample + + dF/F: 2D numpy array + dF/F values for each cell + ''' + with h5py.File(self.nwb_file, 'r') as f: + dff_ds = f['processing'][self.PIPELINE_DATASET][ + 'DfOverF']['imaging_plane_1'] + + timestamps = dff_ds['timestamps'][()] + + if cell_specimen_ids is None: + cell_traces = dff_ds['data'][()] + else: + inds = self.get_cell_specimen_indices(cell_specimen_ids) + cell_traces = dff_ds['data'][inds, :] + + return timestamps, cell_traces + + def get_roi_ids(self): + ''' Returns an array of IDs for all ROIs in the file + + Returns + ------- + ROI IDs: list + ''' + with h5py.File(self.nwb_file, 'r') as f: + roi_id = f['processing'][self.PIPELINE_DATASET][ + 'ImageSegmentation']['roi_ids'][()] + return roi_id + + def get_cell_specimen_ids(self): + ''' Returns an array of cell IDs for all cells in the file + + Returns + ------- + cell specimen IDs: list + ''' + with h5py.File(self.nwb_file, 'r') as f: + cell_id = f['processing'][self.PIPELINE_DATASET][ + 'ImageSegmentation']['cell_specimen_ids'][()] + return cell_id + + def get_session_type(self): + ''' Returns the type of experimental session, presently one of the + following: three_session_A, three_session_B, three_session_C + + Returns + ------- + session type: string + ''' + with h5py.File(self.nwb_file, 'r') as f: + session_type = f['general/session_type'][()] + return session_type.decode('utf-8') + + def get_max_projection(self): + '''Returns the maximum projection image for the 2P movie. + + Returns + ------- + max projection: np.ndarray + ''' + + with h5py.File(self.nwb_file, 'r') as f: + max_projection = f['processing'][self.PIPELINE_DATASET]['ImageSegmentation'][ + 'imaging_plane_1']['reference_images']['maximum_intensity_projection_image']['data'][()] + return max_projection + + def list_stimuli(self): + ''' Return a list of the stimuli presented in the experiment. + + Returns + ------- + stimuli: list of strings + ''' + + with h5py.File(self.nwb_file, 'r') as f: + keys = list(f["stimulus/presentation/"].keys()) + return [ k.replace('_stimulus', '') for k in keys ] + + + def _get_master_stimulus_table(self): + ''' Builds a table for all stimuli by concatenating (vertically) the + sub-tables describing presentation of each stimulus + ''' + + epoch_table = self.get_stimulus_epoch_table() + + stimulus_table_dict = {} + for stimulus in self.list_stimuli(): + stimulus_table_dict[stimulus] = self.get_stimulus_table(stimulus) + + table_list = [] + for stimulus in self.list_stimuli(): + curr_stimtable = stimulus_table_dict[stimulus] + + for _, row in epoch_table[epoch_table['stimulus'] == stimulus].iterrows(): + + epoch_start_ind, epoch_end_ind = row['start'], row['end'] + curr_subtable = curr_stimtable[(epoch_start_ind <= curr_stimtable['start']) & + (curr_stimtable['end'] <= epoch_end_ind)].copy() + curr_subtable['stimulus'] = stimulus + table_list.append(curr_subtable) + + new_table = pd.concat(table_list, sort=True) + new_table.reset_index(drop=True, inplace=True) + + return new_table + + + def get_stimulus_table(self, stimulus_name): + ''' Return a stimulus table given a stimulus name + + Notes + ----- + For more information, see: + http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf + + ''' + + if stimulus_name == 'master': + return self._get_master_stimulus_table() + + with h5py.File(self.nwb_file, 'r') as nwb_file: + + stimulus_group = _find_stimulus_presentation_group(nwb_file, stimulus_name) + + if stimulus_name in self.STIMULUS_TABLE_TYPES['abstract_feature_series']: + datasets = h5_utilities.load_datasets_by_relnames( + ['data', 'features', 'frame_duration'], nwb_file, stimulus_group) + return _make_abstract_feature_series_stimulus_table( + datasets['data'], h5_utilities.decode_bytes(datasets['features']), datasets['frame_duration']) + + if stimulus_name in self.STIMULUS_TABLE_TYPES['indexed_time_series']: + datasets = h5_utilities.load_datasets_by_relnames(['data', 'frame_duration'], nwb_file, stimulus_group) + return _make_indexed_time_series_stimulus_table(datasets['data'], datasets['frame_duration']) + + if stimulus_name in self.STIMULUS_TABLE_TYPES['repeated_indexed_time_series']: + datasets = h5_utilities.load_datasets_by_relnames(['data', 'frame_duration'], nwb_file, stimulus_group) + return _make_repeated_indexed_time_series_stimulus_table(datasets['data'], datasets['frame_duration']) + + if stimulus_name == 'spontaneous': + datasets = h5_utilities.load_datasets_by_relnames(['data', 'frame_duration'], nwb_file, stimulus_group) + return _make_spontaneous_activity_stimulus_table(datasets['data'], datasets['frame_duration']) + + raise IOError("Could not find a stimulus table named '%s'" % stimulus_name) + + + @memoize + def get_stimulus_template(self, stimulus_name): + ''' Return an array of the stimulus template for the specified stimulus. + + Parameters + ---------- + stimulus_name: string + Must be one of the strings returned by list_stimuli(). + + Returns + ------- + stimulus table: pd.DataFrame + ''' + stim_name = stimulus_name + "_image_stack" + with h5py.File(self.nwb_file, 'r') as f: + image_stack = f['stimulus']['templates'][stim_name]['data'][()] + return image_stack + + def get_locally_sparse_noise_stimulus_template(self, + stimulus, + mask_off_screen=True): + ''' Return an array of the stimulus template for the specified stimulus. + + Parameters + ---------- + stimulus: string + Which locally sparse noise stimulus to retrieve. Must be one of: + stimulus_info.LOCALLY_SPARSE_NOISE + stimulus_info.LOCALLY_SPARSE_NOISE_4DEG + stimulus_info.LOCALLY_SPARSE_NOISE_8DEG + + mask_off_screen: boolean + Set off-screen regions of the stimulus to LocallySparseNoise.LSN_OFF_SCREEN. + + Returns + ------- + tuple: (template, off-screen mask) + ''' + + if stimulus not in si.LOCALLY_SPARSE_NOISE_DIMENSIONS: + raise KeyError("%s is not a known locally sparse noise stimulus" % stimulus) + + template = self.get_stimulus_template(stimulus) + + # build mapping from template coordinates to display coordinates + template_shape = si.LOCALLY_SPARSE_NOISE_DIMENSIONS[stimulus] + template_shape = [ template_shape[1], template_shape[0] ] + + template_display_shape = (1260, 720) + display_shape = (1920, 1200) + + scale = [ + float(template_shape[0]) / float(template_display_shape[0]), + float(template_shape[1]) / float(template_display_shape[1]) + ] + offset = [ + -(display_shape[0] - template_display_shape[0]) * 0.5, + -(display_shape[1] - template_display_shape[1]) * 0.5 + ] + + x, y = np.meshgrid(np.arange(display_shape[0]), np.arange( + display_shape[1]), indexing='ij') + template_display_coords = np.array([(x + offset[0]) * scale[0] - 0.5, + (y + offset[1]) * scale[1] - 0.5], + dtype=float) + template_display_coords = np.rint(template_display_coords).astype(int) + + # build mask + template_mask, template_frac = si_mask_stimulus_template( + template_display_coords, template_shape) + + if mask_off_screen: + template[:, ~template_mask.T] = LocallySparseNoise.LSN_OFF_SCREEN + + return template, template_mask.T + + def get_roi_mask_array(self, cell_specimen_ids=None): + ''' Return a numpy array containing all of the ROI masks for requested cells. + If cell_specimen_ids is omitted, return all masks. + + Parameters + ---------- + cell_specimen_ids: list + List of cell specimen ids. Default None. + + Returns + ------- + np.ndarray: NxWxH array, where N is number of cells + ''' + + roi_masks = self.get_roi_mask(cell_specimen_ids) + + if len(roi_masks) == 0: + raise IOError("no masks found for given cell specimen ids") + + roi_arr = roi.create_roi_mask_array(roi_masks) + + return roi_arr + + def get_roi_mask(self, cell_specimen_ids=None): + ''' Returns an array of all the ROI masks + + Parameters + ---------- + cell specimen IDs: list or array (optional) + List of cell IDs to return traces for. If this is None (default) + then all are returned + + Returns + ------- + List of ROI_Mask objects + ''' + + with h5py.File(self.nwb_file, 'r') as f: + mask_loc = f['processing'][self.PIPELINE_DATASET][ + 'ImageSegmentation']['imaging_plane_1'] + roi_list = f['processing'][self.PIPELINE_DATASET][ + 'ImageSegmentation']['imaging_plane_1']['roi_list'][()] + + inds = None + if cell_specimen_ids is None: + inds = range(self.number_of_cells) + else: + inds = self.get_cell_specimen_indices(cell_specimen_ids) + + roi_array = [] + for i in inds: + v = roi_list[i] + roi_mask = mask_loc[v]["img_mask"][()] + m = roi.create_roi_mask(roi_mask.shape[1], roi_mask.shape[0], + [0, 0, 0, 0], roi_mask=roi_mask, label=v) + roi_array.append(m) + + return roi_array + + @property + def number_of_cells(self): + '''Number of cells in the experiment''' + + # Replace here is there is a better way to get this info: + return len(self.get_cell_specimen_ids()) + + + def get_metadata(self): + ''' Returns a dictionary of meta data associated with each + experiment, including Cre line, specimen number, + visual area imaged, imaging depth + + Returns + ------- + metadata: dictionary + ''' + + meta = {} + + with h5py.File(self.nwb_file, 'r') as f: + for memory_key, disk_key in BrainObservatoryNwbDataSet.FILE_METADATA_MAPPING.items(): + try: + v = f[disk_key][()] + + # convert numpy strings to python strings + if v.dtype.type is np.string_: + if len(v.shape) == 0: + v = v.decode('UTF-8') + elif len(v.shape) == 1: + v = [ s.decode('UTF-8') for s in v ] + else: + raise Exception("Unrecognized metadata formatting for field %s" % disk_key) + + meta[memory_key] = v + except KeyError as e: + logging.warning("could not find key %s", disk_key) + + # extract cre line from genotype string + genotype = meta.get('genotype') + meta['cre_line'] = meta['genotype'].split(';')[0] if genotype else None + + imaging_depth = meta.pop('imaging_depth', None) + meta['imaging_depth_um'] = int(imaging_depth.split()[0]) if imaging_depth else None + + ophys_experiment_id = meta.get('ophys_experiment_id') + meta['ophys_experiment_id'] = int(ophys_experiment_id) if ophys_experiment_id else None + + experiment_container_id = meta.get('experiment_container_id') + meta['experiment_container_id'] = int(experiment_container_id) if experiment_container_id else None + + # convert start time to a date object + session_start_time = meta.get('session_start_time') + if isinstance( session_start_time, six.string_types ): + meta['session_start_time'] = dateutil.parser.parse(session_start_time) + + age = meta.pop('age', None) + if age: + # parse the age in days + m = re.match("(.*?) days", age) + if m: + meta['age_days'] = int(m.groups()[0]) + else: + raise IOError("Could not parse age.") + + + # parse the device string (ugly, sorry) + device_string = meta.pop('device_string', None) + if device_string: + m = re.match("(.*?)\.\s(.*?)\sPlease*", device_string) + if m: + device, device_name = m.groups() + meta['device'] = device + meta['device_name'] = device_name + else: + raise IOError("Could not parse device string.") + + # file version + generated_by = meta.pop('generated_by', None) + version = generated_by[-1] if generated_by else "0.9" + meta["pipeline_version"] = version + + return meta + + def get_running_speed(self): + ''' Returns the mouse running speed in cm/s + ''' + with h5py.File(self.nwb_file, 'r') as f: + dx_ds = f['processing'][self.PIPELINE_DATASET][ + 'BehavioralTimeSeries']['running_speed'] + dxcm = dx_ds['data'][()] + dxtime = dx_ds['timestamps'][()] + + timestamps = self.get_fluorescence_timestamps() + + # v0.9 stored this as an Nx1 array instead of a flat 1-d array + if len(dxcm.shape) == 2: + dxcm = dxcm[:, 0] + + dxcm, dxtime = align_running_speed(dxcm, dxtime, timestamps) + + return dxcm, dxtime + + def get_pupil_location(self, as_spherical=True): + '''Returns the x, y pupil location. + + Parameters + ---------- + as_spherical : bool + Whether to return the location as spherical (default) or + not. If true, the result is altitude and azimuth in + degrees, otherwise it is x, y in centimeters. (0,0) is + the center of the monitor. + + Returns + ------- + (timestamps, location) + Timestamps is an (Nx1) array of timestamps in seconds. + Location is an (Nx2) array of spatial location. + ''' + if as_spherical: + location_key = "pupil_location_spherical" + else: + location_key = "pupil_location" + try: + with h5py.File(self.nwb_file, 'r') as f: + eye_tracking = f['processing'][self.PIPELINE_DATASET][ + 'EyeTracking'][location_key] + pupil_location = eye_tracking['data'][()] + pupil_times = eye_tracking['timestamps'][()] + except KeyError: + raise NoEyeTrackingException("No eye tracking for this experiment.") + + return pupil_times, pupil_location + + def get_pupil_size(self): + '''Returns the pupil area in pixels. + + Returns + ------- + (timestamps, areas) + Timestamps is an (Nx1) array of timestamps in seconds. + Areas is an (Nx1) array of pupil areas in pixels. + ''' + try: + with h5py.File(self.nwb_file, 'r') as f: + pupil_tracking = f['processing'][self.PIPELINE_DATASET][ + 'PupilTracking']['pupil_size'] + pupil_size = pupil_tracking['data'][()] + pupil_times = pupil_tracking['timestamps'][()] + except KeyError: + raise NoEyeTrackingException("No pupil tracking for this experiment.") + + return pupil_times, pupil_size + + def get_motion_correction(self): + ''' Returns a Panda DataFrame containing the x- and y- translation of each image used for image alignment + ''' + + motion_correction = None + with h5py.File(self.nwb_file, 'r') as f: + pipeline_ds = f['processing'][self.PIPELINE_DATASET] + + # pipeline 0.9 stores this in xy_translations + # pipeline 1.0 stores this in xy_translation + for mc_ds_name in self.MOTION_CORRECTION_DATASETS: + try: + mc_ds = pipeline_ds[mc_ds_name] + + motion_log = mc_ds['data'][()] + motion_time = mc_ds['timestamps'][()] + motion_names = mc_ds['feature_description'][()] + + motion_correction = pd.DataFrame(motion_log, columns=motion_names) + motion_correction['timestamp'] = motion_time + + # break out if we found it + break + except KeyError as e: + pass + + if motion_correction is None: + raise KeyError("Could not find motion correction data.") + + # Python3 compatibility: + rename_dict = {} + for c in motion_correction.columns: + if not isinstance(c, str): + rename_dict[c] = c.decode("utf-8") + motion_correction.rename(columns=rename_dict, inplace=True) + + return motion_correction + + def save_analysis_dataframes(self, *tables): + store = pd.HDFStore(self.nwb_file, mode='a') + for k, v in tables: + store.put('analysis/%s' % (k), v) + store.close() + + def save_analysis_arrays(self, *datasets): + with h5py.File(self.nwb_file, 'a') as f: + for k, v in datasets: + if k in f['analysis']: + del f['analysis'][k] + f.create_dataset('analysis/%s' % k, data=v) + + @property + def stimulus_search(self): + + if self._stimulus_search is None: + self._stimulus_search = si.StimulusSearch(self) + return self._stimulus_search + + def get_stimulus(self, frame_ind): + + search_result = self.stimulus_search.search(frame_ind) + + if search_result is None or search_result[2]['stimulus'] == si.SPONTANEOUS_ACTIVITY: + return None, None + + else: + + curr_stimulus = search_result[2]['stimulus'] + if curr_stimulus in si.LOCALLY_SPARSE_NOISE_STIMULUS_TYPES + si.NATURAL_MOVIE_STIMULUS_TYPES + [si.NATURAL_SCENES]: + curr_frame = search_result[2]['frame'] + return search_result, self.get_stimulus_template(curr_stimulus)[int(curr_frame), :, :] + elif curr_stimulus == si.STATIC_GRATINGS or curr_stimulus == si.DRIFTING_GRATINGS: + return search_result, None + + +def _find_stimulus_presentation_group(nwb_file, + stimulus_name, + base_path=_STIMULUS_PRESENTATION_PATH, + group_patterns=_STIMULUS_PRESENTATION_PATTERNS): + ''' Searches an NWB file for a stimulus presentation group. + + Parameters + ---------- + nwb_file : h5py.File + File to search + stimulus_name : str + Identifier for this stimulus. Corresponds to the relative name of its h5 + group. + base_path : str, optional + Begin the search from here. Defaults to 'stimulus/presentation' + group_patterns : array-like of str, optional + Patterns for the relative name of the stimulus' h5 group. Defaults to + the name, and the name suffixed by '_stimulus' + + Returns + ------- + h5py.Group, h5py.Dataset : + h5 object found + + ''' + + group_candidates = [ pattern.format(stimulus_name) for pattern in group_patterns ] + matcher = functools.partial(h5_utilities.h5_object_matcher_relname_in, group_candidates) + matches = h5_utilities.locate_h5_objects(matcher, nwb_file, base_path) + + if len(matches) == 0: + raise MissingStimulusException( + 'Unable to locate stimulus: {}. ' + 'Looked for this stimulus under the names: {} '.format(stimulus_name, group_candidates) + ) + + if len(matches) > 1: + raise MissingStimulusException( + 'Unable to locate stimulus: {}. ' + 'Found multiple matching stimuli: {}'.format(stimulus_name, [match.name for match in matches]) + ) + + return matches[0] + + +def align_running_speed(dxcm, dxtime, timestamps): + ''' If running speed timestamps differ from fluorescence + timestamps, adjust by inserting NaNs to running speed. + + Returns + ------- + tuple: dxcm, dxtime + ''' + if dxtime[0] != timestamps[0]: + adjust = np.where(timestamps == dxtime[0])[0][0] + dxtime = np.insert(dxtime, 0, timestamps[:adjust]) + dxcm = np.insert(dxcm, 0, np.repeat(np.NaN, adjust)) + adjust = len(timestamps) - len(dxtime) + if adjust > 0: + dxtime = np.append(dxtime, timestamps[(-1 * adjust):]) + dxcm = np.append(dxcm, np.repeat(np.NaN, adjust)) + + return dxcm, dxtime + + +def _make_abstract_feature_series_stimulus_table(stim_data, features, frame_dur): + ''' Return the a stimulus table for an abstract feature series. + + Parameters + ---------- + stim_data : array-like + Stimulus feature values at each interval + features : array-like of str + Stimulus feature labels + frame_dur : array-like + Start and end times of presentation intervals + + Returns + ------- + stimulus table : pd.DataFrame + Describes the intervals of presentation of the stimulus + + Notes + ----- + For more information, see: + http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf + + ''' + + stimulus_table = pd.DataFrame(stim_data, columns=features) + stimulus_table.loc[:, 'start'] = frame_dur[:, 0].astype(int) + stimulus_table.loc[:, 'end'] = frame_dur[:, 1].astype(int) + + stimulus_table = stimulus_table.sort_values(['start', 'end']) + return stimulus_table + + +def _make_indexed_time_series_stimulus_table(inds, frame_dur): + ''' Return the a stimulus table for an indexed time series. + + Parameters + ---------- + inds : + frame_durations : np.ndarray + start and stop times (s) of frames + + Returns + ------- + stimulus table : pd.DataFrame + Describes the intervals of presentation of the stimulus + + Notes + ----- + For more information, see: + http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf + + ''' + + stimulus_table = pd.DataFrame(inds, columns=['frame']) + stimulus_table.loc[:, 'start'] = frame_dur[:, 0].astype(int) + stimulus_table.loc[:, 'end'] = frame_dur[:, 1].astype(int) + + stimulus_table = stimulus_table.sort_values(['start', 'end']) + return stimulus_table + + +def _make_repeated_indexed_time_series_stimulus_table(inds, frame_dur): + + stimulus_table = _make_indexed_time_series_stimulus_table(inds, frame_dur) + a = stimulus_table.groupby(by='frame') + + # If this ever occurs, the repeat counter cant be trusted! + assert np.floor(len(stimulus_table))/len(a) == int(len(stimulus_table))/len(a) + + stimulus_table['repeat'] = np.repeat(range(len(stimulus_table)//len(a)), len(a)) + + return stimulus_table + + +def _make_spontaneous_activity_stimulus_table(events, frame_durations): + ''' Builds a table describing the start and end times of the spontaneous viewing + intervals. + + Parameters + ---------- + events : np.ndarray + events data + frame_durations : np.ndarray + start and stop times (s) of frames + + Returns + ------- + pd.DataFrame : + Each row describes an interval of spontaneous viewing. Columns are start and end times. + + Notes + ----- + For more information, see: + http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf + + ''' + + start_inds = np.where(events == 1) + stop_inds = np.where(events == -1) + + if len(start_inds) != len(stop_inds): + raise Exception( + "inconsistent start and time times in spontaneous activity stimulus table") + + stim_data = np.column_stack([ + frame_durations[start_inds, 0].T, + frame_durations[stop_inds, 0].T] + ).astype(int) + + stimulus_table = pd.DataFrame(stim_data, columns=['start', 'end']) + stimulus_table = stimulus_table.sort_values(['start', 'end']) + + return stimulus_table + + diff --git a/core/cache_method_utilities.py b/core/cache_method_utilities.py new file mode 100644 index 0000000000..a487852fd4 --- /dev/null +++ b/core/cache_method_utilities.py @@ -0,0 +1,18 @@ +import inspect + + +class CachedInstanceMethodMixin(object): + def cache_clear(self): + """ + Calls `cache_clear` method on all bound methods in this instance + (where valid). + Intended to clear calls cached with the `memoize` decorator. + Note that this will also clear functions decorated with `lru_cache` and + `lfu_cache` in this class (or any other function with `cache_clear` + attribute). + """ + for _, method in inspect.getmembers(self, inspect.ismethod): + try: + method.cache_clear() + except (AttributeError, TypeError): + pass diff --git a/core/cell_types_cache.py b/core/cell_types_cache.py new file mode 100644 index 0000000000..7062771564 --- /dev/null +++ b/core/cell_types_cache.py @@ -0,0 +1,419 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +from six import string_types + +from allensdk.config.manifest_builder import ManifestBuilder +from allensdk.api.warehouse_cache.cache import Cache, get_default_manifest_file +from allensdk.api.queries.cell_types_api import CellTypesApi + +from . import json_utilities as json_utilities +from .nwb_data_set import NwbDataSet +from . import swc + +import logging +import warnings +import pandas as pd + + +class CellTypesCache(Cache): + """ + Cache class for storing and accessing data from the Cell Types Database. + By default, this class will cache any downloaded metadata or files in + well known locations defined in a manifest file. This behavior can be + disabled. + + Attributes + ---------- + + api: CellTypesApi instance + The object used for making API queries related to the Cell Types Database + + Parameters + ---------- + + cache: boolean + Whether the class should save results of API queries to locations specified + in the manifest file. Queries for files (as opposed to metadata) must have a + file location. If caching is disabled, those locations must be specified + in the function call (e.g. get_ephys_data(file_name='file.nwb')). + + manifest_file: string + File name of the manifest to be read. Default is "cell_types_manifest.json". + """ + + # manifest keys + CELLS_KEY = 'CELLS' + EPHYS_FEATURES_KEY = 'EPHYS_FEATURES' + MORPHOLOGY_FEATURES_KEY = 'MORPHOLOGY_FEATURES' + EPHYS_DATA_KEY = 'EPHYS_DATA' + EPHYS_SWEEPS_KEY = 'EPHYS_SWEEPS' + RECONSTRUCTION_KEY = 'RECONSTRUCTION' + MARKER_KEY = 'MARKER' + MANIFEST_VERSION = "1.1" + + def __init__(self, cache=True, manifest_file=None, base_uri=None): + + if manifest_file is None: + manifest_file = get_default_manifest_file('cell_types') + + super(CellTypesCache, self).__init__( + manifest=manifest_file, cache=cache, version=self.MANIFEST_VERSION) + self.api = CellTypesApi(base_uri=base_uri) + + def get_cells(self, file_name=None, + require_morphology=False, + require_reconstruction=False, + reporter_status=None, + species=None, + simple=True): + """ + Download metadata for all cells in the database and optionally return a + subset filtered by whether or not they have a morphology or reconstruction. + + Parameters + ---------- + + file_name: string + File name to save/read the cell metadata as JSON. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + require_morphology: boolean + Filter out cells that have no morphological images. + + require_reconstruction: boolean + Filter out cells that have no morphological reconstructions. + + reporter_status: list + Filter for cells that have one or more cell reporter statuses. + + species: list + Filter for cells that belong to one or more species. If None, return all. + Must be one of [ CellTypesApi.MOUSE, CellTypesApi.HUMAN ]. + """ + + file_name = self.get_cache_path(file_name, self.CELLS_KEY) + + cells = self.api.list_cells_api(path=file_name, + strategy='lazy', + **Cache.cache_json()) + + if isinstance(reporter_status, string_types): + reporter_status = [reporter_status] + + # filter the cells on the way out + cells = self.api.filter_cells_api(cells, + require_morphology, + require_reconstruction, + reporter_status, + species, + simple) + + + return cells + + + + + def get_ephys_sweeps(self, specimen_id, file_name=None): + """ + Download sweep metadata for a single cell specimen. + + Parameters + ---------- + + specimen_id: int + ID of a cell. + """ + + file_name = self.get_cache_path( + file_name, self.EPHYS_SWEEPS_KEY, specimen_id) + + sweeps = self.api.get_ephys_sweeps(specimen_id, + strategy='lazy', + path=file_name, + **Cache.cache_json()) + + return sweeps + + def get_ephys_features(self, dataframe=False, file_name=None): + """ + Download electrophysiology features for all cells in the database. + + Parameters + ---------- + + file_name: string + File name to save/read the ephys features metadata as CSV. + If file_name is None, the file_name will be pulled out of the + manifest. If caching is disabled, no file will be saved. + Default is None. + + dataframe: boolean + Return the output as a Pandas DataFrame. If False, return + a list of dictionaries. + """ + file_name = self.get_cache_path(file_name, self.EPHYS_FEATURES_KEY) + + if self.cache: + if dataframe: + warnings.warn("dataframe argument is deprecated.") + args = Cache.cache_csv_dataframe() + else: + args = Cache.cache_csv_json() + args['strategy'] = 'lazy' + else: + args = Cache.nocache_json() + + features_df = self.api.get_ephys_features(path=file_name, + **args) + + return features_df + + + def get_morphology_features(self, dataframe=False, file_name=None): + """ + Download morphology features for all cells with reconstructions in the database. + + Parameters + ---------- + + file_name: string + File name to save/read the ephys features metadata as CSV. + If file_name is None, the file_name will be pulled out of the + manifest. If caching is disabled, no file will be saved. + Default is None. + + dataframe: boolean + Return the output as a Pandas DataFrame. If False, return + a list of dictionaries. + """ + + file_name = self.get_cache_path( + file_name, self.MORPHOLOGY_FEATURES_KEY) + + if self.cache: + if dataframe: + warnings.warn("dataframe argument is deprecated.") + args = Cache.cache_csv_dataframe() + else: + args = Cache.cache_csv_json() + else: + args = Cache.nocache_json() + + args['strategy'] = 'lazy' + args['path'] = file_name + + return self.api.get_morphology_features(**args) + + + def get_all_features(self, dataframe=False, require_reconstruction=True): + """ + Download morphology and electrophysiology features for all cells and merge them + into a single table. + + Parameters + ---------- + + dataframe: boolean + Return the output as a Pandas DataFrame. If False, return + a list of dictionaries. + + require_reconstruction: boolean + Only return ephys and morphology features for cells that have + reconstructions. Default True. + """ + + ephys_features = pd.DataFrame(self.get_ephys_features()) + morphology_features = pd.DataFrame(self.get_morphology_features()) + + how = 'inner' if require_reconstruction else 'outer' + + all_features = ephys_features.merge(morphology_features, + how=how, + on='specimen_id') + + if dataframe: + warnings.warn("dataframe argument is deprecated.") + return all_features + else: + return all_features.to_dict('records') + + def get_ephys_data(self, specimen_id, file_name=None): + """ + Download electrophysiology traces for a single cell in the database. + + Parameters + ---------- + + specimen_id: int + The ID of a cell specimen to download. + + file_name: string + File name to save/read the ephys features metadata as CSV. + If file_name is None, the file_name will be pulled out of the + manifest. If caching is disabled, no file will be saved. + Default is None. + + Returns + ------- + NwbDataSet + A class instance with helper methods for retrieving stimulus + and response traces out of an NWB file. + """ + + file_name = self.get_cache_path( + file_name, self.EPHYS_DATA_KEY, specimen_id) + + self.api.save_ephys_data(specimen_id, file_name, strategy='lazy') + + return NwbDataSet(file_name) + + def get_reconstruction(self, specimen_id, file_name=None): + """ + Download and open a reconstruction for a single cell in the database. + + Parameters + ---------- + + specimen_id: int + The ID of a cell specimen to download. + + file_name: string + File name to save/read the reconstruction SWC. + If file_name is None, the file_name will be pulled out of the + manifest. If caching is disabled, no file will be saved. + Default is None. + + Returns + ------- + Morphology + A class instance with methods for accessing morphology compartments. + """ + + file_name = self.get_cache_path( + file_name, self.RECONSTRUCTION_KEY, specimen_id) + + if file_name is None: + raise Exception( + "Please enable caching (CellTypes.cache = True) or specify a save_file_name.") + + if not os.path.exists(file_name): + self.api.save_reconstruction(specimen_id, file_name) + + return swc.read_swc(file_name) + + def get_reconstruction_markers(self, specimen_id, file_name=None): + """ + Download and open a reconstruction marker file for a single cell in the database. + + Parameters + ---------- + + specimen_id: int + The ID of a cell specimen to download. + + file_name: string + File name to save/read the reconstruction marker. + If file_name is None, the file_name will be pulled out of the + manifest. If caching is disabled, no file will be saved. + Default is None. + + Returns + ------- + Morphology + A class instance with methods for accessing morphology compartments. + """ + + file_name = self.get_cache_path( + file_name, self.MARKER_KEY, specimen_id) + + if file_name is None: + raise Exception( + "Please enable caching (CellTypes.cache = True) or specify a save_file_name.") + + if not os.path.exists(file_name): + try: + self.api.save_reconstruction_markers(specimen_id, file_name) + except LookupError as e: + logging.warning(e.args) + return [] + + return swc.read_marker_file(file_name) + + def build_manifest(self, file_name): + """ + Construct a manifest for this Cache class and save it in a file. + + Parameters + ---------- + + file_name: string + File location to save the manifest. + + """ + + mb = ManifestBuilder() + mb.set_version(self.MANIFEST_VERSION) + mb.add_path('BASEDIR', '.') + mb.add_path(self.CELLS_KEY, 'cells.json', + typename='file', parent_key='BASEDIR') + mb.add_path(self.EPHYS_DATA_KEY, 'specimen_%d/ephys.nwb', + typename='file', parent_key='BASEDIR') + mb.add_path(self.EPHYS_FEATURES_KEY, 'ephys_features.csv', + typename='file', parent_key='BASEDIR') + mb.add_path(self.MORPHOLOGY_FEATURES_KEY, 'morphology_features.csv', + typename='file', parent_key='BASEDIR') + mb.add_path(self.RECONSTRUCTION_KEY, 'specimen_%d/reconstruction.swc', + typename='file', parent_key='BASEDIR') + mb.add_path(self.MARKER_KEY, 'specimen_%d/reconstruction.marker', + typename='file', parent_key='BASEDIR') + mb.add_path(self.EPHYS_SWEEPS_KEY, 'specimen_%d/ephys_sweeps.json', + typename='file', parent_key='BASEDIR') + + mb.write_json_file(file_name) + + +class ReporterStatus: + """ + Valid strings for filtering by cell reporter status. + """ + + POSITIVE = 'positive' + NEGATIVE = 'negative' + NA = None + INDETERMINATE = None diff --git a/core/dat_utilities.py b/core/dat_utilities.py new file mode 100644 index 0000000000..36f8d4d8fe --- /dev/null +++ b/core/dat_utilities.py @@ -0,0 +1,58 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy + + +class DatUtilities(object): + + @classmethod + def save_voltage(cls, output_path, v, t): + '''Save a single voltage output result into a simple text format. + + The output file is one t v pair per line. + + Parameters + ---------- + output_path : string + file name for output + v : numpy array + voltage + t : numpy array + time + ''' + data = numpy.transpose(numpy.vstack((t, v))) + with open(output_path, "w") as f: + numpy.savetxt(f, data) diff --git a/core/exceptions.py b/core/exceptions.py new file mode 100644 index 0000000000..94dc8f028c --- /dev/null +++ b/core/exceptions.py @@ -0,0 +1,26 @@ +class DataFrameKeyError(LookupError): + """More verbose method for accessing invalid rows or columns + in a dataframe. Should be used when a keyerror is thrown on a dataframe. + """ + def __init__(self, msg, caught_exception=None): + if caught_exception: + error_string = "{}\nCaught Exception: {}".format(msg, caught_exception) + else: + error_string = msg + super().__init__(error_string) + + +class DataFrameIndexError(LookupError): + """More verbose method for accessing invalid rows or columns + in a dataframe. Should be used when an index error is thrown on a dataframe. + """ + def __init__(self, msg, caught_exception=None): + if caught_exception: + error_string = "{}\nCaught Exception: {}".format(msg, caught_exception) + else: + error_string = msg + super().__init__(error_string) + + +class MissingDataError(ValueError): + pass diff --git a/core/h5_utilities.py b/core/h5_utilities.py new file mode 100644 index 0000000000..5e82d59c3f --- /dev/null +++ b/core/h5_utilities.py @@ -0,0 +1,128 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import functools +import six + +import h5py + + +def decode_bytes(bytes_dataset, encoding='UTF-8'): + ''' Convert the elements of a dataset of bytes to str + ''' + + return [ item.decode(encoding) for item in bytes_dataset[:].flat ] + + +def load_datasets_by_relnames(relnames, h5_file, start_node): + ''' A convenience function for finding and loading into memory one or more + datasets from an h5 file + ''' + + matcher_cbs = { + relname: functools.partial(h5_object_matcher_relname_in, [relname]) + for relname in relnames + } + + matches = keyed_locate_h5_objects(matcher_cbs, h5_file, start_node=start_node) + return { key: value[:] for key, value in six.iteritems(matches) } + + +def h5_object_matcher_relname_in(relnames, h5_object_name, h5_object): + ''' Asks if an h5 object's relative name (the final section of its absolute name) + is contained within a provided array + + Parameters + ---------- + relnames : array-like + Relative names against which to match + h5_object_name : str + Full name (path from origin) of h5 object + h5_object : h5py.Group, h5py.Dataset + Check this object's relative name + + Returns + ------- + bool : + whether the match succeeded + h5_object : h5py.group, h5py.Dataset + the argued object + + ''' + + return h5_object_name.split('/')[-1] in relnames, h5_object + + +def keyed_locate_h5_objects(matcher_cbs, h5_file, start_node=None): + ''' Traverse an h5 file and build up a dictionary mapping supplied keys to + located objects + ''' + + matches = {} + def matcher(obj_name, obj): + for key, matcher_cb in six.iteritems(matcher_cbs): + match, _ = matcher_cb(obj_name, obj) + if match: + matches[key] = obj + + traverse_h5_file(matcher, h5_file, start_node) + return matches + + +def locate_h5_objects(matcher_cb, h5_file, start_node=None): + ''' Traverse an h5 file and return objects matching supplied criteria + ''' + + matches = [] + def matcher(h5_object_name, h5_object): + match, _ = matcher_cb(h5_object_name, h5_object) + if match: + matches.append(h5_object) + + traverse_h5_file(matcher, h5_file, start_node) + return matches + + +def traverse_h5_file(callback, h5_file, start_node=None): + ''' Traverse an h5 file and apply a callback to each node + ''' + + if start_node is None: + start_node = h5_file['/'] + elif isinstance(start_node, str): + start_node = h5_file[start_node] + + start_node.visititems(callback) \ No newline at end of file diff --git a/core/json_utilities.py b/core/json_utilities.py new file mode 100644 index 0000000000..8c195c6e34 --- /dev/null +++ b/core/json_utilities.py @@ -0,0 +1,262 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import simplejson as json +import math +import re +import logging + +ju_logger = logging.getLogger(__name__) + +try: + import urllib.request as urllib_request +except ImportError: + import urllib2 as urllib_request +try: + from urllib.parse import urlparse +except ImportError: + import urlparse + + +def read(file_name): + """ Shortcut reading JSON from a file. """ + with open(file_name, 'rb') as f: + json_string = f.read().decode('utf-8') + if len(json_string)==0: # If empty file + json_string='{}' # Create a string that will give an empty JSON object instead of an error + json_obj = json.loads(json_string) + + return json_obj + + +def write(file_name, obj): + """ Shortcut for writing JSON to a file. This also takes care of serializing numpy and data types. """ + with open(file_name, 'wb') as f: + try: + f.write(write_string(obj)) # Python 2.7 + except TypeError: + f.write(bytes(write_string(obj), 'utf-8')) # Python 3 + + +def write_string(obj): + """ Shortcut for writing JSON to a string. This also takes care of serializing numpy and data types. """ + return json.dumps(obj, + indent=2, + ignore_nan=True, + default=json_handler, + iterable_as_array=True) + + +def read_url(url, method='POST'): + if method == 'GET': + return read_url_get(url) + elif method == 'POST': + return read_url_post(url) + else: + raise Exception('Unknown request method: (%s)' % method) + + +def read_url_get(url): + '''Transform a JSON contained in a file into an equivalent + nested python dict. + + Parameters + ---------- + url : string + where to get the json. + + Returns + ------- + dict + Python version of the input + + Note: if the input is a bare array or literal, for example, + the output will be of the corresponding type. + ''' + response = urllib_request.urlopen(url) + json_string = response.read().decode('utf-8') + + return json.loads(json_string) + + +def read_url_post(url): + '''Transform a JSON contained in a file into an equivalent + nested python dict. + + Parameters + ---------- + url : string + where to get the json. + + Returns + ------- + dict + Python version of the input + + Note: if the input is a bare array or literal, for example, + the output will be of the corresponding type. + ''' + urlp = urlparse.urlparse(url) + main_url = urlparse.urlunsplit( + (urlp.scheme, urlp.netloc, urlp.path, '', '')) + data = json.dumps(dict(urlparse.parse_qsl(urlp.query))) + + handler = urllib_request.HTTPHandler() + opener = urllib_request.build_opener(handler) + + request = urllib_request.Request(main_url, data) + request.add_header("Content-Type", 'application/json') + request.get_method = lambda: 'POST' + + try: + response = opener.open(request) + except Exception as e: + response = e + + if response.code == 200: + json_string = response.read() + else: + json_string = response.read() + + return json.loads(json_string) + + +def json_handler(obj): + """ Used by write_json convert a few non-standard types to things that the json package can handle. """ + if hasattr(obj, 'to_dict'): + return obj.to_dict() + elif isinstance(obj, np.ndarray): + return obj.tolist() + elif isinstance(obj, np.floating): + return float(obj) + elif isinstance(obj, np.integer): + return int(obj) + elif (isinstance(obj, np.bool) or + isinstance(obj, np.bool_)): + return bool(obj) + elif hasattr(obj, 'isoformat'): + return obj.isoformat() + else: + raise TypeError( + 'Object of type %s with value of %s is not JSON serializable' % + (type(obj), repr(obj))) + + +class JsonComments(object): + _oneline_comment = re.compile(r"\/\/.*$", + re.MULTILINE) + _multiline_comment_start = re.compile(r"\/\*", + re.MULTILINE | + re.DOTALL) + _multiline_comment_end = re.compile(r"\*\/", + re.MULTILINE | + re.DOTALL) + _blank_line = re.compile(r"\n?^\s*$", re.MULTILINE) + _carriage_return = re.compile(r"\r$", re.MULTILINE) + + @classmethod + def read_string(cls, json_string): + json_string_no_comments = cls.remove_comments(json_string) + return json.loads(json_string_no_comments) + + @classmethod + def read_file(cls, file_name): + try: + with open(file_name) as f: + json_string = f.read() + json_object = cls.read_string(json_string) + + return json_object + except ValueError: + ju_logger.error( + "Could not load json object from file: %s" % (file_name)) + raise + + @classmethod + def remove_comments(cls, json_string): + '''Strip single and multiline javascript-style comments. + + Parameters + ---------- + json : string + Json string with javascript-style comments. + + Returns + ------- + string + Copy of the input with comments removed. + + Note: A JSON decoder MAY accept and ignore comments. + ''' + json_string = JsonComments._oneline_comment.sub('', json_string) + json_string = JsonComments._carriage_return.sub('', json_string) + json_string = JsonComments.remove_multiline_comments(json_string) + json_string = JsonComments._blank_line.sub('', json_string) + + return json_string + + @classmethod + def remove_multiline_comments(cls, json_string): + '''Rebuild input without substrings matching /*...*/. + + Parameters + ---------- + json_string : string + may or may not contain multiline comments. + + Returns + ------- + string + Copy of the input without the comments. + ''' + new_json = [] + start_iter = JsonComments._multiline_comment_start.finditer( + json_string) + json_slice_start = 0 + + for comment_start in start_iter: + json_slice_end = comment_start.start() + new_json.append(json_string[json_slice_start:json_slice_end]) + search_start = comment_start.end() + comment_end = JsonComments._multiline_comment_end.search(json_string[ + search_start:]) + if comment_end is None: + break + else: + json_slice_start = search_start + comment_end.end() + new_json.append(json_string[json_slice_start:]) + + return ''.join(new_json) diff --git a/core/lazy_property/__init__.py b/core/lazy_property/__init__.py new file mode 100644 index 0000000000..2f90da4bc0 --- /dev/null +++ b/core/lazy_property/__init__.py @@ -0,0 +1,3 @@ +from .lazy_property import LazyProperty +from .lazy_property_mixin import LazyPropertyMixin + diff --git a/core/lazy_property/__pycache__/__init__.cpython-37.pyc b/core/lazy_property/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1916b79b1e606b06d16cd24abde9127230cfd501 GIT binary patch literal 306 zcmY*Uu};G<5VeyG2sHy@?GI$28M;*n0bN^!gjgb1)-|@MRmZmMv|u*Ag^6G4%ET{p z>KPS@o^<ctv!C_O_horbu*~NNEO34&@mCp=TkJ4I5JXT-I@(a0c&4*1Z*t`M6RC<H zik6D*1~Yh%kKQ`z`-uADzn-f%Wge=cDK)ydJKB88X)aIBc$d6B$D1$W3mm_&*V74m z4$=n(D-fe4yn>1B&OmF8fH9M18yKdW&>~v5ih<44k_FYvD+lcwUL?NN8XaO?x7N%0 cB)H~W8P#(>a&dQd-C42G@+SQ*q%{Zh03pv>FaQ7m literal 0 HcmV?d00001 diff --git a/core/lazy_property/__pycache__/lazy_property.cpython-37.pyc b/core/lazy_property/__pycache__/lazy_property.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72d829cf9e73e3b821201e96c0fb579d61e95b7a GIT binary patch literal 1318 zcmZuw%We}f6tz8%Owyzj0R<r;vOqv2+Ai23gj&KwNL4^W2x$~#Ib%0X<IJS?q$SaG z0nM5(U;$!*_@&vh;ulzP?<9e?)T4WB&s^K*9-nz!t5pcJ_}d5Z-67;BP8Q9D!6t;g z1t5u}nha=22P|ZiJSUP#XG)}_oMR_+rTdyRykC$>8Y~Z*LTk~{Di2<y%HSx%PmAWk zU=zY3C=yahLIxYbAv;XD%2U2%pB?E)cj|>DS(UylO=%d&K$fQ@EX#^qg1#a>IJTBo zx5Z@q$|OT&(($u~lUKyB#|J9iO=KP%8Zm?~HV>>y(}E1vhRugy5HBI@U4V>cgp-T` z(#!#5nG5J-9-u1;peG3&N?Q%zU>yecFeQN86{c%*zkgWt-ht2~)$nuID!p?i*95q# z4Df@PDs;d1n-AJ=EYNI=T_M*y;!won_Es#SB$ncSTg3;q4Hd>V0!)UxW82>Db=tO< zs<okr`l72~t=5ns`x{YW)P@FG_;9Yv>Dl^loClou;$F%*)?twaaeTUXCRa|Xy1vM5 zMPQVoVUOZ9A?$5{4DPWXm}&+BWn>Rb1G9QYzR<5IT=8xu9W&^=yc`J~jkHKr!!b+v z#z{JRVF@4|!<8YW8PxD&iSw=kx))$#3**v&x~xJgbaMF&*&^|Ls@GvT(lg7mdya#Y zNqS5_0)3#zT9cbi5#LGcV3)e68ztmg66<kYq^aq3Mg?2E@L3VdTZ`9EjY-VB60@>M zIHwBOnDeVx1)7I|<N^Dyf+8uRm;epM#wf(T2Lr4C0{ptiKG7rkeicT}6Y{Ql#Go#y z=ZNlKdkdE`liZy-@UQO*-!5eLjj|)1=B4?+a)z@(#cx1ZTu$f;t->=|J*D}-yM%vZ z3C$IYf#N)`a6U-nNaMK5`Tj`g`4=x84Ye|8B7?={ZYN2!S;qNAgi8o`_z6OVDbNoF z|6*KLcp+deT`gCFz%Smn8eZ;$iF$GO#Qr`wOGRmsao(1B@Nh=;5$bM{*b4gthQ%vv literal 0 HcmV?d00001 diff --git a/core/lazy_property/__pycache__/lazy_property_mixin.cpython-37.pyc b/core/lazy_property/__pycache__/lazy_property_mixin.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aed0f1e287e1b8eddc093ea6629087dbf445b294 GIT binary patch literal 1200 zcmZvb!EO^V5Qc5<Zn902DxhAe5Vssi5A=jk1@r(yr9!IUuv*D-)^59WvkA7-l4v=g zRO)NA;>0WY%86It#EdryDPYOY%<S0y=Nso`r_&-Z%5PuAc1Xw%be02r@*Jjl2#X|= z7Gy{hO35oCnGCLo3>2FONg%^x(u;mlNb6D8J`}U*J3SgJZKoN;RwGzgW)BQS5-Lf; zR3NEjS7c6;@S2=Z3CCT<N#yNFHo$INlaM4$xTNXst)Koj|D2Z@-irf&aUQ@lDBcp- zLXUb>Gw?uKXjF0Xo#+VMUzZ0@)AvSclZrDT`vY+)%4zzd6xpbh;z_E?3zI?>rO99& zjnAegJ<JEG$*p=k7TLKtRj{`xAVZ$-W+Sb33n-nB7q#E@_z=bR$5St+ff`X2VY8io zO6spiGM@&SSP~+{X<ox(iKP{pvl}MqE&am&_!atr4XU7GbEfyI;3lksTY9{<2Xl_0 zufT{M)r2A!nF;hw;}x#U`KhwPTAdFjR&nlHxyegoMVTqr^j|seg&KvquoOe(TAn~w z2xHtvHqn~nen7v$xsP)0>1za_V_5M08UF}bmv(83w%F{^di}o1{lB$jC=mzta!JM% z;8;?Tiq4tYvD7lpC#Yz}ZW$%zn^i1aFk0q>o?&PsU={+i55TN}{QSQAt9`4p?vQJ` z=9w^9t8RjZ8sH}9rUnRAW374v79<B@AQyRZdJ}`ug(xOUcQC6B3q0B_w6VMzRu`;o zm<HnnKy5F8ZL!&d{{dUw-HTn!Iray8$oX(2Ck5JV&Oc2=vG@`%AFh84wP3u|br!wL zR8cJZhq{&;eJ`;e*aw4N%-UhQ<tZHX!ldJ0#hv3_V>I}vGV62dDt)P|dR_di*13=W KY5!ko2fqQ)g(RN< literal 0 HcmV?d00001 diff --git a/core/lazy_property/lazy_property.py b/core/lazy_property/lazy_property.py new file mode 100644 index 0000000000..a001bbfe88 --- /dev/null +++ b/core/lazy_property/lazy_property.py @@ -0,0 +1,33 @@ +from typing import Callable, Iterable + +class LazyProperty(object): + + def __init__(self, api_method: Callable, wrappers: Iterable = tuple(), + settable: bool = False, *args, **kwargs): + + self.api_method = api_method + self.wrappers = wrappers + self.settable = settable + self.args = args + self.kwargs = kwargs + self.value = None + + def __get__(self, obj, objtype=None): + if obj is None: + return self + + if self.value is None: + self.value = self.calculate() + return self.value + + def __set__(self, obj, value): + if self.settable: + self.value = value + else: + raise AttributeError("Can't set a read-only attribute") + + def calculate(self): + result = self.api_method(*self.args, **self.kwargs) + for wrapper in self.wrappers: + result = wrapper(result) + return result diff --git a/core/lazy_property/lazy_property_mixin.py b/core/lazy_property/lazy_property_mixin.py new file mode 100644 index 0000000000..d21f2eb9d2 --- /dev/null +++ b/core/lazy_property/lazy_property_mixin.py @@ -0,0 +1,29 @@ +from .lazy_property import LazyProperty + + +class LazyPropertyMixin(object): + + @property + def LazyProperty(self): + return LazyProperty + + def __getattribute__(self, name): + + lazy_class = super(LazyPropertyMixin, self).__getattribute__('LazyProperty') + curr_attr = super(LazyPropertyMixin, self).__getattribute__(name) + if isinstance(curr_attr, lazy_class): + return curr_attr.__get__(curr_attr) + else: + return super(LazyPropertyMixin, self).__getattribute__(name) + + + def __setattr__(self, name, value): + if not hasattr(self, name): + super(LazyPropertyMixin, self).__setattr__(name, value) + else: + curr_attr = super(LazyPropertyMixin, self).__getattribute__(name) + lazy_class = super(LazyPropertyMixin, self).__getattribute__('LazyProperty') + if isinstance(curr_attr, lazy_class): + curr_attr.__set__(curr_attr, value) + else: + super(LazyPropertyMixin, self).__setattr__(name, value) \ No newline at end of file diff --git a/core/mouse_connectivity_cache.py b/core/mouse_connectivity_cache.py new file mode 100644 index 0000000000..041db77241 --- /dev/null +++ b/core/mouse_connectivity_cache.py @@ -0,0 +1,794 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.config.manifest_builder import ManifestBuilder +from allensdk.api.warehouse_cache.cache import Cache, get_default_manifest_file +from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi +from allensdk.deprecated import deprecated + +from . import json_utilities +from .reference_space_cache import ReferenceSpaceCache + +import nrrd +import re +import os +import SimpleITK as sitk +import pandas as pd +import numpy as np +from allensdk.config.manifest import Manifest +import warnings +import operator as op +import functools +from six.moves import reduce + + +class MouseConnectivityCache(ReferenceSpaceCache): + """ + Cache class for storing and accessing data related to the adult mouse + Connectivity Atlas. By default, this class will cache any downloaded + metadata or files in well known locations defined in a manifest file. + This behavior can be disabled. + + Attributes + ---------- + + resolution: int + Resolution of grid data to be downloaded when accessing projection volume, + the annotation volume, and the annotation volume. Must be one of (10, 25, + 50, 100). Default is 25. + + api: MouseConnectivityApi instance + Used internally to make API queries. + + Parameters + ---------- + + resolution: int + Resolution of grid data to be downloaded when accessing projection volume, + the annotation volume, and the annotation volume. Must be one of (10, 25, + 50, 100). Default is 25. + + ccf_version: string + Desired version of the Common Coordinate Framework. This affects the annotation + volume (get_annotation_volume) and structure masks (get_structure_mask). + Must be one of (MouseConnectivityApi.CCF_2015, MouseConnectivityApi.CCF_2016). + Default: MouseConnectivityApi.CCF_2016 + + cache: boolean + Whether the class should save results of API queries to locations specified + in the manifest file. Queries for files (as opposed to metadata) must have a + file location. If caching is disabled, those locations must be specified + in the function call (e.g. get_projection_density(file_name='file.nrrd')). + + manifest_file: string + File name of the manifest to be read. Default is "mouse_connectivity_manifest.json". + + """ + + PROJECTION_DENSITY_KEY = 'PROJECTION_DENSITY' + INJECTION_DENSITY_KEY = 'INJECTION_DENSITY' + INJECTION_FRACTION_KEY = 'INJECTION_FRACTION' + DATA_MASK_KEY = 'DATA_MASK' + STRUCTURE_UNIONIZES_KEY = 'STRUCTURE_UNIONIZES' + EXPERIMENTS_KEY = 'EXPERIMENTS' + DEFORMATION_FIELD_HEADER_KEY = 'DEFORMATION_FIELD_HEADER' + DEFORMATION_FIELD_VOXEL_KEY = 'DEFORMATION_FIELD_VOXELS' + ALIGNMENT3D_KEY = 'ALIGNMENT3D' + + MANIFEST_VERSION = 1.3 + + SUMMARY_STRUCTURE_SET_ID = 167587189 + DEFAULT_STRUCTURE_SET_IDS = tuple([SUMMARY_STRUCTURE_SET_ID]) + + DFMFLD_RESOLUTIONS = (25,) + + @property + def default_structure_ids(self): + + if not hasattr(self, '_default_structure_ids'): + tree = self.get_structure_tree() + default_structures = tree.get_structures_by_set_id(MouseConnectivityCache.DEFAULT_STRUCTURE_SET_IDS) + self._default_structure_ids = [st['id'] for st in default_structures] + + return self._default_structure_ids + + def __init__(self, + resolution=None, + cache=True, + manifest_file=None, + ccf_version=None, + base_uri=None, + version=None): + + if manifest_file is None: + manifest_file = get_default_manifest_file('mouse_connectivity') + + if version is None: + version = self.MANIFEST_VERSION + + if resolution is None: + resolution = MouseConnectivityApi.VOXEL_RESOLUTION_25_MICRONS + + if ccf_version is None: + ccf_version = MouseConnectivityApi.CCF_VERSION_DEFAULT + + super(MouseConnectivityCache, self).__init__( + resolution, reference_space_key=ccf_version, cache=cache, + manifest=manifest_file, version=version) + + self.api = MouseConnectivityApi(base_uri=base_uri) + + + def get_projection_density(self, experiment_id, file_name=None): + """ + Read a projection density volume for a single experiment. Download it + first if it doesn't exist. Projection density is the proportion of + of projecting pixels in a grid voxel in [0,1]. + + Parameters + ---------- + + experiment_id: int + ID of the experiment to download/read. This corresponds to + section_data_set_id in the API. + + file_name: string + File name to store the template volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + """ + + file_name = self.get_cache_path(file_name, + self.PROJECTION_DENSITY_KEY, + experiment_id, + self.resolution) + + self.api.download_projection_density( + file_name, experiment_id, self.resolution, strategy='lazy') + + return nrrd.read(file_name) + + def get_injection_density(self, experiment_id, file_name=None): + """ + Read an injection density volume for a single experiment. Download it + first if it doesn't exist. Injection density is the proportion of + projecting pixels in a grid voxel only including pixels that are + part of the injection site in [0,1]. + + Parameters + ---------- + + experiment_id: int + ID of the experiment to download/read. This corresponds to + section_data_set_id in the API. + + file_name: string + File name to store the template volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + """ + + file_name = self.get_cache_path(file_name, + self.INJECTION_DENSITY_KEY, + experiment_id, + self.resolution) + self.api.download_injection_density( + file_name, experiment_id, self.resolution, strategy='lazy') + + return nrrd.read(file_name) + + def get_injection_fraction(self, experiment_id, file_name=None): + """ + Read an injection fraction volume for a single experiment. Download it + first if it doesn't exist. Injection fraction is the proportion of + pixels in the injection site in a grid voxel in [0,1]. + + Parameters + ---------- + + experiment_id: int + ID of the experiment to download/read. This corresponds to + section_data_set_id in the API. + + file_name: string + File name to store the template volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + """ + + file_name = self.get_cache_path(file_name, + self.INJECTION_FRACTION_KEY, + experiment_id, + self.resolution) + self.api.download_injection_fraction( + file_name, experiment_id, self.resolution, strategy='lazy') + + return nrrd.read(file_name) + + def get_data_mask(self, experiment_id, file_name=None): + """ + Read a data mask volume for a single experiment. Download it + first if it doesn't exist. Data mask is a binary mask of + voxels that have valid data. Only use valid data in analysis! + + Parameters + ---------- + + experiment_id: int + ID of the experiment to download/read. This corresponds to + section_data_set_id in the API. + + file_name: string + File name to store the template volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + """ + + file_name = self.get_cache_path(file_name, + self.DATA_MASK_KEY, + experiment_id, + self.resolution) + self.api.download_data_mask( + file_name, experiment_id, self.resolution, strategy='lazy') + + return nrrd.read(file_name) + + + def get_experiments(self, dataframe=False, file_name=None, cre=None, injection_structure_ids=None): + """ + Read a list of experiments that match certain criteria. If caching is enabled, + this will save the whole (unfiltered) list of experiments to a file. + + Parameters + ---------- + + dataframe: boolean + Return the list of experiments as a Pandas DataFrame. If False, + return a list of dictionaries. Default False. + + file_name: string + File name to save/read the structures table. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + cre: boolean or list + If True, return only cre-positive experiments. If False, return only + cre-negative experiments. If None, return all experients. If list, return + all experiments with cre line names in the supplied list. Default None. + + injection_structure_ids: list + Only return experiments that were injected in the structures provided here. + If None, return all experiments. Default None. + + """ + + file_name = self.get_cache_path(file_name, self.EXPERIMENTS_KEY) + + experiments = self.api.get_experiments_api(path=file_name, + strategy='lazy', + **Cache.cache_json()) + + for e in experiments: + # renaming id + e['id'] = e['data_set_id'] + del e['data_set_id'] + + # simplify trangsenic line + tl = e.get('transgenic_line', None) + if tl: + e['transgenic_line'] = tl['name'] + + # parse the injection structures + injs = [ int(i) for i in e['injection_structures'].split('/') ] + e['injection_structures'] = injs + e['primary_injection_structure'] = injs[0] + + # remove storage dir + del e['storage_directory'] + + + # filter the read/downloaded list of experiments + experiments = self.filter_experiments( + experiments, cre, injection_structure_ids) + + if dataframe: + experiments = pd.DataFrame(experiments) + experiments.set_index(['id'], inplace=True, drop=False) + + return experiments + + def filter_experiments(self, experiments, cre=None, injection_structure_ids=None): + """ + Take a list of experiments and filter them by cre status and injection structure. + + Parameters + ---------- + + cre: boolean or list + If True, return only cre-positive experiments. If False, return only + cre-negative experiments. If None, return all experients. If list, return + all experiments with cre line names in the supplied list. Default None. + + injection_structure_ids: list + Only return experiments that were injected in the structures provided here. + If None, return all experiments. Default None. + """ + + if cre is True: + experiments = [e for e in experiments if e['transgenic_line']] + elif cre is False: + experiments = [e for e in experiments if not e['transgenic_line']] + elif cre is not None: + cre = [ c.lower() for c in cre ] + experiments = [e for e in experiments if e['transgenic_line'] is not None and e['transgenic_line'].lower() in cre] + + if injection_structure_ids is not None: + structure_ids = MouseConnectivityCache.validate_structure_ids(injection_structure_ids) + descendant_ids = set(reduce(op.add, self.get_structure_tree().descendant_ids(injection_structure_ids))) + + experiments = [e for e in experiments if e['structure_id'] in descendant_ids] + + return experiments + + def get_experiment_structure_unionizes(self, experiment_id, + file_name=None, + is_injection=None, + structure_ids=None, + include_descendants=False, + hemisphere_ids=None): + """ + Retrieve the structure unionize data for a specific experiment. Filter by + structure, injection status, and hemisphere. + + Parameters + ---------- + + experiment_id: int + ID of the experiment of interest. Corresponds to section_data_set_id in the API. + + file_name: string + File name to save/read the experiments list. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + is_injection: boolean + If True, only return unionize records that disregard non-injection pixels. + If False, only return unionize records that disregard injection pixels. + If None, return all records. Default None. + + structure_ids: list + Only return unionize records for a specific set of structures. + If None, return all records. Default None. + + include_descendants: boolean + Include all descendant records for specified structures. Default False. + + hemisphere_ids: list + Only return unionize records that disregard pixels outside of a hemisphere. + or set of hemispheres. Left = 1, Right = 2, Both = 3. If None, include all + records [1, 2, 3]. Default None. + + """ + + file_name = self.get_cache_path(file_name, + self.STRUCTURE_UNIONIZES_KEY, + experiment_id) + + filter_fn = functools.partial(self.filter_structure_unionizes, + is_injection=is_injection, + structure_ids=structure_ids, + include_descendants=include_descendants, + hemisphere_ids=hemisphere_ids) + + col_rn = lambda x: pd.DataFrame(x).rename(columns={ + 'section_data_set_id': 'experiment_id'}) + + return self.api.get_structure_unionizes([experiment_id], + path=file_name, + strategy='lazy', + pre=col_rn, + post=filter_fn, + writer=lambda p, x : pd.DataFrame(x).to_csv(p), + reader=lambda x: pd.read_csv(x, index_col=0, parse_dates=True)) + + def rank_structures(self, experiment_ids, is_injection, structure_ids=None, hemisphere_ids=None, + rank_on='normalized_projection_volume', n=5, threshold=10**-2): + '''Produces one or more (per experiment) ranked lists of brain structures, using a specified data field. + + Parameters + ---------- + experiment_ids : list of int + Obtain injection_structures for these experiments. + is_injection : boolean + Use data from only injection (or non-injection) unionizes. + structure_ids : list of int, optional + Consider only these structures. It is a good idea to make sure that these structures are not spatially + overlapping; otherwise your results will contain redundant information. Defaults to the summary + structures - a brain-wide list of nonoverlapping mid-level structures. + hemisphere_ids : list of int, optional + Consider only these hemispheres (1: left, 2: right, 3: both). Like with structures, + you might get redundant results if you select overlapping options. Defaults to [1, 2]. + rank_on : str, optional + Rank unionize data using this field (descending). Defaults to normalized_projection_volume. + n : int, optional + Return only the top n structures. + threshold : float, optional + Consider only records whose data value - specified by the rank_on parameter - exceeds this value. + + Returns + ------- + list : + Each element (1 for each input experiment) is a list of dictionaries. The dictionaries describe the top + injection structures in descending order. They are specified by their structure and hemisphere id fields and + additionally report the value specified by the rank_on parameter. + + ''' + + output_keys = ['experiment_id', rank_on, 'hemisphere_id', 'structure_id'] + + if hemisphere_ids is None: + hemisphere_ids = [1, 2] + if structure_ids is None: + structure_ids = self.default_structure_ids + + unionizes = self.get_structure_unionizes(experiment_ids, + is_injection=is_injection, + structure_ids=structure_ids, + hemisphere_ids=hemisphere_ids, + include_descendants=False) + unionizes = unionizes[unionizes[rank_on] > threshold] + + results = [] + for eid in experiment_ids: + + this_experiment_unionizes = unionizes[unionizes['experiment_id'] == eid] + this_experiment_unionizes = this_experiment_unionizes.sort_values(by=rank_on, ascending=False) + this_experiment_unionizes = this_experiment_unionizes.loc[:, output_keys] + + records = this_experiment_unionizes.to_dict('record') + if len(records) > n: + records = records[:n] + results.append(records) + + return results + + def filter_structure_unionizes(self, unionizes, + is_injection=None, + structure_ids=None, + include_descendants=False, + hemisphere_ids=None): + """ + Take a list of unionzes and return a subset of records filtered by injection status, structure, and + hemisphere. + + Parameters + ---------- + is_injection: boolean + If True, only return unionize records that disregard non-injection pixels. + If False, only return unionize records that disregard injection pixels. + If None, return all records. Default None. + + structure_ids: list + Only return unionize records for a set of structures. + If None, return all records. Default None. + + include_descendants: boolean + Include all descendant records for specified structures. Default False. + + hemisphere_ids: list + Only return unionize records that disregard pixels outside of a hemisphere. + or set of hemispheres. Left = 1, Right = 2, Both = 3. If None, include all + records [1, 2, 3]. Default None. + """ + if is_injection is not None: + unionizes = unionizes[unionizes.is_injection == is_injection] + + if structure_ids is not None: + structure_ids = MouseConnectivityCache.validate_structure_ids(structure_ids) + + if include_descendants: + structure_ids = reduce(op.add, self.get_structure_tree().descendant_ids(structure_ids)) + else: + structure_ids = set(structure_ids) + + + unionizes = unionizes[ + unionizes['structure_id'].isin(structure_ids)] + + if hemisphere_ids is not None: + unionizes = unionizes[ + unionizes['hemisphere_id'].isin(hemisphere_ids)] + + return unionizes + + def get_structure_unionizes(self, experiment_ids, + is_injection=None, + structure_ids=None, + include_descendants=False, + hemisphere_ids=None): + """ + Get structure unionizes for a set of experiment IDs. Filter the results by injection status, + structure, and hemisphere. + + Parameters + ---------- + experiment_ids: list + List of experiment IDs. Corresponds to section_data_set_id in the API. + + is_injection: boolean + If True, only return unionize records that disregard non-injection pixels. + If False, only return unionize records that disregard injection pixels. + If None, return all records. Default None. + + structure_ids: list + Only return unionize records for a specific set of structures. + If None, return all records. Default None. + + include_descendants: boolean + Include all descendant records for specified structures. Default False. + + hemisphere_ids: list + Only return unionize records that disregard pixels outside of a hemisphere. + or set of hemispheres. Left = 1, Right = 2, Both = 3. If None, include all + records [1, 2, 3]. Default None. + """ + + unionizes = [self.get_experiment_structure_unionizes(eid, + is_injection=is_injection, + structure_ids=structure_ids, + include_descendants=include_descendants, + hemisphere_ids=hemisphere_ids) + for eid in experiment_ids] + + return pd.concat(unionizes, ignore_index=True, sort=True) + + def get_projection_matrix(self, experiment_ids, + projection_structure_ids=None, + hemisphere_ids=None, + parameter='projection_volume', + dataframe=False): + + if projection_structure_ids is None: + projection_structure_ids = self.default_structure_ids + + unionizes = self.get_structure_unionizes(experiment_ids, + is_injection=False, + structure_ids=projection_structure_ids, + include_descendants=False, + hemisphere_ids=hemisphere_ids) + + hemisphere_ids = set(unionizes['hemisphere_id'].values.tolist()) + + nrows = len(experiment_ids) + ncolumns = len(projection_structure_ids) * len(hemisphere_ids) + + matrix = np.empty((nrows, ncolumns)) + matrix[:] = np.NAN + + row_lookup = {} + for idx, e in enumerate(experiment_ids): + row_lookup[e] = idx + + column_lookup = {} + columns = [] + + cidx = 0 + hlabel = {1: '-L', 2: '-R', 3: ''} + + acronym_map = self.get_structure_tree().value_map(lambda x: x['id'], + lambda x: x['acronym']) + + for hid in hemisphere_ids: + for sid in projection_structure_ids: + column_lookup[(hid, sid)] = cidx + label = acronym_map[sid] + hlabel[hid] + columns.append( + {'hemisphere_id': hid, 'structure_id': sid, 'label': label}) + cidx += 1 + + for _, row in unionizes.iterrows(): + ridx = row_lookup[row['experiment_id']] + k = (row['hemisphere_id'], row['structure_id']) + cidx = column_lookup[k] + matrix[ridx, cidx] = row[parameter] + + if dataframe: + warnings.warn("dataframe argument is deprecated.") + all_experiments = self.get_experiments(dataframe=True) + + rows_df = all_experiments.loc[experiment_ids] + + cols_df = pd.DataFrame(columns) + + return {'matrix': matrix, 'rows': rows_df, 'columns': cols_df} + else: + return {'matrix': matrix, 'rows': experiment_ids, 'columns': columns} + + + def get_deformation_field(self, section_data_set_id, header_path=None, voxel_path=None): + ''' Extract the local alignment parameters for this dataset. This a 3D vector image (3 components) describing + a deformable local mapping from CCF voxels to this section data set's affine-aligned image stack. + + Parameters + ---------- + section_data_set_id : int + Download the deformation field for this data set + header_path : str, optional + If supplied, the deformation field header will be downloaded to this path. + voxel_path : str, optiona + If supplied, the deformation field voxels will be downloaded to this path. + + Returns + ------- + numpy.ndarray : + 3D X 3 component vector array (origin 0, 0, 0; 25-micron isometric resolution) defining a + deformable transformation from CCF-space to affine-transformed image space. + + ''' + + if self.resolution not in self.DFMFLD_RESOLUTIONS: + warnings.warn( + 'deformation fields are only available at {} isometric resolutions, but this is a '\ + '{}-micron cache'.format(self.DFMFLD_RESOLUTIONS, self.resolution) + ) + + header_path = self.get_cache_path(header_path, self.DEFORMATION_FIELD_HEADER_KEY, section_data_set_id) + voxel_path = self.get_cache_path(voxel_path, self.DEFORMATION_FIELD_VOXEL_KEY, section_data_set_id) + + if not (os.path.exists(header_path) and os.path.exists(voxel_path)): + Manifest.safe_make_parent_dirs(header_path) + Manifest.safe_make_parent_dirs(voxel_path) + self.api.download_deformation_field( + section_data_set_id, + header_path=header_path, + voxel_path=voxel_path + ) + + return sitk.GetArrayFromImage(sitk.ReadImage(str(header_path))) # TODO the str call here is only necessary in 2.7 + + + def get_affine_parameters(self, section_data_set_id, direction='trv', file_name=None): + ''' Extract the parameters of the 3D affine tranformation mapping this section data set's image-space stack to + CCF-space (or vice-versa). + + Parameters + ---------- + section_data_set_id : int + download the parameters for this data set. + direction : str, optional + Valid options are: + trv : "transform from reference to volume". Maps CCF points to image space points. If you are + resampling data into CCF, this is the direction you want. + tvr : "transform from volume to reference". Maps image space points to CCF points. + file_name : str + If provided, store the downloaded file here. + + Returns + ------- + alignment : numpy.ndarray + 4 X 3 matrix. In order to transform a point [X_1, X_2, X_3] run + np.dot([X_1, X_2, X_3, 1], alignment). In + to build a SimpleITK affine transform run: + transform = sitk.AffineTransform(3) + transform.SetParameters(alignment.flatten()) + + ''' + + if not direction in ('trv', 'tvr'): + raise ArgumentError('invalid direction: {}. direction must be one of tvr, trv'.format(direction)) + + file_name = self.get_cache_path(file_name, self.ALIGNMENT3D_KEY) + + raw_alignment = self.api.download_alignment3d( + strategy='lazy', + path=file_name, + section_data_set_id=section_data_set_id, + **Cache.cache_json()) + + alignment_re = re.compile('{}_(?P<index>\d+)'.format(direction)) + alignment = np.zeros((4, 3), dtype=float) + + for entry, value in raw_alignment.items(): + match = alignment_re.match(entry) + if match is not None: + alignment.flat[int(match.group('index'))] = value + + return alignment + + + def add_manifest_paths(self, manifest_builder): + """ + Construct a manifest for this Cache class and save it in a file. + + Parameters + ---------- + + file_name: string + File location to save the manifest. + + """ + + manifest_builder = super(MouseConnectivityCache, self).add_manifest_paths(manifest_builder) + + manifest_builder.add_path(self.EXPERIMENTS_KEY, + 'experiments.json', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.STRUCTURE_UNIONIZES_KEY, + 'experiment_%d/structure_unionizes.csv', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.INJECTION_DENSITY_KEY, + 'experiment_%d/injection_density_%d.nrrd', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.INJECTION_FRACTION_KEY, + 'experiment_%d/injection_fraction_%d.nrrd', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.DATA_MASK_KEY, + 'experiment_%d/data_mask_%d.nrrd', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.PROJECTION_DENSITY_KEY, + 'experiment_%d/projection_density_%d.nrrd', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.DEFORMATION_FIELD_HEADER_KEY, + 'experiment_%d/dfmfld.mhd', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.DEFORMATION_FIELD_VOXEL_KEY, + 'experiment_%d/dfmfld.raw', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.ALIGNMENT3D_KEY, + 'experiment_%d/alignment3d.json', + parent_key='BASEDIR', + typename='file') + + return manifest_builder diff --git a/core/nwb_data_set.py b/core/nwb_data_set.py new file mode 100644 index 0000000000..66d2edb302 --- /dev/null +++ b/core/nwb_data_set.py @@ -0,0 +1,391 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import h5py +import numpy as np + + +class NwbDataSet(object): + """ A very simple interface for exracting electrophysiology data + from an NWB file. + """ + SPIKE_TIMES = "spike_times" + DEPRECATED_SPIKE_TIMES = "aibs_spike_times" + + def __init__(self, file_name, spike_time_key=None): + """ Initialize the NwbDataSet instance with a file name + + Parameters + ---------- + file_name: string + NWB file name + """ + self.file_name = file_name + if spike_time_key is None: + self.spike_time_key = NwbDataSet.SPIKE_TIMES + else: + self.spike_time_key = spike_time_key + + def get_sweep(self, sweep_number): + """ Retrieve the stimulus, response, index_range, and sampling rate + for a particular sweep. This method hides the NWB file's distinction + between a "Sweep" and an "Experiment". An experiment is a subset of + of a sweep that excludes the initial test pulse. It also excludes + any erroneous response data at the end of the sweep (usually for + ramp sweeps, where recording was terminated mid-stimulus). + + Some sweeps do not have an experiment, so full data arrays are + returned. Sweeps that have an experiment return full data arrays + (include the test pulse) with any erroneous data trimmed from the + back of the sweep. + + Parameters + ---------- + sweep_number: int + + Returns + ------- + dict + A dictionary with 'stimulus', 'response', 'index_range', and + 'sampling_rate' elements. The index range is a 2-tuple where + the first element indicates the end of the test pulse and the + second index is the end of valid response data. + """ + with h5py.File(self.file_name, 'r') as f: + + swp = f['epochs']['Sweep_%d' % sweep_number] + + # fetch data from file and convert to correct SI unit + # this operation depends on file version. early versions of + # the file have incorrect conversion information embedded + # in the nwb file and data was stored in the appropriate + # SI unit. For those files, return uncorrected data. + # For newer files (1.1 and later), apply conversion value. + major, minor = self.get_pipeline_version() + if (major == 1 and minor > 0) or major > 1: + # stimulus + stimulus_dataset = swp['stimulus']['timeseries']['data'] + conversion = float(stimulus_dataset.attrs["conversion"]) + stimulus = stimulus_dataset.value * conversion + # acquisition + response_dataset = swp['response']['timeseries']['data'] + conversion = float(response_dataset.attrs["conversion"]) + response = response_dataset.value * conversion + else: # old file version + stimulus_dataset = swp['stimulus']['timeseries']['data'] + stimulus = stimulus_dataset.value + response = swp['response']['timeseries']['data'].value + + if 'unit' in stimulus_dataset.attrs: + unit = stimulus_dataset.attrs["unit"].decode('UTF-8') + + unit_str = None + if unit.startswith('A'): + unit_str = "Amps" + elif unit.startswith('V'): + unit_str = "Volts" + assert unit_str is not None, Exception( + "Stimulus time series unit not recognized") + else: + unit = None + unit_str = 'Unknown' + + swp_idx_start = swp['stimulus']['idx_start'].value + swp_length = swp['stimulus']['count'].value + + swp_idx_stop = swp_idx_start + swp_length - 1 + sweep_index_range = (swp_idx_start, swp_idx_stop) + + # if the sweep has an experiment, extract the experiment's index + # range + try: + exp = f['epochs']['Experiment_%d' % sweep_number] + exp_idx_start = exp['stimulus']['idx_start'].value + exp_length = exp['stimulus']['count'].value + exp_idx_stop = exp_idx_start + exp_length - 1 + experiment_index_range = (exp_idx_start, exp_idx_stop) + except KeyError: + # this sweep has no experiment. return the index range of the + # entire sweep. + experiment_index_range = sweep_index_range + + assert sweep_index_range[0] == 0, Exception( + "index range of the full sweep does not start at 0.") + + return { + 'stimulus': stimulus, + 'response': response, + 'stimulus_unit' : unit_str, + 'index_range': experiment_index_range, + 'sampling_rate': 1.0 * swp['stimulus']['timeseries']['starting_time'].attrs['rate'] + } + + def set_sweep(self, sweep_number, stimulus, response): + """ Overwrite the stimulus or response of an NWB file. + If the supplied arrays are shorter than stored arrays, + they are padded with zeros to match the original data + size. + + Parameters + ---------- + sweep_number: int + + stimulus: np.array + Overwrite the stimulus with this array. If None, stimulus is unchanged. + + response: np.array + Overwrite the response with this array. If None, response is unchanged. + """ + + with h5py.File(self.file_name, 'r+') as f: + swp = f['epochs']['Sweep_%d' % sweep_number] + + # this is the length of the entire sweep data, including test pulse and + # whatever might be in front of it + # TODO: remove deprecated 'idx_stop' + if 'idx_stop' in swp['stimulus']: + sweep_length = swp['stimulus']['idx_stop'].value + 1 + else: + sweep_length = swp['stimulus']['count'].value + + if stimulus is not None: + # if the data is shorter than the sweep, pad it with zeros + missing_data = sweep_length - len(stimulus) + if missing_data > 0: + stimulus = np.append(stimulus, np.zeros(missing_data)) + + swp['stimulus']['timeseries']['data'][...] = stimulus + + if response is not None: + # if the data is shorter than the sweep, pad it with zeros + missing_data = sweep_length - len(response) + if missing_data > 0: + response = np.append(response, np.zeros(missing_data)) + + swp['response']['timeseries']['data'][...] = response + + def get_pipeline_version(self): + """ Returns the AI pipeline version number, stored in the + metadata field 'generated_by'. If that field is + missing, version 0.0 is returned. + + Returns + ------- + int tuple: (major, minor) + """ + try: + with h5py.File(self.file_name, 'r') as f: + if 'generated_by' in f["general"]: + info = f["general/generated_by"] + # generated_by stores array of keys and values + # keys are even numbered, corresponding values are in + # odd indices + for i in range(len(info)): + val = info[i] + if info[i] == 'version': + version = info[i+1] + break + toks = version.split('.') + if len(toks) >= 2: + major = int(toks[0]) + minor = int(toks[1]) + except: + minor = 0 + major = 0 + return major, minor + + def get_spike_times(self, sweep_number, key=None): + """ Return any spike times stored in the NWB file for a sweep. + + Parameters + ---------- + sweep_number: int + index to access + key : string + label where the spike times are stored (default NwbDataSet.SPIKE_TIMES) + + Returns + ------- + list + list of spike times in seconds relative to the start of the sweep + """ + + if key is None: + key = self.spike_time_key + + with h5py.File(self.file_name, 'r') as f: + sweep_name = "Sweep_%d" % sweep_number + datasets = ["analysis/%s/Sweep_%d" % (key, sweep_number), + "analysis/%s/Sweep_%d" % (self.DEPRECATED_SPIKE_TIMES, sweep_number)] + + for ds in datasets: + if ds in f: + return f[ds].value + return [] + + def set_spike_times(self, sweep_number, spike_times, key=None): + """ Set or overwrite the spikes times for a sweep. + + Parameters + ---------- + sweep_number : int + index to access + key : string + where the times are stored (default NwbDataSet.SPIKE_TIME) + + spike_times: np.array + array of spike times in seconds + """ + + if key is None: + key = self.spike_time_key + + with h5py.File(self.file_name, 'r+') as f: + # make sure expected directory structure is in place + if "analysis" not in f.keys(): + f.create_group("analysis") + + analysis_dir = f["analysis"] + if NwbDataSet.SPIKE_TIMES not in analysis_dir.keys(): + # analysis_dir.create_group(NwbDataSet.SPIKE_TIMES) + g = analysis_dir.create_group(NwbDataSet.SPIKE_TIMES) + # mixup in specification for validator resulted everything + # in 'analysis' requiring a custom label, even though + # it's already known to be custom. don't argue, just + # support the metadata redundancy + g.attrs["neurodata_type"] = "Custom" + + spike_dir = analysis_dir[NwbDataSet.SPIKE_TIMES] + + # see if desired dataset already exists + sweep_name = "Sweep_%d" % sweep_number + if sweep_name in spike_dir.keys(): + # rewriting data -- delete old dataset + del spike_dir[sweep_name] + + spike_dir.create_dataset( + sweep_name, data=spike_times, dtype='f8', maxshape=(None,)) + + def get_sweep_numbers(self): + """ Get all of the sweep numbers in the file, including test sweeps. """ + + with h5py.File(self.file_name, 'r') as f: + sweeps = [int(e.split('_')[1]) + for e in f['epochs'].keys() if e.startswith('Sweep_')] + return sweeps + + def get_experiment_sweep_numbers(self): + """ Get all of the sweep numbers for experiment epochs in the file, not including test sweeps. """ + + with h5py.File(self.file_name, 'r') as f: + sweeps = [int(e.split('_')[1]) + for e in f['epochs'].keys() if e.startswith('Experiment_')] + return sweeps + + def fill_sweep_responses(self, fill_value=0.0, sweep_numbers=None, extend_experiment=False): + """ Fill sweep response arrays with a single value. + + Parameters + ---------- + fill_value: float + Value used to fill sweep response array + + sweep_numbers: list + List of integer sweep numbers to be filled (default all sweeps) + + extend_experiment: bool + If True, extend experiment epoch length to the end of the sweep (undo any truncation) + + """ + + with h5py.File(self.file_name, 'a') as f: + if sweep_numbers is None: + sweep_numbers = self.get_sweep_numbers() + + for sweep_number in sweep_numbers: + epoch = "Sweep_%d" % sweep_number + if epoch in f['epochs']: + f['epochs'][epoch]['response'][ + 'timeseries']['data'][...] = fill_value + + if extend_experiment: + epoch = "Experiment_%d" % sweep_number + if epoch in f['epochs']: + idx_start = f['epochs'][epoch]['stimulus']['idx_start'].value + count = f['epochs'][epoch]['stimulus']['timeseries']['data'].shape[0] + + del f['epochs'][epoch]['stimulus']['count'] + f['epochs'][epoch]['stimulus']['count'] = count - idx_start + + + def get_sweep_metadata(self, sweep_number): + """ Retrieve the sweep level metadata associated with each sweep. + Includes information on stimulus parameters like its name and amplitude + as well as recording quality metadata, like access resistance and + seal quality. + + Parameters + ---------- + sweep_number: int + + Returns + ------- + dict + A dictionary with 'aibs_stimulus_amplitude_pa', 'aibs_stimulus_name', + 'gain', 'initial_access_resistance', 'seal' elements. These specific + fields are ones encoded in the original AIBS in vitro .nwb files. + """ + with h5py.File(self.file_name, 'r') as f: + + sweep_metadata = {} + + # the sweep level metadata is stored in + # stimulus/presentation/Sweep_XX in the .nwb file + + # indicates which metadata fields to return + metadata_fields = ['aibs_stimulus_amplitude_pa', 'aibs_stimulus_name', + 'gain', 'initial_access_resistance', 'seal'] + try: + stim_details = f['stimulus']['presentation'][ + 'Sweep_%d' % sweep_number] + for field in metadata_fields: + # check if sweep contains the specific metadata field + if field in stim_details.keys(): + sweep_metadata[field] = stim_details[field].value + + except KeyError: + sweep_metadata = {} + + return sweep_metadata diff --git a/core/obj_utilities.py b/core/obj_utilities.py new file mode 100644 index 0000000000..de603c745a --- /dev/null +++ b/core/obj_utilities.py @@ -0,0 +1,101 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + + +import numpy as np + + +def read_obj(path): + with open(path, 'r') as obj_file: + lines = obj_file.read().split('\n') + output = parse_obj(lines) + return output + + +def parse_obj(lines): + '''Parse a wavefront obj file into a triplet of vertices, normals, and faces. + This parser is specific to obj files generated from our annotation volumes + + Parameters + ---------- + lines : list of str + Lines of input obj file + + Returns + ------- + vertices : np.ndarray + Dimensions are (nSamples, nCoordinates=3). Locations in the reference space + of vertices + vertex_normals : np.ndarray + Dimensions are (nSample, nElements=3). Vectors normal to vertices. + face_vertices : np.ndarray + Dimensions are (sample, nVertices=3). References are given in indices + (0-indexed here, but 1-indexed in the file) of vertices that make up each face. + face_normals : np.ndarray + Dimensions are (sample, nNormals=3). References are given in indices + (0-indexed here, but 1-indexed in the file) of vertex normals that make up each face. + + Notes + ----- + This parser is specialized to the obj files that the Allen Institute for Brain Science + generates from our own structure annotations. + ''' + + vertices = [] + vertex_normals = [] + face_vertices = [] + face_normals = [] + + for line in lines: + + if line[:2] == 'v ': + vertices.append( line.split()[1:] ) + + elif line[:3] == 'vn ': + vertex_normals.append( line.split()[1:] ) + + elif line[:2] == 'f ': + line = line.replace('//', ' ').split()[1:] + + face_vertices.append( line[::2] ) + face_normals.append( line[1::2] ) + + vertices = np.array(vertices).astype(float) + vertex_normals = np.array(vertex_normals).astype(float) + face_vertices = np.array(face_vertices).astype(int) - 1 + face_normals = np.array(face_normals).astype(int) - 1 + + return vertices, vertex_normals, face_vertices, face_normals diff --git a/core/ontology.py b/core/ontology.py new file mode 100644 index 0000000000..44166e66ad --- /dev/null +++ b/core/ontology.py @@ -0,0 +1,227 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from collections import defaultdict +from six import string_types +import numpy as np +import pandas as pd + +from allensdk.deprecated import class_deprecated + + +@class_deprecated('Use StructureTree instead.') +class Ontology(object): + ''' + + .. note:: Deprecated from 0.12.5 + `Ontology` has been replaced by `StructureTree`. + + ''' + + def __init__(self, df): + self.df = df + + child_ids = defaultdict(set) + descendant_ids = defaultdict(set) + + for _, s in df.iterrows(): + sid = s.name + parent_id = s['parent_structure_id'] + if np.isfinite(parent_id): + parent_id = int(parent_id) + child_ids[parent_id].add(sid) + + parent_id_list = map(int, s['structure_id_path'].split('/')[1:-1]) + + for parent_id in parent_id_list: + descendant_ids[parent_id].add(sid) + + self.child_ids = dict(child_ids) + self.descendant_ids = dict(descendant_ids) + + def __getitem__(self, structures): + """ + Return a subset of structures by id or acronym. Duplicate values are ignored. + + Parameters + ---------- + + structures: tuple + Elements can be pandas.Series objects, which are expected to be structure ids. + Elements can be strings, which are expected to be acronyms. + All other elements must be cast-able to int, which are treated as structure ids. + + Returns + ------- + + pandas.DataFrame + A subset of rows from the complete ontology that match filtering criteria. + """ + + # __getitem__ always has a single argument. If called with a single argument + # (e.g. ontology[315]), that item is passed straight through. If called with + # multiple arguments (e.g. ontology[315,997]), that gets passed through as a + # tuple. This normalizes the arguments so that everything is iterable. + if not isinstance(structures, tuple) and not isinstance(structures, list) and not isinstance(structures, set): + structures = structures, + + # this is the final set of structure ids used to filter + structure_ids = set() + + string_strs = [] + for s in structures: + if isinstance(s, pd.Series): + # if it's a pandas series, assume it's a series of structure + # ids + structure_ids.update(s.tolist()) + elif isinstance(s, string_types): + # if it's a string, assume it's an acronym + string_strs.append(s) + else: + # if it's anything else, cast it to an integer and treat it + # like a structure id + structure_ids.add(int(s)) + + # convert the string arguments to rows + if len(string_strs): + + # pull out the rows that match these acronyms + string_strs = self.df[self.df['acronym'].isin(string_strs)] + + # if there are no other structure ids, just return this dataframe + if len(structure_ids) == 0: + return string_strs + + # otherwise pull out the ids and add them to the set + structure_ids.update(string_strs.id.tolist()) + + return self.df.loc[structure_ids].dropna(axis=0, how='all') + + def get_descendant_ids(self, structure_ids): + """ + Find the set of the ids of structures that are descendants of one or more structures. + The returned set will include the input structure ids. + + Parameters + ---------- + structure_ids: iterable + Any iterable type that contains structure ids that can be cast to integers. + + Returns + ------- + set + Set of descendant structure ids. + """ + + if len(structure_ids) == 0: + return self.descendant_ids + else: + descendants = set() + for structure_id in structure_ids: + descendants.update(self.descendant_ids.get( + int(structure_id), set())) + return descendants + + def get_child_ids(self, structure_ids): + """ + Find the set of ids that are immediate children of one or more structures. + + Parameters + ---------- + structure_ids: iterable + Any iterable type that contains structure ids that can be cast to integers. + + Returns + ------- + set + Set of child structure ids + """ + + if len(structure_ids) == 0: + return self.child_ids + else: + children = set() + for structure_id in structure_ids: + children.update(self.child_ids.get(int(structure_id), set())) + return children + + def get_descendants(self, structure_ids): + """ + Find the set of structures that are descendants of one or more structures. + The returned set will include the input structures. + + Parameters + ---------- + structure_ids: iterable + Any iterable type that contains structure ids that can be cast to integers. + + Returns + ------- + pandas.DataFrame + Set of descendant structures. + """ + + descendant_ids = self.get_descendant_ids(structure_ids) + return self[descendant_ids] + + def get_children(self, structure_ids): + """ + Find the set of structures that are immediate children of one or more structures. + + Parameters + ---------- + structure_ids: iterable + Any iterable type that contains structure ids that can be cast to integers. + + Returns + ------- + pandas.DataFrame + Set of child structures + """ + + child_ids = self.get_child_ids(structure_ids) + return self[child_ids] + + def structure_descends_from(self, child_id, parent_id): + """ + Return whether one structure id is a descendant of another structure id. + """ + child = self[child_id] + + if child is not None: + parent_str = '/%d/' % parent_id + return child['structure_id_path'].values[0].find(parent_str) >= 0 + + return False diff --git a/core/ophys_experiment_session_id_mapping.py b/core/ophys_experiment_session_id_mapping.py new file mode 100644 index 0000000000..eee314ac5f --- /dev/null +++ b/core/ophys_experiment_session_id_mapping.py @@ -0,0 +1,1377 @@ +# NOTE: This is a really ugly hack to get around the fact that warehouse does +# not have Ophys session ids associated with experiment ids. This should be +# removed when warehouse session ids have associations with experiment ids. + +# This mapping relates an ophys experiment id (key) with an ophys session id +# (value). For this release it happens that each session has one and only one +# experiment, but this may not be true in the future. +ophys_experiment_session_id_map = { + 617388117: 617204394, + 675062364: 674701693, + 638056634: 637886705, + 675477919: 675094980, + 676024958: 675526428, + 679702884: 679630717, + 679697901: 679374438, + 676502528: 676090240, + 679700458: 679423455, + 676503588: 676090006, + 680156911: 679992938, + 676025604: 675530244, + 679346829: 676520038, + 679353932: 676622572, + 676503737: 676445425, + 679697469: 676520049, + 680600666: 680180435, + 681047011: 680613920, + 676024666: 675095570, + 676026346: 675969347, + 681673022: 681405024, + 680150733: 679738051, + 676503918: 676194210, + 688580172: 687895916, + 680601013: 680321401, + 682051855: 681784630, + 680601319: 680488009, + 683252051: 682746120, + 682049099: 681698162, + 682732631: 682070345, + 688678798: 688289405, + 681674286: 681568102, + 682054669: 681908344, + 685816064: 685739480, + 685816006: 685507313, + 685816036: 685611030, + 682734792: 682158049, + 663479824: 663132753, + 685494041: 684973296, + 664899910: 664441993, + 682734376: 682131535, + 686909240: 686579753, + 686910010: 686796722, + 686919436: 686705607, + 685497280: 685064378, + 687498308: 687355505, + 690046237: 689803170, + 683257169: 683061635, + 686910134: 686467044, + 691763694: 691729174, + 686442556: 686100509, + 654920038: 654584089, + 691197571: 690512569, + 686449285: 686189020, + 686441799: 686294609, + 688579650: 687817723, + 688678784: 688008140, + 663868345: 663702484, + 690004696: 689482753, + 688678766: 688138215, + 686449092: 685694164, + 689402473: 689185054, + 689398304: 689210547, + 675478137: 675400558, + 671163047: 670911240, + 690021259: 689626516, + 692345003: 692137592, + 691199371: 690271656, + 689388034: 688817152, + 692345336: 692165696, + 689402014: 689297706, + 657082055: 657057268, + 691201201: 690464182, + 657391037: 657287148, + 690045763: 689774144, + 656381309: 654998375, + 691208363: 690790606, + 627823344: 626132632, + 636924826: 636788964, + 657650471: 657475643, + 672206735: 671661966, + 657470856: 657408209, + 690072103: 689692832, + 672674054: 672239388, + 658024115: 657927354, + 697339797: 696742680, + 637159507: 636960308, + 657776356: 657657321, + 698260532: 698197227, + 669233895: 668543586, + 654532828: 654098242, + 658831566: 658047449, + 671162646: 670833334, + 653331744: 653199400, + 658842672: 658092103, + 658854537: 658562371, + 658854486: 658097678, + 696717748: 696172756, + 700659215: 700390618, + 617405912: 617345779, + 653551965: 653517763, + 656939127: 656821080, + 699846423: 699702574, + 653924226: 653835533, + 653923501: 653642620, + 653922961: 653566034, + 657009581: 656943369, + 673914981: 673499844, + 653173685: 653139805, + 660065952: 660058791, + 657389972: 657246849, + 657078119: 656861251, + 657081119: 656978292, + 654533788: 654318350, + 657891871: 657812298, + 662033243: 661191717, + 644026238: 643699310, + 657224241: 657194671, + 657648863: 657408334, + 657390171: 657246622, + 657223595: 657093798, + 657775947: 657657370, + 663868423: 663608579, + 657079190: 657029203, + 658020264: 657923451, + 702934681: 702219057, + 657469734: 657431418, + 698762886: 698274116, + 657892020: 657811716, + 699154913: 698784138, + 704821286: 704320269, + 657648983: 657476254, + 659491419: 659191654, + 657892406: 657861558, + 658020352: 657923339, + 657649356: 657478403, + 657804824: 657660322, + 657785850: 657686834, + 703308071: 703018188, + 664914611: 664144209, + 658518486: 658094350, + 660064796: 659784363, + 653332425: 653179688, + 657649512: 657476325, + 657786322: 657679166, + 657914280: 657811501, + 657807185: 657716937, + 658816608: 658033553, + 658522835: 658103151, + 659743436: 659499661, + 669237515: 668827167, + 657649672: 657516474, + 672207947: 671933746, + 658020830: 657928466, + 660065134: 659785578, + 661328410: 661049756, + 669858844: 669286969, + 653174445: 653138855, + 658532657: 658347440, + 660510504: 660077197, + 658532840: 658421620, + 659746625: 659535566, + 664899825: 664879356, + 673144434: 672689463, + 647885322: 647781884, + 659743451: 659499892, + 668526823: 668451681, + 659749630: 659499666, + 660969879: 660527264, + 660510593: 660076860, + 658533763: 658066631, + 658854887: 658607692, + 670721500: 670413637, + 696156783: 695633751, + 689385404: 688836200, + 659495103: 659419705, + 659767482: 659499457, + 660065538: 659979750, + 661437140: 661379121, + 662351068: 661440854, + 658536111: 658310929, + 660513003: 660076781, + 661328570: 661003602, + 671162628: 670833432, + 660069314: 660042693, + 661744804: 661389521, + 698768912: 698595517, + 705944402: 704884627, + 660066712: 659784113, + 662107986: 661500738, + 672211004: 671700040, + 661753184: 661440775, + 663475712: 662996746, + 662974315: 662739484, + 648186871: 648090296, + 666550608: 666290707, + 699155265: 699130505, + 662982346: 662911174, + 662219852: 661924620, + 701046700: 700599087, + 710778377: 707632363, + 643592303: 643479143, + 662348706: 661299645, + 670395725: 669875907, + 662958642: 662401139, + 662348804: 661300356, + 662960692: 662400771, + 663479950: 663319986, + 663866413: 663504894, + 661771052: 661479289, + 664404274: 664159661, + 664394265: 663882610, + 663478400: 662996580, + 702934964: 702659500, + 669239852: 668978437, + 703308147: 703287519, + 703731597: 703325264, + 663876406: 663504968, + 663482878: 663441068, + 699155540: 699002540, + 663488086: 663353237, + 662989044: 662839646, + 663485329: 662996173, + 665305913: 664921380, + 663870102: 663761670, + 663876890: 663710404, + 666274740: 666209296, + 666589601: 666290856, + 664414452: 663882542, + 666563739: 666054314, + 704822876: 704755579, + 704826374: 704658882, + 663873076: 663763444, + 665307545: 665097336, + 662356172: 661587992, + 670721589: 670413425, + 653175011: 653141064, + 666274171: 665658214, + 674275274: 674000535, + 662361096: 662103640, + 665722301: 665631165, + 666274157: 665879171, + 662358233: 661700450, + 653331120: 653180071, + 668528146: 668445110, + 672213828: 672083282, + 669859475: 669765251, + 672220620: 671662011, + 670395999: 669915840, + 662358771: 661390989, + 665726259: 665438247, + 666274565: 666068830, + 670721867: 670495740, + 662359728: 661781665, + 672674656: 672239307, + 673475020: 673460835, + 703731696: 703705589, + 701047896: 700632617, + 665726618: 665575559, + 667011230: 666605387, + 706566686: 705520030, + 670396194: 670339150, + 667014179: 666830443, + 671618887: 671182004, + 671164927: 671072873, + 672214923: 671929354, + 707005501: 706710232, + 704298735: 704276081, + 707444935: 707357875, + 670722225: 670640115, + 653174169: 653170100, + 657469564: 657409239, + 705412356: 705292555, + 670398566: 669874870, + 671614170: 671184188, + 670399058: 670160719, + 671164733: 670912778, + 673475038: 673190784, + 672675715: 672539085, + 674275260: 674000253, + 673145838: 672897867, + 674678616: 674290950, + 672675348: 672310177, + 707917316: 707625051, + 670728674: 670413188, + 707444949: 707398104, + 707006626: 706953936, + 709948912: 709658719, + 707007273: 706948211, + 707921521: 707831887, + 673475737: 673425861, + 672223115: 671688792, + 644657636: 644429760, + 707923645: 707801916, + 710469199: 710043801, + 710024283: 709968467, + 710937195: 710587414, + 711590232: 710959347, + 710937910: 710610196, + 712178483: 711607135, + 710500829: 709693915, + 712178511: 712159883, + 710502981: 709821704, + 712919665: 712196292, + 657915168: 657861555, + 712919679: 712195429, + 716951662: 716711407, + 667004159: 666608632, + 712924011: 712812121, + 710504563: 710041594, + 710938138: 710785757, + 711590640: 711309246, + 714778358: 714638626, + 712923993: 712421917, + 713568018: 712942243, + 670733777: 670494572, + 710505947: 710043812, + 710938330: 710771367, + 711590945: 711508400, + 715923832: 715244445, + 716646781: 716425126, + 716956096: 716842120, + 673171110: 672689458, + 658020691: 657926482, + 653552163: 653545674, + 717214654: 717075402, + 717913184: 717756282, + 658021293: 657983994, + 657080632: 657032099, + 657391625: 657363188, + 653555156: 653199506, + 653932505: 653566962, + 657086258: 657064839, + 657650110: 657519102, + 657087057: 657068498, + 657012597: 656946113, + 658816715: 658561617, + 658024291: 657984062, + 657016267: 656996467, + 658020989: 657928452, + 659772816: 659679595, + 659771301: 659629558, + 662351164: 661781268, + 667348568: 667063603, + 674276329: 674000246, + 673171528: 672799969, + 662351346: 661501237, + 661773710: 661587055, + 607268593: 610508230, + 667772496: 667397892, + 667692764: 667450511, + 673173248: 672971212, + 649399061: 649382252, + 601812180: 610506225, + 674679940: 674290280, + 667364442: 667063402, + 667721307: 667483193, + 675067662: 674804863, + 667775371: 666706768, + 675070721: 674699998, + 649401936: 649387010, + 644660705: 644560631, + 644908995: 644719707, + 644909311: 644722604, + 667372460: 667268529, + 644909644: 644791172, + 667376208: 667321151, + 645035917: 644952030, + 644949350: 644933365, + 644947716: 644914198, + 645413759: 645378465, + 644386884: 644091315, + 648377368: 648193408, + 603551724: 610506913, + 637122339: 636934719, + 650079244: 650054743, + 644910997: 644814766, + 644949526: 644941813, + 645256361: 645091131, + 637669270: 637251092, + 593624660: 610504369, + 637671554: 637380703, + 645690246: 645423674, + 645699801: 645489038, + 645689073: 645510372, + 603592541: 610506955, + 647595671: 647182872, + 637670417: 637368205, + 647605431: 647492007, + 650510192: 650436490, + 646291324: 646023280, + 562043540: 610498935, + 646959487: 646826134, + 647595665: 647103976, + 647593956: 647027881, + 653052938: 653007982, + 652094901: 651786682, + 646959390: 646726175, + 647155122: 647102481, + 638754323: 638344172, + 639117180: 638873842, + 647603932: 647183600, + 647148822: 646968436, + 649938395: 649732951, + 651770380: 651674583, + 594090967: 610504515, + 649398482: 649338696, + 648644110: 648431917, + 651769499: 651528194, + 645040965: 644952044, + 649324898: 649261264, + 645474010: 645423680, + 650389887: 650118592, + 653053207: 653007143, + 652842495: 652744094, + 645086975: 645054487, + 651366510: 650908289, + 649409874: 649381281, + 646016415: 645820809, + 652337551: 652175017, + 652336350: 652105608, + 646685143: 646301726, + 650509372: 650257052, + 653054766: 653032190, + 649938123: 649502102, + 652092676: 652051206, + 651770186: 651528344, + 652092002: 651891910, + 646686778: 646352978, + 651770794: 651743229, + 652091264: 651786726, + 652094917: 652062915, + 652338101: 652171115, + 653056052: 652889732, + 653122667: 653071832, + 647143225: 646968423, + 652738799: 652546769, + 653058060: 652939233, + 652338622: 652224358, + 652340572: 652298443, + 652991352: 652963523, + 653123586: 653077024, + 652989442: 652889710, + 653123929: 653076286, + 652990651: 652959034, + 603763073: 610507141, + 653122445: 653071918, + 603889825: 610507204, + 603863146: 610507169, + 603978471: 610507238, + 652989705: 652890000, + 647598519: 647484569, + 603926442: 610507225, + 639252499: 639222514, + 603905059: 610507211, + 589755795: 610503639, + 591254266: 610503851, + 604110093: 610507259, + 603552279: 610506920, + 652730939: 652376956, + 648389302: 648296653, + 653053920: 653024056, + 587339481: 610503359, + 652842572: 652743500, + 604145810: 610507303, + 595806300: 610504859, + 596509886: 610505001, + 649938038: 649416423, + 588191926: 610503417, + 652737678: 652579438, + 597169069: 610505271, + 604529230: 610507345, + 604601380: 610507359, + 587344053: 610503366, + 588535615: 610503480, + 599420257: 610505713, + 589441079: 610503584, + 601705404: 610506145, + 591397995: 610503896, + 642664460: 642293912, + 601789309: 610506166, + 642026233: 640251509, + 601841437: 610506253, + 602053643: 610506417, + 652988777: 652886679, + 648379675: 648285038, + 593270603: 610504215, + 602589533: 610506571, + 603224878: 610506731, + 593373156: 610504236, + 604866832: 610507495, + 604328043: 610507324, + 604576637: 610507352, + 596824582: 610505123, + 604870277: 610507502, + 605035620: 610507530, + 605465843: 610507575, + 652092892: 651871743, + 593506468: 610504327, + 606340116: 610507892, + 609110140: 610508304, + 609894681: 610508790, + 653125130: 653079091, + 613586002: 613151642, + 613599811: 613152534, + 605222325: 610507568, + 604889972: 610507516, + 605800963: 610507703, + 606031380: 610507773, + 605883133: 610507738, + 606221961: 610507857, + 650390042: 650119648, + 606353987: 610507913, + 606802468: 610507979, + 606960609: 610508068, + 606873744: 610508047, + 607058394: 610508161, + 607040613: 610508119, + 606828333: 610508005, + 607063420: 610508168, + 612044635: 611910132, + 611658482: 611432002, + 612077499: 611921086, + 612536911: 612139146, + 612534310: 612152394, + 612549085: 612386302, + 612543999: 612370197, + 612555380: 612234719, + 612566550: 612405328, + 613062525: 612618629, + 623338499: 617550541, + 617429820: 617267679, + 605087965: 610507544, + 605683787: 610507665, + 605606109: 610507620, + 606151117: 610507815, + 605688822: 610507672, + 606227591: 610507864, + 611644893: 611502119, + 612546493: 612329560, + 613968705: 613870209, + 613062561: 612854518, + 613982017: 613885531, + 613974486: 613931451, + 614556106: 614392439, + 614571626: 614482934, + 614561354: 614402832, + 617035984: 616837536, + 627823723: 625962396, + 637123467: 636996363, + 643645390: 643484235, + 644051974: 643681042, + 605913519: 610507745, + 605674734: 610507658, + 605859367: 610507724, + 613974468: 613923239, + 613599793: 613427366, + 613586022: 613152593, + 617047316: 616833413, + 617069979: 616821145, + 617381605: 617180871, + 617395439: 617196048, + 617047359: 616874653, + 614846599: 614759699, + 616770941: 616620521, + 616779893: 616727921, + 616774177: 616645705, + 617395455: 617284806, + 617079480: 616821227, + 623339891: 623071722, + 623587006: 623354186, + 626028096: 623749104, + 626027888: 623758973, + 626027944: 623796157, + 627824108: 626057647, + 627823792: 626218502, + 627824037: 625920072, + 627823695: 626123869, + 627823636: 626156806, + 629789161: 627882816, + 636889229: 636785083, + 636889304: 636835307, + 636930038: 636851045, + 637113156: 636944806, + 637154333: 636934145, + 637115675: 636982135, + 637126541: 636975549, + 637668816: 637250357, + 637667993: 636983351, + 637669284: 637291356, + 644911034: 644720543, + 649317434: 649273447, + 645687787: 645422825, + 645695159: 645488613, + 645692522: 645487069, + 645691416: 645654084, + 646017558: 645855239, + 645700487: 645626001, + 646016204: 645734195, + 649399137: 649380523, + 650510708: 650481446, + 650885952: 650734598, + 637672042: 637447841, + 598582651: 610505491, + 637998955: 637923516, + 638262535: 638254877, + 650512363: 650256765, + 652096183: 651931315, + 652345569: 652192853, + 652339241: 652277074, + 598564173: 610505484, + 637990755: 637802352, + 637994504: 637941904, + 638262084: 637874895, + 638262558: 638124911, + 638262098: 638125644, + 638862121: 638769431, + 638267173: 638208119, + 638864066: 638773454, + 638754561: 638358021, + 598137246: 610505421, + 598330857: 610505456, + 598635821: 610505561, + 596769570: 610505095, + 601260046: 610505824, + 599320182: 610505682, + 599586915: 610505744, + 639117196: 639010999, + 639251932: 639131793, + 639252109: 639131163, + 638871662: 638773555, + 639117826: 638887327, + 639253043: 639146644, + 639437387: 639266130, + 639756225: 639461341, + 639254728: 639228762, + 639929075: 639665794, + 639931541: 639792164, + 639940936: 639789165, + 639932847: 639873825, + 639437957: 639396284, + 642032356: 640281387, + 642275961: 642187321, + 642275947: 642244262, + 674679019: 674550092, + 683253712: 683089406, + 669861524: 669478172, + 601273921: 610505838, + 601374506: 610505953, + 642651898: 642389261, + 642884591: 642704670, + 642883713: 642737766, + 643066628: 642921966, + 642877968: 642822182, + 643216853: 643081302, + 643586314: 643228473, + 642656700: 642499066, + 643062797: 642973400, + 601362437: 610505925, + 601368107: 610505932, + 601385772: 610505967, + 601500256: 610506044, + 652737867: 652366516, + 652991570: 652963752, + 652990427: 652957377, + 653130708: 653075038, + 653126877: 653074133, + 601328878: 610505887, + 601274353: 610505845, + 601805379: 610506204, + 601507932: 610506068, + 601790881: 610506197, + 601887677: 610506291, + 601886540: 610506284, + 601904502: 610506319, + 601910964: 610506340, + 602170460: 610506459, + 602164790: 610506452, + 603425659: 610506822, + 603195918: 610506710, + 602857315: 610506637, + 603454352: 610506857, + 603516552: 610506899, + 603519646: 610506906, + 601903169: 610506312, + 601871318: 610506277, + 601982862: 610506403, + 602206167: 610506480, + 602263642: 610506501, + 602397924: 610506508, + 603187982: 610506675, + 602574260: 610506557, + 603185265: 610506654, + 603188560: 610506689, + 603452151: 610506843, + 613062511: 612620668, + 609239161: 610508395, + 613083872: 612887668, + 613091721: 612699762, + 614851823: 614779392, + 592348507: 610504059, + 592407200: 610504094, + 592494159: 610504122, + 593240301: 610504201, + 592427707: 610504108, + 592657427: 610504156, + 592409256: 610504101, + 592655327: 610504149, + 593243892: 610504208, + 593508594: 610504341, + 593438037: 610504299, + 593416136: 610504271, + 593389688: 610504250, + 593552712: 610504348, + 593887846: 610504442, + 593646972: 610504404, + 593695648: 610504421, + 593902390: 610504456, + 594314285: 610504543, + 594127683: 610504536, + 595183197: 610504599, + 594320795: 610504557, + 595263154: 610504630, + 595229536: 610504609, + 595273803: 610504640, + 595337950: 610504689, + 595452192: 610504710, + 595621868: 610504762, + 595719414: 610504800, + 595620998: 610504748, + 595718342: 610504793, + 595808594: 610504873, + 595829914: 610504880, + 595904738: 610504908, + 595899822: 610504901, + 596525298: 610505015, + 596584192: 610505043, + 596779487: 610505102, + 596557969: 610505022, + 639443233: 638889067, + 597014165: 610505201, + 597028938: 610505229, + 638753616: 638282315, + 638756637: 638298035, + 596826262: 610505130, + 597304174: 610505313, + 497060401: 610491401, + 500860585: 610491436, + 500964514: 610491478, + 501021421: 610491499, + 501271265: 610491555, + 501337989: 610491576, + 501474098: 610491590, + 501498760: 610491618, + 501559087: 610491632, + 501567237: 610491646, + 501574836: 610491660, + 501704220: 610491667, + 501717543: 610491674, + 501729039: 610491688, + 501773889: 610491695, + 501788003: 610491709, + 501794235: 610491716, + 501800164: 610491723, + 501836392: 610491730, + 501839084: 610491737, + 501847516: 610491751, + 501876401: 610491765, + 501879034: 610491772, + 501886692: 610491779, + 501889084: 610491786, + 501929146: 610491793, + 501929610: 610491800, + 501933264: 610491807, + 501940850: 610491828, + 502066273: 610491842, + 502115959: 610491849, + 502199136: 610491870, + 502205092: 610491877, + 502254330: 610491884, + 502352946: 610491898, + 502368172: 610491912, + 502376461: 610491919, + 502382906: 610491926, + 502383036: 610491933, + 502483554: 610491940, + 502526200: 610491947, + 502608215: 610491954, + 502634578: 610491961, + 502665019: 610491968, + 502666254: 610491975, + 502667200: 610491982, + 502741583: 610491996, + 502793808: 610492003, + 502810282: 610492010, + 502962794: 610492031, + 502974807: 610492038, + 503019786: 610492052, + 503109347: 610492066, + 503324629: 610492087, + 503412730: 610492101, + 503526711: 610492108, + 503538804: 610492115, + 503772253: 610492122, + 503820068: 610492129, + 503823672: 610492136, + 503864409: 610492150, + 503866276: 610492157, + 504101079: 610492164, + 504108263: 610492178, + 504115289: 610492185, + 504508104: 610492206, + 504568756: 610492227, + 504593468: 610492234, + 504625475: 610492248, + 504642019: 610492269, + 504809131: 610492297, + 504853580: 610492304, + 505017668: 610492318, + 505314372: 610492360, + 505407318: 610492367, + 505693621: 610492381, + 505695962: 610492402, + 505696248: 610492409, + 505801925: 610492416, + 505811062: 610492430, + 505845219: 610492437, + 506030579: 610492444, + 506144725: 610492458, + 506156402: 610492465, + 506248008: 610492472, + 506278598: 610492479, + 506353473: 610492493, + 506356888: 610492500, + 506441755: 610492507, + 506456537: 610492514, + 506520696: 610492521, + 506520703: 610492528, + 506540916: 610492542, + 506694419: 610492563, + 506773185: 610492577, + 506773892: 610492584, + 506809539: 610492598, + 506823562: 610492605, + 506954308: 610492626, + 507129766: 610492647, + 507304910: 610492654, + 507464107: 610492682, + 507552264: 610492689, + 507691036: 610492703, + 507691380: 610492724, + 507691566: 610492738, + 507691735: 610492745, + 507691834: 610492752, + 507990552: 610492787, + 508220632: 610492801, + 508262069: 610492808, + 508356957: 610492864, + 508378520: 610492878, + 508546728: 610492913, + 508563988: 610492927, + 508596945: 610492941, + 508753256: 610492969, + 509580400: 610493081, + 509644421: 610493116, + 509729072: 610493123, + 509799475: 610493137, + 509841198: 610493151, + 509904120: 610493179, + 509958730: 610493193, + 509962140: 610493207, + 510021399: 610493214, + 510093797: 610493228, + 510166410: 610493242, + 510174759: 610493249, + 510214538: 610493256, + 510345479: 610493291, + 510390912: 610493298, + 510417261: 610493312, + 510514430: 610493319, + 510514474: 610493326, + 510517131: 610493340, + 510517609: 610493354, + 510524416: 610493368, + 510532780: 610493389, + 510535700: 610493403, + 510536059: 610493410, + 510536157: 610493417, + 510656082: 610493424, + 510698988: 610493438, + 510699005: 610493445, + 510705057: 610493452, + 510706209: 610493459, + 510712856: 610493466, + 510814438: 610493473, + 510859641: 610493480, + 510917254: 610493487, + 510933273: 610493494, + 510938357: 610493501, + 511194579: 610493508, + 511242327: 610493522, + 511305590: 610493548, + 511434920: 610493555, + 511440894: 610493569, + 511458599: 610493583, + 511458874: 610493590, + 511534603: 610493597, + 511573879: 610493604, + 511595995: 610493618, + 511856569: 610493639, + 511976254: 610493674, + 511976329: 610493681, + 511977695: 610493688, + 512124564: 610493709, + 512145745: 610493716, + 512149367: 610493723, + 512164988: 610493737, + 512176430: 610493744, + 512270518: 610493765, + 512311673: 610493779, + 512326618: 610493793, + 524691284: 610494332, + 524848692: 610494358, + 525368285: 610494442, + 526504941: 610494589, + 526768996: 610494624, + 526928092: 610494666, + 527048992: 610494694, + 527583578: 610494757, + 528402271: 610494904, + 528480613: 610494911, + 528574532: 610494939, + 528693630: 610494960, + 528792732: 610495009, + 528972913: 610495044, + 529487172: 610495114, + 529688779: 610495128, + 529693740: 610495135, + 529763302: 610495142, + 530047022: 610495184, + 530181996: 610495226, + 530318805: 610495282, + 530645663: 610495324, + 530739576: 610495373, + 530773844: 610495387, + 531008833: 610495443, + 531124922: 610495471, + 531134090: 610495485, + 531342486: 610495520, + 531348161: 610495534, + 537153918: 610495737, + 538803517: 610495793, + 539000397: 610495856, + 539290504: 610495884, + 539291372: 610495891, + 539487468: 610495905, + 539497234: 610495919, + 539515366: 610495933, + 539540432: 610495961, + 539643002: 610495975, + 540168837: 610496087, + 540609585: 610496115, + 540684467: 610496122, + 540729056: 610496136, + 540993890: 610496150, + 541010698: 610496157, + 541048140: 610496164, + 541206592: 610496171, + 541290571: 610496178, + 543677427: 610496332, + 544507627: 610496381, + 545446482: 610496430, + 545578997: 610496465, + 546341286: 610496542, + 546377461: 610496556, + 546641574: 610496591, + 546698458: 610496605, + 546716391: 610496612, + 546963704: 610496619, + 547315014: 610496640, + 547388708: 610496682, + 547560448: 610496724, + 547573479: 610496738, + 548227481: 610496752, + 548379748: 610496780, + 549483412: 610496864, + 549855420: 610496885, + 550127307: 610496899, + 550197614: 610496927, + 550374428: 610496955, + 550455111: 610496969, + 550490398: 610496976, + 550851591: 610496997, + 551412605: 610497074, + 551657972: 610497081, + 551834174: 610497123, + 551888519: 610497130, + 552195520: 610497137, + 552318211: 610497172, + 552324309: 610497179, + 552410386: 610497193, + 552427971: 610497221, + 552569752: 610497249, + 552760671: 610497277, + 553000583: 610497312, + 553012563: 610497319, + 553233689: 610497375, + 553568031: 610497403, + 554014020: 610497438, + 554021353: 610497445, + 554037270: 610497466, + 554219904: 610497480, + 554254184: 610497508, + 554284637: 610497515, + 555018432: 610497595, + 555040116: 610497609, + 555042467: 610497616, + 555237087: 610497637, + 555257822: 610497644, + 555327035: 610497651, + 555356387: 610497672, + 555749369: 610497693, + 555801657: 610497700, + 555813683: 610497707, + 556321897: 610497721, + 556338149: 610497735, + 556344224: 610497742, + 556344441: 610497749, + 556353209: 610497756, + 556665481: 610497791, + 556700770: 610497798, + 556919719: 610497819, + 556936293: 610497833, + 556936622: 610497840, + 556936856: 610497847, + 556999461: 610497854, + 557182484: 610497868, + 557225279: 610497896, + 557227804: 610497903, + 557304694: 610497917, + 557345665: 610497938, + 557393040: 610497945, + 557395543: 610497952, + 557414237: 610497959, + 557420967: 610497966, + 557520764: 610497973, + 557589954: 610497980, + 557615965: 610497987, + 557626633: 610497994, + 557848210: 610498015, + 557956194: 610498022, + 557984485: 610498043, + 558387203: 610498064, + 558389981: 610498071, + 558476282: 610498120, + 558560971: 610498134, + 558581038: 610498141, + 558670888: 610498183, + 559082739: 610498204, + 559087706: 610498211, + 559192380: 610498225, + 559382012: 610498246, + 559394526: 610498253, + 559645339: 610498267, + 559869893: 610498288, + 560027980: 610498330, + 560578599: 610498435, + 560596067: 610498456, + 560689712: 610498470, + 560745435: 610498505, + 560782656: 610498540, + 560802931: 610498561, + 560806119: 610498568, + 560809202: 610498575, + 560866155: 610498596, + 560876151: 610498610, + 560898462: 610498631, + 560916904: 610498638, + 560920977: 610498645, + 560926639: 610498652, + 561312435: 610498697, + 561331220: 610498725, + 561405713: 610498760, + 561472633: 610498781, + 561528269: 610498830, + 561531215: 610498844, + 561994407: 610498907, + 562003583: 610498921, + 562052595: 610498949, + 562095852: 610498963, + 562172003: 610498984, + 562122508: 610498970, + 562220433: 610498998, + 562222842: 610499012, + 562296530: 610499026, + 562382668: 610499061, + 562536153: 610499096, + 562660121: 610499131, + 562711440: 610499145, + 563027941: 610499201, + 563176332: 610499222, + 563226901: 610499250, + 563335004: 610499271, + 563500510: 610499334, + 563582972: 610499355, + 563710064: 610499390, + 564395580: 610499432, + 564425777: 610499467, + 564607188: 610499481, + 565039912: 610499523, + 565104109: 610499537, + 565216523: 610499575, + 565293865: 610499589, + 565462806: 610499624, + 565583560: 610499631, + 565698388: 610499645, + 566096665: 610499673, + 566307038: 610499687, + 566458505: 610499715, + 566523247: 610499736, + 566645518: 610499757, + 566716486: 610499806, + 566719810: 610499813, + 566752133: 610499827, + 567446262: 610499876, + 567709426: 610499904, + 567734055: 610499925, + 567878987: 610499960, + 568753147: 610500051, + 568775666: 610500058, + 568796683: 610500072, + 569251677: 610500142, + 569252439: 610500149, + 569299884: 610500184, + 569374806: 610500205, + 569396924: 610500219, + 569407590: 610500233, + 569431665: 610500247, + 569457162: 610500261, + 569457271: 610500268, + 569478789: 610500282, + 569494121: 610500296, + 569611979: 610500331, + 569635505: 610500338, + 569645690: 610500345, + 569718097: 610500359, + 569722788: 610500373, + 569739027: 610500380, + 569790130: 610500401, + 569792817: 610500408, + 569810774: 610500415, + 569818138: 610500436, + 569896493: 610500450, + 569933532: 610500464, + 569967584: 610500478, + 569981240: 610500506, + 570006683: 610500520, + 570008444: 610500527, + 570059563: 610500562, + 570080979: 610500569, + 570236381: 610500597, + 570236726: 610500618, + 570278597: 610500660, + 570305847: 610500674, + 570428252: 610500688, + 570472763: 610500702, + 570888896: 610500737, + 570889097: 610500744, + 570909395: 610500765, + 570994452: 610500793, + 571006300: 610500807, + 571006351: 610500814, + 571099190: 610500849, + 571103671: 610500856, + 571137446: 610500877, + 571177441: 610500898, + 571177752: 610500912, + 571255084: 610500940, + 571418966: 610500985, + 571494829: 610501020, + 571541565: 610501041, + 571642389: 610501062, + 571684733: 610501069, + 571912779: 610501139, + 572376868: 610501167, + 572409326: 610501188, + 572489757: 610501202, + 572499364: 610501216, + 572505201: 610501223, + 572606382: 610501265, + 572722662: 610501286, + 572805162: 610501307, + 573083539: 610501349, + 573110620: 610501363, + 573261515: 610501377, + 573720508: 610501461, + 573844211: 610501482, + 573850303: 610501489, + 573864650: 610501503, + 573865128: 610501517, + 573990411: 610501524, + 574180032: 610501552, + 574415929: 610501597, + 574529965: 610501604, + 574685634: 610501646, + 574751273: 610501653, + 574823092: 610501660, + 574824922: 610501667, + 574921369: 610501681, + 574989957: 610501709, + 574990702: 610501716, + 575135986: 610501723, + 575232864: 610501751, + 575302108: 610501765, + 575708990: 610501786, + 575766607: 610501814, + 575795843: 610501870, + 575890352: 610501884, + 575939366: 610501933, + 575970700: 610501940, + 576001843: 610501961, + 576095926: 610502003, + 576208495: 610502024, + 576261945: 610502038, + 576273468: 610502045, + 576373003: 610502052, + 576411246: 610502059, + 576757012: 610502080, + 577219368: 610502108, + 577225417: 610502115, + 577313742: 610502122, + 577379202: 610502136, + 577663639: 610502143, + 577665023: 610502150, + 577720111: 610502157, + 577820172: 610502185, + 577859418: 610502192, + 577885923: 610502199, + 578220711: 610502206, + 578260272: 610502220, + 578431761: 610502241, + 578485778: 610502255, + 578553996: 610502269, + 578674360: 610502290, + 578917373: 610502311, + 579966129: 610502353, + 579968437: 610502360, + 580013262: 610502374, + 580043440: 610502381, + 580051759: 610502388, + 580095647: 610502395, + 580095655: 610502402, + 580124131: 610502409, + 580163817: 610502416, + 580253793: 610502423, + 580570243: 610502430, + 580608427: 610502437, + 580631157: 610502444, + 580878455: 610502465, + 580895806: 610502486, + 581026088: 610502500, + 581108813: 610502521, + 581120502: 610502528, + 581150104: 610502542, + 581153070: 610502549, + 581356515: 610502591, + 581393200: 610502605, + 581597734: 610502612, + 581651157: 610502619, + 581676766: 610502626, + 505198966: 610492346, + 598905882: 610505585, + 599125537: 610505637, + 599909878: 610505796, + 601259499: 610505810, + 601300528: 610505873, + 601338233: 610505901, + 601386559: 610505974, + 601423209: 610506002, + 613074493: 612832788, + 601547955: 610506131, + 603576132: 610506941, + 602866800: 610506644, + 603226974: 610506745, + 603452291: 610506850, + 603604371: 610506976, + 603853341: 610507155, + 623339221: 623108204, + 609517556: 610508582, + 610369753: 610508837, + 611638995: 611472608, + 612546472: 612435889, + 614535829: 614036673, + 616785862: 616615496, + 623342906: 623146119, + 623347352: 623259385, + 623594229: 623395786, + 636891528: 636828311, + 627823328: 623890837, + 640198011: 640109275, + 642278925: 642045223, + 639948535: 639791989, + 582622495: 610502654, + 582649269: 610502668, + 582649934: 610502675, + 582838758: 610502689, + 582867147: 610502696, + 582918858: 610502710, + 583130100: 610502745, + 583136567: 610502752, + 583137106: 610502759, + 583149151: 610502773, + 583279803: 610502794, + 583296652: 610502801, + 583301416: 610502808, + 583495670: 610502822, + 583631286: 610502850, + 583708711: 610502857, + 584196534: 610502888, + 584235345: 610502913, + 584477294: 610502934, + 584501013: 610502941, + 584533518: 610502955, + 584544569: 610502962, + 584635095: 610502990, + 584635321: 610502997, + 584778283: 610503014, + 584829667: 610503028, + 584930390: 610503063, + 584944065: 610503070, + 584983136: 610503077, + 584983527: 610503084, + 585035184: 610503098, + 585078375: 610503112, + 585900296: 610503161, + 585953317: 610503206, + 585991944: 610503227, + 586065853: 610503262, + 586241882: 610503279, + 586351981: 610503286, + 586452281: 610503307, + 587059960: 610503331, + 587071892: 610503345, + 588655112: 610503497, + 589098031: 610503525, + 588497080: 610503445, + 588483711: 610503438, + 588656922: 610503511, + 589253444: 610503546, + 590047029: 610503674, + 590168385: 610503695, + 589637407: 610503598, + 590109296: 610503688, + 589423553: 610503577, + 590513448: 610503730, + 590565013: 610503751, + 591300156: 610503858, + 591414748: 610503910, + 591460070: 610503924, + 591392166: 610503882, + 591563201: 610503997, + 591548033: 610503983, + 591430494: 610503917, + 591537010: 610503969, + 591640135: 610504038, + 591823992: 610504052, + 591780793: 610504045, + 500855614: 610491429 +} diff --git a/core/reference_space.py b/core/reference_space.py new file mode 100644 index 0000000000..e56a82e378 --- /dev/null +++ b/core/reference_space.py @@ -0,0 +1,418 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from __future__ import division, print_function, absolute_import +from collections import defaultdict +import operator as op +import functools +import os +import csv + +from scipy.ndimage.interpolation import zoom +import numpy as np +import nrrd +import pandas as pd + +from allensdk.core.structure_tree import StructureTree + + +class ReferenceSpace(object): + + @property + def direct_voxel_map(self): + if not hasattr(self, '_direct_voxel_map'): + self.direct_voxel_counts() + return self._direct_voxel_map + + @direct_voxel_map.setter + def direct_voxel_map(self, data): + self._direct_voxel_map = data + + @property + def total_voxel_map(self): + if not hasattr(self, '_total_voxel_map'): + self.total_voxel_counts() + return self._total_voxel_map + + @total_voxel_map.setter + def total_voxel_map(self, data): + self._total_voxel_map = data + + def __init__(self, structure_tree, annotation, resolution): + '''Handles brain structures in a 3d reference space + + Parameters + ---------- + structure_tree : StructureTree + Defines the heirarchy and properties of the brain structures. + annotation : numpy ndarray + 3d volume whose elements are structure ids. + resolution : length-3 tuple of numeric + Resolution of annotation voxels along each dimension. + + ''' + + self.structure_tree = structure_tree + self.resolution = resolution + + self.annotation = np.ascontiguousarray(annotation) + + def direct_voxel_counts(self): + '''Determines the number of voxels directly assigned to one or more + structures. + + Returns + ------- + dict : + Keys are structure ids, values are the number of voxels directly + assigned to those structures. + + ''' + + uniques = np.unique(self.annotation, return_counts=True) + found = {k: v for k, v in zip(*uniques) if k != 0} + + self._direct_voxel_map = {k: (found[k] if k in found else 0) for k + in self.structure_tree.node_ids()} + + def total_voxel_counts(self): + '''Determines the number of voxels assigned to a structure or its + descendants + + Returns + ------- + dict : + Keys are structure ids, values are the number of voxels assigned + to structures' descendants. + + ''' + + self._total_voxel_map = {} + for stid in self.structure_tree.node_ids(): + + desc_ids = self.structure_tree.descendant_ids([stid])[0] + self._total_voxel_map[stid] = sum([self.direct_voxel_map[dscid] + for dscid in desc_ids]) + + def remove_unassigned(self, update_self=True): + '''Obtains a structure tree consisting only of structures that have + at least one voxel in the annotation. + + Parameters + ---------- + update_self : bool, optional + If True, the contained structure tree will be replaced, + + Returns + ------- + list of dict : + elements are filtered structures + + ''' + + structures = self.structure_tree.filter_nodes( + lambda x: self.total_voxel_map[x['id']] > 0) + + if update_self: + self.structure_tree = StructureTree(structures) + + return structures + + def make_structure_mask(self, structure_ids, direct_only=False): + '''Return an indicator array for one or more structures + + Parameters + ---------- + structure_ids : list of int + Make a mask that indicates the union of these structures' voxels + direct_only : bool, optional + If True, only include voxels directly assigned to a structure in + the mask. Otherwise include voxels assigned to descendants. + + Returns + ------- + numpy ndarray : + Same shape as annotation. 1 inside mask, 0 outside. + + ''' + + if direct_only: + mask = np.zeros(self.annotation.shape, dtype=np.uint8, order='C') + for stid in structure_ids: + + if self.direct_voxel_map[stid] == 0: + continue + + mask[self.annotation == stid] = True + + return mask + + else: + structure_ids = self.structure_tree.descendant_ids(structure_ids) + structure_ids = set(functools.reduce(op.add, structure_ids)) + return self.make_structure_mask(structure_ids, direct_only=True) + + def many_structure_masks(self, structure_ids, output_cb=None, + direct_only=False): + '''Build one or more structure masks and do something with them + + Parameters + ---------- + structure_ids : list of int + Specify structures to be masked + output_cb : function, optional + Must have the following signature: output_cb(structure_id, fn). + On each requested id, fn will be curried to make a mask for that + id. Defaults to returning the structure id and mask. + direct_only : bool, optional + If True, only include voxels directly assigned to a structure in + the mask. Otherwise include voxels assigned to descendants. + + Yields + ------- + Return values of output_cb called on each structure_id, structure_mask + pair. + + Notes + ----- + output_cb is called on every yield, so any side-effects (such as + writing to a file) will be carried out regardless of what you do with + the return values. You do actually have to iterate through the output, + though. + + ''' + + if output_cb is None: + output_cb = ReferenceSpace.return_mask_cb + + for stid in structure_ids: + yield output_cb(stid, functools.partial(self.make_structure_mask, + [stid], direct_only)) + + + def check_coverage(self, structure_ids, domain_mask): + '''Determines whether a spatial domain is completely covered by + structures in a set. + + Parameters + ---------- + structure_ids : list of int + Specifies the set of structures to check. + domain_mask : numpy ndarray + Same shape as annotation. 1 inside the mask, 0 out. Specifies + spatial domain. + + Returns + ------- + numpy ndarray : + 1 where voxels are missing from the candidate, 0 where the + candidate exceeds the domain + + ''' + + candidate_mask = self.make_structure_mask(structure_ids) + return domain_mask - candidate_mask + + def validate_structures(self, structure_ids, domain_mask): + '''Determines whether a set of structures produces an exact and + nonoverlapping tiling of a spatial domain + + Parameters + ---------- + structure_ids : list of int + Specifies the set of structures to check. + domain_mask : numpy ndarray + Same shape as annotation. 1 inside the mask, 0 out. Specifies + spatial domain. + + Returns + ------- + set : + Ids of structures that are the ancestors of other structures in + the supplied set. + numpy ndarray : + Indicator for missing voxels. + + ''' + + return [self.structure_tree.has_overlaps(structure_ids), + self.check_coverage(structure_ids, domain_mask)] + + + def downsample(self, target_resolution): + '''Obtain a smaller reference space by downsampling + + Parameters + ---------- + target_resolution : tuple of numeric + Resolution in microns of the output space. + interpolator : string + Method used to interpolate the volume. Currently only 'nearest' + is supported + + Returns + ------- + ReferenceSpace : + A new ReferenceSpace with the same structure tree and a + downsampled annotation. + + ''' + + factors = [ float(ii / jj) for ii, jj in zip(self.resolution, + target_resolution)] + + target = zoom(self.annotation, factors, order=0) + + return ReferenceSpace(self.structure_tree, target, target_resolution) + + + def get_slice_image(self, axis, position, cmap=None): + '''Produce a AxBx3 RGB image from a slice in the annotation + + Parameters + ---------- + axis : int + Along which to slice the annotation volume. 0 is coronal, 1 is + horizontal, and 2 is sagittal. + position : int + In microns. Take the slice from this far along the specified axis. + cmap : dict, optional + Keys are structure ids, values are rgb triplets. Defaults to + structure rgb_triplets. + + Returns + ------- + np.ndarray : + RGB image array. + + Notes + ----- + If you assign a custom colormap, make sure that you take care of the + background in addition to the structures. + + ''' + + if cmap is None: + cmap = self.structure_tree.get_colormap() + cmap[0] = [0, 0, 0] + + position = int(np.around(position / self.resolution[axis])) + image = np.squeeze(self.annotation.take([position], axis=axis)) + + return np.reshape([cmap[point] for point in image.flat], + list(image.shape) + [3]).astype(np.uint8) + + + def export_itksnap_labels(self, id_type=np.uint16, label_description_kwargs=None): + '''Produces itksnap labels, remapping large ids if needed. + + Parameters + ---------- + id_type : np.integer, optional + Used to determine the type of the output annotation and whether ids need to be remapped to smaller values. + label_description_kwargs : dict, optional + Keyword arguments passed to StructureTree.export_label_description + + Returns + ------- + np.ndarray : + Annotation volume, remapped if needed + pd.DataFrame + label_description dataframe + + ''' + + if label_description_kwargs is None: + label_description_kwargs = {} + + label_description = self.structure_tree.export_label_description(**label_description_kwargs) + + if np.any(label_description['IDX'].values > np.iinfo(id_type).max): + label_description = label_description.sort_values(by='LABEL') + label_description = label_description.reset_index(drop=True) + new_annotation = np.zeros(self.annotation.shape, dtype=id_type) + id_map = {} + + for ii, idx in enumerate(label_description['IDX'].values): + id_map[idx] = ii + 1 + new_annotation[self.annotation == idx] = ii + 1 + + label_description['IDX'] = label_description.apply(lambda row: id_map[row['IDX']], axis=1) + return new_annotation, label_description + + return self.annotation, label_description + + + def write_itksnap_labels(self, annotation_path, label_path, **kwargs): + '''Generate a label file (nrrd) and a label_description file (csv) for use with ITKSnap + + Parameters + ---------- + annotation_path : str + write generated label file here + label_path : str + write generated label_description file here + **kwargs : + will be passed to self.export_itksnap_labels + + ''' + + annotation, labels = self.export_itksnap_labels(**kwargs) + nrrd.write(annotation_path, annotation, header={'spacings': self.resolution}) + labels.to_csv(label_path, sep=' ', index=False, header=False, quoting=csv.QUOTE_NONNUMERIC) + + + @staticmethod + def return_mask_cb(structure_id, fn): + '''A basic callback for many_structure_masks + ''' + + return structure_id, fn() + + + @staticmethod + def check_and_write(base_dir, structure_id, fn): + '''A many_structure_masks callback that writes the mask to a nrrd file + if the file does not already exist. + ''' + + mask_path = os.path.join(base_dir, + 'structure_{0}.nrrd'.format(structure_id)) + + if not os.path.exists(mask_path): + nrrd.write(mask_path, fn()) + + return structure_id + diff --git a/core/reference_space_cache.py b/core/reference_space_cache.py new file mode 100644 index 0000000000..256e02b213 --- /dev/null +++ b/core/reference_space_cache.py @@ -0,0 +1,330 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.config.manifest_builder import ManifestBuilder +from allensdk.api.warehouse_cache.cache import Cache +from allensdk.api.queries.reference_space_api import ReferenceSpaceApi +from allensdk.api.queries.ontologies_api import OntologiesApi +from allensdk.deprecated import deprecated + +from .ontology import Ontology +from .structure_tree import StructureTree +from .reference_space import ReferenceSpace + + +class ReferenceSpaceCache(Cache): + + REFERENCE_SPACE_VERSION_KEY = 'REFERENCE_SPACE_VERSION' + ANNOTATION_KEY = 'ANNOTATION' + TEMPLATE_KEY = 'TEMPLATE' + STRUCTURES_KEY = 'STRUCTURES' + STRUCTURE_TREE_KEY = 'STRUCTURE_TREE' + STRUCTURE_MASK_KEY = 'STRUCTURE_MASK' + STRUCTURE_MESH_KEY = 'STRUCTURE_MESH' + + MANIFEST_VERSION = 1.2 + + def __init__(self, + resolution, + reference_space_key, + **kwargs): + + if not 'version' in kwargs: + kwargs['version'] = self.MANIFEST_VERSION + + if not 'base_uri' in kwargs: + kwargs['base_uri'] = None + + super(ReferenceSpaceCache, self).__init__(**kwargs) + + self.resolution = resolution + self.reference_space_key = reference_space_key + + self.api = ReferenceSpaceApi(base_uri=kwargs['base_uri']) + + + def get_annotation_volume(self, file_name=None): + """ + Read the annotation volume. Download it first if it doesn't exist. + + Parameters + ---------- + + file_name: string + File name to store the annotation volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + """ + + file_name = self.get_cache_path( + file_name, self.ANNOTATION_KEY, self.reference_space_key, self.resolution) + + annotation, info = self.api.download_annotation_volume( + self.reference_space_key, + self.resolution, + file_name, + strategy='lazy') + + return annotation, info + + + def get_template_volume(self, file_name=None): + """ + Read the template volume. Download it first if it doesn't exist. + + Parameters + ---------- + + file_name: string + File name to store the template volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + """ + + file_name = self.get_cache_path( + file_name, self.TEMPLATE_KEY, self.resolution) + + template, info = self.api.download_template_volume(self.resolution, + file_name, + strategy='lazy') + + return template, info + + + def get_structure_tree(self, file_name=None, structure_graph_id=1): + """ + Read the list of adult mouse structures and return an StructureTree + instance. + + Parameters + ---------- + + file_name: string + File name to save/read the structures table. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + structure_graph_id: int + Build a tree using structure only from the identified structure graph. + """ + + file_name = self.get_cache_path(file_name, self.STRUCTURE_TREE_KEY) + + return OntologiesApi(self.api.api_url).get_structures_with_sets( + strategy='lazy', + path=file_name, + pre=StructureTree.clean_structures, + post=lambda x: StructureTree(StructureTree.clean_structures(x)), + structure_graph_ids=structure_graph_id, + **Cache.cache_json()) + + + def get_reference_space(self, structure_file_name=None, + annotation_file_name=None): + """ + Build a ReferenceSpace from this cache's annotation volume and + structure tree. The ReferenceSpace does operations that relate brain + structures to spatial domains. + + Parameters + ---------- + + structure_file_name: string + File name to save/read the structures table. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + + annotation_file_name: string + File name to store the annotation volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + """ + + return ReferenceSpace(self.get_structure_tree(structure_file_name), + self.get_annotation_volume(annotation_file_name)[0], + [self.resolution] * 3) + + def get_structure_mask(self, structure_id, file_name=None, annotation_file_name=None): + """ + Read a 3D numpy array shaped like the annotation volume that has non-zero values where + voxels belong to a particular structure. This will take care of identifying substructures. + + Notes + ----- + This method downloads structure masks from the Allen Institute. To make your own locally, see + ReferenceSpace.many_structure_masks. + + Parameters + ---------- + + structure_id: int + ID of a structure. + + file_name: string + File name to store the structure mask. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + annotation_file_name: string + File name to store the annotation volume. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + """ + structure_id = ReferenceSpaceCache.validate_structure_id(structure_id) + + file_name = self.get_cache_path( + file_name, self.STRUCTURE_MASK_KEY, self.reference_space_key, + self.resolution, structure_id) + + return self.api.download_structure_mask(structure_id, + self.reference_space_key, + self.resolution, + file_name, + strategy='lazy') + + + def get_structure_mesh(self, structure_id, file_name=None): + """Obtain a 3D mesh specifying the surface of an annotated structure. + + Parameters + ----------- + structure_id: int + ID of a structure. + file_name: string + File name to store the structure mesh. If it already exists, + it will be read from this file. If file_name is None, the + file_name will be pulled out of the manifest. Default is None. + + Returns + ------- + vertices : np.ndarray + Dimensions are (nSamples, nCoordinates=3). Locations in the reference space + of vertices + vertex_normals : np.ndarray + Dimensions are (nSample, nElements=3). Vectors normal to vertices. + face_vertices : np.ndarray + Dimensions are (sample, nVertices=3). References are given in indices + (0-indexed here, but 1-indexed in the file) of vertices that make up each face. + face_normals : np.ndarray + Dimensions are (sample, nNormals=3). References are given in indices + (0-indexed here, but 1-indexed in the file) of vertex normals that make up each face. + + Notes + ----- + These meshes are meant for 3D visualization and as such have been smoothed. + If you are interested in performing quantative analyses, we recommend that you + use the structure masks instead. + + """ + structure_id = ReferenceSpaceCache.validate_structure_id(structure_id) + + file_name = self.get_cache_path( + file_name, self.STRUCTURE_MESH_KEY, self.reference_space_key, structure_id) + + return self.api.download_structure_mesh(structure_id, + self.reference_space_key, + file_name, + strategy='lazy') + + + def add_manifest_paths(self, manifest_builder): + """ + Construct a manifest for this Cache class and save it in a file. + + Parameters + ---------- + + file_name: string + File location to save the manifest. + + """ + + manifest_builder = super(ReferenceSpaceCache, self).add_manifest_paths(manifest_builder) + + manifest_builder.add_path(self.STRUCTURE_TREE_KEY, + 'structures.json', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.REFERENCE_SPACE_VERSION_KEY, + '%s', + parent_key='BASEDIR', + typename='dir') + + manifest_builder.add_path(self.ANNOTATION_KEY, + 'annotation_%d.nrrd', + parent_key=self.REFERENCE_SPACE_VERSION_KEY, + typename='file') + + manifest_builder.add_path(self.TEMPLATE_KEY, + 'average_template_%d.nrrd', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.STRUCTURE_MASK_KEY, + 'structure_masks/resolution_%d/structure_%d.nrrd', + parent_key=self.REFERENCE_SPACE_VERSION_KEY, + typename='file') + + manifest_builder.add_path(self.STRUCTURE_MESH_KEY, + 'structure_meshes/structure_%d.obj', + parent_key=self.REFERENCE_SPACE_VERSION_KEY, + typename='file') + + return manifest_builder + + + + + @classmethod + def validate_structure_id(cls, structure_id): + + try: + structure_id = int(structure_id) + except ValueError as e: + raise ValueError("Invalid structure_id (%s): could not convert to integer." % str(structure_id)) + + return structure_id + + + @classmethod + def validate_structure_ids(cls, structure_ids): + + for ii, sid in enumerate(structure_ids): + structure_ids[ii] = cls.validate_structure_id(sid) + + return structure_ids diff --git a/core/simple_tree.py b/core/simple_tree.py new file mode 100644 index 0000000000..a1cd94576d --- /dev/null +++ b/core/simple_tree.py @@ -0,0 +1,398 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import functools +import operator as op +from collections import defaultdict +from six import iteritems + +from allensdk.deprecated import deprecated + + +class SimpleTree( object ): + def __init__(self, nodes, + node_id_cb, + parent_id_cb): + '''A tree structure + + Parameters + ---------- + nodes : list of dict + Each dict is a node in the tree. The keys of the dict name the + properties of the node and should be consistent across nodes. + node_id_cb : function | node dict -> node id + Calling node_id_cb on a node dictionary ought to produce a unique + identifier for that node (we call this the node's id). The type + of the node id is up to you, but ought to be consistent across + nodes and must be hashable. + parent_id_cb : function | node_dict => parent node's id + As node_id_cb, but returns the id of the node's parent. + + Notes + ----- + It is easy to pass a pandas DataFrame as the nodes. Just use the + to_dict method of the dataframe like so: + list_of_dict = your_dataframe.to_dict('record') + your_tree = SimpleTree(list_of_dict, ...) + Converting a list of dictionaries to a pandas DataFrame is also very + easy. The DataFrame constructor does it for you: + your_dataframe = pandas.DataFrame(list_of_dict) + + ''' + + self._nodes = { node_id_cb(n):n for n in nodes } + self._parent_ids = { nid:parent_id_cb(n) for nid,n in iteritems(self._nodes) } + self._child_ids = { nid:[] for nid in self._nodes } + + for nid in self._parent_ids: + pid = self._parent_ids[nid] + if pid is not None: + self._child_ids[pid].append(nid) + + self.node_id_cb = node_id_cb + self.parent_id_cb = parent_id_cb + + + def filter_nodes(self, criterion): + '''Obtain a list of nodes filtered by some criterion + + Parameters + ---------- + criterion : function | node dict => bool + Only nodes for which criterion returns true will be returned. + + Returns + ------- + list of dict : + Items are node dictionaries that passed the filter. + + ''' + + return list(filter(criterion, self._nodes.values())) + + + def value_map(self, from_fn, to_fn): + '''Obtain a look-up table relating a pair of node properties across + nodes + + Parameters + ---------- + from_fn : function | node dict => hashable value + The keys of the output dictionary will be obtained by calling + from_fn on each node. Should be unique. + to_fn : function | node_dict => value + The values of the output function will be obtained by calling + to_fn on each node. + + Returns + ------- + dict : + Maps the node property defined by from_fn to the node property + defined by to_fn across nodes. + + ''' + + vm = {} + for node in self._nodes.values(): + key = from_fn(node) + value = to_fn(node) + + if key in vm: + raise RuntimeError('from_fn is not unique across nodes. ' + 'Collision between {0} and {1}.'.format(value, vm[key])) + vm[key] = value + + return vm + + + def nodes_by_property(self, key, values, to_fn=None): + '''Get nodes by a specified property + + Parameters + ---------- + key : hashable or function + The property used for lookup. Should be unique. If a function, will + be invoked on each node. + values : list + Select matching elements from the lookup. + to_fn : function, optional + Defines the outputs, on a per-node basis. Defaults to returning + the whole node. + + Returns + ------- + list : + outputs, 1 for each input value. + + ''' + + if to_fn is None: + to_fn = lambda x: x + + if not callable( key ): + from_fn = lambda x: x[key] + else: + from_fn = key + + value_map = self.value_map( from_fn, to_fn ) + return [ value_map[vv] for vv in values ] + + + def node_ids(self): + '''Obtain the node ids of each node in the tree + + Returns + ------- + list : + elements are node ids + + ''' + + return list(self._nodes) + + + @deprecated("Use SimpleTree.parent_ids instead.") + def parent_id(self, node_ids): + return self.parent_ids(node_ids) + + + def parent_ids(self, node_ids): + '''Obtain the ids of one or more nodes' parents + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose parents you wish to find. + + Returns + ------- + list of hashable : + Items are ids of input nodes' parents in order. + + ''' + + return [ self._parent_ids[nid] for nid in node_ids ] + + + def child_ids(self, node_ids): + '''Obtain the ids of one or more nodes' children + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose children you wish to find. + + Returns + ------- + list of list of hashable : + Items are lists of input nodes' children's ids. + + ''' + + return [ self._child_ids[nid] for nid in node_ids ] + + + def ancestor_ids(self, node_ids): + '''Obtain the ids of one or more nodes' ancestors + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose ancestors you wish to find. + + Returns + ------- + list of list of hashable : + Items are lists of input nodes' ancestors' ids. + + Notes + ----- + Given the tree: + A -> B -> C + `-> D + + The ancestors of C are [C, B, A]. The ancestors of A are [A]. The + ancestors of D are [D, A] + + ''' + + out = [] + for nid in node_ids: + + current = [nid] + while current[-1] is not None: + current.extend(self.parent_ids([current[-1]])) + out.append(current[:-1]) + + return out + + + def descendant_ids(self, node_ids): + '''Obtain the ids of one or more nodes' descendants + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose descendants you wish to find. + + Returns + ------- + list of list of hashable : + Items are lists of input nodes' descendants' ids. + + Notes + ----- + Given the tree: + A -> B -> C + `-> D + + The descendants of A are [B, C, D]. The descendants of C are []. + + ''' + + out = [] + for ii, nid in enumerate(node_ids): + + current = [nid] + children = self.child_ids([nid])[0] + + if children: + current.extend(functools.reduce(op.add, map(list, + self.descendant_ids(children)))) + + out.append(current) + return out + + + @deprecated("Use SimpleTree.nodes instead") + def node(self, node_ids=None): + return self.nodes(node_ids) + + + def nodes(self, node_ids=None): + '''Get one or more nodes' full dictionaries from their ids. + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes to be returned. Default is all. + + Returns + ------- + list of dict : + Items are nodes corresponding to argued ids. + ''' + + if node_ids is None: + node_ids = self.node_ids() + + return [ self._nodes[nid] if nid in self._nodes else None for nid in node_ids] + + + @deprecated("Use SimpleTree.parents instead") + def parent(self, node_ids): + return self.parents(node_ids) + + + def parents(self, node_ids): + '''Get one or mode nodes' parent nodes + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose parents will be found. + + Returns + ------- + list of dict : + Items are parents of nodes corresponding to argued ids. + + ''' + + return self.nodes([self._parent_ids[nid] for nid in node_ids]) + + + def children(self, node_ids): + '''Get one or mode nodes' child nodes + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose children will be found. + + Returns + ------- + list of list of dict : + Items are lists of child nodes corresponding to argued ids. + + ''' + + return list(map(self.nodes, self.child_ids(node_ids))) + + + def descendants(self, node_ids): + '''Get one or mode nodes' descendant nodes + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose descendants will be found. + + Returns + ------- + list of list of dict : + Items are lists of descendant nodes corresponding to argued ids. + + ''' + + return list(map(self.nodes, self.descendant_ids(node_ids))) + + + def ancestors(self, node_ids): + '''Get one or mode nodes' ancestor nodes + + Parameters + ---------- + node_ids : list of hashable + Items are ids of nodes whose ancestors will be found. + + Returns + ------- + list of list of dict : + Items are lists of ancestor nodes corresponding to argued ids. + + ''' + + return list(map(self.nodes, self.ancestor_ids(node_ids))) diff --git a/core/sitk_utilities.py b/core/sitk_utilities.py new file mode 100644 index 0000000000..7b6df1e094 --- /dev/null +++ b/core/sitk_utilities.py @@ -0,0 +1,175 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2018. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import warnings + +import SimpleITK as sitk +import numpy as np + + +def get_sitk_image_information(image): + ''' Extract information about a SimpleITK image + + Parameters + ---------- + image : sitk.Image + Extract information about this image. + + Returns + ------- + dict : + Extracted information. Includes spacing, origin, size, direction, and + number of components per pixel + + ''' + + return {'spacing': image.GetSpacing(), + 'origin': image.GetOrigin(), + 'size': image.GetSize(), + 'direction': image.GetDirection(), + 'ncomponents': image.GetNumberOfComponentsPerPixel()} + + +def set_sitk_image_information(image, information): + ''' Set information on a SimpleITK image + + Parameters + ---------- + image : sitk.Image + Set information on this image. + information : dict + Stores information to be set. Supports spacing, origin, direction. Also + checks (but cannot set) size and number of components per pixel + + ''' + + if 'spacing' in information: + image.SetSpacing(information.pop('spacing')) + if 'origin' in information: + image.SetOrigin(information.pop('origin')) + if 'direction' in information: + image.SetDirection(information.pop('direction')) + + if 'size' in information: + assert(np.array_equal( information.pop('size'), image.GetSize() )) + if 'ncomponents' in information: + assert( information.pop('ncomponents') == image.GetNumberOfComponentsPerPixel() ) + + if not len(information) == 0: + warnings.warn('unwritten keys: {}'.format(','.join(information.keys()))) + + +def fix_array_dimensions(array, ncomponents=1): + ''' Convenience function that reorders ndarray dimensions for io with SimpleITK + + Parameters + ---------- + array : np.ndarray + The array to be reordered + ncomponents : int, optional + Number of components per pixel, default 1. + + Returns + ------- + np.ndarray : + Reordered array + + ''' + + act_size = list(array.shape) + ndims = len(act_size) + multicomponent = ncomponents > 1 + + from_order = list(range( ndims - multicomponent )) + to_order = list(range( ndims - multicomponent ))[::-1] + + if multicomponent: + from_order += [-1] + to_order += [-1] + + return np.ascontiguousarray(np.moveaxis(array, from_order, to_order)) + + +def read_ndarray_with_sitk(path): + ''' Read a numpy array from a file using SimpleITK + + Parameters + ---------- + path : str + Read from this path + + Returns + ------- + image : np.ndarray + Obtained array + information : dict + Additional information about the array + + ''' + + image = sitk.ReadImage(str(path)) + information = get_sitk_image_information(image) + image = sitk.GetArrayFromImage(image) + + image = fix_array_dimensions(image, information['ncomponents']) + return image, information + + +def write_ndarray_with_sitk(array, path, **information): + ''' Write a numpy array to a file using SimpleITK + + Parameters + ---------- + array : np.ndarray + Array to be written. + path : str + Write to here + **information : dict + Contains additional information to be stored in the image file. + See set_sitk_image_information for more information. + + ''' + + if not 'ncomponents' in information: + information['ncomponents'] = 1 + ncomponents = information.pop('ncomponents') + + array = fix_array_dimensions(array, ncomponents) + + array = sitk.GetImageFromArray(array, ncomponents > 1) + set_sitk_image_information(array, information) + + sitk.WriteImage(array, str(path)) diff --git a/core/structure_tree.py b/core/structure_tree.py new file mode 100644 index 0000000000..789a0c7c3d --- /dev/null +++ b/core/structure_tree.py @@ -0,0 +1,458 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from __future__ import division, print_function, absolute_import +import re +import operator as op +from six import iteritems, string_types +import functools + +import numpy as np +import pandas as pd + +from .simple_tree import SimpleTree + + +class StructureTree( SimpleTree ): + + def __init__(self, nodes): + '''A tree whose nodes are brain structures and whose edges indicate + physical containment. + + Parameters + ---------- + nodes : list of dict + Each specifies a structure. Fields are: + + 'acronym' : str + Abbreviated name for the structure. + 'rgb_triplet' : str + Canonical RGB uint8 color assigned to this structure + 'graph_id' : int + Specifies the structure graph containing this structure. + 'graph_order' : int + Canonical position in the flattened structure graph. + 'id': int + Unique structure specifier. + 'name' : str + Full name of structure. + 'structure_id_path' : list of int + This structure's ancestors (inclusive) from the root of the + tree. + 'structure_set_ids' : list of int + Unique identifiers of structure sets to which this structure + belongs. + + ''' + + super(StructureTree, self).__init__(nodes, + lambda s: int(s['id']), + lambda s: s['structure_id_path'][-2] \ + if len(s['structure_id_path']) > 1 \ + and s['structure_id_path'] is not None \ + and np.isfinite(s['structure_id_path'][-2]) \ + else None) + + + def get_structures_by_id(self, structure_ids): + '''Obtain a list of brain structures from their structure ids + + Parameters + ---------- + structure_ids : list of int + Get structures corresponding to these ids. + + Returns + ------- + list of dict : + Each item describes a structure. + + ''' + + return self.nodes(structure_ids) + + + def get_structures_by_name(self, names): + '''Obtain a list of brain structures from their names, + + Parameters + ---------- + names : list of str + Get structures corresponding to these names. + + Returns + ------- + list of dict : + Each item describes a structure. + + ''' + + return self.nodes_by_property('name', names) + + + def get_structures_by_acronym(self, acronyms): + '''Obtain a list of brain structures from their acronyms + + Parameters + ---------- + names : list of str + Get structures corresponding to these acronyms. + + Returns + ------- + list of dict : + Each item describes a structure. + + ''' + + return self.nodes_by_property('acronym', acronyms) + + + def get_structures_by_set_id(self, structure_set_ids): + '''Obtain a list of brain structures from by the sets that contain + them. + + Parameters + ---------- + structure_set_ids : list of int + Get structures belonging to these structure sets. + + Returns + ------- + list of dict : + Each item describes a structure. + + ''' + + overlap = lambda x: (set(structure_set_ids) & set(x['structure_set_ids'])) + return self.filter_nodes(overlap) + + + def get_colormap(self): + '''Get a dictionary mapping structure ids to colors across all nodes. + + Returns + ------- + dict : + Keys are structure ids. Values are RGB lists of integers. + + ''' + + return self.value_map(lambda x: x['id'], + lambda y: y['rgb_triplet']) + + + + def get_name_map(self): + '''Get a dictionary mapping structure ids to names across all nodes. + + Returns + ------- + dict : + Keys are structure ids. Values are structure name strings. + + ''' + + return self.value_map(lambda x: x['id'], + lambda y: y['name']) + + + def get_id_acronym_map(self): + '''Get a dictionary mapping structure acronyms to ids across all nodes. + + Returns + ------- + dict : + Keys are structure acronyms. Values are structure ids. + + ''' + + return self.value_map(lambda x: x['acronym'], + lambda y: y['id']) + + + def get_ancestor_id_map(self): + '''Get a dictionary mapping structure ids to ancestor ids across all + nodes. + + Returns + ------- + dict : + Keys are structure ids. Values are lists of ancestor ids. + + ''' + + return self.value_map(lambda x: x['id'], + lambda y: self.ancestor_ids([y['id']])[0]) + + + def structure_descends_from(self, child_id, parent_id): + '''Tests whether one structure descends from another. + + Parameters + ---------- + child_id : int + Id of the putative child structure. + parent_id : int + Id of the putative parent structure. + + Returns + ------- + bool : + True if the structure specified by child_id is a descendant of + the one specified by parent_id. Otherwise False. + + ''' + + return parent_id in self.ancestor_ids([child_id])[0] + + + def get_structure_sets(self): + '''Lists all unique structure sets that are assigned to at least one + structure in the tree. + + Returns + ------- + list of int : + Elements are ids of structure sets. + + ''' + + return set(functools.reduce(op.add, map(lambda x: x['structure_set_ids'], + self.nodes()))) + + + def has_overlaps(self, structure_ids): + '''Determine if a list of structures contains structures along with + their ancestors + + Parameters + ---------- + structure_ids : list of int + Check this set of structures for overlaps + + Returns + ------- + set : + Ids of structures that are the ancestors of other structures in + the supplied set. + + ''' + + ancestor_ids = functools.reduce(op.add, + map(lambda x: x[1:], + self.ancestor_ids(structure_ids))) + return (set(ancestor_ids) & set(structure_ids)) + + + def export_label_description(self, alphas=None, exclude_label_vis=None, exclude_mesh_vis=None, label_key='acronym'): + '''Produces an itksnap label_description table from this structure tree + + Parameters + ---------- + alphas : dict, optional + Maps structure ids to alpha levels. Optional - will only use provided ids. + exclude_label_vis : list, optional + The structures denoted by these ids will not be visible in ITKSnap. + exclude_mesh_vis : list, optional + The structures denoted by these ids will not have visible meshes in ITKSnap. + label_key: str, optional + Use this column for display labels. + + Returns + ------- + pd.DataFrame : + Contains data needed for loading as an ITKSnap label description file. + + ''' + + if alphas is None: + alphas = {} + if exclude_label_vis is None: + exclude_label_vis = set([]) + if exclude_mesh_vis is None: + exclude_mesh_vis = set([]) + + df = pd.DataFrame([ + { + 'IDX': node['id'], + '-R-': node['rgb_triplet'][0], + '-G-': node['rgb_triplet'][1], + '-B-': node['rgb_triplet'][2], + '-A-': alphas.get(node['id'], 1.0), + 'VIS': 1 if node['id'] not in exclude_label_vis else 0, + 'MSH': 1 if node['id'] not in exclude_mesh_vis else 0, + 'LABEL': node[label_key] + } + for node in self.nodes() + ]).loc[:, ('IDX', '-R-', '-G-', '-B-', '-A-', 'VIS', 'MSH', 'LABEL')] + + return df + + + @staticmethod + def clean_structures(structures, whitelist=None, data_transforms=None, renames=None): + '''Convert structures_with_sets query results into a form that can be + used to construct a StructureTree + + Parameters + ---------- + structures : list of dict + Each element describes a structure. Should have a structure id path + field (str values) and a structure_sets field (list of dict). + whitelist : list of str, optional + Only these fields will be included in the final structure record. Default is + the output of StructureTree.whitelist. + data_transforms : dict, optional + Keys are str field names. Values are functions which will be applied to the + data associated with those fields. Default is to map colors from hex to rgb and + convert the structure id path to a list of int. + renames : dict, optional + Controls the field names that appear in the output structure records. Default is + to map 'color_hex_triplet' to 'rgb_triplet'. + + Returns + ------- + list of dict : + structures, after conversion of structure_id_path and structure_sets + + ''' + + if whitelist is None: + whitelist = StructureTree.whitelist() + + if data_transforms is None: + data_transforms = StructureTree.data_transforms() + + if renames is None: + renames = StructureTree.renames() + whitelist.extend(renames.values()) + + for ii, st in enumerate(structures): + + StructureTree.collect_sets(st) + record = {} + + for name in whitelist: + + if name not in st: + continue + data = st[name] + + if name in data_transforms: + data = data_transforms[name](data) + + if name in renames: + name = renames[name] + + record[name] = data + + structures[ii] = record + + return structures + + @staticmethod + def data_transforms(): + return {'color_hex_triplet': StructureTree.hex_to_rgb, + 'structure_id_path': StructureTree.path_to_list} + + + @staticmethod + def renames(): + return {'color_hex_triplet': 'rgb_triplet'} + + @staticmethod + def whitelist(): + return ['acronym', 'color_hex_triplet', 'graph_id', 'graph_order', 'id', + 'name', 'structure_id_path', 'structure_set_ids'] + + + @staticmethod + def hex_to_rgb(hex_color): + '''Convert a hexadecimal color string to a uint8 triplet + + Parameters + ---------- + hex_color : string + Must be 6 characters long, unless it is 7 long and the first + character is #. If hex_color is a triplet of int, it will be + returned unchanged. + + Returns + ------- + list of int : + 3 characters long - 1 per two characters in the input string. + + ''' + + if not isinstance(hex_color, string_types): + return list(hex_color) + + if hex_color[0] == '#': + hex_color = hex_color[1:] + + return [int(hex_color[a * 2: a*2 + 2], 16) for a in range(3)] + + + @staticmethod + def path_to_list(path): + '''Structure id paths are sometimes formatted as "/"-seperated strings. + This method converts them to a list of integers, if needed. + ''' + + if not isinstance(path, string_types): + return list(path) + + return [int(stid) for stid in path.split('/') if stid != ''] + + + @staticmethod + def collect_sets(structure): + '''Structure sets may be specified by full records or id. This method + collects all of the structure set records/ids in a structure record and + replaces them with a single list of id records. + ''' + + if not 'structure_sets' in structure: + structure['structure_sets'] = [] + if not 'structure_set_ids' in structure: + structure['structure_set_ids'] = [] + + structure['structure_set_ids'].extend([sts['id'] for sts + in structure['structure_sets']]) + structure['structure_set_ids'] = list(set(structure['structure_set_ids'])) + + del structure['structure_sets'] + diff --git a/core/swc.py b/core/swc.py new file mode 100644 index 0000000000..5c572c3451 --- /dev/null +++ b/core/swc.py @@ -0,0 +1,1031 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import csv +import copy +import math +import six + +# Morphology nodes have the following fields. SWC fields are numeric. +NODE_ID = 'id' +NODE_TYPE = 'type' +NODE_X = 'x' +NODE_Y = 'y' +NODE_Z = 'z' +NODE_R = 'radius' +NODE_PN = 'parent' +SWC_COLUMNS = [NODE_ID, NODE_TYPE, NODE_X, NODE_Y, NODE_Z, NODE_R, NODE_PN] + +NODE_TREE_ID = 'tree_id' +NODE_CHILDREN = 'children' + +# shorthand for dictionary entries, to shorten sometimes long code lines +_N = NODE_ID +_TYP = NODE_TYPE +_X = NODE_X +_Y = NODE_Y +_Z = NODE_Z +_R = NODE_R +_P = NODE_PN +_C = NODE_CHILDREN +_TID = NODE_TREE_ID + + +######################################################################## +def read_swc(file_name, columns="NOT_USED", numeric_columns="NOT_USED"): + """ + Read in an SWC file and return a Morphology object. + + Parameters + ---------- + file_name: string + SWC file name. + + Returns + ------- + Morphology + A Morphology instance. + """ + compartments = [] + line_num = 1 + try: + with open(file_name, "r") as f: + for line in f: + # remove comments + if line.lstrip().startswith('#'): + continue + # read values. expected SWC format is: + # ID, type, x, y, z, rad, parent + # x, y, z and rad are floats. the others are ints + toks = line.split(' ') + vals = Compartment({ + NODE_ID: int(toks[0]), + NODE_TYPE: int(toks[1]), + NODE_X: float(toks[2]), + NODE_Y: float(toks[3]), + NODE_Z: float(toks[4]), + NODE_R: float(toks[5]), + NODE_PN: int(toks[6].rstrip()) + }) + # store this compartment + compartments.append(vals) + # increment line number (used for error reporting only) + line_num += 1 + except ValueError: + err = "File not recognized as valid SWC file.\n" + err += "Problem parsing line %d\n" % line_num + if line is not None: + err += "Content: '%s'\n" % line + raise IOError(err) + + return Morphology(compartment_list=compartments) + + +######################################################################## +######################################################################## +class Compartment(dict): + """ + A dictionary class storing information about a single morphology node + """ + + def __init__(self, *args, **kwargs): + super(Compartment, self).__init__(*args, **kwargs) + if (NODE_ID not in self or + NODE_TYPE not in self or + NODE_X not in self or + NODE_Y not in self or + NODE_Z not in self or + NODE_R not in self or + NODE_PN not in self): + raise ValueError( + "Compartment was not initialized with requisite fields") + # Each unconnected graph has its own ID. This is the ID + # of graph that the node resides in + self[NODE_TREE_ID] = -1 + + # IDs of child nodes + self[NODE_CHILDREN] = [] + + def print_node(self): + """ print out compartment information with field names """ + print("%d %d %.4f %.4f %.4f %.4f %d %s %d" % (self[_N], self[_TYP], self[ + _X], self[_Y], self[_Z], self[_R], self[_P], str(self[_C]), self[_TID])) + + +class Morphology(object): + """ + Keep track of the list of compartments in a morphology and provide + a few helper methods (soma, tree information, pruning, etc). + """ + + SOMA = 1 + AXON = 2 + DENDRITE = 3 + BASAL_DENDRITE = 3 + APICAL_DENDRITE = 4 + + NODE_TYPES = [SOMA, AXON, DENDRITE, BASAL_DENDRITE, APICAL_DENDRITE] + + def __init__(self, compartment_list=None, compartment_index=None): + """ + Try to initialize from a list of compartments first, then from + a dictionary indexed by compartment id if that fails, and finally just + leave everything empty. + + Parameters + ---------- + compartment_list: list + list of compartment dictionaries + + compartment_index: dict + dictionary of compartments indexed by id + """ + self._compartment_list = [] + self._compartment_index = {} + + ############################################## + # define tree list here for clarity, even though it's reset below + # when nodes are assigned + self._tree_list = [] + + ############################################## + # construct the compartment list and index + # first try to do so using the compartment list, then try using + # the compartment index and if that fails then complain + if compartment_list: + self.compartment_list = compartment_list + elif compartment_index: + self.compartment_index = compartment_index + ############################################## + # verify morphology is consistent with morphology rules (e.g., + # no dendrite branching from an axon) + num_errors = self._check_consistency() + if num_errors > 0: + raise ValueError("Morphology appears to be inconsistent") + ############################################## + # root node (this must be part of the soma) + self._soma = None + for i in range(len(self.compartment_list)): + seg = self.compartment_list[i] + if seg[NODE_TYPE] == Morphology.SOMA and seg[NODE_PN] < 0: + if self._soma is not None: + raise ValueError("Multiple somas detected in SWC file") + self._soma = seg + + #################################################################### + #################################################################### + # class properties, and helper functions for them + + @property + def compartment_list(self): + """ Return the compartment list. This is a property to ensure that the + compartment list and compartment index are in sync. """ + return self._compartment_list + + @compartment_list.setter + def compartment_list(self, compartment_list): + """ Update the compartment list. Update the compartment index. """ + self._set_compartments(compartment_list) + + @property + def compartment_index(self): + """ Return the compartment index. This is a property to ensure that the + compartment list and compartment index are in sync. """ + return self._compartment_index + + @compartment_index.setter + def compartment_index(self, compartment_index): + """ Update the compartment index. Update the compartment list. """ + self._set_compartments(compartment_index.values()) + + @property + def num_trees(self): + """ Return the number of trees in the morphology. A tree is + defined as everything following from a single root compartment. """ + return len(self._tree_list) + + # TODO add filter for number of nodes of a particular type + @property + def num_nodes(self): + """ Return the number of compartments in the morphology. """ + return len(self.compartment_list) + + # internal function + def _set_compartments(self, compartment_list): + """ + take a list of SWC-like objects and turn those into morphology + nodes need to be able to initialize from a list supplied by an SWC + file while also being able to initialize from the compartment list + of an existing Morphology object. As nodes in a morphology object + contain reference to nodes in that object, make a shallow copy + of input nodes and overwrite known references (ie, the + 'children' array) + """ + self._compartment_list = [] + for obj in compartment_list: + seg = copy.copy(obj) + seg[NODE_TREE_ID] = -1 + seg[NODE_CHILDREN] = [] + self._compartment_list.append(seg) + # list data now set. remove holes in sequence and re-index + self._reconstruct() + + @property + def soma(self): + """ Returns root node of soma, if present""" + return self._soma + + @property + def root(self): + """ [deprecated] Returns root node of soma, if present. Use 'soma' instead of 'root'""" + return self._soma + + #################################################################### + #################################################################### + # tree and node access + + def tree(self, n): + """ + Returns a list of all Morphology Nodes within the specified + tree. A tree is defined as a fully connected graph of nodes. + Each tree has exactly one root. + + Parameters + ---------- + n: integer + ID of desired tree + + Returns + ------- + A list of all morphology objects in the specified tree, or None + if the tree doesn't exist + """ + if n < 0 or n >= len(self._tree_list): + return None + return self._tree_list[n] + + def node(self, n): + """ + Returns the morphology node having the specified ID. + + Parameters + ---------- + n: integer + ID of desired node + + Returns + ------- + A morphology object having the specified ID, or None if such a + node doesn't exist + """ + # undocumented feature -- if a node is supplied instead of a + # node ID, the node is returned and no error is triggered + return self._resolve_node_type(n) + + def parent_of(self, seg): + """ Returns parent of the specified node. + + Parameters + ---------- + seg: integer or Morphology Object + The ID of the child node, or the child node itself + + Returns + ------- + A morphology object, or None if no parent exists or if the + specified node ID doesn't exist + """ + # if ID passed in, make sure it's converted to a compartment + # don't trap for exception here -- if supplied segment is + # incorrect, make sure the user knows about it + seg = self._resolve_node_type(seg) + # return parent of specified node + if seg is not None and seg[NODE_PN] >= 0: + return self._compartment_list[seg[NODE_PN]] + return None + + def children_of(self, seg): + """ Returns a list of the children of the specified node + + Parameters + ---------- + seg: integer or Morphology Object + The ID of the parent node, or the parent node itself + + Returns + ------- + A list of the child morphology objects. If the ID of the parent + node is invalid, None is returned. + """ + seg = self._resolve_node_type(seg) + return [self._compartment_list[c] for c in seg[NODE_CHILDREN]] + + ################################################################### + ################################################################### + # Information querying and data manipulation + + # internal function. takes an integer and returns the node having + # that ID. IF a node is passed in instead, it is returned + def _resolve_node_type(self, seg): + # if compartment passed then we don't need to convert anything + # if compartment not passed, try converting value to int + # and using that as an index + if not isinstance(seg, Compartment): + try: + seg = int(seg) + if seg < 0 or seg >= len(self._compartment_list): + return None + seg = self._compartment_list[seg] + except ValueError: + raise TypeError( + "Object not recognized as morphology node or index") + return seg + + def change_parent(self, child, parent): + """ Change the parent of a node. The child node is adjusted to + point to the new parent, the child is taken off of the previous + parent's child list, and it is added to the new parent's child list. + + Parameters + ---------- + child: integer or Morphology Object + The ID of the child node, or the child node itself + + parent: integer or Morphology Object + The ID of the parent node, or the parent node itself + + Returns + ------- + Nothing + """ + child_seg = self._resolve_node_type(child) + parent_seg = self._resolve_node_type(parent) + # if child has former parent, remove it from parent's child list + if child_seg[NODE_PN] >= 0: + old_par = self.node(child_seg[NODE_PN]) + old_par[NODE_CHILDREN].remove(child_seg[NODE_ID]) + parent_seg[NODE_CHILDREN].append(child_seg[NODE_ID]) + child_seg[NODE_PN] = parent_seg[NODE_ID] + + # returns a list of nodes located within dist of x,y,z + def find(self, x, y, z, dist, node_type=None): + """ Returns a list of Morphology Objects located within 'dist' + of coordinate (x,y,z). If node_type is specified, the search + will be constrained to return only nodes of that type. + + Parameters + ---------- + x, y, z: float + The x,y,z coordinates from which to search around + + dist: float + The search radius + + node_type: enum (optional) + One of the following constants: SOMA, AXON, DENDRITE, + BASAL_DENDRITE or APICAL_DENDRITE + + Returns + ------- + A list of all Morphology Objects matching the search criteria + """ + found = [] + for seg in self.compartment_list: + dx = seg[NODE_X] - x + dy = seg[NODE_Y] - y + dz = seg[NODE_Z] - z + if math.sqrt(dx * dx + dy * dy + dz * dz) <= dist: + if node_type is None or seg[NODE_TYPE] == node_type: + found.append(seg) + return found + + def compartment_list_by_type(self, compartment_type): + """ Return an list of all compartments having the specified + compartment type. + + Parameters + ---------- + compartment_type: int + Desired compartment type + + Returns + ------- + A list of of Morphology Objects + """ + return [x for x in self._compartment_list if x[NODE_TYPE] == compartment_type] + + def compartment_index_by_type(self, compartment_type): + """ Return an dictionary of compartments indexed by id that all have + a particular compartment type. + + Parameters + ---------- + compartment_type: int + Desired compartment type + + Returns + ------- + A dictionary of Morphology Objects, indexed by ID + """ + return {c[NODE_ID]: c for c in self._compartment_list if c[NODE_TYPE] == compartment_type} + + def save(self, file_name): + """ Write this morphology out to an SWC file + + Parameters + ---------- + file_name: string + desired name of your SWC file + """ + f = open(file_name, "w") + f.write("#n,type,x,y,z,radius,parent\n") + for seg in self.compartment_list: + f.write("%d %d " % (seg[NODE_ID], seg[NODE_TYPE])) + f.write("%0.4f " % seg[NODE_X]) + f.write("%0.4f " % seg[NODE_Y]) + f.write("%0.4f " % seg[NODE_Z]) + f.write("%0.4f " % seg[NODE_R]) + f.write("%d\n" % seg[NODE_PN]) + f.close() + + # keep for backward compatibility, but don't publish in docs + def write(self, file_name): + self.save(file_name) + + def sparsify(self, modulo, compress_ids=False): + """ Return a new Morphology object that has a given number of non-leaf, + non-root nodes removed. IDs can be reassigned so as to be continuous. + + Parameters + ---------- + modulo: int + keep 1 out of every modulo nodes. + + compress_ids: boolean + Reassign ids so that ids are continuous (no missing id numbers). + + Returns + ------- + Morphology + A new morphology instance + """ + compartments = self.compartment_index + root = self.root + keep = {} + # figure out which compartments to toss + ct = 0 + for i, c in six.iteritems(compartments): + pid = c[NODE_PN] + cid = c[NODE_ID] + ctype = c[NODE_TYPE] + # keep the root, soma, junctions, and the first child of the root + # (for visualization) + if pid < 0 or len(c[NODE_CHILDREN]) != 1 or pid == root[NODE_ID] or ctype == Morphology.SOMA: + keep[cid] = True + else: + keep[cid] = (ct % modulo) == 0 + ct += 1 + + # hook children up to their new parents + for i, c in six.iteritems(compartments): + comp_id = c[NODE_ID] + if keep[comp_id] is False: + parent_id = c[NODE_PN] + while keep[parent_id] is False: + parent_id = compartments[parent_id][NODE_PN] + for child_id in c[NODE_CHILDREN]: + compartments[child_id][NODE_PN] = parent_id + + # filter out the orphans + sparsified_compartments = {k: v for k, + v in six.iteritems(compartments) if keep[k]} + if compress_ids: + ids = sorted(sparsified_compartments.keys(), key=lambda x: int(x)) + id_hash = {fid: str(i + 1) for i, fid in enumerate(ids)} + id_hash[-1] = -1 + # build the final compartment index + out_compartments = {} + for cid, compartment in six.iteritems(sparsified_compartments): + compartment[NODE_ID] = id_hash[cid] + compartment[NODE_PN] = id_hash[compartment[NODE_PN]] + out_compartments[compartment[NODE_ID]] = compartment + return Morphology(compartment_index=out_compartments) + else: + return Morphology(compartment_index=sparsified_compartments) + + #################################################################### + #################################################################### + def _reconstruct(self): + """ + internal function that restructures data and establishes + appropriate internal linking. data is re-order, removing 'holes' + in sequence so that each object ID corresponds to its position + in compartment list. trees are (re)calculated + parent-child indices are recalculated as is compartment table + construct a map between new and old IDs + """ + remap = {} + # everything defaults to root. this way if a parent was deleted + # the child will become a new root + for i in range(len(self.compartment_list)): + remap[i] = -1 + # map old old node numbers to new ones. reset n to the new ID + # and put node in new list + new_id = 0 + tmp_list = [] + for seg in self.compartment_list: + if seg is not None: + remap[seg[NODE_ID]] = new_id + seg[NODE_ID] = new_id + tmp_list.append(seg) + new_id += 1 + # use map to reset parent values. copy objs to new list + for seg in tmp_list: + if seg[NODE_PN] >= 0: + seg[NODE_PN] = remap[seg[NODE_PN]] + # replace compartment list with newly created node list + self._compartment_list = tmp_list + # reconstruct parent/child relationship links + # forget old relations + for seg in self.compartment_list: + seg[NODE_CHILDREN] = [] + # add each object to its parents child list + for seg in self.compartment_list: + par_num = seg[NODE_PN] + if par_num >= 0: + self.compartment_list[par_num][ + NODE_CHILDREN].append(seg[NODE_ID]) + # update tree lists + self._separate_trees() + ############################ + # Rebuild internal index and links between parents and children + self._compartment_index = { + c[NODE_ID]: c for c in self.compartment_list} + # compartment list is complete and sequential so don't need index + # to resolve relationships + # for each node, reset children array + # for each node, add self to parent's child list + for seg in self._compartment_list: + seg[NODE_CHILDREN] = [] + for seg in self._compartment_list: + if seg[NODE_PN] >= 0: + self._compartment_list[seg[NODE_PN]][ + NODE_CHILDREN].append(seg[NODE_ID]) + # verify that each node ID is the same as its position in the + # compartment list + for i in range(len(self.compartment_list)): + if i != self.node(i)[NODE_ID]: + raise RuntimeError( + "Internal error detected -- compartment list not properly formed") + + def append(self, node_list): + """ Add additional nodes to this Morphology. Those nodes must + originate from another morphology object. + + Parameters + ---------- + node_list: list of Morphology nodes + """ + # construct a map between new and old IDs of added nodes + remap = {} + for i in range(len(node_list)): + remap[i] = -1 + # map old old node numbers to new ones. reset n to the new ID + # append new nodes to existing node list + old_count = len(self.compartment_list) + new_id = old_count + for seg in node_list: + if seg is not None: + remap[seg[NODE_ID]] = new_id + seg[NODE_ID] = new_id + self._compartment_list.append(seg) + new_id += 1 + # use map to reset parent values. copy objs to new list + for i in range(old_count, len(self.compartment_list)): + seg = self.compartment_list[i] + if seg[NODE_PN] >= 0: + seg[NODE_PN] = remap[seg[NODE_PN]] + self._reconstruct() + + def stumpify_axon(self, count=10): + """ Remove all axon compartments except the first 'count' + nodes, as counted from the connected axon root. + + Parameters + ---------- + count: Integer + The length of the axon 'stump', in number of compartments + """ + # find connected axon root + axon_root = None + for seg in self.compartment_list: + if seg[NODE_TYPE] == Morphology.AXON: + par_id = seg[NODE_PN] + if par_id >= 0: + par = self.compartment_list[par_id] + if par[NODE_TYPE] != Morphology.AXON: + axon_root = seg + break + if axon_root is None: + return + # flag the first 'count' nodes from the axon root + ax = axon_root + for i in range(count): + # ignore bifurcations -- go 'count' deep on one line only + ax["flag"] = i + children = ax[NODE_CHILDREN] + if len(children) > 0: + ax = children[0] + # strip out all axons that aren't flagged + for i in range(len(self.compartment_list)): + seg = self.compartment_list[i] + if seg[NODE_TYPE] == Morphology.AXON: + if "flag" not in seg: + self.compartment_list[i] = None + self._reconstruct() + + # strip out everything but the soma and the specified SWC type + def strip_all_other_types(self, node_type, keep_soma=True): + """ Strips everything from the morphology except for the + specified type. + Parent and child relationships are updated accordingly, creating + new roots when necessary. + + Parameters + ---------- + node_type: enum + The compartment type to keep in the morphology. + Use one of the following constants: SOMA, AXON, DENDRITE, + BASAL_DENDRITE, or APICAL_DENDRITE + + keep_soma: Boolean (optional) + True (default) if soma nodes should remain in the + morpyhology, and False if the soma should also be stripped + """ + flagged_for_removal = {} + # scan nodes and see which ones should be removed. keep a record + # of them + for seg in self.compartment_list: + if seg[NODE_TYPE] == node_type: + remove = False + elif seg[NODE_TYPE] == 1 and keep_soma: + remove = False + else: + remove = True + if remove: + flagged_for_removal[seg[NODE_ID]] = True + # remove selected nodes andreset parent links + for i in range(len(self.compartment_list)): + seg = self.compartment_list[i] + if seg[NODE_ID] in flagged_for_removal: + # eliminate node + self.compartment_list[i] = None + elif seg[NODE_PN] in flagged_for_removal: + # parent was eliminated. make this a new root + seg[NODE_PN] = -1 + self._reconstruct() + + # strip out the specified SWC type + def strip_type(self, node_type): + """ Strips all compartments of the specified type from the + morphology. + Parent and child relationships are updated accordingly, creating + new roots when necessary. + + Parameters + ---------- + node_type: enum + The compartment type to strip from the morphology. + Use one of the following constants: SOMA, AXON, DENDRITE, + BASAL_DENDRITE, or APICAL_DENDRITE + """ + flagged_for_removal = {} + for seg in self.compartment_list: + if seg[NODE_TYPE] == node_type: + remove = True + else: + remove = False + if remove: + flagged_for_removal[seg[NODE_ID]] = True + for i in range(len(self.compartment_list)): + seg = self.compartment_list[i] + if seg[NODE_ID] in flagged_for_removal: + # eliminate node + self.compartment_list[i] = None + elif seg[NODE_PN] in flagged_for_removal: + # parent was eliminated. make this a new root + seg[NODE_PN] = -1 + self._reconstruct() + + # strip out the specified SWC type + def convert_type(self, old_type, new_type): + """ Converts all compartments from one type to another. + Nodes of the original type are not affected so this + procedure can also be used as a merge procedure. + + Parameters + ---------- + old_type: enum + The compartment type to be changed. + Use one of the following constants: SOMA, AXON, DENDRITE, + BASAL_DENDRITE, or APICAL_DENDRITE + + new_type: enum + The target compartment type. + Use one of the following constants: SOMA, AXON, DENDRITE, + BASAL_DENDRITE, or APICAL_DENDRITE + """ + for seg in self.compartment_list: + if seg[NODE_TYPE] == old_type: + seg[NODE_TYPE] = new_type + + def apply_affine(self, aff, scale=None): + """ Apply an affine transform to all compartments in this + morphology. Node radius is adjusted as well. + + Format of the affine matrix is: + + [x0 y0 z0] [tx] + [x1 y1 z1] [ty] + [x2 y2 z2] [tz] + + where the left 3x3 the matrix defines the affine rotation + and scaling, and the right column is the translation + vector. + + The matrix must be collapsed and stored in a list as follows: + + [x0 y0, z0, x1, y1, z1, x2, y2, z2, tx, ty, tz] + + Parameters + ---------- + aff: 3x4 array of floats (python 2D list, or numpy 2D array) + the transformation matrix + """ + # In addition to transforming the locations of the morphology + # nodes, the radius of each node must be adjusted. + # There are 2 ways to measure scale from a transform. Assuming + # an isotropic transform, the scale is the cube root of the + # matrix determinant. The other ways is to measure scale + # independently along each axis. + # For now, the node radius is only updated based on the average + # scale along all 3 axes (eg, isotropic assumption), so calculate + # scale using the determinant + # + if scale is None: + # calculate the determinant + det0 = aff[0] * (aff[4] * aff[8] - aff[5] * aff[7]) + det1 = aff[1] * (aff[3] * aff[8] - aff[5] * aff[6]) + det2 = aff[2] * (aff[3] * aff[7] - aff[4] * aff[6]) + det = det0 + det1 + det2 + # determinant is change of volume that occurred during transform + # assume equal scaling along all axes. take 3rd root to get + # scale factor + det_scale = math.pow(abs(det), 1.0 / 3.0) + # measure scale along each axis + # keep this code here in case + #scale_x = abs(aff[0] + aff[3] + aff[6]) + #scale_y = abs(aff[1] + aff[4] + aff[7]) + #scale_z = abs(aff[2] + aff[5] + aff[8]) + #avg_scale = (scale_x + scale_y + scale_z) / 3.0; + # + # use determinant for scaling for now as it's most simple + scale = det_scale + for seg in self.compartment_list: + x = seg[NODE_X] * aff[0] + seg[NODE_Y] * \ + aff[1] + seg[NODE_Z] * aff[2] + aff[9] + y = seg[NODE_X] * aff[3] + seg[NODE_Y] * \ + aff[4] + seg[NODE_Z] * aff[5] + aff[10] + z = seg[NODE_X] * aff[6] + seg[NODE_Y] * \ + aff[7] + seg[NODE_Z] * aff[8] + aff[11] + seg[NODE_X] = x + seg[NODE_Y] = y + seg[NODE_Z] = z + seg[NODE_R] *= scale + + def _separate_trees(self): + """ + construct list of independent trees (each tree has a root of -1) + """ + trees = [] + # reset each node's tree ID to indicate that it's not assigned + for seg in self.compartment_list: + seg[NODE_TREE_ID] = -1 + # construct trees for each node + # if a node is adjacent an existing tree, merge to it + # if a node is adjacent multiple trees, merge all + for seg in self.compartment_list: + # see what trees this node is adjacent to + local_trees = [] + if seg[NODE_PN] >= 0 and self.compartment_list[seg[NODE_PN]][NODE_TREE_ID] >= 0: + local_trees.append(self.compartment_list[ + seg[NODE_PN]][NODE_TREE_ID]) + for child_id in seg[NODE_CHILDREN]: + child = self.compartment_list[child_id] + if child[NODE_TREE_ID] >= 0: + local_trees.append(child[NODE_TREE_ID]) + # figure out which tree to put node into + # if there are muliple possibilities, merge all of them + if len(local_trees) == 0: + tree_num = len(trees) # create new tree + elif len(local_trees) == 1: + tree_num = local_trees[0] # use existing tree + elif len(local_trees) > 1: + # this node is an intersection of multiple trees + # merge all trees into the first one found + tree_num = local_trees[0] + for j in range(1, len(local_trees)): + dead_tree = local_trees[j] + trees[dead_tree] = [] + for node in self.compartment_list: + if node[NODE_TREE_ID] == dead_tree: + node[NODE_TREE_ID] = tree_num + # merge node into tree + # ensure there's space + while len(trees) <= tree_num: + trees.append([]) + trees[tree_num].append(seg) + seg[NODE_TREE_ID] = tree_num + # consolidate tree lists into class's tree list object + self._tree_list = [] + for tree in trees: + if len(tree) > 0: + self._tree_list.append(tree) + # make soma's tree be the first tree, if soma present + # this should be the case if the file is properly ordered, but + # don't assume that + soma_tree = -1 + for seg in self.compartment_list: + if seg[NODE_TYPE] == 1: + soma_tree = seg[NODE_TREE_ID] + break + if soma_tree > 0: + # swap soma tree for first tree in list + tmp = self._tree_list[soma_tree] + self._tree_list[soma_tree] = self._tree_list[0] + self._tree_list[0] = tmp + # reset node tree_id to correct tree number + self._reset_tree_ids() + + def _reset_tree_ids(self): + """ + reset each node's tree_id value to the correct tree number + """ + for i in range(len(self._tree_list)): + for j in range(len(self._tree_list[i])): + self._tree_list[i][j][NODE_TREE_ID] = i + + def _check_consistency(self): + """ + internal function -- don't publish in the docs + TODO? print warning if unrecognized types are present + Return value: number of errors detected in file + """ + errs = 0 + # Make sure that the parents are of proper ID range + n = self.num_nodes + for seg in self.compartment_list: + if seg[NODE_PN] >= 0: + if seg[NODE_PN] >= n: + print("Parent for node %d is invalid (%d)" % + (seg[NODE_ID], seg[NODE_PN])) + errs += 1 + # make sure that each tree has exactly one root + for i in range(self.num_trees): + tree = self.tree(i) + root = -1 + for j in range(len(tree)): + if tree[j][NODE_PN] == -1: + if root >= 0: + print("Too many roots in tree %d" % i) + errs += 1 + root = j + if root == -1: + print("No root present in tree %d" % i) + errs += 1 + # make sure each axon has at most one root + # find type boundaries. at each axon boundary, walk back up + # tree to root and make sure another axon segment not + # encountered + adoptees = self._find_type_boundary() + for child in adoptees: + if child[NODE_TYPE] == Morphology.AXON: + par_id = child[NODE_PN] + while par_id >= 0: + par = self.compartment_list[par_id] + if par[NODE_TYPE] == Morphology.AXON: + print("Branch has multiple axon roots") + print(child) + print(par) + errs += 1 + break + par_id = par[NODE_PN] + if errs > 0: + print("Failed consistency check: %d errors encountered" % errs) + return errs + + def _find_type_boundary(self): + """ + return a list of segments who have parents that are a different type + """ + adoptees = [] + for node in self.compartment_list: + par = self.parent_of(node) + if par is None: + continue + if node[NODE_TYPE] != par[NODE_TYPE]: + adoptees.append(node) + return adoptees + + # remove tree from swc's "forest" + def delete_tree(self, n): + """ Delete tree, and all of its compartments, from the morphology. + + Parameters + ---------- + n: Integer + The tree number to delete + """ + if n < 0: + return + if n >= self.num_trees: + print("Error -- attempted to delete non-existing tree (%d)" % n) + raise ValueError + tree = self.tree(n) + for i in range(len(tree)): + self.compartment_list[tree[i][NODE_ID]] = None + del self._tree_list[n] + self._reconstruct() + # reset node tree_id to correct tree number + self._reset_tree_ids() + + def _print_all_nodes(self): + """ + debugging function. prints all nodes + """ + for node in self.compartment_list: + print(node) + +######################################################################## +class Marker(dict): + """ Simple dictionary class for handling reconstruction marker objects. """ + + SPACING = [.1144, .1144, .28] + + CUT_DENDRITE = 10 + NO_RECONSTRUCTION = 20 + + def __init__(self, *args, **kwargs): + super(Marker, self).__init__(*args, **kwargs) + + # marker file x,y,z coordinates are offset by a single image-space + # pixel + self['x'] -= self.SPACING[0] + self['y'] -= self.SPACING[1] + self['z'] -= self.SPACING[2] + + +def read_marker_file(file_name): + """ read in a marker file and return a list of dictionaries """ + + with open(file_name, 'r') as f: + rows = csv.DictReader((r for r in f if not r.startswith('#')), + fieldnames=['x', 'y', 'z', 'radius', 'shape', 'name', 'comment', + 'color_r', 'color_g', 'color_b']) + + return [Marker({'x': float(r['x']), + 'y': float(r['y']), + 'z': float(r['z']), + 'name': int(r['name'])}) for r in rows] diff --git a/core/typing.py b/core/typing.py new file mode 100644 index 0000000000..2a747557df --- /dev/null +++ b/core/typing.py @@ -0,0 +1,16 @@ +import sys +try: + # for Python 3.8 and greater + from typing import Protocol +except ImportError: + # for Python 3.7 and before + from typing import _Protocol as Protocol + +from abc import abstractmethod + + +class SupportsStr(Protocol): + """Classes that support the __str__ method""" + @abstractmethod + def __str__(self) -> str: + pass diff --git a/deprecated.py b/deprecated.py new file mode 100644 index 0000000000..883c3217f5 --- /dev/null +++ b/deprecated.py @@ -0,0 +1,103 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import copy +import warnings +import functools +from numpy import VisibleDeprecationWarning + + +def deprecated(message=None): + + if message is None: + message = '' + + def output_decorator(fn): + + @functools.wraps(fn) + def wrapper(*args, **kwargs): + + warnings.warn("Function {0} is deprecated. {1}".format( + fn.__name__, message), + category=VisibleDeprecationWarning, stacklevel=2) + + return fn(*args, **kwargs) + + return wrapper + + return output_decorator + + +def class_deprecated(message=None): + + if message is None: + message = '' + + def output_class_decorator(cls): + + fn_copy = copy.deepcopy(cls.__init__) + + @functools.wraps(cls.__init__) + def wrapper(*args, **kwargs): + warnings.warn("Class {0} is deprecated. {1}".format( + cls.__name__, message), + category=VisibleDeprecationWarning, stacklevel=2) + fn_copy(*args, **kwargs) + + cls.__init__ = wrapper + return cls + + return output_class_decorator + + +def legacy(message=None): + + if message is None: + message = '' + + def output_decorator(fn): + + @functools.wraps(fn) + def wrapper(*args, **kwargs): + + warnings.warn("Function {0} is provided for backward-compatibilty with a legacy API, and may be removed in the future. {1}".format( + fn.__name__, message), + category=VisibleDeprecationWarning, stacklevel=2) + + return fn(*args, **kwargs) + + return wrapper + + return output_decorator \ No newline at end of file diff --git a/ephys/__init__.py b/ephys/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/ephys/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/ephys/__pycache__/__init__.cpython-37.pyc b/ephys/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9555d6555def0e2bd9bafb0d786b435039afa4b3 GIT binary patch literal 182 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU-8aXF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KNX}vKR!M)FS8^*Uaz3?7Kcr4eoARhsvXGU&p^xo00bg3 A%m4rY literal 0 HcmV?d00001 diff --git a/ephys/__pycache__/ephys_extractor.cpython-37.pyc b/ephys/__pycache__/ephys_extractor.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f6acd5e23c0d2b843fa8273f3bbe0b3421f1891 GIT binary patch literal 34738 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 W5nsq2$mX)eY$pEz_T3L=Q~wA41?GPM literal 0 HcmV?d00001 diff --git a/ephys/__pycache__/ephys_features.cpython-37.pyc b/ephys/__pycache__/ephys_features.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2b115b133955463d4be3b7e1971146eb576d2cf GIT binary patch literal 32573 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 J9AaDN{~z#eN0$Hq literal 0 HcmV?d00001 diff --git a/ephys/__pycache__/extract_cell_features.cpython-37.pyc b/ephys/__pycache__/extract_cell_features.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e50058fff5e57df2183346f4e153f6711ce11fd7 GIT binary patch literal 5480 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 ThGv6b)2&zS*R7JhXxaY(J>Z%} literal 0 HcmV?d00001 diff --git a/ephys/__pycache__/feature_extractor.cpython-37.pyc b/ephys/__pycache__/feature_extractor.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86194e852e8a2a9857522d89328e476426ebd361 GIT binary patch literal 12307 zcmcgyYm6M(RjzkeKW5w>&!gvIyFDI{-F}R{e%o<u@2=O`4a;EdZtSJ;s?+XUGt)CY z-95Kz#_dj360#veQ38X+j}Ya@O!z~B6e6S`kkD#{B7{~5A+!=wi9Zkt#R8%PAwUrl zeCJg4Yt{}RA!by!&pr3tbI(2Zo^#JVRWA(<r4;<tfBToq)yInR1FCfX3;?(Bxc5*9 zMW{8U82ze6mFrqj=U-#pEShT6W)-bZC_)qZ7Zss9iFfs)jk+OB)J?7@h5Dvau%3de zvRI+A^QQs0jmMos;V3jpQ4^}rzNla%T^RTUCt=~&6bW##!=YE2D^J|JPTAX(j$0uX z^k?HS@w|-3y$Wnq@s(0kstjvf>b?rRL4#D)0Al;fswRvZimw5}kT)Q<utY-G-_QeH zB)L6>cB0e;AdzNVri%lFK0{(y>_Z<zWVwAm+70dlh<T1MPg5M=_R;Q`fW#Q%#(^`r z4<IqYxLg+pNK7(rs*3|8rWrTW#Q_or8F#3Q10)V(UL%-U{u@SMi6cxg3kqw;+=aF< zJJiHc#?KAlQ4`0QVs26q^QawXsuKfLsEGpOPY&Qw6Q>w|dH|1_IK%jb0X%BrEaT4& z;87DVF#h}i9<^Ay^RaXnnCjvH6>7W+mv|Kt;xf}*0ZjssE&vGyTkPs$sIOGL(5f!i z8`5cK7dO`*IWpf^%Dc_#n&XCcy%a;H>j`HoG%Jm|>q!-Rub@jEKcTT+bzPYN*v`Hv z%1y8ARU7quwJw}iXqE}n&b?J#ck*5%zf_g37je&@Sa%CyqE_~tdgV!&TzAU#()wo2 zdrCV!<}PWs%QP{!UVHPkGcVr{P5i!m|LJHn;FcrH%T6A+m|xYcmdabp?d+Y#=A)Y9 z^)-nI(;m88h7d2ldJkRh7sAw1X$go@d8OGNdb8GeJkaC<v8TzyWWs$*rA||c5bd#- z%C1wZ)}8!TqvnxN%-wnfbZINJn~r2%77W%~G&53Ln0D8y%~FkIsJHjONvhAUIMwA9 zFJ`e+YC7e$b~b7fPSab7TI{8gCmWl~D^F=f<T&YM>>g<In@ucJ1B@WVSyHs!!L)Pt z*J+7~<p3Ep(V;1AwI`U3XgsF%?q`(h;o4Juta|83woDHJcH?iYz=^FiYGP15Nw0%% z&qULETossJ*~_n#YfER=%Pp{j{3heumtS5f*P+{LJukM-3NPQl4v4qarTqH+e3RC; z%d|WFbc8C&@_O^>PkHa$t;%YBIWMsR^Cw<y7ea%;f`uK8ttc&88hg3caNV+e5+>YA zgXlw}UdHkpl}7UkoV0;8Uy}2nEoLG!DiNVmOvg2{j$(>8chr!9t*w`9G1+iuTXeed z9*HX7Qe**)f4cJW^@pEwv3(wvSIT1HQTcJX{^a3{^)if6lrKDV>Rax^M$@TdfTq)+ zQ{&<5)khEAs^^?(mMd%6jObgdfkLdEb%@~XQgp7AoR%lc6|W%|nomNzRI1jiUa52* z<GQOT6wOjC-AY-SW!P#;O&J*~dr+_5!FPTW!+@e^Snoi4f4SWxp6&60^KPLdN`<yI z{gJon9(-R%#ly)Bho(*_@2aZO`VzUh9er21qrB4!R671vjWtV72|Dl$U!7FOm4IN4 zV4<uf<=cLIFh;Fc&|bHJGYDc1COCW<eavp3FQc7~F2;;2MCsvBB^frR9z?FyT5Jz@ zPVW4YY^>+oiDMVex%rRh+uE_^wtXi4YbWxj&YsC1TgJXKo7i9;Zzg#Z^9zkN=ZPyR zWZ>NhpLl}M>RPD5C~0p*#Yw^@xp%3t>HQk2F8N0V>d*2b46CD>t>)AbwLLMY=5DWU zfI)hu2<c@!?sXKci@v&}uwGBFRy1f28iWp1U&FD25*R$JTVOU)u^#kAo=HdiGvGFW zp!pP2%`(igB&ropE)d0@nVFSZqwahIEiM@)%?k54FgOpUS%em`hsi=qr7%@0tvAGG zjo?hFw6R&PMJ@6ajdG5P7pUls#}KJg(ji2RJfyAK5A9*bRe<aM5z%ct?&~Q2`>;;f z2=6SB6e;{BL|SC<Yg0Uh-=x?lviMDj{WzOP!m<AOz0$GLt~HQV(D1xU<oK7N{ZdpS zx&*B8A+IhL^f1%0_FC2T!r@NMZEVVl1J|~>z78K(P<em#se?5^%K9drNckE(f!03s zOyPPqOUE|-eGE?$4@)_kA)EEpch$i5%^-;Y(3((!l&9`!2q2Sd=B`Tnik=`HV^agz z41(9RpZOK+wO|Mox^M8lLzp|M<PewV6!0+C6!{&r8hA|K*j0fu8E5SzqL6o2f2ak+ z!9LGgwf$j#pFe~^Ir&v1$a0_Tt{UvGlVqkpM6ka<;?)@)98;spv=WSnbZ|gqg3)Cq z7z2$)ba;~fh<{*L+evw89$#D2qS*!Gpqyyk_cH$YyDEIuCm~5LnDlc(UDLKzdCs5M z8S*E0;ZN!(!D$$r#?h+f6j<0K%^j4OCum1{wA<>&$OFZn@YC=}6X^F`-JsuJpnZ>a z82fzv&~4?}`oX+<`swLqTW<|xjuSM;ZT%euvz!X1t4c8APkH+YPcvFmwlz5iso|w3 zFu&kn-S9KPLDbbX18ujXHkx~I2yN-$5M<9{A58lPNf*1SKaE{<*gx#gh#`0*%|8r1 z&4^*ZdJOLaY{YODaK8i^M)@{+A7pvB23`Iu_#ei4Xz~xK#$%2Uu5ZjdRwmD5;o<{| z{TOvWNwlrY*Zn-rC^*t0dG~|zNZgY3j|dHGbYxrG_!q3$5%d~?OiV!>0Bb}I_yAx% zhH-hq93uSK4W)kC&&NHrSc-@`k|?5%U{KQzg&Z12IppVQ4*n>OHK~j$Yh)j=pI{d2 zGE3`%Rng_|`}yE#J>$=caZn$^T#ouj(Px6?JIeCWl}+;_c#>s}V7j&$F@75GjL0(m zG+8NXbcGwR++Z$VH|92hYaMLsm^c*7x1=}XAN3AEHk`45(&Df`H;pqN=f3u?1`ApY za{m0b;ckIP4&xkKGq(-7CGx?%p9_xHPg1LVtJ|t@&0t!?KOW0;<c4w&EgNrPO`^TR zGk{l_#ZENj`@Acn-NjO(<tQ{|$gtNU<{0yjj2VL+&yXEc?SX<Bj6u7!uT43R)fg4W z#QYZ(f9wusv#aim;c_}UsstxsJ1@a@K+U#uk!>fk8{!bzjVV9vk9F)uOnk(4O!@h! zooq)8eZ+pSlF(JhhPd{>wIj?Siyakl>R3jH)AOyvlB>_L4ofa{t;1q}_WxoXdo1I` zGcCfB-~T_f2(qN(eO7{$0!x9N75NxZ=$w2(0XwG<@0^6Z?-$5g{i73PNk};$VkK^r ziZJMR66=lMQ+*sGi=Pp&4sm)y>2f{^&L_K^-}g^;I0vV&uBX5UwinyS8H_ZFI{B0V zEaV;s1|Br_jfb(1PWz`J1Eo7O|1`^U7O)<}l<qKM_yxctF^mKUxRD=4f&+fkl;{1^ z&-9}<V)u?8wKs0SW;^~9Jhsh^^AC^`3(oj-9#eFItQt-mgQ3H8?%W3dNri3BUL6w` zAjOzZ5Yi{UvNPe2;apqr7wDd_ZDZ{hxb+ewWIGPd`ezw)8Q%4Ze|A*yQ+_gsn1HcY znM)2lQ@a{tu626CzZ%;~xgf6lV-&rJ6VT5XX`Y}QJTlXNtV>TGBPBm*ebDg<@4Uw` z!;GJceM;mJlCp{M5Gl|}D&W`Z8qU&ln9Za=gLObe;Gf$?J`?&K<~6xN<B6k?c}4)n zy1fwZLhMea`1qv4r^O3vh@<$FIFB*U$9pCz?}`+-p64@y`_R~op*`Bg@T_LUO{`6F z<1TIososozvpeTo&}FBEc3-dMHd@r+0-lSlhu(-#do$-V;4aPp%pG2CW>5#1|HVEG z>ze2yU0+dxi~a>Zk1uSeHr~cQ!WgXY_pv?~u@)EN6@3x=KZVGe_6T6?u1l@k-bf?| zM{?(aT<b(6#m>|&-9vN1W&g5&X)S^E`w>Atb_>S&(E}>~=7G}sd;d~Q8wQs#yDNCE zw(bn@y@<J8j`)I8T7Ggny>ZdM>P<&D|MDcx56tAMe??ru?-gptOu!2fOj@>4pYqXq z5H#R_t@Y{v|EqiWe;f3_xtD)V39kFs{OkVpQM&V9BO07(Gdl-?y)q4J3a()cXouzq zoV|L8XN$2Ri?Vtcr=d-!A>ce<oOqO3$7ScGMb0S7N!%2cf3os}U;W;{e|U5G)!+N$ zumAI3w{I?g^`E}C^KXCp-J4J8R=WK4-=e=ix)tik%oWt4QEpY;WwhWb_UpIhaF6C& zw<zmYUMp2aOHKe^M7}ISbRkbpp&`t4GhakIO|-paShWxKp8hBP!l7=4iJ2dw4snVJ zDX!91f2G=A@rp@VMM98Lh7$K7<?ix-eCsEF_4AMJ-FmCIpHg0>DD_w3d{^A~>08kR zF~u0T`F{5%NVh=J%$s=l+D|vZcQTX#5wOMI&^8R{SmlZG-L9a8+QPX|cbjW_?s`8> z-Jly{rLo?;c@;NImv~!B`}(u5drjG>IIfGFk?WP~6=&f_tx+l0+?xP8Y>K8wDhgGv z`ghP=G0D|Z{lYnF!Ov65>Bu~aaJVmJNb7JA$YOsUu{u!m<P3GCOh;&O-prLlgdvWx zo_>5w&Jv0)q17MifU;E0p$Jn^?vz*XFkw?Dis?8bO|r>-z!Z+~#Xr>QO=KZg9O;C5 z`H>syTV;utHr1sijE-zyxmL6uK^;yFyQ^CB=qU~@OC;JHS#l`-P_&Spe9{C1BznT6 zQ{TicKyzr7o5<e@Fs?tr#&+tUl*>qdhGx~Rm+PS^DeW2R>s7#IDa%iy6cLjV4tej& zR+!~{J7?grDwKiGVnHgKG^aRKEGY>SnoG4t*+Z(c?5!Y)xgkBy(a6iBhbuJek44D< zN^OSf780JDQp%T5E1Gx*;COg%wJD297dx2~E@2{0D};DgP?q5BdW|L#ph7w>+JuOp ztrD=yju)zrLbZ&R^+v;6f!%0g3p(8ruoJOWs%(0VrKMsjPTn?=AbN!)81kI;CSFaj zX}jniL!nv?4QeZzgsK-4af`f7)3EEvc18j;rL)BgPZ<h%gP10fLV{(Iq}e4XuN038 zgez|ng>~<hH(vXNJH<5HW{L9rZgHP<knj~q4M!$hG|=H(G28PH(Nv2WN>yW1(FjNh zH*1@2=~8LSsTB8j<`<#RF7L3su}0mZMXxm~TfDQ2HV8^Im12q=2DS+_H%jbFJw!AN zb*$7qX5clv&~`T|<LpG4wope~FCiD|*v)%fLYUoa<-ZHj+;39;NwqCQwNvBjxSCPV zBPlncX0((#r5P&y&*K?E`Z1&C^{i^^m%9`r`nYCjBkC|pWP~*XbsKc}*YoI=QVEkm z^3q11VU*kk$_|yG&Z1_4rqh-|iZiQ@^0-u5fJar^99IpEo?+m!`mj2K8YJbBQ5uIj zJOTZz5vTT!r(<LtSn#sJ8S+5Nacxu|?~|!B1B|4e#=N3`%A}JN!!!&0&f}S3__8_` z>n{f`Sv8OL6lRvvNtdL}QJx9aXhx$d<<_wZcsdyRO{rPTrak{ZbKKqBFXip%Ea80J zp8<&Sb%-P2IO(hwTA(3+rMK>SYTSmL8%ICq1LW9otJgXDG!VU^hBylkVh0oPr-`@$ zQ7GbZWcrXTKZ&>ixpeT+-&IEyL?;^fTdmW~8#v}W1HK%)GM|KR;WcK0V-RcO3*cZy z{n6V3H^kQR`<}jI_!crl+BC^bF^0AH6y9Iy1sd$jx~D|Jl=rCl4JsC?C{poDC<=Du z3EA`5WQg=O2VNRE_zK$L%-yQ|B#~FC;2bg+oIbq|+=q0Q(mAAHi$umTj*Vzzp|aQ* zFdHm&1{-QvZBIXY$;ghkDl`T9OW>hgIIq(m0C>ha>CmNtwK7}RKeATy(3OdGP<?A) zy{yi9@%k(vKE20%O~m`1b-sbVI^KXFdmHs7D89Gs!A;;cgf*v3q>f)>V-@R#8rDkp zbzT*D4bne%RrEcpQb_c#1)n`QHj8>$ROJdWTBm|mW$!XP0PY`X8R+QmErS6&oQID% zhb6F|YcG3G)e66d03UiY-CYMC>=AR}-UAImziXyE;VC;R-akPvOWHVMWJJGakf@J) zcvFR44XXIgOqp=(YxLI<J!^h~>?i(QBZ5ufjTmnM)?+xqcv?Ao0u&-SiTl0$nuohC zRxJhFv+IX29x~y=1_w~a8GtnU;6XMX`FQmC6Ub&mCVNeje@PkoJ~{0^Ig^kNqd-3T zG^7Jl?p2TRlzT-+pJ^!fO8hCeJ?|%jRF^BTF;_?)q`)b~Jt#wKFwD{-V~G1ZTH+e+ zV=8A!BN~;mr)=W~79}0$?Q3*6MqeQ0PaG44{3B-x?_{G_-W(Q1=uT)vuYsdjP~Js< zjt+}<935_TA+HNnmp?Q5olpF2+q)${P95mt67AvrfQp&k7X>(&`)deb``SD?LLCpp zeR|&$;5AmF)>vMq_sxmNWmyLxKS8vgqJllutAGk=HU~sp^wEHPNR97ML2;UNsNnd9 zW>ritRkxhdI>L2|#rTs4hIm+tIrccNx6w)0U@=z#D4Gp-HKJNt_oRly!s(+Og4;6C zMlI1PO))@Jn|rQBbyVMpO1mcz2JF4pqJSJe3h%Xeeeo_!l_X6;<9Qd;b?0#@etWe? z{4mqpbXPi!FVH-QwW79XpY34#$-B}}{NJ_j55WL;S4ae#;Zty1YrW^uduDAFC(bUP zgWK9Wzk?HtK8Vs*>Fx0>Ll&Qf)DxZ)r<5k&*qGhc>LaM>Y#S#dK12uqLA?_U!z<v8 zmf?Qhv%i27)yG)i`X2o<PkN8ttp&E1Bnzf9*-s#cp2T^JycBt!`U?6)a=@BkZz*9x zjvspI4xVfdZ|Bl@w~!JEmMVqwbx%7o)M;cw>}}N@C7IBkrd~V}-gZ&GyM7(>N`iwX zi$8l_;8N_L8N9@g`sYS<VPIZ(_eY<lv4ojEostI|!aM4?6&ae0Ka}IF6*4eW!LUy{ z875u%7U=~i5oF)^F3uu5qQ!YcK5(zTRy%qTefq+TruJ&2Ph*<A@iR20xp$wfG1jN% z3T{n$LlhCgduI^M%zBWWzAnHo?Fy?822~fIh+(adhTskj!Av7;cb3N4n5EMgr|{5X z^hpv$e$h3MqWj(#O8f!VT{%Wbih}q<BMP1Jr5)|1!alw=;u74Do+H>mqdNt^?w_L$ z$EYAf3Ws0B4O!ABVy{Tqkn%NZ;ehKG2_n~q%*5upJPin}Pv8gFI0w0c&2`*D%Q)^W z{*uP!j|D;--xW3KM%sUm*(%rQj$OewJ!p+)ViJFPQ!blS40^k8Kl3bgUyVE7b@CZ? zkSd6#4aDWq?Z84U@^d+gvf%~keliL;2fv394kfkYrh#7c0mcmX#cctRJL2~)Wd@Nu z-49}~8UMDAKifZjM82+*A}>h+AqRtBgVYEH@o5I9Xf=tWU+~8%6cq0&DkUy8gzpq~ zGZhEf7ZH%5=Ibyfqc!Int9TX6Da>(lSg6}@I<EslFoO>~UVoraiXF*Bt98%UV%j?h zHgE3Xe7eVZ)q-OLueF5y3Z&9~a~$S~kjUZ>Zmf;3fNKkz(xMcs{Bv^p?EaIj8Q+M< z$Oa~V_LGDwBS|QU+TJtfN^eZe=6>I7UhT~Wj%A8kD74@tKh>30=4)~iJ8HXvFOLvl z&?i61)f9~h=Yf<aN(Ez|@8doP?tL5tT}@cWbh#le=!5ySzO+YPZ$REheH`B!koSW< z@_x`64XZ}MV>}xQ`8v|_OyJz;!W2vJ0n1MA53+H%YP3GxH|86CV`}ndhb!xd>aiX$ zX3|d%&M`=O>75K6HytX>S=+ctW5LlRqC{`|3fq4E%$a;0--O0rIOiWDwU$TZM&F}3 zVj=%#^jS*2y57V`cvXDO*)GH#JDu{!kGaRegrdDXzHrNnvRBT-Tewj&nXH%o$XVg< z$F~YYQS`)lE^;w&Hc#Bpa9UL_y8Imll5=FyhgTGCL_V>1AxuS=5N;yQeBmf+ORdNw z=?*ew%%)0>kEz(>ZIV&YQf)h*B`-sFMEa}=-x(pJLLP!X+sd;47=>RTA3>hN&@K3o ztQJv_U&$foG1sk=*O`O=A)k{$w3bubho9q3ShpB|5iulv?I$l#aghrCI%<_5l1tLf zNxn_R1{G~8K1)S!P7LvF_YxX*@o*v<(@EN&Q$DAhvM21Ey@1*sNfd>Y{0wm*l@?7n z_U01~Z;KhXQf)q2h|;O@=ZJ<paA-9itvbm5L0JlOc-G*deIxqb>n5E!E@jst0V~f= HW}E*72VQ<| literal 0 HcmV?d00001 diff --git a/ephys/ephys_extractor.py b/ephys/ephys_extractor.py new file mode 100644 index 0000000000..15794f78bc --- /dev/null +++ b/ephys/ephys_extractor.py @@ -0,0 +1,1108 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +from pandas import DataFrame +import warnings +import logging +from collections import Counter + +from . import ephys_features as ft +import six + +# Constants for stimulus-specific analysis +RAMPS_START = 1.02 +LONG_SQUARES_START = 1.02 +LONG_SQUARES_END = 2.02 +SHORT_SQUARES_WINDOW_START = 1.02 +SHORT_SQUARES_WINDOW_END = 1.021 +SHORT_SQUARE_TRIPLE_WINDOW_START = 2.02 +SHORT_SQUARE_TRIPLE_WINDOW_END = 2.021 + +class EphysSweepFeatureExtractor: + """Feature calculation for a sweep (voltage and/or current time series).""" + + def __init__(self, t=None, v=None, i=None, start=None, end=None, filter=10., + dv_cutoff=20., max_interval=0.005, min_height=2., min_peak=-30., + thresh_frac=0.05, baseline_interval=0.1, baseline_detect_thresh=0.3, + id=None): + """Initialize SweepFeatures object. + + Parameters + ---------- + t : ndarray of times (seconds) + v : ndarray of voltages (mV) + i : ndarray of currents (pA) + start : start of time window for feature analysis (optional) + end : end of time window for feature analysis (optional) + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dv_cutoff : minimum dV/dt to qualify as a spike in V/s (optional, default 20) + max_interval : maximum acceptable time between start of spike and time of peak in sec (optional, default 0.005) + min_height : minimum acceptable height from threshold to peak in mV (optional, default 2) + min_peak : minimum acceptable absolute peak level in mV (optional, default -30) + thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) + baseline_interval: interval length for baseline voltage calculation (before start if start is defined, default 0.1) + baseline_detect_thresh : dV/dt threshold for evaluating flatness of baseline region (optional, default 0.3) + """ + self.id = id + self.t = t + self.v = v + self.i = i + self.start = start + self.end = end + self.filter = filter + self.dv_cutoff = dv_cutoff + self.max_interval = max_interval + self.min_height = min_height + self.min_peak = min_peak + self.thresh_frac = thresh_frac + self.baseline_interval = baseline_interval + self.baseline_detect_thresh = baseline_detect_thresh + self.stimulus_amplitude_calculator = None + + self._sweep_features = {} + self._affected_by_clipping = [] + + def process_spikes(self): + """Perform spike-related feature analysis""" + self._process_individual_spikes() + self._process_spike_related_features() + + def _process_individual_spikes(self): + v = self.v + t = self.t + dvdt = ft.calculate_dvdt(v, t, self.filter) + + # Basic features of spikes + putative_spikes = ft.detect_putative_spikes(v, t, self.start, self.end, + self.filter, self.dv_cutoff) + peaks = ft.find_peak_indexes(v, t, putative_spikes, self.end) + putative_spikes, peaks = ft.filter_putative_spikes(v, t, putative_spikes, peaks, + self.min_height, self.min_peak, + dvdt=dvdt, filter=self.filter) + + if not putative_spikes.size: + # Save time if no spikes detected + self._spikes_df = DataFrame() + return + + upstrokes = ft.find_upstroke_indexes(v, t, putative_spikes, peaks, self.filter, dvdt) + thresholds = ft.refine_threshold_indexes(v, t, upstrokes, self.thresh_frac, + self.filter, dvdt) + thresholds, peaks, upstrokes, clipped = ft.check_thresholds_and_peaks(v, t, thresholds, peaks, + upstrokes, self.end, self.max_interval, + dvdt=dvdt, filter=self.filter) + if not thresholds.size: + # Save time if no spikes detected + self._spikes_df = DataFrame() + return + + # Spike list and thresholds have been refined - now find other features + upstrokes = ft.find_upstroke_indexes(v, t, thresholds, peaks, self.filter, dvdt) + troughs = ft.find_trough_indexes(v, t, thresholds, peaks, clipped, self.end) + downstrokes = ft.find_downstroke_indexes(v, t, peaks, troughs, clipped, self.filter, dvdt) + trough_details, clipped = ft.analyze_trough_details(v, t, thresholds, peaks, clipped, self.end, + self.filter, dvdt=dvdt) + widths = ft.find_widths(v, t, thresholds, peaks, trough_details[1], clipped) + + base_clipped_list = [] + + # Points where we care about t, v, and i if available + vit_data_indexes = { + "threshold": thresholds, + "peak": peaks, + "trough": troughs, + } + base_clipped_list += ["trough"] + + # Points where we care about t and dv/dt + dvdt_data_indexes = { + "upstroke": upstrokes, + "downstroke": downstrokes + } + base_clipped_list += ["downstroke"] + + # Trough details + isi_types = trough_details[0] + trough_detail_indexes = dict(zip(["fast_trough", "adp", "slow_trough"], trough_details[1:])) + base_clipped_list += ["fast_trough", "adp", "slow_trough"] + + # Redundant, but ensures that DataFrame has right number of rows + # Any better way to do it? + spikes_df = DataFrame(data=thresholds, columns=["threshold_index"]) + spikes_df["clipped"] = clipped + + for k, all_vals in six.iteritems(vit_data_indexes): + valid_ind = ~np.isnan(all_vals) + vals = all_vals[valid_ind].astype(int) + spikes_df[k + "_index"] = np.nan + spikes_df[k + "_t"] = np.nan + spikes_df[k + "_v"] = np.nan + + if len(vals) > 0: + spikes_df.ix[valid_ind, k + "_index"] = vals + spikes_df.ix[valid_ind, k + "_t"] = t[vals] + spikes_df.ix[valid_ind, k + "_v"] = v[vals] + + if self.i is not None: + spikes_df[k + "_i"] = np.nan + if len(vals) > 0: + spikes_df.ix[valid_ind, k + "_i"] = self.i[vals] + + if k in base_clipped_list: + self._affected_by_clipping += [ + k + "_index", + k + "_t", + k + "_v", + k + "_i", + ] + + for k, all_vals in six.iteritems(dvdt_data_indexes): + valid_ind = ~np.isnan(all_vals) + vals = all_vals[valid_ind].astype(int) + spikes_df[k + "_index"] = np.nan + spikes_df[k] = np.nan + if len(vals) > 0: + spikes_df.ix[valid_ind, k + "_index"] = vals + spikes_df.ix[valid_ind, k + "_t"] = t[vals] + spikes_df.ix[valid_ind, k + "_v"] = v[vals] + spikes_df.ix[valid_ind, k] = dvdt[vals] + + if k in base_clipped_list: + self._affected_by_clipping += [ + k + "_index", + k + "_t", + k + "_v", + k, + ] + + spikes_df["isi_type"] = isi_types + self._affected_by_clipping += ["isi_type"] + + for k, all_vals in six.iteritems(trough_detail_indexes): + valid_ind = ~np.isnan(all_vals) + vals = all_vals[valid_ind].astype(int) + spikes_df[k + "_index"] = np.nan + spikes_df[k + "_t"] = np.nan + spikes_df[k + "_v"] = np.nan + if len(vals) > 0: + spikes_df.ix[valid_ind, k + "_index"] = vals + spikes_df.ix[valid_ind, k + "_t"] = t[vals] + spikes_df.ix[valid_ind, k + "_v"] = v[vals] + + if self.i is not None: + spikes_df[k + "_i"] = np.nan + if len(vals) > 0: + spikes_df.ix[valid_ind, k + "_i"] = self.i[vals] + + if k in base_clipped_list: + self._affected_by_clipping += [ + k + "_index", + k + "_t", + k + "_v", + k + "_i", + ] + + spikes_df["width"] = widths + self._affected_by_clipping += ["width"] + + spikes_df["upstroke_downstroke_ratio"] = spikes_df["upstroke"] / -spikes_df["downstroke"] + self._affected_by_clipping += ["upstroke_downstroke_ratio"] + + self._spikes_df = spikes_df + + def _process_spike_related_features(self): + t = self.t + + if len(self._spikes_df) == 0: + self._sweep_features["avg_rate"] = 0 + return + + thresholds = self._spikes_df["threshold_index"].values.astype(int) + isis = ft.get_isis(t, thresholds) + with warnings.catch_warnings(): + # ignore mean of empty slice warnings here + warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy") + + sweep_level_features = { + "adapt": ft.adaptation_index(isis), + "latency": ft.latency(t, thresholds, self.start), + "isi_cv": (isis.std() / isis.mean()) if len(isis) >= 1 else np.nan, + "mean_isi": isis.mean() if len(isis) > 0 else np.nan, + "median_isi": np.median(isis), + "first_isi": isis[0] if len(isis) >= 1 else np.nan, + "avg_rate": ft.average_rate(t, thresholds, self.start, self.end), + } + + for k, v in six.iteritems(sweep_level_features): + self._sweep_features[k] = v + + def _process_pauses(self, cost_weight=1.0): + # Pauses are unusually long ISIs with a "detour reset" among delay resets + thresholds = self._spikes_df["threshold_index"].values.astype(int) + isis = ft.get_isis(self.t, thresholds) + isi_types = self._spikes_df["isi_type"][:-1].values + + return ft.detect_pauses(isis, isi_types, cost_weight) + + def pause_metrics(self): + """Estimate average number of pauses and average fraction of time spent in a pause + + Attempts to detect pauses with a variety of conditions and averages results together. + + Pauses that are consistently detected contribute more to estimates. + + Returns + ------- + avg_n_pauses : average number of pauses detected across conditions + avg_pause_frac : average fraction of interval (between start and end) spent in a pause + max_reliability : max fraction of times most reliable pause was detected given weights tested + n_max_rel_pauses : number of pauses detected with `max_reliability` + """ + + thresholds = self._spikes_df["threshold_index"].values.astype(int) + isis = ft.get_isis(self.t, thresholds) + + weight = 1.0 + pause_list = self._process_pauses(weight) + + if len(pause_list) == 0: + return 0, 0. + + n_pauses = len(pause_list) + pause_frac = isis[pause_list].sum() + pause_frac /= self.end - self.start + + return n_pauses, pause_frac + + def _process_bursts(self, tol=0.5, pause_cost=1.0): + thresholds = self._spikes_df["threshold_index"].values.astype(int) + isis = ft.get_isis(self.t, thresholds) + + isi_types = self._spikes_df["isi_type"][:-1].values + + fast_tr_v = self._spikes_df["fast_trough_v"].values + fast_tr_t = self._spikes_df["fast_trough_t"].values + slow_tr_v = self._spikes_df["slow_trough_v"].values + slow_tr_t = self._spikes_df["slow_trough_t"].values + thr_v = self._spikes_df["threshold_v"].values + + bursts = ft.detect_bursts(isis, isi_types, fast_tr_v, fast_tr_t, slow_tr_v, slow_tr_t, + thr_v, tol, pause_cost) + + return np.array(bursts) + + def burst_metrics(self): + """Find bursts and return max "burstiness" index (normalized max rate in burst vs out). + + Returns + ------- + max_burstiness_index : max "burstiness" index across detected bursts + num_bursts : number of bursts detected + """ + + burst_info = self._process_bursts() + + if burst_info.shape[0] > 0: + return burst_info[:, 0].max(), burst_info.shape[0] + else: + return 0., 0 + + def delay_metrics(self): + """Calculates ratio of latency to dominant time constant of rise before spike + + Returns + ------- + delay_ratio : ratio of latency to tau (higher means more delay) + tau : dominant time constant of rise before spike + """ + + if len(self._spikes_df) == 0: + logging.info("No spikes available for delay calculation") + return 0., 0. + start = self.start + spike_time = self._spikes_df["threshold_t"].values[0] + + tau = ft.fit_prespike_time_constant(self.v, self.t, start, spike_time) + latency = spike_time - start + + delay_ratio = latency / tau + return delay_ratio, tau + + def _get_baseline_voltage(self): + v = self.v + t = self.t + filter_frequency = 1. # in kHz + + # Look at baseline interval before start if start is defined + if self.start is not None: + return ft.average_voltage(v, t, self.start - self.baseline_interval, self.start) + + # Otherwise try to find an interval where things are pretty flat + dv = ft.calculate_dvdt(v, t, filter_frequency) + non_flat_points = np.flatnonzero(np.abs(dv >= self.baseline_detect_thresh)) + flat_intervals = t[non_flat_points[1:]] - t[non_flat_points[:-1]] + long_flat_intervals = np.flatnonzero(flat_intervals >= self.baseline_interval) + if long_flat_intervals.size > 0: + interval_index = long_flat_intervals[0] + 1 + baseline_end_time = t[non_flat_points[interval_index]] + return ft.average_voltage(v, t, baseline_end_time - self.baseline_interval, + baseline_end_time) + else: + logging.info("Could not find sufficiently flat interval for automatic baseline voltage", RuntimeWarning) + return np.nan + + def voltage_deflection(self, deflect_type=None): + """Measure deflection (min or max, between start and end if specified). + + Parameters + ---------- + deflect_type : measure minimal ('min') or maximal ('max') voltage deflection + If not specified, it will check to see if the current (i) is positive or negative + between start and end, then choose 'max' or 'min', respectively + If the current is not defined, it will default to 'min'. + + Returns + ------- + deflect_v : peak + deflect_index : index of peak deflection + """ + + deflect_dispatch = { + "min": np.argmin, + "max": np.argmax, + } + + start = self.start + if not start: + start = 0 + start_index = ft.find_time_index(self.t, start) + + end = self.end + if not end: + end = self.t[-1] + end_index = ft.find_time_index(self.t, end) + + + if deflect_type is None: + if self.i is not None: + halfway_index = ft.find_time_index(self.t, (end - start) / 2. + start) + if self.i[halfway_index] >= 0: + deflect_type = "max" + else: + deflect_type = "min" + else: + deflect_type = "min" + + deflect_func = deflect_dispatch[deflect_type] + + v_window = self.v[start_index:end_index] + deflect_index = deflect_func(v_window) + start_index + + return self.v[deflect_index], deflect_index + + def stimulus_amplitude(self): + """ """ + if self.stimulus_amplitude_calculator is not None: + return self.stimulus_amplitude_calculator(self) + else: + return np.nan + + def estimate_time_constant(self): + """Calculate the membrane time constant by fitting the voltage response with a + single exponential. + + Returns + ------- + tau : membrane time constant in seconds + """ + + # Assumes this is being done on a hyperpolarizing step + v_peak, peak_index = self.voltage_deflection("min") + v_baseline = self.sweep_feature("v_baseline") + + if self.start: + start_index = ft.find_time_index(self.t, self.start) + else: + start_index = 0 + + frac = 0.1 + search_result = np.flatnonzero(self.v[start_index:] <= frac * (v_peak - v_baseline) + v_baseline) + if not search_result.size: + raise ft.FeatureError("could not find interval for time constant estimate") + fit_start = self.t[search_result[0] + start_index] + fit_end = self.t[peak_index] + + a, inv_tau, y0 = ft.fit_membrane_time_constant(self.v, self.t, fit_start, fit_end) + + return 1. / inv_tau + + def estimate_sag(self, peak_width=0.005): + """Calculate the sag in a hyperpolarizing voltage response. + + Parameters + ---------- + peak_width : window width to get more robust peak estimate in sec (default 0.005) + + Returns + ------- + sag : fraction that membrane potential relaxes back to baseline + """ + + t = self.t + v = self.v + + start = self.start + if not start: + start = 0 + + end = self.end + if not end: + end = self.t[-1] + + v_peak, peak_index = self.voltage_deflection("min") + v_peak_avg = ft.average_voltage(v, t, start=t[peak_index] - peak_width / 2., + end=t[peak_index] + peak_width / 2.) + v_baseline = self.sweep_feature("v_baseline") + v_steady = ft.average_voltage(v, t, start=end - self.baseline_interval, end=end) + sag = (v_peak_avg - v_steady) / (v_peak_avg - v_baseline) + return sag + + def spikes(self): + """Get all features for each spike as a list of records.""" + return self._spikes_df.to_dict('records') + + def spike_feature(self, key, include_clipped=False, force_exclude_clipped=False): + """Get specified feature for every spike. + + Parameters + ---------- + key : feature name + include_clipped: return values for every identified spike, even when clipping means they will be incorrect/undefined + + Returns + ------- + spike_feature_values : ndarray of features for each spike + """ + + if not hasattr(self, "_spikes_df"): + raise AttributeError("EphysSweepFeatureExtractor instance attribute with spike information does not exist yet - have spikes been processed?") + + if len(self._spikes_df) == 0: + return np.array([]) + + if key not in self._spikes_df.columns: + raise KeyError("requested feature '{:s}' not available".format(key)) + + values = self._spikes_df[key].values + + if include_clipped and force_exclude_clipped: + raise ValueError("include_clipped and force_exclude_clipped cannot both be true") + + if not include_clipped and self.is_spike_feature_affected_by_clipping(key): + values = values[~self._spikes_df["clipped"].values] + elif force_exclude_clipped: + values = values[~self._spikes_df["clipped"].values] + + return values + + def is_spike_feature_affected_by_clipping(self, key): + return key in self._affected_by_clipping + + def spike_feature_keys(self): + """Get list of every available spike feature.""" + return self._spikes_df.columns.values.tolist() + + def sweep_feature(self, key, allow_missing=False): + """Get sweep-level feature (`key`). + + Parameters + ---------- + key : name of sweep-level feature + allow_missing : return np.nan if key is missing for sweep (default False) + + Returns + ------- + sweep_feature : sweep-level feature value + """ + + on_request_dispatch = { + "v_baseline": self._get_baseline_voltage, + "tau": self.estimate_time_constant, + "sag": self.estimate_sag, + "peak_deflect": self.voltage_deflection, + "stim_amp": self.stimulus_amplitude, + } + + if allow_missing and key not in self._sweep_features and key not in on_request_dispatch: + return np.nan + elif key not in self._sweep_features and key not in on_request_dispatch: + raise KeyError("requested feature '{:s}' not available".format(key)) + + if key not in self._sweep_features and key in on_request_dispatch: + fn = on_request_dispatch[key] + if fn is not None: + self._sweep_features[key] = fn() + else: + raise KeyError("requested feature '{:s}' not defined".format(key)) + + return self._sweep_features[key] + + def process_new_spike_feature(self, feature_name, feature_func, affected_by_clipping=False): + """Add new spike-level feature calculation function + + The function should take this sweep extractor as its argument. Its results + can be accessed by calling the method spike_feature(<feature_name>). + """ + + if feature_name in self._spikes_df.columns: + raise KeyError("Feature {:s} already exists for sweep".format(feature_name)) + + self._spikes_df[feature_name] = feature_func(self) + + if affected_by_clipping: + self._affected_by_clipping.append(feature_name) + + def process_new_sweep_feature(self, feature_name, feature_func): + """Add new sweep-level feature calculation function + + The function should take this sweep extractor as its argument. Its results + can be accessed by calling the method sweep_feature(<feature_name>). + """ + + if feature_name in self._sweep_features: + raise KeyError("Feature {:s} already exists for sweep".format(feature_name)) + + self._sweep_features[feature_name] = feature_func(self) + + def set_stimulus_amplitude_calculator(self, function): + self.stimulus_amplitude_calculator = function + + def sweep_feature_keys(self): + """Get list of every available sweep-level feature.""" + return self._sweep_features.keys() + + def as_dict(self): + """Create dict of features and spikes.""" + output_dict = self._sweep_features.copy() + output_dict["spikes"] = self.spikes() + if self.id is not None: + output_dict["id"] = self.id + return output_dict + + +class EphysSweepSetFeatureExtractor: + def __init__(self, t_set=None, v_set=None, i_set=None, start=None, end=None, + filter=10., dv_cutoff=20., max_interval=0.005, min_height=2., + min_peak=-30., thresh_frac=0.05, baseline_interval=0.1, + baseline_detect_thresh=0.3, id_set=None): + """Initialize EphysSweepSetFeatureExtractor object. + + Parameters + ---------- + t_set : list of ndarray of times in seconds + v_set : list of ndarray of voltages in mV + i_set : list of ndarray of currents in pA + start : start of time window for feature analysis (optional, can be list) + end : end of time window for feature analysis (optional, can be list) + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dv_cutoff : minimum dV/dt to qualify as a spike in V/s (optional, default 20) + max_interval : maximum acceptable time between start of spike and time of peak in sec (optional, default 0.005) + min_height : minimum acceptable height from threshold to peak in mV (optional, default 2) + min_peak : minimum acceptable absolute peak level in mV (optional, default -30) + thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) + baseline_interval: interval length for baseline voltage calculation (before start if start is defined, default 0.1) + baseline_detect_thresh : dV/dt threshold for evaluating flatness of baseline region (optional, default 0.3) + """ + + if t_set is not None and v_set is not None: + self._set_sweeps(t_set, v_set, i_set, start, end, filter, dv_cutoff, max_interval, + min_height, min_peak, thresh_frac, baseline_interval, + baseline_detect_thresh, id_set) + else: + self._sweeps = None + + @classmethod + def from_sweeps(cls, sweep_list): + """Initialize EphysSweepSetFeatureExtractor object with a list of pre-existing + sweep feature extractor objects. + """ + + obj = cls() + obj._sweeps = sweep_list + return obj + + def _set_sweeps(self, t_set, v_set, i_set, start, end, filter, dv_cutoff, max_interval, + min_height, min_peak, thresh_frac, baseline_interval, + baseline_detect_thresh, id_set): + if type(t_set) != list: + raise ValueError("t_set must be a list") + + if type(v_set) != list: + raise ValueError("v_set must be a list") + + if i_set is not None and type(i_set) != list: + raise ValueError("i_set must be a list") + + if len(t_set) != len(v_set): + raise ValueError("t_set and v_set must have the same number of items") + + if i_set and len(t_set) != len(i_set): + raise ValueError("t_set and i_set must have the same number of items") + + if id_set is None: + id_set = range(len(t_set)) + if len(id_set) != len(t_set): + raise ValueError("t_set and id_set must have the same number of items") + + sweeps = [] + if i_set is None: + i_set = [None] * len(t_set) + + if type(start) is not list: + start = [start] * len(t_set) + end = [end] * len(t_set) + + sweeps = [ EphysSweepFeatureExtractor(t, v, i, start, end, + filter=filter, dv_cutoff=dv_cutoff, + max_interval=max_interval, + min_height=min_height, min_peak=min_peak, + thresh_frac=thresh_frac, + baseline_interval=baseline_interval, + baseline_detect_thresh=baseline_detect_thresh, + id=sid) \ + for t, v, i, start, end, sid in zip(t_set, v_set, i_set, start, end, id_set) ] + + self._sweeps = sweeps + + def sweeps(self): + """Get list of EphysSweepFeatureExtractor objects.""" + return self._sweeps + + def process_spikes(self): + """Analyze spike features for all sweeps.""" + for sweep in self._sweeps: + sweep.process_spikes() + + def sweep_features(self, key, allow_missing=False): + """Get nparray of sweep-level feature (`key`) for all sweeps + + Parameters + ---------- + key : name of sweep-level feature + allow_missing : return np.nan if key is missing for sweep (default False) + + Returns + ------- + sweep_feature : nparray of sweep-level feature values + """ + + return np.array([swp.sweep_feature(key, allow_missing) for swp in self._sweeps]) + + def spike_feature_averages(self, key): + """Get nparray of average spike-level feature (`key`) for all sweeps""" + return np.array([swp.spike_feature(key).mean() for swp in self._sweeps]) + + +class EphysCellFeatureExtractor: + # Class constants for specific processing + SUBTHRESH_MAX_AMP = 0 + SAG_TARGET = -100. + + def __init__(self, ramps_ext, short_squares_ext, long_squares_ext, subthresh_min_amp=-100): + """Initialize EphysCellFeatureExtractor object from EphysSweepSetExtractors for + ramp, short square, and long square sweeps. + + Parameters + ---------- + dataset : NwbDataSet + ramps_ext : EphysSweepSetFeatureExtractor prepared with ramp sweeps + short_squares_ext : EphysSweepSetFeatureExtractor prepared with short square sweeps + long_squares_ext : EphysSweepSetFeatureExtractor prepared with long square sweeps + """ + + self._ramps_ext = ramps_ext + self._short_squares_ext = short_squares_ext + self._long_squares_ext = long_squares_ext + + self._subthresh_min_amp = subthresh_min_amp + + self._features = { + "ramps": {}, + "short_squares": {}, + "long_squares": {}, + } + + self._spiking_long_squares_ext = None + self._subthreshold_long_squares_ext = None + self._subthreshold_membrane_property_ext = None + + + def process(self, keys=None): + """Processes features. Can take a specific key (or set of keys) to do a subset of processing.""" + + dispatch = { + "ramps": self._analyze_ramps, + "short_squares": self._analyze_short_squares, + "long_squares": self._analyze_long_squares, + "long_squares_spiking": self._analyze_long_squares_spiking, + } + + if keys is None: + keys = list(dispatch.keys()) + + if type(keys) is not list: + keys = list(keys) + + for k in [j for j in keys if j in dispatch]: + dispatch[k]() + + def _analyze_ramps(self): + ext = self._ramps_ext + ext.process_spikes() + + self._all_ramps_ext = ext + + # pull out the spiking sweeps + spiking_sweeps = [ sweep for sweep in self._ramps_ext.sweeps() if sweep.sweep_feature("avg_rate") > 0 ] + ext = EphysSweepSetFeatureExtractor.from_sweeps(spiking_sweeps) + self._ramps_ext = ext + + self._features["ramps"]["spiking_sweeps"] = ext.sweeps() + + def ramps_features(self, all=False): + if all: + return self._all_ramps_ext + else: + return self._ramps_ext + + def _analyze_short_squares(self): + ext = self._short_squares_ext + ext.process_spikes() + + # Need to count how many had spikes at each amplitude; find most; ties go to lower amplitude + spiking_sweeps = [sweep for sweep in ext.sweeps() if sweep.sweep_feature("avg_rate") > 0] + + if len(spiking_sweeps) == 0: + raise ft.FeatureError("No spiking short square sweeps, cannot compute cell features.") + + most_common = Counter(map(_short_step_stim_amp, spiking_sweeps)).most_common() + common_amp, common_count = most_common[0] + for c in most_common[1:]: + if c[1] < common_count: + break + if c[0] < common_amp: + common_amp = c[0] + + self._features["short_squares"]["stimulus_amplitude"] = common_amp + ext = EphysSweepSetFeatureExtractor.from_sweeps([sweep for sweep in spiking_sweeps if _short_step_stim_amp(sweep) == common_amp]) + self._short_squares_ext = ext + + self._features["short_squares"]["common_amp_sweeps"] = ext.sweeps() + for s in self._features["short_squares"]["common_amp_sweeps"]: + s.set_stimulus_amplitude_calculator(_short_step_stim_amp) + + def short_squares_features(self): + return self._short_squares_ext + + def _analyze_long_squares(self): + self._analyze_long_squares_spiking() + self._analyze_long_squares_subthreshold() + + def _analyze_long_squares_spiking(self, force_reprocess=False): + if not force_reprocess and self._spiking_long_squares_ext: + return + + ext = self._long_squares_ext + ext.process_spikes() + self._features["long_squares"]["sweeps"] = ext.sweeps() + for s in self._features["long_squares"]["sweeps"]: + s.set_stimulus_amplitude_calculator(_step_stim_amp) + + spiking_indexes = np.flatnonzero(ext.sweep_features("avg_rate")) + + if len(spiking_indexes) == 0: + raise ft.FeatureError("No spiking long square sweeps, cannot compute cell features.") + + amps = ext.sweep_features("stim_amp")#self.long_squares_stim_amps() + min_index = np.argmin(amps[spiking_indexes]) + rheobase_index = spiking_indexes[min_index] + rheobase_i = _step_stim_amp(ext.sweeps()[rheobase_index]) + + self._features["long_squares"]["rheobase_extractor_index"] = rheobase_index + self._features["long_squares"]["rheobase_i"] = rheobase_i + self._features["long_squares"]["rheobase_sweep"] = ext.sweeps()[rheobase_index] + spiking_sweeps = [sweep for sweep in ext.sweeps() if sweep.sweep_feature("avg_rate") > 0] + self._spiking_long_squares_ext = EphysSweepSetFeatureExtractor.from_sweeps(spiking_sweeps) + self._features["long_squares"]["spiking_sweeps"] = self._spiking_long_squares_ext.sweeps() + + self._features["long_squares"]["fi_fit_slope"] = fit_fi_slope(self._spiking_long_squares_ext) + + + def _analyze_long_squares_subthreshold(self): + ext = self._long_squares_ext + subthresh_sweeps = [sweep for sweep in ext.sweeps() if sweep.sweep_feature("avg_rate") == 0] + subthresh_ext = EphysSweepSetFeatureExtractor.from_sweeps(subthresh_sweeps) + self._subthreshold_long_squares_ext = subthresh_ext + + if len(subthresh_ext.sweeps()) == 0: + raise ft.FeatureError("No subthreshold long square sweeps, cannot evaluate cell features.") + + peaks = subthresh_ext.sweep_features("peak_deflect") + sags = subthresh_ext.sweep_features("sag") + sag_eval_levels = np.array([sweep.voltage_deflection()[0] for sweep in subthresh_ext.sweeps()]) + target_level = self.SAG_TARGET + closest_index = np.argmin(np.abs(sag_eval_levels - target_level)) + self._features["long_squares"]["sag"] = sags[closest_index] + self._features["long_squares"]["vm_for_sag"] = sag_eval_levels[closest_index] + self._features["long_squares"]["subthreshold_sweeps"] = subthresh_ext.sweeps() + for s in self._features["long_squares"]["subthreshold_sweeps"]: + s.set_stimulus_amplitude_calculator(_step_stim_amp) + + logging.debug("subthresh_sweeps: %d", len(subthresh_sweeps)) + calc_subthresh_sweeps = [sweep for sweep in subthresh_sweeps if + sweep.sweep_feature("stim_amp") < self.SUBTHRESH_MAX_AMP and + sweep.sweep_feature("stim_amp") > self._subthresh_min_amp] + + logging.debug("calc_subthresh_sweeps: %d", len(calc_subthresh_sweeps)) + calc_subthresh_ext = EphysSweepSetFeatureExtractor.from_sweeps(calc_subthresh_sweeps) + self._subthreshold_membrane_property_ext = calc_subthresh_ext + self._features["long_squares"]["subthreshold_membrane_property_sweeps"] = calc_subthresh_ext.sweeps() + self._features["long_squares"]["input_resistance"] = input_resistance(calc_subthresh_ext) + self._features["long_squares"]["tau"] = membrane_time_constant(calc_subthresh_ext) + self._features["long_squares"]["v_baseline"] = np.nanmean(ext.sweep_features("v_baseline")) + + def long_squares_features(self, option=None): + option_table = { + "spiking": self._spiking_long_squares_ext, + "subthreshold": self._subthreshold_long_squares_ext, + "subthreshold_membrane_property": self._subthreshold_membrane_property_ext, + } + if option: + return option_table[option] + + return self._long_squares_ext + + def long_squares_stim_amps(self, option=None): + option_table = { + "spiking": self._spiking_long_squares_ext, + "subthreshold": self._subthreshold_long_squares_ext, + "subthreshold_membrane_property": self._subthreshold_membrane_property_ext, + } + if option: + ext = option_table[option] + else: + ext = self._long_squares_ext + + return np.array(map(_step_stim_amp, ext.sweeps())) + + def cell_features(self): + return self._features + + def as_dict(self): + """Create dict of cell features.""" + + # get shallow copies of the sub-type dictionaries + out = { + "long_squares": self._features["long_squares"].copy(), + "short_squares": self._features["short_squares"].copy(), + "ramps": self._features["ramps"].copy(), + } + + # convert feature extractor lists to sweep dictionarsweep extract lists + ls_sweeps = [ s.as_dict() for s in out["long_squares"]["sweeps"] ] + ls_spike_sweeps = [ s.as_dict() for s in out["long_squares"]["spiking_sweeps"] ] + rheo_sweep = out["long_squares"]["rheobase_sweep"].as_dict() + ls_sub_sweeps = [ s.as_dict() for s in out["long_squares"]["subthreshold_sweeps"] ] + ls_sub_mem_sweeps = [ s.as_dict() for s in out["long_squares"]["subthreshold_membrane_property_sweeps"] ] + ss_sweeps = [ s.as_dict() for s in out["short_squares"]["common_amp_sweeps"] ] + ramp_sweeps = [ s.as_dict() for s in out["ramps"]["spiking_sweeps"] ] + + out["long_squares"]["sweeps"] = ls_sweeps + out["long_squares"]["spiking_sweeps"] = ls_spike_sweeps + out["long_squares"]["subthreshold_sweeps"] = ls_sub_sweeps + out["long_squares"]["subthreshold_membrane_property_sweeps"] = ls_sub_mem_sweeps + out["long_squares"]["rheobase_sweep"] = rheo_sweep + out["short_squares"]["common_amp_sweeps"] = ss_sweeps + out["ramps"]["spiking_sweeps"] = ramp_sweeps + + return out + + +def input_resistance(ext): + """Estimate input resistance in MOhms, assuming all sweeps in passed extractor + are hyperpolarizing responses.""" + + sweeps = ext.sweeps() + if not sweeps: + raise ft.FeatureError("no sweeps available for input resistance calculation") + + v_vals = [] + i_vals = [] + for sweep in sweeps: + if sweep.i is None: + raise ft.FeatureError("cannot calculate input resistance: i not defined for a sweep") + + v_peak, min_index = sweep.voltage_deflection('min') + v_vals.append(v_peak) + i_vals.append(sweep.i[min_index]) + + v = np.array(v_vals) + i = np.array(i_vals) + + if len(v) == 1: + # If there's just one sweep, we'll have to use its own baseline to estimate + # the input resistance + v = np.append(v, sweeps[0].sweep_feature("v_baseline")) + i = np.append(i, 0.) + + A = np.vstack([i, np.ones_like(i)]).T + m, c = np.linalg.lstsq(A, v)[0] + + return m * 1e3 + + +def membrane_time_constant(ext): + """Average the membrane time constant values estimated from each sweep in passed extractor.""" + + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy") + avg_tau = np.nanmean(ext.sweep_features("tau")) + return avg_tau + + +def fit_fi_slope(ext): + """Fit the rate and stimulus amplitude to a line and return the slope of the fit.""" + if len(ext.sweeps()) < 2: + raise ft.FeatureError("Cannot fit f-I curve slope with less than two suprathreshold sweeps") + + x = np.array(list(map(_step_stim_amp, ext.sweeps()))) + y = ext.sweep_features("avg_rate") + + A = np.vstack([x, np.ones_like(x)]).T + + m, c = np.linalg.lstsq(A, y)[0] + return m + + +def reset_long_squares_start(when): + global LONG_SQUARES_START, LONG_SQUARES_END + delta = LONG_SQUARES_END - LONG_SQUARES_START + LONG_SQUARES_START = when + LONG_SQUARES_END = when + delta + + +def cell_extractor_for_nwb(dataset, ramps, short_squares, long_squares, subthresh_min_amp=-100): + """Initialize EphysCellFeatureExtractor object from NWB data set + + Parameters + ---------- + dataset : NwbDataSet + ramps : list of sweep numbers of ramp sweeps + short_squares : list of sweep numbers of short square sweeps + long_squares : list of sweep numbers of long square sweeps + """ + + if len(short_squares) == 0: + raise ft.FeatureError("no short square sweep numbers provided") + if len(ramps) == 0: + raise ft.FeatureError("no ramp sweep numbers provided") + if len(long_squares) == 0: + raise ft.FeatureError("no long_square sweep numbers provided") + + ramps_ext = extractor_for_nwb_sweeps(dataset, ramps, fixed_start=RAMPS_START) + + temp_short_sq_ext = extractor_for_nwb_sweeps(dataset, short_squares) + t_set = [s.t for s in temp_short_sq_ext.sweeps()] + v_set = [s.v for s in temp_short_sq_ext.sweeps()] + cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters(v_set, t_set, + SHORT_SQUARES_WINDOW_START, + SHORT_SQUARES_WINDOW_END) + + thresh_frac = max(thresh_frac, 0.1) + + short_squares_ext = extractor_for_nwb_sweeps(dataset, short_squares, + dv_cutoff=cutoff, thresh_frac=thresh_frac) + long_squares_ext = extractor_for_nwb_sweeps(dataset, long_squares, + fixed_start=LONG_SQUARES_START, + fixed_end=LONG_SQUARES_END) + + return EphysCellFeatureExtractor(ramps_ext, short_squares_ext, long_squares_ext, subthresh_min_amp) + + +def extractor_for_nwb_sweeps(dataset, sweep_numbers, + fixed_start=None, fixed_end=None, + dv_cutoff=20., thresh_frac=0.05): + v_set = [] + t_set = [] + i_set = [] + + start = [] + end = [] + + for sweep_number in sweep_numbers: + data = dataset.get_sweep(sweep_number) + v = data['response'] * 1e3 # mV + i = data['stimulus'] * 1e12 # pA + hz = data['sampling_rate'] + dt = 1. / hz + t = np.arange(0, len(v)) * dt # sec + + s, e = dt * np.array(data['index_range']) + v_set.append(v) + i_set.append(i) + t_set.append(t) + start.append(s) + end.append(e) + + if fixed_start and not fixed_end: + start = [fixed_start] * len(end) + elif fixed_start and fixed_end: + start = fixed_start + end = fixed_end + + return EphysSweepSetFeatureExtractor(t_set, v_set, i_set, start=start, end=end, + dv_cutoff=dv_cutoff, thresh_frac=thresh_frac, + id_set=sweep_numbers) + + +def _step_stim_amp(sweep): + t_index = ft.find_time_index(sweep.t, sweep.start) + return sweep.i[t_index + 1] + + +def _short_step_stim_amp(sweep): + t_index = ft.find_time_index(sweep.t, sweep.start) + return sweep.i[t_index + 1:].max() diff --git a/ephys/ephys_features.py b/ephys/ephys_features.py new file mode 100644 index 0000000000..de1984578f --- /dev/null +++ b/ephys/ephys_features.py @@ -0,0 +1,1191 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import warnings +import logging +import numpy as np +import scipy.signal as signal +from scipy.optimize import curve_fit +from functools import partial + +def detect_putative_spikes(v, t, start=None, end=None, filter=10., dv_cutoff=20.): + """Perform initial detection of spikes and return their indexes. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + start : start of time window for spike detection (optional) + end : end of time window for spike detection (optional) + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dv_cutoff : minimum dV/dt to qualify as a spike in V/s (optional, default 20) + dvdt : pre-calculated time-derivative of voltage (optional) + + Returns + ------- + putative_spikes : numpy array of preliminary spike indexes + """ + + if not isinstance(v, np.ndarray): + raise TypeError("v is not an np.ndarray") + + if not isinstance(t, np.ndarray): + raise TypeError("t is not an np.ndarray") + + if v.shape != t.shape: + raise FeatureError("Voltage and time series do not have the same dimensions") + + if start is None: + start = t[0] + + if end is None: + end = t[-1] + + start_index = find_time_index(t, start) + end_index = find_time_index(t, end) + v_window = v[start_index:end_index + 1] + t_window = t[start_index:end_index + 1] + + dvdt = calculate_dvdt(v_window, t_window, filter) + + # Find positive-going crossings of dV/dt cutoff level + putative_spikes = np.flatnonzero(np.diff(np.greater_equal(dvdt, dv_cutoff).astype(int)) == 1) + + if len(putative_spikes) <= 1: + # Set back to original index space (not just window) + return np.array(putative_spikes) + start_index + + # Only keep spike times if dV/dt has dropped all the way to zero between putative spikes + putative_spikes = [putative_spikes[0]] + [s for i, s in enumerate(putative_spikes[1:]) + if np.any(dvdt[putative_spikes[i]:s] < 0)] + + # Set back to original index space (not just window) + return np.array(putative_spikes) + start_index + + +def find_peak_indexes(v, t, spike_indexes, end=None): + """Find indexes of spike peaks. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + spike_indexes : numpy array of preliminary spike indexes + end : end of time window for spike detection (optional) + """ + + if not end: + end = t[-1] + end_index = find_time_index(t, end) + + spks_and_end = np.append(spike_indexes, end_index) + peak_indexes = [np.argmax(v[spk:next]) + spk for spk, next in + zip(spks_and_end[:-1], spks_and_end[1:])] + + return np.array(peak_indexes) + + +def filter_putative_spikes(v, t, spike_indexes, peak_indexes, min_height=2., + min_peak=-30., filter=10., dvdt=None): + """Filter out events that are unlikely to be spikes based on: + * Voltage failing to go down between peak and the next spike's threshold + * Height (threshold to peak) + * Absolute peak level + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + spike_indexes : numpy array of preliminary spike indexes + peak_indexes : numpy array of indexes of spike peaks + min_height : minimum acceptable height from threshold to peak in mV (optional, default 2) + min_peak : minimum acceptable absolute peak level in mV (optional, default -30) + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dvdt : pre-calculated time-derivative of voltage (optional) + + Returns + ------- + spike_indexes : numpy array of threshold indexes + peak_indexes : numpy array of peak indexes + """ + + if not spike_indexes.size or not peak_indexes.size: + return np.array([]), np.array([]) + + if dvdt is None: + dvdt = calculate_dvdt(v, t, filter) + + diff_mask = [np.any(dvdt[peak_ind:spike_ind] < 0) + for peak_ind, spike_ind + in zip(peak_indexes[:-1], spike_indexes[1:])] + peak_indexes = peak_indexes[np.array(diff_mask + [True])] + spike_indexes = spike_indexes[np.array([True] + diff_mask)] + + peak_level_mask = v[peak_indexes] >= min_peak + spike_indexes = spike_indexes[peak_level_mask] + peak_indexes = peak_indexes[peak_level_mask] + + height_mask = (v[peak_indexes] - v[spike_indexes]) >= min_height + spike_indexes = spike_indexes[height_mask] + peak_indexes = peak_indexes[height_mask] + + return spike_indexes, peak_indexes + + +def find_upstroke_indexes(v, t, spike_indexes, peak_indexes, filter=10., dvdt=None): + """Find indexes of maximum upstroke of spike. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + spike_indexes : numpy array of preliminary spike indexes + peak_indexes : numpy array of indexes of spike peaks + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dvdt : pre-calculated time-derivative of voltage (optional) + + Returns + ------- + upstroke_indexes : numpy array of upstroke indexes + + """ + + if dvdt is None: + dvdt = calculate_dvdt(v, t, filter) + + upstroke_indexes = [np.argmax(dvdt[spike:peak]) + spike for spike, peak in + zip(spike_indexes, peak_indexes)] + + return np.array(upstroke_indexes) + + +def refine_threshold_indexes(v, t, upstroke_indexes, thresh_frac=0.05, filter=10., dvdt=None): + """Refine threshold detection of previously-found spikes. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + upstroke_indexes : numpy array of indexes of spike upstrokes (for threshold target calculation) + thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dvdt : pre-calculated time-derivative of voltage (optional) + + Returns + ------- + threshold_indexes : numpy array of threshold indexes + """ + + if not upstroke_indexes.size: + return np.array([]) + + if dvdt is None: + dvdt = calculate_dvdt(v, t, filter) + + avg_upstroke = dvdt[upstroke_indexes].mean() + target = avg_upstroke * thresh_frac + + upstrokes_and_start = np.append(np.array([0]), upstroke_indexes) + threshold_indexes = [] + for upstk, upstk_prev in zip(upstrokes_and_start[1:], upstrokes_and_start[:-1]): + potential_indexes = np.flatnonzero(dvdt[upstk:upstk_prev:-1] <= target) + if not potential_indexes.size: + # couldn't find a matching value for threshold, + # so just going to the start of the search interval + threshold_indexes.append(upstk_prev) + else: + threshold_indexes.append(upstk - potential_indexes[0]) + + return np.array(threshold_indexes) + + +def check_thresholds_and_peaks(v, t, spike_indexes, peak_indexes, upstroke_indexes, end=None, + max_interval=0.005, thresh_frac=0.05, filter=10., dvdt=None, + tol=1.0): + """Validate thresholds and peaks for set of spikes + + Check that peaks and thresholds for consecutive spikes do not overlap + Spikes with overlapping thresholds and peaks will be merged. + + Check that peaks and thresholds for a given spike are not too far apart. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + spike_indexes : numpy array of spike indexes + peak_indexes : numpy array of indexes of spike peaks + upstroke_indexes : numpy array of indexes of spike upstrokes + max_interval : maximum allowed time between start of spike and time of peak in sec (default 0.005) + thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dvdt : pre-calculated time-derivative of voltage (optional) + tol : tolerance for returning to threshold in mV (optional, default 1) + + Returns + ------- + spike_indexes : numpy array of modified spike indexes + peak_indexes : numpy array of modified spike peak indexes + upstroke_indexes : numpy array of modified spike upstroke indexes + clipped : numpy array of clipped status of spikes + """ + + if not end: + end = t[-1] + + overlaps = np.flatnonzero(spike_indexes[1:] <= peak_indexes[:-1] + 1) + if overlaps.size: + spike_mask = np.ones_like(spike_indexes, dtype=bool) + spike_mask[overlaps + 1] = False + spike_indexes = spike_indexes[spike_mask] + + peak_mask = np.ones_like(peak_indexes, dtype=bool) + peak_mask[overlaps] = False + peak_indexes = peak_indexes[peak_mask] + + upstroke_mask = np.ones_like(upstroke_indexes, dtype=bool) + upstroke_mask[overlaps] = False + upstroke_indexes = upstroke_indexes[upstroke_mask] + + # Validate that peaks don't occur too long after the threshold + # If they do, try to re-find threshold from the peak + too_long_spikes = [] + for i, (spk, peak) in enumerate(zip(spike_indexes, peak_indexes)): + if t[peak] - t[spk] >= max_interval: + logging.info("Need to recalculate threshold-peak pair that exceeds maximum allowed interval ({:f} s)".format(max_interval)) + too_long_spikes.append(i) + + if too_long_spikes: + if dvdt is None: + dvdt = calculate_dvdt(v, t, filter) + avg_upstroke = dvdt[upstroke_indexes].mean() + target = avg_upstroke * thresh_frac + drop_spikes = [] + for i in too_long_spikes: + # First guessing that threshold is wrong and peak is right + peak = peak_indexes[i] + t_0 = find_time_index(t, t[peak] - max_interval) + below_target = np.flatnonzero(dvdt[upstroke_indexes[i]:t_0:-1] <= target) + if not below_target.size: + # Now try to see if threshold was right but peak was wrong + + # Find the peak in a window twice the size of our allowed window + spike = spike_indexes[i] + t_0 = find_time_index(t, t[spike] + 2 * max_interval) + new_peak = np.argmax(v[spike:t_0]) + spike + + # If that peak is okay (not outside the allowed window, not past the next spike) + # then keep it + if t[new_peak] - t[spike] < max_interval and \ + (i == len(spike_indexes) - 1 or t[new_peak] < t[spike_indexes[i + 1]]): + peak_indexes[i] = new_peak + else: + # Otherwise, log and get rid of the spike + logging.info("Could not redetermine threshold-peak pair - dropping that pair") + drop_spikes.append(i) +# raise FeatureError("Could not redetermine threshold") + else: + spike_indexes[i] = upstroke_indexes[i] - below_target[0] + + + if drop_spikes: + spike_indexes = np.delete(spike_indexes, drop_spikes) + peak_indexes = np.delete(peak_indexes, drop_spikes) + upstroke_indexes = np.delete(upstroke_indexes, drop_spikes) + + # Check that last spike was not cut off too early by end of stimulus + # by checking that the membrane potential returned to at least the threshold + # voltage - otherwise, drop it + clipped = np.zeros_like(spike_indexes, dtype=bool) + end_index = find_time_index(t, end) + if len(spike_indexes) > 0 and not np.any(v[peak_indexes[-1]:end_index + 1] <= v[spike_indexes[-1]] + tol): + logging.debug("Failed to return to threshold voltage + tolerance (%.2f) after last spike (min %.2f) - marking last spike as clipped", v[spike_indexes[-1]] + tol, v[peak_indexes[-1]:end_index + 1].min()) + clipped[-1] = True + + return spike_indexes, peak_indexes, upstroke_indexes, clipped + + +def find_trough_indexes(v, t, spike_indexes, peak_indexes, clipped=None, end=None): + """ + Find indexes of minimum voltage (trough) between spikes. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + spike_indexes : numpy array of spike indexes + peak_indexes : numpy array of spike peak indexes + end : end of time window (optional) + + Returns + ------- + trough_indexes : numpy array of threshold indexes + """ + + if not spike_indexes.size or not peak_indexes.size: + return np.array([]) + + if clipped is None: + clipped = np.zeros_like(spike_indexes, dtype=bool) + + if end is None: + end = t[-1] + end_index = find_time_index(t, end) + + trough_indexes = np.zeros_like(spike_indexes, dtype=float) + trough_indexes[:-1] = [v[peak:spk].argmin() + peak for peak, spk + in zip(peak_indexes[:-1], spike_indexes[1:])] + + if clipped[-1]: + # If last spike is cut off by the end of the window, trough is undefined + trough_indexes[-1] = np.nan + else: + trough_indexes[-1] = v[peak_indexes[-1]:end_index].argmin() + peak_indexes[-1] + + # nwg - trying to remove this next part for now - can't figure out if this will be needed with new "clipped" method + + # If peak is the same point as the trough, drop that point +# trough_indexes = trough_indexes[np.where(peak_indexes[:len(trough_indexes)] != trough_indexes)] + + return trough_indexes + + +def find_downstroke_indexes(v, t, peak_indexes, trough_indexes, clipped=None, filter=10., dvdt=None): + """Find indexes of minimum voltage (troughs) between spikes. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + peak_indexes : numpy array of spike peak indexes + trough_indexes : numpy array of threshold indexes + clipped: boolean array - False if spike not clipped by edge of window + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) + dvdt : pre-calculated time-derivative of voltage (optional) + + Returns + ------- + downstroke_indexes : numpy array of downstroke indexes + """ + + if not trough_indexes.size: + return np.array([]) + + if dvdt is None: + dvdt = calculate_dvdt(v, t, filter) + + if clipped is None: + clipped = np.zeros_like(peak_indexes, dtype=bool) + + if len(peak_indexes) < len(trough_indexes): + raise FeatureError("Cannot have more troughs than peaks") +# Taking this out...with clipped info, should always have the same number of points +# peak_indexes = peak_indexes[:len(trough_indexes)] + + valid_peak_indexes = peak_indexes[~clipped].astype(int) + valid_trough_indexes = trough_indexes[~clipped].astype(int) + + downstroke_indexes = np.zeros_like(peak_indexes) * np.nan + downstroke_index_values = [np.argmin(dvdt[peak:trough]) + peak for peak, trough + in zip(valid_peak_indexes, valid_trough_indexes)] + downstroke_indexes[~clipped] = downstroke_index_values + + return downstroke_indexes + + +def find_widths(v, t, spike_indexes, peak_indexes, trough_indexes, clipped=None): + """Find widths at half-height for spikes. + + Widths are only returned when heights are defined + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + spike_indexes : numpy array of spike indexes + peak_indexes : numpy array of spike peak indexes + trough_indexes : numpy array of trough indexes + + Returns + ------- + widths : numpy array of spike widths in sec + """ + + if not spike_indexes.size or not peak_indexes.size: + return np.array([]) + + if len(spike_indexes) < len(trough_indexes): + raise FeatureError("Cannot have more troughs than spikes") + + if clipped is None: + clipped = np.zeros_like(spike_indexes, dtype=bool) + + use_indexes = ~np.isnan(trough_indexes) + use_indexes[clipped] = False + + heights = np.zeros_like(trough_indexes) * np.nan + heights[use_indexes] = v[peak_indexes[use_indexes]] - v[trough_indexes[use_indexes].astype(int)] + + width_levels = np.zeros_like(trough_indexes) * np.nan + width_levels[use_indexes] = heights[use_indexes] / 2. + v[trough_indexes[use_indexes].astype(int)] + + thresh_to_peak_levels = np.zeros_like(trough_indexes) * np.nan + thresh_to_peak_levels[use_indexes] = (v[peak_indexes[use_indexes]] - v[spike_indexes[use_indexes]]) / 2. + v[spike_indexes[use_indexes]] + + # Some spikes in burst may have deep trough but short height, so can't use same + # definition for width + width_levels[width_levels < v[spike_indexes]] = \ + thresh_to_peak_levels[width_levels < v[spike_indexes]] + + width_starts = np.zeros_like(trough_indexes) * np.nan + width_starts[use_indexes] = np.array([pk - np.flatnonzero(v[pk:spk:-1] <= wl)[0] if + np.flatnonzero(v[pk:spk:-1] <= wl).size > 0 else np.nan for pk, spk, wl + in zip(peak_indexes[use_indexes], spike_indexes[use_indexes], width_levels[use_indexes])]) + width_ends = np.zeros_like(trough_indexes) * np.nan + + width_ends[use_indexes] = np.array([pk + np.flatnonzero(v[pk:tr] <= wl)[0] if + np.flatnonzero(v[pk:tr] <= wl).size > 0 else np.nan for pk, tr, wl + in zip(peak_indexes[use_indexes], trough_indexes[use_indexes].astype(int), width_levels[use_indexes])]) + + missing_widths = np.isnan(width_starts) | np.isnan(width_ends) + widths = np.zeros_like(width_starts, dtype=np.float64) + widths[~missing_widths] = t[width_ends[~missing_widths].astype(int)] - \ + t[width_starts[~missing_widths].astype(int)] + if any(missing_widths): + widths[missing_widths] = np.nan + + return widths + + +def analyze_trough_details(v, t, spike_indexes, peak_indexes, clipped=None, end=None, filter=10., + heavy_filter=1., term_frac=0.01, adp_thresh=0.5, tol=0.5, + flat_interval=0.002, adp_max_delta_t=0.005, adp_max_delta_v=10., dvdt=None): + """Analyze trough to determine if an ADP exists and whether the reset is a 'detour' or 'direct' + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + spike_indexes : numpy array of spike indexes + peak_indexes : numpy array of spike peak indexes + end : end of time window (optional) + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (default 1) + heavy_filter : lower cutoff frequency for 4-pole low-pass Bessel filter in kHz (default 1) + thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) + adp_thresh: minimum dV/dt in V/s to exceed to be considered to have an ADP (optional, default 1.5) + tol : tolerance for evaluating whether Vm drops appreciably further after end of spike (default 1.0 mV) + flat_interval: if the trace is flat for this duration, stop looking for an ADP (default 0.002 s) + adp_max_delta_t: max possible ADP delta t (default 0.005 s) + adp_max_delta_v: max possible ADP delta v (default 10 mV) + dvdt : pre-calculated time-derivative of voltage (optional) + + Returns + ------- + isi_types : numpy array of isi reset types (direct or detour) + fast_trough_indexes : numpy array of indexes at the start of the trough (i.e. end of the spike) + adp_indexes : numpy array of adp indexes (np.nan if there was no ADP in that ISI + slow_trough_indexes : numpy array of indexes at the minimum of the slow phase of the trough + (if there wasn't just a fast phase) + """ + + if end is None: + end = t[-1] + end_index = find_time_index(t, end) + + if clipped is None: + clipped = np.zeros_like(peak_indexes) + + # Can't evaluate for spikes that are clipped by the window + orig_len = len(peak_indexes) + valid_spike_indexes = spike_indexes[~clipped] + valid_peak_indexes = peak_indexes[~clipped] + + if dvdt is None: + dvdt = calculate_dvdt(v, t, filter) + + dvdt_hvy = calculate_dvdt(v, t, heavy_filter) + + # Writing as for loop - see if I can vectorize any later + fast_trough_indexes = [] + adp_indexes = [] + slow_trough_indexes = [] + isi_types = [] + + update_clipped = [] + for peak, next_spk in zip(valid_peak_indexes, np.append(valid_spike_indexes[1:], end_index)): + downstroke = dvdt[peak:next_spk].argmin() + peak + target = term_frac * dvdt[downstroke] + + terminated_points = np.flatnonzero(dvdt[downstroke:next_spk] >= target) + if terminated_points.size: + terminated = terminated_points[0] + downstroke + update_clipped.append(False) + else: + logging.debug("Could not identify fast trough - marking spike as clipped") + isi_types.append(np.nan) + fast_trough_indexes.append(np.nan) + adp_indexes.append(np.nan) + slow_trough_indexes.append(np.nan) + update_clipped.append(True) + continue + + # Could there be an ADP? + adp_index = np.nan + dv_over_thresh = np.flatnonzero(dvdt_hvy[terminated:next_spk] >= adp_thresh) + if dv_over_thresh.size: + cross = dv_over_thresh[0] + terminated + + # only want to look for ADP before things get pretty flat + # otherwise, could just pick up random transients long after the spike + if t[cross] - t[terminated] < flat_interval: + # Going back up fast, but could just be going into another spike + # so need to check for a reversal (zero-crossing) in dV/dt + zero_return_vals = np.flatnonzero(dvdt_hvy[cross:next_spk] <= 0) + if zero_return_vals.size: + putative_adp_index = zero_return_vals[0] + cross + min_index = v[putative_adp_index:next_spk].argmin() + putative_adp_index + if (v[putative_adp_index] - v[min_index] >= tol and + v[putative_adp_index] - v[terminated] <= adp_max_delta_v and + t[putative_adp_index] - t[terminated] <= adp_max_delta_t): + adp_index = putative_adp_index + slow_phase_min_index = min_index + isi_type = "detour" + + if np.isnan(adp_index): + v_term = v[terminated] + min_index = v[terminated:next_spk].argmin() + terminated + if v_term - v[min_index] >= tol: + # dropped further after end of spike -> detour reset + isi_type = "detour" + slow_phase_min_index = min_index + else: + isi_type = "direct" + + isi_types.append(isi_type) + fast_trough_indexes.append(terminated) + adp_indexes.append(adp_index) + if isi_type == "detour": + slow_trough_indexes.append(slow_phase_min_index) + else: + slow_trough_indexes.append(np.nan) + + # If we had to kick some spikes out before, need to add nans at the end + output = [] + output.append(np.array(isi_types)) + for d in (fast_trough_indexes, adp_indexes, slow_trough_indexes): + output.append(np.array(d, dtype=float)) + + if orig_len > len(isi_types): + extra = np.zeros(orig_len - len(isi_types)) * np.nan + output = tuple((np.append(o, extra) for o in output)) + + # The ADP and slow trough for the last spike in a train are not reliably + # calculated, and usually extreme when wrong, so we will NaN them out. + # + # Note that this will result in a 0 value when delta V or delta T is + # calculated, which may not be strictly accurate to the trace, but the + # magnitude of the difference will be less than in many of the erroneous + # cases seen otherwise + + output[2][-1] = np.nan # ADP + output[3][-1] = np.nan # slow trough + + clipped[~clipped] = update_clipped + return output, clipped + + +def find_time_index(t, t_0): + """Find the index value of a given time (t_0) in a time series (t).""" + + t_gte = np.flatnonzero(t >= t_0) + if not t_gte.size: + raise FeatureError("Could not find given time in time vector") + + return t_gte[0] + + +def calculate_dvdt(v, t, filter=None): + """Low-pass filters (if requested) and differentiates voltage by time. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default None) + + Returns + ------- + dvdt : numpy array of time-derivative of voltage (V/s = mV/ms) + """ + + if has_fixed_dt(t) and filter: + delta_t = t[1] - t[0] + sample_freq = 1. / delta_t + filt_coeff = (filter * 1e3) / (sample_freq / 2.) # filter kHz -> Hz, then get fraction of Nyquist frequency + if filt_coeff < 0 or filt_coeff >= 1: + raise ValueError("bessel coeff ({:f}) is outside of valid range [0,1); cannot filter sampling frequency {:.1f} kHz with cutoff frequency {:.1f} kHz.".format(filt_coeff, sample_freq / 1e3, filter)) + b, a = signal.bessel(4, filt_coeff, "low") + v_filt = signal.filtfilt(b, a, v, axis=0) + dv = np.diff(v_filt) + else: + dv = np.diff(v) + + dt = np.diff(t) + dvdt = 1e-3 * dv / dt # in V/s = mV/ms + + # Remove nan values (in case any dt values == 0) + dvdt = dvdt[~np.isnan(dvdt)] + + return dvdt + + +def get_isis(t, spikes): + """Find interspike intervals in sec between spikes (as indexes).""" + + if len(spikes) <= 1: + return np.array([]) + + return t[spikes[1:]] - t[spikes[:-1]] + + +def average_voltage(v, t, start=None, end=None): + """Calculate average voltage between start and end. + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + start : start of time window for spike detection (optional, default None) + end : end of time window for spike detection (optional, default None) + + Returns + ------- + v_avg : average voltage + """ + + if start is None: + start = t[0] + + if end is None: + end = t[-1] + + start_index = find_time_index(t, start) + end_index = find_time_index(t, end) + + return v[start_index:end_index].mean() + + +def adaptation_index(isis): + """Calculate adaptation index of `isis`.""" + if len(isis) == 0: + return np.nan + + return norm_diff(isis) + + +def latency(t, spikes, start): + """Calculate time to the first spike.""" + + if len(spikes) == 0: + return np.nan + + if start is None: + start = t[0] + + return t[spikes[0]] - start + + +def average_rate(t, spikes, start, end): + """Calculate average firing rate during interval between `start` and `end`. + + Parameters + ---------- + t : numpy array of times in seconds + spikes : numpy array of spike indexes + start : start of time window for spike detection + end : end of time window for spike detection + + Returns + ------- + avg_rate : average firing rate in spikes/sec + """ + + if start is None: + start = t[0] + + if end is None: + end = t[-1] + + spikes_in_interval = [spk for spk in spikes if t[spk] >= start and t[spk] <= end] + avg_rate = len(spikes_in_interval) / (end - start) + return avg_rate + + +def norm_diff(a): + """Calculate average of (a[i] - a[i+1]) / (a[i] + a[i+1]).""" + + if len(a) <= 1: + return np.nan + + a = a.astype(float) + if np.allclose((a[1:] + a[:-1]), 0.): + return 0. + norm_diffs = (a[1:] - a[:-1]) / (a[1:] + a[:-1]) + norm_diffs[(a[1:] == 0) & (a[:-1] == 0)] = 0. + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy") + avg = np.nanmean(norm_diffs) + return avg + + +def norm_sq_diff(a): + """Calculate average of (a[i] - a[i+1])^2 / (a[i] + a[i+1])^2.""" + if len(a) <= 1: + return np.nan + + a = a.astype(float) + norm_sq_diffs = np.square((a[1:] - a[:-1])) / np.square((a[1:] + a[:-1])) + return norm_sq_diffs.mean() + + +def has_fixed_dt(t): + """Check that all time intervals are identical.""" + dt = np.diff(t) + return np.allclose(dt, np.ones_like(dt) * dt[0]) + + +def fit_membrane_time_constant(v, t, start, end, min_rsme=1e-4): + """Fit an exponential to estimate membrane time constant between start and end + + Parameters + ---------- + v : numpy array of voltages in mV + t : numpy array of times in seconds + start : start of time window for exponential fit + end : end of time window for exponential fit + min_rsme: minimal acceptable root mean square error (default 1e-4) + + Returns + ------- + a, inv_tau, y0 : Coeffients of equation y0 + a * exp(-inv_tau * x) + + returns np.nan for values if fit fails + """ + + start_index = find_time_index(t, start) + end_index = find_time_index(t, end) + + guess = (v[start_index] - v[end_index], 50., v[end_index]) + t_window = (t[start_index:end_index] - t[start_index]).astype(np.float64) + v_window = v[start_index:end_index].astype(np.float64) + try: + popt, pcov = curve_fit(_exp_curve, t_window, v_window, p0=guess) + except RuntimeError: + logging.info("Curve fit for membrane time constant failed") + return np.nan, np.nan, np.nan + + pred = _exp_curve(t_window, *popt) + rsme = np.sqrt(np.mean(pred - v_window)) + if rsme > min_rsme: + logging.debug("Curve fit for membrane time constant did not meet RSME standard") + return np.nan, np.nan, np.nan + + return popt + + +def detect_pauses(isis, isi_types, cost_weight=1.0): + """Determine which ISIs are "pauses" in ongoing firing. + + Pauses are unusually long ISIs with a "detour reset" among "direct resets". + + Parameters + ---------- + isis : numpy array of interspike intervals + isi_types : numpy array of interspike interval types ('direct' or 'detour') + cost_weight : weight for cost function for calling an ISI a pause + Higher cost weights lead to fewer ISIs identified as pauses. The cost function + also depends on the difference between the duration of the "pause" ISIs and the + average duration and standard deviation of "non-pause" ISIs. + + Returns + ------- + pauses : numpy array of indices corresponding to pauses in `isis` + """ + + if len(isis) != len(isi_types): + raise FeatureError("Wrong number of ISIs") + + if not np.any(isi_types == "direct"): + # Need some direct-type firing to have pauses + return np.array([]) + + detour_candidates = [i for i, isi_type in enumerate(isi_types) if isi_type == "detour"] + median_direct = np.median(isis[isi_types == "direct"]) + direct_candidates = [i for i, isi_type in enumerate(isi_types) if isi_type == "direct" and isis[i] > 3 * median_direct] + candidates = detour_candidates + direct_candidates + + if not candidates: + return np.array([]) + + pause_list = np.array([], dtype=int) + all_cv = isis.std() / isis.mean() + best_net = 0 + for i in candidates: + temp_pause_list = np.append(pause_list, i) + non_pause_isis = np.delete(isis, temp_pause_list) + pause_isis = isis[temp_pause_list] + if len(non_pause_isis) < 2: + break + cv = non_pause_isis.std() / non_pause_isis.mean() + benefit = all_cv - cv + cost = np.sum(non_pause_isis.std() / np.abs(non_pause_isis.mean() - pause_isis)) + cost *= cost_weight + net = benefit - cost + if net > 0 and net < best_net: + break + if net > best_net: + best_net = net + pause_list = np.append(pause_list, i) + + if best_net <= 0: + pause_list = np.array([]) + + return np.sort(pause_list) + + +def detect_bursts(isis, isi_types, fast_tr_v, fast_tr_t, slow_tr_v, slow_tr_t, + thr_v, tol=0.5, pause_cost=1.0): + """Detect bursts in spike train. + + Parameters + ---------- + isis : numpy array of n interspike intervals + isi_types : numpy array of n interspike interval types + fast_tr_v : numpy array of fast trough voltages for the n + 1 spikes of the train + fast_tr_t : numpy array of fast trough times for the n + 1 spikes of the train + slow_tr_v : numpy array of slow trough voltages for the n + 1 spikes of the train + slow_tr_t : numpy array of slow trough times for the n + 1 spikes of the train + thr_v : numpy array of threshold voltages for the n + 1 spikes of the train + tol : tolerance for the difference in slow trough voltages and thresholds (default 0.5 mV) + Used to identify "delay" interspike intervals that occur within a burst + + Returns + ------- + bursts : list of bursts + Each item in list is a tuple of the form (burst_index, start, end) where `burst_index` + is a comparison index between the highest instantaneous rate within the burst vs + the highest instantaneous rate outside the burst. `start` is the index of the first + ISI of the burst, and `end` is the ISI index immediately following the burst. + """ + + if len(isis) != len(isi_types): + raise FeatureError("Wrong number of ISIs") + + if len(isis) < 2: # can't determine burstiness for a single ISI + return np.array([]) + + fast_tr_v = fast_tr_v[:-1] + fast_tr_t = fast_tr_t[:-1] + slow_tr_v = slow_tr_v[:-1] + slow_tr_t = slow_tr_t[:-1] + + isi_types = np.array(isi_types) # don't want to change the actual isi types data + + # Burst transitions can't be at "pause"-like ISIs + pauses = detect_pauses(isis, isi_types, cost_weight=pause_cost).astype(int) + isi_types[pauses] = "pauselike" + + if not (np.any(isi_types == "direct") and np.any(isi_types == "detour")): + # no candidates that could be bursts + return np.array([]) + + # Want to catch special case of detour in the middle of a large burst where + # the slow trough value is higher than the previous spike's threshold + isi_types[(thr_v[:-1] < (slow_tr_v + tol)) & (isi_types == "detour")] = "midburst" + + # Find transitions from direct -> detour and vice versa for burst boundaries + into_burst = np.array([i + 1 for i, (prev, cur) in + enumerate(zip(isi_types[:-1], isi_types[1:])) if + cur == "direct" and prev == "detour"], + dtype=int) + if isi_types[0] == "direct": + into_burst = np.append(np.array([0]), into_burst) + + drop_into = [] + out_of_burst = [] + for j, (into, next) in enumerate(zip(into_burst, np.append(into_burst[1:], len(isis)))): + for i, isi in enumerate(isi_types[into + 1:next]): + if isi == "detour": + out_of_burst.append(i + into + 1) + break + elif isi == "pauselike": + drop_into.append(j) + break + mask = np.ones_like(into_burst, dtype=bool) + mask[drop_into] = False + into_burst = into_burst[mask] + + out_of_burst = np.array(out_of_burst) + if len(out_of_burst) == len(into_burst) - 1: + out_of_burst = np.append(out_of_burst, len(isi_types)) + + if not (into_burst.size or out_of_burst.size): + return np.array([]) + + if len(into_burst) != len(out_of_burst): + raise FeatureError("Inconsistent burst boundary identification") + + inout_pairs = zip(into_burst, out_of_burst) + delta_t = slow_tr_t - fast_tr_t + + scores = _score_burst_set(inout_pairs, isis, delta_t) + best_score = np.mean(scores) + worst = np.argmin(scores) + test_bursts = list(inout_pairs) + del test_bursts[worst] + while len(test_bursts) > 0: + scores = _score_burst_set(test_bursts, isis, delta_t) + if np.mean(scores) > best_score: + best_score = np.mean(scores) + inout_pairs = list(test_bursts) + worst = np.argmin(scores) + del test_bursts[worst] + else: + break + + if best_score < 0: + return np.array([]) + + bursts = [] + for i, (into, outof) in enumerate(inout_pairs): + if i == len(inout_pairs) - 1: # last burst to evaluate + if outof <= len(isis) - 1: # are there spikes left after the burst? + metric = _burstiness_index(isis[into:outof], isis[outof:]) + elif i == 0: # was this the first one (and there weren't spikes after)? + metric = _burstiness_index(isis[into:outof], isis[:into]) + else: + prev_burst = inout_pairs[i - 1] + metric = _burstiness_index(isis[into:outof], isis[prev_burst[1]:into]) + else: + next_burst = inout_pairs[i + 1] + metric = _burstiness_index(isis[into:outof], isis[outof:next_burst[0]]) + bursts.append((metric, into, outof)) + + return bursts + + +def fit_prespike_time_constant(v, t, start, spike_time, dv_limit=-0.001, tau_limit=0.3): + """Finds the dominant time constant of the pre-spike rise in voltage + + Parameters + ---------- + v : numpy array of voltage time series in mV + t : numpy array of times in seconds + start : start of voltage rise (seconds) + spike_time : time of first spike (seconds) + dv_limit : dV/dt cutoff (default -0.001) + Shortens fit window if rate of voltage drop exceeds this limit + tau_limit : upper bound for slow time constant (seconds, default 0.3) + If the slower time constant of a double-exponential fit is twice that of the faster + and exceeds this limit, the faster one will be considered the dominant one + + Returns + ------- + tau : dominant time constant (seconds) + """ + + start_index = find_time_index(t, start) + end_index = find_time_index(t, spike_time) + if end_index <= start_index: + raise FeatureError("Start for pre-spike time constant fit cannot be after the spike time.") + + v_slice = v[start_index:end_index] + t_slice = t[start_index:end_index] + + # Solve linear version with single exponential first to guess at the time constant + y0 = v_slice.max() + 5e-6 # set y0 slightly above v_slice maximum + y = -v_slice + y0 + y = np.log(y) + + dy = calculate_dvdt(y, t_slice, filter=1.0) + + # End the fit interval if the voltage starts dropping + new_end_indexes = np.flatnonzero(dy <= dv_limit) + cross_limit = 0.0005 # sec + if not new_end_indexes.size or t_slice[new_end_indexes[0]] - t_slice[0] < cross_limit: + # either never crosses or crosses too early + new_end_index = len(v_slice) + else: + new_end_index = new_end_indexes[0] + + K, A_log = np.polyfit(t_slice[:new_end_index] - t_slice[0], y[:new_end_index], 1) + A = np.exp(A_log) + + dbl_exp_y0 = partial(_dbl_exp_fit, y0) + try: + popt, pcov = curve_fit(dbl_exp_y0, t_slice - t_slice[0], v_slice, p0=(-A / 2.0, -1.0 / K, -A / 2.0, -1.0 / K)) + except RuntimeError: + # Fall back to single fit + tau = -1.0 / K + return tau + + # Find dominant time constant + if popt[1] < popt[3]: + faster_weight, faster_tau, slower_weight, slower_tau = popt + else: + slower_weight, slower_tau, faster_weight, faster_tau = popt + + # These are all empirical values + if np.abs(faster_weight) > np.abs(slower_weight): + tau = faster_tau + elif (slower_tau - faster_tau) / slower_tau <= 0.1: # close enough; just use slower + tau = slower_tau + elif slower_tau > tau_limit and slower_weight / faster_weight < 2.0: + tau = faster_tau + else: + tau = slower_tau + + return tau + + +def estimate_adjusted_detection_parameters(v_set, t_set, interval_start, interval_end, filter=10): + """ + Estimate adjusted values for spike detection by analyzing a period when the voltage + changes quickly but passively (due to strong current stimulation), which can result + in spurious spike detection results. + + Parameters + ---------- + v_set : list of numpy arrays of voltage time series in mV + t_set : list of numpy arrays of times in seconds + interval_start : start of analysis interval (sec) + interval_end : end of analysis interval (sec) + + Returns + ------- + new_dv_cutoff : adjusted dv/dt cutoff (V/s) + new_thresh_frac : adjusted fraction of avg upstroke to find threshold + """ + + if type(v_set) is not list: + v_set = list(v_set) + + if type(t_set) is not list: + t_set = list(t_set) + + if len(v_set) != len(t_set): + raise FeatureError("t_set and v_set must be lists of equal size") + + if len(v_set) == 0: + raise FeatureError("t_set and v_set are empty") + + start_index = find_time_index(t_set[0], interval_start) + end_index = find_time_index(t_set[0], interval_end) + + maxes = [] + ends = [] + dv_set = [] + for v, t in zip(v_set, t_set): + dv = calculate_dvdt(v, t, filter) + dv_set.append(dv) + maxes.append(dv[start_index:end_index].max()) + ends.append(dv[end_index]) + + maxes = np.array(maxes) + ends = np.array(ends) + + cutoff_adj_factor = 1.1 + thresh_frac_adj_factor = 1.2 + + new_dv_cutoff = np.median(maxes) * cutoff_adj_factor + min_thresh = np.median(ends) * thresh_frac_adj_factor + + all_upstrokes = np.array([]) + for v, t, dv in zip(v_set, t_set, dv_set): + putative_spikes = detect_putative_spikes(v, t, dv_cutoff=new_dv_cutoff, filter=filter) + peaks = find_peak_indexes(v, t, putative_spikes) + putative_spikes, peaks = filter_putative_spikes(v, t, putative_spikes, peaks, dvdt=dv, filter=filter) + upstrokes = find_upstroke_indexes(v, t, putative_spikes, peaks, dvdt=dv) + if upstrokes.size: + all_upstrokes = np.append(all_upstrokes, dv[upstrokes]) + new_thresh_frac = min_thresh / all_upstrokes.mean() + + return new_dv_cutoff, new_thresh_frac + + +def _score_burst_set(bursts, isis, delta_t, c_n=0.1, c_tx=0.01): + in_burst = np.zeros_like(isis, dtype=bool) + for b in bursts: + in_burst[b[0]:b[1]] = True + + # If all ISIs are part of a burst, give it a bad score + if len(isis[~in_burst]) == 0: + return [-1e12] * len(bursts) + + delta_frac = delta_t / isis + + scores = [] + for b in bursts: + score = _burstiness_index(isis[b[0]:b[1]], isis[~in_burst]) # base score + if b[1] < len(delta_t): + score -= c_tx * (1. / (delta_frac[b[1]])) # cost for starting a burst + if b[0] > 0: + score -= c_tx * (1. / delta_frac[b[0] - 1]) # cost for ending a burst + score -= c_n * (b[1] - b[0] - 1) # cost for extending a burst + scores.append(score) + + return scores + + +def _burstiness_index(in_burst_isis, out_burst_isis): + burst_rate = 1. / in_burst_isis.min() + out_rate = 1. / out_burst_isis.min() + return (burst_rate - out_rate) / (burst_rate + out_rate) + + +def _exp_curve(x, a, inv_tau, y0): + return y0 + a * np.exp(-inv_tau * x) + + +def _dbl_exp_fit(y0, x, A1, tau1, A2, tau2): + penalty = 0 + if tau1 < 0 or tau2 < 0: + penalty = 1e6 + return y0 + A1 * np.exp(-x / tau1) + A2 * np.exp(-x / tau2) + penalty + + +class FeatureError(Exception): + """Generic Python-exception-derived object raised by feature detection functions.""" + pass diff --git a/ephys/extract_cell_features.py b/ephys/extract_cell_features.py new file mode 100644 index 0000000000..5fcdd4acce --- /dev/null +++ b/ephys/extract_cell_features.py @@ -0,0 +1,230 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import logging +import six +from . import ephys_extractor as efex +from . import ephys_features as ft + +HERO_MIN_AMP_OFFSET = 39.0 +HERO_MAX_AMP_OFFSET = 61.0 + +SHORT_SQUARE_TYPES = ["Short Square", + "Short Square - Triple", + "Short Square - Hold -60mv", + "Short Square - Hold -70mv", + "Short Square - Hold -80mv"] + +SHORT_SQUARE_THRESH_FRAC_FLOOR = 0.1 + +MEAN_FEATURES = [ "upstroke_downstroke_ratio", "peak_v", "peak_t", "trough_v", "trough_t", + "fast_trough_v", "fast_trough_t", "slow_trough_v", "slow_trough_t", + "threshold_v", "threshold_i", "threshold_t", "peak_v", "peak_t" ] + + +def extract_sweep_features(data_set, sweeps_by_type): + # extract sweep-level features + sweep_features = {} + + for stimulus_type, sweep_numbers in six.iteritems(sweeps_by_type): + logging.debug("%s:%s" % (stimulus_type, ','.join(map(str, sweep_numbers)))) + + if stimulus_type == "Short Square - Triple": + tmp_ext = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers) + t_set = [s.t for s in tmp_ext.sweeps()] + v_set = [s.v for s in tmp_ext.sweeps()] + + # IT-14530 + # triple-sweeps to use different window + win_start = efex.SHORT_SQUARE_TRIPLE_WINDOW_START + win_end = efex.SHORT_SQUARE_TRIPLE_WINDOW_END + cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters( + v_set, t_set, win_start, win_end) + thresh_frac = max(SHORT_SQUARE_THRESH_FRAC_FLOOR, thresh_frac) + + fex = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers, + dv_cutoff=cutoff, thresh_frac=thresh_frac) + elif stimulus_type in SHORT_SQUARE_TYPES: + tmp_ext = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers) + t_set = [s.t for s in tmp_ext.sweeps()] + v_set = [s.v for s in tmp_ext.sweeps()] + + win_start = efex.SHORT_SQUARES_WINDOW_START + win_end = efex.SHORT_SQUARES_WINDOW_END + cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters( + v_set, t_set, win_start, win_end) + thresh_frac = max(SHORT_SQUARE_THRESH_FRAC_FLOOR, thresh_frac) + + fex = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers, + dv_cutoff=cutoff, thresh_frac=thresh_frac) + else: + fex = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers) + + fex.process_spikes() + + sweep_features.update({ f.id:f.as_dict() for f in fex.sweeps() }) + + return sweep_features + +# if subthreshold minimum amplitude is known (e.g., for human cells) then +# specify it. otherwise the default value will be used +def extract_cell_features(data_set, + ramp_sweep_numbers, + short_square_sweep_numbers, + long_square_sweep_numbers, + subthresh_min_amp = None): + + if subthresh_min_amp is None: + fex = efex.cell_extractor_for_nwb(data_set, + ramp_sweep_numbers, + short_square_sweep_numbers, + long_square_sweep_numbers) + else: + fex = efex.cell_extractor_for_nwb(data_set, + ramp_sweep_numbers, + short_square_sweep_numbers, + long_square_sweep_numbers, + subthresh_min_amp) + + fex.process() + + cell_features = fex.as_dict() + + # find hero sweep + rheo_amp = cell_features['long_squares']['rheobase_i'] + hero_min, hero_max = rheo_amp + HERO_MIN_AMP_OFFSET, rheo_amp + HERO_MAX_AMP_OFFSET + hero_amp = float("inf") + hero_sweep = None + for sweep in fex.long_squares_features("spiking").sweeps(): + nspikes = len(sweep.spikes()) + amp = sweep.sweep_feature("stim_amp") + + if nspikes > 0 and amp > hero_min and amp < hero_max and amp < hero_amp: + hero_amp = amp + hero_sweep = sweep + + if hero_sweep: + adapt = hero_sweep.sweep_feature("adapt") + latency = hero_sweep.sweep_feature("latency") + mean_isi = hero_sweep.sweep_feature("mean_isi") + else: + raise ft.FeatureError("Could not find hero sweep.") + + # find the mean features of the first spike for the ramps and short squares + ramps_ms0 = mean_features_spike_zero(fex.ramps_features().sweeps()) + ss_ms0 = mean_features_spike_zero(fex.short_squares_features().sweeps()) + + # compute baseline from all long square sweeps + v_baseline = np.mean(fex.long_squares_features().sweep_features('v_baseline')) + + cell_features['long_squares']['v_baseline'] = v_baseline + cell_features['long_squares']['hero_sweep'] = hero_sweep.as_dict() if hero_sweep else None + cell_features["ramps"]["mean_spike_0"] = ramps_ms0 + cell_features["short_squares"]["mean_spike_0"] = ss_ms0 + + return cell_features + +def mean_features_spike_zero(sweeps): + """ Compute mean feature values for the first spike in list of extractors """ + + output = {} + for mf in MEAN_FEATURES: + mfd = [ sweep.spikes()[0][mf] for sweep in sweeps if sweep.sweep_feature("avg_rate") > 0 ] + output[mf] = np.mean(mfd) + return output + +def get_stim_characteristics(i, t, no_test_pulse=False): + ''' + Identify the start time, duration, amplitude, start index, and + end index of a general stimulus. + This assumes that there is a test pulse followed by the stimulus square. + ''' + + di = np.diff(i) + diff_idx = np.flatnonzero(di != 0) + + if len(diff_idx) == 0: + return (None, None, 0.0, None, None) + + # skip the first up/down + idx = 0 if no_test_pulse else 1 + + # shift by one to compensate for diff() + start_idx = diff_idx[idx] + 1 + end_idx = diff_idx[-1] + 1 + + stim_start = float(t[start_idx]) + stim_dur = float(t[end_idx] - t[start_idx]) + stim_amp = float(i[start_idx]) + + return (stim_start, stim_dur, stim_amp, start_idx, end_idx) + +def get_ramp_stim_characteristics(i, t): + ''' Identify the start time and start index of a ramp sweep. ''' + + # Assumes that there is a test pulse followed by the stimulus ramp + di = np.diff(i) + up_idx = np.flatnonzero(di > 0) + + start_idx = up_idx[1] + 1 # shift by one to compensate for diff() + return (t[start_idx], start_idx) + +def get_square_stim_characteristics(i, t, no_test_pulse=False): + ''' + Identify the start time, duration, amplitude, start index, and + end index of a square stimulus. + This assumes that there is a test pulse followed by the stimulus square. + ''' + + di = np.diff(i) + up_idx = np.flatnonzero(di > 0) + down_idx = np.flatnonzero(di < 0) + + idx = 0 if no_test_pulse else 1 + + # second square is the stimulus + if up_idx[idx] < down_idx[idx]: # positive square + start_idx = up_idx[idx] + 1 # shift by one to compensate for diff() + end_idx = down_idx[idx] + 1 + else: # negative square + start_idx = down_idx[idx] + 1 + end_idx = up_idx[idx] + 1 + + stim_start = float(t[start_idx]) + stim_dur = float(t[end_idx] - t[start_idx]) + stim_amp = float(i[start_idx]) + + return (stim_start, stim_dur, stim_amp, start_idx, end_idx) diff --git a/ephys/feature_extractor.py b/ephys/feature_extractor.py new file mode 100644 index 0000000000..48f96304ce --- /dev/null +++ b/ephys/feature_extractor.py @@ -0,0 +1,694 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import sys +import math +import numpy as np +import scipy.signal as signal +import logging + +# Design notes: +# to generate an average feature file, all sweeps must have all features +# to generate a fitness score of a sweep to a feature file,, the sweep +# must have all features in the file. If one is absent, a penalty +# of TODO ??? will be assessed + +# set of features +class EphysFeatures( object ): + def __init__(self, name): + # feature mean and standard deviations + self.mean = {} + self.stdev = {} + + # human-readable names for features + self.glossary = {} + + # table indicating how to score feature + # 'hit' feature exists: + # 'ignore' do nothing + # 'stdev' score is # stdevs from target mean + # 'miss' feature absent: + # 'constant' score = scoring['constant'] + # 'mean_mult' score = mean * scoring['mean_mult'] + # + self.scoring = {} + + self.name = name + + ################################################################ + # ignore scores + ignore_score = { "hit": "ignore" } + self.glossary["n_spikes"] = "Number of spikes" + self.scoring["n_spikes"] = ignore_score + + ################################################################ + # ignore misses + ignore_miss = { "hit":"stdev", "miss":"const", "const":0 } + self.glossary["adapt"] = "Adaptation index" + self.scoring["adapt"] = ignore_miss + self.glossary["latency"] = "Time to first spike (ms)" + self.scoring["latency"] = ignore_miss + + ################################################################ + # base miss off mean + mean_score = { "hit":"stdev", "miss":"mean_mult", "mean_mult":2 } + self.glossary["ISICV"] = "ISI-CV" + self.scoring["ISICV"] = mean_score + + ################################################################ + # normal scoring + normal_score = { "hit":"stdev", "miss":"const", "const":20 } + self.glossary["isi_avg"] = "Average ISI (ms)" + self.scoring["isi_avg"] = ignore_score + self.glossary["doublet"] = "Doublet ISI (ms)" + self.scoring["doublet"] = normal_score + self.glossary["f_fast_ahp"] = "Fast AHP (mV)" + self.scoring["f_fast_ahp"] = normal_score + self.glossary["f_slow_ahp"] = "Slow AHP (mV)" + self.scoring["f_slow_ahp"] = normal_score + self.glossary["f_slow_ahp_time"] = "Slow AHP time" + self.scoring["f_slow_ahp_time"] = normal_score + self.glossary["base_v"] = "Baseline voltage (mV)" + self.scoring["base_v"] = normal_score + #self.glossary["base_v2"] = "Baseline voltage 2 (mV)" + #self.scoring["base_v2"] = normal_score + #self.glossary["base_v3"] = "Baseline voltage 3 (mV)" + #self.scoring["base_v3"] = normal_score + ################################################################ + # per spike scoring + perspike_score = { "hit":"perspike", "miss":"const", "const":20, "skip_last_n":0 } + self.glossary["f_peak"] = "Spike height (mV)" + self.scoring["f_peak"] = perspike_score.copy() + self.glossary["f_trough"] = "Spike depth (mV)" + self.scoring["f_trough"] = perspike_score.copy() + self.scoring["f_trough"]["skip_last_n"] = 1 + # self.glossary["f_w"] = "Spike width at -30 mV (ms)" + # self.scoring["f_w"] = perspike_score.copy() + self.glossary["upstroke"] = "Peak upstroke (mV/ms)" + self.scoring["upstroke"] = perspike_score.copy() + self.glossary["upstroke_v"] = "Vm of peak upstroke (mV)" + self.scoring["upstroke_v"] = perspike_score.copy() + self.glossary["downstroke"] = "Peak downstroke (mV/ms)" + self.scoring["downstroke"] = perspike_score.copy() + self.glossary["downstroke_v"] = "Vm of peak downstroke (mV)" + self.scoring["downstroke_v"] = perspike_score.copy() + self.glossary["threshold"] = "Threshold voltage (mV)" + self.scoring["threshold"] = perspike_score.copy() + self.glossary["width"] = "Spike width at half-max (ms)" + self.scoring["width"] = perspike_score.copy() + self.scoring["width"]["skip_last_n"] = 1 + self.glossary["thresh_ramp"] = "Change in dv/dt over first 5 mV past threshold (mV/ms)" + self.scoring["thresh_ramp"] = perspike_score.copy() + + + ################################################################ + # heavily penalize when there are no spikes + spike_score = { "hit":"stdev", "miss":"const", "const":250 } + self.glossary["rate"] = "Firing rate (Hz)" + self.scoring["rate"] = spike_score + + def print_out(self): + print("Features from " + self.name) + for k in self.mean.keys(): + if k in self.glossary: + st = "%30s = " % self.glossary[k] + if self.mean[k] is not None: + st += "%g" % self.mean[k] + else: + st += "--------" + if k in self.stdev and self.stdev[k] is not None: + st += " +/- %g" % self.stdev[k] + print(st) + + # initialize summary feature set from file + def clone(self, param_dict): + for k in param_dict.keys(): + self.mean[k] = param_dict[k]["mean"] + self.stdev[k] = param_dict[k]["stdev"] + +class EphysFeatureExtractor( object ): + def __init__(self): + # list of feature set instances + self.feature_list = [] + # names of each element in feature list + self.feature_source = [] + # feature set object representing combination of all instances + self.summary = None + + # adds new feature set instance to feature_list + def process_instance(self, name, v, curr, t, onset, dur, stim_name): + feature = EphysFeatures(name) + + ################################################################ + # set stop time -- run until end of stimulus or end of sweep + # comment-out the one of the two approaches + # detect spikes only during stimulus + start = onset + stop = onset + dur + # detect spikes for all of sweep + #start = 0 + #stop = t[-1] + ################################################################ + # pull out spike times + + # calculate the derivative only within target window + # otherwise get spurious detection at ends of stimuli + # filter with 10kHz cutoff if constant 200kHz sample rate (ie experimental trace) + start_idx = np.where(t >= start)[0][0] + stop_idx = np.where(t >= stop)[0][0] + v_target = v[start_idx:stop_idx] + if np.abs(t[1] - t[0] - 5e-6) < 1e-7 and np.var(np.diff(t)) < 1e-6: + b, a = signal.bessel(4, 0.1, "low") + smooth_v = signal.filtfilt(b, a, v_target, axis=0) + dv = np.diff(smooth_v) + else: + dv = np.diff(v_target) + dvdt = dv / (np.diff(t[start_idx:stop_idx]) * 1e3) # in mV/ms + + dv_cutoff = 20 + thresh_pct = 0.05 + spikes = [] + temp_spk_idxs = np.where(np.diff(np.greater_equal(dvdt, dv_cutoff).astype(int)) == 1)[0] # find positive-going crossings of 100 mV/ms + spk_idxs = [] + for i, temp in enumerate(temp_spk_idxs): + if i == 0: + spk_idxs.append(temp) + elif np.any(dvdt[temp_spk_idxs[i - 1]:temp] < 0): + # check if the dvdt has gone back down below zero between presumed spike times + # sometimes the dvdt bobbles around detection threshold and produces spurious guesses at spike times + spk_idxs.append(temp) + spk_idxs += start_idx # set back to the "index space" of the original trace + + # recalculate full dv/dt for feature analysis (vs spike detection) + if np.abs(t[1] - t[0] - 5e-6) < 1e-7 and np.var(np.diff(t)) < 1e-6: + b, a = signal.bessel(4, 0.1, "low") + smooth_v = signal.filtfilt(b, a, v, axis=0) + dv = np.diff(smooth_v) + else: + dv = np.diff(v) + dvdt = dv / (np.diff(t) * 1e3) # in mV/ms + + # First time through, accumulate upstrokes to calculate average threshold target + for spk_n, spk_idx in enumerate(spk_idxs): + # Etay defines spike as time of threshold crossing + spk = {} + + if spk_n < len(spk_idxs) - 1: + next_idx = spk_idxs[spk_n + 1] + else: + next_idx = stop_idx + + if spk_n > 0: + prev_idx = spk_idxs[spk_n - 1] + else: + prev_idx = start_idx + + # Find the peak + peak_idx = np.argmax(v[spk_idx:next_idx]) + spk_idx + + spk["peak_idx"] = peak_idx + spk["f_peak"] = v[peak_idx] + spk["f_peak_i"] = curr[peak_idx] + spk["f_peak_t"] = t[peak_idx] + + # Check if end of stimulus interval cuts off spike - if so, don't process spike + if spk_n == len(spk_idxs) - 1 and peak_idx == next_idx-1: + continue + if spk_idx == peak_idx: + continue # this was bugfix, but why? ramp? + + # Determine maximum upstroke of spike + upstroke_idx = np.argmax(dvdt[spk_idx:peak_idx]) + spk_idx + + spk["upstroke"] = dvdt[upstroke_idx] + if np.isnan(spk["upstroke"]): # sometimes dvdt will be NaN because of multiple cvode points at same time step + close_idx = upstroke_idx + 1 + while (np.isnan(dvdt[close_idx])): + close_idx += 1 + spk["upstroke_idx"] = close_idx + spk["upstroke"] = dvdt[close_idx] + spk["upstroke_v"] = v[close_idx] + spk["upstroke_i"] = curr[close_idx] + spk["upstroke_t"] = t[close_idx] + else: + spk["upstroke_idx"] = upstroke_idx + spk["upstroke_v"] = v[upstroke_idx] + spk["upstroke_i"] = curr[upstroke_idx] + spk["upstroke_t"] = t[upstroke_idx] + + # Preliminarily define threshold where dvdt = 5% * max upstroke + thresh_pct = 0.05 + find_thresh_idxs = np.where(dvdt[prev_idx:upstroke_idx] <= thresh_pct * spk["upstroke"])[0] + if len(find_thresh_idxs) < 1: # Can't find a good threshold value - probably a bad simulation case + # Fall back to the upstroke value + threshold_idx = upstroke_idx + else: + threshold_idx = find_thresh_idxs[-1] + prev_idx + spk["threshold_idx"] = threshold_idx + spk["threshold"] = v[threshold_idx] + spk["threshold_v"] = v[threshold_idx] + spk["threshold_i"] = curr[threshold_idx] + spk["threshold_t"] = t[threshold_idx] + spk["rise_time"] = spk["f_peak_t"] - spk["threshold_t"] + + PERIOD = t[1] - t[0] + width_volts = (v[peak_idx] + v[threshold_idx]) / 2 + recording_width = False + for i in range(threshold_idx, min(len(v), threshold_idx + int(0.001 / PERIOD))): + if not recording_width and v[i] >= width_volts: + recording_width = True + idx0 = i + elif recording_width and v[i] < width_volts: + spk["half_height_width"] = t[i] - t[idx0] + break + # </KEITH> + + # Check for things that are probably not spikes: + # if there is more than 2 ms between the detection event and the peak, don't count it + if t[peak_idx] - t[threshold_idx] > 0.002: + continue + # if the "spike" is less than 2 mV, don't count it + if v[peak_idx] - v[threshold_idx] < 2.0: + continue + # if the absolute value of the peak is less than -30 mV, don't count it + if v[peak_idx] < -30.0: + continue + spikes.append(spk) + + # Refine threshold target based on average of all spikes + if len(spikes) > 0: + threshold_target = np.array([spk["upstroke"] for spk in spikes]).mean() * thresh_pct + + for spk_n, spk in enumerate(spikes): + if spk_n < len(spikes) - 1: + next_idx = spikes[spk_n + 1]["threshold_idx"] + else: + next_idx = stop_idx + + if spk_n > 0: + prev_idx = spikes[spk_n - 1]["peak_idx"] + else: + prev_idx = start_idx + + # Restore variables from before + # peak_idx = spk['peak_idx'] + peak_idx = np.argmax(v[spk['threshold_idx']:next_idx]) + spk['threshold_idx'] + + spk["peak_idx"] = peak_idx + spk["f_peak"] = v[peak_idx] + spk["f_peak_i"] = curr[peak_idx] + spk["f_peak_t"] = t[peak_idx] + + # Determine maximum upstroke of spike + # upstroke_idx = spk['upstroke_idx'] + upstroke_idx = np.argmax(dvdt[spk['threshold_idx']:peak_idx]) + spk['threshold_idx'] + + spk["upstroke"] = dvdt[upstroke_idx] + if np.isnan(spk["upstroke"]): # sometimes dvdt will be NaN because of multiple cvode points at same time step + close_idx = upstroke_idx + 1 + while (np.isnan(dvdt[close_idx])): + close_idx += 1 + spk["upstroke_idx"] = close_idx + spk["upstroke"] = dvdt[close_idx] + spk["upstroke_v"] = v[close_idx] + spk["upstroke_i"] = curr[close_idx] + spk["upstroke_t"] = t[close_idx] + else: + spk["upstroke_idx"] = upstroke_idx + spk["upstroke_v"] = v[upstroke_idx] + spk["upstroke_i"] = curr[upstroke_idx] + spk["upstroke_t"] = t[upstroke_idx] + + # Find threshold based on average target + find_thresh_idxs = np.where(dvdt[prev_idx:upstroke_idx] <= threshold_target)[0] + if len(find_thresh_idxs) < 1: # Can't find a good threshold value - probably a bad simulation case + # Fall back to the upstroke value + threshold_idx = upstroke_idx + else: + threshold_idx = find_thresh_idxs[-1] + prev_idx + spk["threshold_idx"] = threshold_idx + spk["threshold"] = v[threshold_idx] + spk["threshold_v"] = v[threshold_idx] + spk["threshold_i"] = curr[threshold_idx] + spk["threshold_t"] = t[threshold_idx] + + # Define the spike time as threshold time + spk["t_idx"] = threshold_idx + spk["t"] = t[threshold_idx] + + # Save the -30 mV crossing time for backward compatibility with Etay code + overn30_idxs = np.where(v[threshold_idx:peak_idx] >= -30)[0] + if len(overn30_idxs) > 0: + spk["t_idx_n30"] = overn30_idxs[0] + threshold_idx + else: # fall back to threshold definition if spike doesn't cross -30 mV + spk["t_idx_n30"] = threshold_idx + spk["t_n30"] = t[spk["t_idx_n30"]] + + # Figure out initial "slope" of phase plot post-threshold + plus_5_vec = np.where(v[threshold_idx:upstroke_idx] >= spk["threshold"] + 5)[0] + if len(plus_5_vec) > 0: + thresh_plus_5_idx = plus_5_vec[0] + threshold_idx + spk["thresh_ramp"] = dvdt[thresh_plus_5_idx] - dvdt[threshold_idx] + else: + spk["thresh_ramp"] = dvdt[upstroke_idx] - dvdt[threshold_idx] + + # go forward to determine peak downstroke of spike + downstroke_idx = np.argmin(dvdt[peak_idx:next_idx]) + peak_idx + spk["downstroke_idx"] = downstroke_idx + spk["downstroke_v"] = v[downstroke_idx] + spk["downstroke_i"] = curr[downstroke_idx] + spk["downstroke_t"] = t[downstroke_idx] + spk["downstroke"] = dvdt[downstroke_idx] + if np.isnan(spk["downstroke"]): # sometimes dvdt will be NaN because of multiple cvode points at same time step + close_idx = downstroke_idx + 1 + while (np.isnan(dvdt[close_idx])): + close_idx += 1 + spk["downstroke"] = dvdt[close_idx] + + features = {} + feature.mean["base_v"] = v[np.where((t > onset - 0.1) & (t < onset - 0.001))].mean() # baseline voltage, 100ms before stim + feature.mean["spikes"] = spikes + isi_cv = self.isicv(spikes) + if isi_cv is not None: + feature.mean["ISICV"] = isi_cv + n_spikes = len(spikes) + feature.mean["n_spikes"] = n_spikes + feature.mean["rate"] = 1.0 * n_spikes / (stop - start); + feature.mean["adapt"] = self.adaptation_index(spikes, stop) + if len(spikes) > 1: + feature.mean["doublet"] = 1000 * (spikes[1]["t"] - spikes[0]["t"]) + if len(spikes) > 0: + for i, spk in enumerate(spikes): + idx_next = spikes[i + 1]["t_idx"] if i < len(spikes) - 1 else stop_idx + self.calculate_trough(spk, v, curr, t, idx_next) + half_max_v = (spk["f_peak"] - spk["f_trough"]) / 2.0 + spk["f_trough"] + over_half_max_v_idxs = np.where(v[spk["t_idx"]:spk["trough_idx"]] > half_max_v)[0] + if len(over_half_max_v_idxs) > 0: + spk["width"] = 1000. * (t[over_half_max_v_idxs[-1] + spk["t_idx"]] - t[over_half_max_v_idxs[0] + spk["t_idx"]]) + feature.mean["latency"] = 1000. * (spikes[0]["t"] - onset) + feature.mean["latency_n30"] = 1000. * (spikes[0]["t_n30"] - onset) + # extract properties for each spike + isicnt = 0 + isitot = 0 + for i in range(0, len(spikes)-1): + spk = spikes[i] + idx_next = spikes[i+1]["t_idx"] + isitot += spikes[i+1]["t"] - spikes[i]["t"] + isicnt += 1 + if isicnt > 0: + feature.mean["isi_avg"] = 1000 * isitot / isicnt + else: + feature.mean["isi_avg"] = None + # average feature data from individual spikes + # build superset dictionary of possible features + superset = {} + for i in range(len(spikes)): + for k in spikes[i].keys(): + if k not in superset: + superset[k] = k + + for k in superset.keys(): + cnt = 0 + mean = 0 + for i in range(len(spikes)): + if k not in spikes[i]: + continue + mean += float(spikes[i][k]) + cnt += 1.0 + # this shouldn't be possible, but it may be in future version + # so might as well trap for it + if cnt == 0: + continue + mean /= cnt + stdev = 0 + for i in range(len(spikes)): + if k not in spikes[i]: + continue + dif = mean - float(spikes[i][k]) + stdev += dif * dif + stdev = math.sqrt(stdev / cnt) + feature.mean[k] = mean + feature.stdev[k] = stdev + # + self.feature_list.append(feature) + self.feature_source.append(name) + + def isicv(self, spikes): + if len(spikes) < 3: + return None + isi_mean = 0 + lst = [] + for i in range(len(spikes) - 1): + isi = spikes[i+1]["t"] - spikes[i]["t"] + #print("\t%g" % isi) + isi_mean += isi + lst.append(isi) + isi_mean /= 1.0 * len(lst) + #print(isi_mean) + var = 0 + for i in range(len(lst)): + dif = isi_mean - lst[i] + var += dif * dif + var /= len(lst) + #var /= len(lst) - 1 + #print(math.sqrt(var)) + if isi_mean > 0: + return math.sqrt(var) / isi_mean + return None + + def adaptation_index(self, spikes, stim_end): + if len(spikes) < 4: + return None + adi = 0 + cnt = 0 + isi = [] + for i in range(len(spikes)-1): + isi.append(spikes[i+1]["t"] - spikes[i]["t"]) + # act as though time between last spike and stim end is another ISI per Etay's code + # l = stim_end - spikes[-1]["t"] + # if l > 0 and l > isi[-1]: + # isi.append(l) + for i in range(len(isi)-1): + adi += 1.0 * (isi[i+1] - isi[i]) / (isi[i+1] + isi[i]) + cnt += 1 + adi /= cnt + return adi + + ##---------------------------------------------------------------------- + + # trough (AHP) is presently defined as the minimum voltage level + # observed between successive spikes in a burst + # there's too much data to cleanly return it on the stack + # instead, spike table is passed in instead + def calculate_trough(self, spike, v, curr, t, next_idx): + # dt = t[1] - t[0] + peak_idx = spike["peak_idx"] + + if peak_idx >= next_idx: + logging.warning("next index (%d) before peak index (%d) calculating trough" % ( next_idx, peak_idx )) + trough_idx = next_idx + else: + trough_idx = np.argmin(v[peak_idx:next_idx]) + peak_idx + + spike["trough_idx"] = trough_idx + spike["f_trough"] = v[trough_idx] + spike["trough_v"] = v[trough_idx] + spike["trough_t"] = t[trough_idx] + spike["trough_i"] = curr[trough_idx] + + # calculate etay's 'fast' and 'slow' ahp here + if t[peak_idx] + 0.005 >= t[-1]: + five_ms_idx = len(t) - 1 + else: + five_ms_idx = np.where(t >= 0.005 + t[peak_idx])[0][0] # 5ms after peak + + # fast AHP is minimum value occurring w/in 5ms + if five_ms_idx >= next_idx: + five_ms_idx = next_idx + + if peak_idx == five_ms_idx: + fast_idx = next_idx + else: + fast_idx = np.argmin(v[peak_idx:five_ms_idx]) + peak_idx + + spike["f_fast_ahp"] = v[fast_idx] + spike["f_fast_ahp_v"] = v[fast_idx] + spike["f_fast_ahp_i"] = curr[fast_idx] + spike["f_fast_ahp_t"] = t[fast_idx] + + if five_ms_idx == next_idx: + slow_idx = fast_idx + else: + slow_idx = np.argmin(v[five_ms_idx:next_idx]) + five_ms_idx + + spike["f_slow_ahp"] = v[slow_idx] + spike["f_slow_ahp_time"] = (t[slow_idx] - t[peak_idx]) / (t[next_idx] - t[peak_idx]) + spike["f_slow_ahp_t"] = t[slow_idx] + + # initialize summary feature set from file + def push_summary(self, new_summary): + self.summary = new_summary + + # calculate nearness score for feature set X relative to summary + # the nearness score is the sum of squares the features are from + # their target values, in units of standard deviations + # when a feature is absent, the algorithm to determine the + # penalty is stored in the feature itself, and this value + # is calculated then added to the sum + def score_feature_set(self, set_num): + cand = self.feature_list[set_num] + scores = [] + for k in sorted(self.summary.mean.keys()): + if k in self.summary.glossary: + response = self.summary.scoring[k]["hit"] + if response == "ignore": + continue + elif response == "stdev": + mean = self.summary.mean[k] + stdev = self.summary.stdev[k] + assert stdev > 0 + if k in cand.mean and cand.mean[k] is not None: + val = cand.mean[k] + inc = abs(mean - val) / stdev + scores.append(inc) +# print("Hit %s, %g+/-%g (%g) = %g" % (k, mean, stdev, val, inc)) + else: + resp = cand.scoring[k]["miss"] + if resp == "const": + miss = float(cand.scoring[k][resp]) + elif resp == "mean_mult": + miss = mean * float(cand.scoring[k][resp]) + else: + assert False + miss = float(miss) + scores.append(miss) +# print("Missed %s, penalty = %g" % (k, miss)) + elif response == "perspike": + mean = self.summary.mean[k] + stdev = self.summary.stdev[k] + assert stdev > 0 + if k in cand.mean and cand.mean[k] is not None: + val = 0 + n_spikes = len(cand.mean["spikes"]) + skip_last_n = self.summary.scoring[k]["skip_last_n"] + for spike in cand.mean["spikes"][:n_spikes-skip_last_n]: + val += abs(spike[k] - mean) + val /= n_spikes - skip_last_n + inc = val / stdev + scores.append(inc) + else: + resp = cand.scoring[k]["miss"] + if resp == "const": + miss = float(cand.scoring[k][resp]) + elif resp == "mean_mult": + miss = mean * float(cand.scoring[k][resp]) + else: + assert False + miss = float(miss) + scores.append(miss) +# print("Missed %s, penalty = %g" % (k, miss)) + else: + assert False + if abs(sum(scores)) > 1e10: + print(k) + print(self.summary.scoring) + print(self.summary.mean) + print(self.summary.stdev) + print(cand.summary.scoring) + print(cand.summary.mean) + print(cand.summary.stdev) + assert False + return scores + + # create summary of feature instances + # 'summary' is an empty feature object. this must be the same + # class as the other feature objects that are being summarized + def summarize(self, summary): + if len(self.feature_list) == 0: + print("Error -- no features were extracted. Summary impossible") + sys.exit() + # make dummy dict to verify that all feature instances have + # identical features + # only copy features that are in the glossary. some are for + # internal use (eg, t_idx -- time index) and aren't important + # here + superset = {} + for i in range(len(self.feature_list)): + fx = self.feature_list[i] + for k in fx.mean.keys(): + if k in fx.glossary: + superset[k] = k + err = 0 + for k in superset.keys(): + for i in range(len(self.feature_list)): + fx = self.feature_list[i].mean + if k not in fx: + print("Error - feature '%s' not in all data sets" % k) + err += 1 + if err > 0: + return None + # all features must be of the same type + # to ensure this, make programmer specify the type being summarized + self.summary = summary + # now set summary means to zero + for k in fx.keys(): + self.summary.mean[k] = 0 + # now calculate the average of all features + for i in range(len(self.feature_list)): + fx = self.feature_list[i] + for k in fx.mean.keys(): + if k in fx.glossary and fx.mean[k] is not None: + self.summary.mean[k] += fx.mean[k] + self.summary.stdev[k] = 0.0 + # divide out n to get actual mean + for k in fx.mean.keys(): + self.summary.mean[k] /= 1.0 * len(self.feature_list) + # calculate standard deviation + for i in range(len(self.feature_list)): + fx = self.feature_list[i] + for k in fx.mean.keys(): + if k in fx.glossary and fx.mean[k] is not None: + mean = self.summary.mean[k] + dif = mean - fx.mean[k] + self.summary.stdev[k] += dif * dif + # divide out n and take sqrt to get actual stdev + fx = self.feature_list[0] + for k in fx.mean.keys(): + if k in fx.glossary and fx.mean[k] is not None: + val = self.summary.stdev[k] + val /= 1.0 * len(self.feature_list) + self.summary.stdev[k] = math.sqrt(val) + return self + diff --git a/internal/__init__.py b/internal/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/__pycache__/__init__.cpython-37.pyc b/internal/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dd50f4c0967cf313063e651643f36f1304ffc63 GIT binary patch literal 185 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r>Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9z9<1_OzOXB183My}L*yQG?l;)(`f$aVa#0&sj C3Nw%Z literal 0 HcmV?d00001 diff --git a/internal/api/__init__.py b/internal/api/__init__.py new file mode 100644 index 0000000000..ae7af12baa --- /dev/null +++ b/internal/api/__init__.py @@ -0,0 +1,126 @@ +from typing import Optional + +import psycopg2 +import psycopg2.extras +import pandas as pd + +from allensdk import one, OneResultExpectedError +from allensdk.core.authentication import DbCredentials, credential_injector + + +class OneOrMoreResultExpectedError(RuntimeError): + pass + + +def psycopg2_select(query, database, host, port, username, password): + + connection = psycopg2.connect( + host=host, port=port, dbname=database, + user=username, password=password, + cursor_factory=psycopg2.extras.RealDictCursor + ) + cursor = connection.cursor() + + try: + cursor.execute(query) + response = cursor.fetchall() + finally: + cursor.close() + connection.close() + + return pd.DataFrame(response) + + +class PostgresQueryMixin(object): + def __init__(self, *, dbname, user, host, password, port): + + self.dbname = dbname + self.user = user + self.host = host + self.password = password + self.port = port + + def get_cursor(self): + return self.get_connection().cursor() + + def get_connection(self): + return psycopg2.connect(dbname=self.dbname, user=self.user, + host=self.host, password=self.password, + port=self.port) + + def fetchone(self, query, strict=True): + response = one(list(self.select(query).to_dict().values())) + if strict is True and (len(response) != 1 or response[0] is None): + raise OneResultExpectedError + return response[0] + + def fetchall(self, query, strict=True): + response = self.select(query) + return [one(x) for x in response.values.flat] + + def select(self, query): + return psycopg2_select( + query, + database=self.dbname, + host=self.host, + port=self.port, + username=self.user, + password=self.password + ) + + def select_one(self, query): + data = self.select(query).to_dict('record') + if len(data) == 1: + return data[0] + return {} + + +def db_connection_creator(credentials: Optional[DbCredentials] = None, + fallback_credentials: Optional[dict] = None, + ) -> PostgresQueryMixin: + """Create a db connection using credentials. If credentials are not + provided then use fallback credentials (which attempt to read from + shell environment variables). + + Note: Must provide one of either 'credentials' or 'fallback_credentials'. + If both are provided, 'credentials' will take precedence. + + Parameters + ---------- + credentials : Optional[DbCredentials], optional + User specified credentials, by default None + fallback_credentials : dict + Fallback credentials to use for creating the DB connection in the + case that no 'credentials' are provided, by default None. + + Fallback credentials will attempt to get db connection info from + shell environment variables. + + Some examples of environment variables that fallback credentials + will try to read from can be found in allensdk.core.auth_config. + + Returns + ------- + PostgresQueryMixin + A DB connection instance which can execute queries to the DB + specified by credentials or fallback_credentials. + + Raises + ------ + RuntimeError + If neither 'credentials' nor 'fallback_credentials' were provided. + """ + if credentials: + db_conn = PostgresQueryMixin( + dbname=credentials.dbname, user=credentials.user, + host=credentials.host, port=credentials.port, + password=credentials.password) + elif fallback_credentials: + db_conn = (credential_injector(fallback_credentials) + (PostgresQueryMixin)()) + else: + raise RuntimeError( + "Must provide either credentials or fallback credentials in " + "order to create a db connection!") + + return db_conn diff --git a/internal/api/__pycache__/__init__.cpython-37.pyc b/internal/api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fa0c096adc1a7601d4a99c7609a07fd162f05ab GIT binary patch literal 4446 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 literal 0 HcmV?d00001 diff --git a/internal/api/__pycache__/api_prerelease.cpython-37.pyc b/internal/api/__pycache__/api_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..170c0fe62703858e41b73b447fe150a6c80b8df8 GIT binary patch literal 1070 zcmah|&x;c=6wdtEwRV3X;z2y+BHM!7J$PG0tW^||rQmuQ210g{w&SMBn54V5^djyb zvf{~qX-<MC{{=ztz3Fte7x6(dd6~TLeedPV^S!+`0n^_;^B*B0KharR42x$lTn8pW zM4(85-%th9FbM<liik+WS46}z{1PRR2;PzI)-O0sPP#!E^@}`1XKj#R1$ZA8k|cp3 zNhksc3`KNBl32tDQ0_tC&`K+n<W4T$y!_;)7LIbIq;}%G$BP^X^@e7qnA1_Nq@xGQ zWN>7DKu6Y0she;s1$Ew7K9;>U1<RtE3x2V_0SxyDrX~46t^*M)gRf9o<%J?#hUod| zI$j2=wTOUXy!bP~yn=haN>*?`K|08UX+DK~RYFWU<Q6u(w657YY^>R;d9n)W7--vE zkDI@UvzdeDdR?H%t<0dvIqg)<aAsyR*=<4{zmTlqMgI>ir1QDvJ~z6C^xTf6zkyub zdtolMGF$*hI_#gmKBf=dV&~K}&PjJGxw}d$>a$FlaT(`&WXdfe&t~It+f8OZS7i%{ zBgJl1#!jkHvb))iWdEiHY{GY9Z^M=SR)gd8y@S4{e8NTVj9+p+Py3o@MhpHpmHNV^ zrU1<VzBI*T?$WpUS?Y2x4-1~1gDxPpR@G6i;f^#{M<6X6tY|dYE9T_`E8$M$x|ygk zR<p!6<hEfV?fqasT6FrG0`C1g5V};hSS1+7$~I$DBW9o=R_-$PamE!&3A|g336n8q zcOXYq{KkaYEeaYLI8=2jjKgZD8(Z8=?yQSkKOKv2u{yE=giW=GR<@q3h&&Czt08xz EzoW(~O8@`> literal 0 HcmV?d00001 diff --git a/internal/api/__pycache__/lims_api.cpython-37.pyc b/internal/api/__pycache__/lims_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33d1b18f987b47c39163ebccbd9410c8b34782ca GIT binary patch literal 2355 zcmd^A&2B3-6t-t3$)ru&^p{&eA{P}(5Tpw>2mzu$0V=h<m$q=FQIO@tPUChmGqtBp zQ<ViuS4i*#ELySRL3oMTvbwLpigVnwx3m@aiY*@bjK@Bn^Z7eJUKtx3A<&}Ve&l}? z2>BB~uA2vgFQA)WKnNmeNCFCPCv>`Q;8L7(L$8|)a(3*6`EDU7*l{lOyTzbr$N6xi zI~t63OF@Z}uZSoJ|C|Va-~?lGToex+{gWIUkYM6uL6*hHfUc469|e<gN={r%Uy}V9 zIXO@EX9tv$!{`~{*df)?=YWZ9RcYowNm3O@JcRMo)7YeYTAFW;r0#F36BWU1+3>bx zrf*W&WeHC^FgLfczPZEJR@mxxeXYK=yS}`^HkY4Poou?LrI1moc*s<=FI#D>v$3`2 z>dmxiq3!E-!_vnvBP~OLBSxhwy?Nm3S1MfLodZWAC-Ubc$X}g5D2SpMfp6cQr<4^o zRM#vg3eQvyVa#3tF)e3k4&UG>vI^ax#WSiGQjq%;x&z&X?m^E9`g87#uzXZb3#mV# zDH+fK!5Kk-L1(L)%krWb@vh9gBO`U@b%4IiPq;C?Sc}X{Vx3lt+66lr<3x|5D4`fb zF%BXtSg@k0^Ej0Q0W5k(hHYJhkKc)&gx6o~)lVAVf)&%?9WH83-s4ffu^jPM90~qW zLq^A@5hpS-Es$~2>6^xeYBr2Y<%bDx9q>H~d&3Yk#KDq^QmMh~OFU6a76A-uNk8)$ zxJ{*uAxwh^3H7K$eR#&*JUuNBiLPBMwkRq=!#8$IE}rI$>?2had;+n0l1Qz(5E@L0 zD%E9But&QRQ}CHh?#Yz>L-943Hr9LebpG1%J*^uEsEHI>2y-wH^at?V1$Y<0I2Z0E zxpb`e_`3jgq;jY2)Hmv@yOrKSyJjG8fiotQwn5yloSoT)wgL{p>y_o5isn7mlpTJo zV$D(wG^=Qj9V;PYhI*JTA5?gn@>Yj8L&?&9A}jaIe!2Z*v(l4c$PS{o7ul@_ja8m~ zUEi)-vv-#5pMc5A`c~z=A#C`1=ucMF41Z;je^y!C=Dn36@ZBNq?-2H4^&YyampO^Z zd@Z?P<}lO~Kx{USUVz|>fE_3xRmXZX%N=6vxa-(ORDKyzOtfEzKN~Cw#PjIs(rt&o z!tVbP29N*uVNmbOmq&n}1)pflDC>QVc{y~seuT4Fq;6&M+cro05bzHt1^D_g?0Dhp z_iy`J{_938C`Bw(7|V=hBaC%paRk}LvJzv5M?Ab*(O3>N)_XmTVg|)L3XHQ`kS%zu zK-vd^rP|=YcV<R?*Du&vG}z@TV(hss(sMyR;ZS;wr6$WmW<%~<lfmqDovmHh*&38r zdl3Zh++S<OTGm3mvyM^~s#Hm%F$seC8(piykJ1jNTwCqgiz0aQ{yJX0Eshy^b)neP z<6-n0ATk$lWI4^FJ()QQhKUA<mXFL0<5sZnDkbe9>N5Y+D=&PGcYr~zeOhu#6rZv? L{+93L={Wrx0)~UI literal 0 HcmV?d00001 diff --git a/internal/api/__pycache__/mtrain_api.cpython-37.pyc b/internal/api/__pycache__/mtrain_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ede6468b1861c8ec68ebdefb117e4f282a8509af GIT binary patch literal 6437 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 AVE_OC literal 0 HcmV?d00001 diff --git a/internal/api/api_prerelease.py b/internal/api/api_prerelease.py new file mode 100644 index 0000000000..8f971e4934 --- /dev/null +++ b/internal/api/api_prerelease.py @@ -0,0 +1,24 @@ +import shutil + +from allensdk.api.api import Api + + +class ApiPrerelease(Api): + '''Extends allensdk.api.api to copy files 'locally' from shared storage. + ''' + + def retrieve_file_from_storage(self, storage_path, save_file_path): + '''Copy data from path to file_name. + + Parameters + ---------- + storage_path : string + path to file in shared directory (copy source) + save_file_name : string + path to file destination (copy target) + ''' + self._file_download_log.info("Downloading PATH: %s", storage_path) + self._file_download_log.debug("To PATH: %s", save_file_path) + + # TODO: exception handling + shutil.copyfile(storage_path, save_file_path) diff --git a/internal/api/lims_api.py b/internal/api/lims_api.py new file mode 100644 index 0000000000..ec4ac00444 --- /dev/null +++ b/internal/api/lims_api.py @@ -0,0 +1,45 @@ +import pandas as pd +from typing import Optional + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.internal.core.lims_utilities import safe_system_path +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.core.authentication import credential_injector, DbCredentials + + +class LimsApi(): + + def __init__(self, lims_credentials: Optional[DbCredentials] = None): + if lims_credentials: + self.lims_db = PostgresQueryMixin( + dbname=lims_credentials.dbname, user=lims_credentials.user, + host=lims_credentials.host, password=lims_credentials.password, + port=lims_credentials.port) + else: + # Currying is equivalent to decorator syntactic sugar + self.lims_db = (credential_injector(LIMS_DB_CREDENTIAL_MAP) + (PostgresQueryMixin)()) + + def get_experiment_id(self): + return self.experiment_id + + def get_behavior_tracking_video_filepath_df(self): + query = ''' + SELECT wkf.storage_directory || wkf.filename AS raw_behavior_tracking_video_filepath, attachable_type + FROM well_known_files wkf WHERE wkf.well_known_file_type_id IN (SELECT id FROM well_known_file_types WHERE name = 'RawBehaviorTrackingVideo') + ''' + return pd.read_sql(query, self.lims_db.get_connection()) + + def get_eye_tracking_video_filepath_df(self): + query = ''' + SELECT wkf.storage_directory || wkf.filename AS raw_behavior_tracking_video_filepath, attachable_type + FROM well_known_files wkf WHERE wkf.well_known_file_type_id IN (SELECT id FROM well_known_file_types WHERE name = 'RawEyeTrackingVideo') + ''' + return pd.read_sql(query, self.lims_db.get_connection()) + + +if __name__ == "__main__": + + api = LimsApi() + for ii in range(5): + print(api.get_eye_tracking_video_filepath_df().loc[ii].raw_behavior_tracking_video_filepath) diff --git a/internal/api/mtrain_api.py b/internal/api/mtrain_api.py new file mode 100644 index 0000000000..1c096ac867 --- /dev/null +++ b/internal/api/mtrain_api.py @@ -0,0 +1,188 @@ +import pandas as pd +import requests +import os +import sys +import itertools +import json +import uuid + +from . import PostgresQueryMixin, db_connection_creator +from allensdk.brain_observatory.behavior.trials_processing import EDF_COLUMNS +from allensdk.core.auth_config import MTRAIN_DB_CREDENTIAL_MAP, \ + LIMS_DB_CREDENTIAL_MAP +from allensdk.core.authentication import credential_injector +from allensdk.brain_observatory.behavior.data_objects \ + import BehaviorSessionId +from allensdk.brain_observatory.behavior.data_objects.metadata.\ + behavior_metadata.behavior_metadata import BehaviorMetadata + + +class MtrainApi: + + def __init__(self, api_base='http://mtrain:5000'): + self.api_base = api_base + + def get_page(self, table_name, get_obj=None, filters=[], **kwargs): + + if get_obj is None: + get_obj = requests + + data = {'total_pages': '--'} + for ii in itertools.count(1): + sys.stdout.flush() + + uri = '/'.join([self.api_base, + "api/v1/%s?page=%i&q={\"filters\":%s}" % ( + table_name, ii, json.dumps(filters))]) + tmp = get_obj.get(uri, **kwargs) + try: + data = tmp.json() + except TypeError: + data = tmp.json + if 'message' not in data: + df = pd.DataFrame(data["objects"]) + sys.stdout.flush() + yield df + + if 'total_pages' not in data or data['total_pages'] == ii: + return + + def get_df(self, table_name, get_obj=None, **kwargs): + return pd.concat([df for df in + self.get_page(table_name, get_obj=get_obj, + **kwargs)], axis=0) + + def get_subjects(self): + return self.get_df('subjects').LabTracks_ID.values + + def get_session(self, behavior_session_uuid=None, + behavior_session_id=None): + assert not all(v is None for v in [ + behavior_session_uuid, + behavior_session_id]), 'must enter either a ' \ + 'behavior_session_uuid or a ' \ + 'behavior_session_id' + if behavior_session_id is not None: + def _get_behavior_metadata(): + lims_db = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP + ) + behavior_session_id_ = BehaviorSessionId( + behavior_session_id=behavior_session_id) + bm = BehaviorMetadata.from_lims( + behavior_session_id=behavior_session_id_, lims_db=lims_db) + return bm + bm = _get_behavior_metadata() + + if behavior_session_uuid is not None: + # if both a behavior session uuid and a lims id are entered, + # ensure that they match + assert behavior_session_uuid == \ + str(bm.behavior_session_uuid), \ + 'behavior_session {} does not match ' \ + 'behavior_session_id {}'.format( + behavior_session_uuid, bm.behavior_session_uuid) + else: + # get a behavior session uuid if a lims ID was entered + behavior_session_uuid = str(bm.behavior_session_uuid) + + filters = [{"name": "id", "op": "eq", "val": behavior_session_uuid}] + behavior_df = self.get_df('behavior_sessions', filters=filters).rename( + columns={'id': 'behavior_session_uuid'}) + state_df = self.get_df('states').rename(columns={'id': 'state_id'}) + regimen_df = self.get_df('regimens').rename( + columns={'id': 'regimen_id', 'name': 'regimen_name'}).drop( + ['states', 'active'], axis=1) + stage_df = self.get_df('stages').rename( + columns={'id': 'stage_id'}).drop(['states'], axis=1) + + behavior_df = pd.merge(behavior_df, state_df, how='left', + on='state_id') + behavior_df = pd.merge(behavior_df, stage_df, how='left', + on='stage_id') + behavior_df = pd.merge(behavior_df, regimen_df, how='left', + on='regimen_id') + behavior_df.drop(['state_id', 'stage_id', 'regimen_id'], inplace=True, + axis=1) + if len(behavior_df) == 0: + raise RuntimeError("Session not found %s:" % behavior_session_uuid) + assert len(behavior_df) == 1 + session_dict = behavior_df.iloc[0].to_dict() + + filters = [{"name": "behavior_session_uuid", "op": "eq", + "val": behavior_session_uuid}] + trials_df = self.get_df('trials', filters=filters).sort_values( + 'index').drop(['id', 'behavior_session'], axis=1).set_index( + 'index', drop=False) + trials_df['behavior_session_uuid'] = trials_df[ + 'behavior_session_uuid'].map(uuid.UUID) + del trials_df.index.name + session_dict['trials'] = trials_df[EDF_COLUMNS] + + return session_dict + + def get_behavior_training_df(self, LabTracks_ID=None): + if LabTracks_ID is not None: + filters = [ + {"name": "LabTracks_ID", "op": "eq", "val": LabTracks_ID}] + else: + filters = [] + behavior_df = self.get_df('behavior_sessions', filters=filters).rename( + columns={'id': 'behavior_session_uuid'}) + + state_df = self.get_df('states').rename(columns={'id': 'state_id'}) + regimen_df = self.get_df('regimens').rename( + columns={'id': 'regimen_id', 'name': 'regimen_name'}).drop( + ['states', 'active'], axis=1) + stage_df = self.get_df('stages').rename( + columns={'id': 'stage_id', 'name': 'stage_name'}).drop(['states'], + axis=1) + + behavior_df = pd.merge(behavior_df, state_df, how='left', + on='state_id') + behavior_df = pd.merge(behavior_df, stage_df, how='left', + on='stage_id') + behavior_df = pd.merge(behavior_df, regimen_df, how='left', + on='regimen_id') + return behavior_df + + def get_current_stage(self, LabTracks_ID): + sess = requests.Session() + + state_response = sess.get(os.path.join(self.api_base, 'get_script/'), + data=json.dumps({ + 'LabTracks_ID': LabTracks_ID})) # + # .json()#['objects']).keys() + return state_response.json()['data']['parameters']['stage'] + + +class MtrainSqlApi: + + def __init__(self, dbname=None, user=None, host=None, password=None, + port=None): + if any(map(lambda x: x is None, [dbname, user, host, password, port])): + # Currying is equivalent to decorator syntactic sugar + self.mtrain_db = ( + credential_injector(MTRAIN_DB_CREDENTIAL_MAP) + (PostgresQueryMixin)()) + else: + self.mtrain_db = PostgresQueryMixin( + dbname=dbname, user=user, host=host, password=password, + port=port) + + def get_subjects(self): + query = 'SELECT "LabTracks_ID" FROM subjects' + return self.mtrain_db.fetchall(query) + + def get_behavior_training_df(self, LabTracks_ID): + connection = self.mtrain_db.get_connection() + dataframe = pd.read_sql( + '''SELECT stages.name as stage_name, regimens.name as + regimen_name, bs.date, bs.id as behavior_session_id + FROM behavior_sessions bs + LEFT JOIN states ON states.id = bs.state_id + LEFT JOIN regimens ON regimens.id = states.regimen_id + LEFT JOIN stages ON stages.id = states.stage_id + WHERE "LabTracks_ID"={} + '''.format(LabTracks_ID), connection) + return dataframe.sort_values(by='date') diff --git a/internal/api/queries/__init__.py b/internal/api/queries/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/api/queries/__pycache__/__init__.cpython-37.pyc b/internal/api/queries/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1815d411b93f42927488f248810f9f207df6fcca GIT binary patch literal 197 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r^Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9wu3o`W!OH+$7Q;YTE<1_OzOXB183My}L*yQG? Ol;)(`f!y&Kh#3F}pExoA literal 0 HcmV?d00001 diff --git a/internal/api/queries/__pycache__/biophysical_module_api.cpython-37.pyc b/internal/api/queries/__pycache__/biophysical_module_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fccde8259b127acd49b1f0c701bbb7844ce02c82 GIT binary patch literal 3091 zcmeHJO>Z1E7`A73lgY;>QIaNUE5sl;WYBhV;1(f7TNMOK7nIV=biwkDy&ET9&(xmD zYSZL^8mXuL18y7;cYe)WIq?@b@p>{dNj8ZH2qX?nGX8k&_ubczA3vT)&E_nENB#Ic z{bd=UUu~y+>d^QUUgJT*5W^A;aey)U95IL0P7$kd{JIu6to{u7jo)Av@^Ln|JEY(6 zVJvCFLu)IaxuRkAp}|pr83JD%)NC|XXAL&RrkTrT*z5qaxgT6M57s7IV2inR>C8HC z1P<zK;|=O#w#-&eXMzU1%U0Q)QyfgOdu)xZLu>jCs-wV#%<gBak3<yjjg1JYd>XM- z@`tg=P`1%Kw-YIbhP+I<7Tjd_6i;=es3gOPaY=Nl4C#%DVCKj*oO_B6d9c(eW<gLc zcT;ur{tLlA5bD({?`i<+?46u^OMk)$jkuKLKt&@(`a*KEIbk5lIOcxqa+JwQH+h+u zhhoUpW~`%q9wx2QKoUAIEpD+OIub;4lgecC%<wWKp%w`MKwA^p-0(wXeh?>&lu2|N zCIT9_%+oJ2F(b}nQ)H2MF6L<xF-&DzjThZBfc!FrYNwKddYhM_Bc(m}yY2e?tVX5$ zEL)oh26V8y>AP9o5+R#o+yHj5U47QbDU-P+nAx;Yp-dSMT$K(1_mRmOVU(&QSS;s| zm})vSlRs2)E@*ZxGVSQyn`l;2EWSO(N^bm5mh<EOx5$z$Pp||wqZ2xX>e<>VY7Jg< z4~hgO_!zx*_MKy#;QboIZygLe3yS4*d>kxTEgF*{Rie*L;@7i=Nn@_HjgYy72qh9i zvZfx=irvO{vby22AGkegI7zhtNuD7jl++kPen!6^Ki=*>H(Z-8-J`7Cqa&)u-G_?8 z5oYwGE?0-98^v6i5XxLPyE~%SH6RTSVj3RM0S8|xVFo+c5(*RpklUiM*ec|6>!Pm0 zX#l|`Fx-yE8ZH_1#6n=PKzJS>y>p#7x69>K_}NuA;C&3QS%u;l?ZchK06kWFTRU-% z9YC&54}tkR!X#dKV!T|Oz1`F(j~-GXX-{%5+0#)v*z<P2c=~MCE1r=^_B_BT3I$wV z%oC~~fsk_s?IiNx)Pu?EJbAwRRi|BfRgJIh8Rh_osZ0;5r!q~Dq>vJC8$u_1z_k}? zPuc}U{nBJwUX*JKl~ov<a-`(ggWU#+_wr-h7vVJ*kGUq-U7n;`T}iYG&jiHWu7Y{F zrsW903Mr!rEkUbXwA~&(1%;2bn^)OFb&_&6`!#L1E+5V6Hi}-e{k&L*R<=Ii3AqZ9 z`4R?=4T_pm*uk!I)Vh{8H@N?08uhQIk@+uD$cp~IM4x|-I)6f&Mc7%O&C*%5VXJ~G z)}-&+VuC6wSNGa{2lFn|Wb>9ZF+K*>&Hrbty4rgk)OD8FFF-3`B%3GjeMn_7GEE4J zLPGS4&CTkXwz978Ly<KL#SQIe9y!k(mUzcbvRu!F-1?ahp>T1%<^Z#czXe;nPStPP y)<R>UF}s@kb^KcJUMa$DE3Sq1wl7`>+TJ?({PPqp95(mkv$cI<F*bJYyz>WB=(`XA literal 0 HcmV?d00001 diff --git a/internal/api/queries/__pycache__/biophysical_module_reader.cpython-37.pyc b/internal/api/queries/__pycache__/biophysical_module_reader.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..174e2831f385e3aba6eb7047f616e05e45250c70 GIT binary patch literal 12306 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 G%>Mz`I{w`N literal 0 HcmV?d00001 diff --git a/internal/api/queries/__pycache__/grid_data_api_prerelease.cpython-37.pyc b/internal/api/queries/__pycache__/grid_data_api_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99e79e95a93862d689292e9f28c5d42dd8503b40 GIT binary patch literal 4012 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 literal 0 HcmV?d00001 diff --git a/internal/api/queries/__pycache__/mouse_connectivity_api_prerelease.cpython-37.pyc b/internal/api/queries/__pycache__/mouse_connectivity_api_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2a0f65c2bd937caaaafa387953c8acedf4770d2 GIT binary patch literal 7052 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 VK_`?Ys@bV>hm!Dn+t6y?{~w{f;OPJW literal 0 HcmV?d00001 diff --git a/internal/api/queries/__pycache__/optimize_config_reader.cpython-37.pyc b/internal/api/queries/__pycache__/optimize_config_reader.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de869d3a173e1e83f85314bd75424208b526935c GIT binary patch literal 11155 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 A=l}o! literal 0 HcmV?d00001 diff --git a/internal/api/queries/__pycache__/pre_release.cpython-37.pyc b/internal/api/queries/__pycache__/pre_release.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f893b63b3d0bc96c8168f305ef868ba118c1acfe GIT binary patch literal 5043 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 Fe*k1IiW~p{ literal 0 HcmV?d00001 diff --git a/internal/api/queries/biophysical_module_api.py b/internal/api/queries/biophysical_module_api.py new file mode 100644 index 0000000000..80c24ecf33 --- /dev/null +++ b/internal/api/queries/biophysical_module_api.py @@ -0,0 +1,111 @@ +# Copyright 2016 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + +from allensdk.api.queries.rma_template import RmaTemplate + +class BiophysicalModuleApi(RmaTemplate): + '''''' + + rma_templates = \ + {"biophysical_lims_queries": [ + {'name': 'neuronal_model_runs_by_ids', + 'description': 'see name', + 'model': 'NeuronalModelRun', + 'criteria': '[id$in{{ neuronal_model_run_ids }}]', + 'include': 'well_known_files(well_known_file_type),' + 'neuronal_model(well_known_files(well_known_file_type),' + 'specimen(project,specimen_tags,' + 'ephys_roi_result' + '(ephys_qc_criteria,' + 'well_known_files(well_known_file_type)),' + 'neuron_reconstructions' + '(well_known_files(well_known_file_type)),' + 'ephys_sweeps' + '(ephys_sweep_tags,' + 'ephys_stimulus(ephys_stimulus_type))),' + 'neuronal_model_template' + '(neuronal_model_template_type,' + 'well_known_files(well_known_file_type)))', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['neuronal_model_run_ids'] + }, + {'name': 'neuronal_models_by_ids', + 'description': 'see name', + 'model': 'NeuronalModel', + 'criteria': '[id$in{{ neuronal_model_ids }}]', + 'include': 'well_known_files(well_known_file_type),' + 'specimen(project,specimen_tags,' + 'ephys_roi_result' + '(ephys_qc_criteria,' + 'well_known_files(well_known_file_type)),' + 'neuron_reconstructions' + '(well_known_files(well_known_file_type)),' + 'ephys_sweeps' + '(ephys_sweep_tags,' + 'ephys_stimulus(ephys_stimulus_type))),' + 'neuronal_model_template' + '(neuronal_model_template_type,' + 'well_known_files(well_known_file_type))', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['neuronal_model_ids'] + } + ]} + + + def __init__(self, base_uri=None): + super(BiophysicalModuleApi, self).__init__(base_uri, + query_manifest=BiophysicalModuleApi.rma_templates) + + + def get_neuronal_model_runs(self, neuronal_model_run_ids=None): + '''List Neuronal Model Rusn available through LIMS + with associated info needed to run in NEURON. + + Parameters + ---------- + neuronal_model_run_ids : integer or list of integers, optional + only select specific neuronal_model_runs. + + Returns + ------- + dict : neuronal model run metadata + ''' + data = self.template_query('biophysical_lims_queries', + 'neuronal_model_runs_by_ids', + neuronal_model_run_ids=neuronal_model_run_ids) + + return data + + + def get_neuronal_models(self, neuronal_model_ids=None): + '''List Neuronal Models available through LIMS + with associated info needed to run in NEURON. + + Parameters + ---------- + neuronal_model_ids : integer or list of integers, optional + only select specific neuronal_models. + + Returns + ------- + dict : neuronal model metadata + ''' + data = self.template_query('biophysical_lims_queries', + 'neuronal_models_by_ids', + neuronal_model_ids=neuronal_model_ids) + + return data \ No newline at end of file diff --git a/internal/api/queries/biophysical_module_reader.py b/internal/api/queries/biophysical_module_reader.py new file mode 100644 index 0000000000..6adb856186 --- /dev/null +++ b/internal/api/queries/biophysical_module_reader.py @@ -0,0 +1,419 @@ +# Copyright 2016-2017 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + + +import json +import os +import logging +import allensdk.internal.core.lims_utilities as lims_utilities +from allensdk.config.manifest_builder import ManifestBuilder +from allensdk.config.manifest import Manifest + + +class BiophysicalModuleReader(object): + STIMULUS_CONTENT_TYPE = None + MORPHOLOGY_TYPE_ID = 303941301 + MOD_FILE_TYPE_ID = 292178729 + + def __init__(self): + self._log = logging.getLogger(__name__) + self.lims_path = None + self.lims_data = None + self.lims_update_data = None + + def read_lims_message(self, message, lims_path): + self.lims_path = lims_path + self.lims_data = message[0] + self.lims_update_data = dict(self.lims_data) + + def read_lims_file(self, lims_path): + self.lims_path = lims_path + self.read_json(lims_path) + self.lims_update_data = dict(self.lims_data) + + def read_json(self, path): + with open(path, 'rb') as f: + self.read_json_string(f.read()) + + def read_json_string(self, json_string): + self.lims_data = json.loads(json_string) + self.lims_update_data = dict(self.lims_data) + + def stimulus_file_entries(self): + ''' read the well known file path from the lims result + corresponding to the stimulus file + :return: well_known_file entries + :rtype: array of dicts + ''' + neuronal_model = self.lims_data['neuronal_model'] + specimen = neuronal_model['specimen'] + roi_result = specimen['ephys_roi_result'] + well_known_files = roi_result['well_known_files'] + + stimulus_file_entries = [] + + for well_known_file in well_known_files: + try: + file_type_id = well_known_file['well_known_file_type_id'] + + if file_type_id == lims_utilities.NWB_FILE_TYPE_ID: + stimulus_file_entries.append(well_known_file) + except: + self._log.warn('skipping well known file record with no well known file type.') + + return stimulus_file_entries + + def stimulus_path(self): + ''' Get the path to the stimulus file from the lims result. + :return: path to stimulus file + :rtype: string + ''' + file_entries = self.stimulus_file_entries() + + if len(file_entries) > 1: + self._log.warning('More than one stimulus file found.') + + file_entry = file_entries[0] + + stimulus_path = os.path.join(file_entry['storage_directory'], + file_entry['filename']) + + return stimulus_path + + def lims_working_directory(self): + ''' While this is the same directory as the neuronal_model_run + directory, it can be mocked out for testing if the + other directory is read only. + ''' + return self.neuronal_model_run_dir() + + def neuronal_model_run_dir(self): + ''' read the directory path where + output goes from the lims optimization config json + + Parameters + ---------- + + Returns + ------- + string: + directory path + ''' + return self.lims_data['storage_directory'] + + def fit_parameters_file_entries(self): + ''' read the fit_parameter file path from the lims result + corresponding to the stimulus file + :return: well_known_file entries + :rtype: array of dicts + ''' + neuronal_model = self.lims_data['neuronal_model'] + well_known_files = neuronal_model['well_known_files'] + + fit_parameter_file_entries = [] + + for well_known_file in well_known_files: + file_type_id = well_known_file['well_known_file_type_id'] + + if file_type_id == lims_utilities.MODEL_PARAMETERS_FILE_TYPE_ID: + fit_parameter_file_entries.append(well_known_file) + + return fit_parameter_file_entries + + def fit_parameters_path(self): + ''' Get the path to the fit parameters file from the lims result. + :return: path to file + :rtype: string + ''' + file_entries = self.fit_parameters_file_entries() + + if len(file_entries) > 1: + self._log.warning('More than one fit parameter file found.') + + file_entry = file_entries[0] + + fit_parameter_path = os.path.join(file_entry['storage_directory'], + file_entry['filename']) + + return fit_parameter_path + + def model_type(self): + ''' TODO: comment + ''' + return self.lims_data['neuronal_model']['neuronal_model_template']['name'] + + def morphology_file_entries(self): + ''' read the well known file paths + from the lims result corresponding to the morphology + + Returns + ------- + arrary of dicts: + well known file entries + ''' + neuronal_model = self.lims_data['neuronal_model'] + specimen = neuronal_model['specimen'] + reconstructions = specimen['neuron_reconstructions'] + + morphology_file_entries = [] + + for reconstruction in reconstructions: + superseded = reconstruction['superseded'] + manual = reconstruction['manual'] + + if manual == True and superseded == False: + well_known_files = reconstruction['well_known_files'] + + for well_known_file in well_known_files: + file_type_id = well_known_file['well_known_file_type_id'] + + if file_type_id == BiophysicalModuleReader.MORPHOLOGY_TYPE_ID: + morphology_file_entries.append(well_known_file) + + return morphology_file_entries + + def morphology_path(self): + ''' Get the path to the morphology file from the lims result. + :return: path to morphology file + :rtype: string + ''' + file_entries = self.morphology_file_entries() + + if len(file_entries) > 1: + self._log.warning('More than one morphology file found.') + + file_entry = file_entries[0] + + morphology_path = os.path.join(file_entry['storage_directory'], + file_entry['filename']) + + return morphology_path + + def sweep_entries(self): + ''' read the sweep entries + from the lims result corresponding to the stimulus + :return: stimulus sweep entries + :rtype: array of dicts + ''' + neuronal_model = self.lims_data['neuronal_model'] + specimen = neuronal_model['specimen'] + sweeps = specimen['ephys_sweeps'] + + return sweeps + + def sweep_numbers_by_type(self): + sweeps = self.sweep_entries() + + d = {s['ephys_stimulus']['ephys_stimulus_type']['name']: [] for s in sweeps} + + for n, s in enumerate(sweeps): + t = s['ephys_stimulus']['ephys_stimulus_type']['name'] + d[t].append(s['sweep_number']) + + return d + + def sweep_numbers(self): + ''' Get the stimulus sweep numbers from the lims result + :return: list of sweep numbers + :rtype: array of ints + ''' + sweep_entries = self.sweep_entries() + + if not sweep_entries or len(sweep_entries) < 1: + self._log.warning('No sweeps found.') + + sweeps = [sweep_entry['sweep_number'] \ + for sweep_entry in sweep_entries \ + if sweep_entry['workflow_state'] == 'auto_passed' or \ + sweep_entry['workflow_state'] == 'manual_passed' ] + + return list(set(sweeps)) + + def mod_file_entries(self): + ''' read the NERUON .mod file entries + from the lims result corresponding to the NeuronModel + :return: well known file entries + :rtype: array of dicts + ''' + neuronal_model = self.lims_data['neuronal_model'] + model_template = neuronal_model['neuronal_model_template'] + well_known_files = model_template['well_known_files'] + + mod_file_entries = [] + + for well_known_file in well_known_files: + file_type_id = well_known_file['well_known_file_type_id'] + + if file_type_id == BiophysicalModuleReader.MOD_FILE_TYPE_ID: + mod_file_entries.append(well_known_file) + + return mod_file_entries + + def mod_file_paths(self): + ''' Get the paths to the mod files from the lims result. + :return: paths to mod files + :rtype: array of strings + ''' + file_entries = self.mod_file_entries() + + if not file_entries or len(file_entries) < 1: + self._log.warning('No mod files found.') + + mod_file_paths = [] + + for file_entry in file_entries: + mod_path = os.path.join(file_entry['storage_directory'], + file_entry['filename']) + self._log.info(mod_path) + mod_file_paths.append(mod_path) + + return mod_file_paths + + def update_well_known_file(self, + path, + well_known_file_type_id=None): + if well_known_file_type_id == None: + well_known_file_type_id = \ + lims_utilities.NWB_UNCOMPRESSED_FILE_TYPE_ID + well_known_files = self.lims_data['well_known_files'] + (dirname, filename) = os.path.split(os.path.abspath(path)) + + def get_nwb_file_id(f): + if ('well_known_file_type_id' in f and + f['well_known_file_type_id'] == well_known_file_type_id and + os.path.normpath(f['storage_directory']) == + os.path.normpath(dirname) and + f['filename'] == filename): + return f['id'] + else: + return None + + def not_nwb_file(f): + if ('well_known_file_type_id' in f and + f['well_known_file_type_id'] == well_known_file_type_id): + return False + else: + return True + + try: + existing_file_id = \ + next(wkf_id for wkf_id + in (get_nwb_file_id(f2) + for f2 in well_known_files) + if wkf_id) + + # existing parameter file found + self.lims_update_data['well_known_files'] = \ + [f for f in well_known_files if not_nwb_file(f)] + + self.lims_update_data['well_known_files'] += [{ + 'id': existing_file_id, + 'content_type': None, + 'filename': filename, + 'storage_directory': dirname, + 'well_known_file_type_id': well_known_file_type_id + }] + except StopIteration: + # no matching nwb files found, remove possible unmatching + self.lims_update_data['well_known_files'] = \ + [f for f in well_known_files if not_nwb_file(f)] + + (dirname, filename) = os.path.split(os.path.abspath(path)) + self.lims_update_data['well_known_files'] += [{ + 'content_type': None, + 'filename': filename, + 'storage_directory': dirname, + 'well_known_file_type_id': well_known_file_type_id + }] + + def set_workflow_state(self, state): + self.lims_update_data['workflow_state'] = state + + def write_file(self, path): + with open(path, 'wb') as f: + f.write(json.dumps(self.lims_update_data, indent=2)) + + def to_manifest(self, manifest_path=None): + b = ManifestBuilder() + b.add_path('BASEDIR', os.path.realpath(os.curdir)) + + b.add_path('WORKDIR', + os.path.realpath(os.curdir)) + + b.add_path('MORPHOLOGY', + self.morphology_path(), + typename='file') + b.add_path('CODE_DIR', 'templates') + b.add_path('MODFILE_DIR', 'modfiles') + + for modfile in self.mod_file_entries(): + b.add_path('MOD_FILE_%s' % (os.path.splitext(modfile['filename'])[0]), + os.path.join(modfile['storage_directory'], + modfile['filename']), + typename='file', + format='MODFILE') + + b.add_path('neuronal_model_run_data', + self.lims_path, + typename='file') + + b.add_path('stimulus_path', + self.stimulus_path(), + typename='file', + format='NWB') + + b.add_path('manifest', + os.path.join(os.path.realpath(os.curdir), + manifest_path), + typename='file') + + neuronal_model_run_id = self.lims_data['id'] + + nwb_file_name, extension = \ + os.path.splitext(os.path.basename(self.stimulus_path())) + b.add_path('output_path', + '%d_virtual_experiment%s' % (neuronal_model_run_id, + extension), + typename='file', + parent_key='WORKDIR', + format='NWB') + + b.add_path('fit_parameters', + self.fit_parameters_path()) + + b.add_section('biophys', + {"biophys": [{"model_file": [ manifest_path, + self.fit_parameters_path() ], + "model_type": self.model_type()}]}) + + b.add_section('stimulus_conf', + {"runs": [{"neuronal_model_run_id": + neuronal_model_run_id, + "sweeps": self.sweep_numbers(), + "sweeps_by_type": self.sweep_numbers_by_type() + }]}) + + b.add_section('hoc_conf', + {"neuron" : [{"hoc": ["stdgui.hoc", + "import3d.hoc", + "cell.hoc" ] + }]}) + + m = Manifest(config=b.path_info) + + if manifest_path != None: + b.write_json_file(manifest_path, overwrite=True) + + return m diff --git a/internal/api/queries/grid_data_api_prerelease.py b/internal/api/queries/grid_data_api_prerelease.py new file mode 100644 index 0000000000..14cacad5f5 --- /dev/null +++ b/internal/api/queries/grid_data_api_prerelease.py @@ -0,0 +1,115 @@ +import os +import six + +from allensdk.config.manifest import Manifest +from allensdk.api.warehouse_cache.cache import Cache, cacheable +from allensdk.api.queries.grid_data_api import GridDataApi +from allensdk.core import json_utilities + +from ..api_prerelease import ApiPrerelease +from ...core import lims_utilities as lu + + +_STORAGE_DIRECTORY_QUERY = ''' +select iser.id, + iser.storage_directory +from image_series as iser +where iser.storage_directory is not null +''' + + +@cacheable() +def _get_grid_storage_directories(grid_data_directory): + query_result = lu.query(_STORAGE_DIRECTORY_QUERY) + + storage_directories = dict() + for row in query_result: + path = lu.safe_system_path(row[b'storage_directory']) + + # NOTE: hacky, but grid directory contains files without having + # injection_density_*.nrrd, projection_density_*.nrrd, ... + grid_example = os.path.join(path, grid_data_directory, 'data_mask_100.nrrd') + + if os.path.exists(grid_example): + storage_directories[str(row[b'id'])] = path + + return storage_directories + +class GridDataApiPrerelease(GridDataApi): + '''Client for retrieving prereleased mouse connectivity data from lims. + + Parameters + ---------- + base_uri : string, optional + Does not affect pulling from lims. + file_name : string, optional + File name to save/read storage_directories dict. Passed to + GridDataApiPrerelease constructor. + ''' + GRID_DATA_DIRECTORY = 'grid' + + @classmethod + def from_file_name(cls, file_name, cache=True, **kwargs): + '''Alternative constructor using cache path file_name. + + Parameters + ---------- + file_name : string + Path where storage_directories will be saved. + **kwargs + Keyword arguments to be supplied to __init__ + + Returns + ------- + cls : instance of GridDataApiPrerelease + ''' + if os.path.exists(file_name): + storage_directories = json_utilities.read(file_name) + else: + storage_directories = _get_grid_storage_directories(cls.GRID_DATA_DIRECTORY) + + if cache: + Manifest.safe_make_parent_dirs(file_name) + json_utilities.write(file_name, storage_directories) + + return cls(storage_directories, **kwargs) + + def __init__(self, storage_directories, resolution=None, base_uri=None): + super(GridDataApiPrerelease, self).__init__(resolution=resolution, + base_uri=base_uri) + self.storage_directories = storage_directories + self.api = ApiPrerelease() + + def download_projection_grid_data(self, path, experiment_id, file_name): + '''Copy data from path to file_name. + + Parameters + ---------- + path : string + path to file in shared directory (copy source) + experiment_id : int + image series id. + file_name : string + path to file destination (copy target) + ''' + try: + storage_path = self.storage_directories[str(experiment_id)] + except KeyError as e: + error = ''' + experiment %s is not in the storage_directories dictionary + this can be a result of one or more of: + * an invalid experiment id + * a valid experiment id whose grid data has not yet been computed + try either removing the storage_directories_prerelease.json manifest + from you manifest directory, or passing an updated storage_directories + dict to the GridDataApiPrerelase constructor. + ''' % experiment_id + + self._file_download_log.error(error) + self.cleanup_truncated_file(path) + raise six.raise_from(ValueError(error), e) + + storage_path = os.path.join( + storage_path, self.GRID_DATA_DIRECTORY, file_name) + + self.api.retrieve_file_from_storage(storage_path, path) diff --git a/internal/api/queries/mouse_connectivity_api_prerelease.py b/internal/api/queries/mouse_connectivity_api_prerelease.py new file mode 100644 index 0000000000..86e18be2dc --- /dev/null +++ b/internal/api/queries/mouse_connectivity_api_prerelease.py @@ -0,0 +1,186 @@ +from allensdk.api.warehouse_cache.cache import Cache, cacheable +from allensdk.api.queries.grid_data_api import GridDataApi +from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi + +from .grid_data_api_prerelease import GridDataApiPrerelease +from ...core import lims_utilities as lu + + +_STRUCTURE_TREE_ROOT_ID = 997 +_STRUCTURE_TREE_ROOT_NAME = "root" +_STRUCTURE_TREE_ROOT_ACRONYM = "root" + +_EXPERIMENT_QUERY = ''' +with specimens_concat_workflows as ( + select sp.id, + string_agg(w.name, '|') as workflows + from specimens as sp + join specimens_workflows as spw on spw.specimen_id = sp.id + join workflows as w on w.id = spw.workflow_id + group by sp.id + ), + injections_concat_structures as ( + select inj.id as injection_id, + string_agg(st.name,'|' order by st.graph_order) + as injection_structures_name, + string_agg(st.acronym,'|' order by st.graph_order) + as injection_structures_acronym, + string_agg(cast(st.id as varchar),'|' order by st.graph_order) + as injection_structures_id + from injections as inj + join injections_structures as ist on ist.injection_id = inj.id + join flat_structures_v st on st.id = ist.structure_id + group by inj.id + ) +select distinct + iser.id, + iser.workflow_state, + sp.name as specimen_name, + gdr.name as gender, + a.name as age, + p.name as project_code, + spcw.workflows, + g.name as transgenic_line, --some image series have 2 lines + pst.id as structure_id, + pst.name as structure_name, + pst.acronym as structure_acronym, + ics.injection_structures_name, + ics.injection_structures_acronym, + ics.injection_structures_id +from image_series as iser +join projects as p on p.id = iser.project_id +join specimens as sp on sp.id = iser.specimen_id +join donors as d on d.id = sp.donor_id +join injections inj on inj.specimen_id = sp.id +left join flat_structures_v pst on pst.id = inj.primary_injection_structure_id +left join ages as a on a.id = d.age_id +left join genders as gdr on gdr.id = d.gender_id +left join donors_genotypes as dg on dg.donor_id = sp.donor_id +left join genotypes as g on dg.genotype_id = g.id +-- concat joins -- +left join specimens_concat_workflows as spcw on spcw.id = iser.specimen_id +left join injections_concat_structures as ics on ics.injection_id = inj.id +-- only image series we can pull and ensure mice (should all be mice already) -- +where iser.storage_directory is not null and d.organism_id = 2 +''' + +def _experiment_dict(row): + # use empty strings instead of null + null_fill = lambda s: s if s is not None else "" + + exp = dict() + + exp['id'] = row[b'id'] + + exp['age'] = null_fill(row[b'age']) + exp['gender'] = null_fill(row[b'gender']) + exp['project_code'] = null_fill(row[b'project_code']) + exp['specimen_name'] = null_fill(row[b'specimen_name']) + exp['transgenic_line'] = null_fill(row[b'transgenic_line']) + exp['workflow_state'] = null_fill(row[b'workflow_state']) + + # list : [''] or ['workflow1', 'workflow2', ... ] + exp['workflows'] = null_fill(row[b'workflows']) + exp['workflows'] = exp['workflows'].split('|') + + if row[b'structure_id'] is not None: + exp['structure_id'] = row[b'structure_id'] + exp['structure_name'] = row[b'structure_name'] + exp['structure_abbrev'] = row[b'structure_acronym'] + else: + # use root structure for compatibility with structure tree + exp['structure_id'] = _STRUCTURE_TREE_ROOT_ID + exp['structure_name'] = _STRUCTURE_TREE_ROOT_NAME + exp['structure_abbrev'] = _STRUCTURE_TREE_ROOT_ACRONYM + + if row[b'injection_structures_id'] is not None: + ids = row[b'injection_structures_id'].split('|') + names = row[b'injection_structures_name'].split('|') + acronyms = row[b'injection_structures_acronym'].split('|') + else: + # have at least prim. inj. struct. in structures + ids = (exp['structure_id'], ) + names = (exp['structure_name'], ) + acronyms = (exp['structure_abbrev'], ) + + keys = 'id', 'name', 'abbreviation' + values = zip(ids, names, acronyms) + + structures = map(lambda s: dict(zip(keys, s)), values) + exp['injection_structures'] = list(structures) + + return exp + + +class MouseConnectivityApiPrerelease(MouseConnectivityApi): + '''Client for retrieving prereleased mouse connectivity data from lims. + + Parameters + ---------- + base_uri : string, optional + Does not affect pulling from lims. + file_name : string, optional + File name to save/read storage_directories dict. Passed to + GridDataApiPrerelease constructor. + ''' + + def __init__(self, + storage_directories_file_name, + cache_storage_directories=True, + base_uri=None): + super(MouseConnectivityApiPrerelease, self).__init__(base_uri=base_uri) + self.grid_data_api = GridDataApiPrerelease.from_file_name( + storage_directories_file_name, cache=cache_storage_directories) + + @cacheable() + def get_experiments(self): + query_result = lu.query(_EXPERIMENT_QUERY) + + experiments = [] + for row in query_result: + if str(row[b'id']) in self.grid_data_api.storage_directories: + + exp_dict = _experiment_dict(row) + experiments.append(exp_dict) + + return experiments + + #@cacheable() + def get_structure_unionizes(self): + raise NotImplementedError() + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_injection_density(self, path, experiment_id, resolution): + file_name = "%s_%s.nrrd" % (GridDataApi.INJECTION_DENSITY, resolution) + + self.grid_data_api.download_projection_grid_data( + path, experiment_id, file_name) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_projection_density(self, path, experiment_id, resolution): + file_name = "%s_%s.nrrd" % (GridDataApi.PROJECTION_DENSITY, resolution) + + self.grid_data_api.download_projection_grid_data( + path, experiment_id, file_name) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_injection_fraction(self, path, experiment_id, resolution): + file_name = "%s_%s.nrrd" % (GridDataApi.INJECTION_FRACTION, resolution) + + self.grid_data_api.download_projection_grid_data( + path, experiment_id, file_name) + + @cacheable(strategy='create', + pathfinder=Cache.pathfinder(file_name_position=1, + path_keyword='path')) + def download_data_mask(self, path, experiment_id, resolution): + file_name = "%s_%s.nrrd" % (GridDataApi.DATA_MASK, resolution) + + self.grid_data_api.download_projection_grid_data( + path, experiment_id, file_name) diff --git a/internal/api/queries/optimize_config_reader.py b/internal/api/queries/optimize_config_reader.py new file mode 100644 index 0000000000..359f7ceab3 --- /dev/null +++ b/internal/api/queries/optimize_config_reader.py @@ -0,0 +1,409 @@ +# Copyright 2016 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + + +import os +import logging +import allensdk.internal.core.lims_utilities as lims_utilities +from allensdk.config.manifest_builder import ManifestBuilder +from allensdk.config.manifest import Manifest +import json +import traceback + + +class OptimizeConfigReader(object): + _log = logging.getLogger('allensdk.internal.api.queries.lims.optimize_config_reader') + + STIMULUS_CONTENT_TYPE = None + MORPHOLOGY_TYPE_ID = 303941301 + MOD_FILE_TYPE_ID = 292178729 + NEURONAL_MODEL_PARAMETERS = 329230374 # fit.json file. + + def __init__(self): + self.lims_path = None + self.lims_data = None + self.lims_update_data = None + + def read_lims_message(self, message, lims_path): + self.lims_path = lims_path + self.lims_data = message[0] + self.lims_update_data = dict(self.lims_data) + + def read_lims_file(self, lims_path): + self.lims_path = lims_path + self.read_json(lims_path) + self.lims_update_data = dict(self.lims_data) + + def read_json(self, path): + self.lims_path = os.path.realpath(path) + + with open(self.lims_path) as f: + json_string = f.read() + self.read_json_string(json_string) + + return self.lims_data + + def read_json_string(self, json_string): + self.lims_data = json.loads(json_string) + self.lims_update_data = dict(self.lims_data) + + def write_file(self, path): + with open(path, 'wb') as f: + f.write(json.dumps(self.lims_update_data, indent=2)) + + def stimulus_file_entries(self): + ''' read the well known file path from the lims result + corresponding to the stimulus file + :return: well_known_file entries + :rtype: array of dicts + ''' + neuronal_model = self.lims_data + specimen = neuronal_model['specimen'] + roi_result = specimen['ephys_roi_result'] + well_known_files = roi_result['well_known_files'] + + stimulus_file_entries = [] + + for well_known_file in well_known_files: + try: + file_type_id = well_known_file['well_known_file_type_id'] + + if file_type_id == lims_utilities.NWB_FILE_TYPE_ID: + stimulus_file_entries.append(well_known_file) + except: + OptimizeConfigReader._log.warn('skipping well known file record with no well known file type.') + + return stimulus_file_entries + + def lims_working_directory(self): + ''' While this is the same directory as the optimize + directory, it can be mocked out for testing if the + optimize directory is write only. + ''' + return self.neuronal_model_optimize_dir() + + def output_directory(self): + return os.path.join(self.lims_working_directory(), 'work') + + def stimulus_path(self): + ''' Get the path to the stimulus file from the lims result. + :return: path to stimulus file + :rtype: string + ''' + file_entries = self.stimulus_file_entries() + + if len(file_entries) > 1: + OptimizeConfigReader._log.warning('More than one stimulus file found.') + + file_entry = file_entries[0] + + stimulus_path = os.path.join(file_entry['storage_directory'], + file_entry['filename']) + + return stimulus_path + + def neuronal_model_optimize_dir(self): + ''' read the directory path where + output goes from the lims optimization config json + + Parameters + ---------- + + Returns + ------- + string: + directory path + ''' + return self.lims_data['storage_directory'] + + def morphology_file_entries(self): + ''' read the well known file paths + from the lims result corresponding to the morphology + + Returns + ------- + arrary of dicts: + well known file entries + ''' + neuronal_model = self.lims_data + specimen = neuronal_model['specimen'] + reconstructions = specimen['neuron_reconstructions'] + + morphology_file_entries = [] + + for reconstruction in reconstructions: + superseded = reconstruction['superseded'] + manual = reconstruction['manual'] + + if manual == True and superseded == False: + well_known_files = reconstruction['well_known_files'] + + for well_known_file in well_known_files: + file_type_id = well_known_file['well_known_file_type_id'] + + if file_type_id == OptimizeConfigReader.MORPHOLOGY_TYPE_ID: + morphology_file_entries.append(well_known_file) + + return morphology_file_entries + + def morphology_path(self): + ''' Get the path to the morphology file from the lims result. + :return: path to morphology file + :rtype: string + ''' + file_entries = self.morphology_file_entries() + + if len(file_entries) > 1: + OptimizeConfigReader._log.warning('More than one morphology file found.') + + file_entry = file_entries[0] + + morphology_path = os.path.join(file_entry['storage_directory'], + file_entry['filename']) + + return morphology_path + + def sweep_entries(self): + ''' read the sweep entries + from the lims result corresponding to the stimulus + :return: stimulus sweep entries + :rtype: array of dicts + ''' + neuronal_model = self.lims_data + specimen = neuronal_model['specimen'] + sweeps = specimen['ephys_sweeps'] + + return sweeps + + def sweep_numbers(self): + ''' Get the stimulus sweep numbers from the lims result + :return: list of sweep numbers + :rtype: array of ints + ''' + sweep_entries = self.sweep_entries() + + if not sweep_entries or len(sweep_entries) < 1: + OptimizeConfigReader._log.warning('No sweeps found.') + + sweeps = [sweep_entry['sweep_number'] \ + for sweep_entry in sweep_entries \ + if sweep_entry['workflow_state'] == 'auto_passed' or \ + sweep_entry['workflow_state'] == 'manual_passed' ] + + return list(set(sweeps)) + + def mod_file_entries(self): + ''' read the NERUON .mod file entries + from the lims result corresponding to the NeuronModel + :return: well known file entries + :rtype: array of dicts + ''' + neuronal_model = self.lims_data + model_template = neuronal_model['neuronal_model_template'] + well_known_files = model_template['well_known_files'] + + mod_file_entries = [] + + for well_known_file in well_known_files: + file_type_id = well_known_file['well_known_file_type_id'] + + if file_type_id == OptimizeConfigReader.MOD_FILE_TYPE_ID: + mod_file_entries.append(well_known_file) + + return mod_file_entries + + def mod_file_paths(self): + ''' Get the paths to the mod files from the lims result. + :return: paths to mod files + :rtype: array of strings + ''' + file_entries = self.mod_file_entries() + + if not file_entries or len(file_entries) < 1: + OptimizeConfigReader._log.warning('No mod files found.') + + mod_file_paths = [] + + for file_entry in file_entries: + mod_path = os.path.join(file_entry['storage_directory'], + file_entry['filename']) + OptimizeConfigReader._log.info(mod_path) + mod_file_paths.append(mod_path) + + return mod_file_paths + + def update_well_known_file(self, + path, + well_known_file_type_id=None): + if well_known_file_type_id == None: + well_known_file_type_id = lims_utilities.MODEL_PARAMETERS_FILE_TYPE_ID + well_known_files = self.lims_data['well_known_files'] + + def get_model_parameter_file_id(f): + if ('well_known_file_type_id' in f and + f['well_known_file_type_id'] == well_known_file_type_id): + return f['id'] + else: + return None + + def not_fit_param(f): + if ('well_known_file_type_id' in f and + f['well_known_file_type_id'] == well_known_file_type_id): + return False + else: + return True + + try: + existing_file_id = \ + next(wkf_id for wkf_id in + (get_model_parameter_file_id(f2) + for f2 in well_known_files) if wkf_id) + + # existing parameter file found + self.lims_update_data['well_known_files'] = [f for f in well_known_files if not_fit_param(f)] + + (dirname, filename) = os.path.split(os.path.abspath(path)) + self.lims_update_data['well_known_files'] += [{ + 'id': existing_file_id, + 'filename': filename, + 'storage_directory': dirname, + 'well_known_file_type_id': well_known_file_type_id + }] + except StopIteration: + # no parameter files found + (dirname, filename) = os.path.split(os.path.abspath(path)) + self.lims_update_data['well_known_files'] += [{ + 'content_type': 'application/json', + 'filename': filename, + 'storage_directory': dirname, + 'well_known_file_type_id': well_known_file_type_id + }] + + def build_manifest(self, manifest_path=None): + b = ManifestBuilder() + + b.add_path('BASEDIR', os.path.realpath(os.curdir)) + + b.add_path('WORKDIR', + self.output_directory()) + + b.add_path('MORPHOLOGY', + self.morphology_path(), + typename='file') + + b.add_path('MODFILE_DIR', 'modfiles') + + for modfile in self.mod_file_entries(): + b.add_path('MOD_FILE_%s' % (os.path.splitext(modfile['filename'])[0]), + os.path.join(modfile['storage_directory'], + modfile['filename']), + typename='file', + format='MODFILE') + + b.add_path('stimulus_path', + self.stimulus_path(), + typename='file', + format='NWB') + + b.add_path('manifest', + os.path.join(os.path.realpath(os.curdir), + manifest_path), + typename='file') + + b.add_path('output', + os.path.basename(self.stimulus_path()), + typename='file', + parent_key='WORKDIR', + format='NWB') + + b.add_path('neuronal_model_data', + self.lims_path, + typename='file') + + b.add_path('upfile', + 'upbase.dat', + typename='file', + parent_key='WORKDIR') + b.add_path('downfile', + 'downbase.dat', + typename='file', + parent_key='WORKDIR') + b.add_path('passive_fit_data', + 'passive_fit_data.json', + typename='file', + parent_key='WORKDIR') + b.add_path('stage_1_jobs', + 'stage_1_jobs.json', + typename='file', + parent_key='WORKDIR') + b.add_path('fit_1_file', + 'fit_1_data.json', + typename='file', + parent_key='WORKDIR') + b.add_path('fit_2_file', + 'fit_2_data.json', + typename='file', + parent_key='WORKDIR') + b.add_path('fit_3_file', + 'fit_3_data.json', + typename='file', + parent_key='WORKDIR') + b.add_path('fit_type_path', + typename='file', + spec='%s', + parent_key='WORKDIR') + b.add_path('target_path', + typename='file', + spec='target.json', + parent_key='WORKDIR') + b.add_path('fit_config_json', + typename='file', + spec='%s/config.json', + parent_key='WORKDIR') + b.add_path('final_hof_fit', + typename='file', + spec='%s/s%d/final_hof_fit.txt', + parent_key='WORKDIR') + b.add_path('final_hof', + typename='file', + spec='%s/s%d/final_hof.txt', + parent_key='WORKDIR') + b.add_path('output_fit_file', + typename='file', + spec='fit_%s_%s.json') + + b.add_section('biophys', {"biophys": [ + {"model_file": [ manifest_path ] }]}) + + b.add_section('stimulus_conf', + {"runs": [{"sweeps": self.sweep_numbers(), + "specimen_id": self.lims_data['specimen_id'] + }]}) + + b.add_section('hoc_conf', + {"neuron" : [{"hoc": [ "stdgui.hoc", "import3d.hoc", "cell.hoc" ] + }]}) + + return b + + def to_manifest(self, manifest_path=None): + b = self.build_manifest(manifest_path) + + m = Manifest(config=b.path_info) + + if manifest_path != None: + b.write_json_file(manifest_path, overwrite=True) + + return m diff --git a/internal/api/queries/pre_release.py b/internal/api/queries/pre_release.py new file mode 100644 index 0000000000..07d3fe13e3 --- /dev/null +++ b/internal/api/queries/pre_release.py @@ -0,0 +1,170 @@ +from allensdk.api.queries.brain_observatory_api import BrainObservatoryApi +from allensdk.api.warehouse_cache.cache import cacheable +from allensdk.core.brain_observatory_cache import BrainObservatoryCache +import allensdk.internal.core.lims_utilities as lu +import os +import collections +import pandas as pd +import sys + +sql_query_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pre_release_sql') + +with open(os.path.join(sql_query_dir, 'experiment_pre_release_query.sql'), 'r') as f: + experiment_pre_release_query = f.read() + +with open(os.path.join(sql_query_dir, 'container_pre_release_query.sql'), 'r') as f: + container_pre_release_query = f.read() + +with open(os.path.join(sql_query_dir, 'cell_specimens_pre_release_query.sql'), 'r') as f: + cell_specimens_pre_release_query = f.read() + +class BrainObservatoryApiPreRelease(BrainObservatoryApi): + + @cacheable() + def get_experiment_containers(self): + + query_result = lu.query(container_pre_release_query) + container_list = [] + for q in query_result: + + # # For development: print key/val pairs generated from LIMS query: + # for key, val in sorted(q.items(), key=lambda x: x[0]): + # print(key, val) + # raise + + c = collections.defaultdict(collections.defaultdict) + + c['id'] = q['ec_id'] + c['targeted_structure']['acronym'] = q['acronym'] + c['specimen']['donor'] = collections.defaultdict(collections.defaultdict) + c['specimen']['donor']['external_donor_name'] = q['external_donor_name'] + c['specimen']['donor']['transgenic_lines'] = [collections.defaultdict(collections.defaultdict), collections.defaultdict(collections.defaultdict)] + c['specimen']['donor']['transgenic_lines'][0]['transgenic_line_type_name'] = 'driver' + c['specimen']['donor']['transgenic_lines'][0]['name'] = q['driver'] + c['specimen']['donor']['transgenic_lines'][1]['transgenic_line_type_name'] = 'reporter' + c['specimen']['donor']['transgenic_lines'][1]['name'] = q['reporter'] + c['specimen']['name'] = q['specimen'] + c['imaging_depth'] = q['depth'] + c['failed'] = q['oa_state'] == 'failed' + + + if q['donor_tags'] == u'Epileptiform Events': + c['specimen']['donor']['conditions'] = [collections.defaultdict(collections.defaultdict)] + c['specimen']['donor']['conditions'][0]['name'] = u'Epileptiform Events' + elif q['donor_tags'] == u'': + pass + else: + raise + + container_list.append(c) + return container_list + + + @cacheable() + def get_ophys_experiments(self): + + query_result = lu.query(experiment_pre_release_query) + experiment_list = [] + for q in query_result: + c = collections.defaultdict(collections.defaultdict) + + # # For development: print key/val pairs generated from LIMS query: + # for key, val in sorted(q.items(), key=lambda x: x[0]): + # print(key, val) + # raise + + c['id'] = q['o_id'] + c['imaging_depth'] = q['depth'] + c['targeted_structure']['acronym'] = q['acronym'] + c['specimen']['donor'] = collections.defaultdict(collections.defaultdict) + c['specimen']['donor']['external_donor_name'] = q['acronym'] + c['specimen']['donor']['transgenic_lines'] = [collections.defaultdict(collections.defaultdict), collections.defaultdict(collections.defaultdict)] + c['specimen']['donor']['transgenic_lines'][0]['transgenic_line_type_name'] = 'driver' + c['specimen']['donor']['transgenic_lines'][0]['name'] = q['driver'] + c['specimen']['donor']['transgenic_lines'][1]['transgenic_line_type_name'] = 'reporter' + c['specimen']['donor']['transgenic_lines'][1]['name'] = q['reporter'] + c['date_of_acquisition'] = q['date_of_acquisition'] + c['specimen']['donor']['date_of_birth'] = q['date_of_birth'] + c['experiment_container_id'] = q['ec_id'] + c['stimulus_name'] = q['stimulus_name'] + c['specimen']['donor']['external_donor_name'] = q['external_donor_name'] + c['specimen']['name'] = q['specimen'] + c['fail_eye_tracking'] = q['fail_eye_tracking'] + + experiment_list.append(c) + return experiment_list + + @cacheable() + def get_cell_metrics(self): + query_result = lu.query(cell_specimens_pre_release_query) + + mappings = self.get_stimulus_mappings() + thumbnails = [m['item'] for m in mappings if m['item_type'] == 'T' and m['level'] == 'R'] + + cell_list = [] + for q in query_result: + c = collections.defaultdict(collections.defaultdict) + + c['all_stim'] = q['a_valid'] and q['b_valid'] and q['c_valid'] + for key in ['cell_specimen_id', 'area', 'donor_full_genotype', 'experiment_container_id', 'imaging_depth', 'specimen_id', 'tld1_id', + 'tld1_name', 'tld2_id', 'tld2_name', 'tlr1_id', 'tlr1_name']: + c[key] = q[key] + + if q['failed_experiment_container'] == 't': + c['failed_experiment_container'] = True + elif q['failed_experiment_container'] == 'f': + c['failed_experiment_container'] = False + else: + raise RuntimeError('Unexpected value: {} not in ("t", "f")'.format(q['failed_experiment_container'])) + + + # Session A metrics: + for key in ['dsi_dg', 'g_dsi_dg', 'g_osi_dg', 'osi_dg', 'p_dg', 'p_run_mod_dg', 'peak_dff_dg', 'pref_dir_dg', 'pref_tf_dg', 'reliability_dg', + 'reliability_nm3', 'run_mod_dg', 'tfdi_dg', 'tfdi_dg']: + if q['crara_data'] is None: + c[key] = None + else: + c[key] = q['crara_data']['roi_cell_metrics'].get(key,None) + + # Session B metrics: + for key in ['g_osi_sg', 'image_sel_ns', 'osi_sg', 'p_ns', 'p_run_mod_ns', 'p_run_mod_sg', 'p_sg', 'peak_dff_ns', 'peak_dff_sg', 'pref_image_ns', + 'pref_ori_sg', 'pref_phase_sg', 'pref_sf_sg', 'pref_image_ns', 'pref_ori_sg', 'reliability_ns', 'reliability_sg', + 'run_mod_ns','run_mod_sg','sfdi_sg', 'time_to_peak_ns', 'time_to_peak_sg']: + + if q['crarb_data'] is None: + c[key] = None + else: + c[key] = q['crarb_data']['roi_cell_metrics'].get(key,None) + + # Session C metrics: + for key in ['reliability_nm2', 'rf_area_off_lsn', 'rf_area_on_lsn', 'rf_center_off_x_lsn', 'rf_center_off_y_lsn', + 'rf_center_on_x_lsn', 'rf_center_on_y_lsn', 'rf_chi2_lsn', 'rf_distance_lsn', 'rf_overlap_index_lsn', + ]: + if q['crarc_data'] is None: + c[key] = None + else: + c[key] = q['crarc_data']['roi_cell_metrics'].get(key,None) + + for suffix in ['a', 'b', 'c']: + if not q['crar%s_data' % suffix] is None: + c['reliability_nm1_%s' % suffix] = q['crar%s_data' % suffix]['roi_cell_metrics'].get('reliability_nm1',None) + else: + c['reliability_nm1_%s' % suffix] = None + + # Fake in thumbnail images: + for t in thumbnails: + c[t] = None + + # # For development: print key/val pairs generated from LIMS query: + # for key, val in sorted(q.items(), key=lambda x: x[0]): + # if key == 'crarb_data': + # print('crarb_data[roi_cell_metrics]') + # for key2, val2 in sorted(val['roi_cell_metrics'].items(), key=lambda x: x[0]): + # print(' ', key2, val2) + # else: + # print(key, val) + # raise + + cell_list.append(c) + + return cell_list diff --git a/internal/brain_observatory/__init__.py b/internal/brain_observatory/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/brain_observatory/__pycache__/__init__.cpython-37.pyc b/internal/brain_observatory/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93efaa4f16d24aeb86bec96a41cc01d1c4c7fa5a GIT binary patch literal 203 zcmYL@JqiLb5QVc~A;KQS!rj77MEq&RM(hG%vI!bCPC^n_QhF9EuVm{H?5vzE#0T%2 zVVF0}x-3VGg!dct_0{92f|?~c4hV|v*|^v}Sm?)pe9~sd4^fB6;RLFZa0SeKh0r)u zFy$J%$eq_18=~{49QoEr9!=5{4^0b4O<8McL$$TRqyvJjWdMW1Njlv@av|437&J+U S%ID{Bes=0&^`iggO=e$&_&WRm literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/annotated_region_metrics.cpython-37.pyc b/internal/brain_observatory/__pycache__/annotated_region_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c108b03b7566f91892268e927395f7e1d332e45 GIT binary patch literal 3623 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 Oy^p*-@5her=>G?xpzi4a literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/demix_report.cpython-37.pyc b/internal/brain_observatory/__pycache__/demix_report.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2271ae8a7b7b5185cf606d3727ad34c604f5e879 GIT binary patch literal 6793 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 Bl-~dV literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/demixer.cpython-37.pyc b/internal/brain_observatory/__pycache__/demixer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..739d61cdf8c85d9594a3ef0e7252e94c667ce8db GIT binary patch literal 10452 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 literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/eye_calibration.cpython-37.pyc b/internal/brain_observatory/__pycache__/eye_calibration.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c13e8cd3ecbf18117083e8227c386c2c19748a8 GIT binary patch literal 10310 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 literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/fit_ellipse.cpython-37.pyc b/internal/brain_observatory/__pycache__/fit_ellipse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2833d01991e90bb5e36e60820905f9173f08c4e0 GIT binary patch literal 6019 zcmbtY%Wot{8SkooPS3+*d;D5&mW71JM4NpD64-3APIlK3FSE)EXgLh+srGng$1~&V z_O5NZCBO&?i6E}zWQ!9ykQ)*L1P3Je4-f?sC|odH5JwJ(-&Z{|_L>b+NYB()&#vn4 z{eAU9x$GNwdO!R|`1XQf{DnHB$3kNXCGG$SL$Iz9FkSP2zi0?9%x@XOjLdyAu!JS- zZyA9t9O0sNgeMB9UEzx&YEP6z8FfKa!~|+zRK+CfVpI}Scez}Tiu(q`87~|4=_8zH ztTYLZ9*)KmO8jwvNPkDb1rr>5n8FkmYJ7okP}{;49%@Gvgpb-4MeJHq{&G9H-R-sq zan!W24LuGD;dv7!UIj>u1BQKBiyyMg7Cg0uc^$Z-wou!so$E$wr$&RP4A4wDpp}|{ zc4`4S!T@xI3+N?Ar-0fQ2EM^tIidqwDD*7Vxn!u12s^atL-fFK!9RXk=SQ?a(&sMM zi;DLK%HE4)KUVCf@;BSP#-QKsC9(20!<|MuiKHqd8#0PF`dy(4z3t6Lv)hj&Ra}eW zq%jC(xEZU76P-pJCCY5~)>VN<BPsi`?kFpcy6dt)hm(ZJB7qVC58y|JoI>@l`!}zx zz8Xg|UJW-wad9oYANF=vpYMgueour?u139k@oIk%_2MRAf3UF|uYRt*wi@G0pBRMA zyJ0KByWK8Uh`X17NhEt=_tKgSfm(kJTi*+lzTCaE-cA}(&b*6*UF9_z?H-02M9+90 zz_2UKqo3t)hv}cL_ok28esT0xlPFFPVMN5${QoB!J3mjry$;)Fw~W_+oPoCo;PW9{ z<(Zj*y9Z`!>YklBiIrOWkd?cZEMbPYZy)l^6)f|1t|w0F>Rm45-9qMLwy<Di#nh!5 zXSjC_`4Z%&*kVr`nVEWmqxQC5`l69~nD>VJo;WdeFkZlWB`txzAgL?TXrr)I!h1%i zDF2q=YdZcuOUijIteTNjIunaVQq4!!&6lCkd8ykgTIjTpy^@RG*VmWolggH1uN7(j zt4edD4><zWyKV4W6;Ciknc$x)^|uq6Yc%_Dq6!gYFOne`dMr9s5LlK8Q~*?E$k0YJ zBF3wQQ6I;4qeg$dA^S;~wEI0tY*u{GR@37(JMFlEb6d$qy(A}TzS<0XqAhUdNGn)d zmGdtijZ{WoIn*0xs1mjod}Yzc2X5Gn`#@E(j$+Ng)@!xI=U|#n^Ff_BY&JlMN6?Qy z24GlKUSSnpVkKs=DTrf*`K-i!U6WAy5Xz76y_pk2dA!e9ED7DQSbiHF2qi=k%p+mD znDCC-u@Zh@=i`TZhRop`X2yFZnxVBYVY~&=La}zPB~HFt3+3Y(Oj*kBI<gB9WU0Mi z<YKsW2ZDOsx3=y;tjyF}=P+RA%5t44S4M+w*o^9~B+bjMgyxU~Ttt6UIgpliGYTBo z8xo-zEUP=3OY#F~2c;ob+C35N$PdykA0lv`0GXC!Ld#inpFxRh0ESs%=gktgn8k^{ zRX)Y{7EVy}K{;)j^bQ^ug#=M6`W-aL(34_!c&^&$1IrYu0%!t4?eaEeti(>ueXMRd z<Q6dE!0bcW1)DZ9Cv`v@zM>5{h@wehhf;>SioK$odvO9&r>uT2iZ#WQDf$T(lGNsS zKZ=%OSiYm!E%{*@KSc$2XX6VfG1*^(SNR3A%J=3@U_O#;65+8Vk+zNT{w+GYZ;dd| z*to@0{(sW}a@654dyuXJl#YAgrJxezuRz97kNBwzqiJTIHiTXWbR$!!>6k+&EgoVQ z&>3>RXk;*Ey&6MEfS>>?1<y)fHhTO^Mp{fuLs`sy<+bl#e&>6;x1XyQHR0t2ASs_9 zaFM_z0$NNjqotf~8xE#L9`BxZWy*~2iF!Hb1qq^Za?>EM(3@8YJW0dsWyL<P*sF@c z`MxHJWAZTqrx-Pdu>d7L3t%t~1ArgD0JAX5reF%rGY8`9^S#*<%v(S9Z!2|={97;F zj2aE)HyWFLu?>6JP^Cs=Ydh@bGm_LnlGV`~B1u3b9e(12^rw-vlH~9xzKF@2d)%Az z&UrPjsK=WWW6(qHo)kqZ37MS~5!nKwpG9hM@>;?i_pNaY#sf3Xg0b$bIvI=(`O3`B zV6;*OB{EW8Gv-NAxK=7gYBq1A4j7FnNh=+rnc*0sCMc(ydK860wcHi$oV0!&nfR_F zLgk1oq?Q51PNZ|1_4R^cp<-+DqZm<4D7LN`_ziay@SV#6-@SZ-K$<p-SUEt^v@zHc ztFjt?lE%lhp##RWA^yH!+6bryVogLBIfdqpMdJ`{9VZ^+E0=JVe4fAy1c+BH6g+>v zF+^O!&Nh><2NO%IleY*E{_-|~Wdbh}I3=niq4!Z@A}1j(Y2@K3zlE9ii*m|@gJA!w zBoOdpuL#&p*ar|{5oq_8hvVM_Vfbmn<ZDK&-)+U*D5yCpG7lqR-ONRXT(|r*z<Z>f zIx`MLP6sPjzlQDNDgcp`Vp5BjxW~?L`5BCj$xCLLG)`;VYvAkqB`-*p>k>J!T+^Ua zbCj)+jG@d?CPQuQ+O)oD-Arw2*GNMj&{)cC=D{MJ6Co_fcOf=GQ#GtXYUi}v(%QLv z7x&aIdgXiG#Y<fhm+v!qPPniW-mrH8z1%_|!X}-`3bZ$(U{Cja5{|Tx`a|pCov<Dc z6NT2#e(}5C|0(^$vqPCc?z1J6+?W*qw?YMcdw_hif4_GnudW6blCLWoUOlaD=fLdm zpu`l>kZjyy%WT>7As<u_I09A7j3tD!ld<#uH98tk!WdlA4jYyhV+d6=N0Eza&J#o% zGZeV+ao}QM#GxQZJ8TMLkgE)HT?dlk40By)nCm)}>(V<=JMW-?fCp3_I(6^hzn!|P zoq91XBKIf}6dp1Uqf<uaQK3HN9rePBBpW_7V&g10kDeZ$1?T2)Z13||DM^_)HvI4E z^QDW^BwZZHPY`&D0NHkJ?WDE<M0TVR6r0MY2|Vch<tJ&3A}{$V0@nyUL*P1rM+uy= zt>lT{M9Gs=Fxh7m0t}N>UPIjKbM3FkF)HClMH_@AG}1gmgA)Wpi4lm?s0~+&nEkk~ z=U6^BhghE?SREs=m61%Fhzb$vw0m{?7&m1n8&ML%FAfyn9h^czm38_RHSR@C<lt}P zgJSZ620zQra(M@>CUxl{Y{$0j->_wnE2C>50?<D0kkQ=^M);<gp`BO<xL2V&qeCPt z=t0tOU&4hq4J$NH5)O$j5-O%BBv!}mcu9dmaN)lJ0_c3%dY2h1@wN0@ouVi%8vCXW z@NJA*(20|y7Ul5R+r{k^_7zUe5M>b8ePFbLQ46CUzOyunN;+j&9rRHuIL#tkquXE+ zwW(l@uiqKkBHRJ^oie_rn3a-=w6sr@sEP@k4!Cb+<+OY-nfk!Kl2(Lq*M#l+%4iJX z^F&s~+mqQ;G9f0@iG7auC&W}*9k!;^$ziLOPEjjm2UB83-&ag$wX}9HO@2Yl9-5fT zd)A2_S=>3A1Fz=0wauAq2J2?h2~kcbi8kpJ1hFa>#2K+D&c5Mhv)E-eohAO_thqxS zu0zKk$?p^b^Z8b5sOa9WMvbNRUts`-z3Niy>~FU4|Kkm90a|bVfS#Y;K%!~I?Y-!T z)b2<C4Bs%8hK>29BMN_8Pux8F_jjH;b7QZNUnHD=_WYiw?-249ZVIl9TUXK2<|N>2 zeZ}PtCA7Emo26y#9u%VsF#CR6Bpb@vh}x}<MA>>jWv#cn-JpOZBFg9OX1|LIvw2*` zg~_1X#}&w0U~b1zFnK(H8!MU$oV?aHEAX&Mj61MMeilf`#{rbn>&wlso98Q}V7YbD zi43JQfwPh4lJ-F2vP?(sIt2*4czcb`hyzO>HFfgzFllZe^?Z$X@IxUQp-kGiq_J>K zc)va;U#AIk&`t7mhtf>M$(xGrT!C%48WeUL!{jn3?2MXu;;OTGzMEhj%6g<6_`mIL zf-3-hsUs;=4(yP4kXKg&bG_XPc(|iKNb#t9+VFS@T~;C``Uzf+DeN^6KhZ@>h0P*+ zI)hkhmd#Q@68spiz<+ucUA6eEhPM7`f0|#$oa4SJBkV$X)h1mnHtOZTMoKW))yz<C zx8G{DdoAVk*E%qFIc1NX1O;x|H|H6aW({p9pCxc?`o{^E@~-D;+jA7KYmbjekXO5& Q>semKoAhSTddlPf0k;$eg#Z8m literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/frame_stream.cpython-37.pyc b/internal/brain_observatory/__pycache__/frame_stream.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..774c48c12244c1681d59e50eaf9464e2ac3b4cc2 GIT binary patch literal 10543 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 literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/itracker.cpython-37.pyc b/internal/brain_observatory/__pycache__/itracker.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..021ff22af1f6dd537f7b9e07ef83b07f644fcd9c GIT binary patch literal 18821 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 Q6BQ3757*ksdo#}e2Jw$TbpQYW literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/itracker_utils.cpython-37.pyc b/internal/brain_observatory/__pycache__/itracker_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87c5fc1bbc71af069fc7ff9379d1fd45553540c1 GIT binary patch literal 6910 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 literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/mask_set.cpython-37.pyc b/internal/brain_observatory/__pycache__/mask_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b6044043f4d940ba1f67a5e3128c51a457ea28c GIT binary patch literal 5572 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 literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/ophys_session_decomposition.cpython-37.pyc b/internal/brain_observatory/__pycache__/ophys_session_decomposition.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3868c19dd5a5e7f1a486b19bffd3d46a5399b7f GIT binary patch literal 2828 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 QwRzib^Q|AWZ^bYC2gFJ7H2?qr literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/roi_filter.cpython-37.pyc b/internal/brain_observatory/__pycache__/roi_filter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cc832737d52126e743812a5a9c50c9b05fb3746 GIT binary patch literal 10098 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 N`_>!QRcqBU{~Oz;gS7wv literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/roi_filter_utils.cpython-37.pyc b/internal/brain_observatory/__pycache__/roi_filter_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25cb45c61a456dc3e86ae1d14bb7223f43e719c4 GIT binary patch literal 9255 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 XYZqXUI62a7d*$*<U|+GXH!lA#vpuzM literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/run_itracker.cpython-37.pyc b/internal/brain_observatory/__pycache__/run_itracker.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e60427baaca28d53e83ad97c9d72c065455fc438 GIT binary patch literal 5140 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 RtSbIA`kvc<-8yG0{{_%AgXaJM literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/__pycache__/time_sync.cpython-37.pyc b/internal/brain_observatory/__pycache__/time_sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9929690a1b5db3f197b27679bd6c01ae5e973a2 GIT binary patch literal 13290 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 Hi<AEivt0a) literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/annotated_region_metrics.py b/internal/brain_observatory/annotated_region_metrics.py new file mode 100644 index 0000000000..fc07e1d347 --- /dev/null +++ b/internal/brain_observatory/annotated_region_metrics.py @@ -0,0 +1,131 @@ +"""Module for calculating annotated region metrics from ISI data""" +import numpy as np +import logging + +# These scaling factors are derived from experimental geometry using +# screen width 52.0 cm, screen height 32.0 cm (16:10 24 inch monitor) +# mouse 10.0 cm from center of monitor +ALTITUDE_SCALE = 0.322 +AZIMUTH_SCALE = 0.383 + + +def eccentricity(az, alt, az_center, alt_center): + """Compute eccentricity + + Parameters + ---------- + az : numpy.ndarray + Azimuth retinotopic map + alt : numpy.ndarray + Altitude retinotopic map + az_center : float + Azimuth value to use as center of eccentricity map + alt_center : float + Altitude value to use as center of eccentricity map + + Returns + ------- + numpy.ndarray + Eccentricity map + """ + daz = az - az_center + dalt = alt - alt_center + ecc = np.arctan(np.sqrt(np.square(np.tan(dalt)) + + np.square(np.tan(daz))/np.square(np.cos(dalt)))) + return ecc + + +def retinotopy_metric(mask, isi_map): + """Compute retinotopic metrics for a responding area + + Parameters + ---------- + mask : numpy.ndarray + Mask representing the area over which to calculate metrics + isi_map : numpy.ndarray + Retinotopic map + + Returns + ------- + (float, float, float, float) tuple + min, max, range, bias of retinotopic map over masked region + """ + ind = np.where( mask > 0 ) + vals = isi_map[ind] + maxv = np.degrees(np.max(vals)) + minv = np.degrees(np.min(vals)) + ret_range = float(maxv - minv) + ret_bias = float(abs(minv + maxv)) + return float(minv), float(maxv), ret_range, ret_bias + + +def create_region_mask(image_shape, x, y, width, height, mask): + """Create mask for region on retinotopic map + + Parameters + ---------- + image_shape : tuple + (height, width) of retinotopic map + x : int + x offset of region mask within retinotopic map + y : int + y offset of region mask within retinotopic map + width : int + width of region mask + height : int + height of region mask + mask : list + region mask as a list of lists + + Returns + ------- + numpy.ndarray + Region mask + """ + bb = np.zeros((height,width), dtype=np.uint8) + bb[np.asarray(mask)] = 1 + region_mask = np.zeros(image_shape, dtype=np.uint8) + region_mask[y:y + height,x:x + width] = bb + return region_mask + + +def get_metrics(altitude_phase, azimuth_phase, x=None, y=None, width=None, + height=None, mask=None, altitude_scale=ALTITUDE_SCALE, + azimuth_scale=AZIMUTH_SCALE): + """Calculate annotated region metrics""" + altitude = altitude_phase * altitude_scale + azimuth = azimuth_phase * azimuth_scale + + eccentricity_ret_zero = np.degrees( + eccentricity(azimuth, altitude, 0.0, 0.0)) + + result = {} + + region_mask = create_region_mask(altitude.shape, x, y, width, height, + mask) + + # compute centroid + centroid = [np.mean(x_value) for x_value in np.where(region_mask)] + result['y_centroid'] = centroid[0] + result['x_centroid'] = centroid[1] + + # compute azimuth/altitude max,min,range and bias + az_min, az_max, az_range, az_bias = retinotopy_metric(region_mask, + azimuth) + alt_min, alt_max, alt_range, alt_bias = retinotopy_metric(region_mask, + altitude) + result['azimuth_min'] = az_min + result['azimuth_max'] = az_max + result['azimuth_range'] = az_range + result['azimuth_bias'] = az_bias + result['altitude_min'] = alt_min + result['altitude_max'] = alt_max + result['altitude_range'] = alt_range + result['altitude_bias'] = alt_bias + + # eccentricity at centroid + cy = int(round(result['y_centroid'])) + cx = int(round(result['x_centroid'])) + result['eccentricity_at_centroid'] = float(eccentricity_ret_zero[cy,cx]) + + return result diff --git a/internal/brain_observatory/demix_report.py b/internal/brain_observatory/demix_report.py new file mode 100644 index 0000000000..4972c5d1e6 --- /dev/null +++ b/internal/brain_observatory/demix_report.py @@ -0,0 +1,250 @@ +import logging +import numpy as np +import h5py + +#import matplotlib +#matplotlib.use('agg') +import matplotlib.pyplot as plt +import os + +def background_trace(trace, save_dir, data_set=None): + + fig,ax = plt.subplots(1) + ax.plot(trace) + if data_set is not None: + _add_stim_epochs(trace, ax, data_set) + + save_file = os.path.join(save_dir, 'background_trace.pdf') + fig.savefig(save_file) + logging.info("Background Trace saved to %s", save_file) + + plt.close(fig) + +def correlation_report(dm, save_dir, without_masks=True): + ''' + parameters: + dm: [DeMix object] + without_masks: boolean + ''' + + logging.info("Generating Correlation Report") + if without_masks: + cor, cor_demix = compute_correlations_without_masks(dm) + + no_diagonal_mask = (1.0 - np.eye(cor.shape[0])).astype('bool') + + fig, ax = plt.subplots(1) + ax.plot(dm.mask_overlap[:-1,:-1][no_diagonal_mask],cor[no_diagonal_mask]-cor_demix[no_diagonal_mask],'o') + ax.set_xlim([-1,np.max(dm.mask_overlap[:-1,:-1][no_diagonal_mask])]) + ax.set_title('Delta Correlation vs. mask overlap') + + save_file = os.path.join(save_dir,'cor_vs_overlap.pdf') + fig.savefig(save_file) + logging.info("\tCorrelation overlap saved to %s", save_file) + plt.close(fig) + + fig, ax = plt.subplots(1,3) + delta_cor = cor- cor_demix + ax[0].hist(delta_cor[dm.mask_overlap[:-1,:-1]==0],bins=100) + ax[0].set_title('Delta Correlation') + ax[1].hist(cor[no_diagonal_mask],bins=100) + ax[1].set_title('Pre-demix Correlation') + ax[2].hist(cor_demix[no_diagonal_mask],bins=100) + ax[2].set_title('Post-demix Correlation') + + save_file = os.path.join(save_dir,'cor_hist.pdf') + fig.savefig(save_file) + logging.info("\tCorrelation histograms saved to %s", save_file) + plt.close(fig) + + + else: + raise Exception('without_masks=False not yet implemented') + +def plot_masks(dm, save_dir, movie_file, movie_dataset, window=150, add_background=True): + + logging.info("Plotting masks") + + overlap_pairs = [(x,y) for (x,y) in zip(*np.where(dm.mask_overlap >0)) if x>y and x!=dm.mask_overlap.shape[0]-1] + movie_data = h5py.File(movie_file,'r') + + bg_traces = dm.get_traces_with_background() + + for i,pair in enumerate(overlap_pairs): + fig_pair, ax_pair = plt.subplots(2,2) + + mask = np.zeros(dm.masks[0].shape) + rgb_shape = (dm.masks[0].shape[0],dm.masks[0].shape[1],3) + rgb_mask = np.zeros(rgb_shape,dtype=np.uint8) + #for p in pair: + rgb_mask[:,:,2] = 255*dm.masks[pair[0]] + rgb_mask[:,:,1] = 255*dm.masks[pair[1]] + for p in pair: + mask += dm.masks[p] + non_zeros = np.where(mask) + non_zeros_mask = np.zeros(mask.shape) + ylower = np.min(non_zeros[0]) + yupper = np.max(non_zeros[0]) + xlower = np.min(non_zeros[1]) + xupper = np.max(non_zeros[1]) + + #ax_pair[0,0].imshow(mask[ylower:yupper,xlower:xupper]) + ax_pair[0,0].imshow(rgb_mask[ylower:yupper,xlower:xupper]) + + trace1 = dm.traces[pair[0]] + trace2 = dm.traces[pair[1]] + + if add_background: + trace1_demix = bg_traces[pair[0]] + trace2_demix = bg_traces[pair[1]] + else: + trace1_demix = dm.traces_demix[pair[0]] + trace2_demix = dm.traces_demix[pair[1]] + + center = np.where(trace1==np.max(trace1))[0][0] + + ax_pair[1,0].plot(trace1[(center-window):(center+window)],label=str(pair[0])) + ax_pair[1,0].plot(trace2[(center-window):(center+window)],label=str(pair[1])) + ax_pair[1,0].legend() + + ax_pair[1,1].plot(trace1_demix[center-window:center+window],label=str(pair[0])) + ax_pair[1,1].plot(trace2_demix[center-window:center+window],label=str(pair[1])) + ax_pair[1,1].legend() + + ax_pair[0,1].imshow(movie_data[movie_dataset][center,ylower:yupper,xlower:xupper]) + + save_file = os.path.join(save_dir,'masks_'+str(pair[0])+'_'+str(pair[1])+'.pdf') + fig_pair.savefig(save_file) + plt.close(fig_pair) + logging.info("\tMask saved to %s", save_file) + + #print(overlap_pairs) + #print(np.unique(dm.mask_overlap[no_diagonal_mask][dm.mask_overlap[no_diagonal_mask]>0])) + + +def _get_epoch_windows(stim_table): + + start = np.array(stim_table.start) + end = np.array(stim_table.end) + + windows = zip(start,end) + window_list = [[start[0]]] + for i,w in enumerate(windows[1:]): + if start[i+1] - end[i]>1: + window_list[-1].append(end[i]) + window_list.append([start[i+1]]) + #window_list += [end[i],start[i+1]] + + window_list[-1].append(end[-1]) + + #window_list = [start[0]] + #window_list += [ start[x+1] for x in list(np.where(np.abs(start[1:] - end[:-1]) > 1)[0])] + #window_list += [end[-1]] + + #print(window_list) + + return window_list + +def _add_stim_epochs(trace,ax,data_set): + + stim_colors_dict = {'locally_sparse_noise':'green','drifting_gratings':'yellow','natural_movie_one':'magenta','natural_movie_two':'magenta','natural_movie_three':'red','natural_scenes':'orange','spontaneous':'grey','static_gratings':'blue'} + + from allensdk.brain_observatory.stimulus_info import stimuli_in_session + + stim_types = stimuli_in_session(data_set.get_metadata()['session_type']) + + + for stim in stim_types: + #print(stim) + stim_table = data_set.get_stimulus_table(stim) + window_list = _get_epoch_windows(stim_table) + for w in window_list: + #ax.fill_betweenx(np.arange(trace.shape[0]),w[0],w[1],facecolor=stim_colors_dict[stim],alpha=0.2) + #ax.axvspan(w[0],w[1],np.min(trace),np.max(trace),facecolor=stim_colors_dict[stim],alpha=0.2) + ax.axvspan(w[0],w[1],facecolor=stim_colors_dict[stim],alpha=0.2) + ax.set_ylim([np.min(trace),np.max(trace)]) + + +def compute_non_overlap_masks(dm): + + no_masks = np.zeros(dm.masks.shape).astype(int) + overlap_val = np.zeros(dm.masks.shape[0]) + + for i, m in enumerate(dm.masks): + + overlap_1 = np.sum(dm.masks[:i],axis=0) + overlap_2 = np.sum(dm.masks[i+1:],axis=0) + + overlap = overlap_1 + overlap_2 + + overlap_val[i] = np.sum(overlap) + + no1 = overlap == 0 + #no2 = overlap_2 == 0 + + no_masks[i] = np.logical_and(no1, m) + + dm.no_masks = no_masks + dm.overlap = overlap + + return dm.no_masks + +def compute_non_overlap_traces(dm, movie_path, movie_dataset): + no_traces_shape = (dm.traces.shape[0],dm.traces.shape[1]) + no_traces = np.zeros(no_traces_shape) + + N, T = no_traces.shape + + chunk_size = 1000 + num_chunks = int(np.ceil(T/float(chunk_size))) + + normalized_flat_masks = dm.no_masks.reshape(N,-1).T # shape (pixels, N) + normalized_flat_masks /= np.sum(normalized_flat_masks,axis=0) # shape(pixels, N) + + movie_f = h5py.File(movie_path) + movie = movie_f[movie_dataset] + + logging.debug("Getting traces for %d chunks", num_chunks) + for n in range(num_chunks): + print("Chunk = ", n) + data = movie[n*chunk_size:(n+1)*chunk_size] + data = data.reshape(chunk_size,-1) # This line throws an error + + no_traces[:,n*chunk_size:(n+1)*chunk_size] = np.dot(data,normalized_flat_masks).T + + movie_f.close() + + logging.debug("Done") + dm.no_traces = no_traces + + return dm.no_traces + +def compute_correlations(dm, movie_path, movie_dataset): + + compute_non_overlap_masks(dm) + compute_non_overlap_traces(dm, movie_path, movie_dataset) + + no_mean = np.mean(dm.no_traces) + dm_mean = np.mean(dm.traces_demix) + t_mean = np.mean(dm.traces) + + C_no_dm = np.mean( (dm.no_traces-no_mean)*(dm.traces_demix-dm_mean), axis=1) + C_t_dm = np.mean( (dm.traces-t_mean)*(dm.traces_demix-dm_mean), axis=1) + + return C_no_dm, C_t_dm + +def compute_correlations_without_masks(dm): + N, T = dm.traces.shape + N=N -1 + + traces = (dm.traces.T - np.mean(dm.traces.T,axis=0)) # shape (T,N) + traces_demix = (dm.traces_demix.T - np.mean(dm.traces_demix.T,axis=0)) # shape (T,N) + + traces /= np.std(traces,axis=0) + traces_demix /= np.std(traces_demix,axis=0) + + cor = np.dot(traces.T,traces)/T + cor_demix = np.dot(traces_demix.T,traces_demix)/T + + return cor[:N,:N], cor_demix[:N,:N] + diff --git a/internal/brain_observatory/demixer.py b/internal/brain_observatory/demixer.py new file mode 100644 index 0000000000..cc54c5a6fc --- /dev/null +++ b/internal/brain_observatory/demixer.py @@ -0,0 +1,359 @@ +import scipy.sparse as sparse +import scipy.linalg as linalg +import numpy as np +import os +import matplotlib.pyplot as plt +import allensdk.internal.brain_observatory.mask_set as mask_set +import logging +import matplotlib.colors as colors +from allensdk.config.manifest import Manifest +from allensdk.deprecated import deprecated + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "identify_valid_masks instead.") +def identify_valid_masks(mask_array): + ms = mask_set.MaskSet(masks=mask_array.astype(bool)) + valid_masks = np.ones(mask_array.shape[0]).astype(bool) + + # detect duplicates + duplicates = ms.detect_duplicates(overlap_threshold=0.9) + if len(duplicates) > 0: + valid_masks[duplicates.keys()] = False + + # detect unions, only for remaining valid masks + valid_idxs = np.where(valid_masks) + ms = mask_set.MaskSet(masks=mask_array[valid_idxs].astype(bool)) + unions = ms.detect_unions() + + if len(unions) > 0: + un_idxs = unions.keys() + valid_masks[valid_idxs[0][un_idxs]] = False + + return valid_masks + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "demix_time_dep_masks instead.") +def demix_time_dep_masks(raw_traces, stack, masks): + ''' + + :param raw_traces: extracted traces + :param stack: movie (same length as traces) + :param masks: binary roi masks + :return: demixed traces + ''' + N, T = raw_traces.shape + _, x, y = masks.shape + P = x * y + + if len(stack.shape) == 3: + stack = stack.reshape(T, P) + + num_pixels_in_mask = np.sum(masks, axis=(1, 2)) + F = raw_traces.T * num_pixels_in_mask # shape (T,N) + F = F.T + + flat_masks = masks.reshape(N, P) + flat_masks = sparse.csr_matrix(flat_masks) + + drop_frames = [] + demix_traces = np.zeros((N, T)) + + for t in range(T): + + weighted_mask_sum = F[:, t] + drop_test = (weighted_mask_sum == 0) + + if np.sum(drop_test == 0): + norm_mat = sparse.diags(num_pixels_in_mask / weighted_mask_sum, offsets=0) + stack_t = sparse.diags(stack[t], offsets=0) + + flat_weighted_masks = norm_mat.dot(flat_masks.dot(stack_t)) + + overlap = flat_masks.dot(flat_weighted_masks.T).toarray() # cast to dense numpy array for linear solver because solution is dense + try: + demix_traces[:, t] = linalg.solve(overlap, F[:, t]) + except linalg.LinAlgError as e: + logging.warning("singular matrix, using least squares") + x, _, _, _ = linalg.lstsq(overlap, F[:, t]) + demix_traces[:, t] = x + + drop_frames.append(False) + + else: + drop_frames.append(True) + + return demix_traces, drop_frames + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "plot_traces instead.") +def plot_traces(raw_trace, demix_trace, roi_id, roi_ind, save_file): + fig, ax = plt.subplots() + + ax.plot(raw_trace, label='Fluoresence') + ax.plot(demix_trace, label='Demixed') + ax.set_title("ROI ID(%d) index (%d)" % (roi_id, roi_ind)) + ax.legend() + plt.savefig(save_file) + plt.close(fig) + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "find_zero_baselines instead.") +def find_zero_baselines(traces): + means = traces.mean(axis=1) + stds = traces.std(axis=1) + return np.where((means-stds) < 0) + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "plot_negative_baselines instead.") +def plot_negative_baselines(raw_traces, demix_traces, mask_array, roi_ids_mask, plot_dir, ext='png'): + N, T = raw_traces.shape + _, x, y = mask_array.shape + + logging.debug("finding negative baselines") + neg_inds = find_negative_baselines(demix_traces)[0] + + overlap_inds = set() + logging.debug("detected negative baselines: %s", str(neg_inds)) + for roi_ind in neg_inds: + Manifest.safe_mkdir(plot_dir) + + save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative.' + ext) + plot_traces(raw_traces[roi_ind], demix_traces[roi_ind], roi_ids_mask[roi_ind], roi_ind, save_file) + + ''' plot overlapping masks ''' + save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative_masks.' + ext) + roi_overlap_inds = plot_overlap_masks_lengthOne(roi_ind, mask_array, save_file) + + overlap_inds.update(roi_overlap_inds) + + zero_inds = find_zero_baselines(demix_traces)[0] + logging.debug("detected zero baselines: %s", str(zero_inds)) + overlap_inds.update(zero_inds) + + return list(overlap_inds) + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "plot_negative_transients instead.") +def plot_negative_transients(raw_traces, demix_traces, valid_roi, mask_array, roi_ids_mask, plot_dir, ext='png'): + + N, T = raw_traces.shape + _, x, y = mask_array.shape + + logging.debug("finding negative transients") + trans_ind_list1 = [find_negative_transients_threshold(trace=demix_traces[n]) for n in range(N)] + rois_with_trans1 = [i for i in range(N) if len(trans_ind_list1[i]) > 0] + rois_with_trans = np.unique(rois_with_trans1) + rois_with_trans = [r for r in rois_with_trans if len(trans_ind_list1[r][0]) > 0] + + logging.debug("plotting negative transients") + + flat_masks = mask_array.reshape(N, x*y) + overlap = flat_masks.dot(flat_masks.T) + overlap ^= np.diag(np.diag(overlap)) + + for roi_ind in rois_with_trans: + + ''' plot biggest negative transient of this roi ''' + trans_ind_list = trans_ind_list1[roi_ind] + + trans_ind_list = trans_ind_list[0] + trans_list = [] + for i in trans_ind_list: + if i > 100 and i < T - 100: + trans_list.append(demix_traces[roi_ind, i - 100:i + 100]) + elif i > 100 and i >= T - 100: + trans_list.append(demix_traces[roi_ind, i - 100:]) + else: + trans_list.append(demix_traces[roi_ind, :i + 100]) + + # trans_list = [demix_traces[roi_ind, i-100:i+100] for i in trans_ind_list if i > 100 and i < Nt] + Ntrans = len(trans_list) + biggest_trans = 0 + for i in range(1, Ntrans): + if np.amin(trans_list[i]) < np.amin(trans_list[biggest_trans]): + biggest_trans = i + + trans_ind = trans_ind_list[biggest_trans] + + # trans_ind_list = np.concatenate((trans_ind_list1[roi_ind][0], trans_ind_list2[roi_ind][0])) + # trans_list_min = np.where(demix_traces[roi_ind, trans_ind_list] == min(demix_traces[roi_ind, trans_ind_list]))[0] + + if np.sum(overlap[roi_ind]) > 0: + + if valid_roi[roi_ind]: + + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_valid.' + ext) + plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) + + ''' plot overlapping masks ''' + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_valid.' + ext) + plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) + # plot_overlap_masks(roi_ind, mask_test, savefile) + else: + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_invalid.' + ext) + plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) + + ''' plot overlapping masks ''' + savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_invalid.' + ext) + plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) + # plot_overlap_masks(roi_ind, mask_test, savefile) + # + else: + continue + + return rois_with_trans + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "rolling_window instead.") +def rolling_window(trace, window=500): + ''' + + :param trace: + :param window: + :return: + ''' + + shape = trace.shape[:-1] + (trace.shape[-1] - window + 1, window) + strides = trace.strides + (trace.strides[-1], ) + + return np.lib.stride_tricks.as_strided(trace, shape=shape, strides=strides) + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "find_negative_baselines instead.") +def find_negative_baselines(trace): + means = trace.mean(axis=1) + stds = trace.std(axis=1) + return np.where((means+stds) < 0) + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "find_negative_transients_threshold instead.") +def find_negative_transients_threshold(trace, window=500, length=10, std_devs=3): + trace = np.pad(trace, pad_width=(window-1, 0), mode='constant', constant_values=[np.mean(trace[:window])]) + rolling_mean = np.mean(rolling_window(trace, window), -1) + rolling_std = np.std(rolling_window(trace, window), -1) + + below_thresh = (trace[window-1:] < rolling_mean - std_devs*rolling_std) + below_thresh = np.pad(below_thresh, pad_width=(window-1, 0), mode='constant') + trans_length = np.sum(rolling_window(below_thresh, length), -1) + trans_length = trans_length[window-length:] + + trans_ind = np.where(trans_length == length) + + return trans_ind + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "plot_overlap_masks_lengthOne instead.") +def plot_overlap_masks_lengthOne(roi_ind, masks, savefile=None, weighted=False): + + masks = np.array(masks).astype(float) + N, x, y = masks.shape + if np.sum(masks[-1]) == x*y: + masks = masks[:-1] + N -= 1 + + flat_masks = masks.reshape(N, x*y) + masks_overlap = flat_masks.dot(flat_masks.T) + + ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with + for i in ind_plot: # rois that overlap with each roi k + ind_k = np.where(masks_overlap[i, :] > 0)[0] + ind_plot = np.concatenate((ind_plot, ind_k)) + + ind_plot = np.unique(ind_plot) + ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) + + plt.figure() + color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] + Ncol = len(color_list) + for num, i in enumerate(ind_plot): + mask_plot = masks[i] + if not weighted: + mask_plot = ((num % Ncol)+1)*np.ma.array(masks[i], mask=(masks[i] == 0)) + plt.imshow(mask_plot, clim=(1., Ncol+1), cmap=colors.ListedColormap(color_list), alpha=0.5, interpolation='nearest') + # plt.imshow(mask_plot, clim=(1., len(ind_plot)), alpha=.5) + + elif weighted: + mask_plot = np.ma.array(masks[i], mask=(masks[i] == 0)) + plt.imshow(mask_plot, cmap='gray_r', alpha=.5, interpolation='nearest') + + plt.text(np.mean(np.where(np.sum(mask_plot, axis=0))), np.mean(np.where(np.sum(mask_plot, axis=1))) ,str(i)) + + mask_tot = np.sum(masks[ind_plot, :, :], axis=0) + mask_x = np.sum(mask_tot, axis=0) + mask_y = np.sum(mask_tot, axis=1) + + plt.xlim((np.amin(np.where(mask_x))-5, np.amax(np.where(mask_x))+5)) + plt.ylim((np.amin(np.where(mask_y))-5, np.amax(np.where(mask_y))+5)) + plt.title('Masks') + + if savefile is not None: + plt.savefig(savefile) + plt.close() + + return ind_plot + + +@deprecated("The internal demixer module is deprecated and will be removed. " + "Please use allensdk.brain_observatory.demixer." + "plot_transients instead.") +def plot_transients(roi_ind, t_trans, masks, traces, demix_traces, savefile): + + masks = np.array(masks).astype(float) + N, x, y = masks.shape + _, Nt = traces.shape + + flat_masks = masks.reshape(N, x*y) + masks_overlap = flat_masks.dot(flat_masks.T) + + ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with + for i in ind_plot: # rois that overlap with each roi k + ind_k = np.where(masks_overlap[i, :] > 0)[0] + ind_plot = np.concatenate((ind_plot, ind_k)) + + ind_plot = np.unique(ind_plot) + ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) + + if t_trans > 150 and t_trans < Nt - 150: + plot_t = range(t_trans - 150, t_trans + 150) + elif t_trans > 150 and t_trans >= Nt - 150: + plot_t = range(t_trans - 150, Nt) + else: + plot_t = range(0, t_trans + 150) + + fig, ax = plt.subplots(1, 2, figsize=(12, 6), sharex=True, sharey=True) + color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] + Ncol = len(color_list) + + for num, i in enumerate(ind_plot): + ax[0].plot(plot_t, traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) + ax[1].plot(plot_t, demix_traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) + + ax[0].set_title('Raw') + ax[0].set_ylabel('Fluorescence') + ax[1].set_title('Demixed') + ax[1].set_xlabel('Time') + ax[0].legend(loc=0) + + plt.savefig(savefile) + plt.close(fig) + diff --git a/internal/brain_observatory/eye_calibration.py b/internal/brain_observatory/eye_calibration.py new file mode 100644 index 0000000000..df9a09767b --- /dev/null +++ b/internal/brain_observatory/eye_calibration.py @@ -0,0 +1,346 @@ +import numpy as np +import logging + +MONITOR_POSITION_OLD = np.array([17.0, 0.0, 0.0]) +MONITOR_POSITION_NEW = np.array([11.86, 8.62, 3.16]) +MONITOR_ROTATIONS = np.array([0.0, 0.0, 0.0]) + +CAMERA_POSITION_OLD = np.array([13.0, 0, 0]) +CAMERA_POSITION_NEW = np.array([10.28, 7.47, 2.74]) +CAMERA_ROTATIONS_OLD = np.array([0.0, 0.0, 13.1*np.pi/180]) +CAMERA_ROTATIONS_NEW = np.array([0.0, 0.0, 2.8*np.pi/180]) + +LED_POSITION_ORIGINAL = np.array([26.51, -3.93, 0.1]) +LED_POSITION_OLD = np.array([25.89, -6.12, 3.21]) +LED_POSITION_NEW = np.array([24.6, 9.23, 5.26]) + +EYE_RADIUS = 0.1682 # in cm +CM_PER_PIXEL = 10.2/10000.0 + +class EyeCalibration(object): + '''Class for performing eye-tracking calibration. + + Provides methods for estimating the position of the pupil in + 3D space and projecting the gaze onto the monitor in both + 3D space and monitor space given the experimental geometry. + + Parameters + ---------- + monitor_position : numpy.ndarray + [x,y,z] position of monitor in cm. + monitor_rotations : numpy.ndarray + [x,y,z] rotations of monitor in radians. + led_position : numpy.ndarray + [x,y,z] position of LED in cm. + camera_position : numpy.ndarray + [x,y,z] position of camera in cm. + camera_rotations : numpy.ndarray + [x,y,z] rotations for camera in radians. X and Y must be 0. + eye_radius : float + Radius of the eye in cm. + cm_per_pixel : float + Pixel size of eye-tracking camera. + ''' + def __init__(self, monitor_position=MONITOR_POSITION_NEW, + monitor_rotations=MONITOR_ROTATIONS, + led_position=LED_POSITION_OLD, + camera_position=CAMERA_POSITION_OLD, + camera_rotations=CAMERA_ROTATIONS_OLD, + eye_radius=EYE_RADIUS, + cm_per_pixel=CM_PER_PIXEL): + '''Constructor.''' + + self.eye_radius = eye_radius + self.cm_per_pixel = cm_per_pixel + + self.monitor_position = monitor_position + self.led_position = led_position + self.camera_position = camera_position + + self.cr = self.cr_position_in_mouse_eye_coordinates(led_position, + eye_radius) + + self.monitor_rotations = monitor_rotations + if camera_rotations[0] != 0 or camera_rotations[1] != 0: + logging.warning("Got nonzero x=%s,y=%s rotations for camera", + camera_rotations[0], camera_rotations[1]) + self.camera_rotation = camera_rotations[2] + + def pupil_position_in_mouse_eye_coordinates(self, pupil_parameters, + cr_parameters): + '''Compute the 3D pupil position in mouse eye coordinates. + + Parameters + ---------- + pupil_parameters : numpy.ndarray + Array of pupil parameters for each eye tracking frame. + cr_paramaeters : numpy.ndarray + Array of corneal reflection parameters for each eye + tracking frame. + + Returns + ------- + numpy.ndarray + Pupil position estimates in eye coordinates. + ''' + # x, y are in screen coordinates, with y increasing towards the top + delta_px = (pupil_parameters.T[0] - cr_parameters.T[0]) * \ + self.cm_per_pixel + delta_py = (cr_parameters.T[1] - pupil_parameters.T[1]) * \ + self.cm_per_pixel # +y is down on image + + R_cam_to_eye = base_object_to_eye_rotation_matrix( + self.camera_position) + # camera frame is passed to us pointed at the eye, but the image + # appears as if the camera were rotated 180 degrees about its y-axis + R_cam = object_rotation_matrix(0, np.pi, self.camera_rotation) + cr_cam = np.dot(R_cam, np.dot(R_cam_to_eye.T, self.cr)) + + px_cam = cr_cam[0] + delta_px + py_cam = cr_cam[1] + delta_py + pz_cam = np.sqrt(self.eye_radius**2 - px_cam**2 - py_cam**2) + + # estimating a position outside the eyeball is impossible, bad data + bad_idx = np.sqrt(px_cam**2 + py_cam**2) > self.eye_radius + px_cam[bad_idx] = np.nan + py_cam[bad_idx] = np.nan + pz_cam[bad_idx] = np.nan + + p_cam = np.vstack([px_cam, py_cam, pz_cam]) + + # rotate estimates + return np.dot(R_cam_to_eye, np.dot(R_cam.T, p_cam)).T + + @staticmethod + def cr_position_in_mouse_eye_coordinates(led_position, eye_radius): + '''Determine the 3D position of the corneal reflection. + + The eye is modeled as a spherical mirror, so the reflection + appears to be half the radius of the eye from the origin along + the eye-LED axis. + + Parameters + ---------- + led_position : numpy.ndarray + [x,y,z] position of the LED in eye coordinates. + eye_radius : float + Radius of the eye in centimeters. + + Returns + ------- + numpy.ndarray + [x,y,z] location of the corneal reflection in eye coordinates. + ''' + return (eye_radius/(2*np.linalg.norm(led_position))) * led_position + + def pupil_position_on_monitor_in_cm(self, pupil_parameters, + cr_parameters): + '''Compute the pupil position on the monitor in cm. + + Parameters + ---------- + pupil_parameters : numpy.ndarray + Array of pupil parameters for each eye tracking frame. + cr_paramaeters : numpy.ndarray + Array of corneal reflection parameters for each eye + tracking frame. + + Returns + ------- + numpy.ndarray + Pupil position estimates in eye coordinates. + ''' + pupil_positions = self.pupil_position_in_mouse_eye_coordinates( + pupil_parameters, cr_parameters) + + monitor_normal = object_norm_eye_coordinates( + self.monitor_position, self.monitor_rotations[0], + self.monitor_rotations[1], self.monitor_rotations[2]) + + projected_positions = project_to_plane(monitor_normal, + self.monitor_position, + pupil_positions) + + monitor_positions = projected_positions - self.monitor_position + + R_monitor_to_eye = base_object_to_eye_rotation_matrix( + self.monitor_position) + R_monitor = object_rotation_matrix(self.monitor_rotations[0], + self.monitor_rotations[1], + self.monitor_rotations[2]) + + result = np.dot(R_monitor.T, + np.dot(R_monitor_to_eye.T, monitor_positions.T)) + return result[:2].T + + def pupil_position_on_monitor_in_degrees(self, pupil_parameters, + cr_parameters): + '''Get pupil position on monitor measured in visual degrees. + + Parameters + ---------- + pupil_parameters : numpy.ndarray + Array of pupil parameters for each eye tracking frame. + cr_paramaeters : numpy.ndarray + Array of corneal reflection parameters for each eye + tracking frame. + + Returns + ------- + numpy.ndarray + Pupil position estimate in visual degrees. + ''' + + mag = np.sqrt(np.sum(self.monitor_position**2)) + + pupil_pos = self.pupil_position_on_monitor_in_cm(pupil_parameters, + cr_parameters) + + x = pupil_pos.T[0] + y = pupil_pos.T[1] + + meridian = np.arctan(x/mag)*180/np.pi + elevation = np.arctan(y/np.sqrt(mag**2 + x**2))*180/np.pi + + angles = np.vstack([meridian, elevation]).T + + return angles + + def compute_area(self, pupil_parameters): + '''Compute the area of the pupil. + + Assume the pupil is a circle, and that as it moves off-axis + with the camera the observed ellipse major axis remains the + diameter of the circle. + + Parameters + ---------- + pupil_parameters : numpy.ndarray + [nx5] array of pupil parameters. + + Returns + ------- + numpy.ndarray + [nx1] array of pupil areas in estimated pixels. + ''' + r = np.maximum(pupil_parameters.T[3], pupil_parameters.T[4]) + return np.pi*r*r + + +def project_to_plane(plane_normal, plane_point, points): + '''Project from the origin through points onto a plane. + + Parameters + ---------- + plane_normal : numpy.ndarray + [x, y, z] normal unit vector to the plane. + plane_point : numpy.ndarray + [x, y, z] point on the plane. + points : numpy.ndarray + [nx3] points in space through which to project. + + Returns + ------- + numpy.ndarray + [nx3] points projected on the plane. + ''' + factor = np.sum(plane_normal*plane_point) / \ + np.sum(plane_normal*points, axis=1) + return (factor*points.T).T + + +def object_norm_eye_coordinates(object_position, x_rotation, + y_rotation, z_rotation): + '''Get the normal vector for the object plane in eye coordinates. + + Parameters + ---------- + object_position : numpy.ndarray + [x, y, z] location of the object in eye coordinates. + x_rotation : float + Rotation about the x-axis in radians. + y_rotation : float + Rotation about the y-axis in radians. + z_rotation : float + Rotation about the z-axis in radians. + + Returns + ------- + numpy.ndarray + Endpoint of the object plane vector in eye coordinates. + ''' + R_object_to_eye = base_object_to_eye_rotation_matrix(object_position) + R_object_frame = object_rotation_matrix(x_rotation, y_rotation, + z_rotation) + return np.dot(R_object_to_eye, np.dot(R_object_frame, [0, 0, 1])) + + +def base_object_to_eye_rotation_matrix(object_position): + '''Rotation matrix to rotate base object frame to eye coordinates. + + By convention, any other object's coordinate frame before rotations + is set with positive Z pointing from the object's position back + to the origin of the eye coordinate system, with X parallel to the + eye X-Y plane. + + Parameters + ---------- + object_position : np.ndarray + [x, y, z] position of object in eye coordinates. + + Returns + ------- + numpy.ndarray + [3x3] rotation matrix. + ''' + eye_norm = -object_position/np.linalg.norm(object_position) + + # rotate about eye-z to align eye-x to object-x + theta_z = -(np.pi/2 + np.arctan2(eye_norm[1], eye_norm[0])) + Rz = np.array([[np.cos(theta_z), -np.sin(theta_z), 0], + [np.sin(theta_z), np.cos(theta_z), 0], + [0, 0, 1]]) + eye_norm_about_z = np.dot(Rz, eye_norm) + + # rotate about x' to align eye-z to object-z + theta_x = np.pi/2 - np.arctan2(eye_norm_about_z[2], eye_norm_about_z[1]) + Rx = np.array([[1, 0, 0], + [0, np.cos(theta_x), -np.sin(theta_x)], + [0, np.sin(theta_x), np.cos(theta_x)]]) + + R = np.dot(Rx, Rz).T + return R + + +def object_rotation_matrix(x_rotation, y_rotation, z_rotation): + '''Rotation matrix in object coordinate frame. + + The rotation matrix for rotating the object coordinate frame from + the initial position. This is done by rotating around x, then + around y', then around z''. + + Parameters + ---------- + x_rotation : float + Rotation about x axis in radians. + y_rotation : float + Rotation about y axis in radians. + z_rotation : float + Rotation about z axis in radians. + + Returns + ------- + numpy.ndarray + [3x3] rotation matrix. + ''' + Rx = np.array([[1, 0, 0], + [0, np.cos(x_rotation), -np.sin(x_rotation)], + [0, np.sin(x_rotation), np.cos(x_rotation)]]) + Ry = np.array([[np.cos(y_rotation), 0, np.sin(y_rotation)], + [0, 1, 0], + [-np.sin(y_rotation), 0, np.cos(y_rotation)]]) + Rz = np.array([[np.cos(z_rotation), -np.sin(z_rotation), 0], + [np.sin(z_rotation), np.cos(z_rotation), 0], + [0, 0, 1]]) + result = np.dot(Rz, np.dot(Ry, Rx)) + return result diff --git a/internal/brain_observatory/fit_ellipse.py b/internal/brain_observatory/fit_ellipse.py new file mode 100644 index 0000000000..2e5b67ea51 --- /dev/null +++ b/internal/brain_observatory/fit_ellipse.py @@ -0,0 +1,238 @@ +import numpy as np +import logging + +class FitEllipse (object): + + def __init__(self,min_points,max_iter,threshold,num_close): + + # points = np.array(candidate_points) + # y,x = points.T + + C = np.zeros([6,6]) + C[0,2]= 2.0 + C[2,0]= 2.0 + C[1,1]= -1.0 + + #self.x = x + #self.y = y + self.C = C + + self.min_points = min_points + self.max_iter = max_iter + self.threshold = threshold + self.num_close = num_close + + self.best_params = None + self.best_params_set = False + self.besterror = np.inf + + def ransac_fit(self,candidate_points): + + #points = np.array(candidate_points) + + for i in range(self.max_iter): + + inlier_points, outlier_points = self.choose_inliers(candidate_points) + params, error = self.fit_ellipse(inlier_points) + + if len(outlier_points)>0: + cost = self.outlier_cost(outlier_points,params) + also_in = 0 + for j,c in enumerate(cost): + point = outlier_points[j] + if cost[j]<self.threshold: + inlier_points += [point] + also_in += 1 + + if also_in > self.num_close: + params, error = self.fit_ellipse(inlier_points) + if (error < self.besterror): + self.best_params = params + self.best_params_set = True + self.besterror = error + + if self.best_params_set: + return ellipse_center(self.best_params), ellipse_angle_of_rotation(self.best_params)*180./np.pi, ellipse_axis_length(self.best_params) + else: + return None + + def choose_inliers(self, candidate_points): + + #cannot take a larger sample than population + if(len(candidate_points) > self.min_points): + inlier_index = np.random.choice(np.arange(len(candidate_points)),self.min_points,replace=False) + else: + #TODO check this + inlier_index = np.arange(self.min_points) + + inlier_points = [] + outlier_points = [] + + for i in range(len(candidate_points)): + if i in inlier_index: + inlier_points += [candidate_points[i]] + else: + outlier_points += [candidate_points[i]] + + return inlier_points, outlier_points + + def outlier_cost(self,outlier_points,params): + + y,x = np.array(outlier_points).T + + D = np.vstack([x*x, x*y, y*y, x, y, np.ones(len(y))]) + #S = np.dot(D, D.T) + + cost = (np.dot(params,D))**2 + + return cost + + def fit_ellipse(self,inlier_points): + try: + inlier_points = np.array(inlier_points) + points = np.array(inlier_points) + y,x = points.T + + D = np.vstack([x*x, x*y, y*y, x, y, np.ones(len(y))]) + S = np.dot(D, D.T) + + M = np.dot(np.linalg.inv(S),self.C) + U,s,V=np.linalg.svd(M) + + params = U.T[0] + error = np.dot(params, np.dot(S,params))/len(inlier_points) + except: + #TODO - check if this is correct + params = None #WBW error handling + error = 0.00000001 #WBW error handling + + return params, error + + +def ellipse_center(a): + b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] + num = b*b-a*c + x0=(c*d-b*f)/num + y0=(a*f-b*d)/num + return np.array([x0,y0]) + +def ellipse_angle_of_rotation( a ): + b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] + return 0.5*np.arctan(2*b/(a-c)) + +def ellipse_angle_of_rotation2( a ): + b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] + if b == 0: + if a > c: + return 0 + else: + return np.pi/2 + else: + if a > c: + return np.arctan(2*b/(a-c))/2 + else: + return np.pi/2 + np.arctan(2*b/(a-c))/2 + + +def ellipse_axis_length( a ): + b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] + up = 2*(a*f*f+c*d*d+g*b*b-2*b*d*f-a*c*g) + down1=(b*b-a*c)*( (c-a)*np.sqrt(1+4*b*b/((a-c)*(a-c)))-(c+a)) + down2=(b*b-a*c)*( (a-c)*np.sqrt(1+4*b*b/((a-c)*(a-c)))-(c+a)) + + #TODO check this - cannot divide by 0 so just use a small number instead + if(down1 == 0): + down1 = .0000000001 + + if(down2 == 0): + down2 = .0000000001 + + res1=np.sqrt(up/down1) + res2=np.sqrt(up/down2) + return np.array([res1, res2]) + +def fit_ellipse(candidate_points): + + # method from http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html + points = np.array(candidate_points) + y,x = points.T + D = np.vstack([x*x, x*y, y*y, x, y, np.ones(len(y))]) + S = np.dot(D, D.T) + + C = np.zeros([6,6]) + C[0,2]= 2.0 + C[2,0]= 2.0 + C[1,1]= -1.0 + + M = np.dot(np.linalg.inv(S),C) + + U,s,V=np.linalg.svd(M) + + params = U.T[0] + + return ellipse_center(params), ellipse_angle_of_rotation(params)*180./np.pi, ellipse_axis_length(params) + +def rotate_vector(y,x,theta): + + xp = x*np.cos(theta) - y*np.sin(theta) + yp = x*np.sin(theta) + y*np.cos(theta) + + return yp,xp + +def test_fit(): + + import matplotlib + matplotlib.use('Agg') + import matplotlib.pyplot as plt + + x = np.linspace(-3.0,3.0,1000) + yp = np.sqrt(4.0 - (4.0/9.0)*(x**2)) + ym = -yp + + yp += 0.1*np.random.normal(size=len(yp)) + ym += 0.1*np.random.normal(size=len(yp)) + + yp, x1 = rotate_vector(yp,x,np.pi/8) + ym, x2 = rotate_vector(ym,x,np.pi/8) + + y_outlier = np.random.random(size=100)*4.0 - 2.0 + x_outlier = np.random.random(size=100)*6.0 - 3.0 + + + outlier_points = np.vstack([y_outlier, x_outlier]).T + + candidate_points = np.vstack([np.hstack([yp,ym]), np.hstack([x,x])]).T + + candidate_points = np.vstack([outlier_points, candidate_points]) + + yt, xt = candidate_points.T + print(xt) + + #center, angle, (axis1,axis2) = fit_ellipse(candidate_points) + + fe=FitEllipse(40,100,0.0001,40) + result = fe.ransac_fit(candidate_points) + if result!=None: + center, angle, (axis1,axis2) = fe.ransac_fit(candidate_points) + + print("center = ", center) + print("angle = ", angle) + print("axis1 = ", axis1) + print("axis2 = ", axis2) + + fig,ax=plt.subplots(1) + ax.plot(x,yp,'bo') + ax.plot(x,ym,'bo') + ax.plot(x_outlier, y_outlier, 'rx') + + from matplotlib.patches import Ellipse + el = Ellipse(center,width=2.0*axis1,height=2.0*axis2,angle=angle,fill=False,linewidth=3,color='r') + + ax.add_artist(el) + + + plt.show() + +if __name__=='__main__': + + test_fit() diff --git a/internal/brain_observatory/frame_stream.py b/internal/brain_observatory/frame_stream.py new file mode 100644 index 0000000000..4723a75cd3 --- /dev/null +++ b/internal/brain_observatory/frame_stream.py @@ -0,0 +1,334 @@ +import subprocess as sp +import numpy as np +import logging +import sys, os +from collections import deque +import scipy.misc +import traceback +import signal + +class FrameInputStream( object ): + def __init__(self, movie_path, num_frames=None, block_size=1, cache_frames=False, process_frame_cb=None): + self.movie_path = movie_path + self.num_frames = num_frames + self.block_size = block_size + self.cache_frames = cache_frames + self.process_frame_cb = process_frame_cb if process_frame_cb else lambda f: f[:,:,0].copy() + + self.frames_read = 0 + self.frame_cache = [] + + def open(self): + self.frames_read = 0 + + def close(self): + logging.debug("Read total frames %d", self.frames_read) + + if self.num_frames is not None and self.frames_read != self.num_frames: + raise IOError("read incorrect number of frames: %d vs %d", self.frames_read, self.num_frames) + + def _error(self): + pass + + def _process_frame(self, frame): + return self.process_frame_cb(frame) + + def _read_iter(self): + pass + + def __enter__(self): + return self + + def __iter__(self): + # if we're caching frames and the cache exists, return it + if self.cache_frames and self.frame_cache: + n = self.num_frames if self.num_frames is not None else len(self.frame_cache) + for i in range(n): + yield self.frame_cache[i] + else: + self.open() + + self.frame_cache = [] + + for frame in self._read_iter(): + self.frame_cache.append(self._process_frame(frame)) + self.frames_read += 1 + + if (self.frames_read % 100) == 0: + logging.debug("Read frames %d", self.frames_read) + + if self.block_size is None: + continue + if self.block_size == 1: + yield self.frame_cache[-1] + elif (self.frames_read % self.block_size) == 0: + for i in range(-self.block_size,0): + yield self.frame_cache[i] + + if not self.cache_frames: + self.frame_cache = [] + + self.close() + + for frame in self.frame_cache: + yield frame + + if not self.cache_frames: + self.frame_cache = [] + + + def __exit__(self, exc_type, exc_value, tb): + if exc_value: + traceback.print_tb(tb) + self._error() + raise exc_value + + def create_images(self, output_directory, image_type): + for i, frame in enumerate(self): + file_name = os.path.join(output_directory, "input_frame-%06d." % i + image_type) + scipy.misc.imsave(file_name, frame) + + +class FfmpegInputStream( FrameInputStream ): + def __init__(self, movie_path, frame_shape, ffmpeg_bin='ffmpeg', num_frames=None, block_size=1, cache_frames=False, process_frame_cb=None): + super(FfmpegInputStream, self).__init__(movie_path=movie_path, num_frames=num_frames, block_size=block_size, cache_frames=cache_frames, process_frame_cb=process_frame_cb) + + self.ffmpeg_bin = ffmpeg_bin + self.frame_shape = frame_shape + + self.pipe = None + + def open(self): + super(FfmpegInputStream, self).open() + + if self.pipe: + raise IOError("pipe is open already") + + command = [ self.ffmpeg_bin, + '-i', self.movie_path, + '-f', 'image2pipe', + '-pix_fmt', 'rgb24', + '-vcodec', 'rawvideo'] + + if self.num_frames is not None: + command += ['-vframes', str(self.num_frames)] + + command += ['-'] + + frame_size = np.prod(self.frame_shape) + self.pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=0) + logging.debug("opened pipe") + + def close(self): + if self.pipe is None: + raise IOError("pipe is not open") + + if self.pipe.poll() is None: + logging.debug("pipe is still open. terminating.") + self.pipe.terminate() + + super(FfmpegInputStream, self).close() + + + rc = self.pipe.wait() + logging.debug("closed input pipe") + + if rc: + raise Exception("input pipe returned with error code %d" % rc) + + self.pipe = None + + def _process_frame(self, frame): + frame = np.fromstring(frame, dtype=np.uint8) + frame.resize(self.frame_shape) + return self.process_frame_cb(frame) + + def _read_iter(self): + if self.pipe is None: + raise IOError("pipe is not open") + + frame_size = np.prod(self.frame_shape) + + while self.pipe.poll() is None or self.pipe.stdout: + self.pipe.stdout.flush() + input_frame = self.pipe.stdout.read(frame_size) + + bytes_read = len(input_frame) + + if bytes_read == 0: + break + + if bytes_read != frame_size: + raise IOError("pipe read wrong number of bytes (%d vs %d)" % (frame_size, bytes_read)) + + yield input_frame + + def _error(self): + if self.pipe: + self.pipe.kill() + self.pipe = None + + def create_images(self, output_directory, image_type): + cmd = self.ffmpeg_bin + ' -i ' + self.movie_path + ' ' + output_directory + '/input_frame-%06d.' + image_type + + logging.debug("Calling ffmpeg with the command:") + logging.debug("\t"+cmd) + retcode = sp.call(cmd, shell=True) + if retcode != 0: + logging.debug(retcode) + raise Exception('Something went wrong with image creation') + + + +class CvInputStream( object): + def __init__(self, movie_path, num_frames=None, block_size=1, cache_frames=False): + super(FfmpegInputStream, self).__init__(movie_path=movie_path, num_frames=num_frames, block_size=block_size, cache_frames=cache_frames) + self.cap = None + + def open(self): + super(FfmpegInputStream, self).open() + + if self.cap: + raise IOError("capture is open already") + + self.frames_read = 0 + + import cv2 + self.cap = cv2.VideoCapture(self.movie_path) + logging.debug("opened capture") + + def close(self): + if self.cap is None: + return + + self.cap.release() + self.cap = None + + super(FfmpegInputStream, self).close() + + def _read_iter(self): + if self.cap is None: + raise IOError("capture is not open") + + while self.cap.isOpened(): + ret, frame = self.cap.read() + yield frame + + if self.frames_read == self.num_frames: + break + + def _error(self): + self.cap.release() + self.cap = None + +class FrameOutputStream( object ): + def __init__(self, block_size=1): + self.frames_processed = 0 + self.block_frames = [] + self.block_size = block_size + + def open(self, movie_path): + self.frames_processed = 0 + self.block_frames = [] + self.movie_path = movie_path + + def _write_frames(self, frames): + raise NotImplementedError() + + def write(self, frame): + self.block_frames.append(frame) + + if len(self.block_frames) == self.block_size: + self._write_frames(self.block_frames) + self.frames_processed += len(self.block_frames) + self.block_frames = [] + + def close(self): + if self.block_frames: + self._write_frames(self.block_frames) + self.frames_processed += len(self.block_frames) + self.block_frames = [] + + logging.debug("wrote %d frames", self.frames_processed) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + if exc_value: + raise exc_value + self.close() + +class ImageOutputStream( FrameOutputStream ): + def _write_frames(frames): + for i, frame in enumerate(frames): + file_name = self.movie_path % i + scipy.misc.imsave(file_name, frame) + + +class FfmpegOutputStream( FrameOutputStream ): + def __init__(self, frame_shape, ffmpeg_bin='ffmpeg', block_size=1): + super(FfmpegOutputStream, self).__init__(block_size) + + self.ffmpeg_bin = ffmpeg_bin + self.frame_shape = frame_shape + self.pipe = None + self.stopped = False + + def open(self, movie_path): + super(FfmpegOutputStream, self).open(movie_path) + + if self.pipe: + logging.warning("pipe is already open!") + return + + command = [ self.ffmpeg_bin, + '-y', + '-f', 'rawvideo', + '-vcodec', 'rawvideo', + '-s', '%dx%d' % (self.frame_shape[1], self.frame_shape[0]), + '-pix_fmt', 'rgb24', + '-r', '30', + '-i', '-', + '-an', + '-vcodec', 'libx264', + self.movie_path] + + self.pipe = sp.Popen(command, stdin=sp.PIPE) + os.kill(self.pipe.pid, signal.SIGSTOP) + self.stopped = True + logging.debug("opened output pipe") + + + def _write_frames(self, frames): + if self.pipe is None: + self.open(self.movie_path) + if self.stopped: + os.kill(self.pipe.pid, signal.SIGCONT) + self.stopped = False + + for frame in frames: + sys.stdout.flush() + self.pipe.stdin.write( frame.tostring() ) + + def close(self): + super(FfmpegOutputStream, self).close() + if self.pipe is None: + raise IOError("pipe is closed") + + self.pipe.stdin.close() + rc = self.pipe.wait() + + if rc: + raise Exception("output pipe returned with error code %d" % rc) + + logging.debug("closed output pipe") + self.pipe = None + + def __exit__(self, exc_type, exc_value, tb): + if exc_value: + self.pipe.kill() + raise exc_value + self.close() + + diff --git a/internal/brain_observatory/itracker.py b/internal/brain_observatory/itracker.py new file mode 100644 index 0000000000..10f476257c --- /dev/null +++ b/internal/brain_observatory/itracker.py @@ -0,0 +1,810 @@ +import numpy as np +import sys +import os +import subprocess as sp +from PIL import Image, ImageDraw +from scipy.misc import imsave +from scipy.signal import medfilt2d +import ast +import json + +from fit_ellipse import fit_ellipse, FitEllipse +from itracker_utils import generate_rays, initial_pupil_point, initial_cr_point, sobel_grad +import logging + +import matplotlib.pyplot as plt + +# import cv2 + +color_list = ['b','g','r','c','m','y','k'] + +class iTracker (object): + def __init__(self, output_folder, + im_shape, num_frames, + input_stream, + threshold_factor=1.3, auto=True, + cutoff_pixels=10, + bbox_pupil=None, + bbox_cr=None): + + self.im_shape = im_shape + self.num_frames = num_frames + self.movie_shape = (num_frames, im_shape[0], im_shape[1]) + self.input_stream = input_stream + + self.threshold_factor = threshold_factor + self.auto = auto + self.folder = output_folder + self.cutoff_pixels = cutoff_pixels + self.bbox_pupil = bbox_pupil + self.bbox_cr = bbox_cr + + self._mean_frame = None + + if not os.path.exists(self.folder): + os.mkdir(self.folder) + + self.run_params_file = os.path.join(self.folder, 'run_params.json') + self.run_params = { 'threshold_factor': threshold_factor, + 'auto': auto, + 'cutoff_pixels': cutoff_pixels, + 'movie_shape': self.movie_shape, + 'im_shape': im_shape, + 'bbox_pupil': bbox_pupil, + 'bbox_cr': bbox_cr } + with open(self.run_params_file, 'w') as f: + f.write(json.dumps(self.run_params)) + + self.movie_path_storage_file = os.path.join(self.folder, 'movie_path.txt') + if os.path.exists(self.movie_path_storage_file): + with open(self.movie_path_storage_file, 'r') as f: + self.movie_path = f.read() + else: + self.movie_path = None + + self.input_image_folder = os.path.join(self.folder, 'input_images') + if not os.path.exists(self.input_image_folder): + os.mkdir(self.input_image_folder) + + self.results_folder = os.path.join(self.folder,'results') + + if not os.path.exists(self.results_folder): + os.mkdir(self.results_folder) + + # self.rays_folder = os.path.join(self.results_folder,'rays') + # if not os.path.exists(self.rays_folder): + # os.mkdir(self.rays_folder) + + self.qc_folder = os.path.join(self.results_folder,'qc') + if not os.path.exists(self.qc_folder): + os.mkdir(self.qc_folder) + + self.frames_folder = os.path.join(self.results_folder,'output_frames') + if not os.path.exists(self.frames_folder): + os.mkdir(self.frames_folder) + + self.pupil_file = os.path.join(self.results_folder, 'pupil_params.npy') + self.cr_file = os.path.join(self.results_folder, 'cr_params.npy') + self.mean_frame_file = os.path.join(self.results_folder, 'mean_frame.npy') + self.annotated_movie_file = os.path.join(self.results_folder, 'annotated_movie.mp4') + + # add variables to determine whether to provide diagnostic, QC and other output + # method to regnerate image frames, with or without results? + + + # fix this so it sets an absolute path + def set_movie(self, file_path): + logging.debug("Setting movie_path to: %s", file_path) + self.movie_path = file_path + with open(self.movie_path_storage_file, 'w') as f: + f.write(self.movie_path) + + def set_bbox_pupil(self, bbox): + self.bbox_pupil = bbox + self.run_params['bbox_pupil']=self.bbox_pupil + with open(self.run_params_file, 'w') as f: + f.write(json.dumps(self.run_params)) + + def set_bbox_cr(self, bbox): + self.bbox_cr = bbox + self.run_params['bbox_cr']=self.bbox_cr + with open(self.run_params_file, 'w') as f: + f.write(json.dumps(self.run_params)) + + def create_input_images(self, image_type='png'): + self.input_stream.create_images(self.input_image_folder, image_type) + + @property + def mean_frame(self): + if self._mean_frame is None: + self._mean_frame = self.compute_mean_frame() + return self._mean_frame + + @mean_frame.setter + def mean_frame(self, mean_frame): + self._mean_frame = mean_frame + + def estimate_bbox_from_mean_frame(self, margin=75, image_type='png'): + try: + import keras + except ImportError: + logging.debug("keras failed to import. Returning None for bbox_pupil and bbox_cr") + return None, None + + from keras.applications import InceptionV3 + + logging.debug("Estimating bbox parameters from 'mean_frame'") + # compute the representation for mean_frame + model = InceptionV3(include_top=False, weights='imagenet') + # print(self.mean_frame.dtype, self.mean_frame.shape) + mp_temp = self.mean_frame.astype(np.float32) + mp_temp -= 128 + mp_temp /= 128 + rep = model.predict(mp_temp.reshape((1,)+mp_temp.shape)) # shape (1,13,18,2048) + rep[rep<0]=0 + rep = np.mean(rep, axis=(0,1,2)) # shape (2048,) + + # load regression weights + module_folder = os.path.dirname(os.path.abspath(__file__)) + W_pupil = np.load(os.path.join(module_folder,'resources','pupil_weights.npy')) # shape (2048, 5) + W_cr = np.load(os.path.join(module_folder,'resources','cr_weights.npy')) # shape (2048, 5) + + estimated_pupil_point = np.dot(rep, W_pupil) # shape (5,) + estimated_cr_point = np.dot(rep, W_cr) # shape (5,) + + x_pupil, y_pupil = estimated_pupil_point[:2]*np.array([640,480]) + x_pupil = int(x_pupil) + y_pupil = int(y_pupil) + logging.debug("estimated pupil point is ({0},{1})".format(x_pupil,y_pupil)) + print("estimated pupil point is ({0},{1})".format(x_pupil,y_pupil)) + # bbox is xmin, xmax, ymin, ymax + # x, y = 320, 240 + bbox_pupil = [x_pupil-margin, x_pupil+margin, y_pupil-margin, y_pupil+margin] + + x_cr, y_cr = estimated_cr_point[:2] + x_cr = int(x_cr) + y_cr = int(y_cr) + logging.debug("estimated cr point is ({0},{1})".format(x_cr,y_cr)) + print("estimated cr point is ({0},{1})".format(x_cr,y_cr)) + + # bbox is xmin, xmax, ymin, ymax + bbox_cr = [x_cr-margin, x_cr+margin, y_cr-margin, y_cr+margin] + # bbox_cr = None + + # plot bbox on mean_frame for QC check + mean_frame_annotated = np.dstack([self.mean_frame, self.mean_frame, self.mean_frame]) + mean_frame_annotated = self.annotate_frame_with_bbox(mean_frame_annotated,pupil_bbox=bbox_pupil,cr_bbox=bbox_cr) + mean_frame_annotated = self.annotate_frame_with_point(mean_frame_annotated,pupil=(x_pupil, y_pupil),cr=(x_cr, y_cr)) + + dpi = 100.0 + fig, ax = plt.subplots(figsize=(mean_frame.shape[1]/dpi, mean_frame.shape[0]/dpi)) + fig.subplots_adjust(left=0,right=1,bottom=0,top=1) + + ax.imshow(mean_frame_annotated, aspect='normal') + ax.axis('off') + fig.savefig(os.path.join(self.qc_folder, 'mean_frame_annotated.'+image_type), dpi=dpi) + + self.bbox_pupil = bbox_pupil + self.bbox_cr = bbox_cr + + return bbox_pupil, bbox_cr + + def compute_mean_frame(self, image_file_type='png'): + logging.debug("computing mean frame") + + mean_frame = np.zeros(self.im_shape) + + frames_read = 0 + for input_frame in self.input_stream: + mean_frame += input_frame + frames_read += 1 + + mean_frame /= frames_read + mean_frame = mean_frame.astype(np.uint8) + + np.save(self.mean_frame_file, mean_frame) + + dpi = 100.0 + fig, ax = plt.subplots(figsize=(mean_frame.shape[1]/dpi, mean_frame.shape[0]/dpi)) + fig.subplots_adjust(left=0,right=1,bottom=0,top=1) + ax.imshow(mean_frame, aspect='normal', cmap='gray') + ax.axis('off') + fig.savefig(os.path.join(self.qc_folder, 'mean_frame.' + image_file_type), dpi=dpi) + plt.close() + + if self.bbox_cr and self.bbox_pupil: + mean_frame_annotated = np.dstack([mean_frame,mean_frame,mean_frame]) + mean_frame_annotated = self.annotate_frame_with_bbox(mean_frame_annotated,pupil_bbox=self.bbox_pupil,cr_bbox=self.bbox_cr) + + fig, ax = plt.subplots(figsize=(mean_frame.shape[1]/dpi, mean_frame.shape[0]/dpi)) + fig.subplots_adjust(left=0,right=1,bottom=0,top=1) + ax.imshow(mean_frame_annotated, aspect='normal') + ax.axis('off') + fig.savefig(os.path.join(self.qc_folder, 'mean_frame_bbox.' + image_file_type), dpi=dpi) + plt.close() + + return mean_frame + + + + def detect_eye_closed(self): + + try: + import keras + except ImportError: + logging.debug("keras failed to import. Can't detect eye closure") + return None + + from keras.applications import InceptionV3 + + logging.debug("Detecting eye closed frames") + # compute the representation for mean_frame + model = InceptionV3(include_top=False, weights='imagenet') + # print(self.mean_frame.dtype, self.mean_frame.shape) + + # get pre-trained svm + from sklearn.externals import joblib + module_folder = os.path.dirname(os.path.abspath(__file__)) + svm = joblib.load(os.path.join(module_folder, 'resources','svm_trained.pkl')) + + def compute_rep(frame): + mp_temp = frame.astype(np.float32) + mp_temp -= 128 + mp_temp /= 128 + rep = model.predict(mp_temp.reshape((1,)+mp_temp.shape)) # shape (1,13,18,2048) + rep[rep<0]=0 + rep = np.mean(rep, axis=(0,1,2)) # shape (2048,) + + return rep + + is_closed = np.zeros(self.num_frames) + + for input_frame in self.input_stream: + rep = compute_rep(input_frame) + is_closed[i] = svm.predict(rep.reshape(-1,len(rep)))[0] + + self.is_closed = is_closed + save_path = os.path.join(self.results_folder, 'is_closed.npy') + + logging.debug("Saving is_closed to:") + logging.debug("\t%s", save_path) + # + np.save(save_path, self.is_closed) + + return is_closed + + def process_movie(self, movie_output_stream=None, + output_frames=False, + output_annotation_frames=False, + image_file_type = 'jpg' ): + + # these aren't really used yet. + # self.pupil_loc = (0,0) + # self.cr_loc = (0,0) + + self.pupil_params = np.zeros([self.num_frames, 5]) + self.cr_params = np.zeros([self.num_frames, 5]) + + if movie_output_stream: + movie_output_stream.open(self.annotated_movie_file) + else: + movie_output_stream = None + + if output_frames: + frame_output_stream = ImageOutputStream() + frame_output_stream.open(os.path.join(self.input_image_folder, 'input_frame-%06d.'+image_file_type)) + else: + frame_output_stream = None + + if output_annotation_frames: + annotation_frame_output_stream = ImageOutputStream() + annotation_frame_output_stream.open(os.path.join(self.frames_folder, 'output_frame-%06d.'+image_file_type)) + else: + annotation_frame_output_stream = None + + for i, input_frame in enumerate(self.input_stream): + # get pupil and corneal reflection parameters, this line is the actual eye tracking algorithm + pupil, cr = self.process_image(input_frame, bbox_pupil=self.bbox_pupil, bbox_cr=self.bbox_cr) + + pupil_params = (pupil[0][0],pupil[0][1],pupil[1],pupil[2][0],pupil[2][1]) + cr_params = (cr[0][0],cr[0][1],cr[1],cr[2][0],cr[2][1]) + + if frame_output_stream: + frame_output_stream.write(input_frame) + + if movie_output_stream or annotation_frame_output_stream: + annotated_frame = self.annotate_frame(np.dstack([input_frame,input_frame,input_frame]), + pupil_params, + cr_params) + + if movie_output_stream: + movie_output_stream.write( annotated_frame ) + + if annotation_frame_output_stream: + annotation_frame_output_stream.write( annotated_frame ) + + # save results in arrays + self.pupil_params[i] = (pupil[0][0],pupil[0][1],pupil[1],pupil[2][0],pupil[2][1]) + self.cr_params[i] = (cr[0][0],cr[0][1],cr[1],cr[2][0],cr[2][1]) + + if i % 100 == 0: + logging.debug("tracked frame %d", i) + + logging.debug("Saving pupil and cr parameters to:") + logging.debug("\t%s", self.pupil_file) + logging.debug("\t%s", self.cr_file) + # + np.save(self.pupil_file, self.pupil_params) + np.save(self.cr_file, self.cr_params) + + if movie_output_stream: + movie_output_stream.close() + + if frame_output_stream: + frame_output_stream.close() + + if annotation_frame_output_stream: + annotation_frame_output_stream.close() + + # return mean_frame + + def clear_input_images(self): + logging.debug("Deleting input image folder") + shutil.rmtree(os.path.join(self.folder, 'input_images')) + + def process_image(self, im, bbox_pupil=None, bbox_cr=None): + # let's try median filtering the image first + im = medfilt2d(im, kernel_size=3) + + # find pupil and corneal reflection if auto==True + if self.auto: + self.pupil_loc = initial_pupil_point(im, bbox=bbox_pupil) + self.cr_loc = initial_cr_point(im, bbox=bbox_cr) + + + # find rays projecting from seed point + pupil_rays, pupil_ray_values = generate_rays(im,self.pupil_loc) + + # save values for analysis + self.pupil_rays = pupil_rays + self.pupil_ray_values = pupil_ray_values + + # code for finding pupil ellipse, start with candidate points from rays + pupil_candidate_points = self.get_candidate_points(self.pupil_rays,self.pupil_ray_values,self.threshold_factor,above_threshold=True) + + # fit pupil ellipse with all candidate points + #pupil_params = fit_ellipse(pupil_candidate_points) + + # fit pupil ellipse with ransac algorithm + fe=FitEllipse(10,10,0.0001,4) + result = fe.ransac_fit(pupil_candidate_points) + + # if np.any(np.isnan(result)): #should use np.any(np.isnan(result)) + # pupil_params = result #fe.ransac_fit(pupil_candidate_points) + # else: + # pupil_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) # np.nan*np.ones(5) + + + if result!=None: #should use np.any(np.isnan(result)) + pupil_params = result #fe.ransac_fit(pupil_candidate_points) + else: + logging.debug("No good fit found") + pupil_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) # np.nan*np.ones(5) + + + # code for finding corneal reflection, start with finding rays from center of cr + cr_rays, cr_ray_values = generate_rays(im,self.cr_loc) + + self.cr_rays = cr_rays + self.cr_ray_values = cr_ray_values + + cr_candidate_points = self.get_candidate_points(self.cr_rays,self.cr_ray_values,0.75,above_threshold=False) + + try: + #cr_params = fit_ellipse(cr_candidate_points) + fe=FitEllipse(10,10,0.0001,4) + result = fe.ransac_fit(cr_candidate_points) + + if result!=None: + cr_params = result #fe.ransac_fit(cr_candidate_points) + else: + logging.debug("No good fit found") + cr_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) + except Exception as e: + logging.error("Error during fit: %s", e.message) + cr_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) + + # update instance variables + if not np.isnan(pupil_params[0][0]): #should use np.any(np.isnan(result)) + self.pupil_loc = (int(pupil_params[0][1]),int(pupil_params[0][0])) + + self.pupil_candidate_points = pupil_candidate_points + self.cr_candidate_points = cr_candidate_points + + return pupil_params, cr_params + + def get_candidate_points(self,rays,ray_values,threshold_f,above_threshold=True): + + candidate_points = [] + # find candidate points for ellipse from threshold crossing of the image over the rays + for i, ray in enumerate(rays): + + sample_ray = ray_values[i][:self.cutoff_pixels] + threshold = threshold_f*np.mean(sample_ray) + + for t,g in enumerate(ray_values[i][self.cutoff_pixels:]): + if above_threshold: + if g > threshold: + new_point = ray.T[t+self.cutoff_pixels] + candidate_points += [new_point] + break + else: + if g < threshold: + new_point = ray.T[t+self.cutoff_pixels] + candidate_points += [new_point] + break + + return candidate_points + + def set_seed_points(self, initial_pupil_x, initial_pupil_y, initial_cr_x, initial_cr_y): + self.initial_pupil_x = initial_pupil_x + self.initial_pupil_y = initial_pupil_y + self.initial_cr_x = initial_cr_x + self.initial_cr_y = initial_cr_y + + def process_all_images(self): + """ deprecated """ + + # these aren't really used yet. + self.pupil_loc = (0,0) + self.cr_loc = (0,0) + + frame_list = os.listdir(self.input_image_folder) + num_frames = len(frame_list) + + self.pupil_params = np.zeros([num_frames, 5]) + self.cr_params = np.zeros([num_frames, 5]) + + for i,frame in enumerate(frame_list): + logging.debug("Processing frame %d", i) + if frame[-4:]!='.jpg' and frame[-4:]!='.png': continue # just in case some OS specific files snuck in (like in OS X) + frame_path = os.path.join(self.input_image_folder,frame) + + # open Image, convert to gray scale and then to numpy array + im = Image.open(frame_path) + im = im.convert('L') + im = np.array(im) + + + # get pupil and corneal reflection parameters, this line is the actual eye tracking algorithm + pupil, cr = self.process_image(im) + + # save results in arrays + self.pupil_params[i] = (pupil[0][0],pupil[0][1],pupil[1],pupil[2][0],pupil[2][1]) + self.cr_params[i] = (cr[0][0],cr[0][1],cr[1],cr[2][0],cr[2][1]) + + logging.debug("Saving pupil and cr parameters to:") + logging.debug("\t%s", self.pupil_file) + logging.debug("\t%s", self.cr_file) + + np.save(self.pupil_file, self.pupil_params) + np.save(self.cr_file, self.cr_params) + + + @staticmethod + def rotate(X, Y, center_x, center_y, theta): + + Xp = (X-center_x)*np.cos(theta) - (Y-center_y)*np.sin(theta) + center_x + Yp = (X-center_x)*np.sin(theta) + (Y-center_y)*np.cos(theta) + center_y + + return Xp, Yp + + @staticmethod + def get_ellipse_mask(X, Y, params): + + center_x, center_y, theta, axis1, axis2 = params + + dX = X - center_x + dY = Y - center_y + + theta = theta*np.pi/180. + + Xp = dX*np.cos(theta) + dY*np.sin(theta) + Yp = -dX*np.sin(theta) + dY*np.cos(theta) + + mask1 = (Xp/axis1)**2 + (Yp/axis2)**2 < 1 + 0.1 + mask2 = (Xp/axis1)**2 + (Yp/axis2)**2 > 1 - 0.1 + + mask = np.logical_and(mask1, mask2) + + return mask + + def annotate_frame_old(self, im, pupil=None, cr=None): + + y, x, c = im.shape + + X, Y = np.meshgrid(np.arange(x), np.arange(y)) + + # pupil in red + if pupil is not None: + pupil_mask = self.get_ellipse_mask(X, Y, pupil) + im.T[0].T[pupil_mask] = 255 + im.T[1].T[pupil_mask] = 0 + im.T[2].T[pupil_mask] = 0 + + # cr in blue + if cr is not None: + cr_mask = self.get_ellipse_mask(X, Y, cr) + im.T[0].T[cr_mask] = 0 + im.T[1].T[cr_mask] = 0 + im.T[2].T[cr_mask] = 255 + + return im + + @classmethod + def ellipse_points_from_params(cls, params): + center_x, center_y, theta, axis1, axis2 = params + theta = theta*np.pi/180. # convert to radians + + points_x = np.array([ axis1*np.cos(phi) + center_x for phi in np.linspace(0,2*np.pi, 1000)]) + points_y = np.array([ axis2*np.sin(phi) + center_y for phi in np.linspace(0,2*np.pi, 1000)]) + + points_x, points_y = cls.rotate(points_x, points_y, center_x, center_y, theta) + + return points_x, points_y + + def annotate_frame(self, im, pupil=None, cr=None): + + y, x, c = im.shape + + im_pil = Image.fromarray(im) + + draw = ImageDraw.Draw(im_pil) + + if pupil is not None: + points_x, points_y = self.ellipse_points_from_params(pupil) + draw.point(zip(points_x, points_y), fill=(255,0,0)) + # for i, px in enumerate(points_x): + # im[int(points_y[i]), int(px), 0] = 255 + + if cr is not None: + points_x, points_y = self.ellipse_points_from_params(cr) + draw.point(zip(points_x, points_y), fill=(0,0,255)) + # for i, px in enumerate(points_x): + # im[int(points_y[i]), int(px), 0] = 255 + + # return im + return np.array(im_pil) + + def annotate_frame_with_bbox(self, im, pupil_bbox=None, cr_bbox=None): + + # y, x, c = im.shape + + im_pil = Image.fromarray(im) + + draw = ImageDraw.Draw(im_pil) + + if pupil_bbox is not None: + xmin, xmax, ymin, ymax = pupil_bbox + # print(pupil_bbox) + draw.rectangle([xmin,ymin,xmax,ymax],outline=(255,0,0)) + + # for i, px in enumerate(points_x): + # im[int(points_y[i]), int(px), 0] = 255 + + if cr_bbox is not None: + # print(cr_bbox) + xmin, xmax, ymin, ymax = cr_bbox + draw.rectangle([xmin,ymin,xmax,ymax],outline=(0,0,255)) + # for i, px in enumerate(points_x): + # im[int(points_y[i]), int(px), 0] = 255 + + # return im + return np.array(im_pil) + + def annotate_frame_with_point(self, im, pupil=None, cr=None): + + # y, x, c = im.shape + + # print(im.shape, im.dtype) + + im_pil = Image.fromarray(im) + + draw = ImageDraw.Draw(im_pil) + + if pupil is not None: + # points_x, points_y = ellipse_points_from_params(pupil) + # draw.point(pupil, fill=(255,0,0)) + draw.ellipse([pupil[0]-5,pupil[1]-5,pupil[0]+5,pupil[1]+5],fill=(255,0,0)) + # for i, px in enumerate(points_x): + # im[int(points_y[i]), int(px), 0] = 255 + + if cr is not None: + # points_x, points_y = ellipse_points_from_params(cr) + # draw.point(cr, fill=(0,0,255)) + draw.ellipse([cr[0]-5,cr[1]-5,cr[0]+5,cr[1]+5],fill=(0,0,255)) + # for i, px in enumerate(points_x): + # im[int(points_y[i]), int(px), 0] = 255 + + # return im + return np.array(im_pil) + + @staticmethod + def get_frame_index(frame_name): + + return int(frame_name[12:-4])-1 # change 7 to 12 + + # def annotate_frame(self, frame, im, pupil, cr): + # # this function is not done yet + # frame_index = self.get_frame_index(frame) + # + # new_im = im.copy() + # pupil = self.pupil_params[frame_index] + # cr = self.cr_params[frame_index] + # new_im = self.annotate_frame(new_im, pupil, cr) + # + # im_fig.set_data(new_im) + # + # fig.savefig(os.path.join(self.frames_folder, input_frame), dpi=100) + + def output_annotation(self, frames_to_output=None): + """generate a the series of images with eyetracking results superimposed""" + + fig, ax = plt.subplots(figsize=(4,3)) #, frameon=False) + fig.subplots_adjust(left=0,right=1,bottom=0,top=1) + + ax.axis('off') + # ax.axis('tight') + + self.pupil_params = np.load(self.pupil_file) + self.cr_params = np.load(self.cr_file) + + if frames_to_output is None: + frames_to_output = os.listdir(self.input_image_folder) + + first_frame = frames_to_output[0] + + frame_index = self.get_frame_index(first_frame) + im = Image.open(os.path.join(self.input_image_folder, first_frame)) + im = np.array(im) + + new_im = np.dstack([im,im,im]) + pupil = self.pupil_params[frame_index] + cr = self.cr_params[frame_index] + new_im = self.annotate_frame(new_im, pupil, cr) + + im_fig = ax.imshow(new_im, aspect='normal') #extent=(0,1,1,0) + + fig.savefig(os.path.join(self.frames_folder, first_frame), dpi=100) + + for input_frame in frames_to_output[1:]: + + frame_index = self.get_frame_index(input_frame) + im = Image.open(os.path.join(self.input_image_folder, input_frame)) + im = np.array(im) + + new_im = np.dstack([im,im,im]) + pupil = self.pupil_params[frame_index] + cr = self.cr_params[frame_index] + new_im = self.annotate_frame(new_im, pupil, cr) + + im_fig.set_data(new_im) + + fig.savefig(os.path.join(self.frames_folder, input_frame), dpi=100) + + def output_QC(self, image_type='png'): + """generate a set of summary statistics and plots for QC purposes""" + + logging.debug("saving QC images") + self.pupil_params = np.load(self.pupil_file) + self.cr_params = np.load(self.cr_file) + + logging.debug("saving pupil position") + fig, ax = plt.subplots(1) + ax.plot(self.pupil_params.T[0], label='pupil x') + ax.plot(self.pupil_params.T[1], label='pupil y') + ax.set_xlabel('frame index') + ax.set_title('pupil position') + ax.legend() + fig.savefig(os.path.join(self.qc_folder, 'pupil_position.'+image_type)) + + logging.debug("saving cr position") + fig, ax = plt.subplots(1) + ax.plot(self.cr_params.T[0], label='cr x') + ax.plot(self.cr_params.T[1], label='cr y') + ax.set_xlabel('frame index') + ax.set_title('CR position') + ax.legend() + fig.savefig(os.path.join(self.qc_folder, 'cr_position.'+image_type)) + + logging.debug("saving pupil axes") + fig, ax = plt.subplots(1) + ax.plot(self.pupil_params.T[3], label='pupil axis 1') + ax.plot(self.pupil_params.T[4], label='pupil axis 2') + ax.set_xlabel('frame index') + ax.set_title('Pupil major and minor axis size') + ax.legend() + fig.savefig(os.path.join(self.qc_folder, 'pupil_axes.'+image_type)) + + logging.debug("saving cr major/minor axis") + fig, ax = plt.subplots(1) + ax.plot(self.cr_params.T[3], label='cr axis 1') + ax.plot(self.cr_params.T[4], label='cr axis 2') + ax.set_xlabel('frame index') + ax.set_title('CR major and minor axis size') + ax.legend() + fig.savefig(os.path.join(self.qc_folder, 'cr_axes.'+image_type)) + + logging.debug("saving pupil angle") + fig, ax = plt.subplots(1) + ax.plot(self.pupil_params.T[2], label='pupil angle') + ax.set_xlabel('frame index') + ax.set_title('pupil major axis angle') + ax.legend() + fig.savefig(os.path.join(self.qc_folder, 'pupil_angle.'+image_type)) + + logging.debug("saving cr angle") + fig, ax = plt.subplots(1) + ax.plot(self.cr_params.T[2], label='cr angle') + ax.set_xlabel('frame index') + ax.set_title('corneal reflection major axis angle') + ax.legend() + fig.savefig(os.path.join(self.qc_folder, 'cr_angle.'+image_type)) + + + logging.debug("computing density") + # the remainder of these take a *very* long time + T = self.pupil_params.shape[0] + y, x = self.im_shape + + mean_frame = np.dstack([self.mean_frame,self.mean_frame,self.mean_frame]) + pupil_density = np.zeros((y, x, 3)) + # pupil_all = 255*np.ones(pupil_density.shape, np.uint8) + # pupil_all = np.stack([mean_frame, mean_frame, mean_frame], axis=2) + pupil_all = mean_frame.copy() + + cr_density = np.zeros((y, x, 3)) + # cr_all = 255*np.ones(cr_density.shape, np.uint8) + # cr_all = np.stack([mean_frame, mean_frame, mean_frame], axis=2) + cr_all = mean_frame.copy() + temp = np.zeros((y,x,3), dtype=np.uint8) + for t in range(T): + if t % 100 == 0: + logging.debug("finished %d frames", t) + ptemp = self.annotate_frame(temp.copy(), self.pupil_params[t]) + pupil_density += ptemp #, self.cr_params[t]) + pupil_all = self.annotate_frame(pupil_all, self.pupil_params[t]) + + crtemp = self.annotate_frame(temp.copy(), cr=self.cr_params[t]) + cr_density += crtemp #, self.cr_params[t]) + cr_all = self.annotate_frame(cr_all, cr=self.cr_params[t]) + + logging.debug("plotting pupil density") + fig, ax = plt.subplots(1) + ax.imshow(np.log(1+pupil_density[:,:,0]), cmap='Greys', interpolation='nearest') + # ax.axis('off') + ax.set_title('Pupil ellipse density') + fig.savefig(os.path.join(self.qc_folder, 'pupil_density.'+image_type)) + + + logging.debug("plotting pupil all") + fig, ax = plt.subplots(1) + ax.imshow(pupil_all, cmap='Greys', interpolation='nearest') + # ax.axis('off') + ax.set_title('All pupil ellipses combined') + fig.savefig(os.path.join(self.qc_folder, 'pupil_all_plot.'+image_type)) + + logging.debug("plotting cr density") + fig, ax = plt.subplots(1) + ax.imshow(np.log(1+cr_density[:,:,2]), cmap='Greys', interpolation='nearest') + # ax.axis('off') + ax.set_title('CR ellipse density') + fig.savefig(os.path.join(self.qc_folder, 'cr_density.'+image_type)) + + logging.debug("plotting cr all") + fig, ax = plt.subplots(1) + ax.imshow(cr_all, cmap='Greys', interpolation='nearest') + ax.set_title('All CR ellipses combined') + # ax.axis('off') + fig.savefig(os.path.join(self.qc_folder, 'cr_all_plot.'+image_type)) + diff --git a/internal/brain_observatory/itracker_utils.py b/internal/brain_observatory/itracker_utils.py new file mode 100644 index 0000000000..e3d5e2770f --- /dev/null +++ b/internal/brain_observatory/itracker_utils.py @@ -0,0 +1,268 @@ +import numpy as np +from scipy.signal import correlate2d +from scipy.signal import fftconvolve +from scipy.ndimage.filters import sobel +import logging + +def default_ray(n): + + y = np.zeros(n,dtype=np.int64) + x = np.arange(n,dtype=np.int64) + + return np.vstack([y,x]) + +def rotate_ray(ray,theta): + + y,x = ray.astype(np.float64) + + xp = x*np.cos(theta) + y*np.sin(theta) + yp = -x*np.sin(theta) + y*np.cos(theta) + + return np.vstack([yp.astype(np.int64),xp.astype(np.int64)]) + +def generate_rays(image_array, seed_pixel): + + N = 18 #200 + + #mag, grad_x, grad_y = sobel_grad(image_array.astype('float')) + + shape = image_array.shape + Y,X = np.mgrid[:shape[1],:shape[0]] + + n = int(np.sqrt(shape[0]**2 + shape[1]**2)) + angles = np.arange(N)*2.0*np.pi/N + rays = [] + + tangents = [] + + ray_grads = [] + + good_coords_mask = lambda y,x: np.logical_and(np.logical_and(y>=0,y<shape[0]),np.logical_and(x>=0,x<shape[1])) + + for theta in angles: + new_ray = rotate_ray(default_ray(n),theta) + new_ray = new_ray.T + seed_pixel + new_ray = new_ray.T + + + mask = good_coords_mask(new_ray[0],new_ray[1]) + + ym = new_ray[0][mask] + xm = new_ray[1][mask] + + rays += [np.vstack([ym,xm])] + + t = np.array([np.sin(theta),np.cos(theta)]) + tangents += [t] + + #rg = t[1]*grad_x[ym,xm] + t[0]*grad_y[ym,xm] + #rg[rg<0] = 0.0 + rg = image_array[ym,xm] + #rg = rg[1:].astype(np.float64) - rg[:-1].astype(np.float64) + # rg[rg<0] = 0.0 + ray_grads += [rg] + + + return rays, ray_grads + +def initial_pupil_point(image_array, bbox=None): + """bbox is a tuple of (xmin, xmax, ymin, ymax)""" + + if bbox is not None: + xmin, xmax, ymin, ymax = bbox + crop_im = image_array[ymin:ymax, xmin:xmax] + else: + shape = image_array.shape + crop_distance = 50 + crop_im = image_array[crop_distance:shape[0]-crop_distance, crop_distance:shape[1]-crop_distance] + + m = np.max(crop_im) + + dark_square = m*np.ones([30,30]) + #c = correlate2d(m-crop_im,dark_square,mode='same') + c = fftconvolve(m-crop_im,dark_square[::-1,::-1],mode='same') + y,x = np.where(c==np.max(c)) + + if bbox is not None: + ybar=int(np.mean(y))+ymin + xbar=int(np.mean(x))+xmin + else: + ybar=int(np.mean(y))+crop_distance + xbar=int(np.mean(x))+crop_distance + + return ybar, xbar + +def initial_cr_point(image_array, bbox=None): + """bbox is a tuple of (xmin, xmax, ymin, ymax)""" + + if bbox is not None: + xmin, xmax, ymin, ymax = bbox + crop_im = image_array[ymin:ymax, xmin:xmax] + else: + shape = image_array.shape + crop_distance = 50 + crop_im = image_array[crop_distance:shape[0]-crop_distance, crop_distance:shape[1]-crop_distance] + + m = np.max(crop_im) + mean = np.mean(crop_im) + + Y,X = np.meshgrid(np.arange(-20,20),np.arange(-20,20)) + bright_circle = np.zeros([40,40]) + mask = X**2 + Y**2 < 100. + bright_circle[mask] = m + bright_circle -= np.mean(bright_circle) + + #c = correlate2d(crop_im-mean,bright_circle,mode='same') + c = fftconvolve(crop_im-mean,bright_circle[::-1,::-1],mode='same') + y,x = np.where(c==np.max(c)) + + if bbox is not None: + ybar=int(np.mean(y))+ymin + xbar=int(np.mean(x))+xmin + else: + ybar=int(np.mean(y))+crop_distance + xbar=int(np.mean(x))+crop_distance + + return ybar, xbar + +def sobel_grad(image_array): + + grad_y = sobel(image_array.astype(np.float64),0) + grad_x = sobel(image_array.astype(np.float64),1) + + #print "grad_x dtype = ", grad_x.dtype + + mag = np.sqrt(grad_y**2 + grad_x**2) + 1e-16 + + return mag, grad_x, grad_y + +def medfilt_custom(x, kernel_size=3): + '''This median filter returns 'nan' whenever any value in the kernal width is 'nan' and the median otherwise''' + T = x.shape[0] + delta = kernel_size/2 + + x_med = np.zeros(x.shape) + window = x[0:delta+1] + if np.any(np.isnan(window)): + x_med[0] = np.nan + else: + x_med[0] = np.median(window) + + # print window + for t in range(1,T): + window = x[t-delta:t+delta+1] + # print window + if np.any(np.isnan(window)): + x_med[t] = np.nan + else: + x_med[t] = np.median(window) + + return x_med + +def eccentricity(a1, a2): + + return np.sqrt(1.0 - (np.minimum(a1,a2)**2)/(np.maximum(a1,a2)**2)) + +def median_absolute_deviation(a, consistency_constant=1.4826): + '''Calculate the median absolute deviation of a univariate dataset. + + Parameters + ---------- + a : numpy.ndarray + Sample data. + consistency_constant : float + Constant to make the MAD a consistent estimator of the population + standard deviation (1.4826 for a normal distribution). + + Returns + ------- + float + Median absolute deviation of the data. + ''' + return consistency_constant * np.nanmedian(np.abs(a - np.nanmedian(a))) + +def post_process_cr(cr_params): + """This will replace questionable values of the CR x and y position with 'nan' + + 1) threshold ellipse area by 99th percentile area distribution + 2) median filter using custom median filter + 3) remove deviations from discontinuous jumps + + The 'nan' values likely represent obscured CRs, secondary reflections, merges + with the secondary reflection, or visual distortions due to the whisker or + deformations of the eye""" + + area = np.pi*cr_params.T[3]*cr_params.T[4] + + # compute a threshold on the area of the cr ellipse + dev = median_absolute_deviation(area) + if dev == 0: + logging.warning("Median absolute deviation is 0," + "falling back to standard deviation.") + dev = np.nanstd(area) + threshold = np.nanmedian(area) + 3*dev + + x_center = cr_params.T[0] + y_center = cr_params.T[1] + + # set x,y where area is over threshold to nan + x_center[area>threshold] = np.nan + y_center[area>threshold] = np.nan + + # median filter + x_center_med = medfilt_custom(x_center, kernel_size=3) + y_center_med = medfilt_custom(y_center, kernel_size=3) + + x_mask_finite = np.where(np.isfinite(x_center_med))[0] + y_mask_finite = np.where(np.isfinite(y_center_med))[0] + + # if y increases discontinuously or x decreases discontinuously, + # that is probably a CR secondary reflection + mean_x = np.mean(x_center_med[x_mask_finite]) + mean_y = np.mean(y_center_med[y_mask_finite]) + + std_x = np.std(x_center_med[x_mask_finite]) + std_y = np.std(y_center_med[y_mask_finite]) + + # set these extreme values to nan + #x_center_med[x_center_med < mean_x - 3*std_x] = np.nan + #y_center_med[y_center_med > mean_y + 3*std_y] = np.nan + x_center_med[np.abs(x_center_med - mean_x) > 3*std_x] = np.nan + y_center_med[np.abs(y_center_med - mean_y) > 3*std_y] = np.nan + + either_nan_mask = np.logical_and(np.isnan(x_center_med),np.isnan(y_center_med)) + x_center_med[either_nan_mask] = np.nan + y_center_med[either_nan_mask] = np.nan + + new_cr = np.vstack([x_center_med, y_center_med]).T + + bad_points_mask = either_nan_mask + + return new_cr, bad_points_mask + + +def post_process_pupil(pupil_params): + '''Filter pupil parameters to replace outliers with nan + + Parameters + ---------- + pupil_params : numpy.ndarray + (Nx5) array of pupil parameters [x, y, angle, axis1, axis2]. + + Returns + ------- + numpy.ndarray + Pupil parameters with outliers replaced with nan + ''' + area = np.pi*pupil_params.T[3]*pupil_params.T[4] + threshold = np.percentile(area[np.isfinite(area)], 99) + outlier_index = area > threshold + pupil_params[outlier_index, :] = np.nan + return pupil_params + + +def filter_bad_params(params, frame_width, frame_height): + '''Replace positions outside image with nan''' + params[(params[:,0] > frame_width) | (params[:,0] < 0), :] = np.nan + params[(params[:,1] > frame_height) | (params[:,1] < 0), :] = np.nan + return params diff --git a/internal/brain_observatory/mask_set.py b/internal/brain_observatory/mask_set.py new file mode 100644 index 0000000000..4dc5f89e4c --- /dev/null +++ b/internal/brain_observatory/mask_set.py @@ -0,0 +1,196 @@ +import itertools +import numpy as np +import logging + +class MaskSet( object ): + def __init__(self, masks): + self.masks = masks + self.bbs = make_bbs(self.masks) + self.mask_dist = bb_dist(self.bbs) + + self.cached_sizes = {} + + self.cached_unions = {} + self.cached_union_sizes = {} + + self.cached_intersections = {} + self.cached_intersection_sizes = {} + + @property + def count(self): + return len(self.bbs) + + def distance(self, mask_idxs): + return max(self.mask_dist[i,j] for (i,j) in itertools.combinations(mask_idxs, 2)) + + def close(self, mask_idxs, max_dist): + return not any(self.mask_dist[i,j] > max_dist for (i,j) in itertools.combinations(mask_idxs, 2)) + + def close_sets(self, set_size, max_dist): + mask_sets = itertools.combinations(range(len(self.bbs)), set_size) + return (ms for ms in mask_sets if self.close(ms, max_dist)) + + def _idx_key(self, idxs): + return tuple(sorted(set(idxs))) + + def mask(self, mask_idx): + return self.masks[mask_idx] + + def union(self, mask_idxs): + mask_idxs = self._idx_key(mask_idxs) + + if mask_idxs in self.cached_unions: + return self.cached_unions[mask_idxs] + + if len(mask_idxs) == 0: + return None + + i0 = mask_idxs[0] + union = self.masks[i0].copy() + + if len(mask_idxs) == 1: + return union + + for idx in mask_idxs[1:]: + union |= self.masks[idx] + + self.cached_unions[mask_idxs] = union + + return union + + def overlap_fraction(self, idx0, idx1): + union_size = self.union_size([idx0,idx1]) + overlap_size = self.intersection_size([idx0,idx1]) + return float(overlap_size) / float(union_size) + + def detect_duplicates(self, overlap_threshold): + duplicate_masks = set() + + for idx0,idx1 in self.close_sets(set_size=2, max_dist=0): + overlap_frac = self.overlap_fraction(idx0, idx1) + + if overlap_frac > overlap_threshold: + duplicate_masks.add(tuple(sorted([idx0,idx1]))) + + return duplicate_masks + + def mask_is_union_of_set(self, mask_idx, set_idxs, threshold): + # does this mask overlap with each element of the set individually? + # i.e. overlap of mask and set element covers most of the set element + for set_mask_idx in set_idxs: + overlap_size = self.intersection_size([set_mask_idx, mask_idx]) + set_mask_size = self.size(set_mask_idx) + if overlap_size < threshold * set_mask_size: + return False + + + # does this mask cover more than the union of the individual set elements? + set_union = self.union(set_idxs) + mask = self.mask(mask_idx) + overlap = set_union & mask + overlap_size = overlap.sum() + + return overlap_size > self.size(mask_idx) * threshold + + def detect_unions(self, set_size=2, max_dist=10, threshold=0.7): + union_masks = {} + + mask_combos = list(self.close_sets(set_size, max_dist)) + + for i, set_idxs in enumerate(mask_combos): + for mask_idx in range(self.count): + if mask_idx in set_idxs: + continue + elif not self.close([mask_idx] + list(set_idxs), max_dist): + continue + + if self.mask_is_union_of_set(mask_idx, set_idxs, threshold): + if mask_idx in union_masks: + logging.warning("already detected this mask as a union") + union_masks[mask_idx] = set_idxs + + return union_masks + + def union_size(self, mask_idxs): + mask_idxs = self._idx_key(mask_idxs) + + if mask_idxs in self.cached_union_sizes: + return self.cached_union_sizes[mask_idxs] + + s = self.union(mask_idxs).sum() + self.cached_union_sizes[mask_idxs] = s + + return s + + def intersection(self, mask_idxs): + mask_idxs = self._idx_key(mask_idxs) + + if mask_idxs in self.cached_intersections: + return self.cached_intersections[mask_idxs] + + if len(mask_idxs) == 0: + return None + + # don't cache the empty ones + if not self.close(mask_idxs, 0): + return np.zeros(self.masks[0].shape) + + i0 = mask_idxs[0] + intersection = self.masks[i0].copy() + + if len(mask_idxs) == 1: + return intersection + + for idx in mask_idxs[1:]: + intersection &= self.masks[idx] + + self.cached_intersections[mask_idxs] = intersection + + return intersection + + def intersection_size(self, mask_idxs): + mask_idxs = self._idx_key(mask_idxs) + + if mask_idxs in self.cached_intersection_sizes: + return self.cached_intersection_sizes[mask_idxs] + + s = self.intersection(mask_idxs).sum() + self.cached_intersection_sizes[mask_idxs] = s + + return s + + def size(self, mask_idx): + return self.union_size([mask_idx]) + + +def make_bbs(masks): + bbs = [] + + for i in range(len(masks)): + m = np.where(masks[i]) + bbs.append([[m[0].min(), m[0].max()],[m[1].min(), m[1].max()]]) + + return bbs + +def bb_dist(bbs): + num_bbs = len(bbs) + + dist = np.zeros((num_bbs, num_bbs)) + for i,j in itertools.combinations(range(num_bbs), 2): + bbi = bbs[i] + bbj = bbs[j] + + if bbi[0][0] < bbj[0][1]: + distx = bbj[0][0] - bbi[0][1] + else: + distx = bbi[0][0] - bbj[0][1] + + if bbi[1][0] < bbj[1][1]: + disty = bbj[1][0] - bbi[1][1] + else: + disty = bbi[1][0] - bbj[1][1] + + dist[i,j] = max(distx,disty) + dist[j,i] = dist[i,j] + + return dist diff --git a/internal/brain_observatory/ophys_session_decomposition.py b/internal/brain_observatory/ophys_session_decomposition.py new file mode 100644 index 0000000000..43d386d130 --- /dev/null +++ b/internal/brain_observatory/ophys_session_decomposition.py @@ -0,0 +1,97 @@ +import numpy as np +import h5py + + +def open_view_on_binary(file_like, dtype=np.uint8, mode="r", offset=0, + shape=None, order="C", strides=None): + '''Open a view into a memory-mapped binary file. + + Parameters + ---------- + file_like : {string, file object} + File to open. + dtype : numpy.dtype + Numpy dtype to open the memory-mapped array as. + mode : string + Mode to open the file in. + offset : integer + Offset (in bytes) into the file at which to start the memory + map. + shape : {tuple, list} + Shape of the array. + order : {"C", "F"} + C or Fortran ordering. + strides : {tuple, list} + Strides along each axis for reading the array. + + Returns + ------- + numpy.memmap + Strided view into memory-mapped array. + ''' + mapped = np.memmap(file_like, dtype, mode, offset, order=order) + return np.lib.stride_tricks.as_strided(mapped, shape=shape, + strides=strides) + + +def read_strided(filename, dtype, offset, shape, strides): + '''Load a frame without memory-mapping.''' + frame_size = np.dtype(dtype).itemsize + arr = np.empty(shape, dtype=dtype) + frame_size = arr.dtype.itemsize*np.product(shape[1:]) + step = strides[0] - frame_size + with open(filename, "rb") as f: + f.seek(offset) + for i in range(shape[0]): + frame = np.frombuffer(f.read(frame_size), dtype=dtype) + arr[i] = frame.reshape(shape[1:]) + f.seek(step, 1) + return arr + + +def load_frame(raw_filename, json_meta, use_memmap=False): + '''Load a frame of a multi-frame raw file.''' + if use_memmap: + arr = open_view_on_binary(raw_filename, dtype=json_meta["dtype"], + offset=json_meta["byte_offset"], + shape=json_meta["shape"], + strides=json_meta["strides"]) + else: + arr = read_strided(raw_filename, dtype=json_meta["dtype"], + offset=json_meta["byte_offset"], + shape=json_meta["shape"], + strides=json_meta["strides"]) + return arr + + +def export_frame_to_hdf5(raw_filename, data_hdf5_filename, + auxiliary_hdf5_filename, frame_meta, + compression="gzip", compression_opts=9): + '''Export a frame from raw to hdf5. + + Data with the channel_description `data` is stored in the + data_hdf5_filename, while any other data is stored in the + auxiliary_hdf5_filename + ''' + data_created = False + aux_created = False + for json_meta in frame_meta: + # This is dirty, we should expand the metadata handoff to allow + # real specification of ophys data versus auxiliary data + mode = "a" + if json_meta["channel_description"] == "data": + filename = data_hdf5_filename + if not data_created: + data_created = True + mode = "w" + else: + filename = auxiliary_hdf5_filename + if not aux_created: + aux_created = True + mode = "w" + data = load_frame(raw_filename, json_meta) + chunks = (1, json_meta["shape"][1], json_meta["shape"][2]) + with h5py.File(filename, mode) as f: + f.create_dataset(json_meta["channel_description"], data=data, + chunks=chunks, compression=compression, + compression_opts=compression_opts) diff --git a/internal/brain_observatory/resources/__init__.py b/internal/brain_observatory/resources/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/brain_observatory/resources/__pycache__/__init__.cpython-37.pyc b/internal/brain_observatory/resources/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a05e920bf4a92ce1c2a10d1606bfe8d54a556590 GIT binary patch literal 213 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsq+6#KL=E|k5bP;?OCtu0cM{sj89mEg5 zUqZ+ivX0}C64CtzeSP)#DUxO>=7GSfy&6ZmhYJ1pkI!{8(+9@D8ctx73@$*OUJ>M; zEKD_0%i32+oC|$*>R4}GrrFgvsUR=lh>|T!*|0_GsK!80rda?-#%FT6h1!QM4amL; aIdW=@BUc-fRNZqpKYQDhxaj|Si`5qnB|i`V literal 0 HcmV?d00001 diff --git a/internal/brain_observatory/resources/roi_filter_training_criteria.json b/internal/brain_observatory/resources/roi_filter_training_criteria.json new file mode 100644 index 0000000000..ec25d617b6 --- /dev/null +++ b/internal/brain_observatory/resources/roi_filter_training_criteria.json @@ -0,0 +1,38 @@ +{ + "union": ["eXcluded == 1"], + "boundary": ["eXcluded == 2"], + "bad_shape": [ + "shape0 < 0.1", + "shape0 < 0.2 and meanInt0 < 30", + "shape0 < 0.18 and area < 124", + "shape0 < 0.2 and area < 260 and OvlpCount > 0 and depth <= 300", + "shape0 < 0.2 and OvlpCount > 0 and depth > 300" + ], + "small_size": [ + "area < 120 and meanInt0 < 25 and depth <= 300", + "area < 125 and meanInt0 < 25 and depth > 300", + "area < 110 and depth <= 300", + "area < 150 and depth > 300" + ], + "low_signal": [ + "meanInt1 < 10", + "meanInt1 < 19 and (meanGrayToSigma <= 1.0 or (meanGrayToSigma <= 1.1 and meanInt0 <= 30))", + "meanInt1 < 15 and (meanGrayToSigma <= 1.1 or (meanGrayToSigma <= 1.2 and meanInt0 <= 40))" + ], + "apical_dendrite": [ + "(meanInt1 < 25 or meanInt0 <= 40) and maxMeanRatio > 2.4", + "(meanInt1 < 35 or meanInt0 <= 50) and maxMeanRatio > 3.7", + "area < 116 and maxMeanRatio > 2.4", + "area < 120 and maxMeanRatio > 2.5 and depth <= 300", + "area < 130 and maxMeanRatio > 3.0 and depth <= 300", + "area < 125 and maxMeanRatio > 2.5 and depth > 300", + "area < 135 and maxMeanRatio > 3.0 and depth > 300", + "area < 120 and maxMeanRatio > 2.2 and shape0 < 0.25", + "area < 130 and maxMeanRatio > 2.4 and shape0 < 0.26 and depth <= 300", + "area < 135 and maxMeanRatio > 2.4 and shape0 < 0.26 and depth > 300 ", + "area < 140 and maxMeanRatio > 2.7 and shape0 < 0.35", + "area < 150 and maxMeanRatio > 2.9 and shape0 < 0.30", + "area < 200 and maxMeanRatio > 3.1 and shape0 < 0.20", + "area < 300 and maxMeanRatio > 3.5 and shape0 < 0.15" + ] +} \ No newline at end of file diff --git a/internal/brain_observatory/roi_filter.py b/internal/brain_observatory/roi_filter.py new file mode 100644 index 0000000000..4ea0cd0e7c --- /dev/null +++ b/internal/brain_observatory/roi_filter.py @@ -0,0 +1,327 @@ +import itertools +from six.moves import cPickle +import logging +from allensdk.internal.brain_observatory import roi_filter_utils +import allensdk.internal.brain_observatory.mask_set as mask_set +from allensdk.brain_observatory.roi_masks import create_roi_mask_array + +try: + from sklearn.model_selection import cross_val_score +except ImportError: + from sklearn.cross_validation import cross_val_score +from sklearn import __version__ as sklearn_version +import numpy as np +import pandas as pd + + +class ROIClassifier(object): + '''Wrapper for machine learning classifier. + + Provides an underlying classifier model implementing `fit`, + `score`, and `predict`. Tracks additional information for + constructing the feature array from input datastreams, as well + as training data used and cross validation scores generated. + + Parameters + ---------- + model_data : dictionary + Dictionary of classifier properties + `sklearn_version`: Version of sklearn used for training. + `model`: Underlying classifier. + `training_features`: Feature set used to train model. + `training_labels`: Label set used to train model. + `trimmed_features`: Features to remove from input data. + `structure_ids`: Structure ID set used for training. + `drivers`: Driver set used for training. + `reporters`: Reporter set used for training. + `other_appended_labels`: Labels appended outside model. + `cross_validation_scores`: Cross validation if generated. + ''' + def __init__(self, model_data=None): + '''Constructor.''' + if model_data is None: + model_data = {} + self.sklearn_version = sklearn_version + model_sklearn = model_data.get("sklearn_version", None) + if sklearn_version != model_sklearn: + logging.warning("Using sklearn %s, model trained using %s", + sklearn_version, model_sklearn) + self.model = model_data.get("model", None) + self.training_features = model_data.get("training_features", + pd.DataFrame()) + self.training_labels = model_data.get("training_labels", + pd.DataFrame()) + self.trimmed_features = model_data.get("trimmed_features", []) + self.structure_ids = model_data.get("structure_ids", []) + self.drivers = model_data.get("drivers", []) + self.reporters = model_data.get("reporters", []) + self.other_appended_labels = model_data.get("other_appended_labels", + []) + # this is a harsh score for multilabel because it requires ALL + # labels predicted + self.cross_validation_scores = model_data.get( + "cross_validation_scores", None) + self.unexpected_features = [] + + @property + def model_data(self): + '''The classifier properties as a dictionary.''' + data = {"model": self.model, + "training_features": self.training_features, + "training_labels": self.training_labels, + "trimmed_features": self.trimmed_features, + "structure_ids": self.structure_ids, + "drivers": self.drivers, + "reporters": self.reporters, + "other_appended_labels": self.other_appended_labels, + "sklearn_version": self.sklearn_version, + "cross_validation_scores": self.cross_validation_scores} + return data + + @property + def label_names(self): + '''Return label names for the classifier.''' + return self.training_labels.columns + + def create_feature_array(self, object_data, depth, structure_id, drivers, + reporters): + '''Creates feature array from input data. + + See Also + -------- + create_feature_array : Create a feature array given model and inputs + ''' + features = create_feature_array(self.model_data, object_data, depth, + structure_id, drivers, reporters) + + def get_labels(self, object_data, depth, structure_id, drivers, + reporters): + '''Generate labels from input data. + + See Also + -------- + ROIClassifier.create_feature_array + ''' + features = create_feature_array(self.model_data, object_data, depth, + structure_id, drivers, reporters) + self.unexpected_features = get_unexpected_features( + self.model_data, object_data, structure_id, drivers, reporters) + return self.predict(features) + + def fit(self, features, labels): + '''Fit model to data. + + Parameters + ---------- + features : pandas.DataFrame + Training feature set. + labels : pandas.DataFrame + Training labels. + ''' + self.training_features = features + self.training_labels = labels + self.model.fit(features, labels) + + def score(self, features, labels): + '''Calculate classifier score on data.''' + return self.model.score(features, labels) + + def predict(self, features): + '''Generate classification labels given features.''' + return self.model.predict(features) + + def cross_validate(self, features, labels, n_folds=5, n_jobs=1): + '''Generate cross-validation scores for the classifier. + + Parameters + ---------- + features : pandas.DataFrame + Set of features for classification. + labels : pandas.DataFrame + Set of ground truth labels for training and evaluation. + n_folds : int + Number of folds for K-Fold cross-validation. + n_jobjs : int + Number of CPUs to use. + + Returns + ------- + numpy.ndarray + `n_folds` cross-validation scores. + ''' + self.cross_validation_scores = cross_val_score( + self.model, features, labels, cv=n_folds, n_jobs=n_jobs) + return self.cross_validation_scores + + def save(self, filename): + '''Save the classifier to file by pickling.''' + with open(filename, "wb") as f: + cPickle.dump(self.model_data, f) + + @staticmethod + def from_file(filename): + '''Load an ROIClassifier from file.''' + with open(filename, "rb") as f: + return ROIClassifier(cPickle.load(f)) + + +def mean_gray_to_sigma(meanInt0, snpoffsetstdv): + '''Calculate intensity variation used in prior code. + + Parameters + ---------- + meanInt0 : pandas.Series + Array of intensity averages. + snpoffsetstdv : pandas.Series + Array of soma-neuropil standard deviations. + + Returns + ------- + pandas.Series + meanInt0/snpoffsetstdv, preventing Inf (returns as 0). + ''' + mean_gray_to_sigma = meanInt0 / snpoffsetstdv.astype(float) + mean_gray_to_sigma[snpoffsetstdv == 0.0] = 0 + return mean_gray_to_sigma + + +def create_feature_array(model_data, object_data, depth, structure_id, + drivers, reporters): + '''Create feature array from input data. + + This creates the feature array with column ordering matching what + the classifier was trained on. + + Parameters + ---------- + model_data : dictionary + Dictionary containing information about the machine learning + model and training set. + object_data : pandas.DataFrame + Object list data. + depth : float + Imaging depth of the experiment. + structure_id : string + Targeted structure id. + drivers : list + List of drivers for the mouse. + reporters : list + List of reporters for the mouse. + ''' + training_features = model_data["training_features"].columns + if np.isnan(depth): + depth = 0 + meanGrayToSigma = mean_gray_to_sigma( + object_data["meanInt0"], object_data["snpoffsetstdv"]) + features = pd.DataFrame() + for column in training_features: + if column == "depth": + features[column] = depth + # special case that isn't in object list + elif column == "meanGrayToSigma": + features[column] = meanGrayToSigma + elif column in model_data["structure_ids"]: + features[column] = int(structure_id == column) + elif column in model_data["drivers"]: + features[column] = int(column in drivers) + elif column in model_data["reporters"]: + features[column] = int(column in reporters) + elif column in object_data.columns: + features[column] = object_data[column] + else: + logging.error("Feature %s missing from input data", column) + raise KeyError( + "Feature {} missing from input data".format(column)) + return features + + +def get_unexpected_features(model_data, object_data, structure_id, drivers, + reporters): + '''Get list of incoming features that weren't in traning data. + + Parameters + ---------- + model_data : dictionary + Dictionary containing information about the machine learning + model and training set. + object_data : pandas.DataFrame + Object list data. + structure_id : string + Targeted structure id. + drivers : list + List of drivers for the mouse. + reporters : list + List of reporters for the mouse. + ''' + training_features = model_data["training_features"].columns + trimmed_features = model_data["trimmed_features"] + inputs = list(itertools.chain(object_data.columns, [structure_id], + drivers, reporters)) + unexpected_features = [] + for feature in inputs: + if (feature not in training_features) and \ + (feature not in trimmed_features): + unexpected_features.append(feature) + return unexpected_features + + +def label_unions_and_duplicates(rois, overlap_threshold): + '''Detect unions and duplicates and label ROIs.''' + masks = create_roi_mask_array(rois) + valid_masks = np.ones(masks.shape[0]).astype(bool) + ms = mask_set.MaskSet(masks=masks) + + # detect and label duplicates + duplicates = ms.detect_duplicates(overlap_threshold) + for duplicate in duplicates: + index = duplicate[0] + if "duplicate" not in rois[index].labels: + rois[index].labels.append("duplicate") + valid_masks[index] = False + + # detect and label unions only for remaining valid masks + valid_idxs = np.where(valid_masks) + ms = mask_set.MaskSet(masks=masks[valid_idxs].astype(bool)) + unions = ms.detect_unions() + + if unions: + union_idxs = list(unions.keys()) + idxs = valid_idxs[0][union_idxs] + for idx in idxs: + if "union" not in rois[idx].labels: + rois[idx].labels.append("union") + return rois + + +def apply_labels(rois, label_array, label_names): + '''Apply labels to rois. + + Parameters + ---------- + rois : list + List of RoiMask objects sorted to `label_array` order. + label_array : numpy.ndarray + Label array output from classifier. + label_names : list + Names to apply to columns of `label_array`. + + Returns + ------- + list + List of ROIs with labels appended. + ''' + label_df = pd.DataFrame(data=label_array, columns=label_names) + label_lists = label_df.apply(_column_match).apply( + _compress_to_list, args=(label_df.columns,), axis=1) + for i, roi in enumerate(rois): + roi.labels.extend(label_lists[i]) + return rois + + +def _column_match(column): + return column == 1 + + +def _compress_to_list(row, names): + '''Get names that have value 1 in row.''' + return list(names[row.values]) diff --git a/internal/brain_observatory/roi_filter_utils.py b/internal/brain_observatory/roi_filter_utils.py new file mode 100644 index 0000000000..0cb0fb5dec --- /dev/null +++ b/internal/brain_observatory/roi_filter_utils.py @@ -0,0 +1,302 @@ +import os +import json +import logging +import scipy.ndimage.measurements as measurements +from scipy.spatial import cKDTree +from allensdk.brain_observatory.roi_masks import create_roi_mask +import pandas as pd +import numpy as np + +CRITERIA_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "resources", + "roi_filter_training_criteria.json") +_CRITERIA = None + + +def CRITERIA(): + global _CRITERIA + if _CRITERIA is None: + with open(CRITERIA_FILE, "r") as f: + _CRITERIA = json.load(f) + return _CRITERIA + + +class TrainingLabelClassifier(object): + '''Very basic threshold_based classifier. + + Has a decision function that is just the number of distinct + criteria met by the classifier. Criteria are defined as a list + of strings used with pandas.DataFrame.eval. + + Parameters + ---------- + criteria : list + List of evaluation strings. + ''' + def __init__(self, criteria): + '''Constructor.''' + if criteria is None: + self.criteria = [] + else: + self.criteria = criteria + + def decision_function(self, X): + '''Get the distance from the decision boundary. + + Parameters + ---------- + X : array-like + Features for each ROI. + + Returns + ------- + T : array-like + Distance for each sample from the decision boundary. + ''' + T = np.zeros((X.shape[0],), dtype=int) + for crit in self.criteria: + T[X.eval(crit).as_matrix()] += 1 + return T + + +class TrainingMultiLabelClassifier(object): + '''Multilabel classifier using groups of TrainingLabelClassifiers. + + This was used to generate labeling for training the original SVM + for classification. + + Parameters + ---------- + criteria : dictionary + Label names and criteria for each label. + ''' + def __init__(self, criteria=None): + '''Constructor.''' + if criteria is None: + criteria = CRITERIA() + i = 0 + self.labels = sorted(criteria.keys()) + self._codes = {} + self._classifiers = {} + for label in self.labels: + label_criteria = criteria[label] + self._codes[label] = 2**i + self._classifiers[2**i] = TrainingLabelClassifier(label_criteria) + i += 1 + + def _labels_as_columns(self, label_codes): + '''Convert label series to boolean columns for each label. + + Parameters + ---------- + label_codes : pandas.Series + Label codes. + + Returns + ------- + pandas.DataFrame + Dataframe where each column is a label, and values are + True for labeled or False otherwise. + ''' + output = pd.DataFrame() + for name in self.labels: + number = self._codes[name] + output[name] = (label_codes & number) > 0 + return output + + def _map_code_to_list(self, label_code): + output = [] + for name in self.labels: + number = self._codes[name] + if (label_code & number) > 0: + output.append(name) + return output + + def get_eXcluded(self, X): + '''Get the calculated value of the eXcluded column. + + This is useful for comparison with the original classifier + implementation. + + Parameters + ---------- + X : pandas.DataFrame + Object features from the object list file. + + Returns + ------- + numpy.ndarray + Calculated eXcluded score from the classifier. + ''' + eXcluded = np.zeros((X.shape[0],), dtype=X["eXcluded"].dtype) + for classifier in self._classifiers.values(): + eXcluded += classifier.decision_function(X) + # match the object list values + eXcluded[eXcluded > 0] += 10 + eXcluded[X["eXcluded"] == 1] = 1 + eXcluded[X["eXcluded"] == 2] = 2 + return eXcluded.as_matrix() + + def label_data(self, X, as_columns=True): + '''Generate labels for each row in X. + + Parameters + ---------- + X : pandas.DataFrame + Object features from the object list file. + + Returns + ------- + numpy.ndarray + Array of label codes representing the combination of labels + found for each row. + ''' + labels = np.zeros((X.shape[0],), dtype=int) + for label, classifier in self._classifiers.items(): + labels[classifier.decision_function(X) > 0] += label + if as_columns: + return self._labels_as_columns(labels) + else: + return pd.Series(labels).apply(self._map_code_to_list) + + +def calculate_max_border(motion_df, max_shift): + '''Calculate motion boundary from frame offsets. + + When the motion correction algorithm fails to find sufficient + matches, it generates very large frame offsets. The use of + `max_shift` avoids filtering too many cells due to the large + offsets, with the tradeoff that those frames will be noise. + + Parameters + ---------- + motion_df : pandas.DataFrame + Dataframe containing the x, y offsets from motion correction. + max_shift : float + Maximum shift to allow when considering motion correction. Any + larger shifts are considered outliers. + + Returns + ------- + list + [right_shift, left_shift, down_shift, up_shift] + ''' + # strip outliers + x_no_outliers = motion_df["x"][(motion_df["x"] >= -max_shift) + & (motion_df["x"] <= max_shift)] + y_no_outliers = motion_df["y"][(motion_df["y"] >= -max_shift) + & (motion_df["y"] <= max_shift)] + + right_shift = np.max(-1*x_no_outliers.min(), 0) + left_shift = np.max(x_no_outliers.max(), 0) + down_shift = np.max(-1*y_no_outliers.min(), 0) + up_shift = np.max(y_no_outliers.max(), 0) + + border = [right_shift, left_shift, down_shift, up_shift] + + if np.any(np.isnan(np.array(border))): + raise ValueError("Motion correction failed.") + + return border + + +def order_rois_by_object_list(object_data, rois): + '''Reorder rois by matching bounding boxes to object list. + + Parameters + ---------- + object_data : pandas.DataFrame + Object list data. + rois : list + List of RoiMasks. + + Returns + ------- + list + The list of rois reordered to index the same as object_data. + ''' + object_points = object_data[["minx", + "miny", + "maxx", + "maxy", + "area"]].copy() + object_points["maxx"] += 1 + object_points["maxy"] += 1 + roi_points = [] + for roi in rois: + roi_points.append([roi.x, roi.y, roi.x+roi.width, roi.y+roi.height, + roi.mask.sum()]) + reorder_index = get_indices_by_distance(object_points, + np.array(roi_points)) + multi_mapped = set() + if len(set(reorder_index)) != reorder_index.shape[0]: + unique, counts = np.unique(reorder_index, return_counts=True) + multi_mapped = set(unique[counts > 1]) + not_mapped = set(np.setdiff1d(np.arange(reorder_index.shape[0]), + reorder_index)) + logging.warning("ROIs don't uniquely map to object_list") + for idx in (multi_mapped | not_mapped): + logging.warning( + "%s has ambiguous mapping to object list" % rois[idx].label) + out_rois = [] + for i in reorder_index: + roi = rois[i] + if i in multi_mapped: + roi.labels.append("duplicate") + out_rois.append(roi) + return out_rois + + +def get_rois(segmentation_stack, border=None): + '''Extract a list of rois from the segmentation data array. + + Parameters + ---------- + segmentation_stack : numpy.ndarray + The array from the maxInt_masks file showing the object masks. + border : list + [right_shift, left_shift, down_shift, up_shift] bounding box + determined from motion correction. + + Returns + ------- + list + List of RoiMask objects. + ''' + rois = [] + if border is None: + border = [0, 0, 0, 0] + height = segmentation_stack.shape[1] + width = segmentation_stack.shape[2] + for i in range(segmentation_stack.shape[0]): + page = segmentation_stack[i, :, :] + label_mask, num_labels = measurements.label( + page, structure=[[1, 1, 1], [1, 1, 1], [1, 1, 1]]) + for label in range(1, num_labels + 1): + img_mask = label_mask == label + mask = create_roi_mask(width, height, border, + roi_mask=img_mask, + label="ROI {}:{}".format(i, label), + mask_group=i) + mask.labels = [] + if mask.overlaps_motion_border: + mask.labels.append("motion_border") + rois.append(mask) + return rois + + +def get_indices_by_distance(object_list_points, mask_points): + '''Find indices of nearest neighbor matches. + + Require a distance of 0 (perfect match) and a unique match between + masks and object_list entries. + ''' + if np.array(mask_points).ndim != 2: + raise ValueError("number of dimensions is incorrect. Expected 2 " + f"got {np.array(mask_points).ndim}") + tree = cKDTree(mask_points) + distance, indices = tree.query(object_list_points) + if distance.max() > 0: + logging.error("An ROI did not match object list exactly.") + raise AssertionError("Max match distance greater than 0") + return indices diff --git a/internal/brain_observatory/run_itracker.py b/internal/brain_observatory/run_itracker.py new file mode 100644 index 0000000000..2892c814eb --- /dev/null +++ b/internal/brain_observatory/run_itracker.py @@ -0,0 +1,189 @@ +import argparse +import allensdk.internal.core.lims_utilities as lu +import glob +import time +import shutil +import logging +from allensdk.config.manifest import Manifest +from allensdk.internal.brain_observatory.itracker import iTracker +from allensdk.internal.brain_observatory.frame_stream import FfmpegInputStream, FfmpegOutputStream +import h5py +import ast +import sys +import numpy as np + +DEFAULT_THRESHOLD_FACTOR = 1.6 + +if sys.platform=='linux2': + FFMPEG_BIN = "/shared/utils.x86_64/ffmpeg/bin/ffmpeg" +elif sys.platform=='darwin': + FFMPEG_BIN = "/usr/local/bin/ffmpeg" + +def compute_bounding_box(points): + if not points: + return None + points = np.array(points) + return [ points[:,0].min(), points[:,0].max(), + points[:,1].min(), points[:,1].max() ] + +def get_polygon(experiment_id, group_name): + query = """ +select ago.* from avg_graphic_objects ago +join avg_graphic_objects pago on pago.id = ago.parent_id +join avg_group_labels agl on pago.group_label_id = agl.id +join sub_images si on si.id = pago.sub_image_id +join specimens sp on sp.id = si.specimen_id +join ophys_sessions os on os.specimen_id = sp.id +where agl.name = '%s' +and os.id = %d +""" % (group_name, experiment_id) + + try: + path = np.array([ int(v) for v in lu.query(query)[0]['path'].split(',') ]) + except KeyError as e: + return [] + except IndexError as e: + return [] + + points = path.reshape((len(path)/2, 2)) + + return points + +def get_experiment_info(experiment_id): + logging.info("Downloading paths/metadata for experiment ID: %d", experiment_id) + query = "select storage_directory, id from ophys_sessions where id = "+str(experiment_id) + + storage_directory = lu.query(query)[0]['storage_directory'] + logging.info("\tStorage directory: %s", storage_directory) + + movie_file = glob.glob(storage_directory+'*video-1.avi')[0] + metadata_file = glob.glob(storage_directory+'*video-1.h5')[0] + + cr_points = get_polygon(experiment_id, 'Corneal Reflection Bounding Box') + pupil_points = get_polygon(experiment_id, 'Pupil Bounding Box') + + logging.info("\tmovie file: %s", movie_file) + logging.info("\tmetadata file: %s", metadata_file) + + return dict(movie_file=movie_file, + metadata_file=metadata_file, + corneal_reflection_points=cr_points, + pupil_points=pupil_points) + +def get_movie_shape_from_metadata(metadata_file): + with h5py.File(metadata_file, "r") as f: + metadata_str = f["video_metadata"].value + metadata = ast.literal_eval(metadata_str) + + # assuming 3 channels + # movie_shape = (metadata['frames'], metadata['height'], metadata['width'], 3) + # in the metadata file from lims, the 'width' and 'height' variables are swapped, + # hopefully this is the same for every single experiment. + movie_shape = (metadata['frames'], metadata['width'], metadata['height'], 3) + logging.info("movie_shape from metadata_file = %s", str(movie_shape)) + + return movie_shape + +def run_itracker(movie_file, output_directory, + output_frames=False, + output_annotation_frames=False, + output_annotated_movie=True, + output_annotated_movie_block_size=1, + estimate_bbox=False, + num_frames=None, + output_QC=True, + image_type='png', + cache_input_frames=False, + input_block_size=1, + metadata_file=None, + movie_shape=None, + **kwargs): + + if output_directory is not None: + Manifest.safe_mkdir(output_directory) + + assert(metadata_file is not None and movie_shape is not None, "Must provide either metadata_file or movie_shape") + + if metadata_file: + movie_shape = get_movie_shape_from_metadata(metadata_file) + + frame_shape = movie_shape[1:] + + if num_frames is None: + num_frames = movie_shape[0] + + + input_stream = FfmpegInputStream(movie_file, frame_shape, + ffmpeg_bin=FFMPEG_BIN, + num_frames=num_frames, + cache_frames=cache_input_frames, + block_size=input_block_size) + + movie_output_stream = FfmpegOutputStream(frame_shape, + block_size=output_annotated_movie_block_size, + ffmpeg_bin=FFMPEG_BIN) if output_annotated_movie else None + + itracker = iTracker(output_directory, input_stream=input_stream, + im_shape=(movie_shape[1], movie_shape[2]), + num_frames=num_frames, + **kwargs) + + # open this early to avoid duplicating massive memory + movie_output_stream.open(itracker.annotated_movie_file) + + itracker.set_movie(movie_file) + + itracker.mean_frame = itracker.compute_mean_frame() + + if estimate_bbox: + bbox_pupil, bbox_cr = itracker.estimate_bbox_from_mean_frame() + + + itracker.process_movie(movie_output_stream=movie_output_stream, + output_frames=output_frames, + output_annotation_frames=output_annotation_frames) + + if output_QC: + itracker.output_QC(image_type=image_type) + + return itracker + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--experiment_id', default=None, type=int) + parser.add_argument('--movie_file', default=None) + parser.add_argument('--metadata_file', default=None) + parser.add_argument('--output_directory', default='.') + parser.add_argument('--estimate_bbox', action='store_true') + parser.add_argument('--num_frames', default=None, type=int) + parser.add_argument('--threshold_factor', default=DEFAULT_THRESHOLD_FACTOR) + parser.add_argument('--log_level', default=logging.DEBUG) + args = parser.parse_args() + + logging.getLogger().setLevel(args.log_level) + + data = dict( + threshold_factor=args.threshold_factor, + output_directory=args.output_directory, + num_frames=args.num_frames, + estimate_bbox=args.estimate_bbox + ) + + if args.experiment_id: + info = get_experiment_info(args.experiment_id) + + data['movie_file'] = info['movie_file'] + data['metadata_file'] = info['metadata_file'] + + if info.get('pupil_points', None): + data['bbox_pupil'] = compute_bounding_box(info['pupil_points']) + if info.get('corneal_reflection_points', None): + data['bbox_cr'] = compute_bounding_box(info['corneal_reflection_points']) + else: + data['movie_file'] = args.movie_file + data['metadata_file'] = args.metdata_file + + run_itracker(**data) + +if __name__ == "__main__": main() diff --git a/internal/brain_observatory/time_sync.py b/internal/brain_observatory/time_sync.py new file mode 100644 index 0000000000..e191525f2f --- /dev/null +++ b/internal/brain_observatory/time_sync.py @@ -0,0 +1,443 @@ +from collections import deque +from typing import Optional, Callable, Any + +import numpy as np +import h5py +from allensdk.brain_observatory.sync_dataset import Dataset +import pandas as pd +import logging +try: + import cv2 +except ImportError: + cv2 = None + +TRANSITION_FRAME_INTERVAL = 60 +REG_PHOTODIODE_INTERVAL = 1.0 # seconds +REG_PHOTODIODE_STD = 0.05 # seconds +PHOTODIODE_ANOMALY_THRESHOLD = 0.5 # seconds +LONG_STIM_THRESHOLD = 0.2 # seconds +MAX_MONITOR_DELAY = 0.07 # seconds + + +def get_keys(sync_dset: Dataset) -> dict: + """ + Gets the correct keys for the sync file by searching the sync file + line labels. Removes key from the dictionary if it is not in the + sync dataset line labels. + Args: + sync_dset: The sync dataset to search for keys within + + Returns: + key_dict: dictionary of key value pairs for finding data in the + sync file + """ + + # key_dict contains key value pairs where key is expected label category + # and value is the possible data for each category existing in sync dataset + # line labels + key_dict = { + "photodiode": ["stim_photodiode", "photodiode"], + "2p": ["2p_vsync"], + "stimulus": ["stim_vsync", "vsync_stim"], + "eye_camera": ["cam2_exposure", "eye_tracking", + "eye_frame_received"], + "behavior_camera": ["cam1_exposure", "behavior_monitoring", + "beh_frame_received"], + "acquiring": ["2p_acquiring", "acq_trigger"], + "lick_sensor": ["lick_1", "lick_sensor"] + } + label_set = set(sync_dset.line_labels) + remove_keys = [] + for key, value in key_dict.items(): + # for each key in the above `key_dict`, this loop + # checks to see if there is a corresponing value in + # the set of line labels present in the sync file (`label_set`) + # If not, the key is added to the `remove_keys` list + value_set = set(value) + diff = value_set.intersection(label_set) + if len(diff) == 1: + key_dict[key] = diff.pop() + else: + remove_keys.append(key) + + # the contents of the `remove_keys` list is printed to the console + # as a user warning + if len(remove_keys) > 0: + logging.warning("Could not find valid lines for the following data " + "sources") + for key in remove_keys: + logging.warning(f"{key} (valid line label(s) = {key_dict[key]}") + key_dict.pop(key) + return key_dict + + +def calculate_monitor_delay(sync_dset, stim_times, photodiode_key, + transition_frame_interval=TRANSITION_FRAME_INTERVAL, # noqa: E501 + max_monitor_delay=MAX_MONITOR_DELAY): + """Calculate monitor delay.""" + transitions = stim_times[::transition_frame_interval] + photodiode_events = get_real_photodiode_events(sync_dset, photodiode_key) + transition_events = photodiode_events[0:len(transitions)] + + delays = transition_events - transitions + delay = np.mean(delays) + logging.info(f"Calculated monitor delay: {delay}. \n " + f"Max monitor delay: {np.max(delays)}. \n " + f"Min monitor delay: {np.min(delays)}.\n " + f"Std monitor delay: {np.std(delays)}.") + + if delay < 0 or delay > max_monitor_delay: + raise ValueError(f"Delay ({delay}s) falls outside expected value " + f"range (0-{MAX_MONITOR_DELAY}s).") + return delay + + +def _find_last_n(arr: np.ndarray, n: int, + cond: Callable[[Any], bool]) -> Optional[int]: + """ + Find the final index where the prior `n` values in an array meet + the condition `cond` (inclusive). + Parameters + ========== + arr: numpy.1darray + n: int + cond: Callable that returns True if condition is met, False + otherwise. Should be able to be applied to the array elements + without any additional arguments. + """ + reversed_ix = _find_n(arr[::-1], n, cond) + if reversed_ix is not None: + reversed_ix = len(arr) - reversed_ix - 1 + return reversed_ix + + +def _find_n(arr: np.ndarray, n: int, + cond: Callable[[Any], bool]) -> Optional[int]: + """ + Find the index where the next `n` values in an array meet the + condition `cond` (inclusive). + Parameters + ========== + arr: numpy.1darray + n: int + cond: Callable that returns True if condition is met, False + otherwise. Should be able to be applied to the array elements + without any additional arguments. + """ + if len(arr) < n: + return None + queue = deque(np.apply_along_axis(cond, 0, arr[:n]), maxlen=n) + i = 0 + while queue.count(True) < n: + try: + i += 1 + queue.append(cond(arr[i+n-1])) + except IndexError: + return None + return i + + +def get_photodiode_events(sync_dset, photodiode_key): + """Returns the photodiode events with the start/stop indicators and + the window init flash stripped off. These transitions occur roughly + ~1.0s apart, since the sync square changes state every N frames + (where N = 60, and frame rate is 60 Hz). Because there are no + markers for when the first transition of this type started, we + estimate based on the event intervals. For the first valid event, + find the first two events that both meet the following criteria: + The next event occurs ~1.0s later + First the last valid event, find the first two events that both meet + the following criteria: + The last valid event occured ~1.0s before + """ + all_events = sync_dset.get_events_by_line(photodiode_key, units="seconds") + all_events_diff = np.ediff1d(all_events, to_begin=0, to_end=0) + all_events_diff_prev = all_events_diff[:-1] + all_events_diff_next = all_events_diff[1:] + min_interval = REG_PHOTODIODE_INTERVAL - REG_PHOTODIODE_STD + max_interval = REG_PHOTODIODE_INTERVAL + REG_PHOTODIODE_STD + if not len(all_events): + raise ValueError("No photodiode events found. Please check " + "the input data for errors. ") + first_valid_index = _find_n( + all_events_diff_next, 2, + lambda x: (x >= min_interval) & (x <= max_interval)) + last_valid_index = _find_last_n( + all_events_diff_prev, 2, + lambda x: (x >= min_interval) & (x <= max_interval)) + if first_valid_index is None: + raise ValueError("Can't find valid start event") + if last_valid_index is None: + raise ValueError("Can't find valid end event") + pd_events = all_events[first_valid_index:last_valid_index+1] + return pd_events + + +def get_real_photodiode_events(sync_dset, photodiode_key, + anomaly_threshold=PHOTODIODE_ANOMALY_THRESHOLD): + """Gets the photodiode events with the anomalies removed.""" + events = get_photodiode_events(sync_dset, photodiode_key) + anomalies = np.where(np.diff(events) < anomaly_threshold) + return np.delete(events, anomalies) + + +def get_alignment_array(ref, other, int_method=np.floor): + """Generate an alignment array """ + return int_method(np.interp(other, ref, np.arange(len(ref)), left=np.nan, + right=np.nan)) + + +def get_video_length(filename): + if cv2 is not None: + try: + capture = cv2.VideoCapture(filename) + return int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) + except AttributeError: + logging.warning("Could not get length for %s, opencv out of date", + filename) + else: + logging.warning("Could not get length for %s", filename) + + +def get_ophys_data_length(filename): + with h5py.File(filename, "r") as f: + return f["data"].shape[1] + + +def get_stim_data_length(filename: str) -> int: + """Get stimulus data length from .pkl file. + + Parameters + ---------- + filename : str + Path of stimulus data .pkl file. + + Returns + ------- + int + Stimulus data length. + """ + stim_data = pd.read_pickle(filename) + + # A subset of stimulus .pkl files do not have the "vsynccount" field. + # MPE *won't* be backfilling the "vsynccount" field for these .pkl files. + # So the least worst option is to recalculate the vsync_count. + try: + vsync_count = stim_data["vsynccount"] + except KeyError: + vsync_count = len(stim_data["items"]["behavior"]["intervalsms"]) + 1 + + return vsync_count + + +def corrected_video_timestamps(video_name, timestamps, data_length): + delta = 0 + if data_length is not None: + delta = len(timestamps) - data_length + if delta != 0: + logging.info("%s data of length %s has timestamps of length " + "%s", video_name, data_length, len(timestamps)) + else: + logging.info("No data length provided for %s", video_name) + + return timestamps, delta + + +class OphysTimeAligner(object): + def __init__(self, sync_file, scanner=None, dff_file=None, + stimulus_pkl=None, eye_video=None, behavior_video=None, + long_stim_threshold=LONG_STIM_THRESHOLD): + self.scanner = scanner if scanner is not None else "SCIVIVO" + self._dataset = Dataset(sync_file) + self._keys = get_keys(self._dataset) + self.long_stim_threshold = long_stim_threshold + + self._monitor_delay = None + self._clipped_stim_ts_delta = None + self._clipped_stim_timestamp_values = None + + if dff_file is not None: + self.ophys_data_length = get_ophys_data_length(dff_file) + else: + self.ophys_data_length = None + if stimulus_pkl is not None: + self.stim_data_length = get_stim_data_length(stimulus_pkl) + else: + self.stim_data_length = None + if eye_video is not None: + self.eye_data_length = get_video_length(eye_video) + else: + self.eye_data_length = None + if behavior_video is not None: + self.behavior_data_length = get_video_length(behavior_video) + else: + self.behavior_data_length = None + + @property + def dataset(self): + return self._dataset + + @property + def ophys_timestamps(self): + """Get the timestamps for the ophys data.""" + ophys_key = self._keys["2p"] + if self.scanner == "SCIVIVO": + # Scientifica data looks different than Nikon. + # http://confluence.corp.alleninstitute.org/display/IT/Ophys+Time+Sync + times = self.dataset.get_rising_edges(ophys_key, units="seconds") + elif self.scanner == "NIKONA1RMP": + # Nikon has a signal that indicates when it started writing to disk + acquiring_key = self._keys["acquiring"] + acquisition_start = self._dataset.get_rising_edges( + acquiring_key, units="seconds")[0] + ophys_times = self._dataset.get_falling_edges( + ophys_key, units="seconds") + times = ophys_times[ophys_times >= acquisition_start] + else: + raise ValueError("Invalid scanner: {}".format(self.scanner)) + + return times + + @property + def corrected_ophys_timestamps(self): + times = self.ophys_timestamps + + delta = 0 + if self.ophys_data_length is not None: + if len(times) < self.ophys_data_length: + raise ValueError( + "Got too few timestamps ({}) for ophys data length " + "({})".format(len(times), self.ophys_data_length)) + elif len(times) > self.ophys_data_length: + logging.info("Ophys data of length %s has timestamps of " + "length %s, truncating timestamps", + self.ophys_data_length, len(times)) + delta = len(times) - self.ophys_data_length + times = times[:-delta] + else: + logging.info("No data length provided for ophys stream") + + return times, delta + + @property + def stim_timestamps(self): + stim_key = self._keys["stimulus"] + + return self.dataset.get_falling_edges(stim_key, units="seconds") + + def _get_clipped_stim_timestamps(self): + timestamps = self.stim_timestamps + + delta = 0 + if self.stim_data_length is not None and \ + self.stim_data_length < len(timestamps): + stim_key = self._keys["stimulus"] + rising = self.dataset.get_rising_edges(stim_key, units="seconds") + + # Some versions of camstim caused a spike when the DAQ is first + # initialized. Remove it. + if rising[1] - rising[0] > self.long_stim_threshold: + logging.info("Initial DAQ spike detected from stimulus, " + "removing it") + timestamps = timestamps[1:] + + delta = len(timestamps) - self.stim_data_length + if delta != 0: + logging.info("Stim data of length %s has timestamps of " + "length %s", + self.stim_data_length, len(timestamps)) + elif self.stim_data_length is None: + logging.info("No data length provided for stim stream") + + return timestamps, delta + + @property + def clipped_stim_timestamps(self): + """ + Return the stimulus timestamps with the erroneous initial spike + removed (if relevant) + + Returns + ------- + timestamps: np.ndarray + An array of stimulus timestamps in seconds with th emonitor delay + added + + delta: int + Difference between the length of timestamps + and the number of frames reported in the stimulus + pickle file, i.e. + len(timestamps) - len(pkl_file['items']['behavior']['intervalsms'] + """ + if self._clipped_stim_ts_delta is None: + (self._clipped_stim_timestamp_values, + self._clipped_stim_ts_delta) = self._get_clipped_stim_timestamps() + + return (self._clipped_stim_timestamp_values, + self._clipped_stim_ts_delta) + + def _get_monitor_delay(self): + timestamps, delta = self.clipped_stim_timestamps + photodiode_key = self._keys["photodiode"] + delay = calculate_monitor_delay(self.dataset, + timestamps, + photodiode_key) + return delay + + @property + def monitor_delay(self): + """ + The monitor delay (in seconds) associated with the session + """ + if self._monitor_delay is None: + self._monitor_delay = self._get_monitor_delay() + return self._monitor_delay + + @property + def corrected_stim_timestamps(self): + """ + The stimulus timestamps corrected for monitor delay + + Returns + ------- + timestamps: np.ndarray + An array of stimulus timestamps in seconds with th emonitor delay + added + + delta: int + Difference between the length of timestamps and + the number of frames reported in the stimulus + pickle file, i.e. + len(timestamps) - len(pkl_file['items']['behavior']['intervalsms'] + + delay: float + The monitor delay in seconds + """ + timestamps, delta = self.clipped_stim_timestamps + delay = self.monitor_delay + + return timestamps + delay, delta, delay + + @property + def behavior_video_timestamps(self): + key = self._keys["behavior_camera"] + + return self.dataset.get_falling_edges(key, units="seconds") + + @property + def corrected_behavior_video_timestamps(self): + return corrected_video_timestamps("Behavior video", + self.behavior_video_timestamps, + self.behavior_data_length) + + @property + def eye_video_timestamps(self): + key = self._keys["eye_camera"] + + return self.dataset.get_falling_edges(key, units="seconds") + + @property + def corrected_eye_video_timestamps(self): + return corrected_video_timestamps("Eye video", + self.eye_video_timestamps, + self.eye_data_length) diff --git a/internal/core/__init__.py b/internal/core/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/core/__pycache__/__init__.cpython-37.pyc b/internal/core/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25d3fa39f5c40d0b7f5935732d2607cf2d12a791 GIT binary patch literal 190 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}s0Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9yE^NUjT<Kr{)GE3s)^$IF)aoFVMr<CTT+JPMK H8HgDGa0xYS literal 0 HcmV?d00001 diff --git a/internal/core/__pycache__/lims_pipeline_module.cpython-37.pyc b/internal/core/__pycache__/lims_pipeline_module.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b80a22e95e2cd27de05554e0290e303db88a451 GIT binary patch literal 3462 zcmb7H&2!tv72jO~1O!6Vhh5oD9EX!y9WgVaJa+1IJeC{Ta^t2kt6K8J!KlT6T#y0< z0@N;OTO24et#$3Rz4stZFYVvbTaSC~DKq^GeCm4(lKMz51+|O!_Pu@B{q4RFJ)WI) z2t3K(ejogEmXLoVGkHuPzJMl=q2q+pn0UpTdQ|hwWBOh4O8RYhhJKs<G9#4qEzhPn zgT*s_$8&%#c@=JWE;qf|F9|Pm>zHsWtiCIGbG*uDxN}Usc}~Mh=<*7u9h19!7RDAh z-6r+9?_njRS*OZ=9wbpGl-cOhHMtjvkgpB1D3*=4KfCYW|7>k=nC+#>>fOfYYpp05 zv!i<x-By$agMnO&l1@RyQD5Hm`zasBp<Iij)>;t9VIukd=;!~(q~fz{Vwm^^*^ql} zT=V290r3Sic^A5nAdY}xg_pPiyDWtUH+lJ(yrZ7UEp8tZudGoap2Zm;;Hv6YGzjA; z37_l5D$;DDQGD>tpgn;mZ$p>E@$B2;YDRMUj^@OtNjYcu<^+0>f=Sw}m((>Lc7kD? z`GM#T`(cv#gFwhosPg!2qC|qGA;Y+%Dm;{J5e>2^O+*<!^$#NOCcT$W9_+q^iE=mC z3wWayya|%S-Hjw@rwI@4?S{!~xtk6E+BWp*VDC`wejT-TWt4@hgP^@1bVHas1|JS6 z3q=ydYwc8oa4vo6561f+pH^dVsBGVlk|^{2Io!Do9icXLS(%NlU4*MK(QH%Hf(PFQ zG!0q<h@AA`&H`*JK+zL+icpcP)H8rLdu2{J`y-=T58x{`N6X7Afox|{Kdj3K%PVpC zI*gNG%=JSlVNZ2gXUfzfRqmvsA7ph)Snxd!pK>(L8f0a~X}23CT~%oXGHO3blTOrC z1|EQ#0hzDO)TzLoYS@deg6tx6*Ps<JFo(Kyk&Uigf&pz!A;3F>ho>R<3W&pMMo!?q z^jNQS3XW%x%-DCtCM8FdlF{|dJOLQSa)g5ZfqsLI4)X8lEAlN#*el=w9@ZRv)J}&n zuO(?#6Jfw>Q8E~2wVq6q2eoBcw-oCQm4PC?c;#pX9~IQh)3@!gxMlOOFlB~9q@vFB z))fse?S3+s2U+kj=t~{lD5F(655LikOE45)LhUw!fDby+6pSrk4#9mUVC3`^w)+i9 z?vEk)3Lt@z{{ab`Lc+cSFfKy!@fjp<1l;^uI?OJDBCf)xm8qo#ER{k><09~c1tKD@ zLsu^qco?`7aRY~O3um`NEoejj*aWKm1Qe$5TrJ?KU4rKalK^=1m1f;WpTj%u`^xdh zt_Za2`v=27-+td0F6b(IAi&c_cBr=@KEQ?D!tQK|n$ouy(XT?&x7VhQ?b@~_a8!Tz z!j+wREymK~j85qh&B13mJ%x*^DOOND#!KkK+|a&@*~Dy$B{X~!x>03y6+CNo>{-eh z$HTg*Z15HBoT|Dp4vt$zY;*(8rvX!+hB7ywK7RQnz%+xFF)*InrrsfDRSYv@>>Y}~ zc_wiD7i}H8fLeeC`M7Y&0mLXykL(<>EX1YxE;%Y?IyOOoXQ%9FX3CX-bEcdDTqP@= z7`a9PbIVj_ow6m;Wk+sqfz=t&$*qJ%<jBgc6O-F~2IkJ@E;zcA&n^*-B1$UU1xZy) zX7lPfNtMrmWKK)w^SMI87jkRAEdHfO7vWnAH^^9WMN9spC09XmWh(g*Upgkay9s&l z$jz+0!mqt!f4X}#pU<Dz{Q3#Y-BX&|xsjVW$!Bth-+(a)Rs4g$mX{#>;c77;{f4|C zuShm?VuP0U-Msu~Dt?zaCl&r-Ug>IFlB(u!PIw)-K5CBs?$qE3-wsld)waIfdG_n( z*2d1W_2m_)3m`#edl2t$p9!>j!Gcav0Mw-(-G1`oms>mQpDeEwHAY>2qQ}RxYqtx9 z+VV=Oqg@ae`BuWnSvagCdoBzBudR%VklDbHIU2`_g0Y|!X$)F&WUlsVX$Y?rV(v%} z!+lrg!7v<#p4Acoq}taYKLEM1-#`Y&gf_D7J-BlR{zlc+xHcJG2NmOWKkR>xA!y`+ z2)XrT-fekyFKy}20LGeN%rlerU?{=E;+m#F?FW9m4R$1kye{O`-?~RwpwK1q7j|G^ zi88W&y!Ch+jA?IzOv)N}6fL;3DEHoZ7)LT|r~SdB01aYHFO$(Ntj7x68xP~O9mMhx z5EE5J-ze(5r?q++${k%eDtmIms$5Jw3l(bi!VxJZ_dMf34qH&1u@r#8i=m8O8YKc3 z;5jnrgnoaYM?#glVW!GZdxi;D2G&91L(nOry#q!dShk^JPzJ0rt}lqsP>M0rTaZ~Q zppx*xPS^(eQ2Z2y82!XO=%Bp7y?G@#Z_fq1{GF%Ix4z!kd3v^Z&jz92iQ>?!Ahics z7m78pf=24teTtT7=Tg{G&KZWEgNA$z9dQk2Q-f6@y;hmS7==8-T%ae-hS~$09)UDG z`Q0+1IK!y70al=p!BAdbEE3vnpv5|N_#vI~lhnI8DG3``3F^!3W5pk3QHW^4pjXBF ze>SQ?^{$_rh;>w>KmO05IGow-XB#h`Zu*7Wdd`^L-u#v4ym;9hkE?Rp>H+9QCc;py nSAGtpX$n*J!{Wv~!pc(CptGSE)jzffMX5pI$L4E}GeP6OBq(j@ literal 0 HcmV?d00001 diff --git a/internal/core/__pycache__/lims_utilities.cpython-37.pyc b/internal/core/__pycache__/lims_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58f9426c61ff86b0c832e97c4d3aa05c5f5b7e5e GIT binary patch literal 5903 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 literal 0 HcmV?d00001 diff --git a/internal/core/__pycache__/mouse_connectivity_cache_prerelease.cpython-37.pyc b/internal/core/__pycache__/mouse_connectivity_cache_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23bad0e26a7ceada64c8e0c95b4bcce86051f6fe GIT binary patch literal 7816 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 literal 0 HcmV?d00001 diff --git a/internal/core/__pycache__/simpletree.cpython-37.pyc b/internal/core/__pycache__/simpletree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ecd152904cda3908b00ad892de49826c132790b GIT binary patch literal 3222 zcmb_e%Wm676rCX{nWE)K9LI^%)^$?1g^ENe&;kL1Ajqp|fd<+*ZCXJAL38MYu}sP{ zOlt|$qP2l^-yg8iRey=wuKEjE_1vLEQG%Of5fby@yzV{cK8E)f7955r`s+9E*k<e> z`WQbJI(JdjCMv-M@3MW~=A3=YgdxmhCd|M%GTWxGwppX{FIKSz&uU>3NR)l$)5!QS z(YcGFB2)oubHUn%;KDd&I00v%wM0c!(N@Hqu+dgUO*m-h#Js4ZwZ(#1L|YS=#j-ee z%-fDw5$7>7FIL3`v~{s2E}~r!m&7{SMX?0kKFFNyaKG0L9?Kx`2^T$86zY>^>JU}R zQ|7W)Y?o`j?36!bM>NJ?ag3SJ)lQ6*z2HaV8R$(2Xl%6BI=qH2^C5eBb!bs9wbt3N zl2&93UshUKXD5}^It7mhttU({;;!X$$fw6Zsi2%kQER9|9R751$W#6Y6g=X88V8{J zZzf6ghLIV~FEbv2cPENP;D*BWcl6xr@WHLl4=RwV<30C8bI1GDi~5~=k>|&e@V@E< z(J!hK_ku|IsN>%AzUn**cRC8jyWaEsJ?~k7z1=QWh`k$O1iMCF_l6(K;D*wCCg8K# z>%Vqxi_lN}c)xdNo)jk(RW|s1!g|wn!zfH#w|To8`(9VwX-@VO=*bj>OQXMxjz+)I zF@}6-0KWlqj2O@ua}rERjAdpN3Q0x<8TFnggD5G{A>rOk)=<?^Mj94^NnsMaO>--# zv|wk*pMmt8@{&M93zQT(lhKKQ1v(_Bpiyntv|YNPO0ud;eI;own|BKxRpz+<^RO$R zuga=k4@MD<YG$dRyPH+=O>-oT*wu0~vj?=f56H<Bfz0eN*F=k2M#ZeEvC1#=6{F4_ zZt=nSGb~e(LB2>TK0r|f5{}DG_$j$6Z#4`_3})6|&{qvE>HHZMGJE8UYL$+lv)HuE z@w~6+FikBfuVsFXPTwJ^DPM<FizR%|kxkC%O%R?4L&U-w!t;0jGmDI$@<1|LgDVf> zmtC<L#mVMw7>UiC<jvh!VoU^^pQ?r_$wHa^ebE0#%2;NmN+e)uBxe{ks}+{Ih>eQ$ zWZVFgi+r$JVzO9Pz#@mH<vxn~4po2S@X{C<a)dK9QsYN}I#_(dp0H?Z1oi&AK>cI} zs&*l`{S4Seh?SH|Bxw)y1<tnVkDMqsAZeP_3Qzn9pW6Neb{Sx2;1&y~;F2?HxDV0k zUriCYfNaQ(9B9f;5XYw&J+L+858nmq)(liH@&lE`Qq5q!1es@Jl@!&pep(-&LxH!2 z1&YWbxE8PCT|pUKELpg`ehPJA<Tm!F{2B1|zc}0i?rW)W!cG}wa58j?3*-d-Q+|_y z1E(;%0S|vX;sO_AV*a0pe>TGfGK!CU;YG<b8y0dz+>`52=xj<d6R2k?S)3e4q+G}D zJcWP?1I0#JBTrZ_(K5ZKAclgPiVo^=BFRIV5((Fd<V}HRQOMpT6?C59gQb#CnrjuZ zDAFh$YS(L`lj09!&z8&Na6~_x5O?&`Wkehq04}KGZf$f2>%?{e`{V|yQIxbT+$rkJ zM1KyeZlR2_fz55h;e+KF{ZyeJ0ib-Wxu6KtfiQA~Q$9|uBwUggzloM=o@nl2*_fDf zCBgY@A(@yV$(k8*^23d3*;9FFrOXF`)DBe68k(S4x3R~`hoWAQAsF0b>Yf>|cyEeP zetN57^Aq3H33#I0T8XmKqW7jA{lC0bz1ldVs7F{nQLcQg6iX;*mgstqy#2s+@z>z) z$Kqv|`gPYmc<FWX8A(4-QhT$`h&l(5K9V@g4XADVF@0`Qb%m;{RFUyY6=gO_K1Ab+ zj)Si+*`{5!=j@v8*rqdwFUz*{s#XJeM}>#^Pfj)7c@g-Do++KFMd;hczMUhuLq8qb Hnd|0%<rRlz literal 0 HcmV?d00001 diff --git a/internal/core/__pycache__/swc.cpython-37.pyc b/internal/core/__pycache__/swc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d295a0a7243923d2a9bebf904b01877adb31fa6 GIT binary patch literal 2663 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 N@#C*<*r&$#{{wr+ms0=$ literal 0 HcmV?d00001 diff --git a/internal/core/lims_pipeline_module.py b/internal/core/lims_pipeline_module.py new file mode 100644 index 0000000000..2acb98fd0b --- /dev/null +++ b/internal/core/lims_pipeline_module.py @@ -0,0 +1,125 @@ +import logging +import argparse +import subprocess +import os +import errno + +import allensdk.core.json_utilities as ju +from allensdk.config.manifest import Manifest + +SHARED_PYTHON = "/shared/utils.x86_64/python-2.7/bin/python" +SHARED_SDK = "/shared/bioapps/infoapps/lims2_modules/lib/allensdk" +RUN_PYTHON = "/shared/bioapps/infoapps/lims2_modules/lib/python/run_python.sh" + +class PipelineModule( object ): + def __init__(self, description="", parser=None): + if parser is None: + self.parser = default_argument_parser(description) + else: + self.parser = parser + + self._args = None + + @property + def args(self): + if self._args is None: + self._args = self.parser.parse_args() + logging.basicConfig(level=self.args.log_level, format="%(asctime)s:%(levelname)s:%(message)s") + + return self._args + + def input_data(self): + try: + return ju.read(self.args.input_json) + except Exception as e: + logging.error("could not read input json: %s", self.args.input_json) + raise e + + def write_output_data(self, data): + try: + ju.write(self.args.output_json, data) + except Exception as e: + logging.error("could not write output json: %s", self.args.output_json) + raise e + + +def default_argument_parser(description=""): + parser = argparse.ArgumentParser(description) + parser.add_argument('input_json') + parser.add_argument('output_json') + parser.add_argument('--log-level', default=logging.DEBUG) + + return parser + + +def run_module(module, input_data, storage_directory, + optional_args=None, + python=SHARED_PYTHON, + sdk_path=SHARED_SDK, + local=False, + pbs=None): + + PBS_TEMPLATE=""" + export PYTHONPATH=%(sdk_path)s:$PYTHONPATH + PYTHON=%(python)s + SCRIPT="%(module)s" + $PYTHON $SCRIPT %(optional_args)s %(input_json)s %(output_json)s + """ + + if optional_args is None: + optional_args = [] + + input_json = os.path.join(storage_directory, "input.json") + output_json = os.path.join(storage_directory, "output.json") + pbs_file = os.path.join(storage_directory, "run.pbs") + + Manifest.safe_mkdir(storage_directory) + + pbs_headers = [ ('-j oe'), + ('-o %s' % os.path.join(storage_directory, "run.log")) ] + pbs = pbs if pbs is not None else {} + + queue = pbs.get('queue', 'braintv') + pbs_headers.append('-q %s' % queue) + + walltime = pbs.get('walltime', '3:00:00') + pbs_headers.append('-l walltime=%s' % walltime) + + vmem = pbs.get('vmem', 16) + pbs_headers.append('-l vmem=%dgb' % vmem) + + if 'job_name' in pbs: + pbs_headers.append('-N %s' % pbs['job_name']) + + if 'ncpus' in pbs: + pbs_headers.append('-l ncpus=%d' % pbs['ncpus']) + + pbs_headers = [ '#PBS %s' % s for s in pbs_headers ] + + with open(pbs_file,"w") as f: + f.write('\n'.join(pbs_headers) + PBS_TEMPLATE % { + "python": python, + "sdk_path": sdk_path, + "module": module, + "input_json": input_json, + "output_json": output_json, + "optional_args": " ".join(optional_args) + }) + + + + ju.write(input_json, input_data) + + if local: + subprocess.call(['sh', pbs_file]) + else: + subprocess.call(['qsub', pbs_file]) + + + + + + + + + diff --git a/internal/core/lims_utilities.py b/internal/core/lims_utilities.py new file mode 100644 index 0000000000..fbdb43aff5 --- /dev/null +++ b/internal/core/lims_utilities.py @@ -0,0 +1,194 @@ +import os, platform, re, logging +from allensdk.core.json_utilities import read_url_get + +HDF5_FILE_TYPE_ID = 306905526 +NWB_FILE_TYPE_ID = 475137571 +NWB_UNCOMPRESSED_FILE_TYPE_ID = 478840678 +NWB_DOWNLOAD_FILE_TYPE_ID = 481007198 +METHOD_CONFIG_FILE_TYPE_ID = 324440685 +MODEL_PARAMETERS_FILE_TYPE_ID = 329230374 +BIOPHYS_MODEL_PARAMETERS_FILE_TYPE_ID = 329230374 + + +def get_well_known_files_by_type(wkfs, wkf_type_id): + out = [ os.path.join( wkf['storage_directory'], wkf['filename'] ) + for wkf in wkfs + if wkf.get('well_known_file_type_id',None) == wkf_type_id ] + + if len(out) == 0: + raise IOError("Could not find well known files with type %d." % wkf_type_id) + + return out + + +def get_well_known_file_by_type(wkfs, wkf_type_id): + out = get_well_known_files_by_type(wkfs, wkf_type_id) + + nout = len(out) + if nout != 1: + raise IOError("Expected single well known file with type %d. Got %d." % (wkf_type_id, nout)) + + return out[0] + + +def get_well_known_files_by_name(wkfs, filename): + out = [ os.path.join( wkf['storage_directory'], wkf['filename'] ) + for wkf in wkfs + if wkf['filename'] == filename ] + + if len(out) == 0: + raise IOError("Could not find well known files with name %s." % filename) + + return out + +def get_well_known_file_by_name(wkfs, filename): + out = get_well_known_files_by_name(wkfs, filename) + + nout = len(out) + if nout != 1: + raise IOError("Expected single well known file with name %s. Got %d." % (filename, nout)) + + return out[0] + +def append_well_known_file(wkfs, path, wkf_type_id=None, content_type=None): + record = { + 'filename': os.path.basename(path), + 'storage_directory': os.path.dirname(path) + } + + if wkf_type_id is not None: + record['well_known_file_type_id'] = wkf_type_id + + if content_type is not None: + record['content_type'] = content_type + + for wkf in wkfs: + if wkf['filename'] == record['filename']: + logging.debug("found existing well known file record for %s, updating", path) + wkf.update(record) + return + + logging.debug("could not find existing well known file record for %s, appending", path) + wkfs.append(record) + +def _connect(user="limsreader", host="limsdb2", database="lims2", password="limsro", port=5432): + import pg8000 + + conn = pg8000.connect(user=user, host=host, database=database, password=password, port=port) + return conn, conn.cursor() + +def _select(cursor, query): + cursor.execute(query) + columns = [ d[0].decode("utf-8") for d in cursor.description ] + return [ dict(zip(columns, c)) for c in cursor.fetchall() ] + +def select(cursor, query): + raise DeprecationWarning("lims_utilities.select is deprecated. Please use lims_utilities.query instead.") + +def connect(user="limsreader", host="limsdb2", database="lims2", password="limsro", port=5432): + raise DeprecationWarning("lims_utilities.connect is deprecated. Please use lims_utilities.query instead.") + +def query(query, user="limsreader", host="limsdb2", database="lims2", password="limsro", port=5432): + conn, cursor = _connect(user, host, database, password, port) + + # Guard against non-ascii characters in query + query = ''.join([i if ord(i) < 128 else ' ' for i in query]) + + try: + results = _select(cursor, query) + finally: + cursor.close() + conn.close() + return results + +def safe_system_path(file_name): + if platform.system() == "Windows": + return linux_to_windows(file_name) + else: + return convert_from_titan_linux(os.path.normpath(file_name)) + +def convert_from_titan_linux(file_name): + # Lookup table mapping project to program + project_to_program= { + "neuralcoding": "braintv", + '0378': "celltypes", + 'conn': "celltypes", + 'ctyconn': "celltypes", + 'humancelltypes': "celltypes", + 'mousecelltypes': "celltypes", + 'shotconn': "celltypes", + 'synapticphys': "celltypes", + 'whbi': "celltypes", + 'wijem': "celltypes" + } + # Tough intermediary state where we have old paths + # being translated to new paths + m = re.match('/projects/([^/]+)/vol1/(.*)', file_name) + if m: + newpath = os.path.normpath(os.path.join( + '/allen', + 'programs', + project_to_program.get(m.group(1),'undefined'), + 'production', + m.group(1), + m.group(2) + )) + return newpath + return file_name + +def linux_to_windows(file_name): + # Lookup table mapping project to program + project_to_program= { + "neuralcoding": "braintv", + '0378': "celltypes", + 'conn': "celltypes", + 'ctyconn': "celltypes", + 'humancelltypes': "celltypes", + 'mousecelltypes': "celltypes", + 'shotconn': "celltypes", + 'synapticphys': "celltypes", + 'whbi': "celltypes", + 'wijem': "celltypes" + } + + # Simple case for new world order + m = re.match('/allen', file_name) + if m: + return "\\" + file_name.replace('/','\\') + + # /data/ paths are being retained (for now) + # this will need to be extended to map directories to + # /allen/{programs,aibs}/workgroups/foo + m = re.match('/data/([^/]+)/(.*)', file_name) + if m: + return os.path.normpath(os.path.join('\\\\aibsdata', m.group(1), m.group(2))) + + # Tough intermediary state where we have old paths + # being translated to new paths + m = re.match('/projects/([^/]+)/vol1/(.*)', file_name) + if m: + newpath = os.path.normpath(os.path.join( + '\\\\allen', + 'programs', + project_to_program.get(m.group(1),'undefined'), + 'production', + m.group(1), + m.group(2) + )) + return newpath + + # No matches found. Clean up and return path given to us + return os.path.normpath(file_name) + + +def get_input_json(object_id, object_class, strategy_class, host="lims2", + **kwargs): + query_string = ("http://{}/InputJsons?strategy_class={}" + "&object_class={}&object_id={}").format(host, + strategy_class, + object_class, + object_id) + for key, value in kwargs.items(): + query_string += "&{}={}".format(key, value) + + return read_url_get(query_string) diff --git a/internal/core/mouse_connectivity_cache_prerelease.py b/internal/core/mouse_connectivity_cache_prerelease.py new file mode 100644 index 0000000000..d3c229ceda --- /dev/null +++ b/internal/core/mouse_connectivity_cache_prerelease.py @@ -0,0 +1,208 @@ +import os +import pandas as pd + +from allensdk.config.manifest import Manifest +from allensdk.core import json_utilities +from allensdk.core.mouse_connectivity_cache import MouseConnectivityCache + +from ..api.queries.mouse_connectivity_api_prerelease \ + import MouseConnectivityApiPrerelease + + +class MouseConnectivityCachePrerelease(MouseConnectivityCache): + """Extends MouseConnectivityCache to use prereleased data from lims. + + Attributes + ---------- + resolution: int + Resolution of grid data to be downloaded when accessing projection volume, + the annotation volume, and the annotation volume. Must be one of (10, 25, + 50, 100). Default is 25. + + api: MouseConnectivityApiPrerelease instance + Used internally to make API queries. + + Parameters + ---------- + resolution: int + Resolution of grid data to be downloaded when accessing projection volume, + the annotation volume, and the annotation volume. Must be one of (10, 25, + 50, 100). Default is 25. + + ccf_version: string + Desired version of the Common Coordinate Framework. This affects the annotation + volume (get_annotation_volume) and structure masks (get_structure_mask). + Must be one of (MouseConnectivityApi.CCF_2015, MouseConnectivityApi.CCF_2016). + Default: MouseConnectivityApi.CCF_2016 + + cache: boolean + Whether the class should save results of API queries to locations specified + in the manifest file. Queries for files (as opposed to metadata) must have a + file location. If caching is disabled, those locations must be specified + in the function call (e.g. get_projection_density(file_name='file.nrrd')). + + manifest_file: string + File name of the manifest to be read. Default is "mouse_connectivity_manifest.json". + + """ + + EXPERIMENTS_PRERELEASE_KEY = 'EXPERIMENTS_PRERELEASE' + STORAGE_DIRECTORIES_PRERELEASE_KEY = 'STORAGE_DIRECTORIES_PRERELEASE' + + # allows user to pass 'male', 'female' instead of only 'm', 'f' + _GENDER_DICT=dict(male='m', female='f') + + def __init__(self, + resolution=None, + cache=True, + manifest_file='mouse_connectivity_manifest_prerelease.json', + ccf_version=None, + version=None, + cache_storage_directories=True, + storage_directories_file_name=None): + + super(MouseConnectivityCachePrerelease, self).__init__( + resolution=resolution, cache=cache, manifest_file=manifest_file, + ccf_version=ccf_version, version=version) + + file_name = self.get_cache_path(storage_directories_file_name, + self.STORAGE_DIRECTORIES_PRERELEASE_KEY) + self.api = MouseConnectivityApiPrerelease( + file_name, cache_storage_directories=cache_storage_directories) + + def get_experiments(self, + dataframe=False, + file_name=None, + cre=None, + injection_structure_ids=None, + age=None, + gender=None, + workflow_state=None, + workflows=None, + project_code=None): + """Read a list of experiments. + + If caching is enabled, this will save the whole (unfiltered) list of + experiments to a file. + + Parameters + ---------- + dataframe: boolean + Return the list of experiments as a Pandas DataFrame. If False, + return a list of dictionaries. Default False. + + file_name: string + File name to save/read the structures table. If file_name is None, + the file_name will be pulled out of the manifest. If caching + is disabled, no file will be saved. Default is None. + """ + file_name = self.get_cache_path(file_name, + self.EXPERIMENTS_PRERELEASE_KEY) + + if os.path.exists(file_name): + experiments = json_utilities.read(file_name) + else: + experiments = self.api.get_experiments() + + if self.cache: + Manifest.safe_make_parent_dirs(file_name) + json_utilities.write(file_name, experiments) + + # filter the read/downloaded list of experiments + experiments = self.filter_experiments(experiments, + cre, + injection_structure_ids, + age, + gender, + workflow_state, + workflows, + project_code) + + if dataframe: + experiments = pd.DataFrame(experiments) + experiments.set_index(['id'], inplace=True, drop=False) + + return experiments + + def filter_experiments(self, + experiments, + cre=None, + injection_structure_ids=None, + age=None, + gender=None, + workflow_state=None, + workflows=None, + project_code=None): + """ + Take a list of experiments and filter them by cre status and injection structure. + + Parameters + ---------- + + cre: boolean or list + If True, return only cre-positive experiments. If False, return only + cre-negative experiments. If None, return all experients. If list, return + all experiments with cre line names in the supplied list. Default None. + + injection_structure_ids: list + Only return experiments that were injected in the structures provided here. + If None, return all experiments. Default None. + + age : list + Only return experiments with specimens with ages provided here. + If None, returna all experiments. Default None. + """ + experiments = super(MouseConnectivityCachePrerelease, self).filter_experiments( + experiments, cre=cre, injection_structure_ids=injection_structure_ids) + + # all kwargs == None base case + conditions = [lambda d: True] + + if age is not None: + age = [a.lower() for a in age] + conditions.append(lambda d: d['age'].lower() in age) + + if gender is not None: + # TODO: pass a string instead of an iterable? + gender = [self._GENDER_DICT.get(g.lower(), g.lower()) for g in gender] + conditions.append(lambda d: d['gender'].lower() in gender) + + if workflow_state is not None: + #workflow_state = map(str.lower, workflow_state) + workflow_state = [ws.lower() for ws in workflow_state] + conditions.append(lambda d: d['workflow_state'].lower() in workflow_state) + + if workflows is not None: + workflows = [w.lower() for w in workflows] + conditions.append(lambda d: any([w.lower() in workflows + for w in d['workflows']])) + + if project_code is not None: + project_code = [pc.lower() for pc in project_code] + conditions.append(lambda d: d['project_code'].lower() in project_code) + + return [e for e in experiments if all(f(e) for f in conditions)] + + def add_manifest_paths(self, manifest_builder): + """ + Construct a manifest for this Cache class and save it in a file. + + Parameters + ---------- + file_name: string + File location to save the manifest. + """ + manifest_builder = super(MouseConnectivityCachePrerelease, self)\ + .add_manifest_paths(manifest_builder) + + manifest_builder.add_path(self.EXPERIMENTS_PRERELEASE_KEY, + 'experiments_prerelease.json', + parent_key='BASEDIR', + typename='file') + + manifest_builder.add_path(self.STORAGE_DIRECTORIES_PRERELEASE_KEY, + 'storage_directories_prerelease.json', + parent_key='BASEDIR', + typename='file') + + return manifest_builder diff --git a/internal/core/simpletree.py b/internal/core/simpletree.py new file mode 100644 index 0000000000..b5018c5f00 --- /dev/null +++ b/internal/core/simpletree.py @@ -0,0 +1,82 @@ +from six import iteritems + + +class SimpleTree( object ): + def __init__(self, nodes, + node_id_cb, + parent_id_cb): + + self.node_list = nodes + + self._nodes = { node_id_cb(n):n for n in nodes } + self._parent_ids = { nid:parent_id_cb(n) for nid,n in iteritems(self._nodes) } + self._child_ids = { nid:[] for nid in self._nodes } + + for nid in self._parent_ids: + pid = self._parent_ids[nid] + if pid: + self._child_ids[pid].append(nid) + + def node_ids(self): + return self._nodes.keys() + + def parent_id(self, nid): + try: + return self._parent_ids[nid] + except KeyError: + raise KeyError("Could not find parent for node %s" % str(nid)) + + def child_ids(self, nid): + try: + for cid in self._child_ids[nid]: + yield cid + except KeyError: + raise KeyError("Could not find children for node %s" % str(nid)) + + def ancestor_ids(self, nid): + try: + pid = nid + while pid: + yield pid + pid = self.parent_id(pid) + except: + raise KeyError("Could not find ancestors for node %s" % str(nid)) + + def descendant_ids(self, nid): + ids = [nid] + try: + while ids: + nid = ids.pop() + yield nid + ids += self.child_ids(nid) + except KeyError: + raise KeyError("Could not find descendants for node %s" % str(nid)) + + def node(self, nid): + return self._nodes[nid] + + def nodes(self, nids=None): + if nids is None: + nids = self.node_ids() + + for nid in nids: + yield self.node(nid) + + def parent(self, nid): + return self.node(self.parent_id(nid)) + + def children(self, nid): + for node in self.nodes(self.child_ids(nid)): + yield node + + def descendants(self, nid): + for node in self.nodes(self.descendant_ids(nid)): + yield node + + def ancestors(self, nid): + for node in self.nodes(self.ancestor_ids(nid)): + yield node + + + + diff --git a/internal/core/swc.py b/internal/core/swc.py new file mode 100644 index 0000000000..1f80cc221b --- /dev/null +++ b/internal/core/swc.py @@ -0,0 +1,103 @@ +# Copyright 2015-2016 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + +import csv +import copy +import math +from allensdk.internal.morphology.morphology import * +from allensdk.internal.morphology.node import Node + +######################################################################## +def read_swc(file_name): + """ + Read in an SWC file and return a Morphology object. + + Parameters + ---------- + file_name: string + SWC file name. + + Returns + ------- + Morphology + A Morphology instance. + """ + nodes = [] + line_num = 1 + try: + with open(file_name, "r") as f: + for line in f: + # remove comments + if line.lstrip().startswith('#'): + continue + # read values. expected SWC format is: + # ID, type, x, y, z, rad, parent + # x, y, z and rad are floats. the others are ints + toks = line.split() + vals = Node( + n = int(toks[0]), + t = int(toks[1]), + x = float(toks[2]), + y = float(toks[3]), + z = float(toks[4]), + r = float(toks[5]), + pn = int(toks[6].rstrip()) + ) + # store this node + nodes.append(vals) + # increment line number (used for error reporting only) + line_num += 1 + except ValueError: + err = "File not recognized as valid SWC file.\n" + err += "Problem parsing line %d\n" % line_num + if line is not None: + err += "Content: '%s'\n" % line + raise IOError(err) + + return Morphology(node_list=nodes) + + +######################################################################## +class Marker( dict ): + """ Simple dictionary class for handling reconstruction marker objects. """ + + SPACING = [ .1144, .1144, .28 ] + + CUT_DENDRITE = 10 + NO_RECONSTRUCTION = 20 + + def __init__(self, *args, **kwargs): + super(Marker, self).__init__(*args, **kwargs) + + # marker file x,y,z coordinates are offset by a single image-space pixel + self['x'] -= self.SPACING[0] + self['y'] -= self.SPACING[1] + self['z'] -= self.SPACING[2] + + + +def read_marker_file(file_name): + """ read in a marker file and return a list of dictionaries """ + + with open(file_name, 'r') as f: + rows = csv.DictReader((r for r in f if not r.startswith('#')), + fieldnames=['x','y','z','radius','shape','name','comment', + 'color_r','color_g','color_b']) + + return [ Marker({ 'x': float(r['x']), + 'y': float(r['y']), + 'z': float(r['z']), + 'name': int(r['name']) }) for r in rows ] + diff --git a/internal/ephys/__init__.py b/internal/ephys/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/ephys/__pycache__/__init__.cpython-37.pyc b/internal/ephys/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bd085402ec06cf45974c06d72d7dfd49fb64729 GIT binary patch literal 191 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r;Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9xZK`Qm*<1_OzOXB183My}L*yQG?l;)(`fn4wz Gh#3H^u{G`h literal 0 HcmV?d00001 diff --git a/internal/ephys/__pycache__/core_feature_extract.cpython-37.pyc b/internal/ephys/__pycache__/core_feature_extract.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34051e3b9dd14064a5f4d5f62d4ac36e0c4a18dd GIT binary patch literal 10096 zcma)C-E$j9a^Ej}5ClLF{HDHEvc4e8v@F|apN=P+rYKvsOvwTj`S#@CmY4;(;$jz? zT~H)ynW~&z6<4a9I7wBia+L?EQkAOY56GX9y4UPu@{sa#-tHy&^~?eU5GgUpot>WP znd#~2>FMd-PfDeNf}j5ne`>$`fuj5e0sWtj%*S}btE!?fg{hum$+v2$0@f@|ymd>* zTl0)|#>%J?Cu`+IUEa#$t$P#gf>jW8hBw(RT1Ao1c%^pPDvNy9n`&3Aipb}@>2}qs zwr8vv0q4Eh_M9~*@)O>Cd%;=|dDUBNFKLRZw3kJC!a9NSf_0KjTBlgiI?YPf8CJGT zHpMDCnst^<vnt-_*kv}$=Dt;}H&~6$vjybNvny<oEg^S-EwdBfD%M5zCOgSaq2v-f z&Ca0YGBep(yld<ndjsz)>^!@G_nYh@yM*^urq-3()gOt6n>96=WKPTOdJ%J*5x@yI zayXuL2q6EZ?Yk`}q>AE`Fz_3@w$D6=11@Yn+rDK-cHN0;S~BMxMBHvhji%#yjh16a zUG9X*e7`t+<~W@}Idyki;%smpP<M+!ccO+D_&bg8Y1anW2qT+EJHPuo`u*ESR$={} zyY=;ZYY*xhGJpHd=0<&s^7Z<0{=xn0@85s$PTeZCZNF=KjgB3L4znihZWQzZW3Al@ zEv>V*)ij6`_|cml5~}cXB(cV;Ol8`)O03*co~uVntn>3sA1?V$;Wz$FX{pRWX}*sa zp#{sZ?6(TbeXoJt`OPLIRQxogSv++-p^0P%$loj;sj>P($mL5dQunglh}FN+o*HPZ zS><N|-)ninGh#{PY=YtXjuRy__t)z6ja!ZSqm7OGjr!Kw)<zw5+RC*=4gX2uQ|SH= z(fW<Y4?~BCkL_KXt!&%RZ2$1_nr}A)pV{v|cKrSDanN!6u!%J2>>h@X@4DNMLrB3} z9lN<_?>K1ddB9+MZ@WGO#J9b-9m0IO8E~h+u8nlHS2~A(D6D#J7&U`-=jJJzshoE2 zY|Hh~z9HlxTv_#krtO6{k?CWPFpAbgFzRHVQM1G-rYtFuGQuR)Du<EV?t0y@(e>Sk z#J6~7{qEYA_Zts4?`(lDyo648nG#}*Oe&O{Mq=VgsT`0%qCjgkLv>e?h_yO@q<#m1 z_-6S?lcX?pNqGTrd8zUuR!x6el<St11&^?3k}%q9VUxR^$PIkjLPEg9XKu7x(~qf3 zRN8Nu=&<92V?@3|gb-7*N<kfvNuovk6`aZ=1L*@vBs!Z(QEolI+unA#=nkE$2V*Qq z@~fWR-e&gAi)jB}c$D6m*RGYsL_hkTbBI?q40z<Qnt>c`^pG#0gJe?fyhh-AhsmVd z#0VV$q+|#zPAia<M#egUqL3C!Q4O`M$)~FGvnUzaue3Ppc)~>_a<9_fi`7_*_2&ld zT5v%h-F*Y0nnfeAqQ$;Yr8`dL)SsmC{}G!Sjh+hk6*&oqN%3w-p1)GcYpR$`&EThL zBw`moLy1YrsCXvxukQCUP{q)S%FiL+Br@nn6C}|UoLNOCQeLRB@=`t0kkd#|kMx-S z)V<7-a->JdKUbN$r}1kH`YP5*ewe;MGGy2#2$)$g@w@H%%#3y&6L06h3|azcxjc+a zKk$1F56n&g&Ef7lX24C~*|A0bNw?iWBh$t|=l0=>Sr8rGx4GSRpb<g=zBTv>kT%W@ z)9<W6QBf;VNOY_bWJZCx?U<os^X9I@WQQ(0xOM|0MFZSAogyig>+hJf-9WY*rjxjw z9)LH@Yqb^G$pZ(+mp?+1=&s)_rycj>f8+Nf<skQ(-$@MSwp!L?%d?}D7l{s~Su-qy zCSn;x8|)ER<kGDzmRf9qsTP<jbcH<l-bBw~5s5NgPz!2NE2@UZY0(D@odH0LEf)Gi zWMa}oDlK%Z(Gp^5u@#sGb%_lzt2{?~LOC)b{e{8w*m$X_N=#>rv1ye;Y)=myYH*w} zR=%&bdgt!qP&VbEY*J~6lz3`KCLqVW(5hvu2^>gL?gfp>0?wkX#{GwP>l=+*4<D>; z-MP2fsBf$%IWO4R!7z#8`mLarN%9P4L<6V4*mX%psE|YpIVniDEx9qiC*~x#gjsQn zwE-T4!d?W&^6I==RQWZO4LC*$gSaL*_7}*Ix`@;r2tU)l*N?y_9Pmc}$j70tMfwxs zSBAC?^nK=gO>Q2R-7^G-f$<_6>n~Mc8&NJcu$8jdO21)QY$bzbft5+ib9*}f^C<sf zg5{$EVaA!3Hjk}|b;w{HCVIa<-ek=2A{!zeVV2l8v^r52M+oh^W?=KsG09#UER9gT zE2eqJZ+Zf+WxJlk%=ECu_QfGMP&I?&gVe@P(1}U4FA<FaDL+X?-bep^75TncHc9-j zu}57t#C%_66X1x+GpFgcVJnEe$IqkB-rd_l7y1Z?e&lvM=T$rzPzsTCIwtK<hdX}L z32&GeLh$Ng2vJ17RhtwVIjP>gxA|$K{?)^^2OAA(ZE~_;_yr_MhSQLo4#^}7JL75B z;g_iP3YFxZ+1w}5*29R`vQoESM~!8GkkFc-v?0_)R!lZbGU7ch-7u4&3;r)Q-9@kA zJQ78#XjOF<+Mz5oL>}q9#($2QCLIFwBb#6#^#=eBRw4J=a}`$1wa1X>BUqa_B6L@I zslA}RfcH@*&M;+ff*0_H27x5&tIE^DBjw<|m|9*v%0jECG31+JCqVjhagJ$_e8v>Y z;}E903|ifK1ltz!orOWtaqK;;b<1;_kyuS@YPblt5zL5=yNCNj0Y_*<=3ybxboeAC z#PV7`DUIGX%F@&s+&(5HEY2!<qQ8Z9iPmA(gsejMoDRrw{-5l2pp=|O(2Y9XRIT-` z-0(MO5LS^W#CWKgie6AFcpEBTL+L=-5WNHSyaGU~XQqO=LP784`66A%B2}Ks{31ay zPGE6K(|X&cJc>-)+_$~1W43tE20)iJ@X6*lNX<Jf(~V3PKr#41WI6{hrLUS?oMGl> z;5!2xoOzq}=185n3C0SZO8Is}-}Y;Iq6gbgI9c6^x<AgH98eli_W`Oyk}X9mYM8#p zH;^Al9i3f+>HjO3;o>}!rYXr2)1eoQSi^~B2)RSaklf|@YJ_W5Y|KNlehc$Om?UJb zWaBL4GS9z8eOA<EMPHCN^pzXwD<9)-58Us73yB==>u4g*z|hIBVtl+O@Xq61z&nTc z<SLz+6Rb#QCM%^-SwK_3Ii_bq;8jG;bc$CMP&I{So@+;ixInw<2bEWlo1ImBcqY*E z+@LSw$vmC~%u)8aD0*2+ds!CHi4;01pi?PyT0mz~$Q01o6gnrMH&W=lfG(uaMFCw( zq00iQrO*`ty_rH+1@u-5tqADt6nYJ1l1J%Wu89`c(iZQ4Ba`u@;E2Z0A$QD?cT$|| zqQ&)9Xb$k{-Squl`hGvf`kBD`KydLxaPQ}1+`BPC<1bQ3a&I+-B=>%qLXvwoQ%G{} zqZE?d`#6Op_tsKKa_^HAlH6NQA<4a4DI~eKA!xq+3YtGn@g!eAOCd?~ofMKZf1W~; z<}Xr6(tJ0CB+Xx@kfeDtg(S`QQb^K#KZPWfUkONIMCSv+>pJMxq06_R%ZL3nR+;ZQ z!L}Vb(hf{Cm-SZGgRaMfVxlw6bQxJMeMD)RnDU}zUSKOpVHbA@*}k_l)|RSdi{6#7 zD%tHZ!cdpibbqw;TIMpVI#vV%tZKB2JF*Xx=@@Tjyo?YF`wf~TOl8N)?88wNSryl( za{_tjUK{2`qH)*C*v#%kRzbXQ4+?xMhsy!XkHaM2cA!Mv(A^>ZseJsGA6q$le}_u= zFHj&4#-(ltmPD}UG+6M=PqQ%3-N3r=+Nxo@%F2qPb>FJW_bck6v~I-tX5}$#cW1Y; zZ_V~|BW?Tj(V%{`eW_)KQKR3~S{eaIdK$ruMlr|w49Nv{+~){5+UIZ;`WyjAFejs3 ztlDniF-&z~2zVWqJB;PN4l5eQ8l8n6+At6!y9+^TH(CLlVfKzSv1^Bo?Jh3TGTX7c zp(C@f5bZ;&*m4^!7q*B8FP$~jYPgMNm+xb*iGmF7(XcR!Lac<v)VOAye!Ywkx;2>! z#Sj1?rkYZp%cEdgTOD0Z(PE^mk2lQsec4rYxGcr14D(&|HdNxuc0(n78nJ8~43XYq z>*DJtJB(<}q?3L{AvzoC(wZAE;g!W>*vq3#8EG<7H{NcTA^W2gEDzU>wObr!+Q?`_ zHKT3#JJ2lFP_;WUTxtm>6B`FjM>r{kL02pCUy??;Ny$e@`hLy6p)D1Esx?VNmPox0 zv?%|KMlByJc5;kar6Jg5i9srrliQttLCKg4?9`6qJLH$>o8%*wKV50UzeNInp<cmd zC@<V4c{PumfDGi*zp`4^aalrIP?z;t%DwInt;-s)P%m4jEl2S+(O&imd_c#KR@SN- zzX!?&w*tC=lWDw;C;UfTzNMK&Cb75`kXZ~D1k1n)p^LbKfy){>7cz8DU|Dh&kjIYY zSe{M5X_1YLC_~q;gWttjT+IIZD1SH$!?%DVdlFBPOrl4M|B0bQ*}Ve)XH_{upsRO2 z%CQpg%5V?mpG+V(6%|<Jd!1YoWLVRs4Oh9spA^1Ueg%W|YXt`JG%k3*N6V^gnT|8F zr1V?Ce4c<qd{WjEwNLLq>QkH(6i-IQcoGyBF{2Wjjf;R`%D>d%1}V}N5@xa)mDwCo zA#miZr(m+@U^<rK65LwzFioiag5XFc)}!eNp)=H%BZ6jjROF{bepciwf`g0ETwKOz zaDEAR3GmbqybQP^Va$FynkVn*Q8liz6MH%+`xkZ+r8M%XxEfEVX8rHcYWlefv;H*A zBU%8hWm;9xFcZ&UR>lt+M{o!2&crif^u>7QIj!ara4YdtTt*L>quGNi@hmg3a%Y!h zpn<M2=Wqq5)p}zI(GPZRRrx`CYCclpS#aV!II)ae2`(iX`$Ru~G<SF!*P@f`!Va$V zLdNFf`4^|+IpP^)!h}qm-YbBzzgH2Y1pnuD$YqENLb~F5TxwAa>*6ME%^mW>AP^+Y zlVTd*5RRu2e-e2cL^y(66fQ*kn=<*>WxV8XWL)c~dD#(3qT8;BB>g9C8FE);l^*W7 zGU7<y!y%{90J*ogj_6Z2f<GoTGyD2#i~L|Fx{)sT8RV>)(NIl;qA!Wz!#Umis7~{P zb!y^_h9zqXRN)Dwa1(CY2!g?~_09eO=I8Z$n<l*W4tbe`>)}V-e-V#KvgD2Mqa>Gl zos--{f6s?;*LyY?=JJKGCdRsy)?GRtjObdq?>W$xrgTyW7yL%&Fs#E_+Vx!c*qOOO z!MO+aGg;ORH!+dWL?AS1y227A@3(pP&X@HSPGOMV5~c^k9I5b(gr<z$m|v~;u5UqA zJMh~(H2JUA5fr3=Y9G<whskVj!~X_<yp71<Vb8H<rGG^-wa=E`!tsib{vPnFH~+u= zn8dl>f;iVk9h{<KimZf`0xFPJwDR7^?uYQo_wEh3tV6R)K0dhkI&0Dk7`i?3i3r!9 z8Fse^2dUY1eee(-mcFl5@FZO6P5e4tuWx#nU@tn65UUZYg-cxc!=nHswfJozSHu0w zBQfMRP{ThJ)#4l*WfT7rHMKLGeAUvg2q)oocSraqIf;K_P`EV7f8iX8_&FzUU}8{& z9u7r>T0%}6Fv;2-#C4hUP*OaBPf$WG8xb+$?-EvJ*yBlY^rTq-?B0W|)Crmx4-iD< zA5bImDhh`>Cnr14Q9>>+al#2V61<|qb(R$FP>4u|_ZJWw!7fem{<Ccuv7Tc|&s|@g zSOqCAG%I0Y@T=(5nodK8$CXxTxF{6CT<h2`O`D@Zdp1!WYcY*J4!3B~2-Y<0kMu); z{)&)oV=WEcW{<5IgiS+hdDy@jtE-YMj+IRhmc0R)BJZ{}H{3h5ke=VSiG9MpqGh+L za5*-{<YCMfDh_MDe@CN`>>mXN2$?H+qae(cf~vteSy8W(XHH$z=3$iN)htR2Flq8I zeq>rkjHIYlfLYNE7)%BD@d#@X_=q~8!~jHpS-3lwHS#YPH4XS>YGZJQv76-QqaVFV zZiR94H8PR%gq)j*aPV^?>I6^TOFDQnh?$7EN0fVk4=1EigSZHyET}EOe4rq%B979+ z3&hn4LX^dzuWE1{>6^VP+-V2<w6}%NlQK`6P`f+y?FoFOP|Q)l4~4>*4{d=7gpLO< zX^K@VC0Y<BM#qkJldR|_6nl>U48+3^y^90HOR~HjamV2_JqWAaavJSD48Z@0u%@WT z#?vN5TMTVYwQXG4rPy}x`Gi##1!AugjF4bKq9Yi<`8M@BnfjV(qgd0TM``2AKF1B> zDa^+i8gmta$TVb*^`SM!N|sf=hrYq9tu2|T;^0Q~S;Q^hLZIR><PLE7E+rz0G1(08 zv4?OlheF+08Elx&p@@L+UjYxz+ymi`w-);!hOFRo63l-EAKi#gh9s{}4pnn!MSMd< z97Ti}A2*PavX)0tNJS72L_m;4$vQtk5c^`KFaDA}>8D0g7m;SOPL1Q!Svc_C3l(Uc zekD%YbHIgqvn~yg`X9ZlND9W+JKwLjG6I1=0Uew^4G<cZKc?I_l>9LzWc_mrAV`gV zj&heNp-`pNu|lbC5J-0ivB$(x4vB%#3Ki7i+l_X>x}I~B7B!^9Wf5DQ)PcMQQRuir g+gx4L4Qyxmhgz*rD(Hpfe6BE?pUO|<pX9Co0o6;;jsO4v literal 0 HcmV?d00001 diff --git a/internal/ephys/__pycache__/plot_qc_figures.cpython-37.pyc b/internal/ephys/__pycache__/plot_qc_figures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6efc4f5f58743a5d7f20b18751a84be109ce0c10 GIT binary patch literal 25934 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̄Lpb=cljH6-ja_@_z^*;iV{+Ov3)dgL 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 J%pAxW{|~ZYW$*w1 literal 0 HcmV?d00001 diff --git a/internal/ephys/__pycache__/plot_qc_figures3.cpython-37.pyc b/internal/ephys/__pycache__/plot_qc_figures3.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a4c01acfb21d0401fc846c68b96cbf1dbae24a1 GIT binary patch literal 25343 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 T5WYW<K9)U@-jA<?*@yoRp}e++ literal 0 HcmV?d00001 diff --git a/internal/ephys/core_feature_extract.py b/internal/ephys/core_feature_extract.py new file mode 100644 index 0000000000..19084713a1 --- /dev/null +++ b/internal/ephys/core_feature_extract.py @@ -0,0 +1,325 @@ +import sys, os, shutil +import logging +from collections import defaultdict +import numpy as np +import json +from six import iteritems + +from allensdk.config.manifest import Manifest +from allensdk.core.json_utilities import json_handler + +from allensdk.core.nwb_data_set import NwbDataSet +from allensdk.ephys.extract_cell_features import extract_cell_features, extract_sweep_features +from allensdk.ephys.ephys_features import FeatureError +from allensdk.ephys.ephys_extractor import reset_long_squares_start +import allensdk.internal.ephys.plot_qc_figures as plot_qc_figures + + +TEST_PULSE_DURATION_SEC = 0.4 + +LONG_SQUARE_COARSE = 'C1LSCOARSE' +LONG_SQUARE_FINE = 'C1LSFINEST' +SHORT_SQUARE = 'C1SSFINEST' +RAMP = 'C1RP25PR1S' +PASSED_SWEEP_STATES = [ 'manual_passed', 'auto_passed' ] +ICLAMP_UNITS = [ 'Amps', 'pA' ] + +def filter_sweeps(sweeps, types=None, passed_only=True, iclamp_only=True): + if passed_only: + sweeps = [ s for s in sweeps if s.get('workflow_state', None) in PASSED_SWEEP_STATES ] + + if iclamp_only: + sweeps = [ s for s in sweeps if s['stimulus_units'] in ICLAMP_UNITS ] + + if types: + sweeps = [ s for s in sweeps for t in types + if s['ephys_stimulus']['description'].startswith(t) ] + + return sorted(sweeps, key=lambda x: x['sweep_number']) + +def filtered_sweep_numbers(sweeps, types=None, passed_only=True, iclamp_only=True): + return [ s['sweep_number'] for s in filter_sweeps(sweeps, types, passed_only, iclamp_only) ] + +def find_stim_start(stim, idx0=0): + """ + Find the index of the first nonzero positive or negative jump in an array. + + Parameters + ---------- + stim: np.ndarray + Array to be searched + + idx0: int + Start searching with this index (default: 0). + + Returns + ------- + int + """ + + di = np.diff(stim) + idxs = np.flatnonzero(di) + idxs = idxs[idxs >= idx0] + + if len(idxs) == 0: + return -1 + + return idxs[0]+1 + +def find_sweep_stim_start(data_set, sweep_number): + sweep = data_set.get_sweep(sweep_number) + sr = sweep['sampling_rate'] + stim_start = find_stim_start(sweep['stimulus'], TEST_PULSE_DURATION_SEC * sr) / sr + logging.info("Long square stims start at time %f", stim_start) + return stim_start + +def find_coarse_long_square_amp_delta(sweeps, decimals=0): + """ Find the delta between amplitudes of coarse long square sweeps. Includes failed sweeps. """ + sweeps = filter_sweeps(sweeps, types=[ LONG_SQUARE_COARSE ], passed_only = False) + + amps = sorted([s['stimulus_amplitude'] for s in sweeps]) + amps_diff = np.round(np.diff(amps), decimals=decimals) + + amps_diff = amps_diff[amps_diff > 0] # repeats are okay + deltas = sorted(np.unique(amps_diff)) # unique nonzero deltas + + if len(deltas) == 0: + return 0 + + delta = deltas[0] + + if len(deltas) != 1: + logging.warning("Found multiple coarse long square amplitude step differences: %s. Using: %f" % (str(deltas), delta)) + + return delta + +def update_output_sweep_features(cell_features, sweep_features, sweep_index): + # add peak deflection for subthreshold long squares + for sweep_number, sweep in iteritems(sweep_index): + pd = sweep_features.get(sweep_number,{}).get('peak_deflect', None) + if pd is not None: + sweep['peak_deflection'] = pd[0] + + # update num_spikes + for sweep_num in sweep_features: + num_spikes = len(sweep_features[sweep_num]['spikes']) + if num_spikes == 0: + num_spikes = None + sweep_index[sweep_num]['num_spikes'] = num_spikes + + +def nan_get(obj, key): + """ Return a value from a dictionary. If it does not exist, return None. If it is NaN, return None """ + v = obj.get(key, None) + + if v is None: + return None + else: + return None if np.isnan(v) else v + +def generate_output_cell_features(cell_features, sweep_features, sweep_index): + ephys_features = {} + + # find hero and rheo sweeps in sweep table + rheo_sweep_num = cell_features["long_squares"]["rheobase_sweep"]["id"] + rheo_sweep_id = sweep_index.get(rheo_sweep_num, {}).get('id', None) + + if rheo_sweep_id is None: + raise Exception("Could not find id of rheobase sweep number %d." % rheo_sweep_num) + + hero_sweep = cell_features["long_squares"]["hero_sweep"] + if hero_sweep is None: + raise Exception("Could not find hero sweep") + + hero_sweep_num = hero_sweep["id"] + hero_sweep_id = sweep_index.get(hero_sweep_num, {}).get('id', None) + + if hero_sweep_id is None: + raise Exception("Could not find id of hero sweep number %d." % hero_sweep_num) + + # create a table of values + # this is a dictionary of ephys_features + base = cell_features["long_squares"] + ephys_features["rheobase_sweep_id"] = rheo_sweep_id + ephys_features["rheobase_sweep_num"] = rheo_sweep_num + ephys_features["thumbnail_sweep_id"] = hero_sweep_id + ephys_features["thumbnail_sweep_num"] = hero_sweep_num + ephys_features["vrest"] = nan_get(base, "v_baseline") + ephys_features["ri"] = nan_get(base, "input_resistance") + + # change the base to hero sweep + base = cell_features["long_squares"]["hero_sweep"] + ephys_features["adaptation"] = nan_get(base, "adapt") + ephys_features["latency"] = nan_get(base, "latency") + + # convert to ms + mean_isi = nan_get(base, "mean_isi") + ephys_features["avg_isi"] = (mean_isi * 1e3) if mean_isi is not None else None + + # now grab the rheo spike + base = cell_features["long_squares"]["rheobase_sweep"]["spikes"][0] + ephys_features["upstroke_downstroke_ratio_long_square"] = nan_get(base, "upstroke_downstroke_ratio") + ephys_features["peak_v_long_square"] = nan_get(base, "peak_v") + ephys_features["peak_t_long_square"] = nan_get(base, "peak_t") + ephys_features["trough_v_long_square"] = nan_get(base, "trough_v") + ephys_features["trough_t_long_square"] = nan_get(base, "trough_t") + ephys_features["fast_trough_v_long_square"] = nan_get(base, "fast_trough_v") + ephys_features["fast_trough_t_long_square"] = nan_get(base, "fast_trough_t") + ephys_features["slow_trough_v_long_square"] = nan_get(base, "slow_trough_v") + ephys_features["slow_trough_t_long_square"] = nan_get(base, "slow_trough_t") + ephys_features["threshold_v_long_square"] = nan_get(base, "threshold_v") + ephys_features["threshold_i_long_square"] = nan_get(base, "threshold_i") + ephys_features["threshold_t_long_square"] = nan_get(base, "threshold_t") + ephys_features["peak_v_long_square"] = nan_get(base, "peak_v") + ephys_features["peak_t_long_square"] = nan_get(base, "peak_t") + + base = cell_features["long_squares"] + ephys_features["sag"] = nan_get(base, "sag") + # convert to ms + tau = nan_get(base, "tau") + ephys_features["tau"] = (tau * 1e3) if tau is not None else None + ephys_features["vm_for_sag"] = nan_get(base, "vm_for_sag") + ephys_features["has_burst"] = None#base.get("has_burst", None) + ephys_features["has_pause"] = None#base.get("has_pause", None) + ephys_features["has_delay"] = None#base.get("has_delay", None) + ephys_features["f_i_curve_slope"] = nan_get(base, "fi_fit_slope") + + # change the base to ramp + base = cell_features["ramps"]["mean_spike_0"] # mean feature of first spike for all of these + ephys_features["upstroke_downstroke_ratio_ramp"] = nan_get(base, "upstroke_downstroke_ratio") + ephys_features["peak_v_ramp"] = nan_get(base, "peak_v") + ephys_features["peak_t_ramp"] = nan_get(base, "peak_t") + ephys_features["trough_v_ramp"] = nan_get(base, "trough_v") + ephys_features["trough_t_ramp"] = nan_get(base, "trough_t") + ephys_features["fast_trough_v_ramp"] = nan_get(base, "fast_trough_v") + ephys_features["fast_trough_t_ramp"] = nan_get(base, "fast_trough_t") + ephys_features["slow_trough_v_ramp"] = nan_get(base, "slow_trough_v") + ephys_features["slow_trough_t_ramp"] = nan_get(base, "slow_trough_t") + + ephys_features["threshold_v_ramp"] = nan_get(base, "threshold_v") + ephys_features["threshold_i_ramp"] = nan_get(base, "threshold_i") + ephys_features["threshold_t_ramp"] = nan_get(base, "threshold_t") + + # change the base to short_square + base = cell_features["short_squares"]["mean_spike_0"] # mean feature of first spike for all of these + ephys_features["upstroke_downstroke_ratio_short_square"] = nan_get(base, "upstroke_downstroke_ratio") + ephys_features["peak_v_short_square"] = nan_get(base, "peak_v") + ephys_features["peak_t_short_square"] = nan_get(base, "peak_t") + + ephys_features["trough_v_short_square"] = nan_get(base, "trough_v") + ephys_features["trough_t_short_square"] = nan_get(base, "trough_t") + + ephys_features["fast_trough_v_short_square"] = nan_get(base, "fast_trough_v") + ephys_features["fast_trough_t_short_square"] = nan_get(base, "fast_trough_t") + + ephys_features["slow_trough_v_short_square"] = nan_get(base, "slow_trough_v") + ephys_features["slow_trough_t_short_square"] = nan_get(base, "slow_trough_t") + + ephys_features["threshold_v_short_square"] = nan_get(base, "threshold_v") + #ephys_features["threshold_i_short_square"] = nan_get(base, "threshold_i") + ephys_features["threshold_t_short_square"] = nan_get(base, "threshold_t") + + ephys_features["threshold_i_short_square"] = nan_get(cell_features["short_squares"], "stimulus_amplitude") + + return ephys_features + +def extract_data(data, nwb_file): + ########################################################## + #### alings with ephys_sweep_qc_tool extract_features #### + cell_specimen = data['specimens'][0] + sweep_list = cell_specimen['ephys_sweeps'] + sweep_index = { s['sweep_number']:s for s in sweep_list } + + data_set = NwbDataSet(nwb_file) + + + # extract sweep-level features + logging.debug("Computing sweep features") + iclamp_sweep_list = filter_sweeps(sweep_list, iclamp_only=True, passed_only=False) + iclamp_sweeps = defaultdict(list) + for s in iclamp_sweep_list: + try: + stimulus_type_name = s['ephys_stimulus']['ephys_stimulus_type']['name'] + except KeyError as e: + raise Exception("Sweep %d has no ephys stimulus record in features JSON file: %s" % (s['sweep_number'], json.dumps(s, indent=3, default=json_handler))) + + if stimulus_type_name == "Unknown": + raise Exception(("Sweep %d (%s) has 'Unknown' stimulus type." + + "Please update the EpysStimuli and EphysRawStimulusNames associations in LIMS.") % (s['sweep_number'], s['ephys_stimulus']['description'])) + + iclamp_sweeps[stimulus_type_name].append(s['sweep_number']) + + passed_iclamp_sweep_list = filter_sweeps(sweep_list, iclamp_only=True, passed_only=True) + num_passed_sweeps = len(passed_iclamp_sweep_list) + logging.info("%d of %d sweeps passed QC", + num_passed_sweeps, + len(iclamp_sweep_list)) + + if num_passed_sweeps == 0: + raise FeatureError("There are no QC-passed sweeps available to analyze") + + # compute sweep features + logging.info("Computing sweep features") + sweep_features = extract_sweep_features(data_set, iclamp_sweeps) + cell_specimen['sweep_ephys_features'] = sweep_features + + # extract cell-level features + logging.info("Computing cell features") + long_square_sweep_numbers = filtered_sweep_numbers(sweep_list, [ LONG_SQUARE_COARSE, LONG_SQUARE_FINE ]) + short_square_sweep_numbers = filtered_sweep_numbers(sweep_list, [ SHORT_SQUARE ]) + ramp_sweep_numbers = filtered_sweep_numbers(sweep_list, [ RAMP ]) + + logging.debug("long square sweeps: %s", str(long_square_sweep_numbers)) + logging.debug("short square sweeps: %s", str(short_square_sweep_numbers)) + logging.debug("ramp sweeps: %s", str(ramp_sweep_numbers)) + + # PBS-262 -- have variable subthreshold minimum for human cells + subthresh_min_amp = None # None means default (mouse) behavior + long_square_amp_delta = find_coarse_long_square_amp_delta(sweep_list) + + if long_square_amp_delta != 20.0: + subthresh_min_amp = -200 + + logging.info("Long squares using %fpA step size. Using subthreshold minimum amplitude of %s.", + long_square_amp_delta, + str(subthresh_min_amp) if subthresh_min_amp is not None else "[default]") + + stim_start = find_sweep_stim_start(data_set, long_square_sweep_numbers[0]) + if stim_start > 0: + logging.info("resetting long square start time to: %f", stim_start) + reset_long_squares_start(stim_start) + + cell_features = extract_cell_features(data_set, + ramp_sweep_numbers, + short_square_sweep_numbers, + long_square_sweep_numbers, + subthresh_min_amp) + # shuffle peak deflection for the subthreshold long squares + for s in cell_features["long_squares"]["subthreshold_sweeps"]: + sweep_features[s['id']]['peak_deflect'] = s['peak_deflect'] + + cell_specimen['cell_ephys_features'] = cell_features + + update_output_sweep_features(cell_features, sweep_features, sweep_index) + ephys_features = generate_output_cell_features(cell_features, sweep_features, sweep_index) + + try: + out_ephys_features = cell_specimen.get('ephys_features',[])[0] + out_ephys_features.update(ephys_features) + except IndexError: + cell_specimen['ephys_features'] = [ ephys_features ] + + #### breaks with ephys_sweep_qc_tool extract_features #### + ########################################################## + return sweep_list, sweep_features + +def save_qc_figures(qc_fig_dir, nwb_file, output_data, plot_cell_figures): + if os.path.exists(qc_fig_dir): + logging.warning("removing existing qc figures directory: %s", qc_fig_dir) + shutil.rmtree(qc_fig_dir) + + Manifest.safe_mkdir(qc_fig_dir) + + logging.debug("saving qc plot figures") + plot_qc_figures.make_sweep_page(nwb_file, output_data, qc_fig_dir) + plot_qc_figures.make_cell_page(nwb_file, output_data, qc_fig_dir, plot_cell_figures) diff --git a/internal/ephys/plot_qc_figures.py b/internal/ephys/plot_qc_figures.py new file mode 100644 index 0000000000..0a4ccebf15 --- /dev/null +++ b/internal/ephys/plot_qc_figures.py @@ -0,0 +1,805 @@ +import matplotlib + +matplotlib.use('agg') + +import logging + +import allensdk.internal.core.lims_utilities as lims_utilities +import allensdk.core.json_utilities as json_utilities + +from allensdk.core.nwb_data_set import NwbDataSet +import allensdk.ephys.ephys_features as ft +from allensdk.ephys.extract_cell_features import get_square_stim_characteristics, get_ramp_stim_characteristics, get_stim_characteristics + +import sys +import argparse +import os +import json +import h5py +import numpy as np +from six import iteritems + +from scipy.optimize import curve_fit +import scipy.signal as sg +import scipy.misc + +import datetime +import matplotlib.pyplot as plt +#import seaborn as sns + +AXIS_Y_RANGE = [ -110, 60 ] + +def get_time_string(): + return datetime.datetime.now().strftime("%I:%M%p %B %d, %Y") + +def get_spikes(sweep_features, sweep_number): + return get_features(sweep_features, sweep_number)["spikes"] + +def get_features(sweep_features, sweep_number): + try: + return sweep_features[int(sweep_number)] + except KeyError: + return sweep_features[str(sweep_number)] + +def load_experiment(file_name, sweep_number): + ds = NwbDataSet(file_name) + sweep = ds.get_sweep(sweep_number) + + r = sweep['index_range'] + v = sweep['response'] * 1e3 + i = sweep['stimulus'] * 1e12 + dt = 1.0 / sweep['sampling_rate'] + t = np.arange(0, len(v)) * dt + + return (v, i, t, r, dt) + +def plot_single_ap_values(nwb_file, sweep_numbers, lims_features, sweep_features, cell_features, type_name): + figs = [ plt.figure() for f in range(3+len(sweep_numbers)) ] + + v, i, t, r, dt = load_experiment(nwb_file, sweep_numbers[0]) + if type_name == "short_square" or type_name == "long_square": + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + elif type_name == "ramp": + stim_start, start_idx = get_ramp_stim_characteristics(i, t) + + gen_features = ["threshold", "peak", "trough", "fast_trough", "slow_trough"] + voltage_features = ["threshold_v", "peak_v", "trough_v", "fast_trough_v", "slow_trough_v"] + time_features = ["threshold_t", "peak_t", "trough_t", "fast_trough_t", "slow_trough_t"] + + for sn in sweep_numbers: + spikes = get_spikes(sweep_features, sn) + + if (len(spikes) < 1): + logging.warning("no spikes in sweep %d" % sn) + continue + + if type_name != "long_square": + voltages = [spikes[0][f] for f in voltage_features] + times = [spikes[0][f] for f in time_features] + else: + rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] + rheo_spike = get_spikes(sweep_features, rheo_sn)[0] + voltages = [ rheo_spike[f] for f in voltage_features] + times = [ rheo_spike[f] for f in time_features] + + plt.figure(figs[0].number) + plt.scatter(range(len(voltages)), voltages, color='gray') + plt.tight_layout() + + + plt.figure(figs[1].number) + plt.scatter(range(len(times)), times, color='gray') + plt.tight_layout() + + plt.figure(figs[2].number) + plt.scatter([0], [spikes[0]['upstroke'] / (-spikes[0]['downstroke'])], color='gray') + plt.tight_layout() + + + plt.figure(figs[0].number) + + yvals = [float(lims_features[k + "_v_" + type_name]) for k in gen_features if lims_features[k + "_v_" + type_name] is not None] + xvals = range(len(yvals)) + + plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) + plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) + plt.title(type_name + ": voltages") + + plt.figure(figs[1].number) + yvals = [float(lims_features[k + "_t_" + type_name]) for k in gen_features if lims_features[k + "_t_" + type_name] is not None] + xvals = range(len(yvals)) + plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) + plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) + plt.title(type_name + ": times") + + plt.figure(figs[2].number) + if lims_features["upstroke_downstroke_ratio_" + type_name] is not None: + plt.scatter([0], [float(lims_features["upstroke_downstroke_ratio_" + type_name])], color='blue', marker='_', s=40, zorder=100) + plt.xticks([]) + plt.title(type_name + ": up/down") + + for index, sn in enumerate(sweep_numbers): + plt.figure(figs[3 + index].number) + + v, i, t, r, dt = load_experiment(nwb_file, sn) + plt.plot(t, v, color='black') + plt.title(str(sn)) + + spikes = get_spikes(sweep_features, sn) + + nspikes = len(spikes) + + if type_name != "long_square" and nspikes: + if nspikes == 0: + logging.warning("no spikes in sweep %d" % sn) + continue + + voltages = [spikes[0][f] for f in voltage_features] + times = [spikes[0][f] for f in time_features] + else: + rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] + rheo_spike = get_spikes(sweep_features, rheo_sn)[0] + voltages = [ rheo_spike[f] for f in voltage_features ] + times = [ rheo_spike[f] for f in time_features ] + + plt.scatter(times, voltages, color='red', zorder=20) + + + delta_v = 5.0 + if nspikes: + plt.plot([spikes[0]['upstroke_t'] - 1e-3 * (delta_v / spikes[0]['upstroke']), + spikes[0]['upstroke_t'] + 1e-3 * (delta_v / spikes[0]['upstroke'])], + [spikes[0]['upstroke_v'] - delta_v, spikes[0]['upstroke_v'] + delta_v], color='red') + + if 'downstroke_t' in spikes[0]: + plt.plot([spikes[0]['downstroke_t'] - 1e-3 * (delta_v / spikes[0]['downstroke']), + spikes[0]['downstroke_t'] + 1e-3 * (delta_v / spikes[0]['downstroke'])], + [spikes[0]['downstroke_v'] - delta_v, spikes[0]['downstroke_v'] + delta_v], color='red') + else: + logging.warning("spike has no downstroke time, clipped") + + if type_name == "ramp": + if nspikes: + plt.xlim(spikes[0]["threshold_t"] - 0.002, spikes[0]["fast_trough_t"] + 0.01) + elif type_name == "short_square": + plt.xlim(stim_start - 0.002, stim_start + stim_dur + 0.01) + elif type_name == "long_square": + plt.xlim(times[0]- 0.002, times[-2] + 0.002) + + plt.tight_layout() + + + return figs + +def plot_sweep_figures(nwb_file, ephys_roi_result, image_dir, sizes): + sweeps = ephys_roi_result["specimens"][0]["ephys_sweeps"] + vclamp_sweep_numbers = sorted([ s['sweep_number'] for s in sweeps if s['stimulus_units'] == 'Amps' or s['stimulus_units'] == 'pA' ]) + + image_file_sets = {} + + tp_set = [] + exp_set = [] + + prev_sweep_number = None + + tp_len = 0.035 + tp_steps = int(tp_len * 200000) + + b, a = sg.bessel(4, 0.1, "low") + + for i, sweep_number in enumerate(vclamp_sweep_numbers): + logging.info("plotting sweep %d" % sweep_number) + if i == 0: + v_init, i_init, t_init, r_init, dt_init = load_experiment(nwb_file, sweep_number) + + tp_fig = plt.figure() + axTP = plt.gca() + axTP.set_yticklabels([]) + axTP.set_xticklabels([]) + axTP.set_xlabel(str(sweep_number)) + axTP.set_ylabel('') + xTP = t_init[0:tp_steps] + yTP = v_init[0:tp_steps] + axTP.plot(xTP, yTP, linewidth=1) + axTP.set_xlim(0, tp_len) +# sns.despine() + + exp_fig = plt.figure() + axDP = plt.gca() + axDP.set_yticklabels([]) + axDP.set_xticklabels([]) + axDP.set_xlabel(str(sweep_number)) + axDP.set_ylabel('') + v_exp = v_init[r_init[0]:] + t_exp = t_init[r_init[0]:] + yDP = sg.filtfilt(b, a, v_exp, axis=0) + xDP = t_exp + baseline = yDP[5000:9000] + baselineMean = np.mean(baseline) + baselineV = (np.ones(len(xDP))) * baselineMean + axDP.plot(xDP, yDP, linewidth=1) + axDP.plot(xDP, baselineV, linewidth=1) + axDP.set_xlim(t_exp[0], t_exp[-1]) +# sns.despine() + + v_prev, i_prev, t_prev, r_prev = v_init, i_init, t_init, r_init + + else: + v, i, t, r, dt = load_experiment(nwb_file, sweep_number) + + tp_fig = plt.figure() + axTP = plt.gca() + axTP.set_yticklabels([]) + axTP.set_xticklabels([]) + axTP.set_xlabel(str(sweep_number)) + axTP.set_ylabel('') + yTP = v[:tp_steps] + xTP = t[:tp_steps] + TPBL = np.mean(yTP[0:100]) + yTPN = yTP - TPBL + yTPp = v_prev[:tp_steps] + TPpBL = np.mean(yTPp[0:100]) + yTPpN = yTPp - TPpBL + yTPi = v_init[:tp_steps] + TPiBL = np.mean(yTPi[0:100]) + yTPiN = yTPi - TPiBL + axTP.plot(xTP, yTPiN, linewidth=1) + axTP.plot(xTP, yTPpN, linewidth=1) + axTP.plot(xTP, yTPN, linewidth=1) + axTP.set_xlim(0, tp_len) +# sns.despine() + + exp_fig = plt.figure() + axDP = plt.gca() + axDP.set_yticklabels([]) + axDP.set_xticklabels([]) + axDP.set_xlabel(str(sweep_number)) + axDP.set_ylabel('') + v_exp = v[r[0]:] + t_exp = t[r[0]:] + yDP = sg.filtfilt(b, a, v_exp, axis=0) + xDP = t_exp + baseline = yDP[5000:9000] + baselineMean = np.mean(baseline) + baselineV = (np.ones(len(xDP))) * baselineMean + axDP.plot(xDP, yDP, linewidth=1) + axDP.plot(xDP, baselineV, linewidth=1) + axDP.set_xlim(t_exp[0], t_exp[-1]) +# sns.despine() + + v_prev, i_prev, t_prev, r_prev = v, i, t, r + + prev_sweep_number = sweep_number + + save_figure(tp_fig, 'test_pulse_%d' % sweep_number, 'test_pulses', image_dir, sizes, image_file_sets) + save_figure(exp_fig, 'experiment_%d' % sweep_number, 'experiments', image_dir, sizes, image_file_sets) + + return image_file_sets + +def save_figure(fig, image_name, image_set_name, image_dir, sizes, image_sets, scalew=1, scaleh=1, ext='jpg'): + plt.figure(fig.number) + + if image_set_name not in image_sets: + image_sets[image_set_name] = { size_name: [] for size_name in sizes } + + for size_name, size in iteritems(sizes): + fig.set_size_inches(size*scalew, size*scaleh) + + image_file = os.path.join(image_dir, "%s_%s.%s" % (image_name, size_name, ext)) + + plt.savefig(image_file, bbox_inches="tight") + + image_sets[image_set_name][size_name].append(image_file) + + plt.close() + + +def plot_images(ephys_roi_result, image_dir, sizes, image_sets): + wkfs = [ f for f in ephys_roi_result['well_known_files'] if f['filename'].endswith('tif') ] + + paths = [ os.path.join(f['storage_directory'], f['filename']) for f in wkfs ] + + paths = [ lims_utilities.safe_system_path(p) for p in paths ] + + image_set_name = "images" + image_sets[image_set_name] = { size_name: [] for size_name in sizes } + + for i, path in enumerate(paths): + image_data = plt.imread(path) + image_data = np.array(image_data, dtype=np.float32) + + vmin = image_data.min() + vmax = image_data.max() + + image_data = np.array((image_data - vmin) / (vmax - vmin) * 255.0, dtype=np.uint8) + + for size_name, size in iteritems(sizes): + if size: + s = image_data.shape + skip = int(s[0] / size) + sdata = image_data[::skip, ::skip] + else: + sdata = image_data + + + filename = os.path.join(image_dir, "image_%d_%s.jpg" % (i, size_name)) + scipy.misc.imsave(filename, sdata) + + image_sets['images'][size_name].append(filename) + + +def plot_subthreshold_long_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): + lsq_sweeps = cell_features["long_squares"]["sweeps"] + sub_sweeps = cell_features["long_squares"]["subthreshold_sweeps"] + tau_sweeps = cell_features["long_squares"]["subthreshold_membrane_property_sweeps"] + + # 0a - Plot VI curve and linear fit, along with vrest + x = np.array([ s['stim_amp'] for s in sub_sweeps ]) + y = np.array([ s['peak_deflect'][0] for s in sub_sweeps ]) + i = np.array([ s['stim_amp'] for s in tau_sweeps ]) + + fig = plt.figure() + plt.scatter(x, y, color='black') + plt.plot([x.min(), x.max()], [lims_features["vrest"], lims_features["vrest"]], color="blue", linewidth=2) + plt.plot(i, i * 1e-3 * lims_features["ri"] + lims_features["vrest"], color="red", linewidth=2) + plt.xlabel("pA") + plt.ylabel("mV") + plt.title("ri = {:.1f}, vrest = {:.1f}".format(lims_features["ri"], lims_features["vrest"])) + plt.tight_layout() + + save_figure(fig, 'VI_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) + + # 0b - Plot tau curve and average + fig = plt.figure() + x = np.array([ s['stim_amp'] for s in tau_sweeps ]) + y = np.array([ s['tau'] for s in tau_sweeps ]) + plt.scatter(x, y, color='black') + i = np.array([ s['stim_amp'] for s in tau_sweeps ]) + plt.plot([i.min(), i.max()], [cell_features["long_squares"]["tau"], cell_features["long_squares"]["tau"]], color="red", linewidth=2) + plt.xlabel("pA") + ylim = plt.ylim() + plt.ylim(0, ylim[1]) + plt.ylabel("tau (s)") + plt.tight_layout() + + + save_figure(fig, 'tau_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) + + subthresh_dict = {s['id']:s for s in tau_sweeps} + + # 0c - Plot the subthreshold squares + tau_sweeps = [ s['id'] for s in tau_sweeps ] + tau_figs = [ plt.figure() for i in range(len(tau_sweeps)) ] + + for index, s in enumerate(tau_sweeps): + v, i, t, r, dt = load_experiment(nwb_file, s) + + plt.figure(tau_figs[index].number) + + plt.plot(t, v, color="black") + + if index == 0: + min_y, max_y = plt.ylim() + else: + ylims = plt.ylim() + if min_y > ylims[0]: + min_y = ylims[0] + if max_y < ylims[1]: + max_y = ylims[1] + + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) + peak_idx = subthresh_dict[s]['peak_deflect'][1] + peak_t = peak_idx*dt + plt.scatter([peak_t], [subthresh_dict[s]['peak_deflect'][0]], color='red', zorder=10) + popt = ft.fit_membrane_time_constant(v, t, stim_start, peak_t) + plt.title(str(s)) + plt.plot(t[start_idx:peak_idx], exp_curve(t[start_idx:peak_idx] - t[start_idx], *popt), color='blue') + + + for index, s in enumerate(tau_sweeps): + plt.figure(tau_figs[index].number) + plt.ylim(min_y, max_y) + plt.tight_layout() + + for index, tau_fig in enumerate(tau_figs): + save_figure(tau_figs[index], 'tau_%d' % index, 'subthreshold_long_squares', image_dir, sizes, cell_image_files) + +def plot_short_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): + repeat_amp = cell_features["short_squares"].get("stimulus_amplitude", None) + + if repeat_amp is not None: + short_square_sweep_nums = [ s['id'] for s in cell_features["short_squares"]["common_amp_sweeps"] ] + + figs = plot_single_ap_values(nwb_file, short_square_sweep_nums, + lims_features, sweep_features, cell_features, + "short_square") + + for index, fig in enumerate(figs): + save_figure(fig, 'short_squares_%d' % index, 'short_squares', image_dir, sizes, cell_image_files) + + fig = plot_instantaneous_threshold_thumbnail(nwb_file, short_square_sweep_nums, + cell_features, lims_features, sweep_features) + + save_figure(fig, 'instantaneous_threshold_thumbnail', 'short_squares', image_dir, sizes, cell_image_files) + + + else: + logging.warning("No short square figures to plot.") + + +def plot_instantaneous_threshold_thumbnail(nwb_file, sweep_numbers, cell_features, lims_features, sweep_features, color='red'): + min_sweep_number = None + for sn in sorted(sweep_numbers): + spikes = get_spikes(sweep_features, sn) + + if len(spikes) > 0: + min_sweep_number = sn if min_sweep_number is None else min(min_sweep_number, sn) + + fig = plt.figure(frameon=False) + ax = plt.Axes(fig, [0., 0., 1., 1.]) + ax.set_axis_off() + fig.add_axes(ax) + ax.set_yticklabels([]) + ax.set_xticklabels([]) + ax.set_xlabel('') + ax.set_ylabel('') + + v, i, t, r, dt = load_experiment(nwb_file, sn) + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + + tstart = stim_start - 0.002 + tend = stim_start + stim_dur + 0.005 + tscale = 0.005 + + plt.plot(t, v, linewidth=1, color=color) + + plt.ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) + plt.xlim(tstart, tend) + + return fig + + +def plot_ramp_figures(nwb_file, cell_specimen, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): + sweeps = cell_specimen['ephys_sweeps'] + ramps_sweeps = [ s["sweep_number"] for s in sweeps if s["workflow_state"].endswith("passed") and s["ephys_stimulus"]["description"][:10] == "C1RP25PR1S"] + + figs = [] + if len(ramps_sweeps) > 0: + figs = plot_single_ap_values(nwb_file, ramps_sweeps, lims_features, sweep_features, cell_features, "ramp") + + for index, fig in enumerate(figs): + save_figure(fig, 'ramps_%d' % index, 'ramps', image_dir, sizes, cell_image_files) + +def plot_rheo_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): + rheo_sweeps = [ lims_features["rheobase_sweep_num"] ] + figs = plot_single_ap_values(nwb_file, rheo_sweeps, lims_features, sweep_features, cell_features, "long_square") + + for index, fig in enumerate(figs): + save_figure(fig, 'rheo_%d' % index, 'rheo', image_dir, sizes, cell_image_files) + +def plot_hero_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): + fig = plt.figure() + v, i, t, r, dt = load_experiment(nwb_file, int(lims_features["thumbnail_sweep_num"])) + plt.plot(t, v, color='black') + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) + plt.ylim(-110, 50) + spike_times = [spk['threshold_t'] for spk in get_spikes(sweep_features, lims_features["thumbnail_sweep_num"])] + isis = np.diff(np.array(spike_times)) + plt.title("thumbnail {:d}, amp = {:.1f}".format(lims_features["thumbnail_sweep_num"], stim_amp)) + plt.tight_layout() + + save_figure(fig, 'thumbnail_0', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) + + fig = plt.figure() + plt.plot(range(len(isis)), isis) + plt.ylabel("ISI (ms)") + if lims_features.get("adaptation", None) is not None: + plt.title("adapt = {:.3g}".format(lims_features["adaptation"])) + else: + plt.title("adapt = not defined") + + for k in ["has_delay", "has_burst", "has_pause"]: + if lims_features.get(k, None) is None: + lims_features[k] = False + + plt.tight_layout() + save_figure(fig, 'thumbnail_1', 'thumbnail', image_dir, sizes, cell_image_files) + + yvals = [ + float(lims_features["has_delay"]), + float(lims_features["has_burst"]), + float(lims_features["has_pause"]), + ] + xvals = range(len(yvals)) + + fig = plt.figure() + plt.scatter(xvals, yvals, color='red') + plt.xticks(xvals, ['Delay', 'Burst', 'Pause']) + plt.title("flags") + plt.tight_layout() + + save_figure(fig, 'thumbnail_2', 'thumbnail', image_dir, sizes, cell_image_files) + + summary_fig = plot_long_square_summary(nwb_file, cell_features, lims_features, sweep_features) + save_figure(summary_fig, 'ephys_summary', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) + + +def plot_long_square_summary(nwb_file, cell_features, lims_features, sweep_features): + long_square_sweeps = cell_features['long_squares']['sweeps'] + long_square_sweep_numbers = [ int(s['id']) for s in long_square_sweeps ] + + thumbnail_summary_fig = plot_sweep_set_summary(nwb_file, int(lims_features['thumbnail_sweep_num']), long_square_sweep_numbers) + plt.figure(thumbnail_summary_fig.number) + + return thumbnail_summary_fig + + +def plot_fi_curve_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): + fig = plt.figure() + fi_sorted = sorted(cell_features["long_squares"]["spiking_sweeps"], key=lambda s:s['stim_amp']) + x = [d['stim_amp'] for d in fi_sorted] + y = [d['avg_rate'] for d in fi_sorted] + last_zero_idx = np.nonzero(y)[0][0] - 1 + plt.scatter(x, y, color='black') + plt.plot(x[last_zero_idx:], cell_features["long_squares"]["fi_fit_slope"] * (np.array(x[last_zero_idx:]) - x[last_zero_idx]), color='red') + plt.xlabel("pA") + plt.ylabel("spikes/sec") + plt.title("slope = {:.3g}".format(lims_features["f_i_curve_slope"])) + rheo_hero_sweeps = [int(lims_features["rheobase_sweep_num"]), int(lims_features["thumbnail_sweep_num"])] + rheo_hero_x = [] + for s in rheo_hero_sweeps: + v, i, t, r, dt = load_experiment(nwb_file, s) + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + rheo_hero_x.append(stim_amp) + rheo_hero_y = [ len(get_spikes(sweep_features, s)) for s in rheo_hero_sweeps ] + plt.scatter(rheo_hero_x, rheo_hero_y, zorder=20) + plt.tight_layout() + + save_figure(fig, 'fi_curve', 'fi_curve', image_dir, sizes, cell_image_files, scalew=2) + +def plot_sag_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): + fig = plt.figure() + for d in cell_features["long_squares"]["subthreshold_sweeps"]: + if d['peak_deflect'][0] == lims_features["vm_for_sag"]: + v, i, t, r, dt = load_experiment(nwb_file, int(d['id'])) + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + plt.plot(t, v, color='black') + plt.scatter(d['peak_deflect'][1], d['peak_deflect'][0], color='red', zorder=10) + #plt.plot([stim_start + stim_dur - 0.1, stim_start + stim_dur], [d['steady'], d['steady']], color='red', zorder=10) + plt.xlim(stim_start - 0.25, stim_start + stim_dur + 0.25) + plt.title("sag = {:.3g}".format(lims_features['sag'])) + plt.tight_layout() + + save_figure(fig, 'sag', 'sag', image_dir, sizes, cell_image_files, scalew=2) + +def mask_nulls(data): + data[0, np.equal(data[0,:], None) | np.equal(data[0,:],0)] = np.nan + +def plot_sweep_value_figures(cell_specimen, image_dir, sizes, cell_image_files): + sweeps = sorted(cell_specimen['ephys_sweeps'], key=lambda s: s['sweep_number'] ) + + # plot bridge balance + data = np.array([ [ s['bridge_balance_mohm'], s['sweep_number'] ] for s in sweeps ]).T + mask_nulls(data) + + fig = plt.figure() + plt.title('bridge balance') + plt.plot(data[1,:], data[0,:], marker='.') + + save_figure(fig, 'bridge_balance', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) + + # plot pre_vm_mv, no blowout sweep + data = np.array([ [ s['pre_vm_mv'], s['sweep_number'] ] + for s in sweeps + if not s['ephys_stimulus']['description'].startswith('EXTPBLWOUT')]).T + mask_nulls(data) + + fig = plt.figure() + plt.title('pre vm') + plt.plot(data[1,:], data[0,:], marker='.') + + save_figure(fig, 'pre_vm_mv', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) + + # plot bias current + data = np.array([ [ s['leak_pa'], s['sweep_number'] ] for s in sweeps ]).T + mask_nulls(data) + + fig = plt.figure() + plt.title('leak') + plt.plot(data[1,:], data[0,:], marker='.') + + save_figure(fig, 'leak', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) + +def plot_cell_figures(nwb_file, ephys_roi_result, image_dir, sizes): + + cell_image_files = {} + + plt.style.use('ggplot') + + cell_specimen = ephys_roi_result["specimens"][0] + cell_features = cell_specimen["cell_ephys_features"] + lims_features = cell_specimen["ephys_features"][0] + sweep_features = cell_specimen["sweep_ephys_features"] + + logging.info("saving sweep feature figures") + plot_sweep_value_figures(cell_specimen, image_dir, sizes, cell_image_files) + + logging.info("saving tau and vi figs") + plot_subthreshold_long_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving short square figs") + plot_short_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving ramps") + plot_ramp_figures(nwb_file, cell_specimen, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving rheo figs") + plot_rheo_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving thumbnail figs") + plot_hero_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving fi curve figs") + plot_fi_curve_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving sag figs") + plot_sag_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) + + return cell_image_files + +def plot_sweep_set_summary(nwb_file, highlight_sweep_number, sweep_numbers, + highlight_color='#0779BE', background_color='#dddddd'): + + fig = plt.figure(frameon=False) + ax = plt.Axes(fig, [0., 0., 1., 1.]) + ax.set_axis_off() + fig.add_axes(ax) + ax.set_yticklabels([]) + ax.set_xticklabels([]) + ax.set_xlabel('') + ax.set_ylabel('') + + for sn in sweep_numbers: + v, i, t, r, dt = load_experiment(nwb_file, sn) + ax.plot(t, v, linewidth=0.5, color=background_color) + + v, i, t, r, dt = load_experiment(nwb_file, highlight_sweep_number) + plt.plot(t, v, linewidth=1, color=highlight_color) + + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + + tstart = stim_start - 0.05 + tend = stim_start + stim_dur + 0.25 + + ax.set_ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) + ax.set_xlim(tstart, tend) + + return fig + +def make_sweep_html(sweep_files, file_name): + html = "<html><body>" + html += "<a href='index.html'>Cell QC Figures</a>" + + html += "<p>page created at: %s</p>" % get_time_string() + + html += "<div style='position:absolute;width:50%;left:0;top:40'>" + if 'test_pulses' in sweep_files: + for small_img, large_img in zip(sweep_files['test_pulses']['small'], + sweep_files['test_pulses']['large']): + html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), + os.path.basename(small_img) ) + html += "</div>" + + html += "<div style='position:absolute;width:50%;right:0;top:40'>" + if 'experiments' in sweep_files: + for small_img, large_img in zip(sweep_files['experiments']['small'], + sweep_files['experiments']['large']): + html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), + os.path.basename(small_img) ) + html += "</div>" + + html += "</body></html>" + + with open(file_name, 'w') as f: + f.write(html) + +def make_cell_html(image_files, ephys_roi_result, file_name, relative_sweep_link): + + html = "<html><body>" + + specimen = ephys_roi_result['specimens'][0] + + html += "<h3>Specimen %d: %s</h3>" % ( specimen['id'], specimen['name'] ) + html += "<p>page created at: %s</p>" % get_time_string() + + if relative_sweep_link: + html += "<p><a href='sweep.html' target='_blank'> Sweep QC Figures </a></p>" + else: + sweep_qc_link = '/'.join([ephys_roi_result['storage_directory'], 'qc_figures', 'sweep.html']) + sweep_qc_link = lims_utilities.safe_system_path(sweep_qc_link) + html += "<p><a href='%s' target='_blank'> Sweep QC Figures </a></p>" % sweep_qc_link + + fields_to_show = [ 'electrode_0_pa', 'seal_gohm', 'initial_access_resistance_mohm', 'input_resistance_mohm' ] + + html += "<table>" + for field in fields_to_show: + html += "<tr><td>%s</td><td>%s</td></tr>" % (field, ephys_roi_result.get(field,None)) + html += "</table>" + + for image_file_set_name in image_files: + html += "<h3>%s</h3>" % image_file_set_name + + image_set_files = image_files[image_file_set_name] + + for small_img, large_img in zip(image_set_files['small'], image_set_files['large']): + html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), + os.path.basename(small_img) ) + html += ("</body></html>") + + with open(file_name, 'w') as f: + f.write(html) + +def make_sweep_page(nwb_file, ephys_roi_result, working_dir): + sizes = { 'small': 2.0, 'large': 6.0 } + + sweep_files = plot_sweep_figures(nwb_file, ephys_roi_result, working_dir, sizes) + make_sweep_html(sweep_files, + os.path.join(working_dir, 'sweep.html')) + +def make_cell_page(nwb_file, ephys_roi_result, working_dir, save_cell_plots=True): + + if save_cell_plots: + sizes = { 'small': 2.0, 'large': 6.0 } + cell_files = plot_cell_figures(nwb_file, ephys_roi_result, working_dir, sizes) + else: + cell_files = {} + + logging.info("saving images") + sizes = { 'small': 200, 'large': None } + plot_images(ephys_roi_result, working_dir, sizes, cell_files) + + sweep_page = os.path.join(working_dir, 'sweep.html') + relative_sweep_link = os.path.exists(sweep_page) + + if not relative_sweep_link: + logging.info("sweep page doesn't exist, point to production sweep page") + + make_cell_html(cell_files, ephys_roi_result, + os.path.join(working_dir, 'index.html'), + relative_sweep_link) + +def exp_curve(x, a, inv_tau, y0): + ''' Function used for tau curve fitting ''' + return y0 + a * np.exp(-inv_tau * x) + + +def main(): + parser = argparse.ArgumentParser(description='analyze specimens for cell-wide features') + parser.add_argument('nwb_file') + parser.add_argument('feature_json') + parser.add_argument('--output_directory', default='.') + parser.add_argument('--no-sweep-page', action='store_false', dest='sweep_page') + parser.add_argument('--no-cell-page', action='store_false', dest='cell_page') + parser.add_argument('--log_level') + + + args = parser.parse_args() + + if args.log_level: + logging.getLogger().setLevel(args.log_level) + + ephys_roi_result = json_utilities.read(args.feature_json) + + if args.sweep_page: + logging.debug("making sweep page") + make_sweep_page(args.nwb_file, ephys_roi_result, args.output_directory) + + if args.cell_page: + logging.debug("making cell page") + make_cell_page(args.nwb_file, ephys_roi_result, args.output_directory, True) + + + +if __name__ == '__main__': main() diff --git a/internal/ephys/plot_qc_figures3.py b/internal/ephys/plot_qc_figures3.py new file mode 100644 index 0000000000..1bb174d747 --- /dev/null +++ b/internal/ephys/plot_qc_figures3.py @@ -0,0 +1,839 @@ +import matplotlib + +matplotlib.use('agg') + +import logging + +import allensdk.internal.core.lims_utilities as lims_utilities +import allensdk.core.json_utilities as json_utilities + +from allensdk.core.nwb_data_set import NwbDataSet +import allensdk.ephys.ephys_features as ft +from allensdk.ephys.extract_cell_features import get_square_stim_characteristics, get_ramp_stim_characteristics, get_stim_characteristics + +import sys +import argparse +import os +import json +import h5py +import numpy as np +from six import iteritems + +from scipy.optimize import curve_fit +import scipy.signal as sg +import scipy.misc + +import datetime +import matplotlib.pyplot as plt +#import seaborn as sns + +AXIS_Y_RANGE = [ -110, 60 ] + +def get_time_string(): + return datetime.datetime.now().strftime("%I:%M%p %B %d, %Y") + +def get_spikes(sweep_features, sweep_number): + return get_features(sweep_features, sweep_number)["spikes"] + +def get_features(sweep_features, sweep_number): + try: + return sweep_features[int(sweep_number)] + except KeyError: + return sweep_features[str(sweep_number)] + +def load_experiment(file_name, sweep_number): + ds = NwbDataSet(file_name) + sweep = ds.get_sweep(sweep_number) + + r = sweep['index_range'] + v = sweep['response'] * 1e3 + i = sweep['stimulus'] * 1e12 + dt = 1.0 / sweep['sampling_rate'] + t = np.arange(0, len(v)) * dt + + return (v, i, t, r, dt) + +def plot_single_ap_values(nwb_file, sweep_numbers, rheo_features, sweep_features, cell_features, type_name): + figs = [ plt.figure() for f in range(3+len(sweep_numbers)) ] + + v, i, t, r, dt = load_experiment(nwb_file, sweep_numbers[0]) + if type_name == "short_square" or type_name == "long_square": + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + elif type_name == "ramp": + stim_start, start_idx = get_ramp_stim_characteristics(i, t) + + gen_features = ["threshold", "peak", "trough", "fast_trough", "slow_trough"] + voltage_features = ["threshold_v", "peak_v", "trough_v", "fast_trough_v", "slow_trough_v"] + time_features = ["threshold_t", "peak_t", "trough_t", "fast_trough_t", "slow_trough_t"] + + for sn in sweep_numbers: + spikes = get_spikes(sweep_features, sn) + + if (len(spikes) < 1): + logging.warning("no spikes in sweep %d" % sn) + continue + + if type_name != "long_square": + voltages = [spikes[0][f] for f in voltage_features] + times = [spikes[0][f] for f in time_features] + else: + rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] + rheo_spike = get_spikes(sweep_features, rheo_sn)[0] + voltages = [ rheo_spike[f] for f in voltage_features] + times = [ rheo_spike[f] for f in time_features] + + plt.figure(figs[0].number) + plt.scatter(range(len(voltages)), voltages, color='gray') + plt.tight_layout() + + + plt.figure(figs[1].number) + plt.scatter(range(len(times)), times, color='gray') + plt.tight_layout() + + plt.figure(figs[2].number) + plt.scatter([0], [spikes[0]['upstroke'] / (-spikes[0]['downstroke'])], color='gray') + plt.tight_layout() + + + plt.figure(figs[0].number) + + yvals = [float(rheo_features[k + "_v_" + type_name]) for k in gen_features if rheo_features[k + "_v_" + type_name] is not None] + xvals = range(len(yvals)) + + plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) + plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) + plt.title(type_name + ": voltages") + + plt.figure(figs[1].number) + yvals = [float(rheo_features[k + "_t_" + type_name]) for k in gen_features if rheo_features[k + "_t_" + type_name] is not None] + xvals = range(len(yvals)) + plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) + plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) + plt.title(type_name + ": times") + + plt.figure(figs[2].number) + if rheo_features["upstroke_downstroke_ratio_" + type_name] is not None: + plt.scatter([0], [float(rheo_features["upstroke_downstroke_ratio_" + type_name])], color='blue', marker='_', s=40, zorder=100) + plt.xticks([]) + plt.title(type_name + ": up/down") + + for index, sn in enumerate(sweep_numbers): + plt.figure(figs[3 + index].number) + + v, i, t, r, dt = load_experiment(nwb_file, sn) + plt.plot(t, v, color='black') + plt.title(str(sn)) + + spikes = get_spikes(sweep_features, sn) + + nspikes = len(spikes) + + if type_name != "long_square" and nspikes: + if nspikes == 0: + logging.warning("no spikes in sweep %d" % sn) + continue + + voltages = [spikes[0][f] for f in voltage_features] + times = [spikes[0][f] for f in time_features] + else: + rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] + rheo_spike = get_spikes(sweep_features, rheo_sn)[0] + voltages = [ rheo_spike[f] for f in voltage_features ] + times = [ rheo_spike[f] for f in time_features ] + + plt.scatter(times, voltages, color='red', zorder=20) + + + delta_v = 5.0 + if nspikes: + plt.plot([spikes[0]['upstroke_t'] - 1e-3 * (delta_v / spikes[0]['upstroke']), + spikes[0]['upstroke_t'] + 1e-3 * (delta_v / spikes[0]['upstroke'])], + [spikes[0]['upstroke_v'] - delta_v, spikes[0]['upstroke_v'] + delta_v], color='red') + + plt.plot([spikes[0]['downstroke_t'] - 1e-3 * (delta_v / spikes[0]['downstroke']), + spikes[0]['downstroke_t'] + 1e-3 * (delta_v / spikes[0]['downstroke'])], + [spikes[0]['downstroke_v'] - delta_v, spikes[0]['downstroke_v'] + delta_v], color='red') + + if type_name == "ramp": + if nspikes: + plt.xlim(spikes[0]["threshold_t"] - 0.002, spikes[0]["fast_trough_t"] + 0.01) + elif type_name == "short_square": + plt.xlim(stim_start - 0.002, stim_start + stim_dur + 0.01) + elif type_name == "long_square": + plt.xlim(times[0]- 0.002, times[-2] + 0.002) + + plt.tight_layout() + + + return figs + +#def plot_sweep_figures(nwb_file, ephys_roi_result, image_dir, sizes): +def plot_sweep_figures(nwb_file, sweep_data, image_dir, sizes): +# try: +# sweeps = ephys_roi_result["specimens"][0]["ephys_sweeps"] +# except: +# sweeps = ephys_roi_result["specimens"]["ephys_sweeps"] + vclamp_sweep_numbers = sorted([ s['sweep_number'] for s in sweep_data if s['stimulus_units'] == 'Amps' ]) + + image_file_sets = {} + + tp_set = [] + exp_set = [] + + prev_sweep_number = None + + tp_len = 0.035 + tp_steps = int(tp_len * 200000) + + b, a = sg.bessel(4, 0.1, "low") + + for i, sweep_number in enumerate(vclamp_sweep_numbers): + logging.info("plotting sweep %d" % sweep_number) + if i == 0: + v_init, i_init, t_init, r_init, dt_init = load_experiment(nwb_file, sweep_number) + + tp_fig = plt.figure() + axTP = plt.gca() + axTP.set_yticklabels([]) + axTP.set_xticklabels([]) + axTP.set_xlabel(str(sweep_number)) + axTP.set_ylabel('') + xTP = t_init[0:tp_steps] + yTP = v_init[0:tp_steps] + axTP.plot(xTP, yTP, linewidth=1) + axTP.set_xlim(0, tp_len) +# sns.despine() + + exp_fig = plt.figure() + axDP = plt.gca() + axDP.set_yticklabels([]) + axDP.set_xticklabels([]) + axDP.set_xlabel(str(sweep_number)) + axDP.set_ylabel('') + v_exp = v_init[r_init[0]:] + t_exp = t_init[r_init[0]:] + yDP = sg.filtfilt(b, a, v_exp, axis=0) + xDP = t_exp + baseline = yDP[5000:9000] + baselineMean = np.mean(baseline) + baselineV = (np.ones(len(xDP))) * baselineMean + axDP.plot(xDP, yDP, linewidth=1) + axDP.plot(xDP, baselineV, linewidth=1) + axDP.set_xlim(t_exp[0], t_exp[-1]) +# sns.despine() + + v_prev, i_prev, t_prev, r_prev = v_init, i_init, t_init, r_init + + else: + v, i, t, r, dt = load_experiment(nwb_file, sweep_number) + + tp_fig = plt.figure() + axTP = plt.gca() + axTP.set_yticklabels([]) + axTP.set_xticklabels([]) + axTP.set_xlabel(str(sweep_number)) + axTP.set_ylabel('') + yTP = v[:tp_steps] + xTP = t[:tp_steps] + TPBL = np.mean(yTP[0:100]) + yTPN = yTP - TPBL + yTPp = v_prev[:tp_steps] + TPpBL = np.mean(yTPp[0:100]) + yTPpN = yTPp - TPpBL + yTPi = v_init[:tp_steps] + TPiBL = np.mean(yTPi[0:100]) + yTPiN = yTPi - TPiBL + axTP.plot(xTP, yTPiN, linewidth=1) + axTP.plot(xTP, yTPpN, linewidth=1) + axTP.plot(xTP, yTPN, linewidth=1) + axTP.set_xlim(0, tp_len) +# sns.despine() + + exp_fig = plt.figure() + axDP = plt.gca() + axDP.set_yticklabels([]) + axDP.set_xticklabels([]) + axDP.set_xlabel(str(sweep_number)) + axDP.set_ylabel('') + v_exp = v[r[0]:] + t_exp = t[r[0]:] + yDP = sg.filtfilt(b, a, v_exp, axis=0) + xDP = t_exp + baseline = yDP[5000:9000] + baselineMean = np.mean(baseline) + baselineV = (np.ones(len(xDP))) * baselineMean + axDP.plot(xDP, yDP, linewidth=1) + axDP.plot(xDP, baselineV, linewidth=1) + axDP.set_xlim(t_exp[0], t_exp[-1]) +# sns.despine() + + v_prev, i_prev, t_prev, r_prev = v, i, t, r + + prev_sweep_number = sweep_number + + save_figure(tp_fig, 'test_pulse_%d' % sweep_number, 'test_pulses', image_dir, sizes, image_file_sets) + save_figure(exp_fig, 'experiment_%d' % sweep_number, 'experiments', image_dir, sizes, image_file_sets) + + return image_file_sets + +def save_figure(fig, image_name, image_set_name, image_dir, sizes, image_sets, scalew=1, scaleh=1, ext='jpg'): + plt.figure(fig.number) + + if image_set_name not in image_sets: + image_sets[image_set_name] = { size_name: [] for size_name in sizes } + + for size_name, size in iteritems(sizes): + fig.set_size_inches(size*scalew, size*scaleh) + + image_file = os.path.join(image_dir, "%s_%s.%s" % (image_name, size_name, ext)) + + plt.savefig(image_file, bbox_inches="tight") + + image_sets[image_set_name][size_name].append(image_file) + + plt.close() + + +def plot_images(well_known_files, image_dir, sizes, image_sets): + wkfs = [ f for f in well_known_files if f['filename'].endswith('tif') ] + + paths = [ os.path.join(f['storage_directory'], f['filename']) for f in wkfs ] + + paths = [ lims_utilities.safe_system_path(p) for p in paths ] + + image_set_name = "images" + image_sets[image_set_name] = { size_name: [] for size_name in sizes } + + for i, path in enumerate(paths): + image_data = plt.imread(path) + image_data = np.array(image_data, dtype=np.float32) + + vmin = image_data.min() + vmax = image_data.max() + + image_data = np.array((image_data - vmin) / (vmax - vmin) * 255.0, dtype=np.uint8) + + for size_name, size in iteritems(sizes): + if size: + s = image_data.shape + skip = int(s[0] / size) + sdata = image_data[::skip, ::skip] + else: + sdata = image_data + + + filename = os.path.join(image_dir, "image_%d_%s.jpg" % (i, size_name)) + scipy.misc.imsave(filename, sdata) + + image_sets['images'][size_name].append(filename) + + +def plot_subthreshold_long_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): + lsq_sweeps = cell_features["long_squares"]["sweeps"] + sub_sweeps = cell_features["long_squares"]["subthreshold_sweeps"] + tau_sweeps = cell_features["long_squares"]["subthreshold_membrane_property_sweeps"] + + # 0a - Plot VI curve and linear fit, along with vrest + x = np.array([ s['stim_amp'] for s in sub_sweeps ]) + y = np.array([ s['peak_deflect'][0] for s in sub_sweeps ]) + i = np.array([ s['stim_amp'] for s in tau_sweeps ]) + + fig = plt.figure() + plt.scatter(x, y, color='black') + plt.plot([x.min(), x.max()], [rheo_features["vrest"], rheo_features["vrest"]], color="blue", linewidth=2) + plt.plot(i, i * 1e-3 * rheo_features["ri"] + rheo_features["vrest"], color="red", linewidth=2) + plt.xlabel("pA") + plt.ylabel("mV") + plt.title("ri = {:.1f}, vrest = {:.1f}".format(rheo_features["ri"], rheo_features["vrest"])) + plt.tight_layout() + + save_figure(fig, 'VI_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) + + # 0b - Plot tau curve and average + fig = plt.figure() + x = np.array([ s['stim_amp'] for s in tau_sweeps ]) + y = np.array([ s['tau'] for s in tau_sweeps ]) + plt.scatter(x, y, color='black') + i = np.array([ s['stim_amp'] for s in tau_sweeps ]) + plt.plot([i.min(), i.max()], [cell_features["long_squares"]["tau"], cell_features["long_squares"]["tau"]], color="red", linewidth=2) + plt.xlabel("pA") + ylim = plt.ylim() + plt.ylim(0, ylim[1]) + plt.ylabel("tau (s)") + plt.tight_layout() + + + save_figure(fig, 'tau_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) + + subthresh_dict = {s['id']:s for s in tau_sweeps} + + # 0c - Plot the subthreshold squares + tau_sweeps = [ s['id'] for s in tau_sweeps ] + tau_figs = [ plt.figure() for i in range(len(tau_sweeps)) ] + + for index, s in enumerate(tau_sweeps): + v, i, t, r, dt = load_experiment(nwb_file, s) + + plt.figure(tau_figs[index].number) + + plt.plot(t, v, color="black") + + if index == 0: + min_y, max_y = plt.ylim() + else: + ylims = plt.ylim() + if min_y > ylims[0]: + min_y = ylims[0] + if max_y < ylims[1]: + max_y = ylims[1] + + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) + peak_idx = subthresh_dict[s]['peak_deflect'][1] + peak_t = peak_idx*dt + plt.scatter([peak_t], [subthresh_dict[s]['peak_deflect'][0]], color='red', zorder=10) + popt = ft.fit_membrane_time_constant(v, t, stim_start, peak_t) + plt.title(str(s)) + plt.plot(t[start_idx:peak_idx], exp_curve(t[start_idx:peak_idx] - t[start_idx], *popt), color='blue') + + + for index, s in enumerate(tau_sweeps): + plt.figure(tau_figs[index].number) + plt.ylim(min_y, max_y) + plt.tight_layout() + + for index, tau_fig in enumerate(tau_figs): + save_figure(tau_figs[index], 'tau_%d' % index, 'subthreshold_long_squares', image_dir, sizes, cell_image_files) + +def plot_short_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): + repeat_amp = cell_features["short_squares"].get("stimulus_amplitude", None) + + if repeat_amp is not None: + short_square_sweep_nums = [ s['id'] for s in cell_features["short_squares"]["common_amp_sweeps"] ] + + figs = plot_single_ap_values(nwb_file, short_square_sweep_nums, + rheo_features, sweep_features, cell_features, + "short_square") + + for index, fig in enumerate(figs): + save_figure(fig, 'short_squares_%d' % index, 'short_squares', image_dir, sizes, cell_image_files) + + fig = plot_instantaneous_threshold_thumbnail(nwb_file, short_square_sweep_nums, + cell_features, rheo_features, sweep_features) + + save_figure(fig, 'instantaneous_threshold_thumbnail', 'short_squares', image_dir, sizes, cell_image_files) + + + else: + logging.warning("No short square figures to plot.") + + +def plot_instantaneous_threshold_thumbnail(nwb_file, sweep_numbers, cell_features, rheo_features, sweep_features, color='red'): + min_sweep_number = None + for sn in sorted(sweep_numbers): + spikes = get_spikes(sweep_features, sn) + + if len(spikes) > 0: + min_sweep_number = sn if min_sweep_number is None else min(min_sweep_number, sn) + + fig = plt.figure(frameon=False) + ax = plt.Axes(fig, [0., 0., 1., 1.]) + ax.set_axis_off() + fig.add_axes(ax) + ax.set_yticklabels([]) + ax.set_xticklabels([]) + ax.set_xlabel('') + ax.set_ylabel('') + + v, i, t, r, dt = load_experiment(nwb_file, sn) + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + + tstart = stim_start - 0.002 + tend = stim_start + stim_dur + 0.005 + tscale = 0.005 + + plt.plot(t, v, linewidth=1, color=color) + + plt.ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) + plt.xlim(tstart, tend) + + return fig + + +def plot_ramp_figures(nwb_file, sweep_info, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): + sweeps = sweep_info + ramps_sweeps = [ s["sweep_number"] for s in sweeps if s["workflow_state"].endswith("passed") and s["ephys_stimulus"]["description"][:10] == "C1RP25PR1S"] + + figs = [] + if len(ramps_sweeps) > 0: + figs = plot_single_ap_values(nwb_file, ramps_sweeps, rheo_features, sweep_features, cell_features, "ramp") + + for index, fig in enumerate(figs): + save_figure(fig, 'ramps_%d' % index, 'ramps', image_dir, sizes, cell_image_files) + +def plot_rheo_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): + rheo_sweeps = [ rheo_features["rheobase_sweep_num"] ] + figs = plot_single_ap_values(nwb_file, rheo_sweeps, rheo_features, sweep_features, cell_features, "long_square") + + for index, fig in enumerate(figs): + save_figure(fig, 'rheo_%d' % index, 'rheo', image_dir, sizes, cell_image_files) + +def plot_hero_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): + fig = plt.figure() + v, i, t, r, dt = load_experiment(nwb_file, int(rheo_features["thumbnail_sweep_num"])) + plt.plot(t, v, color='black') + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) + plt.ylim(-110, 50) + spike_times = [spk['threshold_t'] for spk in get_spikes(sweep_features, rheo_features["thumbnail_sweep_num"])] + isis = np.diff(np.array(spike_times)) + plt.title("thumbnail {:d}, amp = {:.1f}".format(rheo_features["thumbnail_sweep_num"], stim_amp)) + plt.tight_layout() + + save_figure(fig, 'thumbnail_0', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) + + fig = plt.figure() + plt.plot(range(len(isis)), isis) + plt.ylabel("ISI (ms)") + if rheo_features.get("adaptation", None) is not None: + plt.title("adapt = {:.3g}".format(rheo_features["adaptation"])) + else: + plt.title("adapt = not defined") + + for k in ["has_delay", "has_burst", "has_pause"]: + if rheo_features.get(k, None) is None: + rheo_features[k] = False + + plt.tight_layout() + save_figure(fig, 'thumbnail_1', 'thumbnail', image_dir, sizes, cell_image_files) + + yvals = [ + float(rheo_features["has_delay"]), + float(rheo_features["has_burst"]), + float(rheo_features["has_pause"]), + ] + xvals = range(len(yvals)) + + fig = plt.figure() + plt.scatter(xvals, yvals, color='red') + plt.xticks(xvals, ['Delay', 'Burst', 'Pause']) + plt.title("flags") + plt.tight_layout() + + save_figure(fig, 'thumbnail_2', 'thumbnail', image_dir, sizes, cell_image_files) + + summary_fig = plot_long_square_summary(nwb_file, cell_features, rheo_features, sweep_features) + save_figure(summary_fig, 'ephys_summary', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) + + +def plot_long_square_summary(nwb_file, cell_features, rheo_features, sweep_features): + long_square_sweeps = cell_features['long_squares']['sweeps'] + long_square_sweep_numbers = [ int(s['id']) for s in long_square_sweeps ] + + thumbnail_summary_fig = plot_sweep_set_summary(nwb_file, int(rheo_features['thumbnail_sweep_num']), long_square_sweep_numbers) + plt.figure(thumbnail_summary_fig.number) + + return thumbnail_summary_fig + + +def plot_fi_curve_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): + fig = plt.figure() + fi_sorted = sorted(cell_features["long_squares"]["spiking_sweeps"], key=lambda s:s['stim_amp']) + x = [d['stim_amp'] for d in fi_sorted] + y = [d['avg_rate'] for d in fi_sorted] + last_zero_idx = np.nonzero(y)[0][0] - 1 + plt.scatter(x, y, color='black') + plt.plot(x[last_zero_idx:], cell_features["long_squares"]["fi_fit_slope"] * (np.array(x[last_zero_idx:]) - x[last_zero_idx]), color='red') + plt.xlabel("pA") + plt.ylabel("spikes/sec") + plt.title("slope = {:.3g}".format(rheo_features["f_i_curve_slope"])) + rheo_hero_sweeps = [int(rheo_features["rheobase_sweep_num"]), int(rheo_features["thumbnail_sweep_num"])] + rheo_hero_x = [] + for s in rheo_hero_sweeps: + v, i, t, r, dt = load_experiment(nwb_file, s) + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + rheo_hero_x.append(stim_amp) + rheo_hero_y = [ len(get_spikes(sweep_features, s)) for s in rheo_hero_sweeps ] + plt.scatter(rheo_hero_x, rheo_hero_y, zorder=20) + plt.tight_layout() + + save_figure(fig, 'fi_curve', 'fi_curve', image_dir, sizes, cell_image_files, scalew=2) + +def plot_sag_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): + fig = plt.figure() + for d in cell_features["long_squares"]["subthreshold_sweeps"]: + if d['peak_deflect'][0] == rheo_features["vm_for_sag"]: + v, i, t, r, dt = load_experiment(nwb_file, int(d['id'])) + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + plt.plot(t, v, color='black') + plt.scatter(d['peak_deflect'][1], d['peak_deflect'][0], color='red', zorder=10) + #plt.plot([stim_start + stim_dur - 0.1, stim_start + stim_dur], [d['steady'], d['steady']], color='red', zorder=10) + plt.xlim(stim_start - 0.25, stim_start + stim_dur + 0.25) + plt.title("sag = {:.3g}".format(rheo_features['sag'])) + plt.tight_layout() + + save_figure(fig, 'sag', 'sag', image_dir, sizes, cell_image_files, scalew=2) + +def mask_nulls(data): + data[0, np.equal(data[0,:], None) | np.equal(data[0,:],0)] = np.nan + +def plot_sweep_value_figures(sweep_info, image_dir, sizes, cell_image_files): + sweeps = sorted(sweep_info, key=lambda s: s['sweep_number'] ) + + # plot bridge balance + data = np.array([ [ s['bridge_balance_mohm'], s['sweep_number'] ] for s in sweeps ]).T + mask_nulls(data) + + fig = plt.figure() + plt.title('bridge balance') + plt.plot(data[1,:], data[0,:], marker='.') + + save_figure(fig, 'bridge_balance', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) + + # plot pre_vm_mv, no blowout sweep + data = np.array([ [ s['pre_vm_mv'], s['sweep_number'] ] + for s in sweeps + if not s['ephys_stimulus']['description'].startswith('EXTPBLWOUT')]).T + mask_nulls(data) + + fig = plt.figure() + plt.title('pre vm') + plt.plot(data[1,:], data[0,:], marker='.') + + save_figure(fig, 'pre_vm_mv', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) + + # plot bias current + data = np.array([ [ s['leak_pa'], s['sweep_number'] ] for s in sweeps ]).T + mask_nulls(data) + + fig = plt.figure() + plt.title('leak') + plt.plot(data[1,:], data[0,:], marker='.') + + save_figure(fig, 'leak', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) + +#def plot_cell_figures(nwb_file, ephys_roi_result, image_dir, sizes): +def plot_cell_figures(nwb_file, + cell_features, + sweep_features, + rheo_features, + image_dir, + sweep_info, + sizes): + + cell_image_files = {} + + plt.style.use('ggplot') + + logging.info("saving sweep feature figures") + plot_sweep_value_figures(sweep_info, image_dir, sizes, cell_image_files) + + logging.info("saving tau and vi figs") + plot_subthreshold_long_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving short square figs") + plot_short_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving ramps") + plot_ramp_figures(nwb_file, sweep_info, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving rheo figs") + plot_rheo_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving thumbnail figs") + plot_hero_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving fi curve figs") + plot_fi_curve_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) + + logging.info("saving sag figs") + plot_sag_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) + + return cell_image_files + +def plot_sweep_set_summary(nwb_file, highlight_sweep_number, sweep_numbers, + highlight_color='#0779BE', background_color='#dddddd'): + + fig = plt.figure(frameon=False) + ax = plt.Axes(fig, [0., 0., 1., 1.]) + ax.set_axis_off() + fig.add_axes(ax) + ax.set_yticklabels([]) + ax.set_xticklabels([]) + ax.set_xlabel('') + ax.set_ylabel('') + + for sn in sweep_numbers: + v, i, t, r, dt = load_experiment(nwb_file, sn) + ax.plot(t, v, linewidth=0.5, color=background_color) + + v, i, t, r, dt = load_experiment(nwb_file, highlight_sweep_number) + plt.plot(t, v, linewidth=1, color=highlight_color) + + stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) + + tstart = stim_start - 0.05 + tend = stim_start + stim_dur + 0.25 + + ax.set_ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) + ax.set_xlim(tstart, tend) + + return fig + +def make_sweep_html(sweep_files, file_name): + html = "<html><body>" + html += "<a href='index.html'>Cell QC Figures</a>" + + html += "<p>page created at: %s</p>" % get_time_string() + + html += "<div style='position:absolute;width:50%;left:0;top:40'>" + if 'test_pulses' in sweep_files: + for small_img, large_img in zip(sweep_files['test_pulses']['small'], + sweep_files['test_pulses']['large']): + html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), + os.path.basename(small_img) ) + html += "</div>" + + html += "<div style='position:absolute;width:50%;right:0;top:40'>" + if 'experiments' in sweep_files: + for small_img, large_img in zip(sweep_files['experiments']['small'], + sweep_files['experiments']['large']): + html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), + os.path.basename(small_img) ) + html += "</div>" + + html += "</body></html>" + + with open(file_name, 'w') as f: + f.write(html) + +def make_cell_html(image_files, file_name, relative_sweep_link, specimen_info, fields): + + html = "<html><body>" + + html += "<h3>Specimen %d: %s</h3>" % ( specimen_info["id"], specimen_info["name"] ) + html += "<p>page created at: %s</p>" % get_time_string() + + if relative_sweep_link: + html += "<p><a href='sweep.html' target='_blank'> Sweep QC Figures </a></p>" + else: + sweep_qc_link = '/'.join([specimen_info['storage_directory'], 'qc_figures', 'sweep.html']) + sweep_qc_link = lims_utilities.safe_system_path(sweep_qc_link) + html += "<p><a href='%s' target='_blank'> Sweep QC Figures </a></p>" % sweep_qc_link + + fields_to_show = [ 'electrode_0_pa', 'seal_gohm', 'initial_access_resistance_mohm', 'input_resistance_mohm' ] + + html += "<table>" + for k,v in iteritems(fields): + html += "<tr><td>%s</td><td>%s</td></tr>" % (k, v) + html += "</table>" + + for image_file_set_name in image_files: + html += "<h3>%s</h3>" % image_file_set_name + + image_set_files = image_files[image_file_set_name] + + for small_img, large_img in zip(image_set_files['small'], image_set_files['large']): + html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), + os.path.basename(small_img) ) + html += ("</body></html>") + + with open(file_name, 'w') as f: + f.write(html) + +def make_sweep_page(nwb_file, working_dir, sweep_data): + sizes = { 'small': 2.0, 'large': 6.0 } + + sweep_files = plot_sweep_figures( + nwb_file=nwb_file, + sweep_data=sweep_data, + image_dir=working_dir, + sizes=sizes) + + make_sweep_html(sweep_files, + os.path.join(working_dir, 'sweep.html')) + +#def make_cell_page(nwb_file, ephys_roi_result, working_dir, save_cell_plots=True): +def make_cell_page(nwb_file, cell_features, rheo_features, sweep_features, sweep_info, well_known_files, specimen_info, working_dir, fields_to_show, save_cell_plots=True): + """ nwb_file: name of nwb file (string) + + cell_features: + + rheo_features: dict containing extracted features from rheobase sweep + + sweep_features: + + sweep_info: + + well_known_files: LIMS-output information containing graphics + file names + + working_dir: + + save_cell_plots: + + """ + + if save_cell_plots: + sizes = { 'small': 2.0, 'large': 6.0 } + cell_files = plot_cell_figures( + nwb_file = nwb_file, + cell_features = cell_features, + rheo_features = rheo_features, + sweep_features = sweep_features, + sweep_info = sweep_info, + image_dir = working_dir, + sizes = sizes) + else: + cell_files = {} + + logging.info("saving images") + sizes = { 'small': 200, 'large': None } + plot_images(well_known_files, working_dir, sizes, cell_files) + + sweep_page = os.path.join(working_dir, 'sweep.html') + relative_sweep_link = os.path.exists(sweep_page) + + if not relative_sweep_link: + logging.info("sweep page doesn't exist, point to production sweep page") + + make_cell_html(cell_files, + os.path.join(working_dir, 'index.html'), + relative_sweep_link, + specimen_info, + fields_to_show) + +def exp_curve(x, a, inv_tau, y0): + ''' Function used for tau curve fitting ''' + return y0 + a * np.exp(-inv_tau * x) + + +#def main(): +# parser = argparse.ArgumentParser(description='analyze specimens for cell-wide features') +# parser.add_argument('nwb_file') +# parser.add_argument('feature_json') +# parser.add_argument('--output_directory', default='.') +# parser.add_argument('--no-sweep-page', action='store_false', dest='sweep_page') +# parser.add_argument('--no-cell-page', action='store_false', dest='cell_page') +# parser.add_argument('--log_level') +# +# +# args = parser.parse_args() +# +# if args.log_level: +# logging.getLogger().setLevel(args.log_level) +# +# ephys_roi_result = json_utilities.read(args.feature_json) +# +# if args.sweep_page: +# logging.debug("making sweep page") +# make_sweep_page(args.nwb_file, ephys_roi_result, args.output_directory) +# +# if args.cell_page: +# logging.debug("making cell page") +# make_cell_page(args.nwb_file, ephys_roi_result, args.output_directory, True) +# +# +# +#if __name__ == '__main__': main() diff --git a/internal/model/AIC.py b/internal/model/AIC.py new file mode 100644 index 0000000000..70698b9a83 --- /dev/null +++ b/internal/model/AIC.py @@ -0,0 +1,33 @@ +import numpy as np + +""" +TODO: license +TODO: comment style +""" + +def AIC(RSS, k, n): + """ + Computes the Akaike Information Criterion. + + RSS-residual sum of squares of the fitting errors. + k - number of fitted parameters. + n - number of observations. + """ + AIC = 2 * k + n * np.log( RSS/n) + return AIC + +def AICc(RSS, k, n): + """ + Corrected AIC. formula from Wikipedia. + """ + retval = AIC(RSS, k, n) + if n-k-1 != 0: + retval += 2.0 *k* (k+1)/ (n-k-1) + return retval + +def BIC(RSS, k, n): + """ + Bayesian information criterion or Schwartz information criterion. + Formula from wikipedia. + """ + return n * np.log(RSS/n) + k * np.log(n) diff --git a/internal/model/GLM.py b/internal/model/GLM.py new file mode 100644 index 0000000000..046ca0e702 --- /dev/null +++ b/internal/model/GLM.py @@ -0,0 +1,148 @@ +import numpy as np +import numpy.fft as npft + +# TODO: license +# TODO: normalize function call names +# TODO: document functions + +def create_basis_IPSP(neye,ncos,kpeaks,ks,DTsim,t0,I_stim,nkt,flag_exp,npcut): + + kbasprs = {} + kbasprs['neye'] = neye #No of 'identity' basis vectors near time of spike + kbasprs['ncos'] = ncos #No of raised-cosines to use + kbasprs['kpeaks'] = kpeaks #Position of first and last bump + kbasprs['b'] = 0.1 #Offset for non-linear scaling + kbasprs['ks'] = ks + + gg0 = makeFitStruct_GLM(DTsim,kbasprs,nkt,flag_exp) + + #Create spike-stim with which to convolve post spike filter + spike_stim = np.zeros(np.shape(I_stim)) + for kk in range(len(t0)): + spind = int(t0[kk]) + #print int(t0[kk]), spind-190000 + spike_stim[spind]=1.0 + + ##Convolve temporal basis functions with spike-stim + c = np.zeros((len(spike_stim),ncos)) + for jj in range(ncos): + basisfilt = gg0['ktbas'][:,jj] + bconv = np.convolve(spike_stim,np.flipud(basisfilt),'full') + c[:,jj] = bconv[range(len(spike_stim))] + + basis_IPSP = c; + + return basis_IPSP, gg0 + +def makeFitStruct_GLM(dtsim,kbasprs,nkt,flag_exp): + + gg = {} + gg['k'] = [] + gg['dc'] = 0 + gg['kt'] = np.zeros((nkt,1)) + gg['ktbas'] = [] + gg['kbasprs'] = kbasprs + gg['dt'] = dtsim + + nkt = nkt + if flag_exp==0: + ktbas = makeBasis_StimKernel(kbasprs,nkt) + else: + ktbas = makeBasis_StimKernel_exp(kbasprs,nkt) + + gg['ktbas'] = ktbas + gg['k'] = gg['ktbas']*gg['kt'] + + return gg + +def makeBasis_StimKernel(kbasprs,nkt): + + neye = kbasprs['neye'] + ncos = kbasprs['ncos'] + kpeaks = kbasprs['kpeaks'] + kdt = 1 + b = kbasprs['b'] + + yrnge = nlin(kpeaks + b*np.ones(np.shape(kpeaks))) + #db = np.diff(yrnge)/(ncos-1) + db = (yrnge[-1]-yrnge[0])/(ncos-1) + ctrs = yrnge + mxt = invnl(yrnge[ncos-1]+2*db)-b + print(mxt) + kt0 = np.arange(0,mxt,kdt) + nt = len(kt0) + e1 = np.tile(nlin(kt0+b*np.ones(np.shape(kt0))),(ncos,1)) + e2 = np.transpose(e1) + e3 = np.tile(ctrs,(nt,1)) + kbasis0 = [] + for kk in range(ncos): + kbasis0.append(ff(e2[:,kk],e3[:,kk],db)) + + + #Concatenate identity vectors + nkt0 = np.size(kt0,0) + a1 = np.concatenate((np.eye(neye), np.zeros((nkt0,neye))),axis=0) + a2 = np.concatenate((np.zeros((neye,ncos)),np.array(kbasis0).T),axis=0) + kbasis = np.concatenate((a1,a2),axis=1) + kbasis = np.flipud(kbasis) + nkt0 = np.size(kbasis,0) + + if nkt0 < nkt: + kbasis = np.concatenate((np.zeros((nkt-nkt0,ncos+neye)),kbasis),axis=0) + elif nkt0 > nkt: + kbasis = kbasis[-1-nkt:-1,:] + + kbasis = normalizecols(kbasis) + + return kbasis + + +def makeBasis_StimKernel_exp(kbasprs,nkt): + ks = kbasprs['ks'] + b = kbasprs['b'] + x0 = np.arange(0,nkt) + kbasis = np.zeros((nkt,len(ks))) + for ii in range(len(ks)): + kbasis[:,ii] = invnl(-ks[ii]*x0) #(1.0/ks[ii])* + + kbasis = np.flipud(kbasis) + return kbasis + +def nlin(x): + eps = 1e-20 + return np.log(x+eps) + +def invnl(x): + eps = 1e-20 + return np.exp(x)-eps + +def ff(x,c,dc): + rowsize = np.size(x,0) + m = [] + for i in range(rowsize): + xi = x[i] + ci = c[i] + val=(np.cos(np.max([-pi,np.min([pi,(xi-ci)*pi/dc/2])]))+1)/2 + m.append(val) + + return np.array(m) + +def normalizecols(A): + + B = A/np.tile(np.sqrt(sum(A**2,0)),(np.size(A,0),1)) + + return B + +def sameconv(A,B): + + am = np.size(A) + bm = np.size(B) + nn = am+bm-1 + + q = npft.fft(A,nn)*npft.fft(np.flipud(B),nn) + p = q + G = npft.ifft(p) + G = G[range(am)] + + return G + diff --git a/internal/model/__init__.py b/internal/model/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/model/__pycache__/AIC.cpython-37.pyc b/internal/model/__pycache__/AIC.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ee00c653a05371b7e8338d18ef45665ae4e8beb GIT binary patch literal 1040 zcmZuv!D<vi5bd6xO(xNZpb#-4eeg1eB!UM)f+SfG0^-3%gfN%h>E7L8X1d4fnS@=& zgXo7Sp8N<8{>EHA<rh3zHS1~;EU4=0?yBypdhd8^Ym=eauOHNpfU%#nSqbjhA*z3b zMl;O|cFJ|2#V2+e=ui)E6?#pt;~Hu{VsUhVk?d6}Xh8{4*HDM3{vjI8TYi_dLCrq% z7S|p21^3(Ry=VpI2aE5U5@qPhs;P~a^~}hlTxGeDCwAhXRCVU8970wbKyPnT_6eBt zdNkSv<1^i;Li(nZZX*4=M&TK`^wK1&>&#B20dU|kcPY7)yV5r0*Z@URl+m(Mph|<^ z{0p>K1KrpgIO{9=6LUc$i-Rt(RVNBJjl)i0T^-LmZaZ;wGW^D117m)r!)M7GO!tYJ zDZMvV=gQ8LBdbzpwR(~md*%~Y8S7KDuA0q#@-iDI9vk1SRGO=)!Q7(22%Ya|77Mki z*e{(n#Xf$tSIr^9pGZC7z@q!SKe>Vq-Sp@jqEj=(gtx&*fp`QhzlV6C2DyNPR%p>< z$2H$(gyHIbhdo{47cL(E!4JTsG)1aJ5^znS<OEzP-)4DM8J(%+{4Y3u3}mLLB!}^` z&NzetZh;5{>u9<)F!h-#`Ux%#k+%!+lk^UHo|<LhO@5n84qNE|?Ufiwul2o3bgpx- z<vk~ZB_ENCd@=2NIaYIIm9jFsM8I@KK<Pk^(%HF!dh!2=Wt%T9kKp|32;u;!JRmG$ zajog=&5Glb;R6ixL^U>mTa+|79Uy-Z@%|l}Lf?IVdFcUS9`qxN4v;8KVV=|AJxw@T Jk8VU8zX2DY?rH!4 literal 0 HcmV?d00001 diff --git a/internal/model/__pycache__/GLM.cpython-37.pyc b/internal/model/__pycache__/GLM.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c34c3b0b1fd8d35d02357d48d2295be3a76eb53e GIT binary patch literal 3508 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 C5A~`5 literal 0 HcmV?d00001 diff --git a/internal/model/__pycache__/__init__.cpython-37.pyc b/internal/model/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4af36fcdadb67425dbed2abbbb313e0fb51dff4b GIT binary patch literal 191 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r;Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^yA|*^D;}~<Mj$EZ*kZF#Y%Hh?LaR0 H48#losj@ZJ literal 0 HcmV?d00001 diff --git a/internal/model/__pycache__/data_access.cpython-37.pyc b/internal/model/__pycache__/data_access.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d804a4691d8a58ae2cde87526518d9a5c61e7a54 GIT binary patch literal 3991 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 IkNR(a4d5a92LJ#7 literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__init__.py b/internal/model/biophysical/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/model/biophysical/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10061f040c41febf954d22be9ed846247b40ac3f GIT binary patch literal 203 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{V9Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iBJuH=d6^~g@p=W7w>WHo P@})Vcb|BY$24V&Pc!WBr literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/biophysical_archiver.cpython-37.pyc b/internal/model/biophysical/__pycache__/biophysical_archiver.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4c5dffc7e53f254c049998fb5fc7c8924f66091 GIT binary patch literal 3571 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 TL537A!Yc5FLZG6nbcOyO-<qOJ literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/check_fi_shift.cpython-37.pyc b/internal/model/biophysical/__pycache__/check_fi_shift.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a4153adced8355268a3cf0f661ed0226ad8053e GIT binary patch literal 3189 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 M;AxBAF`OU#3!mCHg8%>k literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/deap_utils.cpython-37.pyc b/internal/model/biophysical/__pycache__/deap_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1969fa990986b476884a4b58889d8d4e85c94f2 GIT binary patch literal 8242 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 b&rRgbIJJB1>zVRyP#6`FtFLy4W^4Zonm4+V literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/ephys_utils.cpython-37.pyc b/internal/model/biophysical/__pycache__/ephys_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dba1aca35136729cf5c46e879901933085cd24a GIT binary patch literal 1680 zcmb7E&u=3&6t?GACTUuBOC{0;E(jszur1PF099q#<%oJIa2N%Rreh}^GVu(y)6msK z0(B+0Ate5Q7EVa~H5}*4sW;Ah;(JaT%5p%=$o6~B&-U|spT8%Yn>~h4{qk-0TgccS zq}+ZUgvV&+ZFGVOUb2J>Px#MS;)y_n7=00m4#q(6V>XPh;mMA2T1j6A4ZE_ZXy#LN z4ZCCwzv4@;@dV#xOCO_$F=%|@zfXD~0*nFdA?%^$m!60$>=*pX6P+e}o$at?)L=yu zjeR=xD2a_NX7h4x+E`0dSIWo<j{Eti2eT(6;37XfZZ}OftII-7Qk_|;In1j`_UDJg zAn8t|P0d2ey7g3@M48UiM7Dk@)v%MqBC}a)q;31oCsp&=iPTANrO|B5i<X~hAN#i4 z{>n7v_Qm4q2cyr7)Mk{OW@7IoTV(2d^pVQ)N{Q^zNUAe4s%oiBj=ri-&&}wQ;$&nB zD<9TbKFuZ)YfFS-#B{$<2wi36{;U$R+&?MYiXw+a(%N)xi_+}X=j~v9pY$v(Qk#x- zHKQ9)faV@L#(O+o{{yc3u&t{XKp|J>{vL$y*q93-;CbBekJ$xZa^XWmMV&^N_*?TE z-gu4gDij{&lx+G48U%?~(ac-uCIH1350<>)g6#riyMV~|?27B4;Xis`1t_qWY^|=g zuJVSECf7x6i%Jc7+cP%P)+`EpI`mp^@7<OgXQpDN_Pmy^6nX>az33g3g|T@xs}Hv* z2#P3T&)!*Q%cRxVE!sOME9BK2LbzS>kBd--j%kk_bnYVk+l$<U&UJ(-clyxNuaHcM zUxh>Pa53p^NHlp9%>O+k*;-V3Ixee4icA0>wDW(RM{(SoxAG74eVCHS0oo*+cVTYm ziDh<fq**z0=j@_yxBs2GP1-z0$M`ni;#;1kg0G=P@vVvBcPN%!@&;93dXOABOao~C zTBErDG~izVfKz4;SCl}q{@k)JgO}SlJZ3~Hy9|_q9)91fbm6}SVp&<89I3$_Exh9u z*$^-W5drKSCr8-NSq5Z_VPiM*-KNvTO}7a_OE`NN965%$CVX8J{D+Yyz<?`@@i^HS zmzh<SdM0(HDHpA;GS!BtVrGXuP28!w<nM_hiRN`$h_Asy)j~O`>oD)cj#R=4cn1Yu zI6a0HC8lDoZzNFPOQ>t#bak_MB5qxN3dYNU9$>x59j4722!MG#Dxp8%1MeR1qnLg4 veZGUH2bdp*NeDKq&)xkTiMVpR$vcOx@!rM<V6S;84=FE(o=EJ)y}0uiyrY5@ literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/fit_stage_1.cpython-37.pyc b/internal/model/biophysical/__pycache__/fit_stage_1.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94423b856b684328bc485032127f7b8e97e87523 GIT binary patch literal 9862 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 literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/fit_stage_2.cpython-37.pyc b/internal/model/biophysical/__pycache__/fit_stage_2.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..baacc61ed6670b52c64d00958e02af193acdf9e9 GIT binary patch literal 3220 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 M;y!R|ZrR2E1u?O9YybcN literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/make_deap_fit_json.cpython-37.pyc b/internal/model/biophysical/__pycache__/make_deap_fit_json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f1322084cb5d73e7ebd01a796b2ccf4a9968bde GIT binary patch literal 6725 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 KR;r*?{eJ+No9+bw literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/neuron_parallel.cpython-37.pyc b/internal/model/biophysical/__pycache__/neuron_parallel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eba6f75eb7eec451a9626e87fb03123eb4b8560f GIT binary patch literal 1852 zcmb7F-D=}T6rLH$vg|nCB~8;5TIv>3>Ok!!3%d}qX*b!M!Zs8_yCA$6Su=6e$dWQM zUdLYfqGX{z7YluXV$-X>NuObEdzDwnRnL(UH(7Gi5p!lnnmKd6@BC<QdAUlU#ee?f ze`6E!4=%2o1(UC#D-Q%GoJM3oJxX!TBIYr{W)`>R)UyShmFC2AxXnv%h*#zgFT?0^ zmsen{@G4(|vC3<F8O9}E=l5W&adt?W_b)&{X;MRv4<?&_6p2{zlhz>NB5L)*Bt0Ih zFz};REQT_PyQwd6Qxs4<2hD}<KrcgAzk$%?oJ?7tOf62Q_Sv4M8GTEhk(ZCACC<3@ zhGeB@<eW|&&3?2pJ0nLdbN*m&2_=~|vom`RFf*ImkIB?NU4KDzNjv9o;@3iVS(j%n zFX>8F&e%G<Un6+pXL3Yy=x%1AegNklT>K3dEo^15Kw=g4H4qtjS)Wo(GI~ybfcsAw zCvc7)03mi1D&1s;wH_Gi|3xGsynMaC-T7V#sXG3#&s#lz<j3RA)7TG^nEMYqB7UVh zNeV0mAanXU&%<6vg<5=>`oW3c7jX89=XMxtA!9#k=Y+R!5Z-==@K!p$tnBnfEY4E7 zyNn1Bj!h<O13zu;L<x9F?Y0(MF3>}hrEmSTp_AmKv7v7900BqdLoKTy`p86WN`C<+ zJ|w@hQ~R*Mn}cpLS%OW*83OQ-12<(U)G*R2|12>CE~`7pSC9<SUDTKx=a9(<w~bru zX;w`+4Z1oU2xCpc)L7j#Fpe7b2B9{Np8|#4*gOohDUT9)62^VA+I@$VZj|&*iHqK_ zZ!D!{(>3<dFb+%w=$3vj63SGS_NC5m^2!AQC6^G7?aRLMN+`FC3-{%l3dmH}U`r0o zSbzaBs&x>AI@E@z4$lg$(i(J!u2K0hd<$>`w(Cg47wQ3svrSEAbWY@^W-znnm;n&a zGkZ>^Gy~p`SP_9QAjOLqEXn(DQX-wkf=J1&_Dbnk3JA;sg9Y=#3mBfcz4-x*ZiPmZ z+(wt?Zx{CA2efe?x<aIdby!}CyIFp>smNiB><fA0lK*aMz{!tL1?nPHHbDOGJ8YiB z;!gFSg1S$jU#rLU-Rco(0pXVUHpbVTs_Sszvm2^$y-<yrgAt#z(}Kx0J7*0IWp|F% zY!$r6ICu^{xCY*Y>aha8!=h?U4yp}khe9--Mk?8E9BZAb?RI-K8eLV=*4U3kOYmVk zJx=%b+OI+}(n%TyEm(hb^knOE{bcLmqsO_T$?ArB4Ha2v(N!YQVG@7QoE|ib2=OZY zkavSf_)?-HJO}CvY%_N34+NyE1&bRjAX#P=QdsEggo?tR^yPR1z9_8b#CBPoN?bRW zJ*P;!T)8Pj&h;@HD}AA#!yIDcec0#S`|j%Bu%AFxJJUt<Vp`;}mj{PL7fK{M*L}mN fMNk=c2a4e^61(UIwF06>T~=i-bL+0-TKN16!jzy& literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/optimize.cpython-37.pyc b/internal/model/biophysical/__pycache__/optimize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea2c189232bcd48e08d0bb566f5da87b91748501 GIT binary patch literal 7958 zcmcgxO^h2ycJ4otO%8|i|EsY~S^m+;)=2){l`ZRkB+Hg&W=E1`cgEZ4VKq5THoNKS z;%H{lL=s4WWFQKhQ;<atBmyjuTaL*ozT~=C>|qam2!bRRBNrpdX)nq5s>zv=WMtO} z5E510_3BmCtEyMud-eMA@NhxFFZk;}cK-3WqWmir20tAy7m=b-RZ*D2R9|VTma5Xb z=4+OQr|#=b!!kfKSjNvZvsSiWpR;n3&ur$cLZ3Ed4M|$jD$3`uRl+mtk2FWE(dL*n z)*QFSn-kWA<j?t&%_(b2zMKAZbH<v%dwxT+X016^u;$s2b;Qke7g({US}!ooIg0cm zQW@zO)2x^9JdX4-(kn=Lq*vK6D?L=K*VqUf#q$K4XJc&qp=vF%2{sAJNjAl%@qC@l zuvt9ca8I$hhW53}i|!i_6v&|6Ru+$ZOY5|#Ci<<l8!LEb?h4P3zQtM*btG`xJPhoX z!yVsu{Y4`wIDReUp4e(eiLvQKZj!5T*AXF4G9nE92+gur!l3Ha@HWQXC~WhJYgawr z4V<RCsMTml`t@JFyWss7#`FHxP?WvnG)@q)#!@q6uD`VDg{`gK$g4R1QrHq+)7x_^ zBpv-|Z?i~OkfJ|DCX}ukD?RM4(7JjLv&7SoPo<j?*>0|<2vg>H%6oc8Wokzg1^!23 zs9TKHo*HXnI94C1lS)GYwe&#YRnUgIBUC%7bX1HoD#n;Lry$p5Zp@)CjMnd?rebX~ zE9nHkS-+U%oo37TM4P!u2GeqO6O*;MBfKzJ98WTBT6AkJa)lj)yy^IuC6lY(bcM^K zMBPe;s$Sp;Pu3+mZwJ;a7Nyem9f8%w4z#&zyPSt$&j@?ltt6%s*+IM6+D$Usl92J_ zqr^gc(+?{RyRzk08i^LP5<O}+6CG=xj7Xwg4SC9B<-@>@Y~O3R$ry>~ReVe*6)#GL zBJ4`Pu&5_l(v@apm7W#}C<us^j@~3wq#--M>-zi`cT?h%4`J+>J2F4QI<?OPkJp zC)nM%6gZVIV9whcZm=C~glH61kV|dYxan<fM4oU@wVX=Bskvy|SDVvbfCa+<r=|X! zKBPaV2l}&w1u41P4n!eYZOrL7Y0xw>MJ=c%{`0DVlvPXGs9MnYG1OG3ntpjCQae(= z=+{t2QahmuovBa;ofJbVgVD`M)ib(T`OJ0Ap3+f7o}OQ+qR<_B3}vbp>%)yqPbF1? zavh?|y3&lYU#l^rqq9uMVA)Pa6zU_f66*~^jI!Jlt&^p;NMmspy_pTIr+x+1K19n) znj*#@YY$Z9$^*4w@Lzyu;;|BIHMOUG)vslGL*xI%3bz&1PCil|sa1^)vEoBhOi}Br zXxmdexi}Xa4Fj-JNO`49nIA6GV+9gG8j_;{#GX^6Bp3yf=;;4fkG02|<j_(MlmXpy zO2d%c+EcSq(BkKEUf`DVqLr9@q(0IxkKz72(0hL#W^DH7@hh4KE8zf-tnguMF)vX@ zn9~QW8{Z6GE)GukH;by3VPd!Ca-f*<?SJEU=P8`ZfINW|y(~M5l`j@Hv<|T6u}Tx4 z!-O9Ld*+l`<<GS*joazzkVgckN?SUUs0}OIZrL8&S=5pu3-1TE7ch6n1w07J$jj*a zH-&S)7l}&PY@Ppv2Go#cfvnFQ>!ou*0LPEc<7L4AJ4#HFrV?YbzF%TaCyLWtEi)CB z#OAMpkQ8VZspJP@^Vd*y52-KjwZ&;Zf+Am_CdH<+V@sd`^6(dkK1$gbW#g1hQ8q~# ztumiQW(`#VjzJjgxjeKCYA!d_(t*86#^D?|tOGDCgL%~|pGTV{>$HG1EYUGyl6L{0 zE^yji%qQx$Rgxk^!r?$cwqq4#8SJt&#oSit_mNd>!Sro~KC{MCs3rUxV7@iuhe6HW zB7LDI2h7<`*id^L4g@Bg_P5_?ifH?72IRhq@K<Qsw7&cVWo62aAbT4rx{ORwiz&Ei z1aQ;pQ9vC2+PFH2|0tlYs2SQ(@C;~^YDq1t<H#jdmHkx+_UK1X(&{Tn(M4o2e5r=X z7nsVlhX6%@llnlT1BL?ySWIa(X!#^+(&v7?f&*u)Jf(nyvA3ynQh^$}`(iRZGSbYW zo1S*)sNhg!xf8IkndI7m2lLfj)TJ6Gs*|Xjsj895N!Nz-&8FV_=i^Af(QiE$KU6G! zhQ@poSzjLh77=J)zE36x^uA1Rp!7Yjh4Y{B!}~6DwhiUvi4nm+c(yGK@CCIc`4sH% zq$UU5Us6Ia0w=j&bY@^);4RT^J<+;ak9I&`k@$sy4QI!TATS*yK8Fk^!V6HLvS&t4 z%uP2EHv9($HYvKI@(=L7uPQVwB~lp)fN}?6pE`Q1JW{G~!k`{ztdkg|Fr+dNW?y#N zBhodg%%l#a3>_e6stP?c_!QpWm(V~oR965s1RmCreRs-sDxy6w`O>KZ&vEc1hVKO~ zCT0SYfJ@$CEX|**xq-XW;^*sNm2)$cy<^0+7PiRuf(Lg<V+P#)g|l*g=rFM(lB@^` zWfyVHXjS}(e@N2hT49U)V)?=xzzV77qAF{pmL{dAhuR`3XeG%{;TQ3&P=S7Q)=eb2 zz3W&k+FrT2Y6r_z*O(69#CW2qD0MXkkAvPo&mPcG${m!*b?yM_>lp{m^8=-u!@Jp2 zaRo8qeGE0SoYRw;@LaTDQWRO96&`3E*xZzUP7%Z15>6_)<oWst8=6yCaZYhY=>k*J z;LVIUW3py+j(nLc|2J70OZnJ1c*n&!Je&!#^r)TaPO?erk4>TFl*m6&ooO*$pK)f; za<*f{Mt6=)L$@+wx;r0dx<}{=)JtWU?k-4QY`XhG|9Ld+8~Gf(w^26V_ugcg9hvOY zW)v}FzbIz9Wwsz^GgCj-eTlumj`pykf=b8Pi?U|A`*Kg&(4AMDSDn|s)^~p<PIMRL zXe4`C@|?tVB;5hE{(2{ib$z3gW5+rsd#RIW$2$daO0L7pb2ttC_gCnBM(GTRrTS_1 zsyI`BlfA}HJkc>eQ5MBpc)ra}O3In;JJ`KqT<pHfUKj6)ABi8wL%j_4oG5RIv-S7E z{Xtx;pX=f3E2*bI{ZPCG+WCFjlDI%K1npgR8ub@tPX%`7iR=s1H$lCWQsX>(>j^H; zvbVRz<@%MhEk=9?Tvzu??}`)kWw~-^yVuxz>_-oAZR-rj!|3nF;(GlfR%B;s9+L7t zC^rr$=<NgXaliE^m}QBbi%a%R_F-()Z#A-C>-;ULC+Fo_Lo1*WAEN&eDc1$DB3J5z z{v2215!8(aSgZP4oMRWCpu{e*%MX=!l+dU%hIY%S{YgC5(>mijWw9QQ#p7hWz8Hs1 zn&?c%lkr6TwteSo{mbe-MV#&4jdSRADxT_o8jq43@o@JZy>+JJQvI_k&Ve`;kHNpa z@>g0s{TJGw(HVh;p!Rd(-}yUXv4uFx7G@MV($70HkmL8_(YP3!>}t>G%(7)E<?IiZ z()hA?Pm!|CO4*9t4fH!Zqd;mc9z{Sy`4jEjb27&>|GUhX{Vy^5bj7b>u5<AmyWahR zbRC*IFRpig8qc$jaGI`nZLy4V`}^_e1Ds8{n`!Nhw3dB*umexkfAUo8sb^Z>?6<xp zTTju-^jn|kI`S0GbT{dFPYF&Mil{USUuXDD6%@JtjIBtmaqHD?jrcxS0_`)b2Mo*V z%HG^<^8U(B`RekewX%Ta^MYC#*YPEokRj$q749KU5eBf*uFJ@h(zPHN!gUrg5nMUN zR$>G&6p7YsTe+L7*X=9UuJ6qcZm`b>KK6=!SgT=}CF;X6$?0tS?MU89EUkLh(yMR2 zea$kf9^waxu~<30kzBZS5Bz456qURP6R|gS&-4AVybzS(D3zs$8r`u9w^rBJK3auL zpTj?nDxQ~Qy&7z&dvFu#-+h#e(o?YXisRKzU0L||e|c~I!nYKM+grHp%F)a1R+$W< z@G9l~s8Q`_e@VZ;zfh~n->)z9JAC<~WmdMFAaD^18FCowU(chYaLp5lKt#95|LAjn z_YYXv+<n)pZ3%GP2$;9+F&KCvWA?<4Sd|dmuEGY3qyX#QXGsdMyM5c8m=p+T!^5|X zCi(d~f*|4jL~A1?;tI#gHrs;e24BbA_-)GWAhR;)u(g@wwjJ()A<0Ir?^Xm|99sK+ z3;A4>s98kT83q?-dElem0wu|k04~MNa2I*rxjKhn%O-Qqe*@nCL{j#qn~rzb>F6`? zv#5mg@MApqDP)MxVbd2giB8&<4QQs3<dW5V13Z>_`_85HJ8P?Jd#~M%NR^#(iz8O( zBHZM%vb^gM`OuP$9=zjDhSLDi)nI?l<g4jOa?a#FO4of<Iue+BWW?%IZabH&kb!U> z>-%K<b2NL#&6F3!UxGex*k_+zhQTcsosc8Ue=5gDrYPTC_`iwA$t(YD!u>ON`odY+ zYd7v(y|KQRJ01PO`>b<%Zy4)I?q}Fqf<L%7wqHbKR1oR=1*99TT)*OA{hnVt{@L#! z+;<1U4P@C0tA}Ml@&8Gd|2QPed&@f&R|00)4Ju)q!gtU++-{}T^#jl4mF2tZt1D$h zJ1Pj4B5JyY=q9frfQJZl=@PHuo*sxbD)OWV^srGYY5aAJh9gf^M2t9HhB+Y>Tz|Od z{3^X>Q+!UeFiLWWIeLhD^C7Cy{7O<FH~or4@Whawx{N{0P*01*G;9x|i#EWTg1npU z8mD8BMlnW-$!t2fnBq((W({#vG6mKIAtXf@>}JSY2pEL5-6Ts(!CY&S<g+WT-^W6E zZ?T5G0J9v#VP$~C%7{pWEvs1BMmxIec-yX(ktHjS=)4~x)&s);dk_h?Wesz;5^`pz z*po(2DE^s7Pw1*;<zdwBhrEH9@)@dGrtBJJ6e!_@W>__f{kuGef|cvzG~K8o!9SL? zJBVj&hC7ML-5RLqj4rCl(B;*;D_8BCtM``I2Zg(9Ys>4LqN~;rU3+eTn>xP<3SS{I zK-?4SZVO}bRiYjv>TG4_Hd#dQvdcJSeD^Z+h`G#~1bDB7{%#O95jgKtIbDz~pf0}@ zFe?YxzKkv56nnA?u<in4dX*@>`4Xn4Xh|1ZnCq~H2u&l&Zn+L~xs|6)#H|rl^dhlR zM1ikS_7lq9p^WfNo>8mt5v=@b^%`t+f><6Di9VkoQU~oq^g?b442i&^Hj@mZ88w&R zrPiM!OR^Nxa0Enlwp}0wKMAUJ?754rUFBi((1!$QEF$=c@nzc+NpT%V%xk*K^rav% z;jLh@j?W3Tt-_VnTes|ctLrzfTA53mA)x(;jOf#;GU)JF1t_SUo)v5A&_@J<4x2ok zh=<hG$bmXbML$p<%c$(MHeqf>Yg3w1xI@fqS~>cBM5>a3Q4tZ{o#k3n)QtjefX>u= z((y(bA}t0*60LmS;$v{K9Po!cVd(%gzK5c;2Kb6mtwt?E73m(?%;RvS;G)snGqxsy zFW?1Dw2gj&Owo#nffbNSh^u7vl2%X=E5ql30zM9u5Kl8uGcMz621;3tYR189BCb}@ zre)hAI1SY_s7)4a)9Bj*;&0=ciF_In8yd$%O2;Z`)GPXxeNyzUC`;%G(K<xuAV&dd z9vq0^5fza<P_<b}9hdzbRm+IqmC<jJq*3`J%qTH!o91ZS6fIeTo73{%Y3)ii;1p%B zmi8Ue!6%jHJ<}!TIxSm%y^>g$D4d`pp{*l_H7WI9r043@IC*cpPT3}9gez7?exgbv zwgz=552%C`2{I`n9NQP?sSks8<TVGKOGqDXHEQ<Yt79Y)oVRJLZ5pe1b@|$*yEpIH zE7zA-tiqsl>u!<<BHx7604Un`1Jvdc<R_%0^c9V9iIWol3HnoWLO>+LqY~a^^eY8~ z!D5qNZrg|SY(Em2nCCF1w(p)NPcb5ERFs>Q=A=ZXI*ZLK>ZE9fUeKlLqzW|1b#v4_ QS;(1&nKA!RDHYWJ0nbqXJOBUy literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/run_optimize.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_optimize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca345f8b74ef5f9e4a1411b3b43738d1bae6fd8f GIT binary patch literal 7248 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 BXLA4m literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/run_optimize_workflow.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_optimize_workflow.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83855733189c613550d98892ea2268c9dcec0bcf GIT binary patch literal 485 zcmYjN!EV$r5Vf7`CJno-khpN;x(7A~ZU`ZuSHuNzi6R*%o^ITA?8uYtvU{s4{-YHq ze#uu({e?<MOe$4kB)>P~nKz@EPs?S&$lR}M^_Te16g=6CoDcNyJAr1JTUJdhEbm1n z_~a)x>C-CZ3{sfs^hQ*3J%jm1R2gKqIk3wUJ=grFc**WKRTVnBeFoVbznLNd*~FTE zWvl$2rm!z79@AD?OZ+?l`dw&2UKk5b^>923J16}xn%*2?jotC2Y>X=#h21?T`2&Bo zTEqko7z^ArL+~vi20^K~9JU+z)DlB7{pC_leWk35u>*;1FvA#=w%2hEKSppmrYdZ% z;%o@UjWNCS#{FjDjKq)daDD!^{)P~+R-Mx8M(ve5)E}K{z0>MV4eknSKY+uQ&=1`K z>(8dC(TwnVQ0-Q2fV7qtM7=F(2n45W*?SF^mU~nfx=8u|>T>VH_QLx8dN{=V9To2^ Vyq_+Brvy1)@P#Nu&R>XA@ehM}kca>P literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/run_passive_fit.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_passive_fit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f9b6911c798ef36e829a5b1a57d59b73106a51b GIT binary patch literal 3974 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 literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/run_simulate_lims.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_simulate_lims.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ee4e45e1cf646c061e5daa7d683542ec6062727 GIT binary patch literal 4224 zcmcIn-HzMF6`mPV5=s4d*IuvfG!2+GP9oHngET>lt>MP89V5+VjoK;fvYQZG%}7fv zManaj?G>ntc3mVlMbSQi7P)C(q7TpqD2hSudS#$b5TJ0+8U3x-Hrig40*5naX3os{ z`_9pa^}0vkNx%Me)H_MYKX5RAaOMMe)i=;^!f8T+>6Zr7j9I|U*9t82wfm)@Os8uq zK?P_mar$oH8k&`O{c2F9<R;-ZFFhu_B&r8iP~&A@c}#-3XmDqb$-fKMJHcH}f6LC1 zZ7Wy_R)drKuZp@@5v$_lfkla^^-fLJxOYe?xl7Uwn~2kUp8Ojn!8#?QS49=(&j@RB z_K@HjagJ9H%vw%44c33PevkZ;r0gC@b%!)-Pe4Ml)ueh=3Y86ITZElB5oy#HK&;*# zrg!50Fo|-}#+CEOnsw9%&=CZ+5->Q`=Jb#Tr7uZ`a>lL4PEh7mUgG7)6tq&|4oK^O zgdTj|FNsY84{xDQ964w+?yJ%JQ3AJ6e6JO!xsYj;wE7trNoyz02D|$zZUaRQ(@@Q> z7bdW+J--)zZFupk)}hHsP789tCaj<ZJ7j1VIGJuWEnQN>fshi{YbOljG|s~i=(Z9` zM|*KP80KM5WvQ-a!+bsf^|)c!P9mkk@XzGi@wJWZUnn8fcC;Ju)=u;=O82*~rcpaf zdGy0=kv>q{*#LxULu-WC-i&v)Rh)~9gQ&e1bp`C5iG67<_9Y|sr6XcrdQR-tU|*Ku z_6?MlK|`$3*<%`Q%>~<PqoDXy;dSA?2Cw=JG~gmEA!9Hiw-VZC;}WQeayzm5_88o| zC>7QL9aoCVq*Q>R$4*f`AY-?1C*{K7B~)u(L31Cl-}_^)@Fq@S_gt8x=LnjgyT7xh zuFKia$!&6vz+Mjw0xrrK7{nXh@%-7dmE~eFxCqZ;a4X*x(oaQOC>6<lA6-`YkraNE zsLX#T<2)B>Yq4HZkPf|k?Zc(}e46oLBCZZ%pr3h;ep^Ib$k8ggRoKUKx}s&AfIj@} z2`ahCw5u|ihkIgQ>2jQMk><^+wsBSP-rSN)2aX1D>;6#4Sg50J9D;@6A|Xu6I`Gv$ z`k%K-b6JV@56*N&9;RX_GYA^wEs_vCMg<Vz5jSBnmq**^kGh2V61v2P{ejZeJPZ3# z8h3;OX=DX?o_?NR7;{~puL}oJz8h3Pf^aAkc?$LzQKmPtcKVUFd6Y+*B~sIlM9-Tx zHR$QnU6Be27_&Gyl>G>~s5NMa>(CmlF^77r4Br}kgN@D~_wN_-SO7u^*dQ1fUw;=m zQ(y1XF@P#S0tp%THu!#FPppFUj7LJ>p82K)zG?see6vZ7s<xUXi4srs<{IBK-qcvy z4t-sog+;K|7^h*Dp?ZxO<heNm`5o*X)AjoEdcyrbfThZ0M5o5eM$Mx)|Fep5Ya4?L zAA}%$4e0(8I-p|$ctXD-6M9G}`3m$pu{h{<%yPR|0@Q%MdN;Qxm8qU*D*z+L)@%jz z)n{gfK@O8zFo`<2w&zUTLvoz}D%p=N6!vxU`5WU>?)9n@NUnfati#q#BFyWP296P< z?&o(2j%TM;4ryT-?5a;r%xKOb+}hmMJ*2a_M!r(e-fHh;?^F*`@Bzwj8s|(ZscspR z396soy8h9}n>WJiAKwltcW>SP1Ud^Hp>EI@jdQ;Poh~WJ=WlPbG3bPog6)+h_#7vI zmlR3@8*TyGL$v(^yKjRRGF|Ru5FU9@nVkeAXC8^#!SKg$gapP~?`R9qN!xMS$-u|Z zUzTzAt#>(zRo>3}gDaoFjKaiFCS^8i9k)EBto<;_FzH@4A9V#f^Ub3boR8D4e_r`{ z25r#jKoT8966y#@-zuo99250WO`&3*Nb#a0r!A7CwVSn@>-wz)_8H_lij&Wz`=Fj= zfM#>CrH_)m4vl7+(l+wdW$_4ZsC22n$730|NQCU($#e<uuCF8-L)#!%7r;;K47<9l zc87VKXd4C64z?!V5buExf@x4al8b{HK<lCg!Ri4kr!dsz_E5s1&GIxxow-;+6__B) z5U*5um`QUtXGT@p?Z~WeYA|D{xzP+xdP_50h6|~;p&`^^4nt7%X01n8ERU|y71p3- zcpGem+H~~F%WaBfP*ox-YA>9pqfpnv@cuALW)f9EO<l0DcEQ6op${d~1=wOL5BXi} zy@t*E$fiE4jL@=SxWph32SG-nIHur2bTYVu;9hgQ)6S})KLgz8mj<~13Y{F`njJ6z z2-2ey#sR!%AwC^Lh4;+ZD&`PiVf76=ZGe+fVPnxz*m=2E;pNLvo)iQEu2)zS2f-@c z=8mBhKmm{e%FnoKD1QWsmsj%|27me<_YCz<K&>yRug$1`d4}r1sDZqA6+*cdeF50% z-$-+)VFnqLd_IJ>5555Pz_NPTFmdEVoPxXa4Ij!<(a!xHu^T;zGkL*JWg0(#U5O97 z=LPYi_}R$!2ja-?Tw<icvs^Jfz~m8?V<PVEn}T=4$C$y8#w=vYEPq-8`{<@V?l^K! zbI^;p08=>gh3CQFjzN|x@zV38$cHi&9B=W`^Nw*ja^9%A(A#-6T1O84Tt*|+2Ef&5 z&CrJf1eGQAzXhXFZ5A6XsP#KRW%Jg}@Y+W=wYxBkiHc>AY&B09FP{d`MGOXmFf3_n z57FTo@QJ(fEtt_2_~#HqH79?9>oB~gj2!G?{chqeaOQ?@mULw%b8zx`Ys_fRXiPJJ zXb*%4Q2;pjSkYkjqd5Hnj+#P_YXh*XQ1~(EQ4c~F!k13p27JxS<W<;#n25W>@X5cP zK7FbyYS_lI{RvhL%~#})Q2-;SrJ#&<!Ts7|2mTJ}#!;olfX%bJA@s=>vaS#Ix*-T+ z{<kWlLir}nBCt;tj8~W<n;psS1Nl=NFEwWX4E3+w8;{yzkjL;Zk3uaB;Fd|Sg~_y` wc+}Q5WRv`eVvLFmEIXH{5qkwiQs0Bd0UhA4X5N~$a>x0;L)RDsiqRYWH_lIrbN~PV literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/__pycache__/run_simulate_workflow.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_simulate_workflow.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94429c8d8e97d93bd93e49ab35b196f7fe5f1520 GIT binary patch literal 485 zcmYjNv1;5v5ZztrPO@@mV@TsJ?G-r{=|Tue+=etJjS#F?+VN?9tCiT1d^vZ<<Uedu z<(IZi<zFxuJTe$Eu<y<6%$s56+j5yPGWX|3JrVz#f>)c7^MxLs6KJNnWyQq8@>Udr zPkv;hHZEe$AcmQaZ$&ZJGnj8gkw9{n0=qoWbIpH?6L!z3D$~i`8%XZ??Gy<}Cf59n zt<ndY!hWoHh-+mn@v#T&Mqh)xFczF@;rhsrPNHc?s|HwObA6Ck#^sg5=7E#^k-u9l zLWFw^8ID!&yBZL^pj24)+l_o}i9VYCQYojtQWn|JfW+FHeh5+B>M)0212`RG<u_Mh z)_dcI5MOr2{bl}$#4qr8bNaFTiQutRjneB%?UdV>U!AHur`3lN+!dBx4-RX>u5b2O zem7N#W`Os-s<&zbq_wml>TOO#z&mC0w$or~xfg|@i{$^WE_a>ZUf6E8?)M@6M8%_p V&(j6)kRas?z7Uy6`CD-)o&j;%kZu3~ literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/biophysical_archiver.py b/internal/model/biophysical/biophysical_archiver.py new file mode 100644 index 0000000000..cbdeb090d8 --- /dev/null +++ b/internal/model/biophysical/biophysical_archiver.py @@ -0,0 +1,89 @@ +from allensdk.api.queries.biophysical_api import \ + BiophysicalApi +from allensdk.api.queries.cell_types_api import CellTypesApi +from allensdk.api.queries.rma_api import RmaApi +import os, sys, shutil + + +#bp = BiophysicalApi('http://api.brain-map.org') +#bp.cache_stimulus = True # change to False to not download the large stimulus NWB file +# neuronal_model_id = 472451419 # get this from the web site as above +# bp.cache_data(neuronal_model_id, working_directory='neuronal_model') + +# According to this there are 49 biophysical models. +# http://api.brain-map.org/api/v2/data/query.json?q=model::NeuronalModel,rma::include,neuronal_model_template[name$eq%27Biophysical%20-%20perisomatic%27],rma::options[num_rows$eqall] + +# Note, am I supposed to be only archiving Biophysical models or also GLIFs? + +class BiophysicalArchiver(object): + def __init__(self, archive_dir=None): + self.bp = BiophysicalApi('http://api.brain-map.org') + self.bp.cache_stimulus = True # change to False to not download the large stimulus NWB file + self.cta = CellTypesApi() + self.rma = RmaApi() + self.neuronal_model_download_endpoint = 'http://celltypes.brain-map.org/neuronal_model/download/' + self.template_names = {} + self.nwb_list = [] + + if archive_dir == None: + archive_dir = '.' + self.archive_dir = archive_dir + + def get_template_names(self): + template_response = self.rma.model_query('NeuronalModelTemplate') + self.template_names = { t['id']: str(t['name']).replace(' ', '_') for t in template_response} + + def get_cells(self): + return self.cta.list_cells(True, True) + + def get_neuronal_models(self, specimen_ids): + return self.rma.model_query('NeuronalModel', + criteria='specimen[id$in%s]' % ','.join(str(i) for i in specimen_ids), + include='specimen', + num_rows='all') + + def get_stimulus_file(self, neuronal_model_id): + result = self.rma.model_query('NeuronalModel', + criteria='[id$eq%d]' % (neuronal_model_id), + include="specimen(ephys_result(well_known_files(well_known_file_type[name$il'NWB*'])))", + tabular=['path']) + + stimulus_filename = result[0]['path'] + + return stimulus_filename + + + stimulus_filename = os.path.basename(result[0]['path']) + + return stimulus_filename + + def archive_cell(self, ephys_result_id, specimen_id, template, neuronal_model_id): + url = self.neuronal_model_download_endpoint + "/%d" % (neuronal_model_id) + file_name = os.path.join(self.archive_dir, 'ephys_result_%d_specimen_%d_%s_neuronal_model_%d.zip' % (ephys_result_id, + specimen_id, + template, + neuronal_model_id)) + self.rma.retrieve_file_over_http(url, file_name) + nwb_file = self.get_stimulus_file(neuronal_model_id) + shutil.copy(nwb_file, self.archive_dir) + self.nwb_list.append("%s\t%s" % (os.path.basename(nwb_file), + file_name)) + +if __name__ == '__main__': + archive_dir = sys.argv[-1] # /data/informatics/mousecelltypes/model_cache_may_2015 + ba = BiophysicalArchiver(archive_dir) + ba.get_template_names() + cells = ba.get_cells() + + specimen_ids = (cell['id'] for cell in cells) + neuronal_models = ba.get_neuronal_models(specimen_ids) + for nm in neuronal_models: + ephys_result_id = nm['specimen']['ephys_result_id'] + template_id = nm['neuronal_model_template_id'] + if template_id in ba.template_names: + template = ba.template_names[template_id] + else: + template = 'unknown' + ba.archive_cell(ephys_result_id, nm['specimen_id'], template, nm['id']) + with open(os.path.join(ba.archive_dir, 'STIMULUS.csv'), 'w') as f: + f.write("\n".join(ba.nwb_list)) \ No newline at end of file diff --git a/internal/model/biophysical/check_fi_shift.py b/internal/model/biophysical/check_fi_shift.py new file mode 100644 index 0000000000..3b4b4d5f90 --- /dev/null +++ b/internal/model/biophysical/check_fi_shift.py @@ -0,0 +1,83 @@ +import numpy as np +from collections import Counter +from allensdk.ephys.feature_extractor import EphysFeatureExtractor +import allensdk.internal.model.biophysical.ephys_utils as ephys_utils + +def calculate_fi_curves(data_set, sweeps): + + sweep_type = "C1LSCOARSE" + _, sweep_numbers, statuses = ephys_utils.get_sweeps_of_type(sweep_type, sweeps) + features = EphysFeatureExtractor() + + coarse_fi_curve = [] + sweep_status = dict(zip(sweep_numbers, statuses)) + + for s in sweep_numbers: + if sweep_status[s] in [ 'auto_failed', 'manual_failed' ]: + continue + + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) + if np.all(v[-100:] == 0): + continue + stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) + features.process_instance(s, v, i, t, stim_start, stim_dur, "") + coarse_fi_curve.append((stim_amp, features.feature_list[-1].mean["n_spikes"] / stim_dur)) + + sweep_type = "C2SQRHELNG" + core2_fi_curve = [] + core2_half_fi_curve = [] + _, sweep_numbers, statuses = ephys_utils.get_sweeps_of_type(sweep_type, sweeps) + sweep_status = dict(zip(sweep_numbers, statuses)) + core2_amps = {} + amp_list = [] + for s in sweep_numbers: + if sweep_status[s] in [ 'auto_failed', 'manual_failed' ]: + continue + + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) + if np.all(v[-100:] == 0): + continue + stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) + if stim_start is np.nan: + sweep_status[s] = "manual_failed" + continue + core2_amps[s] = stim_amp + amp_list.append(stim_amp) + + core2_amp_counter = Counter(amp_list) + common_amps = core2_amp_counter.most_common(3) + + features = EphysFeatureExtractor() + for amp, count in common_amps: + for k in core2_amps: + if core2_amps[k] == amp and sweep_status[k][-6:] == "passed": + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, k) + stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) + features.process_instance(s, v, i, t, stim_start, stim_dur, "") + core2_fi_curve.append((amp, features.feature_list[-1].mean["n_spikes"] / stim_dur)) + first_half_spike_count = len([spk for spk in features.feature_list[-1].mean["spikes"] if spk["t"] < stim_start + stim_dur / 2.0]) + core2_half_fi_curve.append((amp, first_half_spike_count / (stim_dur / 2.0))) + + return { "coarse": coarse_fi_curve, "core2": core2_fi_curve, "core2_half": core2_half_fi_curve } + +def estimate_fi_shift(data_set, sweeps): + curve_data = calculate_fi_curves(data_set, sweeps) + + # Linear fit to original fI curve + coarse_fi_sorted = sorted(curve_data["coarse"], key=lambda d: d[0]) + x = np.array([d[0] for d in coarse_fi_sorted], dtype=np.float64) + y = np.array([d[1] for d in coarse_fi_sorted], dtype=np.float64) + + if len(np.flatnonzero(y)) == 0: # original curve is all zero, so can't figure out shift + return np.nan, 0 + + last_zero_index = np.flatnonzero(y)[0] - 1 + A = np.vstack([x[last_zero_index:], np.ones(len(x[last_zero_index:]))]).T + m, c = np.linalg.lstsq(A, y[last_zero_index:])[0] + + # Relative error of later traces to best-fit line + if len(curve_data["core2_half"]) < 1: + return np.nan, 0 + # FIX TO RECTIFY PREDICTED FI CURVE + x_shift = [amp - (freq - c) / m for amp, freq in curve_data["core2_half"]] + return np.mean(x_shift), len(x_shift) diff --git a/internal/model/biophysical/deap_utils.py b/internal/model/biophysical/deap_utils.py new file mode 100644 index 0000000000..1f8f3c9100 --- /dev/null +++ b/internal/model/biophysical/deap_utils.py @@ -0,0 +1,226 @@ +from allensdk.model.biophys_sim.neuron.hoc_utils import HocUtils +from allensdk.ephys.ephys_extractor import EphysSweepFeatureExtractor +import logging + +import numpy as np + +class Utils(HocUtils): + _log = logging.getLogger(__name__) + + def __init__(self, description): + super(Utils, self).__init__(description) + self.stim = None + self.stim_curr = None + self.sampling_rate = None + self.cell = self.h.cell() + + def generate_morphology(self, morph_filename): + h = self.h + cell = self.cell + + swc = self.h.Import3d_SWC_read() + swc.quiet = 1 + swc.input(str(morph_filename)) + imprt = self.h.Import3d_GUI(swc, 0) + imprt.instantiate(cell) + + for seg in cell.soma[0]: + seg.area() + + for sec in cell.all: + sec.nseg = 1 + 2 * int(sec.L / 40) + + cell.simplify_axon() + for sec in cell.axonal: + sec.L = 30 + sec.diam = 1 + sec.nseg = 1 + 2 * int(sec.L / 40) + cell.axon[0].connect(cell.soma[0], 0.5, 0) + cell.axon[1].connect(cell.axon[0], 1, 0) + h.define_shape() + + def load_cell_parameters(self): + cell = self.cell + passive = self.description.data['passive'][0] + conditions = self.description.data['conditions'][0] + channels = self.description.data['channels'] + addl_params = self.description.data['addl_params'] + + # Set passive properties + for sec in cell.all: + sec.Ra = passive['ra'] + sec.cm = passive['cm'][sec.name().split(".")[1][:4]] + sec.insert('pas') + for seg in sec: + seg.pas.e = passive["e_pas"] + self.h.v_init = passive["e_pas"] + + # Insert channels and set parameters + for c in channels: + if c["mechanism"] != "": + sections = [s for s in cell.all if s.name().split(".")[1][:4] == c["section"]] + for sec in sections: + sec.insert(c["mechanism"]) + + for ap in addl_params: + if ap["mechanism"] != "": + sections = [s for s in cell.all if s.name().split(".")[1][:4] == ap["section"]] + for sec in sections: + sec.insert(ap["mechanism"]) + + # Set reversal potentials + for erev in conditions['erev']: + sections = [s for s in cell.all if s.name().split(".")[1][:4] == erev["section"]] + for sec in sections: + sec.ena = erev["ena"] + sec.ek = erev["ek"] + + def set_normalized_parameters(self, params): + channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] + for i, p in enumerate(params): + c = channels_and_others[i] + value = p * (c["max"] - c["min"]) + c["min"] + sections = [s for s in self.cell.all if s.name().split(".")[1][:4] == c["section"]] + for sec in sections: + param_name = c["parameter"] + if c["mechanism"] != "": + param_name += "_" + c["mechanism"] + setattr(sec, param_name, value) + + def set_actual_parameters(self, params): + channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] + for i, p in enumerate(params): + c = channels_and_others[i] + sections = [s for s in self.cell.all if s.name().split(".")[1][:4] == c["section"]] + for sec in sections: + param_name = c["parameter"] + if c["mechanism"] != "": + param_name += "_" + c["mechanism"] + setattr(sec, param_name, p) + + def normalize_actual_parameters(self, params): + params_array = np.array(params) + channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] + max_vals = np.array([c["max"] for c in channels_and_others]) + min_vals = np.array([c["min"] for c in channels_and_others]) + + normalized_params = (params_array - min_vals) / (max_vals - min_vals) + return normalized_params.tolist() + + def actual_parameters_from_normalized(self, params): + actual_params = [] + channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] + for i, p in enumerate(params): + c = channels_and_others[i] + value = p * (c["max"] - c["min"]) + c["min"] + actual_params.append(value) + return actual_params + + def insert_iclamp(self): + self.stim = self.h.IClamp(self.cell.soma[0](0.5)) + + def set_iclamp_params(self, amp, delay, dur): + self.stim.amp = amp + self.stim.delay = delay + self.stim.dur = dur + + def calculate_feature_errors(self, t_ms, v, i): + # Special case checks and penalty values + minimum_num_spikes = 2 + missing_penalty_value = 20.0 + max_fail_penalty = 250.0 + min_fail_penalty = 75.0 + overkill_reduction = 0.75 + variance_factor = 0.1 + + fail_trace = False + + delay = self.stim.delay * 1e-3 + duration = self.stim.dur * 1e-3 + t = t_ms * 1e-3 + feature_names = self.description.data['features'] + + # penalize for failing to return to rest + start_index = np.flatnonzero(t >= delay)[0] + if np.abs(v[-1] - v[:start_index].mean()) > 2.0: + fail_trace = True + else: + swp = EphysSweepFeatureExtractor(t, v, i, start=0, end=delay, filter=None) + swp.process_spikes() + if swp.sweep_feature("avg_rate") > 0: + fail_trace = True + + target_features = self.description.data['target_features'] + target_features_dict = {f["name"]: {"mean": f["mean"], "stdev": f["stdev"]} for f in target_features} + + if not fail_trace: + swp = EphysSweepFeatureExtractor(t, v, i, start=delay, end=(delay + duration), filter=None) + swp.process_spikes() + if len(swp.spikes()) < minimum_num_spikes: # Enough spikes? + fail_trace = True + else: + avg_per_spike_peak_error = np.mean([abs(spk["peak_v"] - target_features_dict["peak_v"]["mean"]) for spk in swp.spikes()]) + avg_overall_error = abs(target_features_dict["peak_v"]["mean"] - swp.spike_feature("peak_v").mean()) + if avg_per_spike_peak_error > 3.0 * avg_overall_error: # Weird bi-modality of spikes; 3.0 is arbitrary + fail_trace = True + + if fail_trace: + variance_start = np.flatnonzero(t >= delay - 0.1)[0] + variance_end = np.flatnonzero(t >= (delay + duration) / 2.0)[0] + trace_variance = v[variance_start:variance_end].var() + error_value = max(max_fail_penalty - trace_variance * variance_factor, min_fail_penalty) + errs = np.ones(len(feature_names)) * error_value + else: + errs = [] + + # Calculate additional features not done by swp.process_spikes() + baseline_v = swp.sweep_feature("v_baseline") + other_features = {} + threshold_t = swp.spike_feature("threshold_t") + fast_trough_t = swp.spike_feature("fast_trough_t") + slow_trough_t = swp.spike_feature("slow_trough_t") + + delta_t = slow_trough_t - fast_trough_t + delta_t[np.isnan(delta_t)] = 0. + other_features["slow_trough_delta_time"] = np.mean(delta_t[:-1] / np.diff(threshold_t)) + + fast_trough_v = swp.spike_feature("fast_trough_v") + slow_trough_v = swp.spike_feature("slow_trough_v") + delta_v = fast_trough_v - slow_trough_v + delta_v[np.isnan(delta_v)] = 0. + other_features["slow_trough_delta_v"] = delta_v.mean() + + for f in feature_names: + target_mean = target_features_dict[f]['mean'] + target_stdev = target_features_dict[f]['stdev'] + + if target_stdev == 0: + print("Feature with 0 stdev: ", f) + + if f in swp.spike_feature_keys(): + model_mean = swp.spike_feature(f).mean() + elif f in swp.sweep_feature_keys(): + model_mean = swp.sweep_feature(f) + elif f in other_features: + model_mean = other_features[f] + else: + model_mean = np.nan + + if np.isnan(model_mean): + errs.append(missing_penalty_value) + else: + errs.append(np.abs((model_mean - target_mean) / target_stdev)) + + errs = np.array(errs) + return errs + + def record_values(self): + v_vec = self.h.Vector() + t_vec = self.h.Vector() + i_vec = self.h.Vector() + + v_vec.record(self.cell.soma[0](0.5)._ref_v) + i_vec.record(self.stim._ref_amp) + t_vec.record(self.h._ref_t) + + return v_vec, i_vec, t_vec diff --git a/internal/model/biophysical/ephys_utils.py b/internal/model/biophysical/ephys_utils.py new file mode 100644 index 0000000000..1f02307d76 --- /dev/null +++ b/internal/model/biophysical/ephys_utils.py @@ -0,0 +1,39 @@ +import numpy as np + +def get_sweep_v_i_t_from_set(data_set, sweep_number): + sweep_data = data_set.get_sweep(sweep_number) + i = sweep_data["stimulus"] # in A + v = sweep_data["response"] # in V + i *= 1e12 # to pA + v *= 1e3 # to mV + sampling_rate = sweep_data["sampling_rate"] # in Hz + t = np.arange(0, len(v)) * (1.0 / sampling_rate) + return v, i, t + +def get_sweeps_of_type(sweep_type, sweeps): + sweeps = [ s for s in sweeps if s['ephys_stimulus']['description'].startswith( sweep_type )] + sweep_numbers = [ s['sweep_number'] for s in sweeps ] + statuses = [ s['workflow_state'] for s in sweeps ] + + return sweeps, sweep_numbers, statuses + +def get_step_stim_characteristics(i, t): + # Assumes that there is a test pulse followed by the stimulus step + di = np.diff(i) + up_idx = np.flatnonzero(di > 0) + down_idx = np.flatnonzero(di < 0) + + # second step is the stimulus + if len(up_idx) < 2 or len(down_idx) < 2: + return (np.nan, np.nan, np.nan, np.nan, np.nan) + + if up_idx[1] < down_idx[1]: # positive step + start_idx = up_idx[1] + 1 # shift by one to compensate for diff() + end_idx = down_idx[1] + 1 + else: # negative step + start_idx = down_idx[1] + 1 + end_idx = up_idx[1] + 1 + stim_start = float(t[start_idx]) + stim_dur = float(t[end_idx] - t[start_idx]) + stim_amp = float(i[start_idx]) + return (stim_start, stim_dur, stim_amp, start_idx, end_idx) diff --git a/internal/model/biophysical/fit_stage_1.py b/internal/model/biophysical/fit_stage_1.py new file mode 100644 index 0000000000..2b169c0bfd --- /dev/null +++ b/internal/model/biophysical/fit_stage_1.py @@ -0,0 +1,397 @@ +import os +import sys +import allensdk.internal.model.biophysical.ephys_utils as ephys_utils +from . import check_fi_shift +import pandas as pd +import numpy as np +from collections import Counter +import subprocess + +from allensdk.ephys.ephys_extractor \ + import EphysSweepFeatureExtractor, EphysSweepSetFeatureExtractor +import allensdk.core.json_utilities as ju +from allensdk.core.nwb_data_set import NwbDataSet +import allensdk.internal.model.biophysical.optimize as optimize +import logging + +SEEDS = [1234, 1001, 4321, 1024, 2048] +FIT_BASE_DIR = os.path.join(os.path.dirname(__file__), "fits") +APICAL_DENDRITE_TYPE = 4 +MPIEXEC = 'mpiexec' +DEFAULT_NUM_PROCESSES = 240 + +_fit_stage_1_log = logging.getLogger('allensdk.model.biophysical.fit_stage_1') + +def find_core1_trace(data_set, all_sweeps): + sweep_type = "C1LSCOARSE" + _, sweeps, statuses = ephys_utils.get_sweeps_of_type(sweep_type, all_sweeps) + sweep_status = dict(zip(sweeps, statuses)) + + sweep_info = {} + for s in sweeps: + if sweep_status[s][-6:] == "failed": + continue + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) + if np.all(v[-100:] == 0): # Check for early termination of sweep + continue + stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) + swp = EphysSweepFeatureExtractor(t, v, i, start=stim_start, end=(stim_start + stim_dur)) + swp.process_spikes() + isi_cv = swp.sweep_feature("isi_cv", allow_missing=True) + sweep_info[s] = {"amp": stim_amp, + "n_spikes": len(swp.spikes()), + "quality": is_trace_good_quality(v, i, t), + "isi_cv": isi_cv} + + rheobase_amp = 1e12 + for s in sweep_info: + if sweep_info[s]["amp"] < rheobase_amp and sweep_info[s]["n_spikes"] > 0: + rheobase_amp = sweep_info[s]["amp"] + sweep_to_use_amp = 1e12 + sweep_to_use_isi_cv = 1e121 + sweep_to_use = -1 + for s in sweep_info: + if sweep_info[s]["quality"] and sweep_info[s]["amp"] >= 39.0 + rheobase_amp and sweep_info[s]["isi_cv"] < 1.2 * sweep_to_use_isi_cv: + use_new_sweep = False + if sweep_to_use_isi_cv > 0.3 and ((sweep_to_use_isi_cv - sweep_info[s]["isi_cv"]) / sweep_to_use_isi_cv) >= 0.2: + use_new_sweep = True + elif sweep_info[s]["amp"] < sweep_to_use_amp: + use_new_sweep = True + if use_new_sweep: + _fit_stage_1_log.info("now using sweep" + str(s)) + sweep_to_use = s + sweep_to_use_amp = sweep_info[s]["amp"] + sweep_to_use_isi_cv = sweep_info[s]["isi_cv"] + + if sweep_to_use == -1: + _fit_stage_1_log.warn("Could not find appropriate core 1 sweep!") + return [] + else: + return [sweep_to_use] + +def find_core2_trace(data_set, all_sweeps): + sweep_type = "C2SQRHELNG" + _, sweeps, statuses = ephys_utils.get_sweeps_of_type(sweep_type, all_sweeps) + sweep_status = dict(zip(sweeps, statuses)) + amp_list = [] + core2_amps = {} + for s in sweeps: + if sweep_status[s][-6:] == "failed": + continue + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) + if np.all(v[-100:] == 0): + continue + stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) + if stim_start is np.nan: + sweep_status[s] = "manual_failed" + continue + core2_amps[s] = stim_amp + amp_list.append(stim_amp) + core2_amp_counter = Counter(amp_list) + common_amps = core2_amp_counter.most_common(3) + best_amp = 0 + best_n_good = -1 + for amp, _ in common_amps: + n_good = 0 + for k in core2_amps: + if core2_amps[k] == amp and sweep_status[k][-6:] == "passed": + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, k) + if is_trace_good_quality(v, i, t): + n_good += 1 + if n_good > best_n_good: + best_n_good = n_good + best_amp = amp + elif n_good == best_n_good and amp < best_amp: + best_amp = amp + if best_n_good <= 1: + return [] + else: + sweeps_to_fit = [] + for k in core2_amps: + if core2_amps[k] == best_amp and sweep_status[k][-6:] == "passed": + sweeps_to_fit.append(k) + return sweeps_to_fit + +def is_trace_good_quality(v, i, t): + stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) + swp = EphysSweepFeatureExtractor(t, v, i, start=stim_start, end=(stim_start + stim_dur)) + swp.process_spikes() + + spikes = swp.spikes() + rate = swp.sweep_feature("avg_rate") + + if rate < 5.0: + return False + + time_to_end = stim_start + stim_dur - spikes[-1]["threshold_t"] + avg_end_isi = (((spikes[-1]["threshold_t"] - spikes[-2]["threshold_t"]) + + (spikes[-2]["threshold_t"] - spikes[-3]["threshold_t"])) / 2.0) + + if time_to_end > 2 * avg_end_isi: + return False + + isis = np.diff([spk["threshold_t"] for spk in spikes]) + if check_for_pause(isis): + return False + + return True + + +def check_for_pause(isis): + if len(isis) <= 2: + return False + + for i, isi in enumerate(isis[1:-1]): + if isi > 3 * isis[i + 1 - 1] and isi > 3 * isis[i + 1 + 1]: + return True + return False + + +def collect_target_features(ft): + min_std_dict = { + 'avg_rate': 0.5, + 'adapt': 0.001, + 'peak_v': 2.0, + 'trough_v': 2.0, + 'fast_trough_v': 2.0, + 'slow_trough_delta_v': 2.0, + 'slow_trough_delta_time': 0.05, + 'latency': 5.0, + 'isi_cv': 0.1, + 'mean_isi': 0.5, + 'first_isi': 1.0, + 'time_to_end': 50.0, + 'v_baseline': 2.0, + 'width': 0.0001, + 'upstroke': 50.0, + 'downstroke': 50.0, + 'upstroke_v': 2.0, + 'downstroke_v': 2.0, + 'threshold_v': 2.0, + 'peak_to_fast_tr_time': 0.0005, + 'phase_slope': 5.0, + } + + target_features = [] + for k in ft: + t = {"name": k, "mean": ft[k]["mean"], "stdev": ft[k]["stdev"]} + if k in min_std_dict and min_std_dict[k] > ft[k]["stdev"]: + t["stdev"] = min_std_dict[k] + target_features.append(t) + return target_features + + +def prepare_stage_1(description, passive_fit_data): + output_directory = description.manifest.get_path('WORKDIR') + neuronal_model_data = ju.read(description.manifest.get_path('neuronal_model_data')) + specimen_data = neuronal_model_data['specimen'] + specimen_id = neuronal_model_data['specimen_id'] + is_spiny = not any(t['name'] == u'dendrite type - aspiny' for t in specimen_data['specimen_tags']) + all_sweeps = specimen_data['ephys_sweeps'] + data_set = NwbDataSet(description.manifest.get_path('stimulus_path')) + swc_path = description.manifest.get_path('MORPHOLOGY') + + if not os.path.exists(output_directory): + os.makedirs(output_directory) + + ra = passive_fit_data['ra'] + cm1 = passive_fit_data['cm1'] + cm2 = passive_fit_data['cm2'] + + # Check for fi curve shift to decide to use core1 or core2 + fi_shift, n_core2 = check_fi_shift.estimate_fi_shift(data_set, all_sweeps) + fi_shift_threshold = 30.0 + sweeps_to_fit = [] + if abs(fi_shift) > fi_shift_threshold: + _fit_stage_1_log.info("FI curve shifted; using Core 1") + sweeps_to_fit = find_core1_trace(data_set, all_sweeps) + else: + sweeps_to_fit = find_core2_trace(data_set, all_sweeps) + + if sweeps_to_fit == []: + _fit_stage_1_log.info("Not enough good Core 2 traces; using Core 1") + sweeps_to_fit = find_core1_trace(data_set, all_sweeps) + + _fit_stage_1_log.debug("will use sweeps: " + str(sweeps_to_fit)) + + jxn = -14.0 + + t_set = [] + v_set = [] + i_set = [] + for s in sweeps_to_fit: + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) + v += jxn + stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) + t_set.append(t) + v_set.append(v) + i_set.append(i) + ext = EphysSweepSetFeatureExtractor(t_set, v_set, i_set, start=stim_start, end=(stim_start + stim_dur)) + ext.process_spikes() + + ft = {} + blacklist = ["isi_type"] + for k in ext.sweeps()[0].spike_feature_keys(): + if k in blacklist: + continue + pair = {} + pair["mean"] = float(ext.spike_feature_averages(k).mean()) + pair["stdev"] = float(ext.spike_feature_averages(k).std()) + ft[k] = pair + + # "Delta" features + sweep_avg_slow_trough_delta_time = [] + sweep_avg_slow_trough_delta_v = [] + sweep_avg_peak_trough_delta_time = [] + for swp in ext.sweeps(): + threshold_t = swp.spike_feature("threshold_t") + fast_trough_t = swp.spike_feature("fast_trough_t") + slow_trough_t = swp.spike_feature("slow_trough_t") + + delta_t = slow_trough_t - fast_trough_t + delta_t[np.isnan(delta_t)] = 0. + sweep_avg_slow_trough_delta_time.append(np.mean(delta_t[:-1] / np.diff(threshold_t))) + + fast_trough_v = swp.spike_feature("fast_trough_v") + slow_trough_v = swp.spike_feature("slow_trough_v") + delta_v = fast_trough_v - slow_trough_v + delta_v[np.isnan(delta_v)] = 0. + sweep_avg_slow_trough_delta_v.append(delta_v.mean()) + + ft["slow_trough_delta_time"] = {"mean": float(np.mean(sweep_avg_slow_trough_delta_time)), + "stdev": float(np.std(sweep_avg_slow_trough_delta_time))} + ft["slow_trough_delta_v"] = {"mean": float(np.mean(sweep_avg_slow_trough_delta_v)), + "stdev": float(np.std(sweep_avg_slow_trough_delta_v))} + + baseline_v = float(ext.sweep_features("v_baseline").mean()) + passive_fit_data["e_pas"] = baseline_v + for k in ext.sweeps()[0].sweep_feature_keys(): + pair = {} + pair["mean"] = float(ext.sweep_features(k).mean()) + pair["stdev"] = float(ext.sweep_features(k).std()) + ft[k] = pair + + # Determine highest step to check for depolarization block + noise_1_sweeps, _, _ = ephys_utils.get_sweeps_of_type("C1NSSEED_1", all_sweeps) + noise_2_sweeps, _, _ = ephys_utils.get_sweeps_of_type("C1NSSEED_2", all_sweeps) + step_sweeps, _, _ = ephys_utils.get_sweeps_of_type("C1LSCOARSE", all_sweeps) + all_sweeps = noise_1_sweeps + noise_2_sweeps + step_sweeps + max_i = 0 + for s in all_sweeps: + try: + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s['sweep_number']) + except: + pass + if np.max(i) > max_i: + max_i = np.max(i) + max_i += 10 # add 10 pA + max_i *= 1e-3 # convert to nA + + # ----------- Generate output and submit jobs --------------- + + # Set up directories + # Decide which fit(s) we are doing + if (is_spiny and ft["width"]["mean"] < 0.8) or (not is_spiny and ft["width"]["mean"] > 0.8): + fit_types = ["f6", "f12"] + elif is_spiny: + fit_types = ["f6"] + else: + fit_types = ["f12"] + + for fit_type in fit_types: + fit_type_dir = os.path.join(output_directory, fit_type) + if not os.path.exists(fit_type_dir): + os.makedirs(fit_type_dir) + for seed in SEEDS: + seed_dir = "{:s}/s{:d}".format(fit_type_dir, seed) + if not os.path.exists(seed_dir): + os.makedirs(seed_dir) + + # Collect and save data for target.json file + target_dict = {} + target_dict["passive"] = [{ + "ra": ra, + "cm": { "soma": cm1, "axon": cm1, "dend": cm2 }, + "e_pas": baseline_v + }] + + swc_data = pd.read_table(swc_path, sep='\s', comment='#', header=None) + has_apic = False + if APICAL_DENDRITE_TYPE in pd.unique(swc_data[1]): + has_apic = True + _fit_stage_1_log.info("Has apical dendrite") + else: + _fit_stage_1_log.info("Does not have apical dendrite") + + if has_apic: + target_dict["passive"][0]["cm"]["apic"] = cm2 + + target_dict["fitting"] = [{ + "junction_potential": jxn, + "sweeps": sweeps_to_fit, + "passive_fit_info": passive_fit_data, + "max_stim_test_na": max_i, + }] + + target_dict["stimulus"] = [{ + "amplitude": 1e-3 * stim_amp, + "delay": 1000.0, + "duration": 1e3 * stim_dur + }] + + target_dict["manifest"] = [] + target_dict["manifest"].append({"type": "file", "spec": swc_path, "key": "MORPHOLOGY"}) + + target_dict["target_features"] = collect_target_features(ft) + + target_file = os.path.join(output_directory, 'target.json') + ju.write(target_file, target_dict) + + # Create config.json for each fit type + config_base_data = ju.read(os.path.join(FIT_BASE_DIR, + 'config_base.json')) + + + jobs = [] + for fit_type in fit_types: + config = config_base_data.copy() + fit_type_dir = os.path.join(output_directory, fit_type) + config_path = os.path.join(fit_type_dir, "config.json") + + config["biophys"][0]["model_file"] = [ target_file, config_path] + if has_apic: + fit_style_file = os.path.join(FIT_BASE_DIR, 'fit_styles', '%s_fit_style.json' % (fit_type)) + else: + fit_style_file = os.path.join(FIT_BASE_DIR, "fit_styles", "%s_noapic_fit_style.json" % (fit_type)) + + config["biophys"][0]["model_file"].append(fit_style_file) + config["manifest"].append({"type": "dir", "spec": fit_type_dir, "key": "FITDIR"}) + ju.write(config_path, config) + + for seed in SEEDS: + logfile = os.path.join(output_directory, fit_type, 's%d' % seed, 'stage_1.log') + jobs.append({ + 'config_path': os.path.abspath(config_path), + 'fit_type': fit_type, + 'log': os.path.abspath(logfile), + 'seed': seed, + 'num_processes': DEFAULT_NUM_PROCESSES + }) + return jobs + + +def run_stage_1(jobs): + for job in jobs: + args = [MPIEXEC, + '-np', + str(job['num_processes']), + sys.executable, + '-m', + optimize.__name__, + str(job['seed']), + job['config_path'], + str(optimize.DEFAULT_NGEN), + str(optimize.DEFAULT_MU)] + _fit_stage_1_log.debug(args) + with open(job['log'], "w") as outfile: + subprocess.call(args, stdout=outfile) \ No newline at end of file diff --git a/internal/model/biophysical/fit_stage_2.py b/internal/model/biophysical/fit_stage_2.py new file mode 100644 index 0000000000..380ae9e9f0 --- /dev/null +++ b/internal/model/biophysical/fit_stage_2.py @@ -0,0 +1,115 @@ +import argparse +import os +import sys +import subprocess +import logging +import numpy as np +import allensdk.core.json_utilities as json_utilities +from .fit_stage_1 import SEEDS, FIT_BASE_DIR, MPIEXEC +import allensdk.internal.model.biophysical.optimize as optimize + +FIT_TYPES = {"f6": "f9", "f12": "f13"} +DEFAULT_NUM_PROCESSES = 240 + +_fit_stage_2_log = logging.getLogger('allensdk.model.biophysical.fit_stage_2') + +def prepare_stage_2(output_directory): + config_base_data = json_utilities.read(os.path.join(FIT_BASE_DIR, 'config_base.json')) + + jobs = [] + + for fit_type in FIT_TYPES: + best_error = 1e12 + best_seed = 0 + + fit_type_dir = os.path.join(output_directory, fit_type) + + if not os.path.exists(fit_type_dir): + _fit_stage_2_log.debug("fit type directory does not exist for cell: %s" % fit_type_dir) + continue + + for seed in SEEDS: + hof_fit_file = os.path.join(fit_type_dir, "s%d" % seed, "final_hof_fit.txt") + if not os.path.exists(hof_fit_file): + _fit_stage_2_log.debug("hof fit file does not exist for seed: %d" % (seed)) + continue + + hof_fit = np.loadtxt(hof_fit_file) + best_for_seed = np.min(hof_fit) + if best_for_seed < best_error: + best_seed = seed + best_error = best_for_seed + + _fit_stage_2_log.debug("Best error for fit type %s is %f for seed %d" % (fit_type, best_error, best_seed)) + + start_pop_file = os.path.join(fit_type_dir, "s%d" % best_seed, "final_hof.txt") + new_fit_type_dir = os.path.join(output_directory, FIT_TYPES[fit_type]) + + for seed in SEEDS: + seed_dir = os.path.join(new_fit_type_dir, "s%d" % seed) + if not os.path.exists(seed_dir): + os.makedirs(seed_dir) + + target_file = os.path.join(output_directory, "target.json") + target_data = json_utilities.read(target_file) + has_apic = "apic" in target_data["passive"][0]["cm"] + + config = config_base_data.copy() + config_path = os.path.join(new_fit_type_dir, "config.json") + config["biophys"][0]["model_file"] = [ target_file, config_path] + + if has_apic: + fit_style_file = os.path.join(FIT_BASE_DIR, "fit_styles", FIT_TYPES[fit_type] + "_fit_style.json") + else: + fit_style_file = os.path.join(FIT_BASE_DIR, "fit_styles", FIT_TYPES[fit_type] + "_noapic_fit_style.json") + config["biophys"][0]["model_file"].append( fit_style_file ) + + config["manifest"].append({"type": "dir", "spec": new_fit_type_dir, "key": "FITDIR"}) + config["manifest"].append({"type": "file", "spec": start_pop_file, "key": "STARTPOP"}) + + json_utilities.write(config_path, config) + + for seed in SEEDS: + logfile = os.path.join(new_fit_type_dir, 's%d' % seed, 'stage_2.log') + + jobs.append({ + 'config_path': os.path.abspath(config_path), + 'fit_type': fit_type, + 'log': os.path.abspath(logfile), + 'seed': seed, + 'num_processes': DEFAULT_NUM_PROCESSES + }) + + return jobs + + +def run_stage_2(jobs): + for job in jobs: + args = [MPIEXEC, + '-np', str(job['num_processes']), + sys.executable, + '-m', + optimize.__name__, + str(job['seed']), + job['config_path'], + str(optimize.DEFAULT_NGEN), + str(optimize.DEFAULT_MU)] + _fit_stage_2_log.debug(args) + with open(job['log'], "w") as outfile: + subprocess.call(args, stdout=outfile) + + +def main(): + parser = argparse.ArgumentParser(description='Set up DEAP-style fit for second stage') + parser.add_argument('--output_dir', required=True) + parser.add_argument('specimen_id', type=int) + args = parser.parse_args() + + output_directory = os.path.join(args.output_dir, 'specimen_%d' % args.specimen_id) + + jobs = prepare_stage_2(output_directory) + run_stage_2(jobs) + +if __name__ == "__main__": + main() + diff --git a/internal/model/biophysical/fits/__init__.py b/internal/model/biophysical/fits/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/model/biophysical/fits/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/fits/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86a12a4eb5c70459d41eddffc6374747bc14e906 GIT binary patch literal 208 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VGY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iB59c=#rpB_nR%Hd@$q^E UmA5!-fQm|UQtd!a`V7Pj0I~Euk^lez literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/fits/config_base.json b/internal/model/biophysical/fits/config_base.json new file mode 100644 index 0000000000..095655e3f0 --- /dev/null +++ b/internal/model/biophysical/fits/config_base.json @@ -0,0 +1,25 @@ +{ + "biophys": [{ + "log_config_path": "logging.conf", + "model_file": [] + }], + "neuron": [{ + "hoc": [ + "stdgui.hoc", + "import3d.hoc", + "cell.hoc" + ] + }], + "manifest": [ + { + "type": "dir", + "spec": ".", + "key": "BASEDIR" + }, + { + "type": "dir", + "spec": "modfiles", + "key": "MODFILE_DIR" + } + ] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/__init__.py b/internal/model/biophysical/fits/fit_styles/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/model/biophysical/fits/fit_styles/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/fits/fit_styles/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edf44671971b0e277c2f347f893d317367cb87af GIT binary patch literal 219 zcmYL@Jqp4=5QR5jA%X|7Fe&Ur#Gh7d#BL!>vZGnDPC{l?QVQP0$}8D=1UoBd1@Xar z^TT^Ei+;bSM0C4A=+A(kA{k~<+z}YHQG;lGS4}wo@xCs{ddt|bh5}5S!5OI4bAr4g z10#)eVqMipoC~YEXj!jprrCNN){vL5N69)T4pSzUJT?R_IaCH+lG$&<=5pCt&jBg> Z)*&ZpYDu;<uG>d<BL1VpY549Xr9O}xK@tD} literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/fits/fit_styles/f12_fit_style.json b/internal/model/biophysical/fits/fit_styles/f12_fit_style.json new file mode 100644 index 0000000000..0397c4ddeb --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f12_fit_style.json @@ -0,0 +1,43 @@ +{ + "fit_name": "f12", + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width" + ], + "channels": [ + { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, + { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, + { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3 }, + { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } + ], + "addl_params": [ + { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, + { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, + { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "apic", "mechanism": "", "min": 1e-7, "max": 1e-3 } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json b/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json new file mode 100644 index 0000000000..0483b09fe1 --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json @@ -0,0 +1,42 @@ +{ + "fit_name": "f12", + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width" + ], + "channels": [ + { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, + { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, + { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3}, + { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } + ], + "addl_params": [ + { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, + { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, + { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/f13_fit_style.json b/internal/model/biophysical/fits/fit_styles/f13_fit_style.json new file mode 100644 index 0000000000..0b6b75f32f --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f13_fit_style.json @@ -0,0 +1,48 @@ +{ + "fit_name": "f13", + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width", + "adapt", + "latency", + "isi_cv", + "mean_isi", + "first_isi" + ], + "channels": [ + { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, + { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, + { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3 }, + { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } + ], + "addl_params": [ + { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, + { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, + { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "apic", "mechanism": "", "min": 1e-7, "max": 1e-3 } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json b/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json new file mode 100644 index 0000000000..77c9017c84 --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json @@ -0,0 +1,47 @@ +{ + "fit_name": "f13", + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width", + "adapt", + "latency", + "isi_cv", + "mean_isi", + "first_isi" + ], + "channels": [ + { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, + { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, + { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, + { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, + { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3 }, + { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } + ], + "addl_params": [ + { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, + { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, + { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, + { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/f6_fit_style.json b/internal/model/biophysical/fits/fit_styles/f6_fit_style.json new file mode 100644 index 0000000000..e9c7497fa4 --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f6_fit_style.json @@ -0,0 +1,139 @@ +{ + "fit_name": "f6", + "channels": [ + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Im", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ih", + "min": 0 + }, + { + "max": 15, + "section": "soma", + "parameter": "gbar", + "mechanism": "NaTs", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Nap", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_P", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_T", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "SK", + "min": 0 + }, + { + "max": 3.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "Kv3_1", + "min": 0 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_HVA", + "min": 0 + }, + { + "max": 0.01, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_LVA", + "min": 0 + } + ], + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width" + ], + "addl_params": [ + { + "max": 0.05, + "section": "soma", + "parameter": "gamma", + "mechanism": "CaDynamics", + "min": 0 + }, + { + "max": 1000, + "section": "soma", + "parameter": "decay", + "mechanism": "CaDynamics", + "min": 20 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "axon", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "dend", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "apic", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json b/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json new file mode 100644 index 0000000000..abb8064bdb --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json @@ -0,0 +1,132 @@ +{ + "fit_name": "f6", + "channels": [ + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Im", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ih", + "min": 0 + }, + { + "max": 15, + "section": "soma", + "parameter": "gbar", + "mechanism": "NaTs", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Nap", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_P", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_T", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "SK", + "min": 0 + }, + { + "max": 3.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "Kv3_1", + "min": 0 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_HVA", + "min": 0 + }, + { + "max": 0.01, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_LVA", + "min": 0 + } + ], + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width" + ], + "addl_params": [ + { + "max": 0.05, + "section": "soma", + "parameter": "gamma", + "mechanism": "CaDynamics", + "min": 0 + }, + { + "max": 1000, + "section": "soma", + "parameter": "decay", + "mechanism": "CaDynamics", + "min": 20 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "axon", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "dend", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/f9_fit_style.json b/internal/model/biophysical/fits/fit_styles/f9_fit_style.json new file mode 100644 index 0000000000..3e28b72c8a --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f9_fit_style.json @@ -0,0 +1,144 @@ +{ + "fit_name": "f9", + "channels": [ + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Im", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ih", + "min": 0 + }, + { + "max": 15, + "section": "soma", + "parameter": "gbar", + "mechanism": "NaTs", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Nap", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_P", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_T", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "SK", + "min": 0 + }, + { + "max": 3.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "Kv3_1", + "min": 0 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_HVA", + "min": 0 + }, + { + "max": 0.01, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_LVA", + "min": 0 + } + ], + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width", + "adapt", + "latency", + "isi_cv", + "mean_isi", + "first_isi" + ], + "addl_params": [ + { + "max": 0.05, + "section": "soma", + "parameter": "gamma", + "mechanism": "CaDynamics", + "min": 0 + }, + { + "max": 1000, + "section": "soma", + "parameter": "decay", + "mechanism": "CaDynamics", + "min": 20 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "axon", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "dend", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "apic", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json b/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json new file mode 100644 index 0000000000..41b60df685 --- /dev/null +++ b/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json @@ -0,0 +1,137 @@ +{ + "fit_name": "f9", + "channels": [ + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Im", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ih", + "min": 0 + }, + { + "max": 15, + "section": "soma", + "parameter": "gbar", + "mechanism": "NaTs", + "min": 0 + }, + { + "max": 0.1, + "section": "soma", + "parameter": "gbar", + "mechanism": "Nap", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_P", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "K_T", + "min": 0 + }, + { + "max": 1.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "SK", + "min": 0 + }, + { + "max": 3.0, + "section": "soma", + "parameter": "gbar", + "mechanism": "Kv3_1", + "min": 0 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_HVA", + "min": 0 + }, + { + "max": 0.01, + "section": "soma", + "parameter": "gbar", + "mechanism": "Ca_LVA", + "min": 0 + } + ], + "features": [ + "avg_rate", + "peak_v", + "fast_trough_v", + "slow_trough_delta_v", + "slow_trough_delta_time", + "v_baseline", + "width", + "adapt", + "latency", + "isi_cv", + "mean_isi", + "first_isi" + ], + "addl_params": [ + { + "max": 0.05, + "section": "soma", + "parameter": "gamma", + "mechanism": "CaDynamics", + "min": 0 + }, + { + "max": 1000, + "section": "soma", + "parameter": "decay", + "mechanism": "CaDynamics", + "min": 20 + }, + { + "max": 0.001, + "section": "soma", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "axon", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + }, + { + "max": 0.001, + "section": "dend", + "parameter": "g_pas", + "mechanism": "", + "min": 1e-07 + } + ], + "conditions": [{ + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -80 + }] +} \ No newline at end of file diff --git a/internal/model/biophysical/make_deap_fit_json.py b/internal/model/biophysical/make_deap_fit_json.py new file mode 100644 index 0000000000..ca013a1e40 --- /dev/null +++ b/internal/model/biophysical/make_deap_fit_json.py @@ -0,0 +1,208 @@ +import os.path +import numpy as np +import json, logging +from allensdk.core.nwb_data_set import NwbDataSet +import allensdk.core.json_utilities as ju +from allensdk.model.biophys_sim.config import Config +from allensdk.internal.model.biophysical import ephys_utils +from allensdk.internal.model.biophysical.deap_utils import Utils + +class Report: + _log = logging.getLogger('allensdk.model.biophysical.make_deap_fit_json') + + def __init__(self, + top_level_description, + fit_type): + self.utils = None + self.top_level_description = top_level_description + self.description = None + self.manifest = None + self.specimen_id = str(self.top_level_description.data['runs'][0]['specimen_id']) + self.fit_type = fit_type + self.target_path = self.top_level_description.manifest.get_path('target_path') + self.target = ju.read(self.target_path) + + self.seeds = [1234, 1001, 4321, 1024, 2048] + self.org_selections = [0, 100, 500, 1000] # Picks thek best, 100th best, etc. organisms as examples + self.trace_colors = ["#1b9e77", "#d95f02", "#7570b3", "#e7298a"] + + self.config_path = self.top_level_description.manifest.get_path('fit_config_json', + self.fit_type) + self.fit_config = Config().load(self.config_path) + + fit_style_path = self.fit_config.data["biophys"][0]["model_file"][-1] + + self.fit_style_info = ju.read(fit_style_path) + + self.used_features = self.fit_style_info["features"] + self.all_params = self.fit_style_info["channels"] + self.fit_style_info["addl_params"] + + nwb_path = self.top_level_description.manifest.get_path('stimulus_path') + self.data_set = NwbDataSet(nwb_path) + + self.neuronal_model_data = ju.read(self.top_level_description.manifest.get_path('neuronal_model_data')) + self.specimen_data = self.neuronal_model_data['specimen'] + self.all_sweeps = self.specimen_data['ephys_sweeps'] + + + + def best_fit_value(self): + return self.all_hof_fit_errors[self.sorted_indexes[self.org_selections[0]]] + + + def generate_fit_file(self): + self.gather_from_seeds() + self.setup_model() + self.check_org_selections_for_noise_block() + self.make_fit_json_file() + + + def make_fit_json_file(self): + json_data = {} + + # passive + json_data["passive"] = [{}] + json_data["passive"][0]["ra"] = self.target["passive"][0]["ra"] + json_data["passive"][0]["e_pas"] = self.target["passive"][0]["e_pas"] + json_data["passive"][0]["cm"] = [] + for k in self.target["passive"][0]["cm"]: + json_data["passive"][0]["cm"].append({"section": k, "cm": self.target["passive"][0]["cm"][k]}) + + # fitting + json_data["fitting"] = [{}] + json_data["fitting"][0]["sweeps"] = self.target["fitting"][0]["sweeps"] + json_data["fitting"][0]["junction_potential"] = self.target["fitting"][0]["junction_potential"] + + # conditions + json_data["conditions"] = self.fit_style_info["conditions"] + json_data["conditions"][0]["v_init"] = self.target["passive"][0]["e_pas"] + + # genome + json_data["genome"] = [] + genome_vals = self.all_hof_fits[self.sorted_indexes[self.org_selections[0]], :] + for i, p in enumerate(self.all_params): + if len(p["mechanism"]) > 0: + param_name = p["parameter"] + "_" + p["mechanism"] + else: + param_name = p["parameter"] + json_data["genome"].append({"value": genome_vals[i], + "section": p["section"], + "name": param_name, + "mechanism": p["mechanism"] + }) + + # write out file + with open(self.top_level_description.manifest.get_path('output_fit_file', + self.specimen_id, + self.fit_type), "w") as f: + json.dump(json_data, f, indent=2) + + + def setup_model(self): + morphology_path = os.path.realpath(self.top_level_description.manifest.get_path('MORPHOLOGY')) + cwd = os.path.realpath(os.curdir) + self.utils = Utils(self.fit_config) + h = self.utils.h + self.utils.generate_morphology(morphology_path) + self.utils.load_cell_parameters() + self.utils.insert_iclamp() + self.stim_params = self.fit_config.data["stimulus"][0] + self.utils.set_iclamp_params(self.stim_params["amplitude"], + self.stim_params["delay"], + self.stim_params["duration"]) + h.tstop = self.stim_params["delay"] * 2.0 + self.stim_params["duration"] + h.cvode_active(1) + h.cvode.atolscale("cai", 1e-4) + h.cvode.maxstep(10) + + + def gather_from_seeds(self): + first_created = False + for s in self.seeds: + final_hof_fit_path = \ + self.top_level_description.manifest.get_path('final_hof_fit', + self.fit_type, + s) + final_hof_path = \ + self.top_level_description.manifest.get_path('final_hof', + self.fit_type, + s) + if not os.path.exists(final_hof_fit_path): + Report._log.warn("Could not find output file %s for seed %d" % (final_hof_fit_path, s)) + continue + + hof_fit_errors = np.loadtxt(final_hof_fit_path) + hof_fits = np.loadtxt(final_hof_path) + if not first_created: + all_hof_fit_errors = hof_fit_errors.copy() + all_hof_fits = hof_fits.copy() + first_created = True + else: + all_hof_fit_errors = np.hstack([all_hof_fit_errors, hof_fit_errors]) + all_hof_fits = np.vstack([all_hof_fits, hof_fits]) + self.all_hof_fits = all_hof_fits + self.all_hof_fit_errors = all_hof_fit_errors + self.sorted_indexes = np.argsort(self.all_hof_fit_errors) + + + def check_org_selections_for_noise_block(self): + h = self.utils.h + v_vec, i_vec, t_vec = self.utils.record_values() + + depol_block_threshold = -50.0 # mV + block_min_duration = 50.0 # ms + + h.cvode_active(0) + noise_i_stim = [] + for sweep_type in ["C1NSSEED_1", "C1NSSEED_2"]: + sweeps, sweep_numbers, statuses = ephys_utils.get_sweeps_of_type(sweep_type, self.all_sweeps) + _, expt_i, expt_t = ephys_utils.get_sweep_v_i_t_from_set(self.data_set, sweep_numbers[0]) + noise_i_stim.append(expt_i) + dt = (expt_t[1] - expt_t[0]) * 1e3 + h.dt = dt + h.tstop = expt_t[-1] * 1e3 + self.utils.stim.dur = 1e12 + + for ii, org_ind in enumerate(self.sorted_indexes): + Report._log.debug("Testing org %s%s" % (ii, org_ind)) + self.utils.set_actual_parameters(self.all_hof_fits[org_ind, :]) + depol_okay = True + use_ii = -1 + for expt_i in noise_i_stim: + Report._log.debug("Running some noise") + i_stim_vec = h.Vector(expt_i * 1e-3) + i_stim_vec.play(self.utils.stim._ref_amp, dt) + h.finitialize() + h.run() + i_stim_vec.play_remove() + + v = v_vec.as_numpy() + t = t_vec.as_numpy() + i = i_vec.as_numpy() + stim_start_idx = 0 + stim_end_idx = len(t) - 1 + bool_v = np.array(v > depol_block_threshold, dtype=int) + up_indexes = np.flatnonzero(np.diff(bool_v) == 1) + down_indexes = np.flatnonzero(np.diff(bool_v) == -1) + if len(up_indexes) > len(down_indexes): + down_indexes = np.append(down_indexes, [stim_end_idx]) + + if len(up_indexes) != 0: + max_depol_duration = np.max([t[down_indexes[k]] - t[up_idx] for k, up_idx in enumerate(up_indexes)]) + if max_depol_duration > block_min_duration: + Report._log.debug("Encountered depolarization block") + depol_okay = False + break + if depol_okay: + Report._log.debug("Did not detect depolarization block on noise traces") + use_ii = ii + break + h.cvode_active(1) + self.utils.set_iclamp_params(self.stim_params["amplitude"], self.stim_params["delay"], + self.stim_params["duration"]) + self.utils.h.tstop = self.stim_params["delay"] * 2.0 + self.stim_params["duration"] + + if use_ii == -1: + Report._log.debug("Could not find an organism without depolarization block on noise.") + else: + self.org_selections = [o + use_ii for o in self.org_selections] diff --git a/internal/model/biophysical/neuron_parallel.py b/internal/model/biophysical/neuron_parallel.py new file mode 100644 index 0000000000..b3fd0c9312 --- /dev/null +++ b/internal/model/biophysical/neuron_parallel.py @@ -0,0 +1,46 @@ +from neuron import h +import logging + +_neuron_parallel_log = logging.getLogger('allensdk.model.biophysical.neuron_parallel') + +_pc = h.ParallelContext() + +def map(func, *iterables): + start_time = pc_time() + userids = [] + userid = 200 # arbitrary, but needs to be a positive integer + for args in zip(*iterables): + args2 = (list(a) for a in args) + _pc.submit(userid, func, *args2) + userids.append(userid) + userid += 1 + results = dict(working()) + end_time = pc_time() + _neuron_parallel_log.debug("Map took %s" % (str(end_time - start_time))) + return [results[userid] for userid in userids] + +def working(): + while _pc.working(): + userid = int(_pc.userid()) + ret = _pc.pyret() + yield userid, ret + +def runworker(): + _pc.runworker() + +def done(): + _pc.done() + +def pc_time(): + return _pc.time() + +def reset_neuron_library(): + ''' + See Also: https://www.neuron.yale.edu/phpBB/viewtopic.php?f=2&t=2367 + ''' + _pc.gid_clear() + + for sec in h.allsec(): + h("%s{delete_section()}" % (sec.name()) ) + + \ No newline at end of file diff --git a/internal/model/biophysical/optimize.py b/internal/model/biophysical/optimize.py new file mode 100644 index 0000000000..8044206cfe --- /dev/null +++ b/internal/model/biophysical/optimize.py @@ -0,0 +1,251 @@ +from mpi4py import MPI # needed for NEURON parallel execution +import os +from allensdk.internal.model.biophysical.deap_utils import Utils +from . import neuron_parallel +import logging +import logging.config as lc +import argparse +import random +import numpy as np +from deap import algorithms, base, creator, tools +from allensdk.model.biophys_sim.config import Config +from pkg_resources import resource_filename #@UnresolvedImport + + +BOUND_LOWER, BOUND_UPPER = 0.0, 1.0 +DEFAULT_NGEN = 500 +DEFAULT_MU = 1200 + + +_optimize_log = logging.getLogger('allensdk.model.biophysical.optimize') + + +utils = None +h = None +do_block_check = None +t_vec = None +v_ved = None +i_vec = None +stim_params = None +max_stim_amp = None +config = None +seed = None + + +def eval_param_set(params): + utils.set_normalized_parameters(params) + h.finitialize() + h.run() + feature_errors = utils.calculate_feature_errors(t_vec.as_numpy(), v_vec.as_numpy(), i_vec.as_numpy()) + min_fail_penalty = 75.0 + if do_block_check and np.sum(feature_errors) < min_fail_penalty * len(feature_errors): + if check_for_block(): + feature_errors = min_fail_penalty * np.ones_like(feature_errors) + # Reset the stimulus back + utils.set_iclamp_params(stim_params["amplitude"], stim_params["delay"], + stim_params["duration"]) + + return [np.sum(feature_errors)] + + +def check_for_block(): + utils.set_iclamp_params(max_stim_amp, stim_params["delay"], + stim_params["duration"]) + h.finitialize() + h.run() + + v = v_vec.as_numpy() + t = t_vec.as_numpy() + stim_start_idx = np.flatnonzero(t >= utils.stim.delay)[0] + stim_end_idx = np.flatnonzero(t >= utils.stim.delay + utils.stim.dur)[0] + depol_block_threshold = -50.0 # mV + block_min_duration = 50.0 # ms + long_hyperpol_threshold = -75.0 # mV + + bool_v = np.array(v > depol_block_threshold, dtype=int) + up_indexes = np.flatnonzero(np.diff(bool_v) == 1) + down_indexes = np.flatnonzero(np.diff(bool_v) == -1) + if len(up_indexes) > len(down_indexes): + down_indexes = np.append(down_indexes, [stim_end_idx]) + + if len(up_indexes) == 0: + # if it never gets high enough, that's not a good sign (meaning no spikes) + return True + else: + max_depol_duration = np.max([t[down_indexes[k]] - t[up_idx] for k, up_idx in enumerate(up_indexes)]) + if max_depol_duration > block_min_duration: + return True + + bool_v = np.array(v > long_hyperpol_threshold, dtype=int) + up_indexes = np.flatnonzero(np.diff(bool_v) == 1) + down_indexes = np.flatnonzero(np.diff(bool_v) == -1) + down_indexes = down_indexes[(down_indexes > stim_start_idx) & (down_indexes < stim_end_idx)] + if len(down_indexes) != 0: + up_indexes = up_indexes[(up_indexes > stim_start_idx) & (up_indexes < stim_end_idx) & (up_indexes > down_indexes[0])] + if len(up_indexes) < len(down_indexes): + up_indexes = np.append(up_indexes, [stim_end_idx]) + max_hyperpol_duration = np.max([t[up_indexes[k]] - t[down_idx] for k, down_idx in enumerate(down_indexes)]) + if max_hyperpol_duration > block_min_duration: + return True + return False + + +def uniform(lower, upper, size=None): + if size is None: + return [random.uniform(a, b) for a, b in zip(lower, upper)] + else: + return [random.uniform(a, b) for a, b in zip([lower] * size, [upper] * size)] + + +def best_sum(d): + return np.sum(d, axis=1).min() + + +def initPopulation(pcls, ind_init, popfile): + popdata = np.loadtxt(popfile) + return pcls(ind_init(utils.normalize_actual_parameters(line)) for line in popdata.tolist()) + + +def main(): + global utils, h, v_vec, i_vec, t_vec, do_block_check, max_stim_amp, stim_params, config, seed + parser = argparse.ArgumentParser(description='Start a DEAP testing run.') + parser.add_argument('seed', type=int) + parser.add_argument('config_path') + parser.add_argument('ngen', type=int) + parser.add_argument('mu', type=int) + args = parser.parse_args() + seed = args.seed + + # Set up NEURON + config = Config().load(args.config_path) + + if 'LOG_CFG' in os.environ: + log_config = os.environ['LOG_CFG'] + else: + log_config = resource_filename('allensdk.model.biophysical', + 'logging.conf') + os.environ['LOG_CFG'] = log_config + lc.fileConfig(log_config) + + stim_params = config.data["stimulus"][0] + + block_check_fit_types = ["f9", "f13"] + do_block_check = False + if config.data["fit_name"] in block_check_fit_types: + max_stim_amp = config.data["fitting"][0]["max_stim_test_na"] + if max_stim_amp > stim_params["amplitude"]: + _optimize_log.debug("Will check for blocks") + do_block_check = True + + utils = Utils(config) + h = utils.h + + manifest = config.manifest + morphology_path = manifest.get_path('MORPHOLOGY') + utils.generate_morphology(morphology_path.encode('ascii', 'ignore')) + utils.load_cell_parameters() + utils.insert_iclamp() + utils.set_iclamp_params(stim_params["amplitude"], stim_params["delay"], + stim_params["duration"]) + + h.tstop = stim_params["delay"] * 2.0 + stim_params["duration"] + h.cvode_active(1) + h.cvode.atolscale("cai", 1e-4) + h.cvode.maxstep(10) + + v_vec, i_vec, t_vec = utils.record_values() + + try: # Wrapping this all to catch exceptions during NEURON parallel execution + neuron_parallel.runworker() + + # Set up genetic algorithm + + _optimize_log.debug("Setting up genetic algorithm") + random.seed(seed) + + ngen = args.ngen + mu = args.mu + cxpb = 0.1 + mtpb = 0.35 + eta = 10.0 + + ndim = len(config.data["channels"]) + len(config.data["addl_params"]) + + creator.create("FitnessMin", base.Fitness, weights=(-1.0, )) + creator.create("Individual", list, fitness=creator.FitnessMin) + + toolbox = base.Toolbox() + + toolbox.register("attr_float", uniform, BOUND_LOWER, BOUND_UPPER, ndim) + toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.attr_float) + toolbox.register("population", tools.initRepeat, list, toolbox.individual) + + toolbox.register("evaluate", eval_param_set) + toolbox.register("mate", tools.cxSimulatedBinaryBounded, low=BOUND_LOWER, up=BOUND_UPPER, + eta=eta) + toolbox.register("mutate", tools.mutPolynomialBounded, low=BOUND_LOWER, up=BOUND_UPPER, + eta=eta, indpb=mtpb) + toolbox.register("variate", algorithms.varAnd) + toolbox.register("select", tools.selBest) + toolbox.register("map", neuron_parallel.map) + + stats = tools.Statistics(lambda ind: ind.fitness.values) + stats.register("min", np.min, axis=0) + stats.register("max", np.max, axis=0) + stats.register("best", best_sum) + + logbook = tools.Logbook() + logbook.header = "gen", "nevals", "min", "max", "best" + + if "STARTPOP" in manifest.path_info: + _optimize_log.debug("Using a pre-defined starting population") + start_pop_path = config.manifest.get_path("STARTPOP") + toolbox.register("population_start", initPopulation, list, creator.Individual) + pop = toolbox.population_start(start_pop_path) + else: + pop = toolbox.population(n=mu) + + invalid_ind = [ind for ind in pop if not ind.fitness.valid] + fitnesses = toolbox.map(toolbox.evaluate, invalid_ind) + + for ind, fit in zip(invalid_ind, fitnesses): + ind.fitness.values = fit + + hof = tools.HallOfFame(mu) + hof.update(pop) + + record = stats.compile(pop) + logbook.record(gen=0, nevals=len(invalid_ind), **record) + _optimize_log.debug(logbook.stream) + + for gen in range(1, ngen + 1): + offspring = toolbox.variate(pop, toolbox, cxpb, 1.0) + + invalid_ind = [ind for ind in offspring if not ind.fitness.valid] + fitnesses = toolbox.map(toolbox.evaluate, invalid_ind) + for ind, fit in zip(invalid_ind, fitnesses): + ind.fitness.values = fit + + hof.update(offspring) + + pop[:] = toolbox.select(pop + offspring, mu) + + record = stats.compile(pop) + logbook.record(gen=gen, nevals=len(invalid_ind), **record) + _optimize_log.debug(logbook.stream) + + fit_dir = config.manifest.get_path("FITDIR") + seed_dir = fit_dir + "/s{:d}/".format(seed) + np.savetxt(seed_dir + "final_pop.txt", np.array(map(utils.actual_parameters_from_normalized, pop))) + np.savetxt(seed_dir + "final_pop_fit.txt", np.array([ind.fitness.values for ind in pop])) + np.savetxt(seed_dir + "final_hof.txt", np.array(map(utils.actual_parameters_from_normalized, hof))) + np.savetxt(seed_dir + "final_hof_fit.txt", np.array([ind.fitness.values for ind in hof])) + neuron_parallel.done() + h.quit() + except RuntimeError: + _optimize_log.critical("Exception encountered during parallel NEURON execution") + MPI.COMM_WORLD.Abort() # Shut down all the processes + + +if __name__ == "__main__": + main() diff --git a/internal/model/biophysical/passive_fitting/__init__.py b/internal/model/biophysical/passive_fitting/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb1b2cce99cf52bebdc30fb2b0bb0ff8da2edd66 GIT binary patch literal 219 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg80?qY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iA_a-X#hGQP@oAYQC7F5Y f`tk9Zd6^~g@p=W7w>WHo>PvG{?Le;k48#lomcc<b literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a0a6ba1ba46cbd7cd809274df5ec81da919d8f3 GIT binary patch literal 3393 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 UGp|x|cbazlq1W(g-l}K*A98-3ApigX literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit2.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit2.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..481fabf2620b3b310652e8a7eb3987d55e64da0b GIT binary patch literal 2699 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 literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit_elec.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit_elec.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11c4e0a76f15ddf11d5294992c6d1b83e0c81642 GIT binary patch literal 2952 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 literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_utils.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23add99f3b0cd667b599aa037aede33fdbb9bf99 GIT binary patch literal 1490 zcmZuxO>Z1U5bf&u@OV8jMv3?m5(aVEAnZdf2w73Uh$s>=hbS_P7Oi@>dw0j4of&uc z+SzD)07oJxe#2Uv_)C4|<iEg)*S(1qA$ru+Gu2f!)vsRlw|DOJ7)Jf)uj03uvA_Mt zo5At&2-AEIA(^C?tYDHWHY6EIUh#s5H7X(*%cP3uNs$nfsoa2NDl@r>bwl>#7S>Gi zr>vik5i1OW^nW<SG@n6Oc0!V!a{aL+AAL@jj93T#ko+FJqoW%bvOYPQ^&^)|l^xEs zk5Z(yTIi<kQ~3OgX`F`r^Xl;H!84<@8HkyXdn0in>gC{@T8x`oiU$K#pPNC`s@jYp zn|8J|gCEM#z?4>f*^2S0m@4>I6)fcGepy?kYf<gb8>y=OQ5ihSF*L0(raV`}Noj3a zPxsg93>UVn%wD_H5z_I~WDtyclv7GUd!#)SH(uaicYa*hc3~fDF&Zg7_F6yuY5WXm zJ;IA+SL~8HTG2JT<Q-pe8+Gi8t_hgYD(<+XYknDZ!1BuLqE*t-N$U3{3s{E#zSwF; zCt6K*?W{EYjgV3C?vr`jX!}48pB^6$wGz@LWsS64WUMao+wI5Co)lYUZLFwmDXemF z2ot+(QUWtESL^CT=3-nV<-FB46lN_FoWs3SH9`*Ojc#X6)l8S$P?{Wq0icYw0aQlX zD{jH?ejAtp42_o(P&}V?Yz2~D(|7EbB0z$pUz6TF+W|ZbFh!Pk(G|!GlI?UL?T2g? zK_4%38+Y*)UB<_(&Iz<5_A{&bPppeOf@QL{JYZ)#$AA~`rALl>MN*$FguL+#)TtMt ziit~1Tb0)J0F1WgqO>y?0T1Y{E?bvOaA@04ie3|{J%rkAx7zbdf<mg2#>G`xdqA60 z<LLaqu-$EiHfs2qX6rETBLnjh1f!VmfMXoc<#>2tTgvZo{Q-7wf%JLb5_1P1zq1MX z?t7VeZUvT%p$@~N?u|deG+#jk3VP~+g2Y~-RXh5FKsk`nYd}bT5>O4~ivu+y1f`>X zs(k@H9stP2#x`w8t;olswF|AJRnM(U7p(-X`iYB$o*I{)UWApVF2;t?_YehL6HgZP z_$^Y!XvyjepQxu3<DN-9%6N}@{Ke;<&~K1KzXE*;0QU~625#ozo_7wx`dshAU4QC@ zZ$DfwK@phy-v7tB4?E+H8Rfb5H(P%*v{h&YbkNc`-k4(hb?v9?Ru6y#o(CX;<6A}d d0d@Foc7WSwQK^T%7@<?LG)1{{o^57#{{=^+U$_7O literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/output_grabber.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/output_grabber.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..492e4216279d71ea82d7c363a9f6d06405ebe24c GIT binary patch literal 1943 zcmb7F&u<(x6t+D-cCx!kOIwv9N;Rs4#2!ebQUL-)3q|b(ZBa{AX|>XHcI{+mvzeLN z-lSQ=0g)3D|HDR{xbO%0hB)<K=!x%n@~c%j;K<K!?DxF(_kGX#c6GJQ(8@o4$-@=K z{-KYP7Q(rUZf?U!Ci#pFnvoB<{}uz`$6ydVU{c87kjX%WzXpRy^2e+fzC<SLkIA02 z0M1=>^C^sCv=esWgFuQwC|6}9<3o=8mP`)WAeJk#jj<&=vWqd10rp*Us}JY4p4$gH zAB~h=+-aw1_hz{<>D(xp+A7_`T54=w%3RB|^6_b<)4Z(gL}@H(mG7+k%vU_=-yhS_ zsL@FM9=iDs=71ltj2#GAcvFC|o#-1@OaniUnPqsy;N#k`v287rBQ~V?74)`bIJD?H z*6X--rHifRw_Rc<ID=Hu1!mv4*jR~kx_Gmgsj_n2v(QcHy5qdIbFHLRFRT-labaE5 z$|Yno%4>PAD0_hmjhb!JhIB_A;|_l^eF?*>-|l@ed}5R~!+es<^-;c;m;1wS%6wb_ zsZWNg+%?0hR;3xkR`q1x48Jc%LsMAwah;F1^DTwk8BS>A_C`@!rOSM_u~SJk+ZYu- zqZnhR1{=k$$~FsYi*jqDp&%n(z}b4e?~*Jl%ED$Dq{qw}4C68W+C1T19*f1*hv#Wt zKM5am3Pq!lWa^oE1jpmgEMEfqX>derg!qc^75f>%!PB&*`!<<^n`v8$-zlmCzq9Nf zVN1KZT$9M<OoresTHNv)A%#7*xwdIT1g?}qNXI%#Wp49EOcbc;R6XuuBy1_W_0yHV z9{jyHywmSp&>bx4E{qH0yw+5JE@_wo%^~J)=?fG?w7Hc=BltBJ|LEo7+9a9=8Q0yb z^tRH+D-rartqX0jqg-TWO4U8CFVbd2eq%0^_W{fm^ak}X7Hi@n5WmRVVsZI()cu}s zhkS?~032I#0?vEKz#o5|%!m3mR-<K1ab<GAmMsr;vh*Yn*fv=b30?HnBhchu5V3f2 z4*aVAZ|qUmGBx?G@}y9Wq(zxNJ6|-<&iLu~)^vo!yJ&MZHxn1_Y3SQ^ltF^Z#*<uo z`1N%P3a3?3>i6L`yhY<#g%Tpc>T6`)B|}8M9c`4Ot?Cc4ZiovOx5XMn9tT~Kh^|;% zdK2)fKE+!g{#4?h<Kx9G3%r36Ud<!%GkL)Q-;VY5AMj9_o3Kcjh6nsJCLsUk;wj!{ z2sv0xPO*Fh1-+@>^rNa&>1f}oG`DG<l8Abz8UG93msFVjUev%9l3p9MZerdSKu>sC zLhh)WH^oUve~I3RGZLK85<Em-Tzeg>vr@nVd%w3rZ%Uc(s4R2sEW@KTpON3qvgh-B zcD&NcGFgqYO#9<d8Tfk8#85-?S+#i2mkcpM{}v3@ZW4q%6zxv(PI6V#N-y@8)h+n? hJu)|7TwIN&YHWSTxoe*8>XNUTLw-$=8QLio{{n0z;u!z{ literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/preprocess.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/preprocess.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81bd772d977f2a8865e0e622211c31e34a5083db GIT binary patch literal 2527 zcmai0&2J;O6(>2P(dheQy=%$4-7H!Jhz^yD7P$n*CQZ`z68N$$3JkOzj73VG)o4a0 zM_$|E90Di36>x!GTJ&JIy|jlO@)z_}p#MM)b1QoCzmP*VKaMP~?JQ6V<nTSd_xQf4 z4;zgt!HEC*S@4e<A^$VLdRW+efT><!;e^wO%qb(3%vrHo#cF#tU7eP^QbFZ-<>Kpl z6;V2`a&|$z8n?LpIq~Ye#2tJayv$vEo1(=lGbSgZc?!v#J|lzbCGI1;C+`MPBx1#9 z!+F9*G~5f5#s0Ah$3Zk)1WJX6!k>g`8phM%LW+e<#zLtvGu#-DFkQ@#Fx9_+<&?9} zi6$SDQ<|}qoKp?e&e;XYtkgQUxpiLB)&;$wP{hvcGkWx8>S$1ZOwQ=@zl~T{%AB-( z?rN$XUh0zzHnOsE=4KTQlV`4+9PFeO?VeK5R<oL}ai>qPmiwefvN|tkjiay9YFg9P zQ)=Ws|995ZO<slzzS3n~)y+QPZVx=bI-8_VzF>WlwQvT^)mcGR;M)g((9M-J?)1ov zol*H%8|rIGykaOfjg0o2rQpoSxy5z+{{PSYYoc2#J#?c-zE|9K3vO%pQ+<hBS|;>H zC*yf|r31a%cW_-^&Fq66-T5v(bm{2scX@#C9_&Dm4(>(FpabZx_g!8?#Or`Nr-<+d z$tr*wx}rN1WI=ZC3hEZn25#<dLe@i)-A|k6t+e@~t?%m!um6tm#s$kB@Mg9No(^!W zS?PkB7-v0$!R+b>FYf6cFQRur_2$gR+JlaLXwW~U+?kOxCjSDcVj%coD|U6ikg^4> zwjk}HzNa_zLv8W)pKTOIXLn4I%x0J*w=th#stqhtB=+-qMm6O~n%}bn!$7@zdotux z;qL`e5RZjFPxj}3Cj*wV;g52vq>)oBU;p-__eQ@`LaI@)AMoK`@G^*xM?Z~&aT4?3 zCnFIbs!_5)L5{H&l{oq&+#9Jd6+c`A<5@5j;Jqr@?J!P-jDu*qsNL-wwYz<%cDG;G z?r?GZb#*5SRXR@Qi>IbFDWjo7PTrY{)W5;$^B@g|J5hpepq^s0W;*GtOnwp^PM>`G z-tfnh?B`xxy%b{M$IJPike9}Z(k$T_*2`~Ry?XV_>8Bh2{KbDy()R~6FNHA|N0%HF z(?9*ujQ_kp1%T21U|{F&R0c8kmy5i*+VSLNoV!AegN5+Zyn5wyXfW8wS-i+gft10q zXU|0t=j~f|M9DNSak00Y=FTLM^B~PD0*VS5q#~~g)AIaf8b-?N86T`HIrKw6^(Qi! z`%0wweRG1_{qepS&wS_~q8H{R=s6X+g*NIrK>>L6aS|=(v9D6ZEN2Vu)nyVzXrjK+ z&U2m#8G^SqiGnmv;u9g0+zR$o?i>cuQmDZrul@R}LLKF~CLBf;uXQ`)lx)InUM-Bn zGz_BfMDW}S`H?i)o72ObhB-~W@^aw=tGtTw<!akmZ($FT3AcMyH49;6vW(N5zJN`K zQ-r~D&DT&%ykSJv&5ez9kcv$4TCXFuLaaj<P9|Q{@Lv%C&MWD@6ly<-xL1RpWNJJr zj__KoLR>&XdG(vHY?!;R3rd!Zfg5j1+X_z9Z?F*B#IMb4`hYsLO<l@powcb=yVyUX zTln_qWA=nT!D$;b8~8b_hqF2;yA1rS4sOHoeIt#z)U_DoFe-n58?HNs@wZW_cn&|r z25pLJg4Rc|W9S>yG^yfYTtVi{(u^~_=Ijd#51EBm{Axd8=r8teQAU@A(PhXSSh9tW zXLGnwZW)X%-!d4+L(f?S8Od@L<2&Ax4?y`dOl96}!m5Qq1$Jx@>tRZ_FvHly(E|r` z_lBrDA+YB`81I6zXeETox3SM%-#2*QAGE#gb=MlMyVe{2aoj9KcTJa<iuUH!ZuB>K z-^eecuBRv}uY_7&9IxEsEYLRsCHsb=g4Fl~L_*3A;38Uut=9_1!Cd(MUCWBRa(8g? aG7?XXFNz1?F){`}<dVbO9k=2#mwXF8$DCLI literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/neuron_passive_fit.py b/internal/model/biophysical/passive_fitting/neuron_passive_fit.py new file mode 100644 index 0000000000..97458b2b24 --- /dev/null +++ b/internal/model/biophysical/passive_fitting/neuron_passive_fit.py @@ -0,0 +1,130 @@ +import numpy as np +import argparse +import os +import allensdk.internal.model.biophysical.passive_fitting.neuron_utils as neuron_utils +import allensdk.core.json_utilities as json_utilities +from allensdk.model.biophys_sim.config import Config + +# Load the morphology + +BASEDIR = os.path.dirname(__file__)#"/data/mat/nathang/deap_optimize/passive_fitting" + + +@neuron_utils.read_neuron_fit_stdout +def neuron_passive_fit(up_data, down_data, swc_path, limit): + h = neuron_utils.get_h() + h.load_file("stdgui.hoc") + h.load_file("import3d.hoc") + neuron_utils.load_morphology(swc_path) + + for sec in h.allsec(): + sec.insert('pas') + for seg in sec: + seg.pas.e = 0 + + h.load_file(os.path.join(BASEDIR, "passive", "fixnseg.hoc")) + h.load_file(os.path.join(BASEDIR, "passive", "iclamp.ses")) + h.load_file(os.path.join(BASEDIR, "passive", "params.hoc")) + h.load_file(os.path.join(BASEDIR, "passive", "mrf.ses")) + + h.v_init = 0 + h.tstop = 100 + h.dt = 0.005 + + fit_start = 4.0025 + + v_rec = h.Vector() + t_rec = h.Vector() + v_rec.record(h.soma[0](0.5)._ref_v) + t_rec.record(h._ref_t) + + mrf = h.MulRunFitter[0] + gen0 = mrf.p.pf.generatorlist.object(0) + gen0.toggle() + fit0 = gen0.gen.fitnesslist.object(0) + + up_t = h.Vector(up_data[:, 0]) + up_v = h.Vector(up_data[:, 1]) + fit0.set_data(up_t, up_v) + fit0.boundary.x[0] = fit_start + fit0.boundary.x[1] = limit + fit0.set_w() + + gen1 = mrf.p.pf.generatorlist.object(1) + gen1.toggle() + fit1 = gen1.gen.fitnesslist.object(0) + + down_t = h.Vector(down_data[:, 0]) + down_v = h.Vector(down_data[:, 1]) + fit1.set_data(down_t, down_v) + fit1.boundary.x[0] = fit_start + fit1.boundary.x[1] = limit + fit1.set_w() + + minerr = 1e12 + for _ in range(3): + # Need to re-initialize the internal MRF variables, not top-level proxies + # for randomize() to work + mrf.p.pf.parmlist.object(0).val = 100 + mrf.p.pf.parmlist.object(1).val = 1 + mrf.p.pf.parmlist.object(2).val = 10000 + mrf.p.pf.putall() + mrf.randomize() + mrf.prun() + if mrf.opt.minerr < minerr: + fit_Ri = h.Ri + fit_Cm = h.Cm + fit_Rm = h.Rm + minerr = mrf.opt.minerr + + h.region_areas() + + return { + 'Ri': fit_Ri, + 'Cm': fit_Cm, + 'Rm': fit_Rm, + 'err': minerr + } + +def arg_parser(): + parser = argparse.ArgumentParser(description='analyze cap check sweep') + parser.add_argument('--up_file') + parser.add_argument('--down_file') + parser.add_argument('--swc_path') + parser.add_argument('--specimen_id', type=int, required=True) + parser.add_argument('--limit', type=float, required=True) + parser.add_argument('--output_file', required=True) + return parser + + +def process_inputs(parser): + args = parser.parse_args() + swc_path = args.swc_path + up_data = np.loadtxt(args.up_file) + down_data = np.loadtxt(args.down_file) + + return args, up_data, down_data, swc_path + + +def main(): + import sys + + manifest_path = sys.argv[-1] + limit = float(sys.argv[-2]) + os.chdir(os.path.dirname(manifest_path)) + app_config = Config() + description = app_config.load(manifest_path) + + upfile = description.manifest.get_path('upfile') + up_data = np.loadtxt(upfile) + downfile = description.manifest.get_path('downfile') + down_data = np.loadtxt(downfile) + swc_path = description.manifest.get_path('MORPHOLOGY') + + data = neuron_passive_fit(up_data, down_data, swc_path, limit) + output_file = description.manifest.get_path('fit_1_file') + + json_utilities.write(output_file, data) + +if __name__ == "__main__": + main() diff --git a/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py b/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py new file mode 100644 index 0000000000..1dd6fec338 --- /dev/null +++ b/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py @@ -0,0 +1,104 @@ +import numpy as np +import os +import allensdk.internal.model.biophysical.passive_fitting.neuron_utils as neuron_utils + +import allensdk.core.json_utilities as json_utilities +from allensdk.model.biophys_sim.config import Config + +# Load the morphology + +BASEDIR = os.path.dirname(__file__) + +@neuron_utils.read_neuron_fit_stdout +def neuron_passive_fit2(up_data, down_data, swc_path, limit): + h = neuron_utils.get_h() + h.load_file("stdgui.hoc") + h.load_file("import3d.hoc") + neuron_utils.load_morphology(swc_path) + + for sec in h.allsec(): + sec.insert('pas') + for seg in sec: + seg.pas.e = 0 + + h.load_file(os.path.join(BASEDIR, "passive", "fixnseg.hoc")) + h.load_file(os.path.join(BASEDIR, "passive", "iclamp.ses")) + h.load_file(os.path.join(BASEDIR, "passive", "params.hoc")) + h.load_file(os.path.join(BASEDIR, "passive", "mrf2.ses")) + + h.v_init = 0 + h.tstop = 100 + + fit_start = 4.0025 + + v_rec = h.Vector() + t_rec = h.Vector() + v_rec.record(h.soma[0](0.5)._ref_v) + t_rec.record(h._ref_t) + + mrf = h.MulRunFitter[0] + gen0 = mrf.p.pf.generatorlist.object(0) + gen0.toggle() + fit0 = gen0.gen.fitnesslist.object(0) + + up_t = h.Vector(up_data[:, 0]) + up_v = h.Vector(up_data[:, 1]) + fit0.set_data(up_t, up_v) + fit0.boundary.x[0] = fit_start + fit0.boundary.x[1] = limit + fit0.set_w() + + gen1 = mrf.p.pf.generatorlist.object(1) + gen1.toggle() + fit1 = gen1.gen.fitnesslist.object(0) + + down_t = h.Vector(down_data[:, 0]) + down_v = h.Vector(down_data[:, 1]) + fit1.set_data(down_t, down_v) + fit1.boundary.x[0] = fit_start + fit1.boundary.x[1] = limit + fit1.set_w() + + minerr = 1e12 + for _ in range(3): + # Need to re-initialize the internal MRF variables, not top-level proxies + # for randomize() to work + mrf.p.pf.parmlist.object(0).val = 1 + mrf.p.pf.parmlist.object(1).val = 10000 + mrf.randomize() + mrf.prun() + if mrf.opt.minerr < minerr: + fit_Ri = h.Ri + fit_Cm = h.Cm + fit_Rm = h.Rm + minerr = mrf.opt.minerr + + h.region_areas() + return { + 'Ri': fit_Ri, + 'Cm': fit_Cm, + 'Rm': fit_Rm, + 'err': minerr + } + +def main(): + import sys + + manifest_path = sys.argv[-1] + limit = float(sys.argv[-2]) + os.chdir(os.path.dirname(manifest_path)) + app_config = Config() + description = app_config.load(manifest_path) + + upfile = description.manifest.get_path('upfile') + up_data = np.loadtxt(upfile) + downfile = description.manifest.get_path('downfile') + down_data = np.loadtxt(downfile) + swc_path = description.manifest.get_path('MORPHOLOGY') + output_file = description.manifest.get_path('fit_2_file') + + data = neuron_passive_fit2(up_data, down_data, swc_path, limit) + + json_utilities.write(output_file, data) + +if __name__ == "__main__": main() diff --git a/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py b/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py new file mode 100644 index 0000000000..628b5f73bc --- /dev/null +++ b/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python + +import allensdk.internal.model.biophysical.passive_fitting.neuron_utils as neuron_utils +import numpy as np +import os +import allensdk.core.json_utilities as json_utilities +from allensdk.model.biophys_sim.config import Config + +# Load the morphology + +BASEDIR = os.path.dirname(__file__) + +@neuron_utils.read_neuron_fit_stdout +def neuron_passive_fit_elec(up_data, + down_data, + swc_path, + limit, + bridge, + elec_cap): + h = neuron_utils.get_h() + h.load_file("stdgui.hoc") + h.load_file("import3d.hoc") + neuron_utils.load_morphology(swc_path) + + for sec in h.allsec(): + sec.insert('pas') + for seg in sec: + seg.pas.e = 0 + + h.load_file(os.path.join(BASEDIR, "passive", "fixnseg.hoc")) + h.load_file(os.path.join(BASEDIR, "passive", "params.hoc")) + h.load_file(os.path.join(BASEDIR, "passive", "circuit.ses")) + h.load_file(os.path.join(BASEDIR, "passive", "mrf3.ses")) + + h.v_init = 0 + h.tstop = 100 + h.dt = 0.005 + + fit_start = 4.0025 + + circuit = h.LinearCircuit[0] + circuit.R2 = bridge / 2.0 + circuit.R3 = bridge / 2.0 + circuit.C4 = elec_cap * 1e-3 + + v_rec = h.Vector() + t_rec = h.Vector() + v_rec.record(h.soma[0](0.5)._ref_v) + t_rec.record(h._ref_t) + + mrf = h.MulRunFitter[0] + gen0 = mrf.p.pf.generatorlist.object(0) + gen0.toggle() + fit0 = gen0.gen.fitnesslist.object(0) + + up_t = h.Vector(up_data[:, 0]) + up_v = h.Vector(up_data[:, 1]) + fit0.set_data(up_t, up_v) + fit0.boundary.x[0] = fit_start + fit0.boundary.x[1] = limit + fit0.set_w() + + gen1 = mrf.p.pf.generatorlist.object(1) + gen1.toggle() + fit1 = gen1.gen.fitnesslist.object(0) + + down_t = h.Vector(down_data[:, 0]) + down_v = h.Vector(down_data[:, 1]) + fit1.set_data(down_t, down_v) + fit1.boundary.x[0] = fit_start + fit1.boundary.x[1] = limit + fit1.set_w() + + minerr = 1e12 + for _ in range(3): + # Need to re-initialize the internal MRF variables, not top-level proxies + # for randomize() to work + mrf.p.pf.parmlist.object(0).val = 100 + mrf.p.pf.parmlist.object(1).val = 1 + mrf.p.pf.parmlist.object(2).val = 10000 + mrf.p.pf.putall() + mrf.randomize() + mrf.prun() + if mrf.opt.minerr < minerr: + fit_Ri = h.Ri + fit_Cm = h.Cm + fit_Rm = h.Rm + minerr = mrf.opt.minerr + + h.region_areas() + return { + 'Ri': fit_Ri, + 'Cm': fit_Cm, + 'Rm': fit_Rm, + 'err': minerr + } + +def main(): + import sys + + manifest_path = sys.argv[-1] + elec_cap = float(sys.argv[-2]) + bridge = float(sys.argv[-3]) + limit = float(sys.argv[-4]) + os.chdir(os.path.dirname(manifest_path)) + app_config = Config() + description = app_config.load(manifest_path) + + upfile = description.manifest.get_path('upfile') + up_data = np.loadtxt(upfile) + downfile = description.manifest.get_path('downfile') + down_data = np.loadtxt(downfile) + swc_path = description.manifest.get_path('MORPHOLOGY') + + data = neuron_passive_fit_elec(up_data, down_data, swc_path, limit, bridge, elec_cap) + + output_file = description.manifest.get_path('fit_3_file') + json_utilities.write(output_file, data) + + +if __name__ == '__main__': main() diff --git a/internal/model/biophysical/passive_fitting/neuron_utils.py b/internal/model/biophysical/passive_fitting/neuron_utils.py new file mode 100644 index 0000000000..f3ce9d76c1 --- /dev/null +++ b/internal/model/biophysical/passive_fitting/neuron_utils.py @@ -0,0 +1,57 @@ +# in place of global from neuron import h + +def get_h(): + if get_h.h == None: + from neuron import h + get_h.h = h + return get_h.h + +get_h.h = None + +import sys, os +from .output_grabber import OutputGrabber + +def load_morphology(filename): + h = get_h() + swc = h.Import3d_SWC_read() + swc.input(str(filename)) + imprt = h.Import3d_GUI(swc, 0) + h("objref this") + imprt.instantiate(h.this) + + +def parse_neuron_output(output_str): + printed_fields = {} + + for line in output_str.split('\n'): + if line.startswith('nquad'): + continue + toks = line.split() + if len(toks) == 2: + v = toks[1].strip() + try: + v = float(v) + except: + pass + + printed_fields[toks[0].strip()] = v + + return printed_fields + + +def read_neuron_fit_stdout(func): + def call(*args, **kwargs): + + g = OutputGrabber() + g.start() + data = func(*args, **kwargs) + g.stop() + + printed_fields = parse_neuron_output(g.capturedtext) + data.update(printed_fields) + + return data + + return call + + diff --git a/internal/model/biophysical/passive_fitting/output_grabber.py b/internal/model/biophysical/passive_fitting/output_grabber.py new file mode 100644 index 0000000000..1e806964af --- /dev/null +++ b/internal/model/biophysical/passive_fitting/output_grabber.py @@ -0,0 +1,70 @@ +import os, sys, threading, time + +class OutputGrabber(object): + """ + Class used to grab standard output or another stream. + """ + escape_char = "\b" + + def __init__(self, stream=None, threaded=False): + self.origstream = stream + self.threaded = threaded + if self.origstream is None: + self.origstream = sys.stdout + self.origstreamfd = self.origstream.fileno() + self.capturedtext = "" + # Create a pipe so the stream can be captured: + self.pipe_out, self.pipe_in = os.pipe() + + + def start(self): + """ + Start capturing the stream data. + """ + self.capturedtext = "" + # Save a copy of the stream: + self.streamfd = os.dup(self.origstreamfd) + # Replace the Original stream with our write pipe + os.dup2(self.pipe_in, self.origstreamfd) + if self.threaded: + # Start thread that will read the stream: + self.workerThread = threading.Thread(target=self.readOutput) + self.workerThread.start() + # Make sure that the thread is running and os.read is executed: + time.sleep(0.01) + + + def stop(self): + """ + Stop capturing the stream data and save the text in `capturedtext`. + """ + # Flush the stream to make sure all our data goes in before + # the escape character. + self.origstream.flush() + # Print the escape character to make the readOutput method stop: + self.origstream.write(self.escape_char) + self.origstream.flush() + if self.threaded: + # wait until the thread finishes so we are sure that + # we have until the last character: + self.workerThread.join() + else: + self.readOutput() + # Close the pipe: + os.close(self.pipe_out) + # Restore the original stream: + os.dup2(self.streamfd, self.origstreamfd) + + + def readOutput(self): + """ + Read the stream data (one byte at a time) + and save the text in `capturedtext`. + """ + while True: + data = os.read(self.pipe_out, 1) # Read One Byte Only + if self.escape_char in data: + break + if not data: + break + self.capturedtext += data diff --git a/internal/model/biophysical/passive_fitting/passive/__init__.py b/internal/model/biophysical/passive_fitting/passive/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/model/biophysical/passive_fitting/passive/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/passive_fitting/passive/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ad35115f1b9faab7fb875645e2156eca1dc3165 GIT binary patch literal 227 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg80?rY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iA_a-X#hGQP@oAYQC7F5Y hFus0#d}dx|NqoFsLFFwD8=$_@oK!oID?bA<0|3gZL}&m2 literal 0 HcmV?d00001 diff --git a/internal/model/biophysical/passive_fitting/preprocess.py b/internal/model/biophysical/passive_fitting/preprocess.py new file mode 100644 index 0000000000..08cc1fe644 --- /dev/null +++ b/internal/model/biophysical/passive_fitting/preprocess.py @@ -0,0 +1,80 @@ +import allensdk.internal.model.biophysical.ephys_utils as ephys_utils +import logging +import numpy as np +import pandas as pd + +_passive_fit_log = logging.getLogger( + 'allensdk.model.biophysical.passive_fitting.preprocess') + +def get_passive_fit_data(cap_check_sweeps, data_set): + bridge_balances = [s['bridge_balance_mohm'] for s in cap_check_sweeps] + bridge_avg = np.array(bridge_balances).mean() + _passive_fit_log.debug("bridge avg {:.2f}".format(bridge_avg)) + + initialized = False + for idx, s in enumerate(cap_check_sweeps): + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, + s['sweep_number']) + if v is None: + continue + up_idxs, down_idxs = get_cap_check_indices(i) + + down_idx_interval = down_idxs[1] - down_idxs[0] + skip_count = 0 + for j in range(len(up_idxs)): + if j == 0: + avg_up = v[(up_idxs[j] - 400):down_idxs[j + 1]] + avg_down = v[(down_idxs[j] - 400):up_idxs[j]] + elif j == len(up_idxs) - 1: + avg_up = avg_up + v[(up_idxs[j] - 400):-2] + avg_down = avg_down + v[(down_idxs[j] - 400):up_idxs[j]] + else: + avg_up = avg_up + v[(up_idxs[j] - 400):down_idxs[j + 1]] + avg_down = avg_down + v[(down_idxs[j] - 400):up_idxs[j]] + avg_up /= len(up_idxs) - skip_count + avg_down /= len(up_idxs) - skip_count + if not initialized: + grand_up = avg_up - avg_up[0:400].mean() + grand_down = avg_down - avg_down[0:400].mean() + initialized = True + else: + grand_up = grand_up + (avg_up - avg_up[0:400].mean()) + grand_down = grand_down + (avg_down - avg_down[0:400].mean()) + grand_up /= len(cap_check_sweeps) + grand_down /= len(cap_check_sweeps) + + t = 0.005 * np.arange(len(grand_up)) # in ms, assumes 200kHz sampling rate] + + grand_up_data = np.column_stack((t, grand_up)) + grand_down_data = np.column_stack((t, grand_down)) + + grand_diff = (grand_up + grand_down) / grand_up + avg_grand_diff = pd.rolling_mean(pd.Series(grand_diff, index=t), 100) + threshold = 0.2 + start_index = np.flatnonzero(t >= 4.0)[0] + escape_indexes = np.flatnonzero(np.abs(avg_grand_diff.values[start_index:]) > threshold) + start_index + if len(escape_indexes) < 1: + escape_index = len(t) - 1 + else: + escape_index = escape_indexes[0] + escape_t = t[escape_index] + + return { + 'grand_up': grand_up_data, + 'grand_down': grand_down_data, + 'escape_t': escape_t, + 'bridge_avg': bridge_avg + } + +def get_cap_check_indices(i): + # Assumes that there is a test pulse followed by the stimulus pulses (downward first) + di = np.diff(i) + up_idx = np.flatnonzero(di > 0) + down_idx = np.flatnonzero(di < 0) + + return up_idx[2::2], down_idx[1::2] + + +def main(): + pass +if __name__ == "__main__": main() diff --git a/internal/model/biophysical/run_optimize.py b/internal/model/biophysical/run_optimize.py new file mode 100644 index 0000000000..6d16845116 --- /dev/null +++ b/internal/model/biophysical/run_optimize.py @@ -0,0 +1,233 @@ +import os +import shutil +import subprocess +import logging +import logging.config as lc +import allensdk.core.json_utilities as ju +from allensdk.core.nwb_data_set import NwbDataSet +from pkg_resources import resource_filename # @UnresolvedImport +from allensdk.internal.api.queries.optimize_config_reader import OptimizeConfigReader +from allensdk.model.biophys_sim.config import Config +from allensdk.internal.model.biophysical.make_deap_fit_json import Report +from allensdk.internal.api.queries.biophysical_module_api import BiophysicalModuleApi +import allensdk.model.biophysical as hoc_location +from six.moves import reduce + + +class RunOptimize(object): + _log = logging.getLogger('allensdk.internal.model.biophysical.run_optimize') + + def __init__(self, + input_json, + output_json): + self.input_json = input_json + self.output_json = output_json + self.app_config = None + self.manifest = None + self.data_set = None + + + def load_manifest(self): + self.app_config = Config().load(self.input_json) + self.manifest = self.app_config.manifest + self.data_set = NwbDataSet(self.manifest.get_path('stimulus_path')) + + + def nrnivmodl(self): + RunOptimize._log.debug("nrnivmodl") + + subprocess.call(['nrnivmodl', './modfiles']) + + + def info(self, lims_json_path): + ''' return a string that a bash script can use + to find the working directory, etc. to clean up. + ''' + ocr = OptimizeConfigReader() + ocr.read_lims_file(lims_json_path) + + print(self.app_config.data['runs'][0]['specimen_id']) + print(self.manifest.get_path('BASEDIR')) + + + def copy_local(self): + ''' + Note + ---- + For files that aren't needed for local debugging, use write_manifest instead. + ''' + self.load_manifest() + + modfile_dir = self.manifest.get_path('MODFILE_DIR') + + if not os.path.exists(modfile_dir): + os.mkdir(modfile_dir) + + output_dir = self.manifest.get_path('WORKDIR') + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + modfiles = [self.manifest.get_path(key) for key,info + in self.manifest.path_info.items() + if 'format' in info and info['format'] == 'MODFILE'] + for from_file in modfiles: + RunOptimize._log.debug("copying %s to %s" % (from_file, modfile_dir)) + shutil.copy(from_file, modfile_dir) + + shutil.copy(resource_filename(hoc_location.__name__, + 'cell.hoc'), + self.manifest.get_path('BASEDIR')) + + + def generate_manifest_rma(self, + neuronal_model_id, + manifest_path, + api_url=None): + ''' + Note + ---- + Other necessary files are also written. + ''' + import json + from allensdk.api.api import Api + + bma = BiophysicalModuleApi(api_url) + data = bma.get_neuronal_models(neuronal_model_id) + + ocr = OptimizeConfigReader() + ocr.read_lims_message(data, 'lims_message.json') + + with open('lims_message.json', 'w') as f: + f.write(json.dumps(data[0], sort_keys=True, indent=2)) + + ocr.to_manifest(manifest_path) + + + def generate_manifest_lims(self, + lims_json_path, + manifest_path): + ''' + Note + ---- + Other necessary files are also written. + ''' + ocr = OptimizeConfigReader() + ocr.read_lims_file(lims_json_path) + + ocr.to_manifest(manifest_path) + + + def start_specimen(self): + import allensdk.internal.model.biophysical.run_passive_fit as run_passive_fit + import allensdk.internal.model.biophysical.fit_stage_1 as fit_stage_1 + import allensdk.internal.model.biophysical.fit_stage_2 as fit_stage_2 + + self.load_manifest() + + self.passive_fit_data = \ + run_passive_fit.run_passive_fit(self.app_config) + + ju.write(self.manifest.get_path('passive_fit_data'), + self.passive_fit_data) + + self.stage_1_jobs = \ + fit_stage_1.prepare_stage_1(self.app_config, + self.passive_fit_data) + + ju.write(self.manifest.get_path('stage_1_jobs'), + self.stage_1_jobs) + fit_stage_1.run_stage_1(self.stage_1_jobs) + + output_directory = self.manifest.get_path('WORKDIR') + stage_2_jobs = fit_stage_2.prepare_stage_2(output_directory) + fit_stage_2.run_stage_2(stage_2_jobs) + + + def make_fit(self): + self.load_manifest() + + fit_types = ["f9", "f13"] + + best_fit_values = { fit_type: None for fit_type in fit_types } + + specimen_id = self.app_config.data['runs'][0]['specimen_id'] + + for fit_type in fit_types: + fit_type_dir = self.manifest.get_path('fit_type_path', fit_type) + + if os.path.exists(fit_type_dir): + report = Report(self.app_config, + fit_type) + report.generate_fit_file() + if fit_type in best_fit_values.keys(): + best_fit_values[fit_type] = report.best_fit_value() + + best_fit_type, min_fit_value = reduce(lambda a, b: a if (a[1] < b[1]) else b, + (i for i in best_fit_values.items() if i[1] is not None)) + best_fit_file = self.manifest.get_path('output_fit_file', + specimen_id, + best_fit_type) + + lims_upload_config = OptimizeConfigReader() + lims_upload_config.read_json(self.manifest.get_path('neuronal_model_data')) + + lims_upload_config.update_well_known_file(best_fit_file, + well_known_file_type_id=OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) + lims_upload_config.write_file(output_json) + + +def main(command, input_json, output_json): + ''' Entry point for module. + :param command: select behavior, nrnivmodl or simulate + :type command: string + :param lims_strategy_json: path to json file output from lims. + :type lims_strategy_json: string + :param lims_response_json: path to json file returned to lims. + :type lims_response_json: string + ''' + + o = RunOptimize(input_json, + output_json) + + if 'LOG_CFG' in os.environ: + log_config = os.environ['LOG_CFG'] + else: + log_config = resource_filename('allensdk.model.biophysical', + 'logging.conf') + os.environ['LOG_CFG'] = log_config + lc.fileConfig(log_config) + + if 'nrnivmodl' == command: + o.nrnivmodl() + elif 'info' == command: + o.info(input_json) + elif 'generate_manifest_rma' == command: + o.generate_manifest_rma(input_json, output_json) + elif 'generate_manifest_lims' == command: + o.generate_manifest_lims(input_json, output_json) + elif 'write_manifest' == command: + o.write_manifest() + elif 'copy_local' == command: + o.copy_local() + elif 'start_specimen' == command: + o.start_specimen() + elif 'make_fit' == command: + o.make_fit() + else: + RunOptimize._log.error("no command") + + print('done') + + +if __name__ == '__main__': + import sys + + command, input_json, output_json = sys.argv[-3:] + + RunOptimize._log.debug("command: %s" % (command)) + RunOptimize._log.debug("input json: %s" % (input_json)) + RunOptimize._log.debug("output json: %s" % (output_json)) + + main(command, input_json, output_json) + + RunOptimize._log.debug("success") diff --git a/internal/model/biophysical/run_optimize_workflow.py b/internal/model/biophysical/run_optimize_workflow.py new file mode 100644 index 0000000000..e2270437e5 --- /dev/null +++ b/internal/model/biophysical/run_optimize_workflow.py @@ -0,0 +1,12 @@ +import sys +from subprocess import call +from pkg_resources import resource_filename #@UnresolvedImport + +the_script = resource_filename(__name__, 'run_optimize.sh') + +cmd = ['/bin/bash', the_script] +cmd.extend(sys.argv[1:]) + +print(' '.join(cmd)) + +call(cmd) \ No newline at end of file diff --git a/internal/model/biophysical/run_passive_fit.py b/internal/model/biophysical/run_passive_fit.py new file mode 100644 index 0000000000..b92c29b4ce --- /dev/null +++ b/internal/model/biophysical/run_passive_fit.py @@ -0,0 +1,144 @@ +import os +import sys +import subprocess +import numpy as np +import allensdk.internal.model.biophysical.ephys_utils as ephys_utils +from .passive_fitting import preprocess as passive_prep +import allensdk.core.json_utilities as ju +from allensdk.model.biophys_sim.config import Config +from allensdk.core.nwb_data_set import NwbDataSet +from allensdk.internal.model.biophysical.passive_fitting import neuron_passive_fit +from allensdk.internal.model.biophysical.passive_fitting import neuron_passive_fit2 +from allensdk.internal.model.biophysical.passive_fitting import neuron_passive_fit_elec +from pkg_resources import resource_filename #@UnresolvedImport +import logging +import logging.config as lc + + +_run_passive_fit_log = logging.getLogger('allensdk.internal.model.biophysical.run_passive_fit') + + +def run_passive_fit(description): + output_directory = description.manifest.get_path('WORKDIR') + neuronal_model = ju.read(description.manifest.get_path('neuronal_model_data')) + specimen_data = neuronal_model['specimen'] + + is_spiny = not any(t['name'] == u'dendrite type - aspiny' for t in specimen_data['specimen_tags']) + + all_sweeps = specimen_data['ephys_sweeps'] + if not os.path.exists(output_directory): + os.makedirs(output_directory) + + cap_check_sweeps, _, _ = \ + ephys_utils.get_sweeps_of_type('C1SQCAPCHK', + all_sweeps) + + passive_fit_data = {} + + if len(cap_check_sweeps) > 0: + data_set = NwbDataSet(description.manifest.get_path('stimulus_path')) + d = passive_prep.get_passive_fit_data(cap_check_sweeps, data_set); + + grand_up_file = os.path.join(output_directory, 'upbase.dat') + np.savetxt(grand_up_file, d['grand_up']) + + grand_down_file = os.path.join(output_directory, 'downbase.dat') + np.savetxt(grand_down_file, d['grand_down']) + + passive_fit_data["bridge"] = d['bridge_avg'] + passive_fit_data["escape_time"] = d['escape_t'] + + fit_1_file = description.manifest.get_path('fit_1_file') + fit_1_params = subprocess.check_output([sys.executable, + '-m', neuron_passive_fit.__name__, + str(d['escape_t']), + os.path.realpath(description.manifest.get_path('manifest')) ]) + passive_fit_data['fit_1'] = ju.read(fit_1_file) + + fit_2_file = description.manifest.get_path('fit_2_file') + + fit_2_params = subprocess.check_output([sys.executable, + '-m', neuron_passive_fit2.__name__, + str(d['escape_t']), + os.path.realpath(description.manifest.get_path('manifest')) ]) + passive_fit_data['fit_2'] = ju.read(fit_2_file) + + fit_3_file = description.manifest.get_path('fit_3_file') + fit_3_params = subprocess.check_output([sys.executable, + '-m', neuron_passive_fit_elec.__name__, + str(d['escape_t']), + str(d['bridge_avg']), + str(1.0), + os.path.realpath(description.manifest.get_path('manifest')) ]) + passive_fit_data['fit_3'] = ju.read(fit_3_file) + + # Check for potentially problematic outcomes + cm_rel_delta = (passive_fit_data["fit_1"]["Cm"] - passive_fit_data["fit_3"]["Cm"]) / passive_fit_data["fit_1"]["Cm"] + if passive_fit_data["fit_2"]["err"] < passive_fit_data["fit_1"]["err"]: + _run_passive_fit_log.debug("Fixed Ri gave better results than original") + if passive_fit_data["fit_2"]["err"] < passive_fit_data["fit_3"]["err"]: + _run_passive_fit_log.debug("Using fixed Ri results") + passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_2"] + else: + _run_passive_fit_log.debug("Using electrode results") + passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_3"] + elif abs(cm_rel_delta) > 0.1: + _run_passive_fit_log.debug("Original and electrode fits not in sync:") + _run_passive_fit_log.debug("original Cm: " + str(passive_fit_data["fit_1"]["Cm"])) + _run_passive_fit_log.debug("w/ electrode Cm: " + str(passive_fit_data["fit_3"]["Cm"])) + if passive_fit_data["fit_1"]["err"] < passive_fit_data["fit_3"]["err"]: + _run_passive_fit_log.debug("Original has lower error") + passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_1"] + else: + _run_passive_fit_log.debug("Electrode has lower error") + passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_3"] + else: + passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_1"] + + ra = passive_fit_data["fit_for_next_step"]["Ri"] + if is_spiny: + combo_cm = passive_fit_data["fit_for_next_step"]["Cm"] + a1 = passive_fit_data["fit_for_next_step"]["A1"] + a2 = passive_fit_data["fit_for_next_step"]["A2"] + cm1 = 1.0 + cm2 = (combo_cm * (a1 + a2) - a1) / a2 + else: + cm1 = passive_fit_data["fit_for_next_step"]["Cm"] + cm2 = passive_fit_data["fit_for_next_step"]["Cm"] + else: + _run_passive_fit_log.debug("No cap check trace found") + ra = 100.0 + cm1 = 1.0 + if is_spiny: + cm2 = 2.0 + else: + cm2 = 1.0 + + passive_fit_data['ra'] = ra + passive_fit_data['cm1'] = cm1 + passive_fit_data['cm2'] = cm2 + + return passive_fit_data + + +def main(limit, manifest_path): + app_config = Config() + description = app_config.load(manifest_path) + + if 'LOG_CFG' in os.environ: + log_config = os.environ['LOG_CFG'] + else: + log_config = resource_filename('allensdk.model.biophysical', + 'logging.conf') + os.environ['LOG_CFG'] = log_config + lc.fileConfig(log_config) + + run_passive_fit(description) + + +if __name__ == "__main__": + limit = sys.argv[-2] + manifest_path = sys.argv[-1] + + main(limit, manifest_path) + diff --git a/internal/model/biophysical/run_simulate_lims.py b/internal/model/biophysical/run_simulate_lims.py new file mode 100644 index 0000000000..318ee373fe --- /dev/null +++ b/internal/model/biophysical/run_simulate_lims.py @@ -0,0 +1,137 @@ +import logging +import os +import sys +import traceback +import logging.config as lc +import shutil +from pkg_resources import resource_filename #@UnresolvedImport +from allensdk.model.biophysical.run_simulate import RunSimulate + + +class RunSimulateLims(RunSimulate): + _log = logging.getLogger('allensdk.internal.model.biophysical.run_simulate_lims') + + def __init__(self, + input_json, + output_json): + super(RunSimulateLims, self).__init__(input_json, output_json) + + def generate_manifest_rma(self, + neuronal_model_run_id, + manifest_path, + api_url=None): + ''' + Note + ---- + Other necessary files are also written. + ''' + import json + from allensdk.internal.api.queries.biophysical_module_api import BiophysicalModuleApi + from allensdk.internal.api.queries.biophysical_module_reader import BiophysicalModuleReader + + bma = BiophysicalModuleApi(api_url) + data = bma.get_neuronal_model_runs(neuronal_model_run_id) + + lr = BiophysicalModuleReader() + lr.read_lims_message(data, 'lims_message.json') + + with open('lims_message.json', 'w') as f: + f.write(json.dumps(data[0], sort_keys=True, indent=2)) + + lr.to_manifest(manifest_path) + + def generate_manifest_lims(self, + lims_data_path, + manifest_path): + ''' + Note + ---- + Other necessary files are also written. + ''' + from allensdk.internal.api.queries.biophysical_module_reader import BiophysicalModuleReader + + self.lims_json = lims_data_path + + lr = BiophysicalModuleReader() + lr.read_lims_file(self.lims_json) + + lr.to_manifest(manifest_path) + + def copy_local(self): + import allensdk.model.biophysical.run_simulate + + self.load_manifest() + + modfile_dir = self.manifest.get_path('MODFILE_DIR') + + if not os.path.exists(modfile_dir): + os.mkdir(modfile_dir) + + workdir = self.manifest.get_path('WORKDIR') + + if not os.path.exists(workdir): + os.mkdir(workdir) + + modfiles = [self.manifest.get_path(key) for key,info + in self.manifest.path_info.items() + if 'format' in info and info['format'] == 'MODFILE'] + + for from_file in modfiles: + RunSimulate._log.debug("copying %s to %s" % (from_file, modfile_dir)) + shutil.copy(from_file, modfile_dir) + + shutil.copy(self.manifest.get_path('fit_parameters'), + workdir) + + shutil.copyfile(self.manifest.get_path('stimulus_path'), + self.manifest.get_path('output_path')) + + shutil.copy(resource_filename(allensdk.model.biophysical.run_simulate.__name__, + 'cell.hoc'), + os.curdir) + + +def main(command, lims_strategy_json, lims_response_json): + ''' Entry point for module. + :param command: select behavior, nrnivmodl or simulate + :type command: string + :param lims_strategy_json: path to json file output from lims. + :type lims_strategy_json: string + :param lims_response_json: path to json file returned to lims. + :type lims_response_json: string + ''' + rs = RunSimulateLims(lims_strategy_json, + lims_response_json) + + RunSimulateLims._log.debug("command: %s" % (command)) + RunSimulateLims._log.debug("lims strategy json: %s" % (lims_strategy_json)) + RunSimulateLims._log.debug("lims upload json: %s" % (lims_response_json)) + + log_config = resource_filename('allensdk.model.biophysical.run_simulate', + 'logging.conf') + lc.fileConfig(log_config) + os.environ['LOG_CFG'] = log_config + + if 'nrnivmodl' == command: + rs.nrnivmodl() + elif 'copy_local' == command: + rs.copy_local() + elif 'generate_manifest_rma' == command: + rs.generate_manifest_rma(input_json, output_json) + elif 'generate_manifest_lims' == command: + rs.generate_manifest_lims(input_json, output_json) + elif 'generate_manifest_lims' == command: + rs.generate_manifest_lims(input_json, output_json) + else: + rs.simulate() + + +if __name__ == '__main__': + command, input_json, output_json = sys.argv[-3:] + + try: + main(command, input_json, output_json) + RunSimulateLims._log.debug("success") + except Exception as e: + RunSimulate._log.error(traceback.format_exc()) + exit(1) diff --git a/internal/model/biophysical/run_simulate_workflow.py b/internal/model/biophysical/run_simulate_workflow.py new file mode 100644 index 0000000000..a030ade7a8 --- /dev/null +++ b/internal/model/biophysical/run_simulate_workflow.py @@ -0,0 +1,12 @@ +import sys +from subprocess import call +from pkg_resources import resource_filename #@UnresolvedImport + +the_script = resource_filename(__name__, 'run_simulate.sh') + +cmd = ['/bin/bash', the_script] +cmd.extend(sys.argv[1:]) + +print(' '.join(cmd)) + +call(cmd) \ No newline at end of file diff --git a/internal/model/data_access.py b/internal/model/data_access.py new file mode 100644 index 0000000000..f42999d371 --- /dev/null +++ b/internal/model/data_access.py @@ -0,0 +1,104 @@ +from allensdk.core.nwb_data_set import NwbDataSet +from scipy import signal +import numpy as np + +def load_sweep(file_name, sweep_number, desired_dt=None, cut=0, bessel=False): + '''load a data sweep and do specified data processing. + Inputs: + file_name: string + name of .nwb data file + sweep_number: + number specifying the sweep to be loaded + desired_dt: + the size of the time step the data should be subsampled to + cut: + indicie of which to start reporting data (i.e. cut off data before this indicie) + bessel: dictionary + contains parameters 'N' and 'Wn' to implement standard python bessel filtering + Returns: + dictionary containing + voltage: array + current: array + dt: time step of the returned data + start_idx: the index at which the first stimulus starts (excluding the test pulse) + ''' + ds = NwbDataSet(file_name) + data = ds.get_sweep(sweep_number) + + data["dt"] = 1.0 / data["sampling_rate"] + + if cut > 0: + data["response"] = data["response"][cut:] + data["stimulus"] = data["stimulus"][cut:] + + if bessel: + sample_freq = 1. / data["dt"] + filt_coeff = (bessel["freq"]) / (sample_freq / 2.) # filter fraction of Nyquist frequency + b, a = signal.bessel(bessel["N"], filt_coeff, "low") + data['response'] = signal.filtfilt(b, a, data['response'], axis=0) + + if desired_dt is not None: + if data["dt"] != desired_dt: + data["response"] = subsample_data(data["response"], "mean", data["dt"], desired_dt) + data["stimulus"] = subsample_data(data["stimulus"], "mean", data["dt"], desired_dt) + data["start_idx"] = int(data["index_range"][0] / (desired_dt / data["dt"])) + data["dt"] = desired_dt + + if "start_idx" not in data: + data["start_idx"] = data["index_range"][0] + + return { + "voltage": data["response"], + "current": data["stimulus"], + "dt": data["dt"], + "start_idx": data["start_idx"] + } + + +def load_sweeps(file_name, sweep_numbers, dt=None, cut=0, bessel=False): + '''load sweeps and do specified data processing. + Inputs: + file_name: string + name of .nwb data file + sweep_numbers: + sweep numbers to be loaded + desired_dt: + the size of the time step the data should be subsampled to + cut: + indicie of which to start reporting data (i.e. cut off data before this indicie) + bessel: dictionary + contains parameters 'N' and 'Wn' to implement standard python bessel filtering + Returns: + dictionary containing + voltage: list of voltage trace arrays + current: list of current trace arrays + dt: list of time step corresponding to each array of the returned data + start_idx: list of the indicies at which the first stimulus starts (excluding + the test pulse) in each returned sweep + ''' + data = [ load_sweep(file_name, sweep_number, dt, cut, bessel) for sweep_number in sweep_numbers ] + + return { + 'voltage': [ d['voltage'] for d in data ], + 'current': [ d['current'] for d in data ], + 'dt': [ d['dt'] for d in data ], + 'start_idx': [ d['start_idx'] for d in data ], + } + + +def subsample_data(data, method, present_time_step, desired_time_step): + if present_time_step > desired_time_step: + raise Exception("you desired time step is smaller than your present time step") + + # number of elements to average over + n = int(desired_time_step / present_time_step) + + data_subsampled = None + + if method == "mean": + # if n does not divide evenly into the length of the array, crop off the end + end = n * int(len(data) / n) + + return np.mean(data[:end].reshape(-1,n), 1) + + raise Exception("unknown subsample method: %s" % (method)) \ No newline at end of file diff --git a/internal/model/glif/ASGLM.py b/internal/model/glif/ASGLM.py new file mode 100644 index 0000000000..4f26275e0f --- /dev/null +++ b/internal/model/glif/ASGLM.py @@ -0,0 +1,249 @@ +import numpy as np +import itertools +import allensdk.internal.model.GLM as GLM +import logging +import statsmodels.api as sm +import matplotlib.pyplot as plt + +def ASGLM_pairwise(ks_int, I_stim, voltage, spike_ind, cinit, tauinit, SCL, dt, resting_potential, + SHORT_RUN=False, MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False): + '''Calculate the resistance and amplitude of the afterspike currents for + Parameters + ---------- + ks_int: list + initial possible k's (k=1/tau, where tau is the time constant of the exponential decay) + I_stim: list of arrays + input stimulus traces of sweeps + voltage: list of arrays + voltage of cell as a result of I_stim + spike_ind: list of arrays + each array contains the index of the spikes + cinit: float + membrane capacitance + tauinit: float + time constant of membrane + SCL: float + number of indicies that should be cut after a spike + dt: float + size of time step of injected current + Returns + ''' + + #Initialize post-spike filter parameters (MOST OF THESE ARE HARD-CODED currently) + nkt = 8000 # arbitrary length of filter WANT FILTER TO COVER A LENGTH OF TIME, WANT FILTER TO BE LONGER THAN LONGEST LENGTH ASC + DTsim = dt #DTsim = dt means filter is nkt*dt = 100 ms long in this case THIS SHOULD INDEED BE THE SAMPLE WIDTH + neye = 0 #no of identity basis vectors DELTA + f = 1e-3/dt #pre-factor for getting time units correct for bases + + taus_int=[1000./kk for kk in ks_int] #converting to ms + taus_filter = [f*j for j in taus_int] #convert ms time to filter time units 1/(dt*ks) + ks_list = [(1.0/(i)) for i in taus_filter] #use peak positions of rcos bumps as time-scales for exponential bases + ncos = 2 #no of bases!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + flag_exp = 1 #flag_exp = 1 means use exponential bases, else use raised-cosine bumps + vL = resting_potential + + # GLM fit with post-spike currents + tst = 0 #190000#355000 #time-step to start + npcut = int(SCL) # no of points to cut after each spike-initiation + + # Collect spikes between tst and tend + t0_list = [] + for mm in range(len(I_stim)): + tend = len(I_stim[mm]) + t0=[] + for jj in range(len(spike_ind[mm])): + if spike_ind[mm][jj]>tst and spike_ind[mm][jj]<tend: + t0.append(spike_ind[mm][jj]) + + t0_list.append(t0) + + #Create a list of pairs of ks + ks_pairs = list(itertools.combinations(ks_list,ncos)) + ks_pairs_in_SI_units= list(itertools.combinations(ks_int, ncos)) + if len(ks_pairs)!=10: + raise Exception('figure subplots will need to be changed as there is a different number than 10 ks_pairs.') + + #Initialize list to hold charge dump values and amp-vectors + fitprs_list = [] + llf_list = [] + R_list = [] + #Iterate over all pairs + if SHORT_RUN: + logging.warning("You are not doing all the ks pairs in ASGLM_pairwise") + ks_pairs=[ks_pairs[0]] + + R_for_all_ks_pairs=[] + asc_amp_for_all_ks_pairs=[] + El_for_all_ks_pairs=[] + C_for_all_ks_pairs=[] + llh_for_all_ks_pairs=[] + for ks_ind, (ks_fit_units, ks_SI_units) in enumerate(zip(ks_pairs, ks_pairs_in_SI_units)): + print('ks_fit_units', ks_fit_units) + #Create basis IPSPs + if MAKE_PLOT: + plotting_colors=['r', 'b', 'g', 'm', 'c'] + plt.figure(78, figsize=(20,10)) + basis_IPSP_list = [] + for rr in range(len(I_stim)): #loop over repeats + #find the basis of the entire trace + basis_IPSP, gg0 = GLM.create_basis_IPSP(neye,ncos,taus_filter,ks_fit_units,DTsim,t0_list[rr],I_stim[rr],nkt,flag_exp,npcut) + basis_IPSP_list.append(basis_IPSP) + #--Plot basis IPSPs between si and se + si = t0_list[0][0]-10 #plot start_ind + se = si+nkt+10 #plot end_ind + tvec = dt*np.arange(si-tst,se-tst) #convert time-steps to real time (in sec) + if MAKE_PLOT: + plt.figure(78) + plt.subplot(5,2, ks_ind+1) + plt.plot(1e3*tvec,basis_IPSP[si:se,:], lw=2, label=str(rr)) #1e3 plots time on x-axis in ms + plt.xlabel('time (ms)') + plt.title("k's "+str(ks_SI_units)) + if MAKE_PLOT: + plt.annotate('ASGLM (fit asc and R): AScurrent basis', + xy=(.4, .985), + xycoords='figure fraction', + horizontalalignment='left', verticalalignment='top', + fontsize=20) + plt.legend() + plt.tight_layout() + + if SHOW_PLOT: + plt.show(block=BLOCK) + + # cut spikes out of dv, v, i, and b_ipsp and put the different sweeps in lists + i_all_swps_list = [] + b_ipsp_all_swps_list = [] + v_all_swps_list = [] + dv_all_swps_list = [] + for ss in range(len(I_stim)): #loop over repeats + tend = len(I_stim[ss]) + i = I_stim[ss][tst:tend-1] + b_ipsp = basis_IPSP_list[ss][tst:tend-1] + + v = voltage[ss][tst:tend-1] + vs = voltage[ss][tst+1:tend] + dv = (vs-v)/dt #derivative of voltage + + #delete npcut points after spike from each qty + delpts = [] + for kk in range(len(t0_list[ss])): + delpts.append(range(int(t0_list[ss][kk])-tst,int(t0_list[ss][kk])-tst+npcut)) + + dv = np.delete(dv,delpts,0) + v = np.delete(v,delpts,0) + i = np.delete(i,delpts,0) + b_ipsp = np.delete(b_ipsp,delpts,0) + + v_all_swps_list.append(v) + dv_all_swps_list.append(dv) + i_all_swps_list.append(i) + b_ipsp_all_swps_list.append(b_ipsp) + + tvec = dt*np.arange(len(v)) + + # Compute amplitude each basis AS current using a GLM + if MAKE_PLOT: + plt.figure(79, figsize=(20, 12)) + plt.figure(80, figsize=(20, 12)) + R_for_each_sweep=[] + asc_amp_for_each_sweep=[] + llh_for_each_sweep=[] + for kkk, (v_spike_deleted, dv_spike_deleted, i_spike_deleted, b_ipsp_spikes_deleted) in \ + enumerate(zip(v_all_swps_list, dv_all_swps_list, i_all_swps_list, b_ipsp_all_swps_list)): + + #--fitting afterspike current amplitudes and resistance + inp = np.zeros((len(i_spike_deleted),ncos+1)) + inp[:,range(0,ncos)] = (1/cinit)*b_ipsp_spikes_deleted[:,range(ncos)] + inp[:,ncos] = -(v_spike_deleted-vL)/tauinit + out = dv_spike_deleted -i_spike_deleted/cinit#+ (v-vL)/tauinit - i/cinit + + try: + glm_fit = sm.GLM(out,inp,family=sm.families.Gaussian(sm.families.links.identity)) + res = glm_fit.fit() + fitprs = res.params #fitprs has [AMP OF ASC, TAU] + + llh=res.llf + fit_R=tauinit/(fitprs[ncos]*cinit) + fit_asc_amp=fitprs[:ncos] + #Compute and plot post-spike current (essentially multiply basis functions with correct amplitudes from GLM fit) + ipsc = np.sum(b_ipsp_spikes_deleted[:,0:ncos]*fit_asc_amp,1) #THIS IS TOTAL POSTSPIKE CURRENT + except Exception as e: + logging.warning("fit didn't work: " + str(e)) + llh=np.nan + fit_R=np.NAN + fit_asc_amp=np.ones(ncos)*np.NAN + ipsc=np.ones(len(b_ipsp_spikes_deleted[:,0]))*np.NAN + + R_for_each_sweep.append(fit_R) + asc_amp_for_each_sweep.append(fit_asc_amp) + llh_for_each_sweep.append(llh) + + #Plot a single instance of AS current as function of time (in ms) + if MAKE_PLOT: + plt.figure(79) + plt.subplot(5,2, ks_ind+1) + plot_inds = np.arange(int(t0_list[0][0])-tst,int(t0_list[0][0])-tst+nkt) #plot just after first spike + tvec = dt*plot_inds + plt.plot(tvec,ipsc[plot_inds], lw=2, label='llh='+str(llh)) + plt.xlabel('time (s)') + plt.ylabel('current (A)') + plt.title("k's "+str(ks_SI_units)) + + plt.figure(80) + plt.subplot(5,2,ks_ind+1) + for ASC, KS in zip(fit_asc_amp, np.array(ks_SI_units)): + #TODO: MAKE SURE I SHOULD BE USING SI UNITS HERE {I think this is correct as it is what I am returning from the function] + #TODO: MAKE SURE THE SIGNS OF K ARE OK + t_plot=np.arange(10000)*dt + single_asc_trace=ASC*np.exp(-KS*t_plot) + plt.plot(t_plot, single_asc_trace, lw=2, label='sweep '+str(kkk)) + plt.xlabel('time (s)') + plt.ylabel('current (A)') + plt.title("k's "+str(ks_SI_units)) + + if MAKE_PLOT: + plt.figure(79) + plt.tight_layout() + plt.annotate('ASGLM (fit asc and R): Sum fit after spike currents', + xy=(.3, .985), + xycoords='figure fraction', + horizontalalignment='left', verticalalignment='top', + fontsize=20) + plt.legend() + + plt.figure(80) + plt.tight_layout() + plt.annotate('ASGLM (fit asc and R): Individual Currents', + xy=(.3, .985), + xycoords='figure fraction', + horizontalalignment='left', verticalalignment='top', + fontsize=20) + plt.legend() + if SHOW_PLOT: + plt.show(block=False) + + +# #BELOW IS OVER EVERY PAIR + R_for_all_ks_pairs.append(R_for_each_sweep) + asc_amp_for_all_ks_pairs.append(asc_amp_for_each_sweep) + llh_for_all_ks_pairs.append(llh_for_each_sweep) + + #!!!!!!!!!!!!!we multiplied ks by dt for SI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ave_llh_for_each_pair=np.mean(llh_for_all_ks_pairs, axis=1) + best_ks_pair_ind = np.where(np.max(ave_llh_for_each_pair)==ave_llh_for_each_pair)[0][0] + + best_k_pair=np.array(ks_pairs[best_ks_pair_ind])/dt + best_asc_amp=np.array(asc_amp_for_all_ks_pairs[best_ks_pair_ind]) + best_R=np.array(R_for_all_ks_pairs[best_ks_pair_ind]) + best_llh=np.array(llh_for_all_ks_pairs[best_ks_pair_ind]) + + print('**********from ASGLM_pairwise******************************************') + print('best_ks_pair_ind', best_ks_pair_ind) + print('best_asc_amp', best_asc_amp) + print('best_k_pair', best_k_pair) + print('best_R', best_R) + print('best_llh', best_llh) + + print('**********done with ASGLM_pairwise***********************************') + + return best_k_pair, best_asc_amp, best_R, best_llh diff --git a/internal/model/glif/MLIN.py b/internal/model/glif/MLIN.py new file mode 100644 index 0000000000..d42c657045 --- /dev/null +++ b/internal/model/glif/MLIN.py @@ -0,0 +1,143 @@ +import numpy as np +from allensdk.ephys.extract_cell_features import get_square_stim_characteristics +from scipy import stats +from scipy.optimize import curve_fit +import matplotlib.pyplot as plt + +def MLIN(voltage, current, res, cap, dt, MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False, PUBLICATION_PLOT=False): + '''voltage, current + input: + voltage: numpy array of voltage with test pulse cut out + current: numpy array of stimulus with test pulse cut out ''' + t = np.arange(0, len(current)) * dt + (_, _, _, start_idx, end_idx) = get_square_stim_characteristics(current, t, no_test_pulse=True) + stim_len = end_idx - start_idx + + distribution_start_ind=start_idx + int(.5/dt) + distribution_end_ind=start_idx + stim_len + + v_section=voltage[distribution_start_ind:distribution_end_ind] + if MAKE_PLOT: + times=np.arange(0, len(voltage))*dt + plt.figure(figsize=(15, 11)) + plt.subplot2grid((7,2), (0,0), colspan=2) + plt.plot(times[distribution_start_ind:distribution_end_ind], v_section) + plt.title('voltage for histogram') + + print(v_section) + v_section=v_section-np.mean(v_section) + var_of_section=np.var(v_section) + sv_for_expsymm=np.std(v_section)/np.sqrt(2) + subthreshold_long_square_voltage_distribution=stats.norm(loc=0, scale=np.sqrt(var_of_section)) + + #--autocorrelation + tau_4AC=res*cap + AC=autocorr(v_section-np.mean(v_section)) + ACtime=np.arange(0,len(AC))*dt + + #--fit autocorrelation with decaying exponential + (popt, pcov)= curve_fit(exp_decay, ACtime, AC, p0=[AC[0],tau_4AC]) + tau_from_AC=popt[1] + + if MAKE_PLOT: + plt.subplot2grid((7,2), (1,0), rowspan=3) + plt.hist(v_section, bins=50, normed=True, label='data') + data_grid=np.arange(min(v_section), max(v_section), abs(min(v_section)-max(v_section))/100.) + plt.plot(data_grid, subthreshold_long_square_voltage_distribution.pdf(data_grid), 'r', label='gauss with\nmeasured var') + plt.plot(data_grid, expsymm_pdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm function') + plt.xlabel('voltage (mV)') + plt.title('Mean subtracted voltage hist') + plt.legend() + + #--cumulative density function + (h, edges)=np.histogram(v_section, bins=50) + centers=find_bin_center(edges) + + CDFx=centers + CDFy=np.cumsum(h)/float(len(v_section)) + + plt.subplot2grid((7,2), (4,0), rowspan=3) + plt.plot(CDFx, CDFy, label='data') +# plt.plot(CDFx, sig(CDFx, popt[0], popt[1]), label='fit') + plt.plot(data_grid, subthreshold_long_square_voltage_distribution.cdf(data_grid), 'r', label='gauss with\nmeasured var') + plt.plot(data_grid, expsymm_cdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm func') + plt.title('Normalized cumulative sum') + plt.xlabel('v-mean(v)') + plt.legend() + + plt.subplot2grid((7,2), (1,1), rowspan=3) + plt.plot(ACtime, AC, label='data') + plt.xlabel('shift (s)') + plt.title('Auto correlation') + plt.plot(ACtime, exp_decay(ACtime, AC[0], tau_4AC), label='RC') + plt.plot(ACtime, exp_decay(ACtime, popt[0], tau_from_AC), label='fit') + plt.legend() + + plt.tight_layout() + if SHOW_PLOT: + plt.show(block=BLOCK) + + if PUBLICATION_PLOT: + times=np.arange(0, len(voltage))*dt + plt.figure(figsize=(14, 7)) + plt.subplot2grid((3,3), (0,0), colspan=3) + plt.xlabel('time (s)', fontsize=14) + plt.ylabel('(mV)', fontsize=14) + plt.plot(times[distribution_start_ind:distribution_end_ind], v_section*1.e3) + plt.title('Voltage for histogram', fontsize=16) + + plt.subplot2grid((3,3), (1,0), rowspan=2) + plt.hist(v_section*1.e3, bins=50, normed=True, label='data') + data_grid=np.arange(min(v_section), max(v_section), abs(min(v_section)-max(v_section))/100.) +# plt.plot(data_grid, subthreshold_long_square_voltage_distribution.pdf(data_grid), 'r', label='gauss with\nmeasured var') + plt.plot(data_grid*1.e3, 1.e-3*expsymm_pdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm ') + plt.xlabel('voltage (mV)', fontsize=14) + plt.title('Mean subtracted voltage hist', fontsize=16) + plt.legend(loc=1) + + #--cumulative density function + (h, edges)=np.histogram(v_section, bins=50) + centers=find_bin_center(edges) + + CDFx=centers + CDFy=np.cumsum(h)/float(len(v_section)) + + plt.subplot2grid((3,3), (1,1), rowspan=2) + plt.plot(CDFx*1e3, CDFy, label='data') + # plt.plot(CDFx, sig(CDFx, popt[0], popt[1]), label='fit') +# plt.plot(data_grid, subthreshold_long_square_voltage_distribution.cdf(data_grid), 'r', label='gauss with\nmeasured var') + plt.plot(data_grid*1.e3, expsymm_cdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm') + plt.title('Normalized cumulative sum', fontsize=16) + plt.xlabel('V-mean(V) (mV)', fontsize=16) + plt.legend(loc=2, fontsize=14) + + plt.subplot2grid((3,3), (1,2), rowspan=2) + plt.plot(ACtime, AC*1.e3, label='data') + plt.xlabel('shift (s)', fontsize=14) + plt.title('Auto correlation', fontsize=16) +# plt.plot(ACtime, exp_decay(ACtime, AC[0], tau_4AC), label='RC') + plt.plot(ACtime, exp_decay(ACtime, popt[0]*1.e3, tau_from_AC), lw=3, label='fit') + plt.legend(loc=1) + plt.tight_layout() + + return var_of_section, sv_for_expsymm, tau_from_AC + +def expsymm_pdf(v, dv): + return 1./(2.*dv)*np.exp(-np.absolute(v)/dv) + +def expsymm_cdf(v, dv): + return 1./2.+(v*(1-np.exp(-np.absolute(v)/dv)))/(2.*np.absolute(v)) + +def exp_decay(time, amp, tau): + return amp*np.exp(-time/tau) + +def find_bin_center(edges): + centers=np.zeros(len(edges)-1) + for ii in range(0, len(edges)-1): + centers[ii]=np.mean([edges[ii], edges[ii+1]]) + return centers + +def autocorr(x): + result = np.correlate(x, x, mode='full') +# return result + return result[result.size/2:] diff --git a/internal/model/glif/__init__.py b/internal/model/glif/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/model/glif/__pycache__/ASGLM.cpython-37.pyc b/internal/model/glif/__pycache__/ASGLM.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba6e63ac77777bf24151def6aa7a368ae78eb2b0 GIT binary patch literal 6271 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 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/MLIN.cpython-37.pyc b/internal/model/glif/__pycache__/MLIN.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0687a131d63e97b57267f88ea636a0c7aaa498f5 GIT binary patch literal 4321 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 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/__init__.cpython-37.pyc b/internal/model/glif/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4a0a954fcd32a0f3f2ea7670884396e7c0190fc GIT binary patch literal 196 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r|Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^wV=P)AZxxGxIV_;^XxSDsOSv03}Lu MQtd#__zc7h0LV%=tN;K2 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/are_two_lists_of_arrays_the_same.cpython-37.pyc b/internal/model/glif/__pycache__/are_two_lists_of_arrays_the_same.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1d5c82cb3d5d8d408d0101bd9f86f9cf66b35e7 GIT binary patch literal 569 zcmaJ<%}yIJ5cbbT3J9tma_Y%Pav)LLTUAvpRGbi(QXxfKEt9pESaIyF?Im3l4i)Wt zfO_JU_R5J@;M8#<q@Fs`d^4UOk3WqMc6YZ4iv9Bw7L<^Oba)nq&PUWRK#)XILnc%* z$$yavlk^K2W{;R5CuOQklA-oc4^hJbLL@74LlNl>opV1(T|f3BU8M;7OuoI!*)_Z7 zk=^nYTk$!+qh6${@8XO|hBNrpxmU6AHi#oIK?z-n=!DTB2H`3J-a{MEC?R!KDX(lC zZ3`3^XUZ=%wxA=b#+Fe#E1qvV^^MvT9-R)ejvHk=ex>V<*}CIk+hI28Nr>=zW8QQW zIy${4zK_hFejmQezXs()4l|IWDJ-!i|74+bR>Ip{*~^f-TG>z{x_Z`z{8&%(prhKa zp`62o!d`=8gPf1Gjmldv<AsyTj4zC?#>lCNOINJ97OpBbTnnUA1X!q1-FAuie~Wn9 z#SQ}Ly`&i(&=<7NeA@buPkOdl)U8i@TZh)v{(&t_bp7}ErpBlb_(4cWyY92UkF%X$ literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/configure_model.cpython-37.pyc b/internal/model/glif/__pycache__/configure_model.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be182c285de015cb8bd6bbecf19d49d434869c8e GIT binary patch literal 10195 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 LmG72k%gX-&(LZFP literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/error_functions.cpython-37.pyc b/internal/model/glif/__pycache__/error_functions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f6d889da165e71bcc7f60a171795a2619a7cac1 GIT binary patch literal 4111 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 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/find_spikes.cpython-37.pyc b/internal/model/glif/__pycache__/find_spikes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6969511eabb113f7630d6d1a1762cba05aa5233c GIT binary patch literal 5826 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 U1}i}hNQ${JV^lP595YV*2Sefe4gdfE literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/find_sweeps.cpython-37.pyc b/internal/model/glif/__pycache__/find_sweeps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ffa27cd8a7792125df02ef3cdc0bf83aef5b34c GIT binary patch literal 6244 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 SIs6yxY5S~w+CE{IZ0$c<4#k}S literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/glif_experiment.cpython-37.pyc b/internal/model/glif/__pycache__/glif_experiment.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46e08010702ecef44da5850b0515775169e1a95c GIT binary patch literal 8701 zcmeHN-H+SG5$A`b<LS=!<>K!;?xwX<D|O_g=?8Ez+{h>SELfI;lg^HX3kaULC-F>? z@-B5>&;f0ozV)R*AC16CUs@plP2Tv>mp<iR$Wv!_DT&gZU7ZyKFklKCF3H`U*_oZ? z{C0Hv#EG;5hxgAvThEB1{1<QfM*<3;!pT1bVk@@lDs{YSuG-e>nkt{^^~8!|>vrNx z#ZJ)VQ@x(D)vA(7eh;mbaz+hPyUg;Mw1M~iLxaMnaPr>*p-Nq~mAYoDw)Uk`*JW?@ zgq^fgaG$hiYy++-d)7|Fb;h29{^!G!E3UIy*zHi}w5b;~W}z!Qa75VuJvjLike=F8 zOr@s*ReL&6t(O3*_mV&py%f-7Zw6?pX8@gPDnJce0WNAeGaIHn+GV~MYIYFL^1x}E zuEU|oDDTMP0`EAFsR^&B$phNq;X;!+wmE#v!?$BkwtY9Snv{p9Iu^6q=B5*vp4Em2 z^RfwL%x6544ilWZn+#3Cl1NfWW{?<2aLfz`%;tcEsmD7OYw~|9>=fMo5G*gPuW`!w zy4AAm?1r^td3)<Q&uaLdZGF5>y=}hkcc{l3K>bc@kFS@Ujdkt>^n;Goc#JZxTdoT= z?8i48FQCk`+#7A*rtXa<s9zA14vdiP?1hGDIvxzjMB(@%5G9#XM}FG=xl!X~`)wL% zIXrO4^KdT1$^QeSr#uHseyysCu#ehQ4z%4{ffj&8w-Qg)r)pmL;`)K!)1HG}w^Gl+ zqFafcegRr;8PRnXuV3rf%abb)VNT<W>uGuAsS2}hSWd*s$yhlRE6>ErMyxy=E2m@S zxmbBVRzC3z=krPH6EJJ7<#5sf^^zUObqVWwBxq6M`j$;?BIh9y>L-pz7~Q0ddJRef zU(^f0`ZVa*6H|$2(<C|^uhR|q(%>E+<Mdi0z!cdy9uF++&fgUGBm6ASCStZym<60z zuJ56gK}%HKw%jh|{f3bo;{x;rDOYNRcq<qRwHhsAF=p-c`#{OE=rdLHt)ges-5L&0 zcpO1#P-Ia{Ow5k&S^*vLxsj0~bBp01kI)-9E`hPL0J%q_M^DGvLNv#-yW5W4wcJR` zYn~qn3A&!M4GMu5=>C}zp3=LUpc%e2935|1t_3QL_(ZA;T2>&fz9B3@8H@(_N2YCC zosQ!*$!6DU1di{K4eI(kL*p_UbeT71-DsT=DqAABY9Z5snxof5N{}UJmnBlXLuz*m z<bEYzD3NkuZM9M+)z6Ce3RQBuaHq0b5U*>w)s;d`6dzPdwcJX9JS>(<WMurPbLbS> zk>y-zd99SI74q0-b=c8rp}JP870WB+L1DR8S(V*Ht#VaTs=zC_qD&FfTscp2rD|nZ z^$^$lxqAgtEtIP$R_(56U9A=Gua(xSWUX8(RIB7sWsNMa)kv{Mu*b?;?K62-t5k-H z#WBQ|ZZtBN3LRnkf;kwe-tvZ8$7yRd0-Q>sv;I7Yyd|;%3>Rbvi9zi-(0NRMw;z#Q zK93qhos39<!eSdzkwz?*^Th|n{93LgO-O1LsmNHJQm$H)Zx0W;SS{XRe!FDx0G&^` z;!(3nOlC2F(J{SvsdAx960H;0HXPsen-2Iz=J0rAx5D4XeV6Z0+L4Ys>UeQ$ysl%2 zytA@-A3wLbU<KB~+m8Q#Y!Iz2Vl{!!d|-jjaK`n0Jz8|6VWI_or$uF@$R0i;V3D!U z2u`h$xdy%R){i7z(1Kv9<-2y@8ICVsLxms#4~!r%dZ@z5PXobt;fwhLwFgn=1?BJB zlLSU~;Y_3w5i4c1P|JQ8YRne5k}N>uAJR8*-E8>n&MgckId-2?_TL)|VBk}oz3KX( zetruI{U*njYIdNCNG|p^Fl0E6G0E5&c=idLkx0j8wUDbex(ot{z-(Iqb9N`<cykJl zhFD0!At&N=YYI*a@fE<Fl;a<#;CNPyP0ZVP+&|Gsb5roWJTlT(<9~Y!{ud67JMt?& z(a`f#uzvT2LqC=Xg(*b1Bt{RbWn^=y|IwA@<sQ5;1^3HGazEY*a(Bo-Gsh6Fv9n0d zAvura0+NeJeum@{l6R0?M)GqY094O#3K&)ZWpfA<7(zIPOJ=A8iWKlQOhG71JzJpK z`bAhcO@tBVFbI&k<U^dBNw5>x$6PF+4h?K+TY(jx8h~;@o`4g?#FGS<@KA@EC_ldf zL^+dIQ(8hhtuCsDx~R{q@Y6=m{l&wp`v93D4o7G!km<Kj0DK8p6!0m0VFvhA1AMCQ zz8~m8qNhdZ^x^^F(E&PzT?oLUqQ#SI11ze?u&69cEGo+qi^{UZqOvTps4Pn?D$5d! z%5wUd0pGnj>pR#(m>g#gW5PG^@eO=@10P=%KGtw=5W~XJ{g?O`Y*+=hH(pP?h>_Oo zh7VsCnZ>tWfMGL=FJ7$apAH4aq#DE>$Cqo+^ryprGStC+@{IQK2+e~!ec1QW;lRM$ zusAhE;P+!7KpA~aB9}ju>)6;YJ-~jGh3TDF=Or^0lMIMW!9-+2CSk%~ok@5;zFZ$0 z<poo4zIX)Z<DiV~DR^Hxg7?5-CjxmpL+%+PhB1Bx&tr+KYj~SM@;(r#DY9Jz9}I8= zdlzqifdn^s*n2=SNdXVoFY$qBgMmJ~iUg-b3<{h?&@gn^61?RIXq2-lP2z$@^<rXx z2?R3Of9Iu6Kk&T~VDKmC(^e1E-ED*ikeYH2w7mr=t6N%6y8z(eq2gUhD1rVs&GM>( zzaa4(0{otK7GQy@{6%@Bc-rU6-svFK)1RsU9@Jjq56Xf1P<b*BEoY$RwrmMoTROgZ z1aCfv^C6_lAlOfo8SaYhUnvV<2AL(gx#=_<*zzG)IkA06*<c=n?m}SlJyr#!V<u7P zHcW~7JT&gny#i(=!x`A7Z9*C%Oo|MpFh)3A+v`yAJ~Bj@Z1`O-2#tPT6CVKQFfA@7 zclPPHVa|?YM^p5%55jQ7Zi<=!pr)w{>Ph$+x~3U$e-c34{?#$_9Np6Zzu^QK;J1Il z4VX#W{VFokKMwSPnIKnqka(e)^f5DC2Qxt)@*oLj0wea4=aj#Kp(B&)H!%a91S4rN z^L^DfA5MvQO<_)LXigjVER*}++_yS1S2w`eM5LF%kWr#2X5&GMNq(GS`?mtijYgs| zXpQ;6ZQ2N69~ica``IB<4Df};dAALjDY3(hJIjFUn~((*3Cj&ijxpodb<ln}KIPa4 z@PuWN+(3eVJ&+#%5tK5ip`V9I3H3k58u%{)_B$k_?#>82`x~6n$CHPr(0MV57S#PK zW0UB}?F^6=)7zM;H_b3@;#a@xVtL*)pFl=OzF}{nD7Z4QUnBWF5`ttXo+#n&1k-_F zGM{4}-%yRWjNcepV^KWM%m_WyXSuVRZTs7li_MgJ((AS%)vkG+Fy(J-fvrUKqxuhx Rn^MYK=-(V?KYEUl{2xFya-0AF literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/glif_optimizer.cpython-37.pyc b/internal/model/glif/__pycache__/glif_optimizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42c2cd5c9e7f93ee9d19de3d2a79aab5d041656a GIT binary patch literal 5287 zcmcIoU612d8TPRq$8j=A=3{3+Tba^DO}m|Kx22S2wc64`RjEu1-L}Y@%6M~}Ofrt0 zJ$AaYk#m7&5pYqdNL+G}5xwDp|A7#HfFtgDHT;AM0ndA!WG30ANJu#H>+}8bzUO`3 z=j8iqYmSB|{{7E`-(J_WFDWyBOeF5$O~(*i<1Es=;>$c;<qglkSC7m=$tw*k&tg<> zAYb;%D$OF>vr%S7m4V|qv$E=-rfW<atSMPnvf(wD_O`}L+<K&OD{LMa-a2O=Xsz-I z=GS&xx~y~tz4%@-in%l?*<#Yhr#I-0L!?WiQIEgcrq=VvK;jPG^e#lGd5mjV`zF`9 z@rYsdCNDkGJd<0zjBkl=ahq3AWASsm%4<lK`8HqUb);<G;7zou@O8d{ucKCXUaq|z z^*ZkjGqnt{+iqeide-rl@V<#R#de{aT=TVz_4TQ7OldP`kfmIQv~mNooSTq#-hiy+ zB}gZ?Agg&9vX<MBYxx@24s7vJR_`|^$f2y6*CE&Q3gkxaKyKz$$gR8vc`n<Yp64vD zZfnPkX)34Z#+jUvn?<fm>$;G$>BVDh(#*AfMa}i+j7=})&0|_`CBBherkW#`HxCT) zkF#|c`wBNt>pOZeF4thm((d?tFU~>{2a(^yH^_QPoZfV=rsJ(-go4LPdvW}D>D^?m zZ5P(h{9z!1LF(=Ysrx`Aao3H)xSQ>}&vkpBhOv8<UvtC5Vc5<>j!bLEO~Wkf#og4+ z5;uq<H;Kcv^^|ndED)IwONLU9htd*3%#(pv{fYX1kOf&N4H0*xL*ogwi!-V7Og2|n zFPp0?m(??CmDRM@9R$AWHqWRYvY~e4cd)NG7=)=bQ!Gd}LLn02cSdnrDa~vA=-qdA z{iv5_zN(V-<rZ>tIq&lz3#56NB@w)b<mMA>A+391nud`qM@hE}9Z9nncM@4&n9HZU zw;hKgsJc*nNS15EFEh_1RZ0T}kmUz~h%rKI9a{*aj;O*BM2*B6i8={#7D1jOHb`ue zI8WjNiHjsIkvK<Un?wV`+nU?6SU@rPA2jg|RDPAdd2{c>G!*GxupjW9d%=Ssez^BW z9JG^|2e0gf@u%rtG7RIi4Veu0AEtZn_U`Sa*yD@CpnVW@L-dWXiIg8)pKIy*AmL$j zy$f$w!e5-io#8`i`%nyQ=F>{kn-E&nVl~}jD?h_#7L^vSZs~P~AHKHkP>R*qczX#_ zcIHF30V3+5FDX(%%MB#pj`YGk`v8+Zprj8V=>tIefR8@FqYvol10MQ-t>0DQjQVb? zdd3i>)>Uh)7~&~vLe}`-J2K(YAY`UOJcE=hXNk{y?d%<7QZllpo9yx5_}sEuX1&@3 z^7PQx!mG6MJQA5URT`NZ09yT6KV}n_v%Z;rOVzM0D@vdZw%aNR8+~Lc5F&UeC@xAX zPQ)OHWGUSbhGEN4tC!ZNK{UcCFDV~h-OQx|G!T-`I7iXrrx-J(Ni?=);Bc_<bIUvW z&t2O(b;CnZnW749Htj&<h-n8pq5&dHrXOiX?1=qZ`=!=loN@h;of%xkxg+B()J=56 zI{lHB>ndktCNJm4k<RG&l%|M66d__n4V8m}C}u-J_U_{J(Najy<gDox2nrgXY)#m& zuozm-dF>baMeR5GeUmhMLOWJkLI~G)UXpsRhiI)IzI=KFzH)96lC_h;@HVGmi#f)x zE$fFotOpSGM{)1|DD=}X<U6;bq#Z=*Z6xMH2y&2<=V;y+AeL563j6?Xx&@(DUYoEC zD?ehzii@Q(X~6MYy10gB;zbh6r&fS3fl@5iN+1{VR#_TpCdA9sf$StpFlslHrJ=xh z>R1W#*p^wi0;N6u@CM#jW;2T&>a09t>q$HQ8LCr4PffRh7nkq?IrQ-}|6N%pq}(Nk zSum8RQA13m4;b<BC8z0<`_RcSkBzyL5Q@Vw6#UCIp811Ol=X&D58-Bk(sNf~hvK_v zzoI&6hvX12<N+#EvWN!oTZO%Oqs4mZz*X=n2e)xV)arE3KEo+RnoW#MpX!QR8M!er zak}-~q|?ofNr~7Vx4Oo}%FNt4LZ8psVKXbi0|1jp@QBZ~PyRV6AO3AtR;IE~{xY$P zQ708}G5aFTWcMpzX4<rxn}84}cX%1)4o9u7O{$YxR-3Nz%4{{23)*RlJC|2-RMMHT zF^pZGHnQe)okpH+U@ujY*=Ak?-%>LJ!mGbSE%r>lU-_JgZDNw(i1v|z(h{#7*eHGG zeXMo5MNF`N?pU9g_xZ=CwRdK<McCL@_3wX-nfMxT0-SeJpQRgzJK1?!*%5<2+&z8L zoUG^Tyn#J84xmMm6}d^{b9O)bSUbFPru~gY`zG42srFwidh6&-In;s6HYatA@C8<h z+4A~DjjyA8gZ4eWkZ;hQm1b2cr*hWOaWXe|TTHpt_)^f$MnU8%DhKxADmq0BCH<lJ z4i3+WOM>9NKna41@w0TD02@pW+^ZeX!*+U&5-2PZ`^iY8C%4eFWqOs~jQ6C{0fC#* zPgzoYOP%+-1RkA}f8i<4{~I*j9h#}Z!I0b;bs%<hQM^W#6n~{j)Kiox|7{Ylk~k$x zia@<iW#m-S7Ngit;&v!5QyC$#pcpN!U<h`@RXh_{RSEbWz)_YuQ4(b0d1|Uy7x6Dy z3F8swg+F@dK#l!XZkM(;6<B$fPg!6G$dvAf+z0kX_duGI`n_7g#eJoIX%#uIl4i-! z??ge@+gL&j#b0Hqpur_YfW58LNzU+b11bZ1Rk8!=RbZTg`Qq-0WY1ft&(iRc^^{t? zDp>8@P>+ETsc`^`ID{_Jk03OJW($~V>W*$2j$xbIY=haQy6LbD{dF)ms<&9P=78Zj zOgHKk6KP%FGHnnSTi+rk2YH3r%+c#QwOWO@`LqjoqmWLqQo$R+F`^PVC%6l~iq~}j zc653D%)+5J$A5R+*>gu}+KrM2zPcdabOSeqX#%0HNIiH&7n~(^JBe_!{ly6k#p)3I zz3%>FV^E>12L8GMM3{|4eACTF!zjeO?P$c8T@X_T+5Gf}?)*06;(p~Sj^w@w??VMl z>GGtVE>?H)Cn)4@%aCRux~a4V!6ACfYG)Khbd4I0GK5s34Mh}EzCv7b7K*&eLN}gs zy2sVSP@nr$p@P3+0L4W#YkXxnye>Cf@H2|13u?ZLOoo3>$cz+)GG#=<YDLe1T}YiJ z>17y~e#U3co;A@Yh+)MKN5D`>XO924(8<i`%JeUh#mUFrq@xU6Fo&7h!>={`|I=>c z3v~C}dBR;(+$QVTg2>qEolllwSwa9of7y5z)&_tPA5zBTy>y5k3LD9`f?Vc|y_YX6 zVDv6^D^TbqLDmrOK}hDW*j@Yp#b4r0iP&o88oQ}K$zKU=TgL7#!VN_niYK^8;U-1* zKf12_zI1#aH^osz>6-7~M>HyG#5d7gJWE0Wu)_WCQTE3q2zk^x&a6#QPGW+B)<uj} z(N^2W|4Gbw!EV^LQ*}yC&vsOc)`p4&UI~Ccd{_j4x6sS0r|sVG;m$1XgoUFh?GgKu zW<O10Y0@8PinV&z=GWhy`So{4U4M7Fxc;tKGxh9wBUw_dJd>IUTCcQ{dwu-%qL%lh dok{yvp|0B$iBk$lHtxc<-UPPVK+dPFe*=|mMrr^6 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/glif_optimizer_neuron.cpython-37.pyc b/internal/model/glif/__pycache__/glif_optimizer_neuron.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07a81edfc035222381bac3d94a8a50c79ec0d97e GIT binary patch literal 16539 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 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/optimize_neuron.cpython-37.pyc b/internal/model/glif/__pycache__/optimize_neuron.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33c3e4f918eac92173565c5d865979d67474546a GIT binary patch literal 4278 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 VK(C<(VP*x0GplU>##*t+e*ntmg@6D6 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/plotting.cpython-37.pyc b/internal/model/glif/__pycache__/plotting.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a424fbeafdc4d888ca22ba7a0b59fd0601618270 GIT binary patch literal 4038 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 big-8XcM+~KgbIT~UM05fdhR**qFwtp{u0v~ literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/preprocess_neuron.cpython-37.pyc b/internal/model/glif/__pycache__/preprocess_neuron.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ddf614e17d9a176158bb7dff7d38a1d92ac6290 GIT binary patch literal 12989 zcmb7L&2tn<cCV`bRIBw#BP1b23lPvS5+4Ke!7zXj5~CR*7)iiPA-1;ES=}n=FS4oy zw5w;mD>nQQfp;AC#TtWSIK-M0<@2|iZ%;*W^k2_GCj__E;$`}bZ|w_1XM*=ki* z=F5DUFY~>8nfYGoYEMr}!BhGBpPHv0DayZ7qV>cPxq{dEwW=sW5o$@%gRiQqoYr&= zU#%1=NA;*0<i+$j=Oy$6f0N}dO;MF{O79L!q{}@F>E*DG!+w2$b0ej}@*aH;$D^f8 zd9S{g<FV3Ed7r+I<MGmPc|;%Kc%n2~-mmZHc(OEBKA<1qcvoq>d{94F&gxlCr%-M} zpC}*F4{=&89WEc?mM8V2A>>#HIj-jz(p@@HKB=D!bKfgZ>C<8S)EjzmT0f24w0=hP z=x2qZzb|@4pXh&~>F30NeqIdfAK?2Tz8_sz#2%4(rihI7@m55?z*vXHJ~8}E)jttO z#HiSh*hMiW4m?xzPsOAd7Y6~kB(h=xkjvH;ap<A;ttx+IUEadz3Ux)v9sQ0tx0F-; zXrXLZ@a-;DO<_2XEvx1b_{QP_W%tgkTwlCl)J$7GwjB$Q@sedauHihYo6>TO<=MHC zkvB_u!?hgO5-4$+lTOWkXc_rxxmK-M71yX140i(<8`Y993bI-@%Jq_Kub1o^a87mN z)Lp}@2xHSgamzI}ZPT!x)HY2?09(|}l9SW?{(_A{+>B$CY{&I8oe;-)#88wRF4(AX zvs!Y^qGhbNBJPI2_l-HA=g?cpx1N}JS5G;m>SJRQ9oZ~S&5r%&zkQIp{9P2|YWE*g z6tt@@VR)tWXmvhM!`*r?MS{taM#NHRf?#qGTQq;~4cl?-N^yloZ|+Ins=0QxvXqPX zNyDg^Wy>)9lwp*sqF$nS+AzR~Qjqf-MeaqF9Q<K(_QKk2$CA#PxnYXwb@Q=VdAc@J zG4s`mFyCLZDx1z)wPsbEJi=;i<EgW@Xs@q1wrfq*%=|-)6>v)>ln@V3*%jB46|-~- zO<Sc?#gbh(Rg+dtR`ZtQ7!|87tCi{6Q#k+%4&rq*1WAR{ze5zyxhuc><=@fso6GrR z08&V&B=FASb-qF1X>!a}Jf*05su%YXLVX@x)0)X<SEb)o1NfE}K)i^YceMu*h9*5# zXd)t_&tt0MMdckg`XJ`TMC`e$DsJ3Miuj1KrHc4NO;+55NNlM;Lwy09@<tS}AZaEd zibB#@FPW~D4TU9Zy4kk)W~+s4!IqAjWhqHz@!T>cxPvirI62jRI2qP*AzP`JYfrPL zl;%^;Ak<b9t~B!&Lxp=GTfl^L+hrWHTq{8?vaVgWvY2Q!&VrC%$X=~hF()hSvX3_` zcf*pP*OFG&cCuATVWsM3&8$;jm*#d)FdZej!IL>#tCt)rdmIHVAfv~2fhq}lbYtd= zIpfyi&DGZ%bZS=KF4&fnZ8eP+gXU@_w2DURC6QgXvSm{QJzV+h=G}MJhUU%ertLt$ z?S@Gc;Z0RtUA#H_#p^^dGB=ODQ@iL2VjZ+v7zY}rD#o)~qn>8-5bkWf;@Txnw$SsX zs$+?OHJe7h?p6zh*ErN31mr_P3M3^|r?8~G3F<ek79?ai*B7t?3en8(t`Q2)HrGob zFN#%+FJ@siTL9s8aMpT46601SSH!`xg`CO`5oGv<ozm2jIHoYv$!`*BD5NgY>agG4 zLF+u0>`ejPd^V@)iS<%7|M13~AIA*XsL~n`V~`|O*BD&F2$Md;P`Fkei^Oy;DQV)% zE(Cs(hS`O1>nVz{>T~=^t>pSqh|Xg_0v*J9B$x6NA?>~<Tt5Q&_q*DX>36lo%8#*F z$PsE~6oKB)Bp5V*44OZVuNvFxQVtO%SSYZh@YD_#79(u!Fmjy?0%a_!4r~2dR2@>I zYFg`8lbSpZ_;=KmJn1}o0^JvCHEP~f9zfTKP(wje#h%A$hX9QeU&?94wO{<x{~TZY zugk?h$^66he{DRw+~_OVMdC6^28q5OlXh{#_2cUptZF$I)3qm0_2iSM`D#@PN8f{) zY&WVE*DPVW6f0#cy86JTC0!fZY#Wp;pp0WTtehstL7AR3E10X$b>MacE2OU#oZSPH z1l%CzECIveeW03DHU7zI!1A>2(L;Kj^f{EM;#@&MeSQXgehs>}8T~V*ph8D$&ypb| z#v>E;VxHzjunUCthHj5H6QuhK8pbEKlqWHwhlZ6JTEWZgD5B!~=_Zy6p=6Z5)*eNH zpcavhCH5CrxEtt}HhtPxH+OaF52=f^YoHy<r8`t1)gD(GN3oBw%NP%%E&9_JA>i0` zTtcLUvV$n<@gAxpi-3t5ZmO>G5@flWr*5gQv_J14kmm)~bgfd;<5)N<Md%@5f+eT$ zk*6uH%0m?A6`iD0o<VRIZ%8O+S-fDEu;fq=3$DIRxG5ggX)|U76AsdY9b9XD$|d!5 zDAv3|;%4-O<C@YnTs>xC3gEM8VDF{Ju+y{L?P(N@Xh<5*nZehG>oyTdn;S*#RR^^s z&lGtc={yY-JqF%Byt8<nE8ST3!Tg6wnRb<C#EWu#*oDAg0VntoS8K*XQBqly5^m&W z)Jwcln@KF;krAcYg>Mw!6mnvm(~V_c@w!E91oeBUYb(}Fy9qB%%e@zIlMlM^rnYE< z(bMcj$prBGfZt8{B8gN#QfW@1mgWH0*wwCWkkhGldJpR8Lb(jXGa@xY8<|$ydy(6X z+#${#+LgP{8x-jgg`mwyQE3k29l<;L<S*SGk#c*H-$PrNE$y0e-)-*qhF|stFmFHl zGbnlyBIfpsJ}<H#C4a7sD6dp(heo(0_4-{UM^Q52bx}FgGyr<~GhD~F>Z8+l6?gFE z9&Z$*K88}<zwJ`Z1AuX_I$-0VyMIglR+AYw^K!2kAbPm}{q1o%2)uskcL!d!G9)ni zcn{*uGVUPb_IiC>->(?9r(GZV9P)Sq_4Vzl?-2Mt(dPRQ_`Z+%ez<wW9Tu4_qH0*| z^?JPCtq8{x-eK<u#hH>mP%(k`5VtzStwvssu$)bLlO$u!qxkN__ZYq;1;@Fc$9M5L z2kIEs(c2U5DEP-x$(!4g&G!J=(*c<RWbozwB6!i9esam}!ML7;EMPX=pKhK)UY|GZ zo%BwDW5Yrr&W9;Qj8JM=d8IX{zl}V)cvlJWr(VOK+JPUWcH?_21!LYcC^_vO@J760 zFR~R`i!{$P&o<v@2|0tja~wO1*m;h<kJtz9cqp-9Z@n>*@=kk^jN%@2vviz&-i4Yz zY<|@I*q!(`Dy0}}UT_b27nnnb9~^Nf9~^yo49mlXSDH8=#-D58*5Q}OU(w<A;14g$ ze9U?uz9M{#te6mo#9<t%CyOyq`iYxE>%VtTc%ST`_@s9pzjGPI`w;RrCXR-5AA8=j z7HwW^e%id$yzCA>*yDXFQsVe?t$Bree+hNYRF>XZ-{>DxA4Vu9e=Bl7yw~EyA5r$? z4=>B3`5w;-n&ng8jF{f9h*Pg<E)nFkd(yii&SapKc*F^I7O;y!`f0^|&)Y}xPO}9u z=rW3hk{oG`GtE!&{_|w>s&~~JA6A;P7=yShiE}@k*1JmOy{O_&Jxl@fm#WgdrYeoJ zJ0;H3k?=0s#5}+D&9$$Tua%1SmEui&o0J>wv^N2cLnpWgA*b~F;CT|VI@g?UUiap( zPIaNa|M2EpG53@==gpIxpw}n|N)vKkeE7pD6(0p<#mC}8Am?wFf2Jb&ZNkx+3dH0$ z82!`Y6XFbd^%>p;yr1L!0`DT;8<pRSi_InRskf9-nm64u?%7Zmje_=*80QG}qmcA& zdP_x3TzVd9-tuk{cbcE!JB;rF^Y}9OIk%-EoCjB1oWFwfXAE5kp=aFpceD`HpP>4^ ztHlVn@TK=9x9~Z>)WR3|&fvS~EqY_%`;E7>coi*v&Mkg{1OF^ii)a~Ufl3zr1*e+e z(Q9LI1F%Ie*OtNDP8n=2BM<8@%jfRA75ALC?5%j`pc^9L3?}&?UAEf1-Mj<dcgaC< z?T_F+%OS~PG1k0G-{6PTSFJebeZ3>4??~Mfb7KCP(p>Y_yu04$7IYnAy4MxP?qLl9 z%vPHB@%{*$zAvs{RJ^;~OP#}e6pGJYL;wXRJe|XP6oydn1yBm_Q5Zre7)s$ifiQ$F zFqFc30wF=g=PzR73$Nc+5oQoBdP5vP&S4+I8!zIZZ0VvRZhB+hDEfHoMZ{LUEMi~2 z(7XfTcRc)_2)<(ZMGSZ=z+3e+aU1PTXB6O_^UjDnz?<<d(O29>@9vAQ!g61u9Ckh1 z82bt5ymyw%>cG1%?xE}&=Eq0g$7t*RizrIm7e4~jXhVM-LQRb5MQFcuk>_><(pSA% zVTl6Li{1@U1PvQpuZ=v?8lQO!-sj#I;sN*kA)u??ZSRgKaSi2*fmW^1y!P(n)KlGg zOp0M+&Br9#q}y~%>ZM~69h63tzX=aYdYTQs2CP!+mJClzd<5~;-Df}?mxP@Uj!PS~ zYY&f0ldoF=w@*uL3_o6}!hU>4558yp2rP?o0`=%|SK76brT04ZT8C*$&y>w4cDY_Q zV6ti(toY=l55Z;~W_6<QNybm)>r&F;w<|c(*y2fWAXJ906#w@(|NYN5)^A;IBsWYa ziz893k$`!EBWVJ$Q9A25jgb@I_ein^H1+~5EZkv3!-#fJ`yCxzzxzKt^SP)#hz^Bj z1(=A~5+RSEfSjb@C{=odjTEzWHisCM>NN{C>pL)e7h$DwaE_a<!AufCz^A{e#5uK* zdoxmC?|5u(T1Ei{3A2%5V3sUYu&ET?jSJaH@g1Gj!y!6yC5&8ZMZOLrzm->3b5S<2 zEUy~Nx0iO&o>TQG80IvF$YH>Cbtk`UtecMQaNGNKz@2(|W@VN$#&=}E0%LEok-wEc za<lH%*rt{R2$okKoh+~#<ICA9h7!I7s$-d2oh{f;ERmfoWG5Z&%bz}*p3!4BZf=yF z#tEu`O{s2Oz@EldT^QKNs0w2kjY}{>0q(E=cC>u8k$UK4>#+Z!!d#r0zpLxp$KyuE z-7xG*A#iYzZ-aaIY87_Co#IWF%x%jnPeX_kOv)QzSk?^4crUvSiYhJh*<;9O+k}=~ zC39vOhF=F}Ms#GCS&*!y@S<Rt7Up-D-#CK|!xeY}z#JEIWjYt#)hE6G*6pi{3$rt; z3pbb8Qrj44J8X!(+_AxJkT6}7U@`}3g7IRC<asfax0V+uuz<EKj(Ii<lc5-<;kL<L zz~ogev+1;5dzNYsB{OrS7<du>@iI&((L%kF_oJpPIxvWxZVc^e(E-=+*BEZuJlh_r zFy}kcV~z3e%MQ_d&|{DkQr<|CdyIP9w)oK;YMZ8LE<ee-3j7r~pz#r{zX>~#M~5;j zD;JeVz1U{5%crrz_I5aZ@?_~HzL2nkw`P`%O`*xV0y(fCgRuWfHu8eGPhru9OW=6T zbe!z^Q)Coi@kc#5m=s|z+_o!4^d!v_s!#8tu?!q$nr-hgiuvehsRR+`0uDCEio>Qo zZBT6-e~YT$fu>KwG)z;5G>@^3g+z<ZkV1znU~?tEtGx(8WwX~1IzaYf40ADGJ>#oq zef51`J?E?E<#j;y%rZM0*<I1b#nk+WGNYu+^^s0BZ17wQU6%U(ofC0q<_PQPmI^mY z)k?927s&d~;{8GM@PgII&}un)5;M|)-Byrn((Lr3H0pj@Sn#z8a0jJ`JDX;yZpoWL zFOzVh@&f565ThRW8ANt;g0zW0#L&(~&tUj4;BC@7$(HkILEb{(Ytn{+@dl;IjGK$- z-OGWZD%oYnM}l0qfsphe2g(%cl3lUOdJ3YCewdIhvJ%%}_V1qU#GdWI?#`R=Alh8I z(Fgqnmm$_Mh_YR9v53Tj#mA4qgIcrvE_N=Guan24WvZt|GAO7gmu?1CU>Qwq!{t5d z%o+tWka|xbJ}5x$gvR)+Sz{dt+5@G+zU$E4MdGJE#73lC3$P=mlW$D4_!l7Tl$9)d zt0Td1cCiz?VaaO1MUBCdESngdG<mJ>gq7*+XMSvBaey}k$}sSTW9!4KMK11-o2{Ke zOI7Z0nET`FZ_m$~EmuWH{W9PW7-_Ei+4XmoIP|VM;4nY*u3Fp;9cy5yCk<1WHMkZq z*)iC?<iW>M?Z5{Fh~MjMvVMSX-+5Xt!@p$K1Bz#6B`F<034e_3Y+y2-_fyyA=4Wm% zt{T@?{q9zL_V%jZ+e%!WTUnV~<b_8cU{4NDsqj*R9yoV8RY8~|Nq4h(+K)nmKG8?v zM#3Iv<;&YM%X2Hn-G!xV@K&y@&MdF$!*9%+Te_wP_Yr9B?rf1EZq<+*R<+gQEVY=W zF2>Co=><Q6Ip7bVxz&ZG>&C5{t8+`M3p0!IES01=>nBRpVi98PN3p@E>e)_0jMe3Z zTZ?l$NgaPn2@veZY7&j=`*^52G+m2GcFx7vSM5iz<Cb*GN0NhQd#~UpS7z?a8S@L* z*$otUloAg1FmPY_TGjERHMm**=!2>a7Zy8G<z=dZ4k&Qoxsu&y?B0_J%IKkt#A8!d z&{;{Vvm{@Fgp)vFvB(*IvhsKx3aVuJsXzns%GQ^+uy$=L<G`~KfjZFR>)1bAC8!qO z53_3xJ`qT3cTfSA9B@9pLt=V@GfRt|LGo-XnW7sejO^%XoMsG4)7lC(L@~^Cb`<M< zl<e@G>H`emQ%|dc?oPQ$EuUR(XM{9x#oe4Z8?<u#P3NN>%Tue4qwg-s)t`9tvFeR= z9{(X_xz@4vDi$np7#2RC1q;n<xt*>lJs5HWiyJSZn&ZeXNet*@D_0TdT|98qkX)v8 zFYg(*c`-l>BV9Dw2JPucx0$qe8`#OJ!OnSs{W7Fl-vJ8+;9$FxbiJt)DJ*d8jXZcm z!O3?P<j#_hO~=uI4%OJM3FC1!Sb%v~gcD=Ax@ie{Y`fUm?=PmO7FHI*wN_puly0!s z2!WEEj`C{)r!kt_n}q(39fLu89lgI}7Z5;b{M#4-Xr#SLhfNwwH?PetuFl-iCwN0( zn65$XV_~?1C4*SMU1YMoS$JD9`5uwm`_RCeZq%wcJL4jSo`Du{jfZ@lt$jq*_cD|U zlJ2H$58}&uAA^H^5CaAnP%3R~ml<qh(S<g?E2pQ!O;wQE6CMb6YzIc(0OXYqZfZ;Z zn1<UV`uTX*UbZ{$C14q)y@*_=vUv&w1r}koYNwvyep<(dKtC8Z{CZZ<JUZQOu2_f4 z)cdwK1pxrd1qKMkcpt-iAeKV?@Qw^L#Ce!ZK_n=YURhmSX*Hn-sZbxt0`-6nd6Mi) zdJ2-mNX8kx`|kY8c4B$;Ry)xXsP9(6f%XBSRYJ~DWrK7OX`hb_vP<b{g5i|Hsom$G zf$dXEc)5)>cFriRN9@riuQpz-S4-iWM3_-i?CDNwy=pIRhV-M{5b}n!H13PgZ&*8_ zo=~$9Dw_dDO6^B(ke3S6VJ*N*qn0oa7-$2n45^vKAbjd6bx@t=H<cVjJ@_Si)i{21 zDT87}-7wzPH=W2Z6tsb=UNs$wA`Idw?e+2@9=DWH`xBZv#&rjmJ~XDMg_Q;+qlq}E zZRIi*8t}GjMsAuYiUd6jdKOjVpo6FkC~x7@-I}1kG(Meqpqg^{H>75xt$M<5VhnVq zLpnOfAwhlRpO%dBc%j{>mW&KxH0U>qR)SwY_!rba7@^o;WE3MF^sQGL!tEc7zSg2t z3tLO8DNX(q(m}J4AKJpwOPf9CX9(y*$Sb7@6TnMNsBF2VnAVO(g4hF1MBNCk2$8j3 zK`QP>J5mXkE;VxA%Q)&&-NZ{=etggc52NO$5bO4|Ev*>=JdIS37kP!!eAy_uB%7eb z?+d04t5)7eb;CXYyMyt-sa6`%sVU*Y!k7?N!NlU(NKQ>b`C$Xqh)qplTa)YclQ6m9 zQi)^Xj<77&>ADf_K;puwpEiXskjpUn0L{q~1rMp=6ys2~<7*G<epFhfkTg0xcmZ{> z#}c<t<rbiHT4WR{XQ&We5%uGIc;0QH#(CScEB`_!3o?2uU>!5M#db`?v?l+GD!^r0 zDr*?I_&grD4?sDL0ER2JU&WT_$<4^0Q_ds8=^~O`+_iLIs?OWBr_)tj&Mo666>n1Y z7~ky-HtdgqppUgK&rav7(we4`HR`xpXp^D9j}lPt-3gU{L5RoOh`iR}*6lRkx}Bz5 zx6`~`4|f&GRslc8CG;p2(Yrg!1m~f{-&ZAVCJZxAmw5Rcq)&WbNp76%Uc3p{552V< zFMhno*AKq6pv?2JLO=7?Qg1p@@@YXo@m9R{PJ`?Le02FigG)vzhc71v*A)5aL5C21 zyxp8dH>RgK#6~5&iHX}&1lId@!DX3{54;gMwA(_e0;E=2o+F%NZJZ7fAXc<irQph? z!^b9l0R8~FrdP7paTl9ndOY|BC$q_RZ7sp+lq@RG19bo`%NhkdduieZQ}_tQCMnpY zfDUqgSNocJaELojIdmtGkJQ1erb#CUDd6jD+W}2fKY0;-!+rKkn7WEXwklk!gjyvf uJgAN%w*AAh3fLe+#-WtyN6Rk%=wc@RQzLaEl}M)W{fY7u<(uSSO8I}eVzI6O literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/rc.cpython-37.pyc b/internal/model/glif/__pycache__/rc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edd5e31c7aba2e0d43de1acbca9cef3d029626d4 GIT binary patch literal 1703 zcmbtUPmdcl6t`z4Gif&4(h8LgNR<y9h(xmoIISuK-Eu<}DndwB(8xP>Chj_(S=-s& zRFgy1_IvD#6CZ&u0r!X-r@eFH#IuuZvjNcqw(NO+&+on8ygz=tyW2r9^iMC@Zz)25 z_``ZcKzs?yehwQ)94ka|_(n8>Z=~W$LKEy|v1(0HngX5h)@wvFj=w|w^a?c5(>`9j zH<Fs?wwA}j=1N)zyuDJm+&VeQi!n2-aKeB<7Pg4J8jM|78LUHC_D|SKG>>5=uv+K8 zJJg^CzlxrqAAcQ2^K_m$d=a_0Nnc@(_W<E2y2SH#lk)g2_f6D8O&f3~Zz3L#qDQF7 zf;?Ml-H>B1cldd7(Q3RM?6rF65;S{geyfR^TO9Y$M`+$zQacE~AoKo#y91|I4{dR~ zO?;6yJC_)vCIPAws1{INPo3=jfSR~Tn${@xQDnbBDh`<{riwX1jIa<VrVH^YDOk-4 z84iSL?qyEulGK$G+DWF!(Tvo>j4Ctn{0@Pk1hbCVlPQDiq|&6A8UxpZh0{toR*FHm z8MbdBITHcdvElgedW7TZen{#8@u?-%h%jT=%r4z|m#bSIUtMVnZUGUo;#3&GXwQVG zK~@XqmQGfP-eGl(Tk7Yca1so^!z_0PWTYzQ0(1`y%1;pMz`d0(1d;k0st@PdfrIiC zOJqUwnQ&91Z^R?;%@*L`YkAE(6Ra4MQ>LbZ6cvQr$AVkpD&oeQc?}U<MkSan{?+W; z=>E6e%^LBk*)S~B|FZngYTL5!fBFhT<6ileHlBKV<=>TlwuoQIdJ*ZGCY2U;5i6l- zs-$MBq%CEgJz1ozu7&3PUE19&GuquOk43~CO_!0U=`vI_Tm2c$R*H*kr9;yRb4H%i zJIbEqy3#opCO7Pi-UZ!l7MR^)-TNA1c9ZurGXACdt2{gyes7^qhHT9E;E0_uJsW<d zSpjKgpACgRwZjVj$QH0y^>}87-^in(l}<c_K0b!N16>7?u>5#mYUnu#$Nr?^LhYAI zj`mG4sAr1@p@Z{P2j|ZY0aF3*L++sc1#bfw`v5ldL4y5!AK%9W=7(_?sQb7B^LAwJ zz>R*Jw)AvT&y3evWU4Alcqr&6YZ!wyj6r}g@Gu4&uetH*q#s{j7yh>f;@r24%L}1Y nK7zKMLamrk1m0_i*T#0+`))r14^t(+@MU5>oHlMpU6_9Z)qV86 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/spike_cutting.cpython-37.pyc b/internal/model/glif/__pycache__/spike_cutting.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ef0eecf27ac852fc8d598781a06e7ef6af3da14 GIT binary patch literal 6707 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 literal 0 HcmV?d00001 diff --git a/internal/model/glif/__pycache__/threshold_adaptation.cpython-37.pyc b/internal/model/glif/__pycache__/threshold_adaptation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eee9b03d722451b83a7eeecabb355ca690a05a16 GIT binary patch literal 15042 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 literal 0 HcmV?d00001 diff --git a/internal/model/glif/are_two_lists_of_arrays_the_same.py b/internal/model/glif/are_two_lists_of_arrays_the_same.py new file mode 100644 index 0000000000..dd3b81548a --- /dev/null +++ b/internal/model/glif/are_two_lists_of_arrays_the_same.py @@ -0,0 +1,16 @@ +import numpy as np + +def are_two_lists_of_arrays_the_same(data1, data2): + '''returns False if to lists of arrays are different. + otherwise the function returns True. + ''' + + if len(data1) != len(data2): + return False + for a,b in zip(data1,data2): + if np.any(a != b): + return False + + return True + + \ No newline at end of file diff --git a/internal/model/glif/configure_model.py b/internal/model/glif/configure_model.py new file mode 100644 index 0000000000..e585991078 --- /dev/null +++ b/internal/model/glif/configure_model.py @@ -0,0 +1,411 @@ +#going to need to take preprocessed dictionaries and model configuration and create +#a preprocessed model configuration and preprocessed_config file +# +#something will have to tell it what parameters to take out of the preprocessed dict +import os +import sys +import logging +import time +import numpy as np +import argparse +import allensdk.core.json_utilities as ju +import find_sweeps as fs +from six import iteritems + +class ModelConfigurationException( Exception ): pass + +DEFAULT_NEURON_PARAMETERS = { + "type": "GLIF", + "dt": 5e-05, + "El": 0, + "asc_tau_array": [ 1, 1 ], + "asc_amp_array": [ 0, 0 ], + "init_AScurrents": [ 0.0, 0.0 ], + "init_threshold": 0.02, + "init_voltage": 0.0, + "extrapolation_method_name": "endpoints", + "dt_multiplier": 1 + } + +DEFAULT_OPTIMIZER_PARAMETERS = { + "xtol": 1e-05, + "ftol": 1e-05, + "sigma_outer": 0.3, + "sigma_inner": 0.01, + "inner_iterations": 3, + "outer_iterations": 3, + "internal_iterations": 10000000, + "iteration_info": [], + "param_fit_names": [], + "cut": 0, + "bessel": { 'N': 4, 'freq': 10000 } + } + + +def specify_parameter_groups(dictionary, dict_specifer, neuron_type): + '''Specifies which values from the preprocessor will be used in the model configuration. + This is helpful if the preprocessor calculates many different values. + + Parameters + ---------- + dictionary: dict + dictionary from preprocessor + dict_specifier: string + The following are available model levels + 'LIF' (GLIF1) + 'LIF_R' (GLIF2) + 'LIF_ASC' (GLIF3) + 'LIF_R_ASC' (GLIF_4) + 'LIF_R_ASC_AT' (GLIF_5) + neuron_type: string + 'simple_neuron' is the only available option however here would be a good place for + the user to implement their own configurations. + + Returns + ------- + output_dict: dict + dictionary containing model configuration + ''' + + output_dict={'El_reference':dictionary['El']['El_noise']['measured']['mean'], + 'El':0., + 'dt':dictionary['dt_used_for_preprocessor_calculations'], + 'spike_cut_length':dictionary['spike_cutting']['NOdeltaV']['cut_length'], + 'spike_cutting_intercept':dictionary['spike_cutting']['NOdeltaV']['intercept'], + 'spike_cutting_slope':dictionary['spike_cutting']['NOdeltaV']['slope'], + 'asc_amp_array':dictionary['asc']['amp'], + 'asc_tau_array':(1./np.array(dictionary['asc']['k'])).tolist(), + 'th_inf': dictionary['th_inf']['via_Vmeasure']['from_zero'], + 'deltaV': None, + 'threshold_adaptation': {'a_spike_component_of_threshold': dictionary['threshold_adaptation']['a_spike_component_of_threshold'], + 'b_spike_component_of_threshold':dictionary['threshold_adaptation']['b_spike_component_of_threshold'], + 'a_voltage_component_of_threshold':dictionary['threshold_adaptation']['a_voltage_comp_of_thr_from_fitab'], + 'b_voltage_component_of_threshold': dictionary['threshold_adaptation']['b_voltage_comp_of_thr_from_fitab']}, + 'MLIN': dictionary['MLIN'], + 'spike_inds': { + 'noise1': [ ], + 'noise2': [ ] + } + } + + # specify specific values different for different levels. Although there is only one neuron + # type here, this would be a good place to add other user defined neuron types + if neuron_type=='simple_neuron': + output_dict['C']=dictionary['capacitance']['C_test_list']['mean'] + if dict_specifer in ['LIF', 'LIF_R']: + output_dict['R_input']=dictionary['resistance']['R_test_list']['mean'] + elif dict_specifer in ['LIF_ASC', 'LIF_R_ASC', 'LIF_R_ASC_AT']: + output_dict['R_input']=dictionary['resistance']['R_fit_ASC_and_R']['mean'] + + for k,v in iteritems(dictionary['sweep_properties']['noise1']): + output_dict['spike_inds']['noise1'].append( v['spike_ind'] ) + output_dict['spike_inds']['noise2'].append( v['spike_ind'] ) + + return output_dict + + +def validate_method_requirements(method_config_name, has_mss): + '''Confirm that the neuron has the specific sweeps required for the specified configuration + + Parameters + ---------- + method_config_name: string + Specifies the model level. Options are: + 'LIF' (GLIF1) + 'LIF_R' (GLIF2) + 'LIF_ASC' (GLIF3) + 'LIF_R_ASC' (GLIF_4) + 'LIF_R_ASC_AT' (GLIF_5) + has_mss: boolean + Specifies if the neuron has a multi short square sweep (for fitting spike component of threshold). + ''' + if not has_mss: + valid_configs = ['LIF', 'LIF_ASC'] + else: + valid_configs = ['LIF', 'LIF_ASC','LIF_R', 'LIF_R_ASC', 'LIF_R_ASC_AT'] + + if method_config_name not in valid_configs: + raise ModelConfigurationException("Model type %s cannot be configured due to missing data (mss: %s)" % ( method_config_name, str(has_mss))) + +def update_neuron_method(method_type, arg_method_name, neuron_config): + #TODO: documentation + neuron_config[method_type] = { 'name': arg_method_name, 'params': None } + + +def configure_model(method_config, preprocessor_values): + '''Configures the model from the specified method configuration and preprocessor values. + + Parameters + ---------- + method_config: dictionary + contains values needed to configure the methods for the specified level within the dictionary + preprocessor_values: dictionary + dictionary from preprocessor + ''' + + preprocessor_values = specify_parameter_groups(preprocessor_values, method_config['name'], 'simple_neuron') + + neuron_config = {} + neuron_config.update(DEFAULT_NEURON_PARAMETERS) + optimizer_config = {} + optimizer_config.update(DEFAULT_OPTIMIZER_PARAMETERS) + + #a) select values want to use out of the preprocessor_values via specifying parameter_gropus + #b) look what levels are available via the levels available in the preprocessor_values. + + # Skip trace if subthreshold noise has a spike in it. + noise1_ind = [ n1i for n1i in preprocessor_values['spike_inds']['noise1'] if n1i is not None ] + noise1_ind = np.concatenate(noise1_ind) + if np.any(noise1_ind * preprocessor_values['dt'] < 8.0): + raise ModelConfigurationException("Subthreshold region of noise1 stimulus contains spikes.") + + # check if there is a short square triple + if preprocessor_values['threshold_adaptation']['b_spike_component_of_threshold'] and preprocessor_values['threshold_adaptation']['a_spike_component_of_threshold']: + has_mss=True + else: + has_mss=False + + # make sure that the requested method config meets minimum requirements + validate_method_requirements(method_config['name'], has_mss) + + update_neuron_method('AScurrent_dynamics_method', method_config['AScurrent_dynamics_method'], neuron_config) + update_neuron_method('voltage_dynamics_method', method_config['voltage_dynamics_method'], neuron_config) + update_neuron_method('threshold_dynamics_method', method_config['threshold_dynamics_method'], neuron_config) + update_neuron_method('AScurrent_reset_method', method_config['AScurrent_reset_method'], neuron_config) + update_neuron_method('voltage_reset_method', method_config['voltage_reset_method'], neuron_config) + update_neuron_method('threshold_reset_method', method_config['threshold_reset_method'], neuron_config) + + neuron_config['El_reference'] = preprocessor_values['El_reference'] + neuron_config['C'] = preprocessor_values['C'] + neuron_config['El'] = preprocessor_values['El'] + neuron_config['spike_cut_length'] = preprocessor_values['spike_cut_length'] + neuron_config['asc_amp_array'] = preprocessor_values['asc_amp_array'] + neuron_config['asc_tau_array'] = preprocessor_values['asc_tau_array'] + neuron_config['R_input'] = preprocessor_values['R_input'] + neuron_config['th_inf'] = preprocessor_values['th_inf'] + + optimizer_config['error_function'] = method_config['error_function'] + optimizer_config['param_fit_names'] = method_config['param_fit_names'] + + #b) choose the sets want from the preprocessor_values + configure_method_parameters(neuron_config, + optimizer_config, + preprocessor_values['spike_cutting_slope'], + preprocessor_values['spike_cutting_intercept'], + preprocessor_values['threshold_adaptation']['a_spike_component_of_threshold'], + preprocessor_values['threshold_adaptation']['b_spike_component_of_threshold'], + preprocessor_values['threshold_adaptation']['a_voltage_component_of_threshold'], + preprocessor_values['threshold_adaptation']['b_voltage_component_of_threshold'], + preprocessor_values['MLIN']['var_of_section'], + preprocessor_values['MLIN']['sv_for_expsymm'], + preprocessor_values['MLIN']['tau_from_AC']) + + return { + 'neuron': neuron_config, + 'optimizer': optimizer_config + } + +def configure_method_parameters(neuron_config, + optimizer_config, + v_reset_slope, + v_reset_intercept, + a_spike_component_of_threshold, + b_spike_component_of_threshold, + a_voltage_component_of_threshold, + b_voltage_component_of_threshold, + var_of_section, + sv_for_expsymm, + tau_from_AC): + '''Configures the methods used to run the models + + Parameters + ---------- + neuron_config: dict + contains neuron parameters + optimizer_config: dict + contains parameters for optimizaton + v_reset_slope: float + slope of the line in voltage reset + v_reset_intercept: float + intercept of the line in voltage reset + a_spike_component_of_threshold: float or None + amplitude of spike component of the threshold + b_spike_component_of_threshold: float or None + time course of spike component of the threshold + a_voltage_component_of_threshold: float or None + a parameter in voltage component of threshold + b_voltage_component_of_threshold: float or None + b parameter in voltage component of threshold + var_of_section: float + variance in noise of highest amplitude subthreshold long square pulse + sv_for_expsymm: float + parameter in MLIN optimization + tau_from_AC: float + time course of exponential fit to the autocorrelation + ''' + + # configure voltage reset rules + method_config = neuron_config['voltage_reset_method'] + if method_config.get('params', None) is None: + if method_config['name'] == 'zero': + method_config['params'] = {} + elif method_config['name'] == 'v_before': + method_config['params'] = { + 'a': v_reset_slope, + 'b': v_reset_intercept + } + + elif method_config['name'] == 'i_v_before': + method_config['params'] = { + 'a': 1, + 'b': 2, + 'c': 3 + } + raise ModelConfigurationException('i_v_before of voltage reset method is not yet implemented') + elif method_config['name'] == 'fixed': + raise ModelConfigurationException('cannot use fixed voltage reset method in preprocessor') + else: + method_config['params'] = {} + + # configure threshold reset rules + method_config = neuron_config['threshold_reset_method'] + if method_config.get('params', None) is None: + coeff_th_inf = neuron_config.get('coeffs', {}).get('th_inf',1.0) + adjusted_th_inf = neuron_config['th_inf'] * coeff_th_inf + + if method_config['name'] == 'max_v_th': + raise ModelConfigurationException('max_v_th threshold reset rule is not currently in use') + + elif method_config['name'] == 'th_before': + raise ModelConfigurationException('th_before is not currently in use') + + elif method_config['name'] == 'inf': + method_config['params'] = {} + neuron_config['init_threshold'] = adjusted_th_inf + + elif method_config['name'] == 'three_components': + method_config['params'] = { 'a_spike': a_spike_component_of_threshold, + 'b_spike': b_spike_component_of_threshold } + neuron_config['init_threshold'] = adjusted_th_inf + + elif method_config['name'] == 'fixed': + raise ModelConfigurationException("cannot use fixed threshold reset method in preprocessor") + else: + raise ModelConfigurationException("unknown threshold reset method: ", method_config['name']) + + # configure voltage dynamics rules + + method_config = neuron_config['voltage_dynamics_method'] + if method_config.get('params', None) is None: + if method_config['name'] == 'quadratic_i_of_v': + raise ModelConfigurationException('quadraticIofV of voltage_dynamics_method preprocessing is not yet implemented') + elif method_config['name'] == 'linear_forward_euler': + method_config['params'] = {} + elif method_config['name'] == 'linear_exact': + method_config['params'] = {} + + else: + raise ModelConfigurationException("unknown voltage dynamics method: ", method_config['name']) + + # configure threshold dynamics rules + method_config = neuron_config['threshold_dynamics_method'] + + if method_config.get('params', None) is None: + if method_config['name'] == 'three_components_forward': + method_config['params'] = { + 'a_spike': a_spike_component_of_threshold, + 'b_spike': b_spike_component_of_threshold, + 'a_voltage': a_voltage_component_of_threshold, + 'b_voltage': b_voltage_component_of_threshold + } + + elif method_config['name'] == 'three_components_exact': + method_config['params'] = { + 'a_spike': a_spike_component_of_threshold, + 'b_spike': b_spike_component_of_threshold, + 'a_voltage': a_voltage_component_of_threshold, + 'b_voltage': b_voltage_component_of_threshold + } + + elif method_config['name'] == 'spike_component': + method_config['params'] = { + 'a_spike': a_spike_component_of_threshold, + 'b_spike': b_spike_component_of_threshold, + 'a_voltage': 0, + 'b_voltage': 0 + } + + elif method_config['name'] == 'inf': + method_config['params'] = {} + + else: + raise ModelConfigurationException("unknown threshold dynamics method: ", method_config['name']) + + # configure ascurrent dynamics rules + method_config = neuron_config['AScurrent_dynamics_method'] + if method_config.get('params', None) is None: + # TODO: rename 'vector' to something more specific + if method_config['name'] == 'vector': + method_config['params'] = { + 'vector': [1, 2, 3] + } + raise ModelConfigurationException('vector of AScurrent_dynamics_method is not yet implemented') + elif method_config['name'] == 'none': + method_config['params'] = {} + elif method_config['name'] == 'exp': + method_config['params'] = {} + else: + raise ModelConfigurationException("unknown AScurrent dynamics method: ", method_config['name']) + + # configure ascurrent reset rule + # this is down here because it depends on numbers computed for the AScurrent_dynamics_method + method_config = neuron_config['AScurrent_reset_method'] + if method_config.get('params', None) is None: + if method_config['name'] == 'sum': + method_config['params'] = { + 'r': np.ones(len(neuron_config['asc_tau_array'])) + } + elif method_config['name'] == 'none': + method_config['params'] = {} + else: + raise ModelConfigurationException("unknown AScurrent reset method: ", method_config['name']) + + # configure parameters for MLIN optimization + if optimizer_config['error_function']=='MLIN': + optimizer_config['error_function_data'] = { + 'subthreshold_long_square_voltage_variance': var_of_section, + 'sv_for_expsymm': sv_for_expsymm, + 'tau_from_AC': tau_from_AC + } + + # validation + + # make sure that the initial ascurrents have the correct size + if len(neuron_config['init_AScurrents']) != len(neuron_config['asc_tau_array']): + raise ModelConfigurationException("init_AScurrents have incorrect length.") + + spike_cut_length = neuron_config.get('spike_cut_length', None) + + if spike_cut_length is None: + raise ModelConfigurationException("Spike cut length must be set, but it is not.") + + if spike_cut_length < 0: + raise ModelConfigurationException("Spike cut length must be non-negative.") + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('preprocessor_values_path', help='path to preprocessor values json') + parser.add_argument('method_config_path', help='path to method configuration json') + parser.add_argument('output_path', help='path to store final model configuration') + + args = parser.parse_args() + + preprocessor_values = ju.read(args.preprocessor_values_path) + method_config = ju.read(args.method_config_path) + out_config = configure_model(method_config, preprocessor_values) + + ju.write(args.output_path, out_config) + + +if __name__ == "__main__": main() diff --git a/internal/model/glif/error_functions.py b/internal/model/glif/error_functions.py new file mode 100644 index 0000000000..a5f6e8cfcc --- /dev/null +++ b/internal/model/glif/error_functions.py @@ -0,0 +1,241 @@ +import logging +import sys +import os + +from scipy.stats import norm + +import numpy as np + +from allensdk.internal.model.glif.glif_optimizer_neuron import GlifNeuronException +from allensdk.internal.model.glif.glif_optimizer_neuron import GlifBadInitializationException +from allensdk.model.glif.glif_neuron import GlifBadResetException + +# TODO: clean up +# TODO: license + +def MLIN_list_error(param_guess, experiment, input_data): + #TODO: binning is now done in preprocessor so perhaps should take it out of here. + voltage_variance = input_data['subthreshold_long_square_voltage_variance'] +# voltage_distribution=norm(loc=0, scale=np.sqrt(voltage_variance)*10.) + sv=input_data['sv_for_expsymm'] #used in the expsymm function +# tau_4AC=experiment.neuron.R_input*experiment.neuron.C + tau_from_AC=input_data['tau_from_AC'] + spike_length=int(experiment.neuron.spike_cut_length) + noSpike_bin_size_ind=int(tau_from_AC/experiment.neuron.dt) + spike_bin_size_time=.005 #TODO: PLAY WITH THIS VALUE. 1 MS, 2, 4, 8 + spike_bin_size_ind=int(spike_bin_size_time/experiment.neuron.dt) + + logging.info('running parameter guess: %s' % param_guess) + + dataSpikeTimes=experiment.grid_spike_times + + MLIN_list = [] + try: + run_data = experiment.run(param_guess) + + except GlifNeuronException as e: + out=e.data + raise e + modelSpikeISI=[e.data['interpolated_ISI']] + + except GlifBadInitializationException as e: + logging.error('voltage STARTS above threshold: setting error to be large.Difference between thresh and voltage is: %f' % e.dv) + raise Exception() + except GlifBadResetException as e: + logging.error('THIS REALLY SHOULDNT HAPPEN WITH NEW INITIALIZATION EXCEPTION: voltage is above threshold at reset: setting error to be large. Difference between thresh and voltage is: %f' % e.dv) + raise Exception() + + v_model_list=[] + th_model_list=[] + non_spike_bin_ind_edges_list=[] + spike_edges_list_list=[] + spike_bins_list=[] + noSpike_bins_list=[] + spike_prob_list=[] + noSpike_prob_list=[] + + for stim_list_index in range(0,len(experiment.stim_list)): + #TODO: the following line is a hack to take care of the case when there are no spikes in a sweep + if len(experiment.spike_time_steps[stim_list_index])==0: + MLIN=0 + raise Exception('there are no spikes in the sweep') + else: + bio_spike_ind=experiment.spike_time_steps[stim_list_index] + v_model=run_data['voltage'][stim_list_index] + th_model=run_data['threshold'][stim_list_index] + #------------------------------------------------------------------------------------ + #---------------make all the bins---------------------------------------------------- + #------------------------------------------------------------------------------------ + + #--for every spike define a region for making non spiking bins + between_spike_edges_list=[] + between_spike_edges_list.append([0, bio_spike_ind[0]-spike_bin_size_ind]) #edges to first spike + for ii in range(0, len(bio_spike_ind)-1): + between_spike_edges_list.append([bio_spike_ind[ii]+spike_length, bio_spike_ind[ii+1]-spike_bin_size_ind]) + + + #--define no spike bin edges + non_spike_bin_ind_edges_in_ISI=[] + for btw_spike_edges in between_spike_edges_list: + temp=range(btw_spike_edges[0], btw_spike_edges[1], noSpike_bin_size_ind) + temp.append(btw_spike_edges[1]) + non_spike_bin_ind_edges_in_ISI.append(temp) + + #--define spike bin edges + spike_edges_list=[] + for spike in bio_spike_ind: + spike_edges_list.append([spike-spike_bin_size_ind, spike]) + + #--nonspike bin edges need to be arranged correctly because they are just all the edges for a given ISI + non_spike_bin_ind_edges=[] + for edges_in_1_spike in non_spike_bin_ind_edges_in_ISI: + for ii in range(0,len(edges_in_1_spike)-1): + non_spike_bin_ind_edges.append([edges_in_1_spike[ii], edges_in_1_spike[ii+1]]) + + #----------------------------------------------------------------------------- + #-------------finding values in bins------------------------------------------ + #----------------------------------------------------------------------------- + + spike_bins={} +# spike_bins['vmax']=[] + spike_bins['th']=[] + spike_bins['v']=[] + spike_bins['v_th_diff']=[] +# spike_bins['ind_of_max_v']=[] + spike_bins['ind_of_max_diff_btw_v_th']=[] + + for bin_edges in spike_edges_list: + bin_ind=range(bin_edges[0], bin_edges[1]) + #vmax_in_bin=max(v_model[bin_ind]) + diff_vector=th_model[bin_ind]-v_model[bin_ind] + #the_ind=bin_ind[np.where(v_model[bin_ind]==vmax_in_bin)[0]] this is used to use in where v is at a max (as opposed to the difference between v and th) +# print("***********************************************************") +# print('th_model[bin_ind]', th_model[bin_ind]) +# print('v_model[bin_ind]',v_model[bin_ind]) +# print('diff_vector', diff_vector) +# print('np.where(diff_vector==min(diff_vector))[0]', np.where(diff_vector==min(diff_vector))[0]) + the_ind=bin_ind[np.where(diff_vector==min(diff_vector[~np.isnan(diff_vector)]))[0][0]] + th_in_bin=th_model[the_ind] + v_in_bin=v_model[the_ind] +# diffV=th_in_bin-vmax_in_bin + diffV=th_model[the_ind]-v_model[the_ind] + spike_bins['v'].append(v_in_bin) + spike_bins['th'].append(th_in_bin) + spike_bins['v_th_diff'].append(diffV) + spike_bins['ind_of_max_diff_btw_v_th'].append(the_ind) + + + noSpike_bins={} +# noSpike_bins['vmax']=[] + noSpike_bins['th']=[] + noSpike_bins['v']=[] + noSpike_bins['v_th_diff']=[] + noSpike_bins['ind_of_max_diff_btw_v_th']=[] + for bin_edges in non_spike_bin_ind_edges: + bin_ind=range(bin_edges[0], bin_edges[1]) +# vmax_in_bin=max(v_model[bin_ind]) + diff_vector=th_model[bin_ind]-v_model[bin_ind] +# max_indicies=np.where(v_model[bin_ind]==vmax_in_bin)[0] + min_indicies=np.where(diff_vector==min(diff_vector))[0] +# if len(max_indicies)>1: +# print('there is more than one maximum indicie in a bin at', max_indicies, 'choosing last value for computation') +# print('all voltages in the bin are', v_model[bin_ind]) + the_ind=bin_ind[min_indicies[-1]] #this is here just incase there is more than one value at max voltage in a bin + th_in_bin=th_model[the_ind] + v_in_bin=v_model[the_ind] + diffV=th_model[the_ind]-v_model[the_ind] + noSpike_bins['v'].append(v_in_bin) + noSpike_bins['th'].append(th_in_bin) + noSpike_bins['v_th_diff'].append(diffV) + noSpike_bins['ind_of_max_diff_btw_v_th'].append(the_ind) + + #----------------------------------------------------------------------------- + #-------------calculate MLIN-------------------------------------------------- + #----------------------------------------------------------------------------- + +# this was the version with the normal distribution +# noSpike_prob=np.log(np.spacing(1)+voltage_distribution.cdf(noSpike_bins['v_th_diff'])) +# spike_prob=np.log(1+np.spacing(1)-voltage_distribution.cdf(spike_bins['v_th_diff'])) + #version with the expsymm function + + #---OPTION ONE-------- +# noSpike_prob=np.log(np.spacing(1)+expsymm_cdf(noSpike_bins['v_th_diff'], sv)) +# spike_prob=np.log(1+np.spacing(1)-expsymm_cdf(spike_bins['v_th_diff'], sv)) +# #---OPTION TWO-------- +# N_spike=np.float(len(spike_bins['v_th_diff'])) +# N_noSpike=np.float(len(noSpike_bins['v_th_diff'])) +# noSpike_prob=(N_spike/(N_noSpike+N_spike))*np.log(np.spacing(1)+expsymm_cdf(noSpike_bins['v_th_diff'], sv)) +# spike_prob=(N_noSpike/(N_noSpike+N_spike))*np.log(1+np.spacing(1)-expsymm_cdf(spike_bins['v_th_diff'], sv)) + #---OPTION THREE + noSpike_negDiff=(-np.log(2.)+np.array(noSpike_bins['v_th_diff'])/sv)[np.array(noSpike_bins['v_th_diff'])<=0.0] + noSpike_posDiff=(np.log(1.-0.5*np.exp(-np.array(noSpike_bins['v_th_diff'])/sv)))[np.array(noSpike_bins['v_th_diff'])>0.0] + noSpike_prob=np.append(noSpike_negDiff, noSpike_posDiff) #!!NOTE: this may not line up correctly in outputs of MLIN HACK + + spike_negDiff=(np.log(1.-0.5*np.exp(np.array(spike_bins['v_th_diff'])/sv)))[np.array(spike_bins['v_th_diff'])<=0.0] + spike_posDiff=(-np.log(2.)-np.array(spike_bins['v_th_diff'])/sv)[np.array(spike_bins['v_th_diff'])>0.0] + spike_prob=np.append(spike_negDiff, spike_posDiff) + + MLIN=-(sum(noSpike_prob)+sum(spike_prob)) + logging.info('MLIN: %f', MLIN) + + MLIN_list.append([MLIN]) + v_model_list.append(v_model) + th_model_list.append(th_model) + non_spike_bin_ind_edges_list.append(non_spike_bin_ind_edges) + spike_edges_list_list.append(spike_edges_list) + spike_bins_list.append(spike_bins) + noSpike_bins_list.append(noSpike_bins) + spike_prob_list.append(spike_prob) + noSpike_prob_list.append(noSpike_prob) + + concatenateMLINList=np.concatenate(MLIN_list) + experiment.spike_errors.append(concatenateMLINList) + +# print('param Guess', param_guess, 'TRD', np.mean(concatenateTRDList)) + out =np.mean(concatenateMLINList) + logging.info('MLIN: %f', np.mean(concatenateMLINList)) + +#------------------------------------------------------------------- +#--------------------------plotting------------------------------------ +#--------------------------------------------------------------------- + time=np.arange(0, len(v_model))*experiment.neuron.dt +# plt.subplot(2,1,1) +# plt.title('Model', fontsize=16) +# plt.plot(time, v_model, 'b-', label='voltage') +# plt.plot(time, th_model, 'b--', label='threshold') +# plt.plot(np.concatenate(non_spike_bin_ind_edges)*experiment.neuron.dt, v_model[np.concatenate(non_spike_bin_ind_edges)], 'k|', ms=16) +# plt.plot(np.concatenate(spike_edges_list)*experiment.neuron.dt, v_model[np.concatenate(spike_edges_list)], 'r|', ms=16) +# plt.plot(np.array(spike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, v_model[spike_bins['ind_of_max_diff_btw_v_th']], 'r.', ms=6) +# plt.plot(np.array(spike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, th_model[spike_bins['ind_of_max_diff_btw_v_th']], 'r.', ms=6) +# plt.plot(np.array(noSpike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, v_model[noSpike_bins['ind_of_max_diff_btw_v_th']], 'k.', ms=6) +# plt.plot(np.array(noSpike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, th_model[noSpike_bins['ind_of_max_diff_btw_v_th']], '.', ms=6) +# plt.title(' MLIN='+ str(MLIN)+' : sv='+str(sv)+' : ac_tau='+str(tau_from_AC)+' : spike bin size='+str(spike_bin_size_time)+'!!!!!! !!!!!', fontsize=20) +# plt.xlim([0, time[-1]]) +# +# plt.subplot(2,1,2) +# plt.plot(np.array(spike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, spike_prob, 'r.', ms=16, label='spike probablility') +# plt.plot(np.array(noSpike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, noSpike_prob, 'b.', ms=16, label='no spike probablility') +# plt.legend() +# +# print("coming out of function", out) +# +# plt.show() + + + #converted to list 4_11_15 + experiment.MLIN_HACK={ + 'v_model': v_model_list, + 'th_model': th_model_list, + 'non_spike_bin_ind_edges': non_spike_bin_ind_edges_list, + 'spike_edges_list': spike_edges_list_list, #TODO Corinne: why was this originally a list but nothing else a list + 'spike_bins': spike_bins_list, + 'noSpike_bins': noSpike_bins_list, + 'tau_from_AC': tau_from_AC, + 'spike_prob': spike_prob_list, + 'noSpike_prob': noSpike_prob_list, + 'spike_bin_size_time' : spike_bin_size_time, + 'sv': sv + + } +# + return out diff --git a/internal/model/glif/find_spikes.py b/internal/model/glif/find_spikes.py new file mode 100644 index 0000000000..9c5a3b5471 --- /dev/null +++ b/internal/model/glif/find_spikes.py @@ -0,0 +1,122 @@ +import numpy as np +from allensdk.ephys.feature_extractor import EphysFeatureExtractor +import allensdk.ephys.ephys_extractor as efex +import allensdk.ephys.ephys_features as ft + +ALIGN_CUT_WINDOW = np.array([ 0.002, 0.015 ]) + +def find_spikes_list_old(voltage_list, dt): + out_idx = [] + out_v = [] + + for v in voltage_list: + idx, v = find_spikes_old(v, dt) + out_idx.append(idx) + out_v.append(v) + + return out_idx, out_v + +def find_spikes_list(voltage_list, dt): + v_set = [ v * 1e3 for v in voltage_list ] + t_set = [ np.arange(0, len(v)) * dt for v in voltage_list ] + i_set = [ np.zeros(len(v)) for v in voltage_list ] + + ext = efex.EphysSweepSetFeatureExtractor(t_set, v_set, i_set, filter=None) + ext.process_spikes() + sweep_spikes = [ s.spikes() for s in ext.sweeps() ] + + out_idx = [ np.array([ int(s['threshold_index']) for s in spikes ]) for spikes in sweep_spikes ] + out_v = [ np.array([ s['threshold_v'] for s in spikes ]) for spikes in sweep_spikes ] + + return out_idx, out_v + +SHORT_SQUARE_MAX_THRESH_FRAC = 0.1 + +def find_spikes_ssq_list(voltage_list, dt, dv_cutoff, thresh_frac): + v_set = [ v * 1e3 for v in voltage_list ] + t_set = [ np.arange(0, len(v)) * dt for v in voltage_list ] + i_set = [ np.zeros(len(v)) for v in voltage_list ] + + thresh_frac = max(SHORT_SQUARE_MAX_THRESH_FRAC, thresh_frac) + + ext = efex.EphysSweepSetFeatureExtractor(t_set, v_set, i_set, + dv_cutoff=dv_cutoff, + thresh_frac=thresh_frac, + filter=None) + ext.process_spikes() + sweep_spikes = [ e.spikes() for e in ext.sweeps() ] + + out_idx = [ np.array([ int(s['threshold_index']) for s in spikes ]) for spikes in sweep_spikes ] + out_v = [ np.array([ s['threshold_v'] for s in spikes ]) for spikes in sweep_spikes ] + + return out_idx, out_v + +def find_spikes_old(v, dt): + v = v * 1e3 # convert V => mV + t = np.arange(0, len(v)) * dt + i = np.zeros(t.shape) + + + + fx = efex.EphysSweepFeatureExtractor(t=t, v=v, i=i) + fx.process_spikes() + feature_data = fx.spikes() + + #fx = EphysFeatureExtractor() + #fx.process_instance("", v, i ,t, 0, t[-1], "") + #feature_data = fx.feature_list[0].mean + + ids = np.array([ s["threshold_idx"] for s in feature_data ]) + vs = np.array([ s["threshold_v"] for s in feature_data ]) + + vs /= 1e3 # mV => V + + return ids, vs + + +def align_and_cut_spikes(voltage_list, current_list, dt, spike_window = None): + ''' This function aligns the spikes to some criteria and returns a current and voltage trace of + of the spike over a time window. Also returns zero crossing,and threshold + in reference to the aligned spikes. + ''' + if spike_window is None: + spike_window = ALIGN_CUT_WINDOW + + spike_shapes = [] + current_shapes = [] + index_before_spike = int(spike_window[0] / dt) + index_after_spike = int(spike_window[1] / dt) + aligned_spike_ind = np.array([]) + spike_sweeps = [] + spikes_per_trace = np.array([]) + + spike_ind_list, _ = find_spikes_list(voltage_list, dt) + + for jj, voltage_and_current_and_spike in enumerate(zip(voltage_list, current_list, spike_ind_list)): + voltage, current, whole_trace_spike_ind = voltage_and_current_and_spike + + spikes_per_trace = np.append(spikes_per_trace, len(whole_trace_spike_ind)) + + alignment_ind = whole_trace_spike_ind + aligned_spike_ind = np.append(aligned_spike_ind, np.ones(len(whole_trace_spike_ind)) * index_before_spike) + + # print('alignment_ind', alignment_ind) + spike_delimiters = [(ind - index_before_spike, ind + index_after_spike) for ind in alignment_ind] + for d in spike_delimiters: + # this 'if' statement makes sure we don't cause a ValueError + if min(d) > 0 and max(d) < len(voltage) - 1: + spike_trace = voltage[d[0]:d[1]] + current_trace = current[d[0]:d[1]] + spike_shapes.append(spike_trace) + current_shapes.append(current_trace) + spike_sweeps.append(jj) + + + # note: that depending on how things were aligned, all of one of the values will be the same. + print("spikes_per_trace", spikes_per_trace) + temp = np.append(0, np.cumsum(spikes_per_trace)) + print('temp', temp) + wave_index_of_first_spikes = [int(ii) for ii in list(temp[range(0, len(temp) - 1)])] + print("in cut spikes: wave_index_of_first_spikes ", wave_index_of_first_spikes) + + return spike_shapes, current_shapes, aligned_spike_ind, wave_index_of_first_spikes, spike_sweeps diff --git a/internal/model/glif/find_sweeps.py b/internal/model/glif/find_sweeps.py new file mode 100644 index 0000000000..88d294fb98 --- /dev/null +++ b/internal/model/glif/find_sweeps.py @@ -0,0 +1,201 @@ +import json, sys, os +import logging +import argparse +from six import iteritems +from six.moves import xrange +import allensdk.core.json_utilities as ju + + +SHORT_SQUARE = 'Short Square' +SHORT_SQUARE_60 = 'Short Square - Hold -60mv' +SHORT_SQUARE_80 = 'Short Square - Hold -80mv' +LONG_SQUARE = 'Long Square' +RAMP = 'Ramp' +NOISE1 = 'Noise 1' +NOISE2 = 'Noise 2' +SHORT_SQUARE_TRIPLE = 'Short Square - Triple' +RAMP_TO_RHEO = 'Ramp to Rheobase' + + +class MissingSweepException( Exception ): pass + +def get_sweep_numbers(sweep_list): + return [ s['sweep_number'] for s in sweep_list] + + +def get_sweeps_by_name(sweeps, sweep_type): + if isinstance(sweeps, dict): + return [ s for sn,s in iteritems(sweeps) if s[u'ephys_stimulus'][u'ephys_stimulus_type'][u'name'] == sweep_type ] + else: + return [ s for s in sweeps if s[u'ephys_stimulus'][u'ephys_stimulus_type'][u'name'] == sweep_type ] + + +def find_ranked_sweep(sweep_list, key, reverse=False): + if sweep_list: + sorted_sweep_list = sorted(sweep_list, key=lambda x: x[key], reverse=reverse) + + out_sweeps = [ sorted_sweep_list[0] ] + + for i in xrange(1,len(sweep_list)): + if sorted_sweep_list[i][key] == out_sweeps[0][key]: + out_sweeps.append(sorted_sweep_list[i]) + else: + break + + return get_sweep_numbers(out_sweeps) + else: + return [] + + +def organize_sweeps_by_name(sweeps, name): + sweep_list = sorted(get_sweeps_by_name(sweeps, name), key=lambda x: x['sweep_number']) + + subthreshold_list = [ s for s in sweep_list if s.get('num_spikes',None) in [0, None] ] + suprathreshold_list = [ s for s in sweep_list if s.get('num_spikes',None) > 0 ] + + return { + 'all': get_sweep_numbers(sweep_list), + 'subthreshold': get_sweep_numbers(subthreshold_list), + 'suprathreshold': get_sweep_numbers(suprathreshold_list), + 'maximum_subthreshold': find_ranked_sweep(subthreshold_list, 'stimulus_amplitude', reverse=True), + 'minimum_suprathreshold': find_ranked_sweep(suprathreshold_list, 'stimulus_amplitude') + #'maximum_subthreshold': find_ranked_sweep(subthreshold_list, 'stimulus_absolute_amplitude', reverse=True), + #'minimum_suprathreshold': find_ranked_sweep(suprathreshold_list, 'stimulus_absolute_amplitude') + } + +def find_long_square_sweeps(sweeps): + out = organize_sweeps_by_name(sweeps, LONG_SQUARE) + return out + + +def find_ramp_to_rheo_sweeps(sweeps): + out = organize_sweeps_by_name(sweeps, RAMP_TO_RHEO) + return out + + +def find_short_square_sweeps(sweeps): + ''' + Find 1) all of the subthreshold short square sweeps + 2) all of the superthreshold short square sweeps + 3) the subthresholds short square sweep with maximum stimulus amplitude + ''' + + out = organize_sweeps_by_name(sweeps, SHORT_SQUARE) + out60 = organize_sweeps_by_name(sweeps, SHORT_SQUARE_60) + out80 = organize_sweeps_by_name(sweeps, SHORT_SQUARE_80) + out_triple = organize_sweeps_by_name(sweeps, SHORT_SQUARE_TRIPLE) + + out['all_60'] = out60['all'] + out['all_80'] = out80['all'] + out['triple'] = out_triple['all'] + + if len(out['maximum_subthreshold']) == 0: + raise MissingSweepException("No maximum subthreshold short square") + + if len(out['minimum_suprathreshold']) == 0: + raise MissingSweepException("No minimum suprathreshold short square") + + return out + + +def find_ramp_sweeps(sweeps): + ''' + Find 1) all ramp sweeps + 2) all subthreshold ramps + 3) all superthreshold ramps + ''' + out = organize_sweeps_by_name(sweeps, RAMP) + + return out + + +def find_noise_sweeps(sweeps): + ''' + Find 1) the noise1 sweeps + 2) the noise2 sweeps + 4) all noise sweeps + ''' + + noise1 = organize_sweeps_by_name(sweeps, NOISE1) + noise2 = organize_sweeps_by_name(sweeps, NOISE2) + + all_noise_sweeps = sorted(noise1['all'] + noise2['all']) + + out = { + 'all': all_noise_sweeps, + 'noise1': noise1['all'], + 'noise2': noise2['all'] + } + + num_noise1_sweeps = len(out['noise1']) + num_noise2_sweeps = len(out['noise2']) + + required_noise1_sweeps = 2 + required_noise2_sweeps = 2 + + if num_noise1_sweeps < required_noise1_sweeps: + raise MissingSweepException("not enough noise1 sweeps (%d/%d)" % (num_noise1_sweeps, required_noise1_sweeps)) + + if num_noise2_sweeps < required_noise2_sweeps: + raise MissingSweepException("not enough noise2 sweeps (%d/%d)" % (num_noise2_sweeps, required_noise2_sweeps)) + + return out + + +def find_sweeps(sweep_list): + + sweep_index = { s['sweep_number']: s for s in sweep_list } + + data = {} + ssq_data = find_short_square_sweeps(sweep_index) + data.update(ssq_data) + + lsq_data = find_long_square_sweeps(sweep_index) + data.update(lsq_data) + + ramp_data = find_ramp_sweeps(sweep_index) + data.update(ramp_data) + + r2r_data = find_ramp_to_rheo_sweeps(sweep_index) + data.update(r2r_data) + + noise_data = find_noise_sweeps(sweep_index) + data.update(noise_data) + + return data, sweep_index + + +def parse_arguments(): + parser = argparse.ArgumentParser(description='find relevant sweeps from a sweep catalog') + + parser.add_argument('sweep_list_file', help='json file containing a list of sweeps for a cell') + parser.add_argument('output_file', help='output json data config file') + + args = parser.parse_args() + + try: + if not os.path.exists(args.sweep_list_file): + raise Exception("sweep list file (%s) does not exist" % args.sweep_file) + + except Exception as e: + parser.print_help() + sys.exit(1) + + return args + + +def main(): + args = parse_arguments() + + sweep_list = ju.read(args.sweep_list_file) + + data = find_sweeps(sweep_list) + + ju.write(args.output_file, data) + + if len(errs > 0): + for err in errs: + logging.error(err) + sys.exit(1) + +if __name__ == "__main__": main() diff --git a/internal/model/glif/glif_experiment.py b/internal/model/glif/glif_experiment.py new file mode 100644 index 0000000000..fec4e15440 --- /dev/null +++ b/internal/model/glif/glif_experiment.py @@ -0,0 +1,162 @@ +import logging +from six.moves import xrange +import numpy as np + +# TODO: license +# TODO: document + +class GlifExperiment( object ): + def __init__(self, neuron, dt, stim_list, resp_list, + spike_time_steps, grid_spike_times, grid_spike_voltages, + param_fit_names, + **kwargs): + + self.neuron = neuron + self.dt = dt + self.stim_list = stim_list + self.resp_list = resp_list + self.spike_time_steps = spike_time_steps + self.grid_spike_times = grid_spike_times + self.grid_spike_voltages = grid_spike_voltages + self.param_fit_names = param_fit_names + + self.spike_errors = [] + + + def run(self, param_guess): + '''This code will run the loaded neuron model in reference to the target neuron spikes. + inputs: + self: is the instance of the neuron model and parameters alone with the values of the target spikes. + NOTE the values in each array of the self.gridSpikeIndexTarge_list and the self.interpolated_spike_times + are in reference to the time start of of the stim in each induvidual array (not the universal time) + param_guess: array of scalars of the values that will be inserted into the mapping function below. + returns: + voltage_list: list of array of voltage values. NOTE: IF THE MODEL NEURON SPIKES BEFORE THE TARGET THE VOLTAGE WILL + NOT BE CALCULATED THEREFORE THE RESULTING VECTOR WILL NOT BE AS LONG AS THE TARGET AND ALSO WILL NOT + MAKE SENSE WITH THE STIMULUS UNLESS YOU CUT IT AND OUTPUT IT TOO. + grid_spike_times_list: + interpolated_spike_time_list: an array of the actual times of the spikes. NOTE: THESE TIMES ARE CALCULATED BY ADDING THE + TIME OF THE INDIVIDUAL SPIKE TO THE TIME OF THE LAST SPIKE. + gridISIFromLastTargSpike_list: list of arrays of spike times of the model in reference to the last target (biological) + spike (not in reference to sweep start) + interpolatedISIFromLastTargSpike_list: list of arrays of spike times of the model in reference to the last target (biological) + spike (not in reference to sweep start) + voltageOfModelAtGridBioSpike_list: list of arrays of scalars that contain the voltage of the model neuron when the target or bio neuron spikes. + theshOfModelAtGridBioSpike_list: list of arrays of scalars that contain the threshold of the model neuron when the target or bio neuron spikes.''' + + self.set_neuron_parameters(param_guess) + self.spike_errors = [] + + run_data = [] + + for stim_list_index in xrange(len(self.stim_list)): + run_data.append(self.neuron.run_with_biological_spikes(self.stim_list[stim_list_index], + self.resp_list[stim_list_index], + self.spike_time_steps[stim_list_index])) + + return { + 'voltage': [ rd['voltage'] for rd in run_data ], + 'threshold': [ rd['threshold'] for rd in run_data ], + 'AScurrent_matrix': [ rd['AScurrent_matrix'] for rd in run_data ], + + 'grid_ISI': [ rd['grid_ISI'] for rd in run_data ], + 'interpolated_ISI': [ rd['interpolated_ISI'] for rd in run_data ], + + 'grid_model_spike_times': [ rd['grid_model_spike_times'] for rd in run_data ], + 'interpolated_model_spike_times': [ rd['interpolated_model_spike_times'] for rd in run_data ], + + 'grid_model_spike_voltages': [ rd['grid_model_spike_voltages'] for rd in run_data ], + 'interpolated_model_spike_voltages': [ rd['interpolated_model_spike_voltages'] for rd in run_data ], + + 'grid_bio_spike_model_voltage': [ rd['grid_bio_spike_model_voltage'] for rd in run_data ], + 'grid_bio_spike_model_threshold': [ rd['grid_bio_spike_model_threshold'] for rd in run_data ] + } + + + def run_base_model(self, param_guess): + '''This code will run the loaded neuron model. + inputs: + self: is the instance of the neuron model and parameters alone with the values of the target spikes. + NOTE the values in each array of the self.gridSpikeIndexTarge_list and the self.interpolated_spike_times + are in reference to the time start of of the stim in each induvidual array (not the universal time) + param_guess: array of scalars of the values that will be inserted into the mapping function below. + returns: + voltage_list: list of array of voltage values. NOTE: IF THE MODEL NEURON SPIKES BEFORE THE TARGET THE VOLTAGE WILL + NOT BE CALCULATED THEREFORE THE RESULTING VECTOR WILL NOT BE AS LONG AS THE TARGET AND ALSO WILL NOT + MAKE SENSE WITH THE STIMULUS UNLESS YOU CUT IT AND OUTPUT IT TOO. + gridTime_list: + interpolatedTime_list: an array of the actual times of the spikes. NOTE: THESE TIMES ARE CALCULATED BY ADDING THE + TIME OF THE INDIVIDUAL SPIKE TO THE TIME OF THE LAST SPIKE. + grid_ISI_list: list of arrays of spike times of the model in reference to the last target (biological) + spike (not in reference to sweep start) + interpolated_ISI_list: list of arrays of spike times of the model in reference to the last target (biological) + spike (not in reference to sweep start) + grid_spike_voltage_list: list of arrays of scalars that contain the voltage of the model neuron when the target or bio neuron spikes. + grid_spike_threshold_list: list of arrays of scalars that contain the threshold of the model neuron when the target or bio neuron spikes.''' + + + stim_list = self.stim_list + + self.set_neuron_parameters(param_guess) + self.spike_errors = [] + + run_data = [] + + for stim_list_index in xrange(len(stim_list)): + run_data.append(self.neuron.run(stim_list[stim_list_index])) + + + return { + 'voltage': [ rd['voltage'] for rd in run_data ], + 'threshold': [ rd['threshold'] for rd in run_data ], + 'AScurrents': [ rd['AScurrents'] for rd in run_data ], + + 'spike_time_steps': [ rd['spike_time_steps'] for rd in run_data ], + 'grid_spike_times': [ rd['grid_spike_times'] for rd in run_data ], + 'interpolated_spike_times': [ rd['interpolated_spike_times'] for rd in run_data ], + + 'interpolated_spike_voltage': [ rd['interpolated_spike_voltage'] for rd in run_data ], + 'interpolated_spike_threshold': [ rd['interpolated_spike_threshold'] for rd in run_data ] + } + + def neuron_parameter_count(self): + count = 0 + for fit_name in self.param_fit_names: + try: + coeff = self.neuron.coeffs[fit_name] + except KeyError: + logging.error("Neuron coefficient %s does not exist" % fit_name) + raise + + # is it a list? + try: + # this will throw a type error if 'coeff' is a scalar + coeff_size = len(coeff) + count += coeff_size + except TypeError: + count += 1 + return count + + def set_neuron_parameters(self, param_guess): + '''Maps the parameter guesses to the coefficients of the model. + input: + param_guess is vector of values. It is assumed that the length will be ''' + + index = 0 + for fit_name in self.param_fit_names: + try: + coeff = self.neuron.coeffs[fit_name] + except KeyError: + logging.error("Neuron coefficient %s does not exist" % fit_name) + raise + + # is it a list? + try: + # this will throw a type error if 'coeff' is a scalar + coeff_size = len(coeff) + self.neuron.coeffs[fit_name] = param_guess[index:index+coeff_size] + index += coeff_size + except TypeError: + self.neuron.coeffs[fit_name] = param_guess[index] + index += 1 + diff --git a/internal/model/glif/glif_optimizer.py b/internal/model/glif/glif_optimizer.py new file mode 100644 index 0000000000..bd019f17b9 --- /dev/null +++ b/internal/model/glif/glif_optimizer.py @@ -0,0 +1,296 @@ +import logging + +import numpy as np + +import time + +from scipy.optimize import fminbound, fmin +from scipy.optimize import minimize + +import json + +from uuid import uuid4 + +import allensdk.internal.model.glif.error_functions as error_functions + +# TODO: clean up +# TODO: license +# TODO: document + +class GlifOptimizer(object): + def __init__(self, experiment, dt, + outer_iterations, inner_iterations, + sigma_outer, sigma_inner, + param_fit_names, stim, + xtol, ftol, + internal_iterations, + bessel, + error_function = None, + error_function_data = None, + init_params = None): + + self.start_time = None + self.rng = np.random.RandomState() + + self.experiment = experiment + self.dt = dt + self.outer_iterations = outer_iterations + self.inner_iterations = inner_iterations + self.init_params = init_params + self.sigma_outer = sigma_outer + self.sigma_inner = sigma_inner + self.param_fit_names = param_fit_names + self.stim = stim + + # use MLIN by default + if error_function is None: + error_function = error_functions.MLIN_list_error + + self.error_function = error_function + self.error_function_data = error_function_data + + self.xtol = xtol + self.ftol = ftol + + self.internal_iterations = internal_iterations + + self.bessel = bessel + + logging.info('internal_iterations: %s' % internal_iterations) + logging.info('outer_iterations: %s' % outer_iterations) + logging.info('inner_iterations: %s' % inner_iterations) + + self.iteration_info = []; + + expected_param_count = experiment.neuron_parameter_count() + + if self.init_params is None: + self.init_params = np.ones(expected_param_count) + elif len(self.init_params) != expected_param_count: + self.init_params = np.ones(expected_param_count) + logging.warning('optimizer init_params has wrong length (given %d, expected %d). settings to all ones' % (len(self.init_params), expected_param_count)) + + def to_dict(self): + return { + 'outer_iterations': self.outer_iterations, + 'inner_iterations': self.inner_iterations, + 'init_params': self.init_params, + 'sigma_outer': self.sigma_outer, + 'sigma_inner': self.sigma_inner, + 'param_fit_names': self.param_fit_names, + 'xtol': self.xtol, + 'ftol': self.ftol, + 'internal_iterations': self.internal_iterations, + 'iteration_info': self.iteration_info, + 'bessel': self.bessel + } + + def randomize_parameter_values(self, values, sigma): + values = np.array(self.rng.normal(values, sigma)) + + # values might not have a shape if it's a single element long, depending on your numpy version + if not values.shape: + values = np.array([values]) + return values + + def initiate_unique_seed(self, seed=None): + + if seed == None: + x1=str(int(uuid4())) #get a uuid, turn it into int then turn it into string + x2=[x1[ii:ii+8]for ii in range(0,40,8)] #break it up into chunks + x3=[int(ii) for ii in x2]#turn string chunks back into integers + print('seed', x3) + self.rng.seed(x3) + else: + self.rng.seed(seed) + + def evaluate(self, x, dt_multiplier=100): + + self.experiment.neuron.dt_multiplier = dt_multiplier + return self.error_function([x], self.experiment, self.error_function_data) + + def run_many(self, iteration_finished_callback=None, seed=None): + self.initiate_unique_seed(seed=seed) + params_start = self.init_params + self.start_time = time.time() + params=params_start +# params=self.randomize_parameter_values(params_start, self.sigma_outer) + print('actual starting parameters', params) + + stop_flag=False + + # TODO: unhardcode this + dt_multiplier_list = [100, 32, 10] + #Note the following line may be useful when there are more iteration but is hasnt been tested +# dt_multiplier_list = np.ceil(np.logspace(1,2,self.inner_iterations))[::-1].astype(int) + print(dt_multiplier_list) +# dt_multiplier_list = [10,10,10] + #TODO: figure out the implications of this being an int versus float + #TODO: make this so that dt multiplier actually gets set + for outer in range(0, self.outer_iterations): #outerloop + for inner in range(0, self.inner_iterations): #innerloop + iteration_start_time = time.time() + + # run the optimizer once. first time is always the passed initial conditions. +# print('dt_multiplier_list[inner]', dt_multiplier_list[inner]) + #--set this equal to 1 if want to do it slow + self.experiment.neuron.dt_multiplier = dt_multiplier_list[inner] + #self.experiment.neuron.dt_multiplier = 10 + + + opt = self.run_once(params) + xopt, fopt = opt[0], opt[1] + + logging.info('fmin took %f secs, %f mins, %f hours' % (time.time() - iteration_start_time, (time.time() - iteration_start_time)/60, (time.time() - iteration_start_time)/60/60)) + + self.iteration_info.append({ + 'in_params': np.array(params).tolist(), + 'out_params': xopt.tolist(), + 'error': float(fopt), + 'dt_multiplier': self.experiment.neuron.dt_multiplier + }) + +# ER=self.iteration_info['error'] +# ETOL=1.e-4 +# if len(ER) >=3: +# #!!!!!!!!!!!!!!!fix this to use that actual parameters!!!!!!!!!!!!!!!!!!!!!! +# if np.abs(ER[-1]-ER[-2])<ETOL and np.abs(ER[-1]-ER[-3])<ETOL and np.abs(ER[-2]-ER[-3])<ETOL: +# stop_flag=True + + + + if iteration_finished_callback is not None: + iteration_finished_callback(self, outer, inner) + + if stop_flag is True: + break + + # randomize the best fit parameters + params = self.randomize_parameter_values(xopt, self.sigma_inner) + #params = xtol*(1-self.eps/2+self.eps*np.random.random(len(params),)) + + #---Calculate the other fitness functions + + '''Add other fitness functions here + first gotta calculate the spike trains again + also look and see what the difference between + the size of a pickle file and a text file is to + decide how to save stimulus and traces''' + + #Take the current best values and run the program again. + #tempTimeIterStart=time.time() + #(voltage_list, threshold_list, AScurrentMatrix_list, gridSpikeTime_list, interpolatedSpikeTime_list, \ + # gridSpikeIndex_list, interpolatedSpikeVoltage_list, interpolatedSpikeThreshold_list) = \ + # self.experiment.run_base_model(xtol) + + #timeFor1Iter=time.time()-tempTimeIterStart + + # outer loop uses the outer standard deviation to randomize the initial values + + if stop_flag is True: + break + + params = self.randomize_parameter_values(self.init_params, self.sigma_outer) + + + # get the best one! + min_error = float("inf") + min_i = -1 + min_dt_multiplier = float("inf") + + for i, info in enumerate(self.iteration_info): + if info['dt_multiplier'] < min_dt_multiplier: + min_dt_multiplier = info['dt_multiplier'] + + for i, info in enumerate(self.iteration_info): + if info['error'] < min_error and info['dt_multiplier'] == min_dt_multiplier: + min_error = info['error'] + min_i = i + + best_params = self.iteration_info[min_i]['out_params'] + + self.experiment.set_neuron_parameters(best_params) + + logging.info('done optimizing') + return best_params, self.init_params + + def run_once_bound(self, low_bound, high_bound): + ''' + @param low_bound: a scalar initial guess for the optimizer + @param high_bound: a scalar high bound for the optimizer + @return: tuple including parameters that optimize function and value - see fmin docs + ''' + return fminbound(self.error_function, low_bound, high_bound, args=(self.experiment,self.error_function_data), maxfun=200, full_output=True ) + #Note is defined in the top level script + + + def run_once(self, param0): + ''' + @param param0: a list of the initial guesses for the optimizer + @return: tuple including parameters that optimize function and value - see fmin docs + ''' +# fmin(func, x0, args=(), xtol=1e-4, ftol=1e-4, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None): + + print('self.error_function_data', self.error_function_data) + xopt, fopt, _, _, _, _ = fmin(self.error_function, param0, args=(self.experiment,self.error_function_data),xtol=self.xtol, ftol=self.ftol, maxiter=self.internal_iterations, maxfun=self.internal_iterations, retall=1,full_output=1, disp=1) + + return xopt, fopt +# res = minimize(self.error_function, param0, +# method='Nelder-Mead', +# args=(self.experiment,self.error_function_data), +# options={ +# 'maxiter':self.internal_iterations, +# 'xtol':self.xtol, +# 'ftol':self.ftol, +# 'maxfun':self.internal_iterations, +# 'retall':1, +# 'full_output':1, +# 'disp':1} +# ) + +# res = minimize(self.error_function, param0, +# jac=False, +# method='BFGS', +# args=(self.experiment,self.error_function_data), +# options={ +# 'maxiter':self.internal_iterations, +# 'epsilon':1e-8, +# 'gtol':1e-5, +# 'full_output':1, +# 'disp':1} +# ) +# +# +# print(res) +# return res.x, res.fun + + +# #Note is defined in the top level script +# def mycallback_ncg(xk): +# print('Using Newton-CG method, xk: ', xk) +# def mycallback_nm(xk): +# print('Using Nelder-Mead method, xk: ', xk) +# eps=1e-15 +# options={} +# # options['avextox']=eps +# options['maxiter']=500 +## options['full_output']=True +## options['disp']=True +## options['retall']=True +# +# print('Using Newton-CG method') +# iteration_start_time = time.time() +# xopt = minimize(self.error_function, param0, args=(self.experiment,), method='Newton-CG', jac=f_prime_constructor(self.error_function), callback=mycallback_ncg, options=options, tol=eps) +# print('Newton-CG method took', (time.time()-iteration_start_time)/60., 'seconds') +# +## print('Using Nelder-Mead method') +## iteration_start_time = time.time() +## xopt = minimize(self.error_function, param0, args=(self.experiment,), method='Nelder-Mead', callback=mycallback_nm, options=options, tol=eps) +## print('Nelder-Mead method took', (time.time()-iteration_start_time)/60., 'seconds') +# +# print(xopt) +# return xopt, fopt + + + + diff --git a/internal/model/glif/glif_optimizer_neuron.py b/internal/model/glif/glif_optimizer_neuron.py new file mode 100644 index 0000000000..eccfeb4f5b --- /dev/null +++ b/internal/model/glif/glif_optimizer_neuron.py @@ -0,0 +1,632 @@ +import logging +import numpy as np +from six.moves import xrange +import scipy.interpolate as spi + +import allensdk.model.glif.glif_neuron as glif_neuron + +# TODO: license +# TODO: document + +class GlifNeuronException( Exception ): + """ Exception for catching simulation errors and reporting intermediate data. """ + def __init__(self, message, data): + super(Exception, self).__init__(message) + self.data = data + +class GlifBadInitializationException( Exception ): + """ Exception raised when voltage is above threshold at the beginning of a sweep. i.e. probably caused by the optimizer. """ + def __init__(self, message, dv, step): + super(Exception, self).__init__(message) + self.dv = dv + self.step=step + +class GlifOptimizerNeuron( glif_neuron.GlifNeuron ): + '''Contains methods for running the neuron model in a "forced-spike" paradigm + used during optimization. + ''' + + TYPE = "GLIF" + + def __init__(self, *args, **kwargs): + + super(GlifOptimizerNeuron, self).__init__(*args, **kwargs) + + self.extrapolation_method_name = kwargs.get('extrapolation_method_name', 'endpoints') + if self.extrapolation_method_name == 'endpoints': + self.extrapolation_method = extrapolate_model_spike_from_endpoints + elif self.extrapolation_method_name == 'endpoints_single_tau': + self.extrapolation_method = extrapolate_model_spike_from_endpoints_single_tau + else: + raise Exception('unknown extrapolation method: %s' % self.extrapolation_method_name) + + #TODO: what is this where is it comming from? + self.dt_multiplier = kwargs.get('dt_multiplier', 1) + self.El_reference = kwargs.get('El_reference',None) + + + @classmethod + def from_dict(cls, d): + + return cls(El = d['El'], + dt = d['dt'], +# tau = d['tau'], + asc_tau_array=d['asc_tau_array'], + R_input = d['R_input'], + C = d['C'], + asc_amp_array = d['asc_amp_array'], + spike_cut_length = d['spike_cut_length'], + th_inf = d['th_inf'], + th_adapt=None, + coeffs = d.get('coeffs', {}), + AScurrent_dynamics_method = d['AScurrent_dynamics_method'], + voltage_dynamics_method = d['voltage_dynamics_method'], + threshold_dynamics_method = d['threshold_dynamics_method'], + voltage_reset_method = d['voltage_reset_method'], + AScurrent_reset_method = d['AScurrent_reset_method'], + threshold_reset_method = d['threshold_reset_method'], + init_voltage = d['init_voltage'], + init_threshold = d['init_threshold'], + init_AScurrents = d['init_AScurrents'], + extrapolation_method_name = d.get('extrapolation_method_name', 'endpoints'), + dt_multiplier = d.get('dt_multiplier',1), + El_reference = d['El_reference'] + ) + + @classmethod + def from_dict_legacy(cls, d): + + return cls(El = d['El'], + dt = d['dt'], +# tau = d['tau'], + asc_tau_array=d['asc_tau_array'], + R_input = d['R_input'], + C = d['C'], + asc_amp_array = d['asc_amp_array'], + spike_cut_length = d['spike_cut_length'], + th_inf = d['th_inf'], + th_adapt=d['th_adapt'], + coeffs = d.get('coeffs', {}), + AScurrent_dynamics_method = d['AScurrent_dynamics_method'], + voltage_dynamics_method = d['voltage_dynamics_method'], + threshold_dynamics_method = d['threshold_dynamics_method'], + voltage_reset_method = d['voltage_reset_method'], + AScurrent_reset_method = d['AScurrent_reset_method'], + threshold_reset_method = d['threshold_reset_method'], + init_voltage = d['init_voltage'], + init_threshold = d['init_threshold'], + init_AScurrents = d['init_AScurrents'], + extrapolation_method_name = d.get('extrapolation_method_name', 'endpoints'), + dt_multiplier = d.get('dt_multiplier',1) + ) + + def to_dict(self): + + curr_dict = super(GlifOptimizerNeuron, self).to_dict() + curr_dict.update({'extrapolation_method_name':self.extrapolation_method_name, + 'dt_multiplier':self.dt_multiplier, + 'El_reference':self.El_reference}) + + return curr_dict + + def run_with_biological_spikes(self, stimulus, response, bio_spike_time_steps): + """ Run the neuron simulation over a stimulus, but do not allow the model to spike on its own. Rather, + force the simulation to spike and reset at a given set of spike indices. Dynamics rules are applied + between spikes regardless of the simulated voltage and threshold values. Reset rules are applied only + at input spike times. This is used during optimization to force the model to follow the spikes of biological data. + The model is optimized in this way so that history effects due to spiking can be adequately modeled. For example, + every time the model spikes a new set of afterspike currents will be initiated. To ensure that afterspike currents + can be optimized, we force them to be initiated at the time of the biological spike. + + Parameters + ---------- + stimulus : np.ndarray + vector of scalar current values + respones : np.ndarray + vector of scalar voltage values + bio_spike_time_steps : list + spike time step indices + + Returns + ------- + dict + a dictionary containing: + 'voltage': simulated voltage values, + 'threshold': simulated threshold values, + 'AScurrent_matrix': afterspike currents during the simulation, + 'grid_model_spike_times': spike times of the model aligned to the simulation grid (when it would have spiked), + 'interpolated_model_spike_times': spike times of the model linearly interpolated between time steps, + 'grid_ISI': interspike interval between grid model spike times, + 'interpolated_ISI': interspike interval between interpolated model spike times, + 'grid_bio_spike_model_voltage': voltage of the model at biological/input spike times, + 'grid_bio_spike_model_threshold': voltage of the model at biological/input spike times interpolated between time steps + """ + + self.threshold_components = None #get rid of lingering threshold components + + voltage_t0 = self.init_voltage + threshold_t0 = self.init_threshold + AScurrents_t0 = self.init_AScurrents + + if voltage_t0>threshold_t0: + raise GlifBadInitializationException("Voltage STARTS above threshold: voltage_t0 (%f) threshold_t0 (%f)" % ( voltage_t0, threshold_t0, voltage_t0 - threshold_t0, 10000000.0)) + + start_index = 0 + end_index = 0 + + try: + num_spikes = len(bio_spike_time_steps) + + # if there are no target spikes, just run until the model spikes + if num_spikes == 0: + + start_index = 0 + end_index = len(stimulus) + + # evaluate the model starting from the beginning until the model spikes + run_data = self.run_until_biological_spike(voltage_t0, threshold_t0, AScurrents_t0, + stimulus, response, start_index, end_index, + []) + + voltage = run_data['voltage'] + threshold = run_data['threshold'] + AScurrent_matrix = run_data['AScurrent_matrix'] + + if len(voltage) != len(stimulus): + logging.warning('Your voltage output is not the same length as your stimulus') + if len(threshold) != len(stimulus): + logging.warning('Your threshold output is not the same length as your stimulus') + if len(AScurrent_matrix) != len(stimulus): + logging.warning('Your AScurrent_matrix output is not the same length as your stimulus') + + # do not keep track of the spikes in the model that spike if the target doesn't spike. + grid_ISI = np.array([]) + interpolated_ISI = np.array([]) + + grid_model_spike_times = np.array([]) + interpolated_model_spike_times = np.array([]) + + grid_model_spike_voltages = np.array([]) + interpolated_model_spike_voltages = np.array([]) + + grid_bio_spike_model_voltage = np.array([]) + grid_bio_spike_model_threshold = np.array([]) + else: + # initialize the output arrays + grid_ISI = np.empty(num_spikes) + interpolated_ISI = np.empty(num_spikes) + + grid_model_spike_times = np.empty(num_spikes) + interpolated_model_spike_times = np.empty(num_spikes) + + grid_model_spike_voltages = np.empty(num_spikes) + interpolated_model_spike_voltages = np.empty(num_spikes) + + grid_bio_spike_model_voltage = np.empty(num_spikes) + grid_bio_spike_model_threshold = np.empty(num_spikes) + + spikeIndStart = 0 + + voltage = np.empty(len(stimulus)) + voltage[:] = np.nan + threshold = np.empty(len(stimulus)) + threshold[:] = np.nan + AScurrent_matrix = np.empty(shape=(len(stimulus), len(AScurrents_t0))) + AScurrent_matrix[:] = np.nan + + # run the simulation over the interspike intervals (starting at the beginning of the simulation). + start_index = 0 + for spike_num in range(num_spikes): + + if spike_num % 10 == 0: + logging.debug("spike %d / %d" % (spike_num, num_spikes)) + + end_index = int(bio_spike_time_steps[spike_num]) + + assert start_index < end_index, Exception("start_index > end_index: this is probably because spike_cut_length is longer than the previous inter-spike interval") + + # run the simulation over this interspike interval +# t0 = time.time() + run_data = self.run_until_biological_spike(voltage_t0, threshold_t0, AScurrents_t0, + stimulus, response, start_index, end_index, + bio_spike_time_steps) +# print('fast', time.time() - t0) + +# curr_voltage = run_data_fast['voltage'] +# curr_threshold = run_data_fast['threshold'] +# voltage_scrubbed = curr_voltage[np.logical_not(np.isnan(curr_voltage))] +# threshold_scrubbed = curr_threshold[np.logical_not(np.isnan(curr_threshold))] +# +# tmp_t = np.linspace(0,1,len(voltage_scrubbed)) +# print(voltage_scrubbed) +# plt.plot(tmp_t, voltage_scrubbed) +# plt.plot(tmp_t, threshold_scrubbed) +# +# plt.show() +# sys.exit() + +# for key, val in run_data.items(): +# print(key, val) +# sys.exit() + + + # assign the simulated data to the correct locations in the output arrays + voltage[start_index:end_index] = run_data['voltage'] + threshold[start_index:end_index] = run_data['threshold'] + AScurrent_matrix[start_index:end_index,:] = run_data['AScurrent_matrix'] + + grid_ISI[spike_num] = run_data['grid_model_spike_time'] + interpolated_ISI[spike_num] = run_data['interpolated_model_spike_time'] + + grid_model_spike_times[spike_num] = run_data['grid_model_spike_time'] + start_index * self.dt + interpolated_model_spike_times[spike_num] = run_data['interpolated_model_spike_time'] + start_index * self.dt + + grid_model_spike_voltages[spike_num] = run_data['grid_model_spike_voltage'] + interpolated_model_spike_voltages[spike_num] = run_data['interpolated_model_spike_voltage'] + + grid_bio_spike_model_voltage[spike_num] = run_data['grid_bio_spike_model_voltage'] + grid_bio_spike_model_threshold[spike_num] = run_data['grid_bio_spike_model_threshold'] + + # update the voltage, threshold, and afterspike currents for the next interval + voltage_t0 = run_data['voltage_t0'] + threshold_t0 = run_data['threshold_t0'] + AScurrents_t0 = run_data['AScurrents_t0'] + + start_index = end_index + + # if cutting spikes, jump forward the appropriate amount of time + if self.spike_cut_length > 0: + start_index += self.spike_cut_length + + # simulate the portion of the stimulus between the last spike and the end of the array. + # no spikes are recorded from this time! + run_data = self.run_until_biological_spike(voltage_t0, threshold_t0, AScurrents_t0, + stimulus, response, start_index, len(stimulus), + bio_spike_time_steps) + + voltage[start_index:] = run_data['voltage'] + threshold[start_index:] = run_data['threshold'] + AScurrent_matrix[start_index:,:] = run_data['AScurrent_matrix'] + + # make sure that the output data has the correct number of spikes in it + if ( len(interpolated_model_spike_times) != num_spikes or + len(grid_model_spike_times) != num_spikes or + len(grid_ISI) != num_spikes or + len(interpolated_ISI) != num_spikes or + len(grid_bio_spike_model_voltage) != num_spikes or + len(grid_bio_spike_model_threshold) != num_spikes): + raise Exception('The number of spikes in your output does not match your target') + + except GlifNeuronException as e: + + # if an exception was raised during run_until_spike, record any simulated data before exiting + voltage[start_index:end_index] = e.data['voltage'] + threshold[start_index:end_index] = e.data['threshold'] + AScurrent_matrix[start_index:end_index,:] = e.data['AScurrent_matrix'] + + out = { + 'voltage': voltage, + 'threshold': threshold, + 'AScurrent_matrix': AScurrent_matrix, + + 'grid_ISI': grid_ISI, + 'interpolated_ISI': interpolated_ISI, + + 'grid_model_spike_times': grid_model_spike_times, + 'interpolated_model_spike_times': interpolated_model_spike_times, + + 'grid_model_spike_voltages': grid_model_spike_voltages, + 'interpolated_model_spike_voltages': interpolated_model_spike_voltages, + + 'grid_bio_spike_model_voltage': grid_bio_spike_model_voltage, + 'grid_bio_spike_model_threshold': grid_bio_spike_model_threshold + } + + raise GlifNeuronException(e.message, out) + + return { + 'voltage': voltage, + 'threshold': threshold, + 'AScurrent_matrix': AScurrent_matrix, + + 'grid_model_spike_times': grid_model_spike_times, + 'interpolated_model_spike_times': interpolated_model_spike_times, + + 'grid_model_spike_voltages': grid_model_spike_voltages, + 'interpolated_model_spike_voltages': interpolated_model_spike_voltages, + + 'grid_ISI': grid_ISI, + 'interpolated_ISI': interpolated_ISI, + + 'grid_bio_spike_model_voltage': grid_bio_spike_model_voltage, + 'grid_bio_spike_model_threshold': grid_bio_spike_model_threshold + } + + def run_until_biological_spike(self, voltage_t0, threshold_t0, AScurrents_t0, + stimulus, response, start_index, after_end_index, + bio_spike_time_steps): + """ Run the neuron simulation over a segment of a stimulus given initial conditions for use in the "forced spike" + optimization paradigm. [Note: the section of stimulus + is meant to be between two biological neuron spikes. Thus the stimulus is during the interspike interval (ISI)]. The + model is simulated until either the model spikes or the end of the segment is reached. If the model does not spike, a + spike time is extrapolated past the end of the simulation segment. + + This function also returns the initial conditions for the subsequent stimulus segment. In the forced spike paradigm + there are several ways + + Parameters + ---------- + voltage_t0 : float + the current voltage of the neuron + threshold_t0 : float + the current spike threshold level of the neuron + AScurrents_t0 : np.ndarray + the current state of the afterspike currents in the neuron + stimulus : np.ndarray + the full stimulus array (not just the segment of data being simulated) + response : np.ndarray + the full response array (not just the segment of data being simulated) + start_index : int + index of global stimulus at which to start simulation + after_end_index : int + index of global stimulus *after* the last index to be simulated + bio_spike_time_steps : list + time steps of input spikes + + Returns + ------- + dict + a dictionary containing: + 'voltage': simulated voltage value + 'threshold': simulated threshold values + 'AScurrent_matrix': afterspike current values during the simulation + 'grid_model_spike_time': model spike time (in units of dt) + 'interpolated_model_spike_time': model spike time (in units of dt) interpolated between time steps + 'voltage_t0': reset voltage value to be used in subsequent simulation interval + 'threshold_t0': reset threshold value to be used in subsequent simulation interval + 'AScurrents_t0': reset afterspike current value to be used in subsequent simulation interval + 'grid_bio_spike_model_voltage': model voltage at the time of the input spike + 'grid_bio_spike_model_threshold': model threshold at the time of the input spike + """ + + grid_model_spike_time = None + grid_model_spike_voltage = None + interpolated_model_spike_time = None + interpolated_model_spike_voltage = None + + # preallocate arrays and matricies + num_time_steps_fine = after_end_index - start_index + t_fine_grid = np.arange(num_time_steps_fine)*self.dt + + #-------------------------------------------------------------------------------- + #---Apply refinement factor to integrate over larger time steps (assumes--------- + #---current within the steps can be averaged):---------------------------------- + #-------------------------------------------------------------------------------- + dt_old = self.dt + self.dt = self.dt*self.dt_multiplier + + # define the local course grain indicies note the last graining will be shorter and is appended to the end + local_coarse_indicies=np.append(np.arange(num_time_steps_fine)[::self.dt_multiplier], after_end_index - start_index) #the last indicie in this array is still one longer than the last simulated index + # convert the local coarse grained indicies into global incidies + global_coarse_indicies=local_coarse_indicies+start_index + + # TODO: I dont think this does anything. + if len(local_coarse_indicies)==2: + pass + + num_time_steps_coarse = len(local_coarse_indicies) + voltage_out_coarse_grid = np.empty(num_time_steps_coarse) + voltage_out_coarse_grid[:] = np.nan + threshold_out_coarse_grid = np.empty(num_time_steps_coarse) + threshold_out_coarse_grid[:] = np.nan + AScurrent_matrix_coarse_grid = np.empty(shape=(num_time_steps_coarse, len(AScurrents_t0))) + AScurrent_matrix_coarse_grid[:] = np.nan + # these grid times are in the local frame of reference + t_coarse_grid = np.arange(num_time_steps_coarse-1)*self.dt #subtracting the one off here because appending the actual last time that is not the same dt. + t_coarse_grid = np.append(t_coarse_grid, t_fine_grid[-1]) + dt_vector=t_coarse_grid[1:]-t_coarse_grid[:-1] #note that this vector is one index shorter than the t_course_grid + + # Define the coarse grain stimulus by taking the stimulus average between indicies. Note that since the initial input voltage is recorded in + # the output vectors the stimulus average is indeed the input to the correct time step (i.e. current being fed in is the average current before the step) + stimulus_coarse=[stimulus[global_coarse_indicies[ii]:global_coarse_indicies[ii+1]].mean() for ii in range(len(global_coarse_indicies)-1)] + + # step though time steps and calculate voltage values + for time_step in range(len(local_coarse_indicies)-1): #minus 1 is needed to match vector sizes because initial inputs are recorded in output vectors. + # update output values (Note: in general one can update values before or after the first time step. + # Here the input starting value of voltage is recorded before a time step. This means the last value is not recorded.) + voltage_out_coarse_grid[time_step] = voltage_t0 + threshold_out_coarse_grid[time_step] = threshold_t0 + AScurrent_matrix_coarse_grid[time_step,:] = np.matrix(AScurrents_t0) + + # record error in optimization if they are happening + if np.isnan(voltage_t0) or np.isinf(voltage_t0) or np.isnan(threshold_t0) or np.isinf(threshold_t0) or any(np.isnan(AScurrents_t0)) or any(np.isinf(AScurrents_t0)): + logging.error(self) + logging.error('time step: %d / %d' % (time_step, num_time_steps_coarse)) + logging.error(' voltage_t0: %f' % voltage_t0) + logging.error(' voltage started the run at: %f' % voltage_out_coarse_grid[0]) + logging.error(' voltage before: %s' % voltage_out_coarse_grid[time_step-20:time_step]) + logging.error(' threshold_t0: %f' % threshold_t0) + logging.error(' threshold started the run at: %f' % threshold_out_coarse_grid[0]) + logging.error(' threshold before: %s' % threshold_out_coarse_grid[time_step-20:time_step]) + logging.error(' AScurrents_t0: %s' % AScurrents_t0) + if 'a_spike' in self.threshold_dynamics_method.params: + logging.error(' a_spike: %s' % self.threshold_dynamics_method.params['a_spike']) + if 'b_spike' in self.threshold_dynamics_method.params: + logging.error(' b_spike: %s' % self.threshold_dynamics_method.params['b_spike']) + + # plot output in original index space + temp_fine_grid_for_intp=np.arange(0,t_coarse_grid[time_step-1], dt_old) + voltage_out_fine_grid = np.empty(num_time_steps_fine) + voltage_out_fine_grid[:] = np.nan + threshold_out_fine_grid = np.empty(num_time_steps_fine) + threshold_out_fine_grid[:] = np.nan + + fv = spi.interp1d(t_coarse_grid[:time_step], voltage_out_coarse_grid[:time_step], assume_sorted=True, bounds_error=False, fill_value=voltage_out_coarse_grid[-1]) + ft = spi.interp1d(t_coarse_grid[:time_step], threshold_out_coarse_grid[:time_step], assume_sorted=True, bounds_error=False, fill_value=threshold_out_coarse_grid[-1]) + + voltage_with_error = fv(temp_fine_grid_for_intp) + threshold_with_error = ft(temp_fine_grid_for_intp) + voltage_out_fine_grid[:len(voltage_with_error)]=voltage_with_error + threshold_out_fine_grid[:len(threshold_with_error)]=threshold_with_error + + AScurrent_matrix = np.empty(shape=(num_time_steps_fine, len(AScurrents_t0))) + AScurrent_matrix[:] = np.nan + for ii in range(len(AScurrents_t0)): + curr_fASc = spi.interp1d(t_coarse_grid[:time_step], AScurrent_matrix_coarse_grid[:time_step,ii], assume_sorted=True, bounds_error=False, fill_value=AScurrent_matrix_coarse_grid[-1,ii]) + temp_asc=curr_fASc(temp_fine_grid_for_intp) + AScurrent_matrix[:len(temp_asc),ii] = temp_asc + + raise GlifNeuronException('Invalid threshold, voltage, or after-spike current encountered.', { + 'voltage': voltage_out_fine_grid, + 'threshold': threshold_out_fine_grid, + 'AScurrent_matrix': AScurrent_matrix + }) + + # changing dt be the dt of the coarse bin (which is variable for the last bin) + self.dt=dt_vector[time_step] + (voltage_t1, threshold_t1, AScurrents_t1) = self.dynamics(voltage_t0, threshold_t0, AScurrents_t0, stimulus_coarse[time_step], time_step+start_index, bio_spike_time_steps) #TODO fix list versus array + + # updating the input values + voltage_t0=voltage_t1 + threshold_t0=threshold_t1 + AScurrents_t0=AScurrents_t1 + + # Inserting the last values into the nan at the end of the matricies so that when do the interpolation the end of the vector will not be nans + # Note this should not mess with any of the outputs because is the interploated values that are the output. + voltage_out_coarse_grid[time_step+1] = voltage_t0 + threshold_out_coarse_grid[time_step+1] = threshold_t0 + AScurrent_matrix_coarse_grid[time_step+1,:] = np.matrix(AScurrents_t0) + + # Reset dt to previous value: + self.dt = dt_old + + fv = spi.interp1d(t_coarse_grid, voltage_out_coarse_grid, assume_sorted=True, bounds_error=False, fill_value=voltage_out_coarse_grid[-1]) + ft = spi.interp1d(t_coarse_grid, threshold_out_coarse_grid, assume_sorted=True, bounds_error=False, fill_value=threshold_out_coarse_grid[-1]) + voltage_out = fv(t_fine_grid) + threshold_out = ft(t_fine_grid) + + # initalize after spike current matrix + AScurrent_matrix = np.empty(shape=(num_time_steps_fine, len(AScurrents_t0))) + AScurrent_matrix[:] = np.nan + for ii in range(len(AScurrents_t0)): + curr_fASc = spi.interp1d(t_coarse_grid, AScurrent_matrix_coarse_grid[:,ii], assume_sorted=True, bounds_error=False, fill_value=AScurrent_matrix_coarse_grid[-1,ii]) + AScurrent_matrix[:,ii] = curr_fASc(t_fine_grid) + + # find where model voltage crosses model threshold + grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage = find_first_model_spike(voltage_out, threshold_out, voltage_t1, threshold_t1, self.dt) + # if the model never spiked, extrapolate to guess when it would have spiked + if grid_model_spike_time is None: + grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage = self.extrapolation_method(self, voltage_out, threshold_out, voltage_t1, threshold_t1, self.dt) + + # when the target spikes, reset so that next round will start at reset but not recording it in the voltage here. + # note that at the last section of the stimulus where there is no current injected the model will be reset even if + # the biological neuron doesn't spike. However, this doesnt matter as it won't be recorded. + num_spikes = len(bio_spike_time_steps) + if num_spikes > 0: + if after_end_index<len(stimulus): + + #TODO: ????????????????????????????????WHAT IS THIS????????????????????????????????????????????????????????????? + #I CANT FIGURE OUT WHY THIS WOULD HAVE BEEN HERE + if self.threshold_reset_method.name == 'adapt_sum_slow_fast': + voltage_t1 = threshold_t1 + #--------------------------------------------------------------------------------------------------------------------- + #---------below is an option you choose for reseting based on values of model at the biological spike----------------- + #---------or at the time where model voltage crosses model threshold-------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------- + #(voltage_t0, threshold_t0, AScurrents_t0) = self.reset(interpolated_model_spike_voltage, interpolated_model_spike_voltage, AScurrents_t1) #USE THIS IF YOU WANT TO USE USE MODEL VALUES AT MODEL SPIKE + (voltage_t0, threshold_t0, AScurrents_t0, bad_reset_flag) = self.reset(voltage_t1, threshold_t1, AScurrents_t1) #USE THIS IF YOU WANT TO USE MODEL VALUES AT TIME OF BIOLOGICAL SPIKE + #--------------------------------------------------------------------------------------------------------------------- + else: + (voltage_t0, threshold_t0, AScurrents_t0) = None, None, None + + return { + 'voltage': voltage_out, + 'threshold': threshold_out, + 'AScurrent_matrix': AScurrent_matrix, + + 'grid_model_spike_time': grid_model_spike_time, + 'interpolated_model_spike_time': interpolated_model_spike_time, + + 'grid_model_spike_voltage': grid_model_spike_voltage, + 'interpolated_model_spike_voltage': interpolated_model_spike_voltage, + + 'voltage_t0': voltage_t0, + 'threshold_t0': threshold_t0, + 'AScurrents_t0': AScurrents_t0, + + 'grid_bio_spike_model_voltage': voltage_t1, + 'grid_bio_spike_model_threshold': threshold_t1 + } + +def find_first_model_spike(voltage, threshold, voltage_t1, threshold_t1, dt): + num_time_steps = len(voltage) + + for time_step in xrange(num_time_steps): + if voltage[time_step] > threshold[time_step]: + grid_model_spike_time = dt * (time_step-1) + grid_model_spike_voltage = voltage[time_step-1] + + interpolated_model_spike_time = glif_neuron.interpolate_spike_time(dt, time_step-1, + threshold[time_step-1], threshold[time_step], + voltage[time_step-1], voltage[time_step]) + + interpolated_model_spike_voltage = interpolate_spike_voltage(dt, time_step-1, + threshold[time_step-1], threshold[time_step], + voltage[time_step-1], voltage[time_step]) + + return grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage + + # if the last voltage is above threshold and there hasn't already been a spike + if voltage_t1 > threshold_t1: + grid_model_spike_time = dt * ( num_time_steps - 1 ) + grid_model_spike_voltage = voltage_t1 + + interpolated_model_spike_time = glif_neuron.interpolate_spike_time(dt, num_time_steps - 1, threshold[num_time_steps-1], threshold_t1, voltage[num_time_steps-1], voltage_t1) + interpolated_model_spike_voltage = interpolate_spike_voltage(dt, num_time_steps, threshold[-1], threshold_t1, voltage[-1], voltage_t1) + + return grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage + + + return None, None, None, None + +def extrapolate_model_spike_from_endpoints(neuron, voltage, threshold, voltage_t1, threshold_t1, dt): + + #--extrapolate using first point in ISI and last point in ISI + num_time_steps = len(voltage) + + interpolated_model_spike_time = extrapolate_spike_time(dt, num_time_steps, threshold[0], threshold_t1, voltage[0], voltage_t1) + interpolated_model_spike_voltage = extrapolate_spike_voltage(dt, num_time_steps, threshold[0], threshold_t1, voltage[0], voltage_t1) + + grid_model_spike_time = np.ceil(interpolated_model_spike_time / dt) * dt # grid spike time based off extrapolated spike time + grid_model_spike_voltage = interpolated_model_spike_voltage + + result = grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage + + + return result + + + +def extrapolate_model_spike_from_endpoints_single_tau(neuron, voltage, threshold, voltage_t1, threshold_t1, dt): + tau_m = neuron.tau_m + num_time_steps = len(voltage) + ii = np.floor(tau_m/dt) + starting_ind = max(0,(num_time_steps - ii)) + result = extrapolate_model_spike_from_endpoints(neuron, voltage[starting_ind:], threshold[starting_ind:], voltage_t1, threshold_t1, dt) + + return result + +def extrapolate_spike_time(dt, num_time_steps, threshold_t0, threshold_t1, voltage_t0, voltage_t1): + """ Given two voltage and threshold values and an interval between them, extrapolate a spike time + by intersecting lines the thresholds and voltages. """ + return glif_neuron.line_crossing_x(dt * num_time_steps, voltage_t0, voltage_t1, threshold_t0, threshold_t1) + +def extrapolate_spike_voltage(dt, num_time_steps, threshold_t0, threshold_t1, voltage_t0, voltage_t1): + """ Given two voltage and threshold values and an interval between them, extrapolate a spike time + by intersecting lines the thresholds and voltages. """ + return glif_neuron.line_crossing_y(dt * num_time_steps, voltage_t0, voltage_t1, threshold_t0, threshold_t1) + +def interpolate_spike_voltage(dt, time_step, threshold_t0, threshold_t1, voltage_t0, voltage_t1): + """ Given two voltage and threshold values, the dt between them and the initial time step, interpolate + a spike time within the dt interval by intersecting the two lines. """ + return time_step*dt + glif_neuron.line_crossing_y(dt, voltage_t0, voltage_t1, threshold_t0, threshold_t1) diff --git a/internal/model/glif/optimize_neuron.py b/internal/model/glif/optimize_neuron.py new file mode 100644 index 0000000000..f37edabc53 --- /dev/null +++ b/internal/model/glif/optimize_neuron.py @@ -0,0 +1,128 @@ +import argparse, sys, logging + +import allensdk.core.json_utilities as ju +import allensdk.internal.model.glif.find_sweeps as fs + +from allensdk.internal.model.glif.glif_optimizer_neuron import GlifOptimizerNeuron +from allensdk.internal.model.glif.glif_experiment import GlifExperiment +from allensdk.internal.model.glif.glif_optimizer import GlifOptimizer + +from allensdk.internal.model.data_access import load_sweeps +from allensdk.internal.model.glif.find_spikes import find_spikes_list +import allensdk.core.json_utilities as ju +import allensdk.internal.model.glif.preprocess_neuron as pn + +def get_optimize_sweep_numbers(sweep_index): + #TODO: why is this here--why are sweep indicies being fed to a find_noise_sweeps sweeps and specifying + #noise?--shouldn't the sweeps already be provided? + return fs.find_noise_sweeps(sweep_index)['noise1'] + +def optimize_neuron(model_config, sweep_index, nwb_file, save_callback=None): + '''Optimizes a neuron. + 1. Loads optimizer and neuron configuration data. + 2. Loads the voltage trace sweeps that will be optimized + 3. Configures the experiment and optimizer + 4. Runs the optimizer + 5. TODO: where is data saved + + Parameters + ---------- + model_config : dictionary + contains values of neuron and optimizer parameters + sweep_index : list of integers + indices (as labeled in the data configuration file) of sweeps that will be optimized + save_callback : module + saves output + ''' + # define the neuron and optimizer dictionaries from the model configuration + neuron_config = model_config['neuron'] + optimizer_config = model_config['optimizer'] + + # load the neuron with along with the methods needed for optimization + neuron = GlifOptimizerNeuron.from_dict(neuron_config) + + # TODO: not sure what this is doing + optimize_sweeps = get_optimize_sweep_numbers(sweep_index) + + # load the sweeps to be optimized + optimize_data = load_sweeps(nwb_file, optimize_sweeps, neuron.dt, + optimizer_config["cut"], optimizer_config["bessel"]) + + # needed to offset all voltages by El_reference + El_reference = neuron_config['El_reference'] + + # get indicies of spikes and voltage at those spikes + spike_ind, spike_v = find_spikes_list(optimize_data['voltage'], neuron_config['dt']) + + # get times of spikes + grid_spike_times = [ si*neuron_config['dt'] for si in spike_ind ] + + # convert voltage at spikes into reference frame of El + grid_spike_voltages_in_ref_to_zero = [ sv - El_reference for sv in spike_v ] + + # convert voltage into reference frame of El + resp_list = [ d - El_reference for d in optimize_data['voltage'] ] + + # configure experiment + experiment = GlifExperiment(neuron = neuron, + dt = neuron.dt, + stim_list = optimize_data['current'], + resp_list = resp_list, + spike_time_steps = spike_ind, + grid_spike_times = grid_spike_times, + grid_spike_voltages = grid_spike_voltages_in_ref_to_zero, + param_fit_names = optimizer_config['param_fit_names']) + + # configure optimizer + optimizer = GlifOptimizer(experiment = experiment, + dt = neuron.dt, + outer_iterations = optimizer_config['outer_iterations'], + inner_iterations = optimizer_config['inner_iterations'], + sigma_inner = optimizer_config['sigma_inner'], + sigma_outer = optimizer_config['sigma_outer'], + param_fit_names = optimizer_config['param_fit_names'], + stim = optimize_data['current'], + error_function_data = optimizer_config['error_function_data'], + xtol = optimizer_config['xtol'], + ftol = optimizer_config['ftol'], + internal_iterations = optimizer_config['internal_iterations'], + init_params = optimizer_config.get('init_params', None), + bessel = optimizer_config['bessel']) + + def save(optimizer, outer, inner): + logging.info('finished outer: %d inner: %d' % (outer, inner)) + if save_callback: + save_callback(optimizer, outer, inner) + + # run the optimizer + best_param, begin_param = optimizer.run_many(save) + + # over write the the initial experiment parameters with the best found parameters + # TODO: but why do this since it is not being returned + experiment.set_neuron_parameters(best_param) + + return optimizer, best_param, begin_param + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('model_config_file') + parser.add_argument('sweeps_file') + parser.add_argument('output_file') + parser.add_argument("--dt", default=pn.DEFAULT_DT) + parser.add_argument("--bessel", default=pn.DEFAULT_BESSEL) + parser.add_argument("--cut", default=pn.DEFAULT_CUT) + + args = parser.parse_args() + + model_config = ju.read(args.model_config_file) + sweep_list = ju.read(args.sweeps_file) + + sweep_index = { s['sweep_number']:s for s in sweep_list } + + try: + neuron, best_param, begin_param = optimize_neuron(model_config, sweep_index, dt, cut, bessel) + ju.write(args.output_file, neuron.to_dict()) + except Exception as e: + logging.error(e.message) + +if __name__ == "__main__": main() diff --git a/internal/model/glif/plotting.py b/internal/model/glif/plotting.py new file mode 100644 index 0000000000..645c583544 --- /dev/null +++ b/internal/model/glif/plotting.py @@ -0,0 +1,107 @@ +'''Written by Corinne Teeter 3-31-14 +''' + +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + + +def checkPreprocess(originalStim_list, processedStim_list, originalVoltage_list, processedVoltage_list, config, blockME=False): + + timeOriginal=np.arange(len(np.concatenate(originalStim_list)))*config.neuron['dt'] + if 'subSample' in config.dictOfPreprocessMethods.keys(): + timeProcessed=np.arange(len(np.concatenate(processedStim_list)))*config.dictOfPreprocessMethods['subSample']['desired_time_step'] + else: + timeProcessed=timeOriginal + + plt.figure(figsize=(20,10)) + plt.subplot(4,1,1) + plt.plot(timeOriginal, np.concatenate(originalStim_list), 'b') + plt.title('original stimulation') + + plt.subplot(4,1,2) + plt.plot(timeProcessed, np.concatenate(processedStim_list), 'r') + plt.title('processed stimulation') + + plt.subplot(4,1,3) + plt.plot(timeOriginal, np.concatenate(originalVoltage_list), 'b') + plt.title('original voltage') + + plt.subplot(4,1,4) + plt.plot(timeProcessed, np.concatenate(processedVoltage_list), 'r') + plt.title('processed voltage') + + plt.annotate(config.cellName+': View result of preprocessing', xy=(.4, .975), + xycoords='figure fraction', + horizontalalignment='left', verticalalignment='top', + fontsize=20) + +# plt.show(block=blockME) + +def plotSpikes(voltage_list, spike_ind_list, dt, blockME=False, method=False): + + converted_spike_ind_list=[] + time=np.arange(len(np.concatenate(voltage_list)))*dt + #--find the length of each vector + thelength=0 + for ii, voltage in enumerate(voltage_list): + converted_spike_ind_list.append(spike_ind_list[ii]+thelength) + thelength=thelength+len(voltage) + + subsampled_time=[time[ii] for ii in np.concatenate(converted_spike_ind_list)] + + plt.figure(figsize=(20, 5)) + plt.plot(time, np.concatenate(voltage_list), 'b') + plt.plot(subsampled_time, [np.concatenate(voltage_list)[ii] for ii in np.concatenate(converted_spike_ind_list)], 'r.', ms=16) + if method==False: + plt.title('Spikes') + else: + plt.title('Spikes. Method used: '+method) + + plt.ylabel('voltage (V)') + plt.xlabel('time (s)') +# plt.show(block=blockME) + +def checkSpikeCutting(originalStim_list, cutStim_list, originalVoltage_list, cutVoltage_list, allindOfNonSpiking_list, config, blockME=False): + + if len(originalStim_list)!=len(cutStim_list) or \ + len(originalStim_list)!=len(originalVoltage_list) or \ + len(originalStim_list)!=len(cutVoltage_list) or \ + len(originalStim_list)!=len(allindOfNonSpiking_list): + raise Exception('lists are not the same length') + + + lengthGoingToAdd=0 + whole_ind=np.array([]) + whole_v=np.array([]) + for trace, ind_array in zip(originalVoltage_list, allindOfNonSpiking_list): + ind=np.arange(0, len(trace))+lengthGoingToAdd + whole_ind=np.append(whole_ind, [ind[ii] for ii in ind_array]) + whole_v=np.append(whole_v, [trace[ii] for ii in ind_array]) + lengthGoingToAdd=lengthGoingToAdd+len(trace) + + + time=np.arange(len(np.concatenate(originalStim_list)))*config.neuron['dt'] + plt.figure(figsize=(20,10)) + + plt.subplot(1,1,1) + plt.plot(time, np.concatenate(originalVoltage_list)) + plt.title('voltage') + + plt.plot(whole_ind*config.neuron['dt'], whole_v, '--r', lw=2) + + plt.annotate(config.cellName+': check spike cutting', xy=(.4, .975), + xycoords='figure fraction', + horizontalalignment='left', verticalalignment='top', + fontsize=20) +# plt.show(block=blockME) + +def plotLineRegress1(slope, intercept, r,xlim): + y=slope*xlim+intercept + print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) + plt.plot(xlim, y, '-k', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) + +def plotLineRegressRed(slope, intercept, r,xlim): + y=slope*xlim+intercept + print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) + plt.plot(xlim, y, '-r', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) diff --git a/internal/model/glif/preprocess_neuron.py b/internal/model/glif/preprocess_neuron.py new file mode 100644 index 0000000000..73f1267888 --- /dev/null +++ b/internal/model/glif/preprocess_neuron.py @@ -0,0 +1,494 @@ +import argparse, logging +import itertools +from scipy.optimize import fmin +import numpy as np +import os +import allensdk.core.json_utilities as ju +import allensdk.internal.model.glif.find_sweeps as fs +from allensdk.internal.model.data_access import load_sweeps +from allensdk.internal.model.glif.MLIN import MLIN +from allensdk.internal.model.glif.ASGLM import ASGLM_pairwise +from allensdk.internal.model.glif.rc import least_squares_RCEl_calc_tested +from allensdk.internal.model.glif.threshold_adaptation import calc_spike_component_of_threshold_from_multiblip +from allensdk.internal.model.glif.spike_cutting import calc_spike_cut_and_v_reset_via_expvar_residuals +from allensdk.internal.model.glif.find_spikes import find_spikes_list, find_spikes_ssq_list +from allensdk.internal.model.glif.threshold_adaptation import fit_avoltage_bvoltage_th, fit_avoltage_bvoltage +import allensdk.ephys.ephys_extractor as efex +import allensdk.ephys.ephys_features as ft +from allensdk.model.glif.glif_neuron_methods import spike_component_of_threshold_exact +import matplotlib.pyplot as plt +import allensdk.internal.model.glif.plotting as plotting + +RESTING_POTENTIAL = 'slow_vm_mv' +DEFAULT_DT = 5e-05 +DEFAULT_CUT = 0 +DEFAULT_BESSEL = { 'N': 4, 'freq': 10000 } +MAKE_PLOT = True +SHOW_PLOT = False +SAVE_FIG =True +SHORT_RUN = False + +class MissingSpikeException(Exception): pass + +RESTING_POTENTIAL = 'slow_vm_mv' + +def find_first_spike_voltage(voltage, dt, ssq=False, MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False, + dv_cutoff=20.0, thresh_frac=0.05): + '''calculate voltage at threshold of first spike + Parameters + ---------- + voltage: numpy array + voltage trace + dt: float + sampling time step + ssq: Boolean + whether there is or is not a subrathreshold short square pulse (note that if thes + MAKE_PLOT: Boolean + specifies whether or not a plot should be made + SHOW_PLOT: Boolean + specifies if a visualization should be made + BLOCK: Boolean + if a plot is made this specifies weather to stop the code until the plot is closed + dv_cutoff: float + specifies cut off of the derivative of the voltage + thresh_frac: float + variable that goes into feature extractor + + Returns + ------- + :float + voltage of threshold of first spike + ''' + + if ssq: + spike_time_steps, _ = find_spikes_ssq_list([voltage], dt, dv_cutoff=dv_cutoff, thresh_frac=thresh_frac) + else: + spike_time_steps, _ = find_spikes_list([voltage], dt) + + if MAKE_PLOT: + plotting.plotSpikes([voltage], spike_time_steps, dt, blockME=False, method='dvdt_v2') + if SHOW_PLOT: + plt.show(block=BLOCK) + + if len(spike_time_steps[0]) == 0: + raise MissingSpikeException('No spike detected.') + + return voltage[spike_time_steps[0][0]] + +def tag_plot(tag, fs=9): + plt.annotate(tag, xy=(0.98, .01), + xycoords='figure fraction', + horizontalalignment='right', + verticalalignment='bottom', + fontsize=fs) + +def estimate_dv_cutoff(voltage_list, dt, start_t, end_t): + v_set = [ v * 1e3 for v in voltage_list ] + t_set = [ np.arange(0, len(v)) * dt for v in voltage_list ] + + dv_cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters(v_set, t_set, + start_t, end_t, + filter=None) + + return dv_cutoff, thresh_frac + +def preprocess_neuron(nwb_file, sweep_list, cell_properties=None, + dt=None, cut=None, bessel=None, save_figure_path=None): + if dt is None: + dt = DEFAULT_DT + if cut is None: + cut = DEFAULT_CUT + if bessel is None: + bessel = DEFAULT_BESSEL + + sweep_index = { s['sweep_number']: s for s in sweep_list } + + noise_sweeps = fs.find_noise_sweeps(sweep_index) + noise1_sweeps = noise_sweeps['noise1'] + noise2_sweeps = noise_sweeps['noise2'] + + ssq_sweeps = fs.find_short_square_sweeps(sweep_index) + all_ssq_data = load_sweeps(nwb_file, ssq_sweeps['all'], dt, cut, bessel) + ssq_dv_cutoff, ssq_thresh_frac = estimate_dv_cutoff(all_ssq_data['voltage'], dt, + efex.SHORT_SQUARES_WINDOW_START, + efex.SHORT_SQUARES_WINDOW_END) + + ssq_triple_sweeps = ssq_sweeps['triple'] + + ramp_sweeps = fs.find_ramp_sweeps(sweep_index)['suprathreshold'] + R2R_sweeps = fs.find_ramp_to_rheo_sweeps(sweep_index)['all'] + + noise1_data = load_sweeps(nwb_file, noise1_sweeps, dt, cut, bessel) + noise2_data = load_sweeps(nwb_file, noise2_sweeps, dt, cut, bessel) + + maximum_subthreshold_short_square_sweeps = ssq_sweeps['maximum_subthreshold'] + maximum_subthreshold_short_square_data = load_sweeps(nwb_file, [maximum_subthreshold_short_square_sweeps[0]], dt, cut, bessel) + minimum_suprathreshold_short_square_sweeps = ssq_sweeps['minimum_suprathreshold'] + minimum_suprathreshold_short_square_data = load_sweeps(nwb_file, [minimum_suprathreshold_short_square_sweeps[0]], dt, cut, bessel) + + dt = noise1_data['dt'][0] #getting subsampled dt returned for ease of use + + subthresh_noise_current_list=[] + subthresh_noise_voltage_list=[] + noise_El_list=[] + for ss in range(0, len(noise1_data['current'])): + #--subthreshold noise has first epoch of noise with a region of no stimulation before and after (note the selection of end point is hard coded) + subthresh_noise_current_list.append(noise1_data['current'][ss][noise1_data['start_idx'][ss]:int(6./dt)]) + subthresh_noise_voltage_list.append(noise1_data['voltage'][ss][noise1_data['start_idx'][ss]:int(6./dt)]) + noise_El_list.append(sweep_index[noise1_sweeps[ss]][RESTING_POTENTIAL]*1e-3) + + # Els calculated from QC + El_noise=np.mean(noise_El_list) + El_subthreshold_blip=sweep_index[maximum_subthreshold_short_square_sweeps[0]][RESTING_POTENTIAL]*1e-3 + El_suprathreshold_blip=sweep_index[minimum_suprathreshold_short_square_sweeps[0]][RESTING_POTENTIAL]*1e-3 + + if len(ramp_sweeps): + logging.info('has ramp') + ramp_data = load_sweeps(nwb_file, ramp_sweeps, dt, cut, bessel) + El_ramp=sweep_index[ramp_sweeps[0]][RESTING_POTENTIAL]*1e-3 + else: + ramp_sweeps=None + ramp_data=None + El_ramp=None + logging.info("No ramp") + + if len(ssq_triple_sweeps): + logging.info('has multi ss') + multi_ssq_data = load_sweeps(nwb_file, ssq_triple_sweeps, dt, cut, bessel) + El_multi_ssq_data=sweep_index[ssq_triple_sweeps[0]][RESTING_POTENTIAL]*1e-3 + multi_ssq_dv_cutoff, multi_ssq_thresh_frac = estimate_dv_cutoff(multi_ssq_data['voltage'], dt, + efex.SHORT_SQUARE_TRIPLE_WINDOW_START, + efex.SHORT_SQUARE_TRIPLE_WINDOW_END) + print("*************************") + print("ssq", ssq_dv_cutoff, ssq_thresh_frac) + print("triple",multi_ssq_dv_cutoff, multi_ssq_thresh_frac) + else: + ssq_triple_sweeps=None + multi_ssq_data = None + El_multi_ssq_data = None + logging.info("No multi short square") + + # Needed for MLIN + long_square_config = fs.find_long_square_sweeps(sweep_index) + long_square_sweeps = long_square_config['all'] + subthreshold_long_square_sweeps = long_square_config['subthreshold'] + maximum_subthreshold_long_square_sweeps = long_square_config['maximum_subthreshold'] + #TODO: Here you are loading just one sweep: probably should load all + maximum_subthreshold_long_square_data = load_sweeps(nwb_file, [maximum_subthreshold_long_square_sweeps[0]], dt, cut, bessel) + El_max_subth_long_square=sweep_index[maximum_subthreshold_long_square_sweeps[0]][RESTING_POTENTIAL]*1e-3 + + #--------------------------------------------------------------- + #---------find spiking indicies of spikes in noise-------------- + #--------------------------------------------------------------- + + # note that when using find_spikes_list without removing the testpulse a warning will result from calculating feature_data['base_v'] in the feature extractor (line 375) this not relavent here + noise1_ind_wo_test_pulse_removed, _ = find_spikes_list(noise1_data['voltage'], dt) + noise2_ind_wo_test_pulse_removed, _ = find_spikes_list(noise2_data['voltage'], dt) + #Put all ISI ind in a + ISI_length=np.array([]) + for ii in range(len(noise1_ind_wo_test_pulse_removed)): + ISI_length=np.append(ISI_length,noise1_ind_wo_test_pulse_removed[ii][1:]-noise1_ind_wo_test_pulse_removed[ii][:-1]) + for ii in range(len(noise2_ind_wo_test_pulse_removed)): + ISI_length=np.append(ISI_length,noise2_ind_wo_test_pulse_removed[ii][1:]-noise2_ind_wo_test_pulse_removed[ii][:-1]) + min_ISI_len=np.min(ISI_length) + + + #------------------------------------------------------------------------------------------------------------------- + #---------------------Compute R, C and EL via least squares------------------------------------------------- + #------------------------------------------------------------------------------------------------------------------- + + #--compute R, C, and El via least squares tested in verify_RCEl_GLM_vs_lssq_and_smooth.py + (R_test_list, C_test_list, El_test_list)=least_squares_RCEl_calc_tested(subthresh_noise_voltage_list, subthresh_noise_current_list, dt) + R_test_list_mean=np.mean(R_test_list) + C_test_list_mean=np.mean(C_test_list) + El_test_list_mean=np.mean(El_test_list) + + #----------------------------------------------------------------------------------------- + #------------------------ compute spike cut length---------------------------------------- + #----------------------------------------------------------------------------------------- + + #TODO: I should disentangle this function so I can get rid of the deltaV dependency + (spike_cut_length_NODELTAV, slope_at_min_expVar_list_NODELTAV, intercept_at_min_expVar_list_NODELTAV) \ + = calc_spike_cut_and_v_reset_via_expvar_residuals(noise1_data['current'], noise1_data['voltage'], + dt, El_noise, 0, + max_spike_cut_time=min_ISI_len*dt, + MAKE_PLOT=MAKE_PLOT, + SHOW_PLOT=SHOW_PLOT, + BLOCK=False) + if SAVE_FIG: + tag='spikeCutting_noDeltaV_regression.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path,tag), format='png') + plt.close() + tag='spikeCutting_noDeltaV_spike_wave_form.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path,tag), format='png') + plt.close() + logging.info('spike cut length: %d', spike_cut_length_NODELTAV) + + #----------------------------------------------------------------------------------------- + #------------------------ compute ASC amplitudes------------------------------------------ + #----------------------------------------------------------------------------------------- + + #***Hack: k's are being hard coded into this function and are not necessarily consistent with what is in the setting of AS currents!!! + k_asc_possible=np.array([3, 10., 30., 100., 300.]) + if SHORT_RUN: #THIS IS JUST FOR DEBUGGING SO THAT YOU DONT HAVE TO WAIT FOR THE ENTIRE MODULE TO RUN + (best_k_pair_fit_ascR, best_asc_amp_fit_ascR, best_R_fit_ascR, best_llh_fit_ascR)=ASGLM_pairwise(k_asc_possible, + noise1_data['current'], noise1_data['voltage'], noise1_ind_wo_test_pulse_removed, + C_test_list_mean, C_test_list_mean*R_test_list_mean, spike_cut_length_NODELTAV, dt, El_noise, + SHORT_RUN=True, MAKE_PLOT=MAKE_PLOT, SHOW_PLOT=SHOW_PLOT, BLOCK=False) + asc_amp_from_ASGLM=np.mean(best_asc_amp_fit_ascR, axis=0) + R_from_ASGLM=np.mean(best_R_fit_ascR) + + else: + (best_k_pair_fit_ascR, best_asc_amp_fit_ascR, best_R_fit_ascR, best_llh_fit_ascR)=ASGLM_pairwise(k_asc_possible, + noise1_data['current'], noise1_data['voltage'], noise1_ind_wo_test_pulse_removed, + C_test_list_mean, C_test_list_mean*R_test_list_mean, spike_cut_length_NODELTAV, dt, El_noise, + SHORT_RUN=False, MAKE_PLOT=MAKE_PLOT, SHOW_PLOT=SHOW_PLOT, BLOCK=False) + asc_amp_from_ASGLM=np.mean(best_asc_amp_fit_ascR, axis=0) + R_from_ASGLM=np.mean(best_R_fit_ascR) + + if SAVE_FIG: + tag='GLM_fit_ascR_basis.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path,tag), format='png') + plt.close() + tag='GLM_fit_ascR_sumASC.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path,tag), format='png') + plt.close() + tag='GLM_fit_ascR_individualASC.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path,tag), format='png') + plt.close() + + logging.info('Output of ASC fitting GLM') + logging.info('R out_of_GLM_Rfit_Cfixed %f %s', R_from_ASGLM/1e6, "MOhms") + logging.info('ASC amplitudes at the time of cut spike %s', str(asc_amp_from_ASGLM*1e12)) + logging.info("ks used %s", str(best_k_pair_fit_ascR)) + + #----------------------------------------------------------------------------------------- + #------------------------ calculate thresholds----------------------------------------- + #----------------------------------------------------------------------------------------- + + # ---extract instantaneous threshold from suprathreshold blip + try: + th_inf_via_Vmeasure = find_first_spike_voltage(minimum_suprathreshold_short_square_data['voltage'][0][minimum_suprathreshold_short_square_data['start_idx'][0]:], + dt, + ssq=True, + MAKE_PLOT=MAKE_PLOT, + SHOW_PLOT=SHOW_PLOT, + BLOCK=False, + dv_cutoff=ssq_dv_cutoff, + thresh_frac=ssq_thresh_frac) + th_inf_via_Vmeasure_from0=th_inf_via_Vmeasure-El_suprathreshold_blip + if SAVE_FIG: + tag='th_inf_from_blip.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path, tag), format='png') + plt.close() + except MissingSpikeException as e: + raise MissingSpikeException("The suprathreshold short square sweep must have a spike, but no spike was detected. This means that feature extraction and GLIF spike detection are inconsistent.") + + #----------------------------------------------------------------------------------------------------- + #-----------------find spike and voltage component of the threshold--------------------------- + #----------------------------------------------------------------------------------------------------- + + # If a multishort square stimulus exists calculate spike component of threshold.. + if multi_ssq_data: + (a_spike_component_of_threshold, b_spike_component_of_threshold, + mean_voltage_first_spike_of_blip) = calc_spike_component_of_threshold_from_multiblip(multi_ssq_data, + dt, + multi_ssq_dv_cutoff, + multi_ssq_thresh_frac, + MAKE_PLOT=MAKE_PLOT, + SHOW_PLOT=False, + BLOCK=False, + PUBLICATION_PLOT=False) + #adjust values to be after spike cutting + if a_spike_component_of_threshold is not None and b_spike_component_of_threshold is not None: + a_spike_component_of_threshold=spike_component_of_threshold_exact(a_spike_component_of_threshold, b_spike_component_of_threshold, spike_cut_length_NODELTAV*dt) + + if SAVE_FIG: + tag='multiblip_fit.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path, tag), format='png') + plt.close() + + tag='multiblip_data.png' + tag_plot(tag, fs=9) + plt.savefig(os.path.join(save_figure_path,tag), format='png') + plt.close() + + #---calculate voltage componet of threshold + if a_spike_component_of_threshold is None or b_spike_component_of_threshold is None: + logging.warning("spike component of threshold could not be calculated from the multiblip data") + a_voltage_comp_of_thr_from_fitab=None + b_voltage_comp_of_thr_from_fitab=None + a_voltage_comp_of_thr_from_fitabth=None + b_voltage_comp_of_thr_from_fitabth=None + th_inf_fit_w_v_comp_of_th=None + th_inf_fit_w_v_comp_of_th_from0=None + else: + #TODO:this function needs to be changed to use experimental change of reference + b_voltage_guess = 5.0 + a_voltage_guess = 0.1*b_voltage_guess + fit_ab_vcomp_from_noise = fmin(func=fit_avoltage_bvoltage, + args=(noise1_data['voltage'], + noise_El_list, + spike_cut_length_NODELTAV, + noise1_ind_wo_test_pulse_removed, #NOTE THAT IF YOU WANT TO USE THIS TO GET A VOLTAGE WITHIN THE FUNCTION YOU NEED TO SUBTRACT OFF AND INDICIE BECAUSE THIS IS THE VALUE SET TO NAN AS THE SPIKE WAS INITIATED IN THE PREVIOUS TIME STEP. + th_inf_via_Vmeasure, + dt, + a_spike_component_of_threshold, + b_spike_component_of_threshold), + x0=[a_voltage_guess,b_voltage_guess]) + + a_voltage_comp_of_thr_from_fitab=fit_ab_vcomp_from_noise[0] + b_voltage_comp_of_thr_from_fitab=fit_ab_vcomp_from_noise[1] + + logging.info("spike components %s %s", str(a_spike_component_of_threshold), str(b_spike_component_of_threshold)) + logging.info("voltage components %s %s", str(a_voltage_comp_of_thr_from_fitab), str(b_voltage_comp_of_thr_from_fitab)) + + fit_ab_vcomp_th_from_thr_from_noise = fmin(func=fit_avoltage_bvoltage_th, + args=(noise1_data['voltage'], + noise_El_list, + spike_cut_length_NODELTAV, + noise1_ind_wo_test_pulse_removed, #NOTE THAT IF YOU WANT TO USE THIS TO GET A VOLTAGE WITHIN THE FUNCTION YOU NEED TO SUBTRACT OFF AND INDICIE BECAUSE THIS IS THE VALUE SET TO NAN AS THE SPIKE WAS INITIATED IN THE PREVIOUS TIME STEP. + dt, + a_spike_component_of_threshold, + b_spike_component_of_threshold), + x0=[a_voltage_guess,b_voltage_guess, th_inf_via_Vmeasure]) + + a_voltage_comp_of_thr_from_fitabth=fit_ab_vcomp_th_from_thr_from_noise[0] + b_voltage_comp_of_thr_from_fitabth=fit_ab_vcomp_th_from_thr_from_noise[1] + th_inf_fit_w_v_comp_of_th=fit_ab_vcomp_th_from_thr_from_noise[2] + th_inf_fit_w_v_comp_of_th_from0=th_inf_fit_w_v_comp_of_th-El_noise + logging.info("spike components %s %s", str(a_spike_component_of_threshold), str(b_spike_component_of_threshold)) + logging.info("voltage components %s %s %s %s", str(a_voltage_comp_of_thr_from_fitabth), str(b_voltage_comp_of_thr_from_fitabth), 'fit threshold', str(th_inf_fit_w_v_comp_of_th)) + + + else: + a_spike_component_of_threshold=None + b_spike_component_of_threshold=None + a_voltage_comp_of_thr_from_fitab=None + b_voltage_comp_of_thr_from_fitab=None + a_voltage_comp_of_thr_from_fitabth=None + b_voltage_comp_of_thr_from_fitabth=None + th_inf_fit_w_v_comp_of_th_from0=None + th_inf_fit_w_v_comp_of_th=None + + #-------------------------------------------------------------------------- + #------------------------ MLIN calculations-------------------------------- + #-------------------------------------------------------------------------- + + #TODO: probably want to use more than just one square pulse for this distribution + STLS_voltage=maximum_subthreshold_long_square_data['voltage'][0][maximum_subthreshold_long_square_data['start_idx'][0]:] + STLS_current=maximum_subthreshold_long_square_data['current'][0][maximum_subthreshold_long_square_data['start_idx'][0]:] + (var_of_section, sv_for_expsymm, tau_from_AC)=MLIN(STLS_voltage, STLS_current, R_test_list_mean, C_test_list_mean, dt, + MAKE_PLOT=MAKE_PLOT, + SHOW_PLOT=SHOW_PLOT, + BLOCK=False, + PUBLICATION_PLOT=False) + if SAVE_FIG: + tag='MLIN.png' + tag_plot(tag) + plt.savefig(os.path.join(save_figure_path,tag), format='png') + plt.close() + + #-------------------------------------------------------------------------- + #------------------------ make output dictionaries------------------------- + #-------------------------------------------------------------------------- + + #TODO: find out how many are the max number of all_passing_sweeps. + El_noise_1=[None, None, None, None, None] + WFS_noise_1=[None, None, None, None, None] + RTP_noise_1=[None, None, None, None, None] + sweep_noise_1=[None, None, None, None, None] + spike_ind_noise_1=[None, None, None, None, None] + + def fill_in_lists(out_list, data_list): + '''note since the input is a list shouldnt need to return anything (pass by reference)''' + for ii in range(len(data_list)): + out_list[ii]=data_list[ii] + fill_in_lists(El_noise_1, noise_El_list) + fill_in_lists(sweep_noise_1, noise1_sweeps) + fill_in_lists(spike_ind_noise_1, noise1_ind_wo_test_pulse_removed) + + #--initialize output dictionaries + for_reference_dict={} + for_use_dict={} + + for_reference_dict['dt_used_for_preprocessor_calculations']=dt + #for_reference_dict['optional_methods']=self.optional_methods + for_reference_dict['sweep_properties']={'noise1': + {'1':{'El': El_noise_1[0], 'sweep_num':sweep_noise_1[0], 'spike_ind': spike_ind_noise_1[0]}, + '2':{'El': El_noise_1[1], 'sweep_num':sweep_noise_1[1], 'spike_ind': spike_ind_noise_1[1]}, + '3':{'El': El_noise_1[2], 'sweep_num':sweep_noise_1[2], 'spike_ind': spike_ind_noise_1[2]}, + '4':{'El': El_noise_1[3], 'sweep_num':sweep_noise_1[3], 'spike_ind': spike_ind_noise_1[3]}, + '5':{'El': El_noise_1[4], 'sweep_num':sweep_noise_1[4], 'spike_ind': spike_ind_noise_1[4]}}, + 'ramp': {'sweep_num':ramp_sweeps}, + 'subthreshold_short_square': {'sweep_num':maximum_subthreshold_short_square_sweeps}, + 'suprathreshold_short_square': {'R_testpulsesweep_num':minimum_suprathreshold_short_square_sweeps}, + 'max_subthresh_long_square': {'sweep_num':maximum_subthreshold_long_square_sweeps}, + 'multi_short_square': {'sweep_num':ssq_triple_sweeps}} + + for_reference_dict['El']={'El_noise': {'measured': {'mean':El_noise, 'list':noise_El_list, 'dependencies':None}}, + 'El_ramp': {'value':El_ramp, 'dependencies': None}, + 'El_subthreshold_blip': {'value':El_subthreshold_blip, 'dependencies':None}, + 'El_suprathreshold_blip': {'value':El_suprathreshold_blip, 'dependencies':None}, + 'El_max_subth_long_square': {'value':El_max_subth_long_square, 'dependencies':None}} + + for_reference_dict['resistance']={#'R_lssq_Wrest':{'mean': R_lssq_wrest_mean, 'list': R_lssq_wrest_list, 'dependencies': 'from subthreshold (no spike cutting) noise'}, + 'R_from_lims':{'value':cell_properties['ri']*1e6}, + 'R_test_list': {'mean':R_test_list_mean, 'list': R_test_list}, + 'R_fit_ASC_and_R':{'mean':R_from_ASGLM, 'list': best_R_fit_ascR}} + + for_reference_dict['capacitance']={#'C_lssq_Wrest': {'mean':C_lssq_wrest_mean, 'list':C_lssq_wrest_list, 'dependencies': 'from subthreshold (no spike cutting) noise'}, + 'C_from_lims':{'value': (cell_properties['tau']*1e-3)/(cell_properties['ri']*1e6)}, + 'C_test_list': {'mean':C_test_list_mean, 'list': C_test_list}} + + for_reference_dict['spike_cut_length']={'no deltaV shift':{'length':spike_cut_length_NODELTAV, + 'slope':slope_at_min_expVar_list_NODELTAV, + 'intercept':intercept_at_min_expVar_list_NODELTAV, + 'dependencies':None}} + + for_reference_dict['spike_cutting']={'NOdeltaV': {'cut_length':spike_cut_length_NODELTAV, 'slope':slope_at_min_expVar_list_NODELTAV, 'intercept':intercept_at_min_expVar_list_NODELTAV, 'dependencies': None}} + + for_reference_dict['asc']={'k': best_k_pair_fit_ascR, 'amp':asc_amp_from_ASGLM, 'dependencies': 'Cap and res from least squares'} + + for_reference_dict['th_inf']={'via_Vmeasure':{'value':th_inf_via_Vmeasure, 'from_zero':th_inf_via_Vmeasure_from0, 'dependencies':'measured from suprathreshold blip'}, + 'fit_with_v_comp_of_th':{'value':th_inf_fit_w_v_comp_of_th, 'from_zero':th_inf_fit_w_v_comp_of_th_from0}} + + for_reference_dict['threshold_adaptation']={'a_spike_component_of_threshold':a_spike_component_of_threshold, + 'b_spike_component_of_threshold':b_spike_component_of_threshold, + 'a_voltage_comp_of_thr_from_fitab':a_voltage_comp_of_thr_from_fitab, + 'b_voltage_comp_of_thr_from_fitab':b_voltage_comp_of_thr_from_fitab, + 'a_voltage_comp_of_thr_from_fitabth':a_voltage_comp_of_thr_from_fitabth, + 'b_voltage_comp_of_thr_from_fitabth':b_voltage_comp_of_thr_from_fitabth} + for_reference_dict['MLIN']={'var_of_section':var_of_section, + 'sv_for_expsymm':sv_for_expsymm, + 'tau_from_AC':tau_from_AC} + logging.info("finished") + + return for_reference_dict + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("nwb_file") + parser.add_argument("sweep_list_file") + parser.add_argument("output_json") + parser.add_argument("--dt", default=DEFAULT_DT) + parser.add_argument("--bessel", default=DEFAULT_BESSEL) + parser.add_argument("--cut", default=DEFAULT_CUT) + + args = parser.parse_args() + + sweep_list = ju.read(args.sweep_list_file) + + values = preprocess_neuron(args.nwb_file, sweep_list) + + ju.write(args.output_json, values) + + +if __name__ == "__main__": main() diff --git a/internal/model/glif/rc.py b/internal/model/glif/rc.py new file mode 100644 index 0000000000..ab21fb0def --- /dev/null +++ b/internal/model/glif/rc.py @@ -0,0 +1,50 @@ +import numpy as np +import logging + +from allensdk.internal.model.glif.find_spikes import find_spikes_list + +from allensdk.ephys.extract_cell_features import get_stim_characteristics + +def least_squares_RCEl_calc_tested(voltage_list, current_list, dt): + '''Calculate resistance, capacitance and resting potential by performing + least squares on current and voltage. + + Parameters + ---------- + voltage_list: list of arrays + voltage responses for several sweep repeats + current_list: list of arrays + current injections for several sweep repeats + dt: float + time step size in voltage and current traces + + Returns + ------- + r_list: list of floats + each value corresponds to the resistance of a sweep + c_list: list of floats + each value corresponds to the capacitance of a sweep + el_list: list of floats + each value corresponds to the resting potential of a sweep + ''' + + r_list=[] + c_list=[] + el_list=[] + for voltage, current in zip(voltage_list, current_list): + matrix=np.ones((len(voltage)-1, 3)) + matrix[:,0]=voltage[0:len(voltage)-1] + matrix[:,1]=current[0:len(current)-1] + lsq_non_der_raw=np.linalg.lstsq(matrix, voltage[1:])[0] +# (r_lsq_non_der_raw, c_lsq_non_der_raw, El_lsq_non_der_raw)=RCEL_from_standard_space(lsq_non_der_raw) + + c_lsq_non_der_raw=dt/lsq_non_der_raw[1] + r_lsq_non_der_raw=-lsq_non_der_raw[1]/(lsq_non_der_raw[0]-1) + El_lsq_non_der_raw=-lsq_non_der_raw[2]/(lsq_non_der_raw[0]-1) + r_list.append(r_lsq_non_der_raw) + c_list.append(c_lsq_non_der_raw) + el_list.append(El_lsq_non_der_raw) + + return r_list, c_list, el_list + + diff --git a/internal/model/glif/spike_cutting.py b/internal/model/glif/spike_cutting.py new file mode 100644 index 0000000000..b7ada151c9 --- /dev/null +++ b/internal/model/glif/spike_cutting.py @@ -0,0 +1,219 @@ +import numpy as np +from scipy import stats +from scipy.optimize import curve_fit, fmin +from allensdk.internal.model.glif.find_spikes import align_and_cut_spikes, ALIGN_CUT_WINDOW +import logging + +import matplotlib.pyplot as plt + +def calc_spike_cut_and_v_reset_via_expvar_residuals(all_current_list, + all_voltage_list, dt, El_reference, deltaV, + max_spike_cut_time=False, + MAKE_PLOT=False, SHOW_PLOT=False, PUBLICATION_PLOT=False, BLOCK=False): + '''This function calculates where the spike should be cut based on explained variance. + The goal is to find a model where the voltage after a spike maximally explains the + voltage before a spike. This will also specify the voltage reset rule + inputs: + spike_determination_method: string specifing the method used to find threshold + all_current_list: list of current (list of current traces injected into neuron) + all_voltage_list: list of voltages (list of voltage trace) + The change is that if the slope is greater than one or intercept is greater than zero it forces it. + Regardless of required force the residuals are used. + ''' + + #--find the region of the spike needed for calculation of explained variance + (temp_v_spike_shape_list, all_i_spike_shape_list, all_thresholdInd, waveIndOfFirstSpikes, spikeFromWhichSweep) \ + = align_and_cut_spikes(all_voltage_list, all_current_list, dt) + + #--At this point it is unclear how this calculation should be done. + #--the slope should be fine no matter what, but the intercept dependency + #--will depend on the El, and deltaV + + #--change reference + all_v_spike_shape_list=[shape-El_reference-deltaV for shape in temp_v_spike_shape_list] + + # --setting limits to find explained variance + if max_spike_cut_time and max_spike_cut_time < .010: + expVarIndRangeAfterSpike = range(int(.001 / dt), int(max_spike_cut_time / dt)) #NOTE: THIS IS USED IN REFERENCE TO SPIKE TIME + + else: + expVarIndRangeAfterSpike = range(int(.001 / dt), int(.010 / dt)) #NOTE: THIS IS USED IN REFERENCE TO SPIKE TIME + vectorIndex_of_max_explained_var = expVarIndRangeAfterSpike[0] # this is just here for the title of the plot + list_of_endPointArrays = [] # this should end up a list of numpy arrays where each numpy array contains the indices of the v_spike_shape_list that are a certain time after the threshold + for ii in expVarIndRangeAfterSpike: + list_of_endPointArrays.append(np.array(all_thresholdInd) + ii) + + def line_force_slope_to_1(x,c): + return x+c + + def line_force_int_to_0(x, m): #TODO: CHANGE THIS TO REST TOD DISCONNECT EVERYTHING. + return m*x + +# HERE YOU GET THE SLOPE AND INTERCEPT AT EACH POINT + linRegress_error_4_each_time_end = [] + slope_at_each_time_end=[] + intercept_at_each_time_end=[] + varData_4_each_time_end = [] + varModel_4_each_time_end = [] + chi2 = [] + sum_residuals_4_each_time_end=[] + xdata = np.array([v[all_thresholdInd[ii]] for ii, v in enumerate(all_v_spike_shape_list)]) + var_of_Vdata_beforeSpike = np.var(xdata) + for jj, vectorOfIndAcrossWaves in enumerate(list_of_endPointArrays): # these indices should be in terms of the spike waveforms +# print('jj', jj) + # TODO: Teeter get rid of the nonblipness + v_at_specificEndPoint = [all_v_spike_shape_list[ii][index] for ii, index in enumerate(vectorOfIndAcrossWaves)] # this is calculating variance at certain time points + # --currently the model of voltage reset is a linear regression between voltage before the spike and the voltage after the spike but it could be more complicated (for example as a function of current) + ydata = np.array(v_at_specificEndPoint) # this is the voltage at the specified end point + slope, intercept, r_value, p_value, std_err = stats.linregress(xdata, ydata) + +# print(slope, intercept, r_value, p_value, std_err) + +# if slope>1.0: +# logging.warning('linear regression slope is bigger than one: forcing slope to 1 and refitting intercept.') +# slope=1.0 +# (intercept, nothing)=curve_fit(line_force_slope_to_1, xdata, ydata) +# #print("NEW INTERCEPT:", intercept) +# if intercept>0.0: +# #warnings.warn('/t ... and intercept is bigger than zero: forcing intercept to 0') +# intercept=0.0 +# +# if intercept>0.0: +# logging.warning('Intercept is bigger than zero: forcing intercept to 0 and refitting slope.') +# intercept=0.0 +# (slope, nothing)=curve_fit(line_force_int_to_0,xdata, ydata) +# #print("NEW SLOPE: ", slope) +# if slope>1.0: +# logging.warning('/t ... and linear regression slope is bigger than one: forcing slope to 1.') +# slope=1.0 + + slope_at_each_time_end.append(slope) + intercept_at_each_time_end.append(intercept) + ymodel = slope * xdata + intercept + residuals = ydata - ymodel + sum_residuals=sum(abs(residuals)) + sum_residuals_4_each_time_end.append(sum_residuals) + chi2.append(np.var(residuals)) # how well the model describes the data + linRegress_error_4_each_time_end.append(std_err) + varData_4_each_time_end.append(np.var(v_at_specificEndPoint)) + varModel_4_each_time_end.append(np.var(ymodel)) + + # --these will line up with how many arrays there are in the list + vectorIndex_of_min_sum_residuals = sum_residuals_4_each_time_end.index(min(sum_residuals_4_each_time_end)) + + #----NOTE THIS ISNT ACTUALLY CALCULATING EXPLAINED VARIANCE!!!!!!!!!!!!!!!!!! + vectorIndex_of_max_explained_var=vectorIndex_of_min_sum_residuals + + + all_v_spike_init_list = [v[all_thresholdInd[ii]] for ii, v in enumerate(all_v_spike_shape_list)] +# USE THIS WHEN MUTIPLE VECTORS all_v_at_min_expVar_list=[v[list_of_endPointArrays[vectorIndex_of_max_explained_var][ii]] for ii, v in enumerate(all_v_spike_shape_list)] + all_v_at_min_expVar_list = [v[list_of_endPointArrays[vectorIndex_of_max_explained_var][ii]] for ii, v in enumerate(all_v_spike_shape_list)] + time_at_minExpVar=list_of_endPointArrays[vectorIndex_of_max_explained_var]*dt + if MAKE_PLOT: + truncatedTime = np.arange(0, len(all_v_spike_shape_list[0])) * dt + plt.figure(figsize=(20, 10)) + for ii in range(0, len(all_v_spike_shape_list)): + plt.subplot(2,1,1) + plt.plot(truncatedTime, temp_v_spike_shape_list[ii]) + # plt.plot(truncatedTime[aligned_peakInd[ii]],spikewave[aligned_peakInd[ii]], '.k' + plt.plot(truncatedTime[all_thresholdInd[ii]], temp_v_spike_shape_list[ii][all_thresholdInd[ii]], '*k') + plt.title('Non adusted spikes') + + plt.subplot(2,1,2) + plt.plot(truncatedTime, all_v_spike_shape_list[ii]) + plt.plot(time_at_minExpVar, all_v_at_min_expVar_list, '*k') + plt.xlabel('time (s)', fontsize=20) + plt.ylabel('voltage (mV)', fontsize=20) + plt.title("Adjusted spikes (RP=%.3g, deltaV=%.3g)" % (El_reference,deltaV)) + + if PUBLICATION_PLOT: + truncatedTime = np.arange(0, len(all_v_spike_shape_list[0])) * dt + plt.figure(figsize=(20, 5)) + for ii in range(0, len(all_v_spike_shape_list)): + plt.plot(truncatedTime*1000, temp_v_spike_shape_list[ii]*1e3, lw=2) + # plt.plot(truncatedTime[aligned_peakInd[ii]],spikewave[aligned_peakInd[ii]], '.k' + plt.plot(truncatedTime[all_thresholdInd[ii]]*1000, temp_v_spike_shape_list[ii][all_thresholdInd[ii]]*1e3, '.k', ms=10) +# plt.title('Spike Cutting', fontsize=20) +# plt.subplot(2,1,2) +# plt.plot(truncatedTime, all_v_spike_shape_list[ii]) + plt.plot(time_at_minExpVar*1000, (np.array(all_v_at_min_expVar_list)+El_reference+deltaV)*1.e3, '.k', ms=10) + plt.xlabel('Time (ms)', fontsize=16) + plt.ylabel('Voltage (mV)', fontsize=16) + plt.xlim([0,12]) + plt.tight_layout() +# plt.title("Adjusted spikes (RP=%.3g, deltaV=%.3g)" % (El_reference,deltaV)) + + if SHOW_PLOT: + plt.show(block=BLOCK) + + +# indNotExcluded_In_regress=list(np.setdiff1d(np.array([theInd for theInd in spikeIndDict['nonblip']]), np.array(waveIndOfFirstSpikes))) +# something is wrong with all_v_at_min_expVar_list--look at the difference between starting at .003 and .005 after thresh + if MAKE_PLOT: + plt.figure(figsize=(20, 10)) + plt.plot(all_v_spike_init_list, all_v_at_min_expVar_list, 'b.', ms=16, label='noise') # list of voltage traces for blip + plt.xlabel('voltage at spike initiation (V)', fontsize=20) + plt.ylabel('voltage after spike (V)', fontsize=20) +# plt.title(cellTitle, fontsize=20) + + slope_at_min_expVar_list, intercept_at_min_expVar_list, r_value_at_min_expVar_list, p_value_at_min_expVar_list, std_err_at_min_expVar_list = \ + stats.linregress(np.array(all_v_spike_init_list), np.array(all_v_at_min_expVar_list)) + + print('mean of voltage before spike', np.mean(all_v_spike_init_list)) + print('mean of voltage after spike', np.mean(all_v_at_min_expVar_list)) + + + spike_cut_length= (list_of_endPointArrays[vectorIndex_of_max_explained_var][0])-int(ALIGN_CUT_WINDOW[0]/dt) #note this is dangerous if they arent' all at the same ind + + + if MAKE_PLOT: + xlim = np.array([min(all_v_spike_init_list), max(all_v_spike_init_list)]) + plotLineRegress1(slope_at_min_expVar_list, intercept_at_min_expVar_list, r_value_at_min_expVar_list, xlim) + plt.legend(loc=2, fontsize=20) + + + if MAKE_PLOT: + xlim = np.array([min(all_v_spike_init_list), max(all_v_spike_init_list)]) + plotLineRegressRed(slope_at_each_time_end[vectorIndex_of_max_explained_var], intercept_at_each_time_end[vectorIndex_of_max_explained_var], np.NAN, xlim) + plt.legend(loc=2, fontsize=20) + if SHOW_PLOT: + plt.show(block=BLOCK) + + if PUBLICATION_PLOT: + + plt.figure(figsize=(7, 5)) + plt.plot(np.array(all_v_spike_init_list)*1e3, np.array(all_v_at_min_expVar_list)*1e3, 'b.', ms=16) # list of voltage traces for blip + plt.xlabel('Voltage at spike initiation (mV)', fontsize=16) + plt.ylabel('Voltage after spike (mV)', fontsize=16) +# plt.title('Voltage reset rules', fontsize=20) + xlim = np.array([min(all_v_spike_init_list), max(all_v_spike_init_list)]) + + def plot_hack(slope, intercept, r,xlim): + y=slope*xlim+intercept + plt.plot(xlim, y, '-k', lw=4)# label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept) + + plot_hack(slope_at_min_expVar_list, intercept_at_min_expVar_list*1e3, r_value_at_min_expVar_list, xlim*1e3) + plt.legend(loc=2, fontsize=16) + plt.tight_layout() + plt.show(block=BLOCK) + + #TODO: Corinne look to see if these were calculated with zeroed out El if not does is matter? + if isinstance(slope_at_min_expVar_list, np.ndarray): + slope_at_min_expVar_list=float(slope_at_min_expVar_list[0]) + if isinstance(intercept_at_min_expVar_list, np.ndarray): + intercept_at_min_expVar_list=float(intercept_at_min_expVar_list[0]) + + if type(intercept_at_min_expVar_list)==list or type(intercept_at_min_expVar_list)==np.ndarray: + intercept_at_min_expVar_list=intercept_at_min_expVar_list[0] + + return spike_cut_length, slope_at_min_expVar_list, intercept_at_min_expVar_list + +def plotLineRegress1(slope, intercept, r,xlim): + y=slope*xlim+intercept + print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) + plt.plot(xlim, y, '-k', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) + +def plotLineRegressRed(slope, intercept, r,xlim): + y=slope*xlim+intercept + print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) + plt.plot(xlim, y, '-r', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) diff --git a/internal/model/glif/threshold_adaptation.py b/internal/model/glif/threshold_adaptation.py new file mode 100644 index 0000000000..43fdf401f0 --- /dev/null +++ b/internal/model/glif/threshold_adaptation.py @@ -0,0 +1,649 @@ +import numpy as np +import copy +from scipy.interpolate import interp1d +from scipy.optimize import curve_fit +import matplotlib.pyplot as plt +import logging +THRESH_PCT_MULTIBLIP = 0.05 + +from allensdk.model.glif.glif_neuron_methods import spike_component_of_threshold_exact +from allensdk.internal.model.glif.find_spikes import find_spikes_ssq_list + +def calc_spike_component_of_threshold_from_multiblip(multi_SS, dt, dv_cutoff, thresh_frac, + MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False, PUBLICATION_PLOT=False): + '''Calculate the spike components of the threshold by fitting a decaying exponential function to data to threshold versus time + since last spike in the multiblip data. The exponential is forced to decay to the local th_inf (calculated as the mean all of the + threshold values of the first spikes in each individual triblip stimulus). For each multiblip stimulus in a stimulus set if there + is more than one spike the difference in voltages from the first and second spike are plotted versus the separation in time. Note that + this algorithm should only be implemented on multiblips sweeps where the neuron spike on the first and second blip. Since there is + no easy way to do this, this erroneous data should not be provided to this algorithm (i.e is should be visually checked and eliminated + the preprocessor should hold back this data manually for now.) + + #TODO: check to see if this is still true. Notes: The standard SDK spike detection algorithm does not work with the multiblip stimulus + due to artifacts when the stimulus turns on and off. Please see the find_multiblip_spikes module for more information. + + Input: + + multi_SS: dictionary + contains multiblip information such as current and stimulus + dt: float + time step in seconds + + Returns: + + const_to_add_to_thresh_for_reset: float + amplitude of the exponential fit otherwise known as a_spike. Note that this is without any spike cutting + decay_const: float + decay constant of exponential. Note the function fit is a negative exponential which will mean this value will + either have to be negated when it is used or the functions used will have to have to include the negative. + thresh_inf: float + + ''' + multi_SS_v=multi_SS['voltage'] + multi_SS_i=multi_SS['current'] + + # --get indicies of spikes + spike_ind, _=find_spikes_ssq_list(multi_SS_v, dt, dv_cutoff, thresh_frac) +# spike_ind=find_multiblip_spikes(multi_SS_i, multi_SS_v, dt) can depricate find_multiblip_spikes + + + # eliminate spurious spikes that may exist + spike_lt=[np.where(SI<int(2.0/dt))[0] for SI in spike_ind] + if len(np.concatenate(spike_lt))>0: + logging.warning('there is a spike before the stimulus in the multiblip') + spike_ind=[np.delete(SI,ind)for SI, ind in zip(spike_ind, spike_lt)] + spike_gt=[np.where(SI>int(3.0/dt))[0] for SI in spike_ind] + if len(np.concatenate(spike_gt))>0: + logging.warning('there is a spike after the stimulus in the multiblip') + spike_ind=[np.delete(SI,ind)for SI, ind in zip(spike_ind, spike_gt)] + + # intialize output lists + time_previous_spike=[] + threshold=[] + thresh_first_spike=[] #will set constant to this + + if MAKE_PLOT: + plt.figure(figsize=(20,24)) + + # Loop though each tri blip stimulus in muliblip stimulus + for k in range(0, len(multi_SS_v)): + thresh=[multi_SS_v[k][j] for j in spike_ind[k]] # voltage at all spikes in a single tri blip + if thresh!=[] and len(thresh)>1:# there needs to be more than one spike so that we can find the time difference + thresh_first_spike.append(thresh[0]) #Note that this finds the first spike (it might not be at the first stimulus blip) + threshold.append(thresh[1]) + time_previous_spike.append((spike_ind[k][1]-spike_ind[k][0])*dt) +# Old way when looked at all the spikes instead of just the first two (can be depricated; just here for record keeping) +# threshold.append(thresh[1:]) +# time_before_temp=[] +# for j in range(1,len(thresh)): +# time_before_temp.append((spike_ind[k][j]-spike_ind[k][j-1])*dt) +# #for each spike calculate the time from the previous spike +# time_previous_spike.append(time_before_temp) + if MAKE_PLOT: + plt.subplot(len(multi_SS_v)+1,1,1) + plt.plot(np.arange(0, len(multi_SS_i[k]))*dt, multi_SS_i[k]*1e12, lw=2) + plt.ylabel('current (pA)', fontsize=16) + plt.xlim([2., 2.12]) + plt.title('Triple Short Square', fontsize=20) + plt.subplot(len(multi_SS_v)+1,1,k+2) + plt.plot(np.arange(0, len(multi_SS_v[k]))*dt, multi_SS_v[k], lw=2) + plt.plot(spike_ind[k]*dt, thresh, '.k', ms=16) + plt.xlim([2., 2.12]) + + if MAKE_PLOT: + plt.ylabel('voltage (V)', fontsize=16) + plt.xlabel('time (s)', fontsize=16) + + if SHOW_PLOT: + plt.show(block=False) + + # put numbers into one vector for fitting of exponential function + thresh_inf=np.mean(thresh_first_spike) #note this threshold infinity isnt the one coming from single blip + try: #this try here because sometimes even though have the traces there isnt more than one trace with two spikes +#--these two lines no longer needed because all single values now (depricate with lines up above) instead converst them to arrays +# threshold=np.concatenate(threshold) +# time_previous_spike=np.concatenate(time_previous_spike) #note that this will have nans in it + threshold=np.array(threshold) + time_previous_spike=np.array(time_previous_spike) #note that this will have nans in it + + if MAKE_PLOT: + plt.figure() + plt.plot(time_previous_spike, threshold, '.k', ms=16) + plt.ylabel('threshold (mV)') + plt.xlabel('time since last spike (s)') + + # calculate values of exponential function both if force function to local threshold infinity and not forcing to a value + # (not forcing to a value seems less valid unless a bunch of points are added corresponding to the threshold of the + # first spike at time equal infinity (because the first spike is a spike that happens where the spike before it was an + # infinite time away)). Therefore, the values that are obtained from forcing are the ones that are used. + p0_force=[.002, -100.] + p0_fit=[.002, -100., thresh_inf] + + #TODO: THIS WOULD BE BETTER IF IT CALLED THE ACTUAL FUNCTION IN THE NEURON METHODS THAT WAY THEY WOULD HAVE TO BE THE SAME + (popt_force, pcov_force)= curve_fit(exp_force_c, (time_previous_spike, thresh_inf), threshold, p0=p0_force, maxfev=100000) + (popt_fit, pcov_fit)= curve_fit(exp_fit_c, time_previous_spike, threshold, p0=p0_fit, maxfev=100000) + + # viewing fit functions + time_previous_spike.sort() #since time is not in order, making new time vector so that obtained fit curve can be plotted + fit_force=exp_force_c((time_previous_spike, thresh_inf), popt_force[0], popt_force[1]) + fit_fit=exp_fit_c(time_previous_spike, popt_fit[0], popt_fit[1], popt_fit[2]) + if MAKE_PLOT: + plt.plot(time_previous_spike, fit_force, 'r', lw=4, label="exp fit (force const to thesh first spike)\n k=%.3g, amp=%.3g" % (popt_force[1], popt_force[0])) + plt.plot(time_previous_spike, fit_fit, 'b', lw=4, label="exp fit (fit constant)\n k=%.3g, amp=%.3g" % (popt_fit[1], popt_fit[0])) + plt.legend() + if SHOW_PLOT: + plt.show(block=False) + + if PUBLICATION_PLOT: + plt.figure(figsize=[14, 5]) + ax1=plt.subplot2grid((2, 2), (0,0)) + ax2=plt.subplot2grid((2, 2), (1,0)) + ax3=plt.subplot2grid((2, 2), (0,1), rowspan=2) + for k in range(0, len(multi_SS_v)): + thresh=[multi_SS_v[k][j] for j in spike_ind[k]] + + ax1.plot(np.arange(0, len(multi_SS_i[k]))*dt, multi_SS_i[k]*1.e12, lw=2) + ax1.set_ylabel('Current (pA)', fontsize=16) + ax1.set_xlim([2., 2.12]) + ax1.axes.xaxis.set_ticklabels([]) + #ax1.set_title('Triple Short Square', fontsize=20) + + ax2.plot(np.arange(0, len(multi_SS_v[k]))*dt, multi_SS_v[k]*1.e3, lw=2) + ax2.plot(spike_ind[k]*dt, np.array(thresh)*1.e3, '.k', ms=16) + ax2.set_ylabel('Voltage (mV)', fontsize=16) + ax2.set_xlabel('Time (ms)', fontsize=16) + ax2.set_xlim([2., 2.12]) + + + ax3.plot(time_previous_spike, np.array(threshold)*1.e3, '.k', ms=16) + ax3.set_ylabel('Threshold (mV)', fontsize=16) + ax3.set_xlabel('Time since last spike (s)', fontsize=16) +# ax3.set_title('Spiking component of threshold', fontsize=20) + ax3.plot(time_previous_spike, fit_force*1.e3, 'r', lw=4)#, label="exp fit: k=%.3g, amp=%.3g" % (popt_force[1], popt_force[0])) + ax3.legend() + plt.tight_layout() + plt.show() + + const_to_add_to_thresh_for_reset=popt_force[0] + decay_const=popt_force[1] + + if decay_const >0: + logging.critical('This neuron has an increasing decay value for the spike component of the threshold') + if const_to_add_to_thresh_for_reset<0: + logging.critical('This neuron has a negative amplitude for the spike component of the threshold') + + #if the decay constant is positive, or the amplitute is negative set the amplitude to 0 so that there + #will be no spike component of the threshold + if decay_const >0 or const_to_add_to_thresh_for_reset < 0: + const_to_add_to_thresh_for_reset=0 + decay=-1.0 #note that this number doesnt matter since the amplitude is set to zero + + # This decay constant was originally forced to be positive (i.e. decay_const=abs(popt_force[1])) + # and then it is negated everywhere it is utilized elsewhere in the code. Now things are forced in + # a different way above. However the decay constant still needs to be negated here for use in the + # rest of the code. + decay_const=-decay_const + + + except Exception as e: + logging.error(e.message) + const_to_add_to_thresh_for_reset=None + decay_const=None + + return const_to_add_to_thresh_for_reset, decay_const, thresh_inf + +def fit_avoltage_bvoltage(x, v_trace_list, El_list, spike_cut_length, all_spikeInd_list, th_inf, dt, a_spike, + b_spike, fake=False): + '''This is a version of fit_avoltage_bvoltage_debug that does not require the th_trace, + v_component_of_thresh_trace, and spike_component_of_thresh_trace needed for debugging. A + test should be run to make sure the same output comes out from this and the debug function + + This function returns the squared error for the difference between the 'known' voltage + component of the threshold obtained from the biological neuron and the voltage component + of the threshold of the model obtained with the input parameters (so that the minimum can be + searched for via fmin). The overall threshold is the sum of threshold infinity the spike component + of the threshold and the voltage component of the threshold. Therefore threshold infinity and + the spike component of the threshold must be subtracted from the threshold of the neuron in order + to isolate the voltage component of the threshold. In the evaluation of the model the actual + voltage of the neuron is used so that any errors in the other components of the model will not + influence the fits here (for example, if a afterspike current was estimated incorrectly) + + Notes: + * The spike component of the threshold is subtracted from the + voltage which means that the voltage component of the threshold should only be added to rules. + * b_spike was fit using a negative value in the function therefore the negative is placed in the + equation. + * values in this function are in 'real' voltage as opposed to voltage + relative to resting potential. + * current injection during the spike is not taken into account. This seems reasonable as the + ion channels are open during this time and injected current may not greatly influence the neuron. + + x: numpy array + x[0]=a_voltage input, x[1] is b_voltage_input, x[2] is th_inf + v_trace_list: list of numpy arrays + voltage traces (v_trace, El, and th_inf must be in the same frame of reference) + El_list: list of floats + reversal potential (v_trace, El, and th_inf must be in the same frame of reference) + spike_cut_length: int + number of indicies removed after initiation of a spike + all_spikeInd_list: list of numpy arrays + indicies of spike trains + th_inf: float + threshold infinity (v_trace, El, and th_inf must be in the same frame of reference) + dt: float + size of time step (SI units) + a_spike: float + amplitude of spike component of threshold. + b_spike: float + decay constant in spike component of the threshold + fake: Boolean + if True makes uses the voltage value of spike step-1 because there is not a voltage value at the spike + step because it is set to nan in the simulator. + ''' + a_voltage=x[0] + b_voltage=x[1] + + total_err=0 + for v_trace, El, all_spikeInd in zip(v_trace_list, El_list, all_spikeInd_list): + # Calculate values along the whole trace and then take the values at the spike ind + internal_sp_comp_array=np.zeros(all_spikeInd[0]+spike_cut_length) + left_over=0 + #vector of spike component of of the threshold from each spike and previous spikes; note at first spike there is no spike component of threshold so initialized at zero + #Note that care has to be taken here to get make sure the right amount of decay is left over + for spike_number in range(1,len(all_spikeInd)): #skipping first spike since no residual spike component of threshold + integration_length=all_spikeInd[spike_number]-all_spikeInd[spike_number-1]+1 #this is the amount of time that needs to be integrated over note that it is one longer than the interval because of the last value is added to the aspike for the next ISI + local_spike_comp_of_threshold=spike_component_of_threshold_exact(a_spike+left_over, b_spike, np.arange(integration_length)*dt) + internal_sp_comp_array=np.append(internal_sp_comp_array, local_spike_comp_of_threshold[:-1]) + left_over=local_spike_comp_of_threshold[-1] + + # Compute voltage component of threshold at biological spike (subtract th_inf and spike component of threshold + # from biological voltage values at spike initiation) + #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + # NOTE THAT THERE IS AN ISSUE HERE USING FAKE DATA. THE -1 IS HERE BECAUSE THE NEURON CROSSES THRESHOLD SOMETIME BETWEEN TWO INDICIES. + # FOR THE FAKE DATA THE TIME OF THE SPIKE (THE POINT FOLLOWING WHEN THE VOLTAGE CROSSES THRESHOLD) IS SET TO NAN. + # THE INTERPOLATED VOLTAGE CAN BE USED BUT THEN THE INTERPOLATED VOLTAGE MUST BE CALCULATED FOR THE TRUE VOLTAGE + # TRACE AND POSSIBLY IN THE INTEGRATION. + if fake: + v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd-1]-internal_sp_comp_array[all_spikeInd-1]-th_inf #USE THIS FOR FAKE DATA + else: + v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd]-internal_sp_comp_array[all_spikeInd]-th_inf #USE THIS FOR REAL DATA (although probably not necessary) + #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + # For each ISI, calculate the difference between the voltage dependent component of the threshold + # and the value that would be determined via a model that uses the actual voltage of neuron. + sq_err = [] #list to store squared error between the model and biological threshold + for spike_number in range(1, len(all_spikeInd)): #loop over all ISI's in data + v_start_ind = all_spikeInd[spike_number-1]+int(spike_cut_length) #dont want to use voltage during a spike + end_ind = all_spikeInd[spike_number] + v_in_ISI=v_trace[v_start_ind:end_ind] + #voltage component of threshold at the beginning and end of the ISI + #With fake data if go from one before fake data to fake data this should be exact + theta0=v_comp_of_th_at_each_spike_via_data[spike_number-1] #this assumes that the voltage component of the threshold does not change over the time period of the spike + # not sure this makes sense any moretheta0=v_comp_of_th_at_each_spike_via_data[spike_number-1]+sp_comp_of_offset_at_spike_list[spike_number-1] #use this is you want to add the biological component back on + theta1=v_comp_of_th_at_each_spike_via_data[spike_number] + tvec=np.arange(len(v_in_ISI))*dt + + #analytical solution should be exact with fake data--small differences could be because of the differences in the voltage at + #spike indicies are off by one + model=+theta0*np.exp(-b_voltage*dt*(end_ind-v_start_ind))+a_voltage*np.exp(-b_voltage*tvec[-1])*np.sum(dt*(v_in_ISI-El)*np.exp(b_voltage*tvec)) + err = (theta1-model)**2 + if ~np.isnan(err): + sq_err.append(err) + + total_err+=np.sum(sq_err) + return total_err + +def fit_avoltage_bvoltage_th(x, v_trace_list, El_list, spike_cut_length, all_spikeInd_list, dt, a_spike, + b_spike, fake=False): + '''This is a version of fit_avoltage_bvoltage_th_debug that does not require the th_trace, + v_component_of_thresh_trace, and spike_component_of_thresh_trace needed for debugging. A + test should be run to make sure the same output comes out from this and the debug function + + This function returns the squared error for the difference between the 'known' voltage + component of the threshold obtained from the biological neuron and the voltage component + of the threshold of the model obtained with the input parameters (so that the minimum can be + searched for via fmin). The overall threshold is the sum of threshold infinity the spike component + of the threshold and the voltage component of the threshold. Therefore threshold infinity and + the spike component of the threshold must be subtracted from the threshold of the neuron in order + to isolate the voltage component of the threshold. In the evaluation of the model the actual + voltage of the neuron is used so that any errors in the other components of the model will not + influence the fits here (for example, if a afterspike current was estimated incorrectly) + + Notes: + * The spike component of the threshold is subtracted from the + voltage which means that the voltage component of the threshold should only be added to rules. + * b_spike was fit using a negative value in the function therefore the negative is placed in the + equation. + * values in this function are in 'real' voltage as opposed to voltage + relative to resting potential. + * current injection during the spike is not taken into account. This seems reasonable as the + ion channels are open during this time and injected current may not greatly influence the neuron. + + x: numpy array + x[0]=a_voltage input, x[1] is b_voltage_input, x[2] is th_inf + v_trace_list: list of numpy arrays + voltage traces (v_trace, El, and th_inf must be in the same frame of reference) + El_list: list of floats + reversal potential (v_trace, El, and th_inf must be in the same frame of reference) + spike_cut_length: int + number of indicies removed after initiation of a spike + all_spikeInd_list: list of numpy arrays + indicies of spike trains + dt: float + size of time step (SI units) + a_spike: float + amplitude of spike component of threshold. + b_spike: float + decay constant in spike component of the threshold + fake: Boolean + if True makes uses the voltage value of spike step-1 because there is not a voltage value at the spike + step because it is set to nan in the simulator. + ''' + a_voltage=x[0] + b_voltage=x[1] + th_inf=x[2] + + total_err=0 + for v_trace, El, all_spikeInd in zip(v_trace_list, El_list, all_spikeInd_list): + # Calculate values along the whole trace and then take the values at the spike ind + internal_sp_comp_array=np.zeros(all_spikeInd[0]+spike_cut_length) + left_over=0 + #vector of spike component of of the threshold from each spike and previous spikes; note at first spike there is no spike component of threshold so initialized at zero + #Note that care has to be taken here to get make sure the right amount of decay is left over + for spike_number in range(1,len(all_spikeInd)): #skipping first spike since no residual spike component of threshold + integration_length=all_spikeInd[spike_number]-all_spikeInd[spike_number-1]+1 #this is the amount of time that needs to be integrated over note that it is one longer than the interval because of the last value is added to the aspike for the next ISI + local_spike_comp_of_threshold=spike_component_of_threshold_exact(a_spike+left_over, b_spike, np.arange(integration_length)*dt) + internal_sp_comp_array=np.append(internal_sp_comp_array, local_spike_comp_of_threshold[:-1]) + left_over=local_spike_comp_of_threshold[-1] + + # Compute voltage component of threshold at biological spike (subtract th_inf and spike component of threshold + # from biological voltage values at spike initiation) + #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + # NOTE THAT THERE IS AN ISSUE HERE USING FAKE DATA. THE -1 IS HERE BECAUSE THE NEURON CROSSES THRESHOLD SOMETIME BETWEEN TWO INDICIES. + # FOR THE FAKE DATA THE TIME OF THE SPIKE (THE POINT FOLLOWING WHEN THE VOLTAGE CROSSES THRESHOLD) IS SET TO NAN. + # THE INTERPOLATED VOLTAGE CAN BE USED BUT THEN THE INTERPOLATED VOLTAGE MUST BE CALCULATED FOR THE TRUE VOLTAGE + # TRACE AND POSSIBLY IN THE INTEGRATION. + if fake: + v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd-1]-internal_sp_comp_array[all_spikeInd-1]-th_inf #USE THIS FOR FAKE DATA + else: + v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd]-internal_sp_comp_array[all_spikeInd]-th_inf #USE THIS FOR REAL DATA (although probably not necessary) + #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + # For each ISI, calculate the difference between the voltage dependent component of the threshold + # and the value that would be determined via a model that uses the actual voltage of neuron. + sq_err = [] #list to store squared error between the model and biological threshold + for spike_number in range(1, len(all_spikeInd)): #loop over all ISI's in data + v_start_ind = all_spikeInd[spike_number-1]+int(spike_cut_length) #dont want to use voltage during a spike + end_ind = all_spikeInd[spike_number] + v_in_ISI=v_trace[v_start_ind:end_ind] + #voltage component of threshold at the beginning and end of the ISI + #With fake data if go from one before fake data to fake data this should be exact + theta0=v_comp_of_th_at_each_spike_via_data[spike_number-1] #this assumes that the voltage component of the threshold does not change over the time period of the spike + # not sure this makes sense any moretheta0=v_comp_of_th_at_each_spike_via_data[spike_number-1]+sp_comp_of_offset_at_spike_list[spike_number-1] #use this is you want to add the biological component back on + theta1=v_comp_of_th_at_each_spike_via_data[spike_number] + tvec=np.arange(len(v_in_ISI))*dt + + #analytical solution should be exact with fake data--small differences could be because of the differences in the voltage at + #spike indicies are off by one + model=+theta0*np.exp(-b_voltage*dt*(end_ind-v_start_ind))+a_voltage*np.exp(-b_voltage*tvec[-1])*np.sum(dt*(v_in_ISI-El)*np.exp(b_voltage*tvec)) + err = (theta1-model)**2 + if ~np.isnan(err): + sq_err.append(err) + + total_err+=np.sum(sq_err) + return total_err + + +#TODO: depricate confirmed use of fit_avoltage_bvoltage_th +#def err_fix_th(x, v_trace, El, spike_cut_length, all_spikeInd, th_inf, dt, a_spike, b_spike): +# '''This function returns the squared error for the difference between the 'known' voltage +# component of the threshold obtained from the biological neuron and the voltage component +# of the threshold of the model obtained with the input parameters (so that the minimum can be +# searched for via fmin). The overall threshold is the sum of threshold infinity the spike component +# of the threshold and the voltage component of the threshold. Therefore threshold infinity and +# the spike component of the threshold must be subtracted from the threshold of the neuron in order +# to isolate the voltage component of the threshold. In the evaluation of the model the actual +# voltage of the neuron is used so that any errors in the other components of the model will not +# influence the fits here (for example if a afterspike current was estimated incorrectly) +# +# Notes: +# * The spike component of the threshold is subtracted from the +# voltage which means that the voltage component of the threshold should only be added to rules. +# * b_spike was fit using a negative value in the function therefore the negative is placed in the +# equation. +# * values in this function are in 'real' voltage as opposed to voltage +# relative to resting potential. +# * current injection during the spike is not taken into account. This seems reasonable as the +# ion channels are open during this time and injected current may not greatly influence the neuron. +# +# x: numpy array +# x[0]=a_voltage input, x[1] is b_voltage_input +# voltage: numpy array +# voltage trace (voltage, El, and th_inf must be in the same frame of reference) +# El: float +# reversal potential (voltage, El, and th_inf must be in the same frame of reference) +# spike_cut_length: int +# number of indicies removed after initiation of a spike +# all_spikeInd: numpy array +# indicies of spike train +# th_inf: float +# threshold infinity (voltage, El, and th_inf must be in the same frame of reference) +# dt: float +# size of time step (SI units) +# a_spike: float +# amplitude of spike component of threshold. +# b_spike: float +# decay constant in spike component of the threshold +# ''' +# a_voltage=x[0] +# b_voltage=x[1] +# # effect of the spike component of the threshold from each spike and previous spikes +# sp_comp_of_offset_sum_vector=[0] #vector of spike component of of the threshold from each spike and previous spikes; note at first spike there is no spike component of threshold so initialized at zero +# for spike_number in range(1,len(all_spikeInd)): #skipping first spike since no residual spike component of threshold +# t=(all_spikeInd[spike_number]-all_spikeInd[spike_number-1]-spike_cut_length)*dt #spike ISI +# sp_comp_of_th_offset_local = spike_component_of_threshold_exact(a_spike, b_spike, t) #spike component of threshold at each ISI for each individual spike +# #I THINK THE LINE BELOW MIGHT JUST BE WRONG BECAUSE THE OLD OFF SET WOULD DECAY AND I DONT THINK IT IS HERE:THIS IS WHAT IS BEING USED +## sp_comp_of_offset_sum_vector.append(sp_comp_of_offset_sum_vector[-1] + sp_comp_of_th_offset_local) #keeping track of residual spike component of threshold at each spike +# left_over_decay=spike_component_of_threshold_exact(sp_comp_of_offset_sum_vector[-1], b_spike, t) +# sp_comp_of_offset_sum_vector.append(left_over_decay + sp_comp_of_th_offset_local) #keeping track of spike component of threshold with residuals at each spike +# +# +# # Compute v_trace component of threshold at biological spike (subtract th_inf and spike component of threshold +# # from biological v_trace values at spike initiation) +# #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# # NOTE THAT THERE IS AN ISSUE HERE USING FAKE DATA. THE -1 IS HERE BECAUSE THE NEURON CROSSES THRESHOLD SOMETIME BETWEEN TWO INDICIES. +# # FOR THE FAKE DATA THE TIME OF THE SPIKE (THE POINT FOLLOWING WHEN THE VOLTAGE CROSSES THRESHOLD) IS SET TO NAN. +# # THE INTERPOLATED VOLTAGE CAN BE USED BUT THEN THE INTERPOLATED VOLTAGE MUST BE CALCULATED FOR THE TRUE VOLTAGE +# # TRACE AND POSSIBLY IN THE INTEGRATION. +# v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd-1]-np.array(sp_comp_of_offset_sum_vector)-th_inf #USE THIS FOR FAKE DATA +## v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd]-np.array(sp_comp_of_offset_sum_vector)-th_inf #THIS IS PROBABLY APPROPRIATE FOR REAL DATA +# #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# # For each ISI, calculate the difference between the v_trace dependent component of the threshold +# # and the value that would be determined via a model that uses the actual v_trace of neuron. +# sq_err = [] #list to store squared error between the model and biological threshold +# for spike_number in range(1, len(all_spikeInd)): #loop over all ISI's in data +# v_start_ind = all_spikeInd[spike_number-1]+int(spike_cut_length) #dont want to use voltage during a spike +# end_ind = all_spikeInd[spike_number] +# v_in_ISI=v_trace[v_start_ind:end_ind] +# #v_trace component of threshold at the beginning and end of the ISI +# +# theta0=v_comp_of_th_at_each_spike_via_data[spike_number-1] #this assumes that the voltage component of the threshold does not change over the time period of the spike +# # not sure this makes sense any moretheta0=v_comp_of_th_at_each_spike_via_data[spike_number-1]+sp_comp_of_offset_sum_vector[spike_number-1] #use this is you want to add the biological component back on +# theta1=v_comp_of_th_at_each_spike_via_data[spike_number] +# tvec=np.arange(len(v_in_ISI))*dt +# +# #need to prove this--NOTE THAT THIS SHOULD BE EXACT DURING FAKE DATA--DIFFERENCES COULD BE DUE TO GETTING VALUES AT DIFFERENT INDICIES +# model=+theta0*np.exp(-b_voltage*dt*(end_ind-v_start_ind))+a_voltage*np.exp(-b_voltage*tvec[-1])*np.sum(dt*(v_in_ISI-El)*np.exp(b_voltage*tvec)) +# err = (theta1-model)**2 +# if ~np.isnan(err): +# sq_err.append(err) +# +# return np.sum(sq_err) + +# TODO: can depricate, using sdk now +#def find_multiblip_spikes(multi_SS_i, multi_SS_v, dt): +# '''artifacts caused by turning stimulus on and off created artifacts that +# created problems for the standard spike detection algorithm. Several alterations +# were made so that the algorithm would detect spikes appropriately. Please see multiblip +# spike cutting documentation for more information on how the code differs from the SDK +# version and what was needed to solve specific issues. +# input: +# multi_SS_i: list of arrays +# each array corresponds to the current stimulation of one triblip stimulus +# multi_SS_v: list of arrays +# each array corresponds to the voltage trace of triblip simulus +# dt: float +# ''' +# artifact_ave_window_time_s=0.0003 # +# window_indicies_to_ave_len=int(artifact_ave_window_time_s/dt) +# out_spk_idxs_list=[] +# for current, voltage in zip(multi_SS_i, multi_SS_v): +# #--Find the beginning and end of stimuli so that we can average the voltage traces at that time +# up_blip_index=np.where(np.diff(np.greater_equal(current, 1e-10).astype(int)) == 1)[0]#Note 1e-10 is larger than test pulse so it will not pick up test pulse +# down_blip_index=np.where(np.diff(np.less_equal(current, 1e-10).astype(int)) == 1)[0] +# potential_artifact_indexes=np.sort(np.append(up_blip_index, down_blip_index)) +# artifact_removed_voltage=copy.deepcopy(voltage) +# window_boarders_index=[] +# #--remove artifacts +# for index in potential_artifact_indexes: +# smooth_window=range(index,index+window_indicies_to_ave_len+1) +# +# # interpolate in the smoothing window +# blah=interp1d([smooth_window[0], smooth_window[-1]], [artifact_removed_voltage[smooth_window[0]], artifact_removed_voltage[smooth_window[-1]]]) +# artifact_removed_voltage[smooth_window]=blah(smooth_window) +# +# #windows boarders are just for plotting +## window_boarders_index.append(smooth_window[0]) +## window_boarders_index.append(smooth_window[-1]) +## plt.figure() +## plt.plot(voltage, 'b', lw=4) +## plt.plot(artifact_removed_voltage, 'r', lw=2) +## plt.plot(window_boarders_index, artifact_removed_voltage[window_boarders_index], '|g', ms=10) +## plt.xlim([40400, 41000]) +## plt.show() +## +## t = np.arange(0, len()) * dt +# +# # keeping the smooth_v convention of the SDK find spike code. However in the SDK code +# # this is used to name data potentially smoothed by a bessel filter +# smooth_v = artifact_removed_voltage +# dv = np.diff(smooth_v) +# dvdt = dv / dt +# dvv = np.diff(dvdt) +# +# v=smooth_v[:-1] #truncating the end of v so it has the same dimensions as dvdt for time plotting +# +# spikes = [] +# out_spk_idxs = [] +# +# peaks=get_peaks(v) # find potential spikes by finding peak over zero mv +# +# # Etay defines spike as time of threshold crossing. Threshold is defined as the time at which dvdt is some percent of maximum threshold. +# # TODO: figure out how maximum threshold is defined in original code so I can say why I don't use it +# for spk_n, peak_idx in enumerate(peaks): +# #---------find spike peak---------------------------- +# spk = {} +# +# spk["peak_idx"] = peak_idx +# upstroke_idx = np.argmax(dvdt[peak_idx-int(.001/dt):peak_idx]) + peak_idx-int(.001/dt) +# spk["upstroke"] = dvdt[upstroke_idx] +# spk["upstroke_idx"] = upstroke_idx +# spk["upstroke_v"] = v[upstroke_idx] +# +# # Define threshold where dvdt = 5% * max upstroke +# dvdt_thr_target = THRESH_PCT_MULTIBLIP * spk["upstroke"] +# #print 'spk[upstroke]', spk["upstroke"], 'dvdt_thr_target', dvdt_thr_target +# prev_idx = peak_idx-int(.0035/dt) +# #check to make sure prev_idx is not before or in a window where the stimulus blip comes on because +# #it will errorniously trip the threshold dvdt +# for index in up_blip_index: +# if prev_idx<=index+int(.0005/dt) and prev_idx>= index-int(.0035/dt): +# prev_idx=index+int(.0005/dt) +# +# mean_dvv= [np.mean(dvv[pv-2:pv+3]) for pv in range(prev_idx,upstroke_idx)] #makes sure dv2/dt2 isnt spuriously going down by averaging 5 points +# find_thresh_idxs = np.where(np.logical_and(dvdt[prev_idx:upstroke_idx] >= dvdt_thr_target, np.greater(mean_dvv,0)))[0] +# +# if len(find_thresh_idxs) < 1: # Can't find a good threshold value - probably a bad simulation case +# # Fall back to the upstroke value +# threshold_idx = upstroke_idx +# else: +# threshold_idx = find_thresh_idxs[0] + prev_idx +# +# spk["threshold_idx"] = threshold_idx +# spk["threshold_v"] = v[threshold_idx] +# +# # Check for things that are probably not spikes: +# +# # if the "spike" is less than 2 mV from threshold to peak, don't count it +# if v[peak_idx] - v[threshold_idx] < 0.002: +# print("\tnot counting spike is closer to peak than 2 mV") +# continue +# +# #NOTE: because threshold doesnt decay to zero in the multiblip this doesnt get rid of the situation that usually is only in the first spike of a stimulus +# # if the spike is less the -30mV, don't count it +# if v[peak_idx] < -0.04: +# print("\tnot counting spike: peak is too small") +# continue +# +# spikes.append(spk) +# +# #----figure out if I should still find a global threshold and then do it all again +# # # find global threshold which is an average of the individual thresholds +# # if len(spikes) > 0: +# # dvdt_thr_target = np.array([spk["upstroke"] for spk in spikes]).mean() * THRESH_PCT_MULTIBLIP +# # else: # if there weren't any spikes, move along +# # return np.array([]) +# +# out_spk_idxs.append(spk["threshold_idx"]) +# +# out_spk_idxs_list.append(np.array(out_spk_idxs)) +# +## time_vector=np.arange(len(v))*dt +## plt.figure() +## # plt.subplot(3,1,1) +## # plt.plot(time_vector, ddv) +## # plt.plot(time_vector[out_spk_idxs], ddv[out_spk_idxs], '.r', ms=16) +## # plt.xlim([40300, 42000]) +## # plt.ylabel('ddv') +## plt.subplot(2,1,1) +## plt.plot(time_vector, dvdt) +## plt.plot(time_vector[out_spk_idxs], dvdt[out_spk_idxs], '.r', ms=16) +## plt.plot(time_vector[potential_artifact_indexes], dvdt[potential_artifact_indexes], 'b|', ms=24, lw=4) +## plt.xlim([40300*dt, 42000*dt]) +## plt.ylabel('dvdt') +## plt.subplot(2,1,2) +## plt.plot(time_vector, v) +## plt.plot(time_vector[out_spk_idxs], v[out_spk_idxs], 'r.', ms=16, label='threshold') +## plt.xlim([40300*dt, 42000*dt]) +## plt.ylabel('voltage (V)') +## plt.plot(time_vector[peaks], v[peaks], '.g', ms=16, label='peaks') +## plt.plot(time_vector[[spikes[ii]['upstroke_idx'] for ii in range(len(spikes))]], [spikes[ii]['upstroke_v'] for ii in range(len(spikes))], '.c', ms=16, label = 'max upstroke') +## plt.plot(time_vector[potential_artifact_indexes], v[potential_artifact_indexes], 'b|', ms=24, lw=4) +## plt.legend() +## plt.show() +# +# return out_spk_idxs_list + +def get_peaks(voltage, aboveValue=0): + '''This function was written by Corinne Teeter and calculates the action potential peaks of a voltage equation" + inputs + voltage: numpy array of voltages + aboveValue: scalar voltage value over which voltage is considered a spike. + outputs: + peakInd: array of indicies of peaks''' + VshiftR=np.concatenate(([0], voltage[0:voltage.size-2])) + VshiftL=voltage[1:voltage.size] + IndShiftR=np.where(voltage[0:voltage.size-1]>VshiftR) + IndShiftL=np.where(voltage[0:voltage.size-1]>VshiftL) + greatThanThresh=np.where(voltage>aboveValue) #finds indicies greater than the value provided + peakInd=np.intersect1d(np.intersect1d(IndShiftL[0], IndShiftR[0]), greatThanThresh[0]) #find the indicies of the peak + return peakInd + +def exp_force_c(t_const, a1, k1): + (t, const) = t_const + return a1*(np.exp(k1*t))+const + +def exp_fit_c(t, a1, k1, const): + return a1*(np.exp(k1*t))+const + diff --git a/internal/morphology/__init__.py b/internal/morphology/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/morphology/__pycache__/__init__.cpython-37.pyc b/internal/morphology/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f12ac12cabd8d7f1e76adb5464661e76c5131010 GIT binary patch literal 196 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r|Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^NR{H@^kXjEA`{!GxIV_;^XxSDsOSv<mRW8 N=A_zzobefm835O<I2r%| literal 0 HcmV?d00001 diff --git a/internal/morphology/__pycache__/compartment.cpython-37.pyc b/internal/morphology/__pycache__/compartment.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16624885f8a68a5eb73e5250fc29d36d9faba17d GIT binary patch literal 1027 zcmY*XPjAyO6t|r}OS=uhHnB-?2!|aiK_}P&gb*4`h|A~&xI~pKFZSAOi5=_|)T$g{ z`yiV*@s)Dr#8=?NdkNi&Bmewf-e13;U$3us2`v5No9G0D{6b~1d=L&`yN3XhNSc#^ zGD1ng8uSv6lD9-M>0J=%DgWF{0!iPKp8p#n$RI^rEC#{>Y<C|(k%UT;Fi9o5Ac-eE z>BH&E0HVWs_0SZhuvMXSm3rWh3r}q65Vku4sK}gF^pu@5y8|+7WfxbTr04WI*e?A! zowF-8Cp-Wxyw+AgB0QR-r6UOxWrNxNyNRn}Hz~_}8V`(Au{l0fX$2Wgywp*g8tp1O zNh@P}-MX8(40NGWRr?ykY9E8^&WCBK-dJmFvY{qvo=GJ%m)SqpFjsn1jgzRzWN9*8 z)nN+PRkjW=$>a8T((`KHsr<xt;Kmlo`bq2>9DmBg=fjUqSvM48A^XSTi_p{ID=nZs zDfWj-e|AGtD(zB0Q;w%@c$6IvT~?__rAW`jNI`54eK>ix2OTJ@MZQ-UTaHa`M$^6Y zhK7DQts~AeomHG~LVbr#5V}JndJDdg&bF3j)L*!!6y0DU|JU?A14U9Gjhq5ifb4|b zC12?r-UDdfrGG`X;bm>3N6>0d8#_?t4Q9cvi+4|EtlNRt;sF^pf{b<r0SA?=xv{Yo z2TP_$&DeU(u7ahet{Gno>-cAdqaWw@Kye`ep<6Vjv(5kS)A$T}0gge7LUCSqIWLTy z<S4Ik{%Ioe)?#l#7JCN)$Fu}k(c&yNU^^U0M5Czr(+iUa3p)A>I{G(s^zmIJ(ZZ5+ gZ%h^w)nWTyn`BERn+}?rMlafSU*5*z*u@U}3xRY7CIA2c literal 0 HcmV?d00001 diff --git a/internal/morphology/__pycache__/morphology.cpython-37.pyc b/internal/morphology/__pycache__/morphology.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83cc39064989b3d6c86d6c410f1df4da468ccfe6 GIT binary patch literal 24105 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 TOYdlqd6(-P(GO-ATkd}Y$2dUy literal 0 HcmV?d00001 diff --git a/internal/morphology/__pycache__/morphvis.cpython-37.pyc b/internal/morphology/__pycache__/morphvis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ab04179637b64a3ce7820d7af9817e9aca78ee8 GIT binary patch literal 9996 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 BouU8$ literal 0 HcmV?d00001 diff --git a/internal/morphology/__pycache__/node.cpython-37.pyc b/internal/morphology/__pycache__/node.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3e6c4846178f1213150038a2be8a0a09419418c GIT binary patch literal 2942 zcma)8&2QT_6elIwmL2D#UDh_;2eglFHPECV+bI~frg5+Z%iJRA&{oJmC?ajkl_ix_ z+St$zLwnsHFkpukJMCZ6X~0gs@3hPI9;G;m+Z3hE$0zcUeDB8}pLA<>wn3mofBfS8 zGfT+d_;6S(P;Nq1_d#&NX-M3nr7q<LH=hyL;1;hyYko_3mDipTUK7?+)2(pZt@65C z;|<s5Gj5$X-3Fg^XZW1k<n!(<UvTF*-65?rFJX1k@eORCRLZ&zt-1vwBLkAr0l7ea zHbAGKQ_xM&4bTnHt<-#OWkzN!lFZD^MRJ~GR%T)Q0{5VuRwbtgIUVJ6oLfUL?dO(y zBva_FL@^iFi{=Kza{zS&b^Irhb=dyjV10G>M<t}%_4*!P+4G)w(P(!q^87gB-WR(f zdaQQiL`2F587KXb+T9BFc2$sy<;3$JdOZPi!w@X^!>d7*3K@Cf)nP1?ejLWV(N%O| zB^l*s#l9Z~TzC=Vfl9r|7w;epHV8tS`X^^VKY^AB9U84wP!7>L59hUb46*Wgf?D~E zsF|77GXW)|(}M+|{Pj)Clz1KzmzKzbRz=oOM^9WMImnF!KuX3MqCy~%a(fu?B!(C- z!c*z@0>z&MdJ!M$q~PK=p{h0rL4Z@pC+eCdx2%#|6;Um?^^^jiY+eVx*}TDLpaov> zS!f%44kDP(tqwprzSeM{Y>Pw+C8AV02(S}G&d$Ac=LmPF8-zle`Wj(y15X?y{~oHk z2_mBzVFXYji~>@G8Ne*U%&Y>^%BmnMSq)^h2iUV3M|)e#Iyb;4)BBAQqIW^3?s(E0 z3ZQ_RbS+QHq$^qlZ&T3|@~8_#*laf@9qB1H=_nD-<(=C<tX*-|?%(cQac-^ctZlLO zMyI{Kd3VE!rL%TtbNyIX>uA-3Ri_)qUOL(4z)51Dau7#O+|@uH8IPuoM{h75PaBWl zU@WJNrN@JP^{NZWYoOX}qg~=jIQ!!0FE3wr0`$J@ZB4>^`5%-{tC7<vr|A^y^J=ke zUM&{OZNDFc9M;WisT6_*JfHL9A&jO&*bJUqb;v9t?8*fok356o<W0({gv%4<)rU_! z*;B7vAjX0yNE!PKrm95{<YJW``x&5{<5}eS%Au_f4ATW$%nv#ptbn4^0VYjMmSlj} zALu&(@(zHy10e3ehFa(J_Xehb@pWfCjvfn{I%!`V-kUUbJO@%>;Dy21+Y5!m10N~j z$&mxt8GwU@yqk(uo&^^qrZ9<-$ahhk1JP=niqGkDs63DJ@roYHIJGo}Wa+0J=q~Uw zEjs-hH#J_R=_GsN$>4Gtt{b3aaNjvyLTPAeYH4X%(Xy&#ZHaLE*BU@p@5uLIru+cK z$)i3BrBypU-U~Q!2?e^+GIG-oRZjVIp!KedhdR`sz)m5*h+!P31|84oFeip50!80+ zpiNLR@|?VYFqa5~0Ix?XKZM?vp&`yKcy$e@_n%>`CsG^%+JUjc1qmH5lvJDyo?zo- zSIn@*uEma4-c<cqrc9+Wh<dp-P;r!3`2H|ag)^s|H^Ui>h3Eplnh3RNdA{Y)2?y}C zq{F@j3g%__nmFY`r20BMMVorJeh#5A##@drg_jDa@Y8t`r2WHt(Tyd1OJHh*cZ=Hh z{UGwwE6yajC<rVR%V7`+2W_44$CtQ+|CKMhuL$T?F!)w?BR9dFqe}(n_nNyQKZTGJ zs0B{uhje^KAJ%c;JFS`AW-NlY5@UITv0=>jL)4p$J=*uea-_x>kA24Ed$6EBpnS#; zJ*D7n){nXT2)jQ)@i_|I`WS=srNyI=b0E-Gp<<hsVPCfAn@!uaEj{)Yx2eb@m{D5u z@)9%>KN|Iik^aiatMT4I_^Dpct#xj<H`r#|t!w4(gF72;Rjc>Q_CeXYWxHL@xzll* u#hmR8y~3=1TK{fytG&I^d0lw9{Z)bA*LXh_eg)aoHtd>RTevr!mHr2>J9NJQ literal 0 HcmV?d00001 diff --git a/internal/morphology/__pycache__/validate_swc.cpython-37.pyc b/internal/morphology/__pycache__/validate_swc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a09bd46bb73cc2861b69e1c5820ce41f6f17e572 GIT binary patch literal 6270 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 QSThqxtRHHxS(BFb9~+P}%>V!Z literal 0 HcmV?d00001 diff --git a/internal/morphology/compartment.py b/internal/morphology/compartment.py new file mode 100644 index 0000000000..2a88781a80 --- /dev/null +++ b/internal/morphology/compartment.py @@ -0,0 +1,31 @@ +# Copyright 2016 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + +import allensdk.internal.morphology.node as node + +class Compartment(object): + def __init__(self, node1, node2): + if not isinstance(node1, node.Node) or not isinstance(node2, node.Node): + raise TypeError("Must supply Node objects to Compartment constructor") + self.length = node.euclidean_distance(node1, node2) + self.center = node.midpoint(node1, node2) + self.node1 = node1 + self.node2 = node2 + + def __str__(self): + s = "%s %f" % (str(self.center), self.length) + s += "\n\t" + self.node1.short_string() + "\n\t" + self.node2.short_string() + return s + diff --git a/internal/morphology/morphology.py b/internal/morphology/morphology.py new file mode 100644 index 0000000000..84491ebdd4 --- /dev/null +++ b/internal/morphology/morphology.py @@ -0,0 +1,1001 @@ +# Copyright 2015-2016 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + +import copy +import math +import numpy as np +from allensdk.internal.morphology.node import Node +from allensdk.internal.morphology.compartment import Compartment + + +class Morphology( object ): + """ + Keep track of the list of nodes in a morphology and provide + a few helper methods (soma, tree information, pruning, etc). + """ + + SOMA = 1 + AXON = 2 + BASAL_DENDRITE = 3 + APICAL_DENDRITE = 4 + + NODE_TYPES = [ SOMA, AXON, BASAL_DENDRITE, APICAL_DENDRITE ] + + def __init__(self, node_list=None): + """ + Try to initialize from a list of nodes first, then from + a dictionary indexed by node id if that fails, and finally just + leave everything empty. + + Parameters + ---------- + node_list: list + list of Node objects + """ + self._node_list = [] # list of morphology node IDs + self._compartment_list = [] # list of morphology compartment IDs + + ############################################## + # define tree list here for clarity, even though it's reset below + # when nodes are assigned + self._tree_list = [] + + ############################################## + # dimensions of morphology, including min and max values on xyz + # this is cached value + # NOTE: if morphology is manually manipulated, this value can + # become incorrect + self.dims = None + + ############################################## + # construct the node list + # first try to do so using the node list, then try using + # the node index and if that fails then complain + if node_list: + self.node_list = node_list + ############################################## + # verify morphology is consistent with morphology rules (e.g., + # no dendrite branching from an axon) + num_errors = self._check_consistency() + if num_errors > 0: + raise ValueError("Morphology appears to be inconsistent") + ############################################## + # restructure morphology as necessary (eg, renumber nodes) + # and construct internal associations + self._reconstruct() + + + #################################################################### + #################################################################### + # class properties, and helper functions for them + + @property + def node_list(self): + """ Return the node list. This is a property to ensure that the + node list and node index are in sync. """ + return self._node_list + + @node_list.setter + def node_list(self, node_list): + """ Update the node list. """ + self._set_nodes(node_list) + + @property + def compartment_list(self): + return self._compartment_list + + @property + def num_trees(self): + """ Return the number of trees in the morphology. A tree is + defined as everything following from a single root node. """ + return len(self._tree_list) + + @property + def num_nodes(self): + """ + Return the number of nodes in the morphology. + """ + return len(self.node_list) + + # internal function + def _set_nodes(self, node_list): + """ + take a list of SWC node objects and turn those into morphology + nodes need to be able to initialize from a list supplied by an SWC + file while also being able to initialize from the node list + of an existing Morphology object. As nodes in a morphology object + contain reference to nodes in that object, make a shallow copy + of input nodes and overwrite known references (ie, the + 'children' array) + """ + self._node_list = [] + for obj in node_list: + seg = copy.copy(obj) + seg.tree_id = -1 + seg.children = [] + self._node_list.append(seg) + # list data now set. remove holes in sequence and re-index + self._reconstruct() + + # removed old 'soma' and 'root' calls as these were ambiguous + # a soma can consist of multiple compartments, and there can + # be multiple roots + # replaced those calls with new soma_root(), which returns the + # same thing as the old soma() when only a single soma node is + # present + def soma_root(self): + """ Returns root node of soma, if present""" + if len(self._tree_list) > 0 and self._tree_list[0][0].t == 1: + return self._tree_list[0][0] + return None + + #################################################################### + #################################################################### + # tree and node access + + def tree(self, n): + """ + Returns a list of all Morphology nodes within the specified + tree. A tree is defined as a fully connected graph of nodes. + Each tree has exactly one root. + + Parameters + ---------- + n: integer + ID of desired tree + + Returns + ------- + A list of all morphology objects in the specified tree, or None + if the tree doesn't exist + """ + if n < 0 or n >= len(self._tree_list): + return None + return self._tree_list[n] + + + def node(self, n): + """ + Returns the morphology node having the specified ID. + + Parameters + ---------- + n: integer + ID of desired node + + Returns + ------- + A morphology node having the specified ID, or None if such a + node doesn't exist + """ + # undocumented feature -- if a node is supplied instead of a + # node ID, the node is returned and no error is + # triggered + return self._resolve_node_type(n) + + + def compartment(self, n): + """ + Returns the morphology Compartment having the specified ID. + + Parameters + ---------- + n: integer + ID of desired compartment + + Returns + ------- + A morphology object having the specified ID, or None if such a + node doesn't exist + """ + if n < 0 or n >= len(self.compartment_list): + return None + return self._compartment_list[n] + + + def parent_of(self, seg): + """ Returns parent of the specified node. + + Parameters + ---------- + seg: integer or Morphology Object + The ID of the child node, or the child node itself + + Returns + ------- + A morphology object, or None if no parent exists or if the + specified node ID doesn't exist + """ + # if ID passed in, make sure it's converted to a node + # don't trap for exception here -- if supplied segment is + # incorrect, make sure the user knows about it + seg = self._resolve_node_type(seg) + # return parent of specified node + if seg is not None and seg.parent >= 0: + return self._node_list[seg.parent] + return None + + + def children_of(self, seg): + """ Returns a list of the children of the specified node + + Parameters + ---------- + seg: integer or Morphology Object + The ID of the parent node, or the parent node itself + + Returns + ------- + A list of the child morphology objects. If the ID of the parent + node is invalid, None is returned. + """ + seg = self._resolve_node_type(seg) + return [ self._node_list[c] for c in seg.children ] + + + def to_dict(self): + """ + Returns a dictionary of Node objects. These Nodes are a copy + of the Morphology. Modifying them will not modify anything in + the Morphology itself. + """ + return { c.n: c.to_dict() for c in self._node_list } + + + ################################################################### + ################################################################### + # Information querying and data manipulation + + # internal function. takes an integer and returns the node having + # that ID. IF a node is passed in instead, it is returned + def _resolve_node_type(self, seg): + # if node passed then we don't need to convert anything + # if node not passed, try converting value to int + # and using that as an index + if not isinstance(seg, Node): + try: + seg = int(seg) + if seg < 0 or seg >= len(self._node_list): + return None + seg = self._node_list[seg] + except ValueError: + raise TypeError("Object not recognized as morphology Node or index") + return seg + + + def change_parent(self, child, parent): + """ Change the parent of a node. The child node is adjusted to + point to the new parent, the child is taken off of the previous + parent's child list, and it is added to the new parent's child list. + + Parameters + ---------- + child: integer or Morphology Object + The ID of the child node, or the child node itself + + parent: integer or Morphology Object + The ID of the parent node, or the parent node itself + + Returns + ------- + Nothing + """ + child_seg = self._resolve_node_type(child) + parent_seg = self._resolve_node_type(parent) + # if child has former parent, remove it from parent's child list + if child_seg.parent >= 0: + old_par = self.node(child_seg.parent) + old_par.children.remove(child_seg.n) + parent_seg.children.append(child_seg.n) + child_seg.parent = parent_seg.n + + def get_dimensions(self): + """ Returns tuple of overall width, height and depth of + morphology. + WARNING: if locations of nodes in morphology are manipulated + then this value can become incorrect. It can be reset and + recalculated by programmitcally setting self.dims to None. + + Returns + ------- + 3 real arrays: [width, height, depth], [min_x, min_y, min_z], + [max_x, max_y, max_z] + """ + if self.dims is None: + min_x = self.node_list[0].x + max_x = self.node_list[0].x + min_y = self.node_list[0].y + max_y = self.node_list[0].y + min_z = self.node_list[0].z + max_z = self.node_list[0].z + for node in self.node_list: + max_x = max(node.x, max_x) + max_y = max(node.y, max_y) + max_z = max(node.z, max_z) + # + min_x = min(node.x, min_x) + min_y = min(node.y, min_y) + min_z = min(node.z, min_z) + self.dims = [(max_x-min_x), (max_y-min_y), (max_z-min_z)], [min_x, min_y, min_z], [max_x, max_y, max_z] + return self.dims + + # returns a list of node located within dist of x,y,z + def find(self, x, y, z, dist, node_type=None): + """ Returns a list of Morphology Objects located within 'dist' + of coordinate (x,y,z). If node_type is specified, the search + will be constrained to return only nodes of that type. + + Parameters + ---------- + x, y, z: float + The x,y,z coordinates from which to search around + + dist: float + The search radius + + node_type: enum (optional) + One of the following constants: SOMA, AXON, + BASAL_DENDRITE or APICAL_DENDRITE + + Returns + ------- + A list of all Morphology Objects matching the search criteria + """ + found = [] + for seg in self.node_list: + dx = seg.x - x + dy = seg.y - y + dz = seg.z - z + if math.sqrt(dx*dx + dy*dy + dz*dz) <= dist: + if node_type is None or seg.t == node_type: + found.append(seg) + return found + + + def node_list_by_type(self, node_type): + """ Return an list of all nodes having the specified + node type. + + Parameters + ---------- + node_type: int + Desired node type + + Returns + ------- + A list of of Morphology Objects + """ + return [x for x in self._node_list if x.t == node_type] + + + def save(self, file_name): + """ Write this morphology out to an SWC file + + Parameters + ---------- + file_name: string + desired name of your SWC file + """ + f = open(file_name, "w") + f.write("#n,type,x,y,z,radius,parent\n") + for seg in self.node_list: + f.write("%d %d " % (seg.n, seg.t)) + f.write("%0.4f " % seg.x) + f.write("%0.4f " % seg.y) + f.write("%0.4f " % seg.z) + f.write("%0.4f " % seg.radius) + f.write("%d\n" % seg.parent) + f.close() + + + # keep for backward compatibility, but don't publish in docs + def write(self, file_name): + self.save(file_name) + + + def sparsify(self, modulo): + """ Return a new Morphology object that has a given number of non-leaf, + non-root nodes removed. + + Parameters + ---------- + modulo: int + keep 1 out of every modulo nodes. + + Returns + ------- + Morphology + A new morphology instance + """ + # create and return a new morphology instance. make a copy of + # this morphology's node list and manipulate that + nodes = copy.deepcopy(self.node_list) + # figure out which nodes to toss + keep = {} + ctr = 0 # mod counter -- keep every modulo element (starting w/ 1st) + for seg in nodes: + nid = seg.n + if (seg.parent < 0 or + len(seg.children) != 1 or + nodes[seg.parent].t == Morphology.SOMA or + seg.t == Morphology.SOMA): + keep[nid] = True + else: + if ctr % modulo == 0: + keep[nid] = True + else: + keep[nid] = False + ctr += 1 + # hook children up to their new parents + for seg in nodes: + if keep[seg.n] is False: + parent_id = seg.parent + while keep[parent_id] is False: + parent_id = nodes[parent_id].parent + for child_id in seg.children: + nodes[child_id].parent = parent_id + # filter out orphans + sparse = [] + for seg in nodes: + if keep[seg.n] is True: + sparse.append(seg) + return Morphology(sparse) + + + #################################################################### + #################################################################### + + def _reconstruct(self): + """ + Internal function. + Restructures data and establishes appropriate internal linking. + Data is re-order, removing 'holes' in the ID sequence so that + each object ID corresponds to its position in node list. + Dictionaries mapping IDs to objects are no longer necessary. + Trees are (re)calculated + Parent-child indices are recalculated + A new compartment list is created + """ + remap = {} + # everything defaults to root. this way if a parent was deleted + # the child will become a new root + for i in range(len(self.node_list)): + remap[i] = -1 + # map old old node numbers to new ones. reset n to the new ID + # and put node in new list + new_id = 0 + tmp_list = [] + for node in self.node_list: + if node is not None: + remap[node.n] = new_id + node.n = new_id + tmp_list.append(node) + new_id += 1 + # use map to reset parent values. copy objs to new list + for node in tmp_list: + if node.parent >= 0: + node.parent = remap[node.parent] + # replace node list with newly created node list + self._node_list = tmp_list + # reconstruct parent/child relationship links + ############################ + # node list is complete and sequential so don't need index + # to resolve relationships + # for each node, reset children array + # for each node, add self to parent's child list + for node in self._node_list: + node.children = [] + node.compartment = -1 + for node in self._node_list: + if node.parent >= 0: + self._node_list[node.parent].children.append(node.n) + # update tree lists + self._separate_trees() + # verify that each node ID is the same as its position in the + # node list + for i in range(len(self.node_list)): + if i != self.node(i).n: + raise RuntimeError("Internal error detected -- node list not properly formed") + # construct compartment list + # (a compartment spans the distance between two nodes) + self._compartment_list = [] + for node in self.node_list: + node.compartment_id = -1 + for node in self.node_list: + for child_id in node.children: + endpoint = self.node(child_id) + compartment = Compartment(node, endpoint) + endpoint.compartment_id = len(self._compartment_list) + self._compartment_list.append(compartment) + + + def append(self, nodes): + """ Add additional nodes to this Morphology. Those nodes must + originate from another morphology object. + + Parameters + ---------- + nodes: list of Morphology nodes + """ + # construct a map between new and old IDs of added nodes + remap = {} + for i in range(len(nodes)): + remap[i] = -1 + # map old old node numbers to new ones. reset n to the new ID + # append new nodes to existing node list + old_count = len(self.node_list) + new_id = old_count + for node in nodes: + if node is not None: + remap[node.n] = new_id + node.n = new_id + self._node_list.append(node) + new_id += 1 + # use map to reset parent values. copy objs to new list + for i in range(old_count, len(self.node_list)): + node = self.node_list[i] + if node.parent >= 0: + node.parent = remap[node.parent] + self._reconstruct() + + + def convert_type(self, from_type, to_type): + """ Convert all nodes in morphology from one type to another + + Parameters + ---------- + from_type: enum + The node type that will be eliminated and replaced. + Use one of the following constants: SOMA, AXON, + BASAL_DENDRITE, or APICAL_DENDRITE + + to_type: enum + The new type that will replace it. + Use one of the following constants: SOMA, AXON, + BASAL_DENDRITE, or APICAL_DENDRITE + """ + for node in self.node_list: + if node.t == from_type: + node.t = to_type + + + def stumpify_axon(self, count=10): + """ Remove all axon nodes except the first 'count' + nodes, as counted from the connected axon root. + + Parameters + ---------- + count: Integer + The length of the axon 'stump', in number of nodes + """ + # find connected axon root + axon_root = None + for seg in self.node_list: + if seg.t == Morphology.AXON: + par_id = seg.parent + if par_id >= 0: + par = self.node_list[par_id] + if par.t != Morphology.AXON: + axon_root = seg + break + if axon_root is None: + return + # flag the first 'count' nodes from the axon root + ax = axon_root + for node in self.node_list: + node.flag = None + for i in range(count): + # ignore bifurcations -- go 'count' deep on one line only + ax.flag = i + #ax["flag"] = i + children = ax.children + if len(children) > 0: + ax = self.node(children[0]) + # strip out all axons that aren't flagged + for i in range(len(self.node_list)): + seg = self.node_list[i] + if seg.t == Morphology.AXON: + #if "flag" not in seg: + if seg.flag is None: + self.node_list[i] = None + self._reconstruct() + + + def _strip(self, flagged_for_removal): + """ Internal function with code common between + strip_all_other_types() and strip_type() + """ + # if parent will be stripped and node will remain, convert + # parent to this type so it becomes root (otherwise root + # will move) + root = self.soma_root() + for node_id in self._node_list: + node = self.node(node_id) + if node.parent >= 0: + parent = self.node(node.parent) + parent_flag = flagged_for_removal[parent.n] + node_flag = flagged_for_removal[node.n] + if parent_flag and not node_flag: + # don't do this for soma root + if parent.n != root.n: + parent.t = node.t + flagged_for_removal[parent.n] = False + # removed flagged items + for i in range(len(self.node_list)): + seg = self.node_list[i] + if flagged_for_removal[seg.n]: + # eliminate node + self.node_list[i] = None + elif seg.parent >= 0 and flagged_for_removal[seg.parent]: + # parent was eliminated. make this a new root + seg.parent = -1 + self._reconstruct() + + + # strip out everything but the soma and the specified SWC type + def strip_all_other_types(self, node_type, keep_soma=True): + """ Strips everything from the morphology except for the + specified type. + Parent and child relationships are updated accordingly, creating + new roots when necessary. + + Parameters + ---------- + node_type: enum + The node type to keep in the morphology. + Use one of the following constants: SOMA, AXON, + BASAL_DENDRITE, or APICAL_DENDRITE + + keep_soma: Boolean (optional) + True (default) if soma nodes should remain in the + morpyhology, and False if the soma should also be stripped + """ + flagged_for_removal = {} + # scan nodes and see which ones should be removed. keep a record + # of them + for seg in self.node_list: + if seg.t == node_type: + remove = False + elif seg.t == 1 and keep_soma: + remove = False + else: + remove = True + if remove: + flagged_for_removal[seg.n] = True + else: + flagged_for_removal[seg.n] = False + self._strip(flagged_for_removal) + + + # strip out the specified SWC type + def strip_type(self, node_type): + """ Strips all nodes of the specified type from the + morphology. + Parent and child relationships are updated accordingly, creating + new roots when necessary. + + Parameters + ---------- + node_type: enum + The node type to strip from the morphology. + Use one of the following constants: SOMA, AXON, + BASAL_DENDRITE, or APICAL_DENDRITE + """ + flagged_for_removal = {} + for seg in self.node_list: + if seg.t == node_type: + remove = True + else: + remove = False + if remove: + flagged_for_removal[seg.n] = True + else: + flagged_for_removal[seg.n] = False + self._strip(flagged_for_removal) + + + def clone(self): + """ Create a clone (deep copy) of this morphology + """ + return copy.deepcopy(self) + + + def apply_affine_only_rotation(self, aff): + """ Apply an affine transform to all nodes in this + morphology. Only the rotation element of the transform is + performed (i.e., although the entire transformation and + translation matrix is supplied, only the rotation element + is used). The morphology is translated to the point where + the soma root is at 0,0,0. + + Format of the affine matrix is: + + [x0 y0 z0] [tx] + [x1 y1 z1] [ty] + [x2 y2 z2] [tz] + + where the left 3x3 the matrix defines the affine rotation + and scaling, and the right column is the translation + vector. + + The matrix must be collapsed and stored in a list as follows: + + [x0 y0, z0, x1, y1, z1, x2, y2, z2, tx, ty, tz] + + Parameters + ---------- + aff: 3x4 array of floats (python 2D list, or numpy 2D array) + the transformation matrix + """ + affine = np.copy(aff) + # remove scale on each axis + scale_x = abs(affine[0] + affine[3] + affine[6]) + if scale_x != 0.0: + affine[0] /= scale_x + affine[3] /= scale_x + affine[6] /= scale_x + scale_y = abs(affine[1] + affine[4] + affine[7]) + if scale_y != 0.0: + affine[1] /= scale_y + affine[4] /= scale_y + affine[7] /= scale_y + scale_z = abs(affine[2] + affine[5] + affine[8]) + if scale_z != 0.0: + affine[2] /= scale_z + affine[5] /= scale_z + affine[8] /= scale_z + # apply rotation + for seg in self.node_list: + x = seg.x*affine[0] + seg.y*affine[1] + seg.z*affine[2] + y = seg.x*affine[3] + seg.y*affine[4] + seg.z*affine[5] + z = seg.x*affine[6] + seg.y*affine[7] + seg.z*affine[8] + seg.x = x + seg.y = y + seg.z = z +# # relocate back to zero +# soma = self.soma_root() +# if soma is not None: +# for seg in self.node_list: +# seg.x -= soma.x +# seg.y -= soma.y +# seg.z -= soma.z + + + def apply_affine(self, aff, scale=None): + """ Apply an affine transform to all nodes in this + morphology. Compartment radius is adjusted as well. + + Format of the affine matrix is: + + [x0 y0 z0] [tx] + [x1 y1 z1] [ty] + [x2 y2 z2] [tz] + + where the left 3x3 the matrix defines the affine rotation + and scaling, and the right column is the translation + vector. + + The matrix must be collapsed and stored in a list as follows: + + [x0 y0, z0, x1, y1, z1, x2, y2, z2, tx, ty, tz] + + Parameters + ---------- + aff: 3x4 array of floats (python 2D list, or numpy 2D array) + the transformation matrix + """ + # In addition to transforming the locations of the morphology + # nodes, the radius of each node must be adjusted. + # There are 2 ways to measure scale from a transform. Assuming + # an isotropic transform, the scale is the cube root of the + # matrix determinant. The other ways is to measure scale + # independently along each axis. + # For now, the node radius is only updated based on the average + # scale along all 3 axes (eg, isotropic assumption), so calculate + # scale using the determinant + # + if scale is None: + # calculate the determinant + determinant = np.linalg.det(np.reshape(aff[0:9], (3, 3))) + # determinant is change of volume that occurred during transform + # assume equal scaling along all axes. take 3rd root to get + # scale factor + det_scale = np.power(abs(determinant), 1.0 / 3.0) + ## measure scale along each axis + ## keep this code here in case + #scale_x = abs(aff[0] + aff[3] + aff[6]) + #scale_y = abs(aff[1] + aff[4] + aff[7]) + #scale_z = abs(aff[2] + aff[5] + aff[8]) + #avg_scale = (scale_x + scale_y + scale_z) / 3.0; + # + # use determinant for scaling for now as it's most simple + scale = det_scale + for seg in self.node_list: + x = seg.x*aff[0] + seg.y*aff[1] + seg.z*aff[2] + aff[9] + y = seg.x*aff[3] + seg.y*aff[4] + seg.z*aff[5] + aff[10] + z = seg.x*aff[6] + seg.y*aff[7] + seg.z*aff[8] + aff[11] + seg.x = x + seg.y = y + seg.z = z + seg.radius *= scale + + + def _separate_trees(self): + """ + Construct list of independent trees (each tree has a root of -1). + The soma root, if it exists, is in tree 0. + """ + trees = [] + # reset each node's tree ID to indicate that it's not assigned + for seg in self.node_list: + seg.tree_id = -1 + # construct trees for each node + # if a node is adjacent an existing tree, merge to it + # if a node is adjacent multiple trees, merge all + for seg in self.node_list: + # see what trees this node is adjacent to + local_trees = [] + if seg.parent >= 0 and self.node_list[seg.parent].tree_id >= 0: + local_trees.append(self.node_list[seg.parent].tree_id) + for child_id in seg.children: + child = self.node_list[child_id] + if child.tree_id >= 0: + local_trees.append(child.tree_id) + # figure out which tree to put node into + # if there are muliple possibilities, merge all of them + if len(local_trees) == 0: + tree_num = len(trees) # create new tree + elif len(local_trees) == 1: + tree_num = local_trees[0] # use existing tree + elif len(local_trees) > 1: + # this node is an intersection of multiple trees + # merge all trees into the first one found + tree_num = local_trees[0] + for j in range(1,len(local_trees)): + dead_tree = local_trees[j] + trees[dead_tree] = [] + for node in self.node_list: + if node.tree_id == dead_tree: + node.tree_id = tree_num + # merge node into tree + # ensure there's space + while len(trees) <= tree_num: + trees.append([]) + trees[tree_num].append(seg) + seg.tree_id = tree_num + # consolidate tree lists into class's tree list object + self._tree_list = [] + for tree in trees: + if len(tree) > 0: + self._tree_list.append(tree) + # make soma's tree be the first tree, if soma present + # this should be the case if the file is properly ordered, but + # don't assume that + soma_tree = -1 + for seg in self.node_list: + if seg.t == 1: + soma_tree = seg.tree_id + break + if soma_tree > 0: + # swap soma tree for first tree in list + tmp = self._tree_list[soma_tree] + self._tree_list[soma_tree] = self._tree_list[0] + self._tree_list[0] = tmp + # reset node tree_id to correct tree number + self._reset_tree_ids() + + + def _reset_tree_ids(self): + """ + reset each node's tree_id value to the correct tree number + """ + for i in range(len(self._tree_list)): + for j in range(len(self._tree_list[i])): + self._tree_list[i][j].tree_id = i + + + def _check_consistency(self): + """ + internal function -- don't publish in the docs + TODO? print warning if unrecognized types are present + Return value: number of errors detected in file + """ + errs = 0 + # Make sure that the parents are of proper ID range + n = self.num_nodes + for seg in self.node_list: + if seg.parent >= 0: + if seg.parent >= n: + print("Parent for node %d is invalid (%d)" % (seg.n, seg.parent)) + errs += 1 + # make sure that each tree has exactly one root + for i in range(self.num_trees): + tree = self.tree(i) + root = -1 + for j in range(len(tree)): + if tree[j].parent == -1: + if root >= 0: + print("Too many roots in tree %d" % i) + errs += 1 + root = j + if root == -1: + print("No root present in tree %d" % i) + errs += 1 + # make sure each axon has at most one root + # find type boundaries. at each axon boundary, walk back up + # tree to root and make sure another axon segment not + # encountered + adoptees = self._find_type_boundary() + for child in adoptees: + if child.t == Morphology.AXON: + par_id = child.parent + while par_id >= 0: + par = self.node_list[par_id] + if par.t == Morphology.AXON: + print("Branch has multiple axon roots") + print(child) + print(par) + errs += 1 + break + par_id = par.parent + if errs > 0: + print("Failed consistency check: %d errors encountered" % errs) + return errs + + + def _find_type_boundary(self): + """ + return a list of segments who have parents that are a different type + """ + adoptees = [] + for node in self.node_list: + par = self.parent_of(node) + if par is None: + continue + if node.t != par.t: + adoptees.append(node) + return adoptees + + + # remove tree from swc's "forest" + def delete_tree(self, n): + """ Delete tree, and all of its nodes, from the morphology. + + Parameters + ---------- + n: Integer + The tree number to delete + """ + if n < 0: + return + if n >= self.num_trees: + print("Error -- attempted to delete non-existing tree (%d)" % n) + raise ValueError + tree = self.tree(n) + for i in range(len(tree)): + self.node_list[tree[i].n] = None + del self._tree_list[n] + self._reconstruct() + # reset node tree_id to correct tree number + self._reset_tree_ids() + + + def _print_all_nodes(self): + """ + debugging function. prints all nodes + """ + for node in self.node_list: + print(node.short_string()) + diff --git a/internal/morphology/morphvis.py b/internal/morphology/morphvis.py new file mode 100644 index 0000000000..2df3c30267 --- /dev/null +++ b/internal/morphology/morphvis.py @@ -0,0 +1,385 @@ +from PIL import Image, ImageDraw +import numpy as np + +class MorphologyColors(object): + def __init__(self): + self.soma = (0, 0, 0) + self.axon = (70, 130, 180) + self.basal = (178, 34, 34) + self.apical = (255, 127, 80) + + def set_soma_color(self, r, g, b): + self.soma = (r, g, b) + + def set_axon_color(self, r, g, b): + self.axon = (r, g, b) + + def set_basal_color(self, r, g, b): + self.basal = (r, g, b) + + def set_apical_color(self, r, g, b): + self.apical = (r, g, b) + + +# create empty image +def create_image(w, h, color=None, alpha=False): + if alpha: + mode = 'RGBA' + else: + mode = 'RGB' + if color is not None: + return Image.new(mode, (w,h), color) + else: + return Image.new(mode, (w,h)) + + +def calculate_scale(morph, pix_width, pix_height): + """ Calculates scaling factor and x,y insets required to auto-scale + and center morphology into box with specified numbers of pixels + + Parameters + ---------- + + morph: AISDK Morphology object + + pix_width: int + Number of image pixels on X axis + + pix_height: int + Number of image pixels on Y axis + + Returns + ------- + real, real, real + First return value is the scaling factor. Second is the + number of pixels needed to adjust x-coordinates so that the + morphology is horizontally centered. Third is the number of + pixels needed to adjust the y-coordinates so that the morphology + is vertically centered. + """ + dims, low, high = morph.get_dimensions() + # get boundaries of morphology + xlow = low[0] + xhigh = high[0] + ylow = low[1] + yhigh = high[1] + # determine scale on X and Y to make morphology fit in image area + hscale = pix_width / (xhigh - xlow) + vscale = pix_height / (yhigh - ylow) + # select lowest scaling factor so morphology is stretched to + # maximum width/height along axis that is tightest fit + # and adjust inset on other axis so morphology is centered + scale_factor = min(hscale, vscale) + if hscale < vscale: + # image constrained on horizontal axis + scale_factor = hscale + # center image vertically + v_center = (ylow + yhigh) / 2.0 + scale_inset_x = -low[0] * scale_factor + # invert y coordinates for conversion to pixel space + scale_inset_y = pix_height/2 + scale_factor*v_center + else: + # image constrained on vertical axis + scale_factor = vscale + # center image horizontally + h_center = (xlow + xhigh) / 2.0 + scale_inset_x = pix_width/2 - scale_factor*h_center + scale_inset_y = -low[1] * scale_factor + return scale_factor, scale_inset_x, scale_inset_y + + +# draw morphology on image -- takes image and morphology, modifies image +# options: scale to fit | linear scaling +def draw_morphology(img, morph, + inset_left=0, inset_right=0, inset_top=0, inset_bottom=0, + scale_to_fit=False, scale_factor=1.0, colors=None): + """ Draws morphology onto image + When no scaling is applied, and no insets are provided, the + coordinates of the morphology are used directly -- i.e., 100 in + morphology coordinates is equal to 100 pixels. + + The scale factor is multiplied to morphology coordinates before + being drawn. If scale_factor=2 then 50 in morphology coordinates + is 100 pixels. Left and top insets shift the coordinate axes + for drawing. E.g., if left=10 and top=5 then 0,0 in morphology + coordinates is 10,5 in pixel space. Bottom and right insets are + ignored. + + If scale_to_fit is set then scale factor is ignored. The + morphology is scaled to be the maximum size that fits in + the image, taking into account insets. In a 100x100 image, if + all insets=10, then the image is scaled to fit into the center + 80x80 pixel area, and nothing is drawn in the inset border areas. + + Axons are drawn before soma and dendrite compartments. + + + Parameters + ---------- + + img: PIL image object + + morph: AISDK Morphology object + + inset_*: real + This is the number of pixels to use as border on top/bottom/ + right/left. If scale_to_fit is false then only the top/left + values are used, as the scale_factor will determine how + large the morphology is (it can be drawn beyond insets and even + beyond image boundaries) + + scale_to_fit: boolean + If true then morphology is scaled to the inset area of the + image and scale_factor is ignored. Morphology is centered + in the image in the sense that the top/bottom and left/right + edges of the morphology are equidistant from image borders. + + scale_factor: real + A scalar amount that is multiplied to morphology coordinates + before drawing + + colors: MorphologyColors object + This is the color scheme used to draw the morphology. If + colors=None then default coloring is used + + Returns + ------- + + 2-dimensional array, the pixel coordinates of the soma root [x,y] + """ + # determine drawing area, scaling factor, offset to origin + # if scaling to fit, find value that scales morphology so height + # or width matches image area. adjust scale_factor and insets + # as necessary so morphology can be drawn normally + dims, low, high = morph.get_dimensions() + if scale_to_fit: + # get image area based on requested insets + width, height = img.size + pix_width = (width - inset_right) - inset_left + pix_height = (height - inset_bottom) - inset_top + # get scale and x,y insets from auto-scaling + scale_factor, scale_inset_x, scale_inset_y = calculate_scale(morph, pix_width, pix_height) + else: + # no implicit inset necessary due to scaling + scale_inset_x = 0 + scale_inset_y = 0 + + # order compartments by depth to approximate 3D rendering + sorted(morph.compartment_list, key=lambda x: x.node1.y) + + # if color not specified, select default + if colors is None: + colors = MorphologyColors() + + canvas = ImageDraw.Draw(img) + + for i in range(3): + for comp in morph.compartment_list: + if comp.node2.t == 1: + if i != 2: # soma drawn last + # NOTE: there are unlikely to be soma compartments + # additional soma-drawing code is below + continue + color = colors.soma + elif comp.node2.t == 2: + if i != 0: # axon drawn first + continue + color = colors.axon + elif comp.node2.t == 3: + if i != 1: # dendrite drawn second + continue + color = colors.basal + elif comp.node2.t == 4: + if i != 1: # dendrite drawn second + continue + color = colors.apical + x0 = scale_inset_x + inset_left + scale_factor * comp.node1.x + x1 = scale_inset_x + inset_left + scale_factor * comp.node2.x + # y coordinate inverted because morphology values are + # increasing going 'up while pixel values increase + # going down + y0 = scale_inset_y + inset_top - scale_factor * comp.node1.y + y1 = scale_inset_y + inset_top - scale_factor * comp.node2.y + canvas.line((x0, y0, x1, y1), color) + + # a compartment type is defined by the type of the 2nd node defining + # the compartment. if there is a single soma node, there can be + # no soma compartments. draw the root soma node + root = morph.soma_root() + x = scale_inset_x + inset_left + scale_factor * root.x + y = scale_inset_y + inset_top - scale_factor * root.y + rad = scale_factor * root.radius + x0 = int(x - rad) + y0 = int(y - rad) + x1 = int(x0 + 2*rad) + y1 = int(y0 + 2*rad) + canvas.ellipse((x0,y0,x1,y1), fill=colors.soma, outline=colors.soma) + + # return soma root coordinate, in unit of pixels + return [x, y] + + +def draw_density_hist(img, morph, vert_scale, + inset_left=0, inset_right=0, inset_top=0, inset_bottom=0, + num_bins=None, colors=None): + """ Draws density histogram onto image + When no scaling is applied, and no insets are provided, the + coordinates of the morphology are used directly -- i.e., 100 in + morphology coordinates is equal to 100 pixels. + + The scale factor is multiplied to morphology coordinates before + being drawn. If scale_factor=2 then 50 in morphology coordinates + is 100 pixels. Left and top insets shift the coordinate axes + for drawing. E.g., if left=10 and top=5 then 0,0 in morphology + coordinates is 10,5 in pixel space. Bottom and right insets are + ignored. + + If scale_to_fit is set then scale factor is ignored. The + morphology is scaled to be the maximum size that fits in + the image, taking into account insets. In a 100x100 image, if + all insets=10, then the image is scaled to fit into the center + 80x80 pixel area, and nothing is drawn in the inset border areas. + + Axons are drawn before soma and dendrite compartments. + + + Parameters + ---------- + + img: PIL image object + + morph: AISDK Morphology object + + vert_scale: real + This is the amout required to multiply to a moprhology + y-coordinate to convert it to relative cortical depth (on [0,1]). + This is the inverse of the cortical thickness. + + inset_*: real + This is the number of pixels to use as border on top/bottom/ + right/left. If scale_to_fit is false then only the top/left + values are used, as the scale_factor will determine how + large the morphology is (it can be drawn beyond insets and even + beyond image boundaries) + + num_bins: int + The number of bins in the histogram + + colors: MorphologyColors object + This is the color scheme used to draw the morphology. If + colors=None then default coloring is used + + Returns + ------- + + Histogram arrays: [hist, hist2, hist3, hist4] + where hist is the histgram of all neurites, and hist[234] are + the histograms of SWC types 2,3,4 + """ + # if number of bins not specified, default to vertical size of + # drawing area in image + img_width, img_height = img.size + draw_width = img_width - (inset_left + inset_right) + draw_height = img_height - (inset_top + inset_bottom) + if num_bins is None: + num_bins = draw_height + # histograms for each analyzed SWC type + hist_2 = np.zeros(num_bins) + hist_3 = np.zeros(num_bins) + hist_4 = np.zeros(num_bins) + # total response in a bin + hist = np.zeros(num_bins) + + print("Vert scale", vert_scale) + + # if color not specified, select default + if colors is None: + colors = MorphologyColors() + + canvas = ImageDraw.Draw(img) + + # for each compartment, split its length (weight) between bins for + # start and end nodes + for seg in morph.compartment_list: + wt = seg.length / 2.0 + # node 1 + bin1 = int(-vert_scale * seg.node1.y * num_bins) + if bin1 == num_bins: + bin1 = num_bins-1 + # only include parts of the histogram that are in the viewable + # range (ie, exclude parts that extend to pia and/or wm) + if bin1 >= 0 and bin1 < num_bins: + if seg.node1.t == 2: + hist_2[bin1] += wt + elif seg.node1.t == 3: + hist_3[bin1] += wt + elif seg.node1.t == 4: + hist_4[bin1] += wt + hist[bin1] += wt + # node 2 + bin2 = int(-vert_scale * seg.node1.y * num_bins) + if bin2 == num_bins: + bin2 = num_bins-1 + if bin2 >= 0 and bin2 < num_bins: + if seg.node2.t == 2: + hist_2[bin2] += wt + elif seg.node2.t == 3: + hist_3[bin2] += wt + elif seg.node2.t == 4: + hist_4[bin2] += wt + hist[bin2] += wt + + # draw axis line + col = (128, 128, 128, 256) + x0 = inset_left + x1 = x0 + y0 = inset_top + y1 = img_height-inset_bottom + canvas.line((x0, y0, x1, y1), col) + + hist_step = 1.0 * draw_height / num_bins; + hist_scale = (draw_width-1) / hist.max() + for seg in morph.compartment_list: + ypos = 1.0 * inset_top + for i in range(num_bins): + y0 = int(ypos) + y1 = int(ypos + hist_step) + x0 = int(1 + inset_left) + x1 = int(1 + inset_left + hist_2[i] * hist_scale + 0.99) + if x0 != x1: + ytmp = ypos + while ytmp < y1: + canvas.line((x0, int(ytmp), x1, int(ytmp)), colors.axon) + ytmp += hist_step + x0 = x1 + x1 += int(hist_3[i] * hist_scale + 0.99) + if x0 != x1: + ytmp = ypos + while ytmp < y1: + canvas.line((x0, int(ytmp), x1, int(ytmp)), colors.basal) + ytmp += hist_step + x0 = x1 + x1 += int(hist_4[i] * hist_scale + 0.99) + if x0 < x1: + ytmp = ypos + while ytmp < y1: + canvas.line((x0, int(ytmp), x1, int(ytmp)), colors.apical) + ytmp += hist_step + ypos += hist_step + + return hist, hist_2, hist_3, hist_4 + +# TODO +# draw path on image -- takes image and path, modifies image +#def draw_path(img, path, color): + # path is in units of pixels + # foreach vertex, draw line in specified color + +# refine section boundaries -- takes labeled regions and generates labeled mask +# -> need constraints on input. lookup of points is easy. categorizing +# what pixel is part of what ask is not without expanding masks laterally + +# label morphology -- takes morpholgoy and labeled mask and adds lables +# to each compartment + + diff --git a/internal/morphology/node.py b/internal/morphology/node.py new file mode 100644 index 0000000000..b85f21c153 --- /dev/null +++ b/internal/morphology/node.py @@ -0,0 +1,129 @@ +# Copyright 2016 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + +import json +import math + +def euclidean_distance(node1, node2): + dx = node1.x - node2.x + dy = node1.y - node2.y + dz = node1.z - node2.z + return math.sqrt(dx*dx + dy*dy + dz*dz) + + +def midpoint(node1, node2): + px = (node1.x + node2.x) * 0.5 + py = (node1.y + node2.y) * 0.5 + pz = (node1.z + node2.z) * 0.5 + return [px, py, pz] + + +class Node(object): + """ + Represents node in SWC morphology file + """ + + def __init__(self, n, t, x, y, z, r, pn, **kwargs): + """ + Parameters + ---------- + n: integer + node ID + + t: integer + node type (SOMA, AXON, BASAL_DENDRITE or APICAL_DENDRITE) + + x: float + x position of node + + y: float + y position of node + + z: float + z position of node + + r: float + radius of node + + pn: integer + ID of parent node (-1 if no parent) + """ + # these values correspond to columns in an SWC file + self.n = n + self.t = t + self.x = x + self.y = y + self.z = z + self.radius = r + self.parent = pn + # + self.children = [] # IDs of child nodes + self.tree_id = -1 # which unconnected graph this node belongs to + # number of compartment that has this node as its endpoint + # all nodes except root nodes have a compartment + self.compartment_id = -1 + + def to_dict(self): + """ Convert the node into a serializable dictionary """ + return { + "id": self.n, + "type": self.t, + "x": self.x, + "y": self.y, + "z": self.z, + "radius": self.radius, + "parent": self.parent, + "children": self.children, + "tree_id": self.tree_id, + "compartment_id": self.compartment_id + } + + @classmethod + def from_dict(cls, d): + return cls( + n = d["id"], + t = d["type"], + x = d["x"], + y = d["y"], + z = d["z"], + r = d["radius"], + pn = d["parent"], + ) + + def __getitem__(self, item): + return self.to_dict()[item] + + def __str__(self): + return self.short_string() + return json.dumps(self.to_dict()) + + def short_string(self): + """ create string with node information in succinct, + single-line form """ + return "%d %d %.4f %.4f %.4f %.4f %d %s %d" % (self.n, self.t, self.x, self.y, self.z, self.radius, self.parent, + str(self.children), self.tree_id); + +# Morphology nodes have the following fields. These allow dictionary access +# to node fields (this is for backward compatibility) +NODE_ID = 'id' +NODE_TYPE = 'type' +NODE_X = 'x' +NODE_Y = 'y' +NODE_Z = 'z' +NODE_R = 'radius' +NODE_PN = 'parent' +NODE_TREE_ID = 'tree_id' +NODE_CHILDREN = 'children' + diff --git a/internal/morphology/validate_swc.py b/internal/morphology/validate_swc.py new file mode 100644 index 0000000000..de0999ab09 --- /dev/null +++ b/internal/morphology/validate_swc.py @@ -0,0 +1,248 @@ +#!/usr/bin/python +import os, sys +from six.moves import xrange +import allensdk.internal.core.swc as swc + + +def resave_swc(orig_swc, new_file): + """ Reads SWC file into AllenSDK Morphology object and resaves + it. This can fix some problems in an SWC file that may disrupt + other software tools reading the file (e.g., NEURON) + + Parameters + ---------- + orig_swc: string + Name of SWC file to read + + new_file: string + Name of output SWC file + """ + try: + morphology = swc.read_swc(orig_swc) + except: + print("Failed to read SWC file '%s'" % orig_swc) + raise + try: + morphology.save(new_file) + except: + print("Failed to save SWC file '%s'" % new_file) + + +class TestNode(object): + def __init__(self, n, t, x, y, z, r, pn): + # these values correspond to columns in an SWC file + self.n = n + self.t = t + self.x = x + self.y = y + self.z = z + self.r = r + self.pn = pn + self.children = [] # IDs of child nodes + + def __str__(self): + """ create string with node information in succinct, + single-line form """ + return "%d %d %.4f %.4f %.4f %.4f %d %s" % (self.n, self.t, self.x, self.y, self.z, self.r, self.pn, str(self.children)) + + + +def validate_swc(swc_file): + """ + Tests SWC files for compatibility with AllenSDK + + To be compatible with NEURON, SWC files must have the following properties: + 1) a single root node with parent ID '-1' + 2) sequentially increasing ID numbers + 3) immediate children of the soma cannot branch + + To be compatible with feature analysis, SWC files can only have node + types in the range 1-4: + 1 = soma + 2 = axon + 3 = [basal] dendrite + 4 = apical dendrite + """ + success = True # be optimistic + + # see if SWC file is readable by internal tools + print("Validating " + swc_file) + try: + morphology = swc.read_swc(swc_file) + except: + print("Fatal error reading SWC file") + return False + + for node in morphology.node_list: + if node.t < 1 or node.t > 4: + print("Expecting type between 1 and 4, but found %d" % node.t) + print("File has unrecognized node type(s)") + print("----------------------------------") + success = False + break + + # make sure all dendrite nodes are in tree 0 + # this is because modeling requires a full dendrite morphology + for node in morphology.node_list: + if (node.t == 3 or node.t == 4) and node.tree_id != 0: + print("Dendrite node(s) exist in disconnected trees") + print("This breaks an SDK modeling requirement") + print("----------------------------------") + success = False + break + + # if we've made it here, file is OK for using Morphology class, and + # should be valid with internal processing. It may also be able + # to be convertable for NEURON use by resaving it + + nodes = [] + node_table = [] # lookup table by node num + line_num = 1 + try: + with open(swc_file, "r") as f: + for line in f: + # remove comments + if line.lstrip().startswith('#'): + continue + # read values. expected SWC format is: + # ID, type, x, y, z, rad, parent + # x, y, z and rad are floats. the others are ints + toks = line.split() + vals = TestNode( + n = int(toks[0]), + t = int(toks[1]), + x = float(toks[2]), + y = float(toks[3]), + z = float(toks[4]), + r = float(toks[5]), + pn = int(toks[6].rstrip()), + ) + # store this node + while len(nodes) <= vals.n: + nodes.append(None) + nodes[vals.n] = vals + #nodes.append(vals) + # + if vals.n < 0: + print("Negative node ID not allowed") + print("Node: " + str(vals)) + return False + while vals.n >= len(node_table): + node_table.append(None) + node_table[vals.n] = vals + # increment line number (used for error reporting only) + line_num += 1 + except: + err = "File not recognized as valid SWC file.\n" + err += "Problem parsing line %d\n" % line_num + if line is not None: + err += "Content: '%s'\n" % line + raise IOError(err) + + try: + for node in nodes: + if node is None: + continue + par = None + if node.pn >= 0: + par = node_table[node.pn] + par.children.append(node.n) + except: + print("Error reading SWC file -- fail to link child to parent") + print("Node: %s" % str(node)) + print("----------------------------------") + success = False + + # verify presence and number of soma and root nodes + num_soma_nodes = sum([ int(c is not None and c.t == 1) for c in nodes ]) + if num_soma_nodes == 0: + print("SWC must have at least one soma node. Found: %d" % num_soma_nodes) + print("----------------------------------") + success = False + elif num_soma_nodes > 1: + print("Warning: File has multiple soma nodes. This can interfere with feature analysis in some external software (e.g., vaa3d)") + print("----------------------------------") + + num_root_nodes = sum([ int(c is not None and c.pn == -1) for c in nodes ]) + # case of no root nodes covered by rule below that ID of child must + # be greater than that of parent + if num_root_nodes > 1: + print("Warning: File has multiple root nodes. This can interfere with feature analysis in some external software (e.g., vaa3d)") + print("----------------------------------") + + # get a list of all of the ids, make sure they are unique while we're at it + all_ids = set() + for node in nodes: + if node is None: + continue + iid = int(node.n) + if iid in all_ids: + print("Node ID %s is not unique." % node.n) + print("----------------------------------") + success = False + break + pid = int(node.pn) + if iid < pid: + print("Node (%d) has a smaller ID that its parent (%d)" % (iid, pid)) + print("----------------------------------") + success = False + break + all_ids.add(iid) + + # make sure that first root node is soma + for n in nodes: + if n is not None: + root = n + break + #root = nodes[0] + if root.t != 1: + # see if soma has a root + if sum([int(c is not None and c.t == 2 and c.pn == -1) for c in nodes]) == 0: + print("No soma root found in file") + print("----------------------------------") + success = False + print("First root node is not soma") + print("This should be fixable by calling resave_swc() on the file if there is a soma root in the file") + print("----------------------------------") + success = False + + # verify that children of the root have max one child + for root_child_id in root.children: + root_child = nodes[root_child_id] + num_grand_children = len(root_child.children) + if num_grand_children > 1: + print("Child of root (%s) has more than one child (%d)" % ( root_child_id, num_grand_children )) + print("----------------------------------") + success = False + + # sort the ids and make sure there are no gaps + sorted_ids = sorted(all_ids) + for i in xrange(1, len(sorted_ids)): + if sorted_ids[i] - sorted_ids[i-1] != 1: + print("Node IDs are not sequential") + print("This can be fixed by calling resave_swc() on the file") + print("----------------------------------") + success = False + return success + + + +def main(): + argc = len(sys.argv) + if argc < 1: + print("usage: python %s <swc_file> [<swc_file ...]") + print("") + print("Validate an SWC file for use with NEURON") + sys.exit(1) + try: + for i in range(1, argc): + if validate_swc(sys.argv[i]) == True: + print(" PASS") + else: + print(" FAIL") + exit(1) + except Exception as e: + print(" FAIL") + print(str(e)) + exit(1) +if __name__ == "__main__": main() diff --git a/internal/mouse_connectivity/__init__.py b/internal/mouse_connectivity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/mouse_connectivity/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9005dd399340f16a91a1cddd4a57c37887277de GIT binary patch literal 204 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsqdKdI)n>%{fN=Ki?$yajq5!{?i2l0dN zmk{!WY}0fiSaiR^P+tRnO1N3G!-!$TQB0G=Lo~zqk59W>$Wy>3NVtH>3b+FGazmgU z8JJ6?E=cE*f@V5@>4V(cLIxXg=0TTmM$T3hZ<sQ-6tN+w^4hfl6(1qg(RMcWxl)#F UR4ViRbG)pbX)9a}@4VUK3&;FBc>n+a literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__init__.py b/internal/mouse_connectivity/interval_unionize/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c537114e84af0dcfd2d63aea683a23f12344fe1 GIT binary patch literal 222 zcmYL@I|>3p42DOr5W$03=oWS&;-eKCu^SlTPSCJpX4#otSvxBaV&#==J%XK;Sw#Hd z{}S>di(ap*M0~qI6Q2!!YDqE^hql0~jq117cU3gyKi=2nSZ@OsLBj#;a0e&gTF)6$ z&lW}+xeD6n$RQQ_{7?tIqMZ&Dagalr!5(GTIhn9oLL9MRaLLh^0gW7COe0kk>u;|D eXG$i|bjHLOVv5EL^ZL=59K9_aPMZf`V)X%ok3#PN literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionize.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..350e1aa6ba00a1a71e3c13e937b66eca2f4a79ee GIT binary patch literal 1416 zcmZWpPmkO*6u0AKCOey*Zcz)AN{9oOIk0=6DpG||=^}AK!vR%D(ICr>-Pv@UKee6N zomF~3?X6#d!>%~-m2&08SK!2ZPO=&mM}B|o_xyhE`8m&yj%EZ#`RDKAZb-=AsEh-2 z@)V|h1Vj=^H7RIHDawHkQU;vqu!z!#k{^i-W%Q27NJVd1I+4LIWHI>%JjsG~vCOx* z&8u>W%JUMW{7PlGJB|Q^r!ajqMN%qB8b~UGHAZ4Gd`D7<ASb{hIh8T+i9C=q;8S@B z(UR`)Ol-%)yP0hYUgwue+is3>Cbol~(IG0P7{UA*1AhVJ^0St_B0rGdj^8jxThcN~ z-!e*G$G<|_5F}U{bY2AA0q0g%&T`&Ot#ZOSvk1G;D*dtxg<0Efvbpe_ZPe~BVvfM? z-}h%vR?n?6b|ub*Jb585M7djiUy7_MrTBWK%B@{hwJL1}w5rc{cJ)*KVr6ruzN$sG z5o-m$T7!k$oaUudrWE?Ls2Zy{98#*xL9yMg-`fh!o1xyPSb<SFsdrt>d0ys@^8}z- zEC!(oy}Gwo#*@(`^V?uC*6a*@o&agdHEC%ZwCskxVOX&T<eJ{VIu9JX4*M0L!2@y= z3_FppCR-XTe|m_>B%}nm7n3xxI?ogr#)zHm7+jt=>w>cG;-b+mul3GMz;h9r17ID~ z)kPPc=j-$IPzomoUtjZ{%+c&16FO_OaOy6o7Ed5_9?a?0{r#M8tupLN9LO0=pY)d? zv^0c9!DjgeHhHf@!@Qzir!9qMq02?!k@r{wk2Q@&nJMck^FMU8scNwXbe}?m0o^e@ z{s7&rRfdRgAjfO*=pKWBxLSITw82A^0nM!p?|2iM6Tb>p4@v1?*&ht>!gcuOX6dnY zrpa7m6yH|5DO7r7^EEWusLls<ytMs1S)XUpdvXiqROze`m&5b>Fz-p#xVmwl1Mnf~ z1l#bV{VVBBmWvphwiJbeXE)=#sAQv2PB?$v2;J|PDI8_)Ai0m^V<ev-!8f=^uqg~y zE{19GR~QHIMe#JA`1QpUqr7Z<CAh&hNTaeT>Yc$3O7D!%i5rzwMjE^d@3|Mn2lf3I Rf7=884$JIwO(0&v{sWI1Sn2=( literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionizer.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee873277b2e5972edc7512520a5010870d05b83b GIT binary patch literal 1738 zcmZuxOKT)I5SG-B>F()S?;3XVAPY{&We#f}0(%Hc$i`tqAS{8f1jK|!ZfRyZRzFr! zk3FX65bR@qgiTKQOS<NizmQW(J&%k{)Tl}&RhR0kD%CfmQG#GpfBeQofY4t~*bW~S zU&GXMARKWlQHd$WZcQYiq~{*>fP2y}0~+*az6{F&9c=U>8pC-YlX6Ih{az^3azsZM zeTVpfM>mK^VtDP*N1XhG#_`{98yaI9@nTWvqORV8Fyvy&T4{KZ8xZ5d2nDm$AUyfL z0%^hIy9%_6E1}#Er);s6b7yfocBo#$jzAQ1M2YY?=Hv!lW9q|t$bBB%V2}bH^1%(F zA&+<re83a%F}3NQd6nahamU>}g{eaz23;f2#{fY&865L+ssBVO2I-&QPrsbJ(?aP9 zn=^iV#x7X3oV>1BURRubF%i{5PwGZgItN-e^QE5rP@GLPK!4G&{G81M{3|7B@bi<x z#i3&Iq^w&lGB8q!+&~n~a(xCd%GynkPI9)`3F^36+E|IaRy@nk9y|XD5Jaw??IS(j zsl3TuAl-1>gV}?2)zslz)R8;90dC_))eW05BgVdpK!K+DypTLw8>0uT%7r$y+HORE zc9{XJK1yri4BN*$OB>avu)B5i`8`J;YVO>HDo1Yi?tTJ`4*iO5@f}+EoqtO@(s>=e z^Dyds2jJ@PwLWT?5|v4gHe>ABILmU$w9Ya$1RFHYnao@1Fb3AwLQd(BGs7~b6kBTR z$@;?j^I|rq(KZ7Q(WT<jD3+Vd{rE9h?Mn#x34TPbKDvi)Uo&@T+;Ab<A!|UGp;cf2 z8^?F>YA+{-bWqdZqF;WTkX5)EbRj3_NF8%;6;(d>SCR3$@EWheZgA^E9Q-@7io39j zdGHE#5%3T=0X_g8+y-6jEWiKoXOJLT(c7y}XTq4GnjKARRWf4)Kic9ws$0{vM!6Sa zeJQ5K1_~l#XsV5BbJHr372GCsQ5L$H3nlD9Q9_Mp@J0%u;cy(<fvjgUxWW2G1(&$; zvmQIsHeB1cA#32t@NuFJ;EawGyVw=FR?pmCx~OGaf?Y_Pph?Ltv!=KdQqy?rt)`wX zI3;bRT$Nc5tUt`y)27x2Dh<k4|98dbpsrp15b;TZ4@rbW;^T;<IC39>bbfX(o&ReF zdd8b^WTPyr7`U3*B+JU0x6-ZCEPLNFxj7m3wO9%>uX$gOY6Q2dLr0!F;=0Wqah0M5 zK%AO(Qskup!Koi5{r>pC-8OCelw``a0`&n98&BIRH+3zw9p*JO9_TN1rIl*{76NwJ z=Ys}STS7-6RYMQ^uC(8IlyX%HO<=zPx$f9sz2|1{b^q|AS8L>7x!TdLJ*{Jz;*_|! Grry7pqtEXE literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/data_utilities.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/data_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c274e431fae9850d4d6acb65af4a367b2b888e4 GIT binary patch literal 3200 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 F^Ka}VaUK8w literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/interval_unionizer.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/interval_unionizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a2d15c632f697c387dd5c14310f8db3b4eeae94 GIT binary patch literal 7683 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 LbledtHmv^wo9`zs literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_cav.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_cav.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a4df7dd81add57b382ada58ab7df85a76174a2e GIT binary patch literal 2265 zcmZ`)OOG2x5S|&2U*qTQW;eSefw>VMa1d~cA_OEy6d{rbsbw_kxZB>z&MVzL&f1KT z&~lB$nUf>9@Q=`3xsbnrIPmq@V>=MM>e=qEs;ld(s;>T`({T*^qF;WXUt{)%UX(uz zlg}_D!-pBn42;kurm5#vU=a)dD?uf+iM_$9qz23m>S2R43alD5Lx(tFi?oV$Eog@w z(%I;DNsrZ8<41$^nf1sRG+*N+V_@bD=FfcT$I(M9n!e%!Ba~P;kNhwR_+!EOz{-!N zTzNDabE#tC`OFJxlJ_+@i-R=eo*dJFV_W+^ojr+Q&|h#dHuW+1busD~_c7$}K$WpF znfVGFm6d_znQ>(<%>u1x6qtQxu<8wi)sBp%RY>ZqN@l%U@6!7lSR1T)X6#{3fno0+ z)+(^}7PD7X?CYHAQ@S{%2Z^<;sM?jWv@?5E&k7&DuPA%f*y!~2?qxNru9`rd4SKM( z*;4IQC#$jo0he0g@gYvGtv$K?M0K<3mHEK<_V&nH)|ZV!;|Ln{wMN!>*30Z?I4P@U z^?SzizrR_>=~@vH``H2PAG4E}*0Ndby<WtxwmQt3nF$7K^mKzBWlebOsB5r!3=M-J z0-2T7*x5@P9=0|T&E-u=`_j$Y@bh%pVee!ecH^FrwN@utM_c~MeE#dkubZoix}LSJ zkdeZ}7Aou3!^KHRFZ^igmgVC5%+=-MNF~y-N(GmTTjMxPQl-__1>_b5<WA@q1x5}8 zpK!rZZ=Ou(7;65X6~lOqVJyzxvctXWe)r*WalGB<%5$3VHB5S2*el@0^)29T?3V`o zkWO(Z?g5vm^EI6J{sogBjiOjlg+lids?Lcs6}T08DoK-3MR7yq1!;}x%ws%~zM2z9 zrlFVkmpqV*(~w@e>$#h7fhYh5iRI!z#-a!e2)R@UI$wOWi&nb1Thg6~ICPmW_*eyV z1iSEuv$ZApcwiDI5ugHVoGso@M4ZqmJVwa1f3Avm8QROtTNR)B0Yz`1fxA6_P!YPL z<?a0jkUOANQmoyM;)oB3bIwCwCg(_KnRmFU*_Fmzkcb77gVVeo#M3E!%xyoK#G<N? zs9_RPm0K(&y&$Fxov4hy&~1erO0Lqx^CLJpqk-;Dq^G;nUikA`nt(VbT`kz9BCk$h z6V{`I*cAQ?U1h|cfO2l@@S%AYVfIRY$x#_izQrUt*?}tdwjs;yz?X^~C$Ut}Kns<- zO?izb36EG_33xQ<6335lEj*ndU1M+bThY?NaCY2Dvvf$1j`XJym=^^jMO&+y7r8kj z9YJ604kXR3W28Th;|tFAge9`oK^pKL{AP%oF!<Nc_wSCL;BLqfJ*RB=l)j+ReDrxl z$8p5y$0Hui<R}IoImS0m&gXLUrT=t<>gONe9$(;YVQ&Dgl3m;>(gmmQgmEgl2O|-R z84r@0uVp%wCB-`;jXdQ`ney>m?c%OeJWS?!1#<n&$gl7*EXQnP^v%9?&BUK|YSm1~ zw5&t(6r-;PP{-_UG#$t-Q;)q_#W5R&1@SIy4i0k1^Cqe8V4f%Rt1UYC<Q3^}il!Q+ zVKNs-K*?FjbBNmJLs>khp2B-7Y%PE9e+dOtN`G9`zNl%{2U}BR$cFz7*>GF^WyprQ z`pbn_-;{3Ao6va!U!lc`KI|9liVW|4Zb6VY?u9W+1OBOg$fee8BO-09VYRKkiFxH8 D!$Y(0 literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_classic.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_classic.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7a6ef0133898a02081013ac6b0e159aa1851bf1 GIT binary patch literal 3441 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 literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionize_record.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionize_record.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1517d7803b17df272d4763b3c8225fd304680836 GIT binary patch literal 4877 zcmbVQ&yU;273Po<Mg7=adA)YMj+5}vxKR_Y9i%{tz%`sWa1f+e1a*x9#J22MGtzRG zBIOxMyAtF>VYlg}r=EJV(Nq7O9(im}{ugrU_l6Xut=EQI3NxJd=FQCGyl>unqc1l$ zS{9z<?|<NTu2|N;iC8{0H14A4160BiEVf20V2s*!YzMY^J3&o2q88UjZs0QOYfIFH z`^*xqbe}pw19U@ppgq|D?SXEJ7U-6to5Frz_1Z77g4JWWC!%Sjqcqun$x6<{1Y|Uq zeG*wdr1V`BeIJ#y0wye|!-P$$kOH(QEi`Nej%bU{GYe{75}RV{84K#7D=vWJifwTb z?}pfc5|{JKzmBw?$o?#oUve#%E9Wge8HMBMRK_~LWZEh{lKl*dE!pp##}1<;lZlS9 zS-v&mr{Ofk6krN@nqOEkL@Bd9UQN5?U0CDEM5^H|-&td=7PuxN1(m|{^w9am>I+sn z^=XIcu~F(M_fWKt>h$WuI<mg9e%pP*GPbZ5Ot7a8vmSfDf#tDP&Rl%qPfEl1ST|L| z#}Xs1qIr}I{q&KRYRYMcv_DYk$mf1mZLZ()%V+f|zC0aE6^&$)RlSNd-0#_WGYoZ{ zW;zV>hL#!6G6il;%XpAG$8z=$OYK1PhriwX{NN#0)(8BMi@itugeS9uFB0BQ6Tv?{ zkjYdZq+{%NA9XrDoauvKMvo3)B6(xX`^S7JF*c4NA&zg-?y7{xH%IA2%Mg<!Wc4Ww zTJ%kM94@!v=IZ+@URZ3+-guUKA$C5>!teqV)pWG1dWX&5KOb^?OX>T4heYwvo60>D zouOK=8mvT?`V1xv3mVosVuog>-v(_P+BUQU+A*}VU`I7jwPU6Z=)GVe(RIA*3tNqi zybF$N<lO~><r%*QqdXi7o=KnkDowK!4&yI(!9R(zLm$1oFne|w=~ZX39hH5n#&=xt zk;G=}iglxUDi%-rQfI01KljhywMvrEbrQv~|48~1qpLX6R}sIG*+eC;tXlQI{gTy? zUPHOCj%rZlQME-Cc`VhWY7<q@QQLS0-g1G!10rW3pl6U=RF@!<H*rSBe2D$N3Q`l! zt<5eoKfA*`=GisYwdb$dlf7#A`AGU1rh|>)-H&VPR>qzKCoh1a5cmM!*+nnm0$6hv z1(KY?2k?)8g!}Mjes(B*<J<gn;189At~&Ee7v@I^1lCZXeLaR};IS{#5s#8;=c>lr z!J(W#<Vx`wFo6?Jt!fqm!TmVpnU7;Sk=o}<mP$pS;B5+}s{wI(f@yH*D-KOz+%<i~ zU;;o5VmKc-V)3!BQ<X`9S!sEExX!rB$oZMAsOG2|r8lb^WaM@-4qUE=2m=Ky2p~&X zY@GSF+<|8Q4T}x<!LW)UpJA{juvwiJK+&=1KR*A6?423bC$~=zftA|iVDyKu>z|j9 zxQ-Sh>K*Vx8!e}zYSd?dbEo7pBUS(28kku8%md&3%6iJ4)M?bh-mw;SQM*m^H%h8* zC{|Lgp*%=6Osi?;|L20%YVMK_&8&6QCThqQ4n_IDI8WTHvv395#Y&L3)xQKAqE(b3 z`jhUGqBn60c^b1|Myu9s3%vF&jzY!j7~aMi-X?f;vGohoaEM)=V!OVk*i0@_AcjqW zioyfJSDk@=g@vl|c2G|z*?5B3jt~Wag^^AP?~@T0>sM0|SijLJ{3y6|#z>ZcspLQ^ z3Fm2;lCV6A`U;`B8aqv6%ogfCkL7Eoeqj0ryiXo@#K&Wry-14uEM3m{yHBe*aU6!g zs6OOln$w(<8*y|jNvHFae_$kERk)h5YM7(+O8#<@z>6f-ir}+M?gF?h*i(44zuJ#$ z4~irKS!M%zl{tjHcPnSdJ!ahT%Ip5nx-Fu9)=x*{JHMxCDMxax`6sVARfU1}ZpSHh zN#EI9jn3U-Z-Xmkg0@O|kPp(X2kSXr!7?EuXZLzGvesy%^EwhNse*QO;KNfzXLX%3 zdr3;JbLPgg^fuN4QX3*gRO(P`gQ_l76qSldWr7rKW3Vwv6rWZptAn%%(ai*|?N=cg zbk<Q6bk^;UTn*kbcZ*ShJDP^$RGa-??mY!N^#Q7HQS?tyS(`1k$u@1&_KuAfel1WP zwuA7uZFlV*w04+l&)<EcUG{tIe$S&6EJ2!qB(fETqf|^{YInl$@r1`kPq7!5v9|gV zRTOfKQfuy)BCs;rlE<Xo(zJt~?K1Ooyk_fNZ%0vYAEkQ8Ja<t{3}3&r;0odh2hOCH zzq9&~Z<6wkvAl=$P1cAB=uNZVqsjh+YGFMG&=>Z?dEq>9Ob~aB7elDtwO-iIofjsI zpXotpuX^ex@v}nrj6`isq5)r9-?hq_JgnFRhtdP~!lo-B)OYs{((>(Ssd_k2a2U7+ z1Q%AkGPniZ6|1<~1n;jnuU=RXw0o_*qvNPAi=eL+!8G?qlQ@gU@ho>RY7OiL)2kGW zjM=LdCw-R&)()fLVcsTRy`0b(x3X~F#BuIV5cA~>12j!&0gYGLRU}?l(VBno27~QY zqxZ4yb&OR%q3T1bZc(*bu3A&|&~bude2!-u`hUjJwUt`mRkz9tNCX~wDC|=)K=KgB zUI!$=!hyL7OfdJ8dTDwBM9n}8078aXU(}B3Kd0MB9V6UQ3RiLh(qbjuFwzZ3H;goB zqytvyof!rBGozYjR1>3`W)u<utl$EI<;+hhZ*3c?Hl*4{s%_>Zjg1ya6-YDuK>!W{ z{S~Z%WWaik1Y!-!-o7Fi6kO(f8p_jtJfVLjDmWJ)GtQL!Xi)qsK>rX__iMn_xM;ZF zk04S&wH2qs2&f2CIP+yYNi%hWM9jV6V``C63YSdq&FcfoV+;3eP+WLnMJQH#RNX`s zG^3;P#u+$?JPkIG_(mcu&)XW<jQ1h{evhKBp)#npw{ekp55Co-+P;j^g@2u2e-oJg zKahWdCI3i^lT!r9iN@)MV;)R!C4*yD)RQ-`Nke2BK^+;xcxHAn*jnB;%db`B5RJbz ihs8{`_O;c~%Dvl#+rI;-Tbe9~3zY5I9jBXgH~#~O;Lr;I literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionizer.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ea9d4cb39d7191e29cf5e8cf369244ffd183c34 GIT binary patch literal 3094 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 literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/unionize_record.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/unionize_record.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2924428d582160aab4c99f0b3d9d6402a603c7ca GIT binary patch literal 1747 zcmb_cPmdcl6t`z4*-195(v~8)pt+%u+F2wns9LRBXoZl_f&{%pL6&1X*=d|{YJ0Mq zXnUZ$ReR#XN8rSV;S0=_6JMbx-kaG>wy;zjc#)r9=K1~m`8|KJx7Q~?#jii{-$O$F zz&{&`KzIPlCBP(+RFgR!QcAueGLYc~k)aCC!(k|+?@8ME6HbwoR=wOS3v2EKe%Vj} z!UI_Db6|=LsU*WdQn0Rl4I>%J&IK8EWLNIM-j%WJ!M-E=au@bk4j{^26+bC*Q{-#4 z&K{1Pw_NyS%$-Vv=FTM(W0UgoL}HaNR=TX800|0#k)Te3^0%-YmhZ_qc>(!=e|iKJ z+&(h?>-j>fxhlMpkF7N}4Xem0J*gsYr>^SGPH_K?*ccqV`T5KHqbE*TH{!=!W@CQB zi`D31!G$R#|7@g+r5l-rDx3gr7RM_$`X(Qb9N=_s!NrVE71(MGC**8Dhp@KbdVg+8 zrx-XXl<@g7_p3&?<eF`&+}{YSDK}fJs+h67$US42okQpeUEkawmu<BF84`=VkcPGc zo9!aoL5AKN)&r^P39dz{xmN@Dy9s-%4cn>(UI7yNd)HMoaXWR~VayAmoHuqD1BxpK zaJ?g!g*6L4g<Rf)82`+rRsYWzbWQ0OrGNiQ&>JlPjZPq#NVp>sxZH=pUXfRH0z)B# zi`bL1@SHv(=M>s9<UasRk58L+=ZVv~P|3uadE(SkS*{bV^J$@E!mZ^iS9d&ieJgy& zEuSmstF7){OYJFbPLlfx^k4f0ojA{}Pt2r=dl&RVmo8tb_SA7cJ-)_J74nLiI{mwu z<esx8W3ZOFcsuS)tsE4jk|npf^0{*84UIDRq)YgZT4yYb>D^=kt>+bj(B_5N<N1Gu z<*n<-cD#+3@iDNRoRJ?t7zNMi^WZFaO<$9j!AInb{t`Tc_io$!@G=D1rxl%5beRTK zgiur=0J)uvH~j;wO_=%O@Ducp6WJx}wC#-gLNAfX4zz($afjK~Dy0@}(x@51TOiw; zz=pe5AglwXL9MX$k$Nl#SDj;<HPdioedpTnM`;h=j{>@dv8vD5+{jX+JYeiu$@QgX zhcRgcV-}xKyNe9R-tHm8{@+5hMZ#jQW8XVG8wXJkN6oL+9Hmhey8N^*w(6SkQ+W4k T&2`SI_@K${5Z{oxszLY{m%yC0 literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/interval_unionize/cav_unionize.py b/internal/mouse_connectivity/interval_unionize/cav_unionize.py new file mode 100644 index 0000000000..5b4881764d --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/cav_unionize.py @@ -0,0 +1,34 @@ +from __future__ import division + +import numpy as np + +from unionize_record import Unionize + + +class CavUnionize(Unionize): + + __slots__ = ['sum_pixels', 'sum_cav_pixels'] + + def __init__(self, *args, **kwargs): + for key in self.__slots__: + setattr(self, key, 0) + + + def calculate(self, low, high, data_arrays): + data_arrays = self.slice_arrays(low, high, data_arrays) + + self.sum_pixels = data_arrays['sum_pixels'].sum() + self.sum_cav_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['cav_density']).sum() + + + def propagate(self, ancestor): + ancestor.sum_pixels += self.sum_pixels + ancestor.sum_cav_pixels += self.sum_cav_pixels + return ancestor + + + def output(self, volume_scale, max_pixels): + return {'structure_volume': self.sum_pixels * volume_scale / max_pixels, + 'signal_volume': self.sum_cav_pixels * volume_scale / max_pixels, + 'signal_density': self.sum_cav_pixels / self.sum_pixels if self.sum_pixels > 0 else 0} + diff --git a/internal/mouse_connectivity/interval_unionize/cav_unionizer.py b/internal/mouse_connectivity/interval_unionize/cav_unionizer.py new file mode 100644 index 0000000000..55959e7dd1 --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/cav_unionizer.py @@ -0,0 +1,56 @@ +from __future__ import division +import logging +import functools +from collections import defaultdict +from six import iteritems + +import numpy as np + +from interval_unionizer import IntervalUnionizer +from cav_unionize import CavUnionize + + +class CavUnionizer(IntervalUnionizer): + + + @classmethod + def record_cb(cls): + return CavUnionize() + + + @classmethod + def propagate_record(cls, child_record, ancestor_record, copy_all=False): + return child_record.propagate(ancestor_record) + + + def extract_data(self, data_arrays, low, high): + '''As parent + ''' + + unionize = self.__class__.record_cb() + unionize.calculate(low, high, data_arrays) + + return unionize + + + def postprocess_unionizes(self, raw_unionizes, image_series_id, volume_scale, max_pixels): + + unionizes = [] + + logging.info('getting formatted unionize output') + for sid, un in iteritems(raw_unionizes): + + if sid < 0: + hemisphere = 'left' + else: + hemisphere = 'right' + sid = abs(sid) + + out = un.output(volume_scale, max_pixels) + out['structure_id'] = sid + out['hemisphere'] = hemisphere + out['image_series_id'] = image_series_id + + unionizes.append(out) + + return unionizes diff --git a/internal/mouse_connectivity/interval_unionize/data_utilities.py b/internal/mouse_connectivity/interval_unionize/data_utilities.py new file mode 100644 index 0000000000..89e5c123c8 --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/data_utilities.py @@ -0,0 +1,104 @@ +import logging + +#import SimpleITK as sitk +import nrrd +import numpy as np + +#def read(path): +# return np.swapaxes(sitk.GetArrayFromImage(sitk.ReadImage(str(path))), 0, 2) + +def read(path): + return np.ascontiguousarray(nrrd.read(path)[0]) + + + +def load_annotation(annotation_path, data_mask_path=None): + '''Read data files segmenting the reference space into regions of valid + and invalid data, then further among brain structures + ''' + + logging.info('getting annotation') + annotation = read(annotation_path) + + logging.info('casting to signed') + # It shouldn't matter now, but there may be future structures with ids + # sufficiently large that we need that extra bit + logging.debug('max annotated value: {0}'.format(np.amax(annotation))) + annotation = annotation.astype(np.int32) + logging.debug('max annotated value: {0}'.format(np.amax(annotation))) + + logging.info('negating left hemisphere') + logging.debug('min annotated value: {0}'.format(np.amin(annotation))) + lr_mid = int( np.round(annotation.shape[2] / 2) ) + annotation[:, :, :lr_mid] = annotation[:, :, :lr_mid] * -1 + logging.debug('min annotated value: {0}'.format(np.amin(annotation))) + + if data_mask_path is not None: + logging.info('getting_data_mask') + data_mask =read(data_mask_path) + + logging.info('applying data mask') + annotation[np.logical_not(data_mask)] = 0 + + return annotation + + +def get_sum_pixels(sum_pixels_path): + logging.info('getting sum_pixels') + return {'sum_pixels': read(sum_pixels_path)} + + +def get_sum_pixel_intensities(sum_pixel_intensities_path, injection_sum_pixel_intensities_path): + logging.info('getting sum pixel intensities') + return {'sum_pixel_intensities': read(sum_pixel_intensities_path), + 'injection_sum_pixel_intensities': read(injection_sum_pixel_intensities_path)} + + +def get_cav_density(cav_density_path): + logging.info('getting cav density') + return {'cav_density': read(cav_density_path)} + + +def get_injection_data(injection_fraction_path, injection_density_path, + injection_energy_path): + '''Read nrrd files containing injection signal data + ''' + + logging.info('getting injection_fraction') + injection_fraction = read(injection_fraction_path) + + logging.info('getting injection_sum_projecting_pixels') + injection_density = read(injection_density_path) + + logging.info('getting injection_energy') + injection_energy = read(injection_energy_path) + + return {'injection_fraction': injection_fraction, + 'injection_density': injection_density, + 'injection_energy': injection_energy} + + +def get_projection_data(projection_density_path, projection_energy_path, + aav_exclusion_fraction_path=None): + '''Read nrrd files containing global signal data + ''' + + logging.info('getting projection density') + projection_density = read(projection_density_path) + + logging.info('getting projection energy') + projection_energy = read(projection_energy_path) + + try: + logging.info('getting aav exclusion fraction') + aav_exclusion_fraction = read(aav_exclusion_fraction_path) + aav_exclusion_fraction[aav_exclusion_fraction > 0] = 1 + aav_exclusion_fraction = aav_exclusion_fraction.astype(np.bool_, order='C') + + except (IOError, OSError, RuntimeError): + logging.info('skipping aav exclusion fraction') + aav_exclusion_fraction = np.zeros(projection_density.shape, dtype=np.bool_, order='C') + + return {'projection_density': projection_density, + 'projection_energy': projection_energy, + 'aav_exclusion_fraction': aav_exclusion_fraction} diff --git a/internal/mouse_connectivity/interval_unionize/interval_unionizer.py b/internal/mouse_connectivity/interval_unionize/interval_unionizer.py new file mode 100644 index 0000000000..121454c8ea --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/interval_unionizer.py @@ -0,0 +1,222 @@ +from __future__ import division +import logging +import functools +from collections import defaultdict +import copy as cp + +import numpy as np +from six import iteritems + + + +class IntervalUnionizer(object): + + + @classmethod + def record_cb(cls): + return defaultdict(lambda *a, **k: 0, {}) + + + def __init__(self, exclude_structure_ids=None): + '''Builds unionize records from grid data. Unionize records are + summaries of experimental observations occuring in a particular + spatial domain. Domains are generally specified by the intersection of + + 1. a brain structure + 2. an injection polygon (or its inverse) + 3. the left or right side of the brain + + Parameters + ---------- + exclude_structure_ids : list of int, optional + Don't generate records for these structures. Defaults to [0], + which excludes everything not in the brain. + + ''' + + if exclude_structure_ids is None: + exclude_structure_ids = [0] + self.exclude_structure_ids = exclude_structure_ids + + + def setup_interval_map(self, annotation): + '''Build a map from structure ids to intervals in the sorted flattened + reference space. + + Parameters + ---------- + annotation : np.ndarray + Segmentation label array. + + ''' + + logging.info('getting flat annotation') + flat_annot = annotation.flat + + logging.info('finding sort') + self.sort = np.argsort(flat_annot) + + logging.info('sorting flat annotation') + flat_annot = flat_annot[self.sort] + + logging.info('finding bounds') + diff = np.diff(flat_annot) + bounds = np.nonzero(diff)[0] + uniques = [ flat_annot[ii] for ii in bounds ] + [flat_annot[-1]] + + logging.info('building map') + lower_bounds = [0] + (bounds + 1).tolist() + upper_bounds = (bounds + 1).tolist() + [len(flat_annot)] + self.interval_map = {sid: item for sid, item + in zip(uniques, zip(lower_bounds, upper_bounds)) + if sid not in self.exclude_structure_ids} + + + def extract_data(self, data_arrays, low, high, **kwargs): + '''Given flattened data arrays and a specified interval, generate + summary data + + Parameters + ---------- + data_arrays : dict + Keys identify types of data volume. Values are flattened, sorted + arrays. + low : int + Index at which interval of interest begins. Inclusive. + high : int + Index at which interval of interest ends. Exclusive. + + ''' + + raise NotImplementedError('specify in subclass!') + + + @classmethod + def propagate_record(cls, child_record, ancestor_record, copy_all=False): + '''Updates one unionize corresponding to a rootward structure with + information from a unionize corresponding to a leafward structure + + Parameters + ---------- + child_record : unionize + Data will be drawn from this record + ancestor_record : unionize + This record will be updated + + ''' + + raise NotImplementedError('specify in subclass!') + + + @classmethod + def propagate_unionizes(cls, direct_unionizes, ancestor_id_map): + '''Structures are arranged in a tree, whose leafward-oriented edges + indicate physical containment. This method updates rootward unionize + records with information from leafward ones. + + Parameters + ---------- + direct_unionizes : list of unionizes + Each entry is a unionize record produced from a collection of + directly labeled voxels in the segmentation volume. + ancestor_id_map : dict + Keys are structure ids. Values are ids of all structures rootward in + the tree, including the key node + + Returns + ------- + output_unionizes : list of unionizes + Contains completed unionize records at all depths in the structure + tree + + ''' + + + output_unionizes = defaultdict(cls.record_cb, cp.deepcopy(direct_unionizes)) + for k, v in iteritems(direct_unionizes): + for aid in ancestor_id_map[k]: + + if k == aid: + continue + + logging.debug('propagating data from {0} to {1}'.format(k, aid)) + output_unionizes[aid] = cls.propagate_record(v, output_unionizes[aid]) + + return output_unionizes + + + @classmethod + def propagate_to_bilateral(cls, lateral_unionizes): + + bilateral = defaultdict(cls.record_cb, {}) + for sid in list(lateral_unionizes.keys()): + unionize = lateral_unionizes[sid] + other_id = -1 * sid + + if (sid in bilateral) or (other_id in bilateral): + continue + + logging.debug('bilateralizing structure {0}'.format(sid)) + other = lateral_unionizes[other_id] + + bilateral[sid] = cls.propagate_record(unionize, bilateral[sid], True) + bilateral[sid] = cls.propagate_record(other, bilateral[sid], True) + + return bilateral + + + + def postprocess_unionizes(self, raw_unionizes, **kwargs): + '''Carry out additional calculations/formatting derivative of core + unionization. + + Parameters + ---------- + raw_unionizes : list of unionizes + Each entry is a unionize record. + + ''' + raise NotImplementedError('specify in subclass!') + + + def sort_data_arrays(self, data_arrays): + '''Apply the precomputed sort to flattened data arrays + + Parameters + ---------- + data_arrays : dict + Keys identify types of data volume. Values are flattened, unsorted + arrays. + + Returns + ------- + dict : + As input, but values are sorted + + ''' + + logging.info('sorting data arrays') + return {k: v[self.sort] for k, v in iteritems(data_arrays)} + + + def direct_unionize(self, data_arrays, pre_sorted=False, **kwargs): + '''Obtain unionize records from directly annotated regions. + + Parameters + ---------- + data_arrays : dict + Keys identify types of data volume. Values are flattened arrays. + sorted : bool, optional + If False, data arrays will be sorted. + + ''' + + if not pre_sorted: + data_arrays = self.sort_data_arrays(data_arrays) + + unionizes = {} + for sid, (low, high) in iteritems(self.interval_map): + logging.debug( 'unionizing structure {0} :: voxel_count={1}'.format(sid, high - low) ) + unionizes[sid] = self.extract_data(data_arrays, low, high, **kwargs) + + return unionizes diff --git a/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py b/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py new file mode 100644 index 0000000000..7735b59042 --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py @@ -0,0 +1,70 @@ +from __future__ import division +import logging +from six import iteritems + +import numpy as np + +from allensdk.core.simple_tree import SimpleTree + +from run_tissuecyte_unionize_classic import get_ancestor_id_map, get_volume_scale +from allensdk.internal.mouse_connectivity.interval_unionize.cav_unionizer import CavUnionizer +import data_utilities as du + + +def run(input_data): + + logging.info('making ancestor id map') + ancestor_id_map = get_ancestor_id_map(input_data['structures']) + + logging.info('computing volume scale factor') + volume_scale = (input_data['reference_spacing'] / 10 ** 3) ** 3 # mum3 -> mm3 + logging.info('volume scale factor : {0}'.format(volume_scale)) + + logging.info('reference shape : {0}'.format(input_data['reference_shape'])) + logging.info('reference spacing : {0}'.format(input_data['reference_spacing'])) + logging.info('image_series_id : {0}'.format(input_data['image_series_id'])) + + annotation = du.load_annotation(input_data['annotation_path'], input_data['grid_paths']['data_mask']) + + unionizer = CavUnionizer() + unionizer.setup_interval_map(annotation) + del annotation + + signal_arrays = du.get_cav_density(input_data['grid_paths']['cav_density']) + signal_arrays.update(du.get_sum_pixels(input_data['grid_paths']['sum_pixels'])) + + max_pixels = float(np.amax(signal_arrays['sum_pixels'])) + logging.info('max pixels per voxel: {}'.format(max_pixels)) + + for k, v in iteritems(signal_arrays): + logging.info('sorting {0} array'.format(k)) + signal_arrays[k] = v.flat[unionizer.sort] + + logging.info('computing unionizes from directly annotated voxels') + raw_unionizes = unionizer.direct_unionize(signal_arrays, pre_sorted=True) + + logging.info('propagating data to ancestor structures') + raw_unionizes = CavUnionizer.propagate_unionizes(raw_unionizes, ancestor_id_map) + + logging.info('propagating data to bilateral unionizes') + bilateral = CavUnionizer.propagate_to_bilateral(raw_unionizes) + + cooked_unionizes = list(unionizer.postprocess_unionizes( + raw_unionizes, + image_series_id=input_data['image_series_id'], + volume_scale=volume_scale, + max_pixels=max_pixels + )) + cooked_bilateral = list(unionizer.postprocess_unionizes( + bilateral, + image_series_id=input_data['image_series_id'], + volume_scale=volume_scale, + max_pixels=max_pixels + )) + + for item in cooked_bilateral: + item['hemisphere'] = '(none)' + cooked_unionizes.append(item) + + logging.info('computed {0} unionize records'.format(len(cooked_unionizes))) + return cooked_unionizes diff --git a/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py b/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py new file mode 100644 index 0000000000..fd601f32ff --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py @@ -0,0 +1,92 @@ +import logging + +from allensdk.core.simple_tree import SimpleTree + +from allensdk.internal.mouse_connectivity.interval_unionize.tissuecyte_unionizer import TissuecyteUnionizer +import allensdk.internal.mouse_connectivity.interval_unionize.data_utilities as du + + +def get_ancestor_id_map(structures): + + + tree = SimpleTree( structures, + lambda st: int(st['id']), + lambda st: st['parent_structure_id']) + ancestor_id_map = tree.value_map( lambda st: st['id'], + lambda st: tree.ancestor_ids([st['id']])[0] ) + for k in list(ancestor_id_map): + ancestor_id_map[-k] = map(lambda x: -x, ancestor_id_map[k]) + + return ancestor_id_map + + +def get_volume_scale(image_resolution, voxel_depth): + return image_resolution ** 2 * 10 ** -9 * voxel_depth + + +def run(input_data): + + logging.info('making ancestor id map') + ancestor_id_map = get_ancestor_id_map(input_data['structures']) + + logging.info('computing volume scale factor') + volume_scale = get_volume_scale(input_data['image_resolution'], input_data['reference_spacing']) + logging.info('volume scale factor : {0}'.format(volume_scale)) + + logging.info('reference shape : {0}'.format(input_data['reference_shape'])) + logging.info('reference spacing : {0}'.format(input_data['reference_spacing'])) + logging.info('image_series_id : {0}'.format(input_data['image_series_id'])) + + annotation = du.load_annotation(input_data['annotation_path'], input_data['grid_paths']['data_mask']) + + unionizer = TissuecyteUnionizer() + unionizer.setup_interval_map(annotation) + del annotation + + signal_arrays = du.get_injection_data(input_data['grid_paths']['injection_fraction'], + input_data['grid_paths']['injection_density'], + input_data['grid_paths']['injection_energy']) + signal_arrays.update(du.get_projection_data(input_data['grid_paths']['projection_density'], + input_data['grid_paths']['projection_energy'], + input_data['grid_paths']['aav_exclusion_fraction'])) + signal_arrays.update(du.get_sum_pixels(input_data['grid_paths']['sum_pixels'])) + signal_arrays.update(du.get_sum_pixel_intensities(input_data['grid_paths']['sum_pixel_intensities'], + input_data['grid_paths']['injection_sum_pixel_intensities'])) + + for k, v in signal_arrays.items(): + logging.info('sorting {0} array'.format(k)) + signal_arrays[k] = v.flat[unionizer.sort] + + logging.info('computing unionizes from directly annotated voxels') + raw_unionizes = unionizer.direct_unionize(signal_arrays, pre_sorted=True) + + logging.info('propagating data to ancestor structures') + raw_unionizes = TissuecyteUnionizer.propagate_unionizes(raw_unionizes, + ancestor_id_map) + + logging.info('propagating data to bilateral unionizes') + bilateral = TissuecyteUnionizer.propagate_to_bilateral(raw_unionizes) + + cooked_unionizes = list(unionizer.postprocess_unionizes( + raw_unionizes, + image_series_id=input_data['image_series_id'], + output_spacing_iso=input_data['reference_spacing'], + volume_scale=volume_scale, + target_shape=input_data['reference_shape'], + sort=unionizer.sort + )) + + cooked_bilateral = list(unionizer.postprocess_unionizes( + bilateral, + image_series_id=input_data['image_series_id'], + output_spacing_iso=input_data['reference_spacing'], + volume_scale=volume_scale, + target_shape=input_data['reference_shape'], + sort=unionizer.sort + )) + for item in cooked_bilateral: + item['hemisphere_id'] = 3 + cooked_unionizes.append(item) + + logging.info('computed {0} unionize records'.format(len(cooked_unionizes))) + return cooked_unionizes diff --git a/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py b/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py new file mode 100644 index 0000000000..d9e4de96a8 --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py @@ -0,0 +1,155 @@ +from __future__ import division +import logging + +import numpy as np + +from .unionize_record import Unionize + + +class TissuecyteBaseUnionize(Unionize): + + __slots__ = ['sum_pixels', 'sum_projection_pixels', 'sum_projection_pixel_intensity', + 'max_voxel_index', 'max_voxel_density', 'projection_density', + 'projection_energy', 'projection_intensity', 'direct_sum_projection_pixels', + 'sum_pixel_intensity'] + + + def __init__(self): + '''A unionize record summarizing observations from a tissuecyte + projection experiment + ''' + + for key in self.__slots__: + setattr(self, key, 0) + + + def propagate(self, ancestor, copy_all=False): + '''Update a rootward unionize with data from this unionize record + + Parameters + ---------- + ancestor : TissuecyteBaseUnionize + will be updated + + Returns + ------- + ancestor : TissuecyteBaseUnionize + + ''' + + ancestor.sum_pixels += self.sum_pixels + ancestor.sum_projection_pixels += self.sum_projection_pixels + ancestor.sum_projection_pixel_intensity += self.sum_projection_pixel_intensity + ancestor.sum_pixel_intensity += self.sum_pixel_intensity + + if ancestor.max_voxel_density <= self.max_voxel_density: + ancestor.max_voxel_density = self.max_voxel_density + ancestor.max_voxel_index = self.max_voxel_index + + if copy_all: + ancestor.direct_sum_projection_pixels += self.direct_sum_projection_pixels + + return ancestor + + + def set_max_voxel(self, density_array, low): + '''Find the voxel of greatest density in this unionizes spatial domain + + Parameters + ---------- + density_array : ndarray + Float values are densities per voxel + low : int + index in full flattened, sorted array of starting voxel + + ''' + + if self.sum_projection_pixels > 0: + + self.max_voxel_index = np.argmax(density_array) + self.max_voxel_density = density_array[self.max_voxel_index] + + self.max_voxel_index += low + + + def output(self, output_spacing_iso, volume_scale, target_shape, sort): + '''Generate derived data for this unionize + + Parameters + ---------- + output_spacing_iso : numeric + Isometric spacing of reference space in microns + volume_scale : numeric + Scale factor mapping pixels to microns^3 + target_shape : array-like of numeric + Shape of reference space + + ''' + + if self.sum_pixels > 0: + self.projection_density = self.sum_projection_pixels / self.sum_pixels + self.projection_energy = self.sum_projection_pixel_intensity / self.sum_pixels + + if self.sum_projection_pixels > 0: + self.projection_intensity = self.sum_projection_pixel_intensity / self.sum_projection_pixels + + output = {k: getattr(self, k) for k in self.__slots__} + + output['volume'] = self.sum_pixels * volume_scale + output['direct_projection_volume'] = self.direct_sum_projection_pixels * volume_scale + output['projection_volume'] = self.sum_projection_pixels * volume_scale + output['sum_pixel_intensity'] = self.sum_pixel_intensity + + if self.max_voxel_index > 0: + self.max_voxel_index = sort[self.max_voxel_index] + mv_pos = np.unravel_index([self.max_voxel_index], dims=target_shape, order='C') + if len(mv_pos[0]) == 0: + mv_pos = [[0], [0], [0]] + else: + mv_pos = [[0], [0], [0]] + + output['max_voxel_x'] = mv_pos[0][0] * output_spacing_iso + output['max_voxel_y'] = mv_pos[1][0] * output_spacing_iso + output['max_voxel_z'] = mv_pos[2][0] * output_spacing_iso + del output['max_voxel_index'] + + return output + + +class TissuecyteInjectionUnionize(TissuecyteBaseUnionize): + + def calculate(self, low, high, data_arrays): + data_arrays = self.slice_arrays(low, high, data_arrays) + + self.sum_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['injection_fraction']).sum() + self.sum_projection_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['injection_density']).sum() + self.direct_sum_projection_pixels = self.sum_projection_pixels + self.sum_projection_pixel_intensity = np.multiply(data_arrays['sum_pixels'], data_arrays['injection_energy']).sum() + self.sum_pixel_intensity = data_arrays['injection_sum_pixel_intensities'].sum() + + self.set_max_voxel(data_arrays['injection_density'], low) + + +class TissuecyteProjectionUnionize(TissuecyteBaseUnionize): + + def calculate(self, low, high, data_arrays, ij_record): + data_arrays = self.slice_arrays(low, high, data_arrays) + + nex = np.logical_or(data_arrays['injection_fraction'], np.logical_not(data_arrays['aav_exclusion_fraction'])) + + self.sum_pixels = data_arrays['sum_pixels'][nex].sum() + self.sum_pixels -= ij_record.sum_pixels + + self.sum_projection_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['projection_density'])[nex].sum() + self.sum_projection_pixels -= ij_record.sum_projection_pixels + self.direct_sum_projection_pixels = self.sum_projection_pixels + + self.sum_projection_pixel_intensity = np.multiply(data_arrays['sum_pixels'], data_arrays['projection_energy'])[nex].sum() + self.sum_projection_pixel_intensity -= ij_record.sum_projection_pixel_intensity + + self.sum_pixel_intensity = float(data_arrays['sum_pixel_intensities'][nex].sum()) + self.sum_pixel_intensity -= ij_record.sum_pixel_intensity + + valid_density = np.multiply(nex, data_arrays['projection_density']) + valid_density = np.multiply(valid_density, 1 - data_arrays['injection_fraction']) + self.set_max_voxel(valid_density, low) diff --git a/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py b/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py new file mode 100644 index 0000000000..c6d0a3050b --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py @@ -0,0 +1,108 @@ +from __future__ import division +import logging + +import numpy as np +from six import iteritems + +from .interval_unionizer import IntervalUnionizer +from .tissuecyte_unionize_record import TissuecyteInjectionUnionize, \ + TissuecyteProjectionUnionize + + +class TissuecyteUnionizer(IntervalUnionizer): + '''A specialization of the IntervalUnionizer set up for unionizing + Tissuecyte-derived projection data. + ''' + + + @classmethod + def record_cb(cls): + return {'injection': TissuecyteInjectionUnionize(), + 'projection': TissuecyteProjectionUnionize()} + + + def extract_data(self, data_arrays, low, high): + '''As parent + ''' + + unionize = self.__class__.record_cb() + + unionize['injection'].calculate(low, high, data_arrays) + unionize['projection'].calculate(low, high, data_arrays, unionize['injection']) + + return unionize + + + @classmethod + def propagate_record(cls, child_record, ancestor_record, copy_all=False): + '''As parent + ''' + + for k, v in iteritems(child_record): + v.propagate(ancestor_record[k], copy_all) + + return ancestor_record + + + def postprocess_unionizes(self, raw_unionizes, image_series_id, + output_spacing_iso, volume_scale, target_shape, sort): + '''As parent + + New Parameters + -------------- + output_spacing_iso : numeric + Isometric spacing of reference space in microns + volume_scale : numeric + Scale factor mapping pixels to microns^3 + target_shape : array-like of numeric + Shape of reference space + + ''' + + unionizes = [] + total_injection_volume = 0 + + logging.info('getting formatted unionize output') + for sid, un in iteritems(raw_unionizes): + + if sid < 0: + hemisphere = 1 + else: + hemisphere = 2 + + current = [] + for ij, item in iteritems(un): + + v = item.output(output_spacing_iso, volume_scale, target_shape, sort) + injection = True if ij == 'injection' else False + + if injection and hemisphere != 3: + total_injection_volume += v['direct_projection_volume'] + + del v['direct_projection_volume'] + del v['direct_sum_projection_pixels'] + + v.update({'is_injection': injection, + 'hemisphere_id': hemisphere, + 'structure_id': abs(sid), + 'image_series_id': image_series_id}) + + current.append(v) + + unionizes.extend(current) + + if total_injection_volume > 0: + logging.info('computing normalized projection volume') + for un in unionizes: + un['normalized_projection_volume'] = un['projection_volume'] / total_injection_volume + else: + logging.warning('no injection found!') + for un in unionizes: + un['normalized_projection_volume'] = 0 + + return filter(lambda x: x['sum_pixels'] > 0, unionizes) + + + + + diff --git a/internal/mouse_connectivity/interval_unionize/unionize_record.py b/internal/mouse_connectivity/interval_unionize/unionize_record.py new file mode 100644 index 0000000000..3e340d9cf4 --- /dev/null +++ b/internal/mouse_connectivity/interval_unionize/unionize_record.py @@ -0,0 +1,39 @@ +from six import iteritems + + +class Unionize(object): + '''Abstract base class for unionize records. + ''' + + def __init__(self, *args, **kwargs): + raise NotImplementedError() + + + def calculate(self, *args, **kwargs): + raise NotImplementedError() + + + def propagate(self, ancestor, copy_all, *args, **kwargs): + raise NotImplementedError() + + + def output(self, *args, **kwargs): + raise NotImplementedError() + + + def slice_arrays(self, low, high, data_arrays): + '''Extract a slice from several aligned arrays + + Parameters + ---------- + low : int + start of slice, inclusive + high : int + end of slice, exclusive + data_arrays : dict + keys are varieties of data. values are sorted, flattened + data arrays + + ''' + + return {k: v[low:high] for k, v in iteritems(data_arrays)} diff --git a/internal/mouse_connectivity/projection_thumbnail/__init__.py b/internal/mouse_connectivity/projection_thumbnail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e463c44b5d34456eff2e3a5de537fcf54c0ae7f GIT binary patch literal 225 zcmYL@I|>3Z5QZaIh~PmibPGEX@zIKn*agDuW^kj~N!VnSEp5Gql~=O$2zFLZ3h{^k zn+G$)tOkR=VA1^wDZUbZ>Tt4Phb}{lofvku4^gM~AD`QLD)#~FAfW_3&fx;o$|XVJ zNW(-Tor829DHKfS%Qnc3$z?DRM;?k39FTXd<q3Vt3`ML7Y*x7@pyDHhMKos<+sxPQ hm<mTKmQ9rt7@H|&$V8>azJ2y)mD7#IdHV6q7GGGsL>&MC literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/generate_projection_strip.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/generate_projection_strip.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20b21289591ad7634b7b94f3bb0ecae8d847eb42 GIT binary patch literal 3323 zcmZWrTW{pH6(%K(MsxM}y7p$fb=?BR1c<#&+N4-4lBNlgZd*73cAEtR7Xx|78Ozqq zB*&g{rH8`JWAX!1ps>-RK;Qcd`YQ^(=E-k)Eb@|mq{fcdD?#Mp;o<Gm`Oe|5JDn!M zll=Y9!Ltq_U+c#8V?p>8KKTz6j4&DzzpANE(Y7KhwtbscI>)aW8`rO+wj(cY_zm<q ztQIxnmfte68@1z(-!XDM>c$KHf|0$b7ccrtkQ=P|7ve9o7HgwkVI9^*y~-9?5A_;b zWJ{>;v1PV`dY!GZHPjo7J|q2mSJ)}p?bFhoiXa(tNX}WB##a=2G@4K2V9cK#aIVnm z#=&%uiS&>URhTBwEPR$mlbC;6=~4mJy^~N*f+#!-w9R0m!YEWBmqSOdg~!8Z<NE}k zd>w@%xs}`J)}B?kMLj1MG<OfJOG-&jA=fLJ5p0<5_HE%}Oz8$$#uHZ3=Y6ki=#5Fe z%d*9IrVi!}_rz?^cY<jsOB$5)sHAa8*}sTb!YtqZ^@GQIe~?_rz2G2V+xx+3kj(bp zPl92Zu;8sdo}9?N6bs2A$}~He$-Uo)`+G7}{EaLa9swPUjUrgEqn$8OTqHrX6Q>i& z2bd($P@RNow(~u119dQo_md!ucE&v6B2fGmsspJ+m~CgX($%LL?k{MZ^qC3m(l!+< zkcQgV^rL~S;rjre+(MDloSf6b$^k0;ihO=u(vkfHI)G^HUVVqhAkeqVTB!eV=?&8; z6>*UHEh7z#+89;EGG;HkfIXVwWR>lzUbfnsN7txWNBgC{b)hhO`wxWaKNVPUPCq1n z{Hm}Nz0jYXYd+lUGq*<e2DzlK_ON-+CC+wt1Wxvfu0}S<%^I|tk=<FXnsXiNU0Uw| z%qQfy`2rk#c{XjOR{(ak-75{b&<7vm!}HC1Lc4a~5&EZ;R+5!oJc(2Yp!~W#o^XD~ z;kIkKx493e8H;oR*R{g%F1)Mz@FX@k4dKGyTfT;oQX@&ME`3NJ(JlJA1+*VRbAz_t zLmi(%+lMfHeuMUJDzsld)iu(EZLqd;U|?h?w=dyEuVSpRF(_EOVgoDmYt@k*(BY_D z{Fo~fE<O@z{Js#utn7Ul%Aw$je;iDt41>fNnLce~tbv<B#@UZ1Li_;J`c@d<1*Xo@ zfj0Ol`lSiMfZ_q@uxW{(KsUUOE}9J5Aq@=wgMfHKE=i$l%HRftlT&7GAmko7;xlDk z*vz?@>)-~6I;wWz=8m?6RL`&bEYtR?9?Vh09PW`Vlxi3o(`NNAY}hrSvCc69b{_1= zQA2#CTE-4--IHwTwrXE=^o+N`W}s?igWhiLu*M1;^kPA^4}0_dH#Z3MnD>U>AlB!G zAm=!NiIuHg<E7%q0AcQ`gq%Gx1P+t&X0SP)|CLRR?51|Q&67ajHx2pY%|AVQ{O0zX zqr$JrVG!}k$1P!Fwz8HA#)WtQ`RY5PI2DM9{l(HjoSc=-F;|0hqOyr9>rpx$W4+P| zlTli_BOPRv_#uXgO<nv*7dmvAxlIT$o-OV}=Qq!|NaY|3kGSs!hB&CDnq}OtO%QN@ z*{@-XCiXY5<UDNM!`RYIq~e+MTc-zU#H*Ze*Rhrlf`p;7+HE!ZXBaFsxrpV_rq!k^ zv`KqLTC#MzXKiWz?Z9HF9Zo+wt=%}@6EqY#q`8ICS|PbTuN?;G`@$(|IT_R3Ss{g+ z)45d7-MpUHMmFM%z57w0`W}Komg0~I9|jFC3KNOE!%Hg*`<~wzfkp$J-Tb;rjZoI4 z3WO?cj1}A12U2A+j<_tZjUiUXT;4@vL56V#G(@UQ`u;7(OMNn8Jp=|#OS}#F=FB>W z>Rv;(Zy_k1yy2{%8^{K7JkSI~WTA<xtV5?oaB|D^ylr}r<`YNv6t1Bi$!odGEM{NU z3gnC2My~i<QCIbIQh26pDDR?y>{e$E@`P11Rr9c=+PRlEMmDsd;g_^%L2@@p(N>)i z$=hGjJ-g@>-C|+7o;N|NPTtKI^46t;`JJM7{BK0II;(?Ljf(~5T_Q_SGTnl%u|Z(7 zRxGL>)>s6E+YIzOcPKgj?+bGL9Qi_L2GC7knr@gj7ruE9?iVI3JsrsKjQgv%?g3dK zf*8?JNPqbn@xd+SqG8qG){Vw6+V9+UR%w1RsAuEi<+pVx9>`$C2T@{trnEu8(gyhq z=lrFoxTGX7o4qjG0yTy9VNplncShlqv%x4Bs#MJ2GLr;S8o_0-F%<@pxqlcp@R!V{ z`2Y+W@Tn3QB>H+PO^p7Mzy+E3P8f%YE`zDxxIU#6nxK9?O29aDR{|`&YYWlR6ScLK zb%KnF7!>J@=-aRmKi8eV(8XIQN>6Z^r3o%_Z)lx%%c?MU7F$e`XHdya6a)mmPuDF? zWS6>DkFJ5_J<!>Ku1m$cu<73yk5LJIJM|kfoNmYI3D}|&ykAQuaW<>?*m!36^7Q%d zDsW$u!!Vm|C(K-)w#|JoOC!T26W;um>6ynOjk~{c%OecjxHe03$@P2H{q_2Gm<scg zN+LAr#5=lJ(S^QtRWVcNLIc0~L*_8I;4r`#OuQ#?$|eziSNp61#-ko>0}5TXky!EC No{P8bHN6e5@qdqGJSqSH literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/image_sheet.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/image_sheet.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7bd83f702ca35c543390dcaf3abba6072449825 GIT binary patch literal 1487 zcmZ8hO^@S55bY1!aWb>J!?G(OkWdZ?$p>bT;DA;L0ee75C>&N?tVmYJ-AO!Sw~f2K zLxSgkGS}tK1<i;Pf2psW_zRq<YR^Y@I_m1SU4DM=Rdv37^k_n0=)Zmwe{e$n!He4w zz~*b1=5q*=NLrF~SZT`qHBY%;gEah(NGACukz7SPo{l7aMUvoOc$3U>jJE^6GN66| z8%0to37}EQE(xG<8NeFIP)4wZawKC|BQ=s^Ik_Y|n#S?~kPqGD`%0|TtF=-#XE)%u zBK}L5<|7D}^uT+^%(I@ZXiqY#4|{S-uUJp7DFrov#bz!l5X>apjn={lYugraTqK%C zX_+t=7*#IQSgZ3aS7rG(X-AOo-<y{&=06$Lnz>jDdAtzkLT~2ZXpz@iiqGaszc%w4 zFiZ}yZq^$!|DjmSO<~n1jmXdNvvX0FkRi`b3T;)ZMR`)yolzNpXqDUIbzwIrO<SMh zMXfWt?y7|rMS0?RX9it3ZZ>TQoDN``2m)afI$_&)?u|Mg<lOm%6-J#u!o2b8l=gH< zd-f;m`S0|CT5t*+<2wfKLAAjzI!gjKUUoXSbzK@aYD8-bQ953U#`~58EfR2Ssa+u2 zm2uJ8Ij-KcA;g#v0-<vAE`A=l5c-sEkKX26ZgPr`V7yh{_uz&lI|3B3oIvp!sAs&# z#zTrNraP85E|y9);QwYI$2_@ojJ5R6J!BPNF5(Y1(uh8$+b4Up@cEsIXdwFTo9<)S zSZFZd1I9`EhFvhruL8-g!k(Q**S_s~1|0b;q2SIhh1pJ_(7CWm!<19cX$pNfHN{rF znEv|dMKW?sH|fD%-q4_<vR<tUy>daJm$i$Qbz2GRLbDc)O1M|rqQ5SxJKJ>jq1MSt z*=%_9A*9_XKEgsg-&1^_m7`u9sQFGezH7-9=!SM-*ZhK82DJ%#-Um>V;I<~uAP?9z zWnq1NhKhtPEbst2sy$hMHw6*U)(;6EExMwV*|M#x%)f-^++a5m{+LBHV%rb)h(FAp zC1V$7nHH7GGB?Sxs+L`e`@<~zxfA8^#Gj=034pdwF}x4K9U3cakypyDYuTdYJ#zSW z&>{`53pWP;T4Nr^aTrH&<nJeOJH{LjdW5^@5YkY06||>!C#n~C&Ifxu>V5EsCjN5Z P{1u)HuRNykV=@09AQxaJ literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/projection_functions.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/projection_functions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a4ca1753b941e405896adb797eb8f6895d9c743 GIT binary patch literal 1109 zcmZuwO>fjN5VgJe?zVv1Lo4_Li$r_ifP@NaDJrT!%b_5oXi?;@z1wsXC)m!ii?RpQ zUb%8^#fiU^E2sViPRwLMR0vBmelxZw^PZh&tE&-#p}u|QI~_uPVDM)^O!mOcAvi$< z%}7pTN)fY+#T}SCnUlM*`#a~wzHo$lLE=Do!iPB&T@i_u3mQj)9h2VbHPj+K+5{q< zrY0>^9|CWtxf;tM#YGr6Gq3|N6Mz%6CYuD#v;H+Me8&<FpQT2-5Vr2;*MrA{w?=9+ z;HO+{pYV@d%?JC64+|yu!+}&&Gbl=_%n*E0p3cqSReCZosg(~(KAiBegtJ)&JH%us zRaR=nvz@%Cj7*@2l0yq!+xbqZi!%%gmDtlNKT$l*ZYD>SYFEv6Id8gfbSkw?uwP_j zkOH9^@vy}J95Cea8qC}WXUQe7zM>0aSxwLBg4)idQ<IurF+lDTjZjtE?|F>_JSNSZ z7t-!)&F6=@$d7WM)PAO6s*D|;^I7b1J%+jGG~Tqxs$6OhzSdCQ(8*slwU5a)*qHn! z+r{2+H=z*?n7#!_W8>F&V?#tZ@JZqEmdXWy|52&QnFFM}+N<dkV%;-9))({(TlllS z4RF1tTjZQRC+~L`5MPFMfaDjUbuXjZuRC?PN$SpB0y!UI*5<=HykZ+|{t;RDANJmn z+HapukH)UB^HTO!bO>!}Y;-A)lcmNst~uqU)GLr~+)q*$rg2AE!L7!BA$BaE$R^0E z%%){F??oB~Y2}NZF;7+OfL>F*irF<h(Jd-lRyJwtHr_I7SeiEeu+my8`>*2bR_0~K zt-K-oI+QXS;FhvS)T3)`gLc90F}(%(9&4{b-$uOBL`gELY^7zAXnbFBc$`92dGzLG zOFRxuI@`{RsWeMwuB!5K-V$&1Sl%pFzR_R%r?t-_*v$)3W%4OryFn4UETCN)bOI;v Fe*to*3zq-@ literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/visualization_utilities.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/visualization_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b099061ff2d4db197d0b1075dac0943833dd6fd GIT binary patch literal 2766 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 M(y04p+C}UA7jRX~H~;_u literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_projector.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_projector.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..986e0546bec49dce763892298037e7b293633932 GIT binary patch literal 2678 zcmZ`*TaVL56rS<ej&oUdp+J`w)D+Q6q;{dSq7_0Fmz641v_e2ZvbM6k@g!^3vBQkB zWP|fi!7u19NYtnPCBOEG*FN^C-x+VRG;JOE_}Fvia=!D;H@UmE)?m2O-+l@I^ceet zUKW=P=QeJ=4HL15C(N&&+_&&<C1POvHm|-pz8i_iPHF?suXFYTi=4=P!y;EUUJJh& z@yD!FdyA3SPKTH7ScPd{zU6qw>&9W0j0Q3o<#7_{vD94(TwDUqZQObXMlzpA3=80q z^@jO^CdJdPrt_U>Bl4p98;<2Pq9$5u(u-Qr+8g$o`*rxIqIKgpq8gTTx?F#1=6<NM z=dzn;s%v2uy68z$-@~oX!sKkmBR=Px6}(^pFu(xT&g4>@V$op|PvW%Su2N|a7vptA zSxd5hA8n-_r@gFf9>(%zP{nnu($+HRDWK1OXNt=4*RS_(?*62u(!1e)7;Wu^FT?a` z_f8sivos37-j(U0-pz(G)m_+ZxPPQ~AH;jRI?m;n!?1f0_9glz2_m9{t8to3m4?aH zK{nDdz#u6yjSu7e=<4w@<17vG{n21A4ddkMaW$4HYz>b}F9;~jAZQUB#0|z9e6qQM z-qs?lYeEp^;C68v7$3knfibscBC_UuY8Up*&YhWCu;;ZopLug;V76!V!UEW+@*G5? zo``HLS^>YkGdYKZbgo873Gk~d4|AmRmP+@e(^NFKs=)y0I6v^$@AP_cDxZLWx|gYe zUw<s~dy+6J1v2;7DJ<yAJm{LQrZlCSXGyGc-+e?A$g&m$m^27Fj;hn(^`6QGK{$?e zS<AD^alr9Jmi2rwmnm;$n$&4?Zxkm{uvl}j3_OiiO-KV|tHICn4eJ!2e7*|y|8-x2 zPstOr4ET59RN&7DRI3nkVPIx6v3Q@_xjl1G2DgCsycSvHn}Rq~r*Htd*qPj@Rt&f) z>o#TGesyiy&a-3xt7&`hsQv2t&Ffp&d(*ZGqZn}au>f;*>hF}rr7DEEI*%rG3dZ*y zNgWP`i8Rpr4Jyb3)GSnG;|G~PjK?y$zuj>S^6CurdyfolQgsfdteFMMXccg``hF2H z$MAZ*1!(cJCg)e-t%7&DL?ycDNw-0>4d;Z)1=QfcQ=34`ni_Oplj1=g&dD*#T9NZ) zw{^q`0wzm*Fg&uld!-8+LJn6KUppS@Gt8{1szeTtyVm6W)s-Jdc4_m`MMD!8y14Z% znDLFAR16$=Ew<UupYDpOGj*r6g0`4bxJ7L)rXJp`!Y;hI^^|e;;?y%}J+k6E5H&H0 zhw1|ir7ppsqBMuU*alMj)i!|Rnr)!fhZG=s;n){>IIgO7fd(MaduLaisc;X%GzyLr zxrPW$2{3DucEaV=g#X=TSv3+O+W)3%x8YFLatjsX7jP&T&sutdyn@dJM8=*9vl}2l zb89LJ2DGTE_Ku>1OA!~|(lG%l8sa+l2aw)UKylS3MXba4=Z&BYL!C=#D8!-Cm5yDC zZlV>Dk+f-2(R~$-wI1jm1wBwGQ%Bz+xB^0a0p?CFtpf3n=;c{P&=D6524grzN^zD= zEfV1ZB1{52=Y5=TXBoaSh%vPbwAX-@1qAHzH@OFF>T_TO)?9%ih{CzRz!BI3p|-&& z$6*&(B)-K~xy4>=KVx7~gSa-gD(u!UziN{q03p!^rOl=6LM!?i&Z_|DS3ln`t#nx0 zT^T1}lFpBYQhkhm{@G;*!Y&ww3I|##23e%2CVmT2u^kU^2I4qSS7<6%UB<&8?l%VE znCJzK_w7UUF6{)?w?NGmLbi0+lZy)6!3cT-h6xBW#JOdi;T!y{HMzK2i+8)xrfJeC znuhqJ6O@f0z)D96`K=&$F$$BaMUm`RVz}I0>LYwBo82VTdLZ+Cq)7Rw4w;k18jlVZ zMYX0kO|<kZ&+(dGvr+fFR^7C9T1I|w_Qj;L_n-V&5xB17@zx+al)A#uNk@a>k@^Iq nluXf1GQ}$0Y>)menX&$B0i}1V%I<sGD4LdnRqz(~td{s2g?gfO literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_utilities.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9e23b25ee28abd822fa8ea27e3749c91d49b461 GIT binary patch literal 1508 zcmah|&2HQ_5EiMQ)vkB#GzeO!1&Td(fy7SGLxG?u+T>6aE!+TZFTw%>z2wS_B~l<M z8=FXnB7K59!3yoAucT{FeubVoBRT#l(3S!@GvsLa@tc|Fv)ROhp?>>?{T_JUpJ==v z6qK)F+Ly3!kCWUhNJ0qeG^YverJn@743miaJowd1Mm*#Z$e53K406oJd;)U9clZ?K z4yVW7Vs;5py#?uFF3+WvS{<zjZoxnq!F&PJeg=#4wxss9wDnqYrTe$^0QI#GQOVIF z?5HZckQu`^$>dw%j!U+ZD(gn5%hw_qgYu)1nN)CnbguKN5Px`P1Q-4F?!~j^&sG?_ zWT%WDoUjX~Hp_1mTWQ7F=S!i^?NXOQ*%hq1Jl)vk5AtMbr4x_gqBE8W_&3kNgP$Er z<%CfzKP+@*MG8TbSUGsG+Z>igzd}Q+)SXtviDEK89MGhdleu(K*n@J@J%r$AX(n7M z3kaW<%&<a0U^_;FkSUK$;WKDov*?3?vuE*RP@GqLZ^_bcNJAS^Q%?3Flb?9Nn}2kP zq+epr7ekzdZ!mI4(k`$-ThGt1#JInAjcO(Em3y#hp@sm<E-||x?;ydGe?j8NmLi%K z>w+Gc9dL!)@i7J;(D{YtS8&V}cW1a@zHZ@paE%AiB1u5<1Ms;4bq}mNp#Fm%M_$pb zU(=QhWfk1uNupdrPO~IX+7$l_Z2uY<mn_rpXA0GkxzmStz<q$=kbfNbHe|VH%z!fF zuAv~wThjOgXSLr_d*J+Sz{xhODcUV`sEaVuO#l+TL+~EeVIAy4pKN0{hIP_<P2_gA z(;7MpdTZ7~E#Q~=b<~D^O}zf1XA#P9&gFV7%%iyxw#wc7Lgx8gX*WL+^CA6$&!5fT zJZT=y-#l#$7Sm$aAmM!qlNefJm1`@yQLZy+y{ro^m{DD{1`e6)3nqz}(UsyLt=p8M z^Pzvb$mv{KhgIm#lJF&*2@~Q4qhw?Y>@@=^VI~84?`mVnKOj%`hLf9(-S;j7@ML!7 zFqmDW*J~@>Kg;XGK8qz@o&qYJ4(^`<4vWw9XiQ@0!TTubJ~5cx#k8BG>AG^25ou~L zyXHPD$@o|nWiGz^>3j1L+M%k7a??{a)EV~AKp)mcAM6&QzV!PpjK755sB-ZYGTsB3 N(ikE5aTJI6{SD^YZd3pO literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py b/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py new file mode 100644 index 0000000000..5150985411 --- /dev/null +++ b/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py @@ -0,0 +1,109 @@ +import functools +import logging +from six.moves import xrange + +import numpy as np +import SimpleITK as sitk +from scipy.ndimage.interpolation import zoom + +from .image_sheet import ImageSheet +from .projection_functions import max_projection +from .volume_projector import VolumeProjector +from . import visualization_utilities as vis + + +def max_cb(max_sheet, depth_sheet, volume, axis, *a, **k): + m, d = max_projection(volume, axis) + max_sheet.append(m.T) + depth_sheet.append(d.T) + + +def apply_colormap(image, colormap): + color_image = colormap(image) + color_image[:, :, -1] = image + return color_image + + +def blend_with_background(image, background): + + for ii in xrange(3): + image[:, :, ii] = np.multiply(np.squeeze(image[:, :, ii]), + np.squeeze(image[:, :, -1])) + image[:, :, ii] += np.multiply(np.squeeze(background), + np.squeeze(1.0 - image[:, :, -1])) + + image[:, :, -1] = 1 + return image + + +def do_blur(image, blur): + + for ii in xrange(3): + im = sitk.GetImageFromArray(image[:, :, ii]) + im = sitk.DiscreteGaussian(im, blur) + image[:, :, ii] = sitk.GetArrayFromImage(im) + + return image + + +def handle_output_image(sheet, out_image, colormap, nsteps): + + sheet = sheet.copy() + whole_sheet = sheet.get_output(-1) + + if out_image['blur'] > 0.0: + logging.info('applying a gaussian blur with variance: {0:2.2f}'.format(out_image['blur'])) + whole_sheet = sitk.GetImageFromArray(whole_sheet) + whole_sheet = sitk.DiscreteGaussian(whole_sheet, out_image['blur']) + whole_sheet = sitk.GetArrayFromImage(whole_sheet) + + if out_image['scale'] != 1: + whole_sheet = zoom(whole_sheet, zoom=out_image['scale'], order=1) + + whole_sheet = apply_colormap(whole_sheet, colormap) + + if out_image['background'] is not None: + whole_sheet = blend_with_background(whole_sheet, out_image['background']) + else: + whole_sheet = blend_with_background(whole_sheet, np.zeros_like(whole_sheet)[:, :, -1]) + + whole_sheet = np.around(whole_sheet * 255).astype(np.uint8) + out_image['write'](whole_sheet[:, :, :-1]) + + +def simple_rotation(from_axis, to_axis, start, end, nsteps): + + angles = np.linspace(start * np.pi, end * np.pi, nsteps, endpoint=False) + from_axes = [from_axis] * nsteps + to_axes = [to_axis] * nsteps + + return from_axes, to_axes, angles + + +def run(volume, imin, imax, rotations, colormap): + + volume = vis.sitk_safe_ln(volume) + + ln_imin = np.log(imin) if imin != 0 else -np.inf + ln_imax = np.log(imax) if imax != 0 else np.inf + + volume = sitk.IntensityWindowing(volume, ln_imin, ln_imax, 0.0, 1.0) + + for rotation in rotations: + + max_sheet = ImageSheet() + depth_sheet = ImageSheet() + + vp = VolumeProjector.fixed_factory(volume, rotation['window_size']) + callback = functools.partial(max_cb, max_sheet, depth_sheet, **rotation['projection_parameters']) + + rot = rotation['rotation_parameters'] + from_axes, to_axes, angles = simple_rotation(**rot) + + for response in vp.rotate_and_extract(from_axes, to_axes, angles, callback): + pass + + rotation['write_depth_sheet'](depth_sheet.get_output(-1)) + + for out_image in rotation['output_images']: + handle_output_image(max_sheet, out_image, colormap, rot['nsteps']) diff --git a/internal/mouse_connectivity/projection_thumbnail/image_sheet.py b/internal/mouse_connectivity/projection_thumbnail/image_sheet.py new file mode 100644 index 0000000000..9c489263b5 --- /dev/null +++ b/internal/mouse_connectivity/projection_thumbnail/image_sheet.py @@ -0,0 +1,44 @@ +import functools +import copy as cp +import logging + +import numpy as np + + +class ImageSheet(object): + + + def append(self, new_cell): + + if not hasattr(self, 'images'): + self.images = [new_cell] + else: + self.images.append(new_cell) + + + def apply(self, fn, *args, **kwargs): + fn = functools.partial(fn, *args, **kwargs) + self.images = map(fn, self.images) + + + def copy(self): + new_sheet = ImageSheet() + new_sheet.images = cp.deepcopy(self.images) + return new_sheet + + + def get_output(self, axis): + output = np.concatenate(self.images, axis=axis) + logging.info('concatenated sheet has size: {0}'.format(output.shape)) + return output + + + @staticmethod + def build_from_image(image, n, axis): + + images = np.split(image, n, axis) + + sheet = ImageSheet() + sheet.images = images + + return sheet diff --git a/internal/mouse_connectivity/projection_thumbnail/projection_functions.py b/internal/mouse_connectivity/projection_thumbnail/projection_functions.py new file mode 100644 index 0000000000..4f88714c44 --- /dev/null +++ b/internal/mouse_connectivity/projection_thumbnail/projection_functions.py @@ -0,0 +1,36 @@ +from __future__ import division + +import SimpleITK as sitk +from six.moves import xrange +import numpy as np + + +def convert_axis(axis): + return 2 - axis + + +def max_projection(volume, axis, *a, **k): + volume = sitk.GetArrayFromImage(volume) + axis = convert_axis(axis) + + return np.amax(volume, axis), np.argmax(volume, axis) + + +def template_projection(volume, axis, gain=2, maxv=1, *a, **k): + volume = sitk.GetArrayFromImage(volume) + axis = convert_axis(axis) + + output_shape = list(volume.shape) + del output_shape[axis] + output = np.zeros(output_shape, dtype=float) + + for ii in xrange(volume.shape[axis]): + current = volume.take(ii, axis) + + output = np.multiply(output, (maxv - current) / maxv) + output += gain * np.multiply(current, current) / maxv + + return output + + + diff --git a/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py b/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py new file mode 100644 index 0000000000..8d179da6cf --- /dev/null +++ b/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py @@ -0,0 +1,100 @@ +from __future__ import division + +import logging + + +import matplotlib as mpl +import SimpleITK as sitk +import numpy as np + + +def convert_discrete_colormap(data, cm_name='custom', color_names=None): + '''Generates a matplotlib continuous colormap on [0, 1] from a discrete + colormap at N evenly spaced points. + + Parameters + ---------- + data : list of list + Sublists are [r, g, b]. + + Returns + ------- + matplotlib.colors.LinearSegmentedColormap + Gamma is 1. Output space is 3 X [0, 1] + + ''' + + if color_names is None: + color_names = ['red', 'green', 'blue'] + + data = np.array(data) + npoints = data.shape[0] + + domain = np.linspace(0, 1.0, npoints) + color_arrays = {} + + for col, name in enumerate(color_names): + color_array = np.zeros((npoints, 3)) + + color_array[:, 0] = domain + color_array[:, 1] = minmax_norm(data[:, col]) + color_array[:, 2] = color_array[:, 1] + + color_arrays[name] = color_array + + return mpl.colors.LinearSegmentedColormap(cm_name, color_arrays, npoints, gamma=1.0) + + + +def minmax_norm(data): + + rng = np.amax(data) - np.amin(data) + if rng == 0: + return data + + return (data - np.amin(data)) / rng + + + +def sitk_safe_ln(data, minimum=10**-10): + + logging.info('thresholding below at {0}'.format(minimum)) + minimum = float(minimum) + data = sitk.Threshold(data, minimum, np.inf, minimum) + + logging.info('taking natural log') + return sitk.Log(data) + + +def normalize_intensity(data, in_min, in_max, out_min=0.0, out_max=0.0): + + logging.info('setting input range: [{0:2.3f}, {1:2.3f}]'.format(in_min, in_max)) + data = sitk.ShiftScale(data, -in_min, 1.0 / (in_max - in_min)) + data = sitk.Threshold(data, 0.0, np.inf, 0.0) + data = sitk.Threshold(data, 0.0, 1.0, 1.0) + + logging.info('setting output range: [{0:2.3f}, {1:2.3f}]'.format(out_min, out_max)) + data = sitk.ShiftScale(data, 0.0, out_max - out_min) # want to scale first + return sitk.ShiftScale(data, out_min, 1) # then shift + + +def blend(image_stack, weight_stack): + ''' + + Parameters + ---------- + image_stack :: list of np.ndarray + The images to be blended. Shapes cannot differ + weight_stack :: list of np.ndarray + The weight of each image at each pixel. Will be normalized. + + ''' + + image_stack = np.array(image_stack) + weight_stack = np.array(weight_stack) + + weight_stack = weight_stack - np.amin(weight_stack, axis=0) / (np.amax(weight_stack, axis=0) - np.amin(weight_stack, axis=0)) + weight_stack[np.isnan(weight_stack)] = 0.5 + weight_stack[np.isinf(weight_stack)] = 0.5 + + return np.multiply(image_stack, weight_stack).sum(axis=0) diff --git a/internal/mouse_connectivity/projection_thumbnail/volume_projector.py b/internal/mouse_connectivity/projection_thumbnail/volume_projector.py new file mode 100644 index 0000000000..429dd9511b --- /dev/null +++ b/internal/mouse_connectivity/projection_thumbnail/volume_projector.py @@ -0,0 +1,83 @@ +import logging + +import SimpleITK as sitk +from six.moves import xrange +import numpy as np + +from . import volume_utilities as vol + + +class VolumeProjector(object): + + def __init__(self, view_volume): + logging.info('initializing volume projector') + self.view_volume = view_volume + + + def build_rotation_transform(self, from_axis, to_axis, angle): + logging.info('constructing rotation') + + transform = sitk.AffineTransform(3) + transform.SetCenter((vol.sitk_get_center(self.view_volume)).tolist()) + transform.Rotate(to_axis, from_axis, angle, True) + + logging.info(transform.__str__()) + return transform + + + def rotate(self, from_axis, to_axis, angle): + logging.info('rotating from axis {0} to axis {1} ' + 'by {2:2.2f} radians'.format(from_axis, to_axis, angle)) + + transform = self.build_rotation_transform(from_axis, to_axis, angle) + rotated = sitk.Resample(self.view_volume, transform, sitk.sitkLinear, + 0.0, self.view_volume.GetPixelID()) + + return rotated + + + def extract(self, cb, volume=None): + logging.info('extracting projection') + + if volume is None: + volume=self.view_volume + + return cb(volume) + + + def rotate_and_extract(self, from_axes, to_axes, angles, cb): + + for fax, tax, angle in zip(from_axes, to_axes, angles): + + rotated = self.rotate(fax, tax, angle) + yield self.extract(cb, rotated) + + + @classmethod + def fixed_factory(cls, volume, size): + + view_volume = sitk.Image(int(size[0]), int(size[1]), int(size[2]), volume.GetPixelID()) + view_volume = vol.sitk_paste_into_center(volume, view_volume) + + return cls(view_volume) + + + @classmethod + def safe_factory(cls, volume): + + max_extent = vol.sitk_get_diagonal_length(volume) + max_extent = [np.ceil(max_extent).astype(int)] * 3 + + vpar = vol.sitk_get_size_parity(volume) + lpar = np.mod(max_extent, 2) + + for ax in xrange(volume.GetDimension()): + if vpar[ax] != lpar[ax]: + max_extent[ax] += 1 + + return cls.fixed_factory(volume, max_extent) + + + + + diff --git a/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py b/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py new file mode 100644 index 0000000000..b5cc19c545 --- /dev/null +++ b/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py @@ -0,0 +1,41 @@ +from __future__ import division + +import logging + +import SimpleITK as sitk +import numpy as np + + +def sitk_get_image_parameters(volume): + return (np.array(volume.GetSpacing()), + np.array(volume.GetSize()), + np.array(volume.GetOrigin())) + + +def sitk_get_center(volume): + _, size, _ = sitk_get_image_parameters(volume) + return (size - 1) / 2 + + +def sitk_get_size_parity(volume): + _, size, _ = sitk_get_image_parameters(volume) + return np.mod(size, 2) + + +def sitk_get_diagonal_length(volume): + _, size, _ = sitk_get_image_parameters(volume) + return np.linalg.norm(size) + + +def sitk_paste_into_center(smaller, larger): + + smaller_parities = sitk_get_size_parity(smaller) + larger_parities = sitk_get_size_parity(larger) + if not np.allclose(smaller_parities, larger_parities): + logging.warn('parities differ, result will not be centered : {0}, {1}'.format(smaller_parities, larger_parities)) + + smaller_center = sitk_get_center(smaller) + larger_center = sitk_get_center(larger) + + offset = np.around(larger_center - smaller_center).astype(int).tolist() + return sitk.Paste(larger, smaller, smaller.GetSize(), [0, 0, 0,], offset) diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__init__.py b/internal/mouse_connectivity/tissuecyte_stitching/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b50abdcddd5455c299f9d27763522872fbd00de GIT binary patch literal 225 zcmYL@v1$TA5QbN<5Wxqr&@1dh5H)SE33dz1xI1`*=j?GaXV}u#*RaYfrOhLxOO?4I z<cI&8VVHlI-E1~>CVt#ts9yvAG_q!6ma!qZH#Z;cKU_DA|M7EwdGZIrPCV3*mPdF8 zE`G}pGbdPi<g57HB1<&pwl3md>F9+N7cImyoY1mOV;kvQ5i52KO?An=V6Y>MQRzxr lDkYH~V^IvEq_HMGRUr_QhOlhQ=j8d4Q{Uiv`0?B9egR$eL^}Wg literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/stitcher.cpython-37.pyc b/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/stitcher.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..378a414a879436a5388834fc381f05edd662e86f GIT binary patch literal 3921 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 DVEURi literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/tile.cpython-37.pyc b/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/tile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ea0be1e87e31df762155755f470f268a82b45f0 GIT binary patch literal 2935 zcmb7G&yUkq5cc!0ctdtcVPOTO;L@rklmb<y9uPtlr1nD71N0I_wY+{WiFX}4ea~UL z-sDh0dn<p#qMrIM`Pviro_gvx&xtp?ER|}>^L}{zJm1VWGk&zb-ZXHffBX{uea0~U zqQ&yEF?onveGI`3&Jv?njjU&WYjBfWFAZ)9>xI>`IeTh!>^IOfx)I6cWn%IWw|WL4 zj2`1g&*Y4oFO8nXEpB79xx-zI4sUP|qs!NL6Jvv);Vq0FU*{Vb*Z5i9#@OWV@pBl@ z@bmcUW@$f*6A^j%09}NL=HKI1KSIpd%m|E`3CU&_q&c%8t(gO9&s<1n)_`>L#-YdA z&f3h_vAB5&=q?$0Zr5{K!`|QR*Nnj%_`cgMzRF>Me-Ni!{5<!w)Q?7Cnu^3fSWM== z%0rneKg|6b2Y2VU{DUv%ozjxoUg_vZr5k0*bewj~($VLXjm5j2rgVV<+v9L3%4V#B zajaCF4oi1Co2FdJ20gb`T!^wU4&^XTRoO_gAtuApj?+O_x`RxP!@Sdko=67zNJ(yz zYb3~N`WOis7_tRX+Biv-?(QCqe;V>UHvjqU@xA^JN=VfYM<Ktx9qxtce*fz<jIxx6 zU-m`%T=lbwNL2)xO-B2w|0Le-t2h^*Pr_&y81QbAK!fkziPK!jG)(S{v#AmR4oO9n z$Is(@|4t5+QxWawB2ampM<bxYW+HA+_De4a;xx{KfH0_w5QgPiE~{^IleL)5ighB# z?WK0aND~*07VgKm)fI@`IAokrRA<H^xUyrtCf-;&#%8xz&t*Iw!vvp9=-6@{FUbvv z(xyk+nH?tEv`wz6#3m`MkwQRzzlNov%raP$6&u>N`e8)LLKlq`b8Q?YPG#JVInZ=` zRhbF%Dw?j0Hqmy=_*Da_>08m*rZqhqK!?(`TYOrB+Kcm%zu*oi3StsTD^AWkl3XPn zh>mjvT%M&};)-TX$E?6>Rvq_%qySMJQ3T6io90zktkvj`0k5NS3z{>wgUX|`a53Ap zCpYyjKma)HVzz4okkyqG);A<5kJKofh$=3XX=N*XE+iNjPz+B->C)=M0BJT&wR;5r z3<oZvc99iVwcYPjJ_d$drlYux$qdDB*OS*zjV8*<Q=*<TLv-astz$0e=+fSt={@T> z3#eql4K_5)DyHA0nZGbjQ`H|(k${xdQb$^snE$L;#f6$1tEUy;g_B9LPkAs%!h8^m zg!@q@C8aGYU!MK1uXNT<(1{Y8#}N{{s!s32Z<;-&nNCV?JWcW#-(Pa=GCe-dwep;{ zFjx)HU8pI_OvCipCUeau(yxgUQEXMgBuvNNI2Og4l5_-Ogh=Y*fOx{^tP5)>u~(@k zPqXau+m;1+rVGOZysvcrv*Ox2Y+CBpMU3pK8FpXWR;A0FYJ*OUxtTNYjw%4-Xk#yE zjn<8|S*@XI4lUqtx<_d)sYaESNO{N7%>mhz#F5ZF0$aMu(dSDGHR5Ch+Cz~Cx?KfQ z3_*)W&{X<YgFJ7xS(_CXG|H2jH8wJUT9eM6J|-FwO2I0&1+of{#<#$>oC9&KgZa># zTRA&4xwB)<tXGE4FT(Dg#4bO?CyVQgPFr!h?&0@Vnm9UvZk}~J&{Yw;wTt9OII6TK zVLm$5QHyT`r0@i)3!;*vTIgXd)`r7Y+_kD-yNhaGO@*6SR7HjW=H?;(dhpj$RZQIm z1}H7`-=hhPMsS6iX&feTvFvcZjvwXo-6L9b+?90wfM7X=keRCf8mREUqXV|<^F>9B z9(0cyVa0`$I^9l-%0U{AMG%zDAQ)$Sn$Wxz1V2r~q<SJR;4HaCg4&GKB}3<<PfKb$ z@)Hs_NE{UlJ){0Cm;F|q!^$(gEzj{9xHml8YkC{{`J(aloOC*#>`M*a&9-+?_w@7A S4lcd>mB|k%JQ^-exBdm<W1(pP literal 0 HcmV?d00001 diff --git a/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py b/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py new file mode 100644 index 0000000000..90137aed22 --- /dev/null +++ b/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py @@ -0,0 +1,145 @@ +import logging +import operator as op +from collections import defaultdict +from six.moves import reduce + +import numpy as np + + + +class Stitcher(object): + + + def __init__(self, image_dimensions, tiles, average_tiles, channels): + + logging.info('image_dimensions: {0}'.format(image_dimensions)) + self.image_dimensions = image_dimensions + + self.average_tiles = defaultdict(lambda *a, **k: None, average_tiles) + + self.tiles = tiles + self.channels = channels + + + def run(self, cb=np.array): + + slice_image, stitched_indicator = initialize_images(self.image_dimensions, len(self.channels)) + missing_tiles = {} + + for tile in self.tiles: + + if tile.is_missing: + + missing_tiles[tile.index] = tile.get_missing_path() + tile.initialize_image() + + else: + + tile.apply_average_tile_to_self(self.average_tiles[tile.channel]) + tile.trim_self() + + self.stitch(slice_image, stitched_indicator, tile, cb) + + return slice_image, missing_tiles + + + def stitch(self, slice_image, stitched_indicator, tile, cb=np.array): + + region = tile.get_image_region() + + current_region = slice_image[region] + indicator_region = stitched_indicator[region] + + stup = (tile.size['row'], tile.size['column']) + blend = get_blend(indicator_region, stup, cb) + blend = make_blended_tile(blend, tile.image, current_region) + logging.info('obtained blend') + + slice_image[region] = blend + stitched_indicator[region] = 1 + logging.info('updated image region with tile data') + + +def initialize_image(dimensions, nchannels, dtype, order='C'): + return np.zeros((dimensions['row'], dimensions['column'], nchannels), dtype=dtype, order=order) + + +def initialize_images(dimensions, nchannels): + return initialize_image(dimensions, nchannels, np.uint16), initialize_image(dimensions, nchannels, np.int8) + + +def make_blended_tile(blend, tile, current_region): + return np.multiply((1 - blend), tile) + np.multiply(blend, current_region) + + +def get_indicator_bound_point(indicator, lg, axis): + '''Finds the index of first change in a binary mask + along a specified axis in a specified direction + ''' + + delta = np.diff(indicator, axis=axis) + points = np.where(lg(delta, 0)) + del delta + + points = np.unique(points[axis]) + size = indicator.shape[axis] + points = points[lg(points, size / 2.0)] + + if len(points) > 0: + return points[-1] + return None + + +def blend_component_from_point(point, mesh, lg): + '''Obtains a normalized component of the blend, which describes depth of + overlap along a specified axis in a specified direction + ''' + + # this has the effect that the shallowest part of the blend + # is always 0 - symmetric with the deepest after normalization. + blend = point - mesh + 1 + blend[lg(blend, 0)] = 0 + + blend = np.fabs(blend) + mx = np.amax(blend) + mx = mx if mx > 0.0 else 1.0 + + return blend / mx + + +def get_blend_component(indicator, lg, axis, meshes): + ''' + ''' + + point = get_indicator_bound_point(indicator, lg, axis) + if point is None: + return [] + + return [blend_component_from_point(point, meshes[axis], lg)] + + +def get_overall_blend(indicator, meshes): + ''' + ''' + + blends = [] + + for lg in (op.lt, op.gt): + for axis in (0, 1): + blends.extend(get_blend_component(indicator, lg, axis, meshes)) + + if len(blends) == 0: + return np.zeros_like(indicator) + return reduce(np.maximum, blends) + + +def get_blend(indicator_region, stup, cb=np.array): + ''' + ''' + + meshes = np.meshgrid(*map(np.arange, stup), indexing='ij') + blend = get_overall_blend(indicator_region, meshes) + + return cb(np.multiply(blend, indicator_region)) + + diff --git a/internal/mouse_connectivity/tissuecyte_stitching/tile.py b/internal/mouse_connectivity/tissuecyte_stitching/tile.py new file mode 100644 index 0000000000..02772f28f2 --- /dev/null +++ b/internal/mouse_connectivity/tissuecyte_stitching/tile.py @@ -0,0 +1,92 @@ +import logging + +import numpy as np + + +class Tile(object): + + def __init__(self, index, image, is_missing, bounds, channel, size, margins, *args, **kwargs): + + # identifier + self.index = index + + # actual image data + self.image = image + self.is_missing = is_missing + + # parameters related to the position of the tile within a larger image + self.bounds = bounds + self.channel = channel + + # parameters related to the valid portion of the tile + self.size = size + self.margins = margins + + logging.info('tile {index} on channel {channel} starts at ({0}, {1})'.format(self.bounds['row']['start'], + self.bounds['column']['start'], + index=self.index, + channel=self.channel)) + + + def trim_self(self): + logging.info('trimming tile') + self.image = self.trim(self.image) + + + def trim(self, image): + logging.info('trimming with margins ({row}, {column})'.format(**self.margins)) + + return image[self.margins['row']: self.margins['row'] + self.size['row'], + self.margins['column']: self.margins['column'] + self.size['column']] + + + def average_tile_is_untrimmed(self, average_tile): + return average_tile.shape[0] > self.image.shape[0] \ + or average_tile.shape[1] > self.image.shape[1] + + + def apply_average_tile(self, average_tile): + + if average_tile is None: + logging.info('no average tile found for tile with index {index} on channel {channel}'.format(**self.__dict__)) + return self.image + + if self.average_tile_is_untrimmed(average_tile): + logging.info('trimming average tile') + average_tile = self.trim(average_tile) + + logging.info('applying flatfield correction to tile with index {index} on channel {channel}'.format(**self.__dict__)) + return np.multiply(self.image, average_tile) + + + def apply_average_tile_to_self(self, average_tile): + self.image = self.apply_average_tile(average_tile) + + + def get_image_region(self): + + row = self.bounds['row'] + col = self.bounds['column'] + + return [slice(row['start'], row['end']), + slice(col['start'], col['end']), + self.channel] + + + def get_missing_path(self): + + row = self.bounds['row'] + col = self.bounds['column'] + + path = [row['start'], col['start'], + row['end'], col['start'], + row['end'], col['end'], + row['start'], col['end']] + + logging.info('missing tile starts at: ({0}, {1})'.format(*path)) + return path + + + def initialize_image(self): + logging.info('initializing tile image to 0') + self.image = np.zeros((self.size['row'], self.size['column'])) diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/convert_igor_nwb.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/convert_igor_nwb.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b0bd09039e76ac6ad212ad9b39cccf1461c8293 GIT binary patch literal 3351 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 Si*OgkaSL0f^Gj56(7yp!p@feB literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/extract_nwb_data.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/extract_nwb_data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a44a3b3b5aabe7b1d3ef5c45595468c4dbab6f44 GIT binary patch literal 9262 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 E3vK49cK`qY literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/feature_extraction_module.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/feature_extraction_module.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..543557ab2a32f03b6809ffa1e08169f0fe863fef GIT binary patch literal 2725 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/lab_notebook_reader.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/lab_notebook_reader.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f954d347d0d07fa334b7ab9f5ef73fb4d7c133eb GIT binary patch literal 4037 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/nwb_publish.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/nwb_publish.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36071e7ac1574d9a5ba765eebec08a076fd8b2c2 GIT binary patch literal 13236 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 XH@*=6YWxqBLj21JKTHCwp*sE-8MCUU literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b539732c2a9498ecf5003e1fec4b31a435f439f6 GIT binary patch literal 4872 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc_support.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9022df8712faeae6c26d779d954df2d1d458f61 GIT binary patch literal 4437 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/resource_file.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/resource_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c31d607e2b12cbab6b8750356456ea651144ee3 GIT binary patch literal 6161 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 Wo+mc-*0RgwtE4Pr*@zMrNB;rK$d%dv literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py b/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py new file mode 100644 index 0000000000..e35ab27b0f --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py @@ -0,0 +1,174 @@ +#!/usr/bin/python +import os +import h5py +import sys +import shutil +import traceback +import subprocess +from six import iteritems + +import nwb +from allensdk.internal.core.lims_pipeline_module import PipelineModule + +# development/debugging code +#infile = "Ndnf-IRES2-dgCre_Ai14-256189.05.01-compressed.nwb" +#outfile = "foo.nwb" +#if len(sys.argv) == 1: +# sys.argv.append(infile) +# sys.argv.append(outfile) + +# this script is meant to clone the core functionality of the +# existing (Igor) Hdf5->Nwb converter. +# the previous converter performed two distinct tasks. In this iteration, +# those tasks will be split into separate modules. This module will +# perform the file conversion. A second module will analyze the file +# and extract sweep data + +# window for leading test pulse, in seconds +PULSE_LEN = 0.1 +EXPERIMENT_START_TIME = 0.75 + + +def main(): + module = PipelineModule() + jin = module.input_data() + + infile = jin["input_nwb"] + outfile = jin["output_nwb"] + + # a temporary nwb file must be created. this is that file's name + tmpfile = outfile + ".tmp" + + # create temp file and make modifications to it using h5py + shutil.copy2(infile, tmpfile) + f = h5py.File(tmpfile, "a") + # change dataset names in acquisition time series to match that + # of existing ephys NWB files + # also rescale the contents of 'data' fields to match the scaling + # in original files + acq = f["acquisition/timeseries"] + sweep_nums = [] + for k, v in iteritems(acq): + # parse out sweep number + try: + num = int(k[5:10]) + except: + print("Error - unexpected sweep name encountered in IGOR nwb file") + print("Sweep called: '%s'" % k) + print("Expecting 5-digit sweep number between chars 5 and 9") + sys.exit(1) + swp = "Sweep_%d" % num + # rename objects + try: + acq.move(k, swp) + ts = acq[swp] + ts.move("stimulus_description", "aibs_stimulus_description") + except: + print("*** Error renaming HDF5 object in %s" % swp) + type_, value_, traceback_ = sys.exc_info() + print(traceback.print_tb(traceback_)) + sys.exit(1) + # rescale contents of data so conversion is 1.0 + try: + data = ts["data"] + scale = float(data.attrs["conversion"]) + data[...] = data.value * scale + data.attrs["conversion"] = 1.0 + except: + print("*** Error rescaling data in %s" % swp) + type_, value_, traceback_ = sys.exc_info() + print(traceback.print_tb(traceback_)) + sys.exit(1) + # keep track of sweep numbers + sweep_nums.append("%d"%num) + + ################################### + #... ditto for stimulus time series + stim = f["stimulus/presentation"] + for k, v in iteritems(stim): + # parse out sweep number + try: + num = int(k[5:10]) + except: + print("Error - unexpected sweep name encountered in IGOR nwb file") + print("Sweep called: '%s'" % k) + print("Expecting 5-digit sweep number between chars 5 and 9") + sys.exit(1) + swp = "Sweep_%d" % num + try: + stim.move(k, swp) + except: + print("Error renaming HDF5 group from %s to %s" % (k, swp)) + sys.exit(1) + # rescale contents of data so conversion is 1.0 + try: + ts = stim[swp] + data = ts["data"] + scale = float(data.attrs["conversion"]) + data[...] = data.value * scale + data.attrs["conversion"] = 1.0 + except: + print("*** Error rescaling data in %s" % swp) + type_, value_, traceback_ = sys.exc_info() + print(traceback.print_tb(traceback_)) + sys.exit(1) + + f.close() + + #################################################################### + # re-open file w/ nwb library and add indexing (epochs) + nd = nwb.NWB(filename=tmpfile, modify=True) + for num in sweep_nums: + ts = nd.file_pointer["acquisition/timeseries/Sweep_" + num] + # sweep epoch + t0 = ts["starting_time"].value + rate = float(ts["starting_time"].attrs["rate"]) + n = float(ts["num_samples"].value) + t1 = t0 + (n-1) * rate + ep = nd.create_epoch("Sweep_" + num, t0, t1) + ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_"+num) + ep.add_timeseries("response", "acquisition/timeseries/Sweep_"+num) + ep.finalize() + if "CurrentClampSeries" in ts.attrs["ancestry"]: + # test pulse epoch + t0 = ts["starting_time"].value + t1 = t0 + PULSE_LEN + ep = nd.create_epoch("TestPulse_" + num, t0, t1) + ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_"+num) + ep.add_timeseries("response", "acquisition/timeseries/Sweep_"+num) + ep.finalize() + # experiment epoch + t0 = ts["starting_time"].value + t1 = t0 + (n-1) * rate + t0 += EXPERIMENT_START_TIME + ep = nd.create_epoch("Experiment_" + num, t0, t1) + ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_"+num) + ep.add_timeseries("response", "acquisition/timeseries/Sweep_"+num) + ep.finalize() + nd.close() + + # rescaling the contents of the data arrays causes the file to grow + # execute hdf5-repack to get it back to its original size + try: + print("Repacking hdf5 file with compression") + process = subprocess.Popen(["h5repack", "-f", "GZIP=4", tmpfile, outfile], stdout=subprocess.PIPE) + process.wait() + except: + print("Unable to run h5repack on temporary nwb file") + print("--------------------------------------------") + raise + + try: + print("Removing temporary file") + os.remove(tmpfile) + except: + print("Unable to delete temporary file ('%s')" % tmpfile) + raise + + # done (nothing to return) + module.write_output_data({}) + + + +if __name__=='__main__': main() + diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py b/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py new file mode 100644 index 0000000000..f317aa07e3 --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py @@ -0,0 +1,524 @@ +import logging +import sys +import numpy as np +import h5py +from six import iteritems + +from qc_support import * +from lab_notebook_reader import * + +from allensdk.internal.core.lims_pipeline_module import PipelineModule +from allensdk.core.nwb_data_set import NwbDataSet + + +# manual keys are values that can be passed in through input.json. +# these values are used if the particular value cannot be computed. +# a better name might be 'DEFAULT_VALUE_KEYS' +MANUAL_KEYS = ['manual_seal_gohm', 'manual_initial_access_resistance_mohm', 'manual_initial_input_mohm' ] + +# names of blocks used in output.json +# for sweep-specific data: +JSON_BLOCK_SWEEP_DATA = "sweep_data" +# for data that applies to the entire experiment: +JSON_BLOCK_EXPERIMENT_DATA = "experiment_data" + +######################################################################## +# bootstrapping code +# this module doesn't know anything about what's in the supplied NWB +# file and simply assumes that it's an IVSCC file. it must find and +# fetch data as appropriate +# processing requires being able to pull out sweeps of specific types. +# create an index of those types here, and provide accessor functions +# for the indexed data + + +# local globals used to avoid having to pass parameters to functions that +# can be several calls deep before they're needed +# consider refactoring into QC class to avoid this approach +sweep_stim_map = None +stim_sweep_map = None +sweep_list = None +nwb_file_name = None + +# reads the NWB file and generates a mapping between sweep name and +# stimulus code, and vice versa +def build_sweep_stim_map(): + global sweep_stim_map, stim_sweep_map, nwb_file_name, sweep_list + try: + nwb_file = h5py.File(nwb_file_name, "r") + except: + raise Exception ("Unable to open input NWB file '%s'" % str(nwb_file_name)) + print("Opened '%s'" % str(nwb_file_name)) + sweep_stim_map = {} + stim_sweep_map = {} + sweep_list = [] + acq = nwb_file["acquisition/timeseries"] + for sweep in acq: + # if string storage is variable length, data appears to be stored + # or retrieved as an array of strings, so we need to take the + # first element. this happens with Igor-generated files. + # if the string is stored with fixed length, data appears to be + # stored as a string, so we must take the entire value + stim = acq[sweep]["aibs_stimulus_description"].value[0] + if len(stim) == 1: + stim = acq[sweep]["aibs_stimulus_description"].value + stim_sweep_map[stim] = sweep + #print "%s (%s) : %s (%s)" % (sweep, type(sweep), stim, type(stim)) + sweep_stim_map[sweep] = stim + sweep_list.append(sweep) + nwb_file.close() + +# fetches stimulus code for a given sweep name, or None if no stimulus +# was found for the specified sweep +def get_sweep_name_by_stimulus_code(stim_name): + """ Returns the first sweep name that uses the specified stimulus + type. 'First' does not mean lowest sweep number, only the first + one found using a [random] dictionary search. + + Input: stimulus name (string) + + Output: sweep name (string), or None if no sweep found for this stim + """ + global sweep_stim_map + for k,v in iteritems(stim_sweep_map): + if k.startswith(stim_name): + return v + return None + + +# returns True if stimulus name for specified sweep indicates the sweep +# is a ramp and False otherwise +def sweep_is_ramp(sweep_name): + """ Input: sweep name (string) + + Output: boolean (True if sweep is ramp, False otherwise) + """ + global sweep_stim_map + return sweep_stim_map[sweep_name].startswith('C1RP') + + +# old code based on using NwbDataSet objects. provide a way to +# create them in order to leverage old code as much as possible +def get_sweep_data(sweep_name): + """ Input: sweep name (string) + + Output: NwbDataSet object + """ + global nwb_file_name + try: + num = int(sweep_name.split('_')[-1]) + except: + print("Unable to parse sweep number from '%s'" % str(sweep_name)) + raise + return NwbDataSet(nwb_file_name).get_sweep(num) + + +# functions to lookup a sweep having the desired stimulus code +# NOTE: if multiple instance exist then only one instance is returned +def get_blowout_sweep(): + """ Returns NwbDataSet for the blowout sweep, or None if it's absent + """ + sweep_name = get_sweep_name_by_stimulus_code('EXTPBLWOUT') + if sweep_name is None: + return None + return get_sweep_data(sweep_name) + +def get_bath_sweep(): + """ Returns NwbDataSet for the bath sweep, or None if it's absent + """ + sweep_name = get_sweep_name_by_stimulus_code('EXTPINBATH') + if sweep_name is None: + return None + return get_sweep_data(sweep_name) + +def get_seal_sweep(): + """ Returns NwbDataSet for the seal sweep, or None if it's absent + """ + sweep_name = get_sweep_name_by_stimulus_code('EXTPCllATT') + if sweep_name is None: + return None + return get_sweep_data(sweep_name) + +def get_breakin_sweep(): + """ Returns NwbDataSet for the breakin sweep, or None if it's absent + """ + sweep_name = get_sweep_name_by_stimulus_code('EXTPBREAKN') + if sweep_name is None: + return None + return get_sweep_data(sweep_name) + + +######################################################################## + + +######################################################################## +# QC-relevant feature extraction code + +# cell-level values (for ephys_roi_results) +def cell_level_features(jin, jout, sweep_tag_list, manual_values): + """ + """ + output_data = {} + jout[JSON_BLOCK_EXPERIMENT_DATA] = output_data + # measure blowout voltage + try: + blowout_data = get_blowout_sweep() + blowout = measure_blowout(blowout_data['response'], + blowout_data['index_range'][0]) + output_data['blowout_mv'] = blowout + except: + msg = "Blowout is not available" + sweep_tag_list.append(msg) + logging.warning(msg) + output_data['blowout_mv'] = None + + + # measure "electrode 0" + try: + bath_data = get_bath_sweep() + e0 = measure_electrode_0(bath_data['response'], + bath_data['sampling_rate']) + output_data['electrode_0_pa'] = e0 + except: + msg = "Electrode 0 is not available" + sweep_tag_list.append(msg) + logging.warning(msg) + output_data['electrode_0_pa'] = None + + + # measure clamp seal + try: + seal_data = get_seal_sweep() + seal = measure_seal(seal_data['stimulus'], + seal_data['response'], + seal_data['sampling_rate']) + # error may arise in computing seal, which falls through to + # exception handler. if seal computation didn't fail but + # computation generated invalid value, trigger same + # exception handler with different error + if seal is None or not np.isfinite(seal): + raise Exception("Could not compute seal") + except: + # seal is not available, for whatever reason. log error + msg = "Seal is not available" + sweep_tag_list.append(msg) + logging.warning(msg) + # look for manual seal value and use it if it's available + seal = manual_values.get('manual_seal_gohm', None) + if seal is not None: + logging.info("using manual seal value: %f" % seal) + sweep_tag_list.append("Seal set using manual value") + output_data["seal_gohm"] = seal + + + # measure input and series resistance + # this requires two steps -- finding the breakin sweep, and then + # analyzing it + # if the value is unavailable then check to see if it was set manually + breakin_data = None + try: + breakin_data = get_breakin_sweep() + except: + logging.warning("Error reading breakin sweep.") + sweep_tag_list.append("Breakin sweep not found") + + ir = None # input resistance + sr = None # series resistance + if breakin_data is not None: + ########################### + # input resistance + try: + ir = measure_input_resistance(breakin_data['stimulus'], + breakin_data['response'], + breakin_data['sampling_rate']) + except: + logging.warning("Error reading input resistance.") + # apply manual value if it's available + if ir is None: + sweep_tag_list.append("Input resistance is not available") + ir = manual_values.get('manual_initial_input_mohm', None) + if ir is not None: + msg = "Using manual value for input resistance" + logging.info(msg) + sweep_tag_list.append(msg); + ########################### + # initial access resistance + try: + sr = measure_initial_access_resistance(breakin_data['stimulus'], + breakin_data['response'], + breakin_data['sampling_rate']) + except: + logging.warning("Error reading initial access resistance.") + # apply manual value if it's available + if sr is None: + sweep_tag_list.append("Initial access resistance is not available") + sr = manual_values.get('manual_initial_access_resistance_mohm', None) + if sr is not None: + msg = "Using manual initial access resistance" + logging.info(msg) + sweep_tag_list.append(msg) + # + output_data['input_resistance_mohm'] = ir + output_data["initial_access_resistance_mohm"] = sr + + sr_ratio = None # input access resistance ratio + if ir is not None and sr is not None: + try: + sr_ratio = sr / ir + except: + pass # let sr_ratio stay as None + output_data['input_access_resistance_ratio'] = sr_ratio + + +############################## +def sweep_level_features(jin, jout, sweep_tag_list): + """ + """ + global sweep_list + # pull out features from each sweep (for ephys_sweeps) + cnt = 0 + jout[JSON_BLOCK_SWEEP_DATA] = {} + for sweep_name in sweep_list: + # pull data streams from file + sweep_num = int(sweep_name.split('_')[-1]) + try: + sweep_data = NwbDataSet(nwb_file_name).get_sweep(sweep_num) + except: + logging.warning("Error reading sweep %d" % sweep_num) + continue + sweep = {} + jout[JSON_BLOCK_SWEEP_DATA][sweep_name] = sweep + + # don't process voltage clamp sweeps + if sweep_data["stimulus_unit"] == "Volts": + continue # voltage-clamp + + volts = sweep_data['response'] + current = sweep_data['stimulus'] + hz = sweep_data['sampling_rate'] + idx_start, idx_stop = sweep_data['index_range'] + + # measure Vm and noise before stimulus + idx0, idx1 = get_first_vm_noise_epoch(idx_start, current, hz) + _, rms0 = measure_vm(1e3 * volts[idx0:idx1]) + + sweep["pre_noise_rms_mv"] = float(rms0) + + # measure Vm and noise at end of recording + # only do so if acquisition not truncated + # do not check for ramps, because they do not have enough time to recover + mean1 = None + sweep_not_truncated = ( idx_stop == len(current) - 1 ) + if sweep_not_truncated and not sweep_is_ramp(sweep_name): + idx0, idx1 = get_last_vm_epoch(idx_stop, current, hz) + mean1, _ = measure_vm(1e3 * volts[idx0:idx1]) + idx0, idx1 = get_last_vm_noise_epoch(idx_stop, current, hz) + _, rms1 = measure_vm(1e3 * volts[idx0:idx1]) + sweep["post_vm_mv"] = float(mean1) + sweep["post_noise_rms_mv"] = float(rms1) + + # measure Vm and noise over extended interval, to check stability + stim_start = find_stim_start(idx_start, current) + sweep['stimulus_start_time'] = stim_start / sweep_data['sampling_rate'] + + idx0, idx1 = get_stability_vm_epoch(idx_start, stim_start, hz) + mean2, rms2 = measure_vm(1000 * volts[idx0:idx1]) + + slow_noise = float(rms2) + sweep["slow_vm_mv"] = float(mean2) + sweep["slow_noise_rms_mv"] = float(rms2) + + # for now (mid-feb 15), make vm_mv the same for pre and slow + mean0 = mean2 + sweep["pre_vm_mv"] = float(mean0) + if mean1 is not None: + delta = abs(mean0 - mean1) + sweep["vm_delta_mv"] = float(delta) + else: + # Use None as 'nan' still breaks the ruby strategies + sweep["vm_delta_mv"] = None + + # compute stimulus duration, amplitude, interal + stim_amp, stim_dur = find_stim_amplitude_and_duration(idx_start, current, hz) + stim_int = find_stim_interval(idx_start, current, hz) + + sweep['stimulus_amplitude'] = stim_amp * 1e12 + sweep['stimulus_duration'] = stim_dur + sweep['stimulus_interval'] = stim_int + + tag_list = [] + for i in range(len(sweep_tag_list)): + tag = {} + tag["name"] = sweep_tag_list[i] + tag_list.append(tag) + sweep["ephys_sweep_tags"] = tag_list + + +# create a summary table of sweeps and stimuli +def summarize_sweeps(jin, jout): + global nwb_file_name + # build stimulus name map + stim_type_name_map = {} + for group_name, raw_names in iteritems(jin["ephys_raw_stimulus_names"]): + for n in raw_names: + stim_type_name_map[n] = group_name + + h5_file_name = jin.get("input_h5", None) + notebook = create_lab_notebook_reader(nwb_file_name, h5_file_name) + borg = h5py.File(nwb_file_name, 'r') + + # two json blocks to store data in + exp_data = jout[JSON_BLOCK_EXPERIMENT_DATA] + swp_data = jout[JSON_BLOCK_SWEEP_DATA] + #jout["sweep_summary"] = output_data + +# # verify input file generated by Igor +# generated_by = borg["general/generated_by"].value +# igor = False +# for row in generated_by: +# if row[0] == "Program" and row[1].startswith('Igor'): +# igor = True +# break +# if not igor: +# print("Error -- File not recognized as Igor-generated NWB file") +# return -1 + + # validated nwb files can have different types of string storage + # problem seems to be related to h5py and if string is stored as + # fixed- or variable-width. assume that string is more than one + # character and try to auto-correct for this issue + session_date = borg["session_start_time"].value + if len(session_date) == 1: + session_date = session_date[0] + exp_data['recording_date'] = session_date + + # get sampling rate + # use same output strategy as h5-nwb converter + # pick the sampling rate from the first iclamp sweep + # TODO: figure this out for multipatch + sampling_rate = None + for sweep_name in borg["acquisition/timeseries"]: + sweep_ts = borg["acquisition/timeseries"][sweep_name] + ancestry = sweep_ts.attrs["ancestry"] + if "CurrentClamp" in ancestry[-1]: + if sampling_rate is None: + sampling_rate = sweep_ts["starting_time"].attrs["rate"] + break + if sampling_rate is None: + raise Exception("Unable to determine sampling rate from current clamp sweep.") + exp_data['sampling_rate'] = sampling_rate +# sweep_data = [] +# output_data["sweep_summary"] = sweep_data + + # read sweep-specific data + for sweep_name in borg["acquisition/timeseries"]: + # get h5 timeseries object, and the sweep number + sweep_ts = borg["acquisition/timeseries"][sweep_name] + sweep_num = int(sweep_name.split('_')[-1]) + #sweep_num = int(sweep_name[:-4].split('_')[-1]) # for reading igor nwb + # fetch stim name from lab notebook + stim_name = notebook.get_value("Stim Wave Name", sweep_num, "") + if len(stim_name) == 0: + raise Exception("Could not read stimulus wave name from lab notebook for sweep %d" % sweep_num) + + # stim units are based on timeseries type + ancestry = sweep_ts.attrs["ancestry"] + if "CurrentClamp" in ancestry[-1]: + stim_units = 'pA' + elif "VoltageClamp" in ancestry[-1]: + stim_units = 'mV' + else: + # it's probably OK to skip this sweep and put a 'continue' + # here instead of an exception, but wait until there's + # an actual error and investigate the data before doing so + raise Exception("Unable to determine clamp mode in " + sweep_name) + + # stim name stored in database as, eg, C2SSTRIPLE150429 + # stim name in igor nwb stored as C2SSTRIPLE150429_DA_0 + # -> need to strip last 5 chars off to make match for lookup + stim_type_name = stim_type_name_map.get(stim_name[:-5], None) + if stim_type_name is None: + raise Exception("Could not find stimulus raw name (\"%s\") for sweep %d." % (stim_name, sweep_num)) + + # voltage-clamp sweeps shouldn't have a record yet -- make one + if sweep_name not in swp_data: + swp_data[sweep_name] = {} + info = swp_data[sweep_name] + + # sweep number + info["sweep_number"] = sweep_num + # bridge balance + bridge_balance = notebook.get_value("Bridge Bal Value", sweep_num, None) + # IT-14677 + # if bridge_balance is None, that's OK. do NOT change it to NaN + + info["bridge_balance_mohm"] = bridge_balance + # stimulus units + info["stimulus_units"] = stim_units + # leak_pa (bias current) + bias_current = notebook.get_value("I-Clamp Holding Level", sweep_num, None) + # IT-14677 + # if bias_current is None, that's OK. do NOT change it to NaN + + info["leak_pa"] = bias_current + # + # ephys stim info + scale_factor = notebook.get_value("Scale Factor", sweep_num, None) + if scale_factor is None: + raise Exception("Unable to read scale factor for " + sweep_name) + # PBS-229 change stim name by appending set_sweep_count + cnt = notebook.get_value("Set Sweep Count", sweep_num, 0) + stim_name_ext = stim_name.split('_')[0] + "[%d]" % int(cnt) + info["ephys_stimulus"] = { + #'description': stim_name, + 'description': stim_name_ext, + 'amplitude': scale_factor, + 'ephys_stimulus_type': { 'name': stim_type_name } + } + # + borg.close() + + +######################################################################## +######################################################################## + + +def main(jin): + # to avoid passing arguments amongs the many functions and procedures, + # set a global value 'nwb_file_name' that each function can read + global nwb_file_name + nwb_file_name = jin["input_nwb"] + + # initialize index of stimuli and sweeps + build_sweep_stim_map() + + # TODO Document manual keys, and what they're for + manual_values = {} + for k in MANUAL_KEYS: + if k in jin: + manual_values[k] = jin[k] + + # dictionary for json output + jout = {} + + # list of messages (tags) that log information about this sweep set + # (eg, 'Seal not available') + sweep_tag_list = [] + + cell_level_features(jin, jout, sweep_tag_list, manual_values) + # sweep level data. first pull out QC-relevant metrics, then store + # stimulus info with that data + sweep_level_features(jin, jout, sweep_tag_list) + summarize_sweeps(jin, jout) + + return jout + + + +if __name__ == "__main__": + # read module input. PipelineModule object automatically parses the + # command line to pull out input.json and output.json file names + module = PipelineModule() + jin = module.input_data() # loads input.json + jout = main(jin) + module.write_output_data(jout) # writes output.json diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py b/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py new file mode 100644 index 0000000000..07b1102e4b --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py @@ -0,0 +1,93 @@ +#!/usr/bin/python +import sys, logging +import os +import json +import shutil +import argparse +import copy +import numpy as np +import shutil + +from allensdk.config.manifest import Manifest + +import allensdk.internal.core.lims_utilities as lims_utilities +import allensdk.core.json_utilities as json_utilities + +from allensdk.internal.ephys.core_feature_extract import * +from allensdk.ephys.ephys_features import FeatureError + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('input_json') + parser.add_argument('output_json') + parser.add_argument('--log_level') + parser.add_argument('--output_directory') + + args = parser.parse_args() + + if args.log_level: + logging.getLogger().setLevel(args.log_level) + + return args + +def main(): + args = parse_args() + + input_data = json_utilities.read(args.input_json) + input_err, stim_types = input_data + + output_data = copy.deepcopy(input_err) + + err_wkfs = output_data['well_known_files'] + nwb_file = lims_utilities.get_well_known_file_by_type(err_wkfs, lims_utilities.NWB_FILE_TYPE_ID) + storage_directory = args.output_directory or output_data['storage_directory'] + # move code to help make data extraction compatible with ephys qc tool + try: + sweep_list, sweep_features = extract_data(output_data, nwb_file) + except FeatureError as e: + logging.error("Error computing cell features, auto-failing cell: %s" % e.message) + output_data["workflow_state"] = "auto_failed" + json_utilities.write(args.output_json, output_data) + return + # + + # embed spike times in NWB file + logging.debug("Embedding spike times") + tmp_nwb_file = os.path.join(storage_directory, os.path.basename(nwb_file) + '.tmp') + out_nwb_file = os.path.join(storage_directory, os.path.basename(nwb_file)) + + shutil.copy(nwb_file, tmp_nwb_file) + for sweep in sweep_list: + sweep_num = sweep['sweep_number'] + + if sweep_num not in sweep_features: + continue + + try: + spikes = sweep_features[sweep_num]['spikes'] + spike_times = [ s['threshold_t'] for s in spikes ] + NwbDataSet(tmp_nwb_file).set_spike_times(sweep_num, spike_times) + except Exception as e: + logging.info("sweep %d has no sweep features. %s", sweep_num, e.message) + + try: + shutil.move(tmp_nwb_file, out_nwb_file) + except OSError as e: + logging.error("Problem renaming file: %s -> %s" % (tmp_nwb_file, out_nwb_file)) + raise e + + qc_fig_dir = os.path.join(storage_directory, 'qc_figures') + save_qc_figures(qc_fig_dir, nwb_file, output_data, True) + + # regenerating this file + features_json = os.path.join(storage_directory, "%d_ephys_features.json" % output_data['id']) + json_utilities.write(features_json, output_data) + lims_utilities.append_well_known_file(output_data['well_known_files'], features_json) + + # write output json files + json_utilities.write(args.output_json, output_data) + + +if __name__ == "__main__": + main() diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py b/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py new file mode 100644 index 0000000000..951eced637 --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py @@ -0,0 +1,181 @@ +import h5py +import math + +class LabNotebookReader(object): + def __init__(self): + self.register_enabled_names() + + # mapping of notebook keys to keys representing if that value is + # enabled + # move this to subclasses if/when key names diverge + def register_enabled_names(self): + self.enabled = {} + self.enabled["V-Clamp Holding Level"] = "V-Clamp Holding Enable" + self.enabled["RsComp Bandwidth"] = "RsComp Enable" + self.enabled["RsComp Correction"] = "RsComp Enable" + self.enabled["RsComp Prediction"] = "RsComp Enable" + self.enabled["Whole Cell Comp Cap"] = "Whole Cell Comp Enable" + self.enabled["Whole Cell Comp Resist"] = "Whole Cell Comp Enable" + self.enabled["I-Clamp Holding Level"] = "I-Clamp Holding Enable" + self.enabled["Neut Cap Value"] = "Neut Cap Enable" + self.enabled["Bridge Bal Value"] = "Bridge Bal Enable" + + + # lab notebook has two sections, one for numeric data and the other + # for text data. this is an internal function to fetch data from + # the numeric part of the notebook + def get_numeric_value(self, name, data_col, sweep_col, enable_col, sweep_num, default_val): + data = self.val_number + # val_number has 3 dimensions -- the first has a shape of + # (#fields * 9). there are many hundreds of elements in this + # dimension. they look to represent the full array of values + # (for each field for each multipatch) for a given point in + # time, and thus given sweep + # according to Thomas Braun (igor nwb dev), the first 8 pages are + # for headstage data, and the 9th is for headstage-independent + # data + # return value is last non-empty entry in specified column + # for specified sweep number + return_val = default_val + for sample in data: + swp = sample[sweep_col][0] + if math.isnan(swp): + continue + if int(swp) == sweep_num: + if enable_col is not None and sample[enable_col][0] != 1.0: + continue # 'enable' flag present and it's turned off + val = sample[data_col][0] + if not math.isnan(val): + return_val = val + return return_val + + # internal function for fetching data from the text part of the notebook + def get_text_value(self, name, data_col, sweep_col, enable_col, sweep_num, default_val): + data = self.val_text + # algorithm mirrors get_numeric_value + # return value is last non-empty entry in specified column + # for specified sweep number + return_val = default_val + for sample in data: + swp = sample[sweep_col][0] + if len(swp) == 0: + continue + if int(swp) == int(sweep_num): + if enable_col is not None: # and sample[enable_col][0] != 1.0: + # this shouldn't happen, but if it does then bitch + # as this situation hasn't been tested (eg, is + # enabled indicated by 1.0, or "1.0" or "true" or ??) + Exception("Enable flag not expected for text values") + #continue # 'enable' flag present and it's turned off + val = sample[data_col][0] + if len(val) > 0: + return_val = val + return return_val + + # looks for key in lab notebook and returns the value associated with + # the specified sweep, or the default value if no value is found + # (NaN and empty strings are considered to be non-values) + def get_value(self, name, sweep_num, default_val): + # name_number has 3 dimensions -- the first has shape + # (#fields * 9) and stores the key names. the second looks + # to store units for those keys. The third is numeric text + # but it's role isn't clear + numeric_fields = self.colname_number[0] + text_fields = self.colname_text[0] + # val_number has 3 dimensions -- the first has a shape of + # (#fields * 9). there are many hundreds of elements in this + # dimension. they look to represent the full array of values + # (for each field for each multipatch) for a given point in + # time, and thus given sweep + if name in numeric_fields: + sweep_idx = numeric_fields.tolist().index("SweepNum") + enable_idx = None + if name in self.enabled: + enable_col = self.enabled[name] + enable_idx = numeric_fields.tolist().index(enable_col) + field_idx = numeric_fields.tolist().index(name) + return self.get_numeric_value(name, field_idx, sweep_idx, enable_idx, sweep_num, default_val) + elif name in text_fields: + # first check to see if file includes old version of column name + if "Sweep #" in text_fields: + sweep_idx = text_fields.tolist().index("Sweep #") + else: + sweep_idx = text_fields.tolist().index("SweepNum") + enable_idx = None + if name in self.enabled: + enable_col = self.enabled[name] + enable_idx = text_fields.tolist().index(enable_col) + field_idx = text_fields.tolist().index(name) + return self.get_text_value(name, field_idx, sweep_idx, enable_idx, sweep_num, default_val) + else: + return default_val + + + +""" Loads lab notebook data out of a first-generation IVSCC NWB file, + that was manually translated from the IGOR h5 dump. + Notebook data can be read through get_value() function +""" +class LabNotebookReaderIvscc(LabNotebookReader): + def __init__(self, nwb_file, h5_file): + LabNotebookReader.__init__(self) + # for lab notebook, select first group + h5 = h5py.File(h5_file, "r") + # + # TODO FIXME check notebook version... but how? + # + notebook = h5["MIES/LabNoteBook/ITC18USB/Device0"] + # load column data into memory + self.colname_number = notebook["KeyWave/keyWave"].value + self.val_number = notebook["settingsHistory/settingsHistory"].value + self.colname_text = notebook["TextDocKeyWave/txtDocKeyWave"].value + self.val_text = notebook["textDocumentation/txtDocWave"].value + h5.close() + + + +######################################################################## +######################################################################## +""" Loads lab notebook data out of an Igor-generated NWB file. + Module input is the name of the nwb file. + Notebook data can be read through get_value() function +""" +class LabNotebookReaderIgorNwb(LabNotebookReader): + def __init__(self, nwb_file): + LabNotebookReader.__init__(self) + # for lab notebook, select first group + # NOTE this probably won't work for multipatch + h5 = h5py.File(nwb_file, "r") + # + # TODO FIXME check notebook version + # + for k in h5["general/labnotebook"]: + notebook = h5["general/labnotebook"][k] + break + # load column data into memory + self.val_text = notebook["textualValues"].value + self.colname_text = notebook["textualKeys"].value + self.val_number = notebook["numericalValues"].value + self.colname_number = notebook["numericalKeys"].value + h5.close() + # + self.register_enabled_names() + + + +# creates LabNotebookReader appropriate to ivscc-NWB file version +def create_lab_notebook_reader(nwb_file, h5_file=None): + pass + h5 = h5py.File(nwb_file, "r") + if "general/labnotebook" in h5: + version = "IgorNwb" + else: + version = "IgorH5" + h5.close() + if version == "IgorNwb": + return LabNotebookReaderIgorNwb(nwb_file) + elif version == "IgorH5": + return LabNotebookReaderIvscc(nwb_file, h5_file) + else: + Exception("Unable to determine NWB input type") + diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py b/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py new file mode 100644 index 0000000000..ad50ec72c7 --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py @@ -0,0 +1,667 @@ +import logging +import sys +import os +import h5py +import subprocess +import shutil +import numpy as np +import traceback +import nwb.nwb as nwb +import nwb.nwbco as nwbco +import resource_file +from collections import defaultdict +from six import iteritems + +from allensdk.core.nwb_data_set import NwbDataSet +import allensdk.ephys.extract_cell_features as extract_cell_features + +from allensdk.internal.core.lims_pipeline_module import PipelineModule + +# changes +""" +added to main block: + "nwb_file": "igor_converted_256189.05.01.nwb", + "publish_nwb": "to_publish.nwb", + "metadata_file": "nwb_metadata.yml", + + +""" + +local_dir = os.path.dirname(os.path.realpath(__file__)) +if not local_dir.endswith('/'): + local_dir += '/' + + +ELECTRODE_NAME = "Electrode 1" +ELECTRODE_PATH = "/general/intracellular_ephys/" + ELECTRODE_NAME + +PIPELINE_NAME = "IVSCC" +PIPELINE_VERSION = "1.0" + +def copy_val(old_ts, new_ts, name): + if name in old_ts: + val = old_ts[name].value + attrs = {} + for x in old_ts[name].attrs: + # these are handled by nwb-api natively, no need to copy manually + if x in [ "neurodata_type", "unit", "units" ]: + continue + attrs[x] = old_ts[name].attrs[x] + new_ts.set_value(name, val, **attrs) + +def copy_timeseries(timeseries, old_file, new_file, folder, metadata): + try: + name = "" + for name in timeseries: + old_ts = old_file[folder][name] + family = old_ts.attrs["ancestry"] + if family[-1] == "VoltageClampSeries": + family = family[-1] + category = "acquisition" + elif family[-1] == "CurrentClampSeries": + family = family[-1] + category = "acquisition" + elif family[-1] == "VoltageClampStimulusSeries": + family = family[-1] + category = "stimulus" + elif family[-1] == "CurrentClampStimulusSeries": + family = family[-1] + category = "stimulus" + else: + raise Exception("Time series '%s' is of unknown type" % name) + new_ts = new_file.create_timeseries(family, name, category) + # copy data + num_samples = old_ts["num_samples"].value + data = old_ts["data"].value + conversion = old_ts["data"].attrs["conversion"] + resolution = old_ts["data"].attrs["resolution"] + + # newer experiments use the "unit" attribute + if "unit" in old_ts["data"].attrs: + unit = old_ts["data"].attrs["unit"] + elif "units" in old_ts["data"].attrs: + # older experiments put this in "units" + unit = old_ts["data"].attrs["units"] + + new_ts.set_data(data, conversion=conversion, resolution=resolution, unit=unit) + + start_time = old_ts["starting_time"].value + sampling_rate = old_ts["starting_time"].attrs["rate"] + new_ts.set_time_by_rate(start_time, sampling_rate) + new_ts.set_value("num_samples", num_samples) + + description = old_ts.attrs["description"] + try: + comments = old_ts.attrs["comments"] + except: + comments = old_ts.attrs["comment"] + source = old_ts.attrs["source"] + new_ts.set_value("comments", comments) + new_ts.set_value("description", description) + new_ts.set_value("source", source) + + copy_val(old_ts, new_ts, "electrode_name") + copy_val(old_ts, new_ts, "capacitance_fast") + copy_val(old_ts, new_ts, "capacitance_slow") + copy_val(old_ts, new_ts, "resistance_comp_bandwidth") + copy_val(old_ts, new_ts, "resistance_comp_correction") + copy_val(old_ts, new_ts, "resistance_comp_prediction") + copy_val(old_ts, new_ts, "whole_cell_capaictance_comp") + copy_val(old_ts, new_ts, "whole_cell_series_resistance_comp") + copy_val(old_ts, new_ts, "bias_current") + copy_val(old_ts, new_ts, "bridge_balance") + copy_val(old_ts, new_ts, "capacitance_compensation") + copy_val(old_ts, new_ts, "stimulus_description") + # + new_ts.finalize() + except: + print("** Error copying timeseries data **") + print("** Timeseries: " + str(name)) + print("** Folder: " + folder) + print("-----------------------------------") + raise + +def copy_epochs(timeseries, old_file, new_file, folder): + try: + for name in timeseries: + anc = old_file["acquisition/timeseries/"+name].attrs["ancestry"] + if anc[-1] == "VoltageClampSeries": + continue + num = int(name.split('_')[-1]) + # experiment block + epname = "Experiment_%d" % num + ep = old_file["epochs/%s" % epname] + start = ep["start_time"].value + stop = ep["stop_time"].value + desc = ep["description"].value + ep = new_file.create_epoch(epname, start, stop) + ep.set_value("description", desc) + ep.add_timeseries("stimulus", "/stimulus/presentation/Sweep_%d" % num) + ep.add_timeseries("response", "/acquisition/timeseries/Sweep_%d" % num) + ep.finalize() + # test-pulse block + epname = "TestPulse_%d" % num + ep = old_file["epochs/%s" % epname] + start = ep["start_time"].value + stop = ep["stop_time"].value + desc = ep["description"].value + ep = new_file.create_epoch(epname, start, stop) + ep.set_value("description", desc) + ep.add_timeseries("stimulus", "/stimulus/presentation/Sweep_%d" % num) + ep.add_timeseries("response", "/acquisition/timeseries/Sweep_%d" % num) + ep.finalize() + # sweep block + epname = name + ep = old_file["epochs/%s" % epname] + start = ep["start_time"].value + stop = ep["stop_time"].value + desc = ep["description"].value + ep = new_file.create_epoch(epname, start, stop) + ep.set_value("description", desc) + ep.add_timeseries("stimulus", "/stimulus/presentation/Sweep_%d" % num) + ep.add_timeseries("response", "/acquisition/timeseries/Sweep_%d" % num) + ep.finalize() + + except: + print("** Error copying epoch data **") + print("------------------------------") + raise + + +def copy_file(infile, outfile, passing_sweeps, rsrc, metadata): + print("Opening '%s'" % infile) + old = h5py.File(infile, 'r') + # top-level data + try: + vargs = {} + vargs["identifier"] = old["identifier"].value[0] + ".edit" + vargs["start_time"] = old["session_start_time"].value[0] + vargs["description"] = old["session_description"].value[0] + vargs["overwrite"] = True + vargs["filename"] = outfile + vargs["auto_compress"] = True + except: + print("** Error extracting top-level metadata from input file **") + print("---------------------------------------------------------") + raise + + print("Creating '%s'" % outfile) + try: + out = nwb.NWB(**vargs) + except: + print("** Error creating output file '%s' **" % outfile) + print("---------------------------------------------------------") + raise + + # make list of time series + timeseries = [] + try: + acq = old["acquisition/timeseries"] + for ts in acq: + timeseries.append(ts) + except: + print("** Error extracting timeseries list **") + print("--------------------------------------") + raise + + ts_list = [] + # TODO remove items from list that are not to be copied + for num in passing_sweeps: + swp = "Sweep_%d" % num + for name in timeseries: + if name == swp: + ts_list.append(swp) + break + timeseries = ts_list + + # copy acquisition time series from source to destination files + copy_timeseries(timeseries, old, out, "acquisition/timeseries", metadata) + copy_timeseries(timeseries, old, out, "stimulus/presentation", metadata) + + copy_epochs(timeseries, old, out, "stimulus/presentation") + + write_metadata(out, rsrc, metadata) + + out.close() + +def organize_metadata(ephys_roi_result): + metadata = { 'sweeps': {} } + + cell_specimen = ephys_roi_result['specimens'][0] + slice_specimen = ephys_roi_result['specimen'] + + metadata['donor_id'] = cell_specimen['donor_id'] + metadata['specimen_name'] = cell_specimen['name'] + metadata['specimen_id'] = cell_specimen['id'] + try: + metadata['species'] = slice_specimen['donor']['organism']["name"] + except Exception as e: + logging.error("Unable to read organism name from input.json file") + raise + + # structure + try: + structure = cell_specimen['structure'] + except Exception as e: + logging.error("Cell has no structure association.") + raise + + soma_location = {} + + db_cell_soma_location = cell_specimen['cell_soma_locations'][0] + soma_location = {} + try: + soma_location['cell_soma_location_x'] = 1e-9 * db_cell_soma_location['x'] + soma_location['cell_soma_location_y'] = 1e-9 * db_cell_soma_location['y'] + soma_location['cell_soma_location_z'] = 1e-9 * db_cell_soma_location['z'] + nd = db_cell_soma_location['normalized_depth'] + if nd is not None: + soma_location['cell_soma_location_normalized_depth'] = nd + except Exception as e: + logging.error(e.message) + raise + + structure_info = {} + try: + structure_info['structure_id'] = structure['id'] + structure_info['structure_name'] = structure['name'] + structure_info['structure_acronym'] = structure['acronym'] + except Exception as e: + logging.error("Structure information is missing from input.json") + raise + + structure_info.update(soma_location) + metadata['location'] = structure_info + + + tags = cell_specimen["specimen_tags"] + + dend_trunc = None + dend_type = None + for i in range(len(tags)): + name = tags[i]["name"] + toks = name.split(" - ") + if len(toks) != 2: + continue + if name.startswith("apical"): + dend_trunc = toks[1] + elif name.startswith("dendrite type"): + dend_type = toks[1] + + if dend_trunc is None: + raise Exception("Cell has no dendrite truncation tag.") + + if dend_type is None: + raise Exception("Cell has no dendrite type tag.") + + metadata['dendrite_type'] = dend_type + metadata['dendrite_trunc'] = dend_trunc + + metadata['ephys_roi_result_id'] = ephys_roi_result['id'] + metadata['seal_gohm'] = ephys_roi_result['seal_gohm'] + metadata['initial_access_resistance_mohm'] = ephys_roi_result['initial_access_resistance_mohm'] + + slice_specimen = ephys_roi_result['specimen'] + donor = slice_specimen['donor'] + + # gender + try: + metadata['gender'] = donor['gender']['name'] + except Exception as e: + logging.error("Donor requires gender association.") + raise + + # age + try: + age = donor['age'] + except Exception as e: + logging.error("Donor requires age association.") + raise + + metadata['age'] = { + 'date_of_birth': donor['date_of_birth'], + 'name': age['name'] + } + + + # cre line and genotype are mouse-only + if metadata['species'] == 'Mus musculus': + genotypes = donor['genotypes'] + + try: + reporter_genotype = next( g for g in genotypes if g['genotype_type_id'] == 177835595 ) + metadata['cre_line'] = reporter_genotype['name'] + except Exception as e: + logging.error("Could not find reporter genotype for mouse cell") + raise + + metadata['genotype'] = { + 'description': [ g['description'] for g in genotypes ], + 'type': [ g['name'] for g in genotypes ] + } + else: + logging.info("non-mouse cells do not have cre line or genotypes") + + # subject + metadata['subject'] = { + 'subject_id': cell_specimen['donor_id'], + 'comments': 'subject_id value here corresponds to Allen Institute cell specimen "donor_id"' + } + + # sweeps + sweeps = cell_specimen['ephys_sweeps'] + for sweep in sweeps: + if "invalid" in sweep and sweep["invalid"]: + logging.debug("skipping sweep %d, invalid" % sweep['sweep_number']) + continue + wfs = sweep['workflow_state'] + if wfs not in [ 'manual_passed', 'auto_passed' ]: + logging.debug("skipping sweep %d, not passed" % sweep['sweep_number']) + continue + + stimulus = sweep['ephys_stimulus'] + stimulus_type = stimulus['ephys_stimulus_type'] + + + metadata['sweeps'][sweep['sweep_number']] = { + 'stimulus_name': stimulus['description'], + 'stimulus_interval': sweep['stimulus_interval'], + 'stimulus_amplitude': sweep['stimulus_amplitude'], + 'stimulus_type_name': stimulus_type['name'], + 'stimulus_units': sweep["stimulus_units"] + } + + # IT-12498 add additional metadata to NWB file + url = "http://help.brain-map.org/display/celltypes/Documentation" + metadata["data_collection"] = "please see " + url + metadata["protocol"] = "please see " + url + metadata["pharmacology"] = "please see " + url + metadata["citation_policy"] = "please see " + url + metadata["institution"] = "Allen Institute for Brain Science" + metadata["generated_by"] = ["pipeline", PIPELINE_NAME, "version", PIPELINE_VERSION] + + return metadata + + +def write_metadata(nwb_file, resources, metadata): + nwb_file.set_metadata(nwbco.SEX, metadata['gender']) + if 'cre_line' in metadata: + nwb_file.set_metadata("aibs_cre_line", metadata['cre_line']) + + if 'genotype' in metadata: + genotype = metadata['genotype'] + genotype_name = '; '.join(genotype['type']) + nwb_file.set_metadata(nwbco.GENOTYPE, genotype_name, **genotype) + + nwb_file.set_metadata('generated_by', metadata['generated_by']) + + subject = metadata['subject'] + nwb_file.set_metadata(nwbco.SUBJECT, resources.get("subject"), **subject) + + age = metadata['age'] + nwb_file.set_metadata(nwbco.AGE, age['name'], **age) + + trode = ELECTRODE_NAME + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_DESCRIPTION(trode), resources.get("electrode_description")) + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_FILTERING(trode), resources.get("electrode_filtering")) + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_DEVICE(trode), resources.get("electrode_device")) + + location = metadata['location'] + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_LOCATION(trode), location['structure_name'], **location) + + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_RESISTANCE(trode), resources.get("electrode_resistance")) + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_SLICE(trode), resources.get("electrode_slice")) + + seal_gohm = str(metadata['seal_gohm']) + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_SEAL(trode), seal_gohm + " GOhm") + + acc = str(metadata["initial_access_resistance_mohm"]) + nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_INIT_ACCESS_RESISTANCE(trode), acc + " MOhm") + + session = { 'comments': 'session_id value corresponds to ephys_result_id' } + nwb_file.set_metadata(nwbco.SESSION_ID, str(metadata['ephys_roi_result_id']), **session) + + nwb_file.set_metadata("aibs_specimen_name", metadata['specimen_name']) + nwb_file.set_metadata("aibs_specimen_id", str(metadata['specimen_id'])) + + nwb_file.set_metadata("aibs_dendrite_type", metadata['dendrite_type']) + nwb_file.set_metadata("aibs_dendrite_trunc", metadata['dendrite_trunc']) + + # IT-12498 add additional metadata to NWB file + nwb_file.set_metadata(nwbco.DATA_COLLECTION, metadata["data_collection"]) + nwb_file.set_metadata(nwbco.INSTITUTION, metadata["institution"]) + nwb_file.set_metadata(nwbco.PROTOCOL, metadata["protocol"]) + nwb_file.set_metadata(nwbco.PHARMACOLOGY, metadata["pharmacology"]) + nwb_file.set_metadata("citation_policy", metadata["citation_policy"]) + nwb_file.set_metadata(nwbco.SPECIES, metadata['species']) + + + +def main(jin): + infile = jin[0]["nwb_file"] + outfile = jin[0]["publish_nwb"] + + tmpfile = outfile + ".working" + metafile = local_dir + jin[0]["metadata_file"] + # load metadata stored in YML file + metadata_desc_file = os.path.join(os.path.dirname(__file__), metafile) + rsrc = resource_file.ResourceFile() + rsrc.load(metadata_desc_file) + + # + metadata = organize_metadata(jin[0]) + + # TODO dig deeper here + # only fetching metadata for passing sweeps + passing_sweeps = metadata['sweeps'].keys() + + copy_file(infile, outfile, passing_sweeps, rsrc, metadata) + +# try: +# shutil.copyfile(infile, tmpfile) +# except: +# print("Unable to copy '%s' to %s" % (infile, tmpfile)) +# print("----------------------------") +# raise + +# # open NWB file so the modification date is updated +# # add metadata then close file and do remaining manipulations using +# # HDF5 library (except DF's legacy code that interfaces w/ nwb file +# # using nwb library) +# args = {} +# args["filename"] = tmpfile +# args["modify"] = True +# try: +# nwb_file = nwb.NWB(**args) +# except: +# print("Error opening NWB file '%s'" % args["filename"]) +# raise +# write_metadata(nwb_file, rsrc, metadata) +# nwb_file.close() + + + + # open publish file directlya using HDF5 library + # 1) remove hdf5 groups corresponding to failed sweeps + # 2) add sweep-specific metadata data to file to match original publish + # format. this includes (acquisition and stimulus): + # aibs_stimulus_amplitude_pa + # aibs_stimulus_interval + # aibs_stimulus_name + # initial_access_resistance + # seal + hdf = h5py.File(outfile, "r+") +# ################################ +# # delete epochs, stim, recordings for non-passed sweeps +# epochs = hdf["epochs/"] +# for grp in epochs: +# try: +# num = int(str(grp).split('_')[-1]) +# except: +# continue +# if num not in passing_sweeps: +# del epochs[str(grp)] +# stim = hdf["stimulus/presentation"] +# for grp in stim: +# try: +# num = int(str(grp).split('_')[-1]) +# except: +# continue +# if num not in passing_sweeps: +# del stim[str(grp)] +# acq = hdf["acquisition/timeseries"] +# for grp in acq: +# try: +# num = int(str(grp).split('_')[-1]) +# except: +# continue +# if num not in passing_sweeps: +# del acq[str(grp)] + ################################ + # add data + acq = hdf["acquisition/timeseries"] + stim = hdf["stimulus/presentation"] + sweeps = jin[0]["specimens"][0]["ephys_sweeps"] + for grp in acq: + try: + num = int(str(grp).split('_')[-1]) + except: + continue + try: + for sweep in sweeps: + if sweep["sweep_number"] == num: + break + if sweep["sweep_number"] != num: + print(sweep) + print(num) + raise Exception("WTF") + # stim amplitude + amp = sweep["stimulus_amplitude"] + if amp is None: + amp = float('nan') + else: + amp = float(amp) + ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_amplitude_pa", data=amp) + ds.attrs["neurodata_type"] = "Custom" + ds = stim["Sweep_%d" % num].create_dataset("aibs_stimulus_amplitude_pa", data=amp) + ds.attrs["neurodata_type"] = "Custom" + # stim interval + interval = sweep["stimulus_interval"] + if interval is None: + interval = float('nan') + else: + interval = float(interval) + ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_interval", data=interval) + ds.attrs["neurodata_type"] = "Custom" + ds = stim["Sweep_%d" % num].create_dataset("aibs_stimulus_interval", data=interval) + ds.attrs["neurodata_type"] = "Custom" + # stim name + name = sweep["ephys_stimulus"]["ephys_stimulus_type"]["name"] + ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_name", data=name) + ds.attrs["neurodata_type"] = "Custom" + ds = stim["Sweep_%d" % num].create_dataset("aibs_stimulus_name", data=name) + ds.attrs["neurodata_type"] = "Custom" + # seal + seal = jin[0]["seal_gohm"] + if seal is None: + seal = float('nan') + else: + seal = float(seal) + ds = acq["Sweep_%d" % num].create_dataset("seal", data=seal) + ds.attrs["neurodata_type"] = "Custom" + ds = stim["Sweep_%d" % num].create_dataset("seal", data=seal) + ds.attrs["neurodata_type"] = "Custom" + # initial access resistance + res = jin[0]["initial_access_resistance_mohm"] + if res is None: + res = float('nan') + else: + res = float(res) + ds = acq["Sweep_%d" % num].create_dataset("initial_access_resistance", data=res) + ds.attrs["neurodata_type"] = "Custom" + ds = stim["Sweep_%d" % num].create_dataset("initial_access_resistance", data=res) + ds.attrs["neurodata_type"] = "Custom" + # +# # recycle code from old publish module for custom sweep metadata +# if num in metadata['sweeps']: +# sweep_md = metadata['sweeps'][num] +# stimulus_interval = sweep_md['stimulus_interval'] +# if stimulus_interval is None: +# stimulus_interval = float('nan') +# ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_interval", data=stimulus_interval) +# ds.attrs["neurodata_type"] = "Custom" +# # +# ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_name", data=sweep_md['stimulus_type_name']) +# ds.attrs["neurodata_type"] = "Custom" +# # +# ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_amplitude_%s" % stim_units, sweep_md['stimulus_amplitude']) +# ds.attrs["neurodata_type"] = "Custom" +# # +# ds = acq["Sweep_%d" % num].create_dataset("seal", sweep_md['seal_gohm']) +# ds.attrs["neurodata_type"] = "Custom" + except: + print("json parse error for sweep %d" % num) + raise + # all done + hdf.close() + + + # TODO describe what's happening here + sweeps_by_type = defaultdict(list) + for sweep_number, sweep_data in iteritems(metadata['sweeps']): + if sweep_data["stimulus_units"] in [ "pA", "Amps" ]: # only compute spikes for current clamp sweeps + sweeps_by_type[sweep_data['stimulus_type_name']].append(sweep_number) + + sweep_features = extract_cell_features.extract_sweep_features(NwbDataSet(outfile), sweeps_by_type) + + # TODO describe what's happening here + for sweep_num in passing_sweeps: + try: + spikes = sweep_features[sweep_num]['spikes'] + spike_times = [ s['threshold_t'] for s in spikes ] + NwbDataSet(outfile).set_spike_times(sweep_num, spike_times) + except Exception as e: + logging.info("sweep %d has no sweep features. %s" % (sweep_num, e.message) ) +# try: +# # remove spike times for non-passing sweeps +# spk = hdf["analysis/spike_times"] +# for grp in spk: +# try: +# num = int(str(grp).split('_')[-1]) +# except: +# continue +# if num not in passing_sweeps: +# del spk[str(grp)] +# except: +# + +# # rescaling the contents of the data arrays causes the file to grow +# # execute hdf5-repack to get it back to its original size +# try: +# print("Repacking hdf5 file with compression") +# process = subprocess.Popen(["h5repack", "-f", "GZIP=4", tmpfile, outfile], stdout=subprocess.PIPE) +# process.wait() +# except: +# print("Unable to run h5repack on temporary nwb file") +# print("--------------------------------------------") +# raise + +# try: +# print("Removing temporary file") +# os.remove(tmpfile) +# except: +# print("Unable to delete temporary file ('%s')" % tmpfile) +# raise + + empty = {} + return empty + + +if __name__ == "__main__": + # read module input. PipelineModule object automatically parses the + # command line to pull out input.json and output.json file names + module = PipelineModule() + jin = module.input_data() # loads input.json + jout = main(jin) + module.write_output_data(jout) # writes output.json + diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py b/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py new file mode 100644 index 0000000000..7e7416e04f --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py @@ -0,0 +1,254 @@ +#!/usr/bin/python +import logging +import sys +import math +import os +import re +import copy +import json +import numpy as np +import argparse +import h5py +from six import iteritems + +from allensdk.internal.core.lims_pipeline_module import PipelineModule +from allensdk.core.nwb_data_set import NwbDataSet + + +def main(jin): + # load QC criteria and sweep table from input json file + try: + qc_criteria = jin['ephys_qc_criteria'] + experiment_data = jin['experiment_data'] + sweep_data = jin['sweep_data'] + nwb_file = jin["nwb_file"] + except: + raise IOError("Input json file is missing requisite data") + + jout = {} + + # PBS-333 + # C1NSSEED stimuli have many instances, but these instances aren't + # stored with the sweep. Ie, the sweep stores the stimulus value + # C1NSSEED while the stimulus table stores C1NSSEED_2150112. + # To address this, check the stimulus table for any instance of + # C1NSSEED, and if it exists, append a plain-jane "C1NSSEED" stimulus + # so later checks work + for name in jin["current_clamp_stimuli"]: + if name.startswith("C1NSSEED_"): + jin["current_clamp_stimuli"].append("C1NSSEED") + + # list of reasons to fail entire cell. if anything is added to this list, + # the cell will be tagged for failure (ie, this list also serves + # as a 'fail' flag) + exp_fail_tags = [] + + experiment_state = {} + jout["experiment_data"] = experiment_state + + # blowout voltage + experiment_state["failed_blowout"] = False + try: + blowout = experiment_data["blowout_mv"] + low = qc_criteria["blowout_mv_min"] + high = qc_criteria["blowout_mv_max"] + if blowout is None or math.isnan(blowout): + exp_fail_tags.append("Missing blowout value (%s)" % str(blowout)) + experiment_state["failed_blowout"] = True + if blowout < low or blowout > high: + exp_fail_tags.append("blowout outside of range") + experiment_state["failed_blowout"] = True + except Exception as e: + exp_fail_tags.append("Error analyzing blowout. " + e.message) + experiment_state["failed_blowout"] = True + + + # "electrode 0" + experiment_state["failed_electrode_0"] = False + try: + e0 = experiment_data["electrode_0_pa"] + if e0 is None or math.isnan(e0): + exp_fail_tags.append("e0 -- missing value (%s)" % str(e0)) + experiment_state["failed_electrode_0"] = True + if abs(e0) > qc_criteria["electrode_0_pa_max"]: + exp_fail_tags.append("e0 -- exceeds max") + experiment_state["failed_electrode_0"] = True + except Exception as e: + exp_fail_tags.append("Error analyzing blowout. " + e.message) + experiment_state["failed_electrode_0"] = True + + + # measure clamp seal + experiment_state["failed_seal"] = False + try: + seal = experiment_data["seal_gohm"] + if seal is None or math.isnan(seal): + exp_fail_tags.append("Invalid seal (%s)" % str(seal)) + experiment_state["failed_seal"] = True + if seal < qc_criteria["seal_gohm_min"]: + tgt = qc_criteria["seal_gohm_min"] + reason = "%f versus criteria=%f" % (seal, tgt) + exp_fail_tags.append("Seal (%s)" % reason) + experiment_state["failed_seal"] = True + except Exception as e: + seal = None + msg = "Seal 0 is not available. %s" % e.message + logging.warning(msg) + exp_fail_tags.append(msg) + experiment_state["failed_seal"] = True + + + # input and access resistance + sr_tags = [] + + try: + sir_ratio = experiment_data['input_access_resistance_ratio'] + #r = experiment_data['input_resistance_mohm'] + except: + sr_tags.append("Resistance ratio not available") + + try: + sr = experiment_data['initial_access_resistance_mohm'] + except: + sr_tags.append("Initial access resistance not available") + + try: + if len(sr_tags) == 0: + experiment_state["failed_bad_rs"] = False + + if sr < qc_criteria["access_resistance_mohm_min"]: + experiment_state["failed_bad_rs"] = True + tgt = qc_criteria["access_resistance_mohm_min"] + reason = "%f versus criteria=%f" % (sr, tgt) + sr_tags.append("access-resistance low (%s)" % reason) + elif sr > qc_criteria["access_resistance_mohm_max"]: + experiment_state["failed_bad_rs"] = True + tgt = qc_criteria["access_resistance_mohm_max"] + reason = "%f versus criteria=%f" % (sr, tgt) + sr_tags.append("access-resistance high (%s)" % reason) + + if sir_ratio > qc_criteria["input_vs_access_resistance_min"]: + experiment_state["failed_bad_rs"] = True + tgt = qc_criteria["input_vs_access_resistance_min"] + reason = "%f versus criteria=%f" % (sir_ratio, tgt) + sr_tags.append("input/access resistance (%s)" % reason) + except Exception as e: + exp_fail_tags.append("Error analyzing access resistance. " + e.message) + + if len(sr_tags) > 0: + exp_fail_tags.extend(sr_tags) + + + experiment_state["fail_tags"] = exp_fail_tags + + + #################################################################### + # check features for each sweep + sweep_state = {} + jout["sweep_state"] = sweep_state + for name, sweep in iteritems(jin["sweep_data"]): + try: + # keep track of failures + fail_tags = [] + + sweep_num = sweep["sweep_number"] + + stim = sweep["ephys_stimulus"]["description"] + if stim.endswith("_DA_0"): + stim = stim[:-5] + unit = sweep["stimulus_units"] + # determine if sweep is current or voltage clamp + # name may end in "[#]", so strip out section after open bracket + stim_short = stim.split('[')[0] + if stim_short in jin["voltage_clamp_stimuli"]: + if unit != "Volts" and unit != "mV": + msg = "%s (%s) in wrong mode -- expected voltage clamp" % (name, stim) + fail_tags.append(msg) + elif stim_short in jin["current_clamp_stimuli"]: + if unit != "Amps" and unit != "pA": + msg = "%s (%s) in wrong mode -- expected current clamp" % (name, stim) + fail_tags.append(msg) + else: + fail_tags.append("%s has unrecognized stimulus (%s)" % (name, stim)) + + if unit == "Volts" or unit == "mV": + continue # no QC on voltage clamp + + if len(fail_tags) > 0: + sweep_state[name] = {} + sweep_state[name]["state"] = "Fail" + sweep_state[name]["reasons"] = fail_tags + continue + + # pull data streams from file (this is for detecting truncated + # sweeps) + sweep_data = NwbDataSet(nwb_file).get_sweep(sweep_num) + volts = sweep_data['response'] + current = sweep_data['stimulus'] + hz = sweep_data['sampling_rate'] + idx_start, idx_stop = sweep_data['index_range'] + + if sweep["pre_noise_rms_mv"] > qc_criteria["pre_noise_rms_mv_max"]: + fail_tags.append("pre-noise") + + # check Vm and noise at end of recording + # only do so if acquisition not truncated + # do not check for ramps, because they do not have + # enough time to recover + is_ramp = stim.startswith('C1RP') + if is_ramp: + logging.info("sweep %d skipping vrest criteria on ramp", sweep_num) + else: + # measure post-stimulus noise + sweep_not_truncated = ( idx_stop == len(current) - 1 ) + if sweep_not_truncated: + post_noise_rms_mv = sweep["post_noise_rms_mv"] + if post_noise_rms_mv > qc_criteria["post_noise_rms_mv_max"]: + fail_tags.append("post-noise") + else: + fail_tags.append("Truncated sweep") + + if sweep["slow_noise_rms_mv"] > qc_criteria["slow_noise_rms_mv_max"]: + fail_tags.append("slow noise above threshold") + + if sweep["vm_delta_mv"] > qc_criteria["vm_delta_mv_max"]: + fail_tags.append("Vm delta") + + + # fail sweeps if stimulus duration is zero + # Uncomment out hte following 3 lines to have sweeps without stimulus + # faile QC + if sweep["stimulus_duration"] <= 0: + desc = sweep["ephys_stimulus"]["description"] + if not desc.startswith("EXTP"): + fail_tags.append("No stimulus detected") + + + sweep_state[name] = {} + if len(fail_tags) > 0: + sweep_state[name]["state"] = "Fail" + sweep_state[name]["reasons"] = fail_tags + else: + sweep_state[name]["state"] = "Pass" + + except: + print("Error processing sweep %s" % name) + raise + + #################################### + # done - prepare and deliver results + if len(exp_fail_tags) > 0: + jout["qc_result"] = "failed" + else: + jout["qc_result"] = "passed" + + return jout + +if __name__ == "__main__": + # read module input. PipelineModule object automatically parses the + # command line to pull out input.json and output.json file names + module = PipelineModule() + jin = module.input_data() # loads input.json + jout = main(jin) + module.write_output_data(jout) # writes output.json + diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py b/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py new file mode 100644 index 0000000000..2c6fabfcb3 --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py @@ -0,0 +1,189 @@ +import numpy as np + +def measure_vm(seg): + vals = np.copy(seg) + if len(vals) < 1: + return 0, 0 + mean = np.mean(vals) + vals -= mean + rms = np.sqrt(np.mean(np.square(vals))) + return mean, rms + +######################################################################## +# experiment-level metrics + +def measure_blowout(v, idx0): + return 1e3 * np.mean(v[idx0:]) + +def measure_electrode_0(curr, hz, t=0.005): + n_time_steps = int(t * hz) + # electrode 0 is the average current reading with zero voltage input + # (ie, the equivalent of resting potential in current-clamp mode) + return 1e12 * np.mean(curr[0:n_time_steps]) + +def measure_seal(v, curr, hz): + t = np.arange(len(v)) / hz + return 1e-9 * get_r_from_stable_pulse_response(v, curr, t) + +def measure_input_resistance(v, curr, hz): + t = np.arange(len(v)) / hz + return 1e-6 * get_r_from_stable_pulse_response(v, curr, t) + +def measure_initial_access_resistance(v, curr, hz): + t = np.arange(len(v)) / hz + return 1e-6 * get_r_from_peak_pulse_response(v, curr, t) + + +######################################################################## + +def get_r_from_stable_pulse_response(v, i, t): + dv = np.diff(v) + up_idx = np.flatnonzero(dv > 0) + down_idx = np.flatnonzero(dv < 0) +# print up_idx +# print down_idx +# print "-----" + dt = t[1] - t[0] + one_ms = int(0.001 / dt) + r = [] + for ii in range(len(up_idx)): + # take average v and i one ms before + end = up_idx[ii] - 1 + start = end - one_ms +# print "\tbase" +# print "base interval: %d -> %d" % (start, end) + avg_v_base = np.mean(v[start:end]) + avg_i_base = np.mean(i[start:end]) +# print "\tv: %g" % avg_v_base +# print "\ti: %g" % avg_i_base + # take average v and i one ms before end + end = down_idx[ii]-1 + start = end - one_ms +# print "\tsteady" +# print "steady interval: %d -> %d" % (start, end) + avg_v_steady = np.mean(v[start:end]) + avg_i_steady = np.mean(i[start:end]) +# print "\tv: %g" % avg_v_steady +# print "\ti: %g" % avg_i_steady + r_instance = (avg_v_steady-avg_v_base) / (avg_i_steady-avg_i_base) +# print 1e-6*r_instance + r.append(r_instance) + return np.mean(r) + +def get_r_from_peak_pulse_response(v, i, t): + dv = np.diff(v) + up_idx = np.flatnonzero(dv > 0) + down_idx = np.flatnonzero(dv < 0) + dt = t[1] - t[0] + one_ms = int(0.001 / dt) + r = [] + for ii in range(len(up_idx)): + # take average v and i one ms before + end = up_idx[ii] - 1 + start = end - one_ms + avg_v_base = np.mean(v[start:end]) + avg_i_base = np.mean(i[start:end]) + # take average v and i one ms before end + start = up_idx[ii] + end = down_idx[ii] - 1 + idx = start + np.argmax(i[start:end]) + avg_v_peak = v[idx] + avg_i_peak = i[idx] + r_instance = (avg_v_peak-avg_v_base) / (avg_i_peak-avg_i_base) + r.append(r_instance) + return np.mean(r) + + + + + +def get_last_vm_epoch(idx1, stim, hz): + return idx1-int(0.500 * hz), idx1 + +def get_first_vm_noise_epoch(idx0, stim, hz): + t0 = idx0 + t1 = t0 + int(0.0015 * hz) + return t0, t1 + +def get_last_vm_noise_epoch(idx1, stim, hz): + return idx1-int(0.0015 * hz), idx1 + +#def get_stability_vm_epoch(idx0, stim, hz): +def get_stability_vm_epoch(idx0, stim_start, hz): + dur = int(0.500 * hz) + #stim_start = find_stim_start(idx0, stim) + if dur > stim_start-1: + dur = stim_start-1 + elif dur <= 0: + return 0, 0 + return stim_start-1-dur, stim_start-1 + +def find_stim_start(idx0, stim): + # find stim start, using adaptation of nathan's numpy algorithm + di = np.diff(stim) + up_idx = np.flatnonzero(di > 0) + down_idx = np.flatnonzero(di < 0) + first = -1 + for i in range(len(up_idx)): + if up_idx[i] >= idx0: + first = up_idx[i] + break + for i in range(len(down_idx)): + if down_idx[i] >= idx0 and down_idx[i] < first: + first = down_idx[i] + break + # +1 to be first index of stim, not last index of pre-stim + return first + 1 + +def find_stim_amplitude_and_duration(idx0, stim, hz): + + if len(stim) < idx0: + idx0 = 0 + + stim = stim[idx0:] + + peak_high = max(stim) + peak_low = min(stim) + + # measure stimulus length + # find index of first non-zero value, and last return to zero + nzero = np.where(stim!=0)[0] + if len(nzero) > 0: + start = nzero[0] + end = nzero[-1] + dur = (end - start) / hz + else: + dur = 0 + + dur = float(dur) + + if abs(peak_high) > abs(peak_low): + amp = float(peak_high) + else: + amp = float(peak_low) + + return amp, dur + +def find_stim_interval(idx0, stim, hz): + stim = stim[idx0:] + + # indices where is the stimulus off + zero_idxs = np.where(stim == 0)[0] + + # derivative of off indices. when greater than one, indicates on period + dzero_idxs = np.diff(zero_idxs) + dzero_break_idxs = np.where(dzero_idxs[:] > 1)[0] + + # duration of breaks + break_durs = dzero_idxs[dzero_break_idxs] + + # indices of breaks + break_idxs = zero_idxs[dzero_break_idxs] + 1 + + # time between break onsets + dbreaks = np.diff(break_idxs) + + if len(np.unique(break_durs)) == 1 and len(np.unique(dbreaks)) == 1: + return dbreaks[0] / hz + + return None diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py b/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py new file mode 100644 index 0000000000..d535e7f7c3 --- /dev/null +++ b/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py @@ -0,0 +1,187 @@ +import sys +import string +from six import iteritems + +class ResourceFile(object): + def __init__(self): + self.key_value = {} + self.accessed = {} + + def load(self, infile): + """ Reads in a json, yaml or toml resource file. If multiple files + are loaded, resources between them are merged. An error + occurs if the same key is loaded multiple times and different + values are defined for it + """ + if infile.endswith("json"): + self.load_json(infile) + elif infile.endswith("yml") or infile.endswith("yaml"): + self.load_yaml(infile) + elif infile.endswith("tml") or infile.endswith("toml"): + self.load_toml(infile) + else: + print("Unrecognized extension for file '%s'. Please use json, yaml or toml" % infile) + sys.exit(1) + + def get(self, key, default=None, replace_table=None): + """ Returns the resource value associated with the provided key. + + Arguments: + *key* (text) Name of resource + + *default* (text) Value to be returned if key isn't found + + *replace_table* (dict) Substrings that are to be replaced + in resource string. E.g., if replace_table = { foo: "bar" } + then all instances of "foo" in the resource string will be + replaced with "bar" + + Returns: + Resource string if found and default value if not, with + applied substitutions from replace_table + """ + self.accessed[key] = True + val = self.key_value.get(key, default) + if replace_table is not None: + for k,v in iteritems(replace_table): + val = string.replace(val, k, v) + return val + + def report(self): + """ Reports all resources that were defined but not used + """ + err = False + print("-------------------------------") + print("--- Resource report --") + for k,v in iteritems(self.accessed): + if not v: + if not err: + err = True + print("\t'%s' not used" % k) + if not err: + print("all defined resources were used") + print("-------------------------------") + + #################################################################### + # internal procedure to load json file + def load_json(self, infile): + """ Reads input json, yaml or toml file + """ + import json + try: + with open(infile, 'r') as f: + resources = json.load(f) + f.close() + except IOError: + print("Unable to open input json file '%s'" % infile) + sys.exit(1) + self.read_keys(resources) + + # internal procedure to load yaml + def load_yaml(self, infile): + try: + import yaml + try: + with open(infile, 'r') as f: + resources = yaml.load(f) + f.close() + except IOError: + print("Unable to open input yaml file '%s'" % infile) + sys.exit(1) + self.read_keys(resources) + except ImportError: + print("*** yaml not available -- please pip install pyyaml") + sys.exit(1) + + # internal procedure to load toml + def load_toml(self, infile): + try: + import toml + try: + with open(infile, 'r') as f: + resources = toml.load(f) + f.close() + except IOError: + print("Unable to open input toml file '%s'" % infile) + sys.exit(1) + self.read_keys(resources) + except ImportError: + print("*** toml not available -- please pip install toml") + sys.exit(1) + + + # internal procedure to read keys out of dictionary recursively + def read_keys(self, resources): + err = False + for k,v in iteritems(resources): + if isinstance(v, dict): + self.read_keys(v) + else: + if k in self.key_value and v != self.key_value[k]: + print("Error -- inconsistent values for key '%s'" % k) + err = True + self.key_value[k] = v + self.accessed[k] = False + if err: + sys.exit(1) + + +class ResourceFileTest(object): + def create_json(self, fname, rsrc): + import json + d = {} + d["jone"] = "json one" + d["jtwo"] = "json one" + d["jsub"] = {} + d["jsub"]["jthree"] = "json three" + with open(fname, 'w') as f: + json.dump(d, f, indent=2) + f.close() + rsrc.load(fname) + + def create_yaml(self, fname, rsrc): + try: + import yaml + d = {} + d["yone"] = "yaml one" + d["ytwo"] = "yaml one" + d["ysub"] = {} + d["ysub"]["ythree"] = "yaml three" + with open(fname, 'w') as f: + yaml.dump(d, f, indent=2) + f.close() + rsrc.load(fname) + except ImportError: + print("*** yaml not available -- please pip install pyyaml") + + def create_toml(self, fname, rsrc): + try: + import toml + d = {} + d["tone"] = "toml one" + d["ttwo"] = "toml one" + d["tsub"] = {} + d["tsub"]["tthree"] = "toml three" + with open(fname, 'w') as f: + toml.dump(d, f) + f.close() + rsrc.load(fname) + except ImportError: + print("*** toml not available -- please pip install toml") + + def run(self): + # create and load json, yaml and toml files + rsrc = ResourceFile() + self.create_json("tmp.json", rsrc) + self.create_yaml("tmp.yaml", rsrc) + self.create_toml("tmp.toml", rsrc) + # print resource from each + print(rsrc.get("jone", "json error")) + print(rsrc.get("yone", "** yaml error")) + print(rsrc.get("tone", "** toml error")) + print(rsrc.get("jthree", "json error")) + print(rsrc.get("ythree", "** yaml error")) + print(rsrc.get("tthree", "** toml error")) + # run report + rsrc.report() + diff --git a/internal/pipeline_modules/__init__.py b/internal/pipeline_modules/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/pipeline_modules/__pycache__/__init__.cpython-37.pyc b/internal/pipeline_modules/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad4e4181223b4c754a3ce8f65947425be7794cb2 GIT binary patch literal 202 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VJY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9wmG7D03GV@a7bMsS5b5e`-<Kr{)GE3s)^$IF) Pao9ja?LdzC48#loL`^z= literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_annotated_region_metrics.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_annotated_region_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a683605a9b5f79785f289d2c02da07e7f31fd18 GIT binary patch literal 1864 zcmbUiO^+Kj)b`9|CLf#4wnESf!E&HdKqLj!OI1*ptq=&hT6T*-RwT<AdlPTxOSaRJ zFhPPX;#BwxyW+%Onk%RN1x`FqlCo-rgz&`nd-i+J?>nDtZM6`L?Drq}TOmS!I%G2f z0PeyxKfxjpMFI<wV2bOVP*U$6^<eiBKMiPr9gUwf(vXHV93)ZNq|LNNTYxucTZFVD zBGHs>*%7UiK(s~Y38q_OOLU(g+7;WP2m7|{iJgZ;{~))|5O9)X)W5RmAI-8|o@Ke^ zR*GFMCo0c&Q)#t|&2G$-c$RPrXXY8Gj1Ky^>Q1C(Dl2A|otiv@leRlq^Yls8JyeBE zR3`7|VwT9NrDqvSYk2X_P;kqKDm%$_3W8%Z+~2!DR7PzC40)2s%!r4J^uN<SX9CGq z>WnADVy(pbWixbIJhzmsEZsahDCP??7(SpuqEhog+;GOiaG`W_AEr5kMc`#akY#95 ziOR5Sl);(5j4VDS=U$1eU!pU7L6%J$lzthN&C;_C;R*jdEYSrPfoMGSN+QCi4F~~( z5JU&`jlGTkk81bdUwQx7YKX~XPPbpUf98WCi|!?#vG13Q@cr92Z^EzdQU6gYQyQJ- zW0vt$(&#bx)T&hWy($9FvVz+w^@_2nf+U9^_ajX}W<_#S`R=mvPji)3p0QfHq^*3R zVp}y<QR}y8bL~GR=#H_u<`c<;(lQ2kt|MU4ko<_YO{`U6S1&f5bJ;XEmUcmMZ5@jf zZVc_@<5OT>W37MEi-z*M!ioL^>1~ks*Dw3GM_(JM&4^FA7>xO2p3O&l8ISW!@DE2a zdt^p=0Vx#2nitc#8GWh7BcrT*ui)`RP!)LBN%sHqr3!=`&n8{a$y|p85g+?F!VP={ zc2a*UT<^ebj2#UO7rZ9SI;HLcV9_})A+avVZ#R~>gpP0xQbVAhVP6u!y-T?F4cvT% zj?lNLB&B!as@OlMu%=hFv<m7tFXoIxwCzktdgb!rLZvf1g#z`bw~Be?f2tDM_p5Mv zi=6;i;ghPn;bg^>8(D4f71Ii>1F%|ppm^0zaxNIxn$OLfa9~{A5$@t1zK-=ZfMa*y zhASu!W^MI704zE~ODLjqe1U4Kv9s2alAPfYS$az!EXN-q>y=*VpMW2J#mfNb{W7?~ z>*65?v{UFjmc~fIrnmZmcJ8I?{Bf<ORztg|>CR&fIl%Inb-l}7_8XN4jR~^bQN991 z`c=2Q=E&QZ2w$|^Pr1r&0F`m^M-cRgM7V<+q)YVca8gB#IU2_LJ5|V-$YaK;Fv%wq zl})ru0DTn}`t~Lh2b<0{h;uCmb*ap(N|aU7)a6O<yi7aR?vZ>91@VZx+8g{^i(C2N z-IqoD^V|z9v-V|O{xmwi_XRuLd+-@;AMYQ1e)yn9>cn0-cw@8cH;i3!m#bM_XG?Tv d^&jxDs|4d1TzR;!17FXB@`2gwMPby5(BD@@6iNU9 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_demixing.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_demixing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2135c0b0a7ea81e345d2f077fc41eac552b591f8 GIT binary patch literal 6349 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_dff_computation.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_dff_computation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a850f65f189cb7e37482df353a3049077a854347 GIT binary patch literal 1651 zcma)6Pj4eN6t_Jyi6{S>mStC!mL)=hDiTQ#u$R>ev0HW#sOqk?S_zFJ4er=UCY{U# z+tbo$f&_&l-ysnvzLKw;_zD~l&ogakIpL9?-(UN^@$dP0yWK!A(%*h$MGc`ptZ*|3 zFrULz-vZ%?;{*lOiUVBABp~JL1P-huapzv(;mW5ruM>pPoCZE<9Pa*%f(G|^4c4Y; z@%kB&BhkD9ACBLkKK&C;K_`7|+7U~lJYiadd_0b@)x&ULx-gGms&9Z4XbqtpZO952 zu%1!*P-9N6@K0EinX`5ayus>I&^ZOZkF36oamyG|K=Kgt8th(a!vz@=NTqgS8gaVF zbvTX_u^g6s@9Q_OPI~iLsW_eVr1&n6rQp4BEE3*3_}Bel`Ka=@u|1v%)k`zo6W_;5 zt0%n=m1$<V-fn*QKQ_PRf6(`gGZEU<zk2mT%1j!PDdR4fo|;;9M&B_mXPQa-!=(LV zza!a%<*y%(o{ZiqA=QXY86Tdq3zlAvo~10xQqDdZiS%5JvV}-h1T<SrFV*NcJ{_r8 zi@}0LXKW%MHc7yPpF!qY$do0Ai+CZDI2GYM<9Q;~q0Cczbzzjvp-`sdEFCT`O>@Dd z5@A`f4+*I~APBbz#T2(-Ejc3FppC4_4x9P*+W!VYqcz^3mA!t#;ev6+k&2rU?r3M` za`#taEg%EtZb@}cZ%ICH+(>H=cE#FR*EVQfFYt`o9ksu10N>o;716B%z%?Q(XXWbl zx>Gp33E=Yz4?K4E(X6|wmHh6$?E&-)*+;8-;jQ;JfO7p#QM<w`T1L9O1(AM13m;<d zJw-*m<aUAcEB_d+8gTl%V8359Hc$;m0M7OnoHLcBTQFH+*&Ga#Y!W8oTqMv)buPv% zPxNwUFsJ}(aiN3`$jc+^EVCFO4gfa3Wm7g6YS|qOt^s%LE$tIwur&Ch|G-ctC*?hw z&NDg5=OWdw?X^nNVw{IyEp?_2nM|NnjQ7Qh=Wo9>jq38ju8a=|J_a)cQAp?5=4<?I z>W0j6<4VD}?7-0_9*jGE3=nc(LRSUtJJlHPoF%yk${MP2yeP>aCHsN}ox9Z-??M8e z<qp{TO;an=lE$@(1=nqVw|xRy9XEX()U;%gP;%F9>;S|A|9W>Y-t=`DZDCt>oooST z+&PQWec;r`KoH=)0bdt)%8!yR0sK2K@gAmx0%z@%xI}(r<7pV$9m25RmUU3bdzQR! z$paw4qnoZAo=WSNokIENOlR_P2x(S-;^EdQ%A^=t$b`9$lUT<B9ucbyI(N15J$r<0 l$ZZ}LC1F_A_Ma;0)9MBI%)Z%WciYacx_i%|UHSn<{{VGV%pU*% literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_eye_tracking.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_eye_tracking.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67111eb12e503152072db2c753468a7d73876372 GIT binary patch literal 2207 zcmb7FTW=dh6rS0Oy<T79xTQ1*q@n`CsuBlyK&m1{NE)@!rcvU&j4Z9jJ7asDy=iuw z*2YFc>1+56j(Fk^@vyHv^)K+mnc296!UOes&d$u9nLXz_^L_hWz3w9T#lQYc&!G2* z8mxXMbiRd_{RD;~hC@UUM@!6%D~yX7gBbdWNi2Q0iLLJ?Qi8h~mLrEaQH4~rzZJSs zl~kh|sYP{Cj~b)_^Ho-2<yV-jF^5%NA=2dQ%sn&2j5jY3JjW-fU3(2NphIHP;jnGw zjiVstVG#3Y37dpGcf}<3BHeFWc}<N1DX4$OMSj~)qI4p;*H0!f3*sSkUgmfAA06zT zKJ9wl$H$LO9zTD&?;Y&!b)O&Sw}xDL{AJ2T5b;=gK|Dwfd`rC_ehMzt_Ml|~48seH z84H`4i;_fRyfo&PH0S67Um1(Cv{Y~5%*%6!SvzQm7L_?>=&T~XpI4X-p7;U}jjv%| z+Vj#}dD^n1Aeo~(NI`OG&Q0)jFUtx<0Hb<1yWe3{(vFHvL{tWT*4f*A*5Om`>AWG$ z&g{YeaH3(z<BXln`tRV}S*?NqBo{FaJLz>nuB(uBR1I#1vz1QsW-^gb3XcVX`!W&J zS#5JOo<!b2(1>TRmw@N2QdG|Sl+BzkwjXY*e;dx%dBh{)jFY|>gEMhnKoAm2)V7EN z33w@$BVwlgEVskNr(s@CQW+!=oJYklYnO8)$#P4%<<>X};@r%n5M_9$P)9wtSm4XH zOX@d^&vN(g0Q06C37(CTka+{DG7#!45cm0M_vp0i?LRpt&dL4{-qCLNF{z&H9X~nh z7K6r(O(Ff<(xt1y>feyK4Yxmk+<VwN&A7;VbVS)!pT3~+w6_~mKZzOrs>kE=te2!v zEgx)>j;2}fY0&Rwf#jPhoOL?nu=cv1?^qd|@&07kfH<;Gz#wd?%V-%6b_@$UxCz$K zmxW7k8Ccu_KVLbkpAAiAqj~W=bR@b!3p58tj17jR336auns_y1N=w?SnPuq;EwC&D zGpr2+*4DP9?9x$87+1#bm7(ud;DiIaAz(&jVQ3GRp({hYk~LWCZUE!v2CMEAt84n% zQa`I*KdbK`Ss$Re@e5v<vawua4JBz1fjMqMTZh(SYnSE%_`AF{w+g`n?llkpd1gV3 zEICbiUS@niC!w6RHaFisCAk|V=K=Qy0cce{;*u)%>Y;D|E71beZCAvG8hoJ4n`yBQ z!`z}1nUI!G{SgO6QY0!kLz=~?4`=?&%YqpvA78VK#&II4<P12e-hRWSmQK<j^ip7f z%!u0uMfCI(+3*t)bKs2NgAhmx1X{V3wVN+y8-pMYvJq$ZfaEbq&ApY_w$0ovwpOW< z_y1!vjlo*PX<THWQE1;5hDx)PQUMgmYm_m?+KE!&+=M7|dk`j6iW0aHx5!z6D4J@W z37QQU0nIg(8Z)7eq)@t@m&0T@ggEt)6(6cC%DyP@|45D2UkG54w~{B=w{7Ppd{96X z)JyK`U9P_<q<X_obGI<>DJLtULHrr?vM<3PU`h)s78#l~CEU>5QA~2o8g61}h6|UW z8RwefbG3`(d1@ceYnz9M2kjPdLFCggkzvp$<^&*8EG0Hb6UeF&r=q5onb|ZW4^|Se zwG!toC<EULgDCUfl4*^)RzI@+?`3_VVo3V%x^t@Jdh6zgRYO~Vtcp?ysnUcuDJY%x lyc-B9of8@+XQ%jDe}iEvQ}YgXmDm6rO?=mO?>hG#^cVNzeXjrj literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_neuropil_correction.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_neuropil_correction.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..685c654109e497aeb9b2a1d77291ade1afac950c GIT binary patch literal 5942 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 V7*R>D>Lt50XRTU4(UvUje*uelV}Sqw literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_observatory_analysis.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_observatory_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eeb8160a1c6505fd39f7c028683f4007d8343b62 GIT binary patch literal 3230 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 VfkKb)YF>4c-Yr^R^nT`%e*<V0g%tn* literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_observatory_container_thumbnails.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_observatory_container_thumbnails.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a31a51ae844a34616a5d3127861f2239bd9f06de GIT binary patch literal 2436 zcmbtW&2t+y6qokHme(IiQ_`lTfH`D}Y3r2X)}ag~p+lifGfg@jG-h_zmYl4!AFd=f zwOJpS_L||=11Ebp@h|WP@JH;GQ~!mYc#@sO?E#o!ZGAjFJxTlC@AtG{SF0X^C;9E? z;HMHoe`(?5v7z%76!|Mu3^5!bI%_e-Mz*MBTASLYb*O9FLR_>EMlmsUiF#PuSy4Hz z&`MmTRU_l5HlMLXm(7SBor_oK3iKW3zC`pqtFR&?FEM?Om6!)3tNa2hA6nuSUwr{P zFuaQz)z@%7wB4|BPYe=2PT3&hd2J``^C(RC10y$ZP96kF*yU1nur`3lg5p5ggd$g< zQfPu1&d>!k#bcc5)vfJO=t&;&j;eoJ?}{|8r~QMW^!f8X7h%j3CF?2ojt;os^|L|0 zlO`&F{e>U0`tABU^MZuI%;r%l4!co$<VzJOUjO)Z{c1M|BhIdR@D5fq$la#{E`}gf z78l8F!R7BrK%CH<Up8;G9!oA{D>w*PvmG1-$*^@N3BZB{pSO7OOt#WKPh<ybbK=(h zu-%fO;y3z1=P=mkU>ij+gB@;!iQ*y&qK*FCYjZcs4eipj4LdyxR4RrGucZzKaXW#N z%VvL=uk3TRpbV34TGnnYK!vd5cvxupZb!pPKU&hoIR8)RFg&)IHFlUib`|R3iIus^ z&d>`ywZ?^gG%h~xDo4v(=tnvx%AFK4!kkMwSf#l|iMf{$D}aTU6(>bSGVd)-acVJg zY)vsnsx<L3&-BWZO6FyysfE$g>rarXW_DK03Ynvb2A&24E3?Y6o#D(9f3Pa6!RcU? zi)bGwngmP7MGav9%<}d~Y_LED;M8s^;y{HRxv_cY!A1ZM9?DQ|oVxwA^S}K+`sBav zIcogN%u~$C+zMH~oDNifpnMhz-~d2i<b??gG<z~lM&+5-2%3RL<!e<wR~g}T9RfV^ zItDY+UuPro+09!w^}k_L=UL2SN_uJAPlA|Jas-Z1z^xIvaYGIJT;6_zuQwb@0IPmK zPzTiRw`J}|X(xziHSMb~1?T#K*q4o3ZlyAJ^t9aRrD2lWQVD~;ydVI}U|!Q`ot;&O zDlY_m;0ntf7Iu`-If1Uqpv(O@IOMRS0GewLfJ=J7&m#de5;}b}%AyF3(Ak5!{U}wE z7Irru-P_rtWOwU(f9KBLx72(1cyH(Np1*bP5v`v3S1)+tF>?wV(g!6_`9`ei-kC!U z@n@Az+PTYkd$4~Vy7D?yKr;QaRxAhC;J1Pc*urbJhnHc*GCv2#^r-j<=6AG_e)MVt ziecg_=qU68jZp?1>{$#mYho*>=T0%RkAWfcaY)f8@}w|DkS<ZL*dvn?173`+=l3(s z)2*?c*{pC0jU8x<(7MW-lrsnB6qEzJD@<|A9v8<1IP6TSz&nzaGRv%1o4UZr@1D$< zMYc!9IUdA0I40!uBIDg)5UEiK6bFI_Oup996E$5e=}AjMXPmqML4+)pR|3W~P6j%2 zi&Z`CB2?7dx&Ls_-}_<bn_Y258#o$FxohB;yRsjJN?bMyy$vm!^=9Fr@3#kG#1^gu z|13G?#reS+UT(wX1Q-LviFLE-EV^CD{^CPDu%tsiC!8h`UBG}gqa-<M`+7dDo}?2a ziYl1Dix4M<3+N^&<Qh~6Lca!JAh>3Em|$Xg)-v?OHPGe62dsyQ?>DTw+l`CB9N1oH zbOC*aGWX=5-4|(xOGz)kdnuf~?aZ0$CyA|jlGvJ^RPbgL#?l|C5PTVONy&*eceI+; z-qs5jcBj|=X{~pzD?>>WZ+hj_%<Qb+W?|>r+p-BPU0X0oy5W8^o_{cygkTbgA<n78 qbh7gO1+VL?Sr~GXFJ|8%U+QlS<Njsia-u^3+^krHcps4S1pN(Vq{9jT literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_observatory_thumbnails.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_observatory_thumbnails.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef4eba2dba8aaee37e46294833cbfd31b0e16d86 GIT binary patch literal 16804 zcmd6OTWlOzdR|@nQeE9_HYtj_aWpN>=+ZM1rJ2#pYGuu=Zq#L#YHCH!XttttPqR;T zv&ru2)~TXIGR=j(+V$>EqGTMz>kAeE85;(&v7I0>0>gHIAP;`YOArKksE2(>{ICNA zfrI$LSok5||DWm$o1}JtBtR(jsZ;0t|GEC>zn#BsjEvYC{=DD))$$i5P5W>3(*4UI za}7WLuAyl{6M92)G*{cwg|V&cs>E;%t}z{xpRs1#&~&YtaFP*3x5jc(3}HJqKhsVI zPqQ)7%sSZ!cGMZ=x}1~a=a@6b&v9oQ&sgI?bHbTm*m&b$bJCgQe4=rvdDuD3`DEir z^Qd!_^H$?nbIO_Ge5&zE^SJXW=j}$mdBQo-Jn5WlzUI8fW$DK2%~Q@P&Sx5@n`fLe z&9lx~e%Bj?<{LaKHMcjNb5Z&E<}{aIa4vGmNaL;M+s@m_XPtM%sB=l=oOi{T^Pc+^ z_mUWQ-xUX5n8?2)CfxUW`GcxlO#aw(E{j9rus9-)ieq9*ydsW^S4Cc&5GQLH=d0p1 z@%nc)=ZZKbPUHDY;*2<p=T%V<Z{Yd9m=ov3`S0q^2jYR478j8Fn)rseDBeQuns{5h z1E}lbl6V)-8{$3j6+CZ>%i^ne-V#^DFX1^Ou8Q~Zye&QuU&Hf`xF)XSc~{&JH}SkD zZiyK@KNPpc9X!7-?uvVO&WeZPL-BR=bYIMh`zR^8bE3Fnd~V2FZt*#&Lg@2aVg3uE zucBj?Yqf$NW@_bC->;Xw(u#2Lp1URM)u8Ux?#MDde3WJ91LP|MCF8TLO1aTkpKq6? z?-pBipKwQt<zQ8o8}k*{a|tmM72Iz<trNglYteV*({j*~>!o(175D`+JbFWx>)u?y zrub~}RyiooyFqyPejS7JYV$$8x!PFuXVxliJE*t3aI)B%S$7v?xw3-#UO76k?w7rK z)%Amd5oRCM+is)ox%XRQwc&=gT=hy#&I2-AX?cOW7BtIVx#r6HU+bFo#gDK$U&JV( z^S6;X<(K>><~rT>Y8Y*5$*tFxf>L`eOt#BG;7Tt{Rnbn#uWz^v-YCnOOW+%cQ~tF7 zl+fbbMi}S1&_rQq2>g8fJU>h{e6NIACHYychK8($rq_InlD8>&2e9ohR%uBYn(n$= z!C3hZyg`fOcN0JV9Fl-Igx=96wQYS<4~%7VE7k$eID*rDM2m8<BignBYKRv%{>=8> zhFb~pZ{(}8)yzM08;#P6*Lvoas`ZBJ=bx=q^Y(J9?hRL!g7vnl5ArS4u2h5Ry2!sz zx#^*17`9Xw_Om5dx_PWzxw2GVY`7=`#wlT!J)xTL%1swVXXe^V>)7!&cBbii!A*?o zVXJ=M4P?FI-^S3+*pgNu9P>d?*uj#hOH2gB6<RcOYN!wojmByif3oVL*l77-4BNI8 z#%MyIkP)}n0Y(y<()ItDCa2Nt&%bx`%Hxkfum0omQdvwdmY<cq^~cw}GRQ`h-+AnM zPyNTOw(I#7q%9il<JtP+W4|7_=i4Am3<<am48#{J7wVuj>6IH7+7V4ggy>%&q8vOK z!P07T(JR**{&agioT|A&X<(Ef*2cPD_jz|{!~FyjO^?NGU0y`){~l@l)Bj&dqxk3s zQ%6Jr@)V{mPa`SB<r&JKrKCW~8<f0>q+m!|EqR_2+F+GjKrTEqw8q}EMPA-_Q8~E0 zZ{fYSye3{~>G|Z{MkdfY+H;(_^-O^Chn(?9^Kv>kFG;6O<C~gie4=$v<hJgA5X5m( z^+~{f2hWaCr88+1H;!Qdc_QJwXyJr;tsw8N)&1Z~{*+%xNE!xjb$^Osf&u(6)#rsK zPdK!?vk6Cb(9ZB8ObjgopZ*Wfm7hbR>6UKj89kxfMn=!X<$EaWtwj<qJudVBFM@av zug7C!)7Ufvec9MDJ9-eKm4OChZpMV!0Yuf9)HdT>AMeDsb$P85-!wZ$$Lz#J?8oM2 zqLWaZ>eUMZasdaa+LBF@NdASJ*Y98GPU?bV_fO8o#a{q?N?bT4N?qLPrFRRayo7;E z+Ve2iS`FH(L7$^w)oH^01!tN9Cl9228x@5lFScXPeYEi4qlMC~dk_1~$*%yyNjBG+ zs6xB$aod>8@E&Ao5Bk;jf#**k!STkbPZ$}bG1D*%-7@7Bl;5rp8PXpue;Pj~#|31t z1!hE&u^<uz0T#Fu!@@!wbj%<jOo0uV)I?k)UeKcJ@~%h<Yb)8&xAj9>P4`H_Oub-r z65C)GH_rZomF;mnp7s}c3}qv;*jnVx@k^(~hV|CPD;Md1!E|Czn{LywmRpM@;@6J# z4EPZD?uK>#JPVljf3BY^#2gDuv_!nyG24qiL@B8t&Pa>(fpVh+sp}UkUKE){pZ%>0 zljTL9xxQ869VnH;n5b6*#TVjg=i;o8$oGNjSo62OUV3nS;ja8DwKT*n;=)~At(8&Z zPa>hcv9K=&&W54KkkV6LM@@xUGcvR>r0G}i^FKpEQo3W39>2EHF>Yz!l0@f1Kca0W z1EYiGpCArm1?F;WD~_{};4LGmZfvH4#8wigC$(+pT3{`wIu<Zeow$g-i2cL-rXASJ z>8*^211oVvt79v5t&{o~eCQE4(Kob*+9%qR9Obd4$)Y@f5lN!64HlftX7n%}$g+op zlaRg}tmI6Sk|PfSurMM?KMHNXTy;y$6^P!@gox{}x;h}qMypnXhQ`YgCR)76PNrI~ ztxCv#j}$2zhndP7^+m^$l?P>6ZbBzoZR5DRg>;x`OSf8I3ln9(4f!4>A%M|<AKLv> z8pg_Nt}k!Um=dZ!)R#j28MHI-QAJxOu!c7?y|`L$2&Ij-f$fhY(ZJ+vFuaU0NyiTV z<U^EJh|SR-ZKs7FZ>L0Nt)WgDHu6(2yd*YG-!eKD*xAKs3u8f|lYFkz_Icw2WtJ*i zI~`!tneC;B5MIR5R&LYo*tEG-lQ!?k$B(opcC>9qv7qyO3s#tNz15}*jopPh*$(4% z-z$4VTOluFoIH&}+8L{mmPgA;x)n4ZU*4nY4=MRNC9{+e|50nI*P(p+b>UcyN!x8y zz2U{osl{Xv-sx|n0iOs()5moi3~byutjllWy~np`O?zVWze1r~doKX*65vIV!U|=z zW^|0_F|5d8hz4z0XMP2u4j@#vX=SD!X=@jOmt;H(7+A|47%6bLL5w0W-Uf!fPfrun z(^iaHM=x>i<=2374mjyuz3hZeF!UcsJ!D?mLvlwCKLgG*dKlT&!z7QV3(Y-zu0NRs z{3XC=_vu4nS%ZB5Yc}d-be~?j@ZDZIk07X*Q(N}7wi#Qy8l)jXa)i5;+19YmM60hq zHaE@9IM|rBJOWlkR6O>=?C%l!{WlTqju)L*MPz7}YLTT`q7z)Avrb~SMnt1&fAuwa z2oHG}$pYDIb+6J`6>h0fUUVD2b98qz-4-M<=iAQl-4Okbf~s?5cRja&sy!NKRN>d1 zgS*kFct4cZ-Y8T&wyPzmst(2;+I*1eo^aO+Sw6bXVLDd4NUoHwh!hl9#F8}7FjuX^ zJOGm}c`aT~=fn^~;5OT^mKvq1bYT>EmGyAEhxDu-EHT<Z85-)YH8-V<Ec94Xc4Pf% zJ%E+MbuC$ktbl4ZRBMsq2KXR6ND9tw=0hAIOgt?&R$br8l2KLip&c<>E+j)!)XD>F z=@WvE6Fc(dBjn}BlnhDfLy8yeTHGH1)+b)5>3Qh08RICYd1m)VIqm1O2IaGWq0|OO zPM0old+dwEz)to>Ol3dzrPzcX9mhWFBBm1O!w7lZV_iF;nH4?x5J#67B$Tw5Fi0Ff zVMpvvF{5t-j~HZ{@dkTQEHy4NLm2-O7&I5fij?nQkQJ-Zbs3VHOP75qb~M<_PWHuf z8DL+E5$*0{C;Q?)2G|#~AkuJpE4CB9+sj_;YfOyqVqaihn@MJ036bd}$wSEOtIGzv z>}#UvoB(;k0vTdnq_>uWR;lflSN33F&eSm0AOiC%=apfQKC{B<iW>c!uYngbk8lnT z!!z>&=<VHA+!V2#1H(vExNC6zp8cwGXc&e2LB+1Npub1M)UHLGO#U65l8A+cW6Uac z%$#_a{1zp@jKn!Q#Ipw2ihN8^aFuILeh7+G{Q4kclb;eS>FKO-$VI|}!2sq`g~OB3 zp*xxWF5V&q;e3OVec8)F#a@P1<&S{VV=kmWb{WcEjAl>fvV;~Y<bR~U9n9q}3P7AN z99RlphM5rSnB+hp9Vn8*c}U?d8OJ)%IEC@T01?Nx6dTA#64)&E=o6I0+mqaLy+(Px zU<p)UePP8|&hReK+Ih_Zz8uELg8MRycR($kr~Jimguy@jpD{h3CJf~pd^W4g73BBk zvp+!%^QQl&d=`t%%LbL_GL-X}QZBck9PP2#P<OD{7B99ziV~F4??j88DmwY@Tzz(q zD_v*s4D`06ukSd=hL8r~6}QOlgy?Q%nw14v#WJb=>Yc4U_c+IU4Bv9gE2~YWQ^x!2 z5A3fbx%*|dcVg%Eswsy+j(iz?`I=#wioI^4wnz3Uyd?2sR|cJ05V<L#sKXgy9)b$m zI|lK!8#o4W@)SWD#@WA3@_@_*Qc6$aIDn^bTEH-2MJGF!NHSN4Rn2>JIoczu=p1C1 zLSr3v5nXFQg~Gi?2~J}#G+Whb?I-{9Kiyx<{cWU?l6DCPa&B0eQHLopw9w83uW=jd z>#Dy*`q9u~N`)~v{|8swLkG$#`x5Nvs9N&9X7Dq#<J(9yJ%{B!ODYW6ti7W})+{YK zFZa)2fzk3V!-ctQkRtQKfJF;;9W9~IRxCLkVDSVyFUWxqB$i2NS|TRmHS!k0le8I! zl9Gy)l#~+Cu(Z-_)gEOV!N#W9BEts;&I;a)UuNZ|i#M__o<4;4BeqYptr2j><l5~Z zi=&ujMQ5<@1PJ0R2*TP-!LHVpM}<vJ6L3)*BN=^>0H5rRB*aMW4zx2k7Ha2>ecI7? zwgYA5WUr;%o+H}XlD^-F&{AWlrI(MX-_q_ebrqSh;_ZU&j5f>uN(mHR@+;DHy^ROB zMxlGQr!Jh(ZbRg|Zc_F{<3ffUu&y|l_gg5*4?`1W<Jzd+Xyg~&e6uXv9&=NffA`5X zm~!yg)M3E2TkX|`G8uXe!Apm3cOE#>c*wnjGZ&))hn5cqpu1R>iWQCzVdFjxw*lnR zf#;%8Z^{5!KAdtDIp@GG_-eI~<74Z*K~~CMX9-q`x``~29fe`TVc9Km&i2i<(s1M5 z6)ce@Bxh(;$!BHhk!x&$hBE?>4OSM?A%MTi869dsS%0t6(w6pLvA%Hbt3A#UM&hvz zHCjl^C$uO%hmVt@3rH5nj>TClw0uf1UzYbrdeKl%e}yLew~>%=C#G-1X*y{fhnUYq zsjZ*ZC-FvUb|95&!0PcT5(_=i@IUZ^bF4HX6AA(It3A!43F2SMS47;4xy@;ur*l0V z2#=l_u@hQpP78p(1~tGGaK-NGgM<y~Ua`mnVu7zDAZkeW>h|{;TDUUMLbu14<ED75 zf6*6HBe*Xlx*_+SD|$z(uQ#akkm2f5uu8C9#lRjAOXSgXl-<6g#nKXPnp*J6G>3Hu zveF%;z7IC8w85lfb&0%BP)b{1+Syl=9*;C>noTs^2?!zoD0(AD?4Y)AmI>x0X@~2m z?P(0;k|q&n;^+SiX$@KeesT7*Yg@)P-G(PnlElx#FBOnRkXT8`pV9{5CW>6MHk`D! z(4QOfr=27&L2UM%<2nS;aORR1o%1Qq8|0I(!A)6(z9Gmqh7M9SYQ|=I?Qtg!l30M~ z%xsRVeHhpvn`9@`G1)13c{3ZNmopt3t}=T$i{GfQg!VmZ&mh|!sU^}#GhzhV%!tU6 zczW_r-~fgb5~In{*gx0h9|U8)(T`&EqcnOd=kbpYjDLJ!{0DyF_?LP7i_!Q$#`s4E z#(ygs|0u>kit&#wPjttR{K1+D_aH26JTVJ#0MCq=z)Z~UOd!r6?2+E)*-Y|m3^^Md z>dhvH+2nXODCgPa24-`3U^Yj7;cTw*Y%WE!Ig8mG9GJ~yG@Be|Ga@GG(0*<_IfwBX zPbM(FqvW{%+?0R0cB_-bu3p_7>%>4EW6Q^==U_@40L<9(E6c~9WA!)3J8`akW%<=0 z-x<e!=b;yT2ZQz=GaIoHWt0TX&^4SPj?k`0lyQ>Baso<89FG4KMIyb3vtn|R7y(-N z6J{gb7MSYx!JX>iz82yBH58?!NFULbU*9?fW$D1$<KT4X03w~D(SQY-tU2ERGs|vH z{4j#wI@6i>0q&lDs6$0M`+e>EdexxlsP9@GxaFVgG}dkMmZZ1TIL#;5FwVi&yCWrb z_hnko@7cPViAg7cZ?8@i!(-BgGs5qB9^nG;>&-esZQz(>uDHM)@wRh*mopG@dSBEY zXZ-@)NP`cO?mU93iaF6`s4o`c4(<_~K0@m1&90X;MfsK#uB3~oMoUt7k8)POIpi&P zS?`VsuZLs!hy`jdePPfD^qTX=PJ8cV4S?nUDzNbI@o>@<I^-%vi@oX5^e#dbbK<N@ zMJ2gw;kaL~!H--Tz^Tw8&>szj9G-M%=uaW3K?Z+og0A~<rK$e_SC~X7zivE<%`2xY zoIs@Fgb9H_Bi!g2p)q|C>RY|W9iW>0w}`!IJyT9xiplu7eYF8ORB1KaA2diDsD3xz zRMKK#WNb<K(^pwv^FKhQi}!y%X8CIv3I_OnJme2lo}JA<qyqLh(_rOil=MegC?H&` zj%8$Ru}=4#zKcjUSduwXEu$9>igLzoJ-l~&;a>4h>CVIJ^qiL@#^8cSI94x0L4^(^ zm&!h3r$AceHvCw^IkXG8G=F#Q;lf@OH|J*O9xBfOIou)#+DlG=+#s+d2oaun-$?{j zevZyBV4OGm!zFi>b8x6M8pp0;9)*+eRa>bxX5@0S+2Zwuj~-s1EzRGYDbCDGA~I)U zXJORna4EMLnuxTL-vd?{$HjHcb;gthKR_!8#9J!2T_@Ib%U&1{R@>0Ej}Iu+1F*1$ zIKZ#(m>f`^SQW~FVsVdxT~eCAa1Qo$?SYmG2NfoTmh^QaC)GUxzLV~c)DP3;rwIOH zQ^QA`rswlPmcK&SN04CgT#VdzVwGwQxc(A`p;(Mk(@ArZ#|Y9Wdyb6|M_I;AQPWrI z7;9ogyV1#$Ow1|}YM;|}hG?7UAHfdL+_RM8UssohcT=B&QZ|8Wl5q}zNWj-Xr5S=5 zsGS4^{X;0ruG%TK3o>ZoIF!B#zILHBtDl6=f-tj2Hz$9Du~djB&>zLV(2qSBTgdEC z`wXS|b8rPb7_bCPVXPSPL#R=)jsX?$GUYa7PjHLB9On|wZN|KlC`oY1W6Gf<Hw*(m z26;uk8&F6FtD4V^@917Ou(ncgOCgMj1*5%{CMA>JIGiaQham`N0Hqf}M5`5q&VnvK zzBk|Ac<*Lw6;?Neec@^j=6Aa-TWwi~xtX7xFXp=zXC8KVKH?>a4BI$|7|mW=C^(m2 zrRZ7YcA~I>UdYJ5hn13lpOP0y5DN^})O3R~*{IHu*}0q7XJ@}zntyQp;rvXgICl@} zrCT$1oQb`v_CdG|1WBqn8@(I`B5AASKR^Nl{Zl-`6yFb0poaVns{2hOPK>5Ge5*G~ zPO?&E$%Q+5>1o-2Mud41;2K*7h{OTG@ejmA&jd<hFe|gB{2f5;FeJ&_%p?PaPh0;f zHc#8uB4-yurVzjp+t%UqA}1I{=EM-a7K1itf_M<Sx0Mj6r`SF?!BkCrMUxINlj<Ed zM;rtL9ceiQ9f?!8#;!!xfG!ZI08^5jRNVlFsm%mi2GIZ5VWxB{IJThuL-WUFKb&UJ z)^riMf7qTF#LB|Wrm(V%_2-We_2V6nX~F1<E&o<WOVHD3^lTlds6^JKaz*)fu_Teo zz>3bsWrSJh+5JzHgg{vG_<$-A<eH~lgA-_psdcFgchMr;NBJtamn*&?A?8dXR=Lzg zFV)JpnWk%{o^I8*S{I-f=oNLTHMR>&X>c0|`_7}TKcH%B)f3Z&oHI_u+g@#hagriH zSI|o9u<E`VZU|PoE`J@P>XV`qYavu!5+4cmg#p=kKzUkrw#Qy{zJMZ^DMJ1}rN;W+ zleFre-1Lx^YwIO=zT}SyhAm)L7kWBFcv$h;9aH6#`HzUE&jL+D99f2(BCvu%!(gd7 zP;(YkodZSZ_?aVHcnh!<I#u*X;Wl*On6l4dYEcki{BwQ%Ux8Wapx%p2-Ep>g69MdC z3Osras`*^^J_8J~#|7BM<Xb1ZI2pv@JMY6(0Yj(YR}hKDFhLUbF<h$w#i9X@-k-;~ zy(@r?0rn3DVC^ATJA%yuHV)YTG60(%f=v^w_m_Z70P=5wOmCE_U<B^dXq4W+2SgIz zKj<<)(3%=$R*jNo?EMblEQY%kjM98z!P!9$fmdirq`0@IfUy~7X%84RqKAOVFwAEI zFk`A6?&%^RMi}Dv0@#Qu+>6_vL`{}!{xmp%nrIF<x63%U6Du}m@!xfAGp%bIx!~Z| zq!<Nn0^1@h2qG>0?er%aPV!Yi9|E)?Pe;&G!QrhV#0P+NROA#^C;c6L2osUX%mc=X ztYb*lAzlR;$vh<|C?S<X60?=0_b<p-klvQZso*tAUPrPqRp|+@MhonsC#=pQc6s9% z!d4)(B8St?%EB>8*AT4zvUuP~3rX6gT%sgN2?;G{tg9B@pZoaUOlht-!?%UQ<qMDI zoC7;S7w$fsnPJ_M@0{3;#FByUMA+HLx&@!90m1c*`hEvVm?CxtzjI|JOhG8)(+_v8 z5?U3Qn{{}kAy+RE>~B-j;|;*V#}XWdsJKRjs)-HCIwcKCo*)TzcUb1xicwGle@Lu> zj42JmEruVMLNCp+{?$##xm+;|N{MOoQ&o;KV;q{Bf|b9Ib}Q(C|7h9i$86-ckRkC1 zQAh!(u=7~wnF=5pDR_M#sQnVk5a=BRwG$5XBjAvWjP#@jsE-fe;A1v_31whG12{>> z!IfR4TR~JZ4#buUn^lLWO1f04$SY3j58|rxAI{Ge^G)^P5bh?Ptm3N>5nW`Q>BhpJ z*_hfV#@?ssSB?VTc<W0v*!6j`eRgK!ME4yX?h4;mO@9SzxpC=BG~JJGRbRE7p-3o* zxiEQeZibH0K!hjx);S_q(tZ_U2ymv02Bt(dJE+%T!b+=qP991~lto8bgJ>ZQ9r`)K z&7+*jIm0&OPXN&qHFR9*P%@4DM`WV?$^;sP{BIfbArc2EQyyOPULLXLy?hJ;$b7Eq z$Q8?<H^TXcG8P66_{^auL5(7YjO*R!aEN)If@PAZ_{VD>cTBjHCgAMt!^H{a$p#qc z<p6Puq{xwCwUz0^Y{wDolh_)8U^79V7V@kx;W<hSli6XixRL1+3K7P}*p3b6q6xK8 zc@-Il&yTp254_rOQmR;+D&#`@!R*{ZY2lj>VByZ7JdE-843`OnBscG$(o*O+h8c#x zIaj=W@6LQUiqGJJI;?>Txf8sa6MN8VH4x*x>fytuR>P;S(j<k!gl4mhNZ?ANg-@8? zL`#L#5H-O3rSG@GWUwUNGD7KokNVT`l^L}bCgD;;XZ|qJ9E;SJ{&!RTuP*)<5fN+S zq;*Fo9@q|YWWL$@BuHo+q-E*yPtY4NLH;9KpMFe8R6_<F{F8LO10oVeVA7`wFCh83 zBp$?;>5~OWKz^rB77{^n8*D_Cf!vgj9tN3EUVM!rH;8pnAgh2kzoVB@&~eh++Exao zBc#g**{xCJ;c4D9f-yu9=<tK`wGJdUOgWO;h_~054-kO?dII@_btZBqm~?T&IFE37 ze7q1X>lmg(mzK2JVN$r&GM05Cef~T`<IgwTr)~oZ_n!i2BN=`1Ag|)B`<ckH53f-= z;sx|lm<%mgj(m2*>~&c~=(iU<ppXR_X39d)rx08wZ=oGUW${}xH$J+<gdqPpx311U zKz;eIsUYsR8}%Sefx*loW*==?a5K!(_`(#1TH>LG#`0<yBYKg4MvW6Y;H{K@%#A#Q z6m;dEBVR}$a9<57#=U%%Kwr*~aIstWMxe5?W07RsIHcAD%Pq^uLj8py2hz$I@;^{_ z_@09>N+o<Wb$j3^dCeclI{<RbRV++_z!Uz`DsESusqQB#({R$b)3m51s(=8;d7zIh zT_?M<RQ?4u6-StTd!6kH`ERMf_AB-F`ZT0Xg`B9!!yUs#<my$1h5REx%6~!0HYIfG zopZe*EYjz%gWvy6@A6W!M&!Kl5|kmwGV4svg_j`gb-B%Uxl?!v)=uxU^3a|A67YPZ z%<7wSbboM3_Bh`;4lEDv(5^KqksN2I0cccdjqGDc)7l>Hb)h~4nZ^gc{6#P`Sm(`N zb@!7@MFxlwK=}F2k2B>64Jk{lo_ZNtk9r)d+o+S}275L9VWRW0)#_@>a2How&e*O= zJ0m+FSQAE!xcZ10AJ5298fRwq`olXjrMolt?%Z8)GV}N0#Oc1->h1Pialx?_9OdOT zn&lr-LcBqJTKE>_-lOCSCD$pTD`OQ)=~9lB@)gQa_||{|y-u&>p;Mam7Uf8q4X}&u z`K6G-QfWZQ^bKU|s`^y>14tFk50F5F!0aV$RsB=?3G$JsQ9i{9leFT)fXl#aR{yAm t@JMI23@e3yqt=8yYG-ZRI*oq`D{EQS>(&A5fprZ3&Ra+ABi5v?{cq#YEf@d* literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_ophys_eye_calibration.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_ophys_eye_calibration.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a98c1fdf183ef9b77641f4798f66c6519f7b565 GIT binary patch literal 5098 zcmbVQO>E=F6(%WCqNpFsw(R{)R!MfVRnyq{={7){KgagAMs{u2>%}I73xd|rHf@Pi zhV**vP(X`K(My8{Xn|Y`#6~a8J?OcY-r8GF0~9FGQ|?6%IrV!(N-N2WqOAx%&U|m? z&C{Ei_ukBVm5Qa{7yRyL?l)Hz<sVe(|8gk2i#PfW2veBaR&4reZMCD>S|?}cRI2CN zddIMhPTtPTy4o&uOifXhPEk_JE@gPxu1GmmyUKKXf*E#=<yqkq#hzqStjMfSRC|h* zSQ*GPtFS7*bvD6j_|AB<Z1O<kpLsKnA)Bf9l;-r;&`eovYNERCcfGbBcy~i~*!G0Q z4+Ezo%ivCU$DY%2+x|9pV?PW;)sMN`I`Fu282jyL_oaV*{<mNM;!p4Fe(}c4m#_R` z{hgLZlJO%W<nb=zjh+RGl~a|er&^*U>X~+?GVKyfa7pQDi3XMQ)sw$kk=OQGabt09 zb#Y<yTSo^wb5R^}ch_^6&%p`#@pl>o@Az#ma64YJ;YN+F8}C^=JnS@%yms3;2*RVl zp%xLfwe~|l80R?gaW`ehjS$>}op{b?jkl!mF)6aG<1_1M&*NU&md0+}S$TiCar5Ke z&4wE=+0%_<x3%YPw>`9nw2ylhSMlG4PC7PoLTeui<D)~5AB+4>$UAP_%-JS}mxG9k z_o(Y}zvBfl1lTz+zEpS#62AFl@%vl%BacU0?w-r$w%sE)INn+a+*TMc_w_9=co=Pk zT`!1Qpka6KING}7Z*N6@?7iH@oWY9d+lJjDb};V;vBv|qJ>SjdKb!Puo)&=Y?u<?T zT=!TMcD>kvRu!66nqEcKjaijb{q|t)tEgSXE9c(AiePF_V_GlAay^~tJ%bs&e5|m1 zqCD1m1(XW1WX4z@%skB{%9)B4QpD;g#`?Z-noqQt+F<4MtVb`#W>P#Yo}s>^{A6}Z z>y>)tq|B59lW!%(r1X~Z(bfYcDI{iMB>7B&#jG<8{VZ0BOZ#P#&dPNq!zvQ1j$jiK ztBqijteEw{#>-06gHjzmDr1soBsMB}R$`-)F955`z8C9CJh5N9(%0>h<dB4M&Sl9V zIpdrw;6T?A-LFb)RFh{UHqeAU``dc2l2q6=^lThxpQ-$xXo3HlN+QmiibOIwK%UEx zObU?aflMcQQc0{Nm#FN8PYrTq*yq<*Pj1XJH+HcE(;eWqqWQ&zyYpkq?PTu1YBt|r z(kH?H)_&0O|J)1yPqDE5zhir!JiC1CZIWN~gWbkr$OF%9H#WQ-a%S+FCzHec^~0{; zK6$P0>%N_Ou5`ymUKF82)Ci-@+k{c-m-?RM<T)~vbix?Si9;u9anFO#cDr35b9=Y! zsSIktjlfesayp%_DO!y)j)_6;X`FFF407c5OeTtlu?zqZ#=PD0@bS~(6A4eX;4Qi9 z4C!N!VWi49Mp}rOtna7-Uw;MV&hw-e=iyX~iMGc^R2T;2_`?7V-mHsii#uJHyPZe| z6fxPQ*&BgMJ79axk<a2iQBEs+p1->ni&A(PcMs#V>r5vMd_*v(8^R}JmgU5V^Dyc1 z6j+*Lwl8GV9^yQn+TuJejUnopSx0p_he}n>p`;0)#0>ChB6XUJNwV&!v{6Wk8ik~s z%jmuPmp|k8%lm)iS4bf8DW$2|CgKz<4XYaM5J^b0F2f8jP#cp-5kzQV#3>R9odUhc zMKKq8+mB*lAoO)2kweVlI$GHEyKAc}n`;}+`r5sf&6TxPXYJ0CJq_oxys<C})-!Np zZF7NI-lL{M3%Ww<`u5D7<)xwa8!JCtSzWmE6#1*m4>)B)%_^rI$X_HiYHRm5*Y9sS zODh}8i%{o7+q}2*zO%lt`6D}jZ*gN~eUo3H))YhS0+t{pGq#nkJy|x9C^+Om?E;mM z9f{n5cPxyDZu<~foFCA-BR4Cvhm@2dP8iJFKHQx}F^WMDzv;>0)hyN0biJlcX|t-S zS~*QkA5*refu=9o;px}Xucp?44AXx5S)&Sx^bnsO{u;(@k>jBsr4BTaGFkWvC?$#s zQie-N0(xpzL$Zh(l1G^`B0*p}k^>!I178EJw3yKRB_su`a7B?dbEJk4mhyIUkc9*! z>thifEBks~VWq5R`6*as6q8brykt@k4u?jb7^xvJ4vlOM`b>^WlsZp61)Cnl<jBQ= zlzLyf>_0P7o9)+RA1gNY^GP0wk%iQ#7#CubUHG)nE5%5Qkd~`RrPN*-wNio<y{Dm6 zPE>?&{Va#MpqiG|w4?-%mKZxa!urKkK7&c*w6LBmUVe$Ha*LyY-}QH&Y;pb!06s;8 z&IkM&kp_|Hh&)eZ)XVS}2)j<?21v6YYJGp$cRgaVkMuocB+A3SNlc8nK2aMBF_CRi zjO8x#4<ozW>Nv>Bov#1LYd0(WWeg1e61q$nF6S=x+zx6npCh%To2eq)FAg1=tmO}v zosEU1mHYQZdGW5Zz6=kv^1<>QZlI4n0o`M#%fl9;ztiIO)CeGVy*-I-Pr-cKg`1TD zsaX*^ZE#T>#3)f74o~CL@H#2@T_WEj@&=JxAj0aO@Io$BXWU`bFkFQ5%)q1Upii_8 zqNr6orhIf+u49ka@m$82cu%YMy$XFztqM<Ks(JbH_aL)HCZr$PX5bfYqk{D={lb~{ zt5>k|^?e*E5{>0P)l@~+bR?QjYDR+N2Js#s@%*u}p?r`gp!rpy9zDr;!jLmRaAPlO zs{AbsV_)s3Pfu7*)WzA)hn++zHL=S*H^PBV-@Aolk$#&TG?E1mf~4Dxytruylbki3 z742Gofl@|<ge|g51Ekflv6LWBs5|4<FCTG4F(*wVK8Jddymye+C9CljU@g4zM?A8d z^rgQ?AyytMJtcwV&J^rlEm0q<TY3*iu^x_LiH4(=PQDN&STxDucvV2z$jWA%KP@Er zGgW>I`)2Bu-=kw$e!mD$QbeLpr9x7~4TbV^ZAZ%x_?IEX!a<CVWBJEAW=lCOVeSkc z9w$2%<W}WD*`6LvXJzDTmN_M({8b{fMzATv4g#F#klF0(*{bj7RY<M+PQVWa_P+KX zTeUjr&Nloga08)kiX6Vuy7uJo9LU*iS|W!_61iUZyQJ3JMBV`r1<VyqJ6}T0uBW38 zsYLnn^f?r3pwjV?{UfRO1Li#%UkG}~^@A@UQeLJga?8{ZvUMy1dM{%mP2s_2()b!F zVmde!zyMBDz1_UPZ<0DM^-oK4{R@D(R>-}%wvP;V>?$BNdXBoiaK0OEgdjWI#+AfF zmo8?c?@K+}jq}Z)j6xSj$bYc|%)SmnC$?RcS`7Fy(X)-<u+u%3lf##x3;zL;H;GW@ zAae=1DCArX{yA+rXV{m~B?^}rkojhMzx6g{AQ2^-rdrc#+C|vTgyYgRvuLfGubQSg HZ7Tl;=DwAf literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_ophys_session_decomposition.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_ophys_session_decomposition.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3f53a68c699a7fad93da44c2616492c12433f32 GIT binary patch literal 3577 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_ophys_time_sync.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_ophys_time_sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..370a96b0ba3037d2bdb4c07d3d732df1e73ed93d GIT binary patch literal 7315 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 WUac8(7wXRZqLKOc`Ze=8Q~3|-%j$#x literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_roi_filter.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_roi_filter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3ef196e23d344af9a84aed9fca6627034b6688c GIT binary patch literal 8723 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 ITqvsl3FC-H!T<mO literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_projection_thumbnail_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_projection_thumbnail_from_json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a10bb33f4c8c50f6a883c28b85224a25b0dad90 GIT binary patch literal 3328 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_stitching_classic.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_stitching_classic.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88d4f34fc03e391260fb9f826083dd8d77ce94fd GIT binary patch literal 3844 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 P?JQInaiW;Qt}6R4Xj0}t literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_cav_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_cav_from_json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee064bbad40afe977bbb3633810dd3e89342c34c GIT binary patch literal 674 zcmaJ<&2H2%5VoCcHZ3g@@4zLhnmr(Ks1O2rg$jYVM3F2vF<Z0FII^9sf_4vR`v5!w z6(?RPS5CY_PaS8wRRt0wd44@J-;Dj{@Nl0X!Ow5viW2fW7&~I9yu#y7kkzE7niN4Y zO&eA)8uUm<O<csN$Mxij6cd@$$%5JEa<U=lr5{N){e$`BEThBY_o|gzfqZA`PD}Je zwu35!14Vb|6s3EL%##gSlNI?vugRKvwxS!lW@tw%c1;5SEKkp}*aob_zJj*%ycS;A zP^)-yX_c4Ubbja0q9JL<<~9yD9zBTtA~r$a&G*xj@{^O+mEuCw`MJ0h(3h`4R0eAC ztdy{HrD-L&3b|=7dRM+x=cU75$E~OqVlFXPYrIh}W(vHtAoQ%g8=h|gxEapQy>hOT zRgW+`PzKaj$t$tspRH;57iS=E`yp<Gf<46MQe=cBETt*6!5C7`LzMGuI!v{h&lSvz zqh0rW*FCR{mAO`p<A328cUOG)H={9~LofzFR$eWY@3+;KLf>P}|1-n*2KOLAG?Mdi c!w=YW9O1=wBQNm>5*I#X$`0tkB;8BtEkg0a=Kufz literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_counts_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_counts_from_json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e456d4b2d6b1e6ddcb8f9c9e9965e4d3e6fd1fe7 GIT binary patch literal 696 zcma)4&2H2%5VoCcHk1~Lci<8svIis%6+%F-P$3~MQIO?2W^2|NN4B$7s@(%xj=TXE zDo(souAF!UPK<ZERRtGD^5^;SjK3NC<<ZdrL4og|#1~4)&uHw0q4FG;KSpRsLk+3o z&J1l?#c0$MleB4-qMkOB&!n2DtjQM4JyDYlK`(tvis>)RC#MA+@4eBTG8)ut+w?}E zCviQ<7><%$uM^z;1B5^}WKCA&8@(cH8rX_%=$fIOtk@Ne1h70kEm9Y`jt3gLKJZ2a z;bN`o{)N*)aodNzzevWc-Cpj}c;fD@*bm||^!@&Na$LXj%K2KHi>5pi7XpU*1qf-O z5szyHOJCbgftQH3J0E=gN}tsp?|Re;xe#-OxyIm$W--$clmlUA-F5SPN5IdpcOJC& zy^;gc>_J=5mx@axyw{RT+e7gDgR?FF=q;4pFs7~0Fh!a^M<6U?InAky#+Y*+qnsDh zacb;*u3=t1+!HDHL`rF$DvfSE|BKRgjMe*pGg{kw<YfVr40@@<u&cHd=7x6pf9-5v k=7ukbR&l<a`z?t5jrr5voSxyoBtCxAoE_4`B)^l>Kd=7GM*si- literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_from_json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e17940141bccd07ae6de044185e5348ce0ff432 GIT binary patch literal 682 zcmah{&2H2%5VoCcHZ3g@@4zKOWDiIjDujSup+Z9KA&O+ViP@TU#*yu86|{Rm%Yg^r z0jPTFE9J_GSK!1r+pQ`%Fp@vdk7xYN*l!LG_X!GIe-Ym(AwPq$6NbtwT<!>=CN<Th z2s_iXVFjZ>k95?;MT~k}Prj03B9l5<F#B9iHUz!&1IebpFrS=cba?n)wNfjP?@Zlk ziJr)IP=#=i=yo0B?j9p}vLS1-B0uOASyRtebVJt+?P$fWXdr;)=}8vbz;)PH&~~2J z!V4Q}6^|~h@{*g*@BCRbB+Yoajl+ot_hL81Cg}V9{rIRnb<(<0T!=b97ncJ1@->Lc zKrNn?5|*wstprygn)af1<y&=LI=t&?E2@Q<OU%_8Pt=Q<0xvBHJ!@~9=UW19hP`vI zoa<!OBh3z!0rgq(N(<*y#Xnlp@K4S_-u6S>2nBn{&!q^2B`l>WwZRxt&O?;*Y&uM} zna>r>izhn<`Hn$e87p(G8pr?QGS06!`!}O8okKzfKvrHYmG8IJmO|h0&HvNK_!f6W hK{S%{anko-I=1m*JDHdG6Nw8SGi3+#V3O{o^ba)<#zO!A literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/calculate_features.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/calculate_features.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46d749b33c9cb7640a01143754eebc2d72fb9423 GIT binary patch literal 2579 zcma);PjeeJ6u`CXU3=r$&cD{JOG{0m(DYB7w$KC9VfcTdoeoT=pb4XqSF*k7u68S} zlQ`oXARM{z1(M;!C*Zs6l~cb0C!Vyn62o)`+bg}F^rZLnq_^_t&1N0JNBsU1{j-VC zUmE703J9OVqXtkg#GDx6vUU;|yG|)r63;~rN_^~_7B{XYHCzL^!n|J)4)_xDU%Il- zYsU!JdHrPh6yXLBc;nc?P2d)9o;slKe1|rxufZ02y6F_HXHmxENbn~q8^=6!bO(Hv z;i<y&1w86k7oo}3DU9u)BL`|1Y8UDX)Rh-Vv>ouxK{;aHG1&MS{eXn~J({#~=fs^l zr_PbLpye-UJsP4T|KLVmVbx>jOY~#=s5<peys67-(`p-akoNo4?h7>aPW-8_X<@ct zVYX*^^`tiSrj=9os1~84U|QP^rU6@ej6hlfscxh?NXtfA2B~4B21rdKH9=}UUbM4v z-VV&X1do}egV<^ZP3vq8#=@+?>xS1YZy4UNe8KQV%WcDL%a;saw%jq?v3$kw70YiK zzH0fJ;kPYcH{7-Sj^P`Y-!=T6<(r1zxBP+OTb4Hs-?n_m@LkLI3~yQP8SYu$HoR^5 zzTx|p9~gcJT%Rtn524mO_mS?0^ZV#&5vcu;45FChW)@MBODfbLl?mREJf?ZH$B9Z4 zN*K@b(c$*(+ui4a_G8}7)9xS=tSkAeaipT01M--uZY1EBjq~oVO2uIZMtmh@DnXI5 zNDRAR5L9FSx&b+H8034B+}wV^4sTdZnq~1stI`3O08?|P3XdM70{dZ{j#&{fE|>(% zMXOI0jlstmuh1+C&o?w^923FET3a37vX($89P4F*u_Tq*D2>zMq&wg=A4{(Ak{BmM z<vdY%1;jp=Bpu8e+6g@%d>qCR<5Un9sho<C<2Bu$(R^f^3g1KzH`6^XwI?Mu@-zo0 z_tJQraC{}vvt(3qkrPJ8!%+^_B>0x%Yg7*$@;7v^&bwJe6Ar_Q+0-!?!+eC>^OY0r z0O><G!x5}*L!^wW#m2(lj~I-xzLsbLVbsqDqHMU-j|O8IYEK2BVi<E0rx00ueeTzr z6jpV3&vhzr)kb-teceQ706|C~KE@QjIG=v8Ina~lQKoR~Y%;^kVJhG(h1yZPF&}-t z@$xyNv!zI$q&dgkxw_FP=UCKen8nOvyMAWd#=BW=xEjj=g@dxH4@%idQpvc)4U=lK z{-QeK5u5_tnjf2zi@+Ywm9sMoM<%D6t-{Y_B=VvHS%w3has;Hp2e*d2s6u8zj^KvL zFjA&hu{N8J@B<T_RO0m~HW|L2<%0AfU2$C}ATjwT^}Qx*x(IZ!1jXiZQQ3`z)R!^# z5A=&f>MI*pgcP^}1`8*WEodn`?J#x|hCOZn4<s)^^WVRH@$t@c#iiPzBg(e=bf1dJ z&S!$cHZl5ehl@S6lfo)g2xXd$CTi!KsK2A%K=(2lzJxS^u`wKd#a{Lx7F-G%_p;gj zOcHZJt6s<<5%WpLRqrf{z4;4)lX;N0vPt13G!l9pY7YwJxK04yhEvsb)pc5><hqUr za(m8o7j!(QZof0ViU+N$|NmP7E3WK-<su+N`$EX(3hePj;fp%AVN1@|umu|~S3w!y z{coRL)l4|sbF(XQLyx;N58u{2d|P2E`Boeyiu@~(68_U5>zjc04<SXh3^J~pi@+RB zc|p(Y?WW@#ukGviFaZ&+iLzJky*U77aT%}(9+%U6qW?^(btnS2;jB9iKlnB%BkueI DE3)q_ literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/cortical_layers.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/cortical_layers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..936156dbc921a9bfc8ede44b531be51cfdaa2c11 GIT binary patch literal 8247 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 Nm9Ld#1{y=U^1seKoQVJc literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/surrogate_strategy.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/surrogate_strategy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa4972592d0e89f49ec475d1301729e0dd92f48b GIT binary patch literal 4410 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 F`5!$6GP3{x literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/upright_transform.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/upright_transform.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c7b1996e3cedf87ace09499611edc016303e450 GIT binary patch literal 7261 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 literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/cell_types/morphology/calculate_features.py b/internal/pipeline_modules/cell_types/morphology/calculate_features.py new file mode 100644 index 0000000000..87fa94e0e1 --- /dev/null +++ b/internal/pipeline_modules/cell_types/morphology/calculate_features.py @@ -0,0 +1,96 @@ +import sys + +import neuron_morphology.swc as swc +import neuron_morphology.features.feature_extractor as feature_extractor +from allensdk.internal.core.lims_pipeline_module import PipelineModule + + +######################################################################## + +def main(jin): + try: + swc_file = jin["swc_file"] + xform = jin["pia_transform"] + depth = jin["relative_soma_depth"] + except: + print("** Unable to find requisite fields in input json"); + raise + + + #################################################################### + # calculate features + + try: + nrn = swc.read_swc(swc_file) + except: + print("** Error reading swc file") + raise + + try: + aff = [] + for i in range(12): + aff.append(xform["tvr_%02d" % i]) + nrn.apply_affine(aff) + except: + print("** Error applying affine transform") + raise + + #try: + # # save a copy of affine-corrected file + # tmp_swc_file = swc_file[:-4] + "_pia.swc" + # nrn.write(tmp_swc_file) + #except: + # # treat this as a soft error and print a warning + # print("Note: unable to write copy of affine corrected pia file") + + try: + features = feature_extractor.MorphologyFeatures(nrn, depth) + data = {} + data["axon"] = features.axon + data["cloud"] = features.axon_cloud + data["dendrite"] = features.dendrite + data["basal_dendrite"] = features.basal_dendrite + data["apical_dendrite"] = features.apical_dendrite + data["all_neurites"] = features.all_neurites + except: + print("** Error calculating morphology features") + raise + + # make output of new module backwards compatible with previous module + md = {} + feat = {} + feat["number_of_stems"] = data["dendrite"]["num_stems"] + feat["max_euclidean_distance"] = data["dendrite"]["max_euclidean_distance"] + feat["max_path_distance"] = data["dendrite"]["max_path_distance"] + feat["overall_depth"] = data["dendrite"]["depth"] + feat["total_volume"] = data["dendrite"]["total_volume"] + feat["average_parent_daughter_ratio"] = data["dendrite"]["mean_parent_daughter_ratio"] + feat["average_diameter"] = data["dendrite"]["average_diameter"] + feat["total_length"] = data["dendrite"]["total_length"] + feat["nodes_over_branches"] = data["dendrite"]["neurites_over_branches"] + feat["overall_width"] = data["dendrite"]["width"] + feat["number_of_nodes"] = data["dendrite"]["num_nodes"] + feat["average_bifurcation_angle_local"] = data["dendrite"]["bifurcation_angle_local"] + feat["number_of_bifurcations"] = data["dendrite"]["num_bifurcations"] + feat["average_fragmentation"] = data["dendrite"]["mean_fragmentation"] + feat["number_of_tips"] = data["dendrite"]["num_tips"] + feat["average_contraction"] = data["dendrite"]["contraction"] + feat["average_bifuraction_angle_remote"] = data["dendrite"]["bifurcation_angle_remote"] + feat["number_of_branches"] = data["dendrite"]["num_branches"] + feat["total_surface"] = data["dendrite"]["total_surface"] + feat["max_branch_order"] = data["dendrite"]["max_branch_order"] + feat["soma_surface"] = data["dendrite"]["soma_surface"] + feat["overall_height"] = data["dendrite"]["height"] + + + md["features"] = feat + data["morphology_data"] = md + + return data + + +if __name__=='__main__': + module = PipelineModule() + jin = module.input_data() + jout = main(jin) + module.write_output_data(jout) diff --git a/internal/pipeline_modules/cell_types/morphology/cortical_layers.py b/internal/pipeline_modules/cell_types/morphology/cortical_layers.py new file mode 100644 index 0000000000..17299fa630 --- /dev/null +++ b/internal/pipeline_modules/cell_types/morphology/cortical_layers.py @@ -0,0 +1,425 @@ +#!/usr/bin/python +import json +import math +import cv2 +import numpy as np +import sys +import psycopg2 +import psycopg2.extras +import allensdk.core.json_utilities as json +from neuron_morphology import swc +from allensdk.internal.core.lims_pipeline_module import PipelineModule + +#from surrogate_strategy import prep_json + +# TODO update run_python.sh to include this path +twok_dir = "/shared/bioapps/itk/itk_shared/jp2/build" +print("WARNING: adding directory to PYTHONPATH") +print("=> %s" % twok_dir) +sys.path.append(twok_dir) +import jpeg_twok + +######################################################################## +# helper functions + +def calculate_centroid(x, y): + ''' Calculates the center of a polygon, using weighted averages + of vertex locations + ''' + assert len(x) == len(y), "Vertex arrays are of incorrect shape" + tot_len = 0.0 + tot_x = 0.0 + tot_y = 0.0 + for i in range(len(x)): + x0 = x[i-1] + y0 = y[i-1] + x1 = x[i] + y1 = y[i] + seg_len = math.sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)) + tot_len += seg_len + tot_x += seg_len * x0 + tot_x += seg_len * x1 + tot_y += seg_len * y0 + tot_y += seg_len * y1 + tot_x /= 2.0 * tot_len + tot_y /= 2.0 * tot_len + return tot_x, tot_y + +def convert_coords_str(coord_str): + vals = coord_str.split(',') + x = np.array(vals[0::2], dtype=float) + y = np.array(vals[1::2], dtype=float) + return x, y + + +color_table = [] +color_table.append((255, 77, 77)) +color_table.append((102, 102, 255)) +color_table.append(( 25, 255, 25)) +color_table.append((177, 166, 255)) +color_table.append(( 46, 230, 230)) +color_table.append((255, 77, 255)) +color_table.append((128, 230, 46)) +color_table.append((255, 166, 77)) +color_table.append((179, 179, 179)) +color_table.append(( 77, 255, 166)) +color_table.append((229, 229, 46)) +color_table.append((255, 51, 153)) +color_table.append((166, 77, 255)) +color_table.append((151, 166, 86)) + +color_table.append((153, 0, 0)) +color_table.append(( 0, 77, 153)) +color_table.append((153, 153, 0)) +color_table.append(( 77, 153, 0)) +color_table.append(( 0, 153, 153)) +color_table.append(( 13, 128, 13)) +color_table.append((153, 77, 0)) +color_table.append(( 0, 0, 153)) +color_table.append((153, 0, 153)) +color_table.append(( 0, 179, 89)) +color_table.append((102, 102, 102)) +color_table.append(( 77, 0, 153)) +color_table.append((153, 0, 77)) +color_table.append(( 78, 89, 30)) + +def color_by_index(i): + global color_table + # + return color_table[i % len(color_table)] + +def draw_morphology(nrn, img, somax, somay, color_by_layer=False): + global LINE_WIDTH, resolution + # + soma_col = (0, 0, 0) + axon_col = (70, 130, 180) + dend_col = (178, 34, 34) + apical_col = (255, 127, 80) + for c in nrn.compartment_list: + x0 = int(c.node1.x / resolution + somax) + x1 = int(c.node2.x / resolution + somax) + y0 = int(c.node1.y / resolution + somay) + y1 = int(c.node2.y / resolution + somay) + if color_by_layer: + color = color_table[c.node1.layer_num] + else: + color = soma_col + if c.node2.t == 2: + color = axon_col + elif c.node2.t == 3: + color = dend_col + elif c.node2.t == 4: + color = apical_col + cv2.line(img, (x0,y0), (x1,y1), color, LINE_WIDTH) + +def write_svg(svgname, jin, nrn): + resolution = jin["resolution"] + dx = jin["soma"]["position"][0] - nrn.soma_root().x / resolution + dy = jin["soma"]["position"][1] - nrn.soma_root().y / resolution + with open(svgname, "w") as f: + #f.write('<?xml version="1.0" encoding="UTF-8" ?>\n') + f.write('<svg xmlns="http://www.w3.org/2000/svg" version="1.1">\n') + # soma + soma = jin["soma"]["path"][0] + coords = soma.split(',') + f.write(' <polyline points="') + for i in range(0, len(coords), 2): + f.write('%f,%f ' % (float(coords[i]), float(coords[i+1]))) + f.write('" stroke="black" stoke-width="2" fill="none" />\n') + for layer in jin["layers"]: + f.write(' <polyline points="') + path = layer["path"] + coords = path.split(',') + for i in range(0, len(coords), 2): + f.write('%f,%f ' % (float(coords[i]), float(coords[i+1]))) + f.write('" stroke="black" stoke-width="2" fill="none" />\n') + for c in nrn.compartment_list: + try: + color = color_table[c.node1.layer_num] + except: + color = (45, 67, 89) + x0 = int(c.node1.x / resolution + dx) + x1 = int(c.node2.x / resolution + dx) + y0 = int(c.node1.y / resolution + dy) + y1 = int(c.node2.y / resolution + dy) + f.write(' <line x1="%f" y1="%f" x2="%f" y2="%f" style="stroke:rgb(%d,%d,%d)" />\n' % (x0, y0, x1, y1, color[0], color[1], color[2])) + f.write('</svg>\n') + +######################################################################## +######################################################################## +# +# global values, shared between functions +resolution = None # microns-per-pixel, from input.json +LINE_WIDTH = 1 # default pen width +DOWNSAMPLE_STEPS = 1 # default image pyramid level +# +def main(jin): + global resolution, LINE_WIDTH, DOWNSAMPLE_STEPS + jout = {} + spec_id = jin["specimen_id"] + + #################################################################### + if "line_width" in jin: + LINE_WIDTH = int(jin["line_width"]) + + # according to Staci, accuracy of 20x trace is approximately to the + # level of a cell soma (8-10um), which is approx 22 pixels + # downsampling by 2 won't significantly alter the accuracy of + # the annotations and is well within the stated margin of error. this + # lends itself to more efficient processing, and better thumbnails + if "downsample_steps" in jin: + DOWNSAMPLE_STEPS = int(jin["downsample_steps"]) + + ############################################ + # derived constants + RADS = [] + RADS.append(29) + RADS.append(15) + RADS.append(7) + RADS.append(3) + DOWNSAMPLE = 1 + for i in range(DOWNSAMPLE_STEPS): + DOWNSAMPLE *= 2 + GAUS_RAD = RADS[DOWNSAMPLE_STEPS] + + #################################################################### + + # calculate soma position and store in jin structure + soma_res = jin["soma"]["path"] + soma_path = soma_res[0].split(',') + soma_x = np.array(soma_path[0::2], dtype=float) + soma_y = np.array(soma_path[1::2], dtype=float) + soma_path = [] + for i in range(len(soma_x)): + soma_path.append([soma_x[i],soma_y[i]]) + soma_path = np.array(soma_path, np.int32) + soma_pos = calculate_centroid(soma_x, soma_y) + jin["soma"]["position"] = soma_pos + + resolution = jin["resolution"] + swc_name = jin["storage_directory"] + jin["swc_file"] + + ########################### + # before doing the heavy work, load external objects to make sure they're + # available + + # read morphology + morph = swc.read_swc(swc_name) + + # read 20x + fname_20x = jin["20x"]["img_path"] + image_20x = jpeg_twok.read(fname_20x, reduction_factor=DOWNSAMPLE_STEPS) + abs_width = image_20x.shape[1] + abs_height = image_20x.shape[0] + print("20x image size %dx%d at pyramid level %d" % (abs_width, abs_height, DOWNSAMPLE_STEPS)) + + # get soma position in 20x pixel space, at present downsample level + # resolution converts soma coords in microns to pixels + # (resolution is microns / pixel) + resolution *= DOWNSAMPLE # divide pixels by X means mult res by same + print("Image resolution (microns/pixel): %f" % resolution) + dx = jin["soma"]["position"][0] / DOWNSAMPLE - morph.soma_root().x / resolution + dy = jin["soma"]["position"][1] / DOWNSAMPLE - morph.soma_root().y / resolution + dx = int(dx) + dy = int(dy) + + ############################## + # no point in processing the entire image, as only a small part + # is relevant + # select min/max values for x,y of all polygons. restrict analysis + # to there + min_x = 1e10 + min_y = 1e10 + max_x = 0 + max_y = 0 + layers = jin["layers"] + for layer in layers: + path_array = np.array(layer["path"].split(',')) + x = np.array(path_array[0::2], dtype=float) + y = np.array(path_array[1::2], dtype=float) + min_x = min(min_x, x.min()) + min_y = min(min_y, y.min()) + max_x = max(max_x, x.max()) + max_y = max(max_y, y.max()) + + min_x /= DOWNSAMPLE + min_y /= DOWNSAMPLE + max_x /= DOWNSAMPLE + max_y /= DOWNSAMPLE + + # add a border around polygons to provide context + BORDER = 200 + BORDER /= DOWNSAMPLE + TOP = min_y - BORDER + LEFT = min_x - BORDER + RIGHT = max_x + BORDER + BOTTOM = max_y + BORDER + + # make sure border doesn't extend beyond image limits + TOP = max(TOP, 0) + LEFT = max(LEFT, 0) + RIGHT = min(RIGHT, abs_width-1) + BOTTOM = min(BOTTOM, abs_height-1) + WIDTH = int(RIGHT - LEFT) + HEIGHT = int(BOTTOM - TOP) + + # adjust soma location for top and left of visible image area + dx -= LEFT + dy -= TOP + #print "inset soma position", dx, dy + + + # make frame for each polygon and blur. blur radious should be + # approx the size of largest gap or overlap between polygons. this + # is for estimating which polygon each point is a best fit in + layers = jin["layers"] + for layer in layers: + path_array = np.array(layer["path"].split(',')) + x = np.array(path_array[0::2], dtype=float) + x /= DOWNSAMPLE + x -= LEFT + y = np.array(path_array[1::2], dtype=float) + y /= DOWNSAMPLE + y -= TOP + #print layer["label"] + #print x.min(), y.min() + #print x.max(), y.max() + xy = [] + for i in range(len(x)): + xy.append([x[i],y[i]]) + raw_frame = np.zeros((HEIGHT, WIDTH)) + path = np.array(xy) + cv2.fillPoly(raw_frame, np.int32([path]), 255) + frame = cv2.blur(raw_frame, (GAUS_RAD, GAUS_RAD)) + layer["frame"] = frame # blurred polygon + layer["raw_frame"] = raw_frame # raw polygon + + # collapse all polys into single array, with value at each position + # corresponding to the index of the polygon that the pixel falls + # into, or -1 if there's no match + master = np.zeros((HEIGHT, WIDTH, 3)) + master_idx = np.zeros((HEIGHT, WIDTH), dtype=int) + master_idx -= 1 + for y in range(HEIGHT): + for x in range(WIDTH): + peak = 0 + idx = -1 + for i in range(len(layers)): + frame = layers[i]["frame"] + val = frame[y][x] + if val > peak: + peak = val + idx = i + if idx >= 0: + master[y][x] = color_by_index(idx) + master_idx[y][x] = idx + + ################################################# + # draw standard morphology on colored layers + draw_morphology(morph, master, int(dx), int(dy)) + outfile = "layer_%d.png" % spec_id + print("saving " + outfile) + cv2.imwrite(outfile, master) + jout["morph_layers"] = outfile + + ################################################# + # draw standard morphology on 20x image + img = image_20x[TOP:BOTTOM,LEFT:RIGHT] + print(img.shape) + draw_morphology(morph, img, int(dx), int(dy)) + outfile = "blockface_%d.png" % spec_id + print("saving " + outfile) + cv2.imwrite(outfile, img) + jout["morph_20x"] = outfile + + ################################################# + # associate SWC nodes with morphology layers + jout["reconstruction_id"] = jin["reconstruction_id"] + reconstruction = {} + errs = 0 + for n in morph.node_list: + x = dx + int(n.x / resolution) + y = dy + int(n.y / resolution) + desc = n.to_dict() + idx = -1 + try: + idx = master_idx[y][x] + except: + errs += 1 + if idx >= 0: + desc["label"] = layers[idx]["label"] + n.layer_num = idx + else: + desc["label"] = "unknown" + n.layer_num = -1 + reconstruction[n.n] = desc + if errs > 0: + raise Exception("Unable to map %d nodes to a cortical layer" % errs) + jout["reconstruction"] = reconstruction + + ################################################# + # draw layer & morphology SVG + outfile = "outline_%d.svg" % spec_id + print("saving " + outfile) + jout["outline_svg"] = outfile + write_svg(outfile, jin, morph) + + ################################################# + # draw layer-colored morphology on 20x image + img = image_20x[TOP:BOTTOM,LEFT:RIGHT] + draw_morphology(morph, img, int(dx), int(dy), True) + outfile = "layered_blockface_%d.png" % spec_id + print("saving " + outfile) + cv2.imwrite(outfile, img) + jout["colored_morph_20x"] = outfile + + ################################################# + # draw layer-colored morphology on empty polygons + img = np.zeros((HEIGHT, WIDTH, 3)) + layers = jin["layers"] + for layer in layers: + path_array = np.array(layer["path"].split(',')) + x = np.array(path_array[0::2], dtype=float) + x /= DOWNSAMPLE + x -= LEFT + y = np.array(path_array[1::2], dtype=float) + y /= DOWNSAMPLE + y -= TOP + for i in range(1,len(x)): + cv2.line(img, (int(x[i-1]),int(y[i-1])), (int(x[i]),int(y[i])), (255, 255, 255), 1) + cv2.line(img, (int(x[-1]),int(y[-1])), (int(x[0]),int(y[0])), (255, 255, 255), 1) + draw_morphology(morph, img, int(dx), int(dy), True) + outfile = "outline_%d.png" % spec_id + print("saving " + outfile) + cv2.imwrite(outfile, img) + jout["colored_morph_poly"] = outfile + + return jout + + +# mouse +#ims_id = "489909914" +#spec_id = 488679042 + +#ims_id = "491762612" +#spec_id = 490387590 + +# human +#ims_id = "487992082" +#spec_id = 488386504 + +#ims_id = "488759189" +#spec_id = 488418027 + +#spec_id = 528015670 + +if __name__ == "__main__": + module = PipelineModule() + jin = module.input_data() # loads input.json + # "get" input json + #jin = prep_json(spec_id) + #json.write("in_%d.json" % spec_id, jin) + jout = main(jin) + module.write_output_data(jout) # writes output.json + #json.write("out_%d.json" % spec_id, jout) + diff --git a/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py b/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py new file mode 100644 index 0000000000..d60350adf9 --- /dev/null +++ b/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py @@ -0,0 +1,150 @@ +#!/usr/bin/python +import sys +import psycopg2 +import psycopg2.extras +sys.path.append("/home/keithg/allen/allensd") +import allensdk.core.json_utilities as json + + +def prep_json(spec_id): + jin = {} + + try: + conn_string = "host='limsdb2' dbname='lims2' user='atlasreader' password='atlasro'" + conn = psycopg2.connect(conn_string) + cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) + except: + print("unable to connect") + raise + + #################################################################### + # get polygons outlining layers in 20x image + layer_sql = """ + select st.acronym, poly.path, wkf.storage_directory, wkf.filename, ims.id from image_series ims + join sub_images si on si.image_series_id = ims.id + join avg_graphic_objects layer on layer.sub_image_id = si.id + join avg_graphic_objects poly on poly.parent_id = layer.id + join avg_group_labels layert on layert.id = layer.group_label_id + left join structures st on st.id = poly.structure_id + join specimens hemisl on hemisl.id = ims.specimen_id + join specimens cell on cell.parent_id = hemisl.id + join neuron_reconstructions nr on nr.specimen_id = cell.id + join well_known_files wkf on wkf.attachable_id = nr.id + JOIN well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id + where nr.superseded is false + and layert.name = 'Default' + AND wkft.name = '3DNeuronReconstruction' + and cell.id = %d + order by 1 + """ + cursor.execute(layer_sql % spec_id) + #print layer_sql % spec_id + poly_info = cursor.fetchall() + if len(poly_info) == 0: + print("Error -- cannot no polygon data for Specimen %d" % spec_id) + sys.exit(1) + poly = [] + for entry in poly_info: + label = entry[0] + path = entry[1] + block = {} + block["path"] = path + block["label"] = label + poly.append(block) + ## break down string path into two numeric arrays + #path_array = np.array(path.split(',')) + #path_x = np.array(path_array[0::2], dtype=float) + #path_y = np.array(path_array[1::2], dtype=float) + #block["path_array"] = path_array + #block["path_x"] = path_x + #block["path_y"] = path_y + #poly[label] = block + jin["layers"] = poly + jin["storage_directory"] = poly_info[0][2] + jin["swc_file"] = poly_info[0][3] + + # reconstruction ID + # steal this from file name + fname = jin["swc_file"].split("_m.swc")[0] + reconstruction_id = int(fname[-9:]) + jin["reconstruction_id"] = reconstruction_id + jin["resolution"] = 0.363 + + + # it appears that we need to restrict image query to use this ims_id + ims_id = poly_info[0][4] + + #################################################################### + # get soma outline + soma_sql = """ + SELECT poly.path + from image_series ims + join sub_images si on si.image_series_id = ims.id + join avg_graphic_objects layer on layer.sub_image_id = si.id + join avg_graphic_objects poly on poly.parent_id = layer.id + join avg_group_labels layert on layert.id = layer.group_label_id + left JOIN images im ON im.id=si.image_id + left JOIN scans sc ON sc.image_id=im.id + JOIN avg_group_labels agl ON layer.group_label_id=agl.id + left join structures st on st.id = poly.structure_id + join specimens hemisl on hemisl.id = ims.specimen_id + join specimens cell on cell.parent_id = hemisl.id + join neuron_reconstructions nr on nr.specimen_id = cell.id + join well_known_files wkf on wkf.attachable_id = nr.id + JOIN well_known_file_types wkft ON wkft.id = wkf.well_known_file_type_id AND wkft.name = '3DNeuronReconstruction' + where nr.superseded is false + and agl.name = 'Soma' + and cell.id = %d + """ + #print soma_sql % spec_id + cursor.execute(soma_sql % spec_id) + soma_res = cursor.fetchall() + som = {} + som["label"] = "Soma" + som["path"] = soma_res[0] + jin["soma"] = som + + #################################################################### + # get 20x image + img_sql = """ + SELECT ss.storage_directory, im.jp2 from image_series ims + join sub_images si on si.image_series_id = ims.id + left JOIN images im ON im.id=si.image_id + left JOIN specimens cell on ims.specimen_id = cell.id + join slides ss on ss.id = im.slide_id + where cell.id = %d + """ + + # get 20x image + img_sql = """ + SELECT ss.storage_directory, im.jp2 + from image_series ims + join sub_images si on si.image_series_id = ims.id + left JOIN images im ON im.id=si.image_id + join slides ss on ss.id = im.slide_id + and ims.id = %s + """ + try: + cursor.execute(img_sql % ims_id) + #cursor.execute(img_sql % spec_id) + img_res = cursor.fetchall() + img_path = img_res[0][0] + img_res[0][1] + #img_path = "%s-20x.jpeg" % str(spec_id) + except: + print("Error fetching path to 20x image from database") + print(img_sql % spec_id) + raise + + img = {} + #img["img_res"] = img_res + img["img_path"] = img_path + jin["20x"] = img + + return jin + +if __name__ == "__main__": + spec_id = 490387590 + jin = prep_json(spec_id) + print("Test mode: creating input.json for specimen.id=%d" % spec_id) + json.write("input.json", jin) + diff --git a/internal/pipeline_modules/cell_types/morphology/upright_transform.py b/internal/pipeline_modules/cell_types/morphology/upright_transform.py new file mode 100644 index 0000000000..9797163782 --- /dev/null +++ b/internal/pipeline_modules/cell_types/morphology/upright_transform.py @@ -0,0 +1,392 @@ +######################################################################## +# library code +import math +import argparse +import sys +import numpy as np +from scipy.spatial.distance import euclidean +import skimage.draw + + + +def calculate_centroid(x, y): + ''' Calculates the center of a polygon, using weighted averages + of vertex locations + ''' + assert len(x) == len(y), "Vertex arrays are of incorrect shape" + tot_len = 0.0 + tot_x = 0.0 + tot_y = 0.0 + for i in range(len(x)): + x0 = x[i-1] + y0 = y[i-1] + x1 = x[i] + y1 = y[i] + seg_len = euclidean((x0, y0), (x1, y1)) + tot_len += seg_len + tot_x += seg_len * x0 + tot_x += seg_len * x1 + tot_y += seg_len * y0 + tot_y += seg_len * y1 + tot_x /= 2.0 * tot_len + tot_y /= 2.0 * tot_len + return tot_x, tot_y + + +def construct_affine(theta): + tr_rot = [np.cos(theta), np.sin(theta), 0, + -np.sin(theta), np.cos(theta), 0, + 0, 0, 1, + 0, 0, 0 + ] + return tr_rot + + +#def get_pia_wm_rotation_transform(soma_coords, wm_coords, pia_coords, resolution): +# # get soma position using weighted average of vertices +# sx, sy = convert_coords_str(soma_coords) +# soma_x, soma_y = calculate_centroid(sx, sy) +# +# #pia_proj = project_to_polyline(pia_coords, avg_soma_position) +# #wm_proj = project_to_polyline(wm_coords, avg_soma_position) +# px, py, wx, wy = calculate_shortest(soma_x, soma_y, pia_coords, wm_coords) +# theta = vector_angle((0, 1), np.asarray([px,py]) - np.asarray([wx,wy])) +# print theta +# +# depth = euclidean((soma_x, soma_y), (px, py)) +# height = euclidean((wx, wy), (px, py)) +# return theta, resolution*depth, resolution*height, [px, py, wx, wy] + + +def convert_coords_str(coord_str): + vals = coord_str.split(',') + x = np.array(vals[0::2], dtype=float) + y = np.array(vals[1::2], dtype=float) + return x, y + +def calculate_shortest(soma_x, soma_y, pia, wm): + """ Calculates shortest distance through a point on the polygon wm + through the soma coordinates (soma_x, soma_y) and + through a point on the polygon pia. + + Returns the x,y points in pia and wm that define the endpoints of this + shortest line. + """ + pia_xs, pia_ys = convert_coords_str(pia) + wm_xs, wm_ys = convert_coords_str(wm) + ################# + # calculate canvas size and make canvas + width = max(pia_xs) + width = int(max(width, max(wm_xs))) + height = max(pia_ys) + height = int(max(height, max(wm_ys))) + + canvas = np.zeros((height+10, width+10, 3), dtype=np.uint8) + + for i in range(1,len(pia_xs)): + lr, lc = skimage.draw.line(int(pia_ys[i-1]), int(pia_xs[i-1]), int(pia_ys[i]), int(pia_xs[i])) + canvas[lr,lc,2] = 255 + + for i in range(1,len(wm_xs)): + lr, lc = skimage.draw.line(int(wm_ys[i-1]), int(wm_xs[i-1]), int(wm_ys[i]), int(wm_xs[i])) + canvas[lr,lc,0] = 255 + + # get points in white matter trace + wp_y, wp_x = np.nonzero(canvas[:,:,0]) + + ################## + # draw an extended line from each wm pix through the soma + # (there are usually less WM pix than pia pix, so this should be + # faster than iterating through pia pix) + # make array of blue (pia) channel only to + pia = canvas[:,:,2] + # draw line from each wm pix through the soma and into infinity + # (line terminates if/when it intersects with pia trace) + min_dist = None + min_coord = None # stores [ pia_x, pia_y, wm_x, wm_y ] + for i in range(len(wp_x)): + x0 = wp_x[i] + y0 = wp_y[i] + x1 = soma_x + y1 = soma_y + ############################################# + # adapted from Bresenham's line algorithm, from rosetacode + dx = abs(x1 - x0) + dy = abs(y1 - y0) + x, y = x0, y0 + sx = -1 if x0 > x1 else 1 + sy = -1 if y0 > y1 else 1 + if dx > dy: + err = dx / 2.0 + while x >= 0 and x < width and y >= 0 and y < height: + if pia[y,x] > 0: + dist = euclidean((x0, y0), (x, y)) + if min_dist is None or min_dist > dist: + min_dist = dist + min_coord = [x, y, x0, y0] + break + err -= dy + if err < 0: + y += sy + err += dx + x += sx + else: + err = dy / 2.0 + while x >= 0 and x < width and y >= 0 and y < height: + if pia[y,x] > 0: + dist = euclidean((x0, y0), (x, y)) + if min_dist is None or min_dist > dist: + min_dist = dist + min_coord = [x, y, x0, y0] + break + err -= dx + if err < 0: + x += sx + err += dy + y += sy + + if min_dist is None: + print("Unable to connect pia to WM through soma") + px = None + py = None + wx = None + wy = None + else: + px = min_coord[0] + py = min_coord[1] + wx = min_coord[2] + wy = min_coord[3] + return px, py, wx, wy + + +def dist_proj_point_lineseg(p, q1, q2): + # based on c code from http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment + l2 = euclidean(q1, q2) ** 2 + if l2 == 0: + return euclidean(p, q1) # q1 == q2 case + t = max(0, min(1, np.dot(p - q1, q2 - q1) / l2)) + proj = q1 + t * (q2 - q1) + return euclidean(p, proj), proj + + +def project_to_polyline(boundary, soma): + x, y = convert_coords_str(boundary) + points = zip(x, y) + dists_projs = [dist_proj_point_lineseg(soma, np.array(q1), np.array(q2)) + for q1, q2 in zip(points[:-1], points[1:])] + min_idx = np.argmin(np.array([d[0] for d in dists_projs])) + return dists_projs[min_idx][1] + + +def vector_angle(v1, v2): + return np.arctan2(v2[1], v2[0]) - np.arctan2(v1[1], v1[0]) + + +######################################################################## +# pipeline code +import allensdk.internal.core.swc as swc +from allensdk.internal.core.lims_pipeline_module import PipelineModule + + +def main(jin): + # per IT-14567, blockface analysis is no longer required + ######################################################################### + ## analyze blockface image + #try: + # soma = jin["blockface"]["Soma"]["path"] + # pia = jin["blockface"]["Pia"]["path"] + # wm = jin["blockface"]["White Matter"]["path"] + # res = float(jin["blockface"]["Pia"]["resolution"]) + #except: + # print("** Error -- missing requisite blockface field(s) in input json") + # raise + # + ## get soma position using weighted average of vertices + #try: + # sx, sy = convert_coords_str(soma) + # soma_x, soma_y = calculate_centroid(sx, sy) + #except: + # print("** Error -- unable to calculate soma information (blockface)") + # raise + # + ## calculate shortest path + #try: + # px, py, wx, wy = calculate_shortest(soma_x, soma_y, pia, wm) + ## calculate theta and affine + # theta = vector_angle((0, 1), np.asarray([px,py]) - np.asarray([wx,wy])) + ## calculate soma depth and cortical thickness + # depth = res * euclidean((soma_x, soma_y), (px, py)) + # blk_thickness = res * euclidean((wx, wy), (px, py)) + #except: + # print("** Error calculating shortest path (blockface)") + # raise + # + #blockface = {} + #blockface["pia_intersect"] = [ px, py ] + #blockface["wm_intersect"] = [ wx, wy ] + #blockface["soma_center"] = [ soma_x, soma_y ] + #blockface["soma_depth_um"] = depth + #try: + # blockface["soma_depth_relative"] = depth / blk_thickness + #except: + # blockface["soma_depth_relative"] = -1.0 # NaN is not friendly to ruby + #blockface["cort_thickness_um"] = blk_thickness + #blockface["theta"] = theta + + ######################################################################## + # analyze primary (20x) image + try: + soma = jin["primary"]["Soma"]["path"] + pia = jin["primary"]["Pia"]["path"] + wm = jin["primary"]["White Matter"]["path"] + res = float(jin["primary"]["Pia"]["resolution"]) + except: + print("** Error -- missing requisite primary (20x) field(s) in input json") + raise + + # get soma position using weighted average of vertices + try: + sx, sy = convert_coords_str(soma) + soma_x, soma_y = calculate_centroid(sx, sy) + except: + print("** Error -- unable to calculate soma information (primary)") + raise + try: + # calculate shortest path + px, py, wx, wy = calculate_shortest(soma_x, soma_y, pia, wm) + # calculate theta and affine + theta = vector_angle((0, 1), np.asarray([px,py]) - np.asarray([wx,wy])) + tr_rot = construct_affine(theta) + inv_tr_rot = construct_affine(-theta) + # calculate soma depth and cortical thickness + depth = res * euclidean((soma_x, soma_y), (px, py)) + raw_thickness = res * euclidean((wx, wy), (px, py)) + except: + print("** Error calculating shortest path (primary)") + raise + + + primary = {} + primary["pia_intersect"] = [ px, py ] + primary["wm_intersect"] = [ wx, wy ] + primary["soma_center"] = [ soma_x, soma_y ] + primary["soma_depth_um"] = depth + try: + primary["soma_depth_relative"] = depth / raw_thickness + except: + primary["soma_depth_relative"] = -1.0 # NaN is not friendly to ruby + primary["cort_thickness_um"] = raw_thickness + primary["theta"] = theta + + try: + scale = raw_thickness / blk_thickness + except: + scale = -1.0 # NaN is not ruby-friendly + + soma_coords_avail = False + if "swc_file" in jin: + # if SWC file available, extract soma position from it + try: + nrn = swc.read_swc(jin["swc_file"]) + root = nrn.soma_root() + soma_x = root.x + soma_y = root.y + soma_z = root.z + soma_coords_avail = True + except: + # treat this as a fatal error -- if SWC was specified then + # it should be used + print("**** Error reading SWC file '%s'" % jin["swc_file"]) + raise + + if not soma_coords_avail: + # hope that the 63x data is available. As of May 2017, this seems + # to no longer be supplied to the module, but just in case... + # IT-14567 continue if 63x data not available + try: + info = jin["soma_63x"] + sx, sy = convert_coords_str(info["path_63x"]) + soma_x, soma_y = calculate_centroid(sx, sy) + soma_x *= float(info["resolution"]) + soma_y *= float(info["resolution"]) + soma_z = float(info["idx"]) * float(info["thickness"]) + soma_coords_avail = True + except: + print("** Error reading soma 63x info from input json") + print("** Translation component of affine matrix is invalid **") + + if not soma_coords_avail: + raise Exception("** Error: Unable to construct translation component of affine") + + try: + # apply affine rotation to soma position + translate_x = soma_x*tr_rot[0] + soma_y*tr_rot[1] + soma_z*tr_rot[2] + translate_y = soma_x*tr_rot[3] + soma_y*tr_rot[4] + soma_z*tr_rot[5] + translate_z = soma_x*tr_rot[6] + soma_y*tr_rot[7] + soma_z*tr_rot[8] + # apply translation vector to transform + tr_rot[ 9] = -translate_x + tr_rot[10] = -translate_y - depth + tr_rot[11] = -translate_z + except: + print("** Error calculating affine tranform (math fault?)") + raise + soma_x = -translate_x + soma_y = -translate_y - depth + soma_z = -translate_z + + # apply affine rotation to soma position + translate_x = soma_x*inv_tr_rot[0] + soma_y*inv_tr_rot[1] + soma_z*inv_tr_rot[2] + translate_y = soma_x*inv_tr_rot[3] + soma_y*inv_tr_rot[4] + soma_z*inv_tr_rot[5] + translate_z = soma_x*inv_tr_rot[6] + soma_y*inv_tr_rot[7] + soma_z*inv_tr_rot[8] + + inv_tr_rot[ 9] = -translate_x + inv_tr_rot[10] = -translate_y + inv_tr_rot[11] = -translate_z + + try: + # upright transform. based on rotation in 20x image + upright = {} + for i in range(12): + upright["tvr_%02d" % i] = tr_rot[i] + upright["trv_%02d" % i] = inv_tr_rot[i] + jout = {} + jout["primary"] = primary + #jout["blockface"] = blockface # per IT-14567, disable blockface + jout["upright"] = upright + alignment = {} + alignment["scale"] = scale + alignment["rotate_x"] = theta + alignment["rotate_y"] = theta + alignment["rotate_z"] = 0.0 + alignment["scale_x"] = 1.0 + alignment["scale_y"] = 1.0 + alignment["scale_z"] = 1.0 + alignment["skew_x"] = 0.0 + alignment["skew_y"] = 0.0 + alignment["skew_z"] = 0.0 + jout["alignment"] = alignment + except: + print("** Internal error **") + raise + + return jout + + # + # test transform -- bar.swc should match the source file + #print("source swc: " + jin["swc_file"]) + #print tr_rot + #morph2 = swc.read_swc(jin["swc_file"]) + #morph2.apply_affine(tr_rot) + #morph2.save("foo.swc") + #morph3 = swc.read_swc("foo.swc") + #morph3.apply_affine(inv_tr_rot) + #morph3.save("bar.swc") + +if __name__ == "__main__": + # read module input. PipelineModule object automatically parses the + # command line to pull out input.json and output.json file names + module = PipelineModule() + jin = module.input_data() # loads input.json + jout = main(jin) + module.write_output_data(jout) # writes output.json + diff --git a/internal/pipeline_modules/gbm/__init__.py b/internal/pipeline_modules/gbm/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/internal/pipeline_modules/gbm/__pycache__/__init__.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4acf240a850442996c21f0df0b09eed08a36b6e5 GIT binary patch literal 206 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VLY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9wmG7D03GV@a7bMsS5b5e`-)01-b<Kr{)GE3s) T^$IF)ao9j)>_86s48#loIjuYA literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/gbm/__pycache__/generate_gbm_analysis_run_records.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/generate_gbm_analysis_run_records.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb69979ec4710fda1cc0face0e0c535c19ab31c6 GIT binary patch literal 1716 zcmb7F&2Jk;6rcU@?%GZy6w*Q@ROV7uMy-PqsVz_tP>!e)AXH=-jmDmdJ;{1@J2M-{ zXnjCM+z{o?ArUA3rMYs-zrcz2)=8SAxv<v$=FQCe{LQ@em+R{t0+0UdXZ~wS$Uita ze_&2Nhu8iDAczQZGFXklAZX^{AQYj9ej$TM#v(ol&7lnUTcWi^21z3&Af=6zf|NB< z22#6`+8}irsRL41MlzA9%w$`3WcOtfK+Nw*uX_sd$+K~S13c^Sw&8sWuYCpJ$bL`< zby!DrT(?B<TWgur$#Hl>mT8?HM<P540s>MDE18HUL<P(C(N3LxMSlEX*{M4s-XegI zHz4FJ(m$hRw{DAQiyXJ=F516%@|?J&CL((o{=TtXbLnwbx9hc&Fd)x?mv6|o<Odib z<My*&%g58gIv<yXaf3vRG@nTyS5_LImE78SVFdppgc4*f$BqhRozfr}&HGAFZc$=$ zndeN2`*b38-@3x^iDW_<Fe%J})^)S7r*eq_?o(&Dwl^!Tw$4@Qo+)M&-8X^gexWoq zmbq#qEp@ce)b%Z&mAQoY^waaaR(g<`l`oh)Dy2~~shy<~O=SPf#mdHEC08uC=J~=Z z%S@#KZt%m+PU8y4{+kLb$MV8)L(qXP=9*z?7Wu$TkT32WA5Zz{yo4(*FK2>IxfYGl zHHXYC$}<Lb9zNQA{Ncmhk5(mJQv}kG`-ZsY5dL@c)d5{|dqe!kbUu|vHrbZdC|7nW z1>=q?OLgI>uJZh%oHy@`%GH6S_wH^_Mzig^_b6OMY3OKicEX?d%`4QvRRaxc0_e2U z2H?_?UNq=lx}SsFS8RZM$x7~~gZHkiHx-VJDqXYdgL$tF?O+$<qMYpbbX;f+H`^!U z%GkpAR36E3<>VmSlMYTY&wawnQflGj0tO%N+X7Hjv$D7D@4ODSN}Ay|%Zo903iMJj zVog_~fQ{L#G@XenO>?$!3;Pp7U^+g6Tp$8>+~60;$I8i>Pgb<}w5S~3yT6IK1H1pe zdiwG3duVby<WnyCBR=PPG5kVv@Fn=}Q0hZF#MCX6EQ@lwu*0v_XlTLfgOZOApufR3 zhkmx=U|VS?f#!U>RHe)nusSP51=qYeJfzuhCmEb1dtG~_+1a7>%Y~0;T<I?4W;X#y zxEW+YC(RIpcY}>!Eie?;ea0ASGG_3@Z!&<>2q8vjAz=NzHG_W{<}Cmp*@eBZMjjdS xF*lP#vw=EqBVbf>3*k1xI|xYCC3qjEK6|n%?K6yGQ5SQ}qHHq@JCN)7??1CI7#aWo literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/gbm/__pycache__/generate_gbm_heatmap.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/generate_gbm_heatmap.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10c6addea937a93517261180bf3861765d72cade GIT binary patch literal 4151 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 GYkvY5|2q}{ literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/gbm/__pycache__/generate_gbm_sample_metadata.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/generate_gbm_sample_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..049f36b0c341f9d68cc4df3af029f82945f890c7 GIT binary patch literal 2361 zcmaJ@Pj4eN6rV{Z$s|p;0+xRZNONl=byH~<?Exr)El0Exix8_2WO>GJ;$+4iY){)r z=>ZmTK^0$t6(_#ZTsieCaN<4BOj=4yqCEe`e(yK$kNupd+uH*VKJt$r=~F;|;Y0K3 z0r(7l<`)pmV}9yQs?neL?zuH-!PrXMSuhEFkF{Cwvp4DRF6%5?`X}C6^jP;@ZxTAx z1JrjY1T=7{4`|Dw0idBnTY$EChljk+2YibU`S!~$u=`(oqv0j^;yoMr<-O;ereBD} z9u?Xsopf;lKK=T41fzKY!g>pT?XO$w_BvR1n19hZ@2<OxmTj}vg@4{#_kIsp`<3r| zwzKwF@Ur#WgY(dK7q}9>^41~iu<k|M_r8Vbzw(}YFJJ^;de26kGMFo4%OF?UPP#0X zG~;DZ7_Q4Or^cKr%|`y@UgDf2$274@ujoYwoZ~4^Y{Z1ILITi|js=UTK}1e@ni9eG zBU@xj*9#6`o8@PggK|nt&J&SwN$~whQEB4SeiWxFS=I~=JBDiZZiY&;Vla7azIhLN z2D5jYZ!{~0Ovt@lr7PeWp?`>HN;*%BZP=|Y5?g5AOw&XwxysPMY}RNTYknfA6-q*S z6q)n0J>bwBsMqUjGc(P(yfGK21$Q1?5hf~C8p5&TCVN+FZsu64EW(1g(nJd-WF#^= z;{@s~xQQ~6nMg@DVl0PMF|VmWM3r5W7l<fFlPa}`m1(nhi?%BV8dP<2F9F+}YA)?9 z`fdZD{$~Fi)}}X1=*f&^0uoKNrYmB3mZ#KWP}YS6#kmnj?Q9bf63jHs=OQ60UcjEN z%8S-@$sr+`9h*7Lv9xs}nu20&QMcL#hn3A$1sZ*Ah%I993uP5p%*Td;yN<NZdCiVT z$nYNsKg*#+a5BItz-R}<xF$nq4jmy@&DFIrq;RZOMi`<C3E~zysvp&i6&n9nsp7{M zHuV3Zji^S4s5{<=Fe2fG=DO-8YpyLUr8<@5Sfr4R<9wMR365iGEluV$ZZc9apU%1F zZbxpiMIgUI&Z1N-p<T#TwCAcHeYgAg$&-hKklp=g_rn@~59dX)>J51jr^3uRBh*I1 zL{iyE7HJyIv?}r_UTyYU)46VM5m#NQL3io71M)x3X1{Kn?f|>CWXE;i*qmtuO>1$d zJ%YB(HM$E$gW`N#`lpvIxGdme=?ckUzl{3O!ObdB`Rq~IOO%wbv&(MP$TjMgJ$}ZM z!a~DWIhSRyFbX6qvV0OAa|@M7Q=s{vPJ6~JWz<rFdIXxXYhh)N#l&4A2=E?pGuU_> zaCb=`m+(4aWq_`fZSbS)slwte_|wx5z@NW=J^E<+4YVXPrE|*0F+GLSPCu6vOc;GU z<?_T#(NzOcah1<kX8NUwr$$)*FsI29S{m4<DQK|efsobha*&Ihr$Ta)DOSLyJDA1U z!Hi3;p-~WcAU7f$=c_WvsE|W&%ea3St^5AaAM6Z${XV8HBm~z9x%A;thafK7C;}94 zJ9?LRp^xrqwAMQy%C=dV$xc%fyn8e?t`Zwg%o-tOK=tfIzlN5tqj&?weH3q^cnbw) g?3#EF9?S5PD#B0k-R2z-p^x8TJA6BA4g9O`Kg19Un*aa+ literal 0 HcmV?d00001 diff --git a/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py b/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py new file mode 100644 index 0000000000..30257be6ea --- /dev/null +++ b/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py @@ -0,0 +1,39 @@ +### +# This program generates a json file containing the GBM analysis run records from an sql query + +# To Do: This will be done by the strategy and later removed from here. + +import psycopg2 +import json +import sys + + +def main(analysis_records_json_location, db_host, db_port, db_name, db_user, db_passwd): + + conn = psycopg2.connect(host=db_host, port=db_port, dbname=db_name, user=db_user, password=db_passwd) + cur = conn.cursor() + cur.execute("select distinct rna.id as rna_well_id, gen.storage_directory || gen.filename, trans.storage_directory " + "|| trans.filename from wells rna join rs_tubes t on t.sample_id = rna.id join rna_seq_experiments e " + "on e.rs_tube_id = t.id join rna_seq_analysis_runs_rna_seq_experiments ar2e on ar2e.rna_seq_experiment_id " + "= e.id join well_known_files gen on gen.attachable_id = ar2e.rna_seq_analysis_run_id and " + "gen.well_known_file_type_id = 267380639 join well_known_files trans on trans.attachable_id " + "= ar2e.rna_seq_analysis_run_id and trans.well_known_file_type_id = 267380638 where gen.published_at is " + "not null and gen.storage_directory ilike '%/gbm/%' order by rna.id;") + data = cur.fetchall() + analysis_run_records = {"analysis_run_records": []} + for item in data: + record = {"rna_well_id": item[0], "analysis_run_gene_path": item[1], "analysis_run_transcript_path": item[2]} + analysis_run_records["analysis_run_records"].append(record) + with open(analysis_records_json_location, 'w') as outfile: + json.dump(analysis_run_records, outfile) + + +if __name__ == '__main__': + + analysis_records_json_location = sys.argv[1] + db_host = sys.argv[2] + db_port = sys.argv[3] + db_name = sys.argv[4] + db_user = sys.argv[5] + db_passwd = sys.argv[6] + main(analysis_records_json_location, db_host, db_port, db_name, db_user, db_passwd) diff --git a/internal/pipeline_modules/gbm/generate_gbm_heatmap.py b/internal/pipeline_modules/gbm/generate_gbm_heatmap.py new file mode 100644 index 0000000000..32a2d5e01d --- /dev/null +++ b/internal/pipeline_modules/gbm/generate_gbm_heatmap.py @@ -0,0 +1,143 @@ +### +# Purpose: +# +# Generates the heatmap files for GBM analysis runs. The files are the following: +# transcripts_for_genes.csv, genes_for_transcripts.csv, gene_fpkm_table.csv, transcript_fpkm_table.csv +# +# Usage: +# +# python generate_gbm_heatmap.py input.json +# +# Input: +# +# input.json +# +# { +# "transcripts_for_genes_output":"/tmp/transcripts_for_genes.csv", +# "genes_for_transcripts_output":"/tmp/genes_for_transcripts.csv", +# "gene_fpkm_table_output":"/tmp/gene_fpkm_table.csv", +# "transcript_fpkm_table_output":"/tmp/transcript_fpkm_table.csv", +# "columns_samples_output":"/tmp/columns_samples.csv", +# "analysis_run_records":"/tmp/analysis_run_records.json", +# "sample_metadata_records":"/tmp/sample_metadata_records.json" +# } +# +# Output: +# +# Creates the specified csv files + +import json +import sys +import numpy as np +import pandas as pd + + +def create_transcripts_for_genes(analysis_run_gene_file): + + """ Creates a list that contains the associated transcript for each gene sorted by entrez_id """ + + transcripts_for_genes = np.genfromtxt(analysis_run_gene_file["analysis_run_gene_path"], usecols=[0, 1], skip_header=1, + dtype='str').tolist() + data = sorted(transcripts_for_genes, key=lambda row: int(row[0])) + header = ['gene_id', 'transcript_id(s)'] + data.insert(0, header) + data = pd.DataFrame(data) + return data + + +def create_genes_for_transcripts(analysis_run_transcript_file): + + """ Creates a list that contains the associated gene for each transcript sorted alphabetically """ + + genes_for_transcripts = np.genfromtxt(analysis_run_transcript_file["analysis_run_transcript_path"], usecols=[0, 1] + , skip_header=1, dtype='str').tolist() + data = sorted(genes_for_transcripts, key=lambda row: row[0].lower()) + header = ['transcript_id', 'gene_id'] + data.insert(0, header) + data = pd.DataFrame(data) + return data + + +def create_gene_fpkm_table(analysis_run_records): + + """ Creates a a matrix ("rows x columns = genes x samples") of fpkm gene expression values for each particular + (gene, sample) pair. Rows are sorted by entrez_id and columns are by rna_well_id """ + + gene_fpkm = [] + rna_well_ids = [] + + for record in analysis_run_records: + gene_fpkm.append(np.genfromtxt(record["analysis_run_gene_path"], usecols=[-1] + , skip_header=1, dtype='str')) + rna_well_ids.append(record["rna_well_id"]) + + entrez_ids = np.genfromtxt(analysis_run_records[0]["analysis_run_gene_path"], usecols=[0], skip_header=1 + , dtype='str').tolist() + entrez_ids_int = list(map(int, entrez_ids)) + gene_fpkm_table = np.column_stack(gene_fpkm) + df = pd.DataFrame(gene_fpkm_table, columns=rna_well_ids, index=entrez_ids_int) + df = df.sort_index() + rna_well_ids_sorted = sorted(list(map(int, rna_well_ids))) + data = df[rna_well_ids_sorted] + return data + + +def create_transcript_fpkm_table(analysis_run_records): + + """ Creates a a matrix ("rows x columns = transcripts x samples") of fpkm gene expression values for each particular + (transcript, sample) pair. Rows are sorted by transcript id and columns are by rna_well_id """ + + transcript_fpkm = [] + rna_well_ids = [] + + for record in analysis_run_records: + transcript_fpkm.append(np.genfromtxt(record["analysis_run_transcript_path"], usecols=[-1] + , skip_header=1, dtype='str')) + rna_well_ids.append(record["rna_well_id"]) + + transcript_ids = np.genfromtxt(analysis_run_records[0]["analysis_run_transcript_path"], usecols=[0], skip_header=1 + , dtype='str').tolist() + transcript_fpkm_table = np.column_stack(transcript_fpkm) + + df = pd.DataFrame(transcript_fpkm_table, columns=rna_well_ids, index=transcript_ids) + df = df.sort_index() + rna_well_ids_sorted = sorted(list(map(int, rna_well_ids))) + data = df[rna_well_ids_sorted] + return data + + +def create_sample_metadata(sample_metadata_records): + + """ Creates a table of sample metadata sorted by rna_well_id """ + + df = pd.DataFrame.from_dict(sample_metadata_records, orient='columns') + data = df.sort_values(by=['rna_well_id']).reset_index(drop=True) + rna_well_id = data['rna_well_id'] + data.drop(labels=['rna_well_id'], axis=1, inplace=True) + data.insert(0, 'rna_well_id', rna_well_id) + return data + + +def main(): + + input_file = sys.argv[1] + data = json.load(open(input_file)) + transcripts_for_genes_output = data["transcripts_for_genes_output"] + genes_for_transcripts_output = data["genes_for_transcripts_output"] + gene_fpkm_table_output = data["gene_fpkm_table_output"] + transcript_fpkm_table_output = data["transcript_fpkm_table_output"] + columns_samples_output = data["columns_samples_output"] + analysis_run_records = json.load(open(data["analysis_run_records"])) + sample_metadata_records = json.load(open(data["sample_metadata_records"])) + + create_transcripts_for_genes(analysis_run_records["analysis_run_records"][0]).to_csv(transcripts_for_genes_output, + index=False, header=False) + create_genes_for_transcripts(analysis_run_records["analysis_run_records"][0]).to_csv(genes_for_transcripts_output, + index=False, header=False) + create_gene_fpkm_table(analysis_run_records["analysis_run_records"]).to_csv(gene_fpkm_table_output) + create_transcript_fpkm_table(analysis_run_records["analysis_run_records"]).to_csv(transcript_fpkm_table_output) + create_sample_metadata(sample_metadata_records).to_csv(columns_samples_output, index=False) + + +if __name__ == '__main__': + main() diff --git a/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py b/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py new file mode 100644 index 0000000000..0179dda6e3 --- /dev/null +++ b/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py @@ -0,0 +1,43 @@ +### +# This program generates a json file containing the GBM sample metadata records from an sql query + +# To Do: This will be done by the strategy and later removed from here. + +import psycopg2 +import json +import sys +from psycopg2.extras import RealDictCursor + + +def main(sample_metadata_json_location, db_host, db_port, db_name, db_user, db_passwd): + + conn = psycopg2.connect(host=db_host, port=db_port, dbname=db_name, user=db_user, password=db_passwd) + cur = conn.cursor(cursor_factory=RealDictCursor) + cur.execute("select distinct rna.id as rna_well_id, tumor.id as tumor_id, tumor.external_specimen_name as tumor_name" + ", block.id as block_id, block.external_specimen_name as block_name, sp.id as specimen_id" + ", sp.external_specimen_name as specimen_name, min(poly.id) as polygon_id, st.id as structure_id" + ", st.acronym as structure_abbreviation, to_hex(st.red) || to_hex(st.green) || to_hex(st.blue) as " + "structure_color, st.name as structure_name from wells rna join image_series mims on mims.id = " + "rna.image_series_id join specimens sp on sp.id = mims.specimen_id join specimens block on block.id = " + "sp.parent_id join specimens tumor on tumor.id = block.parent_id join avg_microarray_templates mt on " + "mt.image_series_id = mims.id join avg_graphic_objects poly on poly.id = mt.shape_id join structures st " + "on st.id = poly.structure_id join rs_tubes tube on tube.sample_id = rna.id join rna_seq_experiments exp " + "on exp.rs_tube_id = tube.id join rna_seq_analysis_runs_rna_seq_experiments ar2exp on " + "ar2exp.rna_seq_experiment_id = exp.id join analysis_runs ar on ar.id = ar2exp.rna_seq_analysis_run_id " + "join well_known_files fpkm on fpkm.attachable_id = ar.id where rna.sample_id_string like any (array " + "['366-___', '466-___']) and fpkm.published_at is not null group by tumor.id, " + "tumor.external_specimen_name, block.id, block.external_specimen_name, sp.id, sp.external_specimen_name, " + "rna.id, st.id, st.acronym, st.name, structure_color order by rna.id;") + with open(sample_metadata_json_location, 'w') as outfile: + json.dump(cur.fetchall(), outfile, indent=2) + + +if __name__ == '__main__': + + sample_metadata_json_location = sys.argv[1] + db_host = sys.argv[2] + db_port = sys.argv[3] + db_name = sys.argv[4] + db_user = sys.argv[5] + db_passwd = sys.argv[6] + main(sample_metadata_json_location, db_host, db_port, db_name, db_user, db_passwd) \ No newline at end of file diff --git a/internal/pipeline_modules/run_annotated_region_metrics.py b/internal/pipeline_modules/run_annotated_region_metrics.py new file mode 100644 index 0000000000..6357cb6a6b --- /dev/null +++ b/internal/pipeline_modules/run_annotated_region_metrics.py @@ -0,0 +1,50 @@ +"""Run annotated region metrics calculations""" +import logging +import os +import h5py +from allensdk.internal.core.lims_utilities import get_input_json +from allensdk.internal.brain_observatory.annotated_region_metrics import get_metrics +from allensdk.internal.core.lims_pipeline_module import (PipelineModule, + run_module) + +SDK_PATH = "/data/informatics/CAM/isi_metrics/allensdk" +SCRIPT_PATH = ("/data/informatics/CAM/isi_metrics/allensdk/allensdk/internal" + "/pipeline_modules/run_annotated_region_metrics.py") + +def debug(region_id, storage_directory="./", local=True, + sdk_path=SDK_PATH, script_path=SCRIPT_PATH, lims_host="lims2"): + strategy_class = "AnnotatedRegionMetricsStrategy" + object_class = "AnnotatedRegion" + input_json = get_input_json(region_id, object_class, strategy_class, + lims_host) + exp_dir = os.path.join(storage_directory, str(region_id)) + run_module(script_path, + input_json, + exp_dir, + sdk_path=sdk_path, + pbs=dict(vmem=4, + job_name="isi_metrics_{}".format(region_id), + walltime="1:00:00"), + local=local) + + +def load_arrays(h5_file): + with h5py.File(h5_file, "r") as f: + altitude_phase = f['retinotopy_altitude'][:] + azimuth_phase = f['retinotopy_azimuth'][:] + return altitude_phase, azimuth_phase + + +def main(): + mod = PipelineModule() + data = mod.input_data() + + h5_file = data["processed_h5"] + altitude_phase, azimuth_phase = load_arrays(h5_file) + del data["processed_h5"] + + output_data = get_metrics(altitude_phase, azimuth_phase, **data) + + mod.write_output_data(output_data) + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_demixing.py b/internal/pipeline_modules/run_demixing.py new file mode 100644 index 0000000000..f1c2b3fa16 --- /dev/null +++ b/internal/pipeline_modules/run_demixing.py @@ -0,0 +1,198 @@ +import matplotlib +matplotlib.use('agg') +import matplotlib.pyplot as plt + +import allensdk.internal.core.lims_utilities as lu +from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module + +import argparse, os, logging, shutil +import h5py +import numpy as np +import shutil + +import allensdk.brain_observatory.demixer as demixer +from allensdk.config.manifest import Manifest + +import allensdk.core.json_utilities as ju +import logging + +EXCLUDE_LABELS = ["union", "duplicate", "motion_border", + "decrosstalk_ghost", + "decrosstalk_invalid_raw", + "decrosstalk_invalid_raw_active", + "decrosstalk_invalid_unmixed", + "decrosstalk_invalid_unmixed_active" ] + +def debug(experiment_id, local=False): + OUTPUT_DIRECTORY = "/data/informatics/CAM/demix" + SDK_PATH = "/data/informatics/CAM/analysis/allensdk" + SCRIPT = "/data/informatics/CAM/analysis/allensdk/allensdk/internal/pipeline_modules/run_demixing.py" + + sd = lu.query("select storage_directory from ophys_experiments where id = %d" % experiment_id)[0]['storage_directory'] + rois = lu.query("select * from cell_rois where ophys_experiment_id = %d" % experiment_id) + + exc_labels = lu.query(""" +select cr.id, rel.name as exclusion_label from cell_rois cr +join cell_rois_roi_exclusion_labels crrel on crrel.cell_roi_id = cr.id +join roi_exclusion_labels rel on crrel.roi_exclusion_label_id = rel.id +where cr.ophys_experiment_id = %d +""" % experiment_id) + + nrois = { roi['id']: dict(width=roi['width'], + height=roi['height'], + x=roi['x'], + y=roi['y'], + id=roi['id'], + valid=roi['valid_roi'], + mask=roi['mask_matrix'], + exclusion_labels=[]) + for roi in rois } + + for exc_label in exc_labels: + nrois[exc_label['id']]['exclusion_labels'].append(exc_label['exclusion_label']) + + movie_path_response = lu.query(''' + select wkf.filename, wkf.storage_directory from well_known_files wkf + join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id + where wkf.attachable_id = {} and wkf.attachable_type = 'OphysExperiment' + and wkft.name = 'MotionCorrectedImageStack' + '''.format(experiment_id)) + movie_h5_path = os.path.join(movie_path_response[0]['storage_directory'], movie_path_response[0]['filename']) + + exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) + + input_data = { + "movie_h5": movie_h5_path, + "traces_h5": os.path.join(sd, "processed", "roi_traces.h5"), + "roi_masks": nrois.values(), + "output_file": os.path.join(exp_dir, "demixed_traces.h5") + } + + run_module(SCRIPT, + input_data, + exp_dir, + sdk_path=SDK_PATH, + pbs=dict(vmem=160, + job_name="demix_%d"% experiment_id, + walltime="36:00:00"), + local=local, + optional_args=['--log-level','DEBUG']) + +def assert_exists(file_name): + if not os.path.exists(file_name): + raise IOError("file does not exist: %s" % file_name) + + +def get_path(obj, key, check_exists): + try: + path = obj[key] + except KeyError: + raise KeyError("required input field '%s' does not exist" % key) + + if check_exists: + assert_exists(path) + + return path + + +def parse_input(data, exclude_labels): + movie_h5 = get_path(data, "movie_h5", True) + traces_h5 = get_path(data, "traces_h5", True) + output_h5 = get_path(data, "output_file", False) + + with h5py.File(movie_h5, "r") as f: + movie_shape = f["data"].shape[1:] + + with h5py.File(traces_h5, "r") as f: + traces = f["data"][()] + trace_ids = [ int(rid) for rid in f["roi_names"][()] ] + + rois = get_path(data, "roi_masks", False) + masks = None + valid = None + + for roi in rois: + mask = np.zeros(movie_shape, dtype=bool) + mask_matrix = np.array(roi["mask"], dtype=bool) + mask[roi["y"]:roi["y"]+roi["height"],roi["x"]:roi["x"]+roi["width"]] = mask_matrix + + if masks is None: + masks = np.zeros((len(rois), mask.shape[0], mask.shape[1]), dtype=bool) + valid = np.zeros(len(rois), dtype=bool) + + rid = int(roi["id"]) + try: + ridx = trace_ids.index(rid) + except ValueError as e: + raise ValueError("Could not find cell roi id %d in roi traces file" % rid) + + masks[ridx,:,:] = mask + + valid[ridx] = len(set(exclude_labels) & set(roi.get("exclusion_labels",[]))) == 0 + + return traces, masks, valid, np.array(trace_ids), movie_h5, output_h5 + +def main(): + mod = PipelineModule() + mod.parser.add_argument("--exclude-labels", nargs="*", default=EXCLUDE_LABELS) + + data = mod.input_data() + logging.debug("reading input") + + traces, masks, valid, trace_ids, movie_h5, output_h5 = parse_input(data, mod.args.exclude_labels) + + logging.debug("excluded masks: %s", str(zip(np.where(~valid)[0], trace_ids[~valid]))) + output_dir = os.path.dirname(output_h5) + plot_dir = os.path.join(output_dir, "demix_plots") + if os.path.exists(plot_dir): + shutil.rmtree(plot_dir) + Manifest.safe_mkdir(plot_dir) + + logging.debug("reading movie") + with h5py.File(movie_h5, 'r') as f: + movie = f['data'][()] + + # only demix non-union, non-duplicate ROIs + valid_idxs = np.where(valid) + demix_traces = traces[valid_idxs] + demix_masks = masks[valid_idxs] + + logging.debug("demixing") + demixed_traces, drop_frames = demixer.demix_time_dep_masks(demix_traces, movie, demix_masks) + + nt_inds = demixer.plot_negative_transients(demix_traces, + demixed_traces, + valid[valid_idxs], + demix_masks, + trace_ids[valid_idxs], + plot_dir) + + logging.debug("rois with negative transients: %s", str(trace_ids[valid_idxs][nt_inds])) + + nb_inds = demixer.plot_negative_baselines(demix_traces, + demixed_traces, + demix_masks, + trace_ids[valid_idxs], + plot_dir) + + # negative baseline rois (and those that overlap with them) become nans + logging.debug("rois with negative baselines (or overlap with them): %s", str(trace_ids[valid_idxs][nb_inds])) + demixed_traces[nb_inds, :] = np.nan + + logging.info("Saving output") + out_traces = np.zeros(traces.shape, dtype=demix_traces.dtype) + out_traces[:] = np.nan + out_traces[valid_idxs] = demixed_traces + + with h5py.File(output_h5, 'w') as f: + f.create_dataset("data", data=out_traces, compression="gzip") + roi_names = np.array([str(rn) for rn in trace_ids]).astype(np.string_) + f.create_dataset("roi_names", data=roi_names) + + mod.write_output_data(dict( + negative_transient_roi_ids=trace_ids[valid_idxs][nt_inds], + negative_baseline_roi_ids=trace_ids[valid_idxs][nb_inds] + )) + + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_dff_computation.py b/internal/pipeline_modules/run_dff_computation.py new file mode 100644 index 0000000000..1bf1373a03 --- /dev/null +++ b/internal/pipeline_modules/run_dff_computation.py @@ -0,0 +1,59 @@ +import os +import argparse +import h5py +import logging +from allensdk.brain_observatory.dff import calculate_dff +import allensdk.core.json_utilities as ju + + +def parse_input(data): + input_file = data.get("input_file", None) + + if input_file is None: + raise IOError("input JSON missing required field 'input_file'") + if not os.path.exists(input_file): + raise IOError("input file does not exists: %s" % input_file) + + output_file = data.get("output_file", None) + + if output_file is None: + raise IOError("input JSON missing required field 'output_file'") + + return input_file, output_file + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input_json") + parser.add_argument("output_json") + parser.add_argument("--log_level", default=logging.DEBUG) + parser.add_argument("--input_dataset", default="FC") + parser.add_argument("--roi_field", default="roi_names") + parser.add_argument("--output_dataset", default="data") + args = parser.parse_args() + + logging.getLogger().setLevel(args.log_level) + + input_data = ju.read(args.input_json) + input_file, output_file = parse_input(input_data) + + # read from "data" + input_h5 = h5py.File(input_file, "r") + traces = input_h5[args.input_dataset].value + roi_names = input_h5[args.roi_field][:] + input_h5.close() + + dff = calculate_dff(traces) + + # write to "data" + output_h5 = h5py.File(output_file, "w") + output_h5[args.output_dataset] = dff + output_h5[args.roi_field] = roi_names + output_h5.close() + + output_data = {} + + ju.write(args.output_json, output_data) + + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_eye_tracking.py b/internal/pipeline_modules/run_eye_tracking.py new file mode 100644 index 0000000000..5897df093f --- /dev/null +++ b/internal/pipeline_modules/run_eye_tracking.py @@ -0,0 +1,73 @@ +import matplotlib +matplotlib.use('agg') + +import logging +import numpy as np +import os, sys + +from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module +from allensdk.internal.brain_observatory.run_itracker import (run_itracker, + compute_bounding_box, + DEFAULT_THRESHOLD_FACTOR, + get_experiment_info) + +def debug(experiment_id, num_frames=None, threshold_factor=None, local=False): + OUTPUT_DIR = "/data/informatics/CAM/eye_tracking/" + SDK_PATH = "/data/informatics/CAM/eye_tracking/allensdk" + SCRIPT_PATH = "/data/informatics/CAM/eye_tracking/allensdk/allensdk/internal/pipeline_modules/run_eye_tracking.py" + + experiment_dir = os.path.join(OUTPUT_DIR, str(experiment_id)) + + info = get_experiment_info(experiment_id) + info['output_directory'] = experiment_dir + + optional_args = [ ] + if num_frames is not None: + optional_args += ['--num_frames',str(num_frames)] + + run_module(SCRIPT_PATH, + info, + experiment_dir, + sdk_path=SDK_PATH, + pbs=dict(vmem=160, + job_name="itrack_%d"% experiment_id, + walltime="10:00:00"), + local=local, + optional_args=optional_args) + +def main(): + mod = PipelineModule() + mod.parser.add_argument("--num_frames", type=int, default=None) + mod.parser.add_argument("--threshold_factor", type=float, default=DEFAULT_THRESHOLD_FACTOR) + + data = mod.input_data() + args = dict( + movie_file=data['movie_file'], + metadata_file=data['metadata_file'], + output_directory=data['output_directory'], + threshold_factor=data.get('threshold_factor', mod.args.threshold_factor), + num_frames=mod.args.num_frames, + auto=True, + cache_input_frames=True, + input_block_size=None, + output_annotated_movie_block_size=None + ) + + if data.get('pupil_points', None): + args['bbox_pupil'] = compute_bounding_box(data['pupil_points']) + if data.get('corneal_reflection_points', None): + args['bbox_cr'] = compute_bounding_box(data['corneal_reflection_points']) + + tracker = run_itracker(**args) + + logging.debug("finished running itracker") + + output_data = dict( + pupil_file=tracker.pupil_file, + corneal_reflection_file=tracker.cr_file, + mean_frame_file=tracker.mean_frame_file + ) + + mod.write_output_data(output_data) + +if __name__=='__main__': main() diff --git a/internal/pipeline_modules/run_neuropil_correction.py b/internal/pipeline_modules/run_neuropil_correction.py new file mode 100644 index 0000000000..008cfd3775 --- /dev/null +++ b/internal/pipeline_modules/run_neuropil_correction.py @@ -0,0 +1,250 @@ +#!/usr/bin/python +import matplotlib +matplotlib.use('agg') +import matplotlib.pyplot as plt +import logging +import numpy as np +from allensdk.brain_observatory.r_neuropil import estimate_contamination_ratios +import allensdk.internal.core.lims_utilities as lu +import h5py +import json +import copy +import os +import sys +import argparse +import shutil + +from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module + +def debug(experiment_id, local=False): + OUTPUT_DIRECTORY = "/data/informatics/CAM/neuropil" + SDK_PATH = "/data/informatics/CAM/neuropil/allensdk" + SCRIPT = "/data/informatics/CAM/neuropil/allensdk/allensdk/internal/pipeline_modules/run_neuropil_correction.py" + + exp = lu.query("select * from ophys_experiments where id = %d" % experiment_id)[0] + sd = exp["storage_directory"] + + test_file = "/data/informatics/CAM/demix/%d/demixed_traces.h5" % experiment_id + if os.path.exists(test_file): + roi_trace_file = test_file + else: + roi_trace_file = os.path.join(sd, "demix", "%d_demixed_traces.h5" % experiment_id) + + exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) + input_data = dict( + roi_trace_file = roi_trace_file, + neuropil_trace_file = os.path.join(sd, "processed", "neuropil_traces.h5"), + storage_directory = exp_dir + ) + + run_module(SCRIPT, + input_data, + exp_dir, + sdk_path=SDK_PATH, + pbs=dict(vmem=160, + job_name="np_%d"% experiment_id, + walltime="36:00:00"), + local=local, + optional_args=['--log-level','DEBUG']) + + +def debug_plot(file_name, roi_trace, neuropil_trace, corrected_trace, r, r_vals=None, err_vals=None): + fig = plt.figure(figsize=(15,10)) + + ax = fig.add_subplot(211) + ax.plot(roi_trace,'r', label="raw") + ax.plot(corrected_trace,'b', label="fc") + ax.plot(neuropil_trace,'g', label="neuropil") + ax.set_xlim(0,roi_trace.size) + ax.set_title('raw(%.02f, %.02f) fc(%.02f, %.02f) r(%f)' % (roi_trace.min(), roi_trace.max(), corrected_trace.min(), corrected_trace.max(), r)) + ax.legend() + + if r_vals is not None: + ax = fig.add_subplot(212) + ax.plot(r_vals, err_vals, "o") + + plt.savefig(file_name) + plt.close() + +def adjust_r_for_negativity(r, F_C, F_M, F_N): + # this function is no longer used, but leaving it here just in case + # loop through all of the negative spots and pick r to fix them + neg_is = np.argwhere(F_C < 0) + if neg_is.size > 0: + logging.debug("Correcting for negative trace, starting with r = %f", r) + + for i in neg_is: + if F_C[i] >= 0: + continue + # r_new = (F_C[i] + r_old * F_N[i]) / F_N[i] + r = F_M[i] / F_N[i] + F_C = F_M - r * F_N + logging.debug(" updated r to %f", r) + + + # if there is still a negative spot, it's off by some tiny epsilon. + # step r down by delta_r increments until we find one that works. + delta_r = -1e-5 + while F_C.min() < 0 and r >= 0.0: + r += delta_r + F_C = F_M - r * F_N + logging.debug(" stepped r to %f", r) + + logging.debug(" finished with r = %f", r) + + return r + + +def main(): + module = PipelineModule() + args = module.args + + jin = module.input_data() + + ######################################################################## + # prelude -- get processing metadata + + trace_file = jin["roi_trace_file"] + neuropil_file = jin["neuropil_trace_file"] + storage_dir = jin["storage_directory"] + + plot_dir = os.path.join(storage_dir, "neuropil_subtraction_plots") + if os.path.exists(plot_dir): + shutil.rmtree(plot_dir) + + try: + os.makedirs(plot_dir) + except: + pass + + logging.info("Neuropil correcting '%s'", trace_file) + + ######################################################################## + # process data + + try: + roi_traces = h5py.File(trace_file, "r") + except: + logging.error("Error: unable to open ROI trace file '%s'", trace_file) + raise + + try: + neuropil_traces = h5py.File(neuropil_file, "r") + except: + logging.error("Error: unable to open neuropil trace file '%s'", neuropil_file) + raise + + ''' + get number of traces, length, etc. + ''' + num_traces, T = roi_traces['data'].shape + T_orig = T + T_cross_val = int(T/2) + if (T - T_cross_val > T_cross_val): + T = T - 1 + + # make sure that ROI and neuropil trace files are organized the same + n_id = neuropil_traces["roi_names"][:].astype(str) + r_id = roi_traces["roi_names"][:].astype(str) + logging.info("Processing %d traces", len(n_id)) + assert len(n_id) == len(r_id), "Input trace files are not aligned (ROI count)" + for i in range(len(n_id)): + assert n_id[i] == r_id[i], "Input trace files are not aligned (ROI IDs)" + ''' + initialize storage variables and analysis routine + ''' + r_list = [ None ] * num_traces + RMSE_list = [ -1 ] * num_traces + roi_names = n_id + corrected = np.zeros((num_traces, T_orig)) + r_vals = [ None ] * num_traces + + for n in range(num_traces): + roi = roi_traces['data'][n] + neuropil = neuropil_traces['data'][n] + + if np.any(np.isnan(neuropil)): + logging.warning("neuropil trace for roi %d contains NaNs, skipping", n) + continue + + if np.any(np.isnan(roi)): + logging.warning("roi trace for roi %d contains NaNs, skipping", n) + continue + + r = None + + logging.info("Correcting trace %d (roi %s)", n, str(n_id[n])) + results = estimate_contamination_ratios(roi, neuropil) + logging.info("r=%f err=%f it=%d", results["r"], results["err"], results["it"]) + + r = results["r"] + fc = roi - r * neuropil + RMSE_list[n] = results["err"] + r_vals[n] = results["r_vals"] + + debug_plot(os.path.join(plot_dir, "initial_%04d.png" % n), + roi, neuropil, fc, r, results["r_vals"], results["err_vals"]) + + # mean of the corrected trace must be positive + if fc.mean() > 0: + r_list[n] = r + corrected[n,:] = fc + else: + logging.warning("fc has negative baseline, skipping this r value") + + # compute mean valid r value + r_mean = np.array([r for r in r_list if r is not None ]).mean() + + # fill in empty r values + for n in range(num_traces): + roi = roi_traces['data'][n] + neuropil = neuropil_traces['data'][n] + + if r_list[n] is None: + logging.warning("Error estimated r for trace %d. Setting to zero.", n) + r_list[n] = 0 + corrected[n,:] = roi + + # save a debug plot + debug_plot(os.path.join(plot_dir, "final_%04d.png" % n), + roi, neuropil, corrected[n,:], r_list[n]) + + # one last sanity check + eps = -0.0001 + if np.mean(corrected[n,:]) < eps: + raise Exception("Trace %d baseline is still negative value after correction" % n) + + if r_list[n] < 0.0: + raise Exception("Trace %d ended with negative r" % n) + + + ######################################################################## + # write out processed data + + try: + savefile = os.path.join(storage_dir, "neuropil_correction.h5") + hf = h5py.File(savefile, 'w') + hf.create_dataset("r", data=r_list) + hf.create_dataset("RMSE", data=RMSE_list) + hf.create_dataset("FC", data=corrected, compression="gzip") + hf.create_dataset("roi_names", data=roi_names.astype(np.string_)) + + for n in range(num_traces): + r = r_vals[n] + if r is not None: + hf.create_dataset("r_vals/%d" % n, data=r) + hf.close() + except: + logging.error("Error creating output h5 file") + raise + + roi_traces.close() + neuropil_traces.close() + + jout = copy.copy(jin) + jout["neuropil_correction"] = savefile + module.write_output_data(jout) + + logging.info("finished") + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_observatory_analysis.py b/internal/pipeline_modules/run_observatory_analysis.py new file mode 100644 index 0000000000..c4bc75311e --- /dev/null +++ b/internal/pipeline_modules/run_observatory_analysis.py @@ -0,0 +1,124 @@ +#!/usr/bin/python +# Copyright 2016 Allen Institute for Brain Science +# This file is part of Allen SDK. +# +# Allen SDK is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# Allen SDK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. + +import json, sys, traceback, logging +from allensdk.brain_observatory.session_analysis import run_session_analysis +import allensdk.brain_observatory.stimulus_info as si +import allensdk.core.json_utilities as json_util +from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module, SHARED_PYTHON +import allensdk.internal.core.lims_utilities as lu +from six import iteritems +import os +import logging + +def get_experiment_nwb_file(experiment_id): + res = lu.query(""" +select * from well_known_files wkf +join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id +where attachable_id = %d +and wkft.name = 'NWBOphys' +""" % experiment_id) + return os.path.join(res[0]['storage_directory'], res[0]['filename']) + +def get_experiment_session(experiment_id): + return lu.query(""" +select stimulus_name from ophys_sessions os +join ophys_experiments oe on oe.ophys_session_id = os.id +where oe.id = %d +""" % experiment_id)[0]['stimulus_name'] + +def debug(experiment_ids, local=False, + OUTPUT_DIR = "/data/informatics/CAM/analysis/", + SDK_PATH = "/data/informatics/CAM/analysis/allensdk/", + walltime="10:00:00", + python=SHARED_PYTHON, + queue='braintv'): + + input_data = {} + for eid in experiment_ids: + exp_dir = os.path.join(OUTPUT_DIR, str(eid)) + input_data[eid] = dict(nwb_file=get_experiment_nwb_file(eid), + output_file=os.path.join(exp_dir, "%d_analysis.h5" % eid), + session_name=get_experiment_session(eid)) + + run_module(os.path.abspath(__file__), + input_data, + exp_dir, + python=python, + sdk_path=SDK_PATH, + pbs=dict(vmem=32, + job_name="bobanalysis_%d"% eid, + walltime=walltime, + queue=queue), + local=local) + +def main(): + mod = PipelineModule() + jin = mod.input_data() + + results = {} + + for ident, experiment in iteritems(jin): + nwb_file = experiment['nwb_file'] + output_file = experiment['output_file'] + + if experiment["session_name"] not in si.SESSION_STIMULUS_MAP.keys(): + raise Exception("Could not run analysis for unknown session: %s" % experiment["session_name"]) + + logging.info("Running %s analysis", experiment["session_name"]) + logging.info("NWB file %s", nwb_file) + logging.info("Output file %s", output_file) + + results[ident] = run_session_analysis(nwb_file, output_file, + save_flag=True, plot_flag=False) + + logging.info("Generating output") + + jout = {} + for session_name, data in results.items(): + # results for this session + res = {} + # metric fields + names = {} + roi_id = None + for metric, values in data['cell'].items(): + if metric == "roi_id": + roi_id = values + else: + # convert dict to array + vals = [] + for i in range(len(values)): + vals.append(values[i]) # panda syntax + names[metric] = vals + # make an output record for each roi_id + if roi_id is not None: + for i in range(len(roi_id)): + name = roi_id[i] + roi = {} + for field, values in names.items(): + roi[field] = values[i] + res[name] = roi + + jout[session_name] = { + 'cell': res, + 'experiment': data['experiment'] + } + + logging.info("Saving output") + + mod.write_output_data(jout) + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_observatory_container_thumbnails.py b/internal/pipeline_modules/run_observatory_container_thumbnails.py new file mode 100644 index 0000000000..9de7891efa --- /dev/null +++ b/internal/pipeline_modules/run_observatory_container_thumbnails.py @@ -0,0 +1,67 @@ +import json, os +import sys +import subprocess + +import run_observatory_thumbnails as robsth +import allensdk.internal.core.lims_utilities as lu +from allensdk.internal.core.lims_pipeline_module import run_module, PipelineModule +import allensdk.core.json_utilities as ju +from allensdk.config.manifest import Manifest + +def get_container_info(container_id): + res = lu.query(""" +select * from ophys_experiments oe +where experiment_container_id = %d +and oe.workflow_state != 'failed' +""" % container_id) + return res + +def debug(container_id, local=False, plots=None): + SCRIPT = "/data/informatics/CAM/analysis/allensdk/allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py" + SDK_PATH = "/data/informatics/CAM/analysis/allensdk/" + OUTPUT_DIR = "/data/informatics/CAM/analysis/containers" + + container_dir = os.path.join(OUTPUT_DIR, str(container_id)) + + input_data = [] + for exp in get_container_info(container_id): + exp_data = robsth.get_input_data(exp['id']) + exp_input_json = os.path.join(exp_data["output_directory"], "input.json") + input_data.append(dict( + input_json=exp_input_json, + output_json=os.path.join(exp_data["output_directory"], "output.json") + )) + + Manifest.safe_make_parent_dirs(exp_input_json) + ju.write(exp_input_json, exp_data) + + run_module(SCRIPT, + input_data, + container_dir, + sdk_path=SDK_PATH, + pbs=dict(vmem=32, + job_name="cthumbs_%d"% container_id, + walltime="10:00:00"), + local=local, + optional_args=['--types='+','.join(plots)] if plots else None) + +def main(): + mod = PipelineModule() + mod.parser.add_argument("--types", default=','.join(robsth.PLOT_TYPES)) + mod.parser.add_argument("--threads", default=4) + + data = mod.input_data() + types = mod.args.types.split(',') + + for input_file in data: + exp_input_json = input_file['input_json'] + exp_output_json = input_file['output_json'] + + exp_input_data = ju.read(exp_input_json) + + nwb_file, analysis_file, output_directory = robsth.parse_input(exp_input_data) + + robsth.build_experiment_thumbnails(nwb_file, analysis_file, output_directory, + types, mod.args.threads) + +if __name__=='__main__': main() diff --git a/internal/pipeline_modules/run_observatory_thumbnails.py b/internal/pipeline_modules/run_observatory_thumbnails.py new file mode 100644 index 0000000000..8d77924f08 --- /dev/null +++ b/internal/pipeline_modules/run_observatory_thumbnails.py @@ -0,0 +1,547 @@ +import matplotlib +matplotlib.use('agg') + +import os, shutil +import allensdk.core.json_utilities as ju +import shutil +import numpy as np +import argparse +import scipy.misc +from scipy.stats import gaussian_kde + +import multiprocessing +import functools +import traceback +import logging + +from allensdk.brain_observatory.drifting_gratings import DriftingGratings +from allensdk.brain_observatory.static_gratings import StaticGratings +from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise +from allensdk.brain_observatory.natural_scenes import NaturalScenes +from allensdk.brain_observatory.natural_movie import NaturalMovie +from allensdk.brain_observatory import observatory_plots as oplots +from allensdk.core.brain_observatory_nwb_data_set import (BrainObservatoryNwbDataSet, + MissingStimulusException, + NoEyeTrackingException) +from allensdk.config.manifest import Manifest +from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module +import allensdk.internal.core.lims_utilities as lu +import allensdk.brain_observatory.stimulus_info as si +from contextlib import contextmanager + +LARGE_HEIGHT = 500 +SMALL_HEIGHT = 150 +SMALL_FONT = 4 +LARGE_FONT = 12 +PLOT_CONFIGS = { 'small': dict(height_px=SMALL_HEIGHT, pattern="%s_small.png", font_size=SMALL_FONT), + 'large': dict(height_px=LARGE_HEIGHT, pattern="%s_large.png", font_size=LARGE_FONT), + 'svg': dict(height_px=LARGE_HEIGHT, pattern="%s.svg", font_size=SMALL_FONT) } +PLOT_TYPES = ["dg", "sg", "ns", "lsn_on", + "lsn_off", "rf", + "nm1", "nm2", "nm3", "sp", + "corr", "eye"] + +def get_experiment_analysis_file(experiment_id): + res = lu.query(""" +select * from well_known_files wkf +join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id +where attachable_id = %d +and wkft.name = 'OphysExperimentCellRoiMetricsFile' +""" % experiment_id) + return os.path.join(res[0]['storage_directory'], res[0]['filename']) + +def get_experiment_nwb_file(experiment_id): + res = lu.query(""" +select * from well_known_files wkf +join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id +where attachable_id = %d +and wkft.name = 'NWBOphys' +""" % experiment_id) + return os.path.join(res[0]['storage_directory'], res[0]['filename']) + +def get_experiment_files(experiment_id): + nwb_file = get_experiment_nwb_file(experiment_id) + try: + analysis_file = get_experiment_analysis_file(experiment_id) + except: + analysis_file = None + + if not os.path.exists(nwb_file): + raise Exception("nwb file does not exist: %s" % nwb_file) + + #if not os.path.exists(analysis_file): + # raise Exception("analysis file does not exist: %s" % analysis_file) + + return nwb_file, analysis_file + +def get_input_data(experiment_id): + OUTPUT_DIR = "/data/informatics/CAM/analysis/" + + nwb_file, analysis_file = get_experiment_files(experiment_id) + output_directory = os.path.join(OUTPUT_DIR, str(experiment_id), "thumbnails") + + my_file = "/data/informatics/CAM/analysis/%d/%d_analysis.h5" % (experiment_id, experiment_id) + + if os.path.exists(my_file): + analysis_file = my_file + + input_data = { + 'nwb_file': nwb_file, + #'analysis_file': analysis_file, + 'analysis_file': analysis_file, + 'output_directory': output_directory + } + + return input_data + +def debug(experiment_id, plots=None, local=False): + SDK_PATH = "/data/informatics/CAM/analysis/allensdk/" + + input_data = get_input_data(experiment_id) + + run_module(os.path.abspath(__file__), + input_data, + input_data["output_directory"], + sdk_path=SDK_PATH, + pbs=dict(vmem=32, + job_name="bobthumbs_%d"% experiment_id, + walltime="10:00:00"), + local=local, + optional_args=['--types='+','.join(plots)] if plots else None) + +def build_plots(prefix, aspect, configs, output_dir, axes=None, transparent=False): + Manifest.safe_mkdir(output_dir) + + for config in configs: + h = config['height_px'] + w = int(h * aspect) + + file_name = os.path.join(output_dir, config["pattern"] % prefix) + + logging.debug("file: %s", file_name) + with oplots.figure_in_px(w, h, file_name, transparent=transparent) as fig: + matplotlib.rcParams.update({'font.size': config['font_size']}) + yield file_name + +def build_cell_plots(cell_specimen_ids, prefix, aspect, configs, output_dir, axes=None, transparent=False): + for i,csid in enumerate(cell_specimen_ids): + if np.isnan(csid): + cell_dir = os.path.join(output_dir, str(i)) + else: + cell_dir = os.path.join(output_dir, str(csid)) + + for fn in build_plots(prefix, aspect, configs, cell_dir, transparent=transparent): + yield fn, csid, i + +def build_drifting_gratings(dga, configs, output_dir): + for fn in build_plots("drifting_gratings_axes_pref_dir", 1.0, [configs['large'], configs['svg']], output_dir): + dga.plot_preferred_direction(include_labels=True) + oplots.finalize_no_axes() + + for fn in build_plots("drifting_gratings_pref_dir", 1.0, [configs['small']], output_dir): + dga.plot_preferred_direction(include_labels=False) + oplots.finalize_no_axes() + + for fn in build_plots("drifting_gratings_axes_pref_tf", 1.0, [configs['large'], configs['svg']], output_dir): + dga.plot_preferred_temporal_frequency() + oplots.finalize_with_axes() + + for fn in build_plots("drifting_gratings_pref_tf", 1.0, [configs['small']], output_dir): + dga.plot_preferred_temporal_frequency() + oplots.finalize_no_labels() + + for fn in build_plots("drifting_gratings_axes_dsi", 1.0, [configs['large'], configs['svg']], output_dir): + dga.plot_direction_selectivity() + oplots.finalize_with_axes() + + for fn in build_plots("drifting_gratings_dsi", 1.0, [configs['small']], output_dir): + dga.plot_direction_selectivity() + oplots.finalize_no_labels() + + for fn in build_plots("drifting_gratings_axes_osi", 1.0, [configs['large'], configs['svg']], output_dir): + dga.plot_orientation_selectivity() + oplots.finalize_with_axes() + + for fn in build_plots("drifting_gratings_osi", 1.0, [configs['small']], output_dir): + dga.plot_orientation_selectivity() + oplots.finalize_no_labels() + + csids = dga.data_set.get_cell_specimen_ids() + for fn, csid, i in build_cell_plots(csids, "drifting_gratings", 1.0, configs.values(), output_dir): + dga.open_star_plot(csid, include_labels=False, cell_index=i) + oplots.finalize_no_axes() + +def build_static_gratings(sga, configs, output_dir): + for fn in build_plots("static_gratings_axes_time_to_peak", 1.0, [configs['large'], configs['svg']], output_dir): + sga.plot_time_to_peak() + oplots.finalize_with_axes() + + for fn in build_plots("static_gratings_time_to_peak", 1.0, [configs['small']], output_dir): + sga.plot_time_to_peak() + oplots.finalize_no_labels() + + for fn in build_plots("static_gratings_axes_pref_ori", 1.5, [configs['large'], configs['svg']], output_dir): + sga.plot_preferred_orientation(include_labels=True) + oplots.finalize_no_axes() + + for fn in build_plots("static_gratings_pref_ori", 1.5, [configs['small']], output_dir): + sga.plot_preferred_orientation(include_labels=False) + oplots.finalize_no_axes() + + for fn in build_plots("static_gratings_axes_osi", 1.0, [configs['large'], configs['svg']], output_dir): + sga.plot_orientation_selectivity() + oplots.finalize_with_axes() + + for fn in build_plots("static_gratings_osi", 1.0, [configs['small']], output_dir): + sga.plot_orientation_selectivity() + oplots.finalize_no_labels() + + for fn in build_plots("static_gratings_axes_pref_sf", 1.0, [configs['large'], configs['svg']], output_dir): + sga.plot_preferred_spatial_frequency() + oplots.finalize_with_axes() + + for fn in build_plots("static_gratings_pref_sf", 1.0, [configs['small']], output_dir): + sga.plot_preferred_spatial_frequency() + oplots.finalize_no_labels() + + csids = sga.data_set.get_cell_specimen_ids() + for file_name, csid, i in build_cell_plots(csids, "static_gratings_all", 2.0, configs.values(), output_dir): + sga.open_fan_plot(csid, include_labels=False, cell_index=i) + oplots.finalize_no_axes() + +def build_natural_movie(nma, configs, output_dir, name): + csids = nma.data_set.get_cell_specimen_ids() + for file_name, csid, i in build_cell_plots(csids, name, 1.0, configs.values(), output_dir): + nma.open_track_plot(csid, cell_index=i) + oplots.finalize_no_axes() + +def build_natural_scenes(nsa, configs, output_dir): + for fn in build_plots("natural_scenes_axes_time_to_peak", 1.0, [configs['large'], configs['svg']], output_dir): + nsa.plot_time_to_peak() + oplots.finalize_with_axes() + + for fn in build_plots("natural_scenes_time_to_peak", 1.0, [configs['small']], output_dir): + nsa.plot_time_to_peak() + oplots.finalize_no_labels() + + csids = nsa.data_set.get_cell_specimen_ids() + for file_name, csid, i in build_cell_plots(csids, "natural_scenes", 1.0, configs.values(), output_dir): + nsa.open_corona_plot(csid, cell_index=i) + oplots.finalize_no_axes() + +def build_locally_sparse_noise(lsna, configs, output_dir, on): + prefix = "locally_sparse_noise_" + ("on" if on else "off") + + csids = lsna.data_set.get_cell_specimen_ids() + for file_name, csid, i in build_cell_plots(csids, prefix, 1.754, [configs['large'], configs['small']], output_dir): + lsna.open_pincushion_plot(on, cell_specimen_id=csid, cell_index=i) + oplots.finalize_no_axes() + +def build_receptive_field(lsna, configs, output_dir): + lsn_movie, lsn_mask = lsna.data_set.get_locally_sparse_noise_stimulus_template(lsna.stimulus, + mask_off_screen=False) + + if lsna.cell_index_receptive_field_analysis_data is None: + logging.warning("receptive field analysis not performed, so no receptive field plots will be made") + return + + clim = np.nanpercentile(lsna.receptive_field, [1.0,99.0], axis=None) + + for fn in build_plots("population_receptive_field", 1.754, [configs["large"]], output_dir, transparent=True): + lsna.plot_population_receptive_field(mask=lsn_mask, scalebar=True) + oplots.finalize_no_axes() + + for fn in build_plots("population_receptive_field", 1.754, [configs["small"]], output_dir, transparent=True): + lsna.plot_population_receptive_field(mask=lsn_mask, scalebar=False) + oplots.finalize_no_axes() + + csids = lsna.data_set.get_cell_specimen_ids() + for file_name, csid, i in build_cell_plots(csids, "receptive_field_on", 1.754, [configs["large"]], output_dir, transparent=True): + lsna.plot_cell_receptive_field(True, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=True) + oplots.finalize_no_axes() + + for file_name, csid, i in build_cell_plots(csids, "receptive_field_on", 1.754, [configs["small"]], output_dir, transparent=True): + lsna.plot_cell_receptive_field(True, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=False) + oplots.finalize_no_axes() + + for file_name, csid, i in build_cell_plots(csids, "receptive_field_off", 1.754, [configs["large"]], output_dir, transparent=True): + lsna.plot_cell_receptive_field(False, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=True) + oplots.finalize_no_axes() + + for file_name, csid, i in build_cell_plots(csids, "receptive_field_off", 1.754, [configs["small"]], output_dir, transparent=True): + lsna.plot_cell_receptive_field(False, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=False) + oplots.finalize_no_axes() + + +def build_speed_tuning(analysis, configs, output_dir): + csids = analysis.data_set.get_cell_specimen_ids() + + for fn in build_plots("running_speed", 1.0, [configs['large'], configs['svg']], output_dir): + analysis.plot_running_speed_histogram() + oplots.finalize_with_axes() + + for fn in build_plots("running_speed", 1.0, [configs['small']], output_dir): + analysis.plot_running_speed_histogram() + oplots.finalize_no_labels() + + for fn, csid, i in build_cell_plots(csids, "speed_tuning", 1.0, [configs['large'], configs['svg']], output_dir): + analysis.plot_speed_tuning(csid, cell_index=i) + oplots.finalize_with_axes() + + for fn, csid, i in build_cell_plots(csids, "speed_tuning", 1.0, [configs['small']], output_dir): + analysis.plot_speed_tuning(csid, cell_index=i) + oplots.finalize_no_axes() + +def build_correlation_plots(data_set, analysis_file, configs, output_dir): + sig_corrs = [] + noise_corrs = [] + + avail_stims = si.stimuli_in_session(data_set.get_session_type()) + ans = [] + labels = [] + colors = [] + if si.DRIFTING_GRATINGS in avail_stims: + dg = DriftingGratings.from_analysis_file(data_set, analysis_file) + + if hasattr(dg, 'representational_similarity'): + ans.append(dg) + labels.append(si.DRIFTING_GRATINGS_SHORT) + colors.append(si.DRIFTING_GRATINGS_COLOR) + setups = [ ( [configs['large']], True ), ( [configs['small']], False )] + for cfgs, show_labels in setups: + for fn in build_plots("drifting_gratings_representational_similarity", 1.0, cfgs, output_dir): + oplots.plot_representational_similarity(dg.representational_similarity, + dims=[dg.orivals, dg.tfvals[1:]], + dim_labels=["dir", "tf"], + dim_order=[1,0], + colors=['r','b'], + labels=show_labels) + + if si.STATIC_GRATINGS in avail_stims: + sg = StaticGratings.from_analysis_file(data_set, analysis_file) + if hasattr(sg, 'representational_similarity'): + ans.append(sg) + labels.append(si.STATIC_GRATINGS_SHORT) + colors.append(si.STATIC_GRATINGS_COLOR) + setups = [ ( [configs['large']], True ), ( [configs['small']], False )] + for cfgs, show_labels in setups: + for fn in build_plots("static_gratings_representational_similarity", 1.0, cfgs, output_dir): + oplots.plot_representational_similarity(sg.representational_similarity, + dims=[sg.orivals, sg.sfvals[1:], sg.phasevals], + dim_labels=["ori", "sf", "ph"], + dim_order=[1,0,2], + colors=['r','g','b'], + labels=show_labels) + + if si.NATURAL_SCENES in avail_stims: + ns = NaturalScenes.from_analysis_file(data_set, analysis_file) + if hasattr(ns, 'representational_similarity'): + ans.append(ns) + labels.append(si.NATURAL_SCENES_SHORT) + colors.append(si.NATURAL_SCENES_COLOR) + setups = [ ( [configs['large']], True ), ( [configs['small']], False )] + for cfgs, show_labels in setups: + for fn in build_plots("natural_scenes_representational_similarity", 1.0, cfgs, output_dir): + oplots.plot_representational_similarity(ns.representational_similarity, labels=show_labels) + + if len(ans): + for an in ans: + sig_corrs.append(an.signal_correlation) + extra_dims = range(2,len(an.noise_correlation.shape)) + noise_corrs.append(an.noise_correlation.mean(axis=tuple(extra_dims))) + + for fn in build_plots("correlation", 1.0, [configs['large'], configs['svg']], output_dir): + oplots.population_correlation_scatter(sig_corrs, noise_corrs, labels, colors, scale=16.0) + oplots.finalize_with_axes() + + for fn in build_plots("correlation", 1.0, [configs['small']], output_dir): + oplots.population_correlation_scatter(sig_corrs, noise_corrs, labels, colors, scale=4.0) + oplots.finalize_no_labels() + + csids = ans[0].data_set.get_cell_specimen_ids() + for fn, csid, i in build_cell_plots(csids, "signal_correlation", 1.0, [configs['large']], output_dir): + row = ans[0].row_from_cell_id(csid, i) + oplots.plot_cell_correlation([ np.delete(sig_corr[row],i) for sig_corr in sig_corrs ], + labels, colors) + oplots.finalize_with_axes() + + for fn, csid, i in build_cell_plots(csids, "signal_correlation", 1.0, [configs['small']], output_dir): + row = ans[0].row_from_cell_id(csid, i) + oplots.plot_cell_correlation([ np.delete(sig_corr[row],i) for sig_corr in sig_corrs ], + labels, colors) + oplots.finalize_no_labels() + + +def lsna_check_hvas(data_set, data_file): + avail_stims = si.stimuli_in_session(data_set.get_session_type()) + targeted_structure = data_set.get_metadata()['targeted_structure'] + + stim = None + + if targeted_structure == "VISp": + if si.LOCALLY_SPARSE_NOISE_4DEG in avail_stims: + stim = si.LOCALLY_SPARSE_NOISE_4DEG + elif si.LOCALLY_SPARSE_NOISE in avail_stims: + stim = si.LOCALLY_SPARSE_NOISE + else: + if si.LOCALLY_SPARSE_NOISE_8DEG in avail_stims: + stim = si.LOCALLY_SPARSE_NOISE_8DEG + elif si.LOCALLY_SPARSE_NOISE in avail_stims: + stim = si.LOCALLY_SPARSE_NOISE + + if stim is None: + raise MissingStimulusException("Could not find appropriate LSN stimulus for session %s", + data_set.get_session_type()) + else: + logging.debug("in structure %s, using %s stimulus for plots", targeted_structure, stim) + + + return LocallySparseNoise.from_analysis_file(data_set, data_file, stim) + + +def build_eye_tracking_plots(data_set, configs, output_dir): + try: + pupil_times, xy_deg = data_set.get_pupil_location() + xy_deg = xy_deg[np.isfinite(xy_deg).any(axis=1)] + if len(xy_deg) == 0: + logging.debug("Eye tracking had no finite data, should have been " + "failed") + return + elif len(xy_deg) < 3: + c = np.ones(len(xy_deg)) # not enough points for KDE, should probably be failed + else: + c = gaussian_kde(xy_deg.T)(xy_deg.T) + + for fn in build_plots("eye_tracking_gaze_axes", 1.0, + [configs['large'], configs['svg']], + output_dir): + oplots.plot_pupil_location(xy_deg, c=c, include_labels=True) + oplots.finalize_with_axes() + + for fn in build_plots("eye_tracking_gaze", 1.0, [configs['small']], + output_dir): + oplots.plot_pupil_location(xy_deg, c=c, include_labels=False) + oplots.finalize_no_axes() + except NoEyeTrackingException: + logging.debug("No eye tracking found.") + + +def build_type(nwb_file, data_file, configs, output_dir, type_name): + data_set = BrainObservatoryNwbDataSet(nwb_file) + try: + if type_name == "dg": + dga = DriftingGratings.from_analysis_file(data_set, data_file) + build_drifting_gratings(dga, configs, output_dir) + elif type_name == "sg": + sga = StaticGratings.from_analysis_file(data_set, data_file) + build_static_gratings(sga, configs, output_dir) + elif type_name == "nm1": + nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_ONE) + build_natural_movie(nma, configs, output_dir, si.NATURAL_MOVIE_ONE) + elif type_name == "nm2": + nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_TWO) + build_natural_movie(nma, configs, output_dir, si.NATURAL_MOVIE_TWO) + elif type_name == "nm3": + nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_THREE) + build_natural_movie(nma, configs, output_dir, si.NATURAL_MOVIE_THREE) + elif type_name == "ns": + nsa = NaturalScenes.from_analysis_file(data_set, data_file) + build_natural_scenes(nsa, configs, output_dir) + elif type_name == "sp": + nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_ONE) + build_speed_tuning(nma, configs, output_dir) + elif type_name == "lsn_on": + lsna = lsna_check_hvas(data_set, data_file) + build_locally_sparse_noise(lsna, configs, output_dir, True) + elif type_name == "lsn_off": + lsna = lsna_check_hvas(data_set, data_file) + build_locally_sparse_noise(lsna, configs, output_dir, False) + elif type_name == "rf": + lsna = lsna_check_hvas(data_set, data_file) + build_receptive_field(lsna, configs, output_dir) + elif type_name == "corr": + build_correlation_plots(data_set, data_file, configs, output_dir) + elif type_name == "eye": + build_eye_tracking_plots(data_set, configs, output_dir) + + except MissingStimulusException as e: + logging.warning("could not load stimulus (%s)", type_name) + except Exception as e: + traceback.print_exc() + logging.critical("error running stimulus (%s)", type_name) + raise e + +def parse_input(data): + nwb_file = data.get("nwb_file", None) + + if nwb_file is None: + raise IOError("input JSON missing required field 'nwb_file'") + if not os.path.exists(nwb_file): + raise IOError("nwb file does not exists: %s" % nwb_file) + + analysis_file = data.get("analysis_file", None) + + if analysis_file is None: + raise IOError("input JSON missing required field 'analysis_file'") + if not os.path.exists(analysis_file): + raise IOError("analysis file does not exists: %s" % analysis_file) + + + output_directory = data.get("output_directory", None) + + if output_directory is None: + raise IOError("input JSON missing required field 'output_directory'") + + Manifest.safe_mkdir(output_directory) + + return nwb_file, analysis_file, output_directory + +def build_experiment_thumbnails(nwb_file, analysis_file, output_directory, + types=None, threads=4): + if types is None: + types = PLOT_TYPES + + logging.info("nwb file: %s", nwb_file) + logging.info("analysis file: %s", analysis_file) + logging.info("output directory: %s", output_directory) + logging.info("types: %s", str(types)) + Manifest.safe_mkdir(output_directory) + + if len(types) == 1: + build_type(nwb_file, analysis_file, PLOT_CONFIGS, output_directory, types[0]) + elif threads == 1: + for type_name in types: + build_type(nwb_file, analysis_file, PLOT_CONFIGS, output_directory, type_name) + else: + p = multiprocessing.Pool(threads) + + func = functools.partial(build_type, nwb_file, analysis_file, PLOT_CONFIGS, output_directory) + results = p.map(func, types) + p.close() + p.join() + + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("-t", "--threads", type=int, default=4) + parser.add_argument("--log-level", default=logging.DEBUG) + parser.add_argument("--types", default=','.join(PLOT_TYPES)) + parser.add_argument("input_json") + parser.add_argument("output_json") + args = parser.parse_args() + + args.types = args.types.split(',') + + logging.getLogger().setLevel(args.log_level) + + input_data = ju.read(args.input_json) + + nwb_file, analysis_file, output_directory = parse_input(input_data) + + build_experiment_thumbnails(nwb_file, analysis_file, output_directory, + args.types, args.threads) + + ju.write(args.output_json, {}) + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_ophys_eye_calibration.py b/internal/pipeline_modules/run_ophys_eye_calibration.py new file mode 100644 index 0000000000..e6288084f6 --- /dev/null +++ b/internal/pipeline_modules/run_ophys_eye_calibration.py @@ -0,0 +1,178 @@ +import os +from allensdk.internal.core.lims_pipeline_module import (PipelineModule, + run_module) +from allensdk.internal.brain_observatory import (eye_calibration, + itracker_utils) +import allensdk.internal.core.lims_utilities as lu +import numpy as np +import h5py + +EYE_RADIUS = 0.1682 +CM_PER_PIXEL = 10.2/10000 + +def get_wkf(wkf_type, experiment_id): + wkf = lu.query(""" +select CONCAT(wkf.storage_directory, wkf.filename) as path +from well_known_files wkf +join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id +where wkft.name LIKE '{}' and wkf.attachable_id = {} +""".format(wkf_type, experiment_id))[0]["path"] + return wkf + +def debug(experiment_id, local=False): + OUTPUT_DIRECTORY = "/data/informatics/CAM/eye_calibration" + SDK_PATH = "/data/informatics/CAM/eye_calibration/allensdk" + SCRIPT = ("/data/informatics/CAM/eye_calibration/allensdk/allensdk" + "/internal/pipeline_modules/run_ophys_eye_calibration.py") + + frame_width = 640 + frame_height = 480 + + cr_file = get_wkf("EyeTracking Corneal Reflection", experiment_id) + pupil_file = get_wkf("EyeTracking Pupil", experiment_id) + + exp_info = lu.query(""" +select * +from ophys_sessions os +where os.id = {} +""".format(experiment_id))[0] + + exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) + # clear out missing values to let us get defaults + for key, value in list(exp_info.items()): + if value is None: + del exp_info[key] + + input_data = { + "cr_params_file": cr_file, + "pupil_params_file": pupil_file, + "frame_width": frame_width, + "frame_height": frame_height, + "output_file": os.path.join(exp_dir, + "eye_tracking_to_screen_mapping.h5"), + "monitor_position_x_mm": exp_info.get( + "screen_center_x_mm", eye_calibration.MONITOR_POSITION_OLD[0]*10), + "monitor_position_y_mm": exp_info.get( + "screen_center_y_mm", eye_calibration.MONITOR_POSITION_OLD[1]*10), + "monitor_position_z_mm": exp_info.get( + "screen_center_z_mm", eye_calibration.MONITOR_POSITION_OLD[2]*10), + "monitor_rotation_x_deg": exp_info.get("screen_rotation_x_deg", 0), + "monitor_rotation_y_deg": exp_info.get("screen_rotation_y_deg", 0), + "monitor_rotation_z_deg": exp_info.get("screen_rotation_z_deg", 0), + "camera_position_x_mm": exp_info.get( + "camera_center_x_mm", eye_calibration.CAMERA_POSITION_OLD[0]*10), + "camera_position_y_mm": exp_info.get( + "camera_center_y_mm", eye_calibration.CAMERA_POSITION_OLD[1]*10), + "camera_position_z_mm": exp_info.get( + "camera_center_z_mm", eye_calibration.CAMERA_POSITION_OLD[2]*10), + "camera_rotation_x_deg": exp_info.get( + "camera_rotation_x_deg", + eye_calibration.CAMERA_ROTATIONS_OLD[0]*180/np.pi), + "camera_rotation_y_deg": exp_info.get( + "camera_rotation_y_deg", + eye_calibration.CAMERA_ROTATIONS_OLD[1]*180/np.pi), + "camera_rotation_z_deg": exp_info.get( + "camera_rotation_z_deg", + eye_calibration.CAMERA_ROTATIONS_OLD[2]*180/np.pi), + "led_position_x_mm": exp_info.get( + "led_center_x_mm", eye_calibration.LED_POSITION_ORIGINAL[0]*10), + "led_position_y_mm": exp_info.get( + "led_center_y_mm", eye_calibration.LED_POSITION_ORIGINAL[1]*10), + "led_position_z_mm": exp_info.get( + "led_center_z_mm", eye_calibration.LED_POSITION_ORIGINAL[2]*10) + } + + # TEMPORARY HACKS TO DEAL WITH BAD DATA IN LIMS + # TODO: REMOVE WHEN DATAFIXES DONE + if input_data["monitor_position_x_mm"] == -86.2: + input_data["monitor_position_x_mm"] = \ + eye_calibration.MONITOR_POSITION_NEW[0]*10 + input_data["monitor_position_y_mm"] = \ + eye_calibration.MONITOR_POSITION_NEW[1]*10 + input_data["monitor_position_z_mm"] = \ + eye_calibration.MONITOR_POSITION_NEW[2]*10 + + run_module(SCRIPT, + input_data, + exp_dir, + sdk_path=SDK_PATH, + local=local) + + +def parse_input_data(data): + cr_params = np.load(data["cr_params_file"]) + pupil_params = np.load(data["pupil_params_file"]) + frame_width = data["frame_width"] + frame_height = data["frame_height"] + output_file = data["output_file"] + monitor_position = np.array([ + float(data['monitor_position_x_mm'])/10.0, + float(data['monitor_position_y_mm'])/10.0, + float(data['monitor_position_z_mm'])/10.0, + ]) + monitor_rotations = np.array([ + float(data['monitor_rotation_x_deg'])*np.pi/180, + float(data['monitor_rotation_y_deg'])*np.pi/180, + float(data['monitor_rotation_z_deg'])*np.pi/180, + ]) + camera_position = np.array([ + float(data['camera_position_x_mm'])/10.0, + float(data['camera_position_y_mm'])/10.0, + float(data['camera_position_z_mm'])/10.0, + ]) + camera_rotations = np.array([ + float(data['camera_rotation_x_deg'])*np.pi/180, + float(data['camera_rotation_y_deg'])*np.pi/180, + float(data['camera_rotation_z_deg'])*np.pi/180, + ]) + led_position = np.array([ + float(data['led_position_x_mm'])/10.0, + float(data['led_position_y_mm'])/10.0, + float(data['led_position_z_mm'])/10.0, + ]) + calibrator = eye_calibration.EyeCalibration( + monitor_position=monitor_position, + monitor_rotations=monitor_rotations, + led_position=led_position, + camera_position=camera_position, + camera_rotations=camera_rotations, + eye_radius=EYE_RADIUS, + cm_per_pixel=CM_PER_PIXEL) + + cr_params, _ = itracker_utils.post_process_cr(cr_params) + pupil_params = itracker_utils.post_process_pupil(pupil_params) + cr_params = itracker_utils.filter_bad_params(cr_params, frame_width, + frame_height) + pupil_params = itracker_utils.filter_bad_params(pupil_params, frame_width, + frame_height) + return calibrator, cr_params, pupil_params, output_file + + +def write_output(filename, position_degrees, position_cm, areas): + with h5py.File(filename, "w") as f: + f.create_dataset("screen_coordinates", data=position_cm) + f.create_dataset("screen_coordinates_spherical", + data=position_degrees) + f.create_dataset("pupil_areas", data=areas) + + +def main(): + mod = PipelineModule() + data = mod.input_data() + calibrator, cr_params, pupil_params, outfile = parse_input_data(data) + + pupil_areas = calibrator.compute_area(pupil_params) + pupil_on_monitor_deg = calibrator.pupil_position_on_monitor_in_degrees( + pupil_params, cr_params) + pupil_on_monitor_cm = calibrator.pupil_position_on_monitor_in_cm( + pupil_params, cr_params) + missing_index = np.isnan(pupil_areas) | np.isnan(pupil_on_monitor_deg.T[0]) + pupil_areas[missing_index] = np.nan + pupil_on_monitor_deg[missing_index,:] = np.nan + pupil_on_monitor_cm[missing_index,:] = np.nan + write_output(outfile, pupil_on_monitor_deg, pupil_on_monitor_cm, + pupil_areas) + + mod.write_output_data({"screen_mapping_file": outfile}) + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_ophys_session_decomposition.py b/internal/pipeline_modules/run_ophys_session_decomposition.py new file mode 100644 index 0000000000..195b281d58 --- /dev/null +++ b/internal/pipeline_modules/run_ophys_session_decomposition.py @@ -0,0 +1,115 @@ +import logging +from allensdk.internal.core.lims_pipeline_module import (PipelineModule, + run_module) +import allensdk.core.json_utilities as ju +import allensdk.internal.core.lims_utilities as lu +from allensdk.internal.brain_observatory import ophys_session_decomposition as osd +from multiprocessing import Pool +import os + +DEBUG_CHANNELS = ["data", "piezo"] +DEBUG_WIDTH = 512 +DEBUG_HEIGHT = 256 +DEBUG_ITEMSIZE = 2 +DEBUG_N_PLANES = 6 + +def create_fake_metadata(exp_dir, raw_path, channels=None, + width=DEBUG_WIDTH, height=DEBUG_HEIGHT, + itemsize=DEBUG_ITEMSIZE, n_planes=DEBUG_N_PLANES): + metadata = [] + size = os.stat(raw_path).st_size + if channels is None: + channels = DEBUG_CHANNELS + n_frames = size/(itemsize*width*height) + frames_per_plane = n_frames/n_planes/len(channels) + for plane in range(n_planes): + experiment_id = plane + outfile = os.path.join(exp_dir, "plane_{}.h5".format(plane)) + frame_meta = [] + for i, channel in enumerate(channels): + byte_offset = width * height * itemsize * \ + (plane * len(channels) + i) + strides = [width*height*itemsize*n_planes*len(channels), + width*itemsize, + itemsize] + frame_meta.append({"byte_offset": byte_offset, + "channel": i+1, + "channel_description": channel, + "frame_description": "plane_{}".format(plane), + "dtype": ">u{}".format(itemsize), + "position_offset": [None, 0, 0], + "shape": [frames_per_plane, height, width], + "strides": strides}) + metadata.append({"output_file": outfile, + "experiment_id": experiment_id, + "frame_metadata": frame_meta}) + return metadata + + +def debug(experiment_id, local=False, raw_path=None): + OUTPUT_DIRECTORY = "/data/informatics/CAM/ophys_decomp" + SDK_PATH = "/data/informatics/CAM/ophys_decomp/allensdk" + SCRIPT = ("/data/informatics/CAM/ophys_decomp/allensdk/allensdk/" + "internal/pipeline_modules/run_ophys_session_decomposition.py") + + exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) + + if raw_path is not None: + conversion_definitions = create_fake_metadata(exp_dir, raw_path) + input_data = {"raw_filename": raw_path, + "frame_metadata": conversion_definitions} + else: + raise NotImplementedError("No real examples exist yet") + + run_module(SCRIPT, + input_data, + exp_dir, + sdk_path=SDK_PATH, + pbs=dict(vmem=160, + job_name="ophys_decomp_%d"% experiment_id, + walltime="36:00:00"), + local=local) + + +def convert_frame(conversion_definition): + raw_filename = conversion_definition["input_file"] + ophys_hdf5_filename = conversion_definition["data_output_file"] + auxiliary_hdf5_filename = conversion_definition["auxiliary_output_file"] + experiment_id = conversion_definition["experiment_id"] + frame_metadata = conversion_definition["frame_metadata"] + osd.export_frame_to_hdf5(raw_filename, ophys_hdf5_filename, + auxiliary_hdf5_filename, frame_metadata) + return experiment_id, ophys_hdf5_filename, auxiliary_hdf5_filename + + +def parse_input(data): + '''Load all input data from the input json.''' + conversion_definitions = data["frame_metadata"] + for item in conversion_definitions: + item["input_file"] = data["raw_filename"] + return conversion_definitions + + +def main(): + mod = PipelineModule("Decompose ophys session into individual planes.") + mod.parser.add_argument("-t", "--threads", type=int, default=4) + + input_data = mod.input_data() + conversion_definitions = parse_input(input_data) + + if mod.args.threads > 1: + pool = Pool(processes=mod.args.threads) + output = pool.map(convert_frame, conversion_definitions) + else: + output= [] + for definition in conversion_definitions: + output.append(convert_frame(definition)) + + output_data = {} + for eid, ophys_file, auxiliary_file in output: + output_data[eid] = {"ophys_data": ophys_file, + "auxiliary_data": auxiliary_file} + + mod.write_output_data(output_data) + +if __name__ == "__main__": main() diff --git a/internal/pipeline_modules/run_ophys_time_sync.py b/internal/pipeline_modules/run_ophys_time_sync.py new file mode 100644 index 0000000000..1d0227b49a --- /dev/null +++ b/internal/pipeline_modules/run_ophys_time_sync.py @@ -0,0 +1,268 @@ +import logging +import argparse +import os +import datetime +import json +from typing import NamedTuple, Optional + +import numpy as np +import h5py + +import allensdk +from allensdk.internal.core.lims_pipeline_module import PipelineModule +from allensdk.internal.brain_observatory import time_sync as ts +from allensdk.brain_observatory.argschema_utilities import \ + check_write_access_overwrite + + +class TimeSyncOutputs(NamedTuple): + """ Schema for synchronization outputs + """ + + # unique identifier for the experiment being aligned + experiment_id: int + + # calculated monitor delay (s) + stimulus_delay: float + + # For each data stream, the count of "extra" timestamps (compared to the + # number of samples) + ophys_delta: int + stimulus_delta: int + eye_delta: int + behavior_delta: int + + # aligned timestamps for each data stream (s) + ophys_times: np.ndarray + stimulus_times: np.ndarray + eye_times: np.ndarray + behavior_times: np.ndarray + + # for non-ophys data streams, a mapping from samples to corresponding ophys + # frames + stimulus_alignment: np.ndarray + eye_alignment: np.ndarray + behavior_alignment: np.ndarray + + +class TimeSyncWriter: + + def __init__( + self, + output_h5_path: str, + output_json_path: Optional[str] = None + ): + """ Writes synchronization outputs to h5 and (optionally) json. + + Parameters + ---------- + output_h5_path : "heavy" outputs (e.g aligned timestamps and + ophy frame correspondances) will ONLY be stored here. Lightweight + outputs (e.g. stimulus delay) will also be written here as scalars. + output_json_path : if provided, lightweight outputs will be written + here, along with provenance information, such as the date and + allensdk version. + + """ + + self.output_h5_path: str = output_h5_path + self.output_json_path: Optional[str] = output_json_path + + def validate_paths(self): + """ Determines whether we can actually write to the specified paths, + allowing for creation of intermediate directories. It is a good idea + to run this beore doing any heavy calculations! + """ + + check_write_access_overwrite(self.output_h5_path) + + if self.output_json_path is not None: + check_write_access_overwrite(self.output_json_path) + + def write(self, outputs: TimeSyncOutputs): + """ Convenience for writing both an output h5 and (if applicable) an + output json. + + Parameters + ---------- + outputs : the data to be written + + """ + + self.write_output_h5(outputs) + + if self.output_json_path is not None: + self.write_output_json(outputs) + + def write_output_h5(self, outputs): + """ Write (mainly) heaviweight data to an h5 file. + + Parameters + ---------- + outputs : the data to be written + + """ + + os.makedirs(os.path.dirname(self.output_h5_path), exist_ok=True) + + with h5py.File(self.output_h5_path, "w") as output_h5: + output_h5["stimulus_alignment"] = outputs.stimulus_alignment + output_h5["eye_tracking_alignment"] = outputs.eye_alignment + output_h5["body_camera_alignment"] = outputs.behavior_alignment + output_h5["twop_vsync_fall"] = outputs.ophys_times + output_h5["ophys_delta"] = outputs.ophys_delta + output_h5["stim_delta"] = outputs.stimulus_delta + output_h5["stim_delay"] = outputs.stimulus_delay + output_h5["eye_delta"] = outputs.eye_delta + output_h5["behavior_delta"] = outputs.behavior_delta + + def write_output_json(self, outputs): + """ Write lightweight data to a json + + Parameters + ---------- + outputs : the data to be written + + """ + os.makedirs(os.path.dirname(self.output_json_path), exist_ok=True) + + with open(self.output_json_path, "w") as output_json: + json.dump({ + "allensdk_version": allensdk.__version__, + "date": str(datetime.datetime.now()), + "experiment_id": outputs.experiment_id, + "output_h5_path": self.output_h5_path, + "ophys_delta": outputs.ophys_delta, + "stim_delta": outputs.stimulus_delta, + "stim_delay": outputs.stimulus_delay, + "eye_delta": outputs.eye_delta, + "behavior_delta": outputs.behavior_delta + }, output_json, indent=2) + + +def check_stimulus_delay(obt_delay: float, min_delay: float, max_delay: float): + """ Raise an exception if the monitor delay is not within specified bounds + + Parameters + ---------- + obt_delay : obtained monitor delay (s) + min_delay : lower threshold (s) + max_delay : upper threshold (s) + + """ + + if obt_delay < min_delay or obt_delay > max_delay: + raise ValueError( + f"calculated monitor delay was {obt_delay:.3f}s " + f"(acceptable interval: [{min_delay:.3f}s, " + f"{max_delay:.3f}s])" + ) + + +def run_ophys_time_sync( + aligner: ts.OphysTimeAligner, + experiment_id: int, + min_stimulus_delay: float, + max_stimulus_delay: float +) -> TimeSyncOutputs: + """ Carry out synchronization of timestamps across the data streams of an + ophys experiment. + + Parameters + ---------- + aligner : drives alignment. See OphysTimeAligner for details of the + attributes and properties that must be implemented. + experiment_id : unique identifier for the experiment being aligned + min_stimulus_delay : reject alignment run (raise a ValueError) if the + calculated monitor delay is below this value (s). + max_stimulus_delay : reject alignment run (raise a ValueError) if the + calculated monitor delay is above this value (s). + + Returns + ------- + A TimeSyncOutputs (see definintion for more information) of output + parameters and arrays of aligned timestamps. + + """ + + stim_times, stim_delta, stim_delay = aligner.corrected_stim_timestamps + check_stimulus_delay(stim_delay, min_stimulus_delay, max_stimulus_delay) + + ophys_times, ophys_delta = aligner.corrected_ophys_timestamps + eye_times, eye_delta = aligner.corrected_eye_video_timestamps + beh_times, beh_delta = aligner.corrected_behavior_video_timestamps + + # stim array is index of ophys frame for each stim frame to match to + # so len(stim_times) + stim_alignment = ts.get_alignment_array(ophys_times, stim_times) + + # camera arrays are index of camera frame for each ophys frame ... + # cam_nwb_creator depends on this so keeping it that way even though + # it makes little sense... len(video_times) + eye_alignment = ts.get_alignment_array(eye_times, ophys_times, + int_method=np.ceil) + + behavior_alignment = ts.get_alignment_array(beh_times, ophys_times, + int_method=np.ceil) + + return TimeSyncOutputs( + experiment_id, + stim_delay, + ophys_delta, + stim_delta, + eye_delta, + beh_delta, + ophys_times, + stim_times, + eye_times, + beh_times, + stim_alignment, + eye_alignment, + behavior_alignment + ) + + +def main(): + parser = argparse.ArgumentParser("Generate brain observatory alignment.") + parser.add_argument("input_json", type=str, + help="path to input json" + ) + parser.add_argument("output_json", type=str, nargs="?", + help="path to which output json will be written" + ) + parser.add_argument("--log-level", default=logging.DEBUG) + parser.add_argument("--min-stimulus-delay", type=float, default=0.0, + help="reject results if monitor delay less than this value (s)" + ) + parser.add_argument("--max-stimulus-delay", type=float, default=0.07, + help="reject results if monitor delay greater than this value (s)" + ) + mod = PipelineModule("Generate brain observatory alignment.", parser) + + input_data = mod.input_data() + + writer = TimeSyncWriter(input_data.get("output_file"), mod.args.output_json) + writer.validate_paths() + + aligner = ts.OphysTimeAligner( + input_data.get("sync_file"), + scanner=input_data.get("scanner", None), + dff_file=input_data.get("dff_file", None), + stimulus_pkl=input_data.get("stimulus_pkl", None), + eye_video=input_data.get("eye_video", None), + behavior_video=input_data.get("behavior_video", None), + long_stim_threshold=input_data.get( + "long_stim_threshold", ts.LONG_STIM_THRESHOLD + ) + ) + + outputs = run_ophys_time_sync( + aligner, + input_data.get("ophys_experiment_id"), + mod.args.min_stimulus_delay, + mod.args.max_stimulus_delay + ) + writer.write(outputs) + + +if __name__ == "__main__": main() \ No newline at end of file diff --git a/internal/pipeline_modules/run_roi_filter.py b/internal/pipeline_modules/run_roi_filter.py new file mode 100644 index 0000000000..e83f2f38af --- /dev/null +++ b/internal/pipeline_modules/run_roi_filter.py @@ -0,0 +1,291 @@ +import logging +import allensdk.internal.core.lims_utilities as lu +from allensdk.internal.core.lims_pipeline_module import ( + PipelineModule, run_module) +from allensdk.internal.brain_observatory import roi_filter, roi_filter_utils +from allensdk.brain_observatory.roi_masks import (RIGHT_SHIFT, LEFT_SHIFT, + DOWN_SHIFT, UP_SHIFT) +import pandas as pd +import os +import h5py + +DEPRECATED_MOTION_HEADER = ["index", "x", "y", "a", "b", "c", "d", "e", "f"] +MAX_SHIFT = 30 +OVERLAP_THRESHOLD = 0.9 +DEBUG_SDK_PATH = "/data/informatics/CAM/roi_filter/allensdk/" +DEBUG_SCRIPT = os.path.join(DEBUG_SDK_PATH, "allensdk", "internal", + "pipeline_modules", "run_roi_filter.py") +DEBUG_OUTPUT_DIRECTORY = "/data/informatics/CAM/roi_filter/" + + +def get_motion_filepath(experiment_id): + return lu.query(""" +select CONCAT(wkf.storage_directory, wkf.filename) as path +from well_known_files wkf +join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id +join ophys_experiments oe on oe.id = wkf.attachable_id +where oe.id = {} and +wkft.name like 'OphysMotionXyOffsetData'""".format(experiment_id))[0]["path"] + + +def get_segmentation_filepath(experiment_id, file_type): + return lu.query(""" +select CONCAT(wkf.storage_directory, wkf.filename) as path +from well_known_files wkf +join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id +join ophys_cell_segmentation_runs ocsr on ocsr.id = wkf.attachable_id +join ophys_experiments oe on oe.id = ocsr.ophys_experiment_id +where oe.id = {} and wkft.name like '{}' +and ocsr.current = 't'""".format(experiment_id, file_type))[0]["path"] + + +def get_model_info(experiment_id): + res = lu.query(""" +select CONCAT(wkf.storage_directory, wkf.filename) as path, wkf.id +from ophys_experiments oe +join ophys_sessions os on os.id = oe.ophys_session_id +join projects p on p.id = os.project_id +join well_known_files wkf on wkf.attachable_id = p.id +join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id +where oe.id = {} and +wkft.name = 'RoiLabelModel'""".format(experiment_id))[0] + return res["path"], res["id"] + + +def get_genotype_info(experiment_id, code): + res = lu.query(""" +select g.name +from ophys_experiments oe +join ophys_sessions os on os.id = oe.ophys_session_id +join specimens s on s.id = os.specimen_id +join donors d on d.id = s.donor_id +join donors_genotypes dg on dg.donor_id = d.id +join genotypes g on g.id = dg.genotype_id +join genotype_types gt on gt.id = g.genotype_type_id +where oe.id = {} and gt.code like '{}'""".format(experiment_id, code)) + output = set() + for line in res: + output.add(line["name"]) + return list(output) + + +def create_input_data(experiment_id): + data = {} + data["log_0"] = get_motion_filepath(experiment_id) + model, model_id = get_model_info(experiment_id) + data["roi_label_model"] = model + data["roi_label_model_id"] = model_id + data["targeted_structure_id"] = lu.query(""" +select targeted_structure_id +from ophys_experiments oe +where oe.id = {}""".format(experiment_id))[0]["targeted_structure_id"] + data["imaging_depth"] = lu.query(""" +select calculated_depth +from ophys_experiments oe +where oe.id = {}""".format(experiment_id))[0]["calculated_depth"] + data["drivers"] = get_genotype_info(experiment_id, "D") + data["reporters"] = get_genotype_info(experiment_id, "R") + data["max_int_file"] = get_segmentation_filepath( + experiment_id, "OphysSegmentationMaskData") + data["object_list"] = get_segmentation_filepath( + experiment_id, "OphysSegmentationObjects") + return data + + +def debug(experiment_id, local=False, sdk_path=DEBUG_SDK_PATH, + script=DEBUG_SCRIPT, output_directory=DEBUG_OUTPUT_DIRECTORY): + input_data = create_input_data(experiment_id) + exp_dir = os.path.join(output_directory, str(experiment_id)) + run_module(script, + input_data, + exp_dir, + sdk_path=sdk_path, + local=local) + + +def load_object_list(filename): + '''Load the object list file.''' + dataframe = pd.read_csv(filename) + dataframe.columns = [column.strip() for column in dataframe.columns] + return dataframe + + +def is_deprecated_motion_file(filename): + '''Check if a file is an old style motion correction file. + + By agreement, new-style files will always have a header and that + header will always contain at least 1 alpha character. + ''' + with open(filename, "r") as f: + return not any([c.isalpha() for c in f.readline()]) + + +def load_rigid_motion_transform(filename): + '''Load the rigid motion transform file.''' + if is_deprecated_motion_file(filename): + return pd.read_csv(filename, header=None, + names=DEPRECATED_MOTION_HEADER) + else: + return pd.read_csv(filename) + + +def load_all_input(data): + '''Load all input data from the input json.''' + try: + object_list_file = data["object_list"] + object_data = load_object_list(object_list_file) + except KeyError: + logging.error("Input json missing object_list") + raise + except IOError: + logging.error("Could not read object list file %s", object_list_file) + raise + + try: + # TODO: update name in LIMS and here + rigid_motion_transform_file = data["log_0"] + motion_data = load_rigid_motion_transform(rigid_motion_transform_file) + except KeyError: + # TODO: update name in LIMS and here + logging.error("Input json missing log_0") + raise + except IOError: + logging.error("Could not read rigid motion transform file %s", + rigid_motion_transform_file) + raise + + try: + maxint_file = data["max_int_file"] + with h5py.File(maxint_file, "r") as f: + segmentation_stack = f["data"][...] + except KeyError: + logging.error("Input json missing max_int_file") + raise + except IOError: + logging.error("Could not read max_int_file file %s", maxint_file) + raise + + try: + model_file = data["roi_label_model"] + classifier = roi_filter.ROIClassifier.from_file(model_file) + except KeyError: + logging.error("Input json missing roi_label_model") + raise + except IOError: + logging.error("Could not read roi_label_model file %s", model_file) + raise + + try: + depth = float(data["imaging_depth"]) + except KeyError: + logging.error("Input json missing imaging_depth") + raise + except ValueError: + logging.error("Invalid depth %s", data["imaging_depth"]) + raise + + try: + structure_id = str(data["targeted_structure_id"]) + except KeyError: + logging.error("Input json missing targeted_structure_id") + raise + + try: + model_id = data["roi_label_model_id"] + except KeyError: + logging.error("Input json missing roi_label_model_id") + raise + + try: + drivers = data["drivers"] + except KeyError: + logging.error("Input json drivers") + raise + + try: + reporters = data["reporters"] + except KeyError: + logging.error("Input json missing reporters") + raise + + border = roi_filter_utils.calculate_max_border(motion_data, MAX_SHIFT) + rois = roi_filter_utils.get_rois(segmentation_stack, border) + if len(rois) == 0: + raise ValueError(f"no ROIs were found from {maxint_file}") + rois = roi_filter_utils.order_rois_by_object_list(object_data, rois) + + result = {"model_id": model_id, + "classifier": classifier, + "object_data": object_data, + "depth": depth, + "structure_id": structure_id, + "drivers": drivers, + "reporters": reporters, + "border": border, + "rois": rois} + return result + + +def create_output_data(rois, model_id, border, excluded, + unexpected_features): + data = {} + data["motion_border"] = {"x0": border[RIGHT_SHIFT], + "y0": border[DOWN_SHIFT], + "x1": border[LEFT_SHIFT], + "y1": border[UP_SHIFT]} + data["roi_label_model_id"] = model_id + data["unexpected_features"] = unexpected_features + if rois: + data["image"] = {"width": rois[0].img_cols, + "height": rois[0].img_rows} + json_rois = {} + for i, roi in enumerate(rois): + json_roi = {} + json_roi["x"] = roi.x + json_roi["y"] = roi.y + json_roi["width"] = roi.width + json_roi["height"] = roi.height + json_roi["mask"] = roi.mask + json_roi["mask_page"] = roi.mask_group + json_roi["exclusion_labels"] = roi.labels + if roi.labels: + json_roi["valid"] = False + else: + json_roi["valid"] = True + # for backwards compatibility + json_roi["exclude_code"] = excluded[i] + json_rois[roi.label] = json_roi + data["rois"] = json_rois + return data + + +def main(): + mod = PipelineModule("Filter Ophys ROIs produced from cell segmentation.") + + input_data = mod.input_data() + data = load_all_input(input_data) + model_id = data["model_id"] + classifier = data["classifier"] + object_data = data["object_data"] + depth = data["depth"] + structure_id = data["structure_id"] + drivers = data["drivers"] + reporters = data["reporters"] + border = data["border"] + rois = data["rois"] + + label_array = classifier.get_labels(object_data, depth, structure_id, + drivers, reporters) + rois = roi_filter.apply_labels(rois, label_array, classifier.label_names) + + rois = roi_filter.label_unions_and_duplicates(rois, OVERLAP_THRESHOLD) + + output_data = create_output_data(rois, model_id, border, + object_data["eXcluded"], + classifier.unexpected_features) + + mod.write_output_data(output_data) + + +if __name__ == "__main__": + main() diff --git a/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py b/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py new file mode 100644 index 0000000000..86ab7ce2e9 --- /dev/null +++ b/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py @@ -0,0 +1,96 @@ +import logging +import os +import functools +import six + +import SimpleITK as sitk +from scipy.misc import imread, imsave +import numpy as np +import pandas as pd + +from allensdk.internal.core.lims_pipeline_module import PipelineModule + +from allensdk.internal.mouse_connectivity.projection_thumbnail.volume_utilities import sitk_get_diagonal_length +from allensdk.internal.mouse_connectivity.projection_thumbnail.generate_projection_strip import run, apply_colormap +from allensdk.internal.mouse_connectivity.projection_thumbnail.visualization_utilities import convert_discrete_colormap + + +PERMUTATION = [2, 1, 0] +FLIP = [True, False, False] + + +def write_depth_image(image, path): + image = sitk.GetImageFromArray(image) + sitk.WriteImage(image, str(path)) + + +def load_background_image(path): + background = sitk.ReadImage(str(path)) + background = sitk.GetArrayFromImage(background) + bg_split = np.split(background, 3, axis=-1) + return bg_split[0] / 255.0 + + +def no_pad(volume): + shape = [int(np.ceil(sitk_get_diagonal_length(volume))), 0, 0] + shape[1] = volume.GetSize()[1] + shape[2] = volume.GetSize()[2] + return shape + + +def pad(volume): + shape = [int(np.ceil(sitk_get_diagonal_length(volume))), 0, 0] + shape[1] = int(np.floor(np.linalg.norm([volume.GetSize()[1], volume.GetSize()[0]]))) + shape[2] = int(np.floor(np.linalg.norm([volume.GetSize()[2], volume.GetSize()[0]]))) + return shape + + +def main(): + + module = PipelineModule() + input_data = module.input_data() + + output_dir = os.path.dirname(module.args.output_json) + + logging.info('reading data volume from {0}'.format(input_data['volume_path'])) + volume = sitk.ReadImage(str(input_data['volume_path'])) + volume = sitk.PermuteAxes(volume, PERMUTATION) + volume = sitk.Flip(volume, FLIP) + + logging.info('reading colormap from {0}'.format(input_data['colormap_path'])) + colormap = pd.read_csv(input_data['colormap_path'], header=None, + names=['red', 'green', 'blue'], delim_whitespace=True) + colormap = convert_discrete_colormap(colormap.values, 'projection') + + output_data = {'output_file_paths': []} + for rot in input_data['rotations']: + + rot['write_depth_sheet'] = functools.partial(write_depth_image, + path=str(os.path.join(output_dir, rot['depth_path']))) + output_data['output_file_paths'].append(os.path.join(output_dir, rot['depth_path'])) + + if isinstance(rot['window_size'], six.string_types): + if rot['window_size'] == 'no_pad': + rot['window_size'] = no_pad(volume) + elif rot['window_size'] == 'pad': + rot['window_size'] = pad(volume) + else: + raise ValueError('did not understand window size option {0}'.format(rot['window_size'])) + logging.info('window_size: {0}'.format(rot['window_size'])) + + for out_image in rot['output_images']: + out_image['write'] = functools.partial(imsave, os.path.join(output_dir, out_image['path'])) + output_data['output_file_paths'].append(os.path.join(output_dir, out_image['path'])) + + if 'background_path' in out_image: + out_image['background'] = load_background_image(out_image['background_path']) + else: + out_image['background'] = None + + run(volume, input_data['min_threshold'], input_data['max_threshold'], + input_data['rotations'], colormap) + module.write_output_data(output_data) + + +if __name__ == '__main__': + main() diff --git a/internal/pipeline_modules/run_tissuecyte_stitching_classic.py b/internal/pipeline_modules/run_tissuecyte_stitching_classic.py new file mode 100644 index 0000000000..b1e8dca630 --- /dev/null +++ b/internal/pipeline_modules/run_tissuecyte_stitching_classic.py @@ -0,0 +1,135 @@ +import sys +import argparse +import logging +import os + +from xml.etree.ElementTree import Element, SubElement, Comment, tostring +from xml.dom import minidom + +import SimpleITK as sitk +import numpy as np +from six import iteritems + +from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module +from allensdk.internal.mouse_connectivity.tissuecyte_stitching.stitcher import Stitcher +from allensdk.internal.mouse_connectivity.tissuecyte_stitching.tile import Tile +import allensdk.core.json_utilities as ju + +# TODO this ought to be installed with the actual python build? +# need to consult with sysadmins/refactor jp2 project build +sys.path.append('/shared/bioapps/itk/itk_shared/jp2/build') +import jpeg_twok + + +logging.getLogger().setLevel(logging.INFO) +logging.captureWarnings(True) + + +def get_missing_tile_paths(missing_tiles): + + paths = [] + + for index, path in iteritems(missing_tiles): + spath = ','.join(map(str, path)) + logging.info('writing missing tile path for tile {0} as {1}'.format(index, spath)) + paths.append(spath) + + return paths + + +def read_image(file_name): + logging.info('reading image from {0}'.format(file_name)) + image = sitk.ReadImage(str(file_name)) + return np.flipud(sitk.GetArrayFromImage(image)).T + + +def normalize_image_by_median(image): + + median = np.median(image) + + if median != 0: + image = np.divide(median, image) + image[np.isnan(image)] = 0 + image[np.isinf(image)] = 0 + + return image + + +def load_average_tile(path): + tile = read_image(path) + return normalize_image_by_median(tile) + + +def get_average_tiles(average_tile_paths): + + average_tiles = {} + for key, path in iteritems(average_tile_paths): + key = int(key) - 1 + + try: + average_tiles[key] = load_average_tile(path) + logging.info('found average tile for channel {0} (zero-indexed)'.format(key)) + except(IOError, OSError, RuntimeError) as err: + average_tiles[key] = None + logging.info('did not find average tile for channel {0} (zero-indexed)'.format(key)) + + return average_tiles + + +def generate_tiles(tiles): + + for tile_params in tiles: + tile = tile_params.copy() + + try: + tile['image'] = read_image(tile['path']) + tile['is_missing'] = False + except (IOError, OSError, RuntimeError) as err: + tile['image'] = None + tile['is_missing'] = True + + tile['channel'] = tile['channel'] - 1 + + tile_obj = Tile(**tile) + del tile + yield tile_obj + + +def write_output(arr, spacing, path): + jpeg_twok.write(arr, path) + + +def main(): + + output_json = args.output_json + output_directory = os.path.dirname(output_json) + + slice_path = os.path.join(output_directory, data['slice_fname']) + + tiles = generate_tiles(data['tiles']) + average_tiles = get_average_tiles(data['average_tile_paths']) + + stitcher = Stitcher(data['image_dimensions'], tiles, average_tiles, data['channels']) + image, missing = stitcher.run() + del tiles + missing_tile_paths = get_missing_tile_paths(missing) + + write_output(np.ascontiguousarray(image), data['spacing'], slice_path) + + module_outputs = {'slice_fname': slice_path, + 'missing_tile_paths': missing_tile_paths} + ju.write(output_json, module_outputs) + + +if __name__ == '__main__': + + logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') + + parser = argparse.ArgumentParser() + parser.add_argument('input_json', type=str) + parser.add_argument('output_json', type=str) + args = parser.parse_args() + + data = ju.read(args.input_json) + + main() diff --git a/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py b/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py new file mode 100644 index 0000000000..78f24909d8 --- /dev/null +++ b/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py @@ -0,0 +1,19 @@ +import logging + +from allensdk.internal.core.lims_pipeline_module import PipelineModule +from allensdk.internal.mouse_connectivity.interval_unionize.run_tissuecyte_unionize_cav import run + + + + +def main(): + + module = PipelineModule() + + input_data = module.input_data() + output_data = run(input_data) + module.write_output_data(output_data) + + +if __name__ == '__main__': + main() diff --git a/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py b/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py new file mode 100644 index 0000000000..1697655641 --- /dev/null +++ b/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py @@ -0,0 +1,17 @@ +import logging + +from allensdk.internal.core.lims_pipeline_module import PipelineModule +from allensdk.internal.mouse_connectivity.interval_unionize.run_tissuecyte_unionize_classic_counts import run + + +def main(): + + module = PipelineModule() + + input_data = module.input_data() + output_data = run(input_data) + module.write_output_data(output_data) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py b/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py new file mode 100644 index 0000000000..2f9bc6aec7 --- /dev/null +++ b/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py @@ -0,0 +1,19 @@ +import logging + +from allensdk.internal.core.lims_pipeline_module import PipelineModule +from allensdk.internal.mouse_connectivity.interval_unionize.run_tissuecyte_unionize_classic import run + + + + +def main(): + + module = PipelineModule() + + input_data = module.input_data() + output_data = run(input_data) + module.write_output_data(output_data) + + +if __name__ == '__main__': + main() diff --git a/model/__init__.py b/model/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/model/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/model/__pycache__/__init__.cpython-37.pyc b/model/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d097cd2cc19371f1180b5bbf5545c65226a27c0e GIT binary patch literal 182 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU-8aXF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=_J~J<~BtBlRpz;=n4N$B!C)EyQ@n;}r0003a BGPD2y literal 0 HcmV?d00001 diff --git a/model/biophys_sim/__init__.py b/model/biophys_sim/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/model/biophys_sim/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/model/biophys_sim/__pycache__/__init__.cpython-37.pyc b/model/biophys_sim/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b40b6963f966edf7b192e55f209b95ce1d9035f7 GIT binary patch literal 194 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU)j!9F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra@4I5Ss2K0Y%qvm`!Vub}c4hYe7^G$+*# K<cQBe%m4tZ%r}() literal 0 HcmV?d00001 diff --git a/model/biophys_sim/__pycache__/bps_command.cpython-37.pyc b/model/biophys_sim/__pycache__/bps_command.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78ce62f15d163f61259e82946290ec0764147302 GIT binary patch literal 1532 zcmYjR&2A($5Vqa!p6;HXWCObp{uEdiF^EhK+*Sy&WD{wnC@X;w&>GS5v^|ra^tc<_ zNj6dE0JAs5JIn|!TsZOwJOKyfE2q4|UZC8Qtm09XtIE|?uCL1TMYkIxSn}5&+0Q+M z{&mXD3PAWANdE(jBaRD{tahA`M)wkr6Ydps<|jTz{0{ed@Ej)rZ}IRsN?Ic1(J@hf zH{MYaah${=nzoa+=!o_lb8<}8GtuT~6Y&^4C2uF)A8N3WO_X#cb^5h$2Ymm4lkO&3 z^muQH^=~h=wI#keOJe!fc~79}8efMP@i$0zFmk`|kR;zC5s0pc=LGJHze4?uE2s_~ zUSZ&UY=hlWj`N9)N0m->KC23m5$6G`1>`{41=4>3GiZT1UgAqqlLg_VM)%MXV^m}H zq4B14;n(gI*NA&i+`b7+YmTPjBI0xcCv)(XHJtiz`n`!4Z3p0lxEPXyy#@9^-8YwB z?JYV@G-|pKxyQqrPS+OeJX+!<6a(5F9s`VRpbkK^!MjU5B$xhWU|y+d?bpHFgSZ{@ zD(|_Q&hbx}BY<G-@Ztkj6hdl#JeZYS6oXM-R!8Rz0t1IcR?cQj@{2W4wyu?jTMx9Q zN1~`Mg6(a$Cy`V#KZOuQ5&|FRh0r!uC-NFf<)BQ$-KUTD(#KD}v=olCa?o2kW4U~R z?_X@3$YWWa$(uBgrGMA9igGf^<-|r4VGckR%F<kpOG`?)Ma9gKZLyJV1iw<bG|F?y zBBmx4QyTo^W>3MOEzy;w8B}d)Q8I2leXebgOYk!`gj(~l&>%s!w24VMGtBzBDsr<b z2?{(ZgpKx|Wuh{9Df=zky2i#v8O%}Y0I(ihJ&9RW0gBCRwYkul%A0R&dle>?Y$j}X zd?GU!s!@MO>OPe4Lhe2sehnAXLw3aYV8qUtJRd%i4B~P2$xz5sJuEBeUk1Es-0&bD z4RvnBcEz$|HWBdcb%%E#p(u84b$I7ihX>WU-N=s0Qj7GK`6IZ8-U5bjOnQXk4hiu+ z9O8AL0LLIx{5tLt^#FV_hrC-p5Cv*p%=;i1cpEjDz^nO%TzUrAUQOoYlEQq#Ji?Q7 z^GFWiA%<gB&Wc={KCy9{!b>cbNmJW`jxb|X-&b1@P`&Hed%!H7S?cg>KwB}FQoRZ6 z5s-Fo7vUaM(AaF4rf%rcH1V6cRnFncjp)^XurB<8YZz=(UCJcdeR{Z`?ms!$>l5XQ zI_$5jF6=heC!<Q0nb2BofI+$cR2!_i-ArMF%FCp#)oH5kI@focD}|9fg*g#Yz3uc+ zNUqOvH`37CT$S=xO>QKVE6j$Uu4d;mr|FM@h0u)<cf9zuFm@8f0qNil@R(5YMpHWh H9)RV4gSDc5 literal 0 HcmV?d00001 diff --git a/model/biophys_sim/__pycache__/config.cpython-37.pyc b/model/biophys_sim/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ce0a577c7279d12055bea1ebd08b89335d8c3f0 GIT binary patch literal 3426 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 R?|n3|MpvkVvD(GY{Vyv`yqW+2 literal 0 HcmV?d00001 diff --git a/model/biophys_sim/bps_command.py b/model/biophys_sim/bps_command.py new file mode 100644 index 0000000000..a10ed523ab --- /dev/null +++ b/model/biophys_sim/bps_command.py @@ -0,0 +1,97 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2014-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import subprocess as sp +import logging +from .config import Config + + +def choose_bps_command(command='bps_simple', conf_file=None): + log = logging.getLogger('allensdk.model.biophys_sim.bps_command') + + log.info("bps command: %s" % (command)) + + if conf_file: + conf_file = os.path.abspath(conf_file) + + if command == 'help': + print(Config().argparser.parse_args(['--help'])) + elif command == 'nrnivmodl': + sp.call(['nrnivmodl', 'modfiles']) + elif command == 'run_simple': + app_config = Config() + description = app_config.load(conf_file) + sys.path.insert(1, description.manifest.get_path('CODE_DIR')) + (module_name, function_name) = description.data[ + 'runs'][0]['main'].split('#') + run_module(description, module_name, function_name) + else: + raise Exception("unknown command %s" % (command)) + + +def run_module(description, module_name, function_name): + m = __import__(module_name, fromlist=[function_name]) + func = getattr(m, function_name) + + func(description) + + +# this module is designed to be called from the bps script, +# which may use nrniv which does not pass in command line arguments +# So the configuration file path must be set in an environment variable. +if __name__ == '__main__': + import sys + conf_file = None + argv = sys.argv + + if len(argv) > 1: + if argv[0] == 'nrniv': + command = 'run_simple' + else: + command = argv[1] + else: + command = 'run_simple' + + if len(argv) > 2 and (argv[-1].endswith('.conf') or + argv[-1].endswith('.json')): + conf_file = argv[-1] + else: + try: + conf_file = os.environ['CONF_FILE'] + except: + pass + + choose_bps_command(command, conf_file) diff --git a/model/biophys_sim/config.py b/model/biophys_sim/config.py new file mode 100644 index 0000000000..896718693a --- /dev/null +++ b/model/biophys_sim/config.py @@ -0,0 +1,127 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import re +import logging +from pkg_resources import resource_filename # @UnresolvedImport +from allensdk.config.app.application_config import ApplicationConfig +from allensdk.config.model.description_parser import DescriptionParser +from allensdk.config.model.description import Description + + +class Config(ApplicationConfig): + _log = logging.getLogger(__name__) + + _DEFAULT_LOG_CONFIG = resource_filename(__name__, 'logging.conf') + + #: A structure that defines the available configuration parameters. + #: The default value and help strings may be seen by viewing the source. + _DEFAULTS = { + 'workdir': {'default': 'workdir', + 'help': 'writable directory where intermediate and output files are written.'}, + 'data_dir': {'default': '', + 'help': 'writable directory where intermediate and output files are written.'}, + 'model_file': {'default': 'config.json', + 'help': 'file where the model parameters are set.'}, + 'main': {'default': 'simulation#run', + 'help': 'module#function that runs the actual simulation'} + } + + def __init__(self): + super(Config, self).__init__(Config._DEFAULTS, + name='biophys', + halp='tools for biophysically detailed modeling at the Allen Institute.', + default_log_config=Config._DEFAULT_LOG_CONFIG) + + def load(self, config_path, + disable_existing_logs=False): + '''Parse the application configuration then immediately load + the model configuration files. + + Parameters + ---------- + disable_existing_logs : boolean, optional + If false (default) leave existing logs after configuration. + ''' + super(Config, self).load([config_path], disable_existing_logs) + description = self.read_model_description() + + return description + + def read_model_description(self): + '''parse the model_file field of the application configuration + and read the files. + + The model_file field of the application configuration is + first split at commas, since it may list more than one file. + + The files may be uris of the form :samp:`file:filename?section=name`, + in which case a bare configuration object is read from filename + into the configuration section with key 'name'. + + A simple filename without a section option + is treated as a standard multi-section configuration file. + + Returns + ------- + description : Description + Configuration object. + ''' + reader = DescriptionParser() + description = Description() + + Config._log.info("model file: %s" % self.model_file) + + # TODO: make space aware w/ regex + for model_file in self.model_file.split(','): + if not model_file.startswith("file:"): + model_file = 'file:' + model_file + + file_regex = re.compile(r"^file:([^?]*)(\?(.*)?)?") + m = file_regex.match(model_file) + model_file = m.group(1) + file_url_params = {} + if m.group(3): + file_url_params.update(((x[0], x[1]) + for x in (y.split('=') + for y in m.group(3).split('&')))) + if 'section' in file_url_params: + section = file_url_params['section'] + else: + section = None + Config._log.info("reading model file %s" % (model_file)) + reader.read(model_file, description, section) + + return description diff --git a/model/biophys_sim/logging.conf b/model/biophys_sim/logging.conf new file mode 100644 index 0000000000..a84a95a961 --- /dev/null +++ b/model/biophys_sim/logging.conf @@ -0,0 +1,36 @@ +# +# See http://docs.python.org/2/howto/logging.html for documentation +# +[loggers] +keys=root,allensdk + +[handlers] +keys=consoleHandler,logFileHandler + +[formatters] +keys=simpleFormatter + +[logger_root] +level=ERROR +handlers=consoleHandler,logFileHandler + +[logger_allensdk] +level=ERROR +#handlers=consoleHandler,logFileHandler +handlers=consoleHandler +qualname=allensdk +propagate=0 + +[handler_consoleHandler] +class=StreamHandler +formatter=simpleFormatter +args=(sys.stdout,) + +[handler_logFileHandler] +class=FileHandler +formatter=simpleFormatter +args=('biophys_sim.log', 'w') + +[formatter_simpleFormatter] +format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s +datefmt=%m-%d %H:%M \ No newline at end of file diff --git a/model/biophys_sim/manifest_default.json b/model/biophys_sim/manifest_default.json new file mode 100644 index 0000000000..6c8283437f --- /dev/null +++ b/model/biophys_sim/manifest_default.json @@ -0,0 +1,88 @@ +/* + * manifest_default.json + */ +{ + "manifest": [ + { "key": "BASEDIR", + "type": "dir", + "spec": "." + }, + { "key": "WORKDIR", + "type": "dir", + "spec": "/work", + "parent_key": "BASEDIR" + }, + { + "key": "connection_statistics_file_path", + "type": "file", + "spec": "connection-statistics.dat", + "parent_key": "WORKDIR" + }, + { + "key": "tuning_variable_connectivity_path", + "type": "file", + "spec": "tuning_variable_connectivity.dat", + "parent_key": "WORKDIR" + }, + { + "key": "total_firing_rate_file_path", + "type": "file", + "spec": "tot_f_rate.dat", + "parent_key": "WORKDIR" + }, + { + "key": "f_rate_dir", + "type": "file", + "spec": "f_rate-cells", + "parent_key": "WORKDIR" + }, + { + "key": "external_inputs_path_name", + "type": "file", + "spec": "external_inputs/cell-%d.dat", + "parent_key": "WORKDIR" + }, + { + "key": "spike_path_name", + "type": "file", + "spec": "spk.dat", + "parent_key": "WORKDIR" + }, + { + "key": "firing_rate_cell_path", + "type": "file", + "spec": "f_rate-cell-%d.dat", + "parent_key": "WORKDIR" + }, + { + "key": "connection_path", + "type": "file", + "spec": "connections.dat", + "parent_key": "WORKDIR" + }, + { + "key": "positions_path", + "type": "file", + "spec": "positions.dat", + "parent_key": "WORKDIR" + }, + { + "key": "voltage_out_cell_path", + "type": "file", + "spec": "v_out-cell-%d.dat", + "parent_key": "WORKDIR" + }, + { + "key": "cluster_error_file", + "type": "file", + "spec": "error.txt", + "parent_key": "WORKDIR" + }, + { + "key": "cluster_output_file", + "type": "file", + "spec": "out.txt", + "parent_key": "WORKDIR" + } + ] +} \ No newline at end of file diff --git a/model/biophys_sim/neuron/__init__.py b/model/biophys_sim/neuron/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/model/biophys_sim/neuron/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/model/biophys_sim/neuron/__pycache__/__init__.cpython-37.pyc b/model/biophys_sim/neuron/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dcfda384a9c69fc953ed6cc73ed031c0b251bce GIT binary patch literal 201 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUq#MVF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra@4I5Ss2FSWENKTkhCJ~J<~BtBlRpz;=n R4NzHWPO2TqEuVpy0RU6kI${6- literal 0 HcmV?d00001 diff --git a/model/biophys_sim/neuron/__pycache__/hoc_utils.cpython-37.pyc b/model/biophys_sim/neuron/__pycache__/hoc_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52a1bc78fcb7968dc9c6fcabe1b5eff99dbcc86d GIT binary patch literal 1575 zcmaJ>&5qkP5GEyAmTd24(`*|ADGD7@v_8apC{PrO{$!ID-9z92Nf!kK2P`epw!E^W zkaW^D<U_G}fIh+oJ++5E5U)KHz4hEvXQ<tvErL>*;c#X&9DXz8{hgg2fl>bS1Mln* z@*6I$MgYP+ApI^dK?E&GO1>t-6aGsgd`Zv!)D!dx83uoV2N`F`uZ9o8Js|xtFiBD> z2zsZ!3@$p7yrO9+ytE4x0mZ@>!Ap|%L`Q@$_k{;>yEZzmvJ;aRdh`2HvXDhBRgx84 z>tt4eRF#J3WnRt`C1+B}GLt$nRWknS<k92tsMkwi92ukX>Dox`mUmwdw_GHLNi|){ z%(x}~@XbPEgvXD@$)d_Gts`eHRr$aE^_f{z<-dQCYXz#qWL1fEA>Xu1YiV~FXC45C z1Mx@s0gz6C3Ba%*TR;(Jy7e1x={1CTjc0sD8Xq`q$P!mx0}=}wy6nK*ff>-g1rdP! zTLg67hFnCi2!+aG1;>iQ4mK=Zwy6&XAI1ucXni=er3;0**uIcDQ+aLjs<hFHm-$R; zV*|krw=w+1W_cmC-G#E4oEP~<GK>}2K+9sLLI~o*Dm>oLL=9m2OFuZAoM@@^gfF-l zP5BF6o=uKQ4iy&sqlqk^>q%A1QfI)cdU2*F5A*3n=SJSGd3MU@68<d;@DQg5fTt`D zrnz%uI$s^M$2!3L*4R#?`pia*VUmn}0x9TyV1!0A@**0-7kNng-sbx8Webk3{4<0K z2OgmV<SO(l2!KA>Vh!jLssvaA=3DRk5or7`$<sSq-vrCfMJW8ne+TXWC9ozJT@y9_ zImPv}_r4_!6~Q^kqSJV%q57`zL<ed{Su8@QQJ@K(rYE{i^CM`wPSY0=RJ(s0{Rbj; z)?dIHJL?YEfY`3+LDl=4oA<fSvqVd?uHBVt`+k)65P7IzRchB6n;S*N1>Q8kFu@up z@9WLm+Hhq|zLLpjiIeq<4~Mp!$wKFAZNujdV(SSr2Y6uo`GxHmZK`@ayrvMlwj&~x zVq~t%0#;OW8|3AzN@LvEb(QtCQR*6c?IF7kEFEYgYt7(cU@NWOLRGBR<rCQA$P5G3 zM^D_yhBa4wrPBzz08ik0uVwJ|5rt3TF_2Dx5vc#3H=uiT-@~5hT@f9iL^n5I_r-r& zeSn=+@|9%F_84m~H^>9Vo~?OtY3VX1AP;7{aMU>fYvZ{z4?&hn-GKdDbg;$R`?8A? zrudJv@$x8_JHqw>kVdztA3%lyeqOZaARYSZHdt)fzI9Ibra(6Ov`zT)I~WbaM*iO) CZG%Dp literal 0 HcmV?d00001 diff --git a/model/biophys_sim/neuron/hoc_utils.py b/model/biophys_sim/neuron/hoc_utils.py new file mode 100644 index 0000000000..9cebec3186 --- /dev/null +++ b/model/biophys_sim/neuron/hoc_utils.py @@ -0,0 +1,95 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging + + +class HocUtils(object): + '''A helper class for containing references to NEUORN. + + Attributes + ---------- + h : object + The NEURON hoc object. + nrn : object + The NEURON python object. + neuron : module + The NEURON module. + ''' + _log = logging.getLogger(__name__) + h = None + nrn = None + neuron = None + + def __init__(self, description): + import neuron + import nrn + + self.h = neuron.h + HocUtils.neuron = neuron + HocUtils.nrn = nrn + HocUtils.h = self.h + + self.description = description + self.manifest = description.manifest + + self.hoc_files = description.data['neuron'][0]['hoc'] + + self.initialize_hoc() + + def initialize_hoc(self): + '''Basic setup for NEURON.''' + h = self.h + params = self.description.data['conditions'][0] + + for hoc_file in self.hoc_files: + HocUtils._log.info("loading hoc file %s" % (hoc_file)) + HocUtils.h.load_file(str(hoc_file)) + + h('starttime = startsw()') + + if 'celsius' in params: + h.celsius = params['celsius'] + + if 'v_init' in params: + h.v_init = params['v_init'] + + if 'dt' in params: + h.dt = params['dt'] + h.steps_per_ms = 1.0 / h.dt + + if 'tstop' in params: + h.tstop = params['tstop'] + h.runStopAt = h.tstop diff --git a/model/biophys_sim/scripts/__init__.py b/model/biophys_sim/scripts/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/model/biophys_sim/scripts/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/model/biophys_sim/scripts/__pycache__/__init__.cpython-37.pyc b/model/biophys_sim/scripts/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70bd5315972b2c562c60ef06b7249612f1af6a11 GIT binary patch literal 202 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU&YQ=F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra@4I5StjIJqdZprlwoK0Y%qvm`!Vub}c4 ShYe6&X-=vg$T6RRm;nHji#pT* literal 0 HcmV?d00001 diff --git a/model/biophys_sim/scripts/bps b/model/biophys_sim/scripts/bps new file mode 100644 index 0000000000..54587fb4e7 --- /dev/null +++ b/model/biophys_sim/scripts/bps @@ -0,0 +1,3 @@ +#!/bin/bash + +python -m allensdk.model.biophys_sim.bps_command $1 $2 diff --git a/model/biophysical/__init__.py b/model/biophysical/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/model/biophysical/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/model/biophysical/__pycache__/__init__.cpython-37.pyc b/model/biophysical/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e38967ce2080cbe0b2a873360c209e79df427f1 GIT binary patch literal 194 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU)j!9F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra>ZIWb2+K0Y%qvm`!Vub}c4hYe7^G$+*# K<cQBe%m4tX;x~o> literal 0 HcmV?d00001 diff --git a/model/biophysical/__pycache__/run_simulate.cpython-37.pyc b/model/biophysical/__pycache__/run_simulate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a3a26a17255af4bc4e9edfb4794c334bea28174 GIT binary patch literal 3445 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 literal 0 HcmV?d00001 diff --git a/model/biophysical/__pycache__/runner.cpython-37.pyc b/model/biophysical/__pycache__/runner.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e2fe8938c8f594ad34360b7c5f3b1c6cb0d1822 GIT binary patch literal 6212 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 NDApkA&^Zd}{{WnE!MFeb literal 0 HcmV?d00001 diff --git a/model/biophysical/__pycache__/utils.cpython-37.pyc b/model/biophysical/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99d500266e0dabc2855f88d779afa299c45032f7 GIT binary patch literal 11520 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 Mm{oi7J6h|10Jh$T+yDRo literal 0 HcmV?d00001 diff --git a/model/biophysical/logging.conf b/model/biophysical/logging.conf new file mode 100644 index 0000000000..d280fcbc39 --- /dev/null +++ b/model/biophysical/logging.conf @@ -0,0 +1,35 @@ +[loggers] +keys=root,allensdk + +[handlers] +keys=consoleHandler,logFileHandler + +[formatters] +keys=simpleFormatter + +[logger_root] +level=DEBUG +handlers=logFileHandler +propagate=0 +disabled=1 + +[logger_allensdk] +level=DEBUG +handlers=logFileHandler +qualname=allensdk +propagate=0 + +[handler_consoleHandler] +class=StreamHandler +level=DEBUG +formatter=simpleFormatter +args=(sys.stdout,) + +[handler_logFileHandler] +class=FileHandler +formatter=simpleFormatter +args=('allen_sdk_biophysical_perisomatic.log', 'w') + +[formatter_simpleFormatter] +format=%(asctime)s {%(pathname)s:%(lineno)d} %(name)-12s %(levelname)-8s %(message)s +datefmt=%m-%d %H:%M diff --git a/model/biophysical/run_simulate.py b/model/biophysical/run_simulate.py new file mode 100644 index 0000000000..b04f9f684d --- /dev/null +++ b/model/biophysical/run_simulate.py @@ -0,0 +1,140 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from . import runner as single_cell +import logging +import os +import sys +import traceback +import subprocess +import logging.config as lc +from ..biophys_sim.config import Config +from pkg_resources import resource_filename # @UnresolvedImport + + +class RunSimulate(object): + _log = logging.getLogger('allensdk.model.biophysical.run_simulate') + + def __init__(self, + input_json, + output_json): + self.input_json = input_json + self.output_json = output_json + self.app_config = None + self.manifest = None + + def load_manifest(self): + self.app_config = Config().load(self.input_json) + self.manifest = self.app_config.manifest + fix_sections = ['passive', 'axon_morph,', 'conditions', 'fitting'] + self.app_config.fix_unary_sections(fix_sections) + + def nrnivmodl(self): + RunSimulate._log.debug("nrnivmodl") + + subprocess.call(['nrnivmodl', './modfiles']) + + def simulate(self): + from allensdk.internal.api.queries.biophysical_module_reader \ + import BiophysicalModuleReader + + self.load_manifest() + + try: + stimulus_path = self.manifest.get_path('stimulus_path') + RunSimulate._log.info("stimulus path: %s" % (stimulus_path)) + except: + raise Exception( + 'Could not read input stimulus path from input config.') + + try: + out_path = self.manifest.get_path('output_path') + RunSimulate._log.info("result NWB file: %s" % (out_path)) + except: + raise Exception('Could not read output path from input config.') + + try: + morphology_path = self.manifest.get_path('MORPHOLOGY') + RunSimulate._log.info("morphology path: %s" % (morphology_path)) + except: + raise Exception( + 'Could not read morphology path from input config.') + + single_cell.run(self.app_config) + + lims_upload_config = BiophysicalModuleReader() + lims_upload_config.read_json( + self.manifest.get_path('neuronal_model_run_data')) + lims_upload_config.update_well_known_file(out_path) + lims_upload_config.set_workflow_state('passed') + lims_upload_config.write_file(self.output_json) + + +def main(command, lims_strategy_json, lims_response_json): + ''' Entry point for module. + :param command: select behavior, nrnivmodl or simulate + :type command: string + :param lims_strategy_json: path to json file output from lims. + :type lims_strategy_json: string + :param lims_response_json: path to json file returned to lims. + :type lims_response_json: string + ''' + rs = RunSimulate(lims_strategy_json, + lims_response_json) + + RunSimulate._log.debug("command: %s" % (command)) + RunSimulate._log.debug("lims strategy json: %s" % (lims_strategy_json)) + RunSimulate._log.debug("lims upload json: %s" % (lims_response_json)) + + log_config = resource_filename('allensdk.model.biophysical.run_simulate', + 'logging.conf') + lc.fileConfig(log_config) + os.environ['LOG_CFG'] = log_config + + if 'nrnivmodl' == command: + rs.nrnivmodl() + else: + rs.simulate() + + +if __name__ == '__main__': + command, input_json, output_json = sys.argv[-3:] + + try: + main(command, input_json, output_json) + RunSimulate._log.debug("success") + except Exception as e: + RunSimulate._log.error(traceback.format_exc()) + exit(1) diff --git a/model/biophysical/runner.py b/model/biophysical/runner.py new file mode 100644 index 0000000000..87ec93ef8b --- /dev/null +++ b/model/biophysical/runner.py @@ -0,0 +1,240 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from ..biophys_sim.config import Config +from .utils import create_utils +from allensdk.core.nwb_data_set import NwbDataSet +import allensdk.ephys.extract_cell_features as extract_cell_features +from shutil import copy +import numpy +import logging +import time +import os +import multiprocessing as mp +from functools import partial +import argschema as ags +import argparse + +_runner_log = logging.getLogger('allensdk.model.biophysical.runner') + +_lock = None + +def _init_lock(lock): + global _lock + _lock = lock + +def run(args, sweeps=None, procs=6): + '''Main function for simulating sweeps in a biophysical experiment. + + Parameters + ---------- + args : dict + Parsed arguments to run the experiment. + procs : int + number of sweeps to simulate simultaneously. + sweeps : list + list of experiment sweep numbers to simulate. If None, simulate all sweeps. + ''' + + description = load_description(args) + + prepare_nwb_output(description.manifest.get_path('stimulus_path'), + description.manifest.get_path('output_path')) + + if procs == 1: + run_sync(description, sweeps) + return + + if sweeps is None: + stimulus_path = description.manifest.get_path('stimulus_path') + run_params = description.data['runs'][0] + sweeps = run_params['sweeps'] + + lock = mp.Lock() + pool = mp.Pool(procs, initializer=_init_lock, initargs=(lock,)) + pool.map(partial(run_sync, description), [[sweep] for sweep in sweeps]) + pool.close() + pool.join() + + +def run_sync(description, sweeps=None): + '''Single-process main function for simulating sweeps in a biophysical experiment. + + Parameters + ---------- + description : Config + All information needed to run the experiment. + sweeps : list + list of experiment sweep numbers to simulate. If None, simulate all sweeps. + ''' + + # configure NEURON + utils = create_utils(description) + h = utils.h + + # configure model + manifest = description.manifest + morphology_path = description.manifest.get_path('MORPHOLOGY').encode('ascii', 'ignore') + morphology_path = morphology_path.decode("utf-8") + utils.generate_morphology(morphology_path) + utils.load_cell_parameters() + + # configure stimulus and recording + stimulus_path = description.manifest.get_path('stimulus_path') + run_params = description.data['runs'][0] + if sweeps is None: + sweeps = run_params['sweeps'] + sweeps_by_type = run_params['sweeps_by_type'] + + output_path = manifest.get_path("output_path") + + # run sweeps + for sweep in sweeps: + _runner_log.info("Loading sweep: %d" % (sweep)) + utils.setup_iclamp(stimulus_path, sweep=sweep) + + _runner_log.info("Simulating sweep: %d" % (sweep)) + vec = utils.record_values() + tstart = time.time() + h.finitialize() + h.run() + tstop = time.time() + _runner_log.info("Time: %f" % (tstop - tstart)) + + # write to an NWB File + _runner_log.info("Writing sweep: %d" % (sweep)) + recorded_data = utils.get_recorded_data(vec) + + if _lock is not None: + _lock.acquire() + save_nwb(output_path, recorded_data["v"], sweep, sweeps_by_type) + if _lock is not None: + _lock.release() + + +def prepare_nwb_output(nwb_stimulus_path, + nwb_result_path): + '''Copy the stimulus file, zero out the recorded voltages and spike times. + + Parameters + ---------- + nwb_stimulus_path : string + NWB file name + nwb_result_path : string + NWB file name + ''' + + output_dir = os.path.dirname(nwb_result_path) + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + copy(nwb_stimulus_path, nwb_result_path) + data_set = NwbDataSet(nwb_result_path) + data_set.fill_sweep_responses(0.0, extend_experiment=True) + for sweep in data_set.get_sweep_numbers(): + data_set.set_spike_times(sweep, []) + + +def save_nwb(output_path, v, sweep, sweeps_by_type): + '''Save a single voltage output result into an existing sweep in a NWB file. + This is intended to overwrite a recorded trace with a simulated voltage. + + Parameters + ---------- + output_path : string + file name of a pre-existing NWB file. + v : numpy array + voltage + sweep : integer + which entry to overwrite in the file. + ''' + output = NwbDataSet(output_path) + output.set_sweep(sweep, None, v) + + sweep_by_type = {t: [sweep] + for t, ss in sweeps_by_type.items() if sweep in ss} + sweep_features = extract_cell_features.extract_sweep_features(output, + sweep_by_type) + try: + spikes = sweep_features[sweep]['spikes'] + spike_times = [s['threshold_t'] for s in spikes] + output.set_spike_times(sweep, spike_times) + except Exception as e: + logging.info("sweep %d has no sweep features. %s" % (sweep, e.args)) + + +def load_description(args_dict): + '''Read configurations. + + Parameters + ---------- + args_dict : dict + Parsed arguments dictionary with following keys. + + manifest_file : string + .json file with containing the experiment configuration + axon_type : string + Axon handling for the all-active models + + Returns + ------- + Config + Object with all information needed to run the experiment. + ''' + manifest_json_path = args_dict['manifest_file'] + + description = Config().load(manifest_json_path) + + # For newest all-active models update the axon replacement + axon_replacement_dict = {'axon_type': args_dict.get('axon_type', 'truncated')} + description.update_data(axon_replacement_dict, 'biophys') + + # fix nonstandard description sections + fix_sections = ['passive', 'axon_morph,', 'conditions', 'fitting'] + description.fix_unary_sections(fix_sections) + + return description + + +# Create the parser +sim_parser = argparse.ArgumentParser(description='Run simulation for biophysical models with the provided configuration') +sim_parser.add_argument('manifest_file', + help='.json configurations for running the simulations') +sim_parser.add_argument('--axon_type', default='truncated', choices=['stub', 'truncated'], + help='axon replacement for all-active models; truncated: truncate reconstructed axon after 60 micron, stub: replace reconstructed axon with a uniform stub 60 micron long and 1 micron in diameter') + +if '__main__' == __name__: + schema = sim_parser.parse_args() + run(vars(schema)) diff --git a/model/biophysical/utils.py b/model/biophysical/utils.py new file mode 100644 index 0000000000..aea22c90ec --- /dev/null +++ b/model/biophysical/utils.py @@ -0,0 +1,451 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +import os +from ..biophys_sim.neuron.hoc_utils import HocUtils +from allensdk.core.nwb_data_set import NwbDataSet +from fractions import gcd +from skimage.measure import block_reduce +import scipy.interpolate +import numpy as np +from pkg_resources import resource_filename #@UnresolvedImport + +PERISOMATIC_TYPE = "Biophysical - perisomatic" +ALL_ACTIVE_TYPE = "Biophysical - all active" + + +def create_utils(description, model_type=None): + ''' Factory method to create a Utils subclass. + + Parameters + ---------- + description : Config instance + used to initialize Utils subclass + + model_type : string + Must be one of [PERISOMATIC_TYPE, ALL_ACTIVE_TYPE]. If none, defaults to PERISOMATIC_TYPE + + Returns + ------- + Utils instance + ''' + + + + if model_type is None: + try: + model_type = description.data['biophys'][0]['model_type'] + except KeyError as e: + logging.error("Could not infer model type from description") + + axon_type = description.data['biophys'][1]['axon_type'] + + if model_type == PERISOMATIC_TYPE: + return Utils(description) + elif model_type == ALL_ACTIVE_TYPE: + return AllActiveUtils(description, axon_type) + + +class Utils(HocUtils): + '''A helper class for NEURON functionality needed for + biophysical simulations. + + Attributes + ---------- + h : object + The NEURON hoc object. + nrn : object + The NEURON python object. + neuron : module + The NEURON module. + ''' + + _log = logging.getLogger(__name__) + + def __init__(self, description): + self.update_default_cell_hoc(description) + + super(Utils, self).__init__(description) + self.stim = None + self.stim_curr = None + self.simulation_sampling_rate = None + self.stimulus_sampling_rate = None + + self.stim_vec_list = [] + + + def update_default_cell_hoc(self, description, default_cell_hoc='cell.hoc'): + ''' replace the default 'cell.hoc' path in the manifest with 'cell.hoc' packaged + within AllenSDK if it does not exist ''' + + hoc_files = description.data['neuron'][0]['hoc'] + try: + hfi = hoc_files.index(default_cell_hoc) + + if not os.path.exists(default_cell_hoc): + abspath_ch = resource_filename(__name__, + default_cell_hoc) + hoc_files[hfi] = abspath_ch + + if not os.path.exists(abspath_ch): + raise IOError("cell.hoc does not exist!") + + self._log.warning("Using cell.hoc from the following location: %s", abspath_ch) + except ValueError as e: + pass + + + def generate_morphology(self, morph_filename): + '''Load a swc-format cell morphology file. + + Parameters + ---------- + morph_filename : string + Path to swc. + ''' + h = self.h + + swc = self.h.Import3d_SWC_read() + swc.input(morph_filename) + imprt = self.h.Import3d_GUI(swc, 0) + + h("objref this") + imprt.instantiate(h.this) + + h("soma[0] area(0.5)") + for sec in h.allsec(): + sec.nseg = 1 + 2 * int(sec.L / 40.0) + if sec.name()[:4] == "axon": + h.delete_section(sec=sec) + h('create axon[2]') + for sec in h.axon: + sec.L = 30 + sec.diam = 1 + sec.nseg = 1 + 2 * int(sec.L / 40.0) + h.axon[0].connect(h.soma[0], 0.5, 0.0) + h.axon[1].connect(h.axon[0], 1.0, 0.0) + + h.define_shape() + + def load_cell_parameters(self): + '''Configure a neuron after the cell morphology has been loaded.''' + passive = self.description.data['passive'][0] + genome = self.description.data['genome'] + conditions = self.description.data['conditions'][0] + h = self.h + + h("access soma") + + # Set fixed passive properties + for sec in h.allsec(): + sec.Ra = passive['ra'] + sec.insert('pas') + for seg in sec: + seg.pas.e = passive["e_pas"] + + for c in passive["cm"]: + h('forsec "' + c["section"] + '" { cm = %g }' % c["cm"]) + + # Insert channels and set parameters + for p in genome: + if p["section"] == "glob": # global parameter + h(p["name"] + " = %g " % p["value"]) + else: + if p["mechanism"] != "": + h('forsec "' + p["section"] + + '" { insert ' + p["mechanism"] + ' }') + h('forsec "' + p["section"] + + '" { ' + p["name"] + ' = %g }' % p["value"]) + + # Set reversal potentials + for erev in conditions['erev']: + h('forsec "' + erev["section"] + '" { ek = %g }' % erev["ek"]) + h('forsec "' + erev["section"] + '" { ena = %g }' % erev["ena"]) + + def setup_iclamp(self, + stimulus_path, + sweep=0): + '''Assign a current waveform as input stimulus. + + Parameters + ---------- + stimulus_path : string + NWB file name + ''' + self.stim = self.h.IClamp(self.h.soma[0](0.5)) + self.stim.amp = 0 + self.stim.delay = 0 + # just set to be really big; doesn't need to match the waveform + self.stim.dur = 1e12 + + self.read_stimulus(stimulus_path, sweep=sweep) + + # NEURON's dt is in milliseconds + simulation_dt = 1.0e3 / self.simulation_sampling_rate + stimulus_dt = 1.0e3 / self.stimulus_sampling_rate + self._log.debug("Using simulation dt %f, stimulus dt %f", simulation_dt, stimulus_dt) + + self.h.dt = simulation_dt + stim_vec = self.h.Vector(self.stim_curr) + stim_vec.play(self.stim._ref_amp, stimulus_dt) + + stimulus_stop_index = len(self.stim_curr) - 1 + self.h.tstop = stimulus_stop_index * stimulus_dt + self.stim_vec_list.append(stim_vec) + + def read_stimulus(self, stimulus_path, sweep=0): + '''Load current values for a specific experiment sweep and setup simulation + and stimulus sampling rates. + + NOTE: NEURON only allows simulation timestamps of multiples of 40KHz. To + avoid aliasing, we set the simulation sampling rate to the least common + multiple of the stimulus sampling rate and 40KHz. + + Parameters + ---------- + stimulus path : string + NWB file name + sweep : integer, optional + sweep index + ''' + Utils._log.info( + "reading stimulus path: %s, sweep %s", + stimulus_path, + sweep) + + stimulus_data = NwbDataSet(stimulus_path) + sweep_data = stimulus_data.get_sweep(sweep) + + # convert to nA for NEURON + self.stim_curr = sweep_data['stimulus'] * 1.0e9 + + # convert from Hz + hz = int(sweep_data['sampling_rate']) + neuron_hz = Utils.nearest_neuron_sampling_rate(hz) + + self.simulation_sampling_rate = neuron_hz + self.stimulus_sampling_rate = hz + + if hz != neuron_hz: + Utils._log.debug("changing sampling rate from %d to %d to avoid NEURON aliasing", hz, neuron_hz) + + def record_values(self): + '''Set up output voltage recording.''' + vec = {"v": self.h.Vector(), + "t": self.h.Vector()} + + vec["v"].record(self.h.soma[0](0.5)._ref_v) + vec["t"].record(self.h._ref_t) + + return vec + + def get_recorded_data(self, vec): + '''Extract recorded voltages and timestamps given the recorded Vector instance. + If self.stimulus_sampling_rate is smaller than self.simulation_sampling_rate, + resample to self.stimulus_sampling_rate. + + Parameters + ---------- + vec : neuron.Vector + constructed by self.record_values + + Returns + ------- + dict with two keys: 'v' = numpy.ndarray with voltages, 't' = numpy.ndarray with timestamps + + ''' + junction_potential = self.description.data['fitting'][0]['junction_potential'] + + v = np.array(vec["v"]) + t = np.array(vec["t"]) + + if self.stimulus_sampling_rate < self.simulation_sampling_rate: + factor = self.simulation_sampling_rate / self.stimulus_sampling_rate + + Utils._log.debug("subsampling recorded traces by %dX", factor) + v = block_reduce(v, (factor,), np.mean)[:len(self.stim_curr)] + t = block_reduce(t, (factor,), np.min)[:len(self.stim_curr)] + + mV = 1.0e-3 + v = (v - junction_potential) * mV + + return { "v": v, "t": t } + + @staticmethod + def nearest_neuron_sampling_rate(hz, target_hz=40000): + div = gcd(hz, target_hz) + new_hz = hz * target_hz / div + return new_hz + + +class AllActiveUtils(Utils): + + def __init__(self, description, axon_type): + """ + Parameters + ---------- + description : Config + Configuration to run the simulation + axon_type : string + truncated - diameter of the axon segments is read from .swc (default) + stub - diameter of axon segments is 1 micron + How the axon is replaced within NEURON + + """ + super(AllActiveUtils, self).__init__(description) + self.axon_type = axon_type + + def generate_morphology(self, morph_filename): + '''Load a neurolucida or swc-format cell morphology file. + + Parameters + ---------- + morph_filename : string + Path to morphology. + ''' + if self.axon_type == 'stub': + self._log.info('Replacing axon with a stub : length 60 micron, diameter 1 micron') + super(AllActiveUtils, self).generate_morphology(morph_filename) + return + + self._log.info('Legacy model - Truncating reconstructed axon after 60 micron') + morph_basename = os.path.basename(morph_filename) + morph_extension = morph_basename.split('.')[-1] + if morph_extension.lower() == 'swc': + morph = self.h.Import3d_SWC_read() + elif morph_extension.lower() == 'asc': + morph = self.h.Import3d_Neurolucida3() + else: + raise Exception("Unknown filetype: %s" % morph_extension) + + morph.input(morph_filename) + imprt = self.h.Import3d_GUI(morph, 0) + + self.h("objref this") + imprt.instantiate(self.h.this) + + for sec in self.h.allsec(): + sec.nseg = 1 + 2 * int(sec.L / 40.0) + + self.h("soma[0] area(0.5)") + axon_diams = [self.h.axon[0].diam, self.h.axon[0].diam] + self.h.distance(sec=self.h.soma[0]) + for sec in self.h.allsec(): + if sec.name()[:4] == "axon": + if self.h.distance(0.5, sec=sec) > 60: + axon_diams[1] = sec.diam + break + for sec in self.h.allsec(): + if sec.name()[:4] == "axon": + self.h.delete_section(sec=sec) + self.h('create axon[2]') + for index, sec in enumerate(self.h.axon): + sec.L = 30 + sec.diam = axon_diams[index] + + for sec in self.h.allsec(): + sec.nseg = 1 + 2 * int(sec.L / 40.0) + + self.h.axon[0].connect(self.h.soma[0], 1.0, 0.0) + self.h.axon[1].connect(self.h.axon[0], 1.0, 0.0) + + # make sure diam reflects 3d points + self.h.area(.5, sec=self.h.soma[0]) + + def load_cell_parameters(self): + '''Configure a neuron after the cell morphology has been loaded.''' + passive = self.description.data['passive'][0] + genome = self.description.data['genome'] + conditions = self.description.data['conditions'][0] + h = self.h + + h("access soma") + + # Set fixed passive properties + for sec in h.allsec(): + sec.Ra = passive['ra'] + sec.insert('pas') + # for seg in sec: + # seg.pas.e = passive["e_pas"] + + # for c in passive["cm"]: + # h('forsec "' + c["section"] + '" { cm = %g }' % c["cm"]) + + # Insert channels and set parameters + for p in genome: + section_array = p["section"] + mechanism = p["mechanism"] + param_name = p["name"] + param_value = float(p["value"]) + if section_array == "glob": # global parameter + h(p["name"] + " = %g " % p["value"]) + else: + if hasattr(h, section_array): + if mechanism != "": + print('Adding mechanism %s to %s' + % (mechanism, section_array)) + for section in getattr(h, section_array): + if self.h.ismembrane(str(mechanism), + sec=section) != 1: + section.insert(mechanism) + + print('Setting %s to %.6g in %s' + % (param_name, param_value, section_array)) + for section in getattr(h, section_array): + setattr(section, param_name, param_value) + + # Set reversal potentials + for erev in conditions['erev']: + erev_section_array = erev["section"] + ek = float(erev["ek"]) + ena = float(erev["ena"]) + + print('Setting ek to %.6g and ena to %.6g in %s' + % (ek, ena, erev_section_array)) + + if hasattr(h, erev_section_array): + for section in getattr(h, erev_section_array): + if self.h.ismembrane("k_ion", sec=section) == 1: + setattr(section, 'ek', ek) + + if self.h.ismembrane("na_ion", sec=section) == 1: + setattr(section, 'ena', ena) + else: + print("Warning: can't set erev for %s, " + "section array doesn't exist" % erev_section_array) + + self.h.v_init = conditions['v_init'] + self.h.celsius = conditions['celsius'] diff --git a/model/glif/__init__.py b/model/glif/__init__.py new file mode 100644 index 0000000000..6ef7424a26 --- /dev/null +++ b/model/glif/__init__.py @@ -0,0 +1,39 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +""" A Generalized Linear Integrate and Fire (GLIF) neuron modeling package. +Use this code to run the GLIF models available in the Allen Cell Types Atlas. +See :doc:`glif_models` for more details. +""" diff --git a/model/glif/__pycache__/__init__.cpython-37.pyc b/model/glif/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f942a80d22d5e038ed63b4f05a34dce334911dc GIT binary patch literal 391 zcmXv}!A=4}3>~;gNce}|l!MDbPsA8k5(o+Lf?mufL)j_Igt4=kSuo4ZZ}H?`_#IsR z1aF?~f;MT>_Pw^R_q|?MiShdzUU!uGYKnhrNpdG11yDvkE7O{*etZ83DNKkdptE~2 zFtbb;V9FI00V@Jz17jNqE+(_-xDQO*;2B=LA!oUO67vlflysjWLAACKa)F@o5VkB0 zf@bc-kAOS04wsI=p1{;OVi=Kg@K~1=A*~$7q&p{qq4D`}Q8>HO$8&K3D<5Q)s4-N@ zCLuobTZc2Pg{t+33T=7s7=FxXn2DwkGhCxdmiUTXXDMUu+2B=1yo;GHiDNF&m+Lxa tGrP>9t?2UaE17NdMY9<k6$~0N1FbFFO6#Po51ktUwvKMk<?y$-`UUZgd@KL} literal 0 HcmV?d00001 diff --git a/model/glif/__pycache__/glif_neuron.cpython-37.pyc b/model/glif/__pycache__/glif_neuron.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de5e7147b3d489552075037350160aec88aa59f4 GIT binary patch literal 14543 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 a$XdjaW$4Q|(pHRmvHlZ{{w|e^^!MMdFw|rK literal 0 HcmV?d00001 diff --git a/model/glif/__pycache__/glif_neuron_methods.cpython-37.pyc b/model/glif/__pycache__/glif_neuron_methods.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe5d3de5af6ec0e662d47ae01b838f36294f7b1a GIT binary patch literal 17142 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 A8vp<R literal 0 HcmV?d00001 diff --git a/model/glif/__pycache__/simulate_neuron.cpython-37.pyc b/model/glif/__pycache__/simulate_neuron.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b84077ae06195ec2a7a91df07812a9120df19536 GIT binary patch literal 4576 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 a&F*EhLAT{tUdvnZ8eY>|^=jVtJ>!2BVCA_0 literal 0 HcmV?d00001 diff --git a/model/glif/glif_neuron.py b/model/glif/glif_neuron.py new file mode 100644 index 0000000000..c29c6343b5 --- /dev/null +++ b/model/glif/glif_neuron.py @@ -0,0 +1,500 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging + +import numpy as np +import simplejson as json +import allensdk.core.json_utilities as ju +import copy + +try: + from glif_neuron_methods import GlifNeuronMethod, METHOD_LIBRARY +except: + from .glif_neuron_methods import GlifNeuronMethod, METHOD_LIBRARY + +class GlifBadResetException( Exception ): + """ Exception raised when voltage is still above threshold after a reset rule is applied. """ + def __init__(self, message, dv): + super(Exception, self).__init__(message) + self.dv = dv + +class GlifNeuron( object ): + """ Implements the current-based Mihalas Neiber GLIF neuron. Simulations model the voltage, + threshold, and afterspike currents of a neuron given an input stimulus. A set of modular dynamics + rules are applied until voltage crosses threshold, at which point a set of modular reset rules are + applied. See glif_neuron_methods.py for a list of what options there are for voltage, threshold, and + afterspike current dynamics and reset rules. + + Parameters + ---------- + El : float + resting potential + dt : float + duration between time steps + asc_tau_array: np.ndarray + TODO + R_input : float + input resistance + C : float + capacitance + asc_amp_arrap : np.ndarray + afterspike current vector. one element per element of asc_tau_array. + spike_cut_length : int + how many time steps to replace with NaNs when a spike occurs. + th_inf : float + instantaneous threshold + coeffs : dict + dictionary coefficients premultiplied to neuron properties during simulation. used for optimization. + AScurrent_dynamics_method : dict + dictionary containing the 'name' of the afterspike current dynamics method to use and a 'params' dictionary parameters to pass to that function. + voltage_dynamics_method : dict + dictionary containing the 'name' of the voltage dynamics method to use and a 'params' dictionary parameters to pass to that function. + threshold_dynamics_method : dict + dictionary containing the 'name' of the threshold dynamics method to use and a 'params' dictionary parameters to pass to that function. + AScurrent_reset_method : dict + dictionary containing the 'name' of the afterspike current dynamics method to use and a 'params' dictionary parameters to pass to that function. + voltage_reset_method : dict + dictionary containing the 'name' of the voltage dynamics method to use and a 'params' dictionary parameters to pass to that function. + threshold_reset_method : dict + dictionary containing the 'name' of the threshold dynamics method to use and a 'params' dictionary parameters to pass to that function. + init_voltage : float + initial voltage value + init_threshold : float + initial spike threshold value + init_AScurrents : np.ndarray + initial afterspike current vector. one element per element of asc_tau_array. + """ + + TYPE = "GLIF" + + def __init__(self, El, dt, asc_tau_array, R_input, C, asc_amp_array, spike_cut_length, th_inf, th_adapt, coeffs, + AScurrent_dynamics_method, voltage_dynamics_method, threshold_dynamics_method, + AScurrent_reset_method, voltage_reset_method, threshold_reset_method, + init_voltage, init_threshold, init_AScurrents, **kwargs): + + """ Initialize the neuron.""" + + self.type = GlifNeuron.TYPE + self.El = El + self.dt = dt + self.asc_tau_array = np.array(asc_tau_array) + + self.R_input = R_input + self.C = C + + self.asc_amp_array = np.array(asc_amp_array) + self.spike_cut_length = int(spike_cut_length) + self.th_inf = th_inf + self.th_adapt = th_adapt + + self.threshold_components = None + + self.init_voltage = init_voltage + self.init_threshold = init_threshold + self.init_AScurrents = init_AScurrents + + assert len(asc_tau_array) == len(asc_amp_array), Exception("After-spike current vector must have same length as asc_tau_array (%d vs %d)" % (asc_amp_array, asc_tau_array)) + assert len(self.init_AScurrents) == len(self.asc_tau_array), Exception("init_AScurrents length (%d) must have same length as asc_tau_array (%d)" % (len(self.init_AScurrents), len(self.asc_tau_array))) + + + # values computed based on inputs + self.k = 1.0 / self.asc_tau_array + self.G = 1.0 / self.R_input + + # Values that can be fit: They scale the input values. + # These are allowed to have default values because they are going to get optimized. + self.coeffs = { + 'th_inf': 1, + 'C': 1, + 'G': 1, + 'b': 1, + 'a': 1, + 'asc_amp_array': np.ones(len(self.asc_tau_array)) + } + + self.coeffs.update(coeffs) + + logging.debug('spike cut length: %d' % self.spike_cut_length) + + # initialize dynamics methods + self.AScurrent_dynamics_method = self.configure_library_method('AScurrent_dynamics_method', AScurrent_dynamics_method) + self.voltage_dynamics_method = self.configure_library_method('voltage_dynamics_method', voltage_dynamics_method) + self.threshold_dynamics_method = self.configure_library_method('threshold_dynamics_method', threshold_dynamics_method) + + # initialize reset methods + self.AScurrent_reset_method = self.configure_library_method('AScurrent_reset_method', AScurrent_reset_method) + self.voltage_reset_method = self.configure_library_method('voltage_reset_method', voltage_reset_method) + self.threshold_reset_method = self.configure_library_method('threshold_reset_method', threshold_reset_method) + + def __str__(self): + return json.dumps(self.to_dict(), default=ju.json_handler, indent=2) + + @property + def tau_m(self): + return self.R_input*self.C + + @classmethod + def from_dict(cls, d): + return cls(El = d['El'], + dt = d['dt'], + asc_tau_array = d['asc_tau_array'], + R_input = d['R_input'], + C = d['C'], + asc_amp_array = d['asc_amp_array'], + spike_cut_length = d['spike_cut_length'], + th_inf = d['th_inf'], + th_adapt = d['th_adapt'], + coeffs = d.get('coeffs', {}), + AScurrent_dynamics_method = d['AScurrent_dynamics_method'], + voltage_dynamics_method = d['voltage_dynamics_method'], + threshold_dynamics_method = d['threshold_dynamics_method'], + voltage_reset_method = d['voltage_reset_method'], + AScurrent_reset_method = d['AScurrent_reset_method'], + threshold_reset_method = d['threshold_reset_method'], + init_voltage = d['init_voltage'], + init_threshold = d['init_threshold'], + init_AScurrents = d['init_AScurrents']) + + def to_dict(self): + """ Convert the neuron to a serializable dictionary. """ + return { + 'type': self.type, + 'El': self.El, + 'dt': self.dt, + 'asc_tau_array': copy.deepcopy(self.asc_tau_array), + 'R_input': self.R_input, + 'C': self.C, + 'asc_amp_array': copy.deepcopy(self.asc_amp_array), + 'spike_cut_length': self.spike_cut_length, + 'th_inf': self.th_inf, + 'th_adapt': self.th_adapt, + 'coeffs': copy.deepcopy(self.coeffs), + 'AScurrent_dynamics_method': copy.deepcopy(self.AScurrent_dynamics_method), + 'voltage_dynamics_method': copy.deepcopy(self.voltage_dynamics_method), + 'threshold_dynamics_method': copy.deepcopy(self.threshold_dynamics_method), + 'AScurrent_reset_method': copy.deepcopy(self.AScurrent_reset_method), + 'voltage_reset_method': copy.deepcopy(self.voltage_reset_method), + 'threshold_reset_method': copy.deepcopy(self.threshold_reset_method), + 'init_voltage': self.init_voltage, + 'init_threshold': self.init_threshold, + 'init_AScurrents': copy.deepcopy(self.init_AScurrents), + 'El_reference': self.El + } + + @staticmethod + def configure_method(method_name, method, method_params): + """ Create a GlifNeuronMethod instance given a name, a function, and function parameters. + This is just a shortcut to the GlifNeuronMethod constructor. + + Parameters + ---------- + method_name : string + name for refering to this method later + method : function + a python function + method_parameters : dict + function arguments whose values should be fixed + + Returns + ------- + GlifNeuronMethod + a GlifNeuronMethod instance + """ + + return GlifNeuronMethod(method_name, method, method_params) + + @staticmethod + def configure_library_method(method_type, params): + """ Create a GlifNeuronMethod instance out of a library of functions organized by type name. + This refers to the METHOD_LIBRARY in glif_neuron_methods.py, which lays out the available functions + that can be used for dynamics and reset rules. + + Parameters + ---------- + method_type : string + the name of a function category (e.g. 'AScurrent_dynamics_method' for the afterspike current dynamics methods) + params : dict + a dictionary with two members. 'name': the string name of function you want, and 'params': parameters you want to pass to that function + + Returns + ------- + GlifNeuronMethod + a GlifNeuronMethod instance + """ + method_options = METHOD_LIBRARY.get(method_type, None) + + assert method_options is not None, Exception("Unknown method type (%s)" % method_type) + + method_name = params.get('name', None) + method_params = params.get('params', None) + + assert method_name is not None, Exception("Method configuration for %s has no 'name'" % (method_type)) + assert method_params is not None, Exception("Method configuration for %s has no 'params'" % (method_params)) + + method = method_options.get(method_name, None) + + assert method is not None, Exception("unknown method name %s of type %s" % (method_name, method_type)) + + return GlifNeuron.configure_method(method_name, method, method_params) + + def dynamics(self, voltage_t0, threshold_t0, AScurrents_t0, inj, time_step, spike_time_steps): + """ Update the voltage, threshold, and afterspike currents of the neuron for a single time step. + + Parameters + ---------- + voltage_t0 : float + the current voltage of the neuron + threshold_t0 : float + the current spike threshold level of the neuron + AScurrents_t0 : np.ndarray + the current state of the afterspike currents in the neuron + inj : float + the current value of the current injection into the neuron + time_step : int + the current time step of the neuron simulation + spike_time_steps : list + a list of all of the time steps of spikes in the neuron + + Returns + ------- + tuple + voltage_t1 (voltage at next time step), threshold_t1 (threshold at next time step), AScurrents_t1 (afterspike currents at next time step) + """ + + AScurrents_t1 = self.AScurrent_dynamics_method(self, AScurrents_t0, time_step, spike_time_steps) + voltage_t1 = self.voltage_dynamics_method(self, voltage_t0, AScurrents_t0, inj) + threshold_t1 = self.threshold_dynamics_method(self, threshold_t0, voltage_t0, AScurrents_t0, inj) + + return voltage_t1, threshold_t1, AScurrents_t1 + + def reset(self, voltage_t0, threshold_t0, AScurrents_t0): + """ Apply reset rules to the neuron's voltage, threshold, and afterspike currents assuming a spike has occurred (voltage is above threshold). + + Parameters + ---------- + voltage_t0 : float + the current voltage of the neuron + threshold_t0 : float + the current spike threshold level of the neuron + AScurrents_t0 : np.ndarray + the current state of the afterspike currents in the neuron + + Returns + ------- + tuple + voltage_t1 (voltage at next time step), threshold_t1 (threshold at next time step), AScurrents_t1 (afterspike currents at next time step) + """ + + AScurrents_t1 = self.AScurrent_reset_method(self, AScurrents_t0) + voltage_t1 = self.voltage_reset_method(self, voltage_t0) + threshold_t1 = self.threshold_reset_method(self, threshold_t0, voltage_t1) + bad_reset_flag=False + if voltage_t1 > threshold_t1: + bad_reset_flag=True + #TODO put this back in eventually but would rather debug right now +# raise GlifBadResetException("Voltage reset above threshold: voltage_t1 (%f) threshold_t1 (%f), voltage_t0 (%f) threshold_t0 (%f) AScurrents_t0 (%s)" % ( voltage_t1, threshold_t1, voltage_t0, threshold_t0, repr(AScurrents_t0)), voltage_t1 - threshold_t1) + + return voltage_t1, threshold_t1, AScurrents_t1, bad_reset_flag + + def run(self, stim): + """ Run neuron simulation over a given stimulus. This steps through the stimulus applying dynamics equations. + After each step it checks if voltage is above threshold. If so, self.spike_cut_length NaNs are inserted + into the output voltages, reset rules are applied to the voltage, threshold, and afterspike currents, and the + simulation resumes. + + Parameters + ---------- + stim : np.ndarray + vector of scalar current values + + Returns + ------- + dict + a dictionary containing: + 'voltage': simulated voltage values, + 'threshold': threshold values during the simulation, + 'AScurrents': afterspike current values during the simulation, + 'grid_spike_times': spike times (in uits of self.dt) aligned to simulation time steps, + 'interpolated_spike_times': spike times (in units of self.dt) linearly interpolated between time steps, + 'spike_time_steps': the indices of grid spike times, + 'interpolated_spike_voltage': voltage of the simulation at interpolated spike times, + 'interpolated_spike_threshold': threshold of the simulation at interpolated spike times + """ + bad_reset_flag=False + + # initialize the voltage, threshold, and afterspike current values + voltage_t0 = self.init_voltage + threshold_t0 = self.init_threshold + AScurrents_t0 = self.init_AScurrents + + self.threshold_components = None #get rid of lingering method data + + num_time_steps = len(stim) + num_AScurrents = len(AScurrents_t0) + + # pre-allocate the output voltages, thresholds, and after-spike currents + voltage_out=np.empty(num_time_steps) + voltage_out[:]=np.nan + threshold_out=np.empty(num_time_steps) + threshold_out[:]=np.nan + AScurrents_out=np.empty(shape=(num_time_steps, num_AScurrents)) + AScurrents_out[:]=np.nan + + # array that will hold spike indices + spike_time_steps = [] + grid_spike_times = [] + interpolated_spike_times = [] + interpolated_spike_voltage = [] + interpolated_spike_threshold = [] + + time_step = 0 + while time_step < num_time_steps: + if time_step % 10000 == 0: + logging.info("time step %d / %d" % (time_step, num_time_steps)) + + # compute voltage, threshold, and ascurrents at current time step + (voltage_t1, threshold_t1, AScurrents_t1) = self.dynamics(voltage_t0, threshold_t0, AScurrents_t0, stim[time_step], time_step, spike_time_steps) + + #if the voltage is bigger than the threshold record the spike and reset the values + if voltage_t1 > threshold_t1: + + # spike_time_steps are stimulus indices when voltage surpassed threshold + spike_time_steps.append(time_step) + grid_spike_times.append(time_step * self.dt) + + # compute higher fidelity spike time/voltage/threshold by linearly interpolating + interpolated_spike_times.append(interpolate_spike_time(self.dt, time_step, threshold_t0, threshold_t1, voltage_t0, voltage_t1)) + + interpolated_spike_time_offset = interpolated_spike_times[-1] - (time_step - 1) * self.dt + interpolated_spike_voltage.append(interpolate_spike_value(self.dt, interpolated_spike_time_offset, voltage_t0, voltage_t1)) + interpolated_spike_threshold.append(interpolate_spike_value(self.dt, interpolated_spike_time_offset, threshold_t0, threshold_t1)) + + # reset voltage, threshold, and afterspike currents + # Note that these values are not ever recorded unless the spike cut length doesnt happen (this doesnt seem quite right) + (voltage_t0, threshold_t0, AScurrents_t0, bad_reset_flag) = self.reset(voltage_t1, threshold_t1, AScurrents_t1) + + # if we are not integrating during the spike (which includes right now), insert nans then jump ahead + # TODO MAYBE ONE LAST NAN SHOULD BE INSERTED AND THIS VALUE SHOULD BE RECORDED FOR CONSISTANCY + if self.spike_cut_length > 0: + n = self.spike_cut_length + + cut_past_end = (time_step + n) >= len(voltage_out) + if cut_past_end: + n = len(voltage_out) - time_step + + voltage_out[time_step:time_step+n] = np.nan + threshold_out[time_step:time_step+n] = np.nan + AScurrents_out[time_step:time_step+n,:] = np.nan + + if not cut_past_end: + voltage_out[time_step+n] = voltage_t0 + threshold_out[time_step+n] = threshold_t0 + AScurrents_out[time_step+n,:] = AScurrents_t0 + + time_step += self.spike_cut_length+1 + else: + voltage_out[time_step] = voltage_t0 + threshold_out[time_step] = threshold_t0 + AScurrents_out[time_step,:] = AScurrents_t0 + time_step += 1 + + if bad_reset_flag: + voltage_out[time_step:time_step+5] = voltage_t0 + threshold_out[time_step:time_step+5] = threshold_t0 + AScurrents_out[time_step:time_step+5] = AScurrents_t0 + break + else: + # there was no spike, store the next voltages + voltage_out[time_step] = voltage_t1 + threshold_out[time_step] = threshold_t1 + AScurrents_out[time_step,:] = AScurrents_t1 + + voltage_t0 = voltage_t1 + threshold_t0 = threshold_t1 + AScurrents_t0 = AScurrents_t1 + + time_step += 1 + + return { + 'voltage': voltage_out, + 'threshold': threshold_out, + 'AScurrents': AScurrents_out, + 'grid_spike_times': np.array(grid_spike_times), + 'interpolated_spike_times': np.array(interpolated_spike_times), + 'spike_time_steps': np.array(spike_time_steps), + 'interpolated_spike_voltage': np.array(interpolated_spike_voltage), + 'interpolated_spike_threshold': np.array(interpolated_spike_threshold) + } + +# TODO: DEPRICATE +# def get_threshold_components(self): +# if self.threshold_components is None: +# self.threshold_components = { 'spike': [0], 'voltage': [0] } +# +# return self.threshold_components + + def append_threshold_components(self, spike, voltage): + self.threshold_components['spike'].append(spike) + self.threshold_components['voltage'].append(voltage) + +# TODO: DEPRICATE +# def reset_threshold_components(self): +# self.threshold_components = None + + + +def interpolate_spike_time(dt, time_step, threshold_t0, threshold_t1, voltage_t0, voltage_t1): + """ Given two voltage and threshold values, the dt between them and the initial time step, interpolate + a spike time within the dt interval by intersecting the two lines. """ + return time_step*dt + line_crossing_x(dt, voltage_t0, voltage_t1, threshold_t0, threshold_t1) + + +def interpolate_spike_value(dt, interpolated_spike_time_offset, v0, v1): + """ Take a value at two adjacent time steps and linearly interpolate what the value would be + at an offset between the two time steps. """ + return v0 + (v1 - v0) * interpolated_spike_time_offset / dt + + +def line_crossing_x(dx, a0, a1, b0, b1): + """ Find the x value of the intersection of two lines. """ + assert type(a0) != int and type(a1) != int and type(b0) != int and type(b1) != int, Exception("Do not pass integers into this function!") + return dx * (b0 - a0) / ( (a1 - a0) - (b1 - b0) ) + + +def line_crossing_y(dx, a0, a1, b0, b1): + """ Find the y value of the intersection of two lines. """ + return b0 + (b1 - b0) * (b0 - a0) / ((a1 - a0) - (b1 - b0)) + diff --git a/model/glif/glif_neuron_methods.py b/model/glif/glif_neuron_methods.py new file mode 100644 index 0000000000..3b555270db --- /dev/null +++ b/model/glif/glif_neuron_methods.py @@ -0,0 +1,513 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +""" The methods in this module are used for configuring dynamics and reset rules for the GlifNeuron. +For more details on how to use these methods, see :doc:`glif_models`. +""" +import functools +import numpy as np + + +class GlifNeuronMethod( object ): + """ A simple class to keep track of the name and parameters associated with a neuron method. + This class is initialized with a name, function, and parameters to pass to the function. The + function then has those passed parameters fixed to a partial function using functools.partial. + This class then mimics a function itself using the __call__ convention. Parameters that are not + fixed in this way are assumed to be passed into the method when it is called. If the passed + parameters contain an argument that is not part of the function signature, an exception will + be raised. + + Parameters + ---------- + method_name : string + A shorthand name that will be used to reference this method in the `GlifNeuron`. + method : function + A python function to be called when this instance is called. + method_params : dict + A dictionary mapping function arguments to values for values that should be fixed. + """ + + def __init__(self, method_name, method, method_params): + self.name = method_name + self.params = method_params + self.method = functools.partial(method, **method_params) + + def __call__(self, *args, **kwargs): + """ Defining this method allows an instance to be called like a function """ + return self.method(*args, **kwargs) + + def to_dict(self): + return { + 'name': self.name, + 'params': self.params + } + + def modify_parameter(self, param, operator): + """ Modify a function parameter needs to be modified after initialization. + + Parameters + ---------- + param : string + the name of the parameter to modify + operator : callable + a function or lambda that returns the desired modified value + + Returns + ------- + type + the new value of the variable that was just modified. + """ + value = operator(self.method.keywords[param]) + self.method.keywords[param] = value + return value + + +def max_of_line_and_const(x,b,c,d): + #TODO: move to other library + """ Find the maximum of a value and a position on a line + + Parameters + ---------- + x: float + x position on line 1 + c: float + slope of line 1 + d: float + y-intercept of line 1 + b: float + y-intercept of line 2 + + Returns + ------- + float + the max of a line value and a constant + """ + + one = b + two = c*x+d + return np.maximum(one,two) + + +def min_of_line_and_zero(x,c,d): + #TODO: move to other library + """ Find the minimum of a value and a position on a line + + Parameters + ---------- + x: float + x position on line 1 + c: float + slope of line 1 + d: float + y-intercept of line 1 + b: float + y-intercept of line 2 + + Returns + ------- + float + the max of a line value and a constant + """ + + one = 0 + two = c*x+d + return np.minimum(one,two) + + +def dynamics_AScurrent_exp(neuron, AScurrents_t0, time_step, spike_time_steps): + """ Exponential afterspike current dynamics method takes a current at t0 and returns the current at + a time step later. + """ + + return AScurrents_t0*np.exp(-neuron.k*neuron.dt) + + +def dynamics_AScurrent_none(neuron, AScurrents_t0, time_step, spike_time_steps): + """ This method always returns zeros for the afterspike currents, regardless of input. """ + return np.zeros(len(AScurrents_t0)) + + +def dynamics_voltage_linear_forward_euler(neuron, voltage_t0, AScurrents_t0, inj): + """ (TODO) Linear voltage dynamics. """ + return voltage_t0 + (inj + np.sum(AScurrents_t0) - neuron.G * neuron.coeffs['G'] * (voltage_t0 - neuron.El)) * neuron.dt / (neuron.C * neuron.coeffs['C']) + +def dynamics_voltage_linear_exact(neuron, voltage_t0, AScurrents_t0, inj): + """ (TODO) Linear voltage dynamics. """ + + C = (neuron.C * neuron.coeffs['C']) + I = inj + np.sum(AScurrents_t0) + g = neuron.G * neuron.coeffs['G'] + tau = g/C + N = (I+ g*neuron.El)/C + + return voltage_t0*np.exp(-neuron.dt*tau) + N*(1-np.exp(-tau*neuron.dt))/tau + +def spike_component_of_threshold_forward_euler(th_t0, b_spike, dt): + '''Spike component of threshold modeled as an exponential decay. Implemented + here for forward Euler + + Parameters + ---------- + th_t0 : float + threshold input to function + b_spike : float + decay constant of exponential + dt : float + time step + ''' + b_spike=-b_spike #TODO: this is here because b_spike is always input as positive although it is negative + return th_t0 + th_t0*b_spike * dt + +def spike_component_of_threshold_exact(th0, b_spike, t): + '''Spike component of threshold modeled as an exponential decay. Implemented + here as exact analytical solution. + + Parameters + ---------- + th0 : float + threshold input to function + b_spike : float + decay constant of exponential + t : float or array + time step if used in an Euler setup + time if used analytically + ''' + b_spike=-b_spike + return th0*np.exp(b_spike * t) + +def voltage_component_of_threshold_forward_euler(th_t0, v_t0, dt, a_voltage, b_voltage, El): + '''Equation 2.1 of Mihalas and Nieber, 2009 implemented for use in forward Euler. Note + here all variables are in reference to threshold infinity. Therefore thr_inf is zero + here (replaced threshold_inf with 0 in the equation to be verbose). This is done so that + th_inf can be optimized without affecting this function. + + Parameters + ---------- + th_t0 : float + threshold input to function + v_t0 : float + voltage input to function + dt : float + time step + a_voltage : float + constant a + b_voltage : float + constant b + El : float + reversal potential + ''' + return th_t0 + (a_voltage*(v_t0-El)-b_voltage*(th_t0-0))*dt + +def voltage_component_of_threshold_exact(th0, v0, I, t, a_voltage, b_voltage, C, g, El): + '''Note this function is the exact formulation; however, dt is used because t0 is the initial time and dt + is the time the function is exactly evaluated at. Note: that here, this equation is in reference to th_inf. + Therefore th0 is the total threshold-thr_inf (threshold_inf replaced with 0 in the equation to be verbose). + This is done so that th_inf can be optimized without affecting this function. + + Parameters + ---------- + th0 : float + threshold input to function + v0 : float + voltage input to function + I : float + total current entering neuron (note if there are after spike currents these must be included in this value) + t : float or array + time step if used in an Euler setup + time if used analytically + a_voltage : float + constant a + b_voltage : float + constant b + C : float + capacitance + g : float + conductance (1/resistance) + El : float + reversal potential + ''' + beta=(I+g*El)/g + phi=a_voltage/(b_voltage-g/C) + return phi*(v0-beta)*np.exp(-g*t/C)+1/(np.exp(b_voltage*t))*(th0-phi*(v0-beta)- + (a_voltage/b_voltage)*(beta-El)-0) +(a_voltage/b_voltage)*(beta-El) +0 + + +def dynamics_threshold_three_components_exact(neuron, threshold_t0, voltage_t0, AScurrents_t0, inj, + a_spike, b_spike, a_voltage, b_voltage): + """Analytical solution for threshold dynamics. The threshold will adapt via two mechanisms: + 1. a voltage dependent adaptation. + 2. a component initiated by a spike which decays as an exponential. + These two component are in reference to threshold infinity and are recorded + in the neuron's threshold components. + The third component refers to th_inf which is added separately as opposed to being + included in the voltage component of the threshold as is done in equation 2.1 of + Mihalas and Nieber 2009. Threshold infinity is removed for simple optimization. + + Parameters + ---------- + neuron : class + threshold_t0 : float + threshold input to function + voltage_t0 : float + voltage input to function + AScurrents_t0 : vector + values of after spike currents + inj : float + current injected into the neuron + """ + #TODO: just having the get_threshold_components added an erroneous zero to the beginning of the list + if neuron.threshold_components is None: + neuron.threshold_components = { 'spike': [], 'voltage': [] } + th_spike = 0 + th_voltage = 0 + else: + tcs = neuron.threshold_components + th_spike = tcs['spike'][-1] + th_voltage = tcs['voltage'][-1] + + a_voltage = a_voltage * neuron.coeffs['a'] + b_voltage = b_voltage * neuron.coeffs['b'] + + I = inj + np.sum(AScurrents_t0) + C = neuron.C * neuron.coeffs['C'] + g = neuron.G * neuron.coeffs['G'] + + voltage_component=voltage_component_of_threshold_exact(th_voltage, voltage_t0, I, neuron.dt, a_voltage, b_voltage, C, g, neuron.El) + spike_component = spike_component_of_threshold_exact(th_spike, b_spike, neuron.dt) + + #------update the voltage and spiking values of the the + neuron.append_threshold_components(spike_component, voltage_component) + + return voltage_component+spike_component+neuron.th_inf * neuron.coeffs['th_inf'] + +def dynamics_threshold_spike_component(neuron, threshold_t0, voltage_t0, AScurrents_t0, inj, + a_spike, b_spike, a_voltage, b_voltage): + """Analytical solution for spike component of threshold. The threshold will adapt via + a component initiated by a spike which decays as an exponential. The component is in + reference to threshold infinity and are recorded in the neuron's threshold components. The voltage + component of the threshold is set to zero in the threshold components because it is zero here + The third component refers to th_inf which is added separately as opposed to being + included in the voltage component of the threshold as is done in equation 2.1 of + Mihalas and Nieber 2009. Threshold infinity is removed for simple optimization. + + Parameters + ---------- + neuron : class + threshold_t0 : float + threshold input to function + voltage_t0 : float + voltage input to function + AScurrents_t0 : vector + values of after spike currents + inj : float + current injected into the neuron + """ + + #TODO: just having the get_threshold_components added an erroneous zero to the beginning of the list + if neuron.threshold_components is None: + neuron.threshold_components = { 'spike': [], 'voltage': [] } + th_spike = 0 + th_voltage = 0 + else: + tcs = neuron.threshold_components + th_spike = tcs['spike'][-1] + th_voltage = tcs['voltage'][-1] + + spike_component = spike_component_of_threshold_exact(th_spike, b_spike, neuron.dt) + + #------update the voltage and spiking values of the the + neuron.append_threshold_components(spike_component, 0.0) + + return spike_component+neuron.th_inf * neuron.coeffs['th_inf'] + + +def dynamics_threshold_inf(neuron, threshold_t0, voltage_t0, AScurrents_t0, inj): + """ Set threshold to the neuron's instantaneous threshold. + + Parameters + ---------- + neuron : class + threshold_t0 : not used here + voltage_t0 : not used here + AScurrents_t0 : not used here + inj : not used here + AScurrents_t0 : not used here + inj : not used here + """ + return neuron.coeffs['th_inf'] * neuron.th_inf + + +def reset_AScurrent_sum(neuron, AScurrents_t0, r): + """ Reset afterspike currents by adding summed exponentials. Left over currents from last spikes as + well as newly initiated currents from current spike. Currents amplitudes in neuron.asc_amp_array need + to be the amplitudes advanced though the spike cutting. I.e. In the preprocessor if the after spike currents + are calculated via the GLM from spike initiation the amplitude at the time after the spike cutting needs to + be calculated and neuron.asc_amp_array needs to be set to this value. + + Parameters + ---------- + r : np.ndarray + a coefficient vector applied to the afterspike currents + """ + new_currents=neuron.asc_amp_array * neuron.coeffs['asc_amp_array'] #neuron.asc_amp_array are amplitudes initiating after the spike is cut + left_over_currents=AScurrents_t0 * r * np.exp(-(neuron.k * neuron.dt * neuron.spike_cut_length)) #advancing cut currents though the spike + + return new_currents+left_over_currents + + +def reset_AScurrent_none(neuron, AScurrents_t0): + """ Reset afterspike currents to zero. """ + + if np.sum(AScurrents_t0)!=0: + raise Exception('You are running a LIF but the AScurrents are not zero!') + return np.zeros(len(AScurrents_t0)) + + +def reset_voltage_v_before(neuron, voltage_t0, a, b): + """ Reset voltage to the previous value with a scale and offset applied. + + Parameters + ---------- + a : float + voltage scale constant + b : float + voltage offset constant + """ + + return a*(voltage_t0)+b + +def reset_voltage_zero(neuron, voltage_t0): + """ Reset voltage to zero. """ + return 0.0 + +def reset_threshold_inf(neuron, threshold_t0, voltage_v1): + """ Reset the threshold to instantaneous threshold. """ + return neuron.coeffs['th_inf'] * neuron.th_inf + +def reset_threshold_three_components(neuron, threshold_t0, voltage_v1, a_spike, b_spike): + '''This method calculates the two components of the threshold: a spike (fast) + component and a voltage (slow) component. The threshold_components vectors are then + updated so that the traces match the voltage, current, and total threshold traces. The + spike component of the threshold decays via an exponential fit specified by the amplitude + a_spike and the time constant b_spike fit via the multiblip data. The voltage component + does not change during the duration of the spike. The + spike component are threshold component are summed along with threshold infinity to + return the total threshold. Note that in the current implementation a_spike is added to + the last value of the threshold_components which means that a_spike is the amplitude after + spike cutting (if there is any). + + Inputs: + neuron: class + contains attributes of the neuron + threshold_t0, voltage_t0: float + are not used but are here for consistency with other methods + a_spike: float + amplitude of the exponential decay of spike component of threshold after spike + cutting has been implemented. + b_spike: float + amplitude of the exponential decay of spike component of threshold + + Outputs: + Returns: float + the total threshold which is the sum of the spike component of threshold, the voltage + component of threshold and threshold infinity (with it's corresponding coefficient) + neuron.threshold_components: dictionary containing + a spike: list + vector of spiking component of threshold that corresponds to the voltage, current, + and total threshold traces + b_spike: list + vector of voltage component of threshold that corresponds to the voltage, current, + and total threshold traces. + + Note that this function can be changed to use a_spike at the time of the spike and then have the + the spike component plus the residual decay thought the spike. There are benefits and drawbacks to + this. This potential change would be beneficial as it perhaps makes more biological sense for the + threshold to go up at the time of spike if the traces are ever used. Also this would mean that a_spike + would not have to be adjusted thought the spike cutting after the multiblip fit. However the current + implementation makes sense in that it is similar to how afterspike currents are implemented. + ''' + if neuron.threshold_components is None: + raise Exception('reset should never happen at the beginning of a trace') + + tcs = neuron.threshold_components #for ease of updating + + # note that these values are at the indicie of the time of the spike which is the index right after the voltage crosses + # threshold since the neuron.threshold_components are updated by the dynamics method which is called before the reset. + th_spike=tcs['spike'][-1] #this needs to decay through the spike must be very particular about how many indicies to decay + th_voltage= tcs['voltage'][-1] + + # calculate spike component decay though spike from time =1 (not zero because zero is already in neuron.threshold_components + # via the dynamics method) though the end of the spike cutting + spike_comp_decay=spike_component_of_threshold_exact(th_spike, b_spike, np.arange(1,neuron.spike_cut_length+1)*neuron.dt) #Note that the plus one is that one needs to know the decay and the inital condition for next starting point + + #update neuron.threshold_components via pass by reference. + [tcs['voltage'].append(value) for value in np.ones(neuron.spike_cut_length)*th_voltage] #note that here I don't need the plus one because I am starting from zero + [tcs['spike'].append(value) for value in spike_comp_decay] + + # add the amplitude of the spike component decay to last value of vector (reseting) + tcs['spike'][-1]=tcs['spike'][-1]+a_spike + + return tcs['spike'][-1] + tcs['voltage'][-1] + neuron.th_inf * neuron.coeffs['th_inf'] + + +#: The METHOD_LIBRARY constant groups dynamics and reset methods by group name (e.g. 'voltage_dynamics_method'). +#Those groups assign each method in this file a string name. This is used by the GlifNeuron when initializing +#its dynamics and reset methods. +METHOD_LIBRARY = { + 'AScurrent_dynamics_method': { + 'exp': dynamics_AScurrent_exp, + 'none': dynamics_AScurrent_none + }, + 'voltage_dynamics_method': { + 'linear_forward_euler': dynamics_voltage_linear_forward_euler + }, + 'threshold_dynamics_method': { + 'spike_component': dynamics_threshold_spike_component, + 'inf': dynamics_threshold_inf, + 'three_components_exact': dynamics_threshold_three_components_exact + }, + 'AScurrent_reset_method': { + 'sum': reset_AScurrent_sum, + 'none': reset_AScurrent_none + }, + 'voltage_reset_method': { + 'v_before': reset_voltage_v_before, + 'zero': reset_voltage_zero + }, + 'threshold_reset_method': { + 'inf': reset_threshold_inf, + 'three_components': reset_threshold_three_components + } +} diff --git a/model/glif/simulate_neuron.py b/model/glif/simulate_neuron.py new file mode 100644 index 0000000000..b9c378b373 --- /dev/null +++ b/model/glif/simulate_neuron.py @@ -0,0 +1,187 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import logging +import time +import argparse +import os +import numpy as np +import allensdk.core.json_utilities as json_utilities +from allensdk.core.nwb_data_set import NwbDataSet +from allensdk.api.queries.glif_api import GlifApi +from allensdk.model.glif.glif_neuron import GlifNeuron + +DEFAULT_SPIKE_CUT_VALUE = 0.05 # 50mV + +def parse_arguments(): + ''' Use argparse to get required arguments from the command line ''' + parser = argparse.ArgumentParser(description='fit a neuron') + + parser.add_argument('--ephys_file', help='ephys file name') + parser.add_argument('--sweeps_file', help='JSON file listing sweep properties') + parser.add_argument('--neuron_config_file', help='neuron configuration JSON file ') + parser.add_argument('--neuronal_model_id', help='id of the neuronal model. Used when downloading sweep properties.', type=int) + parser.add_argument('--output_ephys_file', help='output file name') + parser.add_argument('--log_level', help='log level', default=logging.INFO) + parser.add_argument('--spike_cut_value', help='value to fill in for spike duration', default=DEFAULT_SPIKE_CUT_VALUE, type=float) + + return parser.parse_args() + + +def simulate_sweep(neuron, stimulus, spike_cut_value): + ''' Simulate a neuron given a stimulus and initial conditions. ''' + + start_time = time.time() + + logging.debug("simulating") + + data = neuron.run(stimulus) + + voltage = data['voltage'] + voltage[np.isnan(voltage)] = spike_cut_value + + logging.debug("simulation time %f" % (time.time() - start_time)) + + return data + + +def load_sweep(file_name, sweep_number): + ''' Load the stimulus for a sweep from file. ''' + logging.debug("loading sweep %d" % sweep_number) + + load_start_time = time.time() + data = NwbDataSet(file_name).get_sweep(sweep_number) + + logging.debug("load time %f" % (time.time() - load_start_time)) + + return data + + +def write_sweep_response(file_name, sweep_number, response, spike_times): + ''' Overwrite the response in a file. ''' + + logging.debug("writing sweep") + + write_start_time = time.time() + ephds = NwbDataSet(file_name) + + ephds.set_sweep(sweep_number, stimulus=None, response=response) + ephds.set_spike_times(sweep_number, spike_times) + + logging.debug("write time %f" % (time.time() - write_start_time)) + + +def simulate_sweep_from_file(neuron, sweep_number, input_file_name, output_file_name, spike_cut_value): + ''' Load a sweep stimulus, simulate the response, and write it out. ''' + + sweep_start_time = time.time() + + try: + data = load_sweep(input_file_name, sweep_number) + except Exception as e: + logging.warning("Failed to load sweep, skipping. (%s)" % str(e)) + raise + + # tell the neuron what dt should be for this sweep + neuron.dt = 1.0 / data['sampling_rate'] + + sim_data = simulate_sweep(neuron, data['stimulus'], spike_cut_value) + + write_sweep_response(output_file_name, sweep_number, sim_data['voltage'], sim_data['interpolated_spike_times']) + + logging.debug("total sweep time %f" % ( time.time() - sweep_start_time )) + +def simulate_neuron(neuron, sweep_numbers, input_file_name, output_file_name, spike_cut_value): + + start_time = time.time() + + for sweep_number in sweep_numbers: + simulate_sweep_from_file(neuron, sweep_number, input_file_name, output_file_name, spike_cut_value) + + logging.debug("total elapsed time %f" % (time.time() - start_time)) + +def main(): + args = parse_arguments() + + logging.getLogger().setLevel(args.log_level) + + glif_api = None + if (args.neuron_config_file is None or + args.sweeps_file is None or + args.ephys_file is None): + + assert args.neuronal_model_id is not None, Exception("A neuronal model id is required if no neuron config file, sweeps file, or ephys data file is provided.") + + glif_api = GlifApi() + glif_api.get_neuronal_model(args.neuronal_model_id) + + if args.neuron_config_file: + neuron_config = json_utilities.read(args.neuron_config_file) + else: + neuron_config = glif_api.get_neuron_config() + + if args.sweeps_file: + sweeps = json_utilities.read(args.sweeps_file) + else: + sweeps = glif_api.get_ephys_sweeps() + + if args.ephys_file: + ephys_file = args.ephys_file + else: + ephys_file = 'stimulus_%d.nwb' % args.neuronal_model_id + + if not os.path.exists(ephys_file): + logging.info("Downloading stimulus to %s." % ephys_file) + glif_api.cache_stimulus_file(ephys_file) + else: + logging.warning("Reusing %s because it already exists." % ephys_file) + + if args.output_ephys_file: + output_ephys_file = args.output_ephys_file + else: + logging.warning("Overwriting input file data with simulated data in place.") + output_ephys_file = ephys_file + + + neuron = GlifNeuron.from_dict(neuron_config) + + # filter out test sweeps + sweep_numbers = [ s['sweep_number'] for s in sweeps if s['stimulus_name'] != 'Test' ] + + simulate_neuron(neuron, sweep_numbers, ephys_file, output_ephys_file, args.spike_cut_value) + + + +if __name__ == "__main__": main() diff --git a/morphology/__init__.py b/morphology/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/morphology/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/morphology/__pycache__/__init__.cpython-37.pyc b/morphology/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7168fb372b6804553917a5bf469eba7484cf04eb GIT binary patch literal 187 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUn$O3F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KR3UqAR|8~KfO{vK0Y%qvm`!Vub}c4hfQvNN@-529mw|2 HK+FIDA4fF! literal 0 HcmV?d00001 diff --git a/morphology/__pycache__/validate_swc.cpython-37.pyc b/morphology/__pycache__/validate_swc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cd2866438fa7b7b80817543ccdc21e26bab2bcb GIT binary patch literal 2144 zcmY*a-EI>{6rR~#uh*M6gfwas=*6gNL|lPWK;j}o5j3F^QVCUorrie2+Ox42?~gMx zCbqS%)CQ^T9eo36ulg#z=mYF+uefL*fGfUPJ8@WP=jY6K&YU^tn=@Zjt1iKp{P~mr z&mtlJ>dDDxV{i+<e1e7(P9x$?dKw!Bp(HjvlaiqmSd{FMWQ9UTHNuEWvE@PfJxPr3 z2sgR)f_OGBaT|R(aCo_E2rnofYdn2GYR((%L3V32w+F&c+ChtI0lq5!5`GiE+<{b) zXY`rz8~RsfMqbk~Rn{-$fO5)>7fwc>m3GK6J*HzLGq~9`#g?+Ul^GvG`ZL9Pd2D7T zFLfR95G%Hp4z?gEuaX_|_}bV4#>uQzGA^k~R?>1<vojmkEb#<7Sk3H%sl~%5dqla% zWLzFRo$UVj+p(kOGKW_R%}Q3u%3WLh4NZ3<o%m8<<_e4pjN2vRe_-bI_{4fveuepK zO3C3L*r%G6;mh1$Q!Q{4-p%2p2E1M$&u4Sl{3_8cH&@6iSwY;p=1VG;VY8}F`H~(k z?-9O$c%K{n=Q4Z`Q`QVvD~)@;3Y$^DjzZO8yLTRabAR_Td$7074#FsqEbdFiI{x#3 zsZPKS(kM!g!lcc5BJBl2g@N2G>}i`<Ys_a7t1u_hRIw!GQ^P%91c_pIci5#XS1+Av zT&pn|9QLsk`cX7wVbT(TuT5xZ(vO>gkf-SDH5SHkz(Zfb^-dUZ7-i`};hIcipSAoX z!M;r}snsd;PU&P!>GXl7)5mDqBqNWPK_Ze-j<6lmUrE>a-8i%mCYoDn*bC5`VWMhA zZqz@|X$$kR-l!4szsTFp_U8U02@m)Ej?e2&|Hw~<`?nLnl_uQ3z8@sd<vzlc$QIhP z*BQ$FufpcO3{`NY=eN3kJAiH!0l~W)aVmP9G)mjUjpu$8a-6auk6QKK@U43@3Z>H7 z+Pb0r*N3s`h`ooq8Ko^hl3Vo|_>I0yqpLcdvqVlaGzpj{fKV|qP-pDRw4d-zw#Iiy z7w?^VgY-+Ja+cEEISKw~V_T;|=b%XV`kJg2aGXUm#z%URX|CA%8n5L>$VY5@wyVzb znq;BgL9u=kf(`ZDp73RK<1A9^7sf%dSVv80Wo)8Ys3e<GOru7hoYlL#BN^ydY%pWn z!`ivrM0h=Sc2duJaR1(I&jAOy4m|+<*jv<bp9ZO+^N?5W3|c`?g=vyo`rO|6vyd?1 z!5}x0Rp<vwSja(c`kd#sOoa-#(CMpHa|c^A^fmL`S?;|B(7sWSOkW=<mH_sudYeWO zc5u&gXH#!U<J(|7pRD6fcx8kKIO)xuam+KrkmqJk>rWifker6X(f&|TMkgw0^7*sG zx(tcDg@%+J>KgNOo;uXP$VTrN3)C$n7F~p7vT99xgD%ho)1k}s0!HEjY_zl?{pq@{ z-=J;$@&L{7GgNj|b5wR*%~u9DboIl?d`)z%*ERMS61+G!ETZhLE1ps^HYgdbsIqc0 zLsx%FRE3)p99|@>|A?1p`W_KnZEJV5esVkpf}Yem6gR>8^1VtZK7wCj4o%I?9bdG; z0~zECw?(_J@66YFD)M<Gw}I6{mb(Q=&t-AqiIMX#l9ze{<pi`)BDaD;sA^`xb#27b z3ONmmY)qOW7gp?t$q&$$nh6Avx2TPnJBa8a;w;v*Wv9{5xJIK^5f>rw&Y#qkdJA{4 zuGwtqkvNCdf`MMO=Sx*@_QObp$<)^qV~HOJjm8;YG)E@naBjva??=Jbrw|oRIdlnb OIdE&qbT%B<q3-~~A4u>3 literal 0 HcmV?d00001 diff --git a/morphology/validate_swc.py b/morphology/validate_swc.py new file mode 100644 index 0000000000..9c8e6889e0 --- /dev/null +++ b/morphology/validate_swc.py @@ -0,0 +1,102 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import argparse +import allensdk.core.swc as swc +try: + xrange +except: + from past.builtins import xrange + + +def validate_swc(swc_file): + """ + To be compatible with NEURON, SWC files must have the following properties: + 1) a single root node with parent ID '-1' + 2) sequentially increasing ID numbers + 3) immediate children of the soma cannot branch + """ + soma_id = swc.Morphology.SOMA + morphology = swc.read_swc(swc_file) + # verify that there is a single root node + num_soma_nodes = sum([(int(c['type']) == soma_id) + for c in morphology.compartment_list]) + if num_soma_nodes != 1: + raise Exception( + "SWC must have single soma compartment. Found: %d" % num_soma_nodes) + # sanity check + root = morphology.root + if root is None: + raise Exception("Morphology has no root node") + # verify that children of the root have max one child + for root_child_id in root['children']: + root_child = morphology.compartment_index[root_child_id] + num_grand_children = len(root_child['children']) + if num_grand_children > 1: + raise Exception("Child of root (%s) has more than one child (%d)" % ( + root_child_id, num_grand_children)) + # get a list of all of the ids, make sure they are unique while we're at it + all_ids = set() + for compartment in morphology.compartment_list: + iid = int(compartment["id"]) + if iid in all_ids: + raise Exception("Compartment ID %s is not unique." % + compartment["id"]) + pid = int(compartment["parent"]) + if iid < pid: + raise Exception( + "Compartment (%d) has a smaller ID that its parent (%d)" % (iid, pid)) + all_ids.add(iid) + + # sort the ids and make sure there are no gaps + sorted_ids = sorted(all_ids) + for i in xrange(1, len(sorted_ids)): + if sorted_ids[i] - sorted_ids[i - 1] != 1: + raise Exception("Compartment IDs are not sequential") + return True + + +def main(): + try: + parser = argparse.ArgumentParser( + "validate an SWC file for use with NEURON") + parser.add_argument('swc_file') + args = parser.parse_args() + validate_swc(args.swc_file) + except Exception as e: + print(str(e)) + exit(1) +if __name__ == "__main__": + main() diff --git a/mouse_connectivity/__init__.py b/mouse_connectivity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mouse_connectivity/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..914470fe1a5098208709aa2776b7522c73215a89 GIT binary patch literal 195 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r=Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh{QGON&$EfqL^&lS?woGD|A;<Kr{)GE3s)^$IF)aoFVMr<CTT L+JRj08HgDGqyabN literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/__init__.py b/mouse_connectivity/grid/__init__.py new file mode 100644 index 0000000000..a968d7ab97 --- /dev/null +++ b/mouse_connectivity/grid/__init__.py @@ -0,0 +1,19 @@ + +from .writers import classic_writer, count_writer, cav_writer +from .subimage import CavSubImage, CountSubImage, ClassicSubImage + + +cases = { + 'classic': { + 'writer': classic_writer, + 'subimage': ClassicSubImage + }, + 'count': { + 'writer': count_writer, + 'subimage': CountSubImage + }, + 'cav': { + 'writer': cav_writer, + 'subimage': CavSubImage + } +} \ No newline at end of file diff --git a/mouse_connectivity/grid/__main__.py b/mouse_connectivity/grid/__main__.py new file mode 100644 index 0000000000..a2c14804ca --- /dev/null +++ b/mouse_connectivity/grid/__main__.py @@ -0,0 +1,136 @@ +import argparse +import logging +import os +import sys + +import argschema +import requests + +from allensdk.brain_observatory.argschema_utilities import \ + write_or_print_outputs +from . import cases +from ._schemas import InputParameters, OutputParameters +from .image_series_gridder import ImageSeriesGridder + + +def get_inputs_from_lims(host, image_series_id, output_root, job_queue, + strategy): + uri = ''.join(''' + {}/input_jsons? + object_id={}& + object_class=ImageSeries& + strategy_class={}& + job_queue_name={} + '''.format(host, image_series_id, strategy, job_queue).split()) + response = requests.get(uri) + data = response.json() + + if len(data) == 1 and 'error' in data: + raise ValueError('bad request uri: {} ({})'.format(uri, data['error'])) + + data['storage_directory'] = os.path.join(output_root, os.path.split( + data['storage_directory'])[-1]) + data['grid_prefix'] = os.path.join(output_root, + os.path.split(data['grid_prefix'])[-1]) + data['accumulator_prefix'] = os.path.join(output_root, os.path.split( + data['accumulator_prefix'])[-1]) + + return data + + +def run_grid(args): + try: + case = cases[args['case']] + except KeyError: + logging.error('unrecognized case: {}'.format(args['case'])) + raise + + sub_images = args['sub_images'] + + input_dimensions = [sub_images[0]['dimensions']['column'], + sub_images[0]['dimensions']['row'], + args['sub_image_count']] + + input_spacing = [sub_images[0]['spacing']['column'], + sub_images[0]['spacing']['row'], + args['image_series_slice_spacing']] + + for ii, si in enumerate(sub_images): + del si['dimensions'] + del si['spacing'] + si['polygon_info'] = si['polygons'] + del si['polygons'] + sub_images = sorted(sub_images, key=lambda si: si['specimen_tissue_index']) + logging.info('{} sub images with indices: {}'.format( + len(sub_images), [si['specimen_tissue_index'] for si in sub_images]) + ) + + output_dimensions = [args['reference_dimensions']['slice'], + args['reference_dimensions']['row'], + args['reference_dimensions']['column']] + + output_spacing = [args['reference_spacing']['slice'], + args['reference_spacing']['row'], + args['reference_spacing']['column']] + + subimage_kwargs = {'cls': case['subimage']} + if args['filter_bit'] is not None: + subimage_kwargs['filter_bit'] = args['filter_bit'] + + gridder = ImageSeriesGridder( + in_dims=input_dimensions, + in_spacing=input_spacing, + out_dims=output_dimensions, + out_spacing=output_spacing, + reduce_level=args['reduce_level'], + subimages=sub_images, + subimage_kwargs=subimage_kwargs, + nprocesses=args['nprocesses'], + affine_params=args['affine_params'], + dfmfld_path=args['deformation_field_path'] + ) + + gridder.setup_subimages() + gridder.build_coarse_grids() + + writer = case['writer'] + paths = writer(gridder, args['grid_prefix'], args['accumulator_prefix'], + target_spacings=args['target_spacings']) + + return {'output_file_paths': paths} + + +def main(): + logging.basicConfig( + format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') + + # TODO replace with argschema implementation of multisource parser + remaining_args = sys.argv[1:] + input_data = {} + if '--get_inputs_from_lims' in sys.argv: + lims_parser = argparse.ArgumentParser(add_help=False) + lims_parser.add_argument('--host', type=str, default='http://lims2') + lims_parser.add_argument('--job_queue', type=str, default=None) + lims_parser.add_argument('--strategy', type=str, default=None) + lims_parser.add_argument('--image_series_id', type=int, default=None) + lims_parser.add_argument('--output_root', type=str, default=None) + + lims_args, remaining_args = lims_parser.parse_known_args( + remaining_args) + remaining_args = [item for item in remaining_args if + item != '--get_inputs_from_lims'] + input_data = get_inputs_from_lims(**lims_args.__dict__) + + parser = argschema.ArgSchemaParser( + args=remaining_args, + input_data=input_data, + schema_type=InputParameters, + output_schema_type=OutputParameters, + ) + + output = run_grid(parser.args) + write_or_print_outputs(output, parser) + + +if __name__ == '__main__': + main() diff --git a/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8f3b51c0aa313b25274af737a17c9a742da0b18 GIT binary patch literal 471 zcmX|-yH3L}6hQrGl0Ilz`V$#w2R4KdkO_oXDi$kJ<k(hgHFkoXq{_%gu(2`mOIext z1t#o1xY9lMq5HD$r_(WTqCem0I|Sg{2PX-fbL-STI&i>Y0Td)qA%YYp82TJ41}Y$d z3Q4FU5<wuKh&cX00*P>Mu?W27gAYuGJXnD^{BfH=jQbfYsI`)1J0ojh`ZHEGx;{l? zM%$zBY9|S8S55w)=vwsC#25aD=gDEtDG{SSJdPaNCYQb^#w0qf>x2Csg584WctoN@ ztu@G<Ww6J<W8~pK!Gs=>0|^+l!hQiW@hOkr*W@aFvBKDtZYW>mbVqfU-f7B8&FN(- zbZgVH652Ayvf6YueUf=<-J35e%C_!0*IN{>f^V0qY^=y!uNJJ9t*pD{+DN|4GO1;q bWs9oohu5m)O(Aal#dhW}hw}iz5FhjpKFEfE literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/__pycache__/__main__.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..712ecddbf721b338828a9657def15929d0a58e02 GIT binary patch literal 3891 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 literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/__pycache__/_schemas.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/_schemas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d9bd17701573030aed1ec14df319b187f26b9eb GIT binary patch literal 4312 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 literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/__pycache__/image_series_gridder.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/image_series_gridder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c29022a3fff699e160d7048517b7f26e65fabe9e GIT binary patch literal 4859 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 P+Nh(-_ENU=_1gadm)yhH literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/_schemas.py b/mouse_connectivity/grid/_schemas.py new file mode 100644 index 0000000000..02228dd936 --- /dev/null +++ b/mouse_connectivity/grid/_schemas.py @@ -0,0 +1,105 @@ +from argschema import ArgSchema +from argschema.fields import Nested, String, Float, Dict, Int, List, LogLevel +from argschema.schemas import DefaultSchema +from marshmallow import RAISE + +VALID_CASES = ( + 'classic', + 'cav', + 'count' +) + + +class RaisingSchema(DefaultSchema): + class META: + unknown = RAISE + + +class ImageSpacing(RaisingSchema): + row = Float(required=True) + column = Float(required=True) + + +class ImageDimensions(RaisingSchema): + row = Int(required=True) + column = Int(required=True) + + +class ReferenceSpacing(RaisingSchema): + row = Float(required=True) + column = Float(required=True) + slice = Float(required=True) + + +class ReferenceDimensions(RaisingSchema): + row = Int(required=True) + column = Int(required=True) + slice = Int(required=True) + + +class SubImage(RaisingSchema): + specimen_tissue_index = Int() + dimensions = Nested(ImageDimensions) + spacing = Nested(ImageSpacing) + segmentation_paths = Dict() + intensity_paths = Dict() + polygons = Dict() + + +class InputParameters(ArgSchema): + class Meta: + unknown = RAISE + + log_level = LogLevel(default='INFO', + description="set the logging level of the module") + case = String(required=True, validate=lambda s: s in VALID_CASES, + help='select a use case to run') + sub_images = Nested(SubImage, required=True, many=True, + help='Sub images composing this image series') + affine_params = List(Float, + help='Parameters of affine image stack to reference ' + 'space transform.') + deformation_field_path = String(required=True, + help='Path to parameters of the ' + 'deformable local transform from ' + 'affine-transformed image stack to ' + 'reference space transform.' + ) + image_series_slice_spacing = Float(required=True, + help='Distance (microns) between ' + 'successive images in this ' + 'series.') + target_spacings = List(Float, required=True, + help='For each volume produced, downsample to ' + 'this isometric resolution') + reference_spacing = Nested(ReferenceSpacing, required=True, + help='Native spacing of reference space (' + 'microns).') + reference_dimensions = Nested(ReferenceDimensions, required=True, + help='Native dimensions of reference space.') + sub_image_count = Int(required=True, help='Expected number of sub images') + grid_prefix = String(required=True, help='Write output grid files here') + accumulator_prefix = String(required=True, + help='If this run produces accumulators, ' + 'write them here.') + storage_directory = String(required=False, + help='Storage directory for this image ' + 'series. Not used') + filter_bit = Int(default=None, allow_none=True, + help='if provided, signals that pixels with this bit ' + 'high have passed the optional post-filter stage') + nprocesses = Int(default=8, help='spawn this many worker subprocesses') + reduce_level = Int(default=0, + help='power of two by which to downsample each input ' + 'axis') + + +class OutputSchema(RaisingSchema): + input_parameters = Nested(InputParameters, + description=("Input parameters the module " + "was run with"), + required=True) + + +class OutputParameters(OutputSchema): + output_file_paths = List(String, required=True) diff --git a/mouse_connectivity/grid/image_series_gridder.py b/mouse_connectivity/grid/image_series_gridder.py new file mode 100644 index 0000000000..8a850edc04 --- /dev/null +++ b/mouse_connectivity/grid/image_series_gridder.py @@ -0,0 +1,157 @@ +import multiprocessing as mp +import logging + +from six import iteritems +import SimpleITK as sitk +import numpy as np + +from .subimage import run_subimage +from .utilities import image_utilities as iu +from .utilities.downsampling_utilities import block_average, window_average + + +#============================================================================== + + +class ImageSeriesGridder(object): + + @property + def transform(self): + + if not hasattr(self, '_transform'): + dfmfld = sitk.ReadImage(str(self.dfmfld_path)) + self._transform = iu.build_composite_transform(dfmfld, self.affine_params) + del dfmfld + + return self._transform + + + def __init__(self, in_dims, in_spacing, + out_dims, out_spacing, + reduce_level, + subimages, + subimage_kwargs, + nprocesses, + affine_params, + dfmfld_path): + + self.in_dims = np.array(in_dims) + self.in_spacing = np.array(in_spacing) + + self.out_dims = np.array(out_dims) + self.out_spacing = np.array(out_spacing) + + self.reduce_level = reduce_level + + self.nprocesses = nprocesses + + self.affine_params = affine_params + self.dfmfld_path = dfmfld_path + + self.volumes = {} + + self.subimages = subimages + self.subimage_kwargs = subimage_kwargs + + + def set_coarse_grid_parameters(self): + + self.coarse_dims, self.coarse_spacing, self.coarse_grid_radius = \ + iu.compute_coarse_parameters(self.in_dims, self.in_spacing, + self.out_spacing[::-1], + self.reduce_level) + + self.coarse_dims[-1] = self.in_dims[-1] + self.coarse_spacing[-1] = self.in_spacing[-1] + self.coarse_grid_radius = self.coarse_grid_radius[0] + + + def setup_subimages(self): + + if not hasattr(self, 'coarse_grid_radius'): + self.set_coarse_grid_parameters() + + dc = {'in_dims': self.in_dims[:2], + 'in_spacing': self.in_spacing[:2], + 'coarse_dims': self.coarse_dims[:2], + 'coarse_spacing': self.coarse_spacing[:2], + 'reduce_level': self.reduce_level} + dc.update(self.subimage_kwargs) + + for si in self.subimages: + si.update(dc) + + + def initialize_coarse_volume(self, key, dtype): + logging.info('initializing {0} coarse grid volume'.format(key)) + self.volumes[key] = iu.new_image(self.coarse_dims, self.coarse_spacing, dtype, True) + + origin = list(self.volumes[key].GetOrigin()) + origin[2] = 0 + self.volumes[key].SetOrigin(origin) + + + def paste_slice(self, key, index, slice_array): + ''' + ''' + + if not key in self.volumes: + sitk_type = iu.np_sitk_convert(slice_array.dtype) + self.initialize_coarse_volume(key, sitk_type) + + logging.info('resampling data from index {0} into {1} coarse grid volume'.format(index, key)) + slice_image = iu.image_from_array(slice_array.T, self.coarse_spacing[:2], True) + self.volumes[key] = iu.resample_into_volume(slice_image, None, index, self.volumes[key]) + + + def paste_subimage(self, index, output): + '''Inserts planar accumulators into coarse grid volumes + ''' + + for key, array in iteritems(output): + self.paste_slice(key, index, array) + output[key] = None + + del output + + + def build_coarse_grids(self): + + pool = mp.Pool(processes=self.nprocesses) + mapper = pool.imap_unordered(run_subimage, self.subimages) + + logging.info('building coarse grids ({} processes)'.format(self.nprocesses)) + for index, output in mapper: + + logging.info('received coarse planar data from subimage at index {0}'.format(index)) + self.paste_subimage(index, output) + + + def resample_volume(self, key): + logging.info('resampling {0} volume'.format(key)) + self.volumes[key] = iu.resample_volume(self.volumes[key], self.out_dims, + self.out_spacing, None, + self.transform) + + + def consume_volume(self, key, cb): + logging.info('consuming {0} volume'.format(key)) + self.resample_volume(key) + cb(self.volumes[key]) + del self.volumes[key] + + + def accumulator_to_numpy(self, key, cb): + self.resample_volume(key) + cb(self.volumes[key]) + logging.info('converting {0} volume to ndarray'.format(key)) + self.volumes[key] = sitk.GetArrayFromImage(self.volumes[key]) + + + def make_ratio_volume(self, num_key, den_key, ratio_key): + '''assume parents numpified + ''' + + self.volumes[ratio_key] = np.divide(self.volumes[num_key], self.volumes[den_key]) + self.volumes[ratio_key][np.isnan(self.volumes[ratio_key])] = 0 + diff --git a/mouse_connectivity/grid/subimage/__init__.py b/mouse_connectivity/grid/subimage/__init__.py new file mode 100644 index 0000000000..6d53ea20b8 --- /dev/null +++ b/mouse_connectivity/grid/subimage/__init__.py @@ -0,0 +1,27 @@ +import logging + +from .count_subimage import CountSubImage +from .cav_subimage import CavSubImage +from .classic_subimage import ClassicSubImage + + +def run_subimage(input_data): + + # TODO: remove or fix + logging.basicConfig(format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') + logging.getLogger('').setLevel(logging.INFO) + + index = input_data.pop('specimen_tissue_index') + cls = input_data.pop('cls') + logging.info('handling {0} at index {1}'.format(cls.__name__, index)) + + si = cls(**input_data) + + try: + si.setup_images() + si.compute_coarse_planes() + except Exception as err: + logging.exception(err) + raise err + + return index, si.accumulators diff --git a/mouse_connectivity/grid/subimage/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70b188830a3fa8ba3c992c092612fcdd16d5b945 GIT binary patch literal 967 zcmYjQ&u`N(6t<nTO}h-HX&XOIy-ZpUTZcG+5JEr&(xhn|CbSV%id@_6vL#MrCuQwg zBoJ3P@dvcx#J^;Yoc1qp;yI(+EcxYo?|aYw{Or75UTz>5^5<vzn;`VZI*S25dI?iM z1;Y`?F$xeT+=+2Q0)j1eV<&L~x5SmWl2n5#;3}_uML~_@L)7vvp&A`rVz4c2mOE)7 z^TVRIm(YQLz*2_}Z@G6nG1WR^ix9JQc2r<mtsR(p1|~<Rm}5@9VGMW%y5@N1K-8T> zWP)ZD4rq!?Q~^XFtIDgh+Ju~X6Fetn9_d5wcRY1QYZGTypChPsW)1s2LUPwd`O;ZK z{lI7nryQ@s8vf*J2lop;vV8&OlY5LlAW4qV1W%mP<vxLv*AB){Hn*r|d6bBjZf-X> zw=$J7q4j?+7DEwBdd((4*{*2lOSPY>gyseX>pBw*mXKi{X<djgl3bh{hsApQ;DkyZ zM{>}-*qt_M-YmK1#iMEKj;Y1zU;vz1>QQKECzbtZVCn;r?*k!}@iaiI!MJ+|Z{Haw zOEcp}61J{Fhm9A8R$UkdK4cbI7}-nH!8%KmtjI;kQmV8FvzSVuP5sR|6ImXm($vKQ z20mr1NQ#)|snV@V(1;||hMeZqR7$zZvzrke8AmAf3#kq8|BgG)y6?46x=T+e-|5kh zRF1l@BxR}O^l?|nq3))ckeY!_vy+kT?nk|@j&iY`QFdmfc4-_#20v>jX#q;1RtmU~ zVU&;B0~PVME_&su+9C8c%ENFc8yQ~}GF&iLoqh-gIX+$`4cx$Mq(KPwu#Z>3+aT&b zuq{v3;S=0p_K9DYE5`<XMu#^c*M?Tu)l<I-+c#b=Rd(Q(xd(*to+l|UV)4TM656Wr Jhz}Bc=O5}S5=;O9 literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/subimage/__pycache__/base_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/base_subimage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e4bd31ab53eaa6ac6c66737db80a97e022777e4 GIT binary patch literal 8382 zcmdT}O>-niTCT6|uKrM~N7C3cws%}!?>gwk*6i9iFlLzb?(BMFz{m?8!bFAGqSRF_ zl~i5T&a9ppwOc{Jm{<<%awlLz3Qqh4E?l{DtP2M&%z+3ZI6!cL=gF$B?v~m!h8rbi zR%T~be!Tg9Jnx&|-`Hqrc#^;QWB)&2)3kqPW&T(we1IhX3R$29daR9fSJzoKV#77m z+jLF!wp>fSYi=EHGj5D**H(S4xH)RMEmf|??NP_w(6t|FK|N@Ep#_bw`^0oNQMZF8 z>dkNy^&aZ2ppAN4)vux62{usQQ1z{#8*F}|x!Zy9iPrBu#R|2)p4&n6Fp^Q4?4e>! z({zM)Gs;4NG?J)nMkD_)^d?ypM_Clg0l%C-CJG-Q$=^j5YOWq=t`VAn9vEL}Pju|i z3@prA3u-|fZ|oqj@oogopoO;`Y^zo3ZnIopE9eE+(9#aJu+E*_{$z4+pDP&Xn1T=A zocA7*d<j{m%|PoXhTNHH=lTU|o-xyoxldy+?|S3taTt4pbdq3OeKT(y`O?oak#CLs zlW?_JG%z4ZA;Wn1x0-09`d@!^@BRJXlcA9N{*fQ-9{7*^<aGagi9bk_z<*~yOdiVp zbQ~sffIJ-^oyz@>qJw=28oo952ParQzKvt_2u^N~(uoYQo+Jqe8OWcV-aZsja9d6e z6s>O`_-LQkcE_jr#>y79xbZqN&1mT@efq+jM7t~91~qoU!!5D=F_Qd4WHTKk(lY(r zm>GdS)3>#kwF~{+%&ZHx)Mhw9{<=d_)@K&-MrNNkLDU*j9jS3)?t{o)3#lEkUq|H| zfu_j*)WAIbZr%}LFd2ki96k)=+(^c5-4{5CAg}u}I~|9)86{cXh!QV|Mlx@qAVIPy zIn29*)EA^gSvR7IdySOx3YI*G)4_?%>*c#$c30!nRTr6e{J~%{n#6vV3fXT63a{8? zw#{sZ*>z;O<%>g%b@GUBb?imfVWaJNQ4(dIcM~<)L#CN^{UyDt*9}X*Vbt~MwdxS& zeODNkOsg1{IzrJ%-%}Ix^<qtAw51t4GR!99Vx#hx&?ZSxO`l$`=2`BselBh{)1GL5 z0<pxY=#=s8y)?T&8pq)%gg6906e1O0vWDw}bTpo1WL0$z<JeC^`R3AMZdHp}+jXGU zjQ)I+VHE{-QOF>u0r^kAz#kMH1=gJDH?_<<Cy%M}g?^`?mAN<V9z=;RqA3`|`TW~w zPf5^zJ#WP6;USsDijrZP*N3SX`I+E337(VNNYZ2)inMPiI)lNKI!pXfc;%GKDZ+2# zL&<~E^xpEx&f6ahR3q9cR@KI+1FMa3YX-NbHe=k>&a9a!zooVZF+<HduV)qn31$3h z&o@1@E=ppQn>Y5RH~jH9J}tNIjC^_GWU2G{ch34v@pa59UT5|VW{aJ-L7Hgb$6k_V z;u_lA+61!pUT#AkvIqnAYX$FplZ{Od>ya+5Jx-yzqK9E_@yE+_YN^$DY<d@8N{Wc4 zZ$TMZP)8kOx?QowqG!dS<OOOZ6G?IQPqiU<0S3c9(=+W@&x~X9&$MGJs~y+zZp`$+ z{8<hBYwcBo@bq~G6k>S;8R<TQ5({*EVg$yEXxbsun|q>*cJUgrzNvU3H|1oclmO&G zf4su|g}C2|{n0_--~Apw`gbI4`c}22t2Sfz4iu3e%eyEP-}NoGnNBiK9{J-C#*d0l zyohmfW0>^qyg8gCgDg#BnK#D1$Ra-$FQD0ND_!O(vI*|1Wa43*`q?{gt1(JW7L=nE z6~eWPCbAEZq>W6|JNUEp>C4Yp{(vXJhi|5PNRpZn=2V-3iNTt%2PHc~ix^@9t%9}} zB&C*ddrNv&F;QMqf_9mAwhN9}F;qXo0CV;BO10269ihJ-^gGnXWK++}Tb?&cgGtPC z$MZg$_;J}{j|EJz$WDu;evRwB#mr&$2D3ghl1seJY@vWvNfDExO)a8SzHM|G_NHy& zuhweY4Z+p{QuUB{e58wPj)o33*Icl;YpF6(k-Y{LZ3XS1^M$T(5%C&v(T+kyy4(6G zSl(@er?2NbpM-~0;C=?^HYeGD3*y70r)Hv^lfQ{9gR!4!PmE(|rI|4^XV%b~)qi2k z8b7Cog2MG^@*5|0@!_lyKn(}lNmG0XwXAB}H1I&HN}k--Fp7bsyn`rHvemEUH8}yb z#jj#6L0acqa%q9y*w2n&T#N7ecA<6FSYh#N9N=YUuONeXHa%|;`%-#daX{)=IKwAM zlB}nhEq%wR8$0^+YwM`8yVf4_sF+FsS&--4xB$8Y*PDFLZKfsOL&suoWTCuw7(%p{ z_E%~UyndZM7yQHS9#Uycy886BwM$%U%Bd)+<L+?)LV(9FK@cH|KhXZ5dxrBY%%`q> z*7|hKqPdj(1rdHWiGaaY)+_TDMd+{oRzQt>2XZqALGP9QmA2DbV>QJc%oA{liu;VN z-ZiG*T)WH5WLweZ)aYub-174QlK3vV#hjL8()4M6?Ud_wlLK2VgeR}d=rHl)N(*uu zOlmQ|Kw)9h3#^iv=Rm|j!W0uj8SC22xTE2BB4d<q!VsOA>N^vMWR~AG;HFql4Dpxf zNpr78z`J>2oLK=;kNS3o^2yclYHGYX#sfYtpheJtK-&Hj(5}^T$_Mx^lvV95K2`1B zL<ne&`1DODI|`j;Iymr2q~qf^0VmH%ht41kPyo&t`D5q3w;=7#LqDG2w`#mJVRPsw zfF{F9>?l!<hCm(EOLEtFfLS<>16<}5gm#qfmrlglzT-s6VmPiT4u{z&m6?P2b{D(4 zpExodVKBHx@=Z26@8a8lQ*o6?ex|mh26rC$(gEsmL^w(xh5;w>7t;XU6q<;Ds^pMe z=i@Qg3@1$y2dhK3tmubX6XzgwXp*90IJzMLzF%76bUS>U2_G(90Z|oBdrGJ?eHDoH z()J&PB6NZ<g9{i2;(hcI6oF}<U2hZH%?UMz`opB^z!a-G#j5uDt;^s~A>Ou#4v&aE zqG17q-3{gY0tYH2ENC9`Hc0p=f_LR7#q|Ap0g$gPb47s%+r`Nhl}=evW4i5PEeZ^} zowA~umJBMDcJ7qa@yhRqA|0)0nK61v`nK9;4?a~-?*UQn09OKozq?ktpEn``8Obqy z>@=yw+r;>^jrWk`50HIT@ea&NKubXltP=~Mh|sh?{f`B&{y&yLNKqWZF?Z4=qz=G8 z`R-ju@zh){<#W0IRS;G|ZpGAl;H|Iom)DtngBdwhko?MFDN&^OA%1YX)uAbdyUa(g z&rf~P?FuXX1;#1tQ3tG~Pv3hc`#fWy%7dj<s;t5k6)*$hC~)fx#!=wQ!ea$iRxY1% z@=$^eV4I=Z%;S3H5H<qy#1gS;wb)u(2pf?X1j;aWgE1Kd&l*27&rAR|SP6x|Z7^GN z`qy8L**=AaNgpNBr@v1nID$SDr;Y#|3k8*C0<}+d#X~+GzwL}qg+Gb{D7%3VgP?w| zwEePTDAafCAB3@^fc`Q|Y{6Tha&$gFb9gp*Pdg|pcj$f83RTyu7FTM_L(mn^zkRoW zm3m%FMGy)qIt2_b@en;GaTgijCmpRKu0sJYn93?}CYdU?2tft?xl8<{1~|v>MOdfR z(zoEm?m+cW2~FQz%Q;_yp5Pd%8NQF<=4CoJ0EYa%-x2TNC4Pk&J!kP7%oe^0p_BqP z;zO41GgJH9C{gerjN>^HCd!;6PKAmIzW0!n>t-94+39p@wryLQ-nxa<QxJB59@Rry z@sV88mpLr+5Uz4u7{;~Tx^hK`J{tM8`-meYh!>nb+Ycdv{YrjF8LBE_H+NLH6q^WM z6cZKx#IyW}kNMS-A8{F&ljeVqR456v3tKaN>B>f~x(*~5&F4LSn;?69L`9%5`93i@ zJuIaZ01}}T0PzrFB_J#mL;bu_)X~#M$wW&f+ys^Z!(SW+;(k**ZWZ4V;VVpB+ne56 z60SK#h}cR&6CYt!Zesx1PQrNl%j^yG0O?!q4A`cmmI}U-%6?msDc`A_hNVx0BIz0l zbkQBY#JuZi;Ybv+sDe?yg$2zO{0Ar(RzNvPm8X<%&^f5a_y=?=oICgvE&T=KmOg#; z{`~moe73vt&5Ad{b7K1H?w#VZTU_4nAbX}q_m3Qy20=prczWyVx|ZEJaOowX|1mx+ zgq|}MQHkGXsUpdWSaV^2hok~JO01i9TkzKbQuT1Rd?cOKWl=`_p@=!C5Sv?Dia*rL zTbYIuXPTBqzWL)cK0SP1P~rb5%#4s0!rU1b)8Nd9>9Zu6e*W_$`JcFNTIV7bFuieU z4_D=wQ2T$+BWn5Nk-S6JE4P44GG%Dyr&ckwI@*6h_XV@Oa(QLTtWt3>d8^Vge~!wb z2Hm0~7za&rtTahggLA2CkB2ix1%3iB0{sEKQ)k$&j6Or-KqHyu1y1X{oplf=g+2+4 zKZX9GddIjMCE%#ahjd)c<1X4Z>E3?!#zF_ZD1Z^+D9)qt@RbzPJpFGxm#la%uLH4# z@G?|HqMMd}mLi|byOpxx81gbsRL8GEqg(Siabs7^CW|{9hPDO$2BmXy{lT*JcPmCa z2~TBiB6sWK6q@GpC69Q3A^sIf*-s7kIt*n11|Z!)6cwU=<@8p#pm|x)f1hjml-a_> za}x0kX(x;2NJ{%b+I7q5G&?oH-&gpf0;4}cOX0)d3eP|QU2z1WLl%M)x{4Fw78WJ6 zfj4mLFf$lbFTtoW1XukWP<4i&gbII|=S}t2XXbHh$XnFfUaq;<<v1Kf2s(OMB;_Q8 z<Obp6+#JMmdK1<ri06JUoCwvXE-2dSMDr#{^%1UWLXq3x`H$3fpml%m!;f=woQ{_~ z1EnpMB6hH|BFJpHxEI7#lo$A!kH|7-7W-(<4H+%;rcjP%M@(>sSl*@bwz#~o;{}C6 zc80CnhM@Mu{W3zx!$~#~2q6oD6Vk-th5)R18zr}vOh!P(%Cml14x;htE}{;+L)xXe z65vG@>=0BZ_%3=ZD8BBu=GVQuSFd|_89msoZqx<+Q5FBs>*)a<Rux(<B96)~DaFGD nFYUEbGr4`I2!h|GR#UejjQMkuHsk+Br{25UJL$dFd*goqrFPwh literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/subimage/__pycache__/cav_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/cav_subimage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c357de1d8fdddb118c56112d6207d1c30a59f57 GIT binary patch literal 1171 zcmZuwO>fjZ5VoD{HoMJs+wvhHxNs~I+XFWQuYev95~`3YF4juH8@r3aAHh!gHfX8z z>g9)kIPsTq<%IYLoR~>js05BYGak>EpP4+GOvVJ3`}CjqmJsp<59^hJ@Bnr^1tN*0 zhFHoeMVT4KS<e%m^gQKh&j)-6JTV(K<5_Q;nvoszaW4<drp@^T<e}U!TXxE)cAIb8 z9lk@!V<Iy-dQap?P5)2$u4G4KZ~PUqlResHQlIFky*q?M`qq03e57j?VA}|XskUON zil){^*ILD|6g`t}`plbl>D^JYc!Cz)<s-GU%GIKVaKE%WPh72B)OEX7m6&?H7zhtw z#~VNt;ZzcUfJ(Mx06`+t_XHpqK*_^y^FW-egLJvoF>1Fgpf1&oOL0=vL6j<#SRXDx zo*>!>u;U?+ntY%u@(RLVBOmFzpYnaOA|DdTR`esIXp{Cf$u)wSckB%8;67O~ygy?r z@&bAU1*L~!6Qc5QY-~~KQ)ObvL9sXJn5+1v@k?C_Q#fDqVGm;Dmqb;W_T0KCeFNBp zF0+lPHRu7=G%9n<$IiQ-@8etewBP5?By2;H?`H>h=g*@GaV}m8Ia`Q-g=^;zohZGN z;?7*TlQ{PkKwkp&)yp={pX$XNI-zb?qI?Z417BmnLcZR&zKIGda!!>sj6~h;FN2o* zv03z`?_(9~!>nq%E2XzpQ=^Xv;942sRJ;nMMXZmoZJM#1?NUZ_%GleR7n(QwtM4HI zmlcH*Rux4zE(+^qV^GeE;!PvW`3>I+>P@4Al0^j*7{e}P>oK`Nc2I{uAqo+vAY)n5 zYxXW-?Bk|x0>lnDfZYc4Y6-*CC9#d&=(urZ?Y)V7;2K-CVFE_{dMtI-&YbK4nQ81D zRM3xmz+nS#eHt(szqJN-_9w721a|i8e+mP1WxC;$g#aMeAcqamhYZOG3BKmS3lZdi cuj{gV=Ro~~gC7x%oM!m344}_hPA?CC0FhiruK)l5 literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/subimage/__pycache__/classic_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/classic_subimage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9caad5f28298eedd405a497bb97bd029728dd885 GIT binary patch literal 3743 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 literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/subimage/__pycache__/count_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/count_subimage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b199478afaddf0e1bd0ca3408595fdb51a62c37 GIT binary patch literal 2882 zcma)8-*4PR5caNpcRt5=Nz=5X6zG)#;*hvV@P^t7S^+{r5mE(0t4NFE-CW%GS9k3+ zcREl}EA<Ipc|j-@Py9=M<*EMyPt2^(ce%7wSn|%UcV~BIzHeuIr`Pi=c+x+A4i48W z>u(%1PYXJq!mE#=5tbmal@LY<_GwHRHPU9bkq&c=Y_T>-JMJVdbIn>O?j|1dOurSc zB|hsxzb!g(KUrt%$p+gX)|ZxWMfZs%x^hFVKX%v!LGM{Z?>U@p4N2vS=s40*mhQs9 znPyo6vKtjr!JB9ptVc;Omb@&YI4UBkpA*!i)%rJCJQ-){y>kC6Tv2V^ljB6DMNq(Y z&DRjmX&z_Z(ceKwT8sz_yd{DPdyM`%V*=i8KD7=A`thX8TDA4yyC>G3Sga#_(F5s< zzE}s@6&vCLNbjlTSZobEyIA$^W@TD522_3$X&t3w4i3nwn`T@`<1~n?UJx8}c@oAY z`d|6_jQN#^lZ6UGsX}*dHbRQvt;4H7f~K$vGP54j`*cQTbY{<-183&`L1(R5Tae%B ztos}N6@Z;}W)=rH!92PPq4V=PbUaEAvTF0}!8{L&Lp^k=mM(LtR2Pn^Tn;Ovg7fN9 zl-`#i2ADT{9LdShs~j!k1Li9!%24uH9?O_@qLhm$(aeL6&Vvx5!1`epC@q_@LTA(l zHW%?ICs1QuwT~X6L@IC|#(~zH|7HF2=<X+b-)gD!UT_$Q(SGnSNGE%rr9qgbBKUYu zrpJ0O%VnxVXtVrqqW8Xz_V+Y!=|edG2xtPjaSSWO(N2<;U<l}@=+bdiOm@a95<9xw zH=NrE5lG$)NBKl;f{kdWHkjBO#Id)?^zsVgqb6D*G8G?`2;5zG^&@Cz)+yXO<lQqH z;IZx#;fU5R2o=saz`kaNiuNsBVZ%$0+Uk3hIKF~ksp#A^vaoMisSDc9GdRx75Y#(u z3Fle8Z%cHrXK3K=svg*(kWyb%Uaqn^tV6=qYJT!GNTh<~VZnWDP#?CL7vy<7;Ypy6 z*g&2jM<GUr()>VW2|r7xs%;{v4Y=$^vwX4NiyF+`kJ3OzQ#mAR3vJw9G*{4=Eig8e zz=*TwyahA*GBg(LQ=j&UOMS9QJnBNvBh$B65qjAc3$!TgvOsGW28DG>1er&X3KM++ z@qb2%RXC?DL<7f0I{5uZxR$3>v}Od?`~)LhajTAfdv`hrvm}R%mW~IDPz-`FER!-0 zicD#?wfGMFOL!ig$XKhZV2yem8g}j6{2V|?GxgG8yXwT*cnn8Wj=AO+YuwB<kRF%~ z*ZU3FtD<RMt-<0b3}POnVn|Kk+12G44M7(BpGW0F?U95;F=rAcDD6XI0SudToA`v% z>9tiLUeH>guySYKhh1KU!b*Id-RbpZd>hNNbTz=2Ojyr{%>;MoDCCp6hRpyQ4AXzm zakFt@dC+ZGt=rHT&&hP~a-Ww9D^7Pn&m@XF&^hmPVV^qSY|GHkkV}{`B!=5_%Hgab z;ryzv(ha;G7z(UL!#hJV%n1sCW7{hg>I@Nw?eh`3j_VgBO0(jB#cX-%=b&FFRbb0D zUfKVM+EQgDYItc))CSOjNLY0mJSB5UYxzT61<5X8d;?ahcd&UEn^$0bslj+&yYe_l zrN-1yn~Yfo^33$c%Yk0e0vh!}ap+@J#S{xw)#E(LL>Xh>=lnq##Ptm8EBT;|psJd3 ztJ&qn_-yvmrY@;B(T#Iny$9c_-n@v0GLAW4UR|)|HPpepYAQWirm+}f(rnv(&)sr; zx8rur>~Iq;Jt&J(fu#yVZfH>1dZMfDL79d{mc^R2(lUW!X*h9JhfzKmrSKyF)przO z+JRpO^OL4**aEbp6NSHK?1QE>k6tXzBP`9M#b2Pp3|-NvWWD_We<$WOTjBLlSe=c@ gOJD1rsUYsnI@-4}$7n3+KH>)mx{#!Ns2m&izhmYJUH||9 literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/subimage/base_subimage.py b/mouse_connectivity/grid/subimage/base_subimage.py new file mode 100644 index 0000000000..4cce80aa41 --- /dev/null +++ b/mouse_connectivity/grid/subimage/base_subimage.py @@ -0,0 +1,270 @@ +from __future__ import division +import logging +import sys +import functools + +import numpy as np +from scipy.ndimage.interpolation import zoom +from six import iteritems + +from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu + + +#============================================================================== + + +class SubImage(object): + + @property + def pixel_counter(self): + if not hasattr(self, '_pixel_counter'): + self._pixel_counter = self.make_pixel_counter() + return self._pixel_counter + + + def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, + *args, **kwargs): + + self.reduce_level = reduce_level + self.in_dims = np.around(in_dims / 2**reduce_level).astype(int) + self.in_spacing = in_spacing * 2**reduce_level + self.coarse_spacing = coarse_spacing + + self.blocks, self.coarse_dims = iu.grid_image_blocks( + self.in_dims, self.in_spacing, self.coarse_spacing) + + self.images = {} + self.accumulators = {} + + + def setup_images(self): + pass + + + def compute_coarse_planes(self): + raise NotImplementedError() + + + def binarize(self, image_name): + logging.info('binarizing {0}'.format(image_name)) + self.images[image_name][np.nonzero(self.images[image_name])] = 1 + + + def apply_mask(self, image_name, mask_name, positive=True): + logging.info('applying {0} mask to {1}'.format(mask_name, image_name)) + + mask = self.images[mask_name] + if not positive: + mask = np.logical_not(mask) + mask = mask.astype(np.uint8) + + self.images[image_name] = np.multiply(self.images[image_name], mask) + + + def make_pixel_counter(self): + fn = lambda x: np.sum(x) * 2 ** ( self.reduce_level + 1) # additional x2 <- is an area + return functools.partial(iu.block_apply, out_shape=self.coarse_dims, + dtype=np.float32, blocks=self.blocks, + fn=fn) + + + def apply_pixel_counter(self, accumulator_name, image): + self.accumulators[accumulator_name] = self.pixel_counter(image) + + +#============================================================================== + + +class SegmentationSubImage(SubImage): + + required_segmentations = [] + + + def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, + segmentation_paths, *args, **kwargs): + + super(SegmentationSubImage, self).__init__( + reduce_level, in_dims, in_spacing, coarse_spacing, *args, **kwargs) + + self.segmentation_paths = segmentation_paths + + if 'filter_bit' in kwargs and kwargs['filter_bit'] is not None: + self.filter = 2 ** kwargs['filter_bit'] + + + def setup_images(self): + super(SegmentationSubImage, self).setup_images() + self.get_segmentation() + + + def get_segmentation(self): + + for name in self.__class__.required_segmentations: + self.read_segmentation_image(name) + + self.process_segmentation() + + + def process_segmentation(self): + pass + + + def extract_signal_from_segmentation(self, segmentation_name='segmentation', + signal_name='signal'): + ''' + + Notes + ----- + Currently, the segmentation uses a series of codes to map 8-bit values + onto meaningful classifications. The code for signal pixels is a 1 in + the leftmost bit. + + In some cases, bit 5 indicates that the pixel was not removed in a + posfiltering process. Optionally, this postfilter can be applied in gridding. + + ''' + + logging.info('extracting {0} mask'.format(signal_name)) + self.images[signal_name] = np.right_shift(self.images[segmentation_name], 7) + + signal_count = np.count_nonzero(self.images[signal_name]) + logging.info('{0} signal pixels were detected'.format(signal_count)) + + if hasattr(self, 'filter'): + filter_mask = np.bitwise_and(self.images[segmentation_name], self.filter) + self.images[signal_name][filter_mask == 0] = 0 + + filter_count = np.count_nonzero(self.images[signal_name]) + logging.info('{0} / {1} pixels passed the signal filter'.format(filter_count, signal_count)) + + + + + def extract_injection_from_segmentation(self, segmentation_name='segmentation', + injection_name='injection'): + ''' + + Notes + ----- + Currently, the segmentation uses a series of codes to map 8-bit values + onto meaningful classifications. The code for signal pixels is a 1 in + at least one of of the 5 rightmost bits. + + ''' + + logging.info('extracting {0} mask'.format(injection_name)) + self.images[injection_name] = np.bitwise_and(self.images[segmentation_name], 31) + self.images[injection_name][self.images[injection_name] > 0] = 1 + + + def read_segmentation_image(self, segmentation_name='segmentation'): + ''' + + Notes + ----- + We downsample in memory rather than using the jp2 pyramid because the + segmentation is a label image. + + ''' + + path = self.segmentation_paths[segmentation_name] + logging.info('loading {} from {}'.format(segmentation_name, path)) + segmentation = iu.read_segmentation_image(path) + logging.info('{} shape: {}'.format(segmentation_name, segmentation.shape)) + + if self.reduce_level > 0: + logging.info('downsampling {0}'.format(segmentation_name)) + segmentation = zoom(segmentation, 1.0 / 2**self.reduce_level, order=0) + + self.images[segmentation_name] = segmentation + + +#============================================================================== + + +class IntensitySubImage(SubImage): + + required_intensities = [] + + + def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, intensity_paths, + *args, **kwargs): + + super(IntensitySubImage, self).__init__(reduce_level, in_dims, + in_spacing, coarse_spacing, *args, **kwargs) + + self.intensity_paths = intensity_paths + + + def get_intensity(self): + + for name in self.__class__.required_intensities: + info = self.intensity_paths[name] + logging.info('loading {} intensities from {}'.format(name, info['path'])) + + self.images[name] = iu.read_intensity_image(info['path'], self.reduce_level, info['channel']) + logging.info('loaded {} intensities to image of shape: {}'.format(name, self.images[name].shape)) + + + + def setup_images(self): + super(IntensitySubImage, self).setup_images() + self.get_intensity() + + +#============================================================================== + + +class PolygonSubImage(SubImage): + + required_polys = [] + optional_polys = [] + + def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, + polygon_info, *args, **kwargs): + + super(PolygonSubImage, self).__init__( + reduce_level, in_dims, in_spacing, coarse_spacing, *args, **kwargs) + + self.polygon_info = polygon_info + + + def setup_images(self): + super(PolygonSubImage, self).setup_images() + self.get_polygons() + + + def get_polygons(self): + + polygon_keys = [] + polygon_keys.extend(self.__class__.optional_polys) + polygon_keys.extend(self.__class__.required_polys) + + for key in polygon_keys: + logging.info('rasterizing {0} polygon'.format(key)) + + points = self.polygon_info[key] + self.images[key] = iu.rasterize_polygons(self.in_dims.astype(int)[::-1], + [1.0 / 2**self.reduce_level, + 1.0 / 2**self.reduce_level], + points).T + + +#============================================================================== + + +def run_subimage(input_data): + + # TODO: not propagating the log level from the calling thread + logging.getLogger('').setLevel(logging.INFO) + + index = input_data.pop('specimen_tissue_index') + cls = input_data.pop('cls') + logging.info('handling {0} at index {1}'.format(cls.__name__, index)) + + si = cls(**input_data) + + si.setup_images() + si.compute_coarse_planes() + + return index, si.accumulators diff --git a/mouse_connectivity/grid/subimage/cav_subimage.py b/mouse_connectivity/grid/subimage/cav_subimage.py new file mode 100644 index 0000000000..4085a6e5d6 --- /dev/null +++ b/mouse_connectivity/grid/subimage/cav_subimage.py @@ -0,0 +1,37 @@ +from __future__ import division +import logging +import sys +import functools + +import numpy as np +from scipy.ndimage.interpolation import zoom +from six import iteritems + +from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu +from .base_subimage import PolygonSubImage, SegmentationSubImage, IntensitySubImage + + +#============================================================================== + + +class CavSubImage(PolygonSubImage): + + required_polys = ['missing_tile', 'cav_tracer'] + + + def compute_coarse_planes(self): + + nonmissing = np.logical_not(self.images['missing_tile']) + del self.images['missing_tile'] + + self.apply_pixel_counter('sum_pixels', nonmissing) + + cav_nonmissing = np.multiply(self.images['cav_tracer'], nonmissing) + del nonmissing + self.apply_pixel_counter('cav_tracer', cav_nonmissing) + del cav_nonmissing + + del self.images + + +#============================================================================== diff --git a/mouse_connectivity/grid/subimage/classic_subimage.py b/mouse_connectivity/grid/subimage/classic_subimage.py new file mode 100644 index 0000000000..a0ddd43c16 --- /dev/null +++ b/mouse_connectivity/grid/subimage/classic_subimage.py @@ -0,0 +1,119 @@ +from __future__ import division +import logging +import sys +import functools + +import numpy as np +from scipy.ndimage.interpolation import zoom +from six import iteritems + + +from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu +from .base_subimage import PolygonSubImage, SegmentationSubImage, IntensitySubImage + + +#============================================================================== + + +class ClassicSubImage(IntensitySubImage, SegmentationSubImage, PolygonSubImage): + + required_polys = ['missing_tile', 'no_signal', 'aav_exclusion'] + optional_polys = ['aav_tracer'] + required_segmentations = ['segmentation'] + required_intensities = ['green'] + + + def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, + polygon_info, segmentation_paths, intensity_paths, + injection_polygon_key='aav_tracer', + *args, **kwargs): + + super(ClassicSubImage, self).__init__( + reduce_level, in_dims, in_spacing, coarse_spacing, + polygon_info=polygon_info, + segmentation_paths=segmentation_paths, + intensity_paths=intensity_paths, + *args, **kwargs) + self.injection_polygon_key = injection_polygon_key + + + def process_segmentation(self): + + self.apply_mask('segmentation', 'missing_tile', False) + + self.extract_signal_from_segmentation(signal_name='projection') + + self.apply_mask('projection', 'no_signal', False) + del self.images['no_signal'] + + if self.injection_polygon_key in self.images: + logging.info('reading injection from rasterized {} polygon'.format(self.injection_polygon_key)) + self.images['injection'] = self.images[self.injection_polygon_key] + del self.images[self.injection_polygon_key] + else: + self.extract_injection_from_segmentation() + del self.images['segmentation'] + logging.info('injection pixel count: {}'.format(np.count_nonzero(self.images['injection']))) + + self.binarize('projection') + self.binarize('injection') + + + def compute_coarse_planes(self): + + # do these in batches to minimize peak memory usage + self.compute_intensity() + self.compute_injection() + self.compute_projection() + self.compute_sum_pixels() + + del self.images + + + def compute_intensity(self): + logging.info('computing green accumulators') + + self.apply_pixel_counter('sum_pixel_intensities', self.images['green']) + + injection_intensity = np.multiply(self.images['green'], self.images['injection']) + self.apply_pixel_counter('injection_sum_pixel_intensities', injection_intensity) + del injection_intensity + + self.images['green'][self.images['projection'] == 0] = 0 + self.apply_pixel_counter('sum_projecting_pixel_intensities', self.images['green']) + + self.images['green'][self.images['injection'] == 0] = 0 + self.apply_pixel_counter('injectionsum_projecting_pixel_intensities', self.images['green']) + + del self.images['green'] + + + def compute_injection(self): + logging.info('computing injection accumulators') + + self.apply_pixel_counter('injection_sum_pixels', self.images['injection']) + + injection_projecting_pixels = np.logical_and(self.images['injection'], self.images['projection']) + self.apply_pixel_counter('injection_sum_projecting_pixels', injection_projecting_pixels) + del injection_projecting_pixels + + del self.images['injection'] + + + def compute_projection(self): + logging.info('computing projection accumulators') + + self.apply_pixel_counter('sum_projecting_pixels', self.images['projection']) + del self.images['projection'] + + + def compute_sum_pixels(self): + logging.info('computing sum pixel accumulators') + + self.apply_pixel_counter('sum_pixels', np.logical_not(self.images['missing_tile'])) + + if 'aav_exclusion' in self.images: + self.apply_pixel_counter('aav_exclusion_sum_pixels', self.images['aav_exclusion']) + + +#============================================================================== diff --git a/mouse_connectivity/grid/subimage/count_subimage.py b/mouse_connectivity/grid/subimage/count_subimage.py new file mode 100644 index 0000000000..bf6c544dec --- /dev/null +++ b/mouse_connectivity/grid/subimage/count_subimage.py @@ -0,0 +1,84 @@ +from __future__ import division +import logging +import sys +import functools + +import numpy as np +from scipy.ndimage.interpolation import zoom +from six import iteritems + +from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu +from .base_subimage import PolygonSubImage, SegmentationSubImage + + +class CountSubImage(SegmentationSubImage, PolygonSubImage): + + required_polys = ['missing_tile', 'no_signal', 'aav_exclusion'] + required_segmentations = ['segmentation'] + + def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, + polygon_info, segmentation_paths, injection_polygon_key='aav_tracer', *args, **kwargs): + + super(CountSubImage, self).__init__(reduce_level, in_dims, in_spacing, + coarse_spacing, + polygon_info=polygon_info, + segmentation_paths=segmentation_paths, + *args, **kwargs) + self.injection_polygon_key = injection_polygon_key + + + def process_segmentation(self): + + self.apply_mask('segmentation', 'missing_tile', False) + + self.extract_signal_from_segmentation(signal_name='projection') + + self.apply_mask('projection', 'no_signal', False) + del self.images['no_signal'] + + if self.injection_polygon_key in self.images: + self.images['injection'] = self.images[self.injection_polygon_key] + del self.images[injection_polygon_key] + else: + self.extract_injection_from_segmentation() + del self.images['segmentation'] + + self.binarize('projection') + self.binarize('injection') + + + def compute_injection(self): + logging.info('computing injection accumulators') + + self.apply_pixel_counter('injection_sum_pixels', self.images['injection']) + + injection_projecting_pixels = np.logical_and(self.images['injection'], self.images['projection']) + self.apply_pixel_counter('injection_sum_projecting_pixels', injection_projecting_pixels) + del injection_projecting_pixels + + del self.images['injection'] + + + def compute_projection(self): + logging.info('computing projection accumulators') + + self.apply_pixel_counter('sum_projecting_pixels', self.images['projection']) + del self.images['projection'] + + + def compute_sum_pixels(self): + logging.info('computing sum pixel accumulators') + + self.apply_pixel_counter('sum_pixels', np.logical_not(self.images['missing_tile'])) + + if 'aav_exclusion' in self.images: + self.apply_pixel_counter('aav_exclusion_sum_pixels', self.images['aav_exclusion']) + + + def compute_coarse_planes(self): + + self.compute_injection() + self.compute_projection() + self.compute_sum_pixels() + + del self.images diff --git a/mouse_connectivity/grid/utilities/__init__.py b/mouse_connectivity/grid/utilities/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mouse_connectivity/grid/utilities/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/utilities/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c6828e9aeff5087cbb4958aa0c97f21c31bc822 GIT binary patch literal 210 zcmYL@Jqp4=5QR5jAwmvfp(*S{#Gh7d#BO1kWQRDo?uN`p309uP$}8D=1UoAyh4|oo zZy4smtkQI#ME-t*E?*sfN@Q4wxhJq{r-sS)q3Uk^$LG49>OEu48V+E`Ib6WEdg-AE z-oiwqKeG-MdM<>aI<%}elxwDlqY8>6lqg;2<iZ}aQ)n2CbUhZ4&J^3MtjT6gBu9~u YGh@h8G-h12&;INbY~yg=J@po=FG^ZH(*OVf literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/utilities/__pycache__/downsampling_utilities.cpython-37.pyc b/mouse_connectivity/grid/utilities/__pycache__/downsampling_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..214412abcba3157f08c11f5d9d9d347da633faa3 GIT binary patch literal 3069 zcmai0U2hz>6(u<zJ6f$iEX%DNx$P!t-7e6q(lkW@!*JZj%|j6g1>82kK*3_Pq*i0i z&TL5TN~?|@+BIP1p#}O6Wb~<jX`Tx7$$ueFJ(sh)vRnt50m;it&hYZya}W93wY4V0 zlmF|l$=(WM|E1325fC1um`hZWNuIGGk2xn<WFq#^dYL~A;$W@|;}AMOYYd|}a=IW} z88+jllf!Iv*os^8xoh#dY{=+2i#OzoY@*$itFndmmRytTXt(5s+(dg@-jZ8rx21T> zI=5fJ8rI=eB-2T1(jwnSCp^<hK2VTahgs1->1id$ed=#aQgzx(Oz$+!WpQfg%YKnh zifp3#9{mfCKQEu6H3z6lQSx1O;gz1`Cqi$R>?tcf%dU9oz2rM^0JI-jQ9?Tt7c9Sj zW7NawAFQ_=jjS*I8UGun|8#==R~&0-ss<={{`1Lsds3XK%(VMSo)@-#sM_OPO;nyu z+h&xd_T5fUiF{NAM_EzmYOUU9GEq7isA|35UT@KF{yE9U>UUZfy5m<NwmTlGc%who zTIIH9MoB--2l2X1^gu29Rd|&2ZK40o^aiZ@=Ic)%9Q?^BZ4Q#-M0O98(<GlB{3cJ} zL7DvWK;;v2P>fV=`lyT1@zflAo*o{U)T$4##0gBpw^@c6@?>vVjE(By+g$Z6qGzXj z1D(pfu}!hTRGB?QC^yLv`^^WvrMf$sR$I#<wb*0}CYmjBpNK@neX+$`90fgn3)(&* zm>z0F6c^qH5Gat6Um?gZ@p5LpE1%@6z=kjR1-Ffo*{J074!jw+-m?`cW<G-F?Vo?V zGzC_+52tMxigxXKQk|yuxSh0XU$%>*_Fq1{aMA8Gt43A~2AEX&X?|3|;e{S1R!6WZ z4ijCBb6JInvD1;Nyfn9(uvrCmJjzt;4^@(PgkFPAuTw=~s;f<sD4TzPVraXJZ{l^j zr7H;W0SdL|GgN1fEi2hGKI2c=mmhu2ta!m*@FO9)6wjmUu^DDu5Z=XIr2Q_wDaAwf zRqG4T0o>y6_X*DQEWCXivgx84VDgvuFW}2dhQw%FcF83}67fqu^KvXAvD{4jQ+(w- ztQ+`fzjhd}0+Xf4WKoIkhm}ZENPcpbnrd|pd6S;2YZrXee3+%i_KV@@(a*>NXO4IN zeli+m)82wKO!pypBFW4n2#fizXl}>T<ebXSWjfT~cbY0lhk&xahhFTNtnb!CAa<c} zT21b+Hr`m|eJG7%Sg|PtZ+V-ZeiyoBI4BepDi@A(2n%FhvKpBsyYgPL3ugVRfOJ=( zZ2+M{ic)MN5IZ0#8hgQxxb$W4JVG#|Cu~M&uIKu8g@QE`z<IM|mn3`m<7zFJUg^&Q zgfQGc|J9qwu3h|H(EcF|cR{;>0RpbWz%~SjfmV%yT~<f>8oco2T}-NkIqvY+fbB3% zc>Xm?9Z7cn-c71|TOd0vO}wCKc}>e#J_u^+vJ9e1Gku4KzDGlWIZj5(#f7Hjld7T4 ztOgNwg4Z&QVt<V}t48r^F}9;I$a4X}h3(GlRm}edilH8*Vk9=fPi@fzLunelar`V% z@G(XR1umj42@z3IM-;Jkhl=zl)_(_QVa&hHb}0qJn<+?;a_*<~o%^E;B;dEWUcZA` zu%C8$olKg1{}^TA`yKMn+dLlAp=xZB+xdxxzadeFg;a3rB+1}Q$8mm<E2Dox%g~nf zk5F}d-6q*Fn)7pbqI9mZI?d)*Ij`QwyiZUJp^Nc%xF$`X@`xVXVXo;-qT`Ni9~l#z z{n3hNIL@UQh=KFlHv0zy={>jzE%L{a9{h?73d!4`yM_&901aDekX>ctE-QmF0{Ol7 z1tjNrM^^uz0<=RHgP%iiG59g1fVl?>1aB@Wu<81a4(B8&G$j?THhKr`JU{9ni8@F` zZf`{D_fXZ5;^(__48JW{H`0`Bd`chE51ox|XX6fN85E6U&&y#SAm`+{eZJfAzO&Np z`z@AU=eJ`=2d2-LCIYZ^J_exg!hqUs)fnjl_crTLQFHIg8_>{XX53n&9;I#-*1g#8 zC&rzcqsoJ-M$hZ+auE6{e(;3MAh<En6!*kBZ}Kfrw5GAnovPXE9gXc+t6opjnNY3Z zLZfX_WJZ60e!ODRv+l5%0LqkSj&0%%bK;JPE>3BKkKNH7w-#Eu&S(N^e8=?D(X>kk z3{I8qQJUfJ#^pmC<m2I-soW*T9p8?e9A`MVJ2PMNuDb-#-m2&!GH#ryM|2n)%IOx5 Tz&ep=p+@UPx1umw#~b_)>Bg$I literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/utilities/__pycache__/image_utilities.cpython-37.pyc b/mouse_connectivity/grid/utilities/__pycache__/image_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c16894fb092d3829114c1e6be31c026acfed288 GIT binary patch literal 6691 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�xdMLjL9l&!Qf@C(V6jI9)^CB3c6EeU&I%8e0!!> zsE<^Fb9qjZG<ib~$=H9h+hkY5MuRm=6ZTl>nwVbVn`|3H-#_&Y3hN^vgeE_N@e&3P zj2hQCe)KN)ndB=FvXOp-qR!6E!(9$Jxw=_LZdWs1w;>vCtzMg{)x3&V^BUfq_mp>X ew(iwxr)qQj{|%zH<hl5>J=^qXy^Uv{-+uydRTt_2 literal 0 HcmV?d00001 diff --git a/mouse_connectivity/grid/utilities/downsampling_utilities.py b/mouse_connectivity/grid/utilities/downsampling_utilities.py new file mode 100644 index 0000000000..e618659be3 --- /dev/null +++ b/mouse_connectivity/grid/utilities/downsampling_utilities.py @@ -0,0 +1,81 @@ +from __future__ import division +import itertools as it +from six.moves import xrange +import logging + +from skimage.measure import block_reduce +from skimage.util import view_as_windows +from scipy.ndimage.filters import convolve +import numpy as np + + +def downsample_average(volume, current_spacing, target_spacing): + + factor = target_spacing / current_spacing + + if factor == 1: + return volume + + if factor - np.floor(factor) == 0: + volume = block_average(volume, factor) + elif factor - np.floor(factor) == 0.5: + volume = window_average(volume, factor) + else: + raise ValueError('voxels cannot be unevenly split!') + + return volume + + +def block_average(volume, factor): + logging.info('downsampling by block averaging with a factor of {0}'.format(factor)) + factor = np.around(factor).astype(int) + return block_reduce(volume, tuple([factor, factor, factor]), np.mean, 0) + + +def apply_divisions(image, window_size): + + for axis in xrange(image.ndim): + + slc = tuple([ + slice(window_size-1, None, window_size) + if ii == axis + else slice(0, None) + for ii in xrange(image.ndim) + ]) + + image[slc] = image[slc] / 2 + + +def window_average(volume, factor): + logging.info('downsampling by window averaging with a factor of {0}'.format(factor)) + volume = volume.copy() + + window_size = np.ceil(factor).astype(int) + window_step = 2 * window_size - 1 + output_size = np.ceil([sh / factor for sh in volume.shape]).astype(int) + + apply_divisions(volume, window_size) + volume = conv(volume, factor, window_size) + + return extract(volume, factor, window_size, window_step, output_size) + + +def conv(image, factor, window_size): + kernel = np.ones([window_size for ii in image.shape]) + return convolve(image, kernel, mode='constant', cval=0.0) / factor ** image.ndim + + +def extract(image, factor, window_size, window_step, output_shape): + + output = np.zeros( output_shape ) + + for case in it.product(*([[0, 1]] * image.ndim)): + + inp = tuple([slice(window_size - 2, None, window_step) + if not ii else slice(window_size, None, window_step) for ii in case]) + out = tuple([slice(0, None, 2) if not ii else slice(1, None, 2) for ii in case]) + + output[out] = image[inp] + + return output + diff --git a/mouse_connectivity/grid/utilities/image_utilities.py b/mouse_connectivity/grid/utilities/image_utilities.py new file mode 100644 index 0000000000..cc620649ad --- /dev/null +++ b/mouse_connectivity/grid/utilities/image_utilities.py @@ -0,0 +1,291 @@ +from __future__ import division +import logging +import os +import sys + +from six import iteritems +import numpy as np +import SimpleITK as sitk +from skimage.draw import polygon + +from allensdk.config.manifest import Manifest + + +if sys.version_info[0] > 2: + failed_import = (ImportError, ModuleNotFoundError) +else: + failed_import = (ImportError,) + + +# use np_sitk_convert or sitk_np_convert to access +# TODO: check if this already exists. If not: add more dtypes +# it does not +NUMPY_SITK_TYPE_LOOKUP = {np.dtype(np.float32): sitk.sitkFloat32} +SITK_NUMPY_TYPE_LOOKUP = {v: k for k, v in iteritems(NUMPY_SITK_TYPE_LOOKUP)} + + +# ITK/Numpy + + +def set_image_spacing(image, spacing, origin=True): + ''' + ''' + + spacing = np.array(spacing) + + image.SetSpacing(spacing.tolist()) + + if origin: + image.SetOrigin((0.5 * spacing).tolist()) + + +def new_image(dims, spacing, dtype, origin=True): + ''' + ''' + + if len(dims) == 2: + image = sitk.Image(dims[0], dims[1], dtype) + elif len(dims) == 3: + image = sitk.Image(dims[0], dims[1], dims[2], dtype) + set_image_spacing(image, spacing, origin) + + return image + + +def image_from_array(array, spacing, origin=True): + ''' + ''' + + image = sitk.GetImageFromArray(array) + set_image_spacing(image, spacing, origin) + + return image + + +def np_sitk_convert(np_type): + ''' + ''' + + return NUMPY_SITK_TYPE_LOOKUP[np_type] + + +def sitk_np_convert(sitk_type): + ''' + ''' + + return SITK_NUMPY_TYPE_LOOKUP[sitk_type] + + +# Math + + +def compute_coarse_parameters(in_dims, in_spacing, out_spacing, reduce_level): + ''' + ''' + + reduce_factor = pow(2, reduce_level) + fradius = np.divide(out_spacing, in_spacing) / 2.0 / reduce_factor + + coarse_grid_radius = np.round(fradius) + coarse_grid_size = (coarse_grid_radius * 2 + 1) * reduce_factor + + coarse_grid_spacing = np.multiply(in_spacing, coarse_grid_size) + coarse_grid_dims = np.ceil( + np.divide(in_dims, coarse_grid_size) + ).astype(int) + + return coarse_grid_dims, coarse_grid_spacing, coarse_grid_radius + + +def block_apply(in_image, out_shape, dtype, blocks, fn): + ''' + ''' + + out_image = np.zeros(out_shape, dtype=dtype) + + for ii, row_block in enumerate(blocks[0]): + for jj, col_block in enumerate(blocks[1]): + + out_image[ii, jj] = fn(in_image[row_block[0]:row_block[1], + col_block[0]:col_block[1]]) + + return out_image + + +def grid_image_blocks(in_shape, in_spacing, out_spacing): + ''' + ''' + + blocks = [] + out_shape = [] + for dim in range(len(in_shape)): + in_px_centers = np.arange(in_spacing[dim]*0.5, + in_shape[dim]*in_spacing[dim], + in_spacing[dim]) + + out_px_edges = np.arange(out_spacing[dim], + (in_shape[dim]-0.5)*in_spacing[dim], + out_spacing[dim]) + + dig = np.digitize(in_px_centers, out_px_edges) + + inds = np.where(np.diff(dig) > 0)[0] + 1 + inds = [0] + inds.tolist() + [in_shape[dim]] + + dim_blocks = [ + (int(inds[i]), int(inds[i+1])) for i in range(len(inds)-1) + ] + + out_shape.append(len(dim_blocks)) + blocks.append(dim_blocks) + + return blocks, out_shape + + +# Polygons + + +def rasterize_polygons(shape, scale, polys): + + canvas = np.zeros(shape, dtype=np.uint8) + for points in polys: + + rpts = np.array([ + int(np.around(item[1] * scale[1])) for item in points + ]) + cpts = np.array([ + int(np.around(item[0] * scale[0])) for item in points + ]) + + poly = polygon(rpts, cpts) + canvas[poly] = 1 + + return canvas + + +# Transforms + + +def resample_into_volume(image, transform, z, vol, dtype=sitk.sitkFloat32): + ''' + ''' + + if transform is None: + transform = sitk.Transform() + + timage = sitk.Resample(image, transform, sitk.sitkLinear, 0.0, dtype) + tvol = sitk.JoinSeries(timage) + return sitk.Paste(vol, tvol, tvol.GetSize(), destinationIndex=[0, 0, z]) + + +def build_affine_transform(aff_params): + ''' + ''' + + xfm = sitk.AffineTransform(3) + xfm.SetParameters(aff_params) + + return xfm + + +def build_composite_transform(dfmfield=None, aff_params=None): + ''' + ''' + + if dfmfield is not None and \ + dfmfield.GetPixelIDValue() != sitk.sitkVectorFloat64: + dfmfield = sitk.Cast(dfmfield, sitk.sitkVectorFloat64) + + if dfmfield is None and aff_params is None: + transform = sitk.Transform() + elif dfmfield is not None and aff_params is None: + transform = sitk.DisplacementFieldTransform(dfmfield) + elif dfmfield is None and aff_params is not None: + transform = build_affine_transform(aff_params) + elif dfmfield is not None and aff_params is not None: + dfmxfm = sitk.DisplacementFieldTransform(dfmfield) + affxfm = build_affine_transform(aff_params) + + transform = sitk.CompositeTransform([affxfm, dfmxfm]) + + return transform + + +def resample_volume(volume, dims, spacing, interpolator=None, transform=None): + ''' + ''' + + if transform is None: + transform = sitk.Transform() + if interpolator is None: + interpolator = sitk.sitkLinear + + ref = new_image(dims, spacing, sitk.sitkFloat32, False) + return sitk.Resample(volume, ref, transform, interpolator) + + +def write_volume(volume, + name, + prefix=None, + specify_resolution=None, + extension='.nrrd', + paths=None): + + if prefix is None: + path = name + else: + path = os.path.join(prefix, name) + + if specify_resolution is not None: + if isinstance(specify_resolution, (float, np.floating)) and \ + specify_resolution % 1.0 == 0: + specify_resolution = int(specify_resolution) + path = path + '_{0}'.format(specify_resolution) + + path = path + extension + + logging.info('writing {0} volume to {1}'.format(name, path)) + Manifest.safe_make_parent_dirs(path) + volume.SetOrigin([0, 0, 0]) + sitk.WriteImage(volume, str(path), True) + + if paths is not None: + paths.append(path) + + +def __read_segmentation_image_with_kakadu(path): + if not os.path.exists(path): + raise OSError('file not found at {}'.format(path)) + return jpeg_twok.read(path).T + + +def __read_intensity_image_with_kakadu(path, reduce_level, channel): + if not os.path.exists(path): + raise OSError('file not found at {}'.format(path)) + return jpeg_twok.read(path, reduce_level, channel).T + + +def __read_segmentation_image_with_glymur(path): + return glymur.Jp2k(path)[:] + + +def __read_intensity_image_with_glymur(path): + return glymur.Jp2k(path)[:] + + +try: + # we use a proprietary library called kakadu internally + # (jpeg_twok is a python interface around that library) + # kakadu offers really good performance as well as support for + # advanced jp2 features + # however, since it is proprietary, we can't share it + # alongside the allensdk, + # so we default to glymur (a python openjpeg) for external users. + sys.path.append('/shared/bioapps/itk/itk_shared/jp2/build') + import jpeg_twok + read_segmentation_image = __read_segmentation_image_with_kakadu + read_intensity_image = __read_intensity_image_with_kakadu +except failed_import: + import glymur + read_segmentation_image = __read_segmentation_image_with_glymur + read_intensity_image = __read_intensity_image_with_glymur diff --git a/mouse_connectivity/grid/writers/__init__.py b/mouse_connectivity/grid/writers/__init__.py new file mode 100644 index 0000000000..aad37882e2 --- /dev/null +++ b/mouse_connectivity/grid/writers/__init__.py @@ -0,0 +1,118 @@ +import functools + +import numpy as np + +from ..utilities.image_utilities import write_volume, image_from_array +from ..utilities.downsampling_utilities import downsample_average + + +def count_writer(gridder, grid_prefix, accumulator_prefix, target_spacings, **kwargs): + paths = [] + + cb = functools.partial(write_volume, name='sum_pixels', prefix=accumulator_prefix, paths=paths) + gridder.accumulator_to_numpy('sum_pixels', cb) + + ratio_and_pyramid(gridder, 'sum_projecting_pixels', 'sum_pixels', 'projection_density', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'injection_sum_projecting_pixels', 'sum_pixels', 'injection_density', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'injection_sum_pixels', 'sum_pixels', 'injection_fraction', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'aav_exclusion_sum_pixels', 'sum_pixels', 'aav_exclusion_fraction', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + gridder.volumes['data_mask'] = gridder.volumes['sum_pixels'] / np.amax(gridder.volumes['sum_pixels']) + del gridder.volumes['sum_pixels'] + gridder.volumes['data_mask'] = gridder.volumes['data_mask'].round() + handle_pyramid(gridder, 'data_mask', target_spacings, grid_prefix, paths=paths) + + return paths + + +def cav_writer(gridder, grid_prefix, accumulator_prefix, **kwargs): + + paths = [] + + cb = functools.partial(write_volume, name='cav_tracer_10', prefix=accumulator_prefix, paths=paths) + gridder.accumulator_to_numpy('cav_tracer', cb) + + cb = functools.partial(write_volume, name='sum_pixels_10', prefix=accumulator_prefix, paths=paths) + gridder.accumulator_to_numpy('sum_pixels', cb) + + gridder.make_ratio_volume('cav_tracer', 'sum_pixels', 'cav_density') + gridder.volumes['cav_density'] = image_from_array(gridder.volumes['cav_density'], gridder.out_spacing) + write_volume(gridder.volumes['cav_density'], name='cav_density_10', prefix=grid_prefix, paths=paths) + del gridder.volumes['cav_density'] + + gridder.volumes['data_mask'] = gridder.volumes['sum_pixels'] / np.amax(gridder.volumes['sum_pixels']) + del gridder.volumes['sum_pixels'] + gridder.volumes['data_mask'] = gridder.volumes['data_mask'].round() + gridder.volumes['data_mask'] = image_from_array(gridder.volumes['data_mask'], gridder.out_spacing) + write_volume(gridder.volumes['data_mask'], name='data_mask_10', prefix=accumulator_prefix, paths=paths) + del gridder.volumes + + return paths + + +def classic_writer(gridder, grid_prefix, accumulator_prefix, target_spacings, **kwargs): + + paths = [] + + cb = functools.partial(write_volume, name='sum_pixel_intensities', prefix=accumulator_prefix, paths=paths) + gridder.consume_volume('sum_pixel_intensities', cb) + + cb = functools.partial(write_volume, name='injection_sum_pixel_intensities', prefix=accumulator_prefix, paths=paths) + gridder.consume_volume('injection_sum_pixel_intensities', cb) + + cb = functools.partial(write_volume, name='sum_pixels', prefix=accumulator_prefix, paths=paths) + gridder.accumulator_to_numpy('sum_pixels', cb) + + ratio_and_pyramid(gridder, 'sum_projecting_pixels', 'sum_pixels', 'projection_density', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'injection_sum_projecting_pixels', 'sum_pixels', 'injection_density', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'sum_projecting_pixel_intensities', 'sum_pixels', 'projection_energy', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'injectionsum_projecting_pixel_intensities', 'sum_pixels', 'injection_energy', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'injection_sum_pixels', 'sum_pixels', 'injection_fraction', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + ratio_and_pyramid(gridder, 'aav_exclusion_sum_pixels', 'sum_pixels', 'aav_exclusion_fraction', + accumulator_prefix, grid_prefix, target_spacings, paths=paths) + + gridder.volumes['data_mask'] = gridder.volumes['sum_pixels'] / np.amax(gridder.volumes['sum_pixels']) + del gridder.volumes['sum_pixels'] + gridder.volumes['data_mask'] = gridder.volumes['data_mask'].round() + handle_pyramid(gridder, 'data_mask', target_spacings, grid_prefix, paths=paths) + + return paths + + +def handle_pyramid(isg, key, target_spacings, prefix, paths): + + cspacing = isg.out_spacing[0] + for tspacing in target_spacings: + + downsampled = downsample_average(isg.volumes[key], cspacing, tspacing) + write_volume(image_from_array(downsampled, [tspacing] * 3), + key, prefix=prefix, specify_resolution=tspacing, paths=paths) + + del isg.volumes[key] + + +def ratio_and_pyramid(isg, num, den, out, accumulator_prefix, grid_prefix, target_spacings, paths): + + cb = functools.partial(write_volume, name=num, prefix=accumulator_prefix, paths=paths) + isg.accumulator_to_numpy(num, cb) + + isg.make_ratio_volume(num, den, out) + del isg.volumes[num] + handle_pyramid(isg, out, target_spacings, grid_prefix, paths) \ No newline at end of file diff --git a/mouse_connectivity/grid/writers/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/writers/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e9241827390a3dea1119e9d8c2000d411b4434d GIT binary patch literal 3129 zcma)8OK%)S5T5tUK5cKDkWGLX0wjxs9Rw%jpg=evfqVf38W|0p>G68(c`V(twpXkV zC|vU&Y;ofMaGEP8{{ar1_^M~TyLL8$k*21*y81EIUwu`dcREcCPxkw-?3bIG_7`<7 z9|Mgic;yceT;qD8`PEnV4Q_BVF;mO8Qrow64Sg$dQrCCUwz>10=6l@b9=;9U;7xp+ zyv5u2ws?nk@ojVc8*Q+1fz`F03)*d9l<i{?7g2DOC*w3KSL2ioqhL?uX~2YFlYw6L zcz&EomX4ArU`LUFL1@t$cwD^nLto*Qe?knkQ@hX(^upl!)R@}bcwwD7Q|-(|-#IsQ zt+1vVM~_<=*QX|I>=$0Gcc6Ed=soBgOY}|XTUYf{?ZD=GUn`t5_p*Ji-_=yRy<L6v z$92E2oq6Z8v7&*qwQ(k0oeFNA+HhHCr)<h`8jRwTD3JrRv@!-~IU^D6#V4gbV#U5J zZz>a!A4FjhXT#dM?2T$wo&`M0WL&_hq5)r(_u@<$V`TZ<wYfn(wOpU8=0_@fbM2mB z*gwz8+l(Cr(Mgz$CA!rP>IceOS4U<u8k`j@NSQnwG|R@`I17tBPh{zim?&bF2$N2| z&cbk<juTeoA}I188>gd5xh5EP4Oqs5(L}H`=A~PKN|r`8DlL{WxJu;XjF;Vg*a1$p z<-jf7p@=z;MA@Q7P<ytwxK*uNDVP{WMIc8kgqvmQ93Dd>E0-GKvp+QPHqQCa<mo57 z-^obGUAE8o<}-H8vdQje84L4_vyXP8>`3nBBV0)cnUD4-a`)@_*)DD<`T&a`0_d2V zB(UIzTWLO)QGmG_-R}{uaf^<+rQ%1(tsscAxCnwxIHMinH;bSeqN|o05SnfoJ-ux- z_3o8-L-+J`y=RDbU=xy$>2c~;h1TEbAhfK7(6Ur$*($UUL@KnZz@xxg9JQ-aSXu}? zaK*WaaKp?4hdX@&zx&*%dfQr2xB40aQLolP7${p6G!C~BT;3T%1@qCagUjKb3NGks zI}gFtRKcaj>K&n7*b#H;9idktu1-!n{^U$81YdK<?}R{d0bEBS`0&xd6hu41BSFsf zoAYtMGmi?`3i6`gqVYO_{O&@BEP7<oo*|z$Xo(xN_Bsi=4gsdt%C(doMnMJh3fY2a zP`pNit$aL#q_|D$K8ZUJ14q10?KeogNn(Qpom{*{g3wxt`)HNwZz||ezk-fYL5JYe z)o<&!bkC?@Lv70t4`8{Rm7nPUi<K+rn1IeAXPY%=&w(``wZPyNqXSBSmBpPI6T6Dh zN$){FXYRSa3H_Y8=lVAEoh9pZp<h{|Uxj|{s$K!p0!ZC6@3K7uX|D#URfDt#kTz<N zVytN5%)L4TxGyd<z>OWhqIV)t1bU%}JdThIu7mM9sb8O=ASozmiWWqj3q+d~9SDD8 zSuR-I(_dRiDNz=Q;lv-z62O1XUY(f+)nw77y;n%Al2{`_VewKRAb9c&8(h{4Dlo(? zvZpAx27Gas)^M+*{~lRxka%SXbi;&68HY84Zo^nUg3uPiU>TEMGV6>{A7V~u(@Z=> z81z2HE5C&RI8bHvQL>zDPmM3MA3r{I3LRP$CSWOh>O413-NHo4;!d5R&W&{qOi4ux zxQUwtkDph+r*)uxj9LwRW$g$=oOVIP0d&xYeou~~Fy5O4B9bVyC_Ss6AK2nOj0-wp z<w2UIXl3A)W-N!Lc^FNEav7~u@tqge$<OzS%T{Y%rSWTwqV6HYY)K%~kb9cQL#vc= z=!QaCm>#+g;!EY9FVU#74P}9;%XJiT2&XeDjy%dXluyt$rY7YR_`oI~6e#wTf9$FI zoa$8aiLvuioB$U~NLIXyZ7WYG@HE8xP?RQW4BrHUmnL|&B2h)B$}z8kkpgCp`BK%~ zD))AgYn6V`QTzM0Dqj?G{XT9ci3^1FW>p8z`c)bry7xC`%FUU}soa~XtJ|bpu2@+- rq!#^66)1DISFQUPD8218=i?;$l#nAS2tC6yR`s^&-SPU~1F!ur0q^ne literal 0 HcmV?d00001 diff --git a/test/__pycache__/glif_tests.cpython-37.pyc b/test/__pycache__/glif_tests.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f2d2bc56973a42fce33b8d02a48662a48c5c1fc GIT binary patch literal 2217 zcmaJ@y>A;g6esUar_)&<w&RbcXwnpEfNH1`pg@PfaGS(NkivC}Bwh#=*Rx2UPQDL? zr0m*|hQb*-1O+-aLm{D4{($}`oj5jA#%@KXKJp~R36fH{$H&LVN4~Egbh}pb5sd7Q zpTdnLgkI>yY}mkj4WIZO2t^bph#-c>m|7Ez3yGE5#4)^`lv0<tQ+YY{EQC>7Ar&KW z5<gua3x+Qx)wD)xQ_VW58`}-iF!Lf=q%K*aWwJ~?T6u!V1?tlUm{(|()?i*`YqWl7 z@n>xH4DO)#A!;^W!W+>pvBM~8VpYDI#0R(fF|fX7ciDjF8LS#2P6tUSS&$h~e6_c8 zN!c>(ceDXLwA*F)?!YIW0+FbP$Ck7wn6F7^T+$o{>DZle<uf!wLp1heMehLTn==d2 zrdU?i(8L4`<kblpVObm3=lfQ%Kg1KuoNR!G^@fH$v4)o3r3f5#c2C`Fw3Qw2pRQh` zQ!j!}o*l$dt0(g8bcyx5Cn6BXjP->PH5ZkY3+41f*;Ow4F&0uN|Nh>i@Ae)ATlXF) zS9Aw5PL#`2$r)2#8XhtlbHOd}pDagAPHzg6Ak8UD)Y9(u-h=zQw|0VW?{97I1oyVc zg-+P%vOq{3;(-Vb;)E%um&X}ddTn9)R#n%J4fM6KjG0iSV;)OJ7PaPi51KadB1mBn z_G48mvNp3(J+Js2@eA<US3lgj+1?Y3i+0!zX=^_`4zrW?tt^Bf(eR5l%Z@}l@3TyF zfaW?_?VWhPE#Ugk`(fuWj2N6v640QB*CiA3x_N-+M5}+IYMKjZew-zFNWau|@*xm} ztJt@E%f&wY>Xrv|(NMk$yYm8bVewXhjj^<P_SlgnC>XaWm=TiYu{T5$Jc5pkFtt|@ zb&7c%%_QqkF0?enL1l=?J`@Tb*+ZMU7tzRpxeRkjE{v-~#}uvRN>i>jztbxU)D&1{ z_dSIbX&3c)Nr6N+pWgWUmy_+y=%4P3pa1;#uT51x$`c8}Qx)0eOmy>vo_hTxm#uyl zHS4?q$CSfaNVyIH*D>IAO)8qyG||ncDhE7I0~&XvvZz!xA7skzCz3eY8YzqLh(WnG zT@H|ilv@-9@n)5$+<YMW1IgF5$qzKql~IrteZ(^v1iRnBN~{4v7NiXO_GR0(eMp)I zYajC~urp6w2^RCjox%bz08bEL1L_r+pwYqYLE2;m66wzqd0q~^tW!GIvkN`wdYv4d zZksx^^aKs@7COTtN7jb+&=~>>Q1`4f#ewqs()5o0pCLvE!<+TcUG2d45I&&;5&>v^ zUmf8grsyL2)q3mz)L>FIAQEJQbf0k(zNV$D)(wTlTM>QbZzKRKojmPt9%`%l3KyMz zVgfw_-PT5ucfv$$0yEQ&p8clB^RJq9RZj9KinB;n00nk{XIyy#Sat-EQ`*|Ty?57? z5x)rL|G$d3Zb`1aY?e%&@MYjhqks&JO+gl>j9=E$+IdIc_HEklGbchgV1kD5qV99- zz`P87U&k)ypTVy3f*=j!EC`zG#7{%1%QlJki9HaEEWH*0n3#%oi<w{2Z@Dyso)#cp z>+yhbfXCJh0t-a`Xs*-AIWr)C4oV#@G;tyy&lL@98#9HiqG?RSk*n|0n)y3LeiO<f z<oYiI|5Ovxv!;7B!kKQFM?gn62+q}s>A|A?HsCdbgl%dg;tCLrl~wpH8w%}*J;$*e M+gtJ0y}D=r2UH43BLDyZ literal 0 HcmV?d00001 diff --git a/test/__pycache__/test_argschema_utilities.cpython-37.pyc b/test/__pycache__/test_argschema_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d83e4b95f63568a186eb26101f034a33d18cb445 GIT binary patch literal 6387 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 H|H6L&Ii_+$ literal 0 HcmV?d00001 diff --git a/test/__pycache__/test_deprecated.cpython-37.pyc b/test/__pycache__/test_deprecated.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37b892d17a91dc02063151695950b94853c17efa GIT binary patch literal 1730 zcmZvc&u<(x6vyrH?CfNdY|@q%m0#LQ92nFthe`;cDoPts4xkmZAga+y!({9vlg!R8 zwnMtn?tyNuh<^dZi9dsXW3HU?FK~hH^Rhn}u;gbykNxKP^WO85?d=vrD}VhV{e6?M zKS)_Lfyq9)`2s>R$qN?K=oNh6#oj=~g3s6e*jMbdA%*m>*o?=4(;6~xT2nS<c*WvS zZpaqK4auLgX!9CYSugUcmQ*9HveYVB?Pf)4OtM<ZXcsk(P97bgo0|}p&ES*t=pR!y zVX!HB%k9|Ujy$LBK7^zVy!RW^q^-oC>fq!4*G6g6Pft?WJxnjsa@>DhrrEHR>BGJ% zzc>BiNR=jo9F9)LrvG_<*f+UV4@PNrmL4mdEeh<AXCGK)tP^XO=#IwKPM)NLwYB@? zm<PeU%lB9JO$N%I3}yFGG0f7!>~(9$BChEWh5*Cr8oB|sy73=F5tiNknP~gE32ljp zh|(!X^es#*c+U8zh_Dn_ObW|qV#(I;RbpU{m#49xkth4;<~0b#VlG+i&0`V^DFEER zytn3(3-0P__>yFW$s7e(ppm+Z8Rg}KPgt^uT*ND$B3*o=iX**&&-L4fNs^bjO_GoB zan6?ii|zmazq>fri~I^U%5<QTq-rI}U?|TEnr|h^cjsv_|DsVS>;HE7<nTBDxzUG< z|A(I5!94P`z)%Il!&8-61dmqh?(fz~JtQ*}W+rxd=<6GpWfV1PWRM`Z=zWWc<Wp|h zDJnvWANfyDr=Dd$d(!`fb5zF+)nLU0@ukuF6HhkoqGo4qWy052&OGzX2Cw)xK>sCs z#$L=r5cDqJdwO1GHXoLqT3U8;(^<LS?R<r31t{vFmQ|1z7wOns|AiJctMDS#WnLbe zs*Re@PLid*W%9wOP)B)Tm982iotL%}#_Fm$P{yFns`g`pQY8;Q(R!#O;ZnK^)yomU z;sN1V9qSHN<XYkFft6`PFz$P8-r|85@|&K12P?}|q;M|j_Mw0-crNKanTj>Koaj!N z1kEYPg0qkT==w7bmixBxickF0KsKQDNUM=;_AWaI^zacwDv3Hy6ds6bdiL}!h-=CM zO;r~)^=+EpA@MqiyCmKq@g@nnMbvP)<5+2`bp19&C6JDFTDNPo;0^rx4BP9>ygOXq zBjc?&7>(&zd~5Lvc2~LJo-3FB&e6Del)tp+TFsrIly>BusWoR-MHN1pm*L*K<ir+4 O$WacW-D+=!+kXQH4Uy6S literal 0 HcmV?d00001 diff --git a/test/__pycache__/test_inline_examples.cpython-37.pyc b/test/__pycache__/test_inline_examples.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f700b698ea2f2008bdfd0d4f04602c335a319db GIT binary patch literal 897 zcmZ8fOK%e~5VpOW&34nY0wVD^a?62$)ElZQO4|ccsSp(svKFme+f6pvhp}DCR_Ot? zR}TDxM4b3bzH;hc=mo}0E1`}xpC7Z{`Q{tH?)MV}R{i|OHV8t${pQwUSiAx^1%N;T z7l`6^CX}>uKm$pp;iA)GB)dy22#i34qO*)>EF#gpM3O94WW2<?=mOJ32Gibj)#IWs zVwo(7SP{u3#2~sR@F5!Zt{@{iI3uGGT@^LYtSnW*tfYPUmBCV)OxLxg@$Hsle*+AP zKppTMaPt&kjOOUmlXE=B3n&5z;>Spk8PVY!{~(`3NEbLfy7~j=h-!w|b&M)<J0y;b zUby%;FJ#3^`3q^U$n|vRW%|KLZBjO2Vsyk#S=FT572|a!*hVU=FD9*(tPBUN)ub`$ zetwji+{$N)@fjOSxLd$qjhH>R(%2TVyejfaX167cRCAqd7P+y!F4fk$FUVIHA?<tS zdWP#<+01j}KHx0?kHFjVN3dwi#!GxoES^GdY~cH4qd8iVF|pk_xxga$PB4fAQiKO| zaEC`Gm}M?fjh)mLs1xv0F^pYQ&U{xKG0G);BKa)iP?RIJaiL;%;=*a2SFX4Bar^DN z{k?4W&3hLZtA~N^0WrE}OC@rh9W!og-MHB2$>5}w`5&ynhi>2{x~tB8h?o!ng$dRV zVIHo##GD){U2|!S_Il}i0Mt{5KWKkNKLBuD$l_&lahCb^W|<ze=U#1y(fEe+p$ki< zXS7@8<B2UA+EYx!MXU2O*=GHZtbZN4WgKsowKyr{mVcGz5kQP%5(g1ZFu55K8NmK8 DX_fRS literal 0 HcmV?d00001 diff --git a/test/__pycache__/test_temp_dir.cpython-37.pyc b/test/__pycache__/test_temp_dir.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d61f61e001fdbb5b5c8c694d5bf647c36bc35b0 GIT binary patch literal 1539 zcmah}OOG2x5bmDwJp9~UuSqr`LYxqmz!8Lpgb*S`<V02if)ceXje4is_So~HyS=-% zyazBxqWufDIPpLD6?5g}zmOAE<MlccNVL_}T|L#+^;Lc4Z<@^-fsy|43wK>Y{zhdt z>ah75rv3|rAcDq(ZCA=@sawp3)ru>L!<@urF2(P5>?J<)DUoDc6&2z9MwXP-K&!7B z!WEvR<L0VW$^+qxs;I5)H62)@UY;FFe|&`c&{|v45e?B4EpZ?Y#gS+a-8Z!3p$oS< zuh8l(ac4-y-Ex1jq~e~qkMC}OtS#t|r2F;;kdV`^RX8~};i#xS<HIO?mW7ipEqo)B zJP?rz(P}p+Y@Wc>kRD>ll7Jt2+NH_{{ZFDCSW59aeDX#ACoPrk^AQ)lGk(F-S^sg$ z!z>m2QD3I#x}W7T)gj0%AI)_CyXdU1BO^b|c{t%i33uZdEX3rYk=m3Z*u~Y$XGJ4{ zU;`z8p2BAz<FY^yOL-vYN0CmlX=*+=<5~uQarFE(eOTB+o-<pIlBe@dI!*FfPw`Y_ zNx4L+*&xUbI@%zrO$7x4+aTx-y6#d|*O8Ec91LV==Cw@s;z%1v7wha|hDfyuKKl64 zC!c->32i88rYa52c|4W#I^0P3M8XXnqF)?Un8>qjh9L|CJQJ3%Us>1hQ`9PpN~s-! zMptwJOu2Gj0MEWBKaiJXzgyU2Yh|wq*j2{P%3V0ZSzA}$f~>rSx2BXV+=Vx>^vL+X zQt<39>Gkhd{u?j$;BIwQGxasSJ^_31IBp2<9>KW;&->T*yM=%2-(NM$_Ys3%M*Tlt z_ILOG1Tw68I&VR~u!22#33=AffpSNXsrkX~{HE6bnf}k`O+A{LDDJ7mC@B?I_-VJL zu*eGQ%NksWL6q`1noGsnTmyAY5MnJwkfot4tV|ab456ruvnXYE|7{aoMDV%wxV#)? z>9<N{s&MleGJ!c4T&23GV^_R@ZIlj+D!veKHPo!8q?RT?Mt7?W_z~>*!GK=D4ZR8v z$qFnjDPDLtu#4&~$JH_7Y0AqSm<hpS$gI9?lr8$(CRIqhqEYhHY`eV)C;D9wq}HM> z`VOsutkFifHmvtx_2J|JRS&?Xd#vujqS_#sQ#Mm!r8%qMbKC4<3qh`K`nXrVg{6p0 zB=t7;-XOY!){t9Bm4vGatLI$tL>h(lKtzR~W-382s)MQros)t^;RnGWie(U#5$*qh mw!0Fc|7DViX)M3Oy6Y1VKA`aFA#K<#$EWvc$7<6Kp!^5U<(B~f literal 0 HcmV?d00001 diff --git a/test/api/__init__.py b/test/api/__init__.py new file mode 100644 index 0000000000..07330c08c2 --- /dev/null +++ b/test/api/__init__.py @@ -0,0 +1,14 @@ +class SafeJsonMsg: + ''' Apes a paged query response from api.brain-map.org. + Safe to use with Pythons >= 3.7 (which implement pep 479, such that StopIteration errors in + generators are converted to RunTimeErrors). + ''' + + def __init__(self, data): + self.data = iter(data) + + def __call__(self, *a, **k): + try: + return next(self.data) + except StopIteration as err: + return {'msg': []} diff --git a/test/api/__pycache__/__init__.cpython-37.pyc b/test/api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62ac6ce471080036ae92da55da2f3b4b2d6620a5 GIT binary patch literal 916 zcmZuvQEwA53{LKDYgHIRh#!zgPGVQ2Atn$^8xukxD2ReIs*|GhlJ!D+NtUE5tp*a> z{s~X~5Pkt~_sUP;jVGMz3PWJYcI?=({W%XeHaZAMeg4G0VuZd2V?{9>c7feB5RVZ@ z9G?N7Mgzp7K1$;P{J$xJ(=M<hAOsp<js_9OgP2D=K0||qCwvX`8efOpR(+|@4#iWa z)pIvmd?R~CIKqfwBf-hhRM<JO!WpfcAct00gc+F)Et6`qVkXmel#vcOr|=Z<noJ>h zCVfd>&V31~Wak0d%C^akSt*N>$jVGaC6p&d7;=02?oHyR;P)l-r0=zP;)P{iYDI*# z+BzcDpCTin!fkLfD@dW$v9KPxg~G3<>b0!Iqb4iOn#PKNNT8qt?*qFlAUrz3r}zX> zzzDFwy)>#53AO8lGtYwM#N^P11$;qv4b;!!{=NK-6V~OdWIP+P8B_CoPci6&v#ngH zW0z|qlq*1LQ_fxfOb&Ag?`|4ai~(54olGEtkGozt-vvm!lu9K%rJ0%6?Um6Aoi^>` z#q|q&%2ojd{FR0hkl_ct0Csmk%sVh0dI$6MQG$Fl?$}!xeTXqyv^gFj34RXt$M^uf zMJhS~3owX!bzHeo8rO*u?|n0Rz46yh(!_>pHD)y)*D-9UL1rn|!wvLbz=V{Bj$9iA z!V&J^tN%=~4C|%qAxE)FP+E5=tu&ub!uc|#M^iRAziCm*bwQ~OxY)443zfrmY$$I7 fCV^eB+DQ_%<HpxZaijm2RJZRhi|&NXAHe7rMVshJ literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_annotated_section_data_set_api.cpython-37.pyc b/test/api/__pycache__/test_annotated_section_data_set_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e33a7378396c642b11662a3b5c6114c850cda6b7 GIT binary patch literal 2136 zcmds2Pj4GV6rY)0Z`O|EhW|()VTsCSp>^bjx+uaxT0jUjIS_GKT&*TM%X*Ui$ILjv zQF=h_wcnrzP)~dVz5(JZ?3EK=fCDGq+az|A;?N5h#@aXkpWl1G_kMGGWu-x&Wlw(K ze_kQvcbuFx3kILSr@sUth@c5csZS}6S;Bk<y_Hz0?c0<@Y_BG4QF}-pP~Q=bSb9kO zCE<!X^sZ=#W$5dI?GUf|2k0XnE#KJ8vfOYJiJd4kGS5EchVMj1Zx(VJ_Ul_bmf=<& z?uU2-8-)+;x&xnn6@(!V$bDj{pn^T3$0T6K1pdR?E?av#&w^CP!FQ8LO+lZX@ig)* z#o(SoEy@PrQNPBu(EMkj9GL%g|IWtfYaJ;);$tp)yZn%6)6r(e!#opweH3K}dXyJY zrbCc<F`nwtUAa5b(nQw_9`5rvg1boqC&d1miL_bcg{%evKXW<ICq4%PoQ8=B;7qTW zmi5_@cflHsCK2YaCQ~kqLW}@5?3duHA~Ar$G1&u*Vu*vVgdJPh$4t~<1<-(z`>00o z6#bEj`cD;(5UIwteDldKPHBH3<8f)-%@0dwD-v>&miFh9Bsr>m*6;Uj9@+i%-c7Go zHndTb&`eaM%T<{fa8jCSaKMuZthB_1dBKf|RCcyshu8!NgFgCoY)rAShN0>0DlW6@ zDKC1timPB9+*q5%;h9kB9%B3P+>&9xf8*9*eQ;~gxoFa`i;i`#b-^=`C$4on=j}Xq zsB_-tVHd;D?aVA6cB_bhG7L%Av&y$(gl{3Ty2`WiHLfA6Ob}vfh#=3xC^(d6?9mF@ zD)~+X;#$6qi4$C|c^wYwRS<;Q@N=mHvdJ8(UWT>*Dpyn;lq)0-wTz+(;zF9J72If{ z09qjmZB#FS_#eTpUPPymLextj7QlFI24k3~MLx;IC7E&?^!ziPufWbZJdqcw+Q&Nv zD*u%KfCHhvEvR~6W2kzl{l}JYVUA2tf6QWrwO{doB^omxSl&KmLsbKX6(`JbE?KUC zIA@@ib|SNV*#YA4*nIiuw|}eY=ZL{+aaW{0{AOO`?W;0t&+5Fr(Y{#e)q$t0{a!m) z?FAY>7%bF)L~+lv=P!i+4p!mwn0{Fzyf;gP#Y_<#NFJz^e+3X|OfLewkCp9ImEFS1 zejQf5hX4NA1JgqS#c0V$_ZF+x_`Xz6pYIe?w8ghmcv>qr{iSc^_sHodOoZg2FypE} kdy1Ga=~Tr|?uThECQ0<sRanx<08Qr7rq!yuSKQUV0c{sbivR!s literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_api.cpython-37.pyc b/test/api/__pycache__/test_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f7dd42a75f5e9acbb1d6f48fda9008ae9d38154 GIT binary patch literal 4947 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 L*J>sFxo-JiE{4JL literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_biophysical_api.cpython-37.pyc b/test/api/__pycache__/test_biophysical_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d613a4923a54e69bfb7d069b75115a250819d47 GIT binary patch literal 3067 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_brain_observatory_api.cpython-37.pyc b/test/api/__pycache__/test_brain_observatory_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1d76f968393c05612951f132bebfecf22fe35f8 GIT binary patch literal 14379 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_cache.cpython-37.pyc b/test/api/__pycache__/test_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..839285ef88639d9c246756d318cdcd0a63679bc7 GIT binary patch literal 5998 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_cacheable.cpython-37.pyc b/test/api/__pycache__/test_cacheable.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c25e81502813de7a6211f1eadb43436ea5bbf123 GIT binary patch literal 9177 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 G#{3^v>cz(Z literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_caching_utilities.cpython-37.pyc b/test/api/__pycache__/test_caching_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21350a6fa06f45a23adfe7947c9c1197a154663d GIT binary patch literal 5714 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 VdD^<!x!HBIvdqstN%P#>{{~P%v#J09 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_cell_types_api.cpython-37.pyc b/test/api/__pycache__/test_cell_types_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c174d89c5267b0fc41f893c88f333ca7b522aaa GIT binary patch literal 3271 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_file_download.cpython-37.pyc b/test/api/__pycache__/test_file_download.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7a5526b59f7fb7ce6e911446739296995f72c46 GIT binary patch literal 5139 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_glif_api.cpython-37.pyc b/test/api/__pycache__/test_glif_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1335c44335d0667e9fa87e399087cb2a0793d025 GIT binary patch literal 2830 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_grid_data_api.cpython-37.pyc b/test/api/__pycache__/test_grid_data_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e5ca691d26ab9275bb55923627f7cb89d5a3b24 GIT binary patch literal 5104 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_image_download_api.cpython-37.pyc b/test/api/__pycache__/test_image_download_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..715e75cd7bac9e5511449193bc727f63ff16b685 GIT binary patch literal 16309 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_mouse_atlas_api.cpython-37.pyc b/test/api/__pycache__/test_mouse_atlas_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..792113e4af243398c21b8e75f3b15f5b883c852d GIT binary patch literal 2475 zcmd5-Ur%F26rZ{GwzQ=!tg<n#8jZnhny@X~)dw3_wu13xA#sVWxs+UoJ3~8g|1mQK zO5nk;@B0-XKKUtp@LTlNC%=MEo--{3DrkZ}>?AXD=G-~wp81`BUsWn40wekPC-&|v zA;06{Vt7D2gQ@pn;e^wO#MGy;<2w}3PUQM7>~7@6IX_Q{aCfG-$8)d9DfJ7&IV*}h z&!0PdiWe-ebcI*sCCi)U)4cqO_+?(<RoE+hhR?!Y<<2^(-TMRnO=`}txXQXRTusB> zVJ>4P?5)-4u(F!=wP>4&>2@YVyo!U4=Q8XX-)G1vIU&ac6jGFPSKI9x_1&1UUx>=X zjX#s+R_8k{l<u$|<Ml0ez>-0yov<)XID66&$-eHSnMia9Ynt^2y7OFab+k0%QO3eu z))gQdMR0@fHjL1w!7^!yAVxC-hIR(PtY?E^&Yl*~Ld2Okd8!Jq`_&ztCPA#b!Cqge zLFnLD7<kKtX&*HY1g9s?;p{OzBj;p=Y<ef|UiBqB@{Ark=M+5z&vn+0e(f2PwHjzm zeM>Q!Jc?OXPgU32x8H1VW>~}itd9R)+It$OTtuzbHzE-WDrT)#sNk7OvV{$hV~Nyp zAo;vZnwz8VG6|zT7YkuerE#j$cr2G@My840NcwT0(gQs&_L_@}i<=wTFlCSh95|+m z3kBpu$scZRglRu9aN1^(7MnH4FLs3qx?qhSzQZ(l$pj%n&4V-vMQ|WZujUO)F+|4* zH4EjiAPzGT8o`HoC3HVB*43kB3J@Gt(M_Outh@<4jZPr0=T)ias0z^k-2=bf*#qlf zJ^;7^9$FV>!WWrJc|SCI!@A<}gexpuBZ>dX3-=KyJ+dgkpn-$Yst6d>JcW5?VOP^g zm2tt$x&rruOSu20WeILxhrSA&5HlGECISAy2LB2W2EzZ8zHXjSL(d%Jp3~RwQw)BO zJKQ~o0tJbY;~pl$OGt%p$qVws70M<@ZtZB{B4g{A9yr@Dl`u+*eGzQSNCfG=PyxE| zsEFr!!eSvmUnJzHeXC=;N^*-)gQo{clrr9U+<fxsXG`NudCH+qNHeJA6(;pCpA8Tk z2vjCDgn9V|q=1aY*Gi?zfA2y`01*wLtRW_Xv4#=;&M4yDE@zXde`Hbr2My1`09z&r zEzvS9J04YU1Mf{ofBEj{%fwv6U(LXK6*NGi?!n@Ja1&gYLRTSIZ=ujcpnrTT<d-_W z2eC=e=YaR7gZ}L9phNvu-HV8yMEt=`h>s-x748pjg?psn#~ZM|54_rp?_tkSSYB)% zTC4o|YefM&qZGP6(Zm%tWR-)(pW2p(rmw^(2lMIH4irh-I}}zin@kFwtMIQ^g2jf7 i?L>typy&1@@#QCQLt`M$(t=a=s`<IfT%}Mdl>P!D+oS0K literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_mouse_connectivity_api.cpython-37.pyc b/test/api/__pycache__/test_mouse_connectivity_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a573ef0f09a819d4bb1506671d82dd08134b7e7a GIT binary patch literal 11535 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_ontologies_api.cpython-37.pyc b/test/api/__pycache__/test_ontologies_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..844e6c4056138b1e45783c5797fd571dda537ba1 GIT binary patch literal 6820 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_pager.cpython-37.pyc b/test/api/__pycache__/test_pager.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2369f09eedc1180af097f92968e0163b339803f GIT binary patch literal 6822 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 Y*N2fQYtn)vgxC{mjl4{0N@du80jDsfiU0rr literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_reference_space_api.cpython-37.pyc b/test/api/__pycache__/test_reference_space_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38ed8a0dfe42321fd129cf9ffb69b2ab78506b55 GIT binary patch literal 5336 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 literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_rma_template.cpython-37.pyc b/test/api/__pycache__/test_rma_template.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1aeaf19d7539c2a950372fbbdad3d14472b345f4 GIT binary patch literal 6243 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 YFX&5ftWe9<%#}I%)>h`>TZM1!KWC=#bpQYW literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_svg_api.cpython-37.pyc b/test/api/__pycache__/test_svg_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b6a2f17423ba3de23b3e23251d69c275306686f GIT binary patch literal 1889 zcmbtVPjBNy6rUM8j+46C?uuP5dqD!E2%4m+1l@l?S;2|Tf!)1W5!Tc*b=*3(nQ_u4 zN)G!+;>1@#TXEuxaNr~O%Bf$06Youv5LH{$1zUde#{RwW^KX9d`RmQiI)Nko^##9i zlaN1gvOFwszJg2pU<45~Aw%j@iatx2&&+7~7K~P64=a9U@yziZ$&RYR7M0iJ74=== zi0W(N*Muu-FxEv~Y{0l7*i+K<&S8Dhq^0w89PQ_E58T=l9>w94EIbbJAs%#bJ%&+Z z)&+S*=43`-2?{Za!956Nn*T;r1txzTKEB_7uBFm_KH#Etz)yHO>F=jJ%u>O3`!XHt zewNErhhVdOFwy<*;)A}93%Q;1@R&yuVv__A;<#N%U9@=~8z<1?D1b>TpOhB(pI}-x z7{VN?sxXF_F&>x;UMBNDz!7v#1(`F!=GKh7Av0^nX7tRO+cR5O$4q}*(3jMp?1)~0 zs{pR|4^B7{y8>AS<f%cr|MK1%pnh4Q>Q}yZ18~0^95V0qp2aVo6Ef`%iXy+?Mt)ic zipS~pkms#TMTW6)w~c&>>?BPxF52Cly}f(qNYM1by9a(5sce+%M?2@Z=hH|3V}(z< z-%gv?h+kxU7vHygZTvFP?p~Am8waB}5y6imsU~G(UxP4<I7`1#DpSphkxc0>87iHN zZ!EX83=tN@Lr`N73*S?+7^zf>V5AZw^b6xaZsit=G+2962kz=F7{Y9dXM=i{O`VnJ zuDr`n)eVSRsTj4rQt=*43ed4&KhqfrsIV5wB1X}mW>B<sW>KimBl^a|R&d6!J%DDM zUim(JgNo%?28VGXgKR8SfUH9O+9@B(|E#HL%}A>SYHQjGTbSAc<9kbDv2M#-+^`>n zSlc2viHiZCv1nBT%_f+#W>U*}F}O_fO+)hfiq9ZGdteCl49hlaQ1u?nSNvfv$f4;1 z--Giu{-7He?vSe`b7$Cck>3i|<XaGqK_Ii$UU_H5?CCIBCssj!C-DbA+0JzPIs)G5 zbnboD>Fn+*Y_`+S-zjEI_={b*4U72INEWyO>K4qJ)+NR-)9e|V7a>1DgvKyn81!p1 z??T5gsyn!v=igm+>J~O3tg~2ZR08&C^Ly}}e1eOX_L0s~-yXsb#)zb3nf9xP@hMc6 syhsbhZ+6fuzm^*ofilJBJ{)FZl*lhWf?FDO=1~_;u&hyWKXmJV10vDg3jhEB literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_synchronization_api.cpython-37.pyc b/test/api/__pycache__/test_synchronization_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90904016ded8f26e9d99b73c04e95757ec678ffe GIT binary patch literal 3605 zcmd^C&5zqe6t`n1@n*Bz?QTEdW~o4lluhC|AI{R0T}p*2(N)ok9-<)EoAD;ob?o5r zwwoxCK<xnu@jrCMi94rW;DQi0Zb*?hajME4i4*Tl;v}1Fwe1;OetzRO^JeD#-h1=> z(aK6ffXn^<YwP7@LHG+B;UxjH4G-G~LIff@LJi*$M{GxG5fORGk=k-i76n^)7$q`^ zJ{6vbwHS$!_*0=4Ckk1Dw?YzR8Qx1INmk&UAgkm8yqC!uxd`th5%+}D`U{vx*iDJU zrMp&>Htu?jLujn;b=^kG_gvbu0_wRt9ooQ-c!}`fGH=1dt^f&yC&EAoL?V*NcVb^K zBYgo>OS{9>hs<-$Hfx$+9@%~u6w9vFwo{Ui3j7EX83+g>%=$s_<IwomzqM8WoY_9B zTP=%Z_N~X3+pX`oR>O0NrPpou5vzM0+hq-)UZ>S%^-t-3ozcMF>{yLMt7*en$AKQ? zFdNt`$XXrB8Izsfm<fVRr#p=D?<ts`#efKrn3#<COTaa7zj)!=P{#Ld07Jw9?6@8o zL<SO(h}?_}<i7As=!^YGU+T*z@*qm0gIHg9C_anyV<#fO7X!=0tvo1AsBrCiusqIf z;>Ee!#~r&7*hF=xd#F;TGKV%>fzwsn9-#*mBnO_aqHR^ng@)r<feHqrmNUjn^$ygY z?RzYf;41fQdrN(Arwx`-cR-ulw%tH|aHACjovm!PWjmeBzHd=?vu$-Up5M$8$~unK z&9=QGW`p5fSQ33igKl=`-kodkY;tWAWj9SeQF^p!$J)0YSm$;0Bh^yx-`VT%wE|-~ zstr5zDPKe2f!OgH+|5)9J5u*<F?A28^W2ZEz}mBe>lv<`{w)0wOGT*hi6GG50WA9b z*WY4P{r#U<@9B6ei0A2@AoP#&S&ExC1JC44R?`aQVxdqeWzdcv9#=IZujey4e!bVN zYPoW*5H`UAxEhnda!h6iCMB$@X}V#QwNgH<X{Aa|uau14lvG=9qWsik+{cGkEe03` zW&=Hwn4a6P&BruorQ+PrhHK$0qrsF6#p9va9bO8*&(1y+&7p#3L`UIaGa?H3<!}RC zer^pK2-q4BVM!JhQ2_^+MST2=@a=3T-vY_JlapvuI>XIlb8e0aAihgCt7|d<w*3}h zwGGikv+#jxNOT~*Z{7?wGf%Q5Lo4fAP784><#R@eQ@5JeOOsY;x6q!fIv%U1$4oI~ z$^hKuMc`mQj-8JQdyJF647{I2vI3-babX(&0t(UA^T1p=0~na&Hgp|f19&K6Vv5Z= zNG8}IwwQ!?0=far7#j%_&_Euipy+H0>PJr?0YMUqkCRZGCm}>9w)=wbN}|791z_&4 z0@>IAl74wvrhosKkbB>rhmLO_*uIU9JdLZ|1elyroC2el%DJ%Bs}>AH4_l%AX5AZ* zDi(@*zK|}J4J}tJ<N%;62+-n`GYBa>l4|SIP7KZi8^U!8*ih{Guvg*LC|%_!O?8BO z`wT`+U`p^1ij6`DPVp&Bct%9w;V@-@nGK;SI42yk0l>vihv)<tc`<By_4AOJB%H~z zUq4Vn(=O_mF>Q>ScFy_Fv*Dt~FTfrQgGWGD2S-;h1z{C2adWgC_Tcv024-YGbZ-*H zA_of`EN-x{X(k6yZH&&`6Fi4kF*$LI$`gxT*d00b2XN}r=TLRf9jH3!Pssg=->ykO z1Z=*G<PJ(JD3DOF4_xo7^AKQxf7A$${Fzt?op=-x(++rg=o%!SijmfGMkQU&>FGkb zoHpQH)bi<Kp#p+RIjw7Yx?I-Mda)3qG*uJ&<qS&EQ2=b55mU95=}1_>dC*Nehto6x z3Wkw`&?Urm0FR#^kUgg0ohp(FAenW3a@NTq&z&4m%uSX7Hs@#l|Dr$&TDE$xSW+7v zl-y7sO@dgp0>@(NLXm_6UcXFw0mc-12j_Y4BwG2TZ&o4kA&_UQ+F}jFWiw7Xs(0p6 zNlgh=yxKG8>Y9;W*xF28GpcF0U%m~J)JiSZ>0&;w$!++x;lCWU_rrgK3|5QyYeH?7 zIpfcO|EAR92lN;Ndz1mOT=MZ;_A%@8)a7Fc_&DFpfsc{k^KwkN0d@P4W8ZuSJ~14s Sh)FRitt!eTB?)&zS^f_ka-ZD* literal 0 HcmV?d00001 diff --git a/test/api/__pycache__/test_tree_search_api.cpython-37.pyc b/test/api/__pycache__/test_tree_search_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9d6d9115786fdf17c4d3291649ad92933d15bfd GIT binary patch literal 1770 zcmb`IK~EDw6o6-Tx9t{ML=PA*p3tNwv?-_%A_|glFv7v&Wz%FGc7}FoySvV8!8Yx| zz`=|E0piJ@;Mt46VXvP23!Z#$pt_AfFfyBYGdug{&Aj)%zCJG&CkV9Q(|h)Hnvn1K zGHNDFR-vmGAUNT)O*+(}6z4|Ua11?~jtQgLwmKOnLy0i<vfSdCBXUTc9MAIH5pis8 z^E`}sZq!I=;s@9xC7Kksr4Tj2q}N=F{4H3?Z?cB(ZH8XULmg}sI^JX*x|#tIlS48j zG3AsSAL)R&#(;oTb1RwJQ(@qCRKtDS6|x8Rtblby$&?1{lW0X+AWGCRW5qrbnT5BX z!TNIjwGvX*S(EYd4m)5$uf7&AFAO+asEc4<)x$^x$^#ij&7P{i^mppYkHuWXycTN+ z*xPP{25(hjq2daQd_8evaM4xTM;8{$Q7@THtv!GXD7*zRvb11G8)hE5j4cBlziHP$ zz=YEwI6XADIfS4OtpPbE13EAU=D<3!C>fAFdTem(1e283&0MIP9n;N#UGqZSoYuu) z+gpxZi-hNQMBv~3@-4gFf7OiRXt{!(mv<!dgSifi%AsuNSnSVNQeIa^dn?uI!cui{ zY3XqpbN7q|9z-vcY9*FkvC-$(Z}dJF$`g>-AXY28tgXa#pQ4S99fQu4%*1YpSOcLc zOl~m+)Wxoc=y3PIkDH~8CLpm|e!!Cq-*J7O<bOvcnM_??!+R=nz(z8I;JJ8&I?Iec zs|w%LEC^y)^z@mg1@rv5ya9Sw<nLlm#`(LPsd4_urCg`^OY${{suy>q@J;Y>yZ`2& zSQ%}uROcT(Ts)7yzcRSdXV-Yd`IPim|Mv)}c6msmMoeOHKVwQx;%Wg!5ycb=tS%{p zZvR1O6d%nH{sCN_p_`yxns8=E6|syZ0V}dER5?`zupa8l>|~=Jo}5@%1RSda^<P(O tC%5ar!xZaZg@#k2_0+w!2bzETNhjppws?9EZ;Or=s0~lSn9A9AegUe%+?fCX literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__init__.py b/test/api/cloud_cache/__init__.py new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/test/api/cloud_cache/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/test/api/cloud_cache/__pycache__/__init__.cpython-37.pyc b/test/api/cloud_cache/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e0311ef40b9a4dce4009fa363be87c7984bc3b3 GIT binary patch literal 197 zcmZ?b<>g`kg1p6zi5x)sF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j&)F&_v^ce> zI3_V8F-0#au{<%aGR844F*!dkCDAx0HLt8VCchvxuQ(Y<<`-mC7RUHxCdCwImZa(y zBqnDkrl$h+=HviXq-5)tq!yRxCl+MtC+Fmsro<;FCTFDT$H!;pWtPOp>lIYq;;_lh QPbtkwwF9~1GY~TX00mn(2><{9 literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/conftest.cpython-37.pyc b/test/api/cloud_cache/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a9de02d5ad75055bc676aaff780a1afac2277ac GIT binary patch literal 3553 zcmb7G&2HO95ayDStjM<flQylJHer7gp@?i*vYoVs(ZuMXKpPZjauEa=EACoiERigi zvMs_s6zx+KIXLL4eUrX|u08b?dg{!Olt@}GPzu`R4EOtXc6VlHo-Hp|G<clfe&WAw zXxd*WB#!|vU%_7;KqEB423kAnS({1il`eE){G$EL+6GAlQ6#BAQb{b3R21w7tycaU zIJD;$w)p7qNB%?jt3RNzwM+an!I1T}e!)axUlT=9ilqgR%HmcmRra+DcA<&I{Rp-6 zzfj9DDmzy-GuO(sxmICL4c4;8pEFIXnD9I`g>40<FFju>=>)dZGr42Rb3XJ2(iA-4 zN(N@o=YeT)hcI1fj+7MUvFn?GRD=oo(mWivBXP(rc;%j5uh8HZAf3pu=^g_K5aMjM zqIZW6CF&(W%wu~X>r=!jAB?2RfVdx_m1#TXS>Lw$G#VH20KrGLcwjy{Fo)a&dY5L1 z^^v)t6H-~e4fdlc_;E&oD<wQPyJK9Hk6V%17X(?Z6Tmi2O`DRa1@M8!cC)p!yEkEt znm#EY<zykYAuJs?>cM$H<8aX9CtDM?4eD)Dml57*Y&V*X)`T@d-$Z>_Y}B{vTZH0W zOUUD1SllKRBF@JlY1J(d`u3}n!O(HNu-L>AziTzUU5<}X`RJ`aT1m}6&fyoGmrDAo z!~0y+yZnqh<IYou!x9B=cBFHvI<6-jWkKtD{jutNYj-=!4&)<`TPM6H0XrDL2ywEB zTeb<uzG<Ns99ifFn?QApAL`zCvKsr;QDRULOi?Xpw8a7|Fr6(;|7ATR>(^xF<AUc0 z;|utL!8i>>Efa{ENC%=OAP^~R7a?GmAVim;uR^~9Jp~N(Yp-<(oAvM|`ODY2;5f5` z{xo8SGT^vEiVg@9^wu~?2%HL%r{8}=Dj)9>Re%Qlr>6V(O2?HrjZb@pYILx~XZ%uv zLvKnvMxi!xm9UyvbJVC?>Xf{w7r9C5+xGMu_|A{M3R2&i_zg@#=b4lfI`W`c>*M`9 z^D7_Sa&or|*T%qhB%SsV?$A*J-hu&Y9U84vU{(CVX_x8eFM`&ByNMoLFV1@if7J&G z&&h^sQ!qR;==FUq(5~PbeZwyG3tg}c`nsVB1Fkx_-bscQ<^0GiT@>ChhT~?qVh#uL zeB7lWN*4wq#R6RR#39Orp0VA^v4K2e6BV(T!h-K*EP*RNvjUJ)*ir_YpBMZ$g9Ukp zjb=$!FIL2A%8Ip|73(=BkZ)p|@-D$?7~=M|-FYj={dSHU<eRv~ZE+`MWuEDs923ZM zm?FF8o*MAK`yc!pIew5c{NQ1*pYL7srn@;D$n$ZR#)T1`n0TKsGavdO#{u$;L)?o| z_j4#ShXQ#HDnHkUITXk<)bxClsEJm6A5Z&6>p#jdf;@+DZOVc11l|ni@p1M%#3$m@ zl;*R9H`@1W7DTo^h)-l{X)f9yCM<ZDz|1IPu~!TKq?`G>(IBv~4myQAX}b=k{hP|8 zo(mOA(D&U@FDgwSH=3TSl-&h};V9q%Q9R^AKy9%p<UmsGgcXAN5^4=7h_L90WHP|& zbEk(od2UCA7JaPE$u3mW%*!r#h0-M**Ahwki0g<6%cq=HRCrJg5#<=X(_5{bo!#BN zy(G_s#TFJBVQ~k$D2HL{Ij09kQMnTqck%OtVb<D-i1$#VFr|(035$<Of#5TG!r~Lu zq|y+jsIb%kZARb1^aT2-NJ2^~!BR*{U@(GeCg^EZ(39~B7uMy`Z^CvJ<}ydxy*@Qy z@-CU2%cB6NMc0f;0g9vXq%5TL=*{q4uU4Qu)?SD!o+x=5?m*<z<h^`Nl+BdSz#4T0 zjaH@%saM!4TQw?>Gn4*K{I;I!t1QuAhD}DLwRch@61Jt7CEp_l=?Xaa5+K*9$J`BA z-M<Ys)=KS?7nRN{Ahx0MJr72{q*9G`godT|fQnJ77s~rXSBwVo0CPW`3KRrJ_4Dfb Ezp}|HPyhe` literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_cache.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ef447b679c3bb00f783a586b35221bbf756aff8 GIT binary patch literal 17348 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 JpG5g{{|oCG7n}e9 literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_change_log.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_change_log.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..213f3c35bf03bb0657059a0490489c93ec21cf76 GIT binary patch literal 4777 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 BbKn2~ literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_file_attributes.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_file_attributes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2f136443d7ad7f478b4b27c991c5af738d1736b GIT binary patch literal 1818 zcmah~-ESi`5V!X$A5E$g7b-X*w2DsZ1w<m+Lqg?LS}G6^r|N*?KvAT~iJj~=o86V| zv}9=?K)fP&MB=3tPy9<OUJy_G3p_F7e6&e>I$IvkjAzE<_58e_RI6nIE&k&N_BU|< zps;8bFb6Qyhd?;tG$QTUOxx7RR@;KvitMq|b|~RCcYY#mm%H49+2iyp(kT23-sHGJ z^ZQ4vABfMwNE~V{!`?&-)yG9_HjEOCBN%Ex3DK}2x45n8rNx~q%H5xx3vy0QY)(g( zdZ?WrDM&82K-!s09=Aa{m`jC)FX*15P8Tmrx_m`{dFz5geD8MrZ{UDmkT1!%gcmNX zb9%CIQsKon$vN)w+Z{1V5M?dL8!^haV*GVy42ye<TxaLJ5o2RL#;;V>SE6j0)0FTu z+_~jnxx>GQ{+z(|RFAW2pmn;}YK^C@iHvfOG1lw#a`*k6-Nzqfo2ZYHK8so@(?P?@ zZL}(%3aP>*?uI-s4d70@0aHO<HkMtq9KuaPs~uzy!NDI-l=geVS6Y7L4-@S_=|@Z{ ze|r!mOmFW?xO0+iuH@3n-o4)Dl@YRcmU+C|cIP_Lr7>n5g}vr8m{)Uzq__7QRf&+u z3v;{NK||@HZu3wnAvJuEPo+$x^gt;KNQ$`ZrBf(&-S#94l~8&41&b!anC9*&^0~w0 zP&I6r0UUXupTt^xr*nI(hJO-yAENx19qo0#hHX@b1&lX)?2N_J&SA{Jn6urEh)-1~ zNky#sK$A3>s?O7}*HNJs@1?9iVnYGGQ3Muz)WVEfEDc-zD4FnXAJJ))UGp6=j~Pgt z=`??U)-#*+Wjv<(90;KfwV-cWn-qJ^t;{uVSPrdOFPFBKYp;Q&d>vvfUk3c<xP^Hc zB4A$jGW<?1DEH3k$WxEB4fS0x{A0rx4S!(xlHs2suboTxid=eEgqKIQ4ETmw3yfU_ z@sWL8_Mtt8<NG==^&7@RUy4);C1TC+(*0!MFJHH3OtP`ia8Jf_4PO#pI_Utp4J}hk zYqgWr?g;#SR;w?Iy}swy4OZ*fRvn;*@(PSle~lwto<Y3cE}VriPtH{KcKsR;Xs`<U z`f;ORYG2|LE%BEjH-O~DG-7&?$Z_tesnTMcyHRo`WW$p8aGfesxieBT9;S`}PkSJ# zEg-~MRE<X~^L~%Y2e1OWqJ^v=!L8em7S-E?!foCt+~!)%&eFv~GLdeifl!jOT%L>* TK8eIWK0OLgRixM}c5(NAQK{fR literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_full_process.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_full_process.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57953fd6f3ceb4b8415f594b68a58ca66f7c783f GIT binary patch literal 5051 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 GhW-oPsgCdf literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_local_cache.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_local_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7e6788898f9038a5876002241f477da477e6b51 GIT binary patch literal 1339 zcmZux&8izW6qe@SWBXE)Zc0O$MK*@Ux2ZR!2_cCIWD!CjbR!IdJkqV_dS*08^8I66 z(%e44-DH15R(*j!MW0}{Sq1t8UG+%5o(v@#Bz^kkoKJ^yBt0FEV+5`G@H>4MAoS5J z_RR(G7`l26149fKh?v<aaOn^SBjz%%a7&MPfD!WxzYIuVaR4|ZAx7L`A&dS%mzYEh zzebb6Cs0E#C%6quk*!lT`-Fjj^*EE9YMw4P*_vx0Mz3e{LTuQaW-AWs_=U)5VON=B zRG>xBJ?L}jDgh;iw~j`Q)8I=8QR8c;LGLkhzC~MCyN%m8%)NBCUgKSR%zKY90^~El zL%|L5SlDrqLBDxAXk74iw!RJ<|2VqD+n@;;SgxG4qu%JjTip1au74dH-EG)}Z14?I z*Ej!T26}r|{?)Ot^PW|IcUrqB{;%~<=hf4?!piITp4t_bcMQ*BD8TUIDo&uyZMGAd zWG1~25++WoLQs|{QS$GT<whr!&<QPyL>wi0#gn7F;L7@*=6aR%tMec^;W9ru2Ro{h zQx2k4LbHr3^(EKOg|u?yR$(fe+DLBd-}-iSF{q_D=9#{CcJW;Y(~?&C5m!1rxj+2@ zzGEe-7T<62?8{cOp4E?Sz|V4})yv6HnzPe}HPx#kU$)*W0MZAJj7=`OeaLv9o|I8d zCEOL%x{7OZy9>pnC#`77ReSJ6DK2#`s%KIPNe0F#HM>kA66msKxg=llGg{W*V}62^ zBE#L$w<7Iemknb%%*-{|rH2fAxgw)(cMxbjs<r$R$y*TJzbEsb7r#IhYC%_&O_%hP zR_BW+70pD&=xo8O6SWXEuT%!3s8{D|@giR?RId5Gnr3VID+k}A01LK0)R65%TIYwo zSS*?L;+fXx?Hyy;CsUi4-C;1-Rs945iaZ?S13YqKm}4_Kj$>x;h8qEIyR|Ur0J{7d zd?y1rf{A#g&_bH0p!GL8FO)4Oxw{W~3h_>R@%FK;vaO?)v^nbyw~c7@uoP@l@JHr_ NQs$+MASC;_{{clxc7Ff> literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_manifest.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a77ea3005020b9c83b2d7f6254f6b2ad4fb67e31 GIT binary patch literal 5548 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 literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_smart_download.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_smart_download.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61b1bbfd370d3f00aa22cfa1c85e40aed4f02ba5 GIT binary patch literal 10124 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 U+*ZN*hV@nJH?23U->~ld7eRjO5dZ)H literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_static_local_cache.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_static_local_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c72fd1c569403a16c2d6c675e4cbbf2f300e2058 GIT binary patch literal 4163 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 literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_utils.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd0fb34fced414647625c2ca95e41817b96eccea GIT binary patch literal 1996 zcmbVM&2Jnv6u0MlKN1R!s*pktg#&xYu9Q|BqViD+2SgQ#RFE=Sw0Or(X0r1Y+mp?% zW)Bb!Tu?6@IBvuV{u&OPeC3pXffLVOnr=#jBE0f@Z|vuv-#)+h`)FmQiD2Zvd`rIZ z5&BbqJRcSqAHo!mK~O|-io%7)AvWJuXdCThu7xnlJR|+k$B0_g{vL$^b*KxvK|Sh& zZc_XNb%Jw1L_3j|dgz-PFdxAbKZBrnh9sKf8lB-8t}(Snme`QicbM8Q?KrS=-|V=s zW6vGwp5bRV@Y4A`i28H1i=HAtLZd)X<L_PD|0m;*AaZ|a`dKVxDYkn(T4mW}Fsz~x zlU;GIOENMoaxxa(sK|QqL=N_oly$-Q;Fxid6#1w0y}O5_l#qQ&7-!?VVS5>5`sG#7 zTY$Y;iOn$+a`XS)va)>3)^z)-YpxgYbwYf4k%+IZorsR7+)5^?2-g+~9pofqgMD6P zgNmnW^`Q`qOUU6ToEKbq<wQb0LU&AfE>!Ca*xds&$qzb~vf)VBS_1kNaj0(eSNUkW zuU$o-#DsQ-WK8l&|6xv|BB$hDpXJA*Uz98t5y+y9C!+s28TLgY*=9+i5jkLRHci2U zj(R$T9x0Pvlok~oL?nutSsa-E(k&<Ib?x&{kzD>yIw0`|2xK|9iQ5;ljn{D7cCgl5 zx5cGCv0=gV$sI8Mqfd0T+B?(TtKRzG)tXIuG~w5*fty!&cWkb^IK0JKN@Q}(1|^a4 z#RGC3cE{o#D7A9Q$Gpr!1bX+j$=D^A3z#>-L1+wwb<TJTtO)CG7@EoSG}-wB42cf$ z+@e@>h_tD7if2}hsC^sFZ0XcCbxy5k4`$BEed$v76n~7qerM*^&fKHk+^_LrP+Qcc z{*TrfU|?i+0&N{_?V%T}A{+DO8Jc+pvjLdz&ivY+w`db?4o=>d?K(Kcv^8@0Z?!jH zsSU;pkE0(hp{>qescksfs2kvY;|u}A{Vrbx?$dAD-bs!inQDU!Bg*y<;sh8a%Zu`e z3t1hHPbSmpYD`2tFio%NN8$0gPK-hwtQ?U{nZiwF@!`3yL9X-Hc}-b)sXR_{T4Z5s z*XSpbNT!@L5mGt2EtCrm2TZwR4jrMK!y?I*7sW*qG3D!9(`2apVM<19Yp5K~2vs(8 zi}I?H0@$KRZfas2m>^Au>rzpTn4QoB`b#c~r5SoME1@ct&GQ2lkhF}+kV)n4Yi>|M zQ7sr&SxFLl8jW$~C%K_r<wkLpk3yT|;^hikHx+h83~xaugzhV3wQ&HyHeSUWc-_)g z6YM6~P<9=iu@-kgaoxe8n^##m;cMEy^PC>Kzzp3bX6PDHP&O=wt)+F76VvFXo(=j^ e$mWeqX9N$jf>tSeU%!}WgU~Ssc-;<e1>WDfE=D2% literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/test_windows_isilon_paths.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_windows_isilon_paths.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42bea6375729a5343717253f0573db83eb84cbda GIT binary patch literal 2714 zcmbtWTaVjB6!zGO<2aY@rIg;NTv1RXwTYIZN?lb|w+mDVSOG06G68qiGpW7nTW2Os z6FDH*KJWtN2lOE;p7=|C<%t)508gBmTy~dI1Z5)69MAE5=lEPc=T@U(YcP_Zzs28! z^sBs?4;_S?aB(>iji5+#rz>(1-0P7Z8?J%mo)MMevRhViDKg`VTLHOD%qN;_5p+ju zRel2$ZL5Wf(#Kc?ur@cNv`;p%AJAKvQ`oUS!b#YpT=>$q98I{ShnsNmb4b&KmZLp1 z)(IjyF-S?;AQfUgGf0)#q^6|$Go3U@6Ew%<eTc}?GjnX@h%BGc#wCIB5?R^PpRSC{ zLZ2A9k(c*%q}|iV>L=Q#+UFWMPF{JUjZIOSl*x&GG_K^8iAi1s$;vIVx?ANxipqB= z*Cy7!_Vnv<^|nS%l2cDKa!OS9jIo_pCw6X=)49115z6gcCujEbaZS{69ju@ILC<Sm zJ+Dm~<TXI81AbE+%j<h+9|69_e^>am$r5RRzA@7`=K7xyUy@H8@_7}ad=7&(&30hi z4MOe+2&Mz;P9N5o;zT$ibskX`_J&THIQPPYqyz43zVCzy7dY`LSEogQ#U&@~IoQb{ zUGkI&sB^!AqlhM*`wkB<qr~Zj5p}po8I@-G9JcTj!Iz2kNXRa!lXDb#fIEXQiX1<U zsgw4FJl5++&c(1z+n^GG+{DRHdBU?k3)4RMxZZIxMl+faWd%HTHl#Oq-uVEG^FDQ6 zU%PhoZFQ<ZYi>o_@<LM7vIzS$NFzeo$c~4XGnVd9UyRNNLS*Zm&R{TT@AQ-1Hn`N0 zo_0jq!EK*Ea!YG4+%n$w32hmL(PxosLjZZ0CV=f$m5~7RV03PV#^L3LN1(Q+P;bF- z&EA6`+}UmEqq4FvDo?d0!2)}0qc{J~C#jn{CMAVdjp8KD9x^Ukrn?l+I>(#2=AMnI zzzT8}1<y~Tew=s-j;Y&Fnk>v{6ehH&&jO;9Mf1o}Uf2s5K5EPjwRd=$6lk!u=vCRX zP<+}Q*{da(RNw1ccYo1ZdQsvu>J=zvb<n8kk8d{DyPt6gWfupSw72m9a^BrYu%9Lb zU+L215$~puZ|=jKX2FnmKMc3KJQVbDhW%aqfWlc>0-Wr2WUY5_7Iu8eE1s%9wdoC} zRqln58OWMUFmGqWVwv>gc<8AB(Z?Yd{0-^5A|EumDghT~<sna`GmQ52DD`o~Z?vC- z7+GI^v2oe`vb#Q7h8M)$nf0zj@Bx1@q@9~^@e43fO_Hjshz&^7kmLrdA~;yfqyp`2 zjjsGFr|yF12khz_fG>w!k7fvx)k0e;9W8@3K+h!Q7AQT)6FVk%njR2E5~Y}^cwK?L zd7y5+gir0GaR1#!wk(}p6w}nnl>^jyonAfU=zIUq(K)0qV<?AQUmQ;~jptunT=gO- zG!LrQo8$3ofHM!~?U(ZLdCaYrSy-NGXwNHb&x=#i2RihMy5~LY<4E#==dl&A%~s`f zTuukxDruVfqvf<Fy)|L7bjz>|b`nIlez=R=lH`*Xa&1WxUYKNkF=M;dGLvOrlw@BQ zB}F17=%K9887(TnzZsBrVRDL@9~8|E4g?{9Yu{xoW%7YU(8q$wQZ6bSI8F%0B-^;v zML^xgg280d73CNU05iB?Zgt9hu-$69wKz?7=@1_B1J@LB2A`{<y7+Rr_B=)28eq;T zR$-zZTas2+x1l5E1OpmDSu*V*!xxWLaEh`*bj?^%k82XO9*VUJ^O=9hd=*To|6!VC z={h?2nM$@%3D%}=p*lLDTV>m@QC+vuQcdbjkeYCvKsI6*0jX7GXJKKdVJa%}b)s-v z<;A@)r_(ktY5Ne99+p+~-SaPebRH>{7iIC#yB^e)b$wcsH)IcS`8Ur(@CJGv)r~&^ D(-8=K literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/__pycache__/utils.cpython-37.pyc b/test/api/cloud_cache/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8882cea07ced0db72fe0622eab52c41beada197e GIT binary patch literal 3382 zcmbtW&5s*N6|d?qx7#1%I0MVDAv6o@#8GA}7zvOWtw@597Q%pbH$-Z@GG$jy+~an4 zr>lE1W7<e)_ZqbKO{9r9@fYw<>|fAVPJ83L7kIC_+cT2`AkmiV`@Q<rd#~QF9&|bm zfiL{)pV_@WA^*Tm{WYNRGx*Cn6r6AxkR|o#Qu8#5eJ#*EUDbwXsM_>QVF@ZMt{rPT zL^R;1pV(aE`b&!&-2Bw=n!E|4me7Q?13I|%(%=nle`<OT*FGcz=S$d)479?09QsjM z*uRNWs9A6{unLE>luf2VG?hhnDN=T&-&?ZKKNd2boQg!EXlt6y79yR5Y$*zB7Wg7e z3o8+6mV`4Cw}I~_{PCm@;V&HxPD<D2+1;G{oP7Mw+RBX+lIvW{t<T9TEhjmm*5Plw z&?$N5JRv#d=AxPW;q2X<g3RrWj8(}{B~z|{57rwe6f`zo&~?KnYy0d+Ih=n7_q)4p z=3t*4lB}S1cF2XsTdyf^?-0=1<eeRo+qrc}o~@n`kacn`cX;=Z<R;WxhlKZ_zHtb1 zQ1_vK6Y6d3uUq_Ux&ArfU(Zb_-+E=P+h=2S%8x*I8^&4+ufFc2`i1eDth;&l!n{23 zYf1@>STM7dcMu1l+2Y@Lsjqu^FK<;VdpiX1{S(gFg1vVDo3hVmH2LBhf)*mk+x(k9 zChIofyK(k`vfnTNBN}B(g``trDRJ<(U+Vb{v<#H$<e$-Je*z46)?2T%bwBT`_P25k zMsB|{VAp=>+q|DPQv0HrJ7DQ=f1;J1<tD_U%l-lZ;kfWUiWqm9n?iiK7<5vkt{<k6 zyNuFkS3(7$#@!DO9JTznEP<d)ArMt}Z}X|{Wz>#b?$1&+h`aon#nL_Y1A!syf_8R& zeitQoM{YV7?(`hM00z~;aV5A>wTo&dKCf0+JvTajW4#i%ew9Y9x_ZAyX!qQsC=?%W z)ZSNs+$D=+KYZ%eg4aM_LxvldHhJ@Yj$D~08^s^Nk*bSZgRBMIJDb*XKM35Z*hpn@ z0FD8}SDrX<8Tg`31b^JLD$VQt6B&hr63><FP(o2!%QP`^r{LFv{jyiC|3D><YYtTs zXrK+C#|n^CMvjx{)JJgWoqO(65sHMN)6ji2w0j#-7IL>d&-E3Xv#FJ<Ca66Tvvlul zwY6yuaf@MLU^UPS>w(IAh5jpX?imjvetxui`*LyBn$+GK4rtPX{O8%fD^sWR?Dyp( z#F{2;nD~kgzx)?`Ub9;8K2IzdFWR*#3|OyGMVWW2);y_3CbKBWmSLHSFEcmJ%Ayqq zY$oPWz(wM9@CcLGk44~zV%3<ZX*?PZSN(l?u+Nrk1zhl4?$4s-aAm4v!+G^A2@0oj zG6a3mRQt}EoL8KocJg{P+#26NPk{DFvW*2&!KyW^JtK!+Yf^V6rz=wh&&tfw<Gr5@ z9M6ffbP`R`7v6T@1M!rdntx<r$~f@TqJcO9e_AxA0b7V4P75oG;h3Um&czw`pMseS zQ{9@vzyK{wo-JcJxS1G;3#m$(J3*pKY%I2*D9mF;ZFVAL9EDPNJvA^%qZ&h@1E#{R zPvLcyb(L}Oc6&A$ZjwY%s?6Y7h!mV)&*oybkl7OG8r^{cUZ*zNM2R}J(#hg)BzXt$ ze6@Hu8b6j0LSr^(e1FQGv+#U;KV-8g<m_N9!c#epViC$2lu<lCm*YqNbS(W;?8R)h zU|@<d3n2eVz8GTo4O#3DXF-(l$&3N2VV3%V+>g(THs1UR!h>9lhEeYn@*P8Ss6}nM zt=Y6}^|UrMXcxx%w5J(RS3hX?VNE$>YZ}UFAO{-y&@!sIF2$Li)`jtHXlbB3`5x>z zFp3_6oLosIg<V0CMY}c_0F+4+1ZFxE_@NIsuZ|o#DLJ8>;!Ej;w$^j~1l}6>VtN5@ ztz5s*bMl(5jod(HrnuVNtTxX^IYnNE7sNiWC%mcPJu-&30WkEs5gOcDH_}F~xHE6$ z7BIE>i3zWlUpyh)0-kHIztf869wq_;6L_aQl8Z?xj^Zr9Q9pH``{~>jXKWb<q9#K5 zzi{50cDkPZkC5*wZYp;!b=J0ggC`-aL0XN%4P)RvkUw=#S&%_~WeH$|@Rq3354jI% zIAg&k)1p?zSdeHVpcD6!L=>~C<XHl^>cWv*zeN=_UXtSf38&uUzd~~FaB<ACARQ@I z9;gF(nmkxFGr1?2O!s~;pk6BxPvQNmlI^M$XVbu+?SWtUKr7R{e*fX4qk#=M2T88L z{1IizOcb4&a(@-iUazE)D(3^=7Z$usrh!m7s4y1dT$UHXPQDL8oV<(0E)<0US3dM^ zR2QSl%%Gu^q^AX4s+>_4-$l8*P%PjtZ$m-0yR@r2a0|OS-cLu}TMh1>25q%=K#vBk z!b;EaC6d5HjU;%zk~>)3!s0C`fD<7S3LTiN%$#^}mHd_cF?%HlqOcE_5zhkg9$W|_ QksEqtw$Nc;wR?a1Z#l-kjQ{`u literal 0 HcmV?d00001 diff --git a/test/api/cloud_cache/conftest.py b/test/api/cloud_cache/conftest.py new file mode 100644 index 0000000000..dbdd900e7c --- /dev/null +++ b/test/api/cloud_cache/conftest.py @@ -0,0 +1,185 @@ +import pytest +import copy + + +@pytest.fixture +def example_datasets(): + """ + A dict representing an example dataset that can + be used for testing the CloudCache api. + + The key of the dict is the name of each file. + The values of the dict are dicts in which + 'file_id' -> maps to the file_id used to describe the file + 'data' -> a bytestring representing the contents of the file + """ + datasets = {} + data = {} + data['f1.txt'] = {'data': b'1234567', + 'file_id': '1'} + data['f2.txt'] = {'data': b'4567890', + 'file_id': '2'} + data['f3.txt'] = {'data': b'11121314', + 'file_id': '3'} + datasets['1.0.0'] = data + + data = {} + data['f1.txt'] = {'data': b'abcdefg', + 'file_id': '1'} + data['f2.txt'] = {'data': b'4567890', + 'file_id': '2'} + data['f3.txt'] = {'data': b'11121314', + 'file_id': '3'} + + datasets['2.0.0'] = data + + data = {} + data['f1.txt'] = {'data': b'1234567', + 'file_id': '1'} + data['f2.txt'] = {'data': b'xyzabcde', + 'file_id': '2'} + data['f3.txt'] = {'data': b'hijklmnop', + 'file_id': '3'} + + datasets['3.0.0'] = data + return datasets + + +@pytest.fixture +def baseline_data_with_metadata(): + """ + Example dataset with example metadata for use in testing + CloudCache API + """ + data = {} + data['f1.txt'] = {'file_id': '1', 'data': b'1234'} + data['f2.txt'] = {'file_id': '2', 'data': b'2345'} + data['f3.txt'] = {'file_id': '3', 'data': b'6789'} + + metadata = {} + metadata['metadata_1.csv'] = b'abcdef' + metadata['metadata_2.csv'] = b'ghijklm' + metadata['metadata_3.csv'] = b'nopqrst' + return {'data': data, 'metadata': metadata} + + +@pytest.fixture +def example_datasets_with_metadata(baseline_data_with_metadata): + """ + Multiple versions of an example dataset that goes through + all possible mutations (adding/deleting files; renaming files; + changing existing files) for use in testing the CloudCache API + """ + + example = {} + example['data'] = {} + example['metadata'] = {} + + data = copy.deepcopy(baseline_data_with_metadata) + example['data']['1.0.0'] = data['data'] + example['metadata']['1.0.0'] = data['metadata'] + + # delete one data file + data = copy.deepcopy(baseline_data_with_metadata) + data['data'].pop('f2.txt') + example['data']['2.0.0'] = data['data'] + example['metadata']['2.0.0'] = data['metadata'] + + # rename one data file + data = copy.deepcopy(baseline_data_with_metadata) + old = data['data'].pop('f2.txt') + data['data']['f4.txt'] = {'file_id': '4', 'data': old['data']} + example['data']['3.0.0'] = data['data'] + example['metadata']['3.0.0'] = data['metadata'] + + # change one data file + data = copy.deepcopy(baseline_data_with_metadata) + data['data']['f3.txt'] = {'file_id': '3', 'data': b'44556677'} + example['data']['4.0.0'] = data['data'] + example['metadata']['4.0.0'] = data['metadata'] + + # add a data file + data = copy.deepcopy(baseline_data_with_metadata) + data['data']['f4.txt'] = {'file_id': '4', 'data': b'44556677'} + example['data']['5.0.0'] = data['data'] + example['metadata']['5.0.0'] = data['metadata'] + + # delete a data file and change another + data = copy.deepcopy(baseline_data_with_metadata) + data['data'].pop('f2.txt') + data['data']['f1.txt'] = {'file_id': '1', 'data': b'xxxxxx'} + example['data']['6.0.0'] = data['data'] + example['metadata']['6.0.0'] = data['metadata'] + + # delete a data file and rename another + data = copy.deepcopy(baseline_data_with_metadata) + data['data'].pop('f2.txt') + old = data['data'].pop('f3.txt') + data['data']['f5.txt'] = {'file_id': '5', 'data': old['data']} + example['data']['7.0.0'] = data['data'] + example['metadata']['7.0.0'] = data['metadata'] + + # delete a data file and add another + data = copy.deepcopy(baseline_data_with_metadata) + data['data'].pop('f2.txt') + data['data']['f5.txt'] = {'file_id': '5', 'data': b'yyyyy'} + example['data']['8.0.0'] = data['data'] + example['metadata']['8.0.0'] = data['metadata'] + + # rename a data file and add another + data = copy.deepcopy(baseline_data_with_metadata) + old = data['data'].pop('f3.txt') + data['data']['f4.txt'] = {'file_id': '4', 'data': old['data']} + data['data']['f5.txt'] = {'file_id': '5', 'data': b'wwwwww'} + example['data']['9.0.0'] = data['data'] + example['metadata']['9.0.0'] = data['metadata'] + + # delete a metadata file + data = copy.deepcopy(baseline_data_with_metadata) + data['metadata'].pop('metadata_2.csv') + example['data']['10.0.0'] = data['data'] + example['metadata']['10.0.0'] = data['metadata'] + + # rename a metadata file + data = copy.deepcopy(baseline_data_with_metadata) + old = data['metadata'].pop('metadata_2.csv') + data['metadata']['metadata_4.csv'] = old + example['data']['11.0.0'] = data['data'] + example['metadata']['11.0.0'] = data['metadata'] + + # change a metadata file + data = copy.deepcopy(baseline_data_with_metadata) + data['metadata']['metadata_3.csv'] = b'12345' + example['data']['12.0.0'] = data['data'] + example['metadata']['12.0.0'] = data['metadata'] + + # add a metadata file + data = copy.deepcopy(baseline_data_with_metadata) + data['metadata']['metadata_4.csv'] = b'12345' + example['data']['13.0.0'] = data['data'] + example['metadata']['13.0.0'] = data['metadata'] + + # delete a data file and change a metadata file + data = copy.deepcopy(baseline_data_with_metadata) + data['data'].pop('f2.txt') + old = data['metadata'].pop('metadata_3.csv') + data['metadata']['metadata_4.csv'] = old + example['data']['14.0.0'] = data['data'] + example['metadata']['14.0.0'] = data['metadata'] + + # rename a data file, add two data files + # rename a metadata file and delete two metadata files + data = copy.deepcopy(baseline_data_with_metadata) + old = data['data'].pop('f1.txt') + data['data']['f4.txt'] = old + data['data']['f5.txt'] = {'file_id': '5', 'data': b'babababa'} + data['data']['f6.txt'] = {'file_id': '6', 'data': b'neighneigh'} + old = data['metadata'].pop('metadata_2.csv') + data['metadata']['metadata_4.csv'] = old + data['metadata'].pop('metadata_1.csv') + data['metadata'].pop('metadata_3.csv') + + example['data']['15.0.0'] = data['data'] + example['metadata']['15.0.0'] = data['metadata'] + + return example diff --git a/test/api/cloud_cache/test_cache.py b/test/api/cloud_cache/test_cache.py new file mode 100644 index 0000000000..8c40822b8b --- /dev/null +++ b/test/api/cloud_cache/test_cache.py @@ -0,0 +1,812 @@ +import pytest +import json +import hashlib +import pathlib +import pandas as pd +import io +import boto3 +from moto import mock_s3 +from .utils import create_bucket +from allensdk.api.cloud_cache.cloud_cache import OutdatedManifestWarning +from allensdk.api.cloud_cache.cloud_cache import S3CloudCache # noqa: E501 +from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 + + +@mock_s3 +def test_list_all_manifests(tmpdir): + """ + Test that S3CloudCache.list_al_manifests() returns the correct result + """ + + test_bucket_name = 'list_manifest_bucket' + + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name) + + client = boto3.client('s3', region_name='us-east-1') + client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v1.0.0.json', + Body=b'123456') + client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v2.0.0.json', + Body=b'123456') + client.put_object(Bucket=test_bucket_name, + Key='junk.txt', + Body=b'123456') + + cache = S3CloudCache(tmpdir, test_bucket_name, 'proj') + + assert cache.manifest_file_names == ['manifest_v1.0.0.json', + 'manifest_v2.0.0.json'] + + +@mock_s3 +def test_list_all_manifests_many(tmpdir): + """ + Test the extreme case when there are more manifests than list_objects_v2 + can return at a time + """ + + test_bucket_name = 'list_manifest_bucket' + + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name) + + client = boto3.client('s3', region_name='us-east-1') + for ii in range(2000): + client.put_object(Bucket=test_bucket_name, + Key=f'proj/manifests/manifest_{ii}.json', + Body=b'123456') + + client.put_object(Bucket=test_bucket_name, + Key='junk.txt', + Body=b'123456') + + cache = S3CloudCache(tmpdir, test_bucket_name, 'proj') + + expected = list([f'manifest_{ii}.json' for ii in range(2000)]) + expected.sort() + assert cache.manifest_file_names == expected + + +@mock_s3 +def test_loading_manifest(tmpdir): + """ + Test loading manifests with S3CloudCache + """ + + test_bucket_name = 'list_manifest_bucket' + + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + client = boto3.client('s3', region_name='us-east-1') + + manifest_1 = {'manifest_version': '1', + 'metadata_file_id_column_name': 'file_id', + 'data_pipeline': 'placeholder', + 'project_name': 'sam-beckett', + 'data_files': {}, + 'metadata_files': {'a.csv': {'url': 'http://www.junk.com', + 'version_id': '1111', + 'file_hash': 'abcde'}, + 'b.csv': {'url': 'http://silly.com', + 'version_id': '2222', + 'file_hash': 'fghijk'}}} + + manifest_2 = {'manifest_version': '2', + 'metadata_file_id_column_name': 'file_id', + 'data_pipeline': 'placeholder', + 'project_name': 'al', + 'data_files': {}, + 'metadata_files': {'c.csv': {'url': 'http://www.absurd.com', + 'version_id': '3333', + 'file_hash': 'lmnop'}, + 'd.csv': {'url': 'http://nonsense.com', + 'version_id': '4444', + 'file_hash': 'qrstuv'}}} + + client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v1.0.0.json', + Body=bytes(json.dumps(manifest_1), 'utf-8')) + + client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v2.0.0.json', + Body=bytes(json.dumps(manifest_2), 'utf-8')) + + cache = S3CloudCache(pathlib.Path(tmpdir), test_bucket_name, 'proj') + assert cache.current_manifest is None + cache.load_manifest('manifest_v1.0.0.json') + assert cache._manifest._data == manifest_1 + assert cache.version == '1' + assert cache.file_id_column == 'file_id' + assert cache.metadata_file_names == ['a.csv', 'b.csv'] + assert cache.current_manifest == 'manifest_v1.0.0.json' + + cache.load_manifest('manifest_v2.0.0.json') + assert cache._manifest._data == manifest_2 + assert cache.version == '2' + assert cache.file_id_column == 'file_id' + assert cache.metadata_file_names == ['c.csv', 'd.csv'] + + with pytest.raises(ValueError) as context: + cache.load_manifest('manifest_v3.0.0.json') + msg = 'is not one of the valid manifest names' + assert msg in context.value.args[0] + + +@mock_s3 +def test_file_exists(tmpdir): + """ + Test that cache._file_exists behaves correctly + """ + + data = b'aakderasjklsafetss77123523asf' + hasher = hashlib.blake2b() + hasher.update(data) + true_checksum = hasher.hexdigest() + test_file_path = pathlib.Path(tmpdir)/'junk.txt' + with open(test_file_path, 'wb') as out_file: + out_file.write(data) + + # need to populate a bucket in order for + # S3CloudCache to be instantiated + test_bucket_name = 'silly_bucket' + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + cache = S3CloudCache(tmpdir, test_bucket_name, 'proj') + + # should be true + good_attribute = CacheFileAttributes('http://silly.url.com', + '12345', + true_checksum, + test_file_path) + assert cache._file_exists(good_attribute) + + # test when file path is wrong + bad_path = pathlib.Path('definitely/not/a/file.txt') + bad_attribute = CacheFileAttributes('http://silly.url.com', + '12345', + true_checksum, + bad_path) + + assert not cache._file_exists(bad_attribute) + + # test when path exists but is not a file + bad_attribute = CacheFileAttributes('http://silly.url.com', + '12345', + true_checksum, + pathlib.Path(tmpdir)) + with pytest.raises(RuntimeError) as context: + cache._file_exists(bad_attribute) + assert 'but is not a file' in context.value.args[0] + + +@mock_s3 +def test_download_file(tmpdir): + """ + Test that S3CloudCache._download_file behaves as expected + """ + + hasher = hashlib.blake2b() + data = b'11235813kjlssergwesvsdd' + hasher.update(data) + true_checksum = hasher.hexdigest() + + test_bucket_name = 'bucket_for_download' + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # turn on bucket versioning + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + client.put_object(Bucket=test_bucket_name, + Key='data/data_file.txt', + Body=data) + + response = client.list_object_versions(Bucket=test_bucket_name) + version_id = response['Versions'][0]['VersionId'] + + cache_dir = pathlib.Path(tmpdir) / 'download/test/cache' + cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') + + expected_path = cache_dir / true_checksum / 'data/data_file.txt' + + url = f'http://{test_bucket_name}.s3.amazonaws.com/data/data_file.txt' + good_attributes = CacheFileAttributes(url, + version_id, + true_checksum, + expected_path) + + assert not expected_path.exists() + cache._download_file(good_attributes) + assert expected_path.exists() + hasher = hashlib.blake2b() + with open(expected_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_checksum + + +@mock_s3 +def test_download_file_multiple_versions(tmpdir): + """ + Test that S3CloudCache._download_file behaves as expected + when there are multiple versions of the same file in the + bucket + + (This is really just testing that S3's versioning behaves the + way we think it does) + """ + + hasher = hashlib.blake2b() + data_1 = b'11235813kjlssergwesvsdd' + hasher.update(data_1) + true_checksum_1 = hasher.hexdigest() + + hasher = hashlib.blake2b() + data_2 = b'zzzzxxxxyyyywwwwjjjj' + hasher.update(data_2) + true_checksum_2 = hasher.hexdigest() + + assert true_checksum_2 != true_checksum_1 + + test_bucket_name = 'bucket_for_download_versions' + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # turn on bucket versioning + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + client.put_object(Bucket=test_bucket_name, + Key='data/data_file.txt', + Body=data_1) + + response = client.list_object_versions(Bucket=test_bucket_name) + version_id_1 = response['Versions'][0]['VersionId'] + + client = boto3.client('s3', region_name='us-east-1') + client.put_object(Bucket=test_bucket_name, + Key='data/data_file.txt', + Body=data_2) + + response = client.list_object_versions(Bucket=test_bucket_name) + version_id_2 = None + for v in response['Versions']: + if v['IsLatest']: + version_id_2 = v['VersionId'] + assert version_id_2 is not None + assert version_id_2 != version_id_1 + + cache_dir = pathlib.Path(tmpdir) / 'download/test/cache' + cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') + + url = f'http://{test_bucket_name}.s3.amazonaws.com/data/data_file.txt' + + # download first version of file + expected_path = cache_dir / true_checksum_1 / 'data/data_file.txt' + + good_attributes = CacheFileAttributes(url, + version_id_1, + true_checksum_1, + expected_path) + + assert not expected_path.exists() + cache._download_file(good_attributes) + assert expected_path.exists() + hasher = hashlib.blake2b() + with open(expected_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_checksum_1 + + # download second version of file + expected_path = cache_dir / true_checksum_2 / 'data/data_file.txt' + + good_attributes = CacheFileAttributes(url, + version_id_2, + true_checksum_2, + expected_path) + + assert not expected_path.exists() + cache._download_file(good_attributes) + assert expected_path.exists() + hasher = hashlib.blake2b() + with open(expected_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_checksum_2 + + +@mock_s3 +def test_re_download_file(tmpdir): + """ + Test that S3CloudCache._download_file will re-download a file + when it has been removed from the local system + """ + + hasher = hashlib.blake2b() + data = b'11235813kjlssergwesvsdd' + hasher.update(data) + true_checksum = hasher.hexdigest() + + test_bucket_name = 'bucket_for_re_download' + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # turn on bucket versioning + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + client.put_object(Bucket=test_bucket_name, + Key='data/data_file.txt', + Body=data) + + response = client.list_object_versions(Bucket=test_bucket_name) + version_id = response['Versions'][0]['VersionId'] + + cache_dir = pathlib.Path(tmpdir) / 'download/test/cache' + cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') + + expected_path = cache_dir / true_checksum / 'data/data_file.txt' + + url = f'http://{test_bucket_name}.s3.amazonaws.com/data/data_file.txt' + good_attributes = CacheFileAttributes(url, + version_id, + true_checksum, + expected_path) + + assert not expected_path.exists() + cache._download_file(good_attributes) + assert expected_path.exists() + hasher = hashlib.blake2b() + with open(expected_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_checksum + + # now, remove the file, and see if it gets re-downloaded + expected_path.unlink() + assert not expected_path.exists() + + cache._download_file(good_attributes) + assert expected_path.exists() + hasher = hashlib.blake2b() + with open(expected_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_checksum + + +@mock_s3 +def test_download_data(tmpdir): + """ + Test that S3CloudCache.download_data() correctly downloads files from S3 + """ + + hasher = hashlib.blake2b() + data = b'11235813kjlssergwesvsdd' + hasher.update(data) + true_checksum = hasher.hexdigest() + + test_bucket_name = 'bucket_for_download_data' + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # turn on bucket versioning + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + client.put_object(Bucket=test_bucket_name, + Key='data/data_file.txt', + Body=data) + + response = client.list_object_versions(Bucket=test_bucket_name) + version_id = response['Versions'][0]['VersionId'] + + manifest = {} + manifest['manifest_version'] = '1' + manifest['project_name'] = "project-z" + manifest['metadata_file_id_column_name'] = 'file_id' + manifest['metadata_files'] = {} + url = f'http://{test_bucket_name}.s3.amazonaws.com/project-z/data/data_file.txt' # noqa: E501 + data_file = {'url': url, + 'version_id': version_id, + 'file_hash': true_checksum} + + manifest['data_files'] = {'only_data_file': data_file} + manifest['data_pipeline'] = 'placeholder' + + client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v1.0.0.json', + Body=bytes(json.dumps(manifest), 'utf-8')) + + cache_dir = pathlib.Path(tmpdir) / "data/path/cache" + cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') + + cache.load_manifest('manifest_v1.0.0.json') + + expected_path = cache_dir / 'project-z-1' / 'data/data_file.txt' + assert not expected_path.exists() + + # test data_path + attr = cache.data_path('only_data_file') + assert attr['local_path'] == expected_path + assert not attr['exists'] + + # NOTE: commenting out because moto does not support + # list_object_versions and this is becoming difficult + + # result_path = cache.download_data('only_data_file') + # assert result_path == expected_path + # assert expected_path.exists() + # hasher = hashlib.blake2b() + # with open(expected_path, 'rb') as in_file: + # hasher.update(in_file.read()) + # assert hasher.hexdigest() == true_checksum + + # test that data_path detects that the file now exists + # attr = cache.data_path('only_data_file') + # assert attr['local_path'] == expected_path + # assert attr['exists'] + + +@mock_s3 +def test_download_metadata(tmpdir): + """ + Test that S3CloudCache.download_metadata() correctly + downloads files from S3 + """ + + hasher = hashlib.blake2b() + data = b'11235813kjlssergwesvsdd' + hasher.update(data) + true_checksum = hasher.hexdigest() + + test_bucket_name = 'bucket_for_download_metadata' + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # turn on bucket versioning + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + meta_version = client.put_object(Bucket=test_bucket_name, + Key='metadata_file.csv', + Body=data)["VersionId"] + + response = client.list_object_versions(Bucket=test_bucket_name) + version_id = response['Versions'][0]['VersionId'] + + manifest = {} + manifest['manifest_version'] = '1' + manifest['project_name'] = "project4" + manifest['metadata_file_id_column_name'] = 'file_id' + url = f'http://{test_bucket_name}.s3.amazonaws.com/project4/metadata_file.csv' # noqa: E501 + metadata_file = {'url': url, + 'version_id': version_id, + 'file_hash': true_checksum} + + manifest['metadata_files'] = {'metadata_file.csv': metadata_file} + manifest['data_files'] = {} + manifest['data_pipeline'] = 'placeholder' + + client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v1.0.0.json', + Body=bytes(json.dumps(manifest), 'utf-8')) + + cache_dir = pathlib.Path(tmpdir) / "metadata/path/cache" + cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') + + cache.load_manifest('manifest_v1.0.0.json') + + expected_path = cache_dir / "project4-1" / 'metadata_file.csv' + assert not expected_path.exists() + + # test that metadata_path also works + attr = cache.metadata_path('metadata_file.csv') + assert attr['local_path'] == expected_path + assert not attr['exists'] + + def response_fun(Bucket, Prefix): + # moto doesn't cover list_object_versions + return {"Versions": [{ + "VersionId": meta_version, + "Key": "metadata_file.csv", + "Size": 12}]} + # cache.s3_client.list_object_versions = response_fun + + # NOTE: commenting out because moto does not support + # list_object_versions and this is becoming difficult + + # result_path = cache.download_metadata('metadata_file.csv') + # assert result_path == expected_path + # assert expected_path.exists() + # hasher = hashlib.blake2b() + # with open(expected_path, 'rb') as in_file: + # hasher.update(in_file.read()) + # assert hasher.hexdigest() == true_checksum + + # # test that metadata_path detects that the file now exists + # attr = cache.metadata_path('metadata_file.csv') + # assert attr['local_path'] == expected_path + # assert attr['exists'] + + +@mock_s3 +def test_metadata(tmpdir): + """ + Test that S3CloudCache.metadata() returns the expected pandas DataFrame + """ + data = {} + data['mouse_id'] = [1, 4, 6, 8] + data['sex'] = ['F', 'F', 'M', 'M'] + data['age'] = ['P50', 'P46', 'P23', 'P40'] + true_df = pd.DataFrame(data) + + with io.StringIO() as stream: + true_df.to_csv(stream, index=False) + stream.seek(0) + data = bytes(stream.read(), 'utf-8') + + hasher = hashlib.blake2b() + hasher.update(data) + true_checksum = hasher.hexdigest() + + test_bucket_name = 'bucket_for_metadata' + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # turn on bucket versioning + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + client.put_object(Bucket=test_bucket_name, + Key='metadata_file.csv', + Body=data) + + response = client.list_object_versions(Bucket=test_bucket_name) + version_id = response['Versions'][0]['VersionId'] + + manifest = {} + manifest['manifest_version'] = '1' + manifest['project_name'] = "project-X" + manifest['metadata_file_id_column_name'] = 'file_id' + url = f'http://{test_bucket_name}.s3.amazonaws.com/metadata_file.csv' + metadata_file = {'url': url, + 'version_id': version_id, + 'file_hash': true_checksum} + + manifest['metadata_files'] = {'metadata_file.csv': metadata_file} + manifest['data_files'] = {} + manifest['data_pipeline'] = 'placeholder' + + client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v1.0.0.json', + Body=bytes(json.dumps(manifest), 'utf-8')) + + cache_dir = pathlib.Path(tmpdir) / "metadata/cache" + cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') + cache.load_manifest('manifest_v1.0.0.json') + + metadata_df = cache.get_metadata('metadata_file.csv') + assert true_df.equals(metadata_df) + + +@mock_s3 +def test_latest_manifest(tmpdir, example_datasets_with_metadata): + """ + Test that the methods which return the latest and latest downloaded + manifest file names work correctly + """ + bucket_name = 'latest_manifest_bucket' + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=example_datasets_with_metadata['metadata']) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + assert cache.latest_downloaded_manifest_file == '' + + cache.load_manifest('project-x_manifest_v7.0.0.json') + cache.load_manifest('project-x_manifest_v3.0.0.json') + cache.load_manifest('project-x_manifest_v2.0.0.json') + + assert cache.latest_manifest_file == 'project-x_manifest_v15.0.0.json' + + expected = 'project-x_manifest_v7.0.0.json' + assert cache.latest_downloaded_manifest_file == expected + + +@mock_s3 +def test_outdated_manifest_warning(tmpdir, example_datasets_with_metadata): + """ + Test that a warning is raised the first time you try to load an outdated + manifest + """ + + bucket_name = 'outdated_manifest_bucket' + metadatasets = example_datasets_with_metadata['metadata'] + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=metadatasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + m_warn_type = 'OutdatedManifestWarning' + + with pytest.warns(OutdatedManifestWarning) as warnings: + cache.load_manifest('project-x_manifest_v7.0.0.json') + ct = 0 + for w in warnings.list: + if w._category_name == m_warn_type: + msg = str(w.message) + assert 'is not the most up to date' in msg + assert 'S3CloudCache.compare_manifests' in msg + assert 'load_latest_manifest' in msg + ct += 1 + assert ct > 0 + + # assert no warning is raised the second time by catching + # any warnings that are emitted and making sure they are + # not OutdatedManifestWarnings + with pytest.warns(None) as warnings: + cache.load_manifest('project-x_manifest_v11.0.0.json') + if len(warnings) > 0: + for w in warnings.list: + assert w._category_name != 'OutdatedManifestWarning' + + +@mock_s3 +def test_list_all_downloaded(tmpdir, example_datasets_with_metadata): + """ + Test that list_all_downloaded_manifests works + """ + + bucket_name = 'outdated_manifest_bucket' + metadatasets = example_datasets_with_metadata['metadata'] + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=metadatasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + assert cache.list_all_downloaded_manifests() == [] + + cache.load_manifest('project-x_manifest_v5.0.0.json') + assert cache.current_manifest == 'project-x_manifest_v5.0.0.json' + cache.load_manifest('project-x_manifest_v2.0.0.json') + assert cache.current_manifest == 'project-x_manifest_v2.0.0.json' + cache.load_manifest('project-x_manifest_v3.0.0.json') + assert cache.current_manifest == 'project-x_manifest_v3.0.0.json' + + expected = {'project-x_manifest_v5.0.0.json', + 'project-x_manifest_v2.0.0.json', + 'project-x_manifest_v3.0.0.json'} + downloaded = set(cache.list_all_downloaded_manifests()) + assert downloaded == expected + + +@mock_s3 +def test_latest_manifest_warning(tmpdir, example_datasets_with_metadata): + """ + Test that the correct warning is emitted when the user tries + to load_latest_manifest but that has not been downloaded yet + """ + + bucket_name = 'outdated_manifest_bucket' + metadatasets = example_datasets_with_metadata['metadata'] + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=metadatasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + cache.load_manifest('project-x_manifest_v4.0.0.json') + + with pytest.warns(OutdatedManifestWarning) as warnings: + cache.load_latest_manifest() + assert len(warnings) == 1 + msg = str(warnings[0].message) + assert 'project-x_manifest_v4.0.0.json' in msg + assert 'project-x_manifest_v15.0.0.json' in msg + assert 'It is possible that some data files' in msg + cmd = "S3CloudCache.load_manifest('project-x_manifest_v4.0.0.json')" + assert cmd in msg + + +@mock_s3 +def test_load_last_manifest(tmpdir, example_datasets_with_metadata): + """ + Test that load_last_manifest works + """ + bucket_name = 'load_lst_manifest_bucket' + metadatasets = example_datasets_with_metadata['metadata'] + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=metadatasets) + + cache_dir = pathlib.Path(tmpdir) / 'load_last_cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + # check that load_last_manifest in a new cache loads the + # latest manifest without emitting a warning + with pytest.warns(None) as warnings: + cache.load_last_manifest() + ct = 0 + for w in warnings.list: + if w._category_name == 'OutdatedManifestWarning': + ct += 1 + assert ct == 0 + assert cache.current_manifest == 'project-x_manifest_v15.0.0.json' + + cache.load_manifest('project-x_manifest_v7.0.0.json') + + del cache + + # check that load_last_manifest on an old cache emits the + # expected warning and loads the correct manifest + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + expected = 'A more up to date version of the ' + expected += 'dataset -- project-x_manifest_v15.0.0.json ' + expected += '-- exists online' + with pytest.warns(OutdatedManifestWarning, + match=expected) as warnings: + cache.load_last_manifest() + + assert cache.current_manifest == 'project-x_manifest_v7.0.0.json' + cache.load_manifest('project-x_manifest_v4.0.0.json') + del cache + + # repeat the above test, making sure the correct manifest is + # loaded again + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + expected = 'A more up to date version of the ' + expected += 'dataset -- project-x_manifest_v15.0.0.json ' + expected += '-- exists online' + with pytest.warns(OutdatedManifestWarning, + match=expected) as warnings: + cache.load_last_manifest() + + assert cache.current_manifest == 'project-x_manifest_v4.0.0.json' + + +@mock_s3 +def test_corrupted_load_last_manifest(tmpdir, + example_datasets_with_metadata): + """ + Test that load_last_manifest works when the record of the last + manifest has been corrupted + """ + bucket_name = 'load_lst_manifest_bucket' + metadatasets = example_datasets_with_metadata['metadata'] + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=metadatasets) + + cache_dir = pathlib.Path(tmpdir) / 'load_last_cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + cache.load_manifest('project-x_manifest_v9.0.0.json') + fname = cache._manifest_last_used.resolve() + del cache + with open(fname, 'w') as out_file: + out_file.write('babababa') + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + expected = 'Loading latest version -- project-x_manifest_v15.0.0.json' + with pytest.warns(UserWarning, match=expected): + cache.load_last_manifest() + assert cache.current_manifest == 'project-x_manifest_v15.0.0.json' diff --git a/test/api/cloud_cache/test_change_log.py b/test/api/cloud_cache/test_change_log.py new file mode 100644 index 0000000000..91adf1ce45 --- /dev/null +++ b/test/api/cloud_cache/test_change_log.py @@ -0,0 +1,181 @@ +import pathlib +from moto import mock_s3 +from .utils import create_bucket +from allensdk.api.cloud_cache.cloud_cache import S3CloudCache + + +@mock_s3 +def test_summarize_comparison(tmpdir, example_datasets_with_metadata): + """ + Test that CloudCacheBase.summarize_comparison reports the correct + changes when comparing two manifests + """ + bucket_name = 'summarizing_bucket' + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=example_datasets_with_metadata['metadata']) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v2.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 1 + assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v3.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 1 + assert ('data/f2.txt', + 'data/f2.txt renamed data/f4.txt') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v4.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 1 + assert ('data/f3.txt', 'data/f3.txt changed') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v5.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 1 + assert ('data/f4.txt', 'data/f4.txt created') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v6.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 2 + assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] + assert ('data/f1.txt', 'data/f1.txt changed') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v7.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 2 + assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] + assert ('data/f3.txt', 'data/f3.txt ' + 'renamed data/f5.txt') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v8.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 2 + assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] + assert ('data/f5.txt', 'data/f5.txt created') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v9.0.0.json') + + assert len(log['metadata_changes']) == 0 + assert len(log['data_changes']) == 2 + assert ('data/f3.txt', 'data/f3.txt renamed ' + 'data/f4.txt') in log['data_changes'] + assert ('data/f5.txt', 'data/f5.txt created') in log['data_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v10.0.0.json') + + assert len(log['data_changes']) == 0 + assert len(log['metadata_changes']) == 1 + assert ('project_metadata/metadata_2.csv', + 'project_metadata/metadata_2.csv ' + 'deleted') in log['metadata_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v11.0.0.json') + + assert len(log['data_changes']) == 0 + assert len(log['metadata_changes']) == 1 + assert ('project_metadata/metadata_2.csv', + 'project_metadata/metadata_2.csv renamed ' + 'project_metadata/metadata_4.csv') in log['metadata_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v12.0.0.json') + + assert len(log['data_changes']) == 0 + assert len(log['metadata_changes']) == 1 + assert ('project_metadata/metadata_3.csv', + 'project_metadata/metadata_3.csv ' + 'changed') in log['metadata_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v13.0.0.json') + + assert len(log['data_changes']) == 0 + assert len(log['metadata_changes']) == 1 + assert ('project_metadata/metadata_4.csv', + 'project_metadata/metadata_4.csv ' + 'created') in log['metadata_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v14.0.0.json') + assert len(log['data_changes']) == 1 + assert len(log['metadata_changes']) == 1 + assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] + assert ('project_metadata/metadata_3.csv', + 'project_metadata/metadata_3.csv renamed ' + 'project_metadata/metadata_4.csv') in log['metadata_changes'] + + log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v15.0.0.json') + assert len(log['data_changes']) == 3 + assert len(log['metadata_changes']) == 3 + + ans1 = ('data/f1.txt', 'data/f1.txt renamed data/f4.txt') + ans2 = ('data/f5.txt', 'data/f5.txt created') + ans3 = ('data/f6.txt', 'data/f6.txt created') + + assert set(log['data_changes']) == {ans1, ans2, ans3} + + ans1 = ('project_metadata/metadata_2.csv', + 'project_metadata/metadata_2.csv renamed ' + 'project_metadata/metadata_4.csv') + ans2 = ('project_metadata/metadata_1.csv', + 'project_metadata/metadata_1.csv deleted') + ans3 = ('project_metadata/metadata_3.csv', + 'project_metadata/metadata_3.csv deleted') + + assert set(log['metadata_changes']) == {ans1, ans2, ans3} + + +@mock_s3 +@mock_s3 +def test_compare_manifesst_string(tmpdir, example_datasets_with_metadata): + """ + Test that CloudCacheBase.compare_manifests reports the correct + changes when comparing two manifests + """ + bucket_name = 'compare_manifest_bucket' + create_bucket(bucket_name, + example_datasets_with_metadata['data'], + metadatasets=example_datasets_with_metadata['metadata']) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + msg = cache.compare_manifests('project-x_manifest_v1.0.0.json', + 'project-x_manifest_v15.0.0.json') + + expected = 'Changes going from\n' + expected += 'project-x_manifest_v1.0.0.json\n' + expected += 'to\n' + expected += 'project-x_manifest_v15.0.0.json\n\n' + expected += 'project_metadata/metadata_1.csv deleted\n' + expected += 'project_metadata/metadata_2.csv renamed ' + expected += 'project_metadata/metadata_4.csv\n' + expected += 'project_metadata/metadata_3.csv deleted\n' + expected += 'data/f1.txt renamed data/f4.txt\n' + expected += 'data/f5.txt created\n' + expected += 'data/f6.txt created\n' + + assert msg == expected diff --git a/test/api/cloud_cache/test_file_attributes.py b/test/api/cloud_cache/test_file_attributes.py new file mode 100644 index 0000000000..f3af08221f --- /dev/null +++ b/test/api/cloud_cache/test_file_attributes.py @@ -0,0 +1,73 @@ +import platform +import pytest +import pathlib +from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 + + +def test_cache_file_attributes(): + attr = CacheFileAttributes(url='http://my/url', + version_id='aaabbb', + file_hash='12345', + local_path=pathlib.Path('/my/local/path')) + + assert attr.url == 'http://my/url' + assert attr.version_id == 'aaabbb' + assert attr.file_hash == '12345' + assert attr.local_path == pathlib.Path('/my/local/path') + + # test that the correct ValueErrors are raised + # when you pass invalid arguments + + with pytest.raises(ValueError) as context: + attr = CacheFileAttributes(url=5.0, + version_id='aaabbb', + file_hash='12345', + local_path=pathlib.Path('/my/local/path')) + + msg = "url must be str; got <class 'float'>" + assert context.value.args[0] == msg + + with pytest.raises(ValueError) as context: + attr = CacheFileAttributes(url='http://my/url/', + version_id=5.0, + file_hash='12345', + local_path=pathlib.Path('/my/local/path')) + + msg = "version_id must be str; got <class 'float'>" + assert context.value.args[0] == msg + + with pytest.raises(ValueError) as context: + attr = CacheFileAttributes(url='http://my/url/', + version_id='aaabbb', + file_hash=5.0, + local_path=pathlib.Path('/my/local/path')) + + msg = "file_hash must be str; got <class 'float'>" + assert context.value.args[0] == msg + + with pytest.raises(ValueError) as context: + attr = CacheFileAttributes(url='http://my/url/', + version_id='aaabbb', + file_hash='12345', + local_path='/my/local/path') + + msg = "local_path must be pathlib.Path; got <class 'str'>" + assert context.value.args[0] == msg + + +def test_str(): + """ + Test the string representation of CacheFileParameters + """ + attr = CacheFileAttributes(url='http://my/url', + version_id='aaabbb', + file_hash='12345', + local_path=pathlib.Path('/my/local/path')) + + s = f'{attr}' + assert "CacheFileParameters{" in s + assert '"file_hash": "12345"' in s + assert '"url": "http://my/url"' in s + assert '"version_id": "aaabbb"' in s + if platform.system().lower() != 'windows': + assert '"local_path": "/my/local/path"' in s diff --git a/test/api/cloud_cache/test_full_process.py b/test/api/cloud_cache/test_full_process.py new file mode 100644 index 0000000000..8f8be62f2d --- /dev/null +++ b/test/api/cloud_cache/test_full_process.py @@ -0,0 +1,261 @@ +import pytest +import json +import pathlib +import hashlib +import pandas as pd +import io +import boto3 +from moto import mock_s3 +from allensdk.api.cloud_cache.cloud_cache import S3CloudCache + + +@mock_s3 +def test_full_cache_system(tmpdir): + """ + Test the process of loading different versions of the same dataset, + each of which involve different versions of files + """ + + test_bucket_name = 'full_cache_bucket' + + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # turn on bucket versioning + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + s3_client = boto3.client('s3', region_name='us-east-1') + + # generate data and expected hashes + + true_hashes = {} + version_id_lookup = {} + + data1_v1 = b'12345678' + data1_v2 = b'45678901' + data2_v1 = b'abcdefghijk' + data2_v2 = b'lmnopqrstuv' + data3_v1 = b'jklmnopqrst' + + metadata1_v1 = pd.DataFrame({'mouse': [1, 2, 3], + 'sex': ['F', 'F', 'M']}) + + metadata2_v1 = pd.DataFrame({'experiment': [5, 6, 7], + 'file_id': ['data1', 'data2', 'data3']}) + + metadata1_v2 = pd.DataFrame({'mouse': [8, 9, 0], + 'sex': ['M', 'F', 'M']}) + + v1_hashes = {} + for data, key in zip((data1_v1, data2_v1, data3_v1), + ('data1', 'data2', 'data3')): + + hasher = hashlib.blake2b() + hasher.update(data) + v1_hashes[key] = hasher.hexdigest() + s3_client.put_object(Bucket=test_bucket_name, + Key=f'proj/data/{key}', + Body=data) + + for df, key in zip((metadata1_v1, metadata2_v1), + ('proj/metadata1.csv', 'proj/metadata2.csv')): + + with io.StringIO() as stream: + df.to_csv(stream, index=False) + stream.seek(0) + data = bytes(stream.read(), 'utf-8') + + hasher = hashlib.blake2b() + hasher.update(data) + v1_hashes[key.replace('proj/', '')] = hasher.hexdigest() + s3_client.put_object(Bucket=test_bucket_name, + Key=key, + Body=data) + + true_hashes['v1'] = v1_hashes + v1_version_id = {} + response = s3_client.list_object_versions(Bucket=test_bucket_name) + for v in response['Versions']: + vkey = v['Key'].replace('proj/', '').replace('data/', '') + v1_version_id[vkey] = v['VersionId'] + + version_id_lookup['v1'] = v1_version_id + + v2_hashes = {} + v2_version_id = {} + for data, key in zip((data1_v2, data2_v2), + ('data1', 'data2')): + + hasher = hashlib.blake2b() + hasher.update(data) + v2_hashes[key] = hasher.hexdigest() + s3_client.put_object(Bucket=test_bucket_name, + Key=f'proj/data/{key}', + Body=data) + + s3_client.delete_object(Bucket=test_bucket_name, + Key='proj/data/data3') + + with io.StringIO() as stream: + metadata1_v2.to_csv(stream, index=False) + stream.seek(0) + data = bytes(stream.read(), 'utf-8') + + hasher = hashlib.blake2b() + hasher.update(data) + v2_hashes['metadata1.csv'] = hasher.hexdigest() + s3_client.put_object(Bucket=test_bucket_name, + Key='proj/metadata1.csv', + Body=data) + + s3_client.delete_object(Bucket=test_bucket_name, + Key='proj/metadata2.csv') + + true_hashes['v2'] = v2_hashes + v2_version_id = {} + response = s3_client.list_object_versions(Bucket=test_bucket_name) + for v in response['Versions']: + if not v['IsLatest']: + continue + vkey = v['Key'].replace('proj/', '').replace('data/', '') + v2_version_id[vkey] = v['VersionId'] + version_id_lookup['v2'] = v2_version_id + + # check thata data3 and metadata2.csv do not occur in v2 of + # the dataset, but other data/metadata files do + + assert 'data3' in version_id_lookup['v1'] + assert 'data3' not in version_id_lookup['v2'] + assert 'data1' in version_id_lookup['v1'] + assert 'data2' in version_id_lookup['v1'] + assert 'data1' in version_id_lookup['v2'] + assert 'data2' in version_id_lookup['v2'] + assert 'metadata1.csv' in version_id_lookup['v1'] + assert 'metadata2.csv' in version_id_lookup['v1'] + assert 'metadata1.csv' in version_id_lookup['v2'] + assert 'metadata2.csv' not in version_id_lookup['v2'] + + # build manifests + + manifest_1 = {} + manifest_1['manifest_version'] = 'A' + manifest_1['project_name'] = "project-A1" + manifest_1['metadata_file_id_column_name'] = 'file_id' + manifest_1['data_pipeline'] = 'placeholder' + data_files_1 = {} + for k in ('data1', 'data2', 'data3'): + obj = {} + obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/data/{k}' # noqa: E501 + obj['file_hash'] = true_hashes['v1'][k] + obj['version_id'] = version_id_lookup['v1'][k] + data_files_1[k] = obj + manifest_1['data_files'] = data_files_1 + metadata_files_1 = {} + for k in ('metadata1.csv', 'metadata2.csv'): + obj = {} + obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/{k}' + obj['file_hash'] = true_hashes['v1'][k] + obj['version_id'] = version_id_lookup['v1'][k] + metadata_files_1[k] = obj + manifest_1['metadata_files'] = metadata_files_1 + + manifest_2 = {} + manifest_2['manifest_version'] = 'B' + manifest_2['project_name'] = "project-B2" + manifest_2['metadata_file_id_column_name'] = 'file_id' + manifest_2['data_pipeline'] = 'placeholder' + data_files_2 = {} + for k in ('data1', 'data2'): + obj = {} + obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/data/{k}' # noqa: E501 + obj['file_hash'] = true_hashes['v2'][k] + obj['version_id'] = version_id_lookup['v2'][k] + data_files_2[k] = obj + manifest_2['data_files'] = data_files_2 + metadata_files_2 = {} + for k in ['metadata1.csv']: + obj = {} + obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/{k}' + obj['file_hash'] = true_hashes['v2'][k] + obj['version_id'] = version_id_lookup['v2'][k] + metadata_files_2[k] = obj + manifest_2['metadata_files'] = metadata_files_2 + + s3_client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v1.0.0.json', + Body=bytes(json.dumps(manifest_1), 'utf-8')) + + s3_client.put_object(Bucket=test_bucket_name, + Key='proj/manifests/manifest_v2.0.0.json', + Body=bytes(json.dumps(manifest_2), 'utf-8')) + + # Use S3CloudCache to interact with dataset + cache_dir = pathlib.Path(tmpdir) / 'my/test/cache' + cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') + + # load the first version of the dataset + + cache.load_manifest('manifest_v1.0.0.json') + assert cache.version == 'A' + + # check that metadata dataframes have expected contents + m1 = cache.get_metadata('metadata1.csv') + assert metadata1_v1.equals(m1) + m2 = cache.get_metadata('metadata2.csv') + assert metadata2_v1.equals(m2) + + # check that data files have expected hashes + for k in ('data1', 'data2', 'data3'): + + attr = cache.data_path(k) + assert not attr['exists'] + + local_path = cache.download_data(k) + assert local_path.exists() + hasher = hashlib.blake2b() + with open(local_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_hashes['v1'][k] + + attr = cache.data_path(k) + assert attr['exists'] + + # now load the second version of the dataset + + cache.load_manifest('manifest_v2.0.0.json') + assert cache.version == 'B' + + # metadata2.csv should not exist in this version of the dataset + with pytest.raises(ValueError) as context: + cache.get_metadata('metadata2.csv') + assert 'is not in self.metadata_file_names' in context.value.args[0] + + # check that metadata1 has expected contents + m1 = cache.get_metadata('metadata1.csv') + assert metadata1_v2.equals(m1) + + # data3 should not exist in this version of the dataset + with pytest.raises(ValueError) as context: + _ = cache.download_data('data3') + assert 'not a data file listed' in context.value.args[0] + + with pytest.raises(ValueError) as context: + _ = cache.data_path('data3') + assert 'not a data file listed' in context.value.args[0] + + # check that data1, data2 have expected hashes + for k in ('data1', 'data2'): + attr = cache.data_path(k) + assert not attr['exists'] + + local_path = cache.download_data(k) + assert local_path.exists() + hasher = hashlib.blake2b() + with open(local_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_hashes['v2'][k] + + attr = cache.data_path(k) + assert attr['exists'] diff --git a/test/api/cloud_cache/test_local_cache.py b/test/api/cloud_cache/test_local_cache.py new file mode 100644 index 0000000000..211c5c4641 --- /dev/null +++ b/test/api/cloud_cache/test_local_cache.py @@ -0,0 +1,50 @@ +import pathlib +from moto import mock_s3 +from .utils import create_bucket +from allensdk.api.cloud_cache.cloud_cache import S3CloudCache +from allensdk.api.cloud_cache.cloud_cache import LocalCache + + +@mock_s3 +def test_local_cache_file_access(tmpdir, example_datasets): + """ + Create a cache; download some, but not all of the files + with S3CloudCache; verify that we can access the files + with LocalCache + """ + + bucket_name = 'local_cache_bucket' + create_bucket(bucket_name, example_datasets) + cache_dir = pathlib.Path(tmpdir) / 'cache' + cloud_cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + cloud_cache.load_manifest('project-x_manifest_v1.0.0.json') + cloud_cache.download_data('1') + cloud_cache.download_data('3') + + cloud_cache.load_manifest('project-x_manifest_v3.0.0.json') + cloud_cache.download_data('2') + + del cloud_cache + + local_cache = LocalCache(cache_dir, 'project-x') + + manifest_set = set(local_cache.manifest_file_names) + assert manifest_set == {'project-x_manifest_v1.0.0.json', + 'project-x_manifest_v3.0.0.json'} + + local_cache.load_manifest('project-x_manifest_v1.0.0.json') + attr = local_cache.data_path('1') + assert attr['exists'] + attr = local_cache.data_path('2') + assert not attr['exists'] + attr = local_cache.data_path('3') + assert attr['exists'] + + local_cache.load_manifest('project-x_manifest_v3.0.0.json') + attr = local_cache.data_path('1') + assert attr['exists'] # because file 1 is the same in v1.0 and v3.0 + attr = local_cache.data_path('2') + assert attr['exists'] + attr = local_cache.data_path('3') + assert not attr['exists'] diff --git a/test/api/cloud_cache/test_manifest.py b/test/api/cloud_cache/test_manifest.py new file mode 100644 index 0000000000..b7f44a97d5 --- /dev/null +++ b/test/api/cloud_cache/test_manifest.py @@ -0,0 +1,173 @@ +import pytest +import json +import pathlib +from allensdk.internal.core.lims_utilities import safe_system_path +from allensdk.api.cloud_cache.manifest import Manifest +from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 + + +@pytest.fixture +def meta_json_path(tmpdir): + jpath = tmpdir / "somejson.json" + d = { + "project_name": "X", + "manifest_version": "Y", + "metadata_file_id_column_name": "Z", + "data_pipeline": "ZA", + "metadata_files": ["ZB", "ZC", "ZD"], + "data_files": {"AB": "ab", "BC": "bc", "CD": "cd"}} + with open(jpath, "w") as f: + json.dump(d, f) + yield jpath + + +def test_constructor(meta_json_path): + """ + Make sure that the Manifest class __init__ runs and + raises an error if you give it an unexpected cache_dir + """ + Manifest('my/cache/dir', meta_json_path) + Manifest(pathlib.Path('my/other/cache/dir'), meta_json_path) + with pytest.raises(ValueError, match=r"cache_dir must be either a str.*"): + Manifest(1234.2, meta_json_path) + + +def test_create_file_attributes(meta_json_path): + """ + Test that Manifest._create_file_attributes correctly + handles input parameters (this is mostly a test of + local_path generation) + """ + mfest = Manifest('/my/cache/dir', meta_json_path) + attr = mfest._create_file_attributes('http://my.url.com/path/to/file.txt', + '12345', + 'aaabbbcccddd') + + assert isinstance(attr, CacheFileAttributes) + assert attr.url == 'http://my.url.com/path/to/file.txt' + assert attr.version_id == '12345' + assert attr.file_hash == 'aaabbbcccddd' + expected_path = '/my/cache/dir/X-Y/to/file.txt' + assert attr.local_path == pathlib.Path(expected_path).resolve() + + +@pytest.fixture +def manifest_for_metadata(tmpdir): + jpath = tmpdir / "a_manifest.json" + manifest = {} + metadata_files = {} + metadata_files['a.txt'] = {'url': 'http://my.url.com/path/to/a.txt', + 'version_id': '12345', + 'file_hash': 'abcde'} + metadata_files['b.txt'] = {'url': 'http://my.other.url.com/different/path/to/b.txt', # noqa: E501 + 'version_id': '67890', + 'file_hash': 'fghijk'} + + manifest['metadata_files'] = metadata_files + manifest['data_files'] = {} + manifest['project_name'] = "some-project" + manifest['manifest_version'] = '000' + manifest['metadata_file_id_column_name'] = 'file_id' + manifest['data_pipeline'] = 'placeholder' + with open(jpath, "w") as f: + json.dump(manifest, f) + yield jpath + + +def test_metadata_file_attributes(manifest_for_metadata): + """ + Test that Manifest.metadata_file_attributes returns the + correct CacheFileAttributes object and raises the correct + error when you ask for a metadata file that does not exist + """ + + mfest = Manifest('/my/cache/dir/', manifest_for_metadata) + + a_obj = mfest.metadata_file_attributes('a.txt') + assert a_obj.url == 'http://my.url.com/path/to/a.txt' + assert a_obj.version_id == '12345' + assert a_obj.file_hash == 'abcde' + expected = safe_system_path('/my/cache/dir/some-project-000/to/a.txt') + expected = pathlib.Path(expected).resolve() + assert a_obj.local_path == expected + + b_obj = mfest.metadata_file_attributes('b.txt') + assert b_obj.url == 'http://my.other.url.com/different/path/to/b.txt' + assert b_obj.version_id == '67890' + assert b_obj.file_hash == 'fghijk' + expected = safe_system_path('/my/cache/dir/some-project-000/path/to/b.txt') + expected = pathlib.Path(expected).resolve() + assert b_obj.local_path == expected + + # test that the correct error is raised when you ask + # for a metadata file that does not exist + + with pytest.raises(ValueError) as context: + _ = mfest.metadata_file_attributes('c.txt') + msg = "c.txt\nis not in self.metadata_file_names" + assert msg in context.value.args[0] + + +@pytest.fixture +def manifest_with_data(tmpdir): + jpath = tmpdir / "manifest_with files.json" + manifest = {} + manifest['metadata_files'] = {} + manifest['manifest_version'] = '0' + manifest['project_name'] = "myproject" + manifest['metadata_file_id_column_name'] = 'file_id' + manifest['data_pipeline'] = 'placeholder' + data_files = {} + data_files['a'] = {'url': 'http://my.url.com/myproject/path/to/a.nwb', + 'version_id': '12345', + 'file_hash': 'abcde'} + data_files['b'] = {'url': 'http://my.other.url.com/different/path/b.nwb', + 'version_id': '67890', + 'file_hash': 'fghijk'} + manifest['data_files'] = data_files + with open(jpath, "w") as f: + json.dump(manifest, f) + yield jpath + + +def test_data_file_attributes(manifest_with_data): + """ + Test that Manifest.data_file_attributes returns the correct + CacheFileAttributes object and raises the correct error when + you ask for a data file that does not exist + """ + mfest = Manifest('/my/cache/dir', manifest_with_data) + + a_obj = mfest.data_file_attributes('a') + assert a_obj.url == 'http://my.url.com/myproject/path/to/a.nwb' + assert a_obj.version_id == '12345' + assert a_obj.file_hash == 'abcde' + expected = safe_system_path('/my/cache/dir/myproject-0/path/to/a.nwb') + assert a_obj.local_path == pathlib.Path(expected).resolve() + + b_obj = mfest.data_file_attributes('b') + assert b_obj.url == 'http://my.other.url.com/different/path/b.nwb' + assert b_obj.version_id == '67890' + assert b_obj.file_hash == 'fghijk' + expected = safe_system_path('/my/cache/dir/myproject-0/path/b.nwb') + assert b_obj.local_path == pathlib.Path(expected).resolve() + + with pytest.raises(ValueError) as context: + _ = mfest.data_file_attributes('c') + msg = "file_id: c\nIs not a data file listed in manifest:" + assert msg in context.value.args[0] + + +def test_file_attribute_errors(meta_json_path): + """ + Test that Manifest raises the correct error if you try to get file + attributes before loading a manifest.json + """ + mfest = Manifest("/my/cache/dir", meta_json_path) + with pytest.raises(ValueError, + match=r".* not in self.metadata_file_names"): + mfest.metadata_file_attributes('some_file.txt') + + with pytest.raises(ValueError, + match=r".* not a data file listed in manifest"): + mfest.data_file_attributes('other_file.txt') diff --git a/test/api/cloud_cache/test_smart_download.py b/test/api/cloud_cache/test_smart_download.py new file mode 100644 index 0000000000..ef6f939eaf --- /dev/null +++ b/test/api/cloud_cache/test_smart_download.py @@ -0,0 +1,523 @@ +import pytest +import json +import hashlib +import pathlib +from moto import mock_s3 +from .utils import create_bucket +from allensdk.api.cloud_cache.cloud_cache import MissingLocalManifestWarning +from allensdk.api.cloud_cache.cloud_cache import S3CloudCache, LocalCache +from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 + + +@mock_s3 +def test_smart_file_downloading(tmpdir, example_datasets): + """ + Test that the CloudCache is smart enough to build symlinks + where possible + """ + test_bucket_name = 'smart_download_bucket' + create_bucket(test_bucket_name, + example_datasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, test_bucket_name, 'project-x') + + # download all data files from all versions, keeping track + # of the paths to the downloaded data files + downloaded = {} + for version in ('1.0.0', '2.0.0', '3.0.0'): + downloaded[version] = {} + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in ('1', '2', '3'): + downloaded[version][file_id] = cache.download_data(file_id) + + # check that the version 1.0.0 of all files are actual files + for file_id in ('1', '2', '3'): + assert downloaded['1.0.0'][file_id].is_file() + assert not downloaded['1.0.0'][file_id].is_symlink() + + # check that v2.0.0 f1.txt is a new file + assert downloaded['2.0.0']['1'].is_file() + assert not downloaded['2.0.0']['1'].is_symlink() + + # check that v2.0.0 f2.txt and f3.txt are symlinks to + # the correct v1.0.0 files + for file_id in ('2', '3'): + assert downloaded['2.0.0'][file_id].is_file() + assert downloaded['2.0.0'][file_id].is_symlink() + + # check that symlink points to the correct file + test = downloaded['2.0.0'][file_id].resolve() + control = downloaded['1.0.0'][file_id].resolve() + if test != control: + test = downloaded['2.0.0'][file_id].resolve() + control = downloaded['1.0.0'][file_id].resolve() + raise RuntimeError(f'{test} != {control}\n' + 'even though the first is a symlink') + + # check that the absolute paths of the files are different, + # even though one is a symlink + test = downloaded['2.0.0'][file_id].absolute() + control = downloaded['1.0.0'][file_id].absolute() + if test == control: + test = downloaded['2.0.0'][file_id].absolute() + control = downloaded['1.0.0'][file_id].absolute() + raise RuntimeError(f'{test} == {control}\n' + 'even though they should be ' + 'different absolute paths') + + # repeat the above tests for v3.0.0, f1.txt + assert downloaded['3.0.0']['1'].is_file() + assert downloaded['3.0.0']['1'].is_symlink() + + res3 = downloaded['3.0.0']['1'].resolve() + res1 = downloaded['1.0.0']['1'].resolve() + if res3 != res1: + test = downloaded['3.0.0']['1'].resolve() + control = downloaded['1.0.0']['1'].resolve() + raise RuntimeError(f'{test} != {control}\n' + 'even though the first is a symlink') + + abs3 = downloaded['3.0.0']['1'].absolute() + abs1 = downloaded['1.0.0']['1'].absolute() + if abs3 == abs1: + test = downloaded['3.0.0']['1'].absolute() + control = downloaded['1.0.0']['1'].absolute() + raise RuntimeError(f'{test} == {control}\n' + 'even though they should be ' + 'different absolute paths') + + # check that v3 v2.txt and f3.txt are not symlinks + assert downloaded['3.0.0']['2'].is_file() + assert not downloaded['3.0.0']['2'].is_symlink() + assert downloaded['3.0.0']['3'].is_file() + assert not downloaded['3.0.0']['3'].is_symlink() + + +@mock_s3 +def test_on_corrupted_files(tmpdir, example_datasets): + """ + Test that the CloudCache re-downloads files when they have been + corrupted + """ + bucket_name = 'corruption_bucket' + create_bucket(bucket_name, + example_datasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + version_list = ('1.0.0', '2.0.0', '3.0.0') + file_id_list = ('1', '2', '3') + + for version in version_list: + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in file_id_list: + cache.download_data(file_id) + + # make sure that all files exist + for version in version_list: + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in file_id_list: + attr = cache.data_path(file_id) + assert attr['exists'] + + hasher = hashlib.blake2b() + hasher.update(b'4567890') + true_hash = hasher.hexdigest() + + # Check that, when a file on disk gets removed, + # all of the symlinks that point back to that file + # get marked as `not exists` + + cache.load_manifest('project-x_manifest_v1.0.0.json') + attr = cache.data_path('2') + attr['local_path'].unlink() + + attr = cache.data_path('2') + assert not attr['exists'] + + # note that v0.2.0/f2.txt is identical to v0.1.0/f2.txt + # in the example data set + cache.load_manifest('project-x_manifest_v2.0.0.json') + attr = cache.data_path('2') + assert not attr['exists'] + + # re-download one of the identical files, and verify + # that both datasets are restored + cache.download_data('2') + attr = cache.data_path('2') + assert attr['exists'] + redownloaded_path = attr['local_path'] + + cache.load_manifest('project-x_manifest_v1.0.0.json') + attr = cache.data_path('2') + assert attr['exists'] + other_path = attr['local_path'] + + hasher = hashlib.blake2b() + with open(other_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_hash + + # The file is downloaded to other_path because that was + # the first path originally downloaded and stored + # in CloudCache._downloaded_data_path + + assert other_path.resolve() == redownloaded_path.resolve() + assert other_path.absolute() != redownloaded_path.absolute() + + +@mock_s3 +def test_on_removed_files(tmpdir, example_datasets): + """ + Test that the CloudCache re-downloads files when the + the files at the root of the symlinks have been removed + """ + bucket_name = 'corruption_bucket' + create_bucket(bucket_name, + example_datasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + version_list = ('1.0.0', '2.0.0', '3.0.0') + file_id_list = ('1', '2', '3') + + for version in version_list: + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in file_id_list: + cache.download_data(file_id) + + # make sure that all files exist + for version in version_list: + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in file_id_list: + attr = cache.data_path(file_id) + assert attr['exists'] + + hasher = hashlib.blake2b() + hasher.update(b'4567890') + true_hash = hasher.hexdigest() + + p1 = cache_dir / 'project-x-1.0.0' / 'data' / 'f2.txt' + p2 = cache_dir / 'project-x-2.0.0' / 'data' / 'f2.txt' + + # note that f2.txt is identical between v 1.0.0 and 2.0.0 + assert p1.is_file() + assert not p1.is_symlink() + assert p2.is_symlink() + assert p1.resolve() == p2.resolve() + + # remove p1 + p1.unlink() + assert not p1.exists() + assert not p1.is_file() + assert not p2.is_file() + assert p2.is_symlink() + + # make sure that the file which has been moved is now + # marked as not existing + cache.load_manifest('project-x_manifest_v1.0.0.json') + test_path = cache.data_path('2') + assert not test_path['exists'] + + cache.load_manifest('project-x_manifest_v2.0.0.json') + test_path = cache.data_path('2') + assert not test_path['exists'] + + # now, re-download the data by way of manifest 2 + # and verify that the symlink relationship is + # re-established + p2 = cache.download_data('2') + assert p2.is_file() + assert p2.is_symlink() # because the symlink was not removed + + cache.load_manifest('project-x_manifest_v1.0.0.json') + p1 = cache.download_data('2') + + assert p1.is_file() + assert not p1.is_symlink() + assert p1.resolve() == p2.resolve() + assert p1.absolute() != p2.absolute() + + hasher = hashlib.blake2b() + with open(p2, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_hash + + +@mock_s3 +def test_on_removed_symlinks(tmpdir, example_datasets): + """ + Test that the CloudCache re-downloads files when the + the symlinks have been removed + """ + bucket_name = 'corruption_bucket' + create_bucket(bucket_name, + example_datasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + version_list = ('1.0.0', '2.0.0', '3.0.0') + file_id_list = ('1', '2', '3') + + for version in version_list: + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in file_id_list: + cache.download_data(file_id) + + # make sure that all files exist + for version in version_list: + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in file_id_list: + attr = cache.data_path(file_id) + assert attr['exists'] + + hasher = hashlib.blake2b() + hasher.update(b'4567890') + true_hash = hasher.hexdigest() + + p1 = cache_dir / 'project-x-1.0.0' / 'data' / 'f2.txt' + p2 = cache_dir / 'project-x-2.0.0' / 'data' / 'f2.txt' + + # note that f2.txt is identical between v 1.0.0 and 2.0.0 + assert p1.is_file() + assert not p1.is_symlink() + assert p2.is_symlink() + assert p1.resolve() == p2.resolve() + + # remove symlink at p2 and show that the file + # still exists (and that the symlink gets restored + # once you ask for the file path) + p2.unlink() + assert not p2.exists() + assert not p2.is_symlink() + assert p1.is_file() + + cache.load_manifest('project-x_manifest_v2.0.0.json') + test_path = cache.data_path('2') + assert test_path['exists'] + p2 = pathlib.Path(test_path['local_path']) + assert p2.is_symlink() + assert p2.exists() + assert p1.absolute() != p2.absolute() + assert p1.resolve() == p2.resolve() + + hasher = hashlib.blake2b() + with open(p2, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == true_hash + + +@mock_s3 +def test_corrupted_download_manifest(tmpdir, example_datasets): + """ + Test that CloudCache can handle the case where the + _downloaded_data_path dict gets corrupted + """ + bucket_name = 'manifest_corruption_bucket' + create_bucket(bucket_name, + example_datasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + cache = S3CloudCache(cache_dir, bucket_name, 'project-x') + + version_list = ('1.0.0', '2.0.0', '3.0.0') + file_id_list = ('1', '2', '3') + + for version in version_list: + cache.load_manifest(f'project-x_manifest_v{version}.json') + for file_id in file_id_list: + cache.download_data(file_id) + + with open(cache._downloaded_data_path, 'rb') as in_file: + src_data = json.load(in_file) + + # write a corrupted downloaded_data_path + for k in src_data: + src_data[k] = '' + with open(cache._downloaded_data_path, 'w') as out_file: + out_file.write(json.dumps(src_data, indent=2)) + + hasher = hashlib.blake2b() + hasher.update(b'4567890') + true_hash = hasher.hexdigest() + + cache.load_manifest('project-x_manifest_v1.0.0.json') + attr = cache.data_path('2') + + # assert below will pass; because file exists and is not yet corrupted, + # CloudCache won't consult _downloaded_data_path + assert attr['exists'] + + # now remove one of the data files + attr['local_path'].unlink() + + # now that the file is corrupted, 'exists' is False + attr = cache.data_path('2') + assert not attr['exists'] + + # note that v0.2.0/f2.txt is identical to v0.1.0/f2.txt + cache.load_manifest('project-x_manifest_v2.0.0.json') + attr = cache.data_path('2') + assert not attr['exists'] + + # re download the file + cache.download_data('2') + attr = cache.data_path('2') + downloaded_path = attr['local_path'] + + assert attr['exists'] + hasher = hashlib.blake2b() + with open(attr['local_path'], 'rb') as in_file: + hasher.update(in_file.read()) + test_hash = hasher.hexdigest() + assert test_hash == true_hash + + # check that the v0.1.0 version of the file, which should be + # identical to the v0.2.0 version of the file, is also + # fixed + cache.load_manifest('project-x_manifest_v1.0.0.json') + attr = cache.data_path('2') + assert attr['exists'] + assert attr['local_path'].resolve() == downloaded_path.resolve() + assert attr['local_path'].absolute() != downloaded_path.absolute() + + +@mock_s3 +def test_reconstruction_of_local_manifest(tmpdir): + """ + Test that, if _downloaded_data.json gets lost, it can be reconstructed + so that the CloudCache does not automatically download new copies of files + """ + + # define a cache class that cannot download from S3 + class DummyCache(S3CloudCache): + def _download_file(self, file_attributes: CacheFileAttributes): + if not self._file_exists(file_attributes): + raise RuntimeError("Cannot download files") + return True + + # first two versions of dataset are identical; + # third differs + example_data = {} + example_data['1.0.0'] = {} + example_data['1.0.0']['f1.txt'] = {'file_id': '1', 'data': b'abc'} + example_data['1.0.0']['f2.txt'] = {'file_id': '2', 'data': b'def'} + + example_data['2.0.0'] = {} + example_data['2.0.0']['f1.txt'] = {'file_id': '1', 'data': b'abc'} + example_data['2.0.0']['f2.txt'] = {'file_id': '2', 'data': b'def'} + + example_data['3.0.0'] = {} + example_data['3.0.0']['f1.txt'] = {'file_id': '1', 'data': b'tuv'} + example_data['3.0.0']['f2.txt'] = {'file_id': '2', 'data': b'wxy'} + + test_bucket_name = 'cache_from_scratch_bucket' + create_bucket(test_bucket_name, + example_data) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + + # read in v1.0.0 data files using normal S3 cache class + with pytest.warns(None) as warnings: + cache = S3CloudCache(cache_dir, test_bucket_name, 'project-x') + + # make sure no MissingLocalManifestWarnings were raised + w_type = 'MissingLocalManifestWarning' + for w in warnings.list: + if w._category_name == w_type: + msg = 'Raised MissingLocalManifestWarning on empty ' + msg += 'cache dir' + assert False, msg + + expected_hash = {} + cache.load_manifest('project-x_manifest_v1.0.0.json') + for file_id in ('1', '2'): + local_path = cache.download_data(file_id) + hasher = hashlib.blake2b() + with open(local_path, 'rb') as in_file: + hasher.update(in_file.read()) + expected_hash[file_id] = hasher.hexdigest() + + # load the other manifests, so DummyCache can get it + cache.load_manifest('project-x_manifest_v2.0.0.json') + cache.load_manifest('project-x_manifest_v3.0.0.json') + + # delete the JSON file that maps local path to file hash + lookup_path = cache._downloaded_data_path + assert lookup_path.exists() + lookup_path.unlink() + assert not lookup_path.exists() + + del cache + + # Reload the data using the cache class that cannot download + # files. Verify that paths to files with the correct hashes + # are returned. This will mean that the local manifest mapping + # filename to file hash was correctly reconstructed. + with pytest.warns(MissingLocalManifestWarning) as warnings: + dummy = DummyCache(cache_dir, test_bucket_name, 'project-x') + + dummy.construct_local_manifest() + + dummy.load_manifest('project-x_manifest_v2.0.0.json') + for file_id in ('1', '2'): + local_path = dummy.download_data(file_id) + hasher = hashlib.blake2b() + with open(local_path, 'rb') as in_file: + hasher.update(in_file.read()) + assert hasher.hexdigest() == expected_hash[file_id] + + # make sure that dummy really is unable to download by trying + # (and failing) to get data from v3.0.0 + dummy.load_manifest('project-x_manifest_v3.0.0.json') + with pytest.raises(RuntimeError): + dummy.download_data('1') + + +@mock_s3 +def test_local_cache_symlink(tmpdir, example_datasets): + """ + Test that a LocalCache is smart enough to construct + a symlink where appropriate + """ + test_bucket_name = 'local_cache_test_bucket' + create_bucket(test_bucket_name, + example_datasets) + + cache_dir = pathlib.Path(tmpdir) / 'cache' + + # create an online cache and download some data + online_cache = S3CloudCache(cache_dir, test_bucket_name, 'project-x') + online_cache.load_manifest('project-x_manifest_v1.0.0.json') + p0 = online_cache.download_data('1') + online_cache.load_manifest('project-x_manifest_v3.0.0.json') + + # path to file we intend to download + # (just making sure it wasn't accidentally created early + # by the online cache) + shld_be = cache_dir / 'project-x-3.0.0/data/f1.txt' + assert not shld_be.exists() + + del online_cache + + # create a local cache pointing to the same cache directory + # an try to access a data file that, while not downloaded, + # is identical to a file that has been downloaded + local_cache = LocalCache(cache_dir, test_bucket_name, 'project-x') + local_cache.load_manifest('project-x_manifest_v3.0.0.json') + attr = local_cache.data_path('1') + assert attr['exists'] + assert attr['local_path'].absolute() == shld_be.absolute() + assert attr['local_path'].is_symlink() + assert attr['local_path'].resolve() == p0.resolve() + + # test that LocalCache does not have access to data that + # has not been downloaded + attr = local_cache.data_path('2') + assert not attr['exists'] + with pytest.raises(NotImplementedError): + local_cache.download_data('2') diff --git a/test/api/cloud_cache/test_static_local_cache.py b/test/api/cloud_cache/test_static_local_cache.py new file mode 100644 index 0000000000..484828f018 --- /dev/null +++ b/test/api/cloud_cache/test_static_local_cache.py @@ -0,0 +1,203 @@ +from pathlib import Path +from typing import Tuple +import json + +import pandas as pd +import pytest + +from allensdk.api.cloud_cache.utils import file_hash_from_path +from allensdk.api.cloud_cache.cloud_cache import StaticLocalCache + + +@pytest.fixture +def mounted_s3_dataset_fixture(tmp_path, request) -> Tuple[Path, str, dict]: + """A fixture which simulates a project s3 bucket that has been mounted + as a local directory. + """ + + # Get fixture parameters + project_name = request.param.get("project_name", "test_project_name_1") + dataset_version = request.param.get("dataset_version", "0.3.0") + metadata_file_id_column_name = request.param.get( + "metadata_file_id_column_name", "file_id" + ) + metadata_files_contents = request.param.get( + "metadata_files_contents", + # Each item in list is a tuple of: + # (metadata_filename, metadata_contents) + [ + ("metadata_1.csv", {"mouse": [1, 2, 3], "sex": ["F", "F", "M"]}), + ( + "metadata_2.csv", + { + "experiment": [4, 5, 6], + metadata_file_id_column_name: ["data1", "data2", "data3"] + } + ) + ] + ) + data_files_contents = request.param.get( + "data_files_contents", + # Each item in list is a tuple of: + # (data_filename, data_contents) + [ + ("data_1.nwb", "123456"), + ("data_2.nwb", "abcdef"), + ("data_3.nwb", "ghijkl") + ] + ) + + # Create mock mounted s3 directory structure + mock_mounted_base_dir = tmp_path / "mounted_remote_data" + mock_mounted_base_dir.mkdir() + mock_project_dir = mock_mounted_base_dir / project_name + mock_project_dir.mkdir() + + # Create metadata files and manifest entries + mock_metadata_dir = mock_project_dir / "project_metadata" + mock_metadata_dir.mkdir() + + manifest_meta_entries = dict() + for meta_fname, meta_contents in metadata_files_contents: + meta_save_path = mock_metadata_dir / meta_fname + df_to_save = pd.DataFrame(meta_contents) + df_to_save.to_csv(str(meta_save_path), index=False) + + manifest_meta_entries[meta_fname.rstrip(".csv")] = { + "url": ( + f"http://{project_name}.s3.amazonaws.com/{project_name}" + f"/project_metadata/{meta_fname}" + ), + "version_id": "test_placeholder", + "file_hash": file_hash_from_path(meta_save_path) + } + + # Create data files and manifest entries + mock_data_dir = mock_project_dir / "project_data" + mock_data_dir.mkdir() + + manifest_data_entries = dict() + for file_fname, file_contents in data_files_contents: + file_save_path = mock_data_dir / file_fname + with file_save_path.open('w') as f: + f.write(file_contents) + + manifest_data_entries[file_fname.rstrip(".nwb")] = { + "url": ( + f"http://{project_name}.s3.amazonaws.com/{project_name}" + f"/project_data/{file_fname}" + ), + "version_id": "test_placeholder", + "file_hash": file_hash_from_path(file_save_path) + } + + # Create manifest dir and manifest + mock_manifests_dir = mock_project_dir / "manifests" + mock_manifests_dir.mkdir() + manifest_fname = f"test_manifest_v{dataset_version}.json" + manifest_path = mock_manifests_dir / manifest_fname + + manifest_contents = { + "project_name": project_name, + "manifest_version": dataset_version, + "data_pipeline": [ + { + "name": "AllenSDK", + "version": "2.11.0", + "comment": "This is a test entry. NOT REAL." + } + ], + "metadata_file_id_column_name": metadata_file_id_column_name, + "metadata_files": manifest_meta_entries, + "data_files": manifest_data_entries + } + + with manifest_path.open('w') as f: + json.dump(manifest_contents, f, indent=4) + + expected = { + "expected_metadata": metadata_files_contents, + "expected_data": data_files_contents + } + + return mock_mounted_base_dir, project_name, expected + + +@pytest.mark.parametrize( + "mounted_s3_dataset_fixture", + [ + {"project_name": "visual-behavior-ophys"} + ], + indirect=["mounted_s3_dataset_fixture"] +) +def test_static_local_cache_access(mounted_s3_dataset_fixture): + local_static_cache_dir, proj_name, expected = mounted_s3_dataset_fixture + + cache = StaticLocalCache(local_static_cache_dir, proj_name) + cache.load_last_manifest() + + for exp_meta_fname, exp_meta_contents in expected["expected_metadata"]: + exp_df = pd.DataFrame(exp_meta_contents) + obt_df_path = cache.metadata_path(exp_meta_fname.rstrip(".csv")) + obt_df = pd.read_csv(obt_df_path["local_path"]) + pd.testing.assert_frame_equal(exp_df, obt_df) + + for exp_data_fname, exp_data_contents in expected["expected_data"]: + obt_data_path = cache.data_path(exp_data_fname.rstrip(".nwb")) + with open(obt_data_path["local_path"], "r") as f: + obt_data = f.read() + assert exp_data_contents == obt_data + + +@pytest.mark.parametrize( + "num_manifests, project_name, create_project_folders, expected", + [ + ( + 2, + "test_project", + True, + ['test_project_manifest_v0.1.0.json'] + ), + ( + 4, + "test_project_2", + True, + ['test_project_2_manifest_v0.3.0.json'] + ), + # This test case is expected to raise a RuntimeError + ( + None, # Not applicable + "test_project_2", + False, + None # Not applicable + ) + ] +) +def test_static_local_cache_list_all_manifests( + tmp_path, num_manifests, project_name, create_project_folders, expected +): + cache_dir = tmp_path / "cache_dir" + cache_dir.mkdir() + + if create_project_folders: + project_dir = cache_dir / project_name + project_dir.mkdir() + + manifests_dir = project_dir / "manifests" + manifests_dir.mkdir() + + for n in range(num_manifests): + manifest_path = ( + manifests_dir / f"{project_name}_manifest_v0.{n}.0.json" + ) + manifest_path.touch() + + cache = StaticLocalCache(cache_dir, project_name) + + assert cache._manifest_file_names == expected + + else: + with pytest.raises( + RuntimeError, match="Expected the provided cache_dir" + ): + _ = StaticLocalCache(cache_dir, project_name) diff --git a/test/api/cloud_cache/test_utils.py b/test/api/cloud_cache/test_utils.py new file mode 100644 index 0000000000..e0a6f86086 --- /dev/null +++ b/test/api/cloud_cache/test_utils.py @@ -0,0 +1,53 @@ +import pytest +import hashlib +import numpy as np +import allensdk.api.cloud_cache.utils as utils + + +def test_bucket_name_from_url(): + + url = 'https://dummy_bucket.s3.amazonaws.com/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 + bucket_name = utils.bucket_name_from_url(url) + assert bucket_name == "dummy_bucket" + + url = 'https://dummy_bucket2.s3-us-west-3.amazonaws.com/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 + bucket_name = utils.bucket_name_from_url(url) + assert bucket_name == "dummy_bucket2" + + url = 'https://dummy_bucket/txt_file.txt?versionId="jklaafdaerew"' + with pytest.warns(UserWarning): + bucket_name = utils.bucket_name_from_url(url) + assert bucket_name is None + + # make sure we are actualy detecting '.' in .amazonaws.com + url = 'https://dummy_bucket2.s3-us-west-3XamazonawsYcom/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 + with pytest.warns(UserWarning): + bucket_name = utils.bucket_name_from_url(url) + assert bucket_name is None + + +def test_relative_path_from_url(): + url = 'https://dummy_bucket.s3.amazonaws.com/my/dir/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 + relative_path = utils.relative_path_from_url(url) + assert relative_path == 'my/dir/txt_file.txt' + + +def test_file_hash_from_path(tmpdir): + + rng = np.random.RandomState(881) + alphabet = list('abcdefghijklmnopqrstuvwxyz') + fname = tmpdir / 'hash_dummy.txt' + with open(fname, 'w') as out_file: + for ii in range(10): + out_file.write(''.join(rng.choice(alphabet, size=10))) + out_file.write('\n') + + hasher = hashlib.blake2b() + with open(fname, 'rb') as in_file: + chunk = in_file.read(7) + while len(chunk) > 0: + hasher.update(chunk) + chunk = in_file.read(7) + + ans = utils.file_hash_from_path(fname) + assert ans == hasher.hexdigest() diff --git a/test/api/cloud_cache/test_windows_isilon_paths.py b/test/api/cloud_cache/test_windows_isilon_paths.py new file mode 100644 index 0000000000..ac656a0520 --- /dev/null +++ b/test/api/cloud_cache/test_windows_isilon_paths.py @@ -0,0 +1,70 @@ +import re +import json +from pathlib import Path + +from allensdk.api.cloud_cache.cloud_cache import CloudCacheBase +from allensdk.api.cloud_cache.manifest import Manifest + + +def test_windows_path_to_isilon(monkeypatch, tmpdir): + """ + This test is just meant to verify on Windows CI instances + that, if a path to the `/allen/` shared file store is used as + cache_dir, the path to files will come out useful (i.e. without any + spurious C:/ prepended as in AllenSDK issue #1964 + """ + + cache_dir = Path(tmpdir) + + manifest_1 = {'manifest_version': '1', + 'metadata_file_id_column_name': 'file_id', + 'data_pipeline': 'placeholder', + 'project_name': 'my-project', + 'metadata_files': {'a.csv': {'url': 'http://www.junk.com/path/to/a.csv', # noqa: E501 + 'version_id': '1111', + 'file_hash': 'abcde'}, + 'b.csv': {'url': 'http://silly.com/path/to/b.csv', # noqa: E501 + 'version_id': '2222', + 'file_hash': 'fghijk'}}, + 'data_files': {'data_1': {'url': 'http://www.junk.com/data/path/data.csv', # noqa: E501 + 'version_id': '1111', + 'file_hash': 'lmnopqrst'}} + } + manifest_path = tmpdir / "manifest.json" + with open(manifest_path, "w") as f: + json.dump(manifest_1, f) + + def dummy_file_exists(self, m): + return True + + # we do not want paths to `/allen` to be resolved to + # a local drive on the user's machine + bad_windows_pattern = re.compile('^[A-Z]\:') # noqa: W605 + + # make sure pattern is correctly formulated + m = bad_windows_pattern.search('C:\\a\windows\path') # noqa: W605 + assert m is not None + + with monkeypatch.context() as ctx: + class TestCloudCache(CloudCacheBase): + + def _download_file(self, m, o): + pass + + def _download_manifest(self, m, o): + pass + + def _list_all_manifests(self): + pass + + ctx.setattr(TestCloudCache, + '_file_exists', + dummy_file_exists) + + cache = TestCloudCache(cache_dir, 'proj') + cache._manifest = Manifest(cache_dir, json_input=manifest_path) + + m_path = cache.metadata_path('a.csv') + assert bad_windows_pattern.match(str(m_path)) is None + d_path = cache.data_path('data_1') + assert bad_windows_pattern.match(str(d_path)) is None diff --git a/test/api/cloud_cache/utils.py b/test/api/cloud_cache/utils.py new file mode 100644 index 0000000000..f58524bbab --- /dev/null +++ b/test/api/cloud_cache/utils.py @@ -0,0 +1,148 @@ +from typing import Union, Optional +import boto3 +import json +import hashlib + + +def load_dataset(data_blobs: dict, + metadata_blobs: Union[dict, None], + manifest_version: str, + bucket_name: str, + client: boto3.client) -> None: + """ + Load a test dataset into moto's mocked S3 + + Parameters + ---------- + data_blobs: dict + Maps filename to a dict + 'data': the bytes in the data file + 'file_id': the file_id of the data file + + metadata_blobs: Union[dict, None] + A dict mapping metadata filename to bytes in the file + + manifest_version: str + The version of the manifest (manifest will be + uploaded to moto3 as manifest_{manifest_version}.json) + + bucket_name: str + + client: boto3.client + + Returns + ------- + None + Uploads the provided data, generates the manifest, + and uploads the manifest to moto3 + """ + + project_name = 'project-x' + + for fname in data_blobs: + client.put_object(Bucket=bucket_name, + Key=f'project-x/data/{fname}', + Body=data_blobs[fname]['data']) + + if metadata_blobs is not None: + for fname in metadata_blobs: + client.put_object(Bucket=bucket_name, + Key=f'project-x/project_metadata/{fname}', + Body=metadata_blobs[fname]) + + response = client.list_object_versions(Bucket=bucket_name) + fname_to_version = {} + for obj in response['Versions']: + if obj['IsLatest']: + fname = obj['Key'].split('/')[-1] + fname_to_version[fname] = obj['VersionId'] + + manifest = {} + manifest['manifest_version'] = manifest_version + manifest['project_name'] = project_name + manifest['metadata_file_id_column_name'] = 'file_id' + manifest['metadata_files'] = {} + manifest['data_pipeline'] = 'placeholder' + + data_file_dict = {} + url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/data' + for fname in data_blobs: + url = f'{url_root}/{fname}' + hasher = hashlib.blake2b() + hasher.update(data_blobs[fname]['data']) + checksum = hasher.hexdigest() + + data_file = {'url': url, + 'version_id': fname_to_version[fname], + 'file_hash': checksum} + + data_file_dict[data_blobs[fname]['file_id']] = data_file + + manifest['data_files'] = data_file_dict + + if metadata_blobs is not None: + url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/' + url_root += 'project_metadata' + + metadata_dict = {} + for fname in metadata_blobs: + url = f'{url_root}/{fname}' + hasher = hashlib.blake2b() + hasher.update(metadata_blobs[fname]) + metadata_dict[fname] = {'url': url, + 'file_hash': hasher.hexdigest(), + 'version_id': fname_to_version[fname]} + + manifest['metadata_files'] = metadata_dict + + manifest_k = f'{project_name}/manifests/' + manifest_k += f'{project_name}_manifest_v{manifest_version}.json' + client.put_object(Bucket=bucket_name, + Key=manifest_k, + Body=bytes(json.dumps(manifest), 'utf-8')) + + return None + + +def create_bucket(test_bucket_name: str, + datasets: dict, + metadatasets: Optional[dict] = None) -> None: + """ + Create a bucket and populate it with example datasets + + Parameters + ---------- + test_bucket_name: str + Name of the bucket + + datasets: dict + Keyed on version names; values are dicts of individual + data files to be loaded to the bucket + + metadatasets: Optional[dict] + Keyed on version names; values are dicts of individual + metadata files to be loaded to the bucket (default: None) + """ + + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + + # upload first dataset + for v in datasets.keys(): + if metadatasets is not None: + m = metadatasets[v] + else: + m = None + load_dataset(datasets[v], + m, + v, + test_bucket_name, + client) + + return None diff --git a/test/api/response_test_data/472451419_response.json b/test/api/response_test_data/472451419_response.json new file mode 100644 index 0000000000..7679b260a3 --- /dev/null +++ b/test/api/response_test_data/472451419_response.json @@ -0,0 +1,227 @@ +{ + "total_rows": 9440, + "success": true, + "msg": [ + { + "name": "Biophysical - perisomatic_Nr5a1-Cre;Ai14-177334.05.01.01", + "specimen_id": 386049446, + "specimen": { + "rna_integrity_number": null, + "weight": 9000, + "parent_y_coord": 0, + "ephys_sweeps": [ + { + "stimulus_interval": null, + "stimulus_name": "Long Square", + "num_spikes": 2, + "id": 396429050, + "pre_vm_mv": -85.3548278808594, + "stimulus_duration": 0.999995, + "stimulus_start_time": 1.02, + "slow_noise_rms_mv": 0.0742162764072418, + "peak_deflection": null, + "stimulus_description": "C1LSFINEST150112[0]", + "stimulus_units": "Amps", + "specimen_id": 386049446, + "sweep_number": 42, + "vm_delta_mv": 0.374382019042969, + "leak_pa": -3.0070378780365, + "pre_noise_rms_mv": 0.0360921323299408, + "post_noise_rms_mv": 0.0375288389623165, + "bridge_balance_mohm": 18.0097675323486, + "post_vm_mv": -85.7292098999023, + "stimulus_absolute_amplitude": 110.000002162547, + "slow_vm_mv": -85.3548278808594, + "stimulus_relative_amplitude": 1.1 + } + ], + "parent_x_coord": 0, + "ephys_result_id": 386049444, + "is_cell_specimen": true, + "id": 386049446, + "neuron_reconstructions": [ + { + "max_euclidean_distance": 346.003240593379, + "number_tips": 22, + "max_path_distance": 377.118073486042, + "overall_depth": 70.56, + "neuron_reconstruction_type": "dendrite-only", + "number_bifurcations": 17, + "total_volume": 403.245425875963, + "scale_factor_z": 0.28, + "scale_factor_y": 0.1144, + "scale_factor_x": 0.1144, + "number_nodes": 1947, + "tags": "3D Neuron Reconstruction morphology", + "average_parent_daughter_ratio": 0.882944233914226, + "id": 491459171, + "average_diameter": 0.439679792761665, + "well_known_files": [ + { + "well_known_file_type": { + "id": 303941301, + "name": "3DNeuronReconstruction" + }, + "attachable_type": "NeuronReconstruction", + "download_link": "/api/v2/well_known_file_download/491459173", + "well_known_file_type_id": 303941301, + "path": "/external/mousecelltypes/prod256/specimen_386049446/Nr5a1-Cre_Ai14-177334.05.01.01_491459171_m.swc", + "attachable_id": 491459171, + "id": 491459173 + }, + { + "well_known_file_type": { + "id": 486753749, + "name": "3DNeuronMarker" + }, + "attachable_type": "NeuronReconstruction", + "download_link": "/api/v2/well_known_file_download/496607103", + "well_known_file_type_id": 486753749, + "path": "/external/mousecelltypes/prod256/specimen_386049446/Nr5a1-Cre_Ai14-177334.05.01.01_491459171_marker_m.swc", + "attachable_id": 491459171, + "id": 496607103 + } + ], + "specimen_id": 386049446, + "total_length": 2268.08172534129, + "overall_width": 271.753540218214, + "number_stems": 5, + "average_bifurcation_angle_local": 70.6136901015225, + "number_branches": 39, + "average_fragmentation": 53.3823529411765, + "average_contraction": 0.924610944456856, + "average_bifurcation_angle_remote": null, + "hausdorff_dimension": null, + "total_surface": 3133.71153328341, + "max_branch_order": 6.0, + "soma_surface": 290.085763487108, + "overall_height": 429.56158255954 + } + ], + "pinned_radius": null, + "sphinx_id": 256671, + "parent_id": 383680643, + "is_ish": false, + "cortex_layer_id": null, + "ephys_result": { + "failed": false, + "well_known_files": [ + { + "well_known_file_type": { + "id": 488673261, + "name": "EphysInstantaneousThresholdThumbnail" + }, + "attachable_type": "EphysResult", + "download_link": "/api/v2/well_known_file_download/491383263", + "well_known_file_type_id": 488673261, + "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/ephys_inst_threshold.png", + "attachable_id": 386049444, + "id": 491383263 + }, + { + "well_known_file_type": { + "id": 480715721, + "name": "MorphologyThumbnail" + }, + "attachable_type": "EphysResult", + "download_link": "/api/v2/well_known_file_download/487660477", + "well_known_file_type_id": 480715721, + "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/morphology_summary.png", + "attachable_id": 386049444, + "id": 487660477 + }, + { + "well_known_file_type": { + "id": 481007198, + "name": "NWBDownload" + }, + "attachable_type": "EphysResult", + "download_link": "/api/v2/well_known_file_download/491198851", + "well_known_file_type_id": 481007198, + "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/386049444_ephys.nwb", + "attachable_id": 386049444, + "id": 491198851 + }, + { + "well_known_file_type": { + "id": 478840678, + "name": "NWBUncompressed" + }, + "attachable_type": "EphysResult", + "download_link": "/api/v2/well_known_file_download/491198854", + "well_known_file_type_id": 478840678, + "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/386049444_uncompressed.nwb", + "attachable_id": 386049444, + "id": 491198854 + }, + { + "well_known_file_type": { + "id": 480715749, + "name": "EphysSummaryThumbnail" + }, + "attachable_type": "EphysResult", + "download_link": "/api/v2/well_known_file_download/487614229", + "well_known_file_type_id": 480715749, + "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/ephys_summary.png", + "attachable_id": 386049444, + "id": 487614229 + } + ], + "id": 386049444, + "sampling_rate": 200000 + }, + "failed_facet": 734881840, + "treatment_id": 598634036, + "tissue_ph": null, + "hemisphere": "left", + "cell_reporter_id": 491913822, + "cell_prep_sample_id": null, + "data": null, + "structure_id": 721, + "parent_z_coord": 1, + "name": "Nr5a1-Cre;Ai14-177334.05.01.01", + "specimen_id_path": "/339692365/383309938/383680643/386049446/", + "donor_id": 339692362, + "external_specimen_name": null + }, + "neuronal_model_template": { + "well_known_files": [ + { + "well_known_file_type": { + "id": 292178729, + "name": "BiophysicalModelDescription" + }, + "attachable_type": "Product", + "download_link": "/api/v2/well_known_file_download/395337293", + "well_known_file_type_id": 292178729, + "path": "/external/mousecelltypes/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", + "attachable_id": 305094322, + "id": 395337293 + } + ], + "description": "Biophysical Neuronal Model Template", + "name": "Biophysical - perisomatic", + "id": 329230710 + }, + "neuronal_model_template_id": 329230710, + "well_known_files": [ + { + "well_known_file_type": { + "id": 329230374, + "name": "NeuronalModelParameters" + }, + "attachable_type": "NeuronalModel", + "download_link": "/api/v2/well_known_file_download/497235805", + "well_known_file_type_id": 329230374, + "path": "/external/mousecelltypes/prod297/neuronal_model_472451419/386049446_fit.json", + "attachable_id": 472451419, + "id": 497235805 + } + ], + "id": 472451419 + } + ], + "num_rows": 1, + "start_row": 0, + "id": 0 +} diff --git a/test/api/test_annotated_section_data_set_api.py b/test/api/test_annotated_section_data_set_api.py new file mode 100644 index 0000000000..06462593e9 --- /dev/null +++ b/test/api/test_annotated_section_data_set_api.py @@ -0,0 +1,97 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.api.queries.annotated_section_data_sets_api import \ + AnnotatedSectionDataSetsApi +import pytest +from mock import MagicMock + + +@pytest.fixture +def annotated(): + asdsa = AnnotatedSectionDataSetsApi() + + asdsa.json_msg_query = MagicMock(name='json_msg_query') + + return asdsa + + +def test_get_annotated_section_data_set(annotated): + annotated.get_annotated_section_data_sets( + structures=[112763676], + intensity_values=["High", "Low", "Medium"], + density_values=["High", "Low"], + pattern_values=["Full"], + age_names=["E11.5", "13.5"]) + + annotated.json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/annotated_section_data_sets.json" + "?structures=112763676&intensity_values='High','Low','Medium'" + "&density_values='High','Low'" + "&pattern_values='Full'&age_names='E11.5','13.5'") + + +def test_get_compound_annotated_section_data_set(annotated): + annotated.get_annotated_section_data_sets( + structures=[112763676], + intensity_values=["High", "Low", "Medium"], + density_values=["High", "Low"], + pattern_values=["Full"], + age_names=["E11.5", "13.5"]) + + annotated.json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/annotated_section_data_sets.json?" + "structures=112763676" + "&intensity_values='High','Low','Medium'&density_values='High','Low'" + "&pattern_values='Full'" + "&age_names='E11.5','13.5'") + + +def test_get_annotated_section_data_set_via_rma(annotated): + annotated.json_msg_query = \ + MagicMock(name='json_msg_query') + + annotated.get_compound_annotated_section_data_sets( + [{'structures': [112763676], + 'intensity_values': ['High', 'Low'], + 'link': 'or'}, + {'structures': [112763686], + 'intensity_values': ['Low']}]) + + annotated.json_msg_query.assert_called_once_with( + "http://api.brain-map.org" + "/api/v2/compound_annotated_section_data_sets.json" + "?query=[structures $in 112763676 : intensity_values $in 'High','Low']" + " or [structures $in 112763686 : intensity_values $in 'Low']") diff --git a/test/api/test_api.py b/test/api/test_api.py new file mode 100644 index 0000000000..bb92612021 --- /dev/null +++ b/test/api/test_api.py @@ -0,0 +1,175 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import io +from six.moves import builtins +import zipfile +import os + +import numpy as np +import pytest +from mock import MagicMock, patch, mock_open +from requests.exceptions import HTTPError +import requests + +import allensdk.core.json_utilities as ju +from allensdk.api.api import Api, stream_file_over_http, stream_zip_directory_over_http + + +_msg = {'whatever': True} + +@pytest.fixture +def api(): + return Api() + + +@pytest.fixture +def response(): + + resp = MagicMock() + resp.iter_content = lambda *a, **k: iter([b'1', b'2', b'3']) + + return resp + + +@pytest.fixture +def zip_response(): + + flike = io.BytesIO() + data = '122333444455555' + + zipper = zipfile.ZipFile(flike, mode='w') + zipper.writestr('test.txt', data) + zipper.close() + + return flike.getvalue() + + +def test_failed_download(api): + with pytest.raises(HTTPError) as e_info: + api.retrieve_file_over_http('http://example.com/yo.jpg', + '/tmp/testfile') + + assert e_info.typename == 'HTTPError' + + +def test_request_timeout(api): + def raise_read_timeout(response, path=None): + raise requests.exceptions.ReadTimeout + + with patch('requests.get', return_value=MagicMock()) as get_mock: + response_mock = get_mock.return_value + response_mock.raise_for_status = MagicMock() + + with patch( + 'requests_toolbelt.downloadutils.stream.stream_response_to_file', + MagicMock(name='stream_response_to_file', + side_effect=raise_read_timeout)) as stream_mock: + + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + + with patch('os.remove', MagicMock()) as os_remove: + with pytest.raises(requests.exceptions.ReadTimeout) as e_info: + api.retrieve_file_over_http('http://example.com/yo.jpg', + '/tmp/testfile') + + assert e_info.typename == 'ReadTimeout' + stream_mock.assert_called_with(response_mock, path=open_mock.return_value) + get_mock.assert_called_once_with('http://example.com/yo.jpg', + stream=True, + timeout=(9.05, 31.1)) + open_mock.assert_called_once_with('/tmp/testfile', 'wb') + os_remove.assert_called_once_with('/tmp/testfile') + + +@patch("allensdk.core.json_utilities.read_url_post", return_value=_msg) +def test_do_query_post(ju_read_url_post, api): + api.do_query(lambda *a, **k: 'http://localhost/%s' % (a[0]), + lambda d: d, + "wow", + post=True) + + ju_read_url_post.assert_called_once_with('http://localhost/wow') + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_do_query_get(ju_read_url_get, api): + api.do_query(lambda *a, **k: 'http://localhost/%s' % (a[0]), + lambda d: d, + "wow", + post=False) + + ju_read_url_get.assert_called_once_with('http://localhost/wow') + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_load_api_schema(ju_read_url_get, api): + api.load_api_schema() + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/enumerate.json') + + +def test_stream_file_over_http(response, tmpdir_factory): + + path = tmpdir_factory.mktemp('file_stream_test').join('test.txt') + + with patch('requests.get', return_value=response) as get_mock: + stream_file_over_http('https://fish.gov', str(path)) + + with open(str(path), 'r') as fil: + data = fil.read() + + assert( data == '123' ) + + +def test_stream_zip_directory_over_http(zip_response, tmpdir_factory): + + path = tmpdir_factory.mktemp('zip_stream_test').join('test.txt') + + with patch('requests.get') as get_mock: + with patch('requests_toolbelt.downloadutils.stream.stream_response_to_file', + side_effect=lambda r, b: b.write(zip_response)): + + stream_zip_directory_over_http('https://fish.gov', os.path.dirname(str(path))) + + with open(str(path), 'r') as fil: + data = fil.read() + + assert(data == '122333444455555') + \ No newline at end of file diff --git a/test/api/test_biophysical_api.py b/test/api/test_biophysical_api.py new file mode 100644 index 0000000000..927d69d0c2 --- /dev/null +++ b/test/api/test_biophysical_api.py @@ -0,0 +1,79 @@ +import os +import json + +import numpy as np +import pytest +from mock import patch +from allensdk.api.queries.biophysical_api import BiophysicalApi + + +@pytest.fixture +def neuronal_model_response(): + dirname = os.path.dirname(__file__) + path = os.path.join(dirname, 'response_test_data', '472451419_response.json') + + with open(path, 'r') as jf: + data = json.load(jf) + + return data + + +@pytest.fixture +def biophys_api(): + endpoint = 'http://twarehouse-backup' + return BiophysicalApi(endpoint) + + +@pytest.mark.parametrize('model_id', [3]) +@pytest.mark.parametrize('fmt', [None, 'json', 'xml']) +def test_build_rma(model_id, fmt, biophys_api): + if fmt is None: + fmt_exp = 'json' + obt = biophys_api.build_rma(model_id) + else: + fmt_exp = fmt + obt = biophys_api.build_rma(model_id, fmt_exp) + + exp = 'http://twarehouse-backup/api/v2/data/query.{}?'\ + 'q=model::NeuronalModel,'\ + 'rma::criteria,[id$eq{}],'\ + 'neuronal_model_template(well_known_files(well_known_file_type)),'\ + 'specimen(ephys_result(well_known_files(well_known_file_type)),'\ + 'neuron_reconstructions(well_known_files(well_known_file_type)),ephys_sweeps),'\ + 'well_known_files(well_known_file_type),'\ + 'rma::include,neuronal_model_template(well_known_files(well_known_file_type)),'\ + 'specimen(ephys_result(well_known_files(well_known_file_type)),'\ + 'neuron_reconstructions(well_known_files(well_known_file_type)),ephys_sweeps),'\ + 'well_known_files(well_known_file_type)' + exp = exp.format(fmt_exp, model_id) + + assert obt == exp + + +def test_is_well_known_file_type(biophys_api): + wkf = {'well_known_file_type': {'name': 'fish'}} + + assert(biophys_api.is_well_known_file_type(wkf, 'fish')) + assert(not biophys_api.is_well_known_file_type(wkf, 'fowl')) + + +@patch.object(BiophysicalApi, "json_msg_query") +def test_get_neuronal_models(mock_json_msg_query, biophys_api): + mck = biophys_api.get_neuronal_models([386049446,469753383]) + + mock_json_msg_query.assert_called_once_with( + "http://twarehouse-backup/api/v2/data/query.json?" + "q=model::NeuronalModel,rma::criteria,[neuronal_model_template_id$in491455321,329230710]," + "[specimen_id$in386049446,469753383],rma::options[num_rows$eq'all'][count$eqfalse]") + + +def test_read_json(biophys_api, neuronal_model_response): + + obt = biophys_api.read_json(neuronal_model_response) + + assert(obt['stimulus']['491198851'] == "386049444.nwb") + assert(obt['morphology']['491459173'] == "Nr5a1-Cre_Ai14-177334.05.01.01_491459171_m.swc") + assert(obt['fit']['497235805'] == '386049446_fit.json') + assert(obt['marker']['496607103'] == 'Nr5a1-Cre_Ai14-177334.05.01.01_491459171_marker_m.swc') + assert(obt['modfiles']['395337293'] == os.path.join('modfiles', 'SK.mod')) + assert(np.allclose(biophys_api.sweeps, [42])) diff --git a/test/api/test_brain_observatory_api.py b/test/api/test_brain_observatory_api.py new file mode 100644 index 0000000000..41c66311eb --- /dev/null +++ b/test/api/test_brain_observatory_api.py @@ -0,0 +1,547 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import pytest +from mock import patch, MagicMock, call +from collections import Counter +import datetime +from allensdk.api.queries.brain_observatory_api import (BrainObservatoryApi, + find_container_tags, + find_specimen_cre_line, + find_specimen_reporter_line, + find_experiment_acquisition_age) +from . import SafeJsonMsg + + +_rows_per_message = 2000 +_msg = [{'whatever': True}] * _rows_per_message +_num_messages = 5 +_msg5 = [{'msg': _msg}] * _num_messages + +@pytest.fixture +def safe_msg5(): + return SafeJsonMsg(_msg5) + +@pytest.fixture() +def bo_api(): + endpoint = os.environ['TEST_API_ENDPOINT'] if 'TEST_API_ENDPOINT' in os.environ else 'http://twarehouse-backup' + return BrainObservatoryApi(endpoint) + + +@pytest.fixture +def mock_containers(): + containers = [ + { + 'targeted_structure': {'acronym': 'CBS'}, + 'imaging_depth': 100, + 'specimen': { + 'donor': {'transgenic_lines': [{ 'name': 'Shiny', + 'transgenic_line_type_name': 'driver' }]}} + }, + { + 'targeted_structure': {'acronym': 'ABC'}, + 'imaging_depth': 150, + 'specimen': { + 'donor': {'transgenic_lines': [{ 'name': 'ShinyCre', + 'transgenic_line_type_name': 'driver' }]}} + }, + { + 'targeted_structure': {'acronym': 'NBC'}, + 'imaging_depth': 200, + 'specimen': { + 'donor': {'transgenic_lines': [{ 'name': 'Don', + 'transgenic_line_type_name': 'reporter' }]}} + } + ] + + return containers + + +@pytest.fixture +def mock_ophys_experiments(): + experiments = [ + {'experiment_container_id': 1, + 'targeted_structure': {'acronym': 'CBS'}, + 'imaging_depth': 100, + 'specimen': {'donor': { + 'transgenic_lines': [{'name': 'Shiny'}]}}, + 'stimulus_name': 'three_session_B', + }, + {'experiment_container_id': 2, + 'targeted_structure': {'acronym': 'NBC'}, + 'imaging_depth': 200, + 'specimen': {'donor': { + 'transgenic_lines': [{'name': 'Don'}]}}, + 'stimulus_name': 'three_session_C', + 'experiment_container': { 'failed': False }, + 'fail_eye_tracking': False + }, + {'experiment_container_id': 2, + 'targeted_structure': {'acronym': 'NBC'}, + 'imaging_depth': 200, + 'specimen': {'donor': { + 'transgenic_lines': [{'name': 'Don'}]}}, + 'stimulus_name': 'three_session_C', + 'experiment_container': { 'failed': True }, + 'fail_eye_tracking': True + } + ] + + return experiments + + +@pytest.fixture +def mock_specimens(): + specimens = [ + {"experiment_container_id": 511498500, + "cell_specimen_id": 517394843 + }, + {"experiment_container_id": 511498742, + "cell_specimen_id": 517398740, + "failed_experiment_container": False + }, + {"experiment_container_id": 511498501, + "cell_specimen_id": 517394874, + "failed_experiment_container": True + } + ] + return specimens + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_list_isi_experiments(mock_json_msg_query, bo_api): + bo_api.list_isi_experiments() + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::IsiExperiment,rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_isi_experiments(mock_json_msg_query, bo_api): + isi_experiment_id = 503316697 + bo_api.get_isi_experiments(isi_experiment_id) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::IsiExperiment,rma::criteria,[id$in503316697]," + "rma::include," + "experiment_container(ophys_experiments,targeted_structure)," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_ophys_experiments_one_id(mock_json_msg_query, bo_api): + ophys_experiment_id = 502066273 + bo_api.get_ophys_experiments(ophys_experiment_id) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::OphysExperiment,rma::criteria,[id$in502066273]," + "rma::include,experiment_container," + "well_known_files(well_known_file_type),targeted_structure," + "specimen(donor(age,transgenic_lines))," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_experiment_container_metrics(mock_json_msg_query, bo_api): + tid = 511510627 + bo_api.get_experiment_container_metrics(tid) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiCamExperimentContainerMetric," + "rma::criteria,[id$in511510627]," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_experiment_containers(mock_json_msg_query, bo_api): + tid = 511510753 + bo_api.get_experiment_containers(tid) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ExperimentContainer,rma::criteria,[id$in511510753]," + "rma::include,ophys_experiments,isi_experiment," + "specimen(donor(conditions,age,transgenic_lines)),targeted_structure," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_column_definitions(mock_json_msg_query, bo_api): + api_class_name = bo_api.quote_string('ApiTbiDonorMetric') + bo_api.get_column_definitions(api_class_name=api_class_name) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiColumnDefinition," + "rma::criteria,[api_class_name$eq'ApiTbiDonorMetric']," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_list_column_definition_class_names(mock_json_msg_query, bo_api): + bo_api.list_column_definition_class_names() + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiColumnDefinition," + "rma::options" + "[only$eq'api_class_name'][num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_stimulus_mappings_no_ids(mock_json_msg_query, bo_api): + bo_api.get_stimulus_mappings() + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiCamStimulusMapping," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_stimulus_mappings_one_id(mock_json_msg_query, bo_api): + ids = 15 + bo_api.get_stimulus_mappings(stimulus_mapping_ids=ids) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiCamStimulusMapping," + "rma::criteria,[id$in15]," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_stimulus_mappings_two_ids(mock_json_msg_query, bo_api): + ids = [15, 43] + bo_api.get_stimulus_mappings(stimulus_mapping_ids=ids) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiCamStimulusMapping," + "rma::criteria,[id$in15,43]," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_cell_metrics_no_ids(mock_json_msg_query, bo_api): + list(bo_api.get_cell_metrics()) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiCamCellMetric," + "rma::options[num_rows$eq2000][start_row$eq0][order$eq\'cell_specimen_id\'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_cell_metrics_one_ids(mock_json_msg_query, bo_api): + tid = 517394843 + list(bo_api.get_cell_metrics(cell_specimen_ids=tid)) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiCamCellMetric," + "rma::criteria,[cell_specimen_id$in517394843]," + "rma::options[num_rows$eq2000][start_row$eq0][order$eq\'cell_specimen_id\'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_cell_metrics_two_ids(mock_json_msg_query, bo_api): + ids = [517394843, 517394850] + res = list(bo_api.get_cell_metrics(cell_specimen_ids=ids)) + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::ApiCamCellMetric," + "rma::criteria,[cell_specimen_id$in517394843,517394850]," + "rma::options[num_rows$eq2000][start_row$eq0][order$eq\'cell_specimen_id\'][count$eqfalse]") + + +def test_get_cell_metrics_five_messages(bo_api, safe_msg5): + with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_msg5) as ju_read_url_get: + ids = [517394843, 517394850] + list(bo_api.get_cell_metrics(cell_specimen_ids=ids)) + + base_query = \ + (bo_api.api_url + '/api/v2/data/query.json?q=' + 'model::ApiCamCellMetric,' + 'rma::criteria,%5Bcell_specimen_id$in517394843,517394850%5D,' + 'rma::options%5Bnum_rows$eq2000%5D%5Bstart_row$eq{}%5D%5Border$eq%27cell_specimen_id%27%5D%5Bcount$eqfalse%5D') + expected_calls = map(lambda c: call(base_query.format(c)), + [0, 2000, 4000, 6000, 8000, 10000]) + + assert ju_read_url_get.call_args_list == list(expected_calls) + + +def test_filter_experiment_containers_no_filters(bo_api, mock_containers): + containers = bo_api.filter_experiment_containers(mock_containers) + assert len(containers) == 3 + + +def test_filter_experiment_containers_depth_filter(bo_api, mock_containers): + containers = bo_api.filter_experiment_containers(mock_containers, + imaging_depths=[100]) + assert len(containers) == 1 + + +def test_filter_experiment_containers_structures_filter(bo_api, mock_containers): + containers = \ + bo_api.filter_experiment_containers( + mock_containers, + targeted_structures=['CBS']) + assert len(containers) == 1 + + +def test_filter_experiment_containers_lines_all_filters(bo_api, mock_containers): + containers = \ + bo_api.filter_experiment_containers(mock_containers, + imaging_depths=[200], + targeted_structures=['NBC'], + transgenic_lines=['Don']) + + assert len(containers) == 1 + + containers = \ + bo_api.filter_experiment_containers(mock_containers, + imaging_depths=[200], + targeted_structures=['NBC'], + reporter_lines=['don']) + + assert len(containers) == 1 + +def test_filter_experiment_containers_transgenic_lines(bo_api, mock_containers): + containers = \ + bo_api.filter_experiment_containers(mock_containers, + cre_lines=['Shiny']) + + assert len(containers) == 0 + + containers = \ + bo_api.filter_experiment_containers(mock_containers, + cre_lines=['ShinyCre']) + + assert len(containers) == 1 + + containers = \ + bo_api.filter_experiment_containers(mock_containers, transgenic_lines=['DON']) + + assert len(containers) == 1 + + + +def test_filter_ophys_experiments_no_filters(bo_api, mock_ophys_experiments): + experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments) + assert len(experiments) == 2 + + +def test_filter_ophys_experiments_container_id(bo_api, mock_ophys_experiments): + experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments, + experiment_container_ids=[1]) + assert len(experiments) == 1 + + +def test_filter_ophys_experiments_stimuli(bo_api, mock_ophys_experiments): + experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments, + stimuli=['static_gratings']) + assert len(experiments) == 1 + +def test_filter_ophys_experiments_eye_tracking(bo_api, mock_ophys_experiments): + experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments, + require_eye_tracking=True) + assert len(experiments) == 1 + + +def test_filter_cell_specimens(bo_api, mock_specimens): + specimens = bo_api.filter_cell_specimens(mock_specimens, include_failed=True) + assert specimens == mock_specimens + + specimens = bo_api.filter_cell_specimens(mock_specimens) + assert len(specimens) == 2 + + specimens = bo_api.filter_cell_specimens( + mock_specimens, ids=[mock_specimens[0]['cell_specimen_id']]) + assert len(specimens) == 1 + assert specimens[0] == mock_specimens[0] + + cnt = Counter() + for sp in mock_specimens: + cnt[sp['experiment_container_id']] += 1 + + ecid = mock_specimens[0]['experiment_container_id'] + specimens = bo_api.filter_cell_specimens( + mock_specimens, experiment_container_ids=[ecid]) + assert len(specimens) == cnt[ecid] + assert specimens[0] == mock_specimens[0] + + +@patch.object(BrainObservatoryApi, "retrieve_file_over_http") +@patch.object(BrainObservatoryApi, "json_msg_query", return_value=[{'download_link': '/url/path/to/file'}]) +def test_save_ophys_experiment_data(mock_json_msg_query, + mock_retrieve_file_over_http, + bo_api): + with patch('allensdk.config.manifest.Manifest.safe_mkdir') as mkdir: + bo_api.save_ophys_experiment_data(1, '/path/to/filename') + + mkdir.assert_called_once_with('/path/to') + + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::WellKnownFile," + "rma::criteria," + "[attachable_id$eq1],well_known_file_type[name$eqNWBOphys]," + "rma::options[num_rows$eq'all'][count$eqfalse]") + mock_retrieve_file_over_http.assert_called_with( + bo_api.api_url + '/url/path/to/file', + '/path/to/filename') + + +@patch.object(BrainObservatoryApi, "retrieve_file_over_http") +@patch.object(BrainObservatoryApi, "json_msg_query", return_value=[{'download_link': '/url/path/to/file'}]) +def test_save_ophys_experiment_event_data(mock_json_msg_query, + mock_retrieve_file_over_http, + bo_api): + with patch('allensdk.config.manifest.Manifest.safe_mkdir') as mkdir: + bo_api.save_ophys_experiment_event_data(1, '/path/to/filename') + + mkdir.assert_called_once_with('/path/to') + + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::WellKnownFile," + "rma::criteria," + "[attachable_id$eq1],well_known_file_type[name$eqObservatoryEventsFile]," + "rma::options[num_rows$eq'all'][count$eqfalse]") + mock_retrieve_file_over_http.assert_called_with( + bo_api.api_url + '/url/path/to/file', + '/path/to/filename') + + +@patch.object(BrainObservatoryApi, "retrieve_file_over_http") +@patch.object(BrainObservatoryApi, "json_msg_query", return_value=[{'download_link': '/url/path/to/file'}]) +def test_get_cell_specimen_id_mapping(mock_json_msg_query, + mock_retrieve_file_over_http, + bo_api): + with patch('pandas.read_csv') as readcsv: + bo_api.get_cell_specimen_id_mapping('/path/to/filename', 1) + + readcsv.assert_called_once_with('/path/to/filename') + + mock_json_msg_query.assert_called_once_with( + bo_api.api_url + "/api/v2/data/query.json?q=" + "model::WellKnownFile," + "rma::criteria," + "[id$eq1],well_known_file_type[name$eqOphysCellSpecimenIdMapping]," + "rma::options[num_rows$eq'all'][count$eqfalse]") + mock_retrieve_file_over_http.assert_called_with( + bo_api.api_url + '/url/path/to/file', + '/path/to/filename') + + +def test_find_container_tags(): + # no conditions no tags + c = { "specimen": { "donor": { "conditions": [] } } } + tags = find_container_tags(c) + assert len(tags) == 0 + + # tissue tags are ignored + c = { "specimen": { "donor": { "conditions": [ { "name": "tissuecyte" } ] } } } + tags = find_container_tags(c) + assert len(tags) == 0 + + # no conditions is okay + c = { "specimen": { "donor": { } } } + tags = find_container_tags(c) + assert len(tags) == 0 + + # everything else goes through + c = { "specimen": { "donor": { "conditions": [ { "name": "fish" } ] } } } + tags = find_container_tags(c) + assert len(tags) == 1 + + +def test_find_specimen_cre_line(): + # None if no TLs + s = { "donor": { "transgenic_lines": [ ] } } + cre = find_specimen_cre_line(s) + assert cre is None + + # None if no 'Cre' + s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "driver", "name": "banana" } ] } } + cre = find_specimen_cre_line(s) + assert cre is None + + # None if no 'Cre' + s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "driver", "name": "bananaCre" } ] } } + cre = find_specimen_cre_line(s) + assert cre == "bananaCre" + + # None if no 'driver' + s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "reporter", "name": "bananaCre" } ] } } + cre = find_specimen_cre_line(s) + assert cre == None + +def test_find_specimen_reporter_line(): + # None if no TLs + s = { "donor": { "transgenic_lines": [ ] } } + cre = find_specimen_reporter_line(s) + assert cre is None + + s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "reporter", "name": "banana" } ] } } + cre = find_specimen_reporter_line(s) + assert cre == "banana" + + # None if no "reporter" + s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "driver", "name": "bananaCre" } ] } } + cre = find_specimen_reporter_line(s) + assert cre is None + +def test_find_experiment_acquisition_age(): + exp = {} + age = find_experiment_acquisition_age(exp) + assert age is None + + d2 = datetime.datetime.now() + d1 = d2 - datetime.timedelta(days=1) + + exp = { 'date_of_acquisition': str(d2), + 'specimen': { 'donor': { 'date_of_birth': str(d1) } } } + + age = find_experiment_acquisition_age(exp) + + assert age == 1 + +def test_dataframe_query(bo_api, mock_specimens): + res = bo_api.dataframe_query(mock_specimens, [], 'cell_specimen_id') + assert len(res) == len(mock_specimens) + + res = bo_api.dataframe_query(mock_specimens, + [ { 'field': 'experiment_container_id', + 'op': '=', + 'value': 511498500 } ], + 'cell_specimen_id') + + assert len(res) == 1 + diff --git a/test/api/test_cache.py b/test/api/test_cache.py new file mode 100644 index 0000000000..902f92c465 --- /dev/null +++ b/test/api/test_cache.py @@ -0,0 +1,233 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os + +import pandas as pd +import pandas.io.json as pj +import numpy as np +import time + +import pytest +from mock import MagicMock, mock_open, patch + +from allensdk.api.warehouse_cache.cache import Cache, memoize, get_default_manifest_file +from allensdk.api.queries.rma_api import RmaApi +import allensdk.core.json_utilities as ju +from allensdk.config.manifest import ManifestVersionError +from allensdk.config.manifest_builder import ManifestBuilder + +_msg = [{'whatever': True}] +_pd_msg = pd.DataFrame(_msg) + + +@pytest.fixture +def cache(): + return Cache() + + +@pytest.fixture +def rma(): + return RmaApi() + + +@pytest.fixture +def wavefront_obj(): + return ''' + +v 8578 5484.96 5227.57 +v 8509.2 5487.54 5237.07 +v 8564.38 5522.13 5220.41 +v 8631.93 5497.82 5228.33 +v 8517.88 5542.95 5234.53 +v 8615.26 5563.22 5224.48 + +# i'm a comment! + +vn -0.0247061 -0.352726 -0.935401 +vn -0.235489 -0.190095 -0.953105 +vn -0.0880336 -0.0323767 -0.995591 +vn 0.122706 -0.209891 -0.969994 +vn -0.343738 0.217978 -0.913416 +vn 0.0753706 0.16324 -0.983703 + +I should be a comment, but am not + +f 1//1 2//2 3//3 +f 4//4 1//1 3//3 +f 3//3 2//2 5//5 +f 6//6 3//3 5//5 + + ''' + + +@pytest.fixture +def dummy_cache(): + class DummyCache(Cache): + + VERSION = None + + def build_manifest(self, file_name): + manifest_builder = ManifestBuilder() + manifest_builder.set_version(DummyCache.VERSION) + manifest_builder.write_json_file(file_name) + + return DummyCache + + +def test_version_update(fn_temp_dir, dummy_cache): + + mpath = os.path.join(fn_temp_dir, 'manifest.json') + dc = dummy_cache(manifest=mpath) + + same_dc = dummy_cache(manifest=mpath) + + with pytest.raises(ManifestVersionError): + new_dc = dummy_cache(manifest=mpath, version=1.0) + + +def test_load_manifest(tmpdir_factory, dummy_cache): + + manifest = tmpdir_factory.mktemp('data').join('test_manifest.json') + cache = dummy_cache(manifest=str(manifest)) + + assert(cache.manifest_path == str(manifest)) + assert(os.path.exists(cache.manifest_path)) + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=pd.DataFrame(_msg)) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +def test_wrap_json(ju_read_url_get, ju_read, ju_write, rma, cache): + df = cache.wrap(rma.model_query, + 'example.txt', + cache=True, + model='Hemisphere') + + assert df.loc[:, 'whatever'][0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + ju_write.assert_called_once_with('example.txt', _msg) + ju_read.assert_called_once_with('example.txt') + + +@patch("pandas.io.json.read_json", return_value=_msg) +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +def test_wrap_dataframe(ju_read_url_get, ju_write, mock_read_json, rma, cache): + json_data = cache.wrap(rma.model_query, + 'example.txt', + cache=True, + return_dataframe=True, + model='Hemisphere') + + assert json_data[0]['whatever'] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + ju_write.assert_called_once_with('example.txt', _msg) + mock_read_json.assert_called_once_with('example.txt', orient='records') + + +def test_memoize_with_function(): + @memoize + def f(x): + time.sleep(0.1) + return x + + # Build cache + for i in range(3): + uncached_result = f(i) + assert uncached_result == i + assert f.cache_size() == 3 + + # Test cache was accessed + for i in range(3): + t0 = time.time() + result = f(i) + t1 = time.time() + assert result == i + assert t1 - t0 < 0.1 + + # Test cache clear + f.cache_clear() + assert f.cache_size() == 0 + + +def test_memoize_with_kwarg_function(): + @memoize + def f(x, *, y, z=1): + time.sleep(0.1) + return (x * y * z) + + # Build cache + f(2, y=1, z=2) + assert f.cache_size() == 1 + + # Test cache was accessed + t0 = time.time() + result = f(2, y=1, z=2) + t1 = time.time() + assert result == 4 + assert t1 - t0 < 0.1 + + +def test_memoize_with_instance_method(): + class FooBar(object): + @memoize + def f(self, x): + time.sleep(0.1) + return x + + fb = FooBar() + # Build cache + for i in range(3): + uncached_result = fb.f(i) + assert uncached_result == i + assert fb.f.cache_size() == 3 + + for i in range(3): + t0 = time.time() + result = fb.f(i) + t1 = time.time() + assert result == i + assert t1 - t0 < 0.1 + + +def test_get_default_manifest_file(): + assert get_default_manifest_file('brain_observatory') == 'brain_observatory/manifest.json' + assert get_default_manifest_file('cell_types') == 'cell_types/manifest.json' + assert get_default_manifest_file('mouse_connectivity') == 'mouse_connectivity/manifest.json' diff --git a/test/api/test_cacheable.py b/test/api/test_cacheable.py new file mode 100644 index 0000000000..8afb1f590c --- /dev/null +++ b/test/api/test_cacheable.py @@ -0,0 +1,317 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import MagicMock, patch, mock_open +from allensdk.api.warehouse_cache.cache import Cache, cacheable +from allensdk.api.queries.rma_api import RmaApi +import pandas as pd +from six.moves import builtins +from allensdk.config.manifest import Manifest + +try: + import StringIO +except: + import io as StringIO +import os + + +_msg = [{'whatever': True}] +_pd_msg = pd.DataFrame(_msg) +_csv_msg = pd.read_csv(StringIO.StringIO(""",whatever +0,True +"""), index_col=0) + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch('csv.DictWriter') +@patch('pandas.read_csv', return_value=_csv_msg) +def test_cacheable_csv_dataframe(read_csv, dictwriter, ju_read_url_get, + ju_read, ju_write): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + with patch('allensdk.config.manifest.Manifest.safe_mkdir') as mkdir: + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + open_mock.return_value.write = MagicMock() + df = get_hemispheres(path='/xyz/abc/example.txt', + strategy='create', + **Cache.cache_csv_dataframe()) + + assert df.loc[:, 'whatever'][0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + read_csv.assert_called_once_with('/xyz/abc/example.txt', parse_dates=True) + assert not ju_write.called, 'write should not have been called' + assert not ju_read.called, 'read should not have been called' + mkdir.assert_called_once_with('/xyz/abc') + open_mock.assert_called_once_with('/xyz/abc/example.txt', 'w') + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch.object(Manifest, 'safe_mkdir') +@patch('pandas.read_csv', return_value=_csv_msg) +def test_cacheable_json(read_csv, mkdir, ju_read_url_get, ju_read, ju_write): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + df = get_hemispheres(path='/xyz/abc/example.json', + strategy='create', + **Cache.cache_json()) + + assert 'whatever' in df[0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + assert not read_csv.called, 'read_csv should not have been called' + ju_write.assert_called_once_with('/xyz/abc/example.json', + _msg) + ju_read.assert_called_once_with('/xyz/abc/example.json') + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch.object(Manifest, 'safe_mkdir') +def test_excpt(mkdir, ju_read_url_get, ju_read, ju_write): + @cacheable() + def get_hemispheres_excpt(): + return RmaApi().model_query(model='Hemisphere', + excpt=['symbol']) + + df = get_hemispheres_excpt(path='/xyz/abc/example.json', + strategy='create', + **Cache.cache_json()) + + assert 'whatever' in df[0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere,rma::options%5Bexcept$eqsymbol%5D') + ju_write.assert_called_once_with('/xyz/abc/example.json', _msg) + ju_read.assert_called_once_with('/xyz/abc/example.json') + mkdir.assert_called_once_with('/xyz/abc') + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch('pandas.read_csv', return_value=_csv_msg) +def test_cacheable_no_cache_csv(read_csv, ju_read_url_get, ju_read, ju_write): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + df = get_hemispheres(path='/xyz/abc/example.csv', + strategy='file', + **Cache.cache_csv()) + + assert df.loc[:, 'whatever'][0] + + assert not ju_read_url_get.called + read_csv.assert_called_once_with('/xyz/abc/example.csv', parse_dates=True) + assert not ju_write.called, 'json write should not have been called' + assert not ju_read.called, 'json read should not have been called' + + +@patch("pandas.io.json.read_json", return_value=_pd_msg) +@patch("pandas.read_csv", return_value=_csv_msg) +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch.object(Manifest, 'safe_mkdir') +def test_cacheable_json_dataframe(mkdir, ju_read_url_get, ju_read, ju_write, + read_csv, mock_read_json): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + df = get_hemispheres(path='/xyz/abc/example.json', + strategy='create', + **Cache.cache_json_dataframe()) + + assert df.loc[:, 'whatever'][0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + assert not read_csv.called, 'read_csv should not have been called' + mock_read_json.assert_called_once_with('/xyz/abc/example.json', + orient='records') + ju_write.assert_called_once_with('/xyz/abc/example.json', _msg) + assert not ju_read.called, 'json read should not have been called' + mkdir.assert_called_once_with('/xyz/abc') + + +@patch("pandas.io.json.read_json", return_value=_pd_msg) +@patch("pandas.read_csv", return_value=_csv_msg) +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch('csv.DictWriter') +@patch.object(Manifest, 'safe_mkdir') +def test_cacheable_csv_json(mkdir, dictwriter, ju_read_url_get, ju_read, + ju_write, read_csv, mock_read_json): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + open_mock.return_value.write = MagicMock() + df = get_hemispheres(path='/xyz/example.csv', + strategy='create', + **Cache.cache_csv_json()) + + assert 'whatever' in df[0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + read_csv.assert_called_once_with('/xyz/example.csv', parse_dates=True) + dictwriter.return_value.writerow.assert_called() + assert not mock_read_json.called, 'pj.read_json should not have been called' + assert not ju_write.called, 'ju.write should not have been called' + assert not ju_read.called, 'json read should not have been called' + mkdir.assert_called_once_with('/xyz') + open_mock.assert_called_once_with('/xyz/example.csv', 'w') + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch("pandas.read_csv") +@patch.object(pd.DataFrame, "to_csv") +def test_cacheable_no_save(to_csv, read_csv, ju_read_url_get, ju_read, + ju_write): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + data = get_hemispheres() + + assert 'whatever' in data[0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + assert not to_csv.called, 'to_csv should not have been called' + assert not read_csv.called, 'read_csv should not have been called' + assert not ju_write.called, 'json write should not have been called' + assert not ju_read.called, 'json read should not have been called' + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch("pandas.read_csv", return_value=_csv_msg) +@patch.object(pd.DataFrame, "to_csv") +def test_cacheable_no_save_dataframe(to_csv, read_csv, ju_read_url_get, + ju_read, ju_write): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + df = get_hemispheres(**Cache.nocache_dataframe()) + + assert df.loc[:, 'whatever'][0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + assert not to_csv.called, 'to_csv should not have been called' + assert not read_csv.called, 'read_csv should not have been called' + assert not ju_write.called, 'json write should not have been called' + assert not ju_read.called, 'json read should not have been called' + + +@patch("pandas.read_csv", return_value=_csv_msg) +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch('csv.DictWriter') +@patch.object(Manifest, 'safe_mkdir') +def test_cacheable_lazy_csv_no_file(mkdir, dictwriter, ju_read_url_get, + ju_read, ju_write, read_csv): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + with patch('os.path.exists', MagicMock(return_value=False)) as ope: + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + open_mock.return_value.write = MagicMock() + df = get_hemispheres(path='/xyz/abc/example.csv', + strategy='lazy', + **Cache.cache_csv()) + + assert df.loc[:, 'whatever'][0] + + ju_read_url_get.assert_called_once_with( + 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') + open_mock.assert_called_once_with('/xyz/abc/example.csv', 'w') + dictwriter.return_value.writerow.assert_called() + read_csv.assert_called_once_with('/xyz/abc/example.csv', parse_dates=True) + assert not ju_write.called, 'json write should not have been called' + assert not ju_read.called, 'json read should not have been called' + + +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.core.json_utilities.read", return_value=_msg) +@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) +@patch("pandas.read_csv", return_value=_csv_msg) +def test_cacheable_lazy_csv_file_exists(read_csv, ju_read_url_get, ju_read, + ju_write): + @cacheable() + def get_hemispheres(): + return RmaApi().model_query(model='Hemisphere') + + with patch('os.path.exists', MagicMock(return_value=True)) as ope: + df = get_hemispheres(path='/xyz/abc/example.csv', + strategy='lazy', + **Cache.cache_csv()) + + assert df.loc[:, 'whatever'][0] + + assert not ju_read_url_get.called + read_csv.assert_called_once_with('/xyz/abc/example.csv', parse_dates=True) + assert not ju_write.called, 'json write should not have been called' + assert not ju_read.called, 'json read should not have been called' diff --git a/test/api/test_caching_utilities.py b/test/api/test_caching_utilities.py new file mode 100644 index 0000000000..96fc5bdf7c --- /dev/null +++ b/test/api/test_caching_utilities.py @@ -0,0 +1,263 @@ +from functools import partial +import re +import os + +import pytest +import pandas as pd + +from allensdk.api.warehouse_cache import caching_utilities as cu + + +def get_data(): + return pd.DataFrame( + {"a": [1, 2, 3, 4], "b": ["duck", "kangaroo", "walrus", "ibex"]} + ) + + +def swapped_data(): + return pd.DataFrame( + {"b": [1, 2, 3, 4], "a": ["duck", "kangaroo", "walrus", "ibex"]} + ) + + +def write_to_dict(dc, data): + dc["data"] = data + + +def read_from_dict(dc): + return dc["data"] + + +class InitiallyFailing: + def __init__(self, succeed_at): + self.succeed_at = succeed_at + self.count = 0 + + def __call__(self, fn): + self.count += 1 + + if self.count >= self.succeed_at: + return fn() + else: + raise ValueError("foo!") + + +class InitiallyFailingWriter(InitiallyFailing): + def __call__(self, dc, data): + super(InitiallyFailingWriter, self).__call__(partial(write_to_dict, dc, data)) + + +class InitiallyFailingReader(InitiallyFailing): + def __call__(self, dc): + return super(InitiallyFailingReader, self).__call__(partial(read_from_dict, dc)) + + +class CallCountingCleanup: + def __init__(self): + self.count = 0 + + def __call__(self, dc): + self.count += 1 + dc.pop("data", None) + + +class CallCountingFetch: + def __init__(self): + self.count = 0 + + def __call__(self): + self.count += 1 + return get_data() + + +def swap(data): + data = data.copy() + tmp = data["a"] + data["a"] = data["b"] + data["b"] = tmp + return data + + +@pytest.mark.parametrize( + "existing,fetch,write,read,pre_write,cleanup,lazy,num_tries,failure_message,expected,expected_fetches,expected_cleanups", + [ + pytest.param( + False, + CallCountingFetch(), + write_to_dict, + InitiallyFailingReader(2), + swap, + CallCountingCleanup(), + True, + 1, + "", + swapped_data(), + 1, + 0, + id="simple case" + ), + pytest.param( + False, + CallCountingFetch(), + write_to_dict, + read_from_dict, + swap, + CallCountingCleanup(), + False, + 0, + "", + swapped_data(), + 1, + 0, + id="eager success case" + ), + pytest.param( + False, + CallCountingFetch(), + write_to_dict, + InitiallyFailingReader(3), + swap, + CallCountingCleanup(), + True, + 1, + "", + "raise", + 1, + 1, + id="lazy failure case" + ), + pytest.param( + False, + CallCountingFetch(), + InitiallyFailingWriter(10), + read_from_dict, + swap, + CallCountingCleanup(), + True, + 12, + "", + swapped_data(), + 10, + 9, + id="repeated failure case" + ), + pytest.param( + False, + CallCountingFetch(), + InitiallyFailingWriter(10), + read_from_dict, + swap, + CallCountingCleanup(), + True, + 12, + "bad news", + "warn", + 10, + 9, + id="warning case" + ), + pytest.param( + False, + CallCountingFetch(), + write_to_dict, + InitiallyFailingReader(2), + swap, + CallCountingCleanup(), + False, + 1, + "", + "raise", + 1, + 1, + id="eager failure case" + ), + pytest.param( + True, + CallCountingFetch(), + write_to_dict, + read_from_dict, + None, + CallCountingCleanup(), + True, + 1, + "", + get_data(), + 0, + 0, + id="existing data case" + ), + ], +) +def test_call_caching( + existing, + fetch, + write, + read, + pre_write, + cleanup, + lazy, + num_tries, + failure_message, + expected, + expected_fetches, + expected_cleanups, +): + + dc = {} + if existing: + write(dc, fetch()) + write.count = 0 + fetch.count = 0 + + write_fn = partial(write, dc) + read_fn = partial(read, dc) + cleanup_fn = partial(cleanup, dc) + + fn = partial( + cu.call_caching, + fetch, + write_fn, + read_fn, + pre_write, + cleanup_fn, + lazy, + num_tries, + failure_message + ) + + if isinstance(expected, str) and expected == "raise": + with pytest.raises(ValueError): + fn() + assert not ("data" in dc) + elif isinstance(expected, str) and expected == "warn": + with pytest.warns(UserWarning) as warning: + fn() + assert re.match(f".*{failure_message}.*", str(warning.pop().message)) is not None + else: + pd.testing.assert_frame_equal(expected, fn(), check_like=True, check_dtype=False) + + assert expected_fetches == fetch.count + assert expected_cleanups == cleanup.count + + +@pytest.mark.parametrize("existing", [True, False]) +def test_one_file_call_caching(tmpdir_factory, existing): + tmpdir = str(tmpdir_factory.mktemp("foo")) + path = os.path.join(tmpdir, "baz.csv") + + getter = get_data + data = getter() + + if existing: + data.to_csv(path, index=False) + getter = lambda: "foo" + + obtained = cu.one_file_call_caching( + path, + getter, + lambda path, df: df.to_csv(path, index=False), + lambda path: pd.read_csv(path), + num_tries=2 + ) + + pd.testing.assert_frame_equal(get_data(), obtained, check_like=True, check_dtype=False) diff --git a/test/api/test_cell_types_api.py b/test/api/test_cell_types_api.py new file mode 100644 index 0000000000..dc520c3b08 --- /dev/null +++ b/test/api/test_cell_types_api.py @@ -0,0 +1,151 @@ +import pytest, os +from mock import patch, mock_open, MagicMock +from allensdk.api.queries.cell_types_api import CellTypesApi + +@pytest.fixture +def mock_cells_api(): + return [ + { + 'cell_reporter_status': "fish", + 'csl__x': 1, + 'csl__y': 2, + 'csl__z': 3, + 'donor__species': 'taco', + 'specimen__id': 10, + 'specimen__name': 'joe', + 'structure__layer': 'fifteen', + 'structure_parent__id': 2, + 'structure_parent__acronym': 'ASAP', + 'line_name': 'bezier', + 'tag__dendrite_type': 'spikey', + 'tag__apical': 'stumpy', + 'nr__reconstruction_type': 'fancy', + 'donor__disease_state': 'influenza', + 'donor__id': 1, + 'specimen__hemisphere': 'hi', + 'csl__normalized_depth': 1 + },{ + + 'cell_reporter_status': "nofish", + 'csl__x': 1, + 'csl__y': 2, + 'csl__z': 3, + 'donor__species': 'taco', + 'specimen__id': 10, + 'specimen__name': 'joe', + 'structure__layer': 'fifteen', + 'structure_parent__id': 2, + 'structure_parent__acronym': 'ASAP', + 'line_name': 'bezier', + 'tag__dendrite_type': 'spikey', + 'tag__apical': 'stumpy', + 'nr__reconstruction_type': None, + 'donor__disease_state': None, + 'donor__id': 1, + 'specimen__hemisphere': 'hi', + 'csl__normalized_depth': 1 + } + ] + + +@pytest.fixture +def mock_cells(): + return [ + { + 'specimen_tags': [], + 'neuron_reconstructions': [], + 'data_sets': [], + 'donor': { + 'transgenic_lines': [], + 'organism': { 'name': CellTypesApi.MOUSE }, + 'conditions': [ { 'name': 'disease categories - influenza' } ] + } + }, + { + 'specimen_tags': [], + 'neuron_reconstructions': [], + 'data_sets': [ {} ], + 'donor': { + 'transgenic_lines': [ { 'transgenic_line_type_name': 'driver', 'name': 'fish' } ], + 'organism': { 'name': 'fish' } + } + }, + { + 'specimen_tags': [], + 'neuron_reconstructions': [ {} ], + 'data_sets': [], + 'cell_reporter': { 'name': 'bob' }, + 'donor': { + 'transgenic_lines': [], + 'organism': { 'name': CellTypesApi.HUMAN }, + 'conditions': [ { 'name': 'disease categories - cheese' } ] + } + }, + ] + +@pytest.fixture +def cell_types_api(): + endpoint = None + + if 'TEST_API_ENDPOINT' in os.environ: + endpoint = os.environ['TEST_API_ENDPOINT'] + return CellTypesApi(endpoint) + else: + return None + + +@pytest.mark.requires_api_endpoint +def test_list_cells_unmocked(cell_types_api): + from allensdk.config import enable_console_log + enable_console_log() + + # this test will always require the latest warehouse + cells = cell_types_api.list_cells() + + +def test_list_cells_mocked(mock_cells): + with patch.object(CellTypesApi, "model_query", return_value=mock_cells): + ctapi = CellTypesApi() + + cells = ctapi.list_cells() + assert len(cells) == 3 + + flu_cells = [ cell for cell in cells if cell['disease_categories'] == [('influenza')] ] + assert len(flu_cells) == 1 + + cells = ctapi.list_cells(require_reconstruction=True) + assert len(cells) == 1 + + cells = ctapi.list_cells(require_morphology=True) + assert len(cells) == 1 + + cells = ctapi.list_cells(reporter_status=['bob']) + assert len(cells) == 1 + + cells = ctapi.list_cells(species=['HOMO SAPIENS']) + assert len(cells) == 1 + + cells = ctapi.list_cells(species=['mus musculus']) + assert len(cells) == 1 + +def test_list_cells_api_mocked(mock_cells_api): + with patch.object(CellTypesApi, "model_query", return_value=mock_cells_api): + ctapi = CellTypesApi() + + cells = ctapi.list_cells_api() + assert len(cells) == 2 + + fcells = ctapi.filter_cells_api(cells, require_reconstruction=True) + assert len(fcells) == 1 + + fcells = ctapi.filter_cells_api(cells, require_morphology=True) + assert len(fcells) == 1 + + fcells = ctapi.filter_cells_api(cells, species=['taco']) + assert len(fcells) == 2 + + fcells = ctapi.filter_cells_api(cells, reporter_status=['fish']) + assert len(fcells) == 1 + + + diff --git a/test/api/test_file_download.py b/test/api/test_file_download.py new file mode 100644 index 0000000000..3241bba1be --- /dev/null +++ b/test/api/test_file_download.py @@ -0,0 +1,228 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import Mock, patch +from allensdk.api.warehouse_cache.cache import cacheable, Cache +from allensdk.config.manifest import Manifest +import allensdk.core.json_utilities as ju +import pandas.io.json as pj +import pandas as pd +from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi as MCA + + +try: + import StringIO +except: + import io as StringIO + + +@pytest.fixture +def mca(): + return MCA() + + +@pytest.fixture +def cache(): + return Cache() + + +@pytest.mark.parametrize("file_exists", (True, False)) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch.object(Manifest, 'safe_mkdir') +def test_file_download_lazy(nrrd_read, safe_mkdir, mca, cache, file_exists): + with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: + @cacheable(strategy='lazy', + reader=nrrd_read, + pathfinder=Cache.pathfinder(file_name_position=3, + secondary_file_name_position=1)) + def download_volumetric_data(data_path, + file_name, + voxel_resolution=None, + save_file_path=None, + release=None, + coordinate_framework=None): + url = mca.build_volumetric_data_download_url(data_path, + file_name, + voxel_resolution, + release, + coordinate_framework) + + mca.retrieve_file_over_http(url, save_file_path) + + with patch('os.path.exists', + Mock(name="os.path.exists", + return_value=file_exists)) as mkdir: + nrrd_read.reset_mock() + download_volumetric_data(MCA.AVERAGE_TEMPLATE, + 'annotation_10.nrrd', + MCA.VOXEL_RESOLUTION_10_MICRONS, + 'volumetric.nrrd', + MCA.CCF_2016, + strategy='lazy') + + if file_exists: + assert not mock_retrieve.called, 'server call not needed when file exists' + else: + mock_retrieve.assert_called_once_with( + 'http://download.alleninstitute.org/informatics-archive/annotation/ccf_2016/mouse_ccf/average_template/annotation_10.nrrd', + 'volumetric.nrrd') + assert not safe_mkdir.called, 'safe_mkdir should not have been called.' + nrrd_read.assert_called_once_with('volumetric.nrrd') + + +@pytest.mark.parametrize("file_exists", (True, False)) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch.object(Manifest, 'safe_mkdir') +def test_file_download_server(nrrd_read, safe_mkdir, mca, cache, file_exists): + with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: + @cacheable(reader=nrrd_read, + pathfinder=Cache.pathfinder(file_name_position=3, + secondary_file_name_position=1)) + def download_volumetric_data(data_path, + file_name, + voxel_resolution=None, + save_file_path=None, + release=None, + coordinate_framework=None): + url = mca.build_volumetric_data_download_url(data_path, + file_name, + voxel_resolution, + release, + coordinate_framework) + + mca.retrieve_file_over_http(url, save_file_path) + + with patch('os.path.exists', + Mock(name="os.path.exists", + return_value=file_exists)) as mkdir: + nrrd_read.reset_mock() + + download_volumetric_data(MCA.AVERAGE_TEMPLATE, + 'annotation_10.nrrd', + MCA.VOXEL_RESOLUTION_10_MICRONS, + 'volumetric.nrrd', + MCA.CCF_2016, + strategy='create') + + mock_retrieve.assert_called_once_with( + 'http://download.alleninstitute.org/informatics-archive/annotation/ccf_2016/mouse_ccf/average_template/annotation_10.nrrd', + 'volumetric.nrrd') + assert not safe_mkdir.called, 'safe_mkdir should not have been called.' + nrrd_read.assert_called_once_with('volumetric.nrrd') + + +@pytest.mark.parametrize("file_exists", (True, False)) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch.object(Manifest, 'safe_mkdir') +def test_file_download_cached_file(nrrd_read, safe_mkdir, mca, cache, file_exists): + with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: + @cacheable(reader=nrrd_read, + pathfinder=Cache.pathfinder(file_name_position=3, + secondary_file_name_position=1)) + def download_volumetric_data(data_path, + file_name, + voxel_resolution=None, + save_file_path=None, + release=None, + coordinate_framework=None): + url = mca.build_volumetric_data_download_url(data_path, + file_name, + voxel_resolution, + release, + coordinate_framework) + + mca.retrieve_file_over_http(url, save_file_path) + + with patch('os.path.exists', + Mock(name="os.path.exists", + return_value=file_exists)) as mkdir: + nrrd_read.reset_mock() + + download_volumetric_data(MCA.AVERAGE_TEMPLATE, + 'annotation_10.nrrd', + MCA.VOXEL_RESOLUTION_10_MICRONS, + 'volumetric.nrrd', + MCA.CCF_2016, + strategy='file') + + assert not mock_retrieve.called, 'server should not have been called' + assert not safe_mkdir.called, 'safe_mkdir should not have been called.' + nrrd_read.assert_called_once_with('volumetric.nrrd') + + +@pytest.mark.parametrize("file_exists", (True, False)) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch.object(Manifest, 'safe_mkdir') +def test_file_kwarg(nrrd_read, safe_mkdir, mca, cache, file_exists): + with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: + @cacheable(reader=nrrd_read, + pathfinder=Cache.pathfinder(file_name_position=3, + secondary_file_name_position=1, + path_keyword='save_file_path')) + def download_volumetric_data(data_path, + file_name, + voxel_resolution=None, + save_file_path=None, + release=None, + coordinate_framework=None): + url = mca.build_volumetric_data_download_url(data_path, + file_name, + voxel_resolution, + release, + coordinate_framework) + + mca.retrieve_file_over_http(url, save_file_path) + + with patch('os.path.exists', + Mock(name="os.path.exists", + return_value=file_exists)) as mkdir: + nrrd_read.reset_mock() + + download_volumetric_data(MCA.AVERAGE_TEMPLATE, + 'annotation_10.nrrd', + MCA.VOXEL_RESOLUTION_10_MICRONS, + 'volumetric.nrrd', + MCA.CCF_2016, + strategy='file', + save_file_path='file.nrrd' ) + + assert not mock_retrieve.called, 'server should not have been called' + assert not safe_mkdir.called, 'safe_mkdir should not have been called.' + nrrd_read.assert_called_once_with('file.nrrd') diff --git a/test/api/test_glif_api.py b/test/api/test_glif_api.py new file mode 100644 index 0000000000..1d464040de --- /dev/null +++ b/test/api/test_glif_api.py @@ -0,0 +1,131 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.api.queries.glif_api import GlifApi +import numpy as np +import pytest +import os + + +@pytest.fixture +def neuronal_model_id(): + return 566283950 + + +@pytest.fixture +def specimen_id(): + return 325464516 + + +@pytest.fixture +def glif_api(): + endpoint = None + + if 'TEST_API_ENDPOINT' in os.environ: + endpoint = os.environ['TEST_API_ENDPOINT'] + return GlifApi(endpoint) + else: + return None + + +@pytest.mark.requires_api_endpoint +@pytest.mark.todo_flaky +def test_get_neuronal_model_templates(glif_api): + + assert len(glif_api.get_neuronal_model_templates()) == 7 + + for template in glif_api.get_neuronal_model_templates(): + + if template['id'] == 329230710: + assert 'perisomatic' in template['name'] + elif template['id'] == 395310498: + assert '(LIF-R-ASC-A)' in template['name'] + elif template['id'] == 395310469: + assert '(LIF)' in template['name'] + elif template['id'] == 395310475: + assert '(LIF-ASC)' in template['name'] + elif template['id'] == 395310479: + assert '(LIF-R)' in template['name'] + elif template['id'] == 471355161: + assert '(LIF-R-ASC)' in template['name'] + elif template['id'] == 491455321: + assert 'Biophysical - all active' in template['name'] + else: + raise Exception('Unrecognized template: %s (%s)' % (template['id'], template['name'])) + + +@pytest.mark.requires_api_endpoint +def test_get_neuronal_models(glif_api, specimen_id): + + cells = glif_api.get_neuronal_models([specimen_id]) + + assert len(cells) == 1 + assert len(cells[0]['neuronal_models']) == 2 + +@pytest.mark.requires_api_endpoint +def test_get_neuronal_models_no_ids(glif_api): + cells = glif_api.get_neuronal_models() + assert len(cells) > 0 + + +@pytest.mark.requires_api_endpoint +def test_get_neuron_configs(glif_api, specimen_id): + model = glif_api.get_neuronal_models([specimen_id]) + + neuronal_model_ids = [nm['id'] for nm in model[0]['neuronal_models']] + assert set(neuronal_model_ids) == set((566283950, 566283946)) + + test_id = 566283950 + + np.testing.assert_almost_equal(glif_api.get_neuron_configs([test_id])[test_id]['th_inf'], 0.024561992461740227) + +@pytest.mark.requires_api_endpoint +@pytest.mark.todo_flaky +def test_deprecated(fn_temp_dir, glif_api, neuronal_model_id): + + # Exercising deprecated functionality + len(glif_api.list_neuronal_models()) + + glif_api.get_neuronal_model(neuronal_model_id) + + glif_api.get_neuronal_model(neuronal_model_id) + print(glif_api.get_ephys_sweeps()) + + glif_api.get_neuronal_model(neuronal_model_id) + x = glif_api.get_neuron_config() + + nwb_path = os.path.join(fn_temp_dir, 'tmp.nwb') + glif_api.get_neuronal_model(neuronal_model_id) + glif_api.cache_stimulus_file(nwb_path) diff --git a/test/api/test_grid_data_api.py b/test/api/test_grid_data_api.py new file mode 100644 index 0000000000..ad0f9078da --- /dev/null +++ b/test/api/test_grid_data_api.py @@ -0,0 +1,163 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import MagicMock, patch +from allensdk.api.queries.grid_data_api import GridDataApi + + +@pytest.fixture +def grid_data(): + gda = GridDataApi() + gda.retrieve_file_over_http = \ + MagicMock(name='retrieve_file_over_http') + + return gda + + +def test_download_gene_expression_grid_data(grid_data): + + path = '69816930/density.mhd' + section_data_set_id = 69816930 + volume_type = 'density' + + grid_data.download_gene_expression_grid_data(section_data_set_id, volume_type, path) + expected = 'http://api.brain-map.org/grid_data/download/69816930?include=density' + grid_data.retrieve_file_over_http.assert_called_once_with(expected, path, zipped=True) + + +def test_api_doc_url_download_expression_grid(grid_data): + '''Url to download the 200um density volume + for the Mouse Brain Atlas SectionDataSet 69816930. + + Notes + ----- + See `Downloading 3-D Expression Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DEXPRESSIONGRIDDATA>`_ + , example 'Download the 200um density volume for the Mouse Brain Atlas SectionDataSet 69816930'. + ''' + path = '69816930.zip' + section_data_set_id = 69816930 + grid_data.download_expression_grid_data(section_data_set_id) + expected = 'http://api.brain-map.org/grid_data/download/69816930' + grid_data.retrieve_file_over_http.assert_called_once_with(expected, path) + + +def test_api_doc_url_download_expression_grid_energy_intensity(grid_data): + '''Url to download the 200um energy and intensity volumes for Mouse Brain Atlas SectionDataSet 69816930. + + Notes + ----- + See `Downloading 3-D Expression Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DEXPRESSIONGRIDDATA>`_ + , example 'Download the 200um energy and intensity volumes for Mouse Brain Atlas SectionDataSet 69816930'. + + The id in the example url doesn't match the caption. + ''' + path = '183282970.zip' + section_data_set_id = 183282970 + include = ['energy', 'intensity'] + grid_data.download_expression_grid_data(section_data_set_id, + include=include) + + grid_data.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/grid_data/download/183282970" + "?include=energy,intensity", + path) + + +def test_api_doc_url_projection_grid(grid_data): + '''Url to download the 100um density volume for the Mouse Connectivity Atlas SectionDataSet 181777177. + + Notes + ----- + See `Downloading 3-D Projection Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DPROJECTIONGRIDDATA>`_ + , example 'Download the 100um density volume for the Mouse Connectivity Atlas SectionDataSet 181777177'. + ''' + path = '181777177.nrrd' + section_data_set_id = 181777177 + grid_data.download_projection_grid_data(section_data_set_id) + expected = 'http://api.brain-map.org/grid_data/download_file/181777177' + grid_data.retrieve_file_over_http.assert_called_once_with(expected, path) + + +def test_api_doc_url_projection_grid_injection_fraction_resolution(grid_data): + '''Url to download the 25um injection_fraction volume for Mouse Connectivity Atlas SectionDataSet 181777177. + + Notes + ----- + See `Downloading 3-D Projection Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DPROJECTIONGRIDDATA>`_ + , example 'Download the 25um injection_fraction volume for Mouse Connectivity Atlas SectionDataSet 181777177'. + ''' + section_data_set_id = 181777177 + path = 'id.nrrd' + grid_data.download_projection_grid_data(section_data_set_id, + [grid_data.INJECTION_FRACTION], + resolution=25, + save_file_path=path) + + grid_data.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/grid_data/download_file/181777177" + "?image=injection_fraction&resolution=25", + path) + + +def test_download_deformation_field(grid_data): + grid_data.model_query = MagicMock( + name='model_query', + return_value=[ + {'well_known_file_type': {'name': 'DeformationFieldHeader'}, 'id': 123}, + {'well_known_file_type': {'name': 'DeformationFieldVoxels'}, 'id': 456} + ] + ) + + grid_data.download_deformation_field(789) + + grid_data.retrieve_file_over_http.assert_any_call('http://api.brain-map.org/api/v2/well_known_file_download/123', '789_dfmfld.mhd') + grid_data.retrieve_file_over_http.assert_any_call('http://api.brain-map.org/api/v2/well_known_file_download/456', '789_dfmfld.raw') + + +def test_download_alignment3d(grid_data): + grid_data.json_msg_query = MagicMock( + name='json_msg_query', + return_value=[{'alignment3d': 'foo'}] + ) + + obtained = grid_data.download_alignment3d(123) + assert 'foo' == obtained + grid_data.json_msg_query.assert_called_once_with(( + 'http://api.brain-map.org/api/v2/data/query.json?q=' + 'model::SectionDataSet[id$eq123],' + 'rma::include,alignment3d,' + 'rma::options[num_rows$eq\'all\'][count$eqfalse]' + )) diff --git a/test/api/test_image_download_api.py b/test/api/test_image_download_api.py new file mode 100644 index 0000000000..a5cee52ce7 --- /dev/null +++ b/test/api/test_image_download_api.py @@ -0,0 +1,611 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import MagicMock +import numpy as np +from allensdk.api.queries.image_download_api import ImageDownloadApi + + +@pytest.fixture +def image_api(): + image_api = ImageDownloadApi() + + image_api.retrieve_file_over_http = \ + MagicMock(name='retrieve_file_over_http') + image_api.json_msg_query = MagicMock(name='json_msg_query') + + return image_api + +def test_get_section_image_ranges(image_api): + + section_image_ids = [126862575, 297225768] + image_api.get_section_image_ranges(section_image_ids) + + image_api.json_msg_query.assert_called_once_with('http://api.brain-map.org/api/v2/data/query.json?q=model::Equalization,' + 'rma::criteria,section_data_set(section_images[id$in126862575,297225768]),' + 'rma::options[only$eq\'blue_lower,blue_upper,red_lower,red_upper,green_lower,green_upper\']' + '[num_rows$eq\'all\'][count$eqfalse]') + +def test_get_section_data_sets_by_product(image_api): + + product_ids = [10, 22] + image_api.get_section_data_sets_by_product(product_ids) + + image_api.json_msg_query.assert_called_once_with('http://api.brain-map.org/api/v2/data/query.json?'\ + 'q=model::SectionDataSet,'\ + 'rma::criteria,[failed$in\'false\'],products[id$in10,22],'\ + 'rma::options[num_rows$eq\'all\'][count$eqfalse]') + +def test_get_section_data_sets_by_product_failedok(image_api): + + product_ids = [10, 22] + image_api.get_section_data_sets_by_product(product_ids, include_failed=True) + + image_api.json_msg_query.assert_called_once_with('http://api.brain-map.org/api/v2/data/query.json?'\ + 'q=model::SectionDataSet,'\ + 'rma::criteria,[failed$in\'false\',\'true\'],products[id$in10,22],'\ + 'rma::options[num_rows$eq\'all\'][count$eqfalse]') + +def test_get_section_image_ranges_as_list(image_api): + + image_api.template_query = MagicMock(return_value=[{'blue_lower': 0, 'blue_upper': 1, 'green_lower': 2, 'green_upper': 3, 'red_lower': 4, 'red_upper': 5}]) + obt = image_api.get_section_image_ranges([1]) + + assert(np.allclose( [4, 5, 2, 3, 0, 1], obt[0] )) + +def test_api_doc_url_download_section_image_downsampled(image_api): + ''' + Notes + ----- + See: `Experimental Overview and Metadata `<http://help.brain-map.org/display/mouseconnectivity/API#API-ExperimentalOverviewandMetadata>_ + , link labeled 'Download image downsampled by factor of 6 using default thresholds'. + ''' + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + range=[0, 932, 0, 1279, 0, 4095]) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&range=0,932,0,1279,0,4095", + path) + + +def test_api_doc_url_download_section_image_downsample_dimensions(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + downsample_dimensions=True) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&downsample_dimensions=true", + path) + + +def test_api_doc_url_download_section_image_full_res(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575", + path) + + +def test_api_doc_url_download_section_image_downsample_dimensions_false(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + downsample_dimensions=False) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&downsample_dimensions=false", + path) + + +def test_api_doc_url_download_section_image_downsampled_low_quality(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=3, + quality=50) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=3&quality=50", + path) + + +def test_api_doc_url_download_section_image_tumor_feature_annotation(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + tumor_feature_annotation=True) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&tumor_feature_annotation=true", + path) + + +def test_api_doc_url_download_section_image_tumor_feature_annotation_false(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + tumor_feature_annotation=False) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&tumor_feature_annotation=false", + path) + + +def test_api_doc_url_download_section_image_tumor_feature_boundary(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + tumor_feature_boundary=True) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&tumor_feature_boundary=true", + path) + + +def test_api_doc_url_download_section_image_tumor_feature_boundary_false(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + tumor_feature_boundary=False) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&tumor_feature_boundary=false", + path) + + +def test_api_doc_url_download_section_image_expression(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + expression=True) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&expression=true", + path) + + +def test_api_doc_url_download_section_image_expression_false(image_api): + path = '126862575.jpg' + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + downsample=6, + expression=False) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/126862575" + "?downsample=6&expression=false", + path) + + +def test_api_doc_url_download_atlas_image_downsampled(image_api): + path = '100883869.jpg' + + section_image_id = 100883869 + image_api.download_atlas_image(section_image_id, + downsample=4) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/atlas_image_download/100883869" + "?downsample=4", + path) + + +def test_api_doc_url_download_atlas_image_downsampled_low_quality(image_api): + path = '100883869.jpg' + + section_image_id = 100883869 + image_api.download_atlas_image(section_image_id, + downsample=4, + quality=50) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/atlas_image_download/100883869" + "?downsample=4&quality=50", + path) + + +def test_api_doc_url_download_atlas_image_annotation(image_api): + path = '100883869.jpg' + + section_image_id = 100883869 + image_api.download_atlas_image(section_image_id, + downsample=4, + annotation=True) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/atlas_image_download/100883869" + "?downsample=4&annotation=true", + path) + + +def test_api_doc_url_download_atlas_image_annotation_false(image_api): + path = '100883869.jpg' + + section_image_id = 100883869 + image_api.download_atlas_image(section_image_id, + downsample=4, + annotation=False) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/atlas_image_download/100883869" + "?downsample=4&annotation=false", + path) + + +def test_api_doc_url_download_atlas_image_atlas(image_api): + path = '100883869.jpg' + + section_image_id = 100883869 + image_api.download_atlas_image(section_image_id, + downsample=4, + annotation=True, + atlas=2) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/atlas_image_download/100883869" + "?downsample=4&annotation=true&atlas=2", + path) + + +def test_api_doc_url_download_atlas_full_resolution_region_of_interest(image_api): + path = '100883869.jpg' + + subimage_id = 100883869 + image_api.download_atlas_image(subimage_id, + left=6174, + top=2282, + width=1000, + height=1000) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/atlas_image_download/100883869" + "?left=6174&top=2282&width=1000&height=1000", + path) + + +def test_api_doc_url_download_projection_image_downsampled(image_api): + path = '126862583.jpg' + + section_image_id = 126862583 + image_api.download_projection_image(section_image_id, + downsample=4) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/projection_image_download/126862583" + "?downsample=4", + path) + + +def test_api_doc_url_download_projection_image_projection(image_api): + path = '126862583.jpg' + + section_image_id = 126862583 + image_api.download_projection_image(section_image_id, + downsample=4, + projection=True) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/projection_image_download/126862583" + "?downsample=4&projection=true", + path) + + +def test_api_doc_url_download_projection_image_projection_false(image_api): + path = '126862583.jpg' + + section_image_id = 126862583 + image_api.download_projection_image(section_image_id, + downsample=4, + projection=False) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/projection_image_download/126862583" + "?downsample=4&projection=false", + path) + + +def test_api_doc_url_download_projection_image_view(image_api): + path = '126862583.jpg' + + section_image_id = 126862583 + image_api.download_projection_image(section_image_id, + downsample=4, + view='projection') + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/projection_image_download/126862583" + "?downsample=4&view=projection", + path) + + +def test_api_doc_url_download_projection_image_view_exception(image_api): + path = '126862583.jpg' + + section_image_id = 126862583 + + with pytest.raises(ValueError) as excinfo: + image_api.download_projection_image(section_image_id, + downsample=4, + view='typo') + + assert excinfo.value.args[0] == "view argument should be 'expression', 'projection', 'tumor_feature_annotation' or 'tumor_feature_boundary'" + + +def test_api_doc_url_download_image_downsampled(image_api): + ''' + Notes + ----- + See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ + ''' + path = '69750516.jpg' + + subimage_id = 69750516 + image_api.download_image(subimage_id, + downsample=4) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/image_download/69750516" + "?downsample=4", + path) + + +def test_api_doc_url_download_image_downsampled_low_quality(image_api): + ''' + Notes + ----- + See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ + ''' + path = '69750516.jpg' + + subimage_id = 69750516 + image_api.download_image(subimage_id, + downsample=3, + quality=50) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/image_download/69750516" + "?downsample=3&quality=50", + path) + + +def test_api_doc_url_download_full_resolution_region_of_interest(image_api): + ''' + Notes + ----- + See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ + ''' + path = '69750516.jpg' + + subimage_id = 69750516 + image_api.download_image(subimage_id, + left=6174, + top=2282, + width=1000, + height=1000) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/image_download/69750516" + "?left=6174&top=2282&width=1000&height=1000", + path) + + +def test_api_doc_url_download_image_expression_mask(image_api): + ''' + Notes + ----- + See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ + ''' + path = '69750516.jpg' + + subimage_id = 69750516 + image_api.download_image(subimage_id, + downsample=4, + view='expression') + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/image_download/69750516" + "?downsample=4&view=expression", + path) + + +def test_api_doc_url_download_image_full_resolution(image_api): + ''' + Notes + ----- + See: `Experimental Overview and Metadata `<http://help.brain-map.org/display/mouseconnectivity/API#API-ExperimentalOverviewandMetadata>_ + , link labeled 'Download a region of interest at full resolution using default thresholds'. + ''' + expected = 'http://api.brain-map.org/api/v2/section_image_download/126862575?range=0,932,0,1279,0,4095&left=19045&top=11684&width=1000&height=1000' + path = '126862575.jpg' + + image_api.retrieve_file_over_http = \ + MagicMock(name='retrieve_file_over_http') + + section_image_id = 126862575 + image_api.download_section_image(section_image_id, + left=19045, + top=11684, + width=1000, + height=1000, + range=[0, 932, 0, 1279, 0, 4095]) + + image_api.retrieve_file_over_http.assert_called_once_with(expected, path) + + +def test_colormap_filter(image_api): + ''' + ''' + path = '70636013.jpg' + + section_image_id = 70636013 + image_api.download_section_image(section_image_id, + downsample=4, + view='expression', + colormap=(0.9,"expression")) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/70636013" + "?downsample=4&colormap=0.5,0.9,0,256,4&view=expression", + path) + + +def test_colormap_filter_string(image_api): + ''' + ''' + path = '70636013.jpg' + + section_image_id = 70636013 + image_api.download_section_image(section_image_id, + downsample=4, + view='expression', + colormap="expression") + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/70636013" + "?downsample=4&colormap=expression&view=expression", + path) + + + +def test_rgb_filter(image_api): + ''' + ''' + path = '70636013.jpg' + + section_image_id = 70636013 + image_api.download_section_image(section_image_id, + downsample=4, + view='expression', + rgb=[0.25,0.5,1]) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/70636013" + "?downsample=4&rgb=0.25,0.5,1&view=expression", + path) + + +def test_contrast_filter(image_api): + ''' + ''' + path = '70636013.jpg' + + section_image_id = 70636013 + image_api.download_section_image(section_image_id, + downsample=4, + view='expression', + contrast=[0.5,1]) + + image_api.retrieve_file_over_http.assert_called_once_with( + "http://api.brain-map.org/api/v2/section_image_download/70636013" + "?downsample=4&contrast=0.5,1&view=expression", + path) + + +def test_atlas_image_query(image_api): + expected = "http://api.brain-map.org/api/v2/data/query.json?q=" + \ + "model::Atlas,rma::criteria,[id$eq1]," + \ + "rma::options[only$eqimage_type]," + \ + "pipe::list[type_name$is'image_type']," + \ + "model::AtlasImage,rma::criteria,[annotated$eqtrue]," + \ + "atlas_data_set(atlases[id$eq1])," + \ + "alternate_images[image_type$eq$type_name]," + \ + "rma::options[num_rows$eq'all']" + \ + "[order$eqsub_images.section_number]" + + adult_mouse_atlas_id = 1 + image_api.atlas_image_query(adult_mouse_atlas_id) + + image_api.json_msg_query.assert_called_once_with(expected) + + +def test_atlas_image_query_image_type_name(image_api): + expected = "http://api.brain-map.org/api/v2/data/query.json?q=" + \ + "model::AtlasImage,rma::criteria,[annotated$eqtrue]," + \ + "atlas_data_set(atlases[id$eq1])," + \ + "alternate_images[image_type$eq'Atlas - Adult Mouse']," + \ + "rma::options[num_rows$eq'all']" + \ + "[order$eqsub_images.section_number]" + + adult_mouse_atlas_id = 1 + adult_mouse_image_type_name = 'Atlas - Adult Mouse' + image_api.atlas_image_query(adult_mouse_atlas_id, + image_type_name=adult_mouse_image_type_name) + + image_api.json_msg_query.assert_called_once_with(expected) + + +def test_section_image_query(image_api): + + exp = 'http://api.brain-map.org/api/v2/data/query.json?'\ + 'q=model::SectionImage,'\ + 'rma::criteria,[data_set_id$eq70813257],'\ + 'rma::options[num_rows$eq\'all\'][count$eqfalse]' + + image_api.section_image_query(70813257) + image_api.json_msg_query.assert_called_once_with(exp) diff --git a/test/api/test_mouse_atlas_api.py b/test/api/test_mouse_atlas_api.py new file mode 100644 index 0000000000..61f7992fa0 --- /dev/null +++ b/test/api/test_mouse_atlas_api.py @@ -0,0 +1,103 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2018. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from mock import MagicMock, patch +import pytest + +from allensdk.api.queries.mouse_atlas_api import MouseAtlasApi as MAA + + + +@pytest.fixture +def atlas(): + maa = MAA() + return maa + + +@patch.object(MAA, "json_msg_query") +def test_get_genes(mock_query, atlas): + + expected = 'http://api.brain-map.org/api/v2/data/query.json?'\ + 'q=model::Gene,rma::criteria,[organism_id$in2],rma::include,chromosome,'\ + 'rma::options[num_rows$eq2000][start_row$eq0][order$eq\'id\'][count$eqfalse]' + + for result in atlas.get_genes(): + pass + + mock_query.assert_called_once_with(expected) + + +@patch.object(MAA, "json_msg_query") +def test_get_section_data_sets(mock_query, atlas): + + expected = 'http://api.brain-map.org/api/v2/data/query.json?'\ + 'q=model::SectionDataSet,rma::criteria,products[id$in1],rma::include,genes,'\ + 'rma::options[num_rows$eq2000][start_row$eq0][order$eq\'id\'][count$eqfalse]' + + for result in atlas.get_section_data_sets(): + pass + + mock_query.assert_called_once_with(expected) + + +def test_download_expression_density(atlas): + with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: + with pytest.raises(RuntimeError): + atlas.download_expression_density('file.name', 12345) + + gda.assert_called_once_with( + 'http://api.brain-map.org/grid_data/download/'\ + '12345?include=density') + + +def test_download_expression_intensity(atlas): + with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: + with pytest.raises(RuntimeError): + atlas.download_expression_intensity('file.name', 12345) + + gda.assert_called_once_with( + 'http://api.brain-map.org/grid_data/download/'\ + '12345?include=intensity') + + +def test_download_expression_energy(atlas): + with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: + with pytest.raises(RuntimeError): + atlas.download_expression_energy('file.name', 12345) + + gda.assert_called_once_with( + 'http://api.brain-map.org/grid_data/download/'\ + '12345?include=energy') diff --git a/test/api/test_mouse_connectivity_api.py b/test/api/test_mouse_connectivity_api.py new file mode 100644 index 0000000000..8df26e1a6c --- /dev/null +++ b/test/api/test_mouse_connectivity_api.py @@ -0,0 +1,461 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import pytest +from mock import patch, Mock +import itertools as it +import numpy as np +from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi as MCA + +MOCK_ANNOTATION_DATA = 'mock_annotation_data' +MOCK_ANNOTATION_IMAGE = 'mock_annotation_image' +DOWNLOAD_LINK = '/path/to/link' + + +@pytest.fixture +def connectivity(): + mca = MCA() + + return mca + + +def CCF_VERSIONS(): + return [MCA.CCF_2015, + MCA.CCF_2016] + + +def DATA_PATHS(): + return [MCA.AVERAGE_TEMPLATE, + MCA.ARA_NISSL, + MCA.MOUSE_2011, + MCA.DEVMOUSE_2012, + MCA.CCF_2015, + MCA.CCF_2016] + + +def RESOLUTIONS(): + return [MCA.VOXEL_RESOLUTION_10_MICRONS, + MCA.VOXEL_RESOLUTION_25_MICRONS, + MCA.VOXEL_RESOLUTION_50_MICRONS, + MCA.VOXEL_RESOLUTION_100_MICRONS] + + +@pytest.mark.parametrize("data_path,resolution", + it.product(DATA_PATHS(), + RESOLUTIONS())) +@patch.object(MCA, "retrieve_file_over_http") +def test_download_volumetric_data(mock_retrieve, + connectivity, + data_path, + resolution): + cache_filename = "annotation_%d.nrrd" % (resolution) + + connectivity.download_volumetric_data(data_path, + cache_filename, + resolution) + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/%s/annotation_%d.nrrd" % + (data_path, + resolution), + cache_filename) + + +@pytest.mark.parametrize("ccf_version,resolution", + it.product(CCF_VERSIONS(), + RESOLUTIONS())) +@patch.object(MCA, "retrieve_file_over_http") +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_annotation_volume(os_makedirs, + nrrd_read, + mock_retrieve, + connectivity, + ccf_version, + resolution): + cache_file = '/path/to/annotation_%d.nrrd' % (resolution) + + connectivity.download_annotation_volume( + ccf_version, + resolution, + cache_file, + reader=nrrd_read) + + nrrd_read.assert_called_once_with(cache_file) + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/%s/annotation_%d.nrrd" % + (ccf_version, + resolution), + "/path/to/annotation_%d.nrrd" % (resolution)) + + os_makedirs.assert_any_call('/path/to') + + +@pytest.mark.parametrize("resolution", + RESOLUTIONS()) +@patch.object(MCA, "retrieve_file_over_http") +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_annotation_volume_default(os_makedirs, + nrrd_read, + mock_retrieve, + connectivity, + resolution): + a, b = connectivity.download_annotation_volume( + None, + resolution, + '/path/to/annotation_%d.nrrd' % (resolution), + reader=nrrd_read) + + assert a + assert b + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/%s/annotation_%d.nrrd" % + (MCA.CCF_VERSION_DEFAULT, + resolution), + "/path/to/annotation_%d.nrrd" % (resolution)) + + os_makedirs.assert_any_call('/path/to') + + +@pytest.mark.parametrize("resolution", + RESOLUTIONS()) +@patch.object(MCA, "retrieve_file_over_http") +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_structure_mask(os_makedirs, + nrrd_read, + mock_retrieve, + connectivity, + resolution): + + structure_id = 12 + + a, b = connectivity.download_structure_mask(structure_id, + None, + resolution,'/path/to/foo.nrrd', + reader=nrrd_read) + + assert a + assert b + + expected = 'http://download.alleninstitute.org/informatics-archive/'\ + 'current-release/mouse_ccf/{0}/structure_masks/'\ + 'structure_masks_{1}/structure_{2}.nrrd'.format(MCA.CCF_VERSION_DEFAULT, + resolution, + structure_id) + mock_retrieve.assert_called_once_with(expected, '/path/to/foo.nrrd') + os_makedirs.assert_any_call('/path/to') + + +@pytest.mark.parametrize("resolution", + RESOLUTIONS()) +@patch.object(MCA, "retrieve_file_over_http") +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_template_volume(os_makedirs, + nrrd_read, + mock_retrieve, + connectivity, + resolution): + connectivity.download_template_volume( + resolution, + '/path/to/average_template_%d.nrrd' % (resolution), + reader=nrrd_read) + + nrrd_read.assert_called_once_with('/path/to/average_template_%d.nrrd' % (resolution)) + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/average_template/average_template_%d.nrrd" % + (resolution), + "/path/to/average_template_%d.nrrd" % (resolution)) + + os_makedirs.assert_any_call('/path/to') + + +@patch.object(MCA, "json_msg_query") +def test_get_experiments_no_ids(mock_query, + connectivity): + connectivity.get_experiments(None) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::SectionDataSet,rma::criteria,[failed$eqfalse]," + "products[id$in5,31]") + + +@patch.object(MCA, "json_msg_query") +def test_get_experiments_one_id(mock_query, + connectivity): + connectivity.get_experiments(987) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::SectionDataSet,rma::criteria,[failed$eqfalse]," + "products[id$in5,31],[id$in987]") + + +@patch.object(MCA, "json_msg_query") +def test_get_experiments_ids(mock_query, + connectivity): + connectivity.get_experiments([9,8,7]) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::SectionDataSet,rma::criteria,[failed$eqfalse]," + "products[id$in5,31],[id$in9,8,7]") + + +@patch.object(MCA, "json_msg_query") +def test_get_manual_injection_summary(mock_query, + connectivity): + connectivity.get_manual_injection_summary(123) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::SectionDataSet,rma::criteria,[id$in123]," + "rma::include,specimen(donor(transgenic_mouse(transgenic_lines))," + "injections(structure,age)),equalization,products," + "rma::options[only$eqid,failed,storage_directory,red_lower,red_upper," + "green_lower,green_upper,blue_lower,blue_upper,products.id," + "specimen_id,structure_id,reference_space_id," + "primary_injection_structure_id,registration_point,coordinates_ap," + "coordinates_dv,coordinates_ml,angle,sex,strain,injection_materials," + "acronym,structures.name,days,transgenic_mice.name," + "transgenic_lines.name,transgenic_lines.description," + "transgenic_lines.id,donors.id]") + + +@patch.object(MCA, "json_msg_query") +def test_get_experiment_detail(mock_query, + connectivity): + connectivity.get_experiment_detail(123) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::SectionDataSet,rma::criteria,[id$eq123]," + "rma::include,specimen(stereotaxic_injections" + "(primary_injection_structure,structures," + "stereotaxic_injection_coordinates)),equalization,sub_images," + "rma::options[order$eq'sub_images.section_number$asc']") + + +@patch.object(MCA, "json_msg_query") +def test_get_projection_image_info(mock_query, + connectivity): + connectivity.get_projection_image_info(123, 456) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::SectionDataSet,rma::criteria,[id$eq123],rma::include," + "equalization,sub_images[section_number$eq456]") + + +def test_build_reference_aligned_channel_volumes_url(connectivity): + url = \ + connectivity.build_reference_aligned_image_channel_volumes_url(123456) + + assert url == ("http://api.brain-map.org/api/v2/data/query.json?q=" + "model::WellKnownFile,rma::criteria," + "well_known_file_type[name$eq'ImagesResampledTo25MicronARA']" + "[attachable_id$eq123456]") + + +@patch.object(MCA, "retrieve_file_over_http") +@patch.object(MCA, "do_query", return_value=DOWNLOAD_LINK) +def test_reference_aligned_channel_volumes(mock_query, + mock_retrieve, + connectivity): + connectivity.download_reference_aligned_image_channel_volumes(123456) + + mock_retrieve.assert_called_once_with( + "http://api.brain-map.org/path/to/link", + "123456.zip") + + +@patch.object(MCA, "json_msg_query") +def test_experiment_source_search(mock_query, + connectivity): + connectivity.experiment_source_search( + injection_structures='Isocortex', + primary_structure_only=True) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "service::mouse_connectivity_injection_structure" + "[injection_structures$eqIsocortex][primary_structure_only$eqtrue]") + + +@patch.object(MCA, "json_msg_query") +def test_experiment_spatial_search(mock_query, + connectivity): + connectivity.experiment_spatial_search( + seed_point=[6900,5050,6450]) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "service::mouse_connectivity_target_spatial" + "[seed_point$eq6900,5050,6450]") + + +@patch.object(MCA, "json_msg_query") +def test_injection_coordinate_search(mock_query, + connectivity): + connectivity.experiment_injection_coordinate_search( + seed_point=[6900,5050,6450]) + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "service::mouse_connectivity_injection_coordinate" + "[seed_point$eq6900,5050,6450]") + + +@patch.object(MCA, "json_msg_query") +def test_experiment_correlation_search(mock_query, + connectivity): + connectivity.experiment_correlation_search( + row=112670853, structure='TH') + + mock_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "service::mouse_connectivity_correlation" + "[row$eq112670853][structure$eqTH]") + + +@pytest.mark.parametrize("injection,hemisphere", + it.product([True, False,None], + [['left'],['right'],None])) +@patch.object(MCA, "json_msg_query") +def test_get_structure_unionizes(mock_query, + connectivity, + injection, + hemisphere): + connectivity.get_structure_unionizes( + experiment_ids=[126862385], + is_injection=injection, + hemisphere_ids=hemisphere, + include='structure') + + i = '' + + if injection is not None: + i = "[is_injection$eq%s]" % (str(injection).lower()) + + h = '' + + if hemisphere is not None: + h = "[hemisphere_id$in%s]" % (hemisphere[0]) + + mock_query.assert_called_once_with( + ("http://api.brain-map.org/api/v2/data/query.json?q=" + "model::ProjectionStructureUnionize,rma::criteria," + "[section_data_set_id$in126862385]%s%s," + "rma::include,structure,rma::options[num_rows$eq'all']" + "[count$eqfalse]") % (i, h)) + + +def test_download_injection_density(connectivity): + with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: + connectivity.download_injection_density( + 'file.name', 12345, 10) + + gda.assert_called_once_with( + "http://api.brain-map.org/grid_data/download_file/" + "12345" + "?image=injection_density&resolution=10", + "file.name") + + +def test_download_projection_density(connectivity): + with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: + connectivity.download_projection_density( + 'file.name', 12345, 10) + + gda.assert_called_once_with( + "http://api.brain-map.org/grid_data/download_file/" + "12345" + "?image=projection_density&resolution=10", + "file.name") + + +def test_download_data_mask_density(connectivity): + with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: + connectivity.download_data_mask( + 'file.name', 12345, 10) + + gda.assert_called_once_with( + "http://api.brain-map.org/grid_data/download_file/" + "12345" + "?image=data_mask&resolution=10", + "file.name") + + +def test_download_injection_fraction(connectivity): + with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: + connectivity.download_injection_fraction( + 'file.name', 12345, 10) + + gda.assert_called_once_with( + "http://api.brain-map.org/grid_data/download_file/" + "12345" + "?image=injection_fraction&resolution=10", + "file.name") + + +def test_calculate_injection_centroid(connectivity): + density = np.array(([1.0,1.0,1.0,1.0], + [1.0,1.0,1.0,1.0], + [1.0,1.0,1.0,1.0], + [1.0,1.0,1.0,1.0])) + fraction = np.array(([1.0,1.0,1.0,1.0], + [1.0,1.0,1.0,1.0], + [1.0,1.0,1.0,1.0], + [1.0,1.0,1.0,1.0])) + + centroid = connectivity.calculate_injection_centroid( + density, fraction, resolution=25) + + assert np.array_equal(centroid, [37.5, 37.5]) diff --git a/test/api/test_ontologies_api.py b/test/api/test_ontologies_api.py new file mode 100644 index 0000000000..bcf8bf4965 --- /dev/null +++ b/test/api/test_ontologies_api.py @@ -0,0 +1,217 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.api.queries.ontologies_api import OntologiesApi +import pandas as pd +from numpy import allclose +import pytest +from mock import patch + + +@pytest.fixture +def ontologies(): + return OntologiesApi() + + +@patch.object(OntologiesApi, "json_msg_query") +def test_get_structure_graph(mock_json_msg_query, ontologies): + structure_graph_id = 1 + ontologies.get_structures(structure_graph_id) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria,[graph_id$in1]," + "rma::options" + "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_list_structure_graphs(mock_json_msg_query, ontologies): + ontologies.get_structure_graphs() + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::StructureGraph," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_list_structure_sets_noarg(mock_json_msg_query, ontologies): + ontologies.get_structure_sets() + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::StructureSet,rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_list_structure_sets_args(mock_json_msg_query, ontologies): + ontologies.get_structure_sets([2, 3]) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::StructureSet,rma::criteria,[id$in2,3]," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_list_atlases(mock_json_msg_query, ontologies): + ontologies.get_atlases() + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Atlas,rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_structure_graph_by_name(mock_json_msg_query, ontologies): + ontologies.get_structures(structure_graph_names="'Mouse Brain Atlas'") + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "graph[structure_graphs.name$in'Mouse Brain Atlas']," + "rma::options" + "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_structure_graphs_by_names(mock_json_msg_query, ontologies): + ontologies.get_structures(structure_graph_names=["'Mouse Brain Atlas'", + "'Human Brain Atlas'"]) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "graph[structure_graphs.name$in'Mouse Brain Atlas'," + "'Human Brain Atlas']," + "rma::options" + "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_structure_set_by_id(mock_json_msg_query, ontologies): + ontologies.get_structures(structure_set_ids=8) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria,[structure_set_id$in8]," + "rma::options" + "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_structure_sets_by_ids(mock_json_msg_query, ontologies): + ontologies.get_structures(structure_set_ids=[7, 8]) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria,[structure_set_id$in7,8]," + "rma::options" + "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_structure_set_by_name(mock_json_msg_query, ontologies): + ontologies.get_structures( + structure_set_names=ontologies.quote_string( + "Mouse Connectivity - Summary")) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "structure_sets[name$in'Mouse Connectivity - Summary']," + "rma::options" + "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_structure_set_by_names(mock_json_msg_query, ontologies): + ontologies.get_structures( + structure_set_names=[ + ontologies.quote_string("NHP - Coarse"), + ontologies.quote_string("Mouse Connectivity - Summary")]) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "structure_sets[name$in'NHP - Coarse','Mouse Connectivity - Summary']," + "rma::options" + "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_structure_set_no_order(mock_json_msg_query, ontologies): + ontologies.get_structures(1, order=None) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "[graph_id$in1],rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_atlas_1(mock_json_msg_query, ontologies): + atlas_id = 1 + ontologies.get_atlases_table(atlas_id) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Atlas,rma::criteria," + "[id$in1],structure_graph(ontology),graphic_group_labels," + "rma::include,structure_graph(ontology),graphic_group_labels," + "rma::options[only$eq'atlases.id,atlases.name,atlases.image_type," + "ontologies.id,ontologies.name," + "structure_graphs.id,structure_graphs.name," + "graphic_group_labels.id,graphic_group_labels.name']" + "[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_atlas_verbose(mock_json_msg_query, ontologies): + ontologies.get_atlases_table(brief=False) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Atlas,rma::criteria," + "structure_graph(ontology),graphic_group_labels," + "rma::include,structure_graph(ontology),graphic_group_labels," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(OntologiesApi, "json_msg_query") +def test_get_structures_with_sets(mock_json_msg_query, ontologies): + ontologies.get_structures_with_sets(1) + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria,[graph_id$in1]," + "rma::include,structure_sets," + "rma::options[num_rows$eq'all'][order$eqstructures.graph_order]" + "[count$eqfalse]") + + +def test_unpack_structure_set_ancestors(ontologies): + + sdf = pd.DataFrame([{'structure_id_path': '/1/2/3/'}]) + ontologies.unpack_structure_set_ancestors(sdf) + + assert( 'structure_set_ancestor' in sdf.columns.values ) + assert( allclose(sdf['structure_set_ancestor'].values[0], [1, 2, 3]) ) diff --git a/test/api/test_pager.py b/test/api/test_pager.py new file mode 100644 index 0000000000..68399e014a --- /dev/null +++ b/test/api/test_pager.py @@ -0,0 +1,272 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import MagicMock, call, patch, mock_open +from allensdk.api.queries.rma_pager import RmaPager, pageable +from allensdk.api.queries.rma_api import RmaApi +import allensdk.core.json_utilities as ju +import pandas.io.json as pj +import pandas as pd +from six.moves import builtins +import os +import simplejson as json +from allensdk.api.queries.rma_template import RmaTemplate +from allensdk.api.warehouse_cache.cache import cacheable, Cache +try: + import StringIO +except: + import io as StringIO +from . import SafeJsonMsg + + +@pytest.fixture +def pager(): + return RmaPager() + +_msg = [{'whatever': True}] +_pd_msg = pd.DataFrame(_msg) +_csv_msg = pd.read_csv(StringIO.StringIO(""",whatever +0,True +"""), index_col=0) + +_read_url_get_msg5 = [{'msg': _msg}, + {'msg': _msg}, + {'msg': _msg}, + {'msg': _msg}, + {'msg': _msg}] +_pj_msg5 = pd.DataFrame([{'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}]) +_read_msg5 = [{'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}] + + +@pytest.fixture +def safe_read_url_get_msg5(): + return SafeJsonMsg(_read_url_get_msg5) + +@pytest.fixture +def rma(): + return RmaApi() + +@patch("allensdk.core.json_utilities.read_url_get", + return_value={'msg': _msg}) +def test_pageable_json(ju_read_url_get, rma): + + @pageable() + def get_genes(**kwargs): + return rma.model_query(model='Gene', **kwargs) + + nr = 5 + pp = 1 + tr = nr*pp + + df = list(get_genes(num_rows=nr, total_rows=tr)) + + assert df == [{'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}] + + base_query = \ + ('http://api.brain-map.org/api/v2/data/query.json?q=model::Gene' + ',rma::options%5Bnum_rows$eq5%5D%5Bstart_row$eq{}%5D' + '%5Bcount$eqfalse%5D') + + expected_calls = map(lambda c: call(base_query.format(c)), + [0, 1, 2, 3, 4]) + + assert ju_read_url_get.call_args_list == list(expected_calls) + + +def test_all(safe_read_url_get_msg5, rma): + with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_read_url_get_msg5) as ju_read_url_get: + + @pageable() + def get_genes(**kwargs): + return rma.model_query(model='Gene', **kwargs) + + nr = 1 + + df = list(get_genes(num_rows=nr, total_rows='all')) + + assert df == [{'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}] + + base_query = \ + ('http://api.brain-map.org/api/v2/data/query.json?q=model::Gene' + ',rma::options%5Bnum_rows$eq1%5D%5Bstart_row$eq{}%5D' + '%5Bcount$eqfalse%5D') + + # we get one extra call if total_rows % num_rows == 0 with current implementation + expected_calls = map(lambda c: call(base_query.format(c)), + [0, 1, 2, 3, 4, 5]) + + assert ju_read_url_get.call_args_list == list(expected_calls) + + +@pytest.mark.parametrize("cache_style", + (Cache.cache_csv, + Cache.cache_csv_json, + Cache.cache_csv_dataframe)) +@patch("pandas.read_csv", return_value=_csv_msg) +@patch("os.makedirs") +def test_cacheable_pageable_csv(os_makedirs, read_csv, + cache_style, safe_read_url_get_msg5): + with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_read_url_get_msg5) as ju_read_url_get: + archive_templates = \ + {"cam_cell_queries": [ + {'name': 'cam_cell_metric', + 'description': 'see name', + 'model': 'ApiCamCellMetric', + 'num_rows': 1000, + 'count': False + } ] } + + rmat = RmaTemplate(query_manifest=archive_templates) + + @cacheable() + @pageable(num_rows=2000) + def get_cam_cell_metrics(*args, + **kwargs): + return rmat.template_query("cam_cell_queries", + 'cam_cell_metric', + *args, + **kwargs) + + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + with patch('csv.DictWriter.writerow') as csv_writerow: + cam_cell_metrics = \ + get_cam_cell_metrics(strategy='create', + path='/path/to/cam_cell_metrics.csv', + num_rows=1, + total_rows='all', + **cache_style()) + + os_makedirs.assert_called_with('/path/to') + + base_query = ('http://api.brain-map.org/api/v2/data/query.json?' + 'q=model::ApiCamCellMetric,' + 'rma::options%5Bnum_rows$eq1%5D%5Bstart_row$eq{}%5D' + '%5Bcount$eqfalse%5D') + + expected_calls = map(lambda c: call(base_query.format(c)), + [0, 1, 2, 3, 4, 5]) + + assert ju_read_url_get.call_args_list == list(expected_calls) + read_csv.assert_called_once_with('/path/to/cam_cell_metrics.csv', parse_dates=True) + + assert csv_writerow.call_args_list == [call({'whatever': 'whatever'}), + call({'whatever': True}), + call({'whatever': True}), + call({'whatever': True}), + call({'whatever': True}), + call({'whatever': True})] + + +@pytest.mark.parametrize("cache_style", + (Cache.cache_json, + Cache.cache_json_dataframe)) +@patch("allensdk.core.json_utilities.read", return_value=_read_msg5) +@patch("pandas.io.json.read_json", return_value=_pj_msg5) +@patch("os.makedirs") +def test_cacheable_pageable_json(os_makedirs, pj_read_json, + ju_read, cache_style, safe_read_url_get_msg5): + with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_read_url_get_msg5) as ju_read_url_get: + + archive_templates = \ + {"cam_cell_queries": [ + {'name': 'cam_cell_metric', + 'description': 'see name', + 'model': 'ApiCamCellMetric', + 'num_rows': 1000, + 'count': False + } ] } + + rmat = RmaTemplate(query_manifest=archive_templates) + + @cacheable() + @pageable(num_rows=2000) + def get_cam_cell_metrics(*args, + **kwargs): + return rmat.template_query("cam_cell_queries", + 'cam_cell_metric', + *args, + **kwargs) + + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + open_mock.return_value.read = \ + MagicMock(name='read', + return_value=[{'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}, + {'whatever': True}]) + cam_cell_metrics = \ + get_cam_cell_metrics(strategy='create', + path='/path/to/cam_cell_metrics.json', + num_rows=1, + total_rows='all', + **cache_style()) + + os_makedirs.assert_called_with('/path/to') + + base_query = \ + ('http://api.brain-map.org/api/v2/data/query.json?' + 'q=model::ApiCamCellMetric,' + 'rma::options%5Bnum_rows$eq1%5D%5Bstart_row$eq{}%5D' + '%5Bcount$eqfalse%5D') + + expected_calls = map(lambda c: call(base_query.format(c)), + [0, 1, 2, 3, 4, 5]) + + open_mock.assert_called_once_with('/path/to/cam_cell_metrics.json', 'wb') + open_mock.return_value.write.assert_called_once_with('[\n {\n "whatever": true\n },\n {\n "whatever": true\n },\n {\n "whatever": true\n },\n {\n "whatever": true\n },\n {\n "whatever": true\n }\n]') + assert ju_read_url_get.call_args_list == list(expected_calls) + assert len(cam_cell_metrics) == 5 diff --git a/test/api/test_reference_space_api.py b/test/api/test_reference_space_api.py new file mode 100644 index 0000000000..3d4848b48f --- /dev/null +++ b/test/api/test_reference_space_api.py @@ -0,0 +1,256 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import pytest +from mock import patch, MagicMock +import itertools as it +import numpy as np +from allensdk.api.queries.reference_space_api import ReferenceSpaceApi as RSA + + +@pytest.fixture +def ref_space(): + rsa = RSA() + + return rsa + + +@pytest.fixture +def mock_nrrd(): + mocked_nrrd = MagicMock() + mocked_nrrd.read = MagicMock(return_value=('mock_annotation_data', + 'mock_annotation_image')) + return mocked_nrrd + + +def CCF_VERSIONS(): + return [RSA.CCF_2015, + RSA.CCF_2016, + RSA.CCF_2017] + + +def DATA_PATHS(): + return [RSA.AVERAGE_TEMPLATE, + RSA.ARA_NISSL, + RSA.MOUSE_2011, + RSA.DEVMOUSE_2012, + RSA.CCF_2015, + RSA.CCF_2016, + RSA.CCF_2017] + + +def RESOLUTIONS(): + return [RSA.VOXEL_RESOLUTION_10_MICRONS, + RSA.VOXEL_RESOLUTION_25_MICRONS, + RSA.VOXEL_RESOLUTION_50_MICRONS, + RSA.VOXEL_RESOLUTION_100_MICRONS] + +MOCK_ANNOTATION_DATA = 'mock_annotation_data' +MOCK_ANNOTATION_IMAGE = 'mock_annotation_image' + + + +def test_download_mouse_atlas_volume(ref_space): + + with patch.object(ref_space, 'retrieve_file_over_http') as mock_retrieve: + with pytest.raises(RuntimeError): + ref_space.download_mouse_atlas_volume('P56', 'Mouse_gridAnnotation', 'P56/gridAnnotation.mhd') + + mock_retrieve.assert_called_once_with( + 'http://download.alleninstitute.org/informatics-archive/'\ + 'current-release/mouse_annotation/'\ + 'P56_Mouse_gridAnnotation.zip', + 'P56/gridAnnotation.mhd', + zipped=True) + + +@pytest.mark.parametrize("data_path,resolution", + it.product(DATA_PATHS(), + RESOLUTIONS())) +def test_download_volumetric_data(ref_space, + data_path, + resolution): + cache_filename = "annotation_%d.nrrd" % (resolution) + + with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: + ref_space.download_volumetric_data(data_path, + cache_filename, + resolution) + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/%s/annotation_%d.nrrd" % + (data_path, + resolution), + cache_filename) + + +@pytest.mark.parametrize("resolution", + RESOLUTIONS()) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_structure_mask(os_makedirs, + nrrd_read, + ref_space, + resolution): + + structure_id = 12 + + with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: + a, b = ref_space.download_structure_mask(structure_id, + None, resolution, + '/path/to/foo.nrrd', + reader=nrrd_read) + + assert a + assert b + + expected = 'http://download.alleninstitute.org/informatics-archive/'\ + 'current-release/mouse_ccf/{0}/structure_masks/'\ + 'structure_masks_{1}/structure_{2}.nrrd'.format(RSA.CCF_VERSION_DEFAULT, + resolution, + structure_id) + mock_retrieve.assert_called_once_with(expected, '/path/to/foo.nrrd') + os_makedirs.assert_any_call('/path/to') + + +@patch('allensdk.core.obj_utilities.read_obj', return_value=('mock_obj')) +@patch('os.makedirs') +def test_download_structure_mesh(os_makedirs, + read_obj, + ref_space): + + structure_id = 12 + + with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: + a = ref_space.download_structure_mesh(structure_id, + None, '/path/to/foo.obj', + reader=read_obj) + + assert a == 'mock_obj' + + expected = 'http://download.alleninstitute.org/informatics-archive/'\ + 'current-release/mouse_ccf/{0}/structure_meshes/'\ + '{1}.obj'.format(RSA.CCF_VERSION_DEFAULT, structure_id) + + mock_retrieve.assert_called_once_with(expected, '/path/to/foo.obj') + os_makedirs.assert_any_call('/path/to') + + +@pytest.mark.parametrize("ccf_version,resolution", + it.product(CCF_VERSIONS(), + RESOLUTIONS())) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_annotation_volume(os_makedirs, + nrrd_read, + ref_space, + ccf_version, + resolution): + cache_file = '/path/to/annotation_%d.nrrd' % (resolution) + + with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: + ref_space.download_annotation_volume( + ccf_version, + resolution, + cache_file, + reader=nrrd_read) + + nrrd_read.assert_called_once_with(cache_file) + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/%s/annotation_%d.nrrd" % + (ccf_version, resolution), + "/path/to/annotation_%d.nrrd" % (resolution)) + + os_makedirs.assert_any_call('/path/to') + + +@pytest.mark.parametrize("resolution", + RESOLUTIONS()) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_annotation_volume_default(os_makedirs, + nrrd_read, + ref_space, + resolution): + with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: + a, b = ref_space.download_annotation_volume( + None, + resolution, + '/path/to/annotation_%d.nrrd' % (resolution), + reader=nrrd_read) + + assert a + assert b + + print(mock_retrieve.call_args_list) + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/%s/annotation_%d.nrrd" % + (RSA.CCF_VERSION_DEFAULT, resolution), + "/path/to/annotation_%d.nrrd" % (resolution)) + + os_makedirs.assert_any_call('/path/to') + + +@pytest.mark.parametrize("resolution", + RESOLUTIONS()) +@patch("nrrd.read", return_value=('mock_annotation_data', + 'mock_annotation_image')) +@patch('os.makedirs') +def test_download_template_volume(os_makedirs, + nrrd_read, + ref_space, + resolution): + with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: + ref_space.download_template_volume( + resolution, + '/path/to/average_template_%d.nrrd' % (resolution), + reader=nrrd_read) + + mock_retrieve.assert_called_once_with( + "http://download.alleninstitute.org/informatics-archive/" + "current-release/mouse_ccf/average_template/average_template_%d.nrrd" % + (resolution), + "/path/to/average_template_%d.nrrd" % (resolution)) + + os_makedirs.assert_any_call('/path/to') diff --git a/test/api/test_rma_template.py b/test/api/test_rma_template.py new file mode 100644 index 0000000000..f315d0a82b --- /dev/null +++ b/test/api/test_rma_template.py @@ -0,0 +1,265 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import MagicMock, patch +import allensdk.core.json_utilities as ju +from allensdk.api.queries.rma_template import RmaTemplate + + +_msg = {'msg': [{'whatever': True}]} + + +@pytest.fixture +def rma(): + templates = \ + {"ontology_queries": [ + {'name': 'structures_by_graph_ids', + 'description': 'see name', + 'model': 'Structure', + 'criteria': '[graph_id$in{{ graph_ids }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['graph_ids'] + }, + {'name': 'structures_by_graph_names', + 'description': 'see name', + 'model': 'Structure', + 'criteria': 'graph[structure_graphs.name$in{{ graph_names }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['graph_names'] + }, + {'name': 'structures_by_set_ids', + 'description': 'see name', + 'model': 'Structure', + 'criteria': '[structure_set_id$in{{ set_ids }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['set_ids'] + }, + {'name': 'structures_by_set_names', + 'description': 'see name', + 'model': 'Structure', + 'criteria': 'structure_sets[name$in{{ set_names }}]', + 'order': ['structures.graph_order'], + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['set_names'] + }, + {'name': 'structure_graphs_list', + 'description': 'see name', + 'model': 'StructureGraph', + 'num_rows': 'all', + 'count': False + }, + {'name': 'structure_sets_list', + 'description': 'see name', + 'model': 'StructureSet', + 'num_rows': 'all', + 'count': False + }, + {'name': 'atlases_list', + 'description': 'see name', + 'model': 'Atlas', + 'num_rows': 'all', + 'count': False + }, + {'name': 'atlases_table', + 'description': 'see name', + 'model': 'Atlas', + 'criteria': '{% if graph_ids is defined %}[graph_id$in{{ graph_ids }}],{% endif %}structure_graph(ontology),graphic_group_labels', + 'include': '[structure_graph(ontology),graphic_group_labels', + 'num_rows': 'all', + 'count': False, + 'criteria_params': ['graph_ids'] + }, + {'name': 'atlases_table_brief', + 'description': 'see name', + 'model': 'Atlas', + 'criteria': 'structure_graph(ontology),graphic_group_labels', + 'include': 'structure_graph(ontology),graphic_group_labels', + 'only': ['atlases.id', + 'atlases.name', + 'atlases.image_type', + 'ontologies.id', + 'ontologies.name', + 'structure_graphs.id', + 'structure_graphs.name', + 'graphic_group_labels.id', + 'graphic_group_labels.name'], + 'num_rows': 'all', + 'count': False + } + ]} + rma = RmaTemplate(query_manifest=templates) + + return rma + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_atlases_list(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'atlases_list') + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Atlas,rma::options" + "%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_structure_graphs_list(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'structure_graphs_list') + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::StructureGraph,rma::options" + "%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_structure_sets_list(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'structure_sets_list') + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::StructureSet,rma::options" + "%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_structures_by_graph_ids(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'structures_by_graph_ids', + graph_ids='1') + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "%5Bgraph_id$in1%5D,rma::options" + "%5Bnum_rows$eq%27all%27%5D%5Border$eqstructures.graph_order%5D" + "%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_structures_by_two_graph_ids(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'structures_by_graph_ids', + graph_ids=[1, 2]) + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "%5Bgraph_id$in1,2%5D," + "rma::options" + "%5Bnum_rows$eq%27all%27%5D" + "%5Border$eqstructures.graph_order%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_structures_by_graph_names(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'structures_by_graph_names', + graph_names=rma.quote_string('Human+Brain+Atlas')) + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "graph%5Bstructure_graphs.name$in%27Human+Brain+Atlas%27%5D," + "rma::options" + "%5Bnum_rows$eq%27all%27%5D" + "%5Border$eqstructures.graph_order%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_structures_by_set_ids(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'structures_by_graph_ids', + graph_ids='1') + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Structure,rma::criteria," + "%5Bgraph_id$in1%5D,rma::options%5Bnum_rows$eq%27all%27%5D" + "%5Border$eqstructures.graph_order%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_atlases_table(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'atlases_table') + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Atlas,rma::criteria," + "structure_graph%28ontology%29,graphic_group_labels," + "rma::include,%5Bstructure_graph%28ontology%29,graphic_group_labels," + "rma::options%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_atlases_table_one_graph(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'atlases_table', + graph_ids=1) + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Atlas,rma::criteria," + "%5Bgraph_id$in1%5D,structure_graph%28ontology%29,graphic_group_labels," + "rma::include,%5Bstructure_graph%28ontology%29,graphic_group_labels," + "rma::options%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") + + +@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) +def test_atlases_table_brief(ju_read_url_get, rma): + rma.template_query('ontology_queries', + 'atlases_table_brief') + + ju_read_url_get.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::Atlas," + "rma::criteria,structure_graph%28ontology%29,graphic_group_labels," + "rma::include,structure_graph%28ontology%29,graphic_group_labels," + "rma::options%5Bonly$eq%27atlases.id,atlases.name,atlases.image_type," + "ontologies.id,ontologies.name,structure_graphs.id,structure_graphs.name," + "graphic_group_labels.id,graphic_group_labels.name%27%5D%5B" + "num_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") diff --git a/test/api/test_svg_api.py b/test/api/test_svg_api.py new file mode 100644 index 0000000000..68e1e40e34 --- /dev/null +++ b/test/api/test_svg_api.py @@ -0,0 +1,109 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +#test AllenSDK svg api for download and show +from allensdk.api.queries.svg_api import SvgApi +import pytest +import json +from mock import MagicMock +import os + +@pytest.fixture +def svg(): + sa = SvgApi() + return sa + +def test_build_query(svg): + ####download true url + download = True + groups = None + section_image_id = 21889 + returned_url = svg.build_query(section_image_id, groups,download) + assert (returned_url == "http://api.brain-map.org/api/v2/svg_download/21889") + + ####download true with one group url + download = True + groups = [1] + section_image_id = 21889 + returned_url = svg.build_query(section_image_id, groups,download) + assert (returned_url == "http://api.brain-map.org/api/v2/svg_download/21889?groups=1") + + ####download true with groups url + download = True + groups = [1,2] + section_image_id = 21889 + returned_url = svg.build_query(section_image_id, groups,download) + assert (returned_url == "http://api.brain-map.org/api/v2/svg_download/21889?groups=1,2") + + ####download false url + download = False + groups = None + section_image_id = 21889 + returned_url = svg.build_query(section_image_id, groups,download) + assert (returned_url == "http://api.brain-map.org/api/v2/svg/21889") + + ####download false groups exist url + download = False + groups = [28] + section_image_id = 21889 + returned_url = svg.build_query(section_image_id, groups,download) + assert (returned_url == "http://api.brain-map.org/api/v2/svg/21889?groups=28") + +def test_download_svg(svg): + svg.retrieve_file_over_http = MagicMock(name='retrieve_file_over_http') + section_image_id = 21889 + groups = None + file_path = None + + svg.download_svg(section_image_id,groups,file_path) + svg.retrieve_file_over_http.assert_called_with('http://api.brain-map.org/api/v2/svg_download/21889', '21889.svg') + + +def test_get_svg(svg): + svg.retrieve_xml_over_http = MagicMock(name='retrieve_xml_over_http') + + ####groups None + section_image_id = 100960033 + groups = None + + svg.get_svg(section_image_id, groups) + svg.retrieve_xml_over_http.assert_called_with("http://api.brain-map.org/api/v2/svg/100960033") + + ####groups in 28 + section_image_id = 100960033 + groups = [28] + + svg.get_svg(section_image_id, groups) + svg.retrieve_xml_over_http.assert_called_with("http://api.brain-map.org/api/v2/svg/100960033?groups=28") diff --git a/test/api/test_synchronization_api.py b/test/api/test_synchronization_api.py new file mode 100644 index 0000000000..b99bb86698 --- /dev/null +++ b/test/api/test_synchronization_api.py @@ -0,0 +1,130 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import MagicMock +from allensdk.api.queries.synchronization_api import SynchronizationApi + + +@pytest.fixture +def synch(): + sa = SynchronizationApi() + sa.json_msg_query = MagicMock(name='json_msg_query') + + return sa + + +def test_image_to_image(synch): + ''' + Notes + ----- + Expected link is slightly modified for json and float serialization of zeros. + + See: `Image Alignment `<http://help.brain-map.org/display/mouseconnectivity/API#API-ImageAlignment>_ + , link labeled 'Sync a VISp and VISal experiment to a location in a SCs SectionDataSet'. + ''' + section_image_id = 114754496 + (x, y) = (18232, 10704) + section_data_set_ids = [113887162, 116903968] + + _ = synch.get_image_to_image(section_image_id, + x, y, + section_data_set_ids) + expected = 'http://api.brain-map.org/api/v2/image_to_image/114754496.json?x=18232.000000&y=10704.000000§ion_data_set_ids=113887162,116903968' + synch.json_msg_query.assert_called_once_with(expected) + + +def test_image_to_image_2d(synch): + section_image_id = 68173101 + (x, y) = (6208, 2368) + section_image_ids = [68173103, 68173105, 68173107] + + _ = synch.get_image_to_image_2d(section_image_id, + x, y, + section_image_ids) + expected = 'http://api.brain-map.org/api/v2/image_to_image_2d/68173101.json?x=6208.000000&y=2368.000000§ion_image_ids=68173103,68173105,68173107' + synch.json_msg_query.assert_called_once_with(expected) + + +def test_reference_to_image(synch): + reference_space_id = 10 + (x, y, z) = (6085, 3670, 4883) + section_data_set_ids = [68545324, 67810540] + + _ = synch.get_reference_to_image(reference_space_id, + x, y, z, + section_data_set_ids) + expected = 'http://api.brain-map.org/api/v2/reference_to_image/10.json?x=6085.000000&y=3670.000000&z=4883.000000§ion_data_set_ids=68545324,67810540' + synch.json_msg_query.assert_called_once_with(expected) + + +def test_image_to_reference(synch): + section_image_id = 68173101 + (x, y) = (6208, 2368) + + _ = synch.get_image_to_reference(section_image_id, + x, y) + expected = 'http://api.brain-map.org/api/v2/image_to_reference/68173101.json?x=6208.000000&y=2368.000000' + synch.json_msg_query.assert_called_once_with(expected) + + +def test_structure_to_image(synch): + section_data_set_id = 68545324 + structure_ids = [315, 698, 1089, 703, 477, + 803, 512, 549, 1097, 313, 771, 354] + + _ = synch.get_structure_to_image(section_data_set_id, + structure_ids) + expected = 'http://api.brain-map.org/api/v2/structure_to_image/68545324.json?structure_ids=315,698,1089,703,477,803,512,549,1097,313,771,354' + synch.json_msg_query.assert_called_once_with(expected) + + +def test_image_to_atlas(synch): + ''' + Notes + ----- + Expected link is slightly modified for json and float serialization of zeros. + + See: `Image Alignment `<http://help.brain-map.org/display/mouseconnectivity/API#API-ImageAlignment>_ + , link labeled 'Sync the P56 coronal reference atlas to a location in the SCs SectionDataSet'. + ''' + section_image_id = 114754496 + (x, y) = (18232, 10704) + atlas_id = 1 + _ = synch.get_image_to_atlas(section_image_id, + x, y, + atlas_id) + expected = 'http://api.brain-map.org/api/v2/image_to_atlas/114754496.json?x=18232.000000&y=10704.000000&atlas_id=1' + synch.json_msg_query.assert_called_once_with(expected) diff --git a/test/api/test_tree_search_api.py b/test/api/test_tree_search_api.py new file mode 100644 index 0000000000..8606fac81c --- /dev/null +++ b/test/api/test_tree_search_api.py @@ -0,0 +1,97 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +####test AllenSDK tree search api for Specimen and Structure +from allensdk.api.queries.tree_search_api import TreeSearchApi +import pytest +import json +from mock import MagicMock + +@pytest.fixture +def tree_search(): + tsa = TreeSearchApi() + tsa.json_msg_query = MagicMock(name='json_msg_query') + + return tsa + +def test_get_specimen_tree(tree_search): + ####ancestor true for Specimen + kind = 'Specimen' + db_id = 113817886 + ancestors = True + descendants = None + tree_search.get_tree(kind, db_id, ancestors, descendants) + tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Specimen/113817886.json?ancestors=true") + + ####ancestor true for Specimen + kind = 'Specimen' + db_id = 113817886 + ancestors = True + descendants = False + tree_search.get_tree(kind, db_id, ancestors, descendants) + tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Specimen/113817886.json?ancestors=true&descendants=false") + + ####ancestor false for Specimen + kind = 'Specimen' + db_id = 113817886 + ancestors = False + descendants = True + tree_search.get_tree(kind, db_id, ancestors, descendants) + tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Specimen/113817886.json?ancestors=false&descendants=true") + +def test_get_structure_tree(tree_search): + ####ancestor True for Structure + kind = 'Structure' + db_id = 12547 + ancestors = True + descendants = True + tree_search.get_tree(kind, db_id, ancestors, descendants) + tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Structure/12547.json?ancestors=true&descendants=true") + + ####ancestor False for Structure + kind = 'Structure' + db_id = 12547 + ancestors = False + descendants = True + tree_search.get_tree(kind, db_id, ancestors, descendants) + tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Structure/12547.json?ancestors=false&descendants=true") + + ####ancestor None for Structure + kind = 'Structure' + db_id = 12547 + ancestors = None + descendants = None + tree_search.get_tree(kind, db_id, ancestors, descendants) + tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Structure/12547.json") diff --git a/test/brain_observatory/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da302f13270f0d1b163d756120c66e6059eb8218 GIT binary patch literal 1429 zcmaJ>OOG2x5bo}Ic<l9BAsZ21M<kd-ya$v^6on;05g=qlA{5lJG-^-xcxQKB>Ta)b zG(Mn2f=j|*u*HeLG*?c0<IIVwwzFCuqOGo;s_L%CS5<y^csL-is$YK;uRTJ3N9N4} zo}9oor$8i;v><$UQci(q1uGe6bSLw;=kEACP~<F>p7dXm7nJuL7s$|Yk>h$Ya$MhW zeK~O4K+>lqKDY#LWD?UZlENyRmnuaGE($w<{Rp=C5QwA@1u5woR4qZDGMIZZl;8o* z{woF+2NR7C!Q$}AqN?(0{<Kj_&Orw2k5Bg><YfO5om~2$xI|BvA&{8y0mfmhC>zs- z7ou1w1JaL0QK-tu^YKiJyh`esQTjsITCc`>=PEJiOCy#sb;oZ+N5K8rJi0gi4(^+& zI2Cd{6H8I8rk_<Jtt%-$nX2l-OzQ^hr$FoGbY-Sr=d-EFt-8~Q^jyppyxm7|Y$3ek ze}!=j#xhimn^kxCx0o;pgM_dlWi+B1Tj2_8R9s<w3m8kzDB^9|#@hncuROrkpYTW+ zWlUaIJP=u4sMzC2dr2adNp;>>&~}4ds><eBt~9^-<^n*fZGzy&eit;WYB}S*$+L%# z!H{O)wezZa=>WS%`l#r^UG(=BF#9}w$b(Tm0!fM`$Av}^eca{-ke^8A@^~4oX^S1_ zO;Wss3#*OB--m6!0%FO}WCPc?^aWjemYsPUzx5>BvbAr6P1yR<+p=G7tb;b#^jfl| zlstoh_?A2&-;<WMenwmN8r=X?M-XzN>qR9kppsx+%=3eN9%DE=x{RaFGgfzDd2UtN zbgVX=-w1o!`Db-r=^;eL`vB1wpFh6)<u_fh)X)%d=(6TL(d0>57(T#{^QF*p!$Vs( zGS@sp_h^bo?opE0FchPmHpxVajk|-{AxyIm5C``UK}U4NM)VeYe)}qcM(OeWqE1C& z9*i^hFlPE~c%yG4!RCUdcLHZ{c>U>nXd4F&`Y+P&!1>?3hc&aV2$D%}?rnEq{?GWv ztYcNv1ww1F&j&-fmf4YkmRl4H<63Vw*B`+Z;~If!tbcsK!)Apw(l_xns&?oH)uL=x x`dtw4UY7r07h1XDaW!zMI14+6|8O1MFKf9d)B|i#*N_p+-Vk==jr#CA{0k*AP!j+E literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_circle_plots.cpython-37.pyc b/test/brain_observatory/__pycache__/test_circle_plots.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4d311c96861b9d2a088707b67bfbc47d881d168 GIT binary patch literal 3397 zcma)8%WoS+7~k24y^bGooRFp{f>KI~L8PeMP=P+ws;#OtQiDL2h1qzvj+4!<nb|%p zg#(XkZ~Os?IKi0%2QK^@d*$Q{LL8BJ{Jz;ocGnfEt(_TvJKuPI^ZU*Beb<}K1q~nn z`>&i|mo)7+`jLKg46fplkI`_AGfz8Yy2i9ay=So4V)iVqbK_gBSK%hN&{uhdSJB(t z<~8&+zQF6~7kGm=(bsv4FQRYoHeW*D<Q=|@zQtGgOXwH*DnEn1&DjI3yEemrYg<EV z>BI0;@Z7*7Ihs&AW}J-}*H82>wIgj`=j^P;jRRet3yrUtvKX+Kuv{if>=By#)=1|T zd4=Y2<p@4lN5}5bj<A~ioMv+kyQppn`r{EE^_kJH8J$mJ`s1V7zxZ^kQDr#sf>8GA zlfZMtAPfdir;#Q1oQWH?u1V>Na2)tIg$P8X`;$nYj3e9eyrCCJx62~Nf6zn&EB`gU z@qYhf%$I#<&*7W9&J)L<_OJQQFz~taUf=Z}%YHC%eK|xMO!lU-e{a0om*dcVXW|SG zoRJG(&%+FUa4B?UcxhKSV}B6rV%f(|7>KDd4~Ang^xT2k`Q~IAwQ2Gohu|VMB$ZNF zi*;B>@93fhTY;Av42qXOF$lGN@Iu-kUEo`JR>4W@#|BOscARvTT6NNwLz8%kJwkoo zf)D9u-bd%P#OGn=W8z;-@><cLwXz@H;=eEhZ9N&+v4#nTf6UfsU`7+lEbkO{<=sHL zn2Z-OR`wCpBY&qgluFuLf+V4&GW&@}2AZ9&-m_hwPlB-@Mpf>PgzHLS;?=EF_0Z4R zKakLje8zha*vul^-z2MwpmDDiGvbYX34UE+!zhRqQKg2?zsp3O#-yOQX<`&D=Lk*R z-^B~rMx(J+wyv+?S!ZwRt4yrIR$!KPr<mQqAih6z7AK4tJ<^Vi6YU#tiW_!5I}Ibg zGwKYwRt%siCu8AwgHVhePeul$8P!HEq~?TsQlY>VFo%KXl@W9lf`b1C*o>sDX{@D- zm(dqCorQ@Vyh%4rq2k0SY@0&Gg-i$}SqdkREoio$nR9cuGl-R~jKE}oL(e1tB$eRd zL+OSo{N=*-<NGDfV0U7T8X^(=ouzS!zqNVvvHNvQmZSrXwb=?t6zdol&Vi(($lJmo z3zxuIItQXJIR^@<O6>Eq=(O%;CtxNdE6@hkPodTwe}sqvtwHN$h>;cBOCaN@lXJX- z1#{p!OuPci3xETKC2*_+&QQ0yJZlbIMrJ|Ab>VObc;JZPJh+~z%+JM^^V^=o_G%eh zcI$58O-fwp&JnJ2v3OI`N;8Po>ltCVm2+IRl5NFVU>?!`M3kcEC#RSi5Mzspb7f4K z81LpV#ko5dNeGpSBq?fK%CcN(&aF9Il$cWucCv8kCK>Jpv7ISK%gp;TES~7G1$=EL zUMu6HJFG6-Jq%8R4)$-HScOnR``^fzqa0RNBULQ7GlW(yyNE@sUXbL%6PJ(Nff)Ov zx$E{^{uUL+Q!f`QCfGVLcjsX#+_g-PZ{@J5`bj(1Pf(hL26DKGOhET&BeasdXr6}2 zTy%_cT4e9JPZ9oy2T@D7h?Rr%w}KHhZ{PfMuzml*ot-=Pw;rS!!k7fI93tZsS6ss* zP?QHW)?hXh7cnY8%5uanctdn47=T0ZFDWPuPURzAqnIu$DHahzkV|xVMUe<Az*qMT z5Q)qI`%XeGvIs}90rGR6C^N~Q<{g#%tBL=2Ie$C#PyVBp%=ww-sN!Scd55edlBTAs z0tLP{BZbZ=W6YM(bZwQH#RZJT>(tPZ#P!5!dGQ9#WMYF}l>%E+=_n=b3(Sx!Xf$T) z4OEJ&Yz_UoYQ@{Icb9q>)0%X1t{mOWSE9Y8x%a(BenMPSSpK8K$uus8s3ukAiz)|H zE>t-~P;gbzNL^V$+E!{%d&*%_=v2vMUpWl;BhUSijz&^~?f{crvzxYMS94$MKhIRx A{Qv*} literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_demixer.cpython-37.pyc b/test/brain_observatory/__pycache__/test_demixer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..554da15b87b45002b06354c7b150f50ef28b571c GIT binary patch literal 3070 zcmc&$OOG2x5bo}I*z5Iry$|wGLNI|G9BmvFZc!8xA|8>@N+f}xktM5lx_5SV=SBB; zV_W7x;EM7WcHzX8pEFl3?2R)ApsL6AI-3v(0%b<7?&_|t?)tu}9>2e|R3q>tKYY!< zUm@gYRHhH;<QDw&Pc|Wf2pSQOnwELYv{r0;HZA8I&oN_eTw#QgxauuXBH3>3U{Nqh z59-1)uN~NjbgBmo`u4$+(Q!Szfh`<(O%LZM){bzEHF_dtf7_Y(setEszm=EwE9gsm zGpEJ#K6Ofh8hQ(?Lnf+X;al<z^%`?XEQ^|nsVUrl5&bf*0`C;OFN(VHzB2J%;%Eto zAF&SD3^Ah_lwho!n`$!~z#QffceDWxjx`fgiME*+ZfOOPHpFtkw%IXyQ~xu+|Ha;} zVfxkV-F$_6ul%#UA^XefsszCLq+(uxyRb1kN(pRRvl@GG2FzFh_ASf-Y)x)J7C;_Y zm<NFanYk*~OlGc5GIQO;@qcCJYumP|hg0IT*>z3O`=ov52ye2@(G8vUl`nhSipO#z z=6bJ}EAC6Zu^sWehXZ;e3kNdNy-X@IuptMT^m8c!^a0PUN$1!1jwq-{48(Mf_zs%D z<4%5epw$;a<m7;k$(WAW*gCYoa&oq79oS=MY#%bbIN_Ldv+Wd?hzCWzCuAHBdRZDK zdBKvbsN_=TVG<N|uC-KoPk!0wQQIx*^Dz~Rb3qlg<EV<|6JZtAX<UV?r0z%gk3=oQ zIe*LVT<?AcTj(y|;i9v}AMs?^y`6ABO$2|pE0cZQO*5HjA7q;C40ZRDaI34sTwckz zzsCa!YoiD(#NJgr_th=M!=#sPf!lqar)p@1%OIudWW%C~cJom$AaIBxIbWkLRrn1$ zg3k}}%^-9t@IxyDv4GAAh~2Ssz;bIBzA{hVp=9jrI)a`hyRKk+Okc|@kLhfzigqyi zF^)b2IzA=$$QLAEz^~TW9=kJ=tWAZqk2?2(jef*cE9SWh2OF)vhLKhzxz1Y}*a28u zdD_xxv@bjDy28UN%nz>$$rj0d85NZ%4FaUK^6>V(&AXc)6%{4@R0&;Ju?~vHZNqk$ zCLbu3DzL|8NvaS8g$SrBh;~IG5(+=zY7s>p#S#e5^?3%ns0NN8!=-3KuedUYI#8sg z?mglvfdlonQ`N(OFhnQ>4Dm87(dd{gAtepE&RSHR1%1>}{L!?QbPh>is!M|$^tPhZ z-veJGIjf})AB4YHz~>+EJilaag4Yv#&PoPZ9NQ?7m9Zn3(Ln-(*K_AF{5OGenlPoX zK-;c?zgREpDi31`$(EHRe*#Q(+AJt)$1xR-394|+6;U*v4$I*DTzt>Y;rsNSw_uMl zy)QTEDXLnak1ieWxbfF09{rA}VK(7|?W_tqpyXti=1fq*zGF{LQIg{|GrM>wInM40 zN~3dklYJhA0y23J#{IZu7;7P8m)jJB&ix&@n%r!N@px{TDn;#c9`&V3%rd#p!S-!i zorgxfj^YA}H&C2Nyf^273CrDqi}_qhVU;#P)|*sa0<FF7IY~dxh9zHb!H`$iewYnA zI^#;q!Yy01hEo@(S5W7f+oxl)Kq_zLnJKR_nJe?fj=9?N7QsDyF`x!UvT(RkeCXAD zJ*^9KHx<rEs#JS+nn-Pm!f<L%J{P^g!PH*$Mx2U%ByZw%qDLUAv`Xu=%2q9xGOG#w pi|}jAdiJchx(F5w?a|`QGTN`xx8Y^<!r%1H&}+u-8v2;n{s|E|`mF!} literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_dff.cpython-37.pyc b/test/brain_observatory/__pycache__/test_dff.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2d9323fd2f8ef64b7c68952249a73761fa94da2 GIT binary patch literal 3194 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_drifting_gratings.cpython-37.pyc b/test/brain_observatory/__pycache__/test_drifting_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23dc401762aeb326c0e9c0d435d0264a750a51a0 GIT binary patch literal 3190 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 Yuqr{L13qk7jU~6?dJYt82OgyV0$k!PI{*Lx literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_locally_sparse_noise.cpython-37.pyc b/test/brain_observatory/__pycache__/test_locally_sparse_noise.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de509e0484dc4db28e258fb21f7051920289475a GIT binary patch literal 3579 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 C9<oFL literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_natural_movie.cpython-37.pyc b/test/brain_observatory/__pycache__/test_natural_movie.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fd2e092301361496b90544b154f7da0e916f98d GIT binary patch literal 2800 zcmai0OOM<{5cX?49?x@UlWYhO^5Bu-u?d0`LJ@f(B$5FU5W-qy^|*UxJv(EY?w-x= zYW4t|6H+A3D2H7*!SCQFaOx{ua^uX2s&?;eCP-k*<$86yy6Wp{-)uHR3$E<vZ^_*? z%lZR_<EskH2k?lWfKZFt6KiTmwvD_qai(tMYTliAkq0_&QknXZKdnYpqYt7Q^Tr{q zQ2(KIU`KT=RcWB52CdQXp%pc0oi^azV*X*9xwOfe2iB2mq!w#w$s2bLS7@7d=*q}B za%h*X;w*SaUFzPqdZ(U1oL0|PjXsexPA2#A?UaGsxi8b{Y%&u!GBVi}sp$6{RVj!} zHdXB&8Kud+JlRTc^zjt{a|<4E1&Fi`ZHl);-N&wedzy2o2Wtb}$UU+l0>95~@PC4& z=c>w(lPOabAqkht6EZKJIB0j#?kK0AQSCO7<U{oP#o|rSYx4Krt@k#*5R8irvPtOr zfIJ}C?gqr4<QXOJY_M!wY~%&YL;^G~Hh0Cw-E^=aQpw&bNU}vn48~3-;6b;pN+#sh z0Vin|=L48_o5-B+YIU5I$%?0#t@UD8wS-AmEXiQP-hiM4=EHJ4JA|9JflqLacp*wW zcyzWN10w+`)Olp@+rYV+bAa<S=K@!mJ9BsFQ2&uLw`26Gq78WT3k;8*H9f`yE~M7n zTZ}<XUE3<aH8ke~*PK`8{=y4wt+{2s<Ik}|?Y^o~$hcq<fZ=6WpAeP{`61Ins4!uZ ziR2_<LR}m&87DdCERl@H!^te?Oe8EzSX{dF9KHf8Rt?Soa9O-fCNrk$IF9FOoKm4q z>q%hJSQIRQ4`ry1YIHa>pJ|~7h-OaZ(Vb+fe7b{SsTDohEX&etgi|o8x~N*NQLoA? z5C}ho<O~wn%oab3<as1700Aeg9Pc3MB3T6zg(u(U&!P4lk_8lb3q>6BE<EBA5X%W2 z00O|FWjEjsZR8Ld_y&+T+JCX3Ff@dThR8?2Kw(OVAXh>JVNgN@K~T{pMF{u{2vq0R z+(zgC5Gpiy<Ul!VebpGGSq9~yJCL59T^6KmlvqsxdeuDf+D?V)EZI>L6pU=ee3q$> zPA_IUmNQJdsWLwek;4aYHN6Ud5nlW}l9!NNKyneua^}>^6naZpIWynK;3cp~md+XG z4Rh(3n_mXYB6ltb_(h$&YrsHG{wH^3o`x<0A97Uf!;XHySP=tyi#!w163Z;DP8rGK zWt;K}K(WEt@~9H*OKEWV%McQO1<9*Oo>}~Ax%j1dz5+jipfbxhOXt{WIl_y-21HdQ zPe&uhdu|jW*vn?5zXvfwvA|H*u|tm=$;~p7*I{UaJr*y_+ah;kXjs(V2XsMxoC9ay zox5XOI%9V$5a*@$oegru$m>S-jeOn6RU`LN-Z?k7Z(Cn?_dOZN8shT6Ie_Ewo6o<r z7IW9c-qPGP@%_@=HSy!p+%@s5maTDkSU<9CoT(u#h_WVrGoDQ&|8C@#k^eL!+v5)Z z%h*=5E%?C}j<I&f9gsT4zPhkqGWJtw=huw=^um7AXwED&pBv5ELNi1SwE%Taf3J<F z>IHoWU+6=l?VaUVnW(Otm#HV>I||}YKf81HlN+~H>xO{iNv3&rhx43AjS`+^iKF&2 zV2vs<A_2~Fo@P>2VdoMlxo(5e8qrh537 &arJjNaZGc|D@rAaMJPNYuRi%U|hEi z-A9#Q4v(s)qwB^B0iz3aa@}I15c_x8&LJf1-{4<1aOf1e-}Z2wp*~~b#D&K0WK-qo zXrI|L4Lq#lO~NxK1oi=e+umwoU+viXhVI)v=H1Zf8lY>Lr)%@KVN7o|x^nyvu>P;( ze|_oXFKhGWf4DD>9AbW>xGtVw>|(@`hkKpluYhimkzWw_RS~=any5NVci@O*Pn|%Q z(Gxel^7FwM&RFG53Ezt91;O7T*#3J=ui~kuqEm&vLj~_ob2^)_>)3z<5<H0l$VK3` TYOS@P6@)%?R3GkR>e&AP#bV20 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_natural_scenes.cpython-37.pyc b/test/brain_observatory/__pycache__/test_natural_scenes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc70ed6039d16ea97cd84b279daf2b9a1f603762 GIT binary patch literal 3190 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 ZJ_P0_EO%V9ZMBx%mg_l?vK@Gl{s&H2FB$*< literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_notebook.cpython-37.pyc b/test/brain_observatory/__pycache__/test_notebook.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cda6ed4440bec8b2d80e4c1d5f36e9bdf1e0150 GIT binary patch literal 6917 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 S|8SzbS+kTWpDgF`AO3$*Dz2FT literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_observatory_plots.cpython-37.pyc b/test/brain_observatory/__pycache__/test_observatory_plots.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fb3a9f5d5efcc72b2158fa2c5ee83ad1fb64400 GIT binary patch literal 9634 zcmd5?O>h*)6`sFct%QD7LKcz`ATWQ6#quM-Heg^SEg)O0uvP|pid5HVyLUCK*_n0E z2#{(?RRa0BB=I#qxI`tFTyjpXIj3^WVNR~f$(NjRNcoiadS*wf9sRk=6<F2uboad1 zKi_-(UiWKF_4IT}@U#E$Gh_07N%|KSn!f{(xdV@TJt0X{qOv9F!CTg4QC4cIuE{}N zLQg`SVs+F~dMd2ztaT}pEY%L^-J(XddTPCTugGgwUoEYtMLuEm*9P<fkxyC&YlHfr z$ah%p)Q0pSk(aGQVQa(sNLVvkJ1p8C(~pRnly$UrOg|<|Os<Y^9H*VM>$RevU?=E- z6@~wU9b@m(?w3JL7u0-9W&I>Pr|bcCWaBhD@fynPB<&fI^i%gF+DrRhNwklhd8z7W z*;&@hMyeU$KL`0V<llq*1mp+8`ty(<#CmwLz;huiXTtKuuzV>jUv4Q+0{vtQ{}m`- zf$|X0BK=h;Uu7r1lKIy#!t@BB4x_wgYcT$6w4V;VlJxhPRQ;g(A<P$MM-S4$-zZqK zah<+HhuFD_QjuRP^bkE%QOYtMrX#Q9m++_G*oAL2;yWDjjnN|^-_2e4jz)aV{*KY{ zknf{i_>RZ;PSAHlzFRx;ousGOMBDsM(=#F8?OpiJ#`rSyT*!B47rysmd=vD1$d}uN zFB{{#Kre=TQ#<lqqL<nEw)sucD<R+Xj(k_?HFl0&tEfWqO$okFKL|NzcI5n!UT5bc z&ZZ1+(3>G=en-xa=q+}ET`Q~fHoGX^ci3g|&ap}Ho?=(<T}iZP<20QKTfVzv%Xxa2 zO~l4@kKPYC@9oGrOFu?V7}F<+2fXKku~gKSF+8A!u%-Juwlq&4va9q{XhWk5kSk)Y zqKH-&#k%^8J_=izrE*cqJpK+XY9S;0qf^{4?fE5_@u!C8@U_CTr5VFBip+zry+zOP z%+fs$sa<iQCOyN=G8S6udJ2ZO$_=YnVm3pf?y%y4^VDQe9+-1VhGnf4>jrmO!7*K| z?dQyOR(Xk$vS~5fs4@NYV!pUY=BJAJg-5x?`Gqe?{_}_Vh1m!B!XkM%H@{dUGr7f_ zuemE`-S42RY^++|`nbnjk2sr?Aa%>}TtZ<Y*{bW<dY@S{DvVH*vl7m-g!6CyRLI<c z$2|)PlhBjs3YDn>_Df|NRjKw$0-Kbe37UkuB<%nUQ+|KWHmo(*bc=w8#XQF@VN>|i z;8EbY2ah`jNkeW(L~1CI$_*7#g-VdBRD!1DLPqlwE0*E9euv9k*K}-OGkC@IRcEOR zA2pX*W!?=9@g7WiA^DTU`{DKdPp7Xx`3&UeJ~5UJnq4xU8TQ%}7+cA)sWJJ4*-zak zPMz6q2~wxNyyiZcGnbyYrpM0LjnWDr1H2Z<z@;k}5X%cos1>b<it5&i0OD+Y%})_x z+NMXy9T<(9f<%&&_@}Io#t_OjiAypP!VljF7eeQbLgGoklE4=r{wYtU>WDN0=)Xk0 z)d~?CqKhn($aWNxhV+x67jgrHHzNI70#~Xu<VVo@mmo@DRRnMa0a-@zmFz`dWzXvw zIRF%q<O7g=-+8kFYW%#;Z_Q%U*pDWy--yoyXc#wZ%=Spx;Utt>_NIl(?%v8q?dS(K zNnPk$gXTSdutl|}=L?Iu*+PDybvVsDj>;d}Y@)R{p<g&eNm)O;-yudAB7O+{G(7GM zBn_zwPJAWBZ#AS1(AcW-T7DsWDxfNlfDm4Q{#LbW0`wTfGa{9-ocu=lE$Xu12Bg)3 zp0b}UiB+xl7~vWb#Y_k9gKqc;CPI;M>_V^gfiib$WDB`a^Nh;VNc0XQdJ2~`K<x=R z28qB2ln_k}A)f%5D|V1_m)s41V>_r}KwijnpaP@yA;j+@q~_373-jHCe7R~^!54lI zn)SO~VGe7|TXtwL2~^mYu|#UbajSY8$C893C8s*NHBsj$O3bp{$Wp*YR>DWf;2X$z zQdQmnTwlv>+Eafnd)h_<OD|L}xzW*3t0~;*{sPc%fQfgn2%3OL2A-LS2TCurCQn1F zrhs}$e8qO4yrrE6egVs*4NDuHuVLG~BDr4$ZEtj8|G1qM()|u)R{8q(`1|Ya%mH6< zTwkjj-m;%$&rR2J{ob4l2FU|6mgn5zexg=4YZX0d);Ke$uh?}x1=1>6j?4UnyKK~% zuGN@f`$^7f&Qq32_$iw`3v{Scn0Is%{0wxhci<OnFC{)eu0;Yu8xDdch5msEZ5yc> zUTL`mtS)|)<TR+psDkMryayG24r<qr6dq5FqwgEXuH13k@y5Y~md(m4XA~S3jLiUN zvOe4#*+ifZq!Rka^+RnH#PjOex?M5<16D2)IWD<Qc!bCcknwP_ftf;);<5s`)!z-j zfMxem+E8AD5d#Vp-;Y5EpGphT=aQ#2Brj0~QF<w$R~pJobyGxWR5>P@PCw}gZ|HXi zGXY~w>d*attRx=TFXB0*&Wsg*plrfoHP;z=W_ruSc+Omb3_p&ooq)vGs*Y*<J;F_+ zCnhtq3mJ`P@LONo<b|+&6?$zK&#;giU_;tjpq;>jXu}|#0hwQgn)R_ZGE(QPOdM_^ zw%>gZB>zWj`2_SAV$08CJ`0IHD)7XCF%Ig2qXW+X`zCPZ=?GZc*$!5I37feLNr)v! zuO{&0S1>2cN@QF7BLcrB2<;#?fMY9&A3#l9H$(j1ICTD)fUX5FFz^=a)6A!)x5h6b z0JuOm)$oVn73iDen(a{iG6vOkgzE6N`sS8V-QGA{`gohBxnO!t!y;wQzFcK?=|_RA zdsD^S@>emKZXisfksYMrp<vSz9*tE6ixzg^ZwHFQZ72pu16Zvbf=+uXoZlat-_FbR z*d~_H3yE=l9fS8Hg!f2{Fo4i|OZ4z~8-gCI)g3qn{!m4{iFl)9-`3V0-2~4o$Fcik z47*#1-AEie>I!%9=GSlFDI$IQ;l^%vz(xgNFxxm-e~y8LJJjvK0$cf3EK~j=3~+xg zU_Yp!3y5jPUt*}-K~xS!*3AyW8^jgyjrF0e<>nsmjVl(vuwShF-mO#EdG#F<%7i<$ ztsH-gVK#-BWg^VlJm>@-dWc(RB|I<_lg9USWdru5uqPFIhg)R);mIi4DnEpR*ea`H ztE@&_<<S>fuvLZ=5u8)@u~}AIHp@F~=z1_@LYkx6!z(1j7FcZC{B-+VcZRn|z}xKO z?=Zh;<JOJ4Up$kqpN&A>DuXzthqn?$gMV8fO$$g%4tH!r$a;UM<^Tnbhozl?ObZ}e zTK;DY%RFLvCWa-PHcb|X@<bC#@trs}BL?v}M9U&2UEhXgX&*GDcAD|6eR<EEc8a#1 zyk*Yd*tTUfrMF<o^a=THj%#1y)qA!~e-A<T1qLaa`nQpsQ^OGKfi-g%<@{bG=a{*V z%lcT12G0pR67<^uZLfef8rHs$<-#TIzHoX4o>9C1j^Km?xPTKQjG*aZEM}q^pNpe7 zGU-BOuFl}>>#f=l5s&a&hfhm8e=2SN>1{wg2$Hl;YLC50;0GYM6-GVx(B`24{dUm) z8%ZG<O5r|A;Zh_85n{I1064r*AvWHqOgMI2D2KPB1Z##KVR3zI`>$njz_@GHR0yn~ z2gV<UF(XgB00rTR;i?zHRa)eU$6h3wp11+mSo`wD+TOl+P-uVMv`ee*GMv%&<2;hW zCF_IR%@IPD_8y`c6rySC68^Iw^w5c6xfiX?$ACoUV?9}4LwXUS(9;la#GQ;~E@edo z(ocvNKLx~k!d|V_*Z677Pc&~`vf#Q{Hg@YmFpeIDyfN<D!V;s-#%{p${uq(oAEOdc zEd5+GmKaaAZ8yh3F?JtG%%XC1PkLsTKAK)2*kyCnJN@iF=!JvksGj<TUC6gn1KzP$ zCoTj?SFKeSf~I9h@7Y>RVNrY-i#ir^#4AU#>Y0}5nG9m%SgH4Jt<{z4s^3#zsgUM1 zsLS#0%<q8vIumwCzFJ|P-YKLnV&8}1D<8%LBZa;uLg`7kAB0euxLVNr7Vj_Q^Q4$B z7H8)RWJ>QVF6I_zr^&qqcopsy+bME-|IEVdUHrC5(_6?bezuUCBgN@_Az#${o8<@d zk7n~^zL3`s#;QneyGj_r)*(%AM>XBv#p2`nb~@3FJ~%f&otvBcf)pR-7K(XNn4c}? z_4IUp4o3ShKaCf~WOhb`3w^C-@D)9YSH)&oKLDl@E_pl-@of=R<`@;_81Lg4&Egny z;TSyNcqry~Fu_BO*o1T3J&LUbM~BGK9*ec#5}MtN&!%n$w@9~60-1~3dbj`rcZ$yd zJk7rWEUCRv-=(Bv4Q@=k<dl*g48Et~o+A8Hl5(%2sj0pJq?HFdevEf_*iQ3}V+_U_ NwBK6a%y)s+`yVd!hF|~y literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_roi_masks.cpython-37.pyc b/test/brain_observatory/__pycache__/test_roi_masks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47fa26ed945a2c0f5575ae347fdc6961e6778b4b GIT binary patch literal 4778 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 bFV<{-&9C|^{*!*A?$@3AdVRI-`>X#2U3oEu literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_session_analysis.cpython-37.pyc b/test/brain_observatory/__pycache__/test_session_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18f2b7c580c548cb667d2f4115033960b8b5c4f0 GIT binary patch literal 3099 zcmdT`NpIvt6t1$}Thg6$_GK6*?3jVhGGv$_gh&FMP*?&2S&gi+%jvk|wwtO-GTkHx zGIQa8_zQ_R@t1t%G=E`E^Ir9mrNbalBs6Z-^LwwBe(UGjD3yi?Jn<jDu=Y41f1%KO zGQfNSLlQ~|C!9va!M737hT#|#c{4H_mSbt&iZYF?lhr(pa!xL=>UpQYGd%m4I70!c z5Az()KPHc;Q`Ay{4{52SrD0yw(g;YS^)k}aF<#;$HF{?7QC`Mb*gJmh{1_ka&QDxB zKfx!v^OK!<KE<c?|4nt}89uA!>8?D-=e0b;={B)%J;Ata*)+{GneummncomBjKB0` zAP$&HL~HBN`;;lR9VnO`-43J-lXyL5QA>u>H}C*>Oc+@hn=s^?KomJ5NA!_#Y#bS< zlv57xy1~sk!mSx{W>RuwfCZT?0f``~8N}Q+I($YdCe#y5qHU(LZX&{(TMLvcRoK{% z_NA+s7X@iSg6@Dt`$1|(iEo>Z#X*%?F>3@VReusuf-{~TZ+=+)4*Zc-w##_MV}~qm zRlx;6i8;Gh4dMe?O`1V0eV|Emw<W7zgkDvKDtNES{5@6+U~d$`3ck0f0;v`~jFOw2 zhe@kl*$I!!y78$rTj@k2@%OISUIDvg9tfdBG*8Qh7zN%(1wI(fA`BhP_kmHQPEQR@ zO^hWsxrH@|wRe_3qsN37j;XTFV-B$$+ImVC(~LGewOHuMbU2K66478P^krIZBz!*# zTy)6gkmGdtf<tLu>*GVOJ(lb%cXfH`-rCaI@=66%j`gtBW_Bhu5}8_1JG*I)c~Uc0 zJqcrBfz^<`{7wjA!+aDZI|y98!jMd7rb9+xCFW8WmdoygDA9Rh6d^c8!!m{p@iNFa z9v)GKQ^gn(zzHHIkW3<(LNX1cU0Pkbzw*I@)wKtGzdbu6W^lnQk~t*vNIEWyTgbnJ z<Tes4!Rs9LbaDqAy#vet7e{+ZURhaQURmxt>)(j8{#W4EU{)7En--c;qTHQ`)jsdT z3BpPNhK><7ivp-t04KlC18|VKaRg298wFT4<$^L#==T8JUz2ah5AcT4x3=0&uVE{G zB7(|5!@5w$y6T~6RpswduQG@{HWjacP2bv<Ktpx!>IzLq)+GRq0)+fbh(rLQVd3i4 zR|{c8w^zUHe}r`%L@+HtgrXr{1I>#Z5UgbJDiDZ*<}qf^kAhc&C6}Y{I%r<xC@i4U z-6&}OpQGUa1bZ$=;SJFE_@TrHYYvBQ4n!Vk2y#l#$T5YspnHa#R>ld{jbLm!qiR<K zLI2aV4ybHG?Wbj3*j?CFt!B_O6H7KN_9|1)TmiA$mumOwIX}aGiC{<&xovpgkm(z? zDe!I~-a>M*wBAO=6(jFF*GShpfj#GDz5~(?nYnqLnG0y)e=yVk^^%!)L9%C^Y_o;l zITqe6GzdBG{u{g#CY<Bk?Qa=C$4W2#y_<~wy6MlJGd_rj0`D>!2c6tb_)zVOpo4t6 z@fTn+wHi$9Ik`Bj?W(Bd3^$p8Yk?ABJJ3)ku+s$=x-J=k2@&Y-g}mwv>-$3fqt4~! dW85W?0A}i6-prc${74CZSvp_njdHG>dj_wi;;#Sz literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_session_analysis_regression.cpython-37.pyc b/test/brain_observatory/__pycache__/test_session_analysis_regression.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df9d429f799bf58abd3f7000cb675adce51c81cc GIT binary patch literal 8982 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_session_api_utils.cpython-37.pyc b/test/brain_observatory/__pycache__/test_session_api_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dee177261a38f3f644807b4b850a5bed1bf7241 GIT binary patch literal 7520 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 M$+86LIjR4D0g<M<FaQ7m literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_static_gratings.cpython-37.pyc b/test/brain_observatory/__pycache__/test_static_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84889d2f359571b7ea4ccce3533759ca29fd0d40 GIT binary patch literal 3862 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 VY{osaX*YIx4bOL>p>*Lw`5zt4(G36q literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_stimulus_analysis.cpython-37.pyc b/test/brain_observatory/__pycache__/test_stimulus_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..897766bd3ed664cfe27f8988765337dde78ec5af GIT binary patch literal 2679 zcmb7G&2QX96t~CruGjmKO`3jxLqW9!>46KX3Zj%sJ+uK@5S6u(HStWc-Vb}3@uo@T zB0+lKl9ChRgj&Ic3*t{e`~%#5;KHT(7kc8o@vOH=kr1~0=6%iAdo#c158G|efG7Fs zYx?JL!}uG8*<%Cq0etc^Ak1Lq$QYY}X(CTXBp}dQBWr92_Sgv=)8J%KV>WXh8#`uD zXEj!TYy>W78&5svvc@yQJl0g!CL{L@zqJn|8@^d|?`83LI-1Js2_0?ASg!h{a3(a1 z`bFao-H4+*X*7(`8=o3{xVjtg$tOTESREs~<|E`R#hJj_iX*@|xtWu7!fLxDH$t@4 z(FQzPUCmp-H&h?wJZ9up)yD=6tQzJ(uBA8!xOQ&mPUYp~2JEY|TGScMsN@-J&Q9o< z7ar`8%Z!dEvhX548fAh;ToxBMcos&f5Io8_3)e@}RB##bB;sM|;uC=zE?R<TQ;~$5 zbTs8f6Z?rY4r3;ZqiPTsG?Wt_!9<BtH`w~Ro~DByAnGv-n{7qoqQ<sxS;e9nY?>r- zvVlWz=GO#9STv9{k+hI>kSqcLyMufki3=p~=A(-R)OLaVVu&SZUVL@qYVUK&h3wHj zWh-m+0Zq1hknJc<7=5S5lTF!6Cp?i6&~(z@mc85YT2ICqe|tisA>H86cQgVIHoTHS zB(JOq8Yf}82E%UBEEU^I9ZG$aLaNWw%4A!u)rW=1b3hE@5zq99ZFbBSyq<|1XjH3w ztD}aS#67B`b_*Ct`F|X>>HyWM<5JHJJb<~C+v^T<ck%EyR*TkJoFtHRwgo}=%`(jk zT8U>wg1%_ay*6W6bPw23<4!mohGLo&UCg7(UzklXnfmMqyyY+frqp-DGBn~Sl4D5V z;v3=w63kUejsRCIj^WlF81Fq$OYCH*cwx*ijzquW6n3j;BHq~G!guyfkoO4^3klA@ zk0FgvhYxD-jH&qk3R;YBX6_g}WRHCJ{UegWh21e9S-CZ^GBU7-L|)FEZ%mMDT7Fl{ zbuHi0va99$T5f2$uVqimTUu^v`CBcwwETmTA?rgTe$U!4b7u!&P;m<t*F`S*IX9UF ze$SP4v9c~z+!5uMgCFc=&lF3_bGfq5M?9)L?}DeJJg+IwW0mK8%;U=QGI-XMCsUsP zw#pM#?~@gGs^U%~mm7mKPtQIxfSbj<v1iI3byUizqvkiQDdUcsKa|E8oU8hmIY8TA z+IGIOmH9y13vIhl*~;8B_J};DXDPFTnpytK{GjHl@*#t>0PF59?!g*dRM|u8EdQ@n znt>kk^-7a#&8157L~GutG*40U1(d%}jl0HuXw@x#xH^NSl~)jH<y9~`T<KO0Us-Vm zu7fy>1i?z2M{)s3d;#u|50w=FK*kTb|E9o8rS6=-`xG?8d65a+@RPeYZ-0FKqoQ+N z0!C(Wn%op372r0nKS3)@rsFj(6x;-LT~eSoDxiu49+r)=iUbZoRWt@KT{oPGh?A@= z0t)jLvS2w-=&vv)=+fxRX$(jX3kU_xxI&$v`O>^|2nuRtO$+LJe$mF!5F&!(RP7^- zFyJgqu|z(Iv;Lv_6tu%RV#-O-or!9T0B1pGrUBpu01Xyra_NDpMmPgi-!3cNX<Wxi zAO(^1FjBU#B87b_5-#O!aFTr>hHXQ6aY@%a@Df*nCs=f=U{n<%<gg&A7mF0Yt7k6Z zi*5Cx+$!}z#U+@_Zv}7tpOaV~nc8F<mkz&h0QKd0LP!qk>+u%+ZSZpM3fAp06~mx8 rp#uJA0OB8VHSbHIP~}5a4)@wPWz!LVA6F*v*8z9iwK~i0f@}T*J1eP+ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/__pycache__/test_stimulus_info.cpython-37.pyc b/test/brain_observatory/__pycache__/test_stimulus_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d24ced51eef4454d722e84f23a3ae7d79536cb4 GIT binary patch literal 11670 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5574359af8633551cd7c9a5c67d03834b8840782 GIT binary patch literal 2286 zcmaJCU2oh((7U$p!?{b_G;Na77MB8&E4Wmu=tI?_LQxS21*8TcStnV(+dbbVcedHx zOL`|C5^8?{?-VH!PrUR8nJ2_kB>n(AF|%h^RgthYvpYMpv-7pHpLV;R1z-B>kMUnH z`xA-!vtjZOKz##<S&U4qa5a*U7@CF@Mmn*lPUsMe+01!vg)Vbh1I7kxvKEX@PET5= z7Hc!_x%G^MZAPA0!P*&Uwe|v1ZhtoxnyWk>@+Vq~Jm(C@G#R1<egwb)cm$xX0Mgb0 zIicD<CCk;^DZsu{3VP{Y*_K>oGdbica7&u0(#c~zE}KlqG@kOZ6-6U4;ZamN2bo9% z5_SfB93P2HMj-Q>CEIYuKl4ZT`rj%pRX-lbtT%{{<8<EtB#nnz%HlhHo*t=wmh)5% z0cZJmuKHhzL0^G4AA&cBal&EmWC9ZGa2H(Ey8{`EG|C2`_9)hwobT2r?}FA5%JlMi zc_HCCdgTQgg%&A{fkiq*uE97o6inO-Omw~kLR$sZ<QbKZ3&O}DjId&xm3IsKfG(ZX zDeR@gXh9F?&ycsm0qp$ZFgLMb&EB$}K&By@jlBhZ@L=)5qimYTm=j-_)F}U0=&^tN zDsyHXQ`hqsj(_8UUy|O!{Y;ET_X4N%gc7OJaXRFZf`z4%Ns)vO13u)afxe3ba+R0P zgpYLT0(-2(t{I}CIh~sztPoahxs%T^U{S0foLcf+){^VMRvkbV*&rTiQHM|>F9JQp z<MG20!9;BXCRkGtElaL5s3T^B_s$~s_s87-Pu6;T$T8o(nhmBIn@zYsQ(SpId|=c# zOZ_{&yZ(sBdIo9q^*Gl4G@kouru_jZgz7ksB~!j}O^d;V-!QuadS-($XAMC6j{{oT zYOc!85tO0G(nzGEET9roF3%ytx_B)lm#UD6B+Vp;a6t79^)?78)M&XLafn2Eh?fdK zj8zN31fmD4g>_(^KqweZ;7Tn?MZ@Jz2owlmjZJF{%B7weDOyRvl{d6q(e3};1=rS` z<*~KI5_p<ht#nuys76Jt8>(4R=h%7RwJPd@q1u{0vzA^#p!Dqn=fo{Mw!tp4%~OY6 zdSNfu3MlfTQ8d}*7tXT7w%E3?3YYD?pn?dp>=vz`h&*4c6<xNqW3g?3D*$iZw~97! zZWWz3I9Gwwg(A7O&?a;HW1;+!c#0YKr(!CGhnRRscGX*a{xs)OOnIu|wutF$B77F> z*q>yH^5c{lHPA1zW97qbgI1+Mei3WPyg$mMkJS!$(8!hRVu}qWQqU?uL*Rt&7q}9- zVtV`TN6F3K|Ni0N{?<c@i7wAo(oDw3C~j8IkR>+_Kap@wn!KjY{#uH&5SYo!&;M9# zzU)-0&ex)~u5v4z3avSdMw3{LqY;{phlK4~^mf^;r};Qme6QT8X=waf#1q)Xzn}4R zI4?brh*tLQmupB=vf+hQ+-54$e40;U%}ZCL`Ajc1OeZj#(1l)pI0@{sSp}zT)wYJ- zN(Ntqz>)7^0N%#{xW=xKsu8FJ?J8{5iGy3%tP&>Q#ti|Wu(7f*Y*xkv4bXvED{biB zrbSC^(W}dfH!N5$o5o4#p*zUIr%YZ&bRCh=?c?kQqIVG81O#oce$enKs9nI?2|INd zkt!X;Z}x<1wI5OCM1)fC1e#LCQ`BQXR-;AmzfJ)I;ONnHSZM%WrwyAz6Kw%d;yH+c zs>Y7nAe$6H_CQnMtvtUB^RTgMN#U*fCG440&9s;ZEx76pXG&+&s&(U|sLUI&iXirE n)33s2Ww1HnH6Kj}H19#{{;C&$jAgA%Uqer5$8NbTujTy<E*5O1 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_behavior_metadata_legacy.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_behavior_metadata_legacy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..302c1eb35a000157de46bf53341dff8be84109b5 GIT binary patch literal 5795 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 VP3I2f;8eBsjcrvjk;76Y{|3>GRV)Ai literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_behavior_ophys_experiment.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_behavior_ophys_experiment.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0928221a3911094721cef1c4c03ffa1d3ad8d14 GIT binary patch literal 11566 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 awG)Le7lsgPMJ#oHHnQUi%Z158-~R)+0#UO7 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_behavior_session.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_behavior_session.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a183a5a4c2139d0e9ffbba94e6726bbabfbcb7a GIT binary patch literal 1240 zcmbVLO>Yx15VdzVA5Ghowg?cX6(@2aIe<8zs-msnfKVkU2xLXFoE^7WW!Jm1owlix z1GM7GUueaNGyi6<ocIfz7;l?~79k`Y&B$xdyv)3L-dtR45M1iZ2l34(<h%QrE)O?P z(aarmK!7GBrHoPn9{4AOc@XT7R^<oYk`^tNHf3Mz$C=)d#>AP5sJp;bMQfsMp&5$~ zD0nAiLdWEkoRQD>Cf?XPr4~`g^vtKkddFnqkNs2sj7)-e1cF!OHF-~<0#&F%9p<0` z^RNJm(1azp0n4z`Z%!&U7*}j%930aPa!g@$P&c`)exzlcH;<w>(%8`Ug$+Si5o(zT zD<Mp!?Pp**!de~ohE|$RuCrWf8%q=JX1WpLy4GDNv_u3u)CwWa<C9VQvT4`6vmMuT z;F`v5i*A2)R0T#RyBhf>rTh75>q+;mk=k@cUqHJj4ul$YH<XAn1>#{>s(sVNij;}a zXL)~Qx-a8i*Thyn$VD^|dlGY#1S4S3!47Pvr$wxI)<f8RVKY7I^e*O8-t*}fH|OJO z=cA$l!!#Z7SjBeE)$J5O=+O%Y_(uXyVmx(B@)>hnDBu@_w%3v@5{X%F&tQu>FX1`g zW~<jr;4!e<d(v{`9%)a7ilhV6ab(z%yU_ALXy6*>#_pB}S(3zR?@9*jvPu$115?y7 zS-1+>vK9wi50!GkCYKUe?HtUo#jEGHjE&P_GBiBb(nw{6MKv3?a(QlLnmg$jwmLhD zQzS{GIaX?g8Sq?afq#!fWmW6|d3fHc6*Ziwm4~*d87vJ2rya*E{1=ynkBTUKOe&fi z250JOdZu-zTU9onW@;cuxv)`RyVq9ukv%NDo?(90vqfDV<}yO5&m^ZSF6{CD4c6tF z`{+ne_ZzfHt8~Tp=-+--UoT_qcFSjvrW$SkA<y<y4VRm#GE0g|h~MfjA5YmteJ#yk On8<ba+)BwV1it{uA%aN& literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_criteria.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_criteria.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..410c5945c21fc19bcf0bd13bec4af30129cbe7a6 GIT binary patch literal 4993 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 VcjimDZ^#j{JElsO)HsQg{{W!WdRYJf literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_dprime.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_dprime.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6612b22a9c1d097526bfd0fbe32cfb807f09be0 GIT binary patch literal 5443 zcmc&&OK==V8J_NW>}YqjdRmrj$8lax)^TJ*AR$I&IWLDmA|N3NOerj*?a^vhvoo8X zUfUA8RFSxff~us#fdeTQB^4(woH&FNXKq}$%!!2JAh=Kkr(EFsduCU%WG9v4z-;yV z@7LGg|M%bf%=mcOz!(4e$Nq_V!}u!|hF=AlD+uY|5eY-E$ncm>xyN;CdX`RY&(^8q zIY@a_>bRcU8S}<EWv|?+c$H4ot9Hh{ab^THVZOt>iGa5!g(d8p21--t<wVn+8E*y> z)KU_zZkZKhqI}cvj){t>BApZCqK5Rim=Kdl=f#wmM!JArCw5MXnSk${60`Un+ckB5 zPRxz+$B~~O)gKoNyJpMU<>G`msb{-Kuvd-xsXgr1SgAW%wH2twMyMLnS3x#QrFB0_ zgN7gZvXj?NQ>{#*D2!VT(UoB*$j(unlA#|pnn^EKh@}jgDiBBe-+y=6(adF%DaJNq zKW@?j>2ne20G~xjf5&i4Y+xv(&33rpyNu;|);D&UFgL9M({1}@-e)`Jt}!tCW}hz@ z69%PAhO&0-KI@ypx`j~&Rv!noVC*=;5v7|L3uSl7Ks>fUaTz^~osu5grMWO$WtLj1 zONJOnT0=U4bQ0+l(rKhKV)iCvcE)y%=Rg9~9z*RM(&IFCyDa8uHnAX1yvtF060N5w zrIo14F4HsIQ^=maP4-^Mo;fo9eM?4Y3~X_K-xd!*;z6VjVeQp+Rh$(Mi$_4Jx;Q5u zRpafNIRCDT_Qx<jV$3<QOS#2iId2mekY2=CUqJdrq>m&064EatePYSDak_8sOwtbD zoL=PvXHe>w`c~grGTvuzeeeeM3Bo<O68;-!w|5Sw*!tj?^zALzdFC`X{J0fljtCUk zBk81@5Y!)~9N|@jw2DYD!CSm<ETF1xu4H!8SIv!#x02r&b(XOkvIZ#~ebRsS(&}qz zAk$TU!xxKd{&hdzT75e9n@KGE$5(^+TDqEagE(y>PP!Xg>FP`2+G-lA;IXdX-1J)k z`bH5X#O4JRr0T+&^uxH3tYO$|zDnfQg|%SAzZND^w-@|f>~3Z5Qsj5mgn#)Y7W6L! zWBZ{_(%j5dCT*;TH&jmsi%U_`gt}cuCYR63xl*aEZXn4#Wv&d;ZW5<KIEme5l^n5# zf)*A?{(jk;k->FeibfP-jtHt8H@Ef(OmFI7i&oXE-nidWNh5Cv#0YP~+C<QJPa@MY z`o^2?fVGUD^S5w}`|#rE_~OOPl*#q|N=bb_DKAA~s+visd-*<;QySGVwjchC?GO8S z6}^Xb>34#(g}(UiyW&-ISa2FGwJ};TF=Vvj`%&nFBT!ga=mlfekf)I|7Ytz?H(IcJ zE#i&6qFJWFmB-MhK=F^udMCsqd1y~^3Sti+$Z14-G;5uCmVYBmy=s9kok!aG;p}f; z_-I=#d*em*wIu3wg4-56qBISbFIZLue^pyDO>Dik(Xt5ZxSN?_yk2MW1TAAka}Bv( z-a}MRBYKlV!VHNpnw@605cC1hBBKwuI-o1hXz~1z>o{)x{iOhe%i}0Z+?_`zUO?Sh zgyN9B*|o@zHyfgd+aye4Tpv(wuk`X$`oo2p^l-I=!n51SMl8G%iW24UqY`jMF!p9B zBCPkw@`oF{HmSCwwz2)h8&8!ll>osBZ*NTaTgm$MAlM9_x`?eG8|q^t4bqfW(CdXF zvq*bA8-1~wTI@shaBro}AP!Q`O)*q2>ZM*KxB*2AVuf4HJ2tFt2vAdoYdzXgeM+9f zvN8ud6G<nt(jdV2Fd<tR?}}{fIbZo#iMyHE@w;eGr1C71&Rkd)357{B+wXRxt;__Q zGk3U|%<68b?ab_{W>%stVQ-m@KAp7gdR7e6p^58_g>iA&YMywGR*f`sJAv{snxC=F zj9oiKl5FM<3OJ6vq|YHTOp8_7Bz`Wdaf@+Q=5weyfinH(beKarhgQ_^Gmx$Fyw&B? ztj6RM7zbxn5y86Oi<AhPYD7IcOdH`@g!B?LNEwQ~!v^eqcH==(0>OpZg0Ajxx=P+> zZ&q=c@PVn!9SheqT6USdr0lop(uR%;Ym-ZXJTzU{lo$5E5{`xI4*}Ou{PqFK_X<e| zlJ7y%){<5s`Q1XYgw_uajQJrX;Sv;MS{QTjfaJ#q#{3wPr2}Kyv85cWl?fMn!i7k# z3QBM%P_m0sS(lumRMDkUQL0i&=(e{`zhM9ew-2`i24Z|gl9ou)U~R!9o#S_|O1dL6 z6FyaDb;2~wDhFJ-tX7Z)cE63QHY@pS;ASA|WAaJrXOY>KkJ6YABl4UujeAj))t*kF zq(uJb!CskFUxB*^<;zPBs2s#XK7uZFS5ttrQu$CDOu}WD8;-BgxKB}ZiK4Gkbh{PH zPHKYQ?q?1!N|H~{BQi{vong~#o>`#Wkr?Ex6~AdqJ_GqCb)t_9AF)s~@cYPU&N0N~ zRXE^ZkrxalU7Odn920KHz!<OrS1{Oc8^Kj!y=#G;tj%}eT0$O-5+(Ar8H_1T$z73j zQAqLt_Dn=|OYWnvgo><|MzDQws;`HzCf7%HxAmI-{=8gd{<e(1WW00ZQzCPQZrOyd zj|RSa)QpleI68xay8x<q80sk+p+PS9&;kD*Mo-CMFiZk)o=-CQHIzmQOv?Mezz6UE zmj(}T<?vYreAZ{cC+W<vxqa#oe3A^;r(;I2Ys}>Hl)H+kZflYr9_s~aKSaod5lRR2 zNI!`Lqz|L@BI=q5`Xi(WO<H(*3sFI+eX<SdHY8h4zWowjHzOjB+Sct=J164699RVz ztpZJ3ftYyRP}v4K9mV^0-+6}*O3G~0d#9uv`Vmn<Rp*XW9b$buRW;UkIf0-4WB!fR zTl`8Z&rDybmvXXd^hxaw9YJQU_$x3L`%~P0uo>TwnYr#ud8bpE*QavGO!VSVC4@D3 zKskkp#-~8zNmgd^Wz>$SOb6p2=)?H|GI&zr!Pqticw4j?o{C1B<4I_=&4G=WptLo# z4lFnav;Y!M9Ds|miL$Hc(c=Q@vHqB_@*62#RqoqxtzZkBl|7=&5&irWSocWZTebgO zyt;Y|kdECIt;1Mfriseh_UYm8-tild%y?7c^`#&6hxvc@PDqEb3R;DG7X>Z9x%DFq zlhR#eFpE2^_~poR`3ma)ugJ?4tl;w?FTaTntrvgx%1<_b0n7U-$P<Yq8AhpD{`ruX z-=dD+rs$B}x%V@0e-C}`4mdgY+Y=k|{26G_`7`;^7H0CF%SGm(;e<TCKP?Zp{D)y? zxk(yKA8n8FT4Ow9a?=C8>%Ubtc{-;Uyd9W#cu?nXKO#-fjp__}h3?2rBYmCf;yEp8 z$=7wQRn+G9CeQE9I+rC(BsHj(B(BPrC?do%^O_$WhOMGu%lG>$2<5h*RE8Vt>QF;k z<MK7M)lYkN-0O6=v}y7jxZd<caJq2R{Zu<Za*<}cfXF*H{2O5L$Ugv!!xzV5p+owb zCaiK!Xm)6x&~7q&JxY8fzfPl;ia!DLeS~*C{$PV&20ts+4q2|jbO%eiTC@q%+9c_O z;o<pm)2noSdTihYupMN!F6jLoz($jcUgr2yqLYYT6kI01Bt46$aNo(DH(j%KzRGK- P-3opa?j(Ldjeh?HkTLP} literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_event_detection.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_event_detection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce22674e861f3e563a603caeb79250a5e32ad577 GIT binary patch literal 880 zcmZuvON$dh5bo}IWD>Hg_<#r=_8{UMOb$6Ivg^8dlNA*o3<E<?x}D5sGBb2{q6683 zq9+OZ6B4{Ac<>_r1Hroond^eE2hV~ht0%_YRcoj!y84@{ud4dm%1Q%)q_3aQj|8DT zeOL;d(N$1+0SrS7C&<H<CmsP$5@Tq3CPvI)<}>734BtVnwGU{t?c(y}!#Gh~1boa> zB?Br1EqeM=ivd~(-2#<g!6-Dtip=rLvluBunKMWSABl`PX2uj_bRS6ELbuU_1MJ%0 z*a!pKWY&}%!5_+|5xY=f0<@=i7f;ZR&CD}sf){>3<SSKsx`^Aq<KQ9wM#uj!t3^hY zi$KJg;0b9VsO=2UtUgEbi^ehp1F3IE&|W1`x01aLn2rJS5E#NP5qcP2GYwQc<bhN? zm;3rA`u6VTrSmU7Z$#7YA7(#3y<c}5rJWawOXb;u#*)jjagQb=eqD%62)(hAq<Lvo z!!9k^r#UZIH>Ko4#aUXxpmZp~B#CP*N}pbAinAlTDjohf=RL*QTO?K?_0Q*9m;Jkt zO8T@<Sv#bUXj=H2DeYw`qg|h;W9er(Ph}5mmiG(k--ttB#)@CeX>ULy4*w<zAlRUz z`{;zwM;c@yq#aY0iJ}woJ{`xIsO}ex0>%|EfezYvQMUAt!GB(t10>}sFbFsC8foHl z<OFWu7H)wT$06?8o|TS<c_C_W5*8S*yCl^9hf90OrCmMZ0~*z+tBloT4w+++vUIKt SGd4>2x?ZES!8q6<P4gF`{PI-* literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_eye_tracking_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_eye_tracking_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ec6c7bd0f6ca7d3f7e733ab2e0a7d6b9c7a92b2 GIT binary patch literal 6857 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 D18%=u literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_mtrain_annotate.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_mtrain_annotate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71b4e1b75a46b6c5015a668e6e08f96c3d341984 GIT binary patch literal 834 zcmZXSKX27A5WsEcFHf`!5)xuzU<nfM4M+?KC{WZ1b!l0wNYTC6<fYAXg6&s`)CEyS zz5zokCcaWuCN^d!&Q1eGoOI_q<<7bLonLHi%?OJ6`T?FWLcY6Tk^r4&sOBLWK?H3G zA5Y2|#;gg}ArC2$<R}t>2+znz%3~3U_>AyG&;ybsKd_eUXLPs;O0^cOEXozAN)|#| zS=!QlpCmzN7uDQBW63!cR4}Jii1*_kM2KGWg<ZJ2<9*JmmPaMna#djk%Fmrkhmef% znbkEkh3z{zq*|J;RYqoPV4dLCUV?=^4Qu(0=m<-_`Soe{QU2OUZE{$Fm@nZSs6KzL zplp?Z2f0)yCT}~bOo_JbR=vqz)yv$}R^IQRJcdeQZPQ?eI9^z3>|&{*Rz<tSYfr$o zx?e2i3Qp=)`|rit`h*G4yz7V9cWxXI6T87!NM}^LxTG#dac7F^i5;S2$tiAt5=)QR zd2oswyXE{483s;~9TnkccEPUXM1OKzmdlBz96?6P@wl<WJzQg`kk}B9%gZ8-kA~<F z4Nu&xwW|0HFgU3#(A3ft^6ds19v}E98)x_nT)XLp+pe~l0Q~zxwlU$7K}zpZ?H+8F z^0@0=5uSjHF=G$+Ch+tBn9nEX^AWf2oF{MU_jaSDC+n}i(wcu2zQ6SGx)qy7K6T8E MgPziqT@SXC-z6#1Pyhe` literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_prior_exposure_count_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_prior_exposure_count_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9afde5e36707fb424b36a6c1987f160e8d847f10 GIT binary patch literal 2859 zcmbuBPmkL~6u|v2j+4!9v&~Wpv|!W&_&}<*5&~2ewu@RSL5kS+fE8(&cqWN=9owCm zY@5~Y0kzj&5F9`~6mja6kK-$+{R*6TZ=9srZMG6%%WuXrZ=Pq~{N_F1TwSdjaHW6z zNSiB$@fW_#E(<DOz#~yGgPDmDn!2<?8%is2MwPHKazl4i4XdWXZ00;MLXTCL3uTQ} znFnQ^ncGHCI|3_4C$Ni41FlFe;!F_!D9_|ra7k1~B$qPIQlcg~FZ@%K;t?HiP*taD zWTRNykr93nFB={Yo-KIfPau@BV=}xgc<e!iIn%qM>o9$ox&w9ZnGL!Y^p<TkXsff8 zrxt5GwGPpa?o;-T17l#stVLTmu5GHyfx%Xvnuiu>xzDQy=7IIQ1#YvzJ!|`0_qbHj zPct#1iQnTxx(6=usq`Q6B*8MGlKT&bTyTHtD<6I3$I{npP6vg#*(uDM!h}U0X@Q$~ zgbo15H;#GO8)ak3Nz95Cql%NPPiXXD9Lre2E*v>9rfAKkG2fh+1!m!-bi|>o#3|#C zpklFp;1yQRirSY{(OUxg3wN7~n9IUS^TJMPDsV1ERlzc2m}-kk$%O*Ts73gLF--zn ztfP_#VDLzBR(M%Y(KzMog(2R7uD^fT`mB2&#>g%mQr7O#hcumZH&YsADWliAJl&Js zEa$0=KxX-HBD-J5y)G<^f0WZ`7x;m(Ndg*d_cG4ra!<e~NY(?hdsJm&a(T9H-G2gB z5@q8Q3C<!UHXXF{NpT4com4ylH6As&0m85xvjKP0ykMRM*)Z#-xCrgbk^LEZ0GSe4 zIAaVkb*Fb#*WskG8gmiPDYA$#wyi*01F*B$+7wwE;Z)8J;Ehs4tJ{|7o5}@f&rG4M zKKJI(HUZl8{rmq1+B8!>P3t~f`d9<iN)sKn?tQm;r*o%sn_MBfOOnmv{M~QA`hJ^S zowtx25Q_JBX!o-$Y?j^E=H0>tzv-hOs#wDiAZj3hGTaIQ0nZQ(6ssuKKm?{ZQx?s# zKpZ<kO`L^Nv_KS<I|#kNeH3q?IEMm{n0OP#c@R^M#ar0$HVS076c?aY_^0494{vBi zqGiK&Ovm)5v~0|1@u6o<O9ftVVO#LXKS3;|r3yqKEhQHa#-`+GQjn5ojt*Zla_Z2w ziqydVm%*;21jz$CuhBJc8?4FJpBQZYv2|!2SdWcETR8{Dfz8f>E&NX9xeF{gIsmqS zrH%a;r?8YV?X6?+ub)skBoONLIqcD1oWyFPQA#;y(pMRTP(R7CUC#V*?)M>-4na+g zDTcRM0B!qs(`4db@w2|KhI~;)8=FQ<2_4d(XO<ajFX0sLg4e@ViQpBo@TFPf)n$#> z78{qLs>wXU{SBO#(1t6p96Er|1L3<Q_*Ho4biiO^p34ziuJd?^$<KoPY%?4D@9ckk z3X}6?x34EzL=$<V{Y@6_-r_16Zsu`>w(-Iev&J?&5|2*|{|wBEO(^YW`Wv0_-140p z{PrteFFuEpgCv(H@_nq~$qB5&kv!>#jfI8FlZWae{xi%XH<1ee6mp8WNI|~%6zoV0 z35I2vuDO5jzb&`@+K+Ssr|<~D{76VqCuEedaf0;*A(-LH9&rh#u`qod9dux5EV}j+ zoHDxAGsOo`1Xh_IYkl-Rp?Ta1sxL#6cn_`Wz=Zp-5RNK(Tp5ngkoXYAzX?op2ymoC z+6@N-6W+5_*2LgstyNuU5dmlfD`6!akMfBQl%bnbNYPSHIQ(Ijg4?fT-}Y<|=M_x0 zJMcq5A{q^OThU&^WqYjRq<#EHav>}0-;FXZYj0qF6+Q}_+EV9x*URm?fxk`?bA)Gl L)`sh?dCh+St}_6E literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_rewards_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_rewards_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..180fa95ba5e5059938a7d74ffba4b74efa5d039e GIT binary patch literal 998 zcmZWo&1(}u6rY*hO}6={Z5s7I5EnE>1O=%!w$hXKqF#o;GTE7Kw%spxCaHlG6g_wm z^qxaYy%hXwycG88X^)-+5%kR_sRiF--hAwPzxR7@X1AKn8Ul$=-?Fxa(09FA2!TZx zhP(-eBaTBvaXAxez)V6jvZ#d-H@Nv8(F(`Ukz*C$jdmTJ*L|VfOdPU|OHUtaF<|JF z+c4x549A>k03UM;w8E=XgWFTWm&%hGuP;t~RC+Wn_C|oU9wCK}F>mr^pYSVu1+2wu zU{|Nc2|mKSrO3X)*ObZIA4wY>f!Boas~d=~z<g~3;`goN$^@(G1Wm|0azdae1jSt6 z&8<L*NK(5m25b~08C_CYz(O}ne8=#|#f>}m*U6^;C4E>s|M{s~+=rTW3g{(r3~G5y zc>`K!LzT>1LF?Xt#lCP=5DACS>byg=F~dz+#v%#Ozt4Vrd)9xm>7Snhw*9$VYys$t zq5`%s!Td{p;R>f9x4Qmp(djxyUKu6fFcP$;6H3LRRMLhfG)pXa@du>f5aM8JaWzgw zrtveK$+2^ia=P?{DYgU5L{8$Ann^5VZtaB$Q?#l8Hi&)NVp57sxqI5r6|aUY%=9Ay z5+;ZE+!n7>;VA)lGcqETXDC|*pI;xgAM{>Axa_e3<DEV`WbwH7IA&fFb9T2U;*snn zsfeWqHc1C#*?SuFdlK&FcFMd1<_m}oL-61S>zdPgKVw1cCVhY%F(`PvzPQEm`{HrB zX_k0GN~ocej`I~A>t1@iRp3|t1c(p}N=#zn+T6kpw@njQK$l4i+o0K+uDVJqDFf~@ zYrvLT@i0oqSyQj?EqHeRqu5zc?93m=C3a;uOYpL1mrM&#b9*C7_%IZYFzlqhJs?9G F#$RlP8t(uA literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_session_metrics.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_session_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..549b6fe61362492756cabd6d2962d65d77519591 GIT binary patch literal 1354 zcma)5OK%e~5VpOKByEzG&=%;a0xm1{ao~m!r4)KVs29q`iWE6(*WG5byRzNVRJrgv z@&iB|T5;kp?Fk7X(Z9fnv6Hmraj32FjAzE4nQ!dJjm8v$k$rj1epC?pZa0(B1mO{o zPBB6pahxJ*IZ1J!P!ErEJ`J2Lq!oeot0y(?iQr_4`!EBTp$vG1SAk%HT>DH;F}L<W z5<b1_U(H)$UcZ{JM7(h|Pu`SRRQ4eU>7Nol!)M>2x0u$)bzF0qwJukZV95RYF1cj! zrRTJB=h{GGr<tE<ByxK++4GPuNHWpM0Ak<ZH(l%o$1hNH>&*6GJHq9R7Fs8H*69nQ zl2{){z*wr6m$)z@Hk~+6mzSKbV+Mr)gE%U{AUGv5r$Nk2yhkgnn=8=mY(=D;x^OSU z(KX74c+v(%=;!)a__i)TeYE3jod$xbbP!uNJ1h@?Hi7hASPVMBLo~!ga_Skf?+rbU zIr%_(L@yct4dw{S^0s#(Ov8+2oxB$XWo29xZ789OJkz4nO_(mjVqk<eG-O4g@}si3 zp|wy3V0fxjt|Gq-M<~##3l!+|MOnJ6PEh!Ylzrj9-f!M-zl2+Ko9!{a+GVd;HfV2T zEY35|?zKgBsM~oVG9AO37kdNUex7vOIx%9UU~!L00cX<`Ja})-=C{^WEP+zGaP1*8 zxf-l>#U49Ma^>uuzk0V?49b>0*!iPe_;yG;U~kv4s>AMhc2wR)FO>)CGwXEbB>0es z`dKdXn1E=9<<{m}vH-%UC8v0Zp$RQR#!bN6k*93$=zMn2hxe12B$FaDol#I_^NEP6 z0#h}+So}uIG)U#5E8)LqSHP}aLW^n^<fy4aVD!!ex7B|jTb)3r?72~5VZop$x+Dds z0R#fvNLG}7pQ#?5E|_BO;T#KEd%_Icvis75XXVgykuN3f(s!9xAM|s6kcx*EKK%@q oDz4)yu6iLR-Yjlmf<x?&CI4I^=aP@-YSwoFG%cVeP~BO714xfwaR2}S literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_stimulus_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_stimulus_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e69f74d15664cc1019fc0dea6e1156c9590b79e5 GIT binary patch literal 9487 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 K!f3(d`@aDI4j1qM literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_sync_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_sync_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f9d94c952f3e7fd2ac9d6ee51aca43b69625876 GIT binary patch literal 3144 zcmbVO-EZ7P5Z|?Zch2SRnvXVLrD>qh_8?q73N42KwWWv$P{fD$T1B#a-i_nLXJ2-G zfs3w45KwsI86;35ctHXr;2mCg=MiKHgaj|)Pv8NVS?AKDg;24U*Rwmjv$He5neo+f zxk#WzAHCtGK>dP)UK<1AGQ8?_gAh(Q4GGJ>lu<o4n5n;3GiMM=nt9z9Sb^d?Bea_X zY=9C$){47>+~gL|@jNeZn-B0JAKV*YrHm&^ytHSqvY=~~wPV=t4)L-m^9n!4hkOgD zVLrk~HFcby;A5H^=M#KVQ&apTze7`}_%uJQsTqDJzstA$!k)p;@Vnn4+jN_<;REUS zh{D<kKg%gTeol|hf#mbN>YMytejlHO@4@(he}8ZMkNi<y`w#y3k^JL)?mzfbNAgeb zQ~%6A&^E7cae~j^#;P%}_ffVO;|oXf$NA!s{0V;H7XE?F{hVJ0k3GO2M31paPM;^$ zi~ESmr7BGe*WAQaBKe)pv78%*B4Tz+#=dl$iWM5t4WeW-Ey5IUdr1&Stg;!Xwi`CY zs=FD)lI4&$&qh>BctKM{&ZURy_4;CczRt$u)@nyNN+<<8orf0c^#|$~=NGqz4@pOL zBCodk;MRF0oR*uc&dz9ZU36w=yto}Dj(Dv#I}^G}Q>>IpT>%w^3Kq{8#4mpE{ST+U z{NgezhJm;4B%p^1F4%<lmp0@#zf?cJ%*xrWL<YVu<UWP_``=#uEcj{T<YkDPj&Ks` zdh0>t2fvPh$X9;+txmrJk)yqvI?Xr=l33!B?{LYv<9Gc$kEb3}aH7*%jgy!MF&Dw^ zFi8LU;|2EJhrk|3b~|jVOfe^l9WFw*6TCNV5r6uR_dmS?%RCEx0xbux3Gd_ZszvA$ zvP-*Uk9O%Kxo&lh#OPYvblp(XiTNh&nq7+n2gWrVa{>-FmiGUIR<%+KjmgTsNVKUP z4*pI}@N-(ZqLh&6(<h{iWi^)$9QuISJs+@vLmx2v&<AGRNIoHQ5VZUK?Z+QpegPz@ zWp~x(wTAnu8+DeiM6MS{+`X_YqD{3Nw?w2o=(QV`pAH(!DoDirEwH)k3)qX;Q+$0c z5h|I}z;ogTh~0F-=AF5o7c@V+3INYTXhnXl)k&vuql5QE_h%~ryaJ$%cbq_L=Ak2l z6*@#^8K|w3E79zX2AT|%n4MVxEoNr`Zo*5Lxe~{$xYz<<WSD`xP4>|<`{=5D^wT~{ zWP`4^(ObpJp4(hR$i}KIg&r>47#44!gbix2D!4X;kqrlJYF`yKnl$a<8Q2Q&4#112 zt7Yh(Bs*k>?ied3BwXVyn;Qw)Hm~OZ3uN7vR};ExB<3D{cj$V)OS-vj2!2Xlf<p2v zd5*kHqOru<h1EUYo}pe&@(1WKmpnM)u;HQD)I4;8V6|e#4qd@q4@WZ-)Sy_8fVOrB z&`_6v&hY|3(cZd8dqxLk;x=1g3=B2!s;WH_#-1Ch$7<J<harg#zj)**ylM!#cc55u z!#BIc0sTRwxs=j{lrBR40vkrc3EhSW6$~vU!WH<M;8cxHSpos6?KlC%uH!t6GSQEO zZq;r}ty*uZ*E0itQH0iS1c)v~=Nefr$Vx)rr0<}Hbg62{6TnN0FS=n{WD#ac{0T@c z)H%(yK_jg*Vy{oxA;d7u0j?dvAvPX`O&N4)ky>=?;_WGZvzY&P0XYe$S2NA!6wvY{ zPJpQ~So+i+#`AFQQ17cZ>3!+;_5PcjrD`5M7(u>woV4gbBIfN7>5}7YKrPBR5<^^` z!tOM7n4CcIX{5)oyQ4Rofx@_^>M)}%Ytxch%E>b@t`;PEH_f*?s4vSy4TK7o+E0m& zc4KNpEoQ?-y)XvHVOUlRsj(9Eoq~s^`7DuWsmyYOl>efW#^~g~TIW0nQ~Jkpc%lND z(lJ9;@zkl*h?Tq>NS2G*%~nUAMfyDGrgLfSmNZ)HrO}#BHN&?oV0LeX#GJ#<9U)7X z2&^aY|B%_t!up+BYjF^zb_3=e9!QC*r&iOI>+F~m8|^>}<uu%81M=%&%f&hlDRxWf zoXiGw3eQq5)3MNBoY^?Cdph=&WHyS7n+h?j;N*>ef=pij|3fBEy07Z3x=3d~7TUrY zyb(x!K(`;s@b?%dD)kI>HpORxmW(_#ZhG>1E^p;wMX~RhvTa(SGkwoldiG%S7jMmM ADF6Tf literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_trial_masks.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_trial_masks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbd2dde7951ed9335d7ed4e054236ebf0109b0a2 GIT binary patch literal 2144 zcmb7FOK;;g5GJXIWjjus-K^J1z3KLWq6XTeKyO9SZg-2Eid?qsK`<cDA|or7C6$zu zb&$)Vz2+bE;Gn1ehXVZ{y7rXYo_p$$viwTAO(}>R4rhil-^@tQ8;u%*5&!m@wl)#^ zOKr*ld-M!m`3FIWA%-L5s+B}|L|g+GJkz!GneA3MI(4R1W^ij-V<tQnJa%BQ3UlCv z2k7dr<Ql89fN<-yUhtI!oYh$Uik#d>-wv?WcEGZFl;wMC2WaKy|E0?|)^1+&J3s+i zj}bUC-vaBJum;=w1^tZOjeFs>bthg<V1iA=nrxdr0Q%vTabg4*tnaW#+InMVz4hPO zSV3bE59DWBTg0QJ=8=$qz+I17Ti>-gyK7h9wa4CJ9rlFn2WE&N*Y7Ud2VeJ=vb-+a z(Xu+Dkkhxz?$2dGejyte;Mr65p7v~u;g_iU{*9{X<1WtYnFwj*ji?;Tizj*`KY3a( zvq{Qf!(XM`&p2~QkhqplGk@S#Xg?9a`~Ij)^4dZ?w;9hsS{Ps-%$qSCao6HhL=#`} z)KIGh?+bY4K1>-p#it}QrsgHOgq&Rxh8eli9R=PR$4AOjf582r$COuHD<>(-D;bwr z7zg=7DkT@02UEzU$A22rD7SP_WrRAIu94eCjG_+r=1v*g??|Zb{`>WdFM2<K71^T$ z$`1PUoW_&hH!<~-n9<LBJU)}XB;~R6VNTM)ME1T5`#l+E{L_^BLmF_<jUtd>!$alY zVPDWN_L4rBJ)>D7CWn1Kpl4ws^to4{r=2}WCwWsT&6wKhih{|634Lf|(S)^2G`@Ky zjQwcL_zirI(2auiM#;gkf;YFqnDJLDu-m}buzv)^3heMX+eN!2{Dc{E_|0Rn4bqSU zq13yUP#y_KO;t6iFQ&$`Ylw}K77axyP>X2`sQlyg*u3*Z45fD-W&=--0ip<sCrskc zKw7HXP{YPMShRq;XcnnkRHU!sRzt1xit4~-IkanhiEr1_TVipyA=|31csxsl1W0vc zcLmkbLETb$4sH}_YeL!{!|tM829ON|mxDzhd0p^xDwro|#sd)5V@ACBy5u~Y5l%_G z`Sb4V?t#97V7k&&*F^oIprP>bza+5@db1?DcH!imc`Ryl$>$$IQR-|w61&Ps)3wuy z0>=HI?1qC|jc`ylf>5fujzEn<r%7F7t`(0*&=Mq0b8|$+(5<Ibz!wE@yx?y2Tbj`$ zwRi28y7P5+=wi`;Ygd+PP*<ZaMCZ#<!p0H*3M<D?U~=#VcCcgEm>5m`0Nc2&S97+K frM(T3Hty6GvQ4}{-?hPpgF97qx`PRBEzSP`oQd#v literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_trials_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_trials_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6175ce08b3cef0d6353705f39b69de1c36ecb8b5 GIT binary patch literal 19852 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 S<PCsod5}t;=pPXsBL6QPX?=45 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_write_behavior_nwb.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_write_behavior_nwb.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f0ce83b2b6ef47ddd1c78c559905aefce60867d GIT binary patch literal 3397 zcmeHJJ&)W(7#@2+?`{)803o1Y5E9Z#hf`32qJ$8LgoI8&4h5}FvS#h^?&Q24Yi7Kg zJtYN@f+k8$mxziV!Ec~<OT}NH;(5orzRMjE9R<QGkG*5R&%7Vw=XpQ5bZM92D1QD< z{4`?hclxtELfm|e(_X`nvNXuqgsx#8EW$|`G;^Iv2XmdgyXZ}NnCqs!M{Lqh`{@AJ zK^oj)<KZ7bU<c!%?tUrU9M>x=qnwPVaxRuio48m_6MAQR?BM1WPWv7P$DRf*d=@;p z5-`_EgEUM#kFow;`1BR~nth8aR_TggJB;n}&2czamS<IwIHe1Ydnc_^#f-bT<e5-8 zPjrzg|5Rsw_M%fQ+CsXyP9uH@<AqQ~i!5^G*8GJ4yfNfDNh)JoH~<Ll%$iSgogD9T zQKTGm<XR%E#Eo#6<nn$Z%WVKgC@WKX$w&m$f^CCrT-m@hmJL34nkRFa9CMWcb<Im* zoDw<Ll`AXP0?GTzI=k^E<5qJc3$fU^lc^kcnxkYA-bd0HZMdznOx@>GnQ0?iByx3| z>(WTnxU%^g$tWlo1knZ-?Y2g~VpJunmiKoH;d8R`ar?|X?>|qqw7k&g0*UzNlu^Q> zl&&O4{qvl!MB&;vDC63wnJSQu)~VJdBVA?4Un-DTYK4*CMj{ThyR9os`YfCcLUUQz z3KjC6VpYT}4OMM}-`1QjMP6a~j2|E;6m%&pD%`G)lzKZWtwq}6R5-zfnN^fW+KVt* zQAmlX5TW3Q>r#H^%YtMTEzZS#jlHLkGgQ-7Q=1r7A|(X36h?_@E+c*yfQVvShZc;& z+UIg9DY?3u&5`+Y8w!Co8>!9tOg8u}%BiQ#u8#bZgPM)QdUQ74dIWBWY44Rp9o@QL zu4#|deQ#*%ofgV;Ko-9+LzL!+KYzUS(a|?n8ha$>B8{d3wO=3IEChY};)5euEbWml zQLqG~F6V1|^o5!pS&-BFrAUs&Ou{zL@kV-lmDasF#kxhTr+{4wr_K86mc{(@_+ql7 za$Ubowtw?1F0>Dh2+s~NuvbPwh@Sx+vm~Gy926Oabql9`gu$@~?1vx?-eL~}$6W9r zz`yWy%smaCG4OCF?LJ};L)W<nMt%^c{m0>xPr;wPr+qg7mqxfBrh|>;kodI4+3`3# z&zQ~K?)L$BcF^$b>0LSi<L-*zy8koombm|`j4RH6-ChWYbK9@kfA9Yy-|q8i1%1q+ zP>rrNddUm9YJKuvu9Ta53VmL!8h-jOvi70o4cDG(@j0>dc>(eJ9PE2pRErYgoERw_ zsR;FGTu<-GgnE!uIZ8l;O){OXlKG~!Ih#dN5HH}qG$3qL$2Tlo+sMd;M(40;h~Po0 zNwnt>`HhyH>1hg?K=cH4NU~8k63~m>x`p%G0R0{m6BOTW0v{xG5lyG#WxVmja^*H% z3pZ6!kQd(UWR!_xNgZi~^JFhlMQQZRz@3(kiI(ZSLv#!ZL@NwB3=X{NpuG*V@>GS) z9$u&~FVN`4+Q!ZDH^`DYY!;k+_#$nf-RspMx`s9pIlUe|k8-lp=5-uQMpmUVmRW|v z*@JOtdVn{53@80&|Bv?!tyy=hGj-2bvF;LN-SfpV1F|3)G9*Y|Q0sp4wbYkyqB%j| zs0-g>j60LQTa>9Xlf7-mV#Ix!3|k3qf`8{9BYYQD_6i2}#wd6-9Clv{8XX+<%xjn( z56#QC)C1}Qay9jFcy}i^w)z}hkmhJB&C$i36U8w#@^S2=^m6N0I^(;K!dGv2ZK2aD Tm)EK4mga}>Zy1ic!#Do|;yfB9 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/__pycache__/test_write_nwb_behavior_ophys.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_write_nwb_behavior_ophys.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbada29cc4056f8203b99740fc9306ea4762179c GIT binary patch literal 3504 zcmeHKO^@6}5Vbv@yE_RVS^)wMeL-QQ#fgN(0j&Zd5D5vbfGi3cjb!!M?U~Mc+*Wsc zCbQZcfQVbjUr5A>Uxef<r~Cy@ylT&QHVZ*;;Q)B$wx{i`u6k8|ulA!$mv%iI`H$c5 zYnMFl7y7X|0^EFv(;Q+*yu{DE5nY4Kp9iDBujg8$7Uo)6d)^s!FxO5x54=$~=_Wl~ zdx?MB8}^^Vf_F6ZtM=#I&TxHgsihUsM9la?Djlg}wlYz^oW%6z=Gei_O`PU!4Ay(> z+u(`+Xy5m2EAf*cX(jE4E#JEX-@fp^^uERwyLI@_EzjF!>*IJP4NJ>Bwo>H`_f{Ay z^C`14!BQ?W7OOmw?x{*?wpsc-C)r%snMy)-3=?xM^Ts~Uq+PMUXNIXbF12AW!<p49 zHpx_ca=>_=(A;^4Vr~Q`xWz*z?!}_m1f{t&BB7VHpddE^*ACTY)+?Iu+&;`I7SBX{ z!ek1oD^_rACC`{DZBbgRk;a;}Hz_lUX_51J?M7oNl^JFfLplYb2!+;4GgGFiyvHUY zRq%>j+~8hlfxMR{TQw%;BBx*wL=#xJ+dOqyq|8xp&fkqGhsn~#?U1?Pf1-q8xw4HV z7f{GPC1lAKLAn$SHIZd($#dJp0Wg`;aw>Dc(Kyu@(!!RS{G~+kg_0QAEdX((>@8Jd z(xGrZ2*pHhN?_qU#jc21Xv*5!ev^B);8}_7Q+5PQDCmM4WVqQKkh*n77z5a%gj>$I zo|c3oRVJ1!DWsT}h>)}6RUtlcX#rSyW9PXwZnXq*$f+qOCf2e5Fl2PWwd9jbgzOH? z>h0HZE-Ty~FtHE>u_~uC;Qzd`YLK6bZHnAJTYu}?4xP(Km3KUBRfF?kR|617L?u{& zU8<MNi7X<q5|PzBK0%!f+f}z%QT0?^XUtSPjd|Syx%}kmJzU)I>kl{IAAe<pHe){H zNjTxCiq-f=&WR}ayJL|r%vcpjWsK2L*Z4Cz85>aAI|a7nQ-QTvhBuOvtF-Uc3HHq+ zHG$a$w@R<BZn)1qkLol~9Gm%?6T@Ovy+sz*Z#?^y7&FS1i=F&8j?MQ6e&GHzDBX*F z40KSO^!z4H^F0RZoq6B+iT{Ro-?yIi&wTs}Ud7zw;E4w=2fse>?gzGY7p#63B;AL> zqg!C#&f~7_fr+o-zMu5gEBna~v2kN**IC+m;+fp;e(Qs!do@dM?~)$)dXGPC|IgQJ zf%;GJHNVITPDY5a8+!Vu+4_J@AbLE5&ef_|t1ZjLvhm4zxs-P12>4m8tL5_F%lXHO zfvG9*2967Y>(GI0I3y07w90vrtyruDx1>bW12Q$aD`M(nwvrZuGHXb!D&yIv%le}x zz$FN5j~uzChba?kF<0n5>fVfmD^Vo;GYG(159PM5auGu~Idxm2R!9=z3t|X%-I#O5 zfVK*%3o&S7cR^AovhJ3s6{!6{KWCfHr_6Km!Yw-;r2Iq>bB8!j_d=N$T1_?FX{eeg zo6g%r)gVW-+8|2*$mtW>=O8V%dZh<=p}IUr(-<ie)!TneE2)F`{L>HqTtBFioq~ji zXgq=J_3&9+r#lV0Lw__dG7*tTQ>4!vL5y_=yXY<rJq)Ma`imIuY1+SP8LO*~%V^am z!&S#6PWNdAwfLG;$;oilt-qh@@(naQ=tEWRT9#pJ)V1>>k$SYZK`#OZFVMn9xN9J; z{KaUmV6EB5;JrTZ_k(`>MZea~uHWzIS1>>9>z8q<del~Aa^m7~ZjavEsC)Q3VGlPF v9X6UCMiKp&5JfIXr^;@FbFRA}Tq662bCr~txK0J&1ikMMf_`hz?!WmP_p&~s literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__init__.py b/test/brain_observatory/behavior/behavior_project_cache/__init__.py new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache/__init__.py @@ -0,0 +1 @@ +# empty diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..298591968bc8ac0b44da19b1c81fe84e66f86075 GIT binary patch literal 231 zcmYLDI|>3Z5Y2*x2p+`3-NH^p{Ip^tc7ZTS1~<AUA&DzndIRrZ<&|tbf}NGKh5F#V zc{98jX3_8W7{T5y(53opn=djlGh*zJXtrU4Y<*{;9slKhU5@!SVu&0{(7A*&*oMz7 zC}%Z{INCaL=g~$*>U`NmzA}<WlW^!k9bkvFTUC_MhazE2g$!V<aFWi}kX&dAi6zv= jg`W{VxIL;Q6sQslA&fOih}<`i?&Rq7slsXd>5Ird|E)$U literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..517d612d242d5b2124debf6cdaf50e567adc489f GIT binary patch literal 3644 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_cloud_api.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_cloud_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..772fd3dd0418c0485be08fc924802138c3055d10 GIT binary patch literal 6298 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 Q`^=o@={JD`W2jaC2`WZViU0rr literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_lims_api.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_lims_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffb3d6bfe6471e5f433f1d890634857a731987c0 GIT binary patch literal 4087 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 NR8Gs|j0*GW=$|#N88rX^ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_experiments_table_utils.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_experiments_table_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..996f8c9877125f6fcced1d012ea454cbb12d29ec GIT binary patch literal 2955 zcmcguO>Y}T7~Yxvb{Z4<0ck1F7F1!RI;s#C6jg+loKP+WgjQBpW6vbnWWShMn>ca~ z5Do|=)HAA3EPCNT@C!Kb1NO?v62E{G@4IW8q}i2fB)ZZ(^ZCxav-7;q%ty=14Gq5d zm#^9JWlj4NE3=P6;X_CYfoq(Enpft;qfn=z9vPkynVuP0o<%gSbK_ghv$@GF$Q^ET z2XdE_hg!>>z%1HUOV8h7ocrP+6*3TUPxzr2h|tfHX<H=X%+FXi6#2V2GG$5y1L1Fn zYzIdr>F!XSAA1wW1`*p4z7jCO`RRJ-0DcxE6ViQ1Y7e%#qa9%)oN$Vpc%mQCk#?eG z<b;msn2ZT*&Kyy0t!pFlOgqJGE@)$Omp2x)altcEW3yD_n+~4U*<7fxarpAWHcjx& zuJP@qnsrvdH@cwB%ix>4pv^_zthK562bq3ijI=R1(u)$D|B;cIBmI~h0iIYRb4(sn zxt`hIkjxqBd+ssjCg%J4W2!#Ko{<S74IHVqvCcIJgG*bI0PQ9P7*K+MpaIXDN&wB1 z*pK^BS4i)ADuYBK%@fs^LLs5&?Dm{Z76oCzq_^^HAWblACrIy!4iNkWY(KQO5{R)I zcXMMaiNyp1U}6ItI%UVbyAuc7Tm)2vRwK7qnu?g`MlVT+xx<A>ixN$F?ml1{+mtL4 z5|_&@@nxTdDsOHmC1eKs_*lwB=6WdN-0me|KZ;e$${RtP_A{S@b-s+A_cFoDstJw# zD0ikKw)3Tb`?qs9>1T!I_OF_}2}}O{^!^8(&tNgtVY`gCyX-3#4?7z%>m@N~?{!2x zP@M#JpulTUh(_m=pxaSFChnxHw+~7Iwjp?^`2JcZRJPWYEQtN23)2o*mdN2+SM0I@ z9K^ifr!v_CxBVXL?TW(elor7;p>X;AEC^K_e%n=?*RK-1CD?@e4nU&@F(@UJIAjIW z3oSQDqgeMEk#B)7)f)LTu=T7)KA{x~X+Wf#6$)vAHs}jkfYR1jI5lgy5aZQr)LAr8 z>lgCMUUVN-Is*D(7OFtx7nue6Vb68NEOdp)v}ixCD@1*dJ)kSo8Prc$FLY(8)D?*l z+@cbLTVhCm>e<r^RH7zG4DL;d<ddiZt%kga<x2?g0MO(WgjWz=MOZ~ZA(2-Rt^u?x z`5Kn5BfO6A2Ev;NHxMvBOSlE4{K`BAPG9AZpi4afDEZ%*a{u{r97%}<2;6-e=BeiH zAJFr^aJPn6m1l0iiRoh^f2=xj`Lz1H)o-UyTm3#iYqvaWZ?$|1y<c7o%0HOBm8Jyn zF3c{KY?z9i9C+^h3Mts&+0z*g^{usy=i>t2S^u32x941#ds6jO`vDeFNS-=!G)NO< zt4UUgybYtkb!4z-r3}Ph6(sf^&BVQZPS@KrU7r`u>Uz77an(j0Z<jYLK1<KYdvWuX rp;7!3l+S{Pg-54?pa_Q|5}frY;r&qD13lFghN43pdf9d!I(Pm7036M~ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_from_s3.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_from_s3.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fcef37603e779555233170ea0baa57180a980f5 GIT binary patch literal 10172 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 Yb754CqHVcE?o964++|HY(a5d*24l?UH2?qr literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/utils.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..329aed68bc0f610242587602c294197649f3215a GIT binary patch literal 3481 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache/conftest.py b/test/brain_observatory/behavior/behavior_project_cache/conftest.py new file mode 100644 index 0000000000..dbb70291e9 --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache/conftest.py @@ -0,0 +1,234 @@ +import pytest +import pandas as pd +import io +import semver + +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.\ + data_io.behavior_project_cloud_api import MANIFEST_COMPATIBILITY + + +@pytest.fixture +def s3_cloud_cache_data(): + + all_versions = {} + all_versions['data'] = {} + all_versions['metadata'] = {} + + min_compat = semver.parse_version_info(MANIFEST_COMPATIBILITY[0]) + versions = [] + + version = str(min_compat) + versions.append(version) + data = {} + metadata = {} + + data['ophys_file_1.nwb'] = {'file_id': 1, + 'data': b'abcde'} + + data['ophys_file_2.nwb'] = {'file_id': 2, + 'data': b'fghijk'} + + data['behavior_file_3.nwb'] = {'file_id': 3, + 'data': b'12345'} + + data['behavior_file_4.nwb'] = {'file_id': 4, + 'data': b'67890'} + + o_session = [{'ophys_session_id': 111, + 'file_id': 1}, + {'ophys_session_id': 222, + 'file_id': 2}] + + o_session = pd.DataFrame(o_session) + buff = io.StringIO() + o_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_session_table'] = bytes(buff.read(), 'utf-8') + + b_session = [{'behavior_session_id': 333, + 'file_id': 3, + 'species': 'mouse'}, + {'behavior_session_id': 444, + 'file_id': 4, + 'species': 'mouse'}] + b_session = pd.DataFrame(b_session) + buff = io.StringIO() + b_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['behavior_session_table'] = bytes(buff.read(), 'utf-8') + + o_session = [{'ophys_experiment_id': 5111, + 'file_id': 1}, + {'ophys_experiment_id': 5222, + 'file_id': 2}] + + o_session = pd.DataFrame(o_session) + buff = io.StringIO() + o_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_experiment_table'] = bytes(buff.read(), 'utf-8') + + o_cells = { + 'cell_roi_id': {0: 9080884343, 1: 1080884173, 2: 1080883843}, + 'cell_specimen_id': {0: 1086496928, 1: 1086496914, 2: 1086496838}, + 'ophys_experiment_id': {0: 775614751, 1: 775614751, 2: 775614751}} + o_cells = pd.DataFrame(o_cells) + buff = io.StringIO() + o_cells.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_cells_table'] = bytes(buff.read(), 'utf-8') + + all_versions['data'][version] = data + all_versions['metadata'][version] = metadata + + version = str(min_compat.bump_minor()) + versions.append(version) + data = {} + metadata = {} + + data['ophys_file_1.nwb'] = {'file_id': 1, + 'data': b'lmnopqrs'} + + data['ophys_file_2.nwb'] = {'file_id': 2, + 'data': b'fghijk'} + + data['behavior_file_3.nwb'] = {'file_id': 3, + 'data': b'12345'} + + data['behavior_file_4.nwb'] = {'file_id': 4, + 'data': b'67890'} + + data['ophys_file_5.nwb'] = {'file_id': 5, + 'data': b'98765'} + + o_session = [{'ophys_session_id': 222, + 'file_id': 1}, + {'ophys_session_id': 333, + 'file_id': 2}] + + o_session = pd.DataFrame(o_session) + buff = io.StringIO() + o_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_session_table'] = bytes(buff.read(), 'utf-8') + + b_session = [{'behavior_session_id': 777, + 'file_id': 3, + 'species': 'mouse'}, + {'behavior_session_id': 888, + 'file_id': 4, + 'species': 'mouse'}] + b_session = pd.DataFrame(b_session) + buff = io.StringIO() + b_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['behavior_session_table'] = bytes(buff.read(), 'utf-8') + + o_session = [{'ophys_experiment_id': 5444, + 'file_id': 1}, + {'ophys_experiment_id': 5666, + 'file_id': 2}, + {'ophys_experiment_id': 5777, + 'file_id': 5}] + + o_session = pd.DataFrame(o_session) + buff = io.StringIO() + o_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_experiment_table'] = bytes(buff.read(), 'utf-8') + + o_cells = { + 'cell_roi_id': {0: 1080884343, 1: 1080884173, 2: 1080883843}, + 'cell_specimen_id': {0: 1086496928, 1: 1086496914, 2: 1086496838}, + 'ophys_experiment_id': {0: 775614751, 1: 775614751, 2: 775614751}} + o_cells = pd.DataFrame(o_cells) + buff = io.StringIO() + o_cells.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_cells_table'] = bytes(buff.read(), 'utf-8') + + all_versions['data'][version] = data + all_versions['metadata'][version] = metadata + + return all_versions, versions + + +@pytest.fixture +def data_update(): + data = {} + metadata = {} + + data['ophys_file_1.nwb'] = {'file_id': 1, + 'data': b'11235'} + + data['ophys_file_2.nwb'] = {'file_id': 2, + 'data': b'8132134'} + + data['behavior_file_3.nwb'] = {'file_id': 3, + 'data': b'04916'} + + data['behavior_file_4.nwb'] = {'file_id': 4, + 'data': b'253649'} + + data['ophys_file_5.nwb'] = {'file_id': 5, + 'data': b'98765'} + + o_session = [{'ophys_session_id': 1110, + 'file_id': 1}, + {'ophys_session_id': 2220, + 'file_id': 2}] + + o_session = pd.DataFrame(o_session) + buff = io.StringIO() + o_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_session_table'] = bytes(buff.read(), 'utf-8') + + b_session = [{'behavior_session_id': 3330, + 'file_id': 3, + 'species': 'mouse'}, + {'behavior_session_id': 4440, + 'file_id': 4, + 'species': 'mouse'}] + b_session = pd.DataFrame(b_session) + buff = io.StringIO() + b_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['behavior_session_table'] = bytes(buff.read(), 'utf-8') + + o_session = [{'ophys_experiment_id': 6111, + 'file_id': 1}, + {'ophys_experiment_id': 6222, + 'file_id': 2}, + {'ophys_experiment_id': 63456, + 'file_id': 5}] + + o_session = pd.DataFrame(o_session) + buff = io.StringIO() + o_session.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_experiment_table'] = bytes(buff.read(), 'utf-8') + + o_cells = { + 'cell_roi_id': {0: 9080884343, 1: 1080884173, 2: 1080883843}, + 'cell_specimen_id': {0: 1086496928, 1: 1086496914, 2: 1086496838}, + 'ophys_experiment_id': {0: 775614751, 1: 775614751, 2: 775614751}} + o_cells = pd.DataFrame(o_cells) + buff = io.StringIO() + o_cells.to_csv(buff, index=False) + buff.seek(0) + + metadata['ophys_cells_table'] = bytes(buff.read(), 'utf-8') + + return {'data': data, 'metadata': metadata} diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py b/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py new file mode 100644 index 0000000000..96c37be370 --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py @@ -0,0 +1,237 @@ +import pytest +import pandas as pd +from pathlib import Path +from unittest.mock import MagicMock, create_autospec + +from allensdk.api.cloud_cache.manifest import Manifest +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import behavior_project_cloud_api as cloudapi # noqa: E501 +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.\ + data_io.behavior_project_cloud_api import MANIFEST_COMPATIBILITY + + +class MockCache(): + def __init__(self, + behavior_session_table, + ophys_session_table, + ophys_experiment_table, + ophys_cells_table, + cachedir): + self.file_id_column = "file_id" + self.session_table_path = cachedir / "session.csv" + self.behavior_session_table_path = cachedir / "behavior_session.csv" + self.ophys_experiment_table_path = cachedir / "ophys_experiment.csv" + self.ophys_cells_table_path = cachedir / "ophys_cells.csv" + + ophys_session_table.to_csv(self.session_table_path, index=False) + ophys_cells_table.to_csv(self.ophys_cells_table_path, index=False) + behavior_session_table.to_csv(self.behavior_session_table_path, + index=False) + ophys_experiment_table.to_csv(self.ophys_experiment_table_path, + index=False) + + self._manifest = MagicMock() + self._manifest.metadata_file_names = ["behavior_session_table", + "ophys_session_table", + "ophys_experiment_table", + "ophys_cells_table"] + self._metadata_name_path_map = { + "behavior_session_table": self.behavior_session_table_path, + "ophys_session_table": self.session_table_path, + "ophys_experiment_table": self.ophys_experiment_table_path, + "ophys_cells_table": self.ophys_cells_table_path} + + def download_metadata(self, fname): + return self._metadata_name_path_map[fname] + + def download_data(self, file_id): + return file_id + + def metadata_path(self, fname): + local_path = self._metadata_name_path_map[fname] + return { + 'local_path': local_path, + 'exists': Path(local_path).exists() + } + + def data_path(self, file_id): + return { + 'local_path': file_id, + 'exists': True + } + + def load_last_manifest(self): + return None + + +@pytest.fixture +def mock_cache(request, tmpdir): + bst = request.param.get("behavior_session_table") + ost = request.param.get("ophys_session_table") + oet = request.param.get("ophys_experiment_table") + clt = request.param.get("ophys_cells_table") + + # round-trip the tables through csv to pick up + # pandas mods to lists + fname = tmpdir / "my.csv" + bst.to_csv(fname, index=False) + bst = pd.read_csv(fname) + ost.to_csv(fname, index=False) + ost = pd.read_csv(fname) + oet.to_csv(fname, index=False) + oet = pd.read_csv(fname) + clt.to_csv(fname, index=False) + clt = pd.read_csv(fname) + yield (MockCache(bst, ost, oet, clt, tmpdir), request.param) + + +@pytest.mark.parametrize( + "mock_cache", + [ + { + "behavior_session_table": pd.DataFrame({ + "behavior_session_id": [1, 2, 3, 4], + "ophys_experiment_id": [4, 5, 6, [7, 8, 9]], + "file_id": [4, 5, 6, None]}), + "ophys_session_table": pd.DataFrame({ + "ophys_session_id": [10, 11, 12, 13], + "ophys_experiment_id": [4, 5, 6, [7, 8, 9]]}), + "ophys_experiment_table": pd.DataFrame({ + "ophys_experiment_id": [4, 5, 6, 7, 8, 9], + "file_id": [4, 5, 6, 7, 8, 9]}), + "ophys_cells_table": pd.DataFrame({ + "cell_roi_id": [4, 5, 6], + "cell_specimen_id": [104, 105, 106], + "ophys_experiment_id": [4, 5, 6]})} + ], + indirect=["mock_cache"]) +@pytest.mark.parametrize("local", [True, False]) +def test_BehaviorProjectCloudApi(mock_cache, monkeypatch, local): + mocked_cache, expected = mock_cache + api = cloudapi.BehaviorProjectCloudApi(mocked_cache, + skip_version_check=True, + local=False) + if local: + api = cloudapi.BehaviorProjectCloudApi(mocked_cache, + skip_version_check=True, + local=True) + + # behavior session table as expected + bost = api.get_behavior_session_table() + assert bost.index.name == "behavior_session_id" + bost = bost.reset_index() + ebost = expected["behavior_session_table"] + for k in ["behavior_session_id", "file_id"]: + pd.testing.assert_series_equal(bost[k], ebost[k]) + for k in ["ophys_experiment_id"]: + assert all([i == j + for i, j in zip(bost[k].values, ebost[k].values)]) + + # ophys session table as expected + ost = api.get_ophys_session_table() + assert ost.index.name == "ophys_session_id" + ost = ost.reset_index() + eost = expected["ophys_session_table"] + for k in ["ophys_session_id"]: + pd.testing.assert_series_equal(ost[k], eost[k]) + for k in ["ophys_experiment_id"]: + assert all([i == j + for i, j in zip(ost[k].values, eost[k].values)]) + + # experiment table as expected + et = api.get_ophys_experiment_table() + assert et.index.name == "ophys_experiment_id" + et = et.reset_index() + pd.testing.assert_frame_equal(et, expected["ophys_experiment_table"]) + + # get_behavior_session returns expected value + # both directly and via experiment table + def mock_nwb(nwb_path): + return nwb_path + monkeypatch.setattr(cloudapi.BehaviorSession, "from_nwb_path", mock_nwb) + assert api.get_behavior_session(2) == "5" + assert api.get_behavior_session(4) == "7" + + # direct check only for ophys experiment + monkeypatch.setattr(cloudapi.BehaviorOphysExperiment, + "from_nwb_path", mock_nwb) + assert api.get_behavior_ophys_experiment(8) == "8" + + +@pytest.mark.parametrize( + "manifest_version, data_pipeline_version, cmin, cmax, exception", + [ + ("0.0.1", "2.9.0", "0.0.0", "1.0.0", False), + ("1.0.1", "2.9.0", "0.0.0", "1.0.0", True) + ]) +def test_version_check(manifest_version, data_pipeline_version, + cmin, cmax, exception): + if exception: + with pytest.raises(cloudapi.BehaviorCloudCacheVersionException, + match=f".*{data_pipeline_version}"): + cloudapi.version_check(manifest_version, data_pipeline_version, + cmin, cmax) + else: + cloudapi.version_check(manifest_version, data_pipeline_version, + cmin, cmax) + + +def test_from_local_cache(monkeypatch): + mock_manifest = create_autospec(Manifest) + mock_manifest.metadata_file_names = { + 'ophys_experiment_table', + 'ophys_session_table', + 'behavior_session_table', + 'ophys_cells_table' + } + mock_manifest._data_pipeline = [ + { + "name": "AllenSDK", + "version": "2.11.0", + "comment": "This is a test entry. NOT REAL." + } + ] + mock_manifest.version = MANIFEST_COMPATIBILITY[0] + + mock_local_cache = create_autospec(cloudapi.LocalCache) + type(mock_local_cache.return_value)._manifest = mock_manifest + + mock_static_local_cache = create_autospec(cloudapi.StaticLocalCache) + type(mock_static_local_cache.return_value)._manifest = mock_manifest + + with monkeypatch.context() as m: + m.setattr(cloudapi, "LocalCache", mock_local_cache) + m.setattr(cloudapi, "StaticLocalCache", mock_static_local_cache) + + # Test from_local_cache with use_static_cache=False + try: + cloudapi.BehaviorProjectCloudApi.from_local_cache( + "first_cache_dir", "project_1", "ui_1", use_static_cache=False + ) + # Because cache is a mock, the following calls in the load_manifest + # method of BehaviorProjectCloudApi will fail with TypeError: + # self._get_ophys_session_table() + # self._get_behavior_session_table() + # self._get_ophys_experiment_table() + except (TypeError, FileNotFoundError): + pass + + mock_local_cache.assert_called_once_with( + "first_cache_dir", "project_1", "ui_1" + ) + + # Test from_local_cache with use_static_cache=True + try: + cloudapi.BehaviorProjectCloudApi.from_local_cache( + "second_cache_dir", "project_2", "ui_2", use_static_cache=True + ) + # Because cache is a mock, the following calls in the load_manifest + # method of BehaviorProjectCloudApi will fail with TypeError: + # self._get_ophys_session_table() + # self._get_behavior_session_table() + # self._get_ophys_experiment_table() + except (TypeError, FileNotFoundError): + pass + + mock_static_local_cache.assert_called_once_with( + "second_cache_dir", "project_2", "ui_2" + ) diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py b/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py new file mode 100644 index 0000000000..a5f21c5a79 --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py @@ -0,0 +1,108 @@ +import pytest + +from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import BehaviorProjectLimsApi # noqa: E501 +from allensdk.test_utilities.custom_comparators import ( + WhitespaceStrippedString) + + +class MockQueryEngine: + def __init__(self, **kwargs): + pass + + def select(self, query): + return query + + def fetchall(self, query): + return query + + def stream(self, endpoint): + return endpoint + + +@pytest.fixture +def MockBehaviorProjectLimsApi(): + return BehaviorProjectLimsApi(MockQueryEngine(), MockQueryEngine(), + MockQueryEngine()) + + +@pytest.mark.parametrize( + "col,valid_list,operator,expected", [ + ("os.id", [1, 2, 3], "WHERE", "WHERE os.id IN (1,2,3)"), + ("id2", ["'a'", "'b'"], "AND", "AND id2 IN ('a','b')"), + ("id3", [1.0], "OR", "OR id3 IN (1.0)"), + ("id4", None, "WHERE", "")] +) +def test_build_in_list_selector_query( + col, valid_list, operator, expected, MockBehaviorProjectLimsApi): + assert (expected + == MockBehaviorProjectLimsApi._build_in_list_selector_query( + col, valid_list, operator)) + + +@pytest.mark.parametrize( + "behavior_session_ids,expected", [ + (None, + WhitespaceStrippedString(""" + SELECT foraging_id + FROM behavior_sessions + WHERE foraging_id IS NOT NULL + ; + """)), + (["'id1'", "'id2'"], + WhitespaceStrippedString(""" + SELECT foraging_id + FROM behavior_sessions + WHERE foraging_id IS NOT NULL + AND id IN ('id1','id2'); + """)) + ] +) +def test_get_foraging_ids_from_behavior_session( + behavior_session_ids, expected, MockBehaviorProjectLimsApi): + mock_api = MockBehaviorProjectLimsApi + assert expected == mock_api._get_foraging_ids_from_behavior_session( + behavior_session_ids) + + +def test_get_behavior_stage_table(MockBehaviorProjectLimsApi): + expected = WhitespaceStrippedString(""" + SELECT + stages.name as session_type, + bs.id AS foraging_id + FROM behavior_sessions bs + JOIN stages ON stages.id = bs.state_id + ; + """) + mock_api = MockBehaviorProjectLimsApi + actual = mock_api._get_behavior_stage_table() + assert expected == actual + + +@pytest.mark.parametrize( + "line,expected", [ + ("reporter", WhitespaceStrippedString( + """-- -- begin getting reporter line from donors -- -- + SELECT ARRAY_AGG (g.name) AS reporter_line, d.id AS donor_id + FROM donors d + LEFT JOIN donors_genotypes dg ON dg.donor_id=d.id + LEFT JOIN genotypes g ON g.id=dg.genotype_id + LEFT JOIN genotype_types gt ON gt.id=g.genotype_type_id + WHERE gt.name='reporter' + GROUP BY d.id + -- -- end getting reporter line from donors -- --""")), + ("driver", WhitespaceStrippedString( + """-- -- begin getting driver line from donors -- -- + SELECT ARRAY_AGG (g.name) AS driver_line, d.id AS donor_id + FROM donors d + LEFT JOIN donors_genotypes dg ON dg.donor_id=d.id + LEFT JOIN genotypes g ON g.id=dg.genotype_id + LEFT JOIN genotype_types gt ON gt.id=g.genotype_type_id + WHERE gt.name='driver' + GROUP BY d.id + -- -- end getting driver line from donors -- --""")) + ] +) +def test_build_line_from_donor_query(line, expected, + MockBehaviorProjectLimsApi): + mbp_api = MockBehaviorProjectLimsApi + assert expected == mbp_api._build_line_from_donor_query(line=line) diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py b/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py new file mode 100644 index 0000000000..6fb60a107e --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py @@ -0,0 +1,160 @@ +import copy +import pandas as pd + +from allensdk.brain_observatory.behavior.behavior_project_cache.\ + tables.util.experiments_table_utils import ( + add_experience_level_to_experiment_table, + add_passive_flag_to_ophys_experiment_table, + add_image_set_to_experiment_table) + + +def test_add_experience_level(): + + input_data = [] + expected_data = [] + + datum = {'id': 0, + 'session_number': 1, + 'prior_exposures_to_image_set': 4} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'Familiar' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 1, + 'session_number': 2, + 'prior_exposures_to_image_set': 5} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'Familiar' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 2, + 'session_number': 3, + 'prior_exposures_to_image_set': 1772} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'Familiar' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 3, + 'session_number': 4, + 'prior_exposures_to_image_set': 0} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'Novel 1' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 4, + 'session_number': 5, + 'prior_exposures_to_image_set': 0} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'None' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 5, + 'session_number': 6, + 'prior_exposures_to_image_set': 0} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'None' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 7, + 'session_number': 4, + 'prior_exposures_to_image_set': 2} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'Novel >1' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 8, + 'session_number': 5, + 'prior_exposures_to_image_set': 1} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'Novel >1' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 9, + 'session_number': 6, + 'prior_exposures_to_image_set': 3} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'Novel >1' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 10, + 'session_number': 7, + 'prior_exposures_to_image_set': 3} + input_data.append(copy.deepcopy(datum)) + datum['experience_level'] = 'None' + expected_data.append(copy.deepcopy(datum)) + + input_df = pd.DataFrame(input_data) + expected_df = pd.DataFrame(expected_data) + output_df = add_experience_level_to_experiment_table(input_df) + assert not input_df.equals(output_df) + assert len(input_df.columns) != len(output_df.columns) + assert output_df.equals(expected_df) + + +def test_add_passive_flag(): + + input_data = [] + expected_data = [] + + datum = {'id': 0, 'session_number': 2} + input_data.append(copy.deepcopy(datum)) + datum['passive'] = True + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 1, 'session_number': 5} + input_data.append(copy.deepcopy(datum)) + datum['passive'] = True + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 2, 'session_number': 1} + input_data.append(copy.deepcopy(datum)) + datum['passive'] = False + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 3, 'session_number': 3} + input_data.append(copy.deepcopy(datum)) + datum['passive'] = False + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 4, 'session_number': 2} + input_data.append(copy.deepcopy(datum)) + datum['passive'] = True + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 5, 'session_number': 5} + input_data.append(copy.deepcopy(datum)) + datum['passive'] = True + expected_data.append(copy.deepcopy(datum)) + + input_df = pd.DataFrame(input_data) + expected_df = pd.DataFrame(expected_data) + assert not input_df.equals(expected_df) + output_df = add_passive_flag_to_ophys_experiment_table( + input_df) + assert not input_df.equals(output_df) + assert len(input_df.columns) != len(output_df.columns) + assert output_df.equals(expected_df) + + +def test_add_image_set_to_experiment_table(): + + input_data = [] + expected_data = [] + + datum = {'id': 0, 'session_type': 'ophys_5_images_x_passive'} + input_data.append(copy.deepcopy(datum)) + datum['image_set'] = 'x' + expected_data.append(copy.deepcopy(datum)) + + datum = {'id': 1, 'session_type': 'ophys_5'} + input_data.append(copy.deepcopy(datum)) + datum['image_set'] = 'N/A' + expected_data.append(copy.deepcopy(datum)) + + input_df = pd.DataFrame(input_data) + expected_df = pd.DataFrame(expected_data) + assert not expected_df.equals(input_df) + output_df = add_image_set_to_experiment_table(input_df) + assert not input_df.equals(output_df) + assert len(input_df.columns) != len(output_df.columns) + assert output_df.equals(expected_df) diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py b/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py new file mode 100644 index 0000000000..11763ddeff --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py @@ -0,0 +1,363 @@ +from unittest.mock import create_autospec + +import pytest + +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ + BehaviorOphysExperiment +from allensdk.brain_observatory.behavior.behavior_session import \ + BehaviorSession +from .utils import create_bucket, load_dataset +import boto3 +from moto import mock_s3 +import pathlib +import json +import semver + +from allensdk.api.cloud_cache.cloud_cache import MissingLocalManifestWarning +from allensdk.api.cloud_cache.cloud_cache import OutdatedManifestWarning +from allensdk.brain_observatory.\ + behavior.behavior_project_cache.behavior_project_cache \ + import VisualBehaviorOphysProjectCache + + +@mock_s3 +def test_manifest_methods(tmpdir, s3_cloud_cache_data): + + data, versions = s3_cloud_cache_data + + cache_dir = pathlib.Path(tmpdir) / "test_manifest_list" + bucket_name = "vis-behav-test-bucket" + project_name = "vis-behav-test-proj" + create_bucket(bucket_name, + project_name, + data['data'], + data['metadata']) + + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] + m_list = cache.list_manifest_file_names() + + assert len(m_list) == 2 + assert all([i in m_list for i in v_names]) + cache.load_manifest(v_names[0]) + + # because the BehaviorProjectCloudApi automatically + # loads the latest manifest, so the latest manifest + # will always be the latest_downloaded_manifest + assert cache.latest_downloaded_manifest_file() == v_names[-1] + assert cache.latest_manifest_file() == v_names[-1] + + change_msg = cache.compare_manifests(v_names[0], v_names[-1]) + + for mname in ('behavior_session_table', + 'ophys_session_table', + 'ophys_experiment_table'): + assert f'project_metadata/{mname} changed' in change_msg + + assert 'ophys_file_1.nwb changed' in change_msg + assert 'ophys_file_5.nwb created' in change_msg + assert 'ophys_file_2.nwb' not in change_msg + assert 'behavior_file_3.nwb' not in change_msg + assert 'behavior_file_4.nwb' not in change_msg + + +@mock_s3 +def test_local_cache_construction(tmpdir, s3_cloud_cache_data, monkeypatch): + + data, versions = s3_cloud_cache_data + cache_dir = pathlib.Path(tmpdir) / "test_construction" + bucket_name = "vis-behav-test-bucket" + project_name = "vis-behav-test-proj" + create_bucket(bucket_name, + project_name, + data['data'], + data['metadata']) + + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] + cache.load_manifest(v_names[0]) + + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', + lambda path: create_autospec( + BehaviorOphysExperiment, instance=True)) + cache.get_behavior_ophys_experiment(ophys_experiment_id=5111) + assert cache.fetch_api.cache._downloaded_data_path.is_file() + cache.fetch_api.cache._downloaded_data_path.unlink() + assert not cache.fetch_api.cache._downloaded_data_path.is_file() + del cache + + with pytest.warns(MissingLocalManifestWarning) as warnings: + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + cmd = 'VisualBehaviorOphysProjectCache.construct_local_manifest()' + assert cmd in f'{warnings[0].message}' + + # Because, at the point where the cache was reconstitute, + # the metadata files already existed at their expected local paths, + # the file at _downloaded_data_path file will not have been created + manifest_path = cache.fetch_api.cache._downloaded_data_path + assert not manifest_path.exists() + + cache.construct_local_manifest() + assert cache.fetch_api.cache._downloaded_data_path.is_file() + + with open(manifest_path, 'rb') as in_file: + local_manifest = json.load(in_file) + fnames = set([pathlib.Path(k).name for k in local_manifest]) + assert 'ophys_file_1.nwb' in fnames + assert len(local_manifest) == 9 # 8 metadata files and 1 data file + + +@mock_s3 +def test_load_out_of_date_manifest(tmpdir, s3_cloud_cache_data, monkeypatch): + """ + Test that VisualBehaviorOphysProjectCache can load a + manifest other than the latest and download files + from that manifest. + """ + data, versions = s3_cloud_cache_data + + cache_dir = pathlib.Path(tmpdir) / "test_linkage" + bucket_name = "vis-behav-test-bucket" + project_name = "vis-behav-test-proj" + create_bucket(bucket_name, + project_name, + data['data'], + data['metadata']) + + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] + cache.load_manifest(v_names[0]) + for sess_id in (333, 444): + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorSession, 'from_nwb_path', + lambda path: create_autospec( + BehaviorSession, instance=True)) + cache.get_behavior_session(behavior_session_id=sess_id) + for exp_id in (5111, 5222): + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', + lambda path: create_autospec( + BehaviorOphysExperiment, instance=True)) + cache.get_behavior_ophys_experiment(ophys_experiment_id=exp_id) + + v1_dir = cache_dir / f'{project_name}-{versions[0]}/data' + + # Check that all expected file were downloaded + dir_glob = v1_dir.glob('*') + file_names = set() + file_contents = {} + for p in dir_glob: + file_names.add(p.name) + with open(p, 'rb') as in_file: + data = in_file.read() + file_contents[p.name] = data + expected = {'ophys_file_1.nwb', 'ophys_file_2.nwb', + 'behavior_file_3.nwb', 'behavior_file_4.nwb'} + + assert file_names == expected + + expected = {} + expected['ophys_file_1.nwb'] = b'abcde' + expected['ophys_file_2.nwb'] = b'fghijk' + expected['behavior_file_3.nwb'] = b'12345' + expected['behavior_file_4.nwb'] = b'67890' + + assert file_contents == expected + + +@mock_s3 +@pytest.mark.parametrize("delete_cache", [True, False]) +def test_file_linkage(tmpdir, s3_cloud_cache_data, delete_cache, monkeypatch): + """ + Test that symlinks are used where appropriate + + if delete_cache == True, will delete the local cache + file between loading v1 and v2 manifests, then run + construct_local_cache() to make sure that the symlinks + are still properly constructed + """ + data, versions = s3_cloud_cache_data + cache_dir = pathlib.Path(tmpdir) / "test_linkage" + bucket_name = "vis-behav-test-bucket" + project_name = "vis-behav-test-proj" + create_bucket(bucket_name, + project_name, + data['data'], + data['metadata']) + + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] + v_dirs = [cache_dir / f'{project_name}-{i}/data' for i in versions] + + assert cache.current_manifest() == v_names[-1] + assert cache.list_all_downloaded_manifests() == [v_names[-1]] + + cache.load_manifest(v_names[0]) + assert cache.current_manifest() == v_names[0] + assert cache.list_all_downloaded_manifests() == v_names + + for sess_id in (333, 444): + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorSession, 'from_nwb_path', + lambda path: create_autospec( + BehaviorSession, instance=True)) + cache.get_behavior_session(behavior_session_id=sess_id) + for exp_id in (5111, 5222): + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', + lambda path: create_autospec( + BehaviorOphysExperiment, instance=True)) + cache.get_behavior_ophys_experiment(ophys_experiment_id=exp_id) + + v1_glob = v_dirs[0].glob('*') + v1_paths = {} + for p in v1_glob: + v1_paths[p.name] = p + + if delete_cache: + local_cache = cache.fetch_api.cache._downloaded_data_path + assert local_cache.is_file() + local_cache.unlink() + assert not local_cache.is_file() + del cache + + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + cache.construct_local_manifest() + + cache.load_manifest(v_names[-1]) + assert cache.current_manifest() == v_names[-1] + for sess_id in (777, 888): + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorSession, 'from_nwb_path', + lambda path: create_autospec( + BehaviorSession, instance=True)) + cache.get_behavior_session(behavior_session_id=sess_id) + for exp_id in (5444, 5666, 5777): + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', + lambda path: create_autospec( + BehaviorOphysExperiment, instance=True)) + cache.get_behavior_ophys_experiment(ophys_experiment_id=exp_id) + + v2_glob = v_dirs[-1].glob('*') + v2_paths = {} + for p in v2_glob: + v2_paths[p.name] = p + + # check symlinks + for name in ('ophys_file_2.nwb', + 'behavior_file_3.nwb', + 'behavior_file_4.nwb'): + + assert v2_paths[name].is_symlink() + assert v2_paths[name].resolve() == v1_paths[name].resolve() + assert v2_paths[name].absolute() != v1_paths[name].absolute() + + name = 'ophys_file_1.nwb' + assert not v2_paths[name].is_symlink() + assert not v2_paths[name].absolute() == v1_paths[name].absolute() + + assert 'ophys_file_5.nwb' in v2_paths + + +@mock_s3 +def test_when_data_updated(tmpdir, s3_cloud_cache_data, data_update): + """ + Test that when a cache is instantiated after an update has + been loaded to the dataset, the correct warning is emitted + """ + data, versions = s3_cloud_cache_data + cache_dir = pathlib.Path(tmpdir) / "test_update" + bucket_name = "vis-behav-test-bucket" + project_name = "vis-behav-test-proj" + create_bucket(bucket_name, + project_name, + data['data'], + data['metadata']) + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + del cache + + client = boto3.client('s3', region_name='us-east-1') + + later_version = str(semver.parse_version_info(versions[-1]).bump_minor()) + load_dataset(data_update['data'], + data_update['metadata'], + later_version, + bucket_name, + project_name, + client) + + name3 = f'{project_name}_manifest_v{later_version}' + name2 = f'{project_name}_manifest_v{versions[-1]}' + + cmd = 'VisualBehaviorOphysProjectCache.load_manifest' + with pytest.warns(OutdatedManifestWarning, match=name3) as warnings: + VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + checked_msg = False + for w in warnings.list: + if w._category_name == 'OutdatedManifestWarning': + msg = str(w.message) + assert name3 in msg + assert name2 in msg + assert cmd in msg + checked_msg = True + assert checked_msg + + +@mock_s3 +def test_load_last(tmpdir, s3_cloud_cache_data, data_update): + """ + Test that, when a cache is instantiated over an old + cache_dir, it loads the most recently loaded manifest, + not the most up to date manifest + """ + data, versions = s3_cloud_cache_data + cache_dir = pathlib.Path(tmpdir) / "test_update" + bucket_name = "vis-behav-test-bucket" + project_name = "vis-behav-test-proj" + create_bucket(bucket_name, + project_name, + data['data'], + data['metadata']) + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] + + assert cache.current_manifest() == v_names[-1] + cache.load_manifest(v_names[0]) + assert cache.current_manifest() == v_names[0] + del cache + + msg = 'VisualBehaviorOphysProjectCache.compare_manifests' + with pytest.warns(OutdatedManifestWarning, match=msg): + cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, + bucket_name, + project_name) + + assert cache.current_manifest() == v_names[0] diff --git a/test/brain_observatory/behavior/behavior_project_cache/utils.py b/test/brain_observatory/behavior/behavior_project_cache/utils.py new file mode 100644 index 0000000000..0a51ff20ad --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache/utils.py @@ -0,0 +1,154 @@ +from typing import Union +import boto3 +import json +import hashlib + + +def load_dataset(data_blobs: dict, + metadata_blobs: Union[dict, None], + manifest_version: str, + bucket_name: str, + project_name: str, + client: boto3.client) -> None: + """ + Load a test dataset into moto's mocked S3 + + Parameters + ---------- + data_blobs: dict + Maps filename to a dict + 'data': the bytes in the data file + 'file_id': the file_id of the data file + + metadata_blobs: Union[dict, None] + A dict mapping metadata filename to bytes in the file + + manifest_version: str + The version of the manifest (manifest will be + uploaded to moto3 as manifest_{manifest_version}.json) + + bucket_name: str + + project_name: str + + client: boto3.client + + Returns + ------- + None + Uploads the provided data, generates the manifest, + and uploads the manifest to moto3 + """ + + for fname in data_blobs: + client.put_object(Bucket=bucket_name, + Key=f'{project_name}/data/{fname}', + Body=data_blobs[fname]['data']) + + if metadata_blobs is not None: + for fname in metadata_blobs: + client.put_object(Bucket=bucket_name, + Key=f'{project_name}/project_metadata/{fname}', + Body=metadata_blobs[fname]) + + response = client.list_object_versions(Bucket=bucket_name) + fname_to_version = {} + for obj in response['Versions']: + if obj['IsLatest']: + fname = obj['Key'].split('/')[-1] + fname_to_version[fname] = obj['VersionId'] + + manifest = {} + manifest['manifest_version'] = manifest_version + manifest['project_name'] = project_name + manifest['metadata_file_id_column_name'] = 'file_id' + manifest['metadata_files'] = {} + manifest['data_pipeline'] = [{'name': 'AllenSDK', 'version': '1.1.1'}] + + data_file_dict = {} + url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/data' + for fname in data_blobs: + url = f'{url_root}/{fname}' + hasher = hashlib.blake2b() + hasher.update(data_blobs[fname]['data']) + checksum = hasher.hexdigest() + + data_file = {'url': url, + 'version_id': fname_to_version[fname], + 'file_hash': checksum} + + data_file_dict[data_blobs[fname]['file_id']] = data_file + + manifest['data_files'] = data_file_dict + + if metadata_blobs is not None: + url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/' + url_root += 'project_metadata' + + metadata_dict = {} + for fname in metadata_blobs: + url = f'{url_root}/{fname}' + hasher = hashlib.blake2b() + hasher.update(metadata_blobs[fname]) + metadata_dict[fname] = {'url': url, + 'file_hash': hasher.hexdigest(), + 'version_id': fname_to_version[fname]} + + manifest['metadata_files'] = metadata_dict + + manifest_k = f'{project_name}/manifests/' + manifest_k += f'{project_name}_manifest_v{manifest_version}.json' + client.put_object(Bucket=bucket_name, + Key=manifest_k, + Body=bytes(json.dumps(manifest), 'utf-8')) + + return None + + +def create_bucket(test_bucket_name: str, + project_name: str, + datasets: dict, + metadatasets: dict) -> None: + """ + Create a bucket and populate it with example datasets + + Parameters + ---------- + test_bucket_name: str + Name of the bucket + + project_name: str + Name of project + + datasets: dict + Keyed on version names; values are dicts of individual + data files to be loaded to the bucket + + metadatasets: dict + Keyed on version names; values are dicts of individual + metadata files to be loaded to the bucket (default: None) + """ + + conn = boto3.resource('s3', region_name='us-east-1') + conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') + + # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning + bucket_versioning = conn.BucketVersioning(test_bucket_name) + bucket_versioning.enable() + + client = boto3.client('s3', region_name='us-east-1') + + # upload first dataset + for v in datasets.keys(): + if metadatasets is not None: + m = metadatasets[v] + else: + m = None + load_dataset(datasets[v], + m, + v, + test_bucket_name, + project_name, + client) + + return None diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7df7b2eb70235d363c022d8a479015b1d64d9401 GIT binary patch literal 17392 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/test_behavior_project_cache.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/test_behavior_project_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c04e63c4f48a35314a55d80bb289a38459ea75a GIT binary patch literal 4714 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 NwHjN^t>$Z&{sly)=Uo5* literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py b/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py new file mode 100644 index 0000000000..b9fbd4808a --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py @@ -0,0 +1,699 @@ +import os +import copy +import numpy as np +import pytest +import pandas as pd +import tempfile + +from allensdk.brain_observatory.behavior.behavior_project_cache \ + import VisualBehaviorOphysProjectCache + +from allensdk.brain_observatory.behavior.behavior_project_cache.\ + tables.util.experiments_table_utils import ( + add_experience_level_to_experiment_table, + add_passive_flag_to_ophys_experiment_table, + add_image_set_to_experiment_table) + +from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ + .util.prior_exposure_processing import \ + get_prior_exposures_to_session_type, \ + get_prior_exposures_to_image_set, \ + get_prior_exposures_to_omissions +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.full_genotype import \ + FullGenotype +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.reporter_line import \ + ReporterLine + + +@pytest.fixture(scope='session') +def behavior_session_id_list(): + """ + List of behavior_session_id; the most fundamental fixture + """ + return list(range(1, 9)) + + +@pytest.fixture(scope='session') +def session_name_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to session_name + """ + return {ii: f'session_{ii}' + for ii in behavior_session_id_list} + + +@pytest.fixture(scope='session') +def date_of_acquisition_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to date of acquisition + """ + return {ii: np.datetime64(f'2020-02-{ii:02d}') + for ii in behavior_session_id_list} + + +@pytest.fixture(scope='session') +def session_type_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to session_type + """ + rng = np.random.default_rng(871231) + possible = ('TRAINING_1_gratings', + 'OPHYS_1_images_A', + 'OPHYS_1_images_B') + + vals = rng.choice(possible, + size=len(behavior_session_id_list), + replace=True) + + return {ii: vv + for ii, vv in zip(behavior_session_id_list, + vals)} + + +@pytest.fixture(scope='session') +def project_code_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to project_code + """ + return {ii: 'code{ii}' + for ii in behavior_session_id_list} + + +@pytest.fixture(scope='session') +def specimen_id_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to specimen_id + """ + return {ii: 1111*ii + for ii in behavior_session_id_list} + + +@pytest.fixture(scope='session') +def genotype_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to full_genotype + """ + rng = np.random.default_rng(981232) + possible = ('foo-SlcCre', + 'Vip-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt', + 'bar', + 'foobar') + chosen = rng.choice(possible, + size=len(behavior_session_id_list), + replace=True) + return {ii: val + for ii, val in zip(behavior_session_id_list, chosen)} + + +@pytest.fixture(scope='session') +def reporter_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to reporter_line + """ + return {ii: f"Ai{90+ii}(TITL-GCaMP6f)" + for ii in behavior_session_id_list} + + +@pytest.fixture(scope='session') +def driver_lookup(behavior_session_id_list): + """ + Dict mapping behavior_session_id to driver_line. + Note: driver_line is a list of strings + """ + rng = np.random.default_rng(1723213) + possible = (["aa"], + ["aa", "bb"], + ["cc"], + ["cc", "dd"]) + chosen = rng.choice(possible, + size=len(behavior_session_id_list), + replace=True) + return {ii: val + for ii, val in zip(behavior_session_id_list, + chosen)} + + +@pytest.fixture(scope='session') +def behavior_session_data_fixture(behavior_session_id_list, + session_name_lookup, + date_of_acquisition_lookup, + session_type_lookup, + specimen_id_lookup, + genotype_lookup, + reporter_lookup, + driver_lookup): + """ + List of dicts. Each dict is an entry in the raw + behavior_session_table as would be returned by the + fetch_api + """ + + behavior_session_list = [] + for s_id in behavior_session_id_list: + + genotype = genotype_lookup[s_id] + driver = driver_lookup[s_id] + reporter = reporter_lookup[s_id] + date = date_of_acquisition_lookup[s_id] + specimen_id = specimen_id_lookup[s_id] + s_name = session_name_lookup[s_id] + s_type = session_type_lookup[s_id] + datum = {'behavior_session_id': s_id, + 'session_name': s_name, + 'date_of_acquisition': date, + 'specimen_id': specimen_id, + 'session_type': s_type, + 'equipment_name': 'MESO2.0', + 'donor_id': 20+s_id, + 'full_genotype': genotype, + 'sex': ['m', 'f'][s_id % 2], + 'age_in_days': s_id*7, + 'foraging_id': s_id+30, + 'mouse_id': s_id+40, + 'reporter_line': reporter, + 'driver_line': driver} + + behavior_session_list.append(datum) + + return behavior_session_list + + +@pytest.fixture() +def behavior_session_table(behavior_session_data_fixture): + """ + The behavior_session_table dataframe as returned by the + fetch_api + """ + data = [] + index = [] + for datum in behavior_session_data_fixture: + datum = copy.deepcopy(datum) + index.append(datum.pop('behavior_session_id')) + data.append(datum) + + df = pd.DataFrame( + data, + index=pd.Index(index, name='behavior_session_id')) + return df + + +@pytest.fixture(scope='session') +def behavior_session_to_ophys_session_map(behavior_session_id_list): + """ + Dict mapping behavior_session_id to ophys_session_id. + This is a one-to-one mapping, though not all behavior_sessions + have corresponding ophys_sessions + """ + lookup = dict() + ophys_id = 88 + for ii in range(0, len(behavior_session_id_list)): + if ii % 3 == 0: + continue + lookup[behavior_session_id_list[ii]] = ophys_id + ophys_id += 1 + return lookup + + +@pytest.fixture(scope='session') +def ophys_session_to_experiment_map(behavior_session_to_ophys_session_map): + """ + Dict mapping ophys_session_id to a list of ophys_experiment_ids + (this is a one-to-many relationship) + """ + lookup = dict() + i0 = 1000 + dd = 5 + ophys_vals = list(behavior_session_to_ophys_session_map.values()) + ophys_vals.sort() + for ii in ophys_vals: + lookup[ii] = list(range(i0, i0+dd)) + i0 += dd + + return lookup + + +@pytest.fixture(scope='session') +def ophys_experiment_to_container_map(ophys_session_to_experiment_map): + """ + Dict mapping ophys_experiment_id to a list of ophys_container_ids + (this is a one-to-many relationship) + """ + lookup = dict() + container_id = 4000 + key_list = list(ophys_session_to_experiment_map.keys()) + key_list.sort() + for key in key_list: + experiment_list = ophys_session_to_experiment_map[key] + for exp_id in experiment_list: + local_list = [] + for ii in range(7): + container_id += 1 + local_list.append(container_id) + lookup[exp_id] = local_list + return lookup + + +@pytest.fixture(scope='session') +def container_state_lookup(ophys_experiment_to_container_map): + """ + Dict mapping ophys_container_id to container_workflow_state + Note: each ophys_experiment_id can only be associated with + one 'published' ophys_container. + """ + rng = np.random.default_rng(66232) + exp_id_list = list(ophys_experiment_to_container_map.keys()) + exp_id_list.sort() + lookup = dict() + for exp_id in exp_id_list: + local_container_list = ophys_experiment_to_container_map[exp_id] + for container_id in local_container_list: + assert container_id not in lookup + lookup[container_id] = 'junk' + good_container = rng.choice(local_container_list) + lookup[good_container] = 'published' + return lookup + + +@pytest.fixture(scope='session') +def experiment_state_lookup(ophys_session_data_fixture): + """ + Dict mapping ophys_experiment_id to the experiment_workflow_state + """ + rng = np.random.default_rng(772312) + exp_id_list = [] + for datum in ophys_session_data_fixture: + for exp_id in datum['ophys_experiment_id']: + if exp_id not in exp_id_list: + exp_id_list.append(exp_id) + lookup = dict() + for exp_id in exp_id_list: + lookup[exp_id] = ['passed', 'failed'][rng.integers(0, 2)] + return lookup + + +@pytest.fixture(scope='session') +def ophys_session_data_fixture(project_code_lookup, + session_name_lookup, + date_of_acquisition_lookup, + specimen_id_lookup, + session_type_lookup, + ophys_session_to_experiment_map, + ophys_experiment_to_container_map, + behavior_session_to_ophys_session_map): + """ + List of dicts. + Each dict is one entry in the ophys_session_table as returned + by the fetch_api. + """ + + ophys_session_list = [] + ophys_session_id_list = list(ophys_session_to_experiment_map.keys()) + ophys_session_id_list.sort() + for beh in behavior_session_to_ophys_session_map: + o_session = behavior_session_to_ophys_session_map[beh] + container_list = [] + for exp_id in ophys_session_to_experiment_map[o_session]: + container_list += ophys_experiment_to_container_map[exp_id] + + datum = {'behavior_session_id': beh, + 'project_code': project_code_lookup[beh], + 'date_of_acquisition': date_of_acquisition_lookup[beh], + 'session_name': session_name_lookup[beh], + 'session_type': session_type_lookup[beh], + 'ophys_experiment_id': + ophys_session_to_experiment_map[o_session], + 'ophys_container_id': container_list, + 'specimen_id': 9*beh, + 'ophys_session_id': o_session} + + ophys_session_list.append(datum) + return ophys_session_list + + +@pytest.fixture() +def ophys_session_table(ophys_session_data_fixture): + """ + The ophys_session_table dataframe as returned by the fetch_api + """ + data = [] + index = [] + for datum in ophys_session_data_fixture: + datum = copy.deepcopy(datum) + index.append(datum.pop('ophys_session_id')) + data.append(datum) + + df = pd.DataFrame( + data, + index=pd.Index(index, name='ophys_session_id')) + return df + + +@pytest.fixture(scope='session') +def ophys_experiment_data_fixture(ophys_session_data_fixture, + experiment_state_lookup, + container_state_lookup, + ophys_experiment_to_container_map): + """ + List of dicts. + Each dict is an entry in the ophys_experiment_table as returned + by the fetch_api. + """ + rng = np.random.default_rng(182312) + + isi_id = 4000 + ophys_experiment_list = [] + for ophys_session in ophys_session_data_fixture: + for i_experiment in ophys_session['ophys_experiment_id']: + cntr_id_list = ophys_experiment_to_container_map[i_experiment] + for container_id in cntr_id_list: + datum = { + 'ophys_session_id': ophys_session['ophys_session_id'], + 'session_type': ophys_session['session_type'], + 'behavior_session_id': + ophys_session['behavior_session_id'], + 'ophys_container_id': container_id, + 'container_workflow_state': + container_state_lookup[container_id], + 'experiment_workflow_state': + experiment_state_lookup[i_experiment], + 'session_name': ophys_session['session_name'], + 'date_of_acquisition': + ophys_session['date_of_acquisition'], + 'isi_experiment_id': isi_id, + 'imaging_depth': rng.integers(50, 200), + 'targeted_tructure': 'VISp', + 'published_at': ophys_session['date_of_acquisition'], + 'ophys_experiment_id': i_experiment} + ophys_experiment_list.append(datum) + return ophys_experiment_list + + +@pytest.fixture() +def ophys_experiments_table(ophys_experiment_data_fixture): + """ + The ophys_experiments_table as returned by the fetch_api + (a dataframe) + """ + data = [] + index = [] + for datum in ophys_experiment_data_fixture: + datum = copy.deepcopy(datum) + index.append(datum.pop('ophys_experiment_id')) + data.append(datum) + + df = pd.DataFrame( + data, + index=pd.Index(index, name='ophys_experiment_id')) + return df + + +@pytest.fixture() +def intermediate_behavior_table(behavior_session_table, + mock_api): + """ + A dataframe created by adding/transfrming columns in + behavior_session_table. This table is used to produce the + expected experiments_table and ophys_session_table. + """ + df = behavior_session_table.copy(deep=True) + + df['reporter_line'] = df['reporter_line'].apply( + ReporterLine.parse) + df['cre_line'] = df['full_genotype'].apply( + lambda x: FullGenotype(full_genotype=x).parse_cre_line()) + df['indicator'] = df['reporter_line'].apply( + lambda x: ReporterLine(reporter_line=x).parse_indicator()) + + df['prior_exposures_to_session_type'] = \ + get_prior_exposures_to_session_type(df=df) + df['prior_exposures_to_image_set'] = \ + get_prior_exposures_to_image_set(df=df) + df['prior_exposures_to_omissions'] = \ + get_prior_exposures_to_omissions( + df=df, + fetch_api=mock_api) + return df + + +@pytest.fixture() +def expected_behavior_session_table(intermediate_behavior_table, + ophys_session_data_fixture, + mock_api, + container_state_lookup, + experiment_state_lookup, + ophys_experiment_to_container_map, + request): + """ + The behavior_session_table as returned by the user-facing methods + in behavior_project_cache. + + Note: request specifies whether the table was produced with + passed_only = True or False. The actual object returned by + this fixture is a dict. 'df' points to the dataframe. + 'passed_only' points to the value of passed_only used to + generate the dataframe. + """ + if hasattr(request, 'param'): + passed_only = request.param + else: + passed_only = True + + df = intermediate_behavior_table.copy(deep=True) + + df['session_name_behavior'] = df['session_name'] + df = df.drop(['session_name'], axis=1) + df['specimen_id_behavior'] = df['specimen_id'] + df = df.drop(['specimen_id'], axis=1) + + df['project_code'] = None + df['ophys_session_id'] = None + df['session_name_ophys'] = None + df['ophys_experiment_id'] = None + df['ophys_container_id'] = None + df['specimen_id_ophys'] = None + + session_number = [] + for v in df['session_type'].values: + if 'OPHYS' in v: + session_number.append(1) + else: + session_number.append(None) + df['session_number'] = session_number + + for ophys_session in ophys_session_data_fixture: + index = ophys_session['behavior_session_id'] + df.at[index, 'project_code'] = ophys_session['project_code'] + df.at[index, 'ophys_session_id'] = ophys_session['ophys_session_id'] + df.at[index, 'session_name_ophys'] = ophys_session['session_name'] + + container_id_list = set() + exp_id_list = set() + for exp_id in ophys_session['ophys_experiment_id']: + # because SessionsTable does not filter on experiment state + exp_id_list.add(exp_id) + if experiment_state_lookup[exp_id] != 'passed' and passed_only: + continue + for container_id in ophys_experiment_to_container_map[exp_id]: + is_published = (container_state_lookup[container_id] + == 'published') + if is_published or not passed_only: + container_id_list.add(container_id) + + exp_id_list = list(exp_id_list) + exp_id_list.sort() + container_id_list = list(container_id_list) + container_id_list.sort() + + df.at[index, 'ophys_container_id'] = container_id_list + df.at[index, 'ophys_experiment_id'] = exp_id_list + df.at[index, 'specimen_id_ophys'] = ophys_session['specimen_id'] + + df['ophys_session_id'] = df['ophys_session_id'].astype(float) + + return {'df': df, 'passed_only': passed_only} + + +@pytest.fixture() +def expected_experiments_table(ophys_experiments_table, + container_state_lookup, + experiment_state_lookup, + intermediate_behavior_table, + request): + """ + The experiments_table as returned by the user-facing methods + in the behavior_project_cache + + Note: request specifies whether the table was produced with + passed_only = True or False. The actual object returned by + this fixture is a dict. 'df' points to the dataframe. + 'passed_only' points to the value of passed_only used to + generate the dataframe. + """ + + if hasattr(request, 'param'): + passed_only = request.param + else: + passed_only = True + + behavior_table = intermediate_behavior_table.copy(deep=True) + expected = ophys_experiments_table.copy(deep=True) + + if passed_only: + expected = expected.query("experiment_workflow_state=='passed'") + expected = expected.query("container_workflow_state=='published'") + + expected = expected.join(behavior_table[ + ['equipment_name', + 'donor_id', + 'full_genotype', + 'mouse_id', + 'driver_line', + 'sex', + 'age_in_days', + 'foraging_id', + 'reporter_line', + 'specimen_id', + 'prior_exposures_to_session_type', + 'prior_exposures_to_image_set', + 'prior_exposures_to_omissions', + 'indicator', + 'cre_line']], + on='behavior_session_id') + + expected = expected.join(behavior_table[ + ['session_name']], + on='behavior_session_id', + rsuffix='_behavior') + + session_number = [] + for v in expected['session_type'].values: + if 'OPHYS' in v: + session_number.append(1) + else: + session_number.append(None) + expected['session_number'] = session_number + + expected = add_experience_level_to_experiment_table(expected) + expected = add_passive_flag_to_ophys_experiment_table(expected) + expected = add_image_set_to_experiment_table(expected) + + expected['session_name_ophys'] = expected['session_name'] + expected = expected.drop(['session_name'], axis=1) + + return {'df': expected, 'passed_only': passed_only} + + +@pytest.fixture() +def expected_ophys_session_table(ophys_session_table, + intermediate_behavior_table, + container_state_lookup, + experiment_state_lookup, + ophys_experiment_to_container_map, + request): + """ + The ophys_session_table as returned by the user-facing methods + in the behavior_project_cache. + + Note: request specifies whether the table was produced with + passed_only = True or False. The actual object returned by + this fixture is a dict. 'df' points to the dataframe. + 'passed_only' points to the value of passed_only used to + generate the dataframe. + """ + if hasattr(request, 'param'): + passed_only = request.param + else: + passed_only = True + expected = ophys_session_table.copy(deep=True) + + if passed_only: + valid_containers = set() + valid_experiments = set() + for exp_id in ophys_experiment_to_container_map: + if experiment_state_lookup[exp_id] != 'passed': + continue + for container_id in ophys_experiment_to_container_map[exp_id]: + if container_state_lookup[container_id] == 'published': + valid_containers.add(container_id) + valid_experiments.add(exp_id) + + # ophys_sessions_table does not appear to filter on + # whether or not an experiment is 'passed'; + # that is probably supposed to happen at the level + # of the LIMS query (?) + for index_val in expected.index.values: + raw_containers = expected.loc[index_val]['ophys_container_id'] + container_id = [c for c in raw_containers if c in valid_containers] + expected.at[index_val, 'ophys_container_id'] = container_id + + behavior_table = intermediate_behavior_table.copy(deep=True) + + expected = expected.join(behavior_table[ + ['equipment_name', + 'donor_id', + 'full_genotype', + 'mouse_id', + 'driver_line', + 'sex', + 'age_in_days', + 'foraging_id', + 'reporter_line', + 'prior_exposures_to_session_type', + 'prior_exposures_to_image_set', + 'prior_exposures_to_omissions', + 'indicator', + 'cre_line']], + on='behavior_session_id') + + expected = expected.join( + behavior_table[['specimen_id', 'session_name']], + on='behavior_session_id', + rsuffix='_behavior', + lsuffix='_ophys') + + session_number = [] + for v in expected['session_type'].values: + if 'OPHYS' in v: + session_number.append(1) + else: + session_number.append(None) + expected['session_number'] = session_number + + return {'df': expected, 'passed_only': passed_only} + + +@pytest.fixture +def mock_api(ophys_session_table, + behavior_session_table, + ophys_experiments_table): + + class MockApi: + + def get_ophys_session_table(self): + return ophys_session_table + + def get_behavior_session_table(self): + return behavior_session_table + + def get_ophys_experiment_table(self): + return ophys_experiments_table + + def get_session_data(self, ophys_session_id): + return ophys_session_id + + def get_behavior_stage_parameters(self, foraging_ids): + return {x: {} for x in foraging_ids} + + return MockApi + + +@pytest.fixture +def TempdirBehaviorCache(mock_api, request): + temp_dir = tempfile.TemporaryDirectory() + manifest = os.path.join(temp_dir.name, "manifest.json") + yield VisualBehaviorOphysProjectCache(fetch_api=mock_api(), + cache=request.param, + manifest=manifest) + temp_dir.cleanup() diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py b/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py new file mode 100644 index 0000000000..046ef94c9d --- /dev/null +++ b/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py @@ -0,0 +1,173 @@ +import pytest +import pandas as pd +import logging +import os + +from allensdk.test_utilities.custom_comparators import safe_df_comparison + + +@pytest.mark.parametrize("TempdirBehaviorCache, expected_ophys_session_table", + [(True, True), + (True, False), + (False, True), + (False, False)], indirect=True) +def test_get_ophys_session_table(TempdirBehaviorCache, + expected_ophys_session_table): + cache = TempdirBehaviorCache + obtained = cache.get_ophys_session_table( + passed_only=expected_ophys_session_table['passed_only']) + if cache.cache: + path = cache.manifest.path_info.get("ophys_sessions").get("spec") + assert os.path.exists(path) + + safe_df_comparison(expected_ophys_session_table['df'], + obtained) + + +@pytest.mark.parametrize("TempdirBehaviorCache, " + "expected_behavior_session_table", + [(True, True), + (True, False), + (False, True), + (False, False)], indirect=True) +def test_get_behavior_table(TempdirBehaviorCache, + expected_behavior_session_table, + container_state_lookup, + experiment_state_lookup, + ophys_experiment_to_container_map): + cache = TempdirBehaviorCache + obtained = cache.get_behavior_session_table( + passed_only=expected_behavior_session_table['passed_only']) + expected = expected_behavior_session_table['df'] + if cache.cache: + path = cache.manifest.path_info.get("behavior_sessions").get("spec") + assert os.path.exists(path) + + safe_df_comparison(expected, obtained) + + +@pytest.mark.parametrize("TempdirBehaviorCache, " + "expected_experiments_table", + [(True, True), + (True, False), + (False, True), + (False, False)], indirect=True) +def test_get_experiments_table(TempdirBehaviorCache, + expected_experiments_table): + cache = TempdirBehaviorCache + obtained = cache.get_ophys_experiment_table( + passed_only=expected_experiments_table['passed_only']) + if cache.cache: + path = cache.manifest.path_info.get("ophys_experiments").get("spec") + assert os.path.exists(path) + + safe_df_comparison(expected_experiments_table['df'], obtained) + + +@pytest.mark.parametrize("TempdirBehaviorCache", [True], indirect=True) +def test_session_table_reads_from_cache(TempdirBehaviorCache, + caplog): + caplog.set_level(logging.INFO, logger="call_caching") + cache = TempdirBehaviorCache + cache.get_ophys_session_table() + reading_tuple = ('call_caching', logging.INFO, 'Reading data from cache') + no_file_tuple = ('call_caching', logging.INFO, 'No cache file found.') + writing_tuple = ('call_caching', logging.INFO, 'Writing data to cache') + assert reading_tuple in caplog.record_tuples + assert no_file_tuple in caplog.record_tuples + assert writing_tuple in caplog.record_tuples + + caplog.clear() + cache.get_ophys_session_table() + assert reading_tuple in caplog.record_tuples + assert no_file_tuple not in caplog.record_tuples + assert writing_tuple not in caplog.record_tuples + + +@pytest.mark.parametrize("TempdirBehaviorCache", [True], indirect=True) +def test_behavior_table_reads_from_cache(TempdirBehaviorCache, + caplog): + caplog.set_level(logging.INFO, logger="call_caching") + cache = TempdirBehaviorCache + cache.get_behavior_session_table() + reading_tuple = ('call_caching', logging.INFO, 'Reading data from cache') + no_file_tuple = ('call_caching', logging.INFO, 'No cache file found.') + writing_tuple = ('call_caching', logging.INFO, 'Writing data to cache') + assert reading_tuple in caplog.record_tuples + assert no_file_tuple in caplog.record_tuples + assert writing_tuple in caplog.record_tuples + + caplog.clear() + cache.get_behavior_session_table() + assert reading_tuple in caplog.record_tuples + assert no_file_tuple not in caplog.record_tuples + assert writing_tuple not in caplog.record_tuples + + +@pytest.mark.parametrize("TempdirBehaviorCache", [True, False], indirect=True) +def test_get_ophys_session_table_by_experiment(TempdirBehaviorCache, + expected_ophys_session_table): + + raw = expected_ophys_session_table['df'][['ophys_experiment_id']] + data = [] + for session_id, exp_id_list in zip(raw.index.values, + raw.ophys_experiment_id.values): + for exp_id in exp_id_list: + data.append({'ophys_session_id': session_id, + 'ophys_experiment_id': exp_id}) + + expected = pd.DataFrame(data).set_index('ophys_experiment_id') + + actual = TempdirBehaviorCache.get_ophys_session_table( + index_column="ophys_experiment_id")[ + ["ophys_session_id"]] + + pd.testing.assert_frame_equal(expected, actual) + + +@pytest.mark.parametrize("TempdirBehaviorCache", [True], indirect=True) +def test_cloud_manifest_errors(TempdirBehaviorCache): + """ + Test that methods which should not exist for BehaviorProjectCaches + that are not backed by CloudCaches raise NotImplementedError + """ + msg = 'Method {mname} does not exist for this ' + msg += 'VisualBehaviorOphysProjectCache, which is based on MockApi' + with pytest.raises(NotImplementedError, + match=msg.format(mname='construct_local_manifest')): + TempdirBehaviorCache.construct_local_manifest() + + with pytest.raises(NotImplementedError, + match=msg.format(mname='compare_manifests')): + TempdirBehaviorCache.compare_manifests('a', 'b') + + with pytest.raises(NotImplementedError, + match=msg.format(mname='load_latest_manifest')): + TempdirBehaviorCache.load_latest_manifest() + + this_msg = msg.format(mname='latest_downloaded_manifest_file') + with pytest.raises(NotImplementedError, + match=this_msg): + TempdirBehaviorCache.latest_downloaded_manifest_file() + + with pytest.raises(NotImplementedError, + match=msg.format(mname='latest_manifest_file')): + TempdirBehaviorCache.latest_manifest_file() + + with pytest.raises(NotImplementedError, + match=msg.format(mname='load_manifest')): + TempdirBehaviorCache.load_manifest('a') + + with pytest.raises(NotImplementedError, + match=msg.format(mname='current_manifest')): + TempdirBehaviorCache.current_manifest() + + this_msg = msg.format(mname='list_all_downloaded_manifests') + with pytest.raises(NotImplementedError, + match=this_msg): + TempdirBehaviorCache.list_all_downloaded_manifests() + + this_msg = msg.format(mname='list_manifest_file_names') + with pytest.raises(NotImplementedError, + match=this_msg): + TempdirBehaviorCache.list_manifest_file_names() diff --git a/test/brain_observatory/behavior/conftest.py b/test/brain_observatory/behavior/conftest.py new file mode 100644 index 0000000000..9617c4906a --- /dev/null +++ b/test/brain_observatory/behavior/conftest.py @@ -0,0 +1,94 @@ +import os +import sys + +import pytest + +from allensdk.test_utilities.custom_comparators import WhitespaceStrippedString + + +def get_resources_dir(): + behavior_dir = os.path.dirname(__file__) + return os.path.join(behavior_dir, 'resources') + + +def pytest_assertrepr_compare(config, op, left, right): + if isinstance(left, WhitespaceStrippedString) and op == "==": + if isinstance(right, WhitespaceStrippedString): + right_compare = right.orig + else: + right_compare = right + return ["Comparing strings with whitespace stripped. ", + f"{left.orig} != {right_compare}.", "Diff:"] + left.diff + + +def pytest_ignore_collect(path, config): + ''' The brain_observatory.ecephys submodule uses + python 3.6 features that may not be backwards compatible! + ''' + + if sys.version_info < (3, 6): + return True + return False + + +@pytest.fixture() +def behavior_stimuli_data_fixture(request): + """ + This fixture mimicks the behavior experiment stimuli data logs and + allows parameterization for testing + """ + images_set_log = request.param.get("images_set_log", [ + ('Image', 'im065', 5.809, 0)]) + images_draw_log = request.param.get("images_draw_log", [ + ([0] + [1] * 3 + [0] * 3) + ]) + grating_set_log = request.param.get("grating_set_log", [ + ('Ori', 90, 3.585, 0) + ]) + grating_draw_log = request.param.get("grating_draw_log", [ + ([0] + [1] * 3 + [0] * 3) + ]) + omitted_flash_frame_log = request.param.get("omitted_flash_frame_log", { + "grating_0": [] + }) + grating_phase = request.param.get("grating_phase", None) + grating_spatial_frequency = request.param.get("grating_spatial_frequency", + None) + + has_images = request.param.get("has_images", True) + has_grating = request.param.get("has_grating", True) + + resources_dir = get_resources_dir() + + image_data = { + "set_log": images_set_log, + "draw_log": images_draw_log, + "image_path": os.path.join(resources_dir, + 'stimulus_template', + 'input', + 'test_image_set.pkl') + } + + grating_data = { + "set_log": grating_set_log, + "draw_log": grating_draw_log, + "phase": grating_phase, + "sf": grating_spatial_frequency + } + + data = { + "items": { + "behavior": { + "stimuli": {}, + "omitted_flash_frame_log": omitted_flash_frame_log + } + } + } + + if has_images: + data["items"]["behavior"]["stimuli"]["images"] = image_data + + if has_grating: + data["items"]["behavior"]["stimuli"]["grating"] = grating_data + + return data diff --git a/test/brain_observatory/behavior/data_files/__pycache__/test_stimulus_file.cpython-37.pyc b/test/brain_observatory/behavior/data_files/__pycache__/test_stimulus_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b782ed338f5f9e8d6134abd270df28a9cb23d713 GIT binary patch literal 2508 zcmb7FNpIUm6y^*U(Xu2v-r^)~n-tv?q;i|wf}m&`I6wf$aAF&62>}Gf8A+75bvSY& zgF3Xy)$Je1K}JvgOT6}^Q|~?Xy^$=(Ne?XnJ`87hGxIHv-&Lz+4W9V-pS`~pHSJIQ zIDZzP@h!aB7SS}OF%oJKaR|XS4QZr1x@zm8;TX_ogl1$p)~v7Ol%UTH?P$SSP<>Wd zjuxFo)h>mVsOnUS#!I~#CtT-CZF)^(_8Y<$SoyW_ia5(KcBQw%%50HUSe4b@(11XD zi7m4$Y=y0MjDQ5BLs_{)*xISi*4f5u4OXtsR$jfda<fg}U(K$y>024Dvl}YI+I;UV z_5tj=#Xh{W(?{&4nzzpM1Fe2*f|%7wVIB_BkVC`R_hfeu8cV+5p5(4KkV%$uAG%id zlT3C5&z=pq7(NYN1~K$j4rCAw!a?>pP#Lxk4xc<d+C4gOA3xdMai1OSJpa)>+<Cgc z`|xlF=39cxfrx#ITf<X=7a4m5Z{|Q?gi)q5<BdL|xz^Lhgqb-#qa%IxWw8=`89B*~ z8`{Xs%`s*68ToBxWJ!H&<a%zMQKEehd_U8kYd>hYnd@x|_g&bVfF!gD?mf{V)b)aR z1!)z;FYL4*y3CVaVYlHbu@~`^4aqa<X0sc**x!I@1%1(~n}wNr!ix&M!)0M4DUS;) z4g7w{3xf@!v|cJog8wvt6pk&U)J*|fXPxo3HwdR$-T9tX++_agT$z8KpQX5%fq4qj z{zDTt;0}NP`sjZ1DB~h)dR>n-THXsU9yTAwo}a|byVvCLan{7+Wj@3t?GCf%ZqRCG zf#hGNp5OO69M*<#=Zy8Y@ygpR;RUgqv>@%VClfK;Zt<>n93)~JAyP<WYU;b_42$(k zc)`?{KsaB5qh>V-8m*8TsZpC$$OaW3K##z|$!!cMhdLD%?5#p@*0V6^bY(bnqeO7m zPa;t2OM#LRSOWyuUz->Z>cp{wm<59S(np^0vEW6fmAv+$k!wvlA|uL()N=9)j5yLI z8Pi-pBOofHr{}a!vpdrGh2&&xo@qpzkAv7|<GVP{G!PZtD>lx-xeP|#D)dYWfoCWd z+9HYEUY5k54pdp~VFu{RAc=Q`NJL=`;xLH&b!!UAHCQAzAvjAxoDQT~>axI>Qzf9~ z6b;VWWxRdQ?{cQ3F%4U|{nq<RcIPL;8B=adTd$BZsp&RE@dfms+`gQCM(3TI7kB1a z2DfknHbL4ZHiWso@dL?G_~+12_=A}xpo&&M1uILM(^p{Up6(jb99ub<8!V1!mvSB0 zxG!yBgN_#z8y7RI+?vg3;tW~tE#`#jr({&ZY`scef<25=C<lrwbMFvJ5U3=RUhHGR zTm6@7V3h*i0P1>G;NgXd;bRDn-R9EoCNXy^(?aGRdm+?A<k*>V90pM)KEV~AV)zUL z%DS-HiHJPuT=f+5u8*E$ZUQH9Uj(vSx2M$K!4(($SE9u4yQ~G;k7MyU3_455304Nk zfovBhlo>Jn&!poK8;~g5fS{Q+tpM#{O9M?=qXw~c@fD1SWe6v0bL}X>xnE-qJXux8 z!h@)?br(D5wnM<?wBLn~bK9Zm7y*LxTpyD&4K2qg2tZj8sBTDoW-J~5L#h^I!4tP2 zOWl~7sU#ES2gQkkxo*B=n<-Fs(waKwU1+Y)?=&}(J4^ZmHp)=92uzvSMBKxzHwsG* z(;)5${CyN9JX9F81XdTZ4#BAo;y_~F2128h<5=ksdz|(2`q~I$$wlmi4KEFpu$;zx z?7gzvIG1PRqU=t!_Tc|5YFu)$(xX$Fc^L{4XkFn~7?CIX&Z7FWaqz$iS5;uD2E^el zAo1@bRCTc*L<t*&{2MI085VMs6Nrg|w4hZn4YFB5ajlV+C7UdhO|r6S6AR}21ACLI AGXMYp literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_files/__pycache__/test_sync_file.cpython-37.pyc b/test/brain_observatory/behavior/data_files/__pycache__/test_sync_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cd97d3fb9f885ea472c98201758750217aa8358 GIT binary patch literal 3031 zcmb_eNpBoQ6t1dXXY(G%aR>pijsz32NeB=k1V=(jtZWEqSv2jg8c&aV8LDd%kJWR4 zgbPxXKaj&%ocK$9<>bG>iT7&8J+|QxBzn|uYI#-l>V02*)nB$+bplWN`_DmRfsjA3 za`L!P_yXR1lM=!Sr!h&WM=6$B%o4*hblHea&xAHJwi4U3XKjw>LYooSyc+ylaXo2x z4c%wQ&7|eEblHg)l0|Qk5>e|f2`UV+++~*tcb`*U<Mk)zW9qH&25&wg-YWR4^)K)` zZ}A1b$d~x?o*B_S%Iom1JT>?#UwcAe#QMzh!dXwg-eu=nE_T@-tHy8eOM3jpYNbtn zIih@%zXa>d{jTtrwciFe?vwV_W6W5amezyeAQn(C?*yv14TZ%}ia-fJ7^*BEh!C1q z?qs>zlOn%66moPsI*3web?=YT@Mfe(Z`}WW`-Xq>>swp?-EX$;eeXZmx_#%?^#@zv zXG@`mG7T9n36BGB4c;5@=0AerlrwH{lUsY%m=&Z?CY0L+J7QyFR&%%uHM5|Fd6|qY z#U@5!@!Ao4wl=m4yKnM(VerONM#;B;^<8q0d`AkaFuDwO+uS||I*?<G;MhQ8qOrh~ zwH$Wg^FRfq+l9@fK_U*9mB^K^d$6t3`>3RkN)x@>R4&7~wpCh#Kn6)^><Lwxy^jW? z(!^|d3$p~GcP>=hDIF<(8p4d8tCE2~fJA%CTy%qBJX-`^C2*N|t!hyWWELHcC~5Z( zA}@i@U%%b>Wapb)$b2X01-!ExJPOj$&h<11vy=xP?1=PXzLO0^nulPsL2s1r+=_O0 z@<@qy2SK<W><Jhf!)9~7e+~C~ZC3_S>Swz!?ZZH2a&&E1^n!;`Ca+;|KBghpuBXxh zTVAf>1(yTBSu8<_Iqrq91qwgrg56;9GPHyU13m~s#esLAq5$&(m;i{bk7)snfD;A3 zU*UhuPGO388rvn6Qy7?BgVFK=n6@D=VtE4%Vx+S*HJeZ^SCTB;_W`cy7I0rzpgp(2 z5D0RUN~~)jBx;OoplPCMfoW6EjZz*-5vq#Ks5sS54xm!d9X8g?osc8)><3`234Eps z_ze2Nlu@w9G@`&_b7B?N5gpsgo;bi_w=j-aepA(cp#_`Nj|e4|kE4B@nNJ^m=2_uH zXXWtb38<Za;MqCBvopuDQ-Rkxla(3m5c77UbbwY$9H`O(HU~;cou$&qp@gX`Yh9To zem~FBlBI*vg&@K>112E|<-+wGiYm&|Eh#fu+QT%C(*3quHj*se7b9SI*wgfw;)mQR zY2qzL>0qezygrXYC0~XPZ>fse4}-8L_<58!&YoSr3hp%+p09%;rpxNoq>R~Slh)~q z;ewTI=sA3IKK+c(@4TW<kS`7fLPm*5l^^kAB*igeA0n0ULBdo-cn%d!1Y>L}q5yu* zp0cr3kO>1)cqm#EgB!|3QYa9r$F#8ew(lr+QUl>a@pDvt(kPsMv(R3JF==T^%spJ~ z;huQR385DHiv{E6Q#yv(`gVV*s6h-C3Zy2Bz5M_sJW6vFq@nn~m;-aJ{!6;>767^c zi0x&G+AC3e<yADVpwZ{<RVaCGR{$NdRCvwlz2QF$Vz_pYY2K7+ag^i|(Uh;F(MSDF zEaA;k+TBbhf$}Z}ns>kw5IXK>uuK0@q<ZbTd<&gXkL0^(v}$PeZEA(!yFO4pm2YFG zCf#DLq6Ck_jB}+0dM-yVL_Li5Q<y2onMloL%~RxS(go9{P0&Y^x`uoYS6l>hxO$Go z@4+2(xT?dOGxU9Etc2*ywR#WcI449OpA{mMA>bs)P+?8XBZ7<sJ_7Sloc3A%m9qaK zG3NIFNEChD;?<^e+;+~>L2HYnGOYj-$sykW1CDe2D(Fsu<z~B6)i@8&`njCWrVe1z z9B(aRRk{EWxm13L%UvpMH5x?ep2W|G(!q%1XjkI7*O!mi8m5uLxjTrD=C^01!(=eh zEcNWc2z$K?l{!Zts4@-WPB4h{QSdrd-wP@C^f-L{-v-U)UY``tnJFB6*r2@X1Azyz zG?PH?dky`4BjDH`3N4OPdSX&eWfs3kq`qF=&ytJ}WAQm&@;P4WO<*>%+hxFd_-|S! Y-DtYDOPA=%x=UB+8eMtKr8ao|4Iy|PdH?_b literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_files/test_stimulus_file.py b/test/brain_observatory/behavior/data_files/test_stimulus_file.py new file mode 100644 index 0000000000..7fded55c65 --- /dev/null +++ b/test/brain_observatory/behavior/data_files/test_stimulus_file.py @@ -0,0 +1,82 @@ +from typing import Tuple +from pathlib import Path +import pickle +from unittest.mock import create_autospec + +import pytest + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_files.stimulus_file import ( + STIMULUS_FILE_QUERY_TEMPLATE +) + + +@pytest.fixture +def stimulus_file_fixture(request, tmp_path) -> Tuple[Path, dict]: + default_stim_pkl_data = {"a": 1, "b": 2, "c": 3} + stim_pkl_data = request.param.get("pkl_data", default_stim_pkl_data) + stim_pkl_filename = request.param.get("filename", "test_stimulus_file.pkl") + + stim_pkl_path = tmp_path / stim_pkl_filename + with stim_pkl_path.open('wb') as f: + pickle.dump(stim_pkl_data, f) + + return (stim_pkl_path, stim_pkl_data) + + +@pytest.mark.parametrize("stimulus_file_fixture", [ + ({"pkl_data": {"a": 42, "b": 7}}), + ({"pkl_data": {"slightly_more_complex": [1, 2, 3, 4]}}) +], indirect=["stimulus_file_fixture"]) +def test_stimulus_file_from_json(stimulus_file_fixture): + stim_pkl_path, stim_pkl_data = stimulus_file_fixture + + # Basic test case + input_json_dict = {"behavior_stimulus_file": str(stim_pkl_path)} + stimulus_file = StimulusFile.from_json(input_json_dict) + assert stimulus_file.data == stim_pkl_data + + # Now test caching by deleting the stimulus_file + stim_pkl_path.unlink() + stimulus_file_cached = StimulusFile.from_json(input_json_dict) + assert stimulus_file_cached.data == stim_pkl_data + + +@pytest.mark.parametrize("stimulus_file_fixture, behavior_session_id", [ + ({"pkl_data": {"a": 42, "b": 7}}, 12), + ({"pkl_data": {"slightly_more_complex": [1, 2, 3, 4]}}, 8) +], indirect=["stimulus_file_fixture"]) +def test_stimulus_file_from_lims(stimulus_file_fixture, behavior_session_id): + stim_pkl_path, stim_pkl_data = stimulus_file_fixture + + mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) + + # Basic test case + mock_db_conn.fetchone.return_value = str(stim_pkl_path) + stimulus_file = StimulusFile.from_lims(mock_db_conn, behavior_session_id) + assert stimulus_file.data == stim_pkl_data + + # Now test caching by deleting stimulus_file and also asserting db + # `fetchone` called only once + stim_pkl_path.unlink() + stimfile_cached = StimulusFile.from_lims(mock_db_conn, behavior_session_id) + assert stimfile_cached.data == stim_pkl_data + + query = STIMULUS_FILE_QUERY_TEMPLATE.format( + behavior_session_id=behavior_session_id + ) + + mock_db_conn.fetchone.assert_called_once_with(query, strict=True) + + +@pytest.mark.parametrize("stimulus_file_fixture", [ + ({"filename": "test_stim_file_1.pkl"}), + ({"filename": "mock_stim_pkl_2.pkl"}) +], indirect=["stimulus_file_fixture"]) +def test_stimulus_file_to_json(stimulus_file_fixture): + stim_pkl_path, stim_pkl_data = stimulus_file_fixture + + stimulus_file = StimulusFile(filepath=stim_pkl_path) + obt_json = stimulus_file.to_json() + assert obt_json == {"behavior_stimulus_file": str(stim_pkl_path)} diff --git a/test/brain_observatory/behavior/data_files/test_sync_file.py b/test/brain_observatory/behavior/data_files/test_sync_file.py new file mode 100644 index 0000000000..81b5631dfc --- /dev/null +++ b/test/brain_observatory/behavior/data_files/test_sync_file.py @@ -0,0 +1,112 @@ +from typing import Tuple +from pathlib import Path +import h5py +from unittest.mock import create_autospec +import numpy as np + +import pytest + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_files.sync_file import ( + SYNC_FILE_QUERY_TEMPLATE +) + + +@pytest.fixture +def sync_file_fixture(request, tmp_path) -> Tuple[Path, dict]: + default_sync_data = [1, 2, 3, 4, 5] + sync_data = request.param.get("sync_data", default_sync_data) + sync_filename = request.param.get("filename", "test_sync_file.h5") + + sync_path = tmp_path / sync_filename + with h5py.File(sync_path, "w") as f: + f.create_dataset("data", data=sync_data) + + return (sync_path, sync_data) + + +def mock_get_sync_data(sync_path): + with h5py.File(sync_path, "r") as f: + data = f["data"][:] + return data + + +@pytest.mark.parametrize("sync_file_fixture", [ + ({"sync_data": [2, 3, 4, 5]}), +], indirect=["sync_file_fixture"]) +def test_sync_file_from_json(monkeypatch, sync_file_fixture): + sync_path, sync_data = sync_file_fixture + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_files" + ".sync_file.get_sync_data", + mock_get_sync_data + ) + + # Basic test case + input_json_dict = {"sync_file": str(sync_path)} + sync_file = SyncFile.from_json(input_json_dict) + assert np.allclose(sync_file.data, sync_data) + + # Now test caching by deleting the sync_file + sync_path.unlink() + sync_file_cached = SyncFile.from_json(input_json_dict) + assert np.allclose(sync_file_cached.data, sync_data) + + +@pytest.mark.parametrize("sync_file_fixture, ophys_experiment_id", [ + ({"sync_data": [2, 3, 4, 5]}, 12), + ({"sync_data": [2, 3, 4, 5]}, 8) +], indirect=["sync_file_fixture"]) +def test_sync_file_from_lims( + monkeypatch, + sync_file_fixture, + ophys_experiment_id +): + sync_path, sync_data = sync_file_fixture + + mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_files" + ".sync_file.get_sync_data", + mock_get_sync_data + ) + + # Basic test case + mock_db_conn.fetchone.return_value = str(sync_path) + sync_file = SyncFile.from_lims(mock_db_conn, ophys_experiment_id) + np.allclose(sync_file.data, sync_data) + + # Now test caching by deleting sync_file and also asserting db + # `fetchone` called only once + sync_path.unlink() + stimfile_cached = SyncFile.from_lims(mock_db_conn, ophys_experiment_id) + np.allclose(stimfile_cached.data, sync_data) + + query = SYNC_FILE_QUERY_TEMPLATE.format( + ophys_experiment_id=ophys_experiment_id + ) + + mock_db_conn.fetchone.assert_called_once_with(query, strict=True) + + +@pytest.mark.parametrize("sync_file_fixture", [ + ({"filename": "test_sync_file_1.h5"}), + ({"filename": "mock_sync_file_2.h5"}) +], indirect=["sync_file_fixture"]) +def test_sync_file_to_json(monkeypatch, sync_file_fixture): + sync_path, sync_data = sync_file_fixture + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_files" + ".sync_file.get_sync_data", + mock_get_sync_data + ) + sync_file = SyncFile(filepath=sync_path) + obt_json = sync_file.to_json() + assert obt_json == {"sync_file": str(sync_path)} diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d94248f416fb072183c9a9dd0a8873b5d7264727 GIT binary patch literal 916 zcmaJ=&2G~`5Z>`m>_Q6#MO+F(a3TkiL&XJE6%>R(LP3B~(aMsw@va*uj&1F38&cT^ z)CxGkD<tB?Yw#Gpa^e*@F`EWzabT?dW<5LeeY5NJ-p0lSf|h-K&%RrP{4g(n%*M$B z9O^a#Cmd2j&pc2NFtWJC?Nf3B)aLM-bex}<NBR*MhlYH_aG0Ss5k8U_IB@IKub?y) zc0V#n#@1G23%$|^pHOg%RCa04$$|hWZEoSaqhW4oyL3)~+Y9T<X62Ud+$qTdfb3&? zFUc$NmNc>)%(`B+%GTUnkjg7z)GECgO6xOJ{&_{|V?%DA-sDWPFdvLWq{D1F2xWel zaV?V~)Iw=>e5;vozKE%Dl8P?+8m2YKj#s;rF;8Ue7Bh^}wf_Fz)5lNlJ$q5xN@I8` z6D?{-3dX4)%Y0(=I&0KhanZ|7sVG(S+CPDCJZ17g)t;UdAxcpnOT&WcA@!H+VUknN z2$)IxZ?}cuM$0rz+fB|SQ<`Ow=s@ioPDAyL{QB_de(**KsRA}+ygOi1md%2P8H@6a zv+Y1+M=Hn*k*NqVFNQM}JWmFJ!VTUnSTtq_0&CM0Gx)e?4zf3pEXnYok@kq`T+Vs} zF=R(cE_;oRR1YO$Q_wADHN>8|A8iBzzIm*x(8l3g4z%s#JB`Z5hl`VU`cR7QPMSw7 zRlD6-UPOkDCC%-Z8wQpEI18*}puX{6E*DdjgFvkHEAkThjw4Nwwu+f)mwGGJ<>HdQ W0ZRpcXOi>7RP35RW=Vz{vVQ|Ri~<n= literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/lims_util.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/lims_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab6603aebebac716573f8027ed8c7c2653b04605 GIT binary patch literal 1064 zcmZuwO>Yx15VgIVG=#KBh$6W88U!0uBo3&m=oe6_tq?7jRgmSion)Kc_11P;rAj4G zD{<n$Z{WmV+AAmiLQjm7hW5~rJenPk=RME!ZY(Y~5m@o-8~;iW`r|+57C`V8mVE|J zB8fAU;}~NflZ@m+9ANYw$v}peNQM_A4rT2Cwd;SO9<_1xcz0*-fNgEC%}?7~+xv$* z>$_}k{Uhuw%Y+GC6iT>M7fcw%oi@Usn;Wp1p+A8@p%_aP6N%$M5*b_~zzPAYRyB6h z+#V|H&ddjumC8_&acgN$8|omP7Jce@MD!hG6c>YO`Z*N?C5D!s4wM@x)1+Vt&l9a_ zYN=7jqtqx#c_C@qqgGR^oTa0Za(csDc$VJ$tU_3uu<UDa4o$EG&KJQsnGmxwV?7~T z=mMV;8BWNsZdM$2MAm-b31Wdnes=qDvmATgIX6Rrp_4Zc;~@@U*@xizXo9{p&+!Bw zp`YX!M)BKEJS=#w+N2`U%L?bF29;BH^?mbA_p?>TcKLwIDB-8P7<bnT4tJ6KRaX@! zwyR53SOH#_gR$-Irb*YPPQ56(81lY?vsnfea@g?%JBi_G!E^#`PrQ8NPND|<B-N%P zx#O^N1p3-e1_H5>OS7mPUo}^=)H<Q_a_zpqjK5hOowesGMlj}4$#M`y%V;&zf@gLO zg88ZV!L>G)&E#t1_)!m-CBV|ZB&iCQ!l8CpE%cS+&KcupXFOC~mx-6J9aN!JS+A<k zkm8!3x4oH|xd+u%>o%JPWNZr@!Yv%)rJ#WcK3l$%`M!UdjCna2tD21ET8=Uww-`Gf z@$7nMfibBCV`d53-a?-$=P4Nfs{EJrL4$;Nnt}fD)43dx&_+dk<Ocqy>ZSeJRhR$o gr-f6d;911WbT$j$>@K*fu{vYA=AYgavxQs1KRKQsuK)l5 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/nwb_input_json.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/nwb_input_json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3d253c61c3c186a343efe2443835e709f148cac GIT binary patch literal 1129 zcmZuwOK%e~5Vm)nWRoVeAX)*va6-y~<WO-z6#{ywKq%rN1X@M1ylaPSy74ZylaeSo zp!A5uol`4L{3TyG@fSET-aII%Ud`B_XZ+31c>J`{s392g`)79SBlOdO^#F_>gXnvp zIN~@(p_{!F553UC=ooRIlQYE0!V7(l-=Jpc7x<!16I=3<nSSihdTjXa!j3>8<|y<y z=H3|!eL<F73mles37E>Z-Z_n)$$Vs<>rBRYMN@*g3UUOZzkxEy-~}Fd=l%tn;~D07 zAI&{OW*+zU(E@+nnfs=6UY_|Ecuw9y2CvX-^d8M1;%zi1rUIVCdBRTV5EZz*!j%;c zR=D~fuC4Ia%3ePN-Wj3+N039K6IPAThH_@ubh}t4E~C}}QVQ!@Xq{woX|Cvrj9dK& zVbv{YFG<DpP9*wloMeh>lMF}cNEiF9{3H$cuC`4ZTnv*>OFv)>c&}H0u=dw5t%|Xb zM!RrZ%VpuytSS#mY6Dt8N^Lo33OsE^37w^5VM&$?X^Bg~k~Cx7`r0U4qdbWXRU%i- zk|kQCJ?ryCg^f)Cz(ZNwv(=5~52SV=-0v?(54&%*P`b<djJG0o%H*W`M6x)OoE>z9 z9P6%&t7Fhv-k<31izMpm#EAPji%-}G0cX<`Jori5MQlfkC6Z<l(2kkO)TF(xSKHkN zSOy|Cx-Cy5THFbBDYf#6OFof_p|tE;>=r15ui*gXCg>eZa2+&!-gNhJi?-J1HofY4 z)=AN;j%|hpt}ie=5VZvuraDYT6_)C{gWI5XLA1LJ<W2Yf39~6*2ObIhtYkw0H&vr_ znDJ5S)^$ohj##?1s2f0HgIq!Fl$jLlmm<0wP(@hxK;84w1XO^7ZRK{FL<KO}N)8V? YO`@Vh3d>a_HaJ}V#Uq#aimC4Z0j_u{P5=M^ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_cell_specimens.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_cell_specimens.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..610e5b562f0fe8c05e7cf4889021a911280a6ac2 GIT binary patch literal 8247 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 G!T$idKw(_~ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_licks.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_licks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42d51f41748073442c1db22df3ea7bb3aa8f5856 GIT binary patch literal 6296 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 I_9t5D|67|O9smFU literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_motion_correction.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_motion_correction.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44e2c2455d0cdf681b21c2844887028f8124f49a GIT binary patch literal 4386 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_ophys_timestamps.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_ophys_timestamps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e17e35f5cda08019b37792be3c5c24e4221d9970 GIT binary patch literal 3945 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 U&OX8@)#a~j0E7m(h*`G&1wZcvcK`qY literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_projections.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_projections.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f6e5e12104020aec0e58e42581b0778b584120a GIT binary patch literal 3767 zcmai1U2_|^6$P-%<?=(6D%o*ePd@6nP1!bdqNJHlqH+D*amUd(u{+7^sI#*qR?<?- zT^fL7i=`eK`PJ=o`qn3T`jkJ=AG5E0%3sJ+&&84ysVK>6a0y_s0Pe*(2UoY3mg)>o z_Mg8+|6OA2f7F;h4k|ZM^j9#FNuIKRenrX$Jm8$_PAUdY;Mh7(-N3cuDnSLmZt4xH zLDjyir2e25)NI{L>w`wn;Ovh~R;B-fN&i>`O|)vVj#eG5CA1o{iB=P>mgJ9Fd+8hO zgKf5X;mgRxCK<%2yN@EXi{Hj0mG|SGN%Bmi`P#z=pFR%n-VX14e(&zR%_k3TJq$m+ z^$2e+%5K=pv#cB&_Ea31T=i(~=`-{EJ@mvZ;F1L*b|jbL1v}>O(vj{97F1%dU+w#{ zB0bw*lU3}~FZ?I5HV>15?(xZ#G^2}h2Sq=Ek$lWTX1Ec@yziX2uh<bEWBx1bNSI3B zGu5$>&K0aCU0Hc4FxsE>dkg(F$*^j5Gx^tF?|f3!4Au@2plGx@h@OYTSy(#5Y-a~c z<N4+fZBh8!Ng59ky`nx$p2umZlTkccjShCseAKQNYx!{ZP>1pJVXP4M%!G+l<W%8@ zA<Ywpg*S{8-V{|8>pVS(6**kA!fllg>=?V2qm3$>G*QpQGQ<|=T3Ea76izSIg(DMH zEX|w=(fpdJ*D&R`f4}qb)}M8(^j5SR$xb(V7G;N9x3UPwDx(j!;_N_g<-<7BJy^T* zt%pf>OD86NcNq2dqMaDurYT0qz3a5b^{$GNEX=!@_JHtkc)c6%Mh8i*u2U@WhQOum z;JNVV&hW5k=-BKJ!(JL`y^Ia&RTw5b(c->vd7am-9bK5hqBHkFPtagI3lRAT9fkoA zfZnllB*sFmO90{p8;iRD#gUNiSnPRfogf5&5S$zf1aC8_4-d(yL8SI(2&83biN`2* zgF9@@{!%B@_1QngQ}=NhU7}PLfm)&vo%aepurV*qC4BpBeIre@>E(mrji1w8G_l7< z?K92|VzZme&PJN|qEz2NW%^aItm3Ep2~ZMtqd_;%+dR0ijpOLzXo!yzC`#~A+bya) zv5AaP%EKzE0#kUhOY{X!Tpg#|g;%Z=RLEU@X17JN40So?4cc!LhVdqMdCT#+;G>J@ z?tCF|GwPP-(nqxWpkyDC@KV?ix@cAQguZILuPCHdw0*SKscp|iY_^4JVC|rqLK;HZ zZPzSCf|_Lrb=vppO$;hpi{w>5v7NUx07@EnPpMoLtwpjb0v=X*i^euing5-rv<Mz0 zF=^RfVZ8QX7=YRmD|~cm7L&!1o6rI<o&W;I*TZm-%YDoKW*9!*kJ8DTh9yH8b@fwB ztgga9A}lZqm(EJPPW|tYAzIHF!kMbVv`{o1z0aG=e%<!<(40Ml=$k0|EtnrtYFU9s zdZjY|N$1(@cnMQAlshQ;-!KNM3{4g%&P0>B)nw3()cKhIW97&(l@o95yy8dh7q|sK zW1q7x*%-INWp;#dsJWNf73y&}Kv?`%Chf`wGq^EK4YQRhjvLUbdwtelv+6$WZ;S!0 zuxTMw-&Ax;qh)(2NjBU!oj#lifO4&Y3ak6U+9GtU_6F}nP-F;Sm}CaJmzcvj84HsE zy&@t1ky}GitP~{;=iU@c_EJ#9F@=1BDLTQzB{42s+G^pZc_c0F6=|hfAw%G{;4Nx0 z>6uW)L)EURHR`@V<|0hNx79i|PSIk4Lhzz~ivdQW%Uk>ctN@m&oJw$Alp;(BSP<dq zJv~)Piw2t1u#)T`I=4i3Kx`Mpe#2BO(LJ=QXm_YRB|5hoZTsaFSn`{^FZcg8IbmJC zMzvp%S%sM}SN)PY7M(2S7)uj9zz|CeHpf@%)hS<T+-BQT#BS9l^J_A{A!8}|JF1<o zV{0~|9lUrSMU(D<dY2US^iXCG(dH(K{ut(mh({^XiA|AYbw|7s(wDVKvQ!5p8%33* zX7h{NGe$0)!BtFe*s;xyPWUUvnGt;l0_)O=fEma%F%86Z5_8Y)wRDiSuRbJ0M``1V z7!#@jVfu5f&v5h^-c6Ly1A<&WTAOTd0WP#fdgzxTVd3&KR0uAVCK@Xr(s>EEgh-09 zMRzmsqX|y~_x<$`K5RR|+Kjld?x|!*(q7aPdjoDKu?kkF1GI^h32o9_DJsLm>{&Oc zB5e1;Sw;IOoGgD<RMAf~o??lv=(CPeOus}a9fgwue<d+6;l$BWyNjC2_cLj*wI}y` z4nCrX;!4H3eIFHYV2&poiHo`h-NPkm94T-`I@yXHL)WCRTyn<5BnIZ(o-xOvQzSrP z_w*Ai&*fgouQbq1<On>Ihj7#mD(_I=-l5cYjlOs79jHE`!LQFxGIIxF_uTBOIB@c= zITN8`&9Vsp8OZRNLe@x&g_ui|oH1twk|Gedx>ymTD^q}+^9`=c@24LfgZeF*cVU7C z(q~+&2=ypd8`OOsH9x`&`v1X_AJnY+RYiU6Wkvt2lt`#jrky6;QjC93{j^T7G0k~9 z-${2n({#5p7cFGBv;Q7+8RyHhDSEkzJJG(`rT?b3lO3C#1s7-U>7G$ply;(FQl@Wo mqnGTY9iQi3;ct`)#SIc<P0|k^c~khvq?-aYr}cL0&Hn><I*oV$ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_rewards.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_rewards.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05bd0fbb02fccff6bb319959792ac76fb8a4fcf8 GIT binary patch literal 4058 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_stimuli.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_stimuli.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8427281f611f75f71a468c228603a73936c3d1c GIT binary patch literal 4180 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 bhQLOPwVk$&*IjwN(+`;U(qHqXzQ_Ixa$jJ) literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_task_parameters.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_task_parameters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fb89317b5b3110176b933a651c3a599ba02aebe GIT binary patch literal 2604 zcma)8TW=gS6drpnJ9|ykgce8(6(Gclb^|R>fFNx}d8t;=78Q*mjb_(QGn?6&t?f;k zXoCdlYeC`{B;tub!jG6&9uR+lC%)soG;LGCtbE4y93T5!zR!EJ*{nHu^51?;{s<lC zPa4c051kD({R4z>1k0R=-aKPN7BNPBH{(M$a&4bwUgTT7APVfe5>@c_vT#_9s#eF( zYQuU|xBVb%44YAtIbS=XBElz*2xargjanF2MGfQH5s#JxyXUm)f8z{Jx6R5>Bu1Ka zDAD)6Nz69hjeD3FXJdUk&1k-LKhZniBq|w7BbBCAchaH0FSY5Do%!RUvw@~RfRIka zgcEV;3MTjy=ZHm~^asJ9B3$9waVUJ8B`8<P(rr}?Pw(4jFhY-yRz<sorn?Y=O`O;< z%<v;NaF4wc=a5aX$C`7<jX&YSUBhm_EFZciIIc|G6L#o5Ky<%#?mFK)Cfsr+-p^#C zDje+Zb<;Qgy75_AH8@3#a3lw-1`fxgg~y$NF7kG*T<OW}WH&8Ttfkgzk;kb}<aHUw z@fLy=$7O(JGB;&KNnK>Svh<3P%uA0<lwMXOLXk&hC?Ahx-$>E+OShlt(iN#Hn~Oul zG-O*PH>2MjbskIp`SsSPo8M_<U^CfHM5mYRCHem5jXdcWxk#>W%6wOE(r&sBS&X*# z_2!+lx2aPjua1)bPV!J<ZI(ep?5xvP>phjEd0g~hb~iDF+FzghxK5$KmjO<xt#bTg zSVsG0T}v|_#r-VNdKrh*4G4z^yv0JaRd#Ustn7A9En8%oB1tH*nf?eJ;|!3e0Y^g> zJ>`eYcmtnu{gfT@3C#yPTwgJjpHOSarQ2<DMa5Eb(L<d!^{kR@cG{sL^HFsRwH9Y6 zVXF&t^$@|_<|R63KR&lkkz-}+hDMMKvi_A)g=)K{r)9RK-o!`s8VO3$R9v717i=zH zHn)b48ti~Dd91}6?BL3oA$rB~Zo5k5mII9_w^|$z3o*8(*NEds<0PAXsoR_YvfG7F zuhW5o(LUKMy<wtuq9r9CjZ;)<+)IYNqEMHhbIJ$n4LPDJ5KCy9q8GA8-OlteSUdrG z8)%xu9Qsq>N3KNDjst?d@E`IMJ{t$~@szHP7$~A5sz_t4tWZR{4{r83?9uZa3-mBS zwLu#ge(aurIiI>fv}b%1fE6moAy@$wBD^(+kZx+Im8$R;%uqjWyu=L61v9j4H3i)$ zOlC-rypOM4|D^3kD|6@zsrxD&Q9+coQ~>koRw`9=ZmytBqD)NOswms9V3noPAMNLR zy{H0riEtIUT)KI&S5`1jv|>3%(bb~rBnV?_g+!A?iv%TT$}CGSz_jhFi}+XuvsySu znyVzvs@ldBnN!{OpruLQVIJf7wcHk~@nyobWo?{!2Ic93@?xsv1$e|*B@`dfWgi8b z-@jc}RWZ(mLE!pSP4rM|sc&I_7oCZ#T65^fNb7(PJV+lDfNOHX)HMrzq#8uP552r) zaIMTW4!sF!a}Yz<gwKe9DY}-x5A?!4_>A4aUK*g{`3PZ8a@8h<^Jlve1*V9R7Heh7 z7@>tY%@ML^(N<T<$feV}EIbDpJvL({)fLili=H_JJ4+oa7W+yjBHmMAZ`$!1l&87y zJ<0*dgCi?7-r@&qGq`llSl0#Zy@j>vZ4#GBd`RLQ67NDp_1R6Q(gUf8cTXMX84FM? zkh&(Uhb(L@GevXl<!J%hvaO8p7a~i0wqhec9}h?Sssk<cJ_*`0>dbGT&P$h1XMXu~ zY~ZN&^^~(W{`aEUjn#Pp1=C!8xiCYK`p*N*ZP8s3k4>5>a^BLP_5G|smEq@8M*f2S V!Ds>+I1@j_40j@Wyx}dc{tIMYwBrB( literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_trial_table.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_trial_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..777002533a472719ca87ac98e32c5b0a54a87d63 GIT binary patch literal 6745 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/base/__pycache__/test_data_object.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/base/__pycache__/test_data_object.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..496e0692cfbc8819650093410e213493a26bae2a GIT binary patch literal 5322 zcmcIo&2Q936!(nnjT3f5N}_(ymL@<cOUniVtyBt#Bt=zGwWy_4t5qb+>v5V*y!Lj+ zNt;zTlth9aq8{2K2T)J_mwe@f`X6xWd(Ug{I_#2U0k1qWUVCQV$M5~-%`B8kV;Wq+ zKfgQwS(^3)AJR*Q#tpdD87PD%n6K5a=00ok8fV&9n$U%@qX}c1*L1<|Xl3&$e5+N< zEFSyPiJaT@RnLuF{4c#YG;YAHu0r8yH72wg7fkRS4aT7HYKAaH0iI1UA}pv2VpNPl zJtB^XBGi^B!Cd3<`1hWQdgfs;Bwi@F0rw)@ssaT_N;3!^Y1{f;w#Bx!yL^j3Vvk9O z23zCmT*U8zG^j;2Co&F)mwFG1ROI{GGNVDQntmT<s~ONyZ_njLsze~69fh`NxRI?I z&6e*~uKJ<t`09G)4n4c6*jS_3lQ`ED6d<g&O0x)k7Yt6q8P&Lu4D=K`lzD6fPScCc z4aZ;i;L%j;El<XlZ8w5OWZU2jLwWu()T6fT`i@ez{jc`yuf;1%KPXSCC1=GEmAdn* z6KpQc2aX#C!nw5M1siH9Y<Yolp$uCqn`-HsMtw;&BJX_5ao3!mJ?QKE@P$~LMNMbx z(rE;CSchRZoG6r=vvqI9*=U4vRsbI04FW>V)*a<h54-2@N^4V&f=YNR#EHh*UmV_^ zl}vFHjey3n?Rd<#o1s|uv0b$7U)CKzc|%jirH*A>&-ZOx7GZKK%1j=?b_t5OkT?ti zC6Ui!@)*8Er%4lvvMy2Xc%<X;czj-gDWXOg+>|nu@E+rhdc{n2r%A@2?1PpO_+AyD z(Ab1tVC|Fp8zci10vE-?T2-OQ$H5=)Ofbf%vxJex#sh$zFn3uNAq9*>G5U~GoZQOd zWNi32IsYOx0)Ubyx^c3QX>{NaVfANhrpzT;PNEH=jea9<gHzEBsc*^I=wNy|0gV)W zpB+ld9^lDw9PTI<I35iw-@sOXWU&SOmZk+zy#wtW10lfhQdgiz8R&0dhKGzC$c4UB ztm&R1fI4@yZB{d(4Q``$f%s_z_{nM?%I@=Ep|@a0mx2)*SZ54%93E1J+Ja>P8ET7d zX*MUG(yK9ZavspT9*DVJhj$bVI75F|AO|YaolUUzp`0<FIU|Q1#LpcZ6>+hpts>hq zSgz!|@C+3Rl({I0O0y-y*2TB67ukWgFC7LJ^A+mfUkp@^7EWG$#%`pHGf;{-T!CIf zin+4Y51FxrA_7lsN}NERz#>B{m<0iux`>#N&C?=<R<zhLqiD$K<P&tJL}W-bn0z1q z<pd%cwL_2+drNe0%81kW2lYeicc$#eiU~Jhcqxo$U`1o9SlovflTMina=aM8AbWU` z0WUIG-g|g4<4Vj-EK%rk<pani#K<laRu5xBzJj^RLoP~Uyu+KT8E+mPo;NSQ2znx1 zufqbjmp&IW#Sc!OZd;$38IC|tqi-luSo_*A;%1>+Hv6Hqi_A1$x+^qWJeAH4Jc{kt z#G}LbVF6%$5=A28Km+T8(<w#K3kcOs2^Hr^qcy*_orO1DLLJ6A3z>6rpc=@l2nLX) z52F#)e1ZazIe7cZ5Lj6_Ai1{r%uI@wezG9rU3ew344_!~0gOI?T@j|KzbFksy8Q^H z>EYMcm=g?x<(Etii0TJnIa!SN%?>_A3t{-c8ZaEwyt*WTJo`Bc^b%k`Xr@4`>V9ax z_DX~q0?m7K1<DLAqclBeo`&ZR8$y*O4YcTBtO7KU#ga^9*d&5e-a@NDl1UtodUxZw z)e>h@NS2gPl%`6@5LD#@Q⪻It+oJT!dR8-$r!yfE)O`jM@gZIi$*bO;@KQmYq7p zTwP4|kv$uim|X;GAgpo;(;4^!zMmr;Bn4$=M@h#ZjBF40xaua#ftJ@;5q|9x{Z#6H zp3?*Oj-&_DbVm=i0(sFcoS}4dF+s0H7p~4`x)iDs1xz=^I6v*eYLnh?uD>okds&9f zj))SuE=L9f^p$AOy$UCr=5*LZ>09t!N9hSvy6>hr-z8HVmohwoAjK=th_pv6;*Z&% z$C(zvF_(bd)-D$uj*O-w;~x7F&Sk#UzSDk6&u41-au`16$Fdn0TAS#dS^-W;l&9j! zY8ZWuM?y_6fDJDl5%hSv@3I*u`npblPIJR%%aPt~)Hk8RLE7d!RLi4#Q>!;&3^{|v zhgg)cIETe~EGUoY7PL$u)X}pPHx{!-tSRf1Wm=}hH)TV93{~wydO}or?r^A*9u8G{ bPJvWn0UV;=tg&@9Imfw<jv}QkUex~wH$`gs literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/base/test_data_object.py b/test/brain_observatory/behavior/data_objects/base/test_data_object.py new file mode 100644 index 0000000000..1ebdc79533 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/base/test_data_object.py @@ -0,0 +1,81 @@ +import pytest + +from allensdk.brain_observatory.behavior.data_objects import DataObject + + +class TestDataObject: + def test_to_dict_simple(self): + class Simple(DataObject): + def __init__(self): + super().__init__(name='simple', value=1) + s = Simple() + assert s.to_dict() == {'simple': 1} + + def test_to_dict_nested(self): + class B(DataObject): + def __init__(self): + super().__init__(name='b', value='!') + + class A(DataObject): + def __init__(self, b: B): + super().__init__(name='a', value=self) + self._b = b + + @property + def prop1(self): + return self._b + + @property + def prop2(self): + return '@' + a = A(b=B()) + assert a.to_dict() == {'a': {'b': '!', 'prop2': '@'}} + + def test_to_dict_double_nested(self): + class C(DataObject): + def __init__(self): + super().__init__(name='c', value='!!!') + + class B(DataObject): + def __init__(self, c: C): + super().__init__(name='b', value=self) + self._c = c + + @property + def prop1(self): + return self._c + + @property + def prop2(self): + return '!!' + + class A(DataObject): + def __init__(self, b: B): + super().__init__(name='a', value=self) + self._b = b + + @property + def prop1(self): + return self._b + + @property + def prop2(self): + return '@' + + a = A(b=B(c=C())) + assert a.to_dict() == {'a': {'b': {'c': '!!!', 'prop2': '!!'}, + 'prop2': '@'}} + + def test_not_equals(self): + s1 = DataObject(name='s1', value=1) + s2 = DataObject(name='s1', value='1') + assert s1 != s2 + + def test_exclude_equals(self): + s1 = DataObject(name='s1', value=1, exclude_from_equals={'s1'}) + s2 = DataObject(name='s1', value='1') + assert s1 == s2 + + def test_cannot_compare(self): + with pytest.raises(NotImplementedError): + assert DataObject(name='foo', value=1) == 1 diff --git a/test/brain_observatory/behavior/data_objects/conftest.py b/test/brain_observatory/behavior/data_objects/conftest.py new file mode 100644 index 0000000000..33a068bf77 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/conftest.py @@ -0,0 +1,24 @@ +import pynwb +import pytest + + +@pytest.fixture +def data_object_roundtrip_fixture(tmp_path): + def f(nwbfile, data_object_cls, **data_object_cls_kwargs): + tmp_dir = tmp_path / "data_object_nwb_roundtrip_tests" + tmp_dir.mkdir() + nwb_path = tmp_dir / "data_object_roundtrip_nwbfile.nwb" + + with pynwb.NWBHDF5IO(str(nwb_path), 'w') as write_io: + write_io.write(nwbfile) + + with pynwb.NWBHDF5IO(str(nwb_path), 'r') as read_io: + roundtripped_nwbfile = read_io.read() + + data_object_instance = data_object_cls.from_nwb( + roundtripped_nwbfile, **data_object_cls_kwargs + ) + + return data_object_instance + + return f diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_eye_tracking_table.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_eye_tracking_table.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81052854befa81731e5dba304cdaa295e7cc917d GIT binary patch literal 3294 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 ZC-hLZxYTyrECe3mV{Q68)LQrYzX5r8PE-H@ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_rig_geometry.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_rig_geometry.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1be1fb9b471b7732d6ce4e86eda632bf678076bc GIT binary patch literal 4646 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 V$A&v7q)wgFyW!To#ygFd{tI{Pj8^~v literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py b/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py new file mode 100644 index 0000000000..6c54fba935 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py @@ -0,0 +1,85 @@ +from datetime import datetime +from pathlib import Path + +import numpy as np +import pandas as pd +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_files import \ + SyncFile +from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ + EyeTrackingFile +from allensdk.brain_observatory.behavior.data_objects.eye_tracking \ + .eye_tracking_table import \ + EyeTrackingTable +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest +from allensdk.test.brain_observatory.behavior.test_eye_tracking_processing \ + import \ + create_refined_eye_tracking_df + + +class TestFromDataFile(LimsTest): + @classmethod + def setup_class(cls): + cls.ophys_experiment_id = 994278291 + + dir = Path(__file__).parent.parent.resolve() + test_data_dir = dir / 'test_data' + + df = pd.read_pickle(str(test_data_dir / 'eye_tracking_table.pkl')) + cls.expected = EyeTrackingTable(eye_tracking=df) + + @pytest.mark.requires_bamboo + def test_from_data_file(self): + etf = EyeTrackingFile.from_lims( + ophys_experiment_id=self.ophys_experiment_id, db=self.dbconn) + sync_file = SyncFile.from_lims( + ophys_experiment_id=self.ophys_experiment_id, db=self.dbconn) + ett = EyeTrackingTable.from_data_file(data_file=etf, + sync_file=sync_file) + + # filter to first 100 values for testing + ett = EyeTrackingTable(eye_tracking=ett.value.iloc[:100]) + assert ett == self.expected + + +class TestNWB: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.parent.resolve() + cls.test_data_dir = dir / 'test_data' + + df = create_refined_eye_tracking_df( + np.array([[0.1, 12 * np.pi, 72 * np.pi, 196 * np.pi, False, + 196 * np.pi, 12 * np.pi, 72 * np.pi, + 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., + 13., 14., 15.], + [0.2, 20 * np.pi, 90 * np.pi, 225 * np.pi, False, + 225 * np.pi, 20 * np.pi, 90 * np.pi, + 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., + 14., 15., 16.]]) + ) + cls.eye_tracking_table = EyeTrackingTable(eye_tracking=df) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.eye_tracking_table.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=EyeTrackingTable) + else: + obt = EyeTrackingTable.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.eye_tracking_table diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py b/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py new file mode 100644 index 0000000000..f04db161a5 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py @@ -0,0 +1,127 @@ +import json +import pandas as pd + +from datetime import datetime +from pathlib import Path + +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_objects.eye_tracking \ + .rig_geometry import \ + RigGeometry, Coordinates +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest + + +class TestFromLims(LimsTest): + @classmethod + def setup_class(cls): + cls.ophys_experiment_id = 994278291 + + dir = Path(__file__).parent.parent.resolve() + test_data_dir = dir / 'test_data' + + with open(test_data_dir / 'eye_tracking_rig_geometry.json') as f: + x = json.load(f) + x = x['rig_geometry'] + x = {'eye_tracking_rig_geometry': x} + cls.expected = RigGeometry.from_json(dict_repr=x) + + @pytest.mark.requires_bamboo + def test_from_lims(self): + rg = RigGeometry.from_lims( + ophys_experiment_id=self.ophys_experiment_id, lims_db=self.dbconn) + assert rg == self.expected + + @pytest.mark.requires_bamboo + def test_rig_geometry_newer_than_experiment(self): + """ + This test ensures that if the experiment date_of_acquisition + is before a rig activate_date that it is not returned as the rig + used for the experiment + """ + # This experiment has rig config more recent than the + # experiment date_of_acquisition + ophys_experiment_id = 521405260 + + rg = RigGeometry.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=self.dbconn) + expected = RigGeometry( + camera_position_mm=Coordinates(x=130.0, y=0.0, z=0.0), + led_position=Coordinates(x=265.1, y=-39.3, z=1.0), + monitor_position_mm=Coordinates(x=170.0, y=0.0, z=0.0), + camera_rotation_deg=Coordinates(x=0.0, y=0.0, z=13.1), + monitor_rotation_deg=Coordinates(x=0.0, y=0.0, z=0.0), + equipment='CAM2P.1' + ) + assert rg == expected + + def test_only_single_geometry_returned(self): + """Tests that when a rig contains multiple geometries, that only 1 is + returned""" + dir = Path(__file__).parent.parent.resolve() + test_data_dir = dir / 'test_data' + + # This example contains multiple geometries per config + df = pd.read_pickle( + str(test_data_dir / 'raw_eye_tracking_rig_geometry.pkl')) + + obtained = RigGeometry._select_most_recent_geometry(rig_geometry=df) + assert (obtained.groupby(obtained.index).size() == 1).all() + + +class TestFromJson(LimsTest): + @classmethod + def setup_class(cls): + cls.ophys_experiment_id = 994278291 + + dir = Path(__file__).parent.parent.resolve() + test_data_dir = dir / 'test_data' + + with open(test_data_dir / 'eye_tracking_rig_geometry.json') as f: + x = json.load(f) + x = x['rig_geometry'] + x = {'eye_tracking_rig_geometry': x} + cls.expected = RigGeometry.from_json(dict_repr=x) + + @pytest.mark.requires_bamboo + def test_from_json(self): + dict_repr = {'eye_tracking_rig_geometry': + self.expected.to_dict()['rig_geometry']} + rg = RigGeometry.from_json(dict_repr=dict_repr) + assert rg == self.expected + + +class TestNWB: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.parent.resolve() + cls.test_data_dir = dir / 'test_data' + + with open(cls.test_data_dir / 'eye_tracking_rig_geometry.json') as f: + x = json.load(f) + x = x['rig_geometry'] + x = {'eye_tracking_rig_geometry': x} + cls.rig_geometry = RigGeometry.from_json(dict_repr=x) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.rig_geometry.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=RigGeometry) + else: + obt = RigGeometry.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.rig_geometry diff --git a/test/brain_observatory/behavior/data_objects/lims_util.py b/test/brain_observatory/behavior/data_objects/lims_util.py new file mode 100644 index 0000000000..0af3615f0e --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/lims_util.py @@ -0,0 +1,16 @@ +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator + + +class LimsTest: + """Helper class for testing LIMS. For each test, checks whether + bamboo is required and if so sets up a connection""" + def setup_method(self, method): + marks = getattr(method, 'pytestmark', None) + if marks: + marks = [m.name for m in marks] + + # Will only create a dbconn if the test requires_bamboo + if 'requires_bamboo' in marks: + self.dbconn = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP) diff --git a/test/brain_observatory/behavior/data_objects/metadata/__pycache__/test_behavior_ophys_metadata.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/metadata/__pycache__/test_behavior_ophys_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7beb14b32dca6d8f991406eb0cac4815a7497faf GIT binary patch literal 6994 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 JYO}SI{{e4pVs-!k literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/test_behavior_metadata.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/test_behavior_metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eee04bb119ae0177b1962d5c1a9f99057819989b GIT binary patch literal 11156 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py b/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py new file mode 100644 index 0000000000..a4ecc0b457 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py @@ -0,0 +1,307 @@ +import datetime +import pickle +import uuid +from pathlib import Path + +import pynwb +import pytest +import pytz +from uuid import UUID + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import BehaviorSessionId +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.behavior_metadata import \ + BehaviorMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.behavior_session_uuid import \ + BehaviorSessionUUID +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.date_of_acquisition import \ + DateOfAcquisition +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.equipment import \ + Equipment +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.session_type import \ + SessionType +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.stimulus_frame_rate import \ + StimulusFrameRate +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.age import \ + Age +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.driver_line import \ + DriverLine +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.full_genotype import \ + FullGenotype +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.mouse_id import \ + MouseId +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.reporter_line import \ + ReporterLine +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.sex import \ + Sex +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .subject_metadata.subject_metadata import \ + SubjectMetadata +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest + + +class BehaviorMetaTestCase: + @classmethod + def setup_class(cls): + cls.meta = cls._get_meta() + + @staticmethod + def _get_meta(): + subject_meta = SubjectMetadata( + sex=Sex(sex='M'), + age=Age(age=139), + reporter_line=ReporterLine(reporter_line="Ai93(TITL-GCaMP6f)"), + full_genotype=FullGenotype( + full_genotype="Slc17a7-IRES2-Cre/wt;Camk2a-tTA/wt;" + "Ai93(TITL-GCaMP6f)/wt"), + driver_line=DriverLine( + driver_line=["Camk2a-tTA", "Slc17a7-IRES2-Cre"]), + mouse_id=MouseId(mouse_id=416369) + + ) + behavior_meta = BehaviorMetadata( + subject_metadata=subject_meta, + behavior_session_id=BehaviorSessionId(behavior_session_id=4242), + equipment=Equipment(equipment_name='my_device'), + stimulus_frame_rate=StimulusFrameRate(stimulus_frame_rate=60.0), + session_type=SessionType(session_type='Unknown'), + behavior_session_uuid=BehaviorSessionUUID( + behavior_session_uuid=uuid.uuid4()) + ) + return behavior_meta + + +class TestLims(LimsTest): + @pytest.mark.requires_bamboo + def test_behavior_session_uuid(self): + behavior_session_id = 823847007 + meta = BehaviorMetadata.from_lims( + behavior_session_id=BehaviorSessionId( + behavior_session_id=behavior_session_id), + lims_db=self.dbconn + ) + assert meta.behavior_session_uuid == \ + uuid.UUID('394a910e-94c7-4472-9838-5345aff59ed8') + + +class TestBehaviorMetadata(BehaviorMetaTestCase): + def test_cre_line(self): + """Tests that cre_line properly parsed from driver_line""" + fg = FullGenotype( + full_genotype='Sst-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt') + assert fg.parse_cre_line() == 'Sst-IRES-Cre' + + def test_cre_line_bad_full_genotype(self): + """Test that cre_line is None and no error raised""" + fg = FullGenotype(full_genotype='foo') + + with pytest.warns(UserWarning) as record: + cre_line = fg.parse_cre_line(warn=True) + assert cre_line is None + assert str(record[0].message) == 'Unable to parse cre_line from ' \ + 'full_genotype' + + def test_reporter_line(self): + """Test that reporter line properly parsed from list""" + reporter_line = ReporterLine.parse(reporter_line=['foo']) + assert reporter_line == 'foo' + + def test_reporter_line_str(self): + """Test that reporter line returns itself if str""" + reporter_line = ReporterLine.parse(reporter_line='foo') + assert reporter_line == 'foo' + + @pytest.mark.parametrize("input_reporter_line, warning_msg, expected", ( + (('foo', 'bar'), 'More than 1 reporter line. ' + 'Returning the first one', 'foo'), + (None, 'Error parsing reporter line. It is null.', None), + ([], 'Error parsing reporter line. The array is empty', None) + ) + ) + def test_reporter_edge_cases(self, input_reporter_line, warning_msg, + expected): + """Test reporter line edge cases""" + with pytest.warns(UserWarning) as record: + reporter_line = ReporterLine.parse( + reporter_line=input_reporter_line, + warn=True) + assert reporter_line == expected + assert str(record[0].message) == warning_msg + + def test_age_in_days(self): + """Test that age_in_days properly parsed from age""" + age = Age._age_code_to_days(age='P123') + assert age == 123 + + @pytest.mark.parametrize("input_age, warning_msg, expected", ( + ('unkown', 'Could not parse numeric age from age code ' + '(age code does not start with "P")', None), + ('P', 'Could not parse numeric age from age code ' + '(no numeric values found in age code)', None) + ) + ) + def test_age_in_days_edge_cases(self, monkeypatch, input_age, warning_msg, + expected): + """Test age in days edge cases""" + with pytest.warns(UserWarning) as record: + age_in_days = Age._age_code_to_days(age=input_age, warn=True) + + assert age_in_days is None + assert str(record[0].message) == warning_msg + + @pytest.mark.parametrize("test_params, expected_warn_msg", [ + # Vanilla test case + ({ + "extractor_expt_date": datetime.datetime.strptime( + "2021-03-14 03:14:15", + "%Y-%m-%d %H:%M:%S"), + "pkl_expt_date": datetime.datetime.strptime("2021-03-14 03:14:15", + "%Y-%m-%d %H:%M:%S"), + "behavior_session_id": 1 + }, None), + + # pkl expt date stored in unix format + ({ + "extractor_expt_date": datetime.datetime.strptime( + "2021-03-14 03:14:15", + "%Y-%m-%d %H:%M:%S"), + "pkl_expt_date": 1615716855.0, + "behavior_session_id": 2 + }, None), + + # Extractor and pkl dates differ significantly + ({ + "extractor_expt_date": datetime.datetime.strptime( + "2021-03-14 03:14:15", + "%Y-%m-%d %H:%M:%S"), + "pkl_expt_date": datetime.datetime.strptime("2021-03-14 20:14:15", + "%Y-%m-%d %H:%M:%S"), + "behavior_session_id": 3 + }, + "The `date_of_acquisition` field in LIMS *"), + + # pkl file contains an unparseable datetime + ({ + "extractor_expt_date": datetime.datetime.strptime( + "2021-03-14 03:14:15", + "%Y-%m-%d %H:%M:%S"), + "pkl_expt_date": None, + "behavior_session_id": 4 + }, + "Could not parse the acquisition datetime *"), + ]) + def test_get_date_of_acquisition(self, tmp_path, test_params, + expected_warn_msg): + mock_session_id = test_params["behavior_session_id"] + + pkl_save_path = tmp_path / f"mock_pkl_{mock_session_id}.pkl" + with open(pkl_save_path, 'wb') as handle: + pickle.dump({"start_time": test_params['pkl_expt_date']}, handle) + + tz = pytz.timezone("America/Los_Angeles") + extractor_expt_date = tz.localize( + test_params['extractor_expt_date']).astimezone(pytz.utc) + + stimulus_file = StimulusFile(filepath=pkl_save_path) + obt_date = DateOfAcquisition( + date_of_acquisition=extractor_expt_date) + + if expected_warn_msg: + with pytest.warns(Warning, match=expected_warn_msg): + obt_date.validate( + stimulus_file=stimulus_file, + behavior_session_id=test_params['behavior_session_id']) + + assert obt_date.value == extractor_expt_date + + def test_indicator(self): + """Test that indicator is parsed from full_genotype""" + reporter_line = ReporterLine( + reporter_line='Ai148(TIT2L-GC6f-ICL-tTA2)') + assert reporter_line.parse_indicator() == 'GCaMP6f' + + @pytest.mark.parametrize("input_reporter_line, warning_msg, expected", ( + (None, + 'Could not parse indicator from reporter because there is no ' + 'reporter', None), + ('foo', 'Could not parse indicator from reporter because none' + 'of the expected substrings were found in the reporter', + None) + ) + ) + def test_indicator_edge_cases(self, input_reporter_line, warning_msg, + expected): + """Test indicator parsing edge cases""" + with pytest.warns(UserWarning) as record: + reporter_line = ReporterLine(reporter_line=input_reporter_line) + indicator = reporter_line.parse_indicator(warn=True) + assert indicator is expected + assert str(record[0].message) == warning_msg + + +class TestStimulusFile: + """Tests properties read from stimulus file""" + def setup_class(cls): + dir = Path(__file__).parent.parent.parent.resolve() + test_data_dir = dir / 'test_data' + sf_path = test_data_dir / 'stimulus_file.pkl' + cls.stimulus_file = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(sf_path)}) + + def test_session_uuid(self): + uuid = BehaviorSessionUUID.from_stimulus_file( + stimulus_file=self.stimulus_file) + expected = UUID('138531ab-fe59-4523-9154-07c8d97bbe03') + assert expected == uuid.value + + def test_get_stimulus_frame_rate(self): + rate = StimulusFrameRate.from_stimulus_file( + stimulus_file=self.stimulus_file) + assert 62.0 == rate.value + + +def test_date_of_acquisition_utc(): + """Tests that when read from json (in Pacific time), that + date of acquisition is converted to utc""" + expected = DateOfAcquisition( + date_of_acquisition=datetime.datetime(2019, 9, 26, 16, + tzinfo=pytz.UTC)) + actual = DateOfAcquisition.from_json( + dict_repr={'date_of_acquisition': '2019-09-26 09:00:00'}) + assert expected == actual + + +class TestNWB(BehaviorMetaTestCase): + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='afile', + session_start_time=datetime.datetime.now() + ) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_add_behavior_only_metadata(self, roundtrip, + data_object_roundtrip_fixture): + self.meta.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + meta_obt = data_object_roundtrip_fixture( + self.nwbfile, BehaviorMetadata + ) + else: + meta_obt = BehaviorMetadata.from_nwb(nwbfile=self.nwbfile) + + assert self.meta == meta_obt diff --git a/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py b/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py new file mode 100644 index 0000000000..7783b98fdf --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py @@ -0,0 +1,198 @@ +import datetime +import json +from pathlib import Path +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.equipment import \ + Equipment +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_ophys_metadata import \ + BehaviorOphysMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.experiment_container_id import \ + ExperimentContainerId +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.field_of_view_shape import \ + FieldOfViewShape +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.imaging_depth import \ + ImagingDepth +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata\ + .imaging_plane_group import \ + ImagingPlaneGroup +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata\ + .multi_plane_metadata import \ + MultiplaneMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.ophys_experiment_metadata import \ + OphysExperimentMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.ophys_session_id import \ + OphysSessionId +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator +from allensdk.test.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.test_behavior_metadata import \ + TestBehaviorMetadata + + +class TestBOM: + @classmethod + def setup_class(cls): + cls.meta = cls._get_meta() + + def setup_method(self, method): + self.meta = self._get_meta() + + @staticmethod + def _get_meta(): + ophys_meta = OphysExperimentMetadata( + ophys_experiment_id=1234, + ophys_session_id=OphysSessionId(session_id=999), + experiment_container_id=ExperimentContainerId( + experiment_container_id=5678), + field_of_view_shape=FieldOfViewShape(width=4, height=4), + imaging_depth=ImagingDepth(imaging_depth=375) + ) + + behavior_metadata = TestBehaviorMetadata() + behavior_metadata.setup_class() + return BehaviorOphysMetadata( + behavior_metadata=behavior_metadata.meta, + ophys_metadata=ophys_meta + ) + + def _get_multiplane_meta(self): + bo_meta = self.meta + bo_meta.behavior_metadata._equipment = \ + Equipment(equipment_name='MESO.1') + ophys_experiment_metadata = bo_meta.ophys_metadata + + imaging_plane_group = ImagingPlaneGroup(plane_group_count=5, + plane_group=0) + multiplane_meta = MultiplaneMetadata( + ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, + ophys_session_id=ophys_experiment_metadata._ophys_session_id, + experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 + field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, + imaging_depth=ophys_experiment_metadata._imaging_depth, + project_code=ophys_experiment_metadata._project_code, + imaging_plane_group=imaging_plane_group + ) + return BehaviorOphysMetadata( + behavior_metadata=bo_meta.behavior_metadata, + ophys_metadata=multiplane_meta + ) + + +class TestInternal(TestBOM): + @classmethod + def setup_method(self, method): + marks = getattr(method, 'pytestmark', None) + if marks: + marks = [m.name for m in marks] + + # Will only create a dbconn if the test requires_bamboo + if 'requires_bamboo' in marks: + self.dbconn = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP) + + @pytest.mark.requires_bamboo + @pytest.mark.parametrize('meso', [True, False]) + def test_from_lims(self, meso): + if meso: + ophys_experiment_id = 951980471 + else: + ophys_experiment_id = 994278291 + bom = BehaviorOphysMetadata.from_lims( + ophys_experiment_id=ophys_experiment_id, lims_db=self.dbconn, + is_multiplane=meso) + + if meso: + assert isinstance(bom.ophys_metadata, + MultiplaneMetadata) + assert bom.ophys_metadata.imaging_depth == 150 + assert bom.behavior_metadata.session_type == 'OPHYS_1_images_A' + assert bom.behavior_metadata.subject_metadata.reporter_line == \ + 'Ai148(TIT2L-GC6f-ICL-tTA2)' + assert bom.behavior_metadata.subject_metadata.driver_line == \ + ['Sst-IRES-Cre'] + assert bom.behavior_metadata.subject_metadata.mouse_id == 457841 + assert bom.behavior_metadata.subject_metadata.full_genotype == \ + 'Sst-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt' + assert bom.behavior_metadata.subject_metadata.age_in_days == 233 + assert bom.behavior_metadata.subject_metadata.sex == 'F' + else: + assert isinstance(bom.ophys_metadata, OphysExperimentMetadata) + assert bom.ophys_metadata.imaging_depth == 175 + assert bom.behavior_metadata.session_type == 'OPHYS_4_images_A' + assert bom.behavior_metadata.subject_metadata.reporter_line == \ + 'Ai93(TITL-GCaMP6f)' + assert bom.behavior_metadata.subject_metadata.driver_line == \ + ['Camk2a-tTA', 'Slc17a7-IRES2-Cre'] + assert bom.behavior_metadata.subject_metadata.mouse_id == 491060 + assert bom.behavior_metadata.subject_metadata.full_genotype == \ + 'Slc17a7-IRES2-Cre/wt;Camk2a-tTA/wt;Ai93(TITL-GCaMP6f)/wt' + assert bom.behavior_metadata.subject_metadata.age_in_days == 130 + assert bom.behavior_metadata.subject_metadata.sex == 'M' + + +class TestJson(TestBOM): + @classmethod + def setup_method(self, method): + dir = Path(__file__).parent.resolve() + test_data_dir = dir.parent / 'test_data' + with open(test_data_dir / 'test_input.json') as f: + dict_repr = json.load(f) + dict_repr = dict_repr['session_data'] + dict_repr['sync_file'] = str(test_data_dir / 'sync.h5') + dict_repr['behavior_stimulus_file'] = str(test_data_dir / + 'behavior_stimulus_file.pkl') + dict_repr['dff_file'] = str(test_data_dir / 'demix_file.h5') + self.dict_repr = dict_repr + + @pytest.mark.parametrize('meso', [True, False]) + def test_from_json(self, meso): + if meso: + self.dict_repr['rig_name'] = 'MESO.1' + bom = BehaviorOphysMetadata.from_json(dict_repr=self.dict_repr, + is_multiplane=meso) + + if meso: + assert isinstance(bom.ophys_metadata, MultiplaneMetadata) + else: + assert isinstance(bom.ophys_metadata, OphysExperimentMetadata) + + +class TestNWB(TestBOM): + def setup_method(self, method): + self.meta = self._get_meta() + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier=str(self.meta.ophys_metadata.ophys_experiment_id), + session_start_time=datetime.datetime.now() + ) + + @pytest.mark.parametrize('meso', [True, False]) + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture, meso): + if meso: + self.meta = self._get_multiplane_meta() + + self.meta.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=BehaviorOphysMetadata, + is_multiplane=meso) + else: + obt = self.meta.from_nwb(nwbfile=self.nwbfile, + is_multiplane=meso) + + assert obt == self.meta diff --git a/test/brain_observatory/behavior/data_objects/nwb_input_json.py b/test/brain_observatory/behavior/data_objects/nwb_input_json.py new file mode 100644 index 0000000000..ba5058f3dc --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/nwb_input_json.py @@ -0,0 +1,23 @@ +import json +from pathlib import Path + + +class NwbInputJson: + def __init__(self): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + with open(test_data_dir / 'test_input.json') as f: + dict_repr = json.load(f) + dict_repr = dict_repr['session_data'] + dict_repr['sync_file'] = str(test_data_dir / 'sync.h5') + dict_repr['behavior_stimulus_file'] = str(test_data_dir / + 'behavior_stimulus_file.pkl') + dict_repr['dff_file'] = str(test_data_dir / 'demix_file.h5') + dict_repr['demix_file'] = str(test_data_dir / 'demix_file.h5') + dict_repr['events_file'] = str(test_data_dir / 'events.h5') + + self._dict_repr = dict_repr + + @property + def dict_repr(self): + return self._dict_repr diff --git a/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_acquisition.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_acquisition.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2e25ce3cbd6bce8d5491f993872fb1a0a02ed36 GIT binary patch literal 4943 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_processing.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbbf26f4b8f50c0bd7ad0712213e4c5e98929d9b GIT binary patch literal 7601 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_speed.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_speed.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06d0a6441f839b221de6e96a739aab4831393c27 GIT binary patch literal 5731 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py b/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py new file mode 100644 index 0000000000..fc93f1b9f6 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py @@ -0,0 +1,312 @@ +import pytest +from unittest.mock import create_autospec + +import pandas as pd + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 + get_running_df +) +from allensdk.brain_observatory.behavior.data_objects import ( + RunningAcquisition, StimulusTimestamps +) + + +@pytest.mark.parametrize( + "dict_repr, returned_running_acq_df, expected_running_acq_df", + [ + ( + # dict_repr + { + "behavior_stimulus_file": "mock_stimulus_file.pkl" + }, + # returned_running_acq_df + pd.DataFrame( + { + "timestamps": [1, 2], + "speed": [3, 4], + "dx": [5, 6], + "v_sig": [7, 8], + "v_in": [9, 10] + } + ).set_index("timestamps"), + # expected_running_acq_df + pd.DataFrame( + { + "timestamps": [1, 2], + "dx": [5, 6], + "v_sig": [7, 8], + "v_in": [9, 10] + } + ).set_index("timestamps") + ), + ] +) +def test_running_acquisition_from_json( + monkeypatch, dict_repr, returned_running_acq_df, expected_running_acq_df +): + mock_stimulus_file = create_autospec(StimulusFile) + mock_stimulus_timestamps = create_autospec(StimulusTimestamps) + mock_get_running_df = create_autospec(get_running_df) + + mock_get_running_df.return_value = returned_running_acq_df + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_acquisition.StimulusFile", + mock_stimulus_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_acquisition.StimulusTimestamps", + mock_stimulus_timestamps + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_acquisition.get_running_df", + mock_get_running_df + ) + obt = RunningAcquisition.from_json(dict_repr) + + mock_stimulus_file.from_json.assert_called_once_with(dict_repr) + mock_stimulus_file_instance = mock_stimulus_file.from_json(dict_repr) + assert obt._stimulus_file == mock_stimulus_file_instance + + mock_stimulus_timestamps.from_json.assert_called_once_with(dict_repr) + mock_stimulus_timestamps_instance = mock_stimulus_timestamps.from_json( + dict_repr + ) + assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance + + mock_get_running_df.assert_called_once_with( + data=mock_stimulus_file_instance.data, + time=mock_stimulus_timestamps_instance.value, + ) + + pd.testing.assert_frame_equal(obt.value, expected_running_acq_df) + + +@pytest.mark.parametrize( + "stimulus_file, stimulus_file_to_json_ret, " + "stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected", + [ + # Test to_json with both stimulus_file and sync_file + ( + # stimulus_file + create_autospec(StimulusFile, instance=True), + # stimulus_file_to_json_ret + {"behavior_stimulus_file": "stim.pkl"}, + # stimulus_timestamps + create_autospec(StimulusTimestamps, instance=True), + # stimulus_timestamps_to_json_ret + {"sync_file": "sync.h5"}, + # raises + False, + # expected + {"behavior_stimulus_file": "stim.pkl", "sync_file": "sync.h5"} + ), + # Test to_json without stimulus_file + ( + # stimulus_file + None, + # stimulus_file_to_json_ret + None, + # stimulus_timestamps + create_autospec(StimulusTimestamps, instance=True), + # stimulus_timestamps_to_json_ret + {"sync_file": "sync.h5"}, + # raises + "RunningAcquisition DataObject lacks information about", + # expected + None + ), + # Test to_json without stimulus_timestamps + ( + # stimulus_file + create_autospec(StimulusFile, instance=True), + # stimulus_file_to_json_ret + {"behavior_stimulus_file": "stim.pkl"}, + # stimulus_timestamps_to_json_ret + None, + # sync_file_to_json_ret + None, + # raises + "RunningAcquisition DataObject lacks information about", + # expected + None + ), + ] +) +def test_running_acquisition_to_json( + stimulus_file, stimulus_file_to_json_ret, + stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected +): + if stimulus_file is not None: + stimulus_file.to_json.return_value = stimulus_file_to_json_ret + if stimulus_timestamps is not None: + stimulus_timestamps.to_json.return_value = ( + stimulus_timestamps_to_json_ret + ) + + running_acq = RunningAcquisition( + running_acquisition=None, + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps + ) + + if raises: + with pytest.raises(RuntimeError, match=raises): + _ = running_acq.to_json() + else: + obt = running_acq.to_json() + assert obt == expected + + +@pytest.mark.parametrize( + "behavior_session_id, ophys_experiment_id, " + "returned_running_acq_df, expected_running_acq_df", + [ + ( + # behavior_session_id + 12345, + # ophys_experiment_id + None, + # returned_running_acq_df + pd.DataFrame( + { + "timestamps": [1, 2], + "speed": [3, 4], + "dx": [5, 6], + "v_sig": [7, 8], + "v_in": [9, 10] + } + ).set_index("timestamps"), + # expected_running_acq_df + pd.DataFrame( + { + "timestamps": [1, 2], + "dx": [5, 6], + "v_sig": [7, 8], + "v_in": [9, 10] + } + ).set_index("timestamps") + ), + ( + # behavior_session_id + 1234, + # ophys_experiment_id + 5678, + # returned_running_acq_df + pd.DataFrame( + { + "timestamps": [2, 4], + "speed": [6, 8], + "dx": [10, 12], + "v_sig": [14, 16], + "v_in": [18, 20] + } + ).set_index("timestamps"), + # expected_running_acq_df + pd.DataFrame( + { + "timestamps": [2, 4], + "dx": [10, 12], + "v_sig": [14, 16], + "v_in": [18, 20] + } + ).set_index("timestamps") + ) + ] +) +def test_running_acquisition_from_lims( + monkeypatch, behavior_session_id, ophys_experiment_id, + returned_running_acq_df, expected_running_acq_df +): + mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) + + mock_stimulus_file = create_autospec(StimulusFile) + mock_stimulus_timestamps = create_autospec(StimulusTimestamps) + mock_get_running_df = create_autospec(get_running_df) + + mock_get_running_df.return_value = returned_running_acq_df + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_acquisition.StimulusFile", + mock_stimulus_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_acquisition.StimulusTimestamps", + mock_stimulus_timestamps + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_acquisition.get_running_df", + mock_get_running_df + ) + obt = RunningAcquisition.from_lims( + mock_db_conn, behavior_session_id, ophys_experiment_id + ) + + mock_stimulus_file.from_lims.assert_called_once_with( + mock_db_conn, behavior_session_id + ) + mock_stimulus_file_instance = mock_stimulus_file.from_lims( + mock_db_conn, behavior_session_id + ) + assert obt._stimulus_file == mock_stimulus_file_instance + + mock_stimulus_timestamps.from_stimulus_file.assert_called_once_with( + mock_stimulus_file_instance + ) + mock_stimulus_timestamps_instance = mock_stimulus_timestamps.\ + from_stimulus_file(stimulus_file=mock_stimulus_file) + assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance + + mock_get_running_df.assert_called_once_with( + data=mock_stimulus_file_instance.data, + time=mock_stimulus_timestamps_instance.value, + ) + + pd.testing.assert_frame_equal( + obt.value, expected_running_acq_df, check_like=True + ) + + +# Fixtures: +# nwbfile: +# test/brain_observatory/behavior/conftest.py +# data_object_roundtrip_fixture: +# test/brain_observatory/behavior/data_objects/conftest.py +@pytest.mark.parametrize("roundtrip", [True, False]) +@pytest.mark.parametrize("running_acq_data", [ + ( + # expected_running_acq_df + pd.DataFrame( + { + "timestamps": [2.0, 4.0], + "dx": [10.0, 12.0], + "v_sig": [14.0, 16.0], + "v_in": [18.0, 20.0] + } + ).set_index("timestamps") + ), +]) +def test_running_acquisition_nwb_roundtrip( + nwbfile, data_object_roundtrip_fixture, roundtrip, running_acq_data +): + running_acq = RunningAcquisition(running_acquisition=running_acq_data) + nwbfile = running_acq.to_nwb(nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture(nwbfile, RunningAcquisition) + else: + obt = RunningAcquisition.from_nwb(nwbfile) + + pd.testing.assert_frame_equal( + obt.value, running_acq_data, check_like=True + ) diff --git a/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py b/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py new file mode 100644 index 0000000000..b06b263d7b --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py @@ -0,0 +1,290 @@ +import numpy as np +import pytest + +from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 + get_running_df, calc_deriv, deg_to_dist, _shift, _identify_wraps, + _unwrap_voltage_signal, _angular_change, _zscore_threshold_1d, + _clip_speed_wraps) + +import allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing as rp # noqa: E501 + + +@pytest.fixture +def timestamps(): + return np.arange(0., 10., 0.1) + + +@pytest.fixture +def running_data(): + rng = np.random.default_rng() + return { + "items": { + "behavior": { + "encoders": [ + { + "dx": rng.random((100,)), + "vsig": rng.uniform(low=0.0, high=5.1, size=(100,)), + "vin": rng.uniform(low=4.9, high=5.0, size=(100,)), + }]}}} + + +@pytest.mark.parametrize( + "x,time,expected", [ + ([1.0, 1.0], [1.0, 2.0], [np.nan, 0.0]), + ([1.0, 2.0, 3.0], [1.0, 2.0, 3.0], [np.nan, 1.0, 1.0]), + ([1.0, 2.0, 3.0], [1.0, 4.0, 6.0], [np.nan, 1.0/3.0, 1.0/2.0]) + ] +) +def test_calc_deriv(x, time, expected): + obtained = calc_deriv(x, time) + + # np.nan == np.nan returns False so filter out the first values + obtained = obtained[1:] + expected = expected[1:] + + assert np.all(obtained == expected) + + +@pytest.mark.parametrize( + "speed,expected", [ + (np.array([1.0]), [5.5033]), + (np.array([0., 2.0]), [0., 11.0066]) + ] +) +def test_deg_to_dist(speed, expected): + np.testing.assert_allclose(deg_to_dist(speed), expected, atol=0.0001) + + +@pytest.mark.parametrize( + "lowpass", [True, False] +) +def test_get_running_df(running_data, timestamps, lowpass): + actual = get_running_df(running_data, timestamps, lowpass=lowpass) + np.testing.assert_array_equal(actual.index, timestamps) + assert sorted(list(actual)) == ["dx", "speed", "v_in", "v_sig"] + # Should bring raw data through + np.testing.assert_array_equal( + actual["v_sig"].values, + running_data["items"]["behavior"]["encoders"][0]["vsig"]) + np.testing.assert_array_equal( + actual["v_in"].values, + running_data["items"]["behavior"]["encoders"][0]["vin"]) + np.testing.assert_array_equal( + actual["dx"].values, + running_data["items"]["behavior"]["encoders"][0]["dx"]) + if lowpass: + assert np.count_nonzero(np.isnan(actual["speed"])) == 0 + + +@pytest.mark.parametrize( + "lowpass", [True, False] +) +def test_get_running_df_one_fewer_timestamp_check_warning(running_data, + timestamps, + lowpass): + with pytest.warns( + UserWarning, + match="Time array is 1 value shorter than encoder array.*" + ): + # Call with one fewer timestamp, check for a warning + _ = get_running_df( + data=running_data, + time=timestamps[:-1], + lowpass=lowpass + ) + + +@pytest.mark.parametrize( + "lowpass", [True, False] +) +def test_get_running_df_one_fewer_timestamp_check_truncation(running_data, + timestamps, + lowpass): + # Call with one fewer timestamp + output = get_running_df( + data=running_data, + time=timestamps[:-1], + lowpass=lowpass + ) + + # Check that the output is actually trimmed, and the values are the same + assert len(output) == len(timestamps) - 1 + np.testing.assert_equal( + output["v_sig"], + running_data["items"]["behavior"]["encoders"][0]["vsig"][:-1] + ) + np.testing.assert_equal( + output["v_in"], + running_data["items"]["behavior"]["encoders"][0]["vin"][:-1] + ) + + +@pytest.mark.parametrize( + "arr, periods, fill, expected", + [ + ([1, 2, 3], 1, None, np.array([np.nan, 1., 2.])), + ([1, 2, 3], 2, 99., np.array([99., 99., 1.])), + ([1, 2, 3], 3, 99., np.array([99., 99., 99.])), + ([1, 2, 3], 4, 99., np.array([99., 99., 99.])), + ([], 2, 30, np.array([])) + ] +) +def test_shift(arr, periods, fill, expected): + actual = _shift(arr, periods, fill) + np.testing.assert_array_equal(actual, expected) + + +@pytest.mark.parametrize( + "periods", [0, -2] +) +def test_shift_raises_error_periods_zero(periods): + with pytest.raises(ValueError, match="Can only shift"): + _shift(np.ones((5,)), periods) + + +@pytest.mark.parametrize( + "arr, min_threshold, max_threshold, expected", + [ + (np.array( + [0, 2, 5, 0, # pos wrap 5-0 + 2, 0, 5 # neg wrap 0-5 + ]), 1.5, 3.5, (np.array([3]), np.array([6]))), + (np.array([0, 2, 5, 0, 2, 5]), 0, 5, (np.array([]), np.array([]))), + ] +) +def test_identify_wraps(arr, min_threshold, max_threshold, expected): + actual = _identify_wraps( + arr, min_threshold=min_threshold, max_threshold=max_threshold) + np.testing.assert_array_equal( + actual[0], expected[0], + f"error identifying positive wraps, got {actual[0]}, " + f"expected {expected[0]}") + np.testing.assert_array_equal( + actual[1], expected[1], + f"error identifying negative wraps, got {actual[1]}, " + f"expected {expected[1]}") + + +@pytest.mark.parametrize( + "vsig, pos_wrap_ix, neg_wrap_ix, vmax, max_threshold, max_diff, expected", + [ + ( # No artifacts or baseline + np.array([0, 1, 3, 5, 0.5, 1, 2.5, 5, 0, 1, 4, 3]), + np.array([4, 8]), np.array([10]), 5.0, 5.1, 3.0, + np.array([np.nan, 1, 3, 5, 5.5, 6, 7.5, 10, 10, 11, 9, 8]) + ), + ( # Some diff artifacts, baseline + np.array([1, 1, 3, 5, 0.5, 1, 2.5, 5, 0, 1, 4, 1.5]), + np.array([4, 8]), np.array([10]), 5.0, 5.1, 2.0, + np.array([np.nan, 1, 3, 5, 5.5, 6, 7.5, np.nan, 7.5, 8.5, 6.5, + np.nan]) + ), + ( # Max artifact -- use threshold instead + np.array([0, 7, 3, 5, 0.5, 1]), + np.array([2, 4]), np.array([]).astype(int), None, 5.1, 6.0, + np.array([np.nan, np.nan, 1, 3, 3.5, 4]) + ), + ( + # No wraps + np.ones(5,), np.array([]), np.array([]), 5.0, 5.1, 3.0, + np.array([np.nan, 1., 1., 1., 1.]) + ) + ] +) +def test_unwrap_voltage_signal( + vsig, pos_wrap_ix, neg_wrap_ix, vmax, max_threshold, max_diff, + expected): + actual = _unwrap_voltage_signal( + vsig, pos_wrap_ix, neg_wrap_ix, vmax=vmax, + max_threshold=max_threshold, max_diff=max_diff) + np.testing.assert_array_equal(actual, expected) + + +@pytest.mark.parametrize( + "vsig, vmax, expected", + [ + ( + np.array([1, 2, 3, 4, 5]), 2.0, + np.array([np.nan, np.pi, np.pi, np.pi, np.pi]) + ), + ( + np.array([np.nan, 1, 3, np.nan, 4]), + np.array([2.0, 2.0, 2.0, 2.0, 2.0]), + np.array([np.nan, np.nan, 2*np.pi, np.nan, np.nan]), + ) + ] +) +def test_angular_change(vsig, vmax, expected): + actual = _angular_change(vsig, vmax) + np.testing.assert_allclose(actual, expected, equal_nan=True) + + +@pytest.mark.parametrize( + "arr, threshold, expected", + [ + (np.ones(5,), 2.0, np.ones(5,)), + (np.array([99, 1, np.nan, 1, 1, 1]), 1.5, + np.array([np.nan, 1, np.nan, 1, 1, 1])), + (np.ones(1,), 2.0, np.ones(1,)) + ] +) +def test_zscore_threshold_1d(arr, threshold, expected): + actual = _zscore_threshold_1d(arr, threshold=threshold) + np.testing.assert_allclose(actual, expected, equal_nan=True) + + +@pytest.mark.parametrize( + "speed, time, wrap_indices, span, expected", + [ + ( # Clip bottom, then clip top, then no clip required + np.array([0, 0, -1, 5, 0, 99, 6, 1, 2, 3]), + np.array(range(10)).astype(float), + [2, 5, 8], + 1.0, + np.array([0, 0, 0, 5, 0, 6, 6, 1, 2, 3]) + ), + ] +) +def test_clip_speed_wraps( + speed, time, wrap_indices, span, expected, monkeypatch): + monkeypatch.setattr(rp, "_local_boundaries", lambda x, y, z: (y-1, y+1)) + actual = _clip_speed_wraps(speed, time, wrap_indices, span) + np.testing.assert_array_equal(actual, expected) + + +@pytest.mark.parametrize( + "time, index, span", + [ + (np.arange(10.), 0, 2.0), # no neighborhood before first point + (np.arange(10.), 9, 2.0), # no neighborhood after last point + (np.arange(10.), 4, 0.25), # data not sampled with enough frequency + ] +) +def test_local_boundaries_raises_warning(time, index, span): + with pytest.warns(UserWarning, match="Unable to find"): + rp._local_boundaries(time, index, span) + + +@pytest.mark.parametrize( + "time, index", + [ + (np.array([5., 4., 3., 4., 5.]), 2), + (np.array([1., 2., 3., 2., 1.]), 2), + (np.array([3., 3., 3., 2., 1.]), 2), + ] +) +def test_local_boundaries_raises_error_non_monotonic(time, index): + with pytest.raises(ValueError, match="Data do not monotonically"): + rp._local_boundaries(time, index, 1.0) + + +@pytest.mark.parametrize( + "time, index, span, expected", + [ + (np.arange(10.), 4, 2.0, (2.0, 6.0)), # Spans > 1 element +/- + (np.arange(10.), 2, 1.0, (1.0, 3.0)) # Spans = 1 element +/- + ] +) +def test_local_boundaries(time, index, span, expected): + actual = rp._local_boundaries(time, index, span) + assert expected == actual diff --git a/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py b/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py new file mode 100644 index 0000000000..9e3bd110fa --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py @@ -0,0 +1,349 @@ +import pytest +from unittest.mock import create_autospec + +import pandas as pd + +from allensdk.core.exceptions import DataFrameIndexError +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 + get_running_df +) +from allensdk.brain_observatory.behavior.data_objects import ( + RunningSpeed, StimulusTimestamps +) + + +@pytest.mark.parametrize("filtered", [True, False]) +@pytest.mark.parametrize("zscore_threshold", [1.0, 4.2]) +@pytest.mark.parametrize("returned_running_df, expected_running_df, raises", [ + # Test basic case + ( + # returned_running_df + pd.DataFrame({ + "timestamps": [2, 4, 6, 8], + "speed": [1, 2, 3, 4] + }).set_index("timestamps"), + # expected_running_df + pd.DataFrame({ + "timestamps": [2, 4, 6, 8], + "speed": [1, 2, 3, 4] + }), + # raises + False + ), + # Test when returned dataframe lacks "timestamps" as index + ( + # returned_running_df + pd.DataFrame({ + "timestamps": [2, 4, 6, 8], + "speed": [1, 2, 3, 4] + }).set_index("speed"), + # expected_running_df + None, + # raises + "Expected running_data_df index to be named 'timestamps'" + ), +]) +def test_get_running_speed_df( + monkeypatch, returned_running_df, filtered, zscore_threshold, + expected_running_df, raises +): + + mock_stimulus_file_instance = create_autospec(StimulusFile, instance=True) + mock_stimulus_timestamps_instance = create_autospec( + StimulusTimestamps, instance=True + ) + mock_get_running_speed_df = create_autospec(get_running_df) + mock_get_running_speed_df.return_value = returned_running_df + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_speed.get_running_df", + mock_get_running_speed_df + ) + + if raises: + with pytest.raises(DataFrameIndexError, match=raises): + _ = RunningSpeed._get_running_speed_df( + mock_stimulus_file_instance, + mock_stimulus_timestamps_instance, + filtered, zscore_threshold + ) + else: + obt = RunningSpeed._get_running_speed_df( + mock_stimulus_file_instance, + mock_stimulus_timestamps_instance, + filtered, zscore_threshold + ) + + pd.testing.assert_frame_equal(obt, expected_running_df) + + mock_get_running_speed_df.assert_called_once_with( + data=mock_stimulus_file_instance.data, + time=mock_stimulus_timestamps_instance.value, + lowpass=filtered, + zscore_threshold=zscore_threshold + ) + + +@pytest.mark.parametrize("filtered", [True, False]) +@pytest.mark.parametrize("zscore_threshold", [1.0, 4.2]) +@pytest.mark.parametrize( + "dict_repr, returned_running_df, expected_running_df", + [ + ( + # dict_repr + { + "behavior_stimulus_file": "mock_stimulus_file.pkl" + }, + # returned_running_df + pd.DataFrame( + {"timestamps": [1, 2], "speed": [3, 4]} + ).set_index("timestamps"), + # expected_running_df + pd.DataFrame( + {"timestamps": [1, 2], "speed": [3, 4]} + ), + ), + ] +) +def test_running_speed_from_json( + monkeypatch, dict_repr, returned_running_df, expected_running_df, + filtered, zscore_threshold +): + mock_stimulus_file = create_autospec(StimulusFile) + mock_stimulus_timestamps = create_autospec(StimulusTimestamps) + mock_get_running_speed_df = create_autospec(get_running_df) + + mock_get_running_speed_df.return_value = returned_running_df + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_speed.StimulusFile", + mock_stimulus_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_speed.StimulusTimestamps", + mock_stimulus_timestamps + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_speed.get_running_df", + mock_get_running_speed_df + ) + obt = RunningSpeed.from_json(dict_repr, filtered, zscore_threshold) + + mock_stimulus_file.from_json.assert_called_once_with(dict_repr) + mock_stimulus_file_instance = mock_stimulus_file.from_json(dict_repr) + assert obt._stimulus_file == mock_stimulus_file_instance + + mock_stimulus_timestamps.from_json.assert_called_once_with(dict_repr) + mock_stimulus_timestamps_instance = mock_stimulus_timestamps.from_json( + dict_repr + ) + assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance + + mock_get_running_speed_df.assert_called_once_with( + data=mock_stimulus_file_instance.data, + time=mock_stimulus_timestamps_instance.value, + lowpass=filtered, + zscore_threshold=zscore_threshold + ) + + assert obt._filtered == filtered + pd.testing.assert_frame_equal(obt.value, expected_running_df) + + +@pytest.mark.parametrize( + "stimulus_file, stimulus_file_to_json_ret, " + "stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected", + [ + # Test to_json with both stimulus_file and sync_file + ( + # stimulus_file + create_autospec(StimulusFile, instance=True), + # stimulus_file_to_json_ret + {"behavior_stimulus_file": "stim.pkl"}, + # stimulus_timestamps + create_autospec(StimulusTimestamps, instance=True), + # stimulus_timestamps_to_json_ret + {"sync_file": "sync.h5"}, + # raises + False, + # expected + {"behavior_stimulus_file": "stim.pkl", "sync_file": "sync.h5"} + ), + # Test to_json without stimulus_file + ( + # stimulus_file + None, + # stimulus_file_to_json_ret + None, + # stimulus_timestamps + create_autospec(StimulusTimestamps, instance=True), + # stimulus_timestamps_to_json_ret + {"sync_file": "sync.h5"}, + # raises + "RunningSpeed DataObject lacks information about", + # expected + None + ), + # Test to_json without stimulus_timestamps + ( + # stimulus_file + create_autospec(StimulusFile, instance=True), + # stimulus_file_to_json_ret + {"behavior_stimulus_file": "stim.pkl"}, + # stimulus_timestamps_to_json_ret + None, + # sync_file_to_json_ret + None, + # raises + "RunningSpeed DataObject lacks information about", + # expected + None + ), + ] +) +def test_running_speed_to_json( + stimulus_file, stimulus_file_to_json_ret, + stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected +): + if stimulus_file is not None: + stimulus_file.to_json.return_value = stimulus_file_to_json_ret + if stimulus_timestamps is not None: + stimulus_timestamps.to_json.return_value = ( + stimulus_timestamps_to_json_ret + ) + + running_speed = RunningSpeed( + running_speed=None, + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps + ) + + if raises: + with pytest.raises(RuntimeError, match=raises): + _ = running_speed.to_json() + else: + obt = running_speed.to_json() + assert obt == expected + + +@pytest.mark.parametrize("behavior_session_id", [12345, 1234]) +@pytest.mark.parametrize("filtered", [True, False]) +@pytest.mark.parametrize("zscore_threshold", [1.0, 4.2]) +@pytest.mark.parametrize( + "returned_running_df, expected_running_df", + [ + ( + # returned_running_df + pd.DataFrame( + {"timestamps": [1, 2], "speed": [3, 4]} + ).set_index("timestamps"), + # expected_running_df + pd.DataFrame( + {"timestamps": [1, 2], "speed": [3, 4]} + ), + ), + ( + # returned_running_df + pd.DataFrame( + {"timestamps": [1, 2], "speed": [3, 4]} + ).set_index("timestamps"), + # expected_running_df + pd.DataFrame( + {"timestamps": [1, 2], "speed": [3, 4]} + ), + ) + ] +) +def test_running_speed_from_lims( + monkeypatch, behavior_session_id, returned_running_df, + expected_running_df, filtered, zscore_threshold +): + mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) + + mock_stimulus_file = create_autospec(StimulusFile) + mock_stimulus_timestamps = create_autospec(StimulusTimestamps) + mock_get_running_speed_df = create_autospec(get_running_df) + mock_get_running_speed_df.return_value = returned_running_df + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_speed.StimulusFile", + mock_stimulus_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_speed.StimulusTimestamps", + mock_stimulus_timestamps + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".running_speed.running_speed.get_running_df", + mock_get_running_speed_df + ) + obt = RunningSpeed.from_lims( + mock_db_conn, behavior_session_id, filtered, + zscore_threshold + ) + + mock_stimulus_file.from_lims.assert_called_once_with( + mock_db_conn, behavior_session_id + ) + mock_stimulus_file_instance = mock_stimulus_file.from_lims( + mock_db_conn, behavior_session_id + ) + assert obt._stimulus_file == mock_stimulus_file_instance + + mock_stimulus_timestamps.from_stimulus_file.assert_called_once_with( + mock_stimulus_file_instance + ) + mock_stimulus_timestamps_instance = mock_stimulus_timestamps.\ + from_stimulus_file(stimulus_file=mock_stimulus_file) + assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance + + mock_get_running_speed_df.assert_called_once_with( + data=mock_stimulus_file_instance.data, + time=mock_stimulus_timestamps_instance.value, + lowpass=filtered, + zscore_threshold=zscore_threshold + ) + + assert obt._filtered == filtered + pd.testing.assert_frame_equal(obt.value, expected_running_df) + + +# Fixtures: +# nwbfile: +# test/brain_observatory/behavior/conftest.py +# data_object_roundtrip_fixture: +# test/brain_observatory/behavior/data_objects/conftest.py +@pytest.mark.parametrize("roundtrip", [True, False]) +@pytest.mark.parametrize("filtered", [True, False]) +@pytest.mark.parametrize("running_speed_data", [ + (pd.DataFrame({"timestamps": [3.0, 4.0], "speed": [5.0, 6.0]})), +]) +def test_running_speed_nwb_roundtrip( + nwbfile, data_object_roundtrip_fixture, roundtrip, running_speed_data, + filtered +): + running_speed = RunningSpeed( + running_speed=running_speed_data, filtered=filtered + ) + nwbfile = running_speed.to_nwb(nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile, RunningSpeed, filtered=filtered + ) + else: + obt = RunningSpeed.from_nwb(nwbfile, filtered=filtered) + + pd.testing.assert_frame_equal(obt.value, running_speed_data) diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_stimulus_timestamps.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_stimulus_timestamps.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcd9274a99bf425bf4c24c080fc537154e530830 GIT binary patch literal 6398 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_timestamps_processing.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_timestamps_processing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c09ddb162fc1561c72686adc937693bd3d560bf4 GIT binary patch literal 2158 zcmcgtO^g&p6z=Mop6U79U6);0RzN^dMqviQHA>W3ASRk9_!~@Tw5{zbdYb7!t7{f! z(`$klWl8uk8oih}6HF8}B&ZxT@c_nyH@x`M2@qp2u0ld$OhgX&s%LkZ;3nRzNxgbi z@4c$2_kHzxOQDdJpt(o)Vg%aHVlvwnfHDd__zMJ)2(l#yX~>Z^8Hu@UC$wZdDw+ag z!cIA9E$yh98rze0#>r|~BvEBou9YVWNs%;BX|h!y8ImPAk|zbyW2V~3ihr@Cm-LaF zNIzLX2FRe9Zlj%YSKLCfhzya%WSHDcmXM`n8M(#G-Vnc>tRO4Ntz;EhO>QH%lQpDh z=EOdx+?L55<jz;5eMsw>`B!VnI#MEKvffO92Lg|~$cEUXm&i{^#f{T&d#NZ#y#}M0 zQyn+B7x>hO@{cpmr;Ilr^Njj7@K|nAu8+|g9=ANE2i$TRb|cVXqyfi{A4E%qhv(Ot z!F=W-iu$$-<I@na*|toVvWb4bZtDbdymmR=1IKboBE{m=2{d)~EG=iboU(Cj2Tox9 znvf)GT8Q6-_+5yLLR<o2ira`bqg<|-BhP>FNM4pk&DL=F?5dPHtMrYU+3%0~4`c^M z&BLevTvP2G8a3a(cI2h22iA|8TVA+uX5~kq;MSYxUi=W0+IPiMAAAN%=1R-_RIE(B z`c84vC!jq1)5O5>_d$96Qdk)|4$3|IuVredLHXuF<-PM_<%a_o?|b+1k&1c5KY45r zwJYZMx9z2Sr;b(3%egBj-pHM(n2XQ;vLV`jvSJ>ZI`>E6t<NjwYpcuQp&!4jm}gcD z)}QM=1wOU?eCqD6D(3lttNzH2uPcV!xv>P-my*!8LJyXJ;8F-wn3Oqc$)Owq_`wiQ zyo`thz@u%&BopqD?D~<4ZQHQDfJQx=g8)#sJoh2SJXTC->MTT&ItNk08{@|$R)F}w zKi;~j`V7PbRb0cQG=_I$w^`lnV#9L@-dLsXcu)l@xq$&PrbqQrYpfao%<Ft?)Uin+ z*0#Ze)XN;$R32m4a&>PEwjIaZW6km`8OnkzVA%y+3Ci=ZFy5exmAcP7g9d@+nkBy( ztrq+1|3&4z$f3xNv_?g&7siQYLDMyKAM@IEs&*YSv9Qb?zwE$c(PPh@mQ72wk!b|M z(*h&GS;-JWG!=RVdW_aMC|u$Q&`N}fUGij-CqkKs;vgSHlS-)YWSHECbS0EpskU@@ zcrq2HT4@5_Z75e<4Ml8v2NbR+q$j0kCD<hsB9c6akQ6GdY+C{^C{tlNgfbB@UYOy5 zvQ6uUr|2<CbVhlDxjH;Fc&qvAvj&}jwGKX|e?e24g{IUEP3d}FD9wXXm$@6D8|y<6 zX_>if7JHb;BTES($~P0qjFP<RQ*Du9TfPsM5QlZ)5~YELobKUKI-neL&X@vGT0f3? zt{dWFMBi=k+Kp?TYfvU|Vge{8J|#s}%Q>D~r%fP&QJeX5f)v_<*~ig!xV9+fL#HH) zgy^_a_q4&-Ff-FF7b+;6rWJs!anaR<Jwgr>OpM=INA$onS~<tz&d&4X_g?S|hCxUv z6{V1j@^V(rq9l?NDY;+HBcSyVSc`pHq2XFw>{t?Kc2X=7t0`{7@tbi5w3OczE*kw` zcn}w+4o>Ul4vaqnF1F`kV4PaPlb9P((!s2*<$TPrLpif1Xry4qa5H|%@x8lJDvB73 x^QzwOc%)&|2gREW)`IAhRiw&&iF`s;WXNI)ElefRK)R!=urdJiJX)4f(LcEZsLcQX literal 0 HcmV?d00001 diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py new file mode 100644 index 0000000000..9eb01fdaf5 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py @@ -0,0 +1,312 @@ +from pathlib import Path + +import pytest +from unittest.mock import create_autospec + +import numpy as np + +from allensdk.internal.api import PostgresQueryMixin +from allensdk.brain_observatory.behavior.data_files import ( + StimulusFile, SyncFile +) +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .stimulus_timestamps.timestamps_processing import ( + get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps) +from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps + + +@pytest.mark.parametrize("dict_repr, has_pkl, has_sync", [ + # Test where input json only has "behavior_stimulus_file" + ( + # dict_repr + { + "behavior_stimulus_file": "mock_stimulus_file.pkl" + }, + # has_pkl + True, + # has_sync + False + ), + # Test where input json has both "behavior_stimulus_file" and "sync_file" + ( + # dict_repr + { + "behavior_stimulus_file": "mock_stimulus_file.pkl", + "sync_file": "mock_sync_file.h5" + }, + # has_pkl + True, + # has_sync + True + ), +]) +def test_stimulus_timestamps_from_json( + monkeypatch, dict_repr, has_pkl, has_sync +): + mock_stimulus_file = create_autospec(StimulusFile) + mock_sync_file = create_autospec(SyncFile) + + mock_get_behavior_stimulus_timestamps = create_autospec( + get_behavior_stimulus_timestamps + ) + mock_get_ophys_stimulus_timestamps = create_autospec( + get_ophys_stimulus_timestamps + ) + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps.StimulusFile", + mock_stimulus_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps.SyncFile", + mock_sync_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps" + ".get_behavior_stimulus_timestamps", + mock_get_behavior_stimulus_timestamps + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps" + ".get_ophys_stimulus_timestamps", + mock_get_ophys_stimulus_timestamps + ) + mock_stimulus_file_instance = mock_stimulus_file.from_json(dict_repr) + ts_from_stim = StimulusTimestamps.from_stimulus_file( + stimulus_file=mock_stimulus_file_instance) + + if has_pkl and has_sync: + mock_sync_file_instance = mock_sync_file.from_json(dict_repr) + ts_from_sync = StimulusTimestamps.from_sync_file( + sync_file=mock_sync_file_instance) + + if has_pkl and has_sync: + mock_get_ophys_stimulus_timestamps.assert_called_once_with( + sync_path=mock_sync_file_instance.filepath + ) + assert ts_from_sync._sync_file == mock_sync_file_instance + else: + assert ts_from_stim._stimulus_file == mock_stimulus_file_instance + mock_get_behavior_stimulus_timestamps.assert_called_once_with( + stimulus_pkl=mock_stimulus_file_instance.data + ) + + +def test_stimulus_timestamps_from_json2(): + dir = Path(__file__).parent.parent.resolve() + test_data_dir = dir / 'test_data' + sf_path = test_data_dir / 'stimulus_file.pkl' + + sf = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(sf_path)}) + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=sf) + expected = np.array([0.016 * i for i in range(11)]) + assert np.allclose(expected, stimulus_timestamps.value) + + +def test_stimulus_timestamps_from_json3(): + """ + Test that StimulusTimestamps.from_stimulus_file + just returns the sum of the intervalsms field in the + behavior stimulus pickle file, padded with a zero at the + first timestamp. + """ + dir = Path(__file__).parent.parent.resolve() + test_data_dir = dir / 'test_data' + sf_path = test_data_dir / 'stimulus_file.pkl' + + sf = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(sf_path)}) + + sf._data['items']['behavior']['intervalsms'] = [0.1, 0.2, 0.3, 0.4] + + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=sf) + + expected = np.array([0., 0.0001, 0.0003, 0.0006, 0.001]) + np.testing.assert_array_almost_equal(stimulus_timestamps.value, + expected, + decimal=10) + + +@pytest.mark.parametrize( + "stimulus_file, stimulus_file_to_json_ret, " + "sync_file, sync_file_to_json_ret, raises, expected", + [ + # Test to_json with both stimulus_file and sync_file + ( + # stimulus_file + create_autospec(StimulusFile, instance=True), + # stimulus_file_to_json_ret + {"behavior_stimulus_file": "stim.pkl"}, + # sync_file + create_autospec(SyncFile, instance=True), + # sync_file_to_json_ret + {"sync_file": "sync.h5"}, + # raises + False, + # expected + {"behavior_stimulus_file": "stim.pkl", "sync_file": "sync.h5"} + ), + # Test to_json with only stimulus_file + ( + # stimulus_file + create_autospec(StimulusFile, instance=True), + # stimulus_file_to_json_ret + {"behavior_stimulus_file": "stim.pkl"}, + # sync_file + None, + # sync_file_to_json_ret + None, + # raises + False, + # expected + {"behavior_stimulus_file": "stim.pkl"} + ), + # Test to_json without stimulus_file nor sync_file + ( + # stimulus_file + None, + # stimulus_file_to_json_ret + None, + # sync_file + None, + # sync_file_to_json_ret + None, + # raises + "StimulusTimestamps DataObject lacks information about", + # expected + None + ), + ] +) +def test_stimulus_timestamps_to_json( + stimulus_file, stimulus_file_to_json_ret, + sync_file, sync_file_to_json_ret, raises, expected +): + if stimulus_file is not None: + stimulus_file.to_json.return_value = stimulus_file_to_json_ret + if sync_file is not None: + sync_file.to_json.return_value = sync_file_to_json_ret + + stimulus_timestamps = StimulusTimestamps( + timestamps=None, + stimulus_file=stimulus_file, + sync_file=sync_file + ) + + if raises: + with pytest.raises(RuntimeError, match=raises): + _ = stimulus_timestamps.to_json() + else: + obt = stimulus_timestamps.to_json() + assert obt == expected + + +@pytest.mark.parametrize("behavior_session_id, ophys_experiment_id", [ + ( + 12345, + None + ), + ( + 1234, + 5678 + ) +]) +def test_stimulus_timestamps_from_lims( + monkeypatch, behavior_session_id, ophys_experiment_id +): + mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) + + mock_stimulus_file = create_autospec(StimulusFile) + mock_sync_file = create_autospec(SyncFile) + + mock_get_behavior_stimulus_timestamps = create_autospec( + get_behavior_stimulus_timestamps + ) + mock_get_ophys_stimulus_timestamps = create_autospec( + get_ophys_stimulus_timestamps + ) + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps.StimulusFile", + mock_stimulus_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps.SyncFile", + mock_sync_file + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps" + ".get_behavior_stimulus_timestamps", + mock_get_behavior_stimulus_timestamps + ) + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.stimulus_timestamps" + ".get_ophys_stimulus_timestamps", + mock_get_ophys_stimulus_timestamps + ) + mock_stimulus_file_instance = mock_stimulus_file.from_lims( + mock_db_conn, behavior_session_id + ) + ts_from_stim = StimulusTimestamps.from_stimulus_file( + stimulus_file=mock_stimulus_file_instance) + assert ts_from_stim._stimulus_file == mock_stimulus_file_instance + + if behavior_session_id is not None and ophys_experiment_id is not None: + mock_sync_file_instance = mock_sync_file.from_lims( + mock_db_conn, ophys_experiment_id + ) + ts_from_sync = StimulusTimestamps.from_sync_file( + sync_file=mock_sync_file_instance) + + if behavior_session_id is not None and ophys_experiment_id is not None: + mock_get_ophys_stimulus_timestamps.assert_called_once_with( + sync_path=mock_sync_file_instance.filepath + ) + assert ts_from_sync._sync_file == mock_sync_file_instance + else: + mock_stimulus_file.from_lims.assert_called_with( + mock_db_conn, behavior_session_id + ) + mock_get_behavior_stimulus_timestamps.assert_called_once_with( + stimulus_pkl=mock_stimulus_file_instance.data + ) + + +# Fixtures: +# nwbfile: +# test/brain_observatory/behavior/conftest.py +# data_object_roundtrip_fixture: +# test/brain_observatory/behavior/data_objects/conftest.py +@pytest.mark.parametrize('roundtrip, stimulus_timestamps_data', [ + (True, np.array([1, 2, 3, 4, 5])), + (True, np.array([6, 7, 8, 9, 10])), + (False, np.array([11, 12, 13, 14, 15])), + (False, np.array([16, 17, 18, 19, 20])) +]) +def test_stimulus_timestamps_nwb_roundtrip( + nwbfile, data_object_roundtrip_fixture, roundtrip, stimulus_timestamps_data +): + stimulus_timestamps = StimulusTimestamps( + timestamps=stimulus_timestamps_data + ) + nwbfile = stimulus_timestamps.to_nwb(nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture(nwbfile, StimulusTimestamps) + else: + obt = StimulusTimestamps.from_nwb(nwbfile) + + assert np.allclose(obt.value, stimulus_timestamps_data) diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py new file mode 100644 index 0000000000..4e6d53dcab --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py @@ -0,0 +1,80 @@ +from unittest.mock import create_autospec, PropertyMock + +import numpy as np +import pytest + +from allensdk.brain_observatory.behavior.data_objects.timestamps \ + .stimulus_timestamps.timestamps_processing import ( + get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps) +from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner + + +@pytest.mark.parametrize("pkl_data, expected", [ + # Extremely basic test case + ( + # pkl_data + { + "items": { + "behavior": { + "intervalsms": np.array([ + 1000, 1001, 1002, 1003, 1004, 1005 + ]) + } + } + }, + # expected + np.array([ + 0.0, 1.0, 2.001, 3.003, 4.006, 5.01, 6.015 + ]) + ), + # More realistic test case + ( + # pkl_data + { + "items": { + "behavior": { + "intervalsms": np.array([ + 16.5429, 16.6685, 16.66580001, 16.70569999, + 16.6668, + 16.69619999, 16.655, 16.6805, 16.75940001, 16.6831 + ]) + } + } + }, + # expected + np.array([ + 0.0, 0.0165429, 0.0332114, 0.0498772, 0.0665829, 0.0832497, + 0.0999459, 0.1166009, 0.1332814, 0.1500408, 0.1667239 + ]) + ) +]) +def test_get_behavior_stimulus_timestamps(pkl_data, expected): + obt = get_behavior_stimulus_timestamps(pkl_data) + assert np.allclose(obt, expected) + + +@pytest.mark.parametrize("sync_path, expected_timestamps", [ + ("/tmp/mock_sync_file.h5", [1, 2, 3]), +]) +def test_get_ophys_stimulus_timestamps( + monkeypatch, sync_path, expected_timestamps +): + mock_ophys_time_aligner = create_autospec(OphysTimeAligner) + mock_aligner_instance = mock_ophys_time_aligner.return_value + property_mock = PropertyMock( + return_value=(expected_timestamps, "ignored_return_val") + ) + type(mock_aligner_instance).clipped_stim_timestamps = property_mock + + with monkeypatch.context() as m: + m.setattr( + "allensdk.brain_observatory.behavior.data_objects" + ".timestamps.stimulus_timestamps.timestamps_processing" + ".OphysTimeAligner", + mock_ophys_time_aligner + ) + obt = get_ophys_stimulus_timestamps(sync_path) + + mock_ophys_time_aligner.assert_called_with(sync_file=sync_path) + property_mock.assert_called_once() + assert np.allclose(obt, expected_timestamps) diff --git a/test/brain_observatory/behavior/data_objects/test_cell_specimens.py b/test/brain_observatory/behavior/data_objects/test_cell_specimens.py new file mode 100644 index 0000000000..41da57a8bc --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_cell_specimens.py @@ -0,0 +1,273 @@ +import json +from datetime import datetime +from pathlib import Path +import numpy as np +import pynwb +import pandas as pd + +import pytest + +from allensdk.brain_observatory.behavior.data_objects import DataObject +from allensdk.brain_observatory.behavior.data_objects.cell_specimens.\ + cell_specimens import CellSpecimens, CellSpecimenMeta +from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ + .rois_mixin import \ + RoisMixin +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.imaging_plane import \ + ImagingPlane +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .ophys_timestamps import \ + OphysTimestamps +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator +from allensdk.test.brain_observatory.behavior.data_objects.metadata\ + .test_behavior_ophys_metadata import \ + TestBOM + + +class TestLims: + @classmethod + def setup_class(cls): + cls.ophys_experiment_id = 994278291 + cls.expected_meta = CellSpecimenMeta( + emission_lambda=520.0, + imaging_plane=ImagingPlane( + excitation_lambda=910.0, + indicator='GCaMP6f', + ophys_frame_rate=10.0, + targeted_structure='VISp' + ) + ) + + def setup_method(self, method): + marks = getattr(method, 'pytestmark', None) + if marks: + marks = [m.name for m in marks] + + # Will only create a dbconn if the test requires_bamboo + if 'requires_bamboo' in marks: + self.dbconn = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP) + + @pytest.mark.requires_bamboo + def test_from_lims(self): + number_of_frames = 140296 + ots = OphysTimestamps(timestamps=np.linspace(start=.1, + stop=.1*number_of_frames, + num=number_of_frames)) + csp = CellSpecimens.from_lims( + ophys_experiment_id=self.ophys_experiment_id, lims_db=self.dbconn, + ophys_timestamps=ots, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) + assert not csp.table.empty + assert not csp.events.empty + assert not csp.dff_traces.empty + assert not csp.corrected_fluorescence_traces.empty + assert csp.meta == self.expected_meta + + +class TestJson: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + with open(test_data_dir / 'test_input.json') as f: + dict_repr = json.load(f) + dict_repr = dict_repr['session_data'] + dict_repr['sync_file'] = str(test_data_dir / 'sync.h5') + dict_repr['behavior_stimulus_file'] = str(test_data_dir / + 'behavior_stimulus_file.pkl') + dict_repr['dff_file'] = str(test_data_dir / 'demix_file.h5') + dict_repr['demix_file'] = str(test_data_dir / 'demix_file.h5') + dict_repr['events_file'] = str(test_data_dir / 'events.h5') + + cls.dict_repr = dict_repr + cls.expected_meta = CellSpecimenMeta( + emission_lambda=520.0, + imaging_plane=ImagingPlane( + excitation_lambda=910.0, + indicator='GCaMP6f', + ophys_frame_rate=10.0, + targeted_structure='VISp' + ) + ) + cls.ophys_timestamps = OphysTimestamps( + timestamps=np.array([.1, .2, .3])) + + def test_from_json(self): + csp = CellSpecimens.from_json( + dict_repr=self.dict_repr, + ophys_timestamps=self.ophys_timestamps, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) + assert not csp.table.empty + assert not csp.events.empty + assert not csp.dff_traces.empty + assert not csp.corrected_fluorescence_traces.empty + assert csp.meta == self.expected_meta + + @pytest.mark.parametrize('data', + ('dff_traces', + 'corrected_fluorescence_traces', + 'events')) + def test_roi_data_same_order_as_cell_specimen_table(self, data): + """tests that roi data are in same order as cell specimen table""" + csp = CellSpecimens.from_json( + dict_repr=self.dict_repr, + ophys_timestamps=self.ophys_timestamps, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) + private_attr = getattr(csp, f'_{data}') + public_attr = getattr(csp, data) + + # Events stores cell_roi_id as column whereas traces is index + data_cell_roi_ids = getattr( + private_attr.value, + 'cell_roi_id' if data == 'events' else 'index').values + + current_order = np.where(data_cell_roi_ids == + csp._cell_specimen_table['cell_roi_id'])[0] + + # make sure same order + private_attr._value = private_attr.value\ + .iloc[current_order] + + # rearrange + private_attr._value = private_attr._value.iloc[[1, 0]] + + # make sure same order + np.testing.assert_array_equal(public_attr.index, csp.table.index) + + @pytest.mark.parametrize('extra_in_trace', (True, False)) + @pytest.mark.parametrize('trace_type', + ('dff_traces', + 'corrected_fluorescence_traces')) + def test_trace_rois_different_than_cell_specimen_table(self, trace_type, + extra_in_trace): + """check that an exception is raised if there is a mismatch in rois + between cell specimen table and traces""" + csp = CellSpecimens.from_json( + dict_repr=self.dict_repr, + ophys_timestamps=self.ophys_timestamps, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) + private_trace_attr = getattr(csp, f'_{trace_type}') + + if extra_in_trace: + # Drop an roi from cell specimen table that is in trace + trace_rois = private_trace_attr.value.index + csp._cell_specimen_table = csp._cell_specimen_table[ + csp._cell_specimen_table['cell_roi_id'] != trace_rois[0]] + else: + # Drop an roi from trace that is in cell specimen table + csp_rois = csp._cell_specimen_table['cell_roi_id'] + private_trace_attr._value = private_trace_attr._value[ + private_trace_attr._value.index != csp_rois.iloc[0]] + + if trace_type == 'dff_traces': + trace_args = { + 'dff_traces': private_trace_attr, + 'corrected_fluorescence_traces': + csp._corrected_fluorescence_traces + } + else: + trace_args = { + 'dff_traces': csp._dff_traces, + 'corrected_fluorescence_traces': private_trace_attr + } + with pytest.raises(RuntimeError): + # construct it again using trace/table combo with different rois + CellSpecimens( + cell_specimen_table=csp._cell_specimen_table, + meta=csp._meta, + events=csp._events, + ophys_timestamps=self.ophys_timestamps, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3), + exclude_invalid_rois=False, + **trace_args + ) + + +class TestNWB: + @classmethod + def setup_class(cls): + cls.ophys_timestamps = OphysTimestamps( + timestamps=np.array([.1, .2, .3])) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + tj = TestJson() + tj.setup_class() + self.dict_repr = tj.dict_repr + + # Write metadata, since csp requires other metdata + tbom = TestBOM() + tbom.setup_class() + bom = tbom.meta + bom.to_nwb(nwbfile=self.nwbfile) + + @pytest.mark.parametrize('exclude_invalid_rois', [True, False]) + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture, + exclude_invalid_rois): + cell_specimens = CellSpecimens.from_json( + dict_repr=self.dict_repr, ophys_timestamps=self.ophys_timestamps, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3), + exclude_invalid_rois=exclude_invalid_rois) + + csp = cell_specimens._cell_specimen_table + + valid_roi_id = csp[csp['valid_roi']]['cell_roi_id'] + + cell_specimens.to_nwb(nwbfile=self.nwbfile, + ophys_timestamps=self.ophys_timestamps) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=CellSpecimens, + exclude_invalid_rois=exclude_invalid_rois, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) + else: + obt = cell_specimens.from_nwb( + nwbfile=self.nwbfile, + exclude_invalid_rois=exclude_invalid_rois, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) + + if exclude_invalid_rois: + cell_specimens._cell_specimen_table = \ + cell_specimens._cell_specimen_table[ + cell_specimens._cell_specimen_table['cell_roi_id'] + .isin(valid_roi_id)] + + assert obt == cell_specimens + + +class TestFilterAndReorder: + @pytest.mark.parametrize('raise_if_rois_missing', (True, False)) + def test_missing_rois(self, raise_if_rois_missing): + """Tests that when dataframe missing rois, that they are ignored""" + roi_ids = np.array([1, 2]) + df = pd.DataFrame({'cell_roi_id': [1], 'foo': [2]}) + + class Rois(DataObject, RoisMixin): + def __init__(self): + super().__init__(name='test', value=df) + + rois = Rois() + if raise_if_rois_missing: + with pytest.raises(RuntimeError): + rois.filter_and_reorder( + roi_ids=roi_ids, + raise_if_rois_missing=raise_if_rois_missing) + else: + rois.filter_and_reorder( + roi_ids=roi_ids, + raise_if_rois_missing=raise_if_rois_missing) + expected = pd.DataFrame({'cell_roi_id': [1], + 'foo': [2]}) + pd.testing.assert_frame_equal(rois._value, expected) diff --git a/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json b/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json new file mode 100644 index 0000000000..ea748f3bbf --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json @@ -0,0 +1 @@ +{"rig_geometry": {"camera_position_mm": [102.8, 74.7, 31.6], "camera_rotation_deg": [0.0, 0.0, 2.8], "equipment": "CAM2P.3", "led_position": [246.0, 92.3, 52.6], "monitor_position_mm": [118.6, 86.2, 31.6], "monitor_rotation_deg": [0.0, 0.0, 0.0]}} \ No newline at end of file diff --git a/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv b/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv new file mode 100644 index 0000000000..98647b066c --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv @@ -0,0 +1,4 @@ +,x,y +0,2,-3 +1,3,-4 +2,2,-4 diff --git a/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json b/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json new file mode 100644 index 0000000000..cd7caa9ede --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json @@ -0,0 +1,13 @@ +{ + "auto_reward_volume": 0.005, + "blank_duration_sec": [0.5, 0.5], + "n_stimulus_frames": 69195, + "omitted_flash_fraction": 0.05, + "response_window_sec": [0.15, 0.75], + "reward_volume": 0.007, + "session_type": "OPHYS_4_images_A", + "stimulus": "images", + "stimulus_distribution": "geometric", + "stimulus_duration_sec": 0.25, + "task_type": "change detection" +} \ No newline at end of file diff --git a/test/brain_observatory/behavior/data_objects/test_data/test_input.json b/test/brain_observatory/behavior/data_objects/test_data/test_input.json new file mode 100644 index 0000000000..c9de2233a5 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_data/test_input.json @@ -0,0 +1,144 @@ +{ + "log_level": "DEBUG", + "session_data": { + "behavior_stimulus_file": "stimulus_file.pkl", + "ophys_experiment_id": 1234, + "ophys_session_id": 999, + "behavior_session_id": 1071270468, + "foraging_id": "968ff5ae-e0d5-4661-bb6d-242bee28c7ac", + "full_genotype": "Vip-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt", + "reporter_line": [ + "Ai148(TIT2L-GC6f-ICL-tTA2)" + ], + "driver_line": [ + "Vip-IRES-Cre" + ], + "ophys_cell_segmentation_run_id": 1080628312, + "rig_name": "CAM2P.4", + "movie_height": 512, + "movie_width": 451, + "container_id": 5678, + "surface_2p_pixel_size_um": 0.78125, + "max_projection_file": "max_projection.png", + "demix_file": "demix_file.h5", + "average_intensity_projection_image_file": "avg_projection.png", + "date_of_acquisition": "2020-12-17 10:01:12", + "external_specimen_name": 544261, + "targeted_structure": "VISp", + "targeted_depth": 175, + "stimulus_name": "OPHYS_6_images_B", + "sex": "F", + "age": "P156", + "eye_tracking_rig_geometry": { + "monitor_position_mm": [ + 118.6, + 86.2, + 31.6 + ], + "monitor_rotation_deg": [ + 0.0, + 0.0, + 0.0 + ], + "camera_position_mm": [ + 102.8, + 74.7, + 31.6 + ], + "camera_rotation_deg": [ + 0.0, + 0.0, + 2.8 + ], + "led_position": [ + 246.0, + 92.3, + 52.6 + ], + "equipment": "CAM2P.4" + }, + "eye_tracking_filepath": "/allen/programs/braintv/production/visualbehavior/prod4/specimen_1050612336/ophys_session_1071202230/eye_tracking/1071202230_ellipse.h5", + "events_file": "/allen/programs/braintv/production/visualbehavior/prod4/specimen_1050612336/ophys_session_1071202230/ophys_experiment_1071440875/1071440875_event.h5", + "imaging_plane_group": null, + "plane_group_count": 0, + "cell_specimen_table_dict": { + "cell_roi_id": { + "0": 1080639771, + "1": 1080639729, + "2": 1080639652 + }, + "cell_specimen_id": { + "0": 1086633380, + "1": 1086633339, + "2": 1086633332 + }, + "x": { + "0": 422, + "1": 185, + "2": 2 + }, + "y": { + "0": 147, + "1": 2, + "2": 336 + }, + "max_correction_up": { + "0": 20.0, + "1": 20.0, + "2": 20.0 + }, + "max_correction_right": { + "0": 10.0, + "1": 10.0, + "2": 10.0 + }, + "max_correction_down": { + "0": 10.0, + "1": 10.0, + "2": 10.0 + }, + "max_correction_left": { + "0": 0.0, + "1": 0.0, + "2": 0.0 + }, + "valid_roi": { + "0": true, + "1": true, + "2": false + }, + "height": { + "0": 1, + "1": 1, + "2": 1 + }, + "width": { + "0": 1, + "1": 1, + "2": 1 + }, + "mask_image_plane": { + "0": 0, + "1": 0, + "2": 0 + }, + "roi_mask": { + "0": [ + [ + true + ] + ], + "1": [ + [ + true + ] + ], + "2": [ + [ + true + ] + ] + } + } + } +} \ No newline at end of file diff --git a/test/brain_observatory/behavior/data_objects/test_licks.py b/test/brain_observatory/behavior/data_objects/test_licks.py new file mode 100644 index 0000000000..cc97a936bd --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_licks.py @@ -0,0 +1,182 @@ +import pickle +from datetime import datetime +from pathlib import Path +import numpy as np +import pandas as pd +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.licks import Licks + + +class TestFromStimulusFile: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + cls.stimulus_file = StimulusFile( + filepath=test_data_dir / 'behavior_stimulus_file.pkl') + expected = pd.read_pickle(str(test_data_dir / 'licks.pkl')) + cls.expected = Licks(licks=expected) + + def test_from_stimulus_file(self): + st = StimulusTimestamps.from_stimulus_file( + stimulus_file=self.stimulus_file) + licks = Licks.from_stimulus_file(stimulus_file=self.stimulus_file, + stimulus_timestamps=st) + assert licks == self.expected + + def test_from_stimulus_file2(self, tmpdir): + """ + Test that Licks.from_stimulus_file returns a dataframe + of licks whose timestamps are based on their frame number + with respect to the stimulus_timestamps + """ + stimulus_filepath = self._create_test_stimulus_file( + lick_events=[12, 15, 90, 136], tmpdir=tmpdir) + stimulus_file = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) + timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) + licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, + stimulus_timestamps=timestamps) + + expected_dict = {'timestamps': [0.12, 0.15, 0.90, 1.36], + 'frame': [12, 15, 90, 136]} + expected_df = pd.DataFrame(expected_dict) + assert expected_df.columns.equals(licks.value.columns) + np.testing.assert_array_almost_equal( + expected_df.timestamps.to_numpy(), + licks.value['timestamps'].to_numpy(), + decimal=10) + np.testing.assert_array_almost_equal(expected_df.frame.to_numpy(), + licks.value['frame'].to_numpy(), + decimal=10) + + def test_empty_licks(self, tmpdir): + """ + Test that Licks.from_stimulus_file in the case where + there are no licks + """ + + stimulus_filepath = self._create_test_stimulus_file( + lick_events=[], tmpdir=tmpdir) + stimulus_file = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) + timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) + licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, + stimulus_timestamps=timestamps) + + expected_dict = {'timestamps': [], + 'frame': []} + expected_df = pd.DataFrame(expected_dict) + assert expected_df.columns.equals(licks.value.columns) + np.testing.assert_array_equal(expected_df.timestamps.to_numpy(), + licks.value['timestamps'].to_numpy()) + np.testing.assert_array_equal(expected_df.frame.to_numpy(), + licks.value['frame'].to_numpy()) + + def test_get_licks_excess(self, tmpdir): + """ + Test that Licks.from_stimulus_file + in the case where + there is an extra frame at the end of the trial log and the mouse + licked on that frame + + https://github.com/AllenInstitute/visual_behavior_analysis/blob + /master/visual_behavior/translator/foraging2/extract.py#L640-L647 + """ + stimulus_filepath = self._create_test_stimulus_file( + lick_events=[12, 15, 90, 136, 200], # len(timestamps) == 200, + tmpdir=tmpdir) + stimulus_file = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) + timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) + licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, + stimulus_timestamps=timestamps) + + expected_dict = {'timestamps': [0.12, 0.15, 0.90, 1.36], + 'frame': [12, 15, 90, 136]} + expected_df = pd.DataFrame(expected_dict) + assert expected_df.columns.equals(licks.value.columns) + np.testing.assert_array_almost_equal( + expected_df.timestamps.to_numpy(), + licks.value['timestamps'].to_numpy(), + decimal=10) + np.testing.assert_array_almost_equal(expected_df.frame.to_numpy(), + licks.value['frame'].to_numpy(), + decimal=10) + + def test_get_licks_failure(self, tmpdir): + stimulus_filepath = self._create_test_stimulus_file( + lick_events=[12, 15, 90, 136, 201], # len(timestamps) == 200, + tmpdir=tmpdir) + stimulus_file = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) + timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) + + with pytest.raises(IndexError): + Licks.from_stimulus_file(stimulus_file=stimulus_file, + stimulus_timestamps=timestamps) + + @staticmethod + def _create_test_stimulus_file(lick_events, tmpdir): + trial_log = [ + {'licks': [(-1.0, 100), (-1.0, 200)]}, + {'licks': [(-1.0, 300), (-1.0, 400)]}, + {'licks': [(-1.0, 500), (-1.0, 600)]} + ] + + lick_events = [{'lick_events': lick_events}] + + data = { + 'items': { + 'behavior': { + 'trial_log': trial_log, + 'lick_sensors': lick_events + } + }, + } + tmp_path = tmpdir / 'stimulus_file.pkl' + with open(tmp_path, 'wb') as f: + pickle.dump(data, f) + f.seek(0) + + return tmp_path + + +class TestNWB: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + stimulus_file = StimulusFile( + filepath=test_data_dir / 'behavior_stimulus_file.pkl') + ts = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file) + cls.licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, + stimulus_timestamps=ts) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.licks.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=Licks) + else: + obt = self.licks.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.licks diff --git a/test/brain_observatory/behavior/data_objects/test_motion_correction.py b/test/brain_observatory/behavior/data_objects/test_motion_correction.py new file mode 100644 index 0000000000..57994bc7fe --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_motion_correction.py @@ -0,0 +1,116 @@ +import json +from datetime import datetime +from pathlib import Path + +import numpy as np +import pandas as pd +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_files\ + .rigid_motion_transform_file import \ + RigidMotionTransformFile +from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ + .cell_specimens import \ + CellSpecimens +from allensdk.brain_observatory.behavior.data_objects.motion_correction \ + import \ + MotionCorrection +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .ophys_timestamps import \ + OphysTimestamps +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest +from allensdk.test.brain_observatory.behavior.data_objects.metadata\ + .test_behavior_ophys_metadata import \ + TestBOM +from allensdk.test.brain_observatory.behavior.data_objects.nwb_input_json \ + import \ + NwbInputJson + + +class TestFromDataFile(LimsTest): + @classmethod + def setup_class(cls): + cls.ophys_experiment_id = 994278291 + + @pytest.mark.requires_bamboo + def test_from_data_file(self): + motion_correction_file = RigidMotionTransformFile.from_lims( + ophys_experiment_id=self.ophys_experiment_id, db=self.dbconn) + mc = MotionCorrection.from_data_file( + rigid_motion_transform_file=motion_correction_file) + assert not mc.value.empty + expected_cols = ['x', 'y'] + assert len(mc.value.columns) == 2 + for c in expected_cols: + assert c in mc.value.columns + + +class TestJson: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + with open(test_data_dir / 'test_input.json') as f: + dict_repr = json.load(f) + dict_repr = dict_repr['session_data'] + dict_repr['rigid_motion_transform_file'] = \ + str(test_data_dir / 'rigid_motion_transform_file.csv') + cls.dict_repr = dict_repr + cls.motion_correction_file = \ + RigidMotionTransformFile.from_json(dict_repr=dict_repr) + expected = pd.DataFrame({'x': [2, 3, 2], 'y': [-3, -4, -4]}) + cls.expected = MotionCorrection(motion_correction=expected) + + def test_from_json(self): + mc = MotionCorrection.from_data_file( + rigid_motion_transform_file=self.motion_correction_file) + assert mc == self.expected + + +class TestNWB: + @classmethod + def setup_class(cls): + df = pd.DataFrame({'x': [2, 3, 2], 'y': [-3, -4, -4]}) + cls.motion_correction = MotionCorrection(motion_correction=df) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + def _write_cell_specimen(): + # write metadata + tbom = TestBOM() + tbom.setup_class() + bom = tbom.meta + bom.to_nwb(nwbfile=self.nwbfile) + + # write cell specimen + ij = NwbInputJson() + ophys_timestamps = OphysTimestamps( + timestamps=np.array([.1, .2, .3])) + csp = CellSpecimens.from_json( + dict_repr=ij.dict_repr, ophys_timestamps=ophys_timestamps, + segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) + csp.to_nwb(nwbfile=self.nwbfile, ophys_timestamps=ophys_timestamps) + + # need to write cell specimen, since it is a dependency + _write_cell_specimen() + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.motion_correction.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=MotionCorrection) + else: + obt = self.motion_correction.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.motion_correction diff --git a/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py b/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py new file mode 100644 index 0000000000..bd1281e9bc --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py @@ -0,0 +1,91 @@ +from pathlib import Path + +import numpy as np +import pytest + +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_objects.timestamps \ + .ophys_timestamps import \ + OphysTimestamps, OphysTimestampsMultiplane +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest + + +class TestFromSyncFile(LimsTest): + def setup_method(self, method): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + self.sync_file = SyncFile(filepath=str(test_data_dir / 'sync.h5')) + + def test_from_sync_file(self): + self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} + ts = OphysTimestamps.from_sync_file(sync_file=self.sync_file)\ + .validate(number_of_frames=3) + expected = np.array([.1, .2, .3]) + np.testing.assert_equal(ts.value, expected) + + def test_too_long_single_plane(self): + """test that timestamps are truncated for single plane data""" + self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} + ts = OphysTimestamps.from_sync_file(sync_file=self.sync_file)\ + .validate(number_of_frames=2) + expected = np.array([.1, .2]) + np.testing.assert_equal(ts.value, expected) + + def test_too_long_multi_plane(self): + """test that exception raised when timestamps longer than # frames + for multiplane data""" + self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} + with pytest.raises(RuntimeError): + OphysTimestampsMultiplane.from_sync_file(sync_file=self.sync_file, + group_count=2, + plane_group=0)\ + .validate(number_of_frames=1) + + def test_too_short(self): + """test when timestamps shorter than # frames""" + self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} + with pytest.raises(RuntimeError): + OphysTimestamps.from_sync_file(sync_file=self.sync_file)\ + .validate(number_of_frames=4) + + def test_multiplane(self): + """test timestamps properly extracted when multiplane""" + self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3, .4])} + ts = OphysTimestampsMultiplane.from_sync_file(sync_file=self.sync_file, + group_count=2, + plane_group=0)\ + .validate(number_of_frames=2) + expected = np.array([.1, .3]) + np.testing.assert_equal(ts.value, expected) + + @pytest.mark.parametrize( + "timestamps,plane_group,group_count,expected", + [ + (np.ones(10), 1, 0, np.ones(10)), + (np.ones(10), 1, 0, np.ones(10)), + # middle + (np.array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]), 1, 3, np.ones(4)), + # first + (np.array([1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]), 0, 4, np.ones(3)), + # last + (np.array([0, 1, 0, 1, 0, 1, 0, 1]), 1, 2, np.ones(4)), + # only one group + (np.ones(10), 0, 1, np.ones(10)) + ] + ) + def test_process_ophys_plane_timestamps( + self, timestamps, plane_group, group_count, expected): + """Various test cases""" + self.sync_file._data = {'ophys_frames': timestamps} + number_of_frames = len(timestamps) if group_count == 0 else \ + len(timestamps) / group_count + if group_count == 0: + ts = OphysTimestamps.from_sync_file(sync_file=self.sync_file) + else: + ts = OphysTimestampsMultiplane.from_sync_file( + sync_file=self.sync_file, group_count=group_count, + plane_group=plane_group) + ts = ts.validate(number_of_frames=number_of_frames) + np.testing.assert_array_equal(expected, ts.value) diff --git a/test/brain_observatory/behavior/data_objects/test_projections.py b/test/brain_observatory/behavior/data_objects/test_projections.py new file mode 100644 index 0000000000..e9a2cf6aee --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_projections.py @@ -0,0 +1,107 @@ +import json +from datetime import datetime +from pathlib import Path + +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_objects.projections import \ + Projections +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator + + +class TestLims: + @classmethod + def setup_class(cls): + cls.ophys_experiment_id = 994278291 + + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + cls.expected_max = Projections._from_filepath( + filepath=str(test_data_dir / 'max_projection.png'), + pixel_size=.78125) + + cls.expected_avg = Projections._from_filepath( + filepath=str(test_data_dir / 'avg_projection.png'), + pixel_size=.78125) + + def setup_method(self, method): + marks = getattr(method, 'pytestmark', None) + if marks: + marks = [m.name for m in marks] + + # Will only create a dbconn if the test requires_bamboo + if 'requires_bamboo' in marks: + self.dbconn = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP) + + @pytest.mark.requires_bamboo + def test_from_lims(self): + projections = Projections.from_lims( + ophys_experiment_id=self.ophys_experiment_id, lims_db=self.dbconn) + + assert projections.max_projection == self.expected_max + assert projections.avg_projection == self.expected_avg + + +class TestJson: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + with open(test_data_dir / 'test_input.json') as f: + dict_repr = json.load(f) + dict_repr = dict_repr['session_data'] + dict_repr['max_projection_file'] = test_data_dir / \ + dict_repr['max_projection_file'] + dict_repr['average_intensity_projection_image_file'] = \ + test_data_dir / \ + dict_repr['average_intensity_projection_image_file'] + + cls.expected_max = Projections._from_filepath( + filepath=str(test_data_dir / 'max_projection.png'), + pixel_size=.78125) + + cls.expected_avg = Projections._from_filepath( + filepath=str(test_data_dir / 'avg_projection.png'), + pixel_size=.78125) + + cls.dict_repr = dict_repr + + def test_from_json(self): + projections = Projections.from_json(dict_repr=self.dict_repr) + + assert projections.max_projection == self.expected_max + assert projections.avg_projection == self.expected_avg + + +class TestNWB: + @classmethod + def setup_class(cls): + tj = TestJson() + tj.setup_class() + cls.projections = Projections.from_json( + dict_repr=tj.dict_repr) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.projections.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=Projections) + else: + obt = self.projections.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.projections diff --git a/test/brain_observatory/behavior/data_objects/test_rewards.py b/test/brain_observatory/behavior/data_objects/test_rewards.py new file mode 100644 index 0000000000..08737eb20b --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_rewards.py @@ -0,0 +1,110 @@ +import pickle +from datetime import datetime +from pathlib import Path +import numpy as np +import pandas as pd +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest + + +class TestFromStimulusFile(LimsTest): + @classmethod + def setup_class(cls): + cls.behavior_session_id = 994174745 + + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + expected = pd.read_pickle(str(test_data_dir / 'rewards.pkl')) + cls.expected = Rewards(rewards=expected) + + @pytest.mark.requires_bamboo + def test_from_stimulus_file(self): + stimulus_file = StimulusFile.from_lims( + behavior_session_id=self.behavior_session_id, db=self.dbconn) + timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file) + rewards = Rewards.from_stimulus_file(stimulus_file=stimulus_file, + stimulus_timestamps=timestamps) + assert rewards == self.expected + + def test_from_stimulus_file2(self, tmpdir): + """ + Test that Rewards.from_stimulus_file returns + expected results (main nuance is that timestamps should be + determined by applying the reward frame as an index to + stimulus_timestamps) + """ + + def _create_dummy_stimulus_file(): + trial_log = [ + {'rewards': [(0.001, -1.0, 4)], + 'trial_params': {'auto_reward': True}}, + {'rewards': []}, + {'rewards': [(0.002, -1.0, 10)], + 'trial_params': {'auto_reward': False}} + ] + data = { + 'items': { + 'behavior': { + 'trial_log': trial_log + } + }, + } + tmp_path = tmpdir / 'stimulus_file.pkl' + with open(tmp_path, 'wb') as f: + pickle.dump(data, f) + f.seek(0) + + return tmp_path + + stimulus_filepath = _create_dummy_stimulus_file() + stimulus_file = StimulusFile.from_json( + dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) + timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) + rewards = Rewards.from_stimulus_file(stimulus_file=stimulus_file, + stimulus_timestamps=timestamps) + + expected_dict = {'volume': [0.001, 0.002], + 'timestamps': [0.04, 0.1], + 'autorewarded': [True, False]} + expected_df = pd.DataFrame(expected_dict) + expected_df = expected_df + assert expected_df.equals(rewards.value) + + +class TestNWB: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + rewards = pd.read_pickle(str(test_data_dir / 'rewards.pkl')) + cls.rewards = Rewards(rewards=rewards) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.rewards.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=Rewards) + else: + obt = self.rewards.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.rewards diff --git a/test/brain_observatory/behavior/data_objects/test_stimuli.py b/test/brain_observatory/behavior/data_objects/test_stimuli.py new file mode 100644 index 0000000000..a094ec6ad0 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_stimuli.py @@ -0,0 +1,125 @@ +from datetime import datetime +from pathlib import Path + +import pandas as pd +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.stimuli.presentations \ + import \ + Presentations as StimulusPresentations +from allensdk.brain_observatory.behavior.data_objects.stimuli.stimuli import \ + Stimuli +from allensdk.brain_observatory.behavior.data_objects.stimuli.templates \ + import \ + Templates +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest + + +class TestFromStimulusFile(LimsTest): + @classmethod + def setup_class(cls): + cls.behavior_session_id = 994174745 + + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + presentations = \ + pd.read_pickle(str(test_data_dir / 'presentations.pkl')) + templates = \ + pd.read_pickle(str(test_data_dir / 'templates.pkl')) + cls.expected_presentations = StimulusPresentations( + presentations=presentations) + cls.expected_templates = Templates(templates=templates) + + @pytest.mark.requires_bamboo + def test_from_stimulus_file(self): + stimulus_file = StimulusFile.from_lims( + behavior_session_id=self.behavior_session_id, db=self.dbconn) + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file) + stimuli = Stimuli.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + limit_to_images=['im065']) + assert stimuli.presentations == self.expected_presentations + assert stimuli.templates == self.expected_templates + + +class TestNWB: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + cls.test_data_dir = dir / 'test_data' + + presentations = \ + pd.read_pickle(str(cls.test_data_dir / 'presentations.pkl')) + templates = \ + pd.read_pickle(str(cls.test_data_dir / 'templates.pkl')) + presentations = presentations.drop('is_change', axis=1) + p = StimulusPresentations(presentations=presentations) + t = Templates(templates=templates) + cls.stimuli = Stimuli(presentations=p, templates=t) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + # Need to write stimulus timestamps first + bsf = StimulusFile( + filepath=self.test_data_dir / 'behavior_stimulus_file.pkl') + ts = StimulusTimestamps.from_stimulus_file(stimulus_file=bsf) + ts.to_nwb(nwbfile=self.nwbfile) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.stimuli.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=Stimuli) + else: + obt = Stimuli.from_nwb(nwbfile=self.nwbfile) + + # is_change different due to limit_to_images + obt.presentations.value.drop('is_change', axis=1, inplace=True) + + assert obt == self.stimuli + + +@pytest.mark.parametrize("stimulus_table, expected_table_data", [ + ({'image_index': [8, 9], + 'image_name': ['omitted', 'not_omitted'], + 'image_set': ['omitted', 'not_omitted'], + 'index': [201, 202], + 'omitted': [True, False], + 'start_frame': [231060, 232340], + 'start_time': [0, 250], + 'stop_time': [None, 1340509], + 'duration': [None, 1340259]}, + {'image_index': [8, 9], + 'image_name': ['omitted', 'not_omitted'], + 'image_set': ['omitted', 'not_omitted'], + 'index': [201, 202], + 'omitted': [True, False], + 'start_frame': [231060, 232340], + 'start_time': [0, 250], + 'stop_time': [0.25, 1340509], + 'duration': [0.25, 1340259]} + ) +]) +def test_set_omitted_stop_time(stimulus_table, expected_table_data): + stimulus_table = pd.DataFrame.from_dict(data=stimulus_table) + expected_table = pd.DataFrame.from_dict(data=expected_table_data) + stimulus_table = \ + StimulusPresentations._fill_missing_values_for_omitted_flashes( + df=stimulus_table) + assert stimulus_table.equals(expected_table) diff --git a/test/brain_observatory/behavior/data_objects/test_task_parameters.py b/test/brain_observatory/behavior/data_objects/test_task_parameters.py new file mode 100644 index 0000000000..f73f827ea0 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_task_parameters.py @@ -0,0 +1,67 @@ +import json +from datetime import datetime +from pathlib import Path +import numpy as np +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects.task_parameters import \ + TaskParameters +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest + + +class TestFromStimulusFile(LimsTest): + @classmethod + def setup_class(cls): + cls.behavior_session_id = 994174745 + + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + with open(test_data_dir / 'task_parameters.json') as f: + tp = json.load(f) + cls.expected = TaskParameters(**tp) + + @pytest.mark.requires_bamboo + def test_from_stimulus_file(self): + stimulus_file = StimulusFile.from_lims( + behavior_session_id=self.behavior_session_id, db=self.dbconn) + tp = TaskParameters.from_stimulus_file(stimulus_file=stimulus_file) + assert tp == self.expected + + +class TestNWB: + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + dir = Path(__file__).parent.resolve() + self.test_data_dir = dir / 'test_data' + + with open(self.test_data_dir / 'task_parameters.json') as f: + tp = json.load(f) + self.task_parameters = TaskParameters(**tp) + + @pytest.mark.parametrize('is_stimulus_duration_sec_nan', [True, False]) + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture, + is_stimulus_duration_sec_nan): + if is_stimulus_duration_sec_nan: + self.task_parameters._stimulus_duration_sec = np.nan + + self.task_parameters.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=TaskParameters) + else: + obt = TaskParameters.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.task_parameters diff --git a/test/brain_observatory/behavior/data_objects/test_trial_table.py b/test/brain_observatory/behavior/data_objects/test_trial_table.py new file mode 100644 index 0000000000..c82fdb37c4 --- /dev/null +++ b/test/brain_observatory/behavior/data_objects/test_trial_table.py @@ -0,0 +1,181 @@ +from datetime import datetime +from pathlib import Path +from typing import Optional + +import pandas as pd +import pynwb +import pytest + +from allensdk.brain_observatory.behavior.data_files import StimulusFile, \ + SyncFile +from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.licks import Licks +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.equipment import \ + Equipment +from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards +from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ + calculate_monitor_delay +from allensdk.brain_observatory.behavior.data_objects.trials.trial_table \ + import TrialTable +from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner +from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ + LimsTest + + +class TestFromStimulusFile(LimsTest): + @classmethod + def setup_class(cls): + cls.behavior_session_id = 994174745 + cls.ophys_experiment_id = 994278291 + + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + expected = pd.read_pickle(str(test_data_dir / 'trials.pkl')) + cls.expected = TrialTable(trials=expected) + + @pytest.mark.requires_bamboo + def test_from_stimulus_file(self): + stimulus_file, stimulus_timestamps, licks, rewards = \ + self._get_trial_table_data() + sync_file = SyncFile.from_lims( + db=self.dbconn, ophys_experiment_id=self.ophys_experiment_id) + equipment = Equipment.from_lims( + behavior_session_id=self.behavior_session_id, lims_db=self.dbconn) + monitor_delay = calculate_monitor_delay(sync_file=sync_file, + equipment=equipment) + trials = TrialTable.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + licks=licks, + rewards=rewards, + monitor_delay=monitor_delay + ) + assert trials == self.expected + + def test_from_stimulus_file2(self): + dir = Path(__file__).parent.parent.resolve() + stimulus_filepath = dir / 'resources' / 'example_stimulus.pkl.gz' + stimulus_file = StimulusFile(filepath=stimulus_filepath) + stimulus_file, stimulus_timestamps, licks, rewards = \ + self._get_trial_table_data(stimulus_file=stimulus_file) + TrialTable.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + monitor_delay=0.02115, + licks=licks, + rewards=rewards + ) + + def _get_trial_table_data(self, + stimulus_file: Optional[StimulusFile] = None): + """returns data required to instantiate a TrialTable""" + if stimulus_file is None: + stimulus_file = StimulusFile.from_lims( + behavior_session_id=self.behavior_session_id, db=self.dbconn) + stimulus_timestamps = StimulusTimestamps.from_stimulus_file( + stimulus_file=stimulus_file) + licks = Licks.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps) + rewards = Rewards.from_stimulus_file( + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps) + return stimulus_file, stimulus_timestamps, licks, rewards + + +class TestMonitorDelay: + @classmethod + def setup_class(cls): + cls.lookup_table_expected_values = { + 'CAM2P.1': 0.020842, + 'CAM2P.2': 0.037566, + 'CAM2P.3': 0.021390, + 'CAM2P.4': 0.021102, + 'CAM2P.5': 0.021192, + 'MESO.1': 0.03613 + } + + def setup_method(self, method): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + trials = pd.read_pickle(str(test_data_dir / 'trials.pkl')) + self.sync_file = SyncFile(filepath=str(test_data_dir / 'sync.h5')) + self.trials = TrialTable(trials=trials) + + def test_monitor_delay(self, monkeypatch): + equipment = Equipment(equipment_name='CAM2P.1') + + def dummy_delay(self): + return 1.12 + + with monkeypatch.context() as ctx: + ctx.setattr(OphysTimeAligner, + '_get_monitor_delay', + dummy_delay) + md = calculate_monitor_delay(sync_file=self.sync_file, + equipment=equipment) + assert abs(md - 1.12) < 1.0e-6 + + def test_monitor_delay_lookup(self, monkeypatch): + def dummy_delay(self): + """force monitor delay calculation to fail""" + raise ValueError("that did not work") + + with monkeypatch.context() as ctx: + ctx.setattr(OphysTimeAligner, + '_get_monitor_delay', + dummy_delay) + for equipment, expected in \ + self.lookup_table_expected_values.items(): + equipment = Equipment(equipment_name=equipment) + md = calculate_monitor_delay( + sync_file=self.sync_file, equipment=equipment) + assert abs(md - expected) < 1e-6 + + def test_unkown_rig_name(self, monkeypatch): + def dummy_delay(self): + """force monitor delay calculation to fail""" + raise ValueError("that did not work") + + with monkeypatch.context() as ctx: + ctx.setattr(OphysTimeAligner, + '_get_monitor_delay', + dummy_delay) + equipment = Equipment(equipment_name='spam') + with pytest.raises(RuntimeError): + calculate_monitor_delay(sync_file=self.sync_file, + equipment=equipment) + + +class TestNWB: + @classmethod + def setup_class(cls): + dir = Path(__file__).parent.resolve() + test_data_dir = dir / 'test_data' + + trials = pd.read_pickle(str(test_data_dir / 'trials.pkl')) + cls.trials = TrialTable(trials=trials) + + def setup_method(self, method): + self.nwbfile = pynwb.NWBFile( + session_description='asession', + identifier='1234', + session_start_time=datetime.now() + ) + + @pytest.mark.parametrize('roundtrip', [True, False]) + def test_read_write_nwb(self, roundtrip, + data_object_roundtrip_fixture): + self.trials.to_nwb(nwbfile=self.nwbfile) + + if roundtrip: + obt = data_object_roundtrip_fixture( + nwbfile=self.nwbfile, + data_object_cls=TrialTable) + else: + obt = self.trials.from_nwb(nwbfile=self.nwbfile) + + assert obt == self.trials diff --git a/test/brain_observatory/behavior/test_behavior_metadata_legacy.py b/test/brain_observatory/behavior/test_behavior_metadata_legacy.py new file mode 100644 index 0000000000..44e4aee0c8 --- /dev/null +++ b/test/brain_observatory/behavior/test_behavior_metadata_legacy.py @@ -0,0 +1,338 @@ +import pickle +from datetime import datetime + +import pytest +import numpy as np +import pandas as pd +import pytz + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.behavior_metadata import ( + description_dict, get_task_parameters, get_expt_description, + BehaviorMetadata) +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.date_of_acquisition import \ + DateOfAcquisition +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.age import \ + Age +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.full_genotype import \ + FullGenotype +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .subject_metadata.reporter_line import \ + ReporterLine + + +@pytest.mark.parametrize("data, expected", + [pytest.param({ # noqa: E128 + "items": { + "behavior": { + "config": { + "DoC": { + "blank_duration_range": ( + 0.5, 0.6), + "response_window": [0.15, 0.75], + "change_time_dist": "geometric", + "auto_reward_volume": 0.002, + }, + "reward": { + "reward_volume": 0.007, + }, + "behavior": { + "task_id": "DoC_untranslated", + }, + }, + "params": { + "stage": "TRAINING_3_images_A", + "flash_omit_probability": 0.05 + }, + "stimuli": { + "images": {"draw_log": [1] * 10, + "flash_interval_sec": [ + 0.32, -1.0]} + }, + } + } + }, + { + "blank_duration_sec": [0.5, 0.6], + "stimulus_duration_sec": 0.32, + "omitted_flash_fraction": 0.05, + "response_window_sec": [0.15, 0.75], + "reward_volume": 0.007, + "session_type": "TRAINING_3_images_A", + "stimulus": "images", + "stimulus_distribution": "geometric", + "task": "change detection", + "n_stimulus_frames": 10, + "auto_reward_volume": 0.002 + }, id='basic'), + pytest.param({ + "items": { + "behavior": { + "config": { + "DoC": { + "blank_duration_range": ( + 0.5, 0.5), + "response_window": [0.15, + 0.75], + "change_time_dist": + "geometric", + "auto_reward_volume": 0.002 + }, + "reward": { + "reward_volume": 0.007, + }, + "behavior": { + "task_id": "DoC_untranslated", + }, + }, + "params": { + "stage": "TRAINING_3_images_A", + "flash_omit_probability": 0.05 + }, + "stimuli": { + "images": {"draw_log": [1] * 10, + "flash_interval_sec": [ + 0.32, -1.0]} + }, + } + } + }, + { + "blank_duration_sec": [0.5, 0.5], + "stimulus_duration_sec": 0.32, + "omitted_flash_fraction": 0.05, + "response_window_sec": [0.15, 0.75], + "reward_volume": 0.007, + "session_type": "TRAINING_3_images_A", + "stimulus": "images", + "stimulus_distribution": "geometric", + "task": "change detection", + "n_stimulus_frames": 10, + "auto_reward_volume": 0.002 + }, id='single_value_blank_duration'), + pytest.param({ + "items": { + "behavior": { + "config": { + "DoC": { + "blank_duration_range": ( + 0.5, 0.5), + "response_window": [0.15, + 0.75], + "change_time_dist": + "geometric", + "auto_reward_volume": 0.002 + }, + "reward": { + "reward_volume": 0.007, + }, + "behavior": { + "task_id": "DoC_untranslated", + }, + }, + "params": { + "stage": "TRAINING_3_images_A", + "flash_omit_probability": 0.05 + }, + "stimuli": { + "grating": {"draw_log": [1] * 10, + "flash_interval_sec": + [0.34, -1.0]} + }, + } + } + }, + { + "blank_duration_sec": [0.5, 0.5], + "stimulus_duration_sec": 0.34, + "omitted_flash_fraction": 0.05, + "response_window_sec": [0.15, 0.75], + "reward_volume": 0.007, + "session_type": "TRAINING_3_images_A", + "stimulus": "grating", + "stimulus_distribution": "geometric", + "task": "change detection", + "n_stimulus_frames": 10, + "auto_reward_volume": 0.002 + }, id='stimulus_duration_from_grating'), + pytest.param({ + "items": { + "behavior": { + "config": { + "DoC": { + "blank_duration_range": ( + 0.5, 0.5), + "response_window": [0.15, + 0.75], + "change_time_dist": + "geometric", + "auto_reward_volume": 0.002 + }, + "reward": { + "reward_volume": 0.007, + }, + "behavior": { + "task_id": "DoC_untranslated", + }, + }, + "params": { + "stage": "TRAINING_3_images_A", + "flash_omit_probability": 0.05 + }, + "stimuli": { + "grating": { + "draw_log": [1] * 10, + "flash_interval_sec": None} + }, + } + } + }, + { + "blank_duration_sec": [0.5, 0.5], + "stimulus_duration_sec": np.NaN, + "omitted_flash_fraction": 0.05, + "response_window_sec": [0.15, 0.75], + "reward_volume": 0.007, + "session_type": "TRAINING_3_images_A", + "stimulus": "grating", + "stimulus_distribution": "geometric", + "task": "change detection", + "n_stimulus_frames": 10, + "auto_reward_volume": 0.002 + }, id='stimulus_duration_none') + ] + ) +def test_get_task_parameters(data, expected): + actual = get_task_parameters(data) + for k, v in actual.items(): + # Special nan checking since pytest doesn't do it well + try: + if np.isnan(v): + assert np.isnan(expected[k]) + else: + assert expected[k] == v + except (TypeError, ValueError): + assert expected[k] == v + + actual_keys = list(actual.keys()) + actual_keys.sort() + expected_keys = list(expected.keys()) + expected_keys.sort() + assert actual_keys == expected_keys + + +def test_get_task_parameters_task_id_exception(): + """ + Test that, when task_id has an unexpected value, + get_task_parameters throws the correct exception + """ + input_data = { + "items": { + "behavior": { + "config": { + "DoC": { + "blank_duration_range": (0.5, 0.6), + "response_window": [0.15, 0.75], + "change_time_dist": "geometric", + "auto_reward_volume": 0.002 + }, + "reward": { + "reward_volume": 0.007, + }, + "behavior": { + "task_id": "junk", + }, + }, + "params": { + "stage": "TRAINING_3_images_A", + "flash_omit_probability": 0.05 + }, + "stimuli": { + "images": {"draw_log": [1] * 10, + "flash_interval_sec": [0.32, -1.0]} + }, + } + } + } + + with pytest.raises(RuntimeError) as error: + _ = get_task_parameters(input_data) + assert "does not know how to parse 'task_id'" in error.value.args[0] + + +def test_get_task_parameters_flash_duration_exception(): + """ + Test that, when 'images' or 'grating' not present in 'stimuli', + get_task_parameters throws the correct exception + """ + input_data = { + "items": { + "behavior": { + "config": { + "DoC": { + "blank_duration_range": (0.5, 0.6), + "response_window": [0.15, 0.75], + "change_time_dist": "geometric", + "auto_reward_volume": 0.002 + }, + "reward": { + "reward_volume": 0.007, + }, + "behavior": { + "task_id": "DoC", + }, + }, + "params": { + "stage": "TRAINING_3_images_A", + "flash_omit_probability": 0.05 + }, + "stimuli": { + "junk": {"draw_log": [1] * 10, + "flash_interval_sec": [0.32, -1.0]} + }, + } + } + } + + with pytest.raises(RuntimeError) as error: + _ = get_task_parameters(input_data) + shld_be = "'images' and/or 'grating' not a valid key" + assert shld_be in error.value.args[0] + + +@pytest.mark.parametrize("session_type, expected_description", [ + ("OPHYS_0_images_Z", description_dict[r"\AOPHYS_0_images"]), + ("OPHYS_1_images_A", description_dict[r"\AOPHYS_[1|3]_images"]), + ("OPHYS_2_images_B", description_dict[r"\AOPHYS_2_images"]), + ("OPHYS_3_images_C", description_dict[r"\AOPHYS_[1|3]_images"]), + ("OPHYS_4_images_D", description_dict[r"\AOPHYS_[4|6]_images"]), + ("OPHYS_5_images_E", description_dict[r"\AOPHYS_5_images"]), + ("OPHYS_6_images_F", description_dict[r"\AOPHYS_[4|6]_images"]), + ("TRAINING_0_gratings_A", description_dict[r"\ATRAINING_0_gratings"]), + ("TRAINING_1_gratings_B", description_dict[r"\ATRAINING_1_gratings"]), + ("TRAINING_2_gratings_C", description_dict[r"\ATRAINING_2_gratings"]), + ("TRAINING_3_images_D", description_dict[r"\ATRAINING_3_images"]), + ("TRAINING_4_images_E", description_dict[r"\ATRAINING_4_images"]), + ('TRAINING_3_images_A_10uL_reward', + description_dict[r"\ATRAINING_3_images"]), + ('TRAINING_5_images_A_handoff_lapsed', + description_dict[r"\ATRAINING_5_images"]) +]) +def test_get_expt_description_with_valid_session_type(session_type, + expected_description): + obt = get_expt_description(session_type) + assert obt == expected_description + + +@pytest.mark.parametrize("session_type", [ + ("bogus_session_type"), + ("stuff"), + ("OPHYS_7") +]) +def test_get_expt_description_raises_with_invalid_session_type(session_type): + with pytest.raises(RuntimeError, match="session type should match.*"): + get_expt_description(session_type) diff --git a/test/brain_observatory/behavior/test_behavior_ophys_experiment.py b/test/brain_observatory/behavior/test_behavior_ophys_experiment.py new file mode 100644 index 0000000000..d35d2bcf8e --- /dev/null +++ b/test/brain_observatory/behavior/test_behavior_ophys_experiment.py @@ -0,0 +1,387 @@ +import os +import datetime +import uuid +import pytest +import pandas as pd +import pytz +import numpy as np +from unittest.mock import create_autospec + +from pynwb import NWBHDF5IO + +from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ + BehaviorOphysExperiment +from allensdk.brain_observatory.behavior.behavior_session import \ + BehaviorSession +from allensdk.brain_observatory.behavior.data_files import SyncFile +from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ + EyeTrackingFile +from allensdk.brain_observatory.behavior.data_files\ + .rigid_motion_transform_file import \ + RigidMotionTransformFile +from allensdk.brain_observatory.behavior.data_objects import \ + BehaviorSessionId, StimulusTimestamps +from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ + .cell_specimens import \ + CellSpecimens +from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ + .eye_tracking_table import \ + EyeTrackingTable +from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ + .rig_geometry import \ + RigGeometry as EyeTrackingRigGeometry +from allensdk.brain_observatory.behavior.data_objects.metadata \ + .behavior_metadata.date_of_acquisition import \ + DateOfAcquisitionOphys +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_metadata.foraging_id import \ + ForagingId +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .behavior_ophys_metadata import \ + BehaviorOphysMetadata +from allensdk.brain_observatory.behavior.data_objects.metadata\ + .ophys_experiment_metadata.multi_plane_metadata.imaging_plane_group \ + import \ + ImagingPlaneGroup +from allensdk.brain_observatory.behavior.data_objects.projections import \ + Projections +from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ + calculate_monitor_delay +from allensdk.brain_observatory.behavior.data_objects.timestamps\ + .ophys_timestamps import \ + OphysTimestamps +from allensdk.brain_observatory.session_api_utils import ( + sessions_are_equal) +from allensdk.brain_observatory.stimulus_info import MONITOR_DIMENSIONS +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator + + +@pytest.mark.requires_bamboo +def test_nwb_end_to_end(tmpdir_factory): + # NOTE: old test oeid 789359614 had no cell specimen ids due to not being + # part of the 2021 Visual Behavior release set which broke a ton + # of things... + + oeid = 795073741 + tmpdir = 'test_nwb_end_to_end' + nwb_filepath = os.path.join(str(tmpdir_factory.mktemp(tmpdir)), + 'nwbfile.nwb') + + d1 = BehaviorOphysExperiment.from_lims(oeid) + nwbfile = d1.to_nwb() + with NWBHDF5IO(nwb_filepath, 'w') as nwb_file_writer: + nwb_file_writer.write(nwbfile) + + d2 = BehaviorOphysExperiment.from_nwb(nwbfile=nwbfile) + + assert sessions_are_equal(d1, d2, reraise=True, + ignore_keys={'metadata': {'project_code'}}) + + +@pytest.mark.nightly +def test_visbeh_ophys_data_set(): + ophys_experiment_id = 789359614 + data_set = BehaviorOphysExperiment.from_lims(ophys_experiment_id, + exclude_invalid_rois=False) + + # TODO: need to improve testing here: + # for _, row in data_set.roi_metrics.iterrows(): + # print(np.array(row.to_dict()['mask']).sum()) + # print + # for _, row in data_set.roi_masks.iterrows(): + # print(np.array(row.to_dict()['mask']).sum()) + + lims_db = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP) + behavior_session_id = BehaviorSessionId.from_lims( + db=lims_db, ophys_experiment_id=ophys_experiment_id) + + # All sorts of assert relationships: + assert ForagingId.from_lims(behavior_session_id=behavior_session_id.value, + lims_db=lims_db).value == \ + data_set.metadata['behavior_session_uuid'] + + stimulus_templates = data_set.stimulus_templates + assert len(stimulus_templates) == 8 + assert stimulus_templates.loc['im000'].warped.shape == MONITOR_DIMENSIONS + assert stimulus_templates.loc['im000'].unwarped.shape == MONITOR_DIMENSIONS + + assert len(data_set.licks) == 2421 and set(data_set.licks.columns) \ + == set(['timestamps', 'frame']) + assert len(data_set.rewards) == 85 and set(data_set.rewards.columns) == \ + set(['timestamps', 'volume', 'autorewarded']) + assert len(data_set.corrected_fluorescence_traces) == 258 and \ + set(data_set.corrected_fluorescence_traces.columns) == \ + set(['cell_roi_id', 'corrected_fluorescence']) + np.testing.assert_array_almost_equal(data_set.running_speed.timestamps, + data_set.stimulus_timestamps) + assert len(data_set.cell_specimen_table) == len(data_set.dff_traces) + assert data_set.average_projection.data.shape == \ + data_set.max_projection.data.shape + assert set(data_set.motion_correction.columns) == set(['x', 'y']) + assert len(data_set.trials) == 602 + + expected_metadata = { + 'stimulus_frame_rate': 60.0, + 'full_genotype': 'Slc17a7-IRES2-Cre/wt;Camk2a-tTA/wt;Ai93(' + 'TITL-GCaMP6f)/wt', + 'ophys_experiment_id': 789359614, + 'behavior_session_id': 789295700, + 'imaging_plane_group_count': 0, + 'ophys_session_id': 789220000, + 'session_type': 'OPHYS_6_images_B', + 'driver_line': ['Camk2a-tTA', 'Slc17a7-IRES2-Cre'], + 'cre_line': 'Slc17a7-IRES2-Cre', + 'behavior_session_uuid': uuid.UUID( + '69cdbe09-e62b-4b42-aab1-54b5773dfe78'), + 'date_of_acquisition': pytz.utc.localize( + datetime.datetime(2018, 11, 30, 23, 28, 37)), + 'ophys_frame_rate': 31.0, + 'imaging_depth': 375, + 'mouse_id': 416369, + 'experiment_container_id': 814796558, + 'targeted_structure': 'VISp', + 'reporter_line': 'Ai93(TITL-GCaMP6f)', + 'emission_lambda': 520.0, + 'excitation_lambda': 910.0, + 'field_of_view_height': 512, + 'field_of_view_width': 447, + 'indicator': 'GCaMP6f', + 'equipment_name': 'CAM2P.5', + 'age_in_days': 139, + 'sex': 'F', + 'imaging_plane_group': None, + 'project_code': 'VisualBehavior' + } + assert data_set.metadata == expected_metadata + assert data_set.task_parameters == {'reward_volume': 0.007, + 'stimulus_distribution': u'geometric', + 'stimulus_duration_sec': 0.25, + 'stimulus': 'images', + 'omitted_flash_fraction': 0.05, + 'blank_duration_sec': [0.5, 0.5], + 'n_stimulus_frames': 69882, + 'task': 'change detection', + 'response_window_sec': [0.15, 0.75], + 'session_type': u'OPHYS_6_images_B', + 'auto_reward_volume': 0.005} + + +@pytest.mark.requires_bamboo +def test_legacy_dff_api(): + ophys_experiment_id = 792813858 + session = BehaviorOphysExperiment.from_lims( + ophys_experiment_id=ophys_experiment_id) + + _, dff_array = session.get_dff_traces() + for csid in session.dff_traces.index.values: + dff_trace = session.dff_traces.loc[csid]['dff'] + ind = session.cell_specimen_table.index.get_loc(csid) + np.testing.assert_array_almost_equal(dff_trace, dff_array[ind, :]) + + assert dff_array.shape[0] == session.dff_traces.shape[0] + + +@pytest.mark.requires_bamboo +@pytest.mark.parametrize('ophys_experiment_id, number_omitted', [ + pytest.param(789359614, 153), + pytest.param(792813858, 129) +]) +def test_stimulus_presentations_omitted(ophys_experiment_id, number_omitted): + session = BehaviorOphysExperiment.from_lims(ophys_experiment_id) + df = session.stimulus_presentations + assert df['omitted'].sum() == number_omitted + + +@pytest.mark.parametrize( + "dilation_frames, z_threshold", [ + (5, 9), + (1, 2) + ]) +def test_eye_tracking(dilation_frames, z_threshold, monkeypatch): + """A very long test just to test that eye tracking arguments are sent to + EyeTrackingTable factory method from BehaviorOphysExperiment.from_lims""" + expected = EyeTrackingTable(eye_tracking=pd.DataFrame([1, 2, 3])) + EyeTrackingTable_mock = create_autospec(EyeTrackingTable) + EyeTrackingTable_mock.from_data_file.return_value = expected + + etf = create_autospec(EyeTrackingFile, instance=True) + sf = create_autospec(SyncFile, instance=True) + + with monkeypatch.context() as ctx: + ctx.setattr('allensdk.brain_observatory.behavior.' + 'behavior_ophys_experiment.db_connection_creator', + create_autospec(db_connection_creator, instance=True)) + ctx.setattr( + SyncFile, 'from_lims', + lambda db, ophys_experiment_id: sf) + ctx.setattr( + StimulusTimestamps, 'from_sync_file', + lambda sync_file: create_autospec(StimulusTimestamps, + instance=True)) + ctx.setattr( + BehaviorSessionId, 'from_lims', + lambda db, ophys_experiment_id: create_autospec(BehaviorSessionId, + instance=True)) + ctx.setattr( + ImagingPlaneGroup, 'from_lims', + lambda lims_db, ophys_experiment_id: None) + ctx.setattr( + BehaviorOphysMetadata, 'from_lims', + lambda lims_db, ophys_experiment_id, + is_multiplane: create_autospec(BehaviorOphysMetadata, + instance=True)) + ctx.setattr('allensdk.brain_observatory.behavior.' + 'behavior_ophys_experiment.calculate_monitor_delay', + create_autospec(calculate_monitor_delay)) + ctx.setattr( + DateOfAcquisitionOphys, 'from_lims', + lambda lims_db, ophys_experiment_id: create_autospec( + DateOfAcquisitionOphys, instance=True)) + ctx.setattr( + BehaviorSession, 'from_lims', + lambda lims_db, behavior_session_id, + stimulus_timestamps, monitor_delay, date_of_acquisition: + BehaviorSession( + behavior_session_id=None, + stimulus_timestamps=None, + running_acquisition=None, + raw_running_speed=None, + running_speed=None, + licks=None, + rewards=None, + stimuli=None, + task_parameters=None, + trials=None, + metadata=None, + date_of_acquisition=None, + )) + ctx.setattr( + OphysTimestamps, 'from_sync_file', + lambda sync_file: create_autospec(OphysTimestamps, + instance=True)) + ctx.setattr( + Projections, 'from_lims', + lambda lims_db, ophys_experiment_id: create_autospec( + Projections, instance=True)) + ctx.setattr( + CellSpecimens, 'from_lims', + lambda lims_db, ophys_experiment_id, ophys_timestamps, + segmentation_mask_image_spacing, events_params, + exclude_invalid_rois: create_autospec( + BehaviorSession, instance=True)) + ctx.setattr( + RigidMotionTransformFile, 'from_lims', + lambda db, ophys_experiment_id: create_autospec( + RigidMotionTransformFile, instance=True)) + ctx.setattr( + EyeTrackingFile, 'from_lims', + lambda db, ophys_experiment_id: etf) + ctx.setattr( + EyeTrackingTable, 'from_data_file', + lambda data_file, sync_file, z_threshold, dilation_frames: + EyeTrackingTable_mock.from_data_file( + data_file=data_file, sync_file=sync_file, + z_threshold=z_threshold, dilation_frames=dilation_frames)) + ctx.setattr( + EyeTrackingRigGeometry, 'from_lims', + lambda lims_db, ophys_experiment_id: create_autospec( + EyeTrackingRigGeometry, instance=True)) + boe = BehaviorOphysExperiment.from_lims( + ophys_experiment_id=1, eye_tracking_z_threshold=z_threshold, + eye_tracking_dilation_frames=dilation_frames) + + obtained = boe.eye_tracking + assert obtained.equals(expected.value) + EyeTrackingTable_mock.from_data_file.assert_called_with( + data_file=etf, + sync_file=sf, + z_threshold=z_threshold, + dilation_frames=dilation_frames) + + +@pytest.mark.requires_bamboo +def test_event_detection(): + ophys_experiment_id = 789359614 + session = BehaviorOphysExperiment.from_lims( + ophys_experiment_id=ophys_experiment_id) + events = session.events + + assert len(events) > 0 + + expected_columns = ['events', 'filtered_events', 'lambda', 'noise_std', + 'cell_roi_id'] + assert len(events.columns) == len(expected_columns) + # Assert they contain the same columns + assert len(set(expected_columns).intersection(events.columns)) == len( + expected_columns) + + assert events.index.name == 'cell_specimen_id' + + # All events are the same length + event_length = len(set([len(x) for x in events['events']])) + assert event_length == 1 + + +@pytest.mark.requires_bamboo +def test_BehaviorOphysExperiment_property_data(): + ophys_experiment_id = 960410026 + dataset = BehaviorOphysExperiment.from_lims(ophys_experiment_id) + + assert dataset.ophys_session_id == 959458018 + assert dataset.ophys_experiment_id == 960410026 + + +def test_behavior_ophys_experiment_list_data_attributes_and_methods( + monkeypatch): + # Test that data related methods/attributes/properties for + # BehaviorOphysExperiment are returned properly. + + # This test will need to be updated if: + # 1. Data being returned by class has changed + # 2. Inheritance of class has changed + expected = { + 'average_projection', + 'behavior_session_id', + 'cell_specimen_table', + 'corrected_fluorescence_traces', + 'dff_traces', + 'events', + 'eye_tracking', + 'eye_tracking_rig_geometry', + 'get_cell_specimen_ids', + 'get_cell_specimen_indices', + 'get_dff_traces', + 'get_performance_metrics', + 'get_reward_rate', + 'get_rolling_performance_df', + 'get_segmentation_mask_image', + 'licks', + 'max_projection', + 'metadata', + 'motion_correction', + 'ophys_experiment_id', + 'ophys_session_id', + 'ophys_timestamps', + 'raw_running_speed', + 'rewards', + 'roi_masks', + 'running_speed', + 'segmentation_mask_image', + 'stimulus_presentations', + 'stimulus_templates', + 'stimulus_timestamps', + 'task_parameters', + 'trials' + } + + def dummy_init(self): + pass + + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorOphysExperiment, '__init__', dummy_init) + boe = BehaviorOphysExperiment() + obt = boe.list_data_attributes_and_methods() + + assert any(expected ^ set(obt)) is False diff --git a/test/brain_observatory/behavior/test_behavior_session.py b/test/brain_observatory/behavior/test_behavior_session.py new file mode 100644 index 0000000000..013fe02641 --- /dev/null +++ b/test/brain_observatory/behavior/test_behavior_session.py @@ -0,0 +1,34 @@ +from allensdk.brain_observatory.behavior.behavior_session import ( + BehaviorSession) + + +def test_behavior_session_list_data_attributes_and_methods(monkeypatch): + """Test that data related methods/attributes/properties for + BehaviorSession are returned properly.""" + + def dummy_init(self): + pass + + with monkeypatch.context() as ctx: + ctx.setattr(BehaviorSession, '__init__', dummy_init) + bs = BehaviorSession() + obt = bs.list_data_attributes_and_methods() + + expected = { + 'behavior_session_id', + 'get_performance_metrics', + 'get_reward_rate', + 'get_rolling_performance_df', + 'licks', + 'metadata', + 'raw_running_speed', + 'rewards', + 'running_speed', + 'stimulus_presentations', + 'stimulus_templates', + 'stimulus_timestamps', + 'task_parameters', + 'trials' + } + + assert any(expected ^ set(obt)) is False diff --git a/test/brain_observatory/behavior/test_criteria.py b/test/brain_observatory/behavior/test_criteria.py new file mode 100644 index 0000000000..2bb3cb5bdb --- /dev/null +++ b/test/brain_observatory/behavior/test_criteria.py @@ -0,0 +1,382 @@ +import pytest +import pandas as pd +from allensdk.brain_observatory.behavior import criteria +from allensdk.core.exceptions import DataFrameKeyError, DataFrameIndexError + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 0, 1: 0, 2: 0, }, + }), + False, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 2.0, 1: 2.0, 2: 2.0, }, + }), + False, + ), # should need to be greater than 2.0 + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 0, 1: 0, 2: 2.1, }, + }), + False, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 0, 1: 2.1, 2: 2.1, }, + }), + True, + ), + ], +) +def test_two_out_of_three_aint_bad(session_summary, expected): + assert criteria.two_out_of_three_aint_bad(session_summary) == expected + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, }, + "dprime_peak": {0: 0, 1: 2.1, } + }), + pytest.raises(DataFrameIndexError), + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "other_col": {0: 0, 1: 2.1, 2: 2.1, } + }), + pytest.raises(DataFrameKeyError), + ), + ], +) +def test_two_out_of_three_aint_bad_exception(session_summary, expected): + with expected: + criteria.two_out_of_three_aint_bad(session_summary) + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 0, 1: 0, 2: 0, }, + }), + False, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 2.0, 1: 2.0, 2: 2.0, }, + }), + False, + ), # should need to be greater than 2.0 + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 0, 1: 2.1, 2: 0, }, + }), + False, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "dprime_peak": {0: 0, 1: 0, 2: 2.1, }, + }), + True, + ), + + ], +) +def test_yesterday_was_good(session_summary, expected): + assert criteria.yesterday_was_good(session_summary) == expected + + +@pytest.mark.parametrize( + "session_summary,expected", + [ + ( + pd.DataFrame({ + "training_day": {}, + "dprime_peak": {}, + }), + pytest.raises(DataFrameIndexError), + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "other_col": {0: 0, 1: 0, 2: 2.1, }, + }), + pytest.raises(DataFrameKeyError), + ), + ], +) +def test_yesterday_was_good_exception(session_summary, expected): + with expected: + criteria.yesterday_was_good(session_summary) + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "response_bias": {0: 0.0, 1: 0.0, 2: 0.0, }, + }), + False, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "response_bias": {0: 0.0, 1: 0.0, 2: 0.1, }, + }), + False, + ), # non-inclusive + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "response_bias": {0: 0.0, 1: 0.0, 2: 0.9, }, + }), + False, + ), # non-inclusive + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "response_bias": {0: 0.0, 1: 0.0, 2: 0.11, }, + }), + True, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "response_bias": {0: 0.0, 1: 0.0, 2: 0.89, }, + }), + True, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "response_bias": {0: 0.0, 1: 0.0, 2: 0.1011, }, + }), + True, + ), # doesn't round + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "response_bias": {0: 0.0, 1: 0.0, 2: 0.8999, }, + }), + True, + ), # doesn't round + ], +) +def test_no_response_bias(session_summary, expected): + assert criteria.no_response_bias(session_summary) == expected + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "training_day": {}, + "response_bias": {}, + }), + pytest.raises(DataFrameIndexError), + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "other_col": {0: 0.0, 1: 0.0, 2: 0.11, }, + }), + pytest.raises(DataFrameKeyError), + ), + ], +) +def test_no_response_bias_exception(session_summary, expected): + with expected: + criteria.no_response_bias(session_summary) + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 0.0, }, + }), + False, + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 100.0, }, + }), + False, + ), # non-inclusive + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 300.0, }, + }), + False, + ), # non-inclusive + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 301.0, }, + }), + True, + ), + ], +) +def test_whole_lotta_trials(session_summary, expected): + assert criteria.whole_lotta_trials(session_summary) == expected + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "training_day": {}, + "num_contingent_trials": {}, + }), + pytest.raises(DataFrameIndexError), + ), + ( + pd.DataFrame({ + "training_day": {0: 0, 1: 1, 2: 3, }, + "other_col": {0: 0.0, 1: 0.0, 2: 301.0, }, + }), + pytest.raises(DataFrameKeyError), + ), + ] +) +def test_whole_lotta_trials_exception(session_summary, expected): + with expected: + criteria.whole_lotta_trials(session_summary) + + +@pytest.mark.parametrize( + "trials, expected", + [ + ( + pd.DataFrame({ + "training_day": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, # associate all with same training day + "trial_type": {0: "aborted", 1: "go", 2: "catch", 3: "go", }, + "trial_length": {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, }, + }), + True, + ), + ( + pd.DataFrame({ + "training_day": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, # associate all with same training day + "trial_type": {0: "aborted", 1: "go", 2: "catch", 3: "aborted", }, + "trial_length": {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, }, + }), + False, + ), # non-inclusive + ( + pd.DataFrame({ + "training_day": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, # associate all with same training day + "trial_type": {0: "aborted", 1: "go", 2: "aborted", 3: "aborted", }, + "trial_length": {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, }, + }), + False, + ), + ( + pd.DataFrame({ + "training_day": {}, # associate all with same training day + "trial_type": {}, + "trial_length": {}, + }), + False, + ), + ], +) +def test_mostly_useful(trials, expected): + assert criteria.mostly_useful(trials) == expected + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "task": {0: "Images", 1: "", 2: "", 3: "Images", }, + "dprime_peak": {0: 1.0, 1: 0.0, 2: 0.0, 3: 0.0, }, + "num_engaged_trials": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, + }), + False, + ), + ( + pd.DataFrame({ + "task": {0: "", 1: "", 2: "", 3: "Images", 4: "Images", 5: "Images"}, + "dprime_peak": {0: 1.2, 1: 2.0, 2: 1.1, 3: 1.1, 4: 2.0, 5: 1.2, }, + "num_engaged_trials": {0: 101, 1: 102, 2: 200, 3: 101, 4: 102, 5: 99, }, + }), + False, + ), + ( + pd.DataFrame({ + "task": {0: "Images", 1: "Images", 2: "Images", 3: "Images", 4: "Images", 5: "Images"}, + "dprime_peak": {0: 1.2, 1: 2.0, 2: 1.1, 3: 1.1, 4: 2.0, 5: 1.2, }, + "num_engaged_trials": {0: 101, 1: 102, 2: 200, 3: 101, 4: 102, 5: 200, }, + }), + True, + ), + ], +) +def test_meets_engagement_criteria(session_summary, expected): + assert criteria.meets_engagement_criteria(session_summary) == expected + + +@pytest.mark.parametrize( + "session_summary, expected", + [ + ( + pd.DataFrame({ + "task": {0: "Images", 1: "Images", 2: "Images", 3: "Images", 4: "Images", 5: "Images"}, + "other_metric": {0: 1.2, 1: 2.0, 2: 1.1, 3: 1.1, 4: 2.0, 5: 1.2, }, + "num_engaged_trials": {0: 101, 1: 102, 2: 200, 3: 101, 4: 102, 5: 200, }, + }), + pytest.raises(DataFrameKeyError), + ), + ( + pd.DataFrame({ + "task": {0: "Images", 1: "Images", }, + "dprime_peak": {0: 1.2, 1: 2.0,}, + "num_engaged_trials": {0: 101, 1: 102}, + }), + pytest.raises(DataFrameIndexError), + ), + ], +) +def test_meets_engagement_criteria_exception(session_summary, expected): + with expected: + criteria.meets_engagement_criteria(session_summary) + + +@pytest.mark.parametrize( + "trials, expected", + [ + (pd.DataFrame({'training_day': {0: 0, 1: 1, 2: 3, }, }), False, ), + (pd.DataFrame({'training_day': {0: 0, 1: 1, 2: 40, }, }), True, ), # inclusive + (pd.DataFrame({'training_day': {0: 0, 1: 1, 2: 41, }, }), True, ), + ], +) +def test_summer_over(trials, expected): + assert criteria.summer_over(trials) == expected diff --git a/test/brain_observatory/behavior/test_dprime.py b/test/brain_observatory/behavior/test_dprime.py new file mode 100644 index 0000000000..c51771b0f7 --- /dev/null +++ b/test/brain_observatory/behavior/test_dprime.py @@ -0,0 +1,175 @@ +import numpy as np +import pytest +import pandas as pd +import datetime +import pytz + +from allensdk.brain_observatory.behavior.dprime import get_hit_rate, get_false_alarm_rate, get_rolling_dprime, get_trial_count_corrected_false_alarm_rate, get_trial_count_corrected_hit_rate, get_dprime + + +NaN = float('nan') + + +@pytest.fixture +def mock_trials_fixture(): + + n_tr = 500 + np.random.seed(42) + change = np.random.random(n_tr) > 0.8 + incorrect = np.random.random(n_tr) > 0.8 + detect = change.copy() + detect[incorrect] = ~detect[incorrect] + + trials = pd.DataFrame({ + 'change': change, + 'detect': detect, + },) + trials['trial_type'] = trials['change'].map(lambda x: ['catch', 'go'][x]) + trials['response'] = trials['detect'] + trials['change_time'] = np.sort(np.random.rand(n_tr)) * 3600 + trials['reward_lick_latency'] = 0.1 + trials['reward_lick_count'] = 10 + trials['auto_rewarded'] = False + trials['lick_frames'] = [[] for row in trials.iterrows()] + trials['trial_length'] = 8.5 + trials['reward_times'] = trials.apply(lambda r: [r['change_time']+0.2] if r['change']*r['detect'] else [],axis=1) + trials['reward_volume'] = 0.005 * trials['reward_times'].map(len) + trials['response_latency'] = trials.apply(lambda r: 0.2 if r['detect'] else np.inf,axis=1) + trials['blank_duration_range'] = [[0.5, 0.5] for row in trials.iterrows()] + + metadata = {} + metadata['mouse_id'] = 'M999999' + metadata['user_id'] = 'johnd' + + metadata['startdatetime'] = datetime.datetime(2017, 7, 19, 10, 35, 8, 369000, tzinfo=pytz.utc) + metadata['dayofweek'] = metadata['startdatetime'].weekday() + metadata['startdatetime'] = metadata['startdatetime'] + + metadata['behavior_session_uuid'] = 12345 + metadata['stage'] = 'test' + metadata['stimulus'] = 'natural_scenes' + metadata['stimulus_distribution'] = 'exponential' + + for k, v in metadata.items(): + trials[k] = v + return trials + +from collections import defaultdict + +@pytest.fixture +def mock_rolling_dprime_fixture(mock_trials_fixture): + + data_dict = defaultdict(list) + for ri, row in mock_trials_fixture[['trial_type', 'response', 'change_time']].iterrows(): + assert not pd.isnull(row['change_time']) + if row['trial_type'] == 'go' and row['response'] == True: + hit = True + miss = false_alarm = correct_reject = False + elif row['trial_type'] == 'go' and row['response'] == False: + miss = True + hit = false_alarm = correct_reject = False + elif row['trial_type'] == 'catch' and row['response'] == True: + false_alarm = True + miss = hit = correct_reject = False + elif row['trial_type'] == 'catch' and row['response'] == False: + correct_reject = True + hit = false_alarm = miss = False + else: + raise RuntimeError + data_dict['hit'].append(hit) + data_dict['miss'].append(miss) + data_dict['false_alarm'].append(false_alarm) + data_dict['correct_reject'].append(correct_reject) + data_dict['aborted'].append(False) + + + + return pd.DataFrame(data_dict) + +def test_get_hit_rate(): + + hit, miss, aborted = ( + [0, 1, 0, 0, 0, 1], + [1, 0, 0, 0, 1, 0], + [0, 0, 1, 1, 0, 0]) + + result = get_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=3) + np.testing.assert_allclose(result, [0, .5, 1/3, 2/3]) + + +def test_get_false_alarm_rate(mock_trials_fixture): + + false_alarm, correct_reject, aborted = ( + [0, 1, 0, 0, 0, 1], + [1, 0, 0, 0, 1, 0], + [0, 0, 1, 1, 0, 0]) + + result = get_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=3) + np.testing.assert_allclose(result, [0, .5, 1/3, 2/3]) + + +def test_rolling_dprime_unit(): + + hit, miss, false_alarm, correct_reject, aborted = ( + [0, 0, 1, 0, 0, 1], + [1, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 1, 0], + [0, 0, 0, 0, 0, 0]) + + hr = get_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=3) + far = get_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=3) + result = get_rolling_dprime(hr, far) + np.testing.assert_allclose(result, [NaN, NaN, NaN, 2.326348, 4.652696, 4.652696]) + + +def test_rolling_dprime_integration_legacy(mock_rolling_dprime_fixture): + sliding_window = 100 + + hit = mock_rolling_dprime_fixture.hit + miss = mock_rolling_dprime_fixture.miss + false_alarm = mock_rolling_dprime_fixture.false_alarm + correct_reject = mock_rolling_dprime_fixture.correct_reject + aborted = mock_rolling_dprime_fixture.aborted + + hr = get_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=sliding_window) + cr = get_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=sliding_window) + dprime = get_rolling_dprime(hr, cr) + + assert dprime[2] == 4.6526957480816815 + + +def test_rolling_dprime_integration(mock_rolling_dprime_fixture): + sliding_window = 100 + + hit = mock_rolling_dprime_fixture.hit + miss = mock_rolling_dprime_fixture.miss + false_alarm = mock_rolling_dprime_fixture.false_alarm + correct_reject = mock_rolling_dprime_fixture.correct_reject + aborted = mock_rolling_dprime_fixture.aborted + + hr = get_trial_count_corrected_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=sliding_window) + cr = get_trial_count_corrected_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=sliding_window) + dprime = get_rolling_dprime(hr, cr) + + assert dprime[2] == 0.6744897501960817 + + +@pytest.mark.parametrize('hr, far, dprime', [ + pytest.param(1., 1., 0.), + pytest.param(.5, .5, 0.), + pytest.param(.25, .5, -0.6744897501960817), + pytest.param(.5, .25, 0.6744897501960817), +]) +def test_dprime(hr, far, dprime): + val = get_dprime(hr, far) + assert val == dprime + if hr == far: + assert dprime == 0 + if hr < far: + assert val < 0 + elif hr > far: + assert val > 0 + else: + pass + diff --git a/test/brain_observatory/behavior/test_event_detection.py b/test/brain_observatory/behavior/test_event_detection.py new file mode 100644 index 0000000000..9d1b4b2fae --- /dev/null +++ b/test/brain_observatory/behavior/test_event_detection.py @@ -0,0 +1,21 @@ +import numpy as np +import pytest + +from allensdk.brain_observatory.behavior.event_detection import \ + filter_events_array + + +def test_filter_events_array(): + with pytest.raises(ValueError): + filter_events_array(arr=np.array([0.0, 0.0, 0.6])) + + with pytest.raises(ValueError): + filter_events_array(arr=np.array([[0.0, 0.0, 0.6]]), n_time_steps=0) + + arr = np.array([[0.0, 0.0, 0.6]]) + filtered_events_array = filter_events_array(arr=arr) + assert arr.shape[0] == filtered_events_array.shape[0] + assert arr.shape[1] == filtered_events_array.shape[1] + + expected = np.array([[0.0, 0.0, 0.199559]]) + assert (np.abs(filtered_events_array - expected) < 1e-6).all() diff --git a/test/brain_observatory/behavior/test_eye_tracking_processing.py b/test/brain_observatory/behavior/test_eye_tracking_processing.py new file mode 100644 index 0000000000..622770cbc3 --- /dev/null +++ b/test/brain_observatory/behavior/test_eye_tracking_processing.py @@ -0,0 +1,228 @@ +from pathlib import Path + +import pytest + +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.behavior.eye_tracking_processing import ( + load_eye_tracking_hdf, determine_outliers, compute_circular_area, + compute_elliptical_area, determine_likely_blinks, + process_eye_tracking_data) + + +def create_preload_eye_tracking_df(data: np.ndarray) -> pd.DataFrame: + columns = ["center_x", "center_y", "width", "height", "phi"] + return pd.DataFrame(data, columns=columns) + + +def create_loaded_eye_tracking_df(data: np.ndarray) -> pd.DataFrame: + columns = ["cr_center_x", "cr_center_y", "cr_width", "cr_height", "cr_phi", + "eye_center_x", "eye_center_y", "eye_width", "eye_height", + "eye_phi", "pupil_center_x", "pupil_center_y", "pupil_width", + "pupil_height", "pupil_phi"] + df = pd.DataFrame(data, columns=columns) + df.index.name = 'frame' + return df + + +def create_area_df(data: np.ndarray) -> pd.DataFrame: + columns = ["cr_area", "eye_area", "pupil_area"] + return pd.DataFrame(data, columns=columns) + + +def create_refined_eye_tracking_df(data: np.ndarray) -> pd.DataFrame: + columns = ["timestamps", "cr_area", "eye_area", "pupil_area", + "likely_blink", "pupil_area_raw", "cr_area_raw", "eye_area_raw", + "cr_center_x", "cr_center_y", "cr_width", "cr_height", "cr_phi", + "eye_center_x", "eye_center_y", "eye_width", "eye_height", + "eye_phi", "pupil_center_x", "pupil_center_y", "pupil_width", + "pupil_height", "pupil_phi"] + df = pd.DataFrame(data, columns=columns) + df.index.name = 'frame' + # Initializing a df coerces all data to one dtype + # restoring the bool dtype for the 'likely_blink' column. + df['likely_blink'] = df['likely_blink'].apply(bool) + return df + + +@pytest.fixture +def hdf_fixture(request, tmp_path) -> Path: + """Creates a mock eye tracking h5 file to test loading functionality""" + tmp_hdf_path = tmp_path / "mock_eye_tracking_ellipse_fits.h5" + + test_data = request.param + cr = create_preload_eye_tracking_df(test_data["cr"]) + eye = create_preload_eye_tracking_df(test_data["eye"]) + pupil = create_preload_eye_tracking_df(test_data["pupil"]) + + cr.to_hdf(tmp_hdf_path, key="cr", mode="w") + eye.to_hdf(tmp_hdf_path, key="eye", mode="a") + pupil.to_hdf(tmp_hdf_path, key="pupil", mode="a") + + return tmp_hdf_path + + +@pytest.mark.parametrize("hdf_fixture, expected", [ + ({"cr": np.array([[1., 2., 3., 4., 5.]]), + "eye": np.array([[6., 7., 8., 9., 10.]]), + "pupil": np.array([[11., 12., 13., 14., 15.]])}, + + create_loaded_eye_tracking_df( + np.array([[1., 2., 3., 4., 5., 6., 7., 8., + 9., 10., 11., 12., 13., 14., 15.]])) + ), + + ({"cr": np.array([[5 + 2j, 4 + 1j, 3 + 1j, 2 + 8j, 1 + 1j]]), + "eye": np.array([[6, 7, 8, 9, 10]]), + "pupil": np.array([[15 + 1j, 14 + 3j, 13 + 2j, 12 + 1j, 11 + 1j]])}, + + create_loaded_eye_tracking_df( + np.array([[5., 4., 3., 2., 1., 6., 7., 8., + 9., 10., 15., 14., 13., 12., 11.]])) + ), + +], indirect=["hdf_fixture"]) +def test_load_eye_tracking_hdf(hdf_fixture: Path, expected: pd.DataFrame): + obtained = load_eye_tracking_hdf(hdf_fixture) + assert expected.equals(obtained) + + +@pytest.mark.parametrize("data_df, z_threshold, expected", [ + (create_area_df( + np.array([[1, 1, 2], + [2, 2, 1], + [1, 7, 3], + [1, 1, 1], + [1, 3, 2], + [1, 1, 1], + [1, 2, 1], + [2, 1, 1000]])), + 2.5, + pd.Series([False, False, False, False, False, False, False, True])), + + (create_area_df( + np.array([[1, 1, 2], + [2, 2, 1], + [1, 7, 3], + [1, 1, 1], + [1, 3, 2], + [1, 1, 1], + [1, 2, 1], + [2, 1, 1000]])), + 2.0, + pd.Series([False, False, True, False, False, False, False, True])), + +]) +def test_determine_outliers(data_df, z_threshold, expected): + obtained = determine_outliers(data_df, z_threshold) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("df_row, expected", [ + (pd.Series([3, 2], index=["width", "height"]), 9 * np.pi), + (pd.Series([2, 3], index=["width", "height"]), 9 * np.pi), +]) +def test_compute_circular_area(df_row: pd.Series, expected: float): + obtained_area = compute_circular_area(df_row) + assert obtained_area == expected + + +@pytest.mark.parametrize("df_row, expected", [ + (pd.Series([3, 2], index=["width", "height"]), 6 * np.pi), + (pd.Series([2, 3], index=["width", "height"]), 6 * np.pi), +]) +def test_compute_elliptical_area(df_row: pd.Series, expected: float): + obtained_area = compute_elliptical_area(df_row) + assert obtained_area == expected + + +@pytest.mark.parametrize( + "eye_areas, pupil_areas, outliers, dilation_frames, expected", + [ + (pd.Series([4, 8, 3, 20, np.nan, 10, 21, 19, 42]), + pd.Series([np.nan, 10, 2, 30, 99, 80, 93, 18, 777]), + pd.Series([False, False, False, False, False, False, + False, False, True]), + 2, + pd.Series([True, True, True, True, True, True, True, True, True])), + + (pd.Series([4, 8, 3, 20, np.nan, 10, 21, 19, 42]), + pd.Series([np.nan, 10, 2, 30, 99, 80, 93, 18, 777]), + pd.Series([False, False, False, False, False, False, + False, False, True]), + 1, + pd.Series([True, True, False, True, True, True, False, True, True])), + + + (pd.Series([4, 8, 3, 20, np.nan, 10, 21, 19, 42]), + pd.Series([np.nan, 10, 2, 30, 99, 80, 93, 18, 777]), + pd.Series([False, False, False, False, False, False, + False, False, True]), + 0, + pd.Series([True, False, False, False, True, False, False, + False, True])), + ]) +def test_determine_likely_blinks(eye_areas, pupil_areas, outliers, + dilation_frames, expected): + obtained = determine_likely_blinks(eye_areas, pupil_areas, outliers, + dilation_frames) + assert expected.equals(obtained) + + +@pytest.mark.parametrize("eye_tracking_df, frame_times", [ + (create_loaded_eye_tracking_df( + np.array([[1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1], + [2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2]])), + pd.Series(np.arange(0, 1.8, 0.1))), +]) +def test_process_eye_tracking_data_raises_on_sync_error(eye_tracking_df, + frame_times): + """ + Test that an error is raised when the number of sync timestamps exceeds + the number of eye tracking frames by more than 15 + """ + with pytest.raises(RuntimeError, match='Error! The number of sync file'): + process_eye_tracking_data(eye_tracking_df, frame_times) + + +@pytest.mark.parametrize("eye_tracking_df, frame_times", [ + (create_loaded_eye_tracking_df( + np.array([[1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1], + [2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2]])), + pd.Series(np.arange(0, 1.7, 0.1))), +]) +def test_process_eye_tracking_data_truncation(eye_tracking_df, + frame_times): + """ + Test that the array of sync times is truncated when the number + of raw sync timestamps exceeds the numer of eye tracking frames + by <= 15 + """ + df = process_eye_tracking_data(eye_tracking_df, frame_times) + np.testing.assert_array_almost_equal(df.timestamps.to_numpy(), + np.array([0.0, 0.1]), + decimal=10) + + +@pytest.mark.parametrize("eye_tracking_df, frame_times, expected", [ + (create_loaded_eye_tracking_df( + np.array([[1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., + 12., 13., 14., 15.], + [2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., + 13., 14., 15., 16.]])), + pd.Series([0.1, 0.2]), + create_refined_eye_tracking_df( + np.array([[0.1, 12 * np.pi, 72 * np.pi, 196 * np.pi, False, + 196 * np.pi, 12 * np.pi, 72 * np.pi, + 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., + 13., 14., 15.], + [0.2, 20 * np.pi, 90 * np.pi, 225 * np.pi, False, + 225 * np.pi, 20 * np.pi, 90 * np.pi, + 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., + 14., 15., 16.]])) + ), +]) +def test_process_eye_tracking_data(eye_tracking_df, frame_times, expected): + obtained = process_eye_tracking_data(eye_tracking_df, frame_times) + pd.testing.assert_frame_equal(obtained, expected) diff --git a/test/brain_observatory/behavior/test_mtrain_annotate.py b/test/brain_observatory/behavior/test_mtrain_annotate.py new file mode 100644 index 0000000000..983a419aef --- /dev/null +++ b/test/brain_observatory/behavior/test_mtrain_annotate.py @@ -0,0 +1,18 @@ +import pytest +import pandas as pd + +from allensdk.brain_observatory.behavior.mtrain import annotate_change_detect + + +@pytest.fixture +def trials(): + return pd.DataFrame({ + 'trial_type': ['go', 'catch', 'go', 'catch'], + 'response': [1.0, 1.0, 0.0, 0.0]}) + + +def test_annotate_change_detect(trials): + + annotate_change_detect(trials) + pd.testing.assert_series_equal(trials['change'], pd.Series([True, False, True, False], name='change')) + pd.testing.assert_series_equal(trials['detect'], pd.Series([True, True, False, False], name='detect')) diff --git a/test/brain_observatory/behavior/test_prior_exposure_count_processing.py b/test/brain_observatory/behavior/test_prior_exposure_count_processing.py new file mode 100644 index 0000000000..dbce9cf848 --- /dev/null +++ b/test/brain_observatory/behavior/test_prior_exposure_count_processing.py @@ -0,0 +1,65 @@ +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.behavior.behavior_project_cache.tables.util \ + .prior_exposure_processing import \ + get_prior_exposures_to_session_type, get_prior_exposures_to_image_set, \ + get_prior_exposures_to_omissions + + +def test_prior_exposure_to_session_type(): + """Tests normal behavior as well as case where session type is missing""" + df = pd.DataFrame({ + 'session_type': ['A', 'A', None, 'A', 'B'], + 'mouse_id': [0, 0, 0, 0, 1], + 'date_of_acquisition': [0, 1, 2, 3, 0] + }, index=pd.Series([0, 1, 2, 3, 4], name='behavior_session_id')) + expected = pd.Series([0, 1, np.nan, 2, 0], + index=pd.Series([0, 1, 2, 3, 4], + name='behavior_session_id')) + obtained = get_prior_exposures_to_session_type(df=df) + pd.testing.assert_series_equal(expected, obtained) + + +def test_prior_exposure_to_image_set(): + """Tests normal behavior as well as case where session type is not an + image set type""" + df = pd.DataFrame({ + 'session_type': ['TRAINING_1_images_A', 'OPHYS_2_images_A_passive', + 'foo', 'OPHYS_3_images_A', 'B'], + 'mouse_id': [0, 0, 0, 0, 1], + 'date_of_acquisition': [0, 1, 2, 3, 0] + }, index=pd.Index([0, 1, 2, 3, 4], name='behavior_session_id')) + expected = pd.Series([0, 1, np.nan, 2, np.nan], + index=pd.Series([0, 1, 2, 3, 4], + name='behavior_session_id')) + obtained = get_prior_exposures_to_image_set(df=df) + pd.testing.assert_series_equal(expected, obtained) + + +def test_prior_exposure_to_omissions(): + """Tests normal behavior and tests case where flash_omit_probability + needs to be looked up for habituation session. Only 1 of the habituation + sessions has omissions""" + df = pd.DataFrame({ + 'session_type': ['OPHYS_1_images_A', 'OPHYS_2_images_A_passive', + 'OPHYS_1_habituation', 'OPHYS_2_habituation', + 'OPHYS_3_habituation'], + 'mouse_id': [0, 0, 1, 1, 1], + 'foraging_id': [1, 2, 3, 4, 5], + 'date_of_acquisition': [0, 1, 0, 1, 2] + }, index=pd.Index([0, 1, 2, 3, 4], name='behavior_session_id')) + expected = pd.Series([0, 1, 0, 0, 1], + index=pd.Index([0, 1, 2, 3, 4], + name='behavior_session_id')) + + class MockFetchApi: + def get_behavior_stage_parameters(self, foraging_ids): + return { + 3: {}, + 4: {'flash_omit_probability': 0.05}, + 5: {} + } + fetch_api = MockFetchApi() + obtained = get_prior_exposures_to_omissions(df=df, fetch_api=fetch_api) + pd.testing.assert_series_equal(expected, obtained) diff --git a/test/brain_observatory/behavior/test_rewards_processing.py b/test/brain_observatory/behavior/test_rewards_processing.py new file mode 100644 index 0000000000..d344bce6ee --- /dev/null +++ b/test/brain_observatory/behavior/test_rewards_processing.py @@ -0,0 +1,38 @@ +import pandas as pd +import numpy as np + +from allensdk.brain_observatory.behavior.rewards_processing import get_rewards + + +def test_get_rewards(): + data = { + "items": { + "behavior": { + "trial_log": [ + { + 'rewards': [(0.007, 1085.96, 55)], + 'trial_params': { + 'catch': False, 'auto_reward': False, + 'change_time': 5}}, + { + 'rewards': [(0.008, 1090.01, 66)], + 'trial_params': { + 'catch': False, 'auto_reward': True, + 'change_time': 6}}, + { + 'rewards': [], + 'trial_params': { + 'catch': False, 'auto_reward': False, + 'change_time': 4}, + }, + ] + }}} + expected = pd.DataFrame( + {"volume": [0.007, 0.008], + "timestamps": [14.0, 15.0], + "autorewarded": [False, True]}) + + timesteps = -1*np.ones(100, dtype=float) + timesteps[55] = 14.0 + timesteps[66] = 15.0 + pd.testing.assert_frame_equal(expected, get_rewards(data, timesteps)) diff --git a/test/brain_observatory/behavior/test_session_metrics.py b/test/brain_observatory/behavior/test_session_metrics.py new file mode 100644 index 0000000000..8fc6ad96ef --- /dev/null +++ b/test/brain_observatory/behavior/test_session_metrics.py @@ -0,0 +1,71 @@ +import pytest +from allensdk.brain_observatory.behavior import session_metrics as metrics +import pandas as pd +import numpy as np + + +@pytest.mark.parametrize( + "trials, detect_col, trial_types, expected", + [ + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True]}), + "detect", + ["go", "catch"], + 0.75, + ), + ( + pd.DataFrame({"trial_type":[ "go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True]}), + "detect", + ["go"], + 0.5, + ), + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True]}), + "detect", + [], + 0.8, + ), + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True]}), + "detect", + ["early"], + np.nan, + ), + ], +) +def test_response_bias(trials, detect_col, trial_types, expected): + assert metrics.response_bias(trials, detect_col, trial_types) == \ + pytest.approx(expected, nan_ok=True) + + +@pytest.mark.parametrize( + "trials, expected", + [ + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"],}), + 4, + ), + ( + pd.DataFrame({"trial_type":[ "go", "go", "go"],}), + 3, + ), + ( + pd.DataFrame({"trial_type": ["catch"],}), + 1, + ), + ( + pd.DataFrame({"trial_type": [],}), + 0, + ), + ( + pd.DataFrame({"trial_type": ["aborted", "nogo"]}), + 0, + ) + ], +) +def test_num_contingent_trials(trials, expected): + assert metrics.num_contingent_trials(trials) == expected diff --git a/test/brain_observatory/behavior/test_stimulus_processing.py b/test/brain_observatory/behavior/test_stimulus_processing.py new file mode 100644 index 0000000000..02592a2c48 --- /dev/null +++ b/test/brain_observatory/behavior/test_stimulus_processing.py @@ -0,0 +1,459 @@ +import os + +import numpy as np +import pandas as pd +import pytest + +from allensdk.brain_observatory.behavior.stimulus_processing import ( + get_stimulus_presentations, _get_stimulus_epoch, _get_draw_epochs, + get_visual_stimuli_df, get_stimulus_metadata, get_gratings_metadata, + get_stimulus_templates, is_change_event) +from allensdk.brain_observatory.behavior.data_objects.stimuli\ + .stimulus_templates import StimulusImage +from allensdk.test.brain_observatory.behavior.conftest import get_resources_dir + + +@pytest.fixture() +def behavior_stimuli_time_fixture(request): + """ + Fixture that allows for parameterization of behavior_stimuli stimuli + time data. + """ + timestamp_count = request.param["timestamp_count"] + time_step = request.param["time_step"] + + timestamps = np.array([time_step * i for i in range(timestamp_count)]) + + return timestamps + + +@pytest.mark.parametrize( + "behavior_stimuli_data_fixture,current_set_ix,start_frame," + "n_frames,expected", [ + ({'images_set_log': [ + ('Image', 'im065', 5.809955710916157, 0), + ('Image', 'im061', 314.06612555068784, 6), + ('Image', 'im062', 348.5941232265203, 12) + ], + 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, + 0, 0, 18, (0, 6)), + ({'images_set_log': [ + ('Image', 'im065', 5.809955710916157, 0), + ('Image', 'im061', 314.06612555068784, 6), + ('Image', 'im062', 348.5941232265203, 12) + ], + 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, + 2, 11, 18, (11, 18)) + ], indirect=["behavior_stimuli_data_fixture"] +) +def test_get_stimulus_epoch(behavior_stimuli_data_fixture, + current_set_ix, start_frame, n_frames, expected): + items = behavior_stimuli_data_fixture["items"] + log = items["behavior"]["stimuli"]["images"]["set_log"] + actual = _get_stimulus_epoch(log, current_set_ix, start_frame, n_frames) + assert actual == expected + + +@pytest.mark.parametrize( + "behavior_stimuli_data_fixture,start_frame,stop_frame,expected," + "stimuli_type", [ + ({'images_set_log': [ + ('Image', 'im065', 5.809955710916157, 0), + ('Image', 'im061', 314.06612555068784, 6), + ('Image', 'im062', 348.5941232265203, 12) + ], + 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, + 0, 6, [(1, 4)], 'images'), + ({'images_set_log': [ + ('Image', 'im065', 5.809955710916157, 0), + ('Image', 'im061', 314.06612555068784, 6), + ('Image', 'im062', 348.5941232265203, 12) + ], + 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, + 0, 11, [(1, 4), (8, 11)], 'images'), + ({'images_set_log': [ + ('Image', 'im065', 5.809955710916157, 0), + ('Image', 'im061', 314.06612555068784, 6), + ('Image', 'im062', 348.5941232265203, 12) + ], + 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, + 0, 22, [(1, 4), (8, 11), (15, 18)], 'images'), + ({"grating_set_log": [ + ("Ori", 90, 3.585, 0), + ("Ori", 180, 40.847, 6), + ("Ori", 270, 62.633, 12) + ], + "grating_draw_log": ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, + 0, 6, [(1, 4)], 'grating'), + ({"grating_set_log": [ + ("Ori", 90.0, 3.585, 0), + ("Ori", 180.0, 40.847, 6), + ("Ori", 270.0, 62.633, 12) + ], + "grating_draw_log": ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, + 6, 11, [(8, 11)], 'grating') + ], indirect=['behavior_stimuli_data_fixture'] +) +def test_get_draw_epochs(behavior_stimuli_data_fixture, + start_frame, stop_frame, expected, stimuli_type): + draw_log = (behavior_stimuli_data_fixture["items"]["behavior"] + ["stimuli"][stimuli_type]["draw_log"]) # noqa: E128 + actual = _get_draw_epochs(draw_log, start_frame, stop_frame) + assert actual == expected + + +@pytest.mark.parametrize("behavior_stimuli_data_fixture", ({},), + indirect=["behavior_stimuli_data_fixture"]) +def test_get_stimulus_templates(behavior_stimuli_data_fixture): + templates = get_stimulus_templates(behavior_stimuli_data_fixture, + grating_images_dict={}) + + assert templates.image_set_name == 'test_image_set' + assert len(templates) == 1 + assert list(templates.keys()) == ['im065'] + + for img in templates.values(): + assert isinstance(img, StimulusImage) + + expected_path = os.path.join(get_resources_dir(), 'stimulus_template', + 'expected') + + expected_unwarped_path = os.path.join( + expected_path, 'im065_unwarped.pkl') + expected_unwarped = pd.read_pickle(expected_unwarped_path) + + expected_warped_path = os.path.join( + expected_path, 'im065_warped.pkl') + expected_warped = pd.read_pickle(expected_warped_path) + + for img_name in templates: + img = templates[img_name] + assert np.allclose(a=expected_unwarped, + b=img.unwarped, equal_nan=True) + assert np.allclose(a=expected_warped, + b=img.warped, equal_nan=True) + + for img_name, img in templates.items(): + img = templates[img_name] + assert np.allclose(a=expected_unwarped, + b=img.unwarped, equal_nan=True) + assert np.allclose(a=expected_warped, + b=img.warped, equal_nan=True) + + +@pytest.mark.parametrize(("behavior_stimuli_data_fixture, " + "grating_images_dict, expected"), [ + ({"has_images": False}, + {"gratings_90.0": {"warped": np.ones((2, 2)), + "unwarped": np.ones( + (2, 2)) * 2}}, + {}), + ], indirect=["behavior_stimuli_data_fixture"]) +def test_get_stimulus_templates_for_gratings(behavior_stimuli_data_fixture, + grating_images_dict, expected): + templates = get_stimulus_templates(behavior_stimuli_data_fixture, + grating_images_dict=grating_images_dict) + + assert templates.image_set_name == 'grating' + assert list(templates.keys()) == ['gratings_90.0'] + assert np.allclose(templates['gratings_90.0'].warped, + np.array([[1, 1], [1, 1]])) + assert np.allclose(templates['gratings_90.0'].unwarped, + np.array([[2, 2], [2, 2]])) + + +# def test_get_images_dict(): +# pass +# # TODO +# # This is too hard-coded to be testable right now. +# # convert_filepath_caseinsensitive prevents using any tempdirs/tempfiles + + +@pytest.mark.parametrize("behavior_stimuli_data_fixture, remove_stimuli, " + "starting_index, expected_metadata", [ + ({ + "grating_set_log": [] + }, [], 0, + { + 'image_category': {}, + 'image_name': {}, + 'image_set': {}, + 'phase': {}, + 'spatial_frequency': {}, + 'orientation': {}, + 'image_index': {} + }), + ({}, [], 0, + { + 'image_category': {0: 'grating'}, + 'image_name': {0: 'gratings_90.0'}, + 'image_set': {0: 'grating'}, + 'phase': {0: None}, + 'spatial_frequency': {0: None}, + 'orientation': {0: 90}, + 'image_index': {0: 0} + }), + ({'grating_phase': 0.5, + 'grating_spatial_frequency': 12}, [], 0, + { + 'image_category': {0: 'grating'}, + 'image_name': {0: 'gratings_90.0'}, + 'image_set': {0: 'grating'}, + 'phase': {0: 0.5}, + 'spatial_frequency': {0: 12}, + 'orientation': {0: 90}, + 'image_index': {0: 0} + }), + ({"grating_set_log": [ + ("Ori", 90.0, 3.5, 0), + ("Ori", 270.0, 15, 6) + ], + "grating_phase": 0.5, + "grating_spatial_frequency": 12}, + [], 12, + { + 'image_category': {0: 'grating', + 1: 'grating'}, + 'image_name': {0: 'gratings_90.0', + 1: 'gratings_270.0'}, + 'image_set': {0: 'grating', + 1: 'grating'}, + 'phase': {0: 0.5, 1: 0.5}, + 'spatial_frequency': {0: 12, 1: 12}, + 'orientation': {0: 90, 1: 270}, + 'image_index': {0: 12, 1: 13} + }), + ({}, ['grating'], 0, + { + 'image_category': {}, + 'image_name': {}, + 'image_set': {}, + 'phase': {}, + 'spatial_frequency': {}, + 'orientation': {}, + 'image_index': {} + }), + ({"grating_set_log": + [ + ("Ori", 90, 3, 0) + ], + "grating_phase": 0.5, + "grating_spatial_frequency": 0.25}, + [], 0, + { + 'image_category': {0: 'grating'}, + 'image_name': {0: 'gratings_90.0'}, + 'image_set': {0: 'grating'}, + 'phase': {0: 0.5}, + 'spatial_frequency': {0: 0.25}, + 'orientation': {0: 90}, + 'image_index': {0: 0} + }) + ], + indirect=['behavior_stimuli_data_fixture']) +def test_get_gratings_metadata(behavior_stimuli_data_fixture, remove_stimuli, + starting_index, expected_metadata): + stimuli = behavior_stimuli_data_fixture['items']['behavior']['stimuli'] + for remove_stim in remove_stimuli: + del stimuli[remove_stim] + grating_meta = get_gratings_metadata(stimuli, start_idx=starting_index) + + assert grating_meta.to_dict() == expected_metadata + + +@pytest.mark.parametrize("behavior_stimuli_data_fixture, remove_stimuli, " + "expected_metadata", [ + ({'grating_phase': 10.0, + 'grating_spatial_frequency': 90.0, + "grating_set_log": [ + ("Ori", 90.0, 3.585, 0), + ("Ori", 180.0, 40.847, 6), + ("Ori", 270.0, 62.633, 12)] + }, + ['images'], + {'image_index': [0, 1, 2, 3], + 'image_name': ['gratings_90.0', + 'gratings_180.0', + 'gratings_270.0', 'omitted'], + 'image_category': ['grating', + 'grating', 'grating', + 'omitted'], + 'image_set': ['grating', 'grating', + 'grating', 'omitted'], + 'phase': [10, 10, 10, None], + 'spatial_frequency': [90, 90, + 90, None], + 'orientation': [90, 180, 270, None]}), + ({}, ['images', 'grating'], + {'image_index': [0], + 'image_name': ['omitted'], + 'image_category': ['omitted'], + 'image_set': ['omitted'], + 'phase': [None], + 'spatial_frequency': [None], + 'orientation': [None]})], + indirect=['behavior_stimuli_data_fixture']) +def test_get_stimulus_metadata(behavior_stimuli_data_fixture, + remove_stimuli, expected_metadata): + for key in remove_stimuli: + # do this because at current images are not tested and there's a + # hard coded path that prevents testing when this is fixed this can + # be removed. + del behavior_stimuli_data_fixture['items']['behavior']['stimuli'][key] + stimulus_metadata = get_stimulus_metadata(behavior_stimuli_data_fixture) + + expected_df = pd.DataFrame.from_dict(expected_metadata) + expected_df.set_index(['image_index'], inplace=True, drop=True) + + assert stimulus_metadata.equals(expected_df) + + +@pytest.mark.parametrize("behavior_stimuli_time_fixture," + "behavior_stimuli_data_fixture, " + "expected", [ + ({"timestamp_count": 15, "time_step": 1}, + {"images_set_log": [ + ('Image', 'im065', 5, 0), + ('Image', 'im064', 25, 6) + ], + "images_draw_log": (([0] * 2 + [1] * 2 + + [0] * 3) * 2 + [0]), + "grating_set_log": [ + ("Ori", 90, 3.5, 0), + ("Ori", 270, 15, 6) + ], + "grating_draw_log": ( + ([0] + [1] * 3 + [0] * 3) + * 2 + [0])}, + {"duration": [3.0, 2.0, 3.0, 2.0], + "end_frame": [5.0, 5.0, 12.0, 12.0], + "image_name": [np.NaN, 'im065', np.NaN, + 'im064'], + "index": [2, 0, 3, 1], + "omitted": [False, False, False, False], + "orientation": [90, np.NaN, 270, np.NaN], + "start_frame": [2.0, 3.0, 9.0, 10.0], + "start_time": [2, 3, 9, 10], + "stop_time": [5, 5, 12, 12]}) + ], indirect=['behavior_stimuli_time_fixture', + 'behavior_stimuli_data_fixture']) +def test_get_stimulus_presentations(behavior_stimuli_time_fixture, + behavior_stimuli_data_fixture, + expected): + presentations_df = get_stimulus_presentations( + behavior_stimuli_data_fixture, + behavior_stimuli_time_fixture) + + expected_df = pd.DataFrame.from_dict(expected) + + assert presentations_df.equals(expected_df) + + +@pytest.mark.parametrize("behavior_stimuli_time_fixture," + "behavior_stimuli_data_fixture," + "expected_data", [ + ({"timestamp_count": 15, "time_step": 1}, + {"images_set_log": [ + ('Image', 'im065', 5, 0), + ('Image', 'im064', 25, 6) + ], + "images_draw_log": (([0] * 2 + [1] * 2 + + [0] * 3) * 2 + [0]), + "grating_set_log": [ + ("Ori", 90, 3.5, 0), + ("Ori", 270, 15, 6) + ], + "grating_draw_log": ( + ([0] + [1] * 3 + [0] * 3) + * 2 + [0])}, + {"orientation": [90, None, 270, None], + "image_name": [None, 'im065', None, 'im064'], + "frame": [2.0, 3.0, 9.0, 10.0], + "end_frame": [5.0, 5.0, 12.0, 12.0], + "time": [2.0, 3.0, 9.0, 10.0], + "duration": [3.0, 2.0, 3.0, 2.0], + "omitted": [False, False, False, False]}), + + # test case with images and a static grating + ({"timestamp_count": 30, "time_step": 1}, + {"images_set_log": [ + ('Image', 'im065', 5, 0), + ('Image', 'im064', 25, 6) + ], + "images_draw_log": (([0] * 2 + [1] * 2 + + [0] * 3) * 2 + [ + 0] * 16), + "grating_set_log": [ + ("Ori", 90, -1, 12), + # -1 because that element is not used + ("Ori", 270, -1, 24) + ], + "grating_draw_log": ( + [0] * 17 + [1] * 11 + [0, 0])}, + {"orientation": [None, None, 90, 270], + "image_name": ['im065', 'im064', None, None], + "frame": [3.0, 10.0, 18.0, 25.0], + "end_frame": [5.0, 12.0, 25.0, 29.0], + "time": [3.0, 10.0, 18.0, 25.0], + "duration": [2.0, 2.0, 7.0, 4.0], + "omitted": [False, False, False, False]}) + ], + indirect=["behavior_stimuli_time_fixture", + "behavior_stimuli_data_fixture"]) +def test_get_visual_stimuli_df(behavior_stimuli_time_fixture, + behavior_stimuli_data_fixture, + expected_data): + stimuli_df = get_visual_stimuli_df(behavior_stimuli_data_fixture, + behavior_stimuli_time_fixture) + stimuli_df = stimuli_df.drop('index', axis=1) + + expected_df = pd.DataFrame.from_dict(expected_data) + assert stimuli_df.equals(expected_df) + + +def test_is_change_event_no_change(): + """Test case for no change""" + stimulus_presentations = pd.DataFrame({ + 'image_name': ['A', 'A', 'A'], + 'omitted': [False, False, False] + }) + + obtained = is_change_event(stimulus_presentations=stimulus_presentations) + expected = pd.Series([False, False, False], name='is_change') + pd.testing.assert_series_equal(obtained, expected) + + +def test_is_change_event_all_change(): + """Test case for all change""" + stimulus_presentations = pd.DataFrame({ + 'image_name': ['A', 'B', 'C'], + 'omitted': [False, False, False] + }) + + obtained = is_change_event(stimulus_presentations=stimulus_presentations) + expected = pd.Series([False, True, True], name='is_change') + pd.testing.assert_series_equal(obtained, expected) + + +def test_is_change_omission(): + """Test case for single omission""" + stimulus_presentations = pd.DataFrame({ + 'image_name': ['A', 'B', 'C'], + 'omitted': [False, True, False] + }) + + obtained = is_change_event(stimulus_presentations=stimulus_presentations) + expected = pd.Series([False, False, True], name='is_change') + pd.testing.assert_series_equal(obtained, expected) + + +def test_is_change_mult_omission(): + """Test case for multiple omission""" + stimulus_presentations = pd.DataFrame({ + 'image_name': ['A', 'B', 'C', 'D'], + 'omitted': [False, True, True, False] + }) + + obtained = is_change_event(stimulus_presentations=stimulus_presentations) + expected = pd.Series([False, False, False, True], name='is_change') + pd.testing.assert_series_equal(obtained, expected) diff --git a/test/brain_observatory/behavior/test_sync_processing.py b/test/brain_observatory/behavior/test_sync_processing.py new file mode 100644 index 0000000000..02d8479998 --- /dev/null +++ b/test/brain_observatory/behavior/test_sync_processing.py @@ -0,0 +1,76 @@ +import os +import pytest +import numpy as np +import allensdk.brain_observatory.behavior.sync as sync +from allensdk.brain_observatory.sync_dataset import Dataset + +base_dir = os.path.join( + "/", + "allen", + "programs", + "braintv", + "production", + "visualbehavior", + "prod0", + "specimen_789992909", + "ophys_session_819949602", +) +sync_path=os.path.join( + base_dir, + "819949602_sync.h5" +) + + +@pytest.mark.requires_bamboo +@pytest.mark.parametrize("sync_path, sync_key, count_exp, last_exp", [ + [sync_path, "ophys_frames", 140082, 4530.11659], + [sync_path, "lick_times", 2099, 3860.94482], + [sync_path, "ophys_trigger", 1, 6.8612], + [sync_path, "eye_tracking", 135908, 4531.00479], + [sync_path, "behavior_monitoring", 135887, 4530.19092], + [sync_path, "stim_photodiode", 4512, 4510.80997], + [sync_path, "stimulus_times_no_delay", 269977, 4510.25654], +]) +def test_get_time_sync_integration(sync_path, sync_key, count_exp, last_exp): + obt = sync.get_sync_data(sync_path)[sync_key] + assert count_exp == len(obt) + assert last_exp == obt[-1] + + +@pytest.mark.parametrize("fn, key, rise, fall, expect", [ + [sync.get_trigger, "foo", None, None, None], + [sync.get_trigger, "2p_trigger", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_trigger, "acq_trigger", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_eye_tracking, "cam2_exposure", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_eye_tracking, "eye_tracking", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_behavior_monitoring, "cam1_exposure", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_behavior_monitoring, "behavior_monitoring", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_stim_photodiode, "stim_photodiode", [1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6]], + [sync.get_stim_photodiode, "photodiode", [1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6]], + [sync.get_lick_times, "lick_times", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_lick_times, "lick_sensor", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_ophys_frames, "2p_vsync", [1, 2, 3], [4, 5, 6], [1, 2, 3]], + [sync.get_raw_stimulus_frames, "stim_vsync", [1, 2, 3], [4, 5, 6], [4, 5, 6]], +]) +def test_timestamp_extractors(fn, key, rise, fall, expect): + + class Ds(Dataset): + def __init__(self): + self.line_labels = [key, "1", "2"] + + def get_rising_edges(self, line, units): + if not line in self.line_labels: + raise ValueError + return rise + + def get_falling_edges(self, line, units): + if not line in self.line_labels: + raise ValueError + return fall + + if expect is None: + with pytest.raises(KeyError) as _err: + fn(Ds()) + else: + assert np.allclose(expect, fn(Ds())) + diff --git a/test/brain_observatory/behavior/test_trial_masks.py b/test/brain_observatory/behavior/test_trial_masks.py new file mode 100644 index 0000000000..b0e6b1f1c7 --- /dev/null +++ b/test/brain_observatory/behavior/test_trial_masks.py @@ -0,0 +1,107 @@ +import pytest +from allensdk.brain_observatory.behavior import trial_masks as masks +import pandas as pd +import numpy as np + + +@pytest.mark.parametrize( + "trials, trial_types, expected", + [ + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True],}), + ["go", "catch"], + pd.Series([True, True, True, True, False], name="trial_type"), + ), + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True],}), + ["aborted"], + pd.Series([False, False, False, False, True], name="trial_type") + ), + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True],}), + [], + pd.Series([True, True, True, True, True], name="trial_type"), + ), + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True],}), + ["early"], + pd.Series([False, False, False, False, False], name="trial_type"), + ), + ( + pd.DataFrame({"trial_type": [], + "detect": [],}), + ["go", "catch"], + pd.Series([], name="trial_type"), + ), + ], +) +def test_trial_types(trials, trial_types, expected): + pd.testing.assert_series_equal( + masks.trial_types(trials, trial_types), expected, check_dtype=False) + + + +@pytest.mark.parametrize( + "trials, trial_types, expected", + [ + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "include": [True, False, True, True, True],}), + ["go", "catch"], + pd.Series([True, True, True, False], name="trial_type", + index=[0, 2, 3, 4]), + ), + ], +) +def test_trial_types_works_with_subselection(trials, trial_types, expected): + pd.testing.assert_series_equal( + masks.trial_types(trials[trials["include"]], trial_types), expected, + check_dtype=False) + + +@pytest.mark.parametrize( + "trials, expected", + [ + ( + pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], + "detect": [True, False, True, True, True],}), + pd.Series([True, True, True, True, False], name="trial_type"), + ), + ( + pd.DataFrame({"trial_type": [], + "detect": [],}), + pd.Series([], name="trial_type"), + ), + ] +) +def test_contingent_trials(trials, expected): + pd.testing.assert_series_equal( + masks.contingent_trials(trials), expected, check_dtype=False) + + +@pytest.mark.parametrize( + "trials, thresh, expected", + [ + ( + pd.DataFrame({"reward_rate": [0.0, 1.0, 2.0, 3.0]}), + -1.0, + pd.Series([True, True, True, True], name="reward_rate"), + ), + ( + pd.DataFrame({"reward_rate": [0.0, 1.0, 2.0, 3.0]}), + 1.0, + pd.Series([False, False, True, True], name="reward_rate"), + ), + ( + pd.DataFrame({"reward_rate": [0.0, 1.0, 2.0, 3.0]}), + 3.0, + pd.Series([False, False, False, False], name="reward_rate"), + ), + ] +) +def test_reward_rate(trials, thresh, expected): + pd.testing.assert_series_equal(masks.reward_rate(trials, thresh), expected) \ No newline at end of file diff --git a/test/brain_observatory/behavior/test_trials_processing.py b/test/brain_observatory/behavior/test_trials_processing.py new file mode 100644 index 0000000000..5480f92049 --- /dev/null +++ b/test/brain_observatory/behavior/test_trials_processing.py @@ -0,0 +1,742 @@ +import pytest +import pandas as pd +import numpy as np +from itertools import combinations + +from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior import trials_processing +from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP +from allensdk.internal.api import db_connection_creator + + +@pytest.mark.requires_bamboo +@pytest.mark.parametrize( + 'behavior_experiment_id, ti, expected, exception', [ + (880293569, 5, (90, 90, None), None,), + (881236761, 0, None, IndexError,) + ] +) +def test_get_ori_info_from_trial(behavior_experiment_id, + ti, + expected, + exception, ): + """was feeling worried that the values would be wrong, + this helps reaffirm that maybe they are not... + + Notes + ----- + - i may be rewriting code here but its more a sanity check really... + """ + def _get_stimulus_data(): + lims_db = db_connection_creator( + fallback_credentials=LIMS_DB_CREDENTIAL_MAP) + stimulus_file = StimulusFile.from_lims( + db=lims_db, behavior_session_id=behavior_experiment_id) + return stimulus_file.data + stim_output = _get_stimulus_data() + trial_log = stim_output['items']['behavior']['trial_log'] + + if exception: + with pytest.raises(exception): + trials_processing.get_ori_info_from_trial(trial_log, ti, ) + else: + assert trials_processing.get_ori_info_from_trial(trial_log, ti, ) == expected # noqa: E501 + + +_test_response_latency_0 = np.array( + [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, 0.3669842, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 0.41701037, + np.nan, np.nan, 0.31692564, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, 0.28356898, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, 0.33363652, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, 0.21683128, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, 0.38365788, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, + np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]) +_test_starttime_0 = np.array( + [19.99986754, 22.9857173, 25.25430697, 27.50627203, 30.50876019, + 33.54466563, 37.314543, 38.06517225, 41.0677066, 42.58570486, + 44.83770039, 52.3774269, 57.63187756, 62.91968583, 66.67286547, + 68.17414034, 69.67541489, 74.19590836, 77.19846323, 78.69971244, + 80.9516403, 83.95418202, 86.22276367, 87.72406035, 89.97592663, + 92.97849208, 95.23039781, 97.49898909, 100.50154941, 102.75344423, + 104.25473193, 107.25726563, 109.50917136, 111.7610819, 114.01299179, + 116.26490714, 119.26744951, 121.51938378, 124.53862772, 127.55782612, + 129.80972512, 132.81226619, 137.31609721, 138.81734546, 141.08594764, + 143.33787839, 146.35708545, 149.35962973, 156.86599991, 159.88526245, + 163.65508305, 173.44672267, 175.69862167, 178.70117974, 180.95312267, + 183.22166712, 186.22421269, 189.24343194, 191.49533542, 195.28190828, + 198.28443076, 201.30364616, 203.55556985, 205.82415567, 209.577343, + 213.3472146, 216.34976979, 218.61835433, 222.38820892, 226.14139112, + 233.64779273, 234.39842519, 235.16570215, 237.4176191, 239.66953991, + 241.93811899, 244.94066135, 247.94320564, 249.44448821, 252.44703217, + 253.96497334, 254.71559618, 256.2168919, 263.73995532, 266.74247811, + 268.99441912, 271.2629764, 275.0161833, 276.51745143, 278.03538907, + 280.2873025, 282.53921593, 284.80780047, 287.81034956, 290.06226106, + 291.56355774, 294.56608823, 297.58530492, 299.83719974, 302.08911637, + 304.34102787, 308.1109572, 315.6172597, 317.11854964, 319.37043805, + 321.65571199, 323.90761451, 325.40892787, 327.66080216, 329.91271591, + 332.9319358, 336.68513692, 339.70434687, 341.20561115, 341.95625997, + 345.72611233, 347.22738976, 349.4626279, 357.01902553, 359.27093992, + 362.29016334, 365.29272109, 368.31197049, 372.06513441, 373.58308296, + 375.83498259, 377.3362504, 379.58815677, 382.60747224, 387.11118876, + 390.11375903, 392.3823596, 394.63425956, 396.88616336, 399.92207297, + 402.92464964, 405.94383939, 408.19575538, 410.46437038, 413.46690377, + 416.4694612, 418.72134384, 420.95662335, 423.95913236, 425.46040562, + 427.71231745, 429.98091481, 432.98349662, 434.48471376, 435.98598863, + 438.98854735, 442.0077961, 444.25968163, 446.54494947, 448.02954296, + 451.79940525, 454.81863412, 457.07053664, 459.33912952, 461.59103621, + 463.85962107, 465.360903, 467.61282348, 469.8814, 471.3826691, + 474.38523327, 477.42112684, 479.67303705, 481.94162769, 484.94417229, + 487.96340758, 490.21530914, 492.46722064, 494.73581031, 498.48898834, + 501.50822074, 503.00949272, 505.2780933, 507.53000255, 510.54922212, + 514.31907961, 516.57098918, 518.83957885, 520.34085308, 523.3600781, + 525.61201879, 529.39853328, 531.6504467, 533.91904696, 536.17094563, + 539.94081562, 542.19272616, 545.19526724, 546.69653986, 548.19781249, + 550.44972206, 553.46895029, 556.4714981, 559.47403694, 562.47658507]) + +expected_result_0 = np.array([ + np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, + np.inf, np.inf, 0.85743611, 0.82215855, 0.79754855, 0.77420232, + 0.74532604, 0.72504419, 0.73828876, 0.73168092, 0.73168145, + 0.73844044, 0.745635, 0.75997116, 0.73889553, 0.7457893, 0.73212764, + 0.72533739, 0., 0., 0., 0., 0., 0., 0., 0.83147215, 0.76759434, + 0.76013235, 1.50562915, 1.37576878, 1.36403067, 1.3524898, + 1.3640296, 1.36377167, 1.35249025, 1.35223636, 1.35223623, + 1.31828762, 1.31828779, 1.30726822, 1.30726804, 1.30703059, 1.28600222, + 1.27551339, 1.26541718, 1.27551391, 1.26541723, 1.86854445, 1.78508514, + 1.85409645, 1.86822076, 1.86854435, 1.86854454, 1.88321881, 1.88321885, + 1.31756348, 1.33989546, 1.35147388, 0.74517267, 0.75933052, 1.54807324, + 1.44950587, 1.43676766, 1.44979704, 1.46306592, 1.43676702, 1.47718591, + 1.50468411, 1.51930166, 1.51930185, 1.51930188, 1.53387944, 1.5642303, + 1.59545215, 1.58003398, 1.59580631, 1.62831513, 0.87666335, 0.85784626, + 1.6450693, 1.53453391, 1.54940651, 1.54974049, 1.56423021, 1.57968714, + 1.5796865, 1.59545254, 1.5800338, 1.53420629, 1.49127149, 0.78984375, + 0.80576787, 0.82234767, 0.80576784, 0.83089596, 1.64507108, 1.51930204, + 1.51930202, 1.50468432, 1.49096252, 1.49065321, 1.46336336, 1.46306626, + 1.4765797, 1.50468436, 1.50468414, 1.4903434, 1.44979783, 1.46336463, + 0.78160518, 0.77403664, 0.77403649, 0.76661287, 0.75932993, 0.74501851, + 0.74501813, 0.74486366, 0.74501799, 0.75202743, 0.7593303, 0.75234155, + 0.73168169, 0.7524993, 0.74548119, 0.74517234, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., +]) + +expected_result_1 = np.array( + [np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, + np.inf, np.inf, 1.811146, 1.944290, 1.898119, 1.811146, 1.733465, + 1.771897, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 2.417308, 2.047210, 1.994977, 3.890695, 3.321282, + 3.253684, 3.190197, 3.190196, 3.255157, 3.255157, 1.853143, 1.898129, + 1.897124, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 2.153860, 1.855050, 1.945345, 2.044882, + 2.155151, 2.279434, 2.344817, 2.279435, 2.347877, 2.574765, 0.000000, + 0.000000, 0.000000, 3.191613, 2.492687, 2.418930, 2.494413, 2.572924, + 2.346344, 2.492686, 2.492686, 2.346343, 2.279434, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 2.574758, 2.157737, 2.217599, 2.157739, 2.214870, 2.279435, 2.346341, + 2.346345, 2.346345, 2.417310, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 2.752063, 2.213507, 2.277990, 2.343290, 2.344815, + 2.213503, 1.992768, 2.153859, 2.097345, 2.152573, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, ]) + + +@pytest.mark.parametrize('kwargs, expected', [ + ( + { + 'response_latency': _test_response_latency_0, + 'starttime': _test_starttime_0, + 'trial_window': 15, + 'initial_trials': 10, + }, + expected_result_0, + ), + ( + { + 'response_latency': _test_response_latency_0, + 'starttime': _test_starttime_0, + 'trial_window': 5, + 'initial_trials': 10, + }, + expected_result_1, + ), +]) +def test_calculate_reward_rate(kwargs, expected): + assert np.allclose( + trials_processing.calculate_reward_rate(**kwargs), + expected, + ), "calculated reward rate should match expected reward rate :(" + + +def trial_data_and_expectation_0(): + test_trial = { + 'index': 3, + 'cumulative_rewards': 1, + 'licks': [(318.2737866026219, 18736), + (318.4235244484611, 18745), + (318.55351991075554, 18753), + (318.6735239364698, 18760), + (318.8235420609609, 18769), + (318.9733899117824, 18778), + (319.153503175955, 18789), + (319.35351008052305, 18801), + (321.24372627834714, 18914), + (321.3438153063156, 18920), + (321.49348118080985, 18929), + (321.6237259097134, 18937)], + 'stimulus_changes': [(('im065', 'im065'), + ('im062', 'im062'), + 317.76644976765834, + 18706)], + 'success': False, + 'cumulative_volume': 0.005, + 'trial_params': {'catch': False, + 'auto_reward': True, + 'change_time': 5}, + 'rewards': [(0.005, 317.92325660388286, 18715)], + 'events': [['trial_start', '', 314.0120642698258, 18481], + ['initial_blank', 'enter', 314.01216666808074, 18481], + ['initial_blank', 'exit', 314.0122573636779, 18481], + ['pre_change', 'enter', 314.01233489378524, 18481], + ['pre_change', 'exit', 314.0124103759274, 18481], + ['stimulus_window', 'enter', 314.01248819860115, 18481], + ['stimulus_changed', '', 317.7666744586863, 18706], + ['auto_reward', '', 317.76681547571155, 18706], + ['response_window', 'enter', 317.9231027139341, 18715], + ['response_window', 'exit', 318.532233361527, 18752], + ['miss', '', 318.5324346472395, 18752], + ['stimulus_window', 'exit', 322.0351179203675, 18962], + ['no_lick', 'exit', 322.0352864386384, 18962], + ['trial_end', '', 322.0353750862705, 18962]] + } + + expected_result = { + 'reward_volume': 0.005, + 'hit': False, + 'false_alarm': False, + 'miss': False, + 'sham_change': False, + 'stimulus_change': True, + 'aborted': False, + 'go': False, + 'catch': False, + 'auto_rewarded': True, + 'correct_reject': False + } + + return test_trial, expected_result + + +def trial_data_and_expectation_1(): + test_trial = { + 'index': 4, + 'cumulative_rewards': 1, + 'licks': [(324.1935569847751, 19091), + (324.34329131981696, 19100), + (324.49368158882305, 19109)], + 'stimulus_changes': [], + 'success': False, + 'cumulative_volume': 0.005, + 'trial_params': {'catch': False, + 'auto_reward': True, + 'change_time': 6}, + 'rewards': [], + 'events': [['trial_start', '', 322.2688823113451, 18976], + ['initial_blank', 'enter', 322.2689858798658, 18976], + ['initial_blank', 'exit', 322.26907599033007, 18976], + ['pre_change', 'enter', 322.2691523501716, 18976], + ['pre_change', 'exit', 322.26922900257955, 18976], + ['stimulus_window', 'enter', 322.26930536242105, 18976], + ['early_response', '', 324.1937059010944, 19091], + ['abort', '', 324.1937848940339, 19091], + ['timeout', 'enter', 324.19388963282034, 19091], + ['timeout', 'exit', 324.8042502297378, 19128], + ['trial_end', '', 324.80448691598986, 19128]] + } + + expected_result = { + 'reward_volume': 0, + 'hit': False, + 'false_alarm': False, + 'miss': False, + 'sham_change': False, + 'stimulus_change': False, + 'aborted': True, + 'go': False, + 'catch': False, + 'auto_rewarded': False, + 'correct_reject': False + } + + return test_trial, expected_result + + +def trial_data_and_expectation_2(): + test_trial = { + 'index': 51, + 'cumulative_rewards': 11, + 'licks': [(542.6200214334176, 32186), + (542.7097825733969, 32191), + (542.8597161461861, 32200), + (542.9599280520605, 32206), + (543.059708422432, 32212), + (543.15998088956, 32218), + (543.2899491431752, 32226), + (543.4098750536493, 32233), + (543.5197477960238, 32240), + (543.6596846660369, 32248), + (543.7699336488565, 32255), + (543.8897463361172, 32262), + (544.0196821148575, 32270), + (544.13974055793, 32277), + (544.2596729048659, 32284), + (544.3896745110557, 32292), + (544.5397306691843, 32301)], + 'stimulus_changes': [(('im069', 'im069'), + ('im085', 'im085'), + 542.2007438794369, + 32161)], + 'success': True, + 'cumulative_volume': 0.067, + 'trial_params': {'catch': False, + 'auto_reward': False, + 'change_time': 4}, + 'rewards': [(0.007, 542.620156599114, 32186)], + 'events': [['trial_start', '', 539.1971251251088, 31981], + ['initial_blank', 'enter', 539.197228401063, 31981], + ['initial_blank', 'exit', 539.1973220223246, 31981], + ['pre_change', 'enter', 539.1974007226976, 31981], + ['pre_change', 'exit', 539.197477667672, 31981], + ['stimulus_window', 'enter', 539.1975575383109, 31981], + ['stimulus_changed', '', 542.2009428246179, 32161], + ['response_window', 'enter', 542.3661398812824, 32171], + ['hit', '', 542.6201402153932, 32186], + ['response_window', 'exit', 542.9666720011281, 32207], + ['stimulus_window', 'exit', 546.4695340323526, 32417], + ['no_lick', 'exit', 546.4696966992947, 32417], + ['trial_end', '', 546.4697827138287, 32417]] + } + + expected_result = { + 'reward_volume': 0.007, + 'hit': True, + 'false_alarm': False, + 'miss': False, + 'sham_change': False, + 'stimulus_change': True, + 'aborted': False, + 'go': True, + 'catch': False, + 'auto_rewarded': False, + 'correct_reject': False + } + + return test_trial, expected_result + + +@pytest.mark.parametrize("data_exp_getter", [ + trial_data_and_expectation_0, + trial_data_and_expectation_1, + trial_data_and_expectation_2 +]) +def test_trial_data_from_log(data_exp_getter): + data, expectation = data_exp_getter() + assert trials_processing.trial_data_from_log(data) == expectation + + +@pytest.mark.parametrize( + "go,catch,auto_rewarded,hit,false_alarm,aborted,errortext", [ + (False, False, False, True, False, True, + "'aborted' trials cannot be"), # aborted and hit + (False, False, False, False, True, True, + "'aborted' trials cannot be"), # aborted and false alarm + (False, False, True, False, False, True, + "'aborted' trials cannot be"), # aborted and auto_rewarded + (False, False, False, True, True, False, + "both `hit` and `false_alarm` cannot be True"), # hit and false alarm + (True, True, False, False, False, False, + "both `go` and `catch` cannot be True"), # go and catch + # go and auto_rewarded + (True, False, True, False, False, False, + "both `go` and `auto_rewarded` cannot be True") + ] +) +def test_get_trial_timing_exclusivity_assertions( + go, catch, auto_rewarded, hit, false_alarm, aborted, errortext): + with pytest.raises(AssertionError) as e: + trials_processing.get_trial_timing( + None, None, go, catch, auto_rewarded, hit, false_alarm, + aborted, np.array([]), 0.0) + assert errortext in str(e.value) + + +def test_get_trial_timing(): + event_dict = { + ('trial_start', ''): {'timestamp': 306.4785879253758, 'frame': 18075}, + ('initial_blank', 'enter'): {'timestamp': 306.47868008512637, + 'frame': 18075}, + ('initial_blank', 'exit'): {'timestamp': 306.4787637603285, + 'frame': 18075}, + ('pre_change', 'enter'): {'timestamp': 306.47883573270514, + 'frame': 18075}, + ('pre_change', 'exit'): {'timestamp': 306.4789062422286, + 'frame': 18075}, + ('stimulus_window', 'enter'): {'timestamp': 306.478977629464, + 'frame': 18075}, + ('stimulus_changed', ''): {'timestamp': 310.9827406729944, + 'frame': 18345}, + ('auto_reward', ''): {'timestamp': 310.98279450599154, 'frame': 18345}, + ('response_window', 'enter'): {'timestamp': 311.13223900212347, + 'frame': 18354}, + ('response_window', 'exit'): {'timestamp': 311.73284526699706, + 'frame': 18390}, + ('miss', ''): {'timestamp': 311.7330193465259, 'frame': 18390}, + ('stimulus_window', 'exit'): {'timestamp': 315.2356723770604, + 'frame': 18600}, + ('no_lick', 'exit'): {'timestamp': 315.23582480636213, 'frame': 18600}, + ('trial_end', ''): {'timestamp': 315.23590438557534, 'frame': 18600} + } + + licks = [ + 312.24876, + 312.58027, + 312.73126, + 312.86627, + 313.02635, + 313.16292, + 313.54016, + 314.04408, + 314.47449, + 314.61011, + 314.75495, + ] + + # Only need to worry about the timestamp + # value at change_frame + # because get_trial_timing will only use + # timestamps to lookup the timestamp of + # change_frame + timestamps = np.zeros(20000, dtype=float) + timestamps[18345] = 311.77086 + + result = trials_processing.get_trial_timing( + event_dict, + licks, + go=False, + catch=False, + auto_rewarded=True, + hit=False, + false_alarm=False, + aborted=False, + timestamps=timestamps, + monitor_delay=0.0 + ) + + expected_result = { + 'start_time': 306.4785879253758, + 'stop_time': 315.23590438557534, + 'trial_length': 8.757316460199547, + 'response_time': 312.24876, + 'change_frame': 18345, + 'change_time': 311.77086, + 'response_latency': 0.4778999999999769 + } + + # use assert_frame_equal to take advantage of the + # nice way it deals with NaNs + pd.testing.assert_frame_equal(pd.DataFrame(result, index=[0]), + pd.DataFrame(expected_result, index=[0]), + check_names=False) + + +@pytest.mark.parametrize( + "licks, aborted, expected", + [ + ([1.0, 2.0, 3.0], True, float("nan")), + ([1.0, 2.0, 3.0], False, 1.0), + ([], True, float("nan")), + ([], False, float("nan")) + ] +) +def test_get_response_time(licks, aborted, expected): + actual = trials_processing._get_response_time(licks, aborted) + np.testing.assert_equal(actual, expected) + + +@pytest.mark.parametrize("behavior_stimuli_data_fixture, start_frame," + "expected", + [({}, 0, ('grating', 90, 'gratings_90')), + ({ + "images_set_log": [ + ('Image', 'im065', 5, 0)], + "grating_set_log": [ + ("Ori", 270, 15, 6)]}, 0, + ('images', 'im065', 'im065')), + ({ + "images_set_log": [], + "grating_set_log": [] + }, 0, ('', '', ''))], + indirect=['behavior_stimuli_data_fixture']) +def test_resolve_initial_image(behavior_stimuli_data_fixture, start_frame, + expected): + stimuli = behavior_stimuli_data_fixture['items']['behavior']['stimuli'] + resolved = trials_processing.resolve_initial_image(stimuli, start_frame) + assert resolved == expected + + +@pytest.mark.parametrize("behavior_stimuli_data_fixture, trial, expected", + [({}, + { + 'events': + [ + (None, None, None, 0) + ], + 'stimulus_changes': + [ + ] + }, + { + 'initial_image_name': 'gratings_90', + 'change_image_name': 'gratings_90' + }), + ({}, + { + 'events': + [ + (None, None, None, 0) + ], + 'stimulus_changes': + [ + (('horizontal', 90), + ('vertical', 180), + None, + None) + ] + }, + { + 'initial_image_name': 'gratings_90', + 'change_image_name': 'gratings_180' + }), + ({ + "images_set_log": [ + ('Image', 'im065', 5, 0)], + "grating_set_log": [ + ("Ori", 270, 15, 6)] + }, + { + 'events': + [ + (None, None, None, 5) + ], + 'stimulus_changes': + [ + (('im065', 'im065'), ('im057', 'im057'), + None, None) + ] + }, + { + 'initial_image_name': 'im065', + 'change_image_name': 'im057' + } + )], + indirect=['behavior_stimuli_data_fixture']) +def test_get_trial_image_names(behavior_stimuli_data_fixture, trial, + expected): + stimuli = behavior_stimuli_data_fixture['items']['behavior']['stimuli'] + trial_image_names = trials_processing.get_trial_image_names(trial, stimuli) + assert trial_image_names == expected + + +@pytest.mark.parametrize("trial_log,expected", + [([{'events': [('trial_start', 4), + ('trial_end', 5)]}, + {'events': [('trial_start', 6), + ('trial_end', 9)]}], + [(4, 6), (6, -1)]), + ([{'events': [('trial_start', 2), + ('trial_end', 9)]}, + {'events': [('trial_start', 5), + ('trial_end', 11)]}, + {'events': [('junk', 4), + ('trial_start', 7), + ('trial_end', 14)]}, + {'events': [('trial_start', 13), + ('trial_end', 22)]}], + [(2, 5), (5, 7), (7, 13), (13, -1)])]) +def test_get_trial_bounds(trial_log, expected): + bounds = trials_processing.get_trial_bounds(trial_log) + assert bounds == expected + + +def test_get_trial_bounds_exception(): + """ + Test that, if a trial does not have a trial_start event, a ValueError + is raised + """ + trial_log = [{'events': [('trial_start', 9), ('trial_end', 4)]}, + {'events': [('trial_end', 2)]}] + + with pytest.raises(ValueError): + _ = trials_processing.get_trial_bounds(trial_log) + + +@pytest.mark.parametrize("trial_log", + [([{'events': [('trial_start', 4), + ('trial_end', 5)]}, + {'events': [('trial_start', 2), + ('trial_end', 9)]}, + {'events': [('trial_start', 6), + ('trial_end', 11)]}])] + ) +def test_get_trial_bounds_order_exceptions(trial_log): + """ + Test that, when trial_start and trial_end are out of order, + exceptions are raised + """ + with pytest.raises(ValueError) as error: + _ = trials_processing.get_trial_bounds(trial_log) + assert 'order' in error.value.args[0] + + +def test_input_validation(monkeypatch): + """ + Test that get_trials raises the appropriate errors when input object + is malformed + + Note: this test does not test the case in which get_trials runs through + to completion. That is covered by the smoke tests in + allensdk/test/brain_observatory/behavior/test_get_trials_methods + """ + + class DummyObj(object): + def __init__(self): + pass + + def dummy_method(self): + pass + + # loop over all of the incomplete subsets of + # methods that the argument in get_trials_from_data_transform + # must have; make sure that the correct error with + # the correct error message is raised + + method_names_tuple = ('_behavior_stimulus_file', + 'get_rewards', 'get_licks', + 'get_stimulus_timestamps', + 'get_monitor_delay') + + for n_methods in range(1, 5): + method_iterator = combinations(method_names_tuple, + n_methods) + for local_method_name_tuple in method_iterator: + with monkeypatch.context() as ctx: + for method_name in local_method_name_tuple: + ctx.setattr(DummyObj, + method_name, + dummy_method, + raising=False) + + obj = DummyObj() + with pytest.raises(ValueError) as error: + _ = trials_processing.get_trials_from_data_transform(obj) + for method_name in method_names_tuple: + if method_name not in local_method_name_tuple: + assert method_name in error.value.args[0] + else: + assert method_name not in error.value.args[0] + + +@pytest.mark.parametrize( + "trials, response_window_start, expected", + [ + ( + pd.DataFrame({ + "change_time": [1, 2, 3, 4], + "lick_times": [[1.1], [2.1, 2.2], [3.3, 3.4], [4.4]]}), + 0.0, + [0.1, 0.1, 0.3, 0.4]), + ( + pd.DataFrame({ + "change_time": [1, 2, 3, 4], + "lick_times": [[1.1], [], [3.3, 3.4], [4.4]]}), + 0.0, + [0.1, float("inf"), 0.3, 0.4]), + ( + pd.DataFrame({ + "change_time": [1, 2, 3, 4], + "lick_times": [[1.1], [], [3.3, 3.4], [4.4]]}), + 0.15, + [float("inf"), float("inf"), 0.3, 0.4]), + ]) +def test_calculate_response_latency_list( + trials, response_window_start, expected): + latencies = trials_processing.calculate_response_latency_list( + trials, response_window_start) + np.testing.assert_allclose(latencies, expected) + + +@pytest.fixture +def trials_example(): + """minimal example for test_construct_rolling_performance_df + """ + trials_dict = { + 'start_time': { + 8: 368.305066913832, + 9: 378.0631642451044, + 10: 386.31999971927144, + 11: 394.57686825376004}, + 'lick_times': { + 8: np.array([]), + 9: np.array([]), + 10: np.array([]), + 11: np.array([])}, + 'hit': {8: False, 9: False, 10: False, 11: False}, + 'false_alarm': {8: False, 9: False, 10: False, 11: False}, + 'miss': {8: True, 9: False, 10: True, 11: True}, + 'aborted': {8: False, 9: False, 10: False, 11: False}, + 'correct_reject': {8: False, 9: True, 10: False, 11: False}} + return pd.DataFrame(trials_dict) + + +@pytest.mark.parametrize("session_type", ["OPHYS_5_images_B_passive", + "OPHYS_5_images_B"]) +def test_construct_rolling_performance_df(trials_example, session_type): + """tests that ending a session_type with "passive" replaces + rolling_dprime values with all zeros + """ + df = trials_processing.construct_rolling_performance_df( + trials_example, 0.15, session_type) + if session_type.endswith("passive"): + assert np.all(df["rolling_dprime"].values == 0.0) + else: + assert not np.all(df["rolling_dprime"].values == 0.0) diff --git a/test/brain_observatory/behavior/test_write_behavior_nwb.py b/test/brain_observatory/behavior/test_write_behavior_nwb.py new file mode 100644 index 0000000000..d37ee62713 --- /dev/null +++ b/test/brain_observatory/behavior/test_write_behavior_nwb.py @@ -0,0 +1,76 @@ +import mock +from pathlib import Path +import pytest + +from allensdk.brain_observatory.behavior.write_behavior_nwb.__main__ import \ + write_behavior_nwb # noqa: E501 + + +def test_write_behavior_nwb_no_file(): + """ + This function is testing the fail condition of the write_behavior_nwb + method. The main functionality of the write_behavior_nwb method occurs + in a try block, and in the case that an exception is raised there is + functionality in the except block to check if any partial output + exists, and if so rename that file to have a .error suffix before + raising the previously mentioned exception. + + This test is checking the case where that partial output does not + exist. In this case we still want to have the original exception + returned and avoid a FileNotFound error. + + To ensure that we enter the except block, a value of None is passed + for the session_data argument. This will cause a TypeError when + write_behavior_nwb tries to subscript this variable. We are checking + that, even though no partial output exists, we still get this + TypeError raised. + """ + with pytest.raises(TypeError): + write_behavior_nwb( + session_data=None, + nwb_filepath='' + ) + + +def test_write_behavior_nwb_with_file(tmpdir): + """ + This function is testing the fail condition of the write_behavior_nwb + method. The main functionality of the write_behavior_nwb method occurs + in a try block, and in the case that an exception is raised there is + functionality in the except block to check if any partial output + exists, and if so rename that file to have a .error suffix before + raising the previously mentioned exception. + + This test is checking the case where a partial output file does + exist. In this case we still want to have the original exception + returned and avoid a FileNotFound error, but also check that a new + file with the .error suffix exists. + + To ensure that we enter the except block, a value of None is passed + for the session_data argument. This will cause a TypeError when + write_behavior_nwb tries to subscript this variable. To get the + partial output file to exist, we simply create a Path object and + call the .touch method. + + This test also patched the os.remove method to do nothing. This is + necessary because the write_behavior_nwb method checks for any + existing output and removes it before running. + """ + # Create the dummy .nwb file + fake_nwb_fp = Path(tmpdir) / 'fake_nwb.nwb' + Path(str(fake_nwb_fp) + '.inprogress').touch() + + def mock_os_remove(fp): + pass + + # Patch the os.remove method to do nothing + with mock.patch('os.remove', side_effects=mock_os_remove): + with pytest.raises(TypeError): + write_behavior_nwb( + session_data=None, + nwb_filepath=str(fake_nwb_fp) + ) + + # Check that the new .error file exists, and that we + # still get the expected exception + assert Path(str(fake_nwb_fp) + '.error').exists() diff --git a/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py b/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py new file mode 100644 index 0000000000..44a1016473 --- /dev/null +++ b/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py @@ -0,0 +1,82 @@ +import mock +from pathlib import Path + +import pytest + + +from allensdk.brain_observatory.behavior.write_nwb.__main__ import \ + write_behavior_ophys_nwb # noqa: E501 + + +def test_write_behavior_ophys_nwb_no_file(): + """ + This function is testing the fail condition of the + write_behavior_ophys_nwb method. The main functionality of the + write_behavior_ophys_nwb method occurs in a try block, and in the + case that an exception is raised there is functionality in the except + block to check if any partial output exists, and if so rename that + file to have a .error suffix before raising the previously + mentioned exception. + + This test is checking the case where that partial output does not + exist. In this case we still want to have the original exception + returned and avoid a FileNotFound error. + + To ensure that we enter the except block, a value of None is passed + for the session_data argument. This will cause a TypeError when + write_behavior_ophys_nwb tries to subscript this variable. We are + checking that, even though no partial output exists, we still get + this TypeError raised. + """ + with pytest.raises(TypeError): + write_behavior_ophys_nwb( + session_data=None, + nwb_filepath='', + skip_eye_tracking=True + ) + + +def test_write_behavior_ophys_nwb_with_file(tmpdir): + """ + This function is testing the fail condition of the + write_behavior_ophys_nwb method. The main functionality of the + write_behavior_ophys_nwb method occurs in a try block, and in the + case that an exception is raised there is functionality in the except + block to check if any partial output exists, and if so rename that + file to have a .error suffix before raising the previously + mentioned exception. + + This test is checking the case where a partial output file does + exist. In this case we still want to have the original exception + returned and avoid a FileNotFound error, but also check that a new + file with the .error suffix exists. + + To ensure that we enter the except block, a value of None is passed + for the session_data argument. This will cause a TypeError when + write_behavior_ophys_nwb tries to subscript this variable. To get the + partial output file to exist, we simply create a Path object and + call the .touch method. + + This test also patched the os.remove method to do nothing. This is + necessary because the write_behavior_nwb method checks for any + existing output and removes it before running. + """ + # Create the dummy .nwb file + fake_nwb_fp = Path(tmpdir) / 'fake_nwb.nwb' + Path(str(fake_nwb_fp) + '.inprogress').touch() + + def mock_os_remove(fp): + pass + + # Patch the os.remove method to do nothing + with mock.patch('os.remove', side_effects=mock_os_remove): + with pytest.raises(TypeError): + write_behavior_ophys_nwb( + session_data=None, + nwb_filepath=str(fake_nwb_fp), + skip_eye_tracking=True + ) + + # Check that the new .error file exists, and that we + # still get the expected exception + assert Path(str(fake_nwb_fp) + '.error').exists() diff --git a/test/brain_observatory/conftest.py b/test/brain_observatory/conftest.py new file mode 100644 index 0000000000..e29a97ae1c --- /dev/null +++ b/test/brain_observatory/conftest.py @@ -0,0 +1,41 @@ +import pytest +import os +from datetime import datetime +import pynwb +import numpy as np + + +@pytest.fixture +def running_speed(): + from allensdk.brain_observatory.running_speed import RunningSpeed + return RunningSpeed( + timestamps=[1., 2., 3.], + values=[4, 5, 6] + ) + + +@pytest.fixture +def nwbfile(): + return pynwb.NWBFile( + session_description='asession', + identifier='afile', + session_start_time=datetime.now() + ) + + +@pytest.fixture +def roundtripper(tmpdir_factory): + def f(nwbfile, api_cls, **api_kwargs): + tmpdir = str(tmpdir_factory.mktemp('nwb_roundtrip_tests')) + nwb_path = os.path.join(tmpdir, 'nwbfile.nwb') + + with pynwb.NWBHDF5IO(nwb_path, 'w') as write_io: + write_io.write(nwbfile) + + return api_cls(nwb_path, **api_kwargs) + return f + + +@pytest.fixture +def stimulus_timestamps(): + return np.array([1., 2., 3.]) diff --git a/test/brain_observatory/ecephys/__init__.py b/test/brain_observatory/ecephys/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f18b8914c599a879a1e9e02efe8133a34410a038 GIT binary patch literal 207 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG=~kXNl9WgqtD{xE4lgzZcbhX@q_Po z$8q0r>pUMZlDXd?)mOq#88u6?9}pDVvvIb2Fqg)Ee6E`rKX`PWLk+5sZ~+tf%0Oj} zf+<JSdu}^4z9QPLj-GF|<X#7ybWk;LM9Q`;ZK$RU=tC(TXd|qovpodsVu=-|WGRF; VItWp8@j0BItU9;2NFTk)><fRtJc9rL literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..249d45a517c8dc7f1caec8c2ae1a29cdf068a80e GIT binary patch literal 502 zcmZWmJx{|h5OqFOm5MST*v*)MWT?b|5aL5(LM$yy6)AFTw+T({$mg_#4T*ok#9zwF z)IY$$#JPZk#7XyjzI$iCv#*B30YOu*&+G%&cenX9AA<{YI6x3Ycomrv;fvsfOg-U^ zNfd6dLhiU@I&-V@YjoI0u;c-m3u5+!KPDn@Jx>*#6q4qKl`7LYNV8&An>LnQ)<p{x zntZ86Q%Tx@1X{PY(29=Y6FQU3HU@LHV3safOO>`X$HN$3teFu&xn9=HmU$(Q1{5vw zHvtOS^bjUDk>3T-Lbtn;21>26Qq43bL+mNK9@lDC&fkdXBm495`ZT>qd62S#i8yC# zrrPvUF{BALN~Kyss%xo$BWkBTy)E+;N-K|RRK(^Id#ef=Vv$%0Hu*Po@-ubf?sk;8 zZo5OA8N;lcD{W-PHJ-t3h@!yFLBfF-ddB@+<QtdX##_~YU<V6b|LprM&pq6M`<#C8 E1u4*s82|tP literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_copy_utility.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_copy_utility.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2868d5ec8f80d93ec3e1841b256bcfa719a51e8 GIT binary patch literal 4858 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_current_source_density.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_current_source_density.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3e3fb7a5fe4a2e40853776404f1c4b8ee49cbf4 GIT binary patch literal 6094 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 YA6IHs8`V~|4cBczstSK$l-~XQ2WPpMaR2}S literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_cache.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56bf8f03a7da98e2327a7b302c491edb2d564f1d GIT binary patch literal 17884 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 AXaE2J literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_fixed_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_fixed_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb68f7bab6152a2bde9c99f5ea158e4d8873e216 GIT binary patch literal 846 zcmZvb&5qMB5XWbdCjC%%RSxhB1VIZdtOP=cvb&t1;zI}&MT*?mwArRfWSfOby9Ykb z@CvOs@k%~$;lwL&Vw`MIRj}k4JN8We^PA-1&Q1qt<ljE99|-W%Zq~!0#RHn^Dj5zO zGYGABGMqc1Gj~H5fxEo%8NvqlxKG~W_yU6FFN%Os;FwECi72NF^;8zeBGHf1_ks`0 z)byUDN~QVakZE=#Wg!zAVTXNdo8|#cb(xHYPjChrmyUK<_;vRTPhr_u0m3U%^9-KD zYx49~90i`V;l?i)S}1LN$x<bhbm?K(od_M%PNhYzNSez?hbyG~4zfiTet$W*8@*IQ zs)$V)?~mC#mM@}V&XOYMY%db|iHeF+<SHRs*s`L>={QoU7S~Fa%-BRwY?jdtJ{wpC zgE1+{<6=x{Pna&`VjyZD)p2~jiOU*K{KoQ$Nm##Jm<u*Tys6qJnaUbKAG;`R@BR<& zkWRM1U8%uwTp@z?mOgh@xNM%{achMfW^J{v+aGZYsyj;WTqk<ojhlP7ZU>zTuxwCz z=~+{u?QMvRIknU{QkZ5^%*!+r##e&LWNMmoqEC>_?obgBO^v8}A2`w$C7agRR@BCR z1?J*5gerfRj+DJwgXo~_(K_%eVd4I|2mOEW_s@y1{a^CLye`caRDrEhZpf*GRhnA& U<^_M7iTm`&)ct5VJ-6lm0mn<;Gynhq literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_lims_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_lims_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c33c01d313305083d210f19b8c689bf95d88f9c GIT binary patch literal 7847 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 G<MRJo<>i0? literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_warehouse_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_warehouse_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d54175e2df59d6d59a889a9b9f4399416f8364d GIT binary patch literal 2408 zcmcIl&2Jk;6yMq1*shZ}p&w96TT%$5D_noY_S#X2npS}eM2ONNZEUT^p0P9Wde@y< zx3x(tK`Mcef)EEzJy4+@K;qxvhB$Fqi4y{;5)u;P#ECa+JBib#aAB=^^Wpd2{NBgB zcX@g`uE6Jh{UQDVR=>#2=$nPbB^cs+AVeX^Q7k#D4r;5Gh7_u7>YEcpBRZMbQRVKd z2#Js=Q%J0-ktjJr;$*U^GDN1reYgYu>H8{4jGfGo*``XKxv!C<aDI#&CnsS4EO`#- zN#K4SPEU~+nuwf+aR$a&;C&HJ=SUoO=U}`9<7F80_jU40Q)@;asN_|$a8KDr+sKL% zbX76VKLT5nH3J1_Xq|R8dcy8-Z<E%2`xfSO!|Mua;|_bTKUw2mi@I|@6+W;>IK{$q z`*UsTZ+IkG_gun!=D8wCZ+AeR68lD%@}4!-q`obv5c1Fd**a%F<qW^x_6T*BmR1MX zUL7z5lS59M5yAdwevo26{dVa>|Ba`MC3zb!Esc2A8JTCUX_iZi<-D0qnuT&MSITD1 zs-bcn><wl&u&`;5+CIni7IT|@JQ98~uK#+$dIK|OO!GXw(ZG(NRZDAlUZB-5H?$B1 zp8zOULinuRb-KcKahr<%-TxiP`q+)&sRaPGkX!&{3soyF!v#4|qk>KRx|3$#eVb0P zpI_56Z2tUmdgQ?)A&ZPs-#rBJJ5tG$99PN|3TD~NLuAUiVkTECW~%F>^xKQSjA7X< z<w}bMGijRnl36I_veiLC)i<!~Qb#ax{dST)`uzF@_Sf$Zb0gPAWt1m}Od-lI4?%fl zpy-J>^JQ}}U(W19H?mq{D`tv$vz%S5j>{%TmV~^A*p)A4AUO+#s&z#AyX!Jvu-=c$ zX?FM1hdFk42TaiiSt3p0F_|hc$rc*(=OM;i1BP)lgSSuuOR|}KF?Rs#F1kHWfn}0A zQ!bYC2e@}F8*-l?w{-C8AfovKD5x6aK%OqVt7;hj15dbW7<CO?AioF<`H1CS<bk}Y ze5^DOK}5Y5BkHz#NAs0Uw54q;MB71kbYI=lx0G$Qp=_bg(47gQK;hHZ>L9xNjg*U% za6}ag5yevX)LI(Rq)`8yEPsQ-mb&P8b$Hp!skgm)>)ke9b(_qkb#<sz&T<@sA?ASi z$|q2I5zJdqfD!DrP)il3ee@A(N=#_YP=kpMXRaS4R)nBj7SvVFJq~~9f;x>L#;Hpv zrvz$nV!YCRqx}8Fm8HrxkP{WWfk~={Z(+ArS#hx}&v>yy-J7D~b*L-qKs{OSD{rw{ zML<oy(1B8jn-pXn2RKM8EsagrIA*Tx)j;h{?0dYI9)>;q+uoN0kGG9frx(n~1c&-; z`?%J1FuyGQA@f;5G5AfPe)eCTnmV9k&Cr9G9ac=+4&t^A&7|v4SWnpy9qh<jYTI14 zY@PsOAU-`>^BGtL(_>Lvfg>TK6+`?uOa`*z5;F~BYG{E@JGZcPYIV@9ptMP2-ygNe zl@1G{fD!vXHzGk~&=jrsURNAkFI5K`^wS{9spvYs7(*8Vi|=_uHV7f}UAcHPnn3&% ztc;iy>GULzRU8E>^;nEj!?29z-L4LIb7?0(0VL4dn76EmXt54!Sd$&h!EZiieHz{s tg4;(ze6foIXD=hrAaX!r>Xe#55u|D=QdM17Q9PtmAw3$>*?si5`VZl4;wu0E literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_session.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_session.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de421d00d964f610ef2d0cef5c8644f9e276b835 GIT binary patch literal 21250 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 D2?OCs literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_session_nwb_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_session_nwb_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd0bb60afbab5c417c55a2e21861a563acad1ffe GIT binary patch literal 1163 zcma)4J#W)M7`_iXandGjib^Gh4v3+aN;)7Ggb+}~gt`FB$&z*UT^%Qm?cTX9sltF@ zr2n8pD<=MuSEl@hPQ2&Dr5_-1r+eOezaPKn*PTuq!AgI8;g=MlUq-1{2QDw+=q-$p zKmsR-%_U~I(g`D#q|B<MJ#G+$(YRTmQ(=p>F_L7sbiOQzw9Y$%3QO1#y^@VHa)EDn zn!*t+h-ix?u?(_vM*k;5bVWC^Z&a##-R)6({@vrR5zu2LB6E!Fh+Gh{Dth10SIoKs zzen!c%*=1^<WVB`i)|H0gJN5L%4Jwcv2ARAmd?#^nZabyj2M9FBbStzmpGVN#$p?2 z7-$-B4731Ts*Fn+SBb+vN@&bx8IL);aP$^HfrfaBrg%!HRNzzVvt5uO9a>W|wFMFM zlwx>UU~laKhvtH2=~VQA=LZ+Fb~upX$WP*tbnViTspf1oOtK)5Do!JREL9{+k_*-> zq%Oe3*0|PE75={BW9iF-L!P*e(lX^syQ*C}^=woZc&Zfu=43&^<5Y^DNUek6^84;H z?;}*w9v^Vg5BM=pC*G@+hgmB46Hlf`+RJjF6ar@XV4}Tuap38=kdJd7j(8*?H%TBu zjCKsYoj^egKMSDj5ic?|*^!|%nU&jLD880j$64y9$AQoDxSvnTb(8Pk{_<rYs?EEh z-WpaLAl;SHIp!*bNoZybp5_zQ$R{QlBnRSJ^&pJx)x`RDIQ17aYI#M+P^l>zYBf!; zv)-LDthtC~_v)nU2^+QXRwcCx^h#^Y)rc+S+&p5T;uFbQZ+OAq8om0^>XEL&eUs)q hA7|n)kuS`Ttv3N2;$YZhlRD%9eh8aji_UKi{2O2VLni<L literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_sync_dataset.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_sync_dataset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7def96a890b05c05ca78f324321c93a3c2d04279 GIT binary patch literal 2811 zcmbtVOK%%D5GJ_~tz|j!D~atIXq!G2xXPi)rAYI3b14k8Nt<F}bU`g?d9Bs%noBv6 zARn3pNO}nJ7bNu5TmMC`J@2V#FY#aKsWX&h*>w=4Ef*Zl@-^hlHy>}#%#;a~<fk9_ zuTzBli9h2q4a#+>`5zzz5i}+(>Qjn3i<!?%Yx%Zm9p8c0irrSpFHs`dj@O?Owr~V% zumKaUC_N#Msb3zAcw$PFrQM%~8PlTDum-eYiJ6mqX7wp?+N`dOR?ou988Ij3#lpZE z>5Jmbz!GPry>qI6TAUluMY2Rh<>+X`ZcsSOl2|so&59NA))V5-33iuMR}bKxq)H3B zm4?j?Q0CV|nQeFSyPYJw%{9-ZE<E`#lcAR4fWqt$1r`R?f_e*TejS7+kI6n2G$Il0 z(SY^{NY<k}tVfzGe_vaVpdbF|4$N8xmo8)f73>!Tj$>{3ZW0B8@A?a2+D^1oLE6?? zTL)W8?pAGu_WY@q)Es7MUd-mamBrEww`CG`ic>f8Tq+%<$+}XhsxoE6nxcf$;W9rH z1wki&{dnuM&2M00zR9<_sMYxco^&>EBs@$L!9U%U$zHyhW-`e`kSV%k^UJ8dnMYcF zlJT&~8xq#WG0YIni(2OTVqNhl3DP=jyT^5^Iv3^8nPxZ`{RBC<)|?)WQ_DKV8C)Fv z^CAe++#r>?v<&qWRS3`SQd4%;;wX_p%<D4F*J3GxJs#(UwUwq2LhsA<+s4QNM(6-t zre;8ds9`BV#hp#yo`GTlXZ2{$3Lr2bnYMOp!Fo(s&)JLb_igiUYp3t_*npbe+P>4X z`lTKj(0vy}-E`HrJ*V#pX8;+KltG^oF6#Fof4(ALlkW)ZQ10O#Ebr>+M|3h`08rY9 zUcxE6pN}0|JK@vXG53uiT5Cuhz?wiuEtyxTUr|!GRf2wL%kH)RvRysWLAcEmh_gb- zAIyWORtyA-=_3J9E(|F2b>U=OhuZ~9GJh&fWFEv(Q~GoAp;kQ90Y=K4&_BlwN`nwj zCW15xW$+-<+r|9x0n_Kfq%ckaRv5WzsjvV7Y7TVY8wX!`XrE>U-7UPdt^tWs7^n{g z#=AIckaprUi!hd>Ag)W{W3%)uK+dBTw#d{9^mjkZwo{#oC>3&egS9=3L%tSv!dR}2 z38I0U5VClEq}&@TFRu-Ie!n~J`EArgez_K10RM)VrdaSIn4*Z*{2quq<SBVdx0s-U zJ@Ev4%m9x_HI4={5mwI@HlXx8pwQW|0JF|>x?j?E-|3Zl79i~l?VdoIyAi_HhXsvc z$?>+5_`pX#J8IUqgar&`cds7v;g;g9kw<`o(pE6>Q|(HeLU{A5wR;H4`-*3oREJ53 z77;TGXmu3?Bp!nlsyqWG#MA?Q=@|um#Ej+1)`e^A<|edNtFUt!ZxwFTNKz#W8_<zg zSus0VFpOE@4uf_C5nf;*7zCH`80dOJJ!(Vk-uZtQt&MlysM-aXNzhS2Q4WGuD%wEV zK~V{U-8PShBkEnSJ-iT8Z=?RsxI-E6R*t&y5{%{OK98yopy?h`@hcc(M7*`F2+T%l z?Uh8le&XFTq#_06KN3nJ9~f8hdMx4psB=vYR7-{#3=b%z3je)vqP+$r3d66?pfI`Z zO|D)zW?%DsnLC;kSLbl<G73x*c-|(yGH&|#O~ZBpmJc78@?y!Qv$R6hN6>ee7wBHJ zaSJEbKxop3=V3r!tn3rb`j&vFU>{!jK0Fo2X?}#+?xlZAym88fs(`JkGx6k*a!Xr4 zq420GWGc9~aRefE2xmO$2q?w_quDp1J4b>htU}9FRY9xH`(8VVG|n?td^hXhkMAVy zR@N~=@$K!)S;v3f)A1&_8lK&5an<yvGmdnjRn(Q{EiW9d6z>>{^<5Z*$EI+h5oyb} tu{9Afhdy%4$yL28!(_UO50qh%3eYxutYWQ{J-SHGFM>{2DWj_ke*@&q{(Jxc literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_http_engine.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_http_engine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8f493e374b5855be204155d5ba14a5b3f7712a9 GIT binary patch literal 4101 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 Bm<<2` literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_lfp_subsampling.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_lfp_subsampling.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e65817f8857d906a45a7b5a067c09f1c966c44d2 GIT binary patch literal 3603 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 E4|)8evj6}9 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_rma_engine.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_rma_engine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..482f55fef32d950d1215bfca7d464fec2906644a GIT binary patch literal 1188 zcmZ`&OK%e~5VpO$$tG<B6a=k6oVY~5mX|o7s-h4$p>jY7$x0PDYbR{8FKoB4RU*Vg z0&YlLIV9o)Kgm~4{DqzvZxUKm@XFte*E8dp&*OVbOLYVz{q}}^b`bh$7xQ6v?!r_* z065|}MszAMCFR<oZYjN_LJ&qtwM4(f8m(a@&`y24z=<H^MecBydwqvjtOm0Bl}xa3 z$4lIw$=U?lzx}y={U7#?(&LY1pG*i};EV6kJ4{b-`~)?ZenGxyYk!3^&3ck0;)-~c zi%<*R(M2wl!PgDGVen0ZS(8W)tPSo`FG}_8TLwSgcWwl?LSm!9u-g@wKo3$mfJS3H zL=*f8eLy|TF(>c+k7$RqAcYap&Jd5?3Fx4asWu?$j`rT-SJz;#GC?i0eW^`G&dAl( zu|IStxRhk*tU_F{ZdvOWt!F?t6y$7$7|ylBCgs9B4O6WEL}-Y%Pmb_MG{mcD2k;Ad z;XXm%Q4<@F+j^VCkl-4vhFP2f8SvlFx|&6);L?W>2e0qnX+Kp$sy2Jhc+h1pSz5F= zQx;|^XE)m--Bax>7pV#Xv;29X+K-}cTSZ!2%~?2LeF4643>JK_riIdLT?q$tvMz+( zV>*+?nh1sUEVnx{VI7h7A%`F@4(jVX3U!zz`Nnx$n60vc_AlE=oha=I*@5JDlXQB2 z!Frs9ELI!Ap<lCR>W4w;@^LR?34j>NI7(>a4n(0$V^cwfI?B=qQfAV4P*S1{Npo3) zB$^(r{pljw_`8j0V@~6&tsDqxyge50ijvqSmJ1L>E&`Zy|0%}afGQv1avh%`7sxV} z=j_oZX(cbL6G#U409oandg*SG7xD~P(9JpJ!7;Xj8QXK&$z`?!PoTr{C^*8?sbikB zI&-C`XUb7u*|4>^36lf5kTd(Zw2bxzt+n8>J+$kRIOFx=jOntHl8Yly(&4Ws8Q+b? XhVAUKlYI;yx#;-B1+78OI#c-@Pv=mW literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_stim_file.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_stim_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94df914279acf424949e13fe242ead3053f0b16a GIT binary patch literal 1808 zcmZWp&2A$_5bo|7+haR+es)Q+yC9*xATNt^K;i%hu|(_%g`X7yjVz7YQ*CGL@yu-Z zIEf<%39?tj3+%xWC*EKmfg|U>av`t4iK=$u&4wOLbyxpXSAF$Wf6;0+7`E*9pXHxb z#{MSdy3xw#_?uTKfB{cgxa@f-obH95>;2GoeI=}7FVfm12m{W*1OEjJ>rjCz_6_Ba znyRiELjkp4IRsFD!OnTOM)S~srqf!ewHNEK1}$hSG1?e<unrqnqfOX?J8*aCsp@DG zSKfj)Y{SmAKJ+gH?7}@~X$$x>*13O)-m`-aw{=q{lW35nDyFIHR>#3U{-%opI0$k( z;Y*3GqVrG#pWGdK2_NzVKWM!4(RlM9`Nw1I@-7~=TwZeOgF&w4Fv*5CP+6RV(#8rn zxfHl~iMv_Hx89&IwpC~q^;4ORBcozlBmbspVk=3hCgu;O*KzY}@$XOjANRgDXs#y@ zC3O4pSZ1@{lT5~W2J*w6%8pDgFH~k?lzDMDGrg~pe$Sx24+<HN<xt_-G{qe--Yb<U z_xf5US(NwD?2#;UJ=;^UqLXepT0zz=X13+DVw^@GOSy*584^qgE_j=y(3_~g0dEZ_ z9K4Tka1Ae1Fn3izIG2(b0l|<tXzMR42yJ5tttP;9g#;x^6DhS%0_n;$S?^SIlg8wW z4oI{}v`M^);8NYd1$*y}SfVm7Qgx&-vXggk`9@rUi%f6fEOMw?NG&HOrd(1Z$5sS- zib~1mY{7wF@N<49N-^>l{#<~#5NBRlnS0=!i{G}-{Ia^J&G{m@U~}XwXFp(NeapUM zKeD-p(fbEsV}-pr4QSj&<gGaFck0$NrMA_{7<p1yksIq5vOKi@C{Hr$69v%IBp#>A z`Y^>k73X)S61K}p0f~+VGNx?XnpV%JNQAJuT(EU2kciBM0i~MM8!$TXHdf%}Sp<n0 zzmJg{_mYS<;<d)_3;iz6#Z(Z~sHaRiCQzbEHsT90XBSkX{Gj7$f;8OSmy>50>(`n3 z#`#amQ*^=Bt~~B=XZf~E4`NIU?#(lF-kp5S-H*_+aTyc(A&yUX3Y`~GCMW8#Iw@3K zDtH{{lOo(4V0M*>3Z<zev8-HuFR4ZThubn6PE)C)<3ojX(RnG$B+qU!^!7GnRvsti zEcpuwo4i80#>8Q2#Gn;2Z=*sCn)7pU=Fh!3a_3x_-ID*pfh~~|wl-9FD>9({#9-ah z{a<RGYb*o`FRZV^!x!i(KI^*xgS=m2!7I3p-#Wbp5gjCh%6x)`jPtS9;QBq(I(PH~ z>})_==&3;B6?%s*tQIpm9#%5s+RTcq2p?TPGu{8aFx{&crt6rN<Sz5>;c!(J)&|K* zIn`>JXNt)B6RF2x(~($}IyqHVsOMpTm&9p~7?6WELULvAs2Y4a$zhtR&xnDB@C`VA Ug8nr>*bLgc&2}Z=4g5Cve-DSrQvd(} literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_stimulus_sync.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_stimulus_sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff198387fe467c87403e18a0f0c9eb6ec6c896be GIT binary patch literal 5458 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%0AU4dsV`o$v1uy=|h;z^y@@ zlYKhtd(RzedC#RSuS|%<=sDuHJ%cY&d}iW~-gRxO+wntO9<G=NtHgAKaCT&8o8<9@ zz=NJ`&|7vC@@`Gct#05%@|uvfPdo%lnc{+SKn8(Se<FTlB+16cy3z~ycGta1pEu!6 z3}rMjmR>e2y{ebloKZtVbIMrJ*V!4P#!escJ_G!Pd5g`lQ)?D$;QFev)3X*k!!B4B Ss2*i`Rs(bvD^KCqWd8-*7n;EU literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_visualization.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_visualization.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fce25338024bce968f32778174c7b452b2b25841 GIT binary patch literal 912 zcmZuuzi-qq6t<n*UGA>e7Kx!<IwCS~m0$uPj#7RI2~`5bVnvF4u}R&_Il=aoUTFu~ zGFB{%2(@BjVeZVIkqt3bEL~U-1J7wIS`|m{^RwUk^1b(buhVHESnBgz_6H;M!yQf+ z0p~85xemY)#~B)8f-oAA3cU(_TEoZDI&E;my&XgYj-R8@KLj3HN*uc7fi=Ju!At>Q z(F*1mI5_oShYxm-`@9Bw{i6qQ!W%r`P2Pf=_AcQQyJQntZ_nRA`*;&?;Jw;D;+<Kv zNo;)s@yS`V*Vsqf7*1p**v125GTYq396?1>ONXwhL+BKxZ!Uj*^nHD&cjA2Lr3Z8G zem*_;)C;|`F;ddTlG7Pu<#3dZOk8MTgtE-aT)D^<2#DB7l>q)XDOW~V+A@V4h}dPP zVf6mnud7GB^jW0^&T$n-y^xf?Vnb2-oLLs)vL+Q5Yuc5neSol4l7iFbeF#6)kV$Kg zT}J7xN<-V487p*LWVxk5Ds0TwgekpDsIm^dyc&tJo#a_25?8+|Cl`zn+W8N(&UNU~ z_P;s}^<K)961MgQ=}8d(y|s8NdI1Czv1P`)efFBEakQXVk}J+`L_)2aC@+LE31D6< zk4^MM_9G*$xK^-az)}HR&{u{J=B+SxzOR{7ao&gDt}>hJ@w`ZcV^-l9+8VJ;u2%!^ z7UOc-vEnn0y0MsP0EB%Uz&C+sNDEI8?JmP6y?H9wy`a@S(dwR;iDT&=KBkv0Flgh1 vLObU;WpGN;O^~Jag270P4&YD~Qcds-OhKRwZVz)l%ETS_z{YhlhXe8#%E1;@ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/__pycache__/test_write_nwb.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_write_nwb.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff49b2adcfc0ffd978ddcc48d3200b4a3b020a6d GIT binary patch literal 26768 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/align_timestamps/__init__.py b/test/brain_observatory/ecephys/align_timestamps/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09082a1f913ea05c225d9e115d2eaf48bc6438f9 GIT binary patch literal 224 zcmYL@G0Fl#424Iq5W$03=oEG$;{V%<jo1wg*`1(+yP07#DqC854lA!@>k;g%%oJka zeF@>ckpID;ucYX9f!v=N-|EP)5OG)F)J6?E>$__5`iJ**IW=3xh7Ih&jSDyfwdRkY z4CG*9kWOquMB-8y;=X0G@`Yiaa1^0Dzz!u_RpM|5osg3*8t`O8A!kpJLepw2F()-t gen&R>T5M29*4BFR$=Y#jAH7)}+_A!We(@zz9|3PebN~PV literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_align_timestamps_module.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_align_timestamps_module.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d621208dd9d0d44e09b89bc28725a3565a0bc6f2 GIT binary patch literal 4565 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 RC||7AYG>!>YG-S6{|0e~*S-J% literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1574065271220c4ad693c1b1ba93c944ab447314 GIT binary patch literal 2823 zcmbVO&2Jk;6rY*>@VDbOZkjY94YX9aq6wm?hk{z#Qp5q}z=x1VM%H>~?QCQ3Zf7QK zQmqfP<p%r>iMW)%f-8T+o{%{C#)$(Gg!g7`$D{}(cC|mhH?wc%?eBez@78K%0$23? zSKc=jLViJIdeuO9A0G7?B}5QG2ZZOplry7S+%~_?&}D>@VZmV0V2PI~3CM%8V8VJ% zo>5*gnk^ioRfQ`G&k3)=X#H?O6h)~|kJv;ji^`l<6=Y7UiTa$jAR4HNGvX|+JH2^h zw(g>6iiS8Rmc)6n47SC&U8ZwnHd}(VR>XyTEq><zuQIU&|HNva!K!QGm8pmPte~Hg z*7_K^-u4mka^We!a}OT%5r8I#R8VA40B?Qgh>r3x;0_rRWiv)aWyC~vWQp3y7WI*n zl9Z+_wNg8EdM@m=usw$Gl5rhj9bp6EH3W?Fcmd%e!m9|E5HL0R@WA!!?J+twwgFl! zV^NYho|N7}%jLy5>gaG7C|-(ty@_ar-H=zip6rM{>FF?zcynIs_(3=bqkiT@-B7C^ zh&&5R|Nia0o9)k4AXVGj@x*4=d+bFA?K_d@$C2=^w}a@BYR5?sDIYLSb`Dhg<FMOS zp$@Jkp1<q$1F#(o;0>|6r30n6y3z}yPTYlMA9*^K2U~$3pyie~2>TP?wKq(ZdA|d0 z`mqQ$lY^|PAIDQ&6~RG;1QM%Bo6M%>X0iz*vk)>+@I@2CcR=`i2!-2sXF;5VP*g<K zj8Y6+k3qO<+p-F_;}rmjoR42ecoX3o0#qa!<6dJ6K$@^RsA3AWn8a|(hLN-C&{H~) zd0?`Ii8lF4Wq8kF5#G<1PtA8!@Nh4P{9p-Y6)sP#CA!4q21q{offw$Lewxp|1%f6I z;B&qsZ8oBio3u|MI~ky@*`Wp5X&o_jRohRg(OGJPeiL;;fB<XTe70PJrCLr_n0U)q zgMBSMU(bTl>B)GQf13H|tO&vP2eAsW`W*!!$JDzoWh`5ci4-p@?Mba5Av7;xpmT9L z9PB64VGvKVvw<1a`4=a!gp}#2tj=8OvIdoxVJu_HpVd;vv>g9&e0-eQDvU(tBv2xO z33*nC664eurjLEYH<)99XKD2lD5(R?x}!qs3X<AivlU34^CTrrGAgEp>DZ`*>6f}` zAuXmQ><CBhsGODsU4ecMHqf1Cl9fx7anvSrJ=V9t3Ofo(ttMF|%ditlusg2ernX?q zWQCYFEBjY8ODk#l8T){IxeR_*M>TC7+G#bdL6l!;=P7;o;tM!SAky}>#3Yg?)h~e5 zawWDPey$(rP9o!OV8Yvh-l77XSx>?wPj75q@)BCqC6<T0g75}H3*jol1_CxbiIK@F zCkv{qo-5Nz;1;ArW?=%j0G(jKT^NDi(^=3oS%Cgw-<x=b+bJv(QYg|UtwMunup4%r zx^xK|hI|WV!rvgM<39l=x$yIkQ{nar13uO?Uf6PHRrMh#(`Ewa3Dgtx_i4=Ys)Bxh z#DH&S<U)L$U8ZheMM30Tknhe{*9qOuNwdg_zX*LffW{4l7O7q=hk1>K5v1rNZ=iC{ z3v--rfNR{%8wZDEhL~|z`KH8NE%Em>g_jM5|FP43ST`>wps~sttV-qEFeX<4d}IbM zJlL>KOz#<hkXpcj4X2<z<Ht31!mv)DW*n%GTrQgWfKw7H<j4lQ5@dSGWOWJi-(<R} zm%LV%p~8U69nDTUmEjVTxMk%G)`y<<cV;~*C#*6@*gvGE#J<iK=JK=S?`gS-qjm!1 zb9)GQn#V=M<KOrD1Z?ty3No>Zx5-6$9bH`HZgPM|+==#v$$^PJjCpXrs*ELqzdJoX zH(xqAHzz0O=IN6YPHJ;#@-r{l@WRB1H%?pSY!!OpzTT68Y0r7VnvQ7?J-N#(i6^~b zpk??ZFg28C0Dj9H7x?EvE&^o5_lB|98w9s7APRd#k;2W^t$Mv)Dpu+=zc<dW(W})p Ix(@aE7dG&)KmY&$ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode_sync_dataset.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode_sync_dataset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4281a198171c166e17b33f0c946982181107e47c GIT binary patch literal 1680 zcmbVM&2J+$6t_JenIzM0nr%TVp@kD7sHD<zLx9@-K)VvE*j>IfiZpV@-sv<G&tN-c zQ%#WAg(K>X1E*Gd;y>WLe*{Q#<y3Lz!ii@mZPOwlgd;z{XFtFBJ-^?}?Uj`lf+1df zOMmqd`rR03qYcV7O!X23Lk#C=j3bPVPI3|vyE>5ztCM?UKk_l+WWRA7Fqe5LW+)}h zpRXz0NlEIQ5Y}M9cj!5enhW11YjO9u#o8=nE8u~xwaTusj<Hw>5!PUKQ~y7DUQhj$ zz?at9hW%2Tk;ka_$|>Z5dboDSMKan2rF)yoq+tB<R3vw)ri$ys^*j?i&gqcnYLh=L zd7?S18^gJ06f6{#5EBiC3$qFH4or0)ghtQNj8v#1F|ObdMuEJg$+4r|6MPh6*x&bN z&KK~E578s^B@*5FPUTd1MATjFKZ9EU81MEP(t(I|dkIwSms8D^j(kZo#Z}$<oaPgL zPs&0@;R0T4F4U_#N^z;PLfF%uD?Jk}xJZl5vyOsds3}}wKO<@C{?|`;-Wz-dm(_so zQPv;Quc??0b_7id!RWgKE)LY7D7jDx$fDevs=>$EaG)~H-zjM_qA7>Fc@7?Iv}FKq z4FRx-iy?$Ppt_LLEuL_5bBpF#Dq@|D!HtefW&Pu`TojZiULft4(|XNBJ3lp<8pvuD z1oC|BlK_Xf>-bo%z|P@41tD`DKau>a2^Yz9Q)Vg?Y0Md5+<XEcFD#28h6ma-#86h# zbeQu~46#mc8gUCm+WPH9`9bT!_UY@!`u>lHzufd5Y^O&r|9oq34Yp0)KKe9)rn18@ z#I%}a$&a8|miWLDKgJBF7*?X4eU}m7jPnCI+Q-P+Zbhv92{6Z#k1GGzJ3%wA@|br6 z%^I-!um&Q86aNGa$gD97G&Et=sG!}H(9LJq+Ck-l{f)6N*mt2>&NX(WA@t$)S?T)! zs9OJ0Jr;e_Pq~hl-?fLMP;xzyB0ezuJly#|5ib>|_H1=(&z7dwn)gQMYI!ZmrD@OF zE2&QQqBR5Vj7_$hQHMX(k|yWdswSe00>GH$1rRiV>%FGjfCchc;!Cu02~*TOXH3*Q zrwkx9oROyD^12c0Mi`pTMF?8GVR?KN$ZK$<-T;Bxz-1f|7Zco?OUK0l{8}U=9V~Bv zPcMvuiO94GWpkE>agiq`<8mrrHTwO3dH6*G_OCV|G`#(1jF)RYe{Xk8<tS>GRMIim wGCSn9&1#QINv9UnQld6xn{Dv^xL}i<e`p#>bwPyCr~wI~W#8=hn2@*e-!ZP^G5`Po literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_channel_states.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_channel_states.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6038d3045827e5945d234206231f566dcaf29982 GIT binary patch literal 917 zcmZ`&J8#rL5Z+xs;(H}WloAC&#Yy2#BoYMzln_xwLXi-nu`F48-o-Izug&h>5l5GT zS53nYxKk<`YHI!jl3S`1H4P2SIthXxX0_kWjCRJ~&W!JOI!y#3PF~WF1fj3SIF}A6 z+pyIHfFXuclwluZqmz{Qq&_X*hSN%&%=MQr;^dh(YcQKR+@3X=Q!kgnirqP`eM`(^ z4c25W);2!o#h7(s96K?d6SmA&-k{gmZ!z*1^|}lAHtONZ&hluq56W_MK!xCGs5I4F z9o<wkD^ealmHhdbi>Tb-6E3vc&`HM6Fyx2DMwBzIjJCj#a`6*nv2L_YfVlbPq`2GM z+g@BT*4uB7KCL@@+wr^4->(NN;I_aWIRHjn*hb%lt!@EmG{aLoB~vuF0&+}_9ZhBy z*w&n=YubK=YulOHU~d|mA$T3$?>QBTlz*8YYDps<4yiol`BdiF*%K=w3g4q?8l}17 z)$)!~T<Rnj52Vax&-J?(OHjF|HK?4r2!5kJ%-j9O?=n<Qt$skV3orQbe)o3p1QM%& z9#GaF(ic>e!H%F&E*RYkxR|IQFSt+<U|t-QDtMR-1C?lgqoC1<#vEeP6mGE509vC5 zLrD`6=0iw3p*ol4fJfX!4rrRhBCKg?=%1?Zhkv)WUzF8VlLv_Zzd8-m1Je-HT_s&C zS3&EweQzuhZGt6?HS*n}G=}epaaNSFWqe!bWc&Z{?4R-MU*svx97yxez(i6x@>>O! xG~-$(N4#>Vl(eiV)J6RRE}0PTPL{KA%I}#8RBHfj;$e@pEf*7u;5Aq_{ssRU6yE>< literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_probe_synchronizer.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_probe_synchronizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..451154877a4815fa2933f5b125bd80fbddf0d4f4 GIT binary patch literal 1785 zcmZuxOK%%D5GJ_~t!-Jh<VOs+=nF-G1yVUcfF6pXaT>JfAu!sekAM&$aF?{a*1kYe zsTJ%Vn&cYv+M|u0`cL{B_7tEe|An49q$F2z%Ej_E!{N;L&G5_3&2<DV|KnG--9qSZ zvsknZm>k2e{(_Dpj#HFjim{oKlu%+vhq^F2sh9cG2bs&gSBSO*IS;tcTd&YdOxIww ze!0N|;hwko8eiuduL*CjtTqo3?;N0!v$DIjvf4hpE$^<#Z)}X5E5dtx$KJllcljRp z)Zyd_3iq!e8WiHj&5C$@0+a5yvWUc!X&#@+B2S(R85<ST{Q3U~M)d=98eL+JIpNNg zQ=1imm3u{Mye#3~F5><jRFfqQhvVAir1mOQ;fhpF<yPLQ4=%M%BnI2p@0!l=ac!U< z!4K`tgKHxUordHk4bmi6C5uJlGs*Ii2z|PnF{OnZMoh*97ek$7LeZ_&T}5|F6Xq?g z&dR20f-K3c0hqB1JNpyKHaPIl?~gtk{HTOf19rxEKVrYId^&iTv$)7PyFU>5Gc_nm zk*gT`qCA_b!Q&(vs6>lTz~wO;2{@akpuxvSS}1)KNe1^75tx0(bRnllA{OT45lfTN z%oC+qRw}DMoO!F3sOp!~raKaPXzVS5Q^sL+039M7+$Q_*yV!LIUVO3xvKyM$U}12# zG=B;cpbB!_kopo0{F>BG?bcrH*DZ}N$%4GfuUbGQx(e!`3V=xGWKP=lv1K%L>^;%} zle85VSvk=nT%$W_5wmotATZ!_G?YvW+MNfdnbgB1=i-7oS)?11Mbs%HO-UI^<E1p& z(fCrRNvbV3vu@LDx0k{B0Cp@E$bs-l4?x&;WEXayzh^HO>aNir8VVDg6!~3oQHod# zE<Iz-J539wLrgucrzIraEUD&EqT_2~wXEkip;KS6G%NDh1)*uil!4g7`xqt_RL$6z zAI~a*lh>qnP5nScK;f!yG<kvZ54CgYYVQjF*2CyOO^kkq2k1NWJ$eeG1wABk2dv6H z=%AiEt09HH3_w5wNWC~MlxR8+6(pPq_bVw2+4$wuWDoTr8<kMa`cEvK2rCOc3m0w8 z;gb7cstFb-(V&Plq%h!RQf`TdHJgvXa(WL0%D%F_0P?Wsw6Q#dz1WnsX=XGyT6lUe zsn9uO;Fze6#xJl9k}NXo&4ZB8ot4ZPD!4|-J8&|@*4^9A99U=m=a3;onY$5@@0jyj zG??UxHu}=+OH)MD%O_bmox%9^qJsNx6>ooDy#3q7+kd-mZB5wfpsmy7LQkZyuEVp; z<d|-h@VsS0OY<C?+_8{ZAD4o&nA@}uKF<n1NyQfiOl2O@HVJUxw7p=jv*lv~s1v+T K-X~`KX!~E$i^J9c literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py b/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py new file mode 100644 index 0000000000..273bb6f506 --- /dev/null +++ b/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py @@ -0,0 +1,186 @@ +import json +import os +import subprocess as sp + +import pytest +import numpy as np + + +DATA_DIR = os.environ.get( + "ECEPHYS_PIPELINE_DATA", + os.path.join("/", "allen", "aibs", "informatics", "module_test_data", "ecephys"), +) + + +def apply_input_json_template( + template_path, input_json_path, temp_dir, data_dir=DATA_DIR +): + """ A utility for adjusting the input json so that: + 1. input paths find cached data in the data dir + 2. output paths write to a specified temp_dir + The adjusted input json will be written to temp_dir. + + """ + + with open(template_path, "r") as input_json_file: + input_json_data = json.load(input_json_file) + + input_json_data["sync_h5_path"] = os.path.join( + data_dir, input_json_data["sync_h5_path"] + ) + + for probe in input_json_data["probes"]: + + probe["barcode_channel_states_path"] = os.path.join( + data_dir, probe["barcode_channel_states_path"] + ) + probe["barcode_timestamps_path"] = os.path.join( + data_dir, probe["barcode_timestamps_path"] + ) + + for timestamps_file in probe["mappable_timestamp_files"]: + timestamps_file["input_path"] = os.path.join( + data_dir, timestamps_file["input_path"] + ) + timestamps_file["output_path"] = os.path.join( + temp_dir, timestamps_file["output_path"] + ) + + with open(input_json_path, "w") as input_json_file: + json.dump(input_json_data, input_json_file) + + +@pytest.fixture() +def align_timestamps_706875901_expected_params(): + return { + "probeA": { + "total_time_shift": -0.6097051644554128, + "global_probe_sampling_rate": 29999.956819421783, + "global_probe_lfp_sampling_rate": 2499.9964016184817, + }, + "probeB": { + "total_time_shift": -0.5875482733055364, + "global_probe_sampling_rate": 29999.90905329544, + "global_probe_lfp_sampling_rate": 2499.9924211079533, + }, + } + + +@pytest.fixture() +def align_timestamps_706875901_expected_files(): + return lambda data_dir: { + "probeA": { + "spikes_timestamps": os.path.join( + data_dir, "706875901_probeA_aligned_spike_timestamps.npy" + ), + "lfp_timestamps": os.path.join( + data_dir, "706875901_probeA_aligned_lfp_timestamps.npy" + ), + }, + "probeB": { + "spikes_timestamps": os.path.join( + data_dir, "706875901_probeB_aligned_spike_timestamps.npy" + ), + "lfp_timestamps": os.path.join( + data_dir, "706875901_probeB_aligned_lfp_timestamps.npy" + ), + }, + } + + +@pytest.fixture(scope="module") +def run_align_timestamps_706875901(tmpdir_factory): + base_path = tmpdir_factory.mktemp("align_timestamps_integration") + executable = ["python", "-m", "allensdk.brain_observatory.ecephys.align_timestamps"] + + input_json_path = os.path.join(base_path, "706875901_align_timestamps_input.json") + output_json_path = os.path.join(base_path, "706875901_align_timestamps_output.json") + executable.extend(["--input_json", input_json_path]) + executable.extend(["--output_json", output_json_path]) + + input_json_template_path = os.path.join( + DATA_DIR, "706875901_align_timestamps_input.json" + ) + apply_input_json_template(input_json_template_path, input_json_path, base_path) + + sp.check_call(executable) + + return output_json_path + + +@pytest.mark.requires_bamboo +def test_align_timestamps_parameters_706875901( + run_align_timestamps_706875901, align_timestamps_706875901_expected_params +): + + with open(run_align_timestamps_706875901, "r") as output_json_file: + output_json_data = json.load(output_json_file) + + for probe in output_json_data["probe_outputs"]: + expected = align_timestamps_706875901_expected_params[probe["name"]] + + assert expected["total_time_shift"] == probe["total_time_shift"] + assert ( + expected["global_probe_sampling_rate"] + == probe["global_probe_sampling_rate"] + ) + assert ( + expected["global_probe_lfp_sampling_rate"] + == probe["global_probe_lfp_sampling_rate"] + ) + + +@pytest.mark.requires_bamboo +def test_align_timestamps_files_706875901( + run_align_timestamps_706875901, align_timestamps_706875901_expected_files +): + + with open(run_align_timestamps_706875901, "r") as output_json_file: + output_json_data = json.load(output_json_file) + + expected_files = align_timestamps_706875901_expected_files(DATA_DIR) + for probe in output_json_data["probe_outputs"]: + + for output_file_key, output_file_path in probe["output_paths"].items(): + expected_file_path = expected_files[probe["name"]][output_file_key] + expected_data = np.load(expected_file_path, allow_pickle=False) + + obtained_data = np.load(output_file_path, allow_pickle=False) + + assert np.allclose(expected_data, obtained_data) + + +@pytest.mark.requires_bamboo +def test_align_timestamps_barcode_agreement_706875901(run_align_timestamps_706875901): + + with open(run_align_timestamps_706875901, "r") as output_json_file: + output_json_data = json.load(output_json_file) + + probe_parameters = {} + for probe in output_json_data["probe_outputs"]: + probe_parameters[probe["name"]] = probe + + aligned_barcode_data = [] + barcode_timestamp_lengths = [] + for probe in output_json_data["input_parameters"]["probes"]: + name = probe["name"] + barcode_data = np.load(probe["barcode_timestamps_path"], allow_pickle=False) + + total_time_shift = probe_parameters[name]["total_time_shift"] + global_probe_sampling_rate = probe_parameters[name][ + "global_probe_sampling_rate" + ] + + aligned_barcode_data.append( + barcode_data / global_probe_sampling_rate - total_time_shift + ) + barcode_timestamp_lengths.append(len(aligned_barcode_data)) + + min_length = np.amin(barcode_timestamp_lengths) + assert min_length > 0 + + for ii in range(len(aligned_barcode_data) - 1): + assert np.allclose( + aligned_barcode_data[ii][:min_length], + aligned_barcode_data[ii + 1][:min_length], + ) diff --git a/test/brain_observatory/ecephys/align_timestamps/test_barcode.py b/test/brain_observatory/ecephys/align_timestamps/test_barcode.py new file mode 100644 index 0000000000..f5d4100a7b --- /dev/null +++ b/test/brain_observatory/ecephys/align_timestamps/test_barcode.py @@ -0,0 +1,97 @@ +import pytest +import numpy as np +import pandas as pd + +import allensdk.brain_observatory.ecephys.align_timestamps.barcode as barcode + + +@pytest.fixture +def two_barcodes(): + + on_times = np.array([11, 14, 30, 32, 34]) + off_times = np.array([13, 15, 31, 33, 35]) + + ibi = 10 + bar_duration = 1.0 + bar_duration_ceiling = 7 + nbits = 4 + + return on_times, off_times, ibi, bar_duration, bar_duration_ceiling, nbits + + +@pytest.fixture +def master_barcodes_sequence(): + + master_times = np.array([10, 25, 30, 37, 44, 45]) + master_barcodes = np.array([1, 2, 3, 4, 5, 6]) + + return master_times, master_barcodes + + +def test_extract_barcodes_from_times(two_barcodes): + + starts_obt, codes_obt = barcode.extract_barcodes_from_times(*two_barcodes) + + starts_exp = [30] + codes_exp = [5] + + assert np.allclose(starts_obt, starts_exp) + assert np.allclose(codes_obt, codes_exp) + + +@pytest.mark.parametrize("sc", [1.0]) # 0.5, 10, .3, -14]) +@pytest.mark.parametrize("tr", [-3]) # 22, -11]) +@pytest.mark.parametrize("sind", [0]) # , 0, -5, 4.3]) +@pytest.mark.parametrize("prate", [10]) # , 1, -7, 0.1]) +@pytest.mark.parametrize("npcodes", [-1]) # , 3]) +def test_get_time_offset(sc, tr, sind, prate, npcodes, master_barcodes_sequence): + + master_times, master_barcodes = master_barcodes_sequence + probe_times = (master_times[:npcodes] + tr) * sc + probe_barcodes = master_barcodes[:npcodes] + + obt = barcode.get_probe_time_offset( + master_times, master_barcodes, probe_times, probe_barcodes, sind, prate + ) + obt = [obt[0][0], obt[1][0], (obt[2][0][0], obt[2][1][0])] + + # total_time_shift, probe_rate, master_endpoints + exp = [ + tr - sind / (sc * prate), + sc * prate, + (master_times[0], master_times[npcodes - 1]), + ] + + for exp_el, obt_el in zip(exp, obt): + assert np.allclose(exp_el, obt_el) + + +@pytest.mark.parametrize("sc", [-10, -2, -1, -0.5, 0.5, 1, 2, 10]) +@pytest.mark.parametrize("tr", [-10, -2, -1, -0.5, 0, 0.5, 1, 2, 10]) +def test_linear_transform_from_intervals(sc, tr, master_barcodes_sequence): + + master = np.array([1, 2]) + probe = (master + tr) * sc + + sc_obt, tr_obt = barcode.linear_transform_from_intervals(master, probe) + + assert sc == sc_obt + assert tr == tr_obt + + +@pytest.mark.parametrize("sc", [-10, -2, -1, -0.5, 0.5, 1, 2, 10]) +@pytest.mark.parametrize("tr", [-10, -2, -1, -0.5, 0, 0.5, 1, 2, 10]) +@pytest.mark.parametrize( + "npcodes", [-1, 3] +) # fails in region [0, 2] due to insufficient samples +def test_match_barcodes(sc, tr, npcodes, master_barcodes_sequence): + + master_times, master_barcodes = master_barcodes_sequence + probe_times = (master_times + tr) * sc + probe_times_cut = probe_times[:npcodes] + probe_barcodes = master_barcodes[:npcodes] + + pint, mint = barcode.match_barcodes( + master_times, master_barcodes, probe_times_cut, probe_barcodes + ) + assert pint[1] - pint[0] == sc * (mint[1] - mint[0]) diff --git a/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py b/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py new file mode 100644 index 0000000000..69e5ff963c --- /dev/null +++ b/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py @@ -0,0 +1,60 @@ +from unittest import mock + +import pytest +import numpy as np + +from allensdk.brain_observatory.ecephys.align_timestamps.barcode_sync_dataset import ( + BarcodeSyncDataset, +) + + +@pytest.mark.parametrize( + "line_labels,expected", [[["barcode"], 0], [["barcodes"], 0], [[], None]] +) +def test_barcode_line(line_labels, expected): + + dataset = BarcodeSyncDataset() + dataset.line_labels = line_labels + + if expected is None: + with pytest.raises(ValueError): + obtained = dataset.barcode_line + + else: + obtained = dataset.barcode_line + assert obtained == expected + + +@pytest.mark.parametrize( + "sample_frequency,rising_edges,falling_edges,times_exp,codes_exp,table", + [ + [1, np.array([30, 50, 50.08]), np.array([31, 50.04, 50.12]), [50], [3], False], + [1, np.array([30, 50, 50.08]), np.array([31, 50.04, 50.12]), [50], [3], True], + ], +) +def test_extract_barcodes( + sample_frequency, rising_edges, falling_edges, times_exp, codes_exp, table +): + + dataset = BarcodeSyncDataset() + dataset.sample_frequency = sample_frequency + dataset.line_labels = ["barcode"] + + with mock.patch( + "allensdk.brain_observatory.sync_dataset.Dataset.get_rising_edges", + return_value=rising_edges, + ): + with mock.patch( + "allensdk.brain_observatory.sync_dataset.Dataset.get_falling_edges", + return_value=falling_edges, + ): + + if table: + table = dataset.get_barcode_table() + times = table["times"] + codes = table["codes"] + else: + times, codes = dataset.extract_barcodes() + + assert np.allclose(times, times_exp) + assert np.allclose(codes, codes_exp) diff --git a/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py b/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py new file mode 100644 index 0000000000..767c1d828e --- /dev/null +++ b/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py @@ -0,0 +1,28 @@ +from unittest import mock + +import pytest +import numpy as np + +from allensdk.brain_observatory.ecephys.align_timestamps import channel_states as cs + + +@pytest.mark.parametrize( + "sample_frequency,events,times,times_exp,codes_exp", + [ + [ + 1, + np.array([1, 1, 1, -1, -1, -1]), + np.array([30, 50, 50.08, 31, 50.04, 50.12]), + [50], + [3], + ] + ], +) +def test_extract_barcodes_from_states( + sample_frequency, events, times, times_exp, codes_exp +): + + times, codes = cs.extract_barcodes_from_states(events, times, sample_frequency) + + assert np.allclose(times, times_exp) + assert np.allclose(codes, codes_exp) diff --git a/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py b/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py new file mode 100644 index 0000000000..5a991829b1 --- /dev/null +++ b/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py @@ -0,0 +1,78 @@ +from unittest import mock + +import pytest +import numpy as np + + +from allensdk.brain_observatory.ecephys.align_timestamps.probe_synchronizer import ( + ProbeSynchronizer, +) + + +def get_test_barcodes(): + + master_barcode_times = np.linspace(0, 30, 10) + master_barcodes = np.arange(0, 11) + + probe_barcode_times = np.linspace(0, 30, 10) * 0.5 + 1 + probe_barcodes = np.arange(0, 11) + + min_time = 0 + max_time = 30 + + return ( + master_barcode_times, + master_barcodes, + probe_barcode_times, + probe_barcodes, + min_time, + max_time, + ) + + +@pytest.fixture +def synchronizer(): + + local_sampling_rate = 4.0 + probe_start_index = 0 + + mbt, mb, pbt, pb, min_time, max_time = get_test_barcodes() + + result = ProbeSynchronizer.compute( + mbt, mb, pbt, pb, min_time, max_time, probe_start_index, local_sampling_rate + ) + + return result + + +@pytest.mark.parametrize( + "samples,sync_condition,expected", + [ + [ + np.arange(10, dtype="float"), + "master", + np.arange(10, dtype="float") / 2.0 - 2, + ], + [np.arange(10, dtype="float"), "probe", np.arange(10, dtype="float") / 4.0], + [ + np.arange(10, dtype="float"), + "salmon", + np.arange(10, dtype="float") / 2.0 - 2, + ], + ], +) +def test_call(synchronizer, samples, sync_condition, expected): + + if sync_condition in ("master", "probe"): + obtained = synchronizer(samples, sync_condition=sync_condition) + # print(obtained) + assert np.allclose(obtained, expected) + + else: + with pytest.raises(ValueError): + synchronizer(samples, sync_condition=sync_condition) + + +def test_sampling_rate_scale(synchronizer): + + assert synchronizer.sampling_rate_scale == 0.5 diff --git a/test/brain_observatory/ecephys/conftest.py b/test/brain_observatory/ecephys/conftest.py new file mode 100644 index 0000000000..db1f726994 --- /dev/null +++ b/test/brain_observatory/ecephys/conftest.py @@ -0,0 +1,11 @@ +import sys + + +def pytest_ignore_collect(path, config): + ''' The brain_observatory.ecephys submodule uses python 3.6 features that may not be backwards compatible! + ''' + + if sys.version_info < (3, 6): + return True + return False + diff --git a/test/brain_observatory/ecephys/ecephys_session_api/__pycache__/test_ecephys_nwb1_session_api.cpython-37.pyc b/test/brain_observatory/ecephys/ecephys_session_api/__pycache__/test_ecephys_nwb1_session_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f94c87ab706f342b405b308de08289de7b75511 GIT binary patch literal 2148 zcmZuyOK%%R9N(E;JC0vT(=?B^w0p!z*o|p<R8Ub$D-fuP)N&bFTFrVU_SpMkX6(dK zA^|S9R_Xz9b_ADx0}gxyj-2*}I7Q;X0deSw|EwRlf?e&-?C<}6&3;s=6fL--AHJra ztXkIZ=3{=9Ve=t8iouIn3<Xw*2tsC$159wX+QiA$9Ld9K2P<KL6p+PnZ?#u6?@5U{ z9I+hBvlUigtE|XM<CP9N!>r6IPpmN-BT{DgkyWdngC(nmQfHs)?nBsA@3(o<9jQlL zDG^6$Av*NE1c)zDgXCxs@Q656_$swSs)_R%<pC-4sgTF0rpH@hJW%}RUh|#znst?k zK38?n(niJ>Tse3gc<#ZYn%J^Vtci7IsdbGe_{>6<wtJ4woq(eZG5idlBAq`$y%k;P zt&Xv}sf*trT`~x8*nO-XWJnp1${5m>aaU*D{(`#-+zxQ-IWk#eIY<kngXIB#x`dl_ z8N2}ak4yOK3@-xy^AcW~;bp*oUBW9fybAaqOZeIhU+?4RNadF(7iN@=jN&d)F3u>M z8RfR2K*a043+&Ra#kMkZf6m|Am|Q$F8HD_Rh3*31d<Fk1!!PMA(6l+(HWFiWiXnqo z@AP)ZMs^W@?=tAy&h-7X(02u}oecZMU?*sD^~^f8L4!T5z;h)3glgHqcd74yzQ3k? zz1P5IwRf$z&34)4Z!yGh<rzA4K+>5>V)+J0Ix|VE>PC|7LgQXNeo=JcdfXMt)m&-! zkSf=wiZeHkT;1jFfe5(U$U3%R8nyxb+E{MX#{c(e-F+Opa$uCqbteG_&2BqRMw!)E zx^2m+<}P&u5%paiyF$BSCc}i}Z5_)|J>xz%jbFp5W5$S-%s>sfG}9#>!7PZsH;{F_ z{*dZ{q=EZsNIP74x5S-o%OV$<6bD*F9j_y)S(VomLzo#-IS8ogdd*umLgnq9e-Adu zW{3K*^qMz3#yd084e>!0NZZj=zZb?s!M!-*p6*J{#r^}J?z~FPDBeLlkYe%_$R(A; zk){!c!9HIzmM$m_?zI2)>TQvLztV&%o_v?H&huvX8+iKg{B_vY5ZP5)go9w9yhL)v zL7|2mc!H_g^)%0qgwiU_CnHnN)KPtrNZZ(|9LPBI=I2mqD=pKaP$B{!qBbYFK_oyD zCycCq3<uByNkg7i?<&Qmv2b6?Sf)0dTxl+mBGRO~@FW6OMYa~-%bqE+(c#)#&@}Y} zPAbqEktv8uIA>{2b!oy)hTxp@AV98Cr_V=<R6|Z9?~o4pK`cW+BYp&N3C(4iAJSj| zocKsieZDIt9g%z@V;}q}w7WElc%aDDWrq%h;$U`Rh+J#O5fdiHB~n%yaJsG1oQN1d zs^z3PZqpStJ=00qRDbRmu@j|<-A>vsEO`z1UY^~%-TDG@r&_d2S>30HG#a(;M$}lN zZ?$+dRINDSk%EEXvH4rHJ{NvVL1=F#wB0ui+{y+|v3|ppv*AlBA}{tq?U0($m`~z- z^=8g_G!dDIHy>3f{N6IPo{Z9UqjZ`IWjbTe{8ZJu@Un^pRB$#B+_;F%y0f@1Be?Mv z-oZN=eG_fs0&=l~wy<<TwpK}3%#a4cm(aPEgvqg>Diq>YawGdVqNY^xiuq{HgRK82 zzWU7l`8tmvYw6SpsqB+A$-f-HS)n|ihJGBAQbJAdYAKF+=1^9UrPp<^nik#<V>Sr* S9W!joxLAfT;KpS;59>eAc#P2i literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py b/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py new file mode 100644 index 0000000000..c0e2ad3b12 --- /dev/null +++ b/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py @@ -0,0 +1,61 @@ +from pathlib import Path + +import pytest +import pandas as pd +import xarray as xr + +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession + + +@pytest.mark.requires_bamboo +@pytest.mark.parametrize("nwb_path", [ + Path("/", "allen", "aibs", "mat", "Kael", "ecephys_data", "mouse412792.spikes.nwb") +]) +def test_spikes_nwb1(nwb_path): + """ + This test was based on the file /allen/aibs/mat/ecephys_data/mouse412792.spikes.nwb. To run this test please copy + or create a link to it in this directory. + """ + + if not nwb_path.exists(): + pytest.skip() + + # TODO: Convert this NWB 1 file into a NWB 2 file that way we can check that NWB Adaptors return the same data + # and computations (minus a few exceptions for missing NWB 1 data). + session = EcephysSession.from_nwb_path(path=str(nwb_path), nwb_version=1) + assert(isinstance(session.units, pd.DataFrame)) + assert(len(session.units) == 1363) + + print(session.stimulus_names) + + assert(isinstance(session.stimulus_presentations, pd.DataFrame)) + assert(len(session.stimulus_presentations) == 70390) + assert(len(session.get_stimulus_table(['Natural Images_5'])) == 5950) + assert(len(session.get_stimulus_table(['drifting_gratings_2'])) == 630) + assert(len(session.get_stimulus_table(['flash_250ms_1'])) == 150) + assert(len(session.get_stimulus_table(['gabor_20_deg_250ms_0'])) == 3645) + assert(len(session.get_stimulus_table(['natural_movie_one_three'])) == 18000) + assert(len(session.get_stimulus_table(['natural_movie_three_four'])) == 36000) + assert(len(session.get_stimulus_table(['spontaneous'])) == 15) + assert(len(session.get_stimulus_table(['static_gratings_6'])) == 6000) + + assert(session.running_speed.shape[0] == 365700) + + assert(len(session.spike_times.keys()) == 1363) + + assert(len(session.mean_waveforms.keys()) == 1363) + one_waveform = next(iter(session.mean_waveforms.values())) + assert(isinstance(one_waveform, xr.DataArray)) + + assert(len(session.probes) == 6) + assert(len(session.channels) == 737) + + pst = session.presentationwise_spike_times() + assert(isinstance(pst, pd.DataFrame) and len(pst) > 0) + + cpc = session.conditionwise_spike_statistics( + stimulus_presentation_ids=session.stimulus_presentations.index.values[:40] + ) + assert(isinstance(cpc, pd.DataFrame) and len(cpc) > 0) + + diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__init__.py b/test/brain_observatory/ecephys/stimulus_analysis/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9e555410291aa7358dd17d7ff2e2806a99d706d GIT binary patch literal 225 zcmYL@v5Epg42DOzLIfY=3Z24EMDEU3Y{YJ0$nJ!5aLg>5S!GIFU&G2*vh@+{tjrYR z5C4}C@`wBlhXW;|%Lz)o7rfPz=10t50;ksMySKWkwv0b`o)=TIVQksJ7TmakBTzQK z1a%|_6N7YM6B{J1g|XRYHcMX__6bJ~)I0b`$%Y^sZl@D+(p3wdY^>z$0a9$U#u`gf ibMpHxbZmhjWcIAB_2iSa<0jwwvwd`3z<K%cAyzL@r9=$? literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0312bd2eef46223703f4e77940e1353a33aa7ff9 GIT binary patch literal 3220 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 NBC*C#Cw!|}`5WOa7_R^T literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_dot_motion.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_dot_motion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa080163a8150fbee46361c62c144578151eed39 GIT binary patch literal 3958 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 XJOk^fKy|CN&~)6o+jQsW9oPCF$0+Xr literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_drifting_gratings.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_drifting_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3fcdcb60d31692874039a255e3e8c6b0c99beb7 GIT binary patch literal 8458 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 Zo6?oj@@e^$d`5l}`N(N1$qT8B@;`MtIf?)P literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_flashes.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_flashes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd409f527cc1cb7d5e92fe277835cbb1c170b0b7 GIT binary patch literal 3450 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 Vm}}ON%<ERW)3n{XTXV0w)<+1!YBT@< literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_movies.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_movies.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79d27e4a34b460d2912ac3c6b626cd8b0553d67d GIT binary patch literal 2067 zcma)7&2QsG6rZtU$8kRTwN$Wts0)Zy7HulQ1)&vcDGNf{=Ca~qMY5)uN!N)zHZzm5 zsmg&(kL-~fhm|<-FZs%;{{ko88z*T~7O}QG^WJ>CnfH6Y_xyFc9TIrtAHT5s0U>{( zvV3YF9KfevLBk2BDT%6{Mvm3psKy=cre5YpKE=6OTF-(gu(FpnvM>rM`Hpa(*DndL z3xDoLO+m&j9`ME`nbW8ZT4%h$L*9Hzd5gF0=;qpJhi}-?t+mljzGX+ZIekjH+gET) z(!Zk6c4^r;&WDqyLhB@#heZM-?LIS8#nR*aED;))JRXYT*-S514RQbSaX>hLPv3z? zkce^uK2z>olE~#QoL4J1@reHM^&vw%8z1cPJAzLmz=q7p3$OwEXdjN=>F4JAtVl&B zq!IkFQn`ZRnilEkPof&I<?r8)z8w6Zh0+7|jPc$H`-#cf;83z*E;;*rAmo`I<b{xW z2yKp@44xz>1DzQ0uwcUpI~A}uO<@I}>>HuY{)u9VjPnyPd&W$zX8WSTU|*Xgo2FA8 zGs)7KPPE++%L=nNv!L~gS$X$Vn0U3iP(p(X%mB=~iS8nDgr0wT8=T&M@9P7YK@4YQ zB96;2hST^oMY$EnKTcU%%_y{QvANM8y2^(J1$%fvt-cn{RWNWR24fKjyYhxL1YV(~ zvbg{zW<|2GG))|Z^7+SWRN9ld*&9vMbhejV$Fv9W^p#*bmn&Yluo<(;^5OslLoOh% zUecebp%=g|kemx=3^_G%^oPcMK}`*GZw|fjd2LST6lNabjAfIDY;xg_&}}TQtSj1| zcNW*&t0;ek&Ufp|gHGW!${GS&b`CZ00V8O6Sh`x6D45E`#0l4>r<gnyUDvu^))&T0 zM`kyGvzRrIV{w`@j#;Cjo)F@MG^8D>?t;9A17cxucmTrda4?93Yii)VqdzhJ!ebXa zR$H(Kx^3)kIus^4k=igh6j6vIjSV|VMd=j0Y<$BE`&NO+>Mh(?Ii%hOS-pde4gNI) z+SZ#T)9=9wjR002sSiMUy+5yD=FR*ub@XsfZM45Y4^bZn;|8ytVw|5?uRS{&PJBJE zy1&v>t6M8$oWHPou$uqX>W!8DyVa5W;Vl%^4%|AbFM=M`M@;6i%%aXHQHeZ_6*B_$ z-82~qz*WS$U<y(nsD|TBHI;F3#!^&5R3L{z?l!OKrrxz@WWuOqsMUL*srRwLaFj08 zsnSa%7tc!%d8y0#Fi)qM)c+f*mJQXy@I$a>%XSs1ZMseGIGeP3)kiSf-HH5ShI=AU zPBSQKjx1n^L0zrx6$MaaN4P>EPotw{8SVY6g7y|!*IP1WRY7~}#nYx-^w}F&x|PQj zg2+9HOY$6kVxr2$TE^4_ej1acu=!<4X+6Bb<!eF*kE*)*6;?xwP(a~zS`=P))9ZM< H?cLTt_{k07 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_scenes.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_scenes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..620ef215a2a92c482f1028a10a2fae90c97ba320 GIT binary patch literal 3884 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 Cq~k*X literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_receptive_field_mapping.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_receptive_field_mapping.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa67fee8e148def6758ac1585f73092204c7c03d GIT binary patch literal 6578 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_static_gratings.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_static_gratings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3735d7906a255fea7cb8b8c174aa0cf8c3ea6a10 GIT binary patch literal 5676 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 M^r(AN*<?!nFC#6;W&i*H literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_stimulus_analysis.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_stimulus_analysis.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8ede68b3e22a3233f4b2a7993d7a0e2e78432f0 GIT binary patch literal 14012 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 I4e#}T0mKw%k^lez literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/conftest.py b/test/brain_observatory/ecephys/stimulus_analysis/conftest.py new file mode 100644 index 0000000000..b4ceb7556c --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/conftest.py @@ -0,0 +1,66 @@ +import pytest +import pandas as pd +import numpy as np + +from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi + + +class MockSessionApi(EcephysSessionApi): + """Mock Data to create an EcephysSession object and pass it into stimulus analysis""" + def get_spike_times(self): + return { + 0: np.array([1, 2, 3, 4]), + 1: np.array([2.5]), + 2: np.array([1.01, 1.03, 1.02]), + 3: np.array([]), + 4: np.array([0.01, 1.7, 2.13, 3.19, 4.25]), + 5: np.array([1.5, 3.0, 4.5]) + } + + def get_channels(self): + return pd.DataFrame({ + 'local_index': [0, 1, 2], + 'probe_horizontal_position': [5, 10, 15], + 'probe_id': [0, 0, 1], + 'probe_vertical_position': [10, 22, 33], + 'valid_data': [False, True, True] + }, index=pd.Index(name='channel_id', data=[0, 1, 2])) + + def get_units(self): + udf = pd.DataFrame({ + 'firing_rate': np.linspace(1, 3, 6), + 'isi_violations': [40, 0.5, 0.1, 0.2, 0.0, 0.1], + 'local_index': [0, 0, 1, 1, 2, 2], + 'peak_channel_id': [0, 2, 1, 1, 2, 0], + 'quality': ['good', 'good', 'good', 'bad', 'good', 'good'], + }, index=pd.Index(name='unit_id', data=np.arange(6)[::-1])) + return udf + + def get_probes(self): + return pd.DataFrame({ + 'description': ['probeA', 'probeB'], + 'location': ['VISp', 'VISam'], + 'sampling_rate': [30000.0, 30000.0] + }, index=pd.Index(name='id', data=[0, 1])) + + def get_stimulus_presentations(self): + return pd.DataFrame({ + 'start_time': np.linspace(0.0, 4.5, 10, endpoint=True), + 'stop_time': np.linspace(0.5, 5.0, 10, endpoint=True), + 'stimulus_name': ['spontaneous'] + ['s0'] * 6 + ['spontaneous'] + ['s1'] * 2, + 'stimulus_block': [0] + [1] * 6 + [0] + [2] * 2, + 'duration': 0.5, + 'stimulus_index': [0] + [1] * 6 + [0] + [2] * 2, + 'conditions': [0, 0, 0, 0, 1, 1, 1, 0, 2, 3] # generic stimulus condition + }, index=pd.Index(name='id', data=np.arange(10))) + + def get_invalid_times(self): + return pd.DataFrame() + + + def get_running_speed(self): + return pd.DataFrame({ + "start_time": np.linspace(0.0, 9.9, 100), + "end_time": np.linspace(0.1, 10.0, 100), + "velocity": np.linspace(-0.1, 11.0, 100) + }) \ No newline at end of file diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py b/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py new file mode 100644 index 0000000000..1f819bbed0 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py @@ -0,0 +1,95 @@ +import pytest +import numpy as np +import pandas as pd + +from .conftest import MockSessionApi +from allensdk.brain_observatory.ecephys.stimulus_analysis.dot_motion import DotMotion +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession + + +class MockDMSessionApi(MockSessionApi): + def get_stimulus_presentations(self): + features = np.array(np.meshgrid([0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0], # Dir + [0.001, 0.005, 0.01, 0.02]) # Speed + ).reshape(2, 32) + + features = np.concatenate((features, np.array([np.nan, np.nan]).reshape((2, 1))), axis=1) # null case + + return pd.DataFrame({ + 'start_time': np.concatenate(([0.0], np.linspace(0.5, 32.5, 33, endpoint=True), [33.5])), + 'stop_time': np.concatenate(([0.5], np.linspace(1.5, 33.5, 33, endpoint=True), [34.0])), + 'stimulus_name': ['spontaneous'] + ['dot_motion']*33 + ['spontaneous'], + 'stimulus_block': [0] + [1]*33 + [0], + 'duration': [0.5] + [1.0]*33 + [0.5], + 'stimulus_index': [0] + [1]*33 + [0], + 'Dir': np.concatenate(([np.nan], features[0,:], [np.nan])), + 'Speed': np.concatenate(([np.nan], features[1, :], [np.nan])) + }, index=pd.Index(name='id', data=np.arange(35))) + + def get_invalid_times(self): + return pd.DataFrame() + + + +@pytest.fixture +def ecephys_api(): + return MockDMSessionApi() + + +def test_load(ecephys_api): + session = EcephysSession(api=ecephys_api) + dm = DotMotion(ecephys_session=session) + assert(dm.name == 'Dot Motion') + assert(set(dm.unit_ids) == set(range(6))) + assert(len(dm.conditionwise_statistics) == 33*6) + assert(dm.conditionwise_psth.shape == (33, 1.0/0.001-1, 6)) + assert(not dm.presentationwise_spike_times.empty) + assert(len(dm.presentationwise_statistics) == 33*6) + assert(len(dm.stimulus_conditions) == 33) + + +def test_stimulus(ecephys_api): + session = EcephysSession(api=ecephys_api) + dm = DotMotion(ecephys_session=session) + assert(isinstance(dm.stim_table, pd.DataFrame)) + assert(len(dm.stim_table) == 33) + assert(set(dm.stim_table.columns).issuperset({'Dir', 'Speed', 'start_time', 'stop_time'})) + + assert(set(dm.directions) == {0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0}) + assert(dm.number_directions == 8) + + assert(set(dm.speeds) == {0.001, 0.005, 0.01, 0.02}) + assert(dm.number_speeds == 4) + + +def test_metrics(ecephys_api): + session = EcephysSession(api=ecephys_api) + rfm = DotMotion(ecephys_session=session) + assert(isinstance(rfm.metrics, pd.DataFrame)) + assert(len(rfm.metrics) == 6) + assert(rfm.metrics.index.names == ['unit_id']) + + assert('pref_speed_dm' in rfm.metrics.columns) + assert(rfm.metrics['pref_speed_dm'].loc[0] == 0.001) + assert(rfm.metrics['pref_speed_dm'].loc[5] == 0.001) + + assert('pref_dir_dm' in rfm.metrics.columns) + assert(rfm.metrics['pref_dir_dm'].loc[0] == 0.0) + assert(rfm.metrics['pref_dir_dm'].loc[4] == 45.0) + + assert('firing_rate_dm' in rfm.metrics.columns) + assert('fano_dm' in rfm.metrics.columns) + assert('lifetime_sparseness_dm' in rfm.metrics.columns) + assert('run_pval_dm' in rfm.metrics.columns) + assert('run_mod_dm' in rfm.metrics.columns) + + +@pytest.mark.skip(reason='metric not yet implemented') +def test_speed_tuning_idx(): + pass + + +if __name__ == '__main__': + # test_load() + # test_stimulus() + test_metrics() diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py b/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py new file mode 100644 index 0000000000..25bf4510c3 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py @@ -0,0 +1,230 @@ +import numpy as np +import pandas as pd +import pytest + +from .conftest import MockSessionApi +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession +from allensdk.brain_observatory.ecephys.stimulus_analysis.drifting_gratings import DriftingGratings, modulation_index, c50, f1_f0 + + +pd.set_option('display.max_columns', None) + + +class MockDGSessionApi(MockSessionApi): + ## c50 will be calculated differently depending on if 'drifting_gratings_contrast' stimuli exists. + + def __init__(self, with_dg_contrast=False): + self._with_dg_contrast = with_dg_contrast + + def get_spike_times(self): + return { + 0: np.array([1, 2, 3, 4]), + 1: np.array([2.5]), + 2: np.array([1.01, 1.03, 1.02]), + 3: np.array([]), + 4: np.array([0.01, 1.7, 2.13, 3.19, 4.25, 46.4, 48.7, 54.2, 80.3, 85.40, 85.44, 85.47]), + #5: np.array([1.5, 3.0, 4.5, 90.1]) # make sure there is a spike for the contrast stimulus + 5: np.concatenate(([1.5, 3.0, 4.5], np.linspace(85.0, 89.0, 20))) + } + + def get_stimulus_presentations(self): + features = np.array(np.meshgrid([1.0, 2.0, 4.0, 8.0, 15.0], # TF + [0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0]) # ORI + ).reshape(2, 40) + + stim_table = pd.DataFrame({ + 'start_time': np.concatenate(([0.0], np.linspace(0.5, 78.5, 40, endpoint=True), [80.0])), + 'stop_time': np.concatenate(([0.0], np.linspace(2.5, 80.5, 40, endpoint=True), [81.0])), + 'stimulus_name': ['spontaneous'] + ['drifting_gratings']*40 + ['spontaneous'], + 'stimulus_block': [0] + [1]*40 + [0], + 'duration': [0.5] + [2.0]*40 + [0.5], + 'stimulus_index': [0] + [1]*40 + [0], + 'temporal_frequency': np.concatenate(([np.nan], features[0, :], [np.nan])), + 'orientation': np.concatenate(([np.nan], features[1, :], [np.nan])), + 'contrast': 0.8 + }, index=pd.Index(name='id', data=np.arange(42))) + + if self._with_dg_contrast: + features = np.array(np.meshgrid([0.0, 45.0, 90.0, 135.0], # ORI + [0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]) # contrast + ).reshape(2, 36) + + dg_constrast = pd.DataFrame({ + 'start_time': np.concatenate((80.0 + np.linspace(0.0, 17.5, 36, endpoint=True), [97.5])), + 'stop_time': np.concatenate((81.5 + np.linspace(0.5, 18.0, 36, endpoint=True), [98.0])), + 'stimulus_name': ['drifting_gratings_contrast']*36 + ['spontaneous'], + 'stimulus_block': [2]*36 + [0], + 'duration': [0.5]*36 + [0.5], + 'stimulus_index': [2]*36 + [0], + 'temporal_frequency': 2.0, + 'orientation': np.concatenate((features[0, :], [np.nan])), + 'contrast': np.concatenate((features[1, :], [np.nan])) + }, index=pd.Index(name='id', data=np.arange(42, 42+37))) + stim_table = pd.concat((stim_table, dg_constrast)) + + return stim_table + + def get_invalid_times(self): + return pd.DataFrame() + + + + +@pytest.fixture +def ecephys_api(): + return MockDGSessionApi() + +#def mock_ecephys_api(): +# return MockDGSessionApi() + +@pytest.fixture +def ecephys_api_w_contrast(): + return MockDGSessionApi(with_dg_contrast=True) + + + +def test_load(ecephys_api): + session = EcephysSession(api=ecephys_api) + dg = DriftingGratings(ecephys_session=session) + assert(dg.name == 'Drifting Gratings') + assert(set(dg.unit_ids) == set(range(6))) + assert(len(dg.conditionwise_statistics) == 40*6) + assert(dg.conditionwise_psth.shape == (40, 2.0/0.001-1, 6)) + assert(not dg.presentationwise_spike_times.empty) + assert(len(dg.presentationwise_statistics) == 40*6) + assert(len(dg.stimulus_conditions) == 40) + + +def test_stimulus(ecephys_api): + session = EcephysSession(api=ecephys_api) + dg = DriftingGratings(ecephys_session=session) + assert(isinstance(dg.stim_table, pd.DataFrame)) + assert(len(dg.stim_table) == 40) + assert(len(dg.stim_table_contrast) == 0) + + assert(set(dg.stim_table.columns).issuperset({'temporal_frequency', 'orientation', 'contrast', 'start_time', + 'stop_time'})) + + assert(set(dg.tfvals) == {1.0, 2.0, 4.0, 8.0, 15.0}) + assert(dg.number_tf == 5) + + assert(set(dg.orivals) == {0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0}) + assert(dg.number_ori == 8) + + assert(set(dg.contrastvals) == {0.8}) + assert(dg.number_contrast == 1) + + +def test_metrics(ecephys_api): + # Run metrics with no drifting_gratings_contrast stimuli + session = EcephysSession(api=ecephys_api) + dg = DriftingGratings(ecephys_session=session) + assert(isinstance(dg.metrics, pd.DataFrame)) + assert(len(dg.metrics) == 6) + assert(dg.metrics.index.names == ['unit_id']) + + assert('pref_ori_dg' in dg.metrics.columns) + assert(np.all(dg.metrics['pref_ori_dg'].loc[[0, 1, 2, 3, 4, 5]] == np.full(6, 0.0))) + + assert('pref_tf_dg' in dg.metrics.columns) + assert(np.all(dg.metrics['pref_tf_dg'].loc[[0, 5]] == [1.0, 2.0])) + + # with no contrast stimuli the c50 metric should be null + assert('c50_dg' in dg.metrics.columns) + assert(np.allclose(dg.metrics['c50_dg'].values, [np.nan]*6, equal_nan=True)) + + assert('f1_f0_dg' in dg.metrics.columns) + assert(np.allclose(dg.metrics['f1_f0_dg'].loc[[0, 1, 2, 3, 4, 5]], + [0.001572, np.nan, 1.999778, np.nan, 1.560436, 1.999978], equal_nan=True, atol=1.0e-06)) + + assert('mod_idx_dg' in dg.metrics.columns) + assert('g_osi_dg' in dg.metrics.columns) + assert(np.allclose(dg.metrics['g_osi_dg'].loc[[0, 3, 4, 5]], [1.0, np.nan, 0.745356, 1.0], equal_nan=True)) + + assert('g_dsi_dg' in dg.metrics.columns) + assert(np.allclose(dg.metrics['g_dsi_dg'].loc[[0, 3, 4, 5]], [1.0, np.nan, 0.491209, 1.0], equal_nan=True)) + + assert('firing_rate_dg' in dg.metrics.columns) + assert('fano_dg' in dg.metrics.columns) + assert('lifetime_sparseness_dg' in dg.metrics.columns) + assert('run_pval_dg' in dg.metrics.columns) + assert('run_mod_dg' in dg.metrics.columns) + + +def test_contrast_stimulus(ecephys_api_w_contrast): + session = EcephysSession(api=ecephys_api_w_contrast) + dg = DriftingGratings(ecephys_session=session) + assert(len(dg.stim_table) == 40) + + assert(len(dg.stim_table_contrast) == 36) + assert(len(dg.stimulus_conditions_contrast) == 36) + assert(len(dg.conditionwise_statistics_contrast) == 36*6) + + +def test_metric_with_contrast(ecephys_api_w_contrast): + session = EcephysSession(api=ecephys_api_w_contrast) + dg = DriftingGratings(ecephys_session=session) + + assert(isinstance(dg.metrics, pd.DataFrame)) + assert(len(dg.metrics) == 6) + assert(dg.metrics.index.names == ['unit_id']) + + # make sure normal prefered conditions remain the same + assert('pref_ori_dg' in dg.metrics.columns) + assert(np.all(dg.metrics['pref_ori_dg'].loc[[0, 1, 2, 3, 4, 5]] == np.full(6, 0.0))) + assert('pref_tf_dg' in dg.metrics.columns) + assert(np.all(dg.metrics['pref_tf_dg'].loc[[0, 5]] == [1.0, 2.0])) + + # Make sure class can see drifting_gratings_contrasts stimuli + assert('c50_dg' in dg.metrics.columns) + assert(np.allclose(dg.metrics['c50_dg'].loc[[0, 4, 5]], [0.359831, np.nan, 0.175859], equal_nan=True)) + + +@pytest.mark.parametrize('response,tf,sampling_rate,expected', + [ + (np.array([]), 2.0, 1000.0, np.nan), # invalid input + (np.zeros(2000), 2.0, 1000.0, 0.0), # no responses, MI ~ 0 + (np.ones(2000), 4.0, 1000.0, 0.0), # no derivation, MI ~ 0 + (np.linspace(0.5, 12.1), 8.0, 1.0, np.nan), # tf is outside niquist freq. + (np.array([0.1, 0.2, 0.2, 1.1]), 2.0, 4.0, 0.1389328986), # low mi + (np.linspace(0.5, 12.1, 50), 8.0, 1000.0, 4.993941), # high mi + ]) +def test_modulation_index(response, tf, sampling_rate, expected): + mi = modulation_index(response, tf, sampling_rate) # return nan, invalid + assert(np.isclose(mi, expected, equal_nan=True)) + + +@pytest.mark.parametrize('contrast_vals,responses,expected', + [ + (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.array([]), np.nan), # invalid input + (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.full(9, 12.0), 0.0090), # flat non-zero curve + (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.zeros(9), 0.3598313725490197), # no responses + (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.linspace(0.0, 12.0, 9), 0.1330745098039216), + (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.array([10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), np.nan), # nan, special case where curve can't be fitted + ]) +def test_c50(contrast_vals, responses, expected): + c50_metric = c50(contrast_vals, responses) + assert(np.isclose(c50_metric, expected, equal_nan=True)) + + +@pytest.mark.parametrize('data_arr,tf,trial_duration,expected', + [ + (np.array([]), 2.0, 1.0, np.nan), # invalid input + (np.zeros((5, 256)), 4.0, 2.0, np.nan), # no spikes + (np.ones((5, 256)), 18.0, 16.0, np.nan), # tf*trial_duration is too high, returns nan + (np.full((5, 256), 5.0), 4.0, 2.0, 0.0), # has constant spiking + (np.array([0, 0, 1, 1, 2, 0, 5, 1]), 2.0, 1.0, 0.894427190999916), # can handle arrays + (np.array([[0, 0, 1, 1, 2, 0, 5, 1]]), 2.0, 1.0, 0.894427190999916) # same as above but int matrix form + ]) +def test_f1_f0(data_arr, tf, trial_duration, expected): + f1_f0_val = f1_f0(data_arr, tf, trial_duration) + assert(np.isclose(f1_f0_val, expected, equal_nan=True)) + + +if __name__ == '__main__': + # test_stimulus() + test_metrics() + # test_stim_table_contrast() + # test_contrast_stimulus() + # test_metric_with_contrast() + diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py b/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py new file mode 100644 index 0000000000..5d245999d5 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py @@ -0,0 +1,81 @@ +import pytest +import pandas as pd +import numpy as np + +from .conftest import MockSessionApi +from allensdk.brain_observatory.ecephys.stimulus_analysis.flashes import Flashes +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession + + +class MockFlSessionApi(MockSessionApi): + def get_stimulus_presentations(self): + return pd.DataFrame({ + 'start_time': np.concatenate(([0.0], np.linspace(0.5, 4.25, 16, endpoint=True), [4.5])), + 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 4.5, 16, endpoint=True), [5.0])), + 'stimulus_name': ['spontaneous'] + ['flashes']*16 + ['spontaneous'], + 'stimulus_block': [0] + [1]*16 + [0], + 'duration': [0.5] + [0.25]*16 + [0.5], + 'stimulus_index': [0] + [1]*16 + [0], + 'color': [np.nan, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, 1, -1, 1, -1, -1, 1, np.nan] + }, index=pd.Index(name='id', data=np.arange(18))) + + def get_invalid_times(self): + return pd.DataFrame() + + + +@pytest.fixture +def ecephys_api(): + return MockFlSessionApi() + + +def test_load(ecephys_api): + session = EcephysSession(api=ecephys_api) + fl = Flashes(ecephys_session=session) + assert(fl.name == 'Flashes') + assert(set(fl.unit_ids) == set(range(6))) + assert(len(fl.conditionwise_statistics) == 2*6) + assert(fl.conditionwise_psth.shape == (2, 249, 6)) + assert(not fl.presentationwise_spike_times.empty) + assert(len(fl.presentationwise_statistics) == 16*6) + assert(len(fl.stimulus_conditions) == 2) + + +def test_stimulus(ecephys_api): + session = EcephysSession(api=ecephys_api) + fl = Flashes(ecephys_session=session) + assert(isinstance(fl.stim_table, pd.DataFrame)) + assert(len(fl.stim_table) == 16) + assert(set(fl.stim_table.columns).issuperset({'color', 'start_time', 'stop_time'})) + + assert(all(fl.colors == [-1.0, 1.0])) + assert(fl.number_colors == 2) + + +def test_metrics(ecephys_api): + session = EcephysSession(api=ecephys_api) + fl = Flashes(ecephys_session=session) + assert(isinstance(fl.metrics, pd.DataFrame)) + assert(len(fl.metrics) == 6) + assert(fl.metrics.index.names == ['unit_id']) + + assert('on_off_ratio_fl' in fl.metrics.columns) + assert(np.allclose(fl.metrics['on_off_ratio_fl'].loc[[0, 1, 2, 3, 4, 5]], + [0.0, np.nan, 0.0, np.nan, 3.0, 2.0], equal_nan=True)) # Check _get_on_off_ratio() method + + assert('sustained_idx_fl' in fl.metrics.columns) + assert(np.allclose(fl.metrics['sustained_idx_fl'].loc[[0, 1, 2, 3, 4, 5]].values, + [0.00401606, np.nan, 0.01204819, np.nan, 0.02811245, 0.00401606], equal_nan=True)) + + assert('firing_rate_fl' in fl.metrics.columns) + assert('time_to_peak_fl' in fl.metrics.columns) + assert('fano_fl' in fl.metrics.columns) + assert('lifetime_sparseness_fl' in fl.metrics.columns) + assert('run_pval_fl' in fl.metrics.columns) + assert('run_mod_fl' in fl.metrics.columns) + + +if __name__ == '__main__': + # test_load() + # test_stimulus() + test_metrics() diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py b/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py new file mode 100644 index 0000000000..beab602723 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py @@ -0,0 +1,57 @@ +import pytest +import numpy as np +import pandas as pd + +from .conftest import MockSessionApi +from allensdk.brain_observatory.ecephys.stimulus_analysis.natural_movies import NaturalMovies +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession + + +class MockNMSessionApi(MockSessionApi): + def get_stimulus_presentations(self): + raise NotImplementedError() + + +@pytest.fixture +def ecephys_api(): + return MockNMSessionApi() + + +@pytest.mark.skip(reason='NaturalMovies not fully implemented.') +def test_load(ecephys_api): + session = EcephysSession(api=ecephys_api) + nm = NaturalMovies(ecephys_session=session) + assert(nm.name == 'Natural Movies') + assert(set(nm.unit_ids) == set(range(6))) + # assert(len(nm.conditionwise_statistics) == 119*6) + # assert(nm.conditionwise_psth.shape == (119, 249, 6)) + # assert(not nm.presentationwise_spike_times.empty) + # assert(len(nm.presentationwise_statistics) == 119*6) + # assert(len(nm.stimulus_conditions) == 119) + + +@pytest.mark.skip(reason='NaturalMovies not fully implemented.') +def test_stimulus(ecephys_api): + session = EcephysSession(api=ecephys_api) + nm = NaturalMovies(ecephys_session=session) + assert(isinstance(nm.stim_table, pd.DataFrame)) + # assert(len(nm.stim_table) == 119) + # assert(set(nm.stim_table.columns).issuperset({'frame', 'start_time', 'stop_time'})) + # assert(np.all(nm.images == np.arange(-1.0, 118))) + # assert(nm.number_images == 119) + # assert(nm.number_nonblank == 118) + + +@pytest.mark.skip(reason='NaturalMovies not fully implemented.') +def test_metrics(ecephys_api): + session = EcephysSession(api=ecephys_api) + nm = NaturalMovies(ecephys_session=session) + assert(isinstance(nm.metrics, pd.DataFrame)) + assert(len(nm.metrics) == 6) + assert(nm.metrics.index.names == ['unit_id']) + + assert('fano_nm' in nm.metrics.columns) + assert('firing_rate_nm' in nm.metrics.columns) + assert('lifetime_sparseness_nm' in nm.metrics.columns) + assert('run_pval_nm' in nm.metrics.columns) + assert('run_mod_nm' in nm.metrics.columns) diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py b/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py new file mode 100644 index 0000000000..c5b6e52a63 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py @@ -0,0 +1,91 @@ +import pytest +import numpy as np +import pandas as pd + +from .conftest import MockSessionApi +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession +from allensdk.brain_observatory.ecephys.stimulus_analysis.natural_scenes import NaturalScenes, image_selectivity + + +class MockNSSessionApi(MockSessionApi): + def get_stimulus_presentations(self): + return pd.DataFrame({ + 'start_time': np.concatenate(([0.0], np.linspace(0.5, 29.50, 119, endpoint=True), [39.75])), + 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 39.75, 119, endpoint=True), [40.25])), + 'stimulus_name': ['spontaneous'] + ['natural_scenes']*119 + ['spontaneous'], + 'stimulus_block': [0] + [1]*119 + [0], + 'duration': [0.5] + [0.25]*119 + [0.5], + 'stimulus_index': [0] + [1]*119 + [0], + 'frame': np.concatenate(([np.nan], np.arange(-1.0, 118.0), [np.nan])) + }, index=pd.Index(name='id', data=np.arange(121))) + + def get_invalid_times(self): + return pd.DataFrame() + +@pytest.fixture +def ecephys_api(): + return MockNSSessionApi() + + +def test_load(ecephys_api): + session = EcephysSession(api=ecephys_api) + ns = NaturalScenes(ecephys_session=session) + assert(ns.name == 'Natural Scenes') + assert(set(ns.unit_ids) == set(range(6))) + assert(len(ns.conditionwise_statistics) == 119*6) + assert(ns.conditionwise_psth.shape == (119, 249, 6)) + assert(not ns.presentationwise_spike_times.empty) + assert(len(ns.presentationwise_statistics) == 119*6) + assert(len(ns.stimulus_conditions) == 119) + + +def test_stimulus(ecephys_api): + session = EcephysSession(api=ecephys_api) + ns = NaturalScenes(ecephys_session=session) + assert(isinstance(ns.stim_table, pd.DataFrame)) + assert(len(ns.stim_table) == 119) + assert(set(ns.stim_table.columns).issuperset({'frame', 'start_time', 'stop_time'})) + + assert(np.all(ns.images == np.arange(-1.0, 118))) + assert(ns.number_images == 119) + assert(ns.number_nonblank == 118) + + +def test_metrics(ecephys_api): + session = EcephysSession(api=ecephys_api) + ns = NaturalScenes(ecephys_session=session) + assert(isinstance(ns.metrics, pd.DataFrame)) + assert(len(ns.metrics) == 6) + assert(ns.metrics.index.names == ['unit_id']) + + assert('pref_image_ns' in ns.metrics.columns) + assert(np.all(ns.metrics['pref_image_ns'].loc[[0, 1, 3, 4]] == [2, 9, 2, 4])) + + assert('image_selectivity_ns' in ns.metrics.columns) + assert('firing_rate_ns' in ns.metrics.columns) + assert('fano_ns' in ns.metrics.columns) + assert('time_to_peak_ns' in ns.metrics.columns) + assert('lifetime_sparseness_ns' in ns.metrics.columns) + assert('run_pval_ns' in ns.metrics.columns) + assert('run_mod_ns' in ns.metrics.columns) + + +@pytest.mark.parametrize('responses,expected', + [ + (np.array([]), np.nan), # invalid input + (np.array([1.0]), np.nan), # selectivity of one image is undefined + (np.array([0.0]), np.nan), + (np.zeros(118), 0.0), # responds uniformly + (np.ones(118), 0.0), # responds uniformly + (np.array([0.0]*200 + [1.0]), 0.99004975), # reponse to 1 image ~ 1.0 + (np.array([5.5, 0.0, 15.0, 10.0, 2.3, 4.9]), 0.16166666666666674) + ]) +def test_image_selectivity(responses, expected): + img_sel = image_selectivity(responses) + assert(np.isclose(img_sel, expected, equal_nan=True)) + + +if __name__ == '__main__': + test_load() + # test_stimulus() + # test_metrics() diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py b/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py new file mode 100644 index 0000000000..b08d249c30 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py @@ -0,0 +1,187 @@ +import pytest +import pandas as pd +import numpy as np + +from .conftest import MockSessionApi +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession +from allensdk.brain_observatory.ecephys.stimulus_analysis.receptive_field_mapping import \ + ReceptiveFieldMapping, \ + fit_2d_gaussian, \ + threshold_rf + +class MockRFMSessionApi(MockSessionApi): + def get_stimulus_presentations(self): + features = np.array(np.meshgrid([30.0, -20.0, 40.0, 20.0, 0.0, -30.0, -40.0, 10.0, -10.0], # x_position + [10.0, -10.0, 30.0, 40.0, -40.0, -30.0, -20.0, 20.0, 0.0]) # y_position + ).reshape(2, 81) + + return pd.DataFrame({ + 'start_time': np.concatenate(([0.0], np.linspace(0.5, 20.50, 81, endpoint=True), [20.75])), + 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 20.75, 81, endpoint=True), [21.25])), + 'stimulus_name': ['spontaneous'] + ['gabors']*81 + ['spontaneous'], + 'stimulus_block': [0] + [1]*81 + [0], + 'duration': [0.5] + [0.25]*81 + [0.5], + 'stimulus_index': [0] + [1]*81 + [0], + 'x_position': np.concatenate(([np.nan], features[0, :], [np.nan])), + 'y_position': np.concatenate(([np.nan], features[1, :], [np.nan])) + }, index=pd.Index(name='id', data=np.arange(83))) + + +@pytest.fixture +def ecephys_api(): + return MockRFMSessionApi() + + +def test_load(ecephys_api): + session = EcephysSession(api=ecephys_api) + rfm = ReceptiveFieldMapping(ecephys_session=session) + assert(rfm.name == 'Receptive Field Mapping') + assert(set(rfm.unit_ids) == set(range(6))) + assert(len(rfm.conditionwise_statistics) == 81*6) + assert(rfm.conditionwise_psth.shape == (81, 249, 6)) + assert(not rfm.presentationwise_spike_times.empty) + assert(len(rfm.presentationwise_statistics) == 81*6) + assert(len(rfm.stimulus_conditions) == 81) + + +def test_stimulus(ecephys_api): + session = EcephysSession(api=ecephys_api) + rfm = ReceptiveFieldMapping(ecephys_session=session) + assert(isinstance(rfm.stim_table, pd.DataFrame)) + assert(len(rfm.stim_table) == 81) + assert(set(rfm.stim_table.columns).issuperset({'x_position', 'y_position', 'start_time', 'stop_time'})) + + assert(set(rfm.azimuths) == {30.0, -20.0, 40.0, 20.0, 0.0, -30.0, -40.0, 10.0, -10.0}) + assert(rfm.number_azimuths == 9) + + assert(set(rfm.elevations) == {10.0, -10.0, 30.0, 40.0, -40.0, -30.0, -20.0, 20.0, 0.0}) + assert(rfm.number_elevations == 9) + + +def test_metrics(ecephys_api): + session = EcephysSession(api=ecephys_api) + rfm = ReceptiveFieldMapping(ecephys_session=session, minimum_spike_count=1.0, trial_duration=0.25, + mask_threshold=0.5) + assert(isinstance(rfm.metrics, pd.DataFrame)) + assert(len(rfm.metrics) == 6) + assert(rfm.metrics.index.names == ['unit_id']) + + # TODO: Methods are too sensitive and will have different values depending on the version of scipy + assert('azimuth_rf' in rfm.metrics.columns) + assert('elevation_rf' in rfm.metrics.columns) + assert('width_rf' in rfm.metrics.columns) + assert('height_rf' in rfm.metrics.columns) + # Different versions of scipy will return unit 1 as either a 0.0 or a nan + #assert(np.allclose(rfm.metrics['height_rf'].loc[[0, 1, 2, 3, 4, 5]], + # [np.nan, 0.0, 129.522395, np.nan, np.nan, np.nan], equal_nan=True)) + + assert('area_rf' in rfm.metrics.columns) + assert(np.allclose(rfm.metrics['area_rf'].loc[[0, 1, 2, 3, 4, 5]], + [0.0, 0.0, 0.0, np.nan, 0.0, 0.0], equal_nan=True)) + + assert('p_value_rf' in rfm.metrics.columns) + assert('on_screen_rf' in rfm.metrics.columns) + assert('firing_rate_rf' in rfm.metrics.columns) + assert('fano_rf' in rfm.metrics.columns) + assert('time_to_peak_rf' in rfm.metrics.columns) + assert('lifetime_sparseness_rf' in rfm.metrics.columns) + assert('run_pval_rf' in rfm.metrics.columns) + assert('run_mod_rf' in rfm.metrics.columns) + + +def test_receptive_fields(ecephys_api): + # Also test_response_by_stimulus_position() + session = EcephysSession(api=ecephys_api) + rfm = ReceptiveFieldMapping(ecephys_session=session) + assert(rfm.receptive_fields) + assert(type(rfm.receptive_fields)) + assert('spike_counts' in rfm.receptive_fields) + assert(rfm.receptive_fields['spike_counts'].shape == (9, 9, 6)) # x, y, units + assert(set(rfm.receptive_fields['spike_counts'].coords) == {'y_position', 'x_position', 'unit_id'}) + assert(np.all(rfm.receptive_fields['spike_counts'].coords['x_position'] + == [-40.0, -30.0, -20.0, -10.0, 0.0, 10.0, 20.0, 30.0, 40.0])) + assert(np.all(rfm.receptive_fields['spike_counts'].coords['y_position'] + == [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0])) + + # Some randomly sampled testing to make sure everything works like it should + assert(rfm.receptive_fields['spike_counts'][{'unit_id': 0}].values.sum() == 4) + assert(rfm.receptive_fields['spike_counts'][{'unit_id': 3}].values.sum() == 0) + assert(rfm.receptive_fields['spike_counts'][{'unit_id': 2, 'x_position': 8, 'y_position': 3}] == 3) + assert(np.all(rfm.receptive_fields['spike_counts'][{'x_position': 2, 'y_position': 5}] == [1, 0, 0, 0, 1, 1])) + + + +## Some special receptive fields for testing + +# Data taken from real example +rf_field_real = np.array([[7440, 5704, 11408, 8184, 9920, 5952, 11904, 11904, 9672], + [8184, 12152, 10912, 12648, 15128, 19096, 17112, 14384, 11656], + [12152, 17856, 25048, 36208, 47368, 30256, 20336, 10912, 10168], + [15624, 31000, 53568, 92752, 119288, 69440, 31496, 16120, 10416], + [12152, 23560, 32984, 74896, 93496, 52328, 28024, 19592, 11656], + [9672, 7192, 10912, 16120, 16368, 18600, 14880, 6696, 11408], + [11656, 7688, 6696, 5456, 11408, 9672, 11160, 12152, 7936], + [6696, 6696, 9424, 8928, 6200, 11160, 7688, 6200, 9672], + [8928, 10912, 9176, 8432, 7688, 9424, 5704, 8184, 14384]], dtype=np.float64) + +# RF as a typical gaussian +x, y = np.meshgrid(np.linspace(-1, 1, 9), np.linspace(-1, 1, 9)) +rf_field_gaussian = np.exp(-((np.sqrt(x*x + y*y) - 0.0)**2 /(2.0*1.0**2))) + +# Only activity at one of the corners of the field +rf_field_edge = np.zeros((9, 9)) +rf_field_edge[8, 8] = 5.0 + + +@pytest.mark.parametrize('rf,threshold,expected_mask,expected_x,expected_y,expected_area', + [ + (np.zeros((9, 9)), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0), # No firing + (np.full((9, 9), 100.0), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0), # completely consistant firing, no center + (rf_field_real, 0.5, None, 3.5, 3.0, 2.0), # example from real data + (rf_field_gaussian, 0.5, None, 4.0, 4.0, 9.0), + (rf_field_edge, 0.05, None, 8.0, 8.0, 1.0) + ]) +def test_threshold_rf(rf, threshold, expected_mask, expected_x, expected_y, expected_area): + mask_rf, x, y, area = threshold_rf(rf, threshold) + assert(np.isclose(x, expected_x, equal_nan=True)) + assert(np.isclose(y, expected_y, equal_nan=True)) + assert(np.isclose(area, expected_area, equal_nan=True)) + if expected_mask is not None: + # TODO: Find a better way to check the resulting mask, it should match up with the center/area + assert(np.allclose(mask_rf, expected_mask, equal_nan=True)) + + +@pytest.mark.parametrize('matrix,expected', + [ + (rf_field_real, (np.array([1.04991433e+05, 3.74217858e+00, 3.24465965e+00, 1.66477569e+00, 1.04485211e+00]), True)), + (rf_field_gaussian, (np.array([1.0, 4.0, 4.0, 4.0, 4.0]), True)), + (np.zeros((9, 9)), ((np.nan, np.nan, np.nan, np.nan, np.nan), False)), + ## These edge cases are too sensitive and will produce different values depending on the + ## version of scipy is compiled against. + # (np.full((9, 9), 20.5), (np.array([20.5000000, 3.62601891, 3.55521927, 1.20266006e+05, 1.08161135e+05]), True)), + # (rf_field_edge, (np.array([5.0, 8.0, 8.0, 0.0, 0.0]), True)) + ]) +def test_fit_2d_gaussian(matrix, expected): + fit_params, success = fit_2d_gaussian(matrix) + assert(np.allclose(fit_params, expected[0], equal_nan=True)) + assert(success == expected[1]) + + +if __name__ == '__main__': + # test_load() + # test_stimulus() + test_metrics() + # test_receptive_fields() + + # test_threshold_rf(np.zeros((9, 9)), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0) # No firing + # test_threshold_rf(np.full((9, 9), 100.0), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0) # completely consistant firing, no center + # test_threshold_rf(rf_field_real, 0.5, None, 3.5, 3.0, 2.0) # example from real data + # test_threshold_rf(rf_field_gaussian, 0.5, None, 4.0, 4.0, 9.0) + # test_threshold_rf(rf_field_edge, 0.05, None, 8.0, 8.0, 1.0) + + # test_fit_2d_gaussian(rf_field_real, (np.array([1.04991433e+05, 3.74217858e+00, 3.24465965e+00, 1.66477569e+00, 1.04485211e+00]), True)) + # test_fit_2d_gaussian(rf_field_gaussian, (np.array([1.0, 4.0, 4.0, 4.0, 4.0]), True)) + # test_fit_2d_gaussian(np.zeros((9, 9)), ((np.nan, np.nan, np.nan, np.nan, np.nan), False)) + # test_fit_2d_gaussian(np.full((9, 9), 20.5), (np.array([20.5000000, 3.62601891, 3.55521927, 1.20266006e+05, 1.08161135e+05]), True)) + test_fit_2d_gaussian(rf_field_edge, (np.array([5.0, 8.0, 8.0, 0.0, 0.0]), True)) + pass diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py b/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py new file mode 100644 index 0000000000..e7eeb1a4bf --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py @@ -0,0 +1,134 @@ +import pytest +import pandas as pd +import numpy as np + +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession +from .conftest import MockSessionApi +from allensdk.brain_observatory.ecephys.stimulus_analysis.static_gratings import StaticGratings, get_sfdi, fit_sf_tuning + + +class MockSGSessionApi(MockSessionApi): + def get_stimulus_presentations(self): + features = np.array(np.meshgrid([0.02, 0.04, 0.08, 0.16, 0.32], # SF + [0.0, 30.0, 60.0, 90.0, 120.0, 150.0], # ORI + [0.0, 0.25, 0.50, 0.75])).reshape(3, 120) # Phase + + return pd.DataFrame({ + 'start_time': np.concatenate(([0.0], np.linspace(0.5, 30.25, 120, endpoint=True), [31.5])), + 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 30.50, 120, endpoint=True), [32.0])), + 'stimulus_name': ['spontaneous'] + ['static_gratings']*120 + ['spontaneous'], + 'stimulus_block': [0] + [1]*120 + [0], + 'duration': [0.5] + [0.25]*120 + [0.5], + 'stimulus_index': [0] + [1]*120 + [0], + 'spatial_frequency': np.concatenate(([np.nan], features[0, :], [np.nan])), + 'orientation': np.concatenate(([np.nan], features[1, :], [np.nan])), + 'phase': np.concatenate(([np.nan], features[2, :], [np.nan])) + }, index=pd.Index(name='id', data=np.arange(122))) + + +@pytest.fixture +def ecephys_api(): + return MockSGSessionApi() + + +def test_load(ecephys_api): + session = EcephysSession(api=ecephys_api) + sg = StaticGratings(ecephys_session=session) + assert(sg.name == 'Static Gratings') + assert(set(sg.unit_ids) == set(range(6))) + assert(len(sg.conditionwise_statistics) == 120*6) + assert(sg.conditionwise_psth.shape == (120, 249, 6)) + assert(not sg.presentationwise_spike_times.empty) + assert(len(sg.presentationwise_statistics) == 120*6) + assert(len(sg.stimulus_conditions) == 120) + + +def test_stimulus(ecephys_api): + session = EcephysSession(api=ecephys_api) + sg = StaticGratings(ecephys_session=session) + assert(isinstance(sg.stim_table, pd.DataFrame)) + assert(len(sg.stim_table) == 120) + assert(set(sg.stim_table.columns).issuperset({'spatial_frequency', 'orientation', 'phase', 'start_time', 'stop_time'})) + + assert(set(sg.sfvals) == {0.02, 0.04, 0.08, 0.16, 0.32}) + assert(sg.number_sf == 5) + + assert(set(sg.orivals) == {0.0, 30.0, 60.0, 90.0, 120.0, 150.0}) + assert(sg.number_ori == 6) + + assert(set(sg.phasevals) == {0.0, 0.25, 0.50, 0.75}) + assert(sg.number_phase == 4) + + +def test_bad_stimulus_key(ecephys_api): + with pytest.raises(Exception): + session = EcephysSession(api=ecephys_api) + sg = StaticGratings(ecephys_session=session, stimulus_key='gratings static') + sg.stim_table + + +def test_bad_col_key(ecephys_api): + with pytest.raises(KeyError): + session = EcephysSession(api=ecephys_api) + sg = StaticGratings(ecephys_session=session, col_sf='spatial_frequency', col_phase='esahp') + sg.phasevals + + +def test_metrics(ecephys_api): + session = EcephysSession(api=ecephys_api) + sg = StaticGratings(ecephys_session=session) + assert(isinstance(sg.metrics, pd.DataFrame)) + assert(len(sg.metrics) == 6) + assert(sg.metrics.index.names == ['unit_id']) + + assert('pref_sf_sg' in sg.metrics.columns) + assert(np.all(sg.metrics['pref_sf_sg'].loc[[0, 2, 4]] == [0.02, 0.02, 0.04])) + + assert('pref_ori_sg' in sg.metrics.columns) + assert(np.all(sg.metrics['pref_ori_sg'].loc[[0, 2, 4]] == [0.0, 0.0, 0.0])) + + assert('pref_phase_sg' in sg.metrics.columns) + assert(np.all(sg.metrics['pref_phase_sg'].loc[[0, 1, 2, 3]] == [0.25, 0.75, 0.5, 0.0])) + + assert('g_osi_sg' in sg.metrics.columns) + assert('time_to_peak_sg' in sg.metrics.columns) + assert('firing_rate_sg' in sg.metrics.columns) + assert('fano_sg' in sg.metrics.columns) + assert('lifetime_sparseness_sg' in sg.metrics.columns) + assert('run_pval_sg' in sg.metrics.columns) + assert('run_mod_sg' in sg.metrics.columns) + + +@pytest.mark.parametrize('sf_tuning_responses,mean_sweeps_trials,expected', + [ + (np.array([18.08333, 19.8333, 28.333, 14.80, 9.6170]), + np.array([12.0, 4.0, 8.0, 32.0, 4.0, 0.0, 4.0, 8.0, 24.0, 40.0, 32.0, 8.0, 20.0, 28.0, + 24.0, 28.0, 0.0, 4.0, 4.0, 24.0, 16.0, 8.0, 16.0, 4.0, 0.0, 4.0, 24.0, 4.0, + 12.0, 20.0, 0.0, 12.0, 0.0, 16.0]), 0.4402349784724991) + ]) +def test_get_sfdi(sf_tuning_responses, mean_sweeps_trials, expected): + assert(get_sfdi(sf_tuning_responses, mean_sweeps_trials, len(sf_tuning_responses)) == expected) + + +@pytest.mark.parametrize('sf_tuning_response,sf_vals,pref_sf_index,expected', + [ + (np.array([2.69565217, 3.91836735, 2.36734694, 1.52, 2.21276596]), + [0.02, 0.04, 0.08, 0.16, 0.32], 1, (0.22704947240176027, 0.0234087755414, np.nan, np.nan) + ), + (np.array([1.14285714, 0.73469388, 7.44, 13.6, 11.6]), [0.02, 0.04, 0.08, 0.16, 0.32], 3, + (3.290141840632274, 0.1956416782774323, 0.08, np.nan)), + (np.array([2.24, 1.83333333, 1.68, 1.87755102, 1.87755102]), + [0.02, 0.04, 0.08, 0.16, 0.32], 0, (0.0, 0.019999999552965164, np.nan, 0.32)) + ]) +def test_fit_sf_tuning(sf_tuning_response, sf_vals, pref_sf_index, expected): + assert(np.allclose(fit_sf_tuning(sf_tuning_response, sf_vals, pref_sf_index), expected, equal_nan=True)) + + +if __name__ == '__main__': + # test_stimulus() + # test_load() + # test_bad_stimulus_key() + # test_bad_col_key() + test_metrics() + pass + diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py b/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py new file mode 100644 index 0000000000..4e59e62c4b --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py @@ -0,0 +1,380 @@ +import pytest +import pandas as pd +import numpy as np +import xarray as xr +import warnings + +from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession +from allensdk.brain_observatory.ecephys.stimulus_analysis.stimulus_analysis import StimulusAnalysis, \ + running_modulation, lifetime_sparseness, fano_factor, overall_firing_rate, get_fr, osi, dsi + + +pd.set_option('display.max_columns', None) + + +class MockSessionApi(EcephysSessionApi): + """Mock Data to create an EcephysSession object and pass it into stimulus analysis + + # TODO: move to conftest so other tests can use data + """ + def get_spike_times(self): + return { + 0: np.array([1, 2, 3, 4]), + 1: np.array([2.5]), + 2: np.array([1.01, 1.03, 1.02]), + 3: np.array([]), + 4: np.array([0.01, 1.7, 2.13, 3.19, 4.25]), + 5: np.array([1.5, 3.0, 4.5]) + } + + def get_channels(self): + return pd.DataFrame({ + 'local_index': [0, 1, 2], + 'probe_horizontal_position': [5, 10, 15], + 'probe_id': [0, 0, 1], + 'probe_vertical_position': [10, 22, 33], + 'valid_data': [False, True, True] + }, index=pd.Index(name='channel_id', data=[0, 1, 2])) + + def get_units(self): + udf = pd.DataFrame({ + 'firing_rate': np.linspace(1, 3, 6), + 'isi_violations': [40, 0.5, 0.1, 0.2, 0.0, 0.1], + 'local_index': [0, 0, 1, 1, 2, 2], + 'peak_channel_id': [0, 2, 1, 1, 2, 0], + 'quality': ['good', 'good', 'good', 'bad', 'good', 'good'], + }, index=pd.Index(name='unit_id', data=np.arange(6)[::-1])) + return udf + + def get_probes(self): + return pd.DataFrame({ + 'description': ['probeA', 'probeB'], + 'location': ['VISp', 'VISam'], + 'sampling_rate': [30000.0, 30000.0] + }, index=pd.Index(name='id', data=[0, 1])) + + def get_stimulus_presentations(self): + return pd.DataFrame({ + 'start_time': np.linspace(0.0, 4.5, 10, endpoint=True), + 'stop_time': np.linspace(0.5, 5.0, 10, endpoint=True), + 'stimulus_name': ['spontaneous'] + ['s0'] * 6 + ['spontaneous'] + ['s1'] * 2, + 'stimulus_block': [0] + [1] * 6 + [0] + [2] * 2, + 'duration': 0.5, + 'stimulus_index': [0] + [1] * 6 + [0] + [2] * 2, + 'conditions': [0, 0, 0, 0, 1, 1, 1, 0, 2, 3] # generic stimulus condition + }, index=pd.Index(name='id', data=np.arange(10))) + + def get_invalid_times(self): + return pd.DataFrame() + + def get_running_speed(self): + return pd.DataFrame({ + "start_time": np.linspace(0.0, 9.9, 100), + "end_time": np.linspace(0.1, 10.0, 100), + "velocity": np.linspace(-0.1, 11.0, 100) + }) + + +@pytest.fixture +def ecephys_api(): + return MockSessionApi() + + +def test_unit_ids(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session) + assert(set(stim_analysis.unit_ids) == set(range(6))) + assert(stim_analysis.unit_count == 6) + + +def test_unit_ids_filter_by_id(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, filter=[2, 3, 1]) + assert(set(stim_analysis.unit_ids) == {1, 2, 3}) + assert(stim_analysis.unit_count == 3) + + stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'unit_id': [3, 0]}) + assert(set(stim_analysis.unit_ids) == {0, 3}) + assert(stim_analysis.unit_count == 2) + + with pytest.raises(KeyError): + # If unit ids don't exists should raise an error + stim_analysis = StimulusAnalysis(ecephys_session=session, filter=[100, 200]) + units = stim_analysis.unit_ids + + +def test_unit_ids_filtered(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'location': 'VISp'}) + assert(set(stim_analysis.unit_ids) == {0, 2, 3, 5}) + assert(stim_analysis.unit_count == 4) + + stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'location': 'VISp', 'quality': 'good'}) + assert(set(stim_analysis.unit_ids) == {0, 3, 5}) + assert(stim_analysis.unit_count == 3) + + with pytest.raises(Exception): + # No units found should raise exception + stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'location': 'pSIV'}) + stim_analysis.unit_ids + stim_analysis.unit_count + + +def test_stim_table(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') + assert(isinstance(stim_analysis.stim_table, pd.DataFrame)) + assert(len(stim_analysis.stim_table) == 6) + assert(stim_analysis.total_presentations == 6) + + # Make sure certain columns exist + assert('start_time' in stim_analysis.stim_table) + assert('stop_time' in stim_analysis.stim_table) + assert('stimulus_condition_id' in stim_analysis.stim_table) + assert('stimulus_name' in stim_analysis.stim_table) + assert('duration' in stim_analysis.stim_table) + + with pytest.raises(Exception): + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='0s') + stim_analysis.stim_table + + +def test_stim_table_spontaneous(ecephys_api): + # By default table should be empty because non of the stimulus are above the duration threshold + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, spontaneous_threshold=0.49) + assert(isinstance(stim_analysis.stim_table_spontaneous, pd.DataFrame)) + assert(len(stim_analysis.stim_table_spontaneous) == 2) + + # Check that threshold is working + stim_analysis = StimulusAnalysis(ecephys_session=session, spontaneous_threshold=0.51) + assert(len(stim_analysis.stim_table_spontaneous) == 0) + + +def test_conditionwise_psth(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5, + psth_resolution=0.1) + assert(isinstance(stim_analysis.conditionwise_psth, xr.DataArray)) + # assert(stim_analysis.conditionwise_psth.shape == (2, 4, 6)) + assert(stim_analysis.conditionwise_psth.coords['time_relative_to_stimulus_onset'].size == 4) # 0.5/0.1 - 1 + assert(stim_analysis.conditionwise_psth.coords['unit_id'].size == 6) + assert(stim_analysis.conditionwise_psth.coords['stimulus_condition_id'].size == 2) + assert(np.allclose(stim_analysis.conditionwise_psth[{'unit_id': 0, 'stimulus_condition_id': 1}].values, + np.array([1.0/3.0, 0.0, 0.0, 0.0]))) + + # Make sure psth doesn't fail even when all the condition_ids are unique. + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s1', trial_duration=0.5, + psth_resolution=0.1) + assert(stim_analysis.conditionwise_psth.coords['time_relative_to_stimulus_onset'].size == 4) + assert(stim_analysis.conditionwise_psth.coords['unit_id'].size == 6) + assert(stim_analysis.conditionwise_psth.coords['stimulus_condition_id'].size == 2) + + +def test_conditionwise_statistics(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') + assert(len(stim_analysis.conditionwise_statistics) == 2*6) # units x condition_ids + assert(set(stim_analysis.conditionwise_statistics.index.names) == {'unit_id', 'stimulus_condition_id'}) + assert(set(stim_analysis.conditionwise_statistics.columns) == + {'spike_std', 'spike_sem', 'spike_count', 'stimulus_presentation_count', 'spike_mean'}) + + expected = pd.Series( + [2.0, 3.0, 0.66666667, 0.57735027, 0.33333333], + ["spike_count", "stimulus_presentation_count", "spike_mean", "spike_std", "spike_sem"] + ) + obtained = stim_analysis.conditionwise_statistics.loc[(0, 1)] + pd.testing.assert_series_equal(expected, obtained[expected.index], check_less_precise=5, check_names=False) + + +def test_presentationwise_spike_times(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') + assert(len(stim_analysis.presentationwise_spike_times) == 12) + assert(list(stim_analysis.presentationwise_spike_times.index.names) == ['spike_time']) + assert(set(stim_analysis.presentationwise_spike_times.columns) == {'stimulus_presentation_id', 'unit_id', 'time_since_stimulus_presentation_onset'}) + assert(stim_analysis.presentationwise_spike_times.loc[1.01]['unit_id'] == 2) + assert(stim_analysis.presentationwise_spike_times.loc[1.01]['stimulus_presentation_id'] == 2) + assert(len(stim_analysis.presentationwise_spike_times.loc[3.0]) == 2) + + +def test_presentationwise_statistics(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5) + assert(len(stim_analysis.presentationwise_statistics) == 6*6) # units x presentation_ids + assert(set(stim_analysis.presentationwise_statistics.index.names) == {'stimulus_presentation_id', 'unit_id'}) + assert(set(stim_analysis.presentationwise_statistics.columns) == {'spike_counts', 'stimulus_condition_id', + 'running_speed'}) + assert(stim_analysis.presentationwise_statistics.loc[1, 0]['spike_counts'] == 1.0) + assert(stim_analysis.presentationwise_statistics.loc[1, 0]['stimulus_condition_id'] == 1.0) + assert(np.isclose(stim_analysis.presentationwise_statistics.loc[1, 0]['running_speed'], 0.684848)) + + +def test_stimulus_conditions(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5) + assert(len(stim_analysis.stimulus_conditions) == 2) + assert(np.all(stim_analysis.stimulus_conditions['stimulus_name'].unique() == ['s0'])) + assert(set(stim_analysis.stimulus_conditions['conditions'].unique()) == {0, 1}) + + +def test_running_speed(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') + assert(set(stim_analysis.running_speed.index.values) == set(range(1, 7))) + assert(np.isclose(stim_analysis.running_speed.loc[1]['running_speed'], 0.684848)) + assert(np.isclose(stim_analysis.running_speed.loc[3]['running_speed'], 1.806061)) + assert(np.isclose(stim_analysis.running_speed.loc[6]['running_speed'], 3.487879)) + + +def test_spikes(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') + assert(isinstance(stim_analysis.spikes, dict)) + assert(stim_analysis.spikes.keys() == set(range(6))) + assert(np.allclose(stim_analysis.spikes[0], [1, 2, 3, 4])) + assert(np.allclose(stim_analysis.spikes[4], [0.01, 1.7 , 2.13, 3.19, 4.25])) + assert(stim_analysis.spikes[3].size == 0) + + # Check that spikes dict is filtering units + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', filter=[0, 2]) + assert(stim_analysis.spikes.keys() == {0, 2}) + + +def test_get_preferred_condition(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') + assert(stim_analysis._get_preferred_condition(3) == 1) + + with pytest.raises(KeyError): + stim_analysis._get_preferred_condition(10) + +def test_check_multiple_preferred_conditions(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') + + assert(stim_analysis._check_multiple_pref_conditions(0, 'conditions', [0, 1]) is False) + assert(stim_analysis._check_multiple_pref_conditions(3, 'conditions', [0, 1]) is True) + + +def test_get_time_to_peak(ecephys_api): + session = EcephysSession(api=ecephys_api) + stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5) + assert(stim_analysis._get_time_to_peak(1, stim_analysis._get_preferred_condition(1)) == 0.0005) + + +@pytest.mark.parametrize('spike_counts,running_speeds,speed_threshold,expected', + [ + (np.zeros(10), np.zeros(1),1.0, (np.nan, np.nan)), # Input error, return nan + (np.zeros(5), np.full(5, 2.0), 1.0, (np.nan, np.nan)), # returns Nan, always running + (np.zeros(5), np.full(5, 2.0), 2.1, (np.nan, np.nan)), # returns Nan, always stationary + (np.zeros(5), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (np.nan, np.nan)), # No firing, return Nans + (np.ones(5), np.array([0.0, 0.0, 2.0, 2.0, 2.0]), 1.0, (np.nan, 0.0)), # always the same fr, pval is Nan but run_mod is 0.0) + (np.array([3.0, 3.0, 1.5, 1.5, 0.9]), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (0.013559949584378913, -0.5666666666666667)), + (np.array([3.0, 3.0, 1.5, 1.5, 1.5]), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (0.0, -0.5)), + (np.array([3.0, 3.0, 1.5, 5.5, 2.5]), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (0.9024099927051468, 0.052631578947368376)), + (np.array([0.0, 0.0, 4.0, 4.0]), np.array([0.0, 0.0, 2.5, 3.0]), 1.0, (0.0, 1.0)) + ]) +def test_running_modulation(spike_counts, running_speeds, speed_threshold, expected): + rm = running_modulation(spike_counts, running_speeds, speed_threshold) + assert(np.allclose(rm, expected, equal_nan=True)) + + +@pytest.mark.parametrize('responses,expected', + [ + (np.array([1.0]), np.nan), # can't calculate for single point + (np.full(20, 3.2), 0.0), # always the same, sparness should be at/near 0 + (np.array([10.0, 0.0, 0.0, 0.0, 0.0, 0.0]), 1.0), # spareness should be close to 1 + (np.array([2.24, 3.6, 0.8, 2.4, 3.52, 5.68, 8.96, 0.0]), 0.43500091849856115) + ]) +def test_lifetime_sparseness(responses, expected): + lts = lifetime_sparseness(responses) + assert(np.isclose(lts, expected, equal_nan=True)) + + +@pytest.mark.parametrize('spike_counts,expected', + [ + (np.zeros(10), np.nan), # mean 0.0 leads to Nan + (np.array([-1.5, 1.5]), np.nan), # mean 0 + (np.ones(5), 0.0), # no variance + (np.array([1.2, 20.0, 0.0, 36.2, 0.6]), 17.921379310344832), # High variance + (np.array([5.1, 5.3, 5.2, 5.1, 5.2]), 0.0010810810810810846), # low variance + ]) +def test_fano_factor(spike_counts, expected): + ff = fano_factor(spike_counts) + assert(np.isclose(ff, expected, equal_nan=True)) + + +@pytest.mark.parametrize('start_times,stop_times,spike_times,expected', + [ + (np.array([0.0]), np.array([0.0]), np.linspace(0, 10.0, 10), np.nan), # nan, total time 0.0 + (np.arange(1.0, 3.0), np.arange(0.0, 2.0), np.linspace(0, 10.0, 10), np.nan), # nan, total_time negative + (np.arange(1.0, 4.0), np.arange(0.0, 2.0), np.linspace(0, 10.0, 10), np.nan), # nan, time lengths don't match + (np.array([0.0]), np.array([1.0]), np.linspace(0, 10.0, 100), 10.0), + (np.array([0.0, 9.0]), np.array([1.0, 10.0]), np.linspace(0, 10.0, 101), 10.0) # 10.0 Hz split up into blocks + ]) +def test_overall_firing_rate(start_times, stop_times, spike_times, expected): + ofr = overall_firing_rate(start_times, stop_times, spike_times) + assert(np.isclose(ofr, expected, equal_nan=True)) + + +@pytest.mark.parametrize('spikes,sampling_freq,sweep_length,expected', + [ + (np.array([0.82764702, 0.83624702, 1.09211374]), 10, 1.5, [0.0, 0.0, 0.0, 0.0, 0.000133830, 0.004431861, 0.05412495, 0.2464033072, 0.45293459677, 0.4839428913, + 0.452934596, 0.2464033072, 0.054124958, 0.00443186162, 0.0001338306]), + (np.array([]), 10, 1.5, np.zeros(15)) + ]) +def test_get_fr(spikes, sampling_freq, sweep_length, expected): + frs = get_fr(spikes, num_timestep_second=sampling_freq, sweep_length=sweep_length) + assert(len(frs) == int(sampling_freq*sweep_length)) + assert(np.allclose(frs, expected)) + + +@pytest.mark.parametrize('orivals,tuning,expected', + [ + (np.array([1.0]), np.array([0.0, 30.0, 60.0, 90.0, 120.0, 150.0]), np.nan), + (np.array([]), np.array([]), np.nan), + (np.array([0.0+0.0j, 0.52359878 + 0.j, 1.04719755 + 0.j, 1.57079633+0.j, 2.0943951+0.j, 2.61799388+0.j]), np.array([5.5, 4.44, 3.54166667, 4.10869565, 4.42, 4.55319149]), 0.07873455094232604) + ]) +def test_osi(orivals, tuning, expected): + osi_val = osi(orivals, tuning) + assert(np.allclose(osi_val, expected, equal_nan=True)) + + +@pytest.mark.parametrize('orivals,tuning,expected', + [ + (np.array([1.0]), np.array([0.0, 30.0, 60.0, 90.0, 120.0, 150.0]), np.nan), + (np.array([]), np.array([]), np.nan), + (np.array([0.0+0.0j, 0.52359878 + 0.j, 1.04719755 + 0.j, 1.57079633+0.j, 2.0943951+0.j, 2.61799388+0.j]), np.array([5.5, 4.44, 3.54166667, 4.10869565, 4.42, 4.55319149]), 0.6126966469601506) + ]) +def test_dsi(orivals, tuning, expected): + dsi_val = dsi(orivals, tuning) + assert(np.allclose(dsi_val, expected, equal_nan=True)) + + +if __name__ == '__main__': + # test_unit_ids() + # test_unit_ids_filter_by_id() + # test_unit_ids_filtered() + # test_stim_table() + # test_stim_table_spontaneous() + # test_conditionwise_psth() + # test_conditionwise_statistics() + # test_presentationwise_spike_times() + # test_presentationwise_statistics() + # test_stimulus_conditions() + # test_running_speed() + # test_spikes() + # test_get_preferred_condition() + # test_get_time_to_peak() + # test_running_modulation(spike_counts=np.zeros(10), running_speeds=np.zeros(1), speed_threshold=1.0, + # expected=(np.nan, np.nan)) + # test_lifetime_sparseness(np.array([1.0]), 1.0) + # test_fano_factor([-1.5, 1.5], np.nan) # mean 0.0 leads to Nan + # test_overall_firing_rate(np.array([0.0]), np.array([0.0]), np.linspace(0, 10.0, 10)) + # test_osi(np.array([1.0]), np.array([0.0, 30.0, 60.0, 90.0, 120.0, 150.0]), np.nan) + test_osi(np.array([0.0+0.0j, 0.52359878 + 0.j, 1.04719755 + 0.j, 1.57079633+0.j, 2.0943951+0.j, 2.61799388+0.j]), + np.array([5.5, 4.44, 3.54166667, 4.10869565, 4.42, 4.55319149]), 0.07873455094232604) + pass \ No newline at end of file diff --git a/test/brain_observatory/ecephys/stimulus_table/__init__.py b/test/brain_observatory/ecephys/stimulus_table/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b00cd213c6b69df8a36f53a1e2f24d40fd2f6e1 GIT binary patch literal 222 zcmYL@zX}2|48|)sh~R@bXa_eD@y{wQ;#Mf>HE6lo9+#eSqmvKf<SV)Q2yRZMgZRPs zO9=TwR)axbu)_TcxxO-f>Tt7QQ<q`IP7FKShp6-TkI!vAReQpk6db{h4O}3!Y8jx2 z!NNpgIFpJM1}d1bI<}-X&M0yTM->z$9FVi#^M);DLQ2xq;DU~Z&z>R0x|LX9PD)Dd f)cA&U0^?C??Se~MkE{0Co1LO<JkIljZ?^aXcE>`l literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_ephys_pre_spikes.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_ephys_pre_spikes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dcdc13769ffad0e2bae6e0852c74882d3377be8 GIT binary patch literal 5679 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 X=rhbw?u!!-Nwyqh;ofgNvzz}vr1d*J literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_naming_utilities.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_naming_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77d45d52b0ea30e4a7187132885432edf052d036 GIT binary patch literal 2876 zcmb_dOK;mo5a#YuvMkH8tk|(*yNR9jrJ%J@w7nEX5hq1}0)Y>0dLaZ5EA5)5O_A&_ z<yMAsDB4qj+<G($2R-#K@!C`VLJvh}mZU67PJ=#3>~d#!W_ISA2Olmj)-8C#U%%&n zu3FabNEFW^EFQqnHnS{Y2@+UN_9YHAG;?hD(x5V^I&;L5)^Y7}UNA{7>%tZlQ5AC@ z^T`V`u~W--JbJa~(K1g)k2&T=eM%4REEIY?_JWFrSp3oYfjA3OHq=G4q`fMZ3hf>N zxt3Tqa*bTBom+K7tYmy*RooP77lpMz<?@A>z$xwH#mpMRy)JHD6sIV?o?FU13O8<u zO><+jWa*Z8L)`WlYAS}u#GMP8W4A4G4n!(PCf^YR-+#otQ{tY~Gd}UC!S$}VXRKYC zwl?z_XSf|K7jM4K))|Sn#u9H|@7;vNj=AGX0&Kqi^a`8lbEI(?P48T=9NFA^b24!Y z_-{kB-W46=e@l?Btj_(HSQ`f&lD0xV@I%iXCVt>2zSL*Ug!cmZp8PJB{X`09Q78Uj z7!0)wtkSs?@?@xZ;0~fwU%H3UP{C43SIJoNL_6(S2IppZPah2r4+GG>S>89w#)n(w z!;i|>EKQv{>r)$Up{P&MS$LrOtqP1sF!VM|iFHZNtrz4OP3SQ@w$I5qg)E@Y8G-%) zII)ALfKk1FB>N|B;Gf7&C8goe+2TUD;c(EC%1xs2O&KOBjYT?_NWd-h(l*yxs>D51 zfSxPA8S<dR(ux5&traMzwWybHKa}D(OD%wDfBgLDlkV3bsk{7$i`^domWQM6e#rY# zDENn68J_BH6w6TeVUFUXk?ub6dtL1(^8J|iPq-&RHVA-2oa~`Fdp!kLxKR((p7JD8 zqdnP|D7iO|v9Zf=W4KG1u^W%l9n|Cgo%b~a*M`Y@P$vpouQL_MkIR9aPALCWmKgqP z_!Ne{Q&DJ>b4w>2;8Vgs!&@+evoLCfnW3sU&7lBO=!u%g34bjnD%sQkGQDk(c%`~0 zz>~pn17K(Zb+(oj7FLlv;PJS^&YA~VNo{{Iz@Vke5aL8}09r{MN1>KZvq)~;m!Z_o zhEV<?=9lX!j$iE-LLEA-P%Xjr&H}0e?`1U99d<3xK_9Wg2f-Sb%3UC`QaOiT%`=u4 z3q5DE#Zp4M4Q{&Q)I!H+V73j+POU)Y)qt-Vz-Kk~!MY6TdkvymK)ob5Vb#Ahv8O5F zDe0*d+(FO&*OY1t6~(R`#K{O^5DW+5jFYd+rOdTiJwJi1nQLuGqBWp8)OeAS{SHl8 zkE@hD<VxMbBW6Bo1J(|Exc_CzOHAxXF!WV0XZxOD&+WYP*#}P_!)1t{vyk;ak&I$! zfLS56z}0}qTK-#~S4}u4wfKPCC7Ot~T3dBeC2A8^on@yQkB}X{SiKp(P6a9#S`rOo z=Yyip?as8g-Mq!^j`Przp~CbquB7&Ws}pA-=GdVV1)af}|C}fMG18`knfgsx$U~D~ zCKAT9iKc)}Tba&K`*aYAVIV)lG}OPqR3q@x2CEXvY)T2fHM>~VtJ$j9Dd<U_^@fop u4Vv+0bPIG<sZE-;O<D}K0+s8}IJU_O+c4w)JZiWN>uhX;C3R9KZT1&V1lN%O literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_parameter_extraction.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_parameter_extraction.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40540beeb2ea7ef180f6da102c522c0e5e5f3434 GIT binary patch literal 1924 zcma)6&2Jk;6rY*($J&XLLIbo2P!LGXR>A4VB|<o*w3GvtrIH}3#l;$XCXUH^cl&1C z#K<|&^v)U7LnBW7OMB(iThE+$Z~R$PwajYX%<R5>Gw=6)zxk?CDKl*GpTEi%dB*;x z#iV&S`4YR?L!+4D5esP)5$}o6<4m)kbIMb>C+w7mdAG`|f?E|-QTb0;SX3od#?e<x zY8l6ps;Ctl%Zl%^VD&jhX7zw)9~#^3^`pLNrV?aNTMbQpY(chdH;LQiHfbCux3HTW z8W%>?e>wUFr0vF?T@14!`!=}^@~C!4Mn-S0)B0}GsqH}@SM4N9pe6z2VB^QD)y?%$ ze-Mm6?WVG=YnPzYx<qecJcO~eE7k4Ib){2#P`k3Z9^(;f`$-b~#eiU%nSai1ect%q zXfO?VAXT*`k7PV(+>9lLQu2C3$B#@SNp)=6Xp{6{U>bM3t%m7Z{TXh3C_5VejUx0= zhg((~yVU~Ojhjge!#<KWfx(t;Yx;9*3Y(R!NIUQ5^xdnVtfqskL>^7hDfon=K*I!J z`PrL+zWgSj9q@#7Fau?7Mn%gis-L=Jx<gd()#MNbIs{di8Xc^J-BtTjoLKgZTXDvJ zJI9&zp5=z@jGyoykd*h>ckDinNGe_r@>wAr5OQGwku%z4{<nJYH9!KHXHuPgGUiqj zi(>4EbEdfuNpE(nKmeU4^OKfE__bQh;yUdxVd?84H8I_&+m`76Hb!*BWqg^#GOniC z5;9Z|m+enDQCta>7d{;nnL=risGb&2IN{)O7gh}UDPl4dr~FWuZR<Ve$Lm9Jn?1O2 z;tl!GyU2!uEPmaguMc+!FT|--zq8lDZLqz#k$K4X&L6*1dwv6`0-;9)FNXd^PGNB@ zq%7|=l$G7!^pg1#rDS=hk}O9W335OM1iEB04=J6k+%(8y616J_IuP$NUmvHsZ4u-p z=X$6Ii*RrJU%21H2<BZh%oAL2AG;g9vRLC~4)lGBI;oesL;WM1C}h+OUqnzKa_?L5 zm^;)&JzScTK;XFq!w)8ea?)x?(v0auDuXqQi=LDzyhDbPT+Hv|m-2g6oXhx^Ax<)p z<7ELCa5hbZ=tCR0MDF7R>4Ohahe(9<d77I~Y=Jn}UP~NDtB2cT;uPvr+5l<yW!hjx zSMVjQk~v4_Ei_{ygsXTb89fsjoF@;5&xi?g_)rNKL0WSlEd;rSj)t~kVpME@QtFHN zE?9yh4&l|wom&0Rby^)?r`74z>8?|t3usi|;(qto_Cb$oNHuWcbzE|F0NQHqw8SZJ dm!1DbFH!wS?~terVdIPC{0csP-aqgA{{l<1<b41D literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_table_module.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_table_module.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16044aa7249800e5189bccf1b02620671f0daa80 GIT binary patch literal 5578 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 literal 0 HcmV?d00001 diff --git a/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py b/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py new file mode 100644 index 0000000000..f0d2dd4376 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py @@ -0,0 +1,270 @@ +import pytest +import pandas as pd +import numpy as np + +import allensdk.brain_observatory.ecephys.stimulus_table.ephys_pre_spikes as ephys_pre_spikes + + +def stimulus_psuedofixture_0(): + return { + "display_sequence": [[500, 1000]], + "sweep_frames": [[10, 20], [20, 25]], + "sweep_order": [1, 0], + "dimnames": ["a", "b", "c"], + "sweep_table": [[1, 2, 3], [-3, -2, -1]], + "stim_path": r"C:\\ecephys_stimulus_scripts\\gabor_20_deg_250ms.stim", + } + + +def stimulus_psuedofixture_1(): + return { + "display_sequence": [[500, 1000]], + "sweep_frames": [[10, 20], [20, 25]], + "sweep_order": [1, 0], + "dimnames": [], + "sweep_table": [], + "stim_path": r"C:\\ecephys_stimulus_scripts\\gabor_20_deg_250ms.stim", + } + + +def test_assign_sweep_values(): + + stim_table = pd.DataFrame( + [ + { + "Start": 0, + "End": 1, + "orientation": np.nan, + "color": np.nan, + "sweep_number": 2, + }, + { + "Start": 1, + "End": 2, + "orientation": np.nan, + "color": np.nan, + "sweep_number": 0, + }, + { + "Start": 2, + "End": 3, + "orientation": np.nan, + "color": np.nan, + "sweep_number": 1, + }, + { + "Start": 3, + "End": 4, + "orientation": np.nan, + "color": np.nan, + "sweep_number": 3, + }, + ] + ) + + sweep_table = pd.DataFrame( + [ + {"orientation": 0, "color": "red", "sweep_number": 0}, + {"orientation": 45, "color": "blue", "sweep_number": 1}, + {"orientation": 90, "color": "green", "sweep_number": 2}, + ] + ) + + expected = pd.DataFrame( + [ + {"Start": 0, "End": 1, "orientation": 90, "color": "green"}, + {"Start": 1, "End": 2, "orientation": 0, "color": "red"}, + {"Start": 2, "End": 3, "orientation": 45, "color": "blue"}, + {"Start": 3, "End": 4, "orientation": np.nan, "color": np.nan}, + ] + ) + + obtained = ephys_pre_spikes.assign_sweep_values(stim_table, sweep_table) + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_column_type=False, check_dtype=False) + + +@pytest.mark.parametrize( + "table,column,new_columns,drop,expected", + [ + [ + pd.DataFrame({"Pos": [[0, 1], [1, 2]], "count": [12, 42]}), + "Pos", + {"Pos_x": lambda field: field[0], "Pos_y": lambda field: field[1]}, + True, + pd.DataFrame({"Pos_x": [0, 1], "Pos_y": [1, 2], "count": [12, 42]}), + ], + [ + pd.DataFrame({"dog": [1, 2, 3]}), + "cat", + {}, + False, + pd.DataFrame({"dog": [1, 2, 3]}), + ], + ], +) +def test_split_column(table, column, new_columns, drop, expected): + + obtained = ephys_pre_spikes.split_column(table, column, new_columns, drop) + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_column_type=False, check_dtype=False) + + +@pytest.mark.parametrize( + "sweeps,disp_seq,expected", + [ + [ + {"Start": [0, 1, 2, 3], "End": [1, 2, 3, 4]}, + [[2, 5]], + {"Start": [2, 3, 4], "End": [3, 4, 5], "stimulus_block": [0, 0, 0]}, + ], + [ + {"Start": [1, 3, 15, 18], "End": [3, 4, 18, 20]}, + [[2, 4], [16, 36]], + { + "Start": [3, 17, 29, 32], + "End": [5, 18, 32, 34], + "stimulus_block": [0, 1, 1, 1], + }, + ], + ], +) +def test_apply_display_sequence(sweeps, disp_seq, expected): + + table = pd.DataFrame(sweeps) + disp_seq = np.array(disp_seq) + obt_table = ephys_pre_spikes.apply_display_sequence(table, disp_seq) + + expected_table = pd.DataFrame(expected) + pd.testing.assert_frame_equal( + obt_table, expected_table, check_like=True, check_column_type=False, check_dtype=False + ) + + +@pytest.mark.parametrize( + "stimulus_tables,expected", + [ + [ + [ + pd.DataFrame({"Start": [0, 1], "End": [1, 2]}), + pd.DataFrame({"Start": [5], "End": [7]}), + ], + [pd.DataFrame({"Start": [2], "End": [5]})], + ], + [[], []], + ], +) +def test_make_spontaneous_activity_tables(stimulus_tables, expected): + + obtained = ephys_pre_spikes.make_spontaneous_activity_tables(stimulus_tables) + + if len(obtained) == 1: + pd.testing.assert_frame_equal(obtained[0], expected[0], check_like=True, check_column_type=False, check_dtype=False) + else: + assert len(obtained) == len(expected) + + +# TODO: this test is really weird +@pytest.mark.parametrize( + "stimuli,stim_tabler,spon_tabler,sort_key,expected", + [ + [ + [[1, 5], [3, 4]], + lambda stimulus: [pd.DataFrame({"parameter": stimulus})], + lambda stimuli: [pd.DataFrame({"parameter": [len(stimuli)]})], + "parameter", + pd.DataFrame( + { + "parameter": [1, 2, 3, 4, 5], + "stimulus_block": [0, None, 1, 1, 0], + "stimulus_index": [0, None, 1, 1, 0], + } + ), + ] + ], +) +def test_create_stim_table(stimuli, stim_tabler, spon_tabler, sort_key, expected): + + obtained = ephys_pre_spikes.create_stim_table( + stimuli, stim_tabler, spon_tabler, sort_key + ) + pd.testing.assert_frame_equal( + obtained, expected, check_like=True, check_dtype=False, check_column_type=False + ) + + +@pytest.mark.parametrize( + "stim_table,frame_times,fps,eft,map_cols,expected", + [ + [ + pd.DataFrame( + {"Start": [1, 2, 3, 4], "End": [2, 3, 4, 5], "data": [-1, -2, -3, -4]} + ), + np.array([100, 50, 25, 12.5, 6.25]), + 10, + True, + ("Start", "End"), + pd.DataFrame( + { + "Start": [50, 25, 12.5, 6.25], + "End": [25, 12.5, 6.25, 6.35], + "data": [-1, -2, -3, -4], + } + ), + ] + ], +) +def test_apply_frame_times(stim_table, frame_times, fps, eft, map_cols, expected): + + obtained = ephys_pre_spikes.apply_frame_times( + stim_table, frame_times, fps, eft, map_cols + ) + pd.testing.assert_frame_equal(obtained, expected, check_like=True, check_column_type=False, check_dtype=False) + + +@pytest.mark.parametrize( + "stimulus,stf,start_key,end_key,expected", + [ + [ + stimulus_psuedofixture_0(), + lambda x: np.array(x), + "Start", + "End", + [ + pd.DataFrame( + { + "Start": [510, 520], + "End": [521, 526], + "a": [-3, 1], + "b": [-2, 2], + "c": [-1, 3], + "stimulus_block": [0, 0], + "stimulus_name": ["gabor_20_deg_250ms"] * 2, + } + ) + ], + ], + [ + stimulus_psuedofixture_1(), + lambda x: np.array(x), + "Start", + "End", + [ + pd.DataFrame( + { + "Start": [510, 520], + "End": [521, 526], + "Image": [1, 0], + "stimulus_block": [0, 0], + "stimulus_name": ["gabor_20_deg_250ms"] * 2, + } + ) + ], + ], + ], +) +def test_build_stimuluswise_table(stimulus, stf, start_key, end_key, expected): + + obtained = ephys_pre_spikes.build_stimuluswise_table( + stimulus, stf, start_key, end_key + ) + for obtained_table, expected_table in zip(obtained, expected): + pd.testing.assert_frame_equal(obtained_table, expected_table, check_like=True, check_column_type=False, check_dtype=False) diff --git a/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py b/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py new file mode 100644 index 0000000000..1e750d41d5 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py @@ -0,0 +1,191 @@ +import pytest +import pandas as pd +import numpy as np + +from allensdk.brain_observatory.ecephys.stimulus_table import naming_utilities as nu + + +@pytest.mark.parametrize( + "table,expected", + [ + [ + pd.DataFrame( + { + "stimulus_name": [ + "natural_movie_four_more_repeats", + "natural_movie_four", + "natural_movie_shuffled", + ] + } + ), + pd.DataFrame( + { + "stimulus_name": [ + "natural_movie_four_more_repeats", + "natural_movie_four", + "natural_movie_four_shuffled", + ] + } + ), + ], + [ + pd.DataFrame( + { + "stimulus_name": [ + "natural_movie_four_more_repeats", + "natural_movie_four", + ] + } + ), + pd.DataFrame( + { + "stimulus_name": [ + "natural_movie_four_more_repeats", + "natural_movie_four", + ] + } + ), + ], + [ + pd.DataFrame( + { + "stimulus_name": [ + "natural_movie_4_more_repeats", + "natural_movie_4", + "natural_movie_shuffled", + ] + } + ), + pd.DataFrame( + { + "stimulus_name": [ + "natural_movie_4_more_repeats", + "natural_movie_4", + "natural_movie_4_shuffled", + ] + } + ), + ], + ], +) +def test_add_number_to_shuffled_movie(table, expected): + obtained = nu.add_number_to_shuffled_movie(table) + pd.testing.assert_frame_equal(expected, obtained, check_like=True) + + +@pytest.mark.parametrize( + "table,expected", + [ + [ + pd.DataFrame( + {"stimulus_name": ["natural_movie_4", "natural_movie_5_more_repeats"]} + ), + pd.DataFrame( + { + "stimulus_name": [ + "natural_movie_four", + "natural_movie_five_more_repeats", + ] + } + ), + ] + ], +) +def test_standardize_movie_numbers(table, expected): + obtained = nu.standardize_movie_numbers(table) + pd.testing.assert_frame_equal(expected, obtained, check_like=True) + + +@pytest.mark.parametrize( + "table,name_map,expected", + [ + [ + pd.DataFrame({"stimulus_name": ["Natural Images", "contrast_response"]}), + { + "Natural Images": "natural_scenes", + "contrast_response": "drifting_gratings_contrast", + }, + pd.DataFrame( + {"stimulus_name": ["natural_scenes", "drifting_gratings_contrast"]} + ), + ], + [ + pd.DataFrame( + {"stimulus_name": ["Natural Images", "contrast_response", np.nan]} + ), + { + "Natural Images": "natural_scenes", + "contrast_response": "drifting_gratings_contrast", + None: "spontaneous", + }, + pd.DataFrame( + { + "stimulus_name": [ + "natural_scenes", + "drifting_gratings_contrast", + "spontaneous", + ] + } + ), + ], + ], +) +def test_map_stimulus_names(table, name_map, expected): + obtained = nu.map_stimulus_names(table, name_map) + pd.testing.assert_frame_equal(expected, obtained, check_like=True) + + +@pytest.mark.parametrize( + "table,expected", + [ + [ + pd.DataFrame({"a": [1, 2, 3], "b": [np.nan, np.nan, np.nan]}), + pd.DataFrame({"a": [1, 2, 3]}), + ], + [ + pd.DataFrame({"a": [1, 2, 3], "b": [None, None, None]}), + pd.DataFrame({"a": [1, 2, 3]}), + ], + [ + pd.DataFrame({"a": [1, 2, 3], "b": [None, None, 4]}), + pd.DataFrame({"a": [1, 2, 3], "b": [None, None, 4]}), + ], + ], +) +def test_drop_empty_columns(table, expected): + obtained = nu.drop_empty_columns(table) + pd.testing.assert_frame_equal(expected, obtained, check_like=True) + + +@pytest.mark.parametrize( + "table,expected", + [ + [ + pd.DataFrame({"a": [1, 2, np.nan], "A": [np.nan, None, 3]}), + pd.DataFrame({"a": [1, 2, 3]}), + ], + [ + pd.DataFrame({"bar": [1, 2, np.nan], "Bar": [np.nan, None, 3]}), + pd.DataFrame({"bar": [1, 2, 3]}), + ], + [ + pd.DataFrame({"bar": [1, 2, np.nan], "Bar": [np.nan, 4, 3]}), + pd.DataFrame({"bar": [1, 2, np.nan], "Bar": [np.nan, 4, 3]}), + ], + [ + pd.DataFrame( + { + "bar": [1, 2, np.nan], + "Bar": [np.nan, 4, 3], + "BAR": [np.nan, np.nan, 3], + } + ), + pd.DataFrame({"bar": [1, 2, 3], "Bar": [np.nan, 4, 3]}), + ], + ], +) +def test_collapse_colimns(table, expected): + obtained = nu.collapse_columns(table) + pd.testing.assert_frame_equal( + expected, obtained, check_like=True, check_dtype=False + ) diff --git a/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py b/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py new file mode 100644 index 0000000000..5181d7a26e --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py @@ -0,0 +1,62 @@ +import pytest + +from allensdk.brain_observatory.ecephys.stimulus_table import ( + stimulus_parameter_extraction as spe, +) + + +@pytest.fixture +def stim_repr(): + return "GratingStim(autoDraw=False, autoLog=True, color=array([1., 1., 1.]), colorSpace='rgb', contrast=0.8, depth=0, name=foo)" + + +@pytest.fixture +def dup_stim_repr(): + return "GratingStim(autoDraw=False, autoDraw=True)" + + +def test_extract_const_params_from_stim_repr_duplicates(dup_stim_repr): + with pytest.raises(KeyError): + obtained = spe.extract_const_params_from_stim_repr(dup_stim_repr) + + +def test_extract_const_params_from_stim_repr(stim_repr): + + expected = { + "autoDraw": False, + "autoLog": True, + "color": [1.0, 1.0, 1.0], + "colorSpace": "rgb", + "contrast": 0.8, + "depth": 0, + "name": "foo", + } + + obtained = spe.extract_const_params_from_stim_repr(stim_repr) + + assert len(expected) == len(obtained) + for key in obtained: + assert expected[key] == obtained[key] + + +def test_extract_stim_class_from_repr(stim_repr): + + expected = "GratingStim" + obtained = spe.extract_stim_class_from_repr(stim_repr) + + assert expected == obtained + + +def test_parse_stim_repr(stim_repr): + expected = { + "color": [1.0, 1.0, 1.0], + "colorSpace": "rgb", + "contrast": 0.8, + "depth": 0, + } + + obtained = spe.parse_stim_repr(stim_repr) + + assert len(expected) == len(obtained) + for key in obtained: + assert expected[key] == obtained[key] diff --git a/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py b/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py new file mode 100644 index 0000000000..a325c3ec49 --- /dev/null +++ b/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py @@ -0,0 +1,316 @@ +import collections +import sys +import os + +import pytest +import mock +import pandas as pd +import numpy as np + +from allensdk.brain_observatory.ecephys.stimulus_table.__main__ import ( + build_stimulus_table, +) + + +def build_psuedofixture(name, data): + new_class = collections.namedtuple(name, data.keys()) + return new_class(**data) + + +def stim_file(*a, **k): + return build_psuedofixture( + "StimFileClass", + { + "pre_blank_sec": 20.0, + "frames_per_second": 10.0, + "stimuli": [ + { + "stim_path": "C:\\ecephys_stimulus_scripts\\gabor_20_deg_250ms.stim", + "display_sequence": np.array([[50, 100]], dtype=np.int32), + "dimnames": ["TF", "SF"], + "sweep_frames": [ + (0, 4), + (5, 9), + (10, 14), + (15, 19), + (20, 24), + (25, 29), + (30, 34), + (35, 39), + ], + "sweep_order": [4, 3, 7, 1, 2, 0, 5, 6], + "sweep_table": [ + (-1, 1), + (-2, 2), + (-3, 3), + (-4, 4), + (-5, 5), + (-6, 6), + (-7, 7), + (-8, 8), + ], + "stim": "GratingStim(autoDraw=False, autoLog=True, contrast=0.8, win=Window(...))", + }, + { + "stim_path": "C:\\ecephys_stimulus_scripts\\static_gratings.stim", + "display_sequence": np.array( + [[45, 46], [100, 110]], dtype=np.int32 + ), + "dimnames": ["Ori", "Phase"], + "sweep_frames": [(0, 8), (9, 17), (18, 26), (27, 35)], + "sweep_order": [0, 2, 3, 1], + "sweep_table": [(-1.5, 1.5), (-2.5, 2.5), (-3.5, 3.5), (-4.5, 4.5)], + "stim": "GratingStim(contrast=0.8, ori=30.0, phase=array([0., 0.]), sf=array([0.16, 0.16]), size=array([250., 250.]))", + }, + ], + }, + ) + + +def sync_file(*a, **k): + class SyncFileClass: + def extract_frame_times(*a, **k): + return np.arange(10000, dtype=float) / 10 + + @classmethod + def factory(cls, *a, **k): + return cls() + + return SyncFileClass.factory + + +@pytest.fixture +def expected_table(): + return pd.DataFrame( + { + "Start": { + 0: 0.0, + 1: 65.0, + 2: 65.9, + 3: 66.8, + 4: 70.0, + 5: 70.5, + 6: 71.0, + 7: 71.5, + 8: 72.0, + 9: 72.5, + 10: 73.0, + 11: 73.5, + 12: 74.0, + 13: 120.8, + 14: 121.7, + }, + "End": { + 0: 65.0, + 1: 65.9, + 2: 66.8, + 3: 70.0, + 4: 70.5, + 5: 71.0, + 6: 71.5, + 7: 72.0, + 8: 72.5, + 9: 73.0, + 10: 73.5, + 11: 74.0, + 12: 120.8, + 13: 121.7, + 14: 122.6, + }, + "stimulus_name": { + 0: "spontaneous", + 1: "static_gratings", + 2: "static_gratings", + 3: "spontaneous", + 4: "gabor", + 5: "gabor", + 6: "gabor", + 7: "gabor", + 8: "gabor", + 9: "gabor", + 10: "gabor", + 11: "gabor", + 12: "spontaneous", + 13: "static_gratings", + 14: "static_gratings", + }, + "stimulus_block": { + 0: np.nan, + 1: 0.0, + 2: 0.0, + 3: np.nan, + 4: 1.0, + 5: 1.0, + 6: 1.0, + 7: 1.0, + 8: 1.0, + 9: 1.0, + 10: 1.0, + 11: 1.0, + 12: np.nan, + 13: 2.0, + 14: 2.0, + }, + "Ori": { + 0: np.nan, + 1: -1.5, + 2: -3.5, + 3: np.nan, + 4: np.nan, + 5: np.nan, + 6: np.nan, + 7: np.nan, + 8: np.nan, + 9: np.nan, + 10: np.nan, + 11: np.nan, + 12: np.nan, + 13: -4.5, + 14: -2.5, + }, + "Phase": { + 0: np.nan, + 1: 1.5, + 2: 3.5, + 3: np.nan, + 4: np.nan, + 5: np.nan, + 6: np.nan, + 7: np.nan, + 8: np.nan, + 9: np.nan, + 10: np.nan, + 11: np.nan, + 12: np.nan, + 13: 4.5, + 14: 2.5, + }, + "contrast": { + 0: np.nan, + 1: 0.8, + 2: 0.8, + 3: np.nan, + 4: 0.8, + 5: 0.8, + 6: 0.8, + 7: 0.8, + 8: 0.8, + 9: 0.8, + 10: 0.8, + 11: 0.8, + 12: np.nan, + 13: 0.8, + 14: 0.8, + }, + "sf": { + 0: np.nan, + 1: "[0.16, 0.16]", + 2: "[0.16, 0.16]", + 3: np.nan, + 4: "5.0", + 5: "4.0", + 6: "8.0", + 7: "2.0", + 8: "3.0", + 9: "1.0", + 10: "6.0", + 11: "7.0", + 12: np.nan, + 13: "[0.16, 0.16]", + 14: "[0.16, 0.16]", + }, + "size": { + 0: np.nan, + 1: "[250.0, 250.0]", + 2: "[250.0, 250.0]", + 3: np.nan, + 4: np.nan, + 5: np.nan, + 6: np.nan, + 7: np.nan, + 8: np.nan, + 9: np.nan, + 10: np.nan, + 11: np.nan, + 12: np.nan, + 13: "[250.0, 250.0]", + 14: "[250.0, 250.0]", + }, + "stimulus_index": { + 0: np.nan, + 1: 1.0, + 2: 1.0, + 3: np.nan, + 4: 0.0, + 5: 0.0, + 6: 0.0, + 7: 0.0, + 8: 0.0, + 9: 0.0, + 10: 0.0, + 11: 0.0, + 12: np.nan, + 13: 1.0, + 14: 1.0, + }, + "TF": { + 0: np.nan, + 1: np.nan, + 2: np.nan, + 3: np.nan, + 4: -5.0, + 5: -4.0, + 6: -8.0, + 7: -2.0, + 8: -3.0, + 9: -1.0, + 10: -6.0, + 11: -7.0, + 12: np.nan, + 13: np.nan, + 14: np.nan, + }, + } + ) + + +@mock.patch( + "allensdk.brain_observatory.ecephys.file_io.stim_file.CamStimOnePickleStimFile.factory", + new=stim_file, +) +@mock.patch( + "allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset.EcephysSyncDataset.factory", + new=sync_file(), +) +def test_build_stimulus_table(tmpdir_factory, expected_table): + + tmpdir = str(tmpdir_factory.mktemp("ecephys_stimulus_table_integration")) + table_path = os.path.join(tmpdir, "stimulus_table.csv") + frame_times_path = os.path.join(tmpdir, "frame_times.npy") + + build_stimulus_table( + stimulus_pkl_path="fake_stim_path", + sync_h5_path="fake_sync_path", + frame_time_strategy="use_photodiode", + minimum_spontaneous_activity_duration=sys.float_info.epsilon, + extract_const_params_from_repr=True, + drop_const_params=["name", "maskParams", "win", "autoLog", "autoDraw"], + maximum_expected_spontanous_activity_duration=99999999999, + stimulus_name_map={ + "": "spontaneous", + "Natural Images": "natural_scenes", + "flash_250ms": "flash", + "contrast_response": "drifting_gratings_contrast", + "gabor_20_deg_250ms": "gabor", + }, + column_name_map={}, + output_stimulus_table_path=table_path, + output_frame_times_path=frame_times_path, + fail_on_negative_duration=True + ) + + obtained_table = pd.read_csv(table_path) + obtained_frame_times = np.load(frame_times_path, allow_pickle=False) + + pd.testing.assert_frame_equal(expected_table, obtained_table, check_like=True, check_dtype=False) + assert np.array_equal(np.arange(10000) / 10, obtained_frame_times) diff --git a/test/brain_observatory/ecephys/test_copy_utility.py b/test/brain_observatory/ecephys/test_copy_utility.py new file mode 100644 index 0000000000..da74d4c15f --- /dev/null +++ b/test/brain_observatory/ecephys/test_copy_utility.py @@ -0,0 +1,201 @@ +import os +import hashlib +from pathlib import Path +import sys +import shutil + +import pytest + +import argschema + +import allensdk.brain_observatory.ecephys.copy_utility.__main__ as cu +from allensdk.brain_observatory.ecephys.copy_utility._schemas import ( + SessionUploadInputSchema, SessionUploadOutputSchema) + + +@pytest.mark.parametrize("already_exists", [True, False]) +def test_dst_dir_exists(already_exists, tmp_path, monkeypatch): + dst_dir = tmp_path / "new_directory" + src_file = tmp_path / "source.txt" + src_file.touch() + + if already_exists: + dst_dir.mkdir() + dst_file = dst_dir / "destination.txt" + outj_path = tmp_path / "output.json" + + args = { + "files": [ + { + "source": str(src_file), + "destination": str(dst_file), + "key": "something"}], + "output_json": str(outj_path)} + + parser = argschema.ArgSchemaParser( + args, + schema_type=SessionUploadInputSchema, + output_schema_type=SessionUploadOutputSchema, + args=[] + ) + + def mock_copy_file(source, dest, use_rsync, make_parent_dirs, chmod=None): + parent = Path(dest).parent + if make_parent_dirs & (not parent.exists()): + parent.mkdir() + shutil.copy(source, dest) + + monkeypatch.setattr(cu, "copy_file_entry", mock_copy_file) + output = cu.main(**parser.args) + parser.output(output, indent=2) + assert outj_path.exists() + assert Path(args["files"][0]["destination"]).exists() + + +def test_hash_file(tmpdir_factory): + tempdir = str(tmpdir_factory.mktemp('ecephys_copy_utility_test_hash_file')) + path = os.path.join(tempdir, 'afile.txt') + + st = 'hello world' + with open(path, 'wb') as f: + f.write(st.encode()) + + hasher_cls = hashlib.sha256 + obtained = cu.hash_file(path, hasher_cls) + + h = hasher_cls() + h.update(st.encode()) + expected = h.digest() + assert expected == obtained + + +@pytest.mark.parametrize('use_rsync', [True, False]) +@pytest.mark.parametrize('make_parent_dirs', [True, False]) +@pytest.mark.parametrize("chmod", [777, 775, 755, None]) +def test_copy_file_entry(tmpdir_factory, use_rsync, make_parent_dirs, chmod): + + mac_or_linux = ( + sys.platform.startswith('darwin') or sys.platform.startswith('linux') + ) + if use_rsync and not mac_or_linux: + pytest.skip() + + tempdir = str( + tmpdir_factory.mktemp('ecephys_copy_utility_test_copy_file_entry') + ) + spath = os.path.join(tempdir, 'afile.txt') + dpath = os.path.join(tempdir, 'bfile.txt') + + with open(spath, 'w') as sf: + sf.write('foo') + + cu.copy_file_entry(spath, dpath, use_rsync, make_parent_dirs, chmod) + + with open(dpath, 'r') as df: + assert df.read() == 'foo' + + def get_human_mode(path): + return int(oct(os.stat(path).st_mode & 0o777)[2:]) + expected_mode = chmod if chmod is not None else get_human_mode(spath) + + if mac_or_linux: + assert get_human_mode(dpath) == expected_mode + + +@pytest.mark.parametrize('different', [True, False]) +@pytest.mark.parametrize('raise_if_comparison_fails', [True, False]) +def test_compare_directories(tmpdir_factory, + different, + raise_if_comparison_fails): + hasher_cls = hashlib.sha256 + + base_dir = str( + tmpdir_factory.mktemp('ecephys_copy_utility_test_compare_directories') + ) + sdir = os.path.join(base_dir, 'src') + os.makedirs(sdir) + ddir = os.path.join(base_dir, 'dest') + os.makedirs(ddir) + + if different: + + with open(os.path.join(sdir, 'foo.txt'), 'w') as f: + f.write('baz') + + if raise_if_comparison_fails: + with pytest.raises(ValueError): + cu.compare_directories( + sdir, ddir, hasher_cls, raise_if_comparison_fails) + else: + with pytest.warns(UserWarning): + cu.compare_directories( + sdir, ddir, hasher_cls, raise_if_comparison_fails) + + else: + cu.compare_directories( + sdir, ddir, hasher_cls, raise_if_comparison_fails) + + +@pytest.mark.parametrize('different', [True, False]) +@pytest.mark.parametrize('raise_if_comparison_fails', [True, False]) +def test_compare_files(tmpdir_factory, different, raise_if_comparison_fails): + hasher_cls = hashlib.sha256 + + base_dir = str( + tmpdir_factory.mktemp('ecephys_copy_utility_test_compare_files') + ) + spath = os.path.join(base_dir, 'source.txt') + dpath = os.path.join(base_dir, 'dest.txt') + + with open(spath, 'w') as f: + f.write('baz') + + if different: + + with open(dpath, 'w') as f: + f.write('fish') + + if raise_if_comparison_fails: + with pytest.raises(ValueError): + cu.compare_files( + spath, dpath, hasher_cls, raise_if_comparison_fails) + else: + with pytest.warns(UserWarning): + cu.compare_files( + spath, dpath, hasher_cls, raise_if_comparison_fails) + + else: + + with open(dpath, 'w') as f: + f.write('baz') + + cu.compare_files(spath, dpath, hasher_cls, raise_if_comparison_fails) + + +def test_SessionUploadSchema(tmpdir): + src_file = Path(tmpdir) / 'src.csv' + src_file.touch() + + dst_file = Path(tmpdir) / 'dst.csv' + + output_json = Path(tmpdir) / 'output.json' + + test_data = { + 'files': [{ + 'source': str(src_file), + 'destination': str(dst_file), + 'key': '' + }], + 'output_json': str(output_json) + } + + parser = argschema.ArgSchemaParser( + test_data, + schema_type=SessionUploadInputSchema, + output_schema_type=SessionUploadOutputSchema, + args=[] + ) + + # Mocking the functionality of the main method + shutil.copy(src_file, dst_file) + parser.output({'files': test_data['files']}) diff --git a/test/brain_observatory/ecephys/test_current_source_density.py b/test/brain_observatory/ecephys/test_current_source_density.py new file mode 100644 index 0000000000..160b263884 --- /dev/null +++ b/test/brain_observatory/ecephys/test_current_source_density.py @@ -0,0 +1,267 @@ +import pytest +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.ecephys.current_source_density import _current_source_density as csd +from allensdk.brain_observatory.ecephys.current_source_density import _interpolation_utils as interp_utils +from allensdk.brain_observatory.ecephys.current_source_density import _filter_utils as filt_utils + + +@pytest.fixture +def stim_table(): + return pd.DataFrame({ + 'Start': [0, 1, 2, 3, 4, 5, 6], + 'End': [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], + 'alpha': [None, -1, -2, -3, -4, -5, -6], + 'stimulus_name': [None, 'a', 'a', 'a', 'b', 'b', 'a'], + 'stimulus_index': [None, 0, 0, 0, 1, 1, 2] + }) + + +# ------------ _current_source_density.py ------------ +@pytest.mark.parametrize('stim_index', [0, None]) +def test_extract_trial_windows(stim_table, stim_index): + + stim_name = 'a' + time_step = 0.1 + pre_stim_time = 0.2 + post_stim_time = 0.3 + num_trials = 2 + + expected = [ + [0.8, 0.9, 1.0, 1.1, 1.2], + [1.8, 1.9, 2.0, 2.1, 2.2] + ] + exp_rel = [-0.2, -0.1, 0.0, 0.1, 0.2] + + obtained, obt_rel = csd.extract_trial_windows( + stim_table, stim_name, time_step, pre_stim_time, + post_stim_time, num_trials, stim_index + ) + + assert np.allclose(obtained, expected) + assert np.allclose(obt_rel, exp_rel) + + +@pytest.mark.parametrize('times,raw,channels,windows,volts_per_bit,expected', [ + [ + np.arange(10), + np.arange(50).reshape([10, 5]), + [1, 3], + [[5.5, 6], [7, 8]], + 1.0, + [ + # data are rounded to int + [[28, 31], [30, 33]], + [[36, 41], [38, 43]] + ] + ], + [ + np.arange(10), + np.arange(50).reshape([10, 5]), + [1, 3], + [[5.5, 6], [7, 8]], + 0.5, + [ + # volts_per_bit scaling may result in floats + [[14, 15.5], [15, 16.5]], + [[18, 20.5], [19, 21.5]] + ] + ] +]) +def test_accumulate_lfp_data(times, raw, channels, windows, volts_per_bit, + expected): + obtained = csd.accumulate_lfp_data(times, raw, channels, + windows, volts_per_bit) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize('trial_mean_accumulated,spacing,expected,expected_channels', [ + [ + np.nanmean(np.arange(36).reshape([2, 6, 3]) ** 3, axis=0), + 1.0, + [[1728., 1926., 2142.], + [648., 702., 756.], + [810., 864., 918.], + [972., 1026., 1080.], + [1134., 1188., 1242.], + [-5292., -5706., -6138.]], + np.arange(6) + ] +]) +def test_compute_csd(trial_mean_accumulated, spacing, expected, expected_channels): + + obtained, obtained_channels = csd.compute_csd(trial_mean_accumulated, spacing=spacing) + + assert np.allclose(obtained, expected) + assert np.allclose(obtained_channels, expected_channels) + + +# ------------ _interpolation_utils.py ------------ +@pytest.mark.parametrize('min_chan, max_chan, expected', [ + [ + # min_chan + 0, + # max_chan + 4, + # expected actual channel locations + [[16, 0], [48, 0], [0, 20], [32, 20]] + ], + [ + 2, + 6, + [[0, 20], [32, 20], [16, 40], [48, 40]] + ], + [ + 0, + 8, + [[16, 0], [48, 0], [0, 20], [32, 20], + [16, 40], [48, 40], [0, 60], [32, 60]] + ], + [ + 4, + 8, + [[16, 40], [48, 40], [0, 60], [32, 60]] + ], + [ + 5, + 6, + [[48, 40]] + ] + +]) +def test_make_actual_channel_locations(min_chan, max_chan, expected): + obtained = interp_utils.make_actual_channel_locations(min_chan=min_chan, + max_chan=max_chan) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize('min_chan, max_chan, expected', [ + [ + # min_chan + 0, + # max_chan + 7, + # expected interpolated channel locations + [[24, 0], [24, 10], [24, 20], [24, 30], [24, 40], [24, 50], [24, 60]] + ], + [ + 0, + 14, + [[24, 0], [24, 10], [24, 20], [24, 30], [24, 40], [24, 50], [24, 60], + [24, 70], [24, 80], [24, 90], [24, 100], [24, 110], [24, 120], [24, 130]] + ], + [ + 2, + 6, + [[24, 20], [24, 30], [24, 40], [24, 50]] + ], + [ + 7, + 14, + [[24, 70], [24, 80], [24, 90], [24, 100], [24, 110], [24, 120], [24, 130]] + ], + [ + 8, + 9, + [[24, 80]] + ] +]) +def test_make_interp_channel_locations(min_chan, max_chan, expected): + obtained = interp_utils.make_interp_channel_locations(min_chan=min_chan, + max_chan=max_chan) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize('lfp, actual_locs, interp_locs, expected', [ + [ + # lfp + np.arange(36).reshape([2, 6, 3]) ** 3, + # actual_locs + interp_utils.make_actual_channel_locations(0, 6), + # interp_locs + interp_utils.make_interp_channel_locations(0, 6), + # expected (interp_lfp, spacing) + ([[[-1.48688877e+01, -1.65987508e+00, 2.25788198e+01], + [1.84977651e+02, 3.01621496e+02, 4.52968522e+02], + [5.82039685e+02, 8.18476063e+02, 1.11005335e+03], + [1.23712914e+03, 1.61285986e+03, 2.05929375e+03], + [2.03821497e+03, 2.56276850e+03, 3.17035171e+03], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00]], + + [[6.80643377e+03, 7.93617702e+03, 9.18494994e+03], + [1.24901530e+04, 1.41494541e+04, 1.59514583e+04], + [1.81704531e+04, 2.03174258e+04, 2.26275394e+04], + [2.37138688e+04, 2.62802568e+04, 2.90253479e+04], + [2.90797202e+04, 3.20168080e+04, 3.51449255e+04], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]], 0.01) + ] +]) +def test_interp_channel_locs(lfp, actual_locs, interp_locs, expected): + obtained = interp_utils.interp_channel_locs(lfp=lfp, + actual_locs=actual_locs, + interp_locs=interp_locs) + + obtained_interp_lfp, obtained_spacing = obtained + expected_interp_lfp, expected_spacing = expected + + assert np.allclose(obtained_interp_lfp, expected_interp_lfp) + assert obtained_spacing == expected_spacing + + +# ------------ _filter_utils.py ------------ +@pytest.mark.parametrize('lfp, ref_channels, noisy_thresh, expected', [ + [ + # lfp arrays in the form of: trials x channel x time samples + # channel 1 should be marked as 'noisy' and 2 should be removed + # for being a reference + np.array([[[0.1, 0.1, 0.1, 0.1], [0, 50, 500, 5000], [0, 0, 0, 0], [0.3, 0.3, 0.3, 0.3]], + [[0.15, 0.15, 0.15, 0.15], [0, 10, 100, 1000], [0, 0, 0, 0], [0.25, 0.25, 0.25, 0.25]], + [[0.2, 0.2, 0.2, 0.2], [0, 0, 0, 0], [0, 0, 0, 0], [0.2, 0.2, 0.2, 0.2]]]), + # reference channels + [2], + # noisy_channel_threshold + 2.0, + # expected output (cleaned_lfp, good_indices) + (np.array([[[0.1, 0.1, 0.1, 0.1], [0.3, 0.3, 0.3, 0.3]], + [[0.15, 0.15, 0.15, 0.15], [0.25, 0.25, 0.25, 0.25]], + [[0.2, 0.2, 0.2, 0.2], [0.2, 0.2, 0.2, 0.2]]]), + np.array([0, 3])) + ] +]) +def test_select_good_channels(lfp, ref_channels, noisy_thresh, expected): + obtained = filt_utils.select_good_channels(lfp, + ref_channels, + noisy_thresh) + obtained_cleaned, obtained_good_inds = obtained + assert np.allclose(obtained_cleaned, expected[0]) + assert np.allclose(obtained_good_inds, expected[1]) + + +@pytest.mark.parametrize('lfp, sampling_rate, filter_cuts, filter_order, expected', [ + [ + # lfp + np.arange(30).reshape([1, 3, 10]), + # sampling_rate + 1000, + # filter_cuts + [5.0, 150.0], + # filter_order + 1, + # expected output + [[[-8.03033681, -7.51102701, -7.00015769, -6.49716665, -6.00149202, + -5.51257727, -5.02987273, -4.55283625, -4.08093445, -3.61364687], + [-8.03033681, -7.51102701, -7.00015769, -6.49716665, -6.00149202, + -5.51257727, -5.02987273, -4.55283625, -4.08093445, -3.61364687], + [-8.03033681, -7.51102701, -7.00015769, -6.49716665, -6.00149202, + -5.51257727, -5.02987273, -4.55283625, -4.08093445, -3.61364687]]] + + ] + +]) +def test_filter_lfp_channels(lfp, sampling_rate, filter_cuts, filter_order, expected): + obtained = filt_utils.filter_lfp_channels(lfp, + sampling_rate, + filter_cuts, + filter_order) + assert np.allclose(obtained, expected) diff --git a/test/brain_observatory/ecephys/test_ecephys_project_cache.py b/test/brain_observatory/ecephys/test_ecephys_project_cache.py new file mode 100644 index 0000000000..def086af8e --- /dev/null +++ b/test/brain_observatory/ecephys/test_ecephys_project_cache.py @@ -0,0 +1,512 @@ +import os +import collections +from datetime import datetime + +import pytest +import pandas as pd +import numpy as np +import SimpleITK as sitk +import pynwb + +import allensdk.brain_observatory.ecephys.ecephys_project_cache as epc +from allensdk.core.authentication import DbCredentials +import allensdk.brain_observatory.ecephys.write_nwb.__main__ as write_nwb +from allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine import ( + write_from_stream, write_bytes_from_coroutine, AsyncHttpEngine, HttpEngine, + DEFAULT_TIMEOUT as HTTP_ENGINE_DEFAULT_TIMEOUT +) + +mock_lims_credentials = DbCredentials(dbname='mock_lims', user='mock_user', + host='mock_host', port='mock_port', + password='mock') + + +@pytest.fixture +def raw_sessions(): + return pd.DataFrame({ + 'session_type': ['stimulus_set_one', 'stimulus_set_two', 'stimulus_set_two'], + "unit_count": [500, 1000, 1500], + "channel_count": [40, 90, 140], + "probe_count": [3, 4, 5], + "structure_acronyms": [["a", "v"], ["a", "c"], ["b"]] + }, index=pd.Series(name='id', data=[1, 2, 3])) + + +@pytest.fixture +def sessions(): + return pd.DataFrame({ + 'session_type': ['stimulus_set_one', 'stimulus_set_two', 'stimulus_set_two'], + "unit_count": [500, 1000, 1500], + "channel_count": [40, 90, 140], + "probe_count": [3, 4, 5], + "ecephys_structure_acronyms": [["a", "v"], ["a", "c"], ["b"]] + }, index=pd.Series(name='id', data=[1, 2, 3])) + + +@pytest.fixture +def units(): + return pd.DataFrame({ + 'ecephys_channel_id': [2, 1], + 'snr': [1.5, 4.9], + "amplitude_cutoff": [0.05, 0.2], + "presence_ratio": [10, 20], + "isi_violations": [0.3, 0.4], + "quality": ["good", "noise"] + }, index=pd.Series(name='id', data=[1, 2])) + + +@pytest.fixture +def analysis_metrics(): + return pd.DataFrame({ + "a": [0, 1, 2], + "b": [3, 4, 5] + }, index=pd.Index(name="ecephys_unit_id", data=[1, 2, 3])) + + +@pytest.fixture +def channels(): + return pd.DataFrame({ + 'ecephys_probe_id': [11, 11], + 'ap': [1000, 2000], + "unit_count": [5, 10], + "ecephys_structure_acronym": ["a", "b"] + }, index=pd.Series(name='id', data=[1, 2])) + + +@pytest.fixture +def raw_probes(): + return pd.DataFrame({ + 'ecephys_session_id': [3], + "unit_count": [50], + "channel_count": [10], + "lfp_temporal_subsampling_factor": [2.0], + "lfp_sampling_rate": [1000.0], + }, index=pd.Series(name='id', data=[11])) + + +@pytest.fixture +def probes(): + return pd.DataFrame({ + 'ecephys_session_id': [3], + "unit_count": [50], + "channel_count": [10], + "lfp_temporal_subsampling_factor": [2.0], + "lfp_sampling_rate": [500.0], + }, index=pd.Series(name='id', data=[11])) + + +@pytest.fixture +def annotated_probes(probes, sessions): + return pd.merge(probes, sessions, left_on="ecephys_session_id", right_index=True, suffixes=["_probe", "_session"]) + + +@pytest.fixture +def annotated_channels(channels, annotated_probes): + return pd.merge(channels, annotated_probes, left_on="ecephys_probe_id", right_index=True, suffixes=["_channel", "_probe"]) + + +@pytest.fixture +def annotated_units(units, annotated_channels): + return pd.merge(units, annotated_channels, left_on="ecephys_channel_id", right_index=True, suffixes=["_unit", "_channel"]) + + +@pytest.fixture +def shared_tmpdir(tmpdir_factory): + return str(tmpdir_factory.mktemp('test_ecephys_project_cache')) + + +class MockEngine: + def __init__(self): + self.write_bytes = write_from_stream + + +@pytest.fixture +def mock_api(shared_tmpdir, raw_sessions, units, channels, raw_probes, analysis_metrics): + class MockApi: + + def __init__(self, **kwargs): + self.accesses = collections.defaultdict(lambda: 1) + self.rma_engine = MockEngine() + + def __getattr__(self, name): + self.accesses[name] += 1 + + def get_sessions(self, **kwargs): + return raw_sessions + + def get_units(self, **kwargs): + return units + + def get_channels(self, **kwargs): + return channels + + def get_probes(self, **kwargs): + return raw_probes + + def get_session_data(self, session_id, **kwargs): + path = os.path.join(shared_tmpdir, 'tmp.nwb') + + nwbfile = pynwb.NWBFile( + session_description='EcephysSession', + identifier=f"{session_id}", + session_start_time=datetime.now() + ) + + write_nwb.add_probe_to_nwbfile(nwbfile, 11, sampling_rate=1.0, + lfp_sampling_rate=2.0, + has_lfp_data=True, + name="Test Probe") + + with pynwb.NWBHDF5IO(path, "w") as io: + io.write(nwbfile) + + return open(path, 'rb') + + def get_probe_lfp_data(self, probe_id): + path = os.path.join(shared_tmpdir, f"probe_{probe_id}.nwb") + + nwbfile = pynwb.NWBFile( + session_description='EcephysProbe', + identifier=f"{probe_id}", + session_start_time=datetime.now() + ) + + with pynwb.NWBHDF5IO(path, "w") as io: + io.write(nwbfile) + + return open(path, 'rb') + + def get_natural_scene_template(self, number): + path = os.path.join(shared_tmpdir, "tmp.tiff") + img = sitk.GetImageFromArray(np.eye(100, dtype=np.uint8)) + sitk.WriteImage(img, path) + return open(path, "rb") + + def get_natural_movie_template(self, number): + path = os.path.join(shared_tmpdir, "tmp.npy") + np.save(path, np.eye(100)) + return open(path, "rb") + + def get_unit_analysis_metrics(self, *a, **k): + return analysis_metrics + + return MockApi + + +@pytest.fixture +def tmpdir_cache(shared_tmpdir, mock_api): + + man_path = os.path.join(shared_tmpdir, 'manifest.json') + + return epc.EcephysProjectCache( + fetch_api=mock_api(), + manifest=man_path + ) + + +def lazy_cache_test(cache, cache_name, api_name, expected, *args, **kwargs): + obtained_one = getattr(cache, cache_name)(*args, **kwargs) + obtained_two = getattr(cache, cache_name)(*args, **kwargs) + + pd.testing.assert_frame_equal(expected, obtained_one) + pd.testing.assert_frame_equal(expected, obtained_two) + + assert 1 == cache.fetch_api.accesses[api_name] + + +def test_get_sessions(tmpdir_cache, sessions): + lazy_cache_test(tmpdir_cache, '_get_sessions', "get_sessions", sessions) + + +@pytest.mark.parametrize("filter_by_validity", [False, True]) +def test_get_units(tmpdir_cache, units, filter_by_validity): + if filter_by_validity: + units = units[units["quality"] == "good"].drop(columns="quality") + lazy_cache_test(tmpdir_cache, '_get_units', "get_units", units, filter_by_validity=filter_by_validity) + else: + units = units[units["amplitude_cutoff"] <= 0.1] + lazy_cache_test(tmpdir_cache, '_get_units', "get_units", units, filter_by_validity=filter_by_validity) + + +def test_get_probes(tmpdir_cache, probes): + lazy_cache_test(tmpdir_cache, '_get_probes', "get_probes", probes) + + +def test_get_channels(tmpdir_cache, channels): + lazy_cache_test(tmpdir_cache, '_get_channels', "get_channels", channels) + + +def test_get_annotated_probes(tmpdir_cache, probes, annotated_probes): + lazy_cache_test(tmpdir_cache, "_get_annotated_probes", "get_probes", annotated_probes) + + +def test_get_annotated_channels(tmpdir_cache, channels, annotated_channels): + lazy_cache_test(tmpdir_cache, "_get_annotated_channels", "get_channels", annotated_channels) + + +def test_get_annotated_units(tmpdir_cache, units, annotated_units): + annotated_units = annotated_units[annotated_units["amplitude_cutoff"] < 0.1] + + lazy_cache_test(tmpdir_cache, "_get_annotated_units", "get_units", annotated_units, filter_by_validity=False) + + +def test_get_session_data(shared_tmpdir, tmpdir_cache): + + sid = 12345 + + data_one = tmpdir_cache.get_session_data(sid) + + assert 1 == tmpdir_cache.fetch_api.accesses['get_session_data'] + assert os.path.join(shared_tmpdir, f"session_{sid}", f"session_{sid}.nwb") == data_one.api.path + + +def test_get_natural_scene_template(shared_tmpdir, tmpdir_cache): + num = 10 + + data_one = tmpdir_cache.get_natural_scene_template(num) + + assert 1 == tmpdir_cache.fetch_api.accesses["get_natural_scene_template"] + assert np.allclose(np.eye(100), data_one) + + +def test_get_natural_movie_template(shared_tmpdir, tmpdir_cache): + num = 10 + + data_one = tmpdir_cache.get_natural_movie_template(num) + + assert 1 == tmpdir_cache.fetch_api.accesses["get_natural_movie_template"] + assert np.allclose(np.eye(100), data_one) + + +def test_get_unit_analysis_metrics_for_session(tmpdir_cache, analysis_metrics): + lazy_cache_test( + tmpdir_cache, + 'get_unit_analysis_metrics_for_session', + "get_unit_analysis_metrics", + analysis_metrics, + session_id=3, + annotate=False + ) + + +def test_get_unit_analysis_metrics_by_session_type(tmpdir_cache, analysis_metrics): + lazy_cache_test( + tmpdir_cache, + 'get_unit_analysis_metrics_by_session_type', + "get_unit_analysis_metrics", + analysis_metrics, + session_type="stimulus_set_two", + annotate=False + ) + + +def test_get_session_data_eventual_success(tmpdir_factory, mock_api): + man_path = os.path.join( + tmpdir_factory.mktemp("get_session_data"), + "manifest.json" + ) + + class InitiallyFailingApi(mock_api): + def get_session_data(self, session_id, **kwargs): + if self.accesses["get_session_data"] < 1: + raise ValueError("bad news!") + return super(InitiallyFailingApi, self).get_session_data(session_id, **kwargs) + + api = InitiallyFailingApi() + cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) + + sid = 12345 + session = cache.get_session_data(sid) + assert session.ecephys_session_id == sid + + +def test_get_session_data_continual_failure(tmpdir_factory, mock_api): + man_path = os.path.join( + tmpdir_factory.mktemp("get_session_data"), + "manifest.json" + ) + + class ContinuallyFailingApi(mock_api): + def get_session_data(self, session_id, **kwargs): + raise ValueError("bad news!") + + api = ContinuallyFailingApi() + cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) + + sid = 12345 + with pytest.raises(ValueError): + _ = cache.get_session_data(sid) + + +def test_get_probe_lfp_data(tmpdir_factory, mock_api): + man_path = os.path.join( + tmpdir_factory.mktemp("get_lfp_data"), + "manifest.json" + ) + + class InitiallyFailingApi(mock_api): + def get_probe_lfp_data(self, probe_id, **kwargs): + if self.accesses["get_probe_data"] < 1: + raise ValueError("bad news!") + return super(InitiallyFailingApi, self).get_probe_lfp_data(probe_id, **kwargs) + + api = InitiallyFailingApi() + cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) + + sid = 3 + pid = 11 + + session = cache.get_session_data(sid) + lfp_file = session.api._probe_nwbfile(pid) + + assert str(pid) == lfp_file.identifier + + +def test_get_probe_lfp_data_continually_failing(tmpdir_factory, mock_api): + man_path = os.path.join( + tmpdir_factory.mktemp("get_lfp_data"), + "manifest.json" + ) + + class ContinuallyFailingApi(mock_api): + def get_probe_lfp_data(self, probe_id, **kwargs): + if True: + raise ValueError("bad news!") + + api = ContinuallyFailingApi() + cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) + + sid = 3 + pid = 11 + + with pytest.raises(ValueError): + session = cache.get_session_data(sid) + _ = session.api._probe_nwbfile(pid) + + +def test_from_lims_default(tmpdir_factory): + tmpdir = str(tmpdir_factory.mktemp("test_from_lims_default")) + + cache = epc.EcephysProjectCache.from_lims( + manifest=os.path.join(tmpdir, "manifest.json"), + lims_credentials=mock_lims_credentials + ) + assert isinstance(cache.fetch_api.app_engine, HttpEngine) + assert cache.stream_writer is write_from_stream + assert cache.fetch_api.app_engine.scheme == "http" + assert cache.fetch_api.app_engine.host == "lims2" + + +def test_from_warehouse_default(tmpdir_factory): + tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) + + cache = epc.EcephysProjectCache.from_warehouse( + manifest=os.path.join(tmpdir, "manifest.json") + ) + assert isinstance(cache.fetch_api.rma_engine, HttpEngine) + assert cache.stream_writer is write_from_stream + assert cache.fetch_api.rma_engine.scheme == "http" + assert cache.fetch_api.rma_engine.host == "api.brain-map.org" + + +def test_init_default(tmpdir_factory): + tmpdir = str(tmpdir_factory.mktemp("test_init_default")) + cache = epc.EcephysProjectCache( + manifest=os.path.join(tmpdir, "manifest.json") + ) + assert isinstance(cache.fetch_api.rma_engine, HttpEngine) + assert cache.stream_writer is cache.fetch_api.rma_engine.write_bytes + assert cache.fetch_api.rma_engine.scheme == "http" + assert cache.fetch_api.rma_engine.host == "api.brain-map.org" + + +@pytest.mark.parametrize( + ("cache_constructor, asynchronous, engine_attr, expected_engine," + "expected_scheme, expected_host, expected_stream_writer"), [ + ( + epc.EcephysProjectCache.from_lims, True, + "app_engine", AsyncHttpEngine, "http", "lims2", + write_bytes_from_coroutine + ), + ( + epc.EcephysProjectCache.from_lims, False, + "app_engine", HttpEngine, "http", "lims2", + write_from_stream + ) + ]) +def test_stream_asynchronous_arg_from_lims( + cache_constructor, asynchronous, engine_attr, expected_engine, + expected_scheme, expected_host, expected_stream_writer, + tmpdir_factory): + """ Ensure the proper stream engine is chosen from the `asynchronous` + argument in the EcephysProjectCache constructors (using other default + values).""" + tmpdir = str(tmpdir_factory.mktemp("test_stream_async_args")) + cache = cache_constructor( + asynchronous=asynchronous, + manifest=os.path.join(tmpdir, "manifest.json"), + lims_credentials=mock_lims_credentials) + engine = getattr(cache.fetch_api, engine_attr) + assert isinstance(engine, expected_engine) + assert cache.stream_writer is expected_stream_writer + assert engine.scheme == expected_scheme + assert engine.host == expected_host + + +@pytest.mark.parametrize( + ("cache_constructor, asynchronous, engine_attr, expected_engine," + "expected_scheme, expected_host, expected_stream_writer"), [ + ( + epc.EcephysProjectCache.from_warehouse, True, + "rma_engine", AsyncHttpEngine, "http", "api.brain-map.org", + write_bytes_from_coroutine + ), + ( + epc.EcephysProjectCache.from_warehouse, False, + "rma_engine", HttpEngine, "http", "api.brain-map.org", + write_from_stream + ) + ]) +def test_stream_asynchronous_arg_from_warehouse( + cache_constructor, asynchronous, engine_attr, expected_engine, + expected_scheme, expected_host, expected_stream_writer, + tmpdir_factory): + """ Ensure the proper stream engine is chosen from the `asynchronous` + argument in the EcephysProjectCache constructors (using other default + values).""" + tmpdir = str(tmpdir_factory.mktemp("test_stream_async_args")) + cache = cache_constructor( + asynchronous=asynchronous, + manifest=os.path.join(tmpdir, "manifest.json") + ) + engine = getattr(cache.fetch_api, engine_attr) + assert isinstance(engine, expected_engine) + assert cache.stream_writer is expected_stream_writer + assert engine.scheme == expected_scheme + assert engine.host == expected_host + + +def test_stream_writer_method_default_correct(tmpdir_factory): + """Checks that the stream_writer contained in the rma engine is used + when one is not supplied to the __init__ method. + """ + tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) + manifest = os.path.join(tmpdir, "manifest.json") + cache = epc.EcephysProjectCache(stream_writer=None, manifest=manifest) + assert cache.stream_writer == cache.fetch_api.rma_engine.write_bytes + +def test_default_timeout_from_warehouse(tmpdir_factory): + tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) + cache = epc.EcephysProjectCache.from_warehouse( + manifest=os.path.join(tmpdir, "manifest.json") + ) + assert cache.fetch_api.rma_engine.timeout == HTTP_ENGINE_DEFAULT_TIMEOUT + +def test_user_provided_timeout_from_warehouse(tmpdir_factory): + user_provided_timeout = 3 + tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) + cache = epc.EcephysProjectCache.from_warehouse( + manifest=os.path.join(tmpdir, "manifest.json"), + timeout = user_provided_timeout + ) + assert cache.fetch_api.rma_engine.timeout == user_provided_timeout diff --git a/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py b/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py new file mode 100644 index 0000000000..7a5f60af92 --- /dev/null +++ b/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py @@ -0,0 +1,16 @@ +import pytest + +from allensdk.brain_observatory.ecephys.ecephys_project_api import EcephysProjectFixedApi, MissingDataError + + +def test_get_sessions(): + api = EcephysProjectFixedApi() + with pytest.raises(MissingDataError) as err: + api.get_sessions() + + +def test_get_session_data(): + api = EcephysProjectFixedApi() + with pytest.raises(MissingDataError) as err: + api.get_session_data(12345) + assert re.compile("12345").search(err.message) is not None \ No newline at end of file diff --git a/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py b/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py new file mode 100644 index 0000000000..bb718ec574 --- /dev/null +++ b/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py @@ -0,0 +1,227 @@ +import os +import re +from unittest import mock + +import pytest +import pandas as pd +import numpy as np + +from allensdk.core.authentication import DbCredentials +from allensdk.brain_observatory.ecephys.ecephys_project_api import ( + ecephys_project_lims_api as epla, +) + +mock_lims_credentials = DbCredentials(dbname='mock_lims', user='mock_user', + host='mock_host', port='mock_port', + password='mock') + + +class MockSelector: + + def __init__(self, checks, response): + self.checks = checks + self.response = response + + def __call__(self, query, *args, **kwargs): + self.passed = {} + self.query = query + for name, check in self.checks.items(): + self.passed[name] = check(query) + return self.response + + +@pytest.mark.parametrize("method_name,kwargs,response,checks,expected", [ + [ + "get_units", + {}, + pd.DataFrame({"id": [5, 6], "something": [12, 14]}), + { + "no_pa_check": lambda st: "published_at" not in st + }, + pd.DataFrame( + {"something": [12, 14]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_units", + {"session_ids": [1, 2, 3]}, + pd.DataFrame({"id": [5, 6], "something": [12, 14]}), + { + "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"something": [12, 14]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_units", + {"unit_ids": [1, 2, 3]}, + pd.DataFrame({"id": [5, 6], "something": [12, 14]}), + { + "filters_units": lambda st: re.compile(r".+and eu.id in \(1,2,3\).*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"something": [12, 14]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_units", + {"channel_ids": [1, 2, 3], "probe_ids": [4, 5, 6]}, + pd.DataFrame({"id": [5, 6], "something": [12, 14]}), + { + "filters_channels": lambda st: re.compile(r".+and ec.id in \(1,2,3\).*", re.DOTALL).match(st) is not None, + "filters_probes": lambda st: re.compile(r".+and ep.id in \(4,5,6\).*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"something": [12, 14]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_units", + {"published_at": "2019-10-22"}, + pd.DataFrame({"id": [5, 6], "something": [12, 14]}), + { + "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, + "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"something": [12, 14]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_channels", + {"published_at": "2019-10-22", "session_ids": [1, 2, 3]}, + pd.DataFrame({"id": [5, 6], "something": [12, 14]}), + { + "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, + "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None, + "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"something": [12, 14]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_probes", + {"published_at": "2019-10-22", "session_ids": [1, 2, 3]}, + pd.DataFrame({"id": [5, 6], "something": [12, 14]}), + { + "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, + "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None, + "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"something": [12, 14]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_sessions", + {"published_at": "2019-10-22", "session_ids": [1, 2, 3]}, + pd.DataFrame({"id": [5, 6], "something": [12, 14], "genotype": ["foo", np.nan]}), + { + "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, + "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None, + "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"something": [12, 14], "genotype": ["foo", "wt"]}, + index=pd.Index(name="id", data=[5, 6]) + ) + ], + [ + "get_unit_analysis_metrics", + {"ecephys_session_ids": [1, 2, 3]}, + pd.DataFrame({"id": [5, 6], "data": [{"a": 1, "b": 2}, {"a": 3, "b": 4}], "ecephys_unit_id": [10, 11]}), + { + "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None + }, + pd.DataFrame( + {"id": [5, 6], "a": [1, 3], "b": [2, 4]}, + index=pd.Index(name="iecephys_unit_id", data=[10, 11]) + ) + ] +]) +def test_pg_query(method_name, kwargs, response, checks, expected): + + selector = MockSelector(checks, response) + + with mock.patch("allensdk.internal.api.psycopg2_select", new=selector) as ptc: + api = epla.EcephysProjectLimsApi.default(lims_credentials=mock_lims_credentials) + obtained = getattr(api, method_name)(**kwargs) + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + any_checks_failed = False + for name, result in ptc.passed.items(): + if not result: + print(f"check {name} failed") + any_checks_failed = True + + if any_checks_failed: + print(ptc.query) + assert not any_checks_failed + + +WKF_ID = 12345 +class MockPgEngine: + + def __init__(self, query_pattern): + self.query_pattern = query_pattern + + +class MockTemplatePgEngine(MockPgEngine): + + def select_one(self, rendered): + assert self.query_pattern.match(rendered) is not None + return {"well_known_file_id": WKF_ID} + + +class MockDataPgEngine(MockPgEngine): + def select(self, rendered): + assert self.query_pattern.match(rendered) is not None + return pd.DataFrame({"id": [WKF_ID]}) + + +class MockHttpEngine: + def stream(self, url): + assert url == f"well_known_files/download/{WKF_ID}?wkf_id={WKF_ID}" + + +@pytest.mark.parametrize("method,kwargs,query_pattern,pg_engine_cls", [ + [ + "get_natural_movie_template", + {"number": 12}, + re.compile(".+st.name = 'natural_movie_12'.+", re.DOTALL), + MockTemplatePgEngine + ], + [ + "get_natural_scene_template", + {"number": 12}, + re.compile(".+st.name = 'natural_scene_12'.+", re.DOTALL), + MockTemplatePgEngine + ], + [ + "get_probe_lfp_data", + {"probe_id": 53}, + re.compile(r".+and earp.ecephys_probe_id = 53.+", re.DOTALL), + MockDataPgEngine + ], + [ + "get_session_data", + {"session_id": 53}, + re.compile(r".+and ear.ecephys_session_id = 53.+", re.DOTALL), + MockDataPgEngine + ] +]) +def test_file_getter(method, kwargs, query_pattern, pg_engine_cls): + + api = epla.EcephysProjectLimsApi( + postgres_engine=pg_engine_cls(query_pattern), app_engine=MockHttpEngine() + ) + getattr(api, method)(**kwargs) \ No newline at end of file diff --git a/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py b/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py new file mode 100644 index 0000000000..1982d83868 --- /dev/null +++ b/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py @@ -0,0 +1,73 @@ +import pytest + +from allensdk.brain_observatory.ecephys.ecephys_project_api import ecephys_project_warehouse_api as epwa + +@pytest.mark.skipif(True, reason="broken test") +@pytest.mark.parametrize( + "method,conditions,expected_query", + [ + [ + "get_sessions", + {}, + ( + "criteria=model::EcephysSession" + ), + ], + [ + "get_sessions", + {"session_ids": [779839471, 759228117]}, + ( + "criteria=model::EcephysSession,rma::criteria[id$in779839471,759228117]" + ), + ], + [ + "get_sessions", + {"session_ids": [779839471, 759228117], "has_eye_tracking": True}, + ( + "criteria=model::EcephysSession,rma::criteria[id$in779839471,759228117][fail_eye_tracking$eqfalse]" + ), + ], + [ + "get_sessions", + {"session_ids": [779839471, 759228117], "has_eye_tracking": True, "stimulus_names": ["foo", "bar"]}, + ( + "criteria=model::EcephysSession,rma::criteria[id$in779839471,759228117][fail_eye_tracking$eqfalse][stimulus_name$in'foo','bar']" + ), + ], + [ + "get_probes", + {"session_ids": [797828357, 774875821], "probe_ids": [805579741, 792602660]}, + ( + "criteria=model::EcephysProbe,rma::criteria[id$in805579741,792602660][ecephys_session_id$in797828357,774875821]" + ), + ], + [ + "get_channels", + {"session_ids": [746083955], "probe_ids": [760647913], "channel_ids": [849734900]}, + ( + "criteria=model::EcephysChannel,rma::criteria[id$in849734900][ecephys_probe_id$in760647913],rma::criteria,ecephys_probe[ecephys_session_id$in746083955]" + ), + ], + [ + "get_units", + {"session_ids": [779839471], "probe_ids": [792645497], "channel_ids": [849709694], "unit_ids": [849710462]}, + ( + "criteria=model::EcephysUnit," + "rma::criteria[id$in849710462]," + "rma::criteria[ecephys_channel_id$in849709694]," + "rma::criteria,ecephys_channel(ecephys_probe[id$in792645497])," + "rma::criteria,ecephys_channel(ecephys_probe(ecephys_session[id$in779839471]))" + ), + ], + ], +) +def test_query(method, conditions, expected_query): + class MockRmaEngine: + def get_rma_tabular(self, rendered): + print(expected_query) + print(rendered) + assert expected_query == rendered + return [] + + api = epwa.EcephysProjectWarehouseApi(rma_engine=MockRmaEngine()) + results = getattr(api, method)(**conditions) diff --git a/test/brain_observatory/ecephys/test_ecephys_session.py b/test/brain_observatory/ecephys/test_ecephys_session.py new file mode 100644 index 0000000000..120a552f25 --- /dev/null +++ b/test/brain_observatory/ecephys/test_ecephys_session.py @@ -0,0 +1,555 @@ +import pytest +import pandas as pd +import numpy as np +import xarray as xr +import types + +from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi +from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession, nan_intervals, build_spike_histogram + + +@pytest.fixture +def raw_stimulus_table(): + return pd.DataFrame({ + 'start_time': np.arange(4)/2, + 'stop_time':np.arange(1, 5)/2, + 'stimulus_name':['a', 'a', 'a', 'a_movie'], + 'stimulus_block':[0, 0, 0, 1], + 'TF': np.empty(4) * np.nan, + 'SF':np.empty(4) * np.nan, + 'Ori': np.empty(4) * np.nan, + 'Contrast': np.empty(4) * np.nan, + 'Pos_x': np.empty(4) * np.nan, + 'Pos_y': np.empty(4) * np.nan, + 'stimulus_index': [0, 0, 1, 1], + 'Color': np.arange(4)*5.5, + 'Image': np.empty(4) * np.nan, + 'Phase': np.linspace(0, 180, 4), + "texRes": np.ones([4]) + }, index=pd.Index(name='id', data=np.arange(4))) + +@pytest.fixture +def raw_invalid_times_table(): + return pd.DataFrame({ + "start_time": [0.3, 1.1, 1.6], + "stop_time": [0.6, 1.54, 2.3], + "tags": + [ + ["EcephysSession", "739448407", "stimulus"], + ["EcephysProbe", "123448407", "probeA"], + ["EcephysProbe", "123448407", "all_probes"], + ] + }) + + +@pytest.fixture +def raw_spike_times(): + return { + 0: np.array([5, 6, 7, 8]), + 1: np.array([2.5]), + 2: np.array([1.01, 1.03, 1.02]) + } + + + +@pytest.fixture +def raw_mean_waveforms(): + return { + 0: np.zeros((3, 20)), + 1: np.zeros((3, 20)) + 1, + 2: np.zeros((3, 20)) + 2 + } + + +@pytest.fixture +def raw_channels(): + return pd.DataFrame({ + 'local_index': [0, 1, 2], + 'probe_horizontal_position': [5, 10, 15], + 'probe_id': [0, 0, 0], + 'probe_vertical_position': [10, 22, 33], + 'valid_data': [False, True, True] + }, index=pd.Index(name='channel_id', data=[0, 1, 2])) + + +@pytest.fixture +def raw_units(): + return pd.DataFrame({ + 'firing_rate': np.linspace(1, 3, 3), + 'isi_violations': [40, 0.5, 0.1], + 'local_index': [0, 0, 1], + 'peak_channel_id': [2, 1, 0], + 'quality': ['good', 'good', 'noise'], + 'snr': [0.1, 1.4, 10.0], + 'on_screen_rf': [True, False, True], + 'p_value_rf': [0.001, 0.01, 0.05] + }, index=pd.Index(name='unit_id', data=np.arange(3)[::-1])) + + +@pytest.fixture +def raw_probes(): + return pd.DataFrame({ + 'description': ['probeA', 'probeB'], + 'location': ['VISp', 'VISam'], + 'sampling_rate': [30000.0, 30000.0] + }, index=pd.Index(name='id', data=[0, 1])) + + +@pytest.fixture +def raw_lfp(): + return { + 0: xr.DataArray( + data=np.array([[1, 2, 3, 4, 5], + [6, 7, 8, 9, 10]]), + dims=['channel', 'time'], + coords=[[2, 1], np.linspace(0, 2, 5)] + ) + } + +@pytest.fixture +def just_stimulus_table_api(raw_stimulus_table): + class EcephysJustStimulusTableApi(EcephysSessionApi): + def get_stimulus_presentations(self): + return raw_stimulus_table + def get_invalid_times(self): + return pd.DataFrame() + return EcephysJustStimulusTableApi() + + +@pytest.fixture +def channels_table_api(raw_channels, raw_probes, raw_lfp, raw_stimulus_table): + class EcephysChannelsTableApi(EcephysSessionApi): + def get_channels(self): + return raw_channels + def get_probes(self): + return raw_probes + def get_lfp(self, pid): + return raw_lfp[pid] + def get_stimulus_presentations(self): + return raw_stimulus_table + def get_invalid_times(self): + return pd.DataFrame() + + return EcephysChannelsTableApi() + + +@pytest.fixture +def lfp_masking_api(raw_channels, raw_probes, raw_lfp, raw_stimulus_table, raw_invalid_times_table): + class EcephysMaskInvalidLFPApi(EcephysSessionApi): + def get_channels(self): + return raw_channels + def get_probes(self): + return raw_probes + def get_lfp(self, pid): + return raw_lfp[pid] + def get_stimulus_presentations(self): + return raw_stimulus_table + def get_invalid_times(self): + return raw_invalid_times_table + return EcephysMaskInvalidLFPApi() + + +@pytest.fixture +def units_table_api(raw_channels, raw_units, raw_probes): + class EcephysUnitsTableApi(EcephysSessionApi): + def get_channels(self): + return raw_channels + def get_units(self): + return raw_units + def get_probes(self): + return raw_probes + return EcephysUnitsTableApi() + +@pytest.fixture +def valid_stimulus_table_api(raw_stimulus_table,raw_invalid_times_table): + class EcephysValidStimulusTableApi(EcephysSessionApi): + def get_invalid_times(self): + return raw_invalid_times_table + def get_stimulus_presentations(self): + return raw_stimulus_table + return EcephysValidStimulusTableApi() + + +@pytest.fixture +def mean_waveforms_api(raw_mean_waveforms, raw_channels, raw_units, raw_probes): + class EcephysMeanWaveformsApi(EcephysSessionApi): + def get_mean_waveforms(self): + return raw_mean_waveforms + def get_channels(self): + return raw_channels + def get_units(self): + return raw_units + def get_probes(self): + return raw_probes + return EcephysMeanWaveformsApi() + + +@pytest.fixture +def spike_times_api(raw_units, raw_channels, raw_probes, raw_stimulus_table, raw_spike_times): + class EcephysSpikeTimesApi(EcephysSessionApi): + def get_spike_times(self): + return raw_spike_times + def get_channels(self): + return raw_channels + def get_units(self): + return raw_units + def get_probes(self): + return raw_probes + def get_stimulus_presentations(self): + return raw_stimulus_table + + def get_invalid_times(self): + return pd.DataFrame() + + return EcephysSpikeTimesApi() + + +def get_no_spikes_times(self): + # A special method used for testing cases when there are no spikes for a given session, will be swapped out for + # get_spike_times() + return { + 0: np.array([]), + 1: np.array([]), + 2: np.array([]) + } + + +@pytest.fixture +def session_metadata_api(): + class EcephysSessionMetadataApi(EcephysSessionApi): + def get_ecephys_session_id(self): + return 12345 + return EcephysSessionMetadataApi() + + +def test_get_stimulus_epochs(just_stimulus_table_api): + + expected = pd.DataFrame({ + "start_time": [0, 3/2], + "stop_time": [3/2, 2], + "duration": [3/2, 1/2], + "stimulus_name": ["a", "a_movie"], + "stimulus_block": [0, 1] + }) + + session = EcephysSession(api=just_stimulus_table_api) + obtained = session.get_stimulus_epochs() + + print(expected) + print(obtained) + + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + +def test_get_invalid_times(valid_stimulus_table_api, raw_invalid_times_table): + + expected = raw_invalid_times_table + + session = EcephysSession(api=valid_stimulus_table_api) + + obtained = session.get_invalid_times() + + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + +def test_get_stimulus_presentations(valid_stimulus_table_api): + + expected = pd.DataFrame({ + "start_time": [0, 1/2, 1, 3/2], + "stop_time": [1/2, 1, 3/2, 2], + "stimulus_name": ['invalid_presentation', 'invalid_presentation', 'a', 'a_movie'], + "phase": [np.nan, np.nan, 120.0, 180.0] + }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3])) + + session = EcephysSession(api=valid_stimulus_table_api) + obtained = session.stimulus_presentations[["start_time", "stop_time", "stimulus_name", "phase"]] + + print(expected) + print(obtained) + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + +def test_get_stimulus_presentations_no_invalid_times(just_stimulus_table_api): + + expected = pd.DataFrame({ + "start_time": [0, 1/2, 1, 3/2], + "stop_time": [1/2, 1, 3/2, 2], + 'stimulus_name': ['a', 'a', 'a', 'a_movie'], + + }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3])) + + session = EcephysSession(api=just_stimulus_table_api) + + obtained = session.stimulus_presentations[["start_time", "stop_time", "stimulus_name"]] + print(expected) + print(obtained) + + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + +def test_session_metadata(session_metadata_api): + session = EcephysSession(api=session_metadata_api) + + assert 12345 == session.ecephys_session_id + + +def test_build_stimulus_presentations(just_stimulus_table_api): + expected_columns = [ + 'start_time', 'stop_time', 'stimulus_name', 'stimulus_block', + 'temporal_frequency', 'spatial_frequency', 'orientation', 'contrast', + 'x_position', 'y_position', 'color', 'frame', 'phase', 'duration', "stimulus_condition_id" + ] + + session = EcephysSession(api=just_stimulus_table_api) + obtained = session.stimulus_presentations + + print(obtained.head()) + print(obtained.columns) + + assert set(expected_columns) == set(obtained.columns) + assert 'stimulus_presentation_id' == obtained.index.name + assert 4 == obtained.shape[0] + + +def test_build_mean_waveforms(mean_waveforms_api): + session = EcephysSession(api=mean_waveforms_api) + obtained = session.mean_waveforms + + assert np.allclose(np.zeros((3, 20)) + 2, obtained[2]) + assert np.allclose(np.zeros((3, 20)) + 1, obtained[1]) + + +def test_build_units_table(units_table_api): + session = EcephysSession(api=units_table_api) + obtained = session.units + + assert 3 == session.num_units + assert np.allclose([10, 22, 33], obtained['probe_vertical_position']) + assert np.allclose([0, 1, 2], obtained.index.values) + assert np.allclose([0.05, 0.01, 0.001], obtained['p_value_rf'].values) + + +def test_presentationwise_spike_counts(spike_times_api): + session = EcephysSession(api=spike_times_api) + obtained = session.presentationwise_spike_counts(np.linspace(-.1, .1, 3), session.stimulus_presentations.index.values, session.units.index.values) + + first = obtained.loc[{'unit_id': 2, 'stimulus_presentation_id': 2}] + assert np.allclose([0, 3], first) + + second = obtained.loc[{'unit_id': 1, 'stimulus_presentation_id': 3}] + assert np.allclose([0, 0], second) + + assert np.allclose([4, 2, 3], obtained.shape) + + +@pytest.mark.parametrize("spike_times,time_domain,expected", [ + [ + {1: [1.5, 2.5]}, + [[1, 2, 3, 4], [1.1, 2.1, 3.1, 4.1]], + np.array([[1, 1, 0], [1, 1, 0]])[:, :, None] + ], + [ + {1: [1.5, 2.5]}, + [[1, 2, 3, 4], [1.6, 2.0, 4.0, 4.1]], + np.array([[1, 1, 0], [0, 1, 0]])[:, :, None] + ], + [ + {1: [1.5, 2.5], 2: [1.5, 2.5]}, + [[1, 2, 3, 4], [1.6, 2.0, 4.0, 4.1]], + np.stack(([[1, 1, 0], [0, 1, 0]], [[1, 1, 0], [0, 1, 0]]), axis=2) + ] +, + [ + {1: [1.5, 2.5], 2: [1.5, 1.55]}, + [[1, 2, 3, 4], [1.6, 2.0, 4.0, 4.1]], + np.stack(([[1, 1, 0], [0, 1, 0]], [[2, 0, 0], [0, 0, 0]]), axis=2) + ] +]) +@pytest.mark.parametrize("binarize", [True, False]) +def test_build_spike_histogram(spike_times, time_domain, expected, binarize): + + unit_ids = [k for k in spike_times.keys()] + obtained = build_spike_histogram(time_domain, spike_times, unit_ids, binarize=binarize) + + expected = np.array(expected) + if binarize: + expected[expected > 0] = 1 + + print(expected - obtained) + assert np.allclose(expected, obtained) + + +def test_presentationwise_spike_times(spike_times_api): + session = EcephysSession(api=spike_times_api) + obtained = session.presentationwise_spike_times(session.stimulus_presentations.index.values, session.units.index.values) + + expected = pd.DataFrame({ + 'unit_id': [2, 2, 2], + 'stimulus_presentation_id': [2, 2, 2, ], + 'time_since_stimulus_presentation_onset': [0.01, 0.02, 0.03] + }, index=pd.Index(name='spike_time', data=[1.01, 1.02, 1.03])) + + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + +def test_empty_presentationwise_spike_times(spike_times_api): + # Test that when there are no spikes presentationwise_spike_times doesn't fail and instead returns a empty dataframe + spike_times_api.get_spike_times = types.MethodType(get_no_spikes_times, spike_times_api) + session = EcephysSession(api=spike_times_api) + obtained = session.presentationwise_spike_times(session.stimulus_presentations.index.values, + session.units.index.values) + assert(isinstance(obtained, pd.DataFrame)) + assert(obtained.empty) + + +def test_conditionwise_spike_statistics(spike_times_api): + session = EcephysSession(api=spike_times_api) + obtained = session.conditionwise_spike_statistics(stimulus_presentation_ids=[0, 1, 2]) + + pd.set_option('display.max_columns', None) + + assert obtained.loc[(2, 2), "spike_count"] == 3 + assert obtained.loc[(2, 2), "stimulus_presentation_count"] == 1 + + +def test_conditionwise_spike_statistics_using_rates(spike_times_api): + session = EcephysSession(api=spike_times_api) + obtained = session.conditionwise_spike_statistics(stimulus_presentation_ids=[0, 1, 2], use_rates=True) + + pd.set_option('display.max_columns', None) + assert np.allclose([0, 0, 6], obtained["spike_mean"].values) + + +def test_empty_conditionwise_spike_statistics(spike_times_api): + # special case when there are no spikes + spike_times_api.get_spike_times = types.MethodType(get_no_spikes_times, spike_times_api) + session = EcephysSession(api=spike_times_api) + obtained = session.conditionwise_spike_statistics( + stimulus_presentation_ids=session.stimulus_presentations.index.values, + unit_ids=session.units.index.values + ) + assert(len(obtained) == 12) + assert(not np.any(obtained['spike_count'])) # check all spike_counts are 0 + assert(not np.any(obtained['spike_mean'])) # spike_means are 0 + assert(np.all(np.isnan(obtained['spike_std']))) # std/sem will be undefined + assert(np.all(np.isnan(obtained['spike_sem']))) + + +def test_get_stimulus_parameter_values(just_stimulus_table_api): + session = EcephysSession(api=just_stimulus_table_api) + obtained = session.get_stimulus_parameter_values() + + expected = { + 'color': [0, 5.5, 11, 16.5], + 'phase': [0, 60, 120, 180] + } + + for k, v in expected.items(): + assert np.allclose(v, obtained[k]) + assert len(expected) == len(obtained) + + +@pytest.mark.parametrize("detailed", [True, False]) +def test_get_stimulus_table(detailed, just_stimulus_table_api, raw_stimulus_table): + session = EcephysSession(api=just_stimulus_table_api) + obtained = session.get_stimulus_table(['a'], include_detailed_parameters=detailed) + + expected_columns = ['start_time', 'stop_time', 'stimulus_name', 'stimulus_block', 'Color', 'Phase'] + if detailed: + expected_columns.append("texRes") + expected = raw_stimulus_table.loc[:2, expected_columns] + + expected['duration'] = expected['stop_time'] - expected['start_time'] + expected["stimulus_condition_id"] = [0, 1, 2] + expected.rename(columns={"Color": "color", "Phase": "phase"}, inplace=True) + + print(expected) + print(obtained) + + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + +def test_filter_owned_df(just_stimulus_table_api): + session = EcephysSession(api=just_stimulus_table_api) + ids = [0, 2] + obtained = session._filter_owned_df('stimulus_presentations', ids) + + assert np.allclose([0, 120], obtained['phase'].values) + + +def test_filter_owned_df_scalar(just_stimulus_table_api): + session = EcephysSession(api=just_stimulus_table_api) + ids = 3 + + obtained = session._filter_owned_df('stimulus_presentations', ids) + assert obtained['phase'].values[0] == 180 + + +def test_build_inter_presentation_intervals(just_stimulus_table_api): + session = EcephysSession(api=just_stimulus_table_api) + obtained = session.inter_presentation_intervals + + expected = pd.DataFrame({ + 'interval': [0, 0, 0] + }, index=pd.MultiIndex( + levels=[[0, 1, 2], [1, 2, 3]], + codes=[[0, 1, 2], [0, 1, 2]], + names=['from_presentation_id', 'to_presentation_id'] + ) + ) + + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + +def test_get_inter_presentation_intervals_for_stimulus(just_stimulus_table_api): + session = EcephysSession(api=just_stimulus_table_api) + obtained = session.get_inter_presentation_intervals_for_stimulus('a') + + expected = pd.DataFrame({ + 'interval': [0, 0] + }, index=pd.MultiIndex( + levels=[[0, 1], [1, 2]], + codes=[[0, 1], [0, 1]], + names=['from_presentation_id', 'to_presentation_id'] + ) + ) + + pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) + + +def test_get_lfp(channels_table_api): + session = EcephysSession(api=channels_table_api) + obtained = session.get_lfp(0) + + expected = xr.DataArray( + data=np.array([[1, 2, 3, 4, 5], + [6, 7, 8, 9, 10]]), + dims=['channel', 'time'], + coords=[[2, 1], np.linspace(0, 2, 5)] + ) + + xr.testing.assert_equal(expected, obtained) + + +def test_get_lfp_mask_invalid(lfp_masking_api): + session = EcephysSession(api=lfp_masking_api) + obtained = session.get_lfp(0) + + expected = xr.DataArray( + data=np.array([[1, 2, 3, np.nan, np.nan], + [6, 7, 8, np.nan, np.nan]]), + dims=['channel', 'time'], + coords=[[2, 1], np.linspace(0, 2, 5)] + ) + print(expected) + print(obtained) + + xr.testing.assert_equal(expected, obtained) + + +@pytest.mark.parametrize("inp,expected", [ + [[np.nan, np.nan, 4, 4, 4, 5, 5], [0, 2, 5, 7]] +]) +def test_nan_intervals(inp, expected): + assert np.allclose( + expected, nan_intervals(inp) + ) diff --git a/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py b/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py new file mode 100644 index 0000000000..bf0a65dc5d --- /dev/null +++ b/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py @@ -0,0 +1,30 @@ +# most of the tests for this functionality are actually in test_write_nwb + +import warnings + +import h5py +import pytest +import pandas as pd + +import allensdk.brain_observatory.ecephys.ecephys_session_api.ecephys_nwb_session_api as ensa + + +@pytest.mark.parametrize("left,right,expected,left_on,right_on", [ + [ + pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3]}), + pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6], "c": [7, 8, 9]}), + pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6], "c": [7, 8, 9]}), + "a", + "a" + ], + [ + pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3]}), + pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3], "c": [7, 8, 9]}), + pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3], "c": [7, 8, 9]}), + ["a", "b"], + ["a", "b"] + ] +]) +def test_clobbering_merge(left, right, expected, left_on, right_on): + obtained = ensa.clobbering_merge(left, right, left_on=left_on, right_on=left_on) + pd.testing.assert_frame_equal(expected, obtained, check_like=True) \ No newline at end of file diff --git a/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py b/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py new file mode 100644 index 0000000000..7445cc78c8 --- /dev/null +++ b/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py @@ -0,0 +1,70 @@ +from unittest import mock + +import pytest +import numpy as np +import h5py + +from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import EcephysSyncDataset + + +@pytest.mark.parametrize('expected', [1, None]) +def test_sample_frequency(expected): + dataset = EcephysSyncDataset() + dataset.meta_data = {'ni_daq': {}} + + dataset.sample_frequency = expected + assert dataset.sample_frequency == expected + assert dataset.sample_frequency == dataset.meta_data['ni_daq']['counter_output_freq'] + + +@pytest.mark.parametrize('key,line_labels,led_vals', [ + [ 'foo', ('LED_sync',), np.array([1, 2, 3]) ], + [ 'LED_sync', ('LED_sync',), np.array([1, 2, 3]) ], +]) +def test_extract_led_times(key, line_labels, led_vals): + + dataset = EcephysSyncDataset() + dataset.line_labels = line_labels + dataset.sample_frequency = 1000 + + with mock.patch('allensdk.brain_observatory.sync_dataset.Dataset.get_all_times', return_value=led_vals) as p: + with mock.patch("allensdk.brain_observatory.sync_dataset.Dataset.get_bit_changes", return_value=np.ones_like(led_vals)) as q: + obtained = dataset.extract_led_times(key) + + if key in line_labels: + q.assert_called_once_with(0) + else: + q.assert_called_with(18) + + assert np.allclose(obtained, led_vals) + + +@pytest.mark.parametrize('photodiode_times,vsyncs,cycle,expected', [ + [ # expected timing, using vsyncs + np.arange(5.0, 5 + (100 * 0.75), 0.75), + np.arange(5.0, 5 + (298 * 0.25), 0.25) - 0.0625 * np.random.rand(298), # num frames is (num_vsyncs - 1) * cycle + 1 + 3, + np.arange(5.0, 5 + (298 * 0.25), 0.25) + ] +]) +def test_extract_frame_times_from_photodiode(photodiode_times, vsyncs, cycle, expected): + + class TimesWrapper: + def __call__(self, ignore, keys): + if 'photodiode' in keys: + return photodiode_times + elif 'frames' in keys: + return vsyncs + + dataset = EcephysSyncDataset() + with mock.patch('allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset.EcephysSyncDataset.get_edges', new_callable=TimesWrapper) as p: + obtained = dataset.extract_frame_times_from_photodiode(photodiode_cycle=cycle) + assert np.allclose(obtained, expected) + + + +def test_factory(): + + with mock.patch('allensdk.brain_observatory.sync_dataset.Dataset.load') as p: + dataset = EcephysSyncDataset.factory('foo') + p.assert_called_with('foo') \ No newline at end of file diff --git a/test/brain_observatory/ecephys/test_http_engine.py b/test/brain_observatory/ecephys/test_http_engine.py new file mode 100644 index 0000000000..296a9ee0d1 --- /dev/null +++ b/test/brain_observatory/ecephys/test_http_engine.py @@ -0,0 +1,115 @@ +import os + +import mock +import requests +import pytest + +from allensdk.brain_observatory.ecephys.ecephys_project_api import ( + http_engine +) + + +class MockResponse: + + @property + def headers(self): + return {"Content-length": 10 * 1024 ** 2} + + def iter_content(self, chunksize): + for ii in range(5): + yield f"{ii}_{chunksize}_".encode() + + +def test_stream(): + engine = http_engine.HttpEngine( + scheme="http", + host="api.brain-map.org/api/v2" + ) + + with mock.patch("requests.get", return_value=MockResponse()) as p: + + results = [item for item in engine.stream("fish")] + + p.assert_called_once_with( + "http://api.brain-map.org/api/v2/fish", stream=True + ) + + assert f"3_{engine.chunksize}_" == results[3].decode() + +def test_stream_timeout(): + engine = http_engine.HttpEngine( + scheme="http", + host="api.brain-map.org/api/v2", + timeout=0 + ) + + with mock.patch("requests.get", return_value=MockResponse()): + with pytest.raises(requests.Timeout): + for item in engine.stream("fish"): + pass + + +def test_stream_to_file(tmpdir_factory): + + tmpdir = str(tmpdir_factory.mktemp("stream_test")) + path = os.path.join(tmpdir, "look_at_this_file") + + engine = http_engine.HttpEngine( + scheme="http", + host="api.brain-map.org/api/v2", + chunksize="hi" + ) + + with mock.patch("requests.get", return_value=MockResponse()) as p: + + stream = engine.stream("fish") + http_engine.write_from_stream(path, stream) + + with open(path, "r") as fil: + assert "0_hi_1_hi_2_hi_3_hi_4_hi_" == fil.read() + + +class MockAsyncSession: + def get(self, url): + return MockAsyncResponse() + + +class MockAsyncResponse: + + async def __aenter__(self): + return self + + async def __aexit__(self, *a): + return self + + def __await__(self): + return self + + @property + def content(self): + return MockAsyncContent() + + +class MockAsyncContent: + + async def iter_chunked(self, chunksize): + for ii in range(10): + yield (f"{ii}".encode()) + + +def test_async_stream_to_file(tmpdir_factory): + engine = http_engine.AsyncHttpEngine( + scheme="http", + host="api.brain.map.org/api/v2", + session=MockAsyncSession() + ) + + tmpdir = str(tmpdir_factory.mktemp("async_stream_test")) + path = os.path.join(tmpdir, "one_two.three") + + stream = engine.stream("foo") + http_engine.write_bytes_from_coroutine(path, stream) + + with open(path, "r") as fil: + assert "0123456789" == fil.read() + diff --git a/test/brain_observatory/ecephys/test_lfp_subsampling.py b/test/brain_observatory/ecephys/test_lfp_subsampling.py new file mode 100644 index 0000000000..b66939f8c2 --- /dev/null +++ b/test/brain_observatory/ecephys/test_lfp_subsampling.py @@ -0,0 +1,108 @@ +import pytest +import itertools +import numpy as np +import logging + +import allensdk.brain_observatory.ecephys.lfp_subsampling.subsampling as subsampling + + +@pytest.mark.parametrize('total_channels', [100, 384]) +@pytest.mark.parametrize('surface_offset', [-20, -50]) +@pytest.mark.parametrize('surface_padding', [10, 20]) +@pytest.mark.parametrize('start_channel_offset', [0, 1, 2]) +@pytest.mark.parametrize('channel_stride', [1, 2, 4, 10]) +def test_select_channels(total_channels, surface_offset, surface_padding, start_channel_offset, channel_stride): + input_channels = np.arange(start_channel_offset, total_channels + surface_offset + surface_padding) + selected, actual = subsampling.select_channels(total_channels=total_channels, + surface_channel=total_channels + surface_offset, + surface_padding=surface_padding, + start_channel_offset=start_channel_offset, + channel_stride=channel_stride, + channel_order=np.arange(total_channels)) + + assert np.allclose(selected, actual) + assert len(selected) == len(input_channels[::channel_stride]) + + +@pytest.mark.parametrize('remove_references', [True, False]) +@pytest.mark.parametrize('reference_channels', [np.array([0, 1, 2]), np.array([9, 10, 11]), np.array([10, 11, 12])]) +@pytest.mark.parametrize('remove_noisy_channels', [True, False]) +@pytest.mark.parametrize('noisy_channels', [np.array([10, 11, 12])]) +def test_select_channels_filtered(remove_references, reference_channels, remove_noisy_channels, noisy_channels): + """Similar to test above but focused on ability to remove reference """ + total_channels = 100 + surface_offset = -20 + start_channel_offset = 0 + channel_stride = 1 + surface_padding = 10 + + selected, actual = subsampling.select_channels(total_channels=total_channels, + surface_channel=total_channels + surface_offset, + surface_padding=surface_padding, + start_channel_offset=start_channel_offset, + channel_stride=channel_stride, + channel_order=np.arange(total_channels), + noisy_channels=noisy_channels, + remove_noisy_channels=remove_noisy_channels, + reference_channels=reference_channels, + remove_references=remove_references) + + assert np.allclose(selected, actual) + removed_channels = set() + if remove_noisy_channels: + assert(not np.any(np.isin(noisy_channels, selected))) + removed_channels |= set(noisy_channels) + + if remove_references: + assert(not np.any(np.isin(reference_channels, selected))) + removed_channels |= set(reference_channels) + + input_channels = np.arange(start_channel_offset, total_channels + surface_offset + surface_padding) + assert(len(selected) == len(input_channels) - len(removed_channels)) + + +@pytest.mark.parametrize('array_length', [50]) # , 150, 2001]) +@pytest.mark.parametrize('subsampling_factor', [1]) # , 2, 4, 10]) +def test_subsample_timestamps(subsampling_factor, array_length): + timestamps = np.linspace(0, 50, array_length) + ts_subsampled = subsampling.subsample_timestamps(timestamps, subsampling_factor) + + assert len(ts_subsampled) == np.ceil(len(timestamps) / subsampling_factor) + + +def test_subsample_lfp(): + lfp_raw = np.zeros((100, 100)) + selected_channels = np.arange(0, 50, 5) + subsampling_factor = 2 + lfp_subsampled = subsampling.subsample_lfp(lfp_raw, selected_channels, subsampling_factor) + + assert lfp_subsampled.shape == (50, 10) + + +def test_remove_lfp_offset(): + lfp_raw = np.zeros((2500, 100)) + 10 + lfp_filtered = subsampling.remove_lfp_offset(lfp_raw, 2500.0, 0.1, 1) + + assert np.max(lfp_filtered) < 1e-10 + + +def test_remove_lfp_noise(): + lfp_raw = np.zeros((2500, 100)) + lfp_raw[:, -10:] = 1 + channel_numbers = np.arange(100) + lfp_noise_removed = subsampling.remove_lfp_noise(lfp_raw, 90, channel_numbers) + + # TODO: This is not safe, try using set to assure that the removed noise contains only -1 and 0's + assert np.array_equal(np.unique(lfp_noise_removed), np.array([-1, 0])) + + +if __name__ == '__main__': + logging.basicConfig() + logging.getLogger('ecephys_pipeline.modules.lfp_subsampling').setLevel(logging.INFO) + for tc, so, sp, sco, cs in itertools.product([100, 384], [-20, -50], [10, 20], [0, 1, 2], [1, 2, 4, 10]): + test_select_channels(total_channels=tc, surface_offset=so, surface_padding=sp, start_channel_offset=sco, + channel_stride=cs) + test_subsample_timestamps(subsampling_factor=1, array_length=50) + test_subsample_lfp() + test_remove_lfp_offset() + test_remove_lfp_noise() diff --git a/test/brain_observatory/ecephys/test_rma_engine.py b/test/brain_observatory/ecephys/test_rma_engine.py new file mode 100644 index 0000000000..1f29a2b9ec --- /dev/null +++ b/test/brain_observatory/ecephys/test_rma_engine.py @@ -0,0 +1,32 @@ +import pytest +import pandas as pd +import numpy as np + +import allensdk.brain_observatory.ecephys.ecephys_project_api.rma_engine as rma_engine + + +@pytest.mark.parametrize("dataframe,expected_types", [ + [ + pd.DataFrame({ + "a": ["1", "2", "3"], + "b": ["a", "1", "2"] + }), + {"a": np.dtype("int64"), "b": np.dtype("O")} + ], + [ + pd.DataFrame({ + "a": ["1", "2.4", "3"], + "b": ["a", "1", "2"] + }), + {"a": float, "b": np.dtype("O")} + ] +]) +def test_infer_column_types(dataframe, expected_types): + + obtained = rma_engine.infer_column_types(dataframe) + obtained_types = {colname: obtained[colname].dtype for colname in obtained.columns} + + assert(set(expected_types.keys()) == set(obtained_types.keys())) + + for key, value in expected_types.items(): + assert np.dtype(value) == np.dtype(obtained_types[key]) diff --git a/test/brain_observatory/ecephys/test_stim_file.py b/test/brain_observatory/ecephys/test_stim_file.py new file mode 100644 index 0000000000..8510b6fe22 --- /dev/null +++ b/test/brain_observatory/ecephys/test_stim_file.py @@ -0,0 +1,67 @@ +import pickle +import operator as op +import os + +import pytest +import numpy as np + +from allensdk.brain_observatory.ecephys.file_io import stim_file as stim_file + + +# ideally these would be fixtures, but I want to parametrize over them +def stim_pkl_data(): + return { + 'fps': 1000, + 'pre_blank_sec': 20, + 'stimuli': [{'a': 1}, {'a': 1}], + 'items': { + 'foraging': { + 'encoders': [ + { + 'dx': [1, 2, 3] + } + ] + } + } + } + + +def stim_pkl_data_toplevel_dx(): + return { + 'fps': 1000, + 'pre_blank_sec': 20, + 'dx': [1, 2, 3], + 'stimuli': [{'a': 1}, {'a': 1}], + 'items': { + 'foraging': { + 'encoders': [] + } + } + } + + +@pytest.fixture(params=[stim_pkl_data, stim_pkl_data_toplevel_dx]) +def stim_pkl_on_disk(tmpdir_factory, request): + tmpdir = str(tmpdir_factory.mktemp('stim_files')) + file_path = os.path.join(tmpdir, 'stim.pkl') + + with open(file_path, 'wb') as pkl_file: + pickle.dump(request.param(), pkl_file) + + return file_path + + +@pytest.fixture +def camstimone_pickle_stim_file(stim_pkl_on_disk): + return stim_file.CamStimOnePickleStimFile.factory(stim_pkl_on_disk) + + +@pytest.mark.parametrize('prop_name,expected,comp', [ + ['frames_per_second', 1000, op.eq], + ['pre_blank_sec', 20, op.eq], + ['angular_wheel_rotation', [1, 2, 3], np.allclose], + ['angular_wheel_velocity', [1000, 2000, 3000], np.allclose] +]) +def test_properties(camstimone_pickle_stim_file, prop_name, expected, comp): + obtained = getattr(camstimone_pickle_stim_file, prop_name) + assert comp(obtained, expected) \ No newline at end of file diff --git a/test/brain_observatory/ecephys/test_stimulus_sync.py b/test/brain_observatory/ecephys/test_stimulus_sync.py new file mode 100644 index 0000000000..c285d248db --- /dev/null +++ b/test/brain_observatory/ecephys/test_stimulus_sync.py @@ -0,0 +1,178 @@ +from functools import partial + +import pytest +import numpy as np + +from allensdk.brain_observatory.ecephys import stimulus_sync + + +# manual test cases for compute_frame_times, allocate_by_vsync, assign_to_last +@pytest.mark.parametrize('photodiode_times,frame_duration,num_frames,cycle,vsyncs,expected', [ + [ # super basic, no vsyncs, no bad frames + np.linspace(5, 30.0, 11), 0.25, 100, 10, None, + [ + np.arange(5, 30, 0.25), + np.arange(5.25, 30.25, 0.25) + ] + ], + [ # also no bad frames + np.array([5, 5.75, 6.5, 7.25]), 0.25, 9, 3, None, + [ + np.array([5, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0]), + np.array([5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25 ]), + ] + ], + [ # now add in a long-short, using the append_to_last rule + np.array([5, 5.75, 6.75, 7.25, 8.0]), 0.25, 12, 3, None, + [ + np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.75, 7.00, 7.25, 7.25, 7.50, 7.75]), + np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.75, 7.00, 7.25, 7.25, 7.50, 7.75, 8.00]), + ] + ], + [ # expected timing, using vsyncs + np.array([5, 5.75, 6.5, 7.25, 8.0]), 0.25, 12, 3, + np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4 , 6.65, 6.9 , 7.15, 7.4 , 7.65, 7.9]), + [ + np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.0, 7.25, 7.50, 7.75]), + np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.0, 7.25, 7.50, 7.75, 8.00]) + ] + ], + [ # classic extra frame case + np.array([5, 5.75, 6.5, 7.5, 8.25]), 0.25, 12, 3, + np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4 , 6.65, 7.15, 7.4 , 7.65, 7.9 , 8.15]), + [ + np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.25, 7.50, 7.75, 8.00]), + np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.25, 7.50, 7.75, 8., 8.25]) + ] + ], + [ # long-short, using vsyncs + np.array([5, 5.75, 6.5, 7.50, 8.0]), 0.25, 12, 3, + np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4 , 6.9 , 7.15, 7.4, 7.4, 7.65, 7.9]), + [ + np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 7.0, 7.25, 7.50, 7.50, 7.75]), + np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 7.0, 7.25, 7.50, 7.50, 7.75, 8.00]) + ] + ], + [ # only short, using vsyncs + np.array([5, 5.75, 6.5, 7.0, 7.75]), 0.25, 12, 3, + np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4, 6.65, 6.65, 6.9, 7.15, 7.4 , 7.65, 7.9]), + [ + np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 6.75, 7.0, 7.25, 7.50]), + np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 6.75, 7.0, 7.25, 7.50, 7.75]) + ] + ], +]) +def test_compute_frame_times(photodiode_times, frame_duration, num_frames, cycle, vsyncs, expected): + + if vsyncs is not None: + cb = partial(stimulus_sync.allocate_by_vsync, np.diff(vsyncs)) + else: + cb = stimulus_sync.assign_to_last + + obt_indices, obt_starts, obt_ends = stimulus_sync.compute_frame_times(photodiode_times, frame_duration, num_frames, cycle, cb) + assert(np.allclose(obt_indices, np.arange(num_frames))) + assert np.allclose(obt_starts, expected[0]) + assert np.allclose(obt_ends, expected[1]) + + +@pytest.mark.parametrize('process,pctiles', [ + [partial(np.random.rand, 1000), (5, 95)], + [partial(np.random.rand, 1000), (45, 55)] +]) +def test_trimmed_stats(process, pctiles): + + data = np.sort(process()) + true_mean = np.mean(data) + true_std = np.std(data) + + lower_missing = pctiles[0] + upper_missing = 100 - pctiles[1] + total_missing = lower_missing + upper_missing + fraction_lower = lower_missing / total_missing + + num_missing = (data.size * total_missing / 100) / ( 1 - total_missing / 100 ) + num_missing_lower = int(np.around( num_missing * fraction_lower )) + num_missing_upper = int(np.around( num_missing * ( 1 - fraction_lower ) )) + + data = np.concatenate([ + data, + np.zeros(num_missing_lower) - 1000, + np.zeros(num_missing_upper) + 1000 + ]) + + obt_mean, obt_std = stimulus_sync.trimmed_stats(data, pctiles=pctiles) + assert obt_mean == true_mean + assert obt_std == true_std + + +@pytest.mark.parametrize('pd_times,vs_times, expected', [ + [ [1, 2, 3, 4, 5], [1.8, 3, 4], [2, 3, 4] ] +]) +def test_trim_border_pulses(pd_times, vs_times, expected): + obtained = stimulus_sync.trim_border_pulses(pd_times, vs_times) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize('base,effect', [ + [ np.arange(20, dtype=float), [0.25, -0.25] ], + [ np.arange(20, dtype=float), [0.25, -0.25] ], + # [ np.arange(20, dtype=float), [0.25, -0.4] ], misses for assymmetric cases + # [ np.arange(20, dtype=float), [0.4, -0.25] ] +]) +def test_correct_on_off_effects(base, effect): + impacted = base.copy() + impacted[::2] += effect[0] + impacted[1::2] += effect[1] + + + obtained = stimulus_sync.correct_on_off_effects(impacted) + assert np.allclose(base, obtained) + + +@pytest.mark.parametrize('pd_times,ndevs,expected_mask', [ + [ [1, 2, 3, 9, 10, 11, 12], 4, [1, 1, 0, 0, 1, 1, 1] ], + [ [1.03, 2.10, 2.99, 8.9, 10.0, 11.1, 11.98], 10, [1, 1, 0, 0, 1, 1, 1] ] +]) +def test_flag_unexpected_edges(pd_times, ndevs, expected_mask): + + obtained_mask = stimulus_sync.flag_unexpected_edges(pd_times, ndevs) + assert np.allclose(obtained_mask, expected_mask) + + +@pytest.mark.parametrize('pd_times,ndevs,cycle,max_offset,expected', [ + [ [0, 1, 2, 3, 4, 9, 10, 11], 10, 60, 5, np.arange(12) ], + [ + np.concatenate([[0, 1, 2, 3, 3.95, 4, 4.1, 4.7, 9, 10, 11], np.arange(12, 1000)]), + 0.1, 60, 5, + np.arange(1000) + ] +]) +def test_fix_unexpected_edges(pd_times, ndevs, cycle, max_offset, expected): + obtained = stimulus_sync.fix_unexpected_edges(pd_times, ndevs, cycle, max_offset) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize('pd_times,cycle,expected', [ + [ [0, 1, 2, 3, 4, 5.1, 6, 7, 8], 1, 1] +]) +def test_estimate_frame_duration(pd_times, cycle, expected): + obtained = stimulus_sync.estimate_frame_duration(pd_times, cycle) + assert obtained == expected + + +@pytest.mark.parametrize('ends,frame_duration,irregularity,expected', [ + [ np.arange(20, dtype=float), 0.5, 1, np.concatenate([np.arange(19), [19.5]]) ] +]) +def test_assign_to_last(ends, frame_duration, irregularity, expected): + _, obt_ends = stimulus_sync.assign_to_last(None, None, ends, frame_duration, irregularity, None) + assert np.allclose(obt_ends, expected) + + +@pytest.mark.parametrize('vs_diff,index,starts,ends,frame_duration,irregularity,cycle,expected', [ + [ [1, 1, 1, 1, 2, 1, 1, 1, 1], 1, [5, 6, 7], [6, 7, 8], 1, 1, 3, [[5, 6, 8], [6, 8, 9]] ], + [ [1, 1, 1, 1, 0.5, 1, 1, 1, 1], 1, [5, 6, 7], [6, 7, 8], 1, -1, 3, [[5, 6, 6], [6, 6, 7]] ], +]) +def test_allocate_by_vsync(vs_diff, index, starts, ends, frame_duration, irregularity, cycle, expected): + obt_starts, obt_ends = stimulus_sync.allocate_by_vsync(vs_diff, index, starts, ends, frame_duration, irregularity, cycle) + assert np.allclose(obt_starts, expected[0]) + assert np.allclose(obt_ends, expected[1]) \ No newline at end of file diff --git a/test/brain_observatory/ecephys/test_visualization.py b/test/brain_observatory/ecephys/test_visualization.py new file mode 100644 index 0000000000..099aa18f63 --- /dev/null +++ b/test/brain_observatory/ecephys/test_visualization.py @@ -0,0 +1,14 @@ +import allensdk.brain_observatory.ecephys.visualization.__init__ as vis +import pandas as pd + +def test_raster_plot(): + spike_times = pd.DataFrame({ + 'unit_id': [2, 1, 2], + 'stimulus_presentation_id': [2, 2, 2, ], + 'time_since_stimulus_presentation_onset': [0.01, 0.02, 0.03] + }, index=pd.Index(name='spike_time', data=[1.01, 1.02, 1.03])) + + fig = vis.raster_plot(spike_times) + ax = fig.get_axes()[0] + + assert len(spike_times['unit_id'].unique()) == len(ax.collections) diff --git a/test/brain_observatory/ecephys/test_write_nwb.py b/test/brain_observatory/ecephys/test_write_nwb.py new file mode 100644 index 0000000000..cc54db1c7a --- /dev/null +++ b/test/brain_observatory/ecephys/test_write_nwb.py @@ -0,0 +1,1082 @@ +import os +from datetime import datetime, timezone +from pathlib import Path +import logging +import platform + +import pytest +import pynwb +import pandas as pd +import numpy as np +import xarray as xr + +from pynwb import NWBFile, NWBHDF5IO + +from allensdk.brain_observatory.ecephys.current_source_density.__main__ import write_csd_to_h5 +import allensdk.brain_observatory.ecephys.write_nwb.__main__ as write_nwb +from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysNwbSessionApi +from allensdk.test.brain_observatory.behavior.test_eye_tracking_processing import create_preload_eye_tracking_df + + +@pytest.fixture +def units_table(): + return pynwb.misc.Units.from_dataframe(pd.DataFrame({ + "peak_channel_id": [5, 10, 15], + "local_index": [0, 1, 2], + "quality": ["good", "good", "noise"], + "firing_rate": [0.5, 1.2, -3.14], + "snr": [1.0, 2.4, 5], + "isi_violations": [34, 39, 22] + }, index=pd.Index([11, 22, 33], name="id")), name="units") + + +@pytest.fixture +def spike_times(): + return { + 11: [1, 2, 3, 4, 5, 6], + 22: [], + 33: [13, 4, 12] + } + + +@pytest.fixture +def running_speed(): + return pd.DataFrame({ + "start_time": [1., 2., 3., 4., 5.], + "end_time": [2., 3., 4., 5., 6.], + "velocity": [-1., -2., -1., 0., 1.], + "net_rotation": [-np.pi, -2 * np.pi, -np.pi, 0, np.pi] + }) + + +@pytest.fixture +def raw_running_data(): + return pd.DataFrame({ + "frame_time": np.random.rand(4), + "dx": np.random.rand(4), + "vsig": np.random.rand(4), + "vin": np.random.rand(4), + }) + + +@pytest.fixture +def stimulus_presentations_color(): + return pd.DataFrame({ + "alpha": [0.5, 0.4, 0.3, 0.2, 0.1], + "start_time": [1., 2., 4., 5., 6.], + "stop_time": [2., 4., 5., 6., 8.], + "stimulus_name": ['gabors', 'gabors', 'random', 'movie', 'gabors'], + "color": ["1.0", "", r"[1.0,-1.0, 10., -42.12, -.1]", "-1.0", ""] + }, index=pd.Index(name="stimulus_presentations_id", data=[0, 1, 2, 3, 4])) + + +def test_roundtrip_basic_metadata(roundtripper): + dt = datetime.now(timezone.utc) + nwbfile = pynwb.NWBFile( + session_description="EcephysSession", + identifier="{}".format(12345), + session_start_time=dt + ) + + api = roundtripper(nwbfile, EcephysNwbSessionApi) + assert 12345 == api.get_ecephys_session_id() + assert dt == api.get_session_start_time() + + +@pytest.mark.parametrize("metadata, expected_metadata", [ + ({ + "specimen_name": "mouse_1", + "age_in_days": 100.0, + "full_genotype": "wt", + "strain": "c57", + "sex": "F", + "stimulus_name": "brain_observatory_2.0", + "donor_id": 12345, + "species": "Mus musculus"}, + { + "specimen_name": "mouse_1", + "age_in_days": 100.0, + "age": "P100D", + "full_genotype": "wt", + "strain": "c57", + "sex": "F", + "stimulus_name": "brain_observatory_2.0", + "subject_id": "12345", + "species": "Mus musculus"}) +]) +def test_add_metadata(nwbfile, roundtripper, metadata, expected_metadata): + nwbfile = write_nwb.add_metadata_to_nwbfile(nwbfile, metadata) + + api = roundtripper(nwbfile, EcephysNwbSessionApi) + obtained = api.get_metadata() + + assert set(expected_metadata.keys()) == set(obtained.keys()) + + misses = {} + for key, value in expected_metadata.items(): + if obtained[key] != value: + misses[key] = {"expected": value, "obtained": obtained[key]} + + assert len(misses) == 0, f"the following metadata items were mismatched: {misses}" + + +@pytest.mark.parametrize("presentations", [ + (pd.DataFrame({ + 'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], + 'start_time': [1., 2., 4., 5., 6.], + 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'stop_time': [2., 4., 5., 6., 8.] + }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3, 4]))), + + (pd.DataFrame({ + 'gabor_specific_column': [1.0, 2.0, np.nan, np.nan, 3.0], + 'mixed_column': ["a", "", "b", "", "c"], + 'movie_specific_column': [np.nan, np.nan, np.nan, 1.0, np.nan], + 'start_time': [1., 2., 4., 5., 6.], + 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'stop_time': [2., 4., 5., 6., 8.] + }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3, 4]))), +]) +def test_add_stimulus_presentations(nwbfile, presentations, roundtripper): + write_nwb.add_stimulus_timestamps(nwbfile, [0, 1]) + write_nwb.add_stimulus_presentations(nwbfile, presentations) + + api = roundtripper(nwbfile, EcephysNwbSessionApi) + obtained_stimulus_table = api.get_stimulus_presentations() + + pd.testing.assert_frame_equal(presentations, obtained_stimulus_table, check_dtype=False) + + +def test_add_stimulus_presentations_color(nwbfile, stimulus_presentations_color, roundtripper): + write_nwb.add_stimulus_timestamps(nwbfile, [0, 1]) + write_nwb.add_stimulus_presentations(nwbfile, stimulus_presentations_color) + + api = roundtripper(nwbfile, EcephysNwbSessionApi) + obtained_stimulus_table = api.get_stimulus_presentations() + + expected_color = [1.0, "", "", -1.0, ""] + obtained_color = obtained_stimulus_table["color"].values.tolist() + + mismatched = False + for expected, obtained in zip(expected_color, obtained_color): + if expected != obtained: + mismatched = True + + assert not mismatched, f"expected: {expected_color}, obtained: {obtained_color}" + + +@pytest.mark.parametrize("opto_table, expected", [ + (pd.DataFrame({ + "start_time": [0., 1., 2., 3.], + "stop_time": [0.5, 1.5, 2.5, 3.5], + "level": [10., 9., 8., 7.], + "condition": ["a", "a", "b", "c"]}), + None), + + # Test for older version of optotable that used nwb reserved "name" col + (pd.DataFrame({"start_time": [0., 1., 2., 3.], + "stop_time": [0.5, 1.5, 2.5, 3.5], + "level": [10., 9., 8., 7.], + "condition": ["a", "a", "b", "c"], + "name": ["w", "x", "y", "z"]}), + pd.DataFrame({"start_time": [0., 1., 2., 3.], + "stop_time": [0.5, 1.5, 2.5, 3.5], + "level": [10., 9., 8., 7.], + "condition": ["a", "a", "b", "c"], + "stimulus_name": ["w", "x", "y", "z"], + "duration": [0.5, 0.5, 0.5, 0.5]})), + + (pd.DataFrame({"start_time": [0., 1., 2., 3.], + "stop_time": [0.5, 1.5, 2.5, 3.5], + "level": [10., 9., 8., 7.], + "condition": ["a", "a", "b", "c"], + "stimulus_name": ["w", "x", "y", "z"]}), + None) +]) +def test_add_optotagging_table_to_nwbfile(nwbfile, roundtripper, opto_table, expected): + + opto_table["duration"] = opto_table["stop_time"] - opto_table["start_time"] + + nwbfile = write_nwb.add_optotagging_table_to_nwbfile(nwbfile, opto_table) + api = roundtripper(nwbfile, EcephysNwbSessionApi) + + obtained = api.get_optogenetic_stimulation() + + if expected is None: + expected = opto_table + + pd.testing.assert_frame_equal(obtained, expected, check_like=True) + + +@pytest.mark.parametrize("roundtrip", [True, False]) +@pytest.mark.parametrize("pid,name,srate,lfp_srate,has_lfp,expected", [ + [ + 12, + "a probe", + 30000.0, + 2500.0, + True, + pd.DataFrame({ + "description": ["a probe"], + "sampling_rate": [30000.0], + "lfp_sampling_rate": [2500.0], + "has_lfp_data": [True], + "location": ["See electrode locations"] + }, index=pd.Index([12], name="id")) + ] +]) +def test_add_probe_to_nwbfile(nwbfile, roundtripper, roundtrip, pid, name, srate, lfp_srate, has_lfp, expected): + + nwbfile, _, _ = write_nwb.add_probe_to_nwbfile(nwbfile, pid, + name=name, + sampling_rate=srate, + lfp_sampling_rate=lfp_srate, + has_lfp_data=has_lfp) + if roundtrip: + obt = roundtripper(nwbfile, EcephysNwbSessionApi) + else: + obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) + + pd.testing.assert_frame_equal(expected, obt.get_probes(), check_like=True) + + +@pytest.mark.parametrize("columns_to_add, expected_columns", [ + (None, + + {"probe_vertical_position", "probe_horizontal_position", + "probe_id", "local_index", "valid_data", "x", "y", "z", "group", + "group_name", "imp", "location", "filtering"}), + + ([("test_column_a", "description_a"), + ("test_column_b", "description_b")], + + {"x", "y", "z", "group", "group_name", "imp", "location", "filtering", + "test_column_a", "test_column_b"}) +]) +def test_add_ecephys_electrode_columns(nwbfile, columns_to_add, + expected_columns): + + write_nwb.add_ecephys_electrode_columns(nwbfile, columns_to_add) + + assert set(nwbfile.electrodes.colnames) == expected_columns + + +@pytest.mark.parametrize(("channels, local_index_whitelist, " + "expected_electrode_table"), [ + ([{"id": 1, + "probe_id": 1234, + "valid_data": True, + "local_index": 23, + "probe_vertical_position": 10, + "probe_horizontal_position": 10, + "anterior_posterior_ccf_coordinate": 15.0, + "dorsal_ventral_ccf_coordinate": 20.0, + "left_right_ccf_coordinate": 25.0, + "manual_structure_acronym": "CA1", + "impedence": np.nan, + "filtering": "AP band: 500 Hz high-pass; LFP band: 1000 Hz low-pass"}, + {"id": 2, + "probe_id": 1234, + "valid_data": True, + "local_index": 15, + "probe_vertical_position": 20, + "probe_horizontal_position": 20, + "anterior_posterior_ccf_coordinate": 25.0, + "dorsal_ventral_ccf_coordinate": 30.0, + "left_right_ccf_coordinate": 35.0, + "manual_structure_acronym": "CA3", + "impedence": 42.0, + "filtering": "custom"}], + + [15, 23], + + pd.DataFrame({ + "id": [2, 1], + "probe_id": [1234, 1234], + "valid_data": [True, True], + "local_index": [15, 23], + "probe_vertical_position": [20, 10], + "probe_horizontal_position": [20, 10], + "x": [25.0, 15.0], + "y": [30.0, 20.0], + "z": [35.0, 25.0], + "location": ["CA3", "CA1"], + "imp": [42.0, np.nan], + "filtering": ["custom", "AP band: 500 Hz high-pass; LFP band: 1000 Hz low-pass"] + }).set_index("id")) + +]) +def test_add_ecephys_electrodes(nwbfile, channels, local_index_whitelist, + expected_electrode_table): + + mock_device = pynwb.device.Device(name="mock_device") + mock_electrode_group = pynwb.ecephys.ElectrodeGroup(name="mock_group", + description="", + location="", + device=mock_device) + + write_nwb.add_ecephys_electrodes(nwbfile, channels, mock_electrode_group, + local_index_whitelist) + + obt_electrode_table = nwbfile.electrodes.to_dataframe().drop(columns=["group", "group_name"]) + + pd.testing.assert_frame_equal(obt_electrode_table, + expected_electrode_table, + check_like=True) + + +@pytest.mark.parametrize("dc,order,exp_idx,exp_data", [ + [{"a": [1, 2, 3], "b": [4, 5, 6]}, ["a", "b"], [3, 6], [1, 2, 3, 4, 5, 6]] +]) +def test_dict_to_indexed_array(dc, order, exp_idx, exp_data): + + obt_idx, obt_data = write_nwb.dict_to_indexed_array(dc, order) + assert np.allclose(exp_idx, obt_idx) + assert np.allclose(exp_data, obt_data) + + +def test_add_ragged_data_to_dynamic_table(units_table, spike_times): + + write_nwb.add_ragged_data_to_dynamic_table( + table=units_table, + data=spike_times, + column_name="spike_times" + ) + + assert np.allclose([1, 2, 3, 4, 5, 6], units_table["spike_times"][0]) + assert np.allclose([], units_table["spike_times"][1]) + assert np.allclose([13, 4, 12], units_table["spike_times"][2]) + + +@pytest.mark.parametrize("roundtrip,include_rotation", [ + [True, True], + [True, False] +]) +def test_add_running_speed_to_nwbfile(nwbfile, running_speed, roundtripper, roundtrip, include_rotation): + + nwbfile = write_nwb.add_running_speed_to_nwbfile(nwbfile, running_speed) + if roundtrip: + api_obt = roundtripper(nwbfile, EcephysNwbSessionApi) + else: + api_obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) + + obtained = api_obt.get_running_speed(include_rotation=include_rotation) + + expected = running_speed + if not include_rotation: + expected = expected.drop(columns="net_rotation") + pd.testing.assert_frame_equal(expected, obtained, check_like=True) + + +@pytest.mark.parametrize("roundtrip", [[True]]) +def test_add_raw_running_data_to_nwbfile(nwbfile, raw_running_data, roundtripper, roundtrip): + + nwbfile = write_nwb.add_raw_running_data_to_nwbfile(nwbfile, raw_running_data) + if roundtrip: + api_obt = roundtripper(nwbfile, EcephysNwbSessionApi) + else: + api_obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) + + obtained = api_obt.get_raw_running_data() + + expected = raw_running_data.rename(columns={"dx": "net_rotation", "vsig": "signal_voltage", "vin": "supply_voltage"}) + pd.testing.assert_frame_equal(expected, obtained, check_like=True) + + +@pytest.mark.parametrize("presentations, column_renames_map, columns_to_drop, expected", [ + (pd.DataFrame({'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], + 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'start_time': [1., 2., 4., 5., 6.], + 'stop_time': [2., 4., 5., 6., 8.]}), + {"alpha": "beta"}, + None, + pd.DataFrame({'beta': [0.5, 0.4, 0.3, 0.2, 0.1], + 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'start_time': [1., 2., 4., 5., 6.], + 'stop_time': [2., 4., 5., 6., 8.]})), + + (pd.DataFrame({'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], + 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'start_time': [1., 2., 4., 5., 6.], + 'stop_time': [2., 4., 5., 6., 8.]}), + {"alpha": "beta"}, + ["Nonexistant_column_to_drop"], + pd.DataFrame({'beta': [0.5, 0.4, 0.3, 0.2, 0.1], + 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'start_time': [1., 2., 4., 5., 6.], + 'stop_time': [2., 4., 5., 6., 8.]})), + + (pd.DataFrame({'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], + 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'Start': [1., 2., 4., 5., 6.], + 'End': [2., 4., 5., 6., 8.]}), + None, + ["alpha"], + pd.DataFrame({'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], + 'start_time': [1., 2., 4., 5., 6.], + 'stop_time': [2., 4., 5., 6., 8.]})), +]) +def test_read_stimulus_table(tmpdir_factory, presentations, + column_renames_map, columns_to_drop, expected): + dirname = str(tmpdir_factory.mktemp("ecephys_nwb_test")) + stim_table_path = os.path.join(dirname, "stim_table.csv") + + presentations.to_csv(stim_table_path, index=False) + obt = write_nwb.read_stimulus_table(stim_table_path, + column_renames_map=column_renames_map, + columns_to_drop=columns_to_drop) + + pd.testing.assert_frame_equal(obt, expected) + + +# read_spike_times_to_dictionary(spike_times_path, spike_units_path, local_to_global_unit_map=None) +def test_read_spike_times_to_dictionary(tmpdir_factory): + dirname = str(tmpdir_factory.mktemp("ecephys_nwb_spike_times")) + spike_times_path = os.path.join(dirname, "spike_times.npy") + spike_units_path = os.path.join(dirname, "spike_units.npy") + + spike_times = np.sort(np.random.rand(30)) + np.save(spike_times_path, spike_times, allow_pickle=False) + + spike_units = np.concatenate([np.arange(15), np.arange(15)]) + np.save(spike_units_path, spike_units, allow_pickle=False) + + local_to_global_unit_map = {ii: -ii for ii in spike_units} + + obtained = write_nwb.read_spike_times_to_dictionary(spike_times_path, spike_units_path, local_to_global_unit_map) + for ii in range(15): + assert np.allclose(obtained[-ii], sorted([spike_times[ii], spike_times[15 + ii]])) + + +def test_read_waveforms_to_dictionary(tmpdir_factory): + dirname = str(tmpdir_factory.mktemp("ecephys_nwb_mean_waveforms")) + waveforms_path = os.path.join(dirname, "mean_waveforms.npy") + + nunits = 10 + nchannels = 30 + nsamples = 20 + + local_to_global_unit_map = {ii: -ii for ii in range(nunits)} + + mean_waveforms = np.random.rand(nunits, nsamples, nchannels) + np.save(waveforms_path, mean_waveforms, allow_pickle=False) + + obtained = write_nwb.read_waveforms_to_dictionary(waveforms_path, local_to_global_unit_map) + for ii in range(nunits): + assert np.allclose(mean_waveforms[ii, :, :], obtained[-ii]) + + +@pytest.fixture +def lfp_data(): + total_timestamps = 12 + subsample_channels = np.array([3, 2]) + + return { + "data": np.arange(total_timestamps * len(subsample_channels), dtype=np.int16).reshape((total_timestamps, len(subsample_channels))), + "timestamps": np.linspace(0, 1, total_timestamps), + "subsample_channels": subsample_channels + } + + +@pytest.fixture +def probe_data(): + probe_data = { + "id": 12345, + "name": "probeA", + "sampling_rate": 29.0, + "lfp_sampling_rate": 10.0, + "temporal_subsampling_factor": 2.0, + "channels": [ + { + "id": 0, + "probe_id": 12, + "local_index": 1, + "probe_vertical_position": 21, + "probe_horizontal_position": 33, + "valid_data": True, + "anterior_posterior_ccf_coordinate": 5.0, + "dorsal_ventral_ccf_coordinate": 10.0, + "left_right_ccf_coordinate": 15.0, + "manual_structure_acronym": "CA1", + "impedence": np.nan, + "filtering": "Unknown" + }, + { + "id": 1, + "probe_id": 12, + "local_index": 2, + "probe_vertical_position": 21, + "probe_horizontal_position": 32, + "valid_data": True, + "anterior_posterior_ccf_coordinate": 10.0, + "dorsal_ventral_ccf_coordinate": 15.0, + "left_right_ccf_coordinate": 20.0, + "manual_structure_acronym": "CA2", + "impedence": np.nan, + "filtering": "Unknown" + }, + { + "id": 2, + "probe_id": 12, + "local_index": 3, + "probe_vertical_position": 21, + "probe_horizontal_position": 31, + "valid_data": True, + "anterior_posterior_ccf_coordinate": 15.0, + "dorsal_ventral_ccf_coordinate": 20.0, + "left_right_ccf_coordinate": 25.0, + "manual_structure_acronym": "CA3", + "impedence": np.nan, + "filtering": "Unknown" + } + ], + "lfp": { + "input_data_path": "", + "input_timestamps_path": "", + "input_channels_path": "", + "output_path": "" + }, + "csd_path": "", + "amplitude_scale_factor": 1.0 + } + return probe_data + + +@pytest.fixture +def csd_data(): + csd_data = { + "csd": np.arange(20).reshape([2, 10]), + "relative_window": np.linspace(-1, 1, 10), + "channels": np.array([3, 2]), + "csd_locations": np.array([[1, 2], [3, 3]]), + "stimulus_name": "foo", + "stimulus_index": None, + "num_trials": 1000 + } + return csd_data + + +def test_write_probe_lfp_file(tmpdir_factory, lfp_data, probe_data, csd_data): + + tmpdir = Path(tmpdir_factory.mktemp("probe_lfp_nwb")) + input_data_path = tmpdir / Path("lfp_data.dat") + input_timestamps_path = tmpdir / Path("lfp_timestamps.npy") + input_channels_path = tmpdir / Path("lfp_channels.npy") + input_csd_path = tmpdir / Path("csd.h5") + output_path = str(tmpdir / Path("lfp.nwb")) # pynwb.NWBHDF5IO chokes on Path + + test_lfp_paths = { + "input_data_path": input_data_path, + "input_timestamps_path": input_timestamps_path, + "input_channels_path": input_channels_path, + "output_path": output_path + } + + test_session_metadata = { + "specimen_name": "A", + "age_in_days": 100.0, + "full_genotype": "wt", + "strain": "A strain", + "sex": "M", + "stimulus_name": "test_stim", + "species": "Mus musculus", + "donor_id": 42 + } + + probe_data.update({"lfp": test_lfp_paths}) + probe_data.update({"csd_path": input_csd_path}) + + write_csd_to_h5(path=input_csd_path, **csd_data) + + np.save(input_timestamps_path, lfp_data["timestamps"], allow_pickle=False) + np.save(input_channels_path, lfp_data["subsample_channels"], allow_pickle=False) + with open(input_data_path, "wb") as input_data_file: + input_data_file.write(lfp_data["data"].tobytes()) + + write_nwb.write_probe_lfp_file(4242, test_session_metadata, datetime.now(), logging.INFO, probe_data) + + exp_electrodes = pd.DataFrame(probe_data["channels"]).set_index("id").loc[[2, 1], :] + exp_electrodes.rename(columns={"anterior_posterior_ccf_coordinate": "x", + "dorsal_ventral_ccf_coordinate": "y", + "left_right_ccf_coordinate": "z", + "manual_structure_acronym": "location"}, inplace=True) + + with pynwb.NWBHDF5IO(output_path, "r") as obt_io: + obt_f = obt_io.read() + + obt_ser = obt_f.get_acquisition("probe_12345_lfp").electrical_series["probe_12345_lfp_data"] + assert np.allclose(lfp_data["data"], obt_ser.data[:]) + assert np.allclose(lfp_data["timestamps"], obt_ser.timestamps[:]) + + obt_electrodes = obt_f.electrodes.to_dataframe().loc[ + :, ["local_index", "probe_horizontal_position", + "probe_id", "probe_vertical_position", + "valid_data", "x", "y", "z", "location", "impedence", + "filtering"] + ] + + assert obt_f.session_id == "4242" + assert obt_f.subject.subject_id == "42" + + # There is a difference in how int dtypes are being saved in Windows + # that are causing tests to fail. + # Perhaps related to: https://stackoverflow.com/a/36279549 + if platform.system() == "Windows": + pd.testing.assert_frame_equal(obt_electrodes, exp_electrodes, check_like=True, check_dtype=False) + else: + pd.testing.assert_frame_equal(obt_electrodes, exp_electrodes, check_like=True) + + csd_series = obt_f.get_processing_module("current_source_density")["ecephys_csd"] + + assert np.allclose(csd_data["csd"], csd_series.time_series.data[:].T) + assert np.allclose(csd_data["relative_window"], csd_series.time_series.timestamps[:]) + obt_channel_locations = np.stack((csd_series.virtual_electrode_x_positions, + csd_series.virtual_electrode_y_positions), + axis=1) + assert np.allclose([[1, 2], [3, 3]], obt_channel_locations) # csd interpolated channel locations + + +@pytest.mark.parametrize("roundtrip", [True, False]) +def test_write_probe_lfp_file_roundtrip(tmpdir_factory, roundtrip, lfp_data, probe_data, csd_data): + + expected_csd = xr.DataArray( + name="CSD", + data=csd_data["csd"], + dims=["virtual_channel_index", "time"], + coords={ + "virtual_channel_index": np.arange(csd_data["csd"].shape[0]), + "time": csd_data["relative_window"], + "vertical_position": (("virtual_channel_index",), csd_data["csd_locations"][:, 1]), + "horizontal_position": (("virtual_channel_index",), csd_data["csd_locations"][:, 0]), + } + ) + + expected_lfp = xr.DataArray( + name="LFP", + data=lfp_data["data"], + dims=["time", "channel"], + coords=[lfp_data["timestamps"], [2, 1]] + ) + + tmpdir = Path(tmpdir_factory.mktemp("probe_lfp_nwb")) + input_data_path = tmpdir / Path("lfp_data.dat") + input_timestamps_path = tmpdir / Path("lfp_timestamps.npy") + input_channels_path = tmpdir / Path("lfp_channels.npy") + input_csd_path = tmpdir / Path("csd.h5") + output_path = str(tmpdir / Path("lfp.nwb")) # pynwb.NWBHDF5IO chokes on Path + + test_lfp_paths = { + "input_data_path": input_data_path, + "input_timestamps_path": input_timestamps_path, + "input_channels_path": input_channels_path, + "output_path": output_path + } + + probe_data.update({"lfp": test_lfp_paths}) + probe_data.update({"csd_path": input_csd_path}) + + write_csd_to_h5(path=input_csd_path, **csd_data) + + np.save(input_timestamps_path, lfp_data["timestamps"], allow_pickle=False) + np.save(input_channels_path, lfp_data["subsample_channels"], allow_pickle=False) + with open(input_data_path, "wb") as input_data_file: + input_data_file.write(lfp_data["data"].tobytes()) + + write_nwb.write_probe_lfp_file(4242, None, datetime.now(), logging.INFO, probe_data) + + obt = EcephysNwbSessionApi(path=None, probe_lfp_paths={12345: NWBHDF5IO(output_path, "r").read}) + + obtained_lfp = obt.get_lfp(12345) + obtained_csd = obt.get_current_source_density(12345) + + xr.testing.assert_equal(obtained_lfp, expected_lfp) + xr.testing.assert_equal(obtained_csd, expected_csd) + + +@pytest.fixture +def invalid_epochs(): + + epochs = [ + { + "type": "EcephysSession", + "id": 739448407, + "label": "stimulus", + "start_time": 1998.0, + "end_time": 2005.0, + }, + { + "type": "EcephysSession", + "id": 739448407, + "label": "stimulus", + "start_time": 2114.0, + "end_time": 2121.0, + }, + { + "type": "EcephysProbe", + "id": 123448407, + "label": "ProbeB", + "start_time": 114.0, + "end_time": 211.0, + }, + ] + + return epochs + + +def test_add_invalid_times(invalid_epochs, tmpdir_factory): + + nwbfile_name = str(tmpdir_factory.mktemp("test").join("test_invalid_times.nwb")) + + nwbfile = NWBFile( + session_description="EcephysSession", + identifier="{}".format(739448407), + session_start_time=datetime.now() + ) + + nwbfile = write_nwb.add_invalid_times(nwbfile, invalid_epochs) + + with NWBHDF5IO(nwbfile_name, mode="w") as io: + io.write(nwbfile) + nwbfile_in = NWBHDF5IO(nwbfile_name, mode="r").read() + + df = nwbfile.invalid_times.to_dataframe() + df_in = nwbfile_in.invalid_times.to_dataframe() + + pd.testing.assert_frame_equal(df, df_in, check_like=True, check_dtype=False) + + +def test_roundtrip_add_invalid_times(nwbfile, invalid_epochs, roundtripper): + + expected = write_nwb.setup_table_for_invalid_times(invalid_epochs) + + nwbfile = write_nwb.add_invalid_times(nwbfile, invalid_epochs) + api = roundtripper(nwbfile, EcephysNwbSessionApi) + obtained = api.get_invalid_times() + + pd.testing.assert_frame_equal(expected, obtained, check_dtype=False) + + +def test_no_invalid_times_table(): + + epochs = [] + assert write_nwb.setup_table_for_invalid_times(epochs).empty is True + + +def test_setup_table_for_invalid_times(): + + epoch = { + "type": "EcephysSession", + "id": 739448407, + "label": "stimulus", + "start_time": 1998.0, + "end_time": 2005.0, + } + + s = write_nwb.setup_table_for_invalid_times([epoch]).loc[0] + + assert s["start_time"] == epoch["start_time"] + assert s["stop_time"] == epoch["end_time"] + assert s["tags"] == [epoch["type"], str(epoch["id"]), epoch["label"]] + + +@pytest.fixture +def spike_amplitudes(): + return np.arange(5) + + +@pytest.fixture +def templates(): + return np.array([ + [ + [0, 1, 2], + [0, 1, 2], + [0, 1, 2], + [10, 21, 32] + ], + [ + [0, 1, 2], + [0, 1, 2], + [0, 1, 2], + [15, 9, 4] + ] + ]) + + +@pytest.fixture +def spike_templates(): + return np.array([0, 1, 0, 1, 0]) + + +@pytest.fixture +def expected_amplitudes(): + return np.array([0, 15, 60, 45, 120]) + + +def test_scale_amplitudes(spike_amplitudes, templates, spike_templates, expected_amplitudes): + + scale_factor = 0.195 + + expected = expected_amplitudes * scale_factor + obtained = write_nwb.scale_amplitudes(spike_amplitudes, templates, spike_templates, scale_factor) + + assert np.allclose(expected, obtained) + + +def test_read_spike_amplitudes_to_dictionary(tmpdir_factory, spike_amplitudes, templates, spike_templates, expected_amplitudes): + tmpdir = str(tmpdir_factory.mktemp("spike_amps")) + + spike_amplitudes_path = os.path.join(tmpdir, "spike_amplitudes.npy") + spike_units_path = os.path.join(tmpdir, "spike_units.npy") + templates_path = os.path.join(tmpdir, "templates.npy") + spike_templates_path = os.path.join(tmpdir, "spike_templates.npy") + inverse_whitening_matrix_path = os.path.join(tmpdir, "inverse_whitening_matrix_path.npy") + + whitening_matrix = np.diag(np.arange(3) + 1) + inverse_whitening_matrix = np.linalg.inv(whitening_matrix) + + spike_units = np.array([0, 0, 0, 1, 1]) + + for idx in range(templates.shape[0]): + templates[idx, :, :] = np.dot( + templates[idx, :, :], whitening_matrix + ) + + np.save(spike_amplitudes_path, spike_amplitudes, allow_pickle=False) + np.save(spike_units_path, spike_units, allow_pickle=False) + np.save(templates_path, templates, allow_pickle=False) + np.save(spike_templates_path, spike_templates, allow_pickle=False) + np.save(inverse_whitening_matrix_path, inverse_whitening_matrix, allow_pickle=False) + + obtained = write_nwb.read_spike_amplitudes_to_dictionary( + spike_amplitudes_path, + spike_units_path, + templates_path, + spike_templates_path, + inverse_whitening_matrix_path + ) + + assert np.allclose(expected_amplitudes[:3], obtained[0]) + assert np.allclose(expected_amplitudes[3:], obtained[1]) + + +@pytest.mark.parametrize("spike_times_mapping, spike_amplitudes_mapping, expected", [ + + ({12345: np.array([0, 1, 2, -1, 5, 4])}, # spike_times_mapping + + {12345: np.array([0, 1, 2, 3, 4, 5])}, # spike_amplitudes_mapping + + ({12345: np.array([0, 1, 2, 4, 5])}, # expected + {12345: np.array([0, 1, 2, 5, 4])})), + + ({12345: np.array([0, 1, 2, -1, 5, 4]), # spike_times_mapping + 54321: np.array([5, 4, 3, -1, 6])}, + + {12345: np.array([0, 1, 2, 3, 4, 5]), # spike_amplitudes_mapping + 54321: np.array([0, 1, 2, 3, 4])}, + + ({12345: np.array([0, 1, 2, 4, 5]), # expected + 54321: np.array([3, 4, 5, 6])}, + {12345: np.array([0, 1, 2, 5, 4]), + 54321: np.array([2, 1, 0, 4])})), +]) +def test_filter_and_sort_spikes(spike_times_mapping, spike_amplitudes_mapping, expected): + expected_spike_times, expected_spike_amplitudes = expected + + obtained_spike_times, obtained_spike_amplitudes = write_nwb.filter_and_sort_spikes(spike_times_mapping, + spike_amplitudes_mapping) + + np.testing.assert_equal(obtained_spike_times, expected_spike_times) + np.testing.assert_equal(obtained_spike_amplitudes, expected_spike_amplitudes) + + +@pytest.mark.parametrize("roundtrip", [True, False]) +@pytest.mark.parametrize("probes, parsed_probe_data, expected_units_table", [ + ([{"id": 1234, + "name": "probeA", + "sampling_rate": 29999.9655245905, + "lfp_sampling_rate": 2499.99712704921, + "temporal_subsampling_factor": 2.0, + "lfp": {}, + "spike_times_path": "/dummy_path", + "spike_clusters_files": "/dummy_path", + "mean_waveforms_path": "/dummy_path", + "channels": [{"id": 1, + "probe_id": 1234, + "valid_data": True, + "local_index": 0, + "probe_vertical_position": 10, + "probe_horizontal_position": 10, + "anterior_posterior_ccf_coordinate": 15.0, + "dorsal_ventral_ccf_coordinate": 20.0, + "left_right_ccf_coordinate": 25.0, + "manual_structure_acronym": "CA1", + "impedence": np.nan, + "filtering": "Unknown"}, + {"id": 2, + "probe_id": 1234, + "valid_data": True, + "local_index": 1, + "probe_vertical_position": 20, + "probe_horizontal_position": 20, + "anterior_posterior_ccf_coordinate": 25.0, + "dorsal_ventral_ccf_coordinate": 30.0, + "left_right_ccf_coordinate": 35.0, + "manual_structure_acronym": "CA3", + "impedence": np.nan, + "filtering": "Unknown"}], + + "units": [{"id": 777, + "local_index": 7, + "quality": "good", + "a": 0.5, + "b": 5}, + {"id": 778, + "local_index": 9, + "quality": "noise", + "a": 1.0, + "b": 10}]}], + + (pd.DataFrame({"id": [777, 778], "local_index": [7, 9], # units_table + "a": [0.5, 1.0], "b": [5, 10]}).set_index(keys="id", drop=True), + {777: np.array([0., 1., 2., -1., 5., 4.]), # spike_times + 778: np.array([5., 4., 3., -1., 6.])}, + {777: np.array([0., 1., 2., 3., 4., 5.]), # spike_amplitudes + 778: np.array([0., 1., 2., 3., 4.])}, + {777: np.array([1., 2., 3., 4., 5., 6.]), # mean_waveforms + 778: np.array([1., 2., 3., 4., 5.])}), + + pd.DataFrame({"id": [777, 778], "local_index": [7, 9], # units_table + "a": [0.5, 1.0], "b": [5, 10], + "spike_times": [[0., 1., 2., 4., 5.], [3., 4., 5., 6.]], + "spike_amplitudes": [[0., 1., 2., 5., 4.], [2., 1., 0., 4.]], + "waveform_mean": [[1., 2., 3., 4., 5., 6.], [1., 2., 3., 4., 5.]]} + ).set_index(keys="id", drop=True)), +]) +def test_add_probewise_data_to_nwbfile(monkeypatch, nwbfile, roundtripper, + roundtrip, probes, parsed_probe_data, + expected_units_table): + + def mock_parse_probes_data(probes): + return parsed_probe_data + + monkeypatch.setattr(write_nwb, "parse_probes_data", mock_parse_probes_data) + nwbfile = write_nwb.add_probewise_data_to_nwbfile(nwbfile, probes) + + if roundtrip: + obt = roundtripper(nwbfile, EcephysNwbSessionApi) + else: + obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) + + pd.testing.assert_frame_equal(obt.nwbfile.units.to_dataframe(), + expected_units_table) + + +@pytest.mark.parametrize("roundtrip", [True, False]) +@pytest.mark.parametrize("eye_tracking_rig_geometry, expected", [ + ({"monitor_position_mm": [1., 2., 3.], + "monitor_rotation_deg": [4., 5., 6.], + "camera_position_mm": [7., 8., 9.], + "camera_rotation_deg": [10., 11., 12.], + "led_position": [13., 14., 15.], + "equipment": "test_rig"}, + + # Expected + {"geometry": pd.DataFrame({"monitor_position_mm": [1., 2., 3.], + "monitor_rotation_deg": [4., 5., 6.], + "camera_position_mm": [7., 8., 9.], + "camera_rotation_deg": [10., 11., 12.], + "led_position_mm": [13., 14., 15.]}, + index=["x", "y", "z"]), + "equipment": "test_rig"}), +]) +def test_add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile, roundtripper, + roundtrip, + eye_tracking_rig_geometry, + expected): + + nwbfile = write_nwb.add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile, + eye_tracking_rig_geometry) + if roundtrip: + obt = roundtripper(nwbfile, EcephysNwbSessionApi) + else: + obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) + obtained_metadata = obt.get_rig_metadata() + + pd.testing.assert_frame_equal(obtained_metadata["geometry"], expected["geometry"], check_like=True) + assert obtained_metadata["equipment"] == expected["equipment"] + + +@pytest.mark.parametrize("roundtrip", [True, False]) +@pytest.mark.parametrize(("eye_tracking_frame_times, eye_dlc_tracking_data, " + "eye_gaze_data, expected_pupil_data, expected_gaze_data"), [ + ( + # eye_tracking_frame_times + pd.Series([3., 4., 5., 6., 7.]), + # eye_dlc_tracking_data + {"pupil_params": create_preload_eye_tracking_df(np.full((5, 5), 1.)), + "cr_params": create_preload_eye_tracking_df(np.full((5, 5), 2.)), + "eye_params": create_preload_eye_tracking_df(np.full((5, 5), 3.))}, + # eye_gaze_data + {"raw_pupil_areas": pd.Series([2., 4., 6., 8., 10.]), + "raw_eye_areas": pd.Series([3., 5., 7., 9., 11.]), + "raw_screen_coordinates": pd.DataFrame({"y": [2., 4., 6., 8., 10.], "x": [3., 5., 7., 9., 11.]}), + "raw_screen_coordinates_spherical": pd.DataFrame({"y": [2., 4., 6., 8., 10.], "x": [3., 5., 7., 9., 11.]}), + "new_pupil_areas": pd.Series([2., 4., np.nan, 8., 10.]), + "new_eye_areas": pd.Series([3., 5., np.nan, 9., 11.]), + "new_screen_coordinates": pd.DataFrame({"y": [2., 4., np.nan, 8., 10.], "x": [3., 5., np.nan, 9., 11.]}), + "new_screen_coordinates_spherical": pd.DataFrame({"y": [2., 4., np.nan, 8., 10.], "x": [3., 5., np.nan, 9., 11.]}), + "synced_frame_timestamps": pd.Series([3., 4., 5., 6., 7.])}, + # expected_pupil_data + pd.DataFrame({"corneal_reflection_center_x": [2.] * 5, + "corneal_reflection_center_y": [2.] * 5, + "corneal_reflection_height": [4.] * 5, + "corneal_reflection_width": [4.] * 5, + "corneal_reflection_phi": [2.] * 5, + "pupil_center_x": [1.] * 5, + "pupil_center_y": [1.] * 5, + "pupil_height": [2.] * 5, + "pupil_width": [2.] * 5, + "pupil_phi": [1.] * 5, + "eye_center_x": [3.] * 5, + "eye_center_y": [3.] * 5, + "eye_height": [6.] * 5, + "eye_width": [6.] * 5, + "eye_phi": [3.] * 5}, + index=[3., 4., 5., 6., 7.]), + # expected_gaze_data + pd.DataFrame({"raw_eye_area": [3., 5., 7., 9., 11.], + "raw_pupil_area": [2., 4., 6., 8., 10.], + "raw_screen_coordinates_x_cm": [3., 5., 7., 9., 11.], + "raw_screen_coordinates_y_cm": [2., 4., 6., 8., 10.], + "raw_screen_coordinates_spherical_x_deg": [3., 5., 7., 9., 11.], + "raw_screen_coordinates_spherical_y_deg": [2., 4., 6., 8., 10.], + "filtered_eye_area": [3., 5., np.nan, 9., 11.], + "filtered_pupil_area": [2., 4., np.nan, 8., 10.], + "filtered_screen_coordinates_x_cm": [3., 5., np.nan, 9., 11.], + "filtered_screen_coordinates_y_cm": [2., 4., np.nan, 8., 10.], + "filtered_screen_coordinates_spherical_x_deg": [3., 5., np.nan, 9., 11.], + "filtered_screen_coordinates_spherical_y_deg": [2., 4., np.nan, 8., 10.]}, + index=[3., 4., 5., 6., 7.]) + ), +]) +def test_add_eye_tracking_data_to_nwbfile(nwbfile, roundtripper, roundtrip, + eye_tracking_frame_times, + eye_dlc_tracking_data, + eye_gaze_data, + expected_pupil_data, expected_gaze_data): + nwbfile = write_nwb.add_eye_tracking_data_to_nwbfile(nwbfile, + eye_tracking_frame_times, + eye_dlc_tracking_data, + eye_gaze_data) + + if roundtrip: + obt = roundtripper(nwbfile, EcephysNwbSessionApi) + else: + obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) + obtained_pupil_data = obt.get_pupil_data() + obtained_screen_gaze_data = obt.get_screen_gaze_data(include_filtered_data=True) + + pd.testing.assert_frame_equal(obtained_pupil_data, + expected_pupil_data, check_like=True) + pd.testing.assert_frame_equal(obtained_screen_gaze_data, + expected_gaze_data, check_like=True) diff --git a/test/brain_observatory/extract_running_speed/__init__.py b/test/brain_observatory/extract_running_speed/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..093ba8e2157a37aacd2fe1302600b0706e4ee482 GIT binary patch literal 221 zcmYL@JqiLr424Iq5W$03=oWS&;!i6!VmB~kcY+SPW`@c5v!#s}vGPi`9>LDaY#}~) zUqZ+WS@e2cC8GNkn)+(+Q%jnenA-xYHmcuRKU8eSe|&DsvEDL9*02XV%;5}F>p4N; z$-+n@oml&T#D&m@ea(91a?LK`AV5*V4kcSvvSG_CA*U>l;K=w~&YmFoSZ8=i5sGBu fk;u``a6q(~F^*g^W*F*cXL9iNSmCt!?=4neH}XPj literal 0 HcmV?d00001 diff --git a/test/brain_observatory/extract_running_speed/__pycache__/test_extract_running_speed_module.cpython-37.pyc b/test/brain_observatory/extract_running_speed/__pycache__/test_extract_running_speed_module.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d107e319662525353329c96b4e4fb8d3732a45b8 GIT binary patch literal 2380 zcmb6b%WfMtkmRm*S5Lp<G%utH(2IarPSOMoQX`1#2(5uaaGV%T7X}uqC2g-Q?QTgb zu?6YSIzW5tt=CHEslU<B;I*gzLQWlWC0j|ILkV!m8P0<<oSEIPs?`#Lk^J#vc(a1g z-x`??z|m8f;x_;kQQSekUP%XciBE7&vwX{(*?z&Sj_;V&^*!bs7O6$;x9Al6C58^m zqY5p+S{>D>LtX08A}!G}t&H6<@#koj*4`q29^@7d7d0F$(K$L#7wF=?wU5VyF40R` z8|b@4@e5R6{s-=cT6L`Ktxz6BSfelqOlva5JZyeOdzfNM-g-kk(2`awa)7SK9Lyrj zC79wb022LzM!+@(LqkWBLu+IY(147|(4An8!Mrofg0rG53|xv&$*=Rnl5|GypftwA z@^=uZ=V%+fLW9Df40@bXYgh(ej}qWr99DqWgOkb_f_ly^i=&bb-@vAt*BKP|-7&@p zB#RR(Rb!<JR%+*RgBrN!wiM<Hzfn$hA`jA}Pgc79%F0TdWIY)i3ZPV1R??oFqV=+} zgyhQU9!b{C6iJ1$Gl;3O57RhNcA7DOT2k4aG^EO=J<TUFRf-N+bQDBkr&FI(9t~v} z(3txbtqC?k5_XxIKerw18Op+p{RzqGrnJ{#eu*>9!h@)-JgvqkoSRXh@8&Nh>`m|? zaeh{<VJn@ps97EQrhe^x9e#O6T)n4DvqP%YWbV~o7|E2M{E6QEzVUc>M=&mS!-J4E z+ToipIoVxL!YEB>`1vkNUW;8FKoJ2<vx5_{`)%Cb6|rP1Sr{FK`wV0|9pIoxtC9)1 z+U8-L1Zf-8z7DmWRdy^nm<)I?N#bNb5E*0CFb5YN1$itR*@+^1Nm*z2EdYqrNDadz z6?}<Q0A40GcCd|0mZtQt^aKm0F>kDOQg~SLq_LOqs~}w`{0c1mx(0@TbHX(ssLHIY zE-GOIK%{bm-+<L$Zf-QUzWM$|u(i3>{C2a|44$pOTz`jG{ep4dx5KzC{BoS^rMw%; zI1>JR?gv~+$iO_A%Oa+O=r3RBc%;i;54~#p8!*LX01`>4>r)I6+Q=cf4iKsZx9S$x z?SN|uW$V-fKlT0nl1`5-gnX37-5eNaJ<jrjyTB-nQOrMuegDpR!sUs5XC|p86n32D zyZ)nTP@1n^Zm(~=47PV#t<Bcg!HcbC^I7nGr@7M%zIgE9{{2Vy?%vDuy<uwj%l{?W z5kY>9T=@FA%J))AG!7m{=Gnj%cQQ=~*8nkH6b+#vN<^&z9uVE4PMu*vLO@5BL<8Ln z9fR2eXN<)oS@;Q41c5HJBHfntn6~E^uosU3fFLNpir{^S-mT>naz-H&iUkztoWNtP zfefg%TYg2HBvEki5S|M9!h(=-x7X>3AUo>hq-j~}^LqYF@aQ@z_<{z@8t8nUd0=<a zg`NUgcmNPy#EWE+^zWNwyfFKwWp`FM6D9t&kIVG$PK&?spSo{cXr=BbPnS;cY;&9I ztC?)&`g5)vb{q>SRBc^A_mFX#G&xUs-8D7H7d5y3*!jh?9OSn&@e@s~0+B_MQ4_Zh zLvs7$PD~ts07``Zc|aA<BiO?pv>W~z;Pqv5Q|0P6=)`SPZCtaelIXQFo<>XvuD{2= z{%%3N!x};h6^dlkclY9B+2hQ(p<L*yF^A8Qwa?_a_xv`9n<`XxH{?hD9A`iDV$MX+ z4!i9%^~+GSP~eiseP-@8<D*G{ytvo$w(~^)Q;3@YJX|r}7>{l{nBZ%+XFK2@f&ITe Cv6o%| literal 0 HcmV?d00001 diff --git a/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py b/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py new file mode 100644 index 0000000000..bcab4ef4d5 --- /dev/null +++ b/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py @@ -0,0 +1,88 @@ +import os +from pathlib import Path +import json +import subprocess as sp + +import pytest +import pandas as pd + +@pytest.fixture +def use_temp_dir(tmpdir_factory): + def fn(data_dir, tempdir_name, input_json_fname, output_json_fname, module, renamer_cb): + + temp_dir = str(tmpdir_factory.mktemp(tempdir_name)) + + input_json_path = os.path.join(data_dir, input_json_fname) + new_input_json_path = os.path.join(temp_dir, input_json_fname) + + output_json_path = os.path.join(temp_dir, output_json_fname) + + with open(input_json_path, 'r') as input_json: + input_json_data = json.load(input_json) + + input_json_data = renamer_cb(input_json_data, data_dir, temp_dir) + + with open(new_input_json_path, 'w') as new_input_json: + json.dump(input_json_data, new_input_json) + + sp.check_call([ + 'python', '-m', module, + '--input_json', new_input_json_path, + '--output_json', output_json_path + ]) + + with open(output_json_path, 'r') as output_json: + output_json_data = json.load(output_json) + + return output_json_data + + return fn + + +DATA_DIR = os.environ.get( + "ECEPHYS_PIPELINE_DATA", + os.path.join("/", "allen", "aibs", "informatics", "module_test_data", "ecephys", "extract_running_speed"), +) + + +def reparent(path, new_parent): + return str(Path(new_parent) / Path(path).name) + + +@pytest.mark.requires_bamboo +@pytest.mark.parametrize('input_json_fname,output_json_fname,exp_fname', [ + [ + "ECEPHYS_EXTRACT_RUNNING_SPEED_QUEUE_744228101_input.json", + 'ECEPHYS_EXTRACT_RUNNING_SPEED_QUEUE_744228101ls_output.json', + '744228101_running_speeds.h5', + ] +]) +def test_extract_running_speed_module( + use_temp_dir, input_json_fname, output_json_fname, exp_fname +): + + def renamer(input_json_data, data_dir, temp_dir): + input_json_data['sync_h5_path'] = reparent(input_json_data['sync_h5_path'], data_dir) + input_json_data['stimulus_pkl_path'] = reparent(input_json_data['stimulus_pkl_path'], data_dir) + + input_json_data['output_path'] = reparent(input_json_data['output_path'], temp_dir) + + return input_json_data + + output_json_data = use_temp_dir( + DATA_DIR, 'test_extract_running_speed', input_json_fname, output_json_fname, + 'allensdk.brain_observatory.extract_running_speed', renamer + ) + expected_path = os.path.join(DATA_DIR, exp_fname) + assert os.path.exists(expected_path) + + # Commenting this out for now -- this regression test is expected to fail + # TODO: Path forward for new regression tests + # expected_velos = pd.read_hdf(expected_path, key="running_speed") + # expected_raw = pd.read_hdf(expected_path, key="raw_data") + + # obtained_velos = pd.read_hdf(output_json_data['output_path'], key="running_speed") + # obtained_raw = pd.read_hdf(output_json_data['output_path'], key="raw_data") + + # pd.testing.assert_frame_equal(expected_velos, obtained_velos, check_like=True) + # pd.testing.assert_frame_equal(expected_raw, obtained_raw, check_like=True) diff --git a/test/brain_observatory/gaze_mapping/__init__.py b/test/brain_observatory/gaze_mapping/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29164494feece7ce6cd42d29525a78f2e7db747c GIT binary patch literal 212 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG@*vJmypCt1qYwS$yajq5!{@-4&n#j z?~dcX<JM_9VkErZps%kUKPA*G$zecHY|qBY?!kON{^N7q%=jT_A2=LAWfIPS9bX|7 z78Ojn#x`*4G=_p`-LVUNYa|aQ>WPD*f>Kkqu4zM6dDJ21(t|-^C7o>{THoa*T(oGw bIfG>`gh3O9$Xxdv&Ks*vwO;gZy~*qg#;iVx literal 0 HcmV?d00001 diff --git a/test/brain_observatory/gaze_mapping/__pycache__/test_gaze_mapping.cpython-37.pyc b/test/brain_observatory/gaze_mapping/__pycache__/test_gaze_mapping.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4996182cdbc832de50c1915d8bf6b26600634bc7 GIT binary patch literal 8262 zcmc&(du$xV8Q;g<`FuG$j$<cIVuG8Pz~xO6poEZf;yg((kc1{IHkb9y-ejHg-Lbn) zVsmMekN_0~fvAc=DYexi3TjcI1*t7nBDM5^s03>N=~W<FO3SI`*+NyIYJcDC!*`Ay ztAwh1+Sz%0^UXKE?=j!l>+9-b5}w>Qj_T_#lcd+F;Xl(*>A-8h7MCO@F*z$~?pM|n z(N?t(zDhRSAJJ-L$&iMlBN9_t=(u#dtkrt$FpG$G%#iw~^u<{Xi?UkGlelWi^kp%w zvY6Y05@THDYDNK_*8-h4gQx`kSUR*le&AHaPtX%T^hUVMrkqq+oYe`L>O7h1*;GRr zu4fJ4K8>p*vMGypBihrc4QX78Y3OOHplC*WMis?O*1~30P|Rj?SZfu<1#B+6u!5qE zeU8m@DR_v5JQ?S+b|K?bPsWRcL<_JU_BZ0ncX3tg62HX~r&K|`kS*j2Tf`QjT+9}u zT*8)cg@?TP?)X_HjkBev6t;{lXUl=xrECRTiSH_Q8M_?cE7<4RmC#Zs<F51HNwu1- z9wXIN>?-s$um;E$KDTUa4O`<<k%WfQ*Wkb7$ayJS$yRX4SV_gh85OJfIA6`y3Y@3? zA8{s~DlEy8C_7jO%5`i#>FHD9>*~`*+0}X{>pZ8{T}*wg3u%1Je2GTeBo%sn{5G(S z0>4HdKenmbQsKRuMb8$t6;jB7cU{A_x$TVV%_092)*Z~*%C=*zYgrd4m0;#|?0WRx zz;?L3Rr2g)yM#Q`J$Y^vYk$G#TrHbujrz^*z;6gINGiq!p44(J4sn8_jTmQACiJQJ z@0o;u?7aAQlHZ?0eu}Z@BmbUB_)`o%AO5brPK<x;dE(#6&W(R9&Y1I&e~<9DiRF)- zr~G>+kv~=`KaU2!dK1%xZ#0o_49D5cMrgPhXRG+(?AhY}Q0qPgZ^P&e)&tL<*(Bjq z>S>bbBouQ-DMx2dKBotsd<(eOvJ~rLd&gUc-Quptbnn~it&iyBtvxz>3-dXiwf5wE zz_)>=L`jl>7uD%Kmt2CrN+z6G3QIF4kZtjhH9TauV5dFc*MsjCXnh=H*>>;*!ok-^ zJlL^VGs8IBC!`Crt>DI~?zMy6dwnyR*(9Mpll6(OM@I-EiYjbB%L-{{dD8Za80K1m zpIcBX7i1dS(dxm8@7r_^ZRBktD&|kQF|fdHWtN-Ac>F4J6}u_|`}v%=Cb)TdpBHm6 zlTHFEE5F2@`RjQcnN2^?(id~iPXdxdtmu7%d}NFyV<q$3L_e8?B&S%z`_dfPHf5mI zI`DSpVN!_|vRyh4y*aS5QLLyxke~}|aSt0{L}T7cutw$t`X$~26|EF(byV9DY?qLw zGtftW3w(Kt+Xt&6A2`4c3ags!S=AvnD1JkyRCXIHvcr($i|k9Ri0={9Zo_QK^9KcX zM0M25H<z<x><Flqv)kD*k4h4BM0Je%#VF_nFVF{6MCVc+5u@NBzQ|<RQJ0E`AnkE> zLP$G@$vdUQ9c5f~q^^Wqil?|fWTg7_Lcy@oGIiro@Ydq(#B1+E;Yh<W6F)-j)3%sG z_oY)chvlL?tQ4g_@RB7b)ECZ3MfqNmEZk+05PZ>x55DriozExv*RN=PeEGB2ClfWL zhW>ocbn;fJkhe|8%;&Ueevg%Rbn3B7@vOlDg3{Eq-fviX(4jSW9l-=GW(*oBOK0YQ zt;N&*Dd3PQn1_sPB2rRvg;H3zEPb#P87MH_F-qZrZt49ch4*W*&4BJ&fm}i<)mX-@ z1BUIC>Y0(z2eM8|P}+}6RvmWq(H)(uyKl4&%kI|q>1=7Qeo)U1cCX9n>3ojqE4z){ z0lPb2FmiSpWxlX)(C*%D_I6{d#*%`b-mh~5bF*1cu>H#%EVZoH(#>2d-wU<}bRaXh zEYPNz<AP>Xzvx+77%WW>NU+h2dB_>C4AQmTh(c29W&fwhQ6(;0Q_)*x7!h;`!&r^V zxlDm6r<8N3T6I+o=;rteO<^~rj&we6u~Y^?8`=eds%X?UvYE=^M8qO_tQsn!RM1{5 zy69_78wZVD7LdcvcbNRT-aaGkBou23QQ(^IDn@9>sz<ZbY?&O)`wRJ;k#l@-S}<f2 zYXYZ<AfZ1N49y*vc(HM)fK?1;HGrs0wp{)<o`kGL%^Wi=45rDw=uz>8@Cr2BP$^2o z(uj0eamYQCVRZy<F{0S5PUsl^cmVg1yAolojT<=_wPUzwIC+7YKr3}9lehW>B&8^9 zC7sRNMyXb};o**D9xBzZvtcacDjO{;ZzWW*nNrjjyA;j$Ixs41fULFxoQuffQj;w` zACqj_lQb<VTeI*TY8}VmMqwh_GNWPz3V!CFdvCtto@bI?<<VrhiMp>na;)Z+`_TQn zKQ8>>yB#CR@`u#DlAh_iJNU0&#IyaH4t~%sZ~7qd{Um>7{X=W#bv}~hS3FVJ{odO9 zlRQJu(n1G+_#t|_&bYJU9Uc7dKQ70d4>0TG=DQB8effdY{JnqFjJ*BJ<H_-L)r!Td zbtUxF;;5r~3Te$`N&`?++Hy_S%t2|cz0$6%87QCu@-S;A6=Z5-ai1-4AD7jYAa}uz z0qnVG4J{rI?6!Wx*_UVVABbZwZu6C0egad<U!~$03W!1$X@#jEy_kz(zveAeY@}iy zii9F!XsR$!Ftc8W)9MgaX_s!q^Mm(k4j$s+Gq+s-NsIlH)4aUk(&)Eap9m^RzV*aY zC)#SB_j?`=DoOt8O+R{Ty^W!}PH4Y=?)BqIzjE3<4oS-&fw|d+TAJjhholbT(*iVb z$Vl$ta#(fbKBcG@6&z$Zh)#y=d4aw{U3^Jr>tFtG`RwE_1f-DV<g=w(1av){%IUd8 zNSo<xIB!=4DSNCsLqeUUx+=&g)^4lN?gYFyV*{>!=OF6PcK9RjJod9~cWyt!zr1em z8!z>)KEuDY`-K%heX6~K-<|#Q$B&~@{sjm>V??a^;Ayp^NQ6ok2I7iSIF-+({Bsx) zI_-uZYt+JBNUV#9#e`<wUJb<foHJnI0x}zbB#0qtUYi|Abe1q>3bti3Y5w++_TM~n z{~JkOd};08fBo&FWSLB*OrgC@rv_hdG(5ZNPmvD3_xH}x9r-C8+)#h6KE186gYPty z9mkF~byVR>*4ByFZbMORX^7vjG!eV2VnTZ$>3BP22Dc1j0-Kryz{KPLdhCyr$h38- zE+R)1YZ+=oYsL#4MmB2}Yy&4D!iFC;7K2TSnVC!qPJ(kNmp00Gf(60{0Wumx%=-{8 z($q%}Axy6Tj1*Y`Sm@9$M=pkn%I(Sqsb^ESayWcAQVcsvpE?{W;=V9PI$Yx@!{`}~ z;H@dv6eGxL;m9M%ArD83QS?TOsPC8U7N_=@d~3^Y+&XY%s$E_fde@If?<Ny5>k>#% zQisffa9}NxMR3k?EtJFgsYP@vozB}@D2@G>RF-#;-XTTQbG93_YlW9<@k)S%ZEKBZ zqa(t)rs7~NsQ^)nqm~*#Dw{fBq_sLd$FoMN*KiIRMs95MzffqE(sLv+DQ+Gx?3AtN zj8uNWp<w<Xwqc8ZYjnlsCbdCsl`Z^lLmHati{{4UKzoR8k$r~A_c^8TL6bTA%A}yO z$X3Xg%5$i=0fqTnxK7piM_we<HxCuc{EGM!39=Qasi+j`dZ3(C?YTj=qIT^{$ZpgK zyD8a>;2blp^gvd(Qo3d6XBoU&s;?G*;<zzK05m?^cOa%4E*fKswHB?RmTJBgXJHM7 z%aj_HDK#uNQ!$9*Ge)4r7gY%2m}#6a<6~f5jnyaK_ytuPAImKQ*K@aCi>+?}r=gb2 zKrT(0pPvW#4qg7364a0uFJ#HG$OH7OHpOif@@CG_;&2ax%oUdmTbm+UV#MY@*jaR5 z-Z=FPpZiq((jUJ0ev*H0!Jeib=jGF7vdi)(VD5R~OQ);AB*PQtM84=qeKHPe>0V(_ zhy-*qB=3h|A&j;=;nCD8;u=#!!OBxgk2sVP!s2pfLE5oLvRaxtX6qB9+U!QrF^roC zO%XBM;xbaLYY5L-W0;QGlDFO0k_lCd9ZLBZ7%etfQ6CEG{MB`vBTbLKndD#F`_1P* zj=p%BzrRs?^07s)Cwc37=bl|}m6CkJ^t<nQanWCseE-ug47~Z|tE0h;Klh#8;Y*rF zhbBl`+s{II7;ZZp@-7)|;~+dYNcZ#N@)U?%anEoMdU6*(pWRCJ2@m@D0^xHrzA~`h zxj5&yfnTCkixdWFsus=-^cM!buwBq`dA3VRfoT`}cjKjJU5l3nhZ~}(MHzu>K{ej} z*G<9cT2~77>(+i4Ki%>TT$zRpaf@*;n3Q6dR3wBV8FLd5Iz2_m)oM5Bj=o7;S|d9R z%QQ$XQ^XzNfx>LWZYrX@xMhjkXLL<}o(*J;wb;C5e+6Y!iP9ZhZJ63HB`TBUp~MBW z@>?%A)<l(g@;tolN@FA{?(dCqo7^twFhktw8|4M^LX6SeD6X-M(Mn3>0r<r{N}7un z-UdO}C^u3~Zb2W`i$%lqH-bj*4SBQNp8rKFqBO>%@?3d_;=T*<T?l!a<W<-O)tlrQ rqE2!(pua((8tr4As4bUQ$ty&y1t;WeQ6suG%vbP>2vp+A<n{jmKumdE literal 0 HcmV?d00001 diff --git a/test/brain_observatory/gaze_mapping/__pycache__/test_main.cpython-37.pyc b/test/brain_observatory/gaze_mapping/__pycache__/test_main.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9c6f04bae0c9dd0752dd0c3030b2db5807646c7 GIT binary patch literal 6422 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 T$I7Nqy5olIk&zURd1&N+rhK&c literal 0 HcmV?d00001 diff --git a/test/brain_observatory/gaze_mapping/test_gaze_mapping.py b/test/brain_observatory/gaze_mapping/test_gaze_mapping.py new file mode 100644 index 0000000000..e269921362 --- /dev/null +++ b/test/brain_observatory/gaze_mapping/test_gaze_mapping.py @@ -0,0 +1,344 @@ +import pytest + +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.gaze_mapping import _gaze_mapper as gm + + +@pytest.fixture() +def gaze_mapper_fixture(request): + default_params = { + "monitor_position": np.array([0, 0, 0]), + "monitor_rotations": np.array([0, 0, 0]), + "led_position": np.array([0, 0, 0]), + "camera_position": np.array([0, 0, 0]), + "camera_rotations": np.array([0, 0, 0]), + "eye_radius": 0.1682, + "cm_per_pixel": (10.2 / 10000.0) + } + default_params.update(request.param) + return gm.GazeMapper(**default_params) + + +@pytest.fixture() +def rig_component_fixture(request): + default_params = { + "position_in_eye_coord_frame": np.array([0, 0, 0]), + "rotations_in_self_coord_frame": np.array([0, 0, 0]) + } + default_params.update(request.param) + return gm.EyeTrackingRigObject(**default_params) + + +# ======== EyeTrackingRigObject tests ======== +@pytest.mark.parametrize('rig_component_fixture,expected', [ + ({"position_in_eye_coord_frame": [1, 0, 0]}, + [[0, 0, -1], + [-1, 0, 0], + [0, 1, 0]]), + + ({"position_in_eye_coord_frame": [0, 1, 0]}, + [[1, 0, 0], + [0, 0, -1], + [0, 1, 0]]), + + ({"position_in_eye_coord_frame": [0, 0, 1]}, + [[0, -1, 0], + [-1, 0, 0], + [0, 0, -1]]), +], indirect=['rig_component_fixture']) +def test_generate_self_to_eye_frame_xform(rig_component_fixture, expected): + obtained = rig_component_fixture.generate_self_to_eye_frame_xform() + assert np.allclose(obtained.as_matrix(), expected) + + +# ======== GazeMapper tests ======== +@pytest.mark.parametrize('gaze_mapper_fixture,expected', [ + # Simple 2D scenarios + ({"led_position": np.array([100, 0, 50])}, np.array([0.08417078, 0, 0.04208539])), + ({"led_position": np.array([50, 0, 20])}, np.array([0.08424169, 0, 0.03369668])), + # 3D scenarios + ({"led_position": np.array([246, 92.3, 52.6])}, np.array([0.07876523, 0.02955297, 0.01684167])), + ({"led_position": np.array([258.9, -61.2, 32.1])}, np.array([0.08187032, -0.01935289, 0.01015078])) + +], indirect=["gaze_mapper_fixture"]) +def test_compute_cr_coordinate(gaze_mapper_fixture, expected): + obtained = gaze_mapper_fixture.compute_cr_coordinate() + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("gaze_mapper_fixture, method_inputs, expected", [ + ({"monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([150, 0, 0]), + "led_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[300, 300], [350, 350], [325, 325], [290, 290]]), + "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [300, 300]])}, + [[-0.16820, 0.0000, 0.0000], + [-0.15195, -0.0510, 0.0510], + [-0.16428, -0.0255, 0.0255], + [-0.16758, 0.0102, -0.0102]]), + + # Test when params result in estimated pupil location outside of eye + ({"monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([150, 0, 0]), + "led_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[900, 900], [350, 350], [325, 325], [250, 250], [100, 100]]), + "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [300, 300], [800, 800]])}, + [[np.nan, np.nan, np.nan], + [-0.15195, -0.0510, 0.0510], + [-0.16428, -0.0255, 0.0255], + [-0.15195, 0.051, -0.051], + [np.nan, np.nan, np.nan]]), + +], indirect=['gaze_mapper_fixture']) +def test_pupil_pos_in_eye_coords(gaze_mapper_fixture, + method_inputs, + expected): + obtained = gaze_mapper_fixture.pupil_pos_in_eye_coords(**method_inputs) + assert np.allclose(obtained, expected, rtol=1e-4, equal_nan=True) + + +@pytest.mark.parametrize("gaze_mapper_fixture, method_inputs, expected", [ + ({"monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([150, 0, 0]), + "led_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[300, 300], [350, 350], [325, 325], [290, 290]]), + "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [300, 300]])}, + [[0, 0], + [-57.057, -57.057], + [-26.386, -26.386], + [10.3472, 10.347]]), + + # Test when params result in estimated pupil location outside of eye + ({"monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([150, 0, 0]), + "led_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[300, 300], [900, 900], [325, 325], [200, 200]]), + "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [800, 800]])}, + [[0, 0], + [np.nan, np.nan], + [-26.386, -26.386], + [np.nan, np.nan]]), + +], indirect=['gaze_mapper_fixture']) +def test_pupil_position_on_monitor_in_cm(gaze_mapper_fixture, + method_inputs, + expected): + obtained = gaze_mapper_fixture.pupil_position_on_monitor_in_cm(**method_inputs) + assert np.allclose(obtained, expected, rtol=1e-4, equal_nan=True) + + +@pytest.mark.parametrize("gaze_mapper_fixture, method_inputs, expected", [ + ({"monitor_position": np.array([170, 0, 0])}, # rig geometry parameters + {"pupil_pos_on_monitor_in_cm": np.array([[2, 5]])}, + np.array([[0.6740368979845053, 1.6845678100189891]])), # expected + + ({"monitor_position": np.array([100, 0, 0])}, + {"pupil_pos_on_monitor_in_cm": np.array([[5, 6], [8, 9]])}, + np.array([[2.862405226111748, 3.429356585864454], + [4.573921259900861, 5.126473695179203]])) +], indirect=['gaze_mapper_fixture']) +def test_pupil_position_on_monitor_in_degrees(gaze_mapper_fixture, + method_inputs, + expected): + obtained = gaze_mapper_fixture.pupil_position_on_monitor_in_degrees( + **method_inputs + ) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize('gaze_mapper_fixture,ellipse_fits,expected,deg_diff_tolerance', [ + # General sanity check using extreme pupil values to see if output + # screen mapped coordinates are generally in the right quadrant/hemisphere. + + # As if looking at top half of screen + ({"led_position": np.array([135, 0, 0]), # rig geometry parameters + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[300, 200]]), # Pupil center (x, y) coords + "cam_cr_params": np.array([[300, 300]])}, # Corneal reflect (x, y) coords + np.array([[0, 1]]), # Expected general direction of outputs in unit vector form + 0), # Allowed angle tolerance (in degrees) between `expected - obtained` + + # As if looking at bottom half of screen + ({"led_position": np.array([135, 0, 0]), + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[300, 400]]), + "cam_cr_params": np.array([[300, 300]])}, + np.array([[0, -1]]), + 0), + + # As if looking at right side of screen + ({"led_position": np.array([135, 0, 0]), + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[200, 300]]), + "cam_cr_params": np.array([[300, 300]])}, + np.array([[1, 0]]), + 0), + + # As if looking at left side of screen + ({"led_position": np.array([135, 0, 0]), + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[400, 300]]), + "cam_cr_params": np.array([[300, 300]])}, + np.array([[-1, 0]]), + 0), + + # As if looking at upper right quadrant of screen + ({"led_position": np.array([135, 0, 0]), + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[200, 200]]), + "cam_cr_params": np.array([[300, 300]])}, + np.array([[1, 1]]), + 0), + + # As if looking at lower right quadrant of screen + ({"led_position": np.array([135, 0, 0]), + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[200, 400]]), + "cam_cr_params": np.array([[300, 300]])}, + np.array([[1, -1]]), + 0), + + # As if looking to upper right quadrant of screen + ({"led_position": np.array([135, 0, 0]), + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[400, 200]]), + "cam_cr_params": np.array([[300, 300]])}, + np.array([[-1, 1]]), + 0), + + # As if looking at lower left quadrant of screen + ({"led_position": np.array([135, 0, 0]), + "monitor_position": np.array([170, 0, 0]), + "camera_position": np.array([130, 0, 0])}, + {"cam_pupil_params": np.array([[400, 400]]), + "cam_cr_params": np.array([[300, 300]])}, + np.array([[-1, -1]]), + 0), + +], indirect=["gaze_mapper_fixture"]) +def test_mapping_gives_sane_outputs(gaze_mapper_fixture, ellipse_fits, expected, deg_diff_tolerance): + obtained = gaze_mapper_fixture.pupil_position_on_monitor_in_cm(**ellipse_fits) + for obt, exp in zip(obtained, expected): + # Check that angle between the obtained monitor coordinate and expected + # general direction is not more than the `deg_diff_tolerance`. + obt_unit_vec = obt / np.linalg.norm(obt) + angle_between = np.arccos(np.clip(np.dot(obt_unit_vec, exp), -1.0, 1.0)) + assert angle_between <= np.radians(deg_diff_tolerance) + + +# ======== Standalone function tests ======== +@pytest.mark.parametrize('ellipse_params,expected', [ + (pd.DataFrame({"height": [1, 1, 1, 1], "width": [2, 2, 2, 2]}), + pd.Series([4 * np.pi] * 4)), + + (pd.DataFrame({"height": [2, 2, 2, 2], "width": [1, 1, 1, 1]}), + pd.Series([4 * np.pi] * 4)), + + (pd.DataFrame({"height": [2, 4, 8, 16], "width": [1, 3, 9, 27]}), + pd.Series([4 * np.pi, 16 * np.pi, 81 * np.pi, 729 * np.pi])), + + (pd.DataFrame({"height": [1, 3, 9, 27], "width": [2, 4, 8, 16]}), + pd.Series([4 * np.pi, 16 * np.pi, 81 * np.pi, 729 * np.pi])), + + (pd.DataFrame({"height": [np.nan, 3, np.nan, 27], + "width": [2, 4, np.nan, np.nan]}), + pd.Series([4 * np.pi, 16 * np.pi, np.nan, 729 * np.pi])), +]) +def test_compute_circular_areas(ellipse_params, expected): + obtained = gm.compute_circular_areas(ellipse_params) + + assert np.allclose(obtained, expected, equal_nan=True) + + +@pytest.mark.parametrize('ellipse_params, expected', [ + (pd.DataFrame({"height": [1, 2, 3, 4], "width": [4, 3, 2, 1]}), + pd.Series([4 * np.pi, 6 * np.pi, 6 * np.pi, 4 * np.pi])), + + (pd.DataFrame({"height": [np.nan, 7, 11, 12, np.nan], + "width": [5, 3, 11, np.nan, np.nan]}), + pd.Series([np.nan, np.pi * 21, np.pi * 121, np.nan, np.nan])) +]) +def test_compute_elliptical_areas(ellipse_params, expected): + obtained = gm.compute_elliptical_areas(ellipse_params) + + assert np.allclose(obtained, expected, equal_nan=True) + + +@pytest.mark.parametrize("function_inputs,expected", [ + ({"plane_normal": np.array([1, 1, 1]), + "plane_point": np.array([1, 1, -5]), + "line_vectors": np.array([[6, 1, 4]]), + "line_points": np.array([[-5, 1, -1]])}, + np.array([-3.90909091, 1.18181818, -0.27272727])), + + ({"plane_normal": np.array([1, 0, 0]), + "plane_point": np.array([10, 0, 0]), + "line_vectors": np.array([[1, 0, 0], [1, 1, 1], [1, 1, 0]]), + "line_points": np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])}, + np.array([[10, 0, 0], [10, 10, 10], [10, 10, 0]])), + + ({"plane_normal": np.array([1, 0, 0]), + "plane_point": np.array([10, 0, 0]), + "line_vectors": np.array([[1, 0, 0], [1, 1, 1], [1, 1, 0], [1, 0, 0], [1, 0, 0]]), + "line_points": np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])}, + np.array([[10, 0, 0], [10, 10, 10], [10, 10, 0], [10, 0, 0], [10, 0, 0]])), + + ({"plane_normal": np.array([1, 1, 1]), + "plane_point": np.array([10, 10, 10]), + "line_vectors": np.array([[1, 1, 1], [1, 1, 1]]), + "line_points": np.array([[1, 2, 3], [0, 0, 0]])}, + np.array([[9, 10, 11], [10, 10, 10]])), + + ({"plane_normal": np.array([2, 1, -4]), + "plane_point": np.array([1, 1, -0.25]), + "line_vectors": np.array([[1, 3, 1]]), + "line_points": np.array([[0, 2, 0]])}, + np.array([[2, 8, 2]])), +]) +def test_project_to_plane(function_inputs, expected): + obtained = gm.project_to_plane(**function_inputs) + print(obtained) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("function_inputs, expected", [ + ({'x_rotation': 0.5, + 'y_rotation': 0.5, + 'z_rotation': 0.5}, + [[0.77015115, -0.21902415, 0.59907898], + [0.42073549, 0.88034656, -0.21902415], + [-0.47942554, 0.42073549, 0.77015115]]), + + ({'x_rotation': 0.5, + 'y_rotation': 0, + 'z_rotation': 0}, + [[1.0, 0.0, 0.0], + [0.0, 0.87758256, -0.47942554], + [0.0, 0.47942554, 0.87758256]]), + + ({'x_rotation': 0, + 'y_rotation': 0.5, + 'z_rotation': 0}, + [[0.87758256, 0.0, 0.47942554], + [0.0, 1.0, 0.0], + [-0.47942554, 0.0, 0.87758256]]), + + ({'x_rotation': 0, + 'y_rotation': 0, + 'z_rotation': 0.5}, + [[0.87758256, -0.47942554, 0.0], + [0.47942554, 0.87758256, 0.0], + [0.0, 0.0, 1.0]]), +]) +def test_generate_object_rotation_xform(function_inputs, expected): + obtained = gm.generate_object_rotation_xform(**function_inputs) + assert np.allclose(obtained.as_matrix(), expected) diff --git a/test/brain_observatory/gaze_mapping/test_main.py b/test/brain_observatory/gaze_mapping/test_main.py new file mode 100644 index 0000000000..c814b85174 --- /dev/null +++ b/test/brain_observatory/gaze_mapping/test_main.py @@ -0,0 +1,188 @@ +from pathlib import Path +import pytest + +import numpy as np +import pandas as pd + +import allensdk.brain_observatory.gaze_mapping.__main__ as main + +from allensdk.brain_observatory import sync_utilities as su +from allensdk.brain_observatory.sync_dataset import Dataset + + +def create_sample_ellipse_hdf(output_file: Path, + cr_data: pd.DataFrame, + eye_data: pd.DataFrame, + pupil_data: pd.DataFrame): + cr_data.to_hdf(output_file, key='cr', mode='w') + eye_data.to_hdf(output_file, key='eye', mode='a') + pupil_data.to_hdf(output_file, key='pupil', mode='a') + + +@pytest.fixture +def ellipse_fits_fixture(tmp_path, request) -> dict: + cr = {"center_x": [300, 305, 295, 310, 280], + "center_y": [300, 305, 295, 310, 280], + "width": [7, 8, 6, 7, 10], + "height": [6, 9, 5, 6, 8], + "phi": [0, 0.1, 0.15, 0.1, 0]} + + eye = {"center_x": [300, 305, 295, 310, 280], + "center_y": [300, 305, 295, 310, 280], + "width": [150, 155, 160, 150, 155], + "height": [120, 115, 120, 110, 100], + "phi": [0, 0.1, 0.15, 0.1, 0]} + + pupil = {"center_x": [300, 305, 295, 310, 280], + "center_y": [300, 305, 295, 310, 280], + "width": [30, 35, 40, 25, 50], + "height": [25, 27, 30, 20, 45], + "phi": [0, 0.1, 0.15, 0.1, 0]} + + test_dir = tmp_path / "test_load_ellipse_fit_params" + test_dir.mkdir() + + if request.param["create_good_fits_file"]: + test_path = test_dir / "good_ellipse_fits.h5" + else: + test_path = test_dir / "bad_ellipse_fits.h5" + pupil = {"center_x": [300], "center_y": [300], "width": [30], + "height": [25], "phi": [0]} + + cr = pd.DataFrame(cr) + eye = pd.DataFrame(eye) + pupil = pd.DataFrame(pupil) + + create_sample_ellipse_hdf(test_path, cr, eye, pupil) + + return {"cr": pd.DataFrame(cr), + "eye": pd.DataFrame(eye), + "pupil": pd.DataFrame(pupil), + "file_path": test_path} + + +@pytest.mark.parametrize("ellipse_fits_fixture, expect_good_file", [ + ({"create_good_fits_file": True}, True), + ({"create_good_fits_file": False}, False) +], indirect=["ellipse_fits_fixture"]) +def test_load_ellipse_fit_params(ellipse_fits_fixture: dict, expect_good_file: bool): + expected = {"cr_params": pd.DataFrame(ellipse_fits_fixture["cr"]).astype(float), + "pupil_params": pd.DataFrame(ellipse_fits_fixture["pupil"]).astype(float), + "eye_params": pd.DataFrame(ellipse_fits_fixture["eye"]).astype(float)} + + if expect_good_file: + obtained = main.load_ellipse_fit_params(ellipse_fits_fixture["file_path"]) + for key in expected.keys(): + pd.testing.assert_frame_equal(obtained[key], expected[key]) + else: + with pytest.raises(RuntimeError, match="ellipse fits don't match"): + obtained = main.load_ellipse_fit_params(ellipse_fits_fixture["file_path"]) + + +@pytest.mark.parametrize("input_args, expected", [ + ({"input_file": Path("input_file.h5"), + "session_sync_file": Path("sync_file.h5"), + "output_file": Path("output_file.h5"), + "monitor_position_x_mm": 100.0, + "monitor_position_y_mm": 500.0, + "monitor_position_z_mm": 300.0, + "monitor_rotation_x_deg": 30, + "monitor_rotation_y_deg": 60, + "monitor_rotation_z_deg": 90, + "camera_position_x_mm": 200.0, + "camera_position_y_mm": 600.0, + "camera_position_z_mm": 700.0, + "camera_rotation_x_deg": 20, + "camera_rotation_y_deg": 180, + "camera_rotation_z_deg": 5, + "led_position_x_mm": 800.0, + "led_position_y_mm": 900.0, + "led_position_z_mm": 1000.0, + "eye_radius_cm": 0.1682, + "cm_per_pixel": 0.0001, + "equipment": "Rig A", + "date_of_acquisition": "Some Date", + "eye_video_file": Path("eye_video.avi")}, + + {"pupil_params": "pupil_params_placeholder", + "cr_params": "cr_params_placeholder", + "eye_params": "eye_params_placeholder", + "session_sync_file": Path("sync_file.h5"), + "output_file": Path("output_file.h5"), + "monitor_position": np.array([10.0, 50.0, 30.0]), + "monitor_rotations": np.array([np.pi / 6, np.pi / 3, np.pi / 2]), + "camera_position": np.array([20.0, 60.0, 70.0]), + "camera_rotations": np.array([np.pi / 9, np.pi, np.pi / 36]), + "led_position": np.array([80.0, 90.0, 100.0]), + "eye_radius_cm": 0.1682, + "cm_per_pixel": 0.0001, + "equipment": "Rig A", + "date_of_acquisition": "Some Date", + "eye_video_file": Path("eye_video.avi")} + ), + +]) +def test_preprocess_input_args(monkeypatch, input_args: dict, expected: dict): + def mock_load_ellipse_fit_params(*args, **kwargs): + return {"pupil_params": "pupil_params_placeholder", + "cr_params": "cr_params_placeholder", + "eye_params": "eye_params_placeholder"} + + monkeypatch.setattr(main, "load_ellipse_fit_params", + mock_load_ellipse_fit_params) + + obtained = main.preprocess_input_args(input_args) + + for key in expected.keys(): + if isinstance(obtained[key], np.ndarray): + assert np.allclose(obtained[key], expected[key]) + else: + assert obtained[key] == expected[key] + + +@pytest.mark.parametrize("pupil_params_rows, expected, expect_fail", [ + (5, pd.Series([1, 2, 3, 4, 5]), False), + (4, None, True) +]) +def test_load_sync_file_timings(monkeypatch, pupil_params_rows, expected, expect_fail): + def mock_get_synchronized_frame_times(*args, **kwargs): + return pd.Series([1, 2, 3, 4, 5]) + + monkeypatch.setattr(main.su, "get_synchronized_frame_times", + mock_get_synchronized_frame_times) + + if expect_fail: + with pytest.raises(RuntimeError, match="number of camera sync pulses"): + main.load_sync_file_timings(Path("."), pupil_params_rows, True) + + else: + obtained = main.load_sync_file_timings(Path("."), pupil_params_rows, True) + assert expected.equals(obtained) + + +def test_load_truncated_timestamps(monkeypatch): + """ + Test that load_sync_file_timings handles the truncate_timestamps + arg correctly + """ + + class MockDataset(Dataset): + def __init__(self, path): + pass + + def get_edges(self, kind, keys, units='seconds'): + return pd.Series([1, 2, 3, 4, 500, 501, 502, 503], dtype=np.int64) + + + with monkeypatch.context() as ctx: + ctx.setattr(su, "Dataset", MockDataset) + timestamps = main.load_sync_file_timings("", 8, False) + expected = pd.Series([1, 2, 3, 4, 500, 501, 502, 503], dtype=np.int64) + assert timestamps.equals(expected) + + timestamps = main.load_sync_file_timings("", 4, True) + expected = pd.Series([1, 2, 3, 4], dtype=np.int64) + assert timestamps.equals(expected) + + with pytest.raises(RuntimeError): + timestamps = main.load_sync_file_timings("", 8, True) diff --git a/test/brain_observatory/nwb/__init__.py b/test/brain_observatory/nwb/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44fa8dd7297816fe70c0b5a2de5d75355f0f93aa GIT binary patch literal 203 zcmYL@zY4-I5XMt*5TOs^U^BRhh<{db5w}3NG{J_}OG#o&N1w&XS90|c+?>1&;s@XF zj^n=Lws}5bB)s1s)mOq#88vHi7!fo(vT1gBFrUVMeBy2)PQmyfpaNYe=m7_@K`0$+ zm<xkl5Uw>CN}_A4A&9+IBG_nVEtEB!4P~2#HgwIS36U!g7Nt{kwu9*Wz_C|cN{cp1 TS+v7*yu3JlZOkft^Cq(|fDt;? literal 0 HcmV?d00001 diff --git a/test/brain_observatory/nwb/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76bc29b2b28edd153c93a1cb8bc9e3408ef049af GIT binary patch literal 516 zcmZWmJx{|h5Ve!2DiviwVq-9429lu?144)oi3zc^EK#J$iQOhNwIiR?Dr`vn6DIyr zR;K<1CeE#pkT~hy+2{A{XZvnE9uW-n@x}v6$d{Y^hKGY2OgKdlM9`Wf`$`ikJmJ5S z#1nK%!eEOG@>Dp53s+s<W5O|lB`;LaB{4_Bn-bwW&1=nOrDVC`mCAGu(yY1Fri)}D zo3aB2ZNAc?ttD$g0&6;3YQ-ke1)EE5TZ27Ya?4h{V@g|=<7T{AZnzP^3cYH$t@2u) zjTlDgZGAMd9U#meLa+CsgZ^+W4OCiXm6~g82B<0fL7~;WT6_{SME1A6zf7Oe9;CeF zBFg!Ot1i7&9BG12QmNLE>P9Lk5ViB3K2~`Om6hiWI^qk7+PX%DSjJX@jsM*`R+~I_ z=ep&n>G~7AFAlS6p|p`%p;2F0XCEApU_=9I-0y|H39uxCy<*qfIsXF(Na%-G`}e%Y MpC;fmLvQH+0I}+hEC2ui literal 0 HcmV?d00001 diff --git a/test/brain_observatory/nwb/__pycache__/test_nwb.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/test_nwb.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9669c1aa71fff29ed8aeb256e1174e0341188f0d GIT binary patch literal 1714 zcmaJ>&2QsG6rUN}vGdVTvfHvOQ2Dls)J>}{NDEpa+QObt`Rc03ieybZlf;QX(wRxy zM6R?@uGLCh5mGBo{2TlkzH-_tM=tQjb+%Qh7|Ub--n@BV^Lw+iv{XYdlHY!ye>n*K zslj3_!Ov&#%0FOYh~Wr%S6}Sm0uztGmqbQvdL~Akj4Wm_^CxtMy$T?E<S>g>7!EPB znZv5g>1$joah){^yj0?5iQg*ma*6E%HyAGQ+qZD*CLY+#9AI|u++g?FN)bzy;qOp; z^)=*y_S!gK35Glv`^j;yA4c3i;zEXL5)i!(!-BU8?=HOZXP7cPLKhg^lS^_+GQ^Dc z(5a!wg^@wJm*iFN)Xbn1<Ejt}{w^$LUE(v$Dq|$}GjjwbV0K1+LBA5_oD+-=U*6KQ z#LJ9;rp@p(lr)PyRaU#wK7g`+gT6)IBjseqnNFs@m)9ZwMeK8Hs{_ycL79u6Cedt> zU<VX)e4OJ>+sN@&jyHu3S<TJ8gPq4v4wF$uy)~J}Tn)oy;0I|uiMZlmVwwmZQN@`@ zKHO?ob8A8cjdNqbRc;PHn#^+ZIn*$>)D*VlmYhVP@|uC*u*uhkC1_eyDIs%1D$%w) zN5vC=Le((01wWi}kQxwA-dG$+v4;D<BXJ+(f2-Y3x-TRgQkM=X>-6X`O=jKgga&EC z=#wr_j$}8T@I(eMr<37KcE1dJT^TC=ctV3Q9dOtiMWDgP8wwn5^aKqPKkb3pBdSs{ z+W_aqlCD|@@_PTSQu_VyL`?;UUO`d^hm0n1a1%R53$KzEZjc8=tb%<0)&K2ZcVlqR zxC{kni$h#@kEuxH)yI$JVBHOqBN~NF$5hm)Jm>v+?Eq9=&~dltmCeq_oz38eZ0EVC z=oqfGcIW0+XR~)h^7)mmr*q>;XS0nxCrlVb6R1G*Uk`2KO&??c6dDy>aE@QComvWA z5N2FrjFgc<kLX@FH!!+pYevK{GsV};0=7frzl%oJ86H<;UsZm@hbNhFOMar|$+EID z&|~(P$U?#pFy7hQ2d-8i!c?%lLZf3klWjw^ATaNpMJb`IVLXi&CH3mMq?*%Es`=A| zhib@$OWj9M(S_0@w;%F|xk)PAlCf@(PC?S+Za<wS?Dan|1O`uSCwEGdGH(V{1w;Q0 zZpctK4qPgV3!$$Qu?$mg$6QJvVcy)9KsW`L%@;zXA~%4N?MlHH@7^7Z@GNaxdWB1! zf>*!E2vd8|EWDalw6BMn-u|5z+y}5OH8)YSiEG5f1h=pW4<W0Xwl1u+YvLh%L>(rt zGMQ;>-rAyfI{#@KeYX^udUn|wMK-w^Q!)1H#cjcr2<K3BZTC9b;;#tVc^0Q^8u3qc Vfu(luV0cKwXs$S98DBpw{4ZuW<&ppZ literal 0 HcmV?d00001 diff --git a/test/brain_observatory/nwb/__pycache__/test_nwb_api.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/test_nwb_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ff2434501392735cd841c5ed7426d8849bf6054 GIT binary patch literal 595 zcmZWm&2H2%5VoCcHd}TP+{z1}=Fr^(H&h`?)f-v_6{3nFMNaJPx|`URZMvi?2LyLs zVON}ZC0{x53Y-|Ht<<U`&5t$T%r`TBGnwol5c%sH-Ngv~36EPL5WEJpdtex1xIy`~ z$2o>KX-FI85k@Rx@eh>844<HE@E6c%o?)NN*VUmGHT3Nz^c#U5f!YHw4xQr-anTjp zK<yTP$Bb;rSL_Cx#0|Ij=M#)vx*1(T4x>-N{T_Wlr{IAnn&;2tx+<v_Wh<-|@~m8l zhL?_8cR5@rHHCDx<B769*3>P1e6ED_k#)u=?aJ|1`$TsEpC^V2%dH>2J2^H+854%} zqlHmz8EP|<KX$EV!jubIJ7qc(1L8L_kHG!=a`dwJXt}WkT~ao!=$gu|IFz(jlF=6h zmlw8BnoC=QReIUk;;pC(D;(d~v|iCO4z*1K2)3Gqk!BT)BuiC6+Y1^PXRuG7DsT3l z>drq6*n0;^VIZ4;L3kIBv6(=W4NL^igk1jomS_5aBAhH}xN3ibzPjJ>ju}H2pB}V| ReQx-x@Vz}>N>Vb8{sVFkqvZeq literal 0 HcmV?d00001 diff --git a/test/brain_observatory/nwb/__pycache__/test_nwb_utils.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/test_nwb_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49800b73d961ca7ae4c967a4332b23f45b91111d GIT binary patch literal 1144 zcmaJ=%Wl*#6t(l7CofTT0Ts)R1T#YH03k|&4X6?z1d4(pPwb}Y<c00DGoy4t%bqRE zR;>7?Y+3OOthi2QrYayjihZ5jdwh=1ohQ9s8^K7weIgG`gnp>aa<m|L43GE<6Garq z$W^Nr<3w{cj2PP2PYtS5gPPQ$c4$zC+It$ccbD&+)jMZb54AImwrKk^I>D~FsO~h? zq2APnXjN-dCo~s`fE#KHgf8vX2o}X}(4hYl*rA;Pu3G8g*e_%hi}~Fs%?s%VSuAef z$}=INam@UbBn<X!nzKMM>PM+$TtFOUY30y@6BW5FmQsJ0L$ce65)v{<q-^T8n~g$o zdqPG@5f`Ec4Rpl;hOv0IVHG!ElIRqdsKjU5kzVShHqpeo)Q&MlKppQ4bgn^Gbtz;u z+agJ8z^cC`1mlX%GtM(UFsk;sq^f^Wl6(E1lH3mHUm|`-+<}vR&A0D+Zvk3(WRK9{ zm>iOH=53`U$Wlt~c`Q8;UY4^|1Tbg$-b{Eeqp>F<$?oJNn81BNZ5%@eos1+Cax~^7 zO8smMum?nDd^Q3n>QDa4l3_lpZmMiwNxg7;$|j%*?T3WAK;(2WS8X{ToooJ&jcgjQ zy!LwKgThknTl?@F0_B6$&hVG3N4kWjZ9Ku~9W?YS^cuZK(~VMliax9z8Koi3Qs1{u z@Wc|E(muu?H&tHam{VE#ObKx<kS&;~oEL0XyHtD0m4r$cl2_&di3`RRnSseIShx+7 zdu?UcIrYk9%4oO0`qmUH(`x6q(o=2z_X_<QPj!vB0@*?pqjnds;Wp-%As*Pg1B<({ zG;sKrcSEqOX-Xp@eByR;qW%h!M{`!YQUf)V{vhW(Ofp);>=A}D#5zn4?&=O4u72x| LgZtRPU2NgsE8;`w literal 0 HcmV?d00001 diff --git a/test/brain_observatory/nwb/conftest.py b/test/brain_observatory/nwb/conftest.py new file mode 100644 index 0000000000..755b0e08cb --- /dev/null +++ b/test/brain_observatory/nwb/conftest.py @@ -0,0 +1,12 @@ +import sys + +import pytest + + +def pytest_ignore_collect(path, config): + ''' The brain_observatory.ecephys submodule uses python 3.6 features that may not be backwards compatible! + ''' + + if sys.version_info < (3, 6): + return True + return False diff --git a/test/brain_observatory/nwb/test_nwb.py b/test/brain_observatory/nwb/test_nwb.py new file mode 100644 index 0000000000..48ed3f65be --- /dev/null +++ b/test/brain_observatory/nwb/test_nwb.py @@ -0,0 +1,57 @@ +import warnings +import h5py +import pytest + +from allensdk.brain_observatory.nwb import check_nwbfile_version + + +@pytest.fixture +def version_only_nwbfile_fixture(tmp_path, request): + + nwb_version = request.param.get("nwb_version", "2.2.2") + + nwbfile_path = tmp_path / "version_only_nwbfile.nwb" + with h5py.File(nwbfile_path, "w") as f: + if nwb_version is not None: + # pynwb 1.x saves version as a dataset + # and in the format "NWB-x.y.z" + if tuple(nwb_version.split(".")) < ("2", "0", "0"): + f.create_dataset("nwb_version", data=f"NWB-{nwb_version}") + # pynwb 2.x saves version as an attribute + elif tuple(nwb_version.split(".")) >= ("2", "0", "0"): + f.attrs["nwb_version"] = nwb_version + else: + f.create_dataset("something_completely_unrelated", data="42") + + return str(nwbfile_path) + + +@pytest.mark.parametrize("version_only_nwbfile_fixture, min_desired_version" + ", warns, warn_msg, invalid_nwb", [ + ({"nwb_version": None}, "2.2.2" , True, "Warn msg A", True), + ({"nwb_version": "0.9.0c"}, "2.2.2" , True, "Warn msg B", False), + ({"nwb_version": "2"}, "2.2.2", True, "Warn msg C", False), + ({"nwb_version": "2.0b"}, "2.2.2", True, "Warn msg D", False), + ({"nwb_version": "2.2.2"}, "2.2.2", False, None, False), + ({"nwb_version": "2.2.8"}, "2.2.2", False, None, False), + ({"nwb_version": "3.0"}, "2.2.2", False, None, False) +], indirect=["version_only_nwbfile_fixture"]) +def test_check_nwbfile_version(version_only_nwbfile_fixture, + min_desired_version, warns, + warn_msg, invalid_nwb): + + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + + check_nwbfile_version(nwbfile_path=version_only_nwbfile_fixture, + desired_minimum_version=min_desired_version, + warning_msg=warn_msg) + if warns: + if invalid_nwb: + assert ("neither a 'nwb_version' field " + "nor dataset could be found" + in str(w[-1].message)) + else: + assert warn_msg in str(w[-1].message) + else: + assert len(w) == 0 diff --git a/test/brain_observatory/nwb/test_nwb_api.py b/test/brain_observatory/nwb/test_nwb_api.py new file mode 100644 index 0000000000..059474f149 --- /dev/null +++ b/test/brain_observatory/nwb/test_nwb_api.py @@ -0,0 +1,11 @@ +import os + +import pytest + +from allensdk.brain_observatory.nwb.nwb_api import NwbApi + + +def test_missing_file(tmpdir_factory): + path = os.path.join(str(tmpdir_factory.mktemp('nwb_api_missing_file_test')), 'foo.nwb') + with pytest.raises(OSError): + NwbApi.from_path(path) \ No newline at end of file diff --git a/test/brain_observatory/nwb/test_nwb_utils.py b/test/brain_observatory/nwb/test_nwb_utils.py new file mode 100644 index 0000000000..30e0df0905 --- /dev/null +++ b/test/brain_observatory/nwb/test_nwb_utils.py @@ -0,0 +1,30 @@ +import pytest +from allensdk.brain_observatory.nwb import nwb_utils + + +@pytest.mark.parametrize("input_cols, possible_names, expected_intersection", [ + (['duration', 'end_frame', 'image_index', 'image_name'], + {'stimulus_name', 'image_name'}, 'image_name'), + (['duration', 'end_frame', 'image_index', 'stimulus_name'], + {'stimulus_name', 'image_name'}, 'stimulus_name') +]) +def test_get_stimulus_name_column(input_cols, possible_names, + expected_intersection): + column_name = nwb_utils.get_column_name(input_cols, possible_names) + assert column_name == expected_intersection + + +@pytest.mark.parametrize("input_cols, possible_names, expected_excep_cols", [ + (['duration', 'end_frame', 'image_index'], {'stimulus_name', 'image_name'}, + []), + (['duration', 'end_frame', 'image_index', 'image_name', 'stimulus_name'], + {'stimulus_name', 'image_name'}, + ['stimulus_name', 'image_name']) +]) +def test_get_stimulus_name_column_exceptions(input_cols, + possible_names, + expected_excep_cols): + with pytest.raises(KeyError) as error: + nwb_utils.get_column_name(input_cols, possible_names) + for expected_value in expected_excep_cols: + assert expected_value in str(error.value) diff --git a/test/brain_observatory/receptive_field_analysis/__pycache__/test_chisquarerf.cpython-37.pyc b/test/brain_observatory/receptive_field_analysis/__pycache__/test_chisquarerf.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..711b8a799ab5779e89831c0dfc043a170b850450 GIT binary patch literal 7568 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 YTs%>nEtb$O6wf_hx>>$3cj4rJ0N_|UnE(I) literal 0 HcmV?d00001 diff --git a/test/brain_observatory/receptive_field_analysis/__pycache__/test_fitgaussian2D.cpython-37.pyc b/test/brain_observatory/receptive_field_analysis/__pycache__/test_fitgaussian2D.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60d50f4f5784f50c617d41c40dff0cffc03649c5 GIT binary patch literal 4721 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 D(sW4! literal 0 HcmV?d00001 diff --git a/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py b/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py new file mode 100644 index 0000000000..ffc597b34c --- /dev/null +++ b/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py @@ -0,0 +1,309 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import os + +import pytest + +from scipy.ndimage.interpolation import zoom +import scipy.stats as stats +import numpy as np + +from allensdk.brain_observatory.receptive_field_analysis import chisquarerf as chi + + +@pytest.fixture +def rf_events(): + + np.random.seed(12) + + def make(receptive_field_mask, lsn): + activity = np.logical_or(lsn == 255, lsn==0) + return np.logical_and(activity, receptive_field_mask).sum(axis=(1, 2))[:, None] + + return make + + +@pytest.fixture +def locally_sparse_noise(): + + def make(ntr, nr, nc): + return np.around(np.random.rand(ntr, nr, nc)*255).astype(int) + + return make + + +@pytest.fixture +def rf_mask(): + + def make(nr, nc, slices): + mask = np.zeros((nr, nc)) + mask[slices] = 1 + return mask + + return make + + +@pytest.fixture +def exclusion_mask(): + mask = np.zeros((4, 4, 2)) + mask[:, :2, :] = 1 + return mask + + +@pytest.fixture +def events_per_pixel(): + + epp = np.zeros((2, 4, 4, 2)) + epp[0, 0, 0, 0] = 2 + epp[0, 0, 0, 1] = 3 + epp[1, 3, 3, 0] = 5 + epp[1, 1, 0, 0] = 4 + + return epp + + +@pytest.fixture +def trials_per_pixel(): + + tpp = np.zeros((4, 4, 2)) + tpp[:, :, 0] = 2 + tpp[:, :, 1] = 0 + + return tpp + + +# not testing d < 1 here +@pytest.mark.parametrize('r,c,d', [[2, 3, 4], [28, 16, 3], [28, 16, 2], [10, 20, 12]]) +def test_interpolate_rf(r, c, d): + + image = np.arange( r * c ).reshape([ r, c ]) + + delta_col = 1.0 / d + delta_row = c * delta_col + + obtained = chi.interpolate_RF(image, d) + grad = np.gradient(obtained) + + assert(np.allclose( grad[0], np.zeros_like(grad[0]) + delta_row )) + assert(np.allclose( grad[1], np.zeros_like(grad[1]) + delta_col )) + + +# tests integration with interpolate +# not testing case where r, c are small +@pytest.mark.parametrize('r,c,d', [[28, 16, 3], [28, 16, 2], [10, 20, 12]]) +def test_deinterpolate_rf(r, c, d): + + image = np.arange( r * c ).reshape([ r, c ]) + + interp = chi.interpolate_RF(image, d) + obt = chi.deinterpolate_RF(interp, c, r, d) + + assert(np.allclose( image, obt )) + + +def test_smooth_sta(): + + image = np.eye(10) + + smoothed = chi.smooth_STA(image) + + thresholded = smoothed.copy() + thresholded[thresholded < 0.5] = 0 + thresholded[thresholded > 0.5] = 1 + + assert(np.allclose( smoothed.T, smoothed )) + assert(np.allclose( image, thresholded )) + assert( np.count_nonzero(smoothed) > np.count_nonzero(image) ) + + +def test_build_trial_matrix(): + + tr0 = np.eye(16) * 255 + tr1 = np.arange(256).reshape((16, 16)) + lsn_template = np.array([ tr0, tr1 ]) + + exp = np.zeros((16, 16, 2, 2)) + exp[:, :, 0, 0] = np.eye(16) + exp[:, :, 1, 0] = 1 - np.eye(16) + exp[15, 15, 0, 1] = 1 + exp[0, 0, 1, 1] = 1 + + obt = chi.build_trial_matrix( lsn_template, 2 ) + assert(np.allclose( exp, obt )) + + +def test_get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel): + + obt = chi.get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel) + + assert( obt[0, 0, 0, 0] == 0.625 ) # 5 events, 8 trials (events counted even if 0 trials) + assert( obt[1, 1, 0, 0] == 0.5 ) # 4 events, 8 trials + assert( obt[0, 0, 0, 1] == 0.0 ) # no trials + assert( obt[1, 3, 3, 0] == 0.0 ) # out of mask + + +def test_chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel): + + obt_p, obt_ch = chi.chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel) + + resps = np.array([4, 0, 0, 0, 0, 0, 0, 0]) + resids = resps - 0.5 + chi_sum = (resids ** 2 / 0.5).sum() + + exp_p = 1.0 - stats.chi2.cdf(chi_sum, 15) + + # the zeroth test cell has a response without a trial. + # this is infinitely surprising, so the pval is 0 + assert(np.allclose( obt_p, [0, exp_p] )) + + +def test_get_disc_masks(): + + lsn_template = np.zeros((9, 3, 3)) + 128 + for ii in range(3): + for jj in range(3): + lsn_template[3*ii+jj, ii, jj] = 0 + lsn_template[4, 2, 2] = 255 + + exp1 = np.ones((3, 3)) + exp1[2, 2] = 0 + + exp0 = np.zeros((3, 3)) + exp0[:2, :2] = 1 + + obt = chi.get_disc_masks(lsn_template, radius=1) + + assert(np.allclose( exp1, obt[1, 1, :, :] )) + assert(np.allclose( exp0, obt[0, 0, :, :] )) + + +def test_get_events_per_pixel(): + + events = np.zeros((3, 2)) + trials = np.zeros((4, 4, 2, 3)) + + # pixel 1,1 is off trial 1 and on trial 2 + trials[1, 1, 1, 1] = 1 + trials[1, 1, 0, 2] = 1 + + # pixel 2,2 is on trial 2 and off trial 0 + trials[2, 2, 0, 2] = 1 + trials[2, 2, 1, 0] = 1 + + # cell 0 has 4 events on trial 2 and 1 on trial 0 + events[2, 0] = 4 + events[0, 0] = 1 + + # cell 1 has 2 events on trial 1 + events[1, 1] = 2 + + exp = np.zeros((2, 4, 4, 2)) + exp[0, 2, 2, 0] = 4 + exp[0, 1, 1, 0] = 4 + exp[0, 2, 2, 1] = 1 + exp[1, 1, 1, 1] = 2 + + obt = chi.get_events_per_pixel(events, trials) + assert(np.allclose( obt, exp )) + + +@pytest.mark.parametrize('base,ex', [[5., 10], [0.1, 12], [np.arange(20), np.linspace(0, 1, 20)]]) +def test_nll_to_pvalue(base, ex): + + obt = chi.NLL_to_pvalue(ex, base) + exp = np.power(base, -ex) + + assert(np.allclose( exp, obt )) + + +# test by reversing nll_to_pvalue +@pytest.mark.parametrize('base,ex', [[10., 2], [10., 4], [np.array([10, 10, 10]), np.linspace(0, 1, 3)]]) +def test_pvalue_to_nll(base, ex): + + pv = chi.NLL_to_pvalue(ex, base) + max_nll = np.amax(ex) + + obt = chi.pvalue_to_NLL(pv, max_nll) + + assert(np.allclose( ex, obt )) + + +@pytest.mark.skipif(os.getenv('NO_TEST_RANDOM') == 'true', reason="random seed may not produce the same results on all machines") +def test_chi_square_binary(locally_sparse_noise, rf_events, rf_mask): + + ntr = 2000 + nr = 20 + nc = 20 + slices = [slice(9, 11), slice(9, 11)] + + mask = rf_mask(nr, nc, slices) + lsn = locally_sparse_noise(ntr, nr, nc) + events = rf_events(mask, lsn) + + obt = chi.chi_square_binary(events, lsn) + assert( obt[0][slices].sum() == 0 ) + assert( obt.sum() > 0 ) + + +@pytest.mark.skipif(os.getenv('NO_TEST_RANDOM') == 'true', reason="random seed may not produce the same results on all machines") +def test_get_peak_significance(locally_sparse_noise, rf_events, rf_mask): + + ntr = 2000 + nr = 20 + nc = 20 + slices = [slice(9, 11), slice(9, 11)] + + mask = rf_mask(nr, nc, slices) + lsn = locally_sparse_noise(ntr, nr, nc) + events = rf_events(mask, lsn) + + chi_pv = chi.chi_square_binary(events, lsn) + chi_nll = chi.pvalue_to_NLL(chi_pv) + + significant_cells, best_p, _, _ = chi.get_peak_significance(chi_nll, lsn) + + assert(np.allclose( best_p, 0 )) + assert(np.allclose( significant_cells, [True] )) + + +def test_locate_median(): + + mask = np.eye(9) + where = np.where(mask) + + obt = chi.locate_median(*where) + assert(np.allclose( obt , [4, 4] )) diff --git a/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py b/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py new file mode 100644 index 0000000000..a95dcb2f26 --- /dev/null +++ b/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py @@ -0,0 +1,189 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import itertools as it + +import pytest +import mock + +from scipy.stats import multivariate_normal +from skimage.transform import rotate +import skimage +import numpy as np + +import allensdk.brain_observatory.receptive_field_analysis.fitgaussian2D as gauss + + +@pytest.fixture(scope='function') +def gaussian_pdf(): + + def gpdf(mean, cov, axes, scale=1): + + rv = multivariate_normal( mean, cov ) + mesh = np.meshgrid( *axes, indexing='ij' ) + pos = np.rollaxis( np.array(mesh), 0, len( axes ) + 1 ) + + out = rv.pdf( pos ) + out = out / np.amax(out) * scale + + return out, mesh + + return gpdf + + +@pytest.fixture(scope='function') +def domain_axes(): + + start = 0 + stop = 201 + step = 1 + naxes = 2 + + axes = [ np.arange(start, stop, step) for ii in range(naxes) ] + return axes + + +@pytest.fixture(scope='function') +def simple_fill(): + + def do_fill(domain_axes, fn): + + arr = np.zeros([ len(da) for da in domain_axes ]) + for pt in it.product(*domain_axes): + arr[pt] = fn(*pt) + + return arr + + return do_fill + + +@pytest.mark.parametrize('mean,cov,scale', [ [ [ 100, 100 ], [ 25, 25 ], 1 ], + [ [ 100, 100 ], [ 10, 25 ], 1 ], + [ [ 100, 110 ], [ 25, 25 ], 1 ], + [ [ 100, 110 ], [ 10, 25 ], 1 ], + [ [ 110, 100 ], [ 10, 25 ], 1 ] ]) +def test_gaussian2D_norot(mean, cov, scale, gaussian_pdf, domain_axes, simple_fill): + + full_cov = [ [ cov[0], 0 ], [ 0, cov[1] ] ] + exp, mesh = gaussian_pdf( mean, full_cov, domain_axes, scale ) + + obt_fn = gauss.gaussian2D( scale, mean[0], mean[1], np.sqrt(cov[0]), np.sqrt(cov[1]), 0 ) + obt = simple_fill( domain_axes, obt_fn ) + + assert( np.allclose( obt, exp ) ) + + +# only providing independent cov - using rotation after the fact +@pytest.mark.skipif(skimage.__version__ < '0.11.1', reason='cannot rotate about non-center point before .11.1') +@pytest.mark.parametrize('mean,cov,scale,rot', [ [ [ 100, 100 ], [ 25, 25 ], 1, 0 ], + [ [ 100, 100 ], [ 10, 25 ], 1, 0 ], + [ [ 100, 110 ], [ 25, 25 ], 1, 0 ], + [ [ 100, 110 ], [ 10, 25 ], 1, 0 ], + [ [ 110, 100 ], [ 10, 25 ], 1, 0 ], + [ [ 100, 100 ], [ 25, 25 ], 1, 90 ], + [ [ 100, 100 ], [ 25, 20 ], 1, 180 ], + [ [ 100, 100 ], [ 30, 25 ], 1, -90 ], + [ [ 100, 110 ], [ 20, 15 ], 1, -45 ], + [ [ 100, 110 ], [ 20, 15 ], 1, 30 ], + [ [ 100, 100 ], [ 15, 20 ], 1, 10 ], + [ [ 100, 100 ], [ 10, 25 ], 10, 0 ] ]) +def test_gaussian2D(mean, cov, scale, rot, gaussian_pdf, domain_axes, simple_fill): + + full_cov = [ [ cov[0], 0 ], [ 0, cov[1] ] ] + exp, mesh = gaussian_pdf( mean, full_cov, domain_axes, scale ) + + if rot != 0: + exp = rotate( exp, -rot, False, center=mean[::-1] ) # negative rotation + + obt_fn = gauss.gaussian2D( scale, mean[0], mean[1], np.sqrt(cov[0]), np.sqrt(cov[1]), rot ) + obt = simple_fill( domain_axes, obt_fn ) + + if rot == 0: + assert( np.allclose( obt, exp ) ) + else: + assert( np.linalg.norm( obt - exp ) / np.linalg.norm(exp) < 10 ** -2 ) + + +@pytest.mark.parametrize('mean,cov,scale', [ [ [ 100, 100 ], [ [1, 0 ], [0, 1] ], 1 ], + [ [ 100, 150 ], [ [1, 0 ], [0, 1] ], 1 ], + [ [ 125, 125 ], [ [1, 0 ], [0, 1] ], 1 ], + [ [ 110, 100 ], [ [1, 0 ], [0, 1] ], 1 ], + [ [ 90, 100 ], [ [1, 0 ], [0, 1] ], 1 ], + [ [ 100, 100 ], [ [1, 0 ], [0, 1] ], 2 ], + [ [ 100, 100 ], [ [5, 0 ], [0, 1] ], 1 ] ]) +def test_moments2(mean, cov, scale, gaussian_pdf, domain_axes): + + pdf, mesh = gaussian_pdf( mean, cov, domain_axes, scale ) + mom_exp = np.array([ scale, + mean[0], mean[1], + np.sqrt(cov[1][1]), np.sqrt(cov[0][0]) ]) + + mom_obt = gauss.moments2( pdf ) + + assert( np.allclose( mom_obt[:-1], mom_exp ) ) + assert( mom_obt[-1] is None ) # TODO: why? + + +# we probably want to test rotation here at some point, but there is no way that it could work now, given +# that moments2 assumes independence ... +@pytest.mark.parametrize('mean,cov,scale', [ [ [ 100, 100 ], [ 25, 25 ], 1 ], + [ [ 100, 100 ], [ 10, 25 ], 1 ], + [ [ 100, 110 ], [ 25, 25 ], 1 ], + [ [ 100, 110 ], [ 10, 25 ], 1 ], + [ [ 110, 100 ], [ 10, 25 ], 1 ] ]) +def test_fitgaussian2D(mean, cov, scale, gaussian_pdf, domain_axes): + + full_cov = [ [ cov[0], 0 ], [ 0, cov[1] ] ] + img, mesh = gaussian_pdf( mean, full_cov, domain_axes, scale ) + + obt = gauss.fitgaussian2D( img ) + exp = [ scale, mean[0], mean[1], np.sqrt(cov[0]), np.sqrt(cov[1]), 0 ] + + assert( np.allclose( exp, obt, atol=10**-3 ) ) + + +def test_fitgaussian2D_failure(): + + data = np.eye(10) + + res = mock.MagicMock() + res.success = False + res.status = 3 + res.message = 'foo' + + with mock.patch('scipy.optimize.minimize', return_value=res) as p: + with pytest.raises( gauss.GaussianFitError ): + gauss.fitgaussian2D(data) diff --git a/test/brain_observatory/sync_utilities/__init__.py b/test/brain_observatory/sync_utilities/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97e3d95db91ccd1a3f14d01210c55f93163365b4 GIT binary patch literal 214 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsq+B@{<nJdk;a+CNhPQH?>kKpEHI*1>9 zzl4x4WSyoX!NU6u`ugheQ^L)XO#_A&dofOS57G4FKR(yZOdiNIB;f=)E8qec<qDzn zs9`D%b|igmkV>YnPm$!-7Lsf*lN!njj)t?&@rJJQU?}880~VDp_-qHkH!-J(rD}t9 bHdsTsQWkAcDy!pjI6r&cI<x2>d$YwCRY5<I literal 0 HcmV?d00001 diff --git a/test/brain_observatory/sync_utilities/__pycache__/test_sync_utilities.cpython-37.pyc b/test/brain_observatory/sync_utilities/__pycache__/test_sync_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea77fcae02c180f48c024b37b1b2eeadce36c04c GIT binary patch literal 3578 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 Fe*r(OX21Xd literal 0 HcmV?d00001 diff --git a/test/brain_observatory/sync_utilities/test_sync_utilities.py b/test/brain_observatory/sync_utilities/test_sync_utilities.py new file mode 100644 index 0000000000..b964a654e6 --- /dev/null +++ b/test/brain_observatory/sync_utilities/test_sync_utilities.py @@ -0,0 +1,116 @@ +import pytest +import numpy as np + +from functools import partial + +from allensdk.brain_observatory import sync_utilities as su +from allensdk.brain_observatory.sync_dataset import Dataset + + +class MockDataset(Dataset): + def __init__(self, path: str, + eye_tracking_timings, behavior_tracking_timings): + # Note: eye_tracking_timings and behavior_tracking_timings are test + # inputs that can be parametrized and do not exist in the real + # `Dataset` class. + self.eye_tracking_timings = eye_tracking_timings + self.behavior_tracking_timings = behavior_tracking_timings + + def get_edges(self, kind, keys, units='seconds'): + if keys == self.EYE_TRACKING_KEYS: + return self.eye_tracking_timings + elif keys == self.BEHAVIOR_TRACKING_KEYS: + return self.behavior_tracking_timings + + +@pytest.fixture +def mock_dataset_fixture(request): + test_params = { + "eye_tracking_timings": [], + "behavior_tracking_timings": [] + } + test_params.update(request.param) + return partial(MockDataset, **test_params) + + +@pytest.mark.parametrize('vs_times, expected', [ + [[0.016, 0.033, 0.051, 0.067, 3.0], [0.016, 0.033, 0.051, 0.067]] +]) +def test_trim_discontiguous_vsyncs(vs_times, expected): + obtained = su.trim_discontiguous_times(vs_times) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ + ({"eye_tracking_timings": [0.020, 0.030, 0.040, 0.050, 3.0]}, + Dataset.EYE_TRACKING_KEYS, [0.020, 0.030, 0.040, 0.050]), + + ({"behavior_tracking_timings": [0.080, 0.090, 0.100, 0.110, 8.0]}, + Dataset.BEHAVIOR_TRACKING_KEYS, [0.08, 0.090, 0.100, 0.110]) +], indirect=["mock_dataset_fixture"]) +def test_get_synchronized_frame_times(monkeypatch, mock_dataset_fixture, + sync_line_label_keys, expected): + monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) + + obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ + ({"eye_tracking_timings": [0.020, 0.030, 0.040, 0.050, 3.0]}, + Dataset.EYE_TRACKING_KEYS, [0.020, 0.030, 0.040, 0.050, 3.0]), + + ({"behavior_tracking_timings": [0.080, 0.090, 0.100, 0.110, 8.0]}, + Dataset.BEHAVIOR_TRACKING_KEYS, [0.08, 0.090, 0.100, 0.110, 8.0]) +], indirect=["mock_dataset_fixture"]) +def test_get_synchronized_frame_times_no_trim(monkeypatch, mock_dataset_fixture, + sync_line_label_keys, expected): + monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) + + obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys, trim_after_spike=False) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ + ({"eye_tracking_timings": [0.020, 0.030, 3.0, 0.040, 0.050, 0.040]}, + Dataset.EYE_TRACKING_KEYS, [0.020, 0.030]), + + ({"behavior_tracking_timings": [0.080, 8.0, 0.090, 0.100, 0.110, 0.150, 0.085, 0.110, 0.13]}, + Dataset.BEHAVIOR_TRACKING_KEYS, [0.08]) +], indirect=["mock_dataset_fixture"]) +def test_get_synchronized_frame_times_trim_with_spike(monkeypatch, mock_dataset_fixture, + sync_line_label_keys, expected): + monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) + + obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ + ({"eye_tracking_timings": [3.0, 0.030, 0.040, 0.050]}, + Dataset.EYE_TRACKING_KEYS, []), + + ({"behavior_tracking_timings": [8.0, 0.080, 0.090, 0.100, 0.110]}, + Dataset.BEHAVIOR_TRACKING_KEYS, []) +], indirect=["mock_dataset_fixture"]) +def test_get_synchronized_frame_times_trim_all(monkeypatch, mock_dataset_fixture, + sync_line_label_keys, expected): + monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) + + obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys) + assert np.allclose(obtained, expected) + + +@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ + ({"eye_tracking_timings": [0.020, 0.030, 3.0, 0.050, 0.040]}, + Dataset.EYE_TRACKING_KEYS, [0.020, 0.030, 3.0, 0.050, 0.040]), + + ({"behavior_tracking_timings": [0.080, 8.0, 0.090, 0.100, 0.110]}, + Dataset.BEHAVIOR_TRACKING_KEYS, [0.080, 8.0, 0.090, 0.100, 0.110]) +], indirect=["mock_dataset_fixture"]) +def test_get_synchronized_frame_times_no_trim_with_spike(monkeypatch, mock_dataset_fixture, + sync_line_label_keys, expected): + monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) + + obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys, trim_after_spike=False) + assert np.allclose(obtained, expected) \ No newline at end of file diff --git a/test/brain_observatory/test_circle_plots.py b/test/brain_observatory/test_circle_plots.py new file mode 100644 index 0000000000..0900cbbbf9 --- /dev/null +++ b/test/brain_observatory/test_circle_plots.py @@ -0,0 +1,130 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import allensdk.brain_observatory.circle_plots as cplots +import numpy as np + +def test_polar_to_xy(): + d = cplots.polar_to_xy([0], 0.0) + assert d.shape[0] == 1 + assert d.shape[1] == 2 + + d = cplots.polar_to_xy([0, np.pi], 1.0) + + assert np.allclose(d, [[ 1, 0 ], [-1, 0]]) + +def test_polar_linspace(): + d = cplots.polar_linspace(1, 0, 180, 2, endpoint=True, degrees=True) + assert np.allclose(d, [[1,0],[-1,0]]) + + d = cplots.polar_linspace(1, 0, np.pi, 2, endpoint=False, degrees=False) + assert np.allclose(d, [[1,0],[0,1.0]]) + + d = cplots.polar_linspace(2, 0, 2*np.pi, 4, endpoint=False, degrees=False) + assert np.allclose(d, [[2,0],[0,2],[-2,0],[0,-2]]) + + d = cplots.polar_linspace(3, 0, 360, 5, endpoint=True, degrees=True) + assert np.allclose(d, [[3,0],[0,3],[-3,0],[0,-3],[3,0]]) + +def test_spiral_trials(): + coll = cplots.spiral_trials([0,2]) + + assert len(coll.get_paths()) == 2 + +def test_spiral_trials_polar(): + coll = cplots.spiral_trials_polar(1.0, 0.0, [1.0]) + assert len(coll.get_paths()) == 1 + + coll = cplots.spiral_trials_polar(1.0, 0.0, [1.0], offset=[1,0]) + assert len(coll.get_paths()) == 1 + +def test_angle_lines(): + lines = cplots.angle_lines([0], 0, 1) + assert len(lines.get_paths()) == 1 + + lines = cplots.angle_lines([0,1], 0, 1) + assert len(lines.get_paths()) == 2 + +def test_radial_arcs(): + arcs = cplots.radial_arcs([1], 0, 1) + assert len(arcs.get_paths()) == 1 + + arcs = cplots.radial_arcs([1,2], 0, 1) + assert len(arcs.get_paths()) == 2 + +def test_radial_circles(): + d = cplots.radial_circles([1]) + assert len(d.get_paths()) == 1 + + d = cplots.radial_circles([1,2]) + assert len(d.get_paths()) == 2 + +def test_polar_line_circles(): + d = cplots.polar_line_circles([1],0) + assert len(d.get_paths()) == 1 + + d = cplots.polar_line_circles([1],0,0) + assert len(d.get_paths()) == 1 + +def test_wedge_ring(): + d = cplots.wedge_ring(1, 0, 1, 0, 180) + assert len(d.get_paths()) == 1 + + d = cplots.wedge_ring(2, 0, 1) + assert len(d.get_paths()) == 2 + +def test_reset_hex_pack(): + pos = cplots.hex_pack(1.0, 1) + cplots.reset_hex_pack() + assert len(cplots.HEX_POSITIONS) == 0 + +def test_hex_pack(): + cplots.reset_hex_pack() + + pos = cplots.hex_pack(1.0, 1) + assert pos.shape[0] == 1 + assert np.allclose(pos, [[0,0]]) + assert np.allclose(cplots.HEX_POSITIONS.shape, [1,2]) + + pos = cplots.hex_pack(2.0, 2) + assert np.allclose(pos, [[0,0],[4,0]]) + assert np.allclose(cplots.HEX_POSITIONS.shape, [7,2]) + + pos = cplots.hex_pack(2.0, 8) + assert np.allclose(cplots.HEX_POSITIONS.shape, [19,2]) + + + + diff --git a/test/brain_observatory/test_demixer.py b/test/brain_observatory/test_demixer.py new file mode 100644 index 0000000000..5b8a975d1d --- /dev/null +++ b/test/brain_observatory/test_demixer.py @@ -0,0 +1,125 @@ +import numpy as np +import pytest +import scipy.sparse as sparse +import logging + +import allensdk.brain_observatory.demixer as dmx + + +@pytest.mark.parametrize( + "source_frame,mask_traces,flat_masks,pixels_per_mask,expected", + [ + ( + np.array([2., 2., 2., 1.]), + np.array([2.0, 2.0]), + sparse.csr_matrix(np.array([[1, 0, 0, 0], [1, 1, 0, 0]])), + np.array([1, 2]), + np.array([0, 2]), + ), + ( + np.array([2., 0., 2., 1.]), + np.array([2.0, 0.]), # zero in mask trace + sparse.csr_matrix(np.array([[1, 0, 0, 0], [1, 1, 0, 0]])), + np.array([1, 2]), + None, + ), + ( + np.array([2., 0., 2., 1.]), + np.array([2.0, 0.]), + sparse.csr_matrix(np.array([[1, 0, 0, 0], [0, 0, 0, 0]])), + np.array([1, 0]), # invalid mask (zero pixels) + None, + ) + ] +) +def test_demix_point( + source_frame, mask_traces, flat_masks, pixels_per_mask, expected): + result = dmx._demix_point(source_frame, mask_traces, flat_masks, + pixels_per_mask) + np.testing.assert_equal(result, expected) + + +@pytest.mark.parametrize( + "source_frame,mask_traces,flat_masks,pixels_per_mask,expected", + [ + (np.zeros(4), # force singular matrix + np.ones(2), + sparse.csr_matrix(np.array([[1, 0, 0, 0], [1, 1, 0, 0]])), + np.array([1, 2]), + np.zeros(2)), + ] +) +def test_demix_raises_warning_for_singular_matrix( + source_frame, mask_traces, flat_masks, pixels_per_mask, expected, + caplog): + result = dmx._demix_point(source_frame, mask_traces, flat_masks, + pixels_per_mask) + with caplog.at_level(logging.WARNING): + assert caplog.records[0].msg == ("Singular matrix, using least squares to " + "solve.") + assert caplog.records[0].levelno == logging.WARNING + np.testing.assert_equal(expected, result) + + +@pytest.mark.parametrize( + "raw_traces,stack,masks,max_block_size,expected", + [ + ( + np.array([[2.0, 0.0], [2.0, 2.0]]), + np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), + np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), + 1, # max_block_size < stack length + (np.array([[0, 0], [2, 0]]), [False, True]) + ), + ( + np.array([[2.0, 0.0], [2.0, 2.0]]), + np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), + np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), + 2, # max_block_size = stack length + (np.array([[0, 0], [2, 0]]), [False, True]) + ), + ( + np.array([[2.0, 0.0], [2.0, 2.0]]), + np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), + np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), + 1000, # max_block_size > stack length + (np.array([[0, 0], [2, 0]]), [False, True]) + ), + ( + np.array([[2.0, 0.0], [2.0, 2.0]]), + np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), + np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), + -1, # stack processed in one block + (np.array([[0, 0], [2, 0]]), [False, True]) + ), + ( + np.array([[2.0, 0.0, 1.0], [2.0, 2.0, 0.0]]), + np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]], [[1., 2.], [1., 2.]]]), + np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), + 2, # stack length not divisible by max_block_size + (np.array([[0, 0, 0], [2, 0, 0]]), [False, True, True]) + ), + + ], +) +def test_demix_time_dep_masks(raw_traces, stack, masks, max_block_size, expected): + result = dmx.demix_time_dep_masks(raw_traces, stack, masks, max_block_size) + np.testing.assert_equal(result[0], expected[0]) + assert result[1] == expected[1] + + +@pytest.mark.parametrize( + "raw_traces,stack,masks,max_block_size", + [ + ( + np.array([[2.0, 0.0], [2.0, 2.0]]), + np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), + np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), + -2, # invalid max_block_size) + ), + ], +) +def test_demix_invalid_max_block_size(raw_traces, stack, masks, max_block_size): + with pytest.raises(ValueError, match="Invalid maximum block size*"): + dmx.demix_time_dep_masks(raw_traces, stack, masks, max_block_size) + diff --git a/test/brain_observatory/test_dff.py b/test/brain_observatory/test_dff.py new file mode 100644 index 0000000000..2ebb50939c --- /dev/null +++ b/test/brain_observatory/test_dff.py @@ -0,0 +1,160 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import allensdk.brain_observatory.dff as dff +import numpy as np +import pytest +from functools import partial +from matplotlib.pyplot import Figure +from mock import patch, MagicMock + + +def test_movingmode_fast(): + # check basic behavior + x = np.array([0, 10, 0, 0, 20, 0, 0, 0, 30]) + kernelsize = 4 + y = np.zeros(x.shape) + + dff.movingmode_fast(x, kernelsize, y) + + assert np.all(y == 0) + + # check window edges + x = np.array([0, 0, 1, 1, 2, 2, 3, 3]) + kernelsize = 2 + y = np.zeros(x.shape) + + dff.movingmode_fast(x, kernelsize, y) + + assert np.all(x == y) + + # check > 16 bit + x = np.array([4097, 4097, 4097, 4097]) + kernelsize = 2 + y = np.zeros(x.shape) + + dff.movingmode_fast(x, kernelsize, y) + + assert np.all(y == 4097) + + # check floats + x = np.array([0, 0, 1, 1, 2, 2, 3, 3], dtype=np.float32) + kernelsize = 2 + y = np.zeros(x.shape) + + dff.movingmode_fast(x, kernelsize, y) + + assert np.all(x == y) + + +def test_compute_dff_windowed_mode(): + x = np.array([[1, 5, -2, 3, 1, 10, 1, -2, 30, 5]]) + + with pytest.raises(ValueError): + dff.compute_dff_windowed_mode(x, mode_kernelsize=0) + with pytest.raises(ValueError): + dff.compute_dff_windowed_mode(x, mean_kernelsize=0) + + y = dff.compute_dff_windowed_mode(x) + + assert(y.shape == x.shape) + + +def test_compute_dff_windowed_median(): + x = np.array([[1, 5, -2, 3, 1, 10, 1, -2, 30, 5]], dtype=float) + + with pytest.raises(ValueError): + dff.compute_dff_windowed_median(x, median_kernel_long=2) + with pytest.raises(ValueError): + dff.compute_dff_windowed_median(x, median_kernel_short=-5) + with pytest.raises(ValueError): + dff.compute_dff_windowed_median(x, noise_kernel_length=50) + with pytest.raises(ValueError): + dff.compute_dff_windowed_median(x) + + x = np.sin(np.arange(0, 200)).reshape(1,200) + + y = dff.compute_dff_windowed_median(x, median_kernel_long=101, + median_kernel_short=11, + noise_kernel_length=5) + + assert(y.shape == x.shape) + + noise_stds = [] + small_frames = [] + y = dff.compute_dff_windowed_median(x, median_kernel_long=101, + median_kernel_short=11, + noise_stds=noise_stds, + n_small_baseline_frames=small_frames, + noise_kernel_length=5) + + assert len(noise_stds) == 1 + assert len(small_frames) == 1 + + +def test_calculate_dff(): + x = np.array([[1, 5, -2, 3, 1, 10, 1, -2, 30, 5]], dtype=float) + + with patch("os.makedirs") as mock_makedirs: + with patch.object(Figure, "savefig") as mock_save: + with patch.object(dff, "compute_dff_windowed_median", + return_value=x) as mock_computation: + dff.calculate_dff(x) + assert mock_makedirs.call_count == 0 + assert mock_save.call_count == 0 + mock_computation.assert_called_once_with(x) + + with patch("os.makedirs") as mock_makedirs: + with patch.object(Figure, "savefig") as mock_save: + mock_computation = MagicMock(return_value=x) + dff.calculate_dff(x, dff_computation_cb=mock_computation, + save_plot_dir="./test") + mock_makedirs.assert_called_once_with("./test") + mock_save.assert_called_once() + mock_computation.assert_called_once_with(x) + + x = np.sin(np.arange(0, 200)).reshape(1,200) + + noise_stds = [] + small_frames = [] + computation_cb = partial(dff.compute_dff_windowed_median, + median_kernel_long=101, + median_kernel_short=11, + noise_stds=noise_stds, + n_small_baseline_frames=small_frames, + noise_kernel_length=5) + dff.calculate_dff(x, dff_computation_cb=computation_cb) + assert len(noise_stds) == 1 + assert len(small_frames) == 1 diff --git a/test/brain_observatory/test_drifting_gratings.py b/test/brain_observatory/test_drifting_gratings.py new file mode 100644 index 0000000000..4a9bdccb54 --- /dev/null +++ b/test/brain_observatory/test_drifting_gratings.py @@ -0,0 +1,164 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.brain_observatory.drifting_gratings import DriftingGratings +from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis + +import pytest +from mock import patch, MagicMock + + +@pytest.fixture +def dataset(): + dataset = MagicMock(name='dataset') + + timestamps = MagicMock(name='timestamps') + celltraces = MagicMock(name='celltraces') + dataset.get_corrected_fluorescence_traces = \ + MagicMock(name='get_corrected_fluorescence_traces', + return_value=(timestamps, celltraces)) + dataset.get_roi_ids = MagicMock(name='get_roi_ids') + dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') + dff_traces = MagicMock(name="dfftraces") + dataset.get_dff_traces = MagicMock(name='get_dff_traces', + return_value=(None, dff_traces)) + dxcm = MagicMock(name='dxcm') + dxtime = MagicMock(name='dxtime') + dataset.get_running_speed=MagicMock(name='get_running_speed', + return_value=(dxcm, dxtime)) + dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', + return_value=MagicMock()) + + return dataset + +def mock_speed_tuning(): + binned_dx_sp = MagicMock(name='binned_dx_sp') + binned_cells_sp = MagicMock(name='binned_cells_sp') + binned_dx_vis = MagicMock(name='binned_dx_vis') + binned_cells_vis = MagicMock(name='binned_cells_vis') + peak_run = MagicMock(name='peak_run') + + return MagicMock(name='get_speed_tuning', + return_value=(binned_dx_sp, + binned_cells_sp, + binned_dx_vis, + binned_cells_vis, + peak_run)) + +def mock_sweep_response(): + sweep_response = MagicMock(name='sweep_response') + mean_sweep_response = MagicMock(name='mean_sweep_response') + pval = MagicMock(name='pval') + + return MagicMock(name='get_sweep_response', + return_value=(sweep_response, + mean_sweep_response, + pval)) + +@patch.object(StimulusAnalysis, + 'get_speed_tuning', + mock_speed_tuning()) +@patch.object(StimulusAnalysis, + 'get_sweep_response', + mock_sweep_response()) +@pytest.mark.parametrize('trigger', (1, 2, 3, 4, 5)) +def test_harness(dataset, trigger): + dg = DriftingGratings(dataset) + + assert dg._stim_table is StimulusAnalysis._PRELOAD + assert dg._orivals is StimulusAnalysis._PRELOAD + assert dg._tfvals is StimulusAnalysis._PRELOAD + assert dg._number_ori is StimulusAnalysis._PRELOAD + assert dg._number_tf is StimulusAnalysis._PRELOAD + assert dg._sweep_response is StimulusAnalysis._PRELOAD + assert dg._mean_sweep_response is StimulusAnalysis._PRELOAD + assert dg._pval is StimulusAnalysis._PRELOAD + assert dg._response is StimulusAnalysis._PRELOAD + assert dg._peak is StimulusAnalysis._PRELOAD + + if trigger == 1: + print(dg.stim_table) + print(dg.sweep_response) + print(dg.response) + print(dg.peak) + elif trigger == 2: + print(dg.orivals) + print(dg.mean_sweep_response) + print(dg.response) + print(dg.peak) + elif trigger == 3: + print(dg.tfvals) + print(dg.pval) + print(dg.response) + print(dg.peak) + elif trigger == 4: + print(dg.number_ori) + print(dg.sweep_response) + print(dg.response) + print(dg.peak) + elif trigger == 5: + print(dg.number_tf) + print(dg.sweep_response) + print(dg.response) + print(dg.peak) + + assert dg._stim_table is not StimulusAnalysis._PRELOAD + assert dg._orivals is not StimulusAnalysis._PRELOAD + assert dg._tfvals is not StimulusAnalysis._PRELOAD + assert dg._number_ori is not StimulusAnalysis._PRELOAD + assert dg._number_tf is not StimulusAnalysis._PRELOAD + assert dg._sweep_response is not StimulusAnalysis._PRELOAD + assert dg._mean_sweep_response is not StimulusAnalysis._PRELOAD + assert dg._pval is not StimulusAnalysis._PRELOAD + assert dg._response is not StimulusAnalysis._PRELOAD + assert dg._peak is not StimulusAnalysis._PRELOAD + + # check super properties + dataset.get_corrected_fluorescence_traces.assert_called_once_with() + assert dg._timestamps != DriftingGratings._PRELOAD + assert dg._celltraces != DriftingGratings._PRELOAD + assert dg._numbercells != DriftingGratings._PRELOAD + + assert not dataset.get_roi_ids.called + assert dg._roi_id is DriftingGratings._PRELOAD + + assert dataset.get_cell_specimen_ids.called + assert dg._cell_id is DriftingGratings._PRELOAD + + assert not dataset.get_dff_traces.called + assert dg._dfftraces is DriftingGratings._PRELOAD + + assert dg._dxcm is DriftingGratings._PRELOAD + assert dg._dxtime is DriftingGratings._PRELOAD diff --git a/test/brain_observatory/test_locally_sparse_noise.py b/test/brain_observatory/test_locally_sparse_noise.py new file mode 100644 index 0000000000..6d81c98749 --- /dev/null +++ b/test/brain_observatory/test_locally_sparse_noise.py @@ -0,0 +1,175 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise +from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis +import pytest +from mock import patch, MagicMock +import itertools as it + + +@pytest.fixture +def dataset(): + dataset = MagicMock(name='dataset') + + timestamps = MagicMock(name='timestamps') + celltraces = MagicMock(name='celltraces') + dataset.get_corrected_fluorescence_traces = \ + MagicMock(name='get_corrected_fluorescence_traces', + return_value=(timestamps, celltraces)) + dataset.get_roi_ids = MagicMock(name='get_roi_ids') + dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') + dff_traces = MagicMock(name="dfftraces") + dataset.get_dff_traces = MagicMock(name='get_dff_traces', + return_value=(None, dff_traces)) + dxcm = MagicMock(name='dxcm') + dxtime = MagicMock(name='dxtime') + dataset.get_running_speed=MagicMock(name='get_running_speed', + return_value=(dxcm, dxtime)) + + LSN = MagicMock(name='LSN') + LSN_mask = MagicMock(name='LSN_mask') + dataset.get_locally_sparse_noise_stimulus_template = \ + MagicMock(name='get_locally_sparse_noise_stimulus_template', + return_value=(LSN, LSN_mask)) + + return dataset + +def mock_speed_tuning(): + binned_dx_sp = MagicMock(name='binned_dx_sp') + binned_cells_sp = MagicMock(name='binned_cells_sp') + binned_dx_vis = MagicMock(name='binned_dx_vis') + binned_cells_vis = MagicMock(name='binned_cells_vis') + peak_run = MagicMock(name='peak_run') + + return MagicMock(name='get_speed_tuning', + return_value=(binned_dx_sp, + binned_cells_sp, + binned_dx_vis, + binned_cells_vis, + peak_run)) + +def mock_sweep_response(): + sweep_response = MagicMock(name='sweep_response') + mean_sweep_response = MagicMock(name='mean_sweep_response') + pval = MagicMock(name='pval') + + return MagicMock(name='get_sweep_response', + return_value=(sweep_response, + mean_sweep_response, + pval)) + +@patch.object(StimulusAnalysis, + 'get_sweep_response', + mock_sweep_response()) +@patch.object(LocallySparseNoise, + 'get_receptive_field', + MagicMock(name='get_receptive_field')) +@pytest.mark.parametrize('stimulus,trigger', + it.product(('locally_sparse_noise', + 'locally_sparse_noise_4deg', + 'locally_sparse_noise_8deg'), + (1,2,3,4,5,6))) +def test_harness(dataset, + stimulus, + trigger): + with patch('allensdk.brain_observatory.stimulus_analysis.StimulusAnalysis.get_speed_tuning', + mock_speed_tuning()) as get_speed_tuning: + lsn = LocallySparseNoise(dataset, stimulus) + + assert lsn._stim_table is StimulusAnalysis._PRELOAD + assert lsn._LSN is StimulusAnalysis._PRELOAD + assert lsn._LSN_mask is StimulusAnalysis._PRELOAD + assert lsn._sweeplength is StimulusAnalysis._PRELOAD + assert lsn._interlength is StimulusAnalysis._PRELOAD + assert lsn._extralength is StimulusAnalysis._PRELOAD + assert lsn._sweep_response is StimulusAnalysis._PRELOAD + assert lsn._mean_sweep_response is StimulusAnalysis._PRELOAD + assert lsn._pval is StimulusAnalysis._PRELOAD + assert lsn._receptive_field is StimulusAnalysis._PRELOAD + + if trigger == 1: + print(lsn.stim_table) + print(lsn.sweep_response) + print(lsn.receptive_field) + elif trigger == 2: + print(lsn.LSN) + print(lsn.mean_sweep_response) + print(lsn.receptive_field) + elif trigger == 3: + print(lsn.LSN_mask) + print(lsn.pval) + print(lsn.receptive_field) + elif trigger == 4: + print(lsn.sweeplength) + print(lsn.sweep_response) + print(lsn.receptive_field) + elif trigger == 5: + print(lsn.interlength) + print(lsn.mean_sweep_response) + print(lsn.receptive_field) + elif trigger == 6: + print(lsn.extralength) + print(lsn.pval) + print(lsn.receptive_field) + + assert lsn._stim_table is not StimulusAnalysis._PRELOAD + assert lsn._LSN is not StimulusAnalysis._PRELOAD + assert lsn._LSN_mask is not StimulusAnalysis._PRELOAD + assert lsn._sweeplength is not StimulusAnalysis._PRELOAD + assert lsn._interlength is not StimulusAnalysis._PRELOAD + assert lsn._extralength is not StimulusAnalysis._PRELOAD + assert lsn._sweep_response is not StimulusAnalysis._PRELOAD + assert lsn._mean_sweep_response is not StimulusAnalysis._PRELOAD + assert lsn._pval is not StimulusAnalysis._PRELOAD + assert lsn._receptive_field is not StimulusAnalysis._PRELOAD + + # verify super class members weren't preloaded + assert not dataset.get_corrected_fluorescence_traces.called + assert lsn._timestamps is StimulusAnalysis._PRELOAD + assert lsn._celltraces is StimulusAnalysis._PRELOAD + assert lsn._numbercells is StimulusAnalysis._PRELOAD + + assert not dataset.get_roi_ids.called + assert lsn._roi_id is StimulusAnalysis._PRELOAD + + assert not dataset.get_cell_specimen_ids.called + assert lsn._cell_id is StimulusAnalysis._PRELOAD + + assert not dataset.get_dff_traces.called + assert lsn._dfftraces is StimulusAnalysis._PRELOAD + + assert lsn._dxcm is StimulusAnalysis._PRELOAD + assert lsn._dxtime is StimulusAnalysis._PRELOAD diff --git a/test/brain_observatory/test_natural_movie.py b/test/brain_observatory/test_natural_movie.py new file mode 100644 index 0000000000..b737f0503d --- /dev/null +++ b/test/brain_observatory/test_natural_movie.py @@ -0,0 +1,144 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.brain_observatory.natural_movie import NaturalMovie +from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis +import pytest +from mock import patch, MagicMock +import pandas as pd + + +@pytest.fixture +def stimulus_table(): + return pd.DataFrame([ + {'frame': 0, 'start': 0, 'stop': 1}, + {'frame': 0, 'start': 1, 'stop': 2}, + {'frame': 1, 'start': 2, 'stop': 3}, + ]) + + +@pytest.fixture +def dataset(stimulus_table): + dataset = MagicMock(name='dataset') + + timestamps = MagicMock(name='timestamps') + celltraces = MagicMock(name='celltraces') + dataset.get_corrected_fluorescence_traces = \ + MagicMock(name='get_corrected_fluorescence_traces', + return_value=(timestamps, celltraces)) + dataset.get_roi_ids = MagicMock(name='get_roi_ids') + dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') + dff_traces = MagicMock(name="dfftraces") + dataset.get_dff_traces = MagicMock(name='get_dff_traces', + return_value=(None, dff_traces)) + dxcm = MagicMock(name='dxcm') + dxtime = MagicMock(name='dxtime') + dataset.get_running_speed=MagicMock(name='get_running_speed', + return_value=(dxcm, dxtime)) + dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', + return_value=stimulus_table) + + return dataset + +def mock_speed_tuning(): + binned_dx_sp = MagicMock(name='binned_dx_sp') + binned_cells_sp = MagicMock(name='binned_cells_sp') + binned_dx_vis = MagicMock(name='binned_dx_vis') + binned_cells_vis = MagicMock(name='binned_cells_vis') + peak_run = MagicMock(name='peak_run') + + return MagicMock(name='get_speed_tuning', + return_value=(binned_dx_sp, + binned_cells_sp, + binned_dx_vis, + binned_cells_vis, + peak_run)) + +def mock_sweep_response(): + sweep_response = MagicMock(name='sweep_response') + mean_sweep_response = MagicMock(name='mean_sweep_response') + pval = MagicMock(name='pval') + + return MagicMock(name='get_sweep_response', + return_value=(sweep_response, + mean_sweep_response, + pval)) + +@patch.object(StimulusAnalysis, + 'get_speed_tuning', + mock_speed_tuning()) +@patch.object(StimulusAnalysis, + 'get_sweep_response', + mock_sweep_response()) +@pytest.mark.parametrize( + 'trigger', [ + ('stim_table', 'sweep_response', 'peak'), + ('sweeplength', 'sweep_response', 'peak') + ] +) +def test_harness(dataset, trigger): + movie_name = "Mock Movie Name" + nm = NaturalMovie(dataset, movie_name) + + assert nm._stim_table is StimulusAnalysis._PRELOAD + assert nm._sweeplength is StimulusAnalysis._PRELOAD + assert nm._sweep_response is StimulusAnalysis._PRELOAD + assert nm._peak is StimulusAnalysis._PRELOAD + + for attr in trigger: + print(getattr(nm, attr)) + + assert nm._stim_table is not StimulusAnalysis._PRELOAD + assert nm._sweeplength is not StimulusAnalysis._PRELOAD + assert nm._sweep_response is not StimulusAnalysis._PRELOAD + assert nm._peak is not StimulusAnalysis._PRELOAD + + # check super properties weren't preloaded + dataset.get_corrected_fluorescence_traces.assert_called_once_with() + assert nm._timestamps is not NaturalMovie._PRELOAD + assert nm._celltraces is not NaturalMovie._PRELOAD + assert nm._numbercells is not NaturalMovie._PRELOAD + + assert not dataset.get_roi_ids.called + assert nm._roi_id is NaturalMovie._PRELOAD + + assert dataset.get_cell_specimen_ids.called + assert nm._cell_id is NaturalMovie._PRELOAD + + assert not dataset.get_dff_traces.called + assert nm._dfftraces is NaturalMovie._PRELOAD + + assert nm._dxcm is NaturalMovie._PRELOAD + assert nm._dxtime is NaturalMovie._PRELOAD diff --git a/test/brain_observatory/test_natural_scenes.py b/test/brain_observatory/test_natural_scenes.py new file mode 100644 index 0000000000..447c21224d --- /dev/null +++ b/test/brain_observatory/test_natural_scenes.py @@ -0,0 +1,163 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.brain_observatory.natural_scenes import NaturalScenes +from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis +import pytest +from mock import patch, MagicMock + + +@pytest.fixture +def dataset(): + dataset = MagicMock(name='dataset') + + timestamps = MagicMock(name='timestamps') + celltraces = MagicMock(name='celltraces') + dataset.get_corrected_fluorescence_traces = \ + MagicMock(name='get_corrected_fluorescence_traces', + return_value=(timestamps, celltraces)) + dataset.get_roi_ids = MagicMock(name='get_roi_ids') + dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') + dff_traces = MagicMock(name="dfftraces") + dataset.get_dff_traces = MagicMock(name='get_dff_traces', + return_value=(None, dff_traces)) + dxcm = MagicMock(name='dxcm') + dxtime = MagicMock(name='dxtime') + dataset.get_running_speed=MagicMock(name='get_running_speed', + return_value=(dxcm, dxtime)) + dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', + return_value=MagicMock()) + + return dataset + +def mock_speed_tuning(): + binned_dx_sp = MagicMock(name='binned_dx_sp') + binned_cells_sp = MagicMock(name='binned_cells_sp') + binned_dx_vis = MagicMock(name='binned_dx_vis') + binned_cells_vis = MagicMock(name='binned_cells_vis') + peak_run = MagicMock(name='peak_run') + + return MagicMock(name='get_speed_tuning', + return_value=(binned_dx_sp, + binned_cells_sp, + binned_dx_vis, + binned_cells_vis, + peak_run)) + +def mock_sweep_response(): + sweep_response = MagicMock(name='sweep_response') + mean_sweep_response = MagicMock(name='mean_sweep_response') + pval = MagicMock(name='pval') + + return MagicMock(name='get_sweep_response', + return_value=(sweep_response, + mean_sweep_response, + pval)) + +@patch.object(StimulusAnalysis, + 'get_speed_tuning', + mock_speed_tuning()) +@patch.object(StimulusAnalysis, + 'get_sweep_response', + mock_sweep_response()) +@pytest.mark.parametrize('trigger', (1, 2, 3, 4, 5)) +def test_harness(dataset, trigger): + ns = NaturalScenes(dataset) + + assert ns._stim_table is StimulusAnalysis._PRELOAD + assert ns._number_scenes is StimulusAnalysis._PRELOAD + assert ns._sweeplength is StimulusAnalysis._PRELOAD + assert ns._interlength is StimulusAnalysis._PRELOAD + assert ns._extralength is StimulusAnalysis._PRELOAD + assert ns._sweep_response is StimulusAnalysis._PRELOAD + assert ns._mean_sweep_response is StimulusAnalysis._PRELOAD + assert ns._pval is StimulusAnalysis._PRELOAD + assert ns._response is StimulusAnalysis._PRELOAD + assert ns._peak is StimulusAnalysis._PRELOAD + + if trigger == 1: + print(ns._stim_table) + print(ns.sweep_response) + print(ns.response) + print(ns.peak) + if trigger == 2: + print(ns.number_scenes) + print(ns.sweep_response) + print(ns.response) + print(ns.peak) + elif trigger == 3: + print(ns.sweeplength) + print(ns.mean_sweep_response) + print(ns.response) + print(ns.peak) + elif trigger == 4: + print(ns.interlength) + print(ns.sweep_response) + print(ns.response) + print(ns.peak) + elif trigger == 5: + print(ns.extralength) + print(ns.mean_sweep_response) + print(ns.response) + print(ns.peak) + + assert ns._stim_table is not StimulusAnalysis._PRELOAD + assert ns._number_scenes is not StimulusAnalysis._PRELOAD + assert ns._sweeplength is not StimulusAnalysis._PRELOAD + assert ns._interlength is not StimulusAnalysis._PRELOAD + assert ns._extralength is not StimulusAnalysis._PRELOAD + assert ns._sweep_response is not StimulusAnalysis._PRELOAD + assert ns._mean_sweep_response is not StimulusAnalysis._PRELOAD + assert ns._pval is not StimulusAnalysis._PRELOAD + assert ns._response is not StimulusAnalysis._PRELOAD + assert ns._peak is not StimulusAnalysis._PRELOAD + + # check super properties + dataset.get_corrected_fluorescence_traces.assert_called_once_with() + assert ns._timestamps != NaturalScenes._PRELOAD + assert ns._celltraces != NaturalScenes._PRELOAD + assert ns._numbercells != NaturalScenes._PRELOAD + + assert not dataset.get_roi_ids.called + assert ns._roi_id is NaturalScenes._PRELOAD + + assert dataset.get_cell_specimen_ids.called + assert ns._cell_id is NaturalScenes._PRELOAD + + assert not dataset.get_dff_traces.called + assert ns._dfftraces is NaturalScenes._PRELOAD + + assert ns._dxcm is NaturalScenes._PRELOAD + assert ns._dxtime is NaturalScenes._PRELOAD diff --git a/test/brain_observatory/test_notebook.py b/test/brain_observatory/test_notebook.py new file mode 100644 index 0000000000..3b3626614e --- /dev/null +++ b/test/brain_observatory/test_notebook.py @@ -0,0 +1,281 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.core.brain_observatory_cache import BrainObservatoryCache +from allensdk.brain_observatory.drifting_gratings import DriftingGratings +from allensdk.brain_observatory.static_gratings import StaticGratings +from allensdk.brain_observatory.natural_scenes import NaturalScenes +from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise +from allensdk.brain_observatory.r_neuropil import estimate_contamination_ratios +import allensdk.brain_observatory.stimulus_info as stim_info +import numpy as np +import pandas as pd +import pytest +import os + + +@pytest.fixture +def boc(tmpdir_factory): + manifest_file = tmpdir_factory.mktemp('data').join(os.path.join('boc','manifest.json')) + endpoint = os.environ['TEST_API_ENDPOINT'] if 'TEST_API_ENDPOINT' in os.environ else 'http://api.brain-map.org' + return BrainObservatoryCache(manifest_file=str(manifest_file), base_uri=endpoint) + + +@pytest.mark.nightly +def test_brain_observatory_trace_analysis_notebook(boc): + # Drifting Gratings + data_set = boc.get_ophys_experiment_data(502376461) + dg = DriftingGratings(data_set) + specimen_id = 517425074 + specimen_ids = data_set.get_cell_specimen_ids() + + cell_loc = np.argwhere(specimen_ids==specimen_id)[0][0] + + assert cell_loc == 97 + + # temporal frequency plot + response = dg.response[:,1:,cell_loc,0] + tfvals = dg.tfvals[1:] + orivals = dg.orivals + + # peak + pk = dg.peak.loc[cell_loc] + + # trials for cell's preferred condition + pref_ori = dg.orivals[dg.peak.ori_dg[cell_loc]] + pref_tf = dg.tfvals[dg.peak.tf_dg[cell_loc]] + assert pref_ori == 180 + assert pref_tf == 2 + + pref_trials = dg.stim_table[(dg.stim_table.orientation==pref_ori)&(dg.stim_table.temporal_frequency==pref_tf)] + assert pref_trials['start'][1] == 837 + assert pref_trials['end'][1] == 897 + + # mean sweep response + subset = dg.sweep_response[(dg.stim_table.orientation==pref_ori)&(dg.stim_table.temporal_frequency==pref_tf)] + subset_mean = dg.mean_sweep_response[(dg.stim_table.orientation==pref_ori)&(dg.stim_table.temporal_frequency==pref_tf)] + assert np.isclose(subset_mean['dx'][1], 0.920868) + + # response to each trial + trial_timestamps = np.arange(-1*dg.interlength, dg.interlength+dg.sweeplength, 1.)/dg.acquisition_rate + + +@pytest.mark.nightly +def test_brain_observatory_static_gratings_notebook(boc): + data_set = boc.get_ophys_experiment_data(510938357) + sg = StaticGratings(data_set) + + peak_head = sg.peak.head() + assert peak_head['cell_specimen_id'][0] == 517399188 + assert np.isclose(peak_head['reliability_sg'][0], -0.010099250163301616) + + +@pytest.mark.nightly +def test_brain_observatory_natural_scenes_notebook(boc): + data_set = boc.get_ophys_experiment_data(510938357) + ns = NaturalScenes(data_set) + ns_head = ns.peak.head() + + assert np.isclose(ns_head['peak_dff_ns'][0], 4.9614532738) + assert ns_head['cell_specimen_id'][0] == 517399188 + + +@pytest.mark.nightly +def test_brain_observatory_locally_sparse_noise_notebook(boc): + specimen_id = 517410165 + cell = boc.get_cell_specimens(ids=[specimen_id])[0] + + exp = boc.get_ophys_experiments(experiment_container_ids=[cell['experiment_container_id']], + stimuli=[stim_info.LOCALLY_SPARSE_NOISE])[0] + + data_set = boc.get_ophys_experiment_data(exp['id']) + lsn = LocallySparseNoise(data_set) + specimen_ids = data_set.get_cell_specimen_ids() + cell_loc = np.argwhere(specimen_ids==specimen_id)[0][0] + receptive_field = lsn.receptive_field[:,:,cell_loc,0] + + assert True + #assert cell_loc + #assert receptive_field + +@pytest.mark.nightly +def test_brain_observatory_experiment_containers_notebook(boc): + targeted_structures = boc.get_all_targeted_structures() + visp_ecs = boc.get_experiment_containers(targeted_structures=['VISp']) + depths = boc.get_all_imaging_depths() + stims = boc.get_all_stimuli() + cre_lines = boc.get_all_cre_lines() + cux2_ecs = boc.get_experiment_containers(cre_lines=['Cux2-CreERT2']) + cux2_ec_id = cux2_ecs[-1]['id'] + exps = boc.get_ophys_experiments(experiment_container_ids=[cux2_ec_id]) + exp = boc.get_ophys_experiments(experiment_container_ids=[cux2_ec_id], + stimuli=[stim_info.STATIC_GRATINGS])[0] + exp = boc.get_ophys_experiment_data(exp['id']) + + assert set(depths) == set([175, 185, 195, 200, 205, 225, 250, 265, 275, 276, 285, + 300, 320, 325, 335, 350, 365, 375, 390, 400, 550, 570, + 625]) + + expected_stimuli = ['drifting_gratings', + 'locally_sparse_noise', + 'locally_sparse_noise_4deg', + 'locally_sparse_noise_8deg', + 'natural_movie_one', + 'natural_movie_three', + 'natural_movie_two', + 'natural_scenes', + 'spontaneous', + 'static_gratings'] + + assert set(stims) == set(expected_stimuli) + + expected_cre_lines = [ u'Cux2-CreERT2', + u'Emx1-IRES-Cre', + u'Fezf2-CreER', + u'Nr5a1-Cre', + u'Ntsr1-Cre_GN220', + u'Pvalb-IRES-Cre', + u'Rbp4-Cre_KL100', + u'Rorb-IRES2-Cre', + u'Scnn1a-Tg3-Cre', + u'Slc17a7-IRES2-Cre', + u'Sst-IRES-Cre', + u'Tlx3-Cre_PL56', + u'Vip-IRES-Cre' ] + + assert set(cre_lines) == set(expected_cre_lines) + + cells = boc.get_cell_specimens() + + cells = pd.DataFrame.from_records(cells) + + # find direction selective cells in VISp + visp_ec_ids = [ ec['id'] for ec in visp_ecs ] + visp_cells = cells[cells['experiment_container_id'].isin(visp_ec_ids)] + + # significant response to drifting gratings stimulus + sig_cells = visp_cells[visp_cells['p_dg'] < 0.05] + + # direction selective cells + dsi_cells = sig_cells[(sig_cells['dsi_dg'] > 0.5) & (sig_cells['dsi_dg'] < 1.5)] + #assert len(cells) == 27124 + assert len(cells) > 0 + #assert len(visp_cells) == 16031 + assert len(visp_cells) > 0 + #assert len(sig_cells) == 8669 + assert len(sig_cells) > 0 + #assert len(dsi_cells) == 4943 + assert len(dsi_cells) > 0 + + # find experiment containers for those cells + dsi_ec_ids = dsi_cells['experiment_container_id'].unique() + + # Download the ophys experiments containing the drifting gratings stimulus for VISp experiment containers + dsi_exps = boc.get_ophys_experiments(experiment_container_ids=dsi_ec_ids, stimuli=[stim_info.DRIFTING_GRATINGS]) + + # pick a direction-selective cell and find its NWB file + dsi_cell = dsi_cells.iloc[0] + + # figure out which ophys experiment has the drifting gratings stimulus for the cell's experiment container + cell_exp = boc.get_ophys_experiments(experiment_container_ids=[dsi_cell['experiment_container_id']], + stimuli=[stim_info.DRIFTING_GRATINGS])[0] + + data_set = boc.get_ophys_experiment_data(cell_exp['id']) + + # Fluorescence + dsi_cell_id = dsi_cell['cell_specimen_id'] + time, raw_traces = data_set.get_fluorescence_traces(cell_specimen_ids=[dsi_cell_id]) + _, demixed_traces = data_set.get_demixed_traces(cell_specimen_ids=[dsi_cell_id]) + _, neuropil_traces = data_set.get_neuropil_traces(cell_specimen_ids=[dsi_cell_id]) + _, corrected_traces = data_set.get_corrected_fluorescence_traces(cell_specimen_ids=[dsi_cell_id]) + _, dff_traces = data_set.get_dff_traces(cell_specimen_ids=[dsi_cell_id]) + + # ROI Masks + data_set = boc.get_ophys_experiment_data(510221121) + + # get the specimen IDs for a few cells + cids = data_set.get_cell_specimen_ids()[:15:5] + + # get masks for specific cells + roi_mask_list = data_set.get_roi_mask(cell_specimen_ids=cids) + + # make a mask of all ROIs in the experiment + all_roi_masks = data_set.get_roi_mask_array() + combined_mask = all_roi_masks.max(axis=0) + + max_projection = data_set.get_max_projection() + + # ROI Analysis + # example loading drifing grating data + data_set = boc.get_ophys_experiment_data(512326618) + dg = DriftingGratings(data_set) + + # filter for visually responding, selective cells + vis_cells = (dg.peak.ptest_dg < 0.05) & (dg.peak.peak_dff_dg > 3) + osi_cells = vis_cells & (dg.peak.osi_dg > 0.5) & (dg.peak.osi_dg <= 1.5) + dsi_cells = vis_cells & (dg.peak.dsi_dg > 0.5) & (dg.peak.dsi_dg <= 1.5) + + # 2-d tf vs. ori histogram + # tfval = 0 is used for the blank sweep, so we are ignoring it here + os = np.zeros((len(dg.orivals), len(dg.tfvals)-1)) + ds = np.zeros((len(dg.orivals), len(dg.tfvals)-1)) + + for i,trial in dg.peak[osi_cells].iterrows(): + os[trial.ori_dg, trial.tf_dg-1] += 1 + + for i,trial in dg.peak[dsi_cells].iterrows(): + ds[trial.ori_dg, trial.tf_dg-1] += 1 + + max_count = max(os.max(), ds.max()) + + # Neuropil correction + data_set = boc.get_ophys_experiment_data(569407590) + csid = data_set.get_cell_specimen_ids()[0] + + time, demixed_traces = data_set.get_demixed_traces( + cell_specimen_ids=[csid]) + _, neuropil_traces = data_set.get_neuropil_traces(cell_specimen_ids=[csid]) + + results = estimate_contamination_ratios(demixed_traces[0], neuropil_traces[0]) + correction = demixed_traces[0] - results['r'] * neuropil_traces[0] + _, corrected_traces = data_set.get_corrected_fluorescence_traces( + cell_specimen_ids=[csid]) + + # Running Speed and Motion Correction + data_set = boc.get_ophys_experiment_data(512326618) + dxcm, dxtime = data_set.get_running_speed() + mc = data_set.get_motion_correction() + + assert True diff --git a/test/brain_observatory/test_observatory_plots.py b/test/brain_observatory/test_observatory_plots.py new file mode 100644 index 0000000000..93673905e6 --- /dev/null +++ b/test/brain_observatory/test_observatory_plots.py @@ -0,0 +1,268 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import os +import matplotlib.image as mpimg +import numpy as np +from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet +import allensdk.brain_observatory.observatory_plots as oplots +from allensdk.brain_observatory.static_gratings import StaticGratings +from allensdk.brain_observatory.drifting_gratings import DriftingGratings +from allensdk.brain_observatory.natural_scenes import NaturalScenes +from allensdk.brain_observatory.natural_movie import NaturalMovie +from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise +import allensdk.brain_observatory.stimulus_info as stiminfo +import allensdk.core.json_utilities as ju +from pkg_resources import resource_filename # @UnresolvedImport + + +data_file = os.environ.get('TEST_OBSERVATORY_EXPERIMENT_PLOTS_DATA', 'skip') +if data_file == 'default': + data_file = resource_filename(__name__, 'test_observatory_plots_data.json') + +if data_file == 'skip': + EXPERIMENT_CONTAINER=None + TEST_DATA_DIR=None +else: + EXPERIMENT_CONTAINER = ju.read(data_file) + TEST_DATA_DIR = EXPERIMENT_CONTAINER['image_directory'] + +class AnalysisSingleton(object): + def __init__(self, klass, session, *args): + self.klass = klass + self.session = session + self.args = args + + self.obj = None + + @staticmethod + def experiment_for_session(session): + return next(exp for exp in EXPERIMENT_CONTAINER['experiments'] if exp['session'] == session) + + def __call__(self): + if self.obj is None: + exp = self.experiment_for_session(self.session) + data_set = BrainObservatoryNwbDataSet(exp['nwb_file']) + self.obj = self.klass.from_analysis_file(data_set, exp['analysis_file'], *self.args) + + return self.obj + +STATIC_GRATINGS = AnalysisSingleton(StaticGratings, stiminfo.THREE_SESSION_B) +DRIFTING_GRATINGS = AnalysisSingleton(DriftingGratings, stiminfo.THREE_SESSION_A) +NATURAL_SCENES = AnalysisSingleton(NaturalScenes, stiminfo.THREE_SESSION_B) +NATURAL_MOVIE_ONE_A = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_A, stiminfo.NATURAL_MOVIE_ONE) +NATURAL_MOVIE_ONE_B = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_B, stiminfo.NATURAL_MOVIE_ONE) +NATURAL_MOVIE_ONE_C = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_C, stiminfo.NATURAL_MOVIE_ONE) +NATURAL_MOVIE_TWO = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_C, stiminfo.NATURAL_MOVIE_TWO) +NATURAL_MOVIE_THREE = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_A, stiminfo.NATURAL_MOVIE_THREE) +LOCALLY_SPARSE_NOISE = AnalysisSingleton(LocallySparseNoise, stiminfo.THREE_SESSION_C, stiminfo.LOCALLY_SPARSE_NOISE) + +if EXPERIMENT_CONTAINER: + CELL_SPECIMEN_ID = EXPERIMENT_CONTAINER['cells'][0] +else: + CELL_SPECIMEN_ID = None + + +def assert_images_match(new_file, test_file, shape): + assert os.path.exists(new_file) + new_img = mpimg.imread(new_file) + assert np.allclose(new_img.shape[:2], shape) + + assert os.path.exists(test_file) + test_img = mpimg.imread(test_file) + assert np.allclose(new_img.shape, test_img.shape) + assert np.allclose(test_img.shape[:2], shape) + + assert (new_img - test_img).mean() < 0.1 + + os.remove(new_file) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,static_gratings", + [ [ 'static_gratings_ttp.png', STATIC_GRATINGS ] ]) +def test_ttp_static_gratings(new_file, static_gratings, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + static_gratings().plot_time_to_peak() + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,static_gratings", + [ [ 'static_gratings_pref_ori.png', STATIC_GRATINGS ] ]) +def test_pref_ori_static_gratings(new_file, static_gratings, shape=[250,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + static_gratings().plot_preferred_orientation() + oplots.finalize_no_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,static_gratings", + [ [ 'static_gratings_ori.png', STATIC_GRATINGS ] ]) +def test_osi_static_gratings(new_file, static_gratings, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + static_gratings().plot_orientation_selectivity() + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,static_gratings", + [ [ 'static_gratings_pref_sf.png', STATIC_GRATINGS ] ]) +def test_pref_sf(new_file, static_gratings, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + static_gratings().plot_preferred_spatial_frequency() + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,drifting_gratings", + [ [ 'drifting_gratings_pref_dir.png', DRIFTING_GRATINGS ] ]) +def test_pref_dir_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + drifting_gratings().plot_preferred_direction() + oplots.finalize_no_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,drifting_gratings", + [ [ 'drifting_gratings_pref_tf.png', DRIFTING_GRATINGS ] ]) +def test_pref_tf_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + drifting_gratings().plot_preferred_temporal_frequency() + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,drifting_gratings", + [ [ 'drifting_gratings_dsi.png', DRIFTING_GRATINGS ] ]) +def test_dsi_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + drifting_gratings().plot_direction_selectivity() + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,drifting_gratings", + [ [ 'drifting_gratings_osi.png', DRIFTING_GRATINGS ] ]) +def test_osi_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + drifting_gratings().plot_orientation_selectivity() + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,natural_scenes", + [ [ 'natural_scenes_ttp.png', NATURAL_SCENES ] ]) +def test_ttp_natural_scenes(new_file, natural_scenes, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + natural_scenes().plot_time_to_peak() + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,static_gratings,cell_specimen_id", + [ [ 'static_gratings_fan_plot.png', STATIC_GRATINGS, CELL_SPECIMEN_ID ] ]) +def test_fan_plot(new_file, static_gratings, cell_specimen_id, shape=[250,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + static_gratings().open_fan_plot(cell_specimen_id) + oplots.finalize_no_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,natural_scenes,cell_specimen_id", + [ [ 'natural_scenes_fan_plot.png', NATURAL_SCENES, CELL_SPECIMEN_ID ] ]) +def test_corona_plot(new_file, natural_scenes, cell_specimen_id, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + natural_scenes().open_corona_plot(cell_specimen_id) + oplots.finalize_no_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,natural_movie,cell_specimen_id", + [ ("natural_movie_one_a_track_plot.png", NATURAL_MOVIE_ONE_A, CELL_SPECIMEN_ID), + ("natural_movie_one_b_track_plot.png", NATURAL_MOVIE_ONE_B, CELL_SPECIMEN_ID), + ("natural_movie_one_c_track_plot.png", NATURAL_MOVIE_ONE_C, CELL_SPECIMEN_ID), + ("natural_movie_two_track_plot.png", NATURAL_MOVIE_TWO, CELL_SPECIMEN_ID), + ("natural_movie_three_track_plot.png", NATURAL_MOVIE_THREE, CELL_SPECIMEN_ID) ]) +def test_track_plot(new_file, natural_movie, cell_specimen_id, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + natural_movie().open_track_plot(cell_specimen_id) + oplots.finalize_no_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,drifting_gratings,cell_specimen_id", + [ [ 'drifting_gratings_star_plot.png', DRIFTING_GRATINGS, CELL_SPECIMEN_ID ] ]) +def test_star_plot(new_file, drifting_gratings, cell_specimen_id, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + drifting_gratings().open_star_plot(cell_specimen_id) + oplots.finalize_no_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,analysis,cell_specimen_id", + [ ("3sa_speed_tuning_plot.png", DRIFTING_GRATINGS, CELL_SPECIMEN_ID), + ("3sb_speed_tuning_plot.png", STATIC_GRATINGS, CELL_SPECIMEN_ID), + ("3sc_speed_tuning_plot.png", NATURAL_MOVIE_TWO, CELL_SPECIMEN_ID) ]) +def test_speed_tuning_plot(new_file, analysis, cell_specimen_id, shape=[500,500]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + analysis().plot_speed_tuning(cell_specimen_id) + oplots.finalize_with_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) + + +@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') +@pytest.mark.parametrize("new_file,locally_sparse_noise,on,cell_specimen_id", + [ ('locally_sparse_noise_on.png', LOCALLY_SPARSE_NOISE, True, CELL_SPECIMEN_ID), + ('locally_sparse_noise_off.png', LOCALLY_SPARSE_NOISE, False, CELL_SPECIMEN_ID) ]) +def test_pincushion_plot(new_file, locally_sparse_noise, on, cell_specimen_id, shape=[500,877]): + with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: + locally_sparse_noise().open_pincushion_plot(on, cell_specimen_id) + oplots.finalize_no_axes() + assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) diff --git a/test/brain_observatory/test_observatory_plots_data.json b/test/brain_observatory/test_observatory_plots_data.json new file mode 100644 index 0000000000..e17d2898f0 --- /dev/null +++ b/test/brain_observatory/test_observatory_plots_data.json @@ -0,0 +1,24 @@ +{ + "image_directory": "/data/informatics/module_test_data/observatory/plots/", + "cells": [ + 517446551 + ], + "experiments": [ + { + "nwb_file": "/data/informatics/module_test_data/observatory/plots/510859641.nwb", + "session": "three_session_A", + "analysis_file": "/data/informatics/module_test_data/observatory/plots/510859641_three_session_A_analysis.h5" + }, + { + "nwb_file": "/data/informatics/module_test_data/observatory/plots/510698988.nwb", + "session": "three_session_B", + "analysis_file": "/data/informatics/module_test_data/observatory/plots/510698988_three_session_B_analysis.h5" + }, + { + "nwb_file": "/data/informatics/module_test_data/observatory/plots/510532780.nwb", + "session": "three_session_C", + "analysis_file": "/data/informatics/module_test_data/observatory/plots/510532780_three_session_C_analysis.h5" + } + ], + "id": 511511083 +} \ No newline at end of file diff --git a/test/brain_observatory/test_roi_masks.py b/test/brain_observatory/test_roi_masks.py new file mode 100644 index 0000000000..e0266038d4 --- /dev/null +++ b/test/brain_observatory/test_roi_masks.py @@ -0,0 +1,215 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import numpy as np +import pandas as pd +import pytest +import allensdk.brain_observatory.roi_masks as roi_masks + + +def test_init_by_pixels(): + a = np.array([[0, 0], [1, 1], [1, 0]]) + + m = roi_masks.create_roi_mask(2, 2, [0, 0, 0, 0], pix_list=a) + + mp = m.get_mask_plane() + + assert mp[0, 0] == 1 + assert mp[1, 1] == 1 + assert mp[1, 0] == 0 + assert mp[1, 1] == 1 + + assert m.x == 0 + assert m.width == 2 + assert m.y == 0 + assert m.height == 2 + + +def test_init_by_pixels_with_border(): + a = np.array([[1, 1], [2, 1]]) + + m = roi_masks.create_roi_mask(3, 3, [1, 1, 1, 1], pix_list=a) + + assert m.x == 1 + assert m.width == 2 + assert m.y == 1 + assert m.height == 1 + assert m.overlaps_motion_border is True + + +def test_init_by_pixels_large(): + a = np.random.random((512, 512)) + a[a > 0.5] = 1 + + m = roi_masks.create_roi_mask( + 512, 512, [0, 0, 0, 0], pix_list=np.argwhere(a)) + + npx = len(np.where(a)[0]) + assert npx == len(np.where(m.get_mask_plane())[0]) + + +def test_create_neuropil_mask(): + + image_width = 100 + image_height = 80 + + # border = [image_width-1, 0, image_height-1, 0] + border = [5, 5, 5, 5] + + roi_mask = np.zeros((image_height, image_width), dtype=np.uint8) + roi_mask[40:45, 30:35] = 1 + + combined_binary_mask = np.zeros((image_height, image_width), dtype=np.uint8) + combined_binary_mask[:, 45:] = 1 + + roi = roi_masks.create_roi_mask(image_w=image_width, image_h=image_height, border=border, roi_mask=roi_mask) + obtained = roi_masks.create_neuropil_mask(roi, border, combined_binary_mask) + + expected_mask = np.zeros((58-27, 45-17), dtype=np.uint8) + expected_mask[:, :] = 1 + + assert np.allclose(expected_mask, obtained.mask) + assert obtained.x == 17 + assert obtained.y == 27 + assert obtained.width == 28 + assert obtained.height == 31 + + +def test_create_empty_neuropil_mask(): + image_width = 100 + image_height = 80 + + # border = [image_width-1, 0, image_height-1, 0] + border = [5, 5, 5, 5] + + roi_mask = np.zeros((image_height, image_width), dtype=np.uint8) + roi_mask[40:45, 30:35] = 1 + + combined_binary_mask = np.zeros((image_height, image_width), dtype=np.uint8) + combined_binary_mask[:, :] = 1 + + roi = roi_masks.create_roi_mask(image_w=image_width, image_h=image_height, border=border, roi_mask=roi_mask) + obtained = roi_masks.create_neuropil_mask(roi, border, combined_binary_mask) + + assert obtained.mask is None + assert 'zero_pixels' in obtained.flags + + +@pytest.fixture +def image_dims(): + return { + 'width': 100, + 'height': 100 + } + + +@pytest.fixture +def motion_border(): + return [5.0, 5.0, 5.0, 5.0] + +@pytest.fixture +def roi_mask_list(image_dims, motion_border): + + base_pixels = np.argwhere(np.ones((10, 10))) + + masks = [] + for ii in range(10): + pixels = base_pixels + ii * 10 + masks.append(roi_masks.create_roi_mask( + image_dims['width'], + image_dims['height'], + motion_border, + pix_list=pixels, + label=str(ii), + mask_group=-1 + )) + + return masks + +@pytest.fixture +def neuropil_masks(roi_mask_list, motion_border): + neuropil_masks = [] + + mask_array = roi_masks.create_roi_mask_array(roi_mask_list) + combined_mask = mask_array.max(axis=0) + + for roi_mask in roi_mask_list: + neuropil_masks.append(roi_masks.create_neuropil_mask( + roi_mask, + motion_border, + combined_mask, + roi_mask.label + )) + return neuropil_masks + +@pytest.fixture +def video(image_dims): + num_frames = 20 + data = np.ones((num_frames, image_dims['height'], image_dims['width'])) + data[:, 50:, 50:] = 2 + return data + + +def test_calculate_traces(video, roi_mask_list): + roi_traces, exclusions = roi_masks.calculate_traces(video, roi_mask_list) + + expected_exclusions = pd.DataFrame({ + 'roi_id': ['0', '9'], + 'exclusion_label_name': ['motion_border', 'motion_border'] + }) + + assert np.all(np.isnan(roi_traces[0, :])) + assert np.all(roi_traces[4, :] == 1) + assert np.all(roi_traces[6, :] == 2) + assert np.all(np.isnan(roi_traces[9, :])) + + pd.testing.assert_frame_equal(expected_exclusions, pd.DataFrame(exclusions), check_like=True) + + +def test_validate_masks(roi_mask_list, neuropil_masks): + roi_mask_list.extend(neuropil_masks) + roi_mask_list[3].mask = np.zeros_like(roi_mask_list[3].mask) + roi_mask_list[17].mask = np.zeros_like(roi_mask_list[17].mask) + + obtained = [] + for mask in roi_mask_list: + obtained.extend(roi_masks.validate_mask(mask)) + + expected_exclusions = pd.DataFrame({ + 'roi_id': ['0', '3', '9', '7'], + 'exclusion_label_name': ['motion_border', 'empty_roi_mask', 'motion_border', 'empty_neuropil_mask'] + }) + pd.testing.assert_frame_equal(expected_exclusions, pd.DataFrame(obtained), check_like=True) + diff --git a/test/brain_observatory/test_session_analysis.py b/test/brain_observatory/test_session_analysis.py new file mode 100644 index 0000000000..fa9754605a --- /dev/null +++ b/test/brain_observatory/test_session_analysis.py @@ -0,0 +1,141 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import patch +from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet +from allensdk.brain_observatory.session_analysis import SessionAnalysis +import os + + +_orig_get_stimulus_table = BrainObservatoryNwbDataSet.get_stimulus_table + + +def mock_stimulus_table(dset, name): + t = _orig_get_stimulus_table(dset, name) + t.set_value(0, 'end', + t.loc[0,'start'] + 10) + + return t + + +@pytest.fixture +def session_a(): + filename = os.path.abspath(os.path.join( + "/", "allen", "aibs", "informatics", "module_test_data", + "observatory", "test_nwb", "out_510390912.nwb" + )) + save_path = 'xyza' + + sa = SessionAnalysis(filename, save_path) + + return sa + + +@pytest.fixture +def session_b(): + filename = os.path.abspath(os.path.join( + "/", "allen", "aibs", "informatics", "module_test_data", + "observatory", "test_nwb", "506278598.nwb" + )) + save_path = 'xyzb' + + sa = SessionAnalysis(filename, save_path) + + return sa + + +@pytest.fixture +def session_c(): + filename = os.path.abspath(os.path.join( + "/", "allen", "aibs", "informatics", "module_test_data", + "observatory", "test_nwb", "out_510221121.nwb" + )) + save_path = 'xyzc' + + sa = SessionAnalysis(filename, save_path) + + return sa + + +@pytest.mark.nightly +@pytest.mark.parametrize('plot_flag',[False]) +def test_session_a(session_a, plot_flag): + with patch('allensdk.core.brain_observatory_nwb_data_set.BrainObservatoryNwbDataSet.get_stimulus_table', + mock_stimulus_table): + session_a.session_a(plot_flag=plot_flag) + + assert True + + +@pytest.mark.nightly +@pytest.mark.parametrize('plot_flag',[False]) +def test_session_b(session_b, plot_flag): + with patch('allensdk.core.brain_observatory_nwb_data_set.BrainObservatoryNwbDataSet.get_stimulus_table', + mock_stimulus_table): + session_b.session_b(plot_flag=plot_flag) + + assert True + + +@pytest.mark.nightly +@pytest.mark.parametrize('plot_flag',[False]) +def test_session_c(session_c, plot_flag): + with patch('allensdk.core.brain_observatory_nwb_data_set.BrainObservatoryNwbDataSet.get_stimulus_table', + mock_stimulus_table): + session_c.session_c(plot_flag=plot_flag) + + assert True + + +@pytest.mark.nightly +def test_session_get_session_type(session_a): + session_type = session_a.nwb.get_session_type() + + assert session_type == 'three_session_A' + + +@pytest.mark.nightly +def test_session_get_session_type_b(session_b): + session_type = session_b.nwb.get_session_type() + + assert session_type == 'three_session_B' + + +@pytest.mark.nightly +def test_session_get_session_type_c(session_c): + session_type = session_c.nwb.get_session_type() + + assert session_type == 'three_session_C' diff --git a/test/brain_observatory/test_session_analysis_regression.py b/test/brain_observatory/test_session_analysis_regression.py new file mode 100644 index 0000000000..1dcc466bef --- /dev/null +++ b/test/brain_observatory/test_session_analysis_regression.py @@ -0,0 +1,279 @@ +import logging +import sys +logging.basicConfig(level=logging.DEBUG) + +import pytest +import os +import json +from pkg_resources import resource_filename # @UnresolvedImport +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.drifting_gratings import DriftingGratings +from allensdk.brain_observatory.static_gratings import StaticGratings +from allensdk.brain_observatory.natural_movie import NaturalMovie +from allensdk.brain_observatory.natural_scenes import NaturalScenes +from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise +from allensdk.brain_observatory.session_analysis import SessionAnalysis +from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet as BODS +import allensdk.brain_observatory.stimulus_info as si + +if 'TEST_SESSION_ANALYSIS_REGRESSION_DATA' in os.environ: + data_file = os.environ['TEST_SESSION_ANALYSIS_REGRESSION_DATA'] +else: + data_file = resource_filename(__name__, 'test_session_analysis_regression_data.json') + +@pytest.fixture(scope="module") +def paths(): + pyversion = sys.version_info[0] + logging.debug("loading " + data_file) + with open(data_file,'r') as f: + data = json.load(f) + return data[str(pyversion)] + +@pytest.fixture(scope="module") +def nwb_a(paths): + return paths['nwb_a'] + +@pytest.fixture(scope="module") +def nwb_b(paths): + return paths['nwb_b'] + +@pytest.fixture(scope="module") +def nwb_c(paths): + return paths['nwb_c'] + +@pytest.fixture(scope="module") +def analysis_a(paths): + return paths['analysis_a'] + +@pytest.fixture(scope="module") +def analysis_b(paths): + return paths['analysis_b'] + +@pytest.fixture(scope="module") +def analysis_c(paths): + return paths['analysis_c'] + +# session a + +@pytest.fixture(scope="module") +def dg(nwb_a, analysis_a): + return DriftingGratings.from_analysis_file(BODS(nwb_a), analysis_a) + +@pytest.fixture(scope="module") +def nm1a(nwb_a, analysis_a): + return NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a, si.NATURAL_MOVIE_ONE) + +@pytest.fixture(scope="module") +def nm3(nwb_a, analysis_a): + return NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a, si.NATURAL_MOVIE_THREE) + +# session b + +@pytest.fixture(scope="module") +def sg(nwb_b, analysis_b): + return StaticGratings.from_analysis_file(BODS(nwb_b), analysis_b) + +@pytest.fixture(scope="module") +def nm1b(nwb_b, analysis_b): + return NaturalMovie.from_analysis_file(BODS(nwb_b), analysis_b, si.NATURAL_MOVIE_ONE) + +@pytest.fixture(scope="module") +def ns(nwb_b, analysis_b): + return NaturalScenes.from_analysis_file(BODS(nwb_b), analysis_b) + +# session c +@pytest.fixture(scope="module") +def lsn(nwb_c, analysis_c): + # in order to work around 2/3 unicode compatibility, separate files are specified for python 2 and 3 + # we need to look up a different key depending on python version + key = si.LOCALLY_SPARSE_NOISE_4DEG if sys.version_info < (3,) else si.LOCALLY_SPARSE_NOISE + + return LocallySparseNoise.from_analysis_file(BODS(nwb_c), analysis_c, key) + +@pytest.fixture(scope="module") +def nm1c(nwb_c, analysis_c): + return NaturalMovie.from_analysis_file(BODS(nwb_c), analysis_c, si.NATURAL_MOVIE_ONE) + +@pytest.fixture(scope="module") +def nm2(nwb_c, analysis_c): + return NaturalMovie.from_analysis_file(BODS(nwb_c), analysis_c, si.NATURAL_MOVIE_TWO) + +@pytest.fixture(scope="module") +def analysis_a_new(nwb_a, tmpdir_factory): + save_path = str(tmpdir_factory.mktemp("session_a") / "session_a_new.h5") + + logging.debug("running analysis a") + session_analysis = SessionAnalysis(nwb_a, save_path) + session_analysis.session_a(plot_flag=False, save_flag=True) + logging.debug("done running analysis a") + logging.debug(save_path) + + yield save_path + + +@pytest.fixture(scope="module") +def analysis_b_new(nwb_b, tmpdir_factory): + save_path = str(tmpdir_factory.mktemp("session_b") / "session_b_new.h5") + + logging.debug("running analysis b") + session_analysis = SessionAnalysis(nwb_b, save_path) + session_analysis.session_b(plot_flag=False, save_flag=True) + logging.debug("done running analysis b") + logging.debug(save_path) + + yield save_path + + +@pytest.fixture(scope="module") +def analysis_c_new(nwb_c, tmpdir_factory): + save_path = str(tmpdir_factory.mktemp("session_c") / "session_c_new.h5") + + logging.debug("running analysis c") + session_analysis = SessionAnalysis(nwb_c, save_path) + + session_type = BODS(nwb_c).get_metadata()['session_type'] + if session_type == si.THREE_SESSION_C2: + session_analysis.session_c2(plot_flag=False, save_flag=True) + elif session_type == si.THREE_SESSION_C: + session_analysis.session_c(plot_flag=False, save_flag=True) + logging.debug("done running analysis c") + + logging.debug(save_path) + + yield save_path + + +def compare_peak(p1, p2): + assert len(set(p1.columns) ^ set(p2.columns)) == 0 + + p1 = p1.infer_objects() + p2 = p2.infer_objects() + + peak_blacklist = [ "rf_center_on_x_lsn", + "rf_center_on_y_lsn", + "rf_center_off_x_lsn", + "rf_center_off_y_lsn", + "rf_area_on_lsn", + "rf_area_off_lsn", + "rf_distance_lsn", + "rf_overlap_index_lsn", + "rf_chi2_lsn" ] + + for col in p1.select_dtypes(include=[np.number]): + if col in peak_blacklist: + logging.debug("skipping " + col) + continue + + logging.debug("checking " + col) + assert np.allclose(p1[col], p2[col], equal_nan=True) + + for col in p1.select_dtypes(include=['O']): + logging.debug("checking " + col) + assert all(p1[col] == p2[col]) + +@pytest.mark.nightly +def test_session_a(analysis_a, analysis_a_new): + peak = pd.read_hdf(analysis_a, "analysis/peak") + new_peak = pd.read_hdf(analysis_a_new, "analysis/peak") + compare_peak(peak, new_peak) + + +@pytest.mark.nightly +def test_drifting_gratings(dg, nwb_a, analysis_a_new): + logging.debug("reading outputs") + dg_new = DriftingGratings.from_analysis_file(BODS(nwb_a), analysis_a_new) + #assert np.allclose(dg.sweep_response, dg_new.sweep_response) + assert np.allclose(dg.mean_sweep_response, dg_new.mean_sweep_response, equal_nan=True) + + assert np.allclose(dg.response, dg_new.response, equal_nan=True) + assert np.allclose(dg.noise_correlation, dg_new.noise_correlation, equal_nan=True) + assert np.allclose(dg.signal_correlation, dg_new.signal_correlation, equal_nan=True) + assert np.allclose(dg.representational_similarity, dg_new.representational_similarity, equal_nan=True) + +@pytest.mark.nightly +def test_natural_movie_one_a(nm1a, nwb_a, analysis_a_new): + nm1a_new = NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a_new, si.NATURAL_MOVIE_ONE) + #assert np.allclose(nm1a.sweep_response, nm1a_new.sweep_response) + assert np.allclose(nm1a.binned_cells_sp, nm1a_new.binned_cells_sp, equal_nan=True) + assert np.allclose(nm1a.binned_cells_vis, nm1a_new.binned_cells_vis, equal_nan=True) + assert np.allclose(nm1a.binned_dx_sp, nm1a_new.binned_dx_sp, equal_nan=True) + assert np.allclose(nm1a.binned_dx_vis, nm1a_new.binned_dx_vis, equal_nan=True) + +@pytest.mark.nightly +def test_natural_movie_three(nm3, nwb_a, analysis_a_new): + #nm3_new = NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a_new, si.NATURAL_MOVIE_THREE) + #assert np.allclose(nm3.sweep_response, nm3_new.sweep_response) + pass + + +@pytest.mark.nightly +def test_session_b(analysis_b, analysis_b_new): + peak = pd.read_hdf(analysis_b, "analysis/peak") + new_peak = pd.read_hdf(analysis_b_new, "analysis/peak") + compare_peak(peak, new_peak) + +@pytest.mark.nightly +def test_static_gratings(sg, nwb_b, analysis_b_new): + sg_new = StaticGratings.from_analysis_file(BODS(nwb_b), analysis_b_new) + #assert np.allclose(sg.sweep_response, sg_new.sweep_response) + assert np.allclose(sg.mean_sweep_response, sg_new.mean_sweep_response, equal_nan=True) + + assert np.allclose(sg.response, sg_new.response, equal_nan=True) + assert np.allclose(sg.noise_correlation, sg_new.noise_correlation, equal_nan=True) + assert np.allclose(sg.signal_correlation, sg_new.signal_correlation, equal_nan=True) + assert np.allclose(sg.representational_similarity, sg_new.representational_similarity, equal_nan=True) + +@pytest.mark.nightly +def test_natural_movie_one_b(nm1b, nwb_b, analysis_b_new): + nm1b_new = NaturalMovie.from_analysis_file(BODS(nwb_b), analysis_b_new, si.NATURAL_MOVIE_ONE) + #assert np.allclose(nm1b.sweep_response, nm1b_new.sweep_response) + + assert np.allclose(nm1b.binned_cells_sp, nm1b_new.binned_cells_sp, equal_nan=True) + assert np.allclose(nm1b.binned_cells_vis, nm1b_new.binned_cells_vis, equal_nan=True) + assert np.allclose(nm1b.binned_dx_sp, nm1b_new.binned_dx_sp, equal_nan=True) + assert np.allclose(nm1b.binned_dx_vis, nm1b_new.binned_dx_vis, equal_nan=True) + +@pytest.mark.nightly +def test_natural_scenes(ns, nwb_b, analysis_b_new): + ns_new = NaturalScenes.from_analysis_file(BODS(nwb_b), analysis_b_new) + #assert np.allclose(ns.sweep_response, ns_new.sweep_response) + assert np.allclose(ns.mean_sweep_response, ns_new.mean_sweep_response, equal_nan=True) + + assert np.allclose(ns.noise_correlation, ns_new.noise_correlation, equal_nan=True) + assert np.allclose(ns.signal_correlation, ns_new.signal_correlation, equal_nan=True) + assert np.allclose(ns.representational_similarity, ns_new.representational_similarity, equal_nan=True) + +@pytest.mark.nightly +def test_session_c(analysis_c, analysis_c_new): + peak = pd.read_hdf(analysis_c, "analysis/peak") + new_peak = pd.read_hdf(analysis_c_new, "analysis/peak") + compare_peak(peak, new_peak) + +@pytest.mark.nightly +def test_locally_sparse_noise(lsn, nwb_c, analysis_c_new): + ds = BODS(nwb_c) + session_type = ds.get_metadata()['session_type'] + logging.debug(session_type) + + if session_type == si.THREE_SESSION_C: + lsn_new = LocallySparseNoise.from_analysis_file(ds, analysis_c_new, si.LOCALLY_SPARSE_NOISE) + elif session_type == si.THREE_SESSION_C2: + lsn_new = LocallySparseNoise.from_analysis_file(ds, analysis_c_new, si.LOCALLY_SPARSE_NOISE_4DEG) + + #assert np.allclose(lsn.sweep_response, lsn_new.sweep_response) + assert np.allclose(lsn.mean_sweep_response, lsn_new.mean_sweep_response, equal_nan=True) + +@pytest.mark.nightly +def test_natural_movie_one_c(nm1c, nwb_c, analysis_c_new): + nm1c_new = NaturalMovie.from_analysis_file(BODS(nwb_c), analysis_c_new, si.NATURAL_MOVIE_ONE) + #assert np.allclose(nm1c.sweep_response, nm1c_new.sweep_response) + + assert np.allclose(nm1c.binned_dx_sp, nm1c_new.binned_dx_sp, equal_nan=True) + assert np.allclose(nm1c.binned_dx_vis, nm1c_new.binned_dx_vis, equal_nan=True) + assert np.allclose(nm1c.binned_cells_sp, nm1c_new.binned_cells_sp, equal_nan=True) + assert np.allclose(nm1c.binned_cells_vis, nm1c_new.binned_cells_vis, equal_nan=True) + + + diff --git a/test/brain_observatory/test_session_analysis_regression_data.json b/test/brain_observatory/test_session_analysis_regression_data.json new file mode 100644 index 0000000000..72767b0f06 --- /dev/null +++ b/test/brain_observatory/test_session_analysis_regression_data.json @@ -0,0 +1,18 @@ +{ + "2": { + "analysis_a": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847_three_session_A_analysis.h5", + "analysis_b": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590_three_session_B_analysis.h5", + "analysis_c": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121_three_session_C2_analysis.h5", + "nwb_a": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847.nwb", + "nwb_b": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590.nwb", + "nwb_c": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121.nwb" + }, + "3": { + "analysis_a": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/new_ks_2samp-2020-07-07/510859641_three_session_A_analysis.h5", + "analysis_b": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/new_ks_2samp-2020-07-07/510698988_three_session_B_analysis.h5", + "analysis_c": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/new_ks_2samp-2020-07-07/510532780_three_session_C_analysis.h5", + "nwb_a": "/allen/aibs/informatics/module_test_data/observatory//plots/510859641.nwb", + "nwb_b": "/allen/aibs/informatics/module_test_data/observatory/plots/510698988.nwb", + "nwb_c": "/allen/aibs/informatics/module_test_data/observatory/plots/510532780.nwb" + } +} \ No newline at end of file diff --git a/test/brain_observatory/test_session_analysis_regression_data_list.json b/test/brain_observatory/test_session_analysis_regression_data_list.json new file mode 100644 index 0000000000..fe9f455201 --- /dev/null +++ b/test/brain_observatory/test_session_analysis_regression_data_list.json @@ -0,0 +1,44 @@ +[ + { + "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121.nwb", + "version": 2, + "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121_three_session_C2_analysis.h5", + "ophys_experiment_id": 569494121, + "session_type": "three_session_C2" + }, + { + "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847.nwb", + "version": 2, + "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847_three_session_A_analysis.h5", + "ophys_experiment_id": 570305847, + "session_type": "three_session_A" + }, + { + "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590.nwb", + "version": 2, + "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590_three_session_B_analysis.h5", + "ophys_experiment_id": 569407590, + "session_type": "three_session_B" + }, + { + "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/plots/510532780.nwb", + "version": 3, + "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/510532780_three_session_C_analysis.h5", + "ophys_experiment_id": 510532780, + "session_type": "three_session_C" + }, + { + "nwb_file": "/allen/aibs/informatics/module_test_data/observatory//plots/510859641.nwb", + "version": 3, + "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/510859641_three_session_A_analysis.h5", + "ophys_experiment_id": 510859641, + "session_type": "three_session_A" + }, + { + "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/plots/510698988.nwb", + "version": 3, + "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/510698988_three_session_B_analysis.h5", + "ophys_experiment_id": 510698988, + "session_type": "three_session_B" + } +] \ No newline at end of file diff --git a/test/brain_observatory/test_session_api_utils.py b/test/brain_observatory/test_session_api_utils.py new file mode 100644 index 0000000000..00c61d9714 --- /dev/null +++ b/test/brain_observatory/test_session_api_utils.py @@ -0,0 +1,313 @@ +import warnings +from inspect import Parameter + +import pytest +import numpy as np +import pandas as pd + +from allensdk.brain_observatory.session_api_utils import is_equal, ParamsMixin + + +class ParamsMixinTestHarness(ParamsMixin): + + def __init__(self, param_to_ignore, a_param_1: int, a_param_2: float, + b_param_1: list, c_param_1: bool, d_param_1: np.ndarray, + e_param_1: pd.Series, f_param_1: pd.DataFrame): + + super().__init__(ignore={'param_to_ignore'}) + + self._a_param_1 = a_param_1 + self._a_param_2 = a_param_2 + self._b_param_1 = b_param_1 + self._c_param_1 = c_param_1 + self._d_param_1 = d_param_1 + self._e_param_1 = e_param_1 + self._f_param_1 = f_param_1 + + +@pytest.fixture +def mixin_harness_fixture(request) -> ParamsMixinTestHarness: + param_to_ignore = request.param.get('param_to_ignore', 'x') + a_param_1 = request.param.get('a_param_1', 8) + a_param_2 = request.param.get('a_param_2', 42.0) + b_param_1 = request.param.get('b_param_1', [1, 2, 3]) + c_param_1 = request.param.get('c_param_1', True) + d_param_1 = request.param.get('d_param_1', np.array([5, 5])) + e_param_1 = request.param.get('e_param_1', pd.Series([4.0, 5.0])) + f_param_1 = request.param.get('f_param_1', pd.DataFrame([1, 2, 3])) + + mixed_in = ParamsMixinTestHarness(param_to_ignore, a_param_1, + a_param_2, b_param_1, c_param_1, + d_param_1, e_param_1, f_param_1) + mixed_in._updated_params = request.param.get('updated_params', set()) + + return mixed_in + + +@pytest.mark.parametrize("a, b, expected", [ + (2, 2, True), + ('1', '1', True), + (1.5, 1.5, True), + ([1, 2, 3], [1, 2, 3], True), + ({1, 2, 3}, {1, 2, 3}, True), + ({'a', 'b', 'c'}, {'c', 'a', 'b'}, True), + ({'a': 0, 'z': 42}, {'a': 0, 'z': 42}, True), + (np.array([1, 2, 3]), np.array([1, 2, 3]), True), + ({'c': np.array([5, 5])}, {'c': np.array([5, 5])}, True), + (pd.Series([5, 5, 5]), pd.Series([5, 5, 5]), True), + (pd.DataFrame([10, 10]), pd.DataFrame([10, 10]), True), + ([pd.DataFrame(['a', 'b', 'c'])], [pd.DataFrame(['a', 'b', 'c'])], True), + ({'a': np.array([1, 2, 3])}, {'a': np.array([1, 2, 3])}, True), + ({'a': {'x': pd.Series([5.0, 6.0])}}, {'a': {'x': pd.Series([5.0, 6.0])}}, True), + ({'a': 20, 'b': 30}, {'b': 30, 'a': 20}, True), + + (1, 2.0, False), + ('1', 2, False), + ([1, 2, 3], 5, False), + ([1, 2, 3], [1, 2], False), + ([1, 2, 3], [3, 2, 1], False), + (['a', 'b'], {'a', 'b'}, False), + ({'a'}, {'a', 'b'}, False), + ({'a'}, {'b'}, False), + ({'a', 'b'}, np.array(['a', 'b']), False), + (np.array([3, 4, 5]), np.array([3, 4]), False), + ({'c': np.array([5, 5])}, {'c': np.array([5, 6])}, False), + (pd.Series([5, 5, 5]), pd.Series([5, 6, 5]), False), + (pd.Series([1, 2, 3]), pd.Series([1, 2]), False), + (pd.DataFrame([10, 10]), pd.DataFrame([10, 7]), False), + (pd.DataFrame([10, 20, 30]), pd.DataFrame([10, 20]), False), + ([pd.DataFrame(['a', 'b', 'c'])], [pd.DataFrame(['a', 'b', 'd'])], False), + ({'a': np.array([1, 2, 3])}, {'a': np.array([1, 2, 5])}, False), + ({'a': {'x': pd.Series([5.0, 6.0])}}, {'a': {'x': pd.Series([5.0, 7.0])}}, False), + + (pd.Series([5, 5, 5]), np.array([5, 5, 5]), False), + (np.array([8, 8, 8]), pd.DataFrame([8, 8, 8]), False), + (pd.Series([3, 3, 3]), pd.DataFrame([3, 3, 3]), False), +]) +def test_is_equal(a, b, expected): + assert is_equal(a, b) == expected + + +@pytest.mark.parametrize("mixin_harness_fixture, expected", [ + ({}, + [Parameter('param_to_ignore', Parameter.POSITIONAL_OR_KEYWORD), + Parameter('a_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=int), + Parameter('a_param_2', Parameter.POSITIONAL_OR_KEYWORD, annotation=float), + Parameter('b_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=list), + Parameter('c_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=bool), + Parameter('d_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=np.ndarray), + Parameter('e_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=pd.Series), + Parameter('f_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=pd.DataFrame)]), +], indirect=["mixin_harness_fixture"]) +def test_get_param_signatures(mixin_harness_fixture, expected): + obtained = mixin_harness_fixture._get_param_signatures() + assert obtained == expected + + +@pytest.mark.parametrize("mixin_harness_fixture, expected", [ + ({}, + {'param_to_ignore': Parameter.empty, 'a_param_1': int, + 'a_param_2': float, 'b_param_1': list, 'c_param_1': bool, + 'd_param_1': np.ndarray, 'e_param_1': pd.Series, + 'f_param_1': pd.DataFrame}), +], indirect=["mixin_harness_fixture"]) +def test_get_param_type_annotations(mixin_harness_fixture, expected): + obtained = mixin_harness_fixture._get_param_type_annotations() + assert obtained == expected + + +@pytest.mark.parametrize("mixin_harness_fixture, expected", [ + ({}, + ['a_param_1', 'a_param_2', 'b_param_1', 'c_param_1', 'd_param_1', + 'e_param_1', 'f_param_1', 'param_to_ignore']), +], indirect=["mixin_harness_fixture"]) +def test_get_param_names(mixin_harness_fixture, expected): + obtained = mixin_harness_fixture._get_param_names() + assert obtained == expected + + +@pytest.mark.parametrize("mixin_harness_fixture, expected", [ + ({}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({'a_param_1': 2, 'a_param_2': 10.0, 'b_param_1': [1], 'c_param_1': False}, + {'a_param_1': 2, 'a_param_2': 10.0, 'b_param_1': [1], + 'c_param_1': False, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}) +], indirect=["mixin_harness_fixture"]) +def test_get_params(mixin_harness_fixture, expected): + obtained = mixin_harness_fixture.get_params() + is_equal(obtained, expected) + + +@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, expected", [ + ({}, + {'a_param_1': 5}, + {'a_param_1': 5, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'a_param_2': 10.0}, + {'a_param_1': 8, 'a_param_2': 10.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'b_param_1': [3, 4, 5]}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [3, 4, 5], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'a_param_1': 20, 'a_param_2': 3.14, 'b_param_1': [9, 10]}, + {'a_param_1': 20, 'a_param_2': 3.14, 'b_param_1': [9, 10], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'d_param_1': np.array([20, 20]), 'e_param_1': pd.Series([1, 2, 3]), 'b_param_1': [9, 10]}, + {'a_param_1': 20, 'a_param_2': 3.14, 'b_param_1': [9, 10], + 'c_param_1': True, 'd_param_1': np.array([20, 20]), + 'e_param_1': pd.Series([1, 2, 3]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + +], indirect=["mixin_harness_fixture"]) +def test_set_params_basic(mixin_harness_fixture, params_to_set, expected): + mixin_harness_fixture.set_params(**params_to_set) + obtained = mixin_harness_fixture.get_params() + is_equal(obtained, expected) + + +@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, expected", [ + ({}, + {'a_param': 5}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'something_random': 10.0}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + +], indirect=["mixin_harness_fixture"]) +def test_set_params_with_invalid_params(mixin_harness_fixture, + params_to_set, expected): + with warnings.catch_warnings(record=True) as w: + mixin_harness_fixture.set_params(**params_to_set) + assert 'not valid and is being ignored' in str(w[-1].message) + + obtained = mixin_harness_fixture.get_params() + is_equal(obtained, expected) + + +@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, expected", [ + ({}, + {'a_param_1': 'hello'}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'a_param_2': [5]}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'b_param_1': 1}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'d_param_1': [1, 2, 3]}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + + ({}, + {'e_param_1': {1, 2, 3}}, + {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], + 'c_param_1': True, 'd_param_1': np.array([5, 5]), + 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), + +], indirect=["mixin_harness_fixture"]) +def test_set_params_with_invalid_type(mixin_harness_fixture, params_to_set, expected): + with warnings.catch_warnings(record=True) as w: + mixin_harness_fixture.set_params(**params_to_set) + assert 'should be of type' in str(w[-1].message) + + obtained = mixin_harness_fixture.get_params() + is_equal(obtained, expected) + + +@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, data_params, expected", [ + ({}, + {'a_param_1': 42}, + {'a_param_1'}, + True), + + ({}, + {'a_param_1': 8}, + {'a_param_1'}, + False), + + ({}, + {'a_param_1': 8.0}, + {'a_param_1'}, + False), + + ({}, + {'a_param_2': 3.0}, + {'a_param_1'}, + False), + + ({}, + {'a_param_2': 2.5, 'b_param_1': ['a', 'b', 'c']}, + {'b_param_1'}, + True), + + ({}, + {'a_param_1': 10, 'a_param_2': 9.0}, + {'b_param_1'}, + False), + + ({}, + {'d_param_1': np.array([98, 99, 100]), 'a_param_2': 9.0}, + {'d_param_1'}, + True), + + ({}, + {'d_param_1': np.array([98, 99, 100]), 'e_param_1': pd.Series([1, 3, 5])}, + {'e_param_1'}, + True), + + ({}, + {'d_param_1': np.array([98, 99, 100]), 'e_param_1': pd.Series([4.0, 5.0])}, + {'e_param_1'}, + False), + + +], indirect=["mixin_harness_fixture"]) +def test_needs_data_refresh(mixin_harness_fixture, params_to_set, data_params, expected): + mixin_harness_fixture.set_params(**params_to_set) + obtained = mixin_harness_fixture.needs_data_refresh(data_params) + assert obtained == expected + + +@pytest.mark.parametrize("mixin_harness_fixture, data_params, expected", [ + ({'updated_params': {'a_param_1', 'b_param_1'}}, + {'a_param_1'}, + {'b_param_1'}), + + ({'updated_params': {'a_param_1', 'a_param_2', 'b_param_1'}}, + {'a_param_1', 'a_param_2'}, + {'b_param_1'}), +], indirect=["mixin_harness_fixture"]) +def test_clear_updated_params(mixin_harness_fixture, data_params, expected): + mixin_harness_fixture.clear_updated_params(data_params) + assert mixin_harness_fixture._updated_params == expected diff --git a/test/brain_observatory/test_static_gratings.py b/test/brain_observatory/test_static_gratings.py new file mode 100644 index 0000000000..0e409a175a --- /dev/null +++ b/test/brain_observatory/test_static_gratings.py @@ -0,0 +1,198 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.brain_observatory.static_gratings import StaticGratings +from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis +import pytest +from mock import patch, MagicMock + + +@pytest.fixture +def dataset(): + dataset = MagicMock(name='dataset') + + timestamps = MagicMock(name='timestamps') + celltraces = MagicMock(name='celltraces') + dataset.get_corrected_fluorescence_traces = \ + MagicMock(name='get_corrected_fluorescence_traces', + return_value=(timestamps, celltraces)) + dataset.get_roi_ids = MagicMock(name='get_roi_ids') + dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') + dff_traces = MagicMock(name="dfftraces") + dataset.get_dff_traces = MagicMock(name='get_dff_traces', + return_value=(None, dff_traces)) + dxcm = MagicMock(name='dxcm') + dxtime = MagicMock(name='dxtime') + dataset.get_running_speed=MagicMock(name='get_running_speed', + return_value=(dxcm, dxtime)) + dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', + return_value=MagicMock()) + + return dataset + +def mock_speed_tuning(): + binned_dx_sp = MagicMock(name='binned_dx_sp') + binned_cells_sp = MagicMock(name='binned_cells_sp') + binned_dx_vis = MagicMock(name='binned_dx_vis') + binned_cells_vis = MagicMock(name='binned_cells_vis') + peak_run = MagicMock(name='peak_run') + + return MagicMock(name='get_speed_tuning', + return_value=(binned_dx_sp, + binned_cells_sp, + binned_dx_vis, + binned_cells_vis, + peak_run)) + +def mock_sweep_response(): + sweep_response = MagicMock(name='sweep_response') + mean_sweep_response = MagicMock(name='mean_sweep_response') + pval = MagicMock(name='pval') + + return MagicMock(name='get_sweep_response', + return_value=(sweep_response, + mean_sweep_response, + pval)) + +@patch.object(StimulusAnalysis, + 'get_speed_tuning', + mock_speed_tuning()) +@patch.object(StimulusAnalysis, + 'get_sweep_response', + mock_sweep_response()) +@pytest.mark.parametrize('trigger', (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) +def test_harness(dataset, trigger): + sg = StaticGratings(dataset) + + assert sg._stim_table is StimulusAnalysis._PRELOAD + assert sg._sweeplength is StimulusAnalysis._PRELOAD + assert sg._interlength is StimulusAnalysis._PRELOAD + assert sg._extralength is StimulusAnalysis._PRELOAD + assert sg._orivals is StimulusAnalysis._PRELOAD + assert sg._sfvals is StimulusAnalysis._PRELOAD + assert sg._phasevals is StimulusAnalysis._PRELOAD + assert sg._number_ori is StimulusAnalysis._PRELOAD + assert sg._number_sf is StimulusAnalysis._PRELOAD + assert sg._number_phase is StimulusAnalysis._PRELOAD + assert sg._sweep_response is StimulusAnalysis._PRELOAD + assert sg._mean_sweep_response is StimulusAnalysis._PRELOAD + assert sg._pval is StimulusAnalysis._PRELOAD + assert sg._response is StimulusAnalysis._PRELOAD + assert sg._peak is StimulusAnalysis._PRELOAD + + if trigger == 1: + print(sg._stim_table) + print(sg.sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 2: + print(sg.sweeplength) + print(sg.mean_sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 3: + print(sg.interlength) + print(sg.sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 4: + print(sg.extralength) + print(sg.mean_sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 5: + print(sg.orivals) + print(sg.sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 6: + print(sg.sfvals) + print(sg.sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 7: + print(sg.phasevals) + print(sg.mean_sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 8: + print(sg.number_ori) + print(sg.mean_sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 9: + print(sg.number_sf) + print(sg.sweep_response) + print(sg.response) + print(sg.peak) + elif trigger == 10: + print(sg.number_phase) + print(sg.sweep_response) + print(sg.response) + print(sg.peak) + + assert sg._stim_table is not StimulusAnalysis._PRELOAD + assert sg._sweeplength is not StimulusAnalysis._PRELOAD + assert sg._interlength is not StimulusAnalysis._PRELOAD + assert sg._extralength is not StimulusAnalysis._PRELOAD + assert sg._orivals is not StimulusAnalysis._PRELOAD + assert sg._sfvals is not StimulusAnalysis._PRELOAD + assert sg._phasevals is not StimulusAnalysis._PRELOAD + assert sg._number_ori is not StimulusAnalysis._PRELOAD + assert sg._number_sf is not StimulusAnalysis._PRELOAD + assert sg._number_phase is not StimulusAnalysis._PRELOAD + assert sg._sweep_response is not StimulusAnalysis._PRELOAD + assert sg._mean_sweep_response is not StimulusAnalysis._PRELOAD + assert sg._pval is not StimulusAnalysis._PRELOAD + assert sg._response is not StimulusAnalysis._PRELOAD + assert sg._peak is not StimulusAnalysis._PRELOAD + + # check super properties + dataset.get_corrected_fluorescence_traces.assert_called_once_with() + assert sg._timestamps != StaticGratings._PRELOAD + assert sg._celltraces != StaticGratings._PRELOAD + assert sg._numbercells != StaticGratings._PRELOAD + + assert not dataset.get_roi_ids.called + assert sg._roi_id is StaticGratings._PRELOAD + + assert dataset.get_cell_specimen_ids.called + assert sg._cell_id is StaticGratings._PRELOAD + + assert not dataset.get_dff_traces.called + assert sg._dfftraces is StaticGratings._PRELOAD + + assert sg._dxcm is StaticGratings._PRELOAD + assert sg._dxtime is StaticGratings._PRELOAD diff --git a/test/brain_observatory/test_stimulus_analysis.py b/test/brain_observatory/test_stimulus_analysis.py new file mode 100644 index 0000000000..20827ec090 --- /dev/null +++ b/test/brain_observatory/test_stimulus_analysis.py @@ -0,0 +1,140 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis +import pytest +from mock import patch, MagicMock + + +@pytest.fixture +def dataset(): + dataset = MagicMock(name='dataset') + + timestamps = MagicMock(name='timestamps') + celltraces = MagicMock(name='celltraces') + dataset.get_corrected_fluorescence_traces = \ + MagicMock(name='get_corrected_fluorescence_traces', + return_value=(timestamps, celltraces)) + dataset.get_roi_ids = MagicMock(name='get_roi_ids') + dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') + dff_traces = MagicMock(name="dfftraces") + dataset.get_dff_traces = MagicMock(name='get_dff_traces', + return_value=(None, dff_traces)) + dxcm = MagicMock(name='dxcm') + dxtime = MagicMock(name='dxtime') + dataset.get_running_speed=MagicMock(name='get_running_speed', + return_value=(dxcm, dxtime)) + return dataset + +def mock_speed_tuning(): + binned_dx_sp = MagicMock(name='binned_dx_sp') + binned_cells_sp = MagicMock(name='binned_cells_sp') + binned_dx_vis = MagicMock(name='binned_dx_vis') + binned_cells_vis = MagicMock(name='binned_cells_vis') + peak_run = MagicMock(name='peak_run') + + return MagicMock(name='get_speed_tuning', + return_value=(binned_dx_sp, + binned_cells_sp, + binned_dx_vis, + binned_cells_vis, + peak_run)) + + +@pytest.mark.parametrize('trigger', + (1,2,3,4,5)) +def test_harness(dataset, + trigger): + with patch('allensdk.brain_observatory.stimulus_analysis.StimulusAnalysis.get_speed_tuning', + mock_speed_tuning()) as get_speed_tuning: + sa = StimulusAnalysis(dataset) + + assert sa._timestamps == StimulusAnalysis._PRELOAD + assert sa._celltraces == StimulusAnalysis._PRELOAD + assert sa._numbercells == StimulusAnalysis._PRELOAD + assert sa._roi_id == StimulusAnalysis._PRELOAD + assert sa._cell_id == StimulusAnalysis._PRELOAD + assert sa._dfftraces == StimulusAnalysis._PRELOAD + assert sa._dxcm == StimulusAnalysis._PRELOAD + assert sa._dxtime == StimulusAnalysis._PRELOAD + + if trigger == 1: + print(sa.timestamps) + print(sa.dxcm) + print(sa.binned_dx_sp) + elif trigger == 2: + print(sa.celltraces) + print(sa.dxtime) + print(sa.binned_cells_sp) + elif trigger == 3: + print(sa.acquisition_rate) + print(sa.dxcm) + print(sa.binned_dx_vis) + elif trigger == 4: + print(sa.numbercells) + print(sa.dxtime) + print(sa.binned_cells_vis) + elif trigger == 5: + print(sa.timestamps) + print(sa.dxcm) + print(sa.peak_run) + + print(sa.roi_id) + print(sa.cell_id) + print(sa.dfftraces) + + dataset.get_corrected_fluorescence_traces.assert_called_once_with() + assert sa._timestamps is not StimulusAnalysis._PRELOAD + assert sa._celltraces is not StimulusAnalysis._PRELOAD + assert sa._numbercells is not StimulusAnalysis._PRELOAD + + dataset.get_roi_ids.assert_called_once_with() + assert sa._roi_id is not StimulusAnalysis._PRELOAD + + dataset.get_cell_specimen_ids.assert_called_once_with() + assert sa._cell_id is not StimulusAnalysis._PRELOAD + + dataset.get_dff_traces.assert_called_once_with() + assert sa._dfftraces is not StimulusAnalysis._PRELOAD + + assert sa._dxcm is not StimulusAnalysis._PRELOAD + assert sa._dxtime is not StimulusAnalysis._PRELOAD + + get_speed_tuning.assert_called_once_with(binsize=800) + assert sa._binned_dx_sp is not StimulusAnalysis._PRELOAD + assert sa._binned_cells_sp is not StimulusAnalysis._PRELOAD + assert sa._binned_dx_vis is not StimulusAnalysis._PRELOAD + assert sa._binned_cells_vis is not StimulusAnalysis._PRELOAD + assert sa._peak_run is not StimulusAnalysis._PRELOAD diff --git a/test/brain_observatory/test_stimulus_info.py b/test/brain_observatory/test_stimulus_info.py new file mode 100644 index 0000000000..f15e40c849 --- /dev/null +++ b/test/brain_observatory/test_stimulus_info.py @@ -0,0 +1,399 @@ +import pytest +import numpy as np +import os +from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet, si +import numpy as np +from pkg_resources import resource_filename # @UnresolvedImport +NWB_FLAVORS = [] + +if 'TEST_NWB_FILES' in os.environ: + nwb_list_file = os.environ['TEST_NWB_FILES'] +else: + nwb_list_file = resource_filename(__name__, os.path.join('..','core','nwb_files.txt')) + +if nwb_list_file == 'skip': + NWB_FLAVORS = [] +else: + with open(nwb_list_file, 'r') as f: + NWB_FLAVORS = [l.strip() for l in f] + +@pytest.fixture(params=NWB_FLAVORS) +def data_set(request): + data_set = BrainObservatoryNwbDataSet(request.param) + + return data_set + +def test_BinaryIntervalSearchTree(): + + bist = si.BinaryIntervalSearchTree([(0, .9, 'A'), (1, 1.9, 'B'), (3, 3.9, 'D'), (2, 2.9, 'C')]) + assert bist.search(1.5)[2] == 'B' + assert bist.search(0)[2] == 'A' + assert bist.search(2.5)[2] == 'C' + assert bist.search(3.5)[2] == 'D' + +def test_BinaryIntervalSearchTree_shared_endpoint(): + + bist = si.BinaryIntervalSearchTree([(0, 1, 'A'), (1, 2, 'B')]) + assert bist.search(0)[2] == 'A' + assert bist.search(1)[2] == 'A' + assert bist.search(1.5)[2] == 'B' + +def test_pixels_to_visual_degrees(): + m = si.BrainObservatoryMonitor() + np.testing.assert_almost_equal(m.pixels_to_visual_degrees(1), 0.103270443661,10) + +@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), + reason="test NWB file not available") +def test_StimulusSearch(data_set): + + epoch_df = data_set.get_stimulus_epoch_table() + s = si.StimulusSearch(data_set) + assert len(s.search(epoch_df.iloc[2]['end'])) == 3 + assert s.search(epoch_df.iloc[2]['end'] + 1) is None + assert len(s.search(752)) == 3 + + +def test_sessions_with_stimulus(): + + for session_type, stimulus_type_list in si.SESSION_STIMULUS_MAP.items(): + for stimulus_type in stimulus_type_list: + assert session_type in si.sessions_with_stimulus(stimulus_type) + +def test_stimuli_in_session(): + + for session_type, stimulus_type_list in si.SESSION_STIMULUS_MAP.items(): + for stimulus_type in stimulus_type_list: + assert session_type in si.sessions_with_stimulus(stimulus_type) + +def test_stimuli_in_session(): + + test_dict = {si.THREE_SESSION_A:4, + si.THREE_SESSION_B:4, + si.THREE_SESSION_C:4, + si.THREE_SESSION_C2:5} + + for session in si.SESSION_LIST: + assert session in si.SESSION_STIMULUS_MAP + assert len(si.stimuli_in_session(session)) == test_dict[session] + assert len(si.SESSION_STIMULUS_MAP) == len(si.SESSION_LIST) == 4 + +def test_all_stimuli(): + assert len(si.all_stimuli()) == 10 + +def test_rotate(): + np.testing.assert_array_almost_equal(np.array(si.rotate(1,1,np.pi)), np.array([-1,-1])) + +def test_get_spatial_grating(): + + data = si.get_spatial_grating(height=100, aspect_ratio=2, ori=45, pix_per_cycle=10, phase=0, p2p_amp=2, baseline=1) + + assert data.shape == (100,200) + np.testing.assert_almost_equal(data[0,0], data[-1,-1]) + np.testing.assert_almost_equal(data.max(), 2, 3) + np.testing.assert_almost_equal(data.min(), 0, 3) + np.testing.assert_almost_equal(data[50,100], 2) + +def test_get_spatio_temporal_grating(): + + for t, test_val in zip([0,.5,1], [2,0,2]): + data = si.get_spatio_temporal_grating(t, height=100, aspect_ratio=2, ori=45, pix_per_cycle=10, phase=0, p2p_amp=2, baseline=1, temporal_frequency=1) + np.testing.assert_almost_equal(data[50,100], test_val) + + data = si.get_spatio_temporal_grating(0, height=100, + aspect_ratio=2, + ori=45, + pix_per_cycle=20, + phase=0, + p2p_amp=2, + baseline=1, + temporal_frequency=1) + + x1 = data[50, 100] + + data = si.get_spatio_temporal_grating(.5, height=100, + aspect_ratio=2, + ori=45, + pix_per_cycle=20, + phase=.5, + p2p_amp=2, + baseline=1, + temporal_frequency=1) + + x2 = data[50, 100] + + np.testing.assert_almost_equal(x1, x2) + +def test_map_template_monitor(): + + + + np.testing.assert_almost_equal(np.array((500, 250)), + si.map_template_coordinate_to_monitor_coordinate((20, 20), (1000, 500), (40, 40))) + + + np.testing.assert_almost_equal(np.array((20,20)), + si.map_monitor_coordinate_to_template_coordinate((500, 250), (1000, 500), (40,40))) + +def test_lsn_monitor(): + + lsn4_template_coordinate = (8, 14) + lsn4_monitor_coordinate = np.array(si.MONITOR_DIMENSIONS)/2 #(600,960) + np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), + si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, si.MONITOR_DIMENSIONS, si.LOCALLY_SPARSE_NOISE_4DEG)) + + lsn4_template_coordinate = (4, 7) + lsn4_monitor_coordinate = np.array(si.MONITOR_DIMENSIONS)/2#(600,960) + np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), + si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, si.MONITOR_DIMENSIONS, si.LOCALLY_SPARSE_NOISE_8DEG)) + + lsn4_template_coordinate = (0,0) + lsn4_monitor_coordinate = (240,330) + np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), + si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, + si.MONITOR_DIMENSIONS, + si.LOCALLY_SPARSE_NOISE_4DEG)) + + lsn4_template_coordinate = (0,0) + lsn4_monitor_coordinate = (240,330) + np.testing.assert_almost_equal(np.array(lsn4_template_coordinate), + si.monitor_coordinate_to_lsn_coordinate(lsn4_monitor_coordinate, + si.MONITOR_DIMENSIONS, + si.LOCALLY_SPARSE_NOISE_4DEG)) + + + lsn4_template_coordinate = (0,0) + lsn4_monitor_coordinate = (240,330) + np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), + si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, + si.MONITOR_DIMENSIONS, + si.LOCALLY_SPARSE_NOISE_8DEG)) + + lsn4_template_coordinate = (0,0) + lsn4_monitor_coordinate = (240,330) + np.testing.assert_almost_equal(np.array(lsn4_template_coordinate), + si.monitor_coordinate_to_lsn_coordinate(lsn4_monitor_coordinate, + si.MONITOR_DIMENSIONS, + si.LOCALLY_SPARSE_NOISE_8DEG)) + +def test_natural_scene_monitor(): + + template_coordinate = (0,0) + monitor_coordinate = (141, 373) + np.testing.assert_almost_equal(np.array(monitor_coordinate), + si.natural_scene_coordinate_to_monitor_coordinate(template_coordinate, + si.MONITOR_DIMENSIONS)) + + template_coordinate = (0,0) + monitor_coordinate = (141, 373) + np.testing.assert_almost_equal(np.array(template_coordinate), + si.map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, + si.MONITOR_DIMENSIONS, + si.NATURAL_SCENES)) + +def test_natural_movie_monitor(): + + template_coordinate = (0,0) + monitor_coordinate = (60, 0) + np.testing.assert_almost_equal(np.array(monitor_coordinate), + si.natural_movie_coordinate_to_monitor_coordinate(template_coordinate, + si.MONITOR_DIMENSIONS)) + + template_coordinate = (0,0) + monitor_coordinate = (60, 0) + np.testing.assert_almost_equal(np.array(template_coordinate), + si.map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, + si.MONITOR_DIMENSIONS, + si.NATURAL_MOVIE_ONE)) + +def test_bijective_all_stimuli(): + + for stimulus in si.all_stimuli(): + + template_coordinate = (10,10) + monitor_coordinate = si.map_stimulus_coordinate_to_monitor_coordinate(template_coordinate, + si.MONITOR_DIMENSIONS, + stimulus) + + new_template_coordinate = si.map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, + si.MONITOR_DIMENSIONS, + stimulus) + + np.testing.assert_array_almost_equal(template_coordinate, new_template_coordinate) + + for original_loc in [(0,0), (10,10)]: + + for target_stimulus in si.all_stimuli(): + + new_loc = si.map_stimulus(original_loc, stimulus, target_stimulus, si.MONITOR_DIMENSIONS) + new_original_loc = si.map_stimulus(new_loc, target_stimulus, stimulus, si.MONITOR_DIMENSIONS) + np.testing.assert_array_almost_equal(new_original_loc, original_loc) + +def test_monitor_basic_spatial_unit(): + + m = si.Monitor(300,400, 5, 'cm') + m.set_spatial_unit('cm') + + m.set_spatial_unit('inch') + np.testing.assert_almost_equal(m.panel_size, 1.968505, 5) + np.testing.assert_almost_equal(1./m.aspect_ratio, 3./4) + np.testing.assert_almost_equal(m.height, 0.46500143220300011) + np.testing.assert_almost_equal(m.width, 0.62000190960400015) + np.testing.assert_almost_equal(m.pixel_size, 0.0015500047740100004) + + m.set_spatial_unit('cm') + np.testing.assert_almost_equal(m.panel_size, 5) + np.testing.assert_almost_equal(1./m.aspect_ratio, 3./4) + np.testing.assert_almost_equal(m.height, 3) + np.testing.assert_almost_equal(m.width, 4) + np.testing.assert_almost_equal(m.pixel_size, .01) + + +def test_pixels_to_visual_degrees(): + + m = si.BrainObservatoryMonitor() + + np.testing.assert_almost_equal(m.pixels_to_visual_degrees(45), 4.64716996476) + np.testing.assert_almost_equal(m.pixels_to_visual_degrees(45, small_angle_approximation=False), 4.64462483116) + + np.testing.assert_almost_equal(m.pixels_to_visual_degrees(1), 0.103270443661) + np.testing.assert_almost_equal(m.pixels_to_visual_degrees(1, small_angle_approximation=False), 0.103270415704) + +@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), + reason="test NWB file not available") +def test_lsn_image_to_screen(data_set): + + compare_set = set(data_set.list_stimuli()).intersection(si.LOCALLY_SPARSE_NOISE_STIMULUS_TYPES) + if len(compare_set) > 0: + for stimulus_type in compare_set: + + template = data_set.get_stimulus_template(stimulus_type) + m = si.BrainObservatoryMonitor() + m.lsn_image_to_screen(template[0,:,:]).shape == si.MONITOR_DIMENSIONS + +@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), + reason="test NWB file not available") +def test_natural_movie_image_to_screen(data_set): + + compare_set = set(data_set.list_stimuli()).intersection(si.NATURAL_MOVIE_STIMULUS_TYPES) + if len(compare_set) > 0: + for stimulus_type in compare_set: + + template = data_set.get_stimulus_template(stimulus_type) + m = si.BrainObservatoryMonitor() + m.natural_movie_image_to_screen(template[0, :, :]).shape == si.MONITOR_DIMENSIONS + +@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), + reason="test NWB file not available") +def test_grating_to_screen(data_set): + + compare_set = set(data_set.list_stimuli()).intersection([si.STATIC_GRATINGS, si.DRIFTING_GRATINGS]) + if len(compare_set) > 0: + + for stimulus_type in compare_set: + m = si.BrainObservatoryMonitor() + curr_row = data_set.get_stimulus_table(stimulus_type).iloc[10] + phase = 0 + spatial_frequency = .04 + orientation = curr_row.orientation + template = m.grating_to_screen(phase, spatial_frequency, orientation) + assert m.natural_movie_image_to_screen(template).shape == si.MONITOR_DIMENSIONS + +def test_get_mask(): + m = si.BrainObservatoryMonitor() + mask = m.get_mask() + + assert mask.sum() == 931286 + assert mask.shape == si.MONITOR_DIMENSIONS + + +def test_mask(): + m = si.BrainObservatoryMonitor() + + assert(m._mask is None) + + assert(m.mask.sum() == 931286) + assert(m.mask.shape == si.MONITOR_DIMENSIONS) + assert(m._mask is not None) + + +def test_translate_image_and_fill(): + ''' + [[1 2 3] + [4 5 6] + [7 8 9]] + + [[127 4 5] + [127 7 8] + [127 127 127]] + ''' + + + X = np.array([[1,2,3],[4,5,6],[7,8,9]]) + X_test = np.array([[127, 4, 5], [127, 7, 8], [127, 127, 127]]) + X_result = si.translate_image_and_fill(X, translation=(1,1)) + + np.testing.assert_array_almost_equal(X_result, X_test) + +def test_visual_degrees_to_pixels(): + + m = si.BrainObservatoryMonitor() + np.testing.assert_approx_equal(m.visual_degrees_to_pixels(4.5), 43.5749072092) + +def test_spatial_frequency_to_pix_per_cycle(): + + m = si.BrainObservatoryMonitor() + + x1 = m.spatial_frequency_to_pix_per_cycle(.1, 15.0) + x2 = m.spatial_frequency_to_pix_per_cycle(.05, 15.0) + + np.testing.assert_almost_equal(x1, 97.7072500845) + np.testing.assert_almost_equal(x2/x1, 2) + +def test_show_image(): + + m = si.BrainObservatoryMonitor() + + img = np.zeros(si.MONITOR_DIMENSIONS) + m.show_image(img, show=False, warp=True, mask=False) + m.show_image(img, show=False, warp=False, mask=True) + +def test_map_stimulus(): + + m = si.BrainObservatoryMonitor() + test_list = [(0, 0), (-5.333333333333333, -7.333333333333333), (-5.333333333333333, -7.333333333333333), (-2.6666666666666665, -3.6666666666666665), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-141.0, -373.0), (0, 0), (0, 0), (240.0, 330.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (99.0, -43.0), (240.0, 330.0), (240.0, 330.0), (240.0, 330.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (99.0, -43.0), (240.0, 330.0), (240.0, 330.0), (240.0, 330.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (99.0, -43.0), (240.0, 330.0), (240.0, 330.0), (60.0, 0.0), (-4.0, -7.333333333333333), (-4.0, -7.333333333333333), (-2.0, -3.6666666666666665), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (-81.0, -373.0), (60.0, 0.0), (60.0, 0.0), (60.0, 0.0), (-4.0, -7.333333333333333), (-4.0, -7.333333333333333), (-2.0, -3.6666666666666665), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (-81.0, -373.0), (60.0, 0.0), (60.0, 0.0), (60.0, 0.0), (-4.0, -7.333333333333333), (-4.0, -7.333333333333333), (-2.0, -3.6666666666666665), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (-81.0, -373.0), (60.0, 0.0), (60.0, 0.0), (141.0, 373.0), (-2.2, 0.9555555555555556), (-2.2, 0.9555555555555556), (-1.1, 0.4777777777777778), (22.8, 118.11666666666666), (22.8, 118.11666666666666), (22.8, 118.11666666666666), (0.0, 0.0), (141.0, 373.0), (141.0, 373.0), (0, 0), (-5.333333333333333, -7.333333333333333), (-5.333333333333333, -7.333333333333333), (-2.6666666666666665, -3.6666666666666665), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-141.0, -373.0), (0, 0), (0, 0), (0, 0), (-5.333333333333333, -7.333333333333333), (-5.333333333333333, -7.333333333333333), (-2.6666666666666665, -3.6666666666666665), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-141.0, -373.0), (0, 0), (0, 0)] + counter = 0 + for source_stimulus in sorted(si.all_stimuli()): + for target_stimulus in sorted(si.all_stimuli()): + tmp = m.map_stimulus((0,0), source_stimulus, target_stimulus) + np.testing.assert_array_almost_equal(tmp, test_list[counter]) + counter += 1 + np.testing.assert_array_almost_equal(m.map_stimulus(tmp, target_stimulus, source_stimulus), np.array([0,0])) + +if __name__ == "__main__": +# + # with open(nwb_list_file, 'r') as f: + # NWB_FLAVORS = [l.strip() for l in f] + # + # for nwb_file_location in NWB_FLAVORS: + # data_set = BrainObservatoryNwbDataSet(nwb_file_location) + # test_lsn_image_to_screen(data_set) + # test_natural_movie_image_to_screen(data_set) + # test_grating_to_screen(data_set) + + # test_StimulusSearch() + # test_BinaryIntervalSearchTree() + # test_sessions_with_stimulus() + # test_stimuli_in_session() + # test_all_stimuli() + # test_rotate() + # test_get_spatial_grating() + # test_get_spatio_temporal_grating() + # test_map_template_coordinate_to_monitor_coordinate() + # test_natural_scene_monitor() + # test_bijective_all_stimuli() + # test_monitor_basic_spatial_unit() + # test_brain_observatory_monitor() + # test_spatial_frequency_to_pix_per_cycle() + # test_get_mask() + # test_show_image() + test_map_stimulus() \ No newline at end of file diff --git a/test/config/__pycache__/test_config_single_file_json.cpython-37.pyc b/test/config/__pycache__/test_config_single_file_json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54ab89cf56469a9955564020c4424b0d5cd09940 GIT binary patch literal 1374 zcmaJ>&2H2%5VoCcHv0>d3JM3bL|h`l_P_;I2(`4JR?tNhP$AtaN@KT8H-EBIU`zJ^ z?G^C~AWl39?~p4eUV#%c$+obf!Yhx*p0Vfi=Wlbr)v6O{@z?jB-5}%#PEMKu&OCIL zg5iYIkT^K9kVed5k>+R==US*o6{kYUuvugoPIaBc)0E(^SgAVIS0rXHi6DC>*Lmfb z98ssn4PHGaPMw>)24jQQc>~5Kr_YGp{0UV_&t`cg^)i1quSJPJaFbNTHqDL2B;F2o ze9Xbdpx2-;LRWXda5^Fx$><*A>@vx;L%{iw9<fh=E7On2=L+KZ!bWr*Fg_(~<Rv-8 zx<>Ed`@4E)+^oopgKeQQYp%0#x{ASf9V;8A0@f`aNbBZAu+y<rDtrvCK3RO^E<Jhv zZ^l3jG2#Bgvj<BnYu3a8qs>1DT3bPq?hchTH<7Xd2zC>!u>sXGzOx^6alY9ZZ5D~6 zgGzTyS4|3!yWGpXgN9!)*WFV|{LnTeGMAfM`$3omvC2)?jlD>?uGAnPb&Tp^;&FHg z^Ms7tC=dBYB#4Im8ZOTDUnn6}-`n+gcguU@#l!wW>_Hm$Zudp}TJ;f%^1&9D=|2v( z`YOo8t<>`e-j0C1VF(#~Fq;A2vt@<CcT3+@LA(<RcRK)s@Vn_SZ>b<kVP2-(0yL^n zbX{k4+NLv1wqVVtV6fqcH!gHyfpbXqKr2^3)zG!^s1KOBmeCKC6Hr8@=Tyf}AaTE= z0nG>XKa>MCI&z!07Zk9N1xfrs%0$|<C|+<>nkH<|XYhUtzAuzoPW*>(8?_QI!Tx!O zDnv)9JP-D4)Kd`Q6mbu#s(p%*^(6iQY$n?<$aCnQUH>xHUmfduMfH-bEWZR>PRd^Z zf1*69p&;!NIAwXHY+$IVQwUlKp&-d-PD=`4<FzP-_di5eClJMJ<9*1<@?W6v=61_5 z(jn$MI(`re{T5nvuAc~~8zo$X-SL}&Y@%){k5bMJ*B#3pRE{4xr@9@y&Gw}zp9`s% rNPxtGf4v@RT^3Jh-h~qTp}2Pgmee#Dlb)wd%Agyxt+g+jx~cyL4Wl}= literal 0 HcmV?d00001 diff --git a/test/config/__pycache__/test_json_comments.cpython-37.pyc b/test/config/__pycache__/test_json_comments.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dacbf0d26171aa8295872cbde0411779a28b410d GIT binary patch literal 4488 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 literal 0 HcmV?d00001 diff --git a/test/config/__pycache__/test_manifest.cpython-37.pyc b/test/config/__pycache__/test_manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fc18849d0a46781d1e86eb8607b42f8d85e5982 GIT binary patch literal 1930 zcmZ{l-HsbI6vu7PWM-00vP(-_J_=L_BvOe4!3|WX>h87(1Z<(DYBh?8oY>iX&Wvn_ zZmL8Awzs^)MqKeq=8~&@1+F;9lMHELCz@lQGalRLH~-@t)M^z1SMvKW{LdO8f1$Iv zJm}nkTX(?-BIty~c}rsoKAW(q7kd<A-o&4l;u0m2i~`|{(sOc3<4^=5d`{v>M4}9B zSyaRhv=vbmHE4H4UF<?z74#u#?483p<fuXI?zcP{_N6ulv*AQY1)*pY>fs=~DBM2W zhj8nwU<^4WOR^wmR8YZIj6xr#^^R<Ku>bJh-LD=zyV@G0Q`wqnsS*wydBUgJL^haW zFoBJ@5S@&h0W3(ne-ITy^zYH(t@a~$L$~>Wi)NQU<;lFgpYUFq2>wZ1CO_$Rn#n}> zz^2(?uG`-XyKOx*^23bx#{5{qyORlw5aX7Cyjt*Te|YTro#{H+W;VBBH_!McCKZ4o zETC1U%Fyd!#&}`Y_;Fn3P3S<*WJQ+L&=EWH1YOZ3ThKEfDA1+1U<+@|^i5Ox6+W9I zauEoHQ#S%zJ(i}}mu0E8K4P&U?`qeHaDeO8_cgFF!!)_4RH_=j+pCQ>S=mUQWU^<Z zumSIx8J{?+xrtyodku+fKJQ_gXrpF5ld6y5p~ew}Mzl&RR9%Mt3lvHaa1?GsXF*0F zQo)2L{NF&9s02rajXYpcT2m=GJ{u~xOt7XBfKDFYfABTv#QINDHO^sBTgkYRiRp~x z{MnoTFQ68VZ-ff>qp+gX4w@<&C@Z4sXm-J@`KUb%yn^Nu8Wh?Vl1tl2zH`fe1|u|1 zLuf!55Lq+129bgZs<>eCGdLG95hc(ETaj^~KQJB;2nzpG=ZA&=rSqf0f8zXd;SZc& zF@7F7rJ%Kii=ozbj?}BL4|N5NQx{cOtkwgZ);IG^T3>@e@@UXc)s&laOrlY8JZ+Wh zj^Kv(6_l*?;XUn8S`R7;N*8M*uB;2EBl<7HyuJ-{eWKij`M$vUoO*DF1y;64H$Qa) z;ssnRxdQGJa4v$IgIF?v4CUw`e`I_IdE?)4erVPs9JC)?4539AKvS>7s_G3e=lG=? z!It3O!bfkTL7Ay{@VV#MIIYF(zhJIxgDHr74{vIe=b8uusW~R<U5NGY0bY0*ArS}g zI&=&ffuz8CP-w*XXQc&MQT%s+jOY<;_Qjg8o|c)yDdLLeec73g#SoABGBj{tq-y^1 zm%RM%xQ<Fw(}9sc!UP(HMQEL>_n~dn;vk!2Zf?c+#^&g4=BI9Rb2N3<nsJAJ{Mtps z@;!$A;fa|knIpxMNMY$Yi8wND?X4ZVl6D7N^!YRuvx&U@9=xEj-t+3Mdi5v@qe@hd GYX1ORHM|f2 literal 0 HcmV?d00001 diff --git a/test/config/__pycache__/test_multi_file_config.cpython-37.pyc b/test/config/__pycache__/test_multi_file_config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7255796f9cc2dd8499b3401fb7d167491049e45e GIT binary patch literal 2472 zcmb_ePmkL~6rZsj=YP5_tF#Lesv-_VqN%!-3aTo^?!pa4r4?#%gDl50NgO*)G~+Ez z*&NvI74Zc)bj68}!_`+#`xQ9x-i+<+uEGi`Ci47w?>BGW`+44T_M6QbffoPvlUIL_ zkUw#eHyb8jz$0Hl#|Wblad0#uIx`$&W;!OtwHaBnl2f8&*-$9kDL*6eHYNB|lCo3& zj>N`u!pXG4ELM6$PN-95HY>j&PK{Mq6~;QNu{w+m)?iH-n~Xjs-PReLPWoLVEiJsn zpQP2<+z;LPg2!E&UjLFyUj&OJn8%MjA-V7oj?IFn3eN#NGJ=lL6*#}52{|DvBcX{g zHJN#nB-RmO*3b0B_+^WdBjas}l}_o(d<M>cL!OZ5<N}sv*c%zvJ~B@YO4jHj6WlKM zy%{Cs$J%XZ9m#$4(B11iy!}FnK&o}9ht^q$`NH);-+AdpF!>~ht+m5kJM84jRRP;z z&Cl`vCTlF$vb8m3_Iqu!aC#qrS2@jdLwwUQqg*>$A9Iz{;~YQUWNngbCu?ik>DsFH z`VURQzxF)Htp%ITn&#T+<+CmkbO6As2nusU;ihAvTpL|J216?KvYTEN++!~D67O|g zWx&1ORL<jUv8xtcTi~r126Sm<co;-U5X-dUy0JIot}9GbSZJwhIrb=sxO*=fcT;<z z5-6>+bx!?GL>>10B@Z4BzJ=_P18?H7-q8EOi<g7F*z@Nx^X?CL{8A3kQ|UuLUrd&A z@O3a8$ROc&7M>q^V-9<x2oNm1n{b)jg{`Attmf|Q5L|VYLt5NhEYrG@>h&G)LT*Dx z4C|J)Wg9ixqT8x(8=?tvAJR=V95GOp_>W-1=n<Kc&=wyuqnMd`COZi|hEjm5x8^C- zC1!<&{0yaxKq8m=X|+h-^>lwdJvhVDx>jo8+euq{5{SZd|4N9tNKJ@2wL-p>U8)>a zjOwld8`Czju@^;8b&-&d1(!Td80cgLIznskYf;gL`GqL)WveKkz$76M17&mvV=y3w zc48c3<VwcO9Vl|F#Oz;Dw|hZX1|8I3R#Un@>QwCYzG#8vGrUg%X?04fIO$>7H5^-) zt!x~gtwFv9u>$00Al5YnzDRKcJNW33f8eEoykw;8g@BXj454k>pa$@Pz1RWCW=>+z z{J)$OT-Jdv_(rjo;%i#)b*(S1!Kvapc55oQreai3!80mG;uavacC3d<0UBqZiMUyS z0u7oLpdbTH--XouLolq9>H?`5weN#=Gqn#u^WUjeSE}3>Td-RNevYD02No59g;`+H zy99P{jDhLg(YHl>0FrJCj4tt3ITn^sRVP(VbUw~YQ!gt&vpM5Y?_4Exb#+t)Hm$pE zR$ZZ};{PP4JPKYVhl1-2$4pgMQy_`z@N-#@6;-IzuRMZt4kP~gM<9~8t3tQb#coiW Ow#?S2m2#z4Y5om^`7iPS literal 0 HcmV?d00001 diff --git a/test/config/__pycache__/test_pyconfig_parser.cpython-37.pyc b/test/config/__pycache__/test_pyconfig_parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f244167b42887217e47662c7f1876b83d20253a GIT binary patch literal 2483 zcmb_e&2Jk;6rY)0uh*YVOO!N#P-StzQtPUzgrKSrN#KU8(h9XKMyvJC*j{_RHZz;H zF7bgTSHwTSp%Ewk9Ikuilz)K}@6CQViA)3)W9`iB`@MM|KhJyiexp$(Frwdn^6tMw z$e;L<4+}P*!=qlp#0jS%ad2fJoic|_4acDPZiMEv<di5`)U}r7l%JAllM?)BN!clX zOCt7+2r{<0$xA2Xm^u}1@$w0As@&!kSZln>Yp~XNoi|`@aQcL_n`hviblWT`&Ar$k zC6(#SpSZKRh}tx{{)JG!4CZk#iynDW3F)Ic4ilaVJO}V72@|JF2!2Up64No`#x{wK zBf`y}=`s6di;~zpCQEk2-jsOhlrD{@5d7EVF?mKVoS@l>n-@-4N5(0mWOe4qfZ)qr zZ%PUIv3d(eO9>z2boW{hZhfakAWbpEVYKFQHg`S1ThF}^Hn(%N7240yek%u;h1wcx zey;DYv&M6judHda-={W<p!Y%Xs-Q(~NUU=+$kD;d%~e4UbN%5uYoi<;t*oU%SC`dS zf21V*>&S!LTCmR7I7i2qeO)5x02HqxXp$S6taB6QXn5HTrc~-=_q`&8$6fBl-mAK< zgL|F%!XFH?x83xuZAk_fKC%0UK^O;-N^IASys2<qX#gOxHWCwUwN1ww1fg*6W$SKY z&2=FqHNL8?--)cjnZJHGc+mR>s!a8~k;glI?}ZmFdV7)Q&m!*K?}_NS>S3(Phj}(1 zEmZHTpx;wLEbh!bf8q@VoDD<J;FG(tQ1M+jItYe(??N*A%}rx~bP_w4-GKnq`!Eq^ zZkrob%4nThbd%*fi*7L40NjU~(*svbSoeU3u;KKGjLF23A8=OepbMZ(wPO03##;Wy zIE5C)%?VSVpp+A+=2ADQ6g9ls?yt57XXveMCMJGGNpnvDS6K63N;#8>0cj`ZL@ZRB z>OeKA=~Rb<$rci_7lu#LPN5!2p+po908=(hgjV6xq;d=P7qY}}RA>1ZHZg&WD5pD^ z1A`p4V)hy{*D`MGK-c3XZvBeb?ggw27_?(v)mRrXoqMe-n_&42@0CPaos#ZQ>C$gA z$4Yxww)W3fN`9)u3nf2O;%!52qQM(D!S4_G2VUyPOGe7x6!a7ZL+BRV00w;EEO$V% zo|6cW|Cf`3%Np<nKUch|`5G5|UF*tg;8kA7X+?!dsTdSgh>VJXya}2qI!u>Qp)|~t zMsmAQ3R0zUp%i3F<F_Go{{<LU_+4BiHKX=jkguoqV?h2pwfahxyK)0g>%`AdG)WT+ zi^L{bV&U5)c5nhNvf4>+i+m3x?Isvq;H`2@?4!D0>fY#lly|32+KM{U85d#aTr<p? zQ`$vquA6mPXs-B|$te$lm+_$#X@z5@>Z>V{MD6@s)nikYy7cXb;O8(DpM3}-g{N$~ Sp)WQzxu((l)GpgqyYV-ce=van literal 0 HcmV?d00001 diff --git a/test/config/test_config_single_file_json.py b/test/config/test_config_single_file_json.py new file mode 100644 index 0000000000..744e692491 --- /dev/null +++ b/test/config/test_config_single_file_json.py @@ -0,0 +1,73 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import patch, mock_open +from allensdk.model.biophys_sim.config import Config +try: + import __builtin__ as builtins # @UnresolvedImport +except: + import builtins # @UnresolvedImport + + +@pytest.fixture +def simple_config(): + manifest = '''{ + "manifest": [ + { "type": "dir", + "spec": "MOCK_DOT", + "key": "BASEDIR" + }], + "biophys": + [{ "hoc": [ "stdgui.hoc"] }] + }''' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=manifest)): + config = Config().load('config.json', False) + + return config + + +def testAccessHocFilesInData(simple_config): + assert simple_config.data['biophys'][0]['hoc'][0] == 'stdgui.hoc' + + +def testManifestIsNotInData(simple_config): + assert 'manifest' not in simple_config.data + + +def testManifestInReservedData(simple_config): + assert 'manifest' in simple_config.reserved_data[0] diff --git a/test/config/test_json_comments.py b/test/config/test_json_comments.py new file mode 100644 index 0000000000..f798d4a02c --- /dev/null +++ b/test/config/test_json_comments.py @@ -0,0 +1,209 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import patch, mock_open, Mock +from simplejson.scanner import JSONDecodeError +import allensdk.core.json_utilities as ju +from allensdk.core.json_utilities import JsonComments +import logging +try: + import __builtin__ as builtins # @UnresolvedImport +except: + import builtins # @UnresolvedImport + + +@pytest.fixture +def commented_json(): + return ("{\n" + " // comment\n" + " \"color\": \"blue\"\n" + "}") + + +@pytest.fixture +def blank_line_json(): + return ("{\n" + "\n" + "\n" + "\n" + " \"color\": \"blue\"\n" + "}") + + +@pytest.fixture +def multi_line_json(): + return ("{\n" + "/* \n" + " * multiline comment\n" + " */\n" + " \"color\": \"blue\"\n" + "}") + + +@pytest.fixture +def two_multi_line_json(): + return ("{\n" + " \"colors\": [\"blue\",\n" + " /* comment these out\n" + " \"red\",\n" + " \"yellow\",\n" + " ... but not these */\n" + " \"orange\",\n" + " \"purple\",\n" + " /* also comment this out\n" + " \"indigo\",\n" + " .... end comment */\n" + " \"violet\"\n" + " ]\n" + "}") + + +@pytest.fixture +def corrupted_json(): + return ("{\n" + " \"colors\": \"blue\",\n" + " /* comment these out\n" + " \"red\",\n" + " \"yel") + + +@pytest.fixture +def ju_logger(): + log = logging.getLogger('allensdk.core.json_utilities') + log.error = Mock() + + return log + + +def testSingleLineCommentJSONDecodeError(corrupted_json, + ju_logger): + with pytest.raises(JSONDecodeError) as e_info: + with patch(builtins.__name__ + ".open", + mock_open(read_data=corrupted_json)): + JsonComments.read_file("corrupted.json") + + ju_logger.error.assert_called_once_with( + 'Could not load json object from file: corrupted.json') + assert e_info.typename == 'JSONDecodeError' + + +def testSingleLineComment(commented_json): + parsed_json = JsonComments.read_string( + commented_json) + + assert('color' in parsed_json and + parsed_json['color'] == 'blue') + + +def testBlankLines(blank_line_json): + parsed_json = JsonComments.read_string( + blank_line_json) + + assert('color' in parsed_json and + parsed_json['color'] == 'blue') + + +def testMultiLineComment(multi_line_json): + parsed_json = JsonComments.read_string( + multi_line_json) + + assert('color' in parsed_json and + parsed_json['color'] == 'blue') + + +def testTwoMultiLineComments(two_multi_line_json): + parsed_json = JsonComments.read_string( + two_multi_line_json) + + assert('colors' in parsed_json) + assert(len(parsed_json['colors']) == 4) + assert('blue' in parsed_json['colors']) + assert('orange' in parsed_json['colors']) + assert('purple' in parsed_json['colors']) + assert('violet' in parsed_json['colors']) + + +def testSingleLineCommentFile(commented_json): + with patch(builtins.__name__ + ".open", + mock_open( + read_data=commented_json)): + parsed_json = JsonComments.read_file('mock.json') + + assert('color' in parsed_json and + parsed_json['color'] == 'blue') + + +def testBlankLinesFile(blank_line_json): + with patch(builtins.__name__ + ".open", + mock_open( + read_data=blank_line_json)): + parsed_json = JsonComments.read_file('mock.json') + + assert('color' in parsed_json and + parsed_json['color'] == 'blue') + + +def testMultiLineFile(multi_line_json): + with patch(builtins.__name__ + ".open", + mock_open( + read_data=multi_line_json)): + parsed_json = JsonComments.read_file('mock.json') + + assert('color' in parsed_json and + parsed_json['color'] == 'blue') + + +def testTwoMultiLineFile(two_multi_line_json): + with patch(builtins.__name__ + ".open", + mock_open( + read_data=two_multi_line_json)): + parsed_json = JsonComments.read_file('mock.json') + + assert('colors' in parsed_json) + assert(len(parsed_json['colors']) == 4) + assert('blue' in parsed_json['colors']) + assert('orange' in parsed_json['colors']) + assert('purple' in parsed_json['colors']) + assert('violet' in parsed_json['colors']) + + +def test_write_nan(): + with patch(builtins.__name__ + ".open", + mock_open(), + create=True) as mo: + ju.write('/some/file/test.json', { "thing": float('nan')}) + + assert 'null' in str(mo().write.call_args_list[0]) diff --git a/test/config/test_manifest.py b/test/config/test_manifest.py new file mode 100644 index 0000000000..cddbb90c1f --- /dev/null +++ b/test/config/test_manifest.py @@ -0,0 +1,96 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import os +from allensdk.config.manifest_builder import ManifestBuilder +from allensdk.config.manifest import Manifest + + +@pytest.fixture +def builder(): + b = ManifestBuilder() + b.add_path('BASEDIR', '/home/username/example') + + return b + + +def testManifestConstructor(builder): + manifest = builder.get_manifest() + expected = os.path.abspath('/home/username/example') + actual = manifest.get_path('BASEDIR') + assert(expected == actual) + + +def testManifestParent(builder): + builder.add_path('WORKDIR', + 'work', + parent_key='BASEDIR') + manifest = builder.get_manifest() + expected = os.path.abspath('/home/username/example/work') + actual = manifest.get_path('WORKDIR') + assert(expected == actual) + + +def testManifestBuilderDataFrame(builder): + builder.add_path('WORKDIR', + 'work', + parent_key='BASEDIR') + builder_df = builder.as_dataframe() + + assert('key' in builder_df.keys()) + assert('type' in builder_df.keys()) + assert('spec' in builder_df.keys()) + assert('parent_key' in builder_df.keys()) + assert('format' in builder_df.keys()) + assert(5 == len(builder_df.keys())) + + +def testManifestDataFrame(builder): + builder.add_path('WORKDIR', + 'work', + parent_key='BASEDIR') + + manifest = builder.get_manifest() + df = manifest.as_dataframe() + + assert('type' in df.keys()) + assert('spec' in df.keys()) + assert(2 == len(df.keys())) + + +def safe_mkdir_root_dir(): + directory = os.path.abspath(os.sep) + Manifest.safe_mkdir(directory) # should not error \ No newline at end of file diff --git a/test/config/test_multi_file_config.py b/test/config/test_multi_file_config.py new file mode 100644 index 0000000000..f6a739f52e --- /dev/null +++ b/test/config/test_multi_file_config.py @@ -0,0 +1,134 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2016. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import patch, mock_open +from allensdk.config.model.description_parser import DescriptionParser +try: + import __builtin__ as builtins +except: + import builtins + + +@pytest.fixture +def multiconfig(): + file_1 = ("{\n" + " \"section_A\": [\n" + " {\n" + " \"prop_a\": \"val_a\",\n" + " \"prop_b\": \"val_b\"\n" + " },\n" + " {\n" + " \"prop_c\": \"val_c\",\n" + " \"prop_d\": \"val_d\"\n" + " }\n" + " ],\n" + + " \"section_B\": [\n" + " {\n" + " \"prop_e\": \"val_e\",\n" + " \"prop_f\": \"val_f\"\n" + " },\n" + " {\n" + " \"prop_g\": \"val_g\",\n" + " \"prop_h\": \"val_h\"\n" + " }\n" + " ]\n" + "}\n" + ) + file_2 = ("{\n" + " \"section_B\": [\n" + " {\n" + " \"prop_i\": \"val_i\",\n" + " \"prop_j\": \"val_j\"\n" + " }\n" + " ],\n" + " \"section_C\": [\n" + " {\n" + " \"prop_k\": \"val_k\",\n" + " \"prop_l\": \"val_l\"\n" + " }\n" + " ]\n" + "}\n" + ) + + parser = DescriptionParser() + + with patch(builtins.__name__ + ".open", + mock_open(read_data=file_1)): + description = parser.read("mock_1.json") + + with patch(builtins.__name__ + ".open", + mock_open(read_data=file_2)): + parser.read("mock_2.json", description) + + return description + + +def testAllSectionsPresent(multiconfig): + assert ('section_A' in multiconfig.data and + 'section_B' in multiconfig.data and + 'section_C' in multiconfig.data) + assert len(multiconfig.data.keys()) == 3 + + +def testSectionA(multiconfig): + assert len(multiconfig.data['section_A']) == 2 + assert multiconfig.data['section_A'][0] == { + 'prop_a': 'val_a', + 'prop_b': 'val_b'} + assert multiconfig.data['section_A'][1] == { + 'prop_c': 'val_c', + 'prop_d': 'val_d'} + + +def testSectionB(multiconfig): + assert len(multiconfig.data['section_B']) == 3 + assert multiconfig.data['section_B'][0] == { + 'prop_e': 'val_e', + 'prop_f': 'val_f'} + assert multiconfig.data['section_B'][1] == { + 'prop_g': 'val_g', + 'prop_h': 'val_h'} + assert multiconfig.data['section_B'][2] == { + 'prop_i': 'val_i', + 'prop_j': 'val_j'} + + +def testSectionC(multiconfig): + assert len(multiconfig.data['section_C']) == 1 + assert multiconfig.data['section_C'][0] == { + 'prop_k': 'val_k', + 'prop_l': 'val_l'} diff --git a/test/config/test_pyconfig_parser.py b/test/config/test_pyconfig_parser.py new file mode 100644 index 0000000000..01439aa88a --- /dev/null +++ b/test/config/test_pyconfig_parser.py @@ -0,0 +1,136 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from mock import patch, mock_open +from allensdk.config.model.description_parser import DescriptionParser +try: + import __builtin__ as builtins +except: + import builtins + + +@pytest.fixture +def pyconfig(): + file_1 = ("{\n" + " \"section_A\": [\n" + " {\n" + " \"prop_a\": \"val_a\",\n" + " \"prop_b\": \"val_b\"\n" + " },\n" + " {\n" + " \"prop_c\": \"val_c\",\n" + " \"prop_d\": \"val_d\"\n" + " }\n" + " ],\n" + " \"section_B\": [\n" + " {\n" + " \"prop_e\": \"val_e\",\n" + " \"prop_f\": \"val_f\"\n" + " },\n" + " {\n" + " \"prop_g\": \"val_g\",\n" + " \"prop_h\": \"val_h\"\n" + " }\n" + " ]\n" + "}\n" + ) + file_2 = ("{\n" + " \"section_B\": [\n" + " {\n" + " \"prop_i\": \"val_i\",\n" + " \"prop_j\": \"val_j\"\n" + " }\n" + " ],\n" + " \"section_C\": [\n" + " {\n" + " \"prop_k\": \"val_k\",\n" + " \"prop_l\": \"val_l\"\n" + " }\n" + " ]\n" + "}\n" + ) + + with patch(builtins.__name__ + ".open", + mock_open( + read_data=file_1)): + parser = DescriptionParser() + description = parser.read("mock_1.pycfg") + + with patch(builtins.__name__ + ".open", + mock_open( + read_data=file_2)): + parser = DescriptionParser() + parser.read("mock_2.pycfg", + description) + + return description + + +def testAllSectionsPresent(pyconfig): + assert('section_A' in pyconfig.data and + 'section_B' in pyconfig.data and + 'section_C' in pyconfig.data) + assert(len(pyconfig.data.keys()) == 3) + + +def testSectionA(pyconfig): + assert len(pyconfig.data['section_A']) == 2 + assert pyconfig.data['section_A'][0] == { + 'prop_a': 'val_a', + 'prop_b': 'val_b'} + assert pyconfig.data['section_A'][1] == { + 'prop_c': 'val_c', + 'prop_d': 'val_d'} + + +def testSectionB(pyconfig): + assert len(pyconfig.data['section_B']) == 3 + assert pyconfig.data['section_B'][0] == { + 'prop_e': 'val_e', + 'prop_f': 'val_f'} + assert pyconfig.data['section_B'][1] == { + 'prop_g': 'val_g', + 'prop_h': 'val_h'} + assert pyconfig.data['section_B'][2] == { + 'prop_i': 'val_i', + 'prop_j': 'val_j'} + + +def testSectionC(pyconfig): + assert len(pyconfig.data['section_C']) == 1 + assert pyconfig.data['section_C'][0] == { + 'prop_k': 'val_k', + 'prop_l': 'val_l'} diff --git a/test/core/__pycache__/test_authentication.cpython-37.pyc b/test/core/__pycache__/test_authentication.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd48ee80e7a897a72e08b4e737c8db85851bacea GIT binary patch literal 2570 zcmb_eUvC>l5Z~RqIOl(9o2E%XJmdkPTBHtXsf4N$HH07##gv$;$g*_W+^&<W?Yq<N zIjJM(0i0LF7wAJPp7=`l$`fCKCuY`nj$Le#R$R2ZbL-i;+4;@<CSR1x1p-g-`_KF^ zPspG6l0AzcJc6MUm;@2DLmIfU4(+lA>sk$~Yd364BzeB@Dkm(-ge?|C?j;*iu_zpo zf5}9lWgXGiOcX`wf(&V6ai+E{7JVx0RJSaajINXFUYljP#f;tS;)c=9UqN?S+%&oc zu_A6=kVa9^I;pJw1@|Mhij~~j4^H-!6f%f?-g%<J6JJP`-1NqKt{*&?UL2}qP0QGw z_#sNQ&o(k?bK=)7k2d9t2#!jT*gXwa?d`kwKCQ4M|M;8l>h9C}{y|bU;*;Ha{n_^i zUn&GZIWSe2T7V^SBChpms6@J<a<J=JFyUjvKzR>_{tzZX1-l^UR!jzTK!$8!4e5{! zSexmMnEpZqf!kX(4^#=87<G^}es=%|TMU$F?T^d}1!+PQW{sKt4)z{2pTd1~lOJ<Y zJ>;i6=r?x*?uCKi_nI;|(akWDf%aeyqvO7AKK2ir+K=U(h<j~*B;jnQ0~(^e6-ym& zd7+X<a(OR4Ml?Jg`(aRx`boYUdTqDW3%u*-Ci+e2*~fTp5{?X~>cdXx@s8f9j?Y2x zFigqPt_Hu+?!Ho?s@M?U4DzLE>=GvfPnF>4<@Hq&Ev?V{IwGhM7m{}@bpzJ_2Q3Pg zvSHA|ZwwGlS~Jd7sL7Z&95v2wfNB=Duje`LhC!#FCcAd!3tz{6aOAd6xjNGGW2(wv zyke^*SkyI~5TuzgyZ=s~UIlZbfEFO2%kXx#mVx$0y?G`zKm)<Xq&0PM7lgDfSWI5g zn7yXItx^(OX^jAP4I#GAfa!i92jnMM|6L^*`*GZjLKgS5QkgiM75gnXm&N|us|5g< zBa&hwwP%LkPI6Hn4K{L$`&#NG|6@OrCb3PnSF8z8X65i_@9NG+cqb$x$Z=Mp3L%<` zJ?5r~{U!*|7m$_cIYj?5;=;nt@hcNK;HKMSZgOhI5CVxtaG0p0|Hw@PptP1fk@a?B zLxOH6Ig_Z{qZ*hdEK{*2BR>Z#85nzWZyzZMEO8>W;T&WOcTNqcH87~wVS?&2i+#B@ zas|T#C7LqOs9OFDm`~o;wflH4q;KLBEQbOl?}6;$20mC0I1D5^Af)9$VuCREbV$#k z6${Hpkmvy3p*+|C3Im!56o;?@qzAE;Hjsr;1Ig%Usx+=hNne2%84{1?UiZ|GkKL@; z-CiVkEN4*BsBL1u1R}!JQJ6QT2(o~i{J-R=aWfmS`JK1&U>|)q|3pzte+T~5`}pya zT7jkULDt%;*ww1j4Q=EfqG6m&>@HXBMls@wcV(>nGijQJAv#l721;Xpf?kaOrV%+0 iyP@cH<PM^sZ^PuU6+1_n@oc#;l5%vpIFi=0we$~4Eni^( literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_brain_observatory_cache.cpython-37.pyc b/test/core/__pycache__/test_brain_observatory_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7adde843b5eb166fa409954e3bdf2c1c1a4c9c31 GIT binary patch literal 10384 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 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_brain_observatory_nwb_data_set.cpython-37.pyc b/test/core/__pycache__/test_brain_observatory_nwb_data_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3184ff381fedc4f79bdbe585eeb2462047dde421 GIT binary patch literal 9944 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 Yyf}gXan6tM^Hi~d(sXeQrE;<KKjs&ciU0rr literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_cell_filters.cpython-37.pyc b/test/core/__pycache__/test_cell_filters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12dbec71c51b610c2c205511d11424e9c6d06d95 GIT binary patch literal 7230 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 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_cell_types_cache_unit.cpython-37.pyc b/test/core/__pycache__/test_cell_types_cache_unit.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cbd9a7fa7664798acbeacb32b0fa0367a54f894 GIT binary patch literal 16409 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 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_h5_utilities.cpython-37.pyc b/test/core/__pycache__/test_h5_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..807d6031479271f12ea337cd0f669209ee3cf62b GIT binary patch literal 2919 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 QR(%ow1<&)U-hx;A4-*faqW}N^ literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_json_utilities.cpython-37.pyc b/test/core/__pycache__/test_json_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dff5dd1bdbc429d9f79cdf8c5974eee7649885d5 GIT binary patch literal 2063 zcmb_dOOF#r5bo}o@s6MS2oMNMG_s;djuK;nB5eRg5X2!;*bB;KVq~?ad+k}zOWo}d zJN6+7KO+ZLocJ%~56qR*{sm4{_t@S+OAbNXqpqrcSAAc1&5zAy4M9m>{z+dq5qhH= z>tca%AF9kiFvM_#VoVT5G4U;2^w_=)BP4R-ieHJh{H@sa-PKstuW|dh&Mam>M}K3# z!5mh3j{GLuVlL<wtFjvCZB}Ou&^xTjTA+6seu6sNr*JAd>{z*zQ5B5y>SH<zgU4ww z$?bqfQJ}|laiF?TA3~LfAQXCmp%R8qHu{A0$r3H`0>7}7eS#Uej+SJBm^HDN;Nb%7 zg{3{z-i>Tl{l{6_3mZJC9i9@{b@cCRU3TsZ46S)xaj871M3{_nTa81RlTe=OvD}VA zsX9(xSq;~ZqLiuu6@t$4YM89e+AvL{qFYp9AuJ(D=DRVM<B<rNU!j5~BMw@sS;lk6 zY}9c?Lmz`@q7GUBaVW2(!($$(S4iwZ^KJ6*PX8Clh3wNYW!)itMw40pK|+HxVf1#N zC%?&ln(;&iAk%C-ll`B=VPA%df0NN*LPs3dMiI<llbbr&n?WkLu?EL7O$JjHMxhG1 z>}IpvWnrKO;KNsNy3{TpvX5KXB?K4W4i=Z7H_!;_qOX^x&d~NH7@9VQff9TTg+SdB zNCJxRf=q~PEAkg+2<Wg5P4x38f7Cp$y#cd*$NLpJyp{C4-q)t-dAE#yS~QC}=SN}A z)7lbl8#$iljb{R27_8W9J&*vT3e)6~5UJ=`CXU>egD}Y*IY_6<U|xt%Ad>v5#%oaQ z0v_@a7X{4+Fe)n`5Z-IpM0^I;MIfT@!F*{DDc!a6m~=O&^t!zd;?n*0_CfFa@6P1G z8pq!Gp<;(McH%O4A+BigDTozN;;QbrriH#1C6um|P%3%-6U-`ObRF6kfsxL1^BV@E zf?0s4U3$fB&Hw+6VYd`Rv8!Kl-vWyFFUWoU%I8Dl{#n{M$M6x2BwsV8#FT%C<o}rT zu{>TbVQ}W!u!KXy#^S~W;h+=c{I0=4r`ZhxZJmSLMd<B~b!*jOrhaUI+ob^YMxqp& z3!!}u?arRRzfPB3ohiHTCrS8eL8sq(zt>zhzmm=L3BDb}-%aSBjnLUq*dTl-na0^n zw6wi-6#lNJf}0Fvl84Z*!`v|guyLjI&diH5DapMTr)(PWAHIMECPD9E7hl4z)oQuB I@VV~JJKuuDQUCw| literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_lazy_property.cpython-37.pyc b/test/core/__pycache__/test_lazy_property.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaa5c27c042d5e56e8201bcd736d8342fb6f07f5 GIT binary patch literal 1697 zcmZ`(&5k2A5VqYv>C7bA%xGDV_)!kaLJnlL>~cW}%@7cmA>u~})QZ${+TLs@o$ki= z0EsdOcIJwBg&A?;8F&+4IqfTOqRPD;vMaFU>Z-1?{nb}xf70z95E#YpzwkeOLjFRd z86hYqF!ePEK?Kc7Tz_fIz-GC(@?(D$!~rFr6X6N}iU?nZmtNcgI}jn*p$x!|Bw4ht z4@65uqMcDe=XB0)m^cuJSLBk$hdX~qbe-1&Z%^EE-p+q|`{KxXA^saOJbnf!$z;fE z=ZtUGU#hZ_%B=0tzV$`+b5^7n*bD~B2~2$(gd{N)1d^kIU6I%m9&GH}*0`+Jr&X3> zFb@2BFvl=85@^UZ-O?MxK@kE=E9<AQ3Upt~{ITtpDw}5o&lAB7|AVMDEc<&k{&4!O zmP$|g6D~$G{u3|O)6;^dWg+;(sVsifQ%I!Hu$e5YCu==D%VtxZ8Tnqt(<PrvSexe% zA(r=z)aHI#D(SQ&2Og5@IT533ZKJs~?)(UWyKLyD|2(@<<D5XsQIZsVC6mM+B+052 z=Q-+~B>CZ-=e0*2!X_?_J%MB>Xe82VPKc<pUmzX1JHdcEAa<ntf(h@60`16SVB4Pp zQ{$X#JxOr|4*cTwW0?98h%I#DGEzN5E=j?*Y)cZT1W3>p9!$FMK|)D?MPDEY?9C=a zs*r<W=)hTzSDE{vkQA4h^|4SxPhlptua6qmtrnOo5|tI1Ns=B|8m|nYw`s^W$2;_+ zCIoxKR~-mZT@<)P9i#YnQ>Qr=Z-E12U7aGP&~`X1<(AG;3N{WzjMGu_E+~d<;YwWq z4GSP*$@Cq=o;Frn-$l#O0C2o|+ap+Jd#4&&(PU-unNp=1vih_Lc}U9HVh^QD{TSOV zd7LSbX}PM-jeG_6sYzfF?NRkA*v}BCr4M$1v3@(icfr^Pe8CX*g$I@NmXRL(4_JjK z0hw4tg<WI=2gHV2;@x=}YsX>Dw7U~;K)lA4ghec*AyxQihYx!U%dqRQ2A`qV%y>8S zx7RM9pSCoCj@`0lsPCEJDg6%K#;?fN<a_u+k9m_gc<}ziM;~kkV_v*t23nc{zC~vx z7krk>0XIfvGhhw65Q}TWYK<`CQ1MJl4Fzc;TtO68sZQM6OWc!6y`1imOSdRZ0;d{0 z?QK}w<V-u5^8o$~d+JTx6#G^MAmZ1X$7F=>$moS9q`n+Tj}4(8WNO^)slodzu9op( t#TC38kl04L>N{%PS$i0FO>U!)>c{0{Y!ZzZBBBxNd;Or_9<<(S{{zKnaQ6TJ literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_mouse_connectivity_cache.cpython-37.pyc b/test/core/__pycache__/test_mouse_connectivity_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d9e512d61ec8b221324b727ec25c0c3c46fe4a8 GIT binary patch literal 17243 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 J+%}jQ{$E~8%8&p6 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_mouse_connectivity_notebook.cpython-37.pyc b/test/core/__pycache__/test_mouse_connectivity_notebook.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db75e01558f440c26baf57ad6f01c80c6f770d7d GIT binary patch literal 4519 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 P>M!{JTzp<`&{FyjXKga0 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_nwb_data_set.cpython-37.pyc b/test/core/__pycache__/test_nwb_data_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..681a3f9c9c052ba03a2baf8bd915a7a35129f5dc GIT binary patch literal 4578 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 A<NyEw literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_obj_utilities.cpython-37.pyc b/test/core/__pycache__/test_obj_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e0e8ee4110180be8f590d2641f68c4354b51444 GIT binary patch literal 1732 zcmaJBO^@4D(9a)<<K3(lgep*_%H^Xdi1oLfxB|4LLITmQ#AlHe5jnOuaX0>u?d*1| z<N$3CAXOm21rBJdUf{qDP;bkP13v)CoKR0I4oDo~!puvvOF8f?&zm=2Z)V=iyxeX} z46O9-2foo}nEQBGE)I}Q_{(<zgiJ^#j7R9sdMxbhgiCmjPXtd$8eW5-3^!>eq9-OT zuSJ-My()!#DBNUj5N{=Hgw30bw;GCJ3-)$M-eNk^5!hz7I$Yhl?2qE$au)2=tpwm8 z%cHawa=!}39kv#W$PWkE@M_)4{i2Kz4N!Nv2p|{XFL?meHoN8D2dX6P%00W=lWnVK zDXt^ihS62*E+uQOVju$u7BI}NqAeJXrI?@svWjk^il$gPsyL>uxInSouF?Zt!{{ld zNsZ}1K^@CbTpO)ficL9=ZYu^{Y&)i6P#sILdXn^%96y`Lz8qvp5~bBya5a@TG(|J4 zuIA{7nzqpeRlr=+wlr{oN*HkHxk%PsO@rG|z&3TwUYh9jG}EMtnh9|^T`J<*wo7e* zBBVj10*2=HTzZ@9xUOqGFkxC|7jmE}hTe4{e|Uv%TDpULaI$NgXaFoZreRTb4=AQ2 zy(X9AY&r?$VRRDR^YU<7$$lcIStUu^vaYJSY^bUso2qKcK(SQST9B6%x>FfjRc(}U zRMlB1EGUu;>l>zM!mFQvzmkjR`|p%dQTF|@A1XtC&rkRJ7g9gS($F{iQMz09vBJs# zV3v>f%l@T!*e~NM+Q|K2#~($YJDGq)xT984S*bx*L=?l?8%(Qs5?66lD*1lh-t%{( z?IKGn<ZWOXvH+OVMGIhnwTTN$6A83VUj-y2b5cPkRb&RebDLnd+~z(xH)kt$MsAQf zH)9XD83`MASi;P>klAUK=PUk0as|5W4dzYeJ=md-np@YgRmNwp%S)#f^jCS<RgAbp z>K1LL(69Wr;nWD=SVc7{IzoXi790WrfcL0hLKdq*fL6o7UR;gqwF{IMXXz_Nkrf@D z23hlXe@$|a%ZAm-QxqcDsoR*r!Lo;62U1A~56g3>h)7mRu@1E3L^a@mKTXu<fXtW! zNY))p7s15z`8hl1=KNf!FhTrGxWksuVPY2N5C;@<i`{0Qfb@o3$d5RXxO6Omv=a#d zhZB`Zk0rQ=Y{1Y8B`WbLO3<XQY}G_M!iPS>7e2z=jlTQ>)>l7nj()kDzxZ+X{pRT2 znOna<GW~9IWdHr=z4t%*;c)bGbL*#XKRY-aU3vQ4*T4Px$6-gPg))bFDlqDrO><9# zj0ckpvJZ2a=`<Ee7AA2Tm7cf@j}ixftsxd&8>Cs0_><CWZ~H+sIA*WX;{)b@A7za` z%JDeGF<-6%U|5N)v+LwZ_=?Bz_BBsPr%AqFoPv|r$oEkbMnBBy0^?s)494%B{-64z zHAO@8n%nWUYFb1zEc*ELrhmCeJDL`c_(GC}(@FHwGjIX*P-I2&7`x7`oe@|50ivm> A*8l(j literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_reference_space.cpython-37.pyc b/test/core/__pycache__/test_reference_space.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6883a8f270b9d247849e4c6f65f96441961be6b8 GIT binary patch literal 5902 zcmbVQ%WvGq8RrZi%YA6|u>6u0$B7*$8^nr{7H!bFLF_m$z!uubNee<LL2;<nO1tEG zhHFd4>d-hvd#HgHz4{;_hoYCD$DV?s=wHwyPX&5X|Ad_S`-WWZYAvTgm)LJ!oZ)=m z_xm0*w`OK)27d8ZzY6>dhVgG|jD996@8Yli1tJW=x`vmR%wxLEJ+4dBvvg^Dwk{p7 zf|7ULUe&8Inqziry}DOtM#Q!o!V>nE#$)Eq=$0cYy44h}sD5d9v!W*IDCa~&%%GeX zO)-mdLClGHl&8dkIE8XiEQ-@8Pm43+EXp(DoH&p2tXL8kP@WUZ;suoF#YOQV$|Z40 zyoB<Ccv)OVxh$@TS5Uqn*qYJ0dIT<w)fUT|pG2FHjN&j_>jz<ko|&~&4#IRGqkA%n zLVA&Y9Dfqud-$vWfCwg7n+g7u3lnv-&2`;E-74xf^$WXg>Jdk`oT639TcXmo^r(xr zo6l=k_KnmyV4`}+_OZf{30u^D%_r%mdBYG6MjYW{WP<9E%Jhitwb5J0JPTz_G%#<1 z(i<sH%^{S9@diC@^RWqW&8!|VaNOb<?}%((jRfR(gx?R+ts@f75kct4B4QJ9h*UsY z<`D@_&Wy;Bt9xaGI>v;?TUN&7er7+4WTGT3D`{DL*-D{}tQN#^k_KrfiT`ZKQyBU- zdGAN-pQ=cz^<XOyD;vSXAl_TQ83$n!i{N|fQT#xyC;cc^A!yRy+EeRyIveY%lSbE| z^PQj_VQ#mJH^k1HX{6FO!$d~9=F1U0d`0+J>F;HxRQ>DtvRVc)%o=OpY2uk<b5@Nl z;W@)xw#4OWj2{CK$wUL_3sj(Rzz4uFVIu@3`>6#*R>(5YSHq|SK%lqH3qaI0AV@v1 zGpKJw0f7<_qdppM&|6cAoe_8n#Wq(ZDNK@@BxxmM8!bzc{=B+uZ}_R~^t(~&Rf13^ z@m^072c6$S@UlvCv|{UeV$d?jD$Z+Kx4By7EWJKQWJ0TQo;ntYkS=qwh+0<fq&q4O z`aXpHAvzSTWtfX>2?B?Rxjct<NU)?IfrQr8!u=^KLu1?6XPR<|i=Bsy+Tm(BWnYl^ zOtdYu-_UIc8Epsc8%29Geuvt^fDKeuwSZ(3i)(ou{g7%}e1&n$iH?lI)PIodMqR%b z^t0wo1!NLh-<L9xkPtz_t0Wt#pTtpKNgpQD+@B*9`p1?FlR=!SPcc0g1#_6gfjB&p zfLMxx#88Ujbu<c5jD>J!N(fg=ChgUnwRbU1l3KNvVSTeHtgbueOd@{3Dm6Qq33jGA zIIB6BoRu@+W1b=q8JxB+FQInw)>kkxG!BeIgAohtfFDAm0@~Yg)Wy_<UZB~Xih5nw zNk?V@XTnO$^5$jKOCCi2AP$u3wBtx*&9U#&{=|(F5y6eANrvRhm_N<X8O_i$E4J~f zBFizj%WAyA<Ym-LjtG~f(Qlxk{W{ZTOt^&U!%QcrHe(t=*u=;Lr4h)3d_7!5+r%0i ztC>T*eaO`>Q>#E~b@f?G)G*Z+tMRK{acT702e<68iDsvI!A|6lWz`GRPUgZ#hTQ~! z*2>SZoSD&XU%m*=rUjN`_=JV}cv+F-FnI1Q=eT?ot&@fJ0Y<(<Xf_G36paZl>KyW8 zg1J=+rt&<&XfLLn6=D9~q$uPS^vG9;OmHo)QpZVLzo=ny0@sB#Kf=TUFT{M4%h%9T zvQCCe-dFpvAD}|4=eQUAOR@uvmNp^8e!_1fR>L~jwkb?_ueVB8oz-JY5)9YySLA@( zSmtvV&XN6r-?!E#6h{Gm<vN0VXG)ph)^2n=Dh-of|DE5^I<!y6cyz7cHr|^8i(0wS zO~Rn7-a%zFa~x(`%&R7Yv_DAwaHC~sRxb&6vg+NS-3jkfb+LyaKE0+_!-`#BJCaFz z&3L#mwc+gib9eTb_MdwomoIa99qnVnD(&?KMpAel3e!&zOMJfj8Y~d9Zo`6a8=s%s zXQ_2SSrszCHis21r_LAb{_@WegyD~@+?|5khK!I=#{Pq#JBW19XjSAJSYKWvqCrLu zFSo%l+zJnCAy?^5vv}pXEczna3<g~i?(eW@!EKW*F!>hRCAY`C(?=Nj4nxyEsx&ma z4fu==?GR=M{M|0`_gqucR;Jw#In5)A`jh6CHN&ka+<}fCL=uUaH>0)f$4N{n;iL@$ zH1J9%8sRA|nd2+{5nmb`9&a*9=2eP<LO3}|ZFsj($qkPT&NoMO--7xnsfVg{P~zL> z0n++IGD2h9qIy22)jtYH<Y<qn`z3UEjjcfW#AY|>EBSruIt6%iM37FnUga$ycp-=I z3Hy=oA9m8M7Sn-u8W6e1Jz<TfSiJDK4GL1kJ!LN?_qjP2+>=A1z)O4q;0V0rV775g z0nCxD0_Imzy9hSc$fq7r+9uy7qSZ@2wdHs<kvxo5&_fnEfo;n8GFxp0{UVqYICs)O zwxef~iCL}B@k)QfbVb@i1mW_>C`(QV()4Mq#~~`v2p;6q(`D{RpY5N1&wfh266qvX zpaWOsiMh{*<J_C_Y_^GnksP&fVFtS?FGH~;U`-|2E%&6}sf1bw<s%QXaVE7wWRrO= zW_q)bkgvL(5Q$3<Hj<fY(3`Xj`4h~_Y&|%Qkwq=asTID)`-N>>Vploh@w@0LWlAg% zLbOaN?M4!2_=I@W!0%$2Kl0TgVU$aFE#K40SY6IlI+ZZ{DoWEx{uPr8{W?tEMC<?C z3%M91sTcppUM}dpOy;VPcCnRjj%|e;L%9_KU>Pg^js^)NWr)!130vp;l%Fv~3l1}a z;SA04xRxK?io`|OQzK4!XtOXM(dCdmMw~&`XOsCoCXx3k&S10xAi6la=tCdMs;KEW z^m{#SVYGhU*mm`Nn$7j>uZ!8$A?_An&fid5yQ~J?iBxc`Pxt!KvuPxGvi!_P%;#r! zLPuubxq0jTJMt{`o}mu&<J-Sz)w0vb4ih-9(P^$5Y(!n9Jwav<I&u28J`)1MQJOh} zxN{%jkrFMh9!MGN`O*DB(9IkjH<ixAa6TmrdbYj_$edzHosm&E$q}y)kxN>!CvM>% zcvELX24Be2P=1MBVi%dbgOQNnPCs%bloM*`)0`C97H(#=PM}{303>AugnhGY!A0&P zRBS`DLo0Q*E5dqW>JZ@;Ey9Pr@1)g(+7OvMT9ti_9n^=Fp$(06(+2cAv)vrx1TeZ3 zz?DFquF2XiU6MVq_N#bfc6)AE9XjZlqi^Uv%nz+Yrv9SWpdHTBH`L##t+hPATI5F$ zB@&A%<vhyoSXN>w#iLp--IY*1K+qv6+>`HvJ~FR;at-7|BDaX#yylsoeZ1zGch^3W zxADpcEfcqTQMc3cA8z3@`u-%d<DeHQuiA-4w2Ls`MRGKkN9w#w18)I<NM+{qc98e< zGoGl-qKl@?+D<yLw|LUN^YHQ^zAQfg$t+?Zvt$&AasHn1zVKY?^TCo=A%Jw^b{S+h zCAK#LU9^kLRkdn4-kNEzj}y7S8H8yf_dF+Wd%3vuJ(yR|#g#Xz0G_Ww>eZ;4k0J5J z;XlVN^Sv6i3J4!Zue=K`{)xXL|79R%<KYWz0kt`9F^*?}xqvT@(e!TXqWl>O&*|?G zTROe;?0C@Y@8z<&myZUx7E|&wYP>MI_FADEua&9GE`3wuEgyepd?=&?w7#A5Dw~~M zx-iYN60%NxB_S_S?J|*9iBMvp(`}uF>ikQmAv%KVkfVLQBrmJYP_s1=!L)$1WxF?e si5PUFcdp=FMJc?C^LO#!6y7kKXPZs8=DKbbw2G&Ke;u^uI(VA@1*+W?tpET3 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_reference_space_cache.cpython-37.pyc b/test/core/__pycache__/test_reference_space_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81f4cafe69e064eea8e7f95d408a2761fbb7f3c4 GIT binary patch literal 5988 zcmbVQOK%(36`ngU4j+<bNq#$ylGsU@hwQwHB6ZRvPSYZdnI?9dVjy5J<{e5yku%Jl zk!`VLkj4gL19bxw=&l7Q6kT-JRaf2j4-_ac+pe_ku0Vl)=L|KZD5*(9V(#4cz31HT zob%mzXKt>d;TQekm;OJ_YuZ1lu=jJ2c?(a{5Sk`6DLR^)zlAHfth+kD4cFwi<y!o< z-4fn<$LW^cvY;_Wr_!yuRiOo9RNK*{DXsh3J>kxc%eE|Wc|H*Bnsj9Ok&qQx<+@{2 zbu~H1bqiB<^YR$i9hVF8_<hY?l#6l+?<Kh`PvE^QPs&qxpOB~J8N5%*v+^9?r{sD0 z7~ZEb*O}2-c|krNlt$;|%DUJQ@`;u%pIkR~borFL$n&2s`dyMM^67Ph`b<V}?r9pk zuJh<;<R#>uZRtEqT|URNJSN2rt^WKjX}M7s+0w^BD^Nky3~u!NW^m1KZUm^FyOFA` zX1b+<n<@yJ)O+uT)6lNrNlYX>o8IW3@uMhC{WOfD%bhsh^nCAjpb`}Sq$%n+N&dZc z?e(>vCTLyrH+;Ez%fI7C+iPz}elw1w|H@hr-A>lxUJxZsq;YR!J6Zc6ytS5uY49R8 zx#_P57~AQfhuplJ21$Ck8LNPEp4yYgOGqHENfNF0wzH~AdV8C?Li^W|Xu7hIeyxDJ zXV7aR!&J^fLsn5i5_h&p{MS(4o0=e;IjyazNiB8ZS}fAO)k^5Y>Rd)f3aLwj;3)yg z-`VSQSWZKc&ilsYE0;6-3jZ=)rJ1SXINhzGt!`&}D6`|q-l=(^^m=}}ksWWwomhDr z!Cfy^VXqUUS;=pzINI)JX5@DRcd6&&{8Mjw?38?y!(&OyaYuSlEQ92AtecSXG{Y38 zP)o?|ldOyimh5R{_DdED$meic4h5iG8OvIol2ws!P*qAuMm3LQmo%|UdkVK+{7<=V zbFDf??F*C~r(_X{J3kR93DV?$h!h2Pa*^J_xM`72qTDo)(2o`+6|hKfR$8jH#Yi7O zv>knDq{cuD^noGuM+OefX!Pg0eiXKV&ee8;(>L6uS!`|w+bYM%Ue~&r>2Z>oe0F9# z4kJY{MRm0md1=t?c`{Ut*?eTN2p{*9kbGJOF#kTrC$x%Y%;TJNp&moN$>^s_JR};6 z^&~Q5u>^~ybIBO!J0iJ|nqR>2LO2+Fv2HG$rA}k0Vk<d|TxJJ%!z4|z`L`38I>G-3 zO2w*f@apOu^(H0G?zl|m?1fR7-b5?=7)_rSY6Ybx?UR0FGxX5jlh2W)+KBcm9%`xH zHby2Lh15sZz}OKx#?bsyYYDQe`_4dX+g@p)jhr2AO&?lAJ1vhYJKA);;8MFZs_tll z=B^E_2ilIFbkeym1g|hZFrkqFm02TJV^?Ay{iTT?^nP(=xEd)X3ssZKNd&T#gdk1Z z9tfHmN)?T|4wJ-y%(|oC>rfPaCT_tU8^LyvYl@H6x!Uo&x1|53he`g0N9(`9dRq@t zZ)yj(;gh<->eWu%^gGF$$mGN7$1*+YDYDB0=hli<*H1IU?}gbZ6~Ji(w*#*gb^<Sk zOZPU?w3nSYbfL`b#?8&FeBECUo7X9O+~?DWb)|5`@YphQ@M?BqfZ}ml{sNMEX$lnN zQ5f0`rp$?NrG6M;pzv4&b&>Cz6>;`xsa?#IkR#Caia4n+h?-s#4xR;}UPWzT*R&u# z45rVJIS3|(5=?;X{75L7L+cws$z&+Cr=SFoCjBWWsVA@tgjA>-p^mM-<EO#50hA(( zR!<?R>*^xqFHwH1Ljt2BMXG0z#FTj!N&mS*t>kfd?W3Wj>NM^UEUD+H;dx44K;kYD zXl5o<tJHj%5{k*{B}yj1u&01QE-ZI2FH`OnN=Se`VHgmnkJ@<~JqtK2?}r10>;ewt zSBl7WABBDX5N^J0N*&(Cc%*-IVQ9jWSUcL#%HQxD=Ex?m@d;?>N7~2Q&$WRyDiP&8 zgJ)AuZl=x`0(E7KveU}Irj~m`T4?K08?RR-&y{>mW%e(2qkpW3X9@e<{u_G~Xce}) z`sr2xQ%zRmC`H6yN7ke24~yd4D0LCIJ05l21{<ltyth>3-S#`E;mArxP_NB61wN$A zLQHCIWQ%l)#a2Kng1}uIn|W^HUJN$rIz$pcLlQntw?@O5i*)^7W`MgLG<^!Uxz&rF zqC<A=X4iuQm<<xAic{Xdkv_&G#G?>0bX%|Jj_!y>eHrPpuD*x*!WWaEh1K^^NXOoI zN8A$+#g_sB17wT>hNq_pDG~=VvLxL8LydiaHEy+W^f=%l^>PM!y9{cBKe6t_O)EIi zyuLaPA*kUaEj5~0mVXo&Nc{wS4tWnK%8Evg@7!=Rv57!nlD>0w6n6U?jGDFE8K!YC z1ndqms&4G^EZ?UYDA~6o+7<7JEbjqmPK&~n-f)dp98YgeT}20M&f?HBv%BA-jd!QW zvVbkpyt~ls1b#HZQKG&}{m7NLwy*qXJ#b4P)f;{<P%ly~dyg5ha(BUwfi{{|Cb4gi zXb`3_6R7_lj^GI2LZy0xk{PElGyhlUk`V1A3NjC;F%LwY7U~_;9B>#USMn<)Qh*H- zAwk60M@X31k4cF&CM9(9oFXM;_J`9FYB`da+?|RhL`)tO(FB)=IqZo;iaT*3Ue`}H z6L)TMZ}DD!t-m-ir*A=C{-0R$N7@s|n))HOOq)9h+4`|>9BO8q6wUWFk!F^HWJVIo zuMIbcIU-u@_k;z4o~E0iAGI-fYNC=8kay9t4?u)r1`ru@4j{f<FprhS$Y3UG4$b`2 z#Y2tmhtgR$h88=cvaB$SOphXwO}!CaO2l%(Y^Q1&LS~!e54de*R7C``&mc;{U453; z#_?y4`R%W%%+3n;GJ=u2FhNKc))^%IsXHfOCcf2fk}IPhIS>k^H}E7Ek)+s+6!-M6 z7KY%xxrI!JN?yunWa3WWxgD*%wDR)Gt3-<FW56DXp(_SFP}s@+3^9P*ipxxzVdm|> z(0bIMLGx2&X8+zN04oM6iXFSOZFK@k5iF>N9wzR&Hyj{L9PrV5<m!hsL$Na^SAV6d zqX7?HPWDsK^!eF9Jj1AFVUAg5Vb0`ihE>gCU0tKikzz9^xZ4YwX&^cNvJBu?EDyWN zLjjLv|BS%};7{w0S%J4Cu+y_F)ca`fm&2&{Ldy?334AcA`aSg{N^!*Yr+08m+`d_; zoU~Wauy;`yfU}ZUP2p96ACAcbjeO#SYDH%$Qd8{^29v@R?g`MUw^DlyW8ASyncdqa zpOe|j50fCtDnBFs!`D;3Y`Z5wh(bw>dx98zT`|HaWio@?IP$&BVp(uGyW7l+c<TU7 z$!{lzPWCrQlvI#tmI;uagp*J=QDU{I?@;c?NRH44Y4aQDV`aZSQn&=@L}#tMSCC6+ zrK~=nHLp|BpoHM=o;-B#_&m|U-99tG<kW}MnSyWKR6n8oN0fX_37P$@k)C63fB3Y2 zNB>!!e1f|Ah1?8yhjd?Xt!S&;+s>oGlT=~%e0(}gGQB6=rwUq39|c!uLVEr^Fc<Iq z{+^S=W|GA`rPK=V(pS*Q7Z?7{rO3DEcas&$y-EpPBba0|KTrf(#yzgZzS?xF_|As! zZMabP1J}O6Y&}175^_pWh2zMat03%Ko#4%j=#da3CPF*@!?0?`g0)~RJNQ=|+gZT> Tgfs6fIj1UOUMy6X#aZ!Rn-5~f literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_reference_space_notebook.cpython-37.pyc b/test/core/__pycache__/test_reference_space_notebook.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..966d850ad7250918e19ffb2c73d29f6c4624233f GIT binary patch literal 2761 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 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_simple_tree.cpython-37.pyc b/test/core/__pycache__/test_simple_tree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee1642dc97c55a1377e14af24d69155a4ec27179 GIT binary patch literal 5793 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 literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_sitk_utilities.cpython-37.pyc b/test/core/__pycache__/test_sitk_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db8390b908c8111d6781db07df11267a18f53607 GIT binary patch literal 4477 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 Yt+-1oe$AgdCzfzoxj65){CR)wziU3lmjD0& literal 0 HcmV?d00001 diff --git a/test/core/__pycache__/test_structure_tree.cpython-37.pyc b/test/core/__pycache__/test_structure_tree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee0843e7468064e20b0268a81eefe494085a40c7 GIT binary patch literal 6514 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 Uei-Y9@V}a+7Cl2^1m$q{e;Jfg{{R30 literal 0 HcmV?d00001 diff --git a/test/core/nwb_ephys_files.txt b/test/core/nwb_ephys_files.txt new file mode 100644 index 0000000000..598d597d51 --- /dev/null +++ b/test/core/nwb_ephys_files.txt @@ -0,0 +1 @@ +/data/informatics/module_test_data/observatory/test_nwb/519244938_ephys.nwb \ No newline at end of file diff --git a/test/core/nwb_files.txt b/test/core/nwb_files.txt new file mode 100644 index 0000000000..2d9019bbb6 --- /dev/null +++ b/test/core/nwb_files.txt @@ -0,0 +1,4 @@ +/allen/aibs/informatics/module_test_data/observatory/test_nwb/506954308.nwb +/allen/aibs/informatics/module_test_data/observatory/test_nwb/out_510221121.nwb +/allen/aibs/informatics/module_test_data/observatory/test_nwb/out_510390912.nwb +/allen/aibs/informatics/module_test_data/observatory/test_nwb/out_510524416.nwb diff --git a/test/core/test_authentication.py b/test/core/test_authentication.py new file mode 100644 index 0000000000..f8b2531aab --- /dev/null +++ b/test/core/test_authentication.py @@ -0,0 +1,75 @@ +import pytest + +from allensdk.core.authentication import ( + EnvCredentialProvider, credential_injector, set_credential_provider) + + +@pytest.mark.parametrize( + "provider,credential_map,expected", + [ + (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), + {"user": "LIMS_USER", "password": "LIMS_PASSWORD"}, + ("user", "1234")), + ] +) +def test_credential_injector(provider, credential_map, expected): + def mock_func(*, user, password): + return (user, password) + assert ( + credential_injector(credential_map, provider)(mock_func)() == expected) + + +@pytest.mark.parametrize( + "provider,credential_map,expected", + [ + (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), + {"user": "LIMS_USER"}, + ("user")), + ] +) +def test_credential_injector_only_injects_existing_kwargs( + provider, credential_map, expected): + def mock_func(*, user): + return user + assert ( + credential_injector(credential_map, provider)(mock_func)() == expected) + + +@pytest.mark.parametrize( + "provider,credential_map", + [ + (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), + {"user": "LIMS_USER", "password": "LIMS_PASSWORD"},), + ] +) +def test_credential_injector_only_injects_mapped_credentials( + provider, credential_map): + def mock_func(*, user, db): + pass + with pytest.raises(TypeError): + credential_injector(credential_map, provider)(mock_func)() + + +@pytest.mark.parametrize( + "provider,credential_map", + [ + (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), + {"user": "LIMS_USER", "password": "LIMS_PASSWORD"},), + ] +) +def test_credential_injector_preserves_function_args(provider, credential_map): + def mock_func(arg1, kwarg1=None, *, user, password): + return (arg1, kwarg1, user, password) + assert ( + credential_injector(credential_map, provider) + (mock_func)("arg1", kwarg1="kwarg1") + == ("arg1", "kwarg1", "user", "1234")) + + +def test_credential_injector_with_provider_update(): + def mock_func(*, user): + return user + provider = EnvCredentialProvider({"LIMS_USER": "user"}) + credential_map = {"user": "LIMS_USER"} + set_credential_provider(provider) + assert credential_injector(credential_map)(mock_func)() == "user" diff --git a/test/core/test_brain_observatory_cache.py b/test/core/test_brain_observatory_cache.py new file mode 100644 index 0000000000..be359c3d11 --- /dev/null +++ b/test/core/test_brain_observatory_cache.py @@ -0,0 +1,379 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import os +import numpy as np +from mock import call, patch, mock_open, MagicMock +from allensdk.core.brain_observatory_cache import BrainObservatoryCache +from allensdk.api.queries.brain_observatory_api import BrainObservatoryApi +import json +import allensdk.brain_observatory.stimulus_info as si +from allensdk.test_utilities.regression_fixture import get_list_of_path_dict + +try: + import __builtin__ as builtins # @UnresolvedImport +except: + import builtins # @UnresolvedImport + + +CACHE_MANIFEST = """ +{ + "manifest": [ + { + "type": "manifest_version", + "value": "1.3" + }, + { + "type": "dir", + "spec": ".", + "key": "BASEDIR" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "experiment_containers.json", + "key": "EXPERIMENT_CONTAINERS" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "ophys_experiments.json", + "key": "EXPERIMENTS" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "ophys_experiment_data/%d.nwb", + "key": "EXPERIMENT_DATA" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "cell_specimens.json", + "key": "CELL_SPECIMENS" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "stimulus_mappings.json", + "key": "STIMULUS_MAPPINGS" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "ophys_analysis_data/%d_%s_analysis.h5", + "key": "ANALYSIS_DATA" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "ophys_experiment_events/%d_events.npz", + "key": "EVENTS_DATA" + }, + { + "parent_key": "BASEDIR", + "type": "file", + "spec": "ophys_eye_gaze_mapping/%d_eyetracking_dlc_to_screen_mapping.h5", + "key": "EYE_GAZE_DATA" + } + ] +} +""" + + +@pytest.fixture() +def events_test_data(): + return {"pattern": "/allen/aibs/informatics/module_test_data/observatory/events/%d_events.npz", + "experiment_id": 715923832} + + +@pytest.fixture(scope="function") +def brain_observatory_cache(): + boc = None + + try: + manifest_data = bytes(CACHE_MANIFEST, 'UTF-8') # Python 3 + except: + manifest_data = bytes(CACHE_MANIFEST) # Python 2.7 + + with patch('os.path.exists', + return_value=True): + with patch(builtins.__name__ + ".open", + mock_open(read_data=manifest_data)): + # Download a list of all targeted areas + boc = BrainObservatoryCache(manifest_file="some_path/manifest.json", + base_uri='http://api.brain-map.org') + + return boc + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_all_targeted_structures(mock_json_msg_query, + brain_observatory_cache): + with patch('os.path.exists') as m: + m.return_value = False + + with patch('allensdk.core.json_utilities.write', + MagicMock(name='write_json')): + with patch('allensdk.core.json_utilities.read', + MagicMock(name='read_json')): + brain_observatory_cache.get_all_targeted_structures() + + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::ExperimentContainer,rma::include," + "ophys_experiments,isi_experiment," + "specimen(donor(conditions,age,transgenic_lines))," + "targeted_structure," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_experiment_containers(mock_json_msg_query, + brain_observatory_cache): + with patch('os.path.exists') as m: + m.return_value = False + + with patch('allensdk.core.json_utilities.write', + MagicMock(name='write_json')): + with patch('allensdk.core.json_utilities.read', + MagicMock(name='read_json')): + # Download experiment containers for VISp experiments + visp_ecs = brain_observatory_cache.get_experiment_containers( + targeted_structures=['VISp']) + + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::ExperimentContainer,rma::include," + "ophys_experiments,isi_experiment," + "specimen(donor(conditions,age,transgenic_lines)),targeted_structure," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_all_cre_lines(mock_json_msg_query, + brain_observatory_cache): + with patch('os.path.exists') as m: + m.return_value = False + + with patch('allensdk.core.json_utilities.write', + MagicMock(name='write_json')): + with patch('allensdk.core.json_utilities.read', + MagicMock(name='read_json')): + # Download a list of all cre lines + tls = brain_observatory_cache.get_all_cre_lines() + + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::ExperimentContainer,rma::include," + "ophys_experiments,isi_experiment," + "specimen(donor(conditions,age,transgenic_lines)),targeted_structure," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_ophys_experiments(mock_json_msg_query, + brain_observatory_cache): + with patch('os.path.exists') as m: + m.return_value = False + + with patch('allensdk.core.json_utilities.write', + MagicMock(name='write_json')): + with patch('allensdk.core.json_utilities.read', + MagicMock(name='read_json')): + # Download a list of all transgenic driver lines + tls = brain_observatory_cache.get_ophys_experiments() + + calls = [call("http://api.brain-map.org/api/v2/data/query.json?q=" + "model::OphysExperiment,rma::include,experiment_container," + "well_known_files(well_known_file_type),targeted_structure," + "specimen(donor(age,transgenic_lines))," + "rma::options[num_rows$eq'all'][count$eqfalse]"), + + call("http://api.brain-map.org/api/v2/data/query.json?q=" + "model::WellKnownFile,rma::criteria,well_known_file_type[name$eqEyeDlcScreenMapping]," + "rma::options[num_rows$eq'all'][count$eqfalse]")] + + mock_json_msg_query.assert_has_calls(calls) + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_all_session_types(mock_json_msg_query, + brain_observatory_cache): + with patch('os.path.exists') as m: + m.return_value = False + + with patch('allensdk.core.json_utilities.write', + MagicMock(name='write_json')): + with patch('allensdk.core.json_utilities.read', + MagicMock(name='read_json')): + # Download a list of all transgenic driver lines + tls = brain_observatory_cache.get_all_session_types() + + calls = [call("http://api.brain-map.org/api/v2/data/query.json?q=" + "model::OphysExperiment,rma::include,experiment_container," + "well_known_files(well_known_file_type),targeted_structure," + "specimen(donor(age,transgenic_lines))," + "rma::options[num_rows$eq'all'][count$eqfalse]"), + + call("http://api.brain-map.org/api/v2/data/query.json?q=" + "model::WellKnownFile,rma::criteria,well_known_file_type[name$eqEyeDlcScreenMapping]," + "rma::options[num_rows$eq'all'][count$eqfalse]")] + + mock_json_msg_query.assert_has_calls(calls) + + +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_stimulus_mappings(mock_json_msg_query, + brain_observatory_cache): + with patch('os.path.exists') as m: + m.return_value = False + + with patch('allensdk.core.json_utilities.write', + MagicMock(name='write_json')): + with patch('allensdk.core.json_utilities.read', + MagicMock(name='read_json')): + # Download a list of all transgenic driver lines + tls = brain_observatory_cache._get_stimulus_mappings() + + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::ApiCamStimulusMapping," + "rma::options[num_rows$eq'all'][count$eqfalse]") + + +@pytest.mark.skipif(True, reason="need to develop mocks") +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_cell_specimens(mock_json_msg_query, + brain_observatory_cache): + with patch('os.path.exists') as m: + m.return_value = False + + with patch('allensdk.core.json_utilities.write', + MagicMock(name='write_json')): + # Download a list of all transgenic driver lines + tls = brain_observatory_cache.get_cell_specimens() + + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=") + + +# NOTE: This test should be updated when ugly hack for associating +# ophys experiment id with ophys session id is resolved. +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_get_ophys_pupil_data(mock_json_msg_query, + brain_observatory_cache): + + with patch.dict('allensdk.core.ophys_experiment_session_id_mapping.ophys_experiment_session_id_map', {111: 777}, clear=True): + # We are only testing that rma query is correct + try: + tls = brain_observatory_cache.get_ophys_pupil_data(111, suppress_pupil_data=False) + except Exception: + pass + + mock_json_msg_query.assert_called_once_with( + "http://api.brain-map.org/api/v2/data/query.json?q=" + "model::WellKnownFile," + "rma::criteria,[attachable_id$eq777],well_known_file_type[name$eqEyeDlcScreenMapping]," + "rma::options[num_rows$eq'all'][count$eqfalse]" + ) + + +def test_build_manifest(tmpdir_factory): + try: + manifest_data = bytes(CACHE_MANIFEST, 'UTF-8') # Python 3 + except: + manifest_data = bytes(CACHE_MANIFEST) # Python 2.7 + + manifest_file = str(tmpdir_factory.mktemp("boc").join("manifest.json")) + with patch('allensdk.config.manifest_builder.ManifestBuilder.write_json_string') as mock_write_json_string: + mock_write_json_string.return_value = manifest_data + + brain_observatory_cache = BrainObservatoryCache(manifest_file=manifest_file) + with open(manifest_file, 'rb') as f: + read_manifest_data = f.read() + + assert manifest_data == read_manifest_data + + +def test_string_argument_errors(brain_observatory_cache): + boc = brain_observatory_cache + + with pytest.raises(TypeError): + boc.get_experiment_containers(targeted_structures='str') + + with pytest.raises(TypeError): + boc.get_experiment_containers(cre_lines='str') + + with pytest.raises(TypeError): + boc.get_ophys_experiments(targeted_structures='str') + + with pytest.raises(TypeError): + boc.get_ophys_experiments(cre_lines='str') + + with pytest.raises(TypeError): + boc.get_ophys_experiments(stimuli='str') + + with pytest.raises(TypeError): + boc.get_ophys_experiments(session_types='str') + +@pytest.mark.skipif(not os.path.exists('/allen/aibs/informatics/module_test_data'), reason='AIBS path not available') +@pytest.mark.parametrize("path_dict", get_list_of_path_dict()) +def test_brain_observatory_cache_get_analysis_file(brain_observatory_cache, path_dict): + + nwb_path_pattern = os.path.join(os.path.dirname(path_dict['nwb_file']), '%d.nwb') + brain_observatory_cache.manifest.add_path(brain_observatory_cache.EXPERIMENT_DATA_KEY, nwb_path_pattern) + + analysis_path_pattern = os.path.join(os.path.dirname(path_dict['analysis_file']), '%d_%s_analysis.h5') + brain_observatory_cache.manifest.add_path(brain_observatory_cache.ANALYSIS_DATA_KEY, analysis_path_pattern) + + oeid = path_dict['ophys_experiment_id'] + data_set = brain_observatory_cache.get_ophys_experiment_data(oeid) + for stimulus in data_set.list_stimuli(): + if stimulus != si.SPONTANEOUS_ACTIVITY: + brain_observatory_cache.get_ophys_experiment_analysis(oeid, stimulus) + + +@pytest.mark.skipif(not os.path.exists('/allen/aibs/informatics/module_test_data'), reason='AIBS path not available') +def test_brain_observatory_cache_get_events_data(brain_observatory_cache, events_test_data): + eid = events_test_data["experiment_id"] + data_file = events_test_data["pattern"] % eid + + brain_observatory_cache.manifest.add_path(brain_observatory_cache.EVENTS_DATA_KEY, events_test_data["pattern"]) + + events = brain_observatory_cache.get_ophys_experiment_events(eid) + true_events = np.load(data_file, allow_pickle=False)["ev"] + assert(np.all(events == true_events)) diff --git a/test/core/test_brain_observatory_nwb_data_set.py b/test/core/test_brain_observatory_nwb_data_set.py new file mode 100644 index 0000000000..b141c3ab96 --- /dev/null +++ b/test/core/test_brain_observatory_nwb_data_set.py @@ -0,0 +1,360 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import functools +import numpy as np +from pkg_resources import resource_filename # @UnresolvedImport +from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet, si +import allensdk.core.brain_observatory_nwb_data_set as bonds +import pytest +import os +import h5py + +from allensdk.brain_observatory.brain_observatory_exceptions import MissingStimulusException + +from test_h5_utilities import mem_h5 + + +NWB_FLAVORS = [] + +if 'TEST_NWB_FILES' in os.environ: + nwb_list_file = os.environ['TEST_NWB_FILES'] +else: + nwb_list_file = resource_filename(__name__, 'nwb_files.txt') + +if os.environ.get('TEST_COMPLETE', None) == 'true': + with open(nwb_list_file, 'r') as f: + NWB_FLAVORS = [l.strip() for l in f] + + +@pytest.fixture(params=NWB_FLAVORS) +def data_set(request): + assert os.path.exists(request.param) + data_set = BrainObservatoryNwbDataSet(request.param) + + return data_set + + +@pytest.fixture +def stim_pres_h5(mem_h5): + def make_stim_pres_h5(stimulus_name): + mem_h5.create_group('stimulus/presentation/{}'.format(stimulus_name)) + mem_h5.create_group('stimulus/not_presentation/{}'.format(stimulus_name)) + return mem_h5 + return make_stim_pres_h5 + + +@pytest.fixture +def abstract_feature_series_h5(mem_h5): + def make_abstract_feature_series_h5(stimulus_name, stim_data, features, frame_dur): + + stimulus_path = 'stimulus/presentation/{}'.format(stimulus_name) + frame_dur_path = '{}/frame_duration'.format(stimulus_path) + features_path = '{}/features'.format(stimulus_path) + stim_data_path = '{}/data'.format(stimulus_path) + + mem_h5[frame_dur_path] = frame_dur + mem_h5[stim_data_path] = stim_data + mem_h5[features_path] = features + + return mem_h5 + return make_abstract_feature_series_h5 + + +def test_acceptance(data_set): + data_set.get_cell_specimen_ids() + data_set.get_session_type() + data_set.get_metadata() + data_set.get_running_speed() + data_set.get_motion_correction() + + +def test_get_roi_ids(data_set): + ids = data_set.get_roi_ids() + assert len(ids) == len(data_set.get_cell_specimen_ids()) + +def test_get_metadata(data_set): + md = data_set.get_metadata() + + valid_fields = [ 'genotype', 'cre_line', 'imaging_depth_um', 'ophys_experiment_id', 'experiment_container_id', + 'session_start_time', 'age_days', 'device', 'device_name', 'pipeline_version', 'sex', + 'targeted_structure', 'excitation_lambda', 'indicator', 'fov', 'session_type', 'specimen_name' ] + + invalid_fields = [ 'imaging_depth', 'age', 'device_string', 'generated_by' ] + + for field in valid_fields: + assert md[field] is not None + + for field in invalid_fields: + assert field not in md + + + +def test_get_cell_specimen_indices(data_set): + inds = data_set.get_cell_specimen_indices([]) + assert len(inds) == 0 + + ids = data_set.get_cell_specimen_ids() + + inds = data_set.get_cell_specimen_indices(ids) + assert np.all(np.array(inds) == np.arange(len(inds))) + + inds = data_set.get_cell_specimen_indices([ids[0]]) + assert inds[0] == 0 + + +def test_get_fluorescence_traces(data_set): + ids = data_set.get_cell_specimen_ids() + + timestamps, traces = data_set.get_fluorescence_traces() + assert len(timestamps) == traces.shape[1] + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_fluorescence_traces(ids) + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_fluorescence_traces([ids[0]]) + assert traces.shape[0] == 1 + + +def test_get_neuropil_traces(data_set): + ids = data_set.get_cell_specimen_ids() + + timestamps, traces = data_set.get_neuropil_traces() + assert len(timestamps) == traces.shape[1] + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_neuropil_traces(ids) + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_neuropil_traces([ids[0]]) + assert traces.shape[0] == 1 + + +def test_get_dff_traces(data_set): + ids = data_set.get_cell_specimen_ids() + + timestamps, traces = data_set.get_dff_traces() + # assert len(timestamps) == traces.shape[1] + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_dff_traces(ids) + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_dff_traces([ids[0]]) + assert traces.shape[0] == 1 + +def test_get_neuropil_r(data_set): + + ids = data_set.get_cell_specimen_ids() + r = data_set.get_neuropil_r() + assert len(ids) == len(r) + + r = data_set.get_neuropil_r(ids) + assert len(ids) == len(r) + + short_list = [ids[0]] + r = data_set.get_neuropil_r(short_list) + assert len(short_list) == len(r) + +def test_get_corrected_fluorescence_traces(data_set): + ids = data_set.get_cell_specimen_ids() + + timestamps, traces = data_set.get_corrected_fluorescence_traces() + assert len(timestamps) == traces.shape[1] + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_corrected_fluorescence_traces(ids) + assert len(ids) == traces.shape[0] + + timestamps, traces = data_set.get_corrected_fluorescence_traces([ids[0]]) + assert traces.shape[0] == 1 + + +def test_get_roi_mask(data_set): + ids = data_set.get_cell_specimen_ids() + roi_masks = data_set.get_roi_mask() + assert len(ids) == len(roi_masks) + + max_projection = data_set.get_max_projection() + for roi_mask in roi_masks: + mask = roi_mask.get_mask_plane() + assert mask.shape[0] == max_projection.shape[0] + assert mask.shape[1] == max_projection.shape[1] + + roi_masks = data_set.get_roi_mask([ids[0]]) + assert len(roi_masks) == 1 + + +def test_get_roi_mask_array(data_set): + ids = data_set.get_cell_specimen_ids() + arr = data_set.get_roi_mask_array() + assert arr.shape[0] == len(ids) + + arr = data_set.get_roi_mask_array([ids[0]]) + assert arr.shape[0] == 1 + + try: + arr = data_set.get_roi_mask_array([0]) + except ValueError as e: + assert str(e).startswith("Cell specimen not found") + + +def test_get_stimulus_epoch_table(data_set): + + summary_df = data_set.get_stimulus_epoch_table() + + session_type = data_set.get_session_type() + if session_type == si.THREE_SESSION_A or si.THREE_SESSION_C: + assert len(summary_df) == 7 + elif session_type == si.THREE_SESSION_B: + assert len(summary_df) == 8 + elif session_type == si.THREE_SESSION_C2: + assert len(summary_df) == 10 + else: + raise NotImplementedError('Code not tested for session of type: %s' % session_type) + +def test_get_stimulus_table_master(data_set): + + master_df = data_set.get_stimulus_table('master') + + session_type = data_set.get_session_type() + if session_type == si.THREE_SESSION_A: + assert len(master_df) == 45629 + elif session_type == si.THREE_SESSION_B: + assert len(master_df) == 20951 + elif session_type == si.THREE_SESSION_C: + assert len(master_df) == 26882 + elif session_type == si.THREE_SESSION_C2: + assert len(master_df) == 29398 + else: + raise NotImplementedError('Code not tested for session of type: %s' % session_type) + + +def test_make_indexed_time_series_stimulus_table(): + + stimulus_name = 'fish' + frame_dur_exp = np.arange(20).reshape((10, 2)) + inds_exp = np.arange(10) + + obt = bonds._make_indexed_time_series_stimulus_table(inds_exp, frame_dur_exp) + + frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T + assert(np.allclose( frame_dur_obt, frame_dur_exp )) + + +def test_make_indexed_time_series_stimulus_table_out_of_order(): + + stimulus_name = 'fish' + frame_dur_exp = np.arange(20).reshape((10, 2)) + frame_dur_file = frame_dur_exp.copy()[::-1, :] + inds_exp = np.arange(10) + + obt = bonds._make_indexed_time_series_stimulus_table(inds_exp, frame_dur_file) + + frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T + assert(np.allclose( frame_dur_obt, frame_dur_exp )) + + +def test_make_abstract_feature_series_stimulus_table_out_of_order(): + + stimulus_name = 'fish' + frame_dur_exp = np.arange(20).reshape((10, 2)) + frame_dur_file = frame_dur_exp.copy()[::-1, :] + features_exp = ['orientation', 'spatial_frequency', 'phase'] + data_exp = np.arange(30).reshape((10, 3)) + data_file = data_exp.copy()[::-1, :] + + obt = bonds._make_abstract_feature_series_stimulus_table(data_file, features_exp, frame_dur_file) + + frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T + assert(np.allclose( frame_dur_obt, frame_dur_exp )) + + data_obt = np.array([ obt['orientation'].values, obt['spatial_frequency'].values, obt['phase'].values ]).T + assert(np.allclose( data_obt, data_exp )) + + +def test_make_spontanous_activity_stimulus_table(): + + table_values_exp = [[0, 2], [4, 6]] + + frame_dur = np.arange(8).reshape((4, 2)) + events = np.array([ 1, -1, 1, -1 ]) + + obt = bonds._make_spontaneous_activity_stimulus_table(events, frame_dur) + assert(np.allclose( obt.values, table_values_exp )) + + +def test_make_repeated_indexed_time_series_stimulus_table(): + + stimulus_name = 'fish' + frame_dur_exp = np.arange(20).reshape((10, 2)) + inds_exp = np.array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) + repeats_exp = np.array([0] * 5 + [1] * 5) + + obt = bonds._make_repeated_indexed_time_series_stimulus_table(inds_exp, frame_dur_exp) + + frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T + assert(np.allclose( frame_dur_obt, frame_dur_exp )) + assert(np.allclose( repeats_exp, obt['repeat'] )) + + +def test_find_stimulus_presentation_group(stim_pres_h5): + + stimulus_name = 'fish' + stim_pres_h5 = stim_pres_h5(stimulus_name) + + obt = bonds._find_stimulus_presentation_group(stim_pres_h5, stimulus_name) + + assert( obt.name == '/stimulus/presentation/fish' ) + + +def test_find_stimulus_presentation_group_missing(stim_pres_h5): + + stimulus_name = 'fish' + stim_pres_h5 = stim_pres_h5('fowl') + + with pytest.raises(MissingStimulusException): + obt = bonds._find_stimulus_presentation_group(stim_pres_h5, stimulus_name) + + +def test_find_stimulus_presentation_group_duplicate(stim_pres_h5): + + stimulus_name = 'fish' + stim_pres_h5 = stim_pres_h5('fish') + stim_pres_h5.create_group('/stimulus/presentation/fish_stimulus') + + with pytest.raises(MissingStimulusException): + obt = bonds._find_stimulus_presentation_group(stim_pres_h5, stimulus_name) diff --git a/test/core/test_cell_filters.py b/test/core/test_cell_filters.py new file mode 100644 index 0000000000..298b5a9c8b --- /dev/null +++ b/test/core/test_cell_filters.py @@ -0,0 +1,360 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import os +import json +import pandas as pd +from zipfile import ZipFile +from mock import patch, mock_open, MagicMock +from test_brain_observatory_cache import CACHE_MANIFEST +from allensdk.core.brain_observatory_cache \ + import BrainObservatoryCache +from allensdk.api.queries.brain_observatory_api \ + import BrainObservatoryApi + + +try: + import __builtin__ as builtins # @UnresolvedImport +except: + import builtins # @UnresolvedImport + +CELL_SPECIMEN_ZIP_URL = ("http://observatory.brain-map.org/visualcoding/" + "data/cell_metrics.csv.zip") + + +@pytest.fixture +def cells(): + return [{u'tld1_id': 177839004, + u'natural_movie_two_small': None, + u'natural_movie_one_a_small': None, + u'speed_tuning_c_large': None, + u'speed_tuning_c_small': None, + u'drifting_grating_small': None, + u'tld1_name': u'Cux2-CreERT2', + u'imaging_depth': 275, + u'tlr1_id': 265943423, + u'pref_dir_dg': None, + u'osi_sg': 0.728589701688166, + u'osi_dg': None, + u'tlr1_name': u'Ai93(TITL-GCaMP6f)', + u'area': u'VISpm', + u'pref_image_ns': 89.0, + u'natural_movie_one_c_small': None, + u'locally_sparse_noise_on_small': None, + u'drifting_grating_large': None, + u'experiment_container_id': 511498500, + u'natural_movie_one_a_large': None, + u'natural_movie_one_c_large': None, + u'tld2_name': u'Camk2a-tTA', + u'p_ns': 2.64407299505246e-05, + u'natural_movie_three_large': None, + u'pref_ori_sg': 30.0, + u'speed_tuning_a_large': None, + u'p_dg': None, + u'time_to_peak_sg': 0.199499999999999, + u'p_sg': 7.60972815250796e-05, + u'time_to_peak_ns': 0.299249999999998, + u'locally_sparse_noise_on_large': None, + u'dsi_dg': None, + u'pref_tf_dg': None, + u'natural_movie_three_small': None, + u'pref_sf_sg': 0.32, + u'tld2_id': 177837320, + u'locally_sparse_noise_off_large': None, + u'locally_sparse_noise_off_small': None, + u'cell_specimen_id': 517394843, + u'pref_phase_sg': 0.5 + }, + {u'tld1_id': 177839004, + u'natural_movie_two_small': None, + u'natural_movie_one_a_small': None, + u'speed_tuning_c_large': None, + u'speed_tuning_c_small': None, + u'drifting_grating_small': None, + u'tld1_name': u'Cux2-CreERT2', + u'imaging_depth': 275, + u'tlr1_id': 265943423, + u'natural_movie_two_large': None, + u'speed_tuning_a_small': None, + u'pref_dir_dg': None, + u'osi_sg': 0.899272239777491, + u'osi_dg': None, + u'tlr1_name': u'Ai93(TITL-GCaMP6f)', + u'area': u'VISpm', + u'pref_image_ns': 15.0, + u'natural_movie_one_c_small': None, + u'locally_sparse_noise_on_small': None, + u'drifting_grating_large': None, + u'experiment_container_id': 511498500, + u'natural_movie_one_a_large': None, + u'natural_movie_one_c_large': None, + u'tld2_name': u'Camk2a-tTA', + u'p_ns': 0.000356823517642681, + u'natural_movie_three_large': None, + u'pref_ori_sg': 0.0, + u'speed_tuning_a_large': None, + u'p_dg': None, + u'time_to_peak_sg': 0.565249999999996, + u'p_sg': 0.0565790644804479, + u'time_to_peak_ns': 0.432249999999997, + u'locally_sparse_noise_on_large': None, + u'dsi_dg': None, + u'pref_tf_dg': None, + u'natural_movie_three_small': None, + u'pref_sf_sg': 0.32, + u'tld2_id': 177837320, + u'locally_sparse_noise_off_large': None, + u'locally_sparse_noise_off_small': None, + u'cell_specimen_id': 517394850, + u'pref_phase_sg': 0.5}] + + +@pytest.fixture +def api(): + boi = BrainObservatoryApi() + + return boi + + +@pytest.fixture +def unmocked_boc(fn_temp_dir): + manifest_file = os.path.join(fn_temp_dir, "unmocked_boc", "manifest.json") + boc = BrainObservatoryCache(manifest_file=manifest_file) + + return boc + + +@pytest.fixture +def brain_observatory_cache(fn_temp_dir): + boc = None + + try: + manifest_data = bytes(CACHE_MANIFEST, + 'UTF-8') # Python 3 + except: + manifest_data = bytes(CACHE_MANIFEST) # Python 2.7 + + with patch('os.path.exists', + return_value=True): + with patch(builtins.__name__ + ".open", + mock_open(read_data=manifest_data)): + manifest_file = os.path.join(fn_temp_dir, "boc", "manifest.json") + boc = BrainObservatoryCache(manifest_file=manifest_file, + base_uri='http://api.brain-map.org') + + return boc + + +@pytest.fixture(scope="module") +def cell_specimen_table(tmpdir_factory): + # download a zipped version of the cell specimen table for filter tests + # as it is orders of magnitude faster + api = BrainObservatoryApi() + data_dir = str(tmpdir_factory.mktemp("data")) + zipped = os.path.join("cell_specimens.zip") + api.retrieve_file_over_http(CELL_SPECIMEN_ZIP_URL, zipped) + df = pd.read_csv(ZipFile(zipped).open("cell_metrics.csv"), + true_values="t", false_values="f") + js = json.loads(df.to_json(orient="records")) + table_file = os.path.join(data_dir, "cell_specimens.json") + with open(table_file, "w") as f: + json.dump(js, f, indent=1) + return table_file + + +@pytest.fixture +def example_filters(): + f = [{"field": "p_dg", + "op": "<=", + "value": 0.001 }, + {"field": "pref_dir_dg", + "op": "=", "value": 45 }, + {"field": "area", "op": "in", "value": [ "VISpm" ] }, + {"field": "tld1_name", + "op": "in", + "value": [ "Rbp4-Cre", "Cux2-CreERT2", "Rorb-IRES2-Cre" ] } + ] + + return f + + +@pytest.fixture +def between_filter(): + f = [{"field": "p_ns", + "op": "between", + "value": [ 0.00034, 0.00035 ] } + ] + + return f + + +FILTER_OPERATORS = ["=", "<", ">", "<=", ">=", "between", "in", "is"] +QUERY_TEMPLATES = { + "=": '({0} == {1})', + "<": '({0} < {1})', + ">": '({0} > {1})', + "<=": '({0} <= {1})', + ">=": '({0} >= {1})', + "between": '({0} >= {1}) and ({0} <= {1})', + "in": '({0} == {1})', + "is": '({0} == {1})' +} + + +@pytest.mark.skipif(True, reason="not done") +@patch.object(BrainObservatoryApi, "json_msg_query") +def test_dataframe_query(mock_json_msg_query, + brain_observatory_cache, + between_filter, + cells): + brain_observatory_cache = unmocked_boc + with patch('os.path.exists', + MagicMock(return_value=True)): + with patch('allensdk.core.json_utilities.read', + MagicMock(return_value=cells)): + cells = brain_observatory_cache.get_cell_specimens( + filters=between_filter) + + assert len(cells) > 0 + + +@pytest.mark.todo_flaky +def test_dataframe_query_unmocked(unmocked_boc, + example_filters, + cells, + cell_specimen_table): + brain_observatory_cache = unmocked_boc + + cells = brain_observatory_cache.get_cell_specimens( + filters=example_filters, + file_name=cell_specimen_table) + + # total lines = 18260, can make fail by passing no filters + #expected = 105 + assert len(cells) > 0 and len(cells) < 1000 + + +@pytest.mark.todo_flaky +def test_dataframe_query_between_unmocked(unmocked_boc, + between_filter, + cells, + cell_specimen_table): + brain_observatory_cache = unmocked_boc + + cells = brain_observatory_cache.get_cell_specimens( + filters=between_filter, + file_name=cell_specimen_table) + + # total lines = 18260, can make fail by passing no filters + #expected = 15 + assert len(cells) > 0 and len (cells) < 1000 + + +@pytest.mark.todo_flaky +def test_dataframe_query_is_unmocked(unmocked_boc, + cells, + cell_specimen_table): + brain_observatory_cache = unmocked_boc + + is_filter = [ + {"field": "all_stim", + "op": "is", + "value": True } + ] + + cells = brain_observatory_cache.get_cell_specimens( + filters=is_filter, + file_name=cell_specimen_table) + + assert len(cells) > 0 + + +def test_dataframe_query_string_between(api): + filters = [ + {"field": "p_ns", + "op": "between", + "value": [ 0.00034, 0.00035 ] } + ] + + query_string = api.dataframe_query_string(filters) + + assert query_string == '(p_ns >= 0.00034) and (p_ns <= 0.00035)' + + +def test_dataframe_query_string_in(api): + filters = [ + {"field": "name", + "op": "in", + "value": [ 'Abc', 'Def', 'Ghi' ] } + ] + + query_string = api.dataframe_query_string(filters) + + assert query_string == "(name == ['Abc', 'Def', 'Ghi'])" + + +def test_dataframe_query_string_in_floats(api): + filters = [ + {"field": "rating", + "op": "in", + "value": [ 9.9, 8.7, 0.1 ] } + ] + + query_string = api.dataframe_query_string(filters) + + assert query_string == "(rating == [9.9, 8.7, 0.1])" + + +def test_dataframe_query_string_is_boolean(api): + filters = [ + {"field": "fact_check", + "op": "is", + "value": False } + ] + + query_string = api.dataframe_query_string(filters) + + assert query_string == "(fact_check == False)" + + +def test_dataframe_query_string_multi_filters(api, + example_filters): + query_string = api.dataframe_query_string(example_filters) + + assert query_string == ("(p_dg <= 0.001) & (pref_dir_dg == 45) & " + "(area == ['VISpm']) & " + "(tld1_name == " + "['Rbp4-Cre', 'Cux2-CreERT2', 'Rorb-IRES2-Cre'])") diff --git a/test/core/test_cell_types_cache_unit.py b/test/core/test_cell_types_cache_unit.py new file mode 100644 index 0000000000..6858396284 --- /dev/null +++ b/test/core/test_cell_types_cache_unit.py @@ -0,0 +1,622 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import allensdk.core.cell_types_cache as CTC +from allensdk.core.cell_types_cache import ReporterStatus as RS +import pytest +from pandas.core.frame import DataFrame +from allensdk.config import enable_console_log +from mock import MagicMock, patch, call, mock_open +from six.moves import builtins +import itertools as it +import allensdk.core.json_utilities as ju +import pandas.io.json as pj +import pandas as pd +import os + +_MOCK_PATH = '/path/to/xyz.txt' + + +@pytest.fixture(scope="session", autouse=True) +def console_log(): + enable_console_log() + + +@pytest.fixture +def cell_id(): + cell_id = 480114344 + + return cell_id + + +@pytest.fixture +def cached_csv(tmpdir_factory): + csv = str(tmpdir_factory.mktemp("cache_test").join("data.csv")) + return csv + + +@pytest.fixture +def cache_fixture(tmpdir_factory): + # Instantiate the CellTypesCache instance. The manifest_file argument + # tells it where to store the manifest, which is a JSON file that tracks + # file paths. If you supply a relative path, it will go + # into your current working directory + manifest_file = str(tmpdir_factory.mktemp("ctc").join("manifest.json")) + ctc = CTC.CellTypesCache(manifest_file=manifest_file) + + return ctc + + +@pytest.mark.parametrize('path_exists', + (False, True)) +@patch('allensdk.core.cell_types_cache.NwbDataSet') +def test_sweep_data_with_api(mock_nwb, + cache_fixture, + path_exists): + ctc = cache_fixture + + specimen_id = 464212183 + + ephys_result = [{'ephys_result': + {'well_known_files': [ + {'download_link': '/path/to/data.nwb' }]}}] + + # this saves the NWB file to 'cell_types/specimen_464212183/ephys.nwb' + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=ephys_result)) as query_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs') as mkd: + mock_nwb.reset_mock() + _ = ctc.get_ephys_data(specimen_id, _MOCK_PATH) + + assert ope.called + if path_exists: + mock_nwb.assert_called_once_with(_MOCK_PATH) + assert not query_mock.called + assert not mkd.called + else: + # both levels of cacheable methods check if the directory exists. + assert mkd.call_args_list == [call(_MOCK_PATH)] + assert query_mock.called + mock_http.assert_called_once_with('http://api.brain-map.org/path/to/data.nwb', + _MOCK_PATH) + + +def test_sweep_data_exception(cache_fixture): + ctc = cache_fixture + + specimen_id = 464212183 + + ephys_result = [{'ephys_result': + {'well_known_files': [] }}] + + with pytest.raises(Exception) as exc: + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=ephys_result)) as query_mock: + with patch('os.path.exists', MagicMock(return_value=False)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + with patch('allensdk.core.cell_types_cache.NwbDataSet') as nwb: + _ = ctc.get_ephys_data(specimen_id) + + assert 'has no ephys data' in str(exc.value) + + +@pytest.mark.parametrize('path_exists,morph_flag,recon_flag,statuses,species,simple', + it.product((False, True), + (False, True), + (False, True), + (RS.POSITIVE, ['list', 'of', 'statuses']), + (None, ['mouse'], ['human']), + (False,))) + +def test_get_cells(cache_fixture, + path_exists, + morph_flag, + recon_flag, + statuses, + species, + simple): + ctc = cache_fixture + # this downloads metadata for all cells with morphology images + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.core.json_utilities.read', + return_value=['mock_cells_from_server']) as ju_read: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.list_cells_api', + MagicMock(return_value=['mock_cells_from_server'])) as list_cells_mock: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.filter_cells_api', + MagicMock(return_value=['mock_cells'])) as filter_cells_mock: + with patch('allensdk.core.json_utilities.write') as ju_write: + cells = ctc.get_cells(require_morphology=morph_flag, + require_reconstruction=recon_flag, + reporter_status=statuses, + species=species, + simple=simple) + + assert cells == ['mock_cells'] + + if (statuses == RS.POSITIVE): + expected_status = [statuses] + else: + expected_status = statuses + + filter_cells_mock.assert_called_once_with(['mock_cells_from_server'], + morph_flag, + recon_flag, + expected_status, + species, + simple) + + +@pytest.mark.parametrize('path_exists,morph_flag,recon_flag,statuses', + it.product((False, True), + (False, True), + (False, True), + (RS.POSITIVE, ['list', 'of', 'statuses']))) +def test_get_cells_with_api(cache_fixture, + path_exists, + morph_flag, + recon_flag, + statuses): + ctc = cache_fixture + + # note, this is only a mock for coverage, + # and has not a lot of relation to the actual data form + sweeps = [1, 2, 3] + return_dicts = [{'sweep_number': x, + 'tags': ['what - ever'], + 'neuron_reconstructions' : [], + 'data_sets': [], + 'reporter_status': 'whatever', + 'has_morphology': False, + 'has_reconstruction': False, + 'donor': { 'transgenic_lines': [{'transgenic_line_type_name': 'driver', + 'name': 'harold'}]}, + 'cell_reporter': {'name': 'tired'}, + 'specimen_tags': [{'name': 'a - b', + 'value': 123}]} for x \ + in sweeps] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', return_value=return_dicts)) as query_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.core.json_utilities.read', + return_value=return_dicts) as ju_read: + with patch('allensdk.core.json_utilities.write') as ju_write: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + cells = ctc.get_cells(require_morphology=morph_flag, + require_reconstruction=recon_flag, + reporter_status=statuses, + simple=True) + if path_exists: + ju_read.assert_called_once_with(_MOCK_PATH) + else: + assert ju_write.called + +@pytest.mark.parametrize('path_exists', + (False, True)) +def test_get_reconstruction(cache_fixture, + cell_id, + path_exists): + ctc = cache_fixture + + save_recon = \ + 'allensdk.api.queries.cell_types_api.CellTypesApi.save_reconstruction' + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch(save_recon) as save_recon_mock: + with patch('allensdk.core.swc.read_swc') as read_swc_mock: + # download and open an SWC file + _ = ctc.get_reconstruction(cell_id) + + if path_exists is False: + save_recon_mock.assert_called_once_with(cell_id, + _MOCK_PATH) + + read_swc_mock.assert_called_once_with(_MOCK_PATH) + + +@pytest.mark.parametrize('path_exists', + (False, True)) +@patch.object(DataFrame, "to_csv") +def test_get_reconstruction_with_api(to_csv, + cache_fixture, + cell_id, + path_exists): + ctc = cache_fixture + + reconstruction_data = [{'neuron_reconstructions': [ + {'well_known_files': [ + {'download_link': 'http://example.org'}]}]}] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=reconstruction_data)) as query_mock: + with patch('allensdk.core.swc.read_swc') as read_swc_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + _ = ctc.get_reconstruction(cell_id) + + if path_exists: + read_swc_mock.assert_called_once_with(_MOCK_PATH) + else: + assert query_mock.called + + +@patch.object(DataFrame, "to_csv") +def test_get_reconstruction_exception(to_csv, + cache_fixture, + cell_id): + ctc = cache_fixture + + reconstruction_data = [{'neuron_reconstructions': [ + {'well_known_files': None}]}] + + with pytest.raises(Exception) as exc: + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=reconstruction_data)) as query_mock: + with patch('allensdk.core.swc.read_swc') as read_swc_mock: + with patch('os.path.exists', MagicMock(return_value=False)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + _ = ctc.get_reconstruction(cell_id) + + assert 'has no reconstruction' in str(exc.value) + + +@pytest.mark.parametrize('path_exists,lookup_error', + it.product((False, True), + (False, True))) +def test_get_reconstruction_markers(cache_fixture, + cell_id, + path_exists, + lookup_error): + ctc = cache_fixture + + if lookup_error: + def lookup(i, n): + raise(LookupError('mock lookup error')) + else: + def lookup(i, n): + return + + save_recon_marker = \ + 'allensdk.api.queries.cell_types_api.CellTypesApi.save_reconstruction_markers' + + # download and open a marker file + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch(save_recon_marker, + MagicMock(side_effect=lookup)) as save_recon_markers_mock: + with patch('allensdk.core.swc.read_marker_file') as read_marker_mock: + _ = ctc.get_reconstruction_markers(cell_id) + + if path_exists is False: + save_recon_markers_mock.assert_called_once_with(cell_id, + _MOCK_PATH) + + if lookup_error: + assert not read_marker_mock.called + else: + read_marker_mock.assert_called_once_with(_MOCK_PATH) + + +@pytest.mark.parametrize('path_exists,lookup_error', + it.product((False, True), + (False, True))) +def test_get_reconstruction_markers_with_api(cache_fixture, + cell_id, + path_exists, + lookup_error): + ctc = cache_fixture + + reconstruction_data = [{'neuron_reconstructions': [ + {'well_known_files': [ + {'download_link': '/mock/path_to_file'}]}]}] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=reconstruction_data)) as query_mock: + with patch('allensdk.core.swc.read_marker_file') as marker_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + _ = ctc.get_reconstruction_markers(cell_id) + + if path_exists: + assert marker_mock.called + else: + mock_http.assert_called_once_with('http://api.brain-map.org/mock/path_to_file', + _MOCK_PATH) + + +def test_get_reconstruction_markers_exception(cache_fixture, + cell_id): + ctc = cache_fixture + + reconstruction_data = [{'neuron_reconstructions': [ + {'well_known_files': []}]}] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=reconstruction_data)) as query_mock: + with patch('allensdk.core.swc.read_marker_file') as marker_mock: + with patch('os.path.exists', MagicMock(return_value=False)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + markers = ctc.get_reconstruction_markers(cell_id) + + assert len(markers) == 0 + + +@pytest.mark.parametrize('dataframe', + (False, True)) +def test_get_ephys_features(cache_fixture, + dataframe): + ctc = cache_fixture + + api_get_ephys_features = \ + 'allensdk.api.queries.cell_types_api.CellTypesApi.get_ephys_features' + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch(api_get_ephys_features) as api_get_ephys_features_mock: + # download all electrophysiology features for all cells + _ = ctc.get_ephys_features(dataframe=dataframe) + + assert api_get_ephys_features_mock.called + + +@pytest.mark.parametrize('df,path_exists', + it.product((False,True), + (False,True))) +@patch.object(DataFrame, "to_csv") +@patch("pandas.read_csv") +def test_get_ephys_features_with_api(read_csv, + to_csv, + cache_fixture, + df, + path_exists): + ctc = cache_fixture + + mock_data = [{'lorem': 1, + 'ipsum': 2 }, + {'lorem': 3, + 'ipsum': 4 }] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=mock_data)) as query_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs') as mkd: + _ = ctc.get_ephys_features(dataframe=df) + + if path_exists: + read_csv.assert_called_once_with(_MOCK_PATH, parse_dates=True) + else: + mkd.assert_called_once_with(_MOCK_PATH) + assert query_mock.called + + +@pytest.mark.parametrize('df', (False, True)) +def test_get_ephys_features_cache_roundtrip(cached_csv, + cache_fixture, + df): + ctc = cache_fixture + + mock_data = [{'lorem': 1, + 'ipsum': 2 }, + {'lorem': 3, + 'ipsum': 4 }] + + with patch.object(ctc, "get_cache_path", return_value=cached_csv): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=mock_data)) as query_mock: + data = ctc.get_ephys_features() + pandas_data = pd.read_csv(cached_csv, parse_dates=True) + + assert len(data) == 2 + assert sorted(data[0].keys()) == sorted(pandas_data.columns) + + +@pytest.mark.parametrize('path_exists,df', + it.product((False, True), + (False, True))) +@patch.object(DataFrame, "to_csv") +@patch("pandas.read_csv", + return_value=DataFrame([{ 'stuff': 'whatever'}, + { 'stuff': 'nonsense'}])) +def test_get_morphology_features(read_csv, + to_csv, + cache_fixture, + path_exists, + df): + ctc = cache_fixture + + json_data = [{ 'stuff': 'whatever'}, + { 'stuff': 'nonsense'}] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs') as mkd: + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=json_data)) as query_mock: + data = ctc.get_morphology_features(df, _MOCK_PATH) + + if df: + assert ('stuff' in data) == True + else: + assert all(['stuff' in f for f in data]) + + + if path_exists: + if df: + read_csv.assert_called_once_with(_MOCK_PATH, parse_dates=True) + else: + assert True + assert not mkd.called + else: + assert query_mock.called + assert mkd.called + + +@pytest.mark.parametrize('path_exists', + (False, True)) +def test_get_ephys_sweeps(cache_fixture, + path_exists): + ctc = cache_fixture + + cell_id = 464212183 + + get_ephys_sweeps = \ + 'allensdk.api.queries.cell_types_api.CellTypesApi.get_ephys_sweeps' + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch(get_ephys_sweeps) as get_ephys_sweeps_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.core.json_utilities.read', + return_value=['mock_data']) as ju_read: + with patch('allensdk.core.json_utilities.write') as ju_write: + _ = ctc.get_ephys_sweeps(cell_id) + + if path_exists: + assert ju_read.called_once_with(_MOCK_PATH) + else: + assert get_ephys_sweeps_mock.called_once_with(cell_id) + + +@pytest.mark.parametrize('path_exists', + (False, True)) +def test_get_ephys_sweeps_with_api(cache_fixture, + path_exists): + ctc = cache_fixture + + cell_id = 464212183 + sweeps = [1, 2, 3] + return_dicts = [{'sweep_number': x} for x in sweeps] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=return_dicts)) as query_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + with patch('allensdk.core.json_utilities.read', + return_value=['mock_data']) as ju_read: + with patch('allensdk.core.json_utilities.write') as ju_write: + _ = ctc.get_ephys_sweeps(cell_id) + + # read will be called regardless + assert ju_read.called_once_with(_MOCK_PATH) + + if path_exists: + assert not query_mock.called + else: + assert query_mock.called + + +@pytest.mark.parametrize('path_exists,require_reconstruction', + it.product((False, True), + (False, True))) +@patch('pandas.DataFrame.merge') +@patch.object(DataFrame, "to_csv") +@patch("pandas.read_csv", + return_value=DataFrame([{ 'stuff': 'whatever'}, + { 'stuff': 'nonsense'}])) +def test_get_all_features(read_csv, + to_csv, + mock_merge, + cache_fixture, + path_exists, + require_reconstruction): + ctc = cache_fixture + + sweeps = [1, 2, 3] + return_dicts = [{'sweep_number': x, + 'tags': 'whatever'} for x in sweeps] + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', + MagicMock(name='model query', + return_value=return_dicts)) as query_mock: + with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: + with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): + with patch('allensdk.core.json_utilities.read', + return_value=return_dicts) as ju_read: + with patch(builtins.__name__ + '.open', + mock_open(), + create=True) as open_mock: + with patch('allensdk.core.json_utilities.write') as ju_write: + _ = ctc.get_all_features( + require_reconstruction=require_reconstruction) + + if path_exists: + assert read_csv.called + else: + assert query_mock.called + + assert mock_merge.called + + +def test_build_manifest(cache_fixture): + ctc = cache_fixture + + mb_mock = MagicMock(name='manifest builder') + + with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): + with patch('allensdk.core.cell_types_cache.ManifestBuilder', + return_value=mb_mock): + ctc.build_manifest('test_manifest.json') + + assert mb_mock.add_path.call_count == 8 + mb_mock.write_json_file.assert_called_once_with('test_manifest.json') diff --git a/test/core/test_h5_utilities.py b/test/core/test_h5_utilities.py new file mode 100644 index 0000000000..7d3dd565d2 --- /dev/null +++ b/test/core/test_h5_utilities.py @@ -0,0 +1,87 @@ +import functools + +import h5py +import pytest +import numpy as np + +import allensdk.core.h5_utilities as h5_utilities + + +@pytest.fixture +def mem_h5(request): + my_file = h5py.File('my_file.h5', driver='core', backing_store=False) + + def fin(): + my_file.close() + request.addfinalizer(fin) + + return my_file + + +@pytest.fixture +def simple_h5(mem_h5): + mem_h5.create_group('a') + mem_h5.create_group('a/b') + mem_h5.create_group('a/b/c') + mem_h5.create_group('d') + mem_h5.create_group('a/e') + + return mem_h5 + + +@pytest.fixture +def simple_h5_with_datsets(simple_h5): + simple_h5.create_dataset(name='/a/b/c/fish', data=np.eye(10)) + simple_h5.create_dataset(name='a/fowl', data=np.eye(15)) + simple_h5.create_dataset(name='a/b/mammal', data=np.eye(20)) + + return simple_h5 + + +def test_decode_bytes(): + + inp = np.array([b'a', b'b', b'c']) + obt = h5_utilities.decode_bytes(inp) + + assert(np.array_equal( obt, ['a', 'b', 'c'] )) + + +def test_traverse_h5_file(simple_h5): + + names = [] + def cb(name, node): + names.append(name) + h5_utilities.traverse_h5_file(cb, simple_h5) + + assert( set(names) == set(['a', 'a/b', 'a/b/c', 'd', 'a/e']) ) + + +def test_locate_h5_objects(simple_h5): + + matcher_cb = functools.partial(h5_utilities.h5_object_matcher_relname_in, ['c', 'e']) + matches = h5_utilities.locate_h5_objects(matcher_cb, simple_h5) + + match_names = [ match.name for match in matches ] + assert( set(match_names) == set(['/a/e', '/a/b/c']) ) + + +def test_keyed_locate_h5_objects(simple_h5): + + matcher_cbs = { + 'e': functools.partial(h5_utilities.h5_object_matcher_relname_in, ['e']), + 'c': functools.partial(h5_utilities.h5_object_matcher_relname_in, ['c']), + } + + matches = h5_utilities.keyed_locate_h5_objects(matcher_cbs, simple_h5) + assert( matches['e'].name == '/a/e' ) + assert( matches['c'].name == '/a/b/c' ) + + +def test_load_datasets_by_relnames(simple_h5_with_datsets): + + relnames = ['fish', 'fowl', 'mammal'] + obt = h5_utilities.load_datasets_by_relnames(relnames, simple_h5_with_datsets, simple_h5_with_datsets['a/b']) + + assert( len(obt) == 2 ) + assert(np.allclose( obt['fish'], np.eye(10) )) + assert(np.allclose( obt['mammal'], np.eye(20) )) diff --git a/test/core/test_json_utilities.py b/test/core/test_json_utilities.py new file mode 100644 index 0000000000..be7aa56956 --- /dev/null +++ b/test/core/test_json_utilities.py @@ -0,0 +1,124 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import allensdk.core.json_utilities as ju +import pytest +from mock import patch, MagicMock, call +import numpy as np + + +@pytest.fixture +def dict_obj(): + int_array, y = np.meshgrid(np.arange(2), np.arange(2)) + float_array = y.astype(float)/4.2 + bool_array = int_array > 0 + + object = {"string": "test string", + "float_array": float_array, + "int_array": int_array, + "bool_array": bool_array, + "list": ["this", "is", 1, "list"]} + return object + + +def test_write_integer_array(dict_obj): + s_in = ju.write_string({ "int_array": dict_obj["int_array"] }) + s_out = """{ + "int_array": [ + [ + 0, + 1 + ], + [ + 0, + 1 + ] + ] +}""" + + assert s_in == s_out + +def test_write_float_array(dict_obj): + s_in = ju.write_string({ "float_array": dict_obj["float_array"] }) + s_out ="""{ + "float_array": [ + [ + 0.0, + 0.0 + ], + [ + 0.23809523809523808, + 0.23809523809523808 + ] + ] +}""" + + assert s_in == s_out + +def test_write_string(dict_obj): + s_in = ju.write_string({ "string": dict_obj["string"] }) + s_out = """{ + "string": "test string" +}""" + + assert s_in == s_out + +def test_write_bool_array(dict_obj): + s_in = ju.write_string({ "bool_array": dict_obj["bool_array"] }) + s_out = """{ + "bool_array": [ + [ + false, + true + ], + [ + false, + true + ] + ] +}""" + assert s_in == s_out + +def test_write_list(dict_obj): + s_in = ju.write_string({ "list": dict_obj["list"] }) + s_out = """{ + "list": [ + "this", + "is", + 1, + "list" + ] +}""" + assert s_in == s_out diff --git a/test/core/test_lazy_property.py b/test/core/test_lazy_property.py new file mode 100644 index 0000000000..ea485e735a --- /dev/null +++ b/test/core/test_lazy_property.py @@ -0,0 +1,42 @@ +import pytest +import copy as cp + +from allensdk.core.lazy_property import LazyProperty, LazyPropertyMixin + + +class CopyApi(object): + def get_data(self, original_data): + return cp.copy(original_data) + + +class DataClass(LazyPropertyMixin): + + def __init__(self, original_data, api=None): + self.api = CopyApi() if api is None else api + self.original_data = original_data + + self.data = self.LazyProperty(self.api.get_data, original_data=self.original_data) + + +@pytest.mark.parametrize('original_data', [{'a': 'b'}, [None]]) +def test_first_compute(original_data): + data_obj = DataClass(original_data) + assert data_obj.data == original_data + assert data_obj.data is not original_data + + +@pytest.mark.parametrize('original_data', [1, '1', [None]]) +def test_is_lazy(original_data): + data_obj = DataClass(original_data) + + first = data_obj.data + second = data_obj.data + assert first is second + + +@pytest.mark.parametrize('original_data', [1, '1', [None]]) +def test_not_settable(original_data): + data_obj = DataClass(original_data) + with pytest.raises(AttributeError) as err: + data_obj.data = '12345' + assert "Can't set LazyLoadable attribute" in err \ No newline at end of file diff --git a/test/core/test_mouse_connectivity_cache.py b/test/core/test_mouse_connectivity_cache.py new file mode 100644 index 0000000000..a525510e33 --- /dev/null +++ b/test/core/test_mouse_connectivity_cache.py @@ -0,0 +1,525 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import warnings +import mock +import pytest +import numpy as np +import nrrd +import pandas as pd +import SimpleITK as sitk + + +from allensdk.core.mouse_connectivity_cache import MouseConnectivityCache +from allensdk.core.structure_tree import StructureTree + + +@pytest.fixture +def cached_csv(tmpdir_factory): + csv = str(tmpdir_factory.mktemp("cache_test").join("data.csv")) + return csv + + +@pytest.fixture(scope='function') +def mcc(tmpdir_factory): + manifest_file = tmpdir_factory.mktemp("mcc").join('manifest.json') + return MouseConnectivityCache(manifest_file=str(manifest_file)) + + +@pytest.fixture(scope='function') +def new_nodes(): + + return [{'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'structure_sets':[{'id': 1}, {'id': 4}, {'id': 167587189}] }] + + +@pytest.fixture(scope='function') +def old_nodes(): + + return [{'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'parent_structure_id': 12}] + +@pytest.fixture(scope='function') +def experiments(): + return [{'data_set_id': 1, 'name': 'foo', 'storage_directory': 'meep', 'transgenic_line': { 'name': 'most_creish' }, + 'injection_structures': '234/324', 'structure_id': 97}, + {'data_set_id': 2, 'name': 'bar', 'storage_directory': 'meep', 'transgenic_line': None, + 'injection_structures': '234/324/234', 'structure_id': 21}] + + +@pytest.fixture(scope='function') +def unionizes(): + + # note that I've mucked around with these values a bit + return [{"hemisphere_id": 1, "id": 169991412, "is_injection": False, + "max_voxel_density": 0.284863, "max_voxel_x": 7700, + "max_voxel_y": 6500, "max_voxel_z": 5000, + "normalized_projection_volume": 0.0, + "projection_density": 0.116754, "projection_energy": 30.7332, + "projection_intensity": 263.231, "projection_volume": 0.0018718, + "section_data_set_id": 166218353, "structure_id": 1, + "sum_pixel_intensity": 99234900.0, "sum_pixels": 1308740.0, + "sum_projection_pixel_intensity": 40221700.0, + "sum_projection_pixels": 152800.0, + "volume": 0.016032}, + {"hemisphere_id": 2, "id": 169991601, "is_injection": False, + "max_voxel_density": 0.0614783, "max_voxel_x": 7500, + "max_voxel_y": 4900, "max_voxel_z": 1700, + "normalized_projection_volume": 0.0, + "projection_density": 0.0168009, + "projection_energy": 1.96084, "projection_intensity": 116.71, + "projection_volume": 0.00148144, + "section_data_set_id": 166218353, "structure_id": 60, + "sum_pixel_intensity": 261941000.0, "sum_pixels": 7198050.0, + "sum_projection_pixel_intensity": 14114200.0, + "sum_projection_pixels": 120934.0, "volume": 0.0881761}] + + +@pytest.fixture(scope='function') +def top_injection_unionizes(): + return pd.DataFrame([{'experiment_id': 1, 'is_injection': True, 'hemisphere_id': 1, 'structure_id': 10, 'normalized_projection_volume': 0.75}, + {'experiment_id': 1, 'is_injection': True, 'hemisphere_id': 2, 'structure_id': 15, 'normalized_projection_volume': 0.25}, + {'experiment_id': 1, 'is_injection': False, 'hemisphere_id': 1, 'structure_id': 10, 'normalized_projection_volume': 2.0}, + {'experiment_id': 1, 'is_injection': False, 'hemisphere_id': 2, 'structure_id': 11, 'normalized_projection_volume': 0.001}]) + + +def test_init(mcc): + assert( os.path.exists(mcc.manifest_path) ) + + +def test_get_annotation_volume(mcc): + + eye = np.eye(100) + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'annotation', 'ccf_2017', + 'annotation_25.nrrd') + + with mock.patch.object(mcc.api, "retrieve_file_over_http", + new=lambda a, b: nrrd.write(b, eye)): + obtained, _ = mcc.get_annotation_volume() + + with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: + mcc.get_annotation_volume() + + mock_rtrv.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_template_volume(mcc): + eye = np.eye(100) + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'average_template_25.nrrd') + + with mock.patch.object(mcc.api, "retrieve_file_over_http", + new=lambda a, b: nrrd.write(b, eye)): + obtained, _ = mcc.get_template_volume() + + with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: + mcc.get_template_volume() + + mock_rtrv.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_projection_density(mcc): + + eye = np.eye(100) + eid = 123456789 + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'experiment_{0}'.format(eid), + 'projection_density_25.nrrd') + + with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' + 'retrieve_file_over_http', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_projection_density(eid) + + with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: + mcc.get_projection_density(eid) + + mock_rtrv.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_injection_density(mcc): + + eye = np.eye(100) + eid = 123456789 + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'experiment_{0}'.format(eid), + 'injection_density_25.nrrd') + + with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' + 'retrieve_file_over_http', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_injection_density(eid) + + with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: + mcc.get_injection_density(eid) + + mock_rtrv.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_injection_fraction(mcc): + + eye = np.eye(100) + eid = 123456789 + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'experiment_{0}'.format(eid), + 'injection_fraction_25.nrrd') + + with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' + 'retrieve_file_over_http', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_injection_fraction(eid) + + with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: + mcc.get_injection_fraction(eid) + + mock_rtrv.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_data_mask(mcc): + + eye = np.eye(100) + eid = 123456789 + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'experiment_{0}'.format(eid), + 'data_mask_25.nrrd') + + with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' + 'retrieve_file_over_http', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_data_mask(eid) + + with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: + mcc.get_data_mask(eid) + + mock_rtrv.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_structure_tree(mcc, new_nodes): + + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'structures.json') + + with mock.patch('allensdk.api.queries.ontologies_api.' + 'OntologiesApi.model_query', + return_value=new_nodes) as p: + + obtained = mcc.get_structure_tree() + + mcc.get_structure_tree() + p.assert_called_once() + + assert( obtained.node_ids()[0] == 0 ) + + cm_obt = obtained.get_colormap() + assert(len(cm_obt[0]) == 3) + + assert( os.path.exists(path) ) + + +def test_get_experiments(mcc, experiments): + + file_path = os.path.join(os.path.dirname(mcc.manifest_path), 'experiments.json') + + def new_fn(*args, **kwargs): return experiments + + with mock.patch.object(mcc.api, "model_query", + new=new_fn): + obtained = mcc.get_experiments() + + with mock.patch.object(mcc.api, "model_query") as mock_squery: + mcc.get_experiments() + + mock_squery.assert_not_called() + assert os.path.exists(file_path) + assert 'storage_directory' not in obtained[0] + assert obtained[0]['transgenic_line'] == 'most_creish' + + obtained = mcc.get_experiments(cre=['MOST_CREISH']) + assert len(obtained) == 1 + + +def test_filter_experiments(mcc, experiments): + + pass_line = mcc.filter_experiments(experiments, cre=True) + fail_line = mcc.filter_experiments(experiments, cre=False) + + assert len(pass_line) == 1 + assert len(fail_line) == 1 + + def fake_tree(*a, **k): + class FakeTree(object): + def descendant_ids(*a, **k): + return [[97, 98], []] + return FakeTree() + + with mock.patch.object(mcc, 'get_structure_tree', new=fake_tree) as p: + sid_line = mcc.filter_experiments(experiments, cre=True, injection_structure_ids=[97, 98]) + + assert len(sid_line) == 1 + +def test_rank_structures(mcc, top_injection_unionizes): + + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'experiment_{0}'.format(1), + 'structure_unionizes.csv') + + with mock.patch.object(mcc.api, "model_query", + lambda *args, **kwargs: top_injection_unionizes): + obt = mcc.rank_structures([1], True, [15], [1, 2]) + + assert(len(obt) == 1) + exp = obt[0] + assert(len(exp) == 1) + st = exp[0] + assert(st['structure_id'] == 15) + assert(st['normalized_projection_volume'] == 0.25) + + +def test_default_structure_ids(mcc, new_nodes): + + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'structures.json') + + with mock.patch('allensdk.api.queries.ontologies_api.' + 'OntologiesApi.model_query', + return_value=new_nodes) as p: + + default_structure_ids = mcc.default_structure_ids + assert(len(default_structure_ids) == 1) + assert(default_structure_ids[0] == 0) + + +def test_get_experiment_structure_unionizes(mcc, unionizes): + + eid = 166218353 + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'experiment_{0}'.format(eid), + 'structure_unionizes.csv') + + with mock.patch.object(mcc.api, "model_query", + new=lambda *args, **kwargs: unionizes): + obtained = mcc.get_experiment_structure_unionizes(eid) + + with mock.patch.object(mcc.api, "model_query") as mock_query: + mcc.get_experiment_structure_unionizes(eid) + + mock_query.assert_not_called() + assert obtained.loc[0, 'projection_intensity'] == 263.231 + assert os.path.exists(path) + + +def test_get_experiment_structure_unionizes_cache_roundtrip(mcc, unionizes, + cached_csv): + + eid = 166218353 + + with mock.patch.object(mcc.api, "model_query", + new=lambda *args, **kwargs: unionizes): + obtained = mcc.get_experiment_structure_unionizes( + eid, file_name=cached_csv) + pandas_data = pd.read_csv(cached_csv, index_col=0, parse_dates=True) + + assert obtained.loc[0, 'projection_intensity'] == 263.231 + assert(sorted(obtained.keys()) == sorted(pandas_data.columns)) + + +def test_filter_structure_unionizes(mcc, unionizes): + + obtained = mcc.filter_structure_unionizes(pd.DataFrame(unionizes), + hemisphere_ids=[1]) + + assert obtained.loc[0, 'volume'] == 0.016032 + + obt_sid = mcc.filter_structure_unionizes(pd.DataFrame(unionizes), + hemisphere_ids=[1], + structure_ids=[1,60,90]) + + assert obtained.loc[0, 'volume'] == 0.016032 + +def test_get_structure_unionizes(mcc, unionizes): + + with mock.patch.object(mcc, "get_experiment_structure_unionizes", + new=lambda *a, **k: pd.DataFrame(unionizes)): + obtained = mcc.get_structure_unionizes([1, 2, 3]) + + assert obtained.shape[0] == 6 + + +def test_get_projection_matrix(mcc): + # yup + + unionizes = [{'experiment_id': 1, + 'structure_id': 2, + 'hemisphere_id': 1, + 'value': 30}, + {'experiment_id': 1, + 'structure_id': 2, + 'hemisphere_id': 2, + 'value': 40},] + + with mock.patch.object(mcc, "get_structure_unionizes", + new=lambda *a, **k: pd.DataFrame(unionizes)): + class FakeTree(object): + def value_map(*a, **k): + return {1: 'one', 2: 'two'} + with mock.patch.object(mcc, "get_structure_tree", + new=lambda *a, **k: FakeTree()): + obtained = mcc.get_projection_matrix([1], [2], [1, 2], ['value']) + + assert np.allclose(obtained['matrix'], np.array([[30, 40]])) + assert np.array_equal([ii['label'] for ii in obtained['columns']], + ['two-L', 'two-R']) + + +def test_get_reference_space(mcc, new_nodes): + + tree = StructureTree(StructureTree.clean_structures(new_nodes)) + with mock.patch.object(mcc, "get_structure_tree", + new=lambda *a, **k: tree): + annot = np.arange(125).reshape((5, 5, 5)) + with mock.patch.object(mcc, "get_annotation_volume", + new=lambda *a, **k: (annot, 'foo')): + rsp_obt = mcc.get_reference_space() + + assert( np.allclose(rsp_obt.resolution, [25, 25, 25]) ) + assert( np.allclose( rsp_obt.annotation, annot ) ) + + +def test_get_structure_mask(mcc): + + sid = 12 + + eye = np.eye(100) + path = os.path.join(os.path.dirname(mcc.manifest_path), + 'annotation', 'ccf_2017', 'structure_masks', + 'resolution_25', 'structure_{0}.nrrd'.format(sid)) + + with mock.patch.object(mcc.api, "retrieve_file_over_http", + new=lambda a, b: nrrd.write(b, eye)): + obtained, _ = mcc.get_structure_mask(sid) + + with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: + mcc.get_structure_mask(sid) + + mock_rtrv.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +@pytest.mark.parametrize('inp,fails', [(1, False), + (pd.Series([2]), False), + ('qwerty', True)]) +def test_validate_structure_id(inp, fails): + + if fails: + with pytest.raises(ValueError) as exc: + MouseConnectivityCache.validate_structure_id(inp) + else: + out = MouseConnectivityCache.validate_structure_id(inp) + assert( out == int(inp) ) + + +@pytest.mark.parametrize('inp,fails', [([1, 2, 3], False), + ([pd.Series([2]), pd.Series([3])], False), + (['qwerty', 1], True)]) +def test_validate_structure_ids(inp, fails): + + if fails: + with pytest.raises(ValueError) as exc: + MouseConnectivityCache.validate_structure_ids(inp) + else: + out = MouseConnectivityCache.validate_structure_ids(inp) + assert( out == [ int(i) for i in inp ] ) + + +def test_get_deformation_field(mcc): + + arr = np.random.rand(2, 4, 5, 3) + + def write_dfmfld(*a, **k): + img = sitk.GetImageFromArray(arr) + sitk.WriteImage(img, str(k['header_path']), True) # TODO the str call here is only necessary in 2.7 + + with mock.patch.object(mcc.api, 'download_deformation_field', new=write_dfmfld) as p: + obtained = mcc.get_deformation_field(123) + + assert np.allclose(arr, obtained) + + +def test_get_affine_parameters(mcc): + + def new_fn(*args, **kwargs): + return [{'alignment3d': { + 'trv_00': 1, + 'trv_01': 2, + 'trv_02': 3, + 'trv_03': 4, + 'trv_04': 5, + 'trv_05': 6, + 'trv_06': 7, + 'trv_07': 8, + 'trv_08': 9, + 'trv_09': 10, + 'trv_10': 11, + 'trv_11': 12, + }}] + + expected = np.array([ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], + [10, 11, 12] + ]) + + with mock.patch.object(mcc.api, "model_query", new=new_fn): + obtained = mcc.get_affine_parameters(1245) + + assert np.allclose(expected, obtained) \ No newline at end of file diff --git a/test/core/test_mouse_connectivity_notebook.py b/test/core/test_mouse_connectivity_notebook.py new file mode 100644 index 0000000000..a30dc05564 --- /dev/null +++ b/test/core/test_mouse_connectivity_notebook.py @@ -0,0 +1,307 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest + +import os + + +@pytest.mark.nightly +def test_notebook(tmpdir_factory): + + # coding: utf-8 + + # ## Mouse Connectivity + # + # This notebook demonstrates how to access and manipulate data in the Allen Mouse Brain Connectivity Atlas. The `MouseConnectivityCache` AllenSDK class provides methods for downloading metadata about experiments, including their viral injection site and the mouse's transgenic line. You can request information either as a Pandas DataFrame or a simple list of dictionaries. + # + # An important feature of the `MouseConnectivityCache` is how it stores and retrieves data for you. By default, it will create (or read) a manifest file that keeps track of where various connectivity atlas data are stored. If you request something that has not already been downloaded, it will download it and store it in a well known location. + # + # Download this notebook in .ipynb format <a href='mouse_connectivity.ipynb'>here</a>. + + # In[1]: + + from allensdk.core.mouse_connectivity_cache import MouseConnectivityCache + + # The manifest file is a simple JSON file that keeps track of all of + # the data that has already been downloaded onto the hard drives. + # If you supply a relative path, it is assumed to be relative to your + # current working directory. + manifest_file = tmpdir_factory.mktemp('mcc').join('manifest.json') + mcc = MouseConnectivityCache(manifest_file=str(manifest_file)) + + # open up a list of all of the experiments + all_experiments = mcc.get_experiments(dataframe=True) + print("%d total experiments" % len(all_experiments)) + + # take a look at what we know about an experiment with a primary motor injection + all_experiments.loc[122642490] + + + # `MouseConnectivityCache` has a method for retrieving the adult mouse structure tree as an `StructureTree` class instance. This is a wrapper around a list of dictionaries, where each dictionary describes a structure. It is principally useful for looking up structures by their properties. + + # In[2]: + + # pandas for nice tables + import pandas as pd + + # grab the StructureTree instance + structure_tree = mcc.get_structure_tree() + + # get info on some structures + structures = structure_tree.get_structures_by_name(['Primary visual area', 'Hypothalamus']) + pd.DataFrame(structures) + + + # As a convenience, structures are grouped in to named collections called "structure sets". These sets can be used to quickly gather a useful subset of structures from the tree. The criteria used to define structure sets are eclectic; a structure set might list: + # + # * structures that were used in a particular project. + # * structures that coarsely partition the brain. + # * structures that bear functional similarity. + # + # or something else entirely. To view all of the available structure sets along with their descriptions, follow this [link](http://api.brain-map.org/api/v2/data/StructureSet/query.json). To see only structure sets relevant to the adult mouse brain, use the StructureTree: + + # In[3]: + + from allensdk.api.queries.ontologies_api import OntologiesApi + + oapi = OntologiesApi() + + # get the ids of all the structure sets in the tree + structure_set_ids = structure_tree.get_structure_sets() + + # query the API for information on those structure sets + pd.DataFrame(oapi.get_structure_sets(structure_set_ids)) + + + # On the connectivity atlas web site, you'll see that we show most of our data at a fairly coarse structure level. We did this by creating a structure set of ~300 structures, which we call the "summary structures". We can use the structure tree to get all of the structures in this set: + + # In[4]: + + # From the above table, "Mouse Connectivity - Summary" has id 167587189 + summary_structures = structure_tree.get_structures_by_set_id([167587189]) + pd.DataFrame(summary_structures) + + + # This is how you can filter experiments by transgenic line: + + # In[5]: + + # fetch the experiments that have injections in the isocortex of cre-positive mice + isocortex = structure_tree.get_structures_by_name(['Isocortex'])[0] + cre_cortical_experiments = mcc.get_experiments(cre=True, + injection_structure_ids=[isocortex['id']]) + + print("%d cre cortical experiments" % len(cre_cortical_experiments)) + + # same as before, but restrict the cre line + rbp4_cortical_experiments = mcc.get_experiments(cre=[ 'Rbp4-Cre_KL100' ], + injection_structure_ids=[isocortex['id']]) + + + print("%d Rbp4 cortical experiments" % len(rbp4_cortical_experiments)) + + + # ## Structure Signal Unionization + # + # The ProjectionStructureUnionizes API data tells you how much signal there was in a given structure and experiment. It contains the density of projecting signal, volume of projecting signal, and other information. `MouseConnectivityCache` provides methods for querying and storing this data. + + # In[6]: + + # find wild-type injections into primary visual area + visp = structure_tree.get_structures_by_acronym(['VISp'])[0] + visp_experiments = mcc.get_experiments(cre=False, + injection_structure_ids=[visp['id']]) + + print("%d VISp experiments" % len(visp_experiments)) + + structure_unionizes = mcc.get_structure_unionizes([ e['id'] for e in visp_experiments ], + is_injection=False, + structure_ids=[isocortex['id']], + include_descendants=True) + + print("%d VISp non-injection, cortical structure unionizes" % len(structure_unionizes)) + + + # In[7]: + + structure_unionizes.head() + + + # This is a rather large table, even for a relatively small number of experiments. You can filter it down to a smaller list of structures like this. + + # In[8]: + + dense_unionizes = structure_unionizes[ structure_unionizes.projection_density > .5 ] + large_unionizes = dense_unionizes[ dense_unionizes.volume > .5 ] + large_structures = pd.DataFrame(structure_tree.nodes(large_unionizes.structure_id)) + + print("%d large, dense, cortical, non-injection unionizes, %d structures" % ( len(large_unionizes), len(large_structures) )) + + print(large_structures.name) + + large_unionizes + + + # ## Generating a Projection Matrix + # The `MouseConnectivityCache` class provides a helper method for converting ProjectionStructureUnionize records for a set of experiments and structures into a matrix. This code snippet demonstrates how to make a matrix of projection density values in auditory sub-structures for cre-negative VISp experiments. + + # In[9]: + + import numpy as np + import matplotlib.pyplot as plt + import warnings + warnings.filterwarnings('ignore') + + visp_experiment_ids = [ e['id'] for e in visp_experiments ] + ctx_children = structure_tree.child_ids( [isocortex['id']] )[0] + + pm = mcc.get_projection_matrix(experiment_ids = visp_experiment_ids, + projection_structure_ids = ctx_children, + hemisphere_ids= [2], # right hemisphere, ipsilateral + parameter = 'projection_density') + + row_labels = pm['rows'] # these are just experiment ids + column_labels = [ c['label'] for c in pm['columns'] ] + matrix = pm['matrix'] + + fig, ax = plt.subplots(figsize=(15,15)) + heatmap = ax.pcolor(matrix, cmap=plt.cm.afmhot) + + # put the major ticks at the middle of each cell + ax.set_xticks(np.arange(matrix.shape[1])+0.5, minor=False) + ax.set_yticks(np.arange(matrix.shape[0])+0.5, minor=False) + + ax.set_xlim([0, matrix.shape[1]]) + ax.set_ylim([0, matrix.shape[0]]) + + # want a more natural, table-like display + ax.invert_yaxis() + ax.xaxis.tick_top() + + ax.set_xticklabels(column_labels, minor=False) + ax.set_yticklabels(row_labels, minor=False) + + # ## Manipulating Grid Data + # + # The `MouseConnectivityCache` class also helps you download and open every experiment's projection grid data volume. By default it will download 25um volumes, but you could also download data at other resolutions if you prefer (10um, 50um, 100um). + # + # This demonstrates how you can load the projection density for a particular experiment. It also shows how to download the template volume to which all grid data is registered. Voxels in that template have been structurally annotated by neuroanatomists and the resulting labels stored in a separate annotation volume image. + + # In[10]: + + # we'll take this experiment - an injection into the primary somatosensory - as an example + experiment_id = 181599674 + + + # In[11]: + + # projection density: number of projecting pixels / voxel volume + pd, pd_info = mcc.get_projection_density(experiment_id) + + # injection density: number of projecting pixels in injection site / voxel volume + ind, ind_info = mcc.get_injection_density(experiment_id) + + # injection fraction: number of pixels in injection site / voxel volume + inf, inf_info = mcc.get_injection_fraction(experiment_id) + + # data mask: + # binary mask indicating which voxels contain valid data + dm, dm_info = mcc.get_data_mask(experiment_id) + + template, template_info = mcc.get_template_volume() + annot, annot_info = mcc.get_annotation_volume() + + # in addition to the annotation volume, you can get binary masks for individual structures + # in this case, we'll get one for the isocortex + cortex_mask, cm_info = mcc.get_structure_mask(315) + + print(pd_info) + print(pd.shape, template.shape, annot.shape) + + + # Once you have these loaded, you can use matplotlib see what they look like. + + # In[12]: + + # compute the maximum intensity projection (along the anterior-posterior axis) of the projection data + pd_mip = pd.max(axis=0) + ind_mip = ind.max(axis=0) + inf_mip = inf.max(axis=0) + + # show that slice of all volumes side-by-side + f, pr_axes = plt.subplots(1, 3, figsize=(15, 6)) + + pr_axes[0].imshow(pd_mip, cmap='hot', aspect='equal') + pr_axes[0].set_title("projection density MaxIP") + + pr_axes[1].imshow(ind_mip, cmap='hot', aspect='equal') + pr_axes[1].set_title("injection density MaxIP") + + pr_axes[2].imshow(inf_mip, cmap='hot', aspect='equal') + pr_axes[2].set_title("injection fraction MaxIP") + + + # In[13]: + + # Look at a slice from the average template and annotation volumes + + # pick a slice to show + slice_idx = 264 + + f, ccf_axes = plt.subplots(1, 3, figsize=(15, 6)) + + ccf_axes[0].imshow(template[slice_idx,:,:], cmap='gray', aspect='equal', vmin=template.min(), vmax=template.max()) + ccf_axes[0].set_title("registration template") + + ccf_axes[1].imshow(annot[slice_idx,:,:], cmap='gray', aspect='equal', vmin=0, vmax=2000) + ccf_axes[1].set_title("annotation volume") + + ccf_axes[2].imshow(cortex_mask[slice_idx,:,:], cmap='gray', aspect='equal', vmin=0, vmax=1) + ccf_axes[2].set_title("isocortex mask") + + + # On occasion the TissueCyte microscope fails to acquire a tile. In this case the data from that tile should not be used for analysis. The data mask associated with each experiment can be used to determine which portions of the grid data came from correctly acquired tiles. + # + # In this experiment, a missed tile can be seen in the data mask as a dark warped square. The values in the mask exist within [0, 1], describing the fraction of each voxel that was correctly acquired + + # In[14]: + + f, data_mask_axis = plt.subplots(figsize=(5, 6)) + + data_mask_axis.imshow(dm[81, :, :], cmap='hot', aspect='equal', vmin=0, vmax=1) + data_mask_axis.set_title('data mask') + + diff --git a/test/core/test_nwb_data_set.py b/test/core/test_nwb_data_set.py new file mode 100644 index 0000000000..2804ca1f29 --- /dev/null +++ b/test/core/test_nwb_data_set.py @@ -0,0 +1,233 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +from mock import patch, MagicMock +from pkg_resources import resource_filename # @UnresolvedImport +import numpy as np +from allensdk.core.nwb_data_set import NwbDataSet +import pytest +import os + +NWB_FLAVORS = [] + +if 'TEST_EPHYS_NWB_FILES' in os.environ: + nwb_list_file = os.environ['TEST_EPHYS_NWB_FILES'] +else: + nwb_list_file = resource_filename(__name__, 'nwb_ephys_files.txt') +with open(nwb_list_file, 'r') as f: + NWB_FLAVORS = [l.strip() for l in f] + + +@pytest.fixture(params=NWB_FLAVORS) +def data_set(request): + nwb_file = request.param + data_set = NwbDataSet(nwb_file) + return data_set + +@pytest.mark.nightly +def test_get_sweep_numbers(data_set): + sweep_numbers = data_set.get_sweep_numbers() + + assert len(sweep_numbers) > 0 + + +@pytest.mark.nightly +def test_get_experiment_sweep_numbers(data_set): + sweep_numbers = data_set.get_experiment_sweep_numbers() + + assert len(sweep_numbers) > 0 + + +@pytest.mark.nightly +def test_get_spike_times(data_set): + sweep_numbers = data_set.get_experiment_sweep_numbers() + + found_spikes = False + + for n in sweep_numbers: + spike_times = data_set.get_spike_times(n) + if len(spike_times > 0): + found_spikes = True + + assert found_spikes is True + +def mock_h5py_file(m=None, data=None): + if m is None: + m = MagicMock() + + f = MagicMock() + + if data is None: + f.__enter__.return_value = f + else: + f.__enter__.return_value = data + + m.return_value = f + + return m + + +@pytest.fixture +def mock_data_set(): + nwb_file = 'fixture.nwb' + data_set = NwbDataSet(nwb_file) + return data_set + + +def test_fill_sweep_responses_extend(mock_data_set): + data_set = mock_data_set + DATA_LENGTH = 5 + + class H5Scalar(object): + def __init__(self, i): + self.i = i + self.value = i + def __eq__(self, j): + return j == self.i + + h5 = { + 'epochs': { + 'Sweep_1': { + 'response': { + 'timeseries': { + 'data': np.ones(DATA_LENGTH) + } + } + }, + 'Experiment_1': { + 'stimulus': { + 'idx_start': H5Scalar(1), + 'count': H5Scalar(3), # truncation is here + 'timeseries': { + 'data': np.ones(DATA_LENGTH) + } + } + } + } + } + + with patch('h5py.File', mock_h5py_file(data=h5)): + data_set.fill_sweep_responses(0.0, [1], extend_experiment=True) + + assert h5['epochs']['Experiment_1']['stimulus']['count'] == 4 + assert h5['epochs']['Experiment_1']['stimulus']['idx_start'] == 1 + assert np.all(h5['epochs']['Sweep_1']['response']['timeseries']['data']== 0.0) + +def test_fill_sweep_responses(mock_data_set): + data_set = mock_data_set + DATA_LENGTH = 5 + + h5 = { + 'stimulus': { + 'presentation': { + 'Sweep_1': { + 'aibs_stimulus_amplitude_pa': 15.0, + 'aibs_stimulus_name': 'Joe', + 'gain': 1.0, + 'initial_access_resistance': 0.05, + 'seal': True + } + } + }, + 'epochs': { + 'Sweep_1': { + 'description': 'sweep 1 description', + 'stimulus': {}, + 'response': { + 'count': DATA_LENGTH, + 'idx_start': 0, + 'timeseries': { + 'data': np.ones(DATA_LENGTH) * 1.0 + } + } + } + } + } + + with patch('h5py.File', mock_h5py_file(data=h5)): + data_set.fill_sweep_responses(0.0, [1]) + + assert not np.any(h5['epochs']['Sweep_1']['response']['timeseries']['data']) + assert len(h5['epochs']['Sweep_1']['response']['timeseries']['data']) == \ + DATA_LENGTH + + +@pytest.mark.xfail +def test_set_spike_times(mock_data_set): + data_set = mock_data_set + DATA_LENGTH = 5 + + h5 = { + 'analysis': { + 'spike_times': { + 'Sweep_1': {} + } + }, + 'stimulus': { + 'presentation': { + 'Sweep_1': { + 'aibs_stimulus_amplitude_pa': 15.0, + 'aibs_stimulus_name': 'Joe', + 'gain': 1.0, + 'initial_access_resistance': 0.05, + 'seal': True + } + } + }, + 'epochs': { + 'Sweep_1': { + 'description': 'sweep 1 description', + 'stimulus': {}, + 'response': { + 'count': DATA_LENGTH, + 'idx_start': 0, + 'timeseries': { + 'data': np.ones(DATA_LENGTH) * 1.0 + } + } + } + } + } + + with patch('h5py.File', mock_h5py_file(data=h5)): + data_set.set_spike_times(1, [0.1, 0.2, 0.3, 0.4, 0.5]) + + assert False + +@pytest.mark.nightly +def test_get_sweep_metadata(data_set): + sweep_metadata = data_set.get_sweep_metadata(1) + + assert sweep_metadata is not None diff --git a/test/core/test_obj_utilities.py b/test/core/test_obj_utilities.py new file mode 100644 index 0000000000..31f239754f --- /dev/null +++ b/test/core/test_obj_utilities.py @@ -0,0 +1,94 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import numpy as np + +import pytest +from mock import MagicMock, mock_open, patch + +from allensdk.core.obj_utilities import read_obj, parse_obj + + +@pytest.fixture +def wavefront_obj(): + return ''' + +v 8578 5484.96 5227.57 +v 8509.2 5487.54 5237.07 +v 8564.38 5522.13 5220.41 +v 8631.93 5497.82 5228.33 +v 8517.88 5542.95 5234.53 +v 8615.26 5563.22 5224.48 + +# i'm a comment! + +vn -0.0247061 -0.352726 -0.935401 +vn -0.235489 -0.190095 -0.953105 +vn -0.0880336 -0.0323767 -0.995591 +vn 0.122706 -0.209891 -0.969994 +vn -0.343738 0.217978 -0.913416 +vn 0.0753706 0.16324 -0.983703 + +I should be a comment, but am not + +f 1//1 2//2 3//3 +f 4//4 1//1 3//3 +f 3//3 2//2 5//5 +f 6//6 3//3 5//5 + + ''' + + +def test_read_obj(wavefront_obj): + + path = 'path!' + + # need to patch the version in allensdk.api.cache because of import x from y syntax above + with patch( 'allensdk.core.obj_utilities.open', mock_open(read_data=wavefront_obj), create=True ) as p: + obt = read_obj(path) + p.assert_called_with(path, 'r') + assert( obt is not None ) + + +def test_parse_obj(wavefront_obj): + + lines = wavefront_obj.split('\n') + vertices, vertex_normals, face_vertices, face_normals = parse_obj(lines) + + assert(np.allclose( face_vertices, face_normals )) + assert(np.allclose( face_vertices[2, :], [2, 1, 4] )) + assert(np.allclose( vertices[1, :], [8509.2, 5487.54, 5237.07] )) + assert(np.allclose( vertex_normals[2, :], [-0.0880336, -0.0323767, -0.995591] )) diff --git a/test/core/test_reference_space.py b/test/core/test_reference_space.py new file mode 100644 index 0000000000..22667fb714 --- /dev/null +++ b/test/core/test_reference_space.py @@ -0,0 +1,232 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os + +import pytest +import mock +import numpy as np +import nrrd +import pandas as pd + +from allensdk.core.reference_space import ReferenceSpace +from allensdk.core.structure_tree import StructureTree + + +@pytest.fixture +def rsp(): + + tree = [{'id': 1, 'structure_id_path': [1]}, + {'id': 2, 'structure_id_path': [1, 2]}, + {'id': 3, 'structure_id_path': [1, 3]}, + {'id': 4, 'structure_id_path': [1, 2, 4]}, + {'id': 5, 'structure_id_path': [1, 2, 5]}, + {'id': 6, 'structure_id_path': [1, 2, 5, 6]}, + {'id': 7, 'structure_id_path': [1, 7]}] + + # leaves are 6, 4, 3 + # additionally annotate 2, 5 for realism :) + annotation = np.zeros((10, 10, 10)) + annotation[4:8, 4:8, 4:8] = 2 + annotation[5:7, 5:7, 5:7] = 5 + annotation[5:7, 5:7, 5] = 6 + annotation[7, 7, 7] = 4 + annotation[8:10, 8:10, 8:10] = 3 + + return ReferenceSpace(StructureTree(tree), annotation, [10, 10, 10]) + + +@pytest.fixture +def itksnap_rsp(): + tree = [ + {'id': 1, 'rgb_triplet': [1, 2, 3], 'acronym': 'b', 'structure_id_path': [1]}, + {'id': 5000, 'rgb_triplet': [4, 5, 6], 'acronym': 'a', 'structure_id_path': [1, 5000]}, + ] + + annotation = np.zeros((10, 10, 10)) + annotation[:, :, :5] = 1 + annotation[:, :, 7:] = 5000 + + return ReferenceSpace(StructureTree(tree), annotation, [10, 10, 10]) + + +def test_direct_voxel_counts(rsp): + obt_one = rsp.direct_voxel_map + obt_two = rsp.direct_voxel_map + + assert( obt_one[3] == 8 ) + assert( obt_one[2] == 4**3 - 2**3 - 1 ) + assert( obt_two[1] == 0 ) + assert( obt_two[2] == 4**3 - 2**3 - 1 ) + + +def test_total_voxel_counts(rsp): + + obt = rsp.total_voxel_map + + assert( obt[2] == 4**3 ) + assert( obt[6] == 4 ) + + +def test_remove_unassigned(rsp): + + rsp.remove_unassigned() + node_ids = rsp.structure_tree.node_ids() + + assert( 1 in node_ids ) + assert( 7 not in node_ids ) + + +def test_make_structure_mask(rsp): + + exp = np.zeros((10, 10, 10)) + exp[4:8, 4:8, 4:8] = 1 + exp[8:10, 8:10, 8:10] = 1 + obt = rsp.make_structure_mask([2, 3, 7]) + + assert( np.allclose(obt, exp) ) + + +def test_make_structure_mask_direct(rsp): + + exp = np.zeros((10, 10, 10)) + exp[5:7, 5:7, 6:7] = 1 + obt = rsp.make_structure_mask([5], True) + + assert( np.allclose(obt, exp) ) + + +def test_many_structure_masks(rsp): + + cb = mock.MagicMock() + + [ii for ii in rsp.many_structure_masks([2, 3], output_cb=cb)] + + assert( cb.call_count == 2 ) + + +def test_many_structure_masks_default_cb(rsp): + + rsp.make_structure_mask = mock.MagicMock(return_value=2) + for item in rsp.many_structure_masks([1]): + assert( np.allclose(item, [1, 2]) ) + + +def test_check_coverage(rsp): + + mask = np.zeros((10, 10, 10)) + mask[7:10, 7:10, 7:10] = 1 + + obt = rsp.check_coverage([3], mask) + assert( np.count_nonzero(obt) == 27 - 8 ) + + +def test_validate_structures(rsp): + + rsp.structure_tree.has_overlaps = mock.MagicMock() + rsp.check_coverage = mock.MagicMock() + + rsp.validate_structures(1, 2) + + rsp.structure_tree.has_overlaps.assert_called_with(1) + rsp.check_coverage.assert_called_with(1, 2) + + +def test_downsample(rsp): + + target = rsp.downsample((10, 20, 20)) + + assert( np.allclose(target.annotation.shape, [10, 5, 5]) ) + + +def test_get_slice_image(rsp): + + cmap = {0: [0, 0, 0], 1: [0, 0, 0], 2: [0, 0, 0], 3: [1, 2, 3], + 4: [0, 0, 0], 5: [0, 0, 0], 6: [0, 0, 0], 7: [0, 0, 0], } + + image = rsp.get_slice_image(0, 90, cmap=cmap) + + assert( image[:, :, 0].sum() == 4 ) + + +def test_direct_voxel_map_setter(rsp): + + rsp.direct_voxel_map = 4 + assert( rsp.direct_voxel_map == 4 ) + + +def test_total_voxel_map_setter(rsp): + + rsp.total_voxel_map = 3 + assert( rsp.total_voxel_map == 3 ) + + +def test_export_itksnap_labels(itksnap_rsp): + + annot, labels = itksnap_rsp.export_itksnap_labels(id_type=np.uint8) + + exp = np.zeros((10, 10, 10)) + exp[:, :, :5] = 2 + exp[:, :, 7:] = 1 + + assert set(np.unique(annot)) == set([0, 1, 2]) + assert np.array_equal(labels['LABEL'][:], ['a', 'b']) + assert set(labels['IDX'].values) == set([1, 2]) + assert np.allclose(exp, annot) + + +def test_write_itksnap_labels(itksnap_rsp, tmpdir_factory): + + tmpdir = str(tmpdir_factory.mktemp('test_write_itksnap_labels')) + annot_path = os.path.join(tmpdir, 'annot.nrrd') + labels_path = os.path.join(tmpdir, 'labels.csv') + + itksnap_rsp.write_itksnap_labels(annot_path, labels_path, id_type=np.uint8) + exp_annot, exp_labels = itksnap_rsp.export_itksnap_labels(id_type=np.uint8) + + obt_annot, _ = nrrd.read(annot_path) + assert np.allclose(obt_annot, exp_annot) + + obt_labels = pd.read_csv( + labels_path, + delim_whitespace=True, + names=['IDX', '-R-', '-G-', '-B-', '-A-', 'VIS', 'MSH', 'LABEL'], + index_col=False + ) + pd.testing.assert_frame_equal(obt_labels, exp_labels, check_index_type=False) + + assert os.path.exists(labels_path) + assert os.path.exists(annot_path) + diff --git a/test/core/test_reference_space_cache.py b/test/core/test_reference_space_cache.py new file mode 100644 index 0000000000..742c043126 --- /dev/null +++ b/test/core/test_reference_space_cache.py @@ -0,0 +1,222 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2016-2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os + +import pytest +import mock +import numpy as np +import nrrd +import pandas as pd + +from allensdk.core.reference_space_cache import ReferenceSpaceCache +from allensdk.core.structure_tree import StructureTree + + +@pytest.fixture() +def rsp_version(): + return 'annotation/look_a_version' + + +@pytest.fixture() +def resolution(): + return 25 + + +@pytest.fixture(scope='function') +def old_nodes(): + + return [{'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'parent_structure_id': 12}] + + +@pytest.fixture(scope='function') +def new_nodes(): + + return [{'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'structure_sets':[{'id': 1}, {'id': 4}, {'id': 167587189}] }] + + +@pytest.fixture(scope='function') +def rsp(fn_temp_dir, rsp_version, resolution): + + manifest_path = os.path.join(fn_temp_dir, 'manifest.json') + return ReferenceSpaceCache(reference_space_key=rsp_version, + resolution=resolution, + manifest=manifest_path) + + + +def test_init(rsp, fn_temp_dir): + + manifest_path = os.path.join(fn_temp_dir, 'manifest.json') + assert( os.path.exists(manifest_path) ) + + +def test_get_annotation_volume(rsp, fn_temp_dir, rsp_version, resolution): + + eye = np.eye(100) + path = os.path.join(fn_temp_dir, rsp_version, 'annotation_{0}.nrrd'.format(resolution)) + + rsp.api.retrieve_file_over_http = lambda a, b: nrrd.write(b, eye) + obtained, _ = rsp.get_annotation_volume() + + rsp.api.retrieve_file_over_http = mock.MagicMock() + rsp.get_annotation_volume() + + rsp.api.retrieve_file_over_http.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_template_volume(rsp, fn_temp_dir, resolution): + + eye = np.eye(100) + path = os.path.join(fn_temp_dir, 'average_template_{0}.nrrd'.format(resolution)) + + rsp.api.retrieve_file_over_http = lambda a, b: nrrd.write(b, eye) + obtained, _ = rsp.get_template_volume() + + rsp.api.retrieve_file_over_http = mock.MagicMock() + rsp.get_template_volume() + + rsp.api.retrieve_file_over_http.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_structure_tree(rsp, fn_temp_dir, new_nodes): + + path = os.path.join(fn_temp_dir, 'structures.json') + + with mock.patch('allensdk.api.queries.ontologies_api.' + 'OntologiesApi.model_query', + return_value=new_nodes) as p: + + obtained = rsp.get_structure_tree() + + rsp.get_structure_tree() + p.assert_called_once() + + assert(obtained.node_ids()[0] == 0) + + cm_obt = obtained.get_colormap() + assert(len(cm_obt[0]) == 3) + + assert( os.path.exists(path) ) + + +def test_get_reference_space(rsp, new_nodes): + + tree = StructureTree(StructureTree.clean_structures(new_nodes)) + rsp.get_structure_tree = lambda *a, **k: tree + + annot = np.arange(125).reshape((5, 5, 5)) + rsp.get_annotation_volume = lambda *a, **k: (annot, 'foo') + + rsp_obt = rsp.get_reference_space() + + assert( np.allclose(rsp_obt.resolution, [25, 25, 25]) ) + assert( np.allclose( rsp_obt.annotation, annot ) ) + + +def test_get_structure_mask(rsp, fn_temp_dir, rsp_version): + + sid = 12 + + eye = np.eye(100) + path = os.path.join(fn_temp_dir, rsp_version, 'structure_masks', + 'resolution_25', 'structure_{0}.nrrd'.format(sid)) + + rsp.api.retrieve_file_over_http = lambda a, b: nrrd.write(b, eye) + obtained, _ = rsp.get_structure_mask(sid) + + rsp.api.retrieve_file_over_http = mock.MagicMock() + rsp.get_structure_mask(sid) + + rsp.api.retrieve_file_over_http.assert_not_called() + assert( np.allclose(obtained, eye) ) + assert( os.path.exists(path) ) + + +def test_get_structure_mesh(rsp, fn_temp_dir, rsp_version): + + sid = 12 + + path = os.path.join(fn_temp_dir, rsp_version, 'structure_meshes','structure_{0}.obj'.format(sid)) + + def write_obj(path): + with open(path, 'w') as fil: + fil.write('vn 1 2 4') + + expected = [1, 2, 4] + + rsp.api.retrieve_file_over_http = lambda a, b: write_obj(b) + obtained = rsp.get_structure_mesh(sid) + + rsp.api.retrieve_file_over_http = mock.MagicMock() + rsp.get_structure_mesh(sid) + + rsp.api.retrieve_file_over_http.assert_not_called() + assert( np.allclose(obtained[1], expected) ) + assert( os.path.exists(path) ) + + +@pytest.mark.parametrize('inp,fails', [(1, False), + (pd.Series([2]), False), + ('qwerty', True)]) +def test_validate_structure_id(inp, fails): + + if fails: + with pytest.raises(ValueError) as exc: + ReferenceSpaceCache.validate_structure_id(inp) + else: + out = ReferenceSpaceCache.validate_structure_id(inp) + assert( out == int(inp) ) + + +@pytest.mark.parametrize('inp,fails', [([1, 2, 3], False), + ([pd.Series([2]), pd.Series([3])], False), + (['qwerty', 1], True)]) +def test_validate_structure_ids(inp, fails): + + if fails: + with pytest.raises(ValueError) as exc: + ReferenceSpaceCache.validate_structure_ids(inp) + else: + out = ReferenceSpaceCache.validate_structure_ids(inp) + assert( out == list(map(int, inp)) ) diff --git a/test/core/test_reference_space_notebook.py b/test/core/test_reference_space_notebook.py new file mode 100644 index 0000000000..37e1ccc7ea --- /dev/null +++ b/test/core/test_reference_space_notebook.py @@ -0,0 +1,264 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest + +import os + + +@pytest.mark.nightly +def test_notebook(tmpdir_factory): + + # coding: utf-8 + + # # Reference Space + # + # This notebook contains example code demonstrating the use of the StructureTree and ReferenceSpace classes. These classes provide methods for interacting with the 3d spaces to which Allen Institute data and atlases are registered. + # + # Unlike the AllenSDK cache classes, StructureTree and ReferenceSpace operate entirely in memory. We recommend using json files to store text and nrrd files to store volumetric images. + # + # The MouseConnectivityCache class has methods for downloading, storing, and constructing StructureTrees and ReferenceSpaces. Please see [here](https://alleninstitute.github.io/AllenSDK/_static/examples/nb/mouse_connectivity.html) for examples. + + # ## Constructing a StructureTree + # + # A StructureTree object is a wrapper around a structure graph - a list of dictionaries documenting brain structures and their containment relationships. To build a structure tree, you will first need to obtain a structure graph. + # + # For a list of atlases and corresponding structure graph ids, see [here](http://help.brain-map.org/display/api/Atlas+Drawings+and+Ontologies). + + # In[1]: + + from allensdk.api.queries.ontologies_api import OntologiesApi + from allensdk.core.structure_tree import StructureTree + + oapi = OntologiesApi() + structure_graph = oapi.get_structures_with_sets([1]) # 1 is the id of the adult mouse structure graph + + # This removes some unused fields returned by the query + structure_graph = StructureTree.clean_structures(structure_graph) + + tree = StructureTree(structure_graph) + + + # In[2]: + + # now let's take a look at a structure + tree.get_structures_by_name(['Dorsal auditory area']) + + + # The fields are: + # * acronym: a shortened name for the structure + # * rgb_triplet: each structure is assigned a consistent color for visualizations + # * graph_id: the structure graph to which this structure belongs + # * graph_order: each structure is assigned a consistent position in the flattened graph + # * id: a unique integer identifier + # * name: the full name of the structure + # * structure_id_path: traces a path from the root node of the tree to this structure + # * structure_set_ids: the structure belongs to these predefined groups + + # ## Using a StructureTree + + # In[3]: + + # get a structure's parent + tree.parent([1011]) + + + # In[4]: + + # get a dictionary mapping structure ids to names + + name_map = tree.get_name_map() + name_map[247] + + + # In[5]: + + # ask whether one structure is contained within another + + strida = 385 + stridb = 247 + + is_desc = '' if tree.structure_descends_from(385, 247) else ' not' + + print( '{0} is{1} in {2}'.format(name_map[strida], is_desc, name_map[stridb]) ) + + + # In[6]: + + # build a custom map that looks up acronyms by ids + # the syntax here is just a pair of node-wise functions. + # The first one returns keys while the second one returns values + + acronym_map = tree.value_map(lambda x: x['id'], lambda y: y['acronym']) + print( acronym_map[385] ) + + + # ## Downloading an annotation volume + # + # This code snippet will download and store a nrrd file containing the Allen Common Coordinate Framework annotation. We have requested an annotation with 25-micron isometric spacing. The orientation of this space is: + # * Anterior -> Posterior + # * Superior -> Inferior + # * Left -> Right + # This is the no-frills way to download an annotation volume. See the <a href='_static/examples/nb/mouse_connectivity.html#Manipulating-Grid-Data'>mouse connectivity</a> examples if you want to properly cache the downloaded data. + + # In[7]: + + import os + import nrrd + from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi + from allensdk.config.manifest import Manifest + + # the annotation download writes a file, so we will need somwhere to put it + annotation_dir = str(tmpdir_factory.mktemp('annotation')) + + annotation_path = os.path.join(annotation_dir, 'annotation.nrrd') + + mcapi = MouseConnectivityApi() + mcapi.download_annotation_volume('annotation/ccf_2016', 25, annotation_path) + + annotation, meta = nrrd.read(annotation_path) + + + # ## Constructing a ReferenceSpace + + # In[8]: + + from allensdk.core.reference_space import ReferenceSpace + + # build a reference space from a StructureTree and annotation volume, the third argument is + # the resolution of the space in microns + rsp = ReferenceSpace(tree, annotation, [25, 25, 25]) + + + # ## Using a ReferenceSpace + + # #### making structure masks + # + # The simplest use of a Reference space is to build binary indicator masks for structures or groups of structures. + + # In[9]: + + # A complete mask for one structure + whole_cortex_mask = rsp.make_structure_mask([315]) + + # view in coronal section + + + # What if you want a mask for a whole collection of ontologically disparate structures? Just pass more structure ids to make_structure_masks: + + # In[10]: + + # This gets all of the structures targeted by the Allen Brain Observatory project + brain_observatory_structures = rsp.structure_tree.get_structures_by_set_id([514166994]) + brain_observatory_ids = [st['id'] for st in brain_observatory_structures] + + brain_observatory_mask = rsp.make_structure_mask(brain_observatory_ids) + + # view in horizontal section + + # You can also make and store a number of structure_masks at once: + + # In[11]: + + import functools + + # Define a wrapper function that will control the mask generation. + # This one checks for a nrrd file in the specified base directory + # and builds/writes the mask only if one does not exist + mask_writer = functools.partial(ReferenceSpace.check_and_write, annotation_dir) + + # many_structure_masks is a generator - nothing has actrually been run yet + mask_generator = rsp.many_structure_masks([385, 1097], mask_writer) + + # consume the resulting iterator to make and write the masks + for structure_id in mask_generator: + print( 'made mask for structure {0}.'.format(structure_id) ) + + os.listdir(annotation_dir) + + + # #### Removing unassigned structures + + # A structure graph may contain structures that are not used in a particular reference space. Having these around can complicate use of the reference space, so we generally want to remove them. + # + # We'll try this using "Somatosensory areas, layer 6a" as a test case. In the 2016 ccf space, this structure is unused in favor of finer distinctions (e.g. "Primary somatosensory area, barrel field, layer 6a"). + + # In[12]: + + # Double-check the voxel counts + no_voxel_id = rsp.structure_tree.get_structures_by_name(['Somatosensory areas, layer 6a'])[0]['id'] + print( 'voxel count for structure {0}: {1}'.format(no_voxel_id, rsp.total_voxel_map[no_voxel_id]) ) + + # remove unassigned structures from the ReferenceSpace's StructureTree + rsp.remove_unassigned() + + # check the structure tree + no_voxel_id in rsp.structure_tree.node_ids() + + + # #### View a slice from the annotation + + # In[13]: + + import numpy as np + + + # #### Downsample the space + # + # If you want an annotation at a resolution we don't provide, you can make one with the downsample method. + + # In[14]: + + import warnings + + target_resolution = [75, 75, 75] + + # in some versions of scipy, scipy.ndimage.zoom raises a helpful but distracting + # warning about the method used to truncate integers. + warnings.simplefilter('ignore') + + sf_rsp = rsp.downsample(target_resolution) + + # re-enable warnings + warnings.simplefilter('default') + + print( rsp.annotation.shape ) + print( sf_rsp.annotation.shape ) + + + # Now view the downsampled space: + + # In[15]: + diff --git a/test/core/test_simple_tree.py b/test/core/test_simple_tree.py new file mode 100644 index 0000000000..1bc9f56ceb --- /dev/null +++ b/test/core/test_simple_tree.py @@ -0,0 +1,194 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import mock +from numpy import allclose + +from allensdk.core.simple_tree import SimpleTree + + +@pytest.fixture +def tree(): + + s = frozenset([1, 2, 3]) + + nodes = [{'id': 0, 'parent': None, 1: 2, s: 'a'}, {'id': 1, 'parent': 0, 1: 7, s: 'd'}, + {'id': 2, 'parent': 0, 1: 3, s: 'b'}, {'id': 3, 'parent': 1, 1: 6, s: 'e'}, + {'id': 4, 'parent': 1, 1: 4, s: 'c'}, {'id': 5, 'parent': 2, 1: 5, s: 'f'}] + + parent_fn = lambda node: node['parent'] + id_fn = lambda node: node['id'] + + return SimpleTree(nodes, id_fn, parent_fn) + + +def test_initialization(tree): + + assert( None in tree._parent_ids.values() ) + assert( len(tree._child_ids) == 6 ) + + +def test_filter_nodes(tree): + + two_par = tree.filter_nodes(lambda node: node['parent'] == 2) + assert( two_par[0]['id'] == 5 ) + assert( len(two_par) == 1 ) + + +@pytest.mark.parametrize('key,val,to,exp', [ ['id', [2, 1, 3], lambda x: x['id'],[2, 1, 3]], + [lambda x: x['id'], [2, 1, 3], lambda x: x['id'],[2, 1, 3]], + [1, [3, 7, 6], lambda x: x['id'],[2, 1, 3]], + [frozenset([1, 2, 3]), ['b'], lambda x: x[1], [3]] ]) +def test_nodes_by_property(tree, key, val, to, exp): + + obt = tree.nodes_by_property( key, val, to_fn=to ) + assert( allclose( obt, exp) ) + + +def test_value_map(tree): + + parent_map = tree.value_map(lambda node: node['id'], + lambda node: node['parent']) + + assert( len(parent_map) == 6 ) + assert( parent_map[2] == 0 ) + assert( parent_map[3] == 1 ) + + +def test_value_map_nonunique(tree): + + with pytest.raises( RuntimeError ): + parent_map = tree.value_map(lambda node: node['parent'], + lambda node: node['id']) + + +def test_node_ids(tree): + + obtained = tree.node_ids() + expected = range(6) + + assert( set(obtained) == set(expected) ) + + +def test_parent_ids(tree): + + nodes = [5, 4, 2] + obtained = tree.parent_ids(nodes) + + assert( allclose([2, 1, 0], obtained) ) + + +def test_child_ids(tree): + + obtained = tree.child_ids([1]) + assert( set(obtained[0]) == set([4, 3]) ) + assert( len(obtained) == 1 ) + + +def test_ancestor_ids(tree): + + obtained = tree.ancestor_ids([5, 1]) + + assert( len(obtained) == 2 ) + assert( set(obtained[0]) == set([5, 2, 0]) ) + assert( set(obtained[1]) == set([1, 0]) ) + + +def test_descendant_ids(tree): + + obtained = tree.descendant_ids([0, 3]) + + assert( len(obtained) == 2 ) + assert( set(obtained[0]) == set(range(6)) ) + assert( set(obtained[1]) == set([3]) ) + + +def test_nodes(tree): + + obtained = tree.nodes([0, 1]) + + assert( len(obtained) == 2 ) + assert( obtained[0]['parent'] is None ) + assert( obtained[1]['id'] == 1 ) + + +def test_nodes_default(tree): + + obtained = tree.nodes() + assert( len(obtained) == 6 ) + + +def test_parents(tree): + + obtained = tree.parents([0, 1]) + assert( len(obtained) == 2 ) + assert( obtained[0] is None ) + +def test_children(tree): + + obtained = tree.children([0, 5]) + + assert( len(obtained) == 2 ) + assert( set(obtained[1]) == set([]) ) + assert( len(obtained[0]) == 2 ) + assert( isinstance(obtained[0][0], dict) ) + +def test_descendants(tree): + + obtained = tree.descendants([0, 3]) + + assert( len(obtained) == 2 ) + assert( len(obtained[0]) == 6 ) + assert( obtained[1][0]['id'] == 3 ) + assert( isinstance(obtained[0][0], dict) ) + + +def test_ancestors(tree): + + obtained = tree.ancestors([5, 1]) + + assert( len(obtained) == 2 ) + assert( len(obtained[0]) == 3 ) + assert( isinstance(obtained[0][0], dict) ) + assert( len(obtained[1]) == 2 ) + + +def test_cbs(tree): + + nodes = tree.nodes() + for node in nodes: + assert( node['id'] == tree.node_id_cb(node) ) + assert( node['parent'] == tree.parent_id_cb(node) ) diff --git a/test/core/test_sitk_utilities.py b/test/core/test_sitk_utilities.py new file mode 100644 index 0000000000..4c8a839b34 --- /dev/null +++ b/test/core/test_sitk_utilities.py @@ -0,0 +1,182 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2015-2018. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import pytest +import numpy as np +import SimpleITK as sitk +import nrrd + +from allensdk.core import sitk_utilities as su + + + +@pytest.fixture(params=[1, 2, 3, 4]) +def ncomponents(request): + return request.param + + +@pytest.fixture(params=[ [10, 20], [10, 20, 30], [10, 20, 30], [10, 10, 10], [20, 20] ]) +def size(request): + return request.param + + +@pytest.fixture(params=[ lambda x: list(range(x+1))[1:], lambda x: [10] * x ]) +def spacing(request): + return request.param + + +@pytest.fixture(params=[ lambda x: list(range(x+1))[1:], lambda x: [5] * x ]) +def origin(request): + return request.param + + +@pytest.fixture(params=[ lambda x: np.eye(x).flatten() ]) +def direction(request): + return request.param + + +@pytest.fixture(scope='function') +def image(size, ncomponents, spacing, origin, direction): + + if ncomponents > 1: + img = sitk.Image(size, sitk.sitkVectorUInt8, ncomponents) + else: + img = sitk.Image(size, sitk.sitkUInt8, ncomponents) + + ndim = len(size) + + spacing_val = spacing(ndim) + img.SetSpacing(spacing_val) + + origin_val = origin(ndim) + img.SetOrigin(origin_val) + + dir_val = direction(ndim) + img.SetDirection(dir_val) + + return img, {'ncomponents': ncomponents, + 'size': size, + 'spacing': spacing_val, + 'origin': origin_val, + 'direction': dir_val} + + +def test_get_sitk_image_information(image): + + obtained = su.get_sitk_image_information(image[0]) + for key, value in image[1].items(): + assert(np.allclose( obtained[key], value )) + + +def test_set_sitk_image_information_roundtrip(image): + + info = su.get_sitk_image_information(image[0]) + arr = sitk.GetArrayFromImage(image[0]) + + new_image = sitk.GetImageFromArray(arr, info['ncomponents'] > 1) + su.set_sitk_image_information(new_image, info) + + obtained = su.get_sitk_image_information(new_image) + for key, value in info.items(): + assert(np.allclose( obtained[key], value )) + + +@pytest.mark.parametrize('act,dec,nc', [ ([10, 20], [20, 10], 1), + ([10, 20, 30], [30, 20, 10], 1), + ([10, 20, 30, 3], [30, 20, 10], 3), + ([10, 10, 10, 3], [10, 10, 10], 3 ) ]) +def test_fix_array_dimensions(act, dec, nc): + + arr = np.zeros(act) + obt = su.fix_array_dimensions(arr, nc) + + if nc == 1: + assert(np.array_equal( obt.shape, dec )) + else: + assert(np.array_equal( obt.shape[:-1], dec )) + + assert( not np.isfortran(obt) ) + + +def test_sitk_metaimage_roundtrip(tmpdir_factory, size): + + path = tmpdir_factory.mktemp('metaimage_io_test').join('dummy.mhd') + + array = np.random.rand(*size) + + su.write_ndarray_with_sitk(array, path) + obt_image, obt_info = su.read_ndarray_with_sitk(path) + + assert(np.allclose( obt_image, array )) + + +def test_sitk_metaimage_vector_roundtrip(tmpdir_factory, size): + + path = tmpdir_factory.mktemp('metaimage_io_test').join('dummy.mhd') + + size = list(size) + [3] + array = np.random.rand(*size) + + su.write_ndarray_with_sitk(array, path, ncomponents=3) + obt_image, obt_info = su.read_ndarray_with_sitk(path) + + assert(np.allclose( obt_image, array )) + assert( obt_info['ncomponents'] == 3 ) + + +def test_sitk_nrrd_read(tmpdir_factory, size): + + path = tmpdir_factory.mktemp('nrrd_io_test').join('dummy.nrrd') + array = np.random.rand(*size) + + nrrd.write(str(path), array) + + obt_image, obt_info = su.read_ndarray_with_sitk(path) + + assert(np.allclose( obt_image, array )) + + + +def test_sitk_nrrd_write(tmpdir_factory, size): + + path = tmpdir_factory.mktemp('nrrd_io_test').join('dummy_again.nrrd') + + array = np.random.rand(*size) + + su.write_ndarray_with_sitk(array, path) + obt_image, obt_info = nrrd.read(str(path)) + + assert(np.allclose( obt_image, array )) diff --git a/test/core/test_structure_tree.py b/test/core/test_structure_tree.py new file mode 100644 index 0000000000..e37f2ed2b2 --- /dev/null +++ b/test/core/test_structure_tree.py @@ -0,0 +1,250 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import mock +from numpy import allclose +import sys +import pandas as pd + +from allensdk.api.queries.ontologies_api import OntologiesApi +from allensdk.core.structure_tree import StructureTree + +if sys.version_info > (3,): + long = int + +@pytest.fixture +def nodes(): + + return [{'id': 0, 'structure_id_path': [0], 'rgb_triplet': [0, 0, 0], 'acronym': 'rt', 'name': 'root', 'structure_set_ids':[1, 4]}, + {'id': 1, 'structure_id_path': [0, 1], 'rgb_triplet': [0, 15, 255], 'acronym': 'a', 'name': 'alpha', 'structure_set_ids': [1, 3]}, + {'id': 2, 'structure_id_path': [0, 2], 'rgb_triplet': [255, 255, 255], 'acronym': 'b', 'name': 'beta', 'structure_set_ids': [1, 2]}] + + +@pytest.fixture +def tree(nodes): + return StructureTree(nodes) + + +@pytest.fixture +def oapi(): + oa = OntologiesApi() + + oa.get_structures = mock.MagicMock(return_value=[{'id': 1, 'structure_id_path': '1'}]) + oa.get_structure_set_map = mock.MagicMock(return_value={1: [2, 3]}) + + return oa + + +def test_get_structures_by_id(tree): + + obtained = tree.get_structures_by_id([1, 2]) + assert( len(obtained) == 2 ) + + +def test_get_structures_by_name(tree): + + obtained = tree.get_structures_by_name(['root']) + assert( len(obtained) == 1 ) + + +def test_get_structures_by_acronym(tree): + + obtained = tree.get_structures_by_acronym(['rt', 'a', 'b']) + assert( len(obtained) == 3) + + +def test_get_structures_by_set_id(tree): + + obtained = tree.get_structures_by_set_id([2, 3]) + + assert( len(obtained) == 2 ) + + +def test_get_colormap(tree): + + obtained = tree.get_colormap() + assert( allclose(obtained[0], [0, 0, 0]) ) + assert( allclose(obtained[2], [255, 255, 255]) ) + + +def test_get_name_map(tree): + + obtained = tree.get_name_map() + assert( obtained[0] == 'root' ) + assert( obtained[2] == 'beta' ) + + +def test_get_id_acronym_map(tree): + + obtained = tree.get_id_acronym_map() + assert( obtained['rt'] == 0 ) + + +def test_get_ancestor_id_map(tree): + + obtained = tree.get_ancestor_id_map() + assert( set(obtained[2]) == set([2, 0]) ) + + +def test_structure_descends_from(tree): + + assert( tree.structure_descends_from(2, 0) ) + assert( not tree.structure_descends_from(0, 1) ) + + +def test_has_overlaps(tree): + + obtained = tree.has_overlaps([0, 1, 2]) + assert( obtained == set([0]) ) + + obag = tree.has_overlaps([1, 2]) + assert( not obag ) + + +def test_clean_structures(nodes): + + dirty_node = {'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'structure_sets':[{'id': 1}, {'id': 4}]} + + clean_node = StructureTree.clean_structures([dirty_node])[0] + assert( isinstance(clean_node['rgb_triplet'], list) ) + assert( isinstance(clean_node['structure_id_path'], list) ) + + +def test_clean_structures_no_sets(): + + dirty_node = {'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root'} + + clean_node = StructureTree.clean_structures([dirty_node]) + st = StructureTree(clean_node) + + assert( len(clean_node[0]['structure_set_ids']) == 0 ) + + +def test_clean_structures_only_ids(): + + dirty_node = {'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'structure_set_ids': [1, 2, 3] } + + clean_node = StructureTree.clean_structures([dirty_node]) + st = StructureTree(clean_node) + + assert( len(clean_node[0]['structure_set_ids']) == 3 ) + + +def test_clean_structures_ids_sets(): + + dirty_node = {'id': 0, 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'structure_set_ids': [1, 2, 3], + 'structure_sets': [{'id': 1}, {'id': 4}] } + + clean_node = StructureTree.clean_structures([dirty_node]) + st = StructureTree(clean_node) + + assert( len(clean_node[0]['structure_set_ids']) == 4 ) + + +def test_clean_structures_str_id(): + + dirty_node = {'id': '0', 'structure_id_path': '/0/', + 'color_hex_triplet': '000000', 'acronym': 'rt', + 'name': 'root', 'structure_set_ids': [1, 2, 3], + 'structure_sets': [{'id': 1}, {'id': 4}] } + + clean_node = StructureTree.clean_structures([dirty_node]) + st = StructureTree(clean_node) + + assert( set(st.node_ids()) == set([0]) ) + + +def test_get_structure_sets(tree): + + expected = set([1, 2, 3, 4]) + obtained = tree.get_structure_sets() + assert( expected == obtained ) + + +def test_clean_structures_weird_keys(): + + dirty_node = {'id': 5, 'dummy_key': 'dummy_val'} + clean_node = StructureTree.clean_structures([dirty_node])[0] + + assert( len(clean_node) == 2 ) + assert( clean_node['id'] == 5 ) + + +@pytest.mark.parametrize('inp,out', [('990099', [153, 0, 153]), + ('#990099', [153, 0, 153]), + ([153, 0, 153], [153, 0, 153]), + ((153., 0., 153.), [153, 0, 153]), + ([long(153), long(0), long(153)], [153, 0, 153])]) +def test_hex_to_rgb(inp, out): + obt = StructureTree.hex_to_rgb(inp) + assert(allclose(obt, out)) + + +@pytest.mark.parametrize('inp,out', [('/1/2/3/', [1, 2, 3]), + ('1/2/3/', [1, 2, 3]), + ('/1/2/3', [1, 2, 3]), + ('1/2/3', [1, 2, 3]), + ([1, 2, 3], [1, 2, 3]), + ([1.0, long(2), 3], [1, 2, 3]), + ((1, 2, 3), [1, 2, 3]), + ('', [])]) +def test_path_to_list(inp, out): + obt = StructureTree.path_to_list(inp) + assert(allclose(obt, out)) + + +def test_export_label_description(tree): + exp = pd.DataFrame({ + 'IDX': [0, 1, 2], + '-R-': [0, 0, 255], + '-G-': [0, 15, 255], + '-B-': [0, 255, 255], + '-A-': [1.0, 1.0, 1.0], + 'VIS': [1, 1, 1], + 'MSH': [1, 1, 1], + 'LABEL': ['rt', 'a', 'b'] + }).loc[:, ('IDX', '-R-', '-G-', '-B-', '-A-', 'VIS', 'MSH', 'LABEL')] + + obt = tree.export_label_description() + pd.testing.assert_frame_equal(obt, exp) \ No newline at end of file diff --git a/test/ephys/__pycache__/test_extractor.cpython-37.pyc b/test/ephys/__pycache__/test_extractor.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebdac55d561b0cee755b13929624a4ca141351b3 GIT binary patch literal 4898 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 SF_ve03*Mqv@ycG6{{9CxxPwRl literal 0 HcmV?d00001 diff --git a/test/ephys/__pycache__/test_features.cpython-37.pyc b/test/ephys/__pycache__/test_features.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9628fb2f665027639f9c6b513b1881a8ec9533c8 GIT binary patch literal 8468 zcmdT}U2Ggz6`tSS+4cG-j^jB0KTVr%(<Uty6@<_xO&cMoA}A@KmD|x|?|41-dS-R! zI*y|?qD?AQNGU206%Qb6^#Sp~BZ5aH-VovmBs3LIm5?kUp}rv`1m8I`JG&ll5<3c& zx~si+=FXkjIo~<o`MLMy(b1}gPx#T>-VaV_+9!0<`&c-*h+k~znkF=%x3xyv>q~~A z>DrRnu=I4qZj^XNxl#7Z3(k7QuWslKM;OAqqcui^C2aIHQ4(eJqrwpt^kbqbM$nIo znixetA;!cw`aNPo>_I;%CdFR#d&QL4hki;-i~Z>Li5YPK{j@kJ4x!&K4vQn`XT(u) z4E+IdT%16EP@EKxp+6)}iO10&7Eg%N=#PjeMIHT7@sv1&{+M`LJcItYuPvNdI4RDG zbK=>%hImeV;f{7&Z#*XSZ)^4EHwl@mO={_5;8(%#GJf%OG(snNTjpB-NLSjru8a-+ zN0Yjy%yp})b@dGZ`d#4mE$wyfds;qYCY_<|^-@>c(2MhghIg>8N+?6y<c40LUQSA# zRprMjDM>Gg{Wz&yTkZI-N*T$-m{ZBL@Ri?GZf99}D!AdhaVJ>BG$ZUJwkM^xS~n8? zMxv`<YH}2h{C9Bq{OlXCFXLHn-V<l9dn;bJI(sSfno%gc=V$%!Mm!sJ{4j2!jXLwI z@$75C_1QR3{xcn~x#+cg+}mzrhFCmDFL%zTS$ycu`JP&qetfpGn(U{G?hV%qg{xdo z`uO3E;xl-UxQ0g4tN7ORX``mgahwl_{|c@UkUbS_=xh0T3-GT&3G1e^7VJzF7J+;} zh$W#bO*HkgBsEK7iX>7<o0>A3q;@40hT)bDhU$hKq09903}@Pm(d<c<HV$t2?otph zd8#@8MU2OEpQcafWBAHFI36zK1zaf#DXd+HW~bKE7j2WoxsQBu0@oYka{;L*Sn^#Q z_%|UUN!Kuy`)pCf!z^O|hG<#2(VTldS`I}_0_4J4287*<kuAa!s+VcnH_`Nk6;{j2 zb!vcS`0@x5%wS^aAdP`D8(O7Nn@DsBWASUM^p4K-*$zNa!HEOAZMGwrKfOw0tm(Cz z%WY5juDBso!xF*VTrzek#sn2aAuB!uBvm|7Xh7$C84$YH4I_6hXe(d7LIRf1X!@i+ zX~_LJ%26O{lUf)Bnwi=(A&}ZM$tCPXBR;B(cObRUZS8<2N?+1U?E+)QGs>88k!G;u zPEqx83Xi_lLW7TU@k-rH1+L9|F<$egFI=JIG%nWlp~gI#X*!+x4NS~bThk}a30=-$ zBo~SVA}eR1+BhK9Dq{g2QJDfBk(3Kj@O>Amoih$-Yb08FZt^)R7cfA*YbNe5sq(th zH89717xTLiG(Fldx+c^<uPT}FrK`7Qgr~f7?D|}O@s1bBv+AZ|f69yq{tC(mzXf~i zRc3rrZbzQLoWzLY#OiozKCu>}AWU7sK8V4XG4E5Tti+-}N&zE3kc|5`J8-{%GxfVg z!t6`!BlXcyn7QX`xHaa`tWUu)Oz1U39>drcK*@p_(6?~#@PG=NJ>&qS<QEyj#zR4P z9u&wRln3x?@*p*bs5wjxJJO-($s=@~T_-!yqjXvz)bt==Y9-2WeG^l+AU0;m;~2{k zGjWn5_H~@>1ToBEf3jw%%-jf@+X(bv*OeR{^Fao7A2^cgEnh~l+eTDQOvKEhO_@bh z3V>{}Ao!Tn&gLLtMo6-tsv#d6M1u&Kqw$^HqXGK0;D<oOvO>DoHM%-1#>|j;T~#yc zJs6phG`bEmloNQb)LKr`5l7rT99ufRx0nVaKhBs}Kq)B==i9+S^XZ}G((~dFe==Y~ zNIVSr1jcd`qPU+2D4M+!6B_Qt21sX9R?HN%@Vwm22+pnrKemvYne!ks8}MU9!r*Bb zeemJ#=y(cprI6YMNaf?W)ELVh8iQ7(=b=G-b9$x#ui*YHt4qBa5*|aI#%K;P!JFIV zdpLRI5SP}=skH)JYt~q^*Gl*gr)zd?fUO8@KDW9hoZtB@z-PmrPIH4|o-Wx@avUxX z(??>n8j@=0uk=#;3LOvCPHO$Vf0EJlw!f6!^)@Mo@;xmJIiws?lYAOu!xhxUm7ORE zb9!#H?>Kr#RvO32fefgm(zS2vs?sgp)-5D9i-wf!bZ>^Jo*uP(AqB`MsbNQRZ?t8d zCOt*X8ES^Q;tbxNbBXU_W=sV@iYyg0RUj*$!AOoP8GW81eIF+~!F89u#iqKOJ&ld0 z4|p2Foz4GNZtm5G_BBD3yiR9VUZ=5--THDTRx(=5>WrRiFAcMM)<k16cSgNi<DyQ+ z*dgVYe*$O+l)*(8RU&5xmGL=o^f}PMUnq5bVONkRGtvj>zN_X@jL%1Hu{EF;y?;{4 zF>LJ3Vb5>ghWj|<-oO440Z*x2?q3M@=ZdiB9FVy3h&W)NYM=@ui?0i)8pzvF+`VgY zj16<U-(if+p>L5ynl|;jy51N`rFG||*St^0S4@D<;r@F>+-Gqqae8PMP5Wd4Vz=pq zVWd#LQN8ZTmal$=2W&_Ed5q?shZZ-;0bZu5KSo2SQ_;DB)vPIvi%x?|N~|<!>!{W; zG^rjl1+tgCd@w~>I2qCwd3-FfppXE<_N+yLcCEbT;I2~F=DMvybsK{04OQl#Tk4je zl`7SMJpMk7bNM=wt$R^H(E4=#llOl8uRp)INi^N0YGRXChPa~L1P8Ru|Kh{BP~G9| zvQhG+7q)!a&nQXa#=+*i-(2i7Am)XrG;;RiZe^e%p%f?$0;HOLBxsCM%*`2+l$-6K z)A2=7Wodep{%x9|_W$xXcw!cTk+Ab>(3o*hpV8%4a3$B*=QL8}E~=lE2A5EV1V2M) z+&Np4y{UD}Xt_1N)nnZ!PE7PD<RZS{#%<oJmQpFb_<K@BKVauE;;VydAOp&2vyKy@ z&BHBe+_M-M4A`Xw<gG&MTB3S@2|^1V181OF*A^ppd--gM=56TlPjlB++gV5-qNpp^ z<d-2KR)Wq`moAUoyS67-BrWzOb`XbNm^!zi>1)a*dTLU>hiZ-ts>WRj)I8_5uBTi- z6o104@g$l&tPpXG<5)A67cu&Ir%hhM^~n;vWr8+;++DQa&$JQIO1PsGi}T!<fL~)O zr%wOoZS<L79SuzQ7`G0i(944=A^%O$=Q2%xv^g*0kjW7r<(_gDDp>ZPM&017SNp}^ z;4TbDnaa)xGE5~uM+B<hXDNf%ylBy-zj?rm>+%xD>cw0uWd*@sj2|b8K)Wi6+$C(# z^gP?&3Cyj|Yl1Q@0y!rGF*Ha1eVqKCofqmq+Uw)ofXeMHwFfE>n~UuqJ_1+Or%CJ0 zUwrW4A3nbHQtKaoJNC~v&Rl-!fsQL*luSmLE-Qghh!qd22bm}Rh2HEg%0yE2kv5Wa z-IA{%PfIryuz~O?t`*B}_%A5zRb0sxMnV5GQJAPQactEm4sA>h5Qo&YjXEPcqt1}n z(pOmU&?I^V=+y5W{^c+xon|I&)5kVG{b!hhm{C`7<=U-rWZcJtr4Ck7{1EH>bsamg zz86Pft~|`cc6sLK$O*8w(XS4WyI?FS&9}cCN5AXKGFBBlFh<p<X{P)d+WINpn`|8E z?Yo}kE!VWo_got`k75yz_G9zmbnC|smzO%L>2hqoWS^8pAVY7-PaK!FuYA|#eOTV7 z<o!F|zT)j3-lE`DcV2Af#ZzA1<0T|s@8CL{t3F9Z2xqpE@+uD2lEMRfDz<(}2q)H( zCl?!~croY%b1Z8SH|CdfVJQ;JZU4nnxG8=Cjf34a2j80MRGqTp;8)?VgSP6_oDqDh M+0iJU)tuV@0D;02L;wH) literal 0 HcmV?d00001 diff --git a/test/ephys/data/spike_test_high_init_dvdt.txt b/test/ephys/data/spike_test_high_init_dvdt.txt new file mode 100644 index 0000000000..b3cd2741f1 --- /dev/null +++ b/test/ephys/data/spike_test_high_init_dvdt.txt @@ -0,0 +1,28000 @@ +1.000000000000000000e+00 -7.331250000000000000e+01 +1.000005000000000033e+00 -7.328125000000000000e+01 +1.000010000000000066e+00 -7.325000000000000000e+01 +1.000015000000000098e+00 -7.328125000000000000e+01 +1.000020000000000131e+00 -7.321875000000000000e+01 +1.000025000000000164e+00 -7.331250000000000000e+01 +1.000029999999999974e+00 -7.321875000000000000e+01 +1.000035000000000007e+00 -7.321875000000000000e+01 +1.000040000000000040e+00 -7.325000000000000000e+01 +1.000045000000000073e+00 -7.328125000000000000e+01 +1.000050000000000106e+00 -7.325000000000000000e+01 +1.000055000000000138e+00 -7.331250000000000000e+01 +1.000060000000000171e+00 -7.325000000000000000e+01 +1.000064999999999982e+00 -7.328125000000000000e+01 +1.000070000000000014e+00 -7.321875000000000000e+01 +1.000075000000000047e+00 -7.325000000000000000e+01 +1.000080000000000080e+00 -7.325000000000000000e+01 +1.000085000000000113e+00 -7.318750000000000000e+01 +1.000090000000000146e+00 -7.325000000000000000e+01 +1.000095000000000178e+00 -7.318750000000000000e+01 +1.000099999999999989e+00 -7.321875000000000000e+01 +1.000105000000000022e+00 -7.328125000000000000e+01 +1.000110000000000054e+00 -7.328125000000000000e+01 +1.000115000000000087e+00 -7.328125000000000000e+01 +1.000120000000000120e+00 -7.328125000000000000e+01 +1.000125000000000153e+00 -7.328125000000000000e+01 +1.000130000000000186e+00 -7.321875000000000000e+01 +1.000134999999999996e+00 -7.321875000000000000e+01 +1.000140000000000029e+00 -7.318750000000000000e+01 +1.000145000000000062e+00 -7.321875000000000000e+01 +1.000150000000000095e+00 -7.321875000000000000e+01 +1.000155000000000127e+00 -7.321875000000000000e+01 +1.000160000000000160e+00 -7.321875000000000000e+01 +1.000165000000000193e+00 -7.318750000000000000e+01 +1.000170000000000003e+00 -7.321875000000000000e+01 +1.000175000000000036e+00 -7.318750000000000000e+01 +1.000180000000000069e+00 -7.325000000000000000e+01 +1.000185000000000102e+00 -7.321875000000000000e+01 +1.000190000000000135e+00 -7.321875000000000000e+01 +1.000195000000000167e+00 -7.318750000000000000e+01 +1.000199999999999978e+00 -7.321875000000000000e+01 +1.000205000000000011e+00 -7.325000000000000000e+01 +1.000210000000000043e+00 -7.321875000000000000e+01 +1.000215000000000076e+00 -7.328125000000000000e+01 +1.000220000000000109e+00 -7.328125000000000000e+01 +1.000225000000000142e+00 -7.325000000000000000e+01 +1.000230000000000175e+00 -7.328125000000000000e+01 +1.000234999999999985e+00 -7.318750000000000000e+01 +1.000240000000000018e+00 -7.325000000000000000e+01 +1.000245000000000051e+00 -7.318750000000000000e+01 +1.000250000000000083e+00 -7.321875000000000000e+01 +1.000255000000000116e+00 -7.321875000000000000e+01 +1.000260000000000149e+00 -7.325000000000000000e+01 +1.000265000000000182e+00 -7.321875000000000000e+01 +1.000269999999999992e+00 -7.321875000000000000e+01 +1.000275000000000025e+00 -7.321875000000000000e+01 +1.000280000000000058e+00 -7.318750000000000000e+01 +1.000285000000000091e+00 -7.328125000000000000e+01 +1.000290000000000123e+00 -7.325000000000000000e+01 +1.000295000000000156e+00 -7.328125000000000000e+01 +1.000300000000000189e+00 -7.328125000000000000e+01 +1.000305000000000000e+00 -7.325000000000000000e+01 +1.000310000000000032e+00 -7.318750000000000000e+01 +1.000315000000000065e+00 -7.334375000000000000e+01 +1.000320000000000098e+00 -7.328125000000000000e+01 +1.000325000000000131e+00 -7.325000000000000000e+01 +1.000330000000000163e+00 -7.325000000000000000e+01 +1.000334999999999974e+00 -7.315625000000000000e+01 +1.000340000000000007e+00 -7.325000000000000000e+01 +1.000345000000000040e+00 -7.315625000000000000e+01 +1.000350000000000072e+00 -7.321875000000000000e+01 +1.000355000000000105e+00 -7.321875000000000000e+01 +1.000360000000000138e+00 -7.315625000000000000e+01 +1.000365000000000171e+00 -7.328125000000000000e+01 +1.000369999999999981e+00 -7.325000000000000000e+01 +1.000375000000000014e+00 -7.325000000000000000e+01 +1.000380000000000047e+00 -7.321875000000000000e+01 +1.000385000000000080e+00 -7.318750000000000000e+01 +1.000390000000000112e+00 -7.325000000000000000e+01 +1.000395000000000145e+00 -7.325000000000000000e+01 +1.000400000000000178e+00 -7.325000000000000000e+01 +1.000404999999999989e+00 -7.328125000000000000e+01 +1.000410000000000021e+00 -7.334375000000000000e+01 +1.000415000000000054e+00 -7.328125000000000000e+01 +1.000420000000000087e+00 -7.321875000000000000e+01 +1.000425000000000120e+00 -7.321875000000000000e+01 +1.000430000000000152e+00 -7.328125000000000000e+01 +1.000435000000000185e+00 -7.328125000000000000e+01 +1.000439999999999996e+00 -7.331250000000000000e+01 +1.000445000000000029e+00 -7.328125000000000000e+01 +1.000450000000000061e+00 -7.331250000000000000e+01 +1.000455000000000094e+00 -7.328125000000000000e+01 +1.000460000000000127e+00 -7.328125000000000000e+01 +1.000465000000000160e+00 -7.328125000000000000e+01 +1.000470000000000192e+00 -7.325000000000000000e+01 +1.000475000000000003e+00 -7.325000000000000000e+01 +1.000480000000000036e+00 -7.331250000000000000e+01 +1.000485000000000069e+00 -7.328125000000000000e+01 +1.000490000000000101e+00 -7.325000000000000000e+01 +1.000495000000000134e+00 -7.328125000000000000e+01 +1.000500000000000167e+00 -7.328125000000000000e+01 +1.000504999999999978e+00 -7.328125000000000000e+01 +1.000510000000000010e+00 -7.328125000000000000e+01 +1.000515000000000043e+00 -7.328125000000000000e+01 +1.000520000000000076e+00 -7.325000000000000000e+01 +1.000525000000000109e+00 -7.331250000000000000e+01 +1.000530000000000141e+00 -7.331250000000000000e+01 +1.000535000000000174e+00 -7.321875000000000000e+01 +1.000539999999999985e+00 -7.318750000000000000e+01 +1.000545000000000018e+00 -7.325000000000000000e+01 +1.000550000000000050e+00 -7.325000000000000000e+01 +1.000555000000000083e+00 -7.321875000000000000e+01 +1.000560000000000116e+00 -7.328125000000000000e+01 +1.000565000000000149e+00 -7.328125000000000000e+01 +1.000570000000000181e+00 -7.321875000000000000e+01 +1.000574999999999992e+00 -7.328125000000000000e+01 +1.000580000000000025e+00 -7.328125000000000000e+01 +1.000585000000000058e+00 -7.318750000000000000e+01 +1.000590000000000090e+00 -7.321875000000000000e+01 +1.000595000000000123e+00 -7.321875000000000000e+01 +1.000600000000000156e+00 -7.328125000000000000e+01 +1.000605000000000189e+00 -7.321875000000000000e+01 +1.000609999999999999e+00 -7.328125000000000000e+01 +1.000615000000000032e+00 -7.321875000000000000e+01 +1.000620000000000065e+00 -7.328125000000000000e+01 +1.000625000000000098e+00 -7.315625000000000000e+01 +1.000630000000000130e+00 -7.325000000000000000e+01 +1.000635000000000163e+00 -7.321875000000000000e+01 +1.000639999999999974e+00 -7.328125000000000000e+01 +1.000645000000000007e+00 -7.321875000000000000e+01 +1.000650000000000039e+00 -7.325000000000000000e+01 +1.000655000000000072e+00 -7.318750000000000000e+01 +1.000660000000000105e+00 -7.321875000000000000e+01 +1.000665000000000138e+00 -7.325000000000000000e+01 +1.000670000000000170e+00 -7.328125000000000000e+01 +1.000674999999999981e+00 -7.315625000000000000e+01 +1.000680000000000014e+00 -7.321875000000000000e+01 +1.000685000000000047e+00 -7.325000000000000000e+01 +1.000690000000000079e+00 -7.325000000000000000e+01 +1.000695000000000112e+00 -7.321875000000000000e+01 +1.000700000000000145e+00 -7.318750000000000000e+01 +1.000705000000000178e+00 -7.328125000000000000e+01 +1.000709999999999988e+00 -7.325000000000000000e+01 +1.000715000000000021e+00 -7.325000000000000000e+01 +1.000720000000000054e+00 -7.331250000000000000e+01 +1.000725000000000087e+00 -7.321875000000000000e+01 +1.000730000000000119e+00 -7.321875000000000000e+01 +1.000735000000000152e+00 -7.321875000000000000e+01 +1.000740000000000185e+00 -7.315625000000000000e+01 +1.000744999999999996e+00 -7.321875000000000000e+01 +1.000750000000000028e+00 -7.325000000000000000e+01 +1.000755000000000061e+00 -7.328125000000000000e+01 +1.000760000000000094e+00 -7.321875000000000000e+01 +1.000765000000000127e+00 -7.325000000000000000e+01 +1.000770000000000159e+00 -7.321875000000000000e+01 +1.000775000000000192e+00 -7.318750000000000000e+01 +1.000780000000000003e+00 -7.325000000000000000e+01 +1.000785000000000036e+00 -7.321875000000000000e+01 +1.000790000000000068e+00 -7.331250000000000000e+01 +1.000795000000000101e+00 -7.325000000000000000e+01 +1.000800000000000134e+00 -7.321875000000000000e+01 +1.000805000000000167e+00 -7.328125000000000000e+01 +1.000809999999999977e+00 -7.328125000000000000e+01 +1.000815000000000010e+00 -7.328125000000000000e+01 +1.000820000000000043e+00 -7.325000000000000000e+01 +1.000825000000000076e+00 -7.325000000000000000e+01 +1.000830000000000108e+00 -7.328125000000000000e+01 +1.000835000000000141e+00 -7.328125000000000000e+01 +1.000840000000000174e+00 -7.328125000000000000e+01 +1.000844999999999985e+00 -7.328125000000000000e+01 +1.000850000000000017e+00 -7.328125000000000000e+01 +1.000855000000000050e+00 -7.331250000000000000e+01 +1.000860000000000083e+00 -7.321875000000000000e+01 +1.000865000000000116e+00 -7.331250000000000000e+01 +1.000870000000000148e+00 -7.325000000000000000e+01 +1.000875000000000181e+00 -7.328125000000000000e+01 +1.000879999999999992e+00 -7.328125000000000000e+01 +1.000885000000000025e+00 -7.321875000000000000e+01 +1.000890000000000057e+00 -7.325000000000000000e+01 +1.000895000000000090e+00 -7.321875000000000000e+01 +1.000900000000000123e+00 -7.325000000000000000e+01 +1.000905000000000156e+00 -7.328125000000000000e+01 +1.000910000000000188e+00 -7.321875000000000000e+01 +1.000914999999999999e+00 -7.331250000000000000e+01 +1.000920000000000032e+00 -7.328125000000000000e+01 +1.000925000000000065e+00 -7.325000000000000000e+01 +1.000930000000000097e+00 -7.328125000000000000e+01 +1.000935000000000130e+00 -7.325000000000000000e+01 +1.000940000000000163e+00 -7.328125000000000000e+01 +1.000944999999999974e+00 -7.325000000000000000e+01 +1.000950000000000006e+00 -7.328125000000000000e+01 +1.000955000000000039e+00 -7.328125000000000000e+01 +1.000960000000000072e+00 -7.328125000000000000e+01 +1.000965000000000105e+00 -7.318750000000000000e+01 +1.000970000000000137e+00 -7.321875000000000000e+01 +1.000975000000000170e+00 -7.325000000000000000e+01 +1.000979999999999981e+00 -7.328125000000000000e+01 +1.000985000000000014e+00 -7.318750000000000000e+01 +1.000990000000000046e+00 -7.325000000000000000e+01 +1.000995000000000079e+00 -7.328125000000000000e+01 +1.001000000000000112e+00 -7.325000000000000000e+01 +1.001005000000000145e+00 -7.328125000000000000e+01 +1.001010000000000177e+00 -7.325000000000000000e+01 +1.001014999999999988e+00 -7.321875000000000000e+01 +1.001020000000000021e+00 -7.325000000000000000e+01 +1.001025000000000054e+00 -7.318750000000000000e+01 +1.001030000000000086e+00 -7.325000000000000000e+01 +1.001035000000000119e+00 -7.328125000000000000e+01 +1.001040000000000152e+00 -7.325000000000000000e+01 +1.001045000000000185e+00 -7.321875000000000000e+01 +1.001049999999999995e+00 -7.328125000000000000e+01 +1.001055000000000028e+00 -7.328125000000000000e+01 +1.001060000000000061e+00 -7.321875000000000000e+01 +1.001065000000000094e+00 -7.328125000000000000e+01 +1.001070000000000126e+00 -7.328125000000000000e+01 +1.001075000000000159e+00 -7.321875000000000000e+01 +1.001080000000000192e+00 -7.325000000000000000e+01 +1.001085000000000003e+00 -7.321875000000000000e+01 +1.001090000000000035e+00 -7.328125000000000000e+01 +1.001095000000000068e+00 -7.328125000000000000e+01 +1.001100000000000101e+00 -7.328125000000000000e+01 +1.001105000000000134e+00 -7.334375000000000000e+01 +1.001110000000000166e+00 -7.328125000000000000e+01 +1.001114999999999977e+00 -7.328125000000000000e+01 +1.001120000000000010e+00 -7.328125000000000000e+01 +1.001125000000000043e+00 -7.328125000000000000e+01 +1.001130000000000075e+00 -7.331250000000000000e+01 +1.001135000000000108e+00 -7.321875000000000000e+01 +1.001140000000000141e+00 -7.321875000000000000e+01 +1.001145000000000174e+00 -7.328125000000000000e+01 +1.001149999999999984e+00 -7.325000000000000000e+01 +1.001155000000000017e+00 -7.328125000000000000e+01 +1.001160000000000050e+00 -7.328125000000000000e+01 +1.001165000000000083e+00 -7.328125000000000000e+01 +1.001170000000000115e+00 -7.325000000000000000e+01 +1.001175000000000148e+00 -7.328125000000000000e+01 +1.001180000000000181e+00 -7.328125000000000000e+01 +1.001184999999999992e+00 -7.325000000000000000e+01 +1.001190000000000024e+00 -7.325000000000000000e+01 +1.001195000000000057e+00 -7.325000000000000000e+01 +1.001200000000000090e+00 -7.331250000000000000e+01 +1.001205000000000123e+00 -7.331250000000000000e+01 +1.001210000000000155e+00 -7.325000000000000000e+01 +1.001215000000000188e+00 -7.334375000000000000e+01 +1.001219999999999999e+00 -7.334375000000000000e+01 +1.001225000000000032e+00 -7.328125000000000000e+01 +1.001230000000000064e+00 -7.325000000000000000e+01 +1.001235000000000097e+00 -7.328125000000000000e+01 +1.001240000000000130e+00 -7.328125000000000000e+01 +1.001245000000000163e+00 -7.331250000000000000e+01 +1.001249999999999973e+00 -7.328125000000000000e+01 +1.001255000000000006e+00 -7.328125000000000000e+01 +1.001260000000000039e+00 -7.325000000000000000e+01 +1.001265000000000072e+00 -7.321875000000000000e+01 +1.001270000000000104e+00 -7.325000000000000000e+01 +1.001275000000000137e+00 -7.331250000000000000e+01 +1.001280000000000170e+00 -7.328125000000000000e+01 +1.001284999999999981e+00 -7.331250000000000000e+01 +1.001290000000000013e+00 -7.325000000000000000e+01 +1.001295000000000046e+00 -7.331250000000000000e+01 +1.001300000000000079e+00 -7.331250000000000000e+01 +1.001305000000000112e+00 -7.331250000000000000e+01 +1.001310000000000144e+00 -7.334375000000000000e+01 +1.001315000000000177e+00 -7.331250000000000000e+01 +1.001319999999999988e+00 -7.331250000000000000e+01 +1.001325000000000021e+00 -7.331250000000000000e+01 +1.001330000000000053e+00 -7.334375000000000000e+01 +1.001335000000000086e+00 -7.328125000000000000e+01 +1.001340000000000119e+00 -7.331250000000000000e+01 +1.001345000000000152e+00 -7.331250000000000000e+01 +1.001350000000000184e+00 -7.331250000000000000e+01 +1.001354999999999995e+00 -7.328125000000000000e+01 +1.001360000000000028e+00 -7.331250000000000000e+01 +1.001365000000000061e+00 -7.331250000000000000e+01 +1.001370000000000093e+00 -7.334375000000000000e+01 +1.001375000000000126e+00 -7.328125000000000000e+01 +1.001380000000000159e+00 -7.331250000000000000e+01 +1.001385000000000192e+00 -7.331250000000000000e+01 +1.001390000000000002e+00 -7.328125000000000000e+01 +1.001395000000000035e+00 -7.328125000000000000e+01 +1.001400000000000068e+00 -7.334375000000000000e+01 +1.001405000000000101e+00 -7.340625000000000000e+01 +1.001410000000000133e+00 -7.334375000000000000e+01 +1.001415000000000166e+00 -7.331250000000000000e+01 +1.001419999999999977e+00 -7.334375000000000000e+01 +1.001425000000000010e+00 -7.337500000000000000e+01 +1.001430000000000042e+00 -7.331250000000000000e+01 +1.001435000000000075e+00 -7.334375000000000000e+01 +1.001440000000000108e+00 -7.334375000000000000e+01 +1.001445000000000141e+00 -7.331250000000000000e+01 +1.001450000000000173e+00 -7.331250000000000000e+01 +1.001454999999999984e+00 -7.325000000000000000e+01 +1.001460000000000017e+00 -7.334375000000000000e+01 +1.001465000000000050e+00 -7.328125000000000000e+01 +1.001470000000000082e+00 -7.334375000000000000e+01 +1.001475000000000115e+00 -7.334375000000000000e+01 +1.001480000000000148e+00 -7.337500000000000000e+01 +1.001485000000000181e+00 -7.334375000000000000e+01 +1.001489999999999991e+00 -7.334375000000000000e+01 +1.001495000000000024e+00 -7.334375000000000000e+01 +1.001500000000000057e+00 -7.328125000000000000e+01 +1.001505000000000090e+00 -7.337500000000000000e+01 +1.001510000000000122e+00 -7.334375000000000000e+01 +1.001515000000000155e+00 -7.328125000000000000e+01 +1.001520000000000188e+00 -7.337500000000000000e+01 +1.001524999999999999e+00 -7.334375000000000000e+01 +1.001530000000000031e+00 -7.334375000000000000e+01 +1.001535000000000064e+00 -7.328125000000000000e+01 +1.001540000000000097e+00 -7.334375000000000000e+01 +1.001545000000000130e+00 -7.334375000000000000e+01 +1.001550000000000162e+00 -7.334375000000000000e+01 +1.001554999999999973e+00 -7.334375000000000000e+01 +1.001560000000000006e+00 -7.331250000000000000e+01 +1.001565000000000039e+00 -7.328125000000000000e+01 +1.001570000000000071e+00 -7.321875000000000000e+01 +1.001575000000000104e+00 -7.331250000000000000e+01 +1.001580000000000137e+00 -7.331250000000000000e+01 +1.001585000000000170e+00 -7.331250000000000000e+01 +1.001589999999999980e+00 -7.325000000000000000e+01 +1.001595000000000013e+00 -7.331250000000000000e+01 +1.001600000000000046e+00 -7.328125000000000000e+01 +1.001605000000000079e+00 -7.325000000000000000e+01 +1.001610000000000111e+00 -7.328125000000000000e+01 +1.001615000000000144e+00 -7.328125000000000000e+01 +1.001620000000000177e+00 -7.340625000000000000e+01 +1.001624999999999988e+00 -7.334375000000000000e+01 +1.001630000000000020e+00 -7.328125000000000000e+01 +1.001635000000000053e+00 -7.331250000000000000e+01 +1.001640000000000086e+00 -7.334375000000000000e+01 +1.001645000000000119e+00 -7.334375000000000000e+01 +1.001650000000000151e+00 -7.340625000000000000e+01 +1.001655000000000184e+00 -7.328125000000000000e+01 +1.001659999999999995e+00 -7.331250000000000000e+01 +1.001665000000000028e+00 -7.328125000000000000e+01 +1.001670000000000060e+00 -7.331250000000000000e+01 +1.001675000000000093e+00 -7.331250000000000000e+01 +1.001680000000000126e+00 -7.334375000000000000e+01 +1.001685000000000159e+00 -7.334375000000000000e+01 +1.001690000000000191e+00 -7.334375000000000000e+01 +1.001695000000000002e+00 -7.328125000000000000e+01 +1.001700000000000035e+00 -7.331250000000000000e+01 +1.001705000000000068e+00 -7.321875000000000000e+01 +1.001710000000000100e+00 -7.337500000000000000e+01 +1.001715000000000133e+00 -7.328125000000000000e+01 +1.001720000000000166e+00 -7.331250000000000000e+01 +1.001724999999999977e+00 -7.334375000000000000e+01 +1.001730000000000009e+00 -7.328125000000000000e+01 +1.001735000000000042e+00 -7.337500000000000000e+01 +1.001740000000000075e+00 -7.331250000000000000e+01 +1.001745000000000108e+00 -7.328125000000000000e+01 +1.001750000000000140e+00 -7.331250000000000000e+01 +1.001755000000000173e+00 -7.331250000000000000e+01 +1.001759999999999984e+00 -7.331250000000000000e+01 +1.001765000000000017e+00 -7.328125000000000000e+01 +1.001770000000000049e+00 -7.325000000000000000e+01 +1.001775000000000082e+00 -7.321875000000000000e+01 +1.001780000000000115e+00 -7.328125000000000000e+01 +1.001785000000000148e+00 -7.325000000000000000e+01 +1.001790000000000180e+00 -7.325000000000000000e+01 +1.001794999999999991e+00 -7.328125000000000000e+01 +1.001800000000000024e+00 -7.328125000000000000e+01 +1.001805000000000057e+00 -7.325000000000000000e+01 +1.001810000000000089e+00 -7.328125000000000000e+01 +1.001815000000000122e+00 -7.325000000000000000e+01 +1.001820000000000155e+00 -7.328125000000000000e+01 +1.001825000000000188e+00 -7.325000000000000000e+01 +1.001829999999999998e+00 -7.325000000000000000e+01 +1.001835000000000031e+00 -7.328125000000000000e+01 +1.001840000000000064e+00 -7.328125000000000000e+01 +1.001845000000000097e+00 -7.321875000000000000e+01 +1.001850000000000129e+00 -7.334375000000000000e+01 +1.001855000000000162e+00 -7.331250000000000000e+01 +1.001859999999999973e+00 -7.328125000000000000e+01 +1.001865000000000006e+00 -7.328125000000000000e+01 +1.001870000000000038e+00 -7.325000000000000000e+01 +1.001875000000000071e+00 -7.328125000000000000e+01 +1.001880000000000104e+00 -7.321875000000000000e+01 +1.001885000000000137e+00 -7.321875000000000000e+01 +1.001890000000000169e+00 -7.321875000000000000e+01 +1.001894999999999980e+00 -7.321875000000000000e+01 +1.001900000000000013e+00 -7.318750000000000000e+01 +1.001905000000000046e+00 -7.318750000000000000e+01 +1.001910000000000078e+00 -7.321875000000000000e+01 +1.001915000000000111e+00 -7.318750000000000000e+01 +1.001920000000000144e+00 -7.321875000000000000e+01 +1.001925000000000177e+00 -7.328125000000000000e+01 +1.001929999999999987e+00 -7.321875000000000000e+01 +1.001935000000000020e+00 -7.321875000000000000e+01 +1.001940000000000053e+00 -7.321875000000000000e+01 +1.001945000000000086e+00 -7.318750000000000000e+01 +1.001950000000000118e+00 -7.321875000000000000e+01 +1.001955000000000151e+00 -7.321875000000000000e+01 +1.001960000000000184e+00 -7.321875000000000000e+01 +1.001964999999999995e+00 -7.325000000000000000e+01 +1.001970000000000027e+00 -7.325000000000000000e+01 +1.001975000000000060e+00 -7.328125000000000000e+01 +1.001980000000000093e+00 -7.325000000000000000e+01 +1.001985000000000126e+00 -7.331250000000000000e+01 +1.001990000000000158e+00 -7.321875000000000000e+01 +1.001995000000000191e+00 -7.321875000000000000e+01 +1.002000000000000002e+00 -7.321875000000000000e+01 +1.002005000000000035e+00 -7.321875000000000000e+01 +1.002010000000000067e+00 -7.328125000000000000e+01 +1.002015000000000100e+00 -7.328125000000000000e+01 +1.002020000000000133e+00 -7.321875000000000000e+01 +1.002025000000000166e+00 -7.325000000000000000e+01 +1.002029999999999976e+00 -7.321875000000000000e+01 +1.002035000000000009e+00 -7.318750000000000000e+01 +1.002040000000000042e+00 -7.331250000000000000e+01 +1.002045000000000075e+00 -7.321875000000000000e+01 +1.002050000000000107e+00 -7.331250000000000000e+01 +1.002055000000000140e+00 -7.331250000000000000e+01 +1.002060000000000173e+00 -7.328125000000000000e+01 +1.002064999999999984e+00 -7.321875000000000000e+01 +1.002070000000000016e+00 -7.328125000000000000e+01 +1.002075000000000049e+00 -7.328125000000000000e+01 +1.002080000000000082e+00 -7.328125000000000000e+01 +1.002085000000000115e+00 -7.328125000000000000e+01 +1.002090000000000147e+00 -7.328125000000000000e+01 +1.002095000000000180e+00 -7.331250000000000000e+01 +1.002099999999999991e+00 -7.321875000000000000e+01 +1.002105000000000024e+00 -7.328125000000000000e+01 +1.002110000000000056e+00 -7.328125000000000000e+01 +1.002115000000000089e+00 -7.331250000000000000e+01 +1.002120000000000122e+00 -7.328125000000000000e+01 +1.002125000000000155e+00 -7.321875000000000000e+01 +1.002130000000000187e+00 -7.328125000000000000e+01 +1.002134999999999998e+00 -7.328125000000000000e+01 +1.002140000000000031e+00 -7.321875000000000000e+01 +1.002145000000000064e+00 -7.318750000000000000e+01 +1.002150000000000096e+00 -7.315625000000000000e+01 +1.002155000000000129e+00 -7.318750000000000000e+01 +1.002160000000000162e+00 -7.325000000000000000e+01 +1.002164999999999973e+00 -7.321875000000000000e+01 +1.002170000000000005e+00 -7.328125000000000000e+01 +1.002175000000000038e+00 -7.328125000000000000e+01 +1.002180000000000071e+00 -7.328125000000000000e+01 +1.002185000000000104e+00 -7.325000000000000000e+01 +1.002190000000000136e+00 -7.325000000000000000e+01 +1.002195000000000169e+00 -7.334375000000000000e+01 +1.002199999999999980e+00 -7.325000000000000000e+01 +1.002205000000000013e+00 -7.321875000000000000e+01 +1.002210000000000045e+00 -7.321875000000000000e+01 +1.002215000000000078e+00 -7.328125000000000000e+01 +1.002220000000000111e+00 -7.325000000000000000e+01 +1.002225000000000144e+00 -7.321875000000000000e+01 +1.002230000000000176e+00 -7.325000000000000000e+01 +1.002234999999999987e+00 -7.328125000000000000e+01 +1.002240000000000020e+00 -7.321875000000000000e+01 +1.002245000000000053e+00 -7.321875000000000000e+01 +1.002250000000000085e+00 -7.328125000000000000e+01 +1.002255000000000118e+00 -7.328125000000000000e+01 +1.002260000000000151e+00 -7.328125000000000000e+01 +1.002265000000000184e+00 -7.325000000000000000e+01 +1.002269999999999994e+00 -7.325000000000000000e+01 +1.002275000000000027e+00 -7.325000000000000000e+01 +1.002280000000000060e+00 -7.334375000000000000e+01 +1.002285000000000093e+00 -7.325000000000000000e+01 +1.002290000000000125e+00 -7.321875000000000000e+01 +1.002295000000000158e+00 -7.328125000000000000e+01 +1.002300000000000191e+00 -7.328125000000000000e+01 +1.002305000000000001e+00 -7.331250000000000000e+01 +1.002310000000000034e+00 -7.325000000000000000e+01 +1.002315000000000067e+00 -7.321875000000000000e+01 +1.002320000000000100e+00 -7.321875000000000000e+01 +1.002325000000000133e+00 -7.318750000000000000e+01 +1.002330000000000165e+00 -7.321875000000000000e+01 +1.002334999999999976e+00 -7.318750000000000000e+01 +1.002340000000000009e+00 -7.325000000000000000e+01 +1.002345000000000041e+00 -7.318750000000000000e+01 +1.002350000000000074e+00 -7.321875000000000000e+01 +1.002355000000000107e+00 -7.318750000000000000e+01 +1.002360000000000140e+00 -7.318750000000000000e+01 +1.002365000000000173e+00 -7.325000000000000000e+01 +1.002369999999999983e+00 -7.318750000000000000e+01 +1.002375000000000016e+00 -7.321875000000000000e+01 +1.002380000000000049e+00 -7.328125000000000000e+01 +1.002385000000000081e+00 -7.325000000000000000e+01 +1.002390000000000114e+00 -7.321875000000000000e+01 +1.002395000000000147e+00 -7.328125000000000000e+01 +1.002400000000000180e+00 -7.328125000000000000e+01 +1.002404999999999990e+00 -7.334375000000000000e+01 +1.002410000000000023e+00 -7.321875000000000000e+01 +1.002415000000000056e+00 -7.331250000000000000e+01 +1.002420000000000089e+00 -7.325000000000000000e+01 +1.002425000000000122e+00 -7.325000000000000000e+01 +1.002430000000000154e+00 -7.328125000000000000e+01 +1.002435000000000187e+00 -7.328125000000000000e+01 +1.002439999999999998e+00 -7.334375000000000000e+01 +1.002445000000000030e+00 -7.331250000000000000e+01 +1.002450000000000063e+00 -7.325000000000000000e+01 +1.002455000000000096e+00 -7.328125000000000000e+01 +1.002460000000000129e+00 -7.325000000000000000e+01 +1.002465000000000162e+00 -7.321875000000000000e+01 +1.002469999999999972e+00 -7.321875000000000000e+01 +1.002475000000000005e+00 -7.321875000000000000e+01 +1.002480000000000038e+00 -7.334375000000000000e+01 +1.002485000000000070e+00 -7.328125000000000000e+01 +1.002490000000000103e+00 -7.328125000000000000e+01 +1.002495000000000136e+00 -7.328125000000000000e+01 +1.002500000000000169e+00 -7.331250000000000000e+01 +1.002504999999999979e+00 -7.321875000000000000e+01 +1.002510000000000012e+00 -7.328125000000000000e+01 +1.002515000000000045e+00 -7.331250000000000000e+01 +1.002520000000000078e+00 -7.328125000000000000e+01 +1.002525000000000110e+00 -7.328125000000000000e+01 +1.002530000000000143e+00 -7.334375000000000000e+01 +1.002535000000000176e+00 -7.331250000000000000e+01 +1.002539999999999987e+00 -7.328125000000000000e+01 +1.002545000000000019e+00 -7.337500000000000000e+01 +1.002550000000000052e+00 -7.328125000000000000e+01 +1.002555000000000085e+00 -7.331250000000000000e+01 +1.002560000000000118e+00 -7.325000000000000000e+01 +1.002565000000000150e+00 -7.331250000000000000e+01 +1.002570000000000183e+00 -7.328125000000000000e+01 +1.002574999999999994e+00 -7.331250000000000000e+01 +1.002580000000000027e+00 -7.331250000000000000e+01 +1.002585000000000059e+00 -7.331250000000000000e+01 +1.002590000000000092e+00 -7.331250000000000000e+01 +1.002595000000000125e+00 -7.334375000000000000e+01 +1.002600000000000158e+00 -7.331250000000000000e+01 +1.002605000000000190e+00 -7.334375000000000000e+01 +1.002610000000000001e+00 -7.331250000000000000e+01 +1.002615000000000034e+00 -7.337500000000000000e+01 +1.002620000000000067e+00 -7.328125000000000000e+01 +1.002625000000000099e+00 -7.331250000000000000e+01 +1.002630000000000132e+00 -7.331250000000000000e+01 +1.002635000000000165e+00 -7.334375000000000000e+01 +1.002639999999999976e+00 -7.331250000000000000e+01 +1.002645000000000008e+00 -7.331250000000000000e+01 +1.002650000000000041e+00 -7.331250000000000000e+01 +1.002655000000000074e+00 -7.331250000000000000e+01 +1.002660000000000107e+00 -7.334375000000000000e+01 +1.002665000000000139e+00 -7.334375000000000000e+01 +1.002670000000000172e+00 -7.328125000000000000e+01 +1.002674999999999983e+00 -7.331250000000000000e+01 +1.002680000000000016e+00 -7.325000000000000000e+01 +1.002685000000000048e+00 -7.325000000000000000e+01 +1.002690000000000081e+00 -7.331250000000000000e+01 +1.002695000000000114e+00 -7.337500000000000000e+01 +1.002700000000000147e+00 -7.328125000000000000e+01 +1.002705000000000179e+00 -7.331250000000000000e+01 +1.002709999999999990e+00 -7.328125000000000000e+01 +1.002715000000000023e+00 -7.331250000000000000e+01 +1.002720000000000056e+00 -7.331250000000000000e+01 +1.002725000000000088e+00 -7.331250000000000000e+01 +1.002730000000000121e+00 -7.328125000000000000e+01 +1.002735000000000154e+00 -7.328125000000000000e+01 +1.002740000000000187e+00 -7.331250000000000000e+01 +1.002744999999999997e+00 -7.334375000000000000e+01 +1.002750000000000030e+00 -7.328125000000000000e+01 +1.002755000000000063e+00 -7.334375000000000000e+01 +1.002760000000000096e+00 -7.331250000000000000e+01 +1.002765000000000128e+00 -7.331250000000000000e+01 +1.002770000000000161e+00 -7.331250000000000000e+01 +1.002774999999999972e+00 -7.328125000000000000e+01 +1.002780000000000005e+00 -7.328125000000000000e+01 +1.002785000000000037e+00 -7.334375000000000000e+01 +1.002790000000000070e+00 -7.334375000000000000e+01 +1.002795000000000103e+00 -7.328125000000000000e+01 +1.002800000000000136e+00 -7.340625000000000000e+01 +1.002805000000000168e+00 -7.328125000000000000e+01 +1.002809999999999979e+00 -7.328125000000000000e+01 +1.002815000000000012e+00 -7.331250000000000000e+01 +1.002820000000000045e+00 -7.334375000000000000e+01 +1.002825000000000077e+00 -7.334375000000000000e+01 +1.002830000000000110e+00 -7.328125000000000000e+01 +1.002835000000000143e+00 -7.334375000000000000e+01 +1.002840000000000176e+00 -7.331250000000000000e+01 +1.002844999999999986e+00 -7.334375000000000000e+01 +1.002850000000000019e+00 -7.331250000000000000e+01 +1.002855000000000052e+00 -7.331250000000000000e+01 +1.002860000000000085e+00 -7.334375000000000000e+01 +1.002865000000000117e+00 -7.334375000000000000e+01 +1.002870000000000150e+00 -7.334375000000000000e+01 +1.002875000000000183e+00 -7.337500000000000000e+01 +1.002879999999999994e+00 -7.328125000000000000e+01 +1.002885000000000026e+00 -7.337500000000000000e+01 +1.002890000000000059e+00 -7.334375000000000000e+01 +1.002895000000000092e+00 -7.328125000000000000e+01 +1.002900000000000125e+00 -7.337500000000000000e+01 +1.002905000000000157e+00 -7.331250000000000000e+01 +1.002910000000000190e+00 -7.328125000000000000e+01 +1.002915000000000001e+00 -7.331250000000000000e+01 +1.002920000000000034e+00 -7.334375000000000000e+01 +1.002925000000000066e+00 -7.328125000000000000e+01 +1.002930000000000099e+00 -7.328125000000000000e+01 +1.002935000000000132e+00 -7.331250000000000000e+01 +1.002940000000000165e+00 -7.331250000000000000e+01 +1.002944999999999975e+00 -7.337500000000000000e+01 +1.002950000000000008e+00 -7.328125000000000000e+01 +1.002955000000000041e+00 -7.328125000000000000e+01 +1.002960000000000074e+00 -7.331250000000000000e+01 +1.002965000000000106e+00 -7.334375000000000000e+01 +1.002970000000000139e+00 -7.328125000000000000e+01 +1.002975000000000172e+00 -7.334375000000000000e+01 +1.002979999999999983e+00 -7.334375000000000000e+01 +1.002985000000000015e+00 -7.334375000000000000e+01 +1.002990000000000048e+00 -7.337500000000000000e+01 +1.002995000000000081e+00 -7.337500000000000000e+01 +1.003000000000000114e+00 -7.340625000000000000e+01 +1.003005000000000146e+00 -7.334375000000000000e+01 +1.003010000000000179e+00 -7.331250000000000000e+01 +1.003014999999999990e+00 -7.340625000000000000e+01 +1.003020000000000023e+00 -7.334375000000000000e+01 +1.003025000000000055e+00 -7.340625000000000000e+01 +1.003030000000000088e+00 -7.334375000000000000e+01 +1.003035000000000121e+00 -7.334375000000000000e+01 +1.003040000000000154e+00 -7.334375000000000000e+01 +1.003045000000000186e+00 -7.331250000000000000e+01 +1.003049999999999997e+00 -7.337500000000000000e+01 +1.003055000000000030e+00 -7.331250000000000000e+01 +1.003060000000000063e+00 -7.331250000000000000e+01 +1.003065000000000095e+00 -7.334375000000000000e+01 +1.003070000000000128e+00 -7.331250000000000000e+01 +1.003075000000000161e+00 -7.331250000000000000e+01 +1.003079999999999972e+00 -7.334375000000000000e+01 +1.003085000000000004e+00 -7.328125000000000000e+01 +1.003090000000000037e+00 -7.337500000000000000e+01 +1.003095000000000070e+00 -7.334375000000000000e+01 +1.003100000000000103e+00 -7.331250000000000000e+01 +1.003105000000000135e+00 -7.334375000000000000e+01 +1.003110000000000168e+00 -7.334375000000000000e+01 +1.003114999999999979e+00 -7.331250000000000000e+01 +1.003120000000000012e+00 -7.331250000000000000e+01 +1.003125000000000044e+00 -7.331250000000000000e+01 +1.003130000000000077e+00 -7.328125000000000000e+01 +1.003135000000000110e+00 -7.331250000000000000e+01 +1.003140000000000143e+00 -7.331250000000000000e+01 +1.003145000000000175e+00 -7.331250000000000000e+01 +1.003149999999999986e+00 -7.334375000000000000e+01 +1.003155000000000019e+00 -7.334375000000000000e+01 +1.003160000000000052e+00 -7.334375000000000000e+01 +1.003165000000000084e+00 -7.340625000000000000e+01 +1.003170000000000117e+00 -7.328125000000000000e+01 +1.003175000000000150e+00 -7.334375000000000000e+01 +1.003180000000000183e+00 -7.331250000000000000e+01 +1.003184999999999993e+00 -7.328125000000000000e+01 +1.003190000000000026e+00 -7.328125000000000000e+01 +1.003195000000000059e+00 -7.331250000000000000e+01 +1.003200000000000092e+00 -7.334375000000000000e+01 +1.003205000000000124e+00 -7.334375000000000000e+01 +1.003210000000000157e+00 -7.334375000000000000e+01 +1.003215000000000190e+00 -7.340625000000000000e+01 +1.003220000000000001e+00 -7.334375000000000000e+01 +1.003225000000000033e+00 -7.331250000000000000e+01 +1.003230000000000066e+00 -7.331250000000000000e+01 +1.003235000000000099e+00 -7.331250000000000000e+01 +1.003240000000000132e+00 -7.334375000000000000e+01 +1.003245000000000164e+00 -7.337500000000000000e+01 +1.003249999999999975e+00 -7.331250000000000000e+01 +1.003255000000000008e+00 -7.331250000000000000e+01 +1.003260000000000041e+00 -7.328125000000000000e+01 +1.003265000000000073e+00 -7.328125000000000000e+01 +1.003270000000000106e+00 -7.334375000000000000e+01 +1.003275000000000139e+00 -7.337500000000000000e+01 +1.003280000000000172e+00 -7.337500000000000000e+01 +1.003284999999999982e+00 -7.331250000000000000e+01 +1.003290000000000015e+00 -7.337500000000000000e+01 +1.003295000000000048e+00 -7.334375000000000000e+01 +1.003300000000000081e+00 -7.334375000000000000e+01 +1.003305000000000113e+00 -7.337500000000000000e+01 +1.003310000000000146e+00 -7.331250000000000000e+01 +1.003315000000000179e+00 -7.331250000000000000e+01 +1.003319999999999990e+00 -7.334375000000000000e+01 +1.003325000000000022e+00 -7.334375000000000000e+01 +1.003330000000000055e+00 -7.331250000000000000e+01 +1.003335000000000088e+00 -7.334375000000000000e+01 +1.003340000000000121e+00 -7.331250000000000000e+01 +1.003345000000000153e+00 -7.328125000000000000e+01 +1.003350000000000186e+00 -7.337500000000000000e+01 +1.003354999999999997e+00 -7.331250000000000000e+01 +1.003360000000000030e+00 -7.337500000000000000e+01 +1.003365000000000062e+00 -7.331250000000000000e+01 +1.003370000000000095e+00 -7.340625000000000000e+01 +1.003375000000000128e+00 -7.337500000000000000e+01 +1.003380000000000161e+00 -7.334375000000000000e+01 +1.003384999999999971e+00 -7.331250000000000000e+01 +1.003390000000000004e+00 -7.340625000000000000e+01 +1.003395000000000037e+00 -7.334375000000000000e+01 +1.003400000000000070e+00 -7.337500000000000000e+01 +1.003405000000000102e+00 -7.334375000000000000e+01 +1.003410000000000135e+00 -7.331250000000000000e+01 +1.003415000000000168e+00 -7.334375000000000000e+01 +1.003419999999999979e+00 -7.331250000000000000e+01 +1.003425000000000011e+00 -7.334375000000000000e+01 +1.003430000000000044e+00 -7.334375000000000000e+01 +1.003435000000000077e+00 -7.337500000000000000e+01 +1.003440000000000110e+00 -7.328125000000000000e+01 +1.003445000000000142e+00 -7.334375000000000000e+01 +1.003450000000000175e+00 -7.337500000000000000e+01 +1.003454999999999986e+00 -7.334375000000000000e+01 +1.003460000000000019e+00 -7.337500000000000000e+01 +1.003465000000000051e+00 -7.334375000000000000e+01 +1.003470000000000084e+00 -7.337500000000000000e+01 +1.003475000000000117e+00 -7.331250000000000000e+01 +1.003480000000000150e+00 -7.331250000000000000e+01 +1.003485000000000182e+00 -7.331250000000000000e+01 +1.003489999999999993e+00 -7.337500000000000000e+01 +1.003495000000000026e+00 -7.331250000000000000e+01 +1.003500000000000059e+00 -7.334375000000000000e+01 +1.003505000000000091e+00 -7.340625000000000000e+01 +1.003510000000000124e+00 -7.334375000000000000e+01 +1.003515000000000157e+00 -7.334375000000000000e+01 +1.003520000000000190e+00 -7.340625000000000000e+01 +1.003525000000000000e+00 -7.334375000000000000e+01 +1.003530000000000033e+00 -7.334375000000000000e+01 +1.003535000000000066e+00 -7.340625000000000000e+01 +1.003540000000000099e+00 -7.331250000000000000e+01 +1.003545000000000131e+00 -7.331250000000000000e+01 +1.003550000000000164e+00 -7.337500000000000000e+01 +1.003554999999999975e+00 -7.337500000000000000e+01 +1.003560000000000008e+00 -7.334375000000000000e+01 +1.003565000000000040e+00 -7.337500000000000000e+01 +1.003570000000000073e+00 -7.331250000000000000e+01 +1.003575000000000106e+00 -7.331250000000000000e+01 +1.003580000000000139e+00 -7.343750762939453125e+01 +1.003585000000000171e+00 -7.337500000000000000e+01 +1.003589999999999982e+00 -7.334375000000000000e+01 +1.003595000000000015e+00 -7.334375000000000000e+01 +1.003600000000000048e+00 -7.334375000000000000e+01 +1.003605000000000080e+00 -7.337500000000000000e+01 +1.003610000000000113e+00 -7.334375000000000000e+01 +1.003615000000000146e+00 -7.340625000000000000e+01 +1.003620000000000179e+00 -7.334375000000000000e+01 +1.003624999999999989e+00 -7.340625000000000000e+01 +1.003630000000000022e+00 -7.337500000000000000e+01 +1.003635000000000055e+00 -7.337500000000000000e+01 +1.003640000000000088e+00 -7.340625000000000000e+01 +1.003645000000000120e+00 -7.340625000000000000e+01 +1.003650000000000153e+00 -7.337500000000000000e+01 +1.003655000000000186e+00 -7.334375000000000000e+01 +1.003659999999999997e+00 -7.337500000000000000e+01 +1.003665000000000029e+00 -7.340625000000000000e+01 +1.003670000000000062e+00 -7.337500000000000000e+01 +1.003675000000000095e+00 -7.334375000000000000e+01 +1.003680000000000128e+00 -7.343750762939453125e+01 +1.003685000000000160e+00 -7.340625000000000000e+01 +1.003690000000000193e+00 -7.334375000000000000e+01 +1.003695000000000004e+00 -7.334375000000000000e+01 +1.003700000000000037e+00 -7.334375000000000000e+01 +1.003705000000000069e+00 -7.334375000000000000e+01 +1.003710000000000102e+00 -7.334375000000000000e+01 +1.003715000000000135e+00 -7.331250000000000000e+01 +1.003720000000000168e+00 -7.337500000000000000e+01 +1.003724999999999978e+00 -7.334375000000000000e+01 +1.003730000000000011e+00 -7.334375000000000000e+01 +1.003735000000000044e+00 -7.340625000000000000e+01 +1.003740000000000077e+00 -7.334375000000000000e+01 +1.003745000000000109e+00 -7.340625000000000000e+01 +1.003750000000000142e+00 -7.340625000000000000e+01 +1.003755000000000175e+00 -7.334375000000000000e+01 +1.003759999999999986e+00 -7.334375000000000000e+01 +1.003765000000000018e+00 -7.340625000000000000e+01 +1.003770000000000051e+00 -7.337500000000000000e+01 +1.003775000000000084e+00 -7.331250000000000000e+01 +1.003780000000000117e+00 -7.334375000000000000e+01 +1.003785000000000149e+00 -7.334375000000000000e+01 +1.003790000000000182e+00 -7.331250000000000000e+01 +1.003794999999999993e+00 -7.334375000000000000e+01 +1.003800000000000026e+00 -7.334375000000000000e+01 +1.003805000000000058e+00 -7.328125000000000000e+01 +1.003810000000000091e+00 -7.328125000000000000e+01 +1.003815000000000124e+00 -7.334375000000000000e+01 +1.003820000000000157e+00 -7.328125000000000000e+01 +1.003825000000000189e+00 -7.334375000000000000e+01 +1.003830000000000000e+00 -7.334375000000000000e+01 +1.003835000000000033e+00 -7.334375000000000000e+01 +1.003840000000000066e+00 -7.337500000000000000e+01 +1.003845000000000098e+00 -7.337500000000000000e+01 +1.003850000000000131e+00 -7.337500000000000000e+01 +1.003855000000000164e+00 -7.340625000000000000e+01 +1.003859999999999975e+00 -7.334375000000000000e+01 +1.003865000000000007e+00 -7.334375000000000000e+01 +1.003870000000000040e+00 -7.337500000000000000e+01 +1.003875000000000073e+00 -7.337500000000000000e+01 +1.003880000000000106e+00 -7.337500000000000000e+01 +1.003885000000000138e+00 -7.346875000000000000e+01 +1.003890000000000171e+00 -7.337500000000000000e+01 +1.003894999999999982e+00 -7.337500000000000000e+01 +1.003900000000000015e+00 -7.337500000000000000e+01 +1.003905000000000047e+00 -7.340625000000000000e+01 +1.003910000000000080e+00 -7.340625000000000000e+01 +1.003915000000000113e+00 -7.331250000000000000e+01 +1.003920000000000146e+00 -7.334375000000000000e+01 +1.003925000000000178e+00 -7.337500000000000000e+01 +1.003929999999999989e+00 -7.340625000000000000e+01 +1.003935000000000022e+00 -7.343750762939453125e+01 +1.003940000000000055e+00 -7.340625000000000000e+01 +1.003945000000000087e+00 -7.343750762939453125e+01 +1.003950000000000120e+00 -7.334375000000000000e+01 +1.003955000000000153e+00 -7.334375000000000000e+01 +1.003960000000000186e+00 -7.334375000000000000e+01 +1.003964999999999996e+00 -7.337500000000000000e+01 +1.003970000000000029e+00 -7.331250000000000000e+01 +1.003975000000000062e+00 -7.343750762939453125e+01 +1.003980000000000095e+00 -7.334375000000000000e+01 +1.003985000000000127e+00 -7.340625000000000000e+01 +1.003990000000000160e+00 -7.334375000000000000e+01 +1.003995000000000193e+00 -7.334375000000000000e+01 +1.004000000000000004e+00 -7.337500000000000000e+01 +1.004005000000000036e+00 -7.337500000000000000e+01 +1.004010000000000069e+00 -7.334375000000000000e+01 +1.004015000000000102e+00 -7.334375000000000000e+01 +1.004020000000000135e+00 -7.331250000000000000e+01 +1.004025000000000167e+00 -7.334375000000000000e+01 +1.004029999999999978e+00 -7.334375000000000000e+01 +1.004035000000000011e+00 -7.334375000000000000e+01 +1.004040000000000044e+00 -7.334375000000000000e+01 +1.004045000000000076e+00 -7.334375000000000000e+01 +1.004050000000000109e+00 -7.337500000000000000e+01 +1.004055000000000142e+00 -7.328125000000000000e+01 +1.004060000000000175e+00 -7.334375000000000000e+01 +1.004064999999999985e+00 -7.328125000000000000e+01 +1.004070000000000018e+00 -7.337500000000000000e+01 +1.004075000000000051e+00 -7.334375000000000000e+01 +1.004080000000000084e+00 -7.334375000000000000e+01 +1.004085000000000116e+00 -7.337500000000000000e+01 +1.004090000000000149e+00 -7.331250000000000000e+01 +1.004095000000000182e+00 -7.337500000000000000e+01 +1.004099999999999993e+00 -7.331250000000000000e+01 +1.004105000000000025e+00 -7.340625000000000000e+01 +1.004110000000000058e+00 -7.331250000000000000e+01 +1.004115000000000091e+00 -7.334375000000000000e+01 +1.004120000000000124e+00 -7.334375000000000000e+01 +1.004125000000000156e+00 -7.337500000000000000e+01 +1.004130000000000189e+00 -7.337500000000000000e+01 +1.004135000000000000e+00 -7.334375000000000000e+01 +1.004140000000000033e+00 -7.337500000000000000e+01 +1.004145000000000065e+00 -7.337500000000000000e+01 +1.004150000000000098e+00 -7.337500000000000000e+01 +1.004155000000000131e+00 -7.337500000000000000e+01 +1.004160000000000164e+00 -7.337500000000000000e+01 +1.004164999999999974e+00 -7.337500000000000000e+01 +1.004170000000000007e+00 -7.334375000000000000e+01 +1.004175000000000040e+00 -7.340625000000000000e+01 +1.004180000000000073e+00 -7.340625000000000000e+01 +1.004185000000000105e+00 -7.334375000000000000e+01 +1.004190000000000138e+00 -7.340625000000000000e+01 +1.004195000000000171e+00 -7.334375000000000000e+01 +1.004199999999999982e+00 -7.340625000000000000e+01 +1.004205000000000014e+00 -7.331250000000000000e+01 +1.004210000000000047e+00 -7.334375000000000000e+01 +1.004215000000000080e+00 -7.334375000000000000e+01 +1.004220000000000113e+00 -7.334375000000000000e+01 +1.004225000000000145e+00 -7.334375000000000000e+01 +1.004230000000000178e+00 -7.331250000000000000e+01 +1.004234999999999989e+00 -7.337500000000000000e+01 +1.004240000000000022e+00 -7.331250000000000000e+01 +1.004245000000000054e+00 -7.331250000000000000e+01 +1.004250000000000087e+00 -7.331250000000000000e+01 +1.004255000000000120e+00 -7.328125000000000000e+01 +1.004260000000000153e+00 -7.337500000000000000e+01 +1.004265000000000185e+00 -7.340625000000000000e+01 +1.004269999999999996e+00 -7.334375000000000000e+01 +1.004275000000000029e+00 -7.337500000000000000e+01 +1.004280000000000062e+00 -7.337500000000000000e+01 +1.004285000000000094e+00 -7.340625000000000000e+01 +1.004290000000000127e+00 -7.331250000000000000e+01 +1.004295000000000160e+00 -7.334375000000000000e+01 +1.004300000000000193e+00 -7.334375000000000000e+01 +1.004305000000000003e+00 -7.334375000000000000e+01 +1.004310000000000036e+00 -7.331250000000000000e+01 +1.004315000000000069e+00 -7.334375000000000000e+01 +1.004320000000000102e+00 -7.331250000000000000e+01 +1.004325000000000134e+00 -7.334375000000000000e+01 +1.004330000000000167e+00 -7.340625000000000000e+01 +1.004334999999999978e+00 -7.343750762939453125e+01 +1.004340000000000011e+00 -7.334375000000000000e+01 +1.004345000000000043e+00 -7.334375000000000000e+01 +1.004350000000000076e+00 -7.331250000000000000e+01 +1.004355000000000109e+00 -7.334375000000000000e+01 +1.004360000000000142e+00 -7.343750762939453125e+01 +1.004365000000000174e+00 -7.337500000000000000e+01 +1.004369999999999985e+00 -7.331250000000000000e+01 +1.004375000000000018e+00 -7.334375000000000000e+01 +1.004380000000000051e+00 -7.340625000000000000e+01 +1.004385000000000083e+00 -7.331250000000000000e+01 +1.004390000000000116e+00 -7.337500000000000000e+01 +1.004395000000000149e+00 -7.337500000000000000e+01 +1.004400000000000182e+00 -7.334375000000000000e+01 +1.004404999999999992e+00 -7.334375000000000000e+01 +1.004410000000000025e+00 -7.340625000000000000e+01 +1.004415000000000058e+00 -7.334375000000000000e+01 +1.004420000000000091e+00 -7.331250000000000000e+01 +1.004425000000000123e+00 -7.337500000000000000e+01 +1.004430000000000156e+00 -7.334375000000000000e+01 +1.004435000000000189e+00 -7.337500000000000000e+01 +1.004440000000000000e+00 -7.334375000000000000e+01 +1.004445000000000032e+00 -7.328125000000000000e+01 +1.004450000000000065e+00 -7.334375000000000000e+01 +1.004455000000000098e+00 -7.331250000000000000e+01 +1.004460000000000131e+00 -7.337500000000000000e+01 +1.004465000000000163e+00 -7.340625000000000000e+01 +1.004469999999999974e+00 -7.334375000000000000e+01 +1.004475000000000007e+00 -7.337500000000000000e+01 +1.004480000000000040e+00 -7.334375000000000000e+01 +1.004485000000000072e+00 -7.337500000000000000e+01 +1.004490000000000105e+00 -7.337500000000000000e+01 +1.004495000000000138e+00 -7.340625000000000000e+01 +1.004500000000000171e+00 -7.337500000000000000e+01 +1.004504999999999981e+00 -7.334375000000000000e+01 +1.004510000000000014e+00 -7.325000000000000000e+01 +1.004515000000000047e+00 -7.331250000000000000e+01 +1.004520000000000080e+00 -7.334375000000000000e+01 +1.004525000000000112e+00 -7.334375000000000000e+01 +1.004530000000000145e+00 -7.334375000000000000e+01 +1.004535000000000178e+00 -7.337500000000000000e+01 +1.004539999999999988e+00 -7.331250000000000000e+01 +1.004545000000000021e+00 -7.331250000000000000e+01 +1.004550000000000054e+00 -7.334375000000000000e+01 +1.004555000000000087e+00 -7.325000000000000000e+01 +1.004560000000000120e+00 -7.331250000000000000e+01 +1.004565000000000152e+00 -7.328125000000000000e+01 +1.004570000000000185e+00 -7.334375000000000000e+01 +1.004574999999999996e+00 -7.334375000000000000e+01 +1.004580000000000028e+00 -7.334375000000000000e+01 +1.004585000000000061e+00 -7.331250000000000000e+01 +1.004590000000000094e+00 -7.331250000000000000e+01 +1.004595000000000127e+00 -7.337500000000000000e+01 +1.004600000000000160e+00 -7.340625000000000000e+01 +1.004605000000000192e+00 -7.334375000000000000e+01 +1.004610000000000003e+00 -7.340625000000000000e+01 +1.004615000000000036e+00 -7.334375000000000000e+01 +1.004620000000000068e+00 -7.334375000000000000e+01 +1.004625000000000101e+00 -7.334375000000000000e+01 +1.004630000000000134e+00 -7.328125000000000000e+01 +1.004635000000000167e+00 -7.334375000000000000e+01 +1.004639999999999977e+00 -7.334375000000000000e+01 +1.004645000000000010e+00 -7.337500000000000000e+01 +1.004650000000000043e+00 -7.340625000000000000e+01 +1.004655000000000076e+00 -7.331250000000000000e+01 +1.004660000000000108e+00 -7.331250000000000000e+01 +1.004665000000000141e+00 -7.334375000000000000e+01 +1.004670000000000174e+00 -7.337500000000000000e+01 +1.004674999999999985e+00 -7.340625000000000000e+01 +1.004680000000000017e+00 -7.337500000000000000e+01 +1.004685000000000050e+00 -7.334375000000000000e+01 +1.004690000000000083e+00 -7.337500000000000000e+01 +1.004695000000000116e+00 -7.334375000000000000e+01 +1.004700000000000149e+00 -7.337500000000000000e+01 +1.004705000000000181e+00 -7.334375000000000000e+01 +1.004709999999999992e+00 -7.337500000000000000e+01 +1.004715000000000025e+00 -7.340625000000000000e+01 +1.004720000000000057e+00 -7.340625000000000000e+01 +1.004725000000000090e+00 -7.334375000000000000e+01 +1.004730000000000123e+00 -7.334375000000000000e+01 +1.004735000000000156e+00 -7.334375000000000000e+01 +1.004740000000000189e+00 -7.337500000000000000e+01 +1.004744999999999999e+00 -7.334375000000000000e+01 +1.004750000000000032e+00 -7.337500000000000000e+01 +1.004755000000000065e+00 -7.328125000000000000e+01 +1.004760000000000097e+00 -7.334375000000000000e+01 +1.004765000000000130e+00 -7.340625000000000000e+01 +1.004770000000000163e+00 -7.340625000000000000e+01 +1.004774999999999974e+00 -7.340625000000000000e+01 +1.004780000000000006e+00 -7.337500000000000000e+01 +1.004785000000000039e+00 -7.331250000000000000e+01 +1.004790000000000072e+00 -7.334375000000000000e+01 +1.004795000000000105e+00 -7.334375000000000000e+01 +1.004800000000000137e+00 -7.337500000000000000e+01 +1.004805000000000170e+00 -7.337500000000000000e+01 +1.004809999999999981e+00 -7.337500000000000000e+01 +1.004815000000000014e+00 -7.334375000000000000e+01 +1.004820000000000046e+00 -7.334375000000000000e+01 +1.004825000000000079e+00 -7.340625000000000000e+01 +1.004830000000000112e+00 -7.337500000000000000e+01 +1.004835000000000145e+00 -7.334375000000000000e+01 +1.004840000000000177e+00 -7.334375000000000000e+01 +1.004844999999999988e+00 -7.337500000000000000e+01 +1.004850000000000021e+00 -7.331250000000000000e+01 +1.004855000000000054e+00 -7.334375000000000000e+01 +1.004860000000000086e+00 -7.331250000000000000e+01 +1.004865000000000119e+00 -7.328125000000000000e+01 +1.004870000000000152e+00 -7.328125000000000000e+01 +1.004875000000000185e+00 -7.331250000000000000e+01 +1.004879999999999995e+00 -7.334375000000000000e+01 +1.004885000000000028e+00 -7.331250000000000000e+01 +1.004890000000000061e+00 -7.334375000000000000e+01 +1.004895000000000094e+00 -7.328125000000000000e+01 +1.004900000000000126e+00 -7.331250000000000000e+01 +1.004905000000000159e+00 -7.331250000000000000e+01 +1.004910000000000192e+00 -7.331250000000000000e+01 +1.004915000000000003e+00 -7.331250000000000000e+01 +1.004920000000000035e+00 -7.328125000000000000e+01 +1.004925000000000068e+00 -7.334375000000000000e+01 +1.004930000000000101e+00 -7.337500000000000000e+01 +1.004935000000000134e+00 -7.337500000000000000e+01 +1.004940000000000166e+00 -7.340625000000000000e+01 +1.004944999999999977e+00 -7.334375000000000000e+01 +1.004950000000000010e+00 -7.340625000000000000e+01 +1.004955000000000043e+00 -7.334375000000000000e+01 +1.004960000000000075e+00 -7.331250000000000000e+01 +1.004965000000000108e+00 -7.334375000000000000e+01 +1.004970000000000141e+00 -7.337500000000000000e+01 +1.004975000000000174e+00 -7.334375000000000000e+01 +1.004979999999999984e+00 -7.337500000000000000e+01 +1.004985000000000017e+00 -7.331250000000000000e+01 +1.004990000000000050e+00 -7.337500000000000000e+01 +1.004995000000000083e+00 -7.337500000000000000e+01 +1.005000000000000115e+00 -7.331250000000000000e+01 +1.005005000000000148e+00 -7.340625000000000000e+01 +1.005010000000000181e+00 -7.334375000000000000e+01 +1.005014999999999992e+00 -7.340625000000000000e+01 +1.005020000000000024e+00 -7.337500000000000000e+01 +1.005025000000000057e+00 -7.337500000000000000e+01 +1.005030000000000090e+00 -7.340625000000000000e+01 +1.005035000000000123e+00 -7.337500000000000000e+01 +1.005040000000000155e+00 -7.340625000000000000e+01 +1.005045000000000188e+00 -7.334375000000000000e+01 +1.005049999999999999e+00 -7.340625000000000000e+01 +1.005055000000000032e+00 -7.334375000000000000e+01 +1.005060000000000064e+00 -7.334375000000000000e+01 +1.005065000000000097e+00 -7.334375000000000000e+01 +1.005070000000000130e+00 -7.337500000000000000e+01 +1.005075000000000163e+00 -7.337500000000000000e+01 +1.005079999999999973e+00 -7.331250000000000000e+01 +1.005085000000000006e+00 -7.337500000000000000e+01 +1.005090000000000039e+00 -7.337500000000000000e+01 +1.005095000000000072e+00 -7.340625000000000000e+01 +1.005100000000000104e+00 -7.334375000000000000e+01 +1.005105000000000137e+00 -7.334375000000000000e+01 +1.005110000000000170e+00 -7.337500000000000000e+01 +1.005114999999999981e+00 -7.334375000000000000e+01 +1.005120000000000013e+00 -7.331250000000000000e+01 +1.005125000000000046e+00 -7.337500000000000000e+01 +1.005130000000000079e+00 -7.331250000000000000e+01 +1.005135000000000112e+00 -7.334375000000000000e+01 +1.005140000000000144e+00 -7.334375000000000000e+01 +1.005145000000000177e+00 -7.334375000000000000e+01 +1.005149999999999988e+00 -7.337500000000000000e+01 +1.005155000000000021e+00 -7.331250000000000000e+01 +1.005160000000000053e+00 -7.334375000000000000e+01 +1.005165000000000086e+00 -7.337500000000000000e+01 +1.005170000000000119e+00 -7.328125000000000000e+01 +1.005175000000000152e+00 -7.334375000000000000e+01 +1.005180000000000184e+00 -7.334375000000000000e+01 +1.005184999999999995e+00 -7.328125000000000000e+01 +1.005190000000000028e+00 -7.334375000000000000e+01 +1.005195000000000061e+00 -7.337500000000000000e+01 +1.005200000000000093e+00 -7.334375000000000000e+01 +1.005205000000000126e+00 -7.334375000000000000e+01 +1.005210000000000159e+00 -7.337500000000000000e+01 +1.005215000000000192e+00 -7.337500000000000000e+01 +1.005220000000000002e+00 -7.340625000000000000e+01 +1.005225000000000035e+00 -7.340625000000000000e+01 +1.005230000000000068e+00 -7.337500000000000000e+01 +1.005235000000000101e+00 -7.334375000000000000e+01 +1.005240000000000133e+00 -7.340625000000000000e+01 +1.005245000000000166e+00 -7.343750762939453125e+01 +1.005249999999999977e+00 -7.334375000000000000e+01 +1.005255000000000010e+00 -7.337500000000000000e+01 +1.005260000000000042e+00 -7.340625000000000000e+01 +1.005265000000000075e+00 -7.334375000000000000e+01 +1.005270000000000108e+00 -7.337500000000000000e+01 +1.005275000000000141e+00 -7.337500000000000000e+01 +1.005280000000000173e+00 -7.337500000000000000e+01 +1.005284999999999984e+00 -7.337500000000000000e+01 +1.005290000000000017e+00 -7.340625000000000000e+01 +1.005295000000000050e+00 -7.337500000000000000e+01 +1.005300000000000082e+00 -7.337500000000000000e+01 +1.005305000000000115e+00 -7.334375000000000000e+01 +1.005310000000000148e+00 -7.337500000000000000e+01 +1.005315000000000181e+00 -7.328125000000000000e+01 +1.005319999999999991e+00 -7.331250000000000000e+01 +1.005325000000000024e+00 -7.337500000000000000e+01 +1.005330000000000057e+00 -7.334375000000000000e+01 +1.005335000000000090e+00 -7.328125000000000000e+01 +1.005340000000000122e+00 -7.334375000000000000e+01 +1.005345000000000155e+00 -7.334375000000000000e+01 +1.005350000000000188e+00 -7.337500000000000000e+01 +1.005354999999999999e+00 -7.340625000000000000e+01 +1.005360000000000031e+00 -7.334375000000000000e+01 +1.005365000000000064e+00 -7.340625000000000000e+01 +1.005370000000000097e+00 -7.340625000000000000e+01 +1.005375000000000130e+00 -7.337500000000000000e+01 +1.005380000000000162e+00 -7.337500000000000000e+01 +1.005384999999999973e+00 -7.337500000000000000e+01 +1.005390000000000006e+00 -7.337500000000000000e+01 +1.005395000000000039e+00 -7.334375000000000000e+01 +1.005400000000000071e+00 -7.331250000000000000e+01 +1.005405000000000104e+00 -7.331250000000000000e+01 +1.005410000000000137e+00 -7.331250000000000000e+01 +1.005415000000000170e+00 -7.334375000000000000e+01 +1.005419999999999980e+00 -7.337500000000000000e+01 +1.005425000000000013e+00 -7.331250000000000000e+01 +1.005430000000000046e+00 -7.334375000000000000e+01 +1.005435000000000079e+00 -7.331250000000000000e+01 +1.005440000000000111e+00 -7.328125000000000000e+01 +1.005445000000000144e+00 -7.331250000000000000e+01 +1.005450000000000177e+00 -7.331250000000000000e+01 +1.005454999999999988e+00 -7.334375000000000000e+01 +1.005460000000000020e+00 -7.331250000000000000e+01 +1.005465000000000053e+00 -7.328125000000000000e+01 +1.005470000000000086e+00 -7.325000000000000000e+01 +1.005475000000000119e+00 -7.334375000000000000e+01 +1.005480000000000151e+00 -7.331250000000000000e+01 +1.005485000000000184e+00 -7.331250000000000000e+01 +1.005489999999999995e+00 -7.328125000000000000e+01 +1.005495000000000028e+00 -7.331250000000000000e+01 +1.005500000000000060e+00 -7.331250000000000000e+01 +1.005505000000000093e+00 -7.334375000000000000e+01 +1.005510000000000126e+00 -7.334375000000000000e+01 +1.005515000000000159e+00 -7.334375000000000000e+01 +1.005520000000000191e+00 -7.334375000000000000e+01 +1.005525000000000002e+00 -7.337500000000000000e+01 +1.005530000000000035e+00 -7.334375000000000000e+01 +1.005535000000000068e+00 -7.334375000000000000e+01 +1.005540000000000100e+00 -7.334375000000000000e+01 +1.005545000000000133e+00 -7.331250000000000000e+01 +1.005550000000000166e+00 -7.328125000000000000e+01 +1.005554999999999977e+00 -7.328125000000000000e+01 +1.005560000000000009e+00 -7.328125000000000000e+01 +1.005565000000000042e+00 -7.328125000000000000e+01 +1.005570000000000075e+00 -7.328125000000000000e+01 +1.005575000000000108e+00 -7.325000000000000000e+01 +1.005580000000000140e+00 -7.331250000000000000e+01 +1.005585000000000173e+00 -7.331250000000000000e+01 +1.005589999999999984e+00 -7.331250000000000000e+01 +1.005595000000000017e+00 -7.331250000000000000e+01 +1.005600000000000049e+00 -7.331250000000000000e+01 +1.005605000000000082e+00 -7.328125000000000000e+01 +1.005610000000000115e+00 -7.331250000000000000e+01 +1.005615000000000148e+00 -7.337500000000000000e+01 +1.005620000000000180e+00 -7.334375000000000000e+01 +1.005624999999999991e+00 -7.328125000000000000e+01 +1.005630000000000024e+00 -7.331250000000000000e+01 +1.005635000000000057e+00 -7.328125000000000000e+01 +1.005640000000000089e+00 -7.325000000000000000e+01 +1.005645000000000122e+00 -7.325000000000000000e+01 +1.005650000000000155e+00 -7.328125000000000000e+01 +1.005655000000000188e+00 -7.331250000000000000e+01 +1.005659999999999998e+00 -7.325000000000000000e+01 +1.005665000000000031e+00 -7.328125000000000000e+01 +1.005670000000000064e+00 -7.321875000000000000e+01 +1.005675000000000097e+00 -7.331250000000000000e+01 +1.005680000000000129e+00 -7.334375000000000000e+01 +1.005685000000000162e+00 -7.334375000000000000e+01 +1.005689999999999973e+00 -7.328125000000000000e+01 +1.005695000000000006e+00 -7.328125000000000000e+01 +1.005700000000000038e+00 -7.331250000000000000e+01 +1.005705000000000071e+00 -7.334375000000000000e+01 +1.005710000000000104e+00 -7.334375000000000000e+01 +1.005715000000000137e+00 -7.325000000000000000e+01 +1.005720000000000169e+00 -7.331250000000000000e+01 +1.005724999999999980e+00 -7.328125000000000000e+01 +1.005730000000000013e+00 -7.331250000000000000e+01 +1.005735000000000046e+00 -7.328125000000000000e+01 +1.005740000000000078e+00 -7.334375000000000000e+01 +1.005745000000000111e+00 -7.331250000000000000e+01 +1.005750000000000144e+00 -7.331250000000000000e+01 +1.005755000000000177e+00 -7.331250000000000000e+01 +1.005759999999999987e+00 -7.334375000000000000e+01 +1.005765000000000020e+00 -7.328125000000000000e+01 +1.005770000000000053e+00 -7.331250000000000000e+01 +1.005775000000000086e+00 -7.331250000000000000e+01 +1.005780000000000118e+00 -7.328125000000000000e+01 +1.005785000000000151e+00 -7.331250000000000000e+01 +1.005790000000000184e+00 -7.337500000000000000e+01 +1.005794999999999995e+00 -7.328125000000000000e+01 +1.005800000000000027e+00 -7.331250000000000000e+01 +1.005805000000000060e+00 -7.334375000000000000e+01 +1.005810000000000093e+00 -7.334375000000000000e+01 +1.005815000000000126e+00 -7.334375000000000000e+01 +1.005820000000000158e+00 -7.331250000000000000e+01 +1.005825000000000191e+00 -7.328125000000000000e+01 +1.005830000000000002e+00 -7.337500000000000000e+01 +1.005835000000000035e+00 -7.334375000000000000e+01 +1.005840000000000067e+00 -7.334375000000000000e+01 +1.005845000000000100e+00 -7.334375000000000000e+01 +1.005850000000000133e+00 -7.334375000000000000e+01 +1.005855000000000166e+00 -7.334375000000000000e+01 +1.005859999999999976e+00 -7.337500000000000000e+01 +1.005865000000000009e+00 -7.334375000000000000e+01 +1.005870000000000042e+00 -7.331250000000000000e+01 +1.005875000000000075e+00 -7.337500000000000000e+01 +1.005880000000000107e+00 -7.334375000000000000e+01 +1.005885000000000140e+00 -7.331250000000000000e+01 +1.005890000000000173e+00 -7.328125000000000000e+01 +1.005894999999999984e+00 -7.334375000000000000e+01 +1.005900000000000016e+00 -7.334375000000000000e+01 +1.005905000000000049e+00 -7.331250000000000000e+01 +1.005910000000000082e+00 -7.331250000000000000e+01 +1.005915000000000115e+00 -7.328125000000000000e+01 +1.005920000000000147e+00 -7.325000000000000000e+01 +1.005925000000000180e+00 -7.328125000000000000e+01 +1.005929999999999991e+00 -7.334375000000000000e+01 +1.005935000000000024e+00 -7.325000000000000000e+01 +1.005940000000000056e+00 -7.325000000000000000e+01 +1.005945000000000089e+00 -7.328125000000000000e+01 +1.005950000000000122e+00 -7.328125000000000000e+01 +1.005955000000000155e+00 -7.328125000000000000e+01 +1.005960000000000187e+00 -7.328125000000000000e+01 +1.005964999999999998e+00 -7.331250000000000000e+01 +1.005970000000000031e+00 -7.334375000000000000e+01 +1.005975000000000064e+00 -7.331250000000000000e+01 +1.005980000000000096e+00 -7.321875000000000000e+01 +1.005985000000000129e+00 -7.328125000000000000e+01 +1.005990000000000162e+00 -7.328125000000000000e+01 +1.005994999999999973e+00 -7.328125000000000000e+01 +1.006000000000000005e+00 -7.321875000000000000e+01 +1.006005000000000038e+00 -7.321875000000000000e+01 +1.006010000000000071e+00 -7.325000000000000000e+01 +1.006015000000000104e+00 -7.325000000000000000e+01 +1.006020000000000136e+00 -7.328125000000000000e+01 +1.006025000000000169e+00 -7.328125000000000000e+01 +1.006029999999999980e+00 -7.328125000000000000e+01 +1.006035000000000013e+00 -7.325000000000000000e+01 +1.006040000000000045e+00 -7.328125000000000000e+01 +1.006045000000000078e+00 -7.328125000000000000e+01 +1.006050000000000111e+00 -7.331250000000000000e+01 +1.006055000000000144e+00 -7.328125000000000000e+01 +1.006060000000000176e+00 -7.328125000000000000e+01 +1.006064999999999987e+00 -7.325000000000000000e+01 +1.006070000000000020e+00 -7.325000000000000000e+01 +1.006075000000000053e+00 -7.331250000000000000e+01 +1.006080000000000085e+00 -7.328125000000000000e+01 +1.006085000000000118e+00 -7.331250000000000000e+01 +1.006090000000000151e+00 -7.331250000000000000e+01 +1.006095000000000184e+00 -7.331250000000000000e+01 +1.006099999999999994e+00 -7.328125000000000000e+01 +1.006105000000000027e+00 -7.328125000000000000e+01 +1.006110000000000060e+00 -7.334375000000000000e+01 +1.006115000000000093e+00 -7.328125000000000000e+01 +1.006120000000000125e+00 -7.328125000000000000e+01 +1.006125000000000158e+00 -7.334375000000000000e+01 +1.006130000000000191e+00 -7.334375000000000000e+01 +1.006135000000000002e+00 -7.328125000000000000e+01 +1.006140000000000034e+00 -7.337500000000000000e+01 +1.006145000000000067e+00 -7.334375000000000000e+01 +1.006150000000000100e+00 -7.331250000000000000e+01 +1.006155000000000133e+00 -7.334375000000000000e+01 +1.006160000000000165e+00 -7.334375000000000000e+01 +1.006164999999999976e+00 -7.334375000000000000e+01 +1.006170000000000009e+00 -7.334375000000000000e+01 +1.006175000000000042e+00 -7.328125000000000000e+01 +1.006180000000000074e+00 -7.340625000000000000e+01 +1.006185000000000107e+00 -7.331250000000000000e+01 +1.006190000000000140e+00 -7.328125000000000000e+01 +1.006195000000000173e+00 -7.334375000000000000e+01 +1.006199999999999983e+00 -7.340625000000000000e+01 +1.006205000000000016e+00 -7.334375000000000000e+01 +1.006210000000000049e+00 -7.331250000000000000e+01 +1.006215000000000082e+00 -7.334375000000000000e+01 +1.006220000000000114e+00 -7.334375000000000000e+01 +1.006225000000000147e+00 -7.331250000000000000e+01 +1.006230000000000180e+00 -7.334375000000000000e+01 +1.006234999999999991e+00 -7.334375000000000000e+01 +1.006240000000000023e+00 -7.337500000000000000e+01 +1.006245000000000056e+00 -7.328125000000000000e+01 +1.006250000000000089e+00 -7.331250000000000000e+01 +1.006255000000000122e+00 -7.328125000000000000e+01 +1.006260000000000154e+00 -7.328125000000000000e+01 +1.006265000000000187e+00 -7.331250000000000000e+01 +1.006269999999999998e+00 -7.334375000000000000e+01 +1.006275000000000031e+00 -7.334375000000000000e+01 +1.006280000000000063e+00 -7.334375000000000000e+01 +1.006285000000000096e+00 -7.334375000000000000e+01 +1.006290000000000129e+00 -7.331250000000000000e+01 +1.006295000000000162e+00 -7.331250000000000000e+01 +1.006299999999999972e+00 -7.337500000000000000e+01 +1.006305000000000005e+00 -7.334375000000000000e+01 +1.006310000000000038e+00 -7.331250000000000000e+01 +1.006315000000000071e+00 -7.334375000000000000e+01 +1.006320000000000103e+00 -7.334375000000000000e+01 +1.006325000000000136e+00 -7.334375000000000000e+01 +1.006330000000000169e+00 -7.337500000000000000e+01 +1.006334999999999980e+00 -7.340625000000000000e+01 +1.006340000000000012e+00 -7.337500000000000000e+01 +1.006345000000000045e+00 -7.334375000000000000e+01 +1.006350000000000078e+00 -7.331250000000000000e+01 +1.006355000000000111e+00 -7.334375000000000000e+01 +1.006360000000000143e+00 -7.334375000000000000e+01 +1.006365000000000176e+00 -7.334375000000000000e+01 +1.006369999999999987e+00 -7.340625000000000000e+01 +1.006375000000000020e+00 -7.337500000000000000e+01 +1.006380000000000052e+00 -7.334375000000000000e+01 +1.006385000000000085e+00 -7.334375000000000000e+01 +1.006390000000000118e+00 -7.337500000000000000e+01 +1.006395000000000151e+00 -7.328125000000000000e+01 +1.006400000000000183e+00 -7.334375000000000000e+01 +1.006404999999999994e+00 -7.337500000000000000e+01 +1.006410000000000027e+00 -7.343750762939453125e+01 +1.006415000000000060e+00 -7.334375000000000000e+01 +1.006420000000000092e+00 -7.337500000000000000e+01 +1.006425000000000125e+00 -7.334375000000000000e+01 +1.006430000000000158e+00 -7.334375000000000000e+01 +1.006435000000000191e+00 -7.340625000000000000e+01 +1.006440000000000001e+00 -7.340625000000000000e+01 +1.006445000000000034e+00 -7.331250000000000000e+01 +1.006450000000000067e+00 -7.334375000000000000e+01 +1.006455000000000100e+00 -7.340625000000000000e+01 +1.006460000000000132e+00 -7.340625000000000000e+01 +1.006465000000000165e+00 -7.340625000000000000e+01 +1.006469999999999976e+00 -7.334375000000000000e+01 +1.006475000000000009e+00 -7.340625000000000000e+01 +1.006480000000000041e+00 -7.334375000000000000e+01 +1.006485000000000074e+00 -7.337500000000000000e+01 +1.006490000000000107e+00 -7.340625000000000000e+01 +1.006495000000000140e+00 -7.340625000000000000e+01 +1.006500000000000172e+00 -7.337500000000000000e+01 +1.006504999999999983e+00 -7.340625000000000000e+01 +1.006510000000000016e+00 -7.334375000000000000e+01 +1.006515000000000049e+00 -7.340625000000000000e+01 +1.006520000000000081e+00 -7.340625000000000000e+01 +1.006525000000000114e+00 -7.340625000000000000e+01 +1.006530000000000147e+00 -7.337500000000000000e+01 +1.006535000000000180e+00 -7.340625000000000000e+01 +1.006539999999999990e+00 -7.340625000000000000e+01 +1.006545000000000023e+00 -7.340625000000000000e+01 +1.006550000000000056e+00 -7.337500000000000000e+01 +1.006555000000000089e+00 -7.337500000000000000e+01 +1.006560000000000121e+00 -7.337500000000000000e+01 +1.006565000000000154e+00 -7.334375000000000000e+01 +1.006570000000000187e+00 -7.331250000000000000e+01 +1.006574999999999998e+00 -7.340625000000000000e+01 +1.006580000000000030e+00 -7.343750762939453125e+01 +1.006585000000000063e+00 -7.337500000000000000e+01 +1.006590000000000096e+00 -7.340625000000000000e+01 +1.006595000000000129e+00 -7.340625000000000000e+01 +1.006600000000000161e+00 -7.340625000000000000e+01 +1.006604999999999972e+00 -7.346875000000000000e+01 +1.006610000000000005e+00 -7.334375000000000000e+01 +1.006615000000000038e+00 -7.334375000000000000e+01 +1.006620000000000070e+00 -7.334375000000000000e+01 +1.006625000000000103e+00 -7.334375000000000000e+01 +1.006630000000000136e+00 -7.337500000000000000e+01 +1.006635000000000169e+00 -7.337500000000000000e+01 +1.006639999999999979e+00 -7.337500000000000000e+01 +1.006645000000000012e+00 -7.337500000000000000e+01 +1.006650000000000045e+00 -7.340625000000000000e+01 +1.006655000000000078e+00 -7.334375000000000000e+01 +1.006660000000000110e+00 -7.334375000000000000e+01 +1.006665000000000143e+00 -7.337500000000000000e+01 +1.006670000000000176e+00 -7.334375000000000000e+01 +1.006674999999999986e+00 -7.340625000000000000e+01 +1.006680000000000019e+00 -7.343750762939453125e+01 +1.006685000000000052e+00 -7.340625000000000000e+01 +1.006690000000000085e+00 -7.343750762939453125e+01 +1.006695000000000118e+00 -7.340625000000000000e+01 +1.006700000000000150e+00 -7.337500000000000000e+01 +1.006705000000000183e+00 -7.337500000000000000e+01 +1.006709999999999994e+00 -7.340625000000000000e+01 +1.006715000000000027e+00 -7.346875000000000000e+01 +1.006720000000000059e+00 -7.340625000000000000e+01 +1.006725000000000092e+00 -7.340625000000000000e+01 +1.006730000000000125e+00 -7.340625000000000000e+01 +1.006735000000000158e+00 -7.340625000000000000e+01 +1.006740000000000190e+00 -7.340625000000000000e+01 +1.006745000000000001e+00 -7.334375000000000000e+01 +1.006750000000000034e+00 -7.331250000000000000e+01 +1.006755000000000067e+00 -7.340625000000000000e+01 +1.006760000000000099e+00 -7.343750762939453125e+01 +1.006765000000000132e+00 -7.334375000000000000e+01 +1.006770000000000165e+00 -7.343750762939453125e+01 +1.006774999999999975e+00 -7.334375000000000000e+01 +1.006780000000000008e+00 -7.334375000000000000e+01 +1.006785000000000041e+00 -7.343750762939453125e+01 +1.006790000000000074e+00 -7.340625000000000000e+01 +1.006795000000000107e+00 -7.340625000000000000e+01 +1.006800000000000139e+00 -7.337500000000000000e+01 +1.006805000000000172e+00 -7.343750762939453125e+01 +1.006809999999999983e+00 -7.340625000000000000e+01 +1.006815000000000015e+00 -7.334375000000000000e+01 +1.006820000000000048e+00 -7.343750762939453125e+01 +1.006825000000000081e+00 -7.343750762939453125e+01 +1.006830000000000114e+00 -7.343750762939453125e+01 +1.006835000000000147e+00 -7.337500000000000000e+01 +1.006840000000000179e+00 -7.343750762939453125e+01 +1.006844999999999990e+00 -7.337500000000000000e+01 +1.006850000000000023e+00 -7.340625000000000000e+01 +1.006855000000000055e+00 -7.340625000000000000e+01 +1.006860000000000088e+00 -7.340625000000000000e+01 +1.006865000000000121e+00 -7.331250000000000000e+01 +1.006870000000000154e+00 -7.340625000000000000e+01 +1.006875000000000187e+00 -7.337500000000000000e+01 +1.006879999999999997e+00 -7.340625000000000000e+01 +1.006885000000000030e+00 -7.337500000000000000e+01 +1.006890000000000063e+00 -7.334375000000000000e+01 +1.006895000000000095e+00 -7.331250000000000000e+01 +1.006900000000000128e+00 -7.334375000000000000e+01 +1.006905000000000161e+00 -7.337500000000000000e+01 +1.006909999999999972e+00 -7.337500000000000000e+01 +1.006915000000000004e+00 -7.334375000000000000e+01 +1.006920000000000037e+00 -7.328125000000000000e+01 +1.006925000000000070e+00 -7.331250000000000000e+01 +1.006930000000000103e+00 -7.331250000000000000e+01 +1.006935000000000136e+00 -7.337500000000000000e+01 +1.006940000000000168e+00 -7.337500000000000000e+01 +1.006944999999999979e+00 -7.337500000000000000e+01 +1.006950000000000012e+00 -7.334375000000000000e+01 +1.006955000000000044e+00 -7.334375000000000000e+01 +1.006960000000000077e+00 -7.334375000000000000e+01 +1.006965000000000110e+00 -7.337500000000000000e+01 +1.006970000000000143e+00 -7.334375000000000000e+01 +1.006975000000000176e+00 -7.340625000000000000e+01 +1.006979999999999986e+00 -7.343750762939453125e+01 +1.006985000000000019e+00 -7.334375000000000000e+01 +1.006990000000000052e+00 -7.340625000000000000e+01 +1.006995000000000084e+00 -7.337500000000000000e+01 +1.007000000000000117e+00 -7.343750762939453125e+01 +1.007005000000000150e+00 -7.337500000000000000e+01 +1.007010000000000183e+00 -7.331250000000000000e+01 +1.007014999999999993e+00 -7.334375000000000000e+01 +1.007020000000000026e+00 -7.331250000000000000e+01 +1.007025000000000059e+00 -7.340625000000000000e+01 +1.007030000000000092e+00 -7.337500000000000000e+01 +1.007035000000000124e+00 -7.331250000000000000e+01 +1.007040000000000157e+00 -7.331250000000000000e+01 +1.007045000000000190e+00 -7.337500000000000000e+01 +1.007050000000000001e+00 -7.334375000000000000e+01 +1.007055000000000033e+00 -7.337500000000000000e+01 +1.007060000000000066e+00 -7.337500000000000000e+01 +1.007065000000000099e+00 -7.334375000000000000e+01 +1.007070000000000132e+00 -7.334375000000000000e+01 +1.007075000000000164e+00 -7.340625000000000000e+01 +1.007079999999999975e+00 -7.334375000000000000e+01 +1.007085000000000008e+00 -7.334375000000000000e+01 +1.007090000000000041e+00 -7.334375000000000000e+01 +1.007095000000000073e+00 -7.331250000000000000e+01 +1.007100000000000106e+00 -7.334375000000000000e+01 +1.007105000000000139e+00 -7.343750762939453125e+01 +1.007110000000000172e+00 -7.331250000000000000e+01 +1.007114999999999982e+00 -7.337500000000000000e+01 +1.007120000000000015e+00 -7.334375000000000000e+01 +1.007125000000000048e+00 -7.331250000000000000e+01 +1.007130000000000081e+00 -7.334375000000000000e+01 +1.007135000000000113e+00 -7.331250000000000000e+01 +1.007140000000000146e+00 -7.337500000000000000e+01 +1.007145000000000179e+00 -7.331250000000000000e+01 +1.007149999999999990e+00 -7.343750762939453125e+01 +1.007155000000000022e+00 -7.331250000000000000e+01 +1.007160000000000055e+00 -7.334375000000000000e+01 +1.007165000000000088e+00 -7.337500000000000000e+01 +1.007170000000000121e+00 -7.331250000000000000e+01 +1.007175000000000153e+00 -7.337500000000000000e+01 +1.007180000000000186e+00 -7.340625000000000000e+01 +1.007184999999999997e+00 -7.334375000000000000e+01 +1.007190000000000030e+00 -7.331250000000000000e+01 +1.007195000000000062e+00 -7.340625000000000000e+01 +1.007200000000000095e+00 -7.334375000000000000e+01 +1.007205000000000128e+00 -7.334375000000000000e+01 +1.007210000000000161e+00 -7.337500000000000000e+01 +1.007214999999999971e+00 -7.334375000000000000e+01 +1.007220000000000004e+00 -7.337500000000000000e+01 +1.007225000000000037e+00 -7.334375000000000000e+01 +1.007230000000000070e+00 -7.334375000000000000e+01 +1.007235000000000102e+00 -7.340625000000000000e+01 +1.007240000000000135e+00 -7.340625000000000000e+01 +1.007245000000000168e+00 -7.334375000000000000e+01 +1.007249999999999979e+00 -7.337500000000000000e+01 +1.007255000000000011e+00 -7.340625000000000000e+01 +1.007260000000000044e+00 -7.334375000000000000e+01 +1.007265000000000077e+00 -7.337500000000000000e+01 +1.007270000000000110e+00 -7.340625000000000000e+01 +1.007275000000000142e+00 -7.328125000000000000e+01 +1.007280000000000175e+00 -7.334375000000000000e+01 +1.007284999999999986e+00 -7.334375000000000000e+01 +1.007290000000000019e+00 -7.331250000000000000e+01 +1.007295000000000051e+00 -7.334375000000000000e+01 +1.007300000000000084e+00 -7.331250000000000000e+01 +1.007305000000000117e+00 -7.334375000000000000e+01 +1.007310000000000150e+00 -7.334375000000000000e+01 +1.007315000000000182e+00 -7.334375000000000000e+01 +1.007319999999999993e+00 -7.337500000000000000e+01 +1.007325000000000026e+00 -7.334375000000000000e+01 +1.007330000000000059e+00 -7.337500000000000000e+01 +1.007335000000000091e+00 -7.337500000000000000e+01 +1.007340000000000124e+00 -7.337500000000000000e+01 +1.007345000000000157e+00 -7.337500000000000000e+01 +1.007350000000000190e+00 -7.337500000000000000e+01 +1.007355000000000000e+00 -7.340625000000000000e+01 +1.007360000000000033e+00 -7.340625000000000000e+01 +1.007365000000000066e+00 -7.331250000000000000e+01 +1.007370000000000099e+00 -7.331250000000000000e+01 +1.007375000000000131e+00 -7.334375000000000000e+01 +1.007380000000000164e+00 -7.331250000000000000e+01 +1.007384999999999975e+00 -7.331250000000000000e+01 +1.007390000000000008e+00 -7.334375000000000000e+01 +1.007395000000000040e+00 -7.337500000000000000e+01 +1.007400000000000073e+00 -7.340625000000000000e+01 +1.007405000000000106e+00 -7.334375000000000000e+01 +1.007410000000000139e+00 -7.334375000000000000e+01 +1.007415000000000171e+00 -7.331250000000000000e+01 +1.007419999999999982e+00 -7.337500000000000000e+01 +1.007425000000000015e+00 -7.334375000000000000e+01 +1.007430000000000048e+00 -7.331250000000000000e+01 +1.007435000000000080e+00 -7.340625000000000000e+01 +1.007440000000000113e+00 -7.334375000000000000e+01 +1.007445000000000146e+00 -7.337500000000000000e+01 +1.007450000000000179e+00 -7.331250000000000000e+01 +1.007454999999999989e+00 -7.334375000000000000e+01 +1.007460000000000022e+00 -7.331250000000000000e+01 +1.007465000000000055e+00 -7.334375000000000000e+01 +1.007470000000000088e+00 -7.328125000000000000e+01 +1.007475000000000120e+00 -7.334375000000000000e+01 +1.007480000000000153e+00 -7.334375000000000000e+01 +1.007485000000000186e+00 -7.334375000000000000e+01 +1.007489999999999997e+00 -7.331250000000000000e+01 +1.007495000000000029e+00 -7.340625000000000000e+01 +1.007500000000000062e+00 -7.334375000000000000e+01 +1.007505000000000095e+00 -7.334375000000000000e+01 +1.007510000000000128e+00 -7.334375000000000000e+01 +1.007515000000000160e+00 -7.334375000000000000e+01 +1.007520000000000193e+00 -7.331250000000000000e+01 +1.007525000000000004e+00 -7.334375000000000000e+01 +1.007530000000000037e+00 -7.334375000000000000e+01 +1.007535000000000069e+00 -7.331250000000000000e+01 +1.007540000000000102e+00 -7.337500000000000000e+01 +1.007545000000000135e+00 -7.340625000000000000e+01 +1.007550000000000168e+00 -7.334375000000000000e+01 +1.007554999999999978e+00 -7.337500000000000000e+01 +1.007560000000000011e+00 -7.334375000000000000e+01 +1.007565000000000044e+00 -7.337500000000000000e+01 +1.007570000000000077e+00 -7.334375000000000000e+01 +1.007575000000000109e+00 -7.337500000000000000e+01 +1.007580000000000142e+00 -7.334375000000000000e+01 +1.007585000000000175e+00 -7.331250000000000000e+01 +1.007589999999999986e+00 -7.331250000000000000e+01 +1.007595000000000018e+00 -7.334375000000000000e+01 +1.007600000000000051e+00 -7.337500000000000000e+01 +1.007605000000000084e+00 -7.337500000000000000e+01 +1.007610000000000117e+00 -7.340625000000000000e+01 +1.007615000000000149e+00 -7.337500000000000000e+01 +1.007620000000000182e+00 -7.337500000000000000e+01 +1.007624999999999993e+00 -7.334375000000000000e+01 +1.007630000000000026e+00 -7.334375000000000000e+01 +1.007635000000000058e+00 -7.334375000000000000e+01 +1.007640000000000091e+00 -7.337500000000000000e+01 +1.007645000000000124e+00 -7.334375000000000000e+01 +1.007650000000000157e+00 -7.334375000000000000e+01 +1.007655000000000189e+00 -7.331250000000000000e+01 +1.007660000000000000e+00 -7.334375000000000000e+01 +1.007665000000000033e+00 -7.331250000000000000e+01 +1.007670000000000066e+00 -7.337500000000000000e+01 +1.007675000000000098e+00 -7.334375000000000000e+01 +1.007680000000000131e+00 -7.331250000000000000e+01 +1.007685000000000164e+00 -7.334375000000000000e+01 +1.007689999999999975e+00 -7.337500000000000000e+01 +1.007695000000000007e+00 -7.334375000000000000e+01 +1.007700000000000040e+00 -7.334375000000000000e+01 +1.007705000000000073e+00 -7.340625000000000000e+01 +1.007710000000000106e+00 -7.340625000000000000e+01 +1.007715000000000138e+00 -7.337500000000000000e+01 +1.007720000000000171e+00 -7.331250000000000000e+01 +1.007724999999999982e+00 -7.337500000000000000e+01 +1.007730000000000015e+00 -7.331250000000000000e+01 +1.007735000000000047e+00 -7.337500000000000000e+01 +1.007740000000000080e+00 -7.334375000000000000e+01 +1.007745000000000113e+00 -7.331250000000000000e+01 +1.007750000000000146e+00 -7.334375000000000000e+01 +1.007755000000000178e+00 -7.331250000000000000e+01 +1.007759999999999989e+00 -7.328125000000000000e+01 +1.007765000000000022e+00 -7.334375000000000000e+01 +1.007770000000000055e+00 -7.331250000000000000e+01 +1.007775000000000087e+00 -7.337500000000000000e+01 +1.007780000000000120e+00 -7.334375000000000000e+01 +1.007785000000000153e+00 -7.334375000000000000e+01 +1.007790000000000186e+00 -7.334375000000000000e+01 +1.007794999999999996e+00 -7.331250000000000000e+01 +1.007800000000000029e+00 -7.331250000000000000e+01 +1.007805000000000062e+00 -7.331250000000000000e+01 +1.007810000000000095e+00 -7.331250000000000000e+01 +1.007815000000000127e+00 -7.331250000000000000e+01 +1.007820000000000160e+00 -7.334375000000000000e+01 +1.007825000000000193e+00 -7.334375000000000000e+01 +1.007830000000000004e+00 -7.337500000000000000e+01 +1.007835000000000036e+00 -7.340625000000000000e+01 +1.007840000000000069e+00 -7.337500000000000000e+01 +1.007845000000000102e+00 -7.334375000000000000e+01 +1.007850000000000135e+00 -7.334375000000000000e+01 +1.007855000000000167e+00 -7.331250000000000000e+01 +1.007859999999999978e+00 -7.334375000000000000e+01 +1.007865000000000011e+00 -7.331250000000000000e+01 +1.007870000000000044e+00 -7.331250000000000000e+01 +1.007875000000000076e+00 -7.328125000000000000e+01 +1.007880000000000109e+00 -7.331250000000000000e+01 +1.007885000000000142e+00 -7.334375000000000000e+01 +1.007890000000000175e+00 -7.334375000000000000e+01 +1.007894999999999985e+00 -7.328125000000000000e+01 +1.007900000000000018e+00 -7.331250000000000000e+01 +1.007905000000000051e+00 -7.331250000000000000e+01 +1.007910000000000084e+00 -7.331250000000000000e+01 +1.007915000000000116e+00 -7.331250000000000000e+01 +1.007920000000000149e+00 -7.331250000000000000e+01 +1.007925000000000182e+00 -7.328125000000000000e+01 +1.007929999999999993e+00 -7.334375000000000000e+01 +1.007935000000000025e+00 -7.331250000000000000e+01 +1.007940000000000058e+00 -7.334375000000000000e+01 +1.007945000000000091e+00 -7.331250000000000000e+01 +1.007950000000000124e+00 -7.331250000000000000e+01 +1.007955000000000156e+00 -7.337500000000000000e+01 +1.007960000000000189e+00 -7.331250000000000000e+01 +1.007965000000000000e+00 -7.331250000000000000e+01 +1.007970000000000033e+00 -7.340625000000000000e+01 +1.007975000000000065e+00 -7.340625000000000000e+01 +1.007980000000000098e+00 -7.337500000000000000e+01 +1.007985000000000131e+00 -7.334375000000000000e+01 +1.007990000000000164e+00 -7.331250000000000000e+01 +1.007994999999999974e+00 -7.337500000000000000e+01 +1.008000000000000007e+00 -7.340625000000000000e+01 +1.008005000000000040e+00 -7.334375000000000000e+01 +1.008010000000000073e+00 -7.334375000000000000e+01 +1.008015000000000105e+00 -7.334375000000000000e+01 +1.008020000000000138e+00 -7.334375000000000000e+01 +1.008025000000000171e+00 -7.331250000000000000e+01 +1.008029999999999982e+00 -7.337500000000000000e+01 +1.008035000000000014e+00 -7.337500000000000000e+01 +1.008040000000000047e+00 -7.328125000000000000e+01 +1.008045000000000080e+00 -7.340625000000000000e+01 +1.008050000000000113e+00 -7.334375000000000000e+01 +1.008055000000000145e+00 -7.337500000000000000e+01 +1.008060000000000178e+00 -7.334375000000000000e+01 +1.008064999999999989e+00 -7.334375000000000000e+01 +1.008070000000000022e+00 -7.343750762939453125e+01 +1.008075000000000054e+00 -7.340625000000000000e+01 +1.008080000000000087e+00 -7.337500000000000000e+01 +1.008085000000000120e+00 -7.337500000000000000e+01 +1.008090000000000153e+00 -7.334375000000000000e+01 +1.008095000000000185e+00 -7.337500000000000000e+01 +1.008099999999999996e+00 -7.340625000000000000e+01 +1.008105000000000029e+00 -7.340625000000000000e+01 +1.008110000000000062e+00 -7.340625000000000000e+01 +1.008115000000000094e+00 -7.337500000000000000e+01 +1.008120000000000127e+00 -7.334375000000000000e+01 +1.008125000000000160e+00 -7.337500000000000000e+01 +1.008130000000000193e+00 -7.340625000000000000e+01 +1.008135000000000003e+00 -7.334375000000000000e+01 +1.008140000000000036e+00 -7.334375000000000000e+01 +1.008145000000000069e+00 -7.331250000000000000e+01 +1.008150000000000102e+00 -7.331250000000000000e+01 +1.008155000000000134e+00 -7.328125000000000000e+01 +1.008160000000000167e+00 -7.334375000000000000e+01 +1.008164999999999978e+00 -7.328125000000000000e+01 +1.008170000000000011e+00 -7.334375000000000000e+01 +1.008175000000000043e+00 -7.334375000000000000e+01 +1.008180000000000076e+00 -7.334375000000000000e+01 +1.008185000000000109e+00 -7.325000000000000000e+01 +1.008190000000000142e+00 -7.331250000000000000e+01 +1.008195000000000174e+00 -7.331250000000000000e+01 +1.008199999999999985e+00 -7.337500000000000000e+01 +1.008205000000000018e+00 -7.331250000000000000e+01 +1.008210000000000051e+00 -7.340625000000000000e+01 +1.008215000000000083e+00 -7.331250000000000000e+01 +1.008220000000000116e+00 -7.334375000000000000e+01 +1.008225000000000149e+00 -7.334375000000000000e+01 +1.008230000000000182e+00 -7.325000000000000000e+01 +1.008234999999999992e+00 -7.331250000000000000e+01 +1.008240000000000025e+00 -7.334375000000000000e+01 +1.008245000000000058e+00 -7.331250000000000000e+01 +1.008250000000000091e+00 -7.328125000000000000e+01 +1.008255000000000123e+00 -7.334375000000000000e+01 +1.008260000000000156e+00 -7.331250000000000000e+01 +1.008265000000000189e+00 -7.334375000000000000e+01 +1.008270000000000000e+00 -7.331250000000000000e+01 +1.008275000000000032e+00 -7.331250000000000000e+01 +1.008280000000000065e+00 -7.334375000000000000e+01 +1.008285000000000098e+00 -7.340625000000000000e+01 +1.008290000000000131e+00 -7.334375000000000000e+01 +1.008295000000000163e+00 -7.334375000000000000e+01 +1.008299999999999974e+00 -7.331250000000000000e+01 +1.008305000000000007e+00 -7.331250000000000000e+01 +1.008310000000000040e+00 -7.334375000000000000e+01 +1.008315000000000072e+00 -7.331250000000000000e+01 +1.008320000000000105e+00 -7.334375000000000000e+01 +1.008325000000000138e+00 -7.331250000000000000e+01 +1.008330000000000171e+00 -7.328125000000000000e+01 +1.008334999999999981e+00 -7.334375000000000000e+01 +1.008340000000000014e+00 -7.337500000000000000e+01 +1.008345000000000047e+00 -7.334375000000000000e+01 +1.008350000000000080e+00 -7.331250000000000000e+01 +1.008355000000000112e+00 -7.334375000000000000e+01 +1.008360000000000145e+00 -7.334375000000000000e+01 +1.008365000000000178e+00 -7.328125000000000000e+01 +1.008369999999999989e+00 -7.331250000000000000e+01 +1.008375000000000021e+00 -7.328125000000000000e+01 +1.008380000000000054e+00 -7.331250000000000000e+01 +1.008385000000000087e+00 -7.331250000000000000e+01 +1.008390000000000120e+00 -7.331250000000000000e+01 +1.008395000000000152e+00 -7.337500000000000000e+01 +1.008400000000000185e+00 -7.340625000000000000e+01 +1.008404999999999996e+00 -7.337500000000000000e+01 +1.008410000000000029e+00 -7.334375000000000000e+01 +1.008415000000000061e+00 -7.334375000000000000e+01 +1.008420000000000094e+00 -7.334375000000000000e+01 +1.008425000000000127e+00 -7.331250000000000000e+01 +1.008430000000000160e+00 -7.337500000000000000e+01 +1.008435000000000192e+00 -7.337500000000000000e+01 +1.008440000000000003e+00 -7.337500000000000000e+01 +1.008445000000000036e+00 -7.334375000000000000e+01 +1.008450000000000069e+00 -7.337500000000000000e+01 +1.008455000000000101e+00 -7.337500000000000000e+01 +1.008460000000000134e+00 -7.331250000000000000e+01 +1.008465000000000167e+00 -7.337500000000000000e+01 +1.008469999999999978e+00 -7.334375000000000000e+01 +1.008475000000000010e+00 -7.334375000000000000e+01 +1.008480000000000043e+00 -7.337500000000000000e+01 +1.008485000000000076e+00 -7.334375000000000000e+01 +1.008490000000000109e+00 -7.337500000000000000e+01 +1.008495000000000141e+00 -7.334375000000000000e+01 +1.008500000000000174e+00 -7.337500000000000000e+01 +1.008504999999999985e+00 -7.337500000000000000e+01 +1.008510000000000018e+00 -7.337500000000000000e+01 +1.008515000000000050e+00 -7.337500000000000000e+01 +1.008520000000000083e+00 -7.340625000000000000e+01 +1.008525000000000116e+00 -7.337500000000000000e+01 +1.008530000000000149e+00 -7.343750762939453125e+01 +1.008535000000000181e+00 -7.331250000000000000e+01 +1.008539999999999992e+00 -7.334375000000000000e+01 +1.008545000000000025e+00 -7.337500000000000000e+01 +1.008550000000000058e+00 -7.331250000000000000e+01 +1.008555000000000090e+00 -7.334375000000000000e+01 +1.008560000000000123e+00 -7.328125000000000000e+01 +1.008565000000000156e+00 -7.331250000000000000e+01 +1.008570000000000189e+00 -7.337500000000000000e+01 +1.008574999999999999e+00 -7.340625000000000000e+01 +1.008580000000000032e+00 -7.337500000000000000e+01 +1.008585000000000065e+00 -7.334375000000000000e+01 +1.008590000000000098e+00 -7.334375000000000000e+01 +1.008595000000000130e+00 -7.334375000000000000e+01 +1.008600000000000163e+00 -7.334375000000000000e+01 +1.008604999999999974e+00 -7.337500000000000000e+01 +1.008610000000000007e+00 -7.343750762939453125e+01 +1.008615000000000039e+00 -7.331250000000000000e+01 +1.008620000000000072e+00 -7.334375000000000000e+01 +1.008625000000000105e+00 -7.331250000000000000e+01 +1.008630000000000138e+00 -7.334375000000000000e+01 +1.008635000000000170e+00 -7.340625000000000000e+01 +1.008639999999999981e+00 -7.337500000000000000e+01 +1.008645000000000014e+00 -7.334375000000000000e+01 +1.008650000000000047e+00 -7.337500000000000000e+01 +1.008655000000000079e+00 -7.334375000000000000e+01 +1.008660000000000112e+00 -7.331250000000000000e+01 +1.008665000000000145e+00 -7.337500000000000000e+01 +1.008670000000000178e+00 -7.337500000000000000e+01 +1.008674999999999988e+00 -7.343750762939453125e+01 +1.008680000000000021e+00 -7.340625000000000000e+01 +1.008685000000000054e+00 -7.343750762939453125e+01 +1.008690000000000087e+00 -7.340625000000000000e+01 +1.008695000000000119e+00 -7.337500000000000000e+01 +1.008700000000000152e+00 -7.340625000000000000e+01 +1.008705000000000185e+00 -7.337500000000000000e+01 +1.008709999999999996e+00 -7.334375000000000000e+01 +1.008715000000000028e+00 -7.337500000000000000e+01 +1.008720000000000061e+00 -7.337500000000000000e+01 +1.008725000000000094e+00 -7.337500000000000000e+01 +1.008730000000000127e+00 -7.334375000000000000e+01 +1.008735000000000159e+00 -7.334375000000000000e+01 +1.008740000000000192e+00 -7.337500000000000000e+01 +1.008745000000000003e+00 -7.331250000000000000e+01 +1.008750000000000036e+00 -7.334375000000000000e+01 +1.008755000000000068e+00 -7.337500000000000000e+01 +1.008760000000000101e+00 -7.331250000000000000e+01 +1.008765000000000134e+00 -7.334375000000000000e+01 +1.008770000000000167e+00 -7.334375000000000000e+01 +1.008774999999999977e+00 -7.331250000000000000e+01 +1.008780000000000010e+00 -7.331250000000000000e+01 +1.008785000000000043e+00 -7.325000000000000000e+01 +1.008790000000000076e+00 -7.325000000000000000e+01 +1.008795000000000108e+00 -7.331250000000000000e+01 +1.008800000000000141e+00 -7.328125000000000000e+01 +1.008805000000000174e+00 -7.328125000000000000e+01 +1.008809999999999985e+00 -7.331250000000000000e+01 +1.008815000000000017e+00 -7.328125000000000000e+01 +1.008820000000000050e+00 -7.328125000000000000e+01 +1.008825000000000083e+00 -7.328125000000000000e+01 +1.008830000000000116e+00 -7.331250000000000000e+01 +1.008835000000000148e+00 -7.331250000000000000e+01 +1.008840000000000181e+00 -7.328125000000000000e+01 +1.008844999999999992e+00 -7.331250000000000000e+01 +1.008850000000000025e+00 -7.334375000000000000e+01 +1.008855000000000057e+00 -7.331250000000000000e+01 +1.008860000000000090e+00 -7.331250000000000000e+01 +1.008865000000000123e+00 -7.325000000000000000e+01 +1.008870000000000156e+00 -7.331250000000000000e+01 +1.008875000000000188e+00 -7.328125000000000000e+01 +1.008879999999999999e+00 -7.328125000000000000e+01 +1.008885000000000032e+00 -7.328125000000000000e+01 +1.008890000000000065e+00 -7.334375000000000000e+01 +1.008895000000000097e+00 -7.334375000000000000e+01 +1.008900000000000130e+00 -7.334375000000000000e+01 +1.008905000000000163e+00 -7.334375000000000000e+01 +1.008909999999999973e+00 -7.334375000000000000e+01 +1.008915000000000006e+00 -7.334375000000000000e+01 +1.008920000000000039e+00 -7.334375000000000000e+01 +1.008925000000000072e+00 -7.334375000000000000e+01 +1.008930000000000105e+00 -7.328125000000000000e+01 +1.008935000000000137e+00 -7.334375000000000000e+01 +1.008940000000000170e+00 -7.321875000000000000e+01 +1.008944999999999981e+00 -7.328125000000000000e+01 +1.008950000000000014e+00 -7.331250000000000000e+01 +1.008955000000000046e+00 -7.328125000000000000e+01 +1.008960000000000079e+00 -7.328125000000000000e+01 +1.008965000000000112e+00 -7.328125000000000000e+01 +1.008970000000000145e+00 -7.321875000000000000e+01 +1.008975000000000177e+00 -7.328125000000000000e+01 +1.008979999999999988e+00 -7.328125000000000000e+01 +1.008985000000000021e+00 -7.328125000000000000e+01 +1.008990000000000054e+00 -7.328125000000000000e+01 +1.008995000000000086e+00 -7.331250000000000000e+01 +1.009000000000000119e+00 -7.331250000000000000e+01 +1.009005000000000152e+00 -7.331250000000000000e+01 +1.009010000000000185e+00 -7.334375000000000000e+01 +1.009014999999999995e+00 -7.334375000000000000e+01 +1.009020000000000028e+00 -7.331250000000000000e+01 +1.009025000000000061e+00 -7.328125000000000000e+01 +1.009030000000000094e+00 -7.328125000000000000e+01 +1.009035000000000126e+00 -7.334375000000000000e+01 +1.009040000000000159e+00 -7.331250000000000000e+01 +1.009045000000000192e+00 -7.331250000000000000e+01 +1.009050000000000002e+00 -7.328125000000000000e+01 +1.009055000000000035e+00 -7.334375000000000000e+01 +1.009060000000000068e+00 -7.331250000000000000e+01 +1.009065000000000101e+00 -7.331250000000000000e+01 +1.009070000000000134e+00 -7.334375000000000000e+01 +1.009075000000000166e+00 -7.331250000000000000e+01 +1.009079999999999977e+00 -7.331250000000000000e+01 +1.009085000000000010e+00 -7.331250000000000000e+01 +1.009090000000000042e+00 -7.331250000000000000e+01 +1.009095000000000075e+00 -7.331250000000000000e+01 +1.009100000000000108e+00 -7.321875000000000000e+01 +1.009105000000000141e+00 -7.331250000000000000e+01 +1.009110000000000174e+00 -7.325000000000000000e+01 +1.009114999999999984e+00 -7.328125000000000000e+01 +1.009120000000000017e+00 -7.328125000000000000e+01 +1.009125000000000050e+00 -7.328125000000000000e+01 +1.009130000000000082e+00 -7.328125000000000000e+01 +1.009135000000000115e+00 -7.325000000000000000e+01 +1.009140000000000148e+00 -7.325000000000000000e+01 +1.009145000000000181e+00 -7.325000000000000000e+01 +1.009149999999999991e+00 -7.325000000000000000e+01 +1.009155000000000024e+00 -7.328125000000000000e+01 +1.009160000000000057e+00 -7.325000000000000000e+01 +1.009165000000000090e+00 -7.331250000000000000e+01 +1.009170000000000122e+00 -7.328125000000000000e+01 +1.009175000000000155e+00 -7.328125000000000000e+01 +1.009180000000000188e+00 -7.331250000000000000e+01 +1.009184999999999999e+00 -7.331250000000000000e+01 +1.009190000000000031e+00 -7.334375000000000000e+01 +1.009195000000000064e+00 -7.321875000000000000e+01 +1.009200000000000097e+00 -7.334375000000000000e+01 +1.009205000000000130e+00 -7.334375000000000000e+01 +1.009210000000000163e+00 -7.328125000000000000e+01 +1.009214999999999973e+00 -7.328125000000000000e+01 +1.009220000000000006e+00 -7.337500000000000000e+01 +1.009225000000000039e+00 -7.328125000000000000e+01 +1.009230000000000071e+00 -7.325000000000000000e+01 +1.009235000000000104e+00 -7.331250000000000000e+01 +1.009240000000000137e+00 -7.334375000000000000e+01 +1.009245000000000170e+00 -7.331250000000000000e+01 +1.009249999999999980e+00 -7.331250000000000000e+01 +1.009255000000000013e+00 -7.328125000000000000e+01 +1.009260000000000046e+00 -7.328125000000000000e+01 +1.009265000000000079e+00 -7.334375000000000000e+01 +1.009270000000000111e+00 -7.331250000000000000e+01 +1.009275000000000144e+00 -7.328125000000000000e+01 +1.009280000000000177e+00 -7.334375000000000000e+01 +1.009284999999999988e+00 -7.331250000000000000e+01 +1.009290000000000020e+00 -7.337500000000000000e+01 +1.009295000000000053e+00 -7.328125000000000000e+01 +1.009300000000000086e+00 -7.340625000000000000e+01 +1.009305000000000119e+00 -7.328125000000000000e+01 +1.009310000000000151e+00 -7.328125000000000000e+01 +1.009315000000000184e+00 -7.331250000000000000e+01 +1.009319999999999995e+00 -7.337500000000000000e+01 +1.009325000000000028e+00 -7.328125000000000000e+01 +1.009330000000000060e+00 -7.321875000000000000e+01 +1.009335000000000093e+00 -7.331250000000000000e+01 +1.009340000000000126e+00 -7.334375000000000000e+01 +1.009345000000000159e+00 -7.331250000000000000e+01 +1.009350000000000191e+00 -7.334375000000000000e+01 +1.009355000000000002e+00 -7.334375000000000000e+01 +1.009360000000000035e+00 -7.325000000000000000e+01 +1.009365000000000068e+00 -7.325000000000000000e+01 +1.009370000000000100e+00 -7.331250000000000000e+01 +1.009375000000000133e+00 -7.331250000000000000e+01 +1.009380000000000166e+00 -7.331250000000000000e+01 +1.009384999999999977e+00 -7.334375000000000000e+01 +1.009390000000000009e+00 -7.331250000000000000e+01 +1.009395000000000042e+00 -7.334375000000000000e+01 +1.009400000000000075e+00 -7.337500000000000000e+01 +1.009405000000000108e+00 -7.328125000000000000e+01 +1.009410000000000140e+00 -7.325000000000000000e+01 +1.009415000000000173e+00 -7.331250000000000000e+01 +1.009419999999999984e+00 -7.331250000000000000e+01 +1.009425000000000017e+00 -7.334375000000000000e+01 +1.009430000000000049e+00 -7.334375000000000000e+01 +1.009435000000000082e+00 -7.334375000000000000e+01 +1.009440000000000115e+00 -7.337500000000000000e+01 +1.009445000000000148e+00 -7.337500000000000000e+01 +1.009450000000000180e+00 -7.331250000000000000e+01 +1.009454999999999991e+00 -7.331250000000000000e+01 +1.009460000000000024e+00 -7.328125000000000000e+01 +1.009465000000000057e+00 -7.331250000000000000e+01 +1.009470000000000089e+00 -7.334375000000000000e+01 +1.009475000000000122e+00 -7.331250000000000000e+01 +1.009480000000000155e+00 -7.334375000000000000e+01 +1.009485000000000188e+00 -7.328125000000000000e+01 +1.009489999999999998e+00 -7.334375000000000000e+01 +1.009495000000000031e+00 -7.328125000000000000e+01 +1.009500000000000064e+00 -7.331250000000000000e+01 +1.009505000000000097e+00 -7.328125000000000000e+01 +1.009510000000000129e+00 -7.340625000000000000e+01 +1.009515000000000162e+00 -7.334375000000000000e+01 +1.009519999999999973e+00 -7.337500000000000000e+01 +1.009525000000000006e+00 -7.334375000000000000e+01 +1.009530000000000038e+00 -7.334375000000000000e+01 +1.009535000000000071e+00 -7.337500000000000000e+01 +1.009540000000000104e+00 -7.331250000000000000e+01 +1.009545000000000137e+00 -7.337500000000000000e+01 +1.009550000000000169e+00 -7.328125000000000000e+01 +1.009554999999999980e+00 -7.331250000000000000e+01 +1.009560000000000013e+00 -7.334375000000000000e+01 +1.009565000000000046e+00 -7.331250000000000000e+01 +1.009570000000000078e+00 -7.331250000000000000e+01 +1.009575000000000111e+00 -7.331250000000000000e+01 +1.009580000000000144e+00 -7.334375000000000000e+01 +1.009585000000000177e+00 -7.334375000000000000e+01 +1.009589999999999987e+00 -7.328125000000000000e+01 +1.009595000000000020e+00 -7.334375000000000000e+01 +1.009600000000000053e+00 -7.331250000000000000e+01 +1.009605000000000086e+00 -7.331250000000000000e+01 +1.009610000000000118e+00 -7.328125000000000000e+01 +1.009615000000000151e+00 -7.337500000000000000e+01 +1.009620000000000184e+00 -7.328125000000000000e+01 +1.009624999999999995e+00 -7.334375000000000000e+01 +1.009630000000000027e+00 -7.328125000000000000e+01 +1.009635000000000060e+00 -7.331250000000000000e+01 +1.009640000000000093e+00 -7.334375000000000000e+01 +1.009645000000000126e+00 -7.334375000000000000e+01 +1.009650000000000158e+00 -7.331250000000000000e+01 +1.009655000000000191e+00 -7.331250000000000000e+01 +1.009660000000000002e+00 -7.334375000000000000e+01 +1.009665000000000035e+00 -7.334375000000000000e+01 +1.009670000000000067e+00 -7.334375000000000000e+01 +1.009675000000000100e+00 -7.334375000000000000e+01 +1.009680000000000133e+00 -7.334375000000000000e+01 +1.009685000000000166e+00 -7.334375000000000000e+01 +1.009689999999999976e+00 -7.328125000000000000e+01 +1.009695000000000009e+00 -7.331250000000000000e+01 +1.009700000000000042e+00 -7.340625000000000000e+01 +1.009705000000000075e+00 -7.334375000000000000e+01 +1.009710000000000107e+00 -7.328125000000000000e+01 +1.009715000000000140e+00 -7.328125000000000000e+01 +1.009720000000000173e+00 -7.331250000000000000e+01 +1.009724999999999984e+00 -7.331250000000000000e+01 +1.009730000000000016e+00 -7.328125000000000000e+01 +1.009735000000000049e+00 -7.325000000000000000e+01 +1.009740000000000082e+00 -7.325000000000000000e+01 +1.009745000000000115e+00 -7.331250000000000000e+01 +1.009750000000000147e+00 -7.321875000000000000e+01 +1.009755000000000180e+00 -7.328125000000000000e+01 +1.009759999999999991e+00 -7.334375000000000000e+01 +1.009765000000000024e+00 -7.334375000000000000e+01 +1.009770000000000056e+00 -7.328125000000000000e+01 +1.009775000000000089e+00 -7.328125000000000000e+01 +1.009780000000000122e+00 -7.325000000000000000e+01 +1.009785000000000155e+00 -7.328125000000000000e+01 +1.009790000000000187e+00 -7.334375000000000000e+01 +1.009794999999999998e+00 -7.331250000000000000e+01 +1.009800000000000031e+00 -7.328125000000000000e+01 +1.009805000000000064e+00 -7.325000000000000000e+01 +1.009810000000000096e+00 -7.328125000000000000e+01 +1.009815000000000129e+00 -7.328125000000000000e+01 +1.009820000000000162e+00 -7.331250000000000000e+01 +1.009824999999999973e+00 -7.334375000000000000e+01 +1.009830000000000005e+00 -7.328125000000000000e+01 +1.009835000000000038e+00 -7.334375000000000000e+01 +1.009840000000000071e+00 -7.328125000000000000e+01 +1.009845000000000104e+00 -7.334375000000000000e+01 +1.009850000000000136e+00 -7.334375000000000000e+01 +1.009855000000000169e+00 -7.328125000000000000e+01 +1.009859999999999980e+00 -7.331250000000000000e+01 +1.009865000000000013e+00 -7.331250000000000000e+01 +1.009870000000000045e+00 -7.334375000000000000e+01 +1.009875000000000078e+00 -7.331250000000000000e+01 +1.009880000000000111e+00 -7.334375000000000000e+01 +1.009885000000000144e+00 -7.331250000000000000e+01 +1.009890000000000176e+00 -7.331250000000000000e+01 +1.009894999999999987e+00 -7.334375000000000000e+01 +1.009900000000000020e+00 -7.334375000000000000e+01 +1.009905000000000053e+00 -7.328125000000000000e+01 +1.009910000000000085e+00 -7.328125000000000000e+01 +1.009915000000000118e+00 -7.331250000000000000e+01 +1.009920000000000151e+00 -7.334375000000000000e+01 +1.009925000000000184e+00 -7.331250000000000000e+01 +1.009929999999999994e+00 -7.334375000000000000e+01 +1.009935000000000027e+00 -7.334375000000000000e+01 +1.009940000000000060e+00 -7.334375000000000000e+01 +1.009945000000000093e+00 -7.334375000000000000e+01 +1.009950000000000125e+00 -7.334375000000000000e+01 +1.009955000000000158e+00 -7.328125000000000000e+01 +1.009960000000000191e+00 -7.337500000000000000e+01 +1.009965000000000002e+00 -7.328125000000000000e+01 +1.009970000000000034e+00 -7.340625000000000000e+01 +1.009975000000000067e+00 -7.331250000000000000e+01 +1.009980000000000100e+00 -7.331250000000000000e+01 +1.009985000000000133e+00 -7.328125000000000000e+01 +1.009990000000000165e+00 -7.337500000000000000e+01 +1.009994999999999976e+00 -7.334375000000000000e+01 +1.010000000000000009e+00 -7.331250000000000000e+01 +1.010005000000000042e+00 -7.334375000000000000e+01 +1.010010000000000074e+00 -7.331250000000000000e+01 +1.010015000000000107e+00 -7.334375000000000000e+01 +1.010020000000000140e+00 -7.334375000000000000e+01 +1.010025000000000173e+00 -7.334375000000000000e+01 +1.010029999999999983e+00 -7.331250000000000000e+01 +1.010035000000000016e+00 -7.334375000000000000e+01 +1.010040000000000049e+00 -7.328125000000000000e+01 +1.010045000000000082e+00 -7.328125000000000000e+01 +1.010050000000000114e+00 -7.334375000000000000e+01 +1.010055000000000147e+00 -7.331250000000000000e+01 +1.010060000000000180e+00 -7.334375000000000000e+01 +1.010064999999999991e+00 -7.337500000000000000e+01 +1.010070000000000023e+00 -7.328125000000000000e+01 +1.010075000000000056e+00 -7.334375000000000000e+01 +1.010080000000000089e+00 -7.334375000000000000e+01 +1.010085000000000122e+00 -7.337500000000000000e+01 +1.010090000000000154e+00 -7.337500000000000000e+01 +1.010095000000000187e+00 -7.340625000000000000e+01 +1.010099999999999998e+00 -7.340625000000000000e+01 +1.010105000000000031e+00 -7.337500000000000000e+01 +1.010110000000000063e+00 -7.334375000000000000e+01 +1.010115000000000096e+00 -7.337500000000000000e+01 +1.010120000000000129e+00 -7.337500000000000000e+01 +1.010125000000000162e+00 -7.331250000000000000e+01 +1.010129999999999972e+00 -7.331250000000000000e+01 +1.010135000000000005e+00 -7.334375000000000000e+01 +1.010140000000000038e+00 -7.334375000000000000e+01 +1.010145000000000071e+00 -7.334375000000000000e+01 +1.010150000000000103e+00 -7.331250000000000000e+01 +1.010155000000000136e+00 -7.337500000000000000e+01 +1.010160000000000169e+00 -7.340625000000000000e+01 +1.010164999999999980e+00 -7.334375000000000000e+01 +1.010170000000000012e+00 -7.328125000000000000e+01 +1.010175000000000045e+00 -7.340625000000000000e+01 +1.010180000000000078e+00 -7.328125000000000000e+01 +1.010185000000000111e+00 -7.337500000000000000e+01 +1.010190000000000143e+00 -7.334375000000000000e+01 +1.010195000000000176e+00 -7.334375000000000000e+01 +1.010199999999999987e+00 -7.331250000000000000e+01 +1.010205000000000020e+00 -7.328125000000000000e+01 +1.010210000000000052e+00 -7.331250000000000000e+01 +1.010215000000000085e+00 -7.337500000000000000e+01 +1.010220000000000118e+00 -7.337500000000000000e+01 +1.010225000000000151e+00 -7.334375000000000000e+01 +1.010230000000000183e+00 -7.337500000000000000e+01 +1.010234999999999994e+00 -7.340625000000000000e+01 +1.010240000000000027e+00 -7.337500000000000000e+01 +1.010245000000000060e+00 -7.334375000000000000e+01 +1.010250000000000092e+00 -7.340625000000000000e+01 +1.010255000000000125e+00 -7.340625000000000000e+01 +1.010260000000000158e+00 -7.334375000000000000e+01 +1.010265000000000191e+00 -7.337500000000000000e+01 +1.010270000000000001e+00 -7.343750762939453125e+01 +1.010275000000000034e+00 -7.340625000000000000e+01 +1.010280000000000067e+00 -7.334375000000000000e+01 +1.010285000000000100e+00 -7.331250000000000000e+01 +1.010290000000000132e+00 -7.337500000000000000e+01 +1.010295000000000165e+00 -7.334375000000000000e+01 +1.010299999999999976e+00 -7.340625000000000000e+01 +1.010305000000000009e+00 -7.337500000000000000e+01 +1.010310000000000041e+00 -7.340625000000000000e+01 +1.010315000000000074e+00 -7.350000000000000000e+01 +1.010320000000000107e+00 -7.340625000000000000e+01 +1.010325000000000140e+00 -7.334375000000000000e+01 +1.010330000000000172e+00 -7.343750762939453125e+01 +1.010334999999999983e+00 -7.340625000000000000e+01 +1.010340000000000016e+00 -7.340625000000000000e+01 +1.010345000000000049e+00 -7.343750762939453125e+01 +1.010350000000000081e+00 -7.340625000000000000e+01 +1.010355000000000114e+00 -7.337500000000000000e+01 +1.010360000000000147e+00 -7.343750762939453125e+01 +1.010365000000000180e+00 -7.340625000000000000e+01 +1.010369999999999990e+00 -7.343750762939453125e+01 +1.010375000000000023e+00 -7.331250000000000000e+01 +1.010380000000000056e+00 -7.334375000000000000e+01 +1.010385000000000089e+00 -7.334375000000000000e+01 +1.010390000000000121e+00 -7.331250000000000000e+01 +1.010395000000000154e+00 -7.334375000000000000e+01 +1.010400000000000187e+00 -7.340625000000000000e+01 +1.010404999999999998e+00 -7.340625000000000000e+01 +1.010410000000000030e+00 -7.337500000000000000e+01 +1.010415000000000063e+00 -7.337500000000000000e+01 +1.010420000000000096e+00 -7.337500000000000000e+01 +1.010425000000000129e+00 -7.340625000000000000e+01 +1.010430000000000161e+00 -7.334375000000000000e+01 +1.010434999999999972e+00 -7.343750762939453125e+01 +1.010440000000000005e+00 -7.340625000000000000e+01 +1.010445000000000038e+00 -7.337500000000000000e+01 +1.010450000000000070e+00 -7.334375000000000000e+01 +1.010455000000000103e+00 -7.340625000000000000e+01 +1.010460000000000136e+00 -7.337500000000000000e+01 +1.010465000000000169e+00 -7.340625000000000000e+01 +1.010469999999999979e+00 -7.334375000000000000e+01 +1.010475000000000012e+00 -7.334375000000000000e+01 +1.010480000000000045e+00 -7.334375000000000000e+01 +1.010485000000000078e+00 -7.337500000000000000e+01 +1.010490000000000110e+00 -7.331250000000000000e+01 +1.010495000000000143e+00 -7.337500000000000000e+01 +1.010500000000000176e+00 -7.331250000000000000e+01 +1.010504999999999987e+00 -7.334375000000000000e+01 +1.010510000000000019e+00 -7.331250000000000000e+01 +1.010515000000000052e+00 -7.334375000000000000e+01 +1.010520000000000085e+00 -7.337500000000000000e+01 +1.010525000000000118e+00 -7.334375000000000000e+01 +1.010530000000000150e+00 -7.331250000000000000e+01 +1.010535000000000183e+00 -7.334375000000000000e+01 +1.010539999999999994e+00 -7.337500000000000000e+01 +1.010545000000000027e+00 -7.334375000000000000e+01 +1.010550000000000059e+00 -7.334375000000000000e+01 +1.010555000000000092e+00 -7.340625000000000000e+01 +1.010560000000000125e+00 -7.334375000000000000e+01 +1.010565000000000158e+00 -7.337500000000000000e+01 +1.010570000000000190e+00 -7.337500000000000000e+01 +1.010575000000000001e+00 -7.337500000000000000e+01 +1.010580000000000034e+00 -7.340625000000000000e+01 +1.010585000000000067e+00 -7.340625000000000000e+01 +1.010590000000000099e+00 -7.340625000000000000e+01 +1.010595000000000132e+00 -7.337500000000000000e+01 +1.010600000000000165e+00 -7.340625000000000000e+01 +1.010604999999999976e+00 -7.340625000000000000e+01 +1.010610000000000008e+00 -7.334375000000000000e+01 +1.010615000000000041e+00 -7.334375000000000000e+01 +1.010620000000000074e+00 -7.337500000000000000e+01 +1.010625000000000107e+00 -7.331250000000000000e+01 +1.010630000000000139e+00 -7.334375000000000000e+01 +1.010635000000000172e+00 -7.331250000000000000e+01 +1.010639999999999983e+00 -7.334375000000000000e+01 +1.010645000000000016e+00 -7.334375000000000000e+01 +1.010650000000000048e+00 -7.328125000000000000e+01 +1.010655000000000081e+00 -7.334375000000000000e+01 +1.010660000000000114e+00 -7.334375000000000000e+01 +1.010665000000000147e+00 -7.340625000000000000e+01 +1.010670000000000179e+00 -7.334375000000000000e+01 +1.010674999999999990e+00 -7.337500000000000000e+01 +1.010680000000000023e+00 -7.328125000000000000e+01 +1.010685000000000056e+00 -7.331250000000000000e+01 +1.010690000000000088e+00 -7.328125000000000000e+01 +1.010695000000000121e+00 -7.334375000000000000e+01 +1.010700000000000154e+00 -7.325000000000000000e+01 +1.010705000000000187e+00 -7.331250000000000000e+01 +1.010709999999999997e+00 -7.331250000000000000e+01 +1.010715000000000030e+00 -7.328125000000000000e+01 +1.010720000000000063e+00 -7.334375000000000000e+01 +1.010725000000000096e+00 -7.337500000000000000e+01 +1.010730000000000128e+00 -7.331250000000000000e+01 +1.010735000000000161e+00 -7.331250000000000000e+01 +1.010739999999999972e+00 -7.334375000000000000e+01 +1.010745000000000005e+00 -7.331250000000000000e+01 +1.010750000000000037e+00 -7.331250000000000000e+01 +1.010755000000000070e+00 -7.334375000000000000e+01 +1.010760000000000103e+00 -7.331250000000000000e+01 +1.010765000000000136e+00 -7.334375000000000000e+01 +1.010770000000000168e+00 -7.331250000000000000e+01 +1.010774999999999979e+00 -7.331250000000000000e+01 +1.010780000000000012e+00 -7.334375000000000000e+01 +1.010785000000000045e+00 -7.328125000000000000e+01 +1.010790000000000077e+00 -7.331250000000000000e+01 +1.010795000000000110e+00 -7.337500000000000000e+01 +1.010800000000000143e+00 -7.331250000000000000e+01 +1.010805000000000176e+00 -7.334375000000000000e+01 +1.010809999999999986e+00 -7.321875000000000000e+01 +1.010815000000000019e+00 -7.334375000000000000e+01 +1.010820000000000052e+00 -7.325000000000000000e+01 +1.010825000000000085e+00 -7.328125000000000000e+01 +1.010830000000000117e+00 -7.328125000000000000e+01 +1.010835000000000150e+00 -7.331250000000000000e+01 +1.010840000000000183e+00 -7.331250000000000000e+01 +1.010844999999999994e+00 -7.328125000000000000e+01 +1.010850000000000026e+00 -7.337500000000000000e+01 +1.010855000000000059e+00 -7.328125000000000000e+01 +1.010860000000000092e+00 -7.334375000000000000e+01 +1.010865000000000125e+00 -7.328125000000000000e+01 +1.010870000000000157e+00 -7.331250000000000000e+01 +1.010875000000000190e+00 -7.331250000000000000e+01 +1.010880000000000001e+00 -7.328125000000000000e+01 +1.010885000000000034e+00 -7.331250000000000000e+01 +1.010890000000000066e+00 -7.328125000000000000e+01 +1.010895000000000099e+00 -7.334375000000000000e+01 +1.010900000000000132e+00 -7.331250000000000000e+01 +1.010905000000000165e+00 -7.328125000000000000e+01 +1.010909999999999975e+00 -7.334375000000000000e+01 +1.010915000000000008e+00 -7.334375000000000000e+01 +1.010920000000000041e+00 -7.331250000000000000e+01 +1.010925000000000074e+00 -7.331250000000000000e+01 +1.010930000000000106e+00 -7.334375000000000000e+01 +1.010935000000000139e+00 -7.334375000000000000e+01 +1.010940000000000172e+00 -7.334375000000000000e+01 +1.010944999999999983e+00 -7.331250000000000000e+01 +1.010950000000000015e+00 -7.331250000000000000e+01 +1.010955000000000048e+00 -7.334375000000000000e+01 +1.010960000000000081e+00 -7.334375000000000000e+01 +1.010965000000000114e+00 -7.328125000000000000e+01 +1.010970000000000146e+00 -7.331250000000000000e+01 +1.010975000000000179e+00 -7.331250000000000000e+01 +1.010979999999999990e+00 -7.337500000000000000e+01 +1.010985000000000023e+00 -7.331250000000000000e+01 +1.010990000000000055e+00 -7.340625000000000000e+01 +1.010995000000000088e+00 -7.331250000000000000e+01 +1.011000000000000121e+00 -7.337500000000000000e+01 +1.011005000000000154e+00 -7.334375000000000000e+01 +1.011010000000000186e+00 -7.328125000000000000e+01 +1.011014999999999997e+00 -7.334375000000000000e+01 +1.011020000000000030e+00 -7.334375000000000000e+01 +1.011025000000000063e+00 -7.340625000000000000e+01 +1.011030000000000095e+00 -7.340625000000000000e+01 +1.011035000000000128e+00 -7.334375000000000000e+01 +1.011040000000000161e+00 -7.334375000000000000e+01 +1.011045000000000194e+00 -7.337500000000000000e+01 +1.011050000000000004e+00 -7.334375000000000000e+01 +1.011055000000000037e+00 -7.334375000000000000e+01 +1.011060000000000070e+00 -7.337500000000000000e+01 +1.011065000000000103e+00 -7.334375000000000000e+01 +1.011070000000000135e+00 -7.337500000000000000e+01 +1.011075000000000168e+00 -7.334375000000000000e+01 +1.011079999999999979e+00 -7.331250000000000000e+01 +1.011085000000000012e+00 -7.334375000000000000e+01 +1.011090000000000044e+00 -7.334375000000000000e+01 +1.011095000000000077e+00 -7.337500000000000000e+01 +1.011100000000000110e+00 -7.340625000000000000e+01 +1.011105000000000143e+00 -7.337500000000000000e+01 +1.011110000000000175e+00 -7.334375000000000000e+01 +1.011114999999999986e+00 -7.337500000000000000e+01 +1.011120000000000019e+00 -7.337500000000000000e+01 +1.011125000000000052e+00 -7.334375000000000000e+01 +1.011130000000000084e+00 -7.334375000000000000e+01 +1.011135000000000117e+00 -7.331250000000000000e+01 +1.011140000000000150e+00 -7.340625000000000000e+01 +1.011145000000000183e+00 -7.343750762939453125e+01 +1.011149999999999993e+00 -7.337500000000000000e+01 +1.011155000000000026e+00 -7.343750762939453125e+01 +1.011160000000000059e+00 -7.334375000000000000e+01 +1.011165000000000092e+00 -7.337500000000000000e+01 +1.011170000000000124e+00 -7.334375000000000000e+01 +1.011175000000000157e+00 -7.340625000000000000e+01 +1.011180000000000190e+00 -7.334375000000000000e+01 +1.011185000000000000e+00 -7.337500000000000000e+01 +1.011190000000000033e+00 -7.328125000000000000e+01 +1.011195000000000066e+00 -7.334375000000000000e+01 +1.011200000000000099e+00 -7.340625000000000000e+01 +1.011205000000000132e+00 -7.334375000000000000e+01 +1.011210000000000164e+00 -7.331250000000000000e+01 +1.011214999999999975e+00 -7.337500000000000000e+01 +1.011220000000000008e+00 -7.337500000000000000e+01 +1.011225000000000041e+00 -7.334375000000000000e+01 +1.011230000000000073e+00 -7.337500000000000000e+01 +1.011235000000000106e+00 -7.334375000000000000e+01 +1.011240000000000139e+00 -7.337500000000000000e+01 +1.011245000000000172e+00 -7.340625000000000000e+01 +1.011249999999999982e+00 -7.340625000000000000e+01 +1.011255000000000015e+00 -7.334375000000000000e+01 +1.011260000000000048e+00 -7.340625000000000000e+01 +1.011265000000000081e+00 -7.337500000000000000e+01 +1.011270000000000113e+00 -7.340625000000000000e+01 +1.011275000000000146e+00 -7.334375000000000000e+01 +1.011280000000000179e+00 -7.337500000000000000e+01 +1.011284999999999989e+00 -7.337500000000000000e+01 +1.011290000000000022e+00 -7.334375000000000000e+01 +1.011295000000000055e+00 -7.331250000000000000e+01 +1.011300000000000088e+00 -7.331250000000000000e+01 +1.011305000000000121e+00 -7.328125000000000000e+01 +1.011310000000000153e+00 -7.337500000000000000e+01 +1.011315000000000186e+00 -7.337500000000000000e+01 +1.011319999999999997e+00 -7.340625000000000000e+01 +1.011325000000000029e+00 -7.331250000000000000e+01 +1.011330000000000062e+00 -7.331250000000000000e+01 +1.011335000000000095e+00 -7.340625000000000000e+01 +1.011340000000000128e+00 -7.334375000000000000e+01 +1.011345000000000161e+00 -7.331250000000000000e+01 +1.011350000000000193e+00 -7.334375000000000000e+01 +1.011355000000000004e+00 -7.334375000000000000e+01 +1.011360000000000037e+00 -7.328125000000000000e+01 +1.011365000000000069e+00 -7.337500000000000000e+01 +1.011370000000000102e+00 -7.328125000000000000e+01 +1.011375000000000135e+00 -7.334375000000000000e+01 +1.011380000000000168e+00 -7.334375000000000000e+01 +1.011384999999999978e+00 -7.337500000000000000e+01 +1.011390000000000011e+00 -7.334375000000000000e+01 +1.011395000000000044e+00 -7.331250000000000000e+01 +1.011400000000000077e+00 -7.334375000000000000e+01 +1.011405000000000109e+00 -7.334375000000000000e+01 +1.011410000000000142e+00 -7.331250000000000000e+01 +1.011415000000000175e+00 -7.334375000000000000e+01 +1.011419999999999986e+00 -7.328125000000000000e+01 +1.011425000000000018e+00 -7.334375000000000000e+01 +1.011430000000000051e+00 -7.331250000000000000e+01 +1.011435000000000084e+00 -7.328125000000000000e+01 +1.011440000000000117e+00 -7.337500000000000000e+01 +1.011445000000000149e+00 -7.328125000000000000e+01 +1.011450000000000182e+00 -7.334375000000000000e+01 +1.011454999999999993e+00 -7.334375000000000000e+01 +1.011460000000000026e+00 -7.328125000000000000e+01 +1.011465000000000058e+00 -7.337500000000000000e+01 +1.011470000000000091e+00 -7.337500000000000000e+01 +1.011475000000000124e+00 -7.331250000000000000e+01 +1.011480000000000157e+00 -7.334375000000000000e+01 +1.011485000000000190e+00 -7.331250000000000000e+01 +1.011490000000000000e+00 -7.334375000000000000e+01 +1.011495000000000033e+00 -7.331250000000000000e+01 +1.011500000000000066e+00 -7.331250000000000000e+01 +1.011505000000000098e+00 -7.331250000000000000e+01 +1.011510000000000131e+00 -7.334375000000000000e+01 +1.011515000000000164e+00 -7.328125000000000000e+01 +1.011519999999999975e+00 -7.331250000000000000e+01 +1.011525000000000007e+00 -7.331250000000000000e+01 +1.011530000000000040e+00 -7.325000000000000000e+01 +1.011535000000000073e+00 -7.321875000000000000e+01 +1.011540000000000106e+00 -7.334375000000000000e+01 +1.011545000000000138e+00 -7.328125000000000000e+01 +1.011550000000000171e+00 -7.334375000000000000e+01 +1.011554999999999982e+00 -7.328125000000000000e+01 +1.011560000000000015e+00 -7.331250000000000000e+01 +1.011565000000000047e+00 -7.331250000000000000e+01 +1.011570000000000080e+00 -7.334375000000000000e+01 +1.011575000000000113e+00 -7.334375000000000000e+01 +1.011580000000000146e+00 -7.331250000000000000e+01 +1.011585000000000178e+00 -7.331250000000000000e+01 +1.011589999999999989e+00 -7.331250000000000000e+01 +1.011595000000000022e+00 -7.334375000000000000e+01 +1.011600000000000055e+00 -7.334375000000000000e+01 +1.011605000000000087e+00 -7.331250000000000000e+01 +1.011610000000000120e+00 -7.331250000000000000e+01 +1.011615000000000153e+00 -7.334375000000000000e+01 +1.011620000000000186e+00 -7.334375000000000000e+01 +1.011624999999999996e+00 -7.334375000000000000e+01 +1.011630000000000029e+00 -7.334375000000000000e+01 +1.011635000000000062e+00 -7.334375000000000000e+01 +1.011640000000000095e+00 -7.334375000000000000e+01 +1.011645000000000127e+00 -7.331250000000000000e+01 +1.011650000000000160e+00 -7.331250000000000000e+01 +1.011655000000000193e+00 -7.331250000000000000e+01 +1.011660000000000004e+00 -7.331250000000000000e+01 +1.011665000000000036e+00 -7.328125000000000000e+01 +1.011670000000000069e+00 -7.331250000000000000e+01 +1.011675000000000102e+00 -7.331250000000000000e+01 +1.011680000000000135e+00 -7.334375000000000000e+01 +1.011685000000000167e+00 -7.334375000000000000e+01 +1.011689999999999978e+00 -7.334375000000000000e+01 +1.011695000000000011e+00 -7.334375000000000000e+01 +1.011700000000000044e+00 -7.328125000000000000e+01 +1.011705000000000076e+00 -7.331250000000000000e+01 +1.011710000000000109e+00 -7.331250000000000000e+01 +1.011715000000000142e+00 -7.334375000000000000e+01 +1.011720000000000175e+00 -7.337500000000000000e+01 +1.011724999999999985e+00 -7.331250000000000000e+01 +1.011730000000000018e+00 -7.334375000000000000e+01 +1.011735000000000051e+00 -7.334375000000000000e+01 +1.011740000000000084e+00 -7.331250000000000000e+01 +1.011745000000000116e+00 -7.328125000000000000e+01 +1.011750000000000149e+00 -7.325000000000000000e+01 +1.011755000000000182e+00 -7.331250000000000000e+01 +1.011759999999999993e+00 -7.331250000000000000e+01 +1.011765000000000025e+00 -7.328125000000000000e+01 +1.011770000000000058e+00 -7.331250000000000000e+01 +1.011775000000000091e+00 -7.334375000000000000e+01 +1.011780000000000124e+00 -7.328125000000000000e+01 +1.011785000000000156e+00 -7.334375000000000000e+01 +1.011790000000000189e+00 -7.334375000000000000e+01 +1.011795000000000000e+00 -7.331250000000000000e+01 +1.011800000000000033e+00 -7.337500000000000000e+01 +1.011805000000000065e+00 -7.331250000000000000e+01 +1.011810000000000098e+00 -7.334375000000000000e+01 +1.011815000000000131e+00 -7.334375000000000000e+01 +1.011820000000000164e+00 -7.334375000000000000e+01 +1.011824999999999974e+00 -7.340625000000000000e+01 +1.011830000000000007e+00 -7.337500000000000000e+01 +1.011835000000000040e+00 -7.337500000000000000e+01 +1.011840000000000073e+00 -7.331250000000000000e+01 +1.011845000000000105e+00 -7.331250000000000000e+01 +1.011850000000000138e+00 -7.334375000000000000e+01 +1.011855000000000171e+00 -7.331250000000000000e+01 +1.011859999999999982e+00 -7.334375000000000000e+01 +1.011865000000000014e+00 -7.331250000000000000e+01 +1.011870000000000047e+00 -7.337500000000000000e+01 +1.011875000000000080e+00 -7.331250000000000000e+01 +1.011880000000000113e+00 -7.328125000000000000e+01 +1.011885000000000145e+00 -7.334375000000000000e+01 +1.011890000000000178e+00 -7.331250000000000000e+01 +1.011894999999999989e+00 -7.334375000000000000e+01 +1.011900000000000022e+00 -7.334375000000000000e+01 +1.011905000000000054e+00 -7.331250000000000000e+01 +1.011910000000000087e+00 -7.331250000000000000e+01 +1.011915000000000120e+00 -7.334375000000000000e+01 +1.011920000000000153e+00 -7.331250000000000000e+01 +1.011925000000000185e+00 -7.337500000000000000e+01 +1.011929999999999996e+00 -7.328125000000000000e+01 +1.011935000000000029e+00 -7.331250000000000000e+01 +1.011940000000000062e+00 -7.337500000000000000e+01 +1.011945000000000094e+00 -7.331250000000000000e+01 +1.011950000000000127e+00 -7.334375000000000000e+01 +1.011955000000000160e+00 -7.331250000000000000e+01 +1.011960000000000193e+00 -7.331250000000000000e+01 +1.011965000000000003e+00 -7.328125000000000000e+01 +1.011970000000000036e+00 -7.331250000000000000e+01 +1.011975000000000069e+00 -7.334375000000000000e+01 +1.011980000000000102e+00 -7.331250000000000000e+01 +1.011985000000000134e+00 -7.334375000000000000e+01 +1.011990000000000167e+00 -7.334375000000000000e+01 +1.011994999999999978e+00 -7.328125000000000000e+01 +1.012000000000000011e+00 -7.331250000000000000e+01 +1.012005000000000043e+00 -7.331250000000000000e+01 +1.012010000000000076e+00 -7.334375000000000000e+01 +1.012015000000000109e+00 -7.331250000000000000e+01 +1.012020000000000142e+00 -7.328125000000000000e+01 +1.012025000000000174e+00 -7.331250000000000000e+01 +1.012029999999999985e+00 -7.334375000000000000e+01 +1.012035000000000018e+00 -7.331250000000000000e+01 +1.012040000000000051e+00 -7.331250000000000000e+01 +1.012045000000000083e+00 -7.328125000000000000e+01 +1.012050000000000116e+00 -7.331250000000000000e+01 +1.012055000000000149e+00 -7.328125000000000000e+01 +1.012060000000000182e+00 -7.331250000000000000e+01 +1.012064999999999992e+00 -7.337500000000000000e+01 +1.012070000000000025e+00 -7.331250000000000000e+01 +1.012075000000000058e+00 -7.334375000000000000e+01 +1.012080000000000091e+00 -7.337500000000000000e+01 +1.012085000000000123e+00 -7.331250000000000000e+01 +1.012090000000000156e+00 -7.334375000000000000e+01 +1.012095000000000189e+00 -7.334375000000000000e+01 +1.012100000000000000e+00 -7.334375000000000000e+01 +1.012105000000000032e+00 -7.328125000000000000e+01 +1.012110000000000065e+00 -7.334375000000000000e+01 +1.012115000000000098e+00 -7.334375000000000000e+01 +1.012120000000000131e+00 -7.328125000000000000e+01 +1.012125000000000163e+00 -7.334375000000000000e+01 +1.012129999999999974e+00 -7.337500000000000000e+01 +1.012135000000000007e+00 -7.331250000000000000e+01 +1.012140000000000040e+00 -7.331250000000000000e+01 +1.012145000000000072e+00 -7.334375000000000000e+01 +1.012150000000000105e+00 -7.331250000000000000e+01 +1.012155000000000138e+00 -7.334375000000000000e+01 +1.012160000000000171e+00 -7.334375000000000000e+01 +1.012164999999999981e+00 -7.331250000000000000e+01 +1.012170000000000014e+00 -7.328125000000000000e+01 +1.012175000000000047e+00 -7.331250000000000000e+01 +1.012180000000000080e+00 -7.337500000000000000e+01 +1.012185000000000112e+00 -7.331250000000000000e+01 +1.012190000000000145e+00 -7.334375000000000000e+01 +1.012195000000000178e+00 -7.331250000000000000e+01 +1.012199999999999989e+00 -7.334375000000000000e+01 +1.012205000000000021e+00 -7.331250000000000000e+01 +1.012210000000000054e+00 -7.334375000000000000e+01 +1.012215000000000087e+00 -7.328125000000000000e+01 +1.012220000000000120e+00 -7.328125000000000000e+01 +1.012225000000000152e+00 -7.328125000000000000e+01 +1.012230000000000185e+00 -7.331250000000000000e+01 +1.012234999999999996e+00 -7.334375000000000000e+01 +1.012240000000000029e+00 -7.334375000000000000e+01 +1.012245000000000061e+00 -7.325000000000000000e+01 +1.012250000000000094e+00 -7.334375000000000000e+01 +1.012255000000000127e+00 -7.331250000000000000e+01 +1.012260000000000160e+00 -7.328125000000000000e+01 +1.012265000000000192e+00 -7.334375000000000000e+01 +1.012270000000000003e+00 -7.325000000000000000e+01 +1.012275000000000036e+00 -7.334375000000000000e+01 +1.012280000000000069e+00 -7.337500000000000000e+01 +1.012285000000000101e+00 -7.331250000000000000e+01 +1.012290000000000134e+00 -7.334375000000000000e+01 +1.012295000000000167e+00 -7.328125000000000000e+01 +1.012299999999999978e+00 -7.325000000000000000e+01 +1.012305000000000010e+00 -7.331250000000000000e+01 +1.012310000000000043e+00 -7.337500000000000000e+01 +1.012315000000000076e+00 -7.334375000000000000e+01 +1.012320000000000109e+00 -7.331250000000000000e+01 +1.012325000000000141e+00 -7.331250000000000000e+01 +1.012330000000000174e+00 -7.331250000000000000e+01 +1.012334999999999985e+00 -7.331250000000000000e+01 +1.012340000000000018e+00 -7.334375000000000000e+01 +1.012345000000000050e+00 -7.331250000000000000e+01 +1.012350000000000083e+00 -7.334375000000000000e+01 +1.012355000000000116e+00 -7.337500000000000000e+01 +1.012360000000000149e+00 -7.331250000000000000e+01 +1.012365000000000181e+00 -7.334375000000000000e+01 +1.012369999999999992e+00 -7.331250000000000000e+01 +1.012375000000000025e+00 -7.331250000000000000e+01 +1.012380000000000058e+00 -7.334375000000000000e+01 +1.012385000000000090e+00 -7.328125000000000000e+01 +1.012390000000000123e+00 -7.337500000000000000e+01 +1.012395000000000156e+00 -7.334375000000000000e+01 +1.012400000000000189e+00 -7.337500000000000000e+01 +1.012404999999999999e+00 -7.331250000000000000e+01 +1.012410000000000032e+00 -7.328125000000000000e+01 +1.012415000000000065e+00 -7.331250000000000000e+01 +1.012420000000000098e+00 -7.331250000000000000e+01 +1.012425000000000130e+00 -7.328125000000000000e+01 +1.012430000000000163e+00 -7.337500000000000000e+01 +1.012434999999999974e+00 -7.337500000000000000e+01 +1.012440000000000007e+00 -7.331250000000000000e+01 +1.012445000000000039e+00 -7.334375000000000000e+01 +1.012450000000000072e+00 -7.340625000000000000e+01 +1.012455000000000105e+00 -7.331250000000000000e+01 +1.012460000000000138e+00 -7.334375000000000000e+01 +1.012465000000000170e+00 -7.331250000000000000e+01 +1.012469999999999981e+00 -7.337500000000000000e+01 +1.012475000000000014e+00 -7.334375000000000000e+01 +1.012480000000000047e+00 -7.331250000000000000e+01 +1.012485000000000079e+00 -7.334375000000000000e+01 +1.012490000000000112e+00 -7.334375000000000000e+01 +1.012495000000000145e+00 -7.331250000000000000e+01 +1.012500000000000178e+00 -7.334375000000000000e+01 +1.012504999999999988e+00 -7.334375000000000000e+01 +1.012510000000000021e+00 -7.334375000000000000e+01 +1.012515000000000054e+00 -7.331250000000000000e+01 +1.012520000000000087e+00 -7.328125000000000000e+01 +1.012525000000000119e+00 -7.325000000000000000e+01 +1.012530000000000152e+00 -7.331250000000000000e+01 +1.012535000000000185e+00 -7.337500000000000000e+01 +1.012539999999999996e+00 -7.334375000000000000e+01 +1.012545000000000028e+00 -7.331250000000000000e+01 +1.012550000000000061e+00 -7.328125000000000000e+01 +1.012555000000000094e+00 -7.328125000000000000e+01 +1.012560000000000127e+00 -7.331250000000000000e+01 +1.012565000000000159e+00 -7.328125000000000000e+01 +1.012570000000000192e+00 -7.331250000000000000e+01 +1.012575000000000003e+00 -7.328125000000000000e+01 +1.012580000000000036e+00 -7.328125000000000000e+01 +1.012585000000000068e+00 -7.328125000000000000e+01 +1.012590000000000101e+00 -7.334375000000000000e+01 +1.012595000000000134e+00 -7.328125000000000000e+01 +1.012600000000000167e+00 -7.321875000000000000e+01 +1.012604999999999977e+00 -7.325000000000000000e+01 +1.012610000000000010e+00 -7.328125000000000000e+01 +1.012615000000000043e+00 -7.334375000000000000e+01 +1.012620000000000076e+00 -7.328125000000000000e+01 +1.012625000000000108e+00 -7.334375000000000000e+01 +1.012630000000000141e+00 -7.331250000000000000e+01 +1.012635000000000174e+00 -7.334375000000000000e+01 +1.012639999999999985e+00 -7.331250000000000000e+01 +1.012645000000000017e+00 -7.331250000000000000e+01 +1.012650000000000050e+00 -7.328125000000000000e+01 +1.012655000000000083e+00 -7.331250000000000000e+01 +1.012660000000000116e+00 -7.328125000000000000e+01 +1.012665000000000148e+00 -7.328125000000000000e+01 +1.012670000000000181e+00 -7.334375000000000000e+01 +1.012674999999999992e+00 -7.331250000000000000e+01 +1.012680000000000025e+00 -7.334375000000000000e+01 +1.012685000000000057e+00 -7.328125000000000000e+01 +1.012690000000000090e+00 -7.331250000000000000e+01 +1.012695000000000123e+00 -7.328125000000000000e+01 +1.012700000000000156e+00 -7.337500000000000000e+01 +1.012705000000000188e+00 -7.328125000000000000e+01 +1.012709999999999999e+00 -7.328125000000000000e+01 +1.012715000000000032e+00 -7.328125000000000000e+01 +1.012720000000000065e+00 -7.334375000000000000e+01 +1.012725000000000097e+00 -7.334375000000000000e+01 +1.012730000000000130e+00 -7.334375000000000000e+01 +1.012735000000000163e+00 -7.331250000000000000e+01 +1.012739999999999974e+00 -7.328125000000000000e+01 +1.012745000000000006e+00 -7.328125000000000000e+01 +1.012750000000000039e+00 -7.331250000000000000e+01 +1.012755000000000072e+00 -7.328125000000000000e+01 +1.012760000000000105e+00 -7.325000000000000000e+01 +1.012765000000000137e+00 -7.331250000000000000e+01 +1.012770000000000170e+00 -7.331250000000000000e+01 +1.012774999999999981e+00 -7.328125000000000000e+01 +1.012780000000000014e+00 -7.328125000000000000e+01 +1.012785000000000046e+00 -7.325000000000000000e+01 +1.012790000000000079e+00 -7.328125000000000000e+01 +1.012795000000000112e+00 -7.328125000000000000e+01 +1.012800000000000145e+00 -7.325000000000000000e+01 +1.012805000000000177e+00 -7.328125000000000000e+01 +1.012809999999999988e+00 -7.334375000000000000e+01 +1.012815000000000021e+00 -7.331250000000000000e+01 +1.012820000000000054e+00 -7.328125000000000000e+01 +1.012825000000000086e+00 -7.331250000000000000e+01 +1.012830000000000119e+00 -7.328125000000000000e+01 +1.012835000000000152e+00 -7.331250000000000000e+01 +1.012840000000000185e+00 -7.331250000000000000e+01 +1.012844999999999995e+00 -7.337500000000000000e+01 +1.012850000000000028e+00 -7.331250000000000000e+01 +1.012855000000000061e+00 -7.334375000000000000e+01 +1.012860000000000094e+00 -7.328125000000000000e+01 +1.012865000000000126e+00 -7.325000000000000000e+01 +1.012870000000000159e+00 -7.334375000000000000e+01 +1.012875000000000192e+00 -7.331250000000000000e+01 +1.012880000000000003e+00 -7.328125000000000000e+01 +1.012885000000000035e+00 -7.325000000000000000e+01 +1.012890000000000068e+00 -7.325000000000000000e+01 +1.012895000000000101e+00 -7.325000000000000000e+01 +1.012900000000000134e+00 -7.328125000000000000e+01 +1.012905000000000166e+00 -7.328125000000000000e+01 +1.012909999999999977e+00 -7.331250000000000000e+01 +1.012915000000000010e+00 -7.331250000000000000e+01 +1.012920000000000043e+00 -7.328125000000000000e+01 +1.012925000000000075e+00 -7.331250000000000000e+01 +1.012930000000000108e+00 -7.328125000000000000e+01 +1.012935000000000141e+00 -7.328125000000000000e+01 +1.012940000000000174e+00 -7.328125000000000000e+01 +1.012944999999999984e+00 -7.328125000000000000e+01 +1.012950000000000017e+00 -7.325000000000000000e+01 +1.012955000000000050e+00 -7.321875000000000000e+01 +1.012960000000000083e+00 -7.328125000000000000e+01 +1.012965000000000115e+00 -7.328125000000000000e+01 +1.012970000000000148e+00 -7.328125000000000000e+01 +1.012975000000000181e+00 -7.328125000000000000e+01 +1.012979999999999992e+00 -7.325000000000000000e+01 +1.012985000000000024e+00 -7.334375000000000000e+01 +1.012990000000000057e+00 -7.334375000000000000e+01 +1.012995000000000090e+00 -7.331250000000000000e+01 +1.013000000000000123e+00 -7.328125000000000000e+01 +1.013005000000000155e+00 -7.328125000000000000e+01 +1.013010000000000188e+00 -7.328125000000000000e+01 +1.013014999999999999e+00 -7.328125000000000000e+01 +1.013020000000000032e+00 -7.325000000000000000e+01 +1.013025000000000064e+00 -7.328125000000000000e+01 +1.013030000000000097e+00 -7.325000000000000000e+01 +1.013035000000000130e+00 -7.331250000000000000e+01 +1.013040000000000163e+00 -7.331250000000000000e+01 +1.013044999999999973e+00 -7.337500000000000000e+01 +1.013050000000000006e+00 -7.331250000000000000e+01 +1.013055000000000039e+00 -7.334375000000000000e+01 +1.013060000000000072e+00 -7.337500000000000000e+01 +1.013065000000000104e+00 -7.337500000000000000e+01 +1.013070000000000137e+00 -7.337500000000000000e+01 +1.013075000000000170e+00 -7.334375000000000000e+01 +1.013079999999999981e+00 -7.340625000000000000e+01 +1.013085000000000013e+00 -7.334375000000000000e+01 +1.013090000000000046e+00 -7.325000000000000000e+01 +1.013095000000000079e+00 -7.331250000000000000e+01 +1.013100000000000112e+00 -7.328125000000000000e+01 +1.013105000000000144e+00 -7.334375000000000000e+01 +1.013110000000000177e+00 -7.337500000000000000e+01 +1.013114999999999988e+00 -7.334375000000000000e+01 +1.013120000000000021e+00 -7.337500000000000000e+01 +1.013125000000000053e+00 -7.337500000000000000e+01 +1.013130000000000086e+00 -7.331250000000000000e+01 +1.013135000000000119e+00 -7.334375000000000000e+01 +1.013140000000000152e+00 -7.334375000000000000e+01 +1.013145000000000184e+00 -7.334375000000000000e+01 +1.013149999999999995e+00 -7.331250000000000000e+01 +1.013155000000000028e+00 -7.337500000000000000e+01 +1.013160000000000061e+00 -7.331250000000000000e+01 +1.013165000000000093e+00 -7.337500000000000000e+01 +1.013170000000000126e+00 -7.331250000000000000e+01 +1.013175000000000159e+00 -7.334375000000000000e+01 +1.013180000000000192e+00 -7.337500000000000000e+01 +1.013185000000000002e+00 -7.334375000000000000e+01 +1.013190000000000035e+00 -7.331250000000000000e+01 +1.013195000000000068e+00 -7.334375000000000000e+01 +1.013200000000000101e+00 -7.337500000000000000e+01 +1.013205000000000133e+00 -7.328125000000000000e+01 +1.013210000000000166e+00 -7.334375000000000000e+01 +1.013214999999999977e+00 -7.334375000000000000e+01 +1.013220000000000010e+00 -7.337500000000000000e+01 +1.013225000000000042e+00 -7.340625000000000000e+01 +1.013230000000000075e+00 -7.340625000000000000e+01 +1.013235000000000108e+00 -7.334375000000000000e+01 +1.013240000000000141e+00 -7.340625000000000000e+01 +1.013245000000000173e+00 -7.337500000000000000e+01 +1.013249999999999984e+00 -7.334375000000000000e+01 +1.013255000000000017e+00 -7.334375000000000000e+01 +1.013260000000000050e+00 -7.328125000000000000e+01 +1.013265000000000082e+00 -7.331250000000000000e+01 +1.013270000000000115e+00 -7.331250000000000000e+01 +1.013275000000000148e+00 -7.328125000000000000e+01 +1.013280000000000181e+00 -7.334375000000000000e+01 +1.013284999999999991e+00 -7.331250000000000000e+01 +1.013290000000000024e+00 -7.334375000000000000e+01 +1.013295000000000057e+00 -7.334375000000000000e+01 +1.013300000000000090e+00 -7.331250000000000000e+01 +1.013305000000000122e+00 -7.328125000000000000e+01 +1.013310000000000155e+00 -7.331250000000000000e+01 +1.013315000000000188e+00 -7.334375000000000000e+01 +1.013319999999999999e+00 -7.334375000000000000e+01 +1.013325000000000031e+00 -7.328125000000000000e+01 +1.013330000000000064e+00 -7.334375000000000000e+01 +1.013335000000000097e+00 -7.334375000000000000e+01 +1.013340000000000130e+00 -7.334375000000000000e+01 +1.013345000000000162e+00 -7.340625000000000000e+01 +1.013349999999999973e+00 -7.331250000000000000e+01 +1.013355000000000006e+00 -7.337500000000000000e+01 +1.013360000000000039e+00 -7.337500000000000000e+01 +1.013365000000000071e+00 -7.343750762939453125e+01 +1.013370000000000104e+00 -7.337500000000000000e+01 +1.013375000000000137e+00 -7.334375000000000000e+01 +1.013380000000000170e+00 -7.328125000000000000e+01 +1.013384999999999980e+00 -7.334375000000000000e+01 +1.013390000000000013e+00 -7.340625000000000000e+01 +1.013395000000000046e+00 -7.334375000000000000e+01 +1.013400000000000079e+00 -7.331250000000000000e+01 +1.013405000000000111e+00 -7.328125000000000000e+01 +1.013410000000000144e+00 -7.340625000000000000e+01 +1.013415000000000177e+00 -7.337500000000000000e+01 +1.013419999999999987e+00 -7.337500000000000000e+01 +1.013425000000000020e+00 -7.328125000000000000e+01 +1.013430000000000053e+00 -7.334375000000000000e+01 +1.013435000000000086e+00 -7.337500000000000000e+01 +1.013440000000000119e+00 -7.334375000000000000e+01 +1.013445000000000151e+00 -7.337500000000000000e+01 +1.013450000000000184e+00 -7.334375000000000000e+01 +1.013454999999999995e+00 -7.340625000000000000e+01 +1.013460000000000027e+00 -7.334375000000000000e+01 +1.013465000000000060e+00 -7.334375000000000000e+01 +1.013470000000000093e+00 -7.337500000000000000e+01 +1.013475000000000126e+00 -7.334375000000000000e+01 +1.013480000000000159e+00 -7.328125000000000000e+01 +1.013485000000000191e+00 -7.334375000000000000e+01 +1.013490000000000002e+00 -7.334375000000000000e+01 +1.013495000000000035e+00 -7.334375000000000000e+01 +1.013500000000000068e+00 -7.331250000000000000e+01 +1.013505000000000100e+00 -7.331250000000000000e+01 +1.013510000000000133e+00 -7.334375000000000000e+01 +1.013515000000000166e+00 -7.331250000000000000e+01 +1.013519999999999976e+00 -7.331250000000000000e+01 +1.013525000000000009e+00 -7.334375000000000000e+01 +1.013530000000000042e+00 -7.328125000000000000e+01 +1.013535000000000075e+00 -7.334375000000000000e+01 +1.013540000000000108e+00 -7.337500000000000000e+01 +1.013545000000000140e+00 -7.334375000000000000e+01 +1.013550000000000173e+00 -7.328125000000000000e+01 +1.013554999999999984e+00 -7.334375000000000000e+01 +1.013560000000000016e+00 -7.340625000000000000e+01 +1.013565000000000049e+00 -7.337500000000000000e+01 +1.013570000000000082e+00 -7.334375000000000000e+01 +1.013575000000000115e+00 -7.334375000000000000e+01 +1.013580000000000148e+00 -7.337500000000000000e+01 +1.013585000000000180e+00 -7.334375000000000000e+01 +1.013589999999999991e+00 -7.334375000000000000e+01 +1.013595000000000024e+00 -7.331250000000000000e+01 +1.013600000000000056e+00 -7.337500000000000000e+01 +1.013605000000000089e+00 -7.331250000000000000e+01 +1.013610000000000122e+00 -7.334375000000000000e+01 +1.013615000000000155e+00 -7.337500000000000000e+01 +1.013620000000000188e+00 -7.340625000000000000e+01 +1.013624999999999998e+00 -7.334375000000000000e+01 +1.013630000000000031e+00 -7.334375000000000000e+01 +1.013635000000000064e+00 -7.334375000000000000e+01 +1.013640000000000096e+00 -7.328125000000000000e+01 +1.013645000000000129e+00 -7.334375000000000000e+01 +1.013650000000000162e+00 -7.334375000000000000e+01 +1.013654999999999973e+00 -7.334375000000000000e+01 +1.013660000000000005e+00 -7.334375000000000000e+01 +1.013665000000000038e+00 -7.334375000000000000e+01 +1.013670000000000071e+00 -7.337500000000000000e+01 +1.013675000000000104e+00 -7.334375000000000000e+01 +1.013680000000000136e+00 -7.331250000000000000e+01 +1.013685000000000169e+00 -7.331250000000000000e+01 +1.013689999999999980e+00 -7.331250000000000000e+01 +1.013695000000000013e+00 -7.328125000000000000e+01 +1.013700000000000045e+00 -7.331250000000000000e+01 +1.013705000000000078e+00 -7.334375000000000000e+01 +1.013710000000000111e+00 -7.331250000000000000e+01 +1.013715000000000144e+00 -7.331250000000000000e+01 +1.013720000000000176e+00 -7.328125000000000000e+01 +1.013724999999999987e+00 -7.334375000000000000e+01 +1.013730000000000020e+00 -7.334375000000000000e+01 +1.013735000000000053e+00 -7.334375000000000000e+01 +1.013740000000000085e+00 -7.337500000000000000e+01 +1.013745000000000118e+00 -7.328125000000000000e+01 +1.013750000000000151e+00 -7.331250000000000000e+01 +1.013755000000000184e+00 -7.331250000000000000e+01 +1.013759999999999994e+00 -7.340625000000000000e+01 +1.013765000000000027e+00 -7.331250000000000000e+01 +1.013770000000000060e+00 -7.337500000000000000e+01 +1.013775000000000093e+00 -7.337500000000000000e+01 +1.013780000000000125e+00 -7.334375000000000000e+01 +1.013785000000000158e+00 -7.334375000000000000e+01 +1.013790000000000191e+00 -7.331250000000000000e+01 +1.013795000000000002e+00 -7.328125000000000000e+01 +1.013800000000000034e+00 -7.331250000000000000e+01 +1.013805000000000067e+00 -7.331250000000000000e+01 +1.013810000000000100e+00 -7.334375000000000000e+01 +1.013815000000000133e+00 -7.337500000000000000e+01 +1.013820000000000165e+00 -7.331250000000000000e+01 +1.013824999999999976e+00 -7.337500000000000000e+01 +1.013830000000000009e+00 -7.340625000000000000e+01 +1.013835000000000042e+00 -7.337500000000000000e+01 +1.013840000000000074e+00 -7.334375000000000000e+01 +1.013845000000000107e+00 -7.331250000000000000e+01 +1.013850000000000140e+00 -7.331250000000000000e+01 +1.013855000000000173e+00 -7.337500000000000000e+01 +1.013859999999999983e+00 -7.337500000000000000e+01 +1.013865000000000016e+00 -7.334375000000000000e+01 +1.013870000000000049e+00 -7.328125000000000000e+01 +1.013875000000000082e+00 -7.334375000000000000e+01 +1.013880000000000114e+00 -7.328125000000000000e+01 +1.013885000000000147e+00 -7.328125000000000000e+01 +1.013890000000000180e+00 -7.328125000000000000e+01 +1.013894999999999991e+00 -7.331250000000000000e+01 +1.013900000000000023e+00 -7.325000000000000000e+01 +1.013905000000000056e+00 -7.325000000000000000e+01 +1.013910000000000089e+00 -7.328125000000000000e+01 +1.013915000000000122e+00 -7.331250000000000000e+01 +1.013920000000000154e+00 -7.328125000000000000e+01 +1.013925000000000187e+00 -7.328125000000000000e+01 +1.013929999999999998e+00 -7.328125000000000000e+01 +1.013935000000000031e+00 -7.331250000000000000e+01 +1.013940000000000063e+00 -7.328125000000000000e+01 +1.013945000000000096e+00 -7.328125000000000000e+01 +1.013950000000000129e+00 -7.328125000000000000e+01 +1.013955000000000162e+00 -7.325000000000000000e+01 +1.013959999999999972e+00 -7.325000000000000000e+01 +1.013965000000000005e+00 -7.328125000000000000e+01 +1.013970000000000038e+00 -7.325000000000000000e+01 +1.013975000000000071e+00 -7.328125000000000000e+01 +1.013980000000000103e+00 -7.325000000000000000e+01 +1.013985000000000136e+00 -7.328125000000000000e+01 +1.013990000000000169e+00 -7.331250000000000000e+01 +1.013994999999999980e+00 -7.331250000000000000e+01 +1.014000000000000012e+00 -7.331250000000000000e+01 +1.014005000000000045e+00 -7.328125000000000000e+01 +1.014010000000000078e+00 -7.328125000000000000e+01 +1.014015000000000111e+00 -7.331250000000000000e+01 +1.014020000000000143e+00 -7.328125000000000000e+01 +1.014025000000000176e+00 -7.325000000000000000e+01 +1.014029999999999987e+00 -7.334375000000000000e+01 +1.014035000000000020e+00 -7.334375000000000000e+01 +1.014040000000000052e+00 -7.325000000000000000e+01 +1.014045000000000085e+00 -7.328125000000000000e+01 +1.014050000000000118e+00 -7.331250000000000000e+01 +1.014055000000000151e+00 -7.331250000000000000e+01 +1.014060000000000183e+00 -7.328125000000000000e+01 +1.014064999999999994e+00 -7.328125000000000000e+01 +1.014070000000000027e+00 -7.325000000000000000e+01 +1.014075000000000060e+00 -7.325000000000000000e+01 +1.014080000000000092e+00 -7.331250000000000000e+01 +1.014085000000000125e+00 -7.325000000000000000e+01 +1.014090000000000158e+00 -7.328125000000000000e+01 +1.014095000000000191e+00 -7.328125000000000000e+01 +1.014100000000000001e+00 -7.328125000000000000e+01 +1.014105000000000034e+00 -7.328125000000000000e+01 +1.014110000000000067e+00 -7.334375000000000000e+01 +1.014115000000000100e+00 -7.328125000000000000e+01 +1.014120000000000132e+00 -7.334375000000000000e+01 +1.014125000000000165e+00 -7.334375000000000000e+01 +1.014129999999999976e+00 -7.331250000000000000e+01 +1.014135000000000009e+00 -7.334375000000000000e+01 +1.014140000000000041e+00 -7.331250000000000000e+01 +1.014145000000000074e+00 -7.325000000000000000e+01 +1.014150000000000107e+00 -7.331250000000000000e+01 +1.014155000000000140e+00 -7.325000000000000000e+01 +1.014160000000000172e+00 -7.321875000000000000e+01 +1.014164999999999983e+00 -7.331250000000000000e+01 +1.014170000000000016e+00 -7.331250000000000000e+01 +1.014175000000000049e+00 -7.328125000000000000e+01 +1.014180000000000081e+00 -7.328125000000000000e+01 +1.014185000000000114e+00 -7.334375000000000000e+01 +1.014190000000000147e+00 -7.331250000000000000e+01 +1.014195000000000180e+00 -7.334375000000000000e+01 +1.014199999999999990e+00 -7.325000000000000000e+01 +1.014205000000000023e+00 -7.331250000000000000e+01 +1.014210000000000056e+00 -7.331250000000000000e+01 +1.014215000000000089e+00 -7.331250000000000000e+01 +1.014220000000000121e+00 -7.328125000000000000e+01 +1.014225000000000154e+00 -7.328125000000000000e+01 +1.014230000000000187e+00 -7.328125000000000000e+01 +1.014234999999999998e+00 -7.334375000000000000e+01 +1.014240000000000030e+00 -7.331250000000000000e+01 +1.014245000000000063e+00 -7.328125000000000000e+01 +1.014250000000000096e+00 -7.334375000000000000e+01 +1.014255000000000129e+00 -7.334375000000000000e+01 +1.014260000000000161e+00 -7.331250000000000000e+01 +1.014264999999999972e+00 -7.334375000000000000e+01 +1.014270000000000005e+00 -7.334375000000000000e+01 +1.014275000000000038e+00 -7.334375000000000000e+01 +1.014280000000000070e+00 -7.331250000000000000e+01 +1.014285000000000103e+00 -7.337500000000000000e+01 +1.014290000000000136e+00 -7.328125000000000000e+01 +1.014295000000000169e+00 -7.328125000000000000e+01 +1.014299999999999979e+00 -7.334375000000000000e+01 +1.014305000000000012e+00 -7.331250000000000000e+01 +1.014310000000000045e+00 -7.331250000000000000e+01 +1.014315000000000078e+00 -7.331250000000000000e+01 +1.014320000000000110e+00 -7.334375000000000000e+01 +1.014325000000000143e+00 -7.331250000000000000e+01 +1.014330000000000176e+00 -7.337500000000000000e+01 +1.014334999999999987e+00 -7.328125000000000000e+01 +1.014340000000000019e+00 -7.331250000000000000e+01 +1.014345000000000052e+00 -7.328125000000000000e+01 +1.014350000000000085e+00 -7.337500000000000000e+01 +1.014355000000000118e+00 -7.331250000000000000e+01 +1.014360000000000150e+00 -7.337500000000000000e+01 +1.014365000000000183e+00 -7.328125000000000000e+01 +1.014369999999999994e+00 -7.331250000000000000e+01 +1.014375000000000027e+00 -7.328125000000000000e+01 +1.014380000000000059e+00 -7.331250000000000000e+01 +1.014385000000000092e+00 -7.337500000000000000e+01 +1.014390000000000125e+00 -7.331250000000000000e+01 +1.014395000000000158e+00 -7.331250000000000000e+01 +1.014400000000000190e+00 -7.328125000000000000e+01 +1.014405000000000001e+00 -7.328125000000000000e+01 +1.014410000000000034e+00 -7.334375000000000000e+01 +1.014415000000000067e+00 -7.325000000000000000e+01 +1.014420000000000099e+00 -7.328125000000000000e+01 +1.014425000000000132e+00 -7.334375000000000000e+01 +1.014430000000000165e+00 -7.334375000000000000e+01 +1.014434999999999976e+00 -7.334375000000000000e+01 +1.014440000000000008e+00 -7.331250000000000000e+01 +1.014445000000000041e+00 -7.334375000000000000e+01 +1.014450000000000074e+00 -7.331250000000000000e+01 +1.014455000000000107e+00 -7.334375000000000000e+01 +1.014460000000000139e+00 -7.328125000000000000e+01 +1.014465000000000172e+00 -7.325000000000000000e+01 +1.014469999999999983e+00 -7.325000000000000000e+01 +1.014475000000000016e+00 -7.331250000000000000e+01 +1.014480000000000048e+00 -7.328125000000000000e+01 +1.014485000000000081e+00 -7.334375000000000000e+01 +1.014490000000000114e+00 -7.331250000000000000e+01 +1.014495000000000147e+00 -7.328125000000000000e+01 +1.014500000000000179e+00 -7.331250000000000000e+01 +1.014504999999999990e+00 -7.325000000000000000e+01 +1.014510000000000023e+00 -7.331250000000000000e+01 +1.014515000000000056e+00 -7.334375000000000000e+01 +1.014520000000000088e+00 -7.328125000000000000e+01 +1.014525000000000121e+00 -7.321875000000000000e+01 +1.014530000000000154e+00 -7.328125000000000000e+01 +1.014535000000000187e+00 -7.334375000000000000e+01 +1.014539999999999997e+00 -7.328125000000000000e+01 +1.014545000000000030e+00 -7.328125000000000000e+01 +1.014550000000000063e+00 -7.325000000000000000e+01 +1.014555000000000096e+00 -7.334375000000000000e+01 +1.014560000000000128e+00 -7.337500000000000000e+01 +1.014565000000000161e+00 -7.328125000000000000e+01 +1.014570000000000194e+00 -7.331250000000000000e+01 +1.014575000000000005e+00 -7.331250000000000000e+01 +1.014580000000000037e+00 -7.331250000000000000e+01 +1.014585000000000070e+00 -7.331250000000000000e+01 +1.014590000000000103e+00 -7.331250000000000000e+01 +1.014595000000000136e+00 -7.331250000000000000e+01 +1.014600000000000168e+00 -7.331250000000000000e+01 +1.014604999999999979e+00 -7.337500000000000000e+01 +1.014610000000000012e+00 -7.334375000000000000e+01 +1.014615000000000045e+00 -7.331250000000000000e+01 +1.014620000000000077e+00 -7.337500000000000000e+01 +1.014625000000000110e+00 -7.334375000000000000e+01 +1.014630000000000143e+00 -7.328125000000000000e+01 +1.014635000000000176e+00 -7.334375000000000000e+01 +1.014639999999999986e+00 -7.328125000000000000e+01 +1.014645000000000019e+00 -7.340625000000000000e+01 +1.014650000000000052e+00 -7.334375000000000000e+01 +1.014655000000000085e+00 -7.331250000000000000e+01 +1.014660000000000117e+00 -7.331250000000000000e+01 +1.014665000000000150e+00 -7.334375000000000000e+01 +1.014670000000000183e+00 -7.328125000000000000e+01 +1.014674999999999994e+00 -7.328125000000000000e+01 +1.014680000000000026e+00 -7.331250000000000000e+01 +1.014685000000000059e+00 -7.328125000000000000e+01 +1.014690000000000092e+00 -7.321875000000000000e+01 +1.014695000000000125e+00 -7.328125000000000000e+01 +1.014700000000000157e+00 -7.328125000000000000e+01 +1.014705000000000190e+00 -7.331250000000000000e+01 +1.014710000000000001e+00 -7.325000000000000000e+01 +1.014715000000000034e+00 -7.328125000000000000e+01 +1.014720000000000066e+00 -7.328125000000000000e+01 +1.014725000000000099e+00 -7.331250000000000000e+01 +1.014730000000000132e+00 -7.328125000000000000e+01 +1.014735000000000165e+00 -7.337500000000000000e+01 +1.014739999999999975e+00 -7.334375000000000000e+01 +1.014745000000000008e+00 -7.334375000000000000e+01 +1.014750000000000041e+00 -7.334375000000000000e+01 +1.014755000000000074e+00 -7.328125000000000000e+01 +1.014760000000000106e+00 -7.331250000000000000e+01 +1.014765000000000139e+00 -7.328125000000000000e+01 +1.014770000000000172e+00 -7.331250000000000000e+01 +1.014774999999999983e+00 -7.331250000000000000e+01 +1.014780000000000015e+00 -7.328125000000000000e+01 +1.014785000000000048e+00 -7.337500000000000000e+01 +1.014790000000000081e+00 -7.334375000000000000e+01 +1.014795000000000114e+00 -7.334375000000000000e+01 +1.014800000000000146e+00 -7.331250000000000000e+01 +1.014805000000000179e+00 -7.325000000000000000e+01 +1.014809999999999990e+00 -7.334375000000000000e+01 +1.014815000000000023e+00 -7.328125000000000000e+01 +1.014820000000000055e+00 -7.334375000000000000e+01 +1.014825000000000088e+00 -7.328125000000000000e+01 +1.014830000000000121e+00 -7.334375000000000000e+01 +1.014835000000000154e+00 -7.334375000000000000e+01 +1.014840000000000186e+00 -7.340625000000000000e+01 +1.014844999999999997e+00 -7.331250000000000000e+01 +1.014850000000000030e+00 -7.337500000000000000e+01 +1.014855000000000063e+00 -7.331250000000000000e+01 +1.014860000000000095e+00 -7.334375000000000000e+01 +1.014865000000000128e+00 -7.328125000000000000e+01 +1.014870000000000161e+00 -7.328125000000000000e+01 +1.014875000000000194e+00 -7.328125000000000000e+01 +1.014880000000000004e+00 -7.331250000000000000e+01 +1.014885000000000037e+00 -7.328125000000000000e+01 +1.014890000000000070e+00 -7.328125000000000000e+01 +1.014895000000000103e+00 -7.331250000000000000e+01 +1.014900000000000135e+00 -7.325000000000000000e+01 +1.014905000000000168e+00 -7.328125000000000000e+01 +1.014909999999999979e+00 -7.331250000000000000e+01 +1.014915000000000012e+00 -7.331250000000000000e+01 +1.014920000000000044e+00 -7.331250000000000000e+01 +1.014925000000000077e+00 -7.331250000000000000e+01 +1.014930000000000110e+00 -7.328125000000000000e+01 +1.014935000000000143e+00 -7.328125000000000000e+01 +1.014940000000000175e+00 -7.331250000000000000e+01 +1.014944999999999986e+00 -7.328125000000000000e+01 +1.014950000000000019e+00 -7.331250000000000000e+01 +1.014955000000000052e+00 -7.334375000000000000e+01 +1.014960000000000084e+00 -7.331250000000000000e+01 +1.014965000000000117e+00 -7.331250000000000000e+01 +1.014970000000000150e+00 -7.328125000000000000e+01 +1.014975000000000183e+00 -7.328125000000000000e+01 +1.014979999999999993e+00 -7.331250000000000000e+01 +1.014985000000000026e+00 -7.331250000000000000e+01 +1.014990000000000059e+00 -7.328125000000000000e+01 +1.014995000000000092e+00 -7.337500000000000000e+01 +1.015000000000000124e+00 -7.328125000000000000e+01 +1.015005000000000157e+00 -7.331250000000000000e+01 +1.015010000000000190e+00 -7.321875000000000000e+01 +1.015015000000000001e+00 -7.328125000000000000e+01 +1.015020000000000033e+00 -7.334375000000000000e+01 +1.015025000000000066e+00 -7.337500000000000000e+01 +1.015030000000000099e+00 -7.331250000000000000e+01 +1.015035000000000132e+00 -7.334375000000000000e+01 +1.015040000000000164e+00 -7.331250000000000000e+01 +1.015044999999999975e+00 -7.337500000000000000e+01 +1.015050000000000008e+00 -7.334375000000000000e+01 +1.015055000000000041e+00 -7.337500000000000000e+01 +1.015060000000000073e+00 -7.334375000000000000e+01 +1.015065000000000106e+00 -7.331250000000000000e+01 +1.015070000000000139e+00 -7.337500000000000000e+01 +1.015075000000000172e+00 -7.340625000000000000e+01 +1.015079999999999982e+00 -7.328125000000000000e+01 +1.015085000000000015e+00 -7.328125000000000000e+01 +1.015090000000000048e+00 -7.334375000000000000e+01 +1.015095000000000081e+00 -7.334375000000000000e+01 +1.015100000000000113e+00 -7.334375000000000000e+01 +1.015105000000000146e+00 -7.331250000000000000e+01 +1.015110000000000179e+00 -7.328125000000000000e+01 +1.015114999999999990e+00 -7.321875000000000000e+01 +1.015120000000000022e+00 -7.334375000000000000e+01 +1.015125000000000055e+00 -7.331250000000000000e+01 +1.015130000000000088e+00 -7.334375000000000000e+01 +1.015135000000000121e+00 -7.334375000000000000e+01 +1.015140000000000153e+00 -7.334375000000000000e+01 +1.015145000000000186e+00 -7.334375000000000000e+01 +1.015149999999999997e+00 -7.334375000000000000e+01 +1.015155000000000030e+00 -7.331250000000000000e+01 +1.015160000000000062e+00 -7.331250000000000000e+01 +1.015165000000000095e+00 -7.334375000000000000e+01 +1.015170000000000128e+00 -7.331250000000000000e+01 +1.015175000000000161e+00 -7.334375000000000000e+01 +1.015180000000000193e+00 -7.325000000000000000e+01 +1.015185000000000004e+00 -7.328125000000000000e+01 +1.015190000000000037e+00 -7.328125000000000000e+01 +1.015195000000000070e+00 -7.331250000000000000e+01 +1.015200000000000102e+00 -7.328125000000000000e+01 +1.015205000000000135e+00 -7.328125000000000000e+01 +1.015210000000000168e+00 -7.334375000000000000e+01 +1.015214999999999979e+00 -7.328125000000000000e+01 +1.015220000000000011e+00 -7.328125000000000000e+01 +1.015225000000000044e+00 -7.337500000000000000e+01 +1.015230000000000077e+00 -7.331250000000000000e+01 +1.015235000000000110e+00 -7.328125000000000000e+01 +1.015240000000000142e+00 -7.328125000000000000e+01 +1.015245000000000175e+00 -7.331250000000000000e+01 +1.015249999999999986e+00 -7.328125000000000000e+01 +1.015255000000000019e+00 -7.328125000000000000e+01 +1.015260000000000051e+00 -7.328125000000000000e+01 +1.015265000000000084e+00 -7.328125000000000000e+01 +1.015270000000000117e+00 -7.331250000000000000e+01 +1.015275000000000150e+00 -7.328125000000000000e+01 +1.015280000000000182e+00 -7.328125000000000000e+01 +1.015284999999999993e+00 -7.331250000000000000e+01 +1.015290000000000026e+00 -7.328125000000000000e+01 +1.015295000000000059e+00 -7.331250000000000000e+01 +1.015300000000000091e+00 -7.328125000000000000e+01 +1.015305000000000124e+00 -7.331250000000000000e+01 +1.015310000000000157e+00 -7.328125000000000000e+01 +1.015315000000000190e+00 -7.328125000000000000e+01 +1.015320000000000000e+00 -7.334375000000000000e+01 +1.015325000000000033e+00 -7.328125000000000000e+01 +1.015330000000000066e+00 -7.328125000000000000e+01 +1.015335000000000099e+00 -7.328125000000000000e+01 +1.015340000000000131e+00 -7.328125000000000000e+01 +1.015345000000000164e+00 -7.331250000000000000e+01 +1.015349999999999975e+00 -7.328125000000000000e+01 +1.015355000000000008e+00 -7.328125000000000000e+01 +1.015360000000000040e+00 -7.331250000000000000e+01 +1.015365000000000073e+00 -7.325000000000000000e+01 +1.015370000000000106e+00 -7.328125000000000000e+01 +1.015375000000000139e+00 -7.328125000000000000e+01 +1.015380000000000171e+00 -7.331250000000000000e+01 +1.015384999999999982e+00 -7.328125000000000000e+01 +1.015390000000000015e+00 -7.321875000000000000e+01 +1.015395000000000048e+00 -7.328125000000000000e+01 +1.015400000000000080e+00 -7.328125000000000000e+01 +1.015405000000000113e+00 -7.328125000000000000e+01 +1.015410000000000146e+00 -7.337500000000000000e+01 +1.015415000000000179e+00 -7.331250000000000000e+01 +1.015419999999999989e+00 -7.331250000000000000e+01 +1.015425000000000022e+00 -7.328125000000000000e+01 +1.015430000000000055e+00 -7.328125000000000000e+01 +1.015435000000000088e+00 -7.334375000000000000e+01 +1.015440000000000120e+00 -7.321875000000000000e+01 +1.015445000000000153e+00 -7.328125000000000000e+01 +1.015450000000000186e+00 -7.337500000000000000e+01 +1.015454999999999997e+00 -7.331250000000000000e+01 +1.015460000000000029e+00 -7.328125000000000000e+01 +1.015465000000000062e+00 -7.325000000000000000e+01 +1.015470000000000095e+00 -7.328125000000000000e+01 +1.015475000000000128e+00 -7.328125000000000000e+01 +1.015480000000000160e+00 -7.331250000000000000e+01 +1.015485000000000193e+00 -7.321875000000000000e+01 +1.015490000000000004e+00 -7.328125000000000000e+01 +1.015495000000000037e+00 -7.334375000000000000e+01 +1.015500000000000069e+00 -7.328125000000000000e+01 +1.015505000000000102e+00 -7.325000000000000000e+01 +1.015510000000000135e+00 -7.328125000000000000e+01 +1.015515000000000168e+00 -7.331250000000000000e+01 +1.015519999999999978e+00 -7.328125000000000000e+01 +1.015525000000000011e+00 -7.328125000000000000e+01 +1.015530000000000044e+00 -7.334375000000000000e+01 +1.015535000000000077e+00 -7.325000000000000000e+01 +1.015540000000000109e+00 -7.328125000000000000e+01 +1.015545000000000142e+00 -7.331250000000000000e+01 +1.015550000000000175e+00 -7.325000000000000000e+01 +1.015554999999999986e+00 -7.334375000000000000e+01 +1.015560000000000018e+00 -7.334375000000000000e+01 +1.015565000000000051e+00 -7.328125000000000000e+01 +1.015570000000000084e+00 -7.328125000000000000e+01 +1.015575000000000117e+00 -7.331250000000000000e+01 +1.015580000000000149e+00 -7.325000000000000000e+01 +1.015585000000000182e+00 -7.331250000000000000e+01 +1.015589999999999993e+00 -7.334375000000000000e+01 +1.015595000000000026e+00 -7.325000000000000000e+01 +1.015600000000000058e+00 -7.331250000000000000e+01 +1.015605000000000091e+00 -7.331250000000000000e+01 +1.015610000000000124e+00 -7.325000000000000000e+01 +1.015615000000000157e+00 -7.325000000000000000e+01 +1.015620000000000189e+00 -7.328125000000000000e+01 +1.015625000000000000e+00 -7.328125000000000000e+01 +1.015630000000000033e+00 -7.328125000000000000e+01 +1.015635000000000066e+00 -7.328125000000000000e+01 +1.015640000000000098e+00 -7.325000000000000000e+01 +1.015645000000000131e+00 -7.331250000000000000e+01 +1.015650000000000164e+00 -7.328125000000000000e+01 +1.015654999999999974e+00 -7.328125000000000000e+01 +1.015660000000000007e+00 -7.328125000000000000e+01 +1.015665000000000040e+00 -7.325000000000000000e+01 +1.015670000000000073e+00 -7.325000000000000000e+01 +1.015675000000000106e+00 -7.328125000000000000e+01 +1.015680000000000138e+00 -7.328125000000000000e+01 +1.015685000000000171e+00 -7.331250000000000000e+01 +1.015689999999999982e+00 -7.325000000000000000e+01 +1.015695000000000014e+00 -7.325000000000000000e+01 +1.015700000000000047e+00 -7.328125000000000000e+01 +1.015705000000000080e+00 -7.318750000000000000e+01 +1.015710000000000113e+00 -7.328125000000000000e+01 +1.015715000000000146e+00 -7.328125000000000000e+01 +1.015720000000000178e+00 -7.331250000000000000e+01 +1.015724999999999989e+00 -7.328125000000000000e+01 +1.015730000000000022e+00 -7.331250000000000000e+01 +1.015735000000000054e+00 -7.318750000000000000e+01 +1.015740000000000087e+00 -7.328125000000000000e+01 +1.015745000000000120e+00 -7.325000000000000000e+01 +1.015750000000000153e+00 -7.321875000000000000e+01 +1.015755000000000186e+00 -7.318750000000000000e+01 +1.015759999999999996e+00 -7.328125000000000000e+01 +1.015765000000000029e+00 -7.318750000000000000e+01 +1.015770000000000062e+00 -7.318750000000000000e+01 +1.015775000000000095e+00 -7.321875000000000000e+01 +1.015780000000000127e+00 -7.328125000000000000e+01 +1.015785000000000160e+00 -7.318750000000000000e+01 +1.015790000000000193e+00 -7.325000000000000000e+01 +1.015795000000000003e+00 -7.325000000000000000e+01 +1.015800000000000036e+00 -7.325000000000000000e+01 +1.015805000000000069e+00 -7.318750000000000000e+01 +1.015810000000000102e+00 -7.325000000000000000e+01 +1.015815000000000135e+00 -7.325000000000000000e+01 +1.015820000000000167e+00 -7.325000000000000000e+01 +1.015824999999999978e+00 -7.321875000000000000e+01 +1.015830000000000011e+00 -7.328125000000000000e+01 +1.015835000000000043e+00 -7.321875000000000000e+01 +1.015840000000000076e+00 -7.321875000000000000e+01 +1.015845000000000109e+00 -7.325000000000000000e+01 +1.015850000000000142e+00 -7.328125000000000000e+01 +1.015855000000000175e+00 -7.325000000000000000e+01 +1.015859999999999985e+00 -7.328125000000000000e+01 +1.015865000000000018e+00 -7.325000000000000000e+01 +1.015870000000000051e+00 -7.331250000000000000e+01 +1.015875000000000083e+00 -7.331250000000000000e+01 +1.015880000000000116e+00 -7.328125000000000000e+01 +1.015885000000000149e+00 -7.331250000000000000e+01 +1.015890000000000182e+00 -7.325000000000000000e+01 +1.015894999999999992e+00 -7.321875000000000000e+01 +1.015900000000000025e+00 -7.328125000000000000e+01 +1.015905000000000058e+00 -7.328125000000000000e+01 +1.015910000000000091e+00 -7.328125000000000000e+01 +1.015915000000000123e+00 -7.331250000000000000e+01 +1.015920000000000156e+00 -7.331250000000000000e+01 +1.015925000000000189e+00 -7.325000000000000000e+01 +1.015930000000000000e+00 -7.321875000000000000e+01 +1.015935000000000032e+00 -7.328125000000000000e+01 +1.015940000000000065e+00 -7.321875000000000000e+01 +1.015945000000000098e+00 -7.325000000000000000e+01 +1.015950000000000131e+00 -7.321875000000000000e+01 +1.015955000000000163e+00 -7.321875000000000000e+01 +1.015959999999999974e+00 -7.328125000000000000e+01 +1.015965000000000007e+00 -7.328125000000000000e+01 +1.015970000000000040e+00 -7.328125000000000000e+01 +1.015975000000000072e+00 -7.328125000000000000e+01 +1.015980000000000105e+00 -7.328125000000000000e+01 +1.015985000000000138e+00 -7.321875000000000000e+01 +1.015990000000000171e+00 -7.331250000000000000e+01 +1.015994999999999981e+00 -7.328125000000000000e+01 +1.016000000000000014e+00 -7.331250000000000000e+01 +1.016005000000000047e+00 -7.328125000000000000e+01 +1.016010000000000080e+00 -7.325000000000000000e+01 +1.016015000000000112e+00 -7.331250000000000000e+01 +1.016020000000000145e+00 -7.328125000000000000e+01 +1.016025000000000178e+00 -7.328125000000000000e+01 +1.016029999999999989e+00 -7.328125000000000000e+01 +1.016035000000000021e+00 -7.321875000000000000e+01 +1.016040000000000054e+00 -7.331250000000000000e+01 +1.016045000000000087e+00 -7.328125000000000000e+01 +1.016050000000000120e+00 -7.321875000000000000e+01 +1.016055000000000152e+00 -7.328125000000000000e+01 +1.016060000000000185e+00 -7.325000000000000000e+01 +1.016064999999999996e+00 -7.325000000000000000e+01 +1.016070000000000029e+00 -7.325000000000000000e+01 +1.016075000000000061e+00 -7.328125000000000000e+01 +1.016080000000000094e+00 -7.334375000000000000e+01 +1.016085000000000127e+00 -7.328125000000000000e+01 +1.016090000000000160e+00 -7.331250000000000000e+01 +1.016095000000000192e+00 -7.328125000000000000e+01 +1.016100000000000003e+00 -7.331250000000000000e+01 +1.016105000000000036e+00 -7.331250000000000000e+01 +1.016110000000000069e+00 -7.328125000000000000e+01 +1.016115000000000101e+00 -7.325000000000000000e+01 +1.016120000000000134e+00 -7.325000000000000000e+01 +1.016125000000000167e+00 -7.325000000000000000e+01 +1.016129999999999978e+00 -7.328125000000000000e+01 +1.016135000000000010e+00 -7.325000000000000000e+01 +1.016140000000000043e+00 -7.328125000000000000e+01 +1.016145000000000076e+00 -7.328125000000000000e+01 +1.016150000000000109e+00 -7.328125000000000000e+01 +1.016155000000000141e+00 -7.321875000000000000e+01 +1.016160000000000174e+00 -7.321875000000000000e+01 +1.016164999999999985e+00 -7.325000000000000000e+01 +1.016170000000000018e+00 -7.325000000000000000e+01 +1.016175000000000050e+00 -7.328125000000000000e+01 +1.016180000000000083e+00 -7.321875000000000000e+01 +1.016185000000000116e+00 -7.331250000000000000e+01 +1.016190000000000149e+00 -7.321875000000000000e+01 +1.016195000000000181e+00 -7.328125000000000000e+01 +1.016199999999999992e+00 -7.334375000000000000e+01 +1.016205000000000025e+00 -7.325000000000000000e+01 +1.016210000000000058e+00 -7.328125000000000000e+01 +1.016215000000000090e+00 -7.328125000000000000e+01 +1.016220000000000123e+00 -7.331250000000000000e+01 +1.016225000000000156e+00 -7.328125000000000000e+01 +1.016230000000000189e+00 -7.325000000000000000e+01 +1.016234999999999999e+00 -7.331250000000000000e+01 +1.016240000000000032e+00 -7.321875000000000000e+01 +1.016245000000000065e+00 -7.331250000000000000e+01 +1.016250000000000098e+00 -7.331250000000000000e+01 +1.016255000000000130e+00 -7.328125000000000000e+01 +1.016260000000000163e+00 -7.331250000000000000e+01 +1.016264999999999974e+00 -7.328125000000000000e+01 +1.016270000000000007e+00 -7.331250000000000000e+01 +1.016275000000000039e+00 -7.334375000000000000e+01 +1.016280000000000072e+00 -7.331250000000000000e+01 +1.016285000000000105e+00 -7.328125000000000000e+01 +1.016290000000000138e+00 -7.331250000000000000e+01 +1.016295000000000170e+00 -7.328125000000000000e+01 +1.016299999999999981e+00 -7.334375000000000000e+01 +1.016305000000000014e+00 -7.328125000000000000e+01 +1.016310000000000047e+00 -7.334375000000000000e+01 +1.016315000000000079e+00 -7.331250000000000000e+01 +1.016320000000000112e+00 -7.328125000000000000e+01 +1.016325000000000145e+00 -7.331250000000000000e+01 +1.016330000000000178e+00 -7.334375000000000000e+01 +1.016334999999999988e+00 -7.334375000000000000e+01 +1.016340000000000021e+00 -7.331250000000000000e+01 +1.016345000000000054e+00 -7.334375000000000000e+01 +1.016350000000000087e+00 -7.334375000000000000e+01 +1.016355000000000119e+00 -7.328125000000000000e+01 +1.016360000000000152e+00 -7.325000000000000000e+01 +1.016365000000000185e+00 -7.331250000000000000e+01 +1.016369999999999996e+00 -7.334375000000000000e+01 +1.016375000000000028e+00 -7.334375000000000000e+01 +1.016380000000000061e+00 -7.331250000000000000e+01 +1.016385000000000094e+00 -7.334375000000000000e+01 +1.016390000000000127e+00 -7.328125000000000000e+01 +1.016395000000000159e+00 -7.337500000000000000e+01 +1.016400000000000192e+00 -7.331250000000000000e+01 +1.016405000000000003e+00 -7.331250000000000000e+01 +1.016410000000000036e+00 -7.334375000000000000e+01 +1.016415000000000068e+00 -7.325000000000000000e+01 +1.016420000000000101e+00 -7.328125000000000000e+01 +1.016425000000000134e+00 -7.328125000000000000e+01 +1.016430000000000167e+00 -7.331250000000000000e+01 +1.016434999999999977e+00 -7.325000000000000000e+01 +1.016440000000000010e+00 -7.328125000000000000e+01 +1.016445000000000043e+00 -7.331250000000000000e+01 +1.016450000000000076e+00 -7.331250000000000000e+01 +1.016455000000000108e+00 -7.325000000000000000e+01 +1.016460000000000141e+00 -7.334375000000000000e+01 +1.016465000000000174e+00 -7.328125000000000000e+01 +1.016469999999999985e+00 -7.328125000000000000e+01 +1.016475000000000017e+00 -7.328125000000000000e+01 +1.016480000000000050e+00 -7.318750000000000000e+01 +1.016485000000000083e+00 -7.325000000000000000e+01 +1.016490000000000116e+00 -7.318750000000000000e+01 +1.016495000000000148e+00 -7.328125000000000000e+01 +1.016500000000000181e+00 -7.328125000000000000e+01 +1.016504999999999992e+00 -7.328125000000000000e+01 +1.016510000000000025e+00 -7.328125000000000000e+01 +1.016515000000000057e+00 -7.328125000000000000e+01 +1.016520000000000090e+00 -7.325000000000000000e+01 +1.016525000000000123e+00 -7.328125000000000000e+01 +1.016530000000000156e+00 -7.325000000000000000e+01 +1.016535000000000188e+00 -7.328125000000000000e+01 +1.016539999999999999e+00 -7.334375000000000000e+01 +1.016545000000000032e+00 -7.328125000000000000e+01 +1.016550000000000065e+00 -7.328125000000000000e+01 +1.016555000000000097e+00 -7.328125000000000000e+01 +1.016560000000000130e+00 -7.328125000000000000e+01 +1.016565000000000163e+00 -7.331250000000000000e+01 +1.016569999999999974e+00 -7.328125000000000000e+01 +1.016575000000000006e+00 -7.325000000000000000e+01 +1.016580000000000039e+00 -7.325000000000000000e+01 +1.016585000000000072e+00 -7.331250000000000000e+01 +1.016590000000000105e+00 -7.321875000000000000e+01 +1.016595000000000137e+00 -7.328125000000000000e+01 +1.016600000000000170e+00 -7.334375000000000000e+01 +1.016604999999999981e+00 -7.328125000000000000e+01 +1.016610000000000014e+00 -7.321875000000000000e+01 +1.016615000000000046e+00 -7.328125000000000000e+01 +1.016620000000000079e+00 -7.328125000000000000e+01 +1.016625000000000112e+00 -7.321875000000000000e+01 +1.016630000000000145e+00 -7.325000000000000000e+01 +1.016635000000000177e+00 -7.328125000000000000e+01 +1.016639999999999988e+00 -7.328125000000000000e+01 +1.016645000000000021e+00 -7.328125000000000000e+01 +1.016650000000000054e+00 -7.334375000000000000e+01 +1.016655000000000086e+00 -7.334375000000000000e+01 +1.016660000000000119e+00 -7.328125000000000000e+01 +1.016665000000000152e+00 -7.331250000000000000e+01 +1.016670000000000185e+00 -7.328125000000000000e+01 +1.016674999999999995e+00 -7.328125000000000000e+01 +1.016680000000000028e+00 -7.331250000000000000e+01 +1.016685000000000061e+00 -7.328125000000000000e+01 +1.016690000000000094e+00 -7.318750000000000000e+01 +1.016695000000000126e+00 -7.328125000000000000e+01 +1.016700000000000159e+00 -7.325000000000000000e+01 +1.016705000000000192e+00 -7.328125000000000000e+01 +1.016710000000000003e+00 -7.328125000000000000e+01 +1.016715000000000035e+00 -7.328125000000000000e+01 +1.016720000000000068e+00 -7.331250000000000000e+01 +1.016725000000000101e+00 -7.331250000000000000e+01 +1.016730000000000134e+00 -7.325000000000000000e+01 +1.016735000000000166e+00 -7.325000000000000000e+01 +1.016739999999999977e+00 -7.328125000000000000e+01 +1.016745000000000010e+00 -7.325000000000000000e+01 +1.016750000000000043e+00 -7.328125000000000000e+01 +1.016755000000000075e+00 -7.325000000000000000e+01 +1.016760000000000108e+00 -7.334375000000000000e+01 +1.016765000000000141e+00 -7.325000000000000000e+01 +1.016770000000000174e+00 -7.328125000000000000e+01 +1.016774999999999984e+00 -7.325000000000000000e+01 +1.016780000000000017e+00 -7.328125000000000000e+01 +1.016785000000000050e+00 -7.331250000000000000e+01 +1.016790000000000083e+00 -7.328125000000000000e+01 +1.016795000000000115e+00 -7.331250000000000000e+01 +1.016800000000000148e+00 -7.321875000000000000e+01 +1.016805000000000181e+00 -7.325000000000000000e+01 +1.016809999999999992e+00 -7.325000000000000000e+01 +1.016815000000000024e+00 -7.328125000000000000e+01 +1.016820000000000057e+00 -7.328125000000000000e+01 +1.016825000000000090e+00 -7.328125000000000000e+01 +1.016830000000000123e+00 -7.328125000000000000e+01 +1.016835000000000155e+00 -7.328125000000000000e+01 +1.016840000000000188e+00 -7.328125000000000000e+01 +1.016844999999999999e+00 -7.328125000000000000e+01 +1.016850000000000032e+00 -7.328125000000000000e+01 +1.016855000000000064e+00 -7.337500000000000000e+01 +1.016860000000000097e+00 -7.331250000000000000e+01 +1.016865000000000130e+00 -7.331250000000000000e+01 +1.016870000000000163e+00 -7.331250000000000000e+01 +1.016874999999999973e+00 -7.318750000000000000e+01 +1.016880000000000006e+00 -7.325000000000000000e+01 +1.016885000000000039e+00 -7.325000000000000000e+01 +1.016890000000000072e+00 -7.328125000000000000e+01 +1.016895000000000104e+00 -7.321875000000000000e+01 +1.016900000000000137e+00 -7.321875000000000000e+01 +1.016905000000000170e+00 -7.325000000000000000e+01 +1.016909999999999981e+00 -7.331250000000000000e+01 +1.016915000000000013e+00 -7.328125000000000000e+01 +1.016920000000000046e+00 -7.325000000000000000e+01 +1.016925000000000079e+00 -7.325000000000000000e+01 +1.016930000000000112e+00 -7.325000000000000000e+01 +1.016935000000000144e+00 -7.321875000000000000e+01 +1.016940000000000177e+00 -7.325000000000000000e+01 +1.016944999999999988e+00 -7.321875000000000000e+01 +1.016950000000000021e+00 -7.328125000000000000e+01 +1.016955000000000053e+00 -7.328125000000000000e+01 +1.016960000000000086e+00 -7.334375000000000000e+01 +1.016965000000000119e+00 -7.331250000000000000e+01 +1.016970000000000152e+00 -7.331250000000000000e+01 +1.016975000000000184e+00 -7.328125000000000000e+01 +1.016979999999999995e+00 -7.331250000000000000e+01 +1.016985000000000028e+00 -7.328125000000000000e+01 +1.016990000000000061e+00 -7.328125000000000000e+01 +1.016995000000000093e+00 -7.321875000000000000e+01 +1.017000000000000126e+00 -7.325000000000000000e+01 +1.017005000000000159e+00 -7.328125000000000000e+01 +1.017010000000000192e+00 -7.328125000000000000e+01 +1.017015000000000002e+00 -7.331250000000000000e+01 +1.017020000000000035e+00 -7.328125000000000000e+01 +1.017025000000000068e+00 -7.325000000000000000e+01 +1.017030000000000101e+00 -7.328125000000000000e+01 +1.017035000000000133e+00 -7.328125000000000000e+01 +1.017040000000000166e+00 -7.328125000000000000e+01 +1.017044999999999977e+00 -7.334375000000000000e+01 +1.017050000000000010e+00 -7.331250000000000000e+01 +1.017055000000000042e+00 -7.328125000000000000e+01 +1.017060000000000075e+00 -7.321875000000000000e+01 +1.017065000000000108e+00 -7.328125000000000000e+01 +1.017070000000000141e+00 -7.328125000000000000e+01 +1.017075000000000173e+00 -7.325000000000000000e+01 +1.017079999999999984e+00 -7.318750000000000000e+01 +1.017085000000000017e+00 -7.325000000000000000e+01 +1.017090000000000050e+00 -7.328125000000000000e+01 +1.017095000000000082e+00 -7.321875000000000000e+01 +1.017100000000000115e+00 -7.325000000000000000e+01 +1.017105000000000148e+00 -7.328125000000000000e+01 +1.017110000000000181e+00 -7.328125000000000000e+01 +1.017114999999999991e+00 -7.325000000000000000e+01 +1.017120000000000024e+00 -7.328125000000000000e+01 +1.017125000000000057e+00 -7.328125000000000000e+01 +1.017130000000000090e+00 -7.325000000000000000e+01 +1.017135000000000122e+00 -7.331250000000000000e+01 +1.017140000000000155e+00 -7.325000000000000000e+01 +1.017145000000000188e+00 -7.328125000000000000e+01 +1.017149999999999999e+00 -7.325000000000000000e+01 +1.017155000000000031e+00 -7.321875000000000000e+01 +1.017160000000000064e+00 -7.328125000000000000e+01 +1.017165000000000097e+00 -7.328125000000000000e+01 +1.017170000000000130e+00 -7.328125000000000000e+01 +1.017175000000000162e+00 -7.318750000000000000e+01 +1.017179999999999973e+00 -7.328125000000000000e+01 +1.017185000000000006e+00 -7.325000000000000000e+01 +1.017190000000000039e+00 -7.328125000000000000e+01 +1.017195000000000071e+00 -7.331250000000000000e+01 +1.017200000000000104e+00 -7.328125000000000000e+01 +1.017205000000000137e+00 -7.328125000000000000e+01 +1.017210000000000170e+00 -7.328125000000000000e+01 +1.017214999999999980e+00 -7.331250000000000000e+01 +1.017220000000000013e+00 -7.337500000000000000e+01 +1.017225000000000046e+00 -7.331250000000000000e+01 +1.017230000000000079e+00 -7.334375000000000000e+01 +1.017235000000000111e+00 -7.334375000000000000e+01 +1.017240000000000144e+00 -7.331250000000000000e+01 +1.017245000000000177e+00 -7.334375000000000000e+01 +1.017249999999999988e+00 -7.331250000000000000e+01 +1.017255000000000020e+00 -7.334375000000000000e+01 +1.017260000000000053e+00 -7.331250000000000000e+01 +1.017265000000000086e+00 -7.328125000000000000e+01 +1.017270000000000119e+00 -7.325000000000000000e+01 +1.017275000000000151e+00 -7.328125000000000000e+01 +1.017280000000000184e+00 -7.318750000000000000e+01 +1.017284999999999995e+00 -7.334375000000000000e+01 +1.017290000000000028e+00 -7.331250000000000000e+01 +1.017295000000000060e+00 -7.331250000000000000e+01 +1.017300000000000093e+00 -7.334375000000000000e+01 +1.017305000000000126e+00 -7.328125000000000000e+01 +1.017310000000000159e+00 -7.334375000000000000e+01 +1.017315000000000191e+00 -7.334375000000000000e+01 +1.017320000000000002e+00 -7.321875000000000000e+01 +1.017325000000000035e+00 -7.337500000000000000e+01 +1.017330000000000068e+00 -7.331250000000000000e+01 +1.017335000000000100e+00 -7.337500000000000000e+01 +1.017340000000000133e+00 -7.334375000000000000e+01 +1.017345000000000166e+00 -7.331250000000000000e+01 +1.017349999999999977e+00 -7.337500000000000000e+01 +1.017355000000000009e+00 -7.331250000000000000e+01 +1.017360000000000042e+00 -7.328125000000000000e+01 +1.017365000000000075e+00 -7.331250000000000000e+01 +1.017370000000000108e+00 -7.334375000000000000e+01 +1.017375000000000140e+00 -7.334375000000000000e+01 +1.017380000000000173e+00 -7.328125000000000000e+01 +1.017384999999999984e+00 -7.334375000000000000e+01 +1.017390000000000017e+00 -7.331250000000000000e+01 +1.017395000000000049e+00 -7.328125000000000000e+01 +1.017400000000000082e+00 -7.337500000000000000e+01 +1.017405000000000115e+00 -7.334375000000000000e+01 +1.017410000000000148e+00 -7.334375000000000000e+01 +1.017415000000000180e+00 -7.334375000000000000e+01 +1.017419999999999991e+00 -7.331250000000000000e+01 +1.017425000000000024e+00 -7.340625000000000000e+01 +1.017430000000000057e+00 -7.334375000000000000e+01 +1.017435000000000089e+00 -7.334375000000000000e+01 +1.017440000000000122e+00 -7.331250000000000000e+01 +1.017445000000000155e+00 -7.328125000000000000e+01 +1.017450000000000188e+00 -7.334375000000000000e+01 +1.017454999999999998e+00 -7.337500000000000000e+01 +1.017460000000000031e+00 -7.325000000000000000e+01 +1.017465000000000064e+00 -7.331250000000000000e+01 +1.017470000000000097e+00 -7.334375000000000000e+01 +1.017475000000000129e+00 -7.331250000000000000e+01 +1.017480000000000162e+00 -7.328125000000000000e+01 +1.017484999999999973e+00 -7.334375000000000000e+01 +1.017490000000000006e+00 -7.334375000000000000e+01 +1.017495000000000038e+00 -7.340625000000000000e+01 +1.017500000000000071e+00 -7.328125000000000000e+01 +1.017505000000000104e+00 -7.331250000000000000e+01 +1.017510000000000137e+00 -7.328125000000000000e+01 +1.017515000000000169e+00 -7.334375000000000000e+01 +1.017519999999999980e+00 -7.334375000000000000e+01 +1.017525000000000013e+00 -7.331250000000000000e+01 +1.017530000000000046e+00 -7.334375000000000000e+01 +1.017535000000000078e+00 -7.334375000000000000e+01 +1.017540000000000111e+00 -7.334375000000000000e+01 +1.017545000000000144e+00 -7.328125000000000000e+01 +1.017550000000000177e+00 -7.328125000000000000e+01 +1.017554999999999987e+00 -7.337500000000000000e+01 +1.017560000000000020e+00 -7.334375000000000000e+01 +1.017565000000000053e+00 -7.334375000000000000e+01 +1.017570000000000086e+00 -7.331250000000000000e+01 +1.017575000000000118e+00 -7.334375000000000000e+01 +1.017580000000000151e+00 -7.337500000000000000e+01 +1.017585000000000184e+00 -7.331250000000000000e+01 +1.017589999999999995e+00 -7.334375000000000000e+01 +1.017595000000000027e+00 -7.334375000000000000e+01 +1.017600000000000060e+00 -7.328125000000000000e+01 +1.017605000000000093e+00 -7.331250000000000000e+01 +1.017610000000000126e+00 -7.331250000000000000e+01 +1.017615000000000158e+00 -7.328125000000000000e+01 +1.017620000000000191e+00 -7.328125000000000000e+01 +1.017625000000000002e+00 -7.331250000000000000e+01 +1.017630000000000035e+00 -7.331250000000000000e+01 +1.017635000000000067e+00 -7.334375000000000000e+01 +1.017640000000000100e+00 -7.331250000000000000e+01 +1.017645000000000133e+00 -7.337500000000000000e+01 +1.017650000000000166e+00 -7.334375000000000000e+01 +1.017654999999999976e+00 -7.331250000000000000e+01 +1.017660000000000009e+00 -7.334375000000000000e+01 +1.017665000000000042e+00 -7.328125000000000000e+01 +1.017670000000000075e+00 -7.331250000000000000e+01 +1.017675000000000107e+00 -7.331250000000000000e+01 +1.017680000000000140e+00 -7.334375000000000000e+01 +1.017685000000000173e+00 -7.334375000000000000e+01 +1.017689999999999984e+00 -7.331250000000000000e+01 +1.017695000000000016e+00 -7.331250000000000000e+01 +1.017700000000000049e+00 -7.331250000000000000e+01 +1.017705000000000082e+00 -7.328125000000000000e+01 +1.017710000000000115e+00 -7.340625000000000000e+01 +1.017715000000000147e+00 -7.331250000000000000e+01 +1.017720000000000180e+00 -7.334375000000000000e+01 +1.017724999999999991e+00 -7.337500000000000000e+01 +1.017730000000000024e+00 -7.334375000000000000e+01 +1.017735000000000056e+00 -7.337500000000000000e+01 +1.017740000000000089e+00 -7.331250000000000000e+01 +1.017745000000000122e+00 -7.328125000000000000e+01 +1.017750000000000155e+00 -7.337500000000000000e+01 +1.017755000000000187e+00 -7.334375000000000000e+01 +1.017759999999999998e+00 -7.331250000000000000e+01 +1.017765000000000031e+00 -7.331250000000000000e+01 +1.017770000000000064e+00 -7.334375000000000000e+01 +1.017775000000000096e+00 -7.331250000000000000e+01 +1.017780000000000129e+00 -7.334375000000000000e+01 +1.017785000000000162e+00 -7.328125000000000000e+01 +1.017789999999999973e+00 -7.337500000000000000e+01 +1.017795000000000005e+00 -7.337500000000000000e+01 +1.017800000000000038e+00 -7.331250000000000000e+01 +1.017805000000000071e+00 -7.331250000000000000e+01 +1.017810000000000104e+00 -7.331250000000000000e+01 +1.017815000000000136e+00 -7.331250000000000000e+01 +1.017820000000000169e+00 -7.337500000000000000e+01 +1.017824999999999980e+00 -7.334375000000000000e+01 +1.017830000000000013e+00 -7.328125000000000000e+01 +1.017835000000000045e+00 -7.334375000000000000e+01 +1.017840000000000078e+00 -7.331250000000000000e+01 +1.017845000000000111e+00 -7.328125000000000000e+01 +1.017850000000000144e+00 -7.331250000000000000e+01 +1.017855000000000176e+00 -7.331250000000000000e+01 +1.017859999999999987e+00 -7.328125000000000000e+01 +1.017865000000000020e+00 -7.328125000000000000e+01 +1.017870000000000053e+00 -7.321875000000000000e+01 +1.017875000000000085e+00 -7.321875000000000000e+01 +1.017880000000000118e+00 -7.328125000000000000e+01 +1.017885000000000151e+00 -7.331250000000000000e+01 +1.017890000000000184e+00 -7.321875000000000000e+01 +1.017894999999999994e+00 -7.328125000000000000e+01 +1.017900000000000027e+00 -7.321875000000000000e+01 +1.017905000000000060e+00 -7.325000000000000000e+01 +1.017910000000000093e+00 -7.321875000000000000e+01 +1.017915000000000125e+00 -7.331250000000000000e+01 +1.017920000000000158e+00 -7.321875000000000000e+01 +1.017925000000000191e+00 -7.334375000000000000e+01 +1.017930000000000001e+00 -7.328125000000000000e+01 +1.017935000000000034e+00 -7.328125000000000000e+01 +1.017940000000000067e+00 -7.328125000000000000e+01 +1.017945000000000100e+00 -7.331250000000000000e+01 +1.017950000000000133e+00 -7.334375000000000000e+01 +1.017955000000000165e+00 -7.334375000000000000e+01 +1.017959999999999976e+00 -7.334375000000000000e+01 +1.017965000000000009e+00 -7.331250000000000000e+01 +1.017970000000000041e+00 -7.331250000000000000e+01 +1.017975000000000074e+00 -7.334375000000000000e+01 +1.017980000000000107e+00 -7.328125000000000000e+01 +1.017985000000000140e+00 -7.325000000000000000e+01 +1.017990000000000173e+00 -7.334375000000000000e+01 +1.017994999999999983e+00 -7.328125000000000000e+01 +1.018000000000000016e+00 -7.331250000000000000e+01 +1.018005000000000049e+00 -7.328125000000000000e+01 +1.018010000000000081e+00 -7.334375000000000000e+01 +1.018015000000000114e+00 -7.328125000000000000e+01 +1.018020000000000147e+00 -7.328125000000000000e+01 +1.018025000000000180e+00 -7.337500000000000000e+01 +1.018029999999999990e+00 -7.337500000000000000e+01 +1.018035000000000023e+00 -7.328125000000000000e+01 +1.018040000000000056e+00 -7.331250000000000000e+01 +1.018045000000000089e+00 -7.325000000000000000e+01 +1.018050000000000122e+00 -7.325000000000000000e+01 +1.018055000000000154e+00 -7.328125000000000000e+01 +1.018060000000000187e+00 -7.328125000000000000e+01 +1.018064999999999998e+00 -7.328125000000000000e+01 +1.018070000000000030e+00 -7.325000000000000000e+01 +1.018075000000000063e+00 -7.321875000000000000e+01 +1.018080000000000096e+00 -7.328125000000000000e+01 +1.018085000000000129e+00 -7.318750000000000000e+01 +1.018090000000000162e+00 -7.325000000000000000e+01 +1.018095000000000194e+00 -7.321875000000000000e+01 +1.018100000000000005e+00 -7.325000000000000000e+01 +1.018105000000000038e+00 -7.325000000000000000e+01 +1.018110000000000070e+00 -7.328125000000000000e+01 +1.018115000000000103e+00 -7.318750000000000000e+01 +1.018120000000000136e+00 -7.328125000000000000e+01 +1.018125000000000169e+00 -7.318750000000000000e+01 +1.018129999999999979e+00 -7.321875000000000000e+01 +1.018135000000000012e+00 -7.325000000000000000e+01 +1.018140000000000045e+00 -7.321875000000000000e+01 +1.018145000000000078e+00 -7.321875000000000000e+01 +1.018150000000000110e+00 -7.321875000000000000e+01 +1.018155000000000143e+00 -7.321875000000000000e+01 +1.018160000000000176e+00 -7.325000000000000000e+01 +1.018164999999999987e+00 -7.328125000000000000e+01 +1.018170000000000019e+00 -7.321875000000000000e+01 +1.018175000000000052e+00 -7.328125000000000000e+01 +1.018180000000000085e+00 -7.321875000000000000e+01 +1.018185000000000118e+00 -7.318750000000000000e+01 +1.018190000000000150e+00 -7.325000000000000000e+01 +1.018195000000000183e+00 -7.325000000000000000e+01 +1.018199999999999994e+00 -7.331250000000000000e+01 +1.018205000000000027e+00 -7.328125000000000000e+01 +1.018210000000000059e+00 -7.328125000000000000e+01 +1.018215000000000092e+00 -7.328125000000000000e+01 +1.018220000000000125e+00 -7.325000000000000000e+01 +1.018225000000000158e+00 -7.328125000000000000e+01 +1.018230000000000190e+00 -7.325000000000000000e+01 +1.018235000000000001e+00 -7.328125000000000000e+01 +1.018240000000000034e+00 -7.331250000000000000e+01 +1.018245000000000067e+00 -7.328125000000000000e+01 +1.018250000000000099e+00 -7.328125000000000000e+01 +1.018255000000000132e+00 -7.325000000000000000e+01 +1.018260000000000165e+00 -7.331250000000000000e+01 +1.018264999999999976e+00 -7.328125000000000000e+01 +1.018270000000000008e+00 -7.328125000000000000e+01 +1.018275000000000041e+00 -7.328125000000000000e+01 +1.018280000000000074e+00 -7.331250000000000000e+01 +1.018285000000000107e+00 -7.331250000000000000e+01 +1.018290000000000139e+00 -7.328125000000000000e+01 +1.018295000000000172e+00 -7.328125000000000000e+01 +1.018299999999999983e+00 -7.328125000000000000e+01 +1.018305000000000016e+00 -7.331250000000000000e+01 +1.018310000000000048e+00 -7.331250000000000000e+01 +1.018315000000000081e+00 -7.328125000000000000e+01 +1.018320000000000114e+00 -7.334375000000000000e+01 +1.018325000000000147e+00 -7.325000000000000000e+01 +1.018330000000000179e+00 -7.328125000000000000e+01 +1.018334999999999990e+00 -7.325000000000000000e+01 +1.018340000000000023e+00 -7.331250000000000000e+01 +1.018345000000000056e+00 -7.328125000000000000e+01 +1.018350000000000088e+00 -7.328125000000000000e+01 +1.018355000000000121e+00 -7.334375000000000000e+01 +1.018360000000000154e+00 -7.331250000000000000e+01 +1.018365000000000187e+00 -7.334375000000000000e+01 +1.018369999999999997e+00 -7.334375000000000000e+01 +1.018375000000000030e+00 -7.331250000000000000e+01 +1.018380000000000063e+00 -7.334375000000000000e+01 +1.018385000000000096e+00 -7.334375000000000000e+01 +1.018390000000000128e+00 -7.331250000000000000e+01 +1.018395000000000161e+00 -7.331250000000000000e+01 +1.018400000000000194e+00 -7.331250000000000000e+01 +1.018405000000000005e+00 -7.328125000000000000e+01 +1.018410000000000037e+00 -7.334375000000000000e+01 +1.018415000000000070e+00 -7.334375000000000000e+01 +1.018420000000000103e+00 -7.337500000000000000e+01 +1.018425000000000136e+00 -7.334375000000000000e+01 +1.018430000000000168e+00 -7.334375000000000000e+01 +1.018434999999999979e+00 -7.331250000000000000e+01 +1.018440000000000012e+00 -7.334375000000000000e+01 +1.018445000000000045e+00 -7.334375000000000000e+01 +1.018450000000000077e+00 -7.337500000000000000e+01 +1.018455000000000110e+00 -7.337500000000000000e+01 +1.018460000000000143e+00 -7.334375000000000000e+01 +1.018465000000000176e+00 -7.334375000000000000e+01 +1.018469999999999986e+00 -7.334375000000000000e+01 +1.018475000000000019e+00 -7.337500000000000000e+01 +1.018480000000000052e+00 -7.340625000000000000e+01 +1.018485000000000085e+00 -7.337500000000000000e+01 +1.018490000000000117e+00 -7.334375000000000000e+01 +1.018495000000000150e+00 -7.334375000000000000e+01 +1.018500000000000183e+00 -7.340625000000000000e+01 +1.018504999999999994e+00 -7.334375000000000000e+01 +1.018510000000000026e+00 -7.331250000000000000e+01 +1.018515000000000059e+00 -7.331250000000000000e+01 +1.018520000000000092e+00 -7.334375000000000000e+01 +1.018525000000000125e+00 -7.334375000000000000e+01 +1.018530000000000157e+00 -7.340625000000000000e+01 +1.018535000000000190e+00 -7.328125000000000000e+01 +1.018540000000000001e+00 -7.331250000000000000e+01 +1.018545000000000034e+00 -7.331250000000000000e+01 +1.018550000000000066e+00 -7.328125000000000000e+01 +1.018555000000000099e+00 -7.334375000000000000e+01 +1.018560000000000132e+00 -7.337500000000000000e+01 +1.018565000000000165e+00 -7.331250000000000000e+01 +1.018569999999999975e+00 -7.334375000000000000e+01 +1.018575000000000008e+00 -7.331250000000000000e+01 +1.018580000000000041e+00 -7.325000000000000000e+01 +1.018585000000000074e+00 -7.337500000000000000e+01 +1.018590000000000106e+00 -7.328125000000000000e+01 +1.018595000000000139e+00 -7.325000000000000000e+01 +1.018600000000000172e+00 -7.325000000000000000e+01 +1.018604999999999983e+00 -7.334375000000000000e+01 +1.018610000000000015e+00 -7.328125000000000000e+01 +1.018615000000000048e+00 -7.328125000000000000e+01 +1.018620000000000081e+00 -7.325000000000000000e+01 +1.018625000000000114e+00 -7.328125000000000000e+01 +1.018630000000000146e+00 -7.331250000000000000e+01 +1.018635000000000179e+00 -7.331250000000000000e+01 +1.018639999999999990e+00 -7.328125000000000000e+01 +1.018645000000000023e+00 -7.337500000000000000e+01 +1.018650000000000055e+00 -7.331250000000000000e+01 +1.018655000000000088e+00 -7.334375000000000000e+01 +1.018660000000000121e+00 -7.331250000000000000e+01 +1.018665000000000154e+00 -7.328125000000000000e+01 +1.018670000000000186e+00 -7.334375000000000000e+01 +1.018674999999999997e+00 -7.331250000000000000e+01 +1.018680000000000030e+00 -7.334375000000000000e+01 +1.018685000000000063e+00 -7.331250000000000000e+01 +1.018690000000000095e+00 -7.337500000000000000e+01 +1.018695000000000128e+00 -7.331250000000000000e+01 +1.018700000000000161e+00 -7.334375000000000000e+01 +1.018705000000000194e+00 -7.337500000000000000e+01 +1.018710000000000004e+00 -7.334375000000000000e+01 +1.018715000000000037e+00 -7.340625000000000000e+01 +1.018720000000000070e+00 -7.337500000000000000e+01 +1.018725000000000103e+00 -7.328125000000000000e+01 +1.018730000000000135e+00 -7.331250000000000000e+01 +1.018735000000000168e+00 -7.334375000000000000e+01 +1.018739999999999979e+00 -7.331250000000000000e+01 +1.018745000000000012e+00 -7.334375000000000000e+01 +1.018750000000000044e+00 -7.337500000000000000e+01 +1.018755000000000077e+00 -7.334375000000000000e+01 +1.018760000000000110e+00 -7.334375000000000000e+01 +1.018765000000000143e+00 -7.334375000000000000e+01 +1.018770000000000175e+00 -7.334375000000000000e+01 +1.018774999999999986e+00 -7.331250000000000000e+01 +1.018780000000000019e+00 -7.334375000000000000e+01 +1.018785000000000052e+00 -7.334375000000000000e+01 +1.018790000000000084e+00 -7.334375000000000000e+01 +1.018795000000000117e+00 -7.328125000000000000e+01 +1.018800000000000150e+00 -7.334375000000000000e+01 +1.018805000000000183e+00 -7.328125000000000000e+01 +1.018809999999999993e+00 -7.334375000000000000e+01 +1.018815000000000026e+00 -7.328125000000000000e+01 +1.018820000000000059e+00 -7.328125000000000000e+01 +1.018825000000000092e+00 -7.331250000000000000e+01 +1.018830000000000124e+00 -7.334375000000000000e+01 +1.018835000000000157e+00 -7.337500000000000000e+01 +1.018840000000000190e+00 -7.340625000000000000e+01 +1.018845000000000001e+00 -7.340625000000000000e+01 +1.018850000000000033e+00 -7.337500000000000000e+01 +1.018855000000000066e+00 -7.340625000000000000e+01 +1.018860000000000099e+00 -7.334375000000000000e+01 +1.018865000000000132e+00 -7.337500000000000000e+01 +1.018870000000000164e+00 -7.340625000000000000e+01 +1.018874999999999975e+00 -7.340625000000000000e+01 +1.018880000000000008e+00 -7.340625000000000000e+01 +1.018885000000000041e+00 -7.337500000000000000e+01 +1.018890000000000073e+00 -7.340625000000000000e+01 +1.018895000000000106e+00 -7.334375000000000000e+01 +1.018900000000000139e+00 -7.334375000000000000e+01 +1.018905000000000172e+00 -7.334375000000000000e+01 +1.018909999999999982e+00 -7.334375000000000000e+01 +1.018915000000000015e+00 -7.340625000000000000e+01 +1.018920000000000048e+00 -7.331250000000000000e+01 +1.018925000000000081e+00 -7.337500000000000000e+01 +1.018930000000000113e+00 -7.340625000000000000e+01 +1.018935000000000146e+00 -7.337500000000000000e+01 +1.018940000000000179e+00 -7.331250000000000000e+01 +1.018944999999999990e+00 -7.334375000000000000e+01 +1.018950000000000022e+00 -7.337500000000000000e+01 +1.018955000000000055e+00 -7.328125000000000000e+01 +1.018960000000000088e+00 -7.334375000000000000e+01 +1.018965000000000121e+00 -7.334375000000000000e+01 +1.018970000000000153e+00 -7.328125000000000000e+01 +1.018975000000000186e+00 -7.340625000000000000e+01 +1.018979999999999997e+00 -7.337500000000000000e+01 +1.018985000000000030e+00 -7.331250000000000000e+01 +1.018990000000000062e+00 -7.331250000000000000e+01 +1.018995000000000095e+00 -7.340625000000000000e+01 +1.019000000000000128e+00 -7.334375000000000000e+01 +1.019005000000000161e+00 -7.340625000000000000e+01 +1.019010000000000193e+00 -7.328125000000000000e+01 +1.019015000000000004e+00 -7.334375000000000000e+01 +1.019020000000000037e+00 -7.328125000000000000e+01 +1.019025000000000070e+00 -7.337500000000000000e+01 +1.019030000000000102e+00 -7.334375000000000000e+01 +1.019035000000000135e+00 -7.334375000000000000e+01 +1.019040000000000168e+00 -7.337500000000000000e+01 +1.019044999999999979e+00 -7.331250000000000000e+01 +1.019050000000000011e+00 -7.334375000000000000e+01 +1.019055000000000044e+00 -7.337500000000000000e+01 +1.019060000000000077e+00 -7.340625000000000000e+01 +1.019065000000000110e+00 -7.331250000000000000e+01 +1.019070000000000142e+00 -7.337500000000000000e+01 +1.019075000000000175e+00 -7.337500000000000000e+01 +1.019079999999999986e+00 -7.340625000000000000e+01 +1.019085000000000019e+00 -7.334375000000000000e+01 +1.019090000000000051e+00 -7.337500000000000000e+01 +1.019095000000000084e+00 -7.334375000000000000e+01 +1.019100000000000117e+00 -7.340625000000000000e+01 +1.019105000000000150e+00 -7.334375000000000000e+01 +1.019110000000000182e+00 -7.337500000000000000e+01 +1.019114999999999993e+00 -7.331250000000000000e+01 +1.019120000000000026e+00 -7.337500000000000000e+01 +1.019125000000000059e+00 -7.340625000000000000e+01 +1.019130000000000091e+00 -7.334375000000000000e+01 +1.019135000000000124e+00 -7.337500000000000000e+01 +1.019140000000000157e+00 -7.337500000000000000e+01 +1.019145000000000190e+00 -7.331250000000000000e+01 +1.019150000000000000e+00 -7.331250000000000000e+01 +1.019155000000000033e+00 -7.334375000000000000e+01 +1.019160000000000066e+00 -7.334375000000000000e+01 +1.019165000000000099e+00 -7.334375000000000000e+01 +1.019170000000000131e+00 -7.334375000000000000e+01 +1.019175000000000164e+00 -7.340625000000000000e+01 +1.019179999999999975e+00 -7.337500000000000000e+01 +1.019185000000000008e+00 -7.343750762939453125e+01 +1.019190000000000040e+00 -7.334375000000000000e+01 +1.019195000000000073e+00 -7.334375000000000000e+01 +1.019200000000000106e+00 -7.334375000000000000e+01 +1.019205000000000139e+00 -7.337500000000000000e+01 +1.019210000000000171e+00 -7.334375000000000000e+01 +1.019214999999999982e+00 -7.331250000000000000e+01 +1.019220000000000015e+00 -7.334375000000000000e+01 +1.019225000000000048e+00 -7.337500000000000000e+01 +1.019230000000000080e+00 -7.328125000000000000e+01 +1.019235000000000113e+00 -7.334375000000000000e+01 +1.019240000000000146e+00 -7.337500000000000000e+01 +1.019245000000000179e+00 -7.334375000000000000e+01 +1.019249999999999989e+00 -7.334375000000000000e+01 +1.019255000000000022e+00 -7.337500000000000000e+01 +1.019260000000000055e+00 -7.331250000000000000e+01 +1.019265000000000088e+00 -7.328125000000000000e+01 +1.019270000000000120e+00 -7.334375000000000000e+01 +1.019275000000000153e+00 -7.337500000000000000e+01 +1.019280000000000186e+00 -7.331250000000000000e+01 +1.019284999999999997e+00 -7.334375000000000000e+01 +1.019290000000000029e+00 -7.337500000000000000e+01 +1.019295000000000062e+00 -7.334375000000000000e+01 +1.019300000000000095e+00 -7.340625000000000000e+01 +1.019305000000000128e+00 -7.328125000000000000e+01 +1.019310000000000160e+00 -7.334375000000000000e+01 +1.019315000000000193e+00 -7.331250000000000000e+01 +1.019320000000000004e+00 -7.334375000000000000e+01 +1.019325000000000037e+00 -7.334375000000000000e+01 +1.019330000000000069e+00 -7.328125000000000000e+01 +1.019335000000000102e+00 -7.337500000000000000e+01 +1.019340000000000135e+00 -7.328125000000000000e+01 +1.019345000000000168e+00 -7.334375000000000000e+01 +1.019349999999999978e+00 -7.334375000000000000e+01 +1.019355000000000011e+00 -7.331250000000000000e+01 +1.019360000000000044e+00 -7.331250000000000000e+01 +1.019365000000000077e+00 -7.337500000000000000e+01 +1.019370000000000109e+00 -7.328125000000000000e+01 +1.019375000000000142e+00 -7.337500000000000000e+01 +1.019380000000000175e+00 -7.337500000000000000e+01 +1.019384999999999986e+00 -7.331250000000000000e+01 +1.019390000000000018e+00 -7.331250000000000000e+01 +1.019395000000000051e+00 -7.340625000000000000e+01 +1.019400000000000084e+00 -7.331250000000000000e+01 +1.019405000000000117e+00 -7.334375000000000000e+01 +1.019410000000000149e+00 -7.337500000000000000e+01 +1.019415000000000182e+00 -7.328125000000000000e+01 +1.019419999999999993e+00 -7.337500000000000000e+01 +1.019425000000000026e+00 -7.340625000000000000e+01 +1.019430000000000058e+00 -7.343750762939453125e+01 +1.019435000000000091e+00 -7.337500000000000000e+01 +1.019440000000000124e+00 -7.340625000000000000e+01 +1.019445000000000157e+00 -7.337500000000000000e+01 +1.019450000000000189e+00 -7.334375000000000000e+01 +1.019455000000000000e+00 -7.334375000000000000e+01 +1.019460000000000033e+00 -7.337500000000000000e+01 +1.019465000000000066e+00 -7.340625000000000000e+01 +1.019470000000000098e+00 -7.340625000000000000e+01 +1.019475000000000131e+00 -7.331250000000000000e+01 +1.019480000000000164e+00 -7.343750762939453125e+01 +1.019484999999999975e+00 -7.337500000000000000e+01 +1.019490000000000007e+00 -7.340625000000000000e+01 +1.019495000000000040e+00 -7.334375000000000000e+01 +1.019500000000000073e+00 -7.337500000000000000e+01 +1.019505000000000106e+00 -7.340625000000000000e+01 +1.019510000000000138e+00 -7.331250000000000000e+01 +1.019515000000000171e+00 -7.337500000000000000e+01 +1.019519999999999982e+00 -7.340625000000000000e+01 +1.019525000000000015e+00 -7.337500000000000000e+01 +1.019530000000000047e+00 -7.334375000000000000e+01 +1.019535000000000080e+00 -7.334375000000000000e+01 +1.019540000000000113e+00 -7.334375000000000000e+01 +1.019545000000000146e+00 -7.334375000000000000e+01 +1.019550000000000178e+00 -7.331250000000000000e+01 +1.019554999999999989e+00 -7.334375000000000000e+01 +1.019560000000000022e+00 -7.340625000000000000e+01 +1.019565000000000055e+00 -7.328125000000000000e+01 +1.019570000000000087e+00 -7.334375000000000000e+01 +1.019575000000000120e+00 -7.331250000000000000e+01 +1.019580000000000153e+00 -7.334375000000000000e+01 +1.019585000000000186e+00 -7.340625000000000000e+01 +1.019589999999999996e+00 -7.334375000000000000e+01 +1.019595000000000029e+00 -7.337500000000000000e+01 +1.019600000000000062e+00 -7.334375000000000000e+01 +1.019605000000000095e+00 -7.334375000000000000e+01 +1.019610000000000127e+00 -7.337500000000000000e+01 +1.019615000000000160e+00 -7.334375000000000000e+01 +1.019620000000000193e+00 -7.334375000000000000e+01 +1.019625000000000004e+00 -7.337500000000000000e+01 +1.019630000000000036e+00 -7.334375000000000000e+01 +1.019635000000000069e+00 -7.328125000000000000e+01 +1.019640000000000102e+00 -7.334375000000000000e+01 +1.019645000000000135e+00 -7.334375000000000000e+01 +1.019650000000000167e+00 -7.334375000000000000e+01 +1.019654999999999978e+00 -7.334375000000000000e+01 +1.019660000000000011e+00 -7.328125000000000000e+01 +1.019665000000000044e+00 -7.331250000000000000e+01 +1.019670000000000076e+00 -7.331250000000000000e+01 +1.019675000000000109e+00 -7.328125000000000000e+01 +1.019680000000000142e+00 -7.328125000000000000e+01 +1.019685000000000175e+00 -7.331250000000000000e+01 +1.019689999999999985e+00 -7.331250000000000000e+01 +1.019695000000000018e+00 -7.340625000000000000e+01 +1.019700000000000051e+00 -7.331250000000000000e+01 +1.019705000000000084e+00 -7.334375000000000000e+01 +1.019710000000000116e+00 -7.334375000000000000e+01 +1.019715000000000149e+00 -7.328125000000000000e+01 +1.019720000000000182e+00 -7.325000000000000000e+01 +1.019724999999999993e+00 -7.334375000000000000e+01 +1.019730000000000025e+00 -7.331250000000000000e+01 +1.019735000000000058e+00 -7.331250000000000000e+01 +1.019740000000000091e+00 -7.328125000000000000e+01 +1.019745000000000124e+00 -7.328125000000000000e+01 +1.019750000000000156e+00 -7.331250000000000000e+01 +1.019755000000000189e+00 -7.334375000000000000e+01 +1.019760000000000000e+00 -7.331250000000000000e+01 +1.019765000000000033e+00 -7.337500000000000000e+01 +1.019770000000000065e+00 -7.328125000000000000e+01 +1.019775000000000098e+00 -7.328125000000000000e+01 +1.019780000000000131e+00 -7.331250000000000000e+01 +1.019785000000000164e+00 -7.337500000000000000e+01 +1.019789999999999974e+00 -7.337500000000000000e+01 +1.019795000000000007e+00 -7.331250000000000000e+01 +1.019800000000000040e+00 -7.337500000000000000e+01 +1.019805000000000073e+00 -7.334375000000000000e+01 +1.019810000000000105e+00 -7.337500000000000000e+01 +1.019815000000000138e+00 -7.331250000000000000e+01 +1.019820000000000171e+00 -7.328125000000000000e+01 +1.019824999999999982e+00 -7.328125000000000000e+01 +1.019830000000000014e+00 -7.331250000000000000e+01 +1.019835000000000047e+00 -7.328125000000000000e+01 +1.019840000000000080e+00 -7.328125000000000000e+01 +1.019845000000000113e+00 -7.334375000000000000e+01 +1.019850000000000145e+00 -7.334375000000000000e+01 +1.019855000000000178e+00 -7.331250000000000000e+01 +1.019859999999999989e+00 -7.331250000000000000e+01 +1.019865000000000022e+00 -7.331250000000000000e+01 +1.019870000000000054e+00 -7.334375000000000000e+01 +1.019875000000000087e+00 -7.331250000000000000e+01 +1.019880000000000120e+00 -7.337500000000000000e+01 +1.019885000000000153e+00 -7.337500000000000000e+01 +1.019890000000000185e+00 -7.331250000000000000e+01 +1.019894999999999996e+00 -7.334375000000000000e+01 +1.019900000000000029e+00 -7.331250000000000000e+01 +1.019905000000000062e+00 -7.331250000000000000e+01 +1.019910000000000094e+00 -7.340625000000000000e+01 +1.019915000000000127e+00 -7.334375000000000000e+01 +1.019920000000000160e+00 -7.334375000000000000e+01 +1.019925000000000193e+00 -7.337500000000000000e+01 +1.019930000000000003e+00 -7.331250000000000000e+01 +1.019935000000000036e+00 -7.334375000000000000e+01 +1.019940000000000069e+00 -7.337500000000000000e+01 +1.019945000000000102e+00 -7.334375000000000000e+01 +1.019950000000000134e+00 -7.337500000000000000e+01 +1.019955000000000167e+00 -7.334375000000000000e+01 +1.019959999999999978e+00 -7.334375000000000000e+01 +1.019965000000000011e+00 -7.334375000000000000e+01 +1.019970000000000043e+00 -7.334375000000000000e+01 +1.019975000000000076e+00 -7.331250000000000000e+01 +1.019980000000000109e+00 -7.331250000000000000e+01 +1.019985000000000142e+00 -7.331250000000000000e+01 +1.019990000000000174e+00 -7.334375000000000000e+01 +1.019994999999999985e+00 -7.334375000000000000e+01 +1.020000000000000018e+00 -7.337500000000000000e+01 +1.020005000000000051e+00 -7.331250000000000000e+01 +1.020010000000000083e+00 -7.334375000000000000e+01 +1.020015000000000116e+00 -7.334375000000000000e+01 +1.020020000000000149e+00 -7.331250000000000000e+01 +1.020025000000000182e+00 -7.334375000000000000e+01 +1.020029999999999992e+00 -7.350000000000000000e+01 +1.020035000000000025e+00 -7.365625000000000000e+01 +1.020040000000000058e+00 -7.384375762939453125e+01 +1.020045000000000091e+00 -7.400000000000000000e+01 +1.020050000000000123e+00 -7.403125000000000000e+01 +1.020055000000000156e+00 -7.393750000000000000e+01 +1.020060000000000189e+00 -7.381250000000000000e+01 +1.020065000000000000e+00 -7.359375000000000000e+01 +1.020070000000000032e+00 -7.334375000000000000e+01 +1.020075000000000065e+00 -7.309375000000000000e+01 +1.020080000000000098e+00 -7.287500000000000000e+01 +1.020085000000000131e+00 -7.278125000000000000e+01 +1.020090000000000163e+00 -7.253125000000000000e+01 +1.020094999999999974e+00 -7.246875000000000000e+01 +1.020100000000000007e+00 -7.231250762939453125e+01 +1.020105000000000040e+00 -7.231250762939453125e+01 +1.020110000000000072e+00 -7.215625000000000000e+01 +1.020115000000000105e+00 -7.209375762939453125e+01 +1.020120000000000138e+00 -7.203125000000000000e+01 +1.020125000000000171e+00 -7.187500000000000000e+01 +1.020129999999999981e+00 -7.175000000000000000e+01 +1.020135000000000014e+00 -7.171875000000000000e+01 +1.020140000000000047e+00 -7.162500000000000000e+01 +1.020145000000000080e+00 -7.153125000000000000e+01 +1.020150000000000112e+00 -7.146875000000000000e+01 +1.020155000000000145e+00 -7.134375000000000000e+01 +1.020160000000000178e+00 -7.131250000000000000e+01 +1.020164999999999988e+00 -7.118750000000000000e+01 +1.020170000000000021e+00 -7.115625000000000000e+01 +1.020175000000000054e+00 -7.106250762939453125e+01 +1.020180000000000087e+00 -7.096875762939453125e+01 +1.020185000000000120e+00 -7.096875762939453125e+01 +1.020190000000000152e+00 -7.078125000000000000e+01 +1.020195000000000185e+00 -7.071875000000000000e+01 +1.020199999999999996e+00 -7.059375000000000000e+01 +1.020205000000000028e+00 -7.053125000000000000e+01 +1.020210000000000061e+00 -7.046875000000000000e+01 +1.020215000000000094e+00 -7.046875000000000000e+01 +1.020220000000000127e+00 -7.034375762939453125e+01 +1.020225000000000160e+00 -7.025000762939453125e+01 +1.020230000000000192e+00 -7.021875000000000000e+01 +1.020235000000000003e+00 -7.012500000000000000e+01 +1.020240000000000036e+00 -7.003125000000000000e+01 +1.020245000000000068e+00 -7.003125000000000000e+01 +1.020250000000000101e+00 -6.990625000000000000e+01 +1.020255000000000134e+00 -6.984375762939453125e+01 +1.020260000000000167e+00 -6.978125000000000000e+01 +1.020264999999999977e+00 -6.968750000000000000e+01 +1.020270000000000010e+00 -6.965625000000000000e+01 +1.020275000000000043e+00 -6.959375000000000000e+01 +1.020280000000000076e+00 -6.953125762939453125e+01 +1.020285000000000108e+00 -6.946875000000000000e+01 +1.020290000000000141e+00 -6.937500000000000000e+01 +1.020295000000000174e+00 -6.937500000000000000e+01 +1.020299999999999985e+00 -6.928125000000000000e+01 +1.020305000000000017e+00 -6.918750000000000000e+01 +1.020310000000000050e+00 -6.912500762939453125e+01 +1.020315000000000083e+00 -6.912500762939453125e+01 +1.020320000000000116e+00 -6.900000000000000000e+01 +1.020325000000000149e+00 -6.900000000000000000e+01 +1.020330000000000181e+00 -6.893750000000000000e+01 +1.020334999999999992e+00 -6.890625762939453125e+01 +1.020340000000000025e+00 -6.887500000000000000e+01 +1.020345000000000057e+00 -6.881250762939453125e+01 +1.020350000000000090e+00 -6.871875000000000000e+01 +1.020355000000000123e+00 -6.868750000000000000e+01 +1.020360000000000156e+00 -6.865625000000000000e+01 +1.020365000000000189e+00 -6.859375000000000000e+01 +1.020369999999999999e+00 -6.850000762939453125e+01 +1.020375000000000032e+00 -6.843750000000000000e+01 +1.020380000000000065e+00 -6.843750000000000000e+01 +1.020385000000000097e+00 -6.834375000000000000e+01 +1.020390000000000130e+00 -6.821875000000000000e+01 +1.020395000000000163e+00 -6.821875000000000000e+01 +1.020399999999999974e+00 -6.825000000000000000e+01 +1.020405000000000006e+00 -6.815625000000000000e+01 +1.020410000000000039e+00 -6.812500000000000000e+01 +1.020415000000000072e+00 -6.809375762939453125e+01 +1.020420000000000105e+00 -6.803125000000000000e+01 +1.020425000000000137e+00 -6.796875000000000000e+01 +1.020430000000000170e+00 -6.790625000000000000e+01 +1.020434999999999981e+00 -6.784375000000000000e+01 +1.020440000000000014e+00 -6.778125762939453125e+01 +1.020445000000000046e+00 -6.781250000000000000e+01 +1.020450000000000079e+00 -6.775000000000000000e+01 +1.020455000000000112e+00 -6.768750762939453125e+01 +1.020460000000000145e+00 -6.765625000000000000e+01 +1.020465000000000177e+00 -6.759375000000000000e+01 +1.020469999999999988e+00 -6.753125000000000000e+01 +1.020475000000000021e+00 -6.756250000000000000e+01 +1.020480000000000054e+00 -6.750000000000000000e+01 +1.020485000000000086e+00 -6.743750000000000000e+01 +1.020490000000000119e+00 -6.734375000000000000e+01 +1.020495000000000152e+00 -6.740625000000000000e+01 +1.020500000000000185e+00 -6.734375000000000000e+01 +1.020504999999999995e+00 -6.728125000000000000e+01 +1.020510000000000028e+00 -6.728125000000000000e+01 +1.020515000000000061e+00 -6.725000000000000000e+01 +1.020520000000000094e+00 -6.721875000000000000e+01 +1.020525000000000126e+00 -6.715625000000000000e+01 +1.020530000000000159e+00 -6.715625000000000000e+01 +1.020535000000000192e+00 -6.706250762939453125e+01 +1.020540000000000003e+00 -6.703125000000000000e+01 +1.020545000000000035e+00 -6.703125000000000000e+01 +1.020550000000000068e+00 -6.690625000000000000e+01 +1.020555000000000101e+00 -6.690625000000000000e+01 +1.020560000000000134e+00 -6.690625000000000000e+01 +1.020565000000000166e+00 -6.684375000000000000e+01 +1.020569999999999977e+00 -6.684375000000000000e+01 +1.020575000000000010e+00 -6.684375000000000000e+01 +1.020580000000000043e+00 -6.681250000000000000e+01 +1.020585000000000075e+00 -6.681250000000000000e+01 +1.020590000000000108e+00 -6.671875000000000000e+01 +1.020595000000000141e+00 -6.671875000000000000e+01 +1.020600000000000174e+00 -6.668750000000000000e+01 +1.020604999999999984e+00 -6.659375000000000000e+01 +1.020610000000000017e+00 -6.659375000000000000e+01 +1.020615000000000050e+00 -6.650000000000000000e+01 +1.020620000000000083e+00 -6.653125000000000000e+01 +1.020625000000000115e+00 -6.650000000000000000e+01 +1.020630000000000148e+00 -6.646875000000000000e+01 +1.020635000000000181e+00 -6.643750762939453125e+01 +1.020639999999999992e+00 -6.643750762939453125e+01 +1.020645000000000024e+00 -6.640625000000000000e+01 +1.020650000000000057e+00 -6.637500000000000000e+01 +1.020655000000000090e+00 -6.634375762939453125e+01 +1.020660000000000123e+00 -6.631250000000000000e+01 +1.020665000000000155e+00 -6.625000762939453125e+01 +1.020670000000000188e+00 -6.621875000000000000e+01 +1.020674999999999999e+00 -6.615625000000000000e+01 +1.020680000000000032e+00 -6.615625000000000000e+01 +1.020685000000000064e+00 -6.618750000000000000e+01 +1.020690000000000097e+00 -6.615625000000000000e+01 +1.020695000000000130e+00 -6.609375000000000000e+01 +1.020700000000000163e+00 -6.606250000000000000e+01 +1.020704999999999973e+00 -6.606250000000000000e+01 +1.020710000000000006e+00 -6.603125762939453125e+01 +1.020715000000000039e+00 -6.600000000000000000e+01 +1.020720000000000072e+00 -6.603125762939453125e+01 +1.020725000000000104e+00 -6.596875000000000000e+01 +1.020730000000000137e+00 -6.596875000000000000e+01 +1.020735000000000170e+00 -6.590625000000000000e+01 +1.020739999999999981e+00 -6.587500000000000000e+01 +1.020745000000000013e+00 -6.590625000000000000e+01 +1.020750000000000046e+00 -6.584375000000000000e+01 +1.020755000000000079e+00 -6.581250000000000000e+01 +1.020760000000000112e+00 -6.584375000000000000e+01 +1.020765000000000144e+00 -6.575000000000000000e+01 +1.020770000000000177e+00 -6.578125000000000000e+01 +1.020774999999999988e+00 -6.578125000000000000e+01 +1.020780000000000021e+00 -6.568750000000000000e+01 +1.020785000000000053e+00 -6.565625000000000000e+01 +1.020790000000000086e+00 -6.559375000000000000e+01 +1.020795000000000119e+00 -6.559375000000000000e+01 +1.020800000000000152e+00 -6.559375000000000000e+01 +1.020805000000000184e+00 -6.553125000000000000e+01 +1.020809999999999995e+00 -6.553125000000000000e+01 +1.020815000000000028e+00 -6.556250000000000000e+01 +1.020820000000000061e+00 -6.550000000000000000e+01 +1.020825000000000093e+00 -6.553125000000000000e+01 +1.020830000000000126e+00 -6.546875000000000000e+01 +1.020835000000000159e+00 -6.540625000000000000e+01 +1.020840000000000192e+00 -6.546875000000000000e+01 +1.020845000000000002e+00 -6.540625000000000000e+01 +1.020850000000000035e+00 -6.534375000000000000e+01 +1.020855000000000068e+00 -6.537500000000000000e+01 +1.020860000000000101e+00 -6.537500000000000000e+01 +1.020865000000000133e+00 -6.531250762939453125e+01 +1.020870000000000166e+00 -6.534375000000000000e+01 +1.020874999999999977e+00 -6.525000000000000000e+01 +1.020880000000000010e+00 -6.521875762939453125e+01 +1.020885000000000042e+00 -6.521875762939453125e+01 +1.020890000000000075e+00 -6.528125000000000000e+01 +1.020895000000000108e+00 -6.518750000000000000e+01 +1.020900000000000141e+00 -6.515625000000000000e+01 +1.020905000000000173e+00 -6.518750000000000000e+01 +1.020909999999999984e+00 -6.509375000000000000e+01 +1.020915000000000017e+00 -6.509375000000000000e+01 +1.020920000000000050e+00 -6.506250000000000000e+01 +1.020925000000000082e+00 -6.506250000000000000e+01 +1.020930000000000115e+00 -6.506250000000000000e+01 +1.020935000000000148e+00 -6.503125000000000000e+01 +1.020940000000000181e+00 -6.500000762939453125e+01 +1.020944999999999991e+00 -6.500000762939453125e+01 +1.020950000000000024e+00 -6.500000762939453125e+01 +1.020955000000000057e+00 -6.496875000000000000e+01 +1.020960000000000090e+00 -6.496875000000000000e+01 +1.020965000000000122e+00 -6.493750000000000000e+01 +1.020970000000000155e+00 -6.490625762939453125e+01 +1.020975000000000188e+00 -6.493750000000000000e+01 +1.020979999999999999e+00 -6.493750000000000000e+01 +1.020985000000000031e+00 -6.490625762939453125e+01 +1.020990000000000064e+00 -6.490625762939453125e+01 +1.020995000000000097e+00 -6.478125000000000000e+01 +1.021000000000000130e+00 -6.484375000000000000e+01 +1.021005000000000162e+00 -6.484375000000000000e+01 +1.021009999999999973e+00 -6.481250000000000000e+01 +1.021015000000000006e+00 -6.481250000000000000e+01 +1.021020000000000039e+00 -6.478125000000000000e+01 +1.021025000000000071e+00 -6.468750000000000000e+01 +1.021030000000000104e+00 -6.471875000000000000e+01 +1.021035000000000137e+00 -6.471875000000000000e+01 +1.021040000000000170e+00 -6.465625000000000000e+01 +1.021044999999999980e+00 -6.468750000000000000e+01 +1.021050000000000013e+00 -6.465625000000000000e+01 +1.021055000000000046e+00 -6.468750000000000000e+01 +1.021060000000000079e+00 -6.456250000000000000e+01 +1.021065000000000111e+00 -6.465625000000000000e+01 +1.021070000000000144e+00 -6.456250000000000000e+01 +1.021075000000000177e+00 -6.453125000000000000e+01 +1.021079999999999988e+00 -6.456250000000000000e+01 +1.021085000000000020e+00 -6.453125000000000000e+01 +1.021090000000000053e+00 -6.453125000000000000e+01 +1.021095000000000086e+00 -6.450000762939453125e+01 +1.021100000000000119e+00 -6.453125000000000000e+01 +1.021105000000000151e+00 -6.450000762939453125e+01 +1.021110000000000184e+00 -6.446875000000000000e+01 +1.021114999999999995e+00 -6.440625000000000000e+01 +1.021120000000000028e+00 -6.450000762939453125e+01 +1.021125000000000060e+00 -6.443750000000000000e+01 +1.021130000000000093e+00 -6.437500000000000000e+01 +1.021135000000000126e+00 -6.437500000000000000e+01 +1.021140000000000159e+00 -6.440625000000000000e+01 +1.021145000000000191e+00 -6.431250000000000000e+01 +1.021150000000000002e+00 -6.431250000000000000e+01 +1.021155000000000035e+00 -6.428125762939453125e+01 +1.021160000000000068e+00 -6.431250000000000000e+01 +1.021165000000000100e+00 -6.428125762939453125e+01 +1.021170000000000133e+00 -6.421875000000000000e+01 +1.021175000000000166e+00 -6.421875000000000000e+01 +1.021179999999999977e+00 -6.421875000000000000e+01 +1.021185000000000009e+00 -6.421875000000000000e+01 +1.021190000000000042e+00 -6.415625000000000000e+01 +1.021195000000000075e+00 -6.418750762939453125e+01 +1.021200000000000108e+00 -6.418750762939453125e+01 +1.021205000000000140e+00 -6.415625000000000000e+01 +1.021210000000000173e+00 -6.418750762939453125e+01 +1.021214999999999984e+00 -6.409375000000000000e+01 +1.021220000000000017e+00 -6.412500000000000000e+01 +1.021225000000000049e+00 -6.409375000000000000e+01 +1.021230000000000082e+00 -6.409375000000000000e+01 +1.021235000000000115e+00 -6.406250000000000000e+01 +1.021240000000000148e+00 -6.409375000000000000e+01 +1.021245000000000180e+00 -6.406250000000000000e+01 +1.021249999999999991e+00 -6.403125000000000000e+01 +1.021255000000000024e+00 -6.403125000000000000e+01 +1.021260000000000057e+00 -6.403125000000000000e+01 +1.021265000000000089e+00 -6.403125000000000000e+01 +1.021270000000000122e+00 -6.403125000000000000e+01 +1.021275000000000155e+00 -6.403125000000000000e+01 +1.021280000000000188e+00 -6.403125000000000000e+01 +1.021284999999999998e+00 -6.403125000000000000e+01 +1.021290000000000031e+00 -6.403125000000000000e+01 +1.021295000000000064e+00 -6.396874618530273438e+01 +1.021300000000000097e+00 -6.403125000000000000e+01 +1.021305000000000129e+00 -6.400000000000000000e+01 +1.021310000000000162e+00 -6.403125000000000000e+01 +1.021314999999999973e+00 -6.393750000000000000e+01 +1.021320000000000006e+00 -6.396874618530273438e+01 +1.021325000000000038e+00 -6.387500381469726562e+01 +1.021330000000000071e+00 -6.393750000000000000e+01 +1.021335000000000104e+00 -6.390625381469726562e+01 +1.021340000000000137e+00 -6.381250000000000000e+01 +1.021345000000000169e+00 -6.390625381469726562e+01 +1.021349999999999980e+00 -6.390625381469726562e+01 +1.021355000000000013e+00 -6.384375000000000000e+01 +1.021360000000000046e+00 -6.384375000000000000e+01 +1.021365000000000078e+00 -6.381250000000000000e+01 +1.021370000000000111e+00 -6.378125381469726562e+01 +1.021375000000000144e+00 -6.381250000000000000e+01 +1.021380000000000177e+00 -6.384375000000000000e+01 +1.021384999999999987e+00 -6.384375000000000000e+01 +1.021390000000000020e+00 -6.381250000000000000e+01 +1.021395000000000053e+00 -6.384375000000000000e+01 +1.021400000000000086e+00 -6.381250000000000000e+01 +1.021405000000000118e+00 -6.368750381469726562e+01 +1.021410000000000151e+00 -6.378125381469726562e+01 +1.021415000000000184e+00 -6.381250000000000000e+01 +1.021419999999999995e+00 -6.371875000000000000e+01 +1.021425000000000027e+00 -6.378125381469726562e+01 +1.021430000000000060e+00 -6.371875000000000000e+01 +1.021435000000000093e+00 -6.368750381469726562e+01 +1.021440000000000126e+00 -6.362500000000000000e+01 +1.021445000000000158e+00 -6.368750381469726562e+01 +1.021450000000000191e+00 -6.368750381469726562e+01 +1.021455000000000002e+00 -6.365625000000000000e+01 +1.021460000000000035e+00 -6.365625000000000000e+01 +1.021465000000000067e+00 -6.365625000000000000e+01 +1.021470000000000100e+00 -6.362500000000000000e+01 +1.021475000000000133e+00 -6.362500000000000000e+01 +1.021480000000000166e+00 -6.359375381469726562e+01 +1.021484999999999976e+00 -6.359375381469726562e+01 +1.021490000000000009e+00 -6.359375381469726562e+01 +1.021495000000000042e+00 -6.362500000000000000e+01 +1.021500000000000075e+00 -6.353125000000000000e+01 +1.021505000000000107e+00 -6.359375381469726562e+01 +1.021510000000000140e+00 -6.365625000000000000e+01 +1.021515000000000173e+00 -6.359375381469726562e+01 +1.021519999999999984e+00 -6.353125000000000000e+01 +1.021525000000000016e+00 -6.359375381469726562e+01 +1.021530000000000049e+00 -6.350000381469726562e+01 +1.021535000000000082e+00 -6.350000381469726562e+01 +1.021540000000000115e+00 -6.350000381469726562e+01 +1.021545000000000147e+00 -6.343750000000000000e+01 +1.021550000000000180e+00 -6.346875381469726562e+01 +1.021554999999999991e+00 -6.343750000000000000e+01 +1.021560000000000024e+00 -6.343750000000000000e+01 +1.021565000000000056e+00 -6.343750000000000000e+01 +1.021570000000000089e+00 -6.337500381469726562e+01 +1.021575000000000122e+00 -6.340625000000000000e+01 +1.021580000000000155e+00 -6.337500381469726562e+01 +1.021585000000000187e+00 -6.334375000000000000e+01 +1.021589999999999998e+00 -6.334375000000000000e+01 +1.021595000000000031e+00 -6.334375000000000000e+01 +1.021600000000000064e+00 -6.337500381469726562e+01 +1.021605000000000096e+00 -6.328125381469726562e+01 +1.021610000000000129e+00 -6.331250000000000000e+01 +1.021615000000000162e+00 -6.328125381469726562e+01 +1.021619999999999973e+00 -6.331250000000000000e+01 +1.021625000000000005e+00 -6.324999618530273438e+01 +1.021630000000000038e+00 -6.321875000000000000e+01 +1.021635000000000071e+00 -6.328125381469726562e+01 +1.021640000000000104e+00 -6.328125381469726562e+01 +1.021645000000000136e+00 -6.331250000000000000e+01 +1.021650000000000169e+00 -6.324999618530273438e+01 +1.021654999999999980e+00 -6.328125381469726562e+01 +1.021660000000000013e+00 -6.321875000000000000e+01 +1.021665000000000045e+00 -6.324999618530273438e+01 +1.021670000000000078e+00 -6.315625381469726562e+01 +1.021675000000000111e+00 -6.315625381469726562e+01 +1.021680000000000144e+00 -6.318750381469726562e+01 +1.021685000000000176e+00 -6.312500000000000000e+01 +1.021689999999999987e+00 -6.318750381469726562e+01 +1.021695000000000020e+00 -6.315625381469726562e+01 +1.021700000000000053e+00 -6.309375000000000000e+01 +1.021705000000000085e+00 -6.315625381469726562e+01 +1.021710000000000118e+00 -6.315625381469726562e+01 +1.021715000000000151e+00 -6.309375000000000000e+01 +1.021720000000000184e+00 -6.309375000000000000e+01 +1.021724999999999994e+00 -6.306250381469726562e+01 +1.021730000000000027e+00 -6.309375000000000000e+01 +1.021735000000000060e+00 -6.306250381469726562e+01 +1.021740000000000093e+00 -6.306250381469726562e+01 +1.021745000000000125e+00 -6.306250381469726562e+01 +1.021750000000000158e+00 -6.300000000000000000e+01 +1.021755000000000191e+00 -6.303125000000000000e+01 +1.021760000000000002e+00 -6.306250381469726562e+01 +1.021765000000000034e+00 -6.306250381469726562e+01 +1.021770000000000067e+00 -6.300000000000000000e+01 +1.021775000000000100e+00 -6.300000000000000000e+01 +1.021780000000000133e+00 -6.300000000000000000e+01 +1.021785000000000165e+00 -6.300000000000000000e+01 +1.021789999999999976e+00 -6.300000000000000000e+01 +1.021795000000000009e+00 -6.300000000000000000e+01 +1.021800000000000042e+00 -6.300000000000000000e+01 +1.021805000000000074e+00 -6.296875381469726562e+01 +1.021810000000000107e+00 -6.300000000000000000e+01 +1.021815000000000140e+00 -6.296875381469726562e+01 +1.021820000000000173e+00 -6.293750000000000000e+01 +1.021824999999999983e+00 -6.287500381469726562e+01 +1.021830000000000016e+00 -6.296875381469726562e+01 +1.021835000000000049e+00 -6.293750000000000000e+01 +1.021840000000000082e+00 -6.290625000000000000e+01 +1.021845000000000114e+00 -6.284375381469726562e+01 +1.021850000000000147e+00 -6.290625000000000000e+01 +1.021855000000000180e+00 -6.290625000000000000e+01 +1.021859999999999991e+00 -6.284375381469726562e+01 +1.021865000000000023e+00 -6.284375381469726562e+01 +1.021870000000000056e+00 -6.287500381469726562e+01 +1.021875000000000089e+00 -6.278125381469726562e+01 +1.021880000000000122e+00 -6.287500381469726562e+01 +1.021885000000000154e+00 -6.284375381469726562e+01 +1.021890000000000187e+00 -6.278125381469726562e+01 +1.021894999999999998e+00 -6.278125381469726562e+01 +1.021900000000000031e+00 -6.278125381469726562e+01 +1.021905000000000063e+00 -6.275000381469726562e+01 +1.021910000000000096e+00 -6.278125381469726562e+01 +1.021915000000000129e+00 -6.278125381469726562e+01 +1.021920000000000162e+00 -6.271875000000000000e+01 +1.021925000000000194e+00 -6.268750000000000000e+01 +1.021930000000000005e+00 -6.275000381469726562e+01 +1.021935000000000038e+00 -6.278125381469726562e+01 +1.021940000000000071e+00 -6.275000381469726562e+01 +1.021945000000000103e+00 -6.275000381469726562e+01 +1.021950000000000136e+00 -6.271875000000000000e+01 +1.021955000000000169e+00 -6.275000381469726562e+01 +1.021959999999999980e+00 -6.268750000000000000e+01 +1.021965000000000012e+00 -6.268750000000000000e+01 +1.021970000000000045e+00 -6.268750000000000000e+01 +1.021975000000000078e+00 -6.265625381469726562e+01 +1.021980000000000111e+00 -6.262500000000000000e+01 +1.021985000000000143e+00 -6.271875000000000000e+01 +1.021990000000000176e+00 -6.268750000000000000e+01 +1.021994999999999987e+00 -6.265625381469726562e+01 +1.022000000000000020e+00 -6.268750000000000000e+01 +1.022005000000000052e+00 -6.268750000000000000e+01 +1.022010000000000085e+00 -6.268750000000000000e+01 +1.022015000000000118e+00 -6.262500000000000000e+01 +1.022020000000000151e+00 -6.265625381469726562e+01 +1.022025000000000183e+00 -6.262500000000000000e+01 +1.022029999999999994e+00 -6.262500000000000000e+01 +1.022035000000000027e+00 -6.265625381469726562e+01 +1.022040000000000060e+00 -6.268750000000000000e+01 +1.022045000000000092e+00 -6.259375000000000000e+01 +1.022050000000000125e+00 -6.265625381469726562e+01 +1.022055000000000158e+00 -6.262500000000000000e+01 +1.022060000000000191e+00 -6.262500000000000000e+01 +1.022065000000000001e+00 -6.259375000000000000e+01 +1.022070000000000034e+00 -6.256250381469726562e+01 +1.022075000000000067e+00 -6.262500000000000000e+01 +1.022080000000000100e+00 -6.253124618530273438e+01 +1.022085000000000132e+00 -6.259375000000000000e+01 +1.022090000000000165e+00 -6.256250381469726562e+01 +1.022094999999999976e+00 -6.253124618530273438e+01 +1.022100000000000009e+00 -6.253124618530273438e+01 +1.022105000000000041e+00 -6.253124618530273438e+01 +1.022110000000000074e+00 -6.246875381469726562e+01 +1.022115000000000107e+00 -6.253124618530273438e+01 +1.022120000000000140e+00 -6.250000000000000000e+01 +1.022125000000000172e+00 -6.250000000000000000e+01 +1.022129999999999983e+00 -6.246875381469726562e+01 +1.022135000000000016e+00 -6.246875381469726562e+01 +1.022140000000000049e+00 -6.250000000000000000e+01 +1.022145000000000081e+00 -6.240625381469726562e+01 +1.022150000000000114e+00 -6.240625381469726562e+01 +1.022155000000000147e+00 -6.243750000000000000e+01 +1.022160000000000180e+00 -6.243750000000000000e+01 +1.022164999999999990e+00 -6.243750000000000000e+01 +1.022170000000000023e+00 -6.240625381469726562e+01 +1.022175000000000056e+00 -6.246875381469726562e+01 +1.022180000000000089e+00 -6.237500000000000000e+01 +1.022185000000000121e+00 -6.237500000000000000e+01 +1.022190000000000154e+00 -6.243750000000000000e+01 +1.022195000000000187e+00 -6.237500000000000000e+01 +1.022199999999999998e+00 -6.240625381469726562e+01 +1.022205000000000030e+00 -6.243750000000000000e+01 +1.022210000000000063e+00 -6.237500000000000000e+01 +1.022215000000000096e+00 -6.231250381469726562e+01 +1.022220000000000129e+00 -6.234375000000000000e+01 +1.022225000000000161e+00 -6.234375000000000000e+01 +1.022230000000000194e+00 -6.231250381469726562e+01 +1.022235000000000005e+00 -6.231250381469726562e+01 +1.022240000000000038e+00 -6.231250381469726562e+01 +1.022245000000000070e+00 -6.228125000000000000e+01 +1.022250000000000103e+00 -6.228125000000000000e+01 +1.022255000000000136e+00 -6.231250381469726562e+01 +1.022260000000000169e+00 -6.231250381469726562e+01 +1.022264999999999979e+00 -6.228125000000000000e+01 +1.022270000000000012e+00 -6.225000381469726562e+01 +1.022275000000000045e+00 -6.218750000000000000e+01 +1.022280000000000078e+00 -6.225000381469726562e+01 +1.022285000000000110e+00 -6.221875000000000000e+01 +1.022290000000000143e+00 -6.221875000000000000e+01 +1.022295000000000176e+00 -6.218750000000000000e+01 +1.022299999999999986e+00 -6.218750000000000000e+01 +1.022305000000000019e+00 -6.221875000000000000e+01 +1.022310000000000052e+00 -6.221875000000000000e+01 +1.022315000000000085e+00 -6.218750000000000000e+01 +1.022320000000000118e+00 -6.218750000000000000e+01 +1.022325000000000150e+00 -6.218750000000000000e+01 +1.022330000000000183e+00 -6.225000381469726562e+01 +1.022334999999999994e+00 -6.212500000000000000e+01 +1.022340000000000027e+00 -6.215625381469726562e+01 +1.022345000000000059e+00 -6.212500000000000000e+01 +1.022350000000000092e+00 -6.212500000000000000e+01 +1.022355000000000125e+00 -6.215625381469726562e+01 +1.022360000000000158e+00 -6.209375000000000000e+01 +1.022365000000000190e+00 -6.206250000000000000e+01 +1.022370000000000001e+00 -6.206250000000000000e+01 +1.022375000000000034e+00 -6.209375000000000000e+01 +1.022380000000000067e+00 -6.206250000000000000e+01 +1.022385000000000099e+00 -6.203125000000000000e+01 +1.022390000000000132e+00 -6.206250000000000000e+01 +1.022395000000000165e+00 -6.206250000000000000e+01 +1.022399999999999975e+00 -6.200000381469726562e+01 +1.022405000000000008e+00 -6.200000381469726562e+01 +1.022410000000000041e+00 -6.203125000000000000e+01 +1.022415000000000074e+00 -6.200000381469726562e+01 +1.022420000000000107e+00 -6.200000381469726562e+01 +1.022425000000000139e+00 -6.196875000000000000e+01 +1.022430000000000172e+00 -6.193750000000000000e+01 +1.022434999999999983e+00 -6.200000381469726562e+01 +1.022440000000000015e+00 -6.200000381469726562e+01 +1.022445000000000048e+00 -6.193750000000000000e+01 +1.022450000000000081e+00 -6.190625381469726562e+01 +1.022455000000000114e+00 -6.187500000000000000e+01 +1.022460000000000147e+00 -6.187500000000000000e+01 +1.022465000000000179e+00 -6.193750000000000000e+01 +1.022469999999999990e+00 -6.187500000000000000e+01 +1.022475000000000023e+00 -6.184375381469726562e+01 +1.022480000000000055e+00 -6.190625381469726562e+01 +1.022485000000000088e+00 -6.184375381469726562e+01 +1.022490000000000121e+00 -6.184375381469726562e+01 +1.022495000000000154e+00 -6.178125000000000000e+01 +1.022500000000000187e+00 -6.181250000000000000e+01 +1.022504999999999997e+00 -6.187500000000000000e+01 +1.022510000000000030e+00 -6.178125000000000000e+01 +1.022515000000000063e+00 -6.175000381469726562e+01 +1.022520000000000095e+00 -6.184375381469726562e+01 +1.022525000000000128e+00 -6.178125000000000000e+01 +1.022530000000000161e+00 -6.178125000000000000e+01 +1.022535000000000194e+00 -6.175000381469726562e+01 +1.022540000000000004e+00 -6.178125000000000000e+01 +1.022545000000000037e+00 -6.175000381469726562e+01 +1.022550000000000070e+00 -6.171875000000000000e+01 +1.022555000000000103e+00 -6.178125000000000000e+01 +1.022560000000000136e+00 -6.175000381469726562e+01 +1.022565000000000168e+00 -6.168750381469726562e+01 +1.022569999999999979e+00 -6.168750381469726562e+01 +1.022575000000000012e+00 -6.175000381469726562e+01 +1.022580000000000044e+00 -6.171875000000000000e+01 +1.022585000000000077e+00 -6.168750381469726562e+01 +1.022590000000000110e+00 -6.171875000000000000e+01 +1.022595000000000143e+00 -6.171875000000000000e+01 +1.022600000000000176e+00 -6.171875000000000000e+01 +1.022604999999999986e+00 -6.171875000000000000e+01 +1.022610000000000019e+00 -6.162500000000000000e+01 +1.022615000000000052e+00 -6.168750381469726562e+01 +1.022620000000000084e+00 -6.165625000000000000e+01 +1.022625000000000117e+00 -6.162500000000000000e+01 +1.022630000000000150e+00 -6.165625000000000000e+01 +1.022635000000000183e+00 -6.159375381469726562e+01 +1.022639999999999993e+00 -6.159375381469726562e+01 +1.022645000000000026e+00 -6.165625000000000000e+01 +1.022650000000000059e+00 -6.162500000000000000e+01 +1.022655000000000092e+00 -6.156250000000000000e+01 +1.022660000000000124e+00 -6.165625000000000000e+01 +1.022665000000000157e+00 -6.156250000000000000e+01 +1.022670000000000190e+00 -6.159375381469726562e+01 +1.022675000000000001e+00 -6.159375381469726562e+01 +1.022680000000000033e+00 -6.156250000000000000e+01 +1.022685000000000066e+00 -6.159375381469726562e+01 +1.022690000000000099e+00 -6.159375381469726562e+01 +1.022695000000000132e+00 -6.159375381469726562e+01 +1.022700000000000164e+00 -6.159375381469726562e+01 +1.022704999999999975e+00 -6.159375381469726562e+01 +1.022710000000000008e+00 -6.159375381469726562e+01 +1.022715000000000041e+00 -6.156250000000000000e+01 +1.022720000000000073e+00 -6.153125381469726562e+01 +1.022725000000000106e+00 -6.159375381469726562e+01 +1.022730000000000139e+00 -6.150000000000000000e+01 +1.022735000000000172e+00 -6.153125381469726562e+01 +1.022739999999999982e+00 -6.153125381469726562e+01 +1.022745000000000015e+00 -6.150000000000000000e+01 +1.022750000000000048e+00 -6.150000000000000000e+01 +1.022755000000000081e+00 -6.146875000000000000e+01 +1.022760000000000113e+00 -6.146875000000000000e+01 +1.022765000000000146e+00 -6.146875000000000000e+01 +1.022770000000000179e+00 -6.143750381469726562e+01 +1.022774999999999990e+00 -6.143750381469726562e+01 +1.022780000000000022e+00 -6.146875000000000000e+01 +1.022785000000000055e+00 -6.143750381469726562e+01 +1.022790000000000088e+00 -6.143750381469726562e+01 +1.022795000000000121e+00 -6.146875000000000000e+01 +1.022800000000000153e+00 -6.146875000000000000e+01 +1.022805000000000186e+00 -6.143750381469726562e+01 +1.022809999999999997e+00 -6.140625000000000000e+01 +1.022815000000000030e+00 -6.137500000000000000e+01 +1.022820000000000062e+00 -6.134375000000000000e+01 +1.022825000000000095e+00 -6.140625000000000000e+01 +1.022830000000000128e+00 -6.140625000000000000e+01 +1.022835000000000161e+00 -6.137500000000000000e+01 +1.022840000000000193e+00 -6.143750381469726562e+01 +1.022845000000000004e+00 -6.140625000000000000e+01 +1.022850000000000037e+00 -6.134375000000000000e+01 +1.022855000000000070e+00 -6.137500000000000000e+01 +1.022860000000000102e+00 -6.143750381469726562e+01 +1.022865000000000135e+00 -6.146875000000000000e+01 +1.022870000000000168e+00 -6.140625000000000000e+01 +1.022874999999999979e+00 -6.131250000000000000e+01 +1.022880000000000011e+00 -6.143750381469726562e+01 +1.022885000000000044e+00 -6.131250000000000000e+01 +1.022890000000000077e+00 -6.134375000000000000e+01 +1.022895000000000110e+00 -6.128125381469726562e+01 +1.022900000000000142e+00 -6.134375000000000000e+01 +1.022905000000000175e+00 -6.131250000000000000e+01 +1.022909999999999986e+00 -6.128125381469726562e+01 +1.022915000000000019e+00 -6.131250000000000000e+01 +1.022920000000000051e+00 -6.125000000000000000e+01 +1.022925000000000084e+00 -6.128125381469726562e+01 +1.022930000000000117e+00 -6.121875000000000000e+01 +1.022935000000000150e+00 -6.125000000000000000e+01 +1.022940000000000182e+00 -6.121875000000000000e+01 +1.022944999999999993e+00 -6.125000000000000000e+01 +1.022950000000000026e+00 -6.121875000000000000e+01 +1.022955000000000059e+00 -6.125000000000000000e+01 +1.022960000000000091e+00 -6.115625000000000000e+01 +1.022965000000000124e+00 -6.121875000000000000e+01 +1.022970000000000157e+00 -6.115625000000000000e+01 +1.022975000000000190e+00 -6.118750381469726562e+01 +1.022980000000000000e+00 -6.118750381469726562e+01 +1.022985000000000033e+00 -6.115625000000000000e+01 +1.022990000000000066e+00 -6.112500381469726562e+01 +1.022995000000000099e+00 -6.115625000000000000e+01 +1.023000000000000131e+00 -6.115625000000000000e+01 +1.023005000000000164e+00 -6.112500381469726562e+01 +1.023009999999999975e+00 -6.109375000000000000e+01 +1.023015000000000008e+00 -6.109375000000000000e+01 +1.023020000000000040e+00 -6.115625000000000000e+01 +1.023025000000000073e+00 -6.106250000000000000e+01 +1.023030000000000106e+00 -6.109375000000000000e+01 +1.023035000000000139e+00 -6.109375000000000000e+01 +1.023040000000000171e+00 -6.112500381469726562e+01 +1.023044999999999982e+00 -6.112500381469726562e+01 +1.023050000000000015e+00 -6.109375000000000000e+01 +1.023055000000000048e+00 -6.106250000000000000e+01 +1.023060000000000080e+00 -6.112500381469726562e+01 +1.023065000000000113e+00 -6.103125381469726562e+01 +1.023070000000000146e+00 -6.106250000000000000e+01 +1.023075000000000179e+00 -6.103125381469726562e+01 +1.023079999999999989e+00 -6.106250000000000000e+01 +1.023085000000000022e+00 -6.103125381469726562e+01 +1.023090000000000055e+00 -6.100000000000000000e+01 +1.023095000000000088e+00 -6.100000000000000000e+01 +1.023100000000000120e+00 -6.100000000000000000e+01 +1.023105000000000153e+00 -6.100000000000000000e+01 +1.023110000000000186e+00 -6.093750000000000000e+01 +1.023114999999999997e+00 -6.103125381469726562e+01 +1.023120000000000029e+00 -6.096875381469726562e+01 +1.023125000000000062e+00 -6.100000000000000000e+01 +1.023130000000000095e+00 -6.100000000000000000e+01 +1.023135000000000128e+00 -6.100000000000000000e+01 +1.023140000000000160e+00 -6.096875381469726562e+01 +1.023145000000000193e+00 -6.096875381469726562e+01 +1.023150000000000004e+00 -6.093750000000000000e+01 +1.023155000000000037e+00 -6.093750000000000000e+01 +1.023160000000000069e+00 -6.096875381469726562e+01 +1.023165000000000102e+00 -6.093750000000000000e+01 +1.023170000000000135e+00 -6.093750000000000000e+01 +1.023175000000000168e+00 -6.084375000000000000e+01 +1.023179999999999978e+00 -6.090625000000000000e+01 +1.023185000000000011e+00 -6.090625000000000000e+01 +1.023190000000000044e+00 -6.090625000000000000e+01 +1.023195000000000077e+00 -6.093750000000000000e+01 +1.023200000000000109e+00 -6.087500381469726562e+01 +1.023205000000000142e+00 -6.087500381469726562e+01 +1.023210000000000175e+00 -6.084375000000000000e+01 +1.023214999999999986e+00 -6.087500381469726562e+01 +1.023220000000000018e+00 -6.087500381469726562e+01 +1.023225000000000051e+00 -6.087500381469726562e+01 +1.023230000000000084e+00 -6.087500381469726562e+01 +1.023235000000000117e+00 -6.081250381469726562e+01 +1.023240000000000149e+00 -6.081250381469726562e+01 +1.023245000000000182e+00 -6.081250381469726562e+01 +1.023249999999999993e+00 -6.087500381469726562e+01 +1.023255000000000026e+00 -6.081250381469726562e+01 +1.023260000000000058e+00 -6.081250381469726562e+01 +1.023265000000000091e+00 -6.084375000000000000e+01 +1.023270000000000124e+00 -6.078125000000000000e+01 +1.023275000000000157e+00 -6.075000000000000000e+01 +1.023280000000000189e+00 -6.068750000000000000e+01 +1.023285000000000000e+00 -6.075000000000000000e+01 +1.023290000000000033e+00 -6.068750000000000000e+01 +1.023295000000000066e+00 -6.078125000000000000e+01 +1.023300000000000098e+00 -6.075000000000000000e+01 +1.023305000000000131e+00 -6.068750000000000000e+01 +1.023310000000000164e+00 -6.068750000000000000e+01 +1.023314999999999975e+00 -6.071875381469726562e+01 +1.023320000000000007e+00 -6.068750000000000000e+01 +1.023325000000000040e+00 -6.071875381469726562e+01 +1.023330000000000073e+00 -6.065625000000000000e+01 +1.023335000000000106e+00 -6.068750000000000000e+01 +1.023340000000000138e+00 -6.065625000000000000e+01 +1.023345000000000171e+00 -6.065625000000000000e+01 +1.023349999999999982e+00 -6.071875381469726562e+01 +1.023355000000000015e+00 -6.062500000000000000e+01 +1.023360000000000047e+00 -6.062500000000000000e+01 +1.023365000000000080e+00 -6.059375000000000000e+01 +1.023370000000000113e+00 -6.059375000000000000e+01 +1.023375000000000146e+00 -6.059375000000000000e+01 +1.023380000000000178e+00 -6.062500000000000000e+01 +1.023384999999999989e+00 -6.062500000000000000e+01 +1.023390000000000022e+00 -6.062500000000000000e+01 +1.023395000000000055e+00 -6.059375000000000000e+01 +1.023400000000000087e+00 -6.065625000000000000e+01 +1.023405000000000120e+00 -6.056250381469726562e+01 +1.023410000000000153e+00 -6.059375000000000000e+01 +1.023415000000000186e+00 -6.062500000000000000e+01 +1.023419999999999996e+00 -6.056250381469726562e+01 +1.023425000000000029e+00 -6.059375000000000000e+01 +1.023430000000000062e+00 -6.059375000000000000e+01 +1.023435000000000095e+00 -6.059375000000000000e+01 +1.023440000000000127e+00 -6.056250381469726562e+01 +1.023445000000000160e+00 -6.056250381469726562e+01 +1.023450000000000193e+00 -6.050000000000000000e+01 +1.023455000000000004e+00 -6.056250381469726562e+01 +1.023460000000000036e+00 -6.062500000000000000e+01 +1.023465000000000069e+00 -6.053125000000000000e+01 +1.023470000000000102e+00 -6.053125000000000000e+01 +1.023475000000000135e+00 -6.053125000000000000e+01 +1.023480000000000167e+00 -6.053125000000000000e+01 +1.023484999999999978e+00 -6.050000000000000000e+01 +1.023490000000000011e+00 -6.053125000000000000e+01 +1.023495000000000044e+00 -6.053125000000000000e+01 +1.023500000000000076e+00 -6.050000000000000000e+01 +1.023505000000000109e+00 -6.050000000000000000e+01 +1.023510000000000142e+00 -6.050000000000000000e+01 +1.023515000000000175e+00 -6.043750000000000000e+01 +1.023519999999999985e+00 -6.050000000000000000e+01 +1.023525000000000018e+00 -6.040625381469726562e+01 +1.023530000000000051e+00 -6.050000000000000000e+01 +1.023535000000000084e+00 -6.043750000000000000e+01 +1.023540000000000116e+00 -6.040625381469726562e+01 +1.023545000000000149e+00 -6.046875381469726562e+01 +1.023550000000000182e+00 -6.046875381469726562e+01 +1.023554999999999993e+00 -6.043750000000000000e+01 +1.023560000000000025e+00 -6.040625381469726562e+01 +1.023565000000000058e+00 -6.040625381469726562e+01 +1.023570000000000091e+00 -6.046875381469726562e+01 +1.023575000000000124e+00 -6.034375000000000000e+01 +1.023580000000000156e+00 -6.040625381469726562e+01 +1.023585000000000189e+00 -6.043750000000000000e+01 +1.023590000000000000e+00 -6.037500000000000000e+01 +1.023595000000000033e+00 -6.040625381469726562e+01 +1.023600000000000065e+00 -6.040625381469726562e+01 +1.023605000000000098e+00 -6.037500000000000000e+01 +1.023610000000000131e+00 -6.034375000000000000e+01 +1.023615000000000164e+00 -6.037500000000000000e+01 +1.023619999999999974e+00 -6.034375000000000000e+01 +1.023625000000000007e+00 -6.031250381469726562e+01 +1.023630000000000040e+00 -6.034375000000000000e+01 +1.023635000000000073e+00 -6.034375000000000000e+01 +1.023640000000000105e+00 -6.025000381469726562e+01 +1.023645000000000138e+00 -6.025000381469726562e+01 +1.023650000000000171e+00 -6.021875000000000000e+01 +1.023654999999999982e+00 -6.034375000000000000e+01 +1.023660000000000014e+00 -6.018750000000000000e+01 +1.023665000000000047e+00 -6.028125000000000000e+01 +1.023670000000000080e+00 -6.028125000000000000e+01 +1.023675000000000113e+00 -6.018750000000000000e+01 +1.023680000000000145e+00 -6.021875000000000000e+01 +1.023685000000000178e+00 -6.025000381469726562e+01 +1.023689999999999989e+00 -6.018750000000000000e+01 +1.023695000000000022e+00 -6.018750000000000000e+01 +1.023700000000000054e+00 -6.028125000000000000e+01 +1.023705000000000087e+00 -6.025000381469726562e+01 +1.023710000000000120e+00 -6.021875000000000000e+01 +1.023715000000000153e+00 -6.018750000000000000e+01 +1.023720000000000185e+00 -6.028125000000000000e+01 +1.023724999999999996e+00 -6.018750000000000000e+01 +1.023730000000000029e+00 -6.021875000000000000e+01 +1.023735000000000062e+00 -6.018750000000000000e+01 +1.023740000000000094e+00 -6.021875000000000000e+01 +1.023745000000000127e+00 -6.015625381469726562e+01 +1.023750000000000160e+00 -6.015625381469726562e+01 +1.023755000000000193e+00 -6.009375381469726562e+01 +1.023760000000000003e+00 -6.012500000000000000e+01 +1.023765000000000036e+00 -6.009375381469726562e+01 +1.023770000000000069e+00 -6.012500000000000000e+01 +1.023775000000000102e+00 -6.009375381469726562e+01 +1.023780000000000134e+00 -6.012500000000000000e+01 +1.023785000000000167e+00 -6.012500000000000000e+01 +1.023789999999999978e+00 -6.015625381469726562e+01 +1.023795000000000011e+00 -6.012500000000000000e+01 +1.023800000000000043e+00 -6.009375381469726562e+01 +1.023805000000000076e+00 -6.012500000000000000e+01 +1.023810000000000109e+00 -6.012500000000000000e+01 +1.023815000000000142e+00 -6.003125000000000000e+01 +1.023820000000000174e+00 -6.009375381469726562e+01 +1.023824999999999985e+00 -6.009375381469726562e+01 +1.023830000000000018e+00 -6.009375381469726562e+01 +1.023835000000000051e+00 -6.003125000000000000e+01 +1.023840000000000083e+00 -6.000000381469726562e+01 +1.023845000000000116e+00 -5.996875000000000000e+01 +1.023850000000000149e+00 -6.003125000000000000e+01 +1.023855000000000182e+00 -6.000000381469726562e+01 +1.023859999999999992e+00 -5.996875000000000000e+01 +1.023865000000000025e+00 -5.996875000000000000e+01 +1.023870000000000058e+00 -6.006250000000000000e+01 +1.023875000000000091e+00 -5.993750381469726562e+01 +1.023880000000000123e+00 -5.993750381469726562e+01 +1.023885000000000156e+00 -6.000000381469726562e+01 +1.023890000000000189e+00 -5.996875000000000000e+01 +1.023895000000000000e+00 -5.993750381469726562e+01 +1.023900000000000032e+00 -5.993750381469726562e+01 +1.023905000000000065e+00 -5.990625000000000000e+01 +1.023910000000000098e+00 -5.996875000000000000e+01 +1.023915000000000131e+00 -5.990625000000000000e+01 +1.023920000000000163e+00 -5.993750381469726562e+01 +1.023924999999999974e+00 -5.990625000000000000e+01 +1.023930000000000007e+00 -5.987500000000000000e+01 +1.023935000000000040e+00 -5.990625000000000000e+01 +1.023940000000000072e+00 -5.996875000000000000e+01 +1.023945000000000105e+00 -5.987500000000000000e+01 +1.023950000000000138e+00 -5.984375381469726562e+01 +1.023955000000000171e+00 -5.981250000000000000e+01 +1.023959999999999981e+00 -5.990625000000000000e+01 +1.023965000000000014e+00 -5.981250000000000000e+01 +1.023970000000000047e+00 -5.987500000000000000e+01 +1.023975000000000080e+00 -5.987500000000000000e+01 +1.023980000000000112e+00 -5.990625000000000000e+01 +1.023985000000000145e+00 -5.984375381469726562e+01 +1.023990000000000178e+00 -5.981250000000000000e+01 +1.023994999999999989e+00 -5.990625000000000000e+01 +1.024000000000000021e+00 -5.978125000000000000e+01 +1.024005000000000054e+00 -5.984375381469726562e+01 +1.024010000000000087e+00 -5.984375381469726562e+01 +1.024015000000000120e+00 -5.981250000000000000e+01 +1.024020000000000152e+00 -5.984375381469726562e+01 +1.024025000000000185e+00 -5.981250000000000000e+01 +1.024029999999999996e+00 -5.978125000000000000e+01 +1.024035000000000029e+00 -5.968750381469726562e+01 +1.024040000000000061e+00 -5.978125000000000000e+01 +1.024045000000000094e+00 -5.981250000000000000e+01 +1.024050000000000127e+00 -5.978125000000000000e+01 +1.024055000000000160e+00 -5.975000000000000000e+01 +1.024060000000000192e+00 -5.978125000000000000e+01 +1.024065000000000003e+00 -5.981250000000000000e+01 +1.024070000000000036e+00 -5.971875000000000000e+01 +1.024075000000000069e+00 -5.968750381469726562e+01 +1.024080000000000101e+00 -5.971875000000000000e+01 +1.024085000000000134e+00 -5.971875000000000000e+01 +1.024090000000000167e+00 -5.975000000000000000e+01 +1.024094999999999978e+00 -5.968750381469726562e+01 +1.024100000000000010e+00 -5.978125000000000000e+01 +1.024105000000000043e+00 -5.971875000000000000e+01 +1.024110000000000076e+00 -5.971875000000000000e+01 +1.024115000000000109e+00 -5.968750381469726562e+01 +1.024120000000000141e+00 -5.971875000000000000e+01 +1.024125000000000174e+00 -5.968750381469726562e+01 +1.024129999999999985e+00 -5.965625000000000000e+01 +1.024135000000000018e+00 -5.965625000000000000e+01 +1.024140000000000050e+00 -5.959375381469726562e+01 +1.024145000000000083e+00 -5.965625000000000000e+01 +1.024150000000000116e+00 -5.959375381469726562e+01 +1.024155000000000149e+00 -5.968750381469726562e+01 +1.024160000000000181e+00 -5.962500000000000000e+01 +1.024164999999999992e+00 -5.962500000000000000e+01 +1.024170000000000025e+00 -5.959375381469726562e+01 +1.024175000000000058e+00 -5.962500000000000000e+01 +1.024180000000000090e+00 -5.956250000000000000e+01 +1.024185000000000123e+00 -5.965625000000000000e+01 +1.024190000000000156e+00 -5.962500000000000000e+01 +1.024195000000000189e+00 -5.962500000000000000e+01 +1.024199999999999999e+00 -5.956250000000000000e+01 +1.024205000000000032e+00 -5.962500000000000000e+01 +1.024210000000000065e+00 -5.953125381469726562e+01 +1.024215000000000098e+00 -5.965625000000000000e+01 +1.024220000000000130e+00 -5.962500000000000000e+01 +1.024225000000000163e+00 -5.956250000000000000e+01 +1.024229999999999974e+00 -5.956250000000000000e+01 +1.024235000000000007e+00 -5.959375381469726562e+01 +1.024240000000000039e+00 -5.959375381469726562e+01 +1.024245000000000072e+00 -5.953125381469726562e+01 +1.024250000000000105e+00 -5.953125381469726562e+01 +1.024255000000000138e+00 -5.956250000000000000e+01 +1.024260000000000170e+00 -5.950000000000000000e+01 +1.024264999999999981e+00 -5.950000000000000000e+01 +1.024270000000000014e+00 -5.956250000000000000e+01 +1.024275000000000047e+00 -5.950000000000000000e+01 +1.024280000000000079e+00 -5.950000000000000000e+01 +1.024285000000000112e+00 -5.950000000000000000e+01 +1.024290000000000145e+00 -5.953125381469726562e+01 +1.024295000000000178e+00 -5.950000000000000000e+01 +1.024299999999999988e+00 -5.950000000000000000e+01 +1.024305000000000021e+00 -5.950000000000000000e+01 +1.024310000000000054e+00 -5.953125381469726562e+01 +1.024315000000000087e+00 -5.943750381469726562e+01 +1.024320000000000119e+00 -5.946875000000000000e+01 +1.024325000000000152e+00 -5.943750381469726562e+01 +1.024330000000000185e+00 -5.950000000000000000e+01 +1.024334999999999996e+00 -5.946875000000000000e+01 +1.024340000000000028e+00 -5.953125381469726562e+01 +1.024345000000000061e+00 -5.946875000000000000e+01 +1.024350000000000094e+00 -5.943750381469726562e+01 +1.024355000000000127e+00 -5.943750381469726562e+01 +1.024360000000000159e+00 -5.940625000000000000e+01 +1.024365000000000192e+00 -5.943750381469726562e+01 +1.024370000000000003e+00 -5.946875000000000000e+01 +1.024375000000000036e+00 -5.940625000000000000e+01 +1.024380000000000068e+00 -5.934375000000000000e+01 +1.024385000000000101e+00 -5.943750381469726562e+01 +1.024390000000000134e+00 -5.940625000000000000e+01 +1.024395000000000167e+00 -5.940625000000000000e+01 +1.024399999999999977e+00 -5.943750381469726562e+01 +1.024405000000000010e+00 -5.943750381469726562e+01 +1.024410000000000043e+00 -5.937500381469726562e+01 +1.024415000000000076e+00 -5.934375000000000000e+01 +1.024420000000000108e+00 -5.937500381469726562e+01 +1.024425000000000141e+00 -5.934375000000000000e+01 +1.024430000000000174e+00 -5.940625000000000000e+01 +1.024434999999999985e+00 -5.934375000000000000e+01 +1.024440000000000017e+00 -5.931250000000000000e+01 +1.024445000000000050e+00 -5.931250000000000000e+01 +1.024450000000000083e+00 -5.934375000000000000e+01 +1.024455000000000116e+00 -5.931250000000000000e+01 +1.024460000000000148e+00 -5.934375000000000000e+01 +1.024465000000000181e+00 -5.934375000000000000e+01 +1.024469999999999992e+00 -5.934375000000000000e+01 +1.024475000000000025e+00 -5.928125381469726562e+01 +1.024480000000000057e+00 -5.928125381469726562e+01 +1.024485000000000090e+00 -5.928125381469726562e+01 +1.024490000000000123e+00 -5.928125381469726562e+01 +1.024495000000000156e+00 -5.921875381469726562e+01 +1.024500000000000188e+00 -5.925000000000000000e+01 +1.024504999999999999e+00 -5.928125381469726562e+01 +1.024510000000000032e+00 -5.921875381469726562e+01 +1.024515000000000065e+00 -5.921875381469726562e+01 +1.024520000000000097e+00 -5.925000000000000000e+01 +1.024525000000000130e+00 -5.918750000000000000e+01 +1.024530000000000163e+00 -5.918750000000000000e+01 +1.024534999999999973e+00 -5.918750000000000000e+01 +1.024540000000000006e+00 -5.915625000000000000e+01 +1.024545000000000039e+00 -5.915625000000000000e+01 +1.024550000000000072e+00 -5.915625000000000000e+01 +1.024555000000000105e+00 -5.918750000000000000e+01 +1.024560000000000137e+00 -5.918750000000000000e+01 +1.024565000000000170e+00 -5.909375000000000000e+01 +1.024569999999999981e+00 -5.915625000000000000e+01 +1.024575000000000014e+00 -5.912500381469726562e+01 +1.024580000000000046e+00 -5.918750000000000000e+01 +1.024585000000000079e+00 -5.915625000000000000e+01 +1.024590000000000112e+00 -5.912500381469726562e+01 +1.024595000000000145e+00 -5.915625000000000000e+01 +1.024600000000000177e+00 -5.915625000000000000e+01 +1.024604999999999988e+00 -5.909375000000000000e+01 +1.024610000000000021e+00 -5.912500381469726562e+01 +1.024615000000000054e+00 -5.915625000000000000e+01 +1.024620000000000086e+00 -5.906250000000000000e+01 +1.024625000000000119e+00 -5.903125000000000000e+01 +1.024630000000000152e+00 -5.909375000000000000e+01 +1.024635000000000185e+00 -5.900000000000000000e+01 +1.024639999999999995e+00 -5.903125000000000000e+01 +1.024645000000000028e+00 -5.903125000000000000e+01 +1.024650000000000061e+00 -5.909375000000000000e+01 +1.024655000000000094e+00 -5.906250000000000000e+01 +1.024660000000000126e+00 -5.900000000000000000e+01 +1.024665000000000159e+00 -5.903125000000000000e+01 +1.024670000000000192e+00 -5.900000000000000000e+01 +1.024675000000000002e+00 -5.903125000000000000e+01 +1.024680000000000035e+00 -5.900000000000000000e+01 +1.024685000000000068e+00 -5.903125000000000000e+01 +1.024690000000000101e+00 -5.900000000000000000e+01 +1.024695000000000134e+00 -5.900000000000000000e+01 +1.024700000000000166e+00 -5.900000000000000000e+01 +1.024704999999999977e+00 -5.903125000000000000e+01 +1.024710000000000010e+00 -5.903125000000000000e+01 +1.024715000000000042e+00 -5.900000000000000000e+01 +1.024720000000000075e+00 -5.900000000000000000e+01 +1.024725000000000108e+00 -5.900000000000000000e+01 +1.024730000000000141e+00 -5.893750000000000000e+01 +1.024735000000000174e+00 -5.896875381469726562e+01 +1.024739999999999984e+00 -5.900000000000000000e+01 +1.024745000000000017e+00 -5.900000000000000000e+01 +1.024750000000000050e+00 -5.890625000000000000e+01 +1.024755000000000082e+00 -5.893750000000000000e+01 +1.024760000000000115e+00 -5.890625000000000000e+01 +1.024765000000000148e+00 -5.893750000000000000e+01 +1.024770000000000181e+00 -5.890625000000000000e+01 +1.024774999999999991e+00 -5.896875381469726562e+01 +1.024780000000000024e+00 -5.893750000000000000e+01 +1.024785000000000057e+00 -5.893750000000000000e+01 +1.024790000000000090e+00 -5.887500381469726562e+01 +1.024795000000000122e+00 -5.890625000000000000e+01 +1.024800000000000155e+00 -5.893750000000000000e+01 +1.024805000000000188e+00 -5.893750000000000000e+01 +1.024809999999999999e+00 -5.893750000000000000e+01 +1.024815000000000031e+00 -5.893750000000000000e+01 +1.024820000000000064e+00 -5.896875381469726562e+01 +1.024825000000000097e+00 -5.884375000000000000e+01 +1.024830000000000130e+00 -5.887500381469726562e+01 +1.024835000000000163e+00 -5.887500381469726562e+01 +1.024839999999999973e+00 -5.884375000000000000e+01 +1.024845000000000006e+00 -5.878125000000000000e+01 +1.024850000000000039e+00 -5.884375000000000000e+01 +1.024855000000000071e+00 -5.881250381469726562e+01 +1.024860000000000104e+00 -5.884375000000000000e+01 +1.024865000000000137e+00 -5.881250381469726562e+01 +1.024870000000000170e+00 -5.884375000000000000e+01 +1.024874999999999980e+00 -5.881250381469726562e+01 +1.024880000000000013e+00 -5.875000000000000000e+01 +1.024885000000000046e+00 -5.878125000000000000e+01 +1.024890000000000079e+00 -5.881250381469726562e+01 +1.024895000000000111e+00 -5.884375000000000000e+01 +1.024900000000000144e+00 -5.878125000000000000e+01 +1.024905000000000177e+00 -5.884375000000000000e+01 +1.024909999999999988e+00 -5.881250381469726562e+01 +1.024915000000000020e+00 -5.881250381469726562e+01 +1.024920000000000053e+00 -5.875000000000000000e+01 +1.024925000000000086e+00 -5.875000000000000000e+01 +1.024930000000000119e+00 -5.884375000000000000e+01 +1.024935000000000151e+00 -5.878125000000000000e+01 +1.024940000000000184e+00 -5.878125000000000000e+01 +1.024944999999999995e+00 -5.881250381469726562e+01 +1.024950000000000028e+00 -5.878125000000000000e+01 +1.024955000000000060e+00 -5.878125000000000000e+01 +1.024960000000000093e+00 -5.875000000000000000e+01 +1.024965000000000126e+00 -5.875000000000000000e+01 +1.024970000000000159e+00 -5.871875381469726562e+01 +1.024975000000000191e+00 -5.868750000000000000e+01 +1.024980000000000002e+00 -5.862500000000000000e+01 +1.024985000000000035e+00 -5.865625381469726562e+01 +1.024990000000000068e+00 -5.865625381469726562e+01 +1.024995000000000100e+00 -5.862500000000000000e+01 +1.025000000000000133e+00 -5.865625381469726562e+01 +1.025005000000000166e+00 -5.862500000000000000e+01 +1.025009999999999977e+00 -5.862500000000000000e+01 +1.025015000000000009e+00 -5.862500000000000000e+01 +1.025020000000000042e+00 -5.862500000000000000e+01 +1.025025000000000075e+00 -5.865625381469726562e+01 +1.025030000000000108e+00 -5.865625381469726562e+01 +1.025035000000000140e+00 -5.865625381469726562e+01 +1.025040000000000173e+00 -5.862500000000000000e+01 +1.025044999999999984e+00 -5.862500000000000000e+01 +1.025050000000000017e+00 -5.865625381469726562e+01 +1.025055000000000049e+00 -5.862500000000000000e+01 +1.025060000000000082e+00 -5.865625381469726562e+01 +1.025065000000000115e+00 -5.859375000000000000e+01 +1.025070000000000148e+00 -5.862500000000000000e+01 +1.025075000000000180e+00 -5.862500000000000000e+01 +1.025079999999999991e+00 -5.859375000000000000e+01 +1.025085000000000024e+00 -5.856250381469726562e+01 +1.025090000000000057e+00 -5.856250381469726562e+01 +1.025095000000000089e+00 -5.856250381469726562e+01 +1.025100000000000122e+00 -5.859375000000000000e+01 +1.025105000000000155e+00 -5.859375000000000000e+01 +1.025110000000000188e+00 -5.859375000000000000e+01 +1.025114999999999998e+00 -5.856250381469726562e+01 +1.025120000000000031e+00 -5.853125000000000000e+01 +1.025125000000000064e+00 -5.856250381469726562e+01 +1.025130000000000097e+00 -5.853125000000000000e+01 +1.025135000000000129e+00 -5.850000381469726562e+01 +1.025140000000000162e+00 -5.850000381469726562e+01 +1.025144999999999973e+00 -5.850000381469726562e+01 +1.025150000000000006e+00 -5.846875000000000000e+01 +1.025155000000000038e+00 -5.850000381469726562e+01 +1.025160000000000071e+00 -5.850000381469726562e+01 +1.025165000000000104e+00 -5.850000381469726562e+01 +1.025170000000000137e+00 -5.843750000000000000e+01 +1.025175000000000169e+00 -5.846875000000000000e+01 +1.025179999999999980e+00 -5.850000381469726562e+01 +1.025185000000000013e+00 -5.846875000000000000e+01 +1.025190000000000046e+00 -5.846875000000000000e+01 +1.025195000000000078e+00 -5.843750000000000000e+01 +1.025200000000000111e+00 -5.846875000000000000e+01 +1.025205000000000144e+00 -5.840625381469726562e+01 +1.025210000000000177e+00 -5.843750000000000000e+01 +1.025214999999999987e+00 -5.843750000000000000e+01 +1.025220000000000020e+00 -5.837500000000000000e+01 +1.025225000000000053e+00 -5.846875000000000000e+01 +1.025230000000000086e+00 -5.843750000000000000e+01 +1.025235000000000118e+00 -5.837500000000000000e+01 +1.025240000000000151e+00 -5.834375000000000000e+01 +1.025245000000000184e+00 -5.837500000000000000e+01 +1.025249999999999995e+00 -5.837500000000000000e+01 +1.025255000000000027e+00 -5.834375000000000000e+01 +1.025260000000000060e+00 -5.834375000000000000e+01 +1.025265000000000093e+00 -5.831250000000000000e+01 +1.025270000000000126e+00 -5.831250000000000000e+01 +1.025275000000000158e+00 -5.831250000000000000e+01 +1.025280000000000191e+00 -5.828125000000000000e+01 +1.025285000000000002e+00 -5.831250000000000000e+01 +1.025290000000000035e+00 -5.831250000000000000e+01 +1.025295000000000067e+00 -5.828125000000000000e+01 +1.025300000000000100e+00 -5.825000381469726562e+01 +1.025305000000000133e+00 -5.828125000000000000e+01 +1.025310000000000166e+00 -5.825000381469726562e+01 +1.025314999999999976e+00 -5.825000381469726562e+01 +1.025320000000000009e+00 -5.825000381469726562e+01 +1.025325000000000042e+00 -5.821875000000000000e+01 +1.025330000000000075e+00 -5.825000381469726562e+01 +1.025335000000000107e+00 -5.821875000000000000e+01 +1.025340000000000140e+00 -5.821875000000000000e+01 +1.025345000000000173e+00 -5.821875000000000000e+01 +1.025349999999999984e+00 -5.825000381469726562e+01 +1.025355000000000016e+00 -5.821875000000000000e+01 +1.025360000000000049e+00 -5.821875000000000000e+01 +1.025365000000000082e+00 -5.828125000000000000e+01 +1.025370000000000115e+00 -5.821875000000000000e+01 +1.025375000000000147e+00 -5.821875000000000000e+01 +1.025380000000000180e+00 -5.825000381469726562e+01 +1.025384999999999991e+00 -5.818750000000000000e+01 +1.025390000000000024e+00 -5.828125000000000000e+01 +1.025395000000000056e+00 -5.815625000000000000e+01 +1.025400000000000089e+00 -5.821875000000000000e+01 +1.025405000000000122e+00 -5.815625000000000000e+01 +1.025410000000000155e+00 -5.812500000000000000e+01 +1.025415000000000187e+00 -5.818750000000000000e+01 +1.025419999999999998e+00 -5.812500000000000000e+01 +1.025425000000000031e+00 -5.809375381469726562e+01 +1.025430000000000064e+00 -5.812500000000000000e+01 +1.025435000000000096e+00 -5.815625000000000000e+01 +1.025440000000000129e+00 -5.809375381469726562e+01 +1.025445000000000162e+00 -5.812500000000000000e+01 +1.025450000000000195e+00 -5.821875000000000000e+01 +1.025455000000000005e+00 -5.815625000000000000e+01 +1.025460000000000038e+00 -5.812500000000000000e+01 +1.025465000000000071e+00 -5.815625000000000000e+01 +1.025470000000000104e+00 -5.815625000000000000e+01 +1.025475000000000136e+00 -5.812500000000000000e+01 +1.025480000000000169e+00 -5.812500000000000000e+01 +1.025484999999999980e+00 -5.806250000000000000e+01 +1.025490000000000013e+00 -5.803125000000000000e+01 +1.025495000000000045e+00 -5.809375381469726562e+01 +1.025500000000000078e+00 -5.809375381469726562e+01 +1.025505000000000111e+00 -5.806250000000000000e+01 +1.025510000000000144e+00 -5.806250000000000000e+01 +1.025515000000000176e+00 -5.809375381469726562e+01 +1.025519999999999987e+00 -5.812500000000000000e+01 +1.025525000000000020e+00 -5.809375381469726562e+01 +1.025530000000000053e+00 -5.803125000000000000e+01 +1.025535000000000085e+00 -5.803125000000000000e+01 +1.025540000000000118e+00 -5.809375381469726562e+01 +1.025545000000000151e+00 -5.809375381469726562e+01 +1.025550000000000184e+00 -5.806250000000000000e+01 +1.025554999999999994e+00 -5.806250000000000000e+01 +1.025560000000000027e+00 -5.803125000000000000e+01 +1.025565000000000060e+00 -5.806250000000000000e+01 +1.025570000000000093e+00 -5.800000381469726562e+01 +1.025575000000000125e+00 -5.803125000000000000e+01 +1.025580000000000158e+00 -5.803125000000000000e+01 +1.025585000000000191e+00 -5.803125000000000000e+01 +1.025590000000000002e+00 -5.800000381469726562e+01 +1.025595000000000034e+00 -5.796875000000000000e+01 +1.025600000000000067e+00 -5.800000381469726562e+01 +1.025605000000000100e+00 -5.796875000000000000e+01 +1.025610000000000133e+00 -5.803125000000000000e+01 +1.025615000000000165e+00 -5.800000381469726562e+01 +1.025619999999999976e+00 -5.793750381469726562e+01 +1.025625000000000009e+00 -5.800000381469726562e+01 +1.025630000000000042e+00 -5.793750381469726562e+01 +1.025635000000000074e+00 -5.790625000000000000e+01 +1.025640000000000107e+00 -5.787500000000000000e+01 +1.025645000000000140e+00 -5.787500000000000000e+01 +1.025650000000000173e+00 -5.787500000000000000e+01 +1.025654999999999983e+00 -5.790625000000000000e+01 +1.025660000000000016e+00 -5.793750381469726562e+01 +1.025665000000000049e+00 -5.787500000000000000e+01 +1.025670000000000082e+00 -5.790625000000000000e+01 +1.025675000000000114e+00 -5.790625000000000000e+01 +1.025680000000000147e+00 -5.787500000000000000e+01 +1.025685000000000180e+00 -5.787500000000000000e+01 +1.025689999999999991e+00 -5.784375381469726562e+01 +1.025695000000000023e+00 -5.781250000000000000e+01 +1.025700000000000056e+00 -5.784375381469726562e+01 +1.025705000000000089e+00 -5.778125381469726562e+01 +1.025710000000000122e+00 -5.787500000000000000e+01 +1.025715000000000154e+00 -5.784375381469726562e+01 +1.025720000000000187e+00 -5.784375381469726562e+01 +1.025724999999999998e+00 -5.787500000000000000e+01 +1.025730000000000031e+00 -5.781250000000000000e+01 +1.025735000000000063e+00 -5.778125381469726562e+01 +1.025740000000000096e+00 -5.784375381469726562e+01 +1.025745000000000129e+00 -5.778125381469726562e+01 +1.025750000000000162e+00 -5.781250000000000000e+01 +1.025755000000000194e+00 -5.778125381469726562e+01 +1.025760000000000005e+00 -5.778125381469726562e+01 +1.025765000000000038e+00 -5.781250000000000000e+01 +1.025770000000000071e+00 -5.775000000000000000e+01 +1.025775000000000103e+00 -5.781250000000000000e+01 +1.025780000000000136e+00 -5.771875000000000000e+01 +1.025785000000000169e+00 -5.775000000000000000e+01 +1.025789999999999980e+00 -5.778125381469726562e+01 +1.025795000000000012e+00 -5.775000000000000000e+01 +1.025800000000000045e+00 -5.775000000000000000e+01 +1.025805000000000078e+00 -5.778125381469726562e+01 +1.025810000000000111e+00 -5.775000000000000000e+01 +1.025815000000000143e+00 -5.771875000000000000e+01 +1.025820000000000176e+00 -5.781250000000000000e+01 +1.025824999999999987e+00 -5.771875000000000000e+01 +1.025830000000000020e+00 -5.771875000000000000e+01 +1.025835000000000052e+00 -5.771875000000000000e+01 +1.025840000000000085e+00 -5.775000000000000000e+01 +1.025845000000000118e+00 -5.771875000000000000e+01 +1.025850000000000151e+00 -5.771875000000000000e+01 +1.025855000000000183e+00 -5.775000000000000000e+01 +1.025859999999999994e+00 -5.765625000000000000e+01 +1.025865000000000027e+00 -5.765625000000000000e+01 +1.025870000000000060e+00 -5.765625000000000000e+01 +1.025875000000000092e+00 -5.765625000000000000e+01 +1.025880000000000125e+00 -5.765625000000000000e+01 +1.025885000000000158e+00 -5.762500000000000000e+01 +1.025890000000000191e+00 -5.759375000000000000e+01 +1.025895000000000001e+00 -5.765625000000000000e+01 +1.025900000000000034e+00 -5.765625000000000000e+01 +1.025905000000000067e+00 -5.762500000000000000e+01 +1.025910000000000100e+00 -5.759375000000000000e+01 +1.025915000000000132e+00 -5.765625000000000000e+01 +1.025920000000000165e+00 -5.765625000000000000e+01 +1.025924999999999976e+00 -5.762500000000000000e+01 +1.025930000000000009e+00 -5.759375000000000000e+01 +1.025935000000000041e+00 -5.759375000000000000e+01 +1.025940000000000074e+00 -5.762500000000000000e+01 +1.025945000000000107e+00 -5.756250000000000000e+01 +1.025950000000000140e+00 -5.759375000000000000e+01 +1.025955000000000172e+00 -5.753125381469726562e+01 +1.025959999999999983e+00 -5.762500000000000000e+01 +1.025965000000000016e+00 -5.756250000000000000e+01 +1.025970000000000049e+00 -5.759375000000000000e+01 +1.025975000000000081e+00 -5.753125381469726562e+01 +1.025980000000000114e+00 -5.759375000000000000e+01 +1.025985000000000147e+00 -5.756250000000000000e+01 +1.025990000000000180e+00 -5.756250000000000000e+01 +1.025994999999999990e+00 -5.759375000000000000e+01 +1.026000000000000023e+00 -5.753125381469726562e+01 +1.026005000000000056e+00 -5.753125381469726562e+01 +1.026010000000000089e+00 -5.753125381469726562e+01 +1.026015000000000121e+00 -5.746875000000000000e+01 +1.026020000000000154e+00 -5.756250000000000000e+01 +1.026025000000000187e+00 -5.753125381469726562e+01 +1.026029999999999998e+00 -5.753125381469726562e+01 +1.026035000000000030e+00 -5.753125381469726562e+01 +1.026040000000000063e+00 -5.750000000000000000e+01 +1.026045000000000096e+00 -5.750000000000000000e+01 +1.026050000000000129e+00 -5.750000000000000000e+01 +1.026055000000000161e+00 -5.750000000000000000e+01 +1.026060000000000194e+00 -5.750000000000000000e+01 +1.026065000000000005e+00 -5.746875000000000000e+01 +1.026070000000000038e+00 -5.746875000000000000e+01 +1.026075000000000070e+00 -5.746875000000000000e+01 +1.026080000000000103e+00 -5.746875000000000000e+01 +1.026085000000000136e+00 -5.746875000000000000e+01 +1.026090000000000169e+00 -5.750000000000000000e+01 +1.026094999999999979e+00 -5.746875000000000000e+01 +1.026100000000000012e+00 -5.743750000000000000e+01 +1.026105000000000045e+00 -5.746875000000000000e+01 +1.026110000000000078e+00 -5.743750000000000000e+01 +1.026115000000000110e+00 -5.737500381469726562e+01 +1.026120000000000143e+00 -5.746875000000000000e+01 +1.026125000000000176e+00 -5.743750000000000000e+01 +1.026129999999999987e+00 -5.743750000000000000e+01 +1.026135000000000019e+00 -5.737500381469726562e+01 +1.026140000000000052e+00 -5.737500381469726562e+01 +1.026145000000000085e+00 -5.740625000000000000e+01 +1.026150000000000118e+00 -5.740625000000000000e+01 +1.026155000000000150e+00 -5.734375000000000000e+01 +1.026160000000000183e+00 -5.740625000000000000e+01 +1.026164999999999994e+00 -5.731250000000000000e+01 +1.026170000000000027e+00 -5.740625000000000000e+01 +1.026175000000000059e+00 -5.734375000000000000e+01 +1.026180000000000092e+00 -5.734375000000000000e+01 +1.026185000000000125e+00 -5.731250000000000000e+01 +1.026190000000000158e+00 -5.734375000000000000e+01 +1.026195000000000190e+00 -5.737500381469726562e+01 +1.026200000000000001e+00 -5.734375000000000000e+01 +1.026205000000000034e+00 -5.728125381469726562e+01 +1.026210000000000067e+00 -5.731250000000000000e+01 +1.026215000000000099e+00 -5.728125381469726562e+01 +1.026220000000000132e+00 -5.728125381469726562e+01 +1.026225000000000165e+00 -5.728125381469726562e+01 +1.026229999999999976e+00 -5.728125381469726562e+01 +1.026235000000000008e+00 -5.734375000000000000e+01 +1.026240000000000041e+00 -5.725000000000000000e+01 +1.026245000000000074e+00 -5.725000000000000000e+01 +1.026250000000000107e+00 -5.725000000000000000e+01 +1.026255000000000139e+00 -5.725000000000000000e+01 +1.026260000000000172e+00 -5.721875381469726562e+01 +1.026264999999999983e+00 -5.721875381469726562e+01 +1.026270000000000016e+00 -5.721875381469726562e+01 +1.026275000000000048e+00 -5.715625000000000000e+01 +1.026280000000000081e+00 -5.725000000000000000e+01 +1.026285000000000114e+00 -5.721875381469726562e+01 +1.026290000000000147e+00 -5.725000000000000000e+01 +1.026295000000000179e+00 -5.718750000000000000e+01 +1.026299999999999990e+00 -5.721875381469726562e+01 +1.026305000000000023e+00 -5.718750000000000000e+01 +1.026310000000000056e+00 -5.721875381469726562e+01 +1.026315000000000088e+00 -5.718750000000000000e+01 +1.026320000000000121e+00 -5.712500381469726562e+01 +1.026325000000000154e+00 -5.709375000000000000e+01 +1.026330000000000187e+00 -5.721875381469726562e+01 +1.026334999999999997e+00 -5.715625000000000000e+01 +1.026340000000000030e+00 -5.712500381469726562e+01 +1.026345000000000063e+00 -5.715625000000000000e+01 +1.026350000000000096e+00 -5.715625000000000000e+01 +1.026355000000000128e+00 -5.715625000000000000e+01 +1.026360000000000161e+00 -5.712500381469726562e+01 +1.026365000000000194e+00 -5.712500381469726562e+01 +1.026370000000000005e+00 -5.709375000000000000e+01 +1.026375000000000037e+00 -5.715625000000000000e+01 +1.026380000000000070e+00 -5.706250381469726562e+01 +1.026385000000000103e+00 -5.706250381469726562e+01 +1.026390000000000136e+00 -5.703125000000000000e+01 +1.026395000000000168e+00 -5.709375000000000000e+01 +1.026399999999999979e+00 -5.706250381469726562e+01 +1.026405000000000012e+00 -5.706250381469726562e+01 +1.026410000000000045e+00 -5.706250381469726562e+01 +1.026415000000000077e+00 -5.709375000000000000e+01 +1.026420000000000110e+00 -5.706250381469726562e+01 +1.026425000000000143e+00 -5.706250381469726562e+01 +1.026430000000000176e+00 -5.706250381469726562e+01 +1.026434999999999986e+00 -5.709375000000000000e+01 +1.026440000000000019e+00 -5.703125000000000000e+01 +1.026445000000000052e+00 -5.709375000000000000e+01 +1.026450000000000085e+00 -5.706250381469726562e+01 +1.026455000000000117e+00 -5.709375000000000000e+01 +1.026460000000000150e+00 -5.706250381469726562e+01 +1.026465000000000183e+00 -5.700000000000000000e+01 +1.026469999999999994e+00 -5.700000000000000000e+01 +1.026475000000000026e+00 -5.706250381469726562e+01 +1.026480000000000059e+00 -5.700000000000000000e+01 +1.026485000000000092e+00 -5.700000000000000000e+01 +1.026490000000000125e+00 -5.706250381469726562e+01 +1.026495000000000157e+00 -5.696875381469726562e+01 +1.026500000000000190e+00 -5.700000000000000000e+01 +1.026505000000000001e+00 -5.703125000000000000e+01 +1.026510000000000034e+00 -5.700000000000000000e+01 +1.026515000000000066e+00 -5.693750000000000000e+01 +1.026520000000000099e+00 -5.693750000000000000e+01 +1.026525000000000132e+00 -5.700000000000000000e+01 +1.026530000000000165e+00 -5.690625381469726562e+01 +1.026534999999999975e+00 -5.696875381469726562e+01 +1.026540000000000008e+00 -5.696875381469726562e+01 +1.026545000000000041e+00 -5.696875381469726562e+01 +1.026550000000000074e+00 -5.693750000000000000e+01 +1.026555000000000106e+00 -5.693750000000000000e+01 +1.026560000000000139e+00 -5.693750000000000000e+01 +1.026565000000000172e+00 -5.687500000000000000e+01 +1.026569999999999983e+00 -5.690625381469726562e+01 +1.026575000000000015e+00 -5.687500000000000000e+01 +1.026580000000000048e+00 -5.690625381469726562e+01 +1.026585000000000081e+00 -5.693750000000000000e+01 +1.026590000000000114e+00 -5.687500000000000000e+01 +1.026595000000000146e+00 -5.687500000000000000e+01 +1.026600000000000179e+00 -5.684375000000000000e+01 +1.026604999999999990e+00 -5.687500000000000000e+01 +1.026610000000000023e+00 -5.684375000000000000e+01 +1.026615000000000055e+00 -5.684375000000000000e+01 +1.026620000000000088e+00 -5.684375000000000000e+01 +1.026625000000000121e+00 -5.687500000000000000e+01 +1.026630000000000154e+00 -5.681250381469726562e+01 +1.026635000000000186e+00 -5.684375000000000000e+01 +1.026639999999999997e+00 -5.687500000000000000e+01 +1.026645000000000030e+00 -5.681250381469726562e+01 +1.026650000000000063e+00 -5.681250381469726562e+01 +1.026655000000000095e+00 -5.681250381469726562e+01 +1.026660000000000128e+00 -5.681250381469726562e+01 +1.026665000000000161e+00 -5.678125000000000000e+01 +1.026670000000000194e+00 -5.681250381469726562e+01 +1.026675000000000004e+00 -5.684375000000000000e+01 +1.026680000000000037e+00 -5.681250381469726562e+01 +1.026685000000000070e+00 -5.678125000000000000e+01 +1.026690000000000103e+00 -5.668750000000000000e+01 +1.026695000000000135e+00 -5.675000000000000000e+01 +1.026700000000000168e+00 -5.678125000000000000e+01 +1.026704999999999979e+00 -5.671875000000000000e+01 +1.026710000000000012e+00 -5.671875000000000000e+01 +1.026715000000000044e+00 -5.665625381469726562e+01 +1.026720000000000077e+00 -5.675000000000000000e+01 +1.026725000000000110e+00 -5.671875000000000000e+01 +1.026730000000000143e+00 -5.675000000000000000e+01 +1.026735000000000175e+00 -5.671875000000000000e+01 +1.026739999999999986e+00 -5.668750000000000000e+01 +1.026745000000000019e+00 -5.665625381469726562e+01 +1.026750000000000052e+00 -5.668750000000000000e+01 +1.026755000000000084e+00 -5.668750000000000000e+01 +1.026760000000000117e+00 -5.671875000000000000e+01 +1.026765000000000150e+00 -5.659375000000000000e+01 +1.026770000000000183e+00 -5.671875000000000000e+01 +1.026774999999999993e+00 -5.665625381469726562e+01 +1.026780000000000026e+00 -5.668750000000000000e+01 +1.026785000000000059e+00 -5.665625381469726562e+01 +1.026790000000000092e+00 -5.665625381469726562e+01 +1.026795000000000124e+00 -5.662500000000000000e+01 +1.026800000000000157e+00 -5.665625381469726562e+01 +1.026805000000000190e+00 -5.653125000000000000e+01 +1.026810000000000000e+00 -5.659375000000000000e+01 +1.026815000000000033e+00 -5.662500000000000000e+01 +1.026820000000000066e+00 -5.659375000000000000e+01 +1.026825000000000099e+00 -5.659375000000000000e+01 +1.026830000000000132e+00 -5.659375000000000000e+01 +1.026835000000000164e+00 -5.659375000000000000e+01 +1.026839999999999975e+00 -5.650000381469726562e+01 +1.026845000000000008e+00 -5.656250381469726562e+01 +1.026850000000000041e+00 -5.656250381469726562e+01 +1.026855000000000073e+00 -5.653125000000000000e+01 +1.026860000000000106e+00 -5.653125000000000000e+01 +1.026865000000000139e+00 -5.650000381469726562e+01 +1.026870000000000172e+00 -5.656250381469726562e+01 +1.026874999999999982e+00 -5.656250381469726562e+01 +1.026880000000000015e+00 -5.656250381469726562e+01 +1.026885000000000048e+00 -5.650000381469726562e+01 +1.026890000000000081e+00 -5.656250381469726562e+01 +1.026895000000000113e+00 -5.653125000000000000e+01 +1.026900000000000146e+00 -5.653125000000000000e+01 +1.026905000000000179e+00 -5.650000381469726562e+01 +1.026909999999999989e+00 -5.650000381469726562e+01 +1.026915000000000022e+00 -5.646875000000000000e+01 +1.026920000000000055e+00 -5.653125000000000000e+01 +1.026925000000000088e+00 -5.650000381469726562e+01 +1.026930000000000121e+00 -5.650000381469726562e+01 +1.026935000000000153e+00 -5.650000381469726562e+01 +1.026940000000000186e+00 -5.650000381469726562e+01 +1.026944999999999997e+00 -5.646875000000000000e+01 +1.026950000000000029e+00 -5.643750000000000000e+01 +1.026955000000000062e+00 -5.637500000000000000e+01 +1.026960000000000095e+00 -5.646875000000000000e+01 +1.026965000000000128e+00 -5.643750000000000000e+01 +1.026970000000000161e+00 -5.640625381469726562e+01 +1.026975000000000193e+00 -5.643750000000000000e+01 +1.026980000000000004e+00 -5.643750000000000000e+01 +1.026985000000000037e+00 -5.646875000000000000e+01 +1.026990000000000069e+00 -5.640625381469726562e+01 +1.026995000000000102e+00 -5.643750000000000000e+01 +1.027000000000000135e+00 -5.637500000000000000e+01 +1.027005000000000168e+00 -5.637500000000000000e+01 +1.027009999999999978e+00 -5.640625381469726562e+01 +1.027015000000000011e+00 -5.640625381469726562e+01 +1.027020000000000044e+00 -5.631250000000000000e+01 +1.027025000000000077e+00 -5.634375381469726562e+01 +1.027030000000000109e+00 -5.634375381469726562e+01 +1.027035000000000142e+00 -5.640625381469726562e+01 +1.027040000000000175e+00 -5.631250000000000000e+01 +1.027044999999999986e+00 -5.631250000000000000e+01 +1.027050000000000018e+00 -5.631250000000000000e+01 +1.027055000000000051e+00 -5.631250000000000000e+01 +1.027060000000000084e+00 -5.631250000000000000e+01 +1.027065000000000117e+00 -5.631250000000000000e+01 +1.027070000000000149e+00 -5.631250000000000000e+01 +1.027075000000000182e+00 -5.631250000000000000e+01 +1.027079999999999993e+00 -5.628125000000000000e+01 +1.027085000000000026e+00 -5.631250000000000000e+01 +1.027090000000000058e+00 -5.631250000000000000e+01 +1.027095000000000091e+00 -5.625000381469726562e+01 +1.027100000000000124e+00 -5.625000381469726562e+01 +1.027105000000000157e+00 -5.625000381469726562e+01 +1.027110000000000190e+00 -5.628125000000000000e+01 +1.027115000000000000e+00 -5.625000381469726562e+01 +1.027120000000000033e+00 -5.625000381469726562e+01 +1.027125000000000066e+00 -5.628125000000000000e+01 +1.027130000000000098e+00 -5.621875000000000000e+01 +1.027135000000000131e+00 -5.628125000000000000e+01 +1.027140000000000164e+00 -5.628125000000000000e+01 +1.027144999999999975e+00 -5.625000381469726562e+01 +1.027150000000000007e+00 -5.625000381469726562e+01 +1.027155000000000040e+00 -5.612500000000000000e+01 +1.027160000000000073e+00 -5.618750381469726562e+01 +1.027165000000000106e+00 -5.621875000000000000e+01 +1.027170000000000138e+00 -5.621875000000000000e+01 +1.027175000000000171e+00 -5.618750381469726562e+01 +1.027179999999999982e+00 -5.615625000000000000e+01 +1.027185000000000015e+00 -5.612500000000000000e+01 +1.027190000000000047e+00 -5.612500000000000000e+01 +1.027195000000000080e+00 -5.618750381469726562e+01 +1.027200000000000113e+00 -5.615625000000000000e+01 +1.027205000000000146e+00 -5.621875000000000000e+01 +1.027210000000000178e+00 -5.615625000000000000e+01 +1.027214999999999989e+00 -5.615625000000000000e+01 +1.027220000000000022e+00 -5.621875000000000000e+01 +1.027225000000000055e+00 -5.621875000000000000e+01 +1.027230000000000087e+00 -5.621875000000000000e+01 +1.027235000000000120e+00 -5.615625000000000000e+01 +1.027240000000000153e+00 -5.606250000000000000e+01 +1.027245000000000186e+00 -5.612500000000000000e+01 +1.027249999999999996e+00 -5.615625000000000000e+01 +1.027255000000000029e+00 -5.612500000000000000e+01 +1.027260000000000062e+00 -5.612500000000000000e+01 +1.027265000000000095e+00 -5.612500000000000000e+01 +1.027270000000000127e+00 -5.609375381469726562e+01 +1.027275000000000160e+00 -5.606250000000000000e+01 +1.027280000000000193e+00 -5.606250000000000000e+01 +1.027285000000000004e+00 -5.612500000000000000e+01 +1.027290000000000036e+00 -5.612500000000000000e+01 +1.027295000000000069e+00 -5.612500000000000000e+01 +1.027300000000000102e+00 -5.612500000000000000e+01 +1.027305000000000135e+00 -5.606250000000000000e+01 +1.027310000000000167e+00 -5.606250000000000000e+01 +1.027314999999999978e+00 -5.606250000000000000e+01 +1.027320000000000011e+00 -5.609375381469726562e+01 +1.027325000000000044e+00 -5.609375381469726562e+01 +1.027330000000000076e+00 -5.606250000000000000e+01 +1.027335000000000109e+00 -5.609375381469726562e+01 +1.027340000000000142e+00 -5.609375381469726562e+01 +1.027345000000000175e+00 -5.606250000000000000e+01 +1.027349999999999985e+00 -5.603125000000000000e+01 +1.027355000000000018e+00 -5.600000000000000000e+01 +1.027360000000000051e+00 -5.603125000000000000e+01 +1.027365000000000084e+00 -5.600000000000000000e+01 +1.027370000000000116e+00 -5.603125000000000000e+01 +1.027375000000000149e+00 -5.603125000000000000e+01 +1.027380000000000182e+00 -5.596875000000000000e+01 +1.027384999999999993e+00 -5.593750381469726562e+01 +1.027390000000000025e+00 -5.600000000000000000e+01 +1.027395000000000058e+00 -5.596875000000000000e+01 +1.027400000000000091e+00 -5.596875000000000000e+01 +1.027405000000000124e+00 -5.603125000000000000e+01 +1.027410000000000156e+00 -5.596875000000000000e+01 +1.027415000000000189e+00 -5.600000000000000000e+01 +1.027420000000000000e+00 -5.600000000000000000e+01 +1.027425000000000033e+00 -5.596875000000000000e+01 +1.027430000000000065e+00 -5.596875000000000000e+01 +1.027435000000000098e+00 -5.593750381469726562e+01 +1.027440000000000131e+00 -5.590625000000000000e+01 +1.027445000000000164e+00 -5.600000000000000000e+01 +1.027449999999999974e+00 -5.593750381469726562e+01 +1.027455000000000007e+00 -5.584375000000000000e+01 +1.027460000000000040e+00 -5.590625000000000000e+01 +1.027465000000000073e+00 -5.600000000000000000e+01 +1.027470000000000105e+00 -5.593750381469726562e+01 +1.027475000000000138e+00 -5.596875000000000000e+01 +1.027480000000000171e+00 -5.593750381469726562e+01 +1.027484999999999982e+00 -5.593750381469726562e+01 +1.027490000000000014e+00 -5.593750381469726562e+01 +1.027495000000000047e+00 -5.590625000000000000e+01 +1.027500000000000080e+00 -5.593750381469726562e+01 +1.027505000000000113e+00 -5.590625000000000000e+01 +1.027510000000000145e+00 -5.593750381469726562e+01 +1.027515000000000178e+00 -5.593750381469726562e+01 +1.027519999999999989e+00 -5.587500000000000000e+01 +1.027525000000000022e+00 -5.590625000000000000e+01 +1.027530000000000054e+00 -5.584375000000000000e+01 +1.027535000000000087e+00 -5.587500000000000000e+01 +1.027540000000000120e+00 -5.584375000000000000e+01 +1.027545000000000153e+00 -5.581250000000000000e+01 +1.027550000000000185e+00 -5.584375000000000000e+01 +1.027554999999999996e+00 -5.584375000000000000e+01 +1.027560000000000029e+00 -5.575000000000000000e+01 +1.027565000000000062e+00 -5.584375000000000000e+01 +1.027570000000000094e+00 -5.584375000000000000e+01 +1.027575000000000127e+00 -5.584375000000000000e+01 +1.027580000000000160e+00 -5.578125381469726562e+01 +1.027585000000000193e+00 -5.581250000000000000e+01 +1.027590000000000003e+00 -5.578125381469726562e+01 +1.027595000000000036e+00 -5.581250000000000000e+01 +1.027600000000000069e+00 -5.578125381469726562e+01 +1.027605000000000102e+00 -5.578125381469726562e+01 +1.027610000000000134e+00 -5.571875000000000000e+01 +1.027615000000000167e+00 -5.578125381469726562e+01 +1.027619999999999978e+00 -5.575000000000000000e+01 +1.027625000000000011e+00 -5.575000000000000000e+01 +1.027630000000000043e+00 -5.578125381469726562e+01 +1.027635000000000076e+00 -5.578125381469726562e+01 +1.027640000000000109e+00 -5.568750381469726562e+01 +1.027645000000000142e+00 -5.578125381469726562e+01 +1.027650000000000174e+00 -5.575000000000000000e+01 +1.027654999999999985e+00 -5.571875000000000000e+01 +1.027660000000000018e+00 -5.571875000000000000e+01 +1.027665000000000051e+00 -5.571875000000000000e+01 +1.027670000000000083e+00 -5.571875000000000000e+01 +1.027675000000000116e+00 -5.568750381469726562e+01 +1.027680000000000149e+00 -5.568750381469726562e+01 +1.027685000000000182e+00 -5.565625000000000000e+01 +1.027689999999999992e+00 -5.575000000000000000e+01 +1.027695000000000025e+00 -5.565625000000000000e+01 +1.027700000000000058e+00 -5.559375000000000000e+01 +1.027705000000000091e+00 -5.571875000000000000e+01 +1.027710000000000123e+00 -5.568750381469726562e+01 +1.027715000000000156e+00 -5.568750381469726562e+01 +1.027720000000000189e+00 -5.559375000000000000e+01 +1.027725000000000000e+00 -5.559375000000000000e+01 +1.027730000000000032e+00 -5.565625000000000000e+01 +1.027735000000000065e+00 -5.565625000000000000e+01 +1.027740000000000098e+00 -5.559375000000000000e+01 +1.027745000000000131e+00 -5.559375000000000000e+01 +1.027750000000000163e+00 -5.565625000000000000e+01 +1.027754999999999974e+00 -5.559375000000000000e+01 +1.027760000000000007e+00 -5.553125381469726562e+01 +1.027765000000000040e+00 -5.556250000000000000e+01 +1.027770000000000072e+00 -5.565625000000000000e+01 +1.027775000000000105e+00 -5.553125381469726562e+01 +1.027780000000000138e+00 -5.556250000000000000e+01 +1.027785000000000171e+00 -5.553125381469726562e+01 +1.027789999999999981e+00 -5.553125381469726562e+01 +1.027795000000000014e+00 -5.556250000000000000e+01 +1.027800000000000047e+00 -5.556250000000000000e+01 +1.027805000000000080e+00 -5.556250000000000000e+01 +1.027810000000000112e+00 -5.556250000000000000e+01 +1.027815000000000145e+00 -5.553125381469726562e+01 +1.027820000000000178e+00 -5.556250000000000000e+01 +1.027824999999999989e+00 -5.546875381469726562e+01 +1.027830000000000021e+00 -5.556250000000000000e+01 +1.027835000000000054e+00 -5.550000000000000000e+01 +1.027840000000000087e+00 -5.543750000000000000e+01 +1.027845000000000120e+00 -5.546875381469726562e+01 +1.027850000000000152e+00 -5.546875381469726562e+01 +1.027855000000000185e+00 -5.543750000000000000e+01 +1.027859999999999996e+00 -5.550000000000000000e+01 +1.027865000000000029e+00 -5.550000000000000000e+01 +1.027870000000000061e+00 -5.543750000000000000e+01 +1.027875000000000094e+00 -5.546875381469726562e+01 +1.027880000000000127e+00 -5.537500381469726562e+01 +1.027885000000000160e+00 -5.550000000000000000e+01 +1.027890000000000192e+00 -5.546875381469726562e+01 +1.027895000000000003e+00 -5.543750000000000000e+01 +1.027900000000000036e+00 -5.546875381469726562e+01 +1.027905000000000069e+00 -5.540625000000000000e+01 +1.027910000000000101e+00 -5.537500381469726562e+01 +1.027915000000000134e+00 -5.534375000000000000e+01 +1.027920000000000167e+00 -5.537500381469726562e+01 +1.027924999999999978e+00 -5.534375000000000000e+01 +1.027930000000000010e+00 -5.537500381469726562e+01 +1.027935000000000043e+00 -5.537500381469726562e+01 +1.027940000000000076e+00 -5.537500381469726562e+01 +1.027945000000000109e+00 -5.540625000000000000e+01 +1.027950000000000141e+00 -5.534375000000000000e+01 +1.027955000000000174e+00 -5.537500381469726562e+01 +1.027959999999999985e+00 -5.543750000000000000e+01 +1.027965000000000018e+00 -5.537500381469726562e+01 +1.027970000000000050e+00 -5.537500381469726562e+01 +1.027975000000000083e+00 -5.537500381469726562e+01 +1.027980000000000116e+00 -5.531250000000000000e+01 +1.027985000000000149e+00 -5.534375000000000000e+01 +1.027990000000000181e+00 -5.528125000000000000e+01 +1.027994999999999992e+00 -5.531250000000000000e+01 +1.028000000000000025e+00 -5.531250000000000000e+01 +1.028005000000000058e+00 -5.537500381469726562e+01 +1.028010000000000090e+00 -5.528125000000000000e+01 +1.028015000000000123e+00 -5.531250000000000000e+01 +1.028020000000000156e+00 -5.528125000000000000e+01 +1.028025000000000189e+00 -5.531250000000000000e+01 +1.028029999999999999e+00 -5.534375000000000000e+01 +1.028035000000000032e+00 -5.528125000000000000e+01 +1.028040000000000065e+00 -5.528125000000000000e+01 +1.028045000000000098e+00 -5.528125000000000000e+01 +1.028050000000000130e+00 -5.528125000000000000e+01 +1.028055000000000163e+00 -5.525000000000000000e+01 +1.028059999999999974e+00 -5.528125000000000000e+01 +1.028065000000000007e+00 -5.518750000000000000e+01 +1.028070000000000039e+00 -5.521875381469726562e+01 +1.028075000000000072e+00 -5.518750000000000000e+01 +1.028080000000000105e+00 -5.521875381469726562e+01 +1.028085000000000138e+00 -5.518750000000000000e+01 +1.028090000000000170e+00 -5.518750000000000000e+01 +1.028094999999999981e+00 -5.512500000000000000e+01 +1.028100000000000014e+00 -5.515625000000000000e+01 +1.028105000000000047e+00 -5.515625000000000000e+01 +1.028110000000000079e+00 -5.515625000000000000e+01 +1.028115000000000112e+00 -5.512500000000000000e+01 +1.028120000000000145e+00 -5.515625000000000000e+01 +1.028125000000000178e+00 -5.509375000000000000e+01 +1.028129999999999988e+00 -5.515625000000000000e+01 +1.028135000000000021e+00 -5.515625000000000000e+01 +1.028140000000000054e+00 -5.512500000000000000e+01 +1.028145000000000087e+00 -5.506250381469726562e+01 +1.028150000000000119e+00 -5.512500000000000000e+01 +1.028155000000000152e+00 -5.512500000000000000e+01 +1.028160000000000185e+00 -5.509375000000000000e+01 +1.028164999999999996e+00 -5.503125000000000000e+01 +1.028170000000000028e+00 -5.503125000000000000e+01 +1.028175000000000061e+00 -5.503125000000000000e+01 +1.028180000000000094e+00 -5.506250381469726562e+01 +1.028185000000000127e+00 -5.506250381469726562e+01 +1.028190000000000159e+00 -5.503125000000000000e+01 +1.028195000000000192e+00 -5.506250381469726562e+01 +1.028200000000000003e+00 -5.503125000000000000e+01 +1.028205000000000036e+00 -5.506250381469726562e+01 +1.028210000000000068e+00 -5.509375000000000000e+01 +1.028215000000000101e+00 -5.509375000000000000e+01 +1.028220000000000134e+00 -5.503125000000000000e+01 +1.028225000000000167e+00 -5.500000000000000000e+01 +1.028229999999999977e+00 -5.500000000000000000e+01 +1.028235000000000010e+00 -5.500000000000000000e+01 +1.028240000000000043e+00 -5.503125000000000000e+01 +1.028245000000000076e+00 -5.500000000000000000e+01 +1.028250000000000108e+00 -5.503125000000000000e+01 +1.028255000000000141e+00 -5.503125000000000000e+01 +1.028260000000000174e+00 -5.500000000000000000e+01 +1.028264999999999985e+00 -5.503125000000000000e+01 +1.028270000000000017e+00 -5.503125000000000000e+01 +1.028275000000000050e+00 -5.500000000000000000e+01 +1.028280000000000083e+00 -5.500000000000000000e+01 +1.028285000000000116e+00 -5.500000000000000000e+01 +1.028290000000000148e+00 -5.500000000000000000e+01 +1.028295000000000181e+00 -5.496875381469726562e+01 +1.028299999999999992e+00 -5.496875381469726562e+01 +1.028305000000000025e+00 -5.500000000000000000e+01 +1.028310000000000057e+00 -5.496875381469726562e+01 +1.028315000000000090e+00 -5.500000000000000000e+01 +1.028320000000000123e+00 -5.500000000000000000e+01 +1.028325000000000156e+00 -5.500000000000000000e+01 +1.028330000000000188e+00 -5.500000000000000000e+01 +1.028334999999999999e+00 -5.496875381469726562e+01 +1.028340000000000032e+00 -5.490625381469726562e+01 +1.028345000000000065e+00 -5.493750000000000000e+01 +1.028350000000000097e+00 -5.490625381469726562e+01 +1.028355000000000130e+00 -5.493750000000000000e+01 +1.028360000000000163e+00 -5.487500000000000000e+01 +1.028364999999999974e+00 -5.493750000000000000e+01 +1.028370000000000006e+00 -5.490625381469726562e+01 +1.028375000000000039e+00 -5.490625381469726562e+01 +1.028380000000000072e+00 -5.493750000000000000e+01 +1.028385000000000105e+00 -5.490625381469726562e+01 +1.028390000000000137e+00 -5.484375000000000000e+01 +1.028395000000000170e+00 -5.484375000000000000e+01 +1.028399999999999981e+00 -5.487500000000000000e+01 +1.028405000000000014e+00 -5.484375000000000000e+01 +1.028410000000000046e+00 -5.487500000000000000e+01 +1.028415000000000079e+00 -5.487500000000000000e+01 +1.028420000000000112e+00 -5.490625381469726562e+01 +1.028425000000000145e+00 -5.490625381469726562e+01 +1.028430000000000177e+00 -5.484375000000000000e+01 +1.028434999999999988e+00 -5.484375000000000000e+01 +1.028440000000000021e+00 -5.484375000000000000e+01 +1.028445000000000054e+00 -5.481250381469726562e+01 +1.028450000000000086e+00 -5.484375000000000000e+01 +1.028455000000000119e+00 -5.484375000000000000e+01 +1.028460000000000152e+00 -5.484375000000000000e+01 +1.028465000000000185e+00 -5.484375000000000000e+01 +1.028469999999999995e+00 -5.484375000000000000e+01 +1.028475000000000028e+00 -5.481250381469726562e+01 +1.028480000000000061e+00 -5.481250381469726562e+01 +1.028485000000000094e+00 -5.478125000000000000e+01 +1.028490000000000126e+00 -5.484375000000000000e+01 +1.028495000000000159e+00 -5.481250381469726562e+01 +1.028500000000000192e+00 -5.478125000000000000e+01 +1.028505000000000003e+00 -5.478125000000000000e+01 +1.028510000000000035e+00 -5.484375000000000000e+01 +1.028515000000000068e+00 -5.484375000000000000e+01 +1.028520000000000101e+00 -5.481250381469726562e+01 +1.028525000000000134e+00 -5.487500000000000000e+01 +1.028530000000000166e+00 -5.481250381469726562e+01 +1.028534999999999977e+00 -5.481250381469726562e+01 +1.028540000000000010e+00 -5.478125000000000000e+01 +1.028545000000000043e+00 -5.481250381469726562e+01 +1.028550000000000075e+00 -5.478125000000000000e+01 +1.028555000000000108e+00 -5.478125000000000000e+01 +1.028560000000000141e+00 -5.481250381469726562e+01 +1.028565000000000174e+00 -5.471875000000000000e+01 +1.028569999999999984e+00 -5.478125000000000000e+01 +1.028575000000000017e+00 -5.471875000000000000e+01 +1.028580000000000050e+00 -5.481250381469726562e+01 +1.028585000000000083e+00 -5.475000381469726562e+01 +1.028590000000000115e+00 -5.475000381469726562e+01 +1.028595000000000148e+00 -5.478125000000000000e+01 +1.028600000000000181e+00 -5.471875000000000000e+01 +1.028604999999999992e+00 -5.478125000000000000e+01 +1.028610000000000024e+00 -5.471875000000000000e+01 +1.028615000000000057e+00 -5.468750000000000000e+01 +1.028620000000000090e+00 -5.475000381469726562e+01 +1.028625000000000123e+00 -5.471875000000000000e+01 +1.028630000000000155e+00 -5.475000381469726562e+01 +1.028635000000000188e+00 -5.468750000000000000e+01 +1.028639999999999999e+00 -5.471875000000000000e+01 +1.028645000000000032e+00 -5.465625381469726562e+01 +1.028650000000000064e+00 -5.471875000000000000e+01 +1.028655000000000097e+00 -5.468750000000000000e+01 +1.028660000000000130e+00 -5.471875000000000000e+01 +1.028665000000000163e+00 -5.468750000000000000e+01 +1.028669999999999973e+00 -5.468750000000000000e+01 +1.028675000000000006e+00 -5.462500000000000000e+01 +1.028680000000000039e+00 -5.471875000000000000e+01 +1.028685000000000072e+00 -5.475000381469726562e+01 +1.028690000000000104e+00 -5.468750000000000000e+01 +1.028695000000000137e+00 -5.465625381469726562e+01 +1.028700000000000170e+00 -5.462500000000000000e+01 +1.028704999999999981e+00 -5.462500000000000000e+01 +1.028710000000000013e+00 -5.462500000000000000e+01 +1.028715000000000046e+00 -5.465625381469726562e+01 +1.028720000000000079e+00 -5.465625381469726562e+01 +1.028725000000000112e+00 -5.462500000000000000e+01 +1.028730000000000144e+00 -5.456250000000000000e+01 +1.028735000000000177e+00 -5.456250000000000000e+01 +1.028739999999999988e+00 -5.456250000000000000e+01 +1.028745000000000021e+00 -5.462500000000000000e+01 +1.028750000000000053e+00 -5.456250000000000000e+01 +1.028755000000000086e+00 -5.459375381469726562e+01 +1.028760000000000119e+00 -5.453125000000000000e+01 +1.028765000000000152e+00 -5.462500000000000000e+01 +1.028770000000000184e+00 -5.462500000000000000e+01 +1.028774999999999995e+00 -5.453125000000000000e+01 +1.028780000000000028e+00 -5.456250000000000000e+01 +1.028785000000000061e+00 -5.453125000000000000e+01 +1.028790000000000093e+00 -5.453125000000000000e+01 +1.028795000000000126e+00 -5.456250000000000000e+01 +1.028800000000000159e+00 -5.456250000000000000e+01 +1.028805000000000192e+00 -5.459375381469726562e+01 +1.028810000000000002e+00 -5.453125000000000000e+01 +1.028815000000000035e+00 -5.453125000000000000e+01 +1.028820000000000068e+00 -5.453125000000000000e+01 +1.028825000000000101e+00 -5.456250000000000000e+01 +1.028830000000000133e+00 -5.456250000000000000e+01 +1.028835000000000166e+00 -5.450000381469726562e+01 +1.028839999999999977e+00 -5.450000381469726562e+01 +1.028845000000000010e+00 -5.450000381469726562e+01 +1.028850000000000042e+00 -5.446875000000000000e+01 +1.028855000000000075e+00 -5.450000381469726562e+01 +1.028860000000000108e+00 -5.446875000000000000e+01 +1.028865000000000141e+00 -5.446875000000000000e+01 +1.028870000000000173e+00 -5.450000381469726562e+01 +1.028874999999999984e+00 -5.443750000000000000e+01 +1.028880000000000017e+00 -5.446875000000000000e+01 +1.028885000000000050e+00 -5.450000381469726562e+01 +1.028890000000000082e+00 -5.443750000000000000e+01 +1.028895000000000115e+00 -5.446875000000000000e+01 +1.028900000000000148e+00 -5.440625000000000000e+01 +1.028905000000000181e+00 -5.440625000000000000e+01 +1.028909999999999991e+00 -5.440625000000000000e+01 +1.028915000000000024e+00 -5.440625000000000000e+01 +1.028920000000000057e+00 -5.440625000000000000e+01 +1.028925000000000090e+00 -5.437500000000000000e+01 +1.028930000000000122e+00 -5.443750000000000000e+01 +1.028935000000000155e+00 -5.440625000000000000e+01 +1.028940000000000188e+00 -5.437500000000000000e+01 +1.028944999999999999e+00 -5.443750000000000000e+01 +1.028950000000000031e+00 -5.440625000000000000e+01 +1.028955000000000064e+00 -5.440625000000000000e+01 +1.028960000000000097e+00 -5.434375381469726562e+01 +1.028965000000000130e+00 -5.437500000000000000e+01 +1.028970000000000162e+00 -5.431250000000000000e+01 +1.028975000000000195e+00 -5.431250000000000000e+01 +1.028980000000000006e+00 -5.431250000000000000e+01 +1.028985000000000039e+00 -5.434375381469726562e+01 +1.028990000000000071e+00 -5.434375381469726562e+01 +1.028995000000000104e+00 -5.428125000000000000e+01 +1.029000000000000137e+00 -5.431250000000000000e+01 +1.029005000000000170e+00 -5.428125000000000000e+01 +1.029009999999999980e+00 -5.428125000000000000e+01 +1.029015000000000013e+00 -5.431250000000000000e+01 +1.029020000000000046e+00 -5.428125000000000000e+01 +1.029025000000000079e+00 -5.428125000000000000e+01 +1.029030000000000111e+00 -5.425000000000000000e+01 +1.029035000000000144e+00 -5.434375381469726562e+01 +1.029040000000000177e+00 -5.421875000000000000e+01 +1.029044999999999987e+00 -5.425000000000000000e+01 +1.029050000000000020e+00 -5.425000000000000000e+01 +1.029055000000000053e+00 -5.428125000000000000e+01 +1.029060000000000086e+00 -5.428125000000000000e+01 +1.029065000000000119e+00 -5.421875000000000000e+01 +1.029070000000000151e+00 -5.428125000000000000e+01 +1.029075000000000184e+00 -5.421875000000000000e+01 +1.029079999999999995e+00 -5.421875000000000000e+01 +1.029085000000000027e+00 -5.428125000000000000e+01 +1.029090000000000060e+00 -5.428125000000000000e+01 +1.029095000000000093e+00 -5.418750381469726562e+01 +1.029100000000000126e+00 -5.428125000000000000e+01 +1.029105000000000159e+00 -5.415625000000000000e+01 +1.029110000000000191e+00 -5.415625000000000000e+01 +1.029115000000000002e+00 -5.418750381469726562e+01 +1.029120000000000035e+00 -5.418750381469726562e+01 +1.029125000000000068e+00 -5.418750381469726562e+01 +1.029130000000000100e+00 -5.415625000000000000e+01 +1.029135000000000133e+00 -5.421875000000000000e+01 +1.029140000000000166e+00 -5.418750381469726562e+01 +1.029144999999999976e+00 -5.418750381469726562e+01 +1.029150000000000009e+00 -5.415625000000000000e+01 +1.029155000000000042e+00 -5.409375381469726562e+01 +1.029160000000000075e+00 -5.409375381469726562e+01 +1.029165000000000108e+00 -5.412500000000000000e+01 +1.029170000000000140e+00 -5.412500000000000000e+01 +1.029175000000000173e+00 -5.409375381469726562e+01 +1.029179999999999984e+00 -5.415625000000000000e+01 +1.029185000000000016e+00 -5.406250000000000000e+01 +1.029190000000000049e+00 -5.409375381469726562e+01 +1.029195000000000082e+00 -5.406250000000000000e+01 +1.029200000000000115e+00 -5.406250000000000000e+01 +1.029205000000000148e+00 -5.409375381469726562e+01 +1.029210000000000180e+00 -5.409375381469726562e+01 +1.029214999999999991e+00 -5.409375381469726562e+01 +1.029220000000000024e+00 -5.409375381469726562e+01 +1.029225000000000056e+00 -5.412500000000000000e+01 +1.029230000000000089e+00 -5.409375381469726562e+01 +1.029235000000000122e+00 -5.406250000000000000e+01 +1.029240000000000155e+00 -5.400000000000000000e+01 +1.029245000000000188e+00 -5.400000000000000000e+01 +1.029249999999999998e+00 -5.403125381469726562e+01 +1.029255000000000031e+00 -5.400000000000000000e+01 +1.029260000000000064e+00 -5.403125381469726562e+01 +1.029265000000000096e+00 -5.400000000000000000e+01 +1.029270000000000129e+00 -5.396875000000000000e+01 +1.029275000000000162e+00 -5.396875000000000000e+01 +1.029280000000000195e+00 -5.396875000000000000e+01 +1.029285000000000005e+00 -5.400000000000000000e+01 +1.029290000000000038e+00 -5.393750381469726562e+01 +1.029295000000000071e+00 -5.396875000000000000e+01 +1.029300000000000104e+00 -5.393750381469726562e+01 +1.029305000000000136e+00 -5.400000000000000000e+01 +1.029310000000000169e+00 -5.400000000000000000e+01 +1.029314999999999980e+00 -5.396875000000000000e+01 +1.029320000000000013e+00 -5.396875000000000000e+01 +1.029325000000000045e+00 -5.396875000000000000e+01 +1.029330000000000078e+00 -5.396875000000000000e+01 +1.029335000000000111e+00 -5.400000000000000000e+01 +1.029340000000000144e+00 -5.396875000000000000e+01 +1.029345000000000176e+00 -5.390625000000000000e+01 +1.029349999999999987e+00 -5.396875000000000000e+01 +1.029355000000000020e+00 -5.396875000000000000e+01 +1.029360000000000053e+00 -5.400000000000000000e+01 +1.029365000000000085e+00 -5.393750381469726562e+01 +1.029370000000000118e+00 -5.384375000000000000e+01 +1.029375000000000151e+00 -5.387500381469726562e+01 +1.029380000000000184e+00 -5.387500381469726562e+01 +1.029384999999999994e+00 -5.390625000000000000e+01 +1.029390000000000027e+00 -5.384375000000000000e+01 +1.029395000000000060e+00 -5.387500381469726562e+01 +1.029400000000000093e+00 -5.390625000000000000e+01 +1.029405000000000125e+00 -5.384375000000000000e+01 +1.029410000000000158e+00 -5.387500381469726562e+01 +1.029415000000000191e+00 -5.390625000000000000e+01 +1.029420000000000002e+00 -5.387500381469726562e+01 +1.029425000000000034e+00 -5.390625000000000000e+01 +1.029430000000000067e+00 -5.390625000000000000e+01 +1.029435000000000100e+00 -5.390625000000000000e+01 +1.029440000000000133e+00 -5.384375000000000000e+01 +1.029445000000000165e+00 -5.393750381469726562e+01 +1.029449999999999976e+00 -5.387500381469726562e+01 +1.029455000000000009e+00 -5.384375000000000000e+01 +1.029460000000000042e+00 -5.390625000000000000e+01 +1.029465000000000074e+00 -5.378125381469726562e+01 +1.029470000000000107e+00 -5.375000000000000000e+01 +1.029475000000000140e+00 -5.378125381469726562e+01 +1.029480000000000173e+00 -5.378125381469726562e+01 +1.029484999999999983e+00 -5.384375000000000000e+01 +1.029490000000000016e+00 -5.378125381469726562e+01 +1.029495000000000049e+00 -5.381250000000000000e+01 +1.029500000000000082e+00 -5.375000000000000000e+01 +1.029505000000000114e+00 -5.378125381469726562e+01 +1.029510000000000147e+00 -5.378125381469726562e+01 +1.029515000000000180e+00 -5.378125381469726562e+01 +1.029519999999999991e+00 -5.375000000000000000e+01 +1.029525000000000023e+00 -5.371875000000000000e+01 +1.029530000000000056e+00 -5.371875000000000000e+01 +1.029535000000000089e+00 -5.378125381469726562e+01 +1.029540000000000122e+00 -5.371875000000000000e+01 +1.029545000000000154e+00 -5.371875000000000000e+01 +1.029550000000000187e+00 -5.371875000000000000e+01 +1.029554999999999998e+00 -5.371875000000000000e+01 +1.029560000000000031e+00 -5.375000000000000000e+01 +1.029565000000000063e+00 -5.371875000000000000e+01 +1.029570000000000096e+00 -5.378125381469726562e+01 +1.029575000000000129e+00 -5.368750000000000000e+01 +1.029580000000000162e+00 -5.378125381469726562e+01 +1.029585000000000194e+00 -5.375000000000000000e+01 +1.029590000000000005e+00 -5.368750000000000000e+01 +1.029595000000000038e+00 -5.371875000000000000e+01 +1.029600000000000071e+00 -5.371875000000000000e+01 +1.029605000000000103e+00 -5.368750000000000000e+01 +1.029610000000000136e+00 -5.365625000000000000e+01 +1.029615000000000169e+00 -5.368750000000000000e+01 +1.029619999999999980e+00 -5.368750000000000000e+01 +1.029625000000000012e+00 -5.368750000000000000e+01 +1.029630000000000045e+00 -5.368750000000000000e+01 +1.029635000000000078e+00 -5.365625000000000000e+01 +1.029640000000000111e+00 -5.371875000000000000e+01 +1.029645000000000143e+00 -5.362500381469726562e+01 +1.029650000000000176e+00 -5.368750000000000000e+01 +1.029654999999999987e+00 -5.368750000000000000e+01 +1.029660000000000020e+00 -5.362500381469726562e+01 +1.029665000000000052e+00 -5.362500381469726562e+01 +1.029670000000000085e+00 -5.365625000000000000e+01 +1.029675000000000118e+00 -5.371875000000000000e+01 +1.029680000000000151e+00 -5.365625000000000000e+01 +1.029685000000000183e+00 -5.365625000000000000e+01 +1.029689999999999994e+00 -5.359375000000000000e+01 +1.029695000000000027e+00 -5.371875000000000000e+01 +1.029700000000000060e+00 -5.368750000000000000e+01 +1.029705000000000092e+00 -5.365625000000000000e+01 +1.029710000000000125e+00 -5.365625000000000000e+01 +1.029715000000000158e+00 -5.365625000000000000e+01 +1.029720000000000191e+00 -5.359375000000000000e+01 +1.029725000000000001e+00 -5.365625000000000000e+01 +1.029730000000000034e+00 -5.362500381469726562e+01 +1.029735000000000067e+00 -5.365625000000000000e+01 +1.029740000000000100e+00 -5.362500381469726562e+01 +1.029745000000000132e+00 -5.353125000000000000e+01 +1.029750000000000165e+00 -5.359375000000000000e+01 +1.029754999999999976e+00 -5.356250000000000000e+01 +1.029760000000000009e+00 -5.359375000000000000e+01 +1.029765000000000041e+00 -5.359375000000000000e+01 +1.029770000000000074e+00 -5.353125000000000000e+01 +1.029775000000000107e+00 -5.353125000000000000e+01 +1.029780000000000140e+00 -5.353125000000000000e+01 +1.029785000000000172e+00 -5.353125000000000000e+01 +1.029789999999999983e+00 -5.353125000000000000e+01 +1.029795000000000016e+00 -5.356250000000000000e+01 +1.029800000000000049e+00 -5.356250000000000000e+01 +1.029805000000000081e+00 -5.359375000000000000e+01 +1.029810000000000114e+00 -5.356250000000000000e+01 +1.029815000000000147e+00 -5.350000000000000000e+01 +1.029820000000000180e+00 -5.353125000000000000e+01 +1.029824999999999990e+00 -5.353125000000000000e+01 +1.029830000000000023e+00 -5.350000000000000000e+01 +1.029835000000000056e+00 -5.350000000000000000e+01 +1.029840000000000089e+00 -5.350000000000000000e+01 +1.029845000000000121e+00 -5.356250000000000000e+01 +1.029850000000000154e+00 -5.350000000000000000e+01 +1.029855000000000187e+00 -5.343750000000000000e+01 +1.029859999999999998e+00 -5.350000000000000000e+01 +1.029865000000000030e+00 -5.350000000000000000e+01 +1.029870000000000063e+00 -5.350000000000000000e+01 +1.029875000000000096e+00 -5.346875381469726562e+01 +1.029880000000000129e+00 -5.343750000000000000e+01 +1.029885000000000161e+00 -5.343750000000000000e+01 +1.029890000000000194e+00 -5.343750000000000000e+01 +1.029895000000000005e+00 -5.343750000000000000e+01 +1.029900000000000038e+00 -5.340625000000000000e+01 +1.029905000000000070e+00 -5.343750000000000000e+01 +1.029910000000000103e+00 -5.343750000000000000e+01 +1.029915000000000136e+00 -5.334375000000000000e+01 +1.029920000000000169e+00 -5.343750000000000000e+01 +1.029924999999999979e+00 -5.337500381469726562e+01 +1.029930000000000012e+00 -5.340625000000000000e+01 +1.029935000000000045e+00 -5.334375000000000000e+01 +1.029940000000000078e+00 -5.337500381469726562e+01 +1.029945000000000110e+00 -5.334375000000000000e+01 +1.029950000000000143e+00 -5.337500381469726562e+01 +1.029955000000000176e+00 -5.340625000000000000e+01 +1.029959999999999987e+00 -5.340625000000000000e+01 +1.029965000000000019e+00 -5.334375000000000000e+01 +1.029970000000000052e+00 -5.340625000000000000e+01 +1.029975000000000085e+00 -5.337500381469726562e+01 +1.029980000000000118e+00 -5.340625000000000000e+01 +1.029985000000000150e+00 -5.331250381469726562e+01 +1.029990000000000183e+00 -5.334375000000000000e+01 +1.029994999999999994e+00 -5.334375000000000000e+01 +1.030000000000000027e+00 -5.334375000000000000e+01 +1.030005000000000059e+00 -5.337500381469726562e+01 +1.030010000000000092e+00 -5.334375000000000000e+01 +1.030015000000000125e+00 -5.334375000000000000e+01 +1.030020000000000158e+00 -5.334375000000000000e+01 +1.030025000000000190e+00 -5.337500381469726562e+01 +1.030030000000000001e+00 -5.328125000000000000e+01 +1.030035000000000034e+00 -5.331250381469726562e+01 +1.030040000000000067e+00 -5.334375000000000000e+01 +1.030045000000000099e+00 -5.334375000000000000e+01 +1.030050000000000132e+00 -5.328125000000000000e+01 +1.030055000000000165e+00 -5.334375000000000000e+01 +1.030059999999999976e+00 -5.331250381469726562e+01 +1.030065000000000008e+00 -5.328125000000000000e+01 +1.030070000000000041e+00 -5.325000000000000000e+01 +1.030075000000000074e+00 -5.321875381469726562e+01 +1.030080000000000107e+00 -5.321875381469726562e+01 +1.030085000000000139e+00 -5.325000000000000000e+01 +1.030090000000000172e+00 -5.318750000000000000e+01 +1.030094999999999983e+00 -5.321875381469726562e+01 +1.030100000000000016e+00 -5.315625381469726562e+01 +1.030105000000000048e+00 -5.321875381469726562e+01 +1.030110000000000081e+00 -5.315625381469726562e+01 +1.030115000000000114e+00 -5.315625381469726562e+01 +1.030120000000000147e+00 -5.315625381469726562e+01 +1.030125000000000179e+00 -5.312500000000000000e+01 +1.030129999999999990e+00 -5.309375000000000000e+01 +1.030135000000000023e+00 -5.312500000000000000e+01 +1.030140000000000056e+00 -5.315625381469726562e+01 +1.030145000000000088e+00 -5.306250381469726562e+01 +1.030150000000000121e+00 -5.315625381469726562e+01 +1.030155000000000154e+00 -5.312500000000000000e+01 +1.030160000000000187e+00 -5.303125000000000000e+01 +1.030164999999999997e+00 -5.309375000000000000e+01 +1.030170000000000030e+00 -5.306250381469726562e+01 +1.030175000000000063e+00 -5.309375000000000000e+01 +1.030180000000000096e+00 -5.306250381469726562e+01 +1.030185000000000128e+00 -5.309375000000000000e+01 +1.030190000000000161e+00 -5.315625381469726562e+01 +1.030195000000000194e+00 -5.303125000000000000e+01 +1.030200000000000005e+00 -5.303125000000000000e+01 +1.030205000000000037e+00 -5.309375000000000000e+01 +1.030210000000000070e+00 -5.309375000000000000e+01 +1.030215000000000103e+00 -5.309375000000000000e+01 +1.030220000000000136e+00 -5.309375000000000000e+01 +1.030225000000000168e+00 -5.306250381469726562e+01 +1.030229999999999979e+00 -5.303125000000000000e+01 +1.030235000000000012e+00 -5.300000000000000000e+01 +1.030240000000000045e+00 -5.303125000000000000e+01 +1.030245000000000077e+00 -5.303125000000000000e+01 +1.030250000000000110e+00 -5.300000000000000000e+01 +1.030255000000000143e+00 -5.300000000000000000e+01 +1.030260000000000176e+00 -5.303125000000000000e+01 +1.030264999999999986e+00 -5.306250381469726562e+01 +1.030270000000000019e+00 -5.303125000000000000e+01 +1.030275000000000052e+00 -5.300000000000000000e+01 +1.030280000000000085e+00 -5.303125000000000000e+01 +1.030285000000000117e+00 -5.300000000000000000e+01 +1.030290000000000150e+00 -5.300000000000000000e+01 +1.030295000000000183e+00 -5.296875000000000000e+01 +1.030299999999999994e+00 -5.293750000000000000e+01 +1.030305000000000026e+00 -5.300000000000000000e+01 +1.030310000000000059e+00 -5.293750000000000000e+01 +1.030315000000000092e+00 -5.296875000000000000e+01 +1.030320000000000125e+00 -5.300000000000000000e+01 +1.030325000000000157e+00 -5.293750000000000000e+01 +1.030330000000000190e+00 -5.293750000000000000e+01 +1.030335000000000001e+00 -5.296875000000000000e+01 +1.030340000000000034e+00 -5.296875000000000000e+01 +1.030345000000000066e+00 -5.296875000000000000e+01 +1.030350000000000099e+00 -5.293750000000000000e+01 +1.030355000000000132e+00 -5.293750000000000000e+01 +1.030360000000000165e+00 -5.293750000000000000e+01 +1.030364999999999975e+00 -5.290625381469726562e+01 +1.030370000000000008e+00 -5.290625381469726562e+01 +1.030375000000000041e+00 -5.293750000000000000e+01 +1.030380000000000074e+00 -5.290625381469726562e+01 +1.030385000000000106e+00 -5.296875000000000000e+01 +1.030390000000000139e+00 -5.287500000000000000e+01 +1.030395000000000172e+00 -5.290625381469726562e+01 +1.030399999999999983e+00 -5.287500000000000000e+01 +1.030405000000000015e+00 -5.287500000000000000e+01 +1.030410000000000048e+00 -5.290625381469726562e+01 +1.030415000000000081e+00 -5.293750000000000000e+01 +1.030420000000000114e+00 -5.293750000000000000e+01 +1.030425000000000146e+00 -5.287500000000000000e+01 +1.030430000000000179e+00 -5.287500000000000000e+01 +1.030434999999999990e+00 -5.290625381469726562e+01 +1.030440000000000023e+00 -5.284375000000000000e+01 +1.030445000000000055e+00 -5.290625381469726562e+01 +1.030450000000000088e+00 -5.287500000000000000e+01 +1.030455000000000121e+00 -5.287500000000000000e+01 +1.030460000000000154e+00 -5.290625381469726562e+01 +1.030465000000000186e+00 -5.287500000000000000e+01 +1.030469999999999997e+00 -5.287500000000000000e+01 +1.030475000000000030e+00 -5.284375000000000000e+01 +1.030480000000000063e+00 -5.281250000000000000e+01 +1.030485000000000095e+00 -5.287500000000000000e+01 +1.030490000000000128e+00 -5.284375000000000000e+01 +1.030495000000000161e+00 -5.284375000000000000e+01 +1.030500000000000194e+00 -5.278125000000000000e+01 +1.030505000000000004e+00 -5.275000381469726562e+01 +1.030510000000000037e+00 -5.278125000000000000e+01 +1.030515000000000070e+00 -5.281250000000000000e+01 +1.030520000000000103e+00 -5.275000381469726562e+01 +1.030525000000000135e+00 -5.278125000000000000e+01 +1.030530000000000168e+00 -5.275000381469726562e+01 +1.030534999999999979e+00 -5.275000381469726562e+01 +1.030540000000000012e+00 -5.271875000000000000e+01 +1.030545000000000044e+00 -5.278125000000000000e+01 +1.030550000000000077e+00 -5.271875000000000000e+01 +1.030555000000000110e+00 -5.268750000000000000e+01 +1.030560000000000143e+00 -5.268750000000000000e+01 +1.030565000000000175e+00 -5.275000381469726562e+01 +1.030569999999999986e+00 -5.275000381469726562e+01 +1.030575000000000019e+00 -5.265625381469726562e+01 +1.030580000000000052e+00 -5.271875000000000000e+01 +1.030585000000000084e+00 -5.275000381469726562e+01 +1.030590000000000117e+00 -5.262500000000000000e+01 +1.030595000000000150e+00 -5.268750000000000000e+01 +1.030600000000000183e+00 -5.265625381469726562e+01 +1.030604999999999993e+00 -5.268750000000000000e+01 +1.030610000000000026e+00 -5.268750000000000000e+01 +1.030615000000000059e+00 -5.268750000000000000e+01 +1.030620000000000092e+00 -5.265625381469726562e+01 +1.030625000000000124e+00 -5.262500000000000000e+01 +1.030630000000000157e+00 -5.268750000000000000e+01 +1.030635000000000190e+00 -5.265625381469726562e+01 +1.030640000000000001e+00 -5.265625381469726562e+01 +1.030645000000000033e+00 -5.262500000000000000e+01 +1.030650000000000066e+00 -5.262500000000000000e+01 +1.030655000000000099e+00 -5.262500000000000000e+01 +1.030660000000000132e+00 -5.256250000000000000e+01 +1.030665000000000164e+00 -5.262500000000000000e+01 +1.030669999999999975e+00 -5.262500000000000000e+01 +1.030675000000000008e+00 -5.259375381469726562e+01 +1.030680000000000041e+00 -5.259375381469726562e+01 +1.030685000000000073e+00 -5.265625381469726562e+01 +1.030690000000000106e+00 -5.259375381469726562e+01 +1.030695000000000139e+00 -5.256250000000000000e+01 +1.030700000000000172e+00 -5.253125000000000000e+01 +1.030704999999999982e+00 -5.259375381469726562e+01 +1.030710000000000015e+00 -5.259375381469726562e+01 +1.030715000000000048e+00 -5.253125000000000000e+01 +1.030720000000000081e+00 -5.256250000000000000e+01 +1.030725000000000113e+00 -5.256250000000000000e+01 +1.030730000000000146e+00 -5.253125000000000000e+01 +1.030735000000000179e+00 -5.253125000000000000e+01 +1.030739999999999990e+00 -5.250000381469726562e+01 +1.030745000000000022e+00 -5.250000381469726562e+01 +1.030750000000000055e+00 -5.256250000000000000e+01 +1.030755000000000088e+00 -5.250000381469726562e+01 +1.030760000000000121e+00 -5.250000381469726562e+01 +1.030765000000000153e+00 -5.253125000000000000e+01 +1.030770000000000186e+00 -5.253125000000000000e+01 +1.030774999999999997e+00 -5.250000381469726562e+01 +1.030780000000000030e+00 -5.246875000000000000e+01 +1.030785000000000062e+00 -5.250000381469726562e+01 +1.030790000000000095e+00 -5.259375381469726562e+01 +1.030795000000000128e+00 -5.250000381469726562e+01 +1.030800000000000161e+00 -5.250000381469726562e+01 +1.030805000000000193e+00 -5.253125000000000000e+01 +1.030810000000000004e+00 -5.250000381469726562e+01 +1.030815000000000037e+00 -5.250000381469726562e+01 +1.030820000000000070e+00 -5.250000381469726562e+01 +1.030825000000000102e+00 -5.250000381469726562e+01 +1.030830000000000135e+00 -5.246875000000000000e+01 +1.030835000000000168e+00 -5.246875000000000000e+01 +1.030839999999999979e+00 -5.243750381469726562e+01 +1.030845000000000011e+00 -5.243750381469726562e+01 +1.030850000000000044e+00 -5.240625000000000000e+01 +1.030855000000000077e+00 -5.246875000000000000e+01 +1.030860000000000110e+00 -5.246875000000000000e+01 +1.030865000000000142e+00 -5.243750381469726562e+01 +1.030870000000000175e+00 -5.237500000000000000e+01 +1.030874999999999986e+00 -5.243750381469726562e+01 +1.030880000000000019e+00 -5.240625000000000000e+01 +1.030885000000000051e+00 -5.240625000000000000e+01 +1.030890000000000084e+00 -5.246875000000000000e+01 +1.030895000000000117e+00 -5.237500000000000000e+01 +1.030900000000000150e+00 -5.234375381469726562e+01 +1.030905000000000182e+00 -5.234375381469726562e+01 +1.030909999999999993e+00 -5.240625000000000000e+01 +1.030915000000000026e+00 -5.234375381469726562e+01 +1.030920000000000059e+00 -5.234375381469726562e+01 +1.030925000000000091e+00 -5.234375381469726562e+01 +1.030930000000000124e+00 -5.237500000000000000e+01 +1.030935000000000157e+00 -5.228125000000000000e+01 +1.030940000000000190e+00 -5.240625000000000000e+01 +1.030945000000000000e+00 -5.237500000000000000e+01 +1.030950000000000033e+00 -5.228125000000000000e+01 +1.030955000000000066e+00 -5.240625000000000000e+01 +1.030960000000000099e+00 -5.234375381469726562e+01 +1.030965000000000131e+00 -5.231250000000000000e+01 +1.030970000000000164e+00 -5.234375381469726562e+01 +1.030974999999999975e+00 -5.234375381469726562e+01 +1.030980000000000008e+00 -5.231250000000000000e+01 +1.030985000000000040e+00 -5.234375381469726562e+01 +1.030990000000000073e+00 -5.234375381469726562e+01 +1.030995000000000106e+00 -5.231250000000000000e+01 +1.031000000000000139e+00 -5.231250000000000000e+01 +1.031005000000000171e+00 -5.225000000000000000e+01 +1.031009999999999982e+00 -5.225000000000000000e+01 +1.031015000000000015e+00 -5.228125000000000000e+01 +1.031020000000000048e+00 -5.228125000000000000e+01 +1.031025000000000080e+00 -5.228125000000000000e+01 +1.031030000000000113e+00 -5.221875000000000000e+01 +1.031035000000000146e+00 -5.221875000000000000e+01 +1.031040000000000179e+00 -5.225000000000000000e+01 +1.031044999999999989e+00 -5.228125000000000000e+01 +1.031050000000000022e+00 -5.228125000000000000e+01 +1.031055000000000055e+00 -5.221875000000000000e+01 +1.031060000000000088e+00 -5.225000000000000000e+01 +1.031065000000000120e+00 -5.225000000000000000e+01 +1.031070000000000153e+00 -5.225000000000000000e+01 +1.031075000000000186e+00 -5.221875000000000000e+01 +1.031079999999999997e+00 -5.221875000000000000e+01 +1.031085000000000029e+00 -5.225000000000000000e+01 +1.031090000000000062e+00 -5.228125000000000000e+01 +1.031095000000000095e+00 -5.218750381469726562e+01 +1.031100000000000128e+00 -5.221875000000000000e+01 +1.031105000000000160e+00 -5.218750381469726562e+01 +1.031110000000000193e+00 -5.212500000000000000e+01 +1.031115000000000004e+00 -5.212500000000000000e+01 +1.031120000000000037e+00 -5.212500000000000000e+01 +1.031125000000000069e+00 -5.218750381469726562e+01 +1.031130000000000102e+00 -5.215625000000000000e+01 +1.031135000000000135e+00 -5.212500000000000000e+01 +1.031140000000000168e+00 -5.215625000000000000e+01 +1.031144999999999978e+00 -5.218750381469726562e+01 +1.031150000000000011e+00 -5.215625000000000000e+01 +1.031155000000000044e+00 -5.215625000000000000e+01 +1.031160000000000077e+00 -5.215625000000000000e+01 +1.031165000000000109e+00 -5.215625000000000000e+01 +1.031170000000000142e+00 -5.218750381469726562e+01 +1.031175000000000175e+00 -5.209375000000000000e+01 +1.031179999999999986e+00 -5.212500000000000000e+01 +1.031185000000000018e+00 -5.206250000000000000e+01 +1.031190000000000051e+00 -5.218750381469726562e+01 +1.031195000000000084e+00 -5.215625000000000000e+01 +1.031200000000000117e+00 -5.209375000000000000e+01 +1.031205000000000149e+00 -5.209375000000000000e+01 +1.031210000000000182e+00 -5.206250000000000000e+01 +1.031214999999999993e+00 -5.206250000000000000e+01 +1.031220000000000026e+00 -5.203125381469726562e+01 +1.031225000000000058e+00 -5.203125381469726562e+01 +1.031230000000000091e+00 -5.209375000000000000e+01 +1.031235000000000124e+00 -5.209375000000000000e+01 +1.031240000000000157e+00 -5.212500000000000000e+01 +1.031245000000000189e+00 -5.203125381469726562e+01 +1.031250000000000000e+00 -5.206250000000000000e+01 +1.031255000000000033e+00 -5.203125381469726562e+01 +1.031260000000000066e+00 -5.209375000000000000e+01 +1.031265000000000098e+00 -5.206250000000000000e+01 +1.031270000000000131e+00 -5.203125381469726562e+01 +1.031275000000000164e+00 -5.206250000000000000e+01 +1.031279999999999974e+00 -5.209375000000000000e+01 +1.031285000000000007e+00 -5.206250000000000000e+01 +1.031290000000000040e+00 -5.203125381469726562e+01 +1.031295000000000073e+00 -5.200000000000000000e+01 +1.031300000000000106e+00 -5.203125381469726562e+01 +1.031305000000000138e+00 -5.206250000000000000e+01 +1.031310000000000171e+00 -5.200000000000000000e+01 +1.031314999999999982e+00 -5.193750000000000000e+01 +1.031320000000000014e+00 -5.203125381469726562e+01 +1.031325000000000047e+00 -5.196875000000000000e+01 +1.031330000000000080e+00 -5.196875000000000000e+01 +1.031335000000000113e+00 -5.200000000000000000e+01 +1.031340000000000146e+00 -5.190625000000000000e+01 +1.031345000000000178e+00 -5.190625000000000000e+01 +1.031349999999999989e+00 -5.196875000000000000e+01 +1.031355000000000022e+00 -5.200000000000000000e+01 +1.031360000000000054e+00 -5.184375000000000000e+01 +1.031365000000000087e+00 -5.203125381469726562e+01 +1.031370000000000120e+00 -5.196875000000000000e+01 +1.031375000000000153e+00 -5.190625000000000000e+01 +1.031380000000000186e+00 -5.196875000000000000e+01 +1.031384999999999996e+00 -5.193750000000000000e+01 +1.031390000000000029e+00 -5.190625000000000000e+01 +1.031395000000000062e+00 -5.190625000000000000e+01 +1.031400000000000095e+00 -5.190625000000000000e+01 +1.031405000000000127e+00 -5.187500381469726562e+01 +1.031410000000000160e+00 -5.187500381469726562e+01 +1.031415000000000193e+00 -5.196875000000000000e+01 +1.031420000000000003e+00 -5.187500381469726562e+01 +1.031425000000000036e+00 -5.190625000000000000e+01 +1.031430000000000069e+00 -5.187500381469726562e+01 +1.031435000000000102e+00 -5.190625000000000000e+01 +1.031440000000000135e+00 -5.187500381469726562e+01 +1.031445000000000167e+00 -5.181250000000000000e+01 +1.031449999999999978e+00 -5.196875000000000000e+01 +1.031455000000000011e+00 -5.193750000000000000e+01 +1.031460000000000043e+00 -5.184375000000000000e+01 +1.031465000000000076e+00 -5.184375000000000000e+01 +1.031470000000000109e+00 -5.178125381469726562e+01 +1.031475000000000142e+00 -5.184375000000000000e+01 +1.031480000000000175e+00 -5.184375000000000000e+01 +1.031484999999999985e+00 -5.175000000000000000e+01 +1.031490000000000018e+00 -5.181250000000000000e+01 +1.031495000000000051e+00 -5.181250000000000000e+01 +1.031500000000000083e+00 -5.181250000000000000e+01 +1.031505000000000116e+00 -5.178125381469726562e+01 +1.031510000000000149e+00 -5.175000000000000000e+01 +1.031515000000000182e+00 -5.178125381469726562e+01 +1.031519999999999992e+00 -5.184375000000000000e+01 +1.031525000000000025e+00 -5.178125381469726562e+01 +1.031530000000000058e+00 -5.171875381469726562e+01 +1.031535000000000091e+00 -5.175000000000000000e+01 +1.031540000000000123e+00 -5.175000000000000000e+01 +1.031545000000000156e+00 -5.175000000000000000e+01 +1.031550000000000189e+00 -5.175000000000000000e+01 +1.031555000000000000e+00 -5.168750000000000000e+01 +1.031560000000000032e+00 -5.165625000000000000e+01 +1.031565000000000065e+00 -5.168750000000000000e+01 +1.031570000000000098e+00 -5.168750000000000000e+01 +1.031575000000000131e+00 -5.168750000000000000e+01 +1.031580000000000163e+00 -5.171875381469726562e+01 +1.031584999999999974e+00 -5.171875381469726562e+01 +1.031590000000000007e+00 -5.165625000000000000e+01 +1.031595000000000040e+00 -5.168750000000000000e+01 +1.031600000000000072e+00 -5.171875381469726562e+01 +1.031605000000000105e+00 -5.168750000000000000e+01 +1.031610000000000138e+00 -5.165625000000000000e+01 +1.031615000000000171e+00 -5.162500381469726562e+01 +1.031619999999999981e+00 -5.165625000000000000e+01 +1.031625000000000014e+00 -5.159375000000000000e+01 +1.031630000000000047e+00 -5.162500381469726562e+01 +1.031635000000000080e+00 -5.165625000000000000e+01 +1.031640000000000112e+00 -5.165625000000000000e+01 +1.031645000000000145e+00 -5.156250381469726562e+01 +1.031650000000000178e+00 -5.156250381469726562e+01 +1.031654999999999989e+00 -5.159375000000000000e+01 +1.031660000000000021e+00 -5.162500381469726562e+01 +1.031665000000000054e+00 -5.162500381469726562e+01 +1.031670000000000087e+00 -5.159375000000000000e+01 +1.031675000000000120e+00 -5.156250381469726562e+01 +1.031680000000000152e+00 -5.159375000000000000e+01 +1.031685000000000185e+00 -5.165625000000000000e+01 +1.031689999999999996e+00 -5.165625000000000000e+01 +1.031695000000000029e+00 -5.156250381469726562e+01 +1.031700000000000061e+00 -5.159375000000000000e+01 +1.031705000000000094e+00 -5.153125000000000000e+01 +1.031710000000000127e+00 -5.162500381469726562e+01 +1.031715000000000160e+00 -5.156250381469726562e+01 +1.031720000000000192e+00 -5.159375000000000000e+01 +1.031725000000000003e+00 -5.159375000000000000e+01 +1.031730000000000036e+00 -5.156250381469726562e+01 +1.031735000000000069e+00 -5.159375000000000000e+01 +1.031740000000000101e+00 -5.156250381469726562e+01 +1.031745000000000134e+00 -5.150000000000000000e+01 +1.031750000000000167e+00 -5.153125000000000000e+01 +1.031754999999999978e+00 -5.150000000000000000e+01 +1.031760000000000010e+00 -5.143750000000000000e+01 +1.031765000000000043e+00 -5.150000000000000000e+01 +1.031770000000000076e+00 -5.150000000000000000e+01 +1.031775000000000109e+00 -5.146875381469726562e+01 +1.031780000000000141e+00 -5.146875381469726562e+01 +1.031785000000000174e+00 -5.153125000000000000e+01 +1.031789999999999985e+00 -5.153125000000000000e+01 +1.031795000000000018e+00 -5.150000000000000000e+01 +1.031800000000000050e+00 -5.150000000000000000e+01 +1.031805000000000083e+00 -5.146875381469726562e+01 +1.031810000000000116e+00 -5.153125000000000000e+01 +1.031815000000000149e+00 -5.143750000000000000e+01 +1.031820000000000181e+00 -5.146875381469726562e+01 +1.031824999999999992e+00 -5.143750000000000000e+01 +1.031830000000000025e+00 -5.146875381469726562e+01 +1.031835000000000058e+00 -5.146875381469726562e+01 +1.031840000000000090e+00 -5.143750000000000000e+01 +1.031845000000000123e+00 -5.146875381469726562e+01 +1.031850000000000156e+00 -5.146875381469726562e+01 +1.031855000000000189e+00 -5.143750000000000000e+01 +1.031859999999999999e+00 -5.140625000000000000e+01 +1.031865000000000032e+00 -5.143750000000000000e+01 +1.031870000000000065e+00 -5.137500000000000000e+01 +1.031875000000000098e+00 -5.140625000000000000e+01 +1.031880000000000130e+00 -5.140625000000000000e+01 +1.031885000000000163e+00 -5.137500000000000000e+01 +1.031889999999999974e+00 -5.128125000000000000e+01 +1.031895000000000007e+00 -5.146875381469726562e+01 +1.031900000000000039e+00 -5.137500000000000000e+01 +1.031905000000000072e+00 -5.140625000000000000e+01 +1.031910000000000105e+00 -5.137500000000000000e+01 +1.031915000000000138e+00 -5.137500000000000000e+01 +1.031920000000000170e+00 -5.137500000000000000e+01 +1.031924999999999981e+00 -5.146875381469726562e+01 +1.031930000000000014e+00 -5.140625000000000000e+01 +1.031935000000000047e+00 -5.134375000000000000e+01 +1.031940000000000079e+00 -5.134375000000000000e+01 +1.031945000000000112e+00 -5.140625000000000000e+01 +1.031950000000000145e+00 -5.134375000000000000e+01 +1.031955000000000178e+00 -5.134375000000000000e+01 +1.031959999999999988e+00 -5.134375000000000000e+01 +1.031965000000000021e+00 -5.134375000000000000e+01 +1.031970000000000054e+00 -5.140625000000000000e+01 +1.031975000000000087e+00 -5.140625000000000000e+01 +1.031980000000000119e+00 -5.134375000000000000e+01 +1.031985000000000152e+00 -5.128125000000000000e+01 +1.031990000000000185e+00 -5.128125000000000000e+01 +1.031994999999999996e+00 -5.128125000000000000e+01 +1.032000000000000028e+00 -5.128125000000000000e+01 +1.032005000000000061e+00 -5.131250381469726562e+01 +1.032010000000000094e+00 -5.128125000000000000e+01 +1.032015000000000127e+00 -5.131250381469726562e+01 +1.032020000000000159e+00 -5.128125000000000000e+01 +1.032025000000000192e+00 -5.128125000000000000e+01 +1.032030000000000003e+00 -5.125000000000000000e+01 +1.032035000000000036e+00 -5.128125000000000000e+01 +1.032040000000000068e+00 -5.128125000000000000e+01 +1.032045000000000101e+00 -5.128125000000000000e+01 +1.032050000000000134e+00 -5.125000000000000000e+01 +1.032055000000000167e+00 -5.125000000000000000e+01 +1.032059999999999977e+00 -5.128125000000000000e+01 +1.032065000000000010e+00 -5.128125000000000000e+01 +1.032070000000000043e+00 -5.128125000000000000e+01 +1.032075000000000076e+00 -5.128125000000000000e+01 +1.032080000000000108e+00 -5.125000000000000000e+01 +1.032085000000000141e+00 -5.125000000000000000e+01 +1.032090000000000174e+00 -5.125000000000000000e+01 +1.032094999999999985e+00 -5.128125000000000000e+01 +1.032100000000000017e+00 -5.121875000000000000e+01 +1.032105000000000050e+00 -5.125000000000000000e+01 +1.032110000000000083e+00 -5.118750000000000000e+01 +1.032115000000000116e+00 -5.118750000000000000e+01 +1.032120000000000148e+00 -5.118750000000000000e+01 +1.032125000000000181e+00 -5.118750000000000000e+01 +1.032129999999999992e+00 -5.115625381469726562e+01 +1.032135000000000025e+00 -5.121875000000000000e+01 +1.032140000000000057e+00 -5.115625381469726562e+01 +1.032145000000000090e+00 -5.118750000000000000e+01 +1.032150000000000123e+00 -5.106250381469726562e+01 +1.032155000000000156e+00 -5.109375000000000000e+01 +1.032160000000000188e+00 -5.112500000000000000e+01 +1.032164999999999999e+00 -5.109375000000000000e+01 +1.032170000000000032e+00 -5.109375000000000000e+01 +1.032175000000000065e+00 -5.109375000000000000e+01 +1.032180000000000097e+00 -5.103125000000000000e+01 +1.032185000000000130e+00 -5.106250381469726562e+01 +1.032190000000000163e+00 -5.112500000000000000e+01 +1.032194999999999974e+00 -5.106250381469726562e+01 +1.032200000000000006e+00 -5.112500000000000000e+01 +1.032205000000000039e+00 -5.109375000000000000e+01 +1.032210000000000072e+00 -5.109375000000000000e+01 +1.032215000000000105e+00 -5.109375000000000000e+01 +1.032220000000000137e+00 -5.106250381469726562e+01 +1.032225000000000170e+00 -5.106250381469726562e+01 +1.032229999999999981e+00 -5.109375000000000000e+01 +1.032235000000000014e+00 -5.106250381469726562e+01 +1.032240000000000046e+00 -5.103125000000000000e+01 +1.032245000000000079e+00 -5.106250381469726562e+01 +1.032250000000000112e+00 -5.103125000000000000e+01 +1.032255000000000145e+00 -5.106250381469726562e+01 +1.032260000000000177e+00 -5.103125000000000000e+01 +1.032264999999999988e+00 -5.103125000000000000e+01 +1.032270000000000021e+00 -5.100000381469726562e+01 +1.032275000000000054e+00 -5.100000381469726562e+01 +1.032280000000000086e+00 -5.103125000000000000e+01 +1.032285000000000119e+00 -5.103125000000000000e+01 +1.032290000000000152e+00 -5.100000381469726562e+01 +1.032295000000000185e+00 -5.096875000000000000e+01 +1.032299999999999995e+00 -5.096875000000000000e+01 +1.032305000000000028e+00 -5.100000381469726562e+01 +1.032310000000000061e+00 -5.096875000000000000e+01 +1.032315000000000094e+00 -5.093750000000000000e+01 +1.032320000000000126e+00 -5.096875000000000000e+01 +1.032325000000000159e+00 -5.096875000000000000e+01 +1.032330000000000192e+00 -5.096875000000000000e+01 +1.032335000000000003e+00 -5.096875000000000000e+01 +1.032340000000000035e+00 -5.090625381469726562e+01 +1.032345000000000068e+00 -5.096875000000000000e+01 +1.032350000000000101e+00 -5.096875000000000000e+01 +1.032355000000000134e+00 -5.100000381469726562e+01 +1.032360000000000166e+00 -5.093750000000000000e+01 +1.032364999999999977e+00 -5.096875000000000000e+01 +1.032370000000000010e+00 -5.093750000000000000e+01 +1.032375000000000043e+00 -5.093750000000000000e+01 +1.032380000000000075e+00 -5.090625381469726562e+01 +1.032385000000000108e+00 -5.090625381469726562e+01 +1.032390000000000141e+00 -5.093750000000000000e+01 +1.032395000000000174e+00 -5.093750000000000000e+01 +1.032399999999999984e+00 -5.096875000000000000e+01 +1.032405000000000017e+00 -5.087500000000000000e+01 +1.032410000000000050e+00 -5.087500000000000000e+01 +1.032415000000000083e+00 -5.084375381469726562e+01 +1.032420000000000115e+00 -5.087500000000000000e+01 +1.032425000000000148e+00 -5.090625381469726562e+01 +1.032430000000000181e+00 -5.084375381469726562e+01 +1.032434999999999992e+00 -5.093750000000000000e+01 +1.032440000000000024e+00 -5.084375381469726562e+01 +1.032445000000000057e+00 -5.093750000000000000e+01 +1.032450000000000090e+00 -5.084375381469726562e+01 +1.032455000000000123e+00 -5.090625381469726562e+01 +1.032460000000000155e+00 -5.093750000000000000e+01 +1.032465000000000188e+00 -5.087500000000000000e+01 +1.032469999999999999e+00 -5.078125000000000000e+01 +1.032475000000000032e+00 -5.084375381469726562e+01 +1.032480000000000064e+00 -5.081250000000000000e+01 +1.032485000000000097e+00 -5.084375381469726562e+01 +1.032490000000000130e+00 -5.078125000000000000e+01 +1.032495000000000163e+00 -5.084375381469726562e+01 +1.032500000000000195e+00 -5.084375381469726562e+01 +1.032505000000000006e+00 -5.084375381469726562e+01 +1.032510000000000039e+00 -5.081250000000000000e+01 +1.032515000000000072e+00 -5.081250000000000000e+01 +1.032520000000000104e+00 -5.075000381469726562e+01 +1.032525000000000137e+00 -5.081250000000000000e+01 +1.032530000000000170e+00 -5.081250000000000000e+01 +1.032534999999999981e+00 -5.075000381469726562e+01 +1.032540000000000013e+00 -5.078125000000000000e+01 +1.032545000000000046e+00 -5.075000381469726562e+01 +1.032550000000000079e+00 -5.075000381469726562e+01 +1.032555000000000112e+00 -5.078125000000000000e+01 +1.032560000000000144e+00 -5.071875000000000000e+01 +1.032565000000000177e+00 -5.075000381469726562e+01 +1.032569999999999988e+00 -5.071875000000000000e+01 +1.032575000000000021e+00 -5.071875000000000000e+01 +1.032580000000000053e+00 -5.078125000000000000e+01 +1.032585000000000086e+00 -5.071875000000000000e+01 +1.032590000000000119e+00 -5.078125000000000000e+01 +1.032595000000000152e+00 -5.071875000000000000e+01 +1.032600000000000184e+00 -5.071875000000000000e+01 +1.032604999999999995e+00 -5.068750000000000000e+01 +1.032610000000000028e+00 -5.068750000000000000e+01 +1.032615000000000061e+00 -5.068750000000000000e+01 +1.032620000000000093e+00 -5.068750000000000000e+01 +1.032625000000000126e+00 -5.078125000000000000e+01 +1.032630000000000159e+00 -5.065625000000000000e+01 +1.032635000000000192e+00 -5.068750000000000000e+01 +1.032640000000000002e+00 -5.062500000000000000e+01 +1.032645000000000035e+00 -5.065625000000000000e+01 +1.032650000000000068e+00 -5.065625000000000000e+01 +1.032655000000000101e+00 -5.065625000000000000e+01 +1.032660000000000133e+00 -5.059375381469726562e+01 +1.032665000000000166e+00 -5.065625000000000000e+01 +1.032669999999999977e+00 -5.068750000000000000e+01 +1.032675000000000010e+00 -5.059375381469726562e+01 +1.032680000000000042e+00 -5.065625000000000000e+01 +1.032685000000000075e+00 -5.062500000000000000e+01 +1.032690000000000108e+00 -5.059375381469726562e+01 +1.032695000000000141e+00 -5.059375381469726562e+01 +1.032700000000000173e+00 -5.065625000000000000e+01 +1.032704999999999984e+00 -5.062500000000000000e+01 +1.032710000000000017e+00 -5.065625000000000000e+01 +1.032715000000000050e+00 -5.065625000000000000e+01 +1.032720000000000082e+00 -5.056250000000000000e+01 +1.032725000000000115e+00 -5.065625000000000000e+01 +1.032730000000000148e+00 -5.059375381469726562e+01 +1.032735000000000181e+00 -5.062500000000000000e+01 +1.032739999999999991e+00 -5.059375381469726562e+01 +1.032745000000000024e+00 -5.059375381469726562e+01 +1.032750000000000057e+00 -5.065625000000000000e+01 +1.032755000000000090e+00 -5.053125000000000000e+01 +1.032760000000000122e+00 -5.056250000000000000e+01 +1.032765000000000155e+00 -5.053125000000000000e+01 +1.032770000000000188e+00 -5.059375381469726562e+01 +1.032774999999999999e+00 -5.062500000000000000e+01 +1.032780000000000031e+00 -5.059375381469726562e+01 +1.032785000000000064e+00 -5.056250000000000000e+01 +1.032790000000000097e+00 -5.056250000000000000e+01 +1.032795000000000130e+00 -5.053125000000000000e+01 +1.032800000000000162e+00 -5.053125000000000000e+01 +1.032805000000000195e+00 -5.053125000000000000e+01 +1.032810000000000006e+00 -5.050000000000000000e+01 +1.032815000000000039e+00 -5.046875000000000000e+01 +1.032820000000000071e+00 -5.056250000000000000e+01 +1.032825000000000104e+00 -5.046875000000000000e+01 +1.032830000000000137e+00 -5.046875000000000000e+01 +1.032835000000000170e+00 -5.040625000000000000e+01 +1.032839999999999980e+00 -5.053125000000000000e+01 +1.032845000000000013e+00 -5.046875000000000000e+01 +1.032850000000000046e+00 -5.046875000000000000e+01 +1.032855000000000079e+00 -5.046875000000000000e+01 +1.032860000000000111e+00 -5.050000000000000000e+01 +1.032865000000000144e+00 -5.043750381469726562e+01 +1.032870000000000177e+00 -5.046875000000000000e+01 +1.032874999999999988e+00 -5.043750381469726562e+01 +1.032880000000000020e+00 -5.040625000000000000e+01 +1.032885000000000053e+00 -5.050000000000000000e+01 +1.032890000000000086e+00 -5.046875000000000000e+01 +1.032895000000000119e+00 -5.050000000000000000e+01 +1.032900000000000151e+00 -5.040625000000000000e+01 +1.032905000000000184e+00 -5.040625000000000000e+01 +1.032909999999999995e+00 -5.046875000000000000e+01 +1.032915000000000028e+00 -5.043750381469726562e+01 +1.032920000000000060e+00 -5.043750381469726562e+01 +1.032925000000000093e+00 -5.037500000000000000e+01 +1.032930000000000126e+00 -5.034375000000000000e+01 +1.032935000000000159e+00 -5.040625000000000000e+01 +1.032940000000000191e+00 -5.043750381469726562e+01 +1.032945000000000002e+00 -5.043750381469726562e+01 +1.032950000000000035e+00 -5.034375000000000000e+01 +1.032955000000000068e+00 -5.043750381469726562e+01 +1.032960000000000100e+00 -5.037500000000000000e+01 +1.032965000000000133e+00 -5.037500000000000000e+01 +1.032970000000000166e+00 -5.040625000000000000e+01 +1.032974999999999977e+00 -5.037500000000000000e+01 +1.032980000000000009e+00 -5.043750381469726562e+01 +1.032985000000000042e+00 -5.037500000000000000e+01 +1.032990000000000075e+00 -5.034375000000000000e+01 +1.032995000000000108e+00 -5.034375000000000000e+01 +1.033000000000000140e+00 -5.040625000000000000e+01 +1.033005000000000173e+00 -5.043750381469726562e+01 +1.033009999999999984e+00 -5.034375000000000000e+01 +1.033015000000000017e+00 -5.043750381469726562e+01 +1.033020000000000049e+00 -5.034375000000000000e+01 +1.033025000000000082e+00 -5.040625000000000000e+01 +1.033030000000000115e+00 -5.040625000000000000e+01 +1.033035000000000148e+00 -5.040625000000000000e+01 +1.033040000000000180e+00 -5.037500000000000000e+01 +1.033044999999999991e+00 -5.037500000000000000e+01 +1.033050000000000024e+00 -5.040625000000000000e+01 +1.033055000000000057e+00 -5.037500000000000000e+01 +1.033060000000000089e+00 -5.040625000000000000e+01 +1.033065000000000122e+00 -5.037500000000000000e+01 +1.033070000000000155e+00 -5.031250000000000000e+01 +1.033075000000000188e+00 -5.037500000000000000e+01 +1.033079999999999998e+00 -5.034375000000000000e+01 +1.033085000000000031e+00 -5.034375000000000000e+01 +1.033090000000000064e+00 -5.031250000000000000e+01 +1.033095000000000097e+00 -5.028125381469726562e+01 +1.033100000000000129e+00 -5.031250000000000000e+01 +1.033105000000000162e+00 -5.040625000000000000e+01 +1.033110000000000195e+00 -5.031250000000000000e+01 +1.033115000000000006e+00 -5.025000000000000000e+01 +1.033120000000000038e+00 -5.034375000000000000e+01 +1.033125000000000071e+00 -5.031250000000000000e+01 +1.033130000000000104e+00 -5.025000000000000000e+01 +1.033135000000000137e+00 -5.034375000000000000e+01 +1.033140000000000169e+00 -5.028125381469726562e+01 +1.033144999999999980e+00 -5.025000000000000000e+01 +1.033150000000000013e+00 -5.028125381469726562e+01 +1.033155000000000046e+00 -5.025000000000000000e+01 +1.033160000000000078e+00 -5.021875000000000000e+01 +1.033165000000000111e+00 -5.028125381469726562e+01 +1.033170000000000144e+00 -5.025000000000000000e+01 +1.033175000000000177e+00 -5.025000000000000000e+01 +1.033179999999999987e+00 -5.021875000000000000e+01 +1.033185000000000020e+00 -5.015625000000000000e+01 +1.033190000000000053e+00 -5.025000000000000000e+01 +1.033195000000000086e+00 -5.021875000000000000e+01 +1.033200000000000118e+00 -5.031250000000000000e+01 +1.033205000000000151e+00 -5.025000000000000000e+01 +1.033210000000000184e+00 -5.025000000000000000e+01 +1.033214999999999995e+00 -5.025000000000000000e+01 +1.033220000000000027e+00 -5.028125381469726562e+01 +1.033225000000000060e+00 -5.025000000000000000e+01 +1.033230000000000093e+00 -5.018750381469726562e+01 +1.033235000000000126e+00 -5.018750381469726562e+01 +1.033240000000000158e+00 -5.021875000000000000e+01 +1.033245000000000191e+00 -5.025000000000000000e+01 +1.033250000000000002e+00 -5.012500381469726562e+01 +1.033255000000000035e+00 -5.021875000000000000e+01 +1.033260000000000067e+00 -5.018750381469726562e+01 +1.033265000000000100e+00 -5.015625000000000000e+01 +1.033270000000000133e+00 -5.015625000000000000e+01 +1.033275000000000166e+00 -5.015625000000000000e+01 +1.033279999999999976e+00 -5.018750381469726562e+01 +1.033285000000000009e+00 -5.015625000000000000e+01 +1.033290000000000042e+00 -5.015625000000000000e+01 +1.033295000000000075e+00 -5.012500381469726562e+01 +1.033300000000000107e+00 -5.018750381469726562e+01 +1.033305000000000140e+00 -5.012500381469726562e+01 +1.033310000000000173e+00 -5.015625000000000000e+01 +1.033314999999999984e+00 -5.009375000000000000e+01 +1.033320000000000016e+00 -5.012500381469726562e+01 +1.033325000000000049e+00 -5.012500381469726562e+01 +1.033330000000000082e+00 -5.009375000000000000e+01 +1.033335000000000115e+00 -5.015625000000000000e+01 +1.033340000000000147e+00 -5.009375000000000000e+01 +1.033345000000000180e+00 -5.012500381469726562e+01 +1.033349999999999991e+00 -5.009375000000000000e+01 +1.033355000000000024e+00 -5.009375000000000000e+01 +1.033360000000000056e+00 -5.003125381469726562e+01 +1.033365000000000089e+00 -5.009375000000000000e+01 +1.033370000000000122e+00 -5.000000000000000000e+01 +1.033375000000000155e+00 -5.009375000000000000e+01 +1.033380000000000187e+00 -5.006250000000000000e+01 +1.033384999999999998e+00 -5.006250000000000000e+01 +1.033390000000000031e+00 -5.003125381469726562e+01 +1.033395000000000064e+00 -4.996875000000000000e+01 +1.033400000000000096e+00 -5.003125381469726562e+01 +1.033405000000000129e+00 -5.000000000000000000e+01 +1.033410000000000162e+00 -5.000000000000000000e+01 +1.033415000000000195e+00 -5.000000000000000000e+01 +1.033420000000000005e+00 -5.003125381469726562e+01 +1.033425000000000038e+00 -5.000000000000000000e+01 +1.033430000000000071e+00 -5.003125381469726562e+01 +1.033435000000000104e+00 -5.003125381469726562e+01 +1.033440000000000136e+00 -5.006250000000000000e+01 +1.033445000000000169e+00 -4.996875000000000000e+01 +1.033449999999999980e+00 -4.996875000000000000e+01 +1.033455000000000013e+00 -5.003125381469726562e+01 +1.033460000000000045e+00 -4.996875000000000000e+01 +1.033465000000000078e+00 -4.996875000000000000e+01 +1.033470000000000111e+00 -4.996875000000000000e+01 +1.033475000000000144e+00 -4.996875000000000000e+01 +1.033480000000000176e+00 -4.993750000000000000e+01 +1.033484999999999987e+00 -4.993750000000000000e+01 +1.033490000000000020e+00 -4.993750000000000000e+01 +1.033495000000000053e+00 -4.993750000000000000e+01 +1.033500000000000085e+00 -5.003125381469726562e+01 +1.033505000000000118e+00 -4.993750000000000000e+01 +1.033510000000000151e+00 -4.993750000000000000e+01 +1.033515000000000184e+00 -4.993750000000000000e+01 +1.033519999999999994e+00 -4.996875000000000000e+01 +1.033525000000000027e+00 -4.996875000000000000e+01 +1.033530000000000060e+00 -4.990625000000000000e+01 +1.033535000000000093e+00 -4.990625000000000000e+01 +1.033540000000000125e+00 -4.987500381469726562e+01 +1.033545000000000158e+00 -4.993750000000000000e+01 +1.033550000000000191e+00 -4.981250000000000000e+01 +1.033555000000000001e+00 -4.987500381469726562e+01 +1.033560000000000034e+00 -4.984375000000000000e+01 +1.033565000000000067e+00 -4.990625000000000000e+01 +1.033570000000000100e+00 -4.987500381469726562e+01 +1.033575000000000133e+00 -4.987500381469726562e+01 +1.033580000000000165e+00 -4.981250000000000000e+01 +1.033584999999999976e+00 -4.981250000000000000e+01 +1.033590000000000009e+00 -4.984375000000000000e+01 +1.033595000000000041e+00 -4.984375000000000000e+01 +1.033600000000000074e+00 -4.975000000000000000e+01 +1.033605000000000107e+00 -4.984375000000000000e+01 +1.033610000000000140e+00 -4.984375000000000000e+01 +1.033615000000000173e+00 -4.984375000000000000e+01 +1.033619999999999983e+00 -4.978125000000000000e+01 +1.033625000000000016e+00 -4.978125000000000000e+01 +1.033630000000000049e+00 -4.975000000000000000e+01 +1.033635000000000081e+00 -4.978125000000000000e+01 +1.033640000000000114e+00 -4.975000000000000000e+01 +1.033645000000000147e+00 -4.981250000000000000e+01 +1.033650000000000180e+00 -4.971875381469726562e+01 +1.033654999999999990e+00 -4.978125000000000000e+01 +1.033660000000000023e+00 -4.981250000000000000e+01 +1.033665000000000056e+00 -4.978125000000000000e+01 +1.033670000000000089e+00 -4.981250000000000000e+01 +1.033675000000000122e+00 -4.971875381469726562e+01 +1.033680000000000154e+00 -4.978125000000000000e+01 +1.033685000000000187e+00 -4.975000000000000000e+01 +1.033689999999999998e+00 -4.971875381469726562e+01 +1.033695000000000030e+00 -4.968750000000000000e+01 +1.033700000000000063e+00 -4.984375000000000000e+01 +1.033705000000000096e+00 -4.971875381469726562e+01 +1.033710000000000129e+00 -4.971875381469726562e+01 +1.033715000000000162e+00 -4.968750000000000000e+01 +1.033720000000000194e+00 -4.968750000000000000e+01 +1.033725000000000005e+00 -4.968750000000000000e+01 +1.033730000000000038e+00 -4.968750000000000000e+01 +1.033735000000000070e+00 -4.968750000000000000e+01 +1.033740000000000103e+00 -4.968750000000000000e+01 +1.033745000000000136e+00 -4.968750000000000000e+01 +1.033750000000000169e+00 -4.965625000000000000e+01 +1.033754999999999979e+00 -4.959375000000000000e+01 +1.033760000000000012e+00 -4.962500000000000000e+01 +1.033765000000000045e+00 -4.959375000000000000e+01 +1.033770000000000078e+00 -4.959375000000000000e+01 +1.033775000000000110e+00 -4.956250381469726562e+01 +1.033780000000000143e+00 -4.962500000000000000e+01 +1.033785000000000176e+00 -4.959375000000000000e+01 +1.033789999999999987e+00 -4.962500000000000000e+01 +1.033795000000000019e+00 -4.962500000000000000e+01 +1.033800000000000052e+00 -4.959375000000000000e+01 +1.033805000000000085e+00 -4.962500000000000000e+01 +1.033810000000000118e+00 -4.959375000000000000e+01 +1.033815000000000150e+00 -4.965625000000000000e+01 +1.033820000000000183e+00 -4.953125000000000000e+01 +1.033824999999999994e+00 -4.965625000000000000e+01 +1.033830000000000027e+00 -4.959375000000000000e+01 +1.033835000000000059e+00 -4.959375000000000000e+01 +1.033840000000000092e+00 -4.956250381469726562e+01 +1.033845000000000125e+00 -4.956250381469726562e+01 +1.033850000000000158e+00 -4.962500000000000000e+01 +1.033855000000000190e+00 -4.962500000000000000e+01 +1.033860000000000001e+00 -4.953125000000000000e+01 +1.033865000000000034e+00 -4.956250381469726562e+01 +1.033870000000000067e+00 -4.953125000000000000e+01 +1.033875000000000099e+00 -4.953125000000000000e+01 +1.033880000000000132e+00 -4.950000000000000000e+01 +1.033885000000000165e+00 -4.950000000000000000e+01 +1.033889999999999976e+00 -4.950000000000000000e+01 +1.033895000000000008e+00 -4.956250381469726562e+01 +1.033900000000000041e+00 -4.950000000000000000e+01 +1.033905000000000074e+00 -4.953125000000000000e+01 +1.033910000000000107e+00 -4.950000000000000000e+01 +1.033915000000000139e+00 -4.950000000000000000e+01 +1.033920000000000172e+00 -4.950000000000000000e+01 +1.033924999999999983e+00 -4.953125000000000000e+01 +1.033930000000000016e+00 -4.956250381469726562e+01 +1.033935000000000048e+00 -4.953125000000000000e+01 +1.033940000000000081e+00 -4.959375000000000000e+01 +1.033945000000000114e+00 -4.956250381469726562e+01 +1.033950000000000147e+00 -4.950000000000000000e+01 +1.033955000000000179e+00 -4.950000000000000000e+01 +1.033959999999999990e+00 -4.956250381469726562e+01 +1.033965000000000023e+00 -4.953125000000000000e+01 +1.033970000000000056e+00 -4.953125000000000000e+01 +1.033975000000000088e+00 -4.953125000000000000e+01 +1.033980000000000121e+00 -4.946875381469726562e+01 +1.033985000000000154e+00 -4.946875381469726562e+01 +1.033990000000000187e+00 -4.946875381469726562e+01 +1.033994999999999997e+00 -4.943750000000000000e+01 +1.034000000000000030e+00 -4.950000000000000000e+01 +1.034005000000000063e+00 -4.950000000000000000e+01 +1.034010000000000096e+00 -4.943750000000000000e+01 +1.034015000000000128e+00 -4.940625381469726562e+01 +1.034020000000000161e+00 -4.943750000000000000e+01 +1.034025000000000194e+00 -4.940625381469726562e+01 +1.034030000000000005e+00 -4.946875381469726562e+01 +1.034035000000000037e+00 -4.946875381469726562e+01 +1.034040000000000070e+00 -4.940625381469726562e+01 +1.034045000000000103e+00 -4.943750000000000000e+01 +1.034050000000000136e+00 -4.937500000000000000e+01 +1.034055000000000168e+00 -4.943750000000000000e+01 +1.034059999999999979e+00 -4.946875381469726562e+01 +1.034065000000000012e+00 -4.934375000000000000e+01 +1.034070000000000045e+00 -4.940625381469726562e+01 +1.034075000000000077e+00 -4.943750000000000000e+01 +1.034080000000000110e+00 -4.937500000000000000e+01 +1.034085000000000143e+00 -4.940625381469726562e+01 +1.034090000000000176e+00 -4.940625381469726562e+01 +1.034094999999999986e+00 -4.940625381469726562e+01 +1.034100000000000019e+00 -4.940625381469726562e+01 +1.034105000000000052e+00 -4.934375000000000000e+01 +1.034110000000000085e+00 -4.934375000000000000e+01 +1.034115000000000117e+00 -4.940625381469726562e+01 +1.034120000000000150e+00 -4.940625381469726562e+01 +1.034125000000000183e+00 -4.937500000000000000e+01 +1.034129999999999994e+00 -4.937500000000000000e+01 +1.034135000000000026e+00 -4.931250381469726562e+01 +1.034140000000000059e+00 -4.934375000000000000e+01 +1.034145000000000092e+00 -4.934375000000000000e+01 +1.034150000000000125e+00 -4.934375000000000000e+01 +1.034155000000000157e+00 -4.937500000000000000e+01 +1.034160000000000190e+00 -4.934375000000000000e+01 +1.034165000000000001e+00 -4.934375000000000000e+01 +1.034170000000000034e+00 -4.934375000000000000e+01 +1.034175000000000066e+00 -4.931250381469726562e+01 +1.034180000000000099e+00 -4.934375000000000000e+01 +1.034185000000000132e+00 -4.934375000000000000e+01 +1.034190000000000165e+00 -4.934375000000000000e+01 +1.034194999999999975e+00 -4.928125000000000000e+01 +1.034200000000000008e+00 -4.931250381469726562e+01 +1.034205000000000041e+00 -4.928125000000000000e+01 +1.034210000000000074e+00 -4.931250381469726562e+01 +1.034215000000000106e+00 -4.931250381469726562e+01 +1.034220000000000139e+00 -4.928125000000000000e+01 +1.034225000000000172e+00 -4.934375000000000000e+01 +1.034229999999999983e+00 -4.934375000000000000e+01 +1.034235000000000015e+00 -4.928125000000000000e+01 +1.034240000000000048e+00 -4.925000381469726562e+01 +1.034245000000000081e+00 -4.925000381469726562e+01 +1.034250000000000114e+00 -4.928125000000000000e+01 +1.034255000000000146e+00 -4.925000381469726562e+01 +1.034260000000000179e+00 -4.918750000000000000e+01 +1.034264999999999990e+00 -4.918750000000000000e+01 +1.034270000000000023e+00 -4.918750000000000000e+01 +1.034275000000000055e+00 -4.921875000000000000e+01 +1.034280000000000088e+00 -4.918750000000000000e+01 +1.034285000000000121e+00 -4.925000381469726562e+01 +1.034290000000000154e+00 -4.928125000000000000e+01 +1.034295000000000186e+00 -4.928125000000000000e+01 +1.034299999999999997e+00 -4.925000381469726562e+01 +1.034305000000000030e+00 -4.921875000000000000e+01 +1.034310000000000063e+00 -4.921875000000000000e+01 +1.034315000000000095e+00 -4.918750000000000000e+01 +1.034320000000000128e+00 -4.918750000000000000e+01 +1.034325000000000161e+00 -4.918750000000000000e+01 +1.034330000000000194e+00 -4.921875000000000000e+01 +1.034335000000000004e+00 -4.918750000000000000e+01 +1.034340000000000037e+00 -4.921875000000000000e+01 +1.034345000000000070e+00 -4.921875000000000000e+01 +1.034350000000000103e+00 -4.928125000000000000e+01 +1.034355000000000135e+00 -4.918750000000000000e+01 +1.034360000000000168e+00 -4.921875000000000000e+01 +1.034364999999999979e+00 -4.925000381469726562e+01 +1.034370000000000012e+00 -4.921875000000000000e+01 +1.034375000000000044e+00 -4.918750000000000000e+01 +1.034380000000000077e+00 -4.915625381469726562e+01 +1.034385000000000110e+00 -4.921875000000000000e+01 +1.034390000000000143e+00 -4.921875000000000000e+01 +1.034395000000000175e+00 -4.912500000000000000e+01 +1.034399999999999986e+00 -4.918750000000000000e+01 +1.034405000000000019e+00 -4.918750000000000000e+01 +1.034410000000000052e+00 -4.915625381469726562e+01 +1.034415000000000084e+00 -4.912500000000000000e+01 +1.034420000000000117e+00 -4.912500000000000000e+01 +1.034425000000000150e+00 -4.915625381469726562e+01 +1.034430000000000183e+00 -4.909375000000000000e+01 +1.034434999999999993e+00 -4.915625381469726562e+01 +1.034440000000000026e+00 -4.912500000000000000e+01 +1.034445000000000059e+00 -4.915625381469726562e+01 +1.034450000000000092e+00 -4.915625381469726562e+01 +1.034455000000000124e+00 -4.900000381469726562e+01 +1.034460000000000157e+00 -4.915625381469726562e+01 +1.034465000000000190e+00 -4.912500000000000000e+01 +1.034470000000000001e+00 -4.906250000000000000e+01 +1.034475000000000033e+00 -4.906250000000000000e+01 +1.034480000000000066e+00 -4.909375000000000000e+01 +1.034485000000000099e+00 -4.903125000000000000e+01 +1.034490000000000132e+00 -4.906250000000000000e+01 +1.034495000000000164e+00 -4.903125000000000000e+01 +1.034499999999999975e+00 -4.906250000000000000e+01 +1.034505000000000008e+00 -4.903125000000000000e+01 +1.034510000000000041e+00 -4.903125000000000000e+01 +1.034515000000000073e+00 -4.903125000000000000e+01 +1.034520000000000106e+00 -4.900000381469726562e+01 +1.034525000000000139e+00 -4.903125000000000000e+01 +1.034530000000000172e+00 -4.906250000000000000e+01 +1.034534999999999982e+00 -4.903125000000000000e+01 +1.034540000000000015e+00 -4.900000381469726562e+01 +1.034545000000000048e+00 -4.900000381469726562e+01 +1.034550000000000081e+00 -4.900000381469726562e+01 +1.034555000000000113e+00 -4.896875000000000000e+01 +1.034560000000000146e+00 -4.896875000000000000e+01 +1.034565000000000179e+00 -4.900000381469726562e+01 +1.034569999999999990e+00 -4.896875000000000000e+01 +1.034575000000000022e+00 -4.896875000000000000e+01 +1.034580000000000055e+00 -4.896875000000000000e+01 +1.034585000000000088e+00 -4.893750000000000000e+01 +1.034590000000000121e+00 -4.893750000000000000e+01 +1.034595000000000153e+00 -4.890625000000000000e+01 +1.034600000000000186e+00 -4.887500000000000000e+01 +1.034604999999999997e+00 -4.887500000000000000e+01 +1.034610000000000030e+00 -4.890625000000000000e+01 +1.034615000000000062e+00 -4.890625000000000000e+01 +1.034620000000000095e+00 -4.893750000000000000e+01 +1.034625000000000128e+00 -4.884375381469726562e+01 +1.034630000000000161e+00 -4.893750000000000000e+01 +1.034635000000000193e+00 -4.896875000000000000e+01 +1.034640000000000004e+00 -4.887500000000000000e+01 +1.034645000000000037e+00 -4.890625000000000000e+01 +1.034650000000000070e+00 -4.890625000000000000e+01 +1.034655000000000102e+00 -4.887500000000000000e+01 +1.034660000000000135e+00 -4.884375381469726562e+01 +1.034665000000000168e+00 -4.884375381469726562e+01 +1.034669999999999979e+00 -4.881250000000000000e+01 +1.034675000000000011e+00 -4.881250000000000000e+01 +1.034680000000000044e+00 -4.887500000000000000e+01 +1.034685000000000077e+00 -4.887500000000000000e+01 +1.034690000000000110e+00 -4.881250000000000000e+01 +1.034695000000000142e+00 -4.881250000000000000e+01 +1.034700000000000175e+00 -4.884375381469726562e+01 +1.034704999999999986e+00 -4.884375381469726562e+01 +1.034710000000000019e+00 -4.881250000000000000e+01 +1.034715000000000051e+00 -4.878125000000000000e+01 +1.034720000000000084e+00 -4.875000381469726562e+01 +1.034725000000000117e+00 -4.878125000000000000e+01 +1.034730000000000150e+00 -4.878125000000000000e+01 +1.034735000000000182e+00 -4.878125000000000000e+01 +1.034739999999999993e+00 -4.881250000000000000e+01 +1.034745000000000026e+00 -4.871875000000000000e+01 +1.034750000000000059e+00 -4.875000381469726562e+01 +1.034755000000000091e+00 -4.875000381469726562e+01 +1.034760000000000124e+00 -4.878125000000000000e+01 +1.034765000000000157e+00 -4.875000381469726562e+01 +1.034770000000000190e+00 -4.875000381469726562e+01 +1.034775000000000000e+00 -4.878125000000000000e+01 +1.034780000000000033e+00 -4.878125000000000000e+01 +1.034785000000000066e+00 -4.875000381469726562e+01 +1.034790000000000099e+00 -4.875000381469726562e+01 +1.034795000000000131e+00 -4.875000381469726562e+01 +1.034800000000000164e+00 -4.871875000000000000e+01 +1.034804999999999975e+00 -4.871875000000000000e+01 +1.034810000000000008e+00 -4.878125000000000000e+01 +1.034815000000000040e+00 -4.871875000000000000e+01 +1.034820000000000073e+00 -4.871875000000000000e+01 +1.034825000000000106e+00 -4.875000381469726562e+01 +1.034830000000000139e+00 -4.881250000000000000e+01 +1.034835000000000171e+00 -4.875000381469726562e+01 +1.034839999999999982e+00 -4.868750381469726562e+01 +1.034845000000000015e+00 -4.875000381469726562e+01 +1.034850000000000048e+00 -4.871875000000000000e+01 +1.034855000000000080e+00 -4.868750381469726562e+01 +1.034860000000000113e+00 -4.868750381469726562e+01 +1.034865000000000146e+00 -4.868750381469726562e+01 +1.034870000000000179e+00 -4.862500000000000000e+01 +1.034874999999999989e+00 -4.865625000000000000e+01 +1.034880000000000022e+00 -4.868750381469726562e+01 +1.034885000000000055e+00 -4.865625000000000000e+01 +1.034890000000000088e+00 -4.862500000000000000e+01 +1.034895000000000120e+00 -4.865625000000000000e+01 +1.034900000000000153e+00 -4.865625000000000000e+01 +1.034905000000000186e+00 -4.856250000000000000e+01 +1.034909999999999997e+00 -4.859375381469726562e+01 +1.034915000000000029e+00 -4.853125381469726562e+01 +1.034920000000000062e+00 -4.856250000000000000e+01 +1.034925000000000095e+00 -4.856250000000000000e+01 +1.034930000000000128e+00 -4.856250000000000000e+01 +1.034935000000000160e+00 -4.856250000000000000e+01 +1.034940000000000193e+00 -4.856250000000000000e+01 +1.034945000000000004e+00 -4.856250000000000000e+01 +1.034950000000000037e+00 -4.856250000000000000e+01 +1.034955000000000069e+00 -4.859375381469726562e+01 +1.034960000000000102e+00 -4.856250000000000000e+01 +1.034965000000000135e+00 -4.859375381469726562e+01 +1.034970000000000168e+00 -4.856250000000000000e+01 +1.034974999999999978e+00 -4.856250000000000000e+01 +1.034980000000000011e+00 -4.856250000000000000e+01 +1.034985000000000044e+00 -4.862500000000000000e+01 +1.034990000000000077e+00 -4.856250000000000000e+01 +1.034995000000000109e+00 -4.853125381469726562e+01 +1.035000000000000142e+00 -4.856250000000000000e+01 +1.035005000000000175e+00 -4.859375381469726562e+01 +1.035009999999999986e+00 -4.859375381469726562e+01 +1.035015000000000018e+00 -4.856250000000000000e+01 +1.035020000000000051e+00 -4.859375381469726562e+01 +1.035025000000000084e+00 -4.856250000000000000e+01 +1.035030000000000117e+00 -4.859375381469726562e+01 +1.035035000000000149e+00 -4.859375381469726562e+01 +1.035040000000000182e+00 -4.856250000000000000e+01 +1.035044999999999993e+00 -4.853125381469726562e+01 +1.035050000000000026e+00 -4.856250000000000000e+01 +1.035055000000000058e+00 -4.853125381469726562e+01 +1.035060000000000091e+00 -4.853125381469726562e+01 +1.035065000000000124e+00 -4.850000000000000000e+01 +1.035070000000000157e+00 -4.850000000000000000e+01 +1.035075000000000189e+00 -4.853125381469726562e+01 +1.035080000000000000e+00 -4.853125381469726562e+01 +1.035085000000000033e+00 -4.850000000000000000e+01 +1.035090000000000066e+00 -4.850000000000000000e+01 +1.035095000000000098e+00 -4.853125381469726562e+01 +1.035100000000000131e+00 -4.850000000000000000e+01 +1.035105000000000164e+00 -4.846875000000000000e+01 +1.035109999999999975e+00 -4.846875000000000000e+01 +1.035115000000000007e+00 -4.850000000000000000e+01 +1.035120000000000040e+00 -4.843750381469726562e+01 +1.035125000000000073e+00 -4.846875000000000000e+01 +1.035130000000000106e+00 -4.850000000000000000e+01 +1.035135000000000138e+00 -4.843750381469726562e+01 +1.035140000000000171e+00 -4.840625000000000000e+01 +1.035144999999999982e+00 -4.843750381469726562e+01 +1.035150000000000015e+00 -4.846875000000000000e+01 +1.035155000000000047e+00 -4.846875000000000000e+01 +1.035160000000000080e+00 -4.840625000000000000e+01 +1.035165000000000113e+00 -4.846875000000000000e+01 +1.035170000000000146e+00 -4.846875000000000000e+01 +1.035175000000000178e+00 -4.840625000000000000e+01 +1.035179999999999989e+00 -4.843750381469726562e+01 +1.035185000000000022e+00 -4.840625000000000000e+01 +1.035190000000000055e+00 -4.840625000000000000e+01 +1.035195000000000087e+00 -4.840625000000000000e+01 +1.035200000000000120e+00 -4.837500000000000000e+01 +1.035205000000000153e+00 -4.834375000000000000e+01 +1.035210000000000186e+00 -4.837500000000000000e+01 +1.035214999999999996e+00 -4.834375000000000000e+01 +1.035220000000000029e+00 -4.840625000000000000e+01 +1.035225000000000062e+00 -4.843750381469726562e+01 +1.035230000000000095e+00 -4.834375000000000000e+01 +1.035235000000000127e+00 -4.843750381469726562e+01 +1.035240000000000160e+00 -4.840625000000000000e+01 +1.035245000000000193e+00 -4.840625000000000000e+01 +1.035250000000000004e+00 -4.831250000000000000e+01 +1.035255000000000036e+00 -4.834375000000000000e+01 +1.035260000000000069e+00 -4.834375000000000000e+01 +1.035265000000000102e+00 -4.834375000000000000e+01 +1.035270000000000135e+00 -4.834375000000000000e+01 +1.035275000000000167e+00 -4.837500000000000000e+01 +1.035279999999999978e+00 -4.840625000000000000e+01 +1.035285000000000011e+00 -4.828125381469726562e+01 +1.035290000000000044e+00 -4.831250000000000000e+01 +1.035295000000000076e+00 -4.834375000000000000e+01 +1.035300000000000109e+00 -4.834375000000000000e+01 +1.035305000000000142e+00 -4.837500000000000000e+01 +1.035310000000000175e+00 -4.834375000000000000e+01 +1.035314999999999985e+00 -4.831250000000000000e+01 +1.035320000000000018e+00 -4.834375000000000000e+01 +1.035325000000000051e+00 -4.834375000000000000e+01 +1.035330000000000084e+00 -4.828125381469726562e+01 +1.035335000000000116e+00 -4.825000000000000000e+01 +1.035340000000000149e+00 -4.828125381469726562e+01 +1.035345000000000182e+00 -4.831250000000000000e+01 +1.035349999999999993e+00 -4.828125381469726562e+01 +1.035355000000000025e+00 -4.828125381469726562e+01 +1.035360000000000058e+00 -4.831250000000000000e+01 +1.035365000000000091e+00 -4.828125381469726562e+01 +1.035370000000000124e+00 -4.825000000000000000e+01 +1.035375000000000156e+00 -4.828125381469726562e+01 +1.035380000000000189e+00 -4.831250000000000000e+01 +1.035385000000000000e+00 -4.825000000000000000e+01 +1.035390000000000033e+00 -4.831250000000000000e+01 +1.035395000000000065e+00 -4.821875000000000000e+01 +1.035400000000000098e+00 -4.825000000000000000e+01 +1.035405000000000131e+00 -4.828125381469726562e+01 +1.035410000000000164e+00 -4.818750000000000000e+01 +1.035414999999999974e+00 -4.825000000000000000e+01 +1.035420000000000007e+00 -4.821875000000000000e+01 +1.035425000000000040e+00 -4.821875000000000000e+01 +1.035430000000000073e+00 -4.821875000000000000e+01 +1.035435000000000105e+00 -4.825000000000000000e+01 +1.035440000000000138e+00 -4.831250000000000000e+01 +1.035445000000000171e+00 -4.825000000000000000e+01 +1.035449999999999982e+00 -4.821875000000000000e+01 +1.035455000000000014e+00 -4.825000000000000000e+01 +1.035460000000000047e+00 -4.815625000000000000e+01 +1.035465000000000080e+00 -4.815625000000000000e+01 +1.035470000000000113e+00 -4.818750000000000000e+01 +1.035475000000000145e+00 -4.818750000000000000e+01 +1.035480000000000178e+00 -4.821875000000000000e+01 +1.035484999999999989e+00 -4.818750000000000000e+01 +1.035490000000000022e+00 -4.815625000000000000e+01 +1.035495000000000054e+00 -4.812500381469726562e+01 +1.035500000000000087e+00 -4.821875000000000000e+01 +1.035505000000000120e+00 -4.818750000000000000e+01 +1.035510000000000153e+00 -4.821875000000000000e+01 +1.035515000000000185e+00 -4.818750000000000000e+01 +1.035519999999999996e+00 -4.821875000000000000e+01 +1.035525000000000029e+00 -4.818750000000000000e+01 +1.035530000000000062e+00 -4.818750000000000000e+01 +1.035535000000000094e+00 -4.815625000000000000e+01 +1.035540000000000127e+00 -4.812500381469726562e+01 +1.035545000000000160e+00 -4.812500381469726562e+01 +1.035550000000000193e+00 -4.812500381469726562e+01 +1.035555000000000003e+00 -4.809375000000000000e+01 +1.035560000000000036e+00 -4.809375000000000000e+01 +1.035565000000000069e+00 -4.806250000000000000e+01 +1.035570000000000102e+00 -4.809375000000000000e+01 +1.035575000000000134e+00 -4.809375000000000000e+01 +1.035580000000000167e+00 -4.809375000000000000e+01 +1.035584999999999978e+00 -4.812500381469726562e+01 +1.035590000000000011e+00 -4.809375000000000000e+01 +1.035595000000000043e+00 -4.809375000000000000e+01 +1.035600000000000076e+00 -4.812500381469726562e+01 +1.035605000000000109e+00 -4.803125000000000000e+01 +1.035610000000000142e+00 -4.803125000000000000e+01 +1.035615000000000174e+00 -4.803125000000000000e+01 +1.035619999999999985e+00 -4.809375000000000000e+01 +1.035625000000000018e+00 -4.800000000000000000e+01 +1.035630000000000051e+00 -4.803125000000000000e+01 +1.035635000000000083e+00 -4.806250000000000000e+01 +1.035640000000000116e+00 -4.809375000000000000e+01 +1.035645000000000149e+00 -4.806250000000000000e+01 +1.035650000000000182e+00 -4.803125000000000000e+01 +1.035654999999999992e+00 -4.803125000000000000e+01 +1.035660000000000025e+00 -4.803125000000000000e+01 +1.035665000000000058e+00 -4.806250000000000000e+01 +1.035670000000000091e+00 -4.803125000000000000e+01 +1.035675000000000123e+00 -4.803125000000000000e+01 +1.035680000000000156e+00 -4.815625000000000000e+01 +1.035685000000000189e+00 -4.803125000000000000e+01 +1.035690000000000000e+00 -4.800000000000000000e+01 +1.035695000000000032e+00 -4.803125000000000000e+01 +1.035700000000000065e+00 -4.806250000000000000e+01 +1.035705000000000098e+00 -4.803125000000000000e+01 +1.035710000000000131e+00 -4.800000000000000000e+01 +1.035715000000000163e+00 -4.803125000000000000e+01 +1.035719999999999974e+00 -4.803125000000000000e+01 +1.035725000000000007e+00 -4.796875381469726562e+01 +1.035730000000000040e+00 -4.800000000000000000e+01 +1.035735000000000072e+00 -4.796875381469726562e+01 +1.035740000000000105e+00 -4.803125000000000000e+01 +1.035745000000000138e+00 -4.796875381469726562e+01 +1.035750000000000171e+00 -4.800000000000000000e+01 +1.035754999999999981e+00 -4.796875381469726562e+01 +1.035760000000000014e+00 -4.803125000000000000e+01 +1.035765000000000047e+00 -4.796875381469726562e+01 +1.035770000000000080e+00 -4.796875381469726562e+01 +1.035775000000000112e+00 -4.793750000000000000e+01 +1.035780000000000145e+00 -4.803125000000000000e+01 +1.035785000000000178e+00 -4.793750000000000000e+01 +1.035789999999999988e+00 -4.793750000000000000e+01 +1.035795000000000021e+00 -4.790625000000000000e+01 +1.035800000000000054e+00 -4.803125000000000000e+01 +1.035805000000000087e+00 -4.800000000000000000e+01 +1.035810000000000120e+00 -4.787500381469726562e+01 +1.035815000000000152e+00 -4.793750000000000000e+01 +1.035820000000000185e+00 -4.787500381469726562e+01 +1.035824999999999996e+00 -4.793750000000000000e+01 +1.035830000000000028e+00 -4.790625000000000000e+01 +1.035835000000000061e+00 -4.787500381469726562e+01 +1.035840000000000094e+00 -4.784375000000000000e+01 +1.035845000000000127e+00 -4.790625000000000000e+01 +1.035850000000000160e+00 -4.784375000000000000e+01 +1.035855000000000192e+00 -4.793750000000000000e+01 +1.035860000000000003e+00 -4.790625000000000000e+01 +1.035865000000000036e+00 -4.793750000000000000e+01 +1.035870000000000068e+00 -4.790625000000000000e+01 +1.035875000000000101e+00 -4.790625000000000000e+01 +1.035880000000000134e+00 -4.790625000000000000e+01 +1.035885000000000167e+00 -4.787500381469726562e+01 +1.035889999999999977e+00 -4.787500381469726562e+01 +1.035895000000000010e+00 -4.781250381469726562e+01 +1.035900000000000043e+00 -4.787500381469726562e+01 +1.035905000000000076e+00 -4.781250381469726562e+01 +1.035910000000000108e+00 -4.781250381469726562e+01 +1.035915000000000141e+00 -4.784375000000000000e+01 +1.035920000000000174e+00 -4.781250381469726562e+01 +1.035924999999999985e+00 -4.784375000000000000e+01 +1.035930000000000017e+00 -4.781250381469726562e+01 +1.035935000000000050e+00 -4.781250381469726562e+01 +1.035940000000000083e+00 -4.781250381469726562e+01 +1.035945000000000116e+00 -4.778125000000000000e+01 +1.035950000000000149e+00 -4.778125000000000000e+01 +1.035955000000000181e+00 -4.778125000000000000e+01 +1.035959999999999992e+00 -4.778125000000000000e+01 +1.035965000000000025e+00 -4.781250381469726562e+01 +1.035970000000000057e+00 -4.778125000000000000e+01 +1.035975000000000090e+00 -4.787500381469726562e+01 +1.035980000000000123e+00 -4.771875381469726562e+01 +1.035985000000000156e+00 -4.781250381469726562e+01 +1.035990000000000189e+00 -4.778125000000000000e+01 +1.035994999999999999e+00 -4.781250381469726562e+01 +1.036000000000000032e+00 -4.775000000000000000e+01 +1.036005000000000065e+00 -4.768750000000000000e+01 +1.036010000000000097e+00 -4.775000000000000000e+01 +1.036015000000000130e+00 -4.775000000000000000e+01 +1.036020000000000163e+00 -4.775000000000000000e+01 +1.036025000000000196e+00 -4.771875381469726562e+01 +1.036030000000000006e+00 -4.771875381469726562e+01 +1.036035000000000039e+00 -4.775000000000000000e+01 +1.036040000000000072e+00 -4.771875381469726562e+01 +1.036045000000000105e+00 -4.771875381469726562e+01 +1.036050000000000137e+00 -4.775000000000000000e+01 +1.036055000000000170e+00 -4.765625000000000000e+01 +1.036059999999999981e+00 -4.775000000000000000e+01 +1.036065000000000014e+00 -4.771875381469726562e+01 +1.036070000000000046e+00 -4.771875381469726562e+01 +1.036075000000000079e+00 -4.765625000000000000e+01 +1.036080000000000112e+00 -4.762500000000000000e+01 +1.036085000000000145e+00 -4.768750000000000000e+01 +1.036090000000000177e+00 -4.765625000000000000e+01 +1.036094999999999988e+00 -4.765625000000000000e+01 +1.036100000000000021e+00 -4.771875381469726562e+01 +1.036105000000000054e+00 -4.768750000000000000e+01 +1.036110000000000086e+00 -4.765625000000000000e+01 +1.036115000000000119e+00 -4.762500000000000000e+01 +1.036120000000000152e+00 -4.759375000000000000e+01 +1.036125000000000185e+00 -4.762500000000000000e+01 +1.036129999999999995e+00 -4.765625000000000000e+01 +1.036135000000000028e+00 -4.759375000000000000e+01 +1.036140000000000061e+00 -4.759375000000000000e+01 +1.036145000000000094e+00 -4.753125000000000000e+01 +1.036150000000000126e+00 -4.765625000000000000e+01 +1.036155000000000159e+00 -4.759375000000000000e+01 +1.036160000000000192e+00 -4.759375000000000000e+01 +1.036165000000000003e+00 -4.768750000000000000e+01 +1.036170000000000035e+00 -4.765625000000000000e+01 +1.036175000000000068e+00 -4.759375000000000000e+01 +1.036180000000000101e+00 -4.756250381469726562e+01 +1.036185000000000134e+00 -4.759375000000000000e+01 +1.036190000000000166e+00 -4.753125000000000000e+01 +1.036194999999999977e+00 -4.756250381469726562e+01 +1.036200000000000010e+00 -4.762500000000000000e+01 +1.036205000000000043e+00 -4.756250381469726562e+01 +1.036210000000000075e+00 -4.753125000000000000e+01 +1.036215000000000108e+00 -4.756250381469726562e+01 +1.036220000000000141e+00 -4.753125000000000000e+01 +1.036225000000000174e+00 -4.759375000000000000e+01 +1.036229999999999984e+00 -4.753125000000000000e+01 +1.036235000000000017e+00 -4.759375000000000000e+01 +1.036240000000000050e+00 -4.756250381469726562e+01 +1.036245000000000083e+00 -4.750000000000000000e+01 +1.036250000000000115e+00 -4.756250381469726562e+01 +1.036255000000000148e+00 -4.753125000000000000e+01 +1.036260000000000181e+00 -4.753125000000000000e+01 +1.036264999999999992e+00 -4.750000000000000000e+01 +1.036270000000000024e+00 -4.756250381469726562e+01 +1.036275000000000057e+00 -4.753125000000000000e+01 +1.036280000000000090e+00 -4.753125000000000000e+01 +1.036285000000000123e+00 -4.756250381469726562e+01 +1.036290000000000155e+00 -4.750000000000000000e+01 +1.036295000000000188e+00 -4.746875000000000000e+01 +1.036299999999999999e+00 -4.753125000000000000e+01 +1.036305000000000032e+00 -4.753125000000000000e+01 +1.036310000000000064e+00 -4.750000000000000000e+01 +1.036315000000000097e+00 -4.753125000000000000e+01 +1.036320000000000130e+00 -4.753125000000000000e+01 +1.036325000000000163e+00 -4.746875000000000000e+01 +1.036330000000000195e+00 -4.753125000000000000e+01 +1.036335000000000006e+00 -4.750000000000000000e+01 +1.036340000000000039e+00 -4.750000000000000000e+01 +1.036345000000000072e+00 -4.753125000000000000e+01 +1.036350000000000104e+00 -4.753125000000000000e+01 +1.036355000000000137e+00 -4.750000000000000000e+01 +1.036360000000000170e+00 -4.750000000000000000e+01 +1.036364999999999981e+00 -4.750000000000000000e+01 +1.036370000000000013e+00 -4.746875000000000000e+01 +1.036375000000000046e+00 -4.746875000000000000e+01 +1.036380000000000079e+00 -4.750000000000000000e+01 +1.036385000000000112e+00 -4.746875000000000000e+01 +1.036390000000000144e+00 -4.746875000000000000e+01 +1.036395000000000177e+00 -4.746875000000000000e+01 +1.036399999999999988e+00 -4.750000000000000000e+01 +1.036405000000000021e+00 -4.743750000000000000e+01 +1.036410000000000053e+00 -4.750000000000000000e+01 +1.036415000000000086e+00 -4.746875000000000000e+01 +1.036420000000000119e+00 -4.746875000000000000e+01 +1.036425000000000152e+00 -4.746875000000000000e+01 +1.036430000000000184e+00 -4.743750000000000000e+01 +1.036434999999999995e+00 -4.746875000000000000e+01 +1.036440000000000028e+00 -4.746875000000000000e+01 +1.036445000000000061e+00 -4.743750000000000000e+01 +1.036450000000000093e+00 -4.743750000000000000e+01 +1.036455000000000126e+00 -4.740625381469726562e+01 +1.036460000000000159e+00 -4.743750000000000000e+01 +1.036465000000000192e+00 -4.743750000000000000e+01 +1.036470000000000002e+00 -4.740625381469726562e+01 +1.036475000000000035e+00 -4.740625381469726562e+01 +1.036480000000000068e+00 -4.743750000000000000e+01 +1.036485000000000101e+00 -4.743750000000000000e+01 +1.036490000000000133e+00 -4.743750000000000000e+01 +1.036495000000000166e+00 -4.737500000000000000e+01 +1.036499999999999977e+00 -4.740625381469726562e+01 +1.036505000000000010e+00 -4.737500000000000000e+01 +1.036510000000000042e+00 -4.737500000000000000e+01 +1.036515000000000075e+00 -4.737500000000000000e+01 +1.036520000000000108e+00 -4.743750000000000000e+01 +1.036525000000000141e+00 -4.740625381469726562e+01 +1.036530000000000173e+00 -4.734375000000000000e+01 +1.036534999999999984e+00 -4.734375000000000000e+01 +1.036540000000000017e+00 -4.737500000000000000e+01 +1.036545000000000050e+00 -4.731250000000000000e+01 +1.036550000000000082e+00 -4.737500000000000000e+01 +1.036555000000000115e+00 -4.734375000000000000e+01 +1.036560000000000148e+00 -4.728125000000000000e+01 +1.036565000000000181e+00 -4.731250000000000000e+01 +1.036569999999999991e+00 -4.734375000000000000e+01 +1.036575000000000024e+00 -4.731250000000000000e+01 +1.036580000000000057e+00 -4.734375000000000000e+01 +1.036585000000000090e+00 -4.731250000000000000e+01 +1.036590000000000122e+00 -4.734375000000000000e+01 +1.036595000000000155e+00 -4.728125000000000000e+01 +1.036600000000000188e+00 -4.728125000000000000e+01 +1.036604999999999999e+00 -4.731250000000000000e+01 +1.036610000000000031e+00 -4.734375000000000000e+01 +1.036615000000000064e+00 -4.728125000000000000e+01 +1.036620000000000097e+00 -4.725000381469726562e+01 +1.036625000000000130e+00 -4.725000381469726562e+01 +1.036630000000000162e+00 -4.728125000000000000e+01 +1.036635000000000195e+00 -4.721875000000000000e+01 +1.036640000000000006e+00 -4.731250000000000000e+01 +1.036645000000000039e+00 -4.728125000000000000e+01 +1.036650000000000071e+00 -4.725000381469726562e+01 +1.036655000000000104e+00 -4.728125000000000000e+01 +1.036660000000000137e+00 -4.731250000000000000e+01 +1.036665000000000170e+00 -4.725000381469726562e+01 +1.036669999999999980e+00 -4.721875000000000000e+01 +1.036675000000000013e+00 -4.718750000000000000e+01 +1.036680000000000046e+00 -4.725000381469726562e+01 +1.036685000000000079e+00 -4.721875000000000000e+01 +1.036690000000000111e+00 -4.725000381469726562e+01 +1.036695000000000144e+00 -4.731250000000000000e+01 +1.036700000000000177e+00 -4.725000381469726562e+01 +1.036704999999999988e+00 -4.718750000000000000e+01 +1.036710000000000020e+00 -4.721875000000000000e+01 +1.036715000000000053e+00 -4.721875000000000000e+01 +1.036720000000000086e+00 -4.721875000000000000e+01 +1.036725000000000119e+00 -4.718750000000000000e+01 +1.036730000000000151e+00 -4.715625381469726562e+01 +1.036735000000000184e+00 -4.718750000000000000e+01 +1.036739999999999995e+00 -4.715625381469726562e+01 +1.036745000000000028e+00 -4.718750000000000000e+01 +1.036750000000000060e+00 -4.718750000000000000e+01 +1.036755000000000093e+00 -4.715625381469726562e+01 +1.036760000000000126e+00 -4.715625381469726562e+01 +1.036765000000000159e+00 -4.725000381469726562e+01 +1.036770000000000191e+00 -4.718750000000000000e+01 +1.036775000000000002e+00 -4.718750000000000000e+01 +1.036780000000000035e+00 -4.715625381469726562e+01 +1.036785000000000068e+00 -4.712500000000000000e+01 +1.036790000000000100e+00 -4.709375381469726562e+01 +1.036795000000000133e+00 -4.712500000000000000e+01 +1.036800000000000166e+00 -4.715625381469726562e+01 +1.036804999999999977e+00 -4.712500000000000000e+01 +1.036810000000000009e+00 -4.712500000000000000e+01 +1.036815000000000042e+00 -4.715625381469726562e+01 +1.036820000000000075e+00 -4.712500000000000000e+01 +1.036825000000000108e+00 -4.706250000000000000e+01 +1.036830000000000140e+00 -4.709375381469726562e+01 +1.036835000000000173e+00 -4.709375381469726562e+01 +1.036839999999999984e+00 -4.712500000000000000e+01 +1.036845000000000017e+00 -4.715625381469726562e+01 +1.036850000000000049e+00 -4.709375381469726562e+01 +1.036855000000000082e+00 -4.706250000000000000e+01 +1.036860000000000115e+00 -4.706250000000000000e+01 +1.036865000000000148e+00 -4.706250000000000000e+01 +1.036870000000000180e+00 -4.712500000000000000e+01 +1.036874999999999991e+00 -4.706250000000000000e+01 +1.036880000000000024e+00 -4.709375381469726562e+01 +1.036885000000000057e+00 -4.703125000000000000e+01 +1.036890000000000089e+00 -4.706250000000000000e+01 +1.036895000000000122e+00 -4.706250000000000000e+01 +1.036900000000000155e+00 -4.706250000000000000e+01 +1.036905000000000188e+00 -4.703125000000000000e+01 +1.036909999999999998e+00 -4.700000381469726562e+01 +1.036915000000000031e+00 -4.706250000000000000e+01 +1.036920000000000064e+00 -4.709375381469726562e+01 +1.036925000000000097e+00 -4.700000381469726562e+01 +1.036930000000000129e+00 -4.703125000000000000e+01 +1.036935000000000162e+00 -4.703125000000000000e+01 +1.036940000000000195e+00 -4.703125000000000000e+01 +1.036945000000000006e+00 -4.706250000000000000e+01 +1.036950000000000038e+00 -4.700000381469726562e+01 +1.036955000000000071e+00 -4.703125000000000000e+01 +1.036960000000000104e+00 -4.706250000000000000e+01 +1.036965000000000137e+00 -4.703125000000000000e+01 +1.036970000000000169e+00 -4.700000381469726562e+01 +1.036974999999999980e+00 -4.696875000000000000e+01 +1.036980000000000013e+00 -4.700000381469726562e+01 +1.036985000000000046e+00 -4.700000381469726562e+01 +1.036990000000000078e+00 -4.700000381469726562e+01 +1.036995000000000111e+00 -4.696875000000000000e+01 +1.037000000000000144e+00 -4.700000381469726562e+01 +1.037005000000000177e+00 -4.693750000000000000e+01 +1.037009999999999987e+00 -4.703125000000000000e+01 +1.037015000000000020e+00 -4.700000381469726562e+01 +1.037020000000000053e+00 -4.690625000000000000e+01 +1.037025000000000086e+00 -4.700000381469726562e+01 +1.037030000000000118e+00 -4.700000381469726562e+01 +1.037035000000000151e+00 -4.696875000000000000e+01 +1.037040000000000184e+00 -4.700000381469726562e+01 +1.037044999999999995e+00 -4.693750000000000000e+01 +1.037050000000000027e+00 -4.696875000000000000e+01 +1.037055000000000060e+00 -4.690625000000000000e+01 +1.037060000000000093e+00 -4.696875000000000000e+01 +1.037065000000000126e+00 -4.700000381469726562e+01 +1.037070000000000158e+00 -4.693750000000000000e+01 +1.037075000000000191e+00 -4.696875000000000000e+01 +1.037080000000000002e+00 -4.693750000000000000e+01 +1.037085000000000035e+00 -4.693750000000000000e+01 +1.037090000000000067e+00 -4.696875000000000000e+01 +1.037095000000000100e+00 -4.696875000000000000e+01 +1.037100000000000133e+00 -4.687500000000000000e+01 +1.037105000000000166e+00 -4.690625000000000000e+01 +1.037109999999999976e+00 -4.687500000000000000e+01 +1.037115000000000009e+00 -4.690625000000000000e+01 +1.037120000000000042e+00 -4.693750000000000000e+01 +1.037125000000000075e+00 -4.693750000000000000e+01 +1.037130000000000107e+00 -4.690625000000000000e+01 +1.037135000000000140e+00 -4.690625000000000000e+01 +1.037140000000000173e+00 -4.684375381469726562e+01 +1.037144999999999984e+00 -4.687500000000000000e+01 +1.037150000000000016e+00 -4.690625000000000000e+01 +1.037155000000000049e+00 -4.690625000000000000e+01 +1.037160000000000082e+00 -4.693750000000000000e+01 +1.037165000000000115e+00 -4.684375381469726562e+01 +1.037170000000000147e+00 -4.684375381469726562e+01 +1.037175000000000180e+00 -4.684375381469726562e+01 +1.037179999999999991e+00 -4.681250000000000000e+01 +1.037185000000000024e+00 -4.687500000000000000e+01 +1.037190000000000056e+00 -4.681250000000000000e+01 +1.037195000000000089e+00 -4.684375381469726562e+01 +1.037200000000000122e+00 -4.678125000000000000e+01 +1.037205000000000155e+00 -4.684375381469726562e+01 +1.037210000000000187e+00 -4.681250000000000000e+01 +1.037214999999999998e+00 -4.678125000000000000e+01 +1.037220000000000031e+00 -4.675000000000000000e+01 +1.037225000000000064e+00 -4.671875000000000000e+01 +1.037230000000000096e+00 -4.684375381469726562e+01 +1.037235000000000129e+00 -4.678125000000000000e+01 +1.037240000000000162e+00 -4.675000000000000000e+01 +1.037245000000000195e+00 -4.681250000000000000e+01 +1.037250000000000005e+00 -4.681250000000000000e+01 +1.037255000000000038e+00 -4.678125000000000000e+01 +1.037260000000000071e+00 -4.681250000000000000e+01 +1.037265000000000104e+00 -4.678125000000000000e+01 +1.037270000000000136e+00 -4.678125000000000000e+01 +1.037275000000000169e+00 -4.681250000000000000e+01 +1.037279999999999980e+00 -4.675000000000000000e+01 +1.037285000000000013e+00 -4.675000000000000000e+01 +1.037290000000000045e+00 -4.671875000000000000e+01 +1.037295000000000078e+00 -4.675000000000000000e+01 +1.037300000000000111e+00 -4.675000000000000000e+01 +1.037305000000000144e+00 -4.671875000000000000e+01 +1.037310000000000176e+00 -4.678125000000000000e+01 +1.037314999999999987e+00 -4.675000000000000000e+01 +1.037320000000000020e+00 -4.675000000000000000e+01 +1.037325000000000053e+00 -4.678125000000000000e+01 +1.037330000000000085e+00 -4.675000000000000000e+01 +1.037335000000000118e+00 -4.681250000000000000e+01 +1.037340000000000151e+00 -4.681250000000000000e+01 +1.037345000000000184e+00 -4.671875000000000000e+01 +1.037349999999999994e+00 -4.678125000000000000e+01 +1.037355000000000027e+00 -4.671875000000000000e+01 +1.037360000000000060e+00 -4.671875000000000000e+01 +1.037365000000000093e+00 -4.675000000000000000e+01 +1.037370000000000125e+00 -4.671875000000000000e+01 +1.037375000000000158e+00 -4.665625000000000000e+01 +1.037380000000000191e+00 -4.671875000000000000e+01 +1.037385000000000002e+00 -4.671875000000000000e+01 +1.037390000000000034e+00 -4.665625000000000000e+01 +1.037395000000000067e+00 -4.665625000000000000e+01 +1.037400000000000100e+00 -4.665625000000000000e+01 +1.037405000000000133e+00 -4.665625000000000000e+01 +1.037410000000000165e+00 -4.665625000000000000e+01 +1.037414999999999976e+00 -4.659375000000000000e+01 +1.037420000000000009e+00 -4.662500000000000000e+01 +1.037425000000000042e+00 -4.662500000000000000e+01 +1.037430000000000074e+00 -4.656250000000000000e+01 +1.037435000000000107e+00 -4.662500000000000000e+01 +1.037440000000000140e+00 -4.659375000000000000e+01 +1.037445000000000173e+00 -4.656250000000000000e+01 +1.037449999999999983e+00 -4.659375000000000000e+01 +1.037455000000000016e+00 -4.656250000000000000e+01 +1.037460000000000049e+00 -4.662500000000000000e+01 +1.037465000000000082e+00 -4.656250000000000000e+01 +1.037470000000000114e+00 -4.659375000000000000e+01 +1.037475000000000147e+00 -4.653125381469726562e+01 +1.037480000000000180e+00 -4.646875000000000000e+01 +1.037484999999999991e+00 -4.659375000000000000e+01 +1.037490000000000023e+00 -4.653125381469726562e+01 +1.037495000000000056e+00 -4.650000000000000000e+01 +1.037500000000000089e+00 -4.646875000000000000e+01 +1.037505000000000122e+00 -4.656250000000000000e+01 +1.037510000000000154e+00 -4.650000000000000000e+01 +1.037515000000000187e+00 -4.650000000000000000e+01 +1.037519999999999998e+00 -4.653125381469726562e+01 +1.037525000000000031e+00 -4.650000000000000000e+01 +1.037530000000000063e+00 -4.650000000000000000e+01 +1.037535000000000096e+00 -4.653125381469726562e+01 +1.037540000000000129e+00 -4.653125381469726562e+01 +1.037545000000000162e+00 -4.653125381469726562e+01 +1.037550000000000194e+00 -4.646875000000000000e+01 +1.037555000000000005e+00 -4.643750000000000000e+01 +1.037560000000000038e+00 -4.650000000000000000e+01 +1.037565000000000071e+00 -4.650000000000000000e+01 +1.037570000000000103e+00 -4.643750000000000000e+01 +1.037575000000000136e+00 -4.646875000000000000e+01 +1.037580000000000169e+00 -4.646875000000000000e+01 +1.037584999999999980e+00 -4.650000000000000000e+01 +1.037590000000000012e+00 -4.646875000000000000e+01 +1.037595000000000045e+00 -4.643750000000000000e+01 +1.037600000000000078e+00 -4.640625000000000000e+01 +1.037605000000000111e+00 -4.646875000000000000e+01 +1.037610000000000143e+00 -4.640625000000000000e+01 +1.037615000000000176e+00 -4.646875000000000000e+01 +1.037619999999999987e+00 -4.646875000000000000e+01 +1.037625000000000020e+00 -4.640625000000000000e+01 +1.037630000000000052e+00 -4.643750000000000000e+01 +1.037635000000000085e+00 -4.637500381469726562e+01 +1.037640000000000118e+00 -4.640625000000000000e+01 +1.037645000000000151e+00 -4.637500381469726562e+01 +1.037650000000000183e+00 -4.640625000000000000e+01 +1.037654999999999994e+00 -4.643750000000000000e+01 +1.037660000000000027e+00 -4.640625000000000000e+01 +1.037665000000000060e+00 -4.640625000000000000e+01 +1.037670000000000092e+00 -4.643750000000000000e+01 +1.037675000000000125e+00 -4.643750000000000000e+01 +1.037680000000000158e+00 -4.640625000000000000e+01 +1.037685000000000191e+00 -4.637500381469726562e+01 +1.037690000000000001e+00 -4.634375000000000000e+01 +1.037695000000000034e+00 -4.631250000000000000e+01 +1.037700000000000067e+00 -4.640625000000000000e+01 +1.037705000000000100e+00 -4.637500381469726562e+01 +1.037710000000000132e+00 -4.634375000000000000e+01 +1.037715000000000165e+00 -4.637500381469726562e+01 +1.037719999999999976e+00 -4.631250000000000000e+01 +1.037725000000000009e+00 -4.634375000000000000e+01 +1.037730000000000041e+00 -4.637500381469726562e+01 +1.037735000000000074e+00 -4.634375000000000000e+01 +1.037740000000000107e+00 -4.637500381469726562e+01 +1.037745000000000140e+00 -4.637500381469726562e+01 +1.037750000000000172e+00 -4.634375000000000000e+01 +1.037754999999999983e+00 -4.634375000000000000e+01 +1.037760000000000016e+00 -4.631250000000000000e+01 +1.037765000000000049e+00 -4.628125381469726562e+01 +1.037770000000000081e+00 -4.625000000000000000e+01 +1.037775000000000114e+00 -4.631250000000000000e+01 +1.037780000000000147e+00 -4.628125381469726562e+01 +1.037785000000000180e+00 -4.628125381469726562e+01 +1.037789999999999990e+00 -4.625000000000000000e+01 +1.037795000000000023e+00 -4.621875381469726562e+01 +1.037800000000000056e+00 -4.631250000000000000e+01 +1.037805000000000089e+00 -4.628125381469726562e+01 +1.037810000000000121e+00 -4.628125381469726562e+01 +1.037815000000000154e+00 -4.625000000000000000e+01 +1.037820000000000187e+00 -4.621875381469726562e+01 +1.037824999999999998e+00 -4.628125381469726562e+01 +1.037830000000000030e+00 -4.621875381469726562e+01 +1.037835000000000063e+00 -4.621875381469726562e+01 +1.037840000000000096e+00 -4.621875381469726562e+01 +1.037845000000000129e+00 -4.628125381469726562e+01 +1.037850000000000161e+00 -4.618750000000000000e+01 +1.037855000000000194e+00 -4.621875381469726562e+01 +1.037860000000000005e+00 -4.615625000000000000e+01 +1.037865000000000038e+00 -4.618750000000000000e+01 +1.037870000000000070e+00 -4.621875381469726562e+01 +1.037875000000000103e+00 -4.615625000000000000e+01 +1.037880000000000136e+00 -4.618750000000000000e+01 +1.037885000000000169e+00 -4.618750000000000000e+01 +1.037889999999999979e+00 -4.612500381469726562e+01 +1.037895000000000012e+00 -4.618750000000000000e+01 +1.037900000000000045e+00 -4.615625000000000000e+01 +1.037905000000000078e+00 -4.618750000000000000e+01 +1.037910000000000110e+00 -4.615625000000000000e+01 +1.037915000000000143e+00 -4.615625000000000000e+01 +1.037920000000000176e+00 -4.615625000000000000e+01 +1.037924999999999986e+00 -4.615625000000000000e+01 +1.037930000000000019e+00 -4.615625000000000000e+01 +1.037935000000000052e+00 -4.615625000000000000e+01 +1.037940000000000085e+00 -4.612500381469726562e+01 +1.037945000000000118e+00 -4.615625000000000000e+01 +1.037950000000000150e+00 -4.618750000000000000e+01 +1.037955000000000183e+00 -4.609375000000000000e+01 +1.037959999999999994e+00 -4.609375000000000000e+01 +1.037965000000000027e+00 -4.609375000000000000e+01 +1.037970000000000059e+00 -4.606250000000000000e+01 +1.037975000000000092e+00 -4.612500381469726562e+01 +1.037980000000000125e+00 -4.606250000000000000e+01 +1.037985000000000158e+00 -4.606250000000000000e+01 +1.037990000000000190e+00 -4.603125000000000000e+01 +1.037995000000000001e+00 -4.609375000000000000e+01 +1.038000000000000034e+00 -4.606250000000000000e+01 +1.038005000000000067e+00 -4.600000000000000000e+01 +1.038010000000000099e+00 -4.606250000000000000e+01 +1.038015000000000132e+00 -4.603125000000000000e+01 +1.038020000000000165e+00 -4.603125000000000000e+01 +1.038024999999999975e+00 -4.609375000000000000e+01 +1.038030000000000008e+00 -4.600000000000000000e+01 +1.038035000000000041e+00 -4.603125000000000000e+01 +1.038040000000000074e+00 -4.606250000000000000e+01 +1.038045000000000107e+00 -4.603125000000000000e+01 +1.038050000000000139e+00 -4.600000000000000000e+01 +1.038055000000000172e+00 -4.603125000000000000e+01 +1.038059999999999983e+00 -4.603125000000000000e+01 +1.038065000000000015e+00 -4.600000000000000000e+01 +1.038070000000000048e+00 -4.606250000000000000e+01 +1.038075000000000081e+00 -4.596875381469726562e+01 +1.038080000000000114e+00 -4.596875381469726562e+01 +1.038085000000000147e+00 -4.596875381469726562e+01 +1.038090000000000179e+00 -4.593750000000000000e+01 +1.038094999999999990e+00 -4.600000000000000000e+01 +1.038100000000000023e+00 -4.603125000000000000e+01 +1.038105000000000055e+00 -4.600000000000000000e+01 +1.038110000000000088e+00 -4.603125000000000000e+01 +1.038115000000000121e+00 -4.593750000000000000e+01 +1.038120000000000154e+00 -4.596875381469726562e+01 +1.038125000000000187e+00 -4.596875381469726562e+01 +1.038129999999999997e+00 -4.593750000000000000e+01 +1.038135000000000030e+00 -4.600000000000000000e+01 +1.038140000000000063e+00 -4.596875381469726562e+01 +1.038145000000000095e+00 -4.593750000000000000e+01 +1.038150000000000128e+00 -4.590625000000000000e+01 +1.038155000000000161e+00 -4.593750000000000000e+01 +1.038160000000000194e+00 -4.596875381469726562e+01 +1.038165000000000004e+00 -4.596875381469726562e+01 +1.038170000000000037e+00 -4.600000000000000000e+01 +1.038175000000000070e+00 -4.596875381469726562e+01 +1.038180000000000103e+00 -4.596875381469726562e+01 +1.038185000000000136e+00 -4.600000000000000000e+01 +1.038190000000000168e+00 -4.596875381469726562e+01 +1.038194999999999979e+00 -4.593750000000000000e+01 +1.038200000000000012e+00 -4.593750000000000000e+01 +1.038205000000000044e+00 -4.596875381469726562e+01 +1.038210000000000077e+00 -4.590625000000000000e+01 +1.038215000000000110e+00 -4.590625000000000000e+01 +1.038220000000000143e+00 -4.593750000000000000e+01 +1.038225000000000176e+00 -4.593750000000000000e+01 +1.038229999999999986e+00 -4.587500000000000000e+01 +1.038235000000000019e+00 -4.584375000000000000e+01 +1.038240000000000052e+00 -4.587500000000000000e+01 +1.038245000000000084e+00 -4.584375000000000000e+01 +1.038250000000000117e+00 -4.593750000000000000e+01 +1.038255000000000150e+00 -4.578125000000000000e+01 +1.038260000000000183e+00 -4.584375000000000000e+01 +1.038264999999999993e+00 -4.584375000000000000e+01 +1.038270000000000026e+00 -4.584375000000000000e+01 +1.038275000000000059e+00 -4.587500000000000000e+01 +1.038280000000000092e+00 -4.581250381469726562e+01 +1.038285000000000124e+00 -4.587500000000000000e+01 +1.038290000000000157e+00 -4.587500000000000000e+01 +1.038295000000000190e+00 -4.584375000000000000e+01 +1.038300000000000001e+00 -4.584375000000000000e+01 +1.038305000000000033e+00 -4.590625000000000000e+01 +1.038310000000000066e+00 -4.581250381469726562e+01 +1.038315000000000099e+00 -4.578125000000000000e+01 +1.038320000000000132e+00 -4.575000000000000000e+01 +1.038325000000000164e+00 -4.581250381469726562e+01 +1.038329999999999975e+00 -4.578125000000000000e+01 +1.038335000000000008e+00 -4.578125000000000000e+01 +1.038340000000000041e+00 -4.578125000000000000e+01 +1.038345000000000073e+00 -4.571875000000000000e+01 +1.038350000000000106e+00 -4.581250381469726562e+01 +1.038355000000000139e+00 -4.571875000000000000e+01 +1.038360000000000172e+00 -4.575000000000000000e+01 +1.038364999999999982e+00 -4.575000000000000000e+01 +1.038370000000000015e+00 -4.578125000000000000e+01 +1.038375000000000048e+00 -4.571875000000000000e+01 +1.038380000000000081e+00 -4.575000000000000000e+01 +1.038385000000000113e+00 -4.571875000000000000e+01 +1.038390000000000146e+00 -4.575000000000000000e+01 +1.038395000000000179e+00 -4.575000000000000000e+01 +1.038399999999999990e+00 -4.578125000000000000e+01 +1.038405000000000022e+00 -4.571875000000000000e+01 +1.038410000000000055e+00 -4.578125000000000000e+01 +1.038415000000000088e+00 -4.575000000000000000e+01 +1.038420000000000121e+00 -4.575000000000000000e+01 +1.038425000000000153e+00 -4.571875000000000000e+01 +1.038430000000000186e+00 -4.571875000000000000e+01 +1.038434999999999997e+00 -4.571875000000000000e+01 +1.038440000000000030e+00 -4.575000000000000000e+01 +1.038445000000000062e+00 -4.571875000000000000e+01 +1.038450000000000095e+00 -4.568750000000000000e+01 +1.038455000000000128e+00 -4.578125000000000000e+01 +1.038460000000000161e+00 -4.568750000000000000e+01 +1.038465000000000193e+00 -4.571875000000000000e+01 +1.038470000000000004e+00 -4.571875000000000000e+01 +1.038475000000000037e+00 -4.568750000000000000e+01 +1.038480000000000070e+00 -4.568750000000000000e+01 +1.038485000000000102e+00 -4.568750000000000000e+01 +1.038490000000000135e+00 -4.565625381469726562e+01 +1.038495000000000168e+00 -4.565625381469726562e+01 +1.038499999999999979e+00 -4.565625381469726562e+01 +1.038505000000000011e+00 -4.565625381469726562e+01 +1.038510000000000044e+00 -4.571875000000000000e+01 +1.038515000000000077e+00 -4.565625381469726562e+01 +1.038520000000000110e+00 -4.565625381469726562e+01 +1.038525000000000142e+00 -4.559375000000000000e+01 +1.038530000000000175e+00 -4.562500000000000000e+01 +1.038534999999999986e+00 -4.559375000000000000e+01 +1.038540000000000019e+00 -4.568750000000000000e+01 +1.038545000000000051e+00 -4.565625381469726562e+01 +1.038550000000000084e+00 -4.568750000000000000e+01 +1.038555000000000117e+00 -4.559375000000000000e+01 +1.038560000000000150e+00 -4.565625381469726562e+01 +1.038565000000000182e+00 -4.562500000000000000e+01 +1.038569999999999993e+00 -4.565625381469726562e+01 +1.038575000000000026e+00 -4.565625381469726562e+01 +1.038580000000000059e+00 -4.559375000000000000e+01 +1.038585000000000091e+00 -4.562500000000000000e+01 +1.038590000000000124e+00 -4.562500000000000000e+01 +1.038595000000000157e+00 -4.562500000000000000e+01 +1.038600000000000190e+00 -4.559375000000000000e+01 +1.038605000000000000e+00 -4.562500000000000000e+01 +1.038610000000000033e+00 -4.565625381469726562e+01 +1.038615000000000066e+00 -4.559375000000000000e+01 +1.038620000000000099e+00 -4.556250381469726562e+01 +1.038625000000000131e+00 -4.556250381469726562e+01 +1.038630000000000164e+00 -4.553125000000000000e+01 +1.038634999999999975e+00 -4.559375000000000000e+01 +1.038640000000000008e+00 -4.553125000000000000e+01 +1.038645000000000040e+00 -4.553125000000000000e+01 +1.038650000000000073e+00 -4.553125000000000000e+01 +1.038655000000000106e+00 -4.550000381469726562e+01 +1.038660000000000139e+00 -4.550000381469726562e+01 +1.038665000000000171e+00 -4.550000381469726562e+01 +1.038669999999999982e+00 -4.550000381469726562e+01 +1.038675000000000015e+00 -4.550000381469726562e+01 +1.038680000000000048e+00 -4.550000381469726562e+01 +1.038685000000000080e+00 -4.546875000000000000e+01 +1.038690000000000113e+00 -4.553125000000000000e+01 +1.038695000000000146e+00 -4.553125000000000000e+01 +1.038700000000000179e+00 -4.550000381469726562e+01 +1.038704999999999989e+00 -4.543750000000000000e+01 +1.038710000000000022e+00 -4.546875000000000000e+01 +1.038715000000000055e+00 -4.546875000000000000e+01 +1.038720000000000088e+00 -4.546875000000000000e+01 +1.038725000000000120e+00 -4.543750000000000000e+01 +1.038730000000000153e+00 -4.543750000000000000e+01 +1.038735000000000186e+00 -4.546875000000000000e+01 +1.038739999999999997e+00 -4.546875000000000000e+01 +1.038745000000000029e+00 -4.543750000000000000e+01 +1.038750000000000062e+00 -4.550000381469726562e+01 +1.038755000000000095e+00 -4.546875000000000000e+01 +1.038760000000000128e+00 -4.550000381469726562e+01 +1.038765000000000160e+00 -4.546875000000000000e+01 +1.038770000000000193e+00 -4.546875000000000000e+01 +1.038775000000000004e+00 -4.543750000000000000e+01 +1.038780000000000037e+00 -4.546875000000000000e+01 +1.038785000000000069e+00 -4.543750000000000000e+01 +1.038790000000000102e+00 -4.534375000000000000e+01 +1.038795000000000135e+00 -4.543750000000000000e+01 +1.038800000000000168e+00 -4.534375000000000000e+01 +1.038804999999999978e+00 -4.540625381469726562e+01 +1.038810000000000011e+00 -4.540625381469726562e+01 +1.038815000000000044e+00 -4.537500000000000000e+01 +1.038820000000000077e+00 -4.537500000000000000e+01 +1.038825000000000109e+00 -4.540625381469726562e+01 +1.038830000000000142e+00 -4.540625381469726562e+01 +1.038835000000000175e+00 -4.540625381469726562e+01 +1.038839999999999986e+00 -4.537500000000000000e+01 +1.038845000000000018e+00 -4.540625381469726562e+01 +1.038850000000000051e+00 -4.540625381469726562e+01 +1.038855000000000084e+00 -4.534375000000000000e+01 +1.038860000000000117e+00 -4.537500000000000000e+01 +1.038865000000000149e+00 -4.528125000000000000e+01 +1.038870000000000182e+00 -4.537500000000000000e+01 +1.038874999999999993e+00 -4.540625381469726562e+01 +1.038880000000000026e+00 -4.537500000000000000e+01 +1.038885000000000058e+00 -4.531250000000000000e+01 +1.038890000000000091e+00 -4.531250000000000000e+01 +1.038895000000000124e+00 -4.531250000000000000e+01 +1.038900000000000157e+00 -4.534375000000000000e+01 +1.038905000000000189e+00 -4.534375000000000000e+01 +1.038910000000000000e+00 -4.531250000000000000e+01 +1.038915000000000033e+00 -4.537500000000000000e+01 +1.038920000000000066e+00 -4.537500000000000000e+01 +1.038925000000000098e+00 -4.534375000000000000e+01 +1.038930000000000131e+00 -4.537500000000000000e+01 +1.038935000000000164e+00 -4.534375000000000000e+01 +1.038939999999999975e+00 -4.534375000000000000e+01 +1.038945000000000007e+00 -4.534375000000000000e+01 +1.038950000000000040e+00 -4.534375000000000000e+01 +1.038955000000000073e+00 -4.531250000000000000e+01 +1.038960000000000106e+00 -4.534375000000000000e+01 +1.038965000000000138e+00 -4.534375000000000000e+01 +1.038970000000000171e+00 -4.531250000000000000e+01 +1.038974999999999982e+00 -4.534375000000000000e+01 +1.038980000000000015e+00 -4.531250000000000000e+01 +1.038985000000000047e+00 -4.525000381469726562e+01 +1.038990000000000080e+00 -4.531250000000000000e+01 +1.038995000000000113e+00 -4.531250000000000000e+01 +1.039000000000000146e+00 -4.518750000000000000e+01 +1.039005000000000178e+00 -4.534375000000000000e+01 +1.039009999999999989e+00 -4.528125000000000000e+01 +1.039015000000000022e+00 -4.528125000000000000e+01 +1.039020000000000055e+00 -4.528125000000000000e+01 +1.039025000000000087e+00 -4.531250000000000000e+01 +1.039030000000000120e+00 -4.525000381469726562e+01 +1.039035000000000153e+00 -4.525000381469726562e+01 +1.039040000000000186e+00 -4.521875000000000000e+01 +1.039044999999999996e+00 -4.521875000000000000e+01 +1.039050000000000029e+00 -4.525000381469726562e+01 +1.039055000000000062e+00 -4.518750000000000000e+01 +1.039060000000000095e+00 -4.521875000000000000e+01 +1.039065000000000127e+00 -4.528125000000000000e+01 +1.039070000000000160e+00 -4.525000381469726562e+01 +1.039075000000000193e+00 -4.521875000000000000e+01 +1.039080000000000004e+00 -4.525000381469726562e+01 +1.039085000000000036e+00 -4.525000381469726562e+01 +1.039090000000000069e+00 -4.521875000000000000e+01 +1.039095000000000102e+00 -4.525000381469726562e+01 +1.039100000000000135e+00 -4.528125000000000000e+01 +1.039105000000000167e+00 -4.525000381469726562e+01 +1.039109999999999978e+00 -4.525000381469726562e+01 +1.039115000000000011e+00 -4.521875000000000000e+01 +1.039120000000000044e+00 -4.521875000000000000e+01 +1.039125000000000076e+00 -4.521875000000000000e+01 +1.039130000000000109e+00 -4.521875000000000000e+01 +1.039135000000000142e+00 -4.518750000000000000e+01 +1.039140000000000175e+00 -4.521875000000000000e+01 +1.039144999999999985e+00 -4.521875000000000000e+01 +1.039150000000000018e+00 -4.518750000000000000e+01 +1.039155000000000051e+00 -4.521875000000000000e+01 +1.039160000000000084e+00 -4.518750000000000000e+01 +1.039165000000000116e+00 -4.521875000000000000e+01 +1.039170000000000149e+00 -4.515625000000000000e+01 +1.039175000000000182e+00 -4.521875000000000000e+01 +1.039179999999999993e+00 -4.515625000000000000e+01 +1.039185000000000025e+00 -4.518750000000000000e+01 +1.039190000000000058e+00 -4.515625000000000000e+01 +1.039195000000000091e+00 -4.512500000000000000e+01 +1.039200000000000124e+00 -4.515625000000000000e+01 +1.039205000000000156e+00 -4.518750000000000000e+01 +1.039210000000000189e+00 -4.515625000000000000e+01 +1.039215000000000000e+00 -4.509375381469726562e+01 +1.039220000000000033e+00 -4.509375381469726562e+01 +1.039225000000000065e+00 -4.509375381469726562e+01 +1.039230000000000098e+00 -4.512500000000000000e+01 +1.039235000000000131e+00 -4.512500000000000000e+01 +1.039240000000000164e+00 -4.509375381469726562e+01 +1.039244999999999974e+00 -4.512500000000000000e+01 +1.039250000000000007e+00 -4.515625000000000000e+01 +1.039255000000000040e+00 -4.509375381469726562e+01 +1.039260000000000073e+00 -4.515625000000000000e+01 +1.039265000000000105e+00 -4.506250000000000000e+01 +1.039270000000000138e+00 -4.509375381469726562e+01 +1.039275000000000171e+00 -4.509375381469726562e+01 +1.039279999999999982e+00 -4.506250000000000000e+01 +1.039285000000000014e+00 -4.506250000000000000e+01 +1.039290000000000047e+00 -4.509375381469726562e+01 +1.039295000000000080e+00 -4.506250000000000000e+01 +1.039300000000000113e+00 -4.512500000000000000e+01 +1.039305000000000145e+00 -4.503125000000000000e+01 +1.039310000000000178e+00 -4.509375381469726562e+01 +1.039314999999999989e+00 -4.509375381469726562e+01 +1.039320000000000022e+00 -4.506250000000000000e+01 +1.039325000000000054e+00 -4.509375381469726562e+01 +1.039330000000000087e+00 -4.503125000000000000e+01 +1.039335000000000120e+00 -4.503125000000000000e+01 +1.039340000000000153e+00 -4.506250000000000000e+01 +1.039345000000000185e+00 -4.506250000000000000e+01 +1.039349999999999996e+00 -4.509375381469726562e+01 +1.039355000000000029e+00 -4.506250000000000000e+01 +1.039360000000000062e+00 -4.506250000000000000e+01 +1.039365000000000094e+00 -4.509375381469726562e+01 +1.039370000000000127e+00 -4.506250000000000000e+01 +1.039375000000000160e+00 -4.509375381469726562e+01 +1.039380000000000193e+00 -4.500000000000000000e+01 +1.039385000000000003e+00 -4.503125000000000000e+01 +1.039390000000000036e+00 -4.500000000000000000e+01 +1.039395000000000069e+00 -4.503125000000000000e+01 +1.039400000000000102e+00 -4.500000000000000000e+01 +1.039405000000000134e+00 -4.503125000000000000e+01 +1.039410000000000167e+00 -4.496875000000000000e+01 +1.039414999999999978e+00 -4.496875000000000000e+01 +1.039420000000000011e+00 -4.500000000000000000e+01 +1.039425000000000043e+00 -4.496875000000000000e+01 +1.039430000000000076e+00 -4.503125000000000000e+01 +1.039435000000000109e+00 -4.500000000000000000e+01 +1.039440000000000142e+00 -4.500000000000000000e+01 +1.039445000000000174e+00 -4.500000000000000000e+01 +1.039449999999999985e+00 -4.496875000000000000e+01 +1.039455000000000018e+00 -4.496875000000000000e+01 +1.039460000000000051e+00 -4.493750381469726562e+01 +1.039465000000000083e+00 -4.500000000000000000e+01 +1.039470000000000116e+00 -4.496875000000000000e+01 +1.039475000000000149e+00 -4.493750381469726562e+01 +1.039480000000000182e+00 -4.493750381469726562e+01 +1.039484999999999992e+00 -4.490625000000000000e+01 +1.039490000000000025e+00 -4.493750381469726562e+01 +1.039495000000000058e+00 -4.493750381469726562e+01 +1.039500000000000091e+00 -4.493750381469726562e+01 +1.039505000000000123e+00 -4.493750381469726562e+01 +1.039510000000000156e+00 -4.496875000000000000e+01 +1.039515000000000189e+00 -4.496875000000000000e+01 +1.039520000000000000e+00 -4.490625000000000000e+01 +1.039525000000000032e+00 -4.487500000000000000e+01 +1.039530000000000065e+00 -4.490625000000000000e+01 +1.039535000000000098e+00 -4.490625000000000000e+01 +1.039540000000000131e+00 -4.493750381469726562e+01 +1.039545000000000163e+00 -4.496875000000000000e+01 +1.039549999999999974e+00 -4.493750381469726562e+01 +1.039555000000000007e+00 -4.490625000000000000e+01 +1.039560000000000040e+00 -4.487500000000000000e+01 +1.039565000000000072e+00 -4.487500000000000000e+01 +1.039570000000000105e+00 -4.487500000000000000e+01 +1.039575000000000138e+00 -4.487500000000000000e+01 +1.039580000000000171e+00 -4.487500000000000000e+01 +1.039584999999999981e+00 -4.484375381469726562e+01 +1.039590000000000014e+00 -4.487500000000000000e+01 +1.039595000000000047e+00 -4.484375381469726562e+01 +1.039600000000000080e+00 -4.481250000000000000e+01 +1.039605000000000112e+00 -4.484375381469726562e+01 +1.039610000000000145e+00 -4.487500000000000000e+01 +1.039615000000000178e+00 -4.490625000000000000e+01 +1.039619999999999989e+00 -4.484375381469726562e+01 +1.039625000000000021e+00 -4.481250000000000000e+01 +1.039630000000000054e+00 -4.478125381469726562e+01 +1.039635000000000087e+00 -4.478125381469726562e+01 +1.039640000000000120e+00 -4.478125381469726562e+01 +1.039645000000000152e+00 -4.475000000000000000e+01 +1.039650000000000185e+00 -4.475000000000000000e+01 +1.039654999999999996e+00 -4.478125381469726562e+01 +1.039660000000000029e+00 -4.475000000000000000e+01 +1.039665000000000061e+00 -4.478125381469726562e+01 +1.039670000000000094e+00 -4.475000000000000000e+01 +1.039675000000000127e+00 -4.478125381469726562e+01 +1.039680000000000160e+00 -4.478125381469726562e+01 +1.039685000000000192e+00 -4.475000000000000000e+01 +1.039690000000000003e+00 -4.478125381469726562e+01 +1.039695000000000036e+00 -4.478125381469726562e+01 +1.039700000000000069e+00 -4.478125381469726562e+01 +1.039705000000000101e+00 -4.471875000000000000e+01 +1.039710000000000134e+00 -4.475000000000000000e+01 +1.039715000000000167e+00 -4.481250000000000000e+01 +1.039719999999999978e+00 -4.478125381469726562e+01 +1.039725000000000010e+00 -4.471875000000000000e+01 +1.039730000000000043e+00 -4.468750381469726562e+01 +1.039735000000000076e+00 -4.475000000000000000e+01 +1.039740000000000109e+00 -4.471875000000000000e+01 +1.039745000000000141e+00 -4.478125381469726562e+01 +1.039750000000000174e+00 -4.468750381469726562e+01 +1.039754999999999985e+00 -4.468750381469726562e+01 +1.039760000000000018e+00 -4.465625000000000000e+01 +1.039765000000000050e+00 -4.468750381469726562e+01 +1.039770000000000083e+00 -4.468750381469726562e+01 +1.039775000000000116e+00 -4.468750381469726562e+01 +1.039780000000000149e+00 -4.468750381469726562e+01 +1.039785000000000181e+00 -4.465625000000000000e+01 +1.039789999999999992e+00 -4.468750381469726562e+01 +1.039795000000000025e+00 -4.471875000000000000e+01 +1.039800000000000058e+00 -4.471875000000000000e+01 +1.039805000000000090e+00 -4.478125381469726562e+01 +1.039810000000000123e+00 -4.465625000000000000e+01 +1.039815000000000156e+00 -4.471875000000000000e+01 +1.039820000000000189e+00 -4.462500000000000000e+01 +1.039824999999999999e+00 -4.456250000000000000e+01 +1.039830000000000032e+00 -4.462500000000000000e+01 +1.039835000000000065e+00 -4.465625000000000000e+01 +1.039840000000000098e+00 -4.459375000000000000e+01 +1.039845000000000130e+00 -4.468750381469726562e+01 +1.039850000000000163e+00 -4.468750381469726562e+01 +1.039855000000000196e+00 -4.468750381469726562e+01 +1.039860000000000007e+00 -4.459375000000000000e+01 +1.039865000000000039e+00 -4.462500000000000000e+01 +1.039870000000000072e+00 -4.471875000000000000e+01 +1.039875000000000105e+00 -4.462500000000000000e+01 +1.039880000000000138e+00 -4.456250000000000000e+01 +1.039885000000000170e+00 -4.462500000000000000e+01 +1.039889999999999981e+00 -4.462500000000000000e+01 +1.039895000000000014e+00 -4.462500000000000000e+01 +1.039900000000000047e+00 -4.465625000000000000e+01 +1.039905000000000079e+00 -4.462500000000000000e+01 +1.039910000000000112e+00 -4.459375000000000000e+01 +1.039915000000000145e+00 -4.465625000000000000e+01 +1.039920000000000178e+00 -4.459375000000000000e+01 +1.039924999999999988e+00 -4.459375000000000000e+01 +1.039930000000000021e+00 -4.456250000000000000e+01 +1.039935000000000054e+00 -4.459375000000000000e+01 +1.039940000000000087e+00 -4.459375000000000000e+01 +1.039945000000000119e+00 -4.462500000000000000e+01 +1.039950000000000152e+00 -4.450000000000000000e+01 +1.039955000000000185e+00 -4.459375000000000000e+01 +1.039959999999999996e+00 -4.456250000000000000e+01 +1.039965000000000028e+00 -4.462500000000000000e+01 +1.039970000000000061e+00 -4.459375000000000000e+01 +1.039975000000000094e+00 -4.462500000000000000e+01 +1.039980000000000127e+00 -4.456250000000000000e+01 +1.039985000000000159e+00 -4.462500000000000000e+01 +1.039990000000000192e+00 -4.456250000000000000e+01 +1.039995000000000003e+00 -4.453125381469726562e+01 +1.040000000000000036e+00 -4.453125381469726562e+01 +1.040005000000000068e+00 -4.453125381469726562e+01 +1.040010000000000101e+00 -4.456250000000000000e+01 +1.040015000000000134e+00 -4.456250000000000000e+01 +1.040020000000000167e+00 -4.456250000000000000e+01 +1.040024999999999977e+00 -4.446875000000000000e+01 +1.040030000000000010e+00 -4.456250000000000000e+01 +1.040035000000000043e+00 -4.446875000000000000e+01 +1.040040000000000076e+00 -4.450000000000000000e+01 +1.040045000000000108e+00 -4.453125381469726562e+01 +1.040050000000000141e+00 -4.450000000000000000e+01 +1.040055000000000174e+00 -4.456250000000000000e+01 +1.040059999999999985e+00 -4.456250000000000000e+01 +1.040065000000000017e+00 -4.453125381469726562e+01 +1.040070000000000050e+00 -4.453125381469726562e+01 +1.040075000000000083e+00 -4.453125381469726562e+01 +1.040080000000000116e+00 -4.453125381469726562e+01 +1.040085000000000148e+00 -4.446875000000000000e+01 +1.040090000000000181e+00 -4.450000000000000000e+01 +1.040094999999999992e+00 -4.453125381469726562e+01 +1.040100000000000025e+00 -4.450000000000000000e+01 +1.040105000000000057e+00 -4.450000000000000000e+01 +1.040110000000000090e+00 -4.446875000000000000e+01 +1.040115000000000123e+00 -4.443750000000000000e+01 +1.040120000000000156e+00 -4.446875000000000000e+01 +1.040125000000000188e+00 -4.443750000000000000e+01 +1.040129999999999999e+00 -4.446875000000000000e+01 +1.040135000000000032e+00 -4.440625000000000000e+01 +1.040140000000000065e+00 -4.443750000000000000e+01 +1.040145000000000097e+00 -4.443750000000000000e+01 +1.040150000000000130e+00 -4.446875000000000000e+01 +1.040155000000000163e+00 -4.437500381469726562e+01 +1.040160000000000196e+00 -4.446875000000000000e+01 +1.040165000000000006e+00 -4.446875000000000000e+01 +1.040170000000000039e+00 -4.443750000000000000e+01 +1.040175000000000072e+00 -4.434375000000000000e+01 +1.040180000000000105e+00 -4.437500381469726562e+01 +1.040185000000000137e+00 -4.437500381469726562e+01 +1.040190000000000170e+00 -4.443750000000000000e+01 +1.040194999999999981e+00 -4.440625000000000000e+01 +1.040200000000000014e+00 -4.437500381469726562e+01 +1.040205000000000046e+00 -4.434375000000000000e+01 +1.040210000000000079e+00 -4.434375000000000000e+01 +1.040215000000000112e+00 -4.440625000000000000e+01 +1.040220000000000145e+00 -4.434375000000000000e+01 +1.040225000000000177e+00 -4.437500381469726562e+01 +1.040229999999999988e+00 -4.431250000000000000e+01 +1.040235000000000021e+00 -4.431250000000000000e+01 +1.040240000000000054e+00 -4.434375000000000000e+01 +1.040245000000000086e+00 -4.437500381469726562e+01 +1.040250000000000119e+00 -4.431250000000000000e+01 +1.040255000000000152e+00 -4.434375000000000000e+01 +1.040260000000000185e+00 -4.428125000000000000e+01 +1.040264999999999995e+00 -4.431250000000000000e+01 +1.040270000000000028e+00 -4.428125000000000000e+01 +1.040275000000000061e+00 -4.431250000000000000e+01 +1.040280000000000094e+00 -4.428125000000000000e+01 +1.040285000000000126e+00 -4.428125000000000000e+01 +1.040290000000000159e+00 -4.428125000000000000e+01 +1.040295000000000192e+00 -4.431250000000000000e+01 +1.040300000000000002e+00 -4.428125000000000000e+01 +1.040305000000000035e+00 -4.425000000000000000e+01 +1.040310000000000068e+00 -4.428125000000000000e+01 +1.040315000000000101e+00 -4.428125000000000000e+01 +1.040320000000000134e+00 -4.428125000000000000e+01 +1.040325000000000166e+00 -4.428125000000000000e+01 +1.040329999999999977e+00 -4.425000000000000000e+01 +1.040335000000000010e+00 -4.431250000000000000e+01 +1.040340000000000042e+00 -4.418750000000000000e+01 +1.040345000000000075e+00 -4.425000000000000000e+01 +1.040350000000000108e+00 -4.425000000000000000e+01 +1.040355000000000141e+00 -4.425000000000000000e+01 +1.040360000000000174e+00 -4.421875381469726562e+01 +1.040364999999999984e+00 -4.421875381469726562e+01 +1.040370000000000017e+00 -4.428125000000000000e+01 +1.040375000000000050e+00 -4.418750000000000000e+01 +1.040380000000000082e+00 -4.415625000000000000e+01 +1.040385000000000115e+00 -4.421875381469726562e+01 +1.040390000000000148e+00 -4.421875381469726562e+01 +1.040395000000000181e+00 -4.421875381469726562e+01 +1.040399999999999991e+00 -4.421875381469726562e+01 +1.040405000000000024e+00 -4.421875381469726562e+01 +1.040410000000000057e+00 -4.428125000000000000e+01 +1.040415000000000090e+00 -4.418750000000000000e+01 +1.040420000000000122e+00 -4.418750000000000000e+01 +1.040425000000000155e+00 -4.412500000000000000e+01 +1.040430000000000188e+00 -4.415625000000000000e+01 +1.040434999999999999e+00 -4.421875381469726562e+01 +1.040440000000000031e+00 -4.421875381469726562e+01 +1.040445000000000064e+00 -4.415625000000000000e+01 +1.040450000000000097e+00 -4.415625000000000000e+01 +1.040455000000000130e+00 -4.418750000000000000e+01 +1.040460000000000163e+00 -4.421875381469726562e+01 +1.040465000000000195e+00 -4.415625000000000000e+01 +1.040470000000000006e+00 -4.415625000000000000e+01 +1.040475000000000039e+00 -4.409375000000000000e+01 +1.040480000000000071e+00 -4.412500000000000000e+01 +1.040485000000000104e+00 -4.406250381469726562e+01 +1.040490000000000137e+00 -4.409375000000000000e+01 +1.040495000000000170e+00 -4.409375000000000000e+01 +1.040499999999999980e+00 -4.412500000000000000e+01 +1.040505000000000013e+00 -4.409375000000000000e+01 +1.040510000000000046e+00 -4.412500000000000000e+01 +1.040515000000000079e+00 -4.403125000000000000e+01 +1.040520000000000111e+00 -4.409375000000000000e+01 +1.040525000000000144e+00 -4.409375000000000000e+01 +1.040530000000000177e+00 -4.406250381469726562e+01 +1.040534999999999988e+00 -4.406250381469726562e+01 +1.040540000000000020e+00 -4.406250381469726562e+01 +1.040545000000000053e+00 -4.409375000000000000e+01 +1.040550000000000086e+00 -4.409375000000000000e+01 +1.040555000000000119e+00 -4.406250381469726562e+01 +1.040560000000000151e+00 -4.403125000000000000e+01 +1.040565000000000184e+00 -4.400000000000000000e+01 +1.040569999999999995e+00 -4.403125000000000000e+01 +1.040575000000000028e+00 -4.400000000000000000e+01 +1.040580000000000060e+00 -4.403125000000000000e+01 +1.040585000000000093e+00 -4.403125000000000000e+01 +1.040590000000000126e+00 -4.400000000000000000e+01 +1.040595000000000159e+00 -4.400000000000000000e+01 +1.040600000000000191e+00 -4.406250381469726562e+01 +1.040605000000000002e+00 -4.400000000000000000e+01 +1.040610000000000035e+00 -4.396875381469726562e+01 +1.040615000000000068e+00 -4.400000000000000000e+01 +1.040620000000000100e+00 -4.406250381469726562e+01 +1.040625000000000133e+00 -4.400000000000000000e+01 +1.040630000000000166e+00 -4.400000000000000000e+01 +1.040634999999999977e+00 -4.403125000000000000e+01 +1.040640000000000009e+00 -4.403125000000000000e+01 +1.040645000000000042e+00 -4.403125000000000000e+01 +1.040650000000000075e+00 -4.406250381469726562e+01 +1.040655000000000108e+00 -4.396875381469726562e+01 +1.040660000000000140e+00 -4.406250381469726562e+01 +1.040665000000000173e+00 -4.403125000000000000e+01 +1.040669999999999984e+00 -4.406250381469726562e+01 +1.040675000000000017e+00 -4.403125000000000000e+01 +1.040680000000000049e+00 -4.400000000000000000e+01 +1.040685000000000082e+00 -4.400000000000000000e+01 +1.040690000000000115e+00 -4.396875381469726562e+01 +1.040695000000000148e+00 -4.400000000000000000e+01 +1.040700000000000180e+00 -4.396875381469726562e+01 +1.040704999999999991e+00 -4.396875381469726562e+01 +1.040710000000000024e+00 -4.396875381469726562e+01 +1.040715000000000057e+00 -4.393750000000000000e+01 +1.040720000000000089e+00 -4.393750000000000000e+01 +1.040725000000000122e+00 -4.393750000000000000e+01 +1.040730000000000155e+00 -4.396875381469726562e+01 +1.040735000000000188e+00 -4.387500000000000000e+01 +1.040739999999999998e+00 -4.390625381469726562e+01 +1.040745000000000031e+00 -4.390625381469726562e+01 +1.040750000000000064e+00 -4.387500000000000000e+01 +1.040755000000000097e+00 -4.396875381469726562e+01 +1.040760000000000129e+00 -4.390625381469726562e+01 +1.040765000000000162e+00 -4.393750000000000000e+01 +1.040770000000000195e+00 -4.393750000000000000e+01 +1.040775000000000006e+00 -4.390625381469726562e+01 +1.040780000000000038e+00 -4.390625381469726562e+01 +1.040785000000000071e+00 -4.393750000000000000e+01 +1.040790000000000104e+00 -4.387500000000000000e+01 +1.040795000000000137e+00 -4.390625381469726562e+01 +1.040800000000000169e+00 -4.384375000000000000e+01 +1.040804999999999980e+00 -4.393750000000000000e+01 +1.040810000000000013e+00 -4.393750000000000000e+01 +1.040815000000000046e+00 -4.387500000000000000e+01 +1.040820000000000078e+00 -4.381250381469726562e+01 +1.040825000000000111e+00 -4.387500000000000000e+01 +1.040830000000000144e+00 -4.384375000000000000e+01 +1.040835000000000177e+00 -4.387500000000000000e+01 +1.040839999999999987e+00 -4.384375000000000000e+01 +1.040845000000000020e+00 -4.384375000000000000e+01 +1.040850000000000053e+00 -4.384375000000000000e+01 +1.040855000000000086e+00 -4.378125000000000000e+01 +1.040860000000000118e+00 -4.390625381469726562e+01 +1.040865000000000151e+00 -4.381250381469726562e+01 +1.040870000000000184e+00 -4.378125000000000000e+01 +1.040874999999999995e+00 -4.378125000000000000e+01 +1.040880000000000027e+00 -4.384375000000000000e+01 +1.040885000000000060e+00 -4.381250381469726562e+01 +1.040890000000000093e+00 -4.378125000000000000e+01 +1.040895000000000126e+00 -4.378125000000000000e+01 +1.040900000000000158e+00 -4.384375000000000000e+01 +1.040905000000000191e+00 -4.381250381469726562e+01 +1.040910000000000002e+00 -4.387500000000000000e+01 +1.040915000000000035e+00 -4.384375000000000000e+01 +1.040920000000000067e+00 -4.381250381469726562e+01 +1.040925000000000100e+00 -4.378125000000000000e+01 +1.040930000000000133e+00 -4.384375000000000000e+01 +1.040935000000000166e+00 -4.378125000000000000e+01 +1.040939999999999976e+00 -4.381250381469726562e+01 +1.040945000000000009e+00 -4.378125000000000000e+01 +1.040950000000000042e+00 -4.378125000000000000e+01 +1.040955000000000075e+00 -4.378125000000000000e+01 +1.040960000000000107e+00 -4.371875000000000000e+01 +1.040965000000000140e+00 -4.375000000000000000e+01 +1.040970000000000173e+00 -4.378125000000000000e+01 +1.040974999999999984e+00 -4.365625381469726562e+01 +1.040980000000000016e+00 -4.368750000000000000e+01 +1.040985000000000049e+00 -4.365625381469726562e+01 +1.040990000000000082e+00 -4.368750000000000000e+01 +1.040995000000000115e+00 -4.371875000000000000e+01 +1.041000000000000147e+00 -4.375000000000000000e+01 +1.041005000000000180e+00 -4.375000000000000000e+01 +1.041009999999999991e+00 -4.371875000000000000e+01 +1.041015000000000024e+00 -4.368750000000000000e+01 +1.041020000000000056e+00 -4.378125000000000000e+01 +1.041025000000000089e+00 -4.368750000000000000e+01 +1.041030000000000122e+00 -4.368750000000000000e+01 +1.041035000000000155e+00 -4.365625381469726562e+01 +1.041040000000000187e+00 -4.371875000000000000e+01 +1.041044999999999998e+00 -4.368750000000000000e+01 +1.041050000000000031e+00 -4.365625381469726562e+01 +1.041055000000000064e+00 -4.371875000000000000e+01 +1.041060000000000096e+00 -4.368750000000000000e+01 +1.041065000000000129e+00 -4.368750000000000000e+01 +1.041070000000000162e+00 -4.371875000000000000e+01 +1.041075000000000195e+00 -4.371875000000000000e+01 +1.041080000000000005e+00 -4.368750000000000000e+01 +1.041085000000000038e+00 -4.365625381469726562e+01 +1.041090000000000071e+00 -4.365625381469726562e+01 +1.041095000000000104e+00 -4.365625381469726562e+01 +1.041100000000000136e+00 -4.368750000000000000e+01 +1.041105000000000169e+00 -4.362500000000000000e+01 +1.041109999999999980e+00 -4.368750000000000000e+01 +1.041115000000000013e+00 -4.362500000000000000e+01 +1.041120000000000045e+00 -4.359375000000000000e+01 +1.041125000000000078e+00 -4.356250000000000000e+01 +1.041130000000000111e+00 -4.365625381469726562e+01 +1.041135000000000144e+00 -4.362500000000000000e+01 +1.041140000000000176e+00 -4.359375000000000000e+01 +1.041144999999999987e+00 -4.365625381469726562e+01 +1.041150000000000020e+00 -4.365625381469726562e+01 +1.041155000000000053e+00 -4.359375000000000000e+01 +1.041160000000000085e+00 -4.356250000000000000e+01 +1.041165000000000118e+00 -4.359375000000000000e+01 +1.041170000000000151e+00 -4.353125000000000000e+01 +1.041175000000000184e+00 -4.356250000000000000e+01 +1.041179999999999994e+00 -4.356250000000000000e+01 +1.041185000000000027e+00 -4.353125000000000000e+01 +1.041190000000000060e+00 -4.359375000000000000e+01 +1.041195000000000093e+00 -4.356250000000000000e+01 +1.041200000000000125e+00 -4.356250000000000000e+01 +1.041205000000000158e+00 -4.353125000000000000e+01 +1.041210000000000191e+00 -4.353125000000000000e+01 +1.041215000000000002e+00 -4.356250000000000000e+01 +1.041220000000000034e+00 -4.350000381469726562e+01 +1.041225000000000067e+00 -4.356250000000000000e+01 +1.041230000000000100e+00 -4.350000381469726562e+01 +1.041235000000000133e+00 -4.353125000000000000e+01 +1.041240000000000165e+00 -4.353125000000000000e+01 +1.041244999999999976e+00 -4.359375000000000000e+01 +1.041250000000000009e+00 -4.353125000000000000e+01 +1.041255000000000042e+00 -4.350000381469726562e+01 +1.041260000000000074e+00 -4.353125000000000000e+01 +1.041265000000000107e+00 -4.353125000000000000e+01 +1.041270000000000140e+00 -4.350000381469726562e+01 +1.041275000000000173e+00 -4.350000381469726562e+01 +1.041279999999999983e+00 -4.346875000000000000e+01 +1.041285000000000016e+00 -4.353125000000000000e+01 +1.041290000000000049e+00 -4.353125000000000000e+01 +1.041295000000000082e+00 -4.346875000000000000e+01 +1.041300000000000114e+00 -4.346875000000000000e+01 +1.041305000000000147e+00 -4.346875000000000000e+01 +1.041310000000000180e+00 -4.350000381469726562e+01 +1.041314999999999991e+00 -4.353125000000000000e+01 +1.041320000000000023e+00 -4.353125000000000000e+01 +1.041325000000000056e+00 -4.353125000000000000e+01 +1.041330000000000089e+00 -4.350000381469726562e+01 +1.041335000000000122e+00 -4.350000381469726562e+01 +1.041340000000000154e+00 -4.343750000000000000e+01 +1.041345000000000187e+00 -4.346875000000000000e+01 +1.041349999999999998e+00 -4.346875000000000000e+01 +1.041355000000000031e+00 -4.337500000000000000e+01 +1.041360000000000063e+00 -4.343750000000000000e+01 +1.041365000000000096e+00 -4.350000381469726562e+01 +1.041370000000000129e+00 -4.346875000000000000e+01 +1.041375000000000162e+00 -4.350000381469726562e+01 +1.041380000000000194e+00 -4.346875000000000000e+01 +1.041385000000000005e+00 -4.346875000000000000e+01 +1.041390000000000038e+00 -4.343750000000000000e+01 +1.041395000000000071e+00 -4.350000381469726562e+01 +1.041400000000000103e+00 -4.350000381469726562e+01 +1.041405000000000136e+00 -4.350000381469726562e+01 +1.041410000000000169e+00 -4.343750000000000000e+01 +1.041414999999999980e+00 -4.340625000000000000e+01 +1.041420000000000012e+00 -4.340625000000000000e+01 +1.041425000000000045e+00 -4.343750000000000000e+01 +1.041430000000000078e+00 -4.340625000000000000e+01 +1.041435000000000111e+00 -4.340625000000000000e+01 +1.041440000000000143e+00 -4.343750000000000000e+01 +1.041445000000000176e+00 -4.337500000000000000e+01 +1.041449999999999987e+00 -4.334375381469726562e+01 +1.041455000000000020e+00 -4.337500000000000000e+01 +1.041460000000000052e+00 -4.331250000000000000e+01 +1.041465000000000085e+00 -4.340625000000000000e+01 +1.041470000000000118e+00 -4.337500000000000000e+01 +1.041475000000000151e+00 -4.337500000000000000e+01 +1.041480000000000183e+00 -4.334375381469726562e+01 +1.041484999999999994e+00 -4.337500000000000000e+01 +1.041490000000000027e+00 -4.334375381469726562e+01 +1.041495000000000060e+00 -4.337500000000000000e+01 +1.041500000000000092e+00 -4.334375381469726562e+01 +1.041505000000000125e+00 -4.340625000000000000e+01 +1.041510000000000158e+00 -4.337500000000000000e+01 +1.041515000000000191e+00 -4.334375381469726562e+01 +1.041520000000000001e+00 -4.331250000000000000e+01 +1.041525000000000034e+00 -4.337500000000000000e+01 +1.041530000000000067e+00 -4.334375381469726562e+01 +1.041535000000000100e+00 -4.328125000000000000e+01 +1.041540000000000132e+00 -4.328125000000000000e+01 +1.041545000000000165e+00 -4.328125000000000000e+01 +1.041549999999999976e+00 -4.321875000000000000e+01 +1.041555000000000009e+00 -4.328125000000000000e+01 +1.041560000000000041e+00 -4.331250000000000000e+01 +1.041565000000000074e+00 -4.328125000000000000e+01 +1.041570000000000107e+00 -4.331250000000000000e+01 +1.041575000000000140e+00 -4.321875000000000000e+01 +1.041580000000000172e+00 -4.328125000000000000e+01 +1.041584999999999983e+00 -4.325000381469726562e+01 +1.041590000000000016e+00 -4.328125000000000000e+01 +1.041595000000000049e+00 -4.328125000000000000e+01 +1.041600000000000081e+00 -4.318750381469726562e+01 +1.041605000000000114e+00 -4.328125000000000000e+01 +1.041610000000000147e+00 -4.328125000000000000e+01 +1.041615000000000180e+00 -4.321875000000000000e+01 +1.041619999999999990e+00 -4.318750381469726562e+01 +1.041625000000000023e+00 -4.318750381469726562e+01 +1.041630000000000056e+00 -4.331250000000000000e+01 +1.041635000000000089e+00 -4.318750381469726562e+01 +1.041640000000000121e+00 -4.321875000000000000e+01 +1.041645000000000154e+00 -4.321875000000000000e+01 +1.041650000000000187e+00 -4.325000381469726562e+01 +1.041654999999999998e+00 -4.321875000000000000e+01 +1.041660000000000030e+00 -4.321875000000000000e+01 +1.041665000000000063e+00 -4.325000381469726562e+01 +1.041670000000000096e+00 -4.315625000000000000e+01 +1.041675000000000129e+00 -4.321875000000000000e+01 +1.041680000000000161e+00 -4.315625000000000000e+01 +1.041685000000000194e+00 -4.315625000000000000e+01 +1.041690000000000005e+00 -4.318750381469726562e+01 +1.041695000000000038e+00 -4.321875000000000000e+01 +1.041700000000000070e+00 -4.321875000000000000e+01 +1.041705000000000103e+00 -4.318750381469726562e+01 +1.041710000000000136e+00 -4.318750381469726562e+01 +1.041715000000000169e+00 -4.318750381469726562e+01 +1.041719999999999979e+00 -4.321875000000000000e+01 +1.041725000000000012e+00 -4.318750381469726562e+01 +1.041730000000000045e+00 -4.318750381469726562e+01 +1.041735000000000078e+00 -4.315625000000000000e+01 +1.041740000000000110e+00 -4.318750381469726562e+01 +1.041745000000000143e+00 -4.318750381469726562e+01 +1.041750000000000176e+00 -4.315625000000000000e+01 +1.041754999999999987e+00 -4.318750381469726562e+01 +1.041760000000000019e+00 -4.309375381469726562e+01 +1.041765000000000052e+00 -4.315625000000000000e+01 +1.041770000000000085e+00 -4.315625000000000000e+01 +1.041775000000000118e+00 -4.312500000000000000e+01 +1.041780000000000150e+00 -4.315625000000000000e+01 +1.041785000000000183e+00 -4.312500000000000000e+01 +1.041789999999999994e+00 -4.309375381469726562e+01 +1.041795000000000027e+00 -4.306250000000000000e+01 +1.041800000000000059e+00 -4.315625000000000000e+01 +1.041805000000000092e+00 -4.309375381469726562e+01 +1.041810000000000125e+00 -4.312500000000000000e+01 +1.041815000000000158e+00 -4.309375381469726562e+01 +1.041820000000000190e+00 -4.309375381469726562e+01 +1.041825000000000001e+00 -4.309375381469726562e+01 +1.041830000000000034e+00 -4.306250000000000000e+01 +1.041835000000000067e+00 -4.303125000000000000e+01 +1.041840000000000099e+00 -4.315625000000000000e+01 +1.041845000000000132e+00 -4.306250000000000000e+01 +1.041850000000000165e+00 -4.306250000000000000e+01 +1.041854999999999976e+00 -4.312500000000000000e+01 +1.041860000000000008e+00 -4.306250000000000000e+01 +1.041865000000000041e+00 -4.306250000000000000e+01 +1.041870000000000074e+00 -4.303125000000000000e+01 +1.041875000000000107e+00 -4.300000000000000000e+01 +1.041880000000000139e+00 -4.300000000000000000e+01 +1.041885000000000172e+00 -4.300000000000000000e+01 +1.041889999999999983e+00 -4.300000000000000000e+01 +1.041895000000000016e+00 -4.300000000000000000e+01 +1.041900000000000048e+00 -4.300000000000000000e+01 +1.041905000000000081e+00 -4.293750381469726562e+01 +1.041910000000000114e+00 -4.300000000000000000e+01 +1.041915000000000147e+00 -4.300000000000000000e+01 +1.041920000000000179e+00 -4.296875000000000000e+01 +1.041924999999999990e+00 -4.296875000000000000e+01 +1.041930000000000023e+00 -4.296875000000000000e+01 +1.041935000000000056e+00 -4.296875000000000000e+01 +1.041940000000000088e+00 -4.300000000000000000e+01 +1.041945000000000121e+00 -4.300000000000000000e+01 +1.041950000000000154e+00 -4.303125000000000000e+01 +1.041955000000000187e+00 -4.296875000000000000e+01 +1.041959999999999997e+00 -4.300000000000000000e+01 +1.041965000000000030e+00 -4.296875000000000000e+01 +1.041970000000000063e+00 -4.300000000000000000e+01 +1.041975000000000096e+00 -4.293750381469726562e+01 +1.041980000000000128e+00 -4.300000000000000000e+01 +1.041985000000000161e+00 -4.290625000000000000e+01 +1.041990000000000194e+00 -4.300000000000000000e+01 +1.041995000000000005e+00 -4.293750381469726562e+01 +1.042000000000000037e+00 -4.296875000000000000e+01 +1.042005000000000070e+00 -4.290625000000000000e+01 +1.042010000000000103e+00 -4.290625000000000000e+01 +1.042015000000000136e+00 -4.293750381469726562e+01 +1.042020000000000168e+00 -4.287500000000000000e+01 +1.042024999999999979e+00 -4.293750381469726562e+01 +1.042030000000000012e+00 -4.287500000000000000e+01 +1.042035000000000045e+00 -4.290625000000000000e+01 +1.042040000000000077e+00 -4.290625000000000000e+01 +1.042045000000000110e+00 -4.284375000000000000e+01 +1.042050000000000143e+00 -4.284375000000000000e+01 +1.042055000000000176e+00 -4.290625000000000000e+01 +1.042059999999999986e+00 -4.290625000000000000e+01 +1.042065000000000019e+00 -4.287500000000000000e+01 +1.042070000000000052e+00 -4.284375000000000000e+01 +1.042075000000000085e+00 -4.287500000000000000e+01 +1.042080000000000117e+00 -4.281250000000000000e+01 +1.042085000000000150e+00 -4.281250000000000000e+01 +1.042090000000000183e+00 -4.284375000000000000e+01 +1.042094999999999994e+00 -4.281250000000000000e+01 +1.042100000000000026e+00 -4.281250000000000000e+01 +1.042105000000000059e+00 -4.284375000000000000e+01 +1.042110000000000092e+00 -4.290625000000000000e+01 +1.042115000000000125e+00 -4.281250000000000000e+01 +1.042120000000000157e+00 -4.284375000000000000e+01 +1.042125000000000190e+00 -4.278125381469726562e+01 +1.042130000000000001e+00 -4.284375000000000000e+01 +1.042135000000000034e+00 -4.284375000000000000e+01 +1.042140000000000066e+00 -4.278125381469726562e+01 +1.042145000000000099e+00 -4.278125381469726562e+01 +1.042150000000000132e+00 -4.284375000000000000e+01 +1.042155000000000165e+00 -4.278125381469726562e+01 +1.042159999999999975e+00 -4.275000000000000000e+01 +1.042165000000000008e+00 -4.268750000000000000e+01 +1.042170000000000041e+00 -4.278125381469726562e+01 +1.042175000000000074e+00 -4.271875000000000000e+01 +1.042180000000000106e+00 -4.275000000000000000e+01 +1.042185000000000139e+00 -4.271875000000000000e+01 +1.042190000000000172e+00 -4.275000000000000000e+01 +1.042194999999999983e+00 -4.278125381469726562e+01 +1.042200000000000015e+00 -4.275000000000000000e+01 +1.042205000000000048e+00 -4.278125381469726562e+01 +1.042210000000000081e+00 -4.278125381469726562e+01 +1.042215000000000114e+00 -4.278125381469726562e+01 +1.042220000000000146e+00 -4.271875000000000000e+01 +1.042225000000000179e+00 -4.271875000000000000e+01 +1.042229999999999990e+00 -4.268750000000000000e+01 +1.042235000000000023e+00 -4.271875000000000000e+01 +1.042240000000000055e+00 -4.275000000000000000e+01 +1.042245000000000088e+00 -4.271875000000000000e+01 +1.042250000000000121e+00 -4.265625000000000000e+01 +1.042255000000000154e+00 -4.271875000000000000e+01 +1.042260000000000186e+00 -4.271875000000000000e+01 +1.042264999999999997e+00 -4.265625000000000000e+01 +1.042270000000000030e+00 -4.268750000000000000e+01 +1.042275000000000063e+00 -4.271875000000000000e+01 +1.042280000000000095e+00 -4.271875000000000000e+01 +1.042285000000000128e+00 -4.268750000000000000e+01 +1.042290000000000161e+00 -4.268750000000000000e+01 +1.042295000000000194e+00 -4.271875000000000000e+01 +1.042300000000000004e+00 -4.265625000000000000e+01 +1.042305000000000037e+00 -4.268750000000000000e+01 +1.042310000000000070e+00 -4.265625000000000000e+01 +1.042315000000000103e+00 -4.268750000000000000e+01 +1.042320000000000135e+00 -4.268750000000000000e+01 +1.042325000000000168e+00 -4.265625000000000000e+01 +1.042329999999999979e+00 -4.265625000000000000e+01 +1.042335000000000012e+00 -4.271875000000000000e+01 +1.042340000000000044e+00 -4.265625000000000000e+01 +1.042345000000000077e+00 -4.271875000000000000e+01 +1.042350000000000110e+00 -4.265625000000000000e+01 +1.042355000000000143e+00 -4.265625000000000000e+01 +1.042360000000000175e+00 -4.268750000000000000e+01 +1.042364999999999986e+00 -4.268750000000000000e+01 +1.042370000000000019e+00 -4.265625000000000000e+01 +1.042375000000000052e+00 -4.262500381469726562e+01 +1.042380000000000084e+00 -4.262500381469726562e+01 +1.042385000000000117e+00 -4.262500381469726562e+01 +1.042390000000000150e+00 -4.268750000000000000e+01 +1.042395000000000183e+00 -4.256250000000000000e+01 +1.042399999999999993e+00 -4.259375000000000000e+01 +1.042405000000000026e+00 -4.262500381469726562e+01 +1.042410000000000059e+00 -4.262500381469726562e+01 +1.042415000000000092e+00 -4.262500381469726562e+01 +1.042420000000000124e+00 -4.259375000000000000e+01 +1.042425000000000157e+00 -4.259375000000000000e+01 +1.042430000000000190e+00 -4.259375000000000000e+01 +1.042435000000000000e+00 -4.265625000000000000e+01 +1.042440000000000033e+00 -4.259375000000000000e+01 +1.042445000000000066e+00 -4.253125000000000000e+01 +1.042450000000000099e+00 -4.259375000000000000e+01 +1.042455000000000132e+00 -4.262500381469726562e+01 +1.042460000000000164e+00 -4.256250000000000000e+01 +1.042464999999999975e+00 -4.259375000000000000e+01 +1.042470000000000008e+00 -4.259375000000000000e+01 +1.042475000000000041e+00 -4.256250000000000000e+01 +1.042480000000000073e+00 -4.250000000000000000e+01 +1.042485000000000106e+00 -4.250000000000000000e+01 +1.042490000000000139e+00 -4.250000000000000000e+01 +1.042495000000000172e+00 -4.253125000000000000e+01 +1.042499999999999982e+00 -4.253125000000000000e+01 +1.042505000000000015e+00 -4.253125000000000000e+01 +1.042510000000000048e+00 -4.246875381469726562e+01 +1.042515000000000081e+00 -4.250000000000000000e+01 +1.042520000000000113e+00 -4.246875381469726562e+01 +1.042525000000000146e+00 -4.250000000000000000e+01 +1.042530000000000179e+00 -4.243750000000000000e+01 +1.042534999999999989e+00 -4.250000000000000000e+01 +1.042540000000000022e+00 -4.246875381469726562e+01 +1.042545000000000055e+00 -4.250000000000000000e+01 +1.042550000000000088e+00 -4.246875381469726562e+01 +1.042555000000000121e+00 -4.250000000000000000e+01 +1.042560000000000153e+00 -4.243750000000000000e+01 +1.042565000000000186e+00 -4.240625000000000000e+01 +1.042569999999999997e+00 -4.243750000000000000e+01 +1.042575000000000029e+00 -4.240625000000000000e+01 +1.042580000000000062e+00 -4.243750000000000000e+01 +1.042585000000000095e+00 -4.234375000000000000e+01 +1.042590000000000128e+00 -4.243750000000000000e+01 +1.042595000000000161e+00 -4.243750000000000000e+01 +1.042600000000000193e+00 -4.240625000000000000e+01 +1.042605000000000004e+00 -4.240625000000000000e+01 +1.042610000000000037e+00 -4.234375000000000000e+01 +1.042615000000000069e+00 -4.243750000000000000e+01 +1.042620000000000102e+00 -4.237500381469726562e+01 +1.042625000000000135e+00 -4.240625000000000000e+01 +1.042630000000000168e+00 -4.237500381469726562e+01 +1.042634999999999978e+00 -4.234375000000000000e+01 +1.042640000000000011e+00 -4.240625000000000000e+01 +1.042645000000000044e+00 -4.234375000000000000e+01 +1.042650000000000077e+00 -4.240625000000000000e+01 +1.042655000000000109e+00 -4.231250000000000000e+01 +1.042660000000000142e+00 -4.237500381469726562e+01 +1.042665000000000175e+00 -4.231250000000000000e+01 +1.042669999999999986e+00 -4.240625000000000000e+01 +1.042675000000000018e+00 -4.237500381469726562e+01 +1.042680000000000051e+00 -4.240625000000000000e+01 +1.042685000000000084e+00 -4.234375000000000000e+01 +1.042690000000000117e+00 -4.234375000000000000e+01 +1.042695000000000149e+00 -4.234375000000000000e+01 +1.042700000000000182e+00 -4.231250000000000000e+01 +1.042704999999999993e+00 -4.228125000000000000e+01 +1.042710000000000026e+00 -4.231250000000000000e+01 +1.042715000000000058e+00 -4.228125000000000000e+01 +1.042720000000000091e+00 -4.228125000000000000e+01 +1.042725000000000124e+00 -4.234375000000000000e+01 +1.042730000000000157e+00 -4.228125000000000000e+01 +1.042735000000000190e+00 -4.228125000000000000e+01 +1.042740000000000000e+00 -4.218750000000000000e+01 +1.042745000000000033e+00 -4.221875381469726562e+01 +1.042750000000000066e+00 -4.221875381469726562e+01 +1.042755000000000098e+00 -4.228125000000000000e+01 +1.042760000000000131e+00 -4.221875381469726562e+01 +1.042765000000000164e+00 -4.225000000000000000e+01 +1.042769999999999975e+00 -4.221875381469726562e+01 +1.042775000000000007e+00 -4.218750000000000000e+01 +1.042780000000000040e+00 -4.225000000000000000e+01 +1.042785000000000073e+00 -4.221875381469726562e+01 +1.042790000000000106e+00 -4.225000000000000000e+01 +1.042795000000000138e+00 -4.218750000000000000e+01 +1.042800000000000171e+00 -4.225000000000000000e+01 +1.042804999999999982e+00 -4.218750000000000000e+01 +1.042810000000000015e+00 -4.221875381469726562e+01 +1.042815000000000047e+00 -4.218750000000000000e+01 +1.042820000000000080e+00 -4.218750000000000000e+01 +1.042825000000000113e+00 -4.221875381469726562e+01 +1.042830000000000146e+00 -4.215625000000000000e+01 +1.042835000000000178e+00 -4.215625000000000000e+01 +1.042839999999999989e+00 -4.218750000000000000e+01 +1.042845000000000022e+00 -4.215625000000000000e+01 +1.042850000000000055e+00 -4.215625000000000000e+01 +1.042855000000000087e+00 -4.209375000000000000e+01 +1.042860000000000120e+00 -4.209375000000000000e+01 +1.042865000000000153e+00 -4.212500000000000000e+01 +1.042870000000000186e+00 -4.215625000000000000e+01 +1.042874999999999996e+00 -4.209375000000000000e+01 +1.042880000000000029e+00 -4.206250381469726562e+01 +1.042885000000000062e+00 -4.206250381469726562e+01 +1.042890000000000095e+00 -4.209375000000000000e+01 +1.042895000000000127e+00 -4.209375000000000000e+01 +1.042900000000000160e+00 -4.209375000000000000e+01 +1.042905000000000193e+00 -4.209375000000000000e+01 +1.042910000000000004e+00 -4.206250381469726562e+01 +1.042915000000000036e+00 -4.206250381469726562e+01 +1.042920000000000069e+00 -4.209375000000000000e+01 +1.042925000000000102e+00 -4.206250381469726562e+01 +1.042930000000000135e+00 -4.206250381469726562e+01 +1.042935000000000167e+00 -4.209375000000000000e+01 +1.042939999999999978e+00 -4.209375000000000000e+01 +1.042945000000000011e+00 -4.203125000000000000e+01 +1.042950000000000044e+00 -4.209375000000000000e+01 +1.042955000000000076e+00 -4.203125000000000000e+01 +1.042960000000000109e+00 -4.209375000000000000e+01 +1.042965000000000142e+00 -4.212500000000000000e+01 +1.042970000000000175e+00 -4.203125000000000000e+01 +1.042974999999999985e+00 -4.203125000000000000e+01 +1.042980000000000018e+00 -4.206250381469726562e+01 +1.042985000000000051e+00 -4.203125000000000000e+01 +1.042990000000000084e+00 -4.206250381469726562e+01 +1.042995000000000116e+00 -4.203125000000000000e+01 +1.043000000000000149e+00 -4.200000000000000000e+01 +1.043005000000000182e+00 -4.200000000000000000e+01 +1.043009999999999993e+00 -4.203125000000000000e+01 +1.043015000000000025e+00 -4.203125000000000000e+01 +1.043020000000000058e+00 -4.196875000000000000e+01 +1.043025000000000091e+00 -4.203125000000000000e+01 +1.043030000000000124e+00 -4.200000000000000000e+01 +1.043035000000000156e+00 -4.200000000000000000e+01 +1.043040000000000189e+00 -4.196875000000000000e+01 +1.043045000000000000e+00 -4.196875000000000000e+01 +1.043050000000000033e+00 -4.200000000000000000e+01 +1.043055000000000065e+00 -4.193750000000000000e+01 +1.043060000000000098e+00 -4.196875000000000000e+01 +1.043065000000000131e+00 -4.196875000000000000e+01 +1.043070000000000164e+00 -4.196875000000000000e+01 +1.043074999999999974e+00 -4.196875000000000000e+01 +1.043080000000000007e+00 -4.193750000000000000e+01 +1.043085000000000040e+00 -4.190625381469726562e+01 +1.043090000000000073e+00 -4.196875000000000000e+01 +1.043095000000000105e+00 -4.193750000000000000e+01 +1.043100000000000138e+00 -4.193750000000000000e+01 +1.043105000000000171e+00 -4.193750000000000000e+01 +1.043109999999999982e+00 -4.193750000000000000e+01 +1.043115000000000014e+00 -4.196875000000000000e+01 +1.043120000000000047e+00 -4.193750000000000000e+01 +1.043125000000000080e+00 -4.196875000000000000e+01 +1.043130000000000113e+00 -4.196875000000000000e+01 +1.043135000000000145e+00 -4.200000000000000000e+01 +1.043140000000000178e+00 -4.193750000000000000e+01 +1.043144999999999989e+00 -4.193750000000000000e+01 +1.043150000000000022e+00 -4.196875000000000000e+01 +1.043155000000000054e+00 -4.196875000000000000e+01 +1.043160000000000087e+00 -4.190625381469726562e+01 +1.043165000000000120e+00 -4.193750000000000000e+01 +1.043170000000000153e+00 -4.193750000000000000e+01 +1.043175000000000185e+00 -4.196875000000000000e+01 +1.043179999999999996e+00 -4.193750000000000000e+01 +1.043185000000000029e+00 -4.196875000000000000e+01 +1.043190000000000062e+00 -4.190625381469726562e+01 +1.043195000000000094e+00 -4.190625381469726562e+01 +1.043200000000000127e+00 -4.200000000000000000e+01 +1.043205000000000160e+00 -4.193750000000000000e+01 +1.043210000000000193e+00 -4.193750000000000000e+01 +1.043215000000000003e+00 -4.193750000000000000e+01 +1.043220000000000036e+00 -4.196875000000000000e+01 +1.043225000000000069e+00 -4.187500000000000000e+01 +1.043230000000000102e+00 -4.187500000000000000e+01 +1.043235000000000134e+00 -4.187500000000000000e+01 +1.043240000000000167e+00 -4.187500000000000000e+01 +1.043244999999999978e+00 -4.181250000000000000e+01 +1.043250000000000011e+00 -4.181250000000000000e+01 +1.043255000000000043e+00 -4.187500000000000000e+01 +1.043260000000000076e+00 -4.184375000000000000e+01 +1.043265000000000109e+00 -4.184375000000000000e+01 +1.043270000000000142e+00 -4.184375000000000000e+01 +1.043275000000000174e+00 -4.187500000000000000e+01 +1.043279999999999985e+00 -4.190625381469726562e+01 +1.043285000000000018e+00 -4.181250000000000000e+01 +1.043290000000000051e+00 -4.184375000000000000e+01 +1.043295000000000083e+00 -4.181250000000000000e+01 +1.043300000000000116e+00 -4.178125000000000000e+01 +1.043305000000000149e+00 -4.171875000000000000e+01 +1.043310000000000182e+00 -4.178125000000000000e+01 +1.043314999999999992e+00 -4.178125000000000000e+01 +1.043320000000000025e+00 -4.175000381469726562e+01 +1.043325000000000058e+00 -4.178125000000000000e+01 +1.043330000000000091e+00 -4.178125000000000000e+01 +1.043335000000000123e+00 -4.181250000000000000e+01 +1.043340000000000156e+00 -4.175000381469726562e+01 +1.043345000000000189e+00 -4.171875000000000000e+01 +1.043350000000000000e+00 -4.181250000000000000e+01 +1.043355000000000032e+00 -4.178125000000000000e+01 +1.043360000000000065e+00 -4.171875000000000000e+01 +1.043365000000000098e+00 -4.178125000000000000e+01 +1.043370000000000131e+00 -4.171875000000000000e+01 +1.043375000000000163e+00 -4.175000381469726562e+01 +1.043380000000000196e+00 -4.171875000000000000e+01 +1.043385000000000007e+00 -4.175000381469726562e+01 +1.043390000000000040e+00 -4.168750000000000000e+01 +1.043395000000000072e+00 -4.171875000000000000e+01 +1.043400000000000105e+00 -4.171875000000000000e+01 +1.043405000000000138e+00 -4.168750000000000000e+01 +1.043410000000000171e+00 -4.168750000000000000e+01 +1.043414999999999981e+00 -4.168750000000000000e+01 +1.043420000000000014e+00 -4.168750000000000000e+01 +1.043425000000000047e+00 -4.171875000000000000e+01 +1.043430000000000080e+00 -4.171875000000000000e+01 +1.043435000000000112e+00 -4.171875000000000000e+01 +1.043440000000000145e+00 -4.168750000000000000e+01 +1.043445000000000178e+00 -4.168750000000000000e+01 +1.043449999999999989e+00 -4.165625381469726562e+01 +1.043455000000000021e+00 -4.168750000000000000e+01 +1.043460000000000054e+00 -4.162500000000000000e+01 +1.043465000000000087e+00 -4.162500000000000000e+01 +1.043470000000000120e+00 -4.168750000000000000e+01 +1.043475000000000152e+00 -4.165625381469726562e+01 +1.043480000000000185e+00 -4.162500000000000000e+01 +1.043484999999999996e+00 -4.162500000000000000e+01 +1.043490000000000029e+00 -4.159375000000000000e+01 +1.043495000000000061e+00 -4.159375000000000000e+01 +1.043500000000000094e+00 -4.156250000000000000e+01 +1.043505000000000127e+00 -4.159375000000000000e+01 +1.043510000000000160e+00 -4.156250000000000000e+01 +1.043515000000000192e+00 -4.159375000000000000e+01 +1.043520000000000003e+00 -4.162500000000000000e+01 +1.043525000000000036e+00 -4.153125000000000000e+01 +1.043530000000000069e+00 -4.165625381469726562e+01 +1.043535000000000101e+00 -4.159375000000000000e+01 +1.043540000000000134e+00 -4.156250000000000000e+01 +1.043545000000000167e+00 -4.153125000000000000e+01 +1.043549999999999978e+00 -4.153125000000000000e+01 +1.043555000000000010e+00 -4.159375000000000000e+01 +1.043560000000000043e+00 -4.156250000000000000e+01 +1.043565000000000076e+00 -4.150000381469726562e+01 +1.043570000000000109e+00 -4.150000381469726562e+01 +1.043575000000000141e+00 -4.150000381469726562e+01 +1.043580000000000174e+00 -4.153125000000000000e+01 +1.043584999999999985e+00 -4.150000381469726562e+01 +1.043590000000000018e+00 -4.150000381469726562e+01 +1.043595000000000050e+00 -4.150000381469726562e+01 +1.043600000000000083e+00 -4.150000381469726562e+01 +1.043605000000000116e+00 -4.150000381469726562e+01 +1.043610000000000149e+00 -4.150000381469726562e+01 +1.043615000000000181e+00 -4.143750000000000000e+01 +1.043619999999999992e+00 -4.146875000000000000e+01 +1.043625000000000025e+00 -4.146875000000000000e+01 +1.043630000000000058e+00 -4.143750000000000000e+01 +1.043635000000000090e+00 -4.143750000000000000e+01 +1.043640000000000123e+00 -4.150000381469726562e+01 +1.043645000000000156e+00 -4.143750000000000000e+01 +1.043650000000000189e+00 -4.146875000000000000e+01 +1.043654999999999999e+00 -4.143750000000000000e+01 +1.043660000000000032e+00 -4.150000381469726562e+01 +1.043665000000000065e+00 -4.143750000000000000e+01 +1.043670000000000098e+00 -4.150000381469726562e+01 +1.043675000000000130e+00 -4.150000381469726562e+01 +1.043680000000000163e+00 -4.146875000000000000e+01 +1.043685000000000196e+00 -4.150000381469726562e+01 +1.043690000000000007e+00 -4.143750000000000000e+01 +1.043695000000000039e+00 -4.153125000000000000e+01 +1.043700000000000072e+00 -4.146875000000000000e+01 +1.043705000000000105e+00 -4.143750000000000000e+01 +1.043710000000000138e+00 -4.146875000000000000e+01 +1.043715000000000170e+00 -4.146875000000000000e+01 +1.043719999999999981e+00 -4.143750000000000000e+01 +1.043725000000000014e+00 -4.143750000000000000e+01 +1.043730000000000047e+00 -4.146875000000000000e+01 +1.043735000000000079e+00 -4.146875000000000000e+01 +1.043740000000000112e+00 -4.146875000000000000e+01 +1.043745000000000145e+00 -4.143750000000000000e+01 +1.043750000000000178e+00 -4.150000381469726562e+01 +1.043754999999999988e+00 -4.146875000000000000e+01 +1.043760000000000021e+00 -4.146875000000000000e+01 +1.043765000000000054e+00 -4.146875000000000000e+01 +1.043770000000000087e+00 -4.140625000000000000e+01 +1.043775000000000119e+00 -4.140625000000000000e+01 +1.043780000000000152e+00 -4.137500000000000000e+01 +1.043785000000000185e+00 -4.137500000000000000e+01 +1.043789999999999996e+00 -4.137500000000000000e+01 +1.043795000000000028e+00 -4.140625000000000000e+01 +1.043800000000000061e+00 -4.140625000000000000e+01 +1.043805000000000094e+00 -4.137500000000000000e+01 +1.043810000000000127e+00 -4.140625000000000000e+01 +1.043815000000000159e+00 -4.137500000000000000e+01 +1.043820000000000192e+00 -4.140625000000000000e+01 +1.043825000000000003e+00 -4.137500000000000000e+01 +1.043830000000000036e+00 -4.140625000000000000e+01 +1.043835000000000068e+00 -4.140625000000000000e+01 +1.043840000000000101e+00 -4.137500000000000000e+01 +1.043845000000000134e+00 -4.134375381469726562e+01 +1.043850000000000167e+00 -4.134375381469726562e+01 +1.043854999999999977e+00 -4.140625000000000000e+01 +1.043860000000000010e+00 -4.134375381469726562e+01 +1.043865000000000043e+00 -4.137500000000000000e+01 +1.043870000000000076e+00 -4.134375381469726562e+01 +1.043875000000000108e+00 -4.137500000000000000e+01 +1.043880000000000141e+00 -4.137500000000000000e+01 +1.043885000000000174e+00 -4.134375381469726562e+01 +1.043889999999999985e+00 -4.137500000000000000e+01 +1.043895000000000017e+00 -4.131250000000000000e+01 +1.043900000000000050e+00 -4.137500000000000000e+01 +1.043905000000000083e+00 -4.137500000000000000e+01 +1.043910000000000116e+00 -4.131250000000000000e+01 +1.043915000000000148e+00 -4.134375381469726562e+01 +1.043920000000000181e+00 -4.131250000000000000e+01 +1.043924999999999992e+00 -4.131250000000000000e+01 +1.043930000000000025e+00 -4.134375381469726562e+01 +1.043935000000000057e+00 -4.140625000000000000e+01 +1.043940000000000090e+00 -4.131250000000000000e+01 +1.043945000000000123e+00 -4.137500000000000000e+01 +1.043950000000000156e+00 -4.134375381469726562e+01 +1.043955000000000188e+00 -4.134375381469726562e+01 +1.043959999999999999e+00 -4.131250000000000000e+01 +1.043965000000000032e+00 -4.131250000000000000e+01 +1.043970000000000065e+00 -4.131250000000000000e+01 +1.043975000000000097e+00 -4.128125000000000000e+01 +1.043980000000000130e+00 -4.134375381469726562e+01 +1.043985000000000163e+00 -4.128125000000000000e+01 +1.043990000000000196e+00 -4.131250000000000000e+01 +1.043995000000000006e+00 -4.131250000000000000e+01 +1.044000000000000039e+00 -4.128125000000000000e+01 +1.044005000000000072e+00 -4.125000000000000000e+01 +1.044010000000000105e+00 -4.128125000000000000e+01 +1.044015000000000137e+00 -4.125000000000000000e+01 +1.044020000000000170e+00 -4.128125000000000000e+01 +1.044024999999999981e+00 -4.134375381469726562e+01 +1.044030000000000014e+00 -4.125000000000000000e+01 +1.044035000000000046e+00 -4.128125000000000000e+01 +1.044040000000000079e+00 -4.118750381469726562e+01 +1.044045000000000112e+00 -4.125000000000000000e+01 +1.044050000000000145e+00 -4.121875000000000000e+01 +1.044055000000000177e+00 -4.128125000000000000e+01 +1.044059999999999988e+00 -4.121875000000000000e+01 +1.044065000000000021e+00 -4.118750381469726562e+01 +1.044070000000000054e+00 -4.121875000000000000e+01 +1.044075000000000086e+00 -4.118750381469726562e+01 +1.044080000000000119e+00 -4.112500000000000000e+01 +1.044085000000000152e+00 -4.118750381469726562e+01 +1.044090000000000185e+00 -4.115625000000000000e+01 +1.044094999999999995e+00 -4.115625000000000000e+01 +1.044100000000000028e+00 -4.121875000000000000e+01 +1.044105000000000061e+00 -4.112500000000000000e+01 +1.044110000000000094e+00 -4.115625000000000000e+01 +1.044115000000000126e+00 -4.118750381469726562e+01 +1.044120000000000159e+00 -4.115625000000000000e+01 +1.044125000000000192e+00 -4.115625000000000000e+01 +1.044130000000000003e+00 -4.118750381469726562e+01 +1.044135000000000035e+00 -4.121875000000000000e+01 +1.044140000000000068e+00 -4.112500000000000000e+01 +1.044145000000000101e+00 -4.118750381469726562e+01 +1.044150000000000134e+00 -4.115625000000000000e+01 +1.044155000000000166e+00 -4.115625000000000000e+01 +1.044159999999999977e+00 -4.115625000000000000e+01 +1.044165000000000010e+00 -4.109375000000000000e+01 +1.044170000000000043e+00 -4.112500000000000000e+01 +1.044175000000000075e+00 -4.115625000000000000e+01 +1.044180000000000108e+00 -4.115625000000000000e+01 +1.044185000000000141e+00 -4.118750381469726562e+01 +1.044190000000000174e+00 -4.109375000000000000e+01 +1.044194999999999984e+00 -4.106250000000000000e+01 +1.044200000000000017e+00 -4.115625000000000000e+01 +1.044205000000000050e+00 -4.109375000000000000e+01 +1.044210000000000083e+00 -4.115625000000000000e+01 +1.044215000000000115e+00 -4.106250000000000000e+01 +1.044220000000000148e+00 -4.115625000000000000e+01 +1.044225000000000181e+00 -4.112500000000000000e+01 +1.044229999999999992e+00 -4.106250000000000000e+01 +1.044235000000000024e+00 -4.106250000000000000e+01 +1.044240000000000057e+00 -4.106250000000000000e+01 +1.044245000000000090e+00 -4.106250000000000000e+01 +1.044250000000000123e+00 -4.109375000000000000e+01 +1.044255000000000155e+00 -4.103125381469726562e+01 +1.044260000000000188e+00 -4.106250000000000000e+01 +1.044264999999999999e+00 -4.103125381469726562e+01 +1.044270000000000032e+00 -4.106250000000000000e+01 +1.044275000000000064e+00 -4.103125381469726562e+01 +1.044280000000000097e+00 -4.103125381469726562e+01 +1.044285000000000130e+00 -4.100000000000000000e+01 +1.044290000000000163e+00 -4.103125381469726562e+01 +1.044295000000000195e+00 -4.106250000000000000e+01 +1.044300000000000006e+00 -4.103125381469726562e+01 +1.044305000000000039e+00 -4.100000000000000000e+01 +1.044310000000000072e+00 -4.100000000000000000e+01 +1.044315000000000104e+00 -4.103125381469726562e+01 +1.044320000000000137e+00 -4.103125381469726562e+01 +1.044325000000000170e+00 -4.103125381469726562e+01 +1.044329999999999981e+00 -4.103125381469726562e+01 +1.044335000000000013e+00 -4.100000000000000000e+01 +1.044340000000000046e+00 -4.100000000000000000e+01 +1.044345000000000079e+00 -4.093750381469726562e+01 +1.044350000000000112e+00 -4.100000000000000000e+01 +1.044355000000000144e+00 -4.087500381469726562e+01 +1.044360000000000177e+00 -4.096875000000000000e+01 +1.044364999999999988e+00 -4.100000000000000000e+01 +1.044370000000000021e+00 -4.096875000000000000e+01 +1.044375000000000053e+00 -4.093750381469726562e+01 +1.044380000000000086e+00 -4.093750381469726562e+01 +1.044385000000000119e+00 -4.090625000000000000e+01 +1.044390000000000152e+00 -4.096875000000000000e+01 +1.044395000000000184e+00 -4.093750381469726562e+01 +1.044399999999999995e+00 -4.090625000000000000e+01 +1.044405000000000028e+00 -4.093750381469726562e+01 +1.044410000000000061e+00 -4.096875000000000000e+01 +1.044415000000000093e+00 -4.093750381469726562e+01 +1.044420000000000126e+00 -4.093750381469726562e+01 +1.044425000000000159e+00 -4.093750381469726562e+01 +1.044430000000000192e+00 -4.087500381469726562e+01 +1.044435000000000002e+00 -4.090625000000000000e+01 +1.044440000000000035e+00 -4.084375000000000000e+01 +1.044445000000000068e+00 -4.093750381469726562e+01 +1.044450000000000101e+00 -4.090625000000000000e+01 +1.044455000000000133e+00 -4.096875000000000000e+01 +1.044460000000000166e+00 -4.090625000000000000e+01 +1.044464999999999977e+00 -4.090625000000000000e+01 +1.044470000000000010e+00 -4.093750381469726562e+01 +1.044475000000000042e+00 -4.090625000000000000e+01 +1.044480000000000075e+00 -4.087500381469726562e+01 +1.044485000000000108e+00 -4.096875000000000000e+01 +1.044490000000000141e+00 -4.096875000000000000e+01 +1.044495000000000173e+00 -4.093750381469726562e+01 +1.044499999999999984e+00 -4.093750381469726562e+01 +1.044505000000000017e+00 -4.090625000000000000e+01 +1.044510000000000050e+00 -4.093750381469726562e+01 +1.044515000000000082e+00 -4.087500381469726562e+01 +1.044520000000000115e+00 -4.090625000000000000e+01 +1.044525000000000148e+00 -4.087500381469726562e+01 +1.044530000000000181e+00 -4.090625000000000000e+01 +1.044534999999999991e+00 -4.087500381469726562e+01 +1.044540000000000024e+00 -4.087500381469726562e+01 +1.044545000000000057e+00 -4.090625000000000000e+01 +1.044550000000000090e+00 -4.084375000000000000e+01 +1.044555000000000122e+00 -4.090625000000000000e+01 +1.044560000000000155e+00 -4.090625000000000000e+01 +1.044565000000000188e+00 -4.075000000000000000e+01 +1.044569999999999999e+00 -4.081250000000000000e+01 +1.044575000000000031e+00 -4.084375000000000000e+01 +1.044580000000000064e+00 -4.078125381469726562e+01 +1.044585000000000097e+00 -4.078125381469726562e+01 +1.044590000000000130e+00 -4.081250000000000000e+01 +1.044595000000000162e+00 -4.078125381469726562e+01 +1.044600000000000195e+00 -4.078125381469726562e+01 +1.044605000000000006e+00 -4.078125381469726562e+01 +1.044610000000000039e+00 -4.081250000000000000e+01 +1.044615000000000071e+00 -4.081250000000000000e+01 +1.044620000000000104e+00 -4.078125381469726562e+01 +1.044625000000000137e+00 -4.084375000000000000e+01 +1.044630000000000170e+00 -4.078125381469726562e+01 +1.044634999999999980e+00 -4.081250000000000000e+01 +1.044640000000000013e+00 -4.084375000000000000e+01 +1.044645000000000046e+00 -4.081250000000000000e+01 +1.044650000000000079e+00 -4.081250000000000000e+01 +1.044655000000000111e+00 -4.078125381469726562e+01 +1.044660000000000144e+00 -4.078125381469726562e+01 +1.044665000000000177e+00 -4.081250000000000000e+01 +1.044669999999999987e+00 -4.071875000000000000e+01 +1.044675000000000020e+00 -4.075000000000000000e+01 +1.044680000000000053e+00 -4.075000000000000000e+01 +1.044685000000000086e+00 -4.071875000000000000e+01 +1.044690000000000119e+00 -4.078125381469726562e+01 +1.044695000000000151e+00 -4.071875000000000000e+01 +1.044700000000000184e+00 -4.071875000000000000e+01 +1.044704999999999995e+00 -4.065625000000000000e+01 +1.044710000000000027e+00 -4.068750000000000000e+01 +1.044715000000000060e+00 -4.071875000000000000e+01 +1.044720000000000093e+00 -4.068750000000000000e+01 +1.044725000000000126e+00 -4.068750000000000000e+01 +1.044730000000000159e+00 -4.068750000000000000e+01 +1.044735000000000191e+00 -4.065625000000000000e+01 +1.044740000000000002e+00 -4.071875000000000000e+01 +1.044745000000000035e+00 -4.065625000000000000e+01 +1.044750000000000068e+00 -4.059375000000000000e+01 +1.044755000000000100e+00 -4.062500381469726562e+01 +1.044760000000000133e+00 -4.065625000000000000e+01 +1.044765000000000166e+00 -4.068750000000000000e+01 +1.044769999999999976e+00 -4.068750000000000000e+01 +1.044775000000000009e+00 -4.065625000000000000e+01 +1.044780000000000042e+00 -4.062500381469726562e+01 +1.044785000000000075e+00 -4.065625000000000000e+01 +1.044790000000000108e+00 -4.062500381469726562e+01 +1.044795000000000140e+00 -4.062500381469726562e+01 +1.044800000000000173e+00 -4.068750000000000000e+01 +1.044804999999999984e+00 -4.065625000000000000e+01 +1.044810000000000016e+00 -4.065625000000000000e+01 +1.044815000000000049e+00 -4.062500381469726562e+01 +1.044820000000000082e+00 -4.056250000000000000e+01 +1.044825000000000115e+00 -4.062500381469726562e+01 +1.044830000000000148e+00 -4.062500381469726562e+01 +1.044835000000000180e+00 -4.059375000000000000e+01 +1.044839999999999991e+00 -4.056250000000000000e+01 +1.044845000000000024e+00 -4.059375000000000000e+01 +1.044850000000000056e+00 -4.056250000000000000e+01 +1.044855000000000089e+00 -4.059375000000000000e+01 +1.044860000000000122e+00 -4.065625000000000000e+01 +1.044865000000000155e+00 -4.056250000000000000e+01 +1.044870000000000188e+00 -4.062500381469726562e+01 +1.044874999999999998e+00 -4.062500381469726562e+01 +1.044880000000000031e+00 -4.059375000000000000e+01 +1.044885000000000064e+00 -4.053125000000000000e+01 +1.044890000000000096e+00 -4.056250000000000000e+01 +1.044895000000000129e+00 -4.053125000000000000e+01 +1.044900000000000162e+00 -4.056250000000000000e+01 +1.044905000000000195e+00 -4.050000000000000000e+01 +1.044910000000000005e+00 -4.059375000000000000e+01 +1.044915000000000038e+00 -4.050000000000000000e+01 +1.044920000000000071e+00 -4.053125000000000000e+01 +1.044925000000000104e+00 -4.053125000000000000e+01 +1.044930000000000136e+00 -4.050000000000000000e+01 +1.044935000000000169e+00 -4.053125000000000000e+01 +1.044939999999999980e+00 -4.053125000000000000e+01 +1.044945000000000013e+00 -4.053125000000000000e+01 +1.044950000000000045e+00 -4.050000000000000000e+01 +1.044955000000000078e+00 -4.046875381469726562e+01 +1.044960000000000111e+00 -4.046875381469726562e+01 +1.044965000000000144e+00 -4.043750000000000000e+01 +1.044970000000000176e+00 -4.050000000000000000e+01 +1.044974999999999987e+00 -4.043750000000000000e+01 +1.044980000000000020e+00 -4.046875381469726562e+01 +1.044985000000000053e+00 -4.050000000000000000e+01 +1.044990000000000085e+00 -4.046875381469726562e+01 +1.044995000000000118e+00 -4.050000000000000000e+01 +1.045000000000000151e+00 -4.037500000000000000e+01 +1.045005000000000184e+00 -4.040625000000000000e+01 +1.045009999999999994e+00 -4.043750000000000000e+01 +1.045015000000000027e+00 -4.037500000000000000e+01 +1.045020000000000060e+00 -4.037500000000000000e+01 +1.045025000000000093e+00 -4.037500000000000000e+01 +1.045030000000000125e+00 -4.040625000000000000e+01 +1.045035000000000158e+00 -4.034375000000000000e+01 +1.045040000000000191e+00 -4.037500000000000000e+01 +1.045045000000000002e+00 -4.034375000000000000e+01 +1.045050000000000034e+00 -4.034375000000000000e+01 +1.045055000000000067e+00 -4.031250381469726562e+01 +1.045060000000000100e+00 -4.031250381469726562e+01 +1.045065000000000133e+00 -4.028125000000000000e+01 +1.045070000000000165e+00 -4.028125000000000000e+01 +1.045074999999999976e+00 -4.031250381469726562e+01 +1.045080000000000009e+00 -4.028125000000000000e+01 +1.045085000000000042e+00 -4.028125000000000000e+01 +1.045090000000000074e+00 -4.031250381469726562e+01 +1.045095000000000107e+00 -4.031250381469726562e+01 +1.045100000000000140e+00 -4.031250381469726562e+01 +1.045105000000000173e+00 -4.034375000000000000e+01 +1.045109999999999983e+00 -4.025000000000000000e+01 +1.045115000000000016e+00 -4.028125000000000000e+01 +1.045120000000000049e+00 -4.028125000000000000e+01 +1.045125000000000082e+00 -4.025000000000000000e+01 +1.045130000000000114e+00 -4.025000000000000000e+01 +1.045135000000000147e+00 -4.028125000000000000e+01 +1.045140000000000180e+00 -4.028125000000000000e+01 +1.045144999999999991e+00 -4.028125000000000000e+01 +1.045150000000000023e+00 -4.025000000000000000e+01 +1.045155000000000056e+00 -4.031250381469726562e+01 +1.045160000000000089e+00 -4.028125000000000000e+01 +1.045165000000000122e+00 -4.025000000000000000e+01 +1.045170000000000154e+00 -4.025000000000000000e+01 +1.045175000000000187e+00 -4.021875000000000000e+01 +1.045179999999999998e+00 -4.028125000000000000e+01 +1.045185000000000031e+00 -4.028125000000000000e+01 +1.045190000000000063e+00 -4.021875000000000000e+01 +1.045195000000000096e+00 -4.025000000000000000e+01 +1.045200000000000129e+00 -4.021875000000000000e+01 +1.045205000000000162e+00 -4.018750000000000000e+01 +1.045210000000000194e+00 -4.028125000000000000e+01 +1.045215000000000005e+00 -4.021875000000000000e+01 +1.045220000000000038e+00 -4.028125000000000000e+01 +1.045225000000000071e+00 -4.018750000000000000e+01 +1.045230000000000103e+00 -4.021875000000000000e+01 +1.045235000000000136e+00 -4.015625381469726562e+01 +1.045240000000000169e+00 -4.018750000000000000e+01 +1.045244999999999980e+00 -4.009375000000000000e+01 +1.045250000000000012e+00 -4.015625381469726562e+01 +1.045255000000000045e+00 -4.021875000000000000e+01 +1.045260000000000078e+00 -4.018750000000000000e+01 +1.045265000000000111e+00 -4.018750000000000000e+01 +1.045270000000000143e+00 -4.015625381469726562e+01 +1.045275000000000176e+00 -4.012500000000000000e+01 +1.045279999999999987e+00 -4.015625381469726562e+01 +1.045285000000000020e+00 -4.012500000000000000e+01 +1.045290000000000052e+00 -4.009375000000000000e+01 +1.045295000000000085e+00 -4.012500000000000000e+01 +1.045300000000000118e+00 -4.012500000000000000e+01 +1.045305000000000151e+00 -4.009375000000000000e+01 +1.045310000000000183e+00 -4.006250381469726562e+01 +1.045314999999999994e+00 -4.009375000000000000e+01 +1.045320000000000027e+00 -4.009375000000000000e+01 +1.045325000000000060e+00 -4.012500000000000000e+01 +1.045330000000000092e+00 -4.012500000000000000e+01 +1.045335000000000125e+00 -4.012500000000000000e+01 +1.045340000000000158e+00 -4.009375000000000000e+01 +1.045345000000000191e+00 -4.009375000000000000e+01 +1.045350000000000001e+00 -4.009375000000000000e+01 +1.045355000000000034e+00 -4.009375000000000000e+01 +1.045360000000000067e+00 -4.006250381469726562e+01 +1.045365000000000100e+00 -4.003125000000000000e+01 +1.045370000000000132e+00 -4.009375000000000000e+01 +1.045375000000000165e+00 -4.012500000000000000e+01 +1.045379999999999976e+00 -4.009375000000000000e+01 +1.045385000000000009e+00 -4.003125000000000000e+01 +1.045390000000000041e+00 -4.006250381469726562e+01 +1.045395000000000074e+00 -4.009375000000000000e+01 +1.045400000000000107e+00 -4.003125000000000000e+01 +1.045405000000000140e+00 -4.003125000000000000e+01 +1.045410000000000172e+00 -4.006250381469726562e+01 +1.045414999999999983e+00 -4.009375000000000000e+01 +1.045420000000000016e+00 -4.003125000000000000e+01 +1.045425000000000049e+00 -4.006250381469726562e+01 +1.045430000000000081e+00 -4.003125000000000000e+01 +1.045435000000000114e+00 -4.003125000000000000e+01 +1.045440000000000147e+00 -4.006250381469726562e+01 +1.045445000000000180e+00 -4.000000000000000000e+01 +1.045449999999999990e+00 -4.000000000000000000e+01 +1.045455000000000023e+00 -3.996875000000000000e+01 +1.045460000000000056e+00 -3.993750000000000000e+01 +1.045465000000000089e+00 -4.003125000000000000e+01 +1.045470000000000121e+00 -4.000000000000000000e+01 +1.045475000000000154e+00 -3.993750000000000000e+01 +1.045480000000000187e+00 -3.993750000000000000e+01 +1.045484999999999998e+00 -3.993750000000000000e+01 +1.045490000000000030e+00 -3.990625381469726562e+01 +1.045495000000000063e+00 -3.996875000000000000e+01 +1.045500000000000096e+00 -3.990625381469726562e+01 +1.045505000000000129e+00 -3.990625381469726562e+01 +1.045510000000000161e+00 -3.990625381469726562e+01 +1.045515000000000194e+00 -3.987500000000000000e+01 +1.045520000000000005e+00 -3.993750000000000000e+01 +1.045525000000000038e+00 -3.987500000000000000e+01 +1.045530000000000070e+00 -3.996875000000000000e+01 +1.045535000000000103e+00 -3.996875000000000000e+01 +1.045540000000000136e+00 -3.987500000000000000e+01 +1.045545000000000169e+00 -3.993750000000000000e+01 +1.045549999999999979e+00 -4.003125000000000000e+01 +1.045555000000000012e+00 -3.987500000000000000e+01 +1.045560000000000045e+00 -4.000000000000000000e+01 +1.045565000000000078e+00 -3.987500000000000000e+01 +1.045570000000000110e+00 -3.993750000000000000e+01 +1.045575000000000143e+00 -3.990625381469726562e+01 +1.045580000000000176e+00 -3.987500000000000000e+01 +1.045584999999999987e+00 -3.993750000000000000e+01 +1.045590000000000019e+00 -3.990625381469726562e+01 +1.045595000000000052e+00 -3.987500000000000000e+01 +1.045600000000000085e+00 -3.993750000000000000e+01 +1.045605000000000118e+00 -3.987500000000000000e+01 +1.045610000000000150e+00 -3.984375000000000000e+01 +1.045615000000000183e+00 -3.987500000000000000e+01 +1.045619999999999994e+00 -3.984375000000000000e+01 +1.045625000000000027e+00 -3.987500000000000000e+01 +1.045630000000000059e+00 -3.987500000000000000e+01 +1.045635000000000092e+00 -3.987500000000000000e+01 +1.045640000000000125e+00 -3.984375000000000000e+01 +1.045645000000000158e+00 -3.987500000000000000e+01 +1.045650000000000190e+00 -3.984375000000000000e+01 +1.045655000000000001e+00 -3.984375000000000000e+01 +1.045660000000000034e+00 -3.984375000000000000e+01 +1.045665000000000067e+00 -3.987500000000000000e+01 +1.045670000000000099e+00 -3.987500000000000000e+01 +1.045675000000000132e+00 -3.987500000000000000e+01 +1.045680000000000165e+00 -3.978125000000000000e+01 +1.045684999999999976e+00 -3.981250000000000000e+01 +1.045690000000000008e+00 -3.987500000000000000e+01 +1.045695000000000041e+00 -3.987500000000000000e+01 +1.045700000000000074e+00 -3.984375000000000000e+01 +1.045705000000000107e+00 -3.984375000000000000e+01 +1.045710000000000139e+00 -3.987500000000000000e+01 +1.045715000000000172e+00 -3.978125000000000000e+01 +1.045719999999999983e+00 -3.975000381469726562e+01 +1.045725000000000016e+00 -3.981250000000000000e+01 +1.045730000000000048e+00 -3.984375000000000000e+01 +1.045735000000000081e+00 -3.978125000000000000e+01 +1.045740000000000114e+00 -3.981250000000000000e+01 +1.045745000000000147e+00 -3.978125000000000000e+01 +1.045750000000000179e+00 -3.987500000000000000e+01 +1.045754999999999990e+00 -3.984375000000000000e+01 +1.045760000000000023e+00 -3.984375000000000000e+01 +1.045765000000000056e+00 -3.990625381469726562e+01 +1.045770000000000088e+00 -3.981250000000000000e+01 +1.045775000000000121e+00 -3.978125000000000000e+01 +1.045780000000000154e+00 -3.984375000000000000e+01 +1.045785000000000187e+00 -3.981250000000000000e+01 +1.045789999999999997e+00 -3.978125000000000000e+01 +1.045795000000000030e+00 -3.975000381469726562e+01 +1.045800000000000063e+00 -3.968750000000000000e+01 +1.045805000000000096e+00 -3.978125000000000000e+01 +1.045810000000000128e+00 -3.981250000000000000e+01 +1.045815000000000161e+00 -3.978125000000000000e+01 +1.045820000000000194e+00 -3.971875000000000000e+01 +1.045825000000000005e+00 -3.984375000000000000e+01 +1.045830000000000037e+00 -3.978125000000000000e+01 +1.045835000000000070e+00 -3.978125000000000000e+01 +1.045840000000000103e+00 -3.975000381469726562e+01 +1.045845000000000136e+00 -3.975000381469726562e+01 +1.045850000000000168e+00 -3.971875000000000000e+01 +1.045854999999999979e+00 -3.975000381469726562e+01 +1.045860000000000012e+00 -3.975000381469726562e+01 +1.045865000000000045e+00 -3.975000381469726562e+01 +1.045870000000000077e+00 -3.971875000000000000e+01 +1.045875000000000110e+00 -3.975000381469726562e+01 +1.045880000000000143e+00 -3.975000381469726562e+01 +1.045885000000000176e+00 -3.975000381469726562e+01 +1.045889999999999986e+00 -3.965625000000000000e+01 +1.045895000000000019e+00 -3.978125000000000000e+01 +1.045900000000000052e+00 -3.971875000000000000e+01 +1.045905000000000085e+00 -3.975000381469726562e+01 +1.045910000000000117e+00 -3.965625000000000000e+01 +1.045915000000000150e+00 -3.968750000000000000e+01 +1.045920000000000183e+00 -3.971875000000000000e+01 +1.045924999999999994e+00 -3.971875000000000000e+01 +1.045930000000000026e+00 -3.962500000000000000e+01 +1.045935000000000059e+00 -3.959375381469726562e+01 +1.045940000000000092e+00 -3.971875000000000000e+01 +1.045945000000000125e+00 -3.956250000000000000e+01 +1.045950000000000157e+00 -3.968750000000000000e+01 +1.045955000000000190e+00 -3.965625000000000000e+01 +1.045960000000000001e+00 -3.962500000000000000e+01 +1.045965000000000034e+00 -3.962500000000000000e+01 +1.045970000000000066e+00 -3.962500000000000000e+01 +1.045975000000000099e+00 -3.956250000000000000e+01 +1.045980000000000132e+00 -3.956250000000000000e+01 +1.045985000000000165e+00 -3.956250000000000000e+01 +1.045989999999999975e+00 -3.959375381469726562e+01 +1.045995000000000008e+00 -3.953125000000000000e+01 +1.046000000000000041e+00 -3.956250000000000000e+01 +1.046005000000000074e+00 -3.956250000000000000e+01 +1.046010000000000106e+00 -3.959375381469726562e+01 +1.046015000000000139e+00 -3.959375381469726562e+01 +1.046020000000000172e+00 -3.956250000000000000e+01 +1.046024999999999983e+00 -3.953125000000000000e+01 +1.046030000000000015e+00 -3.956250000000000000e+01 +1.046035000000000048e+00 -3.956250000000000000e+01 +1.046040000000000081e+00 -3.953125000000000000e+01 +1.046045000000000114e+00 -3.946875000000000000e+01 +1.046050000000000146e+00 -3.953125000000000000e+01 +1.046055000000000179e+00 -3.940625000000000000e+01 +1.046059999999999990e+00 -3.950000000000000000e+01 +1.046065000000000023e+00 -3.953125000000000000e+01 +1.046070000000000055e+00 -3.953125000000000000e+01 +1.046075000000000088e+00 -3.953125000000000000e+01 +1.046080000000000121e+00 -3.950000000000000000e+01 +1.046085000000000154e+00 -3.950000000000000000e+01 +1.046090000000000186e+00 -3.953125000000000000e+01 +1.046094999999999997e+00 -3.950000000000000000e+01 +1.046100000000000030e+00 -3.953125000000000000e+01 +1.046105000000000063e+00 -3.950000000000000000e+01 +1.046110000000000095e+00 -3.946875000000000000e+01 +1.046115000000000128e+00 -3.946875000000000000e+01 +1.046120000000000161e+00 -3.943750381469726562e+01 +1.046125000000000194e+00 -3.943750381469726562e+01 +1.046130000000000004e+00 -3.946875000000000000e+01 +1.046135000000000037e+00 -3.943750381469726562e+01 +1.046140000000000070e+00 -3.937500000000000000e+01 +1.046145000000000103e+00 -3.937500000000000000e+01 +1.046150000000000135e+00 -3.937500000000000000e+01 +1.046155000000000168e+00 -3.931250000000000000e+01 +1.046159999999999979e+00 -3.940625000000000000e+01 +1.046165000000000012e+00 -3.940625000000000000e+01 +1.046170000000000044e+00 -3.937500000000000000e+01 +1.046175000000000077e+00 -3.940625000000000000e+01 +1.046180000000000110e+00 -3.937500000000000000e+01 +1.046185000000000143e+00 -3.934375381469726562e+01 +1.046190000000000175e+00 -3.937500000000000000e+01 +1.046194999999999986e+00 -3.940625000000000000e+01 +1.046200000000000019e+00 -3.934375381469726562e+01 +1.046205000000000052e+00 -3.940625000000000000e+01 +1.046210000000000084e+00 -3.934375381469726562e+01 +1.046215000000000117e+00 -3.937500000000000000e+01 +1.046220000000000150e+00 -3.931250000000000000e+01 +1.046225000000000183e+00 -3.928125000000000000e+01 +1.046229999999999993e+00 -3.931250000000000000e+01 +1.046235000000000026e+00 -3.931250000000000000e+01 +1.046240000000000059e+00 -3.934375381469726562e+01 +1.046245000000000092e+00 -3.931250000000000000e+01 +1.046250000000000124e+00 -3.937500000000000000e+01 +1.046255000000000157e+00 -3.931250000000000000e+01 +1.046260000000000190e+00 -3.928125000000000000e+01 +1.046265000000000001e+00 -3.940625000000000000e+01 +1.046270000000000033e+00 -3.934375381469726562e+01 +1.046275000000000066e+00 -3.937500000000000000e+01 +1.046280000000000099e+00 -3.931250000000000000e+01 +1.046285000000000132e+00 -3.931250000000000000e+01 +1.046290000000000164e+00 -3.928125000000000000e+01 +1.046294999999999975e+00 -3.934375381469726562e+01 +1.046300000000000008e+00 -3.931250000000000000e+01 +1.046305000000000041e+00 -3.934375381469726562e+01 +1.046310000000000073e+00 -3.928125000000000000e+01 +1.046315000000000106e+00 -3.931250000000000000e+01 +1.046320000000000139e+00 -3.928125000000000000e+01 +1.046325000000000172e+00 -3.931250000000000000e+01 +1.046329999999999982e+00 -3.931250000000000000e+01 +1.046335000000000015e+00 -3.931250000000000000e+01 +1.046340000000000048e+00 -3.931250000000000000e+01 +1.046345000000000081e+00 -3.925000000000000000e+01 +1.046350000000000113e+00 -3.931250000000000000e+01 +1.046355000000000146e+00 -3.928125000000000000e+01 +1.046360000000000179e+00 -3.925000000000000000e+01 +1.046364999999999990e+00 -3.928125000000000000e+01 +1.046370000000000022e+00 -3.928125000000000000e+01 +1.046375000000000055e+00 -3.931250000000000000e+01 +1.046380000000000088e+00 -3.928125000000000000e+01 +1.046385000000000121e+00 -3.928125000000000000e+01 +1.046390000000000153e+00 -3.925000000000000000e+01 +1.046395000000000186e+00 -3.928125000000000000e+01 +1.046399999999999997e+00 -3.921875000000000000e+01 +1.046405000000000030e+00 -3.918750381469726562e+01 +1.046410000000000062e+00 -3.921875000000000000e+01 +1.046415000000000095e+00 -3.918750381469726562e+01 +1.046420000000000128e+00 -3.925000000000000000e+01 +1.046425000000000161e+00 -3.928125000000000000e+01 +1.046430000000000193e+00 -3.921875000000000000e+01 +1.046435000000000004e+00 -3.915625000000000000e+01 +1.046440000000000037e+00 -3.925000000000000000e+01 +1.046445000000000070e+00 -3.925000000000000000e+01 +1.046450000000000102e+00 -3.931250000000000000e+01 +1.046455000000000135e+00 -3.921875000000000000e+01 +1.046460000000000168e+00 -3.915625000000000000e+01 +1.046464999999999979e+00 -3.921875000000000000e+01 +1.046470000000000011e+00 -3.918750381469726562e+01 +1.046475000000000044e+00 -3.918750381469726562e+01 +1.046480000000000077e+00 -3.915625000000000000e+01 +1.046485000000000110e+00 -3.915625000000000000e+01 +1.046490000000000142e+00 -3.918750381469726562e+01 +1.046495000000000175e+00 -3.915625000000000000e+01 +1.046499999999999986e+00 -3.909375000000000000e+01 +1.046505000000000019e+00 -3.915625000000000000e+01 +1.046510000000000051e+00 -3.915625000000000000e+01 +1.046515000000000084e+00 -3.918750381469726562e+01 +1.046520000000000117e+00 -3.912500000000000000e+01 +1.046525000000000150e+00 -3.912500000000000000e+01 +1.046530000000000182e+00 -3.912500000000000000e+01 +1.046534999999999993e+00 -3.915625000000000000e+01 +1.046540000000000026e+00 -3.906250000000000000e+01 +1.046545000000000059e+00 -3.912500000000000000e+01 +1.046550000000000091e+00 -3.912500000000000000e+01 +1.046555000000000124e+00 -3.909375000000000000e+01 +1.046560000000000157e+00 -3.909375000000000000e+01 +1.046565000000000190e+00 -3.909375000000000000e+01 +1.046570000000000000e+00 -3.906250000000000000e+01 +1.046575000000000033e+00 -3.906250000000000000e+01 +1.046580000000000066e+00 -3.900000000000000000e+01 +1.046585000000000099e+00 -3.903125381469726562e+01 +1.046590000000000131e+00 -3.903125381469726562e+01 +1.046595000000000164e+00 -3.909375000000000000e+01 +1.046599999999999975e+00 -3.906250000000000000e+01 +1.046605000000000008e+00 -3.903125381469726562e+01 +1.046610000000000040e+00 -3.903125381469726562e+01 +1.046615000000000073e+00 -3.906250000000000000e+01 +1.046620000000000106e+00 -3.903125381469726562e+01 +1.046625000000000139e+00 -3.903125381469726562e+01 +1.046630000000000171e+00 -3.903125381469726562e+01 +1.046634999999999982e+00 -3.900000000000000000e+01 +1.046640000000000015e+00 -3.900000000000000000e+01 +1.046645000000000048e+00 -3.900000000000000000e+01 +1.046650000000000080e+00 -3.903125381469726562e+01 +1.046655000000000113e+00 -3.900000000000000000e+01 +1.046660000000000146e+00 -3.900000000000000000e+01 +1.046665000000000179e+00 -3.900000000000000000e+01 +1.046669999999999989e+00 -3.900000000000000000e+01 +1.046675000000000022e+00 -3.896875000000000000e+01 +1.046680000000000055e+00 -3.900000000000000000e+01 +1.046685000000000088e+00 -3.900000000000000000e+01 +1.046690000000000120e+00 -3.903125381469726562e+01 +1.046695000000000153e+00 -3.896875000000000000e+01 +1.046700000000000186e+00 -3.893750000000000000e+01 +1.046704999999999997e+00 -3.896875000000000000e+01 +1.046710000000000029e+00 -3.893750000000000000e+01 +1.046715000000000062e+00 -3.896875000000000000e+01 +1.046720000000000095e+00 -3.903125381469726562e+01 +1.046725000000000128e+00 -3.893750000000000000e+01 +1.046730000000000160e+00 -3.896875000000000000e+01 +1.046735000000000193e+00 -3.896875000000000000e+01 +1.046740000000000004e+00 -3.896875000000000000e+01 +1.046745000000000037e+00 -3.900000000000000000e+01 +1.046750000000000069e+00 -3.893750000000000000e+01 +1.046755000000000102e+00 -3.890625000000000000e+01 +1.046760000000000135e+00 -3.893750000000000000e+01 +1.046765000000000168e+00 -3.893750000000000000e+01 +1.046769999999999978e+00 -3.893750000000000000e+01 +1.046775000000000011e+00 -3.890625000000000000e+01 +1.046780000000000044e+00 -3.896875000000000000e+01 +1.046785000000000077e+00 -3.893750000000000000e+01 +1.046790000000000109e+00 -3.890625000000000000e+01 +1.046795000000000142e+00 -3.887500381469726562e+01 +1.046800000000000175e+00 -3.887500381469726562e+01 +1.046804999999999986e+00 -3.890625000000000000e+01 +1.046810000000000018e+00 -3.893750000000000000e+01 +1.046815000000000051e+00 -3.890625000000000000e+01 +1.046820000000000084e+00 -3.890625000000000000e+01 +1.046825000000000117e+00 -3.881250000000000000e+01 +1.046830000000000149e+00 -3.890625000000000000e+01 +1.046835000000000182e+00 -3.890625000000000000e+01 +1.046839999999999993e+00 -3.887500381469726562e+01 +1.046845000000000026e+00 -3.890625000000000000e+01 +1.046850000000000058e+00 -3.884375000000000000e+01 +1.046855000000000091e+00 -3.884375000000000000e+01 +1.046860000000000124e+00 -3.887500381469726562e+01 +1.046865000000000157e+00 -3.884375000000000000e+01 +1.046870000000000189e+00 -3.887500381469726562e+01 +1.046875000000000000e+00 -3.884375000000000000e+01 +1.046880000000000033e+00 -3.884375000000000000e+01 +1.046885000000000066e+00 -3.887500381469726562e+01 +1.046890000000000098e+00 -3.884375000000000000e+01 +1.046895000000000131e+00 -3.884375000000000000e+01 +1.046900000000000164e+00 -3.884375000000000000e+01 +1.046905000000000197e+00 -3.884375000000000000e+01 +1.046910000000000007e+00 -3.881250000000000000e+01 +1.046915000000000040e+00 -3.884375000000000000e+01 +1.046920000000000073e+00 -3.884375000000000000e+01 +1.046925000000000106e+00 -3.878125000000000000e+01 +1.046930000000000138e+00 -3.878125000000000000e+01 +1.046935000000000171e+00 -3.875000000000000000e+01 +1.046939999999999982e+00 -3.881250000000000000e+01 +1.046945000000000014e+00 -3.881250000000000000e+01 +1.046950000000000047e+00 -3.884375000000000000e+01 +1.046955000000000080e+00 -3.881250000000000000e+01 +1.046960000000000113e+00 -3.878125000000000000e+01 +1.046965000000000146e+00 -3.881250000000000000e+01 +1.046970000000000178e+00 -3.878125000000000000e+01 +1.046974999999999989e+00 -3.878125000000000000e+01 +1.046980000000000022e+00 -3.881250000000000000e+01 +1.046985000000000054e+00 -3.881250000000000000e+01 +1.046990000000000087e+00 -3.875000000000000000e+01 +1.046995000000000120e+00 -3.884375000000000000e+01 +1.047000000000000153e+00 -3.881250000000000000e+01 +1.047005000000000186e+00 -3.871875381469726562e+01 +1.047009999999999996e+00 -3.878125000000000000e+01 +1.047015000000000029e+00 -3.881250000000000000e+01 +1.047020000000000062e+00 -3.881250000000000000e+01 +1.047025000000000095e+00 -3.875000000000000000e+01 +1.047030000000000127e+00 -3.871875381469726562e+01 +1.047035000000000160e+00 -3.881250000000000000e+01 +1.047040000000000193e+00 -3.878125000000000000e+01 +1.047045000000000003e+00 -3.868750000000000000e+01 +1.047050000000000036e+00 -3.875000000000000000e+01 +1.047055000000000069e+00 -3.875000000000000000e+01 +1.047060000000000102e+00 -3.868750000000000000e+01 +1.047065000000000135e+00 -3.871875381469726562e+01 +1.047070000000000167e+00 -3.871875381469726562e+01 +1.047074999999999978e+00 -3.865625000000000000e+01 +1.047080000000000011e+00 -3.868750000000000000e+01 +1.047085000000000043e+00 -3.868750000000000000e+01 +1.047090000000000076e+00 -3.865625000000000000e+01 +1.047095000000000109e+00 -3.871875381469726562e+01 +1.047100000000000142e+00 -3.871875381469726562e+01 +1.047105000000000175e+00 -3.865625000000000000e+01 +1.047109999999999985e+00 -3.868750000000000000e+01 +1.047115000000000018e+00 -3.865625000000000000e+01 +1.047120000000000051e+00 -3.871875381469726562e+01 +1.047125000000000083e+00 -3.862500000000000000e+01 +1.047130000000000116e+00 -3.865625000000000000e+01 +1.047135000000000149e+00 -3.865625000000000000e+01 +1.047140000000000182e+00 -3.865625000000000000e+01 +1.047144999999999992e+00 -3.865625000000000000e+01 +1.047150000000000025e+00 -3.865625000000000000e+01 +1.047155000000000058e+00 -3.862500000000000000e+01 +1.047160000000000091e+00 -3.865625000000000000e+01 +1.047165000000000123e+00 -3.859375000000000000e+01 +1.047170000000000156e+00 -3.865625000000000000e+01 +1.047175000000000189e+00 -3.865625000000000000e+01 +1.047180000000000000e+00 -3.862500000000000000e+01 +1.047185000000000032e+00 -3.865625000000000000e+01 +1.047190000000000065e+00 -3.862500000000000000e+01 +1.047195000000000098e+00 -3.859375000000000000e+01 +1.047200000000000131e+00 -3.862500000000000000e+01 +1.047205000000000163e+00 -3.859375000000000000e+01 +1.047210000000000196e+00 -3.865625000000000000e+01 +1.047215000000000007e+00 -3.865625000000000000e+01 +1.047220000000000040e+00 -3.862500000000000000e+01 +1.047225000000000072e+00 -3.865625000000000000e+01 +1.047230000000000105e+00 -3.853125000000000000e+01 +1.047235000000000138e+00 -3.859375000000000000e+01 +1.047240000000000171e+00 -3.859375000000000000e+01 +1.047244999999999981e+00 -3.856250381469726562e+01 +1.047250000000000014e+00 -3.850000000000000000e+01 +1.047255000000000047e+00 -3.853125000000000000e+01 +1.047260000000000080e+00 -3.856250381469726562e+01 +1.047265000000000112e+00 -3.850000000000000000e+01 +1.047270000000000145e+00 -3.853125000000000000e+01 +1.047275000000000178e+00 -3.856250381469726562e+01 +1.047279999999999989e+00 -3.850000000000000000e+01 +1.047285000000000021e+00 -3.853125000000000000e+01 +1.047290000000000054e+00 -3.850000000000000000e+01 +1.047295000000000087e+00 -3.843750000000000000e+01 +1.047300000000000120e+00 -3.850000000000000000e+01 +1.047305000000000152e+00 -3.846875381469726562e+01 +1.047310000000000185e+00 -3.850000000000000000e+01 +1.047314999999999996e+00 -3.850000000000000000e+01 +1.047320000000000029e+00 -3.843750000000000000e+01 +1.047325000000000061e+00 -3.846875381469726562e+01 +1.047330000000000094e+00 -3.850000000000000000e+01 +1.047335000000000127e+00 -3.843750000000000000e+01 +1.047340000000000160e+00 -3.846875381469726562e+01 +1.047345000000000192e+00 -3.846875381469726562e+01 +1.047350000000000003e+00 -3.843750000000000000e+01 +1.047355000000000036e+00 -3.843750000000000000e+01 +1.047360000000000069e+00 -3.850000000000000000e+01 +1.047365000000000101e+00 -3.846875381469726562e+01 +1.047370000000000134e+00 -3.837500000000000000e+01 +1.047375000000000167e+00 -3.846875381469726562e+01 +1.047379999999999978e+00 -3.840625000000000000e+01 +1.047385000000000010e+00 -3.840625000000000000e+01 +1.047390000000000043e+00 -3.840625000000000000e+01 +1.047395000000000076e+00 -3.834375000000000000e+01 +1.047400000000000109e+00 -3.840625000000000000e+01 +1.047405000000000141e+00 -3.843750000000000000e+01 +1.047410000000000174e+00 -3.837500000000000000e+01 +1.047414999999999985e+00 -3.840625000000000000e+01 +1.047420000000000018e+00 -3.846875381469726562e+01 +1.047425000000000050e+00 -3.840625000000000000e+01 +1.047430000000000083e+00 -3.837500000000000000e+01 +1.047435000000000116e+00 -3.843750000000000000e+01 +1.047440000000000149e+00 -3.840625000000000000e+01 +1.047445000000000181e+00 -3.840625000000000000e+01 +1.047449999999999992e+00 -3.840625000000000000e+01 +1.047455000000000025e+00 -3.837500000000000000e+01 +1.047460000000000058e+00 -3.840625000000000000e+01 +1.047465000000000090e+00 -3.837500000000000000e+01 +1.047470000000000123e+00 -3.837500000000000000e+01 +1.047475000000000156e+00 -3.837500000000000000e+01 +1.047480000000000189e+00 -3.837500000000000000e+01 +1.047484999999999999e+00 -3.837500000000000000e+01 +1.047490000000000032e+00 -3.834375000000000000e+01 +1.047495000000000065e+00 -3.834375000000000000e+01 +1.047500000000000098e+00 -3.834375000000000000e+01 +1.047505000000000130e+00 -3.831250381469726562e+01 +1.047510000000000163e+00 -3.834375000000000000e+01 +1.047515000000000196e+00 -3.828125000000000000e+01 +1.047520000000000007e+00 -3.831250381469726562e+01 +1.047525000000000039e+00 -3.834375000000000000e+01 +1.047530000000000072e+00 -3.834375000000000000e+01 +1.047535000000000105e+00 -3.828125000000000000e+01 +1.047540000000000138e+00 -3.828125000000000000e+01 +1.047545000000000170e+00 -3.831250381469726562e+01 +1.047549999999999981e+00 -3.825000000000000000e+01 +1.047555000000000014e+00 -3.825000000000000000e+01 +1.047560000000000047e+00 -3.828125000000000000e+01 +1.047565000000000079e+00 -3.828125000000000000e+01 +1.047570000000000112e+00 -3.834375000000000000e+01 +1.047575000000000145e+00 -3.818750000000000000e+01 +1.047580000000000178e+00 -3.828125000000000000e+01 +1.047584999999999988e+00 -3.818750000000000000e+01 +1.047590000000000021e+00 -3.825000000000000000e+01 +1.047595000000000054e+00 -3.821875000000000000e+01 +1.047600000000000087e+00 -3.818750000000000000e+01 +1.047605000000000119e+00 -3.818750000000000000e+01 +1.047610000000000152e+00 -3.821875000000000000e+01 +1.047615000000000185e+00 -3.821875000000000000e+01 +1.047619999999999996e+00 -3.828125000000000000e+01 +1.047625000000000028e+00 -3.818750000000000000e+01 +1.047630000000000061e+00 -3.821875000000000000e+01 +1.047635000000000094e+00 -3.828125000000000000e+01 +1.047640000000000127e+00 -3.818750000000000000e+01 +1.047645000000000159e+00 -3.818750000000000000e+01 +1.047650000000000192e+00 -3.815625381469726562e+01 +1.047655000000000003e+00 -3.812500000000000000e+01 +1.047660000000000036e+00 -3.815625381469726562e+01 +1.047665000000000068e+00 -3.815625381469726562e+01 +1.047670000000000101e+00 -3.815625381469726562e+01 +1.047675000000000134e+00 -3.815625381469726562e+01 +1.047680000000000167e+00 -3.818750000000000000e+01 +1.047684999999999977e+00 -3.809375000000000000e+01 +1.047690000000000010e+00 -3.818750000000000000e+01 +1.047695000000000043e+00 -3.815625381469726562e+01 +1.047700000000000076e+00 -3.809375000000000000e+01 +1.047705000000000108e+00 -3.818750000000000000e+01 +1.047710000000000141e+00 -3.809375000000000000e+01 +1.047715000000000174e+00 -3.809375000000000000e+01 +1.047719999999999985e+00 -3.815625381469726562e+01 +1.047725000000000017e+00 -3.812500000000000000e+01 +1.047730000000000050e+00 -3.812500000000000000e+01 +1.047735000000000083e+00 -3.809375000000000000e+01 +1.047740000000000116e+00 -3.806250000000000000e+01 +1.047745000000000148e+00 -3.803125000000000000e+01 +1.047750000000000181e+00 -3.809375000000000000e+01 +1.047754999999999992e+00 -3.803125000000000000e+01 +1.047760000000000025e+00 -3.809375000000000000e+01 +1.047765000000000057e+00 -3.806250000000000000e+01 +1.047770000000000090e+00 -3.803125000000000000e+01 +1.047775000000000123e+00 -3.806250000000000000e+01 +1.047780000000000156e+00 -3.803125000000000000e+01 +1.047785000000000188e+00 -3.806250000000000000e+01 +1.047789999999999999e+00 -3.803125000000000000e+01 +1.047795000000000032e+00 -3.806250000000000000e+01 +1.047800000000000065e+00 -3.800000381469726562e+01 +1.047805000000000097e+00 -3.809375000000000000e+01 +1.047810000000000130e+00 -3.800000381469726562e+01 +1.047815000000000163e+00 -3.800000381469726562e+01 +1.047820000000000196e+00 -3.800000381469726562e+01 +1.047825000000000006e+00 -3.800000381469726562e+01 +1.047830000000000039e+00 -3.800000381469726562e+01 +1.047835000000000072e+00 -3.800000381469726562e+01 +1.047840000000000105e+00 -3.803125000000000000e+01 +1.047845000000000137e+00 -3.803125000000000000e+01 +1.047850000000000170e+00 -3.793750000000000000e+01 +1.047854999999999981e+00 -3.796875000000000000e+01 +1.047860000000000014e+00 -3.796875000000000000e+01 +1.047865000000000046e+00 -3.800000381469726562e+01 +1.047870000000000079e+00 -3.793750000000000000e+01 +1.047875000000000112e+00 -3.793750000000000000e+01 +1.047880000000000145e+00 -3.793750000000000000e+01 +1.047885000000000177e+00 -3.796875000000000000e+01 +1.047889999999999988e+00 -3.790625000000000000e+01 +1.047895000000000021e+00 -3.790625000000000000e+01 +1.047900000000000054e+00 -3.796875000000000000e+01 +1.047905000000000086e+00 -3.793750000000000000e+01 +1.047910000000000119e+00 -3.793750000000000000e+01 +1.047915000000000152e+00 -3.793750000000000000e+01 +1.047920000000000185e+00 -3.787500000000000000e+01 +1.047924999999999995e+00 -3.790625000000000000e+01 +1.047930000000000028e+00 -3.800000381469726562e+01 +1.047935000000000061e+00 -3.793750000000000000e+01 +1.047940000000000094e+00 -3.793750000000000000e+01 +1.047945000000000126e+00 -3.787500000000000000e+01 +1.047950000000000159e+00 -3.784375381469726562e+01 +1.047955000000000192e+00 -3.793750000000000000e+01 +1.047960000000000003e+00 -3.793750000000000000e+01 +1.047965000000000035e+00 -3.790625000000000000e+01 +1.047970000000000068e+00 -3.787500000000000000e+01 +1.047975000000000101e+00 -3.790625000000000000e+01 +1.047980000000000134e+00 -3.793750000000000000e+01 +1.047985000000000166e+00 -3.793750000000000000e+01 +1.047989999999999977e+00 -3.787500000000000000e+01 +1.047995000000000010e+00 -3.790625000000000000e+01 +1.048000000000000043e+00 -3.790625000000000000e+01 +1.048005000000000075e+00 -3.787500000000000000e+01 +1.048010000000000108e+00 -3.787500000000000000e+01 +1.048015000000000141e+00 -3.784375381469726562e+01 +1.048020000000000174e+00 -3.790625000000000000e+01 +1.048024999999999984e+00 -3.784375381469726562e+01 +1.048030000000000017e+00 -3.784375381469726562e+01 +1.048035000000000050e+00 -3.784375381469726562e+01 +1.048040000000000083e+00 -3.781250000000000000e+01 +1.048045000000000115e+00 -3.787500000000000000e+01 +1.048050000000000148e+00 -3.784375381469726562e+01 +1.048055000000000181e+00 -3.781250000000000000e+01 +1.048059999999999992e+00 -3.784375381469726562e+01 +1.048065000000000024e+00 -3.784375381469726562e+01 +1.048070000000000057e+00 -3.784375381469726562e+01 +1.048075000000000090e+00 -3.781250000000000000e+01 +1.048080000000000123e+00 -3.775000381469726562e+01 +1.048085000000000155e+00 -3.784375381469726562e+01 +1.048090000000000188e+00 -3.778125000000000000e+01 +1.048094999999999999e+00 -3.778125000000000000e+01 +1.048100000000000032e+00 -3.784375381469726562e+01 +1.048105000000000064e+00 -3.778125000000000000e+01 +1.048110000000000097e+00 -3.775000381469726562e+01 +1.048115000000000130e+00 -3.778125000000000000e+01 +1.048120000000000163e+00 -3.771875000000000000e+01 +1.048125000000000195e+00 -3.778125000000000000e+01 +1.048130000000000006e+00 -3.781250000000000000e+01 +1.048135000000000039e+00 -3.781250000000000000e+01 +1.048140000000000072e+00 -3.775000381469726562e+01 +1.048145000000000104e+00 -3.778125000000000000e+01 +1.048150000000000137e+00 -3.778125000000000000e+01 +1.048155000000000170e+00 -3.778125000000000000e+01 +1.048159999999999981e+00 -3.771875000000000000e+01 +1.048165000000000013e+00 -3.771875000000000000e+01 +1.048170000000000046e+00 -3.771875000000000000e+01 +1.048175000000000079e+00 -3.771875000000000000e+01 +1.048180000000000112e+00 -3.768750000000000000e+01 +1.048185000000000144e+00 -3.768750000000000000e+01 +1.048190000000000177e+00 -3.771875000000000000e+01 +1.048194999999999988e+00 -3.765625000000000000e+01 +1.048200000000000021e+00 -3.768750000000000000e+01 +1.048205000000000053e+00 -3.765625000000000000e+01 +1.048210000000000086e+00 -3.765625000000000000e+01 +1.048215000000000119e+00 -3.762500000000000000e+01 +1.048220000000000152e+00 -3.759375381469726562e+01 +1.048225000000000184e+00 -3.765625000000000000e+01 +1.048229999999999995e+00 -3.768750000000000000e+01 +1.048235000000000028e+00 -3.765625000000000000e+01 +1.048240000000000061e+00 -3.765625000000000000e+01 +1.048245000000000093e+00 -3.765625000000000000e+01 +1.048250000000000126e+00 -3.768750000000000000e+01 +1.048255000000000159e+00 -3.768750000000000000e+01 +1.048260000000000192e+00 -3.765625000000000000e+01 +1.048265000000000002e+00 -3.765625000000000000e+01 +1.048270000000000035e+00 -3.765625000000000000e+01 +1.048275000000000068e+00 -3.759375381469726562e+01 +1.048280000000000101e+00 -3.762500000000000000e+01 +1.048285000000000133e+00 -3.765625000000000000e+01 +1.048290000000000166e+00 -3.756250000000000000e+01 +1.048294999999999977e+00 -3.759375381469726562e+01 +1.048300000000000010e+00 -3.762500000000000000e+01 +1.048305000000000042e+00 -3.756250000000000000e+01 +1.048310000000000075e+00 -3.762500000000000000e+01 +1.048315000000000108e+00 -3.759375381469726562e+01 +1.048320000000000141e+00 -3.759375381469726562e+01 +1.048325000000000173e+00 -3.759375381469726562e+01 +1.048329999999999984e+00 -3.756250000000000000e+01 +1.048335000000000017e+00 -3.756250000000000000e+01 +1.048340000000000050e+00 -3.753125000000000000e+01 +1.048345000000000082e+00 -3.753125000000000000e+01 +1.048350000000000115e+00 -3.753125000000000000e+01 +1.048355000000000148e+00 -3.750000000000000000e+01 +1.048360000000000181e+00 -3.756250000000000000e+01 +1.048364999999999991e+00 -3.753125000000000000e+01 +1.048370000000000024e+00 -3.753125000000000000e+01 +1.048375000000000057e+00 -3.750000000000000000e+01 +1.048380000000000090e+00 -3.750000000000000000e+01 +1.048385000000000122e+00 -3.746875000000000000e+01 +1.048390000000000155e+00 -3.743750381469726562e+01 +1.048395000000000188e+00 -3.750000000000000000e+01 +1.048399999999999999e+00 -3.750000000000000000e+01 +1.048405000000000031e+00 -3.746875000000000000e+01 +1.048410000000000064e+00 -3.750000000000000000e+01 +1.048415000000000097e+00 -3.743750381469726562e+01 +1.048420000000000130e+00 -3.746875000000000000e+01 +1.048425000000000162e+00 -3.750000000000000000e+01 +1.048430000000000195e+00 -3.746875000000000000e+01 +1.048435000000000006e+00 -3.743750381469726562e+01 +1.048440000000000039e+00 -3.746875000000000000e+01 +1.048445000000000071e+00 -3.743750381469726562e+01 +1.048450000000000104e+00 -3.746875000000000000e+01 +1.048455000000000137e+00 -3.746875000000000000e+01 +1.048460000000000170e+00 -3.743750381469726562e+01 +1.048464999999999980e+00 -3.743750381469726562e+01 +1.048470000000000013e+00 -3.743750381469726562e+01 +1.048475000000000046e+00 -3.746875000000000000e+01 +1.048480000000000079e+00 -3.746875000000000000e+01 +1.048485000000000111e+00 -3.743750381469726562e+01 +1.048490000000000144e+00 -3.740625000000000000e+01 +1.048495000000000177e+00 -3.734375000000000000e+01 +1.048499999999999988e+00 -3.737500000000000000e+01 +1.048505000000000020e+00 -3.743750381469726562e+01 +1.048510000000000053e+00 -3.737500000000000000e+01 +1.048515000000000086e+00 -3.734375000000000000e+01 +1.048520000000000119e+00 -3.740625000000000000e+01 +1.048525000000000151e+00 -3.740625000000000000e+01 +1.048530000000000184e+00 -3.737500000000000000e+01 +1.048534999999999995e+00 -3.737500000000000000e+01 +1.048540000000000028e+00 -3.737500000000000000e+01 +1.048545000000000060e+00 -3.740625000000000000e+01 +1.048550000000000093e+00 -3.740625000000000000e+01 +1.048555000000000126e+00 -3.737500000000000000e+01 +1.048560000000000159e+00 -3.740625000000000000e+01 +1.048565000000000191e+00 -3.740625000000000000e+01 +1.048570000000000002e+00 -3.737500000000000000e+01 +1.048575000000000035e+00 -3.740625000000000000e+01 +1.048580000000000068e+00 -3.731250000000000000e+01 +1.048585000000000100e+00 -3.734375000000000000e+01 +1.048590000000000133e+00 -3.728125381469726562e+01 +1.048595000000000166e+00 -3.731250000000000000e+01 +1.048599999999999977e+00 -3.746875000000000000e+01 +1.048605000000000009e+00 -3.734375000000000000e+01 +1.048610000000000042e+00 -3.731250000000000000e+01 +1.048615000000000075e+00 -3.734375000000000000e+01 +1.048620000000000108e+00 -3.737500000000000000e+01 +1.048625000000000140e+00 -3.728125381469726562e+01 +1.048630000000000173e+00 -3.728125381469726562e+01 +1.048634999999999984e+00 -3.728125381469726562e+01 +1.048640000000000017e+00 -3.725000000000000000e+01 +1.048645000000000049e+00 -3.728125381469726562e+01 +1.048650000000000082e+00 -3.728125381469726562e+01 +1.048655000000000115e+00 -3.725000000000000000e+01 +1.048660000000000148e+00 -3.728125381469726562e+01 +1.048665000000000180e+00 -3.731250000000000000e+01 +1.048669999999999991e+00 -3.725000000000000000e+01 +1.048675000000000024e+00 -3.728125381469726562e+01 +1.048680000000000057e+00 -3.715625000000000000e+01 +1.048685000000000089e+00 -3.721875000000000000e+01 +1.048690000000000122e+00 -3.721875000000000000e+01 +1.048695000000000155e+00 -3.715625000000000000e+01 +1.048700000000000188e+00 -3.721875000000000000e+01 +1.048704999999999998e+00 -3.721875000000000000e+01 +1.048710000000000031e+00 -3.718750000000000000e+01 +1.048715000000000064e+00 -3.721875000000000000e+01 +1.048720000000000097e+00 -3.721875000000000000e+01 +1.048725000000000129e+00 -3.721875000000000000e+01 +1.048730000000000162e+00 -3.721875000000000000e+01 +1.048735000000000195e+00 -3.721875000000000000e+01 +1.048740000000000006e+00 -3.718750000000000000e+01 +1.048745000000000038e+00 -3.718750000000000000e+01 +1.048750000000000071e+00 -3.718750000000000000e+01 +1.048755000000000104e+00 -3.715625000000000000e+01 +1.048760000000000137e+00 -3.715625000000000000e+01 +1.048765000000000169e+00 -3.718750000000000000e+01 +1.048769999999999980e+00 -3.718750000000000000e+01 +1.048775000000000013e+00 -3.709375000000000000e+01 +1.048780000000000046e+00 -3.725000000000000000e+01 +1.048785000000000078e+00 -3.718750000000000000e+01 +1.048790000000000111e+00 -3.728125381469726562e+01 +1.048795000000000144e+00 -3.712500381469726562e+01 +1.048800000000000177e+00 -3.715625000000000000e+01 +1.048804999999999987e+00 -3.715625000000000000e+01 +1.048810000000000020e+00 -3.715625000000000000e+01 +1.048815000000000053e+00 -3.718750000000000000e+01 +1.048820000000000086e+00 -3.715625000000000000e+01 +1.048825000000000118e+00 -3.715625000000000000e+01 +1.048830000000000151e+00 -3.718750000000000000e+01 +1.048835000000000184e+00 -3.709375000000000000e+01 +1.048839999999999995e+00 -3.709375000000000000e+01 +1.048845000000000027e+00 -3.709375000000000000e+01 +1.048850000000000060e+00 -3.709375000000000000e+01 +1.048855000000000093e+00 -3.706250000000000000e+01 +1.048860000000000126e+00 -3.706250000000000000e+01 +1.048865000000000158e+00 -3.706250000000000000e+01 +1.048870000000000191e+00 -3.709375000000000000e+01 +1.048875000000000002e+00 -3.709375000000000000e+01 +1.048880000000000035e+00 -3.700000000000000000e+01 +1.048885000000000067e+00 -3.700000000000000000e+01 +1.048890000000000100e+00 -3.703125381469726562e+01 +1.048895000000000133e+00 -3.706250000000000000e+01 +1.048900000000000166e+00 -3.703125381469726562e+01 +1.048904999999999976e+00 -3.700000000000000000e+01 +1.048910000000000009e+00 -3.703125381469726562e+01 +1.048915000000000042e+00 -3.700000000000000000e+01 +1.048920000000000075e+00 -3.700000000000000000e+01 +1.048925000000000107e+00 -3.703125381469726562e+01 +1.048930000000000140e+00 -3.696875000000000000e+01 +1.048935000000000173e+00 -3.703125381469726562e+01 +1.048939999999999984e+00 -3.700000000000000000e+01 +1.048945000000000016e+00 -3.700000000000000000e+01 +1.048950000000000049e+00 -3.693750000000000000e+01 +1.048955000000000082e+00 -3.700000000000000000e+01 +1.048960000000000115e+00 -3.696875000000000000e+01 +1.048965000000000147e+00 -3.700000000000000000e+01 +1.048970000000000180e+00 -3.700000000000000000e+01 +1.048974999999999991e+00 -3.693750000000000000e+01 +1.048980000000000024e+00 -3.693750000000000000e+01 +1.048985000000000056e+00 -3.696875000000000000e+01 +1.048990000000000089e+00 -3.700000000000000000e+01 +1.048995000000000122e+00 -3.696875000000000000e+01 +1.049000000000000155e+00 -3.696875000000000000e+01 +1.049005000000000187e+00 -3.693750000000000000e+01 +1.049009999999999998e+00 -3.693750000000000000e+01 +1.049015000000000031e+00 -3.696875000000000000e+01 +1.049020000000000064e+00 -3.700000000000000000e+01 +1.049025000000000096e+00 -3.693750000000000000e+01 +1.049030000000000129e+00 -3.696875000000000000e+01 +1.049035000000000162e+00 -3.696875000000000000e+01 +1.049040000000000195e+00 -3.696875000000000000e+01 +1.049045000000000005e+00 -3.696875000000000000e+01 +1.049050000000000038e+00 -3.690625000000000000e+01 +1.049055000000000071e+00 -3.693750000000000000e+01 +1.049060000000000104e+00 -3.696875000000000000e+01 +1.049065000000000136e+00 -3.690625000000000000e+01 +1.049070000000000169e+00 -3.693750000000000000e+01 +1.049074999999999980e+00 -3.696875000000000000e+01 +1.049080000000000013e+00 -3.690625000000000000e+01 +1.049085000000000045e+00 -3.684375000000000000e+01 +1.049090000000000078e+00 -3.690625000000000000e+01 +1.049095000000000111e+00 -3.687500381469726562e+01 +1.049100000000000144e+00 -3.690625000000000000e+01 +1.049105000000000176e+00 -3.693750000000000000e+01 +1.049109999999999987e+00 -3.693750000000000000e+01 +1.049115000000000020e+00 -3.690625000000000000e+01 +1.049120000000000053e+00 -3.693750000000000000e+01 +1.049125000000000085e+00 -3.690625000000000000e+01 +1.049130000000000118e+00 -3.687500381469726562e+01 +1.049135000000000151e+00 -3.684375000000000000e+01 +1.049140000000000184e+00 -3.684375000000000000e+01 +1.049144999999999994e+00 -3.684375000000000000e+01 +1.049150000000000027e+00 -3.684375000000000000e+01 +1.049155000000000060e+00 -3.684375000000000000e+01 +1.049160000000000093e+00 -3.684375000000000000e+01 +1.049165000000000125e+00 -3.681250000000000000e+01 +1.049170000000000158e+00 -3.687500381469726562e+01 +1.049175000000000191e+00 -3.693750000000000000e+01 +1.049180000000000001e+00 -3.687500381469726562e+01 +1.049185000000000034e+00 -3.681250000000000000e+01 +1.049190000000000067e+00 -3.681250000000000000e+01 +1.049195000000000100e+00 -3.681250000000000000e+01 +1.049200000000000133e+00 -3.681250000000000000e+01 +1.049205000000000165e+00 -3.678125000000000000e+01 +1.049209999999999976e+00 -3.675000000000000000e+01 +1.049215000000000009e+00 -3.675000000000000000e+01 +1.049220000000000041e+00 -3.678125000000000000e+01 +1.049225000000000074e+00 -3.678125000000000000e+01 +1.049230000000000107e+00 -3.681250000000000000e+01 +1.049235000000000140e+00 -3.678125000000000000e+01 +1.049240000000000173e+00 -3.671875381469726562e+01 +1.049244999999999983e+00 -3.678125000000000000e+01 +1.049250000000000016e+00 -3.671875381469726562e+01 +1.049255000000000049e+00 -3.671875381469726562e+01 +1.049260000000000081e+00 -3.675000000000000000e+01 +1.049265000000000114e+00 -3.671875381469726562e+01 +1.049270000000000147e+00 -3.681250000000000000e+01 +1.049275000000000180e+00 -3.678125000000000000e+01 +1.049279999999999990e+00 -3.665625000000000000e+01 +1.049285000000000023e+00 -3.671875381469726562e+01 +1.049290000000000056e+00 -3.668750000000000000e+01 +1.049295000000000089e+00 -3.668750000000000000e+01 +1.049300000000000122e+00 -3.675000000000000000e+01 +1.049305000000000154e+00 -3.665625000000000000e+01 +1.049310000000000187e+00 -3.678125000000000000e+01 +1.049314999999999998e+00 -3.665625000000000000e+01 +1.049320000000000030e+00 -3.665625000000000000e+01 +1.049325000000000063e+00 -3.665625000000000000e+01 +1.049330000000000096e+00 -3.671875381469726562e+01 +1.049335000000000129e+00 -3.668750000000000000e+01 +1.049340000000000162e+00 -3.662500000000000000e+01 +1.049345000000000194e+00 -3.662500000000000000e+01 +1.049350000000000005e+00 -3.659375000000000000e+01 +1.049355000000000038e+00 -3.665625000000000000e+01 +1.049360000000000070e+00 -3.662500000000000000e+01 +1.049365000000000103e+00 -3.662500000000000000e+01 +1.049370000000000136e+00 -3.659375000000000000e+01 +1.049375000000000169e+00 -3.656250381469726562e+01 +1.049379999999999979e+00 -3.665625000000000000e+01 +1.049385000000000012e+00 -3.659375000000000000e+01 +1.049390000000000045e+00 -3.656250381469726562e+01 +1.049395000000000078e+00 -3.656250381469726562e+01 +1.049400000000000110e+00 -3.659375000000000000e+01 +1.049405000000000143e+00 -3.665625000000000000e+01 +1.049410000000000176e+00 -3.656250381469726562e+01 +1.049414999999999987e+00 -3.653125000000000000e+01 +1.049420000000000019e+00 -3.659375000000000000e+01 +1.049425000000000052e+00 -3.650000000000000000e+01 +1.049430000000000085e+00 -3.656250381469726562e+01 +1.049435000000000118e+00 -3.653125000000000000e+01 +1.049440000000000150e+00 -3.659375000000000000e+01 +1.049445000000000183e+00 -3.653125000000000000e+01 +1.049449999999999994e+00 -3.659375000000000000e+01 +1.049455000000000027e+00 -3.665625000000000000e+01 +1.049460000000000059e+00 -3.653125000000000000e+01 +1.049465000000000092e+00 -3.653125000000000000e+01 +1.049470000000000125e+00 -3.656250381469726562e+01 +1.049475000000000158e+00 -3.656250381469726562e+01 +1.049480000000000190e+00 -3.653125000000000000e+01 +1.049485000000000001e+00 -3.650000000000000000e+01 +1.049490000000000034e+00 -3.646875000000000000e+01 +1.049495000000000067e+00 -3.653125000000000000e+01 +1.049500000000000099e+00 -3.646875000000000000e+01 +1.049505000000000132e+00 -3.653125000000000000e+01 +1.049510000000000165e+00 -3.653125000000000000e+01 +1.049514999999999976e+00 -3.653125000000000000e+01 +1.049520000000000008e+00 -3.650000000000000000e+01 +1.049525000000000041e+00 -3.646875000000000000e+01 +1.049530000000000074e+00 -3.643750000000000000e+01 +1.049535000000000107e+00 -3.643750000000000000e+01 +1.049540000000000139e+00 -3.650000000000000000e+01 +1.049545000000000172e+00 -3.643750000000000000e+01 +1.049549999999999983e+00 -3.650000000000000000e+01 +1.049555000000000016e+00 -3.643750000000000000e+01 +1.049560000000000048e+00 -3.643750000000000000e+01 +1.049565000000000081e+00 -3.640625381469726562e+01 +1.049570000000000114e+00 -3.643750000000000000e+01 +1.049575000000000147e+00 -3.640625381469726562e+01 +1.049580000000000179e+00 -3.640625381469726562e+01 +1.049584999999999990e+00 -3.637500000000000000e+01 +1.049590000000000023e+00 -3.640625381469726562e+01 +1.049595000000000056e+00 -3.637500000000000000e+01 +1.049600000000000088e+00 -3.631250000000000000e+01 +1.049605000000000121e+00 -3.634375000000000000e+01 +1.049610000000000154e+00 -3.640625381469726562e+01 +1.049615000000000187e+00 -3.634375000000000000e+01 +1.049619999999999997e+00 -3.634375000000000000e+01 +1.049625000000000030e+00 -3.628125000000000000e+01 +1.049630000000000063e+00 -3.628125000000000000e+01 +1.049635000000000096e+00 -3.634375000000000000e+01 +1.049640000000000128e+00 -3.628125000000000000e+01 +1.049645000000000161e+00 -3.631250000000000000e+01 +1.049650000000000194e+00 -3.631250000000000000e+01 +1.049655000000000005e+00 -3.628125000000000000e+01 +1.049660000000000037e+00 -3.634375000000000000e+01 +1.049665000000000070e+00 -3.628125000000000000e+01 +1.049670000000000103e+00 -3.628125000000000000e+01 +1.049675000000000136e+00 -3.628125000000000000e+01 +1.049680000000000168e+00 -3.621875000000000000e+01 +1.049684999999999979e+00 -3.625000000000000000e+01 +1.049690000000000012e+00 -3.628125000000000000e+01 +1.049695000000000045e+00 -3.625000000000000000e+01 +1.049700000000000077e+00 -3.625000000000000000e+01 +1.049705000000000110e+00 -3.621875000000000000e+01 +1.049710000000000143e+00 -3.618750000000000000e+01 +1.049715000000000176e+00 -3.628125000000000000e+01 +1.049719999999999986e+00 -3.618750000000000000e+01 +1.049725000000000019e+00 -3.625000000000000000e+01 +1.049730000000000052e+00 -3.618750000000000000e+01 +1.049735000000000085e+00 -3.628125000000000000e+01 +1.049740000000000117e+00 -3.621875000000000000e+01 +1.049745000000000150e+00 -3.625000000000000000e+01 +1.049750000000000183e+00 -3.628125000000000000e+01 +1.049754999999999994e+00 -3.621875000000000000e+01 +1.049760000000000026e+00 -3.618750000000000000e+01 +1.049765000000000059e+00 -3.618750000000000000e+01 +1.049770000000000092e+00 -3.618750000000000000e+01 +1.049775000000000125e+00 -3.615625381469726562e+01 +1.049780000000000157e+00 -3.618750000000000000e+01 +1.049785000000000190e+00 -3.612500000000000000e+01 +1.049790000000000001e+00 -3.618750000000000000e+01 +1.049795000000000034e+00 -3.612500000000000000e+01 +1.049800000000000066e+00 -3.615625381469726562e+01 +1.049805000000000099e+00 -3.618750000000000000e+01 +1.049810000000000132e+00 -3.615625381469726562e+01 +1.049815000000000165e+00 -3.618750000000000000e+01 +1.049819999999999975e+00 -3.612500000000000000e+01 +1.049825000000000008e+00 -3.615625381469726562e+01 +1.049830000000000041e+00 -3.609375000000000000e+01 +1.049835000000000074e+00 -3.609375000000000000e+01 +1.049840000000000106e+00 -3.609375000000000000e+01 +1.049845000000000139e+00 -3.609375000000000000e+01 +1.049850000000000172e+00 -3.606250000000000000e+01 +1.049854999999999983e+00 -3.612500000000000000e+01 +1.049860000000000015e+00 -3.618750000000000000e+01 +1.049865000000000048e+00 -3.615625381469726562e+01 +1.049870000000000081e+00 -3.609375000000000000e+01 +1.049875000000000114e+00 -3.615625381469726562e+01 +1.049880000000000146e+00 -3.612500000000000000e+01 +1.049885000000000179e+00 -3.615625381469726562e+01 +1.049889999999999990e+00 -3.609375000000000000e+01 +1.049895000000000023e+00 -3.603125000000000000e+01 +1.049900000000000055e+00 -3.606250000000000000e+01 +1.049905000000000088e+00 -3.609375000000000000e+01 +1.049910000000000121e+00 -3.609375000000000000e+01 +1.049915000000000154e+00 -3.606250000000000000e+01 +1.049920000000000186e+00 -3.603125000000000000e+01 +1.049924999999999997e+00 -3.606250000000000000e+01 +1.049930000000000030e+00 -3.606250000000000000e+01 +1.049935000000000063e+00 -3.606250000000000000e+01 +1.049940000000000095e+00 -3.603125000000000000e+01 +1.049945000000000128e+00 -3.606250000000000000e+01 +1.049950000000000161e+00 -3.609375000000000000e+01 +1.049955000000000194e+00 -3.600000381469726562e+01 +1.049960000000000004e+00 -3.603125000000000000e+01 +1.049965000000000037e+00 -3.603125000000000000e+01 +1.049970000000000070e+00 -3.606250000000000000e+01 +1.049975000000000103e+00 -3.596875000000000000e+01 +1.049980000000000135e+00 -3.606250000000000000e+01 +1.049985000000000168e+00 -3.603125000000000000e+01 +1.049989999999999979e+00 -3.596875000000000000e+01 +1.049995000000000012e+00 -3.603125000000000000e+01 +1.050000000000000044e+00 -3.603125000000000000e+01 +1.050005000000000077e+00 -3.596875000000000000e+01 +1.050010000000000110e+00 -3.600000381469726562e+01 +1.050015000000000143e+00 -3.600000381469726562e+01 +1.050020000000000175e+00 -3.596875000000000000e+01 +1.050024999999999986e+00 -3.596875000000000000e+01 +1.050030000000000019e+00 -3.593750000000000000e+01 +1.050035000000000052e+00 -3.600000381469726562e+01 +1.050040000000000084e+00 -3.590625000000000000e+01 +1.050045000000000117e+00 -3.593750000000000000e+01 +1.050050000000000150e+00 -3.596875000000000000e+01 +1.050055000000000183e+00 -3.596875000000000000e+01 +1.050059999999999993e+00 -3.593750000000000000e+01 +1.050065000000000026e+00 -3.590625000000000000e+01 +1.050070000000000059e+00 -3.590625000000000000e+01 +1.050075000000000092e+00 -3.584375381469726562e+01 +1.050080000000000124e+00 -3.587500000000000000e+01 +1.050085000000000157e+00 -3.590625000000000000e+01 +1.050090000000000190e+00 -3.590625000000000000e+01 +1.050095000000000001e+00 -3.590625000000000000e+01 +1.050100000000000033e+00 -3.596875000000000000e+01 +1.050105000000000066e+00 -3.593750000000000000e+01 +1.050110000000000099e+00 -3.590625000000000000e+01 +1.050115000000000132e+00 -3.593750000000000000e+01 +1.050120000000000164e+00 -3.593750000000000000e+01 +1.050124999999999975e+00 -3.596875000000000000e+01 +1.050130000000000008e+00 -3.590625000000000000e+01 +1.050135000000000041e+00 -3.587500000000000000e+01 +1.050140000000000073e+00 -3.593750000000000000e+01 +1.050145000000000106e+00 -3.587500000000000000e+01 +1.050150000000000139e+00 -3.587500000000000000e+01 +1.050155000000000172e+00 -3.590625000000000000e+01 +1.050159999999999982e+00 -3.584375381469726562e+01 +1.050165000000000015e+00 -3.587500000000000000e+01 +1.050170000000000048e+00 -3.587500000000000000e+01 +1.050175000000000081e+00 -3.584375381469726562e+01 +1.050180000000000113e+00 -3.593750000000000000e+01 +1.050185000000000146e+00 -3.581250000000000000e+01 +1.050190000000000179e+00 -3.584375381469726562e+01 +1.050194999999999990e+00 -3.587500000000000000e+01 +1.050200000000000022e+00 -3.584375381469726562e+01 +1.050205000000000055e+00 -3.590625000000000000e+01 +1.050210000000000088e+00 -3.590625000000000000e+01 +1.050215000000000121e+00 -3.587500000000000000e+01 +1.050220000000000153e+00 -3.590625000000000000e+01 +1.050225000000000186e+00 -3.587500000000000000e+01 +1.050229999999999997e+00 -3.587500000000000000e+01 +1.050235000000000030e+00 -3.581250000000000000e+01 +1.050240000000000062e+00 -3.587500000000000000e+01 +1.050245000000000095e+00 -3.575000000000000000e+01 +1.050250000000000128e+00 -3.584375381469726562e+01 +1.050255000000000161e+00 -3.575000000000000000e+01 +1.050260000000000193e+00 -3.578125000000000000e+01 +1.050265000000000004e+00 -3.584375381469726562e+01 +1.050270000000000037e+00 -3.584375381469726562e+01 +1.050275000000000070e+00 -3.584375381469726562e+01 +1.050280000000000102e+00 -3.584375381469726562e+01 +1.050285000000000135e+00 -3.578125000000000000e+01 +1.050290000000000168e+00 -3.584375381469726562e+01 +1.050294999999999979e+00 -3.578125000000000000e+01 +1.050300000000000011e+00 -3.578125000000000000e+01 +1.050305000000000044e+00 -3.584375381469726562e+01 +1.050310000000000077e+00 -3.581250000000000000e+01 +1.050315000000000110e+00 -3.578125000000000000e+01 +1.050320000000000142e+00 -3.578125000000000000e+01 +1.050325000000000175e+00 -3.581250000000000000e+01 +1.050329999999999986e+00 -3.581250000000000000e+01 +1.050335000000000019e+00 -3.578125000000000000e+01 +1.050340000000000051e+00 -3.575000000000000000e+01 +1.050345000000000084e+00 -3.578125000000000000e+01 +1.050350000000000117e+00 -3.575000000000000000e+01 +1.050355000000000150e+00 -3.578125000000000000e+01 +1.050360000000000182e+00 -3.575000000000000000e+01 +1.050364999999999993e+00 -3.578125000000000000e+01 +1.050370000000000026e+00 -3.578125000000000000e+01 +1.050375000000000059e+00 -3.581250000000000000e+01 +1.050380000000000091e+00 -3.571875000000000000e+01 +1.050385000000000124e+00 -3.575000000000000000e+01 +1.050390000000000157e+00 -3.571875000000000000e+01 +1.050395000000000190e+00 -3.571875000000000000e+01 +1.050400000000000000e+00 -3.575000000000000000e+01 +1.050405000000000033e+00 -3.571875000000000000e+01 +1.050410000000000066e+00 -3.568750381469726562e+01 +1.050415000000000099e+00 -3.571875000000000000e+01 +1.050420000000000131e+00 -3.571875000000000000e+01 +1.050425000000000164e+00 -3.571875000000000000e+01 +1.050430000000000197e+00 -3.571875000000000000e+01 +1.050435000000000008e+00 -3.571875000000000000e+01 +1.050440000000000040e+00 -3.565625000000000000e+01 +1.050445000000000073e+00 -3.568750381469726562e+01 +1.050450000000000106e+00 -3.562500000000000000e+01 +1.050455000000000139e+00 -3.568750381469726562e+01 +1.050460000000000171e+00 -3.565625000000000000e+01 +1.050464999999999982e+00 -3.568750381469726562e+01 +1.050470000000000015e+00 -3.568750381469726562e+01 +1.050475000000000048e+00 -3.571875000000000000e+01 +1.050480000000000080e+00 -3.565625000000000000e+01 +1.050485000000000113e+00 -3.565625000000000000e+01 +1.050490000000000146e+00 -3.571875000000000000e+01 +1.050495000000000179e+00 -3.568750381469726562e+01 +1.050499999999999989e+00 -3.571875000000000000e+01 +1.050505000000000022e+00 -3.565625000000000000e+01 +1.050510000000000055e+00 -3.565625000000000000e+01 +1.050515000000000088e+00 -3.568750381469726562e+01 +1.050520000000000120e+00 -3.559375000000000000e+01 +1.050525000000000153e+00 -3.571875000000000000e+01 +1.050530000000000186e+00 -3.568750381469726562e+01 +1.050534999999999997e+00 -3.568750381469726562e+01 +1.050540000000000029e+00 -3.565625000000000000e+01 +1.050545000000000062e+00 -3.565625000000000000e+01 +1.050550000000000095e+00 -3.571875000000000000e+01 +1.050555000000000128e+00 -3.565625000000000000e+01 +1.050560000000000160e+00 -3.568750381469726562e+01 +1.050565000000000193e+00 -3.568750381469726562e+01 +1.050570000000000004e+00 -3.562500000000000000e+01 +1.050575000000000037e+00 -3.562500000000000000e+01 +1.050580000000000069e+00 -3.559375000000000000e+01 +1.050585000000000102e+00 -3.562500000000000000e+01 +1.050590000000000135e+00 -3.562500000000000000e+01 +1.050595000000000168e+00 -3.565625000000000000e+01 +1.050599999999999978e+00 -3.565625000000000000e+01 +1.050605000000000011e+00 -3.562500000000000000e+01 +1.050610000000000044e+00 -3.556250000000000000e+01 +1.050615000000000077e+00 -3.565625000000000000e+01 +1.050620000000000109e+00 -3.559375000000000000e+01 +1.050625000000000142e+00 -3.562500000000000000e+01 +1.050630000000000175e+00 -3.562500000000000000e+01 +1.050634999999999986e+00 -3.565625000000000000e+01 +1.050640000000000018e+00 -3.559375000000000000e+01 +1.050645000000000051e+00 -3.559375000000000000e+01 +1.050650000000000084e+00 -3.565625000000000000e+01 +1.050655000000000117e+00 -3.565625000000000000e+01 +1.050660000000000149e+00 -3.562500000000000000e+01 +1.050665000000000182e+00 -3.556250000000000000e+01 +1.050669999999999993e+00 -3.568750381469726562e+01 +1.050675000000000026e+00 -3.565625000000000000e+01 +1.050680000000000058e+00 -3.559375000000000000e+01 +1.050685000000000091e+00 -3.562500000000000000e+01 +1.050690000000000124e+00 -3.559375000000000000e+01 +1.050695000000000157e+00 -3.562500000000000000e+01 +1.050700000000000189e+00 -3.562500000000000000e+01 +1.050705000000000000e+00 -3.565625000000000000e+01 +1.050710000000000033e+00 -3.559375000000000000e+01 +1.050715000000000066e+00 -3.559375000000000000e+01 +1.050720000000000098e+00 -3.562500000000000000e+01 +1.050725000000000131e+00 -3.559375000000000000e+01 +1.050730000000000164e+00 -3.559375000000000000e+01 +1.050735000000000197e+00 -3.562500000000000000e+01 +1.050740000000000007e+00 -3.559375000000000000e+01 +1.050745000000000040e+00 -3.556250000000000000e+01 +1.050750000000000073e+00 -3.559375000000000000e+01 +1.050755000000000106e+00 -3.559375000000000000e+01 +1.050760000000000138e+00 -3.556250000000000000e+01 +1.050765000000000171e+00 -3.565625000000000000e+01 +1.050769999999999982e+00 -3.565625000000000000e+01 +1.050775000000000015e+00 -3.559375000000000000e+01 +1.050780000000000047e+00 -3.562500000000000000e+01 +1.050785000000000080e+00 -3.562500000000000000e+01 +1.050790000000000113e+00 -3.565625000000000000e+01 +1.050795000000000146e+00 -3.562500000000000000e+01 +1.050800000000000178e+00 -3.556250000000000000e+01 +1.050804999999999989e+00 -3.565625000000000000e+01 +1.050810000000000022e+00 -3.559375000000000000e+01 +1.050815000000000055e+00 -3.559375000000000000e+01 +1.050820000000000087e+00 -3.559375000000000000e+01 +1.050825000000000120e+00 -3.556250000000000000e+01 +1.050830000000000153e+00 -3.553125381469726562e+01 +1.050835000000000186e+00 -3.559375000000000000e+01 +1.050839999999999996e+00 -3.565625000000000000e+01 +1.050845000000000029e+00 -3.559375000000000000e+01 +1.050850000000000062e+00 -3.556250000000000000e+01 +1.050855000000000095e+00 -3.565625000000000000e+01 +1.050860000000000127e+00 -3.559375000000000000e+01 +1.050865000000000160e+00 -3.559375000000000000e+01 +1.050870000000000193e+00 -3.559375000000000000e+01 +1.050875000000000004e+00 -3.562500000000000000e+01 +1.050880000000000036e+00 -3.553125381469726562e+01 +1.050885000000000069e+00 -3.553125381469726562e+01 +1.050890000000000102e+00 -3.556250000000000000e+01 +1.050895000000000135e+00 -3.556250000000000000e+01 +1.050900000000000167e+00 -3.553125381469726562e+01 +1.050904999999999978e+00 -3.553125381469726562e+01 +1.050910000000000011e+00 -3.559375000000000000e+01 +1.050915000000000044e+00 -3.550000000000000000e+01 +1.050920000000000076e+00 -3.556250000000000000e+01 +1.050925000000000109e+00 -3.559375000000000000e+01 +1.050930000000000142e+00 -3.562500000000000000e+01 +1.050935000000000175e+00 -3.556250000000000000e+01 +1.050939999999999985e+00 -3.559375000000000000e+01 +1.050945000000000018e+00 -3.565625000000000000e+01 +1.050950000000000051e+00 -3.553125381469726562e+01 +1.050955000000000084e+00 -3.556250000000000000e+01 +1.050960000000000116e+00 -3.559375000000000000e+01 +1.050965000000000149e+00 -3.553125381469726562e+01 +1.050970000000000182e+00 -3.556250000000000000e+01 +1.050974999999999993e+00 -3.553125381469726562e+01 +1.050980000000000025e+00 -3.553125381469726562e+01 +1.050985000000000058e+00 -3.556250000000000000e+01 +1.050990000000000091e+00 -3.546875000000000000e+01 +1.050995000000000124e+00 -3.556250000000000000e+01 +1.051000000000000156e+00 -3.553125381469726562e+01 +1.051005000000000189e+00 -3.553125381469726562e+01 +1.051010000000000000e+00 -3.550000000000000000e+01 +1.051015000000000033e+00 -3.553125381469726562e+01 +1.051020000000000065e+00 -3.553125381469726562e+01 +1.051025000000000098e+00 -3.550000000000000000e+01 +1.051030000000000131e+00 -3.546875000000000000e+01 +1.051035000000000164e+00 -3.546875000000000000e+01 +1.051040000000000196e+00 -3.543750381469726562e+01 +1.051045000000000007e+00 -3.553125381469726562e+01 +1.051050000000000040e+00 -3.543750381469726562e+01 +1.051055000000000073e+00 -3.550000000000000000e+01 +1.051060000000000105e+00 -3.546875000000000000e+01 +1.051065000000000138e+00 -3.546875000000000000e+01 +1.051070000000000171e+00 -3.546875000000000000e+01 +1.051074999999999982e+00 -3.550000000000000000e+01 +1.051080000000000014e+00 -3.540625000000000000e+01 +1.051085000000000047e+00 -3.543750381469726562e+01 +1.051090000000000080e+00 -3.534375000000000000e+01 +1.051095000000000113e+00 -3.543750381469726562e+01 +1.051100000000000145e+00 -3.534375000000000000e+01 +1.051105000000000178e+00 -3.537500000000000000e+01 +1.051109999999999989e+00 -3.537500000000000000e+01 +1.051115000000000022e+00 -3.537500000000000000e+01 +1.051120000000000054e+00 -3.537500000000000000e+01 +1.051125000000000087e+00 -3.537500000000000000e+01 +1.051130000000000120e+00 -3.540625000000000000e+01 +1.051135000000000153e+00 -3.534375000000000000e+01 +1.051140000000000185e+00 -3.534375000000000000e+01 +1.051144999999999996e+00 -3.537500000000000000e+01 +1.051150000000000029e+00 -3.540625000000000000e+01 +1.051155000000000062e+00 -3.540625000000000000e+01 +1.051160000000000094e+00 -3.534375000000000000e+01 +1.051165000000000127e+00 -3.534375000000000000e+01 +1.051170000000000160e+00 -3.534375000000000000e+01 +1.051175000000000193e+00 -3.531250000000000000e+01 +1.051180000000000003e+00 -3.531250000000000000e+01 +1.051185000000000036e+00 -3.534375000000000000e+01 +1.051190000000000069e+00 -3.528125381469726562e+01 +1.051195000000000102e+00 -3.528125381469726562e+01 +1.051200000000000134e+00 -3.531250000000000000e+01 +1.051205000000000167e+00 -3.528125381469726562e+01 +1.051209999999999978e+00 -3.525000000000000000e+01 +1.051215000000000011e+00 -3.521875000000000000e+01 +1.051220000000000043e+00 -3.521875000000000000e+01 +1.051225000000000076e+00 -3.518750000000000000e+01 +1.051230000000000109e+00 -3.518750000000000000e+01 +1.051235000000000142e+00 -3.521875000000000000e+01 +1.051240000000000174e+00 -3.518750000000000000e+01 +1.051244999999999985e+00 -3.525000000000000000e+01 +1.051250000000000018e+00 -3.525000000000000000e+01 +1.051255000000000051e+00 -3.518750000000000000e+01 +1.051260000000000083e+00 -3.521875000000000000e+01 +1.051265000000000116e+00 -3.518750000000000000e+01 +1.051270000000000149e+00 -3.515625000000000000e+01 +1.051275000000000182e+00 -3.515625000000000000e+01 +1.051279999999999992e+00 -3.515625000000000000e+01 +1.051285000000000025e+00 -3.515625000000000000e+01 +1.051290000000000058e+00 -3.515625000000000000e+01 +1.051295000000000091e+00 -3.512500381469726562e+01 +1.051300000000000123e+00 -3.515625000000000000e+01 +1.051305000000000156e+00 -3.512500381469726562e+01 +1.051310000000000189e+00 -3.509375000000000000e+01 +1.051315000000000000e+00 -3.515625000000000000e+01 +1.051320000000000032e+00 -3.506250000000000000e+01 +1.051325000000000065e+00 -3.509375000000000000e+01 +1.051330000000000098e+00 -3.512500381469726562e+01 +1.051335000000000131e+00 -3.503125000000000000e+01 +1.051340000000000163e+00 -3.509375000000000000e+01 +1.051345000000000196e+00 -3.512500381469726562e+01 +1.051350000000000007e+00 -3.506250000000000000e+01 +1.051355000000000040e+00 -3.506250000000000000e+01 +1.051360000000000072e+00 -3.503125000000000000e+01 +1.051365000000000105e+00 -3.509375000000000000e+01 +1.051370000000000138e+00 -3.506250000000000000e+01 +1.051375000000000171e+00 -3.512500381469726562e+01 +1.051379999999999981e+00 -3.506250000000000000e+01 +1.051385000000000014e+00 -3.503125000000000000e+01 +1.051390000000000047e+00 -3.500000000000000000e+01 +1.051395000000000080e+00 -3.503125000000000000e+01 +1.051400000000000112e+00 -3.503125000000000000e+01 +1.051405000000000145e+00 -3.503125000000000000e+01 +1.051410000000000178e+00 -3.509375000000000000e+01 +1.051414999999999988e+00 -3.500000000000000000e+01 +1.051420000000000021e+00 -3.500000000000000000e+01 +1.051425000000000054e+00 -3.503125000000000000e+01 +1.051430000000000087e+00 -3.503125000000000000e+01 +1.051435000000000120e+00 -3.503125000000000000e+01 +1.051440000000000152e+00 -3.503125000000000000e+01 +1.051445000000000185e+00 -3.503125000000000000e+01 +1.051449999999999996e+00 -3.500000000000000000e+01 +1.051455000000000028e+00 -3.503125000000000000e+01 +1.051460000000000061e+00 -3.496875381469726562e+01 +1.051465000000000094e+00 -3.500000000000000000e+01 +1.051470000000000127e+00 -3.503125000000000000e+01 +1.051475000000000160e+00 -3.500000000000000000e+01 +1.051480000000000192e+00 -3.503125000000000000e+01 +1.051485000000000003e+00 -3.500000000000000000e+01 +1.051490000000000036e+00 -3.500000000000000000e+01 +1.051495000000000068e+00 -3.500000000000000000e+01 +1.051500000000000101e+00 -3.500000000000000000e+01 +1.051505000000000134e+00 -3.500000000000000000e+01 +1.051510000000000167e+00 -3.503125000000000000e+01 +1.051514999999999977e+00 -3.496875381469726562e+01 +1.051520000000000010e+00 -3.496875381469726562e+01 +1.051525000000000043e+00 -3.503125000000000000e+01 +1.051530000000000076e+00 -3.500000000000000000e+01 +1.051535000000000108e+00 -3.500000000000000000e+01 +1.051540000000000141e+00 -3.500000000000000000e+01 +1.051545000000000174e+00 -3.493750000000000000e+01 +1.051549999999999985e+00 -3.496875381469726562e+01 +1.051555000000000017e+00 -3.496875381469726562e+01 +1.051560000000000050e+00 -3.490625000000000000e+01 +1.051565000000000083e+00 -3.490625000000000000e+01 +1.051570000000000116e+00 -3.493750000000000000e+01 +1.051575000000000149e+00 -3.490625000000000000e+01 +1.051580000000000181e+00 -3.493750000000000000e+01 +1.051584999999999992e+00 -3.490625000000000000e+01 +1.051590000000000025e+00 -3.493750000000000000e+01 +1.051595000000000057e+00 -3.490625000000000000e+01 +1.051600000000000090e+00 -3.493750000000000000e+01 +1.051605000000000123e+00 -3.493750000000000000e+01 +1.051610000000000156e+00 -3.490625000000000000e+01 +1.051615000000000189e+00 -3.493750000000000000e+01 +1.051619999999999999e+00 -3.487500000000000000e+01 +1.051625000000000032e+00 -3.487500000000000000e+01 +1.051630000000000065e+00 -3.481250381469726562e+01 +1.051635000000000097e+00 -3.484375000000000000e+01 +1.051640000000000130e+00 -3.484375000000000000e+01 +1.051645000000000163e+00 -3.481250381469726562e+01 +1.051650000000000196e+00 -3.490625000000000000e+01 +1.051655000000000006e+00 -3.484375000000000000e+01 +1.051660000000000039e+00 -3.487500000000000000e+01 +1.051665000000000072e+00 -3.478125000000000000e+01 +1.051670000000000105e+00 -3.487500000000000000e+01 +1.051675000000000137e+00 -3.484375000000000000e+01 +1.051680000000000170e+00 -3.475000000000000000e+01 +1.051684999999999981e+00 -3.484375000000000000e+01 +1.051690000000000014e+00 -3.484375000000000000e+01 +1.051695000000000046e+00 -3.481250381469726562e+01 +1.051700000000000079e+00 -3.478125000000000000e+01 +1.051705000000000112e+00 -3.481250381469726562e+01 +1.051710000000000145e+00 -3.478125000000000000e+01 +1.051715000000000177e+00 -3.487500000000000000e+01 +1.051719999999999988e+00 -3.481250381469726562e+01 +1.051725000000000021e+00 -3.478125000000000000e+01 +1.051730000000000054e+00 -3.478125000000000000e+01 +1.051735000000000086e+00 -3.478125000000000000e+01 +1.051740000000000119e+00 -3.484375000000000000e+01 +1.051745000000000152e+00 -3.481250381469726562e+01 +1.051750000000000185e+00 -3.475000000000000000e+01 +1.051754999999999995e+00 -3.475000000000000000e+01 +1.051760000000000028e+00 -3.478125000000000000e+01 +1.051765000000000061e+00 -3.475000000000000000e+01 +1.051770000000000094e+00 -3.471875000000000000e+01 +1.051775000000000126e+00 -3.478125000000000000e+01 +1.051780000000000159e+00 -3.481250381469726562e+01 +1.051785000000000192e+00 -3.475000000000000000e+01 +1.051790000000000003e+00 -3.465625000000000000e+01 +1.051795000000000035e+00 -3.471875000000000000e+01 +1.051800000000000068e+00 -3.465625000000000000e+01 +1.051805000000000101e+00 -3.471875000000000000e+01 +1.051810000000000134e+00 -3.471875000000000000e+01 +1.051815000000000166e+00 -3.468750000000000000e+01 +1.051819999999999977e+00 -3.468750000000000000e+01 +1.051825000000000010e+00 -3.465625000000000000e+01 +1.051830000000000043e+00 -3.478125000000000000e+01 +1.051835000000000075e+00 -3.465625000000000000e+01 +1.051840000000000108e+00 -3.471875000000000000e+01 +1.051845000000000141e+00 -3.465625000000000000e+01 +1.051850000000000174e+00 -3.462500000000000000e+01 +1.051854999999999984e+00 -3.471875000000000000e+01 +1.051860000000000017e+00 -3.465625000000000000e+01 +1.051865000000000050e+00 -3.462500000000000000e+01 +1.051870000000000083e+00 -3.462500000000000000e+01 +1.051875000000000115e+00 -3.459375000000000000e+01 +1.051880000000000148e+00 -3.459375000000000000e+01 +1.051885000000000181e+00 -3.462500000000000000e+01 +1.051889999999999992e+00 -3.453125000000000000e+01 +1.051895000000000024e+00 -3.462500000000000000e+01 +1.051900000000000057e+00 -3.453125000000000000e+01 +1.051905000000000090e+00 -3.453125000000000000e+01 +1.051910000000000123e+00 -3.459375000000000000e+01 +1.051915000000000155e+00 -3.462500000000000000e+01 +1.051920000000000188e+00 -3.453125000000000000e+01 +1.051924999999999999e+00 -3.456250381469726562e+01 +1.051930000000000032e+00 -3.459375000000000000e+01 +1.051935000000000064e+00 -3.456250381469726562e+01 +1.051940000000000097e+00 -3.450000000000000000e+01 +1.051945000000000130e+00 -3.450000000000000000e+01 +1.051950000000000163e+00 -3.453125000000000000e+01 +1.051955000000000195e+00 -3.459375000000000000e+01 +1.051960000000000006e+00 -3.453125000000000000e+01 +1.051965000000000039e+00 -3.446875000000000000e+01 +1.051970000000000072e+00 -3.450000000000000000e+01 +1.051975000000000104e+00 -3.446875000000000000e+01 +1.051980000000000137e+00 -3.446875000000000000e+01 +1.051985000000000170e+00 -3.446875000000000000e+01 +1.051989999999999981e+00 -3.443750000000000000e+01 +1.051995000000000013e+00 -3.450000000000000000e+01 +1.052000000000000046e+00 -3.443750000000000000e+01 +1.052005000000000079e+00 -3.434375000000000000e+01 +1.052010000000000112e+00 -3.443750000000000000e+01 +1.052015000000000144e+00 -3.443750000000000000e+01 +1.052020000000000177e+00 -3.437500000000000000e+01 +1.052024999999999988e+00 -3.437500000000000000e+01 +1.052030000000000021e+00 -3.431250000000000000e+01 +1.052035000000000053e+00 -3.443750000000000000e+01 +1.052040000000000086e+00 -3.434375000000000000e+01 +1.052045000000000119e+00 -3.434375000000000000e+01 +1.052050000000000152e+00 -3.434375000000000000e+01 +1.052055000000000184e+00 -3.428125000000000000e+01 +1.052059999999999995e+00 -3.431250000000000000e+01 +1.052065000000000028e+00 -3.428125000000000000e+01 +1.052070000000000061e+00 -3.431250000000000000e+01 +1.052075000000000093e+00 -3.425000381469726562e+01 +1.052080000000000126e+00 -3.428125000000000000e+01 +1.052085000000000159e+00 -3.428125000000000000e+01 +1.052090000000000192e+00 -3.428125000000000000e+01 +1.052095000000000002e+00 -3.425000381469726562e+01 +1.052100000000000035e+00 -3.425000381469726562e+01 +1.052105000000000068e+00 -3.421875000000000000e+01 +1.052110000000000101e+00 -3.428125000000000000e+01 +1.052115000000000133e+00 -3.428125000000000000e+01 +1.052120000000000166e+00 -3.421875000000000000e+01 +1.052124999999999977e+00 -3.425000381469726562e+01 +1.052130000000000010e+00 -3.421875000000000000e+01 +1.052135000000000042e+00 -3.415625000000000000e+01 +1.052140000000000075e+00 -3.418750000000000000e+01 +1.052145000000000108e+00 -3.418750000000000000e+01 +1.052150000000000141e+00 -3.418750000000000000e+01 +1.052155000000000173e+00 -3.415625000000000000e+01 +1.052159999999999984e+00 -3.415625000000000000e+01 +1.052165000000000017e+00 -3.421875000000000000e+01 +1.052170000000000050e+00 -3.418750000000000000e+01 +1.052175000000000082e+00 -3.418750000000000000e+01 +1.052180000000000115e+00 -3.425000381469726562e+01 +1.052185000000000148e+00 -3.418750000000000000e+01 +1.052190000000000181e+00 -3.421875000000000000e+01 +1.052194999999999991e+00 -3.418750000000000000e+01 +1.052200000000000024e+00 -3.412500000000000000e+01 +1.052205000000000057e+00 -3.418750000000000000e+01 +1.052210000000000090e+00 -3.418750000000000000e+01 +1.052215000000000122e+00 -3.415625000000000000e+01 +1.052220000000000155e+00 -3.415625000000000000e+01 +1.052225000000000188e+00 -3.415625000000000000e+01 +1.052229999999999999e+00 -3.415625000000000000e+01 +1.052235000000000031e+00 -3.412500000000000000e+01 +1.052240000000000064e+00 -3.406250000000000000e+01 +1.052245000000000097e+00 -3.409375381469726562e+01 +1.052250000000000130e+00 -3.415625000000000000e+01 +1.052255000000000162e+00 -3.412500000000000000e+01 +1.052260000000000195e+00 -3.409375381469726562e+01 +1.052265000000000006e+00 -3.409375381469726562e+01 +1.052270000000000039e+00 -3.403125000000000000e+01 +1.052275000000000071e+00 -3.406250000000000000e+01 +1.052280000000000104e+00 -3.403125000000000000e+01 +1.052285000000000137e+00 -3.403125000000000000e+01 +1.052290000000000170e+00 -3.406250000000000000e+01 +1.052294999999999980e+00 -3.403125000000000000e+01 +1.052300000000000013e+00 -3.406250000000000000e+01 +1.052305000000000046e+00 -3.403125000000000000e+01 +1.052310000000000079e+00 -3.403125000000000000e+01 +1.052315000000000111e+00 -3.400000000000000000e+01 +1.052320000000000144e+00 -3.400000000000000000e+01 +1.052325000000000177e+00 -3.396875000000000000e+01 +1.052329999999999988e+00 -3.400000000000000000e+01 +1.052335000000000020e+00 -3.393750000000000000e+01 +1.052340000000000053e+00 -3.403125000000000000e+01 +1.052345000000000086e+00 -3.403125000000000000e+01 +1.052350000000000119e+00 -3.396875000000000000e+01 +1.052355000000000151e+00 -3.396875000000000000e+01 +1.052360000000000184e+00 -3.390625000000000000e+01 +1.052364999999999995e+00 -3.393750000000000000e+01 +1.052370000000000028e+00 -3.393750000000000000e+01 +1.052375000000000060e+00 -3.396875000000000000e+01 +1.052380000000000093e+00 -3.396875000000000000e+01 +1.052385000000000126e+00 -3.400000000000000000e+01 +1.052390000000000159e+00 -3.390625000000000000e+01 +1.052395000000000191e+00 -3.390625000000000000e+01 +1.052400000000000002e+00 -3.396875000000000000e+01 +1.052405000000000035e+00 -3.390625000000000000e+01 +1.052410000000000068e+00 -3.381250000000000000e+01 +1.052415000000000100e+00 -3.390625000000000000e+01 +1.052420000000000133e+00 -3.390625000000000000e+01 +1.052425000000000166e+00 -3.387500000000000000e+01 +1.052429999999999977e+00 -3.387500000000000000e+01 +1.052435000000000009e+00 -3.384375381469726562e+01 +1.052440000000000042e+00 -3.384375381469726562e+01 +1.052445000000000075e+00 -3.387500000000000000e+01 +1.052450000000000108e+00 -3.387500000000000000e+01 +1.052455000000000140e+00 -3.387500000000000000e+01 +1.052460000000000173e+00 -3.381250000000000000e+01 +1.052464999999999984e+00 -3.384375381469726562e+01 +1.052470000000000017e+00 -3.393750000000000000e+01 +1.052475000000000049e+00 -3.387500000000000000e+01 +1.052480000000000082e+00 -3.384375381469726562e+01 +1.052485000000000115e+00 -3.384375381469726562e+01 +1.052490000000000148e+00 -3.381250000000000000e+01 +1.052495000000000180e+00 -3.375000000000000000e+01 +1.052499999999999991e+00 -3.378125000000000000e+01 +1.052505000000000024e+00 -3.384375381469726562e+01 +1.052510000000000057e+00 -3.375000000000000000e+01 +1.052515000000000089e+00 -3.384375381469726562e+01 +1.052520000000000122e+00 -3.378125000000000000e+01 +1.052525000000000155e+00 -3.378125000000000000e+01 +1.052530000000000188e+00 -3.384375381469726562e+01 +1.052534999999999998e+00 -3.381250000000000000e+01 +1.052540000000000031e+00 -3.378125000000000000e+01 +1.052545000000000064e+00 -3.378125000000000000e+01 +1.052550000000000097e+00 -3.378125000000000000e+01 +1.052555000000000129e+00 -3.378125000000000000e+01 +1.052560000000000162e+00 -3.381250000000000000e+01 +1.052565000000000195e+00 -3.378125000000000000e+01 +1.052570000000000006e+00 -3.378125000000000000e+01 +1.052575000000000038e+00 -3.384375381469726562e+01 +1.052580000000000071e+00 -3.375000000000000000e+01 +1.052585000000000104e+00 -3.378125000000000000e+01 +1.052590000000000137e+00 -3.378125000000000000e+01 +1.052595000000000169e+00 -3.368750381469726562e+01 +1.052599999999999980e+00 -3.368750381469726562e+01 +1.052605000000000013e+00 -3.371875000000000000e+01 +1.052610000000000046e+00 -3.378125000000000000e+01 +1.052615000000000078e+00 -3.368750381469726562e+01 +1.052620000000000111e+00 -3.375000000000000000e+01 +1.052625000000000144e+00 -3.371875000000000000e+01 +1.052630000000000177e+00 -3.371875000000000000e+01 +1.052634999999999987e+00 -3.368750381469726562e+01 +1.052640000000000020e+00 -3.371875000000000000e+01 +1.052645000000000053e+00 -3.365625000000000000e+01 +1.052650000000000086e+00 -3.365625000000000000e+01 +1.052655000000000118e+00 -3.365625000000000000e+01 +1.052660000000000151e+00 -3.371875000000000000e+01 +1.052665000000000184e+00 -3.371875000000000000e+01 +1.052669999999999995e+00 -3.365625000000000000e+01 +1.052675000000000027e+00 -3.368750381469726562e+01 +1.052680000000000060e+00 -3.375000000000000000e+01 +1.052685000000000093e+00 -3.362500000000000000e+01 +1.052690000000000126e+00 -3.368750381469726562e+01 +1.052695000000000158e+00 -3.365625000000000000e+01 +1.052700000000000191e+00 -3.368750381469726562e+01 +1.052705000000000002e+00 -3.368750381469726562e+01 +1.052710000000000035e+00 -3.368750381469726562e+01 +1.052715000000000067e+00 -3.365625000000000000e+01 +1.052720000000000100e+00 -3.365625000000000000e+01 +1.052725000000000133e+00 -3.365625000000000000e+01 +1.052730000000000166e+00 -3.362500000000000000e+01 +1.052734999999999976e+00 -3.365625000000000000e+01 +1.052740000000000009e+00 -3.365625000000000000e+01 +1.052745000000000042e+00 -3.362500000000000000e+01 +1.052750000000000075e+00 -3.359375000000000000e+01 +1.052755000000000107e+00 -3.362500000000000000e+01 +1.052760000000000140e+00 -3.362500000000000000e+01 +1.052765000000000173e+00 -3.356250000000000000e+01 +1.052769999999999984e+00 -3.356250000000000000e+01 +1.052775000000000016e+00 -3.353125381469726562e+01 +1.052780000000000049e+00 -3.359375000000000000e+01 +1.052785000000000082e+00 -3.359375000000000000e+01 +1.052790000000000115e+00 -3.359375000000000000e+01 +1.052795000000000147e+00 -3.350000000000000000e+01 +1.052800000000000180e+00 -3.359375000000000000e+01 +1.052804999999999991e+00 -3.356250000000000000e+01 +1.052810000000000024e+00 -3.353125381469726562e+01 +1.052815000000000056e+00 -3.353125381469726562e+01 +1.052820000000000089e+00 -3.353125381469726562e+01 +1.052825000000000122e+00 -3.353125381469726562e+01 +1.052830000000000155e+00 -3.353125381469726562e+01 +1.052835000000000187e+00 -3.350000000000000000e+01 +1.052839999999999998e+00 -3.346875000000000000e+01 +1.052845000000000031e+00 -3.343750000000000000e+01 +1.052850000000000064e+00 -3.353125381469726562e+01 +1.052855000000000096e+00 -3.350000000000000000e+01 +1.052860000000000129e+00 -3.343750000000000000e+01 +1.052865000000000162e+00 -3.353125381469726562e+01 +1.052870000000000195e+00 -3.340625000000000000e+01 +1.052875000000000005e+00 -3.346875000000000000e+01 +1.052880000000000038e+00 -3.346875000000000000e+01 +1.052885000000000071e+00 -3.346875000000000000e+01 +1.052890000000000104e+00 -3.343750000000000000e+01 +1.052895000000000136e+00 -3.346875000000000000e+01 +1.052900000000000169e+00 -3.343750000000000000e+01 +1.052904999999999980e+00 -3.340625000000000000e+01 +1.052910000000000013e+00 -3.340625000000000000e+01 +1.052915000000000045e+00 -3.343750000000000000e+01 +1.052920000000000078e+00 -3.343750000000000000e+01 +1.052925000000000111e+00 -3.340625000000000000e+01 +1.052930000000000144e+00 -3.346875000000000000e+01 +1.052935000000000176e+00 -3.337500381469726562e+01 +1.052939999999999987e+00 -3.334375000000000000e+01 +1.052945000000000020e+00 -3.343750000000000000e+01 +1.052950000000000053e+00 -3.331250000000000000e+01 +1.052955000000000085e+00 -3.337500381469726562e+01 +1.052960000000000118e+00 -3.334375000000000000e+01 +1.052965000000000151e+00 -3.334375000000000000e+01 +1.052970000000000184e+00 -3.331250000000000000e+01 +1.052974999999999994e+00 -3.337500381469726562e+01 +1.052980000000000027e+00 -3.334375000000000000e+01 +1.052985000000000060e+00 -3.334375000000000000e+01 +1.052990000000000093e+00 -3.334375000000000000e+01 +1.052995000000000125e+00 -3.337500381469726562e+01 +1.053000000000000158e+00 -3.334375000000000000e+01 +1.053005000000000191e+00 -3.325000000000000000e+01 +1.053010000000000002e+00 -3.331250000000000000e+01 +1.053015000000000034e+00 -3.328125000000000000e+01 +1.053020000000000067e+00 -3.328125000000000000e+01 +1.053025000000000100e+00 -3.331250000000000000e+01 +1.053030000000000133e+00 -3.331250000000000000e+01 +1.053035000000000165e+00 -3.321875381469726562e+01 +1.053039999999999976e+00 -3.331250000000000000e+01 +1.053045000000000009e+00 -3.334375000000000000e+01 +1.053050000000000042e+00 -3.328125000000000000e+01 +1.053055000000000074e+00 -3.328125000000000000e+01 +1.053060000000000107e+00 -3.321875381469726562e+01 +1.053065000000000140e+00 -3.325000000000000000e+01 +1.053070000000000173e+00 -3.325000000000000000e+01 +1.053074999999999983e+00 -3.325000000000000000e+01 +1.053080000000000016e+00 -3.325000000000000000e+01 +1.053085000000000049e+00 -3.328125000000000000e+01 +1.053090000000000082e+00 -3.325000000000000000e+01 +1.053095000000000114e+00 -3.325000000000000000e+01 +1.053100000000000147e+00 -3.325000000000000000e+01 +1.053105000000000180e+00 -3.321875381469726562e+01 +1.053109999999999991e+00 -3.331250000000000000e+01 +1.053115000000000023e+00 -3.328125000000000000e+01 +1.053120000000000056e+00 -3.321875381469726562e+01 +1.053125000000000089e+00 -3.321875381469726562e+01 +1.053130000000000122e+00 -3.318750000000000000e+01 +1.053135000000000154e+00 -3.321875381469726562e+01 +1.053140000000000187e+00 -3.321875381469726562e+01 +1.053144999999999998e+00 -3.321875381469726562e+01 +1.053150000000000031e+00 -3.321875381469726562e+01 +1.053155000000000063e+00 -3.328125000000000000e+01 +1.053160000000000096e+00 -3.315625000000000000e+01 +1.053165000000000129e+00 -3.325000000000000000e+01 +1.053170000000000162e+00 -3.318750000000000000e+01 +1.053175000000000194e+00 -3.318750000000000000e+01 +1.053180000000000005e+00 -3.318750000000000000e+01 +1.053185000000000038e+00 -3.321875381469726562e+01 +1.053190000000000071e+00 -3.315625000000000000e+01 +1.053195000000000103e+00 -3.321875381469726562e+01 +1.053200000000000136e+00 -3.318750000000000000e+01 +1.053205000000000169e+00 -3.318750000000000000e+01 +1.053209999999999980e+00 -3.321875381469726562e+01 +1.053215000000000012e+00 -3.321875381469726562e+01 +1.053220000000000045e+00 -3.318750000000000000e+01 +1.053225000000000078e+00 -3.321875381469726562e+01 +1.053230000000000111e+00 -3.315625000000000000e+01 +1.053235000000000143e+00 -3.315625000000000000e+01 +1.053240000000000176e+00 -3.312500381469726562e+01 +1.053244999999999987e+00 -3.309375000000000000e+01 +1.053250000000000020e+00 -3.315625000000000000e+01 +1.053255000000000052e+00 -3.315625000000000000e+01 +1.053260000000000085e+00 -3.315625000000000000e+01 +1.053265000000000118e+00 -3.309375000000000000e+01 +1.053270000000000151e+00 -3.312500381469726562e+01 +1.053275000000000183e+00 -3.318750000000000000e+01 +1.053279999999999994e+00 -3.315625000000000000e+01 +1.053285000000000027e+00 -3.315625000000000000e+01 +1.053290000000000060e+00 -3.306250000000000000e+01 +1.053295000000000092e+00 -3.309375000000000000e+01 +1.053300000000000125e+00 -3.312500381469726562e+01 +1.053305000000000158e+00 -3.303125000000000000e+01 +1.053310000000000191e+00 -3.312500381469726562e+01 +1.053315000000000001e+00 -3.315625000000000000e+01 +1.053320000000000034e+00 -3.309375000000000000e+01 +1.053325000000000067e+00 -3.309375000000000000e+01 +1.053330000000000100e+00 -3.303125000000000000e+01 +1.053335000000000132e+00 -3.303125000000000000e+01 +1.053340000000000165e+00 -3.309375000000000000e+01 +1.053344999999999976e+00 -3.303125000000000000e+01 +1.053350000000000009e+00 -3.303125000000000000e+01 +1.053355000000000041e+00 -3.303125000000000000e+01 +1.053360000000000074e+00 -3.309375000000000000e+01 +1.053365000000000107e+00 -3.300000000000000000e+01 +1.053370000000000140e+00 -3.300000000000000000e+01 +1.053375000000000172e+00 -3.303125000000000000e+01 +1.053379999999999983e+00 -3.303125000000000000e+01 +1.053385000000000016e+00 -3.300000000000000000e+01 +1.053390000000000049e+00 -3.300000000000000000e+01 +1.053395000000000081e+00 -3.300000000000000000e+01 +1.053400000000000114e+00 -3.300000000000000000e+01 +1.053405000000000147e+00 -3.303125000000000000e+01 +1.053410000000000180e+00 -3.300000000000000000e+01 +1.053414999999999990e+00 -3.300000000000000000e+01 +1.053420000000000023e+00 -3.300000000000000000e+01 +1.053425000000000056e+00 -3.296875381469726562e+01 +1.053430000000000089e+00 -3.300000000000000000e+01 +1.053435000000000121e+00 -3.296875381469726562e+01 +1.053440000000000154e+00 -3.296875381469726562e+01 +1.053445000000000187e+00 -3.293750000000000000e+01 +1.053449999999999998e+00 -3.296875381469726562e+01 +1.053455000000000030e+00 -3.300000000000000000e+01 +1.053460000000000063e+00 -3.290625000000000000e+01 +1.053465000000000096e+00 -3.296875381469726562e+01 +1.053470000000000129e+00 -3.296875381469726562e+01 +1.053475000000000161e+00 -3.290625000000000000e+01 +1.053480000000000194e+00 -3.293750000000000000e+01 +1.053485000000000005e+00 -3.290625000000000000e+01 +1.053490000000000038e+00 -3.287500000000000000e+01 +1.053495000000000070e+00 -3.290625000000000000e+01 +1.053500000000000103e+00 -3.284375000000000000e+01 +1.053505000000000136e+00 -3.290625000000000000e+01 +1.053510000000000169e+00 -3.287500000000000000e+01 +1.053514999999999979e+00 -3.293750000000000000e+01 +1.053520000000000012e+00 -3.287500000000000000e+01 +1.053525000000000045e+00 -3.296875381469726562e+01 +1.053530000000000078e+00 -3.290625000000000000e+01 +1.053535000000000110e+00 -3.287500000000000000e+01 +1.053540000000000143e+00 -3.290625000000000000e+01 +1.053545000000000176e+00 -3.290625000000000000e+01 +1.053549999999999986e+00 -3.290625000000000000e+01 +1.053555000000000019e+00 -3.290625000000000000e+01 +1.053560000000000052e+00 -3.284375000000000000e+01 +1.053565000000000085e+00 -3.281250381469726562e+01 +1.053570000000000118e+00 -3.284375000000000000e+01 +1.053575000000000150e+00 -3.278125000000000000e+01 +1.053580000000000183e+00 -3.290625000000000000e+01 +1.053584999999999994e+00 -3.281250381469726562e+01 +1.053590000000000027e+00 -3.278125000000000000e+01 +1.053595000000000059e+00 -3.281250381469726562e+01 +1.053600000000000092e+00 -3.281250381469726562e+01 +1.053605000000000125e+00 -3.278125000000000000e+01 +1.053610000000000158e+00 -3.284375000000000000e+01 +1.053615000000000190e+00 -3.281250381469726562e+01 +1.053620000000000001e+00 -3.275000000000000000e+01 +1.053625000000000034e+00 -3.271875000000000000e+01 +1.053630000000000067e+00 -3.275000000000000000e+01 +1.053635000000000099e+00 -3.271875000000000000e+01 +1.053640000000000132e+00 -3.268750000000000000e+01 +1.053645000000000165e+00 -3.278125000000000000e+01 +1.053649999999999975e+00 -3.268750000000000000e+01 +1.053655000000000008e+00 -3.265625381469726562e+01 +1.053660000000000041e+00 -3.271875000000000000e+01 +1.053665000000000074e+00 -3.275000000000000000e+01 +1.053670000000000107e+00 -3.271875000000000000e+01 +1.053675000000000139e+00 -3.275000000000000000e+01 +1.053680000000000172e+00 -3.271875000000000000e+01 +1.053684999999999983e+00 -3.265625381469726562e+01 +1.053690000000000015e+00 -3.265625381469726562e+01 +1.053695000000000048e+00 -3.265625381469726562e+01 +1.053700000000000081e+00 -3.265625381469726562e+01 +1.053705000000000114e+00 -3.265625381469726562e+01 +1.053710000000000147e+00 -3.265625381469726562e+01 +1.053715000000000179e+00 -3.265625381469726562e+01 +1.053719999999999990e+00 -3.262500000000000000e+01 +1.053725000000000023e+00 -3.262500000000000000e+01 +1.053730000000000055e+00 -3.265625381469726562e+01 +1.053735000000000088e+00 -3.259375000000000000e+01 +1.053740000000000121e+00 -3.268750000000000000e+01 +1.053745000000000154e+00 -3.265625381469726562e+01 +1.053750000000000187e+00 -3.262500000000000000e+01 +1.053754999999999997e+00 -3.268750000000000000e+01 +1.053760000000000030e+00 -3.262500000000000000e+01 +1.053765000000000063e+00 -3.262500000000000000e+01 +1.053770000000000095e+00 -3.262500000000000000e+01 +1.053775000000000128e+00 -3.256250000000000000e+01 +1.053780000000000161e+00 -3.256250000000000000e+01 +1.053785000000000194e+00 -3.259375000000000000e+01 +1.053790000000000004e+00 -3.256250000000000000e+01 +1.053795000000000037e+00 -3.250000381469726562e+01 +1.053800000000000070e+00 -3.256250000000000000e+01 +1.053805000000000103e+00 -3.256250000000000000e+01 +1.053810000000000136e+00 -3.259375000000000000e+01 +1.053815000000000168e+00 -3.256250000000000000e+01 +1.053819999999999979e+00 -3.256250000000000000e+01 +1.053825000000000012e+00 -3.253125000000000000e+01 +1.053830000000000044e+00 -3.256250000000000000e+01 +1.053835000000000077e+00 -3.256250000000000000e+01 +1.053840000000000110e+00 -3.259375000000000000e+01 +1.053845000000000143e+00 -3.256250000000000000e+01 +1.053850000000000176e+00 -3.253125000000000000e+01 +1.053854999999999986e+00 -3.259375000000000000e+01 +1.053860000000000019e+00 -3.253125000000000000e+01 +1.053865000000000052e+00 -3.253125000000000000e+01 +1.053870000000000084e+00 -3.256250000000000000e+01 +1.053875000000000117e+00 -3.259375000000000000e+01 +1.053880000000000150e+00 -3.259375000000000000e+01 +1.053885000000000183e+00 -3.256250000000000000e+01 +1.053889999999999993e+00 -3.253125000000000000e+01 +1.053895000000000026e+00 -3.250000381469726562e+01 +1.053900000000000059e+00 -3.250000381469726562e+01 +1.053905000000000092e+00 -3.256250000000000000e+01 +1.053910000000000124e+00 -3.250000381469726562e+01 +1.053915000000000157e+00 -3.253125000000000000e+01 +1.053920000000000190e+00 -3.250000381469726562e+01 +1.053925000000000001e+00 -3.253125000000000000e+01 +1.053930000000000033e+00 -3.253125000000000000e+01 +1.053935000000000066e+00 -3.250000381469726562e+01 +1.053940000000000099e+00 -3.250000381469726562e+01 +1.053945000000000132e+00 -3.250000381469726562e+01 +1.053950000000000164e+00 -3.253125000000000000e+01 +1.053954999999999975e+00 -3.250000381469726562e+01 +1.053960000000000008e+00 -3.246875000000000000e+01 +1.053965000000000041e+00 -3.250000381469726562e+01 +1.053970000000000073e+00 -3.250000381469726562e+01 +1.053975000000000106e+00 -3.250000381469726562e+01 +1.053980000000000139e+00 -3.250000381469726562e+01 +1.053985000000000172e+00 -3.250000381469726562e+01 +1.053989999999999982e+00 -3.253125000000000000e+01 +1.053995000000000015e+00 -3.246875000000000000e+01 +1.054000000000000048e+00 -3.246875000000000000e+01 +1.054005000000000081e+00 -3.250000381469726562e+01 +1.054010000000000113e+00 -3.246875000000000000e+01 +1.054015000000000146e+00 -3.243750000000000000e+01 +1.054020000000000179e+00 -3.243750000000000000e+01 +1.054024999999999990e+00 -3.246875000000000000e+01 +1.054030000000000022e+00 -3.253125000000000000e+01 +1.054035000000000055e+00 -3.246875000000000000e+01 +1.054040000000000088e+00 -3.246875000000000000e+01 +1.054045000000000121e+00 -3.246875000000000000e+01 +1.054050000000000153e+00 -3.243750000000000000e+01 +1.054055000000000186e+00 -3.246875000000000000e+01 +1.054059999999999997e+00 -3.243750000000000000e+01 +1.054065000000000030e+00 -3.243750000000000000e+01 +1.054070000000000062e+00 -3.246875000000000000e+01 +1.054075000000000095e+00 -3.243750000000000000e+01 +1.054080000000000128e+00 -3.243750000000000000e+01 +1.054085000000000161e+00 -3.243750000000000000e+01 +1.054090000000000193e+00 -3.240625000000000000e+01 +1.054095000000000004e+00 -3.243750000000000000e+01 +1.054100000000000037e+00 -3.240625000000000000e+01 +1.054105000000000070e+00 -3.237500000000000000e+01 +1.054110000000000102e+00 -3.237500000000000000e+01 +1.054115000000000135e+00 -3.240625000000000000e+01 +1.054120000000000168e+00 -3.234375000000000000e+01 +1.054124999999999979e+00 -3.240625000000000000e+01 +1.054130000000000011e+00 -3.246875000000000000e+01 +1.054135000000000044e+00 -3.234375000000000000e+01 +1.054140000000000077e+00 -3.237500000000000000e+01 +1.054145000000000110e+00 -3.234375000000000000e+01 +1.054150000000000142e+00 -3.234375000000000000e+01 +1.054155000000000175e+00 -3.231250000000000000e+01 +1.054159999999999986e+00 -3.234375000000000000e+01 +1.054165000000000019e+00 -3.234375000000000000e+01 +1.054170000000000051e+00 -3.231250000000000000e+01 +1.054175000000000084e+00 -3.234375000000000000e+01 +1.054180000000000117e+00 -3.231250000000000000e+01 +1.054185000000000150e+00 -3.234375000000000000e+01 +1.054190000000000182e+00 -3.228125000000000000e+01 +1.054194999999999993e+00 -3.234375000000000000e+01 +1.054200000000000026e+00 -3.228125000000000000e+01 +1.054205000000000059e+00 -3.228125000000000000e+01 +1.054210000000000091e+00 -3.228125000000000000e+01 +1.054215000000000124e+00 -3.234375000000000000e+01 +1.054220000000000157e+00 -3.231250000000000000e+01 +1.054225000000000190e+00 -3.225000381469726562e+01 +1.054230000000000000e+00 -3.225000381469726562e+01 +1.054235000000000033e+00 -3.225000381469726562e+01 +1.054240000000000066e+00 -3.221875000000000000e+01 +1.054245000000000099e+00 -3.218750000000000000e+01 +1.054250000000000131e+00 -3.228125000000000000e+01 +1.054255000000000164e+00 -3.221875000000000000e+01 +1.054260000000000197e+00 -3.228125000000000000e+01 +1.054265000000000008e+00 -3.221875000000000000e+01 +1.054270000000000040e+00 -3.225000381469726562e+01 +1.054275000000000073e+00 -3.225000381469726562e+01 +1.054280000000000106e+00 -3.225000381469726562e+01 +1.054285000000000139e+00 -3.218750000000000000e+01 +1.054290000000000171e+00 -3.225000381469726562e+01 +1.054294999999999982e+00 -3.218750000000000000e+01 +1.054300000000000015e+00 -3.218750000000000000e+01 +1.054305000000000048e+00 -3.221875000000000000e+01 +1.054310000000000080e+00 -3.218750000000000000e+01 +1.054315000000000113e+00 -3.221875000000000000e+01 +1.054320000000000146e+00 -3.215625000000000000e+01 +1.054325000000000179e+00 -3.215625000000000000e+01 +1.054329999999999989e+00 -3.218750000000000000e+01 +1.054335000000000022e+00 -3.212500000000000000e+01 +1.054340000000000055e+00 -3.215625000000000000e+01 +1.054345000000000088e+00 -3.218750000000000000e+01 +1.054350000000000120e+00 -3.218750000000000000e+01 +1.054355000000000153e+00 -3.221875000000000000e+01 +1.054360000000000186e+00 -3.218750000000000000e+01 +1.054364999999999997e+00 -3.215625000000000000e+01 +1.054370000000000029e+00 -3.215625000000000000e+01 +1.054375000000000062e+00 -3.218750000000000000e+01 +1.054380000000000095e+00 -3.218750000000000000e+01 +1.054385000000000128e+00 -3.215625000000000000e+01 +1.054390000000000160e+00 -3.215625000000000000e+01 +1.054395000000000193e+00 -3.203125000000000000e+01 +1.054400000000000004e+00 -3.212500000000000000e+01 +1.054405000000000037e+00 -3.209375381469726562e+01 +1.054410000000000069e+00 -3.212500000000000000e+01 +1.054415000000000102e+00 -3.215625000000000000e+01 +1.054420000000000135e+00 -3.215625000000000000e+01 +1.054425000000000168e+00 -3.209375381469726562e+01 +1.054429999999999978e+00 -3.212500000000000000e+01 +1.054435000000000011e+00 -3.209375381469726562e+01 +1.054440000000000044e+00 -3.212500000000000000e+01 +1.054445000000000077e+00 -3.209375381469726562e+01 +1.054450000000000109e+00 -3.215625000000000000e+01 +1.054455000000000142e+00 -3.209375381469726562e+01 +1.054460000000000175e+00 -3.212500000000000000e+01 +1.054464999999999986e+00 -3.206250000000000000e+01 +1.054470000000000018e+00 -3.209375381469726562e+01 +1.054475000000000051e+00 -3.215625000000000000e+01 +1.054480000000000084e+00 -3.203125000000000000e+01 +1.054485000000000117e+00 -3.203125000000000000e+01 +1.054490000000000149e+00 -3.209375381469726562e+01 +1.054495000000000182e+00 -3.209375381469726562e+01 +1.054499999999999993e+00 -3.203125000000000000e+01 +1.054505000000000026e+00 -3.203125000000000000e+01 +1.054510000000000058e+00 -3.203125000000000000e+01 +1.054515000000000091e+00 -3.203125000000000000e+01 +1.054520000000000124e+00 -3.206250000000000000e+01 +1.054525000000000157e+00 -3.203125000000000000e+01 +1.054530000000000189e+00 -3.206250000000000000e+01 +1.054535000000000000e+00 -3.203125000000000000e+01 +1.054540000000000033e+00 -3.203125000000000000e+01 +1.054545000000000066e+00 -3.203125000000000000e+01 +1.054550000000000098e+00 -3.203125000000000000e+01 +1.054555000000000131e+00 -3.203125000000000000e+01 +1.054560000000000164e+00 -3.203125000000000000e+01 +1.054565000000000197e+00 -3.203125000000000000e+01 +1.054570000000000007e+00 -3.203125000000000000e+01 +1.054575000000000040e+00 -3.203125000000000000e+01 +1.054580000000000073e+00 -3.203125000000000000e+01 +1.054585000000000106e+00 -3.209375381469726562e+01 +1.054590000000000138e+00 -3.203125000000000000e+01 +1.054595000000000171e+00 -3.203125000000000000e+01 +1.054599999999999982e+00 -3.203125000000000000e+01 +1.054605000000000015e+00 -3.203125000000000000e+01 +1.054610000000000047e+00 -3.196875000000000000e+01 +1.054615000000000080e+00 -3.203125000000000000e+01 +1.054620000000000113e+00 -3.196875000000000000e+01 +1.054625000000000146e+00 -3.203125000000000000e+01 +1.054630000000000178e+00 -3.196875000000000000e+01 +1.054634999999999989e+00 -3.203125000000000000e+01 +1.054640000000000022e+00 -3.203125000000000000e+01 +1.054645000000000055e+00 -3.203125000000000000e+01 +1.054650000000000087e+00 -3.203125000000000000e+01 +1.054655000000000120e+00 -3.203125000000000000e+01 +1.054660000000000153e+00 -3.203125000000000000e+01 +1.054665000000000186e+00 -3.203125000000000000e+01 +1.054669999999999996e+00 -3.203125000000000000e+01 +1.054675000000000029e+00 -3.203125000000000000e+01 +1.054680000000000062e+00 -3.193750190734863281e+01 +1.054685000000000095e+00 -3.193750190734863281e+01 +1.054690000000000127e+00 -3.187500000000000000e+01 +1.054695000000000160e+00 -3.193750190734863281e+01 +1.054700000000000193e+00 -3.190625000000000000e+01 +1.054705000000000004e+00 -3.196875000000000000e+01 +1.054710000000000036e+00 -3.200000000000000000e+01 +1.054715000000000069e+00 -3.190625000000000000e+01 +1.054720000000000102e+00 -3.184375190734863281e+01 +1.054725000000000135e+00 -3.193750190734863281e+01 +1.054730000000000167e+00 -3.200000000000000000e+01 +1.054734999999999978e+00 -3.187500000000000000e+01 +1.054740000000000011e+00 -3.184375190734863281e+01 +1.054745000000000044e+00 -3.184375190734863281e+01 +1.054750000000000076e+00 -3.184375190734863281e+01 +1.054755000000000109e+00 -3.184375190734863281e+01 +1.054760000000000142e+00 -3.184375190734863281e+01 +1.054765000000000175e+00 -3.184375190734863281e+01 +1.054769999999999985e+00 -3.190625000000000000e+01 +1.054775000000000018e+00 -3.181250000000000000e+01 +1.054780000000000051e+00 -3.187500000000000000e+01 +1.054785000000000084e+00 -3.187500000000000000e+01 +1.054790000000000116e+00 -3.187500000000000000e+01 +1.054795000000000149e+00 -3.181250000000000000e+01 +1.054800000000000182e+00 -3.187500000000000000e+01 +1.054804999999999993e+00 -3.184375190734863281e+01 +1.054810000000000025e+00 -3.184375190734863281e+01 +1.054815000000000058e+00 -3.178125190734863281e+01 +1.054820000000000091e+00 -3.181250000000000000e+01 +1.054825000000000124e+00 -3.178125190734863281e+01 +1.054830000000000156e+00 -3.184375190734863281e+01 +1.054835000000000189e+00 -3.181250000000000000e+01 +1.054840000000000000e+00 -3.175000190734863281e+01 +1.054845000000000033e+00 -3.178125190734863281e+01 +1.054850000000000065e+00 -3.175000190734863281e+01 +1.054855000000000098e+00 -3.168750190734863281e+01 +1.054860000000000131e+00 -3.175000190734863281e+01 +1.054865000000000164e+00 -3.171875000000000000e+01 +1.054870000000000196e+00 -3.171875000000000000e+01 +1.054875000000000007e+00 -3.175000190734863281e+01 +1.054880000000000040e+00 -3.171875000000000000e+01 +1.054885000000000073e+00 -3.181250000000000000e+01 +1.054890000000000105e+00 -3.175000190734863281e+01 +1.054895000000000138e+00 -3.168750190734863281e+01 +1.054900000000000171e+00 -3.175000190734863281e+01 +1.054904999999999982e+00 -3.178125190734863281e+01 +1.054910000000000014e+00 -3.181250000000000000e+01 +1.054915000000000047e+00 -3.171875000000000000e+01 +1.054920000000000080e+00 -3.171875000000000000e+01 +1.054925000000000113e+00 -3.171875000000000000e+01 +1.054930000000000145e+00 -3.171875000000000000e+01 +1.054935000000000178e+00 -3.171875000000000000e+01 +1.054939999999999989e+00 -3.165625000000000000e+01 +1.054945000000000022e+00 -3.171875000000000000e+01 +1.054950000000000054e+00 -3.171875000000000000e+01 +1.054955000000000087e+00 -3.162499809265136719e+01 +1.054960000000000120e+00 -3.168750190734863281e+01 +1.054965000000000153e+00 -3.168750190734863281e+01 +1.054970000000000185e+00 -3.162499809265136719e+01 +1.054974999999999996e+00 -3.162499809265136719e+01 +1.054980000000000029e+00 -3.159375190734863281e+01 +1.054985000000000062e+00 -3.162499809265136719e+01 +1.054990000000000094e+00 -3.165625000000000000e+01 +1.054995000000000127e+00 -3.156250000000000000e+01 +1.055000000000000160e+00 -3.159375190734863281e+01 +1.055005000000000193e+00 -3.159375190734863281e+01 +1.055010000000000003e+00 -3.159375190734863281e+01 +1.055015000000000036e+00 -3.162499809265136719e+01 +1.055020000000000069e+00 -3.156250000000000000e+01 +1.055025000000000102e+00 -3.156250000000000000e+01 +1.055030000000000134e+00 -3.153125190734863281e+01 +1.055035000000000167e+00 -3.150000000000000000e+01 +1.055039999999999978e+00 -3.153125190734863281e+01 +1.055045000000000011e+00 -3.146875000000000000e+01 +1.055050000000000043e+00 -3.153125190734863281e+01 +1.055055000000000076e+00 -3.150000000000000000e+01 +1.055060000000000109e+00 -3.146875000000000000e+01 +1.055065000000000142e+00 -3.150000000000000000e+01 +1.055070000000000174e+00 -3.150000000000000000e+01 +1.055074999999999985e+00 -3.146875000000000000e+01 +1.055080000000000018e+00 -3.143750190734863281e+01 +1.055085000000000051e+00 -3.150000000000000000e+01 +1.055090000000000083e+00 -3.146875000000000000e+01 +1.055095000000000116e+00 -3.143750190734863281e+01 +1.055100000000000149e+00 -3.143750190734863281e+01 +1.055105000000000182e+00 -3.146875000000000000e+01 +1.055109999999999992e+00 -3.150000000000000000e+01 +1.055115000000000025e+00 -3.137500190734863281e+01 +1.055120000000000058e+00 -3.140625000000000000e+01 +1.055125000000000091e+00 -3.150000000000000000e+01 +1.055130000000000123e+00 -3.146875000000000000e+01 +1.055135000000000156e+00 -3.146875000000000000e+01 +1.055140000000000189e+00 -3.137500190734863281e+01 +1.055145000000000000e+00 -3.146875000000000000e+01 +1.055150000000000032e+00 -3.137500190734863281e+01 +1.055155000000000065e+00 -3.143750190734863281e+01 +1.055160000000000098e+00 -3.143750190734863281e+01 +1.055165000000000131e+00 -3.143750190734863281e+01 +1.055170000000000163e+00 -3.134375000000000000e+01 +1.055175000000000196e+00 -3.140625000000000000e+01 +1.055180000000000007e+00 -3.134375000000000000e+01 +1.055185000000000040e+00 -3.134375000000000000e+01 +1.055190000000000072e+00 -3.128125190734863281e+01 +1.055195000000000105e+00 -3.134375000000000000e+01 +1.055200000000000138e+00 -3.134375000000000000e+01 +1.055205000000000171e+00 -3.137500190734863281e+01 +1.055209999999999981e+00 -3.128125190734863281e+01 +1.055215000000000014e+00 -3.128125190734863281e+01 +1.055220000000000047e+00 -3.121875000000000000e+01 +1.055225000000000080e+00 -3.128125190734863281e+01 +1.055230000000000112e+00 -3.131250000000000000e+01 +1.055235000000000145e+00 -3.128125190734863281e+01 +1.055240000000000178e+00 -3.128125190734863281e+01 +1.055244999999999989e+00 -3.128125190734863281e+01 +1.055250000000000021e+00 -3.118750000000000000e+01 +1.055255000000000054e+00 -3.128125190734863281e+01 +1.055260000000000087e+00 -3.128125190734863281e+01 +1.055265000000000120e+00 -3.128125190734863281e+01 +1.055270000000000152e+00 -3.125000000000000000e+01 +1.055275000000000185e+00 -3.121875000000000000e+01 +1.055279999999999996e+00 -3.121875000000000000e+01 +1.055285000000000029e+00 -3.121875000000000000e+01 +1.055290000000000061e+00 -3.118750000000000000e+01 +1.055295000000000094e+00 -3.121875000000000000e+01 +1.055300000000000127e+00 -3.128125190734863281e+01 +1.055305000000000160e+00 -3.118750000000000000e+01 +1.055310000000000192e+00 -3.118750000000000000e+01 +1.055315000000000003e+00 -3.121875000000000000e+01 +1.055320000000000036e+00 -3.118750000000000000e+01 +1.055325000000000069e+00 -3.115625190734863281e+01 +1.055330000000000101e+00 -3.118750000000000000e+01 +1.055335000000000134e+00 -3.121875000000000000e+01 +1.055340000000000167e+00 -3.118750000000000000e+01 +1.055344999999999978e+00 -3.121875000000000000e+01 +1.055350000000000010e+00 -3.112500190734863281e+01 +1.055355000000000043e+00 -3.121875000000000000e+01 +1.055360000000000076e+00 -3.118750000000000000e+01 +1.055365000000000109e+00 -3.121875000000000000e+01 +1.055370000000000141e+00 -3.112500190734863281e+01 +1.055375000000000174e+00 -3.118750000000000000e+01 +1.055379999999999985e+00 -3.112500190734863281e+01 +1.055385000000000018e+00 -3.112500190734863281e+01 +1.055390000000000050e+00 -3.118750000000000000e+01 +1.055395000000000083e+00 -3.115625190734863281e+01 +1.055400000000000116e+00 -3.112500190734863281e+01 +1.055405000000000149e+00 -3.112500190734863281e+01 +1.055410000000000181e+00 -3.115625190734863281e+01 +1.055414999999999992e+00 -3.115625190734863281e+01 +1.055420000000000025e+00 -3.112500190734863281e+01 +1.055425000000000058e+00 -3.115625190734863281e+01 +1.055430000000000090e+00 -3.115625190734863281e+01 +1.055435000000000123e+00 -3.115625190734863281e+01 +1.055440000000000156e+00 -3.112500190734863281e+01 +1.055445000000000189e+00 -3.115625190734863281e+01 +1.055449999999999999e+00 -3.103125000000000000e+01 +1.055455000000000032e+00 -3.115625190734863281e+01 +1.055460000000000065e+00 -3.115625190734863281e+01 +1.055465000000000098e+00 -3.112500190734863281e+01 +1.055470000000000130e+00 -3.106250000000000000e+01 +1.055475000000000163e+00 -3.106250000000000000e+01 +1.055480000000000196e+00 -3.109375000000000000e+01 +1.055485000000000007e+00 -3.112500190734863281e+01 +1.055490000000000039e+00 -3.109375000000000000e+01 +1.055495000000000072e+00 -3.106250000000000000e+01 +1.055500000000000105e+00 -3.106250000000000000e+01 +1.055505000000000138e+00 -3.109375000000000000e+01 +1.055510000000000170e+00 -3.109375000000000000e+01 +1.055514999999999981e+00 -3.112500190734863281e+01 +1.055520000000000014e+00 -3.100000190734863281e+01 +1.055525000000000047e+00 -3.109375000000000000e+01 +1.055530000000000079e+00 -3.112500190734863281e+01 +1.055535000000000112e+00 -3.106250000000000000e+01 +1.055540000000000145e+00 -3.106250000000000000e+01 +1.055545000000000178e+00 -3.100000190734863281e+01 +1.055549999999999988e+00 -3.103125000000000000e+01 +1.055555000000000021e+00 -3.100000190734863281e+01 +1.055560000000000054e+00 -3.106250000000000000e+01 +1.055565000000000087e+00 -3.103125000000000000e+01 +1.055570000000000119e+00 -3.103125000000000000e+01 +1.055575000000000152e+00 -3.100000190734863281e+01 +1.055580000000000185e+00 -3.106250000000000000e+01 +1.055584999999999996e+00 -3.106250000000000000e+01 +1.055590000000000028e+00 -3.100000190734863281e+01 +1.055595000000000061e+00 -3.100000190734863281e+01 +1.055600000000000094e+00 -3.100000190734863281e+01 +1.055605000000000127e+00 -3.100000190734863281e+01 +1.055610000000000159e+00 -3.100000190734863281e+01 +1.055615000000000192e+00 -3.100000190734863281e+01 +1.055620000000000003e+00 -3.093750000000000000e+01 +1.055625000000000036e+00 -3.093750000000000000e+01 +1.055630000000000068e+00 -3.100000190734863281e+01 +1.055635000000000101e+00 -3.100000190734863281e+01 +1.055640000000000134e+00 -3.096875000000000000e+01 +1.055645000000000167e+00 -3.100000190734863281e+01 +1.055649999999999977e+00 -3.093750000000000000e+01 +1.055655000000000010e+00 -3.096875000000000000e+01 +1.055660000000000043e+00 -3.093750000000000000e+01 +1.055665000000000076e+00 -3.093750000000000000e+01 +1.055670000000000108e+00 -3.093750000000000000e+01 +1.055675000000000141e+00 -3.093750000000000000e+01 +1.055680000000000174e+00 -3.090625000000000000e+01 +1.055684999999999985e+00 -3.096875000000000000e+01 +1.055690000000000017e+00 -3.090625000000000000e+01 +1.055695000000000050e+00 -3.090625000000000000e+01 +1.055700000000000083e+00 -3.093750000000000000e+01 +1.055705000000000116e+00 -3.090625000000000000e+01 +1.055710000000000148e+00 -3.090625000000000000e+01 +1.055715000000000181e+00 -3.087500190734863281e+01 +1.055719999999999992e+00 -3.096875000000000000e+01 +1.055725000000000025e+00 -3.090625000000000000e+01 +1.055730000000000057e+00 -3.081250000000000000e+01 +1.055735000000000090e+00 -3.087500190734863281e+01 +1.055740000000000123e+00 -3.084375190734863281e+01 +1.055745000000000156e+00 -3.090625000000000000e+01 +1.055750000000000188e+00 -3.087500190734863281e+01 +1.055754999999999999e+00 -3.084375190734863281e+01 +1.055760000000000032e+00 -3.090625000000000000e+01 +1.055765000000000065e+00 -3.081250000000000000e+01 +1.055770000000000097e+00 -3.081250000000000000e+01 +1.055775000000000130e+00 -3.078125000000000000e+01 +1.055780000000000163e+00 -3.078125000000000000e+01 +1.055785000000000196e+00 -3.078125000000000000e+01 +1.055790000000000006e+00 -3.078125000000000000e+01 +1.055795000000000039e+00 -3.078125000000000000e+01 +1.055800000000000072e+00 -3.078125000000000000e+01 +1.055805000000000105e+00 -3.075000000000000000e+01 +1.055810000000000137e+00 -3.068750000000000000e+01 +1.055815000000000170e+00 -3.068750000000000000e+01 +1.055819999999999981e+00 -3.071875190734863281e+01 +1.055825000000000014e+00 -3.071875190734863281e+01 +1.055830000000000046e+00 -3.065625000000000000e+01 +1.055835000000000079e+00 -3.068750000000000000e+01 +1.055840000000000112e+00 -3.065625000000000000e+01 +1.055845000000000145e+00 -3.065625000000000000e+01 +1.055850000000000177e+00 -3.068750000000000000e+01 +1.055854999999999988e+00 -3.065625000000000000e+01 +1.055860000000000021e+00 -3.056250190734863281e+01 +1.055865000000000054e+00 -3.062500000000000000e+01 +1.055870000000000086e+00 -3.056250190734863281e+01 +1.055875000000000119e+00 -3.065625000000000000e+01 +1.055880000000000152e+00 -3.056250190734863281e+01 +1.055885000000000185e+00 -3.059375190734863281e+01 +1.055889999999999995e+00 -3.053125000000000000e+01 +1.055895000000000028e+00 -3.062500000000000000e+01 +1.055900000000000061e+00 -3.059375190734863281e+01 +1.055905000000000094e+00 -3.050000000000000000e+01 +1.055910000000000126e+00 -3.053125000000000000e+01 +1.055915000000000159e+00 -3.053125000000000000e+01 +1.055920000000000192e+00 -3.056250190734863281e+01 +1.055925000000000002e+00 -3.050000000000000000e+01 +1.055930000000000035e+00 -3.046875000000000000e+01 +1.055935000000000068e+00 -3.050000000000000000e+01 +1.055940000000000101e+00 -3.046875000000000000e+01 +1.055945000000000134e+00 -3.040625190734863281e+01 +1.055950000000000166e+00 -3.046875000000000000e+01 +1.055954999999999977e+00 -3.046875000000000000e+01 +1.055960000000000010e+00 -3.043750190734863281e+01 +1.055965000000000042e+00 -3.043750190734863281e+01 +1.055970000000000075e+00 -3.040625190734863281e+01 +1.055975000000000108e+00 -3.034375000000000000e+01 +1.055980000000000141e+00 -3.037500000000000000e+01 +1.055985000000000174e+00 -3.031250000000000000e+01 +1.055989999999999984e+00 -3.031250000000000000e+01 +1.055995000000000017e+00 -3.031250000000000000e+01 +1.056000000000000050e+00 -3.034375000000000000e+01 +1.056005000000000082e+00 -3.034375000000000000e+01 +1.056010000000000115e+00 -3.031250000000000000e+01 +1.056015000000000148e+00 -3.034375000000000000e+01 +1.056020000000000181e+00 -3.021875000000000000e+01 +1.056024999999999991e+00 -3.021875000000000000e+01 +1.056030000000000024e+00 -3.018750000000000000e+01 +1.056035000000000057e+00 -3.021875000000000000e+01 +1.056040000000000090e+00 -3.028125190734863281e+01 +1.056045000000000122e+00 -3.021875000000000000e+01 +1.056050000000000155e+00 -3.018750000000000000e+01 +1.056055000000000188e+00 -3.015625190734863281e+01 +1.056059999999999999e+00 -3.015625190734863281e+01 +1.056065000000000031e+00 -3.015625190734863281e+01 +1.056070000000000064e+00 -3.009375000000000000e+01 +1.056075000000000097e+00 -3.000000190734863281e+01 +1.056080000000000130e+00 -3.000000190734863281e+01 +1.056085000000000163e+00 -3.003125000000000000e+01 +1.056090000000000195e+00 -3.000000190734863281e+01 +1.056095000000000006e+00 -2.996875190734863281e+01 +1.056100000000000039e+00 -2.987500000000000000e+01 +1.056105000000000071e+00 -2.987500000000000000e+01 +1.056110000000000104e+00 -2.990625000000000000e+01 +1.056115000000000137e+00 -2.987500000000000000e+01 +1.056120000000000170e+00 -2.981250000000000000e+01 +1.056124999999999980e+00 -2.981250000000000000e+01 +1.056130000000000013e+00 -2.975000000000000000e+01 +1.056135000000000046e+00 -2.971875190734863281e+01 +1.056140000000000079e+00 -2.959375000000000000e+01 +1.056145000000000111e+00 -2.950000000000000000e+01 +1.056150000000000144e+00 -2.950000000000000000e+01 +1.056155000000000177e+00 -2.937500000000000000e+01 +1.056159999999999988e+00 -2.921875000000000000e+01 +1.056165000000000020e+00 -2.912500190734863281e+01 +1.056170000000000053e+00 -2.896875190734863281e+01 +1.056175000000000086e+00 -2.878125000000000000e+01 +1.056180000000000119e+00 -2.850000000000000000e+01 +1.056185000000000151e+00 -2.825000190734863281e+01 +1.056190000000000184e+00 -2.787500000000000000e+01 +1.056194999999999995e+00 -2.768750190734863281e+01 +1.056200000000000028e+00 -2.725000190734863281e+01 +1.056205000000000060e+00 -2.690625000000000000e+01 +1.056210000000000093e+00 -2.646875000000000000e+01 +1.056215000000000126e+00 -2.596875000000000000e+01 +1.056220000000000159e+00 -2.550000190734863281e+01 +1.056225000000000191e+00 -2.500000000000000000e+01 +1.056230000000000002e+00 -2.437500190734863281e+01 +1.056235000000000035e+00 -2.375000000000000000e+01 +1.056240000000000068e+00 -2.309375000000000000e+01 +1.056245000000000100e+00 -2.240625000000000000e+01 +1.056250000000000133e+00 -2.153125000000000000e+01 +1.056255000000000166e+00 -2.065625000000000000e+01 +1.056259999999999977e+00 -1.978125000000000000e+01 +1.056265000000000009e+00 -1.890625000000000000e+01 +1.056270000000000042e+00 -1.790625000000000000e+01 +1.056275000000000075e+00 -1.690625000000000000e+01 +1.056280000000000108e+00 -1.584375095367431641e+01 +1.056285000000000140e+00 -1.484375095367431641e+01 +1.056290000000000173e+00 -1.381250000000000000e+01 +1.056294999999999984e+00 -1.275000095367431641e+01 +1.056300000000000017e+00 -1.165625000000000000e+01 +1.056305000000000049e+00 -1.065625095367431641e+01 +1.056310000000000082e+00 -9.625000000000000000e+00 +1.056315000000000115e+00 -8.593750000000000000e+00 +1.056320000000000148e+00 -7.593750000000000000e+00 +1.056325000000000180e+00 -6.656250000000000000e+00 +1.056329999999999991e+00 -5.656250476837158203e+00 +1.056335000000000024e+00 -4.718750476837158203e+00 +1.056340000000000057e+00 -3.750000238418579102e+00 +1.056345000000000089e+00 -2.875000000000000000e+00 +1.056350000000000122e+00 -2.000000000000000000e+00 +1.056355000000000155e+00 -1.125000119209289551e+00 +1.056360000000000188e+00 -3.125000000000000000e-01 +1.056364999999999998e+00 6.250000000000000000e-01 +1.056370000000000031e+00 1.312500000000000000e+00 +1.056375000000000064e+00 2.125000000000000000e+00 +1.056380000000000097e+00 2.875000000000000000e+00 +1.056385000000000129e+00 3.531250238418579102e+00 +1.056390000000000162e+00 4.312500000000000000e+00 +1.056395000000000195e+00 4.968750476837158203e+00 +1.056400000000000006e+00 5.687500476837158203e+00 +1.056405000000000038e+00 6.281250000000000000e+00 +1.056410000000000071e+00 7.000000000000000000e+00 +1.056415000000000104e+00 7.500000476837158203e+00 +1.056420000000000137e+00 8.125000953674316406e+00 +1.056425000000000169e+00 8.656250000000000000e+00 +1.056429999999999980e+00 9.218750953674316406e+00 +1.056435000000000013e+00 9.750000000000000000e+00 +1.056440000000000046e+00 1.018750000000000000e+01 +1.056445000000000078e+00 1.071875000000000000e+01 +1.056450000000000111e+00 1.118750000000000000e+01 +1.056455000000000144e+00 1.159375095367431641e+01 +1.056460000000000177e+00 1.200000000000000000e+01 +1.056464999999999987e+00 1.240625000000000000e+01 +1.056470000000000020e+00 1.281250000000000000e+01 +1.056475000000000053e+00 1.312500095367431641e+01 +1.056480000000000086e+00 1.350000000000000000e+01 +1.056485000000000118e+00 1.387500000000000000e+01 +1.056490000000000151e+00 1.415625000000000000e+01 +1.056495000000000184e+00 1.450000095367431641e+01 +1.056499999999999995e+00 1.478125095367431641e+01 +1.056505000000000027e+00 1.503125000000000000e+01 +1.056510000000000060e+00 1.525000000000000000e+01 +1.056515000000000093e+00 1.553125000000000000e+01 +1.056520000000000126e+00 1.575000000000000000e+01 +1.056525000000000158e+00 1.600000000000000000e+01 +1.056530000000000191e+00 1.618750000000000000e+01 +1.056535000000000002e+00 1.637500000000000000e+01 +1.056540000000000035e+00 1.656250190734863281e+01 +1.056545000000000067e+00 1.668750190734863281e+01 +1.056550000000000100e+00 1.687500000000000000e+01 +1.056555000000000133e+00 1.696875000000000000e+01 +1.056560000000000166e+00 1.706250000000000000e+01 +1.056564999999999976e+00 1.715625000000000000e+01 +1.056570000000000009e+00 1.725000000000000000e+01 +1.056575000000000042e+00 1.737500000000000000e+01 +1.056580000000000075e+00 1.737500000000000000e+01 +1.056585000000000107e+00 1.753125000000000000e+01 +1.056590000000000140e+00 1.750000000000000000e+01 +1.056595000000000173e+00 1.753125000000000000e+01 +1.056599999999999984e+00 1.756250190734863281e+01 +1.056605000000000016e+00 1.765625000000000000e+01 +1.056610000000000049e+00 1.762500000000000000e+01 +1.056615000000000082e+00 1.765625000000000000e+01 +1.056620000000000115e+00 1.768750000000000000e+01 +1.056625000000000147e+00 1.762500000000000000e+01 +1.056630000000000180e+00 1.762500000000000000e+01 +1.056634999999999991e+00 1.756250190734863281e+01 +1.056640000000000024e+00 1.756250190734863281e+01 +1.056645000000000056e+00 1.746875000000000000e+01 +1.056650000000000089e+00 1.740625190734863281e+01 +1.056655000000000122e+00 1.734375000000000000e+01 +1.056660000000000155e+00 1.725000000000000000e+01 +1.056665000000000187e+00 1.715625000000000000e+01 +1.056669999999999998e+00 1.706250000000000000e+01 +1.056675000000000031e+00 1.700000000000000000e+01 +1.056680000000000064e+00 1.687500000000000000e+01 +1.056685000000000096e+00 1.678125000000000000e+01 +1.056690000000000129e+00 1.665625000000000000e+01 +1.056695000000000162e+00 1.650000000000000000e+01 +1.056700000000000195e+00 1.643750000000000000e+01 +1.056705000000000005e+00 1.625000190734863281e+01 +1.056710000000000038e+00 1.612500190734863281e+01 +1.056715000000000071e+00 1.600000000000000000e+01 +1.056720000000000104e+00 1.584375095367431641e+01 +1.056725000000000136e+00 1.562500000000000000e+01 +1.056730000000000169e+00 1.553125000000000000e+01 +1.056734999999999980e+00 1.531250000000000000e+01 +1.056740000000000013e+00 1.506250095367431641e+01 +1.056745000000000045e+00 1.493750000000000000e+01 +1.056750000000000078e+00 1.478125095367431641e+01 +1.056755000000000111e+00 1.453125000000000000e+01 +1.056760000000000144e+00 1.434375095367431641e+01 +1.056765000000000176e+00 1.418750000000000000e+01 +1.056769999999999987e+00 1.393750000000000000e+01 +1.056775000000000020e+00 1.378125000000000000e+01 +1.056780000000000053e+00 1.353125000000000000e+01 +1.056785000000000085e+00 1.325000000000000000e+01 +1.056790000000000118e+00 1.303125000000000000e+01 +1.056795000000000151e+00 1.281250000000000000e+01 +1.056800000000000184e+00 1.262500000000000000e+01 +1.056804999999999994e+00 1.234375000000000000e+01 +1.056810000000000027e+00 1.209375000000000000e+01 +1.056815000000000060e+00 1.184375000000000000e+01 +1.056820000000000093e+00 1.162500000000000000e+01 +1.056825000000000125e+00 1.131250095367431641e+01 +1.056830000000000158e+00 1.109375095367431641e+01 +1.056835000000000191e+00 1.081250095367431641e+01 +1.056840000000000002e+00 1.059375095367431641e+01 +1.056845000000000034e+00 1.028125000000000000e+01 +1.056850000000000067e+00 1.003125000000000000e+01 +1.056855000000000100e+00 9.718750953674316406e+00 +1.056860000000000133e+00 9.531250000000000000e+00 +1.056865000000000165e+00 9.218750953674316406e+00 +1.056869999999999976e+00 8.937500000000000000e+00 +1.056875000000000009e+00 8.625000000000000000e+00 +1.056880000000000042e+00 8.375000000000000000e+00 +1.056885000000000074e+00 8.000000000000000000e+00 +1.056890000000000107e+00 7.687500000000000000e+00 +1.056895000000000140e+00 7.437500000000000000e+00 +1.056900000000000173e+00 7.156250000000000000e+00 +1.056904999999999983e+00 6.843750476837158203e+00 +1.056910000000000016e+00 6.593750476837158203e+00 +1.056915000000000049e+00 6.250000000000000000e+00 +1.056920000000000082e+00 5.906250476837158203e+00 +1.056925000000000114e+00 5.593750000000000000e+00 +1.056930000000000147e+00 5.343750000000000000e+00 +1.056935000000000180e+00 5.000000000000000000e+00 +1.056939999999999991e+00 4.656250000000000000e+00 +1.056945000000000023e+00 4.406250000000000000e+00 +1.056950000000000056e+00 4.093750000000000000e+00 +1.056955000000000089e+00 3.812500000000000000e+00 +1.056960000000000122e+00 3.406250238418579102e+00 +1.056965000000000154e+00 3.093750000000000000e+00 +1.056970000000000187e+00 2.812500000000000000e+00 +1.056974999999999998e+00 2.500000000000000000e+00 +1.056980000000000031e+00 2.187500000000000000e+00 +1.056985000000000063e+00 1.906250000000000000e+00 +1.056990000000000096e+00 1.531250119209289551e+00 +1.056995000000000129e+00 1.187500119209289551e+00 +1.057000000000000162e+00 9.687500596046447754e-01 +1.057005000000000194e+00 5.625000596046447754e-01 +1.057010000000000005e+00 2.500000000000000000e-01 +1.057015000000000038e+00 0.000000000000000000e+00 +1.057020000000000071e+00 -4.375000000000000000e-01 +1.057025000000000103e+00 -7.812500000000000000e-01 +1.057030000000000136e+00 -9.687500596046447754e-01 +1.057035000000000169e+00 -1.312500000000000000e+00 +1.057039999999999980e+00 -1.562500000000000000e+00 +1.057045000000000012e+00 -2.000000000000000000e+00 +1.057050000000000045e+00 -2.281250000000000000e+00 +1.057055000000000078e+00 -2.593750238418579102e+00 +1.057060000000000111e+00 -2.968750000000000000e+00 +1.057065000000000143e+00 -3.281250238418579102e+00 +1.057070000000000176e+00 -3.593750000000000000e+00 +1.057074999999999987e+00 -3.812500000000000000e+00 +1.057080000000000020e+00 -4.156250000000000000e+00 +1.057085000000000052e+00 -4.531250000000000000e+00 +1.057090000000000085e+00 -4.875000000000000000e+00 +1.057095000000000118e+00 -5.125000000000000000e+00 +1.057100000000000151e+00 -5.406250476837158203e+00 +1.057105000000000183e+00 -5.781250000000000000e+00 +1.057109999999999994e+00 -6.062500000000000000e+00 +1.057115000000000027e+00 -6.375000476837158203e+00 +1.057120000000000060e+00 -6.625000000000000000e+00 +1.057125000000000092e+00 -7.031250476837158203e+00 +1.057130000000000125e+00 -7.281250476837158203e+00 +1.057135000000000158e+00 -7.593750000000000000e+00 +1.057140000000000191e+00 -7.937500476837158203e+00 +1.057145000000000001e+00 -8.156250000000000000e+00 +1.057150000000000034e+00 -8.406250000000000000e+00 +1.057155000000000067e+00 -8.687500000000000000e+00 +1.057160000000000100e+00 -9.031250000000000000e+00 +1.057165000000000132e+00 -9.343750000000000000e+00 +1.057170000000000165e+00 -9.625000000000000000e+00 +1.057174999999999976e+00 -9.937500953674316406e+00 +1.057180000000000009e+00 -1.015625095367431641e+01 +1.057185000000000041e+00 -1.050000000000000000e+01 +1.057190000000000074e+00 -1.078125000000000000e+01 +1.057195000000000107e+00 -1.100000000000000000e+01 +1.057200000000000140e+00 -1.128125000000000000e+01 +1.057205000000000172e+00 -1.153125095367431641e+01 +1.057209999999999983e+00 -1.181250095367431641e+01 +1.057215000000000016e+00 -1.209375000000000000e+01 +1.057220000000000049e+00 -1.240625000000000000e+01 +1.057225000000000081e+00 -1.256250000000000000e+01 +1.057230000000000114e+00 -1.284375000000000000e+01 +1.057235000000000147e+00 -1.312500095367431641e+01 +1.057240000000000180e+00 -1.334375095367431641e+01 +1.057244999999999990e+00 -1.365625000000000000e+01 +1.057250000000000023e+00 -1.384375095367431641e+01 +1.057255000000000056e+00 -1.409375000000000000e+01 +1.057260000000000089e+00 -1.434375095367431641e+01 +1.057265000000000121e+00 -1.459375000000000000e+01 +1.057270000000000154e+00 -1.481250000000000000e+01 +1.057275000000000187e+00 -1.503125000000000000e+01 +1.057279999999999998e+00 -1.534375000000000000e+01 +1.057285000000000030e+00 -1.546875000000000000e+01 +1.057290000000000063e+00 -1.578125000000000000e+01 +1.057295000000000096e+00 -1.603125000000000000e+01 +1.057300000000000129e+00 -1.615625000000000000e+01 +1.057305000000000161e+00 -1.646875000000000000e+01 +1.057310000000000194e+00 -1.665625000000000000e+01 +1.057315000000000005e+00 -1.684375190734863281e+01 +1.057320000000000038e+00 -1.712500190734863281e+01 +1.057325000000000070e+00 -1.734375000000000000e+01 +1.057330000000000103e+00 -1.753125000000000000e+01 +1.057335000000000136e+00 -1.771875190734863281e+01 +1.057340000000000169e+00 -1.800000190734863281e+01 +1.057344999999999979e+00 -1.812500000000000000e+01 +1.057350000000000012e+00 -1.840625000000000000e+01 +1.057355000000000045e+00 -1.859375000000000000e+01 +1.057360000000000078e+00 -1.881250000000000000e+01 +1.057365000000000110e+00 -1.896875000000000000e+01 +1.057370000000000143e+00 -1.915625190734863281e+01 +1.057375000000000176e+00 -1.934375000000000000e+01 +1.057379999999999987e+00 -1.953125000000000000e+01 +1.057385000000000019e+00 -1.971875190734863281e+01 +1.057390000000000052e+00 -1.990625000000000000e+01 +1.057395000000000085e+00 -2.009375000000000000e+01 +1.057400000000000118e+00 -2.025000000000000000e+01 +1.057405000000000150e+00 -2.053125000000000000e+01 +1.057410000000000183e+00 -2.071875000000000000e+01 +1.057414999999999994e+00 -2.084375000000000000e+01 +1.057420000000000027e+00 -2.103125190734863281e+01 +1.057425000000000059e+00 -2.121875000000000000e+01 +1.057430000000000092e+00 -2.128125000000000000e+01 +1.057435000000000125e+00 -2.153125000000000000e+01 +1.057440000000000158e+00 -2.165625000000000000e+01 +1.057445000000000190e+00 -2.187500000000000000e+01 +1.057450000000000001e+00 -2.203125190734863281e+01 +1.057455000000000034e+00 -2.218750190734863281e+01 +1.057460000000000067e+00 -2.234375190734863281e+01 +1.057465000000000099e+00 -2.250000000000000000e+01 +1.057470000000000132e+00 -2.271875000000000000e+01 +1.057475000000000165e+00 -2.284375000000000000e+01 +1.057479999999999976e+00 -2.293750000000000000e+01 +1.057485000000000008e+00 -2.315625000000000000e+01 +1.057490000000000041e+00 -2.325000000000000000e+01 +1.057495000000000074e+00 -2.350000190734863281e+01 +1.057500000000000107e+00 -2.362500190734863281e+01 +1.057505000000000139e+00 -2.371875000000000000e+01 +1.057510000000000172e+00 -2.390625190734863281e+01 +1.057514999999999983e+00 -2.406250190734863281e+01 +1.057520000000000016e+00 -2.418750000000000000e+01 +1.057525000000000048e+00 -2.437500190734863281e+01 +1.057530000000000081e+00 -2.450000190734863281e+01 +1.057535000000000114e+00 -2.459375000000000000e+01 +1.057540000000000147e+00 -2.468750000000000000e+01 +1.057545000000000179e+00 -2.490625000000000000e+01 +1.057549999999999990e+00 -2.500000000000000000e+01 +1.057555000000000023e+00 -2.518750000000000000e+01 +1.057560000000000056e+00 -2.525000000000000000e+01 +1.057565000000000088e+00 -2.534375000000000000e+01 +1.057570000000000121e+00 -2.550000190734863281e+01 +1.057575000000000154e+00 -2.565625190734863281e+01 +1.057580000000000187e+00 -2.575000000000000000e+01 +1.057584999999999997e+00 -2.590625000000000000e+01 +1.057590000000000030e+00 -2.603125000000000000e+01 +1.057595000000000063e+00 -2.609375190734863281e+01 +1.057600000000000096e+00 -2.625000190734863281e+01 +1.057605000000000128e+00 -2.634375000000000000e+01 +1.057610000000000161e+00 -2.646875000000000000e+01 +1.057615000000000194e+00 -2.656250000000000000e+01 +1.057620000000000005e+00 -2.665625190734863281e+01 +1.057625000000000037e+00 -2.684375000000000000e+01 +1.057630000000000070e+00 -2.693750190734863281e+01 +1.057635000000000103e+00 -2.703125000000000000e+01 +1.057640000000000136e+00 -2.709375190734863281e+01 +1.057645000000000168e+00 -2.721875000000000000e+01 +1.057649999999999979e+00 -2.734375000000000000e+01 +1.057655000000000012e+00 -2.743750000000000000e+01 +1.057660000000000045e+00 -2.759375000000000000e+01 +1.057665000000000077e+00 -2.762500000000000000e+01 +1.057670000000000110e+00 -2.775000000000000000e+01 +1.057675000000000143e+00 -2.787500000000000000e+01 +1.057680000000000176e+00 -2.793750000000000000e+01 +1.057684999999999986e+00 -2.803125000000000000e+01 +1.057690000000000019e+00 -2.821875000000000000e+01 +1.057695000000000052e+00 -2.821875000000000000e+01 +1.057700000000000085e+00 -2.831250000000000000e+01 +1.057705000000000117e+00 -2.837500000000000000e+01 +1.057710000000000150e+00 -2.853125190734863281e+01 +1.057715000000000183e+00 -2.859375000000000000e+01 +1.057719999999999994e+00 -2.865625000000000000e+01 +1.057725000000000026e+00 -2.878125000000000000e+01 +1.057730000000000059e+00 -2.890625000000000000e+01 +1.057735000000000092e+00 -2.896875190734863281e+01 +1.057740000000000125e+00 -2.903125000000000000e+01 +1.057745000000000157e+00 -2.912500190734863281e+01 +1.057750000000000190e+00 -2.925000190734863281e+01 +1.057755000000000001e+00 -2.931250000000000000e+01 +1.057760000000000034e+00 -2.937500000000000000e+01 +1.057765000000000066e+00 -2.943750190734863281e+01 +1.057770000000000099e+00 -2.956250190734863281e+01 +1.057775000000000132e+00 -2.965625000000000000e+01 +1.057780000000000165e+00 -2.981250000000000000e+01 +1.057785000000000197e+00 -2.978125000000000000e+01 +1.057790000000000008e+00 -2.987500000000000000e+01 +1.057795000000000041e+00 -2.996875190734863281e+01 +1.057800000000000074e+00 -2.996875190734863281e+01 +1.057805000000000106e+00 -3.012500190734863281e+01 +1.057810000000000139e+00 -3.015625190734863281e+01 +1.057815000000000172e+00 -3.025000000000000000e+01 +1.057819999999999983e+00 -3.031250000000000000e+01 +1.057825000000000015e+00 -3.031250000000000000e+01 +1.057830000000000048e+00 -3.046875000000000000e+01 +1.057835000000000081e+00 -3.053125000000000000e+01 +1.057840000000000114e+00 -3.059375190734863281e+01 +1.057845000000000146e+00 -3.065625000000000000e+01 +1.057850000000000179e+00 -3.071875190734863281e+01 +1.057854999999999990e+00 -3.078125000000000000e+01 +1.057860000000000023e+00 -3.084375190734863281e+01 +1.057865000000000055e+00 -3.093750000000000000e+01 +1.057870000000000088e+00 -3.096875000000000000e+01 +1.057875000000000121e+00 -3.100000190734863281e+01 +1.057880000000000154e+00 -3.109375000000000000e+01 +1.057885000000000186e+00 -3.115625190734863281e+01 +1.057889999999999997e+00 -3.131250000000000000e+01 +1.057895000000000030e+00 -3.131250000000000000e+01 +1.057900000000000063e+00 -3.131250000000000000e+01 +1.057905000000000095e+00 -3.143750190734863281e+01 +1.057910000000000128e+00 -3.150000000000000000e+01 +1.057915000000000161e+00 -3.156250000000000000e+01 +1.057920000000000194e+00 -3.165625000000000000e+01 +1.057925000000000004e+00 -3.168750190734863281e+01 +1.057930000000000037e+00 -3.178125190734863281e+01 +1.057935000000000070e+00 -3.181250000000000000e+01 +1.057940000000000103e+00 -3.184375190734863281e+01 +1.057945000000000135e+00 -3.187500000000000000e+01 +1.057950000000000168e+00 -3.196875000000000000e+01 +1.057954999999999979e+00 -3.203125000000000000e+01 +1.057960000000000012e+00 -3.209375381469726562e+01 +1.057965000000000044e+00 -3.209375381469726562e+01 +1.057970000000000077e+00 -3.215625000000000000e+01 +1.057975000000000110e+00 -3.225000381469726562e+01 +1.057980000000000143e+00 -3.228125000000000000e+01 +1.057985000000000175e+00 -3.237500000000000000e+01 +1.057989999999999986e+00 -3.237500000000000000e+01 +1.057995000000000019e+00 -3.250000381469726562e+01 +1.058000000000000052e+00 -3.246875000000000000e+01 +1.058005000000000084e+00 -3.250000381469726562e+01 +1.058010000000000117e+00 -3.256250000000000000e+01 +1.058015000000000150e+00 -3.256250000000000000e+01 +1.058020000000000183e+00 -3.259375000000000000e+01 +1.058024999999999993e+00 -3.265625381469726562e+01 +1.058030000000000026e+00 -3.268750000000000000e+01 +1.058035000000000059e+00 -3.278125000000000000e+01 +1.058040000000000092e+00 -3.284375000000000000e+01 +1.058045000000000124e+00 -3.284375000000000000e+01 +1.058050000000000157e+00 -3.293750000000000000e+01 +1.058055000000000190e+00 -3.293750000000000000e+01 +1.058060000000000000e+00 -3.296875381469726562e+01 +1.058065000000000033e+00 -3.300000000000000000e+01 +1.058070000000000066e+00 -3.303125000000000000e+01 +1.058075000000000099e+00 -3.315625000000000000e+01 +1.058080000000000132e+00 -3.312500381469726562e+01 +1.058085000000000164e+00 -3.318750000000000000e+01 +1.058090000000000197e+00 -3.315625000000000000e+01 +1.058095000000000008e+00 -3.321875381469726562e+01 +1.058100000000000041e+00 -3.328125000000000000e+01 +1.058105000000000073e+00 -3.328125000000000000e+01 +1.058110000000000106e+00 -3.337500381469726562e+01 +1.058115000000000139e+00 -3.337500381469726562e+01 +1.058120000000000172e+00 -3.340625000000000000e+01 +1.058124999999999982e+00 -3.346875000000000000e+01 +1.058130000000000015e+00 -3.350000000000000000e+01 +1.058135000000000048e+00 -3.353125381469726562e+01 +1.058140000000000081e+00 -3.356250000000000000e+01 +1.058145000000000113e+00 -3.362500000000000000e+01 +1.058150000000000146e+00 -3.362500000000000000e+01 +1.058155000000000179e+00 -3.365625000000000000e+01 +1.058159999999999989e+00 -3.371875000000000000e+01 +1.058165000000000022e+00 -3.378125000000000000e+01 +1.058170000000000055e+00 -3.378125000000000000e+01 +1.058175000000000088e+00 -3.381250000000000000e+01 +1.058180000000000121e+00 -3.381250000000000000e+01 +1.058185000000000153e+00 -3.384375381469726562e+01 +1.058190000000000186e+00 -3.393750000000000000e+01 +1.058194999999999997e+00 -3.393750000000000000e+01 +1.058200000000000029e+00 -3.396875000000000000e+01 +1.058205000000000062e+00 -3.400000000000000000e+01 +1.058210000000000095e+00 -3.400000000000000000e+01 +1.058215000000000128e+00 -3.400000000000000000e+01 +1.058220000000000161e+00 -3.409375381469726562e+01 +1.058225000000000193e+00 -3.406250000000000000e+01 +1.058230000000000004e+00 -3.412500000000000000e+01 +1.058235000000000037e+00 -3.412500000000000000e+01 +1.058240000000000069e+00 -3.418750000000000000e+01 +1.058245000000000102e+00 -3.409375381469726562e+01 +1.058250000000000135e+00 -3.418750000000000000e+01 +1.058255000000000168e+00 -3.434375000000000000e+01 +1.058259999999999978e+00 -3.428125000000000000e+01 +1.058265000000000011e+00 -3.434375000000000000e+01 +1.058270000000000044e+00 -3.431250000000000000e+01 +1.058275000000000077e+00 -3.437500000000000000e+01 +1.058280000000000109e+00 -3.440625381469726562e+01 +1.058285000000000142e+00 -3.437500000000000000e+01 +1.058290000000000175e+00 -3.443750000000000000e+01 +1.058294999999999986e+00 -3.446875000000000000e+01 +1.058300000000000018e+00 -3.450000000000000000e+01 +1.058305000000000051e+00 -3.450000000000000000e+01 +1.058310000000000084e+00 -3.453125000000000000e+01 +1.058315000000000117e+00 -3.453125000000000000e+01 +1.058320000000000149e+00 -3.450000000000000000e+01 +1.058325000000000182e+00 -3.462500000000000000e+01 +1.058329999999999993e+00 -3.465625000000000000e+01 +1.058335000000000026e+00 -3.459375000000000000e+01 +1.058340000000000058e+00 -3.471875000000000000e+01 +1.058345000000000091e+00 -3.465625000000000000e+01 +1.058350000000000124e+00 -3.465625000000000000e+01 +1.058355000000000157e+00 -3.475000000000000000e+01 +1.058360000000000190e+00 -3.475000000000000000e+01 +1.058365000000000000e+00 -3.478125000000000000e+01 +1.058370000000000033e+00 -3.478125000000000000e+01 +1.058375000000000066e+00 -3.478125000000000000e+01 +1.058380000000000098e+00 -3.487500000000000000e+01 +1.058385000000000131e+00 -3.487500000000000000e+01 +1.058390000000000164e+00 -3.484375000000000000e+01 +1.058395000000000197e+00 -3.490625000000000000e+01 +1.058400000000000007e+00 -3.493750000000000000e+01 +1.058405000000000040e+00 -3.493750000000000000e+01 +1.058410000000000073e+00 -3.493750000000000000e+01 +1.058415000000000106e+00 -3.500000000000000000e+01 +1.058420000000000138e+00 -3.500000000000000000e+01 +1.058425000000000171e+00 -3.500000000000000000e+01 +1.058429999999999982e+00 -3.500000000000000000e+01 +1.058435000000000015e+00 -3.503125000000000000e+01 +1.058440000000000047e+00 -3.506250000000000000e+01 +1.058445000000000080e+00 -3.503125000000000000e+01 +1.058450000000000113e+00 -3.509375000000000000e+01 +1.058455000000000146e+00 -3.509375000000000000e+01 +1.058460000000000178e+00 -3.512500381469726562e+01 +1.058464999999999989e+00 -3.512500381469726562e+01 +1.058470000000000022e+00 -3.521875000000000000e+01 +1.058475000000000055e+00 -3.515625000000000000e+01 +1.058480000000000087e+00 -3.518750000000000000e+01 +1.058485000000000120e+00 -3.521875000000000000e+01 +1.058490000000000153e+00 -3.528125381469726562e+01 +1.058495000000000186e+00 -3.525000000000000000e+01 +1.058499999999999996e+00 -3.525000000000000000e+01 +1.058505000000000029e+00 -3.531250000000000000e+01 +1.058510000000000062e+00 -3.528125381469726562e+01 +1.058515000000000095e+00 -3.531250000000000000e+01 +1.058520000000000127e+00 -3.534375000000000000e+01 +1.058525000000000160e+00 -3.528125381469726562e+01 +1.058530000000000193e+00 -3.531250000000000000e+01 +1.058535000000000004e+00 -3.531250000000000000e+01 +1.058540000000000036e+00 -3.537500000000000000e+01 +1.058545000000000069e+00 -3.537500000000000000e+01 +1.058550000000000102e+00 -3.534375000000000000e+01 +1.058555000000000135e+00 -3.543750381469726562e+01 +1.058560000000000167e+00 -3.546875000000000000e+01 +1.058564999999999978e+00 -3.537500000000000000e+01 +1.058570000000000011e+00 -3.540625000000000000e+01 +1.058575000000000044e+00 -3.546875000000000000e+01 +1.058580000000000076e+00 -3.550000000000000000e+01 +1.058585000000000109e+00 -3.543750381469726562e+01 +1.058590000000000142e+00 -3.550000000000000000e+01 +1.058595000000000175e+00 -3.556250000000000000e+01 +1.058599999999999985e+00 -3.553125381469726562e+01 +1.058605000000000018e+00 -3.550000000000000000e+01 +1.058610000000000051e+00 -3.550000000000000000e+01 +1.058615000000000084e+00 -3.553125381469726562e+01 +1.058620000000000116e+00 -3.559375000000000000e+01 +1.058625000000000149e+00 -3.553125381469726562e+01 +1.058630000000000182e+00 -3.556250000000000000e+01 +1.058634999999999993e+00 -3.556250000000000000e+01 +1.058640000000000025e+00 -3.559375000000000000e+01 +1.058645000000000058e+00 -3.565625000000000000e+01 +1.058650000000000091e+00 -3.562500000000000000e+01 +1.058655000000000124e+00 -3.559375000000000000e+01 +1.058660000000000156e+00 -3.562500000000000000e+01 +1.058665000000000189e+00 -3.568750381469726562e+01 +1.058670000000000000e+00 -3.562500000000000000e+01 +1.058675000000000033e+00 -3.568750381469726562e+01 +1.058680000000000065e+00 -3.568750381469726562e+01 +1.058685000000000098e+00 -3.578125000000000000e+01 +1.058690000000000131e+00 -3.565625000000000000e+01 +1.058695000000000164e+00 -3.568750381469726562e+01 +1.058700000000000196e+00 -3.575000000000000000e+01 +1.058705000000000007e+00 -3.575000000000000000e+01 +1.058710000000000040e+00 -3.578125000000000000e+01 +1.058715000000000073e+00 -3.571875000000000000e+01 +1.058720000000000105e+00 -3.578125000000000000e+01 +1.058725000000000138e+00 -3.575000000000000000e+01 +1.058730000000000171e+00 -3.581250000000000000e+01 +1.058734999999999982e+00 -3.584375381469726562e+01 +1.058740000000000014e+00 -3.581250000000000000e+01 +1.058745000000000047e+00 -3.581250000000000000e+01 +1.058750000000000080e+00 -3.590625000000000000e+01 +1.058755000000000113e+00 -3.590625000000000000e+01 +1.058760000000000145e+00 -3.587500000000000000e+01 +1.058765000000000178e+00 -3.593750000000000000e+01 +1.058769999999999989e+00 -3.590625000000000000e+01 +1.058775000000000022e+00 -3.593750000000000000e+01 +1.058780000000000054e+00 -3.596875000000000000e+01 +1.058785000000000087e+00 -3.590625000000000000e+01 +1.058790000000000120e+00 -3.593750000000000000e+01 +1.058795000000000153e+00 -3.593750000000000000e+01 +1.058800000000000185e+00 -3.600000381469726562e+01 +1.058804999999999996e+00 -3.600000381469726562e+01 +1.058810000000000029e+00 -3.590625000000000000e+01 +1.058815000000000062e+00 -3.600000381469726562e+01 +1.058820000000000094e+00 -3.596875000000000000e+01 +1.058825000000000127e+00 -3.603125000000000000e+01 +1.058830000000000160e+00 -3.603125000000000000e+01 +1.058835000000000193e+00 -3.606250000000000000e+01 +1.058840000000000003e+00 -3.606250000000000000e+01 +1.058845000000000036e+00 -3.596875000000000000e+01 +1.058850000000000069e+00 -3.603125000000000000e+01 +1.058855000000000102e+00 -3.606250000000000000e+01 +1.058860000000000134e+00 -3.606250000000000000e+01 +1.058865000000000167e+00 -3.609375000000000000e+01 +1.058869999999999978e+00 -3.603125000000000000e+01 +1.058875000000000011e+00 -3.612500000000000000e+01 +1.058880000000000043e+00 -3.609375000000000000e+01 +1.058885000000000076e+00 -3.609375000000000000e+01 +1.058890000000000109e+00 -3.609375000000000000e+01 +1.058895000000000142e+00 -3.606250000000000000e+01 +1.058900000000000174e+00 -3.609375000000000000e+01 +1.058904999999999985e+00 -3.612500000000000000e+01 +1.058910000000000018e+00 -3.615625381469726562e+01 +1.058915000000000051e+00 -3.615625381469726562e+01 +1.058920000000000083e+00 -3.615625381469726562e+01 +1.058925000000000116e+00 -3.621875000000000000e+01 +1.058930000000000149e+00 -3.621875000000000000e+01 +1.058935000000000182e+00 -3.621875000000000000e+01 +1.058939999999999992e+00 -3.615625381469726562e+01 +1.058945000000000025e+00 -3.615625381469726562e+01 +1.058950000000000058e+00 -3.618750000000000000e+01 +1.058955000000000091e+00 -3.621875000000000000e+01 +1.058960000000000123e+00 -3.615625381469726562e+01 +1.058965000000000156e+00 -3.615625381469726562e+01 +1.058970000000000189e+00 -3.621875000000000000e+01 +1.058975000000000000e+00 -3.628125000000000000e+01 +1.058980000000000032e+00 -3.618750000000000000e+01 +1.058985000000000065e+00 -3.615625381469726562e+01 +1.058990000000000098e+00 -3.625000000000000000e+01 +1.058995000000000131e+00 -3.618750000000000000e+01 +1.059000000000000163e+00 -3.628125000000000000e+01 +1.059005000000000196e+00 -3.625000000000000000e+01 +1.059010000000000007e+00 -3.618750000000000000e+01 +1.059015000000000040e+00 -3.625000000000000000e+01 +1.059020000000000072e+00 -3.628125000000000000e+01 +1.059025000000000105e+00 -3.625000000000000000e+01 +1.059030000000000138e+00 -3.625000000000000000e+01 +1.059035000000000171e+00 -3.631250000000000000e+01 +1.059039999999999981e+00 -3.628125000000000000e+01 +1.059045000000000014e+00 -3.628125000000000000e+01 +1.059050000000000047e+00 -3.634375000000000000e+01 +1.059055000000000080e+00 -3.631250000000000000e+01 +1.059060000000000112e+00 -3.631250000000000000e+01 +1.059065000000000145e+00 -3.628125000000000000e+01 +1.059070000000000178e+00 -3.628125000000000000e+01 +1.059074999999999989e+00 -3.625000000000000000e+01 +1.059080000000000021e+00 -3.628125000000000000e+01 +1.059085000000000054e+00 -3.634375000000000000e+01 +1.059090000000000087e+00 -3.637500000000000000e+01 +1.059095000000000120e+00 -3.631250000000000000e+01 +1.059100000000000152e+00 -3.634375000000000000e+01 +1.059105000000000185e+00 -3.625000000000000000e+01 +1.059109999999999996e+00 -3.631250000000000000e+01 +1.059115000000000029e+00 -3.634375000000000000e+01 +1.059120000000000061e+00 -3.637500000000000000e+01 +1.059125000000000094e+00 -3.634375000000000000e+01 +1.059130000000000127e+00 -3.634375000000000000e+01 +1.059135000000000160e+00 -3.640625381469726562e+01 +1.059140000000000192e+00 -3.634375000000000000e+01 +1.059145000000000003e+00 -3.631250000000000000e+01 +1.059150000000000036e+00 -3.637500000000000000e+01 +1.059155000000000069e+00 -3.634375000000000000e+01 +1.059160000000000101e+00 -3.628125000000000000e+01 +1.059165000000000134e+00 -3.628125000000000000e+01 +1.059170000000000167e+00 -3.631250000000000000e+01 +1.059174999999999978e+00 -3.631250000000000000e+01 +1.059180000000000010e+00 -3.637500000000000000e+01 +1.059185000000000043e+00 -3.634375000000000000e+01 +1.059190000000000076e+00 -3.637500000000000000e+01 +1.059195000000000109e+00 -3.640625381469726562e+01 +1.059200000000000141e+00 -3.640625381469726562e+01 +1.059205000000000174e+00 -3.637500000000000000e+01 +1.059209999999999985e+00 -3.640625381469726562e+01 +1.059215000000000018e+00 -3.643750000000000000e+01 +1.059220000000000050e+00 -3.637500000000000000e+01 +1.059225000000000083e+00 -3.643750000000000000e+01 +1.059230000000000116e+00 -3.643750000000000000e+01 +1.059235000000000149e+00 -3.640625381469726562e+01 +1.059240000000000181e+00 -3.643750000000000000e+01 +1.059244999999999992e+00 -3.643750000000000000e+01 +1.059250000000000025e+00 -3.643750000000000000e+01 +1.059255000000000058e+00 -3.643750000000000000e+01 +1.059260000000000090e+00 -3.643750000000000000e+01 +1.059265000000000123e+00 -3.640625381469726562e+01 +1.059270000000000156e+00 -3.643750000000000000e+01 +1.059275000000000189e+00 -3.650000000000000000e+01 +1.059279999999999999e+00 -3.643750000000000000e+01 +1.059285000000000032e+00 -3.640625381469726562e+01 +1.059290000000000065e+00 -3.643750000000000000e+01 +1.059295000000000098e+00 -3.643750000000000000e+01 +1.059300000000000130e+00 -3.646875000000000000e+01 +1.059305000000000163e+00 -3.646875000000000000e+01 +1.059310000000000196e+00 -3.646875000000000000e+01 +1.059315000000000007e+00 -3.646875000000000000e+01 +1.059320000000000039e+00 -3.650000000000000000e+01 +1.059325000000000072e+00 -3.650000000000000000e+01 +1.059330000000000105e+00 -3.646875000000000000e+01 +1.059335000000000138e+00 -3.650000000000000000e+01 +1.059340000000000170e+00 -3.653125000000000000e+01 +1.059344999999999981e+00 -3.650000000000000000e+01 +1.059350000000000014e+00 -3.643750000000000000e+01 +1.059355000000000047e+00 -3.659375000000000000e+01 +1.059360000000000079e+00 -3.646875000000000000e+01 +1.059365000000000112e+00 -3.646875000000000000e+01 +1.059370000000000145e+00 -3.650000000000000000e+01 +1.059375000000000178e+00 -3.653125000000000000e+01 +1.059379999999999988e+00 -3.653125000000000000e+01 +1.059385000000000021e+00 -3.653125000000000000e+01 +1.059390000000000054e+00 -3.653125000000000000e+01 +1.059395000000000087e+00 -3.656250381469726562e+01 +1.059400000000000119e+00 -3.653125000000000000e+01 +1.059405000000000152e+00 -3.656250381469726562e+01 +1.059410000000000185e+00 -3.659375000000000000e+01 +1.059414999999999996e+00 -3.659375000000000000e+01 +1.059420000000000028e+00 -3.656250381469726562e+01 +1.059425000000000061e+00 -3.659375000000000000e+01 +1.059430000000000094e+00 -3.653125000000000000e+01 +1.059435000000000127e+00 -3.659375000000000000e+01 +1.059440000000000159e+00 -3.656250381469726562e+01 +1.059445000000000192e+00 -3.653125000000000000e+01 +1.059450000000000003e+00 -3.653125000000000000e+01 +1.059455000000000036e+00 -3.653125000000000000e+01 +1.059460000000000068e+00 -3.653125000000000000e+01 +1.059465000000000101e+00 -3.653125000000000000e+01 +1.059470000000000134e+00 -3.659375000000000000e+01 +1.059475000000000167e+00 -3.659375000000000000e+01 +1.059479999999999977e+00 -3.662500000000000000e+01 +1.059485000000000010e+00 -3.671875381469726562e+01 +1.059490000000000043e+00 -3.659375000000000000e+01 +1.059495000000000076e+00 -3.665625000000000000e+01 +1.059500000000000108e+00 -3.659375000000000000e+01 +1.059505000000000141e+00 -3.665625000000000000e+01 +1.059510000000000174e+00 -3.665625000000000000e+01 +1.059514999999999985e+00 -3.668750000000000000e+01 +1.059520000000000017e+00 -3.665625000000000000e+01 +1.059525000000000050e+00 -3.662500000000000000e+01 +1.059530000000000083e+00 -3.662500000000000000e+01 +1.059535000000000116e+00 -3.665625000000000000e+01 +1.059540000000000148e+00 -3.671875381469726562e+01 +1.059545000000000181e+00 -3.665625000000000000e+01 +1.059549999999999992e+00 -3.662500000000000000e+01 +1.059555000000000025e+00 -3.665625000000000000e+01 +1.059560000000000057e+00 -3.665625000000000000e+01 +1.059565000000000090e+00 -3.668750000000000000e+01 +1.059570000000000123e+00 -3.665625000000000000e+01 +1.059575000000000156e+00 -3.665625000000000000e+01 +1.059580000000000188e+00 -3.665625000000000000e+01 +1.059584999999999999e+00 -3.671875381469726562e+01 +1.059590000000000032e+00 -3.665625000000000000e+01 +1.059595000000000065e+00 -3.665625000000000000e+01 +1.059600000000000097e+00 -3.675000000000000000e+01 +1.059605000000000130e+00 -3.668750000000000000e+01 +1.059610000000000163e+00 -3.668750000000000000e+01 +1.059615000000000196e+00 -3.671875381469726562e+01 +1.059620000000000006e+00 -3.668750000000000000e+01 +1.059625000000000039e+00 -3.671875381469726562e+01 +1.059630000000000072e+00 -3.671875381469726562e+01 +1.059635000000000105e+00 -3.668750000000000000e+01 +1.059640000000000137e+00 -3.671875381469726562e+01 +1.059645000000000170e+00 -3.671875381469726562e+01 +1.059649999999999981e+00 -3.671875381469726562e+01 +1.059655000000000014e+00 -3.675000000000000000e+01 +1.059660000000000046e+00 -3.671875381469726562e+01 +1.059665000000000079e+00 -3.678125000000000000e+01 +1.059670000000000112e+00 -3.678125000000000000e+01 +1.059675000000000145e+00 -3.671875381469726562e+01 +1.059680000000000177e+00 -3.675000000000000000e+01 +1.059684999999999988e+00 -3.671875381469726562e+01 +1.059690000000000021e+00 -3.675000000000000000e+01 +1.059695000000000054e+00 -3.678125000000000000e+01 +1.059700000000000086e+00 -3.675000000000000000e+01 +1.059705000000000119e+00 -3.678125000000000000e+01 +1.059710000000000152e+00 -3.671875381469726562e+01 +1.059715000000000185e+00 -3.671875381469726562e+01 +1.059719999999999995e+00 -3.678125000000000000e+01 +1.059725000000000028e+00 -3.671875381469726562e+01 +1.059730000000000061e+00 -3.678125000000000000e+01 +1.059735000000000094e+00 -3.671875381469726562e+01 +1.059740000000000126e+00 -3.681250000000000000e+01 +1.059745000000000159e+00 -3.665625000000000000e+01 +1.059750000000000192e+00 -3.678125000000000000e+01 +1.059755000000000003e+00 -3.675000000000000000e+01 +1.059760000000000035e+00 -3.678125000000000000e+01 +1.059765000000000068e+00 -3.678125000000000000e+01 +1.059770000000000101e+00 -3.678125000000000000e+01 +1.059775000000000134e+00 -3.678125000000000000e+01 +1.059780000000000166e+00 -3.675000000000000000e+01 +1.059784999999999977e+00 -3.675000000000000000e+01 +1.059790000000000010e+00 -3.678125000000000000e+01 +1.059795000000000043e+00 -3.678125000000000000e+01 +1.059800000000000075e+00 -3.671875381469726562e+01 +1.059805000000000108e+00 -3.681250000000000000e+01 +1.059810000000000141e+00 -3.678125000000000000e+01 +1.059815000000000174e+00 -3.678125000000000000e+01 +1.059819999999999984e+00 -3.678125000000000000e+01 +1.059825000000000017e+00 -3.681250000000000000e+01 +1.059830000000000050e+00 -3.678125000000000000e+01 +1.059835000000000083e+00 -3.678125000000000000e+01 +1.059840000000000115e+00 -3.681250000000000000e+01 +1.059845000000000148e+00 -3.681250000000000000e+01 +1.059850000000000181e+00 -3.684375000000000000e+01 +1.059854999999999992e+00 -3.681250000000000000e+01 +1.059860000000000024e+00 -3.684375000000000000e+01 +1.059865000000000057e+00 -3.678125000000000000e+01 +1.059870000000000090e+00 -3.681250000000000000e+01 +1.059875000000000123e+00 -3.681250000000000000e+01 +1.059880000000000155e+00 -3.681250000000000000e+01 +1.059885000000000188e+00 -3.681250000000000000e+01 +1.059889999999999999e+00 -3.681250000000000000e+01 +1.059895000000000032e+00 -3.681250000000000000e+01 +1.059900000000000064e+00 -3.690625000000000000e+01 +1.059905000000000097e+00 -3.678125000000000000e+01 +1.059910000000000130e+00 -3.678125000000000000e+01 +1.059915000000000163e+00 -3.690625000000000000e+01 +1.059920000000000195e+00 -3.684375000000000000e+01 +1.059925000000000006e+00 -3.684375000000000000e+01 +1.059930000000000039e+00 -3.687500381469726562e+01 +1.059935000000000072e+00 -3.687500381469726562e+01 +1.059940000000000104e+00 -3.681250000000000000e+01 +1.059945000000000137e+00 -3.687500381469726562e+01 +1.059950000000000170e+00 -3.684375000000000000e+01 +1.059954999999999981e+00 -3.681250000000000000e+01 +1.059960000000000013e+00 -3.687500381469726562e+01 +1.059965000000000046e+00 -3.687500381469726562e+01 +1.059970000000000079e+00 -3.678125000000000000e+01 +1.059975000000000112e+00 -3.687500381469726562e+01 +1.059980000000000144e+00 -3.687500381469726562e+01 +1.059985000000000177e+00 -3.684375000000000000e+01 +1.059989999999999988e+00 -3.690625000000000000e+01 +1.059995000000000021e+00 -3.681250000000000000e+01 +1.060000000000000053e+00 -3.678125000000000000e+01 +1.060005000000000086e+00 -3.687500381469726562e+01 +1.060010000000000119e+00 -3.687500381469726562e+01 +1.060015000000000152e+00 -3.687500381469726562e+01 +1.060020000000000184e+00 -3.684375000000000000e+01 +1.060024999999999995e+00 -3.684375000000000000e+01 +1.060030000000000028e+00 -3.687500381469726562e+01 +1.060035000000000061e+00 -3.690625000000000000e+01 +1.060040000000000093e+00 -3.687500381469726562e+01 +1.060045000000000126e+00 -3.690625000000000000e+01 +1.060050000000000159e+00 -3.681250000000000000e+01 +1.060055000000000192e+00 -3.687500381469726562e+01 +1.060060000000000002e+00 -3.684375000000000000e+01 +1.060065000000000035e+00 -3.684375000000000000e+01 +1.060070000000000068e+00 -3.687500381469726562e+01 +1.060075000000000101e+00 -3.687500381469726562e+01 +1.060080000000000133e+00 -3.687500381469726562e+01 +1.060085000000000166e+00 -3.690625000000000000e+01 +1.060089999999999977e+00 -3.684375000000000000e+01 +1.060095000000000010e+00 -3.684375000000000000e+01 +1.060100000000000042e+00 -3.690625000000000000e+01 +1.060105000000000075e+00 -3.690625000000000000e+01 +1.060110000000000108e+00 -3.687500381469726562e+01 +1.060115000000000141e+00 -3.684375000000000000e+01 +1.060120000000000173e+00 -3.684375000000000000e+01 +1.060124999999999984e+00 -3.681250000000000000e+01 +1.060130000000000017e+00 -3.687500381469726562e+01 +1.060135000000000050e+00 -3.687500381469726562e+01 +1.060140000000000082e+00 -3.681250000000000000e+01 +1.060145000000000115e+00 -3.684375000000000000e+01 +1.060150000000000148e+00 -3.681250000000000000e+01 +1.060155000000000181e+00 -3.687500381469726562e+01 +1.060159999999999991e+00 -3.693750000000000000e+01 +1.060165000000000024e+00 -3.690625000000000000e+01 +1.060170000000000057e+00 -3.684375000000000000e+01 +1.060175000000000090e+00 -3.687500381469726562e+01 +1.060180000000000122e+00 -3.690625000000000000e+01 +1.060185000000000155e+00 -3.687500381469726562e+01 +1.060190000000000188e+00 -3.684375000000000000e+01 +1.060194999999999999e+00 -3.690625000000000000e+01 +1.060200000000000031e+00 -3.684375000000000000e+01 +1.060205000000000064e+00 -3.684375000000000000e+01 +1.060210000000000097e+00 -3.681250000000000000e+01 +1.060215000000000130e+00 -3.684375000000000000e+01 +1.060220000000000162e+00 -3.687500381469726562e+01 +1.060225000000000195e+00 -3.684375000000000000e+01 +1.060230000000000006e+00 -3.687500381469726562e+01 +1.060235000000000039e+00 -3.684375000000000000e+01 +1.060240000000000071e+00 -3.681250000000000000e+01 +1.060245000000000104e+00 -3.684375000000000000e+01 +1.060250000000000137e+00 -3.687500381469726562e+01 +1.060255000000000170e+00 -3.687500381469726562e+01 +1.060259999999999980e+00 -3.681250000000000000e+01 +1.060265000000000013e+00 -3.681250000000000000e+01 +1.060270000000000046e+00 -3.681250000000000000e+01 +1.060275000000000079e+00 -3.687500381469726562e+01 +1.060280000000000111e+00 -3.687500381469726562e+01 +1.060285000000000144e+00 -3.684375000000000000e+01 +1.060290000000000177e+00 -3.684375000000000000e+01 +1.060294999999999987e+00 -3.687500381469726562e+01 +1.060300000000000020e+00 -3.690625000000000000e+01 +1.060305000000000053e+00 -3.684375000000000000e+01 +1.060310000000000086e+00 -3.684375000000000000e+01 +1.060315000000000119e+00 -3.681250000000000000e+01 +1.060320000000000151e+00 -3.681250000000000000e+01 +1.060325000000000184e+00 -3.684375000000000000e+01 +1.060329999999999995e+00 -3.690625000000000000e+01 +1.060335000000000027e+00 -3.687500381469726562e+01 +1.060340000000000060e+00 -3.687500381469726562e+01 +1.060345000000000093e+00 -3.681250000000000000e+01 +1.060350000000000126e+00 -3.687500381469726562e+01 +1.060355000000000159e+00 -3.687500381469726562e+01 +1.060360000000000191e+00 -3.690625000000000000e+01 +1.060365000000000002e+00 -3.681250000000000000e+01 +1.060370000000000035e+00 -3.684375000000000000e+01 +1.060375000000000068e+00 -3.684375000000000000e+01 +1.060380000000000100e+00 -3.684375000000000000e+01 +1.060385000000000133e+00 -3.687500381469726562e+01 +1.060390000000000166e+00 -3.684375000000000000e+01 +1.060394999999999976e+00 -3.687500381469726562e+01 +1.060400000000000009e+00 -3.690625000000000000e+01 +1.060405000000000042e+00 -3.684375000000000000e+01 +1.060410000000000075e+00 -3.687500381469726562e+01 +1.060415000000000108e+00 -3.687500381469726562e+01 +1.060420000000000140e+00 -3.696875000000000000e+01 +1.060425000000000173e+00 -3.690625000000000000e+01 +1.060429999999999984e+00 -3.693750000000000000e+01 +1.060435000000000016e+00 -3.690625000000000000e+01 +1.060440000000000049e+00 -3.690625000000000000e+01 +1.060445000000000082e+00 -3.696875000000000000e+01 +1.060450000000000115e+00 -3.700000000000000000e+01 +1.060455000000000148e+00 -3.690625000000000000e+01 +1.060460000000000180e+00 -3.684375000000000000e+01 +1.060464999999999991e+00 -3.693750000000000000e+01 +1.060470000000000024e+00 -3.693750000000000000e+01 +1.060475000000000056e+00 -3.690625000000000000e+01 +1.060480000000000089e+00 -3.687500381469726562e+01 +1.060485000000000122e+00 -3.690625000000000000e+01 +1.060490000000000155e+00 -3.700000000000000000e+01 +1.060495000000000188e+00 -3.693750000000000000e+01 +1.060499999999999998e+00 -3.690625000000000000e+01 +1.060505000000000031e+00 -3.687500381469726562e+01 +1.060510000000000064e+00 -3.690625000000000000e+01 +1.060515000000000096e+00 -3.693750000000000000e+01 +1.060520000000000129e+00 -3.690625000000000000e+01 +1.060525000000000162e+00 -3.690625000000000000e+01 +1.060530000000000195e+00 -3.687500381469726562e+01 +1.060535000000000005e+00 -3.690625000000000000e+01 +1.060540000000000038e+00 -3.690625000000000000e+01 +1.060545000000000071e+00 -3.687500381469726562e+01 +1.060550000000000104e+00 -3.700000000000000000e+01 +1.060555000000000136e+00 -3.690625000000000000e+01 +1.060560000000000169e+00 -3.690625000000000000e+01 +1.060564999999999980e+00 -3.693750000000000000e+01 +1.060570000000000013e+00 -3.690625000000000000e+01 +1.060575000000000045e+00 -3.693750000000000000e+01 +1.060580000000000078e+00 -3.690625000000000000e+01 +1.060585000000000111e+00 -3.696875000000000000e+01 +1.060590000000000144e+00 -3.687500381469726562e+01 +1.060595000000000176e+00 -3.690625000000000000e+01 +1.060599999999999987e+00 -3.690625000000000000e+01 +1.060605000000000020e+00 -3.693750000000000000e+01 +1.060610000000000053e+00 -3.690625000000000000e+01 +1.060615000000000085e+00 -3.690625000000000000e+01 +1.060620000000000118e+00 -3.696875000000000000e+01 +1.060625000000000151e+00 -3.693750000000000000e+01 +1.060630000000000184e+00 -3.693750000000000000e+01 +1.060634999999999994e+00 -3.693750000000000000e+01 +1.060640000000000027e+00 -3.690625000000000000e+01 +1.060645000000000060e+00 -3.690625000000000000e+01 +1.060650000000000093e+00 -3.696875000000000000e+01 +1.060655000000000125e+00 -3.687500381469726562e+01 +1.060660000000000158e+00 -3.700000000000000000e+01 +1.060665000000000191e+00 -3.696875000000000000e+01 +1.060670000000000002e+00 -3.696875000000000000e+01 +1.060675000000000034e+00 -3.693750000000000000e+01 +1.060680000000000067e+00 -3.696875000000000000e+01 +1.060685000000000100e+00 -3.690625000000000000e+01 +1.060690000000000133e+00 -3.693750000000000000e+01 +1.060695000000000165e+00 -3.687500381469726562e+01 +1.060699999999999976e+00 -3.687500381469726562e+01 +1.060705000000000009e+00 -3.687500381469726562e+01 +1.060710000000000042e+00 -3.687500381469726562e+01 +1.060715000000000074e+00 -3.687500381469726562e+01 +1.060720000000000107e+00 -3.690625000000000000e+01 +1.060725000000000140e+00 -3.684375000000000000e+01 +1.060730000000000173e+00 -3.690625000000000000e+01 +1.060734999999999983e+00 -3.687500381469726562e+01 +1.060740000000000016e+00 -3.687500381469726562e+01 +1.060745000000000049e+00 -3.693750000000000000e+01 +1.060750000000000082e+00 -3.690625000000000000e+01 +1.060755000000000114e+00 -3.681250000000000000e+01 +1.060760000000000147e+00 -3.690625000000000000e+01 +1.060765000000000180e+00 -3.690625000000000000e+01 +1.060769999999999991e+00 -3.684375000000000000e+01 +1.060775000000000023e+00 -3.690625000000000000e+01 +1.060780000000000056e+00 -3.693750000000000000e+01 +1.060785000000000089e+00 -3.690625000000000000e+01 +1.060790000000000122e+00 -3.690625000000000000e+01 +1.060795000000000154e+00 -3.696875000000000000e+01 +1.060800000000000187e+00 -3.693750000000000000e+01 +1.060804999999999998e+00 -3.693750000000000000e+01 +1.060810000000000031e+00 -3.690625000000000000e+01 +1.060815000000000063e+00 -3.696875000000000000e+01 +1.060820000000000096e+00 -3.690625000000000000e+01 +1.060825000000000129e+00 -3.690625000000000000e+01 +1.060830000000000162e+00 -3.696875000000000000e+01 +1.060835000000000194e+00 -3.693750000000000000e+01 +1.060840000000000005e+00 -3.690625000000000000e+01 +1.060845000000000038e+00 -3.690625000000000000e+01 +1.060850000000000071e+00 -3.693750000000000000e+01 +1.060855000000000103e+00 -3.693750000000000000e+01 +1.060860000000000136e+00 -3.696875000000000000e+01 +1.060865000000000169e+00 -3.696875000000000000e+01 +1.060869999999999980e+00 -3.696875000000000000e+01 +1.060875000000000012e+00 -3.696875000000000000e+01 +1.060880000000000045e+00 -3.700000000000000000e+01 +1.060885000000000078e+00 -3.690625000000000000e+01 +1.060890000000000111e+00 -3.696875000000000000e+01 +1.060895000000000143e+00 -3.690625000000000000e+01 +1.060900000000000176e+00 -3.693750000000000000e+01 +1.060904999999999987e+00 -3.693750000000000000e+01 +1.060910000000000020e+00 -3.693750000000000000e+01 +1.060915000000000052e+00 -3.693750000000000000e+01 +1.060920000000000085e+00 -3.696875000000000000e+01 +1.060925000000000118e+00 -3.693750000000000000e+01 +1.060930000000000151e+00 -3.696875000000000000e+01 +1.060935000000000183e+00 -3.690625000000000000e+01 +1.060939999999999994e+00 -3.696875000000000000e+01 +1.060945000000000027e+00 -3.696875000000000000e+01 +1.060950000000000060e+00 -3.693750000000000000e+01 +1.060955000000000092e+00 -3.696875000000000000e+01 +1.060960000000000125e+00 -3.696875000000000000e+01 +1.060965000000000158e+00 -3.700000000000000000e+01 +1.060970000000000191e+00 -3.700000000000000000e+01 +1.060975000000000001e+00 -3.693750000000000000e+01 +1.060980000000000034e+00 -3.696875000000000000e+01 +1.060985000000000067e+00 -3.693750000000000000e+01 +1.060990000000000100e+00 -3.700000000000000000e+01 +1.060995000000000132e+00 -3.700000000000000000e+01 +1.061000000000000165e+00 -3.696875000000000000e+01 +1.061004999999999976e+00 -3.696875000000000000e+01 +1.061010000000000009e+00 -3.700000000000000000e+01 +1.061015000000000041e+00 -3.703125381469726562e+01 +1.061020000000000074e+00 -3.693750000000000000e+01 +1.061025000000000107e+00 -3.696875000000000000e+01 +1.061030000000000140e+00 -3.703125381469726562e+01 +1.061035000000000172e+00 -3.700000000000000000e+01 +1.061039999999999983e+00 -3.696875000000000000e+01 +1.061045000000000016e+00 -3.696875000000000000e+01 +1.061050000000000049e+00 -3.696875000000000000e+01 +1.061055000000000081e+00 -3.696875000000000000e+01 +1.061060000000000114e+00 -3.696875000000000000e+01 +1.061065000000000147e+00 -3.700000000000000000e+01 +1.061070000000000180e+00 -3.700000000000000000e+01 +1.061074999999999990e+00 -3.693750000000000000e+01 +1.061080000000000023e+00 -3.696875000000000000e+01 +1.061085000000000056e+00 -3.693750000000000000e+01 +1.061090000000000089e+00 -3.690625000000000000e+01 +1.061095000000000121e+00 -3.696875000000000000e+01 +1.061100000000000154e+00 -3.700000000000000000e+01 +1.061105000000000187e+00 -3.696875000000000000e+01 +1.061109999999999998e+00 -3.693750000000000000e+01 +1.061115000000000030e+00 -3.693750000000000000e+01 +1.061120000000000063e+00 -3.693750000000000000e+01 +1.061125000000000096e+00 -3.690625000000000000e+01 +1.061130000000000129e+00 -3.696875000000000000e+01 +1.061135000000000161e+00 -3.696875000000000000e+01 +1.061140000000000194e+00 -3.690625000000000000e+01 +1.061145000000000005e+00 -3.693750000000000000e+01 +1.061150000000000038e+00 -3.687500381469726562e+01 +1.061155000000000070e+00 -3.696875000000000000e+01 +1.061160000000000103e+00 -3.693750000000000000e+01 +1.061165000000000136e+00 -3.700000000000000000e+01 +1.061170000000000169e+00 -3.696875000000000000e+01 +1.061174999999999979e+00 -3.696875000000000000e+01 +1.061180000000000012e+00 -3.693750000000000000e+01 +1.061185000000000045e+00 -3.700000000000000000e+01 +1.061190000000000078e+00 -3.700000000000000000e+01 +1.061195000000000110e+00 -3.700000000000000000e+01 +1.061200000000000143e+00 -3.700000000000000000e+01 +1.061205000000000176e+00 -3.703125381469726562e+01 +1.061209999999999987e+00 -3.703125381469726562e+01 +1.061215000000000019e+00 -3.696875000000000000e+01 +1.061220000000000052e+00 -3.703125381469726562e+01 +1.061225000000000085e+00 -3.703125381469726562e+01 +1.061230000000000118e+00 -3.703125381469726562e+01 +1.061235000000000150e+00 -3.703125381469726562e+01 +1.061240000000000183e+00 -3.703125381469726562e+01 +1.061244999999999994e+00 -3.703125381469726562e+01 +1.061250000000000027e+00 -3.700000000000000000e+01 +1.061255000000000059e+00 -3.703125381469726562e+01 +1.061260000000000092e+00 -3.700000000000000000e+01 +1.061265000000000125e+00 -3.703125381469726562e+01 +1.061270000000000158e+00 -3.700000000000000000e+01 +1.061275000000000190e+00 -3.703125381469726562e+01 +1.061280000000000001e+00 -3.706250000000000000e+01 +1.061285000000000034e+00 -3.700000000000000000e+01 +1.061290000000000067e+00 -3.703125381469726562e+01 +1.061295000000000099e+00 -3.700000000000000000e+01 +1.061300000000000132e+00 -3.700000000000000000e+01 +1.061305000000000165e+00 -3.703125381469726562e+01 +1.061310000000000198e+00 -3.700000000000000000e+01 +1.061315000000000008e+00 -3.700000000000000000e+01 +1.061320000000000041e+00 -3.706250000000000000e+01 +1.061325000000000074e+00 -3.700000000000000000e+01 +1.061330000000000107e+00 -3.700000000000000000e+01 +1.061335000000000139e+00 -3.700000000000000000e+01 +1.061340000000000172e+00 -3.703125381469726562e+01 +1.061344999999999983e+00 -3.700000000000000000e+01 +1.061350000000000016e+00 -3.700000000000000000e+01 +1.061355000000000048e+00 -3.706250000000000000e+01 +1.061360000000000081e+00 -3.700000000000000000e+01 +1.061365000000000114e+00 -3.700000000000000000e+01 +1.061370000000000147e+00 -3.700000000000000000e+01 +1.061375000000000179e+00 -3.700000000000000000e+01 +1.061379999999999990e+00 -3.703125381469726562e+01 +1.061385000000000023e+00 -3.706250000000000000e+01 +1.061390000000000056e+00 -3.703125381469726562e+01 +1.061395000000000088e+00 -3.700000000000000000e+01 +1.061400000000000121e+00 -3.703125381469726562e+01 +1.061405000000000154e+00 -3.703125381469726562e+01 +1.061410000000000187e+00 -3.706250000000000000e+01 +1.061414999999999997e+00 -3.700000000000000000e+01 +1.061420000000000030e+00 -3.703125381469726562e+01 +1.061425000000000063e+00 -3.706250000000000000e+01 +1.061430000000000096e+00 -3.700000000000000000e+01 +1.061435000000000128e+00 -3.703125381469726562e+01 +1.061440000000000161e+00 -3.706250000000000000e+01 +1.061445000000000194e+00 -3.703125381469726562e+01 +1.061450000000000005e+00 -3.706250000000000000e+01 +1.061455000000000037e+00 -3.703125381469726562e+01 +1.061460000000000070e+00 -3.703125381469726562e+01 +1.061465000000000103e+00 -3.703125381469726562e+01 +1.061470000000000136e+00 -3.700000000000000000e+01 +1.061475000000000168e+00 -3.700000000000000000e+01 +1.061479999999999979e+00 -3.700000000000000000e+01 +1.061485000000000012e+00 -3.700000000000000000e+01 +1.061490000000000045e+00 -3.700000000000000000e+01 +1.061495000000000077e+00 -3.693750000000000000e+01 +1.061500000000000110e+00 -3.700000000000000000e+01 +1.061505000000000143e+00 -3.703125381469726562e+01 +1.061510000000000176e+00 -3.703125381469726562e+01 +1.061514999999999986e+00 -3.696875000000000000e+01 +1.061520000000000019e+00 -3.700000000000000000e+01 +1.061525000000000052e+00 -3.703125381469726562e+01 +1.061530000000000085e+00 -3.703125381469726562e+01 +1.061535000000000117e+00 -3.700000000000000000e+01 +1.061540000000000150e+00 -3.700000000000000000e+01 +1.061545000000000183e+00 -3.700000000000000000e+01 +1.061549999999999994e+00 -3.696875000000000000e+01 +1.061555000000000026e+00 -3.700000000000000000e+01 +1.061560000000000059e+00 -3.706250000000000000e+01 +1.061565000000000092e+00 -3.703125381469726562e+01 +1.061570000000000125e+00 -3.700000000000000000e+01 +1.061575000000000157e+00 -3.700000000000000000e+01 +1.061580000000000190e+00 -3.696875000000000000e+01 +1.061585000000000001e+00 -3.703125381469726562e+01 +1.061590000000000034e+00 -3.700000000000000000e+01 +1.061595000000000066e+00 -3.703125381469726562e+01 +1.061600000000000099e+00 -3.703125381469726562e+01 +1.061605000000000132e+00 -3.703125381469726562e+01 +1.061610000000000165e+00 -3.703125381469726562e+01 +1.061615000000000197e+00 -3.703125381469726562e+01 +1.061620000000000008e+00 -3.700000000000000000e+01 +1.061625000000000041e+00 -3.703125381469726562e+01 +1.061630000000000074e+00 -3.703125381469726562e+01 +1.061635000000000106e+00 -3.706250000000000000e+01 +1.061640000000000139e+00 -3.706250000000000000e+01 +1.061645000000000172e+00 -3.703125381469726562e+01 +1.061649999999999983e+00 -3.700000000000000000e+01 +1.061655000000000015e+00 -3.706250000000000000e+01 +1.061660000000000048e+00 -3.706250000000000000e+01 +1.061665000000000081e+00 -3.709375000000000000e+01 +1.061670000000000114e+00 -3.709375000000000000e+01 +1.061675000000000146e+00 -3.706250000000000000e+01 +1.061680000000000179e+00 -3.712500381469726562e+01 +1.061684999999999990e+00 -3.706250000000000000e+01 +1.061690000000000023e+00 -3.706250000000000000e+01 +1.061695000000000055e+00 -3.709375000000000000e+01 +1.061700000000000088e+00 -3.715625000000000000e+01 +1.061705000000000121e+00 -3.709375000000000000e+01 +1.061710000000000154e+00 -3.703125381469726562e+01 +1.061715000000000186e+00 -3.706250000000000000e+01 +1.061719999999999997e+00 -3.706250000000000000e+01 +1.061725000000000030e+00 -3.706250000000000000e+01 +1.061730000000000063e+00 -3.709375000000000000e+01 +1.061735000000000095e+00 -3.706250000000000000e+01 +1.061740000000000128e+00 -3.709375000000000000e+01 +1.061745000000000161e+00 -3.706250000000000000e+01 +1.061750000000000194e+00 -3.703125381469726562e+01 +1.061755000000000004e+00 -3.709375000000000000e+01 +1.061760000000000037e+00 -3.709375000000000000e+01 +1.061765000000000070e+00 -3.706250000000000000e+01 +1.061770000000000103e+00 -3.715625000000000000e+01 +1.061775000000000135e+00 -3.703125381469726562e+01 +1.061780000000000168e+00 -3.712500381469726562e+01 +1.061784999999999979e+00 -3.706250000000000000e+01 +1.061790000000000012e+00 -3.706250000000000000e+01 +1.061795000000000044e+00 -3.703125381469726562e+01 +1.061800000000000077e+00 -3.706250000000000000e+01 +1.061805000000000110e+00 -3.709375000000000000e+01 +1.061810000000000143e+00 -3.703125381469726562e+01 +1.061815000000000175e+00 -3.703125381469726562e+01 +1.061819999999999986e+00 -3.706250000000000000e+01 +1.061825000000000019e+00 -3.706250000000000000e+01 +1.061830000000000052e+00 -3.709375000000000000e+01 +1.061835000000000084e+00 -3.703125381469726562e+01 +1.061840000000000117e+00 -3.706250000000000000e+01 +1.061845000000000150e+00 -3.703125381469726562e+01 +1.061850000000000183e+00 -3.706250000000000000e+01 +1.061854999999999993e+00 -3.709375000000000000e+01 +1.061860000000000026e+00 -3.706250000000000000e+01 +1.061865000000000059e+00 -3.712500381469726562e+01 +1.061870000000000092e+00 -3.709375000000000000e+01 +1.061875000000000124e+00 -3.712500381469726562e+01 +1.061880000000000157e+00 -3.709375000000000000e+01 +1.061885000000000190e+00 -3.712500381469726562e+01 +1.061890000000000001e+00 -3.709375000000000000e+01 +1.061895000000000033e+00 -3.709375000000000000e+01 +1.061900000000000066e+00 -3.712500381469726562e+01 +1.061905000000000099e+00 -3.706250000000000000e+01 +1.061910000000000132e+00 -3.706250000000000000e+01 +1.061915000000000164e+00 -3.712500381469726562e+01 +1.061920000000000197e+00 -3.712500381469726562e+01 +1.061925000000000008e+00 -3.709375000000000000e+01 +1.061930000000000041e+00 -3.703125381469726562e+01 +1.061935000000000073e+00 -3.709375000000000000e+01 +1.061940000000000106e+00 -3.703125381469726562e+01 +1.061945000000000139e+00 -3.703125381469726562e+01 +1.061950000000000172e+00 -3.706250000000000000e+01 +1.061954999999999982e+00 -3.703125381469726562e+01 +1.061960000000000015e+00 -3.709375000000000000e+01 +1.061965000000000048e+00 -3.706250000000000000e+01 +1.061970000000000081e+00 -3.706250000000000000e+01 +1.061975000000000113e+00 -3.703125381469726562e+01 +1.061980000000000146e+00 -3.706250000000000000e+01 +1.061985000000000179e+00 -3.706250000000000000e+01 +1.061989999999999990e+00 -3.700000000000000000e+01 +1.061995000000000022e+00 -3.712500381469726562e+01 +1.062000000000000055e+00 -3.706250000000000000e+01 +1.062005000000000088e+00 -3.706250000000000000e+01 +1.062010000000000121e+00 -3.706250000000000000e+01 +1.062015000000000153e+00 -3.709375000000000000e+01 +1.062020000000000186e+00 -3.709375000000000000e+01 +1.062024999999999997e+00 -3.706250000000000000e+01 +1.062030000000000030e+00 -3.700000000000000000e+01 +1.062035000000000062e+00 -3.706250000000000000e+01 +1.062040000000000095e+00 -3.709375000000000000e+01 +1.062045000000000128e+00 -3.712500381469726562e+01 +1.062050000000000161e+00 -3.709375000000000000e+01 +1.062055000000000193e+00 -3.709375000000000000e+01 +1.062060000000000004e+00 -3.703125381469726562e+01 +1.062065000000000037e+00 -3.709375000000000000e+01 +1.062070000000000070e+00 -3.712500381469726562e+01 +1.062075000000000102e+00 -3.709375000000000000e+01 +1.062080000000000135e+00 -3.709375000000000000e+01 +1.062085000000000168e+00 -3.712500381469726562e+01 +1.062089999999999979e+00 -3.712500381469726562e+01 +1.062095000000000011e+00 -3.712500381469726562e+01 +1.062100000000000044e+00 -3.712500381469726562e+01 +1.062105000000000077e+00 -3.712500381469726562e+01 +1.062110000000000110e+00 -3.712500381469726562e+01 +1.062115000000000142e+00 -3.712500381469726562e+01 +1.062120000000000175e+00 -3.712500381469726562e+01 +1.062124999999999986e+00 -3.715625000000000000e+01 +1.062130000000000019e+00 -3.712500381469726562e+01 +1.062135000000000051e+00 -3.715625000000000000e+01 +1.062140000000000084e+00 -3.709375000000000000e+01 +1.062145000000000117e+00 -3.709375000000000000e+01 +1.062150000000000150e+00 -3.712500381469726562e+01 +1.062155000000000182e+00 -3.712500381469726562e+01 +1.062159999999999993e+00 -3.715625000000000000e+01 +1.062165000000000026e+00 -3.709375000000000000e+01 +1.062170000000000059e+00 -3.712500381469726562e+01 +1.062175000000000091e+00 -3.715625000000000000e+01 +1.062180000000000124e+00 -3.712500381469726562e+01 +1.062185000000000157e+00 -3.712500381469726562e+01 +1.062190000000000190e+00 -3.706250000000000000e+01 +1.062195000000000000e+00 -3.715625000000000000e+01 +1.062200000000000033e+00 -3.715625000000000000e+01 +1.062205000000000066e+00 -3.706250000000000000e+01 +1.062210000000000099e+00 -3.715625000000000000e+01 +1.062215000000000131e+00 -3.715625000000000000e+01 +1.062220000000000164e+00 -3.709375000000000000e+01 +1.062225000000000197e+00 -3.715625000000000000e+01 +1.062230000000000008e+00 -3.718750000000000000e+01 +1.062235000000000040e+00 -3.709375000000000000e+01 +1.062240000000000073e+00 -3.715625000000000000e+01 +1.062245000000000106e+00 -3.706250000000000000e+01 +1.062250000000000139e+00 -3.709375000000000000e+01 +1.062255000000000171e+00 -3.712500381469726562e+01 +1.062259999999999982e+00 -3.709375000000000000e+01 +1.062265000000000015e+00 -3.706250000000000000e+01 +1.062270000000000048e+00 -3.715625000000000000e+01 +1.062275000000000080e+00 -3.709375000000000000e+01 +1.062280000000000113e+00 -3.715625000000000000e+01 +1.062285000000000146e+00 -3.709375000000000000e+01 +1.062290000000000179e+00 -3.712500381469726562e+01 +1.062294999999999989e+00 -3.709375000000000000e+01 +1.062300000000000022e+00 -3.706250000000000000e+01 +1.062305000000000055e+00 -3.709375000000000000e+01 +1.062310000000000088e+00 -3.709375000000000000e+01 +1.062315000000000120e+00 -3.712500381469726562e+01 +1.062320000000000153e+00 -3.709375000000000000e+01 +1.062325000000000186e+00 -3.715625000000000000e+01 +1.062329999999999997e+00 -3.712500381469726562e+01 +1.062335000000000029e+00 -3.715625000000000000e+01 +1.062340000000000062e+00 -3.706250000000000000e+01 +1.062345000000000095e+00 -3.712500381469726562e+01 +1.062350000000000128e+00 -3.706250000000000000e+01 +1.062355000000000160e+00 -3.715625000000000000e+01 +1.062360000000000193e+00 -3.715625000000000000e+01 +1.062365000000000004e+00 -3.715625000000000000e+01 +1.062370000000000037e+00 -3.715625000000000000e+01 +1.062375000000000069e+00 -3.715625000000000000e+01 +1.062380000000000102e+00 -3.715625000000000000e+01 +1.062385000000000135e+00 -3.718750000000000000e+01 +1.062390000000000168e+00 -3.715625000000000000e+01 +1.062394999999999978e+00 -3.709375000000000000e+01 +1.062400000000000011e+00 -3.715625000000000000e+01 +1.062405000000000044e+00 -3.718750000000000000e+01 +1.062410000000000077e+00 -3.712500381469726562e+01 +1.062415000000000109e+00 -3.718750000000000000e+01 +1.062420000000000142e+00 -3.712500381469726562e+01 +1.062425000000000175e+00 -3.715625000000000000e+01 +1.062429999999999986e+00 -3.718750000000000000e+01 +1.062435000000000018e+00 -3.715625000000000000e+01 +1.062440000000000051e+00 -3.715625000000000000e+01 +1.062445000000000084e+00 -3.712500381469726562e+01 +1.062450000000000117e+00 -3.715625000000000000e+01 +1.062455000000000149e+00 -3.715625000000000000e+01 +1.062460000000000182e+00 -3.721875000000000000e+01 +1.062464999999999993e+00 -3.721875000000000000e+01 +1.062470000000000026e+00 -3.718750000000000000e+01 +1.062475000000000058e+00 -3.715625000000000000e+01 +1.062480000000000091e+00 -3.718750000000000000e+01 +1.062485000000000124e+00 -3.718750000000000000e+01 +1.062490000000000157e+00 -3.721875000000000000e+01 +1.062495000000000189e+00 -3.715625000000000000e+01 +1.062500000000000000e+00 -3.712500381469726562e+01 +1.062505000000000033e+00 -3.715625000000000000e+01 +1.062510000000000066e+00 -3.712500381469726562e+01 +1.062515000000000098e+00 -3.718750000000000000e+01 +1.062520000000000131e+00 -3.721875000000000000e+01 +1.062525000000000164e+00 -3.712500381469726562e+01 +1.062530000000000197e+00 -3.715625000000000000e+01 +1.062535000000000007e+00 -3.712500381469726562e+01 +1.062540000000000040e+00 -3.712500381469726562e+01 +1.062545000000000073e+00 -3.715625000000000000e+01 +1.062550000000000106e+00 -3.709375000000000000e+01 +1.062555000000000138e+00 -3.718750000000000000e+01 +1.062560000000000171e+00 -3.715625000000000000e+01 +1.062564999999999982e+00 -3.715625000000000000e+01 +1.062570000000000014e+00 -3.712500381469726562e+01 +1.062575000000000047e+00 -3.709375000000000000e+01 +1.062580000000000080e+00 -3.712500381469726562e+01 +1.062585000000000113e+00 -3.715625000000000000e+01 +1.062590000000000146e+00 -3.718750000000000000e+01 +1.062595000000000178e+00 -3.715625000000000000e+01 +1.062599999999999989e+00 -3.721875000000000000e+01 +1.062605000000000022e+00 -3.718750000000000000e+01 +1.062610000000000054e+00 -3.718750000000000000e+01 +1.062615000000000087e+00 -3.715625000000000000e+01 +1.062620000000000120e+00 -3.712500381469726562e+01 +1.062625000000000153e+00 -3.718750000000000000e+01 +1.062630000000000186e+00 -3.712500381469726562e+01 +1.062634999999999996e+00 -3.718750000000000000e+01 +1.062640000000000029e+00 -3.715625000000000000e+01 +1.062645000000000062e+00 -3.715625000000000000e+01 +1.062650000000000095e+00 -3.709375000000000000e+01 +1.062655000000000127e+00 -3.718750000000000000e+01 +1.062660000000000160e+00 -3.712500381469726562e+01 +1.062665000000000193e+00 -3.712500381469726562e+01 +1.062670000000000003e+00 -3.715625000000000000e+01 +1.062675000000000036e+00 -3.715625000000000000e+01 +1.062680000000000069e+00 -3.718750000000000000e+01 +1.062685000000000102e+00 -3.715625000000000000e+01 +1.062690000000000135e+00 -3.715625000000000000e+01 +1.062695000000000167e+00 -3.718750000000000000e+01 +1.062699999999999978e+00 -3.715625000000000000e+01 +1.062705000000000011e+00 -3.715625000000000000e+01 +1.062710000000000043e+00 -3.718750000000000000e+01 +1.062715000000000076e+00 -3.721875000000000000e+01 +1.062720000000000109e+00 -3.718750000000000000e+01 +1.062725000000000142e+00 -3.721875000000000000e+01 +1.062730000000000175e+00 -3.712500381469726562e+01 +1.062734999999999985e+00 -3.715625000000000000e+01 +1.062740000000000018e+00 -3.718750000000000000e+01 +1.062745000000000051e+00 -3.715625000000000000e+01 +1.062750000000000083e+00 -3.721875000000000000e+01 +1.062755000000000116e+00 -3.721875000000000000e+01 +1.062760000000000149e+00 -3.712500381469726562e+01 +1.062765000000000182e+00 -3.712500381469726562e+01 +1.062769999999999992e+00 -3.718750000000000000e+01 +1.062775000000000025e+00 -3.715625000000000000e+01 +1.062780000000000058e+00 -3.715625000000000000e+01 +1.062785000000000091e+00 -3.718750000000000000e+01 +1.062790000000000123e+00 -3.718750000000000000e+01 +1.062795000000000156e+00 -3.718750000000000000e+01 +1.062800000000000189e+00 -3.728125381469726562e+01 +1.062805000000000000e+00 -3.715625000000000000e+01 +1.062810000000000032e+00 -3.725000000000000000e+01 +1.062815000000000065e+00 -3.712500381469726562e+01 +1.062820000000000098e+00 -3.715625000000000000e+01 +1.062825000000000131e+00 -3.721875000000000000e+01 +1.062830000000000163e+00 -3.718750000000000000e+01 +1.062835000000000196e+00 -3.721875000000000000e+01 +1.062840000000000007e+00 -3.721875000000000000e+01 +1.062845000000000040e+00 -3.721875000000000000e+01 +1.062850000000000072e+00 -3.718750000000000000e+01 +1.062855000000000105e+00 -3.718750000000000000e+01 +1.062860000000000138e+00 -3.715625000000000000e+01 +1.062865000000000171e+00 -3.718750000000000000e+01 +1.062869999999999981e+00 -3.721875000000000000e+01 +1.062875000000000014e+00 -3.718750000000000000e+01 +1.062880000000000047e+00 -3.715625000000000000e+01 +1.062885000000000080e+00 -3.715625000000000000e+01 +1.062890000000000112e+00 -3.715625000000000000e+01 +1.062895000000000145e+00 -3.715625000000000000e+01 +1.062900000000000178e+00 -3.718750000000000000e+01 +1.062904999999999989e+00 -3.718750000000000000e+01 +1.062910000000000021e+00 -3.718750000000000000e+01 +1.062915000000000054e+00 -3.718750000000000000e+01 +1.062920000000000087e+00 -3.721875000000000000e+01 +1.062925000000000120e+00 -3.718750000000000000e+01 +1.062930000000000152e+00 -3.715625000000000000e+01 +1.062935000000000185e+00 -3.725000000000000000e+01 +1.062939999999999996e+00 -3.715625000000000000e+01 +1.062945000000000029e+00 -3.718750000000000000e+01 +1.062950000000000061e+00 -3.721875000000000000e+01 +1.062955000000000094e+00 -3.718750000000000000e+01 +1.062960000000000127e+00 -3.718750000000000000e+01 +1.062965000000000160e+00 -3.715625000000000000e+01 +1.062970000000000192e+00 -3.715625000000000000e+01 +1.062975000000000003e+00 -3.715625000000000000e+01 +1.062980000000000036e+00 -3.715625000000000000e+01 +1.062985000000000069e+00 -3.712500381469726562e+01 +1.062990000000000101e+00 -3.715625000000000000e+01 +1.062995000000000134e+00 -3.721875000000000000e+01 +1.063000000000000167e+00 -3.715625000000000000e+01 +1.063004999999999978e+00 -3.721875000000000000e+01 +1.063010000000000010e+00 -3.721875000000000000e+01 +1.063015000000000043e+00 -3.725000000000000000e+01 +1.063020000000000076e+00 -3.715625000000000000e+01 +1.063025000000000109e+00 -3.721875000000000000e+01 +1.063030000000000141e+00 -3.721875000000000000e+01 +1.063035000000000174e+00 -3.718750000000000000e+01 +1.063039999999999985e+00 -3.721875000000000000e+01 +1.063045000000000018e+00 -3.725000000000000000e+01 +1.063050000000000050e+00 -3.718750000000000000e+01 +1.063055000000000083e+00 -3.721875000000000000e+01 +1.063060000000000116e+00 -3.715625000000000000e+01 +1.063065000000000149e+00 -3.715625000000000000e+01 +1.063070000000000181e+00 -3.721875000000000000e+01 +1.063074999999999992e+00 -3.715625000000000000e+01 +1.063080000000000025e+00 -3.712500381469726562e+01 +1.063085000000000058e+00 -3.721875000000000000e+01 +1.063090000000000090e+00 -3.715625000000000000e+01 +1.063095000000000123e+00 -3.718750000000000000e+01 +1.063100000000000156e+00 -3.709375000000000000e+01 +1.063105000000000189e+00 -3.715625000000000000e+01 +1.063109999999999999e+00 -3.718750000000000000e+01 +1.063115000000000032e+00 -3.712500381469726562e+01 +1.063120000000000065e+00 -3.715625000000000000e+01 +1.063125000000000098e+00 -3.715625000000000000e+01 +1.063130000000000130e+00 -3.718750000000000000e+01 +1.063135000000000163e+00 -3.718750000000000000e+01 +1.063140000000000196e+00 -3.715625000000000000e+01 +1.063145000000000007e+00 -3.718750000000000000e+01 +1.063150000000000039e+00 -3.715625000000000000e+01 +1.063155000000000072e+00 -3.718750000000000000e+01 +1.063160000000000105e+00 -3.721875000000000000e+01 +1.063165000000000138e+00 -3.718750000000000000e+01 +1.063170000000000170e+00 -3.715625000000000000e+01 +1.063174999999999981e+00 -3.712500381469726562e+01 +1.063180000000000014e+00 -3.712500381469726562e+01 +1.063185000000000047e+00 -3.709375000000000000e+01 +1.063190000000000079e+00 -3.709375000000000000e+01 +1.063195000000000112e+00 -3.703125381469726562e+01 +1.063200000000000145e+00 -3.715625000000000000e+01 +1.063205000000000178e+00 -3.715625000000000000e+01 +1.063209999999999988e+00 -3.715625000000000000e+01 +1.063215000000000021e+00 -3.715625000000000000e+01 +1.063220000000000054e+00 -3.712500381469726562e+01 +1.063225000000000087e+00 -3.712500381469726562e+01 +1.063230000000000119e+00 -3.715625000000000000e+01 +1.063235000000000152e+00 -3.712500381469726562e+01 +1.063240000000000185e+00 -3.718750000000000000e+01 +1.063244999999999996e+00 -3.712500381469726562e+01 +1.063250000000000028e+00 -3.715625000000000000e+01 +1.063255000000000061e+00 -3.715625000000000000e+01 +1.063260000000000094e+00 -3.715625000000000000e+01 +1.063265000000000127e+00 -3.721875000000000000e+01 +1.063270000000000159e+00 -3.718750000000000000e+01 +1.063275000000000192e+00 -3.718750000000000000e+01 +1.063280000000000003e+00 -3.718750000000000000e+01 +1.063285000000000036e+00 -3.718750000000000000e+01 +1.063290000000000068e+00 -3.718750000000000000e+01 +1.063295000000000101e+00 -3.715625000000000000e+01 +1.063300000000000134e+00 -3.721875000000000000e+01 +1.063305000000000167e+00 -3.718750000000000000e+01 +1.063309999999999977e+00 -3.718750000000000000e+01 +1.063315000000000010e+00 -3.721875000000000000e+01 +1.063320000000000043e+00 -3.718750000000000000e+01 +1.063325000000000076e+00 -3.725000000000000000e+01 +1.063330000000000108e+00 -3.721875000000000000e+01 +1.063335000000000141e+00 -3.721875000000000000e+01 +1.063340000000000174e+00 -3.721875000000000000e+01 +1.063344999999999985e+00 -3.718750000000000000e+01 +1.063350000000000017e+00 -3.718750000000000000e+01 +1.063355000000000050e+00 -3.721875000000000000e+01 +1.063360000000000083e+00 -3.725000000000000000e+01 +1.063365000000000116e+00 -3.721875000000000000e+01 +1.063370000000000148e+00 -3.718750000000000000e+01 +1.063375000000000181e+00 -3.728125381469726562e+01 +1.063379999999999992e+00 -3.721875000000000000e+01 +1.063385000000000025e+00 -3.721875000000000000e+01 +1.063390000000000057e+00 -3.725000000000000000e+01 +1.063395000000000090e+00 -3.721875000000000000e+01 +1.063400000000000123e+00 -3.718750000000000000e+01 +1.063405000000000156e+00 -3.718750000000000000e+01 +1.063410000000000188e+00 -3.725000000000000000e+01 +1.063414999999999999e+00 -3.718750000000000000e+01 +1.063420000000000032e+00 -3.725000000000000000e+01 +1.063425000000000065e+00 -3.725000000000000000e+01 +1.063430000000000097e+00 -3.718750000000000000e+01 +1.063435000000000130e+00 -3.718750000000000000e+01 +1.063440000000000163e+00 -3.728125381469726562e+01 +1.063445000000000196e+00 -3.721875000000000000e+01 +1.063450000000000006e+00 -3.721875000000000000e+01 +1.063455000000000039e+00 -3.725000000000000000e+01 +1.063460000000000072e+00 -3.725000000000000000e+01 +1.063465000000000105e+00 -3.721875000000000000e+01 +1.063470000000000137e+00 -3.721875000000000000e+01 +1.063475000000000170e+00 -3.725000000000000000e+01 +1.063479999999999981e+00 -3.721875000000000000e+01 +1.063485000000000014e+00 -3.721875000000000000e+01 +1.063490000000000046e+00 -3.715625000000000000e+01 +1.063495000000000079e+00 -3.728125381469726562e+01 +1.063500000000000112e+00 -3.725000000000000000e+01 +1.063505000000000145e+00 -3.721875000000000000e+01 +1.063510000000000177e+00 -3.721875000000000000e+01 +1.063514999999999988e+00 -3.725000000000000000e+01 +1.063520000000000021e+00 -3.721875000000000000e+01 +1.063525000000000054e+00 -3.725000000000000000e+01 +1.063530000000000086e+00 -3.718750000000000000e+01 +1.063535000000000119e+00 -3.718750000000000000e+01 +1.063540000000000152e+00 -3.725000000000000000e+01 +1.063545000000000185e+00 -3.721875000000000000e+01 +1.063549999999999995e+00 -3.725000000000000000e+01 +1.063555000000000028e+00 -3.725000000000000000e+01 +1.063560000000000061e+00 -3.721875000000000000e+01 +1.063565000000000094e+00 -3.718750000000000000e+01 +1.063570000000000126e+00 -3.718750000000000000e+01 +1.063575000000000159e+00 -3.721875000000000000e+01 +1.063580000000000192e+00 -3.725000000000000000e+01 +1.063585000000000003e+00 -3.721875000000000000e+01 +1.063590000000000035e+00 -3.718750000000000000e+01 +1.063595000000000068e+00 -3.721875000000000000e+01 +1.063600000000000101e+00 -3.721875000000000000e+01 +1.063605000000000134e+00 -3.718750000000000000e+01 +1.063610000000000166e+00 -3.718750000000000000e+01 +1.063614999999999977e+00 -3.725000000000000000e+01 +1.063620000000000010e+00 -3.725000000000000000e+01 +1.063625000000000043e+00 -3.721875000000000000e+01 +1.063630000000000075e+00 -3.731250000000000000e+01 +1.063635000000000108e+00 -3.728125381469726562e+01 +1.063640000000000141e+00 -3.721875000000000000e+01 +1.063645000000000174e+00 -3.721875000000000000e+01 +1.063649999999999984e+00 -3.728125381469726562e+01 +1.063655000000000017e+00 -3.721875000000000000e+01 +1.063660000000000050e+00 -3.718750000000000000e+01 +1.063665000000000083e+00 -3.725000000000000000e+01 +1.063670000000000115e+00 -3.718750000000000000e+01 +1.063675000000000148e+00 -3.721875000000000000e+01 +1.063680000000000181e+00 -3.718750000000000000e+01 +1.063684999999999992e+00 -3.721875000000000000e+01 +1.063690000000000024e+00 -3.728125381469726562e+01 +1.063695000000000057e+00 -3.725000000000000000e+01 +1.063700000000000090e+00 -3.718750000000000000e+01 +1.063705000000000123e+00 -3.728125381469726562e+01 +1.063710000000000155e+00 -3.725000000000000000e+01 +1.063715000000000188e+00 -3.728125381469726562e+01 +1.063719999999999999e+00 -3.728125381469726562e+01 +1.063725000000000032e+00 -3.721875000000000000e+01 +1.063730000000000064e+00 -3.725000000000000000e+01 +1.063735000000000097e+00 -3.725000000000000000e+01 +1.063740000000000130e+00 -3.721875000000000000e+01 +1.063745000000000163e+00 -3.721875000000000000e+01 +1.063750000000000195e+00 -3.718750000000000000e+01 +1.063755000000000006e+00 -3.721875000000000000e+01 +1.063760000000000039e+00 -3.721875000000000000e+01 +1.063765000000000072e+00 -3.728125381469726562e+01 +1.063770000000000104e+00 -3.721875000000000000e+01 +1.063775000000000137e+00 -3.718750000000000000e+01 +1.063780000000000170e+00 -3.718750000000000000e+01 +1.063784999999999981e+00 -3.725000000000000000e+01 +1.063790000000000013e+00 -3.728125381469726562e+01 +1.063795000000000046e+00 -3.728125381469726562e+01 +1.063800000000000079e+00 -3.721875000000000000e+01 +1.063805000000000112e+00 -3.718750000000000000e+01 +1.063810000000000144e+00 -3.718750000000000000e+01 +1.063815000000000177e+00 -3.728125381469726562e+01 +1.063819999999999988e+00 -3.725000000000000000e+01 +1.063825000000000021e+00 -3.725000000000000000e+01 +1.063830000000000053e+00 -3.718750000000000000e+01 +1.063835000000000086e+00 -3.715625000000000000e+01 +1.063840000000000119e+00 -3.715625000000000000e+01 +1.063845000000000152e+00 -3.718750000000000000e+01 +1.063850000000000184e+00 -3.718750000000000000e+01 +1.063854999999999995e+00 -3.721875000000000000e+01 +1.063860000000000028e+00 -3.725000000000000000e+01 +1.063865000000000061e+00 -3.718750000000000000e+01 +1.063870000000000093e+00 -3.725000000000000000e+01 +1.063875000000000126e+00 -3.718750000000000000e+01 +1.063880000000000159e+00 -3.718750000000000000e+01 +1.063885000000000192e+00 -3.715625000000000000e+01 +1.063890000000000002e+00 -3.718750000000000000e+01 +1.063895000000000035e+00 -3.721875000000000000e+01 +1.063900000000000068e+00 -3.728125381469726562e+01 +1.063905000000000101e+00 -3.725000000000000000e+01 +1.063910000000000133e+00 -3.725000000000000000e+01 +1.063915000000000166e+00 -3.728125381469726562e+01 +1.063919999999999977e+00 -3.718750000000000000e+01 +1.063925000000000010e+00 -3.728125381469726562e+01 +1.063930000000000042e+00 -3.725000000000000000e+01 +1.063935000000000075e+00 -3.728125381469726562e+01 +1.063940000000000108e+00 -3.721875000000000000e+01 +1.063945000000000141e+00 -3.718750000000000000e+01 +1.063950000000000173e+00 -3.728125381469726562e+01 +1.063954999999999984e+00 -3.728125381469726562e+01 +1.063960000000000017e+00 -3.721875000000000000e+01 +1.063965000000000050e+00 -3.721875000000000000e+01 +1.063970000000000082e+00 -3.728125381469726562e+01 +1.063975000000000115e+00 -3.721875000000000000e+01 +1.063980000000000148e+00 -3.718750000000000000e+01 +1.063985000000000181e+00 -3.718750000000000000e+01 +1.063989999999999991e+00 -3.721875000000000000e+01 +1.063995000000000024e+00 -3.721875000000000000e+01 +1.064000000000000057e+00 -3.718750000000000000e+01 +1.064005000000000090e+00 -3.725000000000000000e+01 +1.064010000000000122e+00 -3.721875000000000000e+01 +1.064015000000000155e+00 -3.721875000000000000e+01 +1.064020000000000188e+00 -3.721875000000000000e+01 +1.064024999999999999e+00 -3.721875000000000000e+01 +1.064030000000000031e+00 -3.725000000000000000e+01 +1.064035000000000064e+00 -3.725000000000000000e+01 +1.064040000000000097e+00 -3.725000000000000000e+01 +1.064045000000000130e+00 -3.721875000000000000e+01 +1.064050000000000162e+00 -3.725000000000000000e+01 +1.064055000000000195e+00 -3.725000000000000000e+01 +1.064060000000000006e+00 -3.721875000000000000e+01 +1.064065000000000039e+00 -3.721875000000000000e+01 +1.064070000000000071e+00 -3.725000000000000000e+01 +1.064075000000000104e+00 -3.718750000000000000e+01 +1.064080000000000137e+00 -3.718750000000000000e+01 +1.064085000000000170e+00 -3.721875000000000000e+01 +1.064089999999999980e+00 -3.718750000000000000e+01 +1.064095000000000013e+00 -3.721875000000000000e+01 +1.064100000000000046e+00 -3.725000000000000000e+01 +1.064105000000000079e+00 -3.725000000000000000e+01 +1.064110000000000111e+00 -3.721875000000000000e+01 +1.064115000000000144e+00 -3.718750000000000000e+01 +1.064120000000000177e+00 -3.721875000000000000e+01 +1.064124999999999988e+00 -3.721875000000000000e+01 +1.064130000000000020e+00 -3.721875000000000000e+01 +1.064135000000000053e+00 -3.725000000000000000e+01 +1.064140000000000086e+00 -3.715625000000000000e+01 +1.064145000000000119e+00 -3.721875000000000000e+01 +1.064150000000000151e+00 -3.721875000000000000e+01 +1.064155000000000184e+00 -3.721875000000000000e+01 +1.064159999999999995e+00 -3.718750000000000000e+01 +1.064165000000000028e+00 -3.718750000000000000e+01 +1.064170000000000060e+00 -3.718750000000000000e+01 +1.064175000000000093e+00 -3.715625000000000000e+01 +1.064180000000000126e+00 -3.718750000000000000e+01 +1.064185000000000159e+00 -3.721875000000000000e+01 +1.064190000000000191e+00 -3.718750000000000000e+01 +1.064195000000000002e+00 -3.718750000000000000e+01 +1.064200000000000035e+00 -3.725000000000000000e+01 +1.064205000000000068e+00 -3.721875000000000000e+01 +1.064210000000000100e+00 -3.721875000000000000e+01 +1.064215000000000133e+00 -3.721875000000000000e+01 +1.064220000000000166e+00 -3.728125381469726562e+01 +1.064224999999999977e+00 -3.728125381469726562e+01 +1.064230000000000009e+00 -3.725000000000000000e+01 +1.064235000000000042e+00 -3.725000000000000000e+01 +1.064240000000000075e+00 -3.731250000000000000e+01 +1.064245000000000108e+00 -3.721875000000000000e+01 +1.064250000000000140e+00 -3.725000000000000000e+01 +1.064255000000000173e+00 -3.715625000000000000e+01 +1.064259999999999984e+00 -3.718750000000000000e+01 +1.064265000000000017e+00 -3.718750000000000000e+01 +1.064270000000000049e+00 -3.721875000000000000e+01 +1.064275000000000082e+00 -3.725000000000000000e+01 +1.064280000000000115e+00 -3.718750000000000000e+01 +1.064285000000000148e+00 -3.725000000000000000e+01 +1.064290000000000180e+00 -3.725000000000000000e+01 +1.064294999999999991e+00 -3.718750000000000000e+01 +1.064300000000000024e+00 -3.725000000000000000e+01 +1.064305000000000057e+00 -3.718750000000000000e+01 +1.064310000000000089e+00 -3.721875000000000000e+01 +1.064315000000000122e+00 -3.718750000000000000e+01 +1.064320000000000155e+00 -3.725000000000000000e+01 +1.064325000000000188e+00 -3.728125381469726562e+01 +1.064329999999999998e+00 -3.728125381469726562e+01 +1.064335000000000031e+00 -3.725000000000000000e+01 +1.064340000000000064e+00 -3.721875000000000000e+01 +1.064345000000000097e+00 -3.725000000000000000e+01 +1.064350000000000129e+00 -3.721875000000000000e+01 +1.064355000000000162e+00 -3.731250000000000000e+01 +1.064360000000000195e+00 -3.728125381469726562e+01 +1.064365000000000006e+00 -3.718750000000000000e+01 +1.064370000000000038e+00 -3.725000000000000000e+01 +1.064375000000000071e+00 -3.725000000000000000e+01 +1.064380000000000104e+00 -3.725000000000000000e+01 +1.064385000000000137e+00 -3.728125381469726562e+01 +1.064390000000000169e+00 -3.721875000000000000e+01 +1.064394999999999980e+00 -3.721875000000000000e+01 +1.064400000000000013e+00 -3.721875000000000000e+01 +1.064405000000000046e+00 -3.728125381469726562e+01 +1.064410000000000078e+00 -3.718750000000000000e+01 +1.064415000000000111e+00 -3.725000000000000000e+01 +1.064420000000000144e+00 -3.715625000000000000e+01 +1.064425000000000177e+00 -3.728125381469726562e+01 +1.064429999999999987e+00 -3.725000000000000000e+01 +1.064435000000000020e+00 -3.721875000000000000e+01 +1.064440000000000053e+00 -3.718750000000000000e+01 +1.064445000000000086e+00 -3.721875000000000000e+01 +1.064450000000000118e+00 -3.725000000000000000e+01 +1.064455000000000151e+00 -3.725000000000000000e+01 +1.064460000000000184e+00 -3.725000000000000000e+01 +1.064464999999999995e+00 -3.725000000000000000e+01 +1.064470000000000027e+00 -3.721875000000000000e+01 +1.064475000000000060e+00 -3.728125381469726562e+01 +1.064480000000000093e+00 -3.721875000000000000e+01 +1.064485000000000126e+00 -3.731250000000000000e+01 +1.064490000000000158e+00 -3.721875000000000000e+01 +1.064495000000000191e+00 -3.721875000000000000e+01 +1.064500000000000002e+00 -3.721875000000000000e+01 +1.064505000000000035e+00 -3.721875000000000000e+01 +1.064510000000000067e+00 -3.718750000000000000e+01 +1.064515000000000100e+00 -3.721875000000000000e+01 +1.064520000000000133e+00 -3.728125381469726562e+01 +1.064525000000000166e+00 -3.725000000000000000e+01 +1.064529999999999976e+00 -3.721875000000000000e+01 +1.064535000000000009e+00 -3.725000000000000000e+01 +1.064540000000000042e+00 -3.721875000000000000e+01 +1.064545000000000075e+00 -3.725000000000000000e+01 +1.064550000000000107e+00 -3.721875000000000000e+01 +1.064555000000000140e+00 -3.725000000000000000e+01 +1.064560000000000173e+00 -3.718750000000000000e+01 +1.064564999999999984e+00 -3.718750000000000000e+01 +1.064570000000000016e+00 -3.718750000000000000e+01 +1.064575000000000049e+00 -3.718750000000000000e+01 +1.064580000000000082e+00 -3.715625000000000000e+01 +1.064585000000000115e+00 -3.721875000000000000e+01 +1.064590000000000147e+00 -3.718750000000000000e+01 +1.064595000000000180e+00 -3.718750000000000000e+01 +1.064599999999999991e+00 -3.728125381469726562e+01 +1.064605000000000024e+00 -3.728125381469726562e+01 +1.064610000000000056e+00 -3.718750000000000000e+01 +1.064615000000000089e+00 -3.718750000000000000e+01 +1.064620000000000122e+00 -3.721875000000000000e+01 +1.064625000000000155e+00 -3.721875000000000000e+01 +1.064630000000000187e+00 -3.721875000000000000e+01 +1.064634999999999998e+00 -3.721875000000000000e+01 +1.064640000000000031e+00 -3.715625000000000000e+01 +1.064645000000000064e+00 -3.728125381469726562e+01 +1.064650000000000096e+00 -3.721875000000000000e+01 +1.064655000000000129e+00 -3.718750000000000000e+01 +1.064660000000000162e+00 -3.718750000000000000e+01 +1.064665000000000195e+00 -3.718750000000000000e+01 +1.064670000000000005e+00 -3.721875000000000000e+01 +1.064675000000000038e+00 -3.721875000000000000e+01 +1.064680000000000071e+00 -3.721875000000000000e+01 +1.064685000000000104e+00 -3.718750000000000000e+01 +1.064690000000000136e+00 -3.721875000000000000e+01 +1.064695000000000169e+00 -3.718750000000000000e+01 +1.064699999999999980e+00 -3.721875000000000000e+01 +1.064705000000000013e+00 -3.718750000000000000e+01 +1.064710000000000045e+00 -3.718750000000000000e+01 +1.064715000000000078e+00 -3.715625000000000000e+01 +1.064720000000000111e+00 -3.721875000000000000e+01 +1.064725000000000144e+00 -3.718750000000000000e+01 +1.064730000000000176e+00 -3.715625000000000000e+01 +1.064734999999999987e+00 -3.721875000000000000e+01 +1.064740000000000020e+00 -3.715625000000000000e+01 +1.064745000000000053e+00 -3.718750000000000000e+01 +1.064750000000000085e+00 -3.718750000000000000e+01 +1.064755000000000118e+00 -3.718750000000000000e+01 +1.064760000000000151e+00 -3.715625000000000000e+01 +1.064765000000000184e+00 -3.718750000000000000e+01 +1.064769999999999994e+00 -3.715625000000000000e+01 +1.064775000000000027e+00 -3.725000000000000000e+01 +1.064780000000000060e+00 -3.718750000000000000e+01 +1.064785000000000093e+00 -3.721875000000000000e+01 +1.064790000000000125e+00 -3.715625000000000000e+01 +1.064795000000000158e+00 -3.725000000000000000e+01 +1.064800000000000191e+00 -3.721875000000000000e+01 +1.064805000000000001e+00 -3.721875000000000000e+01 +1.064810000000000034e+00 -3.718750000000000000e+01 +1.064815000000000067e+00 -3.718750000000000000e+01 +1.064820000000000100e+00 -3.725000000000000000e+01 +1.064825000000000133e+00 -3.715625000000000000e+01 +1.064830000000000165e+00 -3.715625000000000000e+01 +1.064835000000000198e+00 -3.725000000000000000e+01 +1.064840000000000009e+00 -3.718750000000000000e+01 +1.064845000000000041e+00 -3.715625000000000000e+01 +1.064850000000000074e+00 -3.721875000000000000e+01 +1.064855000000000107e+00 -3.715625000000000000e+01 +1.064860000000000140e+00 -3.715625000000000000e+01 +1.064865000000000173e+00 -3.715625000000000000e+01 +1.064869999999999983e+00 -3.709375000000000000e+01 +1.064875000000000016e+00 -3.718750000000000000e+01 +1.064880000000000049e+00 -3.718750000000000000e+01 +1.064885000000000081e+00 -3.715625000000000000e+01 +1.064890000000000114e+00 -3.712500381469726562e+01 +1.064895000000000147e+00 -3.718750000000000000e+01 +1.064900000000000180e+00 -3.718750000000000000e+01 +1.064904999999999990e+00 -3.725000000000000000e+01 +1.064910000000000023e+00 -3.718750000000000000e+01 +1.064915000000000056e+00 -3.715625000000000000e+01 +1.064920000000000089e+00 -3.715625000000000000e+01 +1.064925000000000122e+00 -3.718750000000000000e+01 +1.064930000000000154e+00 -3.725000000000000000e+01 +1.064935000000000187e+00 -3.725000000000000000e+01 +1.064939999999999998e+00 -3.721875000000000000e+01 +1.064945000000000030e+00 -3.721875000000000000e+01 +1.064950000000000063e+00 -3.721875000000000000e+01 +1.064955000000000096e+00 -3.721875000000000000e+01 +1.064960000000000129e+00 -3.728125381469726562e+01 +1.064965000000000162e+00 -3.718750000000000000e+01 +1.064970000000000194e+00 -3.721875000000000000e+01 +1.064975000000000005e+00 -3.731250000000000000e+01 +1.064980000000000038e+00 -3.718750000000000000e+01 +1.064985000000000070e+00 -3.725000000000000000e+01 +1.064990000000000103e+00 -3.721875000000000000e+01 +1.064995000000000136e+00 -3.725000000000000000e+01 +1.065000000000000169e+00 -3.721875000000000000e+01 +1.065004999999999979e+00 -3.725000000000000000e+01 +1.065010000000000012e+00 -3.718750000000000000e+01 +1.065015000000000045e+00 -3.718750000000000000e+01 +1.065020000000000078e+00 -3.718750000000000000e+01 +1.065025000000000110e+00 -3.725000000000000000e+01 +1.065030000000000143e+00 -3.715625000000000000e+01 +1.065035000000000176e+00 -3.718750000000000000e+01 +1.065039999999999987e+00 -3.715625000000000000e+01 +1.065045000000000019e+00 -3.715625000000000000e+01 +1.065050000000000052e+00 -3.721875000000000000e+01 +1.065055000000000085e+00 -3.715625000000000000e+01 +1.065060000000000118e+00 -3.725000000000000000e+01 +1.065065000000000150e+00 -3.721875000000000000e+01 +1.065070000000000183e+00 -3.718750000000000000e+01 +1.065074999999999994e+00 -3.715625000000000000e+01 +1.065080000000000027e+00 -3.721875000000000000e+01 +1.065085000000000059e+00 -3.718750000000000000e+01 +1.065090000000000092e+00 -3.721875000000000000e+01 +1.065095000000000125e+00 -3.715625000000000000e+01 +1.065100000000000158e+00 -3.715625000000000000e+01 +1.065105000000000190e+00 -3.715625000000000000e+01 +1.065110000000000001e+00 -3.721875000000000000e+01 +1.065115000000000034e+00 -3.718750000000000000e+01 +1.065120000000000067e+00 -3.718750000000000000e+01 +1.065125000000000099e+00 -3.718750000000000000e+01 +1.065130000000000132e+00 -3.715625000000000000e+01 +1.065135000000000165e+00 -3.718750000000000000e+01 +1.065140000000000198e+00 -3.718750000000000000e+01 +1.065145000000000008e+00 -3.715625000000000000e+01 +1.065150000000000041e+00 -3.718750000000000000e+01 +1.065155000000000074e+00 -3.718750000000000000e+01 +1.065160000000000107e+00 -3.718750000000000000e+01 +1.065165000000000139e+00 -3.718750000000000000e+01 +1.065170000000000172e+00 -3.718750000000000000e+01 +1.065174999999999983e+00 -3.715625000000000000e+01 +1.065180000000000016e+00 -3.715625000000000000e+01 +1.065185000000000048e+00 -3.718750000000000000e+01 +1.065190000000000081e+00 -3.718750000000000000e+01 +1.065195000000000114e+00 -3.728125381469726562e+01 +1.065200000000000147e+00 -3.721875000000000000e+01 +1.065205000000000179e+00 -3.718750000000000000e+01 +1.065209999999999990e+00 -3.715625000000000000e+01 +1.065215000000000023e+00 -3.721875000000000000e+01 +1.065220000000000056e+00 -3.715625000000000000e+01 +1.065225000000000088e+00 -3.721875000000000000e+01 +1.065230000000000121e+00 -3.715625000000000000e+01 +1.065235000000000154e+00 -3.721875000000000000e+01 +1.065240000000000187e+00 -3.712500381469726562e+01 +1.065244999999999997e+00 -3.718750000000000000e+01 +1.065250000000000030e+00 -3.718750000000000000e+01 +1.065255000000000063e+00 -3.718750000000000000e+01 +1.065260000000000096e+00 -3.715625000000000000e+01 +1.065265000000000128e+00 -3.721875000000000000e+01 +1.065270000000000161e+00 -3.712500381469726562e+01 +1.065275000000000194e+00 -3.721875000000000000e+01 +1.065280000000000005e+00 -3.718750000000000000e+01 +1.065285000000000037e+00 -3.718750000000000000e+01 +1.065290000000000070e+00 -3.715625000000000000e+01 +1.065295000000000103e+00 -3.715625000000000000e+01 +1.065300000000000136e+00 -3.718750000000000000e+01 +1.065305000000000168e+00 -3.715625000000000000e+01 +1.065309999999999979e+00 -3.718750000000000000e+01 +1.065315000000000012e+00 -3.715625000000000000e+01 +1.065320000000000045e+00 -3.718750000000000000e+01 +1.065325000000000077e+00 -3.715625000000000000e+01 +1.065330000000000110e+00 -3.718750000000000000e+01 +1.065335000000000143e+00 -3.725000000000000000e+01 +1.065340000000000176e+00 -3.721875000000000000e+01 +1.065344999999999986e+00 -3.725000000000000000e+01 +1.065350000000000019e+00 -3.718750000000000000e+01 +1.065355000000000052e+00 -3.718750000000000000e+01 +1.065360000000000085e+00 -3.715625000000000000e+01 +1.065365000000000117e+00 -3.715625000000000000e+01 +1.065370000000000150e+00 -3.718750000000000000e+01 +1.065375000000000183e+00 -3.721875000000000000e+01 +1.065379999999999994e+00 -3.718750000000000000e+01 +1.065385000000000026e+00 -3.715625000000000000e+01 +1.065390000000000059e+00 -3.712500381469726562e+01 +1.065395000000000092e+00 -3.718750000000000000e+01 +1.065400000000000125e+00 -3.721875000000000000e+01 +1.065405000000000157e+00 -3.718750000000000000e+01 +1.065410000000000190e+00 -3.715625000000000000e+01 +1.065415000000000001e+00 -3.718750000000000000e+01 +1.065420000000000034e+00 -3.718750000000000000e+01 +1.065425000000000066e+00 -3.715625000000000000e+01 +1.065430000000000099e+00 -3.721875000000000000e+01 +1.065435000000000132e+00 -3.718750000000000000e+01 +1.065440000000000165e+00 -3.721875000000000000e+01 +1.065445000000000197e+00 -3.721875000000000000e+01 +1.065450000000000008e+00 -3.718750000000000000e+01 +1.065455000000000041e+00 -3.728125381469726562e+01 +1.065460000000000074e+00 -3.721875000000000000e+01 +1.065465000000000106e+00 -3.721875000000000000e+01 +1.065470000000000139e+00 -3.721875000000000000e+01 +1.065475000000000172e+00 -3.718750000000000000e+01 +1.065479999999999983e+00 -3.715625000000000000e+01 +1.065485000000000015e+00 -3.718750000000000000e+01 +1.065490000000000048e+00 -3.715625000000000000e+01 +1.065495000000000081e+00 -3.715625000000000000e+01 +1.065500000000000114e+00 -3.718750000000000000e+01 +1.065505000000000146e+00 -3.715625000000000000e+01 +1.065510000000000179e+00 -3.718750000000000000e+01 +1.065514999999999990e+00 -3.718750000000000000e+01 +1.065520000000000023e+00 -3.715625000000000000e+01 +1.065525000000000055e+00 -3.721875000000000000e+01 +1.065530000000000088e+00 -3.712500381469726562e+01 +1.065535000000000121e+00 -3.712500381469726562e+01 +1.065540000000000154e+00 -3.721875000000000000e+01 +1.065545000000000186e+00 -3.715625000000000000e+01 +1.065549999999999997e+00 -3.718750000000000000e+01 +1.065555000000000030e+00 -3.715625000000000000e+01 +1.065560000000000063e+00 -3.718750000000000000e+01 +1.065565000000000095e+00 -3.718750000000000000e+01 +1.065570000000000128e+00 -3.715625000000000000e+01 +1.065575000000000161e+00 -3.709375000000000000e+01 +1.065580000000000194e+00 -3.715625000000000000e+01 +1.065585000000000004e+00 -3.715625000000000000e+01 +1.065590000000000037e+00 -3.709375000000000000e+01 +1.065595000000000070e+00 -3.715625000000000000e+01 +1.065600000000000103e+00 -3.715625000000000000e+01 +1.065605000000000135e+00 -3.715625000000000000e+01 +1.065610000000000168e+00 -3.715625000000000000e+01 +1.065614999999999979e+00 -3.712500381469726562e+01 +1.065620000000000012e+00 -3.712500381469726562e+01 +1.065625000000000044e+00 -3.718750000000000000e+01 +1.065630000000000077e+00 -3.715625000000000000e+01 +1.065635000000000110e+00 -3.721875000000000000e+01 +1.065640000000000143e+00 -3.715625000000000000e+01 +1.065645000000000175e+00 -3.718750000000000000e+01 +1.065649999999999986e+00 -3.718750000000000000e+01 +1.065655000000000019e+00 -3.715625000000000000e+01 +1.065660000000000052e+00 -3.715625000000000000e+01 +1.065665000000000084e+00 -3.715625000000000000e+01 +1.065670000000000117e+00 -3.718750000000000000e+01 +1.065675000000000150e+00 -3.709375000000000000e+01 +1.065680000000000183e+00 -3.715625000000000000e+01 +1.065684999999999993e+00 -3.715625000000000000e+01 +1.065690000000000026e+00 -3.712500381469726562e+01 +1.065695000000000059e+00 -3.715625000000000000e+01 +1.065700000000000092e+00 -3.715625000000000000e+01 +1.065705000000000124e+00 -3.712500381469726562e+01 +1.065710000000000157e+00 -3.706250000000000000e+01 +1.065715000000000190e+00 -3.709375000000000000e+01 +1.065720000000000001e+00 -3.709375000000000000e+01 +1.065725000000000033e+00 -3.706250000000000000e+01 +1.065730000000000066e+00 -3.706250000000000000e+01 +1.065735000000000099e+00 -3.715625000000000000e+01 +1.065740000000000132e+00 -3.709375000000000000e+01 +1.065745000000000164e+00 -3.712500381469726562e+01 +1.065750000000000197e+00 -3.712500381469726562e+01 +1.065755000000000008e+00 -3.715625000000000000e+01 +1.065760000000000041e+00 -3.712500381469726562e+01 +1.065765000000000073e+00 -3.712500381469726562e+01 +1.065770000000000106e+00 -3.706250000000000000e+01 +1.065775000000000139e+00 -3.709375000000000000e+01 +1.065780000000000172e+00 -3.718750000000000000e+01 +1.065784999999999982e+00 -3.709375000000000000e+01 +1.065790000000000015e+00 -3.715625000000000000e+01 +1.065795000000000048e+00 -3.706250000000000000e+01 +1.065800000000000081e+00 -3.712500381469726562e+01 +1.065805000000000113e+00 -3.706250000000000000e+01 +1.065810000000000146e+00 -3.709375000000000000e+01 +1.065815000000000179e+00 -3.709375000000000000e+01 +1.065819999999999990e+00 -3.706250000000000000e+01 +1.065825000000000022e+00 -3.712500381469726562e+01 +1.065830000000000055e+00 -3.703125381469726562e+01 +1.065835000000000088e+00 -3.706250000000000000e+01 +1.065840000000000121e+00 -3.703125381469726562e+01 +1.065845000000000153e+00 -3.709375000000000000e+01 +1.065850000000000186e+00 -3.703125381469726562e+01 +1.065854999999999997e+00 -3.709375000000000000e+01 +1.065860000000000030e+00 -3.715625000000000000e+01 +1.065865000000000062e+00 -3.709375000000000000e+01 +1.065870000000000095e+00 -3.706250000000000000e+01 +1.065875000000000128e+00 -3.709375000000000000e+01 +1.065880000000000161e+00 -3.706250000000000000e+01 +1.065885000000000193e+00 -3.706250000000000000e+01 +1.065890000000000004e+00 -3.703125381469726562e+01 +1.065895000000000037e+00 -3.703125381469726562e+01 +1.065900000000000070e+00 -3.703125381469726562e+01 +1.065905000000000102e+00 -3.703125381469726562e+01 +1.065910000000000135e+00 -3.706250000000000000e+01 +1.065915000000000168e+00 -3.703125381469726562e+01 +1.065919999999999979e+00 -3.709375000000000000e+01 +1.065925000000000011e+00 -3.709375000000000000e+01 +1.065930000000000044e+00 -3.709375000000000000e+01 +1.065935000000000077e+00 -3.703125381469726562e+01 +1.065940000000000110e+00 -3.709375000000000000e+01 +1.065945000000000142e+00 -3.709375000000000000e+01 +1.065950000000000175e+00 -3.700000000000000000e+01 +1.065954999999999986e+00 -3.706250000000000000e+01 +1.065960000000000019e+00 -3.700000000000000000e+01 +1.065965000000000051e+00 -3.703125381469726562e+01 +1.065970000000000084e+00 -3.703125381469726562e+01 +1.065975000000000117e+00 -3.706250000000000000e+01 +1.065980000000000150e+00 -3.703125381469726562e+01 +1.065985000000000182e+00 -3.703125381469726562e+01 +1.065989999999999993e+00 -3.706250000000000000e+01 +1.065995000000000026e+00 -3.706250000000000000e+01 +1.066000000000000059e+00 -3.703125381469726562e+01 +1.066005000000000091e+00 -3.703125381469726562e+01 +1.066010000000000124e+00 -3.696875000000000000e+01 +1.066015000000000157e+00 -3.703125381469726562e+01 +1.066020000000000190e+00 -3.709375000000000000e+01 +1.066025000000000000e+00 -3.703125381469726562e+01 +1.066030000000000033e+00 -3.709375000000000000e+01 +1.066035000000000066e+00 -3.703125381469726562e+01 +1.066040000000000099e+00 -3.703125381469726562e+01 +1.066045000000000131e+00 -3.703125381469726562e+01 +1.066050000000000164e+00 -3.700000000000000000e+01 +1.066055000000000197e+00 -3.703125381469726562e+01 +1.066060000000000008e+00 -3.706250000000000000e+01 +1.066065000000000040e+00 -3.706250000000000000e+01 +1.066070000000000073e+00 -3.706250000000000000e+01 +1.066075000000000106e+00 -3.706250000000000000e+01 +1.066080000000000139e+00 -3.703125381469726562e+01 +1.066085000000000171e+00 -3.706250000000000000e+01 +1.066089999999999982e+00 -3.706250000000000000e+01 +1.066095000000000015e+00 -3.703125381469726562e+01 +1.066100000000000048e+00 -3.703125381469726562e+01 +1.066105000000000080e+00 -3.703125381469726562e+01 +1.066110000000000113e+00 -3.706250000000000000e+01 +1.066115000000000146e+00 -3.700000000000000000e+01 +1.066120000000000179e+00 -3.706250000000000000e+01 +1.066124999999999989e+00 -3.703125381469726562e+01 +1.066130000000000022e+00 -3.706250000000000000e+01 +1.066135000000000055e+00 -3.703125381469726562e+01 +1.066140000000000088e+00 -3.700000000000000000e+01 +1.066145000000000120e+00 -3.703125381469726562e+01 +1.066150000000000153e+00 -3.700000000000000000e+01 +1.066155000000000186e+00 -3.703125381469726562e+01 +1.066159999999999997e+00 -3.700000000000000000e+01 +1.066165000000000029e+00 -3.700000000000000000e+01 +1.066170000000000062e+00 -3.703125381469726562e+01 +1.066175000000000095e+00 -3.703125381469726562e+01 +1.066180000000000128e+00 -3.700000000000000000e+01 +1.066185000000000160e+00 -3.696875000000000000e+01 +1.066190000000000193e+00 -3.703125381469726562e+01 +1.066195000000000004e+00 -3.700000000000000000e+01 +1.066200000000000037e+00 -3.703125381469726562e+01 +1.066205000000000069e+00 -3.700000000000000000e+01 +1.066210000000000102e+00 -3.700000000000000000e+01 +1.066215000000000135e+00 -3.700000000000000000e+01 +1.066220000000000168e+00 -3.703125381469726562e+01 +1.066224999999999978e+00 -3.700000000000000000e+01 +1.066230000000000011e+00 -3.696875000000000000e+01 +1.066235000000000044e+00 -3.700000000000000000e+01 +1.066240000000000077e+00 -3.700000000000000000e+01 +1.066245000000000109e+00 -3.696875000000000000e+01 +1.066250000000000142e+00 -3.703125381469726562e+01 +1.066255000000000175e+00 -3.703125381469726562e+01 +1.066259999999999986e+00 -3.700000000000000000e+01 +1.066265000000000018e+00 -3.700000000000000000e+01 +1.066270000000000051e+00 -3.700000000000000000e+01 +1.066275000000000084e+00 -3.700000000000000000e+01 +1.066280000000000117e+00 -3.700000000000000000e+01 +1.066285000000000149e+00 -3.696875000000000000e+01 +1.066290000000000182e+00 -3.696875000000000000e+01 +1.066294999999999993e+00 -3.700000000000000000e+01 +1.066300000000000026e+00 -3.693750000000000000e+01 +1.066305000000000058e+00 -3.696875000000000000e+01 +1.066310000000000091e+00 -3.696875000000000000e+01 +1.066315000000000124e+00 -3.700000000000000000e+01 +1.066320000000000157e+00 -3.696875000000000000e+01 +1.066325000000000189e+00 -3.703125381469726562e+01 +1.066330000000000000e+00 -3.693750000000000000e+01 +1.066335000000000033e+00 -3.696875000000000000e+01 +1.066340000000000066e+00 -3.700000000000000000e+01 +1.066345000000000098e+00 -3.700000000000000000e+01 +1.066350000000000131e+00 -3.700000000000000000e+01 +1.066355000000000164e+00 -3.700000000000000000e+01 +1.066360000000000197e+00 -3.703125381469726562e+01 +1.066365000000000007e+00 -3.700000000000000000e+01 +1.066370000000000040e+00 -3.696875000000000000e+01 +1.066375000000000073e+00 -3.696875000000000000e+01 +1.066380000000000106e+00 -3.693750000000000000e+01 +1.066385000000000138e+00 -3.690625000000000000e+01 +1.066390000000000171e+00 -3.693750000000000000e+01 +1.066394999999999982e+00 -3.690625000000000000e+01 +1.066400000000000015e+00 -3.690625000000000000e+01 +1.066405000000000047e+00 -3.696875000000000000e+01 +1.066410000000000080e+00 -3.693750000000000000e+01 +1.066415000000000113e+00 -3.693750000000000000e+01 +1.066420000000000146e+00 -3.693750000000000000e+01 +1.066425000000000178e+00 -3.696875000000000000e+01 +1.066429999999999989e+00 -3.693750000000000000e+01 +1.066435000000000022e+00 -3.696875000000000000e+01 +1.066440000000000055e+00 -3.693750000000000000e+01 +1.066445000000000087e+00 -3.696875000000000000e+01 +1.066450000000000120e+00 -3.696875000000000000e+01 +1.066455000000000153e+00 -3.687500381469726562e+01 +1.066460000000000186e+00 -3.700000000000000000e+01 +1.066464999999999996e+00 -3.693750000000000000e+01 +1.066470000000000029e+00 -3.693750000000000000e+01 +1.066475000000000062e+00 -3.700000000000000000e+01 +1.066480000000000095e+00 -3.690625000000000000e+01 +1.066485000000000127e+00 -3.696875000000000000e+01 +1.066490000000000160e+00 -3.700000000000000000e+01 +1.066495000000000193e+00 -3.690625000000000000e+01 +1.066500000000000004e+00 -3.696875000000000000e+01 +1.066505000000000036e+00 -3.696875000000000000e+01 +1.066510000000000069e+00 -3.693750000000000000e+01 +1.066515000000000102e+00 -3.690625000000000000e+01 +1.066520000000000135e+00 -3.687500381469726562e+01 +1.066525000000000167e+00 -3.690625000000000000e+01 +1.066529999999999978e+00 -3.690625000000000000e+01 +1.066535000000000011e+00 -3.696875000000000000e+01 +1.066540000000000044e+00 -3.693750000000000000e+01 +1.066545000000000076e+00 -3.696875000000000000e+01 +1.066550000000000109e+00 -3.696875000000000000e+01 +1.066555000000000142e+00 -3.693750000000000000e+01 +1.066560000000000175e+00 -3.696875000000000000e+01 +1.066564999999999985e+00 -3.696875000000000000e+01 +1.066570000000000018e+00 -3.690625000000000000e+01 +1.066575000000000051e+00 -3.696875000000000000e+01 +1.066580000000000084e+00 -3.696875000000000000e+01 +1.066585000000000116e+00 -3.693750000000000000e+01 +1.066590000000000149e+00 -3.693750000000000000e+01 +1.066595000000000182e+00 -3.696875000000000000e+01 +1.066599999999999993e+00 -3.693750000000000000e+01 +1.066605000000000025e+00 -3.696875000000000000e+01 +1.066610000000000058e+00 -3.696875000000000000e+01 +1.066615000000000091e+00 -3.696875000000000000e+01 +1.066620000000000124e+00 -3.690625000000000000e+01 +1.066625000000000156e+00 -3.700000000000000000e+01 +1.066630000000000189e+00 -3.700000000000000000e+01 +1.066635000000000000e+00 -3.696875000000000000e+01 +1.066640000000000033e+00 -3.700000000000000000e+01 +1.066645000000000065e+00 -3.696875000000000000e+01 +1.066650000000000098e+00 -3.696875000000000000e+01 +1.066655000000000131e+00 -3.693750000000000000e+01 +1.066660000000000164e+00 -3.696875000000000000e+01 +1.066665000000000196e+00 -3.693750000000000000e+01 +1.066670000000000007e+00 -3.690625000000000000e+01 +1.066675000000000040e+00 -3.693750000000000000e+01 +1.066680000000000073e+00 -3.693750000000000000e+01 +1.066685000000000105e+00 -3.696875000000000000e+01 +1.066690000000000138e+00 -3.693750000000000000e+01 +1.066695000000000171e+00 -3.687500381469726562e+01 +1.066699999999999982e+00 -3.690625000000000000e+01 +1.066705000000000014e+00 -3.690625000000000000e+01 +1.066710000000000047e+00 -3.690625000000000000e+01 +1.066715000000000080e+00 -3.696875000000000000e+01 +1.066720000000000113e+00 -3.693750000000000000e+01 +1.066725000000000145e+00 -3.690625000000000000e+01 +1.066730000000000178e+00 -3.690625000000000000e+01 +1.066734999999999989e+00 -3.690625000000000000e+01 +1.066740000000000022e+00 -3.690625000000000000e+01 +1.066745000000000054e+00 -3.687500381469726562e+01 +1.066750000000000087e+00 -3.693750000000000000e+01 +1.066755000000000120e+00 -3.690625000000000000e+01 +1.066760000000000153e+00 -3.687500381469726562e+01 +1.066765000000000185e+00 -3.687500381469726562e+01 +1.066769999999999996e+00 -3.687500381469726562e+01 +1.066775000000000029e+00 -3.690625000000000000e+01 +1.066780000000000062e+00 -3.687500381469726562e+01 +1.066785000000000094e+00 -3.690625000000000000e+01 +1.066790000000000127e+00 -3.687500381469726562e+01 +1.066795000000000160e+00 -3.690625000000000000e+01 +1.066800000000000193e+00 -3.693750000000000000e+01 +1.066805000000000003e+00 -3.687500381469726562e+01 +1.066810000000000036e+00 -3.687500381469726562e+01 +1.066815000000000069e+00 -3.687500381469726562e+01 +1.066820000000000102e+00 -3.690625000000000000e+01 +1.066825000000000134e+00 -3.690625000000000000e+01 +1.066830000000000167e+00 -3.684375000000000000e+01 +1.066834999999999978e+00 -3.693750000000000000e+01 +1.066840000000000011e+00 -3.684375000000000000e+01 +1.066845000000000043e+00 -3.690625000000000000e+01 +1.066850000000000076e+00 -3.690625000000000000e+01 +1.066855000000000109e+00 -3.690625000000000000e+01 +1.066860000000000142e+00 -3.693750000000000000e+01 +1.066865000000000174e+00 -3.687500381469726562e+01 +1.066869999999999985e+00 -3.684375000000000000e+01 +1.066875000000000018e+00 -3.687500381469726562e+01 +1.066880000000000051e+00 -3.690625000000000000e+01 +1.066885000000000083e+00 -3.690625000000000000e+01 +1.066890000000000116e+00 -3.687500381469726562e+01 +1.066895000000000149e+00 -3.693750000000000000e+01 +1.066900000000000182e+00 -3.690625000000000000e+01 +1.066904999999999992e+00 -3.687500381469726562e+01 +1.066910000000000025e+00 -3.690625000000000000e+01 +1.066915000000000058e+00 -3.687500381469726562e+01 +1.066920000000000091e+00 -3.684375000000000000e+01 +1.066925000000000123e+00 -3.687500381469726562e+01 +1.066930000000000156e+00 -3.684375000000000000e+01 +1.066935000000000189e+00 -3.684375000000000000e+01 +1.066940000000000000e+00 -3.687500381469726562e+01 +1.066945000000000032e+00 -3.678125000000000000e+01 +1.066950000000000065e+00 -3.690625000000000000e+01 +1.066955000000000098e+00 -3.684375000000000000e+01 +1.066960000000000131e+00 -3.687500381469726562e+01 +1.066965000000000163e+00 -3.684375000000000000e+01 +1.066970000000000196e+00 -3.684375000000000000e+01 +1.066975000000000007e+00 -3.687500381469726562e+01 +1.066980000000000040e+00 -3.684375000000000000e+01 +1.066985000000000072e+00 -3.684375000000000000e+01 +1.066990000000000105e+00 -3.684375000000000000e+01 +1.066995000000000138e+00 -3.684375000000000000e+01 +1.067000000000000171e+00 -3.684375000000000000e+01 +1.067004999999999981e+00 -3.684375000000000000e+01 +1.067010000000000014e+00 -3.690625000000000000e+01 +1.067015000000000047e+00 -3.690625000000000000e+01 +1.067020000000000080e+00 -3.684375000000000000e+01 +1.067025000000000112e+00 -3.687500381469726562e+01 +1.067030000000000145e+00 -3.684375000000000000e+01 +1.067035000000000178e+00 -3.690625000000000000e+01 +1.067039999999999988e+00 -3.687500381469726562e+01 +1.067045000000000021e+00 -3.684375000000000000e+01 +1.067050000000000054e+00 -3.684375000000000000e+01 +1.067055000000000087e+00 -3.690625000000000000e+01 +1.067060000000000120e+00 -3.684375000000000000e+01 +1.067065000000000152e+00 -3.684375000000000000e+01 +1.067070000000000185e+00 -3.681250000000000000e+01 +1.067074999999999996e+00 -3.684375000000000000e+01 +1.067080000000000028e+00 -3.684375000000000000e+01 +1.067085000000000061e+00 -3.687500381469726562e+01 +1.067090000000000094e+00 -3.684375000000000000e+01 +1.067095000000000127e+00 -3.684375000000000000e+01 +1.067100000000000160e+00 -3.684375000000000000e+01 +1.067105000000000192e+00 -3.684375000000000000e+01 +1.067110000000000003e+00 -3.681250000000000000e+01 +1.067115000000000036e+00 -3.684375000000000000e+01 +1.067120000000000068e+00 -3.684375000000000000e+01 +1.067125000000000101e+00 -3.678125000000000000e+01 +1.067130000000000134e+00 -3.678125000000000000e+01 +1.067135000000000167e+00 -3.681250000000000000e+01 +1.067139999999999977e+00 -3.684375000000000000e+01 +1.067145000000000010e+00 -3.684375000000000000e+01 +1.067150000000000043e+00 -3.687500381469726562e+01 +1.067155000000000076e+00 -3.678125000000000000e+01 +1.067160000000000108e+00 -3.684375000000000000e+01 +1.067165000000000141e+00 -3.684375000000000000e+01 +1.067170000000000174e+00 -3.684375000000000000e+01 +1.067174999999999985e+00 -3.684375000000000000e+01 +1.067180000000000017e+00 -3.678125000000000000e+01 +1.067185000000000050e+00 -3.684375000000000000e+01 +1.067190000000000083e+00 -3.681250000000000000e+01 +1.067195000000000116e+00 -3.678125000000000000e+01 +1.067200000000000149e+00 -3.684375000000000000e+01 +1.067205000000000181e+00 -3.684375000000000000e+01 +1.067209999999999992e+00 -3.678125000000000000e+01 +1.067215000000000025e+00 -3.684375000000000000e+01 +1.067220000000000057e+00 -3.678125000000000000e+01 +1.067225000000000090e+00 -3.678125000000000000e+01 +1.067230000000000123e+00 -3.687500381469726562e+01 +1.067235000000000156e+00 -3.675000000000000000e+01 +1.067240000000000189e+00 -3.681250000000000000e+01 +1.067244999999999999e+00 -3.678125000000000000e+01 +1.067250000000000032e+00 -3.684375000000000000e+01 +1.067255000000000065e+00 -3.678125000000000000e+01 +1.067260000000000097e+00 -3.684375000000000000e+01 +1.067265000000000130e+00 -3.687500381469726562e+01 +1.067270000000000163e+00 -3.684375000000000000e+01 +1.067275000000000196e+00 -3.687500381469726562e+01 +1.067280000000000006e+00 -3.678125000000000000e+01 +1.067285000000000039e+00 -3.687500381469726562e+01 +1.067290000000000072e+00 -3.684375000000000000e+01 +1.067295000000000105e+00 -3.678125000000000000e+01 +1.067300000000000137e+00 -3.684375000000000000e+01 +1.067305000000000170e+00 -3.681250000000000000e+01 +1.067309999999999981e+00 -3.681250000000000000e+01 +1.067315000000000014e+00 -3.681250000000000000e+01 +1.067320000000000046e+00 -3.684375000000000000e+01 +1.067325000000000079e+00 -3.681250000000000000e+01 +1.067330000000000112e+00 -3.678125000000000000e+01 +1.067335000000000145e+00 -3.684375000000000000e+01 +1.067340000000000177e+00 -3.684375000000000000e+01 +1.067344999999999988e+00 -3.675000000000000000e+01 +1.067350000000000021e+00 -3.687500381469726562e+01 +1.067355000000000054e+00 -3.675000000000000000e+01 +1.067360000000000086e+00 -3.678125000000000000e+01 +1.067365000000000119e+00 -3.678125000000000000e+01 +1.067370000000000152e+00 -3.678125000000000000e+01 +1.067375000000000185e+00 -3.681250000000000000e+01 +1.067379999999999995e+00 -3.684375000000000000e+01 +1.067385000000000028e+00 -3.681250000000000000e+01 +1.067390000000000061e+00 -3.681250000000000000e+01 +1.067395000000000094e+00 -3.681250000000000000e+01 +1.067400000000000126e+00 -3.678125000000000000e+01 +1.067405000000000159e+00 -3.681250000000000000e+01 +1.067410000000000192e+00 -3.678125000000000000e+01 +1.067415000000000003e+00 -3.678125000000000000e+01 +1.067420000000000035e+00 -3.684375000000000000e+01 +1.067425000000000068e+00 -3.684375000000000000e+01 +1.067430000000000101e+00 -3.684375000000000000e+01 +1.067435000000000134e+00 -3.684375000000000000e+01 +1.067440000000000166e+00 -3.684375000000000000e+01 +1.067444999999999977e+00 -3.681250000000000000e+01 +1.067450000000000010e+00 -3.684375000000000000e+01 +1.067455000000000043e+00 -3.678125000000000000e+01 +1.067460000000000075e+00 -3.681250000000000000e+01 +1.067465000000000108e+00 -3.681250000000000000e+01 +1.067470000000000141e+00 -3.681250000000000000e+01 +1.067475000000000174e+00 -3.681250000000000000e+01 +1.067479999999999984e+00 -3.684375000000000000e+01 +1.067485000000000017e+00 -3.681250000000000000e+01 +1.067490000000000050e+00 -3.675000000000000000e+01 +1.067495000000000083e+00 -3.678125000000000000e+01 +1.067500000000000115e+00 -3.684375000000000000e+01 +1.067505000000000148e+00 -3.684375000000000000e+01 +1.067510000000000181e+00 -3.684375000000000000e+01 +1.067514999999999992e+00 -3.675000000000000000e+01 +1.067520000000000024e+00 -3.675000000000000000e+01 +1.067525000000000057e+00 -3.678125000000000000e+01 +1.067530000000000090e+00 -3.675000000000000000e+01 +1.067535000000000123e+00 -3.671875381469726562e+01 +1.067540000000000155e+00 -3.675000000000000000e+01 +1.067545000000000188e+00 -3.678125000000000000e+01 +1.067549999999999999e+00 -3.671875381469726562e+01 +1.067555000000000032e+00 -3.668750000000000000e+01 +1.067560000000000064e+00 -3.671875381469726562e+01 +1.067565000000000097e+00 -3.675000000000000000e+01 +1.067570000000000130e+00 -3.681250000000000000e+01 +1.067575000000000163e+00 -3.675000000000000000e+01 +1.067580000000000195e+00 -3.678125000000000000e+01 +1.067585000000000006e+00 -3.675000000000000000e+01 +1.067590000000000039e+00 -3.678125000000000000e+01 +1.067595000000000072e+00 -3.678125000000000000e+01 +1.067600000000000104e+00 -3.671875381469726562e+01 +1.067605000000000137e+00 -3.678125000000000000e+01 +1.067610000000000170e+00 -3.678125000000000000e+01 +1.067614999999999981e+00 -3.681250000000000000e+01 +1.067620000000000013e+00 -3.678125000000000000e+01 +1.067625000000000046e+00 -3.675000000000000000e+01 +1.067630000000000079e+00 -3.675000000000000000e+01 +1.067635000000000112e+00 -3.678125000000000000e+01 +1.067640000000000144e+00 -3.684375000000000000e+01 +1.067645000000000177e+00 -3.678125000000000000e+01 +1.067649999999999988e+00 -3.681250000000000000e+01 +1.067655000000000021e+00 -3.681250000000000000e+01 +1.067660000000000053e+00 -3.684375000000000000e+01 +1.067665000000000086e+00 -3.681250000000000000e+01 +1.067670000000000119e+00 -3.678125000000000000e+01 +1.067675000000000152e+00 -3.678125000000000000e+01 +1.067680000000000184e+00 -3.678125000000000000e+01 +1.067684999999999995e+00 -3.678125000000000000e+01 +1.067690000000000028e+00 -3.678125000000000000e+01 +1.067695000000000061e+00 -3.678125000000000000e+01 +1.067700000000000093e+00 -3.678125000000000000e+01 +1.067705000000000126e+00 -3.678125000000000000e+01 +1.067710000000000159e+00 -3.675000000000000000e+01 +1.067715000000000192e+00 -3.678125000000000000e+01 +1.067720000000000002e+00 -3.675000000000000000e+01 +1.067725000000000035e+00 -3.678125000000000000e+01 +1.067730000000000068e+00 -3.678125000000000000e+01 +1.067735000000000101e+00 -3.678125000000000000e+01 +1.067740000000000133e+00 -3.678125000000000000e+01 +1.067745000000000166e+00 -3.684375000000000000e+01 +1.067749999999999977e+00 -3.678125000000000000e+01 +1.067755000000000010e+00 -3.687500381469726562e+01 +1.067760000000000042e+00 -3.684375000000000000e+01 +1.067765000000000075e+00 -3.678125000000000000e+01 +1.067770000000000108e+00 -3.681250000000000000e+01 +1.067775000000000141e+00 -3.678125000000000000e+01 +1.067780000000000173e+00 -3.671875381469726562e+01 +1.067784999999999984e+00 -3.675000000000000000e+01 +1.067790000000000017e+00 -3.671875381469726562e+01 +1.067795000000000050e+00 -3.671875381469726562e+01 +1.067800000000000082e+00 -3.675000000000000000e+01 +1.067805000000000115e+00 -3.675000000000000000e+01 +1.067810000000000148e+00 -3.681250000000000000e+01 +1.067815000000000181e+00 -3.678125000000000000e+01 +1.067819999999999991e+00 -3.678125000000000000e+01 +1.067825000000000024e+00 -3.678125000000000000e+01 +1.067830000000000057e+00 -3.675000000000000000e+01 +1.067835000000000090e+00 -3.675000000000000000e+01 +1.067840000000000122e+00 -3.675000000000000000e+01 +1.067845000000000155e+00 -3.678125000000000000e+01 +1.067850000000000188e+00 -3.671875381469726562e+01 +1.067854999999999999e+00 -3.675000000000000000e+01 +1.067860000000000031e+00 -3.671875381469726562e+01 +1.067865000000000064e+00 -3.675000000000000000e+01 +1.067870000000000097e+00 -3.678125000000000000e+01 +1.067875000000000130e+00 -3.675000000000000000e+01 +1.067880000000000162e+00 -3.671875381469726562e+01 +1.067885000000000195e+00 -3.675000000000000000e+01 +1.067890000000000006e+00 -3.678125000000000000e+01 +1.067895000000000039e+00 -3.675000000000000000e+01 +1.067900000000000071e+00 -3.675000000000000000e+01 +1.067905000000000104e+00 -3.671875381469726562e+01 +1.067910000000000137e+00 -3.668750000000000000e+01 +1.067915000000000170e+00 -3.671875381469726562e+01 +1.067919999999999980e+00 -3.675000000000000000e+01 +1.067925000000000013e+00 -3.671875381469726562e+01 +1.067930000000000046e+00 -3.668750000000000000e+01 +1.067935000000000079e+00 -3.665625000000000000e+01 +1.067940000000000111e+00 -3.671875381469726562e+01 +1.067945000000000144e+00 -3.668750000000000000e+01 +1.067950000000000177e+00 -3.671875381469726562e+01 +1.067954999999999988e+00 -3.671875381469726562e+01 +1.067960000000000020e+00 -3.668750000000000000e+01 +1.067965000000000053e+00 -3.671875381469726562e+01 +1.067970000000000086e+00 -3.668750000000000000e+01 +1.067975000000000119e+00 -3.671875381469726562e+01 +1.067980000000000151e+00 -3.668750000000000000e+01 +1.067985000000000184e+00 -3.668750000000000000e+01 +1.067989999999999995e+00 -3.668750000000000000e+01 +1.067995000000000028e+00 -3.671875381469726562e+01 +1.068000000000000060e+00 -3.668750000000000000e+01 +1.068005000000000093e+00 -3.671875381469726562e+01 +1.068010000000000126e+00 -3.678125000000000000e+01 +1.068015000000000159e+00 -3.665625000000000000e+01 +1.068020000000000191e+00 -3.665625000000000000e+01 +1.068025000000000002e+00 -3.668750000000000000e+01 +1.068030000000000035e+00 -3.668750000000000000e+01 +1.068035000000000068e+00 -3.665625000000000000e+01 +1.068040000000000100e+00 -3.668750000000000000e+01 +1.068045000000000133e+00 -3.668750000000000000e+01 +1.068050000000000166e+00 -3.668750000000000000e+01 +1.068054999999999977e+00 -3.665625000000000000e+01 +1.068060000000000009e+00 -3.668750000000000000e+01 +1.068065000000000042e+00 -3.671875381469726562e+01 +1.068070000000000075e+00 -3.671875381469726562e+01 +1.068075000000000108e+00 -3.665625000000000000e+01 +1.068080000000000140e+00 -3.665625000000000000e+01 +1.068085000000000173e+00 -3.671875381469726562e+01 +1.068089999999999984e+00 -3.665625000000000000e+01 +1.068095000000000017e+00 -3.662500000000000000e+01 +1.068100000000000049e+00 -3.668750000000000000e+01 +1.068105000000000082e+00 -3.671875381469726562e+01 +1.068110000000000115e+00 -3.671875381469726562e+01 +1.068115000000000148e+00 -3.671875381469726562e+01 +1.068120000000000180e+00 -3.675000000000000000e+01 +1.068124999999999991e+00 -3.675000000000000000e+01 +1.068130000000000024e+00 -3.678125000000000000e+01 +1.068135000000000057e+00 -3.675000000000000000e+01 +1.068140000000000089e+00 -3.668750000000000000e+01 +1.068145000000000122e+00 -3.678125000000000000e+01 +1.068150000000000155e+00 -3.671875381469726562e+01 +1.068155000000000188e+00 -3.671875381469726562e+01 +1.068159999999999998e+00 -3.671875381469726562e+01 +1.068165000000000031e+00 -3.665625000000000000e+01 +1.068170000000000064e+00 -3.668750000000000000e+01 +1.068175000000000097e+00 -3.678125000000000000e+01 +1.068180000000000129e+00 -3.668750000000000000e+01 +1.068185000000000162e+00 -3.671875381469726562e+01 +1.068190000000000195e+00 -3.671875381469726562e+01 +1.068195000000000006e+00 -3.675000000000000000e+01 +1.068200000000000038e+00 -3.678125000000000000e+01 +1.068205000000000071e+00 -3.668750000000000000e+01 +1.068210000000000104e+00 -3.675000000000000000e+01 +1.068215000000000137e+00 -3.671875381469726562e+01 +1.068220000000000169e+00 -3.671875381469726562e+01 +1.068224999999999980e+00 -3.675000000000000000e+01 +1.068230000000000013e+00 -3.665625000000000000e+01 +1.068235000000000046e+00 -3.671875381469726562e+01 +1.068240000000000078e+00 -3.668750000000000000e+01 +1.068245000000000111e+00 -3.671875381469726562e+01 +1.068250000000000144e+00 -3.668750000000000000e+01 +1.068255000000000177e+00 -3.668750000000000000e+01 +1.068259999999999987e+00 -3.675000000000000000e+01 +1.068265000000000020e+00 -3.678125000000000000e+01 +1.068270000000000053e+00 -3.678125000000000000e+01 +1.068275000000000086e+00 -3.671875381469726562e+01 +1.068280000000000118e+00 -3.678125000000000000e+01 +1.068285000000000151e+00 -3.668750000000000000e+01 +1.068290000000000184e+00 -3.675000000000000000e+01 +1.068294999999999995e+00 -3.675000000000000000e+01 +1.068300000000000027e+00 -3.665625000000000000e+01 +1.068305000000000060e+00 -3.675000000000000000e+01 +1.068310000000000093e+00 -3.675000000000000000e+01 +1.068315000000000126e+00 -3.668750000000000000e+01 +1.068320000000000158e+00 -3.671875381469726562e+01 +1.068325000000000191e+00 -3.668750000000000000e+01 +1.068330000000000002e+00 -3.668750000000000000e+01 +1.068335000000000035e+00 -3.668750000000000000e+01 +1.068340000000000067e+00 -3.675000000000000000e+01 +1.068345000000000100e+00 -3.671875381469726562e+01 +1.068350000000000133e+00 -3.668750000000000000e+01 +1.068355000000000166e+00 -3.671875381469726562e+01 +1.068360000000000198e+00 -3.671875381469726562e+01 +1.068365000000000009e+00 -3.665625000000000000e+01 +1.068370000000000042e+00 -3.662500000000000000e+01 +1.068375000000000075e+00 -3.668750000000000000e+01 +1.068380000000000107e+00 -3.668750000000000000e+01 +1.068385000000000140e+00 -3.668750000000000000e+01 +1.068390000000000173e+00 -3.668750000000000000e+01 +1.068394999999999984e+00 -3.665625000000000000e+01 +1.068400000000000016e+00 -3.668750000000000000e+01 +1.068405000000000049e+00 -3.665625000000000000e+01 +1.068410000000000082e+00 -3.668750000000000000e+01 +1.068415000000000115e+00 -3.662500000000000000e+01 +1.068420000000000147e+00 -3.668750000000000000e+01 +1.068425000000000180e+00 -3.662500000000000000e+01 +1.068429999999999991e+00 -3.668750000000000000e+01 +1.068435000000000024e+00 -3.668750000000000000e+01 +1.068440000000000056e+00 -3.662500000000000000e+01 +1.068445000000000089e+00 -3.665625000000000000e+01 +1.068450000000000122e+00 -3.668750000000000000e+01 +1.068455000000000155e+00 -3.668750000000000000e+01 +1.068460000000000187e+00 -3.665625000000000000e+01 +1.068464999999999998e+00 -3.665625000000000000e+01 +1.068470000000000031e+00 -3.665625000000000000e+01 +1.068475000000000064e+00 -3.671875381469726562e+01 +1.068480000000000096e+00 -3.665625000000000000e+01 +1.068485000000000129e+00 -3.662500000000000000e+01 +1.068490000000000162e+00 -3.665625000000000000e+01 +1.068495000000000195e+00 -3.662500000000000000e+01 +1.068500000000000005e+00 -3.665625000000000000e+01 +1.068505000000000038e+00 -3.656250381469726562e+01 +1.068510000000000071e+00 -3.659375000000000000e+01 +1.068515000000000104e+00 -3.662500000000000000e+01 +1.068520000000000136e+00 -3.659375000000000000e+01 +1.068525000000000169e+00 -3.662500000000000000e+01 +1.068529999999999980e+00 -3.662500000000000000e+01 +1.068535000000000013e+00 -3.659375000000000000e+01 +1.068540000000000045e+00 -3.662500000000000000e+01 +1.068545000000000078e+00 -3.653125000000000000e+01 +1.068550000000000111e+00 -3.653125000000000000e+01 +1.068555000000000144e+00 -3.659375000000000000e+01 +1.068560000000000176e+00 -3.662500000000000000e+01 +1.068564999999999987e+00 -3.662500000000000000e+01 +1.068570000000000020e+00 -3.659375000000000000e+01 +1.068575000000000053e+00 -3.656250381469726562e+01 +1.068580000000000085e+00 -3.659375000000000000e+01 +1.068585000000000118e+00 -3.659375000000000000e+01 +1.068590000000000151e+00 -3.668750000000000000e+01 +1.068595000000000184e+00 -3.659375000000000000e+01 +1.068599999999999994e+00 -3.662500000000000000e+01 +1.068605000000000027e+00 -3.665625000000000000e+01 +1.068610000000000060e+00 -3.659375000000000000e+01 +1.068615000000000093e+00 -3.659375000000000000e+01 +1.068620000000000125e+00 -3.656250381469726562e+01 +1.068625000000000158e+00 -3.656250381469726562e+01 +1.068630000000000191e+00 -3.653125000000000000e+01 +1.068635000000000002e+00 -3.659375000000000000e+01 +1.068640000000000034e+00 -3.656250381469726562e+01 +1.068645000000000067e+00 -3.656250381469726562e+01 +1.068650000000000100e+00 -3.653125000000000000e+01 +1.068655000000000133e+00 -3.653125000000000000e+01 +1.068660000000000165e+00 -3.653125000000000000e+01 +1.068665000000000198e+00 -3.656250381469726562e+01 +1.068670000000000009e+00 -3.659375000000000000e+01 +1.068675000000000042e+00 -3.656250381469726562e+01 +1.068680000000000074e+00 -3.653125000000000000e+01 +1.068685000000000107e+00 -3.656250381469726562e+01 +1.068690000000000140e+00 -3.653125000000000000e+01 +1.068695000000000173e+00 -3.662500000000000000e+01 +1.068699999999999983e+00 -3.656250381469726562e+01 +1.068705000000000016e+00 -3.659375000000000000e+01 +1.068710000000000049e+00 -3.653125000000000000e+01 +1.068715000000000082e+00 -3.656250381469726562e+01 +1.068720000000000114e+00 -3.650000000000000000e+01 +1.068725000000000147e+00 -3.653125000000000000e+01 +1.068730000000000180e+00 -3.653125000000000000e+01 +1.068734999999999991e+00 -3.653125000000000000e+01 +1.068740000000000023e+00 -3.653125000000000000e+01 +1.068745000000000056e+00 -3.653125000000000000e+01 +1.068750000000000089e+00 -3.653125000000000000e+01 +1.068755000000000122e+00 -3.653125000000000000e+01 +1.068760000000000154e+00 -3.650000000000000000e+01 +1.068765000000000187e+00 -3.653125000000000000e+01 +1.068769999999999998e+00 -3.650000000000000000e+01 +1.068775000000000031e+00 -3.659375000000000000e+01 +1.068780000000000063e+00 -3.650000000000000000e+01 +1.068785000000000096e+00 -3.653125000000000000e+01 +1.068790000000000129e+00 -3.656250381469726562e+01 +1.068795000000000162e+00 -3.656250381469726562e+01 +1.068800000000000194e+00 -3.653125000000000000e+01 +1.068805000000000005e+00 -3.650000000000000000e+01 +1.068810000000000038e+00 -3.653125000000000000e+01 +1.068815000000000071e+00 -3.659375000000000000e+01 +1.068820000000000103e+00 -3.656250381469726562e+01 +1.068825000000000136e+00 -3.659375000000000000e+01 +1.068830000000000169e+00 -3.659375000000000000e+01 +1.068834999999999980e+00 -3.653125000000000000e+01 +1.068840000000000012e+00 -3.656250381469726562e+01 +1.068845000000000045e+00 -3.653125000000000000e+01 +1.068850000000000078e+00 -3.653125000000000000e+01 +1.068855000000000111e+00 -3.656250381469726562e+01 +1.068860000000000143e+00 -3.659375000000000000e+01 +1.068865000000000176e+00 -3.656250381469726562e+01 +1.068869999999999987e+00 -3.650000000000000000e+01 +1.068875000000000020e+00 -3.653125000000000000e+01 +1.068880000000000052e+00 -3.653125000000000000e+01 +1.068885000000000085e+00 -3.653125000000000000e+01 +1.068890000000000118e+00 -3.656250381469726562e+01 +1.068895000000000151e+00 -3.653125000000000000e+01 +1.068900000000000183e+00 -3.646875000000000000e+01 +1.068904999999999994e+00 -3.653125000000000000e+01 +1.068910000000000027e+00 -3.646875000000000000e+01 +1.068915000000000060e+00 -3.650000000000000000e+01 +1.068920000000000092e+00 -3.653125000000000000e+01 +1.068925000000000125e+00 -3.650000000000000000e+01 +1.068930000000000158e+00 -3.650000000000000000e+01 +1.068935000000000191e+00 -3.650000000000000000e+01 +1.068940000000000001e+00 -3.653125000000000000e+01 +1.068945000000000034e+00 -3.646875000000000000e+01 +1.068950000000000067e+00 -3.646875000000000000e+01 +1.068955000000000100e+00 -3.650000000000000000e+01 +1.068960000000000132e+00 -3.653125000000000000e+01 +1.068965000000000165e+00 -3.650000000000000000e+01 +1.068970000000000198e+00 -3.656250381469726562e+01 +1.068975000000000009e+00 -3.653125000000000000e+01 +1.068980000000000041e+00 -3.656250381469726562e+01 +1.068985000000000074e+00 -3.646875000000000000e+01 +1.068990000000000107e+00 -3.650000000000000000e+01 +1.068995000000000140e+00 -3.653125000000000000e+01 +1.069000000000000172e+00 -3.646875000000000000e+01 +1.069004999999999983e+00 -3.653125000000000000e+01 +1.069010000000000016e+00 -3.646875000000000000e+01 +1.069015000000000049e+00 -3.650000000000000000e+01 +1.069020000000000081e+00 -3.646875000000000000e+01 +1.069025000000000114e+00 -3.643750000000000000e+01 +1.069030000000000147e+00 -3.650000000000000000e+01 +1.069035000000000180e+00 -3.653125000000000000e+01 +1.069039999999999990e+00 -3.653125000000000000e+01 +1.069045000000000023e+00 -3.650000000000000000e+01 +1.069050000000000056e+00 -3.653125000000000000e+01 +1.069055000000000089e+00 -3.646875000000000000e+01 +1.069060000000000121e+00 -3.650000000000000000e+01 +1.069065000000000154e+00 -3.646875000000000000e+01 +1.069070000000000187e+00 -3.640625381469726562e+01 +1.069074999999999998e+00 -3.643750000000000000e+01 +1.069080000000000030e+00 -3.646875000000000000e+01 +1.069085000000000063e+00 -3.643750000000000000e+01 +1.069090000000000096e+00 -3.640625381469726562e+01 +1.069095000000000129e+00 -3.646875000000000000e+01 +1.069100000000000161e+00 -3.653125000000000000e+01 +1.069105000000000194e+00 -3.646875000000000000e+01 +1.069110000000000005e+00 -3.646875000000000000e+01 +1.069115000000000038e+00 -3.650000000000000000e+01 +1.069120000000000070e+00 -3.643750000000000000e+01 +1.069125000000000103e+00 -3.650000000000000000e+01 +1.069130000000000136e+00 -3.650000000000000000e+01 +1.069135000000000169e+00 -3.646875000000000000e+01 +1.069139999999999979e+00 -3.643750000000000000e+01 +1.069145000000000012e+00 -3.640625381469726562e+01 +1.069150000000000045e+00 -3.646875000000000000e+01 +1.069155000000000078e+00 -3.640625381469726562e+01 +1.069160000000000110e+00 -3.650000000000000000e+01 +1.069165000000000143e+00 -3.653125000000000000e+01 +1.069170000000000176e+00 -3.643750000000000000e+01 +1.069174999999999986e+00 -3.646875000000000000e+01 +1.069180000000000019e+00 -3.646875000000000000e+01 +1.069185000000000052e+00 -3.653125000000000000e+01 +1.069190000000000085e+00 -3.650000000000000000e+01 +1.069195000000000118e+00 -3.640625381469726562e+01 +1.069200000000000150e+00 -3.650000000000000000e+01 +1.069205000000000183e+00 -3.643750000000000000e+01 +1.069209999999999994e+00 -3.646875000000000000e+01 +1.069215000000000027e+00 -3.646875000000000000e+01 +1.069220000000000059e+00 -3.650000000000000000e+01 +1.069225000000000092e+00 -3.640625381469726562e+01 +1.069230000000000125e+00 -3.653125000000000000e+01 +1.069235000000000158e+00 -3.650000000000000000e+01 +1.069240000000000190e+00 -3.650000000000000000e+01 +1.069245000000000001e+00 -3.646875000000000000e+01 +1.069250000000000034e+00 -3.646875000000000000e+01 +1.069255000000000067e+00 -3.643750000000000000e+01 +1.069260000000000099e+00 -3.640625381469726562e+01 +1.069265000000000132e+00 -3.646875000000000000e+01 +1.069270000000000165e+00 -3.640625381469726562e+01 +1.069275000000000198e+00 -3.646875000000000000e+01 +1.069280000000000008e+00 -3.643750000000000000e+01 +1.069285000000000041e+00 -3.643750000000000000e+01 +1.069290000000000074e+00 -3.643750000000000000e+01 +1.069295000000000107e+00 -3.646875000000000000e+01 +1.069300000000000139e+00 -3.650000000000000000e+01 +1.069305000000000172e+00 -3.646875000000000000e+01 +1.069309999999999983e+00 -3.643750000000000000e+01 +1.069315000000000015e+00 -3.637500000000000000e+01 +1.069320000000000048e+00 -3.646875000000000000e+01 +1.069325000000000081e+00 -3.646875000000000000e+01 +1.069330000000000114e+00 -3.640625381469726562e+01 +1.069335000000000147e+00 -3.643750000000000000e+01 +1.069340000000000179e+00 -3.646875000000000000e+01 +1.069344999999999990e+00 -3.643750000000000000e+01 +1.069350000000000023e+00 -3.650000000000000000e+01 +1.069355000000000055e+00 -3.650000000000000000e+01 +1.069360000000000088e+00 -3.643750000000000000e+01 +1.069365000000000121e+00 -3.643750000000000000e+01 +1.069370000000000154e+00 -3.643750000000000000e+01 +1.069375000000000187e+00 -3.643750000000000000e+01 +1.069379999999999997e+00 -3.646875000000000000e+01 +1.069385000000000030e+00 -3.640625381469726562e+01 +1.069390000000000063e+00 -3.643750000000000000e+01 +1.069395000000000095e+00 -3.646875000000000000e+01 +1.069400000000000128e+00 -3.643750000000000000e+01 +1.069405000000000161e+00 -3.646875000000000000e+01 +1.069410000000000194e+00 -3.643750000000000000e+01 +1.069415000000000004e+00 -3.646875000000000000e+01 +1.069420000000000037e+00 -3.640625381469726562e+01 +1.069425000000000070e+00 -3.646875000000000000e+01 +1.069430000000000103e+00 -3.640625381469726562e+01 +1.069435000000000136e+00 -3.643750000000000000e+01 +1.069440000000000168e+00 -3.643750000000000000e+01 +1.069444999999999979e+00 -3.643750000000000000e+01 +1.069450000000000012e+00 -3.640625381469726562e+01 +1.069455000000000044e+00 -3.637500000000000000e+01 +1.069460000000000077e+00 -3.637500000000000000e+01 +1.069465000000000110e+00 -3.637500000000000000e+01 +1.069470000000000143e+00 -3.640625381469726562e+01 +1.069475000000000176e+00 -3.640625381469726562e+01 +1.069479999999999986e+00 -3.643750000000000000e+01 +1.069485000000000019e+00 -3.640625381469726562e+01 +1.069490000000000052e+00 -3.640625381469726562e+01 +1.069495000000000084e+00 -3.643750000000000000e+01 +1.069500000000000117e+00 -3.637500000000000000e+01 +1.069505000000000150e+00 -3.640625381469726562e+01 +1.069510000000000183e+00 -3.637500000000000000e+01 +1.069514999999999993e+00 -3.640625381469726562e+01 +1.069520000000000026e+00 -3.640625381469726562e+01 +1.069525000000000059e+00 -3.634375000000000000e+01 +1.069530000000000092e+00 -3.637500000000000000e+01 +1.069535000000000124e+00 -3.637500000000000000e+01 +1.069540000000000157e+00 -3.643750000000000000e+01 +1.069545000000000190e+00 -3.640625381469726562e+01 +1.069550000000000001e+00 -3.640625381469726562e+01 +1.069555000000000033e+00 -3.640625381469726562e+01 +1.069560000000000066e+00 -3.634375000000000000e+01 +1.069565000000000099e+00 -3.634375000000000000e+01 +1.069570000000000132e+00 -3.634375000000000000e+01 +1.069575000000000164e+00 -3.634375000000000000e+01 +1.069580000000000197e+00 -3.643750000000000000e+01 +1.069585000000000008e+00 -3.640625381469726562e+01 +1.069590000000000041e+00 -3.628125000000000000e+01 +1.069595000000000073e+00 -3.643750000000000000e+01 +1.069600000000000106e+00 -3.643750000000000000e+01 +1.069605000000000139e+00 -3.637500000000000000e+01 +1.069610000000000172e+00 -3.640625381469726562e+01 +1.069614999999999982e+00 -3.640625381469726562e+01 +1.069620000000000015e+00 -3.640625381469726562e+01 +1.069625000000000048e+00 -3.634375000000000000e+01 +1.069630000000000081e+00 -3.646875000000000000e+01 +1.069635000000000113e+00 -3.640625381469726562e+01 +1.069640000000000146e+00 -3.637500000000000000e+01 +1.069645000000000179e+00 -3.634375000000000000e+01 +1.069649999999999990e+00 -3.631250000000000000e+01 +1.069655000000000022e+00 -3.634375000000000000e+01 +1.069660000000000055e+00 -3.637500000000000000e+01 +1.069665000000000088e+00 -3.637500000000000000e+01 +1.069670000000000121e+00 -3.640625381469726562e+01 +1.069675000000000153e+00 -3.637500000000000000e+01 +1.069680000000000186e+00 -3.640625381469726562e+01 +1.069684999999999997e+00 -3.643750000000000000e+01 +1.069690000000000030e+00 -3.640625381469726562e+01 +1.069695000000000062e+00 -3.643750000000000000e+01 +1.069700000000000095e+00 -3.631250000000000000e+01 +1.069705000000000128e+00 -3.637500000000000000e+01 +1.069710000000000161e+00 -3.637500000000000000e+01 +1.069715000000000193e+00 -3.640625381469726562e+01 +1.069720000000000004e+00 -3.637500000000000000e+01 +1.069725000000000037e+00 -3.634375000000000000e+01 +1.069730000000000070e+00 -3.640625381469726562e+01 +1.069735000000000102e+00 -3.637500000000000000e+01 +1.069740000000000135e+00 -3.637500000000000000e+01 +1.069745000000000168e+00 -3.637500000000000000e+01 +1.069749999999999979e+00 -3.634375000000000000e+01 +1.069755000000000011e+00 -3.634375000000000000e+01 +1.069760000000000044e+00 -3.637500000000000000e+01 +1.069765000000000077e+00 -3.634375000000000000e+01 +1.069770000000000110e+00 -3.643750000000000000e+01 +1.069775000000000142e+00 -3.634375000000000000e+01 +1.069780000000000175e+00 -3.628125000000000000e+01 +1.069784999999999986e+00 -3.628125000000000000e+01 +1.069790000000000019e+00 -3.631250000000000000e+01 +1.069795000000000051e+00 -3.634375000000000000e+01 +1.069800000000000084e+00 -3.631250000000000000e+01 +1.069805000000000117e+00 -3.625000000000000000e+01 +1.069810000000000150e+00 -3.631250000000000000e+01 +1.069815000000000182e+00 -3.628125000000000000e+01 +1.069819999999999993e+00 -3.621875000000000000e+01 +1.069825000000000026e+00 -3.625000000000000000e+01 +1.069830000000000059e+00 -3.631250000000000000e+01 +1.069835000000000091e+00 -3.634375000000000000e+01 +1.069840000000000124e+00 -3.625000000000000000e+01 +1.069845000000000157e+00 -3.628125000000000000e+01 +1.069850000000000190e+00 -3.631250000000000000e+01 +1.069855000000000000e+00 -3.634375000000000000e+01 +1.069860000000000033e+00 -3.628125000000000000e+01 +1.069865000000000066e+00 -3.628125000000000000e+01 +1.069870000000000099e+00 -3.631250000000000000e+01 +1.069875000000000131e+00 -3.631250000000000000e+01 +1.069880000000000164e+00 -3.625000000000000000e+01 +1.069885000000000197e+00 -3.628125000000000000e+01 +1.069890000000000008e+00 -3.634375000000000000e+01 +1.069895000000000040e+00 -3.631250000000000000e+01 +1.069900000000000073e+00 -3.631250000000000000e+01 +1.069905000000000106e+00 -3.634375000000000000e+01 +1.069910000000000139e+00 -3.628125000000000000e+01 +1.069915000000000171e+00 -3.628125000000000000e+01 +1.069919999999999982e+00 -3.631250000000000000e+01 +1.069925000000000015e+00 -3.634375000000000000e+01 +1.069930000000000048e+00 -3.628125000000000000e+01 +1.069935000000000080e+00 -3.634375000000000000e+01 +1.069940000000000113e+00 -3.631250000000000000e+01 +1.069945000000000146e+00 -3.631250000000000000e+01 +1.069950000000000179e+00 -3.625000000000000000e+01 +1.069954999999999989e+00 -3.634375000000000000e+01 +1.069960000000000022e+00 -3.631250000000000000e+01 +1.069965000000000055e+00 -3.631250000000000000e+01 +1.069970000000000088e+00 -3.625000000000000000e+01 +1.069975000000000120e+00 -3.628125000000000000e+01 +1.069980000000000153e+00 -3.634375000000000000e+01 +1.069985000000000186e+00 -3.628125000000000000e+01 +1.069989999999999997e+00 -3.634375000000000000e+01 +1.069995000000000029e+00 -3.621875000000000000e+01 +1.070000000000000062e+00 -3.634375000000000000e+01 +1.070005000000000095e+00 -3.625000000000000000e+01 +1.070010000000000128e+00 -3.631250000000000000e+01 +1.070015000000000160e+00 -3.625000000000000000e+01 +1.070020000000000193e+00 -3.628125000000000000e+01 +1.070025000000000004e+00 -3.631250000000000000e+01 +1.070030000000000037e+00 -3.634375000000000000e+01 +1.070035000000000069e+00 -3.634375000000000000e+01 +1.070040000000000102e+00 -3.634375000000000000e+01 +1.070045000000000135e+00 -3.634375000000000000e+01 +1.070050000000000168e+00 -3.628125000000000000e+01 +1.070054999999999978e+00 -3.625000000000000000e+01 +1.070060000000000011e+00 -3.628125000000000000e+01 +1.070065000000000044e+00 -3.631250000000000000e+01 +1.070070000000000077e+00 -3.628125000000000000e+01 +1.070075000000000109e+00 -3.625000000000000000e+01 +1.070080000000000142e+00 -3.628125000000000000e+01 +1.070085000000000175e+00 -3.621875000000000000e+01 +1.070089999999999986e+00 -3.634375000000000000e+01 +1.070095000000000018e+00 -3.628125000000000000e+01 +1.070100000000000051e+00 -3.628125000000000000e+01 +1.070105000000000084e+00 -3.631250000000000000e+01 +1.070110000000000117e+00 -3.625000000000000000e+01 +1.070115000000000149e+00 -3.628125000000000000e+01 +1.070120000000000182e+00 -3.628125000000000000e+01 +1.070124999999999993e+00 -3.628125000000000000e+01 +1.070130000000000026e+00 -3.618750000000000000e+01 +1.070135000000000058e+00 -3.625000000000000000e+01 +1.070140000000000091e+00 -3.625000000000000000e+01 +1.070145000000000124e+00 -3.625000000000000000e+01 +1.070150000000000157e+00 -3.628125000000000000e+01 +1.070155000000000189e+00 -3.631250000000000000e+01 +1.070160000000000000e+00 -3.625000000000000000e+01 +1.070165000000000033e+00 -3.628125000000000000e+01 +1.070170000000000066e+00 -3.628125000000000000e+01 +1.070175000000000098e+00 -3.631250000000000000e+01 +1.070180000000000131e+00 -3.628125000000000000e+01 +1.070185000000000164e+00 -3.625000000000000000e+01 +1.070190000000000197e+00 -3.628125000000000000e+01 +1.070195000000000007e+00 -3.625000000000000000e+01 +1.070200000000000040e+00 -3.628125000000000000e+01 +1.070205000000000073e+00 -3.628125000000000000e+01 +1.070210000000000106e+00 -3.625000000000000000e+01 +1.070215000000000138e+00 -3.625000000000000000e+01 +1.070220000000000171e+00 -3.628125000000000000e+01 +1.070224999999999982e+00 -3.628125000000000000e+01 +1.070230000000000015e+00 -3.625000000000000000e+01 +1.070235000000000047e+00 -3.628125000000000000e+01 +1.070240000000000080e+00 -3.631250000000000000e+01 +1.070245000000000113e+00 -3.628125000000000000e+01 +1.070250000000000146e+00 -3.621875000000000000e+01 +1.070255000000000178e+00 -3.628125000000000000e+01 +1.070259999999999989e+00 -3.621875000000000000e+01 +1.070265000000000022e+00 -3.625000000000000000e+01 +1.070270000000000055e+00 -3.628125000000000000e+01 +1.070275000000000087e+00 -3.621875000000000000e+01 +1.070280000000000120e+00 -3.628125000000000000e+01 +1.070285000000000153e+00 -3.625000000000000000e+01 +1.070290000000000186e+00 -3.625000000000000000e+01 +1.070294999999999996e+00 -3.621875000000000000e+01 +1.070300000000000029e+00 -3.625000000000000000e+01 +1.070305000000000062e+00 -3.621875000000000000e+01 +1.070310000000000095e+00 -3.621875000000000000e+01 +1.070315000000000127e+00 -3.625000000000000000e+01 +1.070320000000000160e+00 -3.621875000000000000e+01 +1.070325000000000193e+00 -3.618750000000000000e+01 +1.070330000000000004e+00 -3.621875000000000000e+01 +1.070335000000000036e+00 -3.621875000000000000e+01 +1.070340000000000069e+00 -3.615625381469726562e+01 +1.070345000000000102e+00 -3.621875000000000000e+01 +1.070350000000000135e+00 -3.615625381469726562e+01 +1.070355000000000167e+00 -3.615625381469726562e+01 +1.070359999999999978e+00 -3.615625381469726562e+01 +1.070365000000000011e+00 -3.615625381469726562e+01 +1.070370000000000044e+00 -3.615625381469726562e+01 +1.070375000000000076e+00 -3.615625381469726562e+01 +1.070380000000000109e+00 -3.621875000000000000e+01 +1.070385000000000142e+00 -3.612500000000000000e+01 +1.070390000000000175e+00 -3.615625381469726562e+01 +1.070394999999999985e+00 -3.615625381469726562e+01 +1.070400000000000018e+00 -3.612500000000000000e+01 +1.070405000000000051e+00 -3.621875000000000000e+01 +1.070410000000000084e+00 -3.618750000000000000e+01 +1.070415000000000116e+00 -3.618750000000000000e+01 +1.070420000000000149e+00 -3.615625381469726562e+01 +1.070425000000000182e+00 -3.621875000000000000e+01 +1.070429999999999993e+00 -3.618750000000000000e+01 +1.070435000000000025e+00 -3.615625381469726562e+01 +1.070440000000000058e+00 -3.615625381469726562e+01 +1.070445000000000091e+00 -3.618750000000000000e+01 +1.070450000000000124e+00 -3.615625381469726562e+01 +1.070455000000000156e+00 -3.612500000000000000e+01 +1.070460000000000189e+00 -3.618750000000000000e+01 +1.070465000000000000e+00 -3.615625381469726562e+01 +1.070470000000000033e+00 -3.618750000000000000e+01 +1.070475000000000065e+00 -3.621875000000000000e+01 +1.070480000000000098e+00 -3.615625381469726562e+01 +1.070485000000000131e+00 -3.621875000000000000e+01 +1.070490000000000164e+00 -3.621875000000000000e+01 +1.070495000000000196e+00 -3.621875000000000000e+01 +1.070500000000000007e+00 -3.621875000000000000e+01 +1.070505000000000040e+00 -3.625000000000000000e+01 +1.070510000000000073e+00 -3.618750000000000000e+01 +1.070515000000000105e+00 -3.612500000000000000e+01 +1.070520000000000138e+00 -3.615625381469726562e+01 +1.070525000000000171e+00 -3.618750000000000000e+01 +1.070529999999999982e+00 -3.612500000000000000e+01 +1.070535000000000014e+00 -3.615625381469726562e+01 +1.070540000000000047e+00 -3.618750000000000000e+01 +1.070545000000000080e+00 -3.615625381469726562e+01 +1.070550000000000113e+00 -3.612500000000000000e+01 +1.070555000000000145e+00 -3.615625381469726562e+01 +1.070560000000000178e+00 -3.615625381469726562e+01 +1.070564999999999989e+00 -3.612500000000000000e+01 +1.070570000000000022e+00 -3.606250000000000000e+01 +1.070575000000000054e+00 -3.612500000000000000e+01 +1.070580000000000087e+00 -3.621875000000000000e+01 +1.070585000000000120e+00 -3.612500000000000000e+01 +1.070590000000000153e+00 -3.609375000000000000e+01 +1.070595000000000185e+00 -3.609375000000000000e+01 +1.070599999999999996e+00 -3.612500000000000000e+01 +1.070605000000000029e+00 -3.612500000000000000e+01 +1.070610000000000062e+00 -3.621875000000000000e+01 +1.070615000000000094e+00 -3.609375000000000000e+01 +1.070620000000000127e+00 -3.615625381469726562e+01 +1.070625000000000160e+00 -3.609375000000000000e+01 +1.070630000000000193e+00 -3.615625381469726562e+01 +1.070635000000000003e+00 -3.615625381469726562e+01 +1.070640000000000036e+00 -3.606250000000000000e+01 +1.070645000000000069e+00 -3.612500000000000000e+01 +1.070650000000000102e+00 -3.612500000000000000e+01 +1.070655000000000134e+00 -3.609375000000000000e+01 +1.070660000000000167e+00 -3.612500000000000000e+01 +1.070664999999999978e+00 -3.615625381469726562e+01 +1.070670000000000011e+00 -3.609375000000000000e+01 +1.070675000000000043e+00 -3.612500000000000000e+01 +1.070680000000000076e+00 -3.603125000000000000e+01 +1.070685000000000109e+00 -3.615625381469726562e+01 +1.070690000000000142e+00 -3.612500000000000000e+01 +1.070695000000000174e+00 -3.609375000000000000e+01 +1.070699999999999985e+00 -3.609375000000000000e+01 +1.070705000000000018e+00 -3.606250000000000000e+01 +1.070710000000000051e+00 -3.615625381469726562e+01 +1.070715000000000083e+00 -3.612500000000000000e+01 +1.070720000000000116e+00 -3.615625381469726562e+01 +1.070725000000000149e+00 -3.618750000000000000e+01 +1.070730000000000182e+00 -3.609375000000000000e+01 +1.070734999999999992e+00 -3.606250000000000000e+01 +1.070740000000000025e+00 -3.615625381469726562e+01 +1.070745000000000058e+00 -3.615625381469726562e+01 +1.070750000000000091e+00 -3.609375000000000000e+01 +1.070755000000000123e+00 -3.612500000000000000e+01 +1.070760000000000156e+00 -3.606250000000000000e+01 +1.070765000000000189e+00 -3.606250000000000000e+01 +1.070770000000000000e+00 -3.609375000000000000e+01 +1.070775000000000032e+00 -3.609375000000000000e+01 +1.070780000000000065e+00 -3.609375000000000000e+01 +1.070785000000000098e+00 -3.615625381469726562e+01 +1.070790000000000131e+00 -3.603125000000000000e+01 +1.070795000000000163e+00 -3.612500000000000000e+01 +1.070800000000000196e+00 -3.606250000000000000e+01 +1.070805000000000007e+00 -3.603125000000000000e+01 +1.070810000000000040e+00 -3.606250000000000000e+01 +1.070815000000000072e+00 -3.606250000000000000e+01 +1.070820000000000105e+00 -3.609375000000000000e+01 +1.070825000000000138e+00 -3.606250000000000000e+01 +1.070830000000000171e+00 -3.615625381469726562e+01 +1.070834999999999981e+00 -3.606250000000000000e+01 +1.070840000000000014e+00 -3.609375000000000000e+01 +1.070845000000000047e+00 -3.612500000000000000e+01 +1.070850000000000080e+00 -3.603125000000000000e+01 +1.070855000000000112e+00 -3.603125000000000000e+01 +1.070860000000000145e+00 -3.606250000000000000e+01 +1.070865000000000178e+00 -3.606250000000000000e+01 +1.070869999999999989e+00 -3.606250000000000000e+01 +1.070875000000000021e+00 -3.603125000000000000e+01 +1.070880000000000054e+00 -3.606250000000000000e+01 +1.070885000000000087e+00 -3.603125000000000000e+01 +1.070890000000000120e+00 -3.603125000000000000e+01 +1.070895000000000152e+00 -3.603125000000000000e+01 +1.070900000000000185e+00 -3.603125000000000000e+01 +1.070904999999999996e+00 -3.603125000000000000e+01 +1.070910000000000029e+00 -3.606250000000000000e+01 +1.070915000000000061e+00 -3.606250000000000000e+01 +1.070920000000000094e+00 -3.600000381469726562e+01 +1.070925000000000127e+00 -3.603125000000000000e+01 +1.070930000000000160e+00 -3.600000381469726562e+01 +1.070935000000000192e+00 -3.603125000000000000e+01 +1.070940000000000003e+00 -3.603125000000000000e+01 +1.070945000000000036e+00 -3.603125000000000000e+01 +1.070950000000000069e+00 -3.596875000000000000e+01 +1.070955000000000101e+00 -3.600000381469726562e+01 +1.070960000000000134e+00 -3.596875000000000000e+01 +1.070965000000000167e+00 -3.600000381469726562e+01 +1.070969999999999978e+00 -3.606250000000000000e+01 +1.070975000000000010e+00 -3.600000381469726562e+01 +1.070980000000000043e+00 -3.593750000000000000e+01 +1.070985000000000076e+00 -3.596875000000000000e+01 +1.070990000000000109e+00 -3.593750000000000000e+01 +1.070995000000000141e+00 -3.596875000000000000e+01 +1.071000000000000174e+00 -3.600000381469726562e+01 +1.071004999999999985e+00 -3.596875000000000000e+01 +1.071010000000000018e+00 -3.593750000000000000e+01 +1.071015000000000050e+00 -3.596875000000000000e+01 +1.071020000000000083e+00 -3.596875000000000000e+01 +1.071025000000000116e+00 -3.600000381469726562e+01 +1.071030000000000149e+00 -3.603125000000000000e+01 +1.071035000000000181e+00 -3.603125000000000000e+01 +1.071039999999999992e+00 -3.603125000000000000e+01 +1.071045000000000025e+00 -3.593750000000000000e+01 +1.071050000000000058e+00 -3.603125000000000000e+01 +1.071055000000000090e+00 -3.593750000000000000e+01 +1.071060000000000123e+00 -3.600000381469726562e+01 +1.071065000000000156e+00 -3.603125000000000000e+01 +1.071070000000000189e+00 -3.596875000000000000e+01 +1.071074999999999999e+00 -3.600000381469726562e+01 +1.071080000000000032e+00 -3.603125000000000000e+01 +1.071085000000000065e+00 -3.603125000000000000e+01 +1.071090000000000098e+00 -3.603125000000000000e+01 +1.071095000000000130e+00 -3.603125000000000000e+01 +1.071100000000000163e+00 -3.603125000000000000e+01 +1.071105000000000196e+00 -3.596875000000000000e+01 +1.071110000000000007e+00 -3.596875000000000000e+01 +1.071115000000000039e+00 -3.596875000000000000e+01 +1.071120000000000072e+00 -3.603125000000000000e+01 +1.071125000000000105e+00 -3.603125000000000000e+01 +1.071130000000000138e+00 -3.603125000000000000e+01 +1.071135000000000170e+00 -3.596875000000000000e+01 +1.071139999999999981e+00 -3.603125000000000000e+01 +1.071145000000000014e+00 -3.603125000000000000e+01 +1.071150000000000047e+00 -3.606250000000000000e+01 +1.071155000000000079e+00 -3.603125000000000000e+01 +1.071160000000000112e+00 -3.603125000000000000e+01 +1.071165000000000145e+00 -3.596875000000000000e+01 +1.071170000000000178e+00 -3.596875000000000000e+01 +1.071174999999999988e+00 -3.603125000000000000e+01 +1.071180000000000021e+00 -3.600000381469726562e+01 +1.071185000000000054e+00 -3.603125000000000000e+01 +1.071190000000000087e+00 -3.603125000000000000e+01 +1.071195000000000119e+00 -3.596875000000000000e+01 +1.071200000000000152e+00 -3.603125000000000000e+01 +1.071205000000000185e+00 -3.596875000000000000e+01 +1.071209999999999996e+00 -3.596875000000000000e+01 +1.071215000000000028e+00 -3.593750000000000000e+01 +1.071220000000000061e+00 -3.593750000000000000e+01 +1.071225000000000094e+00 -3.596875000000000000e+01 +1.071230000000000127e+00 -3.593750000000000000e+01 +1.071235000000000159e+00 -3.596875000000000000e+01 +1.071240000000000192e+00 -3.596875000000000000e+01 +1.071245000000000003e+00 -3.593750000000000000e+01 +1.071250000000000036e+00 -3.590625000000000000e+01 +1.071255000000000068e+00 -3.603125000000000000e+01 +1.071260000000000101e+00 -3.593750000000000000e+01 +1.071265000000000134e+00 -3.596875000000000000e+01 +1.071270000000000167e+00 -3.600000381469726562e+01 +1.071274999999999977e+00 -3.593750000000000000e+01 +1.071280000000000010e+00 -3.593750000000000000e+01 +1.071285000000000043e+00 -3.596875000000000000e+01 +1.071290000000000076e+00 -3.603125000000000000e+01 +1.071295000000000108e+00 -3.593750000000000000e+01 +1.071300000000000141e+00 -3.593750000000000000e+01 +1.071305000000000174e+00 -3.593750000000000000e+01 +1.071309999999999985e+00 -3.590625000000000000e+01 +1.071315000000000017e+00 -3.587500000000000000e+01 +1.071320000000000050e+00 -3.587500000000000000e+01 +1.071325000000000083e+00 -3.590625000000000000e+01 +1.071330000000000116e+00 -3.593750000000000000e+01 +1.071335000000000148e+00 -3.593750000000000000e+01 +1.071340000000000181e+00 -3.590625000000000000e+01 +1.071344999999999992e+00 -3.587500000000000000e+01 +1.071350000000000025e+00 -3.587500000000000000e+01 +1.071355000000000057e+00 -3.590625000000000000e+01 +1.071360000000000090e+00 -3.584375381469726562e+01 +1.071365000000000123e+00 -3.590625000000000000e+01 +1.071370000000000156e+00 -3.587500000000000000e+01 +1.071375000000000188e+00 -3.590625000000000000e+01 +1.071379999999999999e+00 -3.590625000000000000e+01 +1.071385000000000032e+00 -3.590625000000000000e+01 +1.071390000000000065e+00 -3.593750000000000000e+01 +1.071395000000000097e+00 -3.590625000000000000e+01 +1.071400000000000130e+00 -3.590625000000000000e+01 +1.071405000000000163e+00 -3.590625000000000000e+01 +1.071410000000000196e+00 -3.593750000000000000e+01 +1.071415000000000006e+00 -3.593750000000000000e+01 +1.071420000000000039e+00 -3.590625000000000000e+01 +1.071425000000000072e+00 -3.596875000000000000e+01 +1.071430000000000105e+00 -3.593750000000000000e+01 +1.071435000000000137e+00 -3.590625000000000000e+01 +1.071440000000000170e+00 -3.590625000000000000e+01 +1.071444999999999981e+00 -3.593750000000000000e+01 +1.071450000000000014e+00 -3.590625000000000000e+01 +1.071455000000000046e+00 -3.593750000000000000e+01 +1.071460000000000079e+00 -3.593750000000000000e+01 +1.071465000000000112e+00 -3.590625000000000000e+01 +1.071470000000000145e+00 -3.587500000000000000e+01 +1.071475000000000177e+00 -3.590625000000000000e+01 +1.071479999999999988e+00 -3.584375381469726562e+01 +1.071485000000000021e+00 -3.587500000000000000e+01 +1.071490000000000054e+00 -3.584375381469726562e+01 +1.071495000000000086e+00 -3.590625000000000000e+01 +1.071500000000000119e+00 -3.590625000000000000e+01 +1.071505000000000152e+00 -3.587500000000000000e+01 +1.071510000000000185e+00 -3.584375381469726562e+01 +1.071514999999999995e+00 -3.590625000000000000e+01 +1.071520000000000028e+00 -3.590625000000000000e+01 +1.071525000000000061e+00 -3.593750000000000000e+01 +1.071530000000000094e+00 -3.590625000000000000e+01 +1.071535000000000126e+00 -3.587500000000000000e+01 +1.071540000000000159e+00 -3.590625000000000000e+01 +1.071545000000000192e+00 -3.590625000000000000e+01 +1.071550000000000002e+00 -3.590625000000000000e+01 +1.071555000000000035e+00 -3.590625000000000000e+01 +1.071560000000000068e+00 -3.587500000000000000e+01 +1.071565000000000101e+00 -3.581250000000000000e+01 +1.071570000000000134e+00 -3.587500000000000000e+01 +1.071575000000000166e+00 -3.587500000000000000e+01 +1.071579999999999977e+00 -3.587500000000000000e+01 +1.071585000000000010e+00 -3.581250000000000000e+01 +1.071590000000000042e+00 -3.587500000000000000e+01 +1.071595000000000075e+00 -3.584375381469726562e+01 +1.071600000000000108e+00 -3.581250000000000000e+01 +1.071605000000000141e+00 -3.584375381469726562e+01 +1.071610000000000174e+00 -3.587500000000000000e+01 +1.071614999999999984e+00 -3.581250000000000000e+01 +1.071620000000000017e+00 -3.584375381469726562e+01 +1.071625000000000050e+00 -3.584375381469726562e+01 +1.071630000000000082e+00 -3.584375381469726562e+01 +1.071635000000000115e+00 -3.590625000000000000e+01 +1.071640000000000148e+00 -3.584375381469726562e+01 +1.071645000000000181e+00 -3.581250000000000000e+01 +1.071649999999999991e+00 -3.590625000000000000e+01 +1.071655000000000024e+00 -3.584375381469726562e+01 +1.071660000000000057e+00 -3.587500000000000000e+01 +1.071665000000000090e+00 -3.587500000000000000e+01 +1.071670000000000122e+00 -3.590625000000000000e+01 +1.071675000000000155e+00 -3.587500000000000000e+01 +1.071680000000000188e+00 -3.584375381469726562e+01 +1.071684999999999999e+00 -3.581250000000000000e+01 +1.071690000000000031e+00 -3.584375381469726562e+01 +1.071695000000000064e+00 -3.578125000000000000e+01 +1.071700000000000097e+00 -3.587500000000000000e+01 +1.071705000000000130e+00 -3.587500000000000000e+01 +1.071710000000000163e+00 -3.584375381469726562e+01 +1.071715000000000195e+00 -3.581250000000000000e+01 +1.071720000000000006e+00 -3.584375381469726562e+01 +1.071725000000000039e+00 -3.584375381469726562e+01 +1.071730000000000071e+00 -3.578125000000000000e+01 +1.071735000000000104e+00 -3.578125000000000000e+01 +1.071740000000000137e+00 -3.578125000000000000e+01 +1.071745000000000170e+00 -3.578125000000000000e+01 +1.071749999999999980e+00 -3.578125000000000000e+01 +1.071755000000000013e+00 -3.584375381469726562e+01 +1.071760000000000046e+00 -3.584375381469726562e+01 +1.071765000000000079e+00 -3.578125000000000000e+01 +1.071770000000000111e+00 -3.578125000000000000e+01 +1.071775000000000144e+00 -3.578125000000000000e+01 +1.071780000000000177e+00 -3.581250000000000000e+01 +1.071784999999999988e+00 -3.578125000000000000e+01 +1.071790000000000020e+00 -3.578125000000000000e+01 +1.071795000000000053e+00 -3.571875000000000000e+01 +1.071800000000000086e+00 -3.581250000000000000e+01 +1.071805000000000119e+00 -3.571875000000000000e+01 +1.071810000000000151e+00 -3.575000000000000000e+01 +1.071815000000000184e+00 -3.578125000000000000e+01 +1.071819999999999995e+00 -3.578125000000000000e+01 +1.071825000000000028e+00 -3.584375381469726562e+01 +1.071830000000000060e+00 -3.581250000000000000e+01 +1.071835000000000093e+00 -3.581250000000000000e+01 +1.071840000000000126e+00 -3.575000000000000000e+01 +1.071845000000000159e+00 -3.578125000000000000e+01 +1.071850000000000191e+00 -3.578125000000000000e+01 +1.071855000000000002e+00 -3.578125000000000000e+01 +1.071860000000000035e+00 -3.581250000000000000e+01 +1.071865000000000068e+00 -3.575000000000000000e+01 +1.071870000000000100e+00 -3.581250000000000000e+01 +1.071875000000000133e+00 -3.568750381469726562e+01 +1.071880000000000166e+00 -3.578125000000000000e+01 +1.071884999999999977e+00 -3.575000000000000000e+01 +1.071890000000000009e+00 -3.575000000000000000e+01 +1.071895000000000042e+00 -3.581250000000000000e+01 +1.071900000000000075e+00 -3.568750381469726562e+01 +1.071905000000000108e+00 -3.571875000000000000e+01 +1.071910000000000140e+00 -3.578125000000000000e+01 +1.071915000000000173e+00 -3.578125000000000000e+01 +1.071919999999999984e+00 -3.575000000000000000e+01 +1.071925000000000017e+00 -3.584375381469726562e+01 +1.071930000000000049e+00 -3.575000000000000000e+01 +1.071935000000000082e+00 -3.571875000000000000e+01 +1.071940000000000115e+00 -3.575000000000000000e+01 +1.071945000000000148e+00 -3.578125000000000000e+01 +1.071950000000000180e+00 -3.575000000000000000e+01 +1.071954999999999991e+00 -3.571875000000000000e+01 +1.071960000000000024e+00 -3.571875000000000000e+01 +1.071965000000000057e+00 -3.575000000000000000e+01 +1.071970000000000089e+00 -3.581250000000000000e+01 +1.071975000000000122e+00 -3.578125000000000000e+01 +1.071980000000000155e+00 -3.571875000000000000e+01 +1.071985000000000188e+00 -3.571875000000000000e+01 +1.071989999999999998e+00 -3.578125000000000000e+01 +1.071995000000000031e+00 -3.578125000000000000e+01 +1.072000000000000064e+00 -3.571875000000000000e+01 +1.072005000000000097e+00 -3.578125000000000000e+01 +1.072010000000000129e+00 -3.575000000000000000e+01 +1.072015000000000162e+00 -3.571875000000000000e+01 +1.072020000000000195e+00 -3.581250000000000000e+01 +1.072025000000000006e+00 -3.578125000000000000e+01 +1.072030000000000038e+00 -3.581250000000000000e+01 +1.072035000000000071e+00 -3.578125000000000000e+01 +1.072040000000000104e+00 -3.571875000000000000e+01 +1.072045000000000137e+00 -3.575000000000000000e+01 +1.072050000000000169e+00 -3.575000000000000000e+01 +1.072054999999999980e+00 -3.571875000000000000e+01 +1.072060000000000013e+00 -3.571875000000000000e+01 +1.072065000000000046e+00 -3.568750381469726562e+01 +1.072070000000000078e+00 -3.568750381469726562e+01 +1.072075000000000111e+00 -3.571875000000000000e+01 +1.072080000000000144e+00 -3.575000000000000000e+01 +1.072085000000000177e+00 -3.565625000000000000e+01 +1.072089999999999987e+00 -3.565625000000000000e+01 +1.072095000000000020e+00 -3.571875000000000000e+01 +1.072100000000000053e+00 -3.571875000000000000e+01 +1.072105000000000086e+00 -3.575000000000000000e+01 +1.072110000000000118e+00 -3.571875000000000000e+01 +1.072115000000000151e+00 -3.571875000000000000e+01 +1.072120000000000184e+00 -3.571875000000000000e+01 +1.072124999999999995e+00 -3.565625000000000000e+01 +1.072130000000000027e+00 -3.575000000000000000e+01 +1.072135000000000060e+00 -3.565625000000000000e+01 +1.072140000000000093e+00 -3.575000000000000000e+01 +1.072145000000000126e+00 -3.575000000000000000e+01 +1.072150000000000158e+00 -3.571875000000000000e+01 +1.072155000000000191e+00 -3.571875000000000000e+01 +1.072160000000000002e+00 -3.568750381469726562e+01 +1.072165000000000035e+00 -3.568750381469726562e+01 +1.072170000000000067e+00 -3.568750381469726562e+01 +1.072175000000000100e+00 -3.578125000000000000e+01 +1.072180000000000133e+00 -3.568750381469726562e+01 +1.072185000000000166e+00 -3.575000000000000000e+01 +1.072190000000000198e+00 -3.571875000000000000e+01 +1.072195000000000009e+00 -3.571875000000000000e+01 +1.072200000000000042e+00 -3.575000000000000000e+01 +1.072205000000000075e+00 -3.571875000000000000e+01 +1.072210000000000107e+00 -3.575000000000000000e+01 +1.072215000000000140e+00 -3.571875000000000000e+01 +1.072220000000000173e+00 -3.568750381469726562e+01 +1.072224999999999984e+00 -3.575000000000000000e+01 +1.072230000000000016e+00 -3.565625000000000000e+01 +1.072235000000000049e+00 -3.568750381469726562e+01 +1.072240000000000082e+00 -3.565625000000000000e+01 +1.072245000000000115e+00 -3.568750381469726562e+01 +1.072250000000000147e+00 -3.565625000000000000e+01 +1.072255000000000180e+00 -3.562500000000000000e+01 +1.072259999999999991e+00 -3.562500000000000000e+01 +1.072265000000000024e+00 -3.565625000000000000e+01 +1.072270000000000056e+00 -3.568750381469726562e+01 +1.072275000000000089e+00 -3.562500000000000000e+01 +1.072280000000000122e+00 -3.562500000000000000e+01 +1.072285000000000155e+00 -3.568750381469726562e+01 +1.072290000000000187e+00 -3.568750381469726562e+01 +1.072294999999999998e+00 -3.565625000000000000e+01 +1.072300000000000031e+00 -3.565625000000000000e+01 +1.072305000000000064e+00 -3.565625000000000000e+01 +1.072310000000000096e+00 -3.562500000000000000e+01 +1.072315000000000129e+00 -3.571875000000000000e+01 +1.072320000000000162e+00 -3.556250000000000000e+01 +1.072325000000000195e+00 -3.562500000000000000e+01 +1.072330000000000005e+00 -3.565625000000000000e+01 +1.072335000000000038e+00 -3.565625000000000000e+01 +1.072340000000000071e+00 -3.565625000000000000e+01 +1.072345000000000104e+00 -3.565625000000000000e+01 +1.072350000000000136e+00 -3.568750381469726562e+01 +1.072355000000000169e+00 -3.562500000000000000e+01 +1.072359999999999980e+00 -3.559375000000000000e+01 +1.072365000000000013e+00 -3.556250000000000000e+01 +1.072370000000000045e+00 -3.565625000000000000e+01 +1.072375000000000078e+00 -3.565625000000000000e+01 +1.072380000000000111e+00 -3.562500000000000000e+01 +1.072385000000000144e+00 -3.559375000000000000e+01 +1.072390000000000176e+00 -3.562500000000000000e+01 +1.072394999999999987e+00 -3.562500000000000000e+01 +1.072400000000000020e+00 -3.562500000000000000e+01 +1.072405000000000053e+00 -3.562500000000000000e+01 +1.072410000000000085e+00 -3.559375000000000000e+01 +1.072415000000000118e+00 -3.556250000000000000e+01 +1.072420000000000151e+00 -3.556250000000000000e+01 +1.072425000000000184e+00 -3.562500000000000000e+01 +1.072429999999999994e+00 -3.565625000000000000e+01 +1.072435000000000027e+00 -3.562500000000000000e+01 +1.072440000000000060e+00 -3.553125381469726562e+01 +1.072445000000000093e+00 -3.562500000000000000e+01 +1.072450000000000125e+00 -3.556250000000000000e+01 +1.072455000000000158e+00 -3.556250000000000000e+01 +1.072460000000000191e+00 -3.559375000000000000e+01 +1.072465000000000002e+00 -3.559375000000000000e+01 +1.072470000000000034e+00 -3.562500000000000000e+01 +1.072475000000000067e+00 -3.565625000000000000e+01 +1.072480000000000100e+00 -3.556250000000000000e+01 +1.072485000000000133e+00 -3.556250000000000000e+01 +1.072490000000000165e+00 -3.556250000000000000e+01 +1.072495000000000198e+00 -3.556250000000000000e+01 +1.072500000000000009e+00 -3.559375000000000000e+01 +1.072505000000000042e+00 -3.559375000000000000e+01 +1.072510000000000074e+00 -3.559375000000000000e+01 +1.072515000000000107e+00 -3.556250000000000000e+01 +1.072520000000000140e+00 -3.556250000000000000e+01 +1.072525000000000173e+00 -3.553125381469726562e+01 +1.072529999999999983e+00 -3.553125381469726562e+01 +1.072535000000000016e+00 -3.556250000000000000e+01 +1.072540000000000049e+00 -3.559375000000000000e+01 +1.072545000000000082e+00 -3.556250000000000000e+01 +1.072550000000000114e+00 -3.556250000000000000e+01 +1.072555000000000147e+00 -3.546875000000000000e+01 +1.072560000000000180e+00 -3.556250000000000000e+01 +1.072564999999999991e+00 -3.556250000000000000e+01 +1.072570000000000023e+00 -3.550000000000000000e+01 +1.072575000000000056e+00 -3.546875000000000000e+01 +1.072580000000000089e+00 -3.550000000000000000e+01 +1.072585000000000122e+00 -3.546875000000000000e+01 +1.072590000000000154e+00 -3.553125381469726562e+01 +1.072595000000000187e+00 -3.550000000000000000e+01 +1.072599999999999998e+00 -3.550000000000000000e+01 +1.072605000000000031e+00 -3.550000000000000000e+01 +1.072610000000000063e+00 -3.546875000000000000e+01 +1.072615000000000096e+00 -3.550000000000000000e+01 +1.072620000000000129e+00 -3.543750381469726562e+01 +1.072625000000000162e+00 -3.546875000000000000e+01 +1.072630000000000194e+00 -3.550000000000000000e+01 +1.072635000000000005e+00 -3.550000000000000000e+01 +1.072640000000000038e+00 -3.550000000000000000e+01 +1.072645000000000071e+00 -3.550000000000000000e+01 +1.072650000000000103e+00 -3.553125381469726562e+01 +1.072655000000000136e+00 -3.553125381469726562e+01 +1.072660000000000169e+00 -3.550000000000000000e+01 +1.072664999999999980e+00 -3.546875000000000000e+01 +1.072670000000000012e+00 -3.553125381469726562e+01 +1.072675000000000045e+00 -3.553125381469726562e+01 +1.072680000000000078e+00 -3.550000000000000000e+01 +1.072685000000000111e+00 -3.553125381469726562e+01 +1.072690000000000143e+00 -3.546875000000000000e+01 +1.072695000000000176e+00 -3.550000000000000000e+01 +1.072699999999999987e+00 -3.550000000000000000e+01 +1.072705000000000020e+00 -3.553125381469726562e+01 +1.072710000000000052e+00 -3.553125381469726562e+01 +1.072715000000000085e+00 -3.546875000000000000e+01 +1.072720000000000118e+00 -3.556250000000000000e+01 +1.072725000000000151e+00 -3.553125381469726562e+01 +1.072730000000000183e+00 -3.553125381469726562e+01 +1.072734999999999994e+00 -3.553125381469726562e+01 +1.072740000000000027e+00 -3.550000000000000000e+01 +1.072745000000000060e+00 -3.546875000000000000e+01 +1.072750000000000092e+00 -3.550000000000000000e+01 +1.072755000000000125e+00 -3.546875000000000000e+01 +1.072760000000000158e+00 -3.550000000000000000e+01 +1.072765000000000191e+00 -3.550000000000000000e+01 +1.072770000000000001e+00 -3.546875000000000000e+01 +1.072775000000000034e+00 -3.556250000000000000e+01 +1.072780000000000067e+00 -3.550000000000000000e+01 +1.072785000000000100e+00 -3.550000000000000000e+01 +1.072790000000000132e+00 -3.546875000000000000e+01 +1.072795000000000165e+00 -3.550000000000000000e+01 +1.072800000000000198e+00 -3.543750381469726562e+01 +1.072805000000000009e+00 -3.546875000000000000e+01 +1.072810000000000041e+00 -3.546875000000000000e+01 +1.072815000000000074e+00 -3.546875000000000000e+01 +1.072820000000000107e+00 -3.543750381469726562e+01 +1.072825000000000140e+00 -3.543750381469726562e+01 +1.072830000000000172e+00 -3.546875000000000000e+01 +1.072834999999999983e+00 -3.540625000000000000e+01 +1.072840000000000016e+00 -3.540625000000000000e+01 +1.072845000000000049e+00 -3.537500000000000000e+01 +1.072850000000000081e+00 -3.546875000000000000e+01 +1.072855000000000114e+00 -3.543750381469726562e+01 +1.072860000000000147e+00 -3.540625000000000000e+01 +1.072865000000000180e+00 -3.540625000000000000e+01 +1.072869999999999990e+00 -3.537500000000000000e+01 +1.072875000000000023e+00 -3.543750381469726562e+01 +1.072880000000000056e+00 -3.543750381469726562e+01 +1.072885000000000089e+00 -3.540625000000000000e+01 +1.072890000000000121e+00 -3.546875000000000000e+01 +1.072895000000000154e+00 -3.543750381469726562e+01 +1.072900000000000187e+00 -3.543750381469726562e+01 +1.072904999999999998e+00 -3.540625000000000000e+01 +1.072910000000000030e+00 -3.546875000000000000e+01 +1.072915000000000063e+00 -3.543750381469726562e+01 +1.072920000000000096e+00 -3.546875000000000000e+01 +1.072925000000000129e+00 -3.540625000000000000e+01 +1.072930000000000161e+00 -3.546875000000000000e+01 +1.072935000000000194e+00 -3.540625000000000000e+01 +1.072940000000000005e+00 -3.550000000000000000e+01 +1.072945000000000038e+00 -3.546875000000000000e+01 +1.072950000000000070e+00 -3.537500000000000000e+01 +1.072955000000000103e+00 -3.543750381469726562e+01 +1.072960000000000136e+00 -3.543750381469726562e+01 +1.072965000000000169e+00 -3.543750381469726562e+01 +1.072969999999999979e+00 -3.540625000000000000e+01 +1.072975000000000012e+00 -3.537500000000000000e+01 +1.072980000000000045e+00 -3.537500000000000000e+01 +1.072985000000000078e+00 -3.534375000000000000e+01 +1.072990000000000110e+00 -3.540625000000000000e+01 +1.072995000000000143e+00 -3.531250000000000000e+01 +1.073000000000000176e+00 -3.534375000000000000e+01 +1.073004999999999987e+00 -3.534375000000000000e+01 +1.073010000000000019e+00 -3.531250000000000000e+01 +1.073015000000000052e+00 -3.537500000000000000e+01 +1.073020000000000085e+00 -3.528125381469726562e+01 +1.073025000000000118e+00 -3.531250000000000000e+01 +1.073030000000000150e+00 -3.537500000000000000e+01 +1.073035000000000183e+00 -3.540625000000000000e+01 +1.073039999999999994e+00 -3.540625000000000000e+01 +1.073045000000000027e+00 -3.540625000000000000e+01 +1.073050000000000059e+00 -3.537500000000000000e+01 +1.073055000000000092e+00 -3.534375000000000000e+01 +1.073060000000000125e+00 -3.537500000000000000e+01 +1.073065000000000158e+00 -3.531250000000000000e+01 +1.073070000000000190e+00 -3.534375000000000000e+01 +1.073075000000000001e+00 -3.534375000000000000e+01 +1.073080000000000034e+00 -3.525000000000000000e+01 +1.073085000000000067e+00 -3.534375000000000000e+01 +1.073090000000000099e+00 -3.531250000000000000e+01 +1.073095000000000132e+00 -3.537500000000000000e+01 +1.073100000000000165e+00 -3.534375000000000000e+01 +1.073105000000000198e+00 -3.537500000000000000e+01 +1.073110000000000008e+00 -3.531250000000000000e+01 +1.073115000000000041e+00 -3.531250000000000000e+01 +1.073120000000000074e+00 -3.537500000000000000e+01 +1.073125000000000107e+00 -3.540625000000000000e+01 +1.073130000000000139e+00 -3.543750381469726562e+01 +1.073135000000000172e+00 -3.531250000000000000e+01 +1.073139999999999983e+00 -3.537500000000000000e+01 +1.073145000000000016e+00 -3.534375000000000000e+01 +1.073150000000000048e+00 -3.531250000000000000e+01 +1.073155000000000081e+00 -3.531250000000000000e+01 +1.073160000000000114e+00 -3.540625000000000000e+01 +1.073165000000000147e+00 -3.531250000000000000e+01 +1.073170000000000179e+00 -3.525000000000000000e+01 +1.073174999999999990e+00 -3.534375000000000000e+01 +1.073180000000000023e+00 -3.525000000000000000e+01 +1.073185000000000056e+00 -3.534375000000000000e+01 +1.073190000000000088e+00 -3.528125381469726562e+01 +1.073195000000000121e+00 -3.531250000000000000e+01 +1.073200000000000154e+00 -3.531250000000000000e+01 +1.073205000000000187e+00 -3.528125381469726562e+01 +1.073209999999999997e+00 -3.534375000000000000e+01 +1.073215000000000030e+00 -3.528125381469726562e+01 +1.073220000000000063e+00 -3.531250000000000000e+01 +1.073225000000000096e+00 -3.534375000000000000e+01 +1.073230000000000128e+00 -3.531250000000000000e+01 +1.073235000000000161e+00 -3.528125381469726562e+01 +1.073240000000000194e+00 -3.531250000000000000e+01 +1.073245000000000005e+00 -3.534375000000000000e+01 +1.073250000000000037e+00 -3.528125381469726562e+01 +1.073255000000000070e+00 -3.531250000000000000e+01 +1.073260000000000103e+00 -3.528125381469726562e+01 +1.073265000000000136e+00 -3.528125381469726562e+01 +1.073270000000000168e+00 -3.525000000000000000e+01 +1.073274999999999979e+00 -3.531250000000000000e+01 +1.073280000000000012e+00 -3.528125381469726562e+01 +1.073285000000000045e+00 -3.528125381469726562e+01 +1.073290000000000077e+00 -3.528125381469726562e+01 +1.073295000000000110e+00 -3.528125381469726562e+01 +1.073300000000000143e+00 -3.528125381469726562e+01 +1.073305000000000176e+00 -3.531250000000000000e+01 +1.073309999999999986e+00 -3.528125381469726562e+01 +1.073315000000000019e+00 -3.531250000000000000e+01 +1.073320000000000052e+00 -3.531250000000000000e+01 +1.073325000000000085e+00 -3.534375000000000000e+01 +1.073330000000000117e+00 -3.528125381469726562e+01 +1.073335000000000150e+00 -3.534375000000000000e+01 +1.073340000000000183e+00 -3.534375000000000000e+01 +1.073344999999999994e+00 -3.531250000000000000e+01 +1.073350000000000026e+00 -3.534375000000000000e+01 +1.073355000000000059e+00 -3.537500000000000000e+01 +1.073360000000000092e+00 -3.534375000000000000e+01 +1.073365000000000125e+00 -3.534375000000000000e+01 +1.073370000000000157e+00 -3.543750381469726562e+01 +1.073375000000000190e+00 -3.534375000000000000e+01 +1.073380000000000001e+00 -3.531250000000000000e+01 +1.073385000000000034e+00 -3.537500000000000000e+01 +1.073390000000000066e+00 -3.543750381469726562e+01 +1.073395000000000099e+00 -3.534375000000000000e+01 +1.073400000000000132e+00 -3.531250000000000000e+01 +1.073405000000000165e+00 -3.540625000000000000e+01 +1.073410000000000197e+00 -3.540625000000000000e+01 +1.073415000000000008e+00 -3.534375000000000000e+01 +1.073420000000000041e+00 -3.534375000000000000e+01 +1.073425000000000074e+00 -3.534375000000000000e+01 +1.073430000000000106e+00 -3.531250000000000000e+01 +1.073435000000000139e+00 -3.540625000000000000e+01 +1.073440000000000172e+00 -3.534375000000000000e+01 +1.073444999999999983e+00 -3.531250000000000000e+01 +1.073450000000000015e+00 -3.531250000000000000e+01 +1.073455000000000048e+00 -3.531250000000000000e+01 +1.073460000000000081e+00 -3.534375000000000000e+01 +1.073465000000000114e+00 -3.531250000000000000e+01 +1.073470000000000146e+00 -3.534375000000000000e+01 +1.073475000000000179e+00 -3.528125381469726562e+01 +1.073479999999999990e+00 -3.531250000000000000e+01 +1.073485000000000023e+00 -3.528125381469726562e+01 +1.073490000000000055e+00 -3.528125381469726562e+01 +1.073495000000000088e+00 -3.537500000000000000e+01 +1.073500000000000121e+00 -3.525000000000000000e+01 +1.073505000000000154e+00 -3.531250000000000000e+01 +1.073510000000000186e+00 -3.534375000000000000e+01 +1.073514999999999997e+00 -3.534375000000000000e+01 +1.073520000000000030e+00 -3.531250000000000000e+01 +1.073525000000000063e+00 -3.534375000000000000e+01 +1.073530000000000095e+00 -3.537500000000000000e+01 +1.073535000000000128e+00 -3.534375000000000000e+01 +1.073540000000000161e+00 -3.531250000000000000e+01 +1.073545000000000194e+00 -3.531250000000000000e+01 +1.073550000000000004e+00 -3.534375000000000000e+01 +1.073555000000000037e+00 -3.528125381469726562e+01 +1.073560000000000070e+00 -3.528125381469726562e+01 +1.073565000000000103e+00 -3.525000000000000000e+01 +1.073570000000000135e+00 -3.531250000000000000e+01 +1.073575000000000168e+00 -3.534375000000000000e+01 +1.073579999999999979e+00 -3.534375000000000000e+01 +1.073585000000000012e+00 -3.528125381469726562e+01 +1.073590000000000044e+00 -3.537500000000000000e+01 +1.073595000000000077e+00 -3.534375000000000000e+01 +1.073600000000000110e+00 -3.531250000000000000e+01 +1.073605000000000143e+00 -3.537500000000000000e+01 +1.073610000000000175e+00 -3.528125381469726562e+01 +1.073614999999999986e+00 -3.531250000000000000e+01 +1.073620000000000019e+00 -3.534375000000000000e+01 +1.073625000000000052e+00 -3.534375000000000000e+01 +1.073630000000000084e+00 -3.531250000000000000e+01 +1.073635000000000117e+00 -3.531250000000000000e+01 +1.073640000000000150e+00 -3.528125381469726562e+01 +1.073645000000000183e+00 -3.528125381469726562e+01 +1.073649999999999993e+00 -3.534375000000000000e+01 +1.073655000000000026e+00 -3.537500000000000000e+01 +1.073660000000000059e+00 -3.528125381469726562e+01 +1.073665000000000092e+00 -3.528125381469726562e+01 +1.073670000000000124e+00 -3.531250000000000000e+01 +1.073675000000000157e+00 -3.531250000000000000e+01 +1.073680000000000190e+00 -3.531250000000000000e+01 +1.073685000000000000e+00 -3.528125381469726562e+01 +1.073690000000000033e+00 -3.531250000000000000e+01 +1.073695000000000066e+00 -3.531250000000000000e+01 +1.073700000000000099e+00 -3.528125381469726562e+01 +1.073705000000000132e+00 -3.528125381469726562e+01 +1.073710000000000164e+00 -3.528125381469726562e+01 +1.073715000000000197e+00 -3.531250000000000000e+01 +1.073720000000000008e+00 -3.528125381469726562e+01 +1.073725000000000041e+00 -3.528125381469726562e+01 +1.073730000000000073e+00 -3.525000000000000000e+01 +1.073735000000000106e+00 -3.528125381469726562e+01 +1.073740000000000139e+00 -3.525000000000000000e+01 +1.073745000000000172e+00 -3.525000000000000000e+01 +1.073749999999999982e+00 -3.525000000000000000e+01 +1.073755000000000015e+00 -3.521875000000000000e+01 +1.073760000000000048e+00 -3.518750000000000000e+01 +1.073765000000000081e+00 -3.515625000000000000e+01 +1.073770000000000113e+00 -3.521875000000000000e+01 +1.073775000000000146e+00 -3.521875000000000000e+01 +1.073780000000000179e+00 -3.518750000000000000e+01 +1.073784999999999989e+00 -3.515625000000000000e+01 +1.073790000000000022e+00 -3.518750000000000000e+01 +1.073795000000000055e+00 -3.521875000000000000e+01 +1.073800000000000088e+00 -3.518750000000000000e+01 +1.073805000000000121e+00 -3.512500381469726562e+01 +1.073810000000000153e+00 -3.518750000000000000e+01 +1.073815000000000186e+00 -3.515625000000000000e+01 +1.073819999999999997e+00 -3.518750000000000000e+01 +1.073825000000000029e+00 -3.518750000000000000e+01 +1.073830000000000062e+00 -3.521875000000000000e+01 +1.073835000000000095e+00 -3.515625000000000000e+01 +1.073840000000000128e+00 -3.518750000000000000e+01 +1.073845000000000161e+00 -3.521875000000000000e+01 +1.073850000000000193e+00 -3.518750000000000000e+01 +1.073855000000000004e+00 -3.518750000000000000e+01 +1.073860000000000037e+00 -3.512500381469726562e+01 +1.073865000000000069e+00 -3.515625000000000000e+01 +1.073870000000000102e+00 -3.518750000000000000e+01 +1.073875000000000135e+00 -3.518750000000000000e+01 +1.073880000000000168e+00 -3.518750000000000000e+01 +1.073884999999999978e+00 -3.515625000000000000e+01 +1.073890000000000011e+00 -3.512500381469726562e+01 +1.073895000000000044e+00 -3.509375000000000000e+01 +1.073900000000000077e+00 -3.518750000000000000e+01 +1.073905000000000109e+00 -3.506250000000000000e+01 +1.073910000000000142e+00 -3.515625000000000000e+01 +1.073915000000000175e+00 -3.512500381469726562e+01 +1.073919999999999986e+00 -3.515625000000000000e+01 +1.073925000000000018e+00 -3.515625000000000000e+01 +1.073930000000000051e+00 -3.515625000000000000e+01 +1.073935000000000084e+00 -3.512500381469726562e+01 +1.073940000000000117e+00 -3.515625000000000000e+01 +1.073945000000000149e+00 -3.509375000000000000e+01 +1.073950000000000182e+00 -3.503125000000000000e+01 +1.073954999999999993e+00 -3.515625000000000000e+01 +1.073960000000000026e+00 -3.518750000000000000e+01 +1.073965000000000058e+00 -3.509375000000000000e+01 +1.073970000000000091e+00 -3.512500381469726562e+01 +1.073975000000000124e+00 -3.512500381469726562e+01 +1.073980000000000157e+00 -3.506250000000000000e+01 +1.073985000000000190e+00 -3.509375000000000000e+01 +1.073990000000000000e+00 -3.509375000000000000e+01 +1.073995000000000033e+00 -3.509375000000000000e+01 +1.074000000000000066e+00 -3.515625000000000000e+01 +1.074005000000000098e+00 -3.512500381469726562e+01 +1.074010000000000131e+00 -3.509375000000000000e+01 +1.074015000000000164e+00 -3.509375000000000000e+01 +1.074020000000000197e+00 -3.509375000000000000e+01 +1.074025000000000007e+00 -3.509375000000000000e+01 +1.074030000000000040e+00 -3.506250000000000000e+01 +1.074035000000000073e+00 -3.512500381469726562e+01 +1.074040000000000106e+00 -3.506250000000000000e+01 +1.074045000000000138e+00 -3.503125000000000000e+01 +1.074050000000000171e+00 -3.509375000000000000e+01 +1.074054999999999982e+00 -3.509375000000000000e+01 +1.074060000000000015e+00 -3.506250000000000000e+01 +1.074065000000000047e+00 -3.509375000000000000e+01 +1.074070000000000080e+00 -3.500000000000000000e+01 +1.074075000000000113e+00 -3.509375000000000000e+01 +1.074080000000000146e+00 -3.506250000000000000e+01 +1.074085000000000178e+00 -3.512500381469726562e+01 +1.074089999999999989e+00 -3.509375000000000000e+01 +1.074095000000000022e+00 -3.506250000000000000e+01 +1.074100000000000055e+00 -3.509375000000000000e+01 +1.074105000000000087e+00 -3.506250000000000000e+01 +1.074110000000000120e+00 -3.515625000000000000e+01 +1.074115000000000153e+00 -3.506250000000000000e+01 +1.074120000000000186e+00 -3.506250000000000000e+01 +1.074124999999999996e+00 -3.503125000000000000e+01 +1.074130000000000029e+00 -3.506250000000000000e+01 +1.074135000000000062e+00 -3.506250000000000000e+01 +1.074140000000000095e+00 -3.503125000000000000e+01 +1.074145000000000127e+00 -3.509375000000000000e+01 +1.074150000000000160e+00 -3.500000000000000000e+01 +1.074155000000000193e+00 -3.509375000000000000e+01 +1.074160000000000004e+00 -3.503125000000000000e+01 +1.074165000000000036e+00 -3.500000000000000000e+01 +1.074170000000000069e+00 -3.503125000000000000e+01 +1.074175000000000102e+00 -3.509375000000000000e+01 +1.074180000000000135e+00 -3.503125000000000000e+01 +1.074185000000000167e+00 -3.500000000000000000e+01 +1.074189999999999978e+00 -3.503125000000000000e+01 +1.074195000000000011e+00 -3.500000000000000000e+01 +1.074200000000000044e+00 -3.503125000000000000e+01 +1.074205000000000076e+00 -3.506250000000000000e+01 +1.074210000000000109e+00 -3.500000000000000000e+01 +1.074215000000000142e+00 -3.506250000000000000e+01 +1.074220000000000175e+00 -3.500000000000000000e+01 +1.074224999999999985e+00 -3.496875381469726562e+01 +1.074230000000000018e+00 -3.503125000000000000e+01 +1.074235000000000051e+00 -3.503125000000000000e+01 +1.074240000000000084e+00 -3.500000000000000000e+01 +1.074245000000000116e+00 -3.500000000000000000e+01 +1.074250000000000149e+00 -3.500000000000000000e+01 +1.074255000000000182e+00 -3.503125000000000000e+01 +1.074259999999999993e+00 -3.500000000000000000e+01 +1.074265000000000025e+00 -3.500000000000000000e+01 +1.074270000000000058e+00 -3.500000000000000000e+01 +1.074275000000000091e+00 -3.500000000000000000e+01 +1.074280000000000124e+00 -3.500000000000000000e+01 +1.074285000000000156e+00 -3.500000000000000000e+01 +1.074290000000000189e+00 -3.493750000000000000e+01 +1.074295000000000000e+00 -3.496875381469726562e+01 +1.074300000000000033e+00 -3.490625000000000000e+01 +1.074305000000000065e+00 -3.493750000000000000e+01 +1.074310000000000098e+00 -3.500000000000000000e+01 +1.074315000000000131e+00 -3.493750000000000000e+01 +1.074320000000000164e+00 -3.496875381469726562e+01 +1.074325000000000196e+00 -3.500000000000000000e+01 +1.074330000000000007e+00 -3.500000000000000000e+01 +1.074335000000000040e+00 -3.500000000000000000e+01 +1.074340000000000073e+00 -3.500000000000000000e+01 +1.074345000000000105e+00 -3.487500000000000000e+01 +1.074350000000000138e+00 -3.493750000000000000e+01 +1.074355000000000171e+00 -3.493750000000000000e+01 +1.074359999999999982e+00 -3.500000000000000000e+01 +1.074365000000000014e+00 -3.496875381469726562e+01 +1.074370000000000047e+00 -3.493750000000000000e+01 +1.074375000000000080e+00 -3.496875381469726562e+01 +1.074380000000000113e+00 -3.493750000000000000e+01 +1.074385000000000145e+00 -3.500000000000000000e+01 +1.074390000000000178e+00 -3.490625000000000000e+01 +1.074394999999999989e+00 -3.487500000000000000e+01 +1.074400000000000022e+00 -3.487500000000000000e+01 +1.074405000000000054e+00 -3.490625000000000000e+01 +1.074410000000000087e+00 -3.493750000000000000e+01 +1.074415000000000120e+00 -3.493750000000000000e+01 +1.074420000000000153e+00 -3.490625000000000000e+01 +1.074425000000000185e+00 -3.487500000000000000e+01 +1.074429999999999996e+00 -3.487500000000000000e+01 +1.074435000000000029e+00 -3.487500000000000000e+01 +1.074440000000000062e+00 -3.490625000000000000e+01 +1.074445000000000094e+00 -3.484375000000000000e+01 +1.074450000000000127e+00 -3.487500000000000000e+01 +1.074455000000000160e+00 -3.490625000000000000e+01 +1.074460000000000193e+00 -3.490625000000000000e+01 +1.074465000000000003e+00 -3.487500000000000000e+01 +1.074470000000000036e+00 -3.487500000000000000e+01 +1.074475000000000069e+00 -3.487500000000000000e+01 +1.074480000000000102e+00 -3.487500000000000000e+01 +1.074485000000000134e+00 -3.487500000000000000e+01 +1.074490000000000167e+00 -3.490625000000000000e+01 +1.074494999999999978e+00 -3.484375000000000000e+01 +1.074500000000000011e+00 -3.484375000000000000e+01 +1.074505000000000043e+00 -3.487500000000000000e+01 +1.074510000000000076e+00 -3.490625000000000000e+01 +1.074515000000000109e+00 -3.487500000000000000e+01 +1.074520000000000142e+00 -3.496875381469726562e+01 +1.074525000000000174e+00 -3.487500000000000000e+01 +1.074529999999999985e+00 -3.490625000000000000e+01 +1.074535000000000018e+00 -3.490625000000000000e+01 +1.074540000000000051e+00 -3.481250381469726562e+01 +1.074545000000000083e+00 -3.484375000000000000e+01 +1.074550000000000116e+00 -3.490625000000000000e+01 +1.074555000000000149e+00 -3.484375000000000000e+01 +1.074560000000000182e+00 -3.484375000000000000e+01 +1.074564999999999992e+00 -3.481250381469726562e+01 +1.074570000000000025e+00 -3.481250381469726562e+01 +1.074575000000000058e+00 -3.478125000000000000e+01 +1.074580000000000091e+00 -3.478125000000000000e+01 +1.074585000000000123e+00 -3.481250381469726562e+01 +1.074590000000000156e+00 -3.484375000000000000e+01 +1.074595000000000189e+00 -3.484375000000000000e+01 +1.074600000000000000e+00 -3.484375000000000000e+01 +1.074605000000000032e+00 -3.481250381469726562e+01 +1.074610000000000065e+00 -3.484375000000000000e+01 +1.074615000000000098e+00 -3.478125000000000000e+01 +1.074620000000000131e+00 -3.478125000000000000e+01 +1.074625000000000163e+00 -3.484375000000000000e+01 +1.074630000000000196e+00 -3.475000000000000000e+01 +1.074635000000000007e+00 -3.478125000000000000e+01 +1.074640000000000040e+00 -3.478125000000000000e+01 +1.074645000000000072e+00 -3.475000000000000000e+01 +1.074650000000000105e+00 -3.475000000000000000e+01 +1.074655000000000138e+00 -3.471875000000000000e+01 +1.074660000000000171e+00 -3.475000000000000000e+01 +1.074664999999999981e+00 -3.487500000000000000e+01 +1.074670000000000014e+00 -3.475000000000000000e+01 +1.074675000000000047e+00 -3.475000000000000000e+01 +1.074680000000000080e+00 -3.475000000000000000e+01 +1.074685000000000112e+00 -3.471875000000000000e+01 +1.074690000000000145e+00 -3.475000000000000000e+01 +1.074695000000000178e+00 -3.478125000000000000e+01 +1.074699999999999989e+00 -3.471875000000000000e+01 +1.074705000000000021e+00 -3.465625000000000000e+01 +1.074710000000000054e+00 -3.471875000000000000e+01 +1.074715000000000087e+00 -3.465625000000000000e+01 +1.074720000000000120e+00 -3.468750000000000000e+01 +1.074725000000000152e+00 -3.468750000000000000e+01 +1.074730000000000185e+00 -3.471875000000000000e+01 +1.074734999999999996e+00 -3.468750000000000000e+01 +1.074740000000000029e+00 -3.468750000000000000e+01 +1.074745000000000061e+00 -3.471875000000000000e+01 +1.074750000000000094e+00 -3.462500000000000000e+01 +1.074755000000000127e+00 -3.471875000000000000e+01 +1.074760000000000160e+00 -3.471875000000000000e+01 +1.074765000000000192e+00 -3.468750000000000000e+01 +1.074770000000000003e+00 -3.465625000000000000e+01 +1.074775000000000036e+00 -3.468750000000000000e+01 +1.074780000000000069e+00 -3.465625000000000000e+01 +1.074785000000000101e+00 -3.462500000000000000e+01 +1.074790000000000134e+00 -3.471875000000000000e+01 +1.074795000000000167e+00 -3.465625000000000000e+01 +1.074799999999999978e+00 -3.465625000000000000e+01 +1.074805000000000010e+00 -3.462500000000000000e+01 +1.074810000000000043e+00 -3.465625000000000000e+01 +1.074815000000000076e+00 -3.465625000000000000e+01 +1.074820000000000109e+00 -3.465625000000000000e+01 +1.074825000000000141e+00 -3.468750000000000000e+01 +1.074830000000000174e+00 -3.471875000000000000e+01 +1.074834999999999985e+00 -3.475000000000000000e+01 +1.074840000000000018e+00 -3.468750000000000000e+01 +1.074845000000000050e+00 -3.468750000000000000e+01 +1.074850000000000083e+00 -3.465625000000000000e+01 +1.074855000000000116e+00 -3.468750000000000000e+01 +1.074860000000000149e+00 -3.465625000000000000e+01 +1.074865000000000181e+00 -3.465625000000000000e+01 +1.074869999999999992e+00 -3.468750000000000000e+01 +1.074875000000000025e+00 -3.465625000000000000e+01 +1.074880000000000058e+00 -3.459375000000000000e+01 +1.074885000000000090e+00 -3.471875000000000000e+01 +1.074890000000000123e+00 -3.462500000000000000e+01 +1.074895000000000156e+00 -3.462500000000000000e+01 +1.074900000000000189e+00 -3.465625000000000000e+01 +1.074904999999999999e+00 -3.462500000000000000e+01 +1.074910000000000032e+00 -3.456250381469726562e+01 +1.074915000000000065e+00 -3.459375000000000000e+01 +1.074920000000000098e+00 -3.459375000000000000e+01 +1.074925000000000130e+00 -3.453125000000000000e+01 +1.074930000000000163e+00 -3.453125000000000000e+01 +1.074935000000000196e+00 -3.459375000000000000e+01 +1.074940000000000007e+00 -3.456250381469726562e+01 +1.074945000000000039e+00 -3.462500000000000000e+01 +1.074950000000000072e+00 -3.456250381469726562e+01 +1.074955000000000105e+00 -3.459375000000000000e+01 +1.074960000000000138e+00 -3.453125000000000000e+01 +1.074965000000000170e+00 -3.456250381469726562e+01 +1.074969999999999981e+00 -3.459375000000000000e+01 +1.074975000000000014e+00 -3.453125000000000000e+01 +1.074980000000000047e+00 -3.459375000000000000e+01 +1.074985000000000079e+00 -3.459375000000000000e+01 +1.074990000000000112e+00 -3.453125000000000000e+01 +1.074995000000000145e+00 -3.453125000000000000e+01 +1.075000000000000178e+00 -3.453125000000000000e+01 +1.075004999999999988e+00 -3.453125000000000000e+01 +1.075010000000000021e+00 -3.453125000000000000e+01 +1.075015000000000054e+00 -3.453125000000000000e+01 +1.075020000000000087e+00 -3.453125000000000000e+01 +1.075025000000000119e+00 -3.450000000000000000e+01 +1.075030000000000152e+00 -3.446875000000000000e+01 +1.075035000000000185e+00 -3.443750000000000000e+01 +1.075039999999999996e+00 -3.446875000000000000e+01 +1.075045000000000028e+00 -3.446875000000000000e+01 +1.075050000000000061e+00 -3.450000000000000000e+01 +1.075055000000000094e+00 -3.443750000000000000e+01 +1.075060000000000127e+00 -3.443750000000000000e+01 +1.075065000000000159e+00 -3.443750000000000000e+01 +1.075070000000000192e+00 -3.446875000000000000e+01 +1.075075000000000003e+00 -3.440625381469726562e+01 +1.075080000000000036e+00 -3.446875000000000000e+01 +1.075085000000000068e+00 -3.443750000000000000e+01 +1.075090000000000101e+00 -3.443750000000000000e+01 +1.075095000000000134e+00 -3.446875000000000000e+01 +1.075100000000000167e+00 -3.443750000000000000e+01 +1.075104999999999977e+00 -3.446875000000000000e+01 +1.075110000000000010e+00 -3.437500000000000000e+01 +1.075115000000000043e+00 -3.434375000000000000e+01 +1.075120000000000076e+00 -3.440625381469726562e+01 +1.075125000000000108e+00 -3.437500000000000000e+01 +1.075130000000000141e+00 -3.443750000000000000e+01 +1.075135000000000174e+00 -3.437500000000000000e+01 +1.075139999999999985e+00 -3.443750000000000000e+01 +1.075145000000000017e+00 -3.440625381469726562e+01 +1.075150000000000050e+00 -3.443750000000000000e+01 +1.075155000000000083e+00 -3.443750000000000000e+01 +1.075160000000000116e+00 -3.446875000000000000e+01 +1.075165000000000148e+00 -3.440625381469726562e+01 +1.075170000000000181e+00 -3.440625381469726562e+01 +1.075174999999999992e+00 -3.440625381469726562e+01 +1.075180000000000025e+00 -3.434375000000000000e+01 +1.075185000000000057e+00 -3.437500000000000000e+01 +1.075190000000000090e+00 -3.437500000000000000e+01 +1.075195000000000123e+00 -3.440625381469726562e+01 +1.075200000000000156e+00 -3.437500000000000000e+01 +1.075205000000000188e+00 -3.443750000000000000e+01 +1.075209999999999999e+00 -3.437500000000000000e+01 +1.075215000000000032e+00 -3.443750000000000000e+01 +1.075220000000000065e+00 -3.443750000000000000e+01 +1.075225000000000097e+00 -3.437500000000000000e+01 +1.075230000000000130e+00 -3.440625381469726562e+01 +1.075235000000000163e+00 -3.440625381469726562e+01 +1.075240000000000196e+00 -3.437500000000000000e+01 +1.075245000000000006e+00 -3.434375000000000000e+01 +1.075250000000000039e+00 -3.434375000000000000e+01 +1.075255000000000072e+00 -3.437500000000000000e+01 +1.075260000000000105e+00 -3.434375000000000000e+01 +1.075265000000000137e+00 -3.437500000000000000e+01 +1.075270000000000170e+00 -3.431250000000000000e+01 +1.075274999999999981e+00 -3.431250000000000000e+01 +1.075280000000000014e+00 -3.434375000000000000e+01 +1.075285000000000046e+00 -3.434375000000000000e+01 +1.075290000000000079e+00 -3.434375000000000000e+01 +1.075295000000000112e+00 -3.434375000000000000e+01 +1.075300000000000145e+00 -3.431250000000000000e+01 +1.075305000000000177e+00 -3.434375000000000000e+01 +1.075309999999999988e+00 -3.434375000000000000e+01 +1.075315000000000021e+00 -3.428125000000000000e+01 +1.075320000000000054e+00 -3.431250000000000000e+01 +1.075325000000000086e+00 -3.434375000000000000e+01 +1.075330000000000119e+00 -3.425000381469726562e+01 +1.075335000000000152e+00 -3.428125000000000000e+01 +1.075340000000000185e+00 -3.434375000000000000e+01 +1.075344999999999995e+00 -3.434375000000000000e+01 +1.075350000000000028e+00 -3.431250000000000000e+01 +1.075355000000000061e+00 -3.431250000000000000e+01 +1.075360000000000094e+00 -3.437500000000000000e+01 +1.075365000000000126e+00 -3.434375000000000000e+01 +1.075370000000000159e+00 -3.434375000000000000e+01 +1.075375000000000192e+00 -3.434375000000000000e+01 +1.075380000000000003e+00 -3.434375000000000000e+01 +1.075385000000000035e+00 -3.434375000000000000e+01 +1.075390000000000068e+00 -3.428125000000000000e+01 +1.075395000000000101e+00 -3.431250000000000000e+01 +1.075400000000000134e+00 -3.434375000000000000e+01 +1.075405000000000166e+00 -3.428125000000000000e+01 +1.075409999999999977e+00 -3.431250000000000000e+01 +1.075415000000000010e+00 -3.434375000000000000e+01 +1.075420000000000043e+00 -3.431250000000000000e+01 +1.075425000000000075e+00 -3.431250000000000000e+01 +1.075430000000000108e+00 -3.434375000000000000e+01 +1.075435000000000141e+00 -3.431250000000000000e+01 +1.075440000000000174e+00 -3.431250000000000000e+01 +1.075444999999999984e+00 -3.428125000000000000e+01 +1.075450000000000017e+00 -3.431250000000000000e+01 +1.075455000000000050e+00 -3.428125000000000000e+01 +1.075460000000000083e+00 -3.428125000000000000e+01 +1.075465000000000115e+00 -3.428125000000000000e+01 +1.075470000000000148e+00 -3.428125000000000000e+01 +1.075475000000000181e+00 -3.418750000000000000e+01 +1.075479999999999992e+00 -3.431250000000000000e+01 +1.075485000000000024e+00 -3.428125000000000000e+01 +1.075490000000000057e+00 -3.428125000000000000e+01 +1.075495000000000090e+00 -3.428125000000000000e+01 +1.075500000000000123e+00 -3.425000381469726562e+01 +1.075505000000000155e+00 -3.425000381469726562e+01 +1.075510000000000188e+00 -3.428125000000000000e+01 +1.075514999999999999e+00 -3.428125000000000000e+01 +1.075520000000000032e+00 -3.428125000000000000e+01 +1.075525000000000064e+00 -3.428125000000000000e+01 +1.075530000000000097e+00 -3.428125000000000000e+01 +1.075535000000000130e+00 -3.428125000000000000e+01 +1.075540000000000163e+00 -3.421875000000000000e+01 +1.075545000000000195e+00 -3.431250000000000000e+01 +1.075550000000000006e+00 -3.418750000000000000e+01 +1.075555000000000039e+00 -3.421875000000000000e+01 +1.075560000000000072e+00 -3.428125000000000000e+01 +1.075565000000000104e+00 -3.421875000000000000e+01 +1.075570000000000137e+00 -3.431250000000000000e+01 +1.075575000000000170e+00 -3.418750000000000000e+01 +1.075579999999999981e+00 -3.428125000000000000e+01 +1.075585000000000013e+00 -3.425000381469726562e+01 +1.075590000000000046e+00 -3.421875000000000000e+01 +1.075595000000000079e+00 -3.421875000000000000e+01 +1.075600000000000112e+00 -3.418750000000000000e+01 +1.075605000000000144e+00 -3.425000381469726562e+01 +1.075610000000000177e+00 -3.425000381469726562e+01 +1.075614999999999988e+00 -3.421875000000000000e+01 +1.075620000000000021e+00 -3.425000381469726562e+01 +1.075625000000000053e+00 -3.428125000000000000e+01 +1.075630000000000086e+00 -3.428125000000000000e+01 +1.075635000000000119e+00 -3.428125000000000000e+01 +1.075640000000000152e+00 -3.428125000000000000e+01 +1.075645000000000184e+00 -3.431250000000000000e+01 +1.075649999999999995e+00 -3.428125000000000000e+01 +1.075655000000000028e+00 -3.418750000000000000e+01 +1.075660000000000061e+00 -3.421875000000000000e+01 +1.075665000000000093e+00 -3.425000381469726562e+01 +1.075670000000000126e+00 -3.418750000000000000e+01 +1.075675000000000159e+00 -3.421875000000000000e+01 +1.075680000000000192e+00 -3.421875000000000000e+01 +1.075685000000000002e+00 -3.425000381469726562e+01 +1.075690000000000035e+00 -3.418750000000000000e+01 +1.075695000000000068e+00 -3.425000381469726562e+01 +1.075700000000000101e+00 -3.418750000000000000e+01 +1.075705000000000133e+00 -3.418750000000000000e+01 +1.075710000000000166e+00 -3.421875000000000000e+01 +1.075715000000000199e+00 -3.425000381469726562e+01 +1.075720000000000010e+00 -3.418750000000000000e+01 +1.075725000000000042e+00 -3.415625000000000000e+01 +1.075730000000000075e+00 -3.421875000000000000e+01 +1.075735000000000108e+00 -3.421875000000000000e+01 +1.075740000000000141e+00 -3.418750000000000000e+01 +1.075745000000000173e+00 -3.418750000000000000e+01 +1.075749999999999984e+00 -3.421875000000000000e+01 +1.075755000000000017e+00 -3.412500000000000000e+01 +1.075760000000000050e+00 -3.428125000000000000e+01 +1.075765000000000082e+00 -3.421875000000000000e+01 +1.075770000000000115e+00 -3.421875000000000000e+01 +1.075775000000000148e+00 -3.415625000000000000e+01 +1.075780000000000181e+00 -3.421875000000000000e+01 +1.075784999999999991e+00 -3.418750000000000000e+01 +1.075790000000000024e+00 -3.418750000000000000e+01 +1.075795000000000057e+00 -3.415625000000000000e+01 +1.075800000000000090e+00 -3.415625000000000000e+01 +1.075805000000000122e+00 -3.415625000000000000e+01 +1.075810000000000155e+00 -3.409375381469726562e+01 +1.075815000000000188e+00 -3.409375381469726562e+01 +1.075819999999999999e+00 -3.418750000000000000e+01 +1.075825000000000031e+00 -3.409375381469726562e+01 +1.075830000000000064e+00 -3.409375381469726562e+01 +1.075835000000000097e+00 -3.406250000000000000e+01 +1.075840000000000130e+00 -3.409375381469726562e+01 +1.075845000000000162e+00 -3.412500000000000000e+01 +1.075850000000000195e+00 -3.409375381469726562e+01 +1.075855000000000006e+00 -3.415625000000000000e+01 +1.075860000000000039e+00 -3.406250000000000000e+01 +1.075865000000000071e+00 -3.403125000000000000e+01 +1.075870000000000104e+00 -3.412500000000000000e+01 +1.075875000000000137e+00 -3.406250000000000000e+01 +1.075880000000000170e+00 -3.412500000000000000e+01 +1.075884999999999980e+00 -3.409375381469726562e+01 +1.075890000000000013e+00 -3.406250000000000000e+01 +1.075895000000000046e+00 -3.406250000000000000e+01 +1.075900000000000079e+00 -3.412500000000000000e+01 +1.075905000000000111e+00 -3.409375381469726562e+01 +1.075910000000000144e+00 -3.409375381469726562e+01 +1.075915000000000177e+00 -3.406250000000000000e+01 +1.075919999999999987e+00 -3.409375381469726562e+01 +1.075925000000000020e+00 -3.403125000000000000e+01 +1.075930000000000053e+00 -3.406250000000000000e+01 +1.075935000000000086e+00 -3.403125000000000000e+01 +1.075940000000000119e+00 -3.406250000000000000e+01 +1.075945000000000151e+00 -3.400000000000000000e+01 +1.075950000000000184e+00 -3.409375381469726562e+01 +1.075954999999999995e+00 -3.403125000000000000e+01 +1.075960000000000027e+00 -3.409375381469726562e+01 +1.075965000000000060e+00 -3.409375381469726562e+01 +1.075970000000000093e+00 -3.406250000000000000e+01 +1.075975000000000126e+00 -3.409375381469726562e+01 +1.075980000000000159e+00 -3.403125000000000000e+01 +1.075985000000000191e+00 -3.409375381469726562e+01 +1.075990000000000002e+00 -3.406250000000000000e+01 +1.075995000000000035e+00 -3.403125000000000000e+01 +1.076000000000000068e+00 -3.406250000000000000e+01 +1.076005000000000100e+00 -3.396875000000000000e+01 +1.076010000000000133e+00 -3.403125000000000000e+01 +1.076015000000000166e+00 -3.400000000000000000e+01 +1.076020000000000199e+00 -3.400000000000000000e+01 +1.076025000000000009e+00 -3.403125000000000000e+01 +1.076030000000000042e+00 -3.396875000000000000e+01 +1.076035000000000075e+00 -3.403125000000000000e+01 +1.076040000000000108e+00 -3.403125000000000000e+01 +1.076045000000000140e+00 -3.403125000000000000e+01 +1.076050000000000173e+00 -3.406250000000000000e+01 +1.076054999999999984e+00 -3.403125000000000000e+01 +1.076060000000000016e+00 -3.400000000000000000e+01 +1.076065000000000049e+00 -3.400000000000000000e+01 +1.076070000000000082e+00 -3.400000000000000000e+01 +1.076075000000000115e+00 -3.393750000000000000e+01 +1.076080000000000148e+00 -3.403125000000000000e+01 +1.076085000000000180e+00 -3.400000000000000000e+01 +1.076089999999999991e+00 -3.400000000000000000e+01 +1.076095000000000024e+00 -3.400000000000000000e+01 +1.076100000000000056e+00 -3.400000000000000000e+01 +1.076105000000000089e+00 -3.396875000000000000e+01 +1.076110000000000122e+00 -3.400000000000000000e+01 +1.076115000000000155e+00 -3.396875000000000000e+01 +1.076120000000000188e+00 -3.390625000000000000e+01 +1.076124999999999998e+00 -3.390625000000000000e+01 +1.076130000000000031e+00 -3.393750000000000000e+01 +1.076135000000000064e+00 -3.393750000000000000e+01 +1.076140000000000096e+00 -3.400000000000000000e+01 +1.076145000000000129e+00 -3.403125000000000000e+01 +1.076150000000000162e+00 -3.400000000000000000e+01 +1.076155000000000195e+00 -3.393750000000000000e+01 +1.076160000000000005e+00 -3.403125000000000000e+01 +1.076165000000000038e+00 -3.400000000000000000e+01 +1.076170000000000071e+00 -3.400000000000000000e+01 +1.076175000000000104e+00 -3.393750000000000000e+01 +1.076180000000000136e+00 -3.396875000000000000e+01 +1.076185000000000169e+00 -3.393750000000000000e+01 +1.076189999999999980e+00 -3.396875000000000000e+01 +1.076195000000000013e+00 -3.393750000000000000e+01 +1.076200000000000045e+00 -3.393750000000000000e+01 +1.076205000000000078e+00 -3.393750000000000000e+01 +1.076210000000000111e+00 -3.396875000000000000e+01 +1.076215000000000144e+00 -3.393750000000000000e+01 +1.076220000000000176e+00 -3.390625000000000000e+01 +1.076224999999999987e+00 -3.403125000000000000e+01 +1.076230000000000020e+00 -3.396875000000000000e+01 +1.076235000000000053e+00 -3.393750000000000000e+01 +1.076240000000000085e+00 -3.390625000000000000e+01 +1.076245000000000118e+00 -3.390625000000000000e+01 +1.076250000000000151e+00 -3.393750000000000000e+01 +1.076255000000000184e+00 -3.390625000000000000e+01 +1.076259999999999994e+00 -3.393750000000000000e+01 +1.076265000000000027e+00 -3.393750000000000000e+01 +1.076270000000000060e+00 -3.387500000000000000e+01 +1.076275000000000093e+00 -3.393750000000000000e+01 +1.076280000000000125e+00 -3.396875000000000000e+01 +1.076285000000000158e+00 -3.387500000000000000e+01 +1.076290000000000191e+00 -3.393750000000000000e+01 +1.076295000000000002e+00 -3.381250000000000000e+01 +1.076300000000000034e+00 -3.387500000000000000e+01 +1.076305000000000067e+00 -3.387500000000000000e+01 +1.076310000000000100e+00 -3.387500000000000000e+01 +1.076315000000000133e+00 -3.381250000000000000e+01 +1.076320000000000165e+00 -3.390625000000000000e+01 +1.076325000000000198e+00 -3.390625000000000000e+01 +1.076330000000000009e+00 -3.384375381469726562e+01 +1.076335000000000042e+00 -3.390625000000000000e+01 +1.076340000000000074e+00 -3.378125000000000000e+01 +1.076345000000000107e+00 -3.378125000000000000e+01 +1.076350000000000140e+00 -3.390625000000000000e+01 +1.076355000000000173e+00 -3.381250000000000000e+01 +1.076359999999999983e+00 -3.378125000000000000e+01 +1.076365000000000016e+00 -3.381250000000000000e+01 +1.076370000000000049e+00 -3.378125000000000000e+01 +1.076375000000000082e+00 -3.378125000000000000e+01 +1.076380000000000114e+00 -3.381250000000000000e+01 +1.076385000000000147e+00 -3.381250000000000000e+01 +1.076390000000000180e+00 -3.384375381469726562e+01 +1.076394999999999991e+00 -3.381250000000000000e+01 +1.076400000000000023e+00 -3.378125000000000000e+01 +1.076405000000000056e+00 -3.384375381469726562e+01 +1.076410000000000089e+00 -3.378125000000000000e+01 +1.076415000000000122e+00 -3.381250000000000000e+01 +1.076420000000000154e+00 -3.378125000000000000e+01 +1.076425000000000187e+00 -3.371875000000000000e+01 +1.076429999999999998e+00 -3.378125000000000000e+01 +1.076435000000000031e+00 -3.375000000000000000e+01 +1.076440000000000063e+00 -3.371875000000000000e+01 +1.076445000000000096e+00 -3.378125000000000000e+01 +1.076450000000000129e+00 -3.375000000000000000e+01 +1.076455000000000162e+00 -3.368750381469726562e+01 +1.076460000000000194e+00 -3.371875000000000000e+01 +1.076465000000000005e+00 -3.378125000000000000e+01 +1.076470000000000038e+00 -3.375000000000000000e+01 +1.076475000000000071e+00 -3.371875000000000000e+01 +1.076480000000000103e+00 -3.378125000000000000e+01 +1.076485000000000136e+00 -3.378125000000000000e+01 +1.076490000000000169e+00 -3.375000000000000000e+01 +1.076494999999999980e+00 -3.378125000000000000e+01 +1.076500000000000012e+00 -3.365625000000000000e+01 +1.076505000000000045e+00 -3.378125000000000000e+01 +1.076510000000000078e+00 -3.375000000000000000e+01 +1.076515000000000111e+00 -3.375000000000000000e+01 +1.076520000000000143e+00 -3.378125000000000000e+01 +1.076525000000000176e+00 -3.378125000000000000e+01 +1.076529999999999987e+00 -3.371875000000000000e+01 +1.076535000000000020e+00 -3.378125000000000000e+01 +1.076540000000000052e+00 -3.375000000000000000e+01 +1.076545000000000085e+00 -3.371875000000000000e+01 +1.076550000000000118e+00 -3.375000000000000000e+01 +1.076555000000000151e+00 -3.375000000000000000e+01 +1.076560000000000183e+00 -3.371875000000000000e+01 +1.076564999999999994e+00 -3.375000000000000000e+01 +1.076570000000000027e+00 -3.371875000000000000e+01 +1.076575000000000060e+00 -3.368750381469726562e+01 +1.076580000000000092e+00 -3.362500000000000000e+01 +1.076585000000000125e+00 -3.371875000000000000e+01 +1.076590000000000158e+00 -3.365625000000000000e+01 +1.076595000000000191e+00 -3.365625000000000000e+01 +1.076600000000000001e+00 -3.365625000000000000e+01 +1.076605000000000034e+00 -3.368750381469726562e+01 +1.076610000000000067e+00 -3.365625000000000000e+01 +1.076615000000000100e+00 -3.368750381469726562e+01 +1.076620000000000132e+00 -3.359375000000000000e+01 +1.076625000000000165e+00 -3.365625000000000000e+01 +1.076630000000000198e+00 -3.365625000000000000e+01 +1.076635000000000009e+00 -3.368750381469726562e+01 +1.076640000000000041e+00 -3.362500000000000000e+01 +1.076645000000000074e+00 -3.365625000000000000e+01 +1.076650000000000107e+00 -3.359375000000000000e+01 +1.076655000000000140e+00 -3.362500000000000000e+01 +1.076660000000000172e+00 -3.362500000000000000e+01 +1.076664999999999983e+00 -3.365625000000000000e+01 +1.076670000000000016e+00 -3.362500000000000000e+01 +1.076675000000000049e+00 -3.362500000000000000e+01 +1.076680000000000081e+00 -3.365625000000000000e+01 +1.076685000000000114e+00 -3.365625000000000000e+01 +1.076690000000000147e+00 -3.365625000000000000e+01 +1.076695000000000180e+00 -3.365625000000000000e+01 +1.076699999999999990e+00 -3.362500000000000000e+01 +1.076705000000000023e+00 -3.362500000000000000e+01 +1.076710000000000056e+00 -3.356250000000000000e+01 +1.076715000000000089e+00 -3.365625000000000000e+01 +1.076720000000000121e+00 -3.356250000000000000e+01 +1.076725000000000154e+00 -3.356250000000000000e+01 +1.076730000000000187e+00 -3.362500000000000000e+01 +1.076734999999999998e+00 -3.362500000000000000e+01 +1.076740000000000030e+00 -3.362500000000000000e+01 +1.076745000000000063e+00 -3.359375000000000000e+01 +1.076750000000000096e+00 -3.359375000000000000e+01 +1.076755000000000129e+00 -3.353125381469726562e+01 +1.076760000000000161e+00 -3.359375000000000000e+01 +1.076765000000000194e+00 -3.356250000000000000e+01 +1.076770000000000005e+00 -3.362500000000000000e+01 +1.076775000000000038e+00 -3.365625000000000000e+01 +1.076780000000000070e+00 -3.356250000000000000e+01 +1.076785000000000103e+00 -3.359375000000000000e+01 +1.076790000000000136e+00 -3.356250000000000000e+01 +1.076795000000000169e+00 -3.353125381469726562e+01 +1.076799999999999979e+00 -3.353125381469726562e+01 +1.076805000000000012e+00 -3.359375000000000000e+01 +1.076810000000000045e+00 -3.356250000000000000e+01 +1.076815000000000078e+00 -3.359375000000000000e+01 +1.076820000000000110e+00 -3.356250000000000000e+01 +1.076825000000000143e+00 -3.353125381469726562e+01 +1.076830000000000176e+00 -3.359375000000000000e+01 +1.076834999999999987e+00 -3.365625000000000000e+01 +1.076840000000000019e+00 -3.359375000000000000e+01 +1.076845000000000052e+00 -3.353125381469726562e+01 +1.076850000000000085e+00 -3.350000000000000000e+01 +1.076855000000000118e+00 -3.359375000000000000e+01 +1.076860000000000150e+00 -3.356250000000000000e+01 +1.076865000000000183e+00 -3.353125381469726562e+01 +1.076869999999999994e+00 -3.356250000000000000e+01 +1.076875000000000027e+00 -3.350000000000000000e+01 +1.076880000000000059e+00 -3.350000000000000000e+01 +1.076885000000000092e+00 -3.350000000000000000e+01 +1.076890000000000125e+00 -3.353125381469726562e+01 +1.076895000000000158e+00 -3.353125381469726562e+01 +1.076900000000000190e+00 -3.353125381469726562e+01 +1.076905000000000001e+00 -3.353125381469726562e+01 +1.076910000000000034e+00 -3.353125381469726562e+01 +1.076915000000000067e+00 -3.356250000000000000e+01 +1.076920000000000099e+00 -3.346875000000000000e+01 +1.076925000000000132e+00 -3.353125381469726562e+01 +1.076930000000000165e+00 -3.353125381469726562e+01 +1.076935000000000198e+00 -3.350000000000000000e+01 +1.076940000000000008e+00 -3.353125381469726562e+01 +1.076945000000000041e+00 -3.350000000000000000e+01 +1.076950000000000074e+00 -3.353125381469726562e+01 +1.076955000000000107e+00 -3.343750000000000000e+01 +1.076960000000000139e+00 -3.350000000000000000e+01 +1.076965000000000172e+00 -3.350000000000000000e+01 +1.076969999999999983e+00 -3.350000000000000000e+01 +1.076975000000000016e+00 -3.353125381469726562e+01 +1.076980000000000048e+00 -3.353125381469726562e+01 +1.076985000000000081e+00 -3.350000000000000000e+01 +1.076990000000000114e+00 -3.353125381469726562e+01 +1.076995000000000147e+00 -3.350000000000000000e+01 +1.077000000000000179e+00 -3.350000000000000000e+01 +1.077004999999999990e+00 -3.346875000000000000e+01 +1.077010000000000023e+00 -3.350000000000000000e+01 +1.077015000000000056e+00 -3.350000000000000000e+01 +1.077020000000000088e+00 -3.353125381469726562e+01 +1.077025000000000121e+00 -3.350000000000000000e+01 +1.077030000000000154e+00 -3.353125381469726562e+01 +1.077035000000000187e+00 -3.350000000000000000e+01 +1.077039999999999997e+00 -3.343750000000000000e+01 +1.077045000000000030e+00 -3.353125381469726562e+01 +1.077050000000000063e+00 -3.346875000000000000e+01 +1.077055000000000096e+00 -3.343750000000000000e+01 +1.077060000000000128e+00 -3.353125381469726562e+01 +1.077065000000000161e+00 -3.346875000000000000e+01 +1.077070000000000194e+00 -3.353125381469726562e+01 +1.077075000000000005e+00 -3.346875000000000000e+01 +1.077080000000000037e+00 -3.346875000000000000e+01 +1.077085000000000070e+00 -3.346875000000000000e+01 +1.077090000000000103e+00 -3.350000000000000000e+01 +1.077095000000000136e+00 -3.346875000000000000e+01 +1.077100000000000168e+00 -3.346875000000000000e+01 +1.077104999999999979e+00 -3.346875000000000000e+01 +1.077110000000000012e+00 -3.343750000000000000e+01 +1.077115000000000045e+00 -3.343750000000000000e+01 +1.077120000000000077e+00 -3.340625000000000000e+01 +1.077125000000000110e+00 -3.346875000000000000e+01 +1.077130000000000143e+00 -3.334375000000000000e+01 +1.077135000000000176e+00 -3.337500381469726562e+01 +1.077139999999999986e+00 -3.340625000000000000e+01 +1.077145000000000019e+00 -3.343750000000000000e+01 +1.077150000000000052e+00 -3.346875000000000000e+01 +1.077155000000000085e+00 -3.334375000000000000e+01 +1.077160000000000117e+00 -3.340625000000000000e+01 +1.077165000000000150e+00 -3.340625000000000000e+01 +1.077170000000000183e+00 -3.343750000000000000e+01 +1.077174999999999994e+00 -3.331250000000000000e+01 +1.077180000000000026e+00 -3.337500381469726562e+01 +1.077185000000000059e+00 -3.337500381469726562e+01 +1.077190000000000092e+00 -3.334375000000000000e+01 +1.077195000000000125e+00 -3.334375000000000000e+01 +1.077200000000000157e+00 -3.343750000000000000e+01 +1.077205000000000190e+00 -3.334375000000000000e+01 +1.077210000000000001e+00 -3.340625000000000000e+01 +1.077215000000000034e+00 -3.337500381469726562e+01 +1.077220000000000066e+00 -3.334375000000000000e+01 +1.077225000000000099e+00 -3.334375000000000000e+01 +1.077230000000000132e+00 -3.334375000000000000e+01 +1.077235000000000165e+00 -3.334375000000000000e+01 +1.077240000000000197e+00 -3.328125000000000000e+01 +1.077245000000000008e+00 -3.334375000000000000e+01 +1.077250000000000041e+00 -3.334375000000000000e+01 +1.077255000000000074e+00 -3.331250000000000000e+01 +1.077260000000000106e+00 -3.331250000000000000e+01 +1.077265000000000139e+00 -3.334375000000000000e+01 +1.077270000000000172e+00 -3.334375000000000000e+01 +1.077274999999999983e+00 -3.331250000000000000e+01 +1.077280000000000015e+00 -3.325000000000000000e+01 +1.077285000000000048e+00 -3.334375000000000000e+01 +1.077290000000000081e+00 -3.337500381469726562e+01 +1.077295000000000114e+00 -3.331250000000000000e+01 +1.077300000000000146e+00 -3.331250000000000000e+01 +1.077305000000000179e+00 -3.331250000000000000e+01 +1.077309999999999990e+00 -3.328125000000000000e+01 +1.077315000000000023e+00 -3.328125000000000000e+01 +1.077320000000000055e+00 -3.334375000000000000e+01 +1.077325000000000088e+00 -3.328125000000000000e+01 +1.077330000000000121e+00 -3.321875381469726562e+01 +1.077335000000000154e+00 -3.328125000000000000e+01 +1.077340000000000186e+00 -3.328125000000000000e+01 +1.077344999999999997e+00 -3.328125000000000000e+01 +1.077350000000000030e+00 -3.321875381469726562e+01 +1.077355000000000063e+00 -3.328125000000000000e+01 +1.077360000000000095e+00 -3.328125000000000000e+01 +1.077365000000000128e+00 -3.321875381469726562e+01 +1.077370000000000161e+00 -3.321875381469726562e+01 +1.077375000000000194e+00 -3.325000000000000000e+01 +1.077380000000000004e+00 -3.325000000000000000e+01 +1.077385000000000037e+00 -3.325000000000000000e+01 +1.077390000000000070e+00 -3.321875381469726562e+01 +1.077395000000000103e+00 -3.325000000000000000e+01 +1.077400000000000135e+00 -3.318750000000000000e+01 +1.077405000000000168e+00 -3.328125000000000000e+01 +1.077409999999999979e+00 -3.321875381469726562e+01 +1.077415000000000012e+00 -3.321875381469726562e+01 +1.077420000000000044e+00 -3.318750000000000000e+01 +1.077425000000000077e+00 -3.321875381469726562e+01 +1.077430000000000110e+00 -3.315625000000000000e+01 +1.077435000000000143e+00 -3.315625000000000000e+01 +1.077440000000000175e+00 -3.321875381469726562e+01 +1.077444999999999986e+00 -3.321875381469726562e+01 +1.077450000000000019e+00 -3.321875381469726562e+01 +1.077455000000000052e+00 -3.315625000000000000e+01 +1.077460000000000084e+00 -3.321875381469726562e+01 +1.077465000000000117e+00 -3.315625000000000000e+01 +1.077470000000000150e+00 -3.321875381469726562e+01 +1.077475000000000183e+00 -3.315625000000000000e+01 +1.077479999999999993e+00 -3.318750000000000000e+01 +1.077485000000000026e+00 -3.318750000000000000e+01 +1.077490000000000059e+00 -3.312500381469726562e+01 +1.077495000000000092e+00 -3.318750000000000000e+01 +1.077500000000000124e+00 -3.321875381469726562e+01 +1.077505000000000157e+00 -3.321875381469726562e+01 +1.077510000000000190e+00 -3.315625000000000000e+01 +1.077515000000000001e+00 -3.318750000000000000e+01 +1.077520000000000033e+00 -3.321875381469726562e+01 +1.077525000000000066e+00 -3.325000000000000000e+01 +1.077530000000000099e+00 -3.321875381469726562e+01 +1.077535000000000132e+00 -3.318750000000000000e+01 +1.077540000000000164e+00 -3.315625000000000000e+01 +1.077545000000000197e+00 -3.315625000000000000e+01 +1.077550000000000008e+00 -3.315625000000000000e+01 +1.077555000000000041e+00 -3.318750000000000000e+01 +1.077560000000000073e+00 -3.315625000000000000e+01 +1.077565000000000106e+00 -3.312500381469726562e+01 +1.077570000000000139e+00 -3.318750000000000000e+01 +1.077575000000000172e+00 -3.309375000000000000e+01 +1.077579999999999982e+00 -3.318750000000000000e+01 +1.077585000000000015e+00 -3.315625000000000000e+01 +1.077590000000000048e+00 -3.312500381469726562e+01 +1.077595000000000081e+00 -3.315625000000000000e+01 +1.077600000000000113e+00 -3.312500381469726562e+01 +1.077605000000000146e+00 -3.309375000000000000e+01 +1.077610000000000179e+00 -3.312500381469726562e+01 +1.077614999999999990e+00 -3.306250000000000000e+01 +1.077620000000000022e+00 -3.306250000000000000e+01 +1.077625000000000055e+00 -3.303125000000000000e+01 +1.077630000000000088e+00 -3.306250000000000000e+01 +1.077635000000000121e+00 -3.312500381469726562e+01 +1.077640000000000153e+00 -3.306250000000000000e+01 +1.077645000000000186e+00 -3.306250000000000000e+01 +1.077649999999999997e+00 -3.312500381469726562e+01 +1.077655000000000030e+00 -3.315625000000000000e+01 +1.077660000000000062e+00 -3.309375000000000000e+01 +1.077665000000000095e+00 -3.309375000000000000e+01 +1.077670000000000128e+00 -3.309375000000000000e+01 +1.077675000000000161e+00 -3.315625000000000000e+01 +1.077680000000000193e+00 -3.309375000000000000e+01 +1.077685000000000004e+00 -3.309375000000000000e+01 +1.077690000000000037e+00 -3.306250000000000000e+01 +1.077695000000000070e+00 -3.306250000000000000e+01 +1.077700000000000102e+00 -3.306250000000000000e+01 +1.077705000000000135e+00 -3.306250000000000000e+01 +1.077710000000000168e+00 -3.312500381469726562e+01 +1.077714999999999979e+00 -3.306250000000000000e+01 +1.077720000000000011e+00 -3.309375000000000000e+01 +1.077725000000000044e+00 -3.303125000000000000e+01 +1.077730000000000077e+00 -3.303125000000000000e+01 +1.077735000000000110e+00 -3.309375000000000000e+01 +1.077740000000000142e+00 -3.309375000000000000e+01 +1.077745000000000175e+00 -3.303125000000000000e+01 +1.077749999999999986e+00 -3.309375000000000000e+01 +1.077755000000000019e+00 -3.303125000000000000e+01 +1.077760000000000051e+00 -3.309375000000000000e+01 +1.077765000000000084e+00 -3.300000000000000000e+01 +1.077770000000000117e+00 -3.303125000000000000e+01 +1.077775000000000150e+00 -3.300000000000000000e+01 +1.077780000000000182e+00 -3.296875381469726562e+01 +1.077784999999999993e+00 -3.300000000000000000e+01 +1.077790000000000026e+00 -3.303125000000000000e+01 +1.077795000000000059e+00 -3.303125000000000000e+01 +1.077800000000000091e+00 -3.303125000000000000e+01 +1.077805000000000124e+00 -3.300000000000000000e+01 +1.077810000000000157e+00 -3.300000000000000000e+01 +1.077815000000000190e+00 -3.293750000000000000e+01 +1.077820000000000000e+00 -3.300000000000000000e+01 +1.077825000000000033e+00 -3.300000000000000000e+01 +1.077830000000000066e+00 -3.293750000000000000e+01 +1.077835000000000099e+00 -3.300000000000000000e+01 +1.077840000000000131e+00 -3.296875381469726562e+01 +1.077845000000000164e+00 -3.296875381469726562e+01 +1.077850000000000197e+00 -3.300000000000000000e+01 +1.077855000000000008e+00 -3.296875381469726562e+01 +1.077860000000000040e+00 -3.296875381469726562e+01 +1.077865000000000073e+00 -3.293750000000000000e+01 +1.077870000000000106e+00 -3.296875381469726562e+01 +1.077875000000000139e+00 -3.293750000000000000e+01 +1.077880000000000171e+00 -3.293750000000000000e+01 +1.077884999999999982e+00 -3.290625000000000000e+01 +1.077890000000000015e+00 -3.293750000000000000e+01 +1.077895000000000048e+00 -3.290625000000000000e+01 +1.077900000000000080e+00 -3.296875381469726562e+01 +1.077905000000000113e+00 -3.293750000000000000e+01 +1.077910000000000146e+00 -3.290625000000000000e+01 +1.077915000000000179e+00 -3.290625000000000000e+01 +1.077919999999999989e+00 -3.293750000000000000e+01 +1.077925000000000022e+00 -3.290625000000000000e+01 +1.077930000000000055e+00 -3.290625000000000000e+01 +1.077935000000000088e+00 -3.293750000000000000e+01 +1.077940000000000120e+00 -3.290625000000000000e+01 +1.077945000000000153e+00 -3.290625000000000000e+01 +1.077950000000000186e+00 -3.293750000000000000e+01 +1.077954999999999997e+00 -3.290625000000000000e+01 +1.077960000000000029e+00 -3.284375000000000000e+01 +1.077965000000000062e+00 -3.287500000000000000e+01 +1.077970000000000095e+00 -3.290625000000000000e+01 +1.077975000000000128e+00 -3.293750000000000000e+01 +1.077980000000000160e+00 -3.284375000000000000e+01 +1.077985000000000193e+00 -3.281250381469726562e+01 +1.077990000000000004e+00 -3.281250381469726562e+01 +1.077995000000000037e+00 -3.290625000000000000e+01 +1.078000000000000069e+00 -3.284375000000000000e+01 +1.078005000000000102e+00 -3.284375000000000000e+01 +1.078010000000000135e+00 -3.278125000000000000e+01 +1.078015000000000168e+00 -3.287500000000000000e+01 +1.078019999999999978e+00 -3.281250381469726562e+01 +1.078025000000000011e+00 -3.278125000000000000e+01 +1.078030000000000044e+00 -3.278125000000000000e+01 +1.078035000000000077e+00 -3.278125000000000000e+01 +1.078040000000000109e+00 -3.281250381469726562e+01 +1.078045000000000142e+00 -3.275000000000000000e+01 +1.078050000000000175e+00 -3.278125000000000000e+01 +1.078054999999999986e+00 -3.271875000000000000e+01 +1.078060000000000018e+00 -3.278125000000000000e+01 +1.078065000000000051e+00 -3.278125000000000000e+01 +1.078070000000000084e+00 -3.281250381469726562e+01 +1.078075000000000117e+00 -3.271875000000000000e+01 +1.078080000000000149e+00 -3.271875000000000000e+01 +1.078085000000000182e+00 -3.268750000000000000e+01 +1.078089999999999993e+00 -3.268750000000000000e+01 +1.078095000000000026e+00 -3.271875000000000000e+01 +1.078100000000000058e+00 -3.268750000000000000e+01 +1.078105000000000091e+00 -3.271875000000000000e+01 +1.078110000000000124e+00 -3.268750000000000000e+01 +1.078115000000000157e+00 -3.268750000000000000e+01 +1.078120000000000189e+00 -3.268750000000000000e+01 +1.078125000000000000e+00 -3.268750000000000000e+01 +1.078130000000000033e+00 -3.268750000000000000e+01 +1.078135000000000066e+00 -3.265625381469726562e+01 +1.078140000000000098e+00 -3.262500000000000000e+01 +1.078145000000000131e+00 -3.268750000000000000e+01 +1.078150000000000164e+00 -3.265625381469726562e+01 +1.078155000000000197e+00 -3.262500000000000000e+01 +1.078160000000000007e+00 -3.262500000000000000e+01 +1.078165000000000040e+00 -3.259375000000000000e+01 +1.078170000000000073e+00 -3.259375000000000000e+01 +1.078175000000000106e+00 -3.256250000000000000e+01 +1.078180000000000138e+00 -3.256250000000000000e+01 +1.078185000000000171e+00 -3.259375000000000000e+01 +1.078189999999999982e+00 -3.253125000000000000e+01 +1.078195000000000014e+00 -3.259375000000000000e+01 +1.078200000000000047e+00 -3.256250000000000000e+01 +1.078205000000000080e+00 -3.253125000000000000e+01 +1.078210000000000113e+00 -3.256250000000000000e+01 +1.078215000000000146e+00 -3.256250000000000000e+01 +1.078220000000000178e+00 -3.253125000000000000e+01 +1.078224999999999989e+00 -3.253125000000000000e+01 +1.078230000000000022e+00 -3.253125000000000000e+01 +1.078235000000000054e+00 -3.256250000000000000e+01 +1.078240000000000087e+00 -3.250000381469726562e+01 +1.078245000000000120e+00 -3.246875000000000000e+01 +1.078250000000000153e+00 -3.256250000000000000e+01 +1.078255000000000186e+00 -3.250000381469726562e+01 +1.078259999999999996e+00 -3.253125000000000000e+01 +1.078265000000000029e+00 -3.250000381469726562e+01 +1.078270000000000062e+00 -3.259375000000000000e+01 +1.078275000000000095e+00 -3.253125000000000000e+01 +1.078280000000000127e+00 -3.250000381469726562e+01 +1.078285000000000160e+00 -3.253125000000000000e+01 +1.078290000000000193e+00 -3.250000381469726562e+01 +1.078295000000000003e+00 -3.246875000000000000e+01 +1.078300000000000036e+00 -3.246875000000000000e+01 +1.078305000000000069e+00 -3.253125000000000000e+01 +1.078310000000000102e+00 -3.250000381469726562e+01 +1.078315000000000135e+00 -3.243750000000000000e+01 +1.078320000000000167e+00 -3.237500000000000000e+01 +1.078324999999999978e+00 -3.250000381469726562e+01 +1.078330000000000011e+00 -3.243750000000000000e+01 +1.078335000000000043e+00 -3.243750000000000000e+01 +1.078340000000000076e+00 -3.237500000000000000e+01 +1.078345000000000109e+00 -3.243750000000000000e+01 +1.078350000000000142e+00 -3.237500000000000000e+01 +1.078355000000000175e+00 -3.243750000000000000e+01 +1.078359999999999985e+00 -3.243750000000000000e+01 +1.078365000000000018e+00 -3.237500000000000000e+01 +1.078370000000000051e+00 -3.240625000000000000e+01 +1.078375000000000083e+00 -3.243750000000000000e+01 +1.078380000000000116e+00 -3.240625000000000000e+01 +1.078385000000000149e+00 -3.237500000000000000e+01 +1.078390000000000182e+00 -3.243750000000000000e+01 +1.078394999999999992e+00 -3.240625000000000000e+01 +1.078400000000000025e+00 -3.237500000000000000e+01 +1.078405000000000058e+00 -3.234375000000000000e+01 +1.078410000000000091e+00 -3.240625000000000000e+01 +1.078415000000000123e+00 -3.234375000000000000e+01 +1.078420000000000156e+00 -3.234375000000000000e+01 +1.078425000000000189e+00 -3.237500000000000000e+01 +1.078430000000000000e+00 -3.231250000000000000e+01 +1.078435000000000032e+00 -3.237500000000000000e+01 +1.078440000000000065e+00 -3.234375000000000000e+01 +1.078445000000000098e+00 -3.231250000000000000e+01 +1.078450000000000131e+00 -3.234375000000000000e+01 +1.078455000000000163e+00 -3.231250000000000000e+01 +1.078460000000000196e+00 -3.237500000000000000e+01 +1.078465000000000007e+00 -3.234375000000000000e+01 +1.078470000000000040e+00 -3.234375000000000000e+01 +1.078475000000000072e+00 -3.231250000000000000e+01 +1.078480000000000105e+00 -3.234375000000000000e+01 +1.078485000000000138e+00 -3.231250000000000000e+01 +1.078490000000000171e+00 -3.228125000000000000e+01 +1.078494999999999981e+00 -3.228125000000000000e+01 +1.078500000000000014e+00 -3.228125000000000000e+01 +1.078505000000000047e+00 -3.231250000000000000e+01 +1.078510000000000080e+00 -3.228125000000000000e+01 +1.078515000000000112e+00 -3.221875000000000000e+01 +1.078520000000000145e+00 -3.231250000000000000e+01 +1.078525000000000178e+00 -3.218750000000000000e+01 +1.078529999999999989e+00 -3.228125000000000000e+01 +1.078535000000000021e+00 -3.218750000000000000e+01 +1.078540000000000054e+00 -3.221875000000000000e+01 +1.078545000000000087e+00 -3.215625000000000000e+01 +1.078550000000000120e+00 -3.215625000000000000e+01 +1.078555000000000152e+00 -3.215625000000000000e+01 +1.078560000000000185e+00 -3.215625000000000000e+01 +1.078564999999999996e+00 -3.215625000000000000e+01 +1.078570000000000029e+00 -3.218750000000000000e+01 +1.078575000000000061e+00 -3.215625000000000000e+01 +1.078580000000000094e+00 -3.218750000000000000e+01 +1.078585000000000127e+00 -3.215625000000000000e+01 +1.078590000000000160e+00 -3.215625000000000000e+01 +1.078595000000000192e+00 -3.215625000000000000e+01 +1.078600000000000003e+00 -3.209375381469726562e+01 +1.078605000000000036e+00 -3.209375381469726562e+01 +1.078610000000000069e+00 -3.209375381469726562e+01 +1.078615000000000101e+00 -3.209375381469726562e+01 +1.078620000000000134e+00 -3.203125000000000000e+01 +1.078625000000000167e+00 -3.206250000000000000e+01 +1.078629999999999978e+00 -3.209375381469726562e+01 +1.078635000000000010e+00 -3.209375381469726562e+01 +1.078640000000000043e+00 -3.212500000000000000e+01 +1.078645000000000076e+00 -3.206250000000000000e+01 +1.078650000000000109e+00 -3.206250000000000000e+01 +1.078655000000000141e+00 -3.203125000000000000e+01 +1.078660000000000174e+00 -3.209375381469726562e+01 +1.078664999999999985e+00 -3.206250000000000000e+01 +1.078670000000000018e+00 -3.209375381469726562e+01 +1.078675000000000050e+00 -3.203125000000000000e+01 +1.078680000000000083e+00 -3.203125000000000000e+01 +1.078685000000000116e+00 -3.203125000000000000e+01 +1.078690000000000149e+00 -3.203125000000000000e+01 +1.078695000000000181e+00 -3.206250000000000000e+01 +1.078699999999999992e+00 -3.203125000000000000e+01 +1.078705000000000025e+00 -3.200000000000000000e+01 +1.078710000000000058e+00 -3.203125000000000000e+01 +1.078715000000000090e+00 -3.203125000000000000e+01 +1.078720000000000123e+00 -3.203125000000000000e+01 +1.078725000000000156e+00 -3.203125000000000000e+01 +1.078730000000000189e+00 -3.203125000000000000e+01 +1.078734999999999999e+00 -3.203125000000000000e+01 +1.078740000000000032e+00 -3.203125000000000000e+01 +1.078745000000000065e+00 -3.203125000000000000e+01 +1.078750000000000098e+00 -3.203125000000000000e+01 +1.078755000000000130e+00 -3.203125000000000000e+01 +1.078760000000000163e+00 -3.203125000000000000e+01 +1.078765000000000196e+00 -3.203125000000000000e+01 +1.078770000000000007e+00 -3.203125000000000000e+01 +1.078775000000000039e+00 -3.203125000000000000e+01 +1.078780000000000072e+00 -3.203125000000000000e+01 +1.078785000000000105e+00 -3.203125000000000000e+01 +1.078790000000000138e+00 -3.203125000000000000e+01 +1.078795000000000170e+00 -3.203125000000000000e+01 +1.078799999999999981e+00 -3.196875000000000000e+01 +1.078805000000000014e+00 -3.203125000000000000e+01 +1.078810000000000047e+00 -3.203125000000000000e+01 +1.078815000000000079e+00 -3.203125000000000000e+01 +1.078820000000000112e+00 -3.203125000000000000e+01 +1.078825000000000145e+00 -3.203125000000000000e+01 +1.078830000000000178e+00 -3.200000000000000000e+01 +1.078834999999999988e+00 -3.203125000000000000e+01 +1.078840000000000021e+00 -3.203125000000000000e+01 +1.078845000000000054e+00 -3.196875000000000000e+01 +1.078850000000000087e+00 -3.200000000000000000e+01 +1.078855000000000119e+00 -3.203125000000000000e+01 +1.078860000000000152e+00 -3.190625000000000000e+01 +1.078865000000000185e+00 -3.193750190734863281e+01 +1.078869999999999996e+00 -3.196875000000000000e+01 +1.078875000000000028e+00 -3.196875000000000000e+01 +1.078880000000000061e+00 -3.196875000000000000e+01 +1.078885000000000094e+00 -3.196875000000000000e+01 +1.078890000000000127e+00 -3.203125000000000000e+01 +1.078895000000000159e+00 -3.193750190734863281e+01 +1.078900000000000192e+00 -3.196875000000000000e+01 +1.078905000000000003e+00 -3.200000000000000000e+01 +1.078910000000000036e+00 -3.193750190734863281e+01 +1.078915000000000068e+00 -3.193750190734863281e+01 +1.078920000000000101e+00 -3.193750190734863281e+01 +1.078925000000000134e+00 -3.190625000000000000e+01 +1.078930000000000167e+00 -3.193750190734863281e+01 +1.078934999999999977e+00 -3.193750190734863281e+01 +1.078940000000000010e+00 -3.187500000000000000e+01 +1.078945000000000043e+00 -3.193750190734863281e+01 +1.078950000000000076e+00 -3.190625000000000000e+01 +1.078955000000000108e+00 -3.193750190734863281e+01 +1.078960000000000141e+00 -3.187500000000000000e+01 +1.078965000000000174e+00 -3.187500000000000000e+01 +1.078969999999999985e+00 -3.184375190734863281e+01 +1.078975000000000017e+00 -3.190625000000000000e+01 +1.078980000000000050e+00 -3.193750190734863281e+01 +1.078985000000000083e+00 -3.187500000000000000e+01 +1.078990000000000116e+00 -3.184375190734863281e+01 +1.078995000000000148e+00 -3.184375190734863281e+01 +1.079000000000000181e+00 -3.184375190734863281e+01 +1.079004999999999992e+00 -3.181250000000000000e+01 +1.079010000000000025e+00 -3.187500000000000000e+01 +1.079015000000000057e+00 -3.184375190734863281e+01 +1.079020000000000090e+00 -3.184375190734863281e+01 +1.079025000000000123e+00 -3.187500000000000000e+01 +1.079030000000000156e+00 -3.187500000000000000e+01 +1.079035000000000188e+00 -3.181250000000000000e+01 +1.079039999999999999e+00 -3.181250000000000000e+01 +1.079045000000000032e+00 -3.184375190734863281e+01 +1.079050000000000065e+00 -3.184375190734863281e+01 +1.079055000000000097e+00 -3.178125190734863281e+01 +1.079060000000000130e+00 -3.181250000000000000e+01 +1.079065000000000163e+00 -3.181250000000000000e+01 +1.079070000000000196e+00 -3.181250000000000000e+01 +1.079075000000000006e+00 -3.175000190734863281e+01 +1.079080000000000039e+00 -3.175000190734863281e+01 +1.079085000000000072e+00 -3.178125190734863281e+01 +1.079090000000000105e+00 -3.175000190734863281e+01 +1.079095000000000137e+00 -3.175000190734863281e+01 +1.079100000000000170e+00 -3.171875000000000000e+01 +1.079104999999999981e+00 -3.175000190734863281e+01 +1.079110000000000014e+00 -3.168750190734863281e+01 +1.079115000000000046e+00 -3.168750190734863281e+01 +1.079120000000000079e+00 -3.171875000000000000e+01 +1.079125000000000112e+00 -3.168750190734863281e+01 +1.079130000000000145e+00 -3.171875000000000000e+01 +1.079135000000000177e+00 -3.168750190734863281e+01 +1.079139999999999988e+00 -3.178125190734863281e+01 +1.079145000000000021e+00 -3.181250000000000000e+01 +1.079150000000000054e+00 -3.175000190734863281e+01 +1.079155000000000086e+00 -3.175000190734863281e+01 +1.079160000000000119e+00 -3.171875000000000000e+01 +1.079165000000000152e+00 -3.178125190734863281e+01 +1.079170000000000185e+00 -3.178125190734863281e+01 +1.079174999999999995e+00 -3.171875000000000000e+01 +1.079180000000000028e+00 -3.171875000000000000e+01 +1.079185000000000061e+00 -3.175000190734863281e+01 +1.079190000000000094e+00 -3.171875000000000000e+01 +1.079195000000000126e+00 -3.175000190734863281e+01 +1.079200000000000159e+00 -3.171875000000000000e+01 +1.079205000000000192e+00 -3.168750190734863281e+01 +1.079210000000000003e+00 -3.165625000000000000e+01 +1.079215000000000035e+00 -3.171875000000000000e+01 +1.079220000000000068e+00 -3.168750190734863281e+01 +1.079225000000000101e+00 -3.171875000000000000e+01 +1.079230000000000134e+00 -3.168750190734863281e+01 +1.079235000000000166e+00 -3.168750190734863281e+01 +1.079240000000000199e+00 -3.165625000000000000e+01 +1.079245000000000010e+00 -3.168750190734863281e+01 +1.079250000000000043e+00 -3.165625000000000000e+01 +1.079255000000000075e+00 -3.168750190734863281e+01 +1.079260000000000108e+00 -3.165625000000000000e+01 +1.079265000000000141e+00 -3.168750190734863281e+01 +1.079270000000000174e+00 -3.168750190734863281e+01 +1.079274999999999984e+00 -3.165625000000000000e+01 +1.079280000000000017e+00 -3.168750190734863281e+01 +1.079285000000000050e+00 -3.165625000000000000e+01 +1.079290000000000083e+00 -3.165625000000000000e+01 +1.079295000000000115e+00 -3.165625000000000000e+01 +1.079300000000000148e+00 -3.165625000000000000e+01 +1.079305000000000181e+00 -3.162499809265136719e+01 +1.079309999999999992e+00 -3.162499809265136719e+01 +1.079315000000000024e+00 -3.162499809265136719e+01 +1.079320000000000057e+00 -3.168750190734863281e+01 +1.079325000000000090e+00 -3.165625000000000000e+01 +1.079330000000000123e+00 -3.168750190734863281e+01 +1.079335000000000155e+00 -3.165625000000000000e+01 +1.079340000000000188e+00 -3.162499809265136719e+01 +1.079344999999999999e+00 -3.165625000000000000e+01 +1.079350000000000032e+00 -3.156250000000000000e+01 +1.079355000000000064e+00 -3.162499809265136719e+01 +1.079360000000000097e+00 -3.162499809265136719e+01 +1.079365000000000130e+00 -3.159375190734863281e+01 +1.079370000000000163e+00 -3.159375190734863281e+01 +1.079375000000000195e+00 -3.159375190734863281e+01 +1.079380000000000006e+00 -3.159375190734863281e+01 +1.079385000000000039e+00 -3.156250000000000000e+01 +1.079390000000000072e+00 -3.153125190734863281e+01 +1.079395000000000104e+00 -3.153125190734863281e+01 +1.079400000000000137e+00 -3.159375190734863281e+01 +1.079405000000000170e+00 -3.159375190734863281e+01 +1.079409999999999981e+00 -3.156250000000000000e+01 +1.079415000000000013e+00 -3.146875000000000000e+01 +1.079420000000000046e+00 -3.153125190734863281e+01 +1.079425000000000079e+00 -3.153125190734863281e+01 +1.079430000000000112e+00 -3.150000000000000000e+01 +1.079435000000000144e+00 -3.150000000000000000e+01 +1.079440000000000177e+00 -3.150000000000000000e+01 +1.079444999999999988e+00 -3.146875000000000000e+01 +1.079450000000000021e+00 -3.150000000000000000e+01 +1.079455000000000053e+00 -3.153125190734863281e+01 +1.079460000000000086e+00 -3.150000000000000000e+01 +1.079465000000000119e+00 -3.150000000000000000e+01 +1.079470000000000152e+00 -3.150000000000000000e+01 +1.079475000000000184e+00 -3.150000000000000000e+01 +1.079479999999999995e+00 -3.146875000000000000e+01 +1.079485000000000028e+00 -3.146875000000000000e+01 +1.079490000000000061e+00 -3.143750190734863281e+01 +1.079495000000000093e+00 -3.150000000000000000e+01 +1.079500000000000126e+00 -3.146875000000000000e+01 +1.079505000000000159e+00 -3.143750190734863281e+01 +1.079510000000000192e+00 -3.146875000000000000e+01 +1.079515000000000002e+00 -3.143750190734863281e+01 +1.079520000000000035e+00 -3.146875000000000000e+01 +1.079525000000000068e+00 -3.146875000000000000e+01 +1.079530000000000101e+00 -3.146875000000000000e+01 +1.079535000000000133e+00 -3.146875000000000000e+01 +1.079540000000000166e+00 -3.137500190734863281e+01 +1.079545000000000199e+00 -3.143750190734863281e+01 +1.079550000000000010e+00 -3.137500190734863281e+01 +1.079555000000000042e+00 -3.140625000000000000e+01 +1.079560000000000075e+00 -3.137500190734863281e+01 +1.079565000000000108e+00 -3.143750190734863281e+01 +1.079570000000000141e+00 -3.137500190734863281e+01 +1.079575000000000173e+00 -3.137500190734863281e+01 +1.079579999999999984e+00 -3.134375000000000000e+01 +1.079585000000000017e+00 -3.134375000000000000e+01 +1.079590000000000050e+00 -3.137500190734863281e+01 +1.079595000000000082e+00 -3.134375000000000000e+01 +1.079600000000000115e+00 -3.134375000000000000e+01 +1.079605000000000148e+00 -3.137500190734863281e+01 +1.079610000000000181e+00 -3.125000000000000000e+01 +1.079614999999999991e+00 -3.134375000000000000e+01 +1.079620000000000024e+00 -3.128125190734863281e+01 +1.079625000000000057e+00 -3.128125190734863281e+01 +1.079630000000000090e+00 -3.137500190734863281e+01 +1.079635000000000122e+00 -3.128125190734863281e+01 +1.079640000000000155e+00 -3.134375000000000000e+01 +1.079645000000000188e+00 -3.131250000000000000e+01 +1.079649999999999999e+00 -3.131250000000000000e+01 +1.079655000000000031e+00 -3.131250000000000000e+01 +1.079660000000000064e+00 -3.128125190734863281e+01 +1.079665000000000097e+00 -3.128125190734863281e+01 +1.079670000000000130e+00 -3.128125190734863281e+01 +1.079675000000000162e+00 -3.125000000000000000e+01 +1.079680000000000195e+00 -3.121875000000000000e+01 +1.079685000000000006e+00 -3.128125190734863281e+01 +1.079690000000000039e+00 -3.128125190734863281e+01 +1.079695000000000071e+00 -3.128125190734863281e+01 +1.079700000000000104e+00 -3.128125190734863281e+01 +1.079705000000000137e+00 -3.131250000000000000e+01 +1.079710000000000170e+00 -3.128125190734863281e+01 +1.079714999999999980e+00 -3.125000000000000000e+01 +1.079720000000000013e+00 -3.121875000000000000e+01 +1.079725000000000046e+00 -3.121875000000000000e+01 +1.079730000000000079e+00 -3.118750000000000000e+01 +1.079735000000000111e+00 -3.121875000000000000e+01 +1.079740000000000144e+00 -3.112500190734863281e+01 +1.079745000000000177e+00 -3.118750000000000000e+01 +1.079749999999999988e+00 -3.115625190734863281e+01 +1.079755000000000020e+00 -3.125000000000000000e+01 +1.079760000000000053e+00 -3.118750000000000000e+01 +1.079765000000000086e+00 -3.118750000000000000e+01 +1.079770000000000119e+00 -3.115625190734863281e+01 +1.079775000000000151e+00 -3.115625190734863281e+01 +1.079780000000000184e+00 -3.115625190734863281e+01 +1.079784999999999995e+00 -3.115625190734863281e+01 +1.079790000000000028e+00 -3.118750000000000000e+01 +1.079795000000000060e+00 -3.118750000000000000e+01 +1.079800000000000093e+00 -3.118750000000000000e+01 +1.079805000000000126e+00 -3.118750000000000000e+01 +1.079810000000000159e+00 -3.115625190734863281e+01 +1.079815000000000191e+00 -3.112500190734863281e+01 +1.079820000000000002e+00 -3.121875000000000000e+01 +1.079825000000000035e+00 -3.121875000000000000e+01 +1.079830000000000068e+00 -3.118750000000000000e+01 +1.079835000000000100e+00 -3.118750000000000000e+01 +1.079840000000000133e+00 -3.118750000000000000e+01 +1.079845000000000166e+00 -3.115625190734863281e+01 +1.079850000000000199e+00 -3.112500190734863281e+01 +1.079855000000000009e+00 -3.118750000000000000e+01 +1.079860000000000042e+00 -3.112500190734863281e+01 +1.079865000000000075e+00 -3.115625190734863281e+01 +1.079870000000000108e+00 -3.121875000000000000e+01 +1.079875000000000140e+00 -3.115625190734863281e+01 +1.079880000000000173e+00 -3.118750000000000000e+01 +1.079884999999999984e+00 -3.118750000000000000e+01 +1.079890000000000017e+00 -3.121875000000000000e+01 +1.079895000000000049e+00 -3.118750000000000000e+01 +1.079900000000000082e+00 -3.115625190734863281e+01 +1.079905000000000115e+00 -3.109375000000000000e+01 +1.079910000000000148e+00 -3.115625190734863281e+01 +1.079915000000000180e+00 -3.115625190734863281e+01 +1.079919999999999991e+00 -3.112500190734863281e+01 +1.079925000000000024e+00 -3.109375000000000000e+01 +1.079930000000000057e+00 -3.112500190734863281e+01 +1.079935000000000089e+00 -3.109375000000000000e+01 +1.079940000000000122e+00 -3.112500190734863281e+01 +1.079945000000000155e+00 -3.115625190734863281e+01 +1.079950000000000188e+00 -3.109375000000000000e+01 +1.079954999999999998e+00 -3.100000190734863281e+01 +1.079960000000000031e+00 -3.109375000000000000e+01 +1.079965000000000064e+00 -3.106250000000000000e+01 +1.079970000000000097e+00 -3.106250000000000000e+01 +1.079975000000000129e+00 -3.103125000000000000e+01 +1.079980000000000162e+00 -3.103125000000000000e+01 +1.079985000000000195e+00 -3.106250000000000000e+01 +1.079990000000000006e+00 -3.106250000000000000e+01 +1.079995000000000038e+00 -3.103125000000000000e+01 +1.080000000000000071e+00 -3.103125000000000000e+01 +1.080005000000000104e+00 -3.100000190734863281e+01 +1.080010000000000137e+00 -3.103125000000000000e+01 +1.080015000000000169e+00 -3.103125000000000000e+01 +1.080019999999999980e+00 -3.103125000000000000e+01 +1.080025000000000013e+00 -3.103125000000000000e+01 +1.080030000000000046e+00 -3.106250000000000000e+01 +1.080035000000000078e+00 -3.100000190734863281e+01 +1.080040000000000111e+00 -3.106250000000000000e+01 +1.080045000000000144e+00 -3.100000190734863281e+01 +1.080050000000000177e+00 -3.106250000000000000e+01 +1.080054999999999987e+00 -3.100000190734863281e+01 +1.080060000000000020e+00 -3.100000190734863281e+01 +1.080065000000000053e+00 -3.100000190734863281e+01 +1.080070000000000086e+00 -3.103125000000000000e+01 +1.080075000000000118e+00 -3.096875000000000000e+01 +1.080080000000000151e+00 -3.096875000000000000e+01 +1.080085000000000184e+00 -3.096875000000000000e+01 +1.080089999999999995e+00 -3.100000190734863281e+01 +1.080095000000000027e+00 -3.096875000000000000e+01 +1.080100000000000060e+00 -3.090625000000000000e+01 +1.080105000000000093e+00 -3.093750000000000000e+01 +1.080110000000000126e+00 -3.096875000000000000e+01 +1.080115000000000158e+00 -3.100000190734863281e+01 +1.080120000000000191e+00 -3.096875000000000000e+01 +1.080125000000000002e+00 -3.087500190734863281e+01 +1.080130000000000035e+00 -3.090625000000000000e+01 +1.080135000000000067e+00 -3.093750000000000000e+01 +1.080140000000000100e+00 -3.087500190734863281e+01 +1.080145000000000133e+00 -3.090625000000000000e+01 +1.080150000000000166e+00 -3.087500190734863281e+01 +1.080155000000000198e+00 -3.084375190734863281e+01 +1.080160000000000009e+00 -3.090625000000000000e+01 +1.080165000000000042e+00 -3.087500190734863281e+01 +1.080170000000000075e+00 -3.087500190734863281e+01 +1.080175000000000107e+00 -3.084375190734863281e+01 +1.080180000000000140e+00 -3.081250000000000000e+01 +1.080185000000000173e+00 -3.084375190734863281e+01 +1.080189999999999984e+00 -3.087500190734863281e+01 +1.080195000000000016e+00 -3.078125000000000000e+01 +1.080200000000000049e+00 -3.084375190734863281e+01 +1.080205000000000082e+00 -3.084375190734863281e+01 +1.080210000000000115e+00 -3.078125000000000000e+01 +1.080215000000000147e+00 -3.084375190734863281e+01 +1.080220000000000180e+00 -3.081250000000000000e+01 +1.080224999999999991e+00 -3.081250000000000000e+01 +1.080230000000000024e+00 -3.078125000000000000e+01 +1.080235000000000056e+00 -3.084375190734863281e+01 +1.080240000000000089e+00 -3.078125000000000000e+01 +1.080245000000000122e+00 -3.081250000000000000e+01 +1.080250000000000155e+00 -3.081250000000000000e+01 +1.080255000000000187e+00 -3.084375190734863281e+01 +1.080259999999999998e+00 -3.081250000000000000e+01 +1.080265000000000031e+00 -3.081250000000000000e+01 +1.080270000000000064e+00 -3.084375190734863281e+01 +1.080275000000000096e+00 -3.084375190734863281e+01 +1.080280000000000129e+00 -3.087500190734863281e+01 +1.080285000000000162e+00 -3.078125000000000000e+01 +1.080290000000000195e+00 -3.078125000000000000e+01 +1.080295000000000005e+00 -3.071875190734863281e+01 +1.080300000000000038e+00 -3.084375190734863281e+01 +1.080305000000000071e+00 -3.078125000000000000e+01 +1.080310000000000104e+00 -3.078125000000000000e+01 +1.080315000000000136e+00 -3.081250000000000000e+01 +1.080320000000000169e+00 -3.075000000000000000e+01 +1.080324999999999980e+00 -3.071875190734863281e+01 +1.080330000000000013e+00 -3.068750000000000000e+01 +1.080335000000000045e+00 -3.071875190734863281e+01 +1.080340000000000078e+00 -3.071875190734863281e+01 +1.080345000000000111e+00 -3.068750000000000000e+01 +1.080350000000000144e+00 -3.071875190734863281e+01 +1.080355000000000176e+00 -3.071875190734863281e+01 +1.080359999999999987e+00 -3.071875190734863281e+01 +1.080365000000000020e+00 -3.078125000000000000e+01 +1.080370000000000053e+00 -3.068750000000000000e+01 +1.080375000000000085e+00 -3.075000000000000000e+01 +1.080380000000000118e+00 -3.071875190734863281e+01 +1.080385000000000151e+00 -3.075000000000000000e+01 +1.080390000000000184e+00 -3.071875190734863281e+01 +1.080394999999999994e+00 -3.078125000000000000e+01 +1.080400000000000027e+00 -3.068750000000000000e+01 +1.080405000000000060e+00 -3.071875190734863281e+01 +1.080410000000000093e+00 -3.065625000000000000e+01 +1.080415000000000125e+00 -3.065625000000000000e+01 +1.080420000000000158e+00 -3.065625000000000000e+01 +1.080425000000000191e+00 -3.065625000000000000e+01 +1.080430000000000001e+00 -3.065625000000000000e+01 +1.080435000000000034e+00 -3.062500000000000000e+01 +1.080440000000000067e+00 -3.065625000000000000e+01 +1.080445000000000100e+00 -3.065625000000000000e+01 +1.080450000000000133e+00 -3.056250190734863281e+01 +1.080455000000000165e+00 -3.056250190734863281e+01 +1.080460000000000198e+00 -3.053125000000000000e+01 +1.080465000000000009e+00 -3.056250190734863281e+01 +1.080470000000000041e+00 -3.056250190734863281e+01 +1.080475000000000074e+00 -3.056250190734863281e+01 +1.080480000000000107e+00 -3.050000000000000000e+01 +1.080485000000000140e+00 -3.056250190734863281e+01 +1.080490000000000173e+00 -3.053125000000000000e+01 +1.080494999999999983e+00 -3.053125000000000000e+01 +1.080500000000000016e+00 -3.053125000000000000e+01 +1.080505000000000049e+00 -3.050000000000000000e+01 +1.080510000000000081e+00 -3.050000000000000000e+01 +1.080515000000000114e+00 -3.050000000000000000e+01 +1.080520000000000147e+00 -3.053125000000000000e+01 +1.080525000000000180e+00 -3.046875000000000000e+01 +1.080529999999999990e+00 -3.050000000000000000e+01 +1.080535000000000023e+00 -3.050000000000000000e+01 +1.080540000000000056e+00 -3.046875000000000000e+01 +1.080545000000000089e+00 -3.050000000000000000e+01 +1.080550000000000122e+00 -3.043750190734863281e+01 +1.080555000000000154e+00 -3.046875000000000000e+01 +1.080560000000000187e+00 -3.043750190734863281e+01 +1.080564999999999998e+00 -3.046875000000000000e+01 +1.080570000000000030e+00 -3.046875000000000000e+01 +1.080575000000000063e+00 -3.040625190734863281e+01 +1.080580000000000096e+00 -3.037500000000000000e+01 +1.080585000000000129e+00 -3.043750190734863281e+01 +1.080590000000000162e+00 -3.040625190734863281e+01 +1.080595000000000194e+00 -3.040625190734863281e+01 +1.080600000000000005e+00 -3.037500000000000000e+01 +1.080605000000000038e+00 -3.034375000000000000e+01 +1.080610000000000070e+00 -3.034375000000000000e+01 +1.080615000000000103e+00 -3.040625190734863281e+01 +1.080620000000000136e+00 -3.034375000000000000e+01 +1.080625000000000169e+00 -3.037500000000000000e+01 +1.080629999999999979e+00 -3.034375000000000000e+01 +1.080635000000000012e+00 -3.040625190734863281e+01 +1.080640000000000045e+00 -3.031250000000000000e+01 +1.080645000000000078e+00 -3.031250000000000000e+01 +1.080650000000000110e+00 -3.031250000000000000e+01 +1.080655000000000143e+00 -3.025000000000000000e+01 +1.080660000000000176e+00 -3.028125190734863281e+01 +1.080664999999999987e+00 -3.028125190734863281e+01 +1.080670000000000019e+00 -3.021875000000000000e+01 +1.080675000000000052e+00 -3.028125190734863281e+01 +1.080680000000000085e+00 -3.028125190734863281e+01 +1.080685000000000118e+00 -3.025000000000000000e+01 +1.080690000000000150e+00 -3.025000000000000000e+01 +1.080695000000000183e+00 -3.021875000000000000e+01 +1.080699999999999994e+00 -3.021875000000000000e+01 +1.080705000000000027e+00 -3.025000000000000000e+01 +1.080710000000000059e+00 -3.018750000000000000e+01 +1.080715000000000092e+00 -3.025000000000000000e+01 +1.080720000000000125e+00 -3.021875000000000000e+01 +1.080725000000000158e+00 -3.015625190734863281e+01 +1.080730000000000190e+00 -3.018750000000000000e+01 +1.080735000000000001e+00 -3.012500190734863281e+01 +1.080740000000000034e+00 -3.015625190734863281e+01 +1.080745000000000067e+00 -3.015625190734863281e+01 +1.080750000000000099e+00 -3.015625190734863281e+01 +1.080755000000000132e+00 -3.012500190734863281e+01 +1.080760000000000165e+00 -3.015625190734863281e+01 +1.080765000000000198e+00 -3.006250000000000000e+01 +1.080770000000000008e+00 -3.015625190734863281e+01 +1.080775000000000041e+00 -3.009375000000000000e+01 +1.080780000000000074e+00 -3.015625190734863281e+01 +1.080785000000000107e+00 -3.012500190734863281e+01 +1.080790000000000139e+00 -3.015625190734863281e+01 +1.080795000000000172e+00 -3.006250000000000000e+01 +1.080799999999999983e+00 -3.009375000000000000e+01 +1.080805000000000016e+00 -3.006250000000000000e+01 +1.080810000000000048e+00 -3.006250000000000000e+01 +1.080815000000000081e+00 -3.015625190734863281e+01 +1.080820000000000114e+00 -3.009375000000000000e+01 +1.080825000000000147e+00 -3.009375000000000000e+01 +1.080830000000000179e+00 -3.000000190734863281e+01 +1.080834999999999990e+00 -3.000000190734863281e+01 +1.080840000000000023e+00 -3.003125000000000000e+01 +1.080845000000000056e+00 -3.003125000000000000e+01 +1.080850000000000088e+00 -3.006250000000000000e+01 +1.080855000000000121e+00 -3.003125000000000000e+01 +1.080860000000000154e+00 -3.003125000000000000e+01 +1.080865000000000187e+00 -2.993750000000000000e+01 +1.080869999999999997e+00 -3.000000190734863281e+01 +1.080875000000000030e+00 -2.996875190734863281e+01 +1.080880000000000063e+00 -2.996875190734863281e+01 +1.080885000000000096e+00 -3.000000190734863281e+01 +1.080890000000000128e+00 -2.996875190734863281e+01 +1.080895000000000161e+00 -2.996875190734863281e+01 +1.080900000000000194e+00 -3.000000190734863281e+01 +1.080905000000000005e+00 -3.003125000000000000e+01 +1.080910000000000037e+00 -2.996875190734863281e+01 +1.080915000000000070e+00 -2.996875190734863281e+01 +1.080920000000000103e+00 -2.993750000000000000e+01 +1.080925000000000136e+00 -2.993750000000000000e+01 +1.080930000000000168e+00 -2.996875190734863281e+01 +1.080934999999999979e+00 -2.993750000000000000e+01 +1.080940000000000012e+00 -2.990625000000000000e+01 +1.080945000000000045e+00 -2.993750000000000000e+01 +1.080950000000000077e+00 -2.990625000000000000e+01 +1.080955000000000110e+00 -2.990625000000000000e+01 +1.080960000000000143e+00 -2.990625000000000000e+01 +1.080965000000000176e+00 -2.984375190734863281e+01 +1.080969999999999986e+00 -2.993750000000000000e+01 +1.080975000000000019e+00 -2.990625000000000000e+01 +1.080980000000000052e+00 -2.987500000000000000e+01 +1.080985000000000085e+00 -2.990625000000000000e+01 +1.080990000000000117e+00 -2.984375190734863281e+01 +1.080995000000000150e+00 -2.981250000000000000e+01 +1.081000000000000183e+00 -2.981250000000000000e+01 +1.081004999999999994e+00 -2.975000000000000000e+01 +1.081010000000000026e+00 -2.981250000000000000e+01 +1.081015000000000059e+00 -2.978125000000000000e+01 +1.081020000000000092e+00 -2.971875190734863281e+01 +1.081025000000000125e+00 -2.981250000000000000e+01 +1.081030000000000157e+00 -2.978125000000000000e+01 +1.081035000000000190e+00 -2.975000000000000000e+01 +1.081040000000000001e+00 -2.975000000000000000e+01 +1.081045000000000034e+00 -2.975000000000000000e+01 +1.081050000000000066e+00 -2.968750190734863281e+01 +1.081055000000000099e+00 -2.971875190734863281e+01 +1.081060000000000132e+00 -2.968750190734863281e+01 +1.081065000000000165e+00 -2.965625000000000000e+01 +1.081070000000000197e+00 -2.968750190734863281e+01 +1.081075000000000008e+00 -2.962500000000000000e+01 +1.081080000000000041e+00 -2.965625000000000000e+01 +1.081085000000000074e+00 -2.965625000000000000e+01 +1.081090000000000106e+00 -2.965625000000000000e+01 +1.081095000000000139e+00 -2.959375000000000000e+01 +1.081100000000000172e+00 -2.956250190734863281e+01 +1.081104999999999983e+00 -2.962500000000000000e+01 +1.081110000000000015e+00 -2.956250190734863281e+01 +1.081115000000000048e+00 -2.959375000000000000e+01 +1.081120000000000081e+00 -2.950000000000000000e+01 +1.081125000000000114e+00 -2.946875000000000000e+01 +1.081130000000000146e+00 -2.946875000000000000e+01 +1.081135000000000179e+00 -2.950000000000000000e+01 +1.081139999999999990e+00 -2.943750190734863281e+01 +1.081145000000000023e+00 -2.940625190734863281e+01 +1.081150000000000055e+00 -2.940625190734863281e+01 +1.081155000000000088e+00 -2.950000000000000000e+01 +1.081160000000000121e+00 -2.940625190734863281e+01 +1.081165000000000154e+00 -2.940625190734863281e+01 +1.081170000000000186e+00 -2.943750190734863281e+01 +1.081174999999999997e+00 -2.940625190734863281e+01 +1.081180000000000030e+00 -2.940625190734863281e+01 +1.081185000000000063e+00 -2.931250000000000000e+01 +1.081190000000000095e+00 -2.931250000000000000e+01 +1.081195000000000128e+00 -2.931250000000000000e+01 +1.081200000000000161e+00 -2.928125190734863281e+01 +1.081205000000000194e+00 -2.928125190734863281e+01 +1.081210000000000004e+00 -2.934375000000000000e+01 +1.081215000000000037e+00 -2.928125190734863281e+01 +1.081220000000000070e+00 -2.921875000000000000e+01 +1.081225000000000103e+00 -2.928125190734863281e+01 +1.081230000000000135e+00 -2.918750000000000000e+01 +1.081235000000000168e+00 -2.921875000000000000e+01 +1.081239999999999979e+00 -2.918750000000000000e+01 +1.081245000000000012e+00 -2.915625000000000000e+01 +1.081250000000000044e+00 -2.921875000000000000e+01 +1.081255000000000077e+00 -2.915625000000000000e+01 +1.081260000000000110e+00 -2.903125000000000000e+01 +1.081265000000000143e+00 -2.912500190734863281e+01 +1.081270000000000175e+00 -2.909375000000000000e+01 +1.081274999999999986e+00 -2.903125000000000000e+01 +1.081280000000000019e+00 -2.900000190734863281e+01 +1.081285000000000052e+00 -2.903125000000000000e+01 +1.081290000000000084e+00 -2.903125000000000000e+01 +1.081295000000000117e+00 -2.900000190734863281e+01 +1.081300000000000150e+00 -2.896875190734863281e+01 +1.081305000000000183e+00 -2.890625000000000000e+01 +1.081309999999999993e+00 -2.884375190734863281e+01 +1.081315000000000026e+00 -2.884375190734863281e+01 +1.081320000000000059e+00 -2.868750190734863281e+01 +1.081325000000000092e+00 -2.868750190734863281e+01 +1.081330000000000124e+00 -2.850000000000000000e+01 +1.081335000000000157e+00 -2.834375000000000000e+01 +1.081340000000000190e+00 -2.821875000000000000e+01 +1.081345000000000001e+00 -2.800000000000000000e+01 +1.081350000000000033e+00 -2.784375190734863281e+01 +1.081355000000000066e+00 -2.765625000000000000e+01 +1.081360000000000099e+00 -2.734375000000000000e+01 +1.081365000000000132e+00 -2.715625000000000000e+01 +1.081370000000000164e+00 -2.684375000000000000e+01 +1.081375000000000197e+00 -2.646875000000000000e+01 +1.081380000000000008e+00 -2.609375190734863281e+01 +1.081385000000000041e+00 -2.571875000000000000e+01 +1.081390000000000073e+00 -2.531250000000000000e+01 +1.081395000000000106e+00 -2.484375000000000000e+01 +1.081400000000000139e+00 -2.443750000000000000e+01 +1.081405000000000172e+00 -2.384375000000000000e+01 +1.081409999999999982e+00 -2.321875000000000000e+01 +1.081415000000000015e+00 -2.262500190734863281e+01 +1.081420000000000048e+00 -2.187500000000000000e+01 +1.081425000000000081e+00 -2.115625000000000000e+01 +1.081430000000000113e+00 -2.046875190734863281e+01 +1.081435000000000146e+00 -1.953125000000000000e+01 +1.081440000000000179e+00 -1.878125000000000000e+01 +1.081444999999999990e+00 -1.784375190734863281e+01 +1.081450000000000022e+00 -1.687500000000000000e+01 +1.081455000000000055e+00 -1.593750000000000000e+01 +1.081460000000000088e+00 -1.500000095367431641e+01 +1.081465000000000121e+00 -1.390625095367431641e+01 +1.081470000000000153e+00 -1.296875095367431641e+01 +1.081475000000000186e+00 -1.196875095367431641e+01 +1.081479999999999997e+00 -1.093750000000000000e+01 +1.081485000000000030e+00 -9.968750000000000000e+00 +1.081490000000000062e+00 -8.937500000000000000e+00 +1.081495000000000095e+00 -7.906249523162841797e+00 +1.081500000000000128e+00 -6.968750000000000000e+00 +1.081505000000000161e+00 -6.000000000000000000e+00 +1.081510000000000193e+00 -5.093750000000000000e+00 +1.081515000000000004e+00 -4.156250000000000000e+00 +1.081520000000000037e+00 -3.281250238418579102e+00 +1.081525000000000070e+00 -2.312500000000000000e+00 +1.081530000000000102e+00 -1.437500000000000000e+00 +1.081535000000000135e+00 -6.250000000000000000e-01 +1.081540000000000168e+00 2.500000000000000000e-01 +1.081544999999999979e+00 1.000000000000000000e+00 +1.081550000000000011e+00 1.781250000000000000e+00 +1.081555000000000044e+00 2.593750238418579102e+00 +1.081560000000000077e+00 3.343750000000000000e+00 +1.081565000000000110e+00 4.125000000000000000e+00 +1.081570000000000142e+00 4.812500000000000000e+00 +1.081575000000000175e+00 5.406250476837158203e+00 +1.081579999999999986e+00 6.125000476837158203e+00 +1.081585000000000019e+00 6.843750476837158203e+00 +1.081590000000000051e+00 7.437500000000000000e+00 +1.081595000000000084e+00 8.062500953674316406e+00 +1.081600000000000117e+00 8.656250000000000000e+00 +1.081605000000000150e+00 9.218750953674316406e+00 +1.081610000000000182e+00 9.812500000000000000e+00 +1.081614999999999993e+00 1.037500095367431641e+01 +1.081620000000000026e+00 1.093750000000000000e+01 +1.081625000000000059e+00 1.137500095367431641e+01 +1.081630000000000091e+00 1.190625000000000000e+01 +1.081635000000000124e+00 1.234375000000000000e+01 +1.081640000000000157e+00 1.281250000000000000e+01 +1.081645000000000190e+00 1.328125000000000000e+01 +1.081650000000000000e+00 1.365625000000000000e+01 +1.081655000000000033e+00 1.406250095367431641e+01 +1.081660000000000066e+00 1.456250095367431641e+01 +1.081665000000000099e+00 1.487500000000000000e+01 +1.081670000000000131e+00 1.525000000000000000e+01 +1.081675000000000164e+00 1.562500000000000000e+01 +1.081680000000000197e+00 1.600000000000000000e+01 +1.081685000000000008e+00 1.628125000000000000e+01 +1.081690000000000040e+00 1.656250190734863281e+01 +1.081695000000000073e+00 1.700000000000000000e+01 +1.081700000000000106e+00 1.721875000000000000e+01 +1.081705000000000139e+00 1.743750000000000000e+01 +1.081710000000000171e+00 1.771875190734863281e+01 +1.081714999999999982e+00 1.800000190734863281e+01 +1.081720000000000015e+00 1.821875000000000000e+01 +1.081725000000000048e+00 1.843750190734863281e+01 +1.081730000000000080e+00 1.862500000000000000e+01 +1.081735000000000113e+00 1.887500190734863281e+01 +1.081740000000000146e+00 1.900000190734863281e+01 +1.081745000000000179e+00 1.912500000000000000e+01 +1.081749999999999989e+00 1.931250000000000000e+01 +1.081755000000000022e+00 1.950000000000000000e+01 +1.081760000000000055e+00 1.962500000000000000e+01 +1.081765000000000088e+00 1.978125000000000000e+01 +1.081770000000000120e+00 1.990625000000000000e+01 +1.081775000000000153e+00 2.000000000000000000e+01 +1.081780000000000186e+00 2.009375000000000000e+01 +1.081784999999999997e+00 2.015625190734863281e+01 +1.081790000000000029e+00 2.031250190734863281e+01 +1.081795000000000062e+00 2.040625000000000000e+01 +1.081800000000000095e+00 2.050000000000000000e+01 +1.081805000000000128e+00 2.050000000000000000e+01 +1.081810000000000160e+00 2.053125000000000000e+01 +1.081815000000000193e+00 2.059375190734863281e+01 +1.081820000000000004e+00 2.059375190734863281e+01 +1.081825000000000037e+00 2.071875000000000000e+01 +1.081830000000000069e+00 2.065625000000000000e+01 +1.081835000000000102e+00 2.075000190734863281e+01 +1.081840000000000135e+00 2.068750000000000000e+01 +1.081845000000000168e+00 2.071875000000000000e+01 +1.081849999999999978e+00 2.075000190734863281e+01 +1.081855000000000011e+00 2.062500000000000000e+01 +1.081860000000000044e+00 2.062500000000000000e+01 +1.081865000000000077e+00 2.059375190734863281e+01 +1.081870000000000109e+00 2.053125000000000000e+01 +1.081875000000000142e+00 2.050000000000000000e+01 +1.081880000000000175e+00 2.040625000000000000e+01 +1.081884999999999986e+00 2.040625000000000000e+01 +1.081890000000000018e+00 2.028125000000000000e+01 +1.081895000000000051e+00 2.018750000000000000e+01 +1.081900000000000084e+00 2.000000000000000000e+01 +1.081905000000000117e+00 2.000000000000000000e+01 +1.081910000000000149e+00 1.990625000000000000e+01 +1.081915000000000182e+00 1.975000000000000000e+01 +1.081919999999999993e+00 1.962500000000000000e+01 +1.081925000000000026e+00 1.946875000000000000e+01 +1.081930000000000058e+00 1.937500000000000000e+01 +1.081935000000000091e+00 1.925000000000000000e+01 +1.081940000000000124e+00 1.906250000000000000e+01 +1.081945000000000157e+00 1.900000190734863281e+01 +1.081950000000000189e+00 1.881250000000000000e+01 +1.081955000000000000e+00 1.868750000000000000e+01 +1.081960000000000033e+00 1.853125000000000000e+01 +1.081965000000000066e+00 1.834375000000000000e+01 +1.081970000000000098e+00 1.818750000000000000e+01 +1.081975000000000131e+00 1.803125000000000000e+01 +1.081980000000000164e+00 1.781250000000000000e+01 +1.081985000000000197e+00 1.765625000000000000e+01 +1.081990000000000007e+00 1.750000000000000000e+01 +1.081995000000000040e+00 1.725000000000000000e+01 +1.082000000000000073e+00 1.709375000000000000e+01 +1.082005000000000106e+00 1.687500000000000000e+01 +1.082010000000000138e+00 1.668750190734863281e+01 +1.082015000000000171e+00 1.650000000000000000e+01 +1.082019999999999982e+00 1.625000190734863281e+01 +1.082025000000000015e+00 1.600000000000000000e+01 +1.082030000000000047e+00 1.584375095367431641e+01 +1.082035000000000080e+00 1.565625000000000000e+01 +1.082040000000000113e+00 1.543750095367431641e+01 +1.082045000000000146e+00 1.521875095367431641e+01 +1.082050000000000178e+00 1.500000095367431641e+01 +1.082054999999999989e+00 1.471875095367431641e+01 +1.082060000000000022e+00 1.456250095367431641e+01 +1.082065000000000055e+00 1.437500000000000000e+01 +1.082070000000000087e+00 1.409375000000000000e+01 +1.082075000000000120e+00 1.381250000000000000e+01 +1.082080000000000153e+00 1.365625000000000000e+01 +1.082085000000000186e+00 1.340625095367431641e+01 +1.082089999999999996e+00 1.315625000000000000e+01 +1.082095000000000029e+00 1.293750000000000000e+01 +1.082100000000000062e+00 1.265625000000000000e+01 +1.082105000000000095e+00 1.240625000000000000e+01 +1.082110000000000127e+00 1.221875000000000000e+01 +1.082115000000000160e+00 1.190625000000000000e+01 +1.082120000000000193e+00 1.168750000000000000e+01 +1.082125000000000004e+00 1.134375000000000000e+01 +1.082130000000000036e+00 1.109375095367431641e+01 +1.082135000000000069e+00 1.100000000000000000e+01 +1.082140000000000102e+00 1.059375095367431641e+01 +1.082145000000000135e+00 1.037500095367431641e+01 +1.082150000000000167e+00 1.006250000000000000e+01 +1.082154999999999978e+00 9.812500000000000000e+00 +1.082160000000000011e+00 9.531250000000000000e+00 +1.082165000000000044e+00 9.312500000000000000e+00 +1.082170000000000076e+00 9.000000953674316406e+00 +1.082175000000000109e+00 8.750000000000000000e+00 +1.082180000000000142e+00 8.500000000000000000e+00 +1.082185000000000175e+00 8.156250000000000000e+00 +1.082189999999999985e+00 7.906249523162841797e+00 +1.082195000000000018e+00 7.625000000000000000e+00 +1.082200000000000051e+00 7.312500476837158203e+00 +1.082205000000000084e+00 7.062500476837158203e+00 +1.082210000000000116e+00 6.750000000000000000e+00 +1.082215000000000149e+00 6.531250000000000000e+00 +1.082220000000000182e+00 6.218750000000000000e+00 +1.082224999999999993e+00 5.937500000000000000e+00 +1.082230000000000025e+00 5.625000000000000000e+00 +1.082235000000000058e+00 5.375000000000000000e+00 +1.082240000000000091e+00 5.125000000000000000e+00 +1.082245000000000124e+00 4.843750000000000000e+00 +1.082250000000000156e+00 4.500000476837158203e+00 +1.082255000000000189e+00 4.281250476837158203e+00 +1.082260000000000000e+00 3.906250000000000000e+00 +1.082265000000000033e+00 3.625000238418579102e+00 +1.082270000000000065e+00 3.406250238418579102e+00 +1.082275000000000098e+00 3.062500238418579102e+00 +1.082280000000000131e+00 2.781250000000000000e+00 +1.082285000000000164e+00 2.500000000000000000e+00 +1.082290000000000196e+00 2.187500000000000000e+00 +1.082295000000000007e+00 1.875000119209289551e+00 +1.082300000000000040e+00 1.593750119209289551e+00 +1.082305000000000073e+00 1.312500000000000000e+00 +1.082310000000000105e+00 1.031250000000000000e+00 +1.082315000000000138e+00 7.500000000000000000e-01 +1.082320000000000171e+00 5.000000000000000000e-01 +1.082324999999999982e+00 2.500000000000000000e-01 +1.082330000000000014e+00 0.000000000000000000e+00 +1.082335000000000047e+00 -3.125000000000000000e-01 +1.082340000000000080e+00 -5.312500000000000000e-01 +1.082345000000000113e+00 -8.437500000000000000e-01 +1.082350000000000145e+00 -1.031250000000000000e+00 +1.082355000000000178e+00 -1.343750000000000000e+00 +1.082359999999999989e+00 -1.562500000000000000e+00 +1.082365000000000022e+00 -1.906250000000000000e+00 +1.082370000000000054e+00 -2.125000000000000000e+00 +1.082375000000000087e+00 -2.500000000000000000e+00 +1.082380000000000120e+00 -2.718750238418579102e+00 +1.082385000000000153e+00 -2.937500238418579102e+00 +1.082390000000000185e+00 -3.125000000000000000e+00 +1.082394999999999996e+00 -3.500000000000000000e+00 +1.082400000000000029e+00 -3.781250000000000000e+00 +1.082405000000000062e+00 -4.062500476837158203e+00 +1.082410000000000094e+00 -4.312500000000000000e+00 +1.082415000000000127e+00 -4.500000476837158203e+00 +1.082420000000000160e+00 -4.843750000000000000e+00 +1.082425000000000193e+00 -5.093750000000000000e+00 +1.082430000000000003e+00 -5.343750000000000000e+00 +1.082435000000000036e+00 -5.593750000000000000e+00 +1.082440000000000069e+00 -5.843750000000000000e+00 +1.082445000000000102e+00 -6.125000476837158203e+00 +1.082450000000000134e+00 -6.281250000000000000e+00 +1.082455000000000167e+00 -6.531250000000000000e+00 +1.082459999999999978e+00 -6.781250000000000000e+00 +1.082465000000000011e+00 -7.031250476837158203e+00 +1.082470000000000043e+00 -7.312500476837158203e+00 +1.082475000000000076e+00 -7.500000476837158203e+00 +1.082480000000000109e+00 -7.750000476837158203e+00 +1.082485000000000142e+00 -8.031250000000000000e+00 +1.082490000000000174e+00 -8.156250000000000000e+00 +1.082494999999999985e+00 -8.500000000000000000e+00 +1.082500000000000018e+00 -8.687500000000000000e+00 +1.082505000000000051e+00 -8.906250000000000000e+00 +1.082510000000000083e+00 -9.093750000000000000e+00 +1.082515000000000116e+00 -9.406250000000000000e+00 +1.082520000000000149e+00 -9.562500000000000000e+00 +1.082525000000000182e+00 -9.812500000000000000e+00 +1.082529999999999992e+00 -1.006250000000000000e+01 +1.082535000000000025e+00 -1.021875095367431641e+01 +1.082540000000000058e+00 -1.043750095367431641e+01 +1.082545000000000091e+00 -1.071875000000000000e+01 +1.082550000000000123e+00 -1.096875000000000000e+01 +1.082555000000000156e+00 -1.115625000000000000e+01 +1.082560000000000189e+00 -1.137500095367431641e+01 +1.082565000000000000e+00 -1.156250000000000000e+01 +1.082570000000000032e+00 -1.168750000000000000e+01 +1.082575000000000065e+00 -1.193750000000000000e+01 +1.082580000000000098e+00 -1.212500000000000000e+01 +1.082585000000000131e+00 -1.234375000000000000e+01 +1.082590000000000163e+00 -1.253125095367431641e+01 +1.082595000000000196e+00 -1.275000095367431641e+01 +1.082600000000000007e+00 -1.296875095367431641e+01 +1.082605000000000040e+00 -1.309375000000000000e+01 +1.082610000000000072e+00 -1.334375095367431641e+01 +1.082615000000000105e+00 -1.350000000000000000e+01 +1.082620000000000138e+00 -1.368750095367431641e+01 +1.082625000000000171e+00 -1.390625095367431641e+01 +1.082629999999999981e+00 -1.409375000000000000e+01 +1.082635000000000014e+00 -1.425000000000000000e+01 +1.082640000000000047e+00 -1.446875000000000000e+01 +1.082645000000000080e+00 -1.465625000000000000e+01 +1.082650000000000112e+00 -1.478125095367431641e+01 +1.082655000000000145e+00 -1.493750000000000000e+01 +1.082660000000000178e+00 -1.512500000000000000e+01 +1.082664999999999988e+00 -1.528125095367431641e+01 +1.082670000000000021e+00 -1.550000095367431641e+01 +1.082675000000000054e+00 -1.565625000000000000e+01 +1.082680000000000087e+00 -1.581249904632568359e+01 +1.082685000000000120e+00 -1.603125000000000000e+01 +1.082690000000000152e+00 -1.618750000000000000e+01 +1.082695000000000185e+00 -1.634375000000000000e+01 +1.082699999999999996e+00 -1.653125000000000000e+01 +1.082705000000000028e+00 -1.662500000000000000e+01 +1.082710000000000061e+00 -1.684375190734863281e+01 +1.082715000000000094e+00 -1.696875000000000000e+01 +1.082720000000000127e+00 -1.706250000000000000e+01 +1.082725000000000160e+00 -1.728125190734863281e+01 +1.082730000000000192e+00 -1.746875000000000000e+01 +1.082735000000000003e+00 -1.753125000000000000e+01 +1.082740000000000036e+00 -1.771875190734863281e+01 +1.082745000000000068e+00 -1.787500000000000000e+01 +1.082750000000000101e+00 -1.803125000000000000e+01 +1.082755000000000134e+00 -1.818750000000000000e+01 +1.082760000000000167e+00 -1.831250000000000000e+01 +1.082765000000000200e+00 -1.846875000000000000e+01 +1.082770000000000010e+00 -1.865625000000000000e+01 +1.082775000000000043e+00 -1.881250000000000000e+01 +1.082780000000000076e+00 -1.896875000000000000e+01 +1.082785000000000108e+00 -1.903125000000000000e+01 +1.082790000000000141e+00 -1.928125190734863281e+01 +1.082795000000000174e+00 -1.934375000000000000e+01 +1.082799999999999985e+00 -1.950000000000000000e+01 +1.082805000000000017e+00 -1.959375190734863281e+01 +1.082810000000000050e+00 -1.975000000000000000e+01 +1.082815000000000083e+00 -1.987500190734863281e+01 +1.082820000000000116e+00 -1.993750000000000000e+01 +1.082825000000000149e+00 -2.009375000000000000e+01 +1.082830000000000181e+00 -2.021875000000000000e+01 +1.082834999999999992e+00 -2.034375000000000000e+01 +1.082840000000000025e+00 -2.046875190734863281e+01 +1.082845000000000057e+00 -2.062500000000000000e+01 +1.082850000000000090e+00 -2.078125000000000000e+01 +1.082855000000000123e+00 -2.084375000000000000e+01 +1.082860000000000156e+00 -2.096875000000000000e+01 +1.082865000000000189e+00 -2.103125190734863281e+01 +1.082869999999999999e+00 -2.118750190734863281e+01 +1.082875000000000032e+00 -2.134375000000000000e+01 +1.082880000000000065e+00 -2.140625000000000000e+01 +1.082885000000000097e+00 -2.153125000000000000e+01 +1.082890000000000130e+00 -2.165625000000000000e+01 +1.082895000000000163e+00 -2.178125000000000000e+01 +1.082900000000000196e+00 -2.184375000000000000e+01 +1.082905000000000006e+00 -2.196875000000000000e+01 +1.082910000000000039e+00 -2.209375000000000000e+01 +1.082915000000000072e+00 -2.212500000000000000e+01 +1.082920000000000105e+00 -2.231250000000000000e+01 +1.082925000000000137e+00 -2.237500000000000000e+01 +1.082930000000000170e+00 -2.253125000000000000e+01 +1.082934999999999981e+00 -2.253125000000000000e+01 +1.082940000000000014e+00 -2.271875000000000000e+01 +1.082945000000000046e+00 -2.281250000000000000e+01 +1.082950000000000079e+00 -2.284375000000000000e+01 +1.082955000000000112e+00 -2.296875000000000000e+01 +1.082960000000000145e+00 -2.309375000000000000e+01 +1.082965000000000177e+00 -2.315625000000000000e+01 +1.082969999999999988e+00 -2.321875000000000000e+01 +1.082975000000000021e+00 -2.334375190734863281e+01 +1.082980000000000054e+00 -2.340625000000000000e+01 +1.082985000000000086e+00 -2.350000190734863281e+01 +1.082990000000000119e+00 -2.359375000000000000e+01 +1.082995000000000152e+00 -2.378125190734863281e+01 +1.083000000000000185e+00 -2.381250000000000000e+01 +1.083004999999999995e+00 -2.387500000000000000e+01 +1.083010000000000028e+00 -2.396875000000000000e+01 +1.083015000000000061e+00 -2.409375000000000000e+01 +1.083020000000000094e+00 -2.415625000000000000e+01 +1.083025000000000126e+00 -2.418750000000000000e+01 +1.083030000000000159e+00 -2.434375190734863281e+01 +1.083035000000000192e+00 -2.440625000000000000e+01 +1.083040000000000003e+00 -2.446875000000000000e+01 +1.083045000000000035e+00 -2.453125000000000000e+01 +1.083050000000000068e+00 -2.462500190734863281e+01 +1.083055000000000101e+00 -2.475000000000000000e+01 +1.083060000000000134e+00 -2.484375000000000000e+01 +1.083065000000000166e+00 -2.490625000000000000e+01 +1.083070000000000199e+00 -2.490625000000000000e+01 +1.083075000000000010e+00 -2.500000000000000000e+01 +1.083080000000000043e+00 -2.506250190734863281e+01 +1.083085000000000075e+00 -2.515625000000000000e+01 +1.083090000000000108e+00 -2.515625000000000000e+01 +1.083095000000000141e+00 -2.525000000000000000e+01 +1.083100000000000174e+00 -2.534375000000000000e+01 +1.083104999999999984e+00 -2.550000190734863281e+01 +1.083110000000000017e+00 -2.550000190734863281e+01 +1.083115000000000050e+00 -2.562500000000000000e+01 +1.083120000000000083e+00 -2.568750000000000000e+01 +1.083125000000000115e+00 -2.581250190734863281e+01 +1.083130000000000148e+00 -2.584375000000000000e+01 +1.083135000000000181e+00 -2.590625000000000000e+01 +1.083139999999999992e+00 -2.600000000000000000e+01 +1.083145000000000024e+00 -2.603125000000000000e+01 +1.083150000000000057e+00 -2.609375190734863281e+01 +1.083155000000000090e+00 -2.621875190734863281e+01 +1.083160000000000123e+00 -2.628125000000000000e+01 +1.083165000000000155e+00 -2.634375000000000000e+01 +1.083170000000000188e+00 -2.643750000000000000e+01 +1.083174999999999999e+00 -2.646875000000000000e+01 +1.083180000000000032e+00 -2.656250000000000000e+01 +1.083185000000000064e+00 -2.662500000000000000e+01 +1.083190000000000097e+00 -2.668750190734863281e+01 +1.083195000000000130e+00 -2.678125000000000000e+01 +1.083200000000000163e+00 -2.678125000000000000e+01 +1.083205000000000195e+00 -2.690625000000000000e+01 +1.083210000000000006e+00 -2.690625000000000000e+01 +1.083215000000000039e+00 -2.700000000000000000e+01 +1.083220000000000072e+00 -2.703125000000000000e+01 +1.083225000000000104e+00 -2.706250000000000000e+01 +1.083230000000000137e+00 -2.709375190734863281e+01 +1.083235000000000170e+00 -2.721875000000000000e+01 +1.083239999999999981e+00 -2.725000190734863281e+01 +1.083245000000000013e+00 -2.734375000000000000e+01 +1.083250000000000046e+00 -2.737500190734863281e+01 +1.083255000000000079e+00 -2.750000000000000000e+01 +1.083260000000000112e+00 -2.750000000000000000e+01 +1.083265000000000144e+00 -2.753125190734863281e+01 +1.083270000000000177e+00 -2.759375000000000000e+01 +1.083274999999999988e+00 -2.762500000000000000e+01 +1.083280000000000021e+00 -2.768750190734863281e+01 +1.083285000000000053e+00 -2.778125000000000000e+01 +1.083290000000000086e+00 -2.787500000000000000e+01 +1.083295000000000119e+00 -2.793750000000000000e+01 +1.083300000000000152e+00 -2.790625000000000000e+01 +1.083305000000000184e+00 -2.800000000000000000e+01 +1.083309999999999995e+00 -2.800000000000000000e+01 +1.083315000000000028e+00 -2.809375190734863281e+01 +1.083320000000000061e+00 -2.815625000000000000e+01 +1.083325000000000093e+00 -2.815625000000000000e+01 +1.083330000000000126e+00 -2.825000190734863281e+01 +1.083335000000000159e+00 -2.821875000000000000e+01 +1.083340000000000192e+00 -2.834375000000000000e+01 +1.083345000000000002e+00 -2.837500000000000000e+01 +1.083350000000000035e+00 -2.846875000000000000e+01 +1.083355000000000068e+00 -2.850000000000000000e+01 +1.083360000000000101e+00 -2.853125190734863281e+01 +1.083365000000000133e+00 -2.853125190734863281e+01 +1.083370000000000166e+00 -2.862500000000000000e+01 +1.083375000000000199e+00 -2.862500000000000000e+01 +1.083380000000000010e+00 -2.865625000000000000e+01 +1.083385000000000042e+00 -2.878125000000000000e+01 +1.083390000000000075e+00 -2.881250000000000000e+01 +1.083395000000000108e+00 -2.881250000000000000e+01 +1.083400000000000141e+00 -2.890625000000000000e+01 +1.083405000000000173e+00 -2.893750000000000000e+01 +1.083409999999999984e+00 -2.900000190734863281e+01 +1.083415000000000017e+00 -2.900000190734863281e+01 +1.083420000000000050e+00 -2.903125000000000000e+01 +1.083425000000000082e+00 -2.906250000000000000e+01 +1.083430000000000115e+00 -2.909375000000000000e+01 +1.083435000000000148e+00 -2.912500190734863281e+01 +1.083440000000000181e+00 -2.918750000000000000e+01 +1.083444999999999991e+00 -2.921875000000000000e+01 +1.083450000000000024e+00 -2.928125190734863281e+01 +1.083455000000000057e+00 -2.934375000000000000e+01 +1.083460000000000090e+00 -2.940625190734863281e+01 +1.083465000000000122e+00 -2.943750190734863281e+01 +1.083470000000000155e+00 -2.943750190734863281e+01 +1.083475000000000188e+00 -2.946875000000000000e+01 +1.083479999999999999e+00 -2.956250190734863281e+01 +1.083485000000000031e+00 -2.959375000000000000e+01 +1.083490000000000064e+00 -2.962500000000000000e+01 +1.083495000000000097e+00 -2.962500000000000000e+01 +1.083500000000000130e+00 -2.965625000000000000e+01 +1.083505000000000162e+00 -2.962500000000000000e+01 +1.083510000000000195e+00 -2.965625000000000000e+01 +1.083515000000000006e+00 -2.978125000000000000e+01 +1.083520000000000039e+00 -2.981250000000000000e+01 +1.083525000000000071e+00 -2.987500000000000000e+01 +1.083530000000000104e+00 -2.990625000000000000e+01 +1.083535000000000137e+00 -2.987500000000000000e+01 +1.083540000000000170e+00 -2.996875190734863281e+01 +1.083544999999999980e+00 -2.993750000000000000e+01 +1.083550000000000013e+00 -2.996875190734863281e+01 +1.083555000000000046e+00 -3.006250000000000000e+01 +1.083560000000000079e+00 -3.009375000000000000e+01 +1.083565000000000111e+00 -3.012500190734863281e+01 +1.083570000000000144e+00 -3.021875000000000000e+01 +1.083575000000000177e+00 -3.015625190734863281e+01 +1.083579999999999988e+00 -3.025000000000000000e+01 +1.083585000000000020e+00 -3.028125190734863281e+01 +1.083590000000000053e+00 -3.034375000000000000e+01 +1.083595000000000086e+00 -3.031250000000000000e+01 +1.083600000000000119e+00 -3.040625190734863281e+01 +1.083605000000000151e+00 -3.034375000000000000e+01 +1.083610000000000184e+00 -3.050000000000000000e+01 +1.083614999999999995e+00 -3.046875000000000000e+01 +1.083620000000000028e+00 -3.053125000000000000e+01 +1.083625000000000060e+00 -3.053125000000000000e+01 +1.083630000000000093e+00 -3.059375190734863281e+01 +1.083635000000000126e+00 -3.059375190734863281e+01 +1.083640000000000159e+00 -3.062500000000000000e+01 +1.083645000000000191e+00 -3.065625000000000000e+01 +1.083650000000000002e+00 -3.071875190734863281e+01 +1.083655000000000035e+00 -3.068750000000000000e+01 +1.083660000000000068e+00 -3.078125000000000000e+01 +1.083665000000000100e+00 -3.078125000000000000e+01 +1.083670000000000133e+00 -3.081250000000000000e+01 +1.083675000000000166e+00 -3.081250000000000000e+01 +1.083680000000000199e+00 -3.090625000000000000e+01 +1.083685000000000009e+00 -3.090625000000000000e+01 +1.083690000000000042e+00 -3.087500190734863281e+01 +1.083695000000000075e+00 -3.093750000000000000e+01 +1.083700000000000108e+00 -3.096875000000000000e+01 +1.083705000000000140e+00 -3.100000190734863281e+01 +1.083710000000000173e+00 -3.100000190734863281e+01 +1.083714999999999984e+00 -3.103125000000000000e+01 +1.083720000000000017e+00 -3.109375000000000000e+01 +1.083725000000000049e+00 -3.112500190734863281e+01 +1.083730000000000082e+00 -3.109375000000000000e+01 +1.083735000000000115e+00 -3.118750000000000000e+01 +1.083740000000000148e+00 -3.121875000000000000e+01 +1.083745000000000180e+00 -3.118750000000000000e+01 +1.083749999999999991e+00 -3.125000000000000000e+01 +1.083755000000000024e+00 -3.131250000000000000e+01 +1.083760000000000057e+00 -3.128125190734863281e+01 +1.083765000000000089e+00 -3.125000000000000000e+01 +1.083770000000000122e+00 -3.131250000000000000e+01 +1.083775000000000155e+00 -3.131250000000000000e+01 +1.083780000000000188e+00 -3.140625000000000000e+01 +1.083784999999999998e+00 -3.140625000000000000e+01 +1.083790000000000031e+00 -3.140625000000000000e+01 +1.083795000000000064e+00 -3.146875000000000000e+01 +1.083800000000000097e+00 -3.143750190734863281e+01 +1.083805000000000129e+00 -3.150000000000000000e+01 +1.083810000000000162e+00 -3.153125190734863281e+01 +1.083815000000000195e+00 -3.156250000000000000e+01 +1.083820000000000006e+00 -3.156250000000000000e+01 +1.083825000000000038e+00 -3.159375190734863281e+01 +1.083830000000000071e+00 -3.156250000000000000e+01 +1.083835000000000104e+00 -3.162499809265136719e+01 +1.083840000000000137e+00 -3.168750190734863281e+01 +1.083845000000000169e+00 -3.168750190734863281e+01 +1.083849999999999980e+00 -3.175000190734863281e+01 +1.083855000000000013e+00 -3.171875000000000000e+01 +1.083860000000000046e+00 -3.178125190734863281e+01 +1.083865000000000078e+00 -3.178125190734863281e+01 +1.083870000000000111e+00 -3.178125190734863281e+01 +1.083875000000000144e+00 -3.181250000000000000e+01 +1.083880000000000177e+00 -3.187500000000000000e+01 +1.083884999999999987e+00 -3.184375190734863281e+01 +1.083890000000000020e+00 -3.190625000000000000e+01 +1.083895000000000053e+00 -3.190625000000000000e+01 +1.083900000000000086e+00 -3.193750190734863281e+01 +1.083905000000000118e+00 -3.193750190734863281e+01 +1.083910000000000151e+00 -3.193750190734863281e+01 +1.083915000000000184e+00 -3.193750190734863281e+01 +1.083919999999999995e+00 -3.200000000000000000e+01 +1.083925000000000027e+00 -3.203125000000000000e+01 +1.083930000000000060e+00 -3.209375381469726562e+01 +1.083935000000000093e+00 -3.209375381469726562e+01 +1.083940000000000126e+00 -3.209375381469726562e+01 +1.083945000000000158e+00 -3.206250000000000000e+01 +1.083950000000000191e+00 -3.215625000000000000e+01 +1.083955000000000002e+00 -3.212500000000000000e+01 +1.083960000000000035e+00 -3.218750000000000000e+01 +1.083965000000000067e+00 -3.215625000000000000e+01 +1.083970000000000100e+00 -3.212500000000000000e+01 +1.083975000000000133e+00 -3.221875000000000000e+01 +1.083980000000000166e+00 -3.218750000000000000e+01 +1.083985000000000198e+00 -3.221875000000000000e+01 +1.083990000000000009e+00 -3.221875000000000000e+01 +1.083995000000000042e+00 -3.228125000000000000e+01 +1.084000000000000075e+00 -3.231250000000000000e+01 +1.084005000000000107e+00 -3.237500000000000000e+01 +1.084010000000000140e+00 -3.237500000000000000e+01 +1.084015000000000173e+00 -3.237500000000000000e+01 +1.084019999999999984e+00 -3.240625000000000000e+01 +1.084025000000000016e+00 -3.240625000000000000e+01 +1.084030000000000049e+00 -3.246875000000000000e+01 +1.084035000000000082e+00 -3.243750000000000000e+01 +1.084040000000000115e+00 -3.246875000000000000e+01 +1.084045000000000147e+00 -3.253125000000000000e+01 +1.084050000000000180e+00 -3.256250000000000000e+01 +1.084054999999999991e+00 -3.243750000000000000e+01 +1.084060000000000024e+00 -3.256250000000000000e+01 +1.084065000000000056e+00 -3.256250000000000000e+01 +1.084070000000000089e+00 -3.259375000000000000e+01 +1.084075000000000122e+00 -3.262500000000000000e+01 +1.084080000000000155e+00 -3.265625381469726562e+01 +1.084085000000000187e+00 -3.262500000000000000e+01 +1.084089999999999998e+00 -3.265625381469726562e+01 +1.084095000000000031e+00 -3.265625381469726562e+01 +1.084100000000000064e+00 -3.268750000000000000e+01 +1.084105000000000096e+00 -3.271875000000000000e+01 +1.084110000000000129e+00 -3.271875000000000000e+01 +1.084115000000000162e+00 -3.275000000000000000e+01 +1.084120000000000195e+00 -3.278125000000000000e+01 +1.084125000000000005e+00 -3.275000000000000000e+01 +1.084130000000000038e+00 -3.284375000000000000e+01 +1.084135000000000071e+00 -3.287500000000000000e+01 +1.084140000000000104e+00 -3.275000000000000000e+01 +1.084145000000000136e+00 -3.284375000000000000e+01 +1.084150000000000169e+00 -3.284375000000000000e+01 +1.084154999999999980e+00 -3.284375000000000000e+01 +1.084160000000000013e+00 -3.284375000000000000e+01 +1.084165000000000045e+00 -3.290625000000000000e+01 +1.084170000000000078e+00 -3.293750000000000000e+01 +1.084175000000000111e+00 -3.296875381469726562e+01 +1.084180000000000144e+00 -3.300000000000000000e+01 +1.084185000000000176e+00 -3.293750000000000000e+01 +1.084189999999999987e+00 -3.300000000000000000e+01 +1.084195000000000020e+00 -3.303125000000000000e+01 +1.084200000000000053e+00 -3.303125000000000000e+01 +1.084205000000000085e+00 -3.296875381469726562e+01 +1.084210000000000118e+00 -3.303125000000000000e+01 +1.084215000000000151e+00 -3.309375000000000000e+01 +1.084220000000000184e+00 -3.303125000000000000e+01 +1.084224999999999994e+00 -3.315625000000000000e+01 +1.084230000000000027e+00 -3.309375000000000000e+01 +1.084235000000000060e+00 -3.312500381469726562e+01 +1.084240000000000093e+00 -3.315625000000000000e+01 +1.084245000000000125e+00 -3.318750000000000000e+01 +1.084250000000000158e+00 -3.312500381469726562e+01 +1.084255000000000191e+00 -3.328125000000000000e+01 +1.084260000000000002e+00 -3.318750000000000000e+01 +1.084265000000000034e+00 -3.325000000000000000e+01 +1.084270000000000067e+00 -3.318750000000000000e+01 +1.084275000000000100e+00 -3.328125000000000000e+01 +1.084280000000000133e+00 -3.328125000000000000e+01 +1.084285000000000165e+00 -3.325000000000000000e+01 +1.084290000000000198e+00 -3.331250000000000000e+01 +1.084295000000000009e+00 -3.334375000000000000e+01 +1.084300000000000042e+00 -3.334375000000000000e+01 +1.084305000000000074e+00 -3.334375000000000000e+01 +1.084310000000000107e+00 -3.340625000000000000e+01 +1.084315000000000140e+00 -3.346875000000000000e+01 +1.084320000000000173e+00 -3.350000000000000000e+01 +1.084324999999999983e+00 -3.346875000000000000e+01 +1.084330000000000016e+00 -3.350000000000000000e+01 +1.084335000000000049e+00 -3.350000000000000000e+01 +1.084340000000000082e+00 -3.353125381469726562e+01 +1.084345000000000114e+00 -3.346875000000000000e+01 +1.084350000000000147e+00 -3.353125381469726562e+01 +1.084355000000000180e+00 -3.356250000000000000e+01 +1.084359999999999991e+00 -3.353125381469726562e+01 +1.084365000000000023e+00 -3.359375000000000000e+01 +1.084370000000000056e+00 -3.359375000000000000e+01 +1.084375000000000089e+00 -3.359375000000000000e+01 +1.084380000000000122e+00 -3.362500000000000000e+01 +1.084385000000000154e+00 -3.359375000000000000e+01 +1.084390000000000187e+00 -3.365625000000000000e+01 +1.084394999999999998e+00 -3.362500000000000000e+01 +1.084400000000000031e+00 -3.365625000000000000e+01 +1.084405000000000063e+00 -3.368750381469726562e+01 +1.084410000000000096e+00 -3.368750381469726562e+01 +1.084415000000000129e+00 -3.365625000000000000e+01 +1.084420000000000162e+00 -3.375000000000000000e+01 +1.084425000000000194e+00 -3.384375381469726562e+01 +1.084430000000000005e+00 -3.371875000000000000e+01 +1.084435000000000038e+00 -3.378125000000000000e+01 +1.084440000000000071e+00 -3.375000000000000000e+01 +1.084445000000000103e+00 -3.381250000000000000e+01 +1.084450000000000136e+00 -3.378125000000000000e+01 +1.084455000000000169e+00 -3.384375381469726562e+01 +1.084459999999999980e+00 -3.390625000000000000e+01 +1.084465000000000012e+00 -3.384375381469726562e+01 +1.084470000000000045e+00 -3.387500000000000000e+01 +1.084475000000000078e+00 -3.387500000000000000e+01 +1.084480000000000111e+00 -3.390625000000000000e+01 +1.084485000000000143e+00 -3.390625000000000000e+01 +1.084490000000000176e+00 -3.390625000000000000e+01 +1.084494999999999987e+00 -3.393750000000000000e+01 +1.084500000000000020e+00 -3.393750000000000000e+01 +1.084505000000000052e+00 -3.396875000000000000e+01 +1.084510000000000085e+00 -3.393750000000000000e+01 +1.084515000000000118e+00 -3.393750000000000000e+01 +1.084520000000000151e+00 -3.400000000000000000e+01 +1.084525000000000183e+00 -3.403125000000000000e+01 +1.084529999999999994e+00 -3.403125000000000000e+01 +1.084535000000000027e+00 -3.403125000000000000e+01 +1.084540000000000060e+00 -3.406250000000000000e+01 +1.084545000000000092e+00 -3.412500000000000000e+01 +1.084550000000000125e+00 -3.409375381469726562e+01 +1.084555000000000158e+00 -3.409375381469726562e+01 +1.084560000000000191e+00 -3.415625000000000000e+01 +1.084565000000000001e+00 -3.415625000000000000e+01 +1.084570000000000034e+00 -3.418750000000000000e+01 +1.084575000000000067e+00 -3.418750000000000000e+01 +1.084580000000000100e+00 -3.421875000000000000e+01 +1.084585000000000132e+00 -3.421875000000000000e+01 +1.084590000000000165e+00 -3.428125000000000000e+01 +1.084595000000000198e+00 -3.421875000000000000e+01 +1.084600000000000009e+00 -3.425000381469726562e+01 +1.084605000000000041e+00 -3.421875000000000000e+01 +1.084610000000000074e+00 -3.428125000000000000e+01 +1.084615000000000107e+00 -3.425000381469726562e+01 +1.084620000000000140e+00 -3.428125000000000000e+01 +1.084625000000000172e+00 -3.428125000000000000e+01 +1.084629999999999983e+00 -3.434375000000000000e+01 +1.084635000000000016e+00 -3.434375000000000000e+01 +1.084640000000000049e+00 -3.434375000000000000e+01 +1.084645000000000081e+00 -3.434375000000000000e+01 +1.084650000000000114e+00 -3.434375000000000000e+01 +1.084655000000000147e+00 -3.440625381469726562e+01 +1.084660000000000180e+00 -3.434375000000000000e+01 +1.084664999999999990e+00 -3.434375000000000000e+01 +1.084670000000000023e+00 -3.437500000000000000e+01 +1.084675000000000056e+00 -3.443750000000000000e+01 +1.084680000000000089e+00 -3.443750000000000000e+01 +1.084685000000000121e+00 -3.443750000000000000e+01 +1.084690000000000154e+00 -3.446875000000000000e+01 +1.084695000000000187e+00 -3.446875000000000000e+01 +1.084699999999999998e+00 -3.443750000000000000e+01 +1.084705000000000030e+00 -3.446875000000000000e+01 +1.084710000000000063e+00 -3.453125000000000000e+01 +1.084715000000000096e+00 -3.450000000000000000e+01 +1.084720000000000129e+00 -3.450000000000000000e+01 +1.084725000000000161e+00 -3.446875000000000000e+01 +1.084730000000000194e+00 -3.450000000000000000e+01 +1.084735000000000005e+00 -3.453125000000000000e+01 +1.084740000000000038e+00 -3.456250381469726562e+01 +1.084745000000000070e+00 -3.453125000000000000e+01 +1.084750000000000103e+00 -3.456250381469726562e+01 +1.084755000000000136e+00 -3.456250381469726562e+01 +1.084760000000000169e+00 -3.462500000000000000e+01 +1.084764999999999979e+00 -3.459375000000000000e+01 +1.084770000000000012e+00 -3.465625000000000000e+01 +1.084775000000000045e+00 -3.465625000000000000e+01 +1.084780000000000078e+00 -3.459375000000000000e+01 +1.084785000000000110e+00 -3.468750000000000000e+01 +1.084790000000000143e+00 -3.468750000000000000e+01 +1.084795000000000176e+00 -3.468750000000000000e+01 +1.084799999999999986e+00 -3.465625000000000000e+01 +1.084805000000000019e+00 -3.475000000000000000e+01 +1.084810000000000052e+00 -3.468750000000000000e+01 +1.084815000000000085e+00 -3.471875000000000000e+01 +1.084820000000000118e+00 -3.475000000000000000e+01 +1.084825000000000150e+00 -3.471875000000000000e+01 +1.084830000000000183e+00 -3.478125000000000000e+01 +1.084834999999999994e+00 -3.475000000000000000e+01 +1.084840000000000027e+00 -3.481250381469726562e+01 +1.084845000000000059e+00 -3.478125000000000000e+01 +1.084850000000000092e+00 -3.478125000000000000e+01 +1.084855000000000125e+00 -3.475000000000000000e+01 +1.084860000000000158e+00 -3.484375000000000000e+01 +1.084865000000000190e+00 -3.481250381469726562e+01 +1.084870000000000001e+00 -3.481250381469726562e+01 +1.084875000000000034e+00 -3.487500000000000000e+01 +1.084880000000000067e+00 -3.490625000000000000e+01 +1.084885000000000099e+00 -3.487500000000000000e+01 +1.084890000000000132e+00 -3.487500000000000000e+01 +1.084895000000000165e+00 -3.490625000000000000e+01 +1.084900000000000198e+00 -3.493750000000000000e+01 +1.084905000000000008e+00 -3.496875381469726562e+01 +1.084910000000000041e+00 -3.496875381469726562e+01 +1.084915000000000074e+00 -3.493750000000000000e+01 +1.084920000000000107e+00 -3.496875381469726562e+01 +1.084925000000000139e+00 -3.493750000000000000e+01 +1.084930000000000172e+00 -3.496875381469726562e+01 +1.084934999999999983e+00 -3.496875381469726562e+01 +1.084940000000000015e+00 -3.500000000000000000e+01 +1.084945000000000048e+00 -3.503125000000000000e+01 +1.084950000000000081e+00 -3.500000000000000000e+01 +1.084955000000000114e+00 -3.500000000000000000e+01 +1.084960000000000147e+00 -3.503125000000000000e+01 +1.084965000000000179e+00 -3.500000000000000000e+01 +1.084969999999999990e+00 -3.500000000000000000e+01 +1.084975000000000023e+00 -3.506250000000000000e+01 +1.084980000000000055e+00 -3.509375000000000000e+01 +1.084985000000000088e+00 -3.506250000000000000e+01 +1.084990000000000121e+00 -3.509375000000000000e+01 +1.084995000000000154e+00 -3.506250000000000000e+01 +1.085000000000000187e+00 -3.506250000000000000e+01 +1.085004999999999997e+00 -3.509375000000000000e+01 +1.085010000000000030e+00 -3.509375000000000000e+01 +1.085015000000000063e+00 -3.509375000000000000e+01 +1.085020000000000095e+00 -3.521875000000000000e+01 +1.085025000000000128e+00 -3.512500381469726562e+01 +1.085030000000000161e+00 -3.512500381469726562e+01 +1.085035000000000194e+00 -3.515625000000000000e+01 +1.085040000000000004e+00 -3.512500381469726562e+01 +1.085045000000000037e+00 -3.515625000000000000e+01 +1.085050000000000070e+00 -3.518750000000000000e+01 +1.085055000000000103e+00 -3.518750000000000000e+01 +1.085060000000000136e+00 -3.521875000000000000e+01 +1.085065000000000168e+00 -3.518750000000000000e+01 +1.085069999999999979e+00 -3.525000000000000000e+01 +1.085075000000000012e+00 -3.528125381469726562e+01 +1.085080000000000044e+00 -3.528125381469726562e+01 +1.085085000000000077e+00 -3.534375000000000000e+01 +1.085090000000000110e+00 -3.534375000000000000e+01 +1.085095000000000143e+00 -3.528125381469726562e+01 +1.085100000000000176e+00 -3.534375000000000000e+01 +1.085104999999999986e+00 -3.528125381469726562e+01 +1.085110000000000019e+00 -3.534375000000000000e+01 +1.085115000000000052e+00 -3.537500000000000000e+01 +1.085120000000000084e+00 -3.531250000000000000e+01 +1.085125000000000117e+00 -3.531250000000000000e+01 +1.085130000000000150e+00 -3.537500000000000000e+01 +1.085135000000000183e+00 -3.537500000000000000e+01 +1.085139999999999993e+00 -3.534375000000000000e+01 +1.085145000000000026e+00 -3.540625000000000000e+01 +1.085150000000000059e+00 -3.537500000000000000e+01 +1.085155000000000092e+00 -3.540625000000000000e+01 +1.085160000000000124e+00 -3.543750381469726562e+01 +1.085165000000000157e+00 -3.543750381469726562e+01 +1.085170000000000190e+00 -3.543750381469726562e+01 +1.085175000000000001e+00 -3.537500000000000000e+01 +1.085180000000000033e+00 -3.550000000000000000e+01 +1.085185000000000066e+00 -3.543750381469726562e+01 +1.085190000000000099e+00 -3.540625000000000000e+01 +1.085195000000000132e+00 -3.550000000000000000e+01 +1.085200000000000164e+00 -3.546875000000000000e+01 +1.085205000000000197e+00 -3.553125381469726562e+01 +1.085210000000000008e+00 -3.553125381469726562e+01 +1.085215000000000041e+00 -3.559375000000000000e+01 +1.085220000000000073e+00 -3.553125381469726562e+01 +1.085225000000000106e+00 -3.553125381469726562e+01 +1.085230000000000139e+00 -3.556250000000000000e+01 +1.085235000000000172e+00 -3.553125381469726562e+01 +1.085239999999999982e+00 -3.559375000000000000e+01 +1.085245000000000015e+00 -3.556250000000000000e+01 +1.085250000000000048e+00 -3.556250000000000000e+01 +1.085255000000000081e+00 -3.556250000000000000e+01 +1.085260000000000113e+00 -3.559375000000000000e+01 +1.085265000000000146e+00 -3.559375000000000000e+01 +1.085270000000000179e+00 -3.556250000000000000e+01 +1.085274999999999990e+00 -3.559375000000000000e+01 +1.085280000000000022e+00 -3.559375000000000000e+01 +1.085285000000000055e+00 -3.565625000000000000e+01 +1.085290000000000088e+00 -3.559375000000000000e+01 +1.085295000000000121e+00 -3.562500000000000000e+01 +1.085300000000000153e+00 -3.568750381469726562e+01 +1.085305000000000186e+00 -3.565625000000000000e+01 +1.085309999999999997e+00 -3.565625000000000000e+01 +1.085315000000000030e+00 -3.571875000000000000e+01 +1.085320000000000062e+00 -3.568750381469726562e+01 +1.085325000000000095e+00 -3.568750381469726562e+01 +1.085330000000000128e+00 -3.571875000000000000e+01 +1.085335000000000161e+00 -3.571875000000000000e+01 +1.085340000000000193e+00 -3.571875000000000000e+01 +1.085345000000000004e+00 -3.571875000000000000e+01 +1.085350000000000037e+00 -3.568750381469726562e+01 +1.085355000000000070e+00 -3.571875000000000000e+01 +1.085360000000000102e+00 -3.568750381469726562e+01 +1.085365000000000135e+00 -3.578125000000000000e+01 +1.085370000000000168e+00 -3.578125000000000000e+01 +1.085374999999999979e+00 -3.581250000000000000e+01 +1.085380000000000011e+00 -3.571875000000000000e+01 +1.085385000000000044e+00 -3.578125000000000000e+01 +1.085390000000000077e+00 -3.578125000000000000e+01 +1.085395000000000110e+00 -3.584375381469726562e+01 +1.085400000000000142e+00 -3.581250000000000000e+01 +1.085405000000000175e+00 -3.584375381469726562e+01 +1.085409999999999986e+00 -3.584375381469726562e+01 +1.085415000000000019e+00 -3.584375381469726562e+01 +1.085420000000000051e+00 -3.584375381469726562e+01 +1.085425000000000084e+00 -3.584375381469726562e+01 +1.085430000000000117e+00 -3.593750000000000000e+01 +1.085435000000000150e+00 -3.590625000000000000e+01 +1.085440000000000182e+00 -3.584375381469726562e+01 +1.085444999999999993e+00 -3.587500000000000000e+01 +1.085450000000000026e+00 -3.584375381469726562e+01 +1.085455000000000059e+00 -3.587500000000000000e+01 +1.085460000000000091e+00 -3.590625000000000000e+01 +1.085465000000000124e+00 -3.587500000000000000e+01 +1.085470000000000157e+00 -3.587500000000000000e+01 +1.085475000000000190e+00 -3.587500000000000000e+01 +1.085480000000000000e+00 -3.596875000000000000e+01 +1.085485000000000033e+00 -3.600000381469726562e+01 +1.085490000000000066e+00 -3.596875000000000000e+01 +1.085495000000000099e+00 -3.590625000000000000e+01 +1.085500000000000131e+00 -3.593750000000000000e+01 +1.085505000000000164e+00 -3.590625000000000000e+01 +1.085510000000000197e+00 -3.593750000000000000e+01 +1.085515000000000008e+00 -3.596875000000000000e+01 +1.085520000000000040e+00 -3.603125000000000000e+01 +1.085525000000000073e+00 -3.603125000000000000e+01 +1.085530000000000106e+00 -3.600000381469726562e+01 +1.085535000000000139e+00 -3.596875000000000000e+01 +1.085540000000000171e+00 -3.603125000000000000e+01 +1.085544999999999982e+00 -3.603125000000000000e+01 +1.085550000000000015e+00 -3.606250000000000000e+01 +1.085555000000000048e+00 -3.603125000000000000e+01 +1.085560000000000080e+00 -3.612500000000000000e+01 +1.085565000000000113e+00 -3.603125000000000000e+01 +1.085570000000000146e+00 -3.612500000000000000e+01 +1.085575000000000179e+00 -3.603125000000000000e+01 +1.085579999999999989e+00 -3.603125000000000000e+01 +1.085585000000000022e+00 -3.609375000000000000e+01 +1.085590000000000055e+00 -3.606250000000000000e+01 +1.085595000000000088e+00 -3.609375000000000000e+01 +1.085600000000000120e+00 -3.612500000000000000e+01 +1.085605000000000153e+00 -3.606250000000000000e+01 +1.085610000000000186e+00 -3.615625381469726562e+01 +1.085614999999999997e+00 -3.615625381469726562e+01 +1.085620000000000029e+00 -3.618750000000000000e+01 +1.085625000000000062e+00 -3.618750000000000000e+01 +1.085630000000000095e+00 -3.615625381469726562e+01 +1.085635000000000128e+00 -3.615625381469726562e+01 +1.085640000000000160e+00 -3.615625381469726562e+01 +1.085645000000000193e+00 -3.618750000000000000e+01 +1.085650000000000004e+00 -3.618750000000000000e+01 +1.085655000000000037e+00 -3.618750000000000000e+01 +1.085660000000000069e+00 -3.621875000000000000e+01 +1.085665000000000102e+00 -3.625000000000000000e+01 +1.085670000000000135e+00 -3.628125000000000000e+01 +1.085675000000000168e+00 -3.628125000000000000e+01 +1.085679999999999978e+00 -3.615625381469726562e+01 +1.085685000000000011e+00 -3.628125000000000000e+01 +1.085690000000000044e+00 -3.628125000000000000e+01 +1.085695000000000077e+00 -3.621875000000000000e+01 +1.085700000000000109e+00 -3.628125000000000000e+01 +1.085705000000000142e+00 -3.625000000000000000e+01 +1.085710000000000175e+00 -3.628125000000000000e+01 +1.085714999999999986e+00 -3.631250000000000000e+01 +1.085720000000000018e+00 -3.634375000000000000e+01 +1.085725000000000051e+00 -3.631250000000000000e+01 +1.085730000000000084e+00 -3.634375000000000000e+01 +1.085735000000000117e+00 -3.634375000000000000e+01 +1.085740000000000149e+00 -3.631250000000000000e+01 +1.085745000000000182e+00 -3.640625381469726562e+01 +1.085749999999999993e+00 -3.628125000000000000e+01 +1.085755000000000026e+00 -3.631250000000000000e+01 +1.085760000000000058e+00 -3.637500000000000000e+01 +1.085765000000000091e+00 -3.640625381469726562e+01 +1.085770000000000124e+00 -3.631250000000000000e+01 +1.085775000000000157e+00 -3.634375000000000000e+01 +1.085780000000000189e+00 -3.640625381469726562e+01 +1.085785000000000000e+00 -3.640625381469726562e+01 +1.085790000000000033e+00 -3.634375000000000000e+01 +1.085795000000000066e+00 -3.643750000000000000e+01 +1.085800000000000098e+00 -3.631250000000000000e+01 +1.085805000000000131e+00 -3.646875000000000000e+01 +1.085810000000000164e+00 -3.637500000000000000e+01 +1.085815000000000197e+00 -3.640625381469726562e+01 +1.085820000000000007e+00 -3.643750000000000000e+01 +1.085825000000000040e+00 -3.643750000000000000e+01 +1.085830000000000073e+00 -3.643750000000000000e+01 +1.085835000000000106e+00 -3.643750000000000000e+01 +1.085840000000000138e+00 -3.646875000000000000e+01 +1.085845000000000171e+00 -3.646875000000000000e+01 +1.085849999999999982e+00 -3.646875000000000000e+01 +1.085855000000000015e+00 -3.643750000000000000e+01 +1.085860000000000047e+00 -3.646875000000000000e+01 +1.085865000000000080e+00 -3.650000000000000000e+01 +1.085870000000000113e+00 -3.646875000000000000e+01 +1.085875000000000146e+00 -3.646875000000000000e+01 +1.085880000000000178e+00 -3.653125000000000000e+01 +1.085884999999999989e+00 -3.650000000000000000e+01 +1.085890000000000022e+00 -3.653125000000000000e+01 +1.085895000000000055e+00 -3.650000000000000000e+01 +1.085900000000000087e+00 -3.646875000000000000e+01 +1.085905000000000120e+00 -3.653125000000000000e+01 +1.085910000000000153e+00 -3.646875000000000000e+01 +1.085915000000000186e+00 -3.650000000000000000e+01 +1.085919999999999996e+00 -3.656250381469726562e+01 +1.085925000000000029e+00 -3.653125000000000000e+01 +1.085930000000000062e+00 -3.653125000000000000e+01 +1.085935000000000095e+00 -3.653125000000000000e+01 +1.085940000000000127e+00 -3.653125000000000000e+01 +1.085945000000000160e+00 -3.650000000000000000e+01 +1.085950000000000193e+00 -3.653125000000000000e+01 +1.085955000000000004e+00 -3.656250381469726562e+01 +1.085960000000000036e+00 -3.653125000000000000e+01 +1.085965000000000069e+00 -3.659375000000000000e+01 +1.085970000000000102e+00 -3.653125000000000000e+01 +1.085975000000000135e+00 -3.662500000000000000e+01 +1.085980000000000167e+00 -3.659375000000000000e+01 +1.085984999999999978e+00 -3.662500000000000000e+01 +1.085990000000000011e+00 -3.662500000000000000e+01 +1.085995000000000044e+00 -3.668750000000000000e+01 +1.086000000000000076e+00 -3.653125000000000000e+01 +1.086005000000000109e+00 -3.653125000000000000e+01 +1.086010000000000142e+00 -3.665625000000000000e+01 +1.086015000000000175e+00 -3.665625000000000000e+01 +1.086019999999999985e+00 -3.668750000000000000e+01 +1.086025000000000018e+00 -3.665625000000000000e+01 +1.086030000000000051e+00 -3.668750000000000000e+01 +1.086035000000000084e+00 -3.671875381469726562e+01 +1.086040000000000116e+00 -3.662500000000000000e+01 +1.086045000000000149e+00 -3.668750000000000000e+01 +1.086050000000000182e+00 -3.665625000000000000e+01 +1.086054999999999993e+00 -3.671875381469726562e+01 +1.086060000000000025e+00 -3.668750000000000000e+01 +1.086065000000000058e+00 -3.668750000000000000e+01 +1.086070000000000091e+00 -3.668750000000000000e+01 +1.086075000000000124e+00 -3.671875381469726562e+01 +1.086080000000000156e+00 -3.675000000000000000e+01 +1.086085000000000189e+00 -3.671875381469726562e+01 +1.086090000000000000e+00 -3.675000000000000000e+01 +1.086095000000000033e+00 -3.678125000000000000e+01 +1.086100000000000065e+00 -3.675000000000000000e+01 +1.086105000000000098e+00 -3.678125000000000000e+01 +1.086110000000000131e+00 -3.684375000000000000e+01 +1.086115000000000164e+00 -3.681250000000000000e+01 +1.086120000000000196e+00 -3.681250000000000000e+01 +1.086125000000000007e+00 -3.678125000000000000e+01 +1.086130000000000040e+00 -3.678125000000000000e+01 +1.086135000000000073e+00 -3.681250000000000000e+01 +1.086140000000000105e+00 -3.687500381469726562e+01 +1.086145000000000138e+00 -3.681250000000000000e+01 +1.086150000000000171e+00 -3.684375000000000000e+01 +1.086154999999999982e+00 -3.684375000000000000e+01 +1.086160000000000014e+00 -3.684375000000000000e+01 +1.086165000000000047e+00 -3.690625000000000000e+01 +1.086170000000000080e+00 -3.690625000000000000e+01 +1.086175000000000113e+00 -3.690625000000000000e+01 +1.086180000000000145e+00 -3.687500381469726562e+01 +1.086185000000000178e+00 -3.681250000000000000e+01 +1.086189999999999989e+00 -3.690625000000000000e+01 +1.086195000000000022e+00 -3.690625000000000000e+01 +1.086200000000000054e+00 -3.693750000000000000e+01 +1.086205000000000087e+00 -3.693750000000000000e+01 +1.086210000000000120e+00 -3.690625000000000000e+01 +1.086215000000000153e+00 -3.690625000000000000e+01 +1.086220000000000185e+00 -3.693750000000000000e+01 +1.086224999999999996e+00 -3.696875000000000000e+01 +1.086230000000000029e+00 -3.696875000000000000e+01 +1.086235000000000062e+00 -3.696875000000000000e+01 +1.086240000000000094e+00 -3.700000000000000000e+01 +1.086245000000000127e+00 -3.696875000000000000e+01 +1.086250000000000160e+00 -3.690625000000000000e+01 +1.086255000000000193e+00 -3.696875000000000000e+01 +1.086260000000000003e+00 -3.690625000000000000e+01 +1.086265000000000036e+00 -3.693750000000000000e+01 +1.086270000000000069e+00 -3.693750000000000000e+01 +1.086275000000000102e+00 -3.700000000000000000e+01 +1.086280000000000134e+00 -3.696875000000000000e+01 +1.086285000000000167e+00 -3.696875000000000000e+01 +1.086290000000000200e+00 -3.700000000000000000e+01 +1.086295000000000011e+00 -3.703125381469726562e+01 +1.086300000000000043e+00 -3.700000000000000000e+01 +1.086305000000000076e+00 -3.696875000000000000e+01 +1.086310000000000109e+00 -3.696875000000000000e+01 +1.086315000000000142e+00 -3.700000000000000000e+01 +1.086320000000000174e+00 -3.700000000000000000e+01 +1.086324999999999985e+00 -3.700000000000000000e+01 +1.086330000000000018e+00 -3.703125381469726562e+01 +1.086335000000000051e+00 -3.700000000000000000e+01 +1.086340000000000083e+00 -3.700000000000000000e+01 +1.086345000000000116e+00 -3.703125381469726562e+01 +1.086350000000000149e+00 -3.703125381469726562e+01 +1.086355000000000182e+00 -3.706250000000000000e+01 +1.086359999999999992e+00 -3.700000000000000000e+01 +1.086365000000000025e+00 -3.703125381469726562e+01 +1.086370000000000058e+00 -3.703125381469726562e+01 +1.086375000000000091e+00 -3.703125381469726562e+01 +1.086380000000000123e+00 -3.709375000000000000e+01 +1.086385000000000156e+00 -3.709375000000000000e+01 +1.086390000000000189e+00 -3.703125381469726562e+01 +1.086395000000000000e+00 -3.709375000000000000e+01 +1.086400000000000032e+00 -3.709375000000000000e+01 +1.086405000000000065e+00 -3.709375000000000000e+01 +1.086410000000000098e+00 -3.709375000000000000e+01 +1.086415000000000131e+00 -3.709375000000000000e+01 +1.086420000000000163e+00 -3.712500381469726562e+01 +1.086425000000000196e+00 -3.706250000000000000e+01 +1.086430000000000007e+00 -3.709375000000000000e+01 +1.086435000000000040e+00 -3.703125381469726562e+01 +1.086440000000000072e+00 -3.709375000000000000e+01 +1.086445000000000105e+00 -3.715625000000000000e+01 +1.086450000000000138e+00 -3.709375000000000000e+01 +1.086455000000000171e+00 -3.709375000000000000e+01 +1.086459999999999981e+00 -3.715625000000000000e+01 +1.086465000000000014e+00 -3.715625000000000000e+01 +1.086470000000000047e+00 -3.709375000000000000e+01 +1.086475000000000080e+00 -3.715625000000000000e+01 +1.086480000000000112e+00 -3.715625000000000000e+01 +1.086485000000000145e+00 -3.715625000000000000e+01 +1.086490000000000178e+00 -3.718750000000000000e+01 +1.086494999999999989e+00 -3.715625000000000000e+01 +1.086500000000000021e+00 -3.712500381469726562e+01 +1.086505000000000054e+00 -3.721875000000000000e+01 +1.086510000000000087e+00 -3.718750000000000000e+01 +1.086515000000000120e+00 -3.718750000000000000e+01 +1.086520000000000152e+00 -3.721875000000000000e+01 +1.086525000000000185e+00 -3.718750000000000000e+01 +1.086529999999999996e+00 -3.718750000000000000e+01 +1.086535000000000029e+00 -3.728125381469726562e+01 +1.086540000000000061e+00 -3.721875000000000000e+01 +1.086545000000000094e+00 -3.725000000000000000e+01 +1.086550000000000127e+00 -3.728125381469726562e+01 +1.086555000000000160e+00 -3.734375000000000000e+01 +1.086560000000000192e+00 -3.728125381469726562e+01 +1.086565000000000003e+00 -3.731250000000000000e+01 +1.086570000000000036e+00 -3.728125381469726562e+01 +1.086575000000000069e+00 -3.725000000000000000e+01 +1.086580000000000101e+00 -3.737500000000000000e+01 +1.086585000000000134e+00 -3.731250000000000000e+01 +1.086590000000000167e+00 -3.728125381469726562e+01 +1.086595000000000200e+00 -3.731250000000000000e+01 +1.086600000000000010e+00 -3.728125381469726562e+01 +1.086605000000000043e+00 -3.734375000000000000e+01 +1.086610000000000076e+00 -3.731250000000000000e+01 +1.086615000000000109e+00 -3.734375000000000000e+01 +1.086620000000000141e+00 -3.731250000000000000e+01 +1.086625000000000174e+00 -3.737500000000000000e+01 +1.086629999999999985e+00 -3.728125381469726562e+01 +1.086635000000000018e+00 -3.728125381469726562e+01 +1.086640000000000050e+00 -3.731250000000000000e+01 +1.086645000000000083e+00 -3.731250000000000000e+01 +1.086650000000000116e+00 -3.734375000000000000e+01 +1.086655000000000149e+00 -3.728125381469726562e+01 +1.086660000000000181e+00 -3.737500000000000000e+01 +1.086664999999999992e+00 -3.734375000000000000e+01 +1.086670000000000025e+00 -3.734375000000000000e+01 +1.086675000000000058e+00 -3.731250000000000000e+01 +1.086680000000000090e+00 -3.737500000000000000e+01 +1.086685000000000123e+00 -3.734375000000000000e+01 +1.086690000000000156e+00 -3.740625000000000000e+01 +1.086695000000000189e+00 -3.734375000000000000e+01 +1.086699999999999999e+00 -3.734375000000000000e+01 +1.086705000000000032e+00 -3.734375000000000000e+01 +1.086710000000000065e+00 -3.737500000000000000e+01 +1.086715000000000098e+00 -3.737500000000000000e+01 +1.086720000000000130e+00 -3.737500000000000000e+01 +1.086725000000000163e+00 -3.743750381469726562e+01 +1.086730000000000196e+00 -3.734375000000000000e+01 +1.086735000000000007e+00 -3.737500000000000000e+01 +1.086740000000000039e+00 -3.743750381469726562e+01 +1.086745000000000072e+00 -3.737500000000000000e+01 +1.086750000000000105e+00 -3.737500000000000000e+01 +1.086755000000000138e+00 -3.737500000000000000e+01 +1.086760000000000170e+00 -3.737500000000000000e+01 +1.086764999999999981e+00 -3.737500000000000000e+01 +1.086770000000000014e+00 -3.737500000000000000e+01 +1.086775000000000047e+00 -3.737500000000000000e+01 +1.086780000000000079e+00 -3.746875000000000000e+01 +1.086785000000000112e+00 -3.740625000000000000e+01 +1.086790000000000145e+00 -3.740625000000000000e+01 +1.086795000000000178e+00 -3.743750381469726562e+01 +1.086799999999999988e+00 -3.743750381469726562e+01 +1.086805000000000021e+00 -3.740625000000000000e+01 +1.086810000000000054e+00 -3.740625000000000000e+01 +1.086815000000000087e+00 -3.743750381469726562e+01 +1.086820000000000119e+00 -3.750000000000000000e+01 +1.086825000000000152e+00 -3.743750381469726562e+01 +1.086830000000000185e+00 -3.753125000000000000e+01 +1.086834999999999996e+00 -3.746875000000000000e+01 +1.086840000000000028e+00 -3.750000000000000000e+01 +1.086845000000000061e+00 -3.753125000000000000e+01 +1.086850000000000094e+00 -3.753125000000000000e+01 +1.086855000000000127e+00 -3.750000000000000000e+01 +1.086860000000000159e+00 -3.753125000000000000e+01 +1.086865000000000192e+00 -3.756250000000000000e+01 +1.086870000000000003e+00 -3.750000000000000000e+01 +1.086875000000000036e+00 -3.759375381469726562e+01 +1.086880000000000068e+00 -3.762500000000000000e+01 +1.086885000000000101e+00 -3.756250000000000000e+01 +1.086890000000000134e+00 -3.756250000000000000e+01 +1.086895000000000167e+00 -3.759375381469726562e+01 +1.086900000000000199e+00 -3.759375381469726562e+01 +1.086905000000000010e+00 -3.756250000000000000e+01 +1.086910000000000043e+00 -3.756250000000000000e+01 +1.086915000000000076e+00 -3.750000000000000000e+01 +1.086920000000000108e+00 -3.756250000000000000e+01 +1.086925000000000141e+00 -3.759375381469726562e+01 +1.086930000000000174e+00 -3.756250000000000000e+01 +1.086934999999999985e+00 -3.759375381469726562e+01 +1.086940000000000017e+00 -3.762500000000000000e+01 +1.086945000000000050e+00 -3.762500000000000000e+01 +1.086950000000000083e+00 -3.756250000000000000e+01 +1.086955000000000116e+00 -3.762500000000000000e+01 +1.086960000000000148e+00 -3.762500000000000000e+01 +1.086965000000000181e+00 -3.759375381469726562e+01 +1.086969999999999992e+00 -3.759375381469726562e+01 +1.086975000000000025e+00 -3.762500000000000000e+01 +1.086980000000000057e+00 -3.765625000000000000e+01 +1.086985000000000090e+00 -3.765625000000000000e+01 +1.086990000000000123e+00 -3.762500000000000000e+01 +1.086995000000000156e+00 -3.768750000000000000e+01 +1.087000000000000188e+00 -3.771875000000000000e+01 +1.087004999999999999e+00 -3.762500000000000000e+01 +1.087010000000000032e+00 -3.771875000000000000e+01 +1.087015000000000065e+00 -3.768750000000000000e+01 +1.087020000000000097e+00 -3.775000381469726562e+01 +1.087025000000000130e+00 -3.768750000000000000e+01 +1.087030000000000163e+00 -3.771875000000000000e+01 +1.087035000000000196e+00 -3.771875000000000000e+01 +1.087040000000000006e+00 -3.771875000000000000e+01 +1.087045000000000039e+00 -3.765625000000000000e+01 +1.087050000000000072e+00 -3.771875000000000000e+01 +1.087055000000000105e+00 -3.775000381469726562e+01 +1.087060000000000137e+00 -3.771875000000000000e+01 +1.087065000000000170e+00 -3.768750000000000000e+01 +1.087069999999999981e+00 -3.768750000000000000e+01 +1.087075000000000014e+00 -3.778125000000000000e+01 +1.087080000000000046e+00 -3.771875000000000000e+01 +1.087085000000000079e+00 -3.775000381469726562e+01 +1.087090000000000112e+00 -3.778125000000000000e+01 +1.087095000000000145e+00 -3.771875000000000000e+01 +1.087100000000000177e+00 -3.778125000000000000e+01 +1.087104999999999988e+00 -3.778125000000000000e+01 +1.087110000000000021e+00 -3.784375381469726562e+01 +1.087115000000000054e+00 -3.784375381469726562e+01 +1.087120000000000086e+00 -3.778125000000000000e+01 +1.087125000000000119e+00 -3.784375381469726562e+01 +1.087130000000000152e+00 -3.781250000000000000e+01 +1.087135000000000185e+00 -3.784375381469726562e+01 +1.087139999999999995e+00 -3.781250000000000000e+01 +1.087145000000000028e+00 -3.778125000000000000e+01 +1.087150000000000061e+00 -3.784375381469726562e+01 +1.087155000000000094e+00 -3.784375381469726562e+01 +1.087160000000000126e+00 -3.784375381469726562e+01 +1.087165000000000159e+00 -3.781250000000000000e+01 +1.087170000000000192e+00 -3.787500000000000000e+01 +1.087175000000000002e+00 -3.784375381469726562e+01 +1.087180000000000035e+00 -3.781250000000000000e+01 +1.087185000000000068e+00 -3.784375381469726562e+01 +1.087190000000000101e+00 -3.793750000000000000e+01 +1.087195000000000134e+00 -3.787500000000000000e+01 +1.087200000000000166e+00 -3.790625000000000000e+01 +1.087205000000000199e+00 -3.784375381469726562e+01 +1.087210000000000010e+00 -3.784375381469726562e+01 +1.087215000000000042e+00 -3.790625000000000000e+01 +1.087220000000000075e+00 -3.787500000000000000e+01 +1.087225000000000108e+00 -3.787500000000000000e+01 +1.087230000000000141e+00 -3.784375381469726562e+01 +1.087235000000000174e+00 -3.790625000000000000e+01 +1.087239999999999984e+00 -3.790625000000000000e+01 +1.087245000000000017e+00 -3.793750000000000000e+01 +1.087250000000000050e+00 -3.787500000000000000e+01 +1.087255000000000082e+00 -3.787500000000000000e+01 +1.087260000000000115e+00 -3.790625000000000000e+01 +1.087265000000000148e+00 -3.790625000000000000e+01 +1.087270000000000181e+00 -3.790625000000000000e+01 +1.087274999999999991e+00 -3.784375381469726562e+01 +1.087280000000000024e+00 -3.800000381469726562e+01 +1.087285000000000057e+00 -3.787500000000000000e+01 +1.087290000000000090e+00 -3.790625000000000000e+01 +1.087295000000000122e+00 -3.800000381469726562e+01 +1.087300000000000155e+00 -3.796875000000000000e+01 +1.087305000000000188e+00 -3.800000381469726562e+01 +1.087309999999999999e+00 -3.800000381469726562e+01 +1.087315000000000031e+00 -3.796875000000000000e+01 +1.087320000000000064e+00 -3.803125000000000000e+01 +1.087325000000000097e+00 -3.796875000000000000e+01 +1.087330000000000130e+00 -3.796875000000000000e+01 +1.087335000000000163e+00 -3.793750000000000000e+01 +1.087340000000000195e+00 -3.796875000000000000e+01 +1.087345000000000006e+00 -3.793750000000000000e+01 +1.087350000000000039e+00 -3.796875000000000000e+01 +1.087355000000000071e+00 -3.803125000000000000e+01 +1.087360000000000104e+00 -3.800000381469726562e+01 +1.087365000000000137e+00 -3.796875000000000000e+01 +1.087370000000000170e+00 -3.800000381469726562e+01 +1.087374999999999980e+00 -3.800000381469726562e+01 +1.087380000000000013e+00 -3.803125000000000000e+01 +1.087385000000000046e+00 -3.803125000000000000e+01 +1.087390000000000079e+00 -3.800000381469726562e+01 +1.087395000000000111e+00 -3.793750000000000000e+01 +1.087400000000000144e+00 -3.800000381469726562e+01 +1.087405000000000177e+00 -3.793750000000000000e+01 +1.087409999999999988e+00 -3.796875000000000000e+01 +1.087415000000000020e+00 -3.793750000000000000e+01 +1.087420000000000053e+00 -3.800000381469726562e+01 +1.087425000000000086e+00 -3.800000381469726562e+01 +1.087430000000000119e+00 -3.803125000000000000e+01 +1.087435000000000151e+00 -3.800000381469726562e+01 +1.087440000000000184e+00 -3.803125000000000000e+01 +1.087444999999999995e+00 -3.806250000000000000e+01 +1.087450000000000028e+00 -3.803125000000000000e+01 +1.087455000000000060e+00 -3.800000381469726562e+01 +1.087460000000000093e+00 -3.803125000000000000e+01 +1.087465000000000126e+00 -3.806250000000000000e+01 +1.087470000000000159e+00 -3.800000381469726562e+01 +1.087475000000000191e+00 -3.803125000000000000e+01 +1.087480000000000002e+00 -3.803125000000000000e+01 +1.087485000000000035e+00 -3.806250000000000000e+01 +1.087490000000000068e+00 -3.806250000000000000e+01 +1.087495000000000100e+00 -3.803125000000000000e+01 +1.087500000000000133e+00 -3.806250000000000000e+01 +1.087505000000000166e+00 -3.809375000000000000e+01 +1.087510000000000199e+00 -3.809375000000000000e+01 +1.087515000000000009e+00 -3.809375000000000000e+01 +1.087520000000000042e+00 -3.809375000000000000e+01 +1.087525000000000075e+00 -3.809375000000000000e+01 +1.087530000000000108e+00 -3.809375000000000000e+01 +1.087535000000000140e+00 -3.809375000000000000e+01 +1.087540000000000173e+00 -3.803125000000000000e+01 +1.087544999999999984e+00 -3.812500000000000000e+01 +1.087550000000000017e+00 -3.812500000000000000e+01 +1.087555000000000049e+00 -3.815625381469726562e+01 +1.087560000000000082e+00 -3.815625381469726562e+01 +1.087565000000000115e+00 -3.815625381469726562e+01 +1.087570000000000148e+00 -3.809375000000000000e+01 +1.087575000000000180e+00 -3.809375000000000000e+01 +1.087579999999999991e+00 -3.815625381469726562e+01 +1.087585000000000024e+00 -3.815625381469726562e+01 +1.087590000000000057e+00 -3.812500000000000000e+01 +1.087595000000000089e+00 -3.815625381469726562e+01 +1.087600000000000122e+00 -3.812500000000000000e+01 +1.087605000000000155e+00 -3.812500000000000000e+01 +1.087610000000000188e+00 -3.815625381469726562e+01 +1.087614999999999998e+00 -3.815625381469726562e+01 +1.087620000000000031e+00 -3.812500000000000000e+01 +1.087625000000000064e+00 -3.812500000000000000e+01 +1.087630000000000097e+00 -3.812500000000000000e+01 +1.087635000000000129e+00 -3.818750000000000000e+01 +1.087640000000000162e+00 -3.815625381469726562e+01 +1.087645000000000195e+00 -3.812500000000000000e+01 +1.087650000000000006e+00 -3.812500000000000000e+01 +1.087655000000000038e+00 -3.818750000000000000e+01 +1.087660000000000071e+00 -3.812500000000000000e+01 +1.087665000000000104e+00 -3.812500000000000000e+01 +1.087670000000000137e+00 -3.815625381469726562e+01 +1.087675000000000169e+00 -3.812500000000000000e+01 +1.087679999999999980e+00 -3.812500000000000000e+01 +1.087685000000000013e+00 -3.815625381469726562e+01 +1.087690000000000046e+00 -3.812500000000000000e+01 +1.087695000000000078e+00 -3.818750000000000000e+01 +1.087700000000000111e+00 -3.812500000000000000e+01 +1.087705000000000144e+00 -3.818750000000000000e+01 +1.087710000000000177e+00 -3.815625381469726562e+01 +1.087714999999999987e+00 -3.818750000000000000e+01 +1.087720000000000020e+00 -3.812500000000000000e+01 +1.087725000000000053e+00 -3.815625381469726562e+01 +1.087730000000000086e+00 -3.809375000000000000e+01 +1.087735000000000118e+00 -3.818750000000000000e+01 +1.087740000000000151e+00 -3.815625381469726562e+01 +1.087745000000000184e+00 -3.818750000000000000e+01 +1.087749999999999995e+00 -3.818750000000000000e+01 +1.087755000000000027e+00 -3.815625381469726562e+01 +1.087760000000000060e+00 -3.818750000000000000e+01 +1.087765000000000093e+00 -3.821875000000000000e+01 +1.087770000000000126e+00 -3.812500000000000000e+01 +1.087775000000000158e+00 -3.815625381469726562e+01 +1.087780000000000191e+00 -3.818750000000000000e+01 +1.087785000000000002e+00 -3.821875000000000000e+01 +1.087790000000000035e+00 -3.818750000000000000e+01 +1.087795000000000067e+00 -3.821875000000000000e+01 +1.087800000000000100e+00 -3.828125000000000000e+01 +1.087805000000000133e+00 -3.818750000000000000e+01 +1.087810000000000166e+00 -3.815625381469726562e+01 +1.087815000000000198e+00 -3.818750000000000000e+01 +1.087820000000000009e+00 -3.818750000000000000e+01 +1.087825000000000042e+00 -3.825000000000000000e+01 +1.087830000000000075e+00 -3.825000000000000000e+01 +1.087835000000000107e+00 -3.821875000000000000e+01 +1.087840000000000140e+00 -3.821875000000000000e+01 +1.087845000000000173e+00 -3.825000000000000000e+01 +1.087849999999999984e+00 -3.828125000000000000e+01 +1.087855000000000016e+00 -3.825000000000000000e+01 +1.087860000000000049e+00 -3.825000000000000000e+01 +1.087865000000000082e+00 -3.828125000000000000e+01 +1.087870000000000115e+00 -3.825000000000000000e+01 +1.087875000000000147e+00 -3.818750000000000000e+01 +1.087880000000000180e+00 -3.825000000000000000e+01 +1.087884999999999991e+00 -3.818750000000000000e+01 +1.087890000000000024e+00 -3.825000000000000000e+01 +1.087895000000000056e+00 -3.828125000000000000e+01 +1.087900000000000089e+00 -3.825000000000000000e+01 +1.087905000000000122e+00 -3.818750000000000000e+01 +1.087910000000000155e+00 -3.821875000000000000e+01 +1.087915000000000187e+00 -3.818750000000000000e+01 +1.087919999999999998e+00 -3.828125000000000000e+01 +1.087925000000000031e+00 -3.828125000000000000e+01 +1.087930000000000064e+00 -3.831250381469726562e+01 +1.087935000000000096e+00 -3.828125000000000000e+01 +1.087940000000000129e+00 -3.828125000000000000e+01 +1.087945000000000162e+00 -3.828125000000000000e+01 +1.087950000000000195e+00 -3.828125000000000000e+01 +1.087955000000000005e+00 -3.828125000000000000e+01 +1.087960000000000038e+00 -3.821875000000000000e+01 +1.087965000000000071e+00 -3.828125000000000000e+01 +1.087970000000000104e+00 -3.828125000000000000e+01 +1.087975000000000136e+00 -3.831250381469726562e+01 +1.087980000000000169e+00 -3.821875000000000000e+01 +1.087984999999999980e+00 -3.834375000000000000e+01 +1.087990000000000013e+00 -3.828125000000000000e+01 +1.087995000000000045e+00 -3.828125000000000000e+01 +1.088000000000000078e+00 -3.828125000000000000e+01 +1.088005000000000111e+00 -3.828125000000000000e+01 +1.088010000000000144e+00 -3.825000000000000000e+01 +1.088015000000000176e+00 -3.834375000000000000e+01 +1.088019999999999987e+00 -3.821875000000000000e+01 +1.088025000000000020e+00 -3.831250381469726562e+01 +1.088030000000000053e+00 -3.834375000000000000e+01 +1.088035000000000085e+00 -3.834375000000000000e+01 +1.088040000000000118e+00 -3.837500000000000000e+01 +1.088045000000000151e+00 -3.834375000000000000e+01 +1.088050000000000184e+00 -3.831250381469726562e+01 +1.088054999999999994e+00 -3.837500000000000000e+01 +1.088060000000000027e+00 -3.834375000000000000e+01 +1.088065000000000060e+00 -3.834375000000000000e+01 +1.088070000000000093e+00 -3.837500000000000000e+01 +1.088075000000000125e+00 -3.834375000000000000e+01 +1.088080000000000158e+00 -3.837500000000000000e+01 +1.088085000000000191e+00 -3.837500000000000000e+01 +1.088090000000000002e+00 -3.837500000000000000e+01 +1.088095000000000034e+00 -3.840625000000000000e+01 +1.088100000000000067e+00 -3.840625000000000000e+01 +1.088105000000000100e+00 -3.837500000000000000e+01 +1.088110000000000133e+00 -3.843750000000000000e+01 +1.088115000000000165e+00 -3.840625000000000000e+01 +1.088120000000000198e+00 -3.843750000000000000e+01 +1.088125000000000009e+00 -3.843750000000000000e+01 +1.088130000000000042e+00 -3.837500000000000000e+01 +1.088135000000000074e+00 -3.840625000000000000e+01 +1.088140000000000107e+00 -3.846875381469726562e+01 +1.088145000000000140e+00 -3.840625000000000000e+01 +1.088150000000000173e+00 -3.837500000000000000e+01 +1.088154999999999983e+00 -3.850000000000000000e+01 +1.088160000000000016e+00 -3.837500000000000000e+01 +1.088165000000000049e+00 -3.843750000000000000e+01 +1.088170000000000082e+00 -3.843750000000000000e+01 +1.088175000000000114e+00 -3.843750000000000000e+01 +1.088180000000000147e+00 -3.837500000000000000e+01 +1.088185000000000180e+00 -3.843750000000000000e+01 +1.088189999999999991e+00 -3.840625000000000000e+01 +1.088195000000000023e+00 -3.840625000000000000e+01 +1.088200000000000056e+00 -3.837500000000000000e+01 +1.088205000000000089e+00 -3.831250381469726562e+01 +1.088210000000000122e+00 -3.834375000000000000e+01 +1.088215000000000154e+00 -3.843750000000000000e+01 +1.088220000000000187e+00 -3.840625000000000000e+01 +1.088224999999999998e+00 -3.840625000000000000e+01 +1.088230000000000031e+00 -3.846875381469726562e+01 +1.088235000000000063e+00 -3.840625000000000000e+01 +1.088240000000000096e+00 -3.840625000000000000e+01 +1.088245000000000129e+00 -3.843750000000000000e+01 +1.088250000000000162e+00 -3.850000000000000000e+01 +1.088255000000000194e+00 -3.843750000000000000e+01 +1.088260000000000005e+00 -3.840625000000000000e+01 +1.088265000000000038e+00 -3.846875381469726562e+01 +1.088270000000000071e+00 -3.837500000000000000e+01 +1.088275000000000103e+00 -3.840625000000000000e+01 +1.088280000000000136e+00 -3.840625000000000000e+01 +1.088285000000000169e+00 -3.846875381469726562e+01 +1.088289999999999980e+00 -3.846875381469726562e+01 +1.088295000000000012e+00 -3.843750000000000000e+01 +1.088300000000000045e+00 -3.846875381469726562e+01 +1.088305000000000078e+00 -3.843750000000000000e+01 +1.088310000000000111e+00 -3.853125000000000000e+01 +1.088315000000000143e+00 -3.843750000000000000e+01 +1.088320000000000176e+00 -3.850000000000000000e+01 +1.088324999999999987e+00 -3.846875381469726562e+01 +1.088330000000000020e+00 -3.850000000000000000e+01 +1.088335000000000052e+00 -3.850000000000000000e+01 +1.088340000000000085e+00 -3.843750000000000000e+01 +1.088345000000000118e+00 -3.846875381469726562e+01 +1.088350000000000151e+00 -3.840625000000000000e+01 +1.088355000000000183e+00 -3.850000000000000000e+01 +1.088359999999999994e+00 -3.853125000000000000e+01 +1.088365000000000027e+00 -3.850000000000000000e+01 +1.088370000000000060e+00 -3.850000000000000000e+01 +1.088375000000000092e+00 -3.840625000000000000e+01 +1.088380000000000125e+00 -3.843750000000000000e+01 +1.088385000000000158e+00 -3.843750000000000000e+01 +1.088390000000000191e+00 -3.843750000000000000e+01 +1.088395000000000001e+00 -3.850000000000000000e+01 +1.088400000000000034e+00 -3.850000000000000000e+01 +1.088405000000000067e+00 -3.850000000000000000e+01 +1.088410000000000100e+00 -3.850000000000000000e+01 +1.088415000000000132e+00 -3.850000000000000000e+01 +1.088420000000000165e+00 -3.846875381469726562e+01 +1.088425000000000198e+00 -3.850000000000000000e+01 +1.088430000000000009e+00 -3.853125000000000000e+01 +1.088435000000000041e+00 -3.846875381469726562e+01 +1.088440000000000074e+00 -3.846875381469726562e+01 +1.088445000000000107e+00 -3.853125000000000000e+01 +1.088450000000000140e+00 -3.850000000000000000e+01 +1.088455000000000172e+00 -3.853125000000000000e+01 +1.088459999999999983e+00 -3.856250381469726562e+01 +1.088465000000000016e+00 -3.856250381469726562e+01 +1.088470000000000049e+00 -3.856250381469726562e+01 +1.088475000000000081e+00 -3.853125000000000000e+01 +1.088480000000000114e+00 -3.853125000000000000e+01 +1.088485000000000147e+00 -3.856250381469726562e+01 +1.088490000000000180e+00 -3.862500000000000000e+01 +1.088494999999999990e+00 -3.850000000000000000e+01 +1.088500000000000023e+00 -3.865625000000000000e+01 +1.088505000000000056e+00 -3.859375000000000000e+01 +1.088510000000000089e+00 -3.859375000000000000e+01 +1.088515000000000121e+00 -3.859375000000000000e+01 +1.088520000000000154e+00 -3.859375000000000000e+01 +1.088525000000000187e+00 -3.862500000000000000e+01 +1.088529999999999998e+00 -3.859375000000000000e+01 +1.088535000000000030e+00 -3.856250381469726562e+01 +1.088540000000000063e+00 -3.865625000000000000e+01 +1.088545000000000096e+00 -3.862500000000000000e+01 +1.088550000000000129e+00 -3.856250381469726562e+01 +1.088555000000000161e+00 -3.862500000000000000e+01 +1.088560000000000194e+00 -3.859375000000000000e+01 +1.088565000000000005e+00 -3.859375000000000000e+01 +1.088570000000000038e+00 -3.859375000000000000e+01 +1.088575000000000070e+00 -3.859375000000000000e+01 +1.088580000000000103e+00 -3.862500000000000000e+01 +1.088585000000000136e+00 -3.862500000000000000e+01 +1.088590000000000169e+00 -3.862500000000000000e+01 +1.088594999999999979e+00 -3.859375000000000000e+01 +1.088600000000000012e+00 -3.871875381469726562e+01 +1.088605000000000045e+00 -3.862500000000000000e+01 +1.088610000000000078e+00 -3.865625000000000000e+01 +1.088615000000000110e+00 -3.865625000000000000e+01 +1.088620000000000143e+00 -3.865625000000000000e+01 +1.088625000000000176e+00 -3.865625000000000000e+01 +1.088629999999999987e+00 -3.859375000000000000e+01 +1.088635000000000019e+00 -3.865625000000000000e+01 +1.088640000000000052e+00 -3.865625000000000000e+01 +1.088645000000000085e+00 -3.865625000000000000e+01 +1.088650000000000118e+00 -3.868750000000000000e+01 +1.088655000000000150e+00 -3.871875381469726562e+01 +1.088660000000000183e+00 -3.871875381469726562e+01 +1.088664999999999994e+00 -3.871875381469726562e+01 +1.088670000000000027e+00 -3.871875381469726562e+01 +1.088675000000000059e+00 -3.871875381469726562e+01 +1.088680000000000092e+00 -3.868750000000000000e+01 +1.088685000000000125e+00 -3.865625000000000000e+01 +1.088690000000000158e+00 -3.865625000000000000e+01 +1.088695000000000190e+00 -3.865625000000000000e+01 +1.088700000000000001e+00 -3.865625000000000000e+01 +1.088705000000000034e+00 -3.862500000000000000e+01 +1.088710000000000067e+00 -3.865625000000000000e+01 +1.088715000000000099e+00 -3.865625000000000000e+01 +1.088720000000000132e+00 -3.868750000000000000e+01 +1.088725000000000165e+00 -3.865625000000000000e+01 +1.088730000000000198e+00 -3.868750000000000000e+01 +1.088735000000000008e+00 -3.865625000000000000e+01 +1.088740000000000041e+00 -3.868750000000000000e+01 +1.088745000000000074e+00 -3.868750000000000000e+01 +1.088750000000000107e+00 -3.875000000000000000e+01 +1.088755000000000139e+00 -3.868750000000000000e+01 +1.088760000000000172e+00 -3.878125000000000000e+01 +1.088764999999999983e+00 -3.871875381469726562e+01 +1.088770000000000016e+00 -3.875000000000000000e+01 +1.088775000000000048e+00 -3.871875381469726562e+01 +1.088780000000000081e+00 -3.871875381469726562e+01 +1.088785000000000114e+00 -3.871875381469726562e+01 +1.088790000000000147e+00 -3.871875381469726562e+01 +1.088795000000000179e+00 -3.875000000000000000e+01 +1.088799999999999990e+00 -3.871875381469726562e+01 +1.088805000000000023e+00 -3.875000000000000000e+01 +1.088810000000000056e+00 -3.871875381469726562e+01 +1.088815000000000088e+00 -3.871875381469726562e+01 +1.088820000000000121e+00 -3.871875381469726562e+01 +1.088825000000000154e+00 -3.878125000000000000e+01 +1.088830000000000187e+00 -3.868750000000000000e+01 +1.088834999999999997e+00 -3.871875381469726562e+01 +1.088840000000000030e+00 -3.875000000000000000e+01 +1.088845000000000063e+00 -3.871875381469726562e+01 +1.088850000000000096e+00 -3.868750000000000000e+01 +1.088855000000000128e+00 -3.871875381469726562e+01 +1.088860000000000161e+00 -3.871875381469726562e+01 +1.088865000000000194e+00 -3.875000000000000000e+01 +1.088870000000000005e+00 -3.875000000000000000e+01 +1.088875000000000037e+00 -3.878125000000000000e+01 +1.088880000000000070e+00 -3.871875381469726562e+01 +1.088885000000000103e+00 -3.875000000000000000e+01 +1.088890000000000136e+00 -3.878125000000000000e+01 +1.088895000000000168e+00 -3.871875381469726562e+01 +1.088899999999999979e+00 -3.871875381469726562e+01 +1.088905000000000012e+00 -3.881250000000000000e+01 +1.088910000000000045e+00 -3.878125000000000000e+01 +1.088915000000000077e+00 -3.878125000000000000e+01 +1.088920000000000110e+00 -3.878125000000000000e+01 +1.088925000000000143e+00 -3.878125000000000000e+01 +1.088930000000000176e+00 -3.881250000000000000e+01 +1.088934999999999986e+00 -3.871875381469726562e+01 +1.088940000000000019e+00 -3.875000000000000000e+01 +1.088945000000000052e+00 -3.878125000000000000e+01 +1.088950000000000085e+00 -3.884375000000000000e+01 +1.088955000000000117e+00 -3.881250000000000000e+01 +1.088960000000000150e+00 -3.878125000000000000e+01 +1.088965000000000183e+00 -3.881250000000000000e+01 +1.088969999999999994e+00 -3.881250000000000000e+01 +1.088975000000000026e+00 -3.871875381469726562e+01 +1.088980000000000059e+00 -3.878125000000000000e+01 +1.088985000000000092e+00 -3.878125000000000000e+01 +1.088990000000000125e+00 -3.868750000000000000e+01 +1.088995000000000157e+00 -3.871875381469726562e+01 +1.089000000000000190e+00 -3.878125000000000000e+01 +1.089005000000000001e+00 -3.875000000000000000e+01 +1.089010000000000034e+00 -3.881250000000000000e+01 +1.089015000000000066e+00 -3.878125000000000000e+01 +1.089020000000000099e+00 -3.878125000000000000e+01 +1.089025000000000132e+00 -3.878125000000000000e+01 +1.089030000000000165e+00 -3.878125000000000000e+01 +1.089035000000000197e+00 -3.875000000000000000e+01 +1.089040000000000008e+00 -3.884375000000000000e+01 +1.089045000000000041e+00 -3.875000000000000000e+01 +1.089050000000000074e+00 -3.875000000000000000e+01 +1.089055000000000106e+00 -3.878125000000000000e+01 +1.089060000000000139e+00 -3.878125000000000000e+01 +1.089065000000000172e+00 -3.881250000000000000e+01 +1.089069999999999983e+00 -3.875000000000000000e+01 +1.089075000000000015e+00 -3.884375000000000000e+01 +1.089080000000000048e+00 -3.875000000000000000e+01 +1.089085000000000081e+00 -3.878125000000000000e+01 +1.089090000000000114e+00 -3.884375000000000000e+01 +1.089095000000000146e+00 -3.878125000000000000e+01 +1.089100000000000179e+00 -3.884375000000000000e+01 +1.089104999999999990e+00 -3.881250000000000000e+01 +1.089110000000000023e+00 -3.887500381469726562e+01 +1.089115000000000055e+00 -3.884375000000000000e+01 +1.089120000000000088e+00 -3.881250000000000000e+01 +1.089125000000000121e+00 -3.878125000000000000e+01 +1.089130000000000154e+00 -3.884375000000000000e+01 +1.089135000000000186e+00 -3.887500381469726562e+01 +1.089139999999999997e+00 -3.884375000000000000e+01 +1.089145000000000030e+00 -3.884375000000000000e+01 +1.089150000000000063e+00 -3.884375000000000000e+01 +1.089155000000000095e+00 -3.881250000000000000e+01 +1.089160000000000128e+00 -3.881250000000000000e+01 +1.089165000000000161e+00 -3.881250000000000000e+01 +1.089170000000000194e+00 -3.887500381469726562e+01 +1.089175000000000004e+00 -3.887500381469726562e+01 +1.089180000000000037e+00 -3.887500381469726562e+01 +1.089185000000000070e+00 -3.884375000000000000e+01 +1.089190000000000103e+00 -3.887500381469726562e+01 +1.089195000000000135e+00 -3.893750000000000000e+01 +1.089200000000000168e+00 -3.890625000000000000e+01 +1.089204999999999979e+00 -3.890625000000000000e+01 +1.089210000000000012e+00 -3.887500381469726562e+01 +1.089215000000000044e+00 -3.893750000000000000e+01 +1.089220000000000077e+00 -3.890625000000000000e+01 +1.089225000000000110e+00 -3.896875000000000000e+01 +1.089230000000000143e+00 -3.893750000000000000e+01 +1.089235000000000175e+00 -3.893750000000000000e+01 +1.089239999999999986e+00 -3.896875000000000000e+01 +1.089245000000000019e+00 -3.890625000000000000e+01 +1.089250000000000052e+00 -3.893750000000000000e+01 +1.089255000000000084e+00 -3.900000000000000000e+01 +1.089260000000000117e+00 -3.896875000000000000e+01 +1.089265000000000150e+00 -3.893750000000000000e+01 +1.089270000000000183e+00 -3.900000000000000000e+01 +1.089274999999999993e+00 -3.893750000000000000e+01 +1.089280000000000026e+00 -3.896875000000000000e+01 +1.089285000000000059e+00 -3.893750000000000000e+01 +1.089290000000000092e+00 -3.893750000000000000e+01 +1.089295000000000124e+00 -3.900000000000000000e+01 +1.089300000000000157e+00 -3.896875000000000000e+01 +1.089305000000000190e+00 -3.893750000000000000e+01 +1.089310000000000000e+00 -3.896875000000000000e+01 +1.089315000000000033e+00 -3.893750000000000000e+01 +1.089320000000000066e+00 -3.893750000000000000e+01 +1.089325000000000099e+00 -3.893750000000000000e+01 +1.089330000000000132e+00 -3.896875000000000000e+01 +1.089335000000000164e+00 -3.896875000000000000e+01 +1.089340000000000197e+00 -3.900000000000000000e+01 +1.089345000000000008e+00 -3.900000000000000000e+01 +1.089350000000000041e+00 -3.893750000000000000e+01 +1.089355000000000073e+00 -3.896875000000000000e+01 +1.089360000000000106e+00 -3.896875000000000000e+01 +1.089365000000000139e+00 -3.896875000000000000e+01 +1.089370000000000172e+00 -3.896875000000000000e+01 +1.089374999999999982e+00 -3.900000000000000000e+01 +1.089380000000000015e+00 -3.896875000000000000e+01 +1.089385000000000048e+00 -3.900000000000000000e+01 +1.089390000000000081e+00 -3.900000000000000000e+01 +1.089395000000000113e+00 -3.896875000000000000e+01 +1.089400000000000146e+00 -3.903125381469726562e+01 +1.089405000000000179e+00 -3.903125381469726562e+01 +1.089409999999999989e+00 -3.903125381469726562e+01 +1.089415000000000022e+00 -3.900000000000000000e+01 +1.089420000000000055e+00 -3.900000000000000000e+01 +1.089425000000000088e+00 -3.903125381469726562e+01 +1.089430000000000121e+00 -3.900000000000000000e+01 +1.089435000000000153e+00 -3.900000000000000000e+01 +1.089440000000000186e+00 -3.903125381469726562e+01 +1.089444999999999997e+00 -3.906250000000000000e+01 +1.089450000000000029e+00 -3.903125381469726562e+01 +1.089455000000000062e+00 -3.903125381469726562e+01 +1.089460000000000095e+00 -3.909375000000000000e+01 +1.089465000000000128e+00 -3.903125381469726562e+01 +1.089470000000000161e+00 -3.906250000000000000e+01 +1.089475000000000193e+00 -3.903125381469726562e+01 +1.089480000000000004e+00 -3.900000000000000000e+01 +1.089485000000000037e+00 -3.903125381469726562e+01 +1.089490000000000069e+00 -3.903125381469726562e+01 +1.089495000000000102e+00 -3.903125381469726562e+01 +1.089500000000000135e+00 -3.903125381469726562e+01 +1.089505000000000168e+00 -3.912500000000000000e+01 +1.089509999999999978e+00 -3.909375000000000000e+01 +1.089515000000000011e+00 -3.912500000000000000e+01 +1.089520000000000044e+00 -3.906250000000000000e+01 +1.089525000000000077e+00 -3.912500000000000000e+01 +1.089530000000000109e+00 -3.909375000000000000e+01 +1.089535000000000142e+00 -3.900000000000000000e+01 +1.089540000000000175e+00 -3.909375000000000000e+01 +1.089544999999999986e+00 -3.906250000000000000e+01 +1.089550000000000018e+00 -3.906250000000000000e+01 +1.089555000000000051e+00 -3.909375000000000000e+01 +1.089560000000000084e+00 -3.909375000000000000e+01 +1.089565000000000117e+00 -3.906250000000000000e+01 +1.089570000000000149e+00 -3.903125381469726562e+01 +1.089575000000000182e+00 -3.909375000000000000e+01 +1.089579999999999993e+00 -3.915625000000000000e+01 +1.089585000000000026e+00 -3.903125381469726562e+01 +1.089590000000000058e+00 -3.909375000000000000e+01 +1.089595000000000091e+00 -3.909375000000000000e+01 +1.089600000000000124e+00 -3.912500000000000000e+01 +1.089605000000000157e+00 -3.918750381469726562e+01 +1.089610000000000190e+00 -3.906250000000000000e+01 +1.089615000000000000e+00 -3.912500000000000000e+01 +1.089620000000000033e+00 -3.909375000000000000e+01 +1.089625000000000066e+00 -3.915625000000000000e+01 +1.089630000000000098e+00 -3.912500000000000000e+01 +1.089635000000000131e+00 -3.909375000000000000e+01 +1.089640000000000164e+00 -3.909375000000000000e+01 +1.089645000000000197e+00 -3.906250000000000000e+01 +1.089650000000000007e+00 -3.909375000000000000e+01 +1.089655000000000040e+00 -3.912500000000000000e+01 +1.089660000000000073e+00 -3.906250000000000000e+01 +1.089665000000000106e+00 -3.912500000000000000e+01 +1.089670000000000138e+00 -3.909375000000000000e+01 +1.089675000000000171e+00 -3.909375000000000000e+01 +1.089679999999999982e+00 -3.909375000000000000e+01 +1.089685000000000015e+00 -3.909375000000000000e+01 +1.089690000000000047e+00 -3.909375000000000000e+01 +1.089695000000000080e+00 -3.906250000000000000e+01 +1.089700000000000113e+00 -3.903125381469726562e+01 +1.089705000000000146e+00 -3.915625000000000000e+01 +1.089710000000000178e+00 -3.906250000000000000e+01 +1.089714999999999989e+00 -3.903125381469726562e+01 +1.089720000000000022e+00 -3.912500000000000000e+01 +1.089725000000000055e+00 -3.909375000000000000e+01 +1.089730000000000087e+00 -3.909375000000000000e+01 +1.089735000000000120e+00 -3.912500000000000000e+01 +1.089740000000000153e+00 -3.909375000000000000e+01 +1.089745000000000186e+00 -3.912500000000000000e+01 +1.089749999999999996e+00 -3.909375000000000000e+01 +1.089755000000000029e+00 -3.915625000000000000e+01 +1.089760000000000062e+00 -3.912500000000000000e+01 +1.089765000000000095e+00 -3.912500000000000000e+01 +1.089770000000000127e+00 -3.912500000000000000e+01 +1.089775000000000160e+00 -3.915625000000000000e+01 +1.089780000000000193e+00 -3.918750381469726562e+01 +1.089785000000000004e+00 -3.912500000000000000e+01 +1.089790000000000036e+00 -3.915625000000000000e+01 +1.089795000000000069e+00 -3.915625000000000000e+01 +1.089800000000000102e+00 -3.915625000000000000e+01 +1.089805000000000135e+00 -3.912500000000000000e+01 +1.089810000000000167e+00 -3.909375000000000000e+01 +1.089814999999999978e+00 -3.915625000000000000e+01 +1.089820000000000011e+00 -3.915625000000000000e+01 +1.089825000000000044e+00 -3.915625000000000000e+01 +1.089830000000000076e+00 -3.915625000000000000e+01 +1.089835000000000109e+00 -3.918750381469726562e+01 +1.089840000000000142e+00 -3.915625000000000000e+01 +1.089845000000000175e+00 -3.915625000000000000e+01 +1.089849999999999985e+00 -3.915625000000000000e+01 +1.089855000000000018e+00 -3.915625000000000000e+01 +1.089860000000000051e+00 -3.912500000000000000e+01 +1.089865000000000084e+00 -3.915625000000000000e+01 +1.089870000000000116e+00 -3.912500000000000000e+01 +1.089875000000000149e+00 -3.915625000000000000e+01 +1.089880000000000182e+00 -3.918750381469726562e+01 +1.089884999999999993e+00 -3.915625000000000000e+01 +1.089890000000000025e+00 -3.921875000000000000e+01 +1.089895000000000058e+00 -3.918750381469726562e+01 +1.089900000000000091e+00 -3.915625000000000000e+01 +1.089905000000000124e+00 -3.921875000000000000e+01 +1.089910000000000156e+00 -3.925000000000000000e+01 +1.089915000000000189e+00 -3.909375000000000000e+01 +1.089920000000000000e+00 -3.915625000000000000e+01 +1.089925000000000033e+00 -3.918750381469726562e+01 +1.089930000000000065e+00 -3.918750381469726562e+01 +1.089935000000000098e+00 -3.915625000000000000e+01 +1.089940000000000131e+00 -3.912500000000000000e+01 +1.089945000000000164e+00 -3.912500000000000000e+01 +1.089950000000000196e+00 -3.921875000000000000e+01 +1.089955000000000007e+00 -3.921875000000000000e+01 +1.089960000000000040e+00 -3.918750381469726562e+01 +1.089965000000000073e+00 -3.928125000000000000e+01 +1.089970000000000105e+00 -3.918750381469726562e+01 +1.089975000000000138e+00 -3.915625000000000000e+01 +1.089980000000000171e+00 -3.918750381469726562e+01 +1.089984999999999982e+00 -3.918750381469726562e+01 +1.089990000000000014e+00 -3.921875000000000000e+01 +1.089995000000000047e+00 -3.925000000000000000e+01 +1.090000000000000080e+00 -3.918750381469726562e+01 +1.090005000000000113e+00 -3.921875000000000000e+01 +1.090010000000000145e+00 -3.925000000000000000e+01 +1.090015000000000178e+00 -3.918750381469726562e+01 +1.090019999999999989e+00 -3.925000000000000000e+01 +1.090025000000000022e+00 -3.918750381469726562e+01 +1.090030000000000054e+00 -3.918750381469726562e+01 +1.090035000000000087e+00 -3.921875000000000000e+01 +1.090040000000000120e+00 -3.918750381469726562e+01 +1.090045000000000153e+00 -3.918750381469726562e+01 +1.090050000000000185e+00 -3.921875000000000000e+01 +1.090054999999999996e+00 -3.915625000000000000e+01 +1.090060000000000029e+00 -3.918750381469726562e+01 +1.090065000000000062e+00 -3.921875000000000000e+01 +1.090070000000000094e+00 -3.921875000000000000e+01 +1.090075000000000127e+00 -3.921875000000000000e+01 +1.090080000000000160e+00 -3.918750381469726562e+01 +1.090085000000000193e+00 -3.921875000000000000e+01 +1.090090000000000003e+00 -3.921875000000000000e+01 +1.090095000000000036e+00 -3.918750381469726562e+01 +1.090100000000000069e+00 -3.918750381469726562e+01 +1.090105000000000102e+00 -3.925000000000000000e+01 +1.090110000000000134e+00 -3.925000000000000000e+01 +1.090115000000000167e+00 -3.925000000000000000e+01 +1.090120000000000200e+00 -3.925000000000000000e+01 +1.090125000000000011e+00 -3.934375381469726562e+01 +1.090130000000000043e+00 -3.925000000000000000e+01 +1.090135000000000076e+00 -3.925000000000000000e+01 +1.090140000000000109e+00 -3.925000000000000000e+01 +1.090145000000000142e+00 -3.925000000000000000e+01 +1.090150000000000174e+00 -3.934375381469726562e+01 +1.090154999999999985e+00 -3.928125000000000000e+01 +1.090160000000000018e+00 -3.928125000000000000e+01 +1.090165000000000051e+00 -3.921875000000000000e+01 +1.090170000000000083e+00 -3.925000000000000000e+01 +1.090175000000000116e+00 -3.928125000000000000e+01 +1.090180000000000149e+00 -3.934375381469726562e+01 +1.090185000000000182e+00 -3.934375381469726562e+01 +1.090189999999999992e+00 -3.928125000000000000e+01 +1.090195000000000025e+00 -3.925000000000000000e+01 +1.090200000000000058e+00 -3.918750381469726562e+01 +1.090205000000000091e+00 -3.937500000000000000e+01 +1.090210000000000123e+00 -3.925000000000000000e+01 +1.090215000000000156e+00 -3.934375381469726562e+01 +1.090220000000000189e+00 -3.931250000000000000e+01 +1.090225000000000000e+00 -3.931250000000000000e+01 +1.090230000000000032e+00 -3.934375381469726562e+01 +1.090235000000000065e+00 -3.934375381469726562e+01 +1.090240000000000098e+00 -3.931250000000000000e+01 +1.090245000000000131e+00 -3.943750381469726562e+01 +1.090250000000000163e+00 -3.940625000000000000e+01 +1.090255000000000196e+00 -3.940625000000000000e+01 +1.090260000000000007e+00 -3.934375381469726562e+01 +1.090265000000000040e+00 -3.931250000000000000e+01 +1.090270000000000072e+00 -3.937500000000000000e+01 +1.090275000000000105e+00 -3.946875000000000000e+01 +1.090280000000000138e+00 -3.931250000000000000e+01 +1.090285000000000171e+00 -3.934375381469726562e+01 +1.090289999999999981e+00 -3.934375381469726562e+01 +1.090295000000000014e+00 -3.931250000000000000e+01 +1.090300000000000047e+00 -3.934375381469726562e+01 +1.090305000000000080e+00 -3.934375381469726562e+01 +1.090310000000000112e+00 -3.937500000000000000e+01 +1.090315000000000145e+00 -3.934375381469726562e+01 +1.090320000000000178e+00 -3.934375381469726562e+01 +1.090324999999999989e+00 -3.934375381469726562e+01 +1.090330000000000021e+00 -3.934375381469726562e+01 +1.090335000000000054e+00 -3.940625000000000000e+01 +1.090340000000000087e+00 -3.928125000000000000e+01 +1.090345000000000120e+00 -3.934375381469726562e+01 +1.090350000000000152e+00 -3.931250000000000000e+01 +1.090355000000000185e+00 -3.937500000000000000e+01 +1.090359999999999996e+00 -3.934375381469726562e+01 +1.090365000000000029e+00 -3.934375381469726562e+01 +1.090370000000000061e+00 -3.940625000000000000e+01 +1.090375000000000094e+00 -3.934375381469726562e+01 +1.090380000000000127e+00 -3.934375381469726562e+01 +1.090385000000000160e+00 -3.937500000000000000e+01 +1.090390000000000192e+00 -3.940625000000000000e+01 +1.090395000000000003e+00 -3.931250000000000000e+01 +1.090400000000000036e+00 -3.937500000000000000e+01 +1.090405000000000069e+00 -3.934375381469726562e+01 +1.090410000000000101e+00 -3.937500000000000000e+01 +1.090415000000000134e+00 -3.937500000000000000e+01 +1.090420000000000167e+00 -3.934375381469726562e+01 +1.090425000000000200e+00 -3.934375381469726562e+01 +1.090430000000000010e+00 -3.937500000000000000e+01 +1.090435000000000043e+00 -3.934375381469726562e+01 +1.090440000000000076e+00 -3.928125000000000000e+01 +1.090445000000000109e+00 -3.943750381469726562e+01 +1.090450000000000141e+00 -3.934375381469726562e+01 +1.090455000000000174e+00 -3.940625000000000000e+01 +1.090459999999999985e+00 -3.937500000000000000e+01 +1.090465000000000018e+00 -3.937500000000000000e+01 +1.090470000000000050e+00 -3.940625000000000000e+01 +1.090475000000000083e+00 -3.934375381469726562e+01 +1.090480000000000116e+00 -3.937500000000000000e+01 +1.090485000000000149e+00 -3.937500000000000000e+01 +1.090490000000000181e+00 -3.943750381469726562e+01 +1.090494999999999992e+00 -3.946875000000000000e+01 +1.090500000000000025e+00 -3.940625000000000000e+01 +1.090505000000000058e+00 -3.943750381469726562e+01 +1.090510000000000090e+00 -3.943750381469726562e+01 +1.090515000000000123e+00 -3.940625000000000000e+01 +1.090520000000000156e+00 -3.943750381469726562e+01 +1.090525000000000189e+00 -3.943750381469726562e+01 +1.090529999999999999e+00 -3.934375381469726562e+01 +1.090535000000000032e+00 -3.943750381469726562e+01 +1.090540000000000065e+00 -3.940625000000000000e+01 +1.090545000000000098e+00 -3.937500000000000000e+01 +1.090550000000000130e+00 -3.943750381469726562e+01 +1.090555000000000163e+00 -3.943750381469726562e+01 +1.090560000000000196e+00 -3.937500000000000000e+01 +1.090565000000000007e+00 -3.943750381469726562e+01 +1.090570000000000039e+00 -3.946875000000000000e+01 +1.090575000000000072e+00 -3.940625000000000000e+01 +1.090580000000000105e+00 -3.937500000000000000e+01 +1.090585000000000138e+00 -3.940625000000000000e+01 +1.090590000000000170e+00 -3.946875000000000000e+01 +1.090594999999999981e+00 -3.934375381469726562e+01 +1.090600000000000014e+00 -3.943750381469726562e+01 +1.090605000000000047e+00 -3.946875000000000000e+01 +1.090610000000000079e+00 -3.946875000000000000e+01 +1.090615000000000112e+00 -3.940625000000000000e+01 +1.090620000000000145e+00 -3.946875000000000000e+01 +1.090625000000000178e+00 -3.943750381469726562e+01 +1.090629999999999988e+00 -3.943750381469726562e+01 +1.090635000000000021e+00 -3.946875000000000000e+01 +1.090640000000000054e+00 -3.946875000000000000e+01 +1.090645000000000087e+00 -3.950000000000000000e+01 +1.090650000000000119e+00 -3.943750381469726562e+01 +1.090655000000000152e+00 -3.943750381469726562e+01 +1.090660000000000185e+00 -3.946875000000000000e+01 +1.090664999999999996e+00 -3.940625000000000000e+01 +1.090670000000000028e+00 -3.950000000000000000e+01 +1.090675000000000061e+00 -3.937500000000000000e+01 +1.090680000000000094e+00 -3.946875000000000000e+01 +1.090685000000000127e+00 -3.943750381469726562e+01 +1.090690000000000159e+00 -3.950000000000000000e+01 +1.090695000000000192e+00 -3.946875000000000000e+01 +1.090700000000000003e+00 -3.943750381469726562e+01 +1.090705000000000036e+00 -3.946875000000000000e+01 +1.090710000000000068e+00 -3.943750381469726562e+01 +1.090715000000000101e+00 -3.943750381469726562e+01 +1.090720000000000134e+00 -3.940625000000000000e+01 +1.090725000000000167e+00 -3.943750381469726562e+01 +1.090730000000000199e+00 -3.946875000000000000e+01 +1.090735000000000010e+00 -3.946875000000000000e+01 +1.090740000000000043e+00 -3.946875000000000000e+01 +1.090745000000000076e+00 -3.946875000000000000e+01 +1.090750000000000108e+00 -3.946875000000000000e+01 +1.090755000000000141e+00 -3.950000000000000000e+01 +1.090760000000000174e+00 -3.946875000000000000e+01 +1.090764999999999985e+00 -3.943750381469726562e+01 +1.090770000000000017e+00 -3.943750381469726562e+01 +1.090775000000000050e+00 -3.943750381469726562e+01 +1.090780000000000083e+00 -3.946875000000000000e+01 +1.090785000000000116e+00 -3.946875000000000000e+01 +1.090790000000000148e+00 -3.946875000000000000e+01 +1.090795000000000181e+00 -3.946875000000000000e+01 +1.090799999999999992e+00 -3.953125000000000000e+01 +1.090805000000000025e+00 -3.946875000000000000e+01 +1.090810000000000057e+00 -3.946875000000000000e+01 +1.090815000000000090e+00 -3.946875000000000000e+01 +1.090820000000000123e+00 -3.950000000000000000e+01 +1.090825000000000156e+00 -3.950000000000000000e+01 +1.090830000000000188e+00 -3.946875000000000000e+01 +1.090834999999999999e+00 -3.943750381469726562e+01 +1.090840000000000032e+00 -3.950000000000000000e+01 +1.090845000000000065e+00 -3.943750381469726562e+01 +1.090850000000000097e+00 -3.946875000000000000e+01 +1.090855000000000130e+00 -3.950000000000000000e+01 +1.090860000000000163e+00 -3.946875000000000000e+01 +1.090865000000000196e+00 -3.950000000000000000e+01 +1.090870000000000006e+00 -3.953125000000000000e+01 +1.090875000000000039e+00 -3.953125000000000000e+01 +1.090880000000000072e+00 -3.950000000000000000e+01 +1.090885000000000105e+00 -3.953125000000000000e+01 +1.090890000000000137e+00 -3.953125000000000000e+01 +1.090895000000000170e+00 -3.950000000000000000e+01 +1.090899999999999981e+00 -3.953125000000000000e+01 +1.090905000000000014e+00 -3.953125000000000000e+01 +1.090910000000000046e+00 -3.946875000000000000e+01 +1.090915000000000079e+00 -3.959375381469726562e+01 +1.090920000000000112e+00 -3.956250000000000000e+01 +1.090925000000000145e+00 -3.953125000000000000e+01 +1.090930000000000177e+00 -3.959375381469726562e+01 +1.090934999999999988e+00 -3.953125000000000000e+01 +1.090940000000000021e+00 -3.959375381469726562e+01 +1.090945000000000054e+00 -3.959375381469726562e+01 +1.090950000000000086e+00 -3.959375381469726562e+01 +1.090955000000000119e+00 -3.959375381469726562e+01 +1.090960000000000152e+00 -3.953125000000000000e+01 +1.090965000000000185e+00 -3.956250000000000000e+01 +1.090969999999999995e+00 -3.950000000000000000e+01 +1.090975000000000028e+00 -3.956250000000000000e+01 +1.090980000000000061e+00 -3.956250000000000000e+01 +1.090985000000000094e+00 -3.956250000000000000e+01 +1.090990000000000126e+00 -3.956250000000000000e+01 +1.090995000000000159e+00 -3.956250000000000000e+01 +1.091000000000000192e+00 -3.959375381469726562e+01 +1.091005000000000003e+00 -3.959375381469726562e+01 +1.091010000000000035e+00 -3.953125000000000000e+01 +1.091015000000000068e+00 -3.959375381469726562e+01 +1.091020000000000101e+00 -3.956250000000000000e+01 +1.091025000000000134e+00 -3.953125000000000000e+01 +1.091030000000000166e+00 -3.950000000000000000e+01 +1.091035000000000199e+00 -3.953125000000000000e+01 +1.091040000000000010e+00 -3.950000000000000000e+01 +1.091045000000000043e+00 -3.962500000000000000e+01 +1.091050000000000075e+00 -3.962500000000000000e+01 +1.091055000000000108e+00 -3.956250000000000000e+01 +1.091060000000000141e+00 -3.959375381469726562e+01 +1.091065000000000174e+00 -3.959375381469726562e+01 +1.091069999999999984e+00 -3.962500000000000000e+01 +1.091075000000000017e+00 -3.956250000000000000e+01 +1.091080000000000050e+00 -3.959375381469726562e+01 +1.091085000000000083e+00 -3.950000000000000000e+01 +1.091090000000000115e+00 -3.956250000000000000e+01 +1.091095000000000148e+00 -3.956250000000000000e+01 +1.091100000000000181e+00 -3.956250000000000000e+01 +1.091104999999999992e+00 -3.959375381469726562e+01 +1.091110000000000024e+00 -3.956250000000000000e+01 +1.091115000000000057e+00 -3.956250000000000000e+01 +1.091120000000000090e+00 -3.953125000000000000e+01 +1.091125000000000123e+00 -3.953125000000000000e+01 +1.091130000000000155e+00 -3.956250000000000000e+01 +1.091135000000000188e+00 -3.953125000000000000e+01 +1.091139999999999999e+00 -3.953125000000000000e+01 +1.091145000000000032e+00 -3.959375381469726562e+01 +1.091150000000000064e+00 -3.956250000000000000e+01 +1.091155000000000097e+00 -3.956250000000000000e+01 +1.091160000000000130e+00 -3.965625000000000000e+01 +1.091165000000000163e+00 -3.959375381469726562e+01 +1.091170000000000195e+00 -3.956250000000000000e+01 +1.091175000000000006e+00 -3.965625000000000000e+01 +1.091180000000000039e+00 -3.965625000000000000e+01 +1.091185000000000072e+00 -3.965625000000000000e+01 +1.091190000000000104e+00 -3.962500000000000000e+01 +1.091195000000000137e+00 -3.962500000000000000e+01 +1.091200000000000170e+00 -3.959375381469726562e+01 +1.091204999999999981e+00 -3.965625000000000000e+01 +1.091210000000000013e+00 -3.956250000000000000e+01 +1.091215000000000046e+00 -3.965625000000000000e+01 +1.091220000000000079e+00 -3.965625000000000000e+01 +1.091225000000000112e+00 -3.959375381469726562e+01 +1.091230000000000144e+00 -3.959375381469726562e+01 +1.091235000000000177e+00 -3.959375381469726562e+01 +1.091239999999999988e+00 -3.959375381469726562e+01 +1.091245000000000021e+00 -3.962500000000000000e+01 +1.091250000000000053e+00 -3.956250000000000000e+01 +1.091255000000000086e+00 -3.965625000000000000e+01 +1.091260000000000119e+00 -3.962500000000000000e+01 +1.091265000000000152e+00 -3.962500000000000000e+01 +1.091270000000000184e+00 -3.962500000000000000e+01 +1.091274999999999995e+00 -3.962500000000000000e+01 +1.091280000000000028e+00 -3.965625000000000000e+01 +1.091285000000000061e+00 -3.968750000000000000e+01 +1.091290000000000093e+00 -3.956250000000000000e+01 +1.091295000000000126e+00 -3.965625000000000000e+01 +1.091300000000000159e+00 -3.968750000000000000e+01 +1.091305000000000192e+00 -3.965625000000000000e+01 +1.091310000000000002e+00 -3.971875000000000000e+01 +1.091315000000000035e+00 -3.965625000000000000e+01 +1.091320000000000068e+00 -3.968750000000000000e+01 +1.091325000000000101e+00 -3.962500000000000000e+01 +1.091330000000000133e+00 -3.962500000000000000e+01 +1.091335000000000166e+00 -3.965625000000000000e+01 +1.091340000000000199e+00 -3.962500000000000000e+01 +1.091345000000000010e+00 -3.959375381469726562e+01 +1.091350000000000042e+00 -3.965625000000000000e+01 +1.091355000000000075e+00 -3.959375381469726562e+01 +1.091360000000000108e+00 -3.965625000000000000e+01 +1.091365000000000141e+00 -3.962500000000000000e+01 +1.091370000000000173e+00 -3.965625000000000000e+01 +1.091374999999999984e+00 -3.968750000000000000e+01 +1.091380000000000017e+00 -3.968750000000000000e+01 +1.091385000000000050e+00 -3.959375381469726562e+01 +1.091390000000000082e+00 -3.959375381469726562e+01 +1.091395000000000115e+00 -3.965625000000000000e+01 +1.091400000000000148e+00 -3.965625000000000000e+01 +1.091405000000000181e+00 -3.962500000000000000e+01 +1.091409999999999991e+00 -3.965625000000000000e+01 +1.091415000000000024e+00 -3.965625000000000000e+01 +1.091420000000000057e+00 -3.965625000000000000e+01 +1.091425000000000090e+00 -3.965625000000000000e+01 +1.091430000000000122e+00 -3.959375381469726562e+01 +1.091435000000000155e+00 -3.962500000000000000e+01 +1.091440000000000188e+00 -3.968750000000000000e+01 +1.091444999999999999e+00 -3.959375381469726562e+01 +1.091450000000000031e+00 -3.959375381469726562e+01 +1.091455000000000064e+00 -3.962500000000000000e+01 +1.091460000000000097e+00 -3.953125000000000000e+01 +1.091465000000000130e+00 -3.959375381469726562e+01 +1.091470000000000162e+00 -3.962500000000000000e+01 +1.091475000000000195e+00 -3.965625000000000000e+01 +1.091480000000000006e+00 -3.962500000000000000e+01 +1.091485000000000039e+00 -3.965625000000000000e+01 +1.091490000000000071e+00 -3.968750000000000000e+01 +1.091495000000000104e+00 -3.962500000000000000e+01 +1.091500000000000137e+00 -3.971875000000000000e+01 +1.091505000000000170e+00 -3.965625000000000000e+01 +1.091509999999999980e+00 -3.962500000000000000e+01 +1.091515000000000013e+00 -3.968750000000000000e+01 +1.091520000000000046e+00 -3.965625000000000000e+01 +1.091525000000000079e+00 -3.968750000000000000e+01 +1.091530000000000111e+00 -3.965625000000000000e+01 +1.091535000000000144e+00 -3.965625000000000000e+01 +1.091540000000000177e+00 -3.965625000000000000e+01 +1.091544999999999987e+00 -3.968750000000000000e+01 +1.091550000000000020e+00 -3.971875000000000000e+01 +1.091555000000000053e+00 -3.965625000000000000e+01 +1.091560000000000086e+00 -3.968750000000000000e+01 +1.091565000000000119e+00 -3.971875000000000000e+01 +1.091570000000000151e+00 -3.971875000000000000e+01 +1.091575000000000184e+00 -3.968750000000000000e+01 +1.091579999999999995e+00 -3.975000381469726562e+01 +1.091585000000000027e+00 -3.968750000000000000e+01 +1.091590000000000060e+00 -3.968750000000000000e+01 +1.091595000000000093e+00 -3.965625000000000000e+01 +1.091600000000000126e+00 -3.975000381469726562e+01 +1.091605000000000159e+00 -3.975000381469726562e+01 +1.091610000000000191e+00 -3.968750000000000000e+01 +1.091615000000000002e+00 -3.971875000000000000e+01 +1.091620000000000035e+00 -3.971875000000000000e+01 +1.091625000000000068e+00 -3.971875000000000000e+01 +1.091630000000000100e+00 -3.975000381469726562e+01 +1.091635000000000133e+00 -3.971875000000000000e+01 +1.091640000000000166e+00 -3.968750000000000000e+01 +1.091645000000000199e+00 -3.968750000000000000e+01 +1.091650000000000009e+00 -3.962500000000000000e+01 +1.091655000000000042e+00 -3.965625000000000000e+01 +1.091660000000000075e+00 -3.968750000000000000e+01 +1.091665000000000108e+00 -3.971875000000000000e+01 +1.091670000000000140e+00 -3.968750000000000000e+01 +1.091675000000000173e+00 -3.965625000000000000e+01 +1.091679999999999984e+00 -3.971875000000000000e+01 +1.091685000000000016e+00 -3.975000381469726562e+01 +1.091690000000000049e+00 -3.968750000000000000e+01 +1.091695000000000082e+00 -3.968750000000000000e+01 +1.091700000000000115e+00 -3.975000381469726562e+01 +1.091705000000000148e+00 -3.971875000000000000e+01 +1.091710000000000180e+00 -3.975000381469726562e+01 +1.091714999999999991e+00 -3.975000381469726562e+01 +1.091720000000000024e+00 -3.975000381469726562e+01 +1.091725000000000056e+00 -3.975000381469726562e+01 +1.091730000000000089e+00 -3.975000381469726562e+01 +1.091735000000000122e+00 -3.978125000000000000e+01 +1.091740000000000155e+00 -3.975000381469726562e+01 +1.091745000000000188e+00 -3.978125000000000000e+01 +1.091749999999999998e+00 -3.971875000000000000e+01 +1.091755000000000031e+00 -3.975000381469726562e+01 +1.091760000000000064e+00 -3.971875000000000000e+01 +1.091765000000000096e+00 -3.978125000000000000e+01 +1.091770000000000129e+00 -3.978125000000000000e+01 +1.091775000000000162e+00 -3.981250000000000000e+01 +1.091780000000000195e+00 -3.978125000000000000e+01 +1.091785000000000005e+00 -3.978125000000000000e+01 +1.091790000000000038e+00 -3.978125000000000000e+01 +1.091795000000000071e+00 -3.981250000000000000e+01 +1.091800000000000104e+00 -3.981250000000000000e+01 +1.091805000000000136e+00 -3.975000381469726562e+01 +1.091810000000000169e+00 -3.975000381469726562e+01 +1.091814999999999980e+00 -3.978125000000000000e+01 +1.091820000000000013e+00 -3.978125000000000000e+01 +1.091825000000000045e+00 -3.975000381469726562e+01 +1.091830000000000078e+00 -3.978125000000000000e+01 +1.091835000000000111e+00 -3.975000381469726562e+01 +1.091840000000000144e+00 -3.981250000000000000e+01 +1.091845000000000176e+00 -3.978125000000000000e+01 +1.091849999999999987e+00 -3.978125000000000000e+01 +1.091855000000000020e+00 -3.978125000000000000e+01 +1.091860000000000053e+00 -3.978125000000000000e+01 +1.091865000000000085e+00 -3.978125000000000000e+01 +1.091870000000000118e+00 -3.978125000000000000e+01 +1.091875000000000151e+00 -3.981250000000000000e+01 +1.091880000000000184e+00 -3.975000381469726562e+01 +1.091884999999999994e+00 -3.971875000000000000e+01 +1.091890000000000027e+00 -3.981250000000000000e+01 +1.091895000000000060e+00 -3.975000381469726562e+01 +1.091900000000000093e+00 -3.978125000000000000e+01 +1.091905000000000125e+00 -3.981250000000000000e+01 +1.091910000000000158e+00 -3.975000381469726562e+01 +1.091915000000000191e+00 -3.971875000000000000e+01 +1.091920000000000002e+00 -3.975000381469726562e+01 +1.091925000000000034e+00 -3.981250000000000000e+01 +1.091930000000000067e+00 -3.981250000000000000e+01 +1.091935000000000100e+00 -3.971875000000000000e+01 +1.091940000000000133e+00 -3.978125000000000000e+01 +1.091945000000000165e+00 -3.975000381469726562e+01 +1.091950000000000198e+00 -3.978125000000000000e+01 +1.091955000000000009e+00 -3.975000381469726562e+01 +1.091960000000000042e+00 -3.971875000000000000e+01 +1.091965000000000074e+00 -3.978125000000000000e+01 +1.091970000000000107e+00 -3.981250000000000000e+01 +1.091975000000000140e+00 -3.984375000000000000e+01 +1.091980000000000173e+00 -3.975000381469726562e+01 +1.091984999999999983e+00 -3.978125000000000000e+01 +1.091990000000000016e+00 -3.981250000000000000e+01 +1.091995000000000049e+00 -3.978125000000000000e+01 +1.092000000000000082e+00 -3.984375000000000000e+01 +1.092005000000000114e+00 -3.987500000000000000e+01 +1.092010000000000147e+00 -3.984375000000000000e+01 +1.092015000000000180e+00 -3.984375000000000000e+01 +1.092019999999999991e+00 -3.987500000000000000e+01 +1.092025000000000023e+00 -3.984375000000000000e+01 +1.092030000000000056e+00 -3.984375000000000000e+01 +1.092035000000000089e+00 -3.987500000000000000e+01 +1.092040000000000122e+00 -3.984375000000000000e+01 +1.092045000000000154e+00 -3.987500000000000000e+01 +1.092050000000000187e+00 -3.990625381469726562e+01 +1.092054999999999998e+00 -3.984375000000000000e+01 +1.092060000000000031e+00 -3.990625381469726562e+01 +1.092065000000000063e+00 -3.987500000000000000e+01 +1.092070000000000096e+00 -3.987500000000000000e+01 +1.092075000000000129e+00 -3.987500000000000000e+01 +1.092080000000000162e+00 -3.987500000000000000e+01 +1.092085000000000194e+00 -3.981250000000000000e+01 +1.092090000000000005e+00 -3.993750000000000000e+01 +1.092095000000000038e+00 -3.990625381469726562e+01 +1.092100000000000071e+00 -3.987500000000000000e+01 +1.092105000000000103e+00 -3.993750000000000000e+01 +1.092110000000000136e+00 -3.987500000000000000e+01 +1.092115000000000169e+00 -3.990625381469726562e+01 +1.092119999999999980e+00 -3.987500000000000000e+01 +1.092125000000000012e+00 -3.987500000000000000e+01 +1.092130000000000045e+00 -3.990625381469726562e+01 +1.092135000000000078e+00 -3.987500000000000000e+01 +1.092140000000000111e+00 -3.987500000000000000e+01 +1.092145000000000143e+00 -3.987500000000000000e+01 +1.092150000000000176e+00 -3.990625381469726562e+01 +1.092154999999999987e+00 -3.987500000000000000e+01 +1.092160000000000020e+00 -3.987500000000000000e+01 +1.092165000000000052e+00 -3.984375000000000000e+01 +1.092170000000000085e+00 -3.993750000000000000e+01 +1.092175000000000118e+00 -3.987500000000000000e+01 +1.092180000000000151e+00 -3.987500000000000000e+01 +1.092185000000000183e+00 -3.990625381469726562e+01 +1.092189999999999994e+00 -3.987500000000000000e+01 +1.092195000000000027e+00 -3.984375000000000000e+01 +1.092200000000000060e+00 -3.984375000000000000e+01 +1.092205000000000092e+00 -3.984375000000000000e+01 +1.092210000000000125e+00 -3.981250000000000000e+01 +1.092215000000000158e+00 -3.984375000000000000e+01 +1.092220000000000191e+00 -3.984375000000000000e+01 +1.092225000000000001e+00 -3.987500000000000000e+01 +1.092230000000000034e+00 -3.987500000000000000e+01 +1.092235000000000067e+00 -3.993750000000000000e+01 +1.092240000000000100e+00 -3.984375000000000000e+01 +1.092245000000000132e+00 -3.987500000000000000e+01 +1.092250000000000165e+00 -3.987500000000000000e+01 +1.092255000000000198e+00 -3.984375000000000000e+01 +1.092260000000000009e+00 -3.987500000000000000e+01 +1.092265000000000041e+00 -3.981250000000000000e+01 +1.092270000000000074e+00 -3.984375000000000000e+01 +1.092275000000000107e+00 -3.984375000000000000e+01 +1.092280000000000140e+00 -3.984375000000000000e+01 +1.092285000000000172e+00 -3.984375000000000000e+01 +1.092289999999999983e+00 -3.984375000000000000e+01 +1.092295000000000016e+00 -3.987500000000000000e+01 +1.092300000000000049e+00 -3.984375000000000000e+01 +1.092305000000000081e+00 -3.990625381469726562e+01 +1.092310000000000114e+00 -3.981250000000000000e+01 +1.092315000000000147e+00 -3.978125000000000000e+01 +1.092320000000000180e+00 -3.981250000000000000e+01 +1.092324999999999990e+00 -3.984375000000000000e+01 +1.092330000000000023e+00 -3.981250000000000000e+01 +1.092335000000000056e+00 -3.984375000000000000e+01 +1.092340000000000089e+00 -3.981250000000000000e+01 +1.092345000000000121e+00 -3.978125000000000000e+01 +1.092350000000000154e+00 -3.984375000000000000e+01 +1.092355000000000187e+00 -3.987500000000000000e+01 +1.092359999999999998e+00 -3.978125000000000000e+01 +1.092365000000000030e+00 -3.984375000000000000e+01 +1.092370000000000063e+00 -3.987500000000000000e+01 +1.092375000000000096e+00 -3.984375000000000000e+01 +1.092380000000000129e+00 -3.981250000000000000e+01 +1.092385000000000161e+00 -3.987500000000000000e+01 +1.092390000000000194e+00 -3.984375000000000000e+01 +1.092395000000000005e+00 -3.984375000000000000e+01 +1.092400000000000038e+00 -3.984375000000000000e+01 +1.092405000000000070e+00 -3.984375000000000000e+01 +1.092410000000000103e+00 -3.987500000000000000e+01 +1.092415000000000136e+00 -3.984375000000000000e+01 +1.092420000000000169e+00 -3.984375000000000000e+01 +1.092424999999999979e+00 -3.990625381469726562e+01 +1.092430000000000012e+00 -3.990625381469726562e+01 +1.092435000000000045e+00 -3.987500000000000000e+01 +1.092440000000000078e+00 -3.990625381469726562e+01 +1.092445000000000110e+00 -3.993750000000000000e+01 +1.092450000000000143e+00 -3.984375000000000000e+01 +1.092455000000000176e+00 -3.987500000000000000e+01 +1.092459999999999987e+00 -3.984375000000000000e+01 +1.092465000000000019e+00 -3.978125000000000000e+01 +1.092470000000000052e+00 -3.990625381469726562e+01 +1.092475000000000085e+00 -3.984375000000000000e+01 +1.092480000000000118e+00 -3.984375000000000000e+01 +1.092485000000000150e+00 -3.981250000000000000e+01 +1.092490000000000183e+00 -3.990625381469726562e+01 +1.092494999999999994e+00 -3.993750000000000000e+01 +1.092500000000000027e+00 -3.987500000000000000e+01 +1.092505000000000059e+00 -3.990625381469726562e+01 +1.092510000000000092e+00 -3.990625381469726562e+01 +1.092515000000000125e+00 -3.990625381469726562e+01 +1.092520000000000158e+00 -3.990625381469726562e+01 +1.092525000000000190e+00 -3.990625381469726562e+01 +1.092530000000000001e+00 -3.990625381469726562e+01 +1.092535000000000034e+00 -3.993750000000000000e+01 +1.092540000000000067e+00 -3.993750000000000000e+01 +1.092545000000000099e+00 -3.984375000000000000e+01 +1.092550000000000132e+00 -3.987500000000000000e+01 +1.092555000000000165e+00 -3.984375000000000000e+01 +1.092560000000000198e+00 -3.984375000000000000e+01 +1.092565000000000008e+00 -3.987500000000000000e+01 +1.092570000000000041e+00 -3.984375000000000000e+01 +1.092575000000000074e+00 -3.984375000000000000e+01 +1.092580000000000107e+00 -3.990625381469726562e+01 +1.092585000000000139e+00 -3.984375000000000000e+01 +1.092590000000000172e+00 -3.990625381469726562e+01 +1.092594999999999983e+00 -3.987500000000000000e+01 +1.092600000000000016e+00 -3.990625381469726562e+01 +1.092605000000000048e+00 -3.984375000000000000e+01 +1.092610000000000081e+00 -3.990625381469726562e+01 +1.092615000000000114e+00 -3.990625381469726562e+01 +1.092620000000000147e+00 -3.984375000000000000e+01 +1.092625000000000179e+00 -3.987500000000000000e+01 +1.092629999999999990e+00 -3.987500000000000000e+01 +1.092635000000000023e+00 -3.993750000000000000e+01 +1.092640000000000056e+00 -3.990625381469726562e+01 +1.092645000000000088e+00 -3.987500000000000000e+01 +1.092650000000000121e+00 -3.987500000000000000e+01 +1.092655000000000154e+00 -3.990625381469726562e+01 +1.092660000000000187e+00 -3.987500000000000000e+01 +1.092664999999999997e+00 -3.987500000000000000e+01 +1.092670000000000030e+00 -3.987500000000000000e+01 +1.092675000000000063e+00 -3.981250000000000000e+01 +1.092680000000000096e+00 -3.984375000000000000e+01 +1.092685000000000128e+00 -3.984375000000000000e+01 +1.092690000000000161e+00 -3.984375000000000000e+01 +1.092695000000000194e+00 -3.987500000000000000e+01 +1.092700000000000005e+00 -3.984375000000000000e+01 +1.092705000000000037e+00 -3.987500000000000000e+01 +1.092710000000000070e+00 -3.981250000000000000e+01 +1.092715000000000103e+00 -3.981250000000000000e+01 +1.092720000000000136e+00 -3.984375000000000000e+01 +1.092725000000000168e+00 -3.990625381469726562e+01 +1.092729999999999979e+00 -3.990625381469726562e+01 +1.092735000000000012e+00 -3.993750000000000000e+01 +1.092740000000000045e+00 -3.984375000000000000e+01 +1.092745000000000077e+00 -3.993750000000000000e+01 +1.092750000000000110e+00 -3.987500000000000000e+01 +1.092755000000000143e+00 -3.996875000000000000e+01 +1.092760000000000176e+00 -3.987500000000000000e+01 +1.092764999999999986e+00 -3.990625381469726562e+01 +1.092770000000000019e+00 -3.990625381469726562e+01 +1.092775000000000052e+00 -3.987500000000000000e+01 +1.092780000000000085e+00 -3.984375000000000000e+01 +1.092785000000000117e+00 -3.984375000000000000e+01 +1.092790000000000150e+00 -3.990625381469726562e+01 +1.092795000000000183e+00 -3.987500000000000000e+01 +1.092799999999999994e+00 -3.984375000000000000e+01 +1.092805000000000026e+00 -3.993750000000000000e+01 +1.092810000000000059e+00 -3.981250000000000000e+01 +1.092815000000000092e+00 -3.987500000000000000e+01 +1.092820000000000125e+00 -3.984375000000000000e+01 +1.092825000000000157e+00 -3.984375000000000000e+01 +1.092830000000000190e+00 -3.984375000000000000e+01 +1.092835000000000001e+00 -3.987500000000000000e+01 +1.092840000000000034e+00 -3.981250000000000000e+01 +1.092845000000000066e+00 -3.978125000000000000e+01 +1.092850000000000099e+00 -3.981250000000000000e+01 +1.092855000000000132e+00 -3.984375000000000000e+01 +1.092860000000000165e+00 -3.984375000000000000e+01 +1.092865000000000197e+00 -3.978125000000000000e+01 +1.092870000000000008e+00 -3.984375000000000000e+01 +1.092875000000000041e+00 -3.990625381469726562e+01 +1.092880000000000074e+00 -3.990625381469726562e+01 +1.092885000000000106e+00 -3.987500000000000000e+01 +1.092890000000000139e+00 -3.987500000000000000e+01 +1.092895000000000172e+00 -3.990625381469726562e+01 +1.092899999999999983e+00 -3.984375000000000000e+01 +1.092905000000000015e+00 -3.990625381469726562e+01 +1.092910000000000048e+00 -3.990625381469726562e+01 +1.092915000000000081e+00 -3.987500000000000000e+01 +1.092920000000000114e+00 -3.987500000000000000e+01 +1.092925000000000146e+00 -3.987500000000000000e+01 +1.092930000000000179e+00 -3.987500000000000000e+01 +1.092934999999999990e+00 -3.987500000000000000e+01 +1.092940000000000023e+00 -3.981250000000000000e+01 +1.092945000000000055e+00 -3.987500000000000000e+01 +1.092950000000000088e+00 -3.984375000000000000e+01 +1.092955000000000121e+00 -3.987500000000000000e+01 +1.092960000000000154e+00 -3.978125000000000000e+01 +1.092965000000000186e+00 -3.990625381469726562e+01 +1.092969999999999997e+00 -3.984375000000000000e+01 +1.092975000000000030e+00 -3.987500000000000000e+01 +1.092980000000000063e+00 -3.984375000000000000e+01 +1.092985000000000095e+00 -3.984375000000000000e+01 +1.092990000000000128e+00 -3.981250000000000000e+01 +1.092995000000000161e+00 -3.981250000000000000e+01 +1.093000000000000194e+00 -3.984375000000000000e+01 +1.093005000000000004e+00 -3.975000381469726562e+01 +1.093010000000000037e+00 -3.981250000000000000e+01 +1.093015000000000070e+00 -3.987500000000000000e+01 +1.093020000000000103e+00 -3.987500000000000000e+01 +1.093025000000000135e+00 -3.984375000000000000e+01 +1.093030000000000168e+00 -3.981250000000000000e+01 +1.093034999999999979e+00 -3.987500000000000000e+01 +1.093040000000000012e+00 -3.984375000000000000e+01 +1.093045000000000044e+00 -3.984375000000000000e+01 +1.093050000000000077e+00 -3.984375000000000000e+01 +1.093055000000000110e+00 -3.987500000000000000e+01 +1.093060000000000143e+00 -3.987500000000000000e+01 +1.093065000000000175e+00 -3.987500000000000000e+01 +1.093069999999999986e+00 -3.990625381469726562e+01 +1.093075000000000019e+00 -3.990625381469726562e+01 +1.093080000000000052e+00 -3.990625381469726562e+01 +1.093085000000000084e+00 -3.990625381469726562e+01 +1.093090000000000117e+00 -3.987500000000000000e+01 +1.093095000000000150e+00 -3.987500000000000000e+01 +1.093100000000000183e+00 -3.990625381469726562e+01 +1.093104999999999993e+00 -3.990625381469726562e+01 +1.093110000000000026e+00 -3.990625381469726562e+01 +1.093115000000000059e+00 -3.993750000000000000e+01 +1.093120000000000092e+00 -3.987500000000000000e+01 +1.093125000000000124e+00 -3.990625381469726562e+01 +1.093130000000000157e+00 -3.987500000000000000e+01 +1.093135000000000190e+00 -3.984375000000000000e+01 +1.093140000000000001e+00 -3.987500000000000000e+01 +1.093145000000000033e+00 -3.981250000000000000e+01 +1.093150000000000066e+00 -3.987500000000000000e+01 +1.093155000000000099e+00 -3.981250000000000000e+01 +1.093160000000000132e+00 -3.984375000000000000e+01 +1.093165000000000164e+00 -3.996875000000000000e+01 +1.093170000000000197e+00 -3.990625381469726562e+01 +1.093175000000000008e+00 -3.984375000000000000e+01 +1.093180000000000041e+00 -3.990625381469726562e+01 +1.093185000000000073e+00 -3.987500000000000000e+01 +1.093190000000000106e+00 -3.984375000000000000e+01 +1.093195000000000139e+00 -3.990625381469726562e+01 +1.093200000000000172e+00 -3.987500000000000000e+01 +1.093204999999999982e+00 -3.990625381469726562e+01 +1.093210000000000015e+00 -3.987500000000000000e+01 +1.093215000000000048e+00 -3.993750000000000000e+01 +1.093220000000000081e+00 -3.993750000000000000e+01 +1.093225000000000113e+00 -3.996875000000000000e+01 +1.093230000000000146e+00 -3.990625381469726562e+01 +1.093235000000000179e+00 -3.990625381469726562e+01 +1.093239999999999990e+00 -3.990625381469726562e+01 +1.093245000000000022e+00 -3.987500000000000000e+01 +1.093250000000000055e+00 -3.990625381469726562e+01 +1.093255000000000088e+00 -3.987500000000000000e+01 +1.093260000000000121e+00 -3.993750000000000000e+01 +1.093265000000000153e+00 -3.987500000000000000e+01 +1.093270000000000186e+00 -3.987500000000000000e+01 +1.093274999999999997e+00 -3.987500000000000000e+01 +1.093280000000000030e+00 -3.990625381469726562e+01 +1.093285000000000062e+00 -3.990625381469726562e+01 +1.093290000000000095e+00 -3.987500000000000000e+01 +1.093295000000000128e+00 -3.996875000000000000e+01 +1.093300000000000161e+00 -3.996875000000000000e+01 +1.093305000000000193e+00 -3.984375000000000000e+01 +1.093310000000000004e+00 -3.993750000000000000e+01 +1.093315000000000037e+00 -3.993750000000000000e+01 +1.093320000000000070e+00 -4.000000000000000000e+01 +1.093325000000000102e+00 -3.987500000000000000e+01 +1.093330000000000135e+00 -4.003125000000000000e+01 +1.093335000000000168e+00 -3.990625381469726562e+01 +1.093339999999999979e+00 -3.996875000000000000e+01 +1.093345000000000011e+00 -3.996875000000000000e+01 +1.093350000000000044e+00 -4.003125000000000000e+01 +1.093355000000000077e+00 -3.993750000000000000e+01 +1.093360000000000110e+00 -3.996875000000000000e+01 +1.093365000000000142e+00 -3.993750000000000000e+01 +1.093370000000000175e+00 -4.000000000000000000e+01 +1.093374999999999986e+00 -3.993750000000000000e+01 +1.093380000000000019e+00 -3.996875000000000000e+01 +1.093385000000000051e+00 -3.996875000000000000e+01 +1.093390000000000084e+00 -3.996875000000000000e+01 +1.093395000000000117e+00 -3.987500000000000000e+01 +1.093400000000000150e+00 -3.996875000000000000e+01 +1.093405000000000182e+00 -4.003125000000000000e+01 +1.093409999999999993e+00 -4.003125000000000000e+01 +1.093415000000000026e+00 -4.003125000000000000e+01 +1.093420000000000059e+00 -4.003125000000000000e+01 +1.093425000000000091e+00 -4.003125000000000000e+01 +1.093430000000000124e+00 -3.996875000000000000e+01 +1.093435000000000157e+00 -4.003125000000000000e+01 +1.093440000000000190e+00 -4.006250381469726562e+01 +1.093445000000000000e+00 -4.003125000000000000e+01 +1.093450000000000033e+00 -3.996875000000000000e+01 +1.093455000000000066e+00 -4.003125000000000000e+01 +1.093460000000000099e+00 -3.996875000000000000e+01 +1.093465000000000131e+00 -4.006250381469726562e+01 +1.093470000000000164e+00 -4.006250381469726562e+01 +1.093475000000000197e+00 -4.003125000000000000e+01 +1.093480000000000008e+00 -4.003125000000000000e+01 +1.093485000000000040e+00 -4.006250381469726562e+01 +1.093490000000000073e+00 -4.003125000000000000e+01 +1.093495000000000106e+00 -4.003125000000000000e+01 +1.093500000000000139e+00 -4.003125000000000000e+01 +1.093505000000000171e+00 -4.000000000000000000e+01 +1.093509999999999982e+00 -3.996875000000000000e+01 +1.093515000000000015e+00 -4.003125000000000000e+01 +1.093520000000000048e+00 -4.000000000000000000e+01 +1.093525000000000080e+00 -4.000000000000000000e+01 +1.093530000000000113e+00 -4.006250381469726562e+01 +1.093535000000000146e+00 -4.003125000000000000e+01 +1.093540000000000179e+00 -4.003125000000000000e+01 +1.093544999999999989e+00 -4.003125000000000000e+01 +1.093550000000000022e+00 -4.000000000000000000e+01 +1.093555000000000055e+00 -3.996875000000000000e+01 +1.093560000000000088e+00 -4.003125000000000000e+01 +1.093565000000000120e+00 -4.003125000000000000e+01 +1.093570000000000153e+00 -3.996875000000000000e+01 +1.093575000000000186e+00 -4.003125000000000000e+01 +1.093579999999999997e+00 -4.003125000000000000e+01 +1.093585000000000029e+00 -4.000000000000000000e+01 +1.093590000000000062e+00 -4.003125000000000000e+01 +1.093595000000000095e+00 -4.003125000000000000e+01 +1.093600000000000128e+00 -4.003125000000000000e+01 +1.093605000000000160e+00 -4.003125000000000000e+01 +1.093610000000000193e+00 -4.003125000000000000e+01 +1.093615000000000004e+00 -4.003125000000000000e+01 +1.093620000000000037e+00 -4.003125000000000000e+01 +1.093625000000000069e+00 -4.006250381469726562e+01 +1.093630000000000102e+00 -4.006250381469726562e+01 +1.093635000000000135e+00 -4.006250381469726562e+01 +1.093640000000000168e+00 -4.003125000000000000e+01 +1.093645000000000200e+00 -4.006250381469726562e+01 +1.093650000000000011e+00 -4.003125000000000000e+01 +1.093655000000000044e+00 -4.003125000000000000e+01 +1.093660000000000077e+00 -4.003125000000000000e+01 +1.093665000000000109e+00 -4.003125000000000000e+01 +1.093670000000000142e+00 -3.996875000000000000e+01 +1.093675000000000175e+00 -3.996875000000000000e+01 +1.093679999999999986e+00 -4.003125000000000000e+01 +1.093685000000000018e+00 -3.993750000000000000e+01 +1.093690000000000051e+00 -4.006250381469726562e+01 +1.093695000000000084e+00 -4.003125000000000000e+01 +1.093700000000000117e+00 -4.003125000000000000e+01 +1.093705000000000149e+00 -4.003125000000000000e+01 +1.093710000000000182e+00 -4.003125000000000000e+01 +1.093714999999999993e+00 -4.003125000000000000e+01 +1.093720000000000026e+00 -4.003125000000000000e+01 +1.093725000000000058e+00 -4.009375000000000000e+01 +1.093730000000000091e+00 -4.003125000000000000e+01 +1.093735000000000124e+00 -4.003125000000000000e+01 +1.093740000000000157e+00 -4.006250381469726562e+01 +1.093745000000000189e+00 -4.000000000000000000e+01 +1.093750000000000000e+00 -4.000000000000000000e+01 +1.093755000000000033e+00 -4.000000000000000000e+01 +1.093760000000000066e+00 -4.003125000000000000e+01 +1.093765000000000098e+00 -4.003125000000000000e+01 +1.093770000000000131e+00 -3.996875000000000000e+01 +1.093775000000000164e+00 -4.003125000000000000e+01 +1.093780000000000197e+00 -4.003125000000000000e+01 +1.093785000000000007e+00 -4.003125000000000000e+01 +1.093790000000000040e+00 -4.003125000000000000e+01 +1.093795000000000073e+00 -4.003125000000000000e+01 +1.093800000000000106e+00 -4.003125000000000000e+01 +1.093805000000000138e+00 -3.996875000000000000e+01 +1.093810000000000171e+00 -4.003125000000000000e+01 +1.093814999999999982e+00 -4.003125000000000000e+01 +1.093820000000000014e+00 -3.996875000000000000e+01 +1.093825000000000047e+00 -4.003125000000000000e+01 +1.093830000000000080e+00 -4.003125000000000000e+01 +1.093835000000000113e+00 -4.003125000000000000e+01 +1.093840000000000146e+00 -4.003125000000000000e+01 +1.093845000000000178e+00 -4.003125000000000000e+01 +1.093849999999999989e+00 -3.996875000000000000e+01 +1.093855000000000022e+00 -4.003125000000000000e+01 +1.093860000000000054e+00 -4.003125000000000000e+01 +1.093865000000000087e+00 -4.003125000000000000e+01 +1.093870000000000120e+00 -3.996875000000000000e+01 +1.093875000000000153e+00 -4.003125000000000000e+01 +1.093880000000000186e+00 -3.996875000000000000e+01 +1.093884999999999996e+00 -3.993750000000000000e+01 +1.093890000000000029e+00 -4.003125000000000000e+01 +1.093895000000000062e+00 -3.996875000000000000e+01 +1.093900000000000095e+00 -4.000000000000000000e+01 +1.093905000000000127e+00 -3.996875000000000000e+01 +1.093910000000000160e+00 -3.996875000000000000e+01 +1.093915000000000193e+00 -4.000000000000000000e+01 +1.093920000000000003e+00 -3.996875000000000000e+01 +1.093925000000000036e+00 -3.993750000000000000e+01 +1.093930000000000069e+00 -4.006250381469726562e+01 +1.093935000000000102e+00 -4.003125000000000000e+01 +1.093940000000000135e+00 -4.003125000000000000e+01 +1.093945000000000167e+00 -3.993750000000000000e+01 +1.093950000000000200e+00 -3.996875000000000000e+01 +1.093955000000000011e+00 -4.003125000000000000e+01 +1.093960000000000043e+00 -3.993750000000000000e+01 +1.093965000000000076e+00 -4.003125000000000000e+01 +1.093970000000000109e+00 -4.003125000000000000e+01 +1.093975000000000142e+00 -3.996875000000000000e+01 +1.093980000000000175e+00 -3.993750000000000000e+01 +1.093984999999999985e+00 -3.996875000000000000e+01 +1.093990000000000018e+00 -3.987500000000000000e+01 +1.093995000000000051e+00 -3.993750000000000000e+01 +1.094000000000000083e+00 -3.987500000000000000e+01 +1.094005000000000116e+00 -3.996875000000000000e+01 +1.094010000000000149e+00 -3.987500000000000000e+01 +1.094015000000000182e+00 -3.996875000000000000e+01 +1.094019999999999992e+00 -3.996875000000000000e+01 +1.094025000000000025e+00 -3.990625381469726562e+01 +1.094030000000000058e+00 -3.996875000000000000e+01 +1.094035000000000091e+00 -3.993750000000000000e+01 +1.094040000000000123e+00 -3.990625381469726562e+01 +1.094045000000000156e+00 -3.993750000000000000e+01 +1.094050000000000189e+00 -3.996875000000000000e+01 +1.094055000000000000e+00 -3.987500000000000000e+01 +1.094060000000000032e+00 -3.996875000000000000e+01 +1.094065000000000065e+00 -3.993750000000000000e+01 +1.094070000000000098e+00 -3.996875000000000000e+01 +1.094075000000000131e+00 -3.990625381469726562e+01 +1.094080000000000163e+00 -3.993750000000000000e+01 +1.094085000000000196e+00 -3.993750000000000000e+01 +1.094090000000000007e+00 -3.993750000000000000e+01 +1.094095000000000040e+00 -3.993750000000000000e+01 +1.094100000000000072e+00 -4.003125000000000000e+01 +1.094105000000000105e+00 -3.990625381469726562e+01 +1.094110000000000138e+00 -3.996875000000000000e+01 +1.094115000000000171e+00 -4.000000000000000000e+01 +1.094119999999999981e+00 -3.990625381469726562e+01 +1.094125000000000014e+00 -4.000000000000000000e+01 +1.094130000000000047e+00 -4.000000000000000000e+01 +1.094135000000000080e+00 -3.990625381469726562e+01 +1.094140000000000112e+00 -4.003125000000000000e+01 +1.094145000000000145e+00 -3.993750000000000000e+01 +1.094150000000000178e+00 -3.993750000000000000e+01 +1.094154999999999989e+00 -3.993750000000000000e+01 +1.094160000000000021e+00 -3.993750000000000000e+01 +1.094165000000000054e+00 -3.990625381469726562e+01 +1.094170000000000087e+00 -3.993750000000000000e+01 +1.094175000000000120e+00 -3.990625381469726562e+01 +1.094180000000000152e+00 -3.987500000000000000e+01 +1.094185000000000185e+00 -3.993750000000000000e+01 +1.094189999999999996e+00 -3.993750000000000000e+01 +1.094195000000000029e+00 -3.990625381469726562e+01 +1.094200000000000061e+00 -3.990625381469726562e+01 +1.094205000000000094e+00 -3.990625381469726562e+01 +1.094210000000000127e+00 -3.996875000000000000e+01 +1.094215000000000160e+00 -3.996875000000000000e+01 +1.094220000000000192e+00 -3.993750000000000000e+01 +1.094225000000000003e+00 -3.987500000000000000e+01 +1.094230000000000036e+00 -3.987500000000000000e+01 +1.094235000000000069e+00 -3.987500000000000000e+01 +1.094240000000000101e+00 -3.993750000000000000e+01 +1.094245000000000134e+00 -3.993750000000000000e+01 +1.094250000000000167e+00 -3.993750000000000000e+01 +1.094255000000000200e+00 -4.003125000000000000e+01 +1.094260000000000010e+00 -4.003125000000000000e+01 +1.094265000000000043e+00 -4.003125000000000000e+01 +1.094270000000000076e+00 -3.996875000000000000e+01 +1.094275000000000109e+00 -3.996875000000000000e+01 +1.094280000000000141e+00 -3.993750000000000000e+01 +1.094285000000000174e+00 -4.003125000000000000e+01 +1.094289999999999985e+00 -3.990625381469726562e+01 +1.094295000000000018e+00 -3.993750000000000000e+01 +1.094300000000000050e+00 -3.996875000000000000e+01 +1.094305000000000083e+00 -4.003125000000000000e+01 +1.094310000000000116e+00 -4.003125000000000000e+01 +1.094315000000000149e+00 -4.003125000000000000e+01 +1.094320000000000181e+00 -4.003125000000000000e+01 +1.094324999999999992e+00 -3.993750000000000000e+01 +1.094330000000000025e+00 -4.003125000000000000e+01 +1.094335000000000058e+00 -4.003125000000000000e+01 +1.094340000000000090e+00 -4.003125000000000000e+01 +1.094345000000000123e+00 -4.003125000000000000e+01 +1.094350000000000156e+00 -3.996875000000000000e+01 +1.094355000000000189e+00 -4.000000000000000000e+01 +1.094359999999999999e+00 -3.993750000000000000e+01 +1.094365000000000032e+00 -4.000000000000000000e+01 +1.094370000000000065e+00 -4.003125000000000000e+01 +1.094375000000000098e+00 -4.000000000000000000e+01 +1.094380000000000130e+00 -3.993750000000000000e+01 +1.094385000000000163e+00 -3.990625381469726562e+01 +1.094390000000000196e+00 -4.003125000000000000e+01 +1.094395000000000007e+00 -4.003125000000000000e+01 +1.094400000000000039e+00 -3.996875000000000000e+01 +1.094405000000000072e+00 -3.996875000000000000e+01 +1.094410000000000105e+00 -3.993750000000000000e+01 +1.094415000000000138e+00 -4.003125000000000000e+01 +1.094420000000000170e+00 -3.993750000000000000e+01 +1.094424999999999981e+00 -3.993750000000000000e+01 +1.094430000000000014e+00 -3.996875000000000000e+01 +1.094435000000000047e+00 -3.996875000000000000e+01 +1.094440000000000079e+00 -3.993750000000000000e+01 +1.094445000000000112e+00 -3.996875000000000000e+01 +1.094450000000000145e+00 -4.000000000000000000e+01 +1.094455000000000178e+00 -3.990625381469726562e+01 +1.094459999999999988e+00 -3.987500000000000000e+01 +1.094465000000000021e+00 -3.993750000000000000e+01 +1.094470000000000054e+00 -3.993750000000000000e+01 +1.094475000000000087e+00 -3.993750000000000000e+01 +1.094480000000000119e+00 -3.987500000000000000e+01 +1.094485000000000152e+00 -3.996875000000000000e+01 +1.094490000000000185e+00 -3.990625381469726562e+01 +1.094494999999999996e+00 -3.996875000000000000e+01 +1.094500000000000028e+00 -3.993750000000000000e+01 +1.094505000000000061e+00 -3.987500000000000000e+01 +1.094510000000000094e+00 -3.993750000000000000e+01 +1.094515000000000127e+00 -3.996875000000000000e+01 +1.094520000000000159e+00 -4.003125000000000000e+01 +1.094525000000000192e+00 -3.990625381469726562e+01 +1.094530000000000003e+00 -3.993750000000000000e+01 +1.094535000000000036e+00 -3.990625381469726562e+01 +1.094540000000000068e+00 -3.993750000000000000e+01 +1.094545000000000101e+00 -3.993750000000000000e+01 +1.094550000000000134e+00 -3.996875000000000000e+01 +1.094555000000000167e+00 -3.993750000000000000e+01 +1.094560000000000199e+00 -3.993750000000000000e+01 +1.094565000000000010e+00 -3.987500000000000000e+01 +1.094570000000000043e+00 -3.987500000000000000e+01 +1.094575000000000076e+00 -3.993750000000000000e+01 +1.094580000000000108e+00 -3.987500000000000000e+01 +1.094585000000000141e+00 -3.987500000000000000e+01 +1.094590000000000174e+00 -3.990625381469726562e+01 +1.094594999999999985e+00 -3.987500000000000000e+01 +1.094600000000000017e+00 -3.990625381469726562e+01 +1.094605000000000050e+00 -3.990625381469726562e+01 +1.094610000000000083e+00 -3.990625381469726562e+01 +1.094615000000000116e+00 -3.990625381469726562e+01 +1.094620000000000148e+00 -3.996875000000000000e+01 +1.094625000000000181e+00 -3.990625381469726562e+01 +1.094629999999999992e+00 -3.993750000000000000e+01 +1.094635000000000025e+00 -3.984375000000000000e+01 +1.094640000000000057e+00 -3.987500000000000000e+01 +1.094645000000000090e+00 -3.987500000000000000e+01 +1.094650000000000123e+00 -3.990625381469726562e+01 +1.094655000000000156e+00 -3.990625381469726562e+01 +1.094660000000000188e+00 -3.993750000000000000e+01 +1.094664999999999999e+00 -3.984375000000000000e+01 +1.094670000000000032e+00 -3.993750000000000000e+01 +1.094675000000000065e+00 -3.993750000000000000e+01 +1.094680000000000097e+00 -3.990625381469726562e+01 +1.094685000000000130e+00 -3.996875000000000000e+01 +1.094690000000000163e+00 -3.993750000000000000e+01 +1.094695000000000196e+00 -3.987500000000000000e+01 +1.094700000000000006e+00 -3.996875000000000000e+01 +1.094705000000000039e+00 -3.987500000000000000e+01 +1.094710000000000072e+00 -3.987500000000000000e+01 +1.094715000000000105e+00 -3.984375000000000000e+01 +1.094720000000000137e+00 -3.987500000000000000e+01 +1.094725000000000170e+00 -3.987500000000000000e+01 +1.094729999999999981e+00 -3.990625381469726562e+01 +1.094735000000000014e+00 -3.993750000000000000e+01 +1.094740000000000046e+00 -3.993750000000000000e+01 +1.094745000000000079e+00 -3.984375000000000000e+01 +1.094750000000000112e+00 -3.990625381469726562e+01 +1.094755000000000145e+00 -3.987500000000000000e+01 +1.094760000000000177e+00 -3.996875000000000000e+01 +1.094764999999999988e+00 -3.990625381469726562e+01 +1.094770000000000021e+00 -3.990625381469726562e+01 +1.094775000000000054e+00 -3.996875000000000000e+01 +1.094780000000000086e+00 -3.990625381469726562e+01 +1.094785000000000119e+00 -3.984375000000000000e+01 +1.094790000000000152e+00 -4.000000000000000000e+01 +1.094795000000000185e+00 -3.993750000000000000e+01 +1.094799999999999995e+00 -3.993750000000000000e+01 +1.094805000000000028e+00 -3.990625381469726562e+01 +1.094810000000000061e+00 -3.990625381469726562e+01 +1.094815000000000094e+00 -3.993750000000000000e+01 +1.094820000000000126e+00 -3.987500000000000000e+01 +1.094825000000000159e+00 -3.993750000000000000e+01 +1.094830000000000192e+00 -3.990625381469726562e+01 +1.094835000000000003e+00 -3.993750000000000000e+01 +1.094840000000000035e+00 -3.993750000000000000e+01 +1.094845000000000068e+00 -3.987500000000000000e+01 +1.094850000000000101e+00 -3.990625381469726562e+01 +1.094855000000000134e+00 -3.993750000000000000e+01 +1.094860000000000166e+00 -3.990625381469726562e+01 +1.094865000000000199e+00 -3.990625381469726562e+01 +1.094870000000000010e+00 -3.990625381469726562e+01 +1.094875000000000043e+00 -3.993750000000000000e+01 +1.094880000000000075e+00 -3.993750000000000000e+01 +1.094885000000000108e+00 -3.990625381469726562e+01 +1.094890000000000141e+00 -3.993750000000000000e+01 +1.094895000000000174e+00 -3.990625381469726562e+01 +1.094899999999999984e+00 -3.987500000000000000e+01 +1.094905000000000017e+00 -3.990625381469726562e+01 +1.094910000000000050e+00 -3.987500000000000000e+01 +1.094915000000000083e+00 -3.993750000000000000e+01 +1.094920000000000115e+00 -3.987500000000000000e+01 +1.094925000000000148e+00 -3.984375000000000000e+01 +1.094930000000000181e+00 -3.990625381469726562e+01 +1.094934999999999992e+00 -3.990625381469726562e+01 +1.094940000000000024e+00 -3.987500000000000000e+01 +1.094945000000000057e+00 -3.984375000000000000e+01 +1.094950000000000090e+00 -3.984375000000000000e+01 +1.094955000000000123e+00 -3.987500000000000000e+01 +1.094960000000000155e+00 -3.990625381469726562e+01 +1.094965000000000188e+00 -3.990625381469726562e+01 +1.094969999999999999e+00 -3.981250000000000000e+01 +1.094975000000000032e+00 -3.984375000000000000e+01 +1.094980000000000064e+00 -3.990625381469726562e+01 +1.094985000000000097e+00 -3.990625381469726562e+01 +1.094990000000000130e+00 -3.984375000000000000e+01 +1.094995000000000163e+00 -3.990625381469726562e+01 +1.095000000000000195e+00 -3.984375000000000000e+01 +1.095005000000000006e+00 -3.984375000000000000e+01 +1.095010000000000039e+00 -3.981250000000000000e+01 +1.095015000000000072e+00 -3.981250000000000000e+01 +1.095020000000000104e+00 -3.981250000000000000e+01 +1.095025000000000137e+00 -3.981250000000000000e+01 +1.095030000000000170e+00 -3.987500000000000000e+01 +1.095034999999999981e+00 -3.984375000000000000e+01 +1.095040000000000013e+00 -3.987500000000000000e+01 +1.095045000000000046e+00 -3.984375000000000000e+01 +1.095050000000000079e+00 -3.984375000000000000e+01 +1.095055000000000112e+00 -3.990625381469726562e+01 +1.095060000000000144e+00 -3.981250000000000000e+01 +1.095065000000000177e+00 -3.987500000000000000e+01 +1.095069999999999988e+00 -3.981250000000000000e+01 +1.095075000000000021e+00 -3.984375000000000000e+01 +1.095080000000000053e+00 -3.984375000000000000e+01 +1.095085000000000086e+00 -3.984375000000000000e+01 +1.095090000000000119e+00 -3.984375000000000000e+01 +1.095095000000000152e+00 -3.981250000000000000e+01 +1.095100000000000184e+00 -3.990625381469726562e+01 +1.095104999999999995e+00 -3.984375000000000000e+01 +1.095110000000000028e+00 -3.981250000000000000e+01 +1.095115000000000061e+00 -3.993750000000000000e+01 +1.095120000000000093e+00 -3.993750000000000000e+01 +1.095125000000000126e+00 -3.984375000000000000e+01 +1.095130000000000159e+00 -3.981250000000000000e+01 +1.095135000000000192e+00 -3.987500000000000000e+01 +1.095140000000000002e+00 -3.981250000000000000e+01 +1.095145000000000035e+00 -3.981250000000000000e+01 +1.095150000000000068e+00 -3.981250000000000000e+01 +1.095155000000000101e+00 -3.978125000000000000e+01 +1.095160000000000133e+00 -3.981250000000000000e+01 +1.095165000000000166e+00 -3.987500000000000000e+01 +1.095170000000000199e+00 -3.984375000000000000e+01 +1.095175000000000010e+00 -3.981250000000000000e+01 +1.095180000000000042e+00 -3.987500000000000000e+01 +1.095185000000000075e+00 -3.978125000000000000e+01 +1.095190000000000108e+00 -3.984375000000000000e+01 +1.095195000000000141e+00 -3.978125000000000000e+01 +1.095200000000000173e+00 -3.978125000000000000e+01 +1.095204999999999984e+00 -3.984375000000000000e+01 +1.095210000000000017e+00 -3.981250000000000000e+01 +1.095215000000000050e+00 -3.987500000000000000e+01 +1.095220000000000082e+00 -3.984375000000000000e+01 +1.095225000000000115e+00 -3.981250000000000000e+01 +1.095230000000000148e+00 -3.981250000000000000e+01 +1.095235000000000181e+00 -3.990625381469726562e+01 +1.095239999999999991e+00 -3.984375000000000000e+01 +1.095245000000000024e+00 -3.984375000000000000e+01 +1.095250000000000057e+00 -3.987500000000000000e+01 +1.095255000000000090e+00 -3.987500000000000000e+01 +1.095260000000000122e+00 -3.987500000000000000e+01 +1.095265000000000155e+00 -3.984375000000000000e+01 +1.095270000000000188e+00 -3.987500000000000000e+01 +1.095274999999999999e+00 -3.990625381469726562e+01 +1.095280000000000031e+00 -3.987500000000000000e+01 +1.095285000000000064e+00 -3.984375000000000000e+01 +1.095290000000000097e+00 -3.984375000000000000e+01 +1.095295000000000130e+00 -3.984375000000000000e+01 +1.095300000000000162e+00 -3.987500000000000000e+01 +1.095305000000000195e+00 -3.984375000000000000e+01 +1.095310000000000006e+00 -3.984375000000000000e+01 +1.095315000000000039e+00 -3.990625381469726562e+01 +1.095320000000000071e+00 -3.984375000000000000e+01 +1.095325000000000104e+00 -3.987500000000000000e+01 +1.095330000000000137e+00 -3.987500000000000000e+01 +1.095335000000000170e+00 -3.990625381469726562e+01 +1.095339999999999980e+00 -3.987500000000000000e+01 +1.095345000000000013e+00 -3.981250000000000000e+01 +1.095350000000000046e+00 -3.990625381469726562e+01 +1.095355000000000079e+00 -3.987500000000000000e+01 +1.095360000000000111e+00 -3.981250000000000000e+01 +1.095365000000000144e+00 -3.978125000000000000e+01 +1.095370000000000177e+00 -3.978125000000000000e+01 +1.095374999999999988e+00 -3.984375000000000000e+01 +1.095380000000000020e+00 -3.984375000000000000e+01 +1.095385000000000053e+00 -3.981250000000000000e+01 +1.095390000000000086e+00 -3.984375000000000000e+01 +1.095395000000000119e+00 -3.978125000000000000e+01 +1.095400000000000151e+00 -3.984375000000000000e+01 +1.095405000000000184e+00 -3.987500000000000000e+01 +1.095409999999999995e+00 -3.981250000000000000e+01 +1.095415000000000028e+00 -3.984375000000000000e+01 +1.095420000000000060e+00 -3.984375000000000000e+01 +1.095425000000000093e+00 -3.984375000000000000e+01 +1.095430000000000126e+00 -3.981250000000000000e+01 +1.095435000000000159e+00 -3.984375000000000000e+01 +1.095440000000000191e+00 -3.981250000000000000e+01 +1.095445000000000002e+00 -3.978125000000000000e+01 +1.095450000000000035e+00 -3.981250000000000000e+01 +1.095455000000000068e+00 -3.981250000000000000e+01 +1.095460000000000100e+00 -3.981250000000000000e+01 +1.095465000000000133e+00 -3.984375000000000000e+01 +1.095470000000000166e+00 -3.984375000000000000e+01 +1.095475000000000199e+00 -3.981250000000000000e+01 +1.095480000000000009e+00 -3.987500000000000000e+01 +1.095485000000000042e+00 -3.984375000000000000e+01 +1.095490000000000075e+00 -3.978125000000000000e+01 +1.095495000000000108e+00 -3.984375000000000000e+01 +1.095500000000000140e+00 -3.981250000000000000e+01 +1.095505000000000173e+00 -3.984375000000000000e+01 +1.095509999999999984e+00 -3.978125000000000000e+01 +1.095515000000000017e+00 -3.978125000000000000e+01 +1.095520000000000049e+00 -3.984375000000000000e+01 +1.095525000000000082e+00 -3.984375000000000000e+01 +1.095530000000000115e+00 -3.984375000000000000e+01 +1.095535000000000148e+00 -3.984375000000000000e+01 +1.095540000000000180e+00 -3.984375000000000000e+01 +1.095544999999999991e+00 -3.984375000000000000e+01 +1.095550000000000024e+00 -3.981250000000000000e+01 +1.095555000000000057e+00 -3.984375000000000000e+01 +1.095560000000000089e+00 -3.978125000000000000e+01 +1.095565000000000122e+00 -3.987500000000000000e+01 +1.095570000000000155e+00 -3.978125000000000000e+01 +1.095575000000000188e+00 -3.984375000000000000e+01 +1.095579999999999998e+00 -3.984375000000000000e+01 +1.095585000000000031e+00 -3.984375000000000000e+01 +1.095590000000000064e+00 -3.981250000000000000e+01 +1.095595000000000097e+00 -3.984375000000000000e+01 +1.095600000000000129e+00 -3.984375000000000000e+01 +1.095605000000000162e+00 -3.978125000000000000e+01 +1.095610000000000195e+00 -3.981250000000000000e+01 +1.095615000000000006e+00 -3.984375000000000000e+01 +1.095620000000000038e+00 -3.987500000000000000e+01 +1.095625000000000071e+00 -3.978125000000000000e+01 +1.095630000000000104e+00 -3.981250000000000000e+01 +1.095635000000000137e+00 -3.984375000000000000e+01 +1.095640000000000169e+00 -3.984375000000000000e+01 +1.095644999999999980e+00 -3.984375000000000000e+01 +1.095650000000000013e+00 -3.981250000000000000e+01 +1.095655000000000046e+00 -3.987500000000000000e+01 +1.095660000000000078e+00 -3.984375000000000000e+01 +1.095665000000000111e+00 -3.990625381469726562e+01 +1.095670000000000144e+00 -3.984375000000000000e+01 +1.095675000000000177e+00 -3.978125000000000000e+01 +1.095679999999999987e+00 -3.981250000000000000e+01 +1.095685000000000020e+00 -3.987500000000000000e+01 +1.095690000000000053e+00 -3.984375000000000000e+01 +1.095695000000000086e+00 -3.984375000000000000e+01 +1.095700000000000118e+00 -3.987500000000000000e+01 +1.095705000000000151e+00 -3.984375000000000000e+01 +1.095710000000000184e+00 -3.984375000000000000e+01 +1.095714999999999995e+00 -3.987500000000000000e+01 +1.095720000000000027e+00 -3.984375000000000000e+01 +1.095725000000000060e+00 -3.984375000000000000e+01 +1.095730000000000093e+00 -3.984375000000000000e+01 +1.095735000000000126e+00 -3.981250000000000000e+01 +1.095740000000000158e+00 -3.984375000000000000e+01 +1.095745000000000191e+00 -3.984375000000000000e+01 +1.095750000000000002e+00 -3.981250000000000000e+01 +1.095755000000000035e+00 -3.987500000000000000e+01 +1.095760000000000067e+00 -3.984375000000000000e+01 +1.095765000000000100e+00 -3.990625381469726562e+01 +1.095770000000000133e+00 -3.987500000000000000e+01 +1.095775000000000166e+00 -3.987500000000000000e+01 +1.095780000000000198e+00 -3.987500000000000000e+01 +1.095785000000000009e+00 -3.990625381469726562e+01 +1.095790000000000042e+00 -3.990625381469726562e+01 +1.095795000000000075e+00 -3.984375000000000000e+01 +1.095800000000000107e+00 -3.990625381469726562e+01 +1.095805000000000140e+00 -3.984375000000000000e+01 +1.095810000000000173e+00 -3.984375000000000000e+01 +1.095814999999999984e+00 -3.984375000000000000e+01 +1.095820000000000016e+00 -3.981250000000000000e+01 +1.095825000000000049e+00 -3.984375000000000000e+01 +1.095830000000000082e+00 -3.981250000000000000e+01 +1.095835000000000115e+00 -3.984375000000000000e+01 +1.095840000000000147e+00 -3.984375000000000000e+01 +1.095845000000000180e+00 -3.984375000000000000e+01 +1.095849999999999991e+00 -3.981250000000000000e+01 +1.095855000000000024e+00 -3.990625381469726562e+01 +1.095860000000000056e+00 -3.981250000000000000e+01 +1.095865000000000089e+00 -3.987500000000000000e+01 +1.095870000000000122e+00 -3.984375000000000000e+01 +1.095875000000000155e+00 -3.984375000000000000e+01 +1.095880000000000187e+00 -3.984375000000000000e+01 +1.095884999999999998e+00 -3.984375000000000000e+01 +1.095890000000000031e+00 -3.981250000000000000e+01 +1.095895000000000064e+00 -3.984375000000000000e+01 +1.095900000000000096e+00 -3.984375000000000000e+01 +1.095905000000000129e+00 -3.981250000000000000e+01 +1.095910000000000162e+00 -3.981250000000000000e+01 +1.095915000000000195e+00 -3.978125000000000000e+01 +1.095920000000000005e+00 -3.978125000000000000e+01 +1.095925000000000038e+00 -3.978125000000000000e+01 +1.095930000000000071e+00 -3.981250000000000000e+01 +1.095935000000000104e+00 -3.981250000000000000e+01 +1.095940000000000136e+00 -3.978125000000000000e+01 +1.095945000000000169e+00 -3.981250000000000000e+01 +1.095949999999999980e+00 -3.971875000000000000e+01 +1.095955000000000013e+00 -3.981250000000000000e+01 +1.095960000000000045e+00 -3.975000381469726562e+01 +1.095965000000000078e+00 -3.978125000000000000e+01 +1.095970000000000111e+00 -3.981250000000000000e+01 +1.095975000000000144e+00 -3.975000381469726562e+01 +1.095980000000000176e+00 -3.978125000000000000e+01 +1.095984999999999987e+00 -3.975000381469726562e+01 +1.095990000000000020e+00 -3.978125000000000000e+01 +1.095995000000000053e+00 -3.975000381469726562e+01 +1.096000000000000085e+00 -3.981250000000000000e+01 +1.096005000000000118e+00 -3.981250000000000000e+01 +1.096010000000000151e+00 -3.981250000000000000e+01 +1.096015000000000184e+00 -3.984375000000000000e+01 +1.096019999999999994e+00 -3.984375000000000000e+01 +1.096025000000000027e+00 -3.981250000000000000e+01 +1.096030000000000060e+00 -3.981250000000000000e+01 +1.096035000000000093e+00 -3.984375000000000000e+01 +1.096040000000000125e+00 -3.987500000000000000e+01 +1.096045000000000158e+00 -3.984375000000000000e+01 +1.096050000000000191e+00 -3.987500000000000000e+01 +1.096055000000000001e+00 -3.984375000000000000e+01 +1.096060000000000034e+00 -3.987500000000000000e+01 +1.096065000000000067e+00 -3.984375000000000000e+01 +1.096070000000000100e+00 -3.987500000000000000e+01 +1.096075000000000133e+00 -3.990625381469726562e+01 +1.096080000000000165e+00 -3.984375000000000000e+01 +1.096085000000000198e+00 -3.987500000000000000e+01 +1.096090000000000009e+00 -3.984375000000000000e+01 +1.096095000000000041e+00 -3.987500000000000000e+01 +1.096100000000000074e+00 -3.984375000000000000e+01 +1.096105000000000107e+00 -3.981250000000000000e+01 +1.096110000000000140e+00 -3.984375000000000000e+01 +1.096115000000000173e+00 -3.978125000000000000e+01 +1.096119999999999983e+00 -3.987500000000000000e+01 +1.096125000000000016e+00 -3.981250000000000000e+01 +1.096130000000000049e+00 -3.981250000000000000e+01 +1.096135000000000081e+00 -3.981250000000000000e+01 +1.096140000000000114e+00 -3.984375000000000000e+01 +1.096145000000000147e+00 -3.981250000000000000e+01 +1.096150000000000180e+00 -3.984375000000000000e+01 +1.096154999999999990e+00 -3.987500000000000000e+01 +1.096160000000000023e+00 -3.984375000000000000e+01 +1.096165000000000056e+00 -3.984375000000000000e+01 +1.096170000000000089e+00 -3.984375000000000000e+01 +1.096175000000000122e+00 -3.990625381469726562e+01 +1.096180000000000154e+00 -3.984375000000000000e+01 +1.096185000000000187e+00 -3.981250000000000000e+01 +1.096189999999999998e+00 -3.984375000000000000e+01 +1.096195000000000030e+00 -3.975000381469726562e+01 +1.096200000000000063e+00 -3.990625381469726562e+01 +1.096205000000000096e+00 -3.981250000000000000e+01 +1.096210000000000129e+00 -3.987500000000000000e+01 +1.096215000000000162e+00 -3.981250000000000000e+01 +1.096220000000000194e+00 -3.981250000000000000e+01 +1.096225000000000005e+00 -3.978125000000000000e+01 +1.096230000000000038e+00 -3.990625381469726562e+01 +1.096235000000000070e+00 -3.984375000000000000e+01 +1.096240000000000103e+00 -3.981250000000000000e+01 +1.096245000000000136e+00 -3.978125000000000000e+01 +1.096250000000000169e+00 -3.984375000000000000e+01 +1.096254999999999979e+00 -3.978125000000000000e+01 +1.096260000000000012e+00 -3.984375000000000000e+01 +1.096265000000000045e+00 -3.987500000000000000e+01 +1.096270000000000078e+00 -3.978125000000000000e+01 +1.096275000000000110e+00 -3.978125000000000000e+01 +1.096280000000000143e+00 -3.990625381469726562e+01 +1.096285000000000176e+00 -3.984375000000000000e+01 +1.096289999999999987e+00 -3.981250000000000000e+01 +1.096295000000000019e+00 -3.981250000000000000e+01 +1.096300000000000052e+00 -3.984375000000000000e+01 +1.096305000000000085e+00 -3.981250000000000000e+01 +1.096310000000000118e+00 -3.987500000000000000e+01 +1.096315000000000150e+00 -3.981250000000000000e+01 +1.096320000000000183e+00 -3.981250000000000000e+01 +1.096324999999999994e+00 -3.981250000000000000e+01 +1.096330000000000027e+00 -3.984375000000000000e+01 +1.096335000000000059e+00 -3.978125000000000000e+01 +1.096340000000000092e+00 -3.981250000000000000e+01 +1.096345000000000125e+00 -3.975000381469726562e+01 +1.096350000000000158e+00 -3.981250000000000000e+01 +1.096355000000000190e+00 -3.978125000000000000e+01 +1.096360000000000001e+00 -3.984375000000000000e+01 +1.096365000000000034e+00 -3.981250000000000000e+01 +1.096370000000000067e+00 -3.981250000000000000e+01 +1.096375000000000099e+00 -3.978125000000000000e+01 +1.096380000000000132e+00 -3.978125000000000000e+01 +1.096385000000000165e+00 -3.978125000000000000e+01 +1.096390000000000198e+00 -3.975000381469726562e+01 +1.096395000000000008e+00 -3.975000381469726562e+01 +1.096400000000000041e+00 -3.975000381469726562e+01 +1.096405000000000074e+00 -3.981250000000000000e+01 +1.096410000000000107e+00 -3.978125000000000000e+01 +1.096415000000000139e+00 -3.978125000000000000e+01 +1.096420000000000172e+00 -3.978125000000000000e+01 +1.096424999999999983e+00 -3.978125000000000000e+01 +1.096430000000000016e+00 -3.971875000000000000e+01 +1.096435000000000048e+00 -3.978125000000000000e+01 +1.096440000000000081e+00 -3.978125000000000000e+01 +1.096445000000000114e+00 -3.978125000000000000e+01 +1.096450000000000147e+00 -3.975000381469726562e+01 +1.096455000000000179e+00 -3.975000381469726562e+01 +1.096459999999999990e+00 -3.975000381469726562e+01 +1.096465000000000023e+00 -3.971875000000000000e+01 +1.096470000000000056e+00 -3.975000381469726562e+01 +1.096475000000000088e+00 -3.978125000000000000e+01 +1.096480000000000121e+00 -3.975000381469726562e+01 +1.096485000000000154e+00 -3.971875000000000000e+01 +1.096490000000000187e+00 -3.978125000000000000e+01 +1.096494999999999997e+00 -3.975000381469726562e+01 +1.096500000000000030e+00 -3.975000381469726562e+01 +1.096505000000000063e+00 -3.971875000000000000e+01 +1.096510000000000096e+00 -3.978125000000000000e+01 +1.096515000000000128e+00 -3.971875000000000000e+01 +1.096520000000000161e+00 -3.978125000000000000e+01 +1.096525000000000194e+00 -3.978125000000000000e+01 +1.096530000000000005e+00 -3.978125000000000000e+01 +1.096535000000000037e+00 -3.981250000000000000e+01 +1.096540000000000070e+00 -3.975000381469726562e+01 +1.096545000000000103e+00 -3.978125000000000000e+01 +1.096550000000000136e+00 -3.978125000000000000e+01 +1.096555000000000168e+00 -3.971875000000000000e+01 +1.096559999999999979e+00 -3.975000381469726562e+01 +1.096565000000000012e+00 -3.971875000000000000e+01 +1.096570000000000045e+00 -3.975000381469726562e+01 +1.096575000000000077e+00 -3.978125000000000000e+01 +1.096580000000000110e+00 -3.981250000000000000e+01 +1.096585000000000143e+00 -3.978125000000000000e+01 +1.096590000000000176e+00 -3.975000381469726562e+01 +1.096594999999999986e+00 -3.968750000000000000e+01 +1.096600000000000019e+00 -3.975000381469726562e+01 +1.096605000000000052e+00 -3.978125000000000000e+01 +1.096610000000000085e+00 -3.978125000000000000e+01 +1.096615000000000117e+00 -3.981250000000000000e+01 +1.096620000000000150e+00 -3.978125000000000000e+01 +1.096625000000000183e+00 -3.978125000000000000e+01 +1.096629999999999994e+00 -3.971875000000000000e+01 +1.096635000000000026e+00 -3.975000381469726562e+01 +1.096640000000000059e+00 -3.978125000000000000e+01 +1.096645000000000092e+00 -3.978125000000000000e+01 +1.096650000000000125e+00 -3.984375000000000000e+01 +1.096655000000000157e+00 -3.978125000000000000e+01 +1.096660000000000190e+00 -3.981250000000000000e+01 +1.096665000000000001e+00 -3.981250000000000000e+01 +1.096670000000000034e+00 -3.978125000000000000e+01 +1.096675000000000066e+00 -3.978125000000000000e+01 +1.096680000000000099e+00 -3.978125000000000000e+01 +1.096685000000000132e+00 -3.978125000000000000e+01 +1.096690000000000165e+00 -3.978125000000000000e+01 +1.096695000000000197e+00 -3.978125000000000000e+01 +1.096700000000000008e+00 -3.978125000000000000e+01 +1.096705000000000041e+00 -3.978125000000000000e+01 +1.096710000000000074e+00 -3.975000381469726562e+01 +1.096715000000000106e+00 -3.975000381469726562e+01 +1.096720000000000139e+00 -3.971875000000000000e+01 +1.096725000000000172e+00 -3.981250000000000000e+01 +1.096729999999999983e+00 -3.975000381469726562e+01 +1.096735000000000015e+00 -3.978125000000000000e+01 +1.096740000000000048e+00 -3.975000381469726562e+01 +1.096745000000000081e+00 -3.978125000000000000e+01 +1.096750000000000114e+00 -3.978125000000000000e+01 +1.096755000000000146e+00 -3.978125000000000000e+01 +1.096760000000000179e+00 -3.971875000000000000e+01 +1.096764999999999990e+00 -3.981250000000000000e+01 +1.096770000000000023e+00 -3.978125000000000000e+01 +1.096775000000000055e+00 -3.978125000000000000e+01 +1.096780000000000088e+00 -3.981250000000000000e+01 +1.096785000000000121e+00 -3.975000381469726562e+01 +1.096790000000000154e+00 -3.975000381469726562e+01 +1.096795000000000186e+00 -3.978125000000000000e+01 +1.096799999999999997e+00 -3.978125000000000000e+01 +1.096805000000000030e+00 -3.975000381469726562e+01 +1.096810000000000063e+00 -3.978125000000000000e+01 +1.096815000000000095e+00 -3.978125000000000000e+01 +1.096820000000000128e+00 -3.971875000000000000e+01 +1.096825000000000161e+00 -3.971875000000000000e+01 +1.096830000000000194e+00 -3.981250000000000000e+01 +1.096835000000000004e+00 -3.971875000000000000e+01 +1.096840000000000037e+00 -3.975000381469726562e+01 +1.096845000000000070e+00 -3.975000381469726562e+01 +1.096850000000000103e+00 -3.978125000000000000e+01 +1.096855000000000135e+00 -3.978125000000000000e+01 +1.096860000000000168e+00 -3.975000381469726562e+01 +1.096864999999999979e+00 -3.971875000000000000e+01 +1.096870000000000012e+00 -3.971875000000000000e+01 +1.096875000000000044e+00 -3.978125000000000000e+01 +1.096880000000000077e+00 -3.971875000000000000e+01 +1.096885000000000110e+00 -3.968750000000000000e+01 +1.096890000000000143e+00 -3.968750000000000000e+01 +1.096895000000000175e+00 -3.978125000000000000e+01 +1.096899999999999986e+00 -3.971875000000000000e+01 +1.096905000000000019e+00 -3.971875000000000000e+01 +1.096910000000000052e+00 -3.971875000000000000e+01 +1.096915000000000084e+00 -3.975000381469726562e+01 +1.096920000000000117e+00 -3.971875000000000000e+01 +1.096925000000000150e+00 -3.978125000000000000e+01 +1.096930000000000183e+00 -3.971875000000000000e+01 +1.096934999999999993e+00 -3.971875000000000000e+01 +1.096940000000000026e+00 -3.971875000000000000e+01 +1.096945000000000059e+00 -3.971875000000000000e+01 +1.096950000000000092e+00 -3.978125000000000000e+01 +1.096955000000000124e+00 -3.978125000000000000e+01 +1.096960000000000157e+00 -3.978125000000000000e+01 +1.096965000000000190e+00 -3.975000381469726562e+01 +1.096970000000000001e+00 -3.971875000000000000e+01 +1.096975000000000033e+00 -3.978125000000000000e+01 +1.096980000000000066e+00 -3.981250000000000000e+01 +1.096985000000000099e+00 -3.971875000000000000e+01 +1.096990000000000132e+00 -3.975000381469726562e+01 +1.096995000000000164e+00 -3.975000381469726562e+01 +1.097000000000000197e+00 -3.968750000000000000e+01 +1.097005000000000008e+00 -3.968750000000000000e+01 +1.097010000000000041e+00 -3.975000381469726562e+01 +1.097015000000000073e+00 -3.971875000000000000e+01 +1.097020000000000106e+00 -3.971875000000000000e+01 +1.097025000000000139e+00 -3.975000381469726562e+01 +1.097030000000000172e+00 -3.975000381469726562e+01 +1.097034999999999982e+00 -3.975000381469726562e+01 +1.097040000000000015e+00 -3.971875000000000000e+01 +1.097045000000000048e+00 -3.971875000000000000e+01 +1.097050000000000081e+00 -3.975000381469726562e+01 +1.097055000000000113e+00 -3.975000381469726562e+01 +1.097060000000000146e+00 -3.984375000000000000e+01 +1.097065000000000179e+00 -3.981250000000000000e+01 +1.097069999999999990e+00 -3.978125000000000000e+01 +1.097075000000000022e+00 -3.971875000000000000e+01 +1.097080000000000055e+00 -3.968750000000000000e+01 +1.097085000000000088e+00 -3.971875000000000000e+01 +1.097090000000000121e+00 -3.981250000000000000e+01 +1.097095000000000153e+00 -3.971875000000000000e+01 +1.097100000000000186e+00 -3.971875000000000000e+01 +1.097104999999999997e+00 -3.978125000000000000e+01 +1.097110000000000030e+00 -3.971875000000000000e+01 +1.097115000000000062e+00 -3.975000381469726562e+01 +1.097120000000000095e+00 -3.968750000000000000e+01 +1.097125000000000128e+00 -3.975000381469726562e+01 +1.097130000000000161e+00 -3.984375000000000000e+01 +1.097135000000000193e+00 -3.968750000000000000e+01 +1.097140000000000004e+00 -3.971875000000000000e+01 +1.097145000000000037e+00 -3.971875000000000000e+01 +1.097150000000000070e+00 -3.978125000000000000e+01 +1.097155000000000102e+00 -3.971875000000000000e+01 +1.097160000000000135e+00 -3.978125000000000000e+01 +1.097165000000000168e+00 -3.978125000000000000e+01 +1.097170000000000201e+00 -3.971875000000000000e+01 +1.097175000000000011e+00 -3.975000381469726562e+01 +1.097180000000000044e+00 -3.971875000000000000e+01 +1.097185000000000077e+00 -3.971875000000000000e+01 +1.097190000000000110e+00 -3.975000381469726562e+01 +1.097195000000000142e+00 -3.975000381469726562e+01 +1.097200000000000175e+00 -3.975000381469726562e+01 +1.097204999999999986e+00 -3.978125000000000000e+01 +1.097210000000000019e+00 -3.975000381469726562e+01 +1.097215000000000051e+00 -3.971875000000000000e+01 +1.097220000000000084e+00 -3.968750000000000000e+01 +1.097225000000000117e+00 -3.971875000000000000e+01 +1.097230000000000150e+00 -3.965625000000000000e+01 +1.097235000000000182e+00 -3.968750000000000000e+01 +1.097239999999999993e+00 -3.971875000000000000e+01 +1.097245000000000026e+00 -3.978125000000000000e+01 +1.097250000000000059e+00 -3.968750000000000000e+01 +1.097255000000000091e+00 -3.965625000000000000e+01 +1.097260000000000124e+00 -3.971875000000000000e+01 +1.097265000000000157e+00 -3.965625000000000000e+01 +1.097270000000000190e+00 -3.971875000000000000e+01 +1.097275000000000000e+00 -3.965625000000000000e+01 +1.097280000000000033e+00 -3.965625000000000000e+01 +1.097285000000000066e+00 -3.971875000000000000e+01 +1.097290000000000099e+00 -3.971875000000000000e+01 +1.097295000000000131e+00 -3.971875000000000000e+01 +1.097300000000000164e+00 -3.965625000000000000e+01 +1.097305000000000197e+00 -3.968750000000000000e+01 +1.097310000000000008e+00 -3.965625000000000000e+01 +1.097315000000000040e+00 -3.968750000000000000e+01 +1.097320000000000073e+00 -3.968750000000000000e+01 +1.097325000000000106e+00 -3.965625000000000000e+01 +1.097330000000000139e+00 -3.968750000000000000e+01 +1.097335000000000171e+00 -3.965625000000000000e+01 +1.097339999999999982e+00 -3.965625000000000000e+01 +1.097345000000000015e+00 -3.971875000000000000e+01 +1.097350000000000048e+00 -3.971875000000000000e+01 +1.097355000000000080e+00 -3.965625000000000000e+01 +1.097360000000000113e+00 -3.971875000000000000e+01 +1.097365000000000146e+00 -3.971875000000000000e+01 +1.097370000000000179e+00 -3.968750000000000000e+01 +1.097374999999999989e+00 -3.975000381469726562e+01 +1.097380000000000022e+00 -3.975000381469726562e+01 +1.097385000000000055e+00 -3.975000381469726562e+01 +1.097390000000000088e+00 -3.971875000000000000e+01 +1.097395000000000120e+00 -3.971875000000000000e+01 +1.097400000000000153e+00 -3.978125000000000000e+01 +1.097405000000000186e+00 -3.971875000000000000e+01 +1.097409999999999997e+00 -3.971875000000000000e+01 +1.097415000000000029e+00 -3.971875000000000000e+01 +1.097420000000000062e+00 -3.978125000000000000e+01 +1.097425000000000095e+00 -3.975000381469726562e+01 +1.097430000000000128e+00 -3.968750000000000000e+01 +1.097435000000000160e+00 -3.971875000000000000e+01 +1.097440000000000193e+00 -3.965625000000000000e+01 +1.097445000000000004e+00 -3.971875000000000000e+01 +1.097450000000000037e+00 -3.971875000000000000e+01 +1.097455000000000069e+00 -3.971875000000000000e+01 +1.097460000000000102e+00 -3.978125000000000000e+01 +1.097465000000000135e+00 -3.975000381469726562e+01 +1.097470000000000168e+00 -3.975000381469726562e+01 +1.097475000000000200e+00 -3.971875000000000000e+01 +1.097480000000000011e+00 -3.971875000000000000e+01 +1.097485000000000044e+00 -3.971875000000000000e+01 +1.097490000000000077e+00 -3.975000381469726562e+01 +1.097495000000000109e+00 -3.968750000000000000e+01 +1.097500000000000142e+00 -3.971875000000000000e+01 +1.097505000000000175e+00 -3.971875000000000000e+01 +1.097509999999999986e+00 -3.968750000000000000e+01 +1.097515000000000018e+00 -3.975000381469726562e+01 +1.097520000000000051e+00 -3.975000381469726562e+01 +1.097525000000000084e+00 -3.971875000000000000e+01 +1.097530000000000117e+00 -3.971875000000000000e+01 +1.097535000000000149e+00 -3.975000381469726562e+01 +1.097540000000000182e+00 -3.971875000000000000e+01 +1.097544999999999993e+00 -3.968750000000000000e+01 +1.097550000000000026e+00 -3.971875000000000000e+01 +1.097555000000000058e+00 -3.971875000000000000e+01 +1.097560000000000091e+00 -3.971875000000000000e+01 +1.097565000000000124e+00 -3.971875000000000000e+01 +1.097570000000000157e+00 -3.971875000000000000e+01 +1.097575000000000189e+00 -3.975000381469726562e+01 +1.097580000000000000e+00 -3.971875000000000000e+01 +1.097585000000000033e+00 -3.968750000000000000e+01 +1.097590000000000066e+00 -3.978125000000000000e+01 +1.097595000000000098e+00 -3.971875000000000000e+01 +1.097600000000000131e+00 -3.978125000000000000e+01 +1.097605000000000164e+00 -3.971875000000000000e+01 +1.097610000000000197e+00 -3.975000381469726562e+01 +1.097615000000000007e+00 -3.971875000000000000e+01 +1.097620000000000040e+00 -3.968750000000000000e+01 +1.097625000000000073e+00 -3.971875000000000000e+01 +1.097630000000000106e+00 -3.978125000000000000e+01 +1.097635000000000138e+00 -3.975000381469726562e+01 +1.097640000000000171e+00 -3.971875000000000000e+01 +1.097644999999999982e+00 -3.971875000000000000e+01 +1.097650000000000015e+00 -3.978125000000000000e+01 +1.097655000000000047e+00 -3.975000381469726562e+01 +1.097660000000000080e+00 -3.975000381469726562e+01 +1.097665000000000113e+00 -3.975000381469726562e+01 +1.097670000000000146e+00 -3.971875000000000000e+01 +1.097675000000000178e+00 -3.965625000000000000e+01 +1.097679999999999989e+00 -3.978125000000000000e+01 +1.097685000000000022e+00 -3.978125000000000000e+01 +1.097690000000000055e+00 -3.968750000000000000e+01 +1.097695000000000087e+00 -3.968750000000000000e+01 +1.097700000000000120e+00 -3.975000381469726562e+01 +1.097705000000000153e+00 -3.968750000000000000e+01 +1.097710000000000186e+00 -3.971875000000000000e+01 +1.097714999999999996e+00 -3.975000381469726562e+01 +1.097720000000000029e+00 -3.968750000000000000e+01 +1.097725000000000062e+00 -3.965625000000000000e+01 +1.097730000000000095e+00 -3.968750000000000000e+01 +1.097735000000000127e+00 -3.965625000000000000e+01 +1.097740000000000160e+00 -3.971875000000000000e+01 +1.097745000000000193e+00 -3.968750000000000000e+01 +1.097750000000000004e+00 -3.971875000000000000e+01 +1.097755000000000036e+00 -3.968750000000000000e+01 +1.097760000000000069e+00 -3.971875000000000000e+01 +1.097765000000000102e+00 -3.971875000000000000e+01 +1.097770000000000135e+00 -3.968750000000000000e+01 +1.097775000000000167e+00 -3.971875000000000000e+01 +1.097780000000000200e+00 -3.971875000000000000e+01 +1.097785000000000011e+00 -3.971875000000000000e+01 +1.097790000000000044e+00 -3.968750000000000000e+01 +1.097795000000000076e+00 -3.968750000000000000e+01 +1.097800000000000109e+00 -3.968750000000000000e+01 +1.097805000000000142e+00 -3.971875000000000000e+01 +1.097810000000000175e+00 -3.968750000000000000e+01 +1.097814999999999985e+00 -3.968750000000000000e+01 +1.097820000000000018e+00 -3.968750000000000000e+01 +1.097825000000000051e+00 -3.962500000000000000e+01 +1.097830000000000084e+00 -3.971875000000000000e+01 +1.097835000000000116e+00 -3.965625000000000000e+01 +1.097840000000000149e+00 -3.971875000000000000e+01 +1.097845000000000182e+00 -3.965625000000000000e+01 +1.097849999999999993e+00 -3.971875000000000000e+01 +1.097855000000000025e+00 -3.965625000000000000e+01 +1.097860000000000058e+00 -3.975000381469726562e+01 +1.097865000000000091e+00 -3.965625000000000000e+01 +1.097870000000000124e+00 -3.968750000000000000e+01 +1.097875000000000156e+00 -3.962500000000000000e+01 +1.097880000000000189e+00 -3.962500000000000000e+01 +1.097885000000000000e+00 -3.965625000000000000e+01 +1.097890000000000033e+00 -3.971875000000000000e+01 +1.097895000000000065e+00 -3.965625000000000000e+01 +1.097900000000000098e+00 -3.978125000000000000e+01 +1.097905000000000131e+00 -3.968750000000000000e+01 +1.097910000000000164e+00 -3.975000381469726562e+01 +1.097915000000000196e+00 -3.971875000000000000e+01 +1.097920000000000007e+00 -3.975000381469726562e+01 +1.097925000000000040e+00 -3.965625000000000000e+01 +1.097930000000000073e+00 -3.975000381469726562e+01 +1.097935000000000105e+00 -3.971875000000000000e+01 +1.097940000000000138e+00 -3.968750000000000000e+01 +1.097945000000000171e+00 -3.971875000000000000e+01 +1.097949999999999982e+00 -3.968750000000000000e+01 +1.097955000000000014e+00 -3.965625000000000000e+01 +1.097960000000000047e+00 -3.962500000000000000e+01 +1.097965000000000080e+00 -3.968750000000000000e+01 +1.097970000000000113e+00 -3.965625000000000000e+01 +1.097975000000000145e+00 -3.965625000000000000e+01 +1.097980000000000178e+00 -3.968750000000000000e+01 +1.097984999999999989e+00 -3.965625000000000000e+01 +1.097990000000000022e+00 -3.975000381469726562e+01 +1.097995000000000054e+00 -3.975000381469726562e+01 +1.098000000000000087e+00 -3.968750000000000000e+01 +1.098005000000000120e+00 -3.978125000000000000e+01 +1.098010000000000153e+00 -3.965625000000000000e+01 +1.098015000000000185e+00 -3.968750000000000000e+01 +1.098019999999999996e+00 -3.975000381469726562e+01 +1.098025000000000029e+00 -3.965625000000000000e+01 +1.098030000000000062e+00 -3.971875000000000000e+01 +1.098035000000000094e+00 -3.968750000000000000e+01 +1.098040000000000127e+00 -3.968750000000000000e+01 +1.098045000000000160e+00 -3.965625000000000000e+01 +1.098050000000000193e+00 -3.971875000000000000e+01 +1.098055000000000003e+00 -3.959375381469726562e+01 +1.098060000000000036e+00 -3.962500000000000000e+01 +1.098065000000000069e+00 -3.962500000000000000e+01 +1.098070000000000102e+00 -3.965625000000000000e+01 +1.098075000000000134e+00 -3.965625000000000000e+01 +1.098080000000000167e+00 -3.968750000000000000e+01 +1.098085000000000200e+00 -3.959375381469726562e+01 +1.098090000000000011e+00 -3.971875000000000000e+01 +1.098095000000000043e+00 -3.965625000000000000e+01 +1.098100000000000076e+00 -3.959375381469726562e+01 +1.098105000000000109e+00 -3.965625000000000000e+01 +1.098110000000000142e+00 -3.965625000000000000e+01 +1.098115000000000174e+00 -3.962500000000000000e+01 +1.098119999999999985e+00 -3.962500000000000000e+01 +1.098125000000000018e+00 -3.959375381469726562e+01 +1.098130000000000051e+00 -3.965625000000000000e+01 +1.098135000000000083e+00 -3.968750000000000000e+01 +1.098140000000000116e+00 -3.965625000000000000e+01 +1.098145000000000149e+00 -3.956250000000000000e+01 +1.098150000000000182e+00 -3.962500000000000000e+01 +1.098154999999999992e+00 -3.965625000000000000e+01 +1.098160000000000025e+00 -3.956250000000000000e+01 +1.098165000000000058e+00 -3.959375381469726562e+01 +1.098170000000000091e+00 -3.965625000000000000e+01 +1.098175000000000123e+00 -3.965625000000000000e+01 +1.098180000000000156e+00 -3.959375381469726562e+01 +1.098185000000000189e+00 -3.965625000000000000e+01 +1.098190000000000000e+00 -3.965625000000000000e+01 +1.098195000000000032e+00 -3.965625000000000000e+01 +1.098200000000000065e+00 -3.962500000000000000e+01 +1.098205000000000098e+00 -3.965625000000000000e+01 +1.098210000000000131e+00 -3.956250000000000000e+01 +1.098215000000000163e+00 -3.962500000000000000e+01 +1.098220000000000196e+00 -3.959375381469726562e+01 +1.098225000000000007e+00 -3.965625000000000000e+01 +1.098230000000000040e+00 -3.959375381469726562e+01 +1.098235000000000072e+00 -3.956250000000000000e+01 +1.098240000000000105e+00 -3.965625000000000000e+01 +1.098245000000000138e+00 -3.959375381469726562e+01 +1.098250000000000171e+00 -3.959375381469726562e+01 +1.098254999999999981e+00 -3.965625000000000000e+01 +1.098260000000000014e+00 -3.959375381469726562e+01 +1.098265000000000047e+00 -3.965625000000000000e+01 +1.098270000000000080e+00 -3.950000000000000000e+01 +1.098275000000000112e+00 -3.959375381469726562e+01 +1.098280000000000145e+00 -3.956250000000000000e+01 +1.098285000000000178e+00 -3.956250000000000000e+01 +1.098289999999999988e+00 -3.956250000000000000e+01 +1.098295000000000021e+00 -3.965625000000000000e+01 +1.098300000000000054e+00 -3.959375381469726562e+01 +1.098305000000000087e+00 -3.953125000000000000e+01 +1.098310000000000120e+00 -3.956250000000000000e+01 +1.098315000000000152e+00 -3.959375381469726562e+01 +1.098320000000000185e+00 -3.962500000000000000e+01 +1.098324999999999996e+00 -3.959375381469726562e+01 +1.098330000000000028e+00 -3.959375381469726562e+01 +1.098335000000000061e+00 -3.956250000000000000e+01 +1.098340000000000094e+00 -3.956250000000000000e+01 +1.098345000000000127e+00 -3.962500000000000000e+01 +1.098350000000000160e+00 -3.956250000000000000e+01 +1.098355000000000192e+00 -3.959375381469726562e+01 +1.098360000000000003e+00 -3.959375381469726562e+01 +1.098365000000000036e+00 -3.956250000000000000e+01 +1.098370000000000068e+00 -3.959375381469726562e+01 +1.098375000000000101e+00 -3.959375381469726562e+01 +1.098380000000000134e+00 -3.962500000000000000e+01 +1.098385000000000167e+00 -3.953125000000000000e+01 +1.098390000000000200e+00 -3.953125000000000000e+01 +1.098395000000000010e+00 -3.956250000000000000e+01 +1.098400000000000043e+00 -3.956250000000000000e+01 +1.098405000000000076e+00 -3.953125000000000000e+01 +1.098410000000000108e+00 -3.956250000000000000e+01 +1.098415000000000141e+00 -3.962500000000000000e+01 +1.098420000000000174e+00 -3.956250000000000000e+01 +1.098424999999999985e+00 -3.956250000000000000e+01 +1.098430000000000017e+00 -3.959375381469726562e+01 +1.098435000000000050e+00 -3.965625000000000000e+01 +1.098440000000000083e+00 -3.953125000000000000e+01 +1.098445000000000116e+00 -3.956250000000000000e+01 +1.098450000000000149e+00 -3.953125000000000000e+01 +1.098455000000000181e+00 -3.953125000000000000e+01 +1.098459999999999992e+00 -3.950000000000000000e+01 +1.098465000000000025e+00 -3.962500000000000000e+01 +1.098470000000000057e+00 -3.953125000000000000e+01 +1.098475000000000090e+00 -3.956250000000000000e+01 +1.098480000000000123e+00 -3.953125000000000000e+01 +1.098485000000000156e+00 -3.953125000000000000e+01 +1.098490000000000189e+00 -3.956250000000000000e+01 +1.098494999999999999e+00 -3.956250000000000000e+01 +1.098500000000000032e+00 -3.953125000000000000e+01 +1.098505000000000065e+00 -3.950000000000000000e+01 +1.098510000000000097e+00 -3.953125000000000000e+01 +1.098515000000000130e+00 -3.953125000000000000e+01 +1.098520000000000163e+00 -3.953125000000000000e+01 +1.098525000000000196e+00 -3.950000000000000000e+01 +1.098530000000000006e+00 -3.956250000000000000e+01 +1.098535000000000039e+00 -3.953125000000000000e+01 +1.098540000000000072e+00 -3.959375381469726562e+01 +1.098545000000000105e+00 -3.956250000000000000e+01 +1.098550000000000137e+00 -3.959375381469726562e+01 +1.098555000000000170e+00 -3.956250000000000000e+01 +1.098559999999999981e+00 -3.950000000000000000e+01 +1.098565000000000014e+00 -3.959375381469726562e+01 +1.098570000000000046e+00 -3.953125000000000000e+01 +1.098575000000000079e+00 -3.956250000000000000e+01 +1.098580000000000112e+00 -3.953125000000000000e+01 +1.098585000000000145e+00 -3.953125000000000000e+01 +1.098590000000000177e+00 -3.953125000000000000e+01 +1.098594999999999988e+00 -3.953125000000000000e+01 +1.098600000000000021e+00 -3.956250000000000000e+01 +1.098605000000000054e+00 -3.953125000000000000e+01 +1.098610000000000086e+00 -3.950000000000000000e+01 +1.098615000000000119e+00 -3.950000000000000000e+01 +1.098620000000000152e+00 -3.950000000000000000e+01 +1.098625000000000185e+00 -3.950000000000000000e+01 +1.098629999999999995e+00 -3.956250000000000000e+01 +1.098635000000000028e+00 -3.956250000000000000e+01 +1.098640000000000061e+00 -3.953125000000000000e+01 +1.098645000000000094e+00 -3.950000000000000000e+01 +1.098650000000000126e+00 -3.953125000000000000e+01 +1.098655000000000159e+00 -3.953125000000000000e+01 +1.098660000000000192e+00 -3.950000000000000000e+01 +1.098665000000000003e+00 -3.950000000000000000e+01 +1.098670000000000035e+00 -3.946875000000000000e+01 +1.098675000000000068e+00 -3.950000000000000000e+01 +1.098680000000000101e+00 -3.953125000000000000e+01 +1.098685000000000134e+00 -3.950000000000000000e+01 +1.098690000000000166e+00 -3.953125000000000000e+01 +1.098695000000000199e+00 -3.946875000000000000e+01 +1.098700000000000010e+00 -3.950000000000000000e+01 +1.098705000000000043e+00 -3.953125000000000000e+01 +1.098710000000000075e+00 -3.953125000000000000e+01 +1.098715000000000108e+00 -3.953125000000000000e+01 +1.098720000000000141e+00 -3.950000000000000000e+01 +1.098725000000000174e+00 -3.950000000000000000e+01 +1.098729999999999984e+00 -3.953125000000000000e+01 +1.098735000000000017e+00 -3.950000000000000000e+01 +1.098740000000000050e+00 -3.953125000000000000e+01 +1.098745000000000083e+00 -3.953125000000000000e+01 +1.098750000000000115e+00 -3.953125000000000000e+01 +1.098755000000000148e+00 -3.953125000000000000e+01 +1.098760000000000181e+00 -3.953125000000000000e+01 +1.098764999999999992e+00 -3.953125000000000000e+01 +1.098770000000000024e+00 -3.953125000000000000e+01 +1.098775000000000057e+00 -3.950000000000000000e+01 +1.098780000000000090e+00 -3.953125000000000000e+01 +1.098785000000000123e+00 -3.943750381469726562e+01 +1.098790000000000155e+00 -3.953125000000000000e+01 +1.098795000000000188e+00 -3.953125000000000000e+01 +1.098799999999999999e+00 -3.950000000000000000e+01 +1.098805000000000032e+00 -3.953125000000000000e+01 +1.098810000000000064e+00 -3.950000000000000000e+01 +1.098815000000000097e+00 -3.956250000000000000e+01 +1.098820000000000130e+00 -3.953125000000000000e+01 +1.098825000000000163e+00 -3.953125000000000000e+01 +1.098830000000000195e+00 -3.953125000000000000e+01 +1.098835000000000006e+00 -3.946875000000000000e+01 +1.098840000000000039e+00 -3.956250000000000000e+01 +1.098845000000000072e+00 -3.953125000000000000e+01 +1.098850000000000104e+00 -3.950000000000000000e+01 +1.098855000000000137e+00 -3.946875000000000000e+01 +1.098860000000000170e+00 -3.953125000000000000e+01 +1.098864999999999981e+00 -3.953125000000000000e+01 +1.098870000000000013e+00 -3.953125000000000000e+01 +1.098875000000000046e+00 -3.953125000000000000e+01 +1.098880000000000079e+00 -3.950000000000000000e+01 +1.098885000000000112e+00 -3.950000000000000000e+01 +1.098890000000000144e+00 -3.950000000000000000e+01 +1.098895000000000177e+00 -3.946875000000000000e+01 +1.098899999999999988e+00 -3.950000000000000000e+01 +1.098905000000000021e+00 -3.953125000000000000e+01 +1.098910000000000053e+00 -3.943750381469726562e+01 +1.098915000000000086e+00 -3.950000000000000000e+01 +1.098920000000000119e+00 -3.950000000000000000e+01 +1.098925000000000152e+00 -3.953125000000000000e+01 +1.098930000000000184e+00 -3.946875000000000000e+01 +1.098934999999999995e+00 -3.956250000000000000e+01 +1.098940000000000028e+00 -3.956250000000000000e+01 +1.098945000000000061e+00 -3.953125000000000000e+01 +1.098950000000000093e+00 -3.953125000000000000e+01 +1.098955000000000126e+00 -3.950000000000000000e+01 +1.098960000000000159e+00 -3.946875000000000000e+01 +1.098965000000000192e+00 -3.953125000000000000e+01 +1.098970000000000002e+00 -3.956250000000000000e+01 +1.098975000000000035e+00 -3.953125000000000000e+01 +1.098980000000000068e+00 -3.950000000000000000e+01 +1.098985000000000101e+00 -3.950000000000000000e+01 +1.098990000000000133e+00 -3.956250000000000000e+01 +1.098995000000000166e+00 -3.950000000000000000e+01 +1.099000000000000199e+00 -3.953125000000000000e+01 +1.099005000000000010e+00 -3.950000000000000000e+01 +1.099010000000000042e+00 -3.959375381469726562e+01 +1.099015000000000075e+00 -3.953125000000000000e+01 +1.099020000000000108e+00 -3.953125000000000000e+01 +1.099025000000000141e+00 -3.953125000000000000e+01 +1.099030000000000173e+00 -3.950000000000000000e+01 +1.099034999999999984e+00 -3.943750381469726562e+01 +1.099040000000000017e+00 -3.950000000000000000e+01 +1.099045000000000050e+00 -3.950000000000000000e+01 +1.099050000000000082e+00 -3.946875000000000000e+01 +1.099055000000000115e+00 -3.943750381469726562e+01 +1.099060000000000148e+00 -3.946875000000000000e+01 +1.099065000000000181e+00 -3.946875000000000000e+01 +1.099069999999999991e+00 -3.943750381469726562e+01 +1.099075000000000024e+00 -3.950000000000000000e+01 +1.099080000000000057e+00 -3.953125000000000000e+01 +1.099085000000000090e+00 -3.946875000000000000e+01 +1.099090000000000122e+00 -3.950000000000000000e+01 +1.099095000000000155e+00 -3.943750381469726562e+01 +1.099100000000000188e+00 -3.950000000000000000e+01 +1.099104999999999999e+00 -3.943750381469726562e+01 +1.099110000000000031e+00 -3.946875000000000000e+01 +1.099115000000000064e+00 -3.940625000000000000e+01 +1.099120000000000097e+00 -3.946875000000000000e+01 +1.099125000000000130e+00 -3.940625000000000000e+01 +1.099130000000000162e+00 -3.940625000000000000e+01 +1.099135000000000195e+00 -3.940625000000000000e+01 +1.099140000000000006e+00 -3.946875000000000000e+01 +1.099145000000000039e+00 -3.943750381469726562e+01 +1.099150000000000071e+00 -3.943750381469726562e+01 +1.099155000000000104e+00 -3.943750381469726562e+01 +1.099160000000000137e+00 -3.943750381469726562e+01 +1.099165000000000170e+00 -3.943750381469726562e+01 +1.099169999999999980e+00 -3.943750381469726562e+01 +1.099175000000000013e+00 -3.946875000000000000e+01 +1.099180000000000046e+00 -3.943750381469726562e+01 +1.099185000000000079e+00 -3.946875000000000000e+01 +1.099190000000000111e+00 -3.937500000000000000e+01 +1.099195000000000144e+00 -3.940625000000000000e+01 +1.099200000000000177e+00 -3.943750381469726562e+01 +1.099204999999999988e+00 -3.940625000000000000e+01 +1.099210000000000020e+00 -3.943750381469726562e+01 +1.099215000000000053e+00 -3.940625000000000000e+01 +1.099220000000000086e+00 -3.943750381469726562e+01 +1.099225000000000119e+00 -3.943750381469726562e+01 +1.099230000000000151e+00 -3.943750381469726562e+01 +1.099235000000000184e+00 -3.943750381469726562e+01 +1.099239999999999995e+00 -3.940625000000000000e+01 +1.099245000000000028e+00 -3.937500000000000000e+01 +1.099250000000000060e+00 -3.940625000000000000e+01 +1.099255000000000093e+00 -3.937500000000000000e+01 +1.099260000000000126e+00 -3.943750381469726562e+01 +1.099265000000000159e+00 -3.943750381469726562e+01 +1.099270000000000191e+00 -3.940625000000000000e+01 +1.099275000000000002e+00 -3.940625000000000000e+01 +1.099280000000000035e+00 -3.943750381469726562e+01 +1.099285000000000068e+00 -3.943750381469726562e+01 +1.099290000000000100e+00 -3.937500000000000000e+01 +1.099295000000000133e+00 -3.940625000000000000e+01 +1.099300000000000166e+00 -3.937500000000000000e+01 +1.099305000000000199e+00 -3.943750381469726562e+01 +1.099310000000000009e+00 -3.937500000000000000e+01 +1.099315000000000042e+00 -3.940625000000000000e+01 +1.099320000000000075e+00 -3.940625000000000000e+01 +1.099325000000000108e+00 -3.937500000000000000e+01 +1.099330000000000140e+00 -3.937500000000000000e+01 +1.099335000000000173e+00 -3.937500000000000000e+01 +1.099339999999999984e+00 -3.940625000000000000e+01 +1.099345000000000017e+00 -3.937500000000000000e+01 +1.099350000000000049e+00 -3.937500000000000000e+01 +1.099355000000000082e+00 -3.940625000000000000e+01 +1.099360000000000115e+00 -3.940625000000000000e+01 +1.099365000000000148e+00 -3.934375381469726562e+01 +1.099370000000000180e+00 -3.931250000000000000e+01 +1.099374999999999991e+00 -3.940625000000000000e+01 +1.099380000000000024e+00 -3.940625000000000000e+01 +1.099385000000000057e+00 -3.943750381469726562e+01 +1.099390000000000089e+00 -3.934375381469726562e+01 +1.099395000000000122e+00 -3.943750381469726562e+01 +1.099400000000000155e+00 -3.940625000000000000e+01 +1.099405000000000188e+00 -3.934375381469726562e+01 +1.099409999999999998e+00 -3.937500000000000000e+01 +1.099415000000000031e+00 -3.937500000000000000e+01 +1.099420000000000064e+00 -3.940625000000000000e+01 +1.099425000000000097e+00 -3.943750381469726562e+01 +1.099430000000000129e+00 -3.937500000000000000e+01 +1.099435000000000162e+00 -3.940625000000000000e+01 +1.099440000000000195e+00 -3.943750381469726562e+01 +1.099445000000000006e+00 -3.940625000000000000e+01 +1.099450000000000038e+00 -3.943750381469726562e+01 +1.099455000000000071e+00 -3.934375381469726562e+01 +1.099460000000000104e+00 -3.943750381469726562e+01 +1.099465000000000137e+00 -3.937500000000000000e+01 +1.099470000000000169e+00 -3.937500000000000000e+01 +1.099474999999999980e+00 -3.943750381469726562e+01 +1.099480000000000013e+00 -3.937500000000000000e+01 +1.099485000000000046e+00 -3.943750381469726562e+01 +1.099490000000000078e+00 -3.940625000000000000e+01 +1.099495000000000111e+00 -3.937500000000000000e+01 +1.099500000000000144e+00 -3.940625000000000000e+01 +1.099505000000000177e+00 -3.940625000000000000e+01 +1.099509999999999987e+00 -3.943750381469726562e+01 +1.099515000000000020e+00 -3.943750381469726562e+01 +1.099520000000000053e+00 -3.946875000000000000e+01 +1.099525000000000086e+00 -3.943750381469726562e+01 +1.099530000000000118e+00 -3.940625000000000000e+01 +1.099535000000000151e+00 -3.940625000000000000e+01 +1.099540000000000184e+00 -3.940625000000000000e+01 +1.099544999999999995e+00 -3.940625000000000000e+01 +1.099550000000000027e+00 -3.940625000000000000e+01 +1.099555000000000060e+00 -3.937500000000000000e+01 +1.099560000000000093e+00 -3.946875000000000000e+01 +1.099565000000000126e+00 -3.937500000000000000e+01 +1.099570000000000158e+00 -3.937500000000000000e+01 +1.099575000000000191e+00 -3.940625000000000000e+01 +1.099580000000000002e+00 -3.937500000000000000e+01 +1.099585000000000035e+00 -3.937500000000000000e+01 +1.099590000000000067e+00 -3.937500000000000000e+01 +1.099595000000000100e+00 -3.943750381469726562e+01 +1.099600000000000133e+00 -3.937500000000000000e+01 +1.099605000000000166e+00 -3.934375381469726562e+01 +1.099610000000000198e+00 -3.937500000000000000e+01 +1.099615000000000009e+00 -3.940625000000000000e+01 +1.099620000000000042e+00 -3.943750381469726562e+01 +1.099625000000000075e+00 -3.943750381469726562e+01 +1.099630000000000107e+00 -3.940625000000000000e+01 +1.099635000000000140e+00 -3.943750381469726562e+01 +1.099640000000000173e+00 -3.943750381469726562e+01 +1.099644999999999984e+00 -3.937500000000000000e+01 +1.099650000000000016e+00 -3.943750381469726562e+01 +1.099655000000000049e+00 -3.940625000000000000e+01 +1.099660000000000082e+00 -3.937500000000000000e+01 +1.099665000000000115e+00 -3.937500000000000000e+01 +1.099670000000000147e+00 -3.943750381469726562e+01 +1.099675000000000180e+00 -3.937500000000000000e+01 +1.099679999999999991e+00 -3.940625000000000000e+01 +1.099685000000000024e+00 -3.937500000000000000e+01 +1.099690000000000056e+00 -3.934375381469726562e+01 +1.099695000000000089e+00 -3.937500000000000000e+01 +1.099700000000000122e+00 -3.934375381469726562e+01 +1.099705000000000155e+00 -3.940625000000000000e+01 +1.099710000000000187e+00 -3.934375381469726562e+01 +1.099714999999999998e+00 -3.934375381469726562e+01 +1.099720000000000031e+00 -3.937500000000000000e+01 +1.099725000000000064e+00 -3.934375381469726562e+01 +1.099730000000000096e+00 -3.940625000000000000e+01 +1.099735000000000129e+00 -3.940625000000000000e+01 +1.099740000000000162e+00 -3.937500000000000000e+01 +1.099745000000000195e+00 -3.940625000000000000e+01 +1.099750000000000005e+00 -3.934375381469726562e+01 +1.099755000000000038e+00 -3.937500000000000000e+01 +1.099760000000000071e+00 -3.934375381469726562e+01 +1.099765000000000104e+00 -3.934375381469726562e+01 +1.099770000000000136e+00 -3.937500000000000000e+01 +1.099775000000000169e+00 -3.934375381469726562e+01 +1.099779999999999980e+00 -3.934375381469726562e+01 +1.099785000000000013e+00 -3.931250000000000000e+01 +1.099790000000000045e+00 -3.931250000000000000e+01 +1.099795000000000078e+00 -3.934375381469726562e+01 +1.099800000000000111e+00 -3.937500000000000000e+01 +1.099805000000000144e+00 -3.937500000000000000e+01 +1.099810000000000176e+00 -3.937500000000000000e+01 +1.099814999999999987e+00 -3.931250000000000000e+01 +1.099820000000000020e+00 -3.928125000000000000e+01 +1.099825000000000053e+00 -3.937500000000000000e+01 +1.099830000000000085e+00 -3.937500000000000000e+01 +1.099835000000000118e+00 -3.934375381469726562e+01 +1.099840000000000151e+00 -3.934375381469726562e+01 +1.099845000000000184e+00 -3.931250000000000000e+01 +1.099849999999999994e+00 -3.937500000000000000e+01 +1.099855000000000027e+00 -3.931250000000000000e+01 +1.099860000000000060e+00 -3.934375381469726562e+01 +1.099865000000000093e+00 -3.928125000000000000e+01 +1.099870000000000125e+00 -3.928125000000000000e+01 +1.099875000000000158e+00 -3.925000000000000000e+01 +1.099880000000000191e+00 -3.931250000000000000e+01 +1.099885000000000002e+00 -3.928125000000000000e+01 +1.099890000000000034e+00 -3.925000000000000000e+01 +1.099895000000000067e+00 -3.928125000000000000e+01 +1.099900000000000100e+00 -3.928125000000000000e+01 +1.099905000000000133e+00 -3.928125000000000000e+01 +1.099910000000000165e+00 -3.934375381469726562e+01 +1.099915000000000198e+00 -3.934375381469726562e+01 +1.099920000000000009e+00 -3.928125000000000000e+01 +1.099925000000000042e+00 -3.931250000000000000e+01 +1.099930000000000074e+00 -3.928125000000000000e+01 +1.099935000000000107e+00 -3.928125000000000000e+01 +1.099940000000000140e+00 -3.931250000000000000e+01 +1.099945000000000173e+00 -3.931250000000000000e+01 +1.099949999999999983e+00 -3.928125000000000000e+01 +1.099955000000000016e+00 -3.925000000000000000e+01 +1.099960000000000049e+00 -3.925000000000000000e+01 +1.099965000000000082e+00 -3.921875000000000000e+01 +1.099970000000000114e+00 -3.925000000000000000e+01 +1.099975000000000147e+00 -3.928125000000000000e+01 +1.099980000000000180e+00 -3.931250000000000000e+01 +1.099984999999999991e+00 -3.931250000000000000e+01 +1.099990000000000023e+00 -3.928125000000000000e+01 +1.099995000000000056e+00 -3.931250000000000000e+01 +1.100000000000000089e+00 -3.925000000000000000e+01 +1.100005000000000122e+00 -3.928125000000000000e+01 +1.100010000000000154e+00 -3.934375381469726562e+01 +1.100015000000000187e+00 -3.931250000000000000e+01 +1.100019999999999998e+00 -3.928125000000000000e+01 +1.100025000000000031e+00 -3.931250000000000000e+01 +1.100030000000000063e+00 -3.931250000000000000e+01 +1.100035000000000096e+00 -3.928125000000000000e+01 +1.100040000000000129e+00 -3.934375381469726562e+01 +1.100045000000000162e+00 -3.921875000000000000e+01 +1.100050000000000194e+00 -3.928125000000000000e+01 +1.100055000000000005e+00 -3.931250000000000000e+01 +1.100060000000000038e+00 -3.925000000000000000e+01 +1.100065000000000071e+00 -3.925000000000000000e+01 +1.100070000000000103e+00 -3.921875000000000000e+01 +1.100075000000000136e+00 -3.931250000000000000e+01 +1.100080000000000169e+00 -3.931250000000000000e+01 +1.100084999999999980e+00 -3.925000000000000000e+01 +1.100090000000000012e+00 -3.921875000000000000e+01 +1.100095000000000045e+00 -3.928125000000000000e+01 +1.100100000000000078e+00 -3.928125000000000000e+01 +1.100105000000000111e+00 -3.928125000000000000e+01 +1.100110000000000143e+00 -3.928125000000000000e+01 +1.100115000000000176e+00 -3.934375381469726562e+01 +1.100119999999999987e+00 -3.921875000000000000e+01 +1.100125000000000020e+00 -3.921875000000000000e+01 +1.100130000000000052e+00 -3.928125000000000000e+01 +1.100135000000000085e+00 -3.928125000000000000e+01 +1.100140000000000118e+00 -3.928125000000000000e+01 +1.100145000000000151e+00 -3.925000000000000000e+01 +1.100150000000000183e+00 -3.925000000000000000e+01 +1.100154999999999994e+00 -3.928125000000000000e+01 +1.100160000000000027e+00 -3.921875000000000000e+01 +1.100165000000000060e+00 -3.925000000000000000e+01 +1.100170000000000092e+00 -3.925000000000000000e+01 +1.100175000000000125e+00 -3.928125000000000000e+01 +1.100180000000000158e+00 -3.928125000000000000e+01 +1.100185000000000191e+00 -3.928125000000000000e+01 +1.100190000000000001e+00 -3.925000000000000000e+01 +1.100195000000000034e+00 -3.928125000000000000e+01 +1.100200000000000067e+00 -3.928125000000000000e+01 +1.100205000000000100e+00 -3.921875000000000000e+01 +1.100210000000000132e+00 -3.925000000000000000e+01 +1.100215000000000165e+00 -3.928125000000000000e+01 +1.100220000000000198e+00 -3.928125000000000000e+01 +1.100225000000000009e+00 -3.928125000000000000e+01 +1.100230000000000041e+00 -3.921875000000000000e+01 +1.100235000000000074e+00 -3.921875000000000000e+01 +1.100240000000000107e+00 -3.925000000000000000e+01 +1.100245000000000140e+00 -3.928125000000000000e+01 +1.100250000000000172e+00 -3.921875000000000000e+01 +1.100254999999999983e+00 -3.928125000000000000e+01 +1.100260000000000016e+00 -3.921875000000000000e+01 +1.100265000000000049e+00 -3.921875000000000000e+01 +1.100270000000000081e+00 -3.925000000000000000e+01 +1.100275000000000114e+00 -3.921875000000000000e+01 +1.100280000000000147e+00 -3.928125000000000000e+01 +1.100285000000000180e+00 -3.918750381469726562e+01 +1.100289999999999990e+00 -3.928125000000000000e+01 +1.100295000000000023e+00 -3.928125000000000000e+01 +1.100300000000000056e+00 -3.928125000000000000e+01 +1.100305000000000089e+00 -3.921875000000000000e+01 +1.100310000000000121e+00 -3.915625000000000000e+01 +1.100315000000000154e+00 -3.915625000000000000e+01 +1.100320000000000187e+00 -3.925000000000000000e+01 +1.100324999999999998e+00 -3.925000000000000000e+01 +1.100330000000000030e+00 -3.921875000000000000e+01 +1.100335000000000063e+00 -3.921875000000000000e+01 +1.100340000000000096e+00 -3.925000000000000000e+01 +1.100345000000000129e+00 -3.925000000000000000e+01 +1.100350000000000161e+00 -3.928125000000000000e+01 +1.100355000000000194e+00 -3.925000000000000000e+01 +1.100360000000000005e+00 -3.925000000000000000e+01 +1.100365000000000038e+00 -3.925000000000000000e+01 +1.100370000000000070e+00 -3.934375381469726562e+01 +1.100375000000000103e+00 -3.925000000000000000e+01 +1.100380000000000136e+00 -3.925000000000000000e+01 +1.100385000000000169e+00 -3.931250000000000000e+01 +1.100389999999999979e+00 -3.928125000000000000e+01 +1.100395000000000012e+00 -3.928125000000000000e+01 +1.100400000000000045e+00 -3.921875000000000000e+01 +1.100405000000000078e+00 -3.928125000000000000e+01 +1.100410000000000110e+00 -3.921875000000000000e+01 +1.100415000000000143e+00 -3.918750381469726562e+01 +1.100420000000000176e+00 -3.921875000000000000e+01 +1.100424999999999986e+00 -3.928125000000000000e+01 +1.100430000000000019e+00 -3.925000000000000000e+01 +1.100435000000000052e+00 -3.928125000000000000e+01 +1.100440000000000085e+00 -3.921875000000000000e+01 +1.100445000000000118e+00 -3.928125000000000000e+01 +1.100450000000000150e+00 -3.928125000000000000e+01 +1.100455000000000183e+00 -3.921875000000000000e+01 +1.100459999999999994e+00 -3.918750381469726562e+01 +1.100465000000000027e+00 -3.921875000000000000e+01 +1.100470000000000059e+00 -3.921875000000000000e+01 +1.100475000000000092e+00 -3.918750381469726562e+01 +1.100480000000000125e+00 -3.918750381469726562e+01 +1.100485000000000158e+00 -3.925000000000000000e+01 +1.100490000000000190e+00 -3.925000000000000000e+01 +1.100495000000000001e+00 -3.921875000000000000e+01 +1.100500000000000034e+00 -3.925000000000000000e+01 +1.100505000000000067e+00 -3.928125000000000000e+01 +1.100510000000000099e+00 -3.921875000000000000e+01 +1.100515000000000132e+00 -3.928125000000000000e+01 +1.100520000000000165e+00 -3.928125000000000000e+01 +1.100525000000000198e+00 -3.918750381469726562e+01 +1.100530000000000008e+00 -3.918750381469726562e+01 +1.100535000000000041e+00 -3.918750381469726562e+01 +1.100540000000000074e+00 -3.925000000000000000e+01 +1.100545000000000107e+00 -3.918750381469726562e+01 +1.100550000000000139e+00 -3.921875000000000000e+01 +1.100555000000000172e+00 -3.921875000000000000e+01 +1.100559999999999983e+00 -3.921875000000000000e+01 +1.100565000000000015e+00 -3.921875000000000000e+01 +1.100570000000000048e+00 -3.921875000000000000e+01 +1.100575000000000081e+00 -3.925000000000000000e+01 +1.100580000000000114e+00 -3.918750381469726562e+01 +1.100585000000000147e+00 -3.921875000000000000e+01 +1.100590000000000179e+00 -3.921875000000000000e+01 +1.100594999999999990e+00 -3.921875000000000000e+01 +1.100600000000000023e+00 -3.918750381469726562e+01 +1.100605000000000055e+00 -3.915625000000000000e+01 +1.100610000000000088e+00 -3.921875000000000000e+01 +1.100615000000000121e+00 -3.918750381469726562e+01 +1.100620000000000154e+00 -3.915625000000000000e+01 +1.100625000000000187e+00 -3.915625000000000000e+01 +1.100629999999999997e+00 -3.918750381469726562e+01 +1.100635000000000030e+00 -3.915625000000000000e+01 +1.100640000000000063e+00 -3.921875000000000000e+01 +1.100645000000000095e+00 -3.912500000000000000e+01 +1.100650000000000128e+00 -3.921875000000000000e+01 +1.100655000000000161e+00 -3.921875000000000000e+01 +1.100660000000000194e+00 -3.921875000000000000e+01 +1.100665000000000004e+00 -3.925000000000000000e+01 +1.100670000000000037e+00 -3.915625000000000000e+01 +1.100675000000000070e+00 -3.918750381469726562e+01 +1.100680000000000103e+00 -3.915625000000000000e+01 +1.100685000000000136e+00 -3.918750381469726562e+01 +1.100690000000000168e+00 -3.915625000000000000e+01 +1.100695000000000201e+00 -3.915625000000000000e+01 +1.100700000000000012e+00 -3.918750381469726562e+01 +1.100705000000000044e+00 -3.918750381469726562e+01 +1.100710000000000077e+00 -3.918750381469726562e+01 +1.100715000000000110e+00 -3.918750381469726562e+01 +1.100720000000000143e+00 -3.915625000000000000e+01 +1.100725000000000176e+00 -3.918750381469726562e+01 +1.100729999999999986e+00 -3.918750381469726562e+01 +1.100735000000000019e+00 -3.912500000000000000e+01 +1.100740000000000052e+00 -3.918750381469726562e+01 +1.100745000000000084e+00 -3.918750381469726562e+01 +1.100750000000000117e+00 -3.921875000000000000e+01 +1.100755000000000150e+00 -3.921875000000000000e+01 +1.100760000000000183e+00 -3.918750381469726562e+01 +1.100764999999999993e+00 -3.918750381469726562e+01 +1.100770000000000026e+00 -3.918750381469726562e+01 +1.100775000000000059e+00 -3.918750381469726562e+01 +1.100780000000000092e+00 -3.915625000000000000e+01 +1.100785000000000124e+00 -3.921875000000000000e+01 +1.100790000000000157e+00 -3.918750381469726562e+01 +1.100795000000000190e+00 -3.915625000000000000e+01 +1.100800000000000001e+00 -3.918750381469726562e+01 +1.100805000000000033e+00 -3.928125000000000000e+01 +1.100810000000000066e+00 -3.918750381469726562e+01 +1.100815000000000099e+00 -3.915625000000000000e+01 +1.100820000000000132e+00 -3.912500000000000000e+01 +1.100825000000000164e+00 -3.915625000000000000e+01 +1.100830000000000197e+00 -3.915625000000000000e+01 +1.100835000000000008e+00 -3.915625000000000000e+01 +1.100840000000000041e+00 -3.915625000000000000e+01 +1.100845000000000073e+00 -3.918750381469726562e+01 +1.100850000000000106e+00 -3.915625000000000000e+01 +1.100855000000000139e+00 -3.915625000000000000e+01 +1.100860000000000172e+00 -3.921875000000000000e+01 +1.100864999999999982e+00 -3.921875000000000000e+01 +1.100870000000000015e+00 -3.918750381469726562e+01 +1.100875000000000048e+00 -3.915625000000000000e+01 +1.100880000000000081e+00 -3.918750381469726562e+01 +1.100885000000000113e+00 -3.909375000000000000e+01 +1.100890000000000146e+00 -3.915625000000000000e+01 +1.100895000000000179e+00 -3.915625000000000000e+01 +1.100899999999999990e+00 -3.915625000000000000e+01 +1.100905000000000022e+00 -3.909375000000000000e+01 +1.100910000000000055e+00 -3.915625000000000000e+01 +1.100915000000000088e+00 -3.912500000000000000e+01 +1.100920000000000121e+00 -3.912500000000000000e+01 +1.100925000000000153e+00 -3.915625000000000000e+01 +1.100930000000000186e+00 -3.906250000000000000e+01 +1.100934999999999997e+00 -3.918750381469726562e+01 +1.100940000000000030e+00 -3.915625000000000000e+01 +1.100945000000000062e+00 -3.912500000000000000e+01 +1.100950000000000095e+00 -3.915625000000000000e+01 +1.100955000000000128e+00 -3.906250000000000000e+01 +1.100960000000000161e+00 -3.912500000000000000e+01 +1.100965000000000193e+00 -3.909375000000000000e+01 +1.100970000000000004e+00 -3.915625000000000000e+01 +1.100975000000000037e+00 -3.915625000000000000e+01 +1.100980000000000070e+00 -3.918750381469726562e+01 +1.100985000000000102e+00 -3.912500000000000000e+01 +1.100990000000000135e+00 -3.915625000000000000e+01 +1.100995000000000168e+00 -3.915625000000000000e+01 +1.101000000000000201e+00 -3.912500000000000000e+01 +1.101005000000000011e+00 -3.918750381469726562e+01 +1.101010000000000044e+00 -3.912500000000000000e+01 +1.101015000000000077e+00 -3.912500000000000000e+01 +1.101020000000000110e+00 -3.909375000000000000e+01 +1.101025000000000142e+00 -3.915625000000000000e+01 +1.101030000000000175e+00 -3.909375000000000000e+01 +1.101034999999999986e+00 -3.915625000000000000e+01 +1.101040000000000019e+00 -3.915625000000000000e+01 +1.101045000000000051e+00 -3.906250000000000000e+01 +1.101050000000000084e+00 -3.909375000000000000e+01 +1.101055000000000117e+00 -3.912500000000000000e+01 +1.101060000000000150e+00 -3.912500000000000000e+01 +1.101065000000000182e+00 -3.912500000000000000e+01 +1.101069999999999993e+00 -3.912500000000000000e+01 +1.101075000000000026e+00 -3.909375000000000000e+01 +1.101080000000000059e+00 -3.906250000000000000e+01 +1.101085000000000091e+00 -3.909375000000000000e+01 +1.101090000000000124e+00 -3.915625000000000000e+01 +1.101095000000000157e+00 -3.903125381469726562e+01 +1.101100000000000190e+00 -3.909375000000000000e+01 +1.101105000000000000e+00 -3.909375000000000000e+01 +1.101110000000000033e+00 -3.906250000000000000e+01 +1.101115000000000066e+00 -3.906250000000000000e+01 +1.101120000000000099e+00 -3.906250000000000000e+01 +1.101125000000000131e+00 -3.903125381469726562e+01 +1.101130000000000164e+00 -3.903125381469726562e+01 +1.101135000000000197e+00 -3.909375000000000000e+01 +1.101140000000000008e+00 -3.906250000000000000e+01 +1.101145000000000040e+00 -3.903125381469726562e+01 +1.101150000000000073e+00 -3.906250000000000000e+01 +1.101155000000000106e+00 -3.909375000000000000e+01 +1.101160000000000139e+00 -3.903125381469726562e+01 +1.101165000000000171e+00 -3.909375000000000000e+01 +1.101169999999999982e+00 -3.906250000000000000e+01 +1.101175000000000015e+00 -3.909375000000000000e+01 +1.101180000000000048e+00 -3.909375000000000000e+01 +1.101185000000000080e+00 -3.912500000000000000e+01 +1.101190000000000113e+00 -3.912500000000000000e+01 +1.101195000000000146e+00 -3.906250000000000000e+01 +1.101200000000000179e+00 -3.906250000000000000e+01 +1.101204999999999989e+00 -3.906250000000000000e+01 +1.101210000000000022e+00 -3.906250000000000000e+01 +1.101215000000000055e+00 -3.909375000000000000e+01 +1.101220000000000088e+00 -3.909375000000000000e+01 +1.101225000000000120e+00 -3.906250000000000000e+01 +1.101230000000000153e+00 -3.909375000000000000e+01 +1.101235000000000186e+00 -3.909375000000000000e+01 +1.101239999999999997e+00 -3.909375000000000000e+01 +1.101245000000000029e+00 -3.915625000000000000e+01 +1.101250000000000062e+00 -3.906250000000000000e+01 +1.101255000000000095e+00 -3.912500000000000000e+01 +1.101260000000000128e+00 -3.909375000000000000e+01 +1.101265000000000160e+00 -3.909375000000000000e+01 +1.101270000000000193e+00 -3.915625000000000000e+01 +1.101275000000000004e+00 -3.903125381469726562e+01 +1.101280000000000037e+00 -3.909375000000000000e+01 +1.101285000000000069e+00 -3.909375000000000000e+01 +1.101290000000000102e+00 -3.903125381469726562e+01 +1.101295000000000135e+00 -3.900000000000000000e+01 +1.101300000000000168e+00 -3.912500000000000000e+01 +1.101305000000000200e+00 -3.909375000000000000e+01 +1.101310000000000011e+00 -3.909375000000000000e+01 +1.101315000000000044e+00 -3.909375000000000000e+01 +1.101320000000000077e+00 -3.909375000000000000e+01 +1.101325000000000109e+00 -3.906250000000000000e+01 +1.101330000000000142e+00 -3.903125381469726562e+01 +1.101335000000000175e+00 -3.906250000000000000e+01 +1.101339999999999986e+00 -3.906250000000000000e+01 +1.101345000000000018e+00 -3.903125381469726562e+01 +1.101350000000000051e+00 -3.906250000000000000e+01 +1.101355000000000084e+00 -3.909375000000000000e+01 +1.101360000000000117e+00 -3.903125381469726562e+01 +1.101365000000000149e+00 -3.909375000000000000e+01 +1.101370000000000182e+00 -3.903125381469726562e+01 +1.101374999999999993e+00 -3.903125381469726562e+01 +1.101380000000000026e+00 -3.906250000000000000e+01 +1.101385000000000058e+00 -3.906250000000000000e+01 +1.101390000000000091e+00 -3.903125381469726562e+01 +1.101395000000000124e+00 -3.906250000000000000e+01 +1.101400000000000157e+00 -3.903125381469726562e+01 +1.101405000000000189e+00 -3.906250000000000000e+01 +1.101410000000000000e+00 -3.906250000000000000e+01 +1.101415000000000033e+00 -3.903125381469726562e+01 +1.101420000000000066e+00 -3.906250000000000000e+01 +1.101425000000000098e+00 -3.903125381469726562e+01 +1.101430000000000131e+00 -3.903125381469726562e+01 +1.101435000000000164e+00 -3.903125381469726562e+01 +1.101440000000000197e+00 -3.903125381469726562e+01 +1.101445000000000007e+00 -3.900000000000000000e+01 +1.101450000000000040e+00 -3.906250000000000000e+01 +1.101455000000000073e+00 -3.906250000000000000e+01 +1.101460000000000106e+00 -3.900000000000000000e+01 +1.101465000000000138e+00 -3.906250000000000000e+01 +1.101470000000000171e+00 -3.906250000000000000e+01 +1.101474999999999982e+00 -3.909375000000000000e+01 +1.101480000000000015e+00 -3.903125381469726562e+01 +1.101485000000000047e+00 -3.909375000000000000e+01 +1.101490000000000080e+00 -3.903125381469726562e+01 +1.101495000000000113e+00 -3.906250000000000000e+01 +1.101500000000000146e+00 -3.900000000000000000e+01 +1.101505000000000178e+00 -3.906250000000000000e+01 +1.101509999999999989e+00 -3.903125381469726562e+01 +1.101515000000000022e+00 -3.906250000000000000e+01 +1.101520000000000055e+00 -3.900000000000000000e+01 +1.101525000000000087e+00 -3.903125381469726562e+01 +1.101530000000000120e+00 -3.903125381469726562e+01 +1.101535000000000153e+00 -3.903125381469726562e+01 +1.101540000000000186e+00 -3.903125381469726562e+01 +1.101544999999999996e+00 -3.903125381469726562e+01 +1.101550000000000029e+00 -3.903125381469726562e+01 +1.101555000000000062e+00 -3.903125381469726562e+01 +1.101560000000000095e+00 -3.903125381469726562e+01 +1.101565000000000127e+00 -3.900000000000000000e+01 +1.101570000000000160e+00 -3.906250000000000000e+01 +1.101575000000000193e+00 -3.906250000000000000e+01 +1.101580000000000004e+00 -3.903125381469726562e+01 +1.101585000000000036e+00 -3.896875000000000000e+01 +1.101590000000000069e+00 -3.900000000000000000e+01 +1.101595000000000102e+00 -3.900000000000000000e+01 +1.101600000000000135e+00 -3.896875000000000000e+01 +1.101605000000000167e+00 -3.900000000000000000e+01 +1.101610000000000200e+00 -3.903125381469726562e+01 +1.101615000000000011e+00 -3.903125381469726562e+01 +1.101620000000000044e+00 -3.903125381469726562e+01 +1.101625000000000076e+00 -3.900000000000000000e+01 +1.101630000000000109e+00 -3.900000000000000000e+01 +1.101635000000000142e+00 -3.896875000000000000e+01 +1.101640000000000175e+00 -3.896875000000000000e+01 +1.101644999999999985e+00 -3.900000000000000000e+01 +1.101650000000000018e+00 -3.900000000000000000e+01 +1.101655000000000051e+00 -3.903125381469726562e+01 +1.101660000000000084e+00 -3.903125381469726562e+01 +1.101665000000000116e+00 -3.896875000000000000e+01 +1.101670000000000149e+00 -3.903125381469726562e+01 +1.101675000000000182e+00 -3.896875000000000000e+01 +1.101679999999999993e+00 -3.896875000000000000e+01 +1.101685000000000025e+00 -3.896875000000000000e+01 +1.101690000000000058e+00 -3.900000000000000000e+01 +1.101695000000000091e+00 -3.900000000000000000e+01 +1.101700000000000124e+00 -3.900000000000000000e+01 +1.101705000000000156e+00 -3.900000000000000000e+01 +1.101710000000000189e+00 -3.900000000000000000e+01 +1.101715000000000000e+00 -3.900000000000000000e+01 +1.101720000000000033e+00 -3.900000000000000000e+01 +1.101725000000000065e+00 -3.903125381469726562e+01 +1.101730000000000098e+00 -3.900000000000000000e+01 +1.101735000000000131e+00 -3.900000000000000000e+01 +1.101740000000000164e+00 -3.900000000000000000e+01 +1.101745000000000196e+00 -3.903125381469726562e+01 +1.101750000000000007e+00 -3.900000000000000000e+01 +1.101755000000000040e+00 -3.896875000000000000e+01 +1.101760000000000073e+00 -3.903125381469726562e+01 +1.101765000000000105e+00 -3.896875000000000000e+01 +1.101770000000000138e+00 -3.896875000000000000e+01 +1.101775000000000171e+00 -3.900000000000000000e+01 +1.101779999999999982e+00 -3.896875000000000000e+01 +1.101785000000000014e+00 -3.900000000000000000e+01 +1.101790000000000047e+00 -3.903125381469726562e+01 +1.101795000000000080e+00 -3.896875000000000000e+01 +1.101800000000000113e+00 -3.896875000000000000e+01 +1.101805000000000145e+00 -3.903125381469726562e+01 +1.101810000000000178e+00 -3.900000000000000000e+01 +1.101814999999999989e+00 -3.900000000000000000e+01 +1.101820000000000022e+00 -3.900000000000000000e+01 +1.101825000000000054e+00 -3.900000000000000000e+01 +1.101830000000000087e+00 -3.900000000000000000e+01 +1.101835000000000120e+00 -3.900000000000000000e+01 +1.101840000000000153e+00 -3.893750000000000000e+01 +1.101845000000000185e+00 -3.900000000000000000e+01 +1.101849999999999996e+00 -3.900000000000000000e+01 +1.101855000000000029e+00 -3.893750000000000000e+01 +1.101860000000000062e+00 -3.896875000000000000e+01 +1.101865000000000094e+00 -3.900000000000000000e+01 +1.101870000000000127e+00 -3.900000000000000000e+01 +1.101875000000000160e+00 -3.900000000000000000e+01 +1.101880000000000193e+00 -3.893750000000000000e+01 +1.101885000000000003e+00 -3.896875000000000000e+01 +1.101890000000000036e+00 -3.900000000000000000e+01 +1.101895000000000069e+00 -3.896875000000000000e+01 +1.101900000000000102e+00 -3.896875000000000000e+01 +1.101905000000000134e+00 -3.896875000000000000e+01 +1.101910000000000167e+00 -3.896875000000000000e+01 +1.101915000000000200e+00 -3.887500381469726562e+01 +1.101920000000000011e+00 -3.896875000000000000e+01 +1.101925000000000043e+00 -3.893750000000000000e+01 +1.101930000000000076e+00 -3.896875000000000000e+01 +1.101935000000000109e+00 -3.900000000000000000e+01 +1.101940000000000142e+00 -3.900000000000000000e+01 +1.101945000000000174e+00 -3.890625000000000000e+01 +1.101949999999999985e+00 -3.893750000000000000e+01 +1.101955000000000018e+00 -3.896875000000000000e+01 +1.101960000000000051e+00 -3.893750000000000000e+01 +1.101965000000000083e+00 -3.893750000000000000e+01 +1.101970000000000116e+00 -3.900000000000000000e+01 +1.101975000000000149e+00 -3.896875000000000000e+01 +1.101980000000000182e+00 -3.900000000000000000e+01 +1.101984999999999992e+00 -3.890625000000000000e+01 +1.101990000000000025e+00 -3.896875000000000000e+01 +1.101995000000000058e+00 -3.896875000000000000e+01 +1.102000000000000091e+00 -3.893750000000000000e+01 +1.102005000000000123e+00 -3.893750000000000000e+01 +1.102010000000000156e+00 -3.893750000000000000e+01 +1.102015000000000189e+00 -3.893750000000000000e+01 +1.102020000000000000e+00 -3.893750000000000000e+01 +1.102025000000000032e+00 -3.893750000000000000e+01 +1.102030000000000065e+00 -3.896875000000000000e+01 +1.102035000000000098e+00 -3.893750000000000000e+01 +1.102040000000000131e+00 -3.893750000000000000e+01 +1.102045000000000163e+00 -3.896875000000000000e+01 +1.102050000000000196e+00 -3.896875000000000000e+01 +1.102055000000000007e+00 -3.896875000000000000e+01 +1.102060000000000040e+00 -3.893750000000000000e+01 +1.102065000000000072e+00 -3.890625000000000000e+01 +1.102070000000000105e+00 -3.890625000000000000e+01 +1.102075000000000138e+00 -3.896875000000000000e+01 +1.102080000000000171e+00 -3.896875000000000000e+01 +1.102084999999999981e+00 -3.896875000000000000e+01 +1.102090000000000014e+00 -3.893750000000000000e+01 +1.102095000000000047e+00 -3.900000000000000000e+01 +1.102100000000000080e+00 -3.896875000000000000e+01 +1.102105000000000112e+00 -3.896875000000000000e+01 +1.102110000000000145e+00 -3.900000000000000000e+01 +1.102115000000000178e+00 -3.890625000000000000e+01 +1.102119999999999989e+00 -3.896875000000000000e+01 +1.102125000000000021e+00 -3.887500381469726562e+01 +1.102130000000000054e+00 -3.890625000000000000e+01 +1.102135000000000087e+00 -3.896875000000000000e+01 +1.102140000000000120e+00 -3.893750000000000000e+01 +1.102145000000000152e+00 -3.900000000000000000e+01 +1.102150000000000185e+00 -3.900000000000000000e+01 +1.102154999999999996e+00 -3.896875000000000000e+01 +1.102160000000000029e+00 -3.900000000000000000e+01 +1.102165000000000061e+00 -3.893750000000000000e+01 +1.102170000000000094e+00 -3.896875000000000000e+01 +1.102175000000000127e+00 -3.893750000000000000e+01 +1.102180000000000160e+00 -3.893750000000000000e+01 +1.102185000000000192e+00 -3.896875000000000000e+01 +1.102190000000000003e+00 -3.887500381469726562e+01 +1.102195000000000036e+00 -3.890625000000000000e+01 +1.102200000000000069e+00 -3.900000000000000000e+01 +1.102205000000000101e+00 -3.893750000000000000e+01 +1.102210000000000134e+00 -3.893750000000000000e+01 +1.102215000000000167e+00 -3.893750000000000000e+01 +1.102220000000000200e+00 -3.893750000000000000e+01 +1.102225000000000010e+00 -3.896875000000000000e+01 +1.102230000000000043e+00 -3.893750000000000000e+01 +1.102235000000000076e+00 -3.890625000000000000e+01 +1.102240000000000109e+00 -3.890625000000000000e+01 +1.102245000000000141e+00 -3.890625000000000000e+01 +1.102250000000000174e+00 -3.890625000000000000e+01 +1.102254999999999985e+00 -3.893750000000000000e+01 +1.102260000000000018e+00 -3.896875000000000000e+01 +1.102265000000000050e+00 -3.890625000000000000e+01 +1.102270000000000083e+00 -3.893750000000000000e+01 +1.102275000000000116e+00 -3.890625000000000000e+01 +1.102280000000000149e+00 -3.893750000000000000e+01 +1.102285000000000181e+00 -3.890625000000000000e+01 +1.102289999999999992e+00 -3.890625000000000000e+01 +1.102295000000000025e+00 -3.890625000000000000e+01 +1.102300000000000058e+00 -3.893750000000000000e+01 +1.102305000000000090e+00 -3.890625000000000000e+01 +1.102310000000000123e+00 -3.887500381469726562e+01 +1.102315000000000156e+00 -3.890625000000000000e+01 +1.102320000000000189e+00 -3.884375000000000000e+01 +1.102324999999999999e+00 -3.890625000000000000e+01 +1.102330000000000032e+00 -3.887500381469726562e+01 +1.102335000000000065e+00 -3.890625000000000000e+01 +1.102340000000000098e+00 -3.884375000000000000e+01 +1.102345000000000130e+00 -3.881250000000000000e+01 +1.102350000000000163e+00 -3.887500381469726562e+01 +1.102355000000000196e+00 -3.884375000000000000e+01 +1.102360000000000007e+00 -3.887500381469726562e+01 +1.102365000000000039e+00 -3.890625000000000000e+01 +1.102370000000000072e+00 -3.890625000000000000e+01 +1.102375000000000105e+00 -3.890625000000000000e+01 +1.102380000000000138e+00 -3.884375000000000000e+01 +1.102385000000000170e+00 -3.890625000000000000e+01 +1.102389999999999981e+00 -3.890625000000000000e+01 +1.102395000000000014e+00 -3.893750000000000000e+01 +1.102400000000000047e+00 -3.884375000000000000e+01 +1.102405000000000079e+00 -3.890625000000000000e+01 +1.102410000000000112e+00 -3.890625000000000000e+01 +1.102415000000000145e+00 -3.887500381469726562e+01 +1.102420000000000178e+00 -3.884375000000000000e+01 +1.102424999999999988e+00 -3.890625000000000000e+01 +1.102430000000000021e+00 -3.884375000000000000e+01 +1.102435000000000054e+00 -3.887500381469726562e+01 +1.102440000000000087e+00 -3.884375000000000000e+01 +1.102445000000000119e+00 -3.890625000000000000e+01 +1.102450000000000152e+00 -3.890625000000000000e+01 +1.102455000000000185e+00 -3.890625000000000000e+01 +1.102459999999999996e+00 -3.887500381469726562e+01 +1.102465000000000028e+00 -3.890625000000000000e+01 +1.102470000000000061e+00 -3.887500381469726562e+01 +1.102475000000000094e+00 -3.887500381469726562e+01 +1.102480000000000127e+00 -3.890625000000000000e+01 +1.102485000000000159e+00 -3.887500381469726562e+01 +1.102490000000000192e+00 -3.887500381469726562e+01 +1.102495000000000003e+00 -3.893750000000000000e+01 +1.102500000000000036e+00 -3.887500381469726562e+01 +1.102505000000000068e+00 -3.884375000000000000e+01 +1.102510000000000101e+00 -3.887500381469726562e+01 +1.102515000000000134e+00 -3.884375000000000000e+01 +1.102520000000000167e+00 -3.884375000000000000e+01 +1.102525000000000199e+00 -3.881250000000000000e+01 +1.102530000000000010e+00 -3.884375000000000000e+01 +1.102535000000000043e+00 -3.881250000000000000e+01 +1.102540000000000076e+00 -3.887500381469726562e+01 +1.102545000000000108e+00 -3.884375000000000000e+01 +1.102550000000000141e+00 -3.878125000000000000e+01 +1.102555000000000174e+00 -3.881250000000000000e+01 +1.102559999999999985e+00 -3.887500381469726562e+01 +1.102565000000000017e+00 -3.887500381469726562e+01 +1.102570000000000050e+00 -3.890625000000000000e+01 +1.102575000000000083e+00 -3.884375000000000000e+01 +1.102580000000000116e+00 -3.881250000000000000e+01 +1.102585000000000148e+00 -3.887500381469726562e+01 +1.102590000000000181e+00 -3.887500381469726562e+01 +1.102594999999999992e+00 -3.893750000000000000e+01 +1.102600000000000025e+00 -3.884375000000000000e+01 +1.102605000000000057e+00 -3.887500381469726562e+01 +1.102610000000000090e+00 -3.881250000000000000e+01 +1.102615000000000123e+00 -3.887500381469726562e+01 +1.102620000000000156e+00 -3.884375000000000000e+01 +1.102625000000000188e+00 -3.887500381469726562e+01 +1.102629999999999999e+00 -3.887500381469726562e+01 +1.102635000000000032e+00 -3.884375000000000000e+01 +1.102640000000000065e+00 -3.881250000000000000e+01 +1.102645000000000097e+00 -3.878125000000000000e+01 +1.102650000000000130e+00 -3.881250000000000000e+01 +1.102655000000000163e+00 -3.887500381469726562e+01 +1.102660000000000196e+00 -3.878125000000000000e+01 +1.102665000000000006e+00 -3.881250000000000000e+01 +1.102670000000000039e+00 -3.884375000000000000e+01 +1.102675000000000072e+00 -3.884375000000000000e+01 +1.102680000000000105e+00 -3.884375000000000000e+01 +1.102685000000000137e+00 -3.878125000000000000e+01 +1.102690000000000170e+00 -3.881250000000000000e+01 +1.102694999999999981e+00 -3.881250000000000000e+01 +1.102700000000000014e+00 -3.878125000000000000e+01 +1.102705000000000046e+00 -3.881250000000000000e+01 +1.102710000000000079e+00 -3.890625000000000000e+01 +1.102715000000000112e+00 -3.878125000000000000e+01 +1.102720000000000145e+00 -3.881250000000000000e+01 +1.102725000000000177e+00 -3.881250000000000000e+01 +1.102729999999999988e+00 -3.878125000000000000e+01 +1.102735000000000021e+00 -3.875000000000000000e+01 +1.102740000000000054e+00 -3.881250000000000000e+01 +1.102745000000000086e+00 -3.884375000000000000e+01 +1.102750000000000119e+00 -3.881250000000000000e+01 +1.102755000000000152e+00 -3.884375000000000000e+01 +1.102760000000000185e+00 -3.884375000000000000e+01 +1.102764999999999995e+00 -3.878125000000000000e+01 +1.102770000000000028e+00 -3.884375000000000000e+01 +1.102775000000000061e+00 -3.884375000000000000e+01 +1.102780000000000094e+00 -3.884375000000000000e+01 +1.102785000000000126e+00 -3.887500381469726562e+01 +1.102790000000000159e+00 -3.887500381469726562e+01 +1.102795000000000192e+00 -3.878125000000000000e+01 +1.102800000000000002e+00 -3.887500381469726562e+01 +1.102805000000000035e+00 -3.881250000000000000e+01 +1.102810000000000068e+00 -3.887500381469726562e+01 +1.102815000000000101e+00 -3.881250000000000000e+01 +1.102820000000000134e+00 -3.887500381469726562e+01 +1.102825000000000166e+00 -3.881250000000000000e+01 +1.102830000000000199e+00 -3.884375000000000000e+01 +1.102835000000000010e+00 -3.890625000000000000e+01 +1.102840000000000042e+00 -3.887500381469726562e+01 +1.102845000000000075e+00 -3.881250000000000000e+01 +1.102850000000000108e+00 -3.884375000000000000e+01 +1.102855000000000141e+00 -3.881250000000000000e+01 +1.102860000000000174e+00 -3.884375000000000000e+01 +1.102864999999999984e+00 -3.884375000000000000e+01 +1.102870000000000017e+00 -3.881250000000000000e+01 +1.102875000000000050e+00 -3.884375000000000000e+01 +1.102880000000000082e+00 -3.884375000000000000e+01 +1.102885000000000115e+00 -3.893750000000000000e+01 +1.102890000000000148e+00 -3.881250000000000000e+01 +1.102895000000000181e+00 -3.884375000000000000e+01 +1.102899999999999991e+00 -3.884375000000000000e+01 +1.102905000000000024e+00 -3.887500381469726562e+01 +1.102910000000000057e+00 -3.890625000000000000e+01 +1.102915000000000090e+00 -3.881250000000000000e+01 +1.102920000000000122e+00 -3.881250000000000000e+01 +1.102925000000000155e+00 -3.881250000000000000e+01 +1.102930000000000188e+00 -3.884375000000000000e+01 +1.102934999999999999e+00 -3.881250000000000000e+01 +1.102940000000000031e+00 -3.881250000000000000e+01 +1.102945000000000064e+00 -3.881250000000000000e+01 +1.102950000000000097e+00 -3.881250000000000000e+01 +1.102955000000000130e+00 -3.878125000000000000e+01 +1.102960000000000163e+00 -3.881250000000000000e+01 +1.102965000000000195e+00 -3.878125000000000000e+01 +1.102970000000000006e+00 -3.875000000000000000e+01 +1.102975000000000039e+00 -3.878125000000000000e+01 +1.102980000000000071e+00 -3.875000000000000000e+01 +1.102985000000000104e+00 -3.875000000000000000e+01 +1.102990000000000137e+00 -3.881250000000000000e+01 +1.102995000000000170e+00 -3.878125000000000000e+01 +1.102999999999999980e+00 -3.878125000000000000e+01 +1.103005000000000013e+00 -3.881250000000000000e+01 +1.103010000000000046e+00 -3.871875381469726562e+01 +1.103015000000000079e+00 -3.881250000000000000e+01 +1.103020000000000111e+00 -3.875000000000000000e+01 +1.103025000000000144e+00 -3.884375000000000000e+01 +1.103030000000000177e+00 -3.875000000000000000e+01 +1.103034999999999988e+00 -3.875000000000000000e+01 +1.103040000000000020e+00 -3.871875381469726562e+01 +1.103045000000000053e+00 -3.875000000000000000e+01 +1.103050000000000086e+00 -3.881250000000000000e+01 +1.103055000000000119e+00 -3.871875381469726562e+01 +1.103060000000000151e+00 -3.875000000000000000e+01 +1.103065000000000184e+00 -3.881250000000000000e+01 +1.103069999999999995e+00 -3.871875381469726562e+01 +1.103075000000000028e+00 -3.881250000000000000e+01 +1.103080000000000060e+00 -3.871875381469726562e+01 +1.103085000000000093e+00 -3.881250000000000000e+01 +1.103090000000000126e+00 -3.884375000000000000e+01 +1.103095000000000159e+00 -3.878125000000000000e+01 +1.103100000000000191e+00 -3.878125000000000000e+01 +1.103105000000000002e+00 -3.878125000000000000e+01 +1.103110000000000035e+00 -3.875000000000000000e+01 +1.103115000000000068e+00 -3.865625000000000000e+01 +1.103120000000000100e+00 -3.875000000000000000e+01 +1.103125000000000133e+00 -3.875000000000000000e+01 +1.103130000000000166e+00 -3.875000000000000000e+01 +1.103135000000000199e+00 -3.868750000000000000e+01 +1.103140000000000009e+00 -3.875000000000000000e+01 +1.103145000000000042e+00 -3.871875381469726562e+01 +1.103150000000000075e+00 -3.875000000000000000e+01 +1.103155000000000108e+00 -3.868750000000000000e+01 +1.103160000000000140e+00 -3.878125000000000000e+01 +1.103165000000000173e+00 -3.878125000000000000e+01 +1.103169999999999984e+00 -3.878125000000000000e+01 +1.103175000000000017e+00 -3.878125000000000000e+01 +1.103180000000000049e+00 -3.875000000000000000e+01 +1.103185000000000082e+00 -3.878125000000000000e+01 +1.103190000000000115e+00 -3.875000000000000000e+01 +1.103195000000000148e+00 -3.871875381469726562e+01 +1.103200000000000180e+00 -3.878125000000000000e+01 +1.103204999999999991e+00 -3.875000000000000000e+01 +1.103210000000000024e+00 -3.871875381469726562e+01 +1.103215000000000057e+00 -3.868750000000000000e+01 +1.103220000000000089e+00 -3.868750000000000000e+01 +1.103225000000000122e+00 -3.875000000000000000e+01 +1.103230000000000155e+00 -3.875000000000000000e+01 +1.103235000000000188e+00 -3.871875381469726562e+01 +1.103239999999999998e+00 -3.871875381469726562e+01 +1.103245000000000031e+00 -3.871875381469726562e+01 +1.103250000000000064e+00 -3.868750000000000000e+01 +1.103255000000000097e+00 -3.868750000000000000e+01 +1.103260000000000129e+00 -3.875000000000000000e+01 +1.103265000000000162e+00 -3.868750000000000000e+01 +1.103270000000000195e+00 -3.868750000000000000e+01 +1.103275000000000006e+00 -3.871875381469726562e+01 +1.103280000000000038e+00 -3.868750000000000000e+01 +1.103285000000000071e+00 -3.871875381469726562e+01 +1.103290000000000104e+00 -3.878125000000000000e+01 +1.103295000000000137e+00 -3.868750000000000000e+01 +1.103300000000000169e+00 -3.865625000000000000e+01 +1.103304999999999980e+00 -3.871875381469726562e+01 +1.103310000000000013e+00 -3.868750000000000000e+01 +1.103315000000000046e+00 -3.875000000000000000e+01 +1.103320000000000078e+00 -3.865625000000000000e+01 +1.103325000000000111e+00 -3.868750000000000000e+01 +1.103330000000000144e+00 -3.865625000000000000e+01 +1.103335000000000177e+00 -3.865625000000000000e+01 +1.103339999999999987e+00 -3.868750000000000000e+01 +1.103345000000000020e+00 -3.862500000000000000e+01 +1.103350000000000053e+00 -3.868750000000000000e+01 +1.103355000000000086e+00 -3.871875381469726562e+01 +1.103360000000000118e+00 -3.865625000000000000e+01 +1.103365000000000151e+00 -3.868750000000000000e+01 +1.103370000000000184e+00 -3.875000000000000000e+01 +1.103374999999999995e+00 -3.865625000000000000e+01 +1.103380000000000027e+00 -3.865625000000000000e+01 +1.103385000000000060e+00 -3.865625000000000000e+01 +1.103390000000000093e+00 -3.868750000000000000e+01 +1.103395000000000126e+00 -3.868750000000000000e+01 +1.103400000000000158e+00 -3.868750000000000000e+01 +1.103405000000000191e+00 -3.862500000000000000e+01 +1.103410000000000002e+00 -3.868750000000000000e+01 +1.103415000000000035e+00 -3.871875381469726562e+01 +1.103420000000000067e+00 -3.862500000000000000e+01 +1.103425000000000100e+00 -3.865625000000000000e+01 +1.103430000000000133e+00 -3.865625000000000000e+01 +1.103435000000000166e+00 -3.868750000000000000e+01 +1.103440000000000198e+00 -3.862500000000000000e+01 +1.103445000000000009e+00 -3.865625000000000000e+01 +1.103450000000000042e+00 -3.865625000000000000e+01 +1.103455000000000075e+00 -3.862500000000000000e+01 +1.103460000000000107e+00 -3.862500000000000000e+01 +1.103465000000000140e+00 -3.862500000000000000e+01 +1.103470000000000173e+00 -3.862500000000000000e+01 +1.103474999999999984e+00 -3.856250381469726562e+01 +1.103480000000000016e+00 -3.853125000000000000e+01 +1.103485000000000049e+00 -3.862500000000000000e+01 +1.103490000000000082e+00 -3.859375000000000000e+01 +1.103495000000000115e+00 -3.862500000000000000e+01 +1.103500000000000147e+00 -3.862500000000000000e+01 +1.103505000000000180e+00 -3.853125000000000000e+01 +1.103509999999999991e+00 -3.862500000000000000e+01 +1.103515000000000024e+00 -3.865625000000000000e+01 +1.103520000000000056e+00 -3.850000000000000000e+01 +1.103525000000000089e+00 -3.865625000000000000e+01 +1.103530000000000122e+00 -3.859375000000000000e+01 +1.103535000000000155e+00 -3.856250381469726562e+01 +1.103540000000000187e+00 -3.856250381469726562e+01 +1.103544999999999998e+00 -3.859375000000000000e+01 +1.103550000000000031e+00 -3.853125000000000000e+01 +1.103555000000000064e+00 -3.859375000000000000e+01 +1.103560000000000096e+00 -3.859375000000000000e+01 +1.103565000000000129e+00 -3.859375000000000000e+01 +1.103570000000000162e+00 -3.856250381469726562e+01 +1.103575000000000195e+00 -3.853125000000000000e+01 +1.103580000000000005e+00 -3.856250381469726562e+01 +1.103585000000000038e+00 -3.853125000000000000e+01 +1.103590000000000071e+00 -3.859375000000000000e+01 +1.103595000000000104e+00 -3.859375000000000000e+01 +1.103600000000000136e+00 -3.856250381469726562e+01 +1.103605000000000169e+00 -3.856250381469726562e+01 +1.103609999999999980e+00 -3.853125000000000000e+01 +1.103615000000000013e+00 -3.862500000000000000e+01 +1.103620000000000045e+00 -3.859375000000000000e+01 +1.103625000000000078e+00 -3.856250381469726562e+01 +1.103630000000000111e+00 -3.853125000000000000e+01 +1.103635000000000144e+00 -3.862500000000000000e+01 +1.103640000000000176e+00 -3.865625000000000000e+01 +1.103644999999999987e+00 -3.862500000000000000e+01 +1.103650000000000020e+00 -3.856250381469726562e+01 +1.103655000000000053e+00 -3.862500000000000000e+01 +1.103660000000000085e+00 -3.859375000000000000e+01 +1.103665000000000118e+00 -3.862500000000000000e+01 +1.103670000000000151e+00 -3.859375000000000000e+01 +1.103675000000000184e+00 -3.859375000000000000e+01 +1.103679999999999994e+00 -3.853125000000000000e+01 +1.103685000000000027e+00 -3.856250381469726562e+01 +1.103690000000000060e+00 -3.859375000000000000e+01 +1.103695000000000093e+00 -3.862500000000000000e+01 +1.103700000000000125e+00 -3.859375000000000000e+01 +1.103705000000000158e+00 -3.856250381469726562e+01 +1.103710000000000191e+00 -3.862500000000000000e+01 +1.103715000000000002e+00 -3.856250381469726562e+01 +1.103720000000000034e+00 -3.853125000000000000e+01 +1.103725000000000067e+00 -3.856250381469726562e+01 +1.103730000000000100e+00 -3.853125000000000000e+01 +1.103735000000000133e+00 -3.856250381469726562e+01 +1.103740000000000165e+00 -3.853125000000000000e+01 +1.103745000000000198e+00 -3.859375000000000000e+01 +1.103750000000000009e+00 -3.865625000000000000e+01 +1.103755000000000042e+00 -3.859375000000000000e+01 +1.103760000000000074e+00 -3.859375000000000000e+01 +1.103765000000000107e+00 -3.856250381469726562e+01 +1.103770000000000140e+00 -3.856250381469726562e+01 +1.103775000000000173e+00 -3.856250381469726562e+01 +1.103779999999999983e+00 -3.859375000000000000e+01 +1.103785000000000016e+00 -3.850000000000000000e+01 +1.103790000000000049e+00 -3.850000000000000000e+01 +1.103795000000000082e+00 -3.856250381469726562e+01 +1.103800000000000114e+00 -3.856250381469726562e+01 +1.103805000000000147e+00 -3.850000000000000000e+01 +1.103810000000000180e+00 -3.853125000000000000e+01 +1.103814999999999991e+00 -3.856250381469726562e+01 +1.103820000000000023e+00 -3.850000000000000000e+01 +1.103825000000000056e+00 -3.853125000000000000e+01 +1.103830000000000089e+00 -3.853125000000000000e+01 +1.103835000000000122e+00 -3.853125000000000000e+01 +1.103840000000000154e+00 -3.853125000000000000e+01 +1.103845000000000187e+00 -3.853125000000000000e+01 +1.103849999999999998e+00 -3.853125000000000000e+01 +1.103855000000000031e+00 -3.850000000000000000e+01 +1.103860000000000063e+00 -3.850000000000000000e+01 +1.103865000000000096e+00 -3.846875381469726562e+01 +1.103870000000000129e+00 -3.850000000000000000e+01 +1.103875000000000162e+00 -3.853125000000000000e+01 +1.103880000000000194e+00 -3.850000000000000000e+01 +1.103885000000000005e+00 -3.853125000000000000e+01 +1.103890000000000038e+00 -3.853125000000000000e+01 +1.103895000000000071e+00 -3.850000000000000000e+01 +1.103900000000000103e+00 -3.846875381469726562e+01 +1.103905000000000136e+00 -3.846875381469726562e+01 +1.103910000000000169e+00 -3.850000000000000000e+01 +1.103914999999999980e+00 -3.846875381469726562e+01 +1.103920000000000012e+00 -3.850000000000000000e+01 +1.103925000000000045e+00 -3.850000000000000000e+01 +1.103930000000000078e+00 -3.850000000000000000e+01 +1.103935000000000111e+00 -3.846875381469726562e+01 +1.103940000000000143e+00 -3.846875381469726562e+01 +1.103945000000000176e+00 -3.850000000000000000e+01 +1.103949999999999987e+00 -3.850000000000000000e+01 +1.103955000000000020e+00 -3.846875381469726562e+01 +1.103960000000000052e+00 -3.850000000000000000e+01 +1.103965000000000085e+00 -3.846875381469726562e+01 +1.103970000000000118e+00 -3.843750000000000000e+01 +1.103975000000000151e+00 -3.853125000000000000e+01 +1.103980000000000183e+00 -3.843750000000000000e+01 +1.103984999999999994e+00 -3.850000000000000000e+01 +1.103990000000000027e+00 -3.850000000000000000e+01 +1.103995000000000060e+00 -3.856250381469726562e+01 +1.104000000000000092e+00 -3.850000000000000000e+01 +1.104005000000000125e+00 -3.850000000000000000e+01 +1.104010000000000158e+00 -3.853125000000000000e+01 +1.104015000000000191e+00 -3.846875381469726562e+01 +1.104020000000000001e+00 -3.850000000000000000e+01 +1.104025000000000034e+00 -3.850000000000000000e+01 +1.104030000000000067e+00 -3.846875381469726562e+01 +1.104035000000000100e+00 -3.853125000000000000e+01 +1.104040000000000132e+00 -3.840625000000000000e+01 +1.104045000000000165e+00 -3.850000000000000000e+01 +1.104050000000000198e+00 -3.843750000000000000e+01 +1.104055000000000009e+00 -3.853125000000000000e+01 +1.104060000000000041e+00 -3.846875381469726562e+01 +1.104065000000000074e+00 -3.840625000000000000e+01 +1.104070000000000107e+00 -3.843750000000000000e+01 +1.104075000000000140e+00 -3.846875381469726562e+01 +1.104080000000000172e+00 -3.846875381469726562e+01 +1.104084999999999983e+00 -3.843750000000000000e+01 +1.104090000000000016e+00 -3.840625000000000000e+01 +1.104095000000000049e+00 -3.846875381469726562e+01 +1.104100000000000081e+00 -3.846875381469726562e+01 +1.104105000000000114e+00 -3.843750000000000000e+01 +1.104110000000000147e+00 -3.840625000000000000e+01 +1.104115000000000180e+00 -3.840625000000000000e+01 +1.104119999999999990e+00 -3.846875381469726562e+01 +1.104125000000000023e+00 -3.850000000000000000e+01 +1.104130000000000056e+00 -3.843750000000000000e+01 +1.104135000000000089e+00 -3.850000000000000000e+01 +1.104140000000000121e+00 -3.834375000000000000e+01 +1.104145000000000154e+00 -3.840625000000000000e+01 +1.104150000000000187e+00 -3.843750000000000000e+01 +1.104154999999999998e+00 -3.840625000000000000e+01 +1.104160000000000030e+00 -3.840625000000000000e+01 +1.104165000000000063e+00 -3.840625000000000000e+01 +1.104170000000000096e+00 -3.843750000000000000e+01 +1.104175000000000129e+00 -3.843750000000000000e+01 +1.104180000000000161e+00 -3.843750000000000000e+01 +1.104185000000000194e+00 -3.837500000000000000e+01 +1.104190000000000005e+00 -3.846875381469726562e+01 +1.104195000000000038e+00 -3.840625000000000000e+01 +1.104200000000000070e+00 -3.840625000000000000e+01 +1.104205000000000103e+00 -3.840625000000000000e+01 +1.104210000000000136e+00 -3.843750000000000000e+01 +1.104215000000000169e+00 -3.843750000000000000e+01 +1.104219999999999979e+00 -3.837500000000000000e+01 +1.104225000000000012e+00 -3.837500000000000000e+01 +1.104230000000000045e+00 -3.843750000000000000e+01 +1.104235000000000078e+00 -3.834375000000000000e+01 +1.104240000000000110e+00 -3.834375000000000000e+01 +1.104245000000000143e+00 -3.843750000000000000e+01 +1.104250000000000176e+00 -3.840625000000000000e+01 +1.104254999999999987e+00 -3.843750000000000000e+01 +1.104260000000000019e+00 -3.837500000000000000e+01 +1.104265000000000052e+00 -3.837500000000000000e+01 +1.104270000000000085e+00 -3.837500000000000000e+01 +1.104275000000000118e+00 -3.840625000000000000e+01 +1.104280000000000150e+00 -3.840625000000000000e+01 +1.104285000000000183e+00 -3.834375000000000000e+01 +1.104289999999999994e+00 -3.837500000000000000e+01 +1.104295000000000027e+00 -3.837500000000000000e+01 +1.104300000000000059e+00 -3.843750000000000000e+01 +1.104305000000000092e+00 -3.834375000000000000e+01 +1.104310000000000125e+00 -3.834375000000000000e+01 +1.104315000000000158e+00 -3.840625000000000000e+01 +1.104320000000000190e+00 -3.840625000000000000e+01 +1.104325000000000001e+00 -3.834375000000000000e+01 +1.104330000000000034e+00 -3.837500000000000000e+01 +1.104335000000000067e+00 -3.834375000000000000e+01 +1.104340000000000099e+00 -3.837500000000000000e+01 +1.104345000000000132e+00 -3.834375000000000000e+01 +1.104350000000000165e+00 -3.834375000000000000e+01 +1.104355000000000198e+00 -3.834375000000000000e+01 +1.104360000000000008e+00 -3.837500000000000000e+01 +1.104365000000000041e+00 -3.837500000000000000e+01 +1.104370000000000074e+00 -3.837500000000000000e+01 +1.104375000000000107e+00 -3.834375000000000000e+01 +1.104380000000000139e+00 -3.831250381469726562e+01 +1.104385000000000172e+00 -3.828125000000000000e+01 +1.104389999999999983e+00 -3.828125000000000000e+01 +1.104395000000000016e+00 -3.828125000000000000e+01 +1.104400000000000048e+00 -3.834375000000000000e+01 +1.104405000000000081e+00 -3.834375000000000000e+01 +1.104410000000000114e+00 -3.828125000000000000e+01 +1.104415000000000147e+00 -3.831250381469726562e+01 +1.104420000000000179e+00 -3.831250381469726562e+01 +1.104424999999999990e+00 -3.828125000000000000e+01 +1.104430000000000023e+00 -3.828125000000000000e+01 +1.104435000000000056e+00 -3.828125000000000000e+01 +1.104440000000000088e+00 -3.828125000000000000e+01 +1.104445000000000121e+00 -3.828125000000000000e+01 +1.104450000000000154e+00 -3.834375000000000000e+01 +1.104455000000000187e+00 -3.831250381469726562e+01 +1.104459999999999997e+00 -3.831250381469726562e+01 +1.104465000000000030e+00 -3.825000000000000000e+01 +1.104470000000000063e+00 -3.828125000000000000e+01 +1.104475000000000096e+00 -3.834375000000000000e+01 +1.104480000000000128e+00 -3.821875000000000000e+01 +1.104485000000000161e+00 -3.828125000000000000e+01 +1.104490000000000194e+00 -3.825000000000000000e+01 +1.104495000000000005e+00 -3.828125000000000000e+01 +1.104500000000000037e+00 -3.828125000000000000e+01 +1.104505000000000070e+00 -3.831250381469726562e+01 +1.104510000000000103e+00 -3.828125000000000000e+01 +1.104515000000000136e+00 -3.831250381469726562e+01 +1.104520000000000168e+00 -3.825000000000000000e+01 +1.104525000000000201e+00 -3.834375000000000000e+01 +1.104530000000000012e+00 -3.831250381469726562e+01 +1.104535000000000045e+00 -3.831250381469726562e+01 +1.104540000000000077e+00 -3.828125000000000000e+01 +1.104545000000000110e+00 -3.828125000000000000e+01 +1.104550000000000143e+00 -3.825000000000000000e+01 +1.104555000000000176e+00 -3.831250381469726562e+01 +1.104559999999999986e+00 -3.828125000000000000e+01 +1.104565000000000019e+00 -3.828125000000000000e+01 +1.104570000000000052e+00 -3.831250381469726562e+01 +1.104575000000000085e+00 -3.828125000000000000e+01 +1.104580000000000117e+00 -3.831250381469726562e+01 +1.104585000000000150e+00 -3.828125000000000000e+01 +1.104590000000000183e+00 -3.831250381469726562e+01 +1.104594999999999994e+00 -3.831250381469726562e+01 +1.104600000000000026e+00 -3.828125000000000000e+01 +1.104605000000000059e+00 -3.828125000000000000e+01 +1.104610000000000092e+00 -3.828125000000000000e+01 +1.104615000000000125e+00 -3.825000000000000000e+01 +1.104620000000000157e+00 -3.828125000000000000e+01 +1.104625000000000190e+00 -3.828125000000000000e+01 +1.104630000000000001e+00 -3.831250381469726562e+01 +1.104635000000000034e+00 -3.828125000000000000e+01 +1.104640000000000066e+00 -3.825000000000000000e+01 +1.104645000000000099e+00 -3.828125000000000000e+01 +1.104650000000000132e+00 -3.828125000000000000e+01 +1.104655000000000165e+00 -3.825000000000000000e+01 +1.104660000000000197e+00 -3.825000000000000000e+01 +1.104665000000000008e+00 -3.828125000000000000e+01 +1.104670000000000041e+00 -3.831250381469726562e+01 +1.104675000000000074e+00 -3.828125000000000000e+01 +1.104680000000000106e+00 -3.831250381469726562e+01 +1.104685000000000139e+00 -3.828125000000000000e+01 +1.104690000000000172e+00 -3.818750000000000000e+01 +1.104694999999999983e+00 -3.825000000000000000e+01 +1.104700000000000015e+00 -3.828125000000000000e+01 +1.104705000000000048e+00 -3.828125000000000000e+01 +1.104710000000000081e+00 -3.828125000000000000e+01 +1.104715000000000114e+00 -3.828125000000000000e+01 +1.104720000000000146e+00 -3.831250381469726562e+01 +1.104725000000000179e+00 -3.828125000000000000e+01 +1.104729999999999990e+00 -3.828125000000000000e+01 +1.104735000000000023e+00 -3.828125000000000000e+01 +1.104740000000000055e+00 -3.821875000000000000e+01 +1.104745000000000088e+00 -3.828125000000000000e+01 +1.104750000000000121e+00 -3.825000000000000000e+01 +1.104755000000000154e+00 -3.831250381469726562e+01 +1.104760000000000186e+00 -3.828125000000000000e+01 +1.104764999999999997e+00 -3.818750000000000000e+01 +1.104770000000000030e+00 -3.828125000000000000e+01 +1.104775000000000063e+00 -3.828125000000000000e+01 +1.104780000000000095e+00 -3.825000000000000000e+01 +1.104785000000000128e+00 -3.821875000000000000e+01 +1.104790000000000161e+00 -3.825000000000000000e+01 +1.104795000000000194e+00 -3.828125000000000000e+01 +1.104800000000000004e+00 -3.821875000000000000e+01 +1.104805000000000037e+00 -3.828125000000000000e+01 +1.104810000000000070e+00 -3.818750000000000000e+01 +1.104815000000000103e+00 -3.818750000000000000e+01 +1.104820000000000135e+00 -3.828125000000000000e+01 +1.104825000000000168e+00 -3.821875000000000000e+01 +1.104830000000000201e+00 -3.821875000000000000e+01 +1.104835000000000012e+00 -3.821875000000000000e+01 +1.104840000000000044e+00 -3.815625381469726562e+01 +1.104845000000000077e+00 -3.815625381469726562e+01 +1.104850000000000110e+00 -3.818750000000000000e+01 +1.104855000000000143e+00 -3.818750000000000000e+01 +1.104860000000000175e+00 -3.815625381469726562e+01 +1.104864999999999986e+00 -3.809375000000000000e+01 +1.104870000000000019e+00 -3.815625381469726562e+01 +1.104875000000000052e+00 -3.818750000000000000e+01 +1.104880000000000084e+00 -3.812500000000000000e+01 +1.104885000000000117e+00 -3.815625381469726562e+01 +1.104890000000000150e+00 -3.815625381469726562e+01 +1.104895000000000183e+00 -3.815625381469726562e+01 +1.104899999999999993e+00 -3.815625381469726562e+01 +1.104905000000000026e+00 -3.809375000000000000e+01 +1.104910000000000059e+00 -3.818750000000000000e+01 +1.104915000000000092e+00 -3.815625381469726562e+01 +1.104920000000000124e+00 -3.815625381469726562e+01 +1.104925000000000157e+00 -3.818750000000000000e+01 +1.104930000000000190e+00 -3.815625381469726562e+01 +1.104935000000000000e+00 -3.818750000000000000e+01 +1.104940000000000033e+00 -3.818750000000000000e+01 +1.104945000000000066e+00 -3.818750000000000000e+01 +1.104950000000000099e+00 -3.815625381469726562e+01 +1.104955000000000132e+00 -3.815625381469726562e+01 +1.104960000000000164e+00 -3.815625381469726562e+01 +1.104965000000000197e+00 -3.818750000000000000e+01 +1.104970000000000008e+00 -3.812500000000000000e+01 +1.104975000000000041e+00 -3.812500000000000000e+01 +1.104980000000000073e+00 -3.815625381469726562e+01 +1.104985000000000106e+00 -3.815625381469726562e+01 +1.104990000000000139e+00 -3.818750000000000000e+01 +1.104995000000000172e+00 -3.815625381469726562e+01 +1.104999999999999982e+00 -3.815625381469726562e+01 +1.105005000000000015e+00 -3.812500000000000000e+01 +1.105010000000000048e+00 -3.815625381469726562e+01 +1.105015000000000081e+00 -3.815625381469726562e+01 +1.105020000000000113e+00 -3.812500000000000000e+01 +1.105025000000000146e+00 -3.812500000000000000e+01 +1.105030000000000179e+00 -3.812500000000000000e+01 +1.105034999999999989e+00 -3.818750000000000000e+01 +1.105040000000000022e+00 -3.815625381469726562e+01 +1.105045000000000055e+00 -3.818750000000000000e+01 +1.105050000000000088e+00 -3.815625381469726562e+01 +1.105055000000000121e+00 -3.812500000000000000e+01 +1.105060000000000153e+00 -3.815625381469726562e+01 +1.105065000000000186e+00 -3.812500000000000000e+01 +1.105069999999999997e+00 -3.815625381469726562e+01 +1.105075000000000029e+00 -3.812500000000000000e+01 +1.105080000000000062e+00 -3.812500000000000000e+01 +1.105085000000000095e+00 -3.815625381469726562e+01 +1.105090000000000128e+00 -3.809375000000000000e+01 +1.105095000000000161e+00 -3.815625381469726562e+01 +1.105100000000000193e+00 -3.809375000000000000e+01 +1.105105000000000004e+00 -3.812500000000000000e+01 +1.105110000000000037e+00 -3.815625381469726562e+01 +1.105115000000000069e+00 -3.815625381469726562e+01 +1.105120000000000102e+00 -3.815625381469726562e+01 +1.105125000000000135e+00 -3.809375000000000000e+01 +1.105130000000000168e+00 -3.812500000000000000e+01 +1.105135000000000201e+00 -3.812500000000000000e+01 +1.105140000000000011e+00 -3.806250000000000000e+01 +1.105145000000000044e+00 -3.809375000000000000e+01 +1.105150000000000077e+00 -3.815625381469726562e+01 +1.105155000000000109e+00 -3.815625381469726562e+01 +1.105160000000000142e+00 -3.812500000000000000e+01 +1.105165000000000175e+00 -3.809375000000000000e+01 +1.105169999999999986e+00 -3.806250000000000000e+01 +1.105175000000000018e+00 -3.809375000000000000e+01 +1.105180000000000051e+00 -3.812500000000000000e+01 +1.105185000000000084e+00 -3.809375000000000000e+01 +1.105190000000000117e+00 -3.806250000000000000e+01 +1.105195000000000149e+00 -3.809375000000000000e+01 +1.105200000000000182e+00 -3.806250000000000000e+01 +1.105204999999999993e+00 -3.806250000000000000e+01 +1.105210000000000026e+00 -3.815625381469726562e+01 +1.105215000000000058e+00 -3.806250000000000000e+01 +1.105220000000000091e+00 -3.809375000000000000e+01 +1.105225000000000124e+00 -3.809375000000000000e+01 +1.105230000000000157e+00 -3.806250000000000000e+01 +1.105235000000000190e+00 -3.806250000000000000e+01 +1.105240000000000000e+00 -3.803125000000000000e+01 +1.105245000000000033e+00 -3.806250000000000000e+01 +1.105250000000000066e+00 -3.809375000000000000e+01 +1.105255000000000098e+00 -3.806250000000000000e+01 +1.105260000000000131e+00 -3.809375000000000000e+01 +1.105265000000000164e+00 -3.812500000000000000e+01 +1.105270000000000197e+00 -3.812500000000000000e+01 +1.105275000000000007e+00 -3.806250000000000000e+01 +1.105280000000000040e+00 -3.809375000000000000e+01 +1.105285000000000073e+00 -3.809375000000000000e+01 +1.105290000000000106e+00 -3.809375000000000000e+01 +1.105295000000000138e+00 -3.806250000000000000e+01 +1.105300000000000171e+00 -3.809375000000000000e+01 +1.105304999999999982e+00 -3.809375000000000000e+01 +1.105310000000000015e+00 -3.803125000000000000e+01 +1.105315000000000047e+00 -3.806250000000000000e+01 +1.105320000000000080e+00 -3.803125000000000000e+01 +1.105325000000000113e+00 -3.809375000000000000e+01 +1.105330000000000146e+00 -3.806250000000000000e+01 +1.105335000000000178e+00 -3.809375000000000000e+01 +1.105339999999999989e+00 -3.809375000000000000e+01 +1.105345000000000022e+00 -3.809375000000000000e+01 +1.105350000000000055e+00 -3.806250000000000000e+01 +1.105355000000000087e+00 -3.809375000000000000e+01 +1.105360000000000120e+00 -3.803125000000000000e+01 +1.105365000000000153e+00 -3.809375000000000000e+01 +1.105370000000000186e+00 -3.806250000000000000e+01 +1.105374999999999996e+00 -3.809375000000000000e+01 +1.105380000000000029e+00 -3.803125000000000000e+01 +1.105385000000000062e+00 -3.812500000000000000e+01 +1.105390000000000095e+00 -3.809375000000000000e+01 +1.105395000000000127e+00 -3.812500000000000000e+01 +1.105400000000000160e+00 -3.806250000000000000e+01 +1.105405000000000193e+00 -3.812500000000000000e+01 +1.105410000000000004e+00 -3.809375000000000000e+01 +1.105415000000000036e+00 -3.812500000000000000e+01 +1.105420000000000069e+00 -3.809375000000000000e+01 +1.105425000000000102e+00 -3.806250000000000000e+01 +1.105430000000000135e+00 -3.806250000000000000e+01 +1.105435000000000167e+00 -3.809375000000000000e+01 +1.105440000000000200e+00 -3.803125000000000000e+01 +1.105445000000000011e+00 -3.806250000000000000e+01 +1.105450000000000044e+00 -3.812500000000000000e+01 +1.105455000000000076e+00 -3.815625381469726562e+01 +1.105460000000000109e+00 -3.809375000000000000e+01 +1.105465000000000142e+00 -3.809375000000000000e+01 +1.105470000000000175e+00 -3.812500000000000000e+01 +1.105474999999999985e+00 -3.812500000000000000e+01 +1.105480000000000018e+00 -3.815625381469726562e+01 +1.105485000000000051e+00 -3.809375000000000000e+01 +1.105490000000000084e+00 -3.809375000000000000e+01 +1.105495000000000116e+00 -3.803125000000000000e+01 +1.105500000000000149e+00 -3.812500000000000000e+01 +1.105505000000000182e+00 -3.809375000000000000e+01 +1.105509999999999993e+00 -3.809375000000000000e+01 +1.105515000000000025e+00 -3.803125000000000000e+01 +1.105520000000000058e+00 -3.803125000000000000e+01 +1.105525000000000091e+00 -3.803125000000000000e+01 +1.105530000000000124e+00 -3.803125000000000000e+01 +1.105535000000000156e+00 -3.809375000000000000e+01 +1.105540000000000189e+00 -3.809375000000000000e+01 +1.105545000000000000e+00 -3.809375000000000000e+01 +1.105550000000000033e+00 -3.806250000000000000e+01 +1.105555000000000065e+00 -3.806250000000000000e+01 +1.105560000000000098e+00 -3.806250000000000000e+01 +1.105565000000000131e+00 -3.803125000000000000e+01 +1.105570000000000164e+00 -3.803125000000000000e+01 +1.105575000000000196e+00 -3.803125000000000000e+01 +1.105580000000000007e+00 -3.809375000000000000e+01 +1.105585000000000040e+00 -3.806250000000000000e+01 +1.105590000000000073e+00 -3.803125000000000000e+01 +1.105595000000000105e+00 -3.803125000000000000e+01 +1.105600000000000138e+00 -3.806250000000000000e+01 +1.105605000000000171e+00 -3.803125000000000000e+01 +1.105609999999999982e+00 -3.803125000000000000e+01 +1.105615000000000014e+00 -3.806250000000000000e+01 +1.105620000000000047e+00 -3.809375000000000000e+01 +1.105625000000000080e+00 -3.809375000000000000e+01 +1.105630000000000113e+00 -3.806250000000000000e+01 +1.105635000000000145e+00 -3.809375000000000000e+01 +1.105640000000000178e+00 -3.806250000000000000e+01 +1.105644999999999989e+00 -3.803125000000000000e+01 +1.105650000000000022e+00 -3.806250000000000000e+01 +1.105655000000000054e+00 -3.809375000000000000e+01 +1.105660000000000087e+00 -3.806250000000000000e+01 +1.105665000000000120e+00 -3.806250000000000000e+01 +1.105670000000000153e+00 -3.803125000000000000e+01 +1.105675000000000185e+00 -3.803125000000000000e+01 +1.105679999999999996e+00 -3.803125000000000000e+01 +1.105685000000000029e+00 -3.809375000000000000e+01 +1.105690000000000062e+00 -3.800000381469726562e+01 +1.105695000000000094e+00 -3.806250000000000000e+01 +1.105700000000000127e+00 -3.809375000000000000e+01 +1.105705000000000160e+00 -3.803125000000000000e+01 +1.105710000000000193e+00 -3.806250000000000000e+01 +1.105715000000000003e+00 -3.809375000000000000e+01 +1.105720000000000036e+00 -3.803125000000000000e+01 +1.105725000000000069e+00 -3.803125000000000000e+01 +1.105730000000000102e+00 -3.803125000000000000e+01 +1.105735000000000134e+00 -3.806250000000000000e+01 +1.105740000000000167e+00 -3.803125000000000000e+01 +1.105745000000000200e+00 -3.806250000000000000e+01 +1.105750000000000011e+00 -3.803125000000000000e+01 +1.105755000000000043e+00 -3.806250000000000000e+01 +1.105760000000000076e+00 -3.803125000000000000e+01 +1.105765000000000109e+00 -3.803125000000000000e+01 +1.105770000000000142e+00 -3.803125000000000000e+01 +1.105775000000000174e+00 -3.803125000000000000e+01 +1.105779999999999985e+00 -3.803125000000000000e+01 +1.105785000000000018e+00 -3.800000381469726562e+01 +1.105790000000000051e+00 -3.800000381469726562e+01 +1.105795000000000083e+00 -3.800000381469726562e+01 +1.105800000000000116e+00 -3.796875000000000000e+01 +1.105805000000000149e+00 -3.803125000000000000e+01 +1.105810000000000182e+00 -3.800000381469726562e+01 +1.105814999999999992e+00 -3.803125000000000000e+01 +1.105820000000000025e+00 -3.803125000000000000e+01 +1.105825000000000058e+00 -3.800000381469726562e+01 +1.105830000000000091e+00 -3.793750000000000000e+01 +1.105835000000000123e+00 -3.793750000000000000e+01 +1.105840000000000156e+00 -3.800000381469726562e+01 +1.105845000000000189e+00 -3.796875000000000000e+01 +1.105850000000000000e+00 -3.800000381469726562e+01 +1.105855000000000032e+00 -3.796875000000000000e+01 +1.105860000000000065e+00 -3.796875000000000000e+01 +1.105865000000000098e+00 -3.793750000000000000e+01 +1.105870000000000131e+00 -3.800000381469726562e+01 +1.105875000000000163e+00 -3.800000381469726562e+01 +1.105880000000000196e+00 -3.796875000000000000e+01 +1.105885000000000007e+00 -3.796875000000000000e+01 +1.105890000000000040e+00 -3.796875000000000000e+01 +1.105895000000000072e+00 -3.796875000000000000e+01 +1.105900000000000105e+00 -3.800000381469726562e+01 +1.105905000000000138e+00 -3.803125000000000000e+01 +1.105910000000000171e+00 -3.796875000000000000e+01 +1.105914999999999981e+00 -3.803125000000000000e+01 +1.105920000000000014e+00 -3.800000381469726562e+01 +1.105925000000000047e+00 -3.796875000000000000e+01 +1.105930000000000080e+00 -3.803125000000000000e+01 +1.105935000000000112e+00 -3.803125000000000000e+01 +1.105940000000000145e+00 -3.793750000000000000e+01 +1.105945000000000178e+00 -3.793750000000000000e+01 +1.105949999999999989e+00 -3.800000381469726562e+01 +1.105955000000000021e+00 -3.796875000000000000e+01 +1.105960000000000054e+00 -3.803125000000000000e+01 +1.105965000000000087e+00 -3.796875000000000000e+01 +1.105970000000000120e+00 -3.793750000000000000e+01 +1.105975000000000152e+00 -3.793750000000000000e+01 +1.105980000000000185e+00 -3.796875000000000000e+01 +1.105984999999999996e+00 -3.800000381469726562e+01 +1.105990000000000029e+00 -3.803125000000000000e+01 +1.105995000000000061e+00 -3.796875000000000000e+01 +1.106000000000000094e+00 -3.796875000000000000e+01 +1.106005000000000127e+00 -3.796875000000000000e+01 +1.106010000000000160e+00 -3.796875000000000000e+01 +1.106015000000000192e+00 -3.793750000000000000e+01 +1.106020000000000003e+00 -3.800000381469726562e+01 +1.106025000000000036e+00 -3.800000381469726562e+01 +1.106030000000000069e+00 -3.800000381469726562e+01 +1.106035000000000101e+00 -3.800000381469726562e+01 +1.106040000000000134e+00 -3.796875000000000000e+01 +1.106045000000000167e+00 -3.803125000000000000e+01 +1.106050000000000200e+00 -3.803125000000000000e+01 +1.106055000000000010e+00 -3.793750000000000000e+01 +1.106060000000000043e+00 -3.803125000000000000e+01 +1.106065000000000076e+00 -3.800000381469726562e+01 +1.106070000000000109e+00 -3.796875000000000000e+01 +1.106075000000000141e+00 -3.800000381469726562e+01 +1.106080000000000174e+00 -3.803125000000000000e+01 +1.106084999999999985e+00 -3.800000381469726562e+01 +1.106090000000000018e+00 -3.800000381469726562e+01 +1.106095000000000050e+00 -3.800000381469726562e+01 +1.106100000000000083e+00 -3.803125000000000000e+01 +1.106105000000000116e+00 -3.796875000000000000e+01 +1.106110000000000149e+00 -3.793750000000000000e+01 +1.106115000000000181e+00 -3.796875000000000000e+01 +1.106119999999999992e+00 -3.796875000000000000e+01 +1.106125000000000025e+00 -3.790625000000000000e+01 +1.106130000000000058e+00 -3.796875000000000000e+01 +1.106135000000000090e+00 -3.793750000000000000e+01 +1.106140000000000123e+00 -3.796875000000000000e+01 +1.106145000000000156e+00 -3.790625000000000000e+01 +1.106150000000000189e+00 -3.796875000000000000e+01 +1.106154999999999999e+00 -3.790625000000000000e+01 +1.106160000000000032e+00 -3.793750000000000000e+01 +1.106165000000000065e+00 -3.793750000000000000e+01 +1.106170000000000098e+00 -3.790625000000000000e+01 +1.106175000000000130e+00 -3.790625000000000000e+01 +1.106180000000000163e+00 -3.790625000000000000e+01 +1.106185000000000196e+00 -3.787500000000000000e+01 +1.106190000000000007e+00 -3.793750000000000000e+01 +1.106195000000000039e+00 -3.793750000000000000e+01 +1.106200000000000072e+00 -3.793750000000000000e+01 +1.106205000000000105e+00 -3.793750000000000000e+01 +1.106210000000000138e+00 -3.793750000000000000e+01 +1.106215000000000170e+00 -3.790625000000000000e+01 +1.106219999999999981e+00 -3.790625000000000000e+01 +1.106225000000000014e+00 -3.784375381469726562e+01 +1.106230000000000047e+00 -3.790625000000000000e+01 +1.106235000000000079e+00 -3.790625000000000000e+01 +1.106240000000000112e+00 -3.796875000000000000e+01 +1.106245000000000145e+00 -3.787500000000000000e+01 +1.106250000000000178e+00 -3.787500000000000000e+01 +1.106254999999999988e+00 -3.790625000000000000e+01 +1.106260000000000021e+00 -3.790625000000000000e+01 +1.106265000000000054e+00 -3.790625000000000000e+01 +1.106270000000000087e+00 -3.787500000000000000e+01 +1.106275000000000119e+00 -3.790625000000000000e+01 +1.106280000000000152e+00 -3.787500000000000000e+01 +1.106285000000000185e+00 -3.790625000000000000e+01 +1.106289999999999996e+00 -3.784375381469726562e+01 +1.106295000000000028e+00 -3.790625000000000000e+01 +1.106300000000000061e+00 -3.790625000000000000e+01 +1.106305000000000094e+00 -3.787500000000000000e+01 +1.106310000000000127e+00 -3.784375381469726562e+01 +1.106315000000000159e+00 -3.790625000000000000e+01 +1.106320000000000192e+00 -3.787500000000000000e+01 +1.106325000000000003e+00 -3.787500000000000000e+01 +1.106330000000000036e+00 -3.790625000000000000e+01 +1.106335000000000068e+00 -3.784375381469726562e+01 +1.106340000000000101e+00 -3.784375381469726562e+01 +1.106345000000000134e+00 -3.787500000000000000e+01 +1.106350000000000167e+00 -3.790625000000000000e+01 +1.106355000000000199e+00 -3.787500000000000000e+01 +1.106360000000000010e+00 -3.787500000000000000e+01 +1.106365000000000043e+00 -3.793750000000000000e+01 +1.106370000000000076e+00 -3.784375381469726562e+01 +1.106375000000000108e+00 -3.784375381469726562e+01 +1.106380000000000141e+00 -3.787500000000000000e+01 +1.106385000000000174e+00 -3.790625000000000000e+01 +1.106389999999999985e+00 -3.790625000000000000e+01 +1.106395000000000017e+00 -3.790625000000000000e+01 +1.106400000000000050e+00 -3.781250000000000000e+01 +1.106405000000000083e+00 -3.784375381469726562e+01 +1.106410000000000116e+00 -3.781250000000000000e+01 +1.106415000000000148e+00 -3.784375381469726562e+01 +1.106420000000000181e+00 -3.790625000000000000e+01 +1.106424999999999992e+00 -3.790625000000000000e+01 +1.106430000000000025e+00 -3.784375381469726562e+01 +1.106435000000000057e+00 -3.790625000000000000e+01 +1.106440000000000090e+00 -3.790625000000000000e+01 +1.106445000000000123e+00 -3.784375381469726562e+01 +1.106450000000000156e+00 -3.784375381469726562e+01 +1.106455000000000188e+00 -3.781250000000000000e+01 +1.106459999999999999e+00 -3.790625000000000000e+01 +1.106465000000000032e+00 -3.790625000000000000e+01 +1.106470000000000065e+00 -3.790625000000000000e+01 +1.106475000000000097e+00 -3.784375381469726562e+01 +1.106480000000000130e+00 -3.787500000000000000e+01 +1.106485000000000163e+00 -3.784375381469726562e+01 +1.106490000000000196e+00 -3.790625000000000000e+01 +1.106495000000000006e+00 -3.790625000000000000e+01 +1.106500000000000039e+00 -3.790625000000000000e+01 +1.106505000000000072e+00 -3.790625000000000000e+01 +1.106510000000000105e+00 -3.787500000000000000e+01 +1.106515000000000137e+00 -3.790625000000000000e+01 +1.106520000000000170e+00 -3.787500000000000000e+01 +1.106524999999999981e+00 -3.781250000000000000e+01 +1.106530000000000014e+00 -3.781250000000000000e+01 +1.106535000000000046e+00 -3.793750000000000000e+01 +1.106540000000000079e+00 -3.784375381469726562e+01 +1.106545000000000112e+00 -3.787500000000000000e+01 +1.106550000000000145e+00 -3.784375381469726562e+01 +1.106555000000000177e+00 -3.787500000000000000e+01 +1.106559999999999988e+00 -3.790625000000000000e+01 +1.106565000000000021e+00 -3.790625000000000000e+01 +1.106570000000000054e+00 -3.787500000000000000e+01 +1.106575000000000086e+00 -3.787500000000000000e+01 +1.106580000000000119e+00 -3.793750000000000000e+01 +1.106585000000000152e+00 -3.784375381469726562e+01 +1.106590000000000185e+00 -3.790625000000000000e+01 +1.106594999999999995e+00 -3.787500000000000000e+01 +1.106600000000000028e+00 -3.790625000000000000e+01 +1.106605000000000061e+00 -3.787500000000000000e+01 +1.106610000000000094e+00 -3.787500000000000000e+01 +1.106615000000000126e+00 -3.787500000000000000e+01 +1.106620000000000159e+00 -3.793750000000000000e+01 +1.106625000000000192e+00 -3.781250000000000000e+01 +1.106630000000000003e+00 -3.781250000000000000e+01 +1.106635000000000035e+00 -3.790625000000000000e+01 +1.106640000000000068e+00 -3.787500000000000000e+01 +1.106645000000000101e+00 -3.784375381469726562e+01 +1.106650000000000134e+00 -3.790625000000000000e+01 +1.106655000000000166e+00 -3.793750000000000000e+01 +1.106660000000000199e+00 -3.787500000000000000e+01 +1.106665000000000010e+00 -3.790625000000000000e+01 +1.106670000000000043e+00 -3.790625000000000000e+01 +1.106675000000000075e+00 -3.793750000000000000e+01 +1.106680000000000108e+00 -3.787500000000000000e+01 +1.106685000000000141e+00 -3.784375381469726562e+01 +1.106690000000000174e+00 -3.787500000000000000e+01 +1.106694999999999984e+00 -3.781250000000000000e+01 +1.106700000000000017e+00 -3.781250000000000000e+01 +1.106705000000000050e+00 -3.784375381469726562e+01 +1.106710000000000083e+00 -3.781250000000000000e+01 +1.106715000000000115e+00 -3.784375381469726562e+01 +1.106720000000000148e+00 -3.781250000000000000e+01 +1.106725000000000181e+00 -3.784375381469726562e+01 +1.106729999999999992e+00 -3.784375381469726562e+01 +1.106735000000000024e+00 -3.784375381469726562e+01 +1.106740000000000057e+00 -3.784375381469726562e+01 +1.106745000000000090e+00 -3.784375381469726562e+01 +1.106750000000000123e+00 -3.784375381469726562e+01 +1.106755000000000155e+00 -3.781250000000000000e+01 +1.106760000000000188e+00 -3.781250000000000000e+01 +1.106764999999999999e+00 -3.775000381469726562e+01 +1.106770000000000032e+00 -3.775000381469726562e+01 +1.106775000000000064e+00 -3.784375381469726562e+01 +1.106780000000000097e+00 -3.787500000000000000e+01 +1.106785000000000130e+00 -3.778125000000000000e+01 +1.106790000000000163e+00 -3.784375381469726562e+01 +1.106795000000000195e+00 -3.778125000000000000e+01 +1.106800000000000006e+00 -3.781250000000000000e+01 +1.106805000000000039e+00 -3.784375381469726562e+01 +1.106810000000000072e+00 -3.778125000000000000e+01 +1.106815000000000104e+00 -3.781250000000000000e+01 +1.106820000000000137e+00 -3.771875000000000000e+01 +1.106825000000000170e+00 -3.781250000000000000e+01 +1.106829999999999981e+00 -3.787500000000000000e+01 +1.106835000000000013e+00 -3.784375381469726562e+01 +1.106840000000000046e+00 -3.787500000000000000e+01 +1.106845000000000079e+00 -3.784375381469726562e+01 +1.106850000000000112e+00 -3.790625000000000000e+01 +1.106855000000000144e+00 -3.784375381469726562e+01 +1.106860000000000177e+00 -3.784375381469726562e+01 +1.106864999999999988e+00 -3.787500000000000000e+01 +1.106870000000000021e+00 -3.784375381469726562e+01 +1.106875000000000053e+00 -3.778125000000000000e+01 +1.106880000000000086e+00 -3.781250000000000000e+01 +1.106885000000000119e+00 -3.787500000000000000e+01 +1.106890000000000152e+00 -3.784375381469726562e+01 +1.106895000000000184e+00 -3.781250000000000000e+01 +1.106899999999999995e+00 -3.790625000000000000e+01 +1.106905000000000028e+00 -3.781250000000000000e+01 +1.106910000000000061e+00 -3.784375381469726562e+01 +1.106915000000000093e+00 -3.790625000000000000e+01 +1.106920000000000126e+00 -3.781250000000000000e+01 +1.106925000000000159e+00 -3.784375381469726562e+01 +1.106930000000000192e+00 -3.778125000000000000e+01 +1.106935000000000002e+00 -3.784375381469726562e+01 +1.106940000000000035e+00 -3.778125000000000000e+01 +1.106945000000000068e+00 -3.781250000000000000e+01 +1.106950000000000101e+00 -3.781250000000000000e+01 +1.106955000000000133e+00 -3.781250000000000000e+01 +1.106960000000000166e+00 -3.784375381469726562e+01 +1.106965000000000199e+00 -3.778125000000000000e+01 +1.106970000000000010e+00 -3.775000381469726562e+01 +1.106975000000000042e+00 -3.778125000000000000e+01 +1.106980000000000075e+00 -3.781250000000000000e+01 +1.106985000000000108e+00 -3.778125000000000000e+01 +1.106990000000000141e+00 -3.784375381469726562e+01 +1.106995000000000173e+00 -3.778125000000000000e+01 +1.106999999999999984e+00 -3.775000381469726562e+01 +1.107005000000000017e+00 -3.784375381469726562e+01 +1.107010000000000050e+00 -3.778125000000000000e+01 +1.107015000000000082e+00 -3.778125000000000000e+01 +1.107020000000000115e+00 -3.775000381469726562e+01 +1.107025000000000148e+00 -3.775000381469726562e+01 +1.107030000000000181e+00 -3.778125000000000000e+01 +1.107034999999999991e+00 -3.775000381469726562e+01 +1.107040000000000024e+00 -3.775000381469726562e+01 +1.107045000000000057e+00 -3.768750000000000000e+01 +1.107050000000000090e+00 -3.771875000000000000e+01 +1.107055000000000122e+00 -3.771875000000000000e+01 +1.107060000000000155e+00 -3.771875000000000000e+01 +1.107065000000000188e+00 -3.768750000000000000e+01 +1.107069999999999999e+00 -3.778125000000000000e+01 +1.107075000000000031e+00 -3.778125000000000000e+01 +1.107080000000000064e+00 -3.768750000000000000e+01 +1.107085000000000097e+00 -3.784375381469726562e+01 +1.107090000000000130e+00 -3.771875000000000000e+01 +1.107095000000000162e+00 -3.778125000000000000e+01 +1.107100000000000195e+00 -3.771875000000000000e+01 +1.107105000000000006e+00 -3.781250000000000000e+01 +1.107110000000000039e+00 -3.778125000000000000e+01 +1.107115000000000071e+00 -3.784375381469726562e+01 +1.107120000000000104e+00 -3.775000381469726562e+01 +1.107125000000000137e+00 -3.778125000000000000e+01 +1.107130000000000170e+00 -3.778125000000000000e+01 +1.107134999999999980e+00 -3.778125000000000000e+01 +1.107140000000000013e+00 -3.775000381469726562e+01 +1.107145000000000046e+00 -3.775000381469726562e+01 +1.107150000000000079e+00 -3.771875000000000000e+01 +1.107155000000000111e+00 -3.778125000000000000e+01 +1.107160000000000144e+00 -3.778125000000000000e+01 +1.107165000000000177e+00 -3.775000381469726562e+01 +1.107169999999999987e+00 -3.778125000000000000e+01 +1.107175000000000020e+00 -3.775000381469726562e+01 +1.107180000000000053e+00 -3.778125000000000000e+01 +1.107185000000000086e+00 -3.778125000000000000e+01 +1.107190000000000119e+00 -3.775000381469726562e+01 +1.107195000000000151e+00 -3.778125000000000000e+01 +1.107200000000000184e+00 -3.778125000000000000e+01 +1.107204999999999995e+00 -3.778125000000000000e+01 +1.107210000000000027e+00 -3.775000381469726562e+01 +1.107215000000000060e+00 -3.768750000000000000e+01 +1.107220000000000093e+00 -3.765625000000000000e+01 +1.107225000000000126e+00 -3.775000381469726562e+01 +1.107230000000000159e+00 -3.768750000000000000e+01 +1.107235000000000191e+00 -3.771875000000000000e+01 +1.107240000000000002e+00 -3.778125000000000000e+01 +1.107245000000000035e+00 -3.768750000000000000e+01 +1.107250000000000068e+00 -3.768750000000000000e+01 +1.107255000000000100e+00 -3.765625000000000000e+01 +1.107260000000000133e+00 -3.775000381469726562e+01 +1.107265000000000166e+00 -3.775000381469726562e+01 +1.107270000000000199e+00 -3.775000381469726562e+01 +1.107275000000000009e+00 -3.778125000000000000e+01 +1.107280000000000042e+00 -3.778125000000000000e+01 +1.107285000000000075e+00 -3.771875000000000000e+01 +1.107290000000000108e+00 -3.771875000000000000e+01 +1.107295000000000140e+00 -3.778125000000000000e+01 +1.107300000000000173e+00 -3.771875000000000000e+01 +1.107304999999999984e+00 -3.771875000000000000e+01 +1.107310000000000016e+00 -3.771875000000000000e+01 +1.107315000000000049e+00 -3.775000381469726562e+01 +1.107320000000000082e+00 -3.768750000000000000e+01 +1.107325000000000115e+00 -3.771875000000000000e+01 +1.107330000000000148e+00 -3.771875000000000000e+01 +1.107335000000000180e+00 -3.768750000000000000e+01 +1.107339999999999991e+00 -3.771875000000000000e+01 +1.107345000000000024e+00 -3.765625000000000000e+01 +1.107350000000000056e+00 -3.768750000000000000e+01 +1.107355000000000089e+00 -3.771875000000000000e+01 +1.107360000000000122e+00 -3.768750000000000000e+01 +1.107365000000000155e+00 -3.765625000000000000e+01 +1.107370000000000188e+00 -3.765625000000000000e+01 +1.107374999999999998e+00 -3.771875000000000000e+01 +1.107380000000000031e+00 -3.765625000000000000e+01 +1.107385000000000064e+00 -3.765625000000000000e+01 +1.107390000000000096e+00 -3.762500000000000000e+01 +1.107395000000000129e+00 -3.765625000000000000e+01 +1.107400000000000162e+00 -3.765625000000000000e+01 +1.107405000000000195e+00 -3.765625000000000000e+01 +1.107410000000000005e+00 -3.765625000000000000e+01 +1.107415000000000038e+00 -3.768750000000000000e+01 +1.107420000000000071e+00 -3.768750000000000000e+01 +1.107425000000000104e+00 -3.762500000000000000e+01 +1.107430000000000136e+00 -3.768750000000000000e+01 +1.107435000000000169e+00 -3.765625000000000000e+01 +1.107439999999999980e+00 -3.765625000000000000e+01 +1.107445000000000013e+00 -3.765625000000000000e+01 +1.107450000000000045e+00 -3.765625000000000000e+01 +1.107455000000000078e+00 -3.765625000000000000e+01 +1.107460000000000111e+00 -3.771875000000000000e+01 +1.107465000000000144e+00 -3.762500000000000000e+01 +1.107470000000000176e+00 -3.765625000000000000e+01 +1.107474999999999987e+00 -3.762500000000000000e+01 +1.107480000000000020e+00 -3.765625000000000000e+01 +1.107485000000000053e+00 -3.765625000000000000e+01 +1.107490000000000085e+00 -3.762500000000000000e+01 +1.107495000000000118e+00 -3.762500000000000000e+01 +1.107500000000000151e+00 -3.765625000000000000e+01 +1.107505000000000184e+00 -3.765625000000000000e+01 +1.107509999999999994e+00 -3.759375381469726562e+01 +1.107515000000000027e+00 -3.756250000000000000e+01 +1.107520000000000060e+00 -3.765625000000000000e+01 +1.107525000000000093e+00 -3.762500000000000000e+01 +1.107530000000000125e+00 -3.759375381469726562e+01 +1.107535000000000158e+00 -3.762500000000000000e+01 +1.107540000000000191e+00 -3.756250000000000000e+01 +1.107545000000000002e+00 -3.759375381469726562e+01 +1.107550000000000034e+00 -3.756250000000000000e+01 +1.107555000000000067e+00 -3.765625000000000000e+01 +1.107560000000000100e+00 -3.762500000000000000e+01 +1.107565000000000133e+00 -3.759375381469726562e+01 +1.107570000000000165e+00 -3.756250000000000000e+01 +1.107575000000000198e+00 -3.762500000000000000e+01 +1.107580000000000009e+00 -3.759375381469726562e+01 +1.107585000000000042e+00 -3.753125000000000000e+01 +1.107590000000000074e+00 -3.756250000000000000e+01 +1.107595000000000107e+00 -3.762500000000000000e+01 +1.107600000000000140e+00 -3.759375381469726562e+01 +1.107605000000000173e+00 -3.759375381469726562e+01 +1.107609999999999983e+00 -3.756250000000000000e+01 +1.107615000000000016e+00 -3.759375381469726562e+01 +1.107620000000000049e+00 -3.756250000000000000e+01 +1.107625000000000082e+00 -3.759375381469726562e+01 +1.107630000000000114e+00 -3.759375381469726562e+01 +1.107635000000000147e+00 -3.762500000000000000e+01 +1.107640000000000180e+00 -3.765625000000000000e+01 +1.107644999999999991e+00 -3.756250000000000000e+01 +1.107650000000000023e+00 -3.756250000000000000e+01 +1.107655000000000056e+00 -3.759375381469726562e+01 +1.107660000000000089e+00 -3.756250000000000000e+01 +1.107665000000000122e+00 -3.759375381469726562e+01 +1.107670000000000154e+00 -3.756250000000000000e+01 +1.107675000000000187e+00 -3.759375381469726562e+01 +1.107679999999999998e+00 -3.750000000000000000e+01 +1.107685000000000031e+00 -3.759375381469726562e+01 +1.107690000000000063e+00 -3.759375381469726562e+01 +1.107695000000000096e+00 -3.756250000000000000e+01 +1.107700000000000129e+00 -3.756250000000000000e+01 +1.107705000000000162e+00 -3.756250000000000000e+01 +1.107710000000000194e+00 -3.753125000000000000e+01 +1.107715000000000005e+00 -3.759375381469726562e+01 +1.107720000000000038e+00 -3.759375381469726562e+01 +1.107725000000000071e+00 -3.753125000000000000e+01 +1.107730000000000103e+00 -3.750000000000000000e+01 +1.107735000000000136e+00 -3.756250000000000000e+01 +1.107740000000000169e+00 -3.762500000000000000e+01 +1.107744999999999980e+00 -3.753125000000000000e+01 +1.107750000000000012e+00 -3.756250000000000000e+01 +1.107755000000000045e+00 -3.753125000000000000e+01 +1.107760000000000078e+00 -3.759375381469726562e+01 +1.107765000000000111e+00 -3.756250000000000000e+01 +1.107770000000000143e+00 -3.759375381469726562e+01 +1.107775000000000176e+00 -3.750000000000000000e+01 +1.107779999999999987e+00 -3.753125000000000000e+01 +1.107785000000000020e+00 -3.753125000000000000e+01 +1.107790000000000052e+00 -3.753125000000000000e+01 +1.107795000000000085e+00 -3.753125000000000000e+01 +1.107800000000000118e+00 -3.756250000000000000e+01 +1.107805000000000151e+00 -3.753125000000000000e+01 +1.107810000000000183e+00 -3.750000000000000000e+01 +1.107814999999999994e+00 -3.750000000000000000e+01 +1.107820000000000027e+00 -3.759375381469726562e+01 +1.107825000000000060e+00 -3.750000000000000000e+01 +1.107830000000000092e+00 -3.756250000000000000e+01 +1.107835000000000125e+00 -3.750000000000000000e+01 +1.107840000000000158e+00 -3.750000000000000000e+01 +1.107845000000000191e+00 -3.750000000000000000e+01 +1.107850000000000001e+00 -3.753125000000000000e+01 +1.107855000000000034e+00 -3.756250000000000000e+01 +1.107860000000000067e+00 -3.750000000000000000e+01 +1.107865000000000100e+00 -3.753125000000000000e+01 +1.107870000000000132e+00 -3.756250000000000000e+01 +1.107875000000000165e+00 -3.750000000000000000e+01 +1.107880000000000198e+00 -3.750000000000000000e+01 +1.107885000000000009e+00 -3.750000000000000000e+01 +1.107890000000000041e+00 -3.759375381469726562e+01 +1.107895000000000074e+00 -3.753125000000000000e+01 +1.107900000000000107e+00 -3.750000000000000000e+01 +1.107905000000000140e+00 -3.750000000000000000e+01 +1.107910000000000172e+00 -3.750000000000000000e+01 +1.107914999999999983e+00 -3.750000000000000000e+01 +1.107920000000000016e+00 -3.750000000000000000e+01 +1.107925000000000049e+00 -3.753125000000000000e+01 +1.107930000000000081e+00 -3.746875000000000000e+01 +1.107935000000000114e+00 -3.750000000000000000e+01 +1.107940000000000147e+00 -3.746875000000000000e+01 +1.107945000000000180e+00 -3.753125000000000000e+01 +1.107949999999999990e+00 -3.750000000000000000e+01 +1.107955000000000023e+00 -3.750000000000000000e+01 +1.107960000000000056e+00 -3.746875000000000000e+01 +1.107965000000000089e+00 -3.746875000000000000e+01 +1.107970000000000121e+00 -3.753125000000000000e+01 +1.107975000000000154e+00 -3.750000000000000000e+01 +1.107980000000000187e+00 -3.753125000000000000e+01 +1.107984999999999998e+00 -3.746875000000000000e+01 +1.107990000000000030e+00 -3.750000000000000000e+01 +1.107995000000000063e+00 -3.753125000000000000e+01 +1.108000000000000096e+00 -3.750000000000000000e+01 +1.108005000000000129e+00 -3.743750381469726562e+01 +1.108010000000000161e+00 -3.746875000000000000e+01 +1.108015000000000194e+00 -3.746875000000000000e+01 +1.108020000000000005e+00 -3.743750381469726562e+01 +1.108025000000000038e+00 -3.737500000000000000e+01 +1.108030000000000070e+00 -3.743750381469726562e+01 +1.108035000000000103e+00 -3.743750381469726562e+01 +1.108040000000000136e+00 -3.743750381469726562e+01 +1.108045000000000169e+00 -3.740625000000000000e+01 +1.108050000000000201e+00 -3.740625000000000000e+01 +1.108055000000000012e+00 -3.746875000000000000e+01 +1.108060000000000045e+00 -3.750000000000000000e+01 +1.108065000000000078e+00 -3.743750381469726562e+01 +1.108070000000000110e+00 -3.750000000000000000e+01 +1.108075000000000143e+00 -3.743750381469726562e+01 +1.108080000000000176e+00 -3.743750381469726562e+01 +1.108084999999999987e+00 -3.743750381469726562e+01 +1.108090000000000019e+00 -3.743750381469726562e+01 +1.108095000000000052e+00 -3.740625000000000000e+01 +1.108100000000000085e+00 -3.743750381469726562e+01 +1.108105000000000118e+00 -3.743750381469726562e+01 +1.108110000000000150e+00 -3.743750381469726562e+01 +1.108115000000000183e+00 -3.740625000000000000e+01 +1.108119999999999994e+00 -3.746875000000000000e+01 +1.108125000000000027e+00 -3.743750381469726562e+01 +1.108130000000000059e+00 -3.750000000000000000e+01 +1.108135000000000092e+00 -3.746875000000000000e+01 +1.108140000000000125e+00 -3.746875000000000000e+01 +1.108145000000000158e+00 -3.750000000000000000e+01 +1.108150000000000190e+00 -3.746875000000000000e+01 +1.108155000000000001e+00 -3.746875000000000000e+01 +1.108160000000000034e+00 -3.746875000000000000e+01 +1.108165000000000067e+00 -3.750000000000000000e+01 +1.108170000000000099e+00 -3.743750381469726562e+01 +1.108175000000000132e+00 -3.743750381469726562e+01 +1.108180000000000165e+00 -3.743750381469726562e+01 +1.108185000000000198e+00 -3.737500000000000000e+01 +1.108190000000000008e+00 -3.740625000000000000e+01 +1.108195000000000041e+00 -3.743750381469726562e+01 +1.108200000000000074e+00 -3.740625000000000000e+01 +1.108205000000000107e+00 -3.740625000000000000e+01 +1.108210000000000139e+00 -3.737500000000000000e+01 +1.108215000000000172e+00 -3.743750381469726562e+01 +1.108219999999999983e+00 -3.737500000000000000e+01 +1.108225000000000016e+00 -3.737500000000000000e+01 +1.108230000000000048e+00 -3.740625000000000000e+01 +1.108235000000000081e+00 -3.737500000000000000e+01 +1.108240000000000114e+00 -3.737500000000000000e+01 +1.108245000000000147e+00 -3.737500000000000000e+01 +1.108250000000000179e+00 -3.740625000000000000e+01 +1.108254999999999990e+00 -3.740625000000000000e+01 +1.108260000000000023e+00 -3.737500000000000000e+01 +1.108265000000000056e+00 -3.740625000000000000e+01 +1.108270000000000088e+00 -3.740625000000000000e+01 +1.108275000000000121e+00 -3.740625000000000000e+01 +1.108280000000000154e+00 -3.734375000000000000e+01 +1.108285000000000187e+00 -3.734375000000000000e+01 +1.108289999999999997e+00 -3.734375000000000000e+01 +1.108295000000000030e+00 -3.737500000000000000e+01 +1.108300000000000063e+00 -3.740625000000000000e+01 +1.108305000000000096e+00 -3.737500000000000000e+01 +1.108310000000000128e+00 -3.734375000000000000e+01 +1.108315000000000161e+00 -3.731250000000000000e+01 +1.108320000000000194e+00 -3.734375000000000000e+01 +1.108325000000000005e+00 -3.731250000000000000e+01 +1.108330000000000037e+00 -3.734375000000000000e+01 +1.108335000000000070e+00 -3.731250000000000000e+01 +1.108340000000000103e+00 -3.734375000000000000e+01 +1.108345000000000136e+00 -3.728125381469726562e+01 +1.108350000000000168e+00 -3.734375000000000000e+01 +1.108355000000000201e+00 -3.737500000000000000e+01 +1.108360000000000012e+00 -3.734375000000000000e+01 +1.108365000000000045e+00 -3.728125381469726562e+01 +1.108370000000000077e+00 -3.731250000000000000e+01 +1.108375000000000110e+00 -3.734375000000000000e+01 +1.108380000000000143e+00 -3.737500000000000000e+01 +1.108385000000000176e+00 -3.734375000000000000e+01 +1.108389999999999986e+00 -3.728125381469726562e+01 +1.108395000000000019e+00 -3.737500000000000000e+01 +1.108400000000000052e+00 -3.731250000000000000e+01 +1.108405000000000085e+00 -3.725000000000000000e+01 +1.108410000000000117e+00 -3.731250000000000000e+01 +1.108415000000000150e+00 -3.725000000000000000e+01 +1.108420000000000183e+00 -3.731250000000000000e+01 +1.108424999999999994e+00 -3.725000000000000000e+01 +1.108430000000000026e+00 -3.728125381469726562e+01 +1.108435000000000059e+00 -3.728125381469726562e+01 +1.108440000000000092e+00 -3.731250000000000000e+01 +1.108445000000000125e+00 -3.725000000000000000e+01 +1.108450000000000157e+00 -3.725000000000000000e+01 +1.108455000000000190e+00 -3.728125381469726562e+01 +1.108460000000000001e+00 -3.728125381469726562e+01 +1.108465000000000034e+00 -3.728125381469726562e+01 +1.108470000000000066e+00 -3.728125381469726562e+01 +1.108475000000000099e+00 -3.728125381469726562e+01 +1.108480000000000132e+00 -3.728125381469726562e+01 +1.108485000000000165e+00 -3.715625000000000000e+01 +1.108490000000000197e+00 -3.725000000000000000e+01 +1.108495000000000008e+00 -3.721875000000000000e+01 +1.108500000000000041e+00 -3.718750000000000000e+01 +1.108505000000000074e+00 -3.728125381469726562e+01 +1.108510000000000106e+00 -3.721875000000000000e+01 +1.108515000000000139e+00 -3.728125381469726562e+01 +1.108520000000000172e+00 -3.721875000000000000e+01 +1.108524999999999983e+00 -3.728125381469726562e+01 +1.108530000000000015e+00 -3.721875000000000000e+01 +1.108535000000000048e+00 -3.728125381469726562e+01 +1.108540000000000081e+00 -3.728125381469726562e+01 +1.108545000000000114e+00 -3.728125381469726562e+01 +1.108550000000000146e+00 -3.721875000000000000e+01 +1.108555000000000179e+00 -3.721875000000000000e+01 +1.108559999999999990e+00 -3.718750000000000000e+01 +1.108565000000000023e+00 -3.728125381469726562e+01 +1.108570000000000055e+00 -3.712500381469726562e+01 +1.108575000000000088e+00 -3.715625000000000000e+01 +1.108580000000000121e+00 -3.721875000000000000e+01 +1.108585000000000154e+00 -3.721875000000000000e+01 +1.108590000000000186e+00 -3.718750000000000000e+01 +1.108594999999999997e+00 -3.718750000000000000e+01 +1.108600000000000030e+00 -3.721875000000000000e+01 +1.108605000000000063e+00 -3.718750000000000000e+01 +1.108610000000000095e+00 -3.718750000000000000e+01 +1.108615000000000128e+00 -3.718750000000000000e+01 +1.108620000000000161e+00 -3.721875000000000000e+01 +1.108625000000000194e+00 -3.721875000000000000e+01 +1.108630000000000004e+00 -3.721875000000000000e+01 +1.108635000000000037e+00 -3.718750000000000000e+01 +1.108640000000000070e+00 -3.728125381469726562e+01 +1.108645000000000103e+00 -3.718750000000000000e+01 +1.108650000000000135e+00 -3.718750000000000000e+01 +1.108655000000000168e+00 -3.718750000000000000e+01 +1.108660000000000201e+00 -3.718750000000000000e+01 +1.108665000000000012e+00 -3.718750000000000000e+01 +1.108670000000000044e+00 -3.725000000000000000e+01 +1.108675000000000077e+00 -3.728125381469726562e+01 +1.108680000000000110e+00 -3.725000000000000000e+01 +1.108685000000000143e+00 -3.718750000000000000e+01 +1.108690000000000175e+00 -3.721875000000000000e+01 +1.108694999999999986e+00 -3.721875000000000000e+01 +1.108700000000000019e+00 -3.715625000000000000e+01 +1.108705000000000052e+00 -3.721875000000000000e+01 +1.108710000000000084e+00 -3.718750000000000000e+01 +1.108715000000000117e+00 -3.721875000000000000e+01 +1.108720000000000150e+00 -3.715625000000000000e+01 +1.108725000000000183e+00 -3.715625000000000000e+01 +1.108729999999999993e+00 -3.715625000000000000e+01 +1.108735000000000026e+00 -3.718750000000000000e+01 +1.108740000000000059e+00 -3.712500381469726562e+01 +1.108745000000000092e+00 -3.718750000000000000e+01 +1.108750000000000124e+00 -3.718750000000000000e+01 +1.108755000000000157e+00 -3.721875000000000000e+01 +1.108760000000000190e+00 -3.721875000000000000e+01 +1.108765000000000001e+00 -3.718750000000000000e+01 +1.108770000000000033e+00 -3.715625000000000000e+01 +1.108775000000000066e+00 -3.721875000000000000e+01 +1.108780000000000099e+00 -3.728125381469726562e+01 +1.108785000000000132e+00 -3.721875000000000000e+01 +1.108790000000000164e+00 -3.718750000000000000e+01 +1.108795000000000197e+00 -3.721875000000000000e+01 +1.108800000000000008e+00 -3.712500381469726562e+01 +1.108805000000000041e+00 -3.715625000000000000e+01 +1.108810000000000073e+00 -3.718750000000000000e+01 +1.108815000000000106e+00 -3.718750000000000000e+01 +1.108820000000000139e+00 -3.718750000000000000e+01 +1.108825000000000172e+00 -3.718750000000000000e+01 +1.108829999999999982e+00 -3.718750000000000000e+01 +1.108835000000000015e+00 -3.715625000000000000e+01 +1.108840000000000048e+00 -3.721875000000000000e+01 +1.108845000000000081e+00 -3.715625000000000000e+01 +1.108850000000000113e+00 -3.718750000000000000e+01 +1.108855000000000146e+00 -3.718750000000000000e+01 +1.108860000000000179e+00 -3.712500381469726562e+01 +1.108864999999999990e+00 -3.718750000000000000e+01 +1.108870000000000022e+00 -3.715625000000000000e+01 +1.108875000000000055e+00 -3.715625000000000000e+01 +1.108880000000000088e+00 -3.715625000000000000e+01 +1.108885000000000121e+00 -3.715625000000000000e+01 +1.108890000000000153e+00 -3.709375000000000000e+01 +1.108895000000000186e+00 -3.718750000000000000e+01 +1.108899999999999997e+00 -3.718750000000000000e+01 +1.108905000000000030e+00 -3.712500381469726562e+01 +1.108910000000000062e+00 -3.721875000000000000e+01 +1.108915000000000095e+00 -3.712500381469726562e+01 +1.108920000000000128e+00 -3.709375000000000000e+01 +1.108925000000000161e+00 -3.718750000000000000e+01 +1.108930000000000193e+00 -3.715625000000000000e+01 +1.108935000000000004e+00 -3.706250000000000000e+01 +1.108940000000000037e+00 -3.715625000000000000e+01 +1.108945000000000070e+00 -3.709375000000000000e+01 +1.108950000000000102e+00 -3.706250000000000000e+01 +1.108955000000000135e+00 -3.709375000000000000e+01 +1.108960000000000168e+00 -3.709375000000000000e+01 +1.108965000000000201e+00 -3.709375000000000000e+01 +1.108970000000000011e+00 -3.706250000000000000e+01 +1.108975000000000044e+00 -3.706250000000000000e+01 +1.108980000000000077e+00 -3.703125381469726562e+01 +1.108985000000000110e+00 -3.706250000000000000e+01 +1.108990000000000142e+00 -3.703125381469726562e+01 +1.108995000000000175e+00 -3.709375000000000000e+01 +1.108999999999999986e+00 -3.709375000000000000e+01 +1.109005000000000019e+00 -3.706250000000000000e+01 +1.109010000000000051e+00 -3.700000000000000000e+01 +1.109015000000000084e+00 -3.706250000000000000e+01 +1.109020000000000117e+00 -3.700000000000000000e+01 +1.109025000000000150e+00 -3.706250000000000000e+01 +1.109030000000000182e+00 -3.703125381469726562e+01 +1.109034999999999993e+00 -3.700000000000000000e+01 +1.109040000000000026e+00 -3.703125381469726562e+01 +1.109045000000000059e+00 -3.703125381469726562e+01 +1.109050000000000091e+00 -3.700000000000000000e+01 +1.109055000000000124e+00 -3.700000000000000000e+01 +1.109060000000000157e+00 -3.703125381469726562e+01 +1.109065000000000190e+00 -3.706250000000000000e+01 +1.109070000000000000e+00 -3.703125381469726562e+01 +1.109075000000000033e+00 -3.703125381469726562e+01 +1.109080000000000066e+00 -3.703125381469726562e+01 +1.109085000000000099e+00 -3.703125381469726562e+01 +1.109090000000000131e+00 -3.703125381469726562e+01 +1.109095000000000164e+00 -3.696875000000000000e+01 +1.109100000000000197e+00 -3.700000000000000000e+01 +1.109105000000000008e+00 -3.703125381469726562e+01 +1.109110000000000040e+00 -3.700000000000000000e+01 +1.109115000000000073e+00 -3.703125381469726562e+01 +1.109120000000000106e+00 -3.703125381469726562e+01 +1.109125000000000139e+00 -3.703125381469726562e+01 +1.109130000000000171e+00 -3.703125381469726562e+01 +1.109134999999999982e+00 -3.703125381469726562e+01 +1.109140000000000015e+00 -3.706250000000000000e+01 +1.109145000000000048e+00 -3.700000000000000000e+01 +1.109150000000000080e+00 -3.700000000000000000e+01 +1.109155000000000113e+00 -3.700000000000000000e+01 +1.109160000000000146e+00 -3.700000000000000000e+01 +1.109165000000000179e+00 -3.703125381469726562e+01 +1.109169999999999989e+00 -3.700000000000000000e+01 +1.109175000000000022e+00 -3.706250000000000000e+01 +1.109180000000000055e+00 -3.703125381469726562e+01 +1.109185000000000088e+00 -3.703125381469726562e+01 +1.109190000000000120e+00 -3.700000000000000000e+01 +1.109195000000000153e+00 -3.703125381469726562e+01 +1.109200000000000186e+00 -3.700000000000000000e+01 +1.109204999999999997e+00 -3.700000000000000000e+01 +1.109210000000000029e+00 -3.700000000000000000e+01 +1.109215000000000062e+00 -3.700000000000000000e+01 +1.109220000000000095e+00 -3.696875000000000000e+01 +1.109225000000000128e+00 -3.700000000000000000e+01 +1.109230000000000160e+00 -3.700000000000000000e+01 +1.109235000000000193e+00 -3.696875000000000000e+01 +1.109240000000000004e+00 -3.700000000000000000e+01 +1.109245000000000037e+00 -3.700000000000000000e+01 +1.109250000000000069e+00 -3.700000000000000000e+01 +1.109255000000000102e+00 -3.700000000000000000e+01 +1.109260000000000135e+00 -3.703125381469726562e+01 +1.109265000000000168e+00 -3.700000000000000000e+01 +1.109270000000000200e+00 -3.700000000000000000e+01 +1.109275000000000011e+00 -3.703125381469726562e+01 +1.109280000000000044e+00 -3.700000000000000000e+01 +1.109285000000000077e+00 -3.700000000000000000e+01 +1.109290000000000109e+00 -3.703125381469726562e+01 +1.109295000000000142e+00 -3.703125381469726562e+01 +1.109300000000000175e+00 -3.700000000000000000e+01 +1.109304999999999986e+00 -3.700000000000000000e+01 +1.109310000000000018e+00 -3.700000000000000000e+01 +1.109315000000000051e+00 -3.700000000000000000e+01 +1.109320000000000084e+00 -3.700000000000000000e+01 +1.109325000000000117e+00 -3.700000000000000000e+01 +1.109330000000000149e+00 -3.700000000000000000e+01 +1.109335000000000182e+00 -3.700000000000000000e+01 +1.109339999999999993e+00 -3.700000000000000000e+01 +1.109345000000000026e+00 -3.700000000000000000e+01 +1.109350000000000058e+00 -3.696875000000000000e+01 +1.109355000000000091e+00 -3.703125381469726562e+01 +1.109360000000000124e+00 -3.700000000000000000e+01 +1.109365000000000157e+00 -3.703125381469726562e+01 +1.109370000000000189e+00 -3.696875000000000000e+01 +1.109375000000000000e+00 -3.700000000000000000e+01 +1.109380000000000033e+00 -3.700000000000000000e+01 +1.109385000000000066e+00 -3.700000000000000000e+01 +1.109390000000000098e+00 -3.700000000000000000e+01 +1.109395000000000131e+00 -3.700000000000000000e+01 +1.109400000000000164e+00 -3.700000000000000000e+01 +1.109405000000000197e+00 -3.696875000000000000e+01 +1.109410000000000007e+00 -3.693750000000000000e+01 +1.109415000000000040e+00 -3.696875000000000000e+01 +1.109420000000000073e+00 -3.696875000000000000e+01 +1.109425000000000106e+00 -3.693750000000000000e+01 +1.109430000000000138e+00 -3.696875000000000000e+01 +1.109435000000000171e+00 -3.696875000000000000e+01 +1.109439999999999982e+00 -3.700000000000000000e+01 +1.109445000000000014e+00 -3.696875000000000000e+01 +1.109450000000000047e+00 -3.696875000000000000e+01 +1.109455000000000080e+00 -3.696875000000000000e+01 +1.109460000000000113e+00 -3.693750000000000000e+01 +1.109465000000000146e+00 -3.696875000000000000e+01 +1.109470000000000178e+00 -3.696875000000000000e+01 +1.109474999999999989e+00 -3.693750000000000000e+01 +1.109480000000000022e+00 -3.700000000000000000e+01 +1.109485000000000054e+00 -3.696875000000000000e+01 +1.109490000000000087e+00 -3.693750000000000000e+01 +1.109495000000000120e+00 -3.696875000000000000e+01 +1.109500000000000153e+00 -3.696875000000000000e+01 +1.109505000000000186e+00 -3.690625000000000000e+01 +1.109509999999999996e+00 -3.696875000000000000e+01 +1.109515000000000029e+00 -3.700000000000000000e+01 +1.109520000000000062e+00 -3.700000000000000000e+01 +1.109525000000000095e+00 -3.696875000000000000e+01 +1.109530000000000127e+00 -3.696875000000000000e+01 +1.109535000000000160e+00 -3.693750000000000000e+01 +1.109540000000000193e+00 -3.693750000000000000e+01 +1.109545000000000003e+00 -3.690625000000000000e+01 +1.109550000000000036e+00 -3.696875000000000000e+01 +1.109555000000000069e+00 -3.693750000000000000e+01 +1.109560000000000102e+00 -3.700000000000000000e+01 +1.109565000000000135e+00 -3.696875000000000000e+01 +1.109570000000000167e+00 -3.700000000000000000e+01 +1.109575000000000200e+00 -3.696875000000000000e+01 +1.109580000000000011e+00 -3.696875000000000000e+01 +1.109585000000000043e+00 -3.700000000000000000e+01 +1.109590000000000076e+00 -3.696875000000000000e+01 +1.109595000000000109e+00 -3.696875000000000000e+01 +1.109600000000000142e+00 -3.690625000000000000e+01 +1.109605000000000175e+00 -3.693750000000000000e+01 +1.109609999999999985e+00 -3.690625000000000000e+01 +1.109615000000000018e+00 -3.690625000000000000e+01 +1.109620000000000051e+00 -3.696875000000000000e+01 +1.109625000000000083e+00 -3.690625000000000000e+01 +1.109630000000000116e+00 -3.693750000000000000e+01 +1.109635000000000149e+00 -3.690625000000000000e+01 +1.109640000000000182e+00 -3.684375000000000000e+01 +1.109644999999999992e+00 -3.696875000000000000e+01 +1.109650000000000025e+00 -3.693750000000000000e+01 +1.109655000000000058e+00 -3.684375000000000000e+01 +1.109660000000000091e+00 -3.690625000000000000e+01 +1.109665000000000123e+00 -3.687500381469726562e+01 +1.109670000000000156e+00 -3.690625000000000000e+01 +1.109675000000000189e+00 -3.690625000000000000e+01 +1.109680000000000000e+00 -3.687500381469726562e+01 +1.109685000000000032e+00 -3.678125000000000000e+01 +1.109690000000000065e+00 -3.690625000000000000e+01 +1.109695000000000098e+00 -3.687500381469726562e+01 +1.109700000000000131e+00 -3.687500381469726562e+01 +1.109705000000000163e+00 -3.690625000000000000e+01 +1.109710000000000196e+00 -3.693750000000000000e+01 +1.109715000000000007e+00 -3.684375000000000000e+01 +1.109720000000000040e+00 -3.687500381469726562e+01 +1.109725000000000072e+00 -3.687500381469726562e+01 +1.109730000000000105e+00 -3.684375000000000000e+01 +1.109735000000000138e+00 -3.684375000000000000e+01 +1.109740000000000171e+00 -3.687500381469726562e+01 +1.109744999999999981e+00 -3.687500381469726562e+01 +1.109750000000000014e+00 -3.687500381469726562e+01 +1.109755000000000047e+00 -3.684375000000000000e+01 +1.109760000000000080e+00 -3.684375000000000000e+01 +1.109765000000000112e+00 -3.684375000000000000e+01 +1.109770000000000145e+00 -3.684375000000000000e+01 +1.109775000000000178e+00 -3.684375000000000000e+01 +1.109779999999999989e+00 -3.684375000000000000e+01 +1.109785000000000021e+00 -3.684375000000000000e+01 +1.109790000000000054e+00 -3.684375000000000000e+01 +1.109795000000000087e+00 -3.684375000000000000e+01 +1.109800000000000120e+00 -3.684375000000000000e+01 +1.109805000000000152e+00 -3.684375000000000000e+01 +1.109810000000000185e+00 -3.681250000000000000e+01 +1.109814999999999996e+00 -3.684375000000000000e+01 +1.109820000000000029e+00 -3.690625000000000000e+01 +1.109825000000000061e+00 -3.684375000000000000e+01 +1.109830000000000094e+00 -3.690625000000000000e+01 +1.109835000000000127e+00 -3.684375000000000000e+01 +1.109840000000000160e+00 -3.684375000000000000e+01 +1.109845000000000192e+00 -3.684375000000000000e+01 +1.109850000000000003e+00 -3.684375000000000000e+01 +1.109855000000000036e+00 -3.687500381469726562e+01 +1.109860000000000069e+00 -3.681250000000000000e+01 +1.109865000000000101e+00 -3.684375000000000000e+01 +1.109870000000000134e+00 -3.684375000000000000e+01 +1.109875000000000167e+00 -3.684375000000000000e+01 +1.109880000000000200e+00 -3.687500381469726562e+01 +1.109885000000000010e+00 -3.684375000000000000e+01 +1.109890000000000043e+00 -3.678125000000000000e+01 +1.109895000000000076e+00 -3.681250000000000000e+01 +1.109900000000000109e+00 -3.681250000000000000e+01 +1.109905000000000141e+00 -3.687500381469726562e+01 +1.109910000000000174e+00 -3.681250000000000000e+01 +1.109914999999999985e+00 -3.684375000000000000e+01 +1.109920000000000018e+00 -3.684375000000000000e+01 +1.109925000000000050e+00 -3.681250000000000000e+01 +1.109930000000000083e+00 -3.681250000000000000e+01 +1.109935000000000116e+00 -3.687500381469726562e+01 +1.109940000000000149e+00 -3.678125000000000000e+01 +1.109945000000000181e+00 -3.678125000000000000e+01 +1.109949999999999992e+00 -3.684375000000000000e+01 +1.109955000000000025e+00 -3.681250000000000000e+01 +1.109960000000000058e+00 -3.678125000000000000e+01 +1.109965000000000090e+00 -3.684375000000000000e+01 +1.109970000000000123e+00 -3.678125000000000000e+01 +1.109975000000000156e+00 -3.684375000000000000e+01 +1.109980000000000189e+00 -3.681250000000000000e+01 +1.109984999999999999e+00 -3.681250000000000000e+01 +1.109990000000000032e+00 -3.678125000000000000e+01 +1.109995000000000065e+00 -3.681250000000000000e+01 +1.110000000000000098e+00 -3.681250000000000000e+01 +1.110005000000000130e+00 -3.684375000000000000e+01 +1.110010000000000163e+00 -3.684375000000000000e+01 +1.110015000000000196e+00 -3.675000000000000000e+01 +1.110020000000000007e+00 -3.678125000000000000e+01 +1.110025000000000039e+00 -3.681250000000000000e+01 +1.110030000000000072e+00 -3.668750000000000000e+01 +1.110035000000000105e+00 -3.675000000000000000e+01 +1.110040000000000138e+00 -3.684375000000000000e+01 +1.110045000000000170e+00 -3.678125000000000000e+01 +1.110049999999999981e+00 -3.671875381469726562e+01 +1.110055000000000014e+00 -3.681250000000000000e+01 +1.110060000000000047e+00 -3.678125000000000000e+01 +1.110065000000000079e+00 -3.681250000000000000e+01 +1.110070000000000112e+00 -3.684375000000000000e+01 +1.110075000000000145e+00 -3.681250000000000000e+01 +1.110080000000000178e+00 -3.681250000000000000e+01 +1.110084999999999988e+00 -3.678125000000000000e+01 +1.110090000000000021e+00 -3.678125000000000000e+01 +1.110095000000000054e+00 -3.678125000000000000e+01 +1.110100000000000087e+00 -3.675000000000000000e+01 +1.110105000000000119e+00 -3.678125000000000000e+01 +1.110110000000000152e+00 -3.678125000000000000e+01 +1.110115000000000185e+00 -3.681250000000000000e+01 +1.110119999999999996e+00 -3.678125000000000000e+01 +1.110125000000000028e+00 -3.678125000000000000e+01 +1.110130000000000061e+00 -3.681250000000000000e+01 +1.110135000000000094e+00 -3.681250000000000000e+01 +1.110140000000000127e+00 -3.675000000000000000e+01 +1.110145000000000159e+00 -3.681250000000000000e+01 +1.110150000000000192e+00 -3.678125000000000000e+01 +1.110155000000000003e+00 -3.684375000000000000e+01 +1.110160000000000036e+00 -3.678125000000000000e+01 +1.110165000000000068e+00 -3.678125000000000000e+01 +1.110170000000000101e+00 -3.678125000000000000e+01 +1.110175000000000134e+00 -3.678125000000000000e+01 +1.110180000000000167e+00 -3.681250000000000000e+01 +1.110185000000000199e+00 -3.684375000000000000e+01 +1.110190000000000010e+00 -3.678125000000000000e+01 +1.110195000000000043e+00 -3.684375000000000000e+01 +1.110200000000000076e+00 -3.675000000000000000e+01 +1.110205000000000108e+00 -3.684375000000000000e+01 +1.110210000000000141e+00 -3.678125000000000000e+01 +1.110215000000000174e+00 -3.678125000000000000e+01 +1.110219999999999985e+00 -3.678125000000000000e+01 +1.110225000000000017e+00 -3.675000000000000000e+01 +1.110230000000000050e+00 -3.678125000000000000e+01 +1.110235000000000083e+00 -3.675000000000000000e+01 +1.110240000000000116e+00 -3.678125000000000000e+01 +1.110245000000000148e+00 -3.678125000000000000e+01 +1.110250000000000181e+00 -3.668750000000000000e+01 +1.110254999999999992e+00 -3.675000000000000000e+01 +1.110260000000000025e+00 -3.678125000000000000e+01 +1.110265000000000057e+00 -3.675000000000000000e+01 +1.110270000000000090e+00 -3.678125000000000000e+01 +1.110275000000000123e+00 -3.675000000000000000e+01 +1.110280000000000156e+00 -3.678125000000000000e+01 +1.110285000000000188e+00 -3.678125000000000000e+01 +1.110289999999999999e+00 -3.671875381469726562e+01 +1.110295000000000032e+00 -3.671875381469726562e+01 +1.110300000000000065e+00 -3.681250000000000000e+01 +1.110305000000000097e+00 -3.675000000000000000e+01 +1.110310000000000130e+00 -3.671875381469726562e+01 +1.110315000000000163e+00 -3.675000000000000000e+01 +1.110320000000000196e+00 -3.671875381469726562e+01 +1.110325000000000006e+00 -3.675000000000000000e+01 +1.110330000000000039e+00 -3.678125000000000000e+01 +1.110335000000000072e+00 -3.675000000000000000e+01 +1.110340000000000105e+00 -3.675000000000000000e+01 +1.110345000000000137e+00 -3.671875381469726562e+01 +1.110350000000000170e+00 -3.671875381469726562e+01 +1.110354999999999981e+00 -3.675000000000000000e+01 +1.110360000000000014e+00 -3.668750000000000000e+01 +1.110365000000000046e+00 -3.678125000000000000e+01 +1.110370000000000079e+00 -3.678125000000000000e+01 +1.110375000000000112e+00 -3.668750000000000000e+01 +1.110380000000000145e+00 -3.668750000000000000e+01 +1.110385000000000177e+00 -3.675000000000000000e+01 +1.110389999999999988e+00 -3.678125000000000000e+01 +1.110395000000000021e+00 -3.675000000000000000e+01 +1.110400000000000054e+00 -3.668750000000000000e+01 +1.110405000000000086e+00 -3.671875381469726562e+01 +1.110410000000000119e+00 -3.671875381469726562e+01 +1.110415000000000152e+00 -3.671875381469726562e+01 +1.110420000000000185e+00 -3.668750000000000000e+01 +1.110424999999999995e+00 -3.668750000000000000e+01 +1.110430000000000028e+00 -3.671875381469726562e+01 +1.110435000000000061e+00 -3.678125000000000000e+01 +1.110440000000000094e+00 -3.675000000000000000e+01 +1.110445000000000126e+00 -3.671875381469726562e+01 +1.110450000000000159e+00 -3.671875381469726562e+01 +1.110455000000000192e+00 -3.668750000000000000e+01 +1.110460000000000003e+00 -3.668750000000000000e+01 +1.110465000000000035e+00 -3.678125000000000000e+01 +1.110470000000000068e+00 -3.671875381469726562e+01 +1.110475000000000101e+00 -3.675000000000000000e+01 +1.110480000000000134e+00 -3.668750000000000000e+01 +1.110485000000000166e+00 -3.675000000000000000e+01 +1.110490000000000199e+00 -3.671875381469726562e+01 +1.110495000000000010e+00 -3.671875381469726562e+01 +1.110500000000000043e+00 -3.668750000000000000e+01 +1.110505000000000075e+00 -3.668750000000000000e+01 +1.110510000000000108e+00 -3.668750000000000000e+01 +1.110515000000000141e+00 -3.671875381469726562e+01 +1.110520000000000174e+00 -3.665625000000000000e+01 +1.110524999999999984e+00 -3.665625000000000000e+01 +1.110530000000000017e+00 -3.668750000000000000e+01 +1.110535000000000050e+00 -3.671875381469726562e+01 +1.110540000000000083e+00 -3.668750000000000000e+01 +1.110545000000000115e+00 -3.665625000000000000e+01 +1.110550000000000148e+00 -3.671875381469726562e+01 +1.110555000000000181e+00 -3.675000000000000000e+01 +1.110559999999999992e+00 -3.659375000000000000e+01 +1.110565000000000024e+00 -3.662500000000000000e+01 +1.110570000000000057e+00 -3.665625000000000000e+01 +1.110575000000000090e+00 -3.665625000000000000e+01 +1.110580000000000123e+00 -3.662500000000000000e+01 +1.110585000000000155e+00 -3.665625000000000000e+01 +1.110590000000000188e+00 -3.662500000000000000e+01 +1.110594999999999999e+00 -3.662500000000000000e+01 +1.110600000000000032e+00 -3.668750000000000000e+01 +1.110605000000000064e+00 -3.665625000000000000e+01 +1.110610000000000097e+00 -3.665625000000000000e+01 +1.110615000000000130e+00 -3.665625000000000000e+01 +1.110620000000000163e+00 -3.665625000000000000e+01 +1.110625000000000195e+00 -3.665625000000000000e+01 +1.110630000000000006e+00 -3.665625000000000000e+01 +1.110635000000000039e+00 -3.665625000000000000e+01 +1.110640000000000072e+00 -3.668750000000000000e+01 +1.110645000000000104e+00 -3.668750000000000000e+01 +1.110650000000000137e+00 -3.662500000000000000e+01 +1.110655000000000170e+00 -3.659375000000000000e+01 +1.110659999999999981e+00 -3.665625000000000000e+01 +1.110665000000000013e+00 -3.656250381469726562e+01 +1.110670000000000046e+00 -3.659375000000000000e+01 +1.110675000000000079e+00 -3.659375000000000000e+01 +1.110680000000000112e+00 -3.662500000000000000e+01 +1.110685000000000144e+00 -3.659375000000000000e+01 +1.110690000000000177e+00 -3.659375000000000000e+01 +1.110694999999999988e+00 -3.659375000000000000e+01 +1.110700000000000021e+00 -3.659375000000000000e+01 +1.110705000000000053e+00 -3.665625000000000000e+01 +1.110710000000000086e+00 -3.662500000000000000e+01 +1.110715000000000119e+00 -3.659375000000000000e+01 +1.110720000000000152e+00 -3.653125000000000000e+01 +1.110725000000000184e+00 -3.659375000000000000e+01 +1.110729999999999995e+00 -3.656250381469726562e+01 +1.110735000000000028e+00 -3.656250381469726562e+01 +1.110740000000000061e+00 -3.659375000000000000e+01 +1.110745000000000093e+00 -3.659375000000000000e+01 +1.110750000000000126e+00 -3.656250381469726562e+01 +1.110755000000000159e+00 -3.662500000000000000e+01 +1.110760000000000192e+00 -3.659375000000000000e+01 +1.110765000000000002e+00 -3.659375000000000000e+01 +1.110770000000000035e+00 -3.665625000000000000e+01 +1.110775000000000068e+00 -3.662500000000000000e+01 +1.110780000000000101e+00 -3.665625000000000000e+01 +1.110785000000000133e+00 -3.665625000000000000e+01 +1.110790000000000166e+00 -3.662500000000000000e+01 +1.110795000000000199e+00 -3.659375000000000000e+01 +1.110800000000000010e+00 -3.653125000000000000e+01 +1.110805000000000042e+00 -3.659375000000000000e+01 +1.110810000000000075e+00 -3.653125000000000000e+01 +1.110815000000000108e+00 -3.659375000000000000e+01 +1.110820000000000141e+00 -3.653125000000000000e+01 +1.110825000000000173e+00 -3.653125000000000000e+01 +1.110829999999999984e+00 -3.659375000000000000e+01 +1.110835000000000017e+00 -3.656250381469726562e+01 +1.110840000000000050e+00 -3.653125000000000000e+01 +1.110845000000000082e+00 -3.659375000000000000e+01 +1.110850000000000115e+00 -3.656250381469726562e+01 +1.110855000000000148e+00 -3.653125000000000000e+01 +1.110860000000000181e+00 -3.656250381469726562e+01 +1.110864999999999991e+00 -3.653125000000000000e+01 +1.110870000000000024e+00 -3.653125000000000000e+01 +1.110875000000000057e+00 -3.653125000000000000e+01 +1.110880000000000090e+00 -3.662500000000000000e+01 +1.110885000000000122e+00 -3.650000000000000000e+01 +1.110890000000000155e+00 -3.659375000000000000e+01 +1.110895000000000188e+00 -3.656250381469726562e+01 +1.110899999999999999e+00 -3.653125000000000000e+01 +1.110905000000000031e+00 -3.650000000000000000e+01 +1.110910000000000064e+00 -3.653125000000000000e+01 +1.110915000000000097e+00 -3.653125000000000000e+01 +1.110920000000000130e+00 -3.650000000000000000e+01 +1.110925000000000162e+00 -3.656250381469726562e+01 +1.110930000000000195e+00 -3.653125000000000000e+01 +1.110935000000000006e+00 -3.656250381469726562e+01 +1.110940000000000039e+00 -3.653125000000000000e+01 +1.110945000000000071e+00 -3.653125000000000000e+01 +1.110950000000000104e+00 -3.656250381469726562e+01 +1.110955000000000137e+00 -3.653125000000000000e+01 +1.110960000000000170e+00 -3.653125000000000000e+01 +1.110964999999999980e+00 -3.659375000000000000e+01 +1.110970000000000013e+00 -3.650000000000000000e+01 +1.110975000000000046e+00 -3.653125000000000000e+01 +1.110980000000000079e+00 -3.650000000000000000e+01 +1.110985000000000111e+00 -3.650000000000000000e+01 +1.110990000000000144e+00 -3.646875000000000000e+01 +1.110995000000000177e+00 -3.653125000000000000e+01 +1.110999999999999988e+00 -3.650000000000000000e+01 +1.111005000000000020e+00 -3.650000000000000000e+01 +1.111010000000000053e+00 -3.653125000000000000e+01 +1.111015000000000086e+00 -3.650000000000000000e+01 +1.111020000000000119e+00 -3.653125000000000000e+01 +1.111025000000000151e+00 -3.650000000000000000e+01 +1.111030000000000184e+00 -3.646875000000000000e+01 +1.111034999999999995e+00 -3.653125000000000000e+01 +1.111040000000000028e+00 -3.650000000000000000e+01 +1.111045000000000060e+00 -3.646875000000000000e+01 +1.111050000000000093e+00 -3.646875000000000000e+01 +1.111055000000000126e+00 -3.646875000000000000e+01 +1.111060000000000159e+00 -3.650000000000000000e+01 +1.111065000000000191e+00 -3.643750000000000000e+01 +1.111070000000000002e+00 -3.653125000000000000e+01 +1.111075000000000035e+00 -3.646875000000000000e+01 +1.111080000000000068e+00 -3.650000000000000000e+01 +1.111085000000000100e+00 -3.650000000000000000e+01 +1.111090000000000133e+00 -3.650000000000000000e+01 +1.111095000000000166e+00 -3.650000000000000000e+01 +1.111100000000000199e+00 -3.650000000000000000e+01 +1.111105000000000009e+00 -3.650000000000000000e+01 +1.111110000000000042e+00 -3.646875000000000000e+01 +1.111115000000000075e+00 -3.650000000000000000e+01 +1.111120000000000108e+00 -3.646875000000000000e+01 +1.111125000000000140e+00 -3.650000000000000000e+01 +1.111130000000000173e+00 -3.650000000000000000e+01 +1.111134999999999984e+00 -3.646875000000000000e+01 +1.111140000000000017e+00 -3.640625381469726562e+01 +1.111145000000000049e+00 -3.643750000000000000e+01 +1.111150000000000082e+00 -3.640625381469726562e+01 +1.111155000000000115e+00 -3.637500000000000000e+01 +1.111160000000000148e+00 -3.646875000000000000e+01 +1.111165000000000180e+00 -3.646875000000000000e+01 +1.111169999999999991e+00 -3.643750000000000000e+01 +1.111175000000000024e+00 -3.650000000000000000e+01 +1.111180000000000057e+00 -3.643750000000000000e+01 +1.111185000000000089e+00 -3.646875000000000000e+01 +1.111190000000000122e+00 -3.646875000000000000e+01 +1.111195000000000155e+00 -3.646875000000000000e+01 +1.111200000000000188e+00 -3.650000000000000000e+01 +1.111204999999999998e+00 -3.646875000000000000e+01 +1.111210000000000031e+00 -3.650000000000000000e+01 +1.111215000000000064e+00 -3.650000000000000000e+01 +1.111220000000000097e+00 -3.646875000000000000e+01 +1.111225000000000129e+00 -3.646875000000000000e+01 +1.111230000000000162e+00 -3.646875000000000000e+01 +1.111235000000000195e+00 -3.643750000000000000e+01 +1.111240000000000006e+00 -3.643750000000000000e+01 +1.111245000000000038e+00 -3.640625381469726562e+01 +1.111250000000000071e+00 -3.640625381469726562e+01 +1.111255000000000104e+00 -3.634375000000000000e+01 +1.111260000000000137e+00 -3.637500000000000000e+01 +1.111265000000000169e+00 -3.637500000000000000e+01 +1.111269999999999980e+00 -3.640625381469726562e+01 +1.111275000000000013e+00 -3.637500000000000000e+01 +1.111280000000000046e+00 -3.637500000000000000e+01 +1.111285000000000078e+00 -3.637500000000000000e+01 +1.111290000000000111e+00 -3.637500000000000000e+01 +1.111295000000000144e+00 -3.640625381469726562e+01 +1.111300000000000177e+00 -3.640625381469726562e+01 +1.111304999999999987e+00 -3.640625381469726562e+01 +1.111310000000000020e+00 -3.643750000000000000e+01 +1.111315000000000053e+00 -3.634375000000000000e+01 +1.111320000000000086e+00 -3.646875000000000000e+01 +1.111325000000000118e+00 -3.643750000000000000e+01 +1.111330000000000151e+00 -3.634375000000000000e+01 +1.111335000000000184e+00 -3.640625381469726562e+01 +1.111339999999999995e+00 -3.634375000000000000e+01 +1.111345000000000027e+00 -3.640625381469726562e+01 +1.111350000000000060e+00 -3.631250000000000000e+01 +1.111355000000000093e+00 -3.640625381469726562e+01 +1.111360000000000126e+00 -3.637500000000000000e+01 +1.111365000000000158e+00 -3.640625381469726562e+01 +1.111370000000000191e+00 -3.637500000000000000e+01 +1.111375000000000002e+00 -3.640625381469726562e+01 +1.111380000000000035e+00 -3.637500000000000000e+01 +1.111385000000000067e+00 -3.631250000000000000e+01 +1.111390000000000100e+00 -3.634375000000000000e+01 +1.111395000000000133e+00 -3.628125000000000000e+01 +1.111400000000000166e+00 -3.631250000000000000e+01 +1.111405000000000198e+00 -3.631250000000000000e+01 +1.111410000000000009e+00 -3.628125000000000000e+01 +1.111415000000000042e+00 -3.625000000000000000e+01 +1.111420000000000075e+00 -3.631250000000000000e+01 +1.111425000000000107e+00 -3.631250000000000000e+01 +1.111430000000000140e+00 -3.634375000000000000e+01 +1.111435000000000173e+00 -3.637500000000000000e+01 +1.111439999999999984e+00 -3.631250000000000000e+01 +1.111445000000000016e+00 -3.634375000000000000e+01 +1.111450000000000049e+00 -3.628125000000000000e+01 +1.111455000000000082e+00 -3.625000000000000000e+01 +1.111460000000000115e+00 -3.628125000000000000e+01 +1.111465000000000147e+00 -3.618750000000000000e+01 +1.111470000000000180e+00 -3.625000000000000000e+01 +1.111474999999999991e+00 -3.615625381469726562e+01 +1.111480000000000024e+00 -3.625000000000000000e+01 +1.111485000000000056e+00 -3.621875000000000000e+01 +1.111490000000000089e+00 -3.625000000000000000e+01 +1.111495000000000122e+00 -3.618750000000000000e+01 +1.111500000000000155e+00 -3.618750000000000000e+01 +1.111505000000000187e+00 -3.618750000000000000e+01 +1.111509999999999998e+00 -3.618750000000000000e+01 +1.111515000000000031e+00 -3.609375000000000000e+01 +1.111520000000000064e+00 -3.621875000000000000e+01 +1.111525000000000096e+00 -3.615625381469726562e+01 +1.111530000000000129e+00 -3.621875000000000000e+01 +1.111535000000000162e+00 -3.621875000000000000e+01 +1.111540000000000195e+00 -3.618750000000000000e+01 +1.111545000000000005e+00 -3.618750000000000000e+01 +1.111550000000000038e+00 -3.621875000000000000e+01 +1.111555000000000071e+00 -3.615625381469726562e+01 +1.111560000000000104e+00 -3.621875000000000000e+01 +1.111565000000000136e+00 -3.621875000000000000e+01 +1.111570000000000169e+00 -3.628125000000000000e+01 +1.111575000000000202e+00 -3.615625381469726562e+01 +1.111580000000000013e+00 -3.615625381469726562e+01 +1.111585000000000045e+00 -3.621875000000000000e+01 +1.111590000000000078e+00 -3.621875000000000000e+01 +1.111595000000000111e+00 -3.621875000000000000e+01 +1.111600000000000144e+00 -3.618750000000000000e+01 +1.111605000000000176e+00 -3.618750000000000000e+01 +1.111609999999999987e+00 -3.618750000000000000e+01 +1.111615000000000020e+00 -3.625000000000000000e+01 +1.111620000000000053e+00 -3.615625381469726562e+01 +1.111625000000000085e+00 -3.618750000000000000e+01 +1.111630000000000118e+00 -3.615625381469726562e+01 +1.111635000000000151e+00 -3.621875000000000000e+01 +1.111640000000000184e+00 -3.621875000000000000e+01 +1.111644999999999994e+00 -3.615625381469726562e+01 +1.111650000000000027e+00 -3.618750000000000000e+01 +1.111655000000000060e+00 -3.615625381469726562e+01 +1.111660000000000093e+00 -3.618750000000000000e+01 +1.111665000000000125e+00 -3.615625381469726562e+01 +1.111670000000000158e+00 -3.618750000000000000e+01 +1.111675000000000191e+00 -3.618750000000000000e+01 +1.111680000000000001e+00 -3.621875000000000000e+01 +1.111685000000000034e+00 -3.615625381469726562e+01 +1.111690000000000067e+00 -3.618750000000000000e+01 +1.111695000000000100e+00 -3.615625381469726562e+01 +1.111700000000000133e+00 -3.615625381469726562e+01 +1.111705000000000165e+00 -3.621875000000000000e+01 +1.111710000000000198e+00 -3.615625381469726562e+01 +1.111715000000000009e+00 -3.609375000000000000e+01 +1.111720000000000041e+00 -3.615625381469726562e+01 +1.111725000000000074e+00 -3.615625381469726562e+01 +1.111730000000000107e+00 -3.615625381469726562e+01 +1.111735000000000140e+00 -3.621875000000000000e+01 +1.111740000000000173e+00 -3.615625381469726562e+01 +1.111744999999999983e+00 -3.621875000000000000e+01 +1.111750000000000016e+00 -3.615625381469726562e+01 +1.111755000000000049e+00 -3.615625381469726562e+01 +1.111760000000000081e+00 -3.625000000000000000e+01 +1.111765000000000114e+00 -3.618750000000000000e+01 +1.111770000000000147e+00 -3.621875000000000000e+01 +1.111775000000000180e+00 -3.615625381469726562e+01 +1.111779999999999990e+00 -3.615625381469726562e+01 +1.111785000000000023e+00 -3.618750000000000000e+01 +1.111790000000000056e+00 -3.618750000000000000e+01 +1.111795000000000089e+00 -3.615625381469726562e+01 +1.111800000000000122e+00 -3.628125000000000000e+01 +1.111805000000000154e+00 -3.618750000000000000e+01 +1.111810000000000187e+00 -3.612500000000000000e+01 +1.111814999999999998e+00 -3.615625381469726562e+01 +1.111820000000000030e+00 -3.615625381469726562e+01 +1.111825000000000063e+00 -3.609375000000000000e+01 +1.111830000000000096e+00 -3.615625381469726562e+01 +1.111835000000000129e+00 -3.618750000000000000e+01 +1.111840000000000162e+00 -3.612500000000000000e+01 +1.111845000000000194e+00 -3.606250000000000000e+01 +1.111850000000000005e+00 -3.618750000000000000e+01 +1.111855000000000038e+00 -3.618750000000000000e+01 +1.111860000000000070e+00 -3.615625381469726562e+01 +1.111865000000000103e+00 -3.609375000000000000e+01 +1.111870000000000136e+00 -3.615625381469726562e+01 +1.111875000000000169e+00 -3.612500000000000000e+01 +1.111880000000000202e+00 -3.615625381469726562e+01 +1.111885000000000012e+00 -3.612500000000000000e+01 +1.111890000000000045e+00 -3.615625381469726562e+01 +1.111895000000000078e+00 -3.609375000000000000e+01 +1.111900000000000110e+00 -3.609375000000000000e+01 +1.111905000000000143e+00 -3.612500000000000000e+01 +1.111910000000000176e+00 -3.612500000000000000e+01 +1.111914999999999987e+00 -3.612500000000000000e+01 +1.111920000000000019e+00 -3.606250000000000000e+01 +1.111925000000000052e+00 -3.609375000000000000e+01 +1.111930000000000085e+00 -3.606250000000000000e+01 +1.111935000000000118e+00 -3.609375000000000000e+01 +1.111940000000000150e+00 -3.609375000000000000e+01 +1.111945000000000183e+00 -3.603125000000000000e+01 +1.111949999999999994e+00 -3.609375000000000000e+01 +1.111955000000000027e+00 -3.603125000000000000e+01 +1.111960000000000059e+00 -3.603125000000000000e+01 +1.111965000000000092e+00 -3.596875000000000000e+01 +1.111970000000000125e+00 -3.603125000000000000e+01 +1.111975000000000158e+00 -3.603125000000000000e+01 +1.111980000000000190e+00 -3.609375000000000000e+01 +1.111985000000000001e+00 -3.603125000000000000e+01 +1.111990000000000034e+00 -3.603125000000000000e+01 +1.111995000000000067e+00 -3.603125000000000000e+01 +1.112000000000000099e+00 -3.593750000000000000e+01 +1.112005000000000132e+00 -3.603125000000000000e+01 +1.112010000000000165e+00 -3.603125000000000000e+01 +1.112015000000000198e+00 -3.593750000000000000e+01 +1.112020000000000008e+00 -3.603125000000000000e+01 +1.112025000000000041e+00 -3.593750000000000000e+01 +1.112030000000000074e+00 -3.596875000000000000e+01 +1.112035000000000107e+00 -3.596875000000000000e+01 +1.112040000000000139e+00 -3.596875000000000000e+01 +1.112045000000000172e+00 -3.603125000000000000e+01 +1.112049999999999983e+00 -3.596875000000000000e+01 +1.112055000000000016e+00 -3.596875000000000000e+01 +1.112060000000000048e+00 -3.600000381469726562e+01 +1.112065000000000081e+00 -3.600000381469726562e+01 +1.112070000000000114e+00 -3.600000381469726562e+01 +1.112075000000000147e+00 -3.593750000000000000e+01 +1.112080000000000179e+00 -3.596875000000000000e+01 +1.112084999999999990e+00 -3.593750000000000000e+01 +1.112090000000000023e+00 -3.593750000000000000e+01 +1.112095000000000056e+00 -3.590625000000000000e+01 +1.112100000000000088e+00 -3.603125000000000000e+01 +1.112105000000000121e+00 -3.596875000000000000e+01 +1.112110000000000154e+00 -3.596875000000000000e+01 +1.112115000000000187e+00 -3.596875000000000000e+01 +1.112119999999999997e+00 -3.596875000000000000e+01 +1.112125000000000030e+00 -3.600000381469726562e+01 +1.112130000000000063e+00 -3.596875000000000000e+01 +1.112135000000000096e+00 -3.603125000000000000e+01 +1.112140000000000128e+00 -3.600000381469726562e+01 +1.112145000000000161e+00 -3.593750000000000000e+01 +1.112150000000000194e+00 -3.603125000000000000e+01 +1.112155000000000005e+00 -3.596875000000000000e+01 +1.112160000000000037e+00 -3.593750000000000000e+01 +1.112165000000000070e+00 -3.596875000000000000e+01 +1.112170000000000103e+00 -3.596875000000000000e+01 +1.112175000000000136e+00 -3.593750000000000000e+01 +1.112180000000000168e+00 -3.596875000000000000e+01 +1.112185000000000201e+00 -3.596875000000000000e+01 +1.112190000000000012e+00 -3.587500000000000000e+01 +1.112195000000000045e+00 -3.593750000000000000e+01 +1.112200000000000077e+00 -3.593750000000000000e+01 +1.112205000000000110e+00 -3.590625000000000000e+01 +1.112210000000000143e+00 -3.590625000000000000e+01 +1.112215000000000176e+00 -3.593750000000000000e+01 +1.112219999999999986e+00 -3.590625000000000000e+01 +1.112225000000000019e+00 -3.590625000000000000e+01 +1.112230000000000052e+00 -3.590625000000000000e+01 +1.112235000000000085e+00 -3.593750000000000000e+01 +1.112240000000000117e+00 -3.584375381469726562e+01 +1.112245000000000150e+00 -3.590625000000000000e+01 +1.112250000000000183e+00 -3.581250000000000000e+01 +1.112254999999999994e+00 -3.596875000000000000e+01 +1.112260000000000026e+00 -3.590625000000000000e+01 +1.112265000000000059e+00 -3.587500000000000000e+01 +1.112270000000000092e+00 -3.590625000000000000e+01 +1.112275000000000125e+00 -3.590625000000000000e+01 +1.112280000000000157e+00 -3.587500000000000000e+01 +1.112285000000000190e+00 -3.587500000000000000e+01 +1.112290000000000001e+00 -3.587500000000000000e+01 +1.112295000000000034e+00 -3.587500000000000000e+01 +1.112300000000000066e+00 -3.587500000000000000e+01 +1.112305000000000099e+00 -3.587500000000000000e+01 +1.112310000000000132e+00 -3.581250000000000000e+01 +1.112315000000000165e+00 -3.587500000000000000e+01 +1.112320000000000197e+00 -3.581250000000000000e+01 +1.112325000000000008e+00 -3.581250000000000000e+01 +1.112330000000000041e+00 -3.584375381469726562e+01 +1.112335000000000074e+00 -3.575000000000000000e+01 +1.112340000000000106e+00 -3.587500000000000000e+01 +1.112345000000000139e+00 -3.578125000000000000e+01 +1.112350000000000172e+00 -3.590625000000000000e+01 +1.112354999999999983e+00 -3.578125000000000000e+01 +1.112360000000000015e+00 -3.584375381469726562e+01 +1.112365000000000048e+00 -3.578125000000000000e+01 +1.112370000000000081e+00 -3.584375381469726562e+01 +1.112375000000000114e+00 -3.578125000000000000e+01 +1.112380000000000146e+00 -3.578125000000000000e+01 +1.112385000000000179e+00 -3.581250000000000000e+01 +1.112389999999999990e+00 -3.575000000000000000e+01 +1.112395000000000023e+00 -3.575000000000000000e+01 +1.112400000000000055e+00 -3.578125000000000000e+01 +1.112405000000000088e+00 -3.575000000000000000e+01 +1.112410000000000121e+00 -3.581250000000000000e+01 +1.112415000000000154e+00 -3.571875000000000000e+01 +1.112420000000000186e+00 -3.578125000000000000e+01 +1.112424999999999997e+00 -3.571875000000000000e+01 +1.112430000000000030e+00 -3.578125000000000000e+01 +1.112435000000000063e+00 -3.571875000000000000e+01 +1.112440000000000095e+00 -3.568750381469726562e+01 +1.112445000000000128e+00 -3.568750381469726562e+01 +1.112450000000000161e+00 -3.575000000000000000e+01 +1.112455000000000194e+00 -3.578125000000000000e+01 +1.112460000000000004e+00 -3.571875000000000000e+01 +1.112465000000000037e+00 -3.571875000000000000e+01 +1.112470000000000070e+00 -3.578125000000000000e+01 +1.112475000000000103e+00 -3.568750381469726562e+01 +1.112480000000000135e+00 -3.571875000000000000e+01 +1.112485000000000168e+00 -3.575000000000000000e+01 +1.112490000000000201e+00 -3.565625000000000000e+01 +1.112495000000000012e+00 -3.578125000000000000e+01 +1.112500000000000044e+00 -3.562500000000000000e+01 +1.112505000000000077e+00 -3.575000000000000000e+01 +1.112510000000000110e+00 -3.571875000000000000e+01 +1.112515000000000143e+00 -3.565625000000000000e+01 +1.112520000000000175e+00 -3.575000000000000000e+01 +1.112524999999999986e+00 -3.568750381469726562e+01 +1.112530000000000019e+00 -3.562500000000000000e+01 +1.112535000000000052e+00 -3.565625000000000000e+01 +1.112540000000000084e+00 -3.562500000000000000e+01 +1.112545000000000117e+00 -3.562500000000000000e+01 +1.112550000000000150e+00 -3.568750381469726562e+01 +1.112555000000000183e+00 -3.565625000000000000e+01 +1.112559999999999993e+00 -3.559375000000000000e+01 +1.112565000000000026e+00 -3.562500000000000000e+01 +1.112570000000000059e+00 -3.562500000000000000e+01 +1.112575000000000092e+00 -3.568750381469726562e+01 +1.112580000000000124e+00 -3.562500000000000000e+01 +1.112585000000000157e+00 -3.562500000000000000e+01 +1.112590000000000190e+00 -3.565625000000000000e+01 +1.112595000000000001e+00 -3.565625000000000000e+01 +1.112600000000000033e+00 -3.562500000000000000e+01 +1.112605000000000066e+00 -3.568750381469726562e+01 +1.112610000000000099e+00 -3.565625000000000000e+01 +1.112615000000000132e+00 -3.568750381469726562e+01 +1.112620000000000164e+00 -3.565625000000000000e+01 +1.112625000000000197e+00 -3.559375000000000000e+01 +1.112630000000000008e+00 -3.565625000000000000e+01 +1.112635000000000041e+00 -3.565625000000000000e+01 +1.112640000000000073e+00 -3.565625000000000000e+01 +1.112645000000000106e+00 -3.565625000000000000e+01 +1.112650000000000139e+00 -3.565625000000000000e+01 +1.112655000000000172e+00 -3.565625000000000000e+01 +1.112659999999999982e+00 -3.562500000000000000e+01 +1.112665000000000015e+00 -3.565625000000000000e+01 +1.112670000000000048e+00 -3.562500000000000000e+01 +1.112675000000000081e+00 -3.568750381469726562e+01 +1.112680000000000113e+00 -3.562500000000000000e+01 +1.112685000000000146e+00 -3.565625000000000000e+01 +1.112690000000000179e+00 -3.565625000000000000e+01 +1.112694999999999990e+00 -3.559375000000000000e+01 +1.112700000000000022e+00 -3.556250000000000000e+01 +1.112705000000000055e+00 -3.562500000000000000e+01 +1.112710000000000088e+00 -3.565625000000000000e+01 +1.112715000000000121e+00 -3.562500000000000000e+01 +1.112720000000000153e+00 -3.559375000000000000e+01 +1.112725000000000186e+00 -3.562500000000000000e+01 +1.112729999999999997e+00 -3.565625000000000000e+01 +1.112735000000000030e+00 -3.559375000000000000e+01 +1.112740000000000062e+00 -3.559375000000000000e+01 +1.112745000000000095e+00 -3.562500000000000000e+01 +1.112750000000000128e+00 -3.559375000000000000e+01 +1.112755000000000161e+00 -3.556250000000000000e+01 +1.112760000000000193e+00 -3.559375000000000000e+01 +1.112765000000000004e+00 -3.565625000000000000e+01 +1.112770000000000037e+00 -3.568750381469726562e+01 +1.112775000000000070e+00 -3.559375000000000000e+01 +1.112780000000000102e+00 -3.562500000000000000e+01 +1.112785000000000135e+00 -3.562500000000000000e+01 +1.112790000000000168e+00 -3.559375000000000000e+01 +1.112795000000000201e+00 -3.568750381469726562e+01 +1.112800000000000011e+00 -3.565625000000000000e+01 +1.112805000000000044e+00 -3.571875000000000000e+01 +1.112810000000000077e+00 -3.565625000000000000e+01 +1.112815000000000110e+00 -3.565625000000000000e+01 +1.112820000000000142e+00 -3.565625000000000000e+01 +1.112825000000000175e+00 -3.562500000000000000e+01 +1.112829999999999986e+00 -3.565625000000000000e+01 +1.112835000000000019e+00 -3.565625000000000000e+01 +1.112840000000000051e+00 -3.562500000000000000e+01 +1.112845000000000084e+00 -3.559375000000000000e+01 +1.112850000000000117e+00 -3.562500000000000000e+01 +1.112855000000000150e+00 -3.559375000000000000e+01 +1.112860000000000182e+00 -3.565625000000000000e+01 +1.112864999999999993e+00 -3.565625000000000000e+01 +1.112870000000000026e+00 -3.562500000000000000e+01 +1.112875000000000059e+00 -3.559375000000000000e+01 +1.112880000000000091e+00 -3.556250000000000000e+01 +1.112885000000000124e+00 -3.565625000000000000e+01 +1.112890000000000157e+00 -3.559375000000000000e+01 +1.112895000000000190e+00 -3.559375000000000000e+01 +1.112900000000000000e+00 -3.559375000000000000e+01 +1.112905000000000033e+00 -3.562500000000000000e+01 +1.112910000000000066e+00 -3.562500000000000000e+01 +1.112915000000000099e+00 -3.553125381469726562e+01 +1.112920000000000131e+00 -3.559375000000000000e+01 +1.112925000000000164e+00 -3.559375000000000000e+01 +1.112930000000000197e+00 -3.556250000000000000e+01 +1.112935000000000008e+00 -3.556250000000000000e+01 +1.112940000000000040e+00 -3.556250000000000000e+01 +1.112945000000000073e+00 -3.562500000000000000e+01 +1.112950000000000106e+00 -3.562500000000000000e+01 +1.112955000000000139e+00 -3.562500000000000000e+01 +1.112960000000000171e+00 -3.556250000000000000e+01 +1.112964999999999982e+00 -3.562500000000000000e+01 +1.112970000000000015e+00 -3.556250000000000000e+01 +1.112975000000000048e+00 -3.565625000000000000e+01 +1.112980000000000080e+00 -3.559375000000000000e+01 +1.112985000000000113e+00 -3.556250000000000000e+01 +1.112990000000000146e+00 -3.556250000000000000e+01 +1.112995000000000179e+00 -3.559375000000000000e+01 +1.112999999999999989e+00 -3.562500000000000000e+01 +1.113005000000000022e+00 -3.559375000000000000e+01 +1.113010000000000055e+00 -3.559375000000000000e+01 +1.113015000000000088e+00 -3.556250000000000000e+01 +1.113020000000000120e+00 -3.556250000000000000e+01 +1.113025000000000153e+00 -3.562500000000000000e+01 +1.113030000000000186e+00 -3.553125381469726562e+01 +1.113034999999999997e+00 -3.553125381469726562e+01 +1.113040000000000029e+00 -3.559375000000000000e+01 +1.113045000000000062e+00 -3.556250000000000000e+01 +1.113050000000000095e+00 -3.556250000000000000e+01 +1.113055000000000128e+00 -3.559375000000000000e+01 +1.113060000000000160e+00 -3.559375000000000000e+01 +1.113065000000000193e+00 -3.559375000000000000e+01 +1.113070000000000004e+00 -3.559375000000000000e+01 +1.113075000000000037e+00 -3.553125381469726562e+01 +1.113080000000000069e+00 -3.553125381469726562e+01 +1.113085000000000102e+00 -3.556250000000000000e+01 +1.113090000000000135e+00 -3.553125381469726562e+01 +1.113095000000000168e+00 -3.553125381469726562e+01 +1.113100000000000200e+00 -3.556250000000000000e+01 +1.113105000000000011e+00 -3.553125381469726562e+01 +1.113110000000000044e+00 -3.556250000000000000e+01 +1.113115000000000077e+00 -3.556250000000000000e+01 +1.113120000000000109e+00 -3.553125381469726562e+01 +1.113125000000000142e+00 -3.562500000000000000e+01 +1.113130000000000175e+00 -3.556250000000000000e+01 +1.113134999999999986e+00 -3.556250000000000000e+01 +1.113140000000000018e+00 -3.556250000000000000e+01 +1.113145000000000051e+00 -3.556250000000000000e+01 +1.113150000000000084e+00 -3.556250000000000000e+01 +1.113155000000000117e+00 -3.553125381469726562e+01 +1.113160000000000149e+00 -3.553125381469726562e+01 +1.113165000000000182e+00 -3.559375000000000000e+01 +1.113169999999999993e+00 -3.556250000000000000e+01 +1.113175000000000026e+00 -3.553125381469726562e+01 +1.113180000000000058e+00 -3.550000000000000000e+01 +1.113185000000000091e+00 -3.546875000000000000e+01 +1.113190000000000124e+00 -3.553125381469726562e+01 +1.113195000000000157e+00 -3.550000000000000000e+01 +1.113200000000000189e+00 -3.550000000000000000e+01 +1.113205000000000000e+00 -3.550000000000000000e+01 +1.113210000000000033e+00 -3.556250000000000000e+01 +1.113215000000000066e+00 -3.550000000000000000e+01 +1.113220000000000098e+00 -3.556250000000000000e+01 +1.113225000000000131e+00 -3.550000000000000000e+01 +1.113230000000000164e+00 -3.546875000000000000e+01 +1.113235000000000197e+00 -3.550000000000000000e+01 +1.113240000000000007e+00 -3.550000000000000000e+01 +1.113245000000000040e+00 -3.543750381469726562e+01 +1.113250000000000073e+00 -3.553125381469726562e+01 +1.113255000000000106e+00 -3.553125381469726562e+01 +1.113260000000000138e+00 -3.550000000000000000e+01 +1.113265000000000171e+00 -3.550000000000000000e+01 +1.113269999999999982e+00 -3.550000000000000000e+01 +1.113275000000000015e+00 -3.553125381469726562e+01 +1.113280000000000047e+00 -3.550000000000000000e+01 +1.113285000000000080e+00 -3.550000000000000000e+01 +1.113290000000000113e+00 -3.543750381469726562e+01 +1.113295000000000146e+00 -3.550000000000000000e+01 +1.113300000000000178e+00 -3.550000000000000000e+01 +1.113304999999999989e+00 -3.553125381469726562e+01 +1.113310000000000022e+00 -3.546875000000000000e+01 +1.113315000000000055e+00 -3.553125381469726562e+01 +1.113320000000000087e+00 -3.553125381469726562e+01 +1.113325000000000120e+00 -3.550000000000000000e+01 +1.113330000000000153e+00 -3.550000000000000000e+01 +1.113335000000000186e+00 -3.556250000000000000e+01 +1.113339999999999996e+00 -3.553125381469726562e+01 +1.113345000000000029e+00 -3.553125381469726562e+01 +1.113350000000000062e+00 -3.550000000000000000e+01 +1.113355000000000095e+00 -3.550000000000000000e+01 +1.113360000000000127e+00 -3.553125381469726562e+01 +1.113365000000000160e+00 -3.550000000000000000e+01 +1.113370000000000193e+00 -3.546875000000000000e+01 +1.113375000000000004e+00 -3.550000000000000000e+01 +1.113380000000000036e+00 -3.540625000000000000e+01 +1.113385000000000069e+00 -3.550000000000000000e+01 +1.113390000000000102e+00 -3.546875000000000000e+01 +1.113395000000000135e+00 -3.550000000000000000e+01 +1.113400000000000167e+00 -3.546875000000000000e+01 +1.113405000000000200e+00 -3.543750381469726562e+01 +1.113410000000000011e+00 -3.546875000000000000e+01 +1.113415000000000044e+00 -3.546875000000000000e+01 +1.113420000000000076e+00 -3.543750381469726562e+01 +1.113425000000000109e+00 -3.543750381469726562e+01 +1.113430000000000142e+00 -3.540625000000000000e+01 +1.113435000000000175e+00 -3.540625000000000000e+01 +1.113439999999999985e+00 -3.540625000000000000e+01 +1.113445000000000018e+00 -3.534375000000000000e+01 +1.113450000000000051e+00 -3.546875000000000000e+01 +1.113455000000000084e+00 -3.540625000000000000e+01 +1.113460000000000116e+00 -3.540625000000000000e+01 +1.113465000000000149e+00 -3.546875000000000000e+01 +1.113470000000000182e+00 -3.537500000000000000e+01 +1.113474999999999993e+00 -3.540625000000000000e+01 +1.113480000000000025e+00 -3.537500000000000000e+01 +1.113485000000000058e+00 -3.543750381469726562e+01 +1.113490000000000091e+00 -3.534375000000000000e+01 +1.113495000000000124e+00 -3.540625000000000000e+01 +1.113500000000000156e+00 -3.540625000000000000e+01 +1.113505000000000189e+00 -3.540625000000000000e+01 +1.113510000000000000e+00 -3.543750381469726562e+01 +1.113515000000000033e+00 -3.540625000000000000e+01 +1.113520000000000065e+00 -3.537500000000000000e+01 +1.113525000000000098e+00 -3.540625000000000000e+01 +1.113530000000000131e+00 -3.534375000000000000e+01 +1.113535000000000164e+00 -3.537500000000000000e+01 +1.113540000000000196e+00 -3.540625000000000000e+01 +1.113545000000000007e+00 -3.543750381469726562e+01 +1.113550000000000040e+00 -3.534375000000000000e+01 +1.113555000000000073e+00 -3.537500000000000000e+01 +1.113560000000000105e+00 -3.537500000000000000e+01 +1.113565000000000138e+00 -3.534375000000000000e+01 +1.113570000000000171e+00 -3.534375000000000000e+01 +1.113574999999999982e+00 -3.537500000000000000e+01 +1.113580000000000014e+00 -3.537500000000000000e+01 +1.113585000000000047e+00 -3.531250000000000000e+01 +1.113590000000000080e+00 -3.537500000000000000e+01 +1.113595000000000113e+00 -3.537500000000000000e+01 +1.113600000000000145e+00 -3.534375000000000000e+01 +1.113605000000000178e+00 -3.531250000000000000e+01 +1.113609999999999989e+00 -3.534375000000000000e+01 +1.113615000000000022e+00 -3.534375000000000000e+01 +1.113620000000000054e+00 -3.537500000000000000e+01 +1.113625000000000087e+00 -3.534375000000000000e+01 +1.113630000000000120e+00 -3.540625000000000000e+01 +1.113635000000000153e+00 -3.537500000000000000e+01 +1.113640000000000185e+00 -3.540625000000000000e+01 +1.113644999999999996e+00 -3.528125381469726562e+01 +1.113650000000000029e+00 -3.528125381469726562e+01 +1.113655000000000062e+00 -3.534375000000000000e+01 +1.113660000000000094e+00 -3.531250000000000000e+01 +1.113665000000000127e+00 -3.537500000000000000e+01 +1.113670000000000160e+00 -3.537500000000000000e+01 +1.113675000000000193e+00 -3.531250000000000000e+01 +1.113680000000000003e+00 -3.531250000000000000e+01 +1.113685000000000036e+00 -3.534375000000000000e+01 +1.113690000000000069e+00 -3.534375000000000000e+01 +1.113695000000000102e+00 -3.531250000000000000e+01 +1.113700000000000134e+00 -3.531250000000000000e+01 +1.113705000000000167e+00 -3.537500000000000000e+01 +1.113710000000000200e+00 -3.531250000000000000e+01 +1.113715000000000011e+00 -3.534375000000000000e+01 +1.113720000000000043e+00 -3.528125381469726562e+01 +1.113725000000000076e+00 -3.528125381469726562e+01 +1.113730000000000109e+00 -3.534375000000000000e+01 +1.113735000000000142e+00 -3.528125381469726562e+01 +1.113740000000000174e+00 -3.534375000000000000e+01 +1.113744999999999985e+00 -3.534375000000000000e+01 +1.113750000000000018e+00 -3.531250000000000000e+01 +1.113755000000000051e+00 -3.534375000000000000e+01 +1.113760000000000083e+00 -3.531250000000000000e+01 +1.113765000000000116e+00 -3.534375000000000000e+01 +1.113770000000000149e+00 -3.525000000000000000e+01 +1.113775000000000182e+00 -3.525000000000000000e+01 +1.113779999999999992e+00 -3.531250000000000000e+01 +1.113785000000000025e+00 -3.528125381469726562e+01 +1.113790000000000058e+00 -3.518750000000000000e+01 +1.113795000000000091e+00 -3.528125381469726562e+01 +1.113800000000000123e+00 -3.518750000000000000e+01 +1.113805000000000156e+00 -3.521875000000000000e+01 +1.113810000000000189e+00 -3.521875000000000000e+01 +1.113815000000000000e+00 -3.521875000000000000e+01 +1.113820000000000032e+00 -3.525000000000000000e+01 +1.113825000000000065e+00 -3.518750000000000000e+01 +1.113830000000000098e+00 -3.525000000000000000e+01 +1.113835000000000131e+00 -3.521875000000000000e+01 +1.113840000000000163e+00 -3.521875000000000000e+01 +1.113845000000000196e+00 -3.521875000000000000e+01 +1.113850000000000007e+00 -3.525000000000000000e+01 +1.113855000000000040e+00 -3.518750000000000000e+01 +1.113860000000000072e+00 -3.515625000000000000e+01 +1.113865000000000105e+00 -3.521875000000000000e+01 +1.113870000000000138e+00 -3.518750000000000000e+01 +1.113875000000000171e+00 -3.521875000000000000e+01 +1.113879999999999981e+00 -3.515625000000000000e+01 +1.113885000000000014e+00 -3.518750000000000000e+01 +1.113890000000000047e+00 -3.521875000000000000e+01 +1.113895000000000080e+00 -3.518750000000000000e+01 +1.113900000000000112e+00 -3.515625000000000000e+01 +1.113905000000000145e+00 -3.518750000000000000e+01 +1.113910000000000178e+00 -3.518750000000000000e+01 +1.113914999999999988e+00 -3.515625000000000000e+01 +1.113920000000000021e+00 -3.515625000000000000e+01 +1.113925000000000054e+00 -3.515625000000000000e+01 +1.113930000000000087e+00 -3.518750000000000000e+01 +1.113935000000000120e+00 -3.506250000000000000e+01 +1.113940000000000152e+00 -3.509375000000000000e+01 +1.113945000000000185e+00 -3.515625000000000000e+01 +1.113949999999999996e+00 -3.515625000000000000e+01 +1.113955000000000028e+00 -3.509375000000000000e+01 +1.113960000000000061e+00 -3.509375000000000000e+01 +1.113965000000000094e+00 -3.506250000000000000e+01 +1.113970000000000127e+00 -3.509375000000000000e+01 +1.113975000000000160e+00 -3.506250000000000000e+01 +1.113980000000000192e+00 -3.506250000000000000e+01 +1.113985000000000003e+00 -3.509375000000000000e+01 +1.113990000000000036e+00 -3.506250000000000000e+01 +1.113995000000000068e+00 -3.503125000000000000e+01 +1.114000000000000101e+00 -3.509375000000000000e+01 +1.114005000000000134e+00 -3.503125000000000000e+01 +1.114010000000000167e+00 -3.509375000000000000e+01 +1.114015000000000200e+00 -3.509375000000000000e+01 +1.114020000000000010e+00 -3.503125000000000000e+01 +1.114025000000000043e+00 -3.503125000000000000e+01 +1.114030000000000076e+00 -3.503125000000000000e+01 +1.114035000000000108e+00 -3.515625000000000000e+01 +1.114040000000000141e+00 -3.503125000000000000e+01 +1.114045000000000174e+00 -3.506250000000000000e+01 +1.114049999999999985e+00 -3.506250000000000000e+01 +1.114055000000000017e+00 -3.509375000000000000e+01 +1.114060000000000050e+00 -3.506250000000000000e+01 +1.114065000000000083e+00 -3.509375000000000000e+01 +1.114070000000000116e+00 -3.503125000000000000e+01 +1.114075000000000149e+00 -3.503125000000000000e+01 +1.114080000000000181e+00 -3.503125000000000000e+01 +1.114084999999999992e+00 -3.506250000000000000e+01 +1.114090000000000025e+00 -3.506250000000000000e+01 +1.114095000000000057e+00 -3.503125000000000000e+01 +1.114100000000000090e+00 -3.506250000000000000e+01 +1.114105000000000123e+00 -3.503125000000000000e+01 +1.114110000000000156e+00 -3.509375000000000000e+01 +1.114115000000000189e+00 -3.515625000000000000e+01 +1.114119999999999999e+00 -3.509375000000000000e+01 +1.114125000000000032e+00 -3.506250000000000000e+01 +1.114130000000000065e+00 -3.506250000000000000e+01 +1.114135000000000097e+00 -3.509375000000000000e+01 +1.114140000000000130e+00 -3.509375000000000000e+01 +1.114145000000000163e+00 -3.509375000000000000e+01 +1.114150000000000196e+00 -3.506250000000000000e+01 +1.114155000000000006e+00 -3.503125000000000000e+01 +1.114160000000000039e+00 -3.509375000000000000e+01 +1.114165000000000072e+00 -3.509375000000000000e+01 +1.114170000000000105e+00 -3.506250000000000000e+01 +1.114175000000000137e+00 -3.506250000000000000e+01 +1.114180000000000170e+00 -3.503125000000000000e+01 +1.114184999999999981e+00 -3.509375000000000000e+01 +1.114190000000000014e+00 -3.506250000000000000e+01 +1.114195000000000046e+00 -3.506250000000000000e+01 +1.114200000000000079e+00 -3.509375000000000000e+01 +1.114205000000000112e+00 -3.506250000000000000e+01 +1.114210000000000145e+00 -3.506250000000000000e+01 +1.114215000000000177e+00 -3.503125000000000000e+01 +1.114219999999999988e+00 -3.506250000000000000e+01 +1.114225000000000021e+00 -3.506250000000000000e+01 +1.114230000000000054e+00 -3.503125000000000000e+01 +1.114235000000000086e+00 -3.506250000000000000e+01 +1.114240000000000119e+00 -3.509375000000000000e+01 +1.114245000000000152e+00 -3.503125000000000000e+01 +1.114250000000000185e+00 -3.506250000000000000e+01 +1.114254999999999995e+00 -3.503125000000000000e+01 +1.114260000000000028e+00 -3.500000000000000000e+01 +1.114265000000000061e+00 -3.503125000000000000e+01 +1.114270000000000094e+00 -3.506250000000000000e+01 +1.114275000000000126e+00 -3.500000000000000000e+01 +1.114280000000000159e+00 -3.503125000000000000e+01 +1.114285000000000192e+00 -3.500000000000000000e+01 +1.114290000000000003e+00 -3.500000000000000000e+01 +1.114295000000000035e+00 -3.500000000000000000e+01 +1.114300000000000068e+00 -3.500000000000000000e+01 +1.114305000000000101e+00 -3.506250000000000000e+01 +1.114310000000000134e+00 -3.496875381469726562e+01 +1.114315000000000166e+00 -3.503125000000000000e+01 +1.114320000000000199e+00 -3.496875381469726562e+01 +1.114325000000000010e+00 -3.496875381469726562e+01 +1.114330000000000043e+00 -3.500000000000000000e+01 +1.114335000000000075e+00 -3.500000000000000000e+01 +1.114340000000000108e+00 -3.493750000000000000e+01 +1.114345000000000141e+00 -3.500000000000000000e+01 +1.114350000000000174e+00 -3.496875381469726562e+01 +1.114354999999999984e+00 -3.500000000000000000e+01 +1.114360000000000017e+00 -3.496875381469726562e+01 +1.114365000000000050e+00 -3.493750000000000000e+01 +1.114370000000000083e+00 -3.493750000000000000e+01 +1.114375000000000115e+00 -3.496875381469726562e+01 +1.114380000000000148e+00 -3.493750000000000000e+01 +1.114385000000000181e+00 -3.493750000000000000e+01 +1.114389999999999992e+00 -3.496875381469726562e+01 +1.114395000000000024e+00 -3.500000000000000000e+01 +1.114400000000000057e+00 -3.493750000000000000e+01 +1.114405000000000090e+00 -3.493750000000000000e+01 +1.114410000000000123e+00 -3.496875381469726562e+01 +1.114415000000000155e+00 -3.493750000000000000e+01 +1.114420000000000188e+00 -3.496875381469726562e+01 +1.114424999999999999e+00 -3.493750000000000000e+01 +1.114430000000000032e+00 -3.496875381469726562e+01 +1.114435000000000064e+00 -3.493750000000000000e+01 +1.114440000000000097e+00 -3.490625000000000000e+01 +1.114445000000000130e+00 -3.490625000000000000e+01 +1.114450000000000163e+00 -3.490625000000000000e+01 +1.114455000000000195e+00 -3.493750000000000000e+01 +1.114460000000000006e+00 -3.481250381469726562e+01 +1.114465000000000039e+00 -3.490625000000000000e+01 +1.114470000000000072e+00 -3.487500000000000000e+01 +1.114475000000000104e+00 -3.493750000000000000e+01 +1.114480000000000137e+00 -3.487500000000000000e+01 +1.114485000000000170e+00 -3.484375000000000000e+01 +1.114489999999999981e+00 -3.490625000000000000e+01 +1.114495000000000013e+00 -3.481250381469726562e+01 +1.114500000000000046e+00 -3.493750000000000000e+01 +1.114505000000000079e+00 -3.496875381469726562e+01 +1.114510000000000112e+00 -3.493750000000000000e+01 +1.114515000000000144e+00 -3.487500000000000000e+01 +1.114520000000000177e+00 -3.496875381469726562e+01 +1.114524999999999988e+00 -3.493750000000000000e+01 +1.114530000000000021e+00 -3.496875381469726562e+01 +1.114535000000000053e+00 -3.493750000000000000e+01 +1.114540000000000086e+00 -3.490625000000000000e+01 +1.114545000000000119e+00 -3.490625000000000000e+01 +1.114550000000000152e+00 -3.490625000000000000e+01 +1.114555000000000184e+00 -3.493750000000000000e+01 +1.114559999999999995e+00 -3.487500000000000000e+01 +1.114565000000000028e+00 -3.490625000000000000e+01 +1.114570000000000061e+00 -3.493750000000000000e+01 +1.114575000000000093e+00 -3.490625000000000000e+01 +1.114580000000000126e+00 -3.493750000000000000e+01 +1.114585000000000159e+00 -3.490625000000000000e+01 +1.114590000000000192e+00 -3.493750000000000000e+01 +1.114595000000000002e+00 -3.487500000000000000e+01 +1.114600000000000035e+00 -3.493750000000000000e+01 +1.114605000000000068e+00 -3.487500000000000000e+01 +1.114610000000000101e+00 -3.496875381469726562e+01 +1.114615000000000133e+00 -3.493750000000000000e+01 +1.114620000000000166e+00 -3.487500000000000000e+01 +1.114625000000000199e+00 -3.490625000000000000e+01 +1.114630000000000010e+00 -3.487500000000000000e+01 +1.114635000000000042e+00 -3.496875381469726562e+01 +1.114640000000000075e+00 -3.487500000000000000e+01 +1.114645000000000108e+00 -3.484375000000000000e+01 +1.114650000000000141e+00 -3.490625000000000000e+01 +1.114655000000000173e+00 -3.484375000000000000e+01 +1.114659999999999984e+00 -3.487500000000000000e+01 +1.114665000000000017e+00 -3.484375000000000000e+01 +1.114670000000000050e+00 -3.484375000000000000e+01 +1.114675000000000082e+00 -3.484375000000000000e+01 +1.114680000000000115e+00 -3.484375000000000000e+01 +1.114685000000000148e+00 -3.478125000000000000e+01 +1.114690000000000181e+00 -3.481250381469726562e+01 +1.114694999999999991e+00 -3.481250381469726562e+01 +1.114700000000000024e+00 -3.487500000000000000e+01 +1.114705000000000057e+00 -3.487500000000000000e+01 +1.114710000000000090e+00 -3.484375000000000000e+01 +1.114715000000000122e+00 -3.481250381469726562e+01 +1.114720000000000155e+00 -3.484375000000000000e+01 +1.114725000000000188e+00 -3.481250381469726562e+01 +1.114729999999999999e+00 -3.484375000000000000e+01 +1.114735000000000031e+00 -3.487500000000000000e+01 +1.114740000000000064e+00 -3.481250381469726562e+01 +1.114745000000000097e+00 -3.490625000000000000e+01 +1.114750000000000130e+00 -3.484375000000000000e+01 +1.114755000000000162e+00 -3.481250381469726562e+01 +1.114760000000000195e+00 -3.478125000000000000e+01 +1.114765000000000006e+00 -3.478125000000000000e+01 +1.114770000000000039e+00 -3.478125000000000000e+01 +1.114775000000000071e+00 -3.475000000000000000e+01 +1.114780000000000104e+00 -3.478125000000000000e+01 +1.114785000000000137e+00 -3.478125000000000000e+01 +1.114790000000000170e+00 -3.475000000000000000e+01 +1.114794999999999980e+00 -3.471875000000000000e+01 +1.114800000000000013e+00 -3.478125000000000000e+01 +1.114805000000000046e+00 -3.478125000000000000e+01 +1.114810000000000079e+00 -3.481250381469726562e+01 +1.114815000000000111e+00 -3.478125000000000000e+01 +1.114820000000000144e+00 -3.475000000000000000e+01 +1.114825000000000177e+00 -3.478125000000000000e+01 +1.114829999999999988e+00 -3.478125000000000000e+01 +1.114835000000000020e+00 -3.478125000000000000e+01 +1.114840000000000053e+00 -3.475000000000000000e+01 +1.114845000000000086e+00 -3.468750000000000000e+01 +1.114850000000000119e+00 -3.471875000000000000e+01 +1.114855000000000151e+00 -3.475000000000000000e+01 +1.114860000000000184e+00 -3.465625000000000000e+01 +1.114864999999999995e+00 -3.471875000000000000e+01 +1.114870000000000028e+00 -3.471875000000000000e+01 +1.114875000000000060e+00 -3.471875000000000000e+01 +1.114880000000000093e+00 -3.478125000000000000e+01 +1.114885000000000126e+00 -3.465625000000000000e+01 +1.114890000000000159e+00 -3.465625000000000000e+01 +1.114895000000000191e+00 -3.465625000000000000e+01 +1.114900000000000002e+00 -3.465625000000000000e+01 +1.114905000000000035e+00 -3.468750000000000000e+01 +1.114910000000000068e+00 -3.471875000000000000e+01 +1.114915000000000100e+00 -3.465625000000000000e+01 +1.114920000000000133e+00 -3.468750000000000000e+01 +1.114925000000000166e+00 -3.462500000000000000e+01 +1.114930000000000199e+00 -3.471875000000000000e+01 +1.114935000000000009e+00 -3.465625000000000000e+01 +1.114940000000000042e+00 -3.468750000000000000e+01 +1.114945000000000075e+00 -3.465625000000000000e+01 +1.114950000000000108e+00 -3.462500000000000000e+01 +1.114955000000000140e+00 -3.468750000000000000e+01 +1.114960000000000173e+00 -3.468750000000000000e+01 +1.114964999999999984e+00 -3.465625000000000000e+01 +1.114970000000000017e+00 -3.462500000000000000e+01 +1.114975000000000049e+00 -3.462500000000000000e+01 +1.114980000000000082e+00 -3.465625000000000000e+01 +1.114985000000000115e+00 -3.465625000000000000e+01 +1.114990000000000148e+00 -3.453125000000000000e+01 +1.114995000000000180e+00 -3.465625000000000000e+01 +1.114999999999999991e+00 -3.462500000000000000e+01 +1.115005000000000024e+00 -3.465625000000000000e+01 +1.115010000000000057e+00 -3.459375000000000000e+01 +1.115015000000000089e+00 -3.459375000000000000e+01 +1.115020000000000122e+00 -3.462500000000000000e+01 +1.115025000000000155e+00 -3.456250381469726562e+01 +1.115030000000000188e+00 -3.462500000000000000e+01 +1.115034999999999998e+00 -3.459375000000000000e+01 +1.115040000000000031e+00 -3.465625000000000000e+01 +1.115045000000000064e+00 -3.462500000000000000e+01 +1.115050000000000097e+00 -3.462500000000000000e+01 +1.115055000000000129e+00 -3.450000000000000000e+01 +1.115060000000000162e+00 -3.453125000000000000e+01 +1.115065000000000195e+00 -3.456250381469726562e+01 +1.115070000000000006e+00 -3.453125000000000000e+01 +1.115075000000000038e+00 -3.450000000000000000e+01 +1.115080000000000071e+00 -3.459375000000000000e+01 +1.115085000000000104e+00 -3.456250381469726562e+01 +1.115090000000000137e+00 -3.453125000000000000e+01 +1.115095000000000169e+00 -3.456250381469726562e+01 +1.115100000000000202e+00 -3.450000000000000000e+01 +1.115105000000000013e+00 -3.450000000000000000e+01 +1.115110000000000046e+00 -3.453125000000000000e+01 +1.115115000000000078e+00 -3.450000000000000000e+01 +1.115120000000000111e+00 -3.450000000000000000e+01 +1.115125000000000144e+00 -3.446875000000000000e+01 +1.115130000000000177e+00 -3.450000000000000000e+01 +1.115134999999999987e+00 -3.450000000000000000e+01 +1.115140000000000020e+00 -3.446875000000000000e+01 +1.115145000000000053e+00 -3.453125000000000000e+01 +1.115150000000000086e+00 -3.446875000000000000e+01 +1.115155000000000118e+00 -3.446875000000000000e+01 +1.115160000000000151e+00 -3.446875000000000000e+01 +1.115165000000000184e+00 -3.443750000000000000e+01 +1.115169999999999995e+00 -3.450000000000000000e+01 +1.115175000000000027e+00 -3.446875000000000000e+01 +1.115180000000000060e+00 -3.453125000000000000e+01 +1.115185000000000093e+00 -3.453125000000000000e+01 +1.115190000000000126e+00 -3.443750000000000000e+01 +1.115195000000000158e+00 -3.450000000000000000e+01 +1.115200000000000191e+00 -3.450000000000000000e+01 +1.115205000000000002e+00 -3.446875000000000000e+01 +1.115210000000000035e+00 -3.443750000000000000e+01 +1.115215000000000067e+00 -3.446875000000000000e+01 +1.115220000000000100e+00 -3.446875000000000000e+01 +1.115225000000000133e+00 -3.446875000000000000e+01 +1.115230000000000166e+00 -3.443750000000000000e+01 +1.115235000000000198e+00 -3.446875000000000000e+01 +1.115240000000000009e+00 -3.443750000000000000e+01 +1.115245000000000042e+00 -3.443750000000000000e+01 +1.115250000000000075e+00 -3.446875000000000000e+01 +1.115255000000000107e+00 -3.443750000000000000e+01 +1.115260000000000140e+00 -3.443750000000000000e+01 +1.115265000000000173e+00 -3.446875000000000000e+01 +1.115269999999999984e+00 -3.446875000000000000e+01 +1.115275000000000016e+00 -3.450000000000000000e+01 +1.115280000000000049e+00 -3.443750000000000000e+01 +1.115285000000000082e+00 -3.437500000000000000e+01 +1.115290000000000115e+00 -3.440625381469726562e+01 +1.115295000000000147e+00 -3.446875000000000000e+01 +1.115300000000000180e+00 -3.446875000000000000e+01 +1.115304999999999991e+00 -3.443750000000000000e+01 +1.115310000000000024e+00 -3.440625381469726562e+01 +1.115315000000000056e+00 -3.446875000000000000e+01 +1.115320000000000089e+00 -3.446875000000000000e+01 +1.115325000000000122e+00 -3.440625381469726562e+01 +1.115330000000000155e+00 -3.446875000000000000e+01 +1.115335000000000187e+00 -3.446875000000000000e+01 +1.115339999999999998e+00 -3.440625381469726562e+01 +1.115345000000000031e+00 -3.446875000000000000e+01 +1.115350000000000064e+00 -3.440625381469726562e+01 +1.115355000000000096e+00 -3.437500000000000000e+01 +1.115360000000000129e+00 -3.440625381469726562e+01 +1.115365000000000162e+00 -3.437500000000000000e+01 +1.115370000000000195e+00 -3.437500000000000000e+01 +1.115375000000000005e+00 -3.440625381469726562e+01 +1.115380000000000038e+00 -3.440625381469726562e+01 +1.115385000000000071e+00 -3.440625381469726562e+01 +1.115390000000000104e+00 -3.437500000000000000e+01 +1.115395000000000136e+00 -3.443750000000000000e+01 +1.115400000000000169e+00 -3.437500000000000000e+01 +1.115405000000000202e+00 -3.434375000000000000e+01 +1.115410000000000013e+00 -3.440625381469726562e+01 +1.115415000000000045e+00 -3.440625381469726562e+01 +1.115420000000000078e+00 -3.434375000000000000e+01 +1.115425000000000111e+00 -3.440625381469726562e+01 +1.115430000000000144e+00 -3.437500000000000000e+01 +1.115435000000000176e+00 -3.437500000000000000e+01 +1.115439999999999987e+00 -3.431250000000000000e+01 +1.115445000000000020e+00 -3.437500000000000000e+01 +1.115450000000000053e+00 -3.434375000000000000e+01 +1.115455000000000085e+00 -3.437500000000000000e+01 +1.115460000000000118e+00 -3.434375000000000000e+01 +1.115465000000000151e+00 -3.434375000000000000e+01 +1.115470000000000184e+00 -3.431250000000000000e+01 +1.115474999999999994e+00 -3.434375000000000000e+01 +1.115480000000000027e+00 -3.434375000000000000e+01 +1.115485000000000060e+00 -3.440625381469726562e+01 +1.115490000000000093e+00 -3.437500000000000000e+01 +1.115495000000000125e+00 -3.440625381469726562e+01 +1.115500000000000158e+00 -3.434375000000000000e+01 +1.115505000000000191e+00 -3.428125000000000000e+01 +1.115510000000000002e+00 -3.434375000000000000e+01 +1.115515000000000034e+00 -3.431250000000000000e+01 +1.115520000000000067e+00 -3.428125000000000000e+01 +1.115525000000000100e+00 -3.434375000000000000e+01 +1.115530000000000133e+00 -3.431250000000000000e+01 +1.115535000000000165e+00 -3.431250000000000000e+01 +1.115540000000000198e+00 -3.425000381469726562e+01 +1.115545000000000009e+00 -3.431250000000000000e+01 +1.115550000000000042e+00 -3.428125000000000000e+01 +1.115555000000000074e+00 -3.431250000000000000e+01 +1.115560000000000107e+00 -3.428125000000000000e+01 +1.115565000000000140e+00 -3.428125000000000000e+01 +1.115570000000000173e+00 -3.428125000000000000e+01 +1.115574999999999983e+00 -3.431250000000000000e+01 +1.115580000000000016e+00 -3.428125000000000000e+01 +1.115585000000000049e+00 -3.428125000000000000e+01 +1.115590000000000082e+00 -3.431250000000000000e+01 +1.115595000000000114e+00 -3.428125000000000000e+01 +1.115600000000000147e+00 -3.425000381469726562e+01 +1.115605000000000180e+00 -3.425000381469726562e+01 +1.115609999999999991e+00 -3.421875000000000000e+01 +1.115615000000000023e+00 -3.421875000000000000e+01 +1.115620000000000056e+00 -3.418750000000000000e+01 +1.115625000000000089e+00 -3.418750000000000000e+01 +1.115630000000000122e+00 -3.425000381469726562e+01 +1.115635000000000154e+00 -3.421875000000000000e+01 +1.115640000000000187e+00 -3.425000381469726562e+01 +1.115644999999999998e+00 -3.428125000000000000e+01 +1.115650000000000031e+00 -3.425000381469726562e+01 +1.115655000000000063e+00 -3.415625000000000000e+01 +1.115660000000000096e+00 -3.421875000000000000e+01 +1.115665000000000129e+00 -3.415625000000000000e+01 +1.115670000000000162e+00 -3.428125000000000000e+01 +1.115675000000000194e+00 -3.425000381469726562e+01 +1.115680000000000005e+00 -3.415625000000000000e+01 +1.115685000000000038e+00 -3.415625000000000000e+01 +1.115690000000000071e+00 -3.415625000000000000e+01 +1.115695000000000103e+00 -3.421875000000000000e+01 +1.115700000000000136e+00 -3.421875000000000000e+01 +1.115705000000000169e+00 -3.418750000000000000e+01 +1.115710000000000202e+00 -3.412500000000000000e+01 +1.115715000000000012e+00 -3.415625000000000000e+01 +1.115720000000000045e+00 -3.421875000000000000e+01 +1.115725000000000078e+00 -3.415625000000000000e+01 +1.115730000000000111e+00 -3.415625000000000000e+01 +1.115735000000000143e+00 -3.418750000000000000e+01 +1.115740000000000176e+00 -3.415625000000000000e+01 +1.115744999999999987e+00 -3.415625000000000000e+01 +1.115750000000000020e+00 -3.415625000000000000e+01 +1.115755000000000052e+00 -3.418750000000000000e+01 +1.115760000000000085e+00 -3.406250000000000000e+01 +1.115765000000000118e+00 -3.406250000000000000e+01 +1.115770000000000151e+00 -3.409375381469726562e+01 +1.115775000000000183e+00 -3.409375381469726562e+01 +1.115779999999999994e+00 -3.403125000000000000e+01 +1.115785000000000027e+00 -3.412500000000000000e+01 +1.115790000000000060e+00 -3.406250000000000000e+01 +1.115795000000000092e+00 -3.409375381469726562e+01 +1.115800000000000125e+00 -3.412500000000000000e+01 +1.115805000000000158e+00 -3.406250000000000000e+01 +1.115810000000000191e+00 -3.403125000000000000e+01 +1.115815000000000001e+00 -3.409375381469726562e+01 +1.115820000000000034e+00 -3.409375381469726562e+01 +1.115825000000000067e+00 -3.409375381469726562e+01 +1.115830000000000100e+00 -3.412500000000000000e+01 +1.115835000000000132e+00 -3.409375381469726562e+01 +1.115840000000000165e+00 -3.403125000000000000e+01 +1.115845000000000198e+00 -3.403125000000000000e+01 +1.115850000000000009e+00 -3.406250000000000000e+01 +1.115855000000000041e+00 -3.409375381469726562e+01 +1.115860000000000074e+00 -3.403125000000000000e+01 +1.115865000000000107e+00 -3.406250000000000000e+01 +1.115870000000000140e+00 -3.409375381469726562e+01 +1.115875000000000172e+00 -3.406250000000000000e+01 +1.115879999999999983e+00 -3.409375381469726562e+01 +1.115885000000000016e+00 -3.409375381469726562e+01 +1.115890000000000049e+00 -3.403125000000000000e+01 +1.115895000000000081e+00 -3.400000000000000000e+01 +1.115900000000000114e+00 -3.403125000000000000e+01 +1.115905000000000147e+00 -3.406250000000000000e+01 +1.115910000000000180e+00 -3.403125000000000000e+01 +1.115914999999999990e+00 -3.400000000000000000e+01 +1.115920000000000023e+00 -3.400000000000000000e+01 +1.115925000000000056e+00 -3.393750000000000000e+01 +1.115930000000000089e+00 -3.406250000000000000e+01 +1.115935000000000121e+00 -3.400000000000000000e+01 +1.115940000000000154e+00 -3.400000000000000000e+01 +1.115945000000000187e+00 -3.400000000000000000e+01 +1.115949999999999998e+00 -3.403125000000000000e+01 +1.115955000000000030e+00 -3.396875000000000000e+01 +1.115960000000000063e+00 -3.400000000000000000e+01 +1.115965000000000096e+00 -3.390625000000000000e+01 +1.115970000000000129e+00 -3.393750000000000000e+01 +1.115975000000000161e+00 -3.400000000000000000e+01 +1.115980000000000194e+00 -3.393750000000000000e+01 +1.115985000000000005e+00 -3.400000000000000000e+01 +1.115990000000000038e+00 -3.393750000000000000e+01 +1.115995000000000070e+00 -3.396875000000000000e+01 +1.116000000000000103e+00 -3.390625000000000000e+01 +1.116005000000000136e+00 -3.393750000000000000e+01 +1.116010000000000169e+00 -3.393750000000000000e+01 +1.116015000000000201e+00 -3.390625000000000000e+01 +1.116020000000000012e+00 -3.396875000000000000e+01 +1.116025000000000045e+00 -3.403125000000000000e+01 +1.116030000000000078e+00 -3.390625000000000000e+01 +1.116035000000000110e+00 -3.387500000000000000e+01 +1.116040000000000143e+00 -3.393750000000000000e+01 +1.116045000000000176e+00 -3.400000000000000000e+01 +1.116049999999999986e+00 -3.390625000000000000e+01 +1.116055000000000019e+00 -3.393750000000000000e+01 +1.116060000000000052e+00 -3.396875000000000000e+01 +1.116065000000000085e+00 -3.393750000000000000e+01 +1.116070000000000118e+00 -3.390625000000000000e+01 +1.116075000000000150e+00 -3.390625000000000000e+01 +1.116080000000000183e+00 -3.384375381469726562e+01 +1.116084999999999994e+00 -3.387500000000000000e+01 +1.116090000000000027e+00 -3.387500000000000000e+01 +1.116095000000000059e+00 -3.390625000000000000e+01 +1.116100000000000092e+00 -3.393750000000000000e+01 +1.116105000000000125e+00 -3.384375381469726562e+01 +1.116110000000000158e+00 -3.384375381469726562e+01 +1.116115000000000190e+00 -3.381250000000000000e+01 +1.116120000000000001e+00 -3.384375381469726562e+01 +1.116125000000000034e+00 -3.384375381469726562e+01 +1.116130000000000067e+00 -3.381250000000000000e+01 +1.116135000000000099e+00 -3.384375381469726562e+01 +1.116140000000000132e+00 -3.384375381469726562e+01 +1.116145000000000165e+00 -3.378125000000000000e+01 +1.116150000000000198e+00 -3.381250000000000000e+01 +1.116155000000000008e+00 -3.375000000000000000e+01 +1.116160000000000041e+00 -3.378125000000000000e+01 +1.116165000000000074e+00 -3.375000000000000000e+01 +1.116170000000000107e+00 -3.378125000000000000e+01 +1.116175000000000139e+00 -3.378125000000000000e+01 +1.116180000000000172e+00 -3.378125000000000000e+01 +1.116184999999999983e+00 -3.375000000000000000e+01 +1.116190000000000015e+00 -3.375000000000000000e+01 +1.116195000000000048e+00 -3.378125000000000000e+01 +1.116200000000000081e+00 -3.381250000000000000e+01 +1.116205000000000114e+00 -3.375000000000000000e+01 +1.116210000000000147e+00 -3.378125000000000000e+01 +1.116215000000000179e+00 -3.381250000000000000e+01 +1.116219999999999990e+00 -3.378125000000000000e+01 +1.116225000000000023e+00 -3.381250000000000000e+01 +1.116230000000000055e+00 -3.378125000000000000e+01 +1.116235000000000088e+00 -3.378125000000000000e+01 +1.116240000000000121e+00 -3.378125000000000000e+01 +1.116245000000000154e+00 -3.378125000000000000e+01 +1.116250000000000187e+00 -3.378125000000000000e+01 +1.116254999999999997e+00 -3.381250000000000000e+01 +1.116260000000000030e+00 -3.381250000000000000e+01 +1.116265000000000063e+00 -3.384375381469726562e+01 +1.116270000000000095e+00 -3.378125000000000000e+01 +1.116275000000000128e+00 -3.378125000000000000e+01 +1.116280000000000161e+00 -3.384375381469726562e+01 +1.116285000000000194e+00 -3.384375381469726562e+01 +1.116290000000000004e+00 -3.378125000000000000e+01 +1.116295000000000037e+00 -3.381250000000000000e+01 +1.116300000000000070e+00 -3.384375381469726562e+01 +1.116305000000000103e+00 -3.384375381469726562e+01 +1.116310000000000136e+00 -3.378125000000000000e+01 +1.116315000000000168e+00 -3.381250000000000000e+01 +1.116320000000000201e+00 -3.384375381469726562e+01 +1.116325000000000012e+00 -3.384375381469726562e+01 +1.116330000000000044e+00 -3.384375381469726562e+01 +1.116335000000000077e+00 -3.378125000000000000e+01 +1.116340000000000110e+00 -3.387500000000000000e+01 +1.116345000000000143e+00 -3.375000000000000000e+01 +1.116350000000000176e+00 -3.378125000000000000e+01 +1.116354999999999986e+00 -3.378125000000000000e+01 +1.116360000000000019e+00 -3.381250000000000000e+01 +1.116365000000000052e+00 -3.375000000000000000e+01 +1.116370000000000084e+00 -3.378125000000000000e+01 +1.116375000000000117e+00 -3.378125000000000000e+01 +1.116380000000000150e+00 -3.371875000000000000e+01 +1.116385000000000183e+00 -3.371875000000000000e+01 +1.116389999999999993e+00 -3.375000000000000000e+01 +1.116395000000000026e+00 -3.371875000000000000e+01 +1.116400000000000059e+00 -3.368750381469726562e+01 +1.116405000000000092e+00 -3.375000000000000000e+01 +1.116410000000000124e+00 -3.378125000000000000e+01 +1.116415000000000157e+00 -3.378125000000000000e+01 +1.116420000000000190e+00 -3.378125000000000000e+01 +1.116425000000000001e+00 -3.371875000000000000e+01 +1.116430000000000033e+00 -3.368750381469726562e+01 +1.116435000000000066e+00 -3.365625000000000000e+01 +1.116440000000000099e+00 -3.371875000000000000e+01 +1.116445000000000132e+00 -3.378125000000000000e+01 +1.116450000000000164e+00 -3.378125000000000000e+01 +1.116455000000000197e+00 -3.371875000000000000e+01 +1.116460000000000008e+00 -3.371875000000000000e+01 +1.116465000000000041e+00 -3.375000000000000000e+01 +1.116470000000000073e+00 -3.371875000000000000e+01 +1.116475000000000106e+00 -3.371875000000000000e+01 +1.116480000000000139e+00 -3.371875000000000000e+01 +1.116485000000000172e+00 -3.375000000000000000e+01 +1.116489999999999982e+00 -3.371875000000000000e+01 +1.116495000000000015e+00 -3.375000000000000000e+01 +1.116500000000000048e+00 -3.368750381469726562e+01 +1.116505000000000081e+00 -3.368750381469726562e+01 +1.116510000000000113e+00 -3.362500000000000000e+01 +1.116515000000000146e+00 -3.362500000000000000e+01 +1.116520000000000179e+00 -3.365625000000000000e+01 +1.116524999999999990e+00 -3.362500000000000000e+01 +1.116530000000000022e+00 -3.362500000000000000e+01 +1.116535000000000055e+00 -3.362500000000000000e+01 +1.116540000000000088e+00 -3.365625000000000000e+01 +1.116545000000000121e+00 -3.362500000000000000e+01 +1.116550000000000153e+00 -3.359375000000000000e+01 +1.116555000000000186e+00 -3.362500000000000000e+01 +1.116559999999999997e+00 -3.359375000000000000e+01 +1.116565000000000030e+00 -3.356250000000000000e+01 +1.116570000000000062e+00 -3.362500000000000000e+01 +1.116575000000000095e+00 -3.365625000000000000e+01 +1.116580000000000128e+00 -3.362500000000000000e+01 +1.116585000000000161e+00 -3.359375000000000000e+01 +1.116590000000000193e+00 -3.362500000000000000e+01 +1.116595000000000004e+00 -3.353125381469726562e+01 +1.116600000000000037e+00 -3.356250000000000000e+01 +1.116605000000000070e+00 -3.362500000000000000e+01 +1.116610000000000102e+00 -3.365625000000000000e+01 +1.116615000000000135e+00 -3.365625000000000000e+01 +1.116620000000000168e+00 -3.359375000000000000e+01 +1.116625000000000201e+00 -3.365625000000000000e+01 +1.116630000000000011e+00 -3.368750381469726562e+01 +1.116635000000000044e+00 -3.365625000000000000e+01 +1.116640000000000077e+00 -3.359375000000000000e+01 +1.116645000000000110e+00 -3.356250000000000000e+01 +1.116650000000000142e+00 -3.359375000000000000e+01 +1.116655000000000175e+00 -3.365625000000000000e+01 +1.116659999999999986e+00 -3.359375000000000000e+01 +1.116665000000000019e+00 -3.359375000000000000e+01 +1.116670000000000051e+00 -3.359375000000000000e+01 +1.116675000000000084e+00 -3.359375000000000000e+01 +1.116680000000000117e+00 -3.362500000000000000e+01 +1.116685000000000150e+00 -3.359375000000000000e+01 +1.116690000000000182e+00 -3.359375000000000000e+01 +1.116694999999999993e+00 -3.362500000000000000e+01 +1.116700000000000026e+00 -3.362500000000000000e+01 +1.116705000000000059e+00 -3.353125381469726562e+01 +1.116710000000000091e+00 -3.356250000000000000e+01 +1.116715000000000124e+00 -3.356250000000000000e+01 +1.116720000000000157e+00 -3.353125381469726562e+01 +1.116725000000000190e+00 -3.350000000000000000e+01 +1.116730000000000000e+00 -3.350000000000000000e+01 +1.116735000000000033e+00 -3.353125381469726562e+01 +1.116740000000000066e+00 -3.353125381469726562e+01 +1.116745000000000099e+00 -3.350000000000000000e+01 +1.116750000000000131e+00 -3.353125381469726562e+01 +1.116755000000000164e+00 -3.353125381469726562e+01 +1.116760000000000197e+00 -3.343750000000000000e+01 +1.116765000000000008e+00 -3.350000000000000000e+01 +1.116770000000000040e+00 -3.350000000000000000e+01 +1.116775000000000073e+00 -3.350000000000000000e+01 +1.116780000000000106e+00 -3.350000000000000000e+01 +1.116785000000000139e+00 -3.350000000000000000e+01 +1.116790000000000171e+00 -3.356250000000000000e+01 +1.116794999999999982e+00 -3.350000000000000000e+01 +1.116800000000000015e+00 -3.350000000000000000e+01 +1.116805000000000048e+00 -3.350000000000000000e+01 +1.116810000000000080e+00 -3.346875000000000000e+01 +1.116815000000000113e+00 -3.350000000000000000e+01 +1.116820000000000146e+00 -3.350000000000000000e+01 +1.116825000000000179e+00 -3.350000000000000000e+01 +1.116829999999999989e+00 -3.353125381469726562e+01 +1.116835000000000022e+00 -3.353125381469726562e+01 +1.116840000000000055e+00 -3.350000000000000000e+01 +1.116845000000000088e+00 -3.346875000000000000e+01 +1.116850000000000120e+00 -3.353125381469726562e+01 +1.116855000000000153e+00 -3.353125381469726562e+01 +1.116860000000000186e+00 -3.350000000000000000e+01 +1.116864999999999997e+00 -3.353125381469726562e+01 +1.116870000000000029e+00 -3.353125381469726562e+01 +1.116875000000000062e+00 -3.350000000000000000e+01 +1.116880000000000095e+00 -3.350000000000000000e+01 +1.116885000000000128e+00 -3.350000000000000000e+01 +1.116890000000000160e+00 -3.346875000000000000e+01 +1.116895000000000193e+00 -3.350000000000000000e+01 +1.116900000000000004e+00 -3.353125381469726562e+01 +1.116905000000000037e+00 -3.346875000000000000e+01 +1.116910000000000069e+00 -3.350000000000000000e+01 +1.116915000000000102e+00 -3.350000000000000000e+01 +1.116920000000000135e+00 -3.350000000000000000e+01 +1.116925000000000168e+00 -3.350000000000000000e+01 +1.116930000000000200e+00 -3.350000000000000000e+01 +1.116935000000000011e+00 -3.350000000000000000e+01 +1.116940000000000044e+00 -3.353125381469726562e+01 +1.116945000000000077e+00 -3.346875000000000000e+01 +1.116950000000000109e+00 -3.343750000000000000e+01 +1.116955000000000142e+00 -3.346875000000000000e+01 +1.116960000000000175e+00 -3.343750000000000000e+01 +1.116964999999999986e+00 -3.350000000000000000e+01 +1.116970000000000018e+00 -3.350000000000000000e+01 +1.116975000000000051e+00 -3.346875000000000000e+01 +1.116980000000000084e+00 -3.340625000000000000e+01 +1.116985000000000117e+00 -3.343750000000000000e+01 +1.116990000000000149e+00 -3.350000000000000000e+01 +1.116995000000000182e+00 -3.343750000000000000e+01 +1.116999999999999993e+00 -3.350000000000000000e+01 +1.117005000000000026e+00 -3.340625000000000000e+01 +1.117010000000000058e+00 -3.343750000000000000e+01 +1.117015000000000091e+00 -3.343750000000000000e+01 +1.117020000000000124e+00 -3.343750000000000000e+01 +1.117025000000000157e+00 -3.350000000000000000e+01 +1.117030000000000189e+00 -3.343750000000000000e+01 +1.117035000000000000e+00 -3.340625000000000000e+01 +1.117040000000000033e+00 -3.337500381469726562e+01 +1.117045000000000066e+00 -3.340625000000000000e+01 +1.117050000000000098e+00 -3.337500381469726562e+01 +1.117055000000000131e+00 -3.337500381469726562e+01 +1.117060000000000164e+00 -3.337500381469726562e+01 +1.117065000000000197e+00 -3.334375000000000000e+01 +1.117070000000000007e+00 -3.337500381469726562e+01 +1.117075000000000040e+00 -3.337500381469726562e+01 +1.117080000000000073e+00 -3.340625000000000000e+01 +1.117085000000000106e+00 -3.334375000000000000e+01 +1.117090000000000138e+00 -3.331250000000000000e+01 +1.117095000000000171e+00 -3.331250000000000000e+01 +1.117099999999999982e+00 -3.331250000000000000e+01 +1.117105000000000015e+00 -3.331250000000000000e+01 +1.117110000000000047e+00 -3.334375000000000000e+01 +1.117115000000000080e+00 -3.334375000000000000e+01 +1.117120000000000113e+00 -3.328125000000000000e+01 +1.117125000000000146e+00 -3.328125000000000000e+01 +1.117130000000000178e+00 -3.328125000000000000e+01 +1.117134999999999989e+00 -3.328125000000000000e+01 +1.117140000000000022e+00 -3.328125000000000000e+01 +1.117145000000000055e+00 -3.328125000000000000e+01 +1.117150000000000087e+00 -3.331250000000000000e+01 +1.117155000000000120e+00 -3.328125000000000000e+01 +1.117160000000000153e+00 -3.328125000000000000e+01 +1.117165000000000186e+00 -3.331250000000000000e+01 +1.117169999999999996e+00 -3.318750000000000000e+01 +1.117175000000000029e+00 -3.325000000000000000e+01 +1.117180000000000062e+00 -3.331250000000000000e+01 +1.117185000000000095e+00 -3.321875381469726562e+01 +1.117190000000000127e+00 -3.321875381469726562e+01 +1.117195000000000160e+00 -3.321875381469726562e+01 +1.117200000000000193e+00 -3.318750000000000000e+01 +1.117205000000000004e+00 -3.321875381469726562e+01 +1.117210000000000036e+00 -3.328125000000000000e+01 +1.117215000000000069e+00 -3.321875381469726562e+01 +1.117220000000000102e+00 -3.318750000000000000e+01 +1.117225000000000135e+00 -3.315625000000000000e+01 +1.117230000000000167e+00 -3.315625000000000000e+01 +1.117235000000000200e+00 -3.321875381469726562e+01 +1.117240000000000011e+00 -3.321875381469726562e+01 +1.117245000000000044e+00 -3.325000000000000000e+01 +1.117250000000000076e+00 -3.321875381469726562e+01 +1.117255000000000109e+00 -3.318750000000000000e+01 +1.117260000000000142e+00 -3.318750000000000000e+01 +1.117265000000000175e+00 -3.318750000000000000e+01 +1.117269999999999985e+00 -3.321875381469726562e+01 +1.117275000000000018e+00 -3.315625000000000000e+01 +1.117280000000000051e+00 -3.315625000000000000e+01 +1.117285000000000084e+00 -3.318750000000000000e+01 +1.117290000000000116e+00 -3.318750000000000000e+01 +1.117295000000000149e+00 -3.315625000000000000e+01 +1.117300000000000182e+00 -3.315625000000000000e+01 +1.117304999999999993e+00 -3.315625000000000000e+01 +1.117310000000000025e+00 -3.315625000000000000e+01 +1.117315000000000058e+00 -3.315625000000000000e+01 +1.117320000000000091e+00 -3.315625000000000000e+01 +1.117325000000000124e+00 -3.315625000000000000e+01 +1.117330000000000156e+00 -3.315625000000000000e+01 +1.117335000000000189e+00 -3.312500381469726562e+01 +1.117340000000000000e+00 -3.309375000000000000e+01 +1.117345000000000033e+00 -3.309375000000000000e+01 +1.117350000000000065e+00 -3.309375000000000000e+01 +1.117355000000000098e+00 -3.315625000000000000e+01 +1.117360000000000131e+00 -3.309375000000000000e+01 +1.117365000000000164e+00 -3.312500381469726562e+01 +1.117370000000000196e+00 -3.315625000000000000e+01 +1.117375000000000007e+00 -3.312500381469726562e+01 +1.117380000000000040e+00 -3.309375000000000000e+01 +1.117385000000000073e+00 -3.312500381469726562e+01 +1.117390000000000105e+00 -3.306250000000000000e+01 +1.117395000000000138e+00 -3.309375000000000000e+01 +1.117400000000000171e+00 -3.315625000000000000e+01 +1.117404999999999982e+00 -3.312500381469726562e+01 +1.117410000000000014e+00 -3.312500381469726562e+01 +1.117415000000000047e+00 -3.309375000000000000e+01 +1.117420000000000080e+00 -3.318750000000000000e+01 +1.117425000000000113e+00 -3.309375000000000000e+01 +1.117430000000000145e+00 -3.309375000000000000e+01 +1.117435000000000178e+00 -3.309375000000000000e+01 +1.117439999999999989e+00 -3.312500381469726562e+01 +1.117445000000000022e+00 -3.309375000000000000e+01 +1.117450000000000054e+00 -3.315625000000000000e+01 +1.117455000000000087e+00 -3.315625000000000000e+01 +1.117460000000000120e+00 -3.315625000000000000e+01 +1.117465000000000153e+00 -3.315625000000000000e+01 +1.117470000000000185e+00 -3.315625000000000000e+01 +1.117474999999999996e+00 -3.312500381469726562e+01 +1.117480000000000029e+00 -3.312500381469726562e+01 +1.117485000000000062e+00 -3.315625000000000000e+01 +1.117490000000000094e+00 -3.309375000000000000e+01 +1.117495000000000127e+00 -3.309375000000000000e+01 +1.117500000000000160e+00 -3.312500381469726562e+01 +1.117505000000000193e+00 -3.309375000000000000e+01 +1.117510000000000003e+00 -3.306250000000000000e+01 +1.117515000000000036e+00 -3.303125000000000000e+01 +1.117520000000000069e+00 -3.303125000000000000e+01 +1.117525000000000102e+00 -3.303125000000000000e+01 +1.117530000000000134e+00 -3.303125000000000000e+01 +1.117535000000000167e+00 -3.303125000000000000e+01 +1.117540000000000200e+00 -3.300000000000000000e+01 +1.117545000000000011e+00 -3.300000000000000000e+01 +1.117550000000000043e+00 -3.303125000000000000e+01 +1.117555000000000076e+00 -3.303125000000000000e+01 +1.117560000000000109e+00 -3.300000000000000000e+01 +1.117565000000000142e+00 -3.300000000000000000e+01 +1.117570000000000174e+00 -3.300000000000000000e+01 +1.117574999999999985e+00 -3.300000000000000000e+01 +1.117580000000000018e+00 -3.303125000000000000e+01 +1.117585000000000051e+00 -3.303125000000000000e+01 +1.117590000000000083e+00 -3.300000000000000000e+01 +1.117595000000000116e+00 -3.300000000000000000e+01 +1.117600000000000149e+00 -3.300000000000000000e+01 +1.117605000000000182e+00 -3.300000000000000000e+01 +1.117609999999999992e+00 -3.296875381469726562e+01 +1.117615000000000025e+00 -3.300000000000000000e+01 +1.117620000000000058e+00 -3.303125000000000000e+01 +1.117625000000000091e+00 -3.303125000000000000e+01 +1.117630000000000123e+00 -3.300000000000000000e+01 +1.117635000000000156e+00 -3.296875381469726562e+01 +1.117640000000000189e+00 -3.300000000000000000e+01 +1.117645000000000000e+00 -3.296875381469726562e+01 +1.117650000000000032e+00 -3.296875381469726562e+01 +1.117655000000000065e+00 -3.300000000000000000e+01 +1.117660000000000098e+00 -3.296875381469726562e+01 +1.117665000000000131e+00 -3.296875381469726562e+01 +1.117670000000000163e+00 -3.293750000000000000e+01 +1.117675000000000196e+00 -3.296875381469726562e+01 +1.117680000000000007e+00 -3.296875381469726562e+01 +1.117685000000000040e+00 -3.290625000000000000e+01 +1.117690000000000072e+00 -3.293750000000000000e+01 +1.117695000000000105e+00 -3.290625000000000000e+01 +1.117700000000000138e+00 -3.293750000000000000e+01 +1.117705000000000171e+00 -3.290625000000000000e+01 +1.117709999999999981e+00 -3.287500000000000000e+01 +1.117715000000000014e+00 -3.290625000000000000e+01 +1.117720000000000047e+00 -3.284375000000000000e+01 +1.117725000000000080e+00 -3.290625000000000000e+01 +1.117730000000000112e+00 -3.281250381469726562e+01 +1.117735000000000145e+00 -3.284375000000000000e+01 +1.117740000000000178e+00 -3.284375000000000000e+01 +1.117744999999999989e+00 -3.284375000000000000e+01 +1.117750000000000021e+00 -3.278125000000000000e+01 +1.117755000000000054e+00 -3.278125000000000000e+01 +1.117760000000000087e+00 -3.281250381469726562e+01 +1.117765000000000120e+00 -3.281250381469726562e+01 +1.117770000000000152e+00 -3.278125000000000000e+01 +1.117775000000000185e+00 -3.275000000000000000e+01 +1.117779999999999996e+00 -3.278125000000000000e+01 +1.117785000000000029e+00 -3.278125000000000000e+01 +1.117790000000000061e+00 -3.278125000000000000e+01 +1.117795000000000094e+00 -3.281250381469726562e+01 +1.117800000000000127e+00 -3.271875000000000000e+01 +1.117805000000000160e+00 -3.281250381469726562e+01 +1.117810000000000192e+00 -3.278125000000000000e+01 +1.117815000000000003e+00 -3.281250381469726562e+01 +1.117820000000000036e+00 -3.278125000000000000e+01 +1.117825000000000069e+00 -3.278125000000000000e+01 +1.117830000000000101e+00 -3.278125000000000000e+01 +1.117835000000000134e+00 -3.275000000000000000e+01 +1.117840000000000167e+00 -3.275000000000000000e+01 +1.117845000000000200e+00 -3.278125000000000000e+01 +1.117850000000000010e+00 -3.265625381469726562e+01 +1.117855000000000043e+00 -3.275000000000000000e+01 +1.117860000000000076e+00 -3.271875000000000000e+01 +1.117865000000000109e+00 -3.278125000000000000e+01 +1.117870000000000141e+00 -3.275000000000000000e+01 +1.117875000000000174e+00 -3.271875000000000000e+01 +1.117879999999999985e+00 -3.275000000000000000e+01 +1.117885000000000018e+00 -3.275000000000000000e+01 +1.117890000000000050e+00 -3.271875000000000000e+01 +1.117895000000000083e+00 -3.275000000000000000e+01 +1.117900000000000116e+00 -3.275000000000000000e+01 +1.117905000000000149e+00 -3.268750000000000000e+01 +1.117910000000000181e+00 -3.265625381469726562e+01 +1.117914999999999992e+00 -3.271875000000000000e+01 +1.117920000000000025e+00 -3.271875000000000000e+01 +1.117925000000000058e+00 -3.268750000000000000e+01 +1.117930000000000090e+00 -3.271875000000000000e+01 +1.117935000000000123e+00 -3.265625381469726562e+01 +1.117940000000000156e+00 -3.265625381469726562e+01 +1.117945000000000189e+00 -3.265625381469726562e+01 +1.117949999999999999e+00 -3.262500000000000000e+01 +1.117955000000000032e+00 -3.262500000000000000e+01 +1.117960000000000065e+00 -3.265625381469726562e+01 +1.117965000000000098e+00 -3.265625381469726562e+01 +1.117970000000000130e+00 -3.265625381469726562e+01 +1.117975000000000163e+00 -3.265625381469726562e+01 +1.117980000000000196e+00 -3.259375000000000000e+01 +1.117985000000000007e+00 -3.259375000000000000e+01 +1.117990000000000039e+00 -3.256250000000000000e+01 +1.117995000000000072e+00 -3.262500000000000000e+01 +1.118000000000000105e+00 -3.256250000000000000e+01 +1.118005000000000138e+00 -3.259375000000000000e+01 +1.118010000000000170e+00 -3.262500000000000000e+01 +1.118014999999999981e+00 -3.256250000000000000e+01 +1.118020000000000014e+00 -3.256250000000000000e+01 +1.118025000000000047e+00 -3.253125000000000000e+01 +1.118030000000000079e+00 -3.265625381469726562e+01 +1.118035000000000112e+00 -3.253125000000000000e+01 +1.118040000000000145e+00 -3.256250000000000000e+01 +1.118045000000000178e+00 -3.256250000000000000e+01 +1.118049999999999988e+00 -3.256250000000000000e+01 +1.118055000000000021e+00 -3.259375000000000000e+01 +1.118060000000000054e+00 -3.256250000000000000e+01 +1.118065000000000087e+00 -3.256250000000000000e+01 +1.118070000000000119e+00 -3.256250000000000000e+01 +1.118075000000000152e+00 -3.253125000000000000e+01 +1.118080000000000185e+00 -3.246875000000000000e+01 +1.118084999999999996e+00 -3.256250000000000000e+01 +1.118090000000000028e+00 -3.246875000000000000e+01 +1.118095000000000061e+00 -3.253125000000000000e+01 +1.118100000000000094e+00 -3.246875000000000000e+01 +1.118105000000000127e+00 -3.246875000000000000e+01 +1.118110000000000159e+00 -3.243750000000000000e+01 +1.118115000000000192e+00 -3.250000381469726562e+01 +1.118120000000000003e+00 -3.250000381469726562e+01 +1.118125000000000036e+00 -3.243750000000000000e+01 +1.118130000000000068e+00 -3.243750000000000000e+01 +1.118135000000000101e+00 -3.250000381469726562e+01 +1.118140000000000134e+00 -3.253125000000000000e+01 +1.118145000000000167e+00 -3.243750000000000000e+01 +1.118150000000000199e+00 -3.246875000000000000e+01 +1.118155000000000010e+00 -3.250000381469726562e+01 +1.118160000000000043e+00 -3.246875000000000000e+01 +1.118165000000000076e+00 -3.246875000000000000e+01 +1.118170000000000108e+00 -3.240625000000000000e+01 +1.118175000000000141e+00 -3.243750000000000000e+01 +1.118180000000000174e+00 -3.240625000000000000e+01 +1.118184999999999985e+00 -3.243750000000000000e+01 +1.118190000000000017e+00 -3.240625000000000000e+01 +1.118195000000000050e+00 -3.246875000000000000e+01 +1.118200000000000083e+00 -3.243750000000000000e+01 +1.118205000000000116e+00 -3.240625000000000000e+01 +1.118210000000000148e+00 -3.240625000000000000e+01 +1.118215000000000181e+00 -3.231250000000000000e+01 +1.118219999999999992e+00 -3.234375000000000000e+01 +1.118225000000000025e+00 -3.228125000000000000e+01 +1.118230000000000057e+00 -3.240625000000000000e+01 +1.118235000000000090e+00 -3.234375000000000000e+01 +1.118240000000000123e+00 -3.240625000000000000e+01 +1.118245000000000156e+00 -3.234375000000000000e+01 +1.118250000000000188e+00 -3.243750000000000000e+01 +1.118254999999999999e+00 -3.240625000000000000e+01 +1.118260000000000032e+00 -3.234375000000000000e+01 +1.118265000000000065e+00 -3.237500000000000000e+01 +1.118270000000000097e+00 -3.237500000000000000e+01 +1.118275000000000130e+00 -3.237500000000000000e+01 +1.118280000000000163e+00 -3.234375000000000000e+01 +1.118285000000000196e+00 -3.231250000000000000e+01 +1.118290000000000006e+00 -3.231250000000000000e+01 +1.118295000000000039e+00 -3.228125000000000000e+01 +1.118300000000000072e+00 -3.228125000000000000e+01 +1.118305000000000105e+00 -3.231250000000000000e+01 +1.118310000000000137e+00 -3.228125000000000000e+01 +1.118315000000000170e+00 -3.231250000000000000e+01 +1.118319999999999981e+00 -3.231250000000000000e+01 +1.118325000000000014e+00 -3.231250000000000000e+01 +1.118330000000000046e+00 -3.225000381469726562e+01 +1.118335000000000079e+00 -3.225000381469726562e+01 +1.118340000000000112e+00 -3.228125000000000000e+01 +1.118345000000000145e+00 -3.228125000000000000e+01 +1.118350000000000177e+00 -3.225000381469726562e+01 +1.118354999999999988e+00 -3.228125000000000000e+01 +1.118360000000000021e+00 -3.221875000000000000e+01 +1.118365000000000054e+00 -3.231250000000000000e+01 +1.118370000000000086e+00 -3.221875000000000000e+01 +1.118375000000000119e+00 -3.228125000000000000e+01 +1.118380000000000152e+00 -3.221875000000000000e+01 +1.118385000000000185e+00 -3.221875000000000000e+01 +1.118389999999999995e+00 -3.221875000000000000e+01 +1.118395000000000028e+00 -3.228125000000000000e+01 +1.118400000000000061e+00 -3.221875000000000000e+01 +1.118405000000000094e+00 -3.228125000000000000e+01 +1.118410000000000126e+00 -3.221875000000000000e+01 +1.118415000000000159e+00 -3.221875000000000000e+01 +1.118420000000000192e+00 -3.218750000000000000e+01 +1.118425000000000002e+00 -3.228125000000000000e+01 +1.118430000000000035e+00 -3.225000381469726562e+01 +1.118435000000000068e+00 -3.221875000000000000e+01 +1.118440000000000101e+00 -3.221875000000000000e+01 +1.118445000000000134e+00 -3.218750000000000000e+01 +1.118450000000000166e+00 -3.221875000000000000e+01 +1.118455000000000199e+00 -3.221875000000000000e+01 +1.118460000000000010e+00 -3.212500000000000000e+01 +1.118465000000000042e+00 -3.215625000000000000e+01 +1.118470000000000075e+00 -3.215625000000000000e+01 +1.118475000000000108e+00 -3.212500000000000000e+01 +1.118480000000000141e+00 -3.221875000000000000e+01 +1.118485000000000174e+00 -3.221875000000000000e+01 +1.118489999999999984e+00 -3.215625000000000000e+01 +1.118495000000000017e+00 -3.218750000000000000e+01 +1.118500000000000050e+00 -3.215625000000000000e+01 +1.118505000000000082e+00 -3.218750000000000000e+01 +1.118510000000000115e+00 -3.209375381469726562e+01 +1.118515000000000148e+00 -3.218750000000000000e+01 +1.118520000000000181e+00 -3.215625000000000000e+01 +1.118524999999999991e+00 -3.215625000000000000e+01 +1.118530000000000024e+00 -3.212500000000000000e+01 +1.118535000000000057e+00 -3.209375381469726562e+01 +1.118540000000000090e+00 -3.209375381469726562e+01 +1.118545000000000122e+00 -3.212500000000000000e+01 +1.118550000000000155e+00 -3.206250000000000000e+01 +1.118555000000000188e+00 -3.206250000000000000e+01 +1.118559999999999999e+00 -3.209375381469726562e+01 +1.118565000000000031e+00 -3.206250000000000000e+01 +1.118570000000000064e+00 -3.212500000000000000e+01 +1.118575000000000097e+00 -3.209375381469726562e+01 +1.118580000000000130e+00 -3.209375381469726562e+01 +1.118585000000000163e+00 -3.203125000000000000e+01 +1.118590000000000195e+00 -3.209375381469726562e+01 +1.118595000000000006e+00 -3.206250000000000000e+01 +1.118600000000000039e+00 -3.206250000000000000e+01 +1.118605000000000071e+00 -3.209375381469726562e+01 +1.118610000000000104e+00 -3.209375381469726562e+01 +1.118615000000000137e+00 -3.206250000000000000e+01 +1.118620000000000170e+00 -3.203125000000000000e+01 +1.118625000000000203e+00 -3.203125000000000000e+01 +1.118630000000000013e+00 -3.203125000000000000e+01 +1.118635000000000046e+00 -3.200000000000000000e+01 +1.118640000000000079e+00 -3.203125000000000000e+01 +1.118645000000000111e+00 -3.203125000000000000e+01 +1.118650000000000144e+00 -3.203125000000000000e+01 +1.118655000000000177e+00 -3.203125000000000000e+01 +1.118659999999999988e+00 -3.193750190734863281e+01 +1.118665000000000020e+00 -3.203125000000000000e+01 +1.118670000000000053e+00 -3.203125000000000000e+01 +1.118675000000000086e+00 -3.200000000000000000e+01 +1.118680000000000119e+00 -3.200000000000000000e+01 +1.118685000000000151e+00 -3.196875000000000000e+01 +1.118690000000000184e+00 -3.193750190734863281e+01 +1.118694999999999995e+00 -3.203125000000000000e+01 +1.118700000000000028e+00 -3.203125000000000000e+01 +1.118705000000000060e+00 -3.196875000000000000e+01 +1.118710000000000093e+00 -3.203125000000000000e+01 +1.118715000000000126e+00 -3.193750190734863281e+01 +1.118720000000000159e+00 -3.200000000000000000e+01 +1.118725000000000191e+00 -3.193750190734863281e+01 +1.118730000000000002e+00 -3.184375190734863281e+01 +1.118735000000000035e+00 -3.193750190734863281e+01 +1.118740000000000068e+00 -3.190625000000000000e+01 +1.118745000000000100e+00 -3.196875000000000000e+01 +1.118750000000000133e+00 -3.196875000000000000e+01 +1.118755000000000166e+00 -3.190625000000000000e+01 +1.118760000000000199e+00 -3.190625000000000000e+01 +1.118765000000000009e+00 -3.190625000000000000e+01 +1.118770000000000042e+00 -3.190625000000000000e+01 +1.118775000000000075e+00 -3.190625000000000000e+01 +1.118780000000000108e+00 -3.184375190734863281e+01 +1.118785000000000140e+00 -3.187500000000000000e+01 +1.118790000000000173e+00 -3.187500000000000000e+01 +1.118794999999999984e+00 -3.184375190734863281e+01 +1.118800000000000017e+00 -3.187500000000000000e+01 +1.118805000000000049e+00 -3.184375190734863281e+01 +1.118810000000000082e+00 -3.181250000000000000e+01 +1.118815000000000115e+00 -3.181250000000000000e+01 +1.118820000000000148e+00 -3.178125190734863281e+01 +1.118825000000000180e+00 -3.187500000000000000e+01 +1.118829999999999991e+00 -3.181250000000000000e+01 +1.118835000000000024e+00 -3.184375190734863281e+01 +1.118840000000000057e+00 -3.181250000000000000e+01 +1.118845000000000089e+00 -3.178125190734863281e+01 +1.118850000000000122e+00 -3.184375190734863281e+01 +1.118855000000000155e+00 -3.184375190734863281e+01 +1.118860000000000188e+00 -3.184375190734863281e+01 +1.118864999999999998e+00 -3.178125190734863281e+01 +1.118870000000000031e+00 -3.181250000000000000e+01 +1.118875000000000064e+00 -3.181250000000000000e+01 +1.118880000000000097e+00 -3.178125190734863281e+01 +1.118885000000000129e+00 -3.181250000000000000e+01 +1.118890000000000162e+00 -3.175000190734863281e+01 +1.118895000000000195e+00 -3.171875000000000000e+01 +1.118900000000000006e+00 -3.178125190734863281e+01 +1.118905000000000038e+00 -3.178125190734863281e+01 +1.118910000000000071e+00 -3.178125190734863281e+01 +1.118915000000000104e+00 -3.178125190734863281e+01 +1.118920000000000137e+00 -3.171875000000000000e+01 +1.118925000000000169e+00 -3.171875000000000000e+01 +1.118930000000000202e+00 -3.165625000000000000e+01 +1.118935000000000013e+00 -3.168750190734863281e+01 +1.118940000000000046e+00 -3.165625000000000000e+01 +1.118945000000000078e+00 -3.171875000000000000e+01 +1.118950000000000111e+00 -3.168750190734863281e+01 +1.118955000000000144e+00 -3.175000190734863281e+01 +1.118960000000000177e+00 -3.168750190734863281e+01 +1.118964999999999987e+00 -3.175000190734863281e+01 +1.118970000000000020e+00 -3.168750190734863281e+01 +1.118975000000000053e+00 -3.165625000000000000e+01 +1.118980000000000086e+00 -3.165625000000000000e+01 +1.118985000000000118e+00 -3.168750190734863281e+01 +1.118990000000000151e+00 -3.168750190734863281e+01 +1.118995000000000184e+00 -3.168750190734863281e+01 +1.118999999999999995e+00 -3.168750190734863281e+01 +1.119005000000000027e+00 -3.168750190734863281e+01 +1.119010000000000060e+00 -3.159375190734863281e+01 +1.119015000000000093e+00 -3.168750190734863281e+01 +1.119020000000000126e+00 -3.165625000000000000e+01 +1.119025000000000158e+00 -3.162499809265136719e+01 +1.119030000000000191e+00 -3.159375190734863281e+01 +1.119035000000000002e+00 -3.162499809265136719e+01 +1.119040000000000035e+00 -3.159375190734863281e+01 +1.119045000000000067e+00 -3.165625000000000000e+01 +1.119050000000000100e+00 -3.162499809265136719e+01 +1.119055000000000133e+00 -3.159375190734863281e+01 +1.119060000000000166e+00 -3.159375190734863281e+01 +1.119065000000000198e+00 -3.162499809265136719e+01 +1.119070000000000009e+00 -3.159375190734863281e+01 +1.119075000000000042e+00 -3.156250000000000000e+01 +1.119080000000000075e+00 -3.156250000000000000e+01 +1.119085000000000107e+00 -3.162499809265136719e+01 +1.119090000000000140e+00 -3.153125190734863281e+01 +1.119095000000000173e+00 -3.153125190734863281e+01 +1.119099999999999984e+00 -3.153125190734863281e+01 +1.119105000000000016e+00 -3.150000000000000000e+01 +1.119110000000000049e+00 -3.150000000000000000e+01 +1.119115000000000082e+00 -3.150000000000000000e+01 +1.119120000000000115e+00 -3.153125190734863281e+01 +1.119125000000000147e+00 -3.153125190734863281e+01 +1.119130000000000180e+00 -3.143750190734863281e+01 +1.119134999999999991e+00 -3.150000000000000000e+01 +1.119140000000000024e+00 -3.150000000000000000e+01 +1.119145000000000056e+00 -3.146875000000000000e+01 +1.119150000000000089e+00 -3.140625000000000000e+01 +1.119155000000000122e+00 -3.140625000000000000e+01 +1.119160000000000155e+00 -3.143750190734863281e+01 +1.119165000000000187e+00 -3.140625000000000000e+01 +1.119169999999999998e+00 -3.143750190734863281e+01 +1.119175000000000031e+00 -3.140625000000000000e+01 +1.119180000000000064e+00 -3.140625000000000000e+01 +1.119185000000000096e+00 -3.143750190734863281e+01 +1.119190000000000129e+00 -3.137500190734863281e+01 +1.119195000000000162e+00 -3.143750190734863281e+01 +1.119200000000000195e+00 -3.140625000000000000e+01 +1.119205000000000005e+00 -3.140625000000000000e+01 +1.119210000000000038e+00 -3.143750190734863281e+01 +1.119215000000000071e+00 -3.143750190734863281e+01 +1.119220000000000104e+00 -3.143750190734863281e+01 +1.119225000000000136e+00 -3.131250000000000000e+01 +1.119230000000000169e+00 -3.137500190734863281e+01 +1.119235000000000202e+00 -3.140625000000000000e+01 +1.119240000000000013e+00 -3.131250000000000000e+01 +1.119245000000000045e+00 -3.131250000000000000e+01 +1.119250000000000078e+00 -3.134375000000000000e+01 +1.119255000000000111e+00 -3.134375000000000000e+01 +1.119260000000000144e+00 -3.134375000000000000e+01 +1.119265000000000176e+00 -3.134375000000000000e+01 +1.119269999999999987e+00 -3.131250000000000000e+01 +1.119275000000000020e+00 -3.134375000000000000e+01 +1.119280000000000053e+00 -3.134375000000000000e+01 +1.119285000000000085e+00 -3.137500190734863281e+01 +1.119290000000000118e+00 -3.128125190734863281e+01 +1.119295000000000151e+00 -3.137500190734863281e+01 +1.119300000000000184e+00 -3.131250000000000000e+01 +1.119304999999999994e+00 -3.134375000000000000e+01 +1.119310000000000027e+00 -3.125000000000000000e+01 +1.119315000000000060e+00 -3.134375000000000000e+01 +1.119320000000000093e+00 -3.131250000000000000e+01 +1.119325000000000125e+00 -3.131250000000000000e+01 +1.119330000000000158e+00 -3.128125190734863281e+01 +1.119335000000000191e+00 -3.128125190734863281e+01 +1.119340000000000002e+00 -3.121875000000000000e+01 +1.119345000000000034e+00 -3.128125190734863281e+01 +1.119350000000000067e+00 -3.125000000000000000e+01 +1.119355000000000100e+00 -3.128125190734863281e+01 +1.119360000000000133e+00 -3.128125190734863281e+01 +1.119365000000000165e+00 -3.125000000000000000e+01 +1.119370000000000198e+00 -3.128125190734863281e+01 +1.119375000000000009e+00 -3.128125190734863281e+01 +1.119380000000000042e+00 -3.131250000000000000e+01 +1.119385000000000074e+00 -3.128125190734863281e+01 +1.119390000000000107e+00 -3.125000000000000000e+01 +1.119395000000000140e+00 -3.128125190734863281e+01 +1.119400000000000173e+00 -3.125000000000000000e+01 +1.119404999999999983e+00 -3.121875000000000000e+01 +1.119410000000000016e+00 -3.128125190734863281e+01 +1.119415000000000049e+00 -3.121875000000000000e+01 +1.119420000000000082e+00 -3.121875000000000000e+01 +1.119425000000000114e+00 -3.121875000000000000e+01 +1.119430000000000147e+00 -3.125000000000000000e+01 +1.119435000000000180e+00 -3.118750000000000000e+01 +1.119439999999999991e+00 -3.121875000000000000e+01 +1.119445000000000023e+00 -3.118750000000000000e+01 +1.119450000000000056e+00 -3.121875000000000000e+01 +1.119455000000000089e+00 -3.128125190734863281e+01 +1.119460000000000122e+00 -3.109375000000000000e+01 +1.119465000000000154e+00 -3.115625190734863281e+01 +1.119470000000000187e+00 -3.121875000000000000e+01 +1.119474999999999998e+00 -3.118750000000000000e+01 +1.119480000000000031e+00 -3.112500190734863281e+01 +1.119485000000000063e+00 -3.115625190734863281e+01 +1.119490000000000096e+00 -3.112500190734863281e+01 +1.119495000000000129e+00 -3.112500190734863281e+01 +1.119500000000000162e+00 -3.115625190734863281e+01 +1.119505000000000194e+00 -3.106250000000000000e+01 +1.119510000000000005e+00 -3.109375000000000000e+01 +1.119515000000000038e+00 -3.103125000000000000e+01 +1.119520000000000071e+00 -3.103125000000000000e+01 +1.119525000000000103e+00 -3.106250000000000000e+01 +1.119530000000000136e+00 -3.106250000000000000e+01 +1.119535000000000169e+00 -3.103125000000000000e+01 +1.119540000000000202e+00 -3.100000190734863281e+01 +1.119545000000000012e+00 -3.106250000000000000e+01 +1.119550000000000045e+00 -3.106250000000000000e+01 +1.119555000000000078e+00 -3.106250000000000000e+01 +1.119560000000000111e+00 -3.103125000000000000e+01 +1.119565000000000143e+00 -3.100000190734863281e+01 +1.119570000000000176e+00 -3.100000190734863281e+01 +1.119574999999999987e+00 -3.103125000000000000e+01 +1.119580000000000020e+00 -3.100000190734863281e+01 +1.119585000000000052e+00 -3.100000190734863281e+01 +1.119590000000000085e+00 -3.100000190734863281e+01 +1.119595000000000118e+00 -3.100000190734863281e+01 +1.119600000000000151e+00 -3.100000190734863281e+01 +1.119605000000000183e+00 -3.093750000000000000e+01 +1.119609999999999994e+00 -3.093750000000000000e+01 +1.119615000000000027e+00 -3.096875000000000000e+01 +1.119620000000000060e+00 -3.093750000000000000e+01 +1.119625000000000092e+00 -3.096875000000000000e+01 +1.119630000000000125e+00 -3.100000190734863281e+01 +1.119635000000000158e+00 -3.096875000000000000e+01 +1.119640000000000191e+00 -3.096875000000000000e+01 +1.119645000000000001e+00 -3.096875000000000000e+01 +1.119650000000000034e+00 -3.096875000000000000e+01 +1.119655000000000067e+00 -3.093750000000000000e+01 +1.119660000000000100e+00 -3.096875000000000000e+01 +1.119665000000000132e+00 -3.096875000000000000e+01 +1.119670000000000165e+00 -3.096875000000000000e+01 +1.119675000000000198e+00 -3.093750000000000000e+01 +1.119680000000000009e+00 -3.096875000000000000e+01 +1.119685000000000041e+00 -3.087500190734863281e+01 +1.119690000000000074e+00 -3.087500190734863281e+01 +1.119695000000000107e+00 -3.090625000000000000e+01 +1.119700000000000140e+00 -3.090625000000000000e+01 +1.119705000000000172e+00 -3.090625000000000000e+01 +1.119709999999999983e+00 -3.096875000000000000e+01 +1.119715000000000016e+00 -3.090625000000000000e+01 +1.119720000000000049e+00 -3.093750000000000000e+01 +1.119725000000000081e+00 -3.090625000000000000e+01 +1.119730000000000114e+00 -3.090625000000000000e+01 +1.119735000000000147e+00 -3.084375190734863281e+01 +1.119740000000000180e+00 -3.090625000000000000e+01 +1.119744999999999990e+00 -3.084375190734863281e+01 +1.119750000000000023e+00 -3.090625000000000000e+01 +1.119755000000000056e+00 -3.084375190734863281e+01 +1.119760000000000089e+00 -3.078125000000000000e+01 +1.119765000000000121e+00 -3.087500190734863281e+01 +1.119770000000000154e+00 -3.087500190734863281e+01 +1.119775000000000187e+00 -3.081250000000000000e+01 +1.119779999999999998e+00 -3.081250000000000000e+01 +1.119785000000000030e+00 -3.081250000000000000e+01 +1.119790000000000063e+00 -3.078125000000000000e+01 +1.119795000000000096e+00 -3.081250000000000000e+01 +1.119800000000000129e+00 -3.081250000000000000e+01 +1.119805000000000161e+00 -3.081250000000000000e+01 +1.119810000000000194e+00 -3.078125000000000000e+01 +1.119815000000000005e+00 -3.081250000000000000e+01 +1.119820000000000038e+00 -3.071875190734863281e+01 +1.119825000000000070e+00 -3.075000000000000000e+01 +1.119830000000000103e+00 -3.078125000000000000e+01 +1.119835000000000136e+00 -3.075000000000000000e+01 +1.119840000000000169e+00 -3.078125000000000000e+01 +1.119845000000000201e+00 -3.081250000000000000e+01 +1.119850000000000012e+00 -3.078125000000000000e+01 +1.119855000000000045e+00 -3.071875190734863281e+01 +1.119860000000000078e+00 -3.071875190734863281e+01 +1.119865000000000110e+00 -3.071875190734863281e+01 +1.119870000000000143e+00 -3.068750000000000000e+01 +1.119875000000000176e+00 -3.068750000000000000e+01 +1.119879999999999987e+00 -3.075000000000000000e+01 +1.119885000000000019e+00 -3.075000000000000000e+01 +1.119890000000000052e+00 -3.071875190734863281e+01 +1.119895000000000085e+00 -3.075000000000000000e+01 +1.119900000000000118e+00 -3.071875190734863281e+01 +1.119905000000000150e+00 -3.068750000000000000e+01 +1.119910000000000183e+00 -3.065625000000000000e+01 +1.119914999999999994e+00 -3.062500000000000000e+01 +1.119920000000000027e+00 -3.065625000000000000e+01 +1.119925000000000059e+00 -3.065625000000000000e+01 +1.119930000000000092e+00 -3.065625000000000000e+01 +1.119935000000000125e+00 -3.068750000000000000e+01 +1.119940000000000158e+00 -3.071875190734863281e+01 +1.119945000000000190e+00 -3.065625000000000000e+01 +1.119950000000000001e+00 -3.065625000000000000e+01 +1.119955000000000034e+00 -3.062500000000000000e+01 +1.119960000000000067e+00 -3.062500000000000000e+01 +1.119965000000000099e+00 -3.062500000000000000e+01 +1.119970000000000132e+00 -3.065625000000000000e+01 +1.119975000000000165e+00 -3.059375190734863281e+01 +1.119980000000000198e+00 -3.059375190734863281e+01 +1.119985000000000008e+00 -3.059375190734863281e+01 +1.119990000000000041e+00 -3.059375190734863281e+01 +1.119995000000000074e+00 -3.062500000000000000e+01 +1.120000000000000107e+00 -3.059375190734863281e+01 +1.120005000000000139e+00 -3.062500000000000000e+01 +1.120010000000000172e+00 -3.059375190734863281e+01 +1.120014999999999983e+00 -3.059375190734863281e+01 +1.120020000000000016e+00 -3.056250190734863281e+01 +1.120025000000000048e+00 -3.053125000000000000e+01 +1.120030000000000081e+00 -3.053125000000000000e+01 +1.120035000000000114e+00 -3.046875000000000000e+01 +1.120040000000000147e+00 -3.053125000000000000e+01 +1.120045000000000179e+00 -3.053125000000000000e+01 +1.120049999999999990e+00 -3.050000000000000000e+01 +1.120055000000000023e+00 -3.046875000000000000e+01 +1.120060000000000056e+00 -3.050000000000000000e+01 +1.120065000000000088e+00 -3.050000000000000000e+01 +1.120070000000000121e+00 -3.050000000000000000e+01 +1.120075000000000154e+00 -3.050000000000000000e+01 +1.120080000000000187e+00 -3.053125000000000000e+01 +1.120084999999999997e+00 -3.053125000000000000e+01 +1.120090000000000030e+00 -3.050000000000000000e+01 +1.120095000000000063e+00 -3.050000000000000000e+01 +1.120100000000000096e+00 -3.040625190734863281e+01 +1.120105000000000128e+00 -3.050000000000000000e+01 +1.120110000000000161e+00 -3.050000000000000000e+01 +1.120115000000000194e+00 -3.043750190734863281e+01 +1.120120000000000005e+00 -3.046875000000000000e+01 +1.120125000000000037e+00 -3.037500000000000000e+01 +1.120130000000000070e+00 -3.046875000000000000e+01 +1.120135000000000103e+00 -3.040625190734863281e+01 +1.120140000000000136e+00 -3.043750190734863281e+01 +1.120145000000000168e+00 -3.043750190734863281e+01 +1.120150000000000201e+00 -3.037500000000000000e+01 +1.120155000000000012e+00 -3.040625190734863281e+01 +1.120160000000000045e+00 -3.025000000000000000e+01 +1.120165000000000077e+00 -3.034375000000000000e+01 +1.120170000000000110e+00 -3.028125190734863281e+01 +1.120175000000000143e+00 -3.028125190734863281e+01 +1.120180000000000176e+00 -3.031250000000000000e+01 +1.120184999999999986e+00 -3.025000000000000000e+01 +1.120190000000000019e+00 -3.028125190734863281e+01 +1.120195000000000052e+00 -3.028125190734863281e+01 +1.120200000000000085e+00 -3.031250000000000000e+01 +1.120205000000000117e+00 -3.028125190734863281e+01 +1.120210000000000150e+00 -3.021875000000000000e+01 +1.120215000000000183e+00 -3.025000000000000000e+01 +1.120219999999999994e+00 -3.015625190734863281e+01 +1.120225000000000026e+00 -3.018750000000000000e+01 +1.120230000000000059e+00 -3.015625190734863281e+01 +1.120235000000000092e+00 -3.006250000000000000e+01 +1.120240000000000125e+00 -3.003125000000000000e+01 +1.120245000000000157e+00 -3.015625190734863281e+01 +1.120250000000000190e+00 -3.009375000000000000e+01 +1.120255000000000001e+00 -3.003125000000000000e+01 +1.120260000000000034e+00 -2.996875190734863281e+01 +1.120265000000000066e+00 -3.003125000000000000e+01 +1.120270000000000099e+00 -3.000000190734863281e+01 +1.120275000000000132e+00 -3.003125000000000000e+01 +1.120280000000000165e+00 -3.000000190734863281e+01 +1.120285000000000197e+00 -3.000000190734863281e+01 +1.120290000000000008e+00 -2.996875190734863281e+01 +1.120295000000000041e+00 -2.993750000000000000e+01 +1.120300000000000074e+00 -2.990625000000000000e+01 +1.120305000000000106e+00 -2.984375190734863281e+01 +1.120310000000000139e+00 -2.984375190734863281e+01 +1.120315000000000172e+00 -2.978125000000000000e+01 +1.120319999999999983e+00 -2.978125000000000000e+01 +1.120325000000000015e+00 -2.971875190734863281e+01 +1.120330000000000048e+00 -2.965625000000000000e+01 +1.120335000000000081e+00 -2.956250190734863281e+01 +1.120340000000000114e+00 -2.943750190734863281e+01 +1.120345000000000146e+00 -2.931250000000000000e+01 +1.120350000000000179e+00 -2.915625000000000000e+01 +1.120354999999999990e+00 -2.906250000000000000e+01 +1.120360000000000023e+00 -2.884375190734863281e+01 +1.120365000000000055e+00 -2.865625000000000000e+01 +1.120370000000000088e+00 -2.846875000000000000e+01 +1.120375000000000121e+00 -2.818750000000000000e+01 +1.120380000000000154e+00 -2.796875190734863281e+01 +1.120385000000000186e+00 -2.765625000000000000e+01 +1.120389999999999997e+00 -2.731250000000000000e+01 +1.120395000000000030e+00 -2.700000000000000000e+01 +1.120400000000000063e+00 -2.659375000000000000e+01 +1.120405000000000095e+00 -2.621875190734863281e+01 +1.120410000000000128e+00 -2.575000000000000000e+01 +1.120415000000000161e+00 -2.518750000000000000e+01 +1.120420000000000194e+00 -2.468750000000000000e+01 +1.120425000000000004e+00 -2.415625000000000000e+01 +1.120430000000000037e+00 -2.350000190734863281e+01 +1.120435000000000070e+00 -2.284375000000000000e+01 +1.120440000000000103e+00 -2.218750190734863281e+01 +1.120445000000000135e+00 -2.140625000000000000e+01 +1.120450000000000168e+00 -2.068750000000000000e+01 +1.120455000000000201e+00 -1.978125000000000000e+01 +1.120460000000000012e+00 -1.890625000000000000e+01 +1.120465000000000044e+00 -1.796875000000000000e+01 +1.120470000000000077e+00 -1.709375000000000000e+01 +1.120475000000000110e+00 -1.609375000000000000e+01 +1.120480000000000143e+00 -1.512500000000000000e+01 +1.120485000000000175e+00 -1.409375000000000000e+01 +1.120489999999999986e+00 -1.303125000000000000e+01 +1.120495000000000019e+00 -1.203125095367431641e+01 +1.120500000000000052e+00 -1.109375095367431641e+01 +1.120505000000000084e+00 -1.000000000000000000e+01 +1.120510000000000117e+00 -9.000000953674316406e+00 +1.120515000000000150e+00 -8.093750000000000000e+00 +1.120520000000000183e+00 -7.031250476837158203e+00 +1.120524999999999993e+00 -6.156250476837158203e+00 +1.120530000000000026e+00 -5.187500476837158203e+00 +1.120535000000000059e+00 -4.312500000000000000e+00 +1.120540000000000092e+00 -3.437500000000000000e+00 +1.120545000000000124e+00 -2.500000000000000000e+00 +1.120550000000000157e+00 -1.593750119209289551e+00 +1.120555000000000190e+00 -7.812500000000000000e-01 +1.120560000000000000e+00 6.250000000000000000e-02 +1.120565000000000033e+00 8.125000000000000000e-01 +1.120570000000000066e+00 1.593750119209289551e+00 +1.120575000000000099e+00 2.375000238418579102e+00 +1.120580000000000132e+00 3.156250000000000000e+00 +1.120585000000000164e+00 3.843750000000000000e+00 +1.120590000000000197e+00 4.625000000000000000e+00 +1.120595000000000008e+00 5.312500000000000000e+00 +1.120600000000000041e+00 5.937500000000000000e+00 +1.120605000000000073e+00 6.593750476837158203e+00 +1.120610000000000106e+00 7.281250476837158203e+00 +1.120615000000000139e+00 7.875000000000000000e+00 +1.120620000000000172e+00 8.531250000000000000e+00 +1.120624999999999982e+00 9.062500000000000000e+00 +1.120630000000000015e+00 9.656250000000000000e+00 +1.120635000000000048e+00 1.028125000000000000e+01 +1.120640000000000081e+00 1.075000000000000000e+01 +1.120645000000000113e+00 1.131250095367431641e+01 +1.120650000000000146e+00 1.184375000000000000e+01 +1.120655000000000179e+00 1.225000095367431641e+01 +1.120659999999999989e+00 1.271875000000000000e+01 +1.120665000000000022e+00 1.318750095367431641e+01 +1.120670000000000055e+00 1.365625000000000000e+01 +1.120675000000000088e+00 1.406250095367431641e+01 +1.120680000000000121e+00 1.443750000000000000e+01 +1.120685000000000153e+00 1.481250000000000000e+01 +1.120690000000000186e+00 1.521875095367431641e+01 +1.120694999999999997e+00 1.556250095367431641e+01 +1.120700000000000029e+00 1.600000000000000000e+01 +1.120705000000000062e+00 1.628125000000000000e+01 +1.120710000000000095e+00 1.656250190734863281e+01 +1.120715000000000128e+00 1.690625000000000000e+01 +1.120720000000000161e+00 1.715625000000000000e+01 +1.120725000000000193e+00 1.743750000000000000e+01 +1.120730000000000004e+00 1.768750000000000000e+01 +1.120735000000000037e+00 1.800000190734863281e+01 +1.120740000000000069e+00 1.812500000000000000e+01 +1.120745000000000102e+00 1.843750190734863281e+01 +1.120750000000000135e+00 1.856250190734863281e+01 +1.120755000000000168e+00 1.878125000000000000e+01 +1.120760000000000201e+00 1.890625000000000000e+01 +1.120765000000000011e+00 1.906250000000000000e+01 +1.120770000000000044e+00 1.928125190734863281e+01 +1.120775000000000077e+00 1.937500000000000000e+01 +1.120780000000000109e+00 1.953125000000000000e+01 +1.120785000000000142e+00 1.965625000000000000e+01 +1.120790000000000175e+00 1.978125000000000000e+01 +1.120794999999999986e+00 1.987500190734863281e+01 +1.120800000000000018e+00 1.993750000000000000e+01 +1.120805000000000051e+00 2.006250000000000000e+01 +1.120810000000000084e+00 2.009375000000000000e+01 +1.120815000000000117e+00 2.028125000000000000e+01 +1.120820000000000149e+00 2.021875000000000000e+01 +1.120825000000000182e+00 2.025000000000000000e+01 +1.120829999999999993e+00 2.031250190734863281e+01 +1.120835000000000026e+00 2.031250190734863281e+01 +1.120840000000000058e+00 2.031250190734863281e+01 +1.120845000000000091e+00 2.034375000000000000e+01 +1.120850000000000124e+00 2.028125000000000000e+01 +1.120855000000000157e+00 2.021875000000000000e+01 +1.120860000000000190e+00 2.025000000000000000e+01 +1.120865000000000000e+00 2.015625190734863281e+01 +1.120870000000000033e+00 2.012500000000000000e+01 +1.120875000000000066e+00 2.006250000000000000e+01 +1.120880000000000098e+00 2.000000000000000000e+01 +1.120885000000000131e+00 2.000000000000000000e+01 +1.120890000000000164e+00 1.981250000000000000e+01 +1.120895000000000197e+00 1.978125000000000000e+01 +1.120900000000000007e+00 1.962500000000000000e+01 +1.120905000000000040e+00 1.956250000000000000e+01 +1.120910000000000073e+00 1.943750190734863281e+01 +1.120915000000000106e+00 1.928125190734863281e+01 +1.120920000000000138e+00 1.915625190734863281e+01 +1.120925000000000171e+00 1.909375000000000000e+01 +1.120929999999999982e+00 1.893750000000000000e+01 +1.120935000000000015e+00 1.871875190734863281e+01 +1.120940000000000047e+00 1.862500000000000000e+01 +1.120945000000000080e+00 1.850000000000000000e+01 +1.120950000000000113e+00 1.834375000000000000e+01 +1.120955000000000146e+00 1.818750000000000000e+01 +1.120960000000000178e+00 1.803125000000000000e+01 +1.120964999999999989e+00 1.790625000000000000e+01 +1.120970000000000022e+00 1.768750000000000000e+01 +1.120975000000000055e+00 1.746875000000000000e+01 +1.120980000000000087e+00 1.728125190734863281e+01 +1.120985000000000120e+00 1.706250000000000000e+01 +1.120990000000000153e+00 1.690625000000000000e+01 +1.120995000000000186e+00 1.671875000000000000e+01 +1.120999999999999996e+00 1.650000000000000000e+01 +1.121005000000000029e+00 1.631250000000000000e+01 +1.121010000000000062e+00 1.606250000000000000e+01 +1.121015000000000095e+00 1.581249904632568359e+01 +1.121020000000000127e+00 1.559375000000000000e+01 +1.121025000000000160e+00 1.537500000000000000e+01 +1.121030000000000193e+00 1.512500000000000000e+01 +1.121035000000000004e+00 1.490625000000000000e+01 +1.121040000000000036e+00 1.462500095367431641e+01 +1.121045000000000069e+00 1.443750000000000000e+01 +1.121050000000000102e+00 1.415625000000000000e+01 +1.121055000000000135e+00 1.387500000000000000e+01 +1.121060000000000167e+00 1.368750095367431641e+01 +1.121065000000000200e+00 1.343750000000000000e+01 +1.121070000000000011e+00 1.318750095367431641e+01 +1.121075000000000044e+00 1.300000000000000000e+01 +1.121080000000000076e+00 1.265625000000000000e+01 +1.121085000000000109e+00 1.243750000000000000e+01 +1.121090000000000142e+00 1.215625000000000000e+01 +1.121095000000000175e+00 1.187500000000000000e+01 +1.121099999999999985e+00 1.159375095367431641e+01 +1.121105000000000018e+00 1.134375000000000000e+01 +1.121110000000000051e+00 1.118750000000000000e+01 +1.121115000000000084e+00 1.078125000000000000e+01 +1.121120000000000116e+00 1.053125000000000000e+01 +1.121125000000000149e+00 1.025000000000000000e+01 +1.121130000000000182e+00 1.003125000000000000e+01 +1.121134999999999993e+00 9.718750953674316406e+00 +1.121140000000000025e+00 9.500000953674316406e+00 +1.121145000000000058e+00 9.156250000000000000e+00 +1.121150000000000091e+00 8.843750000000000000e+00 +1.121155000000000124e+00 8.625000000000000000e+00 +1.121160000000000156e+00 8.281250953674316406e+00 +1.121165000000000189e+00 8.031250000000000000e+00 +1.121170000000000000e+00 7.718750476837158203e+00 +1.121175000000000033e+00 7.437500000000000000e+00 +1.121180000000000065e+00 7.062500476837158203e+00 +1.121185000000000098e+00 6.812500476837158203e+00 +1.121190000000000131e+00 6.562500476837158203e+00 +1.121195000000000164e+00 6.250000000000000000e+00 +1.121200000000000196e+00 5.937500000000000000e+00 +1.121205000000000007e+00 5.593750000000000000e+00 +1.121210000000000040e+00 5.343750000000000000e+00 +1.121215000000000073e+00 5.000000000000000000e+00 +1.121220000000000105e+00 4.718750476837158203e+00 +1.121225000000000138e+00 4.500000476837158203e+00 +1.121230000000000171e+00 4.125000000000000000e+00 +1.121234999999999982e+00 3.843750000000000000e+00 +1.121240000000000014e+00 3.500000000000000000e+00 +1.121245000000000047e+00 3.218750000000000000e+00 +1.121250000000000080e+00 2.968750000000000000e+00 +1.121255000000000113e+00 2.687500000000000000e+00 +1.121260000000000145e+00 2.375000238418579102e+00 +1.121265000000000178e+00 2.031250238418579102e+00 +1.121269999999999989e+00 1.750000000000000000e+00 +1.121275000000000022e+00 1.343750000000000000e+00 +1.121280000000000054e+00 1.125000119209289551e+00 +1.121285000000000087e+00 8.750000000000000000e-01 +1.121290000000000120e+00 5.937500596046447754e-01 +1.121295000000000153e+00 2.812500298023223877e-01 +1.121300000000000185e+00 -1.250000000000000000e-01 +1.121304999999999996e+00 -2.812500298023223877e-01 +1.121310000000000029e+00 -5.937500596046447754e-01 +1.121315000000000062e+00 -8.437500000000000000e-01 +1.121320000000000094e+00 -1.125000119209289551e+00 +1.121325000000000127e+00 -1.468750119209289551e+00 +1.121330000000000160e+00 -1.687500000000000000e+00 +1.121335000000000193e+00 -2.093750000000000000e+00 +1.121340000000000003e+00 -2.312500000000000000e+00 +1.121345000000000036e+00 -2.593750238418579102e+00 +1.121350000000000069e+00 -2.875000000000000000e+00 +1.121355000000000102e+00 -3.156250000000000000e+00 +1.121360000000000134e+00 -3.437500000000000000e+00 +1.121365000000000167e+00 -3.750000238418579102e+00 +1.121370000000000200e+00 -3.968750238418579102e+00 +1.121375000000000011e+00 -4.281250476837158203e+00 +1.121380000000000043e+00 -4.562500000000000000e+00 +1.121385000000000076e+00 -4.781250000000000000e+00 +1.121390000000000109e+00 -5.062500000000000000e+00 +1.121395000000000142e+00 -5.343750000000000000e+00 +1.121400000000000174e+00 -5.625000000000000000e+00 +1.121404999999999985e+00 -5.875000476837158203e+00 +1.121410000000000018e+00 -6.156250476837158203e+00 +1.121415000000000051e+00 -6.468750000000000000e+00 +1.121420000000000083e+00 -6.625000000000000000e+00 +1.121425000000000116e+00 -7.000000000000000000e+00 +1.121430000000000149e+00 -7.187500000000000000e+00 +1.121435000000000182e+00 -7.437500000000000000e+00 +1.121439999999999992e+00 -7.687500000000000000e+00 +1.121445000000000025e+00 -7.875000000000000000e+00 +1.121450000000000058e+00 -8.218750000000000000e+00 +1.121455000000000091e+00 -8.406250000000000000e+00 +1.121460000000000123e+00 -8.750000000000000000e+00 +1.121465000000000156e+00 -8.968750000000000000e+00 +1.121470000000000189e+00 -9.187500000000000000e+00 +1.121475000000000000e+00 -9.437500953674316406e+00 +1.121480000000000032e+00 -9.656250000000000000e+00 +1.121485000000000065e+00 -9.875000000000000000e+00 +1.121490000000000098e+00 -1.015625095367431641e+01 +1.121495000000000131e+00 -1.034375000000000000e+01 +1.121500000000000163e+00 -1.059375095367431641e+01 +1.121505000000000196e+00 -1.084375000000000000e+01 +1.121510000000000007e+00 -1.106250000000000000e+01 +1.121515000000000040e+00 -1.131250095367431641e+01 +1.121520000000000072e+00 -1.150000000000000000e+01 +1.121525000000000105e+00 -1.171875000000000000e+01 +1.121530000000000138e+00 -1.203125095367431641e+01 +1.121535000000000171e+00 -1.215625000000000000e+01 +1.121539999999999981e+00 -1.240625000000000000e+01 +1.121545000000000014e+00 -1.262500000000000000e+01 +1.121550000000000047e+00 -1.281250000000000000e+01 +1.121555000000000080e+00 -1.306250000000000000e+01 +1.121560000000000112e+00 -1.321875000000000000e+01 +1.121565000000000145e+00 -1.343750000000000000e+01 +1.121570000000000178e+00 -1.368750095367431641e+01 +1.121574999999999989e+00 -1.381250000000000000e+01 +1.121580000000000021e+00 -1.403125000000000000e+01 +1.121585000000000054e+00 -1.425000000000000000e+01 +1.121590000000000087e+00 -1.437500000000000000e+01 +1.121595000000000120e+00 -1.465625000000000000e+01 +1.121600000000000152e+00 -1.484375095367431641e+01 +1.121605000000000185e+00 -1.493750000000000000e+01 +1.121609999999999996e+00 -1.515625000000000000e+01 +1.121615000000000029e+00 -1.534375000000000000e+01 +1.121620000000000061e+00 -1.553125000000000000e+01 +1.121625000000000094e+00 -1.571875095367431641e+01 +1.121630000000000127e+00 -1.590625000000000000e+01 +1.121635000000000160e+00 -1.609375000000000000e+01 +1.121640000000000192e+00 -1.621875000000000000e+01 +1.121645000000000003e+00 -1.646875000000000000e+01 +1.121650000000000036e+00 -1.653125000000000000e+01 +1.121655000000000069e+00 -1.678125000000000000e+01 +1.121660000000000101e+00 -1.690625000000000000e+01 +1.121665000000000134e+00 -1.709375000000000000e+01 +1.121670000000000167e+00 -1.728125190734863281e+01 +1.121675000000000200e+00 -1.740625190734863281e+01 +1.121680000000000010e+00 -1.759375000000000000e+01 +1.121685000000000043e+00 -1.771875190734863281e+01 +1.121690000000000076e+00 -1.790625000000000000e+01 +1.121695000000000109e+00 -1.803125000000000000e+01 +1.121700000000000141e+00 -1.821875000000000000e+01 +1.121705000000000174e+00 -1.837500000000000000e+01 +1.121709999999999985e+00 -1.853125000000000000e+01 +1.121715000000000018e+00 -1.871875190734863281e+01 +1.121720000000000050e+00 -1.884375000000000000e+01 +1.121725000000000083e+00 -1.900000190734863281e+01 +1.121730000000000116e+00 -1.912500000000000000e+01 +1.121735000000000149e+00 -1.931250000000000000e+01 +1.121740000000000181e+00 -1.946875000000000000e+01 +1.121744999999999992e+00 -1.953125000000000000e+01 +1.121750000000000025e+00 -1.965625000000000000e+01 +1.121755000000000058e+00 -1.981250000000000000e+01 +1.121760000000000090e+00 -1.990625000000000000e+01 +1.121765000000000123e+00 -2.003125190734863281e+01 +1.121770000000000156e+00 -2.021875000000000000e+01 +1.121775000000000189e+00 -2.034375000000000000e+01 +1.121779999999999999e+00 -2.046875190734863281e+01 +1.121785000000000032e+00 -2.065625000000000000e+01 +1.121790000000000065e+00 -2.078125000000000000e+01 +1.121795000000000098e+00 -2.084375000000000000e+01 +1.121800000000000130e+00 -2.093750000000000000e+01 +1.121805000000000163e+00 -2.106250000000000000e+01 +1.121810000000000196e+00 -2.128125000000000000e+01 +1.121815000000000007e+00 -2.134375000000000000e+01 +1.121820000000000039e+00 -2.146875190734863281e+01 +1.121825000000000072e+00 -2.162500190734863281e+01 +1.121830000000000105e+00 -2.168750000000000000e+01 +1.121835000000000138e+00 -2.187500000000000000e+01 +1.121840000000000170e+00 -2.190625190734863281e+01 +1.121844999999999981e+00 -2.209375000000000000e+01 +1.121850000000000014e+00 -2.215625000000000000e+01 +1.121855000000000047e+00 -2.225000000000000000e+01 +1.121860000000000079e+00 -2.228125000000000000e+01 +1.121865000000000112e+00 -2.250000000000000000e+01 +1.121870000000000145e+00 -2.250000000000000000e+01 +1.121875000000000178e+00 -2.265625000000000000e+01 +1.121879999999999988e+00 -2.271875000000000000e+01 +1.121885000000000021e+00 -2.290625190734863281e+01 +1.121890000000000054e+00 -2.290625190734863281e+01 +1.121895000000000087e+00 -2.306250190734863281e+01 +1.121900000000000119e+00 -2.315625000000000000e+01 +1.121905000000000152e+00 -2.325000000000000000e+01 +1.121910000000000185e+00 -2.337500000000000000e+01 +1.121914999999999996e+00 -2.346875000000000000e+01 +1.121920000000000028e+00 -2.350000190734863281e+01 +1.121925000000000061e+00 -2.359375000000000000e+01 +1.121930000000000094e+00 -2.368750000000000000e+01 +1.121935000000000127e+00 -2.381250000000000000e+01 +1.121940000000000159e+00 -2.393750190734863281e+01 +1.121945000000000192e+00 -2.400000000000000000e+01 +1.121950000000000003e+00 -2.412500000000000000e+01 +1.121955000000000036e+00 -2.421875190734863281e+01 +1.121960000000000068e+00 -2.428125000000000000e+01 +1.121965000000000101e+00 -2.440625000000000000e+01 +1.121970000000000134e+00 -2.450000190734863281e+01 +1.121975000000000167e+00 -2.450000190734863281e+01 +1.121980000000000199e+00 -2.459375000000000000e+01 +1.121985000000000010e+00 -2.471875000000000000e+01 +1.121990000000000043e+00 -2.478125190734863281e+01 +1.121995000000000076e+00 -2.484375000000000000e+01 +1.122000000000000108e+00 -2.490625000000000000e+01 +1.122005000000000141e+00 -2.500000000000000000e+01 +1.122010000000000174e+00 -2.512500000000000000e+01 +1.122014999999999985e+00 -2.515625000000000000e+01 +1.122020000000000017e+00 -2.521875190734863281e+01 +1.122025000000000050e+00 -2.534375000000000000e+01 +1.122030000000000083e+00 -2.546875000000000000e+01 +1.122035000000000116e+00 -2.546875000000000000e+01 +1.122040000000000148e+00 -2.556250000000000000e+01 +1.122045000000000181e+00 -2.556250000000000000e+01 +1.122049999999999992e+00 -2.575000000000000000e+01 +1.122055000000000025e+00 -2.575000000000000000e+01 +1.122060000000000057e+00 -2.581250190734863281e+01 +1.122065000000000090e+00 -2.593750190734863281e+01 +1.122070000000000123e+00 -2.596875000000000000e+01 +1.122075000000000156e+00 -2.603125000000000000e+01 +1.122080000000000188e+00 -2.609375190734863281e+01 +1.122084999999999999e+00 -2.615625000000000000e+01 +1.122090000000000032e+00 -2.621875190734863281e+01 +1.122095000000000065e+00 -2.621875190734863281e+01 +1.122100000000000097e+00 -2.640625000000000000e+01 +1.122105000000000130e+00 -2.643750000000000000e+01 +1.122110000000000163e+00 -2.643750000000000000e+01 +1.122115000000000196e+00 -2.653125190734863281e+01 +1.122120000000000006e+00 -2.656250000000000000e+01 +1.122125000000000039e+00 -2.665625190734863281e+01 +1.122130000000000072e+00 -2.671875000000000000e+01 +1.122135000000000105e+00 -2.675000000000000000e+01 +1.122140000000000137e+00 -2.690625000000000000e+01 +1.122145000000000170e+00 -2.690625000000000000e+01 +1.122149999999999981e+00 -2.700000000000000000e+01 +1.122155000000000014e+00 -2.696875190734863281e+01 +1.122160000000000046e+00 -2.700000000000000000e+01 +1.122165000000000079e+00 -2.706250000000000000e+01 +1.122170000000000112e+00 -2.712500000000000000e+01 +1.122175000000000145e+00 -2.721875000000000000e+01 +1.122180000000000177e+00 -2.728125000000000000e+01 +1.122184999999999988e+00 -2.728125000000000000e+01 +1.122190000000000021e+00 -2.740625190734863281e+01 +1.122195000000000054e+00 -2.737500190734863281e+01 +1.122200000000000086e+00 -2.746875000000000000e+01 +1.122205000000000119e+00 -2.750000000000000000e+01 +1.122210000000000152e+00 -2.753125190734863281e+01 +1.122215000000000185e+00 -2.762500000000000000e+01 +1.122219999999999995e+00 -2.768750190734863281e+01 +1.122225000000000028e+00 -2.771875000000000000e+01 +1.122230000000000061e+00 -2.778125000000000000e+01 +1.122235000000000094e+00 -2.778125000000000000e+01 +1.122240000000000126e+00 -2.784375190734863281e+01 +1.122245000000000159e+00 -2.790625000000000000e+01 +1.122250000000000192e+00 -2.790625000000000000e+01 +1.122255000000000003e+00 -2.796875190734863281e+01 +1.122260000000000035e+00 -2.803125000000000000e+01 +1.122265000000000068e+00 -2.812500190734863281e+01 +1.122270000000000101e+00 -2.812500190734863281e+01 +1.122275000000000134e+00 -2.818750000000000000e+01 +1.122280000000000166e+00 -2.818750000000000000e+01 +1.122285000000000199e+00 -2.821875000000000000e+01 +1.122290000000000010e+00 -2.821875000000000000e+01 +1.122295000000000043e+00 -2.828125190734863281e+01 +1.122300000000000075e+00 -2.834375000000000000e+01 +1.122305000000000108e+00 -2.843750000000000000e+01 +1.122310000000000141e+00 -2.840625190734863281e+01 +1.122315000000000174e+00 -2.846875000000000000e+01 +1.122319999999999984e+00 -2.853125190734863281e+01 +1.122325000000000017e+00 -2.859375000000000000e+01 +1.122330000000000050e+00 -2.853125190734863281e+01 +1.122335000000000083e+00 -2.862500000000000000e+01 +1.122340000000000115e+00 -2.862500000000000000e+01 +1.122345000000000148e+00 -2.868750190734863281e+01 +1.122350000000000181e+00 -2.875000000000000000e+01 +1.122354999999999992e+00 -2.881250000000000000e+01 +1.122360000000000024e+00 -2.884375190734863281e+01 +1.122365000000000057e+00 -2.881250000000000000e+01 +1.122370000000000090e+00 -2.887500000000000000e+01 +1.122375000000000123e+00 -2.900000190734863281e+01 +1.122380000000000155e+00 -2.900000190734863281e+01 +1.122385000000000188e+00 -2.900000190734863281e+01 +1.122389999999999999e+00 -2.903125000000000000e+01 +1.122395000000000032e+00 -2.903125000000000000e+01 +1.122400000000000064e+00 -2.906250000000000000e+01 +1.122405000000000097e+00 -2.912500190734863281e+01 +1.122410000000000130e+00 -2.918750000000000000e+01 +1.122415000000000163e+00 -2.918750000000000000e+01 +1.122420000000000195e+00 -2.928125190734863281e+01 +1.122425000000000006e+00 -2.928125190734863281e+01 +1.122430000000000039e+00 -2.921875000000000000e+01 +1.122435000000000072e+00 -2.925000190734863281e+01 +1.122440000000000104e+00 -2.940625190734863281e+01 +1.122445000000000137e+00 -2.934375000000000000e+01 +1.122450000000000170e+00 -2.940625190734863281e+01 +1.122455000000000203e+00 -2.946875000000000000e+01 +1.122460000000000013e+00 -2.943750190734863281e+01 +1.122465000000000046e+00 -2.950000000000000000e+01 +1.122470000000000079e+00 -2.956250190734863281e+01 +1.122475000000000112e+00 -2.956250190734863281e+01 +1.122480000000000144e+00 -2.959375000000000000e+01 +1.122485000000000177e+00 -2.965625000000000000e+01 +1.122489999999999988e+00 -2.968750190734863281e+01 +1.122495000000000021e+00 -2.965625000000000000e+01 +1.122500000000000053e+00 -2.965625000000000000e+01 +1.122505000000000086e+00 -2.971875190734863281e+01 +1.122510000000000119e+00 -2.971875190734863281e+01 +1.122515000000000152e+00 -2.975000000000000000e+01 +1.122520000000000184e+00 -2.981250000000000000e+01 +1.122524999999999995e+00 -2.987500000000000000e+01 +1.122530000000000028e+00 -2.984375190734863281e+01 +1.122535000000000061e+00 -2.987500000000000000e+01 +1.122540000000000093e+00 -2.984375190734863281e+01 +1.122545000000000126e+00 -2.990625000000000000e+01 +1.122550000000000159e+00 -3.000000190734863281e+01 +1.122555000000000192e+00 -3.000000190734863281e+01 +1.122560000000000002e+00 -3.003125000000000000e+01 +1.122565000000000035e+00 -3.009375000000000000e+01 +1.122570000000000068e+00 -3.009375000000000000e+01 +1.122575000000000101e+00 -3.015625190734863281e+01 +1.122580000000000133e+00 -3.015625190734863281e+01 +1.122585000000000166e+00 -3.021875000000000000e+01 +1.122590000000000199e+00 -3.028125190734863281e+01 +1.122595000000000010e+00 -3.031250000000000000e+01 +1.122600000000000042e+00 -3.031250000000000000e+01 +1.122605000000000075e+00 -3.031250000000000000e+01 +1.122610000000000108e+00 -3.031250000000000000e+01 +1.122615000000000141e+00 -3.043750190734863281e+01 +1.122620000000000173e+00 -3.037500000000000000e+01 +1.122624999999999984e+00 -3.043750190734863281e+01 +1.122630000000000017e+00 -3.046875000000000000e+01 +1.122635000000000050e+00 -3.050000000000000000e+01 +1.122640000000000082e+00 -3.050000000000000000e+01 +1.122645000000000115e+00 -3.050000000000000000e+01 +1.122650000000000148e+00 -3.053125000000000000e+01 +1.122655000000000181e+00 -3.062500000000000000e+01 +1.122659999999999991e+00 -3.059375190734863281e+01 +1.122665000000000024e+00 -3.068750000000000000e+01 +1.122670000000000057e+00 -3.065625000000000000e+01 +1.122675000000000090e+00 -3.065625000000000000e+01 +1.122680000000000122e+00 -3.071875190734863281e+01 +1.122685000000000155e+00 -3.075000000000000000e+01 +1.122690000000000188e+00 -3.075000000000000000e+01 +1.122694999999999999e+00 -3.075000000000000000e+01 +1.122700000000000031e+00 -3.084375190734863281e+01 +1.122705000000000064e+00 -3.084375190734863281e+01 +1.122710000000000097e+00 -3.087500190734863281e+01 +1.122715000000000130e+00 -3.093750000000000000e+01 +1.122720000000000162e+00 -3.090625000000000000e+01 +1.122725000000000195e+00 -3.090625000000000000e+01 +1.122730000000000006e+00 -3.096875000000000000e+01 +1.122735000000000039e+00 -3.096875000000000000e+01 +1.122740000000000071e+00 -3.100000190734863281e+01 +1.122745000000000104e+00 -3.096875000000000000e+01 +1.122750000000000137e+00 -3.096875000000000000e+01 +1.122755000000000170e+00 -3.100000190734863281e+01 +1.122760000000000202e+00 -3.100000190734863281e+01 +1.122765000000000013e+00 -3.100000190734863281e+01 +1.122770000000000046e+00 -3.109375000000000000e+01 +1.122775000000000079e+00 -3.109375000000000000e+01 +1.122780000000000111e+00 -3.112500190734863281e+01 +1.122785000000000144e+00 -3.112500190734863281e+01 +1.122790000000000177e+00 -3.112500190734863281e+01 +1.122794999999999987e+00 -3.115625190734863281e+01 +1.122800000000000020e+00 -3.118750000000000000e+01 +1.122805000000000053e+00 -3.128125190734863281e+01 +1.122810000000000086e+00 -3.121875000000000000e+01 +1.122815000000000119e+00 -3.128125190734863281e+01 +1.122820000000000151e+00 -3.128125190734863281e+01 +1.122825000000000184e+00 -3.128125190734863281e+01 +1.122829999999999995e+00 -3.134375000000000000e+01 +1.122835000000000027e+00 -3.140625000000000000e+01 +1.122840000000000060e+00 -3.137500190734863281e+01 +1.122845000000000093e+00 -3.143750190734863281e+01 +1.122850000000000126e+00 -3.153125190734863281e+01 +1.122855000000000159e+00 -3.146875000000000000e+01 +1.122860000000000191e+00 -3.146875000000000000e+01 +1.122865000000000002e+00 -3.150000000000000000e+01 +1.122870000000000035e+00 -3.150000000000000000e+01 +1.122875000000000068e+00 -3.153125190734863281e+01 +1.122880000000000100e+00 -3.162499809265136719e+01 +1.122885000000000133e+00 -3.153125190734863281e+01 +1.122890000000000166e+00 -3.162499809265136719e+01 +1.122895000000000199e+00 -3.156250000000000000e+01 +1.122900000000000009e+00 -3.153125190734863281e+01 +1.122905000000000042e+00 -3.168750190734863281e+01 +1.122910000000000075e+00 -3.165625000000000000e+01 +1.122915000000000108e+00 -3.165625000000000000e+01 +1.122920000000000140e+00 -3.168750190734863281e+01 +1.122925000000000173e+00 -3.168750190734863281e+01 +1.122929999999999984e+00 -3.168750190734863281e+01 +1.122935000000000016e+00 -3.171875000000000000e+01 +1.122940000000000049e+00 -3.178125190734863281e+01 +1.122945000000000082e+00 -3.171875000000000000e+01 +1.122950000000000115e+00 -3.178125190734863281e+01 +1.122955000000000148e+00 -3.184375190734863281e+01 +1.122960000000000180e+00 -3.184375190734863281e+01 +1.122964999999999991e+00 -3.181250000000000000e+01 +1.122970000000000024e+00 -3.184375190734863281e+01 +1.122975000000000056e+00 -3.184375190734863281e+01 +1.122980000000000089e+00 -3.187500000000000000e+01 +1.122985000000000122e+00 -3.193750190734863281e+01 +1.122990000000000155e+00 -3.190625000000000000e+01 +1.122995000000000188e+00 -3.196875000000000000e+01 +1.122999999999999998e+00 -3.193750190734863281e+01 +1.123005000000000031e+00 -3.200000000000000000e+01 +1.123010000000000064e+00 -3.203125000000000000e+01 +1.123015000000000096e+00 -3.200000000000000000e+01 +1.123020000000000129e+00 -3.203125000000000000e+01 +1.123025000000000162e+00 -3.203125000000000000e+01 +1.123030000000000195e+00 -3.203125000000000000e+01 +1.123035000000000005e+00 -3.203125000000000000e+01 +1.123040000000000038e+00 -3.203125000000000000e+01 +1.123045000000000071e+00 -3.206250000000000000e+01 +1.123050000000000104e+00 -3.209375381469726562e+01 +1.123055000000000136e+00 -3.215625000000000000e+01 +1.123060000000000169e+00 -3.215625000000000000e+01 +1.123065000000000202e+00 -3.218750000000000000e+01 +1.123070000000000013e+00 -3.215625000000000000e+01 +1.123075000000000045e+00 -3.218750000000000000e+01 +1.123080000000000078e+00 -3.218750000000000000e+01 +1.123085000000000111e+00 -3.228125000000000000e+01 +1.123090000000000144e+00 -3.228125000000000000e+01 +1.123095000000000176e+00 -3.225000381469726562e+01 +1.123099999999999987e+00 -3.228125000000000000e+01 +1.123105000000000020e+00 -3.228125000000000000e+01 +1.123110000000000053e+00 -3.237500000000000000e+01 +1.123115000000000085e+00 -3.234375000000000000e+01 +1.123120000000000118e+00 -3.237500000000000000e+01 +1.123125000000000151e+00 -3.237500000000000000e+01 +1.123130000000000184e+00 -3.246875000000000000e+01 +1.123134999999999994e+00 -3.243750000000000000e+01 +1.123140000000000027e+00 -3.246875000000000000e+01 +1.123145000000000060e+00 -3.246875000000000000e+01 +1.123150000000000093e+00 -3.243750000000000000e+01 +1.123155000000000125e+00 -3.253125000000000000e+01 +1.123160000000000158e+00 -3.246875000000000000e+01 +1.123165000000000191e+00 -3.246875000000000000e+01 +1.123170000000000002e+00 -3.246875000000000000e+01 +1.123175000000000034e+00 -3.246875000000000000e+01 +1.123180000000000067e+00 -3.250000381469726562e+01 +1.123185000000000100e+00 -3.250000381469726562e+01 +1.123190000000000133e+00 -3.256250000000000000e+01 +1.123195000000000165e+00 -3.259375000000000000e+01 +1.123200000000000198e+00 -3.256250000000000000e+01 +1.123205000000000009e+00 -3.265625381469726562e+01 +1.123210000000000042e+00 -3.262500000000000000e+01 +1.123215000000000074e+00 -3.271875000000000000e+01 +1.123220000000000107e+00 -3.271875000000000000e+01 +1.123225000000000140e+00 -3.265625381469726562e+01 +1.123230000000000173e+00 -3.271875000000000000e+01 +1.123234999999999983e+00 -3.268750000000000000e+01 +1.123240000000000016e+00 -3.278125000000000000e+01 +1.123245000000000049e+00 -3.278125000000000000e+01 +1.123250000000000082e+00 -3.278125000000000000e+01 +1.123255000000000114e+00 -3.281250381469726562e+01 +1.123260000000000147e+00 -3.287500000000000000e+01 +1.123265000000000180e+00 -3.287500000000000000e+01 +1.123269999999999991e+00 -3.290625000000000000e+01 +1.123275000000000023e+00 -3.290625000000000000e+01 +1.123280000000000056e+00 -3.293750000000000000e+01 +1.123285000000000089e+00 -3.296875381469726562e+01 +1.123290000000000122e+00 -3.293750000000000000e+01 +1.123295000000000154e+00 -3.293750000000000000e+01 +1.123300000000000187e+00 -3.300000000000000000e+01 +1.123304999999999998e+00 -3.300000000000000000e+01 +1.123310000000000031e+00 -3.300000000000000000e+01 +1.123315000000000063e+00 -3.300000000000000000e+01 +1.123320000000000096e+00 -3.300000000000000000e+01 +1.123325000000000129e+00 -3.300000000000000000e+01 +1.123330000000000162e+00 -3.303125000000000000e+01 +1.123335000000000194e+00 -3.303125000000000000e+01 +1.123340000000000005e+00 -3.300000000000000000e+01 +1.123345000000000038e+00 -3.306250000000000000e+01 +1.123350000000000071e+00 -3.306250000000000000e+01 +1.123355000000000103e+00 -3.306250000000000000e+01 +1.123360000000000136e+00 -3.306250000000000000e+01 +1.123365000000000169e+00 -3.309375000000000000e+01 +1.123370000000000202e+00 -3.312500381469726562e+01 +1.123375000000000012e+00 -3.315625000000000000e+01 +1.123380000000000045e+00 -3.312500381469726562e+01 +1.123385000000000078e+00 -3.318750000000000000e+01 +1.123390000000000111e+00 -3.318750000000000000e+01 +1.123395000000000143e+00 -3.309375000000000000e+01 +1.123400000000000176e+00 -3.321875381469726562e+01 +1.123404999999999987e+00 -3.315625000000000000e+01 +1.123410000000000020e+00 -3.325000000000000000e+01 +1.123415000000000052e+00 -3.321875381469726562e+01 +1.123420000000000085e+00 -3.328125000000000000e+01 +1.123425000000000118e+00 -3.328125000000000000e+01 +1.123430000000000151e+00 -3.331250000000000000e+01 +1.123435000000000183e+00 -3.334375000000000000e+01 +1.123439999999999994e+00 -3.334375000000000000e+01 +1.123445000000000027e+00 -3.334375000000000000e+01 +1.123450000000000060e+00 -3.334375000000000000e+01 +1.123455000000000092e+00 -3.337500381469726562e+01 +1.123460000000000125e+00 -3.343750000000000000e+01 +1.123465000000000158e+00 -3.340625000000000000e+01 +1.123470000000000191e+00 -3.340625000000000000e+01 +1.123475000000000001e+00 -3.343750000000000000e+01 +1.123480000000000034e+00 -3.340625000000000000e+01 +1.123485000000000067e+00 -3.343750000000000000e+01 +1.123490000000000100e+00 -3.340625000000000000e+01 +1.123495000000000132e+00 -3.340625000000000000e+01 +1.123500000000000165e+00 -3.350000000000000000e+01 +1.123505000000000198e+00 -3.346875000000000000e+01 +1.123510000000000009e+00 -3.350000000000000000e+01 +1.123515000000000041e+00 -3.343750000000000000e+01 +1.123520000000000074e+00 -3.350000000000000000e+01 +1.123525000000000107e+00 -3.353125381469726562e+01 +1.123530000000000140e+00 -3.359375000000000000e+01 +1.123535000000000172e+00 -3.356250000000000000e+01 +1.123539999999999983e+00 -3.359375000000000000e+01 +1.123545000000000016e+00 -3.362500000000000000e+01 +1.123550000000000049e+00 -3.362500000000000000e+01 +1.123555000000000081e+00 -3.356250000000000000e+01 +1.123560000000000114e+00 -3.362500000000000000e+01 +1.123565000000000147e+00 -3.371875000000000000e+01 +1.123570000000000180e+00 -3.362500000000000000e+01 +1.123574999999999990e+00 -3.365625000000000000e+01 +1.123580000000000023e+00 -3.378125000000000000e+01 +1.123585000000000056e+00 -3.365625000000000000e+01 +1.123590000000000089e+00 -3.371875000000000000e+01 +1.123595000000000121e+00 -3.371875000000000000e+01 +1.123600000000000154e+00 -3.371875000000000000e+01 +1.123605000000000187e+00 -3.378125000000000000e+01 +1.123609999999999998e+00 -3.371875000000000000e+01 +1.123615000000000030e+00 -3.375000000000000000e+01 +1.123620000000000063e+00 -3.381250000000000000e+01 +1.123625000000000096e+00 -3.381250000000000000e+01 +1.123630000000000129e+00 -3.387500000000000000e+01 +1.123635000000000161e+00 -3.384375381469726562e+01 +1.123640000000000194e+00 -3.381250000000000000e+01 +1.123645000000000005e+00 -3.381250000000000000e+01 +1.123650000000000038e+00 -3.387500000000000000e+01 +1.123655000000000070e+00 -3.384375381469726562e+01 +1.123660000000000103e+00 -3.387500000000000000e+01 +1.123665000000000136e+00 -3.387500000000000000e+01 +1.123670000000000169e+00 -3.384375381469726562e+01 +1.123675000000000201e+00 -3.387500000000000000e+01 +1.123680000000000012e+00 -3.381250000000000000e+01 +1.123685000000000045e+00 -3.390625000000000000e+01 +1.123690000000000078e+00 -3.384375381469726562e+01 +1.123695000000000110e+00 -3.393750000000000000e+01 +1.123700000000000143e+00 -3.390625000000000000e+01 +1.123705000000000176e+00 -3.387500000000000000e+01 +1.123709999999999987e+00 -3.393750000000000000e+01 +1.123715000000000019e+00 -3.396875000000000000e+01 +1.123720000000000052e+00 -3.396875000000000000e+01 +1.123725000000000085e+00 -3.393750000000000000e+01 +1.123730000000000118e+00 -3.400000000000000000e+01 +1.123735000000000150e+00 -3.400000000000000000e+01 +1.123740000000000183e+00 -3.403125000000000000e+01 +1.123744999999999994e+00 -3.400000000000000000e+01 +1.123750000000000027e+00 -3.403125000000000000e+01 +1.123755000000000059e+00 -3.406250000000000000e+01 +1.123760000000000092e+00 -3.400000000000000000e+01 +1.123765000000000125e+00 -3.403125000000000000e+01 +1.123770000000000158e+00 -3.403125000000000000e+01 +1.123775000000000190e+00 -3.403125000000000000e+01 +1.123780000000000001e+00 -3.409375381469726562e+01 +1.123785000000000034e+00 -3.409375381469726562e+01 +1.123790000000000067e+00 -3.409375381469726562e+01 +1.123795000000000099e+00 -3.415625000000000000e+01 +1.123800000000000132e+00 -3.409375381469726562e+01 +1.123805000000000165e+00 -3.406250000000000000e+01 +1.123810000000000198e+00 -3.412500000000000000e+01 +1.123815000000000008e+00 -3.418750000000000000e+01 +1.123820000000000041e+00 -3.409375381469726562e+01 +1.123825000000000074e+00 -3.415625000000000000e+01 +1.123830000000000107e+00 -3.421875000000000000e+01 +1.123835000000000139e+00 -3.418750000000000000e+01 +1.123840000000000172e+00 -3.418750000000000000e+01 +1.123844999999999983e+00 -3.418750000000000000e+01 +1.123850000000000016e+00 -3.418750000000000000e+01 +1.123855000000000048e+00 -3.421875000000000000e+01 +1.123860000000000081e+00 -3.428125000000000000e+01 +1.123865000000000114e+00 -3.425000381469726562e+01 +1.123870000000000147e+00 -3.425000381469726562e+01 +1.123875000000000179e+00 -3.428125000000000000e+01 +1.123879999999999990e+00 -3.425000381469726562e+01 +1.123885000000000023e+00 -3.434375000000000000e+01 +1.123890000000000056e+00 -3.434375000000000000e+01 +1.123895000000000088e+00 -3.440625381469726562e+01 +1.123900000000000121e+00 -3.428125000000000000e+01 +1.123905000000000154e+00 -3.437500000000000000e+01 +1.123910000000000187e+00 -3.434375000000000000e+01 +1.123914999999999997e+00 -3.437500000000000000e+01 +1.123920000000000030e+00 -3.437500000000000000e+01 +1.123925000000000063e+00 -3.434375000000000000e+01 +1.123930000000000096e+00 -3.440625381469726562e+01 +1.123935000000000128e+00 -3.450000000000000000e+01 +1.123940000000000161e+00 -3.446875000000000000e+01 +1.123945000000000194e+00 -3.443750000000000000e+01 +1.123950000000000005e+00 -3.437500000000000000e+01 +1.123955000000000037e+00 -3.446875000000000000e+01 +1.123960000000000070e+00 -3.443750000000000000e+01 +1.123965000000000103e+00 -3.453125000000000000e+01 +1.123970000000000136e+00 -3.453125000000000000e+01 +1.123975000000000168e+00 -3.450000000000000000e+01 +1.123980000000000201e+00 -3.450000000000000000e+01 +1.123985000000000012e+00 -3.446875000000000000e+01 +1.123990000000000045e+00 -3.450000000000000000e+01 +1.123995000000000077e+00 -3.450000000000000000e+01 +1.124000000000000110e+00 -3.453125000000000000e+01 +1.124005000000000143e+00 -3.456250381469726562e+01 +1.124010000000000176e+00 -3.459375000000000000e+01 +1.124014999999999986e+00 -3.459375000000000000e+01 +1.124020000000000019e+00 -3.453125000000000000e+01 +1.124025000000000052e+00 -3.459375000000000000e+01 +1.124030000000000085e+00 -3.459375000000000000e+01 +1.124035000000000117e+00 -3.456250381469726562e+01 +1.124040000000000150e+00 -3.468750000000000000e+01 +1.124045000000000183e+00 -3.465625000000000000e+01 +1.124049999999999994e+00 -3.462500000000000000e+01 +1.124055000000000026e+00 -3.468750000000000000e+01 +1.124060000000000059e+00 -3.465625000000000000e+01 +1.124065000000000092e+00 -3.465625000000000000e+01 +1.124070000000000125e+00 -3.468750000000000000e+01 +1.124075000000000157e+00 -3.471875000000000000e+01 +1.124080000000000190e+00 -3.468750000000000000e+01 +1.124085000000000001e+00 -3.471875000000000000e+01 +1.124090000000000034e+00 -3.465625000000000000e+01 +1.124095000000000066e+00 -3.465625000000000000e+01 +1.124100000000000099e+00 -3.475000000000000000e+01 +1.124105000000000132e+00 -3.478125000000000000e+01 +1.124110000000000165e+00 -3.475000000000000000e+01 +1.124115000000000197e+00 -3.471875000000000000e+01 +1.124120000000000008e+00 -3.471875000000000000e+01 +1.124125000000000041e+00 -3.475000000000000000e+01 +1.124130000000000074e+00 -3.475000000000000000e+01 +1.124135000000000106e+00 -3.478125000000000000e+01 +1.124140000000000139e+00 -3.484375000000000000e+01 +1.124145000000000172e+00 -3.484375000000000000e+01 +1.124149999999999983e+00 -3.487500000000000000e+01 +1.124155000000000015e+00 -3.481250381469726562e+01 +1.124160000000000048e+00 -3.487500000000000000e+01 +1.124165000000000081e+00 -3.484375000000000000e+01 +1.124170000000000114e+00 -3.484375000000000000e+01 +1.124175000000000146e+00 -3.487500000000000000e+01 +1.124180000000000179e+00 -3.490625000000000000e+01 +1.124184999999999990e+00 -3.487500000000000000e+01 +1.124190000000000023e+00 -3.487500000000000000e+01 +1.124195000000000055e+00 -3.490625000000000000e+01 +1.124200000000000088e+00 -3.487500000000000000e+01 +1.124205000000000121e+00 -3.481250381469726562e+01 +1.124210000000000154e+00 -3.487500000000000000e+01 +1.124215000000000186e+00 -3.493750000000000000e+01 +1.124219999999999997e+00 -3.490625000000000000e+01 +1.124225000000000030e+00 -3.487500000000000000e+01 +1.124230000000000063e+00 -3.490625000000000000e+01 +1.124235000000000095e+00 -3.487500000000000000e+01 +1.124240000000000128e+00 -3.490625000000000000e+01 +1.124245000000000161e+00 -3.487500000000000000e+01 +1.124250000000000194e+00 -3.493750000000000000e+01 +1.124255000000000004e+00 -3.496875381469726562e+01 +1.124260000000000037e+00 -3.487500000000000000e+01 +1.124265000000000070e+00 -3.490625000000000000e+01 +1.124270000000000103e+00 -3.487500000000000000e+01 +1.124275000000000135e+00 -3.490625000000000000e+01 +1.124280000000000168e+00 -3.500000000000000000e+01 +1.124285000000000201e+00 -3.493750000000000000e+01 +1.124290000000000012e+00 -3.493750000000000000e+01 +1.124295000000000044e+00 -3.503125000000000000e+01 +1.124300000000000077e+00 -3.500000000000000000e+01 +1.124305000000000110e+00 -3.500000000000000000e+01 +1.124310000000000143e+00 -3.503125000000000000e+01 +1.124315000000000175e+00 -3.503125000000000000e+01 +1.124319999999999986e+00 -3.503125000000000000e+01 +1.124325000000000019e+00 -3.503125000000000000e+01 +1.124330000000000052e+00 -3.506250000000000000e+01 +1.124335000000000084e+00 -3.506250000000000000e+01 +1.124340000000000117e+00 -3.506250000000000000e+01 +1.124345000000000150e+00 -3.509375000000000000e+01 +1.124350000000000183e+00 -3.506250000000000000e+01 +1.124354999999999993e+00 -3.509375000000000000e+01 +1.124360000000000026e+00 -3.509375000000000000e+01 +1.124365000000000059e+00 -3.506250000000000000e+01 +1.124370000000000092e+00 -3.509375000000000000e+01 +1.124375000000000124e+00 -3.515625000000000000e+01 +1.124380000000000157e+00 -3.509375000000000000e+01 +1.124385000000000190e+00 -3.515625000000000000e+01 +1.124390000000000001e+00 -3.512500381469726562e+01 +1.124395000000000033e+00 -3.515625000000000000e+01 +1.124400000000000066e+00 -3.515625000000000000e+01 +1.124405000000000099e+00 -3.515625000000000000e+01 +1.124410000000000132e+00 -3.515625000000000000e+01 +1.124415000000000164e+00 -3.515625000000000000e+01 +1.124420000000000197e+00 -3.515625000000000000e+01 +1.124425000000000008e+00 -3.518750000000000000e+01 +1.124430000000000041e+00 -3.525000000000000000e+01 +1.124435000000000073e+00 -3.518750000000000000e+01 +1.124440000000000106e+00 -3.525000000000000000e+01 +1.124445000000000139e+00 -3.518750000000000000e+01 +1.124450000000000172e+00 -3.525000000000000000e+01 +1.124454999999999982e+00 -3.521875000000000000e+01 +1.124460000000000015e+00 -3.521875000000000000e+01 +1.124465000000000048e+00 -3.525000000000000000e+01 +1.124470000000000081e+00 -3.521875000000000000e+01 +1.124475000000000113e+00 -3.525000000000000000e+01 +1.124480000000000146e+00 -3.521875000000000000e+01 +1.124485000000000179e+00 -3.528125381469726562e+01 +1.124489999999999990e+00 -3.525000000000000000e+01 +1.124495000000000022e+00 -3.528125381469726562e+01 +1.124500000000000055e+00 -3.531250000000000000e+01 +1.124505000000000088e+00 -3.525000000000000000e+01 +1.124510000000000121e+00 -3.534375000000000000e+01 +1.124515000000000153e+00 -3.531250000000000000e+01 +1.124520000000000186e+00 -3.528125381469726562e+01 +1.124524999999999997e+00 -3.528125381469726562e+01 +1.124530000000000030e+00 -3.531250000000000000e+01 +1.124535000000000062e+00 -3.528125381469726562e+01 +1.124540000000000095e+00 -3.528125381469726562e+01 +1.124545000000000128e+00 -3.534375000000000000e+01 +1.124550000000000161e+00 -3.531250000000000000e+01 +1.124555000000000193e+00 -3.537500000000000000e+01 +1.124560000000000004e+00 -3.531250000000000000e+01 +1.124565000000000037e+00 -3.534375000000000000e+01 +1.124570000000000070e+00 -3.531250000000000000e+01 +1.124575000000000102e+00 -3.540625000000000000e+01 +1.124580000000000135e+00 -3.540625000000000000e+01 +1.124585000000000168e+00 -3.540625000000000000e+01 +1.124590000000000201e+00 -3.543750381469726562e+01 +1.124595000000000011e+00 -3.543750381469726562e+01 +1.124600000000000044e+00 -3.540625000000000000e+01 +1.124605000000000077e+00 -3.543750381469726562e+01 +1.124610000000000110e+00 -3.546875000000000000e+01 +1.124615000000000142e+00 -3.540625000000000000e+01 +1.124620000000000175e+00 -3.543750381469726562e+01 +1.124624999999999986e+00 -3.546875000000000000e+01 +1.124630000000000019e+00 -3.550000000000000000e+01 +1.124635000000000051e+00 -3.546875000000000000e+01 +1.124640000000000084e+00 -3.550000000000000000e+01 +1.124645000000000117e+00 -3.550000000000000000e+01 +1.124650000000000150e+00 -3.546875000000000000e+01 +1.124655000000000182e+00 -3.553125381469726562e+01 +1.124659999999999993e+00 -3.550000000000000000e+01 +1.124665000000000026e+00 -3.550000000000000000e+01 +1.124670000000000059e+00 -3.550000000000000000e+01 +1.124675000000000091e+00 -3.553125381469726562e+01 +1.124680000000000124e+00 -3.553125381469726562e+01 +1.124685000000000157e+00 -3.556250000000000000e+01 +1.124690000000000190e+00 -3.550000000000000000e+01 +1.124695000000000000e+00 -3.553125381469726562e+01 +1.124700000000000033e+00 -3.553125381469726562e+01 +1.124705000000000066e+00 -3.550000000000000000e+01 +1.124710000000000099e+00 -3.556250000000000000e+01 +1.124715000000000131e+00 -3.556250000000000000e+01 +1.124720000000000164e+00 -3.556250000000000000e+01 +1.124725000000000197e+00 -3.553125381469726562e+01 +1.124730000000000008e+00 -3.556250000000000000e+01 +1.124735000000000040e+00 -3.559375000000000000e+01 +1.124740000000000073e+00 -3.559375000000000000e+01 +1.124745000000000106e+00 -3.559375000000000000e+01 +1.124750000000000139e+00 -3.559375000000000000e+01 +1.124755000000000171e+00 -3.559375000000000000e+01 +1.124759999999999982e+00 -3.562500000000000000e+01 +1.124765000000000015e+00 -3.559375000000000000e+01 +1.124770000000000048e+00 -3.562500000000000000e+01 +1.124775000000000080e+00 -3.565625000000000000e+01 +1.124780000000000113e+00 -3.565625000000000000e+01 +1.124785000000000146e+00 -3.565625000000000000e+01 +1.124790000000000179e+00 -3.559375000000000000e+01 +1.124794999999999989e+00 -3.571875000000000000e+01 +1.124800000000000022e+00 -3.568750381469726562e+01 +1.124805000000000055e+00 -3.565625000000000000e+01 +1.124810000000000088e+00 -3.565625000000000000e+01 +1.124815000000000120e+00 -3.565625000000000000e+01 +1.124820000000000153e+00 -3.571875000000000000e+01 +1.124825000000000186e+00 -3.568750381469726562e+01 +1.124829999999999997e+00 -3.571875000000000000e+01 +1.124835000000000029e+00 -3.571875000000000000e+01 +1.124840000000000062e+00 -3.565625000000000000e+01 +1.124845000000000095e+00 -3.575000000000000000e+01 +1.124850000000000128e+00 -3.578125000000000000e+01 +1.124855000000000160e+00 -3.571875000000000000e+01 +1.124860000000000193e+00 -3.575000000000000000e+01 +1.124865000000000004e+00 -3.578125000000000000e+01 +1.124870000000000037e+00 -3.571875000000000000e+01 +1.124875000000000069e+00 -3.578125000000000000e+01 +1.124880000000000102e+00 -3.581250000000000000e+01 +1.124885000000000135e+00 -3.584375381469726562e+01 +1.124890000000000168e+00 -3.578125000000000000e+01 +1.124895000000000200e+00 -3.581250000000000000e+01 +1.124900000000000011e+00 -3.581250000000000000e+01 +1.124905000000000044e+00 -3.578125000000000000e+01 +1.124910000000000077e+00 -3.587500000000000000e+01 +1.124915000000000109e+00 -3.590625000000000000e+01 +1.124920000000000142e+00 -3.584375381469726562e+01 +1.124925000000000175e+00 -3.587500000000000000e+01 +1.124929999999999986e+00 -3.584375381469726562e+01 +1.124935000000000018e+00 -3.590625000000000000e+01 +1.124940000000000051e+00 -3.590625000000000000e+01 +1.124945000000000084e+00 -3.590625000000000000e+01 +1.124950000000000117e+00 -3.587500000000000000e+01 +1.124955000000000149e+00 -3.584375381469726562e+01 +1.124960000000000182e+00 -3.590625000000000000e+01 +1.124964999999999993e+00 -3.593750000000000000e+01 +1.124970000000000026e+00 -3.590625000000000000e+01 +1.124975000000000058e+00 -3.584375381469726562e+01 +1.124980000000000091e+00 -3.587500000000000000e+01 +1.124985000000000124e+00 -3.587500000000000000e+01 +1.124990000000000157e+00 -3.590625000000000000e+01 +1.124995000000000189e+00 -3.584375381469726562e+01 +1.125000000000000000e+00 -3.584375381469726562e+01 +1.125005000000000033e+00 -3.590625000000000000e+01 +1.125010000000000066e+00 -3.584375381469726562e+01 +1.125015000000000098e+00 -3.587500000000000000e+01 +1.125020000000000131e+00 -3.590625000000000000e+01 +1.125025000000000164e+00 -3.584375381469726562e+01 +1.125030000000000197e+00 -3.590625000000000000e+01 +1.125035000000000007e+00 -3.590625000000000000e+01 +1.125040000000000040e+00 -3.590625000000000000e+01 +1.125045000000000073e+00 -3.587500000000000000e+01 +1.125050000000000106e+00 -3.581250000000000000e+01 +1.125055000000000138e+00 -3.587500000000000000e+01 +1.125060000000000171e+00 -3.587500000000000000e+01 +1.125064999999999982e+00 -3.590625000000000000e+01 +1.125070000000000014e+00 -3.587500000000000000e+01 +1.125075000000000047e+00 -3.590625000000000000e+01 +1.125080000000000080e+00 -3.596875000000000000e+01 +1.125085000000000113e+00 -3.596875000000000000e+01 +1.125090000000000146e+00 -3.590625000000000000e+01 +1.125095000000000178e+00 -3.603125000000000000e+01 +1.125099999999999989e+00 -3.600000381469726562e+01 +1.125105000000000022e+00 -3.603125000000000000e+01 +1.125110000000000054e+00 -3.593750000000000000e+01 +1.125115000000000087e+00 -3.600000381469726562e+01 +1.125120000000000120e+00 -3.596875000000000000e+01 +1.125125000000000153e+00 -3.603125000000000000e+01 +1.125130000000000186e+00 -3.596875000000000000e+01 +1.125134999999999996e+00 -3.603125000000000000e+01 +1.125140000000000029e+00 -3.600000381469726562e+01 +1.125145000000000062e+00 -3.603125000000000000e+01 +1.125150000000000095e+00 -3.596875000000000000e+01 +1.125155000000000127e+00 -3.600000381469726562e+01 +1.125160000000000160e+00 -3.603125000000000000e+01 +1.125165000000000193e+00 -3.606250000000000000e+01 +1.125170000000000003e+00 -3.603125000000000000e+01 +1.125175000000000036e+00 -3.609375000000000000e+01 +1.125180000000000069e+00 -3.603125000000000000e+01 +1.125185000000000102e+00 -3.603125000000000000e+01 +1.125190000000000135e+00 -3.609375000000000000e+01 +1.125195000000000167e+00 -3.609375000000000000e+01 +1.125200000000000200e+00 -3.612500000000000000e+01 +1.125205000000000011e+00 -3.603125000000000000e+01 +1.125210000000000043e+00 -3.609375000000000000e+01 +1.125215000000000076e+00 -3.606250000000000000e+01 +1.125220000000000109e+00 -3.615625381469726562e+01 +1.125225000000000142e+00 -3.612500000000000000e+01 +1.125230000000000175e+00 -3.615625381469726562e+01 +1.125234999999999985e+00 -3.612500000000000000e+01 +1.125240000000000018e+00 -3.603125000000000000e+01 +1.125245000000000051e+00 -3.609375000000000000e+01 +1.125250000000000083e+00 -3.615625381469726562e+01 +1.125255000000000116e+00 -3.615625381469726562e+01 +1.125260000000000149e+00 -3.612500000000000000e+01 +1.125265000000000182e+00 -3.609375000000000000e+01 +1.125269999999999992e+00 -3.612500000000000000e+01 +1.125275000000000025e+00 -3.618750000000000000e+01 +1.125280000000000058e+00 -3.618750000000000000e+01 +1.125285000000000091e+00 -3.609375000000000000e+01 +1.125290000000000123e+00 -3.615625381469726562e+01 +1.125295000000000156e+00 -3.612500000000000000e+01 +1.125300000000000189e+00 -3.612500000000000000e+01 +1.125305000000000000e+00 -3.615625381469726562e+01 +1.125310000000000032e+00 -3.615625381469726562e+01 +1.125315000000000065e+00 -3.618750000000000000e+01 +1.125320000000000098e+00 -3.621875000000000000e+01 +1.125325000000000131e+00 -3.615625381469726562e+01 +1.125330000000000163e+00 -3.618750000000000000e+01 +1.125335000000000196e+00 -3.618750000000000000e+01 +1.125340000000000007e+00 -3.618750000000000000e+01 +1.125345000000000040e+00 -3.621875000000000000e+01 +1.125350000000000072e+00 -3.618750000000000000e+01 +1.125355000000000105e+00 -3.628125000000000000e+01 +1.125360000000000138e+00 -3.621875000000000000e+01 +1.125365000000000171e+00 -3.625000000000000000e+01 +1.125369999999999981e+00 -3.634375000000000000e+01 +1.125375000000000014e+00 -3.621875000000000000e+01 +1.125380000000000047e+00 -3.628125000000000000e+01 +1.125385000000000080e+00 -3.628125000000000000e+01 +1.125390000000000112e+00 -3.628125000000000000e+01 +1.125395000000000145e+00 -3.625000000000000000e+01 +1.125400000000000178e+00 -3.628125000000000000e+01 +1.125404999999999989e+00 -3.628125000000000000e+01 +1.125410000000000021e+00 -3.628125000000000000e+01 +1.125415000000000054e+00 -3.628125000000000000e+01 +1.125420000000000087e+00 -3.631250000000000000e+01 +1.125425000000000120e+00 -3.631250000000000000e+01 +1.125430000000000152e+00 -3.628125000000000000e+01 +1.125435000000000185e+00 -3.628125000000000000e+01 +1.125439999999999996e+00 -3.634375000000000000e+01 +1.125445000000000029e+00 -3.634375000000000000e+01 +1.125450000000000061e+00 -3.631250000000000000e+01 +1.125455000000000094e+00 -3.637500000000000000e+01 +1.125460000000000127e+00 -3.637500000000000000e+01 +1.125465000000000160e+00 -3.640625381469726562e+01 +1.125470000000000192e+00 -3.634375000000000000e+01 +1.125475000000000003e+00 -3.643750000000000000e+01 +1.125480000000000036e+00 -3.640625381469726562e+01 +1.125485000000000069e+00 -3.646875000000000000e+01 +1.125490000000000101e+00 -3.643750000000000000e+01 +1.125495000000000134e+00 -3.640625381469726562e+01 +1.125500000000000167e+00 -3.640625381469726562e+01 +1.125505000000000200e+00 -3.643750000000000000e+01 +1.125510000000000010e+00 -3.640625381469726562e+01 +1.125515000000000043e+00 -3.643750000000000000e+01 +1.125520000000000076e+00 -3.643750000000000000e+01 +1.125525000000000109e+00 -3.643750000000000000e+01 +1.125530000000000141e+00 -3.637500000000000000e+01 +1.125535000000000174e+00 -3.643750000000000000e+01 +1.125539999999999985e+00 -3.646875000000000000e+01 +1.125545000000000018e+00 -3.643750000000000000e+01 +1.125550000000000050e+00 -3.643750000000000000e+01 +1.125555000000000083e+00 -3.640625381469726562e+01 +1.125560000000000116e+00 -3.646875000000000000e+01 +1.125565000000000149e+00 -3.646875000000000000e+01 +1.125570000000000181e+00 -3.650000000000000000e+01 +1.125574999999999992e+00 -3.650000000000000000e+01 +1.125580000000000025e+00 -3.650000000000000000e+01 +1.125585000000000058e+00 -3.653125000000000000e+01 +1.125590000000000090e+00 -3.650000000000000000e+01 +1.125595000000000123e+00 -3.653125000000000000e+01 +1.125600000000000156e+00 -3.650000000000000000e+01 +1.125605000000000189e+00 -3.653125000000000000e+01 +1.125609999999999999e+00 -3.653125000000000000e+01 +1.125615000000000032e+00 -3.653125000000000000e+01 +1.125620000000000065e+00 -3.662500000000000000e+01 +1.125625000000000098e+00 -3.650000000000000000e+01 +1.125630000000000130e+00 -3.659375000000000000e+01 +1.125635000000000163e+00 -3.656250381469726562e+01 +1.125640000000000196e+00 -3.653125000000000000e+01 +1.125645000000000007e+00 -3.653125000000000000e+01 +1.125650000000000039e+00 -3.653125000000000000e+01 +1.125655000000000072e+00 -3.656250381469726562e+01 +1.125660000000000105e+00 -3.659375000000000000e+01 +1.125665000000000138e+00 -3.659375000000000000e+01 +1.125670000000000170e+00 -3.662500000000000000e+01 +1.125674999999999981e+00 -3.668750000000000000e+01 +1.125680000000000014e+00 -3.659375000000000000e+01 +1.125685000000000047e+00 -3.665625000000000000e+01 +1.125690000000000079e+00 -3.662500000000000000e+01 +1.125695000000000112e+00 -3.665625000000000000e+01 +1.125700000000000145e+00 -3.665625000000000000e+01 +1.125705000000000178e+00 -3.665625000000000000e+01 +1.125709999999999988e+00 -3.668750000000000000e+01 +1.125715000000000021e+00 -3.665625000000000000e+01 +1.125720000000000054e+00 -3.665625000000000000e+01 +1.125725000000000087e+00 -3.668750000000000000e+01 +1.125730000000000119e+00 -3.668750000000000000e+01 +1.125735000000000152e+00 -3.668750000000000000e+01 +1.125740000000000185e+00 -3.668750000000000000e+01 +1.125744999999999996e+00 -3.668750000000000000e+01 +1.125750000000000028e+00 -3.675000000000000000e+01 +1.125755000000000061e+00 -3.675000000000000000e+01 +1.125760000000000094e+00 -3.671875381469726562e+01 +1.125765000000000127e+00 -3.671875381469726562e+01 +1.125770000000000159e+00 -3.671875381469726562e+01 +1.125775000000000192e+00 -3.675000000000000000e+01 +1.125780000000000003e+00 -3.671875381469726562e+01 +1.125785000000000036e+00 -3.675000000000000000e+01 +1.125790000000000068e+00 -3.671875381469726562e+01 +1.125795000000000101e+00 -3.671875381469726562e+01 +1.125800000000000134e+00 -3.678125000000000000e+01 +1.125805000000000167e+00 -3.675000000000000000e+01 +1.125810000000000199e+00 -3.678125000000000000e+01 +1.125815000000000010e+00 -3.684375000000000000e+01 +1.125820000000000043e+00 -3.681250000000000000e+01 +1.125825000000000076e+00 -3.681250000000000000e+01 +1.125830000000000108e+00 -3.678125000000000000e+01 +1.125835000000000141e+00 -3.678125000000000000e+01 +1.125840000000000174e+00 -3.678125000000000000e+01 +1.125844999999999985e+00 -3.684375000000000000e+01 +1.125850000000000017e+00 -3.684375000000000000e+01 +1.125855000000000050e+00 -3.681250000000000000e+01 +1.125860000000000083e+00 -3.684375000000000000e+01 +1.125865000000000116e+00 -3.681250000000000000e+01 +1.125870000000000148e+00 -3.684375000000000000e+01 +1.125875000000000181e+00 -3.687500381469726562e+01 +1.125879999999999992e+00 -3.684375000000000000e+01 +1.125885000000000025e+00 -3.684375000000000000e+01 +1.125890000000000057e+00 -3.690625000000000000e+01 +1.125895000000000090e+00 -3.678125000000000000e+01 +1.125900000000000123e+00 -3.687500381469726562e+01 +1.125905000000000156e+00 -3.690625000000000000e+01 +1.125910000000000188e+00 -3.687500381469726562e+01 +1.125914999999999999e+00 -3.687500381469726562e+01 +1.125920000000000032e+00 -3.693750000000000000e+01 +1.125925000000000065e+00 -3.687500381469726562e+01 +1.125930000000000097e+00 -3.690625000000000000e+01 +1.125935000000000130e+00 -3.687500381469726562e+01 +1.125940000000000163e+00 -3.687500381469726562e+01 +1.125945000000000196e+00 -3.687500381469726562e+01 +1.125950000000000006e+00 -3.687500381469726562e+01 +1.125955000000000039e+00 -3.690625000000000000e+01 +1.125960000000000072e+00 -3.690625000000000000e+01 +1.125965000000000105e+00 -3.690625000000000000e+01 +1.125970000000000137e+00 -3.687500381469726562e+01 +1.125975000000000170e+00 -3.687500381469726562e+01 +1.125980000000000203e+00 -3.690625000000000000e+01 +1.125985000000000014e+00 -3.693750000000000000e+01 +1.125990000000000046e+00 -3.696875000000000000e+01 +1.125995000000000079e+00 -3.690625000000000000e+01 +1.126000000000000112e+00 -3.693750000000000000e+01 +1.126005000000000145e+00 -3.693750000000000000e+01 +1.126010000000000177e+00 -3.693750000000000000e+01 +1.126014999999999988e+00 -3.696875000000000000e+01 +1.126020000000000021e+00 -3.696875000000000000e+01 +1.126025000000000054e+00 -3.700000000000000000e+01 +1.126030000000000086e+00 -3.696875000000000000e+01 +1.126035000000000119e+00 -3.696875000000000000e+01 +1.126040000000000152e+00 -3.696875000000000000e+01 +1.126045000000000185e+00 -3.693750000000000000e+01 +1.126049999999999995e+00 -3.693750000000000000e+01 +1.126055000000000028e+00 -3.696875000000000000e+01 +1.126060000000000061e+00 -3.693750000000000000e+01 +1.126065000000000094e+00 -3.696875000000000000e+01 +1.126070000000000126e+00 -3.696875000000000000e+01 +1.126075000000000159e+00 -3.696875000000000000e+01 +1.126080000000000192e+00 -3.700000000000000000e+01 +1.126085000000000003e+00 -3.696875000000000000e+01 +1.126090000000000035e+00 -3.703125381469726562e+01 +1.126095000000000068e+00 -3.700000000000000000e+01 +1.126100000000000101e+00 -3.700000000000000000e+01 +1.126105000000000134e+00 -3.700000000000000000e+01 +1.126110000000000166e+00 -3.706250000000000000e+01 +1.126115000000000199e+00 -3.700000000000000000e+01 +1.126120000000000010e+00 -3.706250000000000000e+01 +1.126125000000000043e+00 -3.703125381469726562e+01 +1.126130000000000075e+00 -3.703125381469726562e+01 +1.126135000000000108e+00 -3.700000000000000000e+01 +1.126140000000000141e+00 -3.703125381469726562e+01 +1.126145000000000174e+00 -3.706250000000000000e+01 +1.126149999999999984e+00 -3.706250000000000000e+01 +1.126155000000000017e+00 -3.703125381469726562e+01 +1.126160000000000050e+00 -3.709375000000000000e+01 +1.126165000000000083e+00 -3.700000000000000000e+01 +1.126170000000000115e+00 -3.700000000000000000e+01 +1.126175000000000148e+00 -3.703125381469726562e+01 +1.126180000000000181e+00 -3.709375000000000000e+01 +1.126184999999999992e+00 -3.706250000000000000e+01 +1.126190000000000024e+00 -3.706250000000000000e+01 +1.126195000000000057e+00 -3.700000000000000000e+01 +1.126200000000000090e+00 -3.706250000000000000e+01 +1.126205000000000123e+00 -3.703125381469726562e+01 +1.126210000000000155e+00 -3.709375000000000000e+01 +1.126215000000000188e+00 -3.709375000000000000e+01 +1.126219999999999999e+00 -3.709375000000000000e+01 +1.126225000000000032e+00 -3.703125381469726562e+01 +1.126230000000000064e+00 -3.709375000000000000e+01 +1.126235000000000097e+00 -3.706250000000000000e+01 +1.126240000000000130e+00 -3.703125381469726562e+01 +1.126245000000000163e+00 -3.706250000000000000e+01 +1.126250000000000195e+00 -3.706250000000000000e+01 +1.126255000000000006e+00 -3.709375000000000000e+01 +1.126260000000000039e+00 -3.709375000000000000e+01 +1.126265000000000072e+00 -3.709375000000000000e+01 +1.126270000000000104e+00 -3.715625000000000000e+01 +1.126275000000000137e+00 -3.709375000000000000e+01 +1.126280000000000170e+00 -3.709375000000000000e+01 +1.126285000000000203e+00 -3.712500381469726562e+01 +1.126290000000000013e+00 -3.715625000000000000e+01 +1.126295000000000046e+00 -3.709375000000000000e+01 +1.126300000000000079e+00 -3.712500381469726562e+01 +1.126305000000000112e+00 -3.715625000000000000e+01 +1.126310000000000144e+00 -3.709375000000000000e+01 +1.126315000000000177e+00 -3.712500381469726562e+01 +1.126319999999999988e+00 -3.721875000000000000e+01 +1.126325000000000021e+00 -3.715625000000000000e+01 +1.126330000000000053e+00 -3.715625000000000000e+01 +1.126335000000000086e+00 -3.712500381469726562e+01 +1.126340000000000119e+00 -3.712500381469726562e+01 +1.126345000000000152e+00 -3.718750000000000000e+01 +1.126350000000000184e+00 -3.712500381469726562e+01 +1.126354999999999995e+00 -3.718750000000000000e+01 +1.126360000000000028e+00 -3.715625000000000000e+01 +1.126365000000000061e+00 -3.721875000000000000e+01 +1.126370000000000093e+00 -3.718750000000000000e+01 +1.126375000000000126e+00 -3.725000000000000000e+01 +1.126380000000000159e+00 -3.721875000000000000e+01 +1.126385000000000192e+00 -3.721875000000000000e+01 +1.126390000000000002e+00 -3.728125381469726562e+01 +1.126395000000000035e+00 -3.728125381469726562e+01 +1.126400000000000068e+00 -3.721875000000000000e+01 +1.126405000000000101e+00 -3.718750000000000000e+01 +1.126410000000000133e+00 -3.728125381469726562e+01 +1.126415000000000166e+00 -3.728125381469726562e+01 +1.126420000000000199e+00 -3.728125381469726562e+01 +1.126425000000000010e+00 -3.728125381469726562e+01 +1.126430000000000042e+00 -3.728125381469726562e+01 +1.126435000000000075e+00 -3.728125381469726562e+01 +1.126440000000000108e+00 -3.721875000000000000e+01 +1.126445000000000141e+00 -3.728125381469726562e+01 +1.126450000000000173e+00 -3.731250000000000000e+01 +1.126454999999999984e+00 -3.728125381469726562e+01 +1.126460000000000017e+00 -3.721875000000000000e+01 +1.126465000000000050e+00 -3.725000000000000000e+01 +1.126470000000000082e+00 -3.728125381469726562e+01 +1.126475000000000115e+00 -3.731250000000000000e+01 +1.126480000000000148e+00 -3.728125381469726562e+01 +1.126485000000000181e+00 -3.725000000000000000e+01 +1.126489999999999991e+00 -3.734375000000000000e+01 +1.126495000000000024e+00 -3.731250000000000000e+01 +1.126500000000000057e+00 -3.734375000000000000e+01 +1.126505000000000090e+00 -3.731250000000000000e+01 +1.126510000000000122e+00 -3.737500000000000000e+01 +1.126515000000000155e+00 -3.737500000000000000e+01 +1.126520000000000188e+00 -3.737500000000000000e+01 +1.126524999999999999e+00 -3.731250000000000000e+01 +1.126530000000000031e+00 -3.740625000000000000e+01 +1.126535000000000064e+00 -3.743750381469726562e+01 +1.126540000000000097e+00 -3.740625000000000000e+01 +1.126545000000000130e+00 -3.737500000000000000e+01 +1.126550000000000162e+00 -3.737500000000000000e+01 +1.126555000000000195e+00 -3.734375000000000000e+01 +1.126560000000000006e+00 -3.737500000000000000e+01 +1.126565000000000039e+00 -3.737500000000000000e+01 +1.126570000000000071e+00 -3.740625000000000000e+01 +1.126575000000000104e+00 -3.731250000000000000e+01 +1.126580000000000137e+00 -3.737500000000000000e+01 +1.126585000000000170e+00 -3.737500000000000000e+01 +1.126590000000000202e+00 -3.740625000000000000e+01 +1.126595000000000013e+00 -3.740625000000000000e+01 +1.126600000000000046e+00 -3.740625000000000000e+01 +1.126605000000000079e+00 -3.734375000000000000e+01 +1.126610000000000111e+00 -3.734375000000000000e+01 +1.126615000000000144e+00 -3.743750381469726562e+01 +1.126620000000000177e+00 -3.734375000000000000e+01 +1.126624999999999988e+00 -3.740625000000000000e+01 +1.126630000000000020e+00 -3.743750381469726562e+01 +1.126635000000000053e+00 -3.737500000000000000e+01 +1.126640000000000086e+00 -3.746875000000000000e+01 +1.126645000000000119e+00 -3.737500000000000000e+01 +1.126650000000000151e+00 -3.746875000000000000e+01 +1.126655000000000184e+00 -3.743750381469726562e+01 +1.126659999999999995e+00 -3.740625000000000000e+01 +1.126665000000000028e+00 -3.740625000000000000e+01 +1.126670000000000060e+00 -3.740625000000000000e+01 +1.126675000000000093e+00 -3.734375000000000000e+01 +1.126680000000000126e+00 -3.740625000000000000e+01 +1.126685000000000159e+00 -3.743750381469726562e+01 +1.126690000000000191e+00 -3.743750381469726562e+01 +1.126695000000000002e+00 -3.740625000000000000e+01 +1.126700000000000035e+00 -3.743750381469726562e+01 +1.126705000000000068e+00 -3.746875000000000000e+01 +1.126710000000000100e+00 -3.740625000000000000e+01 +1.126715000000000133e+00 -3.743750381469726562e+01 +1.126720000000000166e+00 -3.743750381469726562e+01 +1.126725000000000199e+00 -3.746875000000000000e+01 +1.126730000000000009e+00 -3.737500000000000000e+01 +1.126735000000000042e+00 -3.743750381469726562e+01 +1.126740000000000075e+00 -3.743750381469726562e+01 +1.126745000000000108e+00 -3.750000000000000000e+01 +1.126750000000000140e+00 -3.743750381469726562e+01 +1.126755000000000173e+00 -3.746875000000000000e+01 +1.126759999999999984e+00 -3.746875000000000000e+01 +1.126765000000000017e+00 -3.740625000000000000e+01 +1.126770000000000049e+00 -3.743750381469726562e+01 +1.126775000000000082e+00 -3.750000000000000000e+01 +1.126780000000000115e+00 -3.746875000000000000e+01 +1.126785000000000148e+00 -3.743750381469726562e+01 +1.126790000000000180e+00 -3.750000000000000000e+01 +1.126794999999999991e+00 -3.753125000000000000e+01 +1.126800000000000024e+00 -3.750000000000000000e+01 +1.126805000000000057e+00 -3.753125000000000000e+01 +1.126810000000000089e+00 -3.756250000000000000e+01 +1.126815000000000122e+00 -3.750000000000000000e+01 +1.126820000000000155e+00 -3.756250000000000000e+01 +1.126825000000000188e+00 -3.756250000000000000e+01 +1.126829999999999998e+00 -3.753125000000000000e+01 +1.126835000000000031e+00 -3.746875000000000000e+01 +1.126840000000000064e+00 -3.759375381469726562e+01 +1.126845000000000097e+00 -3.756250000000000000e+01 +1.126850000000000129e+00 -3.753125000000000000e+01 +1.126855000000000162e+00 -3.756250000000000000e+01 +1.126860000000000195e+00 -3.756250000000000000e+01 +1.126865000000000006e+00 -3.762500000000000000e+01 +1.126870000000000038e+00 -3.756250000000000000e+01 +1.126875000000000071e+00 -3.759375381469726562e+01 +1.126880000000000104e+00 -3.750000000000000000e+01 +1.126885000000000137e+00 -3.756250000000000000e+01 +1.126890000000000169e+00 -3.756250000000000000e+01 +1.126895000000000202e+00 -3.762500000000000000e+01 +1.126900000000000013e+00 -3.756250000000000000e+01 +1.126905000000000046e+00 -3.765625000000000000e+01 +1.126910000000000078e+00 -3.759375381469726562e+01 +1.126915000000000111e+00 -3.759375381469726562e+01 +1.126920000000000144e+00 -3.759375381469726562e+01 +1.126925000000000177e+00 -3.759375381469726562e+01 +1.126929999999999987e+00 -3.753125000000000000e+01 +1.126935000000000020e+00 -3.753125000000000000e+01 +1.126940000000000053e+00 -3.765625000000000000e+01 +1.126945000000000086e+00 -3.762500000000000000e+01 +1.126950000000000118e+00 -3.753125000000000000e+01 +1.126955000000000151e+00 -3.762500000000000000e+01 +1.126960000000000184e+00 -3.756250000000000000e+01 +1.126964999999999995e+00 -3.759375381469726562e+01 +1.126970000000000027e+00 -3.756250000000000000e+01 +1.126975000000000060e+00 -3.759375381469726562e+01 +1.126980000000000093e+00 -3.762500000000000000e+01 +1.126985000000000126e+00 -3.762500000000000000e+01 +1.126990000000000158e+00 -3.759375381469726562e+01 +1.126995000000000191e+00 -3.762500000000000000e+01 +1.127000000000000002e+00 -3.765625000000000000e+01 +1.127005000000000035e+00 -3.762500000000000000e+01 +1.127010000000000067e+00 -3.762500000000000000e+01 +1.127015000000000100e+00 -3.765625000000000000e+01 +1.127020000000000133e+00 -3.759375381469726562e+01 +1.127025000000000166e+00 -3.765625000000000000e+01 +1.127030000000000198e+00 -3.762500000000000000e+01 +1.127035000000000009e+00 -3.768750000000000000e+01 +1.127040000000000042e+00 -3.768750000000000000e+01 +1.127045000000000075e+00 -3.765625000000000000e+01 +1.127050000000000107e+00 -3.768750000000000000e+01 +1.127055000000000140e+00 -3.765625000000000000e+01 +1.127060000000000173e+00 -3.765625000000000000e+01 +1.127064999999999984e+00 -3.768750000000000000e+01 +1.127070000000000016e+00 -3.771875000000000000e+01 +1.127075000000000049e+00 -3.775000381469726562e+01 +1.127080000000000082e+00 -3.765625000000000000e+01 +1.127085000000000115e+00 -3.765625000000000000e+01 +1.127090000000000147e+00 -3.771875000000000000e+01 +1.127095000000000180e+00 -3.775000381469726562e+01 +1.127099999999999991e+00 -3.771875000000000000e+01 +1.127105000000000024e+00 -3.762500000000000000e+01 +1.127110000000000056e+00 -3.775000381469726562e+01 +1.127115000000000089e+00 -3.768750000000000000e+01 +1.127120000000000122e+00 -3.771875000000000000e+01 +1.127125000000000155e+00 -3.768750000000000000e+01 +1.127130000000000187e+00 -3.768750000000000000e+01 +1.127134999999999998e+00 -3.768750000000000000e+01 +1.127140000000000031e+00 -3.775000381469726562e+01 +1.127145000000000064e+00 -3.775000381469726562e+01 +1.127150000000000096e+00 -3.771875000000000000e+01 +1.127155000000000129e+00 -3.771875000000000000e+01 +1.127160000000000162e+00 -3.762500000000000000e+01 +1.127165000000000195e+00 -3.775000381469726562e+01 +1.127170000000000005e+00 -3.775000381469726562e+01 +1.127175000000000038e+00 -3.771875000000000000e+01 +1.127180000000000071e+00 -3.778125000000000000e+01 +1.127185000000000104e+00 -3.768750000000000000e+01 +1.127190000000000136e+00 -3.781250000000000000e+01 +1.127195000000000169e+00 -3.778125000000000000e+01 +1.127200000000000202e+00 -3.775000381469726562e+01 +1.127205000000000013e+00 -3.778125000000000000e+01 +1.127210000000000045e+00 -3.775000381469726562e+01 +1.127215000000000078e+00 -3.778125000000000000e+01 +1.127220000000000111e+00 -3.778125000000000000e+01 +1.127225000000000144e+00 -3.781250000000000000e+01 +1.127230000000000176e+00 -3.781250000000000000e+01 +1.127234999999999987e+00 -3.778125000000000000e+01 +1.127240000000000020e+00 -3.787500000000000000e+01 +1.127245000000000053e+00 -3.781250000000000000e+01 +1.127250000000000085e+00 -3.778125000000000000e+01 +1.127255000000000118e+00 -3.784375381469726562e+01 +1.127260000000000151e+00 -3.784375381469726562e+01 +1.127265000000000184e+00 -3.781250000000000000e+01 +1.127269999999999994e+00 -3.784375381469726562e+01 +1.127275000000000027e+00 -3.784375381469726562e+01 +1.127280000000000060e+00 -3.778125000000000000e+01 +1.127285000000000093e+00 -3.784375381469726562e+01 +1.127290000000000125e+00 -3.787500000000000000e+01 +1.127295000000000158e+00 -3.778125000000000000e+01 +1.127300000000000191e+00 -3.778125000000000000e+01 +1.127305000000000001e+00 -3.781250000000000000e+01 +1.127310000000000034e+00 -3.781250000000000000e+01 +1.127315000000000067e+00 -3.787500000000000000e+01 +1.127320000000000100e+00 -3.784375381469726562e+01 +1.127325000000000133e+00 -3.787500000000000000e+01 +1.127330000000000165e+00 -3.775000381469726562e+01 +1.127335000000000198e+00 -3.784375381469726562e+01 +1.127340000000000009e+00 -3.784375381469726562e+01 +1.127345000000000041e+00 -3.784375381469726562e+01 +1.127350000000000074e+00 -3.784375381469726562e+01 +1.127355000000000107e+00 -3.787500000000000000e+01 +1.127360000000000140e+00 -3.784375381469726562e+01 +1.127365000000000173e+00 -3.793750000000000000e+01 +1.127369999999999983e+00 -3.787500000000000000e+01 +1.127375000000000016e+00 -3.787500000000000000e+01 +1.127380000000000049e+00 -3.784375381469726562e+01 +1.127385000000000081e+00 -3.790625000000000000e+01 +1.127390000000000114e+00 -3.784375381469726562e+01 +1.127395000000000147e+00 -3.784375381469726562e+01 +1.127400000000000180e+00 -3.784375381469726562e+01 +1.127404999999999990e+00 -3.784375381469726562e+01 +1.127410000000000023e+00 -3.787500000000000000e+01 +1.127415000000000056e+00 -3.787500000000000000e+01 +1.127420000000000089e+00 -3.790625000000000000e+01 +1.127425000000000122e+00 -3.790625000000000000e+01 +1.127430000000000154e+00 -3.787500000000000000e+01 +1.127435000000000187e+00 -3.787500000000000000e+01 +1.127439999999999998e+00 -3.790625000000000000e+01 +1.127445000000000030e+00 -3.787500000000000000e+01 +1.127450000000000063e+00 -3.790625000000000000e+01 +1.127455000000000096e+00 -3.793750000000000000e+01 +1.127460000000000129e+00 -3.793750000000000000e+01 +1.127465000000000162e+00 -3.800000381469726562e+01 +1.127470000000000194e+00 -3.790625000000000000e+01 +1.127475000000000005e+00 -3.796875000000000000e+01 +1.127480000000000038e+00 -3.793750000000000000e+01 +1.127485000000000070e+00 -3.790625000000000000e+01 +1.127490000000000103e+00 -3.793750000000000000e+01 +1.127495000000000136e+00 -3.790625000000000000e+01 +1.127500000000000169e+00 -3.790625000000000000e+01 +1.127505000000000202e+00 -3.790625000000000000e+01 +1.127510000000000012e+00 -3.790625000000000000e+01 +1.127515000000000045e+00 -3.790625000000000000e+01 +1.127520000000000078e+00 -3.800000381469726562e+01 +1.127525000000000110e+00 -3.793750000000000000e+01 +1.127530000000000143e+00 -3.800000381469726562e+01 +1.127535000000000176e+00 -3.800000381469726562e+01 +1.127539999999999987e+00 -3.793750000000000000e+01 +1.127545000000000019e+00 -3.803125000000000000e+01 +1.127550000000000052e+00 -3.796875000000000000e+01 +1.127555000000000085e+00 -3.800000381469726562e+01 +1.127560000000000118e+00 -3.800000381469726562e+01 +1.127565000000000150e+00 -3.796875000000000000e+01 +1.127570000000000183e+00 -3.796875000000000000e+01 +1.127574999999999994e+00 -3.796875000000000000e+01 +1.127580000000000027e+00 -3.796875000000000000e+01 +1.127585000000000059e+00 -3.796875000000000000e+01 +1.127590000000000092e+00 -3.803125000000000000e+01 +1.127595000000000125e+00 -3.803125000000000000e+01 +1.127600000000000158e+00 -3.809375000000000000e+01 +1.127605000000000190e+00 -3.796875000000000000e+01 +1.127610000000000001e+00 -3.806250000000000000e+01 +1.127615000000000034e+00 -3.803125000000000000e+01 +1.127620000000000067e+00 -3.800000381469726562e+01 +1.127625000000000099e+00 -3.806250000000000000e+01 +1.127630000000000132e+00 -3.809375000000000000e+01 +1.127635000000000165e+00 -3.800000381469726562e+01 +1.127640000000000198e+00 -3.803125000000000000e+01 +1.127645000000000008e+00 -3.803125000000000000e+01 +1.127650000000000041e+00 -3.803125000000000000e+01 +1.127655000000000074e+00 -3.806250000000000000e+01 +1.127660000000000107e+00 -3.809375000000000000e+01 +1.127665000000000139e+00 -3.815625381469726562e+01 +1.127670000000000172e+00 -3.806250000000000000e+01 +1.127674999999999983e+00 -3.806250000000000000e+01 +1.127680000000000016e+00 -3.815625381469726562e+01 +1.127685000000000048e+00 -3.809375000000000000e+01 +1.127690000000000081e+00 -3.806250000000000000e+01 +1.127695000000000114e+00 -3.812500000000000000e+01 +1.127700000000000147e+00 -3.803125000000000000e+01 +1.127705000000000179e+00 -3.812500000000000000e+01 +1.127709999999999990e+00 -3.812500000000000000e+01 +1.127715000000000023e+00 -3.806250000000000000e+01 +1.127720000000000056e+00 -3.815625381469726562e+01 +1.127725000000000088e+00 -3.809375000000000000e+01 +1.127730000000000121e+00 -3.815625381469726562e+01 +1.127735000000000154e+00 -3.809375000000000000e+01 +1.127740000000000187e+00 -3.815625381469726562e+01 +1.127744999999999997e+00 -3.812500000000000000e+01 +1.127750000000000030e+00 -3.809375000000000000e+01 +1.127755000000000063e+00 -3.815625381469726562e+01 +1.127760000000000096e+00 -3.812500000000000000e+01 +1.127765000000000128e+00 -3.812500000000000000e+01 +1.127770000000000161e+00 -3.815625381469726562e+01 +1.127775000000000194e+00 -3.815625381469726562e+01 +1.127780000000000005e+00 -3.818750000000000000e+01 +1.127785000000000037e+00 -3.815625381469726562e+01 +1.127790000000000070e+00 -3.818750000000000000e+01 +1.127795000000000103e+00 -3.818750000000000000e+01 +1.127800000000000136e+00 -3.818750000000000000e+01 +1.127805000000000168e+00 -3.825000000000000000e+01 +1.127810000000000201e+00 -3.818750000000000000e+01 +1.127815000000000012e+00 -3.821875000000000000e+01 +1.127820000000000045e+00 -3.815625381469726562e+01 +1.127825000000000077e+00 -3.815625381469726562e+01 +1.127830000000000110e+00 -3.821875000000000000e+01 +1.127835000000000143e+00 -3.825000000000000000e+01 +1.127840000000000176e+00 -3.818750000000000000e+01 +1.127844999999999986e+00 -3.818750000000000000e+01 +1.127850000000000019e+00 -3.821875000000000000e+01 +1.127855000000000052e+00 -3.821875000000000000e+01 +1.127860000000000085e+00 -3.825000000000000000e+01 +1.127865000000000117e+00 -3.828125000000000000e+01 +1.127870000000000150e+00 -3.818750000000000000e+01 +1.127875000000000183e+00 -3.818750000000000000e+01 +1.127879999999999994e+00 -3.825000000000000000e+01 +1.127885000000000026e+00 -3.818750000000000000e+01 +1.127890000000000059e+00 -3.818750000000000000e+01 +1.127895000000000092e+00 -3.818750000000000000e+01 +1.127900000000000125e+00 -3.825000000000000000e+01 +1.127905000000000157e+00 -3.825000000000000000e+01 +1.127910000000000190e+00 -3.825000000000000000e+01 +1.127915000000000001e+00 -3.825000000000000000e+01 +1.127920000000000034e+00 -3.828125000000000000e+01 +1.127925000000000066e+00 -3.828125000000000000e+01 +1.127930000000000099e+00 -3.828125000000000000e+01 +1.127935000000000132e+00 -3.828125000000000000e+01 +1.127940000000000165e+00 -3.831250381469726562e+01 +1.127945000000000197e+00 -3.828125000000000000e+01 +1.127950000000000008e+00 -3.831250381469726562e+01 +1.127955000000000041e+00 -3.828125000000000000e+01 +1.127960000000000074e+00 -3.834375000000000000e+01 +1.127965000000000106e+00 -3.828125000000000000e+01 +1.127970000000000139e+00 -3.821875000000000000e+01 +1.127975000000000172e+00 -3.828125000000000000e+01 +1.127979999999999983e+00 -3.831250381469726562e+01 +1.127985000000000015e+00 -3.831250381469726562e+01 +1.127990000000000048e+00 -3.834375000000000000e+01 +1.127995000000000081e+00 -3.831250381469726562e+01 +1.128000000000000114e+00 -3.834375000000000000e+01 +1.128005000000000146e+00 -3.831250381469726562e+01 +1.128010000000000179e+00 -3.828125000000000000e+01 +1.128014999999999990e+00 -3.828125000000000000e+01 +1.128020000000000023e+00 -3.834375000000000000e+01 +1.128025000000000055e+00 -3.834375000000000000e+01 +1.128030000000000088e+00 -3.834375000000000000e+01 +1.128035000000000121e+00 -3.837500000000000000e+01 +1.128040000000000154e+00 -3.828125000000000000e+01 +1.128045000000000186e+00 -3.837500000000000000e+01 +1.128049999999999997e+00 -3.834375000000000000e+01 +1.128055000000000030e+00 -3.834375000000000000e+01 +1.128060000000000063e+00 -3.834375000000000000e+01 +1.128065000000000095e+00 -3.834375000000000000e+01 +1.128070000000000128e+00 -3.831250381469726562e+01 +1.128075000000000161e+00 -3.837500000000000000e+01 +1.128080000000000194e+00 -3.834375000000000000e+01 +1.128085000000000004e+00 -3.837500000000000000e+01 +1.128090000000000037e+00 -3.828125000000000000e+01 +1.128095000000000070e+00 -3.834375000000000000e+01 +1.128100000000000103e+00 -3.834375000000000000e+01 +1.128105000000000135e+00 -3.831250381469726562e+01 +1.128110000000000168e+00 -3.837500000000000000e+01 +1.128115000000000201e+00 -3.834375000000000000e+01 +1.128120000000000012e+00 -3.834375000000000000e+01 +1.128125000000000044e+00 -3.834375000000000000e+01 +1.128130000000000077e+00 -3.837500000000000000e+01 +1.128135000000000110e+00 -3.834375000000000000e+01 +1.128140000000000143e+00 -3.837500000000000000e+01 +1.128145000000000175e+00 -3.834375000000000000e+01 +1.128149999999999986e+00 -3.840625000000000000e+01 +1.128155000000000019e+00 -3.834375000000000000e+01 +1.128160000000000052e+00 -3.834375000000000000e+01 +1.128165000000000084e+00 -3.834375000000000000e+01 +1.128170000000000117e+00 -3.837500000000000000e+01 +1.128175000000000150e+00 -3.834375000000000000e+01 +1.128180000000000183e+00 -3.837500000000000000e+01 +1.128184999999999993e+00 -3.837500000000000000e+01 +1.128190000000000026e+00 -3.834375000000000000e+01 +1.128195000000000059e+00 -3.831250381469726562e+01 +1.128200000000000092e+00 -3.837500000000000000e+01 +1.128205000000000124e+00 -3.843750000000000000e+01 +1.128210000000000157e+00 -3.837500000000000000e+01 +1.128215000000000190e+00 -3.846875381469726562e+01 +1.128220000000000001e+00 -3.840625000000000000e+01 +1.128225000000000033e+00 -3.840625000000000000e+01 +1.128230000000000066e+00 -3.840625000000000000e+01 +1.128235000000000099e+00 -3.834375000000000000e+01 +1.128240000000000132e+00 -3.837500000000000000e+01 +1.128245000000000164e+00 -3.840625000000000000e+01 +1.128250000000000197e+00 -3.837500000000000000e+01 +1.128255000000000008e+00 -3.840625000000000000e+01 +1.128260000000000041e+00 -3.843750000000000000e+01 +1.128265000000000073e+00 -3.840625000000000000e+01 +1.128270000000000106e+00 -3.843750000000000000e+01 +1.128275000000000139e+00 -3.843750000000000000e+01 +1.128280000000000172e+00 -3.843750000000000000e+01 +1.128284999999999982e+00 -3.840625000000000000e+01 +1.128290000000000015e+00 -3.843750000000000000e+01 +1.128295000000000048e+00 -3.843750000000000000e+01 +1.128300000000000081e+00 -3.843750000000000000e+01 +1.128305000000000113e+00 -3.840625000000000000e+01 +1.128310000000000146e+00 -3.843750000000000000e+01 +1.128315000000000179e+00 -3.846875381469726562e+01 +1.128319999999999990e+00 -3.843750000000000000e+01 +1.128325000000000022e+00 -3.843750000000000000e+01 +1.128330000000000055e+00 -3.840625000000000000e+01 +1.128335000000000088e+00 -3.846875381469726562e+01 +1.128340000000000121e+00 -3.846875381469726562e+01 +1.128345000000000153e+00 -3.846875381469726562e+01 +1.128350000000000186e+00 -3.850000000000000000e+01 +1.128354999999999997e+00 -3.843750000000000000e+01 +1.128360000000000030e+00 -3.850000000000000000e+01 +1.128365000000000062e+00 -3.850000000000000000e+01 +1.128370000000000095e+00 -3.846875381469726562e+01 +1.128375000000000128e+00 -3.846875381469726562e+01 +1.128380000000000161e+00 -3.850000000000000000e+01 +1.128385000000000193e+00 -3.850000000000000000e+01 +1.128390000000000004e+00 -3.853125000000000000e+01 +1.128395000000000037e+00 -3.853125000000000000e+01 +1.128400000000000070e+00 -3.853125000000000000e+01 +1.128405000000000102e+00 -3.846875381469726562e+01 +1.128410000000000135e+00 -3.850000000000000000e+01 +1.128415000000000168e+00 -3.846875381469726562e+01 +1.128420000000000201e+00 -3.856250381469726562e+01 +1.128425000000000011e+00 -3.850000000000000000e+01 +1.128430000000000044e+00 -3.856250381469726562e+01 +1.128435000000000077e+00 -3.853125000000000000e+01 +1.128440000000000110e+00 -3.859375000000000000e+01 +1.128445000000000142e+00 -3.853125000000000000e+01 +1.128450000000000175e+00 -3.853125000000000000e+01 +1.128454999999999986e+00 -3.853125000000000000e+01 +1.128460000000000019e+00 -3.856250381469726562e+01 +1.128465000000000051e+00 -3.856250381469726562e+01 +1.128470000000000084e+00 -3.856250381469726562e+01 +1.128475000000000117e+00 -3.856250381469726562e+01 +1.128480000000000150e+00 -3.856250381469726562e+01 +1.128485000000000182e+00 -3.859375000000000000e+01 +1.128489999999999993e+00 -3.859375000000000000e+01 +1.128495000000000026e+00 -3.862500000000000000e+01 +1.128500000000000059e+00 -3.859375000000000000e+01 +1.128505000000000091e+00 -3.853125000000000000e+01 +1.128510000000000124e+00 -3.853125000000000000e+01 +1.128515000000000157e+00 -3.856250381469726562e+01 +1.128520000000000190e+00 -3.865625000000000000e+01 +1.128525000000000000e+00 -3.859375000000000000e+01 +1.128530000000000033e+00 -3.859375000000000000e+01 +1.128535000000000066e+00 -3.856250381469726562e+01 +1.128540000000000099e+00 -3.853125000000000000e+01 +1.128545000000000131e+00 -3.859375000000000000e+01 +1.128550000000000164e+00 -3.859375000000000000e+01 +1.128555000000000197e+00 -3.859375000000000000e+01 +1.128560000000000008e+00 -3.853125000000000000e+01 +1.128565000000000040e+00 -3.856250381469726562e+01 +1.128570000000000073e+00 -3.865625000000000000e+01 +1.128575000000000106e+00 -3.850000000000000000e+01 +1.128580000000000139e+00 -3.856250381469726562e+01 +1.128585000000000171e+00 -3.859375000000000000e+01 +1.128589999999999982e+00 -3.856250381469726562e+01 +1.128595000000000015e+00 -3.856250381469726562e+01 +1.128600000000000048e+00 -3.859375000000000000e+01 +1.128605000000000080e+00 -3.853125000000000000e+01 +1.128610000000000113e+00 -3.853125000000000000e+01 +1.128615000000000146e+00 -3.856250381469726562e+01 +1.128620000000000179e+00 -3.865625000000000000e+01 +1.128624999999999989e+00 -3.856250381469726562e+01 +1.128630000000000022e+00 -3.853125000000000000e+01 +1.128635000000000055e+00 -3.859375000000000000e+01 +1.128640000000000088e+00 -3.856250381469726562e+01 +1.128645000000000120e+00 -3.862500000000000000e+01 +1.128650000000000153e+00 -3.862500000000000000e+01 +1.128655000000000186e+00 -3.859375000000000000e+01 +1.128659999999999997e+00 -3.859375000000000000e+01 +1.128665000000000029e+00 -3.862500000000000000e+01 +1.128670000000000062e+00 -3.865625000000000000e+01 +1.128675000000000095e+00 -3.859375000000000000e+01 +1.128680000000000128e+00 -3.862500000000000000e+01 +1.128685000000000160e+00 -3.865625000000000000e+01 +1.128690000000000193e+00 -3.859375000000000000e+01 +1.128695000000000004e+00 -3.865625000000000000e+01 +1.128700000000000037e+00 -3.868750000000000000e+01 +1.128705000000000069e+00 -3.862500000000000000e+01 +1.128710000000000102e+00 -3.868750000000000000e+01 +1.128715000000000135e+00 -3.865625000000000000e+01 +1.128720000000000168e+00 -3.868750000000000000e+01 +1.128725000000000200e+00 -3.868750000000000000e+01 +1.128730000000000011e+00 -3.865625000000000000e+01 +1.128735000000000044e+00 -3.865625000000000000e+01 +1.128740000000000077e+00 -3.865625000000000000e+01 +1.128745000000000109e+00 -3.868750000000000000e+01 +1.128750000000000142e+00 -3.865625000000000000e+01 +1.128755000000000175e+00 -3.871875381469726562e+01 +1.128759999999999986e+00 -3.865625000000000000e+01 +1.128765000000000018e+00 -3.868750000000000000e+01 +1.128770000000000051e+00 -3.865625000000000000e+01 +1.128775000000000084e+00 -3.865625000000000000e+01 +1.128780000000000117e+00 -3.868750000000000000e+01 +1.128785000000000149e+00 -3.865625000000000000e+01 +1.128790000000000182e+00 -3.871875381469726562e+01 +1.128794999999999993e+00 -3.862500000000000000e+01 +1.128800000000000026e+00 -3.868750000000000000e+01 +1.128805000000000058e+00 -3.865625000000000000e+01 +1.128810000000000091e+00 -3.862500000000000000e+01 +1.128815000000000124e+00 -3.862500000000000000e+01 +1.128820000000000157e+00 -3.862500000000000000e+01 +1.128825000000000189e+00 -3.871875381469726562e+01 +1.128830000000000000e+00 -3.865625000000000000e+01 +1.128835000000000033e+00 -3.862500000000000000e+01 +1.128840000000000066e+00 -3.871875381469726562e+01 +1.128845000000000098e+00 -3.868750000000000000e+01 +1.128850000000000131e+00 -3.868750000000000000e+01 +1.128855000000000164e+00 -3.865625000000000000e+01 +1.128860000000000197e+00 -3.871875381469726562e+01 +1.128865000000000007e+00 -3.868750000000000000e+01 +1.128870000000000040e+00 -3.868750000000000000e+01 +1.128875000000000073e+00 -3.865625000000000000e+01 +1.128880000000000106e+00 -3.865625000000000000e+01 +1.128885000000000138e+00 -3.862500000000000000e+01 +1.128890000000000171e+00 -3.865625000000000000e+01 +1.128894999999999982e+00 -3.868750000000000000e+01 +1.128900000000000015e+00 -3.868750000000000000e+01 +1.128905000000000047e+00 -3.868750000000000000e+01 +1.128910000000000080e+00 -3.865625000000000000e+01 +1.128915000000000113e+00 -3.862500000000000000e+01 +1.128920000000000146e+00 -3.865625000000000000e+01 +1.128925000000000178e+00 -3.871875381469726562e+01 +1.128929999999999989e+00 -3.868750000000000000e+01 +1.128935000000000022e+00 -3.868750000000000000e+01 +1.128940000000000055e+00 -3.875000000000000000e+01 +1.128945000000000087e+00 -3.868750000000000000e+01 +1.128950000000000120e+00 -3.871875381469726562e+01 +1.128955000000000153e+00 -3.871875381469726562e+01 +1.128960000000000186e+00 -3.875000000000000000e+01 +1.128964999999999996e+00 -3.871875381469726562e+01 +1.128970000000000029e+00 -3.871875381469726562e+01 +1.128975000000000062e+00 -3.875000000000000000e+01 +1.128980000000000095e+00 -3.871875381469726562e+01 +1.128985000000000127e+00 -3.865625000000000000e+01 +1.128990000000000160e+00 -3.875000000000000000e+01 +1.128995000000000193e+00 -3.875000000000000000e+01 +1.129000000000000004e+00 -3.875000000000000000e+01 +1.129005000000000036e+00 -3.875000000000000000e+01 +1.129010000000000069e+00 -3.868750000000000000e+01 +1.129015000000000102e+00 -3.868750000000000000e+01 +1.129020000000000135e+00 -3.871875381469726562e+01 +1.129025000000000167e+00 -3.868750000000000000e+01 +1.129030000000000200e+00 -3.871875381469726562e+01 +1.129035000000000011e+00 -3.871875381469726562e+01 +1.129040000000000044e+00 -3.875000000000000000e+01 +1.129045000000000076e+00 -3.871875381469726562e+01 +1.129050000000000109e+00 -3.871875381469726562e+01 +1.129055000000000142e+00 -3.878125000000000000e+01 +1.129060000000000175e+00 -3.871875381469726562e+01 +1.129064999999999985e+00 -3.871875381469726562e+01 +1.129070000000000018e+00 -3.878125000000000000e+01 +1.129075000000000051e+00 -3.868750000000000000e+01 +1.129080000000000084e+00 -3.871875381469726562e+01 +1.129085000000000116e+00 -3.871875381469726562e+01 +1.129090000000000149e+00 -3.871875381469726562e+01 +1.129095000000000182e+00 -3.871875381469726562e+01 +1.129099999999999993e+00 -3.868750000000000000e+01 +1.129105000000000025e+00 -3.868750000000000000e+01 +1.129110000000000058e+00 -3.871875381469726562e+01 +1.129115000000000091e+00 -3.871875381469726562e+01 +1.129120000000000124e+00 -3.865625000000000000e+01 +1.129125000000000156e+00 -3.875000000000000000e+01 +1.129130000000000189e+00 -3.871875381469726562e+01 +1.129135000000000000e+00 -3.871875381469726562e+01 +1.129140000000000033e+00 -3.878125000000000000e+01 +1.129145000000000065e+00 -3.865625000000000000e+01 +1.129150000000000098e+00 -3.871875381469726562e+01 +1.129155000000000131e+00 -3.868750000000000000e+01 +1.129160000000000164e+00 -3.868750000000000000e+01 +1.129165000000000196e+00 -3.868750000000000000e+01 +1.129170000000000007e+00 -3.875000000000000000e+01 +1.129175000000000040e+00 -3.881250000000000000e+01 +1.129180000000000073e+00 -3.871875381469726562e+01 +1.129185000000000105e+00 -3.878125000000000000e+01 +1.129190000000000138e+00 -3.878125000000000000e+01 +1.129195000000000171e+00 -3.878125000000000000e+01 +1.129199999999999982e+00 -3.878125000000000000e+01 +1.129205000000000014e+00 -3.875000000000000000e+01 +1.129210000000000047e+00 -3.875000000000000000e+01 +1.129215000000000080e+00 -3.875000000000000000e+01 +1.129220000000000113e+00 -3.878125000000000000e+01 +1.129225000000000145e+00 -3.875000000000000000e+01 +1.129230000000000178e+00 -3.878125000000000000e+01 +1.129234999999999989e+00 -3.871875381469726562e+01 +1.129240000000000022e+00 -3.884375000000000000e+01 +1.129245000000000054e+00 -3.875000000000000000e+01 +1.129250000000000087e+00 -3.878125000000000000e+01 +1.129255000000000120e+00 -3.878125000000000000e+01 +1.129260000000000153e+00 -3.884375000000000000e+01 +1.129265000000000185e+00 -3.884375000000000000e+01 +1.129269999999999996e+00 -3.878125000000000000e+01 +1.129275000000000029e+00 -3.884375000000000000e+01 +1.129280000000000062e+00 -3.878125000000000000e+01 +1.129285000000000094e+00 -3.878125000000000000e+01 +1.129290000000000127e+00 -3.878125000000000000e+01 +1.129295000000000160e+00 -3.875000000000000000e+01 +1.129300000000000193e+00 -3.884375000000000000e+01 +1.129305000000000003e+00 -3.871875381469726562e+01 +1.129310000000000036e+00 -3.871875381469726562e+01 +1.129315000000000069e+00 -3.878125000000000000e+01 +1.129320000000000102e+00 -3.881250000000000000e+01 +1.129325000000000134e+00 -3.878125000000000000e+01 +1.129330000000000167e+00 -3.878125000000000000e+01 +1.129335000000000200e+00 -3.875000000000000000e+01 +1.129340000000000011e+00 -3.875000000000000000e+01 +1.129345000000000043e+00 -3.875000000000000000e+01 +1.129350000000000076e+00 -3.875000000000000000e+01 +1.129355000000000109e+00 -3.878125000000000000e+01 +1.129360000000000142e+00 -3.878125000000000000e+01 +1.129365000000000174e+00 -3.878125000000000000e+01 +1.129369999999999985e+00 -3.871875381469726562e+01 +1.129375000000000018e+00 -3.878125000000000000e+01 +1.129380000000000051e+00 -3.875000000000000000e+01 +1.129385000000000083e+00 -3.871875381469726562e+01 +1.129390000000000116e+00 -3.878125000000000000e+01 +1.129395000000000149e+00 -3.878125000000000000e+01 +1.129400000000000182e+00 -3.881250000000000000e+01 +1.129404999999999992e+00 -3.878125000000000000e+01 +1.129410000000000025e+00 -3.881250000000000000e+01 +1.129415000000000058e+00 -3.884375000000000000e+01 +1.129420000000000091e+00 -3.878125000000000000e+01 +1.129425000000000123e+00 -3.881250000000000000e+01 +1.129430000000000156e+00 -3.878125000000000000e+01 +1.129435000000000189e+00 -3.884375000000000000e+01 +1.129440000000000000e+00 -3.887500381469726562e+01 +1.129445000000000032e+00 -3.881250000000000000e+01 +1.129450000000000065e+00 -3.884375000000000000e+01 +1.129455000000000098e+00 -3.884375000000000000e+01 +1.129460000000000131e+00 -3.884375000000000000e+01 +1.129465000000000163e+00 -3.890625000000000000e+01 +1.129470000000000196e+00 -3.887500381469726562e+01 +1.129475000000000007e+00 -3.887500381469726562e+01 +1.129480000000000040e+00 -3.887500381469726562e+01 +1.129485000000000072e+00 -3.884375000000000000e+01 +1.129490000000000105e+00 -3.890625000000000000e+01 +1.129495000000000138e+00 -3.896875000000000000e+01 +1.129500000000000171e+00 -3.890625000000000000e+01 +1.129505000000000203e+00 -3.893750000000000000e+01 +1.129510000000000014e+00 -3.893750000000000000e+01 +1.129515000000000047e+00 -3.893750000000000000e+01 +1.129520000000000080e+00 -3.890625000000000000e+01 +1.129525000000000112e+00 -3.893750000000000000e+01 +1.129530000000000145e+00 -3.887500381469726562e+01 +1.129535000000000178e+00 -3.893750000000000000e+01 +1.129539999999999988e+00 -3.887500381469726562e+01 +1.129545000000000021e+00 -3.887500381469726562e+01 +1.129550000000000054e+00 -3.896875000000000000e+01 +1.129555000000000087e+00 -3.900000000000000000e+01 +1.129560000000000120e+00 -3.893750000000000000e+01 +1.129565000000000152e+00 -3.893750000000000000e+01 +1.129570000000000185e+00 -3.896875000000000000e+01 +1.129574999999999996e+00 -3.896875000000000000e+01 +1.129580000000000028e+00 -3.890625000000000000e+01 +1.129585000000000061e+00 -3.893750000000000000e+01 +1.129590000000000094e+00 -3.893750000000000000e+01 +1.129595000000000127e+00 -3.896875000000000000e+01 +1.129600000000000160e+00 -3.893750000000000000e+01 +1.129605000000000192e+00 -3.896875000000000000e+01 +1.129610000000000003e+00 -3.893750000000000000e+01 +1.129615000000000036e+00 -3.893750000000000000e+01 +1.129620000000000068e+00 -3.890625000000000000e+01 +1.129625000000000101e+00 -3.893750000000000000e+01 +1.129630000000000134e+00 -3.893750000000000000e+01 +1.129635000000000167e+00 -3.893750000000000000e+01 +1.129640000000000200e+00 -3.900000000000000000e+01 +1.129645000000000010e+00 -3.893750000000000000e+01 +1.129650000000000043e+00 -3.893750000000000000e+01 +1.129655000000000076e+00 -3.893750000000000000e+01 +1.129660000000000108e+00 -3.893750000000000000e+01 +1.129665000000000141e+00 -3.900000000000000000e+01 +1.129670000000000174e+00 -3.896875000000000000e+01 +1.129674999999999985e+00 -3.893750000000000000e+01 +1.129680000000000017e+00 -3.896875000000000000e+01 +1.129685000000000050e+00 -3.896875000000000000e+01 +1.129690000000000083e+00 -3.896875000000000000e+01 +1.129695000000000116e+00 -3.896875000000000000e+01 +1.129700000000000149e+00 -3.896875000000000000e+01 +1.129705000000000181e+00 -3.890625000000000000e+01 +1.129709999999999992e+00 -3.896875000000000000e+01 +1.129715000000000025e+00 -3.896875000000000000e+01 +1.129720000000000057e+00 -3.896875000000000000e+01 +1.129725000000000090e+00 -3.900000000000000000e+01 +1.129730000000000123e+00 -3.900000000000000000e+01 +1.129735000000000156e+00 -3.900000000000000000e+01 +1.129740000000000189e+00 -3.900000000000000000e+01 +1.129744999999999999e+00 -3.896875000000000000e+01 +1.129750000000000032e+00 -3.900000000000000000e+01 +1.129755000000000065e+00 -3.896875000000000000e+01 +1.129760000000000097e+00 -3.903125381469726562e+01 +1.129765000000000130e+00 -3.903125381469726562e+01 +1.129770000000000163e+00 -3.900000000000000000e+01 +1.129775000000000196e+00 -3.900000000000000000e+01 +1.129780000000000006e+00 -3.900000000000000000e+01 +1.129785000000000039e+00 -3.900000000000000000e+01 +1.129790000000000072e+00 -3.903125381469726562e+01 +1.129795000000000105e+00 -3.900000000000000000e+01 +1.129800000000000137e+00 -3.903125381469726562e+01 +1.129805000000000170e+00 -3.900000000000000000e+01 +1.129810000000000203e+00 -3.906250000000000000e+01 +1.129815000000000014e+00 -3.900000000000000000e+01 +1.129820000000000046e+00 -3.900000000000000000e+01 +1.129825000000000079e+00 -3.896875000000000000e+01 +1.129830000000000112e+00 -3.900000000000000000e+01 +1.129835000000000145e+00 -3.900000000000000000e+01 +1.129840000000000177e+00 -3.900000000000000000e+01 +1.129844999999999988e+00 -3.900000000000000000e+01 +1.129850000000000021e+00 -3.900000000000000000e+01 +1.129855000000000054e+00 -3.900000000000000000e+01 +1.129860000000000086e+00 -3.900000000000000000e+01 +1.129865000000000119e+00 -3.900000000000000000e+01 +1.129870000000000152e+00 -3.903125381469726562e+01 +1.129875000000000185e+00 -3.900000000000000000e+01 +1.129879999999999995e+00 -3.900000000000000000e+01 +1.129885000000000028e+00 -3.903125381469726562e+01 +1.129890000000000061e+00 -3.900000000000000000e+01 +1.129895000000000094e+00 -3.909375000000000000e+01 +1.129900000000000126e+00 -3.903125381469726562e+01 +1.129905000000000159e+00 -3.900000000000000000e+01 +1.129910000000000192e+00 -3.900000000000000000e+01 +1.129915000000000003e+00 -3.900000000000000000e+01 +1.129920000000000035e+00 -3.900000000000000000e+01 +1.129925000000000068e+00 -3.900000000000000000e+01 +1.129930000000000101e+00 -3.900000000000000000e+01 +1.129935000000000134e+00 -3.900000000000000000e+01 +1.129940000000000166e+00 -3.903125381469726562e+01 +1.129945000000000199e+00 -3.903125381469726562e+01 +1.129950000000000010e+00 -3.903125381469726562e+01 +1.129955000000000043e+00 -3.906250000000000000e+01 +1.129960000000000075e+00 -3.909375000000000000e+01 +1.129965000000000108e+00 -3.900000000000000000e+01 +1.129970000000000141e+00 -3.900000000000000000e+01 +1.129975000000000174e+00 -3.903125381469726562e+01 +1.129979999999999984e+00 -3.906250000000000000e+01 +1.129985000000000017e+00 -3.900000000000000000e+01 +1.129990000000000050e+00 -3.903125381469726562e+01 +1.129995000000000083e+00 -3.903125381469726562e+01 +1.130000000000000115e+00 -3.903125381469726562e+01 +1.130005000000000148e+00 -3.906250000000000000e+01 +1.130010000000000181e+00 -3.903125381469726562e+01 +1.130014999999999992e+00 -3.906250000000000000e+01 +1.130020000000000024e+00 -3.909375000000000000e+01 +1.130025000000000057e+00 -3.909375000000000000e+01 +1.130030000000000090e+00 -3.912500000000000000e+01 +1.130035000000000123e+00 -3.909375000000000000e+01 +1.130040000000000155e+00 -3.906250000000000000e+01 +1.130045000000000188e+00 -3.896875000000000000e+01 +1.130049999999999999e+00 -3.909375000000000000e+01 +1.130055000000000032e+00 -3.906250000000000000e+01 +1.130060000000000064e+00 -3.906250000000000000e+01 +1.130065000000000097e+00 -3.906250000000000000e+01 +1.130070000000000130e+00 -3.906250000000000000e+01 +1.130075000000000163e+00 -3.906250000000000000e+01 +1.130080000000000195e+00 -3.903125381469726562e+01 +1.130085000000000006e+00 -3.906250000000000000e+01 +1.130090000000000039e+00 -3.903125381469726562e+01 +1.130095000000000072e+00 -3.906250000000000000e+01 +1.130100000000000104e+00 -3.912500000000000000e+01 +1.130105000000000137e+00 -3.900000000000000000e+01 +1.130110000000000170e+00 -3.906250000000000000e+01 +1.130115000000000203e+00 -3.909375000000000000e+01 +1.130120000000000013e+00 -3.906250000000000000e+01 +1.130125000000000046e+00 -3.906250000000000000e+01 +1.130130000000000079e+00 -3.906250000000000000e+01 +1.130135000000000112e+00 -3.903125381469726562e+01 +1.130140000000000144e+00 -3.909375000000000000e+01 +1.130145000000000177e+00 -3.906250000000000000e+01 +1.130149999999999988e+00 -3.903125381469726562e+01 +1.130155000000000021e+00 -3.906250000000000000e+01 +1.130160000000000053e+00 -3.915625000000000000e+01 +1.130165000000000086e+00 -3.906250000000000000e+01 +1.130170000000000119e+00 -3.906250000000000000e+01 +1.130175000000000152e+00 -3.903125381469726562e+01 +1.130180000000000184e+00 -3.903125381469726562e+01 +1.130184999999999995e+00 -3.906250000000000000e+01 +1.130190000000000028e+00 -3.900000000000000000e+01 +1.130195000000000061e+00 -3.903125381469726562e+01 +1.130200000000000093e+00 -3.909375000000000000e+01 +1.130205000000000126e+00 -3.906250000000000000e+01 +1.130210000000000159e+00 -3.906250000000000000e+01 +1.130215000000000192e+00 -3.900000000000000000e+01 +1.130220000000000002e+00 -3.900000000000000000e+01 +1.130225000000000035e+00 -3.906250000000000000e+01 +1.130230000000000068e+00 -3.909375000000000000e+01 +1.130235000000000101e+00 -3.906250000000000000e+01 +1.130240000000000133e+00 -3.906250000000000000e+01 +1.130245000000000166e+00 -3.909375000000000000e+01 +1.130250000000000199e+00 -3.909375000000000000e+01 +1.130255000000000010e+00 -3.909375000000000000e+01 +1.130260000000000042e+00 -3.906250000000000000e+01 +1.130265000000000075e+00 -3.906250000000000000e+01 +1.130270000000000108e+00 -3.909375000000000000e+01 +1.130275000000000141e+00 -3.915625000000000000e+01 +1.130280000000000173e+00 -3.915625000000000000e+01 +1.130284999999999984e+00 -3.903125381469726562e+01 +1.130290000000000017e+00 -3.909375000000000000e+01 +1.130295000000000050e+00 -3.909375000000000000e+01 +1.130300000000000082e+00 -3.906250000000000000e+01 +1.130305000000000115e+00 -3.912500000000000000e+01 +1.130310000000000148e+00 -3.912500000000000000e+01 +1.130315000000000181e+00 -3.915625000000000000e+01 +1.130319999999999991e+00 -3.912500000000000000e+01 +1.130325000000000024e+00 -3.906250000000000000e+01 +1.130330000000000057e+00 -3.906250000000000000e+01 +1.130335000000000090e+00 -3.912500000000000000e+01 +1.130340000000000122e+00 -3.903125381469726562e+01 +1.130345000000000155e+00 -3.912500000000000000e+01 +1.130350000000000188e+00 -3.909375000000000000e+01 +1.130354999999999999e+00 -3.909375000000000000e+01 +1.130360000000000031e+00 -3.915625000000000000e+01 +1.130365000000000064e+00 -3.912500000000000000e+01 +1.130370000000000097e+00 -3.915625000000000000e+01 +1.130375000000000130e+00 -3.912500000000000000e+01 +1.130380000000000162e+00 -3.915625000000000000e+01 +1.130385000000000195e+00 -3.915625000000000000e+01 +1.130390000000000006e+00 -3.912500000000000000e+01 +1.130395000000000039e+00 -3.915625000000000000e+01 +1.130400000000000071e+00 -3.912500000000000000e+01 +1.130405000000000104e+00 -3.909375000000000000e+01 +1.130410000000000137e+00 -3.909375000000000000e+01 +1.130415000000000170e+00 -3.912500000000000000e+01 +1.130420000000000202e+00 -3.915625000000000000e+01 +1.130425000000000013e+00 -3.915625000000000000e+01 +1.130430000000000046e+00 -3.915625000000000000e+01 +1.130435000000000079e+00 -3.915625000000000000e+01 +1.130440000000000111e+00 -3.915625000000000000e+01 +1.130445000000000144e+00 -3.918750381469726562e+01 +1.130450000000000177e+00 -3.915625000000000000e+01 +1.130454999999999988e+00 -3.909375000000000000e+01 +1.130460000000000020e+00 -3.918750381469726562e+01 +1.130465000000000053e+00 -3.915625000000000000e+01 +1.130470000000000086e+00 -3.915625000000000000e+01 +1.130475000000000119e+00 -3.918750381469726562e+01 +1.130480000000000151e+00 -3.921875000000000000e+01 +1.130485000000000184e+00 -3.918750381469726562e+01 +1.130489999999999995e+00 -3.909375000000000000e+01 +1.130495000000000028e+00 -3.918750381469726562e+01 +1.130500000000000060e+00 -3.918750381469726562e+01 +1.130505000000000093e+00 -3.918750381469726562e+01 +1.130510000000000126e+00 -3.925000000000000000e+01 +1.130515000000000159e+00 -3.918750381469726562e+01 +1.130520000000000191e+00 -3.915625000000000000e+01 +1.130525000000000002e+00 -3.921875000000000000e+01 +1.130530000000000035e+00 -3.915625000000000000e+01 +1.130535000000000068e+00 -3.921875000000000000e+01 +1.130540000000000100e+00 -3.918750381469726562e+01 +1.130545000000000133e+00 -3.915625000000000000e+01 +1.130550000000000166e+00 -3.925000000000000000e+01 +1.130555000000000199e+00 -3.918750381469726562e+01 +1.130560000000000009e+00 -3.918750381469726562e+01 +1.130565000000000042e+00 -3.912500000000000000e+01 +1.130570000000000075e+00 -3.915625000000000000e+01 +1.130575000000000108e+00 -3.918750381469726562e+01 +1.130580000000000140e+00 -3.928125000000000000e+01 +1.130585000000000173e+00 -3.921875000000000000e+01 +1.130589999999999984e+00 -3.918750381469726562e+01 +1.130595000000000017e+00 -3.918750381469726562e+01 +1.130600000000000049e+00 -3.921875000000000000e+01 +1.130605000000000082e+00 -3.915625000000000000e+01 +1.130610000000000115e+00 -3.921875000000000000e+01 +1.130615000000000148e+00 -3.921875000000000000e+01 +1.130620000000000180e+00 -3.921875000000000000e+01 +1.130624999999999991e+00 -3.921875000000000000e+01 +1.130630000000000024e+00 -3.915625000000000000e+01 +1.130635000000000057e+00 -3.925000000000000000e+01 +1.130640000000000089e+00 -3.921875000000000000e+01 +1.130645000000000122e+00 -3.918750381469726562e+01 +1.130650000000000155e+00 -3.921875000000000000e+01 +1.130655000000000188e+00 -3.921875000000000000e+01 +1.130659999999999998e+00 -3.918750381469726562e+01 +1.130665000000000031e+00 -3.915625000000000000e+01 +1.130670000000000064e+00 -3.921875000000000000e+01 +1.130675000000000097e+00 -3.918750381469726562e+01 +1.130680000000000129e+00 -3.928125000000000000e+01 +1.130685000000000162e+00 -3.928125000000000000e+01 +1.130690000000000195e+00 -3.928125000000000000e+01 +1.130695000000000006e+00 -3.925000000000000000e+01 +1.130700000000000038e+00 -3.928125000000000000e+01 +1.130705000000000071e+00 -3.928125000000000000e+01 +1.130710000000000104e+00 -3.934375381469726562e+01 +1.130715000000000137e+00 -3.931250000000000000e+01 +1.130720000000000169e+00 -3.931250000000000000e+01 +1.130725000000000202e+00 -3.928125000000000000e+01 +1.130730000000000013e+00 -3.928125000000000000e+01 +1.130735000000000046e+00 -3.931250000000000000e+01 +1.130740000000000078e+00 -3.931250000000000000e+01 +1.130745000000000111e+00 -3.931250000000000000e+01 +1.130750000000000144e+00 -3.925000000000000000e+01 +1.130755000000000177e+00 -3.928125000000000000e+01 +1.130759999999999987e+00 -3.931250000000000000e+01 +1.130765000000000020e+00 -3.928125000000000000e+01 +1.130770000000000053e+00 -3.928125000000000000e+01 +1.130775000000000086e+00 -3.934375381469726562e+01 +1.130780000000000118e+00 -3.931250000000000000e+01 +1.130785000000000151e+00 -3.928125000000000000e+01 +1.130790000000000184e+00 -3.931250000000000000e+01 +1.130794999999999995e+00 -3.925000000000000000e+01 +1.130800000000000027e+00 -3.931250000000000000e+01 +1.130805000000000060e+00 -3.931250000000000000e+01 +1.130810000000000093e+00 -3.921875000000000000e+01 +1.130815000000000126e+00 -3.928125000000000000e+01 +1.130820000000000158e+00 -3.928125000000000000e+01 +1.130825000000000191e+00 -3.928125000000000000e+01 +1.130830000000000002e+00 -3.925000000000000000e+01 +1.130835000000000035e+00 -3.934375381469726562e+01 +1.130840000000000067e+00 -3.934375381469726562e+01 +1.130845000000000100e+00 -3.934375381469726562e+01 +1.130850000000000133e+00 -3.934375381469726562e+01 +1.130855000000000166e+00 -3.931250000000000000e+01 +1.130860000000000198e+00 -3.928125000000000000e+01 +1.130865000000000009e+00 -3.937500000000000000e+01 +1.130870000000000042e+00 -3.928125000000000000e+01 +1.130875000000000075e+00 -3.934375381469726562e+01 +1.130880000000000107e+00 -3.934375381469726562e+01 +1.130885000000000140e+00 -3.931250000000000000e+01 +1.130890000000000173e+00 -3.928125000000000000e+01 +1.130894999999999984e+00 -3.937500000000000000e+01 +1.130900000000000016e+00 -3.934375381469726562e+01 +1.130905000000000049e+00 -3.937500000000000000e+01 +1.130910000000000082e+00 -3.934375381469726562e+01 +1.130915000000000115e+00 -3.928125000000000000e+01 +1.130920000000000147e+00 -3.934375381469726562e+01 +1.130925000000000180e+00 -3.940625000000000000e+01 +1.130929999999999991e+00 -3.934375381469726562e+01 +1.130935000000000024e+00 -3.937500000000000000e+01 +1.130940000000000056e+00 -3.931250000000000000e+01 +1.130945000000000089e+00 -3.937500000000000000e+01 +1.130950000000000122e+00 -3.931250000000000000e+01 +1.130955000000000155e+00 -3.934375381469726562e+01 +1.130960000000000187e+00 -3.931250000000000000e+01 +1.130964999999999998e+00 -3.931250000000000000e+01 +1.130970000000000031e+00 -3.937500000000000000e+01 +1.130975000000000064e+00 -3.931250000000000000e+01 +1.130980000000000096e+00 -3.937500000000000000e+01 +1.130985000000000129e+00 -3.925000000000000000e+01 +1.130990000000000162e+00 -3.931250000000000000e+01 +1.130995000000000195e+00 -3.937500000000000000e+01 +1.131000000000000005e+00 -3.931250000000000000e+01 +1.131005000000000038e+00 -3.931250000000000000e+01 +1.131010000000000071e+00 -3.934375381469726562e+01 +1.131015000000000104e+00 -3.934375381469726562e+01 +1.131020000000000136e+00 -3.934375381469726562e+01 +1.131025000000000169e+00 -3.934375381469726562e+01 +1.131030000000000202e+00 -3.934375381469726562e+01 +1.131035000000000013e+00 -3.934375381469726562e+01 +1.131040000000000045e+00 -3.934375381469726562e+01 +1.131045000000000078e+00 -3.934375381469726562e+01 +1.131050000000000111e+00 -3.931250000000000000e+01 +1.131055000000000144e+00 -3.928125000000000000e+01 +1.131060000000000176e+00 -3.934375381469726562e+01 +1.131064999999999987e+00 -3.928125000000000000e+01 +1.131070000000000020e+00 -3.937500000000000000e+01 +1.131075000000000053e+00 -3.934375381469726562e+01 +1.131080000000000085e+00 -3.934375381469726562e+01 +1.131085000000000118e+00 -3.934375381469726562e+01 +1.131090000000000151e+00 -3.931250000000000000e+01 +1.131095000000000184e+00 -3.931250000000000000e+01 +1.131099999999999994e+00 -3.934375381469726562e+01 +1.131105000000000027e+00 -3.931250000000000000e+01 +1.131110000000000060e+00 -3.931250000000000000e+01 +1.131115000000000093e+00 -3.925000000000000000e+01 +1.131120000000000125e+00 -3.934375381469726562e+01 +1.131125000000000158e+00 -3.934375381469726562e+01 +1.131130000000000191e+00 -3.937500000000000000e+01 +1.131135000000000002e+00 -3.934375381469726562e+01 +1.131140000000000034e+00 -3.928125000000000000e+01 +1.131145000000000067e+00 -3.928125000000000000e+01 +1.131150000000000100e+00 -3.931250000000000000e+01 +1.131155000000000133e+00 -3.931250000000000000e+01 +1.131160000000000165e+00 -3.931250000000000000e+01 +1.131165000000000198e+00 -3.934375381469726562e+01 +1.131170000000000009e+00 -3.934375381469726562e+01 +1.131175000000000042e+00 -3.928125000000000000e+01 +1.131180000000000074e+00 -3.934375381469726562e+01 +1.131185000000000107e+00 -3.931250000000000000e+01 +1.131190000000000140e+00 -3.934375381469726562e+01 +1.131195000000000173e+00 -3.934375381469726562e+01 +1.131199999999999983e+00 -3.931250000000000000e+01 +1.131205000000000016e+00 -3.934375381469726562e+01 +1.131210000000000049e+00 -3.934375381469726562e+01 +1.131215000000000082e+00 -3.934375381469726562e+01 +1.131220000000000114e+00 -3.931250000000000000e+01 +1.131225000000000147e+00 -3.934375381469726562e+01 +1.131230000000000180e+00 -3.928125000000000000e+01 +1.131234999999999991e+00 -3.928125000000000000e+01 +1.131240000000000023e+00 -3.937500000000000000e+01 +1.131245000000000056e+00 -3.937500000000000000e+01 +1.131250000000000089e+00 -3.934375381469726562e+01 +1.131255000000000122e+00 -3.931250000000000000e+01 +1.131260000000000154e+00 -3.931250000000000000e+01 +1.131265000000000187e+00 -3.934375381469726562e+01 +1.131269999999999998e+00 -3.934375381469726562e+01 +1.131275000000000031e+00 -3.931250000000000000e+01 +1.131280000000000063e+00 -3.937500000000000000e+01 +1.131285000000000096e+00 -3.940625000000000000e+01 +1.131290000000000129e+00 -3.934375381469726562e+01 +1.131295000000000162e+00 -3.931250000000000000e+01 +1.131300000000000194e+00 -3.934375381469726562e+01 +1.131305000000000005e+00 -3.931250000000000000e+01 +1.131310000000000038e+00 -3.934375381469726562e+01 +1.131315000000000071e+00 -3.931250000000000000e+01 +1.131320000000000103e+00 -3.931250000000000000e+01 +1.131325000000000136e+00 -3.931250000000000000e+01 +1.131330000000000169e+00 -3.937500000000000000e+01 +1.131335000000000202e+00 -3.934375381469726562e+01 +1.131340000000000012e+00 -3.931250000000000000e+01 +1.131345000000000045e+00 -3.937500000000000000e+01 +1.131350000000000078e+00 -3.934375381469726562e+01 +1.131355000000000111e+00 -3.931250000000000000e+01 +1.131360000000000143e+00 -3.925000000000000000e+01 +1.131365000000000176e+00 -3.934375381469726562e+01 +1.131369999999999987e+00 -3.934375381469726562e+01 +1.131375000000000020e+00 -3.928125000000000000e+01 +1.131380000000000052e+00 -3.928125000000000000e+01 +1.131385000000000085e+00 -3.931250000000000000e+01 +1.131390000000000118e+00 -3.934375381469726562e+01 +1.131395000000000151e+00 -3.934375381469726562e+01 +1.131400000000000183e+00 -3.934375381469726562e+01 +1.131404999999999994e+00 -3.934375381469726562e+01 +1.131410000000000027e+00 -3.931250000000000000e+01 +1.131415000000000060e+00 -3.931250000000000000e+01 +1.131420000000000092e+00 -3.931250000000000000e+01 +1.131425000000000125e+00 -3.931250000000000000e+01 +1.131430000000000158e+00 -3.925000000000000000e+01 +1.131435000000000191e+00 -3.940625000000000000e+01 +1.131440000000000001e+00 -3.931250000000000000e+01 +1.131445000000000034e+00 -3.934375381469726562e+01 +1.131450000000000067e+00 -3.934375381469726562e+01 +1.131455000000000100e+00 -3.928125000000000000e+01 +1.131460000000000132e+00 -3.934375381469726562e+01 +1.131465000000000165e+00 -3.931250000000000000e+01 +1.131470000000000198e+00 -3.931250000000000000e+01 +1.131475000000000009e+00 -3.937500000000000000e+01 +1.131480000000000041e+00 -3.931250000000000000e+01 +1.131485000000000074e+00 -3.937500000000000000e+01 +1.131490000000000107e+00 -3.934375381469726562e+01 +1.131495000000000140e+00 -3.934375381469726562e+01 +1.131500000000000172e+00 -3.937500000000000000e+01 +1.131504999999999983e+00 -3.934375381469726562e+01 +1.131510000000000016e+00 -3.937500000000000000e+01 +1.131515000000000049e+00 -3.931250000000000000e+01 +1.131520000000000081e+00 -3.937500000000000000e+01 +1.131525000000000114e+00 -3.928125000000000000e+01 +1.131530000000000147e+00 -3.934375381469726562e+01 +1.131535000000000180e+00 -3.937500000000000000e+01 +1.131539999999999990e+00 -3.937500000000000000e+01 +1.131545000000000023e+00 -3.931250000000000000e+01 +1.131550000000000056e+00 -3.934375381469726562e+01 +1.131555000000000089e+00 -3.934375381469726562e+01 +1.131560000000000121e+00 -3.937500000000000000e+01 +1.131565000000000154e+00 -3.928125000000000000e+01 +1.131570000000000187e+00 -3.928125000000000000e+01 +1.131574999999999998e+00 -3.940625000000000000e+01 +1.131580000000000030e+00 -3.934375381469726562e+01 +1.131585000000000063e+00 -3.931250000000000000e+01 +1.131590000000000096e+00 -3.928125000000000000e+01 +1.131595000000000129e+00 -3.934375381469726562e+01 +1.131600000000000161e+00 -3.934375381469726562e+01 +1.131605000000000194e+00 -3.928125000000000000e+01 +1.131610000000000005e+00 -3.928125000000000000e+01 +1.131615000000000038e+00 -3.934375381469726562e+01 +1.131620000000000070e+00 -3.940625000000000000e+01 +1.131625000000000103e+00 -3.931250000000000000e+01 +1.131630000000000136e+00 -3.931250000000000000e+01 +1.131635000000000169e+00 -3.934375381469726562e+01 +1.131640000000000201e+00 -3.937500000000000000e+01 +1.131645000000000012e+00 -3.937500000000000000e+01 +1.131650000000000045e+00 -3.937500000000000000e+01 +1.131655000000000078e+00 -3.940625000000000000e+01 +1.131660000000000110e+00 -3.937500000000000000e+01 +1.131665000000000143e+00 -3.934375381469726562e+01 +1.131670000000000176e+00 -3.937500000000000000e+01 +1.131674999999999986e+00 -3.934375381469726562e+01 +1.131680000000000019e+00 -3.931250000000000000e+01 +1.131685000000000052e+00 -3.934375381469726562e+01 +1.131690000000000085e+00 -3.937500000000000000e+01 +1.131695000000000118e+00 -3.934375381469726562e+01 +1.131700000000000150e+00 -3.931250000000000000e+01 +1.131705000000000183e+00 -3.934375381469726562e+01 +1.131709999999999994e+00 -3.934375381469726562e+01 +1.131715000000000027e+00 -3.931250000000000000e+01 +1.131720000000000059e+00 -3.931250000000000000e+01 +1.131725000000000092e+00 -3.928125000000000000e+01 +1.131730000000000125e+00 -3.928125000000000000e+01 +1.131735000000000158e+00 -3.934375381469726562e+01 +1.131740000000000190e+00 -3.937500000000000000e+01 +1.131745000000000001e+00 -3.931250000000000000e+01 +1.131750000000000034e+00 -3.931250000000000000e+01 +1.131755000000000067e+00 -3.934375381469726562e+01 +1.131760000000000099e+00 -3.928125000000000000e+01 +1.131765000000000132e+00 -3.934375381469726562e+01 +1.131770000000000165e+00 -3.934375381469726562e+01 +1.131775000000000198e+00 -3.934375381469726562e+01 +1.131780000000000008e+00 -3.934375381469726562e+01 +1.131785000000000041e+00 -3.937500000000000000e+01 +1.131790000000000074e+00 -3.937500000000000000e+01 +1.131795000000000107e+00 -3.937500000000000000e+01 +1.131800000000000139e+00 -3.934375381469726562e+01 +1.131805000000000172e+00 -3.934375381469726562e+01 +1.131809999999999983e+00 -3.940625000000000000e+01 +1.131815000000000015e+00 -3.934375381469726562e+01 +1.131820000000000048e+00 -3.934375381469726562e+01 +1.131825000000000081e+00 -3.940625000000000000e+01 +1.131830000000000114e+00 -3.934375381469726562e+01 +1.131835000000000147e+00 -3.937500000000000000e+01 +1.131840000000000179e+00 -3.934375381469726562e+01 +1.131844999999999990e+00 -3.940625000000000000e+01 +1.131850000000000023e+00 -3.931250000000000000e+01 +1.131855000000000055e+00 -3.931250000000000000e+01 +1.131860000000000088e+00 -3.940625000000000000e+01 +1.131865000000000121e+00 -3.937500000000000000e+01 +1.131870000000000154e+00 -3.931250000000000000e+01 +1.131875000000000187e+00 -3.934375381469726562e+01 +1.131879999999999997e+00 -3.937500000000000000e+01 +1.131885000000000030e+00 -3.943750381469726562e+01 +1.131890000000000063e+00 -3.934375381469726562e+01 +1.131895000000000095e+00 -3.937500000000000000e+01 +1.131900000000000128e+00 -3.934375381469726562e+01 +1.131905000000000161e+00 -3.940625000000000000e+01 +1.131910000000000194e+00 -3.931250000000000000e+01 +1.131915000000000004e+00 -3.934375381469726562e+01 +1.131920000000000037e+00 -3.943750381469726562e+01 +1.131925000000000070e+00 -3.931250000000000000e+01 +1.131930000000000103e+00 -3.943750381469726562e+01 +1.131935000000000136e+00 -3.937500000000000000e+01 +1.131940000000000168e+00 -3.940625000000000000e+01 +1.131945000000000201e+00 -3.940625000000000000e+01 +1.131950000000000012e+00 -3.940625000000000000e+01 +1.131955000000000044e+00 -3.943750381469726562e+01 +1.131960000000000077e+00 -3.937500000000000000e+01 +1.131965000000000110e+00 -3.937500000000000000e+01 +1.131970000000000143e+00 -3.934375381469726562e+01 +1.131975000000000176e+00 -3.943750381469726562e+01 +1.131979999999999986e+00 -3.934375381469726562e+01 +1.131985000000000019e+00 -3.940625000000000000e+01 +1.131990000000000052e+00 -3.943750381469726562e+01 +1.131995000000000084e+00 -3.940625000000000000e+01 +1.132000000000000117e+00 -3.931250000000000000e+01 +1.132005000000000150e+00 -3.940625000000000000e+01 +1.132010000000000183e+00 -3.946875000000000000e+01 +1.132014999999999993e+00 -3.934375381469726562e+01 +1.132020000000000026e+00 -3.940625000000000000e+01 +1.132025000000000059e+00 -3.940625000000000000e+01 +1.132030000000000092e+00 -3.943750381469726562e+01 +1.132035000000000124e+00 -3.934375381469726562e+01 +1.132040000000000157e+00 -3.940625000000000000e+01 +1.132045000000000190e+00 -3.937500000000000000e+01 +1.132050000000000001e+00 -3.934375381469726562e+01 +1.132055000000000033e+00 -3.940625000000000000e+01 +1.132060000000000066e+00 -3.940625000000000000e+01 +1.132065000000000099e+00 -3.943750381469726562e+01 +1.132070000000000132e+00 -3.946875000000000000e+01 +1.132075000000000164e+00 -3.943750381469726562e+01 +1.132080000000000197e+00 -3.940625000000000000e+01 +1.132085000000000008e+00 -3.946875000000000000e+01 +1.132090000000000041e+00 -3.943750381469726562e+01 +1.132095000000000073e+00 -3.946875000000000000e+01 +1.132100000000000106e+00 -3.946875000000000000e+01 +1.132105000000000139e+00 -3.943750381469726562e+01 +1.132110000000000172e+00 -3.943750381469726562e+01 +1.132114999999999982e+00 -3.943750381469726562e+01 +1.132120000000000015e+00 -3.946875000000000000e+01 +1.132125000000000048e+00 -3.946875000000000000e+01 +1.132130000000000081e+00 -3.950000000000000000e+01 +1.132135000000000113e+00 -3.946875000000000000e+01 +1.132140000000000146e+00 -3.950000000000000000e+01 +1.132145000000000179e+00 -3.943750381469726562e+01 +1.132149999999999990e+00 -3.940625000000000000e+01 +1.132155000000000022e+00 -3.946875000000000000e+01 +1.132160000000000055e+00 -3.943750381469726562e+01 +1.132165000000000088e+00 -3.946875000000000000e+01 +1.132170000000000121e+00 -3.950000000000000000e+01 +1.132175000000000153e+00 -3.950000000000000000e+01 +1.132180000000000186e+00 -3.950000000000000000e+01 +1.132184999999999997e+00 -3.943750381469726562e+01 +1.132190000000000030e+00 -3.946875000000000000e+01 +1.132195000000000062e+00 -3.946875000000000000e+01 +1.132200000000000095e+00 -3.940625000000000000e+01 +1.132205000000000128e+00 -3.946875000000000000e+01 +1.132210000000000161e+00 -3.943750381469726562e+01 +1.132215000000000193e+00 -3.943750381469726562e+01 +1.132220000000000004e+00 -3.950000000000000000e+01 +1.132225000000000037e+00 -3.950000000000000000e+01 +1.132230000000000070e+00 -3.950000000000000000e+01 +1.132235000000000102e+00 -3.943750381469726562e+01 +1.132240000000000135e+00 -3.943750381469726562e+01 +1.132245000000000168e+00 -3.946875000000000000e+01 +1.132250000000000201e+00 -3.946875000000000000e+01 +1.132255000000000011e+00 -3.946875000000000000e+01 +1.132260000000000044e+00 -3.946875000000000000e+01 +1.132265000000000077e+00 -3.943750381469726562e+01 +1.132270000000000110e+00 -3.950000000000000000e+01 +1.132275000000000142e+00 -3.946875000000000000e+01 +1.132280000000000175e+00 -3.943750381469726562e+01 +1.132284999999999986e+00 -3.943750381469726562e+01 +1.132290000000000019e+00 -3.946875000000000000e+01 +1.132295000000000051e+00 -3.950000000000000000e+01 +1.132300000000000084e+00 -3.946875000000000000e+01 +1.132305000000000117e+00 -3.953125000000000000e+01 +1.132310000000000150e+00 -3.943750381469726562e+01 +1.132315000000000182e+00 -3.950000000000000000e+01 +1.132319999999999993e+00 -3.953125000000000000e+01 +1.132325000000000026e+00 -3.946875000000000000e+01 +1.132330000000000059e+00 -3.953125000000000000e+01 +1.132335000000000091e+00 -3.946875000000000000e+01 +1.132340000000000124e+00 -3.950000000000000000e+01 +1.132345000000000157e+00 -3.946875000000000000e+01 +1.132350000000000190e+00 -3.946875000000000000e+01 +1.132355000000000000e+00 -3.946875000000000000e+01 +1.132360000000000033e+00 -3.950000000000000000e+01 +1.132365000000000066e+00 -3.950000000000000000e+01 +1.132370000000000099e+00 -3.953125000000000000e+01 +1.132375000000000131e+00 -3.950000000000000000e+01 +1.132380000000000164e+00 -3.946875000000000000e+01 +1.132385000000000197e+00 -3.950000000000000000e+01 +1.132390000000000008e+00 -3.943750381469726562e+01 +1.132395000000000040e+00 -3.946875000000000000e+01 +1.132400000000000073e+00 -3.946875000000000000e+01 +1.132405000000000106e+00 -3.943750381469726562e+01 +1.132410000000000139e+00 -3.950000000000000000e+01 +1.132415000000000171e+00 -3.943750381469726562e+01 +1.132419999999999982e+00 -3.946875000000000000e+01 +1.132425000000000015e+00 -3.946875000000000000e+01 +1.132430000000000048e+00 -3.950000000000000000e+01 +1.132435000000000080e+00 -3.943750381469726562e+01 +1.132440000000000113e+00 -3.946875000000000000e+01 +1.132445000000000146e+00 -3.950000000000000000e+01 +1.132450000000000179e+00 -3.950000000000000000e+01 +1.132454999999999989e+00 -3.953125000000000000e+01 +1.132460000000000022e+00 -3.953125000000000000e+01 +1.132465000000000055e+00 -3.950000000000000000e+01 +1.132470000000000088e+00 -3.950000000000000000e+01 +1.132475000000000120e+00 -3.946875000000000000e+01 +1.132480000000000153e+00 -3.950000000000000000e+01 +1.132485000000000186e+00 -3.959375381469726562e+01 +1.132489999999999997e+00 -3.950000000000000000e+01 +1.132495000000000029e+00 -3.950000000000000000e+01 +1.132500000000000062e+00 -3.950000000000000000e+01 +1.132505000000000095e+00 -3.956250000000000000e+01 +1.132510000000000128e+00 -3.946875000000000000e+01 +1.132515000000000160e+00 -3.950000000000000000e+01 +1.132520000000000193e+00 -3.950000000000000000e+01 +1.132525000000000004e+00 -3.950000000000000000e+01 +1.132530000000000037e+00 -3.953125000000000000e+01 +1.132535000000000069e+00 -3.946875000000000000e+01 +1.132540000000000102e+00 -3.950000000000000000e+01 +1.132545000000000135e+00 -3.950000000000000000e+01 +1.132550000000000168e+00 -3.953125000000000000e+01 +1.132555000000000200e+00 -3.946875000000000000e+01 +1.132560000000000011e+00 -3.953125000000000000e+01 +1.132565000000000044e+00 -3.950000000000000000e+01 +1.132570000000000077e+00 -3.946875000000000000e+01 +1.132575000000000109e+00 -3.950000000000000000e+01 +1.132580000000000142e+00 -3.950000000000000000e+01 +1.132585000000000175e+00 -3.946875000000000000e+01 +1.132589999999999986e+00 -3.950000000000000000e+01 +1.132595000000000018e+00 -3.950000000000000000e+01 +1.132600000000000051e+00 -3.950000000000000000e+01 +1.132605000000000084e+00 -3.950000000000000000e+01 +1.132610000000000117e+00 -3.950000000000000000e+01 +1.132615000000000149e+00 -3.950000000000000000e+01 +1.132620000000000182e+00 -3.950000000000000000e+01 +1.132624999999999993e+00 -3.950000000000000000e+01 +1.132630000000000026e+00 -3.953125000000000000e+01 +1.132635000000000058e+00 -3.953125000000000000e+01 +1.132640000000000091e+00 -3.953125000000000000e+01 +1.132645000000000124e+00 -3.950000000000000000e+01 +1.132650000000000157e+00 -3.953125000000000000e+01 +1.132655000000000189e+00 -3.950000000000000000e+01 +1.132660000000000000e+00 -3.946875000000000000e+01 +1.132665000000000033e+00 -3.950000000000000000e+01 +1.132670000000000066e+00 -3.946875000000000000e+01 +1.132675000000000098e+00 -3.950000000000000000e+01 +1.132680000000000131e+00 -3.946875000000000000e+01 +1.132685000000000164e+00 -3.956250000000000000e+01 +1.132690000000000197e+00 -3.950000000000000000e+01 +1.132695000000000007e+00 -3.953125000000000000e+01 +1.132700000000000040e+00 -3.950000000000000000e+01 +1.132705000000000073e+00 -3.953125000000000000e+01 +1.132710000000000106e+00 -3.953125000000000000e+01 +1.132715000000000138e+00 -3.950000000000000000e+01 +1.132720000000000171e+00 -3.950000000000000000e+01 +1.132724999999999982e+00 -3.950000000000000000e+01 +1.132730000000000015e+00 -3.953125000000000000e+01 +1.132735000000000047e+00 -3.950000000000000000e+01 +1.132740000000000080e+00 -3.953125000000000000e+01 +1.132745000000000113e+00 -3.950000000000000000e+01 +1.132750000000000146e+00 -3.953125000000000000e+01 +1.132755000000000178e+00 -3.959375381469726562e+01 +1.132759999999999989e+00 -3.953125000000000000e+01 +1.132765000000000022e+00 -3.953125000000000000e+01 +1.132770000000000055e+00 -3.950000000000000000e+01 +1.132775000000000087e+00 -3.946875000000000000e+01 +1.132780000000000120e+00 -3.950000000000000000e+01 +1.132785000000000153e+00 -3.946875000000000000e+01 +1.132790000000000186e+00 -3.950000000000000000e+01 +1.132794999999999996e+00 -3.950000000000000000e+01 +1.132800000000000029e+00 -3.953125000000000000e+01 +1.132805000000000062e+00 -3.950000000000000000e+01 +1.132810000000000095e+00 -3.956250000000000000e+01 +1.132815000000000127e+00 -3.950000000000000000e+01 +1.132820000000000160e+00 -3.953125000000000000e+01 +1.132825000000000193e+00 -3.953125000000000000e+01 +1.132830000000000004e+00 -3.953125000000000000e+01 +1.132835000000000036e+00 -3.956250000000000000e+01 +1.132840000000000069e+00 -3.956250000000000000e+01 +1.132845000000000102e+00 -3.953125000000000000e+01 +1.132850000000000135e+00 -3.950000000000000000e+01 +1.132855000000000167e+00 -3.956250000000000000e+01 +1.132860000000000200e+00 -3.950000000000000000e+01 +1.132865000000000011e+00 -3.959375381469726562e+01 +1.132870000000000044e+00 -3.950000000000000000e+01 +1.132875000000000076e+00 -3.956250000000000000e+01 +1.132880000000000109e+00 -3.953125000000000000e+01 +1.132885000000000142e+00 -3.956250000000000000e+01 +1.132890000000000175e+00 -3.959375381469726562e+01 +1.132894999999999985e+00 -3.956250000000000000e+01 +1.132900000000000018e+00 -3.956250000000000000e+01 +1.132905000000000051e+00 -3.959375381469726562e+01 +1.132910000000000084e+00 -3.953125000000000000e+01 +1.132915000000000116e+00 -3.950000000000000000e+01 +1.132920000000000149e+00 -3.959375381469726562e+01 +1.132925000000000182e+00 -3.956250000000000000e+01 +1.132929999999999993e+00 -3.953125000000000000e+01 +1.132935000000000025e+00 -3.956250000000000000e+01 +1.132940000000000058e+00 -3.946875000000000000e+01 +1.132945000000000091e+00 -3.953125000000000000e+01 +1.132950000000000124e+00 -3.959375381469726562e+01 +1.132955000000000156e+00 -3.953125000000000000e+01 +1.132960000000000189e+00 -3.959375381469726562e+01 +1.132965000000000000e+00 -3.953125000000000000e+01 +1.132970000000000033e+00 -3.959375381469726562e+01 +1.132975000000000065e+00 -3.959375381469726562e+01 +1.132980000000000098e+00 -3.950000000000000000e+01 +1.132985000000000131e+00 -3.956250000000000000e+01 +1.132990000000000164e+00 -3.956250000000000000e+01 +1.132995000000000196e+00 -3.959375381469726562e+01 +1.133000000000000007e+00 -3.953125000000000000e+01 +1.133005000000000040e+00 -3.956250000000000000e+01 +1.133010000000000073e+00 -3.959375381469726562e+01 +1.133015000000000105e+00 -3.962500000000000000e+01 +1.133020000000000138e+00 -3.956250000000000000e+01 +1.133025000000000171e+00 -3.965625000000000000e+01 +1.133030000000000204e+00 -3.956250000000000000e+01 +1.133035000000000014e+00 -3.962500000000000000e+01 +1.133040000000000047e+00 -3.962500000000000000e+01 +1.133045000000000080e+00 -3.956250000000000000e+01 +1.133050000000000113e+00 -3.956250000000000000e+01 +1.133055000000000145e+00 -3.953125000000000000e+01 +1.133060000000000178e+00 -3.953125000000000000e+01 +1.133064999999999989e+00 -3.956250000000000000e+01 +1.133070000000000022e+00 -3.959375381469726562e+01 +1.133075000000000054e+00 -3.956250000000000000e+01 +1.133080000000000087e+00 -3.956250000000000000e+01 +1.133085000000000120e+00 -3.953125000000000000e+01 +1.133090000000000153e+00 -3.956250000000000000e+01 +1.133095000000000185e+00 -3.953125000000000000e+01 +1.133099999999999996e+00 -3.953125000000000000e+01 +1.133105000000000029e+00 -3.953125000000000000e+01 +1.133110000000000062e+00 -3.953125000000000000e+01 +1.133115000000000094e+00 -3.953125000000000000e+01 +1.133120000000000127e+00 -3.956250000000000000e+01 +1.133125000000000160e+00 -3.956250000000000000e+01 +1.133130000000000193e+00 -3.962500000000000000e+01 +1.133135000000000003e+00 -3.953125000000000000e+01 +1.133140000000000036e+00 -3.956250000000000000e+01 +1.133145000000000069e+00 -3.953125000000000000e+01 +1.133150000000000102e+00 -3.953125000000000000e+01 +1.133155000000000134e+00 -3.956250000000000000e+01 +1.133160000000000167e+00 -3.959375381469726562e+01 +1.133165000000000200e+00 -3.959375381469726562e+01 +1.133170000000000011e+00 -3.959375381469726562e+01 +1.133175000000000043e+00 -3.965625000000000000e+01 +1.133180000000000076e+00 -3.959375381469726562e+01 +1.133185000000000109e+00 -3.950000000000000000e+01 +1.133190000000000142e+00 -3.959375381469726562e+01 +1.133195000000000174e+00 -3.950000000000000000e+01 +1.133199999999999985e+00 -3.953125000000000000e+01 +1.133205000000000018e+00 -3.959375381469726562e+01 +1.133210000000000051e+00 -3.959375381469726562e+01 +1.133215000000000083e+00 -3.956250000000000000e+01 +1.133220000000000116e+00 -3.956250000000000000e+01 +1.133225000000000149e+00 -3.956250000000000000e+01 +1.133230000000000182e+00 -3.953125000000000000e+01 +1.133234999999999992e+00 -3.962500000000000000e+01 +1.133240000000000025e+00 -3.956250000000000000e+01 +1.133245000000000058e+00 -3.959375381469726562e+01 +1.133250000000000091e+00 -3.956250000000000000e+01 +1.133255000000000123e+00 -3.965625000000000000e+01 +1.133260000000000156e+00 -3.953125000000000000e+01 +1.133265000000000189e+00 -3.956250000000000000e+01 +1.133270000000000000e+00 -3.953125000000000000e+01 +1.133275000000000032e+00 -3.959375381469726562e+01 +1.133280000000000065e+00 -3.953125000000000000e+01 +1.133285000000000098e+00 -3.956250000000000000e+01 +1.133290000000000131e+00 -3.956250000000000000e+01 +1.133295000000000163e+00 -3.953125000000000000e+01 +1.133300000000000196e+00 -3.953125000000000000e+01 +1.133305000000000007e+00 -3.956250000000000000e+01 +1.133310000000000040e+00 -3.953125000000000000e+01 +1.133315000000000072e+00 -3.965625000000000000e+01 +1.133320000000000105e+00 -3.959375381469726562e+01 +1.133325000000000138e+00 -3.959375381469726562e+01 +1.133330000000000171e+00 -3.950000000000000000e+01 +1.133335000000000203e+00 -3.956250000000000000e+01 +1.133340000000000014e+00 -3.959375381469726562e+01 +1.133345000000000047e+00 -3.962500000000000000e+01 +1.133350000000000080e+00 -3.965625000000000000e+01 +1.133355000000000112e+00 -3.956250000000000000e+01 +1.133360000000000145e+00 -3.953125000000000000e+01 +1.133365000000000178e+00 -3.956250000000000000e+01 +1.133369999999999989e+00 -3.956250000000000000e+01 +1.133375000000000021e+00 -3.956250000000000000e+01 +1.133380000000000054e+00 -3.950000000000000000e+01 +1.133385000000000087e+00 -3.962500000000000000e+01 +1.133390000000000120e+00 -3.956250000000000000e+01 +1.133395000000000152e+00 -3.950000000000000000e+01 +1.133400000000000185e+00 -3.953125000000000000e+01 +1.133404999999999996e+00 -3.959375381469726562e+01 +1.133410000000000029e+00 -3.950000000000000000e+01 +1.133415000000000061e+00 -3.956250000000000000e+01 +1.133420000000000094e+00 -3.953125000000000000e+01 +1.133425000000000127e+00 -3.953125000000000000e+01 +1.133430000000000160e+00 -3.956250000000000000e+01 +1.133435000000000192e+00 -3.959375381469726562e+01 +1.133440000000000003e+00 -3.956250000000000000e+01 +1.133445000000000036e+00 -3.959375381469726562e+01 +1.133450000000000069e+00 -3.953125000000000000e+01 +1.133455000000000101e+00 -3.956250000000000000e+01 +1.133460000000000134e+00 -3.959375381469726562e+01 +1.133465000000000167e+00 -3.953125000000000000e+01 +1.133470000000000200e+00 -3.956250000000000000e+01 +1.133475000000000010e+00 -3.965625000000000000e+01 +1.133480000000000043e+00 -3.959375381469726562e+01 +1.133485000000000076e+00 -3.965625000000000000e+01 +1.133490000000000109e+00 -3.959375381469726562e+01 +1.133495000000000141e+00 -3.962500000000000000e+01 +1.133500000000000174e+00 -3.959375381469726562e+01 +1.133504999999999985e+00 -3.959375381469726562e+01 +1.133510000000000018e+00 -3.959375381469726562e+01 +1.133515000000000050e+00 -3.962500000000000000e+01 +1.133520000000000083e+00 -3.959375381469726562e+01 +1.133525000000000116e+00 -3.962500000000000000e+01 +1.133530000000000149e+00 -3.959375381469726562e+01 +1.133535000000000181e+00 -3.956250000000000000e+01 +1.133539999999999992e+00 -3.956250000000000000e+01 +1.133545000000000025e+00 -3.959375381469726562e+01 +1.133550000000000058e+00 -3.950000000000000000e+01 +1.133555000000000090e+00 -3.965625000000000000e+01 +1.133560000000000123e+00 -3.959375381469726562e+01 +1.133565000000000156e+00 -3.953125000000000000e+01 +1.133570000000000189e+00 -3.956250000000000000e+01 +1.133574999999999999e+00 -3.953125000000000000e+01 +1.133580000000000032e+00 -3.956250000000000000e+01 +1.133585000000000065e+00 -3.956250000000000000e+01 +1.133590000000000098e+00 -3.959375381469726562e+01 +1.133595000000000130e+00 -3.956250000000000000e+01 +1.133600000000000163e+00 -3.956250000000000000e+01 +1.133605000000000196e+00 -3.959375381469726562e+01 +1.133610000000000007e+00 -3.956250000000000000e+01 +1.133615000000000039e+00 -3.953125000000000000e+01 +1.133620000000000072e+00 -3.959375381469726562e+01 +1.133625000000000105e+00 -3.959375381469726562e+01 +1.133630000000000138e+00 -3.959375381469726562e+01 +1.133635000000000170e+00 -3.956250000000000000e+01 +1.133640000000000203e+00 -3.959375381469726562e+01 +1.133645000000000014e+00 -3.959375381469726562e+01 +1.133650000000000047e+00 -3.959375381469726562e+01 +1.133655000000000079e+00 -3.959375381469726562e+01 +1.133660000000000112e+00 -3.956250000000000000e+01 +1.133665000000000145e+00 -3.959375381469726562e+01 +1.133670000000000178e+00 -3.959375381469726562e+01 +1.133674999999999988e+00 -3.962500000000000000e+01 +1.133680000000000021e+00 -3.959375381469726562e+01 +1.133685000000000054e+00 -3.959375381469726562e+01 +1.133690000000000087e+00 -3.959375381469726562e+01 +1.133695000000000119e+00 -3.962500000000000000e+01 +1.133700000000000152e+00 -3.956250000000000000e+01 +1.133705000000000185e+00 -3.965625000000000000e+01 +1.133709999999999996e+00 -3.962500000000000000e+01 +1.133715000000000028e+00 -3.956250000000000000e+01 +1.133720000000000061e+00 -3.962500000000000000e+01 +1.133725000000000094e+00 -3.962500000000000000e+01 +1.133730000000000127e+00 -3.968750000000000000e+01 +1.133735000000000159e+00 -3.959375381469726562e+01 +1.133740000000000192e+00 -3.959375381469726562e+01 +1.133745000000000003e+00 -3.965625000000000000e+01 +1.133750000000000036e+00 -3.962500000000000000e+01 +1.133755000000000068e+00 -3.968750000000000000e+01 +1.133760000000000101e+00 -3.965625000000000000e+01 +1.133765000000000134e+00 -3.959375381469726562e+01 +1.133770000000000167e+00 -3.965625000000000000e+01 +1.133775000000000199e+00 -3.962500000000000000e+01 +1.133780000000000010e+00 -3.965625000000000000e+01 +1.133785000000000043e+00 -3.959375381469726562e+01 +1.133790000000000076e+00 -3.968750000000000000e+01 +1.133795000000000108e+00 -3.962500000000000000e+01 +1.133800000000000141e+00 -3.959375381469726562e+01 +1.133805000000000174e+00 -3.971875000000000000e+01 +1.133809999999999985e+00 -3.962500000000000000e+01 +1.133815000000000017e+00 -3.965625000000000000e+01 +1.133820000000000050e+00 -3.965625000000000000e+01 +1.133825000000000083e+00 -3.965625000000000000e+01 +1.133830000000000116e+00 -3.965625000000000000e+01 +1.133835000000000148e+00 -3.965625000000000000e+01 +1.133840000000000181e+00 -3.956250000000000000e+01 +1.133844999999999992e+00 -3.965625000000000000e+01 +1.133850000000000025e+00 -3.965625000000000000e+01 +1.133855000000000057e+00 -3.962500000000000000e+01 +1.133860000000000090e+00 -3.965625000000000000e+01 +1.133865000000000123e+00 -3.962500000000000000e+01 +1.133870000000000156e+00 -3.962500000000000000e+01 +1.133875000000000188e+00 -3.965625000000000000e+01 +1.133879999999999999e+00 -3.968750000000000000e+01 +1.133885000000000032e+00 -3.965625000000000000e+01 +1.133890000000000065e+00 -3.965625000000000000e+01 +1.133895000000000097e+00 -3.959375381469726562e+01 +1.133900000000000130e+00 -3.965625000000000000e+01 +1.133905000000000163e+00 -3.965625000000000000e+01 +1.133910000000000196e+00 -3.959375381469726562e+01 +1.133915000000000006e+00 -3.959375381469726562e+01 +1.133920000000000039e+00 -3.965625000000000000e+01 +1.133925000000000072e+00 -3.962500000000000000e+01 +1.133930000000000105e+00 -3.959375381469726562e+01 +1.133935000000000137e+00 -3.962500000000000000e+01 +1.133940000000000170e+00 -3.962500000000000000e+01 +1.133945000000000203e+00 -3.959375381469726562e+01 +1.133950000000000014e+00 -3.959375381469726562e+01 +1.133955000000000046e+00 -3.959375381469726562e+01 +1.133960000000000079e+00 -3.953125000000000000e+01 +1.133965000000000112e+00 -3.965625000000000000e+01 +1.133970000000000145e+00 -3.965625000000000000e+01 +1.133975000000000177e+00 -3.962500000000000000e+01 +1.133979999999999988e+00 -3.965625000000000000e+01 +1.133985000000000021e+00 -3.965625000000000000e+01 +1.133990000000000054e+00 -3.965625000000000000e+01 +1.133995000000000086e+00 -3.959375381469726562e+01 +1.134000000000000119e+00 -3.962500000000000000e+01 +1.134005000000000152e+00 -3.962500000000000000e+01 +1.134010000000000185e+00 -3.965625000000000000e+01 +1.134014999999999995e+00 -3.965625000000000000e+01 +1.134020000000000028e+00 -3.965625000000000000e+01 +1.134025000000000061e+00 -3.956250000000000000e+01 +1.134030000000000094e+00 -3.959375381469726562e+01 +1.134035000000000126e+00 -3.959375381469726562e+01 +1.134040000000000159e+00 -3.962500000000000000e+01 +1.134045000000000192e+00 -3.965625000000000000e+01 +1.134050000000000002e+00 -3.965625000000000000e+01 +1.134055000000000035e+00 -3.959375381469726562e+01 +1.134060000000000068e+00 -3.959375381469726562e+01 +1.134065000000000101e+00 -3.962500000000000000e+01 +1.134070000000000134e+00 -3.962500000000000000e+01 +1.134075000000000166e+00 -3.959375381469726562e+01 +1.134080000000000199e+00 -3.962500000000000000e+01 +1.134085000000000010e+00 -3.959375381469726562e+01 +1.134090000000000042e+00 -3.971875000000000000e+01 +1.134095000000000075e+00 -3.968750000000000000e+01 +1.134100000000000108e+00 -3.962500000000000000e+01 +1.134105000000000141e+00 -3.965625000000000000e+01 +1.134110000000000174e+00 -3.965625000000000000e+01 +1.134114999999999984e+00 -3.959375381469726562e+01 +1.134120000000000017e+00 -3.959375381469726562e+01 +1.134125000000000050e+00 -3.965625000000000000e+01 +1.134130000000000082e+00 -3.965625000000000000e+01 +1.134135000000000115e+00 -3.959375381469726562e+01 +1.134140000000000148e+00 -3.965625000000000000e+01 +1.134145000000000181e+00 -3.965625000000000000e+01 +1.134149999999999991e+00 -3.962500000000000000e+01 +1.134155000000000024e+00 -3.965625000000000000e+01 +1.134160000000000057e+00 -3.959375381469726562e+01 +1.134165000000000090e+00 -3.965625000000000000e+01 +1.134170000000000122e+00 -3.965625000000000000e+01 +1.134175000000000155e+00 -3.959375381469726562e+01 +1.134180000000000188e+00 -3.965625000000000000e+01 +1.134184999999999999e+00 -3.968750000000000000e+01 +1.134190000000000031e+00 -3.965625000000000000e+01 +1.134195000000000064e+00 -3.965625000000000000e+01 +1.134200000000000097e+00 -3.965625000000000000e+01 +1.134205000000000130e+00 -3.968750000000000000e+01 +1.134210000000000163e+00 -3.965625000000000000e+01 +1.134215000000000195e+00 -3.968750000000000000e+01 +1.134220000000000006e+00 -3.968750000000000000e+01 +1.134225000000000039e+00 -3.968750000000000000e+01 +1.134230000000000071e+00 -3.965625000000000000e+01 +1.134235000000000104e+00 -3.968750000000000000e+01 +1.134240000000000137e+00 -3.971875000000000000e+01 +1.134245000000000170e+00 -3.962500000000000000e+01 +1.134250000000000203e+00 -3.968750000000000000e+01 +1.134255000000000013e+00 -3.968750000000000000e+01 +1.134260000000000046e+00 -3.965625000000000000e+01 +1.134265000000000079e+00 -3.962500000000000000e+01 +1.134270000000000111e+00 -3.968750000000000000e+01 +1.134275000000000144e+00 -3.962500000000000000e+01 +1.134280000000000177e+00 -3.965625000000000000e+01 +1.134284999999999988e+00 -3.968750000000000000e+01 +1.134290000000000020e+00 -3.971875000000000000e+01 +1.134295000000000053e+00 -3.971875000000000000e+01 +1.134300000000000086e+00 -3.971875000000000000e+01 +1.134305000000000119e+00 -3.968750000000000000e+01 +1.134310000000000151e+00 -3.971875000000000000e+01 +1.134315000000000184e+00 -3.971875000000000000e+01 +1.134319999999999995e+00 -3.965625000000000000e+01 +1.134325000000000028e+00 -3.965625000000000000e+01 +1.134330000000000060e+00 -3.965625000000000000e+01 +1.134335000000000093e+00 -3.968750000000000000e+01 +1.134340000000000126e+00 -3.971875000000000000e+01 +1.134345000000000159e+00 -3.975000381469726562e+01 +1.134350000000000191e+00 -3.965625000000000000e+01 +1.134355000000000002e+00 -3.975000381469726562e+01 +1.134360000000000035e+00 -3.971875000000000000e+01 +1.134365000000000068e+00 -3.971875000000000000e+01 +1.134370000000000100e+00 -3.971875000000000000e+01 +1.134375000000000133e+00 -3.971875000000000000e+01 +1.134380000000000166e+00 -3.975000381469726562e+01 +1.134385000000000199e+00 -3.965625000000000000e+01 +1.134390000000000009e+00 -3.965625000000000000e+01 +1.134395000000000042e+00 -3.968750000000000000e+01 +1.134400000000000075e+00 -3.968750000000000000e+01 +1.134405000000000108e+00 -3.962500000000000000e+01 +1.134410000000000140e+00 -3.965625000000000000e+01 +1.134415000000000173e+00 -3.971875000000000000e+01 +1.134419999999999984e+00 -3.971875000000000000e+01 +1.134425000000000017e+00 -3.965625000000000000e+01 +1.134430000000000049e+00 -3.971875000000000000e+01 +1.134435000000000082e+00 -3.968750000000000000e+01 +1.134440000000000115e+00 -3.968750000000000000e+01 +1.134445000000000148e+00 -3.978125000000000000e+01 +1.134450000000000180e+00 -3.962500000000000000e+01 +1.134454999999999991e+00 -3.971875000000000000e+01 +1.134460000000000024e+00 -3.971875000000000000e+01 +1.134465000000000057e+00 -3.968750000000000000e+01 +1.134470000000000089e+00 -3.971875000000000000e+01 +1.134475000000000122e+00 -3.968750000000000000e+01 +1.134480000000000155e+00 -3.971875000000000000e+01 +1.134485000000000188e+00 -3.971875000000000000e+01 +1.134489999999999998e+00 -3.971875000000000000e+01 +1.134495000000000031e+00 -3.978125000000000000e+01 +1.134500000000000064e+00 -3.975000381469726562e+01 +1.134505000000000097e+00 -3.965625000000000000e+01 +1.134510000000000129e+00 -3.975000381469726562e+01 +1.134515000000000162e+00 -3.971875000000000000e+01 +1.134520000000000195e+00 -3.971875000000000000e+01 +1.134525000000000006e+00 -3.968750000000000000e+01 +1.134530000000000038e+00 -3.971875000000000000e+01 +1.134535000000000071e+00 -3.975000381469726562e+01 +1.134540000000000104e+00 -3.971875000000000000e+01 +1.134545000000000137e+00 -3.975000381469726562e+01 +1.134550000000000169e+00 -3.971875000000000000e+01 +1.134555000000000202e+00 -3.978125000000000000e+01 +1.134560000000000013e+00 -3.971875000000000000e+01 +1.134565000000000046e+00 -3.975000381469726562e+01 +1.134570000000000078e+00 -3.968750000000000000e+01 +1.134575000000000111e+00 -3.968750000000000000e+01 +1.134580000000000144e+00 -3.971875000000000000e+01 +1.134585000000000177e+00 -3.968750000000000000e+01 +1.134589999999999987e+00 -3.965625000000000000e+01 +1.134595000000000020e+00 -3.968750000000000000e+01 +1.134600000000000053e+00 -3.971875000000000000e+01 +1.134605000000000086e+00 -3.971875000000000000e+01 +1.134610000000000118e+00 -3.968750000000000000e+01 +1.134615000000000151e+00 -3.968750000000000000e+01 +1.134620000000000184e+00 -3.971875000000000000e+01 +1.134624999999999995e+00 -3.971875000000000000e+01 +1.134630000000000027e+00 -3.971875000000000000e+01 +1.134635000000000060e+00 -3.971875000000000000e+01 +1.134640000000000093e+00 -3.971875000000000000e+01 +1.134645000000000126e+00 -3.968750000000000000e+01 +1.134650000000000158e+00 -3.965625000000000000e+01 +1.134655000000000191e+00 -3.968750000000000000e+01 +1.134660000000000002e+00 -3.971875000000000000e+01 +1.134665000000000035e+00 -3.965625000000000000e+01 +1.134670000000000067e+00 -3.968750000000000000e+01 +1.134675000000000100e+00 -3.975000381469726562e+01 +1.134680000000000133e+00 -3.971875000000000000e+01 +1.134685000000000166e+00 -3.971875000000000000e+01 +1.134690000000000198e+00 -3.968750000000000000e+01 +1.134695000000000009e+00 -3.965625000000000000e+01 +1.134700000000000042e+00 -3.971875000000000000e+01 +1.134705000000000075e+00 -3.965625000000000000e+01 +1.134710000000000107e+00 -3.975000381469726562e+01 +1.134715000000000140e+00 -3.968750000000000000e+01 +1.134720000000000173e+00 -3.968750000000000000e+01 +1.134724999999999984e+00 -3.971875000000000000e+01 +1.134730000000000016e+00 -3.968750000000000000e+01 +1.134735000000000049e+00 -3.971875000000000000e+01 +1.134740000000000082e+00 -3.971875000000000000e+01 +1.134745000000000115e+00 -3.975000381469726562e+01 +1.134750000000000147e+00 -3.968750000000000000e+01 +1.134755000000000180e+00 -3.968750000000000000e+01 +1.134759999999999991e+00 -3.968750000000000000e+01 +1.134765000000000024e+00 -3.965625000000000000e+01 +1.134770000000000056e+00 -3.965625000000000000e+01 +1.134775000000000089e+00 -3.968750000000000000e+01 +1.134780000000000122e+00 -3.971875000000000000e+01 +1.134785000000000155e+00 -3.971875000000000000e+01 +1.134790000000000187e+00 -3.971875000000000000e+01 +1.134794999999999998e+00 -3.965625000000000000e+01 +1.134800000000000031e+00 -3.968750000000000000e+01 +1.134805000000000064e+00 -3.971875000000000000e+01 +1.134810000000000096e+00 -3.968750000000000000e+01 +1.134815000000000129e+00 -3.965625000000000000e+01 +1.134820000000000162e+00 -3.975000381469726562e+01 +1.134825000000000195e+00 -3.971875000000000000e+01 +1.134830000000000005e+00 -3.968750000000000000e+01 +1.134835000000000038e+00 -3.971875000000000000e+01 +1.134840000000000071e+00 -3.971875000000000000e+01 +1.134845000000000104e+00 -3.968750000000000000e+01 +1.134850000000000136e+00 -3.975000381469726562e+01 +1.134855000000000169e+00 -3.975000381469726562e+01 +1.134860000000000202e+00 -3.975000381469726562e+01 +1.134865000000000013e+00 -3.971875000000000000e+01 +1.134870000000000045e+00 -3.968750000000000000e+01 +1.134875000000000078e+00 -3.968750000000000000e+01 +1.134880000000000111e+00 -3.971875000000000000e+01 +1.134885000000000144e+00 -3.971875000000000000e+01 +1.134890000000000176e+00 -3.971875000000000000e+01 +1.134894999999999987e+00 -3.968750000000000000e+01 +1.134900000000000020e+00 -3.968750000000000000e+01 +1.134905000000000053e+00 -3.971875000000000000e+01 +1.134910000000000085e+00 -3.971875000000000000e+01 +1.134915000000000118e+00 -3.975000381469726562e+01 +1.134920000000000151e+00 -3.968750000000000000e+01 +1.134925000000000184e+00 -3.978125000000000000e+01 +1.134929999999999994e+00 -3.975000381469726562e+01 +1.134935000000000027e+00 -3.971875000000000000e+01 +1.134940000000000060e+00 -3.968750000000000000e+01 +1.134945000000000093e+00 -3.975000381469726562e+01 +1.134950000000000125e+00 -3.968750000000000000e+01 +1.134955000000000158e+00 -3.968750000000000000e+01 +1.134960000000000191e+00 -3.968750000000000000e+01 +1.134965000000000002e+00 -3.968750000000000000e+01 +1.134970000000000034e+00 -3.971875000000000000e+01 +1.134975000000000067e+00 -3.968750000000000000e+01 +1.134980000000000100e+00 -3.971875000000000000e+01 +1.134985000000000133e+00 -3.971875000000000000e+01 +1.134990000000000165e+00 -3.971875000000000000e+01 +1.134995000000000198e+00 -3.971875000000000000e+01 +1.135000000000000009e+00 -3.971875000000000000e+01 +1.135005000000000042e+00 -3.975000381469726562e+01 +1.135010000000000074e+00 -3.978125000000000000e+01 +1.135015000000000107e+00 -3.971875000000000000e+01 +1.135020000000000140e+00 -3.975000381469726562e+01 +1.135025000000000173e+00 -3.971875000000000000e+01 +1.135029999999999983e+00 -3.968750000000000000e+01 +1.135035000000000016e+00 -3.971875000000000000e+01 +1.135040000000000049e+00 -3.971875000000000000e+01 +1.135045000000000082e+00 -3.971875000000000000e+01 +1.135050000000000114e+00 -3.965625000000000000e+01 +1.135055000000000147e+00 -3.968750000000000000e+01 +1.135060000000000180e+00 -3.968750000000000000e+01 +1.135064999999999991e+00 -3.965625000000000000e+01 +1.135070000000000023e+00 -3.971875000000000000e+01 +1.135075000000000056e+00 -3.971875000000000000e+01 +1.135080000000000089e+00 -3.965625000000000000e+01 +1.135085000000000122e+00 -3.965625000000000000e+01 +1.135090000000000154e+00 -3.971875000000000000e+01 +1.135095000000000187e+00 -3.965625000000000000e+01 +1.135099999999999998e+00 -3.965625000000000000e+01 +1.135105000000000031e+00 -3.968750000000000000e+01 +1.135110000000000063e+00 -3.971875000000000000e+01 +1.135115000000000096e+00 -3.968750000000000000e+01 +1.135120000000000129e+00 -3.968750000000000000e+01 +1.135125000000000162e+00 -3.968750000000000000e+01 +1.135130000000000194e+00 -3.971875000000000000e+01 +1.135135000000000005e+00 -3.968750000000000000e+01 +1.135140000000000038e+00 -3.968750000000000000e+01 +1.135145000000000071e+00 -3.965625000000000000e+01 +1.135150000000000103e+00 -3.968750000000000000e+01 +1.135155000000000136e+00 -3.968750000000000000e+01 +1.135160000000000169e+00 -3.971875000000000000e+01 +1.135165000000000202e+00 -3.965625000000000000e+01 +1.135170000000000012e+00 -3.971875000000000000e+01 +1.135175000000000045e+00 -3.968750000000000000e+01 +1.135180000000000078e+00 -3.971875000000000000e+01 +1.135185000000000111e+00 -3.968750000000000000e+01 +1.135190000000000143e+00 -3.968750000000000000e+01 +1.135195000000000176e+00 -3.965625000000000000e+01 +1.135199999999999987e+00 -3.971875000000000000e+01 +1.135205000000000020e+00 -3.975000381469726562e+01 +1.135210000000000052e+00 -3.971875000000000000e+01 +1.135215000000000085e+00 -3.965625000000000000e+01 +1.135220000000000118e+00 -3.975000381469726562e+01 +1.135225000000000151e+00 -3.968750000000000000e+01 +1.135230000000000183e+00 -3.971875000000000000e+01 +1.135234999999999994e+00 -3.975000381469726562e+01 +1.135240000000000027e+00 -3.965625000000000000e+01 +1.135245000000000060e+00 -3.968750000000000000e+01 +1.135250000000000092e+00 -3.971875000000000000e+01 +1.135255000000000125e+00 -3.978125000000000000e+01 +1.135260000000000158e+00 -3.968750000000000000e+01 +1.135265000000000191e+00 -3.968750000000000000e+01 +1.135270000000000001e+00 -3.971875000000000000e+01 +1.135275000000000034e+00 -3.965625000000000000e+01 +1.135280000000000067e+00 -3.971875000000000000e+01 +1.135285000000000100e+00 -3.962500000000000000e+01 +1.135290000000000132e+00 -3.971875000000000000e+01 +1.135295000000000165e+00 -3.962500000000000000e+01 +1.135300000000000198e+00 -3.968750000000000000e+01 +1.135305000000000009e+00 -3.968750000000000000e+01 +1.135310000000000041e+00 -3.965625000000000000e+01 +1.135315000000000074e+00 -3.968750000000000000e+01 +1.135320000000000107e+00 -3.971875000000000000e+01 +1.135325000000000140e+00 -3.968750000000000000e+01 +1.135330000000000172e+00 -3.968750000000000000e+01 +1.135334999999999983e+00 -3.971875000000000000e+01 +1.135340000000000016e+00 -3.965625000000000000e+01 +1.135345000000000049e+00 -3.968750000000000000e+01 +1.135350000000000081e+00 -3.965625000000000000e+01 +1.135355000000000114e+00 -3.968750000000000000e+01 +1.135360000000000147e+00 -3.968750000000000000e+01 +1.135365000000000180e+00 -3.968750000000000000e+01 +1.135369999999999990e+00 -3.965625000000000000e+01 +1.135375000000000023e+00 -3.965625000000000000e+01 +1.135380000000000056e+00 -3.968750000000000000e+01 +1.135385000000000089e+00 -3.971875000000000000e+01 +1.135390000000000121e+00 -3.968750000000000000e+01 +1.135395000000000154e+00 -3.968750000000000000e+01 +1.135400000000000187e+00 -3.965625000000000000e+01 +1.135404999999999998e+00 -3.968750000000000000e+01 +1.135410000000000030e+00 -3.965625000000000000e+01 +1.135415000000000063e+00 -3.962500000000000000e+01 +1.135420000000000096e+00 -3.965625000000000000e+01 +1.135425000000000129e+00 -3.968750000000000000e+01 +1.135430000000000161e+00 -3.965625000000000000e+01 +1.135435000000000194e+00 -3.965625000000000000e+01 +1.135440000000000005e+00 -3.965625000000000000e+01 +1.135445000000000038e+00 -3.962500000000000000e+01 +1.135450000000000070e+00 -3.962500000000000000e+01 +1.135455000000000103e+00 -3.965625000000000000e+01 +1.135460000000000136e+00 -3.965625000000000000e+01 +1.135465000000000169e+00 -3.962500000000000000e+01 +1.135470000000000201e+00 -3.959375381469726562e+01 +1.135475000000000012e+00 -3.962500000000000000e+01 +1.135480000000000045e+00 -3.962500000000000000e+01 +1.135485000000000078e+00 -3.962500000000000000e+01 +1.135490000000000110e+00 -3.959375381469726562e+01 +1.135495000000000143e+00 -3.962500000000000000e+01 +1.135500000000000176e+00 -3.965625000000000000e+01 +1.135504999999999987e+00 -3.971875000000000000e+01 +1.135510000000000019e+00 -3.965625000000000000e+01 +1.135515000000000052e+00 -3.962500000000000000e+01 +1.135520000000000085e+00 -3.965625000000000000e+01 +1.135525000000000118e+00 -3.968750000000000000e+01 +1.135530000000000150e+00 -3.959375381469726562e+01 +1.135535000000000183e+00 -3.968750000000000000e+01 +1.135539999999999994e+00 -3.962500000000000000e+01 +1.135545000000000027e+00 -3.965625000000000000e+01 +1.135550000000000059e+00 -3.971875000000000000e+01 +1.135555000000000092e+00 -3.965625000000000000e+01 +1.135560000000000125e+00 -3.959375381469726562e+01 +1.135565000000000158e+00 -3.962500000000000000e+01 +1.135570000000000190e+00 -3.971875000000000000e+01 +1.135575000000000001e+00 -3.965625000000000000e+01 +1.135580000000000034e+00 -3.965625000000000000e+01 +1.135585000000000067e+00 -3.965625000000000000e+01 +1.135590000000000099e+00 -3.968750000000000000e+01 +1.135595000000000132e+00 -3.962500000000000000e+01 +1.135600000000000165e+00 -3.965625000000000000e+01 +1.135605000000000198e+00 -3.968750000000000000e+01 +1.135610000000000008e+00 -3.965625000000000000e+01 +1.135615000000000041e+00 -3.971875000000000000e+01 +1.135620000000000074e+00 -3.965625000000000000e+01 +1.135625000000000107e+00 -3.965625000000000000e+01 +1.135630000000000139e+00 -3.965625000000000000e+01 +1.135635000000000172e+00 -3.962500000000000000e+01 +1.135639999999999983e+00 -3.968750000000000000e+01 +1.135645000000000016e+00 -3.965625000000000000e+01 +1.135650000000000048e+00 -3.965625000000000000e+01 +1.135655000000000081e+00 -3.962500000000000000e+01 +1.135660000000000114e+00 -3.962500000000000000e+01 +1.135665000000000147e+00 -3.959375381469726562e+01 +1.135670000000000179e+00 -3.959375381469726562e+01 +1.135674999999999990e+00 -3.962500000000000000e+01 +1.135680000000000023e+00 -3.959375381469726562e+01 +1.135685000000000056e+00 -3.956250000000000000e+01 +1.135690000000000088e+00 -3.968750000000000000e+01 +1.135695000000000121e+00 -3.962500000000000000e+01 +1.135700000000000154e+00 -3.959375381469726562e+01 +1.135705000000000187e+00 -3.965625000000000000e+01 +1.135709999999999997e+00 -3.959375381469726562e+01 +1.135715000000000030e+00 -3.965625000000000000e+01 +1.135720000000000063e+00 -3.965625000000000000e+01 +1.135725000000000096e+00 -3.965625000000000000e+01 +1.135730000000000128e+00 -3.965625000000000000e+01 +1.135735000000000161e+00 -3.965625000000000000e+01 +1.135740000000000194e+00 -3.968750000000000000e+01 +1.135745000000000005e+00 -3.965625000000000000e+01 +1.135750000000000037e+00 -3.962500000000000000e+01 +1.135755000000000070e+00 -3.971875000000000000e+01 +1.135760000000000103e+00 -3.968750000000000000e+01 +1.135765000000000136e+00 -3.962500000000000000e+01 +1.135770000000000168e+00 -3.968750000000000000e+01 +1.135775000000000201e+00 -3.968750000000000000e+01 +1.135780000000000012e+00 -3.965625000000000000e+01 +1.135785000000000045e+00 -3.968750000000000000e+01 +1.135790000000000077e+00 -3.965625000000000000e+01 +1.135795000000000110e+00 -3.959375381469726562e+01 +1.135800000000000143e+00 -3.962500000000000000e+01 +1.135805000000000176e+00 -3.965625000000000000e+01 +1.135809999999999986e+00 -3.962500000000000000e+01 +1.135815000000000019e+00 -3.965625000000000000e+01 +1.135820000000000052e+00 -3.965625000000000000e+01 +1.135825000000000085e+00 -3.959375381469726562e+01 +1.135830000000000117e+00 -3.965625000000000000e+01 +1.135835000000000150e+00 -3.962500000000000000e+01 +1.135840000000000183e+00 -3.965625000000000000e+01 +1.135844999999999994e+00 -3.965625000000000000e+01 +1.135850000000000026e+00 -3.968750000000000000e+01 +1.135855000000000059e+00 -3.965625000000000000e+01 +1.135860000000000092e+00 -3.959375381469726562e+01 +1.135865000000000125e+00 -3.962500000000000000e+01 +1.135870000000000157e+00 -3.965625000000000000e+01 +1.135875000000000190e+00 -3.971875000000000000e+01 +1.135880000000000001e+00 -3.965625000000000000e+01 +1.135885000000000034e+00 -3.965625000000000000e+01 +1.135890000000000066e+00 -3.962500000000000000e+01 +1.135895000000000099e+00 -3.968750000000000000e+01 +1.135900000000000132e+00 -3.965625000000000000e+01 +1.135905000000000165e+00 -3.965625000000000000e+01 +1.135910000000000197e+00 -3.968750000000000000e+01 +1.135915000000000008e+00 -3.965625000000000000e+01 +1.135920000000000041e+00 -3.965625000000000000e+01 +1.135925000000000074e+00 -3.965625000000000000e+01 +1.135930000000000106e+00 -3.959375381469726562e+01 +1.135935000000000139e+00 -3.965625000000000000e+01 +1.135940000000000172e+00 -3.962500000000000000e+01 +1.135944999999999983e+00 -3.959375381469726562e+01 +1.135950000000000015e+00 -3.962500000000000000e+01 +1.135955000000000048e+00 -3.965625000000000000e+01 +1.135960000000000081e+00 -3.968750000000000000e+01 +1.135965000000000114e+00 -3.965625000000000000e+01 +1.135970000000000146e+00 -3.959375381469726562e+01 +1.135975000000000179e+00 -3.962500000000000000e+01 +1.135979999999999990e+00 -3.959375381469726562e+01 +1.135985000000000023e+00 -3.959375381469726562e+01 +1.135990000000000055e+00 -3.962500000000000000e+01 +1.135995000000000088e+00 -3.965625000000000000e+01 +1.136000000000000121e+00 -3.965625000000000000e+01 +1.136005000000000154e+00 -3.962500000000000000e+01 +1.136010000000000186e+00 -3.959375381469726562e+01 +1.136014999999999997e+00 -3.959375381469726562e+01 +1.136020000000000030e+00 -3.959375381469726562e+01 +1.136025000000000063e+00 -3.965625000000000000e+01 +1.136030000000000095e+00 -3.962500000000000000e+01 +1.136035000000000128e+00 -3.959375381469726562e+01 +1.136040000000000161e+00 -3.959375381469726562e+01 +1.136045000000000194e+00 -3.965625000000000000e+01 +1.136050000000000004e+00 -3.968750000000000000e+01 +1.136055000000000037e+00 -3.962500000000000000e+01 +1.136060000000000070e+00 -3.962500000000000000e+01 +1.136065000000000103e+00 -3.959375381469726562e+01 +1.136070000000000135e+00 -3.959375381469726562e+01 +1.136075000000000168e+00 -3.965625000000000000e+01 +1.136080000000000201e+00 -3.965625000000000000e+01 +1.136085000000000012e+00 -3.959375381469726562e+01 +1.136090000000000044e+00 -3.962500000000000000e+01 +1.136095000000000077e+00 -3.962500000000000000e+01 +1.136100000000000110e+00 -3.965625000000000000e+01 +1.136105000000000143e+00 -3.959375381469726562e+01 +1.136110000000000175e+00 -3.962500000000000000e+01 +1.136114999999999986e+00 -3.965625000000000000e+01 +1.136120000000000019e+00 -3.962500000000000000e+01 +1.136125000000000052e+00 -3.962500000000000000e+01 +1.136130000000000084e+00 -3.962500000000000000e+01 +1.136135000000000117e+00 -3.956250000000000000e+01 +1.136140000000000150e+00 -3.959375381469726562e+01 +1.136145000000000183e+00 -3.965625000000000000e+01 +1.136149999999999993e+00 -3.959375381469726562e+01 +1.136155000000000026e+00 -3.965625000000000000e+01 +1.136160000000000059e+00 -3.965625000000000000e+01 +1.136165000000000092e+00 -3.968750000000000000e+01 +1.136170000000000124e+00 -3.956250000000000000e+01 +1.136175000000000157e+00 -3.962500000000000000e+01 +1.136180000000000190e+00 -3.965625000000000000e+01 +1.136185000000000000e+00 -3.962500000000000000e+01 +1.136190000000000033e+00 -3.962500000000000000e+01 +1.136195000000000066e+00 -3.968750000000000000e+01 +1.136200000000000099e+00 -3.962500000000000000e+01 +1.136205000000000132e+00 -3.965625000000000000e+01 +1.136210000000000164e+00 -3.959375381469726562e+01 +1.136215000000000197e+00 -3.965625000000000000e+01 +1.136220000000000008e+00 -3.959375381469726562e+01 +1.136225000000000041e+00 -3.959375381469726562e+01 +1.136230000000000073e+00 -3.965625000000000000e+01 +1.136235000000000106e+00 -3.962500000000000000e+01 +1.136240000000000139e+00 -3.959375381469726562e+01 +1.136245000000000172e+00 -3.959375381469726562e+01 +1.136249999999999982e+00 -3.965625000000000000e+01 +1.136255000000000015e+00 -3.965625000000000000e+01 +1.136260000000000048e+00 -3.962500000000000000e+01 +1.136265000000000081e+00 -3.959375381469726562e+01 +1.136270000000000113e+00 -3.965625000000000000e+01 +1.136275000000000146e+00 -3.965625000000000000e+01 +1.136280000000000179e+00 -3.959375381469726562e+01 +1.136284999999999989e+00 -3.962500000000000000e+01 +1.136290000000000022e+00 -3.959375381469726562e+01 +1.136295000000000055e+00 -3.965625000000000000e+01 +1.136300000000000088e+00 -3.962500000000000000e+01 +1.136305000000000121e+00 -3.965625000000000000e+01 +1.136310000000000153e+00 -3.962500000000000000e+01 +1.136315000000000186e+00 -3.965625000000000000e+01 +1.136319999999999997e+00 -3.962500000000000000e+01 +1.136325000000000029e+00 -3.971875000000000000e+01 +1.136330000000000062e+00 -3.965625000000000000e+01 +1.136335000000000095e+00 -3.965625000000000000e+01 +1.136340000000000128e+00 -3.971875000000000000e+01 +1.136345000000000161e+00 -3.968750000000000000e+01 +1.136350000000000193e+00 -3.965625000000000000e+01 +1.136355000000000004e+00 -3.962500000000000000e+01 +1.136360000000000037e+00 -3.959375381469726562e+01 +1.136365000000000069e+00 -3.962500000000000000e+01 +1.136370000000000102e+00 -3.968750000000000000e+01 +1.136375000000000135e+00 -3.965625000000000000e+01 +1.136380000000000168e+00 -3.968750000000000000e+01 +1.136385000000000201e+00 -3.968750000000000000e+01 +1.136390000000000011e+00 -3.965625000000000000e+01 +1.136395000000000044e+00 -3.965625000000000000e+01 +1.136400000000000077e+00 -3.968750000000000000e+01 +1.136405000000000109e+00 -3.971875000000000000e+01 +1.136410000000000142e+00 -3.959375381469726562e+01 +1.136415000000000175e+00 -3.965625000000000000e+01 +1.136419999999999986e+00 -3.959375381469726562e+01 +1.136425000000000018e+00 -3.965625000000000000e+01 +1.136430000000000051e+00 -3.962500000000000000e+01 +1.136435000000000084e+00 -3.965625000000000000e+01 +1.136440000000000117e+00 -3.968750000000000000e+01 +1.136445000000000149e+00 -3.975000381469726562e+01 +1.136450000000000182e+00 -3.968750000000000000e+01 +1.136454999999999993e+00 -3.962500000000000000e+01 +1.136460000000000026e+00 -3.965625000000000000e+01 +1.136465000000000058e+00 -3.968750000000000000e+01 +1.136470000000000091e+00 -3.965625000000000000e+01 +1.136475000000000124e+00 -3.965625000000000000e+01 +1.136480000000000157e+00 -3.962500000000000000e+01 +1.136485000000000190e+00 -3.965625000000000000e+01 +1.136490000000000000e+00 -3.959375381469726562e+01 +1.136495000000000033e+00 -3.956250000000000000e+01 +1.136500000000000066e+00 -3.965625000000000000e+01 +1.136505000000000098e+00 -3.965625000000000000e+01 +1.136510000000000131e+00 -3.965625000000000000e+01 +1.136515000000000164e+00 -3.965625000000000000e+01 +1.136520000000000197e+00 -3.968750000000000000e+01 +1.136525000000000007e+00 -3.962500000000000000e+01 +1.136530000000000040e+00 -3.965625000000000000e+01 +1.136535000000000073e+00 -3.965625000000000000e+01 +1.136540000000000106e+00 -3.965625000000000000e+01 +1.136545000000000138e+00 -3.965625000000000000e+01 +1.136550000000000171e+00 -3.968750000000000000e+01 +1.136554999999999982e+00 -3.959375381469726562e+01 +1.136560000000000015e+00 -3.971875000000000000e+01 +1.136565000000000047e+00 -3.965625000000000000e+01 +1.136570000000000080e+00 -3.965625000000000000e+01 +1.136575000000000113e+00 -3.965625000000000000e+01 +1.136580000000000146e+00 -3.962500000000000000e+01 +1.136585000000000178e+00 -3.962500000000000000e+01 +1.136589999999999989e+00 -3.959375381469726562e+01 +1.136595000000000022e+00 -3.959375381469726562e+01 +1.136600000000000055e+00 -3.965625000000000000e+01 +1.136605000000000087e+00 -3.962500000000000000e+01 +1.136610000000000120e+00 -3.962500000000000000e+01 +1.136615000000000153e+00 -3.962500000000000000e+01 +1.136620000000000186e+00 -3.965625000000000000e+01 +1.136624999999999996e+00 -3.965625000000000000e+01 +1.136630000000000029e+00 -3.965625000000000000e+01 +1.136635000000000062e+00 -3.959375381469726562e+01 +1.136640000000000095e+00 -3.965625000000000000e+01 +1.136645000000000127e+00 -3.965625000000000000e+01 +1.136650000000000160e+00 -3.956250000000000000e+01 +1.136655000000000193e+00 -3.956250000000000000e+01 +1.136660000000000004e+00 -3.959375381469726562e+01 +1.136665000000000036e+00 -3.962500000000000000e+01 +1.136670000000000069e+00 -3.965625000000000000e+01 +1.136675000000000102e+00 -3.962500000000000000e+01 +1.136680000000000135e+00 -3.965625000000000000e+01 +1.136685000000000167e+00 -3.956250000000000000e+01 +1.136690000000000200e+00 -3.959375381469726562e+01 +1.136695000000000011e+00 -3.956250000000000000e+01 +1.136700000000000044e+00 -3.959375381469726562e+01 +1.136705000000000076e+00 -3.959375381469726562e+01 +1.136710000000000109e+00 -3.959375381469726562e+01 +1.136715000000000142e+00 -3.959375381469726562e+01 +1.136720000000000175e+00 -3.965625000000000000e+01 +1.136724999999999985e+00 -3.956250000000000000e+01 +1.136730000000000018e+00 -3.962500000000000000e+01 +1.136735000000000051e+00 -3.965625000000000000e+01 +1.136740000000000084e+00 -3.962500000000000000e+01 +1.136745000000000116e+00 -3.956250000000000000e+01 +1.136750000000000149e+00 -3.959375381469726562e+01 +1.136755000000000182e+00 -3.962500000000000000e+01 +1.136759999999999993e+00 -3.965625000000000000e+01 +1.136765000000000025e+00 -3.962500000000000000e+01 +1.136770000000000058e+00 -3.959375381469726562e+01 +1.136775000000000091e+00 -3.962500000000000000e+01 +1.136780000000000124e+00 -3.962500000000000000e+01 +1.136785000000000156e+00 -3.965625000000000000e+01 +1.136790000000000189e+00 -3.959375381469726562e+01 +1.136795000000000000e+00 -3.962500000000000000e+01 +1.136800000000000033e+00 -3.962500000000000000e+01 +1.136805000000000065e+00 -3.962500000000000000e+01 +1.136810000000000098e+00 -3.959375381469726562e+01 +1.136815000000000131e+00 -3.959375381469726562e+01 +1.136820000000000164e+00 -3.959375381469726562e+01 +1.136825000000000196e+00 -3.962500000000000000e+01 +1.136830000000000007e+00 -3.959375381469726562e+01 +1.136835000000000040e+00 -3.962500000000000000e+01 +1.136840000000000073e+00 -3.953125000000000000e+01 +1.136845000000000105e+00 -3.953125000000000000e+01 +1.136850000000000138e+00 -3.959375381469726562e+01 +1.136855000000000171e+00 -3.956250000000000000e+01 +1.136860000000000204e+00 -3.956250000000000000e+01 +1.136865000000000014e+00 -3.959375381469726562e+01 +1.136870000000000047e+00 -3.956250000000000000e+01 +1.136875000000000080e+00 -3.956250000000000000e+01 +1.136880000000000113e+00 -3.959375381469726562e+01 +1.136885000000000145e+00 -3.959375381469726562e+01 +1.136890000000000178e+00 -3.956250000000000000e+01 +1.136894999999999989e+00 -3.953125000000000000e+01 +1.136900000000000022e+00 -3.953125000000000000e+01 +1.136905000000000054e+00 -3.953125000000000000e+01 +1.136910000000000087e+00 -3.959375381469726562e+01 +1.136915000000000120e+00 -3.953125000000000000e+01 +1.136920000000000153e+00 -3.956250000000000000e+01 +1.136925000000000185e+00 -3.953125000000000000e+01 +1.136929999999999996e+00 -3.956250000000000000e+01 +1.136935000000000029e+00 -3.950000000000000000e+01 +1.136940000000000062e+00 -3.953125000000000000e+01 +1.136945000000000094e+00 -3.956250000000000000e+01 +1.136950000000000127e+00 -3.959375381469726562e+01 +1.136955000000000160e+00 -3.962500000000000000e+01 +1.136960000000000193e+00 -3.959375381469726562e+01 +1.136965000000000003e+00 -3.956250000000000000e+01 +1.136970000000000036e+00 -3.956250000000000000e+01 +1.136975000000000069e+00 -3.959375381469726562e+01 +1.136980000000000102e+00 -3.956250000000000000e+01 +1.136985000000000134e+00 -3.959375381469726562e+01 +1.136990000000000167e+00 -3.962500000000000000e+01 +1.136995000000000200e+00 -3.959375381469726562e+01 +1.137000000000000011e+00 -3.956250000000000000e+01 +1.137005000000000043e+00 -3.959375381469726562e+01 +1.137010000000000076e+00 -3.959375381469726562e+01 +1.137015000000000109e+00 -3.956250000000000000e+01 +1.137020000000000142e+00 -3.956250000000000000e+01 +1.137025000000000174e+00 -3.959375381469726562e+01 +1.137029999999999985e+00 -3.956250000000000000e+01 +1.137035000000000018e+00 -3.953125000000000000e+01 +1.137040000000000051e+00 -3.959375381469726562e+01 +1.137045000000000083e+00 -3.956250000000000000e+01 +1.137050000000000116e+00 -3.962500000000000000e+01 +1.137055000000000149e+00 -3.953125000000000000e+01 +1.137060000000000182e+00 -3.953125000000000000e+01 +1.137064999999999992e+00 -3.956250000000000000e+01 +1.137070000000000025e+00 -3.956250000000000000e+01 +1.137075000000000058e+00 -3.959375381469726562e+01 +1.137080000000000091e+00 -3.953125000000000000e+01 +1.137085000000000123e+00 -3.953125000000000000e+01 +1.137090000000000156e+00 -3.956250000000000000e+01 +1.137095000000000189e+00 -3.953125000000000000e+01 +1.137100000000000000e+00 -3.956250000000000000e+01 +1.137105000000000032e+00 -3.956250000000000000e+01 +1.137110000000000065e+00 -3.953125000000000000e+01 +1.137115000000000098e+00 -3.956250000000000000e+01 +1.137120000000000131e+00 -3.956250000000000000e+01 +1.137125000000000163e+00 -3.953125000000000000e+01 +1.137130000000000196e+00 -3.956250000000000000e+01 +1.137135000000000007e+00 -3.953125000000000000e+01 +1.137140000000000040e+00 -3.953125000000000000e+01 +1.137145000000000072e+00 -3.956250000000000000e+01 +1.137150000000000105e+00 -3.950000000000000000e+01 +1.137155000000000138e+00 -3.953125000000000000e+01 +1.137160000000000171e+00 -3.956250000000000000e+01 +1.137165000000000203e+00 -3.953125000000000000e+01 +1.137170000000000014e+00 -3.956250000000000000e+01 +1.137175000000000047e+00 -3.956250000000000000e+01 +1.137180000000000080e+00 -3.956250000000000000e+01 +1.137185000000000112e+00 -3.956250000000000000e+01 +1.137190000000000145e+00 -3.956250000000000000e+01 +1.137195000000000178e+00 -3.953125000000000000e+01 +1.137199999999999989e+00 -3.959375381469726562e+01 +1.137205000000000021e+00 -3.959375381469726562e+01 +1.137210000000000054e+00 -3.959375381469726562e+01 +1.137215000000000087e+00 -3.956250000000000000e+01 +1.137220000000000120e+00 -3.959375381469726562e+01 +1.137225000000000152e+00 -3.959375381469726562e+01 +1.137230000000000185e+00 -3.962500000000000000e+01 +1.137234999999999996e+00 -3.956250000000000000e+01 +1.137240000000000029e+00 -3.956250000000000000e+01 +1.137245000000000061e+00 -3.959375381469726562e+01 +1.137250000000000094e+00 -3.953125000000000000e+01 +1.137255000000000127e+00 -3.956250000000000000e+01 +1.137260000000000160e+00 -3.950000000000000000e+01 +1.137265000000000192e+00 -3.953125000000000000e+01 +1.137270000000000003e+00 -3.959375381469726562e+01 +1.137275000000000036e+00 -3.956250000000000000e+01 +1.137280000000000069e+00 -3.950000000000000000e+01 +1.137285000000000101e+00 -3.953125000000000000e+01 +1.137290000000000134e+00 -3.953125000000000000e+01 +1.137295000000000167e+00 -3.959375381469726562e+01 +1.137300000000000200e+00 -3.959375381469726562e+01 +1.137305000000000010e+00 -3.953125000000000000e+01 +1.137310000000000043e+00 -3.953125000000000000e+01 +1.137315000000000076e+00 -3.950000000000000000e+01 +1.137320000000000109e+00 -3.950000000000000000e+01 +1.137325000000000141e+00 -3.953125000000000000e+01 +1.137330000000000174e+00 -3.953125000000000000e+01 +1.137334999999999985e+00 -3.950000000000000000e+01 +1.137340000000000018e+00 -3.953125000000000000e+01 +1.137345000000000050e+00 -3.959375381469726562e+01 +1.137350000000000083e+00 -3.953125000000000000e+01 +1.137355000000000116e+00 -3.953125000000000000e+01 +1.137360000000000149e+00 -3.953125000000000000e+01 +1.137365000000000181e+00 -3.953125000000000000e+01 +1.137369999999999992e+00 -3.956250000000000000e+01 +1.137375000000000025e+00 -3.959375381469726562e+01 +1.137380000000000058e+00 -3.956250000000000000e+01 +1.137385000000000090e+00 -3.953125000000000000e+01 +1.137390000000000123e+00 -3.956250000000000000e+01 +1.137395000000000156e+00 -3.959375381469726562e+01 +1.137400000000000189e+00 -3.953125000000000000e+01 +1.137404999999999999e+00 -3.962500000000000000e+01 +1.137410000000000032e+00 -3.956250000000000000e+01 +1.137415000000000065e+00 -3.959375381469726562e+01 +1.137420000000000098e+00 -3.956250000000000000e+01 +1.137425000000000130e+00 -3.959375381469726562e+01 +1.137430000000000163e+00 -3.953125000000000000e+01 +1.137435000000000196e+00 -3.953125000000000000e+01 +1.137440000000000007e+00 -3.956250000000000000e+01 +1.137445000000000039e+00 -3.950000000000000000e+01 +1.137450000000000072e+00 -3.956250000000000000e+01 +1.137455000000000105e+00 -3.956250000000000000e+01 +1.137460000000000138e+00 -3.956250000000000000e+01 +1.137465000000000170e+00 -3.965625000000000000e+01 +1.137470000000000203e+00 -3.953125000000000000e+01 +1.137475000000000014e+00 -3.956250000000000000e+01 +1.137480000000000047e+00 -3.959375381469726562e+01 +1.137485000000000079e+00 -3.956250000000000000e+01 +1.137490000000000112e+00 -3.968750000000000000e+01 +1.137495000000000145e+00 -3.962500000000000000e+01 +1.137500000000000178e+00 -3.959375381469726562e+01 +1.137504999999999988e+00 -3.953125000000000000e+01 +1.137510000000000021e+00 -3.956250000000000000e+01 +1.137515000000000054e+00 -3.956250000000000000e+01 +1.137520000000000087e+00 -3.959375381469726562e+01 +1.137525000000000119e+00 -3.959375381469726562e+01 +1.137530000000000152e+00 -3.959375381469726562e+01 +1.137535000000000185e+00 -3.962500000000000000e+01 +1.137539999999999996e+00 -3.956250000000000000e+01 +1.137545000000000028e+00 -3.959375381469726562e+01 +1.137550000000000061e+00 -3.953125000000000000e+01 +1.137555000000000094e+00 -3.950000000000000000e+01 +1.137560000000000127e+00 -3.953125000000000000e+01 +1.137565000000000159e+00 -3.956250000000000000e+01 +1.137570000000000192e+00 -3.950000000000000000e+01 +1.137575000000000003e+00 -3.956250000000000000e+01 +1.137580000000000036e+00 -3.950000000000000000e+01 +1.137585000000000068e+00 -3.950000000000000000e+01 +1.137590000000000101e+00 -3.953125000000000000e+01 +1.137595000000000134e+00 -3.950000000000000000e+01 +1.137600000000000167e+00 -3.959375381469726562e+01 +1.137605000000000199e+00 -3.950000000000000000e+01 +1.137610000000000010e+00 -3.956250000000000000e+01 +1.137615000000000043e+00 -3.956250000000000000e+01 +1.137620000000000076e+00 -3.953125000000000000e+01 +1.137625000000000108e+00 -3.953125000000000000e+01 +1.137630000000000141e+00 -3.956250000000000000e+01 +1.137635000000000174e+00 -3.950000000000000000e+01 +1.137639999999999985e+00 -3.959375381469726562e+01 +1.137645000000000017e+00 -3.956250000000000000e+01 +1.137650000000000050e+00 -3.953125000000000000e+01 +1.137655000000000083e+00 -3.953125000000000000e+01 +1.137660000000000116e+00 -3.953125000000000000e+01 +1.137665000000000148e+00 -3.956250000000000000e+01 +1.137670000000000181e+00 -3.953125000000000000e+01 +1.137674999999999992e+00 -3.956250000000000000e+01 +1.137680000000000025e+00 -3.953125000000000000e+01 +1.137685000000000057e+00 -3.953125000000000000e+01 +1.137690000000000090e+00 -3.953125000000000000e+01 +1.137695000000000123e+00 -3.959375381469726562e+01 +1.137700000000000156e+00 -3.953125000000000000e+01 +1.137705000000000188e+00 -3.953125000000000000e+01 +1.137709999999999999e+00 -3.953125000000000000e+01 +1.137715000000000032e+00 -3.959375381469726562e+01 +1.137720000000000065e+00 -3.953125000000000000e+01 +1.137725000000000097e+00 -3.950000000000000000e+01 +1.137730000000000130e+00 -3.950000000000000000e+01 +1.137735000000000163e+00 -3.946875000000000000e+01 +1.137740000000000196e+00 -3.950000000000000000e+01 +1.137745000000000006e+00 -3.956250000000000000e+01 +1.137750000000000039e+00 -3.956250000000000000e+01 +1.137755000000000072e+00 -3.950000000000000000e+01 +1.137760000000000105e+00 -3.950000000000000000e+01 +1.137765000000000137e+00 -3.953125000000000000e+01 +1.137770000000000170e+00 -3.950000000000000000e+01 +1.137775000000000203e+00 -3.956250000000000000e+01 +1.137780000000000014e+00 -3.953125000000000000e+01 +1.137785000000000046e+00 -3.953125000000000000e+01 +1.137790000000000079e+00 -3.950000000000000000e+01 +1.137795000000000112e+00 -3.950000000000000000e+01 +1.137800000000000145e+00 -3.946875000000000000e+01 +1.137805000000000177e+00 -3.953125000000000000e+01 +1.137809999999999988e+00 -3.953125000000000000e+01 +1.137815000000000021e+00 -3.953125000000000000e+01 +1.137820000000000054e+00 -3.950000000000000000e+01 +1.137825000000000086e+00 -3.946875000000000000e+01 +1.137830000000000119e+00 -3.950000000000000000e+01 +1.137835000000000152e+00 -3.953125000000000000e+01 +1.137840000000000185e+00 -3.953125000000000000e+01 +1.137844999999999995e+00 -3.950000000000000000e+01 +1.137850000000000028e+00 -3.950000000000000000e+01 +1.137855000000000061e+00 -3.946875000000000000e+01 +1.137860000000000094e+00 -3.953125000000000000e+01 +1.137865000000000126e+00 -3.950000000000000000e+01 +1.137870000000000159e+00 -3.943750381469726562e+01 +1.137875000000000192e+00 -3.953125000000000000e+01 +1.137880000000000003e+00 -3.950000000000000000e+01 +1.137885000000000035e+00 -3.950000000000000000e+01 +1.137890000000000068e+00 -3.943750381469726562e+01 +1.137895000000000101e+00 -3.953125000000000000e+01 +1.137900000000000134e+00 -3.950000000000000000e+01 +1.137905000000000166e+00 -3.950000000000000000e+01 +1.137910000000000199e+00 -3.953125000000000000e+01 +1.137915000000000010e+00 -3.950000000000000000e+01 +1.137920000000000043e+00 -3.946875000000000000e+01 +1.137925000000000075e+00 -3.953125000000000000e+01 +1.137930000000000108e+00 -3.950000000000000000e+01 +1.137935000000000141e+00 -3.946875000000000000e+01 +1.137940000000000174e+00 -3.946875000000000000e+01 +1.137944999999999984e+00 -3.946875000000000000e+01 +1.137950000000000017e+00 -3.953125000000000000e+01 +1.137955000000000050e+00 -3.943750381469726562e+01 +1.137960000000000083e+00 -3.950000000000000000e+01 +1.137965000000000115e+00 -3.943750381469726562e+01 +1.137970000000000148e+00 -3.950000000000000000e+01 +1.137975000000000181e+00 -3.950000000000000000e+01 +1.137979999999999992e+00 -3.946875000000000000e+01 +1.137985000000000024e+00 -3.946875000000000000e+01 +1.137990000000000057e+00 -3.950000000000000000e+01 +1.137995000000000090e+00 -3.946875000000000000e+01 +1.138000000000000123e+00 -3.953125000000000000e+01 +1.138005000000000155e+00 -3.953125000000000000e+01 +1.138010000000000188e+00 -3.946875000000000000e+01 +1.138014999999999999e+00 -3.946875000000000000e+01 +1.138020000000000032e+00 -3.946875000000000000e+01 +1.138025000000000064e+00 -3.946875000000000000e+01 +1.138030000000000097e+00 -3.946875000000000000e+01 +1.138035000000000130e+00 -3.943750381469726562e+01 +1.138040000000000163e+00 -3.950000000000000000e+01 +1.138045000000000195e+00 -3.946875000000000000e+01 +1.138050000000000006e+00 -3.950000000000000000e+01 +1.138055000000000039e+00 -3.943750381469726562e+01 +1.138060000000000072e+00 -3.950000000000000000e+01 +1.138065000000000104e+00 -3.950000000000000000e+01 +1.138070000000000137e+00 -3.940625000000000000e+01 +1.138075000000000170e+00 -3.943750381469726562e+01 +1.138080000000000203e+00 -3.946875000000000000e+01 +1.138085000000000013e+00 -3.950000000000000000e+01 +1.138090000000000046e+00 -3.946875000000000000e+01 +1.138095000000000079e+00 -3.943750381469726562e+01 +1.138100000000000112e+00 -3.943750381469726562e+01 +1.138105000000000144e+00 -3.950000000000000000e+01 +1.138110000000000177e+00 -3.950000000000000000e+01 +1.138114999999999988e+00 -3.950000000000000000e+01 +1.138120000000000021e+00 -3.956250000000000000e+01 +1.138125000000000053e+00 -3.946875000000000000e+01 +1.138130000000000086e+00 -3.946875000000000000e+01 +1.138135000000000119e+00 -3.946875000000000000e+01 +1.138140000000000152e+00 -3.950000000000000000e+01 +1.138145000000000184e+00 -3.950000000000000000e+01 +1.138149999999999995e+00 -3.946875000000000000e+01 +1.138155000000000028e+00 -3.950000000000000000e+01 +1.138160000000000061e+00 -3.953125000000000000e+01 +1.138165000000000093e+00 -3.950000000000000000e+01 +1.138170000000000126e+00 -3.946875000000000000e+01 +1.138175000000000159e+00 -3.953125000000000000e+01 +1.138180000000000192e+00 -3.950000000000000000e+01 +1.138185000000000002e+00 -3.946875000000000000e+01 +1.138190000000000035e+00 -3.950000000000000000e+01 +1.138195000000000068e+00 -3.946875000000000000e+01 +1.138200000000000101e+00 -3.950000000000000000e+01 +1.138205000000000133e+00 -3.943750381469726562e+01 +1.138210000000000166e+00 -3.950000000000000000e+01 +1.138215000000000199e+00 -3.953125000000000000e+01 +1.138220000000000010e+00 -3.946875000000000000e+01 +1.138225000000000042e+00 -3.946875000000000000e+01 +1.138230000000000075e+00 -3.950000000000000000e+01 +1.138235000000000108e+00 -3.950000000000000000e+01 +1.138240000000000141e+00 -3.950000000000000000e+01 +1.138245000000000173e+00 -3.946875000000000000e+01 +1.138249999999999984e+00 -3.950000000000000000e+01 +1.138255000000000017e+00 -3.953125000000000000e+01 +1.138260000000000050e+00 -3.943750381469726562e+01 +1.138265000000000082e+00 -3.943750381469726562e+01 +1.138270000000000115e+00 -3.946875000000000000e+01 +1.138275000000000148e+00 -3.946875000000000000e+01 +1.138280000000000181e+00 -3.946875000000000000e+01 +1.138284999999999991e+00 -3.946875000000000000e+01 +1.138290000000000024e+00 -3.946875000000000000e+01 +1.138295000000000057e+00 -3.953125000000000000e+01 +1.138300000000000090e+00 -3.946875000000000000e+01 +1.138305000000000122e+00 -3.950000000000000000e+01 +1.138310000000000155e+00 -3.940625000000000000e+01 +1.138315000000000188e+00 -3.946875000000000000e+01 +1.138319999999999999e+00 -3.943750381469726562e+01 +1.138325000000000031e+00 -3.950000000000000000e+01 +1.138330000000000064e+00 -3.940625000000000000e+01 +1.138335000000000097e+00 -3.953125000000000000e+01 +1.138340000000000130e+00 -3.943750381469726562e+01 +1.138345000000000162e+00 -3.943750381469726562e+01 +1.138350000000000195e+00 -3.946875000000000000e+01 +1.138355000000000006e+00 -3.946875000000000000e+01 +1.138360000000000039e+00 -3.950000000000000000e+01 +1.138365000000000071e+00 -3.946875000000000000e+01 +1.138370000000000104e+00 -3.943750381469726562e+01 +1.138375000000000137e+00 -3.946875000000000000e+01 +1.138380000000000170e+00 -3.946875000000000000e+01 +1.138385000000000202e+00 -3.950000000000000000e+01 +1.138390000000000013e+00 -3.943750381469726562e+01 +1.138395000000000046e+00 -3.943750381469726562e+01 +1.138400000000000079e+00 -3.953125000000000000e+01 +1.138405000000000111e+00 -3.946875000000000000e+01 +1.138410000000000144e+00 -3.946875000000000000e+01 +1.138415000000000177e+00 -3.946875000000000000e+01 +1.138419999999999987e+00 -3.950000000000000000e+01 +1.138425000000000020e+00 -3.946875000000000000e+01 +1.138430000000000053e+00 -3.946875000000000000e+01 +1.138435000000000086e+00 -3.940625000000000000e+01 +1.138440000000000119e+00 -3.943750381469726562e+01 +1.138445000000000151e+00 -3.940625000000000000e+01 +1.138450000000000184e+00 -3.946875000000000000e+01 +1.138454999999999995e+00 -3.943750381469726562e+01 +1.138460000000000027e+00 -3.946875000000000000e+01 +1.138465000000000060e+00 -3.950000000000000000e+01 +1.138470000000000093e+00 -3.943750381469726562e+01 +1.138475000000000126e+00 -3.946875000000000000e+01 +1.138480000000000159e+00 -3.946875000000000000e+01 +1.138485000000000191e+00 -3.946875000000000000e+01 +1.138490000000000002e+00 -3.943750381469726562e+01 +1.138495000000000035e+00 -3.943750381469726562e+01 +1.138500000000000068e+00 -3.946875000000000000e+01 +1.138505000000000100e+00 -3.943750381469726562e+01 +1.138510000000000133e+00 -3.950000000000000000e+01 +1.138515000000000166e+00 -3.940625000000000000e+01 +1.138520000000000199e+00 -3.937500000000000000e+01 +1.138525000000000009e+00 -3.943750381469726562e+01 +1.138530000000000042e+00 -3.943750381469726562e+01 +1.138535000000000075e+00 -3.950000000000000000e+01 +1.138540000000000108e+00 -3.943750381469726562e+01 +1.138545000000000140e+00 -3.946875000000000000e+01 +1.138550000000000173e+00 -3.937500000000000000e+01 +1.138554999999999984e+00 -3.943750381469726562e+01 +1.138560000000000016e+00 -3.943750381469726562e+01 +1.138565000000000049e+00 -3.940625000000000000e+01 +1.138570000000000082e+00 -3.943750381469726562e+01 +1.138575000000000115e+00 -3.940625000000000000e+01 +1.138580000000000148e+00 -3.946875000000000000e+01 +1.138585000000000180e+00 -3.946875000000000000e+01 +1.138589999999999991e+00 -3.940625000000000000e+01 +1.138595000000000024e+00 -3.940625000000000000e+01 +1.138600000000000056e+00 -3.946875000000000000e+01 +1.138605000000000089e+00 -3.943750381469726562e+01 +1.138610000000000122e+00 -3.934375381469726562e+01 +1.138615000000000155e+00 -3.934375381469726562e+01 +1.138620000000000188e+00 -3.940625000000000000e+01 +1.138624999999999998e+00 -3.946875000000000000e+01 +1.138630000000000031e+00 -3.937500000000000000e+01 +1.138635000000000064e+00 -3.940625000000000000e+01 +1.138640000000000096e+00 -3.943750381469726562e+01 +1.138645000000000129e+00 -3.946875000000000000e+01 +1.138650000000000162e+00 -3.943750381469726562e+01 +1.138655000000000195e+00 -3.931250000000000000e+01 +1.138660000000000005e+00 -3.940625000000000000e+01 +1.138665000000000038e+00 -3.940625000000000000e+01 +1.138670000000000071e+00 -3.940625000000000000e+01 +1.138675000000000104e+00 -3.937500000000000000e+01 +1.138680000000000136e+00 -3.934375381469726562e+01 +1.138685000000000169e+00 -3.940625000000000000e+01 +1.138690000000000202e+00 -3.937500000000000000e+01 +1.138695000000000013e+00 -3.940625000000000000e+01 +1.138700000000000045e+00 -3.943750381469726562e+01 +1.138705000000000078e+00 -3.943750381469726562e+01 +1.138710000000000111e+00 -3.946875000000000000e+01 +1.138715000000000144e+00 -3.943750381469726562e+01 +1.138720000000000176e+00 -3.937500000000000000e+01 +1.138724999999999987e+00 -3.943750381469726562e+01 +1.138730000000000020e+00 -3.943750381469726562e+01 +1.138735000000000053e+00 -3.943750381469726562e+01 +1.138740000000000085e+00 -3.946875000000000000e+01 +1.138745000000000118e+00 -3.950000000000000000e+01 +1.138750000000000151e+00 -3.943750381469726562e+01 +1.138755000000000184e+00 -3.946875000000000000e+01 +1.138759999999999994e+00 -3.946875000000000000e+01 +1.138765000000000027e+00 -3.946875000000000000e+01 +1.138770000000000060e+00 -3.946875000000000000e+01 +1.138775000000000093e+00 -3.943750381469726562e+01 +1.138780000000000125e+00 -3.940625000000000000e+01 +1.138785000000000158e+00 -3.940625000000000000e+01 +1.138790000000000191e+00 -3.943750381469726562e+01 +1.138795000000000002e+00 -3.943750381469726562e+01 +1.138800000000000034e+00 -3.950000000000000000e+01 +1.138805000000000067e+00 -3.950000000000000000e+01 +1.138810000000000100e+00 -3.946875000000000000e+01 +1.138815000000000133e+00 -3.953125000000000000e+01 +1.138820000000000165e+00 -3.946875000000000000e+01 +1.138825000000000198e+00 -3.943750381469726562e+01 +1.138830000000000009e+00 -3.940625000000000000e+01 +1.138835000000000042e+00 -3.946875000000000000e+01 +1.138840000000000074e+00 -3.943750381469726562e+01 +1.138845000000000107e+00 -3.946875000000000000e+01 +1.138850000000000140e+00 -3.950000000000000000e+01 +1.138855000000000173e+00 -3.950000000000000000e+01 +1.138859999999999983e+00 -3.940625000000000000e+01 +1.138865000000000016e+00 -3.946875000000000000e+01 +1.138870000000000049e+00 -3.940625000000000000e+01 +1.138875000000000082e+00 -3.943750381469726562e+01 +1.138880000000000114e+00 -3.937500000000000000e+01 +1.138885000000000147e+00 -3.940625000000000000e+01 +1.138890000000000180e+00 -3.940625000000000000e+01 +1.138894999999999991e+00 -3.943750381469726562e+01 +1.138900000000000023e+00 -3.940625000000000000e+01 +1.138905000000000056e+00 -3.940625000000000000e+01 +1.138910000000000089e+00 -3.940625000000000000e+01 +1.138915000000000122e+00 -3.943750381469726562e+01 +1.138920000000000154e+00 -3.940625000000000000e+01 +1.138925000000000187e+00 -3.937500000000000000e+01 +1.138929999999999998e+00 -3.937500000000000000e+01 +1.138935000000000031e+00 -3.940625000000000000e+01 +1.138940000000000063e+00 -3.940625000000000000e+01 +1.138945000000000096e+00 -3.940625000000000000e+01 +1.138950000000000129e+00 -3.940625000000000000e+01 +1.138955000000000162e+00 -3.943750381469726562e+01 +1.138960000000000194e+00 -3.950000000000000000e+01 +1.138965000000000005e+00 -3.940625000000000000e+01 +1.138970000000000038e+00 -3.940625000000000000e+01 +1.138975000000000071e+00 -3.946875000000000000e+01 +1.138980000000000103e+00 -3.943750381469726562e+01 +1.138985000000000136e+00 -3.943750381469726562e+01 +1.138990000000000169e+00 -3.943750381469726562e+01 +1.138995000000000202e+00 -3.940625000000000000e+01 +1.139000000000000012e+00 -3.946875000000000000e+01 +1.139005000000000045e+00 -3.950000000000000000e+01 +1.139010000000000078e+00 -3.937500000000000000e+01 +1.139015000000000111e+00 -3.940625000000000000e+01 +1.139020000000000143e+00 -3.950000000000000000e+01 +1.139025000000000176e+00 -3.943750381469726562e+01 +1.139029999999999987e+00 -3.943750381469726562e+01 +1.139035000000000020e+00 -3.943750381469726562e+01 +1.139040000000000052e+00 -3.950000000000000000e+01 +1.139045000000000085e+00 -3.943750381469726562e+01 +1.139050000000000118e+00 -3.946875000000000000e+01 +1.139055000000000151e+00 -3.943750381469726562e+01 +1.139060000000000183e+00 -3.943750381469726562e+01 +1.139064999999999994e+00 -3.940625000000000000e+01 +1.139070000000000027e+00 -3.946875000000000000e+01 +1.139075000000000060e+00 -3.950000000000000000e+01 +1.139080000000000092e+00 -3.946875000000000000e+01 +1.139085000000000125e+00 -3.946875000000000000e+01 +1.139090000000000158e+00 -3.946875000000000000e+01 +1.139095000000000191e+00 -3.950000000000000000e+01 +1.139100000000000001e+00 -3.950000000000000000e+01 +1.139105000000000034e+00 -3.943750381469726562e+01 +1.139110000000000067e+00 -3.950000000000000000e+01 +1.139115000000000100e+00 -3.943750381469726562e+01 +1.139120000000000132e+00 -3.943750381469726562e+01 +1.139125000000000165e+00 -3.950000000000000000e+01 +1.139130000000000198e+00 -3.940625000000000000e+01 +1.139135000000000009e+00 -3.943750381469726562e+01 +1.139140000000000041e+00 -3.940625000000000000e+01 +1.139145000000000074e+00 -3.943750381469726562e+01 +1.139150000000000107e+00 -3.946875000000000000e+01 +1.139155000000000140e+00 -3.940625000000000000e+01 +1.139160000000000172e+00 -3.943750381469726562e+01 +1.139164999999999983e+00 -3.937500000000000000e+01 +1.139170000000000016e+00 -3.937500000000000000e+01 +1.139175000000000049e+00 -3.937500000000000000e+01 +1.139180000000000081e+00 -3.943750381469726562e+01 +1.139185000000000114e+00 -3.934375381469726562e+01 +1.139190000000000147e+00 -3.937500000000000000e+01 +1.139195000000000180e+00 -3.943750381469726562e+01 +1.139199999999999990e+00 -3.937500000000000000e+01 +1.139205000000000023e+00 -3.943750381469726562e+01 +1.139210000000000056e+00 -3.937500000000000000e+01 +1.139215000000000089e+00 -3.940625000000000000e+01 +1.139220000000000121e+00 -3.943750381469726562e+01 +1.139225000000000154e+00 -3.940625000000000000e+01 +1.139230000000000187e+00 -3.943750381469726562e+01 +1.139234999999999998e+00 -3.940625000000000000e+01 +1.139240000000000030e+00 -3.940625000000000000e+01 +1.139245000000000063e+00 -3.937500000000000000e+01 +1.139250000000000096e+00 -3.940625000000000000e+01 +1.139255000000000129e+00 -3.937500000000000000e+01 +1.139260000000000161e+00 -3.950000000000000000e+01 +1.139265000000000194e+00 -3.940625000000000000e+01 +1.139270000000000005e+00 -3.937500000000000000e+01 +1.139275000000000038e+00 -3.937500000000000000e+01 +1.139280000000000070e+00 -3.937500000000000000e+01 +1.139285000000000103e+00 -3.940625000000000000e+01 +1.139290000000000136e+00 -3.937500000000000000e+01 +1.139295000000000169e+00 -3.937500000000000000e+01 +1.139300000000000201e+00 -3.940625000000000000e+01 +1.139305000000000012e+00 -3.934375381469726562e+01 +1.139310000000000045e+00 -3.940625000000000000e+01 +1.139315000000000078e+00 -3.937500000000000000e+01 +1.139320000000000110e+00 -3.940625000000000000e+01 +1.139325000000000143e+00 -3.937500000000000000e+01 +1.139330000000000176e+00 -3.934375381469726562e+01 +1.139334999999999987e+00 -3.934375381469726562e+01 +1.139340000000000019e+00 -3.934375381469726562e+01 +1.139345000000000052e+00 -3.931250000000000000e+01 +1.139350000000000085e+00 -3.934375381469726562e+01 +1.139355000000000118e+00 -3.934375381469726562e+01 +1.139360000000000150e+00 -3.934375381469726562e+01 +1.139365000000000183e+00 -3.937500000000000000e+01 +1.139369999999999994e+00 -3.931250000000000000e+01 +1.139375000000000027e+00 -3.934375381469726562e+01 +1.139380000000000059e+00 -3.934375381469726562e+01 +1.139385000000000092e+00 -3.934375381469726562e+01 +1.139390000000000125e+00 -3.934375381469726562e+01 +1.139395000000000158e+00 -3.934375381469726562e+01 +1.139400000000000190e+00 -3.937500000000000000e+01 +1.139405000000000001e+00 -3.928125000000000000e+01 +1.139410000000000034e+00 -3.937500000000000000e+01 +1.139415000000000067e+00 -3.931250000000000000e+01 +1.139420000000000099e+00 -3.937500000000000000e+01 +1.139425000000000132e+00 -3.937500000000000000e+01 +1.139430000000000165e+00 -3.937500000000000000e+01 +1.139435000000000198e+00 -3.934375381469726562e+01 +1.139440000000000008e+00 -3.931250000000000000e+01 +1.139445000000000041e+00 -3.928125000000000000e+01 +1.139450000000000074e+00 -3.928125000000000000e+01 +1.139455000000000107e+00 -3.931250000000000000e+01 +1.139460000000000139e+00 -3.928125000000000000e+01 +1.139465000000000172e+00 -3.928125000000000000e+01 +1.139469999999999983e+00 -3.937500000000000000e+01 +1.139475000000000016e+00 -3.934375381469726562e+01 +1.139480000000000048e+00 -3.937500000000000000e+01 +1.139485000000000081e+00 -3.931250000000000000e+01 +1.139490000000000114e+00 -3.934375381469726562e+01 +1.139495000000000147e+00 -3.931250000000000000e+01 +1.139500000000000179e+00 -3.928125000000000000e+01 +1.139504999999999990e+00 -3.934375381469726562e+01 +1.139510000000000023e+00 -3.937500000000000000e+01 +1.139515000000000056e+00 -3.931250000000000000e+01 +1.139520000000000088e+00 -3.934375381469726562e+01 +1.139525000000000121e+00 -3.931250000000000000e+01 +1.139530000000000154e+00 -3.934375381469726562e+01 +1.139535000000000187e+00 -3.934375381469726562e+01 +1.139539999999999997e+00 -3.931250000000000000e+01 +1.139545000000000030e+00 -3.934375381469726562e+01 +1.139550000000000063e+00 -3.937500000000000000e+01 +1.139555000000000096e+00 -3.928125000000000000e+01 +1.139560000000000128e+00 -3.934375381469726562e+01 +1.139565000000000161e+00 -3.934375381469726562e+01 +1.139570000000000194e+00 -3.934375381469726562e+01 +1.139575000000000005e+00 -3.934375381469726562e+01 +1.139580000000000037e+00 -3.934375381469726562e+01 +1.139585000000000070e+00 -3.934375381469726562e+01 +1.139590000000000103e+00 -3.931250000000000000e+01 +1.139595000000000136e+00 -3.934375381469726562e+01 +1.139600000000000168e+00 -3.928125000000000000e+01 +1.139605000000000201e+00 -3.937500000000000000e+01 +1.139610000000000012e+00 -3.934375381469726562e+01 +1.139615000000000045e+00 -3.934375381469726562e+01 +1.139620000000000077e+00 -3.934375381469726562e+01 +1.139625000000000110e+00 -3.931250000000000000e+01 +1.139630000000000143e+00 -3.931250000000000000e+01 +1.139635000000000176e+00 -3.940625000000000000e+01 +1.139639999999999986e+00 -3.931250000000000000e+01 +1.139645000000000019e+00 -3.931250000000000000e+01 +1.139650000000000052e+00 -3.934375381469726562e+01 +1.139655000000000085e+00 -3.934375381469726562e+01 +1.139660000000000117e+00 -3.934375381469726562e+01 +1.139665000000000150e+00 -3.934375381469726562e+01 +1.139670000000000183e+00 -3.934375381469726562e+01 +1.139674999999999994e+00 -3.934375381469726562e+01 +1.139680000000000026e+00 -3.934375381469726562e+01 +1.139685000000000059e+00 -3.934375381469726562e+01 +1.139690000000000092e+00 -3.934375381469726562e+01 +1.139695000000000125e+00 -3.934375381469726562e+01 +1.139700000000000157e+00 -3.937500000000000000e+01 +1.139705000000000190e+00 -3.934375381469726562e+01 +1.139710000000000001e+00 -3.931250000000000000e+01 +1.139715000000000034e+00 -3.931250000000000000e+01 +1.139720000000000066e+00 -3.931250000000000000e+01 +1.139725000000000099e+00 -3.934375381469726562e+01 +1.139730000000000132e+00 -3.934375381469726562e+01 +1.139735000000000165e+00 -3.934375381469726562e+01 +1.139740000000000197e+00 -3.931250000000000000e+01 +1.139745000000000008e+00 -3.931250000000000000e+01 +1.139750000000000041e+00 -3.931250000000000000e+01 +1.139755000000000074e+00 -3.940625000000000000e+01 +1.139760000000000106e+00 -3.934375381469726562e+01 +1.139765000000000139e+00 -3.928125000000000000e+01 +1.139770000000000172e+00 -3.928125000000000000e+01 +1.139774999999999983e+00 -3.925000000000000000e+01 +1.139780000000000015e+00 -3.931250000000000000e+01 +1.139785000000000048e+00 -3.931250000000000000e+01 +1.139790000000000081e+00 -3.937500000000000000e+01 +1.139795000000000114e+00 -3.931250000000000000e+01 +1.139800000000000146e+00 -3.934375381469726562e+01 +1.139805000000000179e+00 -3.928125000000000000e+01 +1.139809999999999990e+00 -3.934375381469726562e+01 +1.139815000000000023e+00 -3.931250000000000000e+01 +1.139820000000000055e+00 -3.934375381469726562e+01 +1.139825000000000088e+00 -3.934375381469726562e+01 +1.139830000000000121e+00 -3.928125000000000000e+01 +1.139835000000000154e+00 -3.937500000000000000e+01 +1.139840000000000186e+00 -3.931250000000000000e+01 +1.139844999999999997e+00 -3.928125000000000000e+01 +1.139850000000000030e+00 -3.934375381469726562e+01 +1.139855000000000063e+00 -3.934375381469726562e+01 +1.139860000000000095e+00 -3.937500000000000000e+01 +1.139865000000000128e+00 -3.931250000000000000e+01 +1.139870000000000161e+00 -3.940625000000000000e+01 +1.139875000000000194e+00 -3.931250000000000000e+01 +1.139880000000000004e+00 -3.928125000000000000e+01 +1.139885000000000037e+00 -3.928125000000000000e+01 +1.139890000000000070e+00 -3.931250000000000000e+01 +1.139895000000000103e+00 -3.931250000000000000e+01 +1.139900000000000135e+00 -3.934375381469726562e+01 +1.139905000000000168e+00 -3.937500000000000000e+01 +1.139910000000000201e+00 -3.928125000000000000e+01 +1.139915000000000012e+00 -3.934375381469726562e+01 +1.139920000000000044e+00 -3.937500000000000000e+01 +1.139925000000000077e+00 -3.931250000000000000e+01 +1.139930000000000110e+00 -3.931250000000000000e+01 +1.139935000000000143e+00 -3.928125000000000000e+01 +1.139940000000000175e+00 -3.937500000000000000e+01 +1.139944999999999986e+00 -3.934375381469726562e+01 +1.139950000000000019e+00 -3.931250000000000000e+01 +1.139955000000000052e+00 -3.937500000000000000e+01 +1.139960000000000084e+00 -3.937500000000000000e+01 +1.139965000000000117e+00 -3.934375381469726562e+01 +1.139970000000000150e+00 -3.925000000000000000e+01 +1.139975000000000183e+00 -3.934375381469726562e+01 +1.139979999999999993e+00 -3.931250000000000000e+01 +1.139985000000000026e+00 -3.931250000000000000e+01 +1.139990000000000059e+00 -3.931250000000000000e+01 +1.139995000000000092e+00 -3.931250000000000000e+01 diff --git a/test/ephys/data/spike_test_pair.txt b/test/ephys/data/spike_test_pair.txt new file mode 100644 index 0000000000..c39c88e6af --- /dev/null +++ b/test/ephys/data/spike_test_pair.txt @@ -0,0 +1,4000 @@ +1.030000000000000027e+00 -4.737500000000000000e+01 +1.030005000000000059e+00 -4.737500000000000000e+01 +1.030010000000000092e+00 -4.740625381469726562e+01 +1.030015000000000125e+00 -4.737500000000000000e+01 +1.030020000000000158e+00 -4.740625381469726562e+01 +1.030025000000000190e+00 -4.737500000000000000e+01 +1.030030000000000001e+00 -4.731250000000000000e+01 +1.030035000000000034e+00 -4.740625381469726562e+01 +1.030040000000000067e+00 -4.728125381469726562e+01 +1.030045000000000099e+00 -4.734375381469726562e+01 +1.030050000000000132e+00 -4.728125381469726562e+01 +1.030055000000000165e+00 -4.737500000000000000e+01 +1.030059999999999976e+00 -4.728125381469726562e+01 +1.030065000000000008e+00 -4.731250000000000000e+01 +1.030070000000000041e+00 -4.734375381469726562e+01 +1.030075000000000074e+00 -4.721875000000000000e+01 +1.030080000000000107e+00 -4.731250000000000000e+01 +1.030085000000000139e+00 -4.731250000000000000e+01 +1.030090000000000172e+00 -4.728125381469726562e+01 +1.030094999999999983e+00 -4.721875000000000000e+01 +1.030100000000000016e+00 -4.718750381469726562e+01 +1.030105000000000048e+00 -4.721875000000000000e+01 +1.030110000000000081e+00 -4.721875000000000000e+01 +1.030115000000000114e+00 -4.728125381469726562e+01 +1.030120000000000147e+00 -4.728125381469726562e+01 +1.030125000000000179e+00 -4.721875000000000000e+01 +1.030129999999999990e+00 -4.718750381469726562e+01 +1.030135000000000023e+00 -4.715625381469726562e+01 +1.030140000000000056e+00 -4.718750381469726562e+01 +1.030145000000000088e+00 -4.721875000000000000e+01 +1.030150000000000121e+00 -4.718750381469726562e+01 +1.030155000000000154e+00 -4.715625381469726562e+01 +1.030160000000000187e+00 -4.715625381469726562e+01 +1.030164999999999997e+00 -4.712500000000000000e+01 +1.030170000000000030e+00 -4.712500000000000000e+01 +1.030175000000000063e+00 -4.712500000000000000e+01 +1.030180000000000096e+00 -4.715625381469726562e+01 +1.030185000000000128e+00 -4.709375381469726562e+01 +1.030190000000000161e+00 -4.709375381469726562e+01 +1.030195000000000194e+00 -4.712500000000000000e+01 +1.030200000000000005e+00 -4.715625381469726562e+01 +1.030205000000000037e+00 -4.703125381469726562e+01 +1.030210000000000070e+00 -4.709375381469726562e+01 +1.030215000000000103e+00 -4.706250000000000000e+01 +1.030220000000000136e+00 -4.712500000000000000e+01 +1.030225000000000168e+00 -4.709375381469726562e+01 +1.030229999999999979e+00 -4.700000381469726562e+01 +1.030235000000000012e+00 -4.706250000000000000e+01 +1.030240000000000045e+00 -4.700000381469726562e+01 +1.030245000000000077e+00 -4.703125381469726562e+01 +1.030250000000000110e+00 -4.706250000000000000e+01 +1.030255000000000143e+00 -4.700000381469726562e+01 +1.030260000000000176e+00 -4.703125381469726562e+01 +1.030264999999999986e+00 -4.703125381469726562e+01 +1.030270000000000019e+00 -4.700000381469726562e+01 +1.030275000000000052e+00 -4.700000381469726562e+01 +1.030280000000000085e+00 -4.700000381469726562e+01 +1.030285000000000117e+00 -4.703125381469726562e+01 +1.030290000000000150e+00 -4.696875000000000000e+01 +1.030295000000000183e+00 -4.696875000000000000e+01 +1.030299999999999994e+00 -4.693750381469726562e+01 +1.030305000000000026e+00 -4.693750381469726562e+01 +1.030310000000000059e+00 -4.696875000000000000e+01 +1.030315000000000092e+00 -4.696875000000000000e+01 +1.030320000000000125e+00 -4.690625000000000000e+01 +1.030325000000000157e+00 -4.693750381469726562e+01 +1.030330000000000190e+00 -4.684375381469726562e+01 +1.030335000000000001e+00 -4.687500381469726562e+01 +1.030340000000000034e+00 -4.693750381469726562e+01 +1.030345000000000066e+00 -4.693750381469726562e+01 +1.030350000000000099e+00 -4.681250000000000000e+01 +1.030355000000000132e+00 -4.687500381469726562e+01 +1.030360000000000165e+00 -4.690625000000000000e+01 +1.030364999999999975e+00 -4.690625000000000000e+01 +1.030370000000000008e+00 -4.687500381469726562e+01 +1.030375000000000041e+00 -4.684375381469726562e+01 +1.030380000000000074e+00 -4.681250000000000000e+01 +1.030385000000000106e+00 -4.684375381469726562e+01 +1.030390000000000139e+00 -4.678125381469726562e+01 +1.030395000000000172e+00 -4.687500381469726562e+01 +1.030399999999999983e+00 -4.693750381469726562e+01 +1.030405000000000015e+00 -4.678125381469726562e+01 +1.030410000000000048e+00 -4.681250000000000000e+01 +1.030415000000000081e+00 -4.684375381469726562e+01 +1.030420000000000114e+00 -4.678125381469726562e+01 +1.030425000000000146e+00 -4.684375381469726562e+01 +1.030430000000000179e+00 -4.671875381469726562e+01 +1.030434999999999990e+00 -4.675000000000000000e+01 +1.030440000000000023e+00 -4.681250000000000000e+01 +1.030445000000000055e+00 -4.671875381469726562e+01 +1.030450000000000088e+00 -4.675000000000000000e+01 +1.030455000000000121e+00 -4.675000000000000000e+01 +1.030460000000000154e+00 -4.668750381469726562e+01 +1.030465000000000186e+00 -4.675000000000000000e+01 +1.030469999999999997e+00 -4.671875381469726562e+01 +1.030475000000000030e+00 -4.678125381469726562e+01 +1.030480000000000063e+00 -4.665625000000000000e+01 +1.030485000000000095e+00 -4.668750381469726562e+01 +1.030490000000000128e+00 -4.678125381469726562e+01 +1.030495000000000161e+00 -4.671875381469726562e+01 +1.030500000000000194e+00 -4.671875381469726562e+01 +1.030505000000000004e+00 -4.681250000000000000e+01 +1.030510000000000037e+00 -4.668750381469726562e+01 +1.030515000000000070e+00 -4.675000000000000000e+01 +1.030520000000000103e+00 -4.662500381469726562e+01 +1.030525000000000135e+00 -4.668750381469726562e+01 +1.030530000000000168e+00 -4.662500381469726562e+01 +1.030534999999999979e+00 -4.662500381469726562e+01 +1.030540000000000012e+00 -4.665625000000000000e+01 +1.030545000000000044e+00 -4.668750381469726562e+01 +1.030550000000000077e+00 -4.659375000000000000e+01 +1.030555000000000110e+00 -4.662500381469726562e+01 +1.030560000000000143e+00 -4.665625000000000000e+01 +1.030565000000000175e+00 -4.659375000000000000e+01 +1.030569999999999986e+00 -4.662500381469726562e+01 +1.030575000000000019e+00 -4.671875381469726562e+01 +1.030580000000000052e+00 -4.656250381469726562e+01 +1.030585000000000084e+00 -4.665625000000000000e+01 +1.030590000000000117e+00 -4.665625000000000000e+01 +1.030595000000000150e+00 -4.656250381469726562e+01 +1.030600000000000183e+00 -4.659375000000000000e+01 +1.030604999999999993e+00 -4.659375000000000000e+01 +1.030610000000000026e+00 -4.656250381469726562e+01 +1.030615000000000059e+00 -4.659375000000000000e+01 +1.030620000000000092e+00 -4.662500381469726562e+01 +1.030625000000000124e+00 -4.662500381469726562e+01 +1.030630000000000157e+00 -4.659375000000000000e+01 +1.030635000000000190e+00 -4.653125381469726562e+01 +1.030640000000000001e+00 -4.665625000000000000e+01 +1.030645000000000033e+00 -4.656250381469726562e+01 +1.030650000000000066e+00 -4.653125381469726562e+01 +1.030655000000000099e+00 -4.650000000000000000e+01 +1.030660000000000132e+00 -4.653125381469726562e+01 +1.030665000000000164e+00 -4.653125381469726562e+01 +1.030669999999999975e+00 -4.656250381469726562e+01 +1.030675000000000008e+00 -4.653125381469726562e+01 +1.030680000000000041e+00 -4.653125381469726562e+01 +1.030685000000000073e+00 -4.653125381469726562e+01 +1.030690000000000106e+00 -4.656250381469726562e+01 +1.030695000000000139e+00 -4.650000000000000000e+01 +1.030700000000000172e+00 -4.650000000000000000e+01 +1.030704999999999982e+00 -4.650000000000000000e+01 +1.030710000000000015e+00 -4.653125381469726562e+01 +1.030715000000000048e+00 -4.646875381469726562e+01 +1.030720000000000081e+00 -4.646875381469726562e+01 +1.030725000000000113e+00 -4.650000000000000000e+01 +1.030730000000000146e+00 -4.646875381469726562e+01 +1.030735000000000179e+00 -4.643750000000000000e+01 +1.030739999999999990e+00 -4.646875381469726562e+01 +1.030745000000000022e+00 -4.643750000000000000e+01 +1.030750000000000055e+00 -4.640625000000000000e+01 +1.030755000000000088e+00 -4.643750000000000000e+01 +1.030760000000000121e+00 -4.646875381469726562e+01 +1.030765000000000153e+00 -4.640625000000000000e+01 +1.030770000000000186e+00 -4.634375000000000000e+01 +1.030774999999999997e+00 -4.646875381469726562e+01 +1.030780000000000030e+00 -4.640625000000000000e+01 +1.030785000000000062e+00 -4.646875381469726562e+01 +1.030790000000000095e+00 -4.643750000000000000e+01 +1.030795000000000128e+00 -4.643750000000000000e+01 +1.030800000000000161e+00 -4.643750000000000000e+01 +1.030805000000000193e+00 -4.634375000000000000e+01 +1.030810000000000004e+00 -4.637500381469726562e+01 +1.030815000000000037e+00 -4.634375000000000000e+01 +1.030820000000000070e+00 -4.634375000000000000e+01 +1.030825000000000102e+00 -4.634375000000000000e+01 +1.030830000000000135e+00 -4.634375000000000000e+01 +1.030835000000000168e+00 -4.637500381469726562e+01 +1.030839999999999979e+00 -4.637500381469726562e+01 +1.030845000000000011e+00 -4.631250381469726562e+01 +1.030850000000000044e+00 -4.631250381469726562e+01 +1.030855000000000077e+00 -4.628125381469726562e+01 +1.030860000000000110e+00 -4.628125381469726562e+01 +1.030865000000000142e+00 -4.631250381469726562e+01 +1.030870000000000175e+00 -4.634375000000000000e+01 +1.030874999999999986e+00 -4.628125381469726562e+01 +1.030880000000000019e+00 -4.628125381469726562e+01 +1.030885000000000051e+00 -4.625000000000000000e+01 +1.030890000000000084e+00 -4.625000000000000000e+01 +1.030895000000000117e+00 -4.621875381469726562e+01 +1.030900000000000150e+00 -4.628125381469726562e+01 +1.030905000000000182e+00 -4.621875381469726562e+01 +1.030909999999999993e+00 -4.621875381469726562e+01 +1.030915000000000026e+00 -4.625000000000000000e+01 +1.030920000000000059e+00 -4.618750000000000000e+01 +1.030925000000000091e+00 -4.618750000000000000e+01 +1.030930000000000124e+00 -4.615625381469726562e+01 +1.030935000000000157e+00 -4.625000000000000000e+01 +1.030940000000000190e+00 -4.615625381469726562e+01 +1.030945000000000000e+00 -4.618750000000000000e+01 +1.030950000000000033e+00 -4.615625381469726562e+01 +1.030955000000000066e+00 -4.609375000000000000e+01 +1.030960000000000099e+00 -4.612500381469726562e+01 +1.030965000000000131e+00 -4.609375000000000000e+01 +1.030970000000000164e+00 -4.621875381469726562e+01 +1.030974999999999975e+00 -4.609375000000000000e+01 +1.030980000000000008e+00 -4.615625381469726562e+01 +1.030985000000000040e+00 -4.609375000000000000e+01 +1.030990000000000073e+00 -4.615625381469726562e+01 +1.030995000000000106e+00 -4.606250381469726562e+01 +1.031000000000000139e+00 -4.603125000000000000e+01 +1.031005000000000171e+00 -4.609375000000000000e+01 +1.031009999999999982e+00 -4.606250381469726562e+01 +1.031015000000000015e+00 -4.606250381469726562e+01 +1.031020000000000048e+00 -4.606250381469726562e+01 +1.031025000000000080e+00 -4.609375000000000000e+01 +1.031030000000000113e+00 -4.606250381469726562e+01 +1.031035000000000146e+00 -4.600000381469726562e+01 +1.031040000000000179e+00 -4.603125000000000000e+01 +1.031044999999999989e+00 -4.606250381469726562e+01 +1.031050000000000022e+00 -4.603125000000000000e+01 +1.031055000000000055e+00 -4.606250381469726562e+01 +1.031060000000000088e+00 -4.603125000000000000e+01 +1.031065000000000120e+00 -4.603125000000000000e+01 +1.031070000000000153e+00 -4.603125000000000000e+01 +1.031075000000000186e+00 -4.603125000000000000e+01 +1.031079999999999997e+00 -4.596875381469726562e+01 +1.031085000000000029e+00 -4.603125000000000000e+01 +1.031090000000000062e+00 -4.596875381469726562e+01 +1.031095000000000095e+00 -4.593750000000000000e+01 +1.031100000000000128e+00 -4.596875381469726562e+01 +1.031105000000000160e+00 -4.600000381469726562e+01 +1.031110000000000193e+00 -4.596875381469726562e+01 +1.031115000000000004e+00 -4.596875381469726562e+01 +1.031120000000000037e+00 -4.596875381469726562e+01 +1.031125000000000069e+00 -4.593750000000000000e+01 +1.031130000000000102e+00 -4.593750000000000000e+01 +1.031135000000000135e+00 -4.596875381469726562e+01 +1.031140000000000168e+00 -4.600000381469726562e+01 +1.031144999999999978e+00 -4.593750000000000000e+01 +1.031150000000000011e+00 -4.593750000000000000e+01 +1.031155000000000044e+00 -4.590625381469726562e+01 +1.031160000000000077e+00 -4.593750000000000000e+01 +1.031165000000000109e+00 -4.593750000000000000e+01 +1.031170000000000142e+00 -4.593750000000000000e+01 +1.031175000000000175e+00 -4.590625381469726562e+01 +1.031179999999999986e+00 -4.590625381469726562e+01 +1.031185000000000018e+00 -4.590625381469726562e+01 +1.031190000000000051e+00 -4.590625381469726562e+01 +1.031195000000000084e+00 -4.584375381469726562e+01 +1.031200000000000117e+00 -4.581250381469726562e+01 +1.031205000000000149e+00 -4.584375381469726562e+01 +1.031210000000000182e+00 -4.587500000000000000e+01 +1.031214999999999993e+00 -4.584375381469726562e+01 +1.031220000000000026e+00 -4.584375381469726562e+01 +1.031225000000000058e+00 -4.584375381469726562e+01 +1.031230000000000091e+00 -4.584375381469726562e+01 +1.031235000000000124e+00 -4.584375381469726562e+01 +1.031240000000000157e+00 -4.578125000000000000e+01 +1.031245000000000189e+00 -4.571875000000000000e+01 +1.031250000000000000e+00 -4.578125000000000000e+01 +1.031255000000000033e+00 -4.581250381469726562e+01 +1.031260000000000066e+00 -4.587500000000000000e+01 +1.031265000000000098e+00 -4.578125000000000000e+01 +1.031270000000000131e+00 -4.578125000000000000e+01 +1.031275000000000164e+00 -4.581250381469726562e+01 +1.031279999999999974e+00 -4.571875000000000000e+01 +1.031285000000000007e+00 -4.581250381469726562e+01 +1.031290000000000040e+00 -4.568750000000000000e+01 +1.031295000000000073e+00 -4.571875000000000000e+01 +1.031300000000000106e+00 -4.571875000000000000e+01 +1.031305000000000138e+00 -4.565625381469726562e+01 +1.031310000000000171e+00 -4.568750000000000000e+01 +1.031314999999999982e+00 -4.565625381469726562e+01 +1.031320000000000014e+00 -4.565625381469726562e+01 +1.031325000000000047e+00 -4.568750000000000000e+01 +1.031330000000000080e+00 -4.562500000000000000e+01 +1.031335000000000113e+00 -4.562500000000000000e+01 +1.031340000000000146e+00 -4.559375381469726562e+01 +1.031345000000000178e+00 -4.568750000000000000e+01 +1.031349999999999989e+00 -4.559375381469726562e+01 +1.031355000000000022e+00 -4.559375381469726562e+01 +1.031360000000000054e+00 -4.559375381469726562e+01 +1.031365000000000087e+00 -4.556250381469726562e+01 +1.031370000000000120e+00 -4.562500000000000000e+01 +1.031375000000000153e+00 -4.559375381469726562e+01 +1.031380000000000186e+00 -4.553125000000000000e+01 +1.031384999999999996e+00 -4.553125000000000000e+01 +1.031390000000000029e+00 -4.556250381469726562e+01 +1.031395000000000062e+00 -4.553125000000000000e+01 +1.031400000000000095e+00 -4.550000381469726562e+01 +1.031405000000000127e+00 -4.550000381469726562e+01 +1.031410000000000160e+00 -4.546875000000000000e+01 +1.031415000000000193e+00 -4.550000381469726562e+01 +1.031420000000000003e+00 -4.546875000000000000e+01 +1.031425000000000036e+00 -4.546875000000000000e+01 +1.031430000000000069e+00 -4.546875000000000000e+01 +1.031435000000000102e+00 -4.546875000000000000e+01 +1.031440000000000135e+00 -4.546875000000000000e+01 +1.031445000000000167e+00 -4.546875000000000000e+01 +1.031449999999999978e+00 -4.546875000000000000e+01 +1.031455000000000011e+00 -4.550000381469726562e+01 +1.031460000000000043e+00 -4.543750381469726562e+01 +1.031465000000000076e+00 -4.543750381469726562e+01 +1.031470000000000109e+00 -4.543750381469726562e+01 +1.031475000000000142e+00 -4.540625381469726562e+01 +1.031480000000000175e+00 -4.540625381469726562e+01 +1.031484999999999985e+00 -4.534375381469726562e+01 +1.031490000000000018e+00 -4.537500000000000000e+01 +1.031495000000000051e+00 -4.534375381469726562e+01 +1.031500000000000083e+00 -4.531250000000000000e+01 +1.031505000000000116e+00 -4.534375381469726562e+01 +1.031510000000000149e+00 -4.531250000000000000e+01 +1.031515000000000182e+00 -4.531250000000000000e+01 +1.031519999999999992e+00 -4.531250000000000000e+01 +1.031525000000000025e+00 -4.534375381469726562e+01 +1.031530000000000058e+00 -4.528125381469726562e+01 +1.031535000000000091e+00 -4.528125381469726562e+01 +1.031540000000000123e+00 -4.525000381469726562e+01 +1.031545000000000156e+00 -4.518750381469726562e+01 +1.031550000000000189e+00 -4.525000381469726562e+01 +1.031555000000000000e+00 -4.515625000000000000e+01 +1.031560000000000032e+00 -4.515625000000000000e+01 +1.031565000000000065e+00 -4.521875000000000000e+01 +1.031570000000000098e+00 -4.515625000000000000e+01 +1.031575000000000131e+00 -4.515625000000000000e+01 +1.031580000000000163e+00 -4.521875000000000000e+01 +1.031584999999999974e+00 -4.525000381469726562e+01 +1.031590000000000007e+00 -4.512500381469726562e+01 +1.031595000000000040e+00 -4.525000381469726562e+01 +1.031600000000000072e+00 -4.518750381469726562e+01 +1.031605000000000105e+00 -4.521875000000000000e+01 +1.031610000000000138e+00 -4.512500381469726562e+01 +1.031615000000000171e+00 -4.515625000000000000e+01 +1.031619999999999981e+00 -4.518750381469726562e+01 +1.031625000000000014e+00 -4.515625000000000000e+01 +1.031630000000000047e+00 -4.512500381469726562e+01 +1.031635000000000080e+00 -4.515625000000000000e+01 +1.031640000000000112e+00 -4.515625000000000000e+01 +1.031645000000000145e+00 -4.512500381469726562e+01 +1.031650000000000178e+00 -4.509375381469726562e+01 +1.031654999999999989e+00 -4.512500381469726562e+01 +1.031660000000000021e+00 -4.512500381469726562e+01 +1.031665000000000054e+00 -4.500000000000000000e+01 +1.031670000000000087e+00 -4.512500381469726562e+01 +1.031675000000000120e+00 -4.506250000000000000e+01 +1.031680000000000152e+00 -4.509375381469726562e+01 +1.031685000000000185e+00 -4.506250000000000000e+01 +1.031689999999999996e+00 -4.506250000000000000e+01 +1.031695000000000029e+00 -4.503125381469726562e+01 +1.031700000000000061e+00 -4.500000000000000000e+01 +1.031705000000000094e+00 -4.496875000000000000e+01 +1.031710000000000127e+00 -4.496875000000000000e+01 +1.031715000000000160e+00 -4.500000000000000000e+01 +1.031720000000000192e+00 -4.490625000000000000e+01 +1.031725000000000003e+00 -4.496875000000000000e+01 +1.031730000000000036e+00 -4.487500381469726562e+01 +1.031735000000000069e+00 -4.496875000000000000e+01 +1.031740000000000101e+00 -4.493750381469726562e+01 +1.031745000000000134e+00 -4.493750381469726562e+01 +1.031750000000000167e+00 -4.490625000000000000e+01 +1.031754999999999978e+00 -4.496875000000000000e+01 +1.031760000000000010e+00 -4.490625000000000000e+01 +1.031765000000000043e+00 -4.487500381469726562e+01 +1.031770000000000076e+00 -4.487500381469726562e+01 +1.031775000000000109e+00 -4.490625000000000000e+01 +1.031780000000000141e+00 -4.484375381469726562e+01 +1.031785000000000174e+00 -4.481250000000000000e+01 +1.031789999999999985e+00 -4.481250000000000000e+01 +1.031795000000000018e+00 -4.481250000000000000e+01 +1.031800000000000050e+00 -4.481250000000000000e+01 +1.031805000000000083e+00 -4.478125381469726562e+01 +1.031810000000000116e+00 -4.481250000000000000e+01 +1.031815000000000149e+00 -4.478125381469726562e+01 +1.031820000000000181e+00 -4.478125381469726562e+01 +1.031824999999999992e+00 -4.481250000000000000e+01 +1.031830000000000025e+00 -4.481250000000000000e+01 +1.031835000000000058e+00 -4.478125381469726562e+01 +1.031840000000000090e+00 -4.481250000000000000e+01 +1.031845000000000123e+00 -4.478125381469726562e+01 +1.031850000000000156e+00 -4.471875381469726562e+01 +1.031855000000000189e+00 -4.471875381469726562e+01 +1.031859999999999999e+00 -4.465625000000000000e+01 +1.031865000000000032e+00 -4.471875381469726562e+01 +1.031870000000000065e+00 -4.468750381469726562e+01 +1.031875000000000098e+00 -4.468750381469726562e+01 +1.031880000000000130e+00 -4.471875381469726562e+01 +1.031885000000000163e+00 -4.465625000000000000e+01 +1.031889999999999974e+00 -4.468750381469726562e+01 +1.031895000000000007e+00 -4.468750381469726562e+01 +1.031900000000000039e+00 -4.462500381469726562e+01 +1.031905000000000072e+00 -4.465625000000000000e+01 +1.031910000000000105e+00 -4.465625000000000000e+01 +1.031915000000000138e+00 -4.462500381469726562e+01 +1.031920000000000170e+00 -4.462500381469726562e+01 +1.031924999999999981e+00 -4.465625000000000000e+01 +1.031930000000000014e+00 -4.459375000000000000e+01 +1.031935000000000047e+00 -4.456250381469726562e+01 +1.031940000000000079e+00 -4.459375000000000000e+01 +1.031945000000000112e+00 -4.465625000000000000e+01 +1.031950000000000145e+00 -4.456250381469726562e+01 +1.031955000000000178e+00 -4.462500381469726562e+01 +1.031959999999999988e+00 -4.459375000000000000e+01 +1.031965000000000021e+00 -4.459375000000000000e+01 +1.031970000000000054e+00 -4.453125381469726562e+01 +1.031975000000000087e+00 -4.462500381469726562e+01 +1.031980000000000119e+00 -4.456250381469726562e+01 +1.031985000000000152e+00 -4.453125381469726562e+01 +1.031990000000000185e+00 -4.453125381469726562e+01 +1.031994999999999996e+00 -4.453125381469726562e+01 +1.032000000000000028e+00 -4.453125381469726562e+01 +1.032005000000000061e+00 -4.450000000000000000e+01 +1.032010000000000094e+00 -4.456250381469726562e+01 +1.032015000000000127e+00 -4.450000000000000000e+01 +1.032020000000000159e+00 -4.450000000000000000e+01 +1.032025000000000192e+00 -4.450000000000000000e+01 +1.032030000000000003e+00 -4.446875381469726562e+01 +1.032035000000000036e+00 -4.443750000000000000e+01 +1.032040000000000068e+00 -4.446875381469726562e+01 +1.032045000000000101e+00 -4.450000000000000000e+01 +1.032050000000000134e+00 -4.443750000000000000e+01 +1.032055000000000167e+00 -4.443750000000000000e+01 +1.032059999999999977e+00 -4.440625381469726562e+01 +1.032065000000000010e+00 -4.446875381469726562e+01 +1.032070000000000043e+00 -4.437500381469726562e+01 +1.032075000000000076e+00 -4.437500381469726562e+01 +1.032080000000000108e+00 -4.434375000000000000e+01 +1.032085000000000141e+00 -4.437500381469726562e+01 +1.032090000000000174e+00 -4.431250381469726562e+01 +1.032094999999999985e+00 -4.431250381469726562e+01 +1.032100000000000017e+00 -4.428125000000000000e+01 +1.032105000000000050e+00 -4.428125000000000000e+01 +1.032110000000000083e+00 -4.428125000000000000e+01 +1.032115000000000116e+00 -4.428125000000000000e+01 +1.032120000000000148e+00 -4.431250381469726562e+01 +1.032125000000000181e+00 -4.425000000000000000e+01 +1.032129999999999992e+00 -4.425000000000000000e+01 +1.032135000000000025e+00 -4.418750000000000000e+01 +1.032140000000000057e+00 -4.428125000000000000e+01 +1.032145000000000090e+00 -4.418750000000000000e+01 +1.032150000000000123e+00 -4.415625381469726562e+01 +1.032155000000000156e+00 -4.415625381469726562e+01 +1.032160000000000188e+00 -4.421875381469726562e+01 +1.032164999999999999e+00 -4.415625381469726562e+01 +1.032170000000000032e+00 -4.421875381469726562e+01 +1.032175000000000065e+00 -4.412500000000000000e+01 +1.032180000000000097e+00 -4.415625381469726562e+01 +1.032185000000000130e+00 -4.412500000000000000e+01 +1.032190000000000163e+00 -4.409375000000000000e+01 +1.032194999999999974e+00 -4.412500000000000000e+01 +1.032200000000000006e+00 -4.409375000000000000e+01 +1.032205000000000039e+00 -4.406250381469726562e+01 +1.032210000000000072e+00 -4.415625381469726562e+01 +1.032215000000000105e+00 -4.415625381469726562e+01 +1.032220000000000137e+00 -4.406250381469726562e+01 +1.032225000000000170e+00 -4.409375000000000000e+01 +1.032229999999999981e+00 -4.406250381469726562e+01 +1.032235000000000014e+00 -4.403125000000000000e+01 +1.032240000000000046e+00 -4.403125000000000000e+01 +1.032245000000000079e+00 -4.406250381469726562e+01 +1.032250000000000112e+00 -4.396875381469726562e+01 +1.032255000000000145e+00 -4.403125000000000000e+01 +1.032260000000000177e+00 -4.403125000000000000e+01 +1.032264999999999988e+00 -4.400000381469726562e+01 +1.032270000000000021e+00 -4.396875381469726562e+01 +1.032275000000000054e+00 -4.400000381469726562e+01 +1.032280000000000086e+00 -4.403125000000000000e+01 +1.032285000000000119e+00 -4.393750000000000000e+01 +1.032290000000000152e+00 -4.396875381469726562e+01 +1.032295000000000185e+00 -4.396875381469726562e+01 +1.032299999999999995e+00 -4.390625381469726562e+01 +1.032305000000000028e+00 -4.396875381469726562e+01 +1.032310000000000061e+00 -4.393750000000000000e+01 +1.032315000000000094e+00 -4.384375381469726562e+01 +1.032320000000000126e+00 -4.390625381469726562e+01 +1.032325000000000159e+00 -4.381250381469726562e+01 +1.032330000000000192e+00 -4.393750000000000000e+01 +1.032335000000000003e+00 -4.390625381469726562e+01 +1.032340000000000035e+00 -4.396875381469726562e+01 +1.032345000000000068e+00 -4.390625381469726562e+01 +1.032350000000000101e+00 -4.387500000000000000e+01 +1.032355000000000134e+00 -4.390625381469726562e+01 +1.032360000000000166e+00 -4.384375381469726562e+01 +1.032364999999999977e+00 -4.387500000000000000e+01 +1.032370000000000010e+00 -4.387500000000000000e+01 +1.032375000000000043e+00 -4.387500000000000000e+01 +1.032380000000000075e+00 -4.375000381469726562e+01 +1.032385000000000108e+00 -4.381250381469726562e+01 +1.032390000000000141e+00 -4.378125000000000000e+01 +1.032395000000000174e+00 -4.381250381469726562e+01 +1.032399999999999984e+00 -4.378125000000000000e+01 +1.032405000000000017e+00 -4.381250381469726562e+01 +1.032410000000000050e+00 -4.378125000000000000e+01 +1.032415000000000083e+00 -4.378125000000000000e+01 +1.032420000000000115e+00 -4.371875000000000000e+01 +1.032425000000000148e+00 -4.375000381469726562e+01 +1.032430000000000181e+00 -4.378125000000000000e+01 +1.032434999999999992e+00 -4.371875000000000000e+01 +1.032440000000000024e+00 -4.375000381469726562e+01 +1.032445000000000057e+00 -4.375000381469726562e+01 +1.032450000000000090e+00 -4.371875000000000000e+01 +1.032455000000000123e+00 -4.375000381469726562e+01 +1.032460000000000155e+00 -4.368750381469726562e+01 +1.032465000000000188e+00 -4.371875000000000000e+01 +1.032469999999999999e+00 -4.375000381469726562e+01 +1.032475000000000032e+00 -4.368750381469726562e+01 +1.032480000000000064e+00 -4.371875000000000000e+01 +1.032485000000000097e+00 -4.368750381469726562e+01 +1.032490000000000130e+00 -4.365625381469726562e+01 +1.032495000000000163e+00 -4.368750381469726562e+01 +1.032500000000000195e+00 -4.362500000000000000e+01 +1.032505000000000006e+00 -4.362500000000000000e+01 +1.032510000000000039e+00 -4.365625381469726562e+01 +1.032515000000000072e+00 -4.362500000000000000e+01 +1.032520000000000104e+00 -4.362500000000000000e+01 +1.032525000000000137e+00 -4.359375381469726562e+01 +1.032530000000000170e+00 -4.362500000000000000e+01 +1.032534999999999981e+00 -4.362500000000000000e+01 +1.032540000000000013e+00 -4.359375381469726562e+01 +1.032545000000000046e+00 -4.362500000000000000e+01 +1.032550000000000079e+00 -4.356250000000000000e+01 +1.032555000000000112e+00 -4.362500000000000000e+01 +1.032560000000000144e+00 -4.353125000000000000e+01 +1.032565000000000177e+00 -4.359375381469726562e+01 +1.032569999999999988e+00 -4.356250000000000000e+01 +1.032575000000000021e+00 -4.359375381469726562e+01 +1.032580000000000053e+00 -4.365625381469726562e+01 +1.032585000000000086e+00 -4.359375381469726562e+01 +1.032590000000000119e+00 -4.362500000000000000e+01 +1.032595000000000152e+00 -4.353125000000000000e+01 +1.032600000000000184e+00 -4.353125000000000000e+01 +1.032604999999999995e+00 -4.356250000000000000e+01 +1.032610000000000028e+00 -4.353125000000000000e+01 +1.032615000000000061e+00 -4.356250000000000000e+01 +1.032620000000000093e+00 -4.356250000000000000e+01 +1.032625000000000126e+00 -4.353125000000000000e+01 +1.032630000000000159e+00 -4.356250000000000000e+01 +1.032635000000000192e+00 -4.356250000000000000e+01 +1.032640000000000002e+00 -4.353125000000000000e+01 +1.032645000000000035e+00 -4.359375381469726562e+01 +1.032650000000000068e+00 -4.353125000000000000e+01 +1.032655000000000101e+00 -4.350000381469726562e+01 +1.032660000000000133e+00 -4.353125000000000000e+01 +1.032665000000000166e+00 -4.353125000000000000e+01 +1.032669999999999977e+00 -4.353125000000000000e+01 +1.032675000000000010e+00 -4.353125000000000000e+01 +1.032680000000000042e+00 -4.346875000000000000e+01 +1.032685000000000075e+00 -4.350000381469726562e+01 +1.032690000000000108e+00 -4.346875000000000000e+01 +1.032695000000000141e+00 -4.343750381469726562e+01 +1.032700000000000173e+00 -4.350000381469726562e+01 +1.032704999999999984e+00 -4.343750381469726562e+01 +1.032710000000000017e+00 -4.350000381469726562e+01 +1.032715000000000050e+00 -4.350000381469726562e+01 +1.032720000000000082e+00 -4.350000381469726562e+01 +1.032725000000000115e+00 -4.346875000000000000e+01 +1.032730000000000148e+00 -4.343750381469726562e+01 +1.032735000000000181e+00 -4.346875000000000000e+01 +1.032739999999999991e+00 -4.340625000000000000e+01 +1.032745000000000024e+00 -4.337500000000000000e+01 +1.032750000000000057e+00 -4.343750381469726562e+01 +1.032755000000000090e+00 -4.337500000000000000e+01 +1.032760000000000122e+00 -4.343750381469726562e+01 +1.032765000000000155e+00 -4.340625000000000000e+01 +1.032770000000000188e+00 -4.337500000000000000e+01 +1.032774999999999999e+00 -4.340625000000000000e+01 +1.032780000000000031e+00 -4.334375381469726562e+01 +1.032785000000000064e+00 -4.340625000000000000e+01 +1.032790000000000097e+00 -4.334375381469726562e+01 +1.032795000000000130e+00 -4.331250000000000000e+01 +1.032800000000000162e+00 -4.328125381469726562e+01 +1.032805000000000195e+00 -4.328125381469726562e+01 +1.032810000000000006e+00 -4.328125381469726562e+01 +1.032815000000000039e+00 -4.328125381469726562e+01 +1.032820000000000071e+00 -4.328125381469726562e+01 +1.032825000000000104e+00 -4.328125381469726562e+01 +1.032830000000000137e+00 -4.321875000000000000e+01 +1.032835000000000170e+00 -4.321875000000000000e+01 +1.032839999999999980e+00 -4.328125381469726562e+01 +1.032845000000000013e+00 -4.328125381469726562e+01 +1.032850000000000046e+00 -4.328125381469726562e+01 +1.032855000000000079e+00 -4.325000381469726562e+01 +1.032860000000000111e+00 -4.318750381469726562e+01 +1.032865000000000144e+00 -4.321875000000000000e+01 +1.032870000000000177e+00 -4.315625000000000000e+01 +1.032874999999999988e+00 -4.312500381469726562e+01 +1.032880000000000020e+00 -4.315625000000000000e+01 +1.032885000000000053e+00 -4.321875000000000000e+01 +1.032890000000000086e+00 -4.315625000000000000e+01 +1.032895000000000119e+00 -4.321875000000000000e+01 +1.032900000000000151e+00 -4.315625000000000000e+01 +1.032905000000000184e+00 -4.315625000000000000e+01 +1.032909999999999995e+00 -4.309375381469726562e+01 +1.032915000000000028e+00 -4.318750381469726562e+01 +1.032920000000000060e+00 -4.315625000000000000e+01 +1.032925000000000093e+00 -4.309375381469726562e+01 +1.032930000000000126e+00 -4.303125381469726562e+01 +1.032935000000000159e+00 -4.309375381469726562e+01 +1.032940000000000191e+00 -4.306250000000000000e+01 +1.032945000000000002e+00 -4.303125381469726562e+01 +1.032950000000000035e+00 -4.306250000000000000e+01 +1.032955000000000068e+00 -4.300000000000000000e+01 +1.032960000000000100e+00 -4.306250000000000000e+01 +1.032965000000000133e+00 -4.300000000000000000e+01 +1.032970000000000166e+00 -4.303125381469726562e+01 +1.032974999999999977e+00 -4.303125381469726562e+01 +1.032980000000000009e+00 -4.303125381469726562e+01 +1.032985000000000042e+00 -4.303125381469726562e+01 +1.032990000000000075e+00 -4.300000000000000000e+01 +1.032995000000000108e+00 -4.300000000000000000e+01 +1.033000000000000140e+00 -4.300000000000000000e+01 +1.033005000000000173e+00 -4.300000000000000000e+01 +1.033009999999999984e+00 -4.296875381469726562e+01 +1.033015000000000017e+00 -4.296875381469726562e+01 +1.033020000000000049e+00 -4.300000000000000000e+01 +1.033025000000000082e+00 -4.296875381469726562e+01 +1.033030000000000115e+00 -4.296875381469726562e+01 +1.033035000000000148e+00 -4.303125381469726562e+01 +1.033040000000000180e+00 -4.300000000000000000e+01 +1.033044999999999991e+00 -4.300000000000000000e+01 +1.033050000000000024e+00 -4.293750381469726562e+01 +1.033055000000000057e+00 -4.290625000000000000e+01 +1.033060000000000089e+00 -4.293750381469726562e+01 +1.033065000000000122e+00 -4.296875381469726562e+01 +1.033070000000000155e+00 -4.293750381469726562e+01 +1.033075000000000188e+00 -4.300000000000000000e+01 +1.033079999999999998e+00 -4.296875381469726562e+01 +1.033085000000000031e+00 -4.290625000000000000e+01 +1.033090000000000064e+00 -4.296875381469726562e+01 +1.033095000000000097e+00 -4.293750381469726562e+01 +1.033100000000000129e+00 -4.293750381469726562e+01 +1.033105000000000162e+00 -4.293750381469726562e+01 +1.033110000000000195e+00 -4.287500381469726562e+01 +1.033115000000000006e+00 -4.287500381469726562e+01 +1.033120000000000038e+00 -4.287500381469726562e+01 +1.033125000000000071e+00 -4.287500381469726562e+01 +1.033130000000000104e+00 -4.287500381469726562e+01 +1.033135000000000137e+00 -4.287500381469726562e+01 +1.033140000000000169e+00 -4.290625000000000000e+01 +1.033144999999999980e+00 -4.284375000000000000e+01 +1.033150000000000013e+00 -4.278125381469726562e+01 +1.033155000000000046e+00 -4.278125381469726562e+01 +1.033160000000000078e+00 -4.278125381469726562e+01 +1.033165000000000111e+00 -4.278125381469726562e+01 +1.033170000000000144e+00 -4.284375000000000000e+01 +1.033175000000000177e+00 -4.278125381469726562e+01 +1.033179999999999987e+00 -4.278125381469726562e+01 +1.033185000000000020e+00 -4.271875381469726562e+01 +1.033190000000000053e+00 -4.275000000000000000e+01 +1.033195000000000086e+00 -4.281250381469726562e+01 +1.033200000000000118e+00 -4.268750000000000000e+01 +1.033205000000000151e+00 -4.275000000000000000e+01 +1.033210000000000184e+00 -4.268750000000000000e+01 +1.033214999999999995e+00 -4.271875381469726562e+01 +1.033220000000000027e+00 -4.271875381469726562e+01 +1.033225000000000060e+00 -4.265625000000000000e+01 +1.033230000000000093e+00 -4.268750000000000000e+01 +1.033235000000000126e+00 -4.268750000000000000e+01 +1.033240000000000158e+00 -4.271875381469726562e+01 +1.033245000000000191e+00 -4.262500381469726562e+01 +1.033250000000000002e+00 -4.262500381469726562e+01 +1.033255000000000035e+00 -4.265625000000000000e+01 +1.033260000000000067e+00 -4.262500381469726562e+01 +1.033265000000000100e+00 -4.265625000000000000e+01 +1.033270000000000133e+00 -4.259375000000000000e+01 +1.033275000000000166e+00 -4.265625000000000000e+01 +1.033279999999999976e+00 -4.256250381469726562e+01 +1.033285000000000009e+00 -4.253125000000000000e+01 +1.033290000000000042e+00 -4.253125000000000000e+01 +1.033295000000000075e+00 -4.256250381469726562e+01 +1.033300000000000107e+00 -4.250000000000000000e+01 +1.033305000000000140e+00 -4.246875381469726562e+01 +1.033310000000000173e+00 -4.250000000000000000e+01 +1.033314999999999984e+00 -4.250000000000000000e+01 +1.033320000000000016e+00 -4.250000000000000000e+01 +1.033325000000000049e+00 -4.250000000000000000e+01 +1.033330000000000082e+00 -4.250000000000000000e+01 +1.033335000000000115e+00 -4.240625381469726562e+01 +1.033340000000000147e+00 -4.243750000000000000e+01 +1.033345000000000180e+00 -4.243750000000000000e+01 +1.033349999999999991e+00 -4.240625381469726562e+01 +1.033355000000000024e+00 -4.243750000000000000e+01 +1.033360000000000056e+00 -4.237500381469726562e+01 +1.033365000000000089e+00 -4.234375000000000000e+01 +1.033370000000000122e+00 -4.228125000000000000e+01 +1.033375000000000155e+00 -4.237500381469726562e+01 +1.033380000000000187e+00 -4.237500381469726562e+01 +1.033384999999999998e+00 -4.240625381469726562e+01 +1.033390000000000031e+00 -4.234375000000000000e+01 +1.033395000000000064e+00 -4.234375000000000000e+01 +1.033400000000000096e+00 -4.228125000000000000e+01 +1.033405000000000129e+00 -4.240625381469726562e+01 +1.033410000000000162e+00 -4.228125000000000000e+01 +1.033415000000000195e+00 -4.225000381469726562e+01 +1.033420000000000005e+00 -4.225000381469726562e+01 +1.033425000000000038e+00 -4.225000381469726562e+01 +1.033430000000000071e+00 -4.228125000000000000e+01 +1.033435000000000104e+00 -4.225000381469726562e+01 +1.033440000000000136e+00 -4.228125000000000000e+01 +1.033445000000000169e+00 -4.218750000000000000e+01 +1.033449999999999980e+00 -4.221875381469726562e+01 +1.033455000000000013e+00 -4.212500000000000000e+01 +1.033460000000000045e+00 -4.221875381469726562e+01 +1.033465000000000078e+00 -4.215625381469726562e+01 +1.033470000000000111e+00 -4.212500000000000000e+01 +1.033475000000000144e+00 -4.206250381469726562e+01 +1.033480000000000176e+00 -4.206250381469726562e+01 +1.033484999999999987e+00 -4.209375381469726562e+01 +1.033490000000000020e+00 -4.209375381469726562e+01 +1.033495000000000053e+00 -4.206250381469726562e+01 +1.033500000000000085e+00 -4.200000381469726562e+01 +1.033505000000000118e+00 -4.203125000000000000e+01 +1.033510000000000151e+00 -4.200000381469726562e+01 +1.033515000000000184e+00 -4.203125000000000000e+01 +1.033519999999999994e+00 -4.206250381469726562e+01 +1.033525000000000027e+00 -4.196875000000000000e+01 +1.033530000000000060e+00 -4.200000381469726562e+01 +1.033535000000000093e+00 -4.200000381469726562e+01 +1.033540000000000125e+00 -4.200000381469726562e+01 +1.033545000000000158e+00 -4.190625381469726562e+01 +1.033550000000000191e+00 -4.193750000000000000e+01 +1.033555000000000001e+00 -4.190625381469726562e+01 +1.033560000000000034e+00 -4.187500000000000000e+01 +1.033565000000000067e+00 -4.181250000000000000e+01 +1.033570000000000100e+00 -4.178125000000000000e+01 +1.033575000000000133e+00 -4.184375381469726562e+01 +1.033580000000000165e+00 -4.178125000000000000e+01 +1.033584999999999976e+00 -4.181250000000000000e+01 +1.033590000000000009e+00 -4.181250000000000000e+01 +1.033595000000000041e+00 -4.171875000000000000e+01 +1.033600000000000074e+00 -4.165625381469726562e+01 +1.033605000000000107e+00 -4.162500000000000000e+01 +1.033610000000000140e+00 -4.165625381469726562e+01 +1.033615000000000173e+00 -4.165625381469726562e+01 +1.033619999999999983e+00 -4.159375381469726562e+01 +1.033625000000000016e+00 -4.153125381469726562e+01 +1.033630000000000049e+00 -4.150000381469726562e+01 +1.033635000000000081e+00 -4.146875000000000000e+01 +1.033640000000000114e+00 -4.143750381469726562e+01 +1.033645000000000147e+00 -4.137500381469726562e+01 +1.033650000000000180e+00 -4.131250000000000000e+01 +1.033654999999999990e+00 -4.121875000000000000e+01 +1.033660000000000023e+00 -4.112500381469726562e+01 +1.033665000000000056e+00 -4.093750381469726562e+01 +1.033670000000000089e+00 -4.087500381469726562e+01 +1.033675000000000122e+00 -4.065625381469726562e+01 +1.033680000000000154e+00 -4.040625381469726562e+01 +1.033685000000000187e+00 -4.025000381469726562e+01 +1.033689999999999998e+00 -3.987500000000000000e+01 +1.033695000000000030e+00 -3.962500000000000000e+01 +1.033700000000000063e+00 -3.918750381469726562e+01 +1.033705000000000096e+00 -3.903125381469726562e+01 +1.033710000000000129e+00 -3.856250381469726562e+01 +1.033715000000000162e+00 -3.815625381469726562e+01 +1.033720000000000194e+00 -3.775000381469726562e+01 +1.033725000000000005e+00 -3.737500381469726562e+01 +1.033730000000000038e+00 -3.687500381469726562e+01 +1.033735000000000070e+00 -3.643750000000000000e+01 +1.033740000000000103e+00 -3.600000381469726562e+01 +1.033745000000000136e+00 -3.550000000000000000e+01 +1.033750000000000169e+00 -3.496875381469726562e+01 +1.033754999999999979e+00 -3.443750000000000000e+01 +1.033760000000000012e+00 -3.390625000000000000e+01 +1.033765000000000045e+00 -3.334375000000000000e+01 +1.033770000000000078e+00 -3.278125000000000000e+01 +1.033775000000000110e+00 -3.228125000000000000e+01 +1.033780000000000143e+00 -3.165625000000000000e+01 +1.033785000000000176e+00 -3.109375190734863281e+01 +1.033789999999999987e+00 -3.043750190734863281e+01 +1.033795000000000019e+00 -2.978125190734863281e+01 +1.033800000000000052e+00 -2.915625000000000000e+01 +1.033805000000000085e+00 -2.843750000000000000e+01 +1.033810000000000118e+00 -2.765625190734863281e+01 +1.033815000000000150e+00 -2.684375000000000000e+01 +1.033820000000000183e+00 -2.609375190734863281e+01 +1.033824999999999994e+00 -2.518750190734863281e+01 +1.033830000000000027e+00 -2.428125000000000000e+01 +1.033835000000000059e+00 -2.325000000000000000e+01 +1.033840000000000092e+00 -2.228125190734863281e+01 +1.033845000000000125e+00 -2.121875000000000000e+01 +1.033850000000000158e+00 -2.003125190734863281e+01 +1.033855000000000190e+00 -1.878125000000000000e+01 +1.033860000000000001e+00 -1.750000000000000000e+01 +1.033865000000000034e+00 -1.628125000000000000e+01 +1.033870000000000067e+00 -1.496875095367431641e+01 +1.033875000000000099e+00 -1.356250000000000000e+01 +1.033880000000000132e+00 -1.221875095367431641e+01 +1.033885000000000165e+00 -1.071875095367431641e+01 +1.033889999999999976e+00 -9.375000000000000000e+00 +1.033895000000000008e+00 -8.093750000000000000e+00 +1.033900000000000041e+00 -6.593750476837158203e+00 +1.033905000000000074e+00 -5.375000000000000000e+00 +1.033910000000000107e+00 -3.968750238418579102e+00 +1.033915000000000139e+00 -2.687500000000000000e+00 +1.033920000000000172e+00 -1.375000119209289551e+00 +1.033924999999999983e+00 -2.187500000000000000e-01 +1.033930000000000016e+00 1.031250000000000000e+00 +1.033935000000000048e+00 2.218750000000000000e+00 +1.033940000000000081e+00 3.375000000000000000e+00 +1.033945000000000114e+00 4.500000476837158203e+00 +1.033950000000000147e+00 5.500000476837158203e+00 +1.033955000000000179e+00 6.500000000000000000e+00 +1.033959999999999990e+00 7.468750000000000000e+00 +1.033965000000000023e+00 8.375000000000000000e+00 +1.033970000000000056e+00 9.250000000000000000e+00 +1.033975000000000088e+00 1.009375000000000000e+01 +1.033980000000000121e+00 1.087500095367431641e+01 +1.033985000000000154e+00 1.162500000000000000e+01 +1.033990000000000187e+00 1.234375000000000000e+01 +1.033994999999999997e+00 1.296875095367431641e+01 +1.034000000000000030e+00 1.350000000000000000e+01 +1.034005000000000063e+00 1.406250095367431641e+01 +1.034010000000000096e+00 1.450000095367431641e+01 +1.034015000000000128e+00 1.493750000000000000e+01 +1.034020000000000161e+00 1.537500000000000000e+01 +1.034025000000000194e+00 1.571875095367431641e+01 +1.034030000000000005e+00 1.600000000000000000e+01 +1.034035000000000037e+00 1.631250000000000000e+01 +1.034040000000000070e+00 1.653125190734863281e+01 +1.034045000000000103e+00 1.668750190734863281e+01 +1.034050000000000136e+00 1.687500000000000000e+01 +1.034055000000000168e+00 1.693750190734863281e+01 +1.034059999999999979e+00 1.703125000000000000e+01 +1.034065000000000012e+00 1.700000000000000000e+01 +1.034070000000000045e+00 1.703125000000000000e+01 +1.034075000000000077e+00 1.700000000000000000e+01 +1.034080000000000110e+00 1.690625000000000000e+01 +1.034085000000000143e+00 1.678125000000000000e+01 +1.034090000000000176e+00 1.662500000000000000e+01 +1.034094999999999986e+00 1.637500190734863281e+01 +1.034100000000000019e+00 1.625000190734863281e+01 +1.034105000000000052e+00 1.600000000000000000e+01 +1.034110000000000085e+00 1.565625190734863281e+01 +1.034115000000000117e+00 1.543750095367431641e+01 +1.034120000000000150e+00 1.512500095367431641e+01 +1.034125000000000183e+00 1.478125095367431641e+01 +1.034129999999999994e+00 1.437500000000000000e+01 +1.034135000000000026e+00 1.403125095367431641e+01 +1.034140000000000059e+00 1.359375095367431641e+01 +1.034145000000000092e+00 1.325000095367431641e+01 +1.034150000000000125e+00 1.271875000000000000e+01 +1.034155000000000157e+00 1.231250095367431641e+01 +1.034160000000000190e+00 1.181250095367431641e+01 +1.034165000000000001e+00 1.131250095367431641e+01 +1.034170000000000034e+00 1.081250095367431641e+01 +1.034175000000000066e+00 1.025000000000000000e+01 +1.034180000000000099e+00 9.781250953674316406e+00 +1.034185000000000132e+00 9.156250000000000000e+00 +1.034190000000000165e+00 8.531250000000000000e+00 +1.034194999999999975e+00 8.031250000000000000e+00 +1.034200000000000008e+00 7.500000476837158203e+00 +1.034205000000000041e+00 6.843750476837158203e+00 +1.034210000000000074e+00 6.218750476837158203e+00 +1.034215000000000106e+00 5.500000476837158203e+00 +1.034220000000000139e+00 4.937500000000000000e+00 +1.034225000000000172e+00 4.250000000000000000e+00 +1.034229999999999983e+00 3.562500238418579102e+00 +1.034235000000000015e+00 2.906250000000000000e+00 +1.034240000000000048e+00 2.218750000000000000e+00 +1.034245000000000081e+00 1.531250119209289551e+00 +1.034250000000000114e+00 7.812500000000000000e-01 +1.034255000000000146e+00 9.375000000000000000e-02 +1.034260000000000179e+00 -5.937500596046447754e-01 +1.034264999999999990e+00 -1.312500119209289551e+00 +1.034270000000000023e+00 -2.031250238418579102e+00 +1.034275000000000055e+00 -2.812500000000000000e+00 +1.034280000000000088e+00 -3.531250238418579102e+00 +1.034285000000000121e+00 -4.281250476837158203e+00 +1.034290000000000154e+00 -5.000000476837158203e+00 +1.034295000000000186e+00 -5.812500000000000000e+00 +1.034299999999999997e+00 -6.593750476837158203e+00 +1.034305000000000030e+00 -7.312500476837158203e+00 +1.034310000000000063e+00 -8.093750000000000000e+00 +1.034315000000000095e+00 -8.843750953674316406e+00 +1.034320000000000128e+00 -9.656250000000000000e+00 +1.034325000000000161e+00 -1.040625000000000000e+01 +1.034330000000000194e+00 -1.106250000000000000e+01 +1.034335000000000004e+00 -1.190625000000000000e+01 +1.034340000000000037e+00 -1.265625095367431641e+01 +1.034345000000000070e+00 -1.346875095367431641e+01 +1.034350000000000103e+00 -1.418750095367431641e+01 +1.034355000000000135e+00 -1.493750000000000000e+01 +1.034360000000000168e+00 -1.565625190734863281e+01 +1.034364999999999979e+00 -1.631250000000000000e+01 +1.034370000000000012e+00 -1.706250000000000000e+01 +1.034375000000000044e+00 -1.778125000000000000e+01 +1.034380000000000077e+00 -1.850000000000000000e+01 +1.034385000000000110e+00 -1.918750000000000000e+01 +1.034390000000000143e+00 -1.987500190734863281e+01 +1.034395000000000175e+00 -2.059375190734863281e+01 +1.034399999999999986e+00 -2.121875000000000000e+01 +1.034405000000000019e+00 -2.193750000000000000e+01 +1.034410000000000052e+00 -2.262500190734863281e+01 +1.034415000000000084e+00 -2.321875000000000000e+01 +1.034420000000000117e+00 -2.387500190734863281e+01 +1.034425000000000150e+00 -2.450000190734863281e+01 +1.034430000000000183e+00 -2.512500000000000000e+01 +1.034434999999999993e+00 -2.578125190734863281e+01 +1.034440000000000026e+00 -2.637500190734863281e+01 +1.034445000000000059e+00 -2.700000000000000000e+01 +1.034450000000000092e+00 -2.753125190734863281e+01 +1.034455000000000124e+00 -2.818750190734863281e+01 +1.034460000000000157e+00 -2.875000000000000000e+01 +1.034465000000000190e+00 -2.931250000000000000e+01 +1.034470000000000001e+00 -2.987500000000000000e+01 +1.034475000000000033e+00 -3.043750190734863281e+01 +1.034480000000000066e+00 -3.093750190734863281e+01 +1.034485000000000099e+00 -3.143750190734863281e+01 +1.034490000000000132e+00 -3.203125381469726562e+01 +1.034495000000000164e+00 -3.246875000000000000e+01 +1.034499999999999975e+00 -3.293750000000000000e+01 +1.034505000000000008e+00 -3.350000000000000000e+01 +1.034510000000000041e+00 -3.403125381469726562e+01 +1.034515000000000073e+00 -3.450000381469726562e+01 +1.034520000000000106e+00 -3.487500000000000000e+01 +1.034525000000000139e+00 -3.543750381469726562e+01 +1.034530000000000172e+00 -3.587500000000000000e+01 +1.034534999999999982e+00 -3.631250000000000000e+01 +1.034540000000000015e+00 -3.681250381469726562e+01 +1.034545000000000048e+00 -3.725000000000000000e+01 +1.034550000000000081e+00 -3.762500381469726562e+01 +1.034555000000000113e+00 -3.806250000000000000e+01 +1.034560000000000146e+00 -3.843750000000000000e+01 +1.034565000000000179e+00 -3.890625000000000000e+01 +1.034569999999999990e+00 -3.925000000000000000e+01 +1.034575000000000022e+00 -3.962500000000000000e+01 +1.034580000000000055e+00 -4.003125000000000000e+01 +1.034585000000000088e+00 -4.037500000000000000e+01 +1.034590000000000121e+00 -4.081250381469726562e+01 +1.034595000000000153e+00 -4.109375000000000000e+01 +1.034600000000000186e+00 -4.150000381469726562e+01 +1.034604999999999997e+00 -4.178125000000000000e+01 +1.034610000000000030e+00 -4.212500000000000000e+01 +1.034615000000000062e+00 -4.250000000000000000e+01 +1.034620000000000095e+00 -4.275000000000000000e+01 +1.034625000000000128e+00 -4.306250000000000000e+01 +1.034630000000000161e+00 -4.346875000000000000e+01 +1.034635000000000193e+00 -4.375000381469726562e+01 +1.034640000000000004e+00 -4.406250381469726562e+01 +1.034645000000000037e+00 -4.431250381469726562e+01 +1.034650000000000070e+00 -4.465625000000000000e+01 +1.034655000000000102e+00 -4.490625000000000000e+01 +1.034660000000000135e+00 -4.521875000000000000e+01 +1.034665000000000168e+00 -4.550000381469726562e+01 +1.034669999999999979e+00 -4.568750000000000000e+01 +1.034675000000000011e+00 -4.600000381469726562e+01 +1.034680000000000044e+00 -4.621875381469726562e+01 +1.034685000000000077e+00 -4.650000000000000000e+01 +1.034690000000000110e+00 -4.671875381469726562e+01 +1.034695000000000142e+00 -4.696875000000000000e+01 +1.034700000000000175e+00 -4.709375381469726562e+01 +1.034704999999999986e+00 -4.746875000000000000e+01 +1.034710000000000019e+00 -4.765625381469726562e+01 +1.034715000000000051e+00 -4.784375000000000000e+01 +1.034720000000000084e+00 -4.809375000000000000e+01 +1.034725000000000117e+00 -4.834375000000000000e+01 +1.034730000000000150e+00 -4.843750381469726562e+01 +1.034735000000000182e+00 -4.862500381469726562e+01 +1.034739999999999993e+00 -4.890625000000000000e+01 +1.034745000000000026e+00 -4.903125381469726562e+01 +1.034750000000000059e+00 -4.918750381469726562e+01 +1.034755000000000091e+00 -4.946875381469726562e+01 +1.034760000000000124e+00 -4.965625381469726562e+01 +1.034765000000000157e+00 -4.975000381469726562e+01 +1.034770000000000190e+00 -5.003125381469726562e+01 +1.034775000000000000e+00 -5.015625000000000000e+01 +1.034780000000000033e+00 -5.021875381469726562e+01 +1.034785000000000066e+00 -5.040625000000000000e+01 +1.034790000000000099e+00 -5.056250000000000000e+01 +1.034795000000000131e+00 -5.068750381469726562e+01 +1.034800000000000164e+00 -5.084375381469726562e+01 +1.034804999999999975e+00 -5.100000381469726562e+01 +1.034810000000000008e+00 -5.115625381469726562e+01 +1.034815000000000040e+00 -5.131250381469726562e+01 +1.034820000000000073e+00 -5.153125000000000000e+01 +1.034825000000000106e+00 -5.159375000000000000e+01 +1.034830000000000139e+00 -5.175000381469726562e+01 +1.034835000000000171e+00 -5.190625381469726562e+01 +1.034839999999999982e+00 -5.196875381469726562e+01 +1.034845000000000015e+00 -5.218750381469726562e+01 +1.034850000000000048e+00 -5.218750381469726562e+01 +1.034855000000000080e+00 -5.240625000000000000e+01 +1.034860000000000113e+00 -5.250000381469726562e+01 +1.034865000000000146e+00 -5.253125381469726562e+01 +1.034870000000000179e+00 -5.271875000000000000e+01 +1.034874999999999989e+00 -5.281250000000000000e+01 +1.034880000000000022e+00 -5.293750381469726562e+01 +1.034885000000000055e+00 -5.303125000000000000e+01 +1.034890000000000088e+00 -5.318750000000000000e+01 +1.034895000000000120e+00 -5.331250381469726562e+01 +1.034900000000000153e+00 -5.334375381469726562e+01 +1.034905000000000186e+00 -5.337500381469726562e+01 +1.034909999999999997e+00 -5.359375000000000000e+01 +1.034915000000000029e+00 -5.362500381469726562e+01 +1.034920000000000062e+00 -5.375000000000000000e+01 +1.034925000000000095e+00 -5.381250381469726562e+01 +1.034930000000000128e+00 -5.384375000000000000e+01 +1.034935000000000160e+00 -5.396875381469726562e+01 +1.034940000000000193e+00 -5.406250381469726562e+01 +1.034945000000000004e+00 -5.415625000000000000e+01 +1.034950000000000037e+00 -5.431250000000000000e+01 +1.034955000000000069e+00 -5.428125381469726562e+01 +1.034960000000000102e+00 -5.434375381469726562e+01 +1.034965000000000135e+00 -5.443750381469726562e+01 +1.034970000000000168e+00 -5.453125381469726562e+01 +1.034974999999999978e+00 -5.462500000000000000e+01 +1.034980000000000011e+00 -5.468750381469726562e+01 +1.034985000000000044e+00 -5.475000381469726562e+01 +1.034990000000000077e+00 -5.478125381469726562e+01 +1.034995000000000109e+00 -5.487500000000000000e+01 +1.035000000000000142e+00 -5.490625381469726562e+01 +1.035005000000000175e+00 -5.500000381469726562e+01 +1.035009999999999986e+00 -5.500000381469726562e+01 +1.035015000000000018e+00 -5.506250381469726562e+01 +1.035020000000000051e+00 -5.509375381469726562e+01 +1.035025000000000084e+00 -5.515625381469726562e+01 +1.035030000000000117e+00 -5.525000381469726562e+01 +1.035035000000000149e+00 -5.528125000000000000e+01 +1.035040000000000182e+00 -5.534375000000000000e+01 +1.035044999999999993e+00 -5.540625381469726562e+01 +1.035050000000000026e+00 -5.540625381469726562e+01 +1.035055000000000058e+00 -5.543750000000000000e+01 +1.035060000000000091e+00 -5.550000381469726562e+01 +1.035065000000000124e+00 -5.556250381469726562e+01 +1.035070000000000157e+00 -5.562500381469726562e+01 +1.035075000000000189e+00 -5.568750381469726562e+01 +1.035080000000000000e+00 -5.568750381469726562e+01 +1.035085000000000033e+00 -5.575000000000000000e+01 +1.035090000000000066e+00 -5.578125381469726562e+01 +1.035095000000000098e+00 -5.590625000000000000e+01 +1.035100000000000131e+00 -5.584375000000000000e+01 +1.035105000000000164e+00 -5.587500381469726562e+01 +1.035109999999999975e+00 -5.593750381469726562e+01 +1.035115000000000007e+00 -5.600000000000000000e+01 +1.035120000000000040e+00 -5.593750381469726562e+01 +1.035125000000000073e+00 -5.606250000000000000e+01 +1.035130000000000106e+00 -5.615625000000000000e+01 +1.035135000000000138e+00 -5.615625000000000000e+01 +1.035140000000000171e+00 -5.615625000000000000e+01 +1.035144999999999982e+00 -5.615625000000000000e+01 +1.035150000000000015e+00 -5.615625000000000000e+01 +1.035155000000000047e+00 -5.618750381469726562e+01 +1.035160000000000080e+00 -5.625000381469726562e+01 +1.035165000000000113e+00 -5.628125381469726562e+01 +1.035170000000000146e+00 -5.628125381469726562e+01 +1.035175000000000178e+00 -5.631250000000000000e+01 +1.035179999999999989e+00 -5.628125381469726562e+01 +1.035185000000000022e+00 -5.634375381469726562e+01 +1.035190000000000055e+00 -5.643750381469726562e+01 +1.035195000000000087e+00 -5.643750381469726562e+01 +1.035200000000000120e+00 -5.643750381469726562e+01 +1.035205000000000153e+00 -5.650000381469726562e+01 +1.035210000000000186e+00 -5.650000381469726562e+01 +1.035214999999999996e+00 -5.653125381469726562e+01 +1.035220000000000029e+00 -5.650000381469726562e+01 +1.035225000000000062e+00 -5.653125381469726562e+01 +1.035230000000000095e+00 -5.659375381469726562e+01 +1.035235000000000127e+00 -5.653125381469726562e+01 +1.035240000000000160e+00 -5.656250381469726562e+01 +1.035245000000000193e+00 -5.659375381469726562e+01 +1.035250000000000004e+00 -5.659375381469726562e+01 +1.035255000000000036e+00 -5.659375381469726562e+01 +1.035260000000000069e+00 -5.665625381469726562e+01 +1.035265000000000102e+00 -5.675000381469726562e+01 +1.035270000000000135e+00 -5.668750381469726562e+01 +1.035275000000000167e+00 -5.665625381469726562e+01 +1.035279999999999978e+00 -5.675000381469726562e+01 +1.035285000000000011e+00 -5.675000381469726562e+01 +1.035290000000000044e+00 -5.678125000000000000e+01 +1.035295000000000076e+00 -5.675000381469726562e+01 +1.035300000000000109e+00 -5.684375381469726562e+01 +1.035305000000000142e+00 -5.678125000000000000e+01 +1.035310000000000175e+00 -5.681250381469726562e+01 +1.035314999999999985e+00 -5.684375381469726562e+01 +1.035320000000000018e+00 -5.684375381469726562e+01 +1.035325000000000051e+00 -5.687500000000000000e+01 +1.035330000000000084e+00 -5.681250381469726562e+01 +1.035335000000000116e+00 -5.681250381469726562e+01 +1.035340000000000149e+00 -5.681250381469726562e+01 +1.035345000000000182e+00 -5.684375381469726562e+01 +1.035349999999999993e+00 -5.690625381469726562e+01 +1.035355000000000025e+00 -5.684375381469726562e+01 +1.035360000000000058e+00 -5.690625381469726562e+01 +1.035365000000000091e+00 -5.687500000000000000e+01 +1.035370000000000124e+00 -5.687500000000000000e+01 +1.035375000000000156e+00 -5.690625381469726562e+01 +1.035380000000000189e+00 -5.690625381469726562e+01 +1.035385000000000000e+00 -5.693750381469726562e+01 +1.035390000000000033e+00 -5.693750381469726562e+01 +1.035395000000000065e+00 -5.693750381469726562e+01 +1.035400000000000098e+00 -5.684375381469726562e+01 +1.035405000000000131e+00 -5.693750381469726562e+01 +1.035410000000000164e+00 -5.684375381469726562e+01 +1.035414999999999974e+00 -5.690625381469726562e+01 +1.035420000000000007e+00 -5.687500000000000000e+01 +1.035425000000000040e+00 -5.690625381469726562e+01 +1.035430000000000073e+00 -5.693750381469726562e+01 +1.035435000000000105e+00 -5.693750381469726562e+01 +1.035440000000000138e+00 -5.690625381469726562e+01 +1.035445000000000171e+00 -5.696875381469726562e+01 +1.035449999999999982e+00 -5.693750381469726562e+01 +1.035455000000000014e+00 -5.690625381469726562e+01 +1.035460000000000047e+00 -5.690625381469726562e+01 +1.035465000000000080e+00 -5.693750381469726562e+01 +1.035470000000000113e+00 -5.690625381469726562e+01 +1.035475000000000145e+00 -5.693750381469726562e+01 +1.035480000000000178e+00 -5.684375381469726562e+01 +1.035484999999999989e+00 -5.687500000000000000e+01 +1.035490000000000022e+00 -5.684375381469726562e+01 +1.035495000000000054e+00 -5.690625381469726562e+01 +1.035500000000000087e+00 -5.690625381469726562e+01 +1.035505000000000120e+00 -5.684375381469726562e+01 +1.035510000000000153e+00 -5.687500000000000000e+01 +1.035515000000000185e+00 -5.690625381469726562e+01 +1.035519999999999996e+00 -5.687500000000000000e+01 +1.035525000000000029e+00 -5.684375381469726562e+01 +1.035530000000000062e+00 -5.693750381469726562e+01 +1.035535000000000094e+00 -5.678125000000000000e+01 +1.035540000000000127e+00 -5.684375381469726562e+01 +1.035545000000000160e+00 -5.687500000000000000e+01 +1.035550000000000193e+00 -5.684375381469726562e+01 +1.035555000000000003e+00 -5.684375381469726562e+01 +1.035560000000000036e+00 -5.678125000000000000e+01 +1.035565000000000069e+00 -5.681250381469726562e+01 +1.035570000000000102e+00 -5.678125000000000000e+01 +1.035575000000000134e+00 -5.681250381469726562e+01 +1.035580000000000167e+00 -5.671875000000000000e+01 +1.035584999999999978e+00 -5.675000381469726562e+01 +1.035590000000000011e+00 -5.671875000000000000e+01 +1.035595000000000043e+00 -5.678125000000000000e+01 +1.035600000000000076e+00 -5.675000381469726562e+01 +1.035605000000000109e+00 -5.671875000000000000e+01 +1.035610000000000142e+00 -5.675000381469726562e+01 +1.035615000000000174e+00 -5.668750381469726562e+01 +1.035619999999999985e+00 -5.668750381469726562e+01 +1.035625000000000018e+00 -5.665625381469726562e+01 +1.035630000000000051e+00 -5.668750381469726562e+01 +1.035635000000000083e+00 -5.668750381469726562e+01 +1.035640000000000116e+00 -5.665625381469726562e+01 +1.035645000000000149e+00 -5.668750381469726562e+01 +1.035650000000000182e+00 -5.659375381469726562e+01 +1.035654999999999992e+00 -5.662500000000000000e+01 +1.035660000000000025e+00 -5.656250381469726562e+01 +1.035665000000000058e+00 -5.665625381469726562e+01 +1.035670000000000091e+00 -5.659375381469726562e+01 +1.035675000000000123e+00 -5.653125381469726562e+01 +1.035680000000000156e+00 -5.653125381469726562e+01 +1.035685000000000189e+00 -5.653125381469726562e+01 +1.035690000000000000e+00 -5.653125381469726562e+01 +1.035695000000000032e+00 -5.653125381469726562e+01 +1.035700000000000065e+00 -5.653125381469726562e+01 +1.035705000000000098e+00 -5.656250381469726562e+01 +1.035710000000000131e+00 -5.653125381469726562e+01 +1.035715000000000163e+00 -5.646875000000000000e+01 +1.035719999999999974e+00 -5.650000381469726562e+01 +1.035725000000000007e+00 -5.650000381469726562e+01 +1.035730000000000040e+00 -5.646875000000000000e+01 +1.035735000000000072e+00 -5.650000381469726562e+01 +1.035740000000000105e+00 -5.637500381469726562e+01 +1.035745000000000138e+00 -5.643750381469726562e+01 +1.035750000000000171e+00 -5.640625381469726562e+01 +1.035754999999999981e+00 -5.646875000000000000e+01 +1.035760000000000014e+00 -5.646875000000000000e+01 +1.035765000000000047e+00 -5.640625381469726562e+01 +1.035770000000000080e+00 -5.646875000000000000e+01 +1.035775000000000112e+00 -5.634375381469726562e+01 +1.035780000000000145e+00 -5.631250000000000000e+01 +1.035785000000000178e+00 -5.637500381469726562e+01 +1.035789999999999988e+00 -5.631250000000000000e+01 +1.035795000000000021e+00 -5.634375381469726562e+01 +1.035800000000000054e+00 -5.634375381469726562e+01 +1.035805000000000087e+00 -5.621875381469726562e+01 +1.035810000000000120e+00 -5.628125381469726562e+01 +1.035815000000000152e+00 -5.628125381469726562e+01 +1.035820000000000185e+00 -5.618750381469726562e+01 +1.035824999999999996e+00 -5.625000381469726562e+01 +1.035830000000000028e+00 -5.615625000000000000e+01 +1.035835000000000061e+00 -5.618750381469726562e+01 +1.035840000000000094e+00 -5.615625000000000000e+01 +1.035845000000000127e+00 -5.625000381469726562e+01 +1.035850000000000160e+00 -5.615625000000000000e+01 +1.035855000000000192e+00 -5.609375381469726562e+01 +1.035860000000000003e+00 -5.612500381469726562e+01 +1.035865000000000036e+00 -5.612500381469726562e+01 +1.035870000000000068e+00 -5.609375381469726562e+01 +1.035875000000000101e+00 -5.606250000000000000e+01 +1.035880000000000134e+00 -5.612500381469726562e+01 +1.035885000000000167e+00 -5.609375381469726562e+01 +1.035889999999999977e+00 -5.600000000000000000e+01 +1.035895000000000010e+00 -5.600000000000000000e+01 +1.035900000000000043e+00 -5.596875381469726562e+01 +1.035905000000000076e+00 -5.606250000000000000e+01 +1.035910000000000108e+00 -5.596875381469726562e+01 +1.035915000000000141e+00 -5.593750381469726562e+01 +1.035920000000000174e+00 -5.587500381469726562e+01 +1.035924999999999985e+00 -5.593750381469726562e+01 +1.035930000000000017e+00 -5.593750381469726562e+01 +1.035935000000000050e+00 -5.590625000000000000e+01 +1.035940000000000083e+00 -5.590625000000000000e+01 +1.035945000000000116e+00 -5.590625000000000000e+01 +1.035950000000000149e+00 -5.590625000000000000e+01 +1.035955000000000181e+00 -5.581250381469726562e+01 +1.035959999999999992e+00 -5.581250381469726562e+01 +1.035965000000000025e+00 -5.578125381469726562e+01 +1.035970000000000057e+00 -5.581250381469726562e+01 +1.035975000000000090e+00 -5.581250381469726562e+01 +1.035980000000000123e+00 -5.584375000000000000e+01 +1.035985000000000156e+00 -5.571875381469726562e+01 +1.035990000000000189e+00 -5.575000000000000000e+01 +1.035994999999999999e+00 -5.581250381469726562e+01 +1.036000000000000032e+00 -5.581250381469726562e+01 +1.036005000000000065e+00 -5.565625381469726562e+01 +1.036010000000000097e+00 -5.568750381469726562e+01 +1.036015000000000130e+00 -5.568750381469726562e+01 +1.036020000000000163e+00 -5.568750381469726562e+01 +1.036025000000000196e+00 -5.565625381469726562e+01 +1.036030000000000006e+00 -5.568750381469726562e+01 +1.036035000000000039e+00 -5.565625381469726562e+01 +1.036040000000000072e+00 -5.562500381469726562e+01 +1.036045000000000105e+00 -5.562500381469726562e+01 +1.036050000000000137e+00 -5.559375000000000000e+01 +1.036055000000000170e+00 -5.565625381469726562e+01 +1.036059999999999981e+00 -5.562500381469726562e+01 +1.036065000000000014e+00 -5.559375000000000000e+01 +1.036070000000000046e+00 -5.550000381469726562e+01 +1.036075000000000079e+00 -5.556250381469726562e+01 +1.036080000000000112e+00 -5.553125381469726562e+01 +1.036085000000000145e+00 -5.550000381469726562e+01 +1.036090000000000177e+00 -5.553125381469726562e+01 +1.036094999999999988e+00 -5.550000381469726562e+01 +1.036100000000000021e+00 -5.546875381469726562e+01 +1.036105000000000054e+00 -5.550000381469726562e+01 +1.036110000000000086e+00 -5.546875381469726562e+01 +1.036115000000000119e+00 -5.543750000000000000e+01 +1.036120000000000152e+00 -5.540625381469726562e+01 +1.036125000000000185e+00 -5.537500381469726562e+01 +1.036129999999999995e+00 -5.540625381469726562e+01 +1.036135000000000028e+00 -5.531250381469726562e+01 +1.036140000000000061e+00 -5.540625381469726562e+01 +1.036145000000000094e+00 -5.540625381469726562e+01 +1.036150000000000126e+00 -5.528125000000000000e+01 +1.036155000000000159e+00 -5.531250381469726562e+01 +1.036160000000000192e+00 -5.528125000000000000e+01 +1.036165000000000003e+00 -5.528125000000000000e+01 +1.036170000000000035e+00 -5.525000381469726562e+01 +1.036175000000000068e+00 -5.528125000000000000e+01 +1.036180000000000101e+00 -5.521875381469726562e+01 +1.036185000000000134e+00 -5.518750000000000000e+01 +1.036190000000000166e+00 -5.515625381469726562e+01 +1.036194999999999977e+00 -5.518750000000000000e+01 +1.036200000000000010e+00 -5.515625381469726562e+01 +1.036205000000000043e+00 -5.518750000000000000e+01 +1.036210000000000075e+00 -5.518750000000000000e+01 +1.036215000000000108e+00 -5.518750000000000000e+01 +1.036220000000000141e+00 -5.506250381469726562e+01 +1.036225000000000174e+00 -5.503125000000000000e+01 +1.036229999999999984e+00 -5.512500000000000000e+01 +1.036235000000000017e+00 -5.506250381469726562e+01 +1.036240000000000050e+00 -5.506250381469726562e+01 +1.036245000000000083e+00 -5.503125000000000000e+01 +1.036250000000000115e+00 -5.503125000000000000e+01 +1.036255000000000148e+00 -5.506250381469726562e+01 +1.036260000000000181e+00 -5.500000381469726562e+01 +1.036264999999999992e+00 -5.503125000000000000e+01 +1.036270000000000024e+00 -5.500000381469726562e+01 +1.036275000000000057e+00 -5.500000381469726562e+01 +1.036280000000000090e+00 -5.496875381469726562e+01 +1.036285000000000123e+00 -5.496875381469726562e+01 +1.036290000000000155e+00 -5.490625381469726562e+01 +1.036295000000000188e+00 -5.490625381469726562e+01 +1.036299999999999999e+00 -5.490625381469726562e+01 +1.036305000000000032e+00 -5.487500000000000000e+01 +1.036310000000000064e+00 -5.490625381469726562e+01 +1.036315000000000097e+00 -5.490625381469726562e+01 +1.036320000000000130e+00 -5.484375381469726562e+01 +1.036325000000000163e+00 -5.484375381469726562e+01 +1.036330000000000195e+00 -5.481250381469726562e+01 +1.036335000000000006e+00 -5.478125381469726562e+01 +1.036340000000000039e+00 -5.478125381469726562e+01 +1.036345000000000072e+00 -5.475000381469726562e+01 +1.036350000000000104e+00 -5.475000381469726562e+01 +1.036355000000000137e+00 -5.468750381469726562e+01 +1.036360000000000170e+00 -5.475000381469726562e+01 +1.036364999999999981e+00 -5.468750381469726562e+01 +1.036370000000000013e+00 -5.465625381469726562e+01 +1.036375000000000046e+00 -5.471875000000000000e+01 +1.036380000000000079e+00 -5.456250000000000000e+01 +1.036385000000000112e+00 -5.462500000000000000e+01 +1.036390000000000144e+00 -5.459375381469726562e+01 +1.036395000000000177e+00 -5.453125381469726562e+01 +1.036399999999999988e+00 -5.453125381469726562e+01 +1.036405000000000021e+00 -5.453125381469726562e+01 +1.036410000000000053e+00 -5.453125381469726562e+01 +1.036415000000000086e+00 -5.459375381469726562e+01 +1.036420000000000119e+00 -5.450000381469726562e+01 +1.036425000000000152e+00 -5.450000381469726562e+01 +1.036430000000000184e+00 -5.446875000000000000e+01 +1.036434999999999995e+00 -5.450000381469726562e+01 +1.036440000000000028e+00 -5.443750381469726562e+01 +1.036445000000000061e+00 -5.440625000000000000e+01 +1.036450000000000093e+00 -5.440625000000000000e+01 +1.036455000000000126e+00 -5.446875000000000000e+01 +1.036460000000000159e+00 -5.437500381469726562e+01 +1.036465000000000192e+00 -5.437500381469726562e+01 +1.036470000000000002e+00 -5.440625000000000000e+01 +1.036475000000000035e+00 -5.443750381469726562e+01 +1.036480000000000068e+00 -5.434375381469726562e+01 +1.036485000000000101e+00 -5.434375381469726562e+01 +1.036490000000000133e+00 -5.428125381469726562e+01 +1.036495000000000166e+00 -5.428125381469726562e+01 +1.036499999999999977e+00 -5.425000000000000000e+01 +1.036505000000000010e+00 -5.428125381469726562e+01 +1.036510000000000042e+00 -5.428125381469726562e+01 +1.036515000000000075e+00 -5.428125381469726562e+01 +1.036520000000000108e+00 -5.421875381469726562e+01 +1.036525000000000141e+00 -5.418750381469726562e+01 +1.036530000000000173e+00 -5.425000000000000000e+01 +1.036534999999999984e+00 -5.418750381469726562e+01 +1.036540000000000017e+00 -5.415625000000000000e+01 +1.036545000000000050e+00 -5.415625000000000000e+01 +1.036550000000000082e+00 -5.415625000000000000e+01 +1.036555000000000115e+00 -5.400000000000000000e+01 +1.036560000000000148e+00 -5.403125381469726562e+01 +1.036565000000000181e+00 -5.400000000000000000e+01 +1.036569999999999991e+00 -5.400000000000000000e+01 +1.036575000000000024e+00 -5.396875381469726562e+01 +1.036580000000000057e+00 -5.400000000000000000e+01 +1.036585000000000090e+00 -5.400000000000000000e+01 +1.036590000000000122e+00 -5.396875381469726562e+01 +1.036595000000000155e+00 -5.400000000000000000e+01 +1.036600000000000188e+00 -5.393750381469726562e+01 +1.036604999999999999e+00 -5.393750381469726562e+01 +1.036610000000000031e+00 -5.396875381469726562e+01 +1.036615000000000064e+00 -5.393750381469726562e+01 +1.036620000000000097e+00 -5.396875381469726562e+01 +1.036625000000000130e+00 -5.396875381469726562e+01 +1.036630000000000162e+00 -5.390625000000000000e+01 +1.036635000000000195e+00 -5.381250381469726562e+01 +1.036640000000000006e+00 -5.387500381469726562e+01 +1.036645000000000039e+00 -5.381250381469726562e+01 +1.036650000000000071e+00 -5.381250381469726562e+01 +1.036655000000000104e+00 -5.381250381469726562e+01 +1.036660000000000137e+00 -5.378125381469726562e+01 +1.036665000000000170e+00 -5.371875381469726562e+01 +1.036669999999999980e+00 -5.371875381469726562e+01 +1.036675000000000013e+00 -5.375000000000000000e+01 +1.036680000000000046e+00 -5.368750000000000000e+01 +1.036685000000000079e+00 -5.368750000000000000e+01 +1.036690000000000111e+00 -5.365625381469726562e+01 +1.036695000000000144e+00 -5.368750000000000000e+01 +1.036700000000000177e+00 -5.368750000000000000e+01 +1.036704999999999988e+00 -5.378125381469726562e+01 +1.036710000000000020e+00 -5.365625381469726562e+01 +1.036715000000000053e+00 -5.362500381469726562e+01 +1.036720000000000086e+00 -5.368750000000000000e+01 +1.036725000000000119e+00 -5.362500381469726562e+01 +1.036730000000000151e+00 -5.365625381469726562e+01 +1.036735000000000184e+00 -5.356250381469726562e+01 +1.036739999999999995e+00 -5.359375000000000000e+01 +1.036745000000000028e+00 -5.359375000000000000e+01 +1.036750000000000060e+00 -5.356250381469726562e+01 +1.036755000000000093e+00 -5.350000381469726562e+01 +1.036760000000000126e+00 -5.350000381469726562e+01 +1.036765000000000159e+00 -5.353125000000000000e+01 +1.036770000000000191e+00 -5.350000381469726562e+01 +1.036775000000000002e+00 -5.350000381469726562e+01 +1.036780000000000035e+00 -5.346875381469726562e+01 +1.036785000000000068e+00 -5.350000381469726562e+01 +1.036790000000000100e+00 -5.346875381469726562e+01 +1.036795000000000133e+00 -5.346875381469726562e+01 +1.036800000000000166e+00 -5.346875381469726562e+01 +1.036804999999999977e+00 -5.343750000000000000e+01 +1.036810000000000009e+00 -5.343750000000000000e+01 +1.036815000000000042e+00 -5.337500381469726562e+01 +1.036820000000000075e+00 -5.340625381469726562e+01 +1.036825000000000108e+00 -5.334375381469726562e+01 +1.036830000000000140e+00 -5.337500381469726562e+01 +1.036835000000000173e+00 -5.334375381469726562e+01 +1.036839999999999984e+00 -5.334375381469726562e+01 +1.036845000000000017e+00 -5.325000381469726562e+01 +1.036850000000000049e+00 -5.334375381469726562e+01 +1.036855000000000082e+00 -5.331250381469726562e+01 +1.036860000000000115e+00 -5.328125000000000000e+01 +1.036865000000000148e+00 -5.325000381469726562e+01 +1.036870000000000180e+00 -5.328125000000000000e+01 +1.036874999999999991e+00 -5.328125000000000000e+01 +1.036880000000000024e+00 -5.321875381469726562e+01 +1.036885000000000057e+00 -5.331250381469726562e+01 +1.036890000000000089e+00 -5.325000381469726562e+01 +1.036895000000000122e+00 -5.315625381469726562e+01 +1.036900000000000155e+00 -5.321875381469726562e+01 +1.036905000000000188e+00 -5.318750000000000000e+01 +1.036909999999999998e+00 -5.315625381469726562e+01 +1.036915000000000031e+00 -5.315625381469726562e+01 +1.036920000000000064e+00 -5.315625381469726562e+01 +1.036925000000000097e+00 -5.312500000000000000e+01 +1.036930000000000129e+00 -5.309375381469726562e+01 +1.036935000000000162e+00 -5.309375381469726562e+01 +1.036940000000000195e+00 -5.309375381469726562e+01 +1.036945000000000006e+00 -5.312500000000000000e+01 +1.036950000000000038e+00 -5.300000381469726562e+01 +1.036955000000000071e+00 -5.303125000000000000e+01 +1.036960000000000104e+00 -5.300000381469726562e+01 +1.036965000000000137e+00 -5.296875000000000000e+01 +1.036970000000000169e+00 -5.300000381469726562e+01 +1.036974999999999980e+00 -5.300000381469726562e+01 +1.036980000000000013e+00 -5.300000381469726562e+01 +1.036985000000000046e+00 -5.296875000000000000e+01 +1.036990000000000078e+00 -5.290625381469726562e+01 +1.036995000000000111e+00 -5.290625381469726562e+01 +1.037000000000000144e+00 -5.293750381469726562e+01 +1.037005000000000177e+00 -5.284375381469726562e+01 +1.037009999999999987e+00 -5.284375381469726562e+01 +1.037015000000000020e+00 -5.284375381469726562e+01 +1.037020000000000053e+00 -5.284375381469726562e+01 +1.037025000000000086e+00 -5.293750381469726562e+01 +1.037030000000000118e+00 -5.287500000000000000e+01 +1.037035000000000151e+00 -5.284375381469726562e+01 +1.037040000000000184e+00 -5.278125381469726562e+01 +1.037044999999999995e+00 -5.281250000000000000e+01 +1.037050000000000027e+00 -5.278125381469726562e+01 +1.037055000000000060e+00 -5.284375381469726562e+01 +1.037060000000000093e+00 -5.281250000000000000e+01 +1.037065000000000126e+00 -5.278125381469726562e+01 +1.037070000000000158e+00 -5.275000381469726562e+01 +1.037075000000000191e+00 -5.268750381469726562e+01 +1.037080000000000002e+00 -5.268750381469726562e+01 +1.037085000000000035e+00 -5.271875000000000000e+01 +1.037090000000000067e+00 -5.268750381469726562e+01 +1.037095000000000100e+00 -5.268750381469726562e+01 +1.037100000000000133e+00 -5.265625381469726562e+01 +1.037105000000000166e+00 -5.268750381469726562e+01 +1.037109999999999976e+00 -5.268750381469726562e+01 +1.037115000000000009e+00 -5.268750381469726562e+01 +1.037120000000000042e+00 -5.262500381469726562e+01 +1.037125000000000075e+00 -5.265625381469726562e+01 +1.037130000000000107e+00 -5.256250000000000000e+01 +1.037135000000000140e+00 -5.250000381469726562e+01 +1.037140000000000173e+00 -5.256250000000000000e+01 +1.037144999999999984e+00 -5.250000381469726562e+01 +1.037150000000000016e+00 -5.253125381469726562e+01 +1.037155000000000049e+00 -5.250000381469726562e+01 +1.037160000000000082e+00 -5.253125381469726562e+01 +1.037165000000000115e+00 -5.246875381469726562e+01 +1.037170000000000147e+00 -5.250000381469726562e+01 +1.037175000000000180e+00 -5.243750381469726562e+01 +1.037179999999999991e+00 -5.246875381469726562e+01 +1.037185000000000024e+00 -5.243750381469726562e+01 +1.037190000000000056e+00 -5.243750381469726562e+01 +1.037195000000000089e+00 -5.243750381469726562e+01 +1.037200000000000122e+00 -5.234375381469726562e+01 +1.037205000000000155e+00 -5.240625000000000000e+01 +1.037210000000000187e+00 -5.237500381469726562e+01 +1.037214999999999998e+00 -5.231250000000000000e+01 +1.037220000000000031e+00 -5.231250000000000000e+01 +1.037225000000000064e+00 -5.234375381469726562e+01 +1.037230000000000096e+00 -5.234375381469726562e+01 +1.037235000000000129e+00 -5.228125381469726562e+01 +1.037240000000000162e+00 -5.228125381469726562e+01 +1.037245000000000195e+00 -5.225000000000000000e+01 +1.037250000000000005e+00 -5.221875381469726562e+01 +1.037255000000000038e+00 -5.225000000000000000e+01 +1.037260000000000071e+00 -5.215625000000000000e+01 +1.037265000000000104e+00 -5.228125381469726562e+01 +1.037270000000000136e+00 -5.228125381469726562e+01 +1.037275000000000169e+00 -5.228125381469726562e+01 +1.037279999999999980e+00 -5.221875381469726562e+01 +1.037285000000000013e+00 -5.221875381469726562e+01 +1.037290000000000045e+00 -5.218750381469726562e+01 +1.037295000000000078e+00 -5.215625000000000000e+01 +1.037300000000000111e+00 -5.218750381469726562e+01 +1.037305000000000144e+00 -5.209375000000000000e+01 +1.037310000000000176e+00 -5.212500381469726562e+01 +1.037314999999999987e+00 -5.212500381469726562e+01 +1.037320000000000020e+00 -5.209375000000000000e+01 +1.037325000000000053e+00 -5.215625000000000000e+01 +1.037330000000000085e+00 -5.209375000000000000e+01 +1.037335000000000118e+00 -5.206250381469726562e+01 +1.037340000000000151e+00 -5.215625000000000000e+01 +1.037345000000000184e+00 -5.203125381469726562e+01 +1.037349999999999994e+00 -5.200000000000000000e+01 +1.037355000000000027e+00 -5.203125381469726562e+01 +1.037360000000000060e+00 -5.193750000000000000e+01 +1.037365000000000093e+00 -5.196875381469726562e+01 +1.037370000000000125e+00 -5.196875381469726562e+01 +1.037375000000000158e+00 -5.196875381469726562e+01 +1.037380000000000191e+00 -5.196875381469726562e+01 +1.037385000000000002e+00 -5.193750000000000000e+01 +1.037390000000000034e+00 -5.196875381469726562e+01 +1.037395000000000067e+00 -5.190625381469726562e+01 +1.037400000000000100e+00 -5.190625381469726562e+01 +1.037405000000000133e+00 -5.193750000000000000e+01 +1.037410000000000165e+00 -5.187500381469726562e+01 +1.037414999999999976e+00 -5.187500381469726562e+01 +1.037420000000000009e+00 -5.190625381469726562e+01 +1.037425000000000042e+00 -5.184375000000000000e+01 +1.037430000000000074e+00 -5.181250381469726562e+01 +1.037435000000000107e+00 -5.184375000000000000e+01 +1.037440000000000140e+00 -5.181250381469726562e+01 +1.037445000000000173e+00 -5.181250381469726562e+01 +1.037449999999999983e+00 -5.181250381469726562e+01 +1.037455000000000016e+00 -5.175000381469726562e+01 +1.037460000000000049e+00 -5.181250381469726562e+01 +1.037465000000000082e+00 -5.181250381469726562e+01 +1.037470000000000114e+00 -5.181250381469726562e+01 +1.037475000000000147e+00 -5.178125381469726562e+01 +1.037480000000000180e+00 -5.175000381469726562e+01 +1.037484999999999991e+00 -5.175000381469726562e+01 +1.037490000000000023e+00 -5.162500381469726562e+01 +1.037495000000000056e+00 -5.171875381469726562e+01 +1.037500000000000089e+00 -5.168750000000000000e+01 +1.037505000000000122e+00 -5.165625381469726562e+01 +1.037510000000000154e+00 -5.162500381469726562e+01 +1.037515000000000187e+00 -5.162500381469726562e+01 +1.037519999999999998e+00 -5.156250381469726562e+01 +1.037525000000000031e+00 -5.159375000000000000e+01 +1.037530000000000063e+00 -5.153125000000000000e+01 +1.037535000000000096e+00 -5.156250381469726562e+01 +1.037540000000000129e+00 -5.150000381469726562e+01 +1.037545000000000162e+00 -5.153125000000000000e+01 +1.037550000000000194e+00 -5.150000381469726562e+01 +1.037555000000000005e+00 -5.150000381469726562e+01 +1.037560000000000038e+00 -5.150000381469726562e+01 +1.037565000000000071e+00 -5.146875381469726562e+01 +1.037570000000000103e+00 -5.146875381469726562e+01 +1.037575000000000136e+00 -5.146875381469726562e+01 +1.037580000000000169e+00 -5.146875381469726562e+01 +1.037584999999999980e+00 -5.140625381469726562e+01 +1.037590000000000012e+00 -5.143750000000000000e+01 +1.037595000000000045e+00 -5.146875381469726562e+01 +1.037600000000000078e+00 -5.134375381469726562e+01 +1.037605000000000111e+00 -5.134375381469726562e+01 +1.037610000000000143e+00 -5.137500000000000000e+01 +1.037615000000000176e+00 -5.137500000000000000e+01 +1.037619999999999987e+00 -5.134375381469726562e+01 +1.037625000000000020e+00 -5.134375381469726562e+01 +1.037630000000000052e+00 -5.134375381469726562e+01 +1.037635000000000085e+00 -5.131250381469726562e+01 +1.037640000000000118e+00 -5.131250381469726562e+01 +1.037645000000000151e+00 -5.128125000000000000e+01 +1.037650000000000183e+00 -5.131250381469726562e+01 +1.037654999999999994e+00 -5.125000381469726562e+01 +1.037660000000000027e+00 -5.121875000000000000e+01 +1.037665000000000060e+00 -5.115625381469726562e+01 +1.037670000000000092e+00 -5.115625381469726562e+01 +1.037675000000000125e+00 -5.115625381469726562e+01 +1.037680000000000158e+00 -5.115625381469726562e+01 +1.037685000000000191e+00 -5.125000381469726562e+01 +1.037690000000000001e+00 -5.112500000000000000e+01 +1.037695000000000034e+00 -5.109375381469726562e+01 +1.037700000000000067e+00 -5.115625381469726562e+01 +1.037705000000000100e+00 -5.112500000000000000e+01 +1.037710000000000132e+00 -5.112500000000000000e+01 +1.037715000000000165e+00 -5.109375381469726562e+01 +1.037719999999999976e+00 -5.109375381469726562e+01 +1.037725000000000009e+00 -5.103125381469726562e+01 +1.037730000000000041e+00 -5.103125381469726562e+01 +1.037735000000000074e+00 -5.100000381469726562e+01 +1.037740000000000107e+00 -5.103125381469726562e+01 +1.037745000000000140e+00 -5.100000381469726562e+01 +1.037750000000000172e+00 -5.100000381469726562e+01 +1.037754999999999983e+00 -5.100000381469726562e+01 +1.037760000000000016e+00 -5.100000381469726562e+01 +1.037765000000000049e+00 -5.096875000000000000e+01 +1.037770000000000081e+00 -5.093750381469726562e+01 +1.037775000000000114e+00 -5.090625381469726562e+01 +1.037780000000000147e+00 -5.090625381469726562e+01 +1.037785000000000180e+00 -5.087500000000000000e+01 +1.037789999999999990e+00 -5.090625381469726562e+01 +1.037795000000000023e+00 -5.090625381469726562e+01 +1.037800000000000056e+00 -5.081250000000000000e+01 +1.037805000000000089e+00 -5.084375381469726562e+01 +1.037810000000000121e+00 -5.084375381469726562e+01 +1.037815000000000154e+00 -5.078125381469726562e+01 +1.037820000000000187e+00 -5.081250000000000000e+01 +1.037824999999999998e+00 -5.084375381469726562e+01 +1.037830000000000030e+00 -5.075000381469726562e+01 +1.037835000000000063e+00 -5.075000381469726562e+01 +1.037840000000000096e+00 -5.078125381469726562e+01 +1.037845000000000129e+00 -5.078125381469726562e+01 +1.037850000000000161e+00 -5.071875000000000000e+01 +1.037855000000000194e+00 -5.068750381469726562e+01 +1.037860000000000005e+00 -5.075000381469726562e+01 +1.037865000000000038e+00 -5.065625000000000000e+01 +1.037870000000000070e+00 -5.071875000000000000e+01 +1.037875000000000103e+00 -5.068750381469726562e+01 +1.037880000000000136e+00 -5.062500381469726562e+01 +1.037885000000000169e+00 -5.068750381469726562e+01 +1.037889999999999979e+00 -5.065625000000000000e+01 +1.037895000000000012e+00 -5.068750381469726562e+01 +1.037900000000000045e+00 -5.065625000000000000e+01 +1.037905000000000078e+00 -5.068750381469726562e+01 +1.037910000000000110e+00 -5.059375381469726562e+01 +1.037915000000000143e+00 -5.062500381469726562e+01 +1.037920000000000176e+00 -5.059375381469726562e+01 +1.037924999999999986e+00 -5.053125381469726562e+01 +1.037930000000000019e+00 -5.053125381469726562e+01 +1.037935000000000052e+00 -5.050000000000000000e+01 +1.037940000000000085e+00 -5.059375381469726562e+01 +1.037945000000000118e+00 -5.050000000000000000e+01 +1.037950000000000150e+00 -5.050000000000000000e+01 +1.037955000000000183e+00 -5.050000000000000000e+01 +1.037959999999999994e+00 -5.050000000000000000e+01 +1.037965000000000027e+00 -5.050000000000000000e+01 +1.037970000000000059e+00 -5.043750381469726562e+01 +1.037975000000000092e+00 -5.046875381469726562e+01 +1.037980000000000125e+00 -5.046875381469726562e+01 +1.037985000000000158e+00 -5.040625000000000000e+01 +1.037990000000000190e+00 -5.046875381469726562e+01 +1.037995000000000001e+00 -5.040625000000000000e+01 +1.038000000000000034e+00 -5.043750381469726562e+01 +1.038005000000000067e+00 -5.040625000000000000e+01 +1.038010000000000099e+00 -5.034375000000000000e+01 +1.038015000000000132e+00 -5.040625000000000000e+01 +1.038020000000000165e+00 -5.037500381469726562e+01 +1.038024999999999975e+00 -5.040625000000000000e+01 +1.038030000000000008e+00 -5.031250381469726562e+01 +1.038035000000000041e+00 -5.034375000000000000e+01 +1.038040000000000074e+00 -5.037500381469726562e+01 +1.038045000000000107e+00 -5.031250381469726562e+01 +1.038050000000000139e+00 -5.034375000000000000e+01 +1.038055000000000172e+00 -5.028125381469726562e+01 +1.038059999999999983e+00 -5.025000000000000000e+01 +1.038065000000000015e+00 -5.028125381469726562e+01 +1.038070000000000048e+00 -5.031250381469726562e+01 +1.038075000000000081e+00 -5.028125381469726562e+01 +1.038080000000000114e+00 -5.018750381469726562e+01 +1.038085000000000147e+00 -5.021875381469726562e+01 +1.038090000000000179e+00 -5.028125381469726562e+01 +1.038094999999999990e+00 -5.021875381469726562e+01 +1.038100000000000023e+00 -5.018750381469726562e+01 +1.038105000000000055e+00 -5.012500381469726562e+01 +1.038110000000000088e+00 -5.015625000000000000e+01 +1.038115000000000121e+00 -5.012500381469726562e+01 +1.038120000000000154e+00 -5.015625000000000000e+01 +1.038125000000000187e+00 -5.009375000000000000e+01 +1.038129999999999997e+00 -5.012500381469726562e+01 +1.038135000000000030e+00 -5.003125381469726562e+01 +1.038140000000000063e+00 -5.009375000000000000e+01 +1.038145000000000095e+00 -5.009375000000000000e+01 +1.038150000000000128e+00 -5.009375000000000000e+01 +1.038155000000000161e+00 -5.003125381469726562e+01 +1.038160000000000194e+00 -5.006250381469726562e+01 +1.038165000000000004e+00 -5.006250381469726562e+01 +1.038170000000000037e+00 -5.003125381469726562e+01 +1.038175000000000070e+00 -5.003125381469726562e+01 +1.038180000000000103e+00 -5.000000000000000000e+01 +1.038185000000000136e+00 -5.003125381469726562e+01 +1.038190000000000168e+00 -5.003125381469726562e+01 +1.038194999999999979e+00 -4.993750000000000000e+01 +1.038200000000000012e+00 -4.996875381469726562e+01 +1.038205000000000044e+00 -4.996875381469726562e+01 +1.038210000000000077e+00 -4.996875381469726562e+01 +1.038215000000000110e+00 -4.993750000000000000e+01 +1.038220000000000143e+00 -4.990625381469726562e+01 +1.038225000000000176e+00 -4.993750000000000000e+01 +1.038229999999999986e+00 -4.984375000000000000e+01 +1.038235000000000019e+00 -4.996875381469726562e+01 +1.038240000000000052e+00 -4.987500381469726562e+01 +1.038245000000000084e+00 -4.987500381469726562e+01 +1.038250000000000117e+00 -4.993750000000000000e+01 +1.038255000000000150e+00 -4.990625381469726562e+01 +1.038260000000000183e+00 -4.984375000000000000e+01 +1.038264999999999993e+00 -4.984375000000000000e+01 +1.038270000000000026e+00 -4.984375000000000000e+01 +1.038275000000000059e+00 -4.981250381469726562e+01 +1.038280000000000092e+00 -4.981250381469726562e+01 +1.038285000000000124e+00 -4.975000381469726562e+01 +1.038290000000000157e+00 -4.975000381469726562e+01 +1.038295000000000190e+00 -4.990625381469726562e+01 +1.038300000000000001e+00 -4.968750000000000000e+01 +1.038305000000000033e+00 -4.978125000000000000e+01 +1.038310000000000066e+00 -4.975000381469726562e+01 +1.038315000000000099e+00 -4.978125000000000000e+01 +1.038320000000000132e+00 -4.975000381469726562e+01 +1.038325000000000164e+00 -4.968750000000000000e+01 +1.038329999999999975e+00 -4.975000381469726562e+01 +1.038335000000000008e+00 -4.971875381469726562e+01 +1.038340000000000041e+00 -4.971875381469726562e+01 +1.038345000000000073e+00 -4.971875381469726562e+01 +1.038350000000000106e+00 -4.971875381469726562e+01 +1.038355000000000139e+00 -4.968750000000000000e+01 +1.038360000000000172e+00 -4.965625381469726562e+01 +1.038364999999999982e+00 -4.971875381469726562e+01 +1.038370000000000015e+00 -4.959375381469726562e+01 +1.038375000000000048e+00 -4.959375381469726562e+01 +1.038380000000000081e+00 -4.965625381469726562e+01 +1.038385000000000113e+00 -4.962500000000000000e+01 +1.038390000000000146e+00 -4.962500000000000000e+01 +1.038395000000000179e+00 -4.962500000000000000e+01 +1.038399999999999990e+00 -4.959375381469726562e+01 +1.038405000000000022e+00 -4.959375381469726562e+01 +1.038410000000000055e+00 -4.956250381469726562e+01 +1.038415000000000088e+00 -4.956250381469726562e+01 +1.038420000000000121e+00 -4.956250381469726562e+01 +1.038425000000000153e+00 -4.950000381469726562e+01 +1.038430000000000186e+00 -4.950000381469726562e+01 +1.038434999999999997e+00 -4.950000381469726562e+01 +1.038440000000000030e+00 -4.950000381469726562e+01 +1.038445000000000062e+00 -4.946875381469726562e+01 +1.038450000000000095e+00 -4.950000381469726562e+01 +1.038455000000000128e+00 -4.950000381469726562e+01 +1.038460000000000161e+00 -4.950000381469726562e+01 +1.038465000000000193e+00 -4.950000381469726562e+01 +1.038470000000000004e+00 -4.953125000000000000e+01 +1.038475000000000037e+00 -4.950000381469726562e+01 +1.038480000000000070e+00 -4.950000381469726562e+01 +1.038485000000000102e+00 -4.950000381469726562e+01 +1.038490000000000135e+00 -4.950000381469726562e+01 +1.038495000000000168e+00 -4.946875381469726562e+01 +1.038499999999999979e+00 -4.943750000000000000e+01 +1.038505000000000011e+00 -4.940625381469726562e+01 +1.038510000000000044e+00 -4.940625381469726562e+01 +1.038515000000000077e+00 -4.937500000000000000e+01 +1.038520000000000110e+00 -4.937500000000000000e+01 +1.038525000000000142e+00 -4.934375381469726562e+01 +1.038530000000000175e+00 -4.943750000000000000e+01 +1.038534999999999986e+00 -4.937500000000000000e+01 +1.038540000000000019e+00 -4.934375381469726562e+01 +1.038545000000000051e+00 -4.940625381469726562e+01 +1.038550000000000084e+00 -4.934375381469726562e+01 +1.038555000000000117e+00 -4.934375381469726562e+01 +1.038560000000000150e+00 -4.934375381469726562e+01 +1.038565000000000182e+00 -4.928125000000000000e+01 +1.038569999999999993e+00 -4.931250381469726562e+01 +1.038575000000000026e+00 -4.934375381469726562e+01 +1.038580000000000059e+00 -4.931250381469726562e+01 +1.038585000000000091e+00 -4.928125000000000000e+01 +1.038590000000000124e+00 -4.928125000000000000e+01 +1.038595000000000157e+00 -4.934375381469726562e+01 +1.038600000000000190e+00 -4.931250381469726562e+01 +1.038605000000000000e+00 -4.934375381469726562e+01 +1.038610000000000033e+00 -4.931250381469726562e+01 +1.038615000000000066e+00 -4.928125000000000000e+01 +1.038620000000000099e+00 -4.928125000000000000e+01 +1.038625000000000131e+00 -4.925000381469726562e+01 +1.038630000000000164e+00 -4.925000381469726562e+01 +1.038634999999999975e+00 -4.928125000000000000e+01 +1.038640000000000008e+00 -4.921875000000000000e+01 +1.038645000000000040e+00 -4.915625381469726562e+01 +1.038650000000000073e+00 -4.921875000000000000e+01 +1.038655000000000106e+00 -4.921875000000000000e+01 +1.038660000000000139e+00 -4.921875000000000000e+01 +1.038665000000000171e+00 -4.918750381469726562e+01 +1.038669999999999982e+00 -4.915625381469726562e+01 +1.038675000000000015e+00 -4.915625381469726562e+01 +1.038680000000000048e+00 -4.912500000000000000e+01 +1.038685000000000080e+00 -4.915625381469726562e+01 +1.038690000000000113e+00 -4.912500000000000000e+01 +1.038695000000000146e+00 -4.918750381469726562e+01 +1.038700000000000179e+00 -4.915625381469726562e+01 +1.038704999999999989e+00 -4.915625381469726562e+01 +1.038710000000000022e+00 -4.915625381469726562e+01 +1.038715000000000055e+00 -4.909375381469726562e+01 +1.038720000000000088e+00 -4.906250000000000000e+01 +1.038725000000000120e+00 -4.918750381469726562e+01 +1.038730000000000153e+00 -4.906250000000000000e+01 +1.038735000000000186e+00 -4.903125381469726562e+01 +1.038739999999999997e+00 -4.909375381469726562e+01 +1.038745000000000029e+00 -4.906250000000000000e+01 +1.038750000000000062e+00 -4.906250000000000000e+01 +1.038755000000000095e+00 -4.909375381469726562e+01 +1.038760000000000128e+00 -4.906250000000000000e+01 +1.038765000000000160e+00 -4.909375381469726562e+01 +1.038770000000000193e+00 -4.906250000000000000e+01 +1.038775000000000004e+00 -4.900000381469726562e+01 +1.038780000000000037e+00 -4.903125381469726562e+01 +1.038785000000000069e+00 -4.900000381469726562e+01 +1.038790000000000102e+00 -4.900000381469726562e+01 +1.038795000000000135e+00 -4.903125381469726562e+01 +1.038800000000000168e+00 -4.900000381469726562e+01 +1.038804999999999978e+00 -4.906250000000000000e+01 +1.038810000000000011e+00 -4.900000381469726562e+01 +1.038815000000000044e+00 -4.900000381469726562e+01 +1.038820000000000077e+00 -4.896875000000000000e+01 +1.038825000000000109e+00 -4.900000381469726562e+01 +1.038830000000000142e+00 -4.900000381469726562e+01 +1.038835000000000175e+00 -4.896875000000000000e+01 +1.038839999999999986e+00 -4.893750381469726562e+01 +1.038845000000000018e+00 -4.900000381469726562e+01 +1.038850000000000051e+00 -4.890625000000000000e+01 +1.038855000000000084e+00 -4.890625000000000000e+01 +1.038860000000000117e+00 -4.890625000000000000e+01 +1.038865000000000149e+00 -4.896875000000000000e+01 +1.038870000000000182e+00 -4.890625000000000000e+01 +1.038874999999999993e+00 -4.887500381469726562e+01 +1.038880000000000026e+00 -4.890625000000000000e+01 +1.038885000000000058e+00 -4.890625000000000000e+01 +1.038890000000000091e+00 -4.884375381469726562e+01 +1.038895000000000124e+00 -4.884375381469726562e+01 +1.038900000000000157e+00 -4.884375381469726562e+01 +1.038905000000000189e+00 -4.887500381469726562e+01 +1.038910000000000000e+00 -4.893750381469726562e+01 +1.038915000000000033e+00 -4.884375381469726562e+01 +1.038920000000000066e+00 -4.881250000000000000e+01 +1.038925000000000098e+00 -4.887500381469726562e+01 +1.038930000000000131e+00 -4.881250000000000000e+01 +1.038935000000000164e+00 -4.884375381469726562e+01 +1.038939999999999975e+00 -4.884375381469726562e+01 +1.038945000000000007e+00 -4.884375381469726562e+01 +1.038950000000000040e+00 -4.878125381469726562e+01 +1.038955000000000073e+00 -4.875000381469726562e+01 +1.038960000000000106e+00 -4.875000381469726562e+01 +1.038965000000000138e+00 -4.878125381469726562e+01 +1.038970000000000171e+00 -4.871875000000000000e+01 +1.038974999999999982e+00 -4.881250000000000000e+01 +1.038980000000000015e+00 -4.871875000000000000e+01 +1.038985000000000047e+00 -4.871875000000000000e+01 +1.038990000000000080e+00 -4.871875000000000000e+01 +1.038995000000000113e+00 -4.878125381469726562e+01 +1.039000000000000146e+00 -4.868750381469726562e+01 +1.039005000000000178e+00 -4.871875000000000000e+01 +1.039009999999999989e+00 -4.868750381469726562e+01 +1.039015000000000022e+00 -4.871875000000000000e+01 +1.039020000000000055e+00 -4.865625000000000000e+01 +1.039025000000000087e+00 -4.871875000000000000e+01 +1.039030000000000120e+00 -4.862500381469726562e+01 +1.039035000000000153e+00 -4.865625000000000000e+01 +1.039040000000000186e+00 -4.862500381469726562e+01 +1.039044999999999996e+00 -4.865625000000000000e+01 +1.039050000000000029e+00 -4.871875000000000000e+01 +1.039055000000000062e+00 -4.865625000000000000e+01 +1.039060000000000095e+00 -4.862500381469726562e+01 +1.039065000000000127e+00 -4.862500381469726562e+01 +1.039070000000000160e+00 -4.865625000000000000e+01 +1.039075000000000193e+00 -4.865625000000000000e+01 +1.039080000000000004e+00 -4.859375381469726562e+01 +1.039085000000000036e+00 -4.859375381469726562e+01 +1.039090000000000069e+00 -4.859375381469726562e+01 +1.039095000000000102e+00 -4.859375381469726562e+01 +1.039100000000000135e+00 -4.856250000000000000e+01 +1.039105000000000167e+00 -4.859375381469726562e+01 +1.039109999999999978e+00 -4.853125381469726562e+01 +1.039115000000000011e+00 -4.856250000000000000e+01 +1.039120000000000044e+00 -4.859375381469726562e+01 +1.039125000000000076e+00 -4.862500381469726562e+01 +1.039130000000000109e+00 -4.853125381469726562e+01 +1.039135000000000142e+00 -4.859375381469726562e+01 +1.039140000000000175e+00 -4.853125381469726562e+01 +1.039144999999999985e+00 -4.853125381469726562e+01 +1.039150000000000018e+00 -4.853125381469726562e+01 +1.039155000000000051e+00 -4.850000000000000000e+01 +1.039160000000000084e+00 -4.850000000000000000e+01 +1.039165000000000116e+00 -4.853125381469726562e+01 +1.039170000000000149e+00 -4.843750381469726562e+01 +1.039175000000000182e+00 -4.853125381469726562e+01 +1.039179999999999993e+00 -4.846875381469726562e+01 +1.039185000000000025e+00 -4.850000000000000000e+01 +1.039190000000000058e+00 -4.843750381469726562e+01 +1.039195000000000091e+00 -4.837500381469726562e+01 +1.039200000000000124e+00 -4.843750381469726562e+01 +1.039205000000000156e+00 -4.846875381469726562e+01 +1.039210000000000189e+00 -4.843750381469726562e+01 +1.039215000000000000e+00 -4.843750381469726562e+01 +1.039220000000000033e+00 -4.840625000000000000e+01 +1.039225000000000065e+00 -4.843750381469726562e+01 +1.039230000000000098e+00 -4.840625000000000000e+01 +1.039235000000000131e+00 -4.843750381469726562e+01 +1.039240000000000164e+00 -4.840625000000000000e+01 +1.039244999999999974e+00 -4.837500381469726562e+01 +1.039250000000000007e+00 -4.846875381469726562e+01 +1.039255000000000040e+00 -4.834375000000000000e+01 +1.039260000000000073e+00 -4.837500381469726562e+01 +1.039265000000000105e+00 -4.834375000000000000e+01 +1.039270000000000138e+00 -4.837500381469726562e+01 +1.039275000000000171e+00 -4.840625000000000000e+01 +1.039279999999999982e+00 -4.831250381469726562e+01 +1.039285000000000014e+00 -4.834375000000000000e+01 +1.039290000000000047e+00 -4.834375000000000000e+01 +1.039295000000000080e+00 -4.828125381469726562e+01 +1.039300000000000113e+00 -4.828125381469726562e+01 +1.039305000000000145e+00 -4.834375000000000000e+01 +1.039310000000000178e+00 -4.831250381469726562e+01 +1.039314999999999989e+00 -4.834375000000000000e+01 +1.039320000000000022e+00 -4.828125381469726562e+01 +1.039325000000000054e+00 -4.828125381469726562e+01 +1.039330000000000087e+00 -4.828125381469726562e+01 +1.039335000000000120e+00 -4.825000000000000000e+01 +1.039340000000000153e+00 -4.821875381469726562e+01 +1.039345000000000185e+00 -4.821875381469726562e+01 +1.039349999999999996e+00 -4.828125381469726562e+01 +1.039355000000000029e+00 -4.818750000000000000e+01 +1.039360000000000062e+00 -4.818750000000000000e+01 +1.039365000000000094e+00 -4.821875381469726562e+01 +1.039370000000000127e+00 -4.828125381469726562e+01 +1.039375000000000160e+00 -4.821875381469726562e+01 +1.039380000000000193e+00 -4.818750000000000000e+01 +1.039385000000000003e+00 -4.815625381469726562e+01 +1.039390000000000036e+00 -4.818750000000000000e+01 +1.039395000000000069e+00 -4.815625381469726562e+01 +1.039400000000000102e+00 -4.815625381469726562e+01 +1.039405000000000134e+00 -4.815625381469726562e+01 +1.039410000000000167e+00 -4.818750000000000000e+01 +1.039414999999999978e+00 -4.815625381469726562e+01 +1.039420000000000011e+00 -4.815625381469726562e+01 +1.039425000000000043e+00 -4.818750000000000000e+01 +1.039430000000000076e+00 -4.812500381469726562e+01 +1.039435000000000109e+00 -4.809375000000000000e+01 +1.039440000000000142e+00 -4.815625381469726562e+01 +1.039445000000000174e+00 -4.809375000000000000e+01 +1.039449999999999985e+00 -4.809375000000000000e+01 +1.039455000000000018e+00 -4.812500381469726562e+01 +1.039460000000000051e+00 -4.803125000000000000e+01 +1.039465000000000083e+00 -4.812500381469726562e+01 +1.039470000000000116e+00 -4.796875381469726562e+01 +1.039475000000000149e+00 -4.803125000000000000e+01 +1.039480000000000182e+00 -4.803125000000000000e+01 +1.039484999999999992e+00 -4.803125000000000000e+01 +1.039490000000000025e+00 -4.796875381469726562e+01 +1.039495000000000058e+00 -4.800000000000000000e+01 +1.039500000000000091e+00 -4.793750000000000000e+01 +1.039505000000000123e+00 -4.803125000000000000e+01 +1.039510000000000156e+00 -4.796875381469726562e+01 +1.039515000000000189e+00 -4.793750000000000000e+01 +1.039520000000000000e+00 -4.793750000000000000e+01 +1.039525000000000032e+00 -4.803125000000000000e+01 +1.039530000000000065e+00 -4.796875381469726562e+01 +1.039535000000000098e+00 -4.793750000000000000e+01 +1.039540000000000131e+00 -4.793750000000000000e+01 +1.039545000000000163e+00 -4.796875381469726562e+01 +1.039549999999999974e+00 -4.796875381469726562e+01 +1.039555000000000007e+00 -4.796875381469726562e+01 +1.039560000000000040e+00 -4.793750000000000000e+01 +1.039565000000000072e+00 -4.790625381469726562e+01 +1.039570000000000105e+00 -4.790625381469726562e+01 +1.039575000000000138e+00 -4.793750000000000000e+01 +1.039580000000000171e+00 -4.787500381469726562e+01 +1.039584999999999981e+00 -4.784375000000000000e+01 +1.039590000000000014e+00 -4.784375000000000000e+01 +1.039595000000000047e+00 -4.781250381469726562e+01 +1.039600000000000080e+00 -4.790625381469726562e+01 +1.039605000000000112e+00 -4.790625381469726562e+01 +1.039610000000000145e+00 -4.781250381469726562e+01 +1.039615000000000178e+00 -4.784375000000000000e+01 +1.039619999999999989e+00 -4.781250381469726562e+01 +1.039625000000000021e+00 -4.787500381469726562e+01 +1.039630000000000054e+00 -4.784375000000000000e+01 +1.039635000000000087e+00 -4.778125000000000000e+01 +1.039640000000000120e+00 -4.784375000000000000e+01 +1.039645000000000152e+00 -4.775000381469726562e+01 +1.039650000000000185e+00 -4.781250381469726562e+01 +1.039654999999999996e+00 -4.784375000000000000e+01 +1.039660000000000029e+00 -4.784375000000000000e+01 +1.039665000000000061e+00 -4.778125000000000000e+01 +1.039670000000000094e+00 -4.784375000000000000e+01 +1.039675000000000127e+00 -4.771875381469726562e+01 +1.039680000000000160e+00 -4.781250381469726562e+01 +1.039685000000000192e+00 -4.775000381469726562e+01 +1.039690000000000003e+00 -4.768750000000000000e+01 +1.039695000000000036e+00 -4.768750000000000000e+01 +1.039700000000000069e+00 -4.775000381469726562e+01 +1.039705000000000101e+00 -4.768750000000000000e+01 +1.039710000000000134e+00 -4.768750000000000000e+01 +1.039715000000000167e+00 -4.771875381469726562e+01 +1.039719999999999978e+00 -4.768750000000000000e+01 +1.039725000000000010e+00 -4.768750000000000000e+01 +1.039730000000000043e+00 -4.765625381469726562e+01 +1.039735000000000076e+00 -4.765625381469726562e+01 +1.039740000000000109e+00 -4.762500000000000000e+01 +1.039745000000000141e+00 -4.765625381469726562e+01 +1.039750000000000174e+00 -4.765625381469726562e+01 +1.039754999999999985e+00 -4.768750000000000000e+01 +1.039760000000000018e+00 -4.759375381469726562e+01 +1.039765000000000050e+00 -4.756250381469726562e+01 +1.039770000000000083e+00 -4.756250381469726562e+01 +1.039775000000000116e+00 -4.759375381469726562e+01 +1.039780000000000149e+00 -4.762500000000000000e+01 +1.039785000000000181e+00 -4.759375381469726562e+01 +1.039789999999999992e+00 -4.756250381469726562e+01 +1.039795000000000025e+00 -4.756250381469726562e+01 +1.039800000000000058e+00 -4.756250381469726562e+01 +1.039805000000000090e+00 -4.756250381469726562e+01 +1.039810000000000123e+00 -4.753125000000000000e+01 +1.039815000000000156e+00 -4.750000381469726562e+01 +1.039820000000000189e+00 -4.753125000000000000e+01 +1.039824999999999999e+00 -4.759375381469726562e+01 +1.039830000000000032e+00 -4.750000381469726562e+01 +1.039835000000000065e+00 -4.753125000000000000e+01 +1.039840000000000098e+00 -4.743750381469726562e+01 +1.039845000000000130e+00 -4.750000381469726562e+01 +1.039850000000000163e+00 -4.750000381469726562e+01 +1.039855000000000196e+00 -4.750000381469726562e+01 +1.039860000000000007e+00 -4.750000381469726562e+01 +1.039865000000000039e+00 -4.750000381469726562e+01 +1.039870000000000072e+00 -4.750000381469726562e+01 +1.039875000000000105e+00 -4.743750381469726562e+01 +1.039880000000000138e+00 -4.746875000000000000e+01 +1.039885000000000170e+00 -4.743750381469726562e+01 +1.039889999999999981e+00 -4.750000381469726562e+01 +1.039895000000000014e+00 -4.743750381469726562e+01 +1.039900000000000047e+00 -4.743750381469726562e+01 +1.039905000000000079e+00 -4.743750381469726562e+01 +1.039910000000000112e+00 -4.743750381469726562e+01 +1.039915000000000145e+00 -4.743750381469726562e+01 +1.039920000000000178e+00 -4.743750381469726562e+01 +1.039924999999999988e+00 -4.737500000000000000e+01 +1.039930000000000021e+00 -4.740625381469726562e+01 +1.039935000000000054e+00 -4.737500000000000000e+01 +1.039940000000000087e+00 -4.734375381469726562e+01 +1.039945000000000119e+00 -4.737500000000000000e+01 +1.039950000000000152e+00 -4.737500000000000000e+01 +1.039955000000000185e+00 -4.734375381469726562e+01 +1.039959999999999996e+00 -4.737500000000000000e+01 +1.039965000000000028e+00 -4.734375381469726562e+01 +1.039970000000000061e+00 -4.737500000000000000e+01 +1.039975000000000094e+00 -4.734375381469726562e+01 +1.039980000000000127e+00 -4.740625381469726562e+01 +1.039985000000000159e+00 -4.740625381469726562e+01 +1.039990000000000192e+00 -4.734375381469726562e+01 +1.039995000000000003e+00 -4.734375381469726562e+01 +1.040000000000000036e+00 -4.737500000000000000e+01 +1.040005000000000068e+00 -4.737500000000000000e+01 +1.040010000000000101e+00 -4.737500000000000000e+01 +1.040015000000000134e+00 -4.725000381469726562e+01 +1.040020000000000167e+00 -4.728125381469726562e+01 +1.040024999999999977e+00 -4.731250000000000000e+01 +1.040030000000000010e+00 -4.725000381469726562e+01 +1.040035000000000043e+00 -4.728125381469726562e+01 +1.040040000000000076e+00 -4.728125381469726562e+01 +1.040045000000000108e+00 -4.721875000000000000e+01 +1.040050000000000141e+00 -4.721875000000000000e+01 +1.040055000000000174e+00 -4.721875000000000000e+01 +1.040059999999999985e+00 -4.725000381469726562e+01 +1.040065000000000017e+00 -4.721875000000000000e+01 +1.040070000000000050e+00 -4.721875000000000000e+01 +1.040075000000000083e+00 -4.718750381469726562e+01 +1.040080000000000116e+00 -4.718750381469726562e+01 +1.040085000000000148e+00 -4.721875000000000000e+01 +1.040090000000000181e+00 -4.721875000000000000e+01 +1.040094999999999992e+00 -4.715625381469726562e+01 +1.040100000000000025e+00 -4.712500000000000000e+01 +1.040105000000000057e+00 -4.718750381469726562e+01 +1.040110000000000090e+00 -4.718750381469726562e+01 +1.040115000000000123e+00 -4.712500000000000000e+01 +1.040120000000000156e+00 -4.715625381469726562e+01 +1.040125000000000188e+00 -4.715625381469726562e+01 +1.040129999999999999e+00 -4.718750381469726562e+01 +1.040135000000000032e+00 -4.718750381469726562e+01 +1.040140000000000065e+00 -4.709375381469726562e+01 +1.040145000000000097e+00 -4.712500000000000000e+01 +1.040150000000000130e+00 -4.715625381469726562e+01 +1.040155000000000163e+00 -4.712500000000000000e+01 +1.040160000000000196e+00 -4.715625381469726562e+01 +1.040165000000000006e+00 -4.715625381469726562e+01 +1.040170000000000039e+00 -4.715625381469726562e+01 +1.040175000000000072e+00 -4.715625381469726562e+01 +1.040180000000000105e+00 -4.703125381469726562e+01 +1.040185000000000137e+00 -4.709375381469726562e+01 +1.040190000000000170e+00 -4.709375381469726562e+01 +1.040194999999999981e+00 -4.706250000000000000e+01 +1.040200000000000014e+00 -4.706250000000000000e+01 +1.040205000000000046e+00 -4.703125381469726562e+01 +1.040210000000000079e+00 -4.700000381469726562e+01 +1.040215000000000112e+00 -4.709375381469726562e+01 +1.040220000000000145e+00 -4.700000381469726562e+01 +1.040225000000000177e+00 -4.703125381469726562e+01 +1.040229999999999988e+00 -4.700000381469726562e+01 +1.040235000000000021e+00 -4.703125381469726562e+01 +1.040240000000000054e+00 -4.700000381469726562e+01 +1.040245000000000086e+00 -4.700000381469726562e+01 +1.040250000000000119e+00 -4.696875000000000000e+01 +1.040255000000000152e+00 -4.709375381469726562e+01 +1.040260000000000185e+00 -4.700000381469726562e+01 +1.040264999999999995e+00 -4.700000381469726562e+01 +1.040270000000000028e+00 -4.693750381469726562e+01 +1.040275000000000061e+00 -4.700000381469726562e+01 +1.040280000000000094e+00 -4.696875000000000000e+01 +1.040285000000000126e+00 -4.693750381469726562e+01 +1.040290000000000159e+00 -4.700000381469726562e+01 +1.040295000000000192e+00 -4.696875000000000000e+01 +1.040300000000000002e+00 -4.693750381469726562e+01 +1.040305000000000035e+00 -4.696875000000000000e+01 +1.040310000000000068e+00 -4.693750381469726562e+01 +1.040315000000000101e+00 -4.693750381469726562e+01 +1.040320000000000134e+00 -4.684375381469726562e+01 +1.040325000000000166e+00 -4.696875000000000000e+01 +1.040329999999999977e+00 -4.693750381469726562e+01 +1.040335000000000010e+00 -4.693750381469726562e+01 +1.040340000000000042e+00 -4.693750381469726562e+01 +1.040345000000000075e+00 -4.687500381469726562e+01 +1.040350000000000108e+00 -4.690625000000000000e+01 +1.040355000000000141e+00 -4.687500381469726562e+01 +1.040360000000000174e+00 -4.687500381469726562e+01 +1.040364999999999984e+00 -4.693750381469726562e+01 +1.040370000000000017e+00 -4.684375381469726562e+01 +1.040375000000000050e+00 -4.681250000000000000e+01 +1.040380000000000082e+00 -4.687500381469726562e+01 +1.040385000000000115e+00 -4.687500381469726562e+01 +1.040390000000000148e+00 -4.684375381469726562e+01 +1.040395000000000181e+00 -4.678125381469726562e+01 +1.040399999999999991e+00 -4.687500381469726562e+01 +1.040405000000000024e+00 -4.684375381469726562e+01 +1.040410000000000057e+00 -4.681250000000000000e+01 +1.040415000000000090e+00 -4.684375381469726562e+01 +1.040420000000000122e+00 -4.684375381469726562e+01 +1.040425000000000155e+00 -4.684375381469726562e+01 +1.040430000000000188e+00 -4.681250000000000000e+01 +1.040434999999999999e+00 -4.684375381469726562e+01 +1.040440000000000031e+00 -4.678125381469726562e+01 +1.040445000000000064e+00 -4.681250000000000000e+01 +1.040450000000000097e+00 -4.681250000000000000e+01 +1.040455000000000130e+00 -4.678125381469726562e+01 +1.040460000000000163e+00 -4.681250000000000000e+01 +1.040465000000000195e+00 -4.675000000000000000e+01 +1.040470000000000006e+00 -4.681250000000000000e+01 +1.040475000000000039e+00 -4.675000000000000000e+01 +1.040480000000000071e+00 -4.675000000000000000e+01 +1.040485000000000104e+00 -4.671875381469726562e+01 +1.040490000000000137e+00 -4.675000000000000000e+01 +1.040495000000000170e+00 -4.678125381469726562e+01 +1.040499999999999980e+00 -4.681250000000000000e+01 +1.040505000000000013e+00 -4.668750381469726562e+01 +1.040510000000000046e+00 -4.678125381469726562e+01 +1.040515000000000079e+00 -4.678125381469726562e+01 +1.040520000000000111e+00 -4.675000000000000000e+01 +1.040525000000000144e+00 -4.668750381469726562e+01 +1.040530000000000177e+00 -4.675000000000000000e+01 +1.040534999999999988e+00 -4.665625000000000000e+01 +1.040540000000000020e+00 -4.671875381469726562e+01 +1.040545000000000053e+00 -4.662500381469726562e+01 +1.040550000000000086e+00 -4.671875381469726562e+01 +1.040555000000000119e+00 -4.665625000000000000e+01 +1.040560000000000151e+00 -4.668750381469726562e+01 +1.040565000000000184e+00 -4.665625000000000000e+01 +1.040569999999999995e+00 -4.665625000000000000e+01 +1.040575000000000028e+00 -4.659375000000000000e+01 +1.040580000000000060e+00 -4.668750381469726562e+01 +1.040585000000000093e+00 -4.668750381469726562e+01 +1.040590000000000126e+00 -4.662500381469726562e+01 +1.040595000000000159e+00 -4.665625000000000000e+01 +1.040600000000000191e+00 -4.659375000000000000e+01 +1.040605000000000002e+00 -4.668750381469726562e+01 +1.040610000000000035e+00 -4.668750381469726562e+01 +1.040615000000000068e+00 -4.659375000000000000e+01 +1.040620000000000100e+00 -4.665625000000000000e+01 +1.040625000000000133e+00 -4.662500381469726562e+01 +1.040630000000000166e+00 -4.656250381469726562e+01 +1.040634999999999977e+00 -4.665625000000000000e+01 +1.040640000000000009e+00 -4.653125381469726562e+01 +1.040645000000000042e+00 -4.659375000000000000e+01 +1.040650000000000075e+00 -4.665625000000000000e+01 +1.040655000000000108e+00 -4.656250381469726562e+01 +1.040660000000000140e+00 -4.659375000000000000e+01 +1.040665000000000173e+00 -4.650000000000000000e+01 +1.040669999999999984e+00 -4.662500381469726562e+01 +1.040675000000000017e+00 -4.653125381469726562e+01 +1.040680000000000049e+00 -4.653125381469726562e+01 +1.040685000000000082e+00 -4.653125381469726562e+01 +1.040690000000000115e+00 -4.656250381469726562e+01 +1.040695000000000148e+00 -4.653125381469726562e+01 +1.040700000000000180e+00 -4.653125381469726562e+01 +1.040704999999999991e+00 -4.653125381469726562e+01 +1.040710000000000024e+00 -4.650000000000000000e+01 +1.040715000000000057e+00 -4.650000000000000000e+01 +1.040720000000000089e+00 -4.650000000000000000e+01 +1.040725000000000122e+00 -4.650000000000000000e+01 +1.040730000000000155e+00 -4.656250381469726562e+01 +1.040735000000000188e+00 -4.650000000000000000e+01 +1.040739999999999998e+00 -4.650000000000000000e+01 +1.040745000000000031e+00 -4.650000000000000000e+01 +1.040750000000000064e+00 -4.650000000000000000e+01 +1.040755000000000097e+00 -4.646875381469726562e+01 +1.040760000000000129e+00 -4.650000000000000000e+01 +1.040765000000000162e+00 -4.646875381469726562e+01 +1.040770000000000195e+00 -4.650000000000000000e+01 +1.040775000000000006e+00 -4.643750000000000000e+01 +1.040780000000000038e+00 -4.650000000000000000e+01 +1.040785000000000071e+00 -4.650000000000000000e+01 +1.040790000000000104e+00 -4.643750000000000000e+01 +1.040795000000000137e+00 -4.646875381469726562e+01 +1.040800000000000169e+00 -4.643750000000000000e+01 +1.040804999999999980e+00 -4.643750000000000000e+01 +1.040810000000000013e+00 -4.643750000000000000e+01 +1.040815000000000046e+00 -4.637500381469726562e+01 +1.040820000000000078e+00 -4.637500381469726562e+01 +1.040825000000000111e+00 -4.643750000000000000e+01 +1.040830000000000144e+00 -4.640625000000000000e+01 +1.040835000000000177e+00 -4.640625000000000000e+01 +1.040839999999999987e+00 -4.637500381469726562e+01 +1.040845000000000020e+00 -4.640625000000000000e+01 +1.040850000000000053e+00 -4.637500381469726562e+01 +1.040855000000000086e+00 -4.640625000000000000e+01 +1.040860000000000118e+00 -4.637500381469726562e+01 +1.040865000000000151e+00 -4.637500381469726562e+01 +1.040870000000000184e+00 -4.640625000000000000e+01 +1.040874999999999995e+00 -4.631250381469726562e+01 +1.040880000000000027e+00 -4.634375000000000000e+01 +1.040885000000000060e+00 -4.634375000000000000e+01 +1.040890000000000093e+00 -4.634375000000000000e+01 +1.040895000000000126e+00 -4.634375000000000000e+01 +1.040900000000000158e+00 -4.628125381469726562e+01 +1.040905000000000191e+00 -4.625000000000000000e+01 +1.040910000000000002e+00 -4.621875381469726562e+01 +1.040915000000000035e+00 -4.628125381469726562e+01 +1.040920000000000067e+00 -4.628125381469726562e+01 +1.040925000000000100e+00 -4.621875381469726562e+01 +1.040930000000000133e+00 -4.625000000000000000e+01 +1.040935000000000166e+00 -4.628125381469726562e+01 +1.040939999999999976e+00 -4.628125381469726562e+01 +1.040945000000000009e+00 -4.625000000000000000e+01 +1.040950000000000042e+00 -4.621875381469726562e+01 +1.040955000000000075e+00 -4.621875381469726562e+01 +1.040960000000000107e+00 -4.621875381469726562e+01 +1.040965000000000140e+00 -4.625000000000000000e+01 +1.040970000000000173e+00 -4.628125381469726562e+01 +1.040974999999999984e+00 -4.612500381469726562e+01 +1.040980000000000016e+00 -4.625000000000000000e+01 +1.040985000000000049e+00 -4.615625381469726562e+01 +1.040990000000000082e+00 -4.612500381469726562e+01 +1.040995000000000115e+00 -4.615625381469726562e+01 +1.041000000000000147e+00 -4.615625381469726562e+01 +1.041005000000000180e+00 -4.612500381469726562e+01 +1.041009999999999991e+00 -4.618750000000000000e+01 +1.041015000000000024e+00 -4.612500381469726562e+01 +1.041020000000000056e+00 -4.618750000000000000e+01 +1.041025000000000089e+00 -4.615625381469726562e+01 +1.041030000000000122e+00 -4.621875381469726562e+01 +1.041035000000000155e+00 -4.612500381469726562e+01 +1.041040000000000187e+00 -4.615625381469726562e+01 +1.041044999999999998e+00 -4.615625381469726562e+01 +1.041050000000000031e+00 -4.615625381469726562e+01 +1.041055000000000064e+00 -4.612500381469726562e+01 +1.041060000000000096e+00 -4.612500381469726562e+01 +1.041065000000000129e+00 -4.606250381469726562e+01 +1.041070000000000162e+00 -4.612500381469726562e+01 +1.041075000000000195e+00 -4.609375000000000000e+01 +1.041080000000000005e+00 -4.600000381469726562e+01 +1.041085000000000038e+00 -4.609375000000000000e+01 +1.041090000000000071e+00 -4.606250381469726562e+01 +1.041095000000000104e+00 -4.612500381469726562e+01 +1.041100000000000136e+00 -4.606250381469726562e+01 +1.041105000000000169e+00 -4.606250381469726562e+01 +1.041109999999999980e+00 -4.609375000000000000e+01 +1.041115000000000013e+00 -4.603125000000000000e+01 +1.041120000000000045e+00 -4.609375000000000000e+01 +1.041125000000000078e+00 -4.603125000000000000e+01 +1.041130000000000111e+00 -4.600000381469726562e+01 +1.041135000000000144e+00 -4.606250381469726562e+01 +1.041140000000000176e+00 -4.603125000000000000e+01 +1.041144999999999987e+00 -4.609375000000000000e+01 +1.041150000000000020e+00 -4.603125000000000000e+01 +1.041155000000000053e+00 -4.603125000000000000e+01 +1.041160000000000085e+00 -4.600000381469726562e+01 +1.041165000000000118e+00 -4.600000381469726562e+01 +1.041170000000000151e+00 -4.600000381469726562e+01 +1.041175000000000184e+00 -4.600000381469726562e+01 +1.041179999999999994e+00 -4.593750000000000000e+01 +1.041185000000000027e+00 -4.600000381469726562e+01 +1.041190000000000060e+00 -4.596875381469726562e+01 +1.041195000000000093e+00 -4.587500000000000000e+01 +1.041200000000000125e+00 -4.600000381469726562e+01 +1.041205000000000158e+00 -4.596875381469726562e+01 +1.041210000000000191e+00 -4.603125000000000000e+01 +1.041215000000000002e+00 -4.593750000000000000e+01 +1.041220000000000034e+00 -4.590625381469726562e+01 +1.041225000000000067e+00 -4.593750000000000000e+01 +1.041230000000000100e+00 -4.584375381469726562e+01 +1.041235000000000133e+00 -4.590625381469726562e+01 +1.041240000000000165e+00 -4.590625381469726562e+01 +1.041244999999999976e+00 -4.590625381469726562e+01 +1.041250000000000009e+00 -4.590625381469726562e+01 +1.041255000000000042e+00 -4.593750000000000000e+01 +1.041260000000000074e+00 -4.593750000000000000e+01 +1.041265000000000107e+00 -4.587500000000000000e+01 +1.041270000000000140e+00 -4.584375381469726562e+01 +1.041275000000000173e+00 -4.581250381469726562e+01 +1.041279999999999983e+00 -4.584375381469726562e+01 +1.041285000000000016e+00 -4.581250381469726562e+01 +1.041290000000000049e+00 -4.590625381469726562e+01 +1.041295000000000082e+00 -4.578125000000000000e+01 +1.041300000000000114e+00 -4.584375381469726562e+01 +1.041305000000000147e+00 -4.584375381469726562e+01 +1.041310000000000180e+00 -4.584375381469726562e+01 +1.041314999999999991e+00 -4.584375381469726562e+01 +1.041320000000000023e+00 -4.578125000000000000e+01 +1.041325000000000056e+00 -4.581250381469726562e+01 +1.041330000000000089e+00 -4.578125000000000000e+01 +1.041335000000000122e+00 -4.581250381469726562e+01 +1.041340000000000154e+00 -4.578125000000000000e+01 +1.041345000000000187e+00 -4.581250381469726562e+01 +1.041349999999999998e+00 -4.571875000000000000e+01 +1.041355000000000031e+00 -4.565625381469726562e+01 +1.041360000000000063e+00 -4.571875000000000000e+01 +1.041365000000000096e+00 -4.578125000000000000e+01 +1.041370000000000129e+00 -4.571875000000000000e+01 +1.041375000000000162e+00 -4.575000381469726562e+01 +1.041380000000000194e+00 -4.571875000000000000e+01 +1.041385000000000005e+00 -4.571875000000000000e+01 +1.041390000000000038e+00 -4.575000381469726562e+01 +1.041395000000000071e+00 -4.575000381469726562e+01 +1.041400000000000103e+00 -4.568750000000000000e+01 +1.041405000000000136e+00 -4.565625381469726562e+01 +1.041410000000000169e+00 -4.565625381469726562e+01 +1.041414999999999980e+00 -4.575000381469726562e+01 +1.041420000000000012e+00 -4.568750000000000000e+01 +1.041425000000000045e+00 -4.565625381469726562e+01 +1.041430000000000078e+00 -4.565625381469726562e+01 +1.041435000000000111e+00 -4.565625381469726562e+01 +1.041440000000000143e+00 -4.571875000000000000e+01 +1.041445000000000176e+00 -4.565625381469726562e+01 +1.041449999999999987e+00 -4.559375381469726562e+01 +1.041455000000000020e+00 -4.562500000000000000e+01 +1.041460000000000052e+00 -4.559375381469726562e+01 +1.041465000000000085e+00 -4.559375381469726562e+01 +1.041470000000000118e+00 -4.559375381469726562e+01 +1.041475000000000151e+00 -4.562500000000000000e+01 +1.041480000000000183e+00 -4.556250381469726562e+01 +1.041484999999999994e+00 -4.556250381469726562e+01 +1.041490000000000027e+00 -4.559375381469726562e+01 +1.041495000000000060e+00 -4.568750000000000000e+01 +1.041500000000000092e+00 -4.559375381469726562e+01 +1.041505000000000125e+00 -4.553125000000000000e+01 +1.041510000000000158e+00 -4.559375381469726562e+01 +1.041515000000000191e+00 -4.562500000000000000e+01 +1.041520000000000001e+00 -4.553125000000000000e+01 +1.041525000000000034e+00 -4.556250381469726562e+01 +1.041530000000000067e+00 -4.559375381469726562e+01 +1.041535000000000100e+00 -4.553125000000000000e+01 +1.041540000000000132e+00 -4.559375381469726562e+01 +1.041545000000000165e+00 -4.550000381469726562e+01 +1.041549999999999976e+00 -4.556250381469726562e+01 +1.041555000000000009e+00 -4.553125000000000000e+01 +1.041560000000000041e+00 -4.553125000000000000e+01 +1.041565000000000074e+00 -4.553125000000000000e+01 +1.041570000000000107e+00 -4.550000381469726562e+01 +1.041575000000000140e+00 -4.553125000000000000e+01 +1.041580000000000172e+00 -4.553125000000000000e+01 +1.041584999999999983e+00 -4.550000381469726562e+01 +1.041590000000000016e+00 -4.550000381469726562e+01 +1.041595000000000049e+00 -4.550000381469726562e+01 +1.041600000000000081e+00 -4.546875000000000000e+01 +1.041605000000000114e+00 -4.550000381469726562e+01 +1.041610000000000147e+00 -4.546875000000000000e+01 +1.041615000000000180e+00 -4.546875000000000000e+01 +1.041619999999999990e+00 -4.546875000000000000e+01 +1.041625000000000023e+00 -4.540625381469726562e+01 +1.041630000000000056e+00 -4.543750381469726562e+01 +1.041635000000000089e+00 -4.546875000000000000e+01 +1.041640000000000121e+00 -4.546875000000000000e+01 +1.041645000000000154e+00 -4.540625381469726562e+01 +1.041650000000000187e+00 -4.550000381469726562e+01 +1.041654999999999998e+00 -4.546875000000000000e+01 +1.041660000000000030e+00 -4.543750381469726562e+01 +1.041665000000000063e+00 -4.537500000000000000e+01 +1.041670000000000096e+00 -4.540625381469726562e+01 +1.041675000000000129e+00 -4.540625381469726562e+01 +1.041680000000000161e+00 -4.537500000000000000e+01 +1.041685000000000194e+00 -4.537500000000000000e+01 +1.041690000000000005e+00 -4.540625381469726562e+01 +1.041695000000000038e+00 -4.540625381469726562e+01 +1.041700000000000070e+00 -4.534375381469726562e+01 +1.041705000000000103e+00 -4.537500000000000000e+01 +1.041710000000000136e+00 -4.537500000000000000e+01 +1.041715000000000169e+00 -4.534375381469726562e+01 +1.041719999999999979e+00 -4.534375381469726562e+01 +1.041725000000000012e+00 -4.531250000000000000e+01 +1.041730000000000045e+00 -4.531250000000000000e+01 +1.041735000000000078e+00 -4.528125381469726562e+01 +1.041740000000000110e+00 -4.540625381469726562e+01 +1.041745000000000143e+00 -4.537500000000000000e+01 +1.041750000000000176e+00 -4.540625381469726562e+01 +1.041754999999999987e+00 -4.525000381469726562e+01 +1.041760000000000019e+00 -4.528125381469726562e+01 +1.041765000000000052e+00 -4.528125381469726562e+01 +1.041770000000000085e+00 -4.534375381469726562e+01 +1.041775000000000118e+00 -4.528125381469726562e+01 +1.041780000000000150e+00 -4.528125381469726562e+01 +1.041785000000000183e+00 -4.521875000000000000e+01 +1.041789999999999994e+00 -4.528125381469726562e+01 +1.041795000000000027e+00 -4.534375381469726562e+01 +1.041800000000000059e+00 -4.521875000000000000e+01 +1.041805000000000092e+00 -4.521875000000000000e+01 +1.041810000000000125e+00 -4.534375381469726562e+01 +1.041815000000000158e+00 -4.525000381469726562e+01 +1.041820000000000190e+00 -4.521875000000000000e+01 +1.041825000000000001e+00 -4.521875000000000000e+01 +1.041830000000000034e+00 -4.521875000000000000e+01 +1.041835000000000067e+00 -4.525000381469726562e+01 +1.041840000000000099e+00 -4.518750381469726562e+01 +1.041845000000000132e+00 -4.525000381469726562e+01 +1.041850000000000165e+00 -4.521875000000000000e+01 +1.041854999999999976e+00 -4.518750381469726562e+01 +1.041860000000000008e+00 -4.515625000000000000e+01 +1.041865000000000041e+00 -4.521875000000000000e+01 +1.041870000000000074e+00 -4.515625000000000000e+01 +1.041875000000000107e+00 -4.518750381469726562e+01 +1.041880000000000139e+00 -4.515625000000000000e+01 +1.041885000000000172e+00 -4.512500381469726562e+01 +1.041889999999999983e+00 -4.512500381469726562e+01 +1.041895000000000016e+00 -4.521875000000000000e+01 +1.041900000000000048e+00 -4.521875000000000000e+01 +1.041905000000000081e+00 -4.525000381469726562e+01 +1.041910000000000114e+00 -4.512500381469726562e+01 +1.041915000000000147e+00 -4.506250000000000000e+01 +1.041920000000000179e+00 -4.518750381469726562e+01 +1.041924999999999990e+00 -4.509375381469726562e+01 +1.041930000000000023e+00 -4.518750381469726562e+01 +1.041935000000000056e+00 -4.515625000000000000e+01 +1.041940000000000088e+00 -4.515625000000000000e+01 +1.041945000000000121e+00 -4.515625000000000000e+01 +1.041950000000000154e+00 -4.509375381469726562e+01 +1.041955000000000187e+00 -4.506250000000000000e+01 +1.041959999999999997e+00 -4.512500381469726562e+01 +1.041965000000000030e+00 -4.509375381469726562e+01 +1.041970000000000063e+00 -4.506250000000000000e+01 +1.041975000000000096e+00 -4.509375381469726562e+01 +1.041980000000000128e+00 -4.506250000000000000e+01 +1.041985000000000161e+00 -4.509375381469726562e+01 +1.041990000000000194e+00 -4.506250000000000000e+01 +1.041995000000000005e+00 -4.506250000000000000e+01 +1.042000000000000037e+00 -4.503125381469726562e+01 +1.042005000000000070e+00 -4.506250000000000000e+01 +1.042010000000000103e+00 -4.500000000000000000e+01 +1.042015000000000136e+00 -4.503125381469726562e+01 +1.042020000000000168e+00 -4.503125381469726562e+01 +1.042024999999999979e+00 -4.503125381469726562e+01 +1.042030000000000012e+00 -4.500000000000000000e+01 +1.042035000000000045e+00 -4.506250000000000000e+01 +1.042040000000000077e+00 -4.506250000000000000e+01 +1.042045000000000110e+00 -4.500000000000000000e+01 +1.042050000000000143e+00 -4.500000000000000000e+01 +1.042055000000000176e+00 -4.500000000000000000e+01 +1.042059999999999986e+00 -4.503125381469726562e+01 +1.042065000000000019e+00 -4.493750381469726562e+01 +1.042070000000000052e+00 -4.503125381469726562e+01 +1.042075000000000085e+00 -4.496875000000000000e+01 +1.042080000000000117e+00 -4.500000000000000000e+01 +1.042085000000000150e+00 -4.503125381469726562e+01 +1.042090000000000183e+00 -4.500000000000000000e+01 +1.042094999999999994e+00 -4.503125381469726562e+01 +1.042100000000000026e+00 -4.500000000000000000e+01 +1.042105000000000059e+00 -4.500000000000000000e+01 +1.042110000000000092e+00 -4.493750381469726562e+01 +1.042115000000000125e+00 -4.496875000000000000e+01 +1.042120000000000157e+00 -4.493750381469726562e+01 +1.042125000000000190e+00 -4.493750381469726562e+01 +1.042130000000000001e+00 -4.500000000000000000e+01 +1.042135000000000034e+00 -4.496875000000000000e+01 +1.042140000000000066e+00 -4.493750381469726562e+01 +1.042145000000000099e+00 -4.490625000000000000e+01 +1.042150000000000132e+00 -4.493750381469726562e+01 +1.042155000000000165e+00 -4.490625000000000000e+01 +1.042159999999999975e+00 -4.490625000000000000e+01 +1.042165000000000008e+00 -4.487500381469726562e+01 +1.042170000000000041e+00 -4.493750381469726562e+01 +1.042175000000000074e+00 -4.490625000000000000e+01 +1.042180000000000106e+00 -4.493750381469726562e+01 +1.042185000000000139e+00 -4.493750381469726562e+01 +1.042190000000000172e+00 -4.487500381469726562e+01 +1.042194999999999983e+00 -4.487500381469726562e+01 +1.042200000000000015e+00 -4.490625000000000000e+01 +1.042205000000000048e+00 -4.484375381469726562e+01 +1.042210000000000081e+00 -4.484375381469726562e+01 +1.042215000000000114e+00 -4.487500381469726562e+01 +1.042220000000000146e+00 -4.484375381469726562e+01 +1.042225000000000179e+00 -4.481250000000000000e+01 +1.042229999999999990e+00 -4.484375381469726562e+01 +1.042235000000000023e+00 -4.481250000000000000e+01 +1.042240000000000055e+00 -4.484375381469726562e+01 +1.042245000000000088e+00 -4.478125381469726562e+01 +1.042250000000000121e+00 -4.484375381469726562e+01 +1.042255000000000154e+00 -4.481250000000000000e+01 +1.042260000000000186e+00 -4.471875381469726562e+01 +1.042264999999999997e+00 -4.468750381469726562e+01 +1.042270000000000030e+00 -4.484375381469726562e+01 +1.042275000000000063e+00 -4.478125381469726562e+01 +1.042280000000000095e+00 -4.478125381469726562e+01 +1.042285000000000128e+00 -4.471875381469726562e+01 +1.042290000000000161e+00 -4.478125381469726562e+01 +1.042295000000000194e+00 -4.471875381469726562e+01 +1.042300000000000004e+00 -4.484375381469726562e+01 +1.042305000000000037e+00 -4.478125381469726562e+01 +1.042310000000000070e+00 -4.471875381469726562e+01 +1.042315000000000103e+00 -4.471875381469726562e+01 +1.042320000000000135e+00 -4.484375381469726562e+01 +1.042325000000000168e+00 -4.465625000000000000e+01 +1.042329999999999979e+00 -4.471875381469726562e+01 +1.042335000000000012e+00 -4.471875381469726562e+01 +1.042340000000000044e+00 -4.475000000000000000e+01 +1.042345000000000077e+00 -4.478125381469726562e+01 +1.042350000000000110e+00 -4.465625000000000000e+01 +1.042355000000000143e+00 -4.475000000000000000e+01 +1.042360000000000175e+00 -4.468750381469726562e+01 +1.042364999999999986e+00 -4.468750381469726562e+01 +1.042370000000000019e+00 -4.465625000000000000e+01 +1.042375000000000052e+00 -4.468750381469726562e+01 +1.042380000000000084e+00 -4.468750381469726562e+01 +1.042385000000000117e+00 -4.468750381469726562e+01 +1.042390000000000150e+00 -4.462500381469726562e+01 +1.042395000000000183e+00 -4.465625000000000000e+01 +1.042399999999999993e+00 -4.468750381469726562e+01 +1.042405000000000026e+00 -4.465625000000000000e+01 +1.042410000000000059e+00 -4.465625000000000000e+01 +1.042415000000000092e+00 -4.459375000000000000e+01 +1.042420000000000124e+00 -4.465625000000000000e+01 +1.042425000000000157e+00 -4.465625000000000000e+01 +1.042430000000000190e+00 -4.459375000000000000e+01 +1.042435000000000000e+00 -4.462500381469726562e+01 +1.042440000000000033e+00 -4.456250381469726562e+01 +1.042445000000000066e+00 -4.456250381469726562e+01 +1.042450000000000099e+00 -4.459375000000000000e+01 +1.042455000000000132e+00 -4.459375000000000000e+01 +1.042460000000000164e+00 -4.456250381469726562e+01 +1.042464999999999975e+00 -4.456250381469726562e+01 +1.042470000000000008e+00 -4.450000000000000000e+01 +1.042475000000000041e+00 -4.453125381469726562e+01 +1.042480000000000073e+00 -4.453125381469726562e+01 +1.042485000000000106e+00 -4.456250381469726562e+01 +1.042490000000000139e+00 -4.456250381469726562e+01 +1.042495000000000172e+00 -4.450000000000000000e+01 +1.042499999999999982e+00 -4.450000000000000000e+01 +1.042505000000000015e+00 -4.450000000000000000e+01 +1.042510000000000048e+00 -4.453125381469726562e+01 +1.042515000000000081e+00 -4.446875381469726562e+01 +1.042520000000000113e+00 -4.450000000000000000e+01 +1.042525000000000146e+00 -4.456250381469726562e+01 +1.042530000000000179e+00 -4.450000000000000000e+01 +1.042534999999999989e+00 -4.450000000000000000e+01 +1.042540000000000022e+00 -4.443750000000000000e+01 +1.042545000000000055e+00 -4.446875381469726562e+01 +1.042550000000000088e+00 -4.450000000000000000e+01 +1.042555000000000121e+00 -4.450000000000000000e+01 +1.042560000000000153e+00 -4.450000000000000000e+01 +1.042565000000000186e+00 -4.446875381469726562e+01 +1.042569999999999997e+00 -4.446875381469726562e+01 +1.042575000000000029e+00 -4.440625381469726562e+01 +1.042580000000000062e+00 -4.437500381469726562e+01 +1.042585000000000095e+00 -4.443750000000000000e+01 +1.042590000000000128e+00 -4.446875381469726562e+01 +1.042595000000000161e+00 -4.443750000000000000e+01 +1.042600000000000193e+00 -4.440625381469726562e+01 +1.042605000000000004e+00 -4.440625381469726562e+01 +1.042610000000000037e+00 -4.440625381469726562e+01 +1.042615000000000069e+00 -4.443750000000000000e+01 +1.042620000000000102e+00 -4.440625381469726562e+01 +1.042625000000000135e+00 -4.437500381469726562e+01 +1.042630000000000168e+00 -4.443750000000000000e+01 +1.042634999999999978e+00 -4.437500381469726562e+01 +1.042640000000000011e+00 -4.434375000000000000e+01 +1.042645000000000044e+00 -4.434375000000000000e+01 +1.042650000000000077e+00 -4.440625381469726562e+01 +1.042655000000000109e+00 -4.434375000000000000e+01 +1.042660000000000142e+00 -4.431250381469726562e+01 +1.042665000000000175e+00 -4.440625381469726562e+01 +1.042669999999999986e+00 -4.437500381469726562e+01 +1.042675000000000018e+00 -4.431250381469726562e+01 +1.042680000000000051e+00 -4.425000000000000000e+01 +1.042685000000000084e+00 -4.434375000000000000e+01 +1.042690000000000117e+00 -4.431250381469726562e+01 +1.042695000000000149e+00 -4.431250381469726562e+01 +1.042700000000000182e+00 -4.428125000000000000e+01 +1.042704999999999993e+00 -4.434375000000000000e+01 +1.042710000000000026e+00 -4.434375000000000000e+01 +1.042715000000000058e+00 -4.428125000000000000e+01 +1.042720000000000091e+00 -4.428125000000000000e+01 +1.042725000000000124e+00 -4.428125000000000000e+01 +1.042730000000000157e+00 -4.431250381469726562e+01 +1.042735000000000190e+00 -4.431250381469726562e+01 +1.042740000000000000e+00 -4.428125000000000000e+01 +1.042745000000000033e+00 -4.421875381469726562e+01 +1.042750000000000066e+00 -4.431250381469726562e+01 +1.042755000000000098e+00 -4.421875381469726562e+01 +1.042760000000000131e+00 -4.428125000000000000e+01 +1.042765000000000164e+00 -4.421875381469726562e+01 +1.042769999999999975e+00 -4.418750000000000000e+01 +1.042775000000000007e+00 -4.421875381469726562e+01 +1.042780000000000040e+00 -4.421875381469726562e+01 +1.042785000000000073e+00 -4.421875381469726562e+01 +1.042790000000000106e+00 -4.421875381469726562e+01 +1.042795000000000138e+00 -4.412500000000000000e+01 +1.042800000000000171e+00 -4.425000000000000000e+01 +1.042804999999999982e+00 -4.418750000000000000e+01 +1.042810000000000015e+00 -4.418750000000000000e+01 +1.042815000000000047e+00 -4.418750000000000000e+01 +1.042820000000000080e+00 -4.415625381469726562e+01 +1.042825000000000113e+00 -4.412500000000000000e+01 +1.042830000000000146e+00 -4.415625381469726562e+01 +1.042835000000000178e+00 -4.412500000000000000e+01 +1.042839999999999989e+00 -4.415625381469726562e+01 +1.042845000000000022e+00 -4.412500000000000000e+01 +1.042850000000000055e+00 -4.418750000000000000e+01 +1.042855000000000087e+00 -4.418750000000000000e+01 +1.042860000000000120e+00 -4.418750000000000000e+01 +1.042865000000000153e+00 -4.415625381469726562e+01 +1.042870000000000186e+00 -4.412500000000000000e+01 +1.042874999999999996e+00 -4.406250381469726562e+01 +1.042880000000000029e+00 -4.409375000000000000e+01 +1.042885000000000062e+00 -4.409375000000000000e+01 +1.042890000000000095e+00 -4.409375000000000000e+01 +1.042895000000000127e+00 -4.409375000000000000e+01 +1.042900000000000160e+00 -4.409375000000000000e+01 +1.042905000000000193e+00 -4.418750000000000000e+01 +1.042910000000000004e+00 -4.409375000000000000e+01 +1.042915000000000036e+00 -4.415625381469726562e+01 +1.042920000000000069e+00 -4.403125000000000000e+01 +1.042925000000000102e+00 -4.406250381469726562e+01 +1.042930000000000135e+00 -4.409375000000000000e+01 +1.042935000000000167e+00 -4.406250381469726562e+01 +1.042939999999999978e+00 -4.406250381469726562e+01 +1.042945000000000011e+00 -4.403125000000000000e+01 +1.042950000000000044e+00 -4.403125000000000000e+01 +1.042955000000000076e+00 -4.403125000000000000e+01 +1.042960000000000109e+00 -4.403125000000000000e+01 +1.042965000000000142e+00 -4.403125000000000000e+01 +1.042970000000000175e+00 -4.403125000000000000e+01 +1.042974999999999985e+00 -4.403125000000000000e+01 +1.042980000000000018e+00 -4.400000381469726562e+01 +1.042985000000000051e+00 -4.400000381469726562e+01 +1.042990000000000084e+00 -4.403125000000000000e+01 +1.042995000000000116e+00 -4.403125000000000000e+01 +1.043000000000000149e+00 -4.393750000000000000e+01 +1.043005000000000182e+00 -4.400000381469726562e+01 +1.043009999999999993e+00 -4.396875381469726562e+01 +1.043015000000000025e+00 -4.403125000000000000e+01 +1.043020000000000058e+00 -4.393750000000000000e+01 +1.043025000000000091e+00 -4.390625381469726562e+01 +1.043030000000000124e+00 -4.390625381469726562e+01 +1.043035000000000156e+00 -4.396875381469726562e+01 +1.043040000000000189e+00 -4.396875381469726562e+01 +1.043045000000000000e+00 -4.396875381469726562e+01 +1.043050000000000033e+00 -4.400000381469726562e+01 +1.043055000000000065e+00 -4.396875381469726562e+01 +1.043060000000000098e+00 -4.390625381469726562e+01 +1.043065000000000131e+00 -4.390625381469726562e+01 +1.043070000000000164e+00 -4.390625381469726562e+01 +1.043074999999999974e+00 -4.393750000000000000e+01 +1.043080000000000007e+00 -4.387500000000000000e+01 +1.043085000000000040e+00 -4.393750000000000000e+01 +1.043090000000000073e+00 -4.390625381469726562e+01 +1.043095000000000105e+00 -4.396875381469726562e+01 +1.043100000000000138e+00 -4.390625381469726562e+01 +1.043105000000000171e+00 -4.390625381469726562e+01 +1.043109999999999982e+00 -4.390625381469726562e+01 +1.043115000000000014e+00 -4.393750000000000000e+01 +1.043120000000000047e+00 -4.390625381469726562e+01 +1.043125000000000080e+00 -4.387500000000000000e+01 +1.043130000000000113e+00 -4.387500000000000000e+01 +1.043135000000000145e+00 -4.387500000000000000e+01 +1.043140000000000178e+00 -4.393750000000000000e+01 +1.043144999999999989e+00 -4.390625381469726562e+01 +1.043150000000000022e+00 -4.393750000000000000e+01 +1.043155000000000054e+00 -4.381250381469726562e+01 +1.043160000000000087e+00 -4.384375381469726562e+01 +1.043165000000000120e+00 -4.384375381469726562e+01 +1.043170000000000153e+00 -4.381250381469726562e+01 +1.043175000000000185e+00 -4.384375381469726562e+01 +1.043179999999999996e+00 -4.390625381469726562e+01 +1.043185000000000029e+00 -4.384375381469726562e+01 +1.043190000000000062e+00 -4.384375381469726562e+01 +1.043195000000000094e+00 -4.378125000000000000e+01 +1.043200000000000127e+00 -4.384375381469726562e+01 +1.043205000000000160e+00 -4.381250381469726562e+01 +1.043210000000000193e+00 -4.384375381469726562e+01 +1.043215000000000003e+00 -4.384375381469726562e+01 +1.043220000000000036e+00 -4.381250381469726562e+01 +1.043225000000000069e+00 -4.384375381469726562e+01 +1.043230000000000102e+00 -4.378125000000000000e+01 +1.043235000000000134e+00 -4.381250381469726562e+01 +1.043240000000000167e+00 -4.381250381469726562e+01 +1.043244999999999978e+00 -4.378125000000000000e+01 +1.043250000000000011e+00 -4.378125000000000000e+01 +1.043255000000000043e+00 -4.378125000000000000e+01 +1.043260000000000076e+00 -4.375000381469726562e+01 +1.043265000000000109e+00 -4.371875000000000000e+01 +1.043270000000000142e+00 -4.381250381469726562e+01 +1.043275000000000174e+00 -4.381250381469726562e+01 +1.043279999999999985e+00 -4.378125000000000000e+01 +1.043285000000000018e+00 -4.384375381469726562e+01 +1.043290000000000051e+00 -4.371875000000000000e+01 +1.043295000000000083e+00 -4.368750381469726562e+01 +1.043300000000000116e+00 -4.371875000000000000e+01 +1.043305000000000149e+00 -4.368750381469726562e+01 +1.043310000000000182e+00 -4.368750381469726562e+01 +1.043314999999999992e+00 -4.378125000000000000e+01 +1.043320000000000025e+00 -4.375000381469726562e+01 +1.043325000000000058e+00 -4.368750381469726562e+01 +1.043330000000000091e+00 -4.368750381469726562e+01 +1.043335000000000123e+00 -4.365625381469726562e+01 +1.043340000000000156e+00 -4.368750381469726562e+01 +1.043345000000000189e+00 -4.371875000000000000e+01 +1.043350000000000000e+00 -4.365625381469726562e+01 +1.043355000000000032e+00 -4.365625381469726562e+01 +1.043360000000000065e+00 -4.368750381469726562e+01 +1.043365000000000098e+00 -4.368750381469726562e+01 +1.043370000000000131e+00 -4.368750381469726562e+01 +1.043375000000000163e+00 -4.368750381469726562e+01 +1.043380000000000196e+00 -4.371875000000000000e+01 +1.043385000000000007e+00 -4.371875000000000000e+01 +1.043390000000000040e+00 -4.371875000000000000e+01 +1.043395000000000072e+00 -4.368750381469726562e+01 +1.043400000000000105e+00 -4.365625381469726562e+01 +1.043405000000000138e+00 -4.365625381469726562e+01 +1.043410000000000171e+00 -4.368750381469726562e+01 +1.043414999999999981e+00 -4.362500000000000000e+01 +1.043420000000000014e+00 -4.371875000000000000e+01 +1.043425000000000047e+00 -4.371875000000000000e+01 +1.043430000000000080e+00 -4.362500000000000000e+01 +1.043435000000000112e+00 -4.362500000000000000e+01 +1.043440000000000145e+00 -4.365625381469726562e+01 +1.043445000000000178e+00 -4.365625381469726562e+01 +1.043449999999999989e+00 -4.362500000000000000e+01 +1.043455000000000021e+00 -4.365625381469726562e+01 +1.043460000000000054e+00 -4.362500000000000000e+01 +1.043465000000000087e+00 -4.365625381469726562e+01 +1.043470000000000120e+00 -4.356250000000000000e+01 +1.043475000000000152e+00 -4.356250000000000000e+01 +1.043480000000000185e+00 -4.359375381469726562e+01 +1.043484999999999996e+00 -4.356250000000000000e+01 +1.043490000000000029e+00 -4.356250000000000000e+01 +1.043495000000000061e+00 -4.359375381469726562e+01 +1.043500000000000094e+00 -4.365625381469726562e+01 +1.043505000000000127e+00 -4.359375381469726562e+01 +1.043510000000000160e+00 -4.359375381469726562e+01 +1.043515000000000192e+00 -4.353125000000000000e+01 +1.043520000000000003e+00 -4.356250000000000000e+01 +1.043525000000000036e+00 -4.353125000000000000e+01 +1.043530000000000069e+00 -4.356250000000000000e+01 +1.043535000000000101e+00 -4.359375381469726562e+01 +1.043540000000000134e+00 -4.356250000000000000e+01 +1.043545000000000167e+00 -4.353125000000000000e+01 +1.043549999999999978e+00 -4.350000381469726562e+01 +1.043555000000000010e+00 -4.353125000000000000e+01 +1.043560000000000043e+00 -4.353125000000000000e+01 +1.043565000000000076e+00 -4.350000381469726562e+01 +1.043570000000000109e+00 -4.356250000000000000e+01 +1.043575000000000141e+00 -4.350000381469726562e+01 +1.043580000000000174e+00 -4.356250000000000000e+01 +1.043584999999999985e+00 -4.350000381469726562e+01 +1.043590000000000018e+00 -4.350000381469726562e+01 +1.043595000000000050e+00 -4.353125000000000000e+01 +1.043600000000000083e+00 -4.350000381469726562e+01 +1.043605000000000116e+00 -4.353125000000000000e+01 +1.043610000000000149e+00 -4.350000381469726562e+01 +1.043615000000000181e+00 -4.350000381469726562e+01 +1.043619999999999992e+00 -4.346875000000000000e+01 +1.043625000000000025e+00 -4.353125000000000000e+01 +1.043630000000000058e+00 -4.350000381469726562e+01 +1.043635000000000090e+00 -4.350000381469726562e+01 +1.043640000000000123e+00 -4.350000381469726562e+01 +1.043645000000000156e+00 -4.346875000000000000e+01 +1.043650000000000189e+00 -4.346875000000000000e+01 +1.043654999999999999e+00 -4.350000381469726562e+01 +1.043660000000000032e+00 -4.346875000000000000e+01 +1.043665000000000065e+00 -4.350000381469726562e+01 +1.043670000000000098e+00 -4.346875000000000000e+01 +1.043675000000000130e+00 -4.346875000000000000e+01 +1.043680000000000163e+00 -4.353125000000000000e+01 +1.043685000000000196e+00 -4.340625000000000000e+01 +1.043690000000000007e+00 -4.343750381469726562e+01 +1.043695000000000039e+00 -4.346875000000000000e+01 +1.043700000000000072e+00 -4.346875000000000000e+01 +1.043705000000000105e+00 -4.343750381469726562e+01 +1.043710000000000138e+00 -4.343750381469726562e+01 +1.043715000000000170e+00 -4.340625000000000000e+01 +1.043719999999999981e+00 -4.346875000000000000e+01 +1.043725000000000014e+00 -4.343750381469726562e+01 +1.043730000000000047e+00 -4.337500000000000000e+01 +1.043735000000000079e+00 -4.337500000000000000e+01 +1.043740000000000112e+00 -4.340625000000000000e+01 +1.043745000000000145e+00 -4.343750381469726562e+01 +1.043750000000000178e+00 -4.346875000000000000e+01 +1.043754999999999988e+00 -4.334375381469726562e+01 +1.043760000000000021e+00 -4.340625000000000000e+01 +1.043765000000000054e+00 -4.337500000000000000e+01 +1.043770000000000087e+00 -4.343750381469726562e+01 +1.043775000000000119e+00 -4.340625000000000000e+01 +1.043780000000000152e+00 -4.340625000000000000e+01 +1.043785000000000185e+00 -4.334375381469726562e+01 +1.043789999999999996e+00 -4.340625000000000000e+01 +1.043795000000000028e+00 -4.334375381469726562e+01 +1.043800000000000061e+00 -4.331250000000000000e+01 +1.043805000000000094e+00 -4.331250000000000000e+01 +1.043810000000000127e+00 -4.331250000000000000e+01 +1.043815000000000159e+00 -4.334375381469726562e+01 +1.043820000000000192e+00 -4.340625000000000000e+01 +1.043825000000000003e+00 -4.337500000000000000e+01 +1.043830000000000036e+00 -4.334375381469726562e+01 +1.043835000000000068e+00 -4.331250000000000000e+01 +1.043840000000000101e+00 -4.334375381469726562e+01 +1.043845000000000134e+00 -4.331250000000000000e+01 +1.043850000000000167e+00 -4.325000381469726562e+01 +1.043854999999999977e+00 -4.331250000000000000e+01 +1.043860000000000010e+00 -4.325000381469726562e+01 +1.043865000000000043e+00 -4.334375381469726562e+01 +1.043870000000000076e+00 -4.328125381469726562e+01 +1.043875000000000108e+00 -4.328125381469726562e+01 +1.043880000000000141e+00 -4.328125381469726562e+01 +1.043885000000000174e+00 -4.325000381469726562e+01 +1.043889999999999985e+00 -4.328125381469726562e+01 +1.043895000000000017e+00 -4.328125381469726562e+01 +1.043900000000000050e+00 -4.315625000000000000e+01 +1.043905000000000083e+00 -4.318750381469726562e+01 +1.043910000000000116e+00 -4.328125381469726562e+01 +1.043915000000000148e+00 -4.321875000000000000e+01 +1.043920000000000181e+00 -4.331250000000000000e+01 +1.043924999999999992e+00 -4.321875000000000000e+01 +1.043930000000000025e+00 -4.318750381469726562e+01 +1.043935000000000057e+00 -4.318750381469726562e+01 +1.043940000000000090e+00 -4.325000381469726562e+01 +1.043945000000000123e+00 -4.321875000000000000e+01 +1.043950000000000156e+00 -4.318750381469726562e+01 +1.043955000000000188e+00 -4.321875000000000000e+01 +1.043959999999999999e+00 -4.321875000000000000e+01 +1.043965000000000032e+00 -4.321875000000000000e+01 +1.043970000000000065e+00 -4.321875000000000000e+01 +1.043975000000000097e+00 -4.315625000000000000e+01 +1.043980000000000130e+00 -4.318750381469726562e+01 +1.043985000000000163e+00 -4.318750381469726562e+01 +1.043990000000000196e+00 -4.315625000000000000e+01 +1.043995000000000006e+00 -4.318750381469726562e+01 +1.044000000000000039e+00 -4.315625000000000000e+01 +1.044005000000000072e+00 -4.318750381469726562e+01 +1.044010000000000105e+00 -4.312500381469726562e+01 +1.044015000000000137e+00 -4.309375381469726562e+01 +1.044020000000000170e+00 -4.321875000000000000e+01 +1.044024999999999981e+00 -4.315625000000000000e+01 +1.044030000000000014e+00 -4.315625000000000000e+01 +1.044035000000000046e+00 -4.318750381469726562e+01 +1.044040000000000079e+00 -4.318750381469726562e+01 +1.044045000000000112e+00 -4.312500381469726562e+01 +1.044050000000000145e+00 -4.306250000000000000e+01 +1.044055000000000177e+00 -4.309375381469726562e+01 +1.044059999999999988e+00 -4.315625000000000000e+01 +1.044065000000000021e+00 -4.315625000000000000e+01 +1.044070000000000054e+00 -4.315625000000000000e+01 +1.044075000000000086e+00 -4.312500381469726562e+01 +1.044080000000000119e+00 -4.318750381469726562e+01 +1.044085000000000152e+00 -4.315625000000000000e+01 +1.044090000000000185e+00 -4.303125381469726562e+01 +1.044094999999999995e+00 -4.309375381469726562e+01 +1.044100000000000028e+00 -4.315625000000000000e+01 +1.044105000000000061e+00 -4.315625000000000000e+01 +1.044110000000000094e+00 -4.318750381469726562e+01 +1.044115000000000126e+00 -4.315625000000000000e+01 +1.044120000000000159e+00 -4.312500381469726562e+01 +1.044125000000000192e+00 -4.309375381469726562e+01 +1.044130000000000003e+00 -4.306250000000000000e+01 +1.044135000000000035e+00 -4.312500381469726562e+01 +1.044140000000000068e+00 -4.306250000000000000e+01 +1.044145000000000101e+00 -4.306250000000000000e+01 +1.044150000000000134e+00 -4.296875381469726562e+01 +1.044155000000000166e+00 -4.300000000000000000e+01 +1.044159999999999977e+00 -4.306250000000000000e+01 +1.044165000000000010e+00 -4.306250000000000000e+01 +1.044170000000000043e+00 -4.309375381469726562e+01 +1.044175000000000075e+00 -4.306250000000000000e+01 +1.044180000000000108e+00 -4.306250000000000000e+01 +1.044185000000000141e+00 -4.306250000000000000e+01 +1.044190000000000174e+00 -4.300000000000000000e+01 +1.044194999999999984e+00 -4.303125381469726562e+01 +1.044200000000000017e+00 -4.300000000000000000e+01 +1.044205000000000050e+00 -4.300000000000000000e+01 +1.044210000000000083e+00 -4.293750381469726562e+01 +1.044215000000000115e+00 -4.296875381469726562e+01 +1.044220000000000148e+00 -4.300000000000000000e+01 +1.044225000000000181e+00 -4.300000000000000000e+01 +1.044229999999999992e+00 -4.300000000000000000e+01 +1.044235000000000024e+00 -4.296875381469726562e+01 +1.044240000000000057e+00 -4.300000000000000000e+01 +1.044245000000000090e+00 -4.300000000000000000e+01 +1.044250000000000123e+00 -4.293750381469726562e+01 +1.044255000000000155e+00 -4.290625000000000000e+01 +1.044260000000000188e+00 -4.290625000000000000e+01 +1.044264999999999999e+00 -4.293750381469726562e+01 +1.044270000000000032e+00 -4.290625000000000000e+01 +1.044275000000000064e+00 -4.296875381469726562e+01 +1.044280000000000097e+00 -4.290625000000000000e+01 +1.044285000000000130e+00 -4.290625000000000000e+01 +1.044290000000000163e+00 -4.293750381469726562e+01 +1.044295000000000195e+00 -4.290625000000000000e+01 +1.044300000000000006e+00 -4.290625000000000000e+01 +1.044305000000000039e+00 -4.284375000000000000e+01 +1.044310000000000072e+00 -4.281250381469726562e+01 +1.044315000000000104e+00 -4.290625000000000000e+01 +1.044320000000000137e+00 -4.284375000000000000e+01 +1.044325000000000170e+00 -4.281250381469726562e+01 +1.044329999999999981e+00 -4.284375000000000000e+01 +1.044335000000000013e+00 -4.287500381469726562e+01 +1.044340000000000046e+00 -4.284375000000000000e+01 +1.044345000000000079e+00 -4.287500381469726562e+01 +1.044350000000000112e+00 -4.284375000000000000e+01 +1.044355000000000144e+00 -4.281250381469726562e+01 +1.044360000000000177e+00 -4.287500381469726562e+01 +1.044364999999999988e+00 -4.278125381469726562e+01 +1.044370000000000021e+00 -4.281250381469726562e+01 +1.044375000000000053e+00 -4.281250381469726562e+01 +1.044380000000000086e+00 -4.287500381469726562e+01 +1.044385000000000119e+00 -4.278125381469726562e+01 +1.044390000000000152e+00 -4.284375000000000000e+01 +1.044395000000000184e+00 -4.278125381469726562e+01 +1.044399999999999995e+00 -4.278125381469726562e+01 +1.044405000000000028e+00 -4.278125381469726562e+01 +1.044410000000000061e+00 -4.281250381469726562e+01 +1.044415000000000093e+00 -4.278125381469726562e+01 +1.044420000000000126e+00 -4.278125381469726562e+01 +1.044425000000000159e+00 -4.271875381469726562e+01 +1.044430000000000192e+00 -4.275000000000000000e+01 +1.044435000000000002e+00 -4.271875381469726562e+01 +1.044440000000000035e+00 -4.271875381469726562e+01 +1.044445000000000068e+00 -4.271875381469726562e+01 +1.044450000000000101e+00 -4.265625000000000000e+01 +1.044455000000000133e+00 -4.275000000000000000e+01 +1.044460000000000166e+00 -4.268750000000000000e+01 +1.044464999999999977e+00 -4.262500381469726562e+01 +1.044470000000000010e+00 -4.268750000000000000e+01 +1.044475000000000042e+00 -4.268750000000000000e+01 +1.044480000000000075e+00 -4.271875381469726562e+01 +1.044485000000000108e+00 -4.265625000000000000e+01 +1.044490000000000141e+00 -4.265625000000000000e+01 +1.044495000000000173e+00 -4.268750000000000000e+01 +1.044499999999999984e+00 -4.268750000000000000e+01 +1.044505000000000017e+00 -4.265625000000000000e+01 +1.044510000000000050e+00 -4.262500381469726562e+01 +1.044515000000000082e+00 -4.265625000000000000e+01 +1.044520000000000115e+00 -4.259375000000000000e+01 +1.044525000000000148e+00 -4.268750000000000000e+01 +1.044530000000000181e+00 -4.256250381469726562e+01 +1.044534999999999991e+00 -4.256250381469726562e+01 +1.044540000000000024e+00 -4.259375000000000000e+01 +1.044545000000000057e+00 -4.262500381469726562e+01 +1.044550000000000090e+00 -4.256250381469726562e+01 +1.044555000000000122e+00 -4.259375000000000000e+01 +1.044560000000000155e+00 -4.253125000000000000e+01 +1.044565000000000188e+00 -4.259375000000000000e+01 +1.044569999999999999e+00 -4.259375000000000000e+01 +1.044575000000000031e+00 -4.256250381469726562e+01 +1.044580000000000064e+00 -4.253125000000000000e+01 +1.044585000000000097e+00 -4.256250381469726562e+01 +1.044590000000000130e+00 -4.250000000000000000e+01 +1.044595000000000162e+00 -4.253125000000000000e+01 +1.044600000000000195e+00 -4.253125000000000000e+01 +1.044605000000000006e+00 -4.253125000000000000e+01 +1.044610000000000039e+00 -4.256250381469726562e+01 +1.044615000000000071e+00 -4.256250381469726562e+01 +1.044620000000000104e+00 -4.250000000000000000e+01 +1.044625000000000137e+00 -4.259375000000000000e+01 +1.044630000000000170e+00 -4.256250381469726562e+01 +1.044634999999999980e+00 -4.256250381469726562e+01 +1.044640000000000013e+00 -4.253125000000000000e+01 +1.044645000000000046e+00 -4.253125000000000000e+01 +1.044650000000000079e+00 -4.250000000000000000e+01 +1.044655000000000111e+00 -4.253125000000000000e+01 +1.044660000000000144e+00 -4.253125000000000000e+01 +1.044665000000000177e+00 -4.253125000000000000e+01 +1.044669999999999987e+00 -4.250000000000000000e+01 +1.044675000000000020e+00 -4.250000000000000000e+01 +1.044680000000000053e+00 -4.246875381469726562e+01 +1.044685000000000086e+00 -4.246875381469726562e+01 +1.044690000000000119e+00 -4.246875381469726562e+01 +1.044695000000000151e+00 -4.246875381469726562e+01 +1.044700000000000184e+00 -4.250000000000000000e+01 +1.044704999999999995e+00 -4.243750000000000000e+01 +1.044710000000000027e+00 -4.250000000000000000e+01 +1.044715000000000060e+00 -4.250000000000000000e+01 +1.044720000000000093e+00 -4.250000000000000000e+01 +1.044725000000000126e+00 -4.246875381469726562e+01 +1.044730000000000159e+00 -4.246875381469726562e+01 +1.044735000000000191e+00 -4.246875381469726562e+01 +1.044740000000000002e+00 -4.246875381469726562e+01 +1.044745000000000035e+00 -4.246875381469726562e+01 +1.044750000000000068e+00 -4.250000000000000000e+01 +1.044755000000000100e+00 -4.240625381469726562e+01 +1.044760000000000133e+00 -4.243750000000000000e+01 +1.044765000000000166e+00 -4.246875381469726562e+01 +1.044769999999999976e+00 -4.234375000000000000e+01 +1.044775000000000009e+00 -4.243750000000000000e+01 +1.044780000000000042e+00 -4.243750000000000000e+01 +1.044785000000000075e+00 -4.243750000000000000e+01 +1.044790000000000108e+00 -4.237500381469726562e+01 +1.044795000000000140e+00 -4.234375000000000000e+01 +1.044800000000000173e+00 -4.243750000000000000e+01 +1.044804999999999984e+00 -4.231250381469726562e+01 +1.044810000000000016e+00 -4.240625381469726562e+01 +1.044815000000000049e+00 -4.234375000000000000e+01 +1.044820000000000082e+00 -4.228125000000000000e+01 +1.044825000000000115e+00 -4.237500381469726562e+01 +1.044830000000000148e+00 -4.231250381469726562e+01 +1.044835000000000180e+00 -4.231250381469726562e+01 +1.044839999999999991e+00 -4.228125000000000000e+01 +1.044845000000000024e+00 -4.234375000000000000e+01 +1.044850000000000056e+00 -4.231250381469726562e+01 +1.044855000000000089e+00 -4.225000381469726562e+01 +1.044860000000000122e+00 -4.225000381469726562e+01 +1.044865000000000155e+00 -4.225000381469726562e+01 +1.044870000000000188e+00 -4.231250381469726562e+01 +1.044874999999999998e+00 -4.231250381469726562e+01 +1.044880000000000031e+00 -4.218750000000000000e+01 +1.044885000000000064e+00 -4.228125000000000000e+01 +1.044890000000000096e+00 -4.225000381469726562e+01 +1.044895000000000129e+00 -4.228125000000000000e+01 +1.044900000000000162e+00 -4.221875381469726562e+01 +1.044905000000000195e+00 -4.228125000000000000e+01 +1.044910000000000005e+00 -4.228125000000000000e+01 +1.044915000000000038e+00 -4.218750000000000000e+01 +1.044920000000000071e+00 -4.221875381469726562e+01 +1.044925000000000104e+00 -4.218750000000000000e+01 +1.044930000000000136e+00 -4.218750000000000000e+01 +1.044935000000000169e+00 -4.218750000000000000e+01 +1.044939999999999980e+00 -4.215625381469726562e+01 +1.044945000000000013e+00 -4.215625381469726562e+01 +1.044950000000000045e+00 -4.221875381469726562e+01 +1.044955000000000078e+00 -4.218750000000000000e+01 +1.044960000000000111e+00 -4.215625381469726562e+01 +1.044965000000000144e+00 -4.218750000000000000e+01 +1.044970000000000176e+00 -4.215625381469726562e+01 +1.044974999999999987e+00 -4.215625381469726562e+01 +1.044980000000000020e+00 -4.212500000000000000e+01 +1.044985000000000053e+00 -4.218750000000000000e+01 +1.044990000000000085e+00 -4.209375381469726562e+01 +1.044995000000000118e+00 -4.212500000000000000e+01 +1.045000000000000151e+00 -4.215625381469726562e+01 +1.045005000000000184e+00 -4.215625381469726562e+01 +1.045009999999999994e+00 -4.212500000000000000e+01 +1.045015000000000027e+00 -4.209375381469726562e+01 +1.045020000000000060e+00 -4.209375381469726562e+01 +1.045025000000000093e+00 -4.209375381469726562e+01 +1.045030000000000125e+00 -4.209375381469726562e+01 +1.045035000000000158e+00 -4.203125000000000000e+01 +1.045040000000000191e+00 -4.203125000000000000e+01 +1.045045000000000002e+00 -4.203125000000000000e+01 +1.045050000000000034e+00 -4.206250381469726562e+01 +1.045055000000000067e+00 -4.203125000000000000e+01 +1.045060000000000100e+00 -4.206250381469726562e+01 +1.045065000000000133e+00 -4.196875000000000000e+01 +1.045070000000000165e+00 -4.200000381469726562e+01 +1.045074999999999976e+00 -4.200000381469726562e+01 +1.045080000000000009e+00 -4.193750000000000000e+01 +1.045085000000000042e+00 -4.196875000000000000e+01 +1.045090000000000074e+00 -4.196875000000000000e+01 +1.045095000000000107e+00 -4.193750000000000000e+01 +1.045100000000000140e+00 -4.193750000000000000e+01 +1.045105000000000173e+00 -4.193750000000000000e+01 +1.045109999999999983e+00 -4.190625381469726562e+01 +1.045115000000000016e+00 -4.196875000000000000e+01 +1.045120000000000049e+00 -4.196875000000000000e+01 +1.045125000000000082e+00 -4.196875000000000000e+01 +1.045130000000000114e+00 -4.190625381469726562e+01 +1.045135000000000147e+00 -4.196875000000000000e+01 +1.045140000000000180e+00 -4.190625381469726562e+01 +1.045144999999999991e+00 -4.190625381469726562e+01 +1.045150000000000023e+00 -4.193750000000000000e+01 +1.045155000000000056e+00 -4.187500000000000000e+01 +1.045160000000000089e+00 -4.193750000000000000e+01 +1.045165000000000122e+00 -4.190625381469726562e+01 +1.045170000000000154e+00 -4.184375381469726562e+01 +1.045175000000000187e+00 -4.181250000000000000e+01 +1.045179999999999998e+00 -4.187500000000000000e+01 +1.045185000000000031e+00 -4.187500000000000000e+01 +1.045190000000000063e+00 -4.184375381469726562e+01 +1.045195000000000096e+00 -4.181250000000000000e+01 +1.045200000000000129e+00 -4.181250000000000000e+01 +1.045205000000000162e+00 -4.187500000000000000e+01 +1.045210000000000194e+00 -4.184375381469726562e+01 +1.045215000000000005e+00 -4.184375381469726562e+01 +1.045220000000000038e+00 -4.184375381469726562e+01 +1.045225000000000071e+00 -4.178125000000000000e+01 +1.045230000000000103e+00 -4.181250000000000000e+01 +1.045235000000000136e+00 -4.181250000000000000e+01 +1.045240000000000169e+00 -4.178125000000000000e+01 +1.045244999999999980e+00 -4.184375381469726562e+01 +1.045250000000000012e+00 -4.181250000000000000e+01 +1.045255000000000045e+00 -4.181250000000000000e+01 +1.045260000000000078e+00 -4.178125000000000000e+01 +1.045265000000000111e+00 -4.175000381469726562e+01 +1.045270000000000143e+00 -4.175000381469726562e+01 +1.045275000000000176e+00 -4.181250000000000000e+01 +1.045279999999999987e+00 -4.175000381469726562e+01 +1.045285000000000020e+00 -4.175000381469726562e+01 +1.045290000000000052e+00 -4.171875000000000000e+01 +1.045295000000000085e+00 -4.171875000000000000e+01 +1.045300000000000118e+00 -4.175000381469726562e+01 +1.045305000000000151e+00 -4.168750381469726562e+01 +1.045310000000000183e+00 -4.175000381469726562e+01 +1.045314999999999994e+00 -4.171875000000000000e+01 +1.045320000000000027e+00 -4.165625381469726562e+01 +1.045325000000000060e+00 -4.168750381469726562e+01 +1.045330000000000092e+00 -4.171875000000000000e+01 +1.045335000000000125e+00 -4.165625381469726562e+01 +1.045340000000000158e+00 -4.168750381469726562e+01 +1.045345000000000191e+00 -4.162500000000000000e+01 +1.045350000000000001e+00 -4.168750381469726562e+01 +1.045355000000000034e+00 -4.162500000000000000e+01 +1.045360000000000067e+00 -4.165625381469726562e+01 +1.045365000000000100e+00 -4.165625381469726562e+01 +1.045370000000000132e+00 -4.159375381469726562e+01 +1.045375000000000165e+00 -4.159375381469726562e+01 +1.045379999999999976e+00 -4.159375381469726562e+01 +1.045385000000000009e+00 -4.156250000000000000e+01 +1.045390000000000041e+00 -4.162500000000000000e+01 +1.045395000000000074e+00 -4.168750381469726562e+01 +1.045400000000000107e+00 -4.156250000000000000e+01 +1.045405000000000140e+00 -4.159375381469726562e+01 +1.045410000000000172e+00 -4.156250000000000000e+01 +1.045414999999999983e+00 -4.159375381469726562e+01 +1.045420000000000016e+00 -4.153125381469726562e+01 +1.045425000000000049e+00 -4.156250000000000000e+01 +1.045430000000000081e+00 -4.159375381469726562e+01 +1.045435000000000114e+00 -4.156250000000000000e+01 +1.045440000000000147e+00 -4.150000381469726562e+01 +1.045445000000000180e+00 -4.153125381469726562e+01 +1.045449999999999990e+00 -4.156250000000000000e+01 +1.045455000000000023e+00 -4.153125381469726562e+01 +1.045460000000000056e+00 -4.150000381469726562e+01 +1.045465000000000089e+00 -4.153125381469726562e+01 +1.045470000000000121e+00 -4.146875000000000000e+01 +1.045475000000000154e+00 -4.146875000000000000e+01 +1.045480000000000187e+00 -4.150000381469726562e+01 +1.045484999999999998e+00 -4.146875000000000000e+01 +1.045490000000000030e+00 -4.150000381469726562e+01 +1.045495000000000063e+00 -4.143750381469726562e+01 +1.045500000000000096e+00 -4.146875000000000000e+01 +1.045505000000000129e+00 -4.140625000000000000e+01 +1.045510000000000161e+00 -4.146875000000000000e+01 +1.045515000000000194e+00 -4.146875000000000000e+01 +1.045520000000000005e+00 -4.150000381469726562e+01 +1.045525000000000038e+00 -4.143750381469726562e+01 +1.045530000000000070e+00 -4.146875000000000000e+01 +1.045535000000000103e+00 -4.140625000000000000e+01 +1.045540000000000136e+00 -4.140625000000000000e+01 +1.045545000000000169e+00 -4.134375381469726562e+01 +1.045549999999999979e+00 -4.137500381469726562e+01 +1.045555000000000012e+00 -4.134375381469726562e+01 +1.045560000000000045e+00 -4.131250000000000000e+01 +1.045565000000000078e+00 -4.137500381469726562e+01 +1.045570000000000110e+00 -4.134375381469726562e+01 +1.045575000000000143e+00 -4.131250000000000000e+01 +1.045580000000000176e+00 -4.134375381469726562e+01 +1.045584999999999987e+00 -4.134375381469726562e+01 +1.045590000000000019e+00 -4.137500381469726562e+01 +1.045595000000000052e+00 -4.134375381469726562e+01 +1.045600000000000085e+00 -4.137500381469726562e+01 +1.045605000000000118e+00 -4.134375381469726562e+01 +1.045610000000000150e+00 -4.134375381469726562e+01 +1.045615000000000183e+00 -4.134375381469726562e+01 +1.045619999999999994e+00 -4.128125381469726562e+01 +1.045625000000000027e+00 -4.134375381469726562e+01 +1.045630000000000059e+00 -4.128125381469726562e+01 +1.045635000000000092e+00 -4.128125381469726562e+01 +1.045640000000000125e+00 -4.121875000000000000e+01 +1.045645000000000158e+00 -4.128125381469726562e+01 +1.045650000000000190e+00 -4.121875000000000000e+01 +1.045655000000000001e+00 -4.121875000000000000e+01 +1.045660000000000034e+00 -4.121875000000000000e+01 +1.045665000000000067e+00 -4.118750381469726562e+01 +1.045670000000000099e+00 -4.118750381469726562e+01 +1.045675000000000132e+00 -4.118750381469726562e+01 +1.045680000000000165e+00 -4.118750381469726562e+01 +1.045684999999999976e+00 -4.118750381469726562e+01 +1.045690000000000008e+00 -4.121875000000000000e+01 +1.045695000000000041e+00 -4.112500381469726562e+01 +1.045700000000000074e+00 -4.115625000000000000e+01 +1.045705000000000107e+00 -4.109375000000000000e+01 +1.045710000000000139e+00 -4.115625000000000000e+01 +1.045715000000000172e+00 -4.115625000000000000e+01 +1.045719999999999983e+00 -4.115625000000000000e+01 +1.045725000000000016e+00 -4.103125381469726562e+01 +1.045730000000000048e+00 -4.106250000000000000e+01 +1.045735000000000081e+00 -4.109375000000000000e+01 +1.045740000000000114e+00 -4.103125381469726562e+01 +1.045745000000000147e+00 -4.109375000000000000e+01 +1.045750000000000179e+00 -4.112500381469726562e+01 +1.045754999999999990e+00 -4.103125381469726562e+01 +1.045760000000000023e+00 -4.100000000000000000e+01 +1.045765000000000056e+00 -4.103125381469726562e+01 +1.045770000000000088e+00 -4.096875381469726562e+01 +1.045775000000000121e+00 -4.103125381469726562e+01 +1.045780000000000154e+00 -4.100000000000000000e+01 +1.045785000000000187e+00 -4.103125381469726562e+01 +1.045789999999999997e+00 -4.096875381469726562e+01 +1.045795000000000030e+00 -4.096875381469726562e+01 +1.045800000000000063e+00 -4.103125381469726562e+01 +1.045805000000000096e+00 -4.096875381469726562e+01 +1.045810000000000128e+00 -4.096875381469726562e+01 +1.045815000000000161e+00 -4.096875381469726562e+01 +1.045820000000000194e+00 -4.096875381469726562e+01 +1.045825000000000005e+00 -4.090625000000000000e+01 +1.045830000000000037e+00 -4.087500381469726562e+01 +1.045835000000000070e+00 -4.090625000000000000e+01 +1.045840000000000103e+00 -4.090625000000000000e+01 +1.045845000000000136e+00 -4.090625000000000000e+01 +1.045850000000000168e+00 -4.090625000000000000e+01 +1.045854999999999979e+00 -4.090625000000000000e+01 +1.045860000000000012e+00 -4.084375000000000000e+01 +1.045865000000000045e+00 -4.087500381469726562e+01 +1.045870000000000077e+00 -4.090625000000000000e+01 +1.045875000000000110e+00 -4.090625000000000000e+01 +1.045880000000000143e+00 -4.081250381469726562e+01 +1.045885000000000176e+00 -4.084375000000000000e+01 +1.045889999999999986e+00 -4.081250381469726562e+01 +1.045895000000000019e+00 -4.078125381469726562e+01 +1.045900000000000052e+00 -4.078125381469726562e+01 +1.045905000000000085e+00 -4.084375000000000000e+01 +1.045910000000000117e+00 -4.075000000000000000e+01 +1.045915000000000150e+00 -4.081250381469726562e+01 +1.045920000000000183e+00 -4.081250381469726562e+01 +1.045924999999999994e+00 -4.075000000000000000e+01 +1.045930000000000026e+00 -4.078125381469726562e+01 +1.045935000000000059e+00 -4.068750000000000000e+01 +1.045940000000000092e+00 -4.068750000000000000e+01 +1.045945000000000125e+00 -4.071875381469726562e+01 +1.045950000000000157e+00 -4.075000000000000000e+01 +1.045955000000000190e+00 -4.068750000000000000e+01 +1.045960000000000001e+00 -4.062500381469726562e+01 +1.045965000000000034e+00 -4.078125381469726562e+01 +1.045970000000000066e+00 -4.068750000000000000e+01 +1.045975000000000099e+00 -4.065625381469726562e+01 +1.045980000000000132e+00 -4.062500381469726562e+01 +1.045985000000000165e+00 -4.068750000000000000e+01 +1.045989999999999975e+00 -4.065625381469726562e+01 +1.045995000000000008e+00 -4.059375000000000000e+01 +1.046000000000000041e+00 -4.059375000000000000e+01 +1.046005000000000074e+00 -4.056250381469726562e+01 +1.046010000000000106e+00 -4.065625381469726562e+01 +1.046015000000000139e+00 -4.059375000000000000e+01 +1.046020000000000172e+00 -4.056250381469726562e+01 +1.046024999999999983e+00 -4.056250381469726562e+01 +1.046030000000000015e+00 -4.065625381469726562e+01 +1.046035000000000048e+00 -4.056250381469726562e+01 +1.046040000000000081e+00 -4.050000000000000000e+01 +1.046045000000000114e+00 -4.059375000000000000e+01 +1.046050000000000146e+00 -4.050000000000000000e+01 +1.046055000000000179e+00 -4.056250381469726562e+01 +1.046059999999999990e+00 -4.050000000000000000e+01 +1.046065000000000023e+00 -4.050000000000000000e+01 +1.046070000000000055e+00 -4.050000000000000000e+01 +1.046075000000000088e+00 -4.050000000000000000e+01 +1.046080000000000121e+00 -4.037500000000000000e+01 +1.046085000000000154e+00 -4.046875381469726562e+01 +1.046090000000000186e+00 -4.046875381469726562e+01 +1.046094999999999997e+00 -4.040625381469726562e+01 +1.046100000000000030e+00 -4.043750000000000000e+01 +1.046105000000000063e+00 -4.037500000000000000e+01 +1.046110000000000095e+00 -4.043750000000000000e+01 +1.046115000000000128e+00 -4.043750000000000000e+01 +1.046120000000000161e+00 -4.043750000000000000e+01 +1.046125000000000194e+00 -4.046875381469726562e+01 +1.046130000000000004e+00 -4.040625381469726562e+01 +1.046135000000000037e+00 -4.043750000000000000e+01 +1.046140000000000070e+00 -4.043750000000000000e+01 +1.046145000000000103e+00 -4.043750000000000000e+01 +1.046150000000000135e+00 -4.040625381469726562e+01 +1.046155000000000168e+00 -4.040625381469726562e+01 +1.046159999999999979e+00 -4.037500000000000000e+01 +1.046165000000000012e+00 -4.040625381469726562e+01 +1.046170000000000044e+00 -4.034375000000000000e+01 +1.046175000000000077e+00 -4.037500000000000000e+01 +1.046180000000000110e+00 -4.031250381469726562e+01 +1.046185000000000143e+00 -4.031250381469726562e+01 +1.046190000000000175e+00 -4.028125000000000000e+01 +1.046194999999999986e+00 -4.028125000000000000e+01 +1.046200000000000019e+00 -4.034375000000000000e+01 +1.046205000000000052e+00 -4.031250381469726562e+01 +1.046210000000000084e+00 -4.028125000000000000e+01 +1.046215000000000117e+00 -4.028125000000000000e+01 +1.046220000000000150e+00 -4.028125000000000000e+01 +1.046225000000000183e+00 -4.028125000000000000e+01 +1.046229999999999993e+00 -4.028125000000000000e+01 +1.046235000000000026e+00 -4.028125000000000000e+01 +1.046240000000000059e+00 -4.018750000000000000e+01 +1.046245000000000092e+00 -4.025000381469726562e+01 +1.046250000000000124e+00 -4.028125000000000000e+01 +1.046255000000000157e+00 -4.028125000000000000e+01 +1.046260000000000190e+00 -4.028125000000000000e+01 +1.046265000000000001e+00 -4.021875000000000000e+01 +1.046270000000000033e+00 -4.025000381469726562e+01 +1.046275000000000066e+00 -4.025000381469726562e+01 +1.046280000000000099e+00 -4.018750000000000000e+01 +1.046285000000000132e+00 -4.021875000000000000e+01 +1.046290000000000164e+00 -4.015625381469726562e+01 +1.046294999999999975e+00 -4.015625381469726562e+01 +1.046300000000000008e+00 -4.021875000000000000e+01 +1.046305000000000041e+00 -4.018750000000000000e+01 +1.046310000000000073e+00 -4.025000381469726562e+01 +1.046315000000000106e+00 -4.015625381469726562e+01 +1.046320000000000139e+00 -4.028125000000000000e+01 +1.046325000000000172e+00 -4.018750000000000000e+01 +1.046329999999999982e+00 -4.012500000000000000e+01 +1.046335000000000015e+00 -4.012500000000000000e+01 +1.046340000000000048e+00 -4.009375381469726562e+01 +1.046345000000000081e+00 -4.009375381469726562e+01 +1.046350000000000113e+00 -4.009375381469726562e+01 +1.046355000000000146e+00 -4.012500000000000000e+01 +1.046360000000000179e+00 -4.006250381469726562e+01 +1.046364999999999990e+00 -4.009375381469726562e+01 +1.046370000000000022e+00 -4.006250381469726562e+01 +1.046375000000000055e+00 -4.006250381469726562e+01 +1.046380000000000088e+00 -4.003125000000000000e+01 +1.046385000000000121e+00 -4.009375381469726562e+01 +1.046390000000000153e+00 -4.009375381469726562e+01 +1.046395000000000186e+00 -4.009375381469726562e+01 +1.046399999999999997e+00 -4.006250381469726562e+01 +1.046405000000000030e+00 -4.003125000000000000e+01 +1.046410000000000062e+00 -4.006250381469726562e+01 +1.046415000000000095e+00 -4.003125000000000000e+01 +1.046420000000000128e+00 -4.003125000000000000e+01 +1.046425000000000161e+00 -4.003125000000000000e+01 +1.046430000000000193e+00 -4.003125000000000000e+01 +1.046435000000000004e+00 -4.009375381469726562e+01 +1.046440000000000037e+00 -4.003125000000000000e+01 +1.046445000000000070e+00 -4.006250381469726562e+01 +1.046450000000000102e+00 -4.003125000000000000e+01 +1.046455000000000135e+00 -3.993750381469726562e+01 +1.046460000000000168e+00 -3.987500000000000000e+01 +1.046464999999999979e+00 -3.990625381469726562e+01 +1.046470000000000011e+00 -4.003125000000000000e+01 +1.046475000000000044e+00 -3.996875000000000000e+01 +1.046480000000000077e+00 -3.990625381469726562e+01 +1.046485000000000110e+00 -3.990625381469726562e+01 +1.046490000000000142e+00 -3.987500000000000000e+01 +1.046495000000000175e+00 -3.987500000000000000e+01 +1.046499999999999986e+00 -3.984375381469726562e+01 +1.046505000000000019e+00 -3.984375381469726562e+01 +1.046510000000000051e+00 -3.981250000000000000e+01 +1.046515000000000084e+00 -3.978125000000000000e+01 +1.046520000000000117e+00 -3.981250000000000000e+01 +1.046525000000000150e+00 -3.978125000000000000e+01 +1.046530000000000182e+00 -3.981250000000000000e+01 +1.046534999999999993e+00 -3.968750381469726562e+01 +1.046540000000000026e+00 -3.975000381469726562e+01 +1.046545000000000059e+00 -3.975000381469726562e+01 +1.046550000000000091e+00 -3.975000381469726562e+01 +1.046555000000000124e+00 -3.975000381469726562e+01 +1.046560000000000157e+00 -3.968750381469726562e+01 +1.046565000000000190e+00 -3.965625000000000000e+01 +1.046570000000000000e+00 -3.971875000000000000e+01 +1.046575000000000033e+00 -3.962500000000000000e+01 +1.046580000000000066e+00 -3.965625000000000000e+01 +1.046585000000000099e+00 -3.965625000000000000e+01 +1.046590000000000131e+00 -3.959375381469726562e+01 +1.046595000000000164e+00 -3.962500000000000000e+01 +1.046599999999999975e+00 -3.953125381469726562e+01 +1.046605000000000008e+00 -3.959375381469726562e+01 +1.046610000000000040e+00 -3.959375381469726562e+01 +1.046615000000000073e+00 -3.956250000000000000e+01 +1.046620000000000106e+00 -3.953125381469726562e+01 +1.046625000000000139e+00 -3.950000000000000000e+01 +1.046630000000000171e+00 -3.953125381469726562e+01 +1.046634999999999982e+00 -3.959375381469726562e+01 +1.046640000000000015e+00 -3.956250000000000000e+01 +1.046645000000000048e+00 -3.946875000000000000e+01 +1.046650000000000080e+00 -3.946875000000000000e+01 +1.046655000000000113e+00 -3.950000000000000000e+01 +1.046660000000000146e+00 -3.946875000000000000e+01 +1.046665000000000179e+00 -3.940625000000000000e+01 +1.046669999999999989e+00 -3.943750381469726562e+01 +1.046675000000000022e+00 -3.940625000000000000e+01 +1.046680000000000055e+00 -3.940625000000000000e+01 +1.046685000000000088e+00 -3.937500381469726562e+01 +1.046690000000000120e+00 -3.934375381469726562e+01 +1.046695000000000153e+00 -3.934375381469726562e+01 +1.046700000000000186e+00 -3.934375381469726562e+01 +1.046704999999999997e+00 -3.928125381469726562e+01 +1.046710000000000029e+00 -3.928125381469726562e+01 +1.046715000000000062e+00 -3.928125381469726562e+01 +1.046720000000000095e+00 -3.931250000000000000e+01 +1.046725000000000128e+00 -3.928125381469726562e+01 +1.046730000000000160e+00 -3.928125381469726562e+01 +1.046735000000000193e+00 -3.918750381469726562e+01 +1.046740000000000004e+00 -3.918750381469726562e+01 +1.046745000000000037e+00 -3.918750381469726562e+01 +1.046750000000000069e+00 -3.912500381469726562e+01 +1.046755000000000102e+00 -3.918750381469726562e+01 +1.046760000000000135e+00 -3.921875381469726562e+01 +1.046765000000000168e+00 -3.912500381469726562e+01 +1.046769999999999978e+00 -3.909375000000000000e+01 +1.046775000000000011e+00 -3.909375000000000000e+01 +1.046780000000000044e+00 -3.909375000000000000e+01 +1.046785000000000077e+00 -3.903125381469726562e+01 +1.046790000000000109e+00 -3.912500381469726562e+01 +1.046795000000000142e+00 -3.906250000000000000e+01 +1.046800000000000175e+00 -3.906250000000000000e+01 +1.046804999999999986e+00 -3.906250000000000000e+01 +1.046810000000000018e+00 -3.906250000000000000e+01 +1.046815000000000051e+00 -3.906250000000000000e+01 +1.046820000000000084e+00 -3.900000000000000000e+01 +1.046825000000000117e+00 -3.903125381469726562e+01 +1.046830000000000149e+00 -3.900000000000000000e+01 +1.046835000000000182e+00 -3.903125381469726562e+01 +1.046839999999999993e+00 -3.893750000000000000e+01 +1.046845000000000026e+00 -3.890625000000000000e+01 +1.046850000000000058e+00 -3.890625000000000000e+01 +1.046855000000000091e+00 -3.896875381469726562e+01 +1.046860000000000124e+00 -3.890625000000000000e+01 +1.046865000000000157e+00 -3.884375000000000000e+01 +1.046870000000000189e+00 -3.878125000000000000e+01 +1.046875000000000000e+00 -3.884375000000000000e+01 +1.046880000000000033e+00 -3.881250381469726562e+01 +1.046885000000000066e+00 -3.878125000000000000e+01 +1.046890000000000098e+00 -3.871875381469726562e+01 +1.046895000000000131e+00 -3.871875381469726562e+01 +1.046900000000000164e+00 -3.871875381469726562e+01 +1.046905000000000197e+00 -3.871875381469726562e+01 +1.046910000000000007e+00 -3.868750000000000000e+01 +1.046915000000000040e+00 -3.865625381469726562e+01 +1.046920000000000073e+00 -3.859375000000000000e+01 +1.046925000000000106e+00 -3.850000381469726562e+01 +1.046930000000000138e+00 -3.856250381469726562e+01 +1.046935000000000171e+00 -3.840625381469726562e+01 +1.046939999999999982e+00 -3.834375381469726562e+01 +1.046945000000000014e+00 -3.818750000000000000e+01 +1.046950000000000047e+00 -3.815625381469726562e+01 +1.046955000000000080e+00 -3.793750381469726562e+01 +1.046960000000000113e+00 -3.784375381469726562e+01 +1.046965000000000146e+00 -3.765625000000000000e+01 +1.046970000000000178e+00 -3.740625000000000000e+01 +1.046974999999999989e+00 -3.725000000000000000e+01 +1.046980000000000022e+00 -3.690625381469726562e+01 +1.046985000000000054e+00 -3.665625381469726562e+01 +1.046990000000000087e+00 -3.631250000000000000e+01 +1.046995000000000120e+00 -3.603125000000000000e+01 +1.047000000000000153e+00 -3.565625000000000000e+01 +1.047005000000000186e+00 -3.534375000000000000e+01 +1.047009999999999996e+00 -3.503125000000000000e+01 +1.047015000000000029e+00 -3.459375000000000000e+01 +1.047020000000000062e+00 -3.421875000000000000e+01 +1.047025000000000095e+00 -3.378125381469726562e+01 +1.047030000000000127e+00 -3.340625000000000000e+01 +1.047035000000000160e+00 -3.296875381469726562e+01 +1.047040000000000193e+00 -3.253125000000000000e+01 +1.047045000000000003e+00 -3.215625000000000000e+01 +1.047050000000000036e+00 -3.165625000000000000e+01 +1.047055000000000069e+00 -3.115625190734863281e+01 +1.047060000000000102e+00 -3.071875190734863281e+01 +1.047065000000000135e+00 -3.025000190734863281e+01 +1.047070000000000167e+00 -2.968750190734863281e+01 +1.047074999999999978e+00 -2.918750000000000000e+01 +1.047080000000000011e+00 -2.862500190734863281e+01 +1.047085000000000043e+00 -2.812500190734863281e+01 +1.047090000000000076e+00 -2.753125190734863281e+01 +1.047095000000000109e+00 -2.700000000000000000e+01 +1.047100000000000142e+00 -2.637500190734863281e+01 +1.047105000000000175e+00 -2.578125190734863281e+01 +1.047109999999999985e+00 -2.506250190734863281e+01 +1.047115000000000018e+00 -2.446875190734863281e+01 +1.047120000000000051e+00 -2.375000190734863281e+01 +1.047125000000000083e+00 -2.296875000000000000e+01 +1.047130000000000116e+00 -2.234375190734863281e+01 +1.047135000000000149e+00 -2.146875190734863281e+01 +1.047140000000000182e+00 -2.062500000000000000e+01 +1.047144999999999992e+00 -1.971875190734863281e+01 +1.047150000000000025e+00 -1.884375190734863281e+01 +1.047155000000000058e+00 -1.787500000000000000e+01 +1.047160000000000091e+00 -1.690625000000000000e+01 +1.047165000000000123e+00 -1.578125000000000000e+01 +1.047170000000000156e+00 -1.478125095367431641e+01 +1.047175000000000189e+00 -1.365625000000000000e+01 +1.047180000000000000e+00 -1.256250000000000000e+01 +1.047185000000000032e+00 -1.140625000000000000e+01 +1.047190000000000065e+00 -1.018750000000000000e+01 +1.047195000000000098e+00 -9.000000953674316406e+00 +1.047200000000000131e+00 -7.718750476837158203e+00 +1.047205000000000163e+00 -6.593750476837158203e+00 +1.047210000000000196e+00 -5.375000000000000000e+00 +1.047215000000000007e+00 -4.187500000000000000e+00 +1.047220000000000040e+00 -3.031250000000000000e+00 +1.047225000000000072e+00 -1.812500119209289551e+00 +1.047230000000000105e+00 -7.812500000000000000e-01 +1.047235000000000138e+00 4.062500000000000000e-01 +1.047240000000000171e+00 1.406250000000000000e+00 +1.047244999999999981e+00 2.500000238418579102e+00 +1.047250000000000014e+00 3.531250238418579102e+00 +1.047255000000000047e+00 4.500000476837158203e+00 +1.047260000000000080e+00 5.531250000000000000e+00 +1.047265000000000112e+00 6.437500476837158203e+00 +1.047270000000000145e+00 7.343750476837158203e+00 +1.047275000000000178e+00 8.218750000000000000e+00 +1.047279999999999989e+00 9.093750000000000000e+00 +1.047285000000000021e+00 9.937500953674316406e+00 +1.047290000000000054e+00 1.068750000000000000e+01 +1.047295000000000087e+00 1.140625000000000000e+01 +1.047300000000000120e+00 1.206250000000000000e+01 +1.047305000000000152e+00 1.278125000000000000e+01 +1.047310000000000185e+00 1.331250095367431641e+01 +1.047314999999999996e+00 1.390625095367431641e+01 +1.047320000000000029e+00 1.453125095367431641e+01 +1.047325000000000061e+00 1.500000095367431641e+01 +1.047330000000000094e+00 1.540625095367431641e+01 +1.047335000000000127e+00 1.584375095367431641e+01 +1.047340000000000160e+00 1.625000190734863281e+01 +1.047345000000000192e+00 1.659375000000000000e+01 +1.047350000000000003e+00 1.700000000000000000e+01 +1.047355000000000036e+00 1.718750000000000000e+01 +1.047360000000000069e+00 1.746875000000000000e+01 +1.047365000000000101e+00 1.753125190734863281e+01 +1.047370000000000134e+00 1.784375190734863281e+01 +1.047375000000000167e+00 1.800000190734863281e+01 +1.047379999999999978e+00 1.806250000000000000e+01 +1.047385000000000010e+00 1.809375190734863281e+01 +1.047390000000000043e+00 1.821875000000000000e+01 +1.047395000000000076e+00 1.812500190734863281e+01 +1.047400000000000109e+00 1.815625000000000000e+01 +1.047405000000000141e+00 1.806250000000000000e+01 +1.047410000000000174e+00 1.800000190734863281e+01 +1.047414999999999985e+00 1.787500000000000000e+01 +1.047420000000000018e+00 1.768750190734863281e+01 +1.047425000000000050e+00 1.750000000000000000e+01 +1.047430000000000083e+00 1.734375000000000000e+01 +1.047435000000000116e+00 1.703125000000000000e+01 +1.047440000000000149e+00 1.687500000000000000e+01 +1.047445000000000181e+00 1.656250190734863281e+01 +1.047449999999999992e+00 1.628125000000000000e+01 +1.047455000000000025e+00 1.600000000000000000e+01 +1.047460000000000058e+00 1.565625190734863281e+01 +1.047465000000000090e+00 1.531250000000000000e+01 +1.047470000000000123e+00 1.484375095367431641e+01 +1.047475000000000156e+00 1.446875095367431641e+01 +1.047480000000000189e+00 1.412500095367431641e+01 +1.047484999999999999e+00 1.371875000000000000e+01 +1.047490000000000032e+00 1.328125000000000000e+01 +1.047495000000000065e+00 1.281250095367431641e+01 +1.047500000000000098e+00 1.234375000000000000e+01 +1.047505000000000130e+00 1.187500095367431641e+01 +1.047510000000000163e+00 1.137500095367431641e+01 +1.047515000000000196e+00 1.093750095367431641e+01 +1.047520000000000007e+00 1.037500095367431641e+01 +1.047525000000000039e+00 9.843750953674316406e+00 +1.047530000000000072e+00 9.250000000000000000e+00 +1.047535000000000105e+00 8.812500000000000000e+00 +1.047540000000000138e+00 8.250000000000000000e+00 +1.047545000000000170e+00 7.687500000000000000e+00 +1.047549999999999981e+00 7.125000476837158203e+00 +1.047555000000000014e+00 6.562500476837158203e+00 +1.047560000000000047e+00 6.000000000000000000e+00 +1.047565000000000079e+00 5.375000000000000000e+00 +1.047570000000000112e+00 4.750000476837158203e+00 +1.047575000000000145e+00 4.156250000000000000e+00 +1.047580000000000178e+00 3.562500238418579102e+00 +1.047584999999999988e+00 2.843750238418579102e+00 +1.047590000000000021e+00 2.218750000000000000e+00 +1.047595000000000054e+00 1.625000000000000000e+00 +1.047600000000000087e+00 1.000000000000000000e+00 +1.047605000000000119e+00 3.437500298023223877e-01 +1.047610000000000152e+00 -3.125000298023223877e-01 +1.047615000000000185e+00 -9.375000596046447754e-01 +1.047619999999999996e+00 -1.562500000000000000e+00 +1.047625000000000028e+00 -2.250000238418579102e+00 +1.047630000000000061e+00 -2.875000238418579102e+00 +1.047635000000000094e+00 -3.562500238418579102e+00 +1.047640000000000127e+00 -4.312500476837158203e+00 +1.047645000000000159e+00 -4.906250000000000000e+00 +1.047650000000000192e+00 -5.593750000000000000e+00 +1.047655000000000003e+00 -6.218750476837158203e+00 +1.047660000000000036e+00 -6.937500476837158203e+00 +1.047665000000000068e+00 -7.562500476837158203e+00 +1.047670000000000101e+00 -8.343750953674316406e+00 +1.047675000000000134e+00 -8.968750000000000000e+00 +1.047680000000000167e+00 -9.625000953674316406e+00 +1.047684999999999977e+00 -1.028125095367431641e+01 +1.047690000000000010e+00 -1.093750095367431641e+01 +1.047695000000000043e+00 -1.162500000000000000e+01 +1.047700000000000076e+00 -1.228125000000000000e+01 +1.047705000000000108e+00 -1.293750095367431641e+01 +1.047710000000000141e+00 -1.359375095367431641e+01 +1.047715000000000174e+00 -1.425000095367431641e+01 +1.047719999999999985e+00 -1.490625095367431641e+01 +1.047725000000000017e+00 -1.550000095367431641e+01 +1.047730000000000050e+00 -1.615625000000000000e+01 +1.047735000000000083e+00 -1.678125000000000000e+01 +1.047740000000000116e+00 -1.746875000000000000e+01 +1.047745000000000148e+00 -1.809375190734863281e+01 +1.047750000000000181e+00 -1.871875190734863281e+01 +1.047754999999999992e+00 -1.928125190734863281e+01 +1.047760000000000025e+00 -1.987500190734863281e+01 +1.047765000000000057e+00 -2.046875190734863281e+01 +1.047770000000000090e+00 -2.106250000000000000e+01 +1.047775000000000123e+00 -2.162500190734863281e+01 +1.047780000000000156e+00 -2.225000000000000000e+01 +1.047785000000000188e+00 -2.287500190734863281e+01 +1.047789999999999999e+00 -2.340625000000000000e+01 +1.047795000000000032e+00 -2.396875000000000000e+01 +1.047800000000000065e+00 -2.453125000000000000e+01 +1.047805000000000097e+00 -2.500000000000000000e+01 +1.047810000000000130e+00 -2.553125190734863281e+01 +1.047815000000000163e+00 -2.612500000000000000e+01 +1.047820000000000196e+00 -2.665625190734863281e+01 +1.047825000000000006e+00 -2.718750190734863281e+01 +1.047830000000000039e+00 -2.765625190734863281e+01 +1.047835000000000072e+00 -2.818750190734863281e+01 +1.047840000000000105e+00 -2.865625190734863281e+01 +1.047845000000000137e+00 -2.918750000000000000e+01 +1.047850000000000170e+00 -2.965625190734863281e+01 +1.047854999999999981e+00 -3.009375190734863281e+01 +1.047860000000000014e+00 -3.050000190734863281e+01 +1.047865000000000046e+00 -3.103125000000000000e+01 +1.047870000000000079e+00 -3.143750190734863281e+01 +1.047875000000000112e+00 -3.190625000000000000e+01 +1.047880000000000145e+00 -3.231250000000000000e+01 +1.047885000000000177e+00 -3.271875000000000000e+01 +1.047889999999999988e+00 -3.318750000000000000e+01 +1.047895000000000021e+00 -3.350000000000000000e+01 +1.047900000000000054e+00 -3.396875000000000000e+01 +1.047905000000000086e+00 -3.440625381469726562e+01 +1.047910000000000119e+00 -3.475000381469726562e+01 +1.047915000000000152e+00 -3.515625000000000000e+01 +1.047920000000000185e+00 -3.553125381469726562e+01 +1.047924999999999995e+00 -3.593750381469726562e+01 +1.047930000000000028e+00 -3.631250000000000000e+01 +1.047935000000000061e+00 -3.665625381469726562e+01 +1.047940000000000094e+00 -3.703125381469726562e+01 +1.047945000000000126e+00 -3.740625000000000000e+01 +1.047950000000000159e+00 -3.771875000000000000e+01 +1.047955000000000192e+00 -3.803125000000000000e+01 +1.047960000000000003e+00 -3.846875381469726562e+01 +1.047965000000000035e+00 -3.865625381469726562e+01 +1.047970000000000068e+00 -3.900000000000000000e+01 +1.047975000000000101e+00 -3.934375381469726562e+01 +1.047980000000000134e+00 -3.956250000000000000e+01 +1.047985000000000166e+00 -4.000000381469726562e+01 +1.047989999999999977e+00 -4.021875000000000000e+01 +1.047995000000000010e+00 -4.050000000000000000e+01 +1.048000000000000043e+00 -4.081250381469726562e+01 +1.048005000000000075e+00 -4.103125381469726562e+01 +1.048010000000000108e+00 -4.131250000000000000e+01 +1.048015000000000141e+00 -4.159375381469726562e+01 +1.048020000000000174e+00 -4.190625381469726562e+01 +1.048024999999999984e+00 -4.218750000000000000e+01 +1.048030000000000017e+00 -4.234375000000000000e+01 +1.048035000000000050e+00 -4.262500381469726562e+01 +1.048040000000000083e+00 -4.290625000000000000e+01 +1.048045000000000115e+00 -4.315625000000000000e+01 +1.048050000000000148e+00 -4.340625000000000000e+01 +1.048055000000000181e+00 -4.359375381469726562e+01 +1.048059999999999992e+00 -4.381250381469726562e+01 +1.048065000000000024e+00 -4.406250381469726562e+01 +1.048070000000000057e+00 -4.431250381469726562e+01 +1.048075000000000090e+00 -4.450000000000000000e+01 +1.048080000000000123e+00 -4.471875381469726562e+01 +1.048085000000000155e+00 -4.493750381469726562e+01 +1.048090000000000188e+00 -4.512500381469726562e+01 +1.048094999999999999e+00 -4.531250000000000000e+01 +1.048100000000000032e+00 -4.546875000000000000e+01 +1.048105000000000064e+00 -4.568750000000000000e+01 +1.048110000000000097e+00 -4.593750000000000000e+01 +1.048115000000000130e+00 -4.609375000000000000e+01 +1.048120000000000163e+00 -4.625000000000000000e+01 +1.048125000000000195e+00 -4.643750000000000000e+01 +1.048130000000000006e+00 -4.665625000000000000e+01 +1.048135000000000039e+00 -4.681250000000000000e+01 +1.048140000000000072e+00 -4.696875000000000000e+01 +1.048145000000000104e+00 -4.706250000000000000e+01 +1.048150000000000137e+00 -4.725000381469726562e+01 +1.048155000000000170e+00 -4.743750381469726562e+01 +1.048159999999999981e+00 -4.753125000000000000e+01 +1.048165000000000013e+00 -4.765625381469726562e+01 +1.048170000000000046e+00 -4.790625381469726562e+01 +1.048175000000000079e+00 -4.803125000000000000e+01 +1.048180000000000112e+00 -4.806250381469726562e+01 +1.048185000000000144e+00 -4.828125381469726562e+01 +1.048190000000000177e+00 -4.840625000000000000e+01 +1.048194999999999988e+00 -4.853125381469726562e+01 +1.048200000000000021e+00 -4.868750381469726562e+01 +1.048205000000000053e+00 -4.884375381469726562e+01 +1.048210000000000086e+00 -4.900000381469726562e+01 +1.048215000000000119e+00 -4.900000381469726562e+01 +1.048220000000000152e+00 -4.918750381469726562e+01 +1.048225000000000184e+00 -4.925000381469726562e+01 +1.048229999999999995e+00 -4.934375381469726562e+01 +1.048235000000000028e+00 -4.950000381469726562e+01 +1.048240000000000061e+00 -4.962500000000000000e+01 +1.048245000000000093e+00 -4.978125000000000000e+01 +1.048250000000000126e+00 -4.984375000000000000e+01 +1.048255000000000159e+00 -4.996875381469726562e+01 +1.048260000000000192e+00 -5.003125381469726562e+01 +1.048265000000000002e+00 -5.009375000000000000e+01 +1.048270000000000035e+00 -5.021875381469726562e+01 +1.048275000000000068e+00 -5.031250381469726562e+01 +1.048280000000000101e+00 -5.040625000000000000e+01 +1.048285000000000133e+00 -5.053125381469726562e+01 +1.048290000000000166e+00 -5.053125381469726562e+01 +1.048294999999999977e+00 -5.062500381469726562e+01 +1.048300000000000010e+00 -5.075000381469726562e+01 +1.048305000000000042e+00 -5.078125381469726562e+01 +1.048310000000000075e+00 -5.084375381469726562e+01 +1.048315000000000108e+00 -5.093750381469726562e+01 +1.048320000000000141e+00 -5.103125381469726562e+01 +1.048325000000000173e+00 -5.103125381469726562e+01 +1.048329999999999984e+00 -5.118750381469726562e+01 +1.048335000000000017e+00 -5.118750381469726562e+01 +1.048340000000000050e+00 -5.128125000000000000e+01 +1.048345000000000082e+00 -5.140625381469726562e+01 +1.048350000000000115e+00 -5.143750000000000000e+01 +1.048355000000000148e+00 -5.150000381469726562e+01 +1.048360000000000181e+00 -5.150000381469726562e+01 +1.048364999999999991e+00 -5.168750000000000000e+01 +1.048370000000000024e+00 -5.165625381469726562e+01 +1.048375000000000057e+00 -5.168750000000000000e+01 +1.048380000000000090e+00 -5.178125381469726562e+01 +1.048385000000000122e+00 -5.175000381469726562e+01 +1.048390000000000155e+00 -5.181250381469726562e+01 +1.048395000000000188e+00 -5.193750000000000000e+01 +1.048399999999999999e+00 -5.196875381469726562e+01 +1.048405000000000031e+00 -5.203125381469726562e+01 +1.048410000000000064e+00 -5.209375000000000000e+01 +1.048415000000000097e+00 -5.206250381469726562e+01 +1.048420000000000130e+00 -5.215625000000000000e+01 +1.048425000000000162e+00 -5.215625000000000000e+01 +1.048430000000000195e+00 -5.218750381469726562e+01 +1.048435000000000006e+00 -5.225000000000000000e+01 +1.048440000000000039e+00 -5.221875381469726562e+01 +1.048445000000000071e+00 -5.228125381469726562e+01 +1.048450000000000104e+00 -5.234375381469726562e+01 +1.048455000000000137e+00 -5.234375381469726562e+01 +1.048460000000000170e+00 -5.240625000000000000e+01 +1.048464999999999980e+00 -5.237500381469726562e+01 +1.048470000000000013e+00 -5.246875381469726562e+01 +1.048475000000000046e+00 -5.246875381469726562e+01 +1.048480000000000079e+00 -5.253125381469726562e+01 +1.048485000000000111e+00 -5.253125381469726562e+01 +1.048490000000000144e+00 -5.253125381469726562e+01 +1.048495000000000177e+00 -5.256250000000000000e+01 +1.048499999999999988e+00 -5.253125381469726562e+01 +1.048505000000000020e+00 -5.265625381469726562e+01 +1.048510000000000053e+00 -5.262500381469726562e+01 +1.048515000000000086e+00 -5.265625381469726562e+01 +1.048520000000000119e+00 -5.262500381469726562e+01 +1.048525000000000151e+00 -5.265625381469726562e+01 +1.048530000000000184e+00 -5.271875000000000000e+01 +1.048534999999999995e+00 -5.278125381469726562e+01 +1.048540000000000028e+00 -5.275000381469726562e+01 +1.048545000000000060e+00 -5.271875000000000000e+01 +1.048550000000000093e+00 -5.275000381469726562e+01 +1.048555000000000126e+00 -5.278125381469726562e+01 +1.048560000000000159e+00 -5.284375381469726562e+01 +1.048565000000000191e+00 -5.287500000000000000e+01 +1.048570000000000002e+00 -5.284375381469726562e+01 +1.048575000000000035e+00 -5.281250000000000000e+01 +1.048580000000000068e+00 -5.284375381469726562e+01 +1.048585000000000100e+00 -5.293750381469726562e+01 +1.048590000000000133e+00 -5.290625381469726562e+01 +1.048595000000000166e+00 -5.293750381469726562e+01 +1.048599999999999977e+00 -5.284375381469726562e+01 +1.048605000000000009e+00 -5.293750381469726562e+01 +1.048610000000000042e+00 -5.293750381469726562e+01 +1.048615000000000075e+00 -5.290625381469726562e+01 +1.048620000000000108e+00 -5.293750381469726562e+01 +1.048625000000000140e+00 -5.290625381469726562e+01 +1.048630000000000173e+00 -5.296875000000000000e+01 +1.048634999999999984e+00 -5.293750381469726562e+01 +1.048640000000000017e+00 -5.296875000000000000e+01 +1.048645000000000049e+00 -5.300000381469726562e+01 +1.048650000000000082e+00 -5.296875000000000000e+01 +1.048655000000000115e+00 -5.290625381469726562e+01 +1.048660000000000148e+00 -5.293750381469726562e+01 +1.048665000000000180e+00 -5.296875000000000000e+01 +1.048669999999999991e+00 -5.296875000000000000e+01 +1.048675000000000024e+00 -5.296875000000000000e+01 +1.048680000000000057e+00 -5.296875000000000000e+01 +1.048685000000000089e+00 -5.287500000000000000e+01 +1.048690000000000122e+00 -5.296875000000000000e+01 +1.048695000000000155e+00 -5.300000381469726562e+01 +1.048700000000000188e+00 -5.296875000000000000e+01 +1.048704999999999998e+00 -5.303125000000000000e+01 +1.048710000000000031e+00 -5.300000381469726562e+01 +1.048715000000000064e+00 -5.293750381469726562e+01 +1.048720000000000097e+00 -5.300000381469726562e+01 +1.048725000000000129e+00 -5.296875000000000000e+01 +1.048730000000000162e+00 -5.293750381469726562e+01 +1.048735000000000195e+00 -5.293750381469726562e+01 +1.048740000000000006e+00 -5.296875000000000000e+01 +1.048745000000000038e+00 -5.296875000000000000e+01 +1.048750000000000071e+00 -5.287500000000000000e+01 +1.048755000000000104e+00 -5.290625381469726562e+01 +1.048760000000000137e+00 -5.290625381469726562e+01 +1.048765000000000169e+00 -5.287500000000000000e+01 +1.048769999999999980e+00 -5.284375381469726562e+01 +1.048775000000000013e+00 -5.281250000000000000e+01 +1.048780000000000046e+00 -5.284375381469726562e+01 +1.048785000000000078e+00 -5.287500000000000000e+01 +1.048790000000000111e+00 -5.287500000000000000e+01 +1.048795000000000144e+00 -5.284375381469726562e+01 +1.048800000000000177e+00 -5.284375381469726562e+01 +1.048804999999999987e+00 -5.287500000000000000e+01 +1.048810000000000020e+00 -5.278125381469726562e+01 +1.048815000000000053e+00 -5.284375381469726562e+01 +1.048820000000000086e+00 -5.275000381469726562e+01 +1.048825000000000118e+00 -5.281250000000000000e+01 +1.048830000000000151e+00 -5.271875000000000000e+01 +1.048835000000000184e+00 -5.268750381469726562e+01 +1.048839999999999995e+00 -5.278125381469726562e+01 +1.048845000000000027e+00 -5.271875000000000000e+01 +1.048850000000000060e+00 -5.271875000000000000e+01 +1.048855000000000093e+00 -5.271875000000000000e+01 +1.048860000000000126e+00 -5.265625381469726562e+01 +1.048865000000000158e+00 -5.262500381469726562e+01 +1.048870000000000191e+00 -5.265625381469726562e+01 +1.048875000000000002e+00 -5.265625381469726562e+01 +1.048880000000000035e+00 -5.253125381469726562e+01 +1.048885000000000067e+00 -5.262500381469726562e+01 +1.048890000000000100e+00 -5.259375381469726562e+01 +1.048895000000000133e+00 -5.250000381469726562e+01 +1.048900000000000166e+00 -5.259375381469726562e+01 +1.048904999999999976e+00 -5.256250000000000000e+01 +1.048910000000000009e+00 -5.253125381469726562e+01 +1.048915000000000042e+00 -5.253125381469726562e+01 +1.048920000000000075e+00 -5.250000381469726562e+01 +1.048925000000000107e+00 -5.246875381469726562e+01 +1.048930000000000140e+00 -5.250000381469726562e+01 +1.048935000000000173e+00 -5.243750381469726562e+01 +1.048939999999999984e+00 -5.246875381469726562e+01 +1.048945000000000016e+00 -5.240625000000000000e+01 +1.048950000000000049e+00 -5.243750381469726562e+01 +1.048955000000000082e+00 -5.240625000000000000e+01 +1.048960000000000115e+00 -5.231250000000000000e+01 +1.048965000000000147e+00 -5.234375381469726562e+01 +1.048970000000000180e+00 -5.240625000000000000e+01 +1.048974999999999991e+00 -5.234375381469726562e+01 +1.048980000000000024e+00 -5.228125381469726562e+01 +1.048985000000000056e+00 -5.231250000000000000e+01 +1.048990000000000089e+00 -5.221875381469726562e+01 +1.048995000000000122e+00 -5.228125381469726562e+01 +1.049000000000000155e+00 -5.228125381469726562e+01 +1.049005000000000187e+00 -5.221875381469726562e+01 +1.049009999999999998e+00 -5.218750381469726562e+01 +1.049015000000000031e+00 -5.215625000000000000e+01 +1.049020000000000064e+00 -5.215625000000000000e+01 +1.049025000000000096e+00 -5.218750381469726562e+01 +1.049030000000000129e+00 -5.212500381469726562e+01 +1.049035000000000162e+00 -5.203125381469726562e+01 +1.049040000000000195e+00 -5.209375000000000000e+01 +1.049045000000000005e+00 -5.203125381469726562e+01 +1.049050000000000038e+00 -5.203125381469726562e+01 +1.049055000000000071e+00 -5.203125381469726562e+01 +1.049060000000000104e+00 -5.196875381469726562e+01 +1.049065000000000136e+00 -5.193750000000000000e+01 +1.049070000000000169e+00 -5.193750000000000000e+01 +1.049074999999999980e+00 -5.190625381469726562e+01 +1.049080000000000013e+00 -5.187500381469726562e+01 +1.049085000000000045e+00 -5.187500381469726562e+01 +1.049090000000000078e+00 -5.184375000000000000e+01 +1.049095000000000111e+00 -5.181250381469726562e+01 +1.049100000000000144e+00 -5.178125381469726562e+01 +1.049105000000000176e+00 -5.181250381469726562e+01 +1.049109999999999987e+00 -5.178125381469726562e+01 +1.049115000000000020e+00 -5.171875381469726562e+01 +1.049120000000000053e+00 -5.175000381469726562e+01 +1.049125000000000085e+00 -5.171875381469726562e+01 +1.049130000000000118e+00 -5.168750000000000000e+01 +1.049135000000000151e+00 -5.168750000000000000e+01 +1.049140000000000184e+00 -5.168750000000000000e+01 +1.049144999999999994e+00 -5.165625381469726562e+01 +1.049150000000000027e+00 -5.162500381469726562e+01 +1.049155000000000060e+00 -5.162500381469726562e+01 +1.049160000000000093e+00 -5.150000381469726562e+01 +1.049165000000000125e+00 -5.150000381469726562e+01 +1.049170000000000158e+00 -5.153125000000000000e+01 +1.049175000000000191e+00 -5.146875381469726562e+01 +1.049180000000000001e+00 -5.150000381469726562e+01 +1.049185000000000034e+00 -5.143750000000000000e+01 +1.049190000000000067e+00 -5.146875381469726562e+01 +1.049195000000000100e+00 -5.143750000000000000e+01 +1.049200000000000133e+00 -5.140625381469726562e+01 +1.049205000000000165e+00 -5.140625381469726562e+01 +1.049209999999999976e+00 -5.137500000000000000e+01 +1.049215000000000009e+00 -5.137500000000000000e+01 +1.049220000000000041e+00 -5.131250381469726562e+01 +1.049225000000000074e+00 -5.128125000000000000e+01 +1.049230000000000107e+00 -5.128125000000000000e+01 +1.049235000000000140e+00 -5.128125000000000000e+01 +1.049240000000000173e+00 -5.128125000000000000e+01 +1.049244999999999983e+00 -5.121875000000000000e+01 +1.049250000000000016e+00 -5.128125000000000000e+01 +1.049255000000000049e+00 -5.121875000000000000e+01 +1.049260000000000081e+00 -5.115625381469726562e+01 +1.049265000000000114e+00 -5.121875000000000000e+01 +1.049270000000000147e+00 -5.121875000000000000e+01 +1.049275000000000180e+00 -5.112500000000000000e+01 +1.049279999999999990e+00 -5.115625381469726562e+01 +1.049285000000000023e+00 -5.103125381469726562e+01 +1.049290000000000056e+00 -5.103125381469726562e+01 +1.049295000000000089e+00 -5.109375381469726562e+01 +1.049300000000000122e+00 -5.100000381469726562e+01 +1.049305000000000154e+00 -5.106250381469726562e+01 +1.049310000000000187e+00 -5.096875000000000000e+01 +1.049314999999999998e+00 -5.100000381469726562e+01 +1.049320000000000030e+00 -5.093750381469726562e+01 +1.049325000000000063e+00 -5.100000381469726562e+01 +1.049330000000000096e+00 -5.093750381469726562e+01 +1.049335000000000129e+00 -5.090625381469726562e+01 +1.049340000000000162e+00 -5.090625381469726562e+01 +1.049345000000000194e+00 -5.084375381469726562e+01 +1.049350000000000005e+00 -5.087500000000000000e+01 +1.049355000000000038e+00 -5.081250000000000000e+01 +1.049360000000000070e+00 -5.081250000000000000e+01 +1.049365000000000103e+00 -5.084375381469726562e+01 +1.049370000000000136e+00 -5.081250000000000000e+01 +1.049375000000000169e+00 -5.081250000000000000e+01 +1.049379999999999979e+00 -5.078125381469726562e+01 +1.049385000000000012e+00 -5.071875000000000000e+01 +1.049390000000000045e+00 -5.075000381469726562e+01 +1.049395000000000078e+00 -5.071875000000000000e+01 +1.049400000000000110e+00 -5.071875000000000000e+01 +1.049405000000000143e+00 -5.068750381469726562e+01 +1.049410000000000176e+00 -5.062500381469726562e+01 +1.049414999999999987e+00 -5.059375381469726562e+01 +1.049420000000000019e+00 -5.056250000000000000e+01 +1.049425000000000052e+00 -5.053125381469726562e+01 +1.049430000000000085e+00 -5.050000000000000000e+01 +1.049435000000000118e+00 -5.053125381469726562e+01 +1.049440000000000150e+00 -5.056250000000000000e+01 +1.049445000000000183e+00 -5.050000000000000000e+01 +1.049449999999999994e+00 -5.050000000000000000e+01 +1.049455000000000027e+00 -5.043750381469726562e+01 +1.049460000000000059e+00 -5.040625000000000000e+01 +1.049465000000000092e+00 -5.043750381469726562e+01 +1.049470000000000125e+00 -5.040625000000000000e+01 +1.049475000000000158e+00 -5.040625000000000000e+01 +1.049480000000000190e+00 -5.037500381469726562e+01 +1.049485000000000001e+00 -5.040625000000000000e+01 +1.049490000000000034e+00 -5.031250381469726562e+01 +1.049495000000000067e+00 -5.031250381469726562e+01 +1.049500000000000099e+00 -5.034375000000000000e+01 +1.049505000000000132e+00 -5.025000000000000000e+01 +1.049510000000000165e+00 -5.028125381469726562e+01 +1.049514999999999976e+00 -5.021875381469726562e+01 +1.049520000000000008e+00 -5.021875381469726562e+01 +1.049525000000000041e+00 -5.015625000000000000e+01 +1.049530000000000074e+00 -5.021875381469726562e+01 +1.049535000000000107e+00 -5.015625000000000000e+01 +1.049540000000000139e+00 -5.018750381469726562e+01 +1.049545000000000172e+00 -5.009375000000000000e+01 +1.049549999999999983e+00 -5.009375000000000000e+01 +1.049555000000000016e+00 -5.012500381469726562e+01 +1.049560000000000048e+00 -5.009375000000000000e+01 +1.049565000000000081e+00 -5.006250381469726562e+01 +1.049570000000000114e+00 -5.000000000000000000e+01 +1.049575000000000147e+00 -5.003125381469726562e+01 +1.049580000000000179e+00 -5.000000000000000000e+01 +1.049584999999999990e+00 -4.996875381469726562e+01 +1.049590000000000023e+00 -4.996875381469726562e+01 +1.049595000000000056e+00 -4.990625381469726562e+01 +1.049600000000000088e+00 -4.996875381469726562e+01 +1.049605000000000121e+00 -4.987500381469726562e+01 +1.049610000000000154e+00 -4.984375000000000000e+01 +1.049615000000000187e+00 -4.984375000000000000e+01 +1.049619999999999997e+00 -4.990625381469726562e+01 +1.049625000000000030e+00 -4.978125000000000000e+01 +1.049630000000000063e+00 -4.978125000000000000e+01 +1.049635000000000096e+00 -4.971875381469726562e+01 +1.049640000000000128e+00 -4.978125000000000000e+01 +1.049645000000000161e+00 -4.971875381469726562e+01 +1.049650000000000194e+00 -4.971875381469726562e+01 +1.049655000000000005e+00 -4.971875381469726562e+01 +1.049660000000000037e+00 -4.975000381469726562e+01 +1.049665000000000070e+00 -4.971875381469726562e+01 +1.049670000000000103e+00 -4.962500000000000000e+01 +1.049675000000000136e+00 -4.965625381469726562e+01 +1.049680000000000168e+00 -4.965625381469726562e+01 +1.049684999999999979e+00 -4.953125000000000000e+01 +1.049690000000000012e+00 -4.959375381469726562e+01 +1.049695000000000045e+00 -4.956250381469726562e+01 +1.049700000000000077e+00 -4.965625381469726562e+01 +1.049705000000000110e+00 -4.956250381469726562e+01 +1.049710000000000143e+00 -4.956250381469726562e+01 +1.049715000000000176e+00 -4.946875381469726562e+01 +1.049719999999999986e+00 -4.946875381469726562e+01 +1.049725000000000019e+00 -4.943750000000000000e+01 +1.049730000000000052e+00 -4.953125000000000000e+01 +1.049735000000000085e+00 -4.950000381469726562e+01 +1.049740000000000117e+00 -4.940625381469726562e+01 +1.049745000000000150e+00 -4.937500000000000000e+01 +1.049750000000000183e+00 -4.937500000000000000e+01 +1.049754999999999994e+00 -4.931250381469726562e+01 +1.049760000000000026e+00 -4.937500000000000000e+01 +1.049765000000000059e+00 -4.934375381469726562e+01 +1.049770000000000092e+00 -4.931250381469726562e+01 +1.049775000000000125e+00 -4.931250381469726562e+01 +1.049780000000000157e+00 -4.931250381469726562e+01 +1.049785000000000190e+00 -4.928125000000000000e+01 +1.049790000000000001e+00 -4.928125000000000000e+01 +1.049795000000000034e+00 -4.928125000000000000e+01 +1.049800000000000066e+00 -4.928125000000000000e+01 +1.049805000000000099e+00 -4.921875000000000000e+01 +1.049810000000000132e+00 -4.925000381469726562e+01 +1.049815000000000165e+00 -4.918750381469726562e+01 +1.049819999999999975e+00 -4.915625381469726562e+01 +1.049825000000000008e+00 -4.915625381469726562e+01 +1.049830000000000041e+00 -4.915625381469726562e+01 +1.049835000000000074e+00 -4.915625381469726562e+01 +1.049840000000000106e+00 -4.915625381469726562e+01 +1.049845000000000139e+00 -4.909375381469726562e+01 +1.049850000000000172e+00 -4.903125381469726562e+01 +1.049854999999999983e+00 -4.906250000000000000e+01 +1.049860000000000015e+00 -4.900000381469726562e+01 +1.049865000000000048e+00 -4.903125381469726562e+01 +1.049870000000000081e+00 -4.906250000000000000e+01 +1.049875000000000114e+00 -4.903125381469726562e+01 +1.049880000000000146e+00 -4.893750381469726562e+01 +1.049885000000000179e+00 -4.900000381469726562e+01 +1.049889999999999990e+00 -4.900000381469726562e+01 +1.049895000000000023e+00 -4.893750381469726562e+01 +1.049900000000000055e+00 -4.900000381469726562e+01 +1.049905000000000088e+00 -4.896875000000000000e+01 +1.049910000000000121e+00 -4.900000381469726562e+01 +1.049915000000000154e+00 -4.893750381469726562e+01 +1.049920000000000186e+00 -4.890625000000000000e+01 +1.049924999999999997e+00 -4.881250000000000000e+01 +1.049930000000000030e+00 -4.881250000000000000e+01 +1.049935000000000063e+00 -4.881250000000000000e+01 +1.049940000000000095e+00 -4.878125381469726562e+01 +1.049945000000000128e+00 -4.881250000000000000e+01 +1.049950000000000161e+00 -4.878125381469726562e+01 +1.049955000000000194e+00 -4.884375381469726562e+01 +1.049960000000000004e+00 -4.878125381469726562e+01 +1.049965000000000037e+00 -4.878125381469726562e+01 +1.049970000000000070e+00 -4.875000381469726562e+01 +1.049975000000000103e+00 -4.865625000000000000e+01 +1.049980000000000135e+00 -4.868750381469726562e+01 +1.049985000000000168e+00 -4.865625000000000000e+01 +1.049989999999999979e+00 -4.868750381469726562e+01 +1.049995000000000012e+00 -4.868750381469726562e+01 diff --git a/test/ephys/data/spike_test_var_dt.txt b/test/ephys/data/spike_test_var_dt.txt new file mode 100644 index 0000000000..4c91125c96 --- /dev/null +++ b/test/ephys/data/spike_test_var_dt.txt @@ -0,0 +1,911 @@ +9.507079124450683594e-01 -8.851660156250000000e+01 +9.607079029083251953e-01 -8.851660156250000000e+01 +9.707078933715820312e-01 -8.851660156250000000e+01 +9.807078838348388672e-01 -8.851660156250000000e+01 +9.907079339027404785e-01 -8.851660156250000000e+01 +1.000000000000000000e+00 -8.851660156250000000e+01 +1.000000000000000000e+00 -8.851660156250000000e+01 +1.000000715255737305e+00 -8.847460937500000000e+01 +1.000001430511474609e+00 -8.843382263183593750e+01 +1.000002980232238770e+00 -8.835644531250000000e+01 +1.000004410743713379e+00 -8.828247833251953125e+01 +1.000007033348083496e+00 -8.815850067138671875e+01 +1.000009655952453613e+00 -8.804308319091796875e+01 +1.000012278556823730e+00 -8.793473052978515625e+01 +1.000016093254089355e+00 -8.778266143798828125e+01 +1.000020027160644531e+00 -8.764108276367187500e+01 +1.000026583671569824e+00 -8.742492675781250000e+01 +1.000033020973205566e+00 -8.722599792480468750e+01 +1.000039458274841309e+00 -8.704072570800781250e+01 +1.000046014785766602e+00 -8.686701202392578125e+01 +1.000052452087402344e+00 -8.670328521728515625e+01 +1.000062823295593262e+00 -8.645758056640625000e+01 +1.000073313713073730e+00 -8.623004913330078125e+01 +1.000083684921264648e+00 -8.601733398437500000e+01 +1.000094175338745117e+00 -8.581699371337890625e+01 +1.000110149383544922e+00 -8.553079223632812500e+01 +1.000126004219055176e+00 -8.526438140869140625e+01 +1.000141978263854980e+00 -8.501398468017578125e+01 +1.000166058540344238e+00 -8.466117095947265625e+01 +1.000190019607543945e+00 -8.433199310302734375e+01 +1.000214099884033203e+00 -8.402182769775390625e+01 +1.000255942344665527e+00 -8.351735687255859375e+01 +1.000297784805297852e+00 -8.304924011230468750e+01 +1.000339627265930176e+00 -8.261071014404296875e+01 +1.000381469726562500e+00 -8.219656372070312500e+01 +1.000423312187194824e+00 -8.180268096923828125e+01 +1.000465154647827148e+00 -8.142619323730468750e+01 +1.000530481338500977e+00 -8.086806488037109375e+01 +1.000595927238464355e+00 -8.034201049804687500e+01 +1.000661253929138184e+00 -7.984380340576171875e+01 +1.000726580619812012e+00 -7.936975860595703125e+01 +1.000792026519775391e+00 -7.891678619384765625e+01 +1.000895500183105469e+00 -7.823693847656250000e+01 +1.000998973846435547e+00 -7.759634399414062500e+01 +1.001102566719055176e+00 -7.698915100097656250e+01 +1.001206040382385254e+00 -7.641068267822265625e+01 +1.001309514045715332e+00 -7.585710144042968750e+01 +1.001471638679504395e+00 -7.503276824951171875e+01 +1.001633763313293457e+00 -7.425279998779296875e+01 +1.001795887947082520e+00 -7.351052856445312500e+01 +1.001958012580871582e+00 -7.280084228515625000e+01 +1.002120137214660645e+00 -7.211972808837890625e+01 +1.002282261848449707e+00 -7.146398925781250000e+01 +1.002544760704040527e+00 -7.044970703125000000e+01 +1.002807259559631348e+00 -6.948678588867187500e+01 +1.003069758415222168e+00 -6.856851196289062500e+01 +1.003332257270812988e+00 -6.768940734863281250e+01 +1.003594636917114258e+00 -6.684343719482421875e+01 +1.003857135772705078e+00 -6.602583312988281250e+01 +1.004119634628295898e+00 -6.523015594482421875e+01 +1.004382133483886719e+00 -6.445251464843750000e+01 +1.004644632339477539e+00 -6.368165206909179688e+01 +1.004907131195068359e+00 -6.291841888427734375e+01 +1.005169510841369629e+00 -6.214191436767578125e+01 +1.005432009696960449e+00 -6.134373474121093750e+01 +1.005694508552551270e+00 -6.049895095825195312e+01 +1.005957007408142090e+00 -5.958083343505859375e+01 +1.006219506263732910e+00 -5.853412246704101562e+01 +1.006397485733032227e+00 -5.769275283813476562e+01 +1.006575465202331543e+00 -5.667649078369140625e+01 +1.006688714027404785e+00 -5.586159896850585938e+01 +1.006801962852478027e+00 -5.481782913208007812e+01 +1.006875038146972656e+00 -5.392735290527343750e+01 +1.006948113441467285e+00 -5.275650787353515625e+01 +1.006993293762207031e+00 -5.178384017944335938e+01 +1.007038474082946777e+00 -5.047343063354492188e+01 +1.007083535194396973e+00 -4.857724380493164062e+01 +1.007108330726623535e+00 -4.711700820922851562e+01 +1.007133126258850098e+00 -4.513039016723632812e+01 +1.007150053977966309e+00 -4.330335235595703125e+01 +1.007166862487792969e+00 -4.088808441162109375e+01 +1.007183790206909180e+00 -3.754114151000976562e+01 +1.007200598716735840e+00 -3.274333572387695312e+01 +1.007217526435852051e+00 -2.585081863403320312e+01 +1.007225275039672852e+00 -2.190510559082031250e+01 +1.007233023643493652e+00 -1.760979843139648438e+01 +1.007240772247314453e+00 -1.321921443939208984e+01 +1.007248520851135254e+00 -9.143792152404785156e+00 +1.007253289222717285e+00 -6.919788837432861328e+00 +1.007258176803588867e+00 -4.999646663665771484e+00 +1.007262945175170898e+00 -3.409727811813354492e+00 +1.007267713546752930e+00 -2.153257846832275391e+00 +1.007272601127624512e+00 -1.215311050415039062e+00 +1.007277369499206543e+00 -5.670096874237060547e-01 +1.007282257080078125e+00 -1.724269986152648926e-01 +1.007287025451660156e+00 3.154490143060684204e-03 +1.007291913032531738e+00 -1.089370902627706528e-02 +1.007296681404113770e+00 -1.894766688346862793e-01 +1.007301568984985352e+00 -5.093165040016174316e-01 +1.007306337356567383e+00 -9.482851028442382812e-01 +1.007314562797546387e+00 -1.919624567031860352e+00 +1.007322907447814941e+00 -3.099925518035888672e+00 +1.007331132888793945e+00 -4.423087120056152344e+00 +1.007339358329772949e+00 -5.840911388397216797e+00 +1.007347583770751953e+00 -7.316580295562744141e+00 +1.007355809211730957e+00 -8.822293281555175781e+00 +1.007364034652709961e+00 -1.033877563476562500e+01 +1.007372379302978516e+00 -1.185295677185058594e+01 +1.007380604743957520e+00 -1.335607719421386719e+01 +1.007394552230834961e+00 -1.586671257019042969e+01 +1.007408618927001953e+00 -1.831671714782714844e+01 +1.007422566413879395e+00 -2.070552635192871094e+01 +1.007436513900756836e+00 -2.303868675231933594e+01 +1.007450580596923828e+00 -2.532361984252929688e+01 +1.007464528083801270e+00 -2.756879234313964844e+01 +1.007478594779968262e+00 -2.978553581237792969e+01 +1.007492542266845703e+00 -3.198636436462402344e+01 +1.007506489753723145e+00 -3.418122100830078125e+01 +1.007520556449890137e+00 -3.637652206420898438e+01 +1.007534503936767578e+00 -3.857660675048828125e+01 +1.007548570632934570e+00 -4.078340148925781250e+01 +1.007570385932922363e+00 -4.422469329833984375e+01 +1.007592201232910156e+00 -4.761068344116210938e+01 +1.007614016532897949e+00 -5.084682846069335938e+01 +1.007635951042175293e+00 -5.383038711547851562e+01 +1.007657766342163086e+00 -5.649696731567382812e+01 +1.007679581642150879e+00 -5.881449127197265625e+01 +1.007701396942138672e+00 -6.078889083862304688e+01 +1.007723212242126465e+00 -6.244721603393554688e+01 +1.007745146751403809e+00 -6.383298873901367188e+01 +1.007766962051391602e+00 -6.500092315673828125e+01 +1.007788777351379395e+00 -6.600278472900390625e+01 +1.007810592651367188e+00 -6.687615203857421875e+01 +1.007832527160644531e+00 -6.764411926269531250e+01 +1.007854342460632324e+00 -6.832208251953125000e+01 +1.007876157760620117e+00 -6.892327117919921875e+01 +1.007897973060607910e+00 -6.945981597900390625e+01 +1.007919907569885254e+00 -6.994164276123046875e+01 +1.007952690124511719e+00 -7.057957458496093750e+01 +1.007985591888427734e+00 -7.112813568115234375e+01 +1.008018493652343750e+00 -7.160122680664062500e+01 +1.008051395416259766e+00 -7.201017761230468750e+01 +1.008084297180175781e+00 -7.236416625976562500e+01 +1.008117198944091797e+00 -7.267042541503906250e+01 +1.008168101310729980e+00 -7.306375885009765625e+01 +1.008219003677368164e+00 -7.337393951416015625e+01 +1.008269906044006348e+00 -7.361463165283203125e+01 +1.008320808410644531e+00 -7.379674530029296875e+01 +1.008371710777282715e+00 -7.392920684814453125e+01 +1.008422613143920898e+00 -7.401927947998046875e+01 +1.008473515510559082e+00 -7.407292175292968750e+01 +1.008550524711608887e+00 -7.409583282470703125e+01 +1.008627414703369141e+00 -7.406075286865234375e+01 +1.008704304695129395e+00 -7.397821807861328125e+01 +1.008781194686889648e+00 -7.385667419433593750e+01 +1.008858203887939453e+00 -7.370301055908203125e+01 +1.008935093879699707e+00 -7.352278137207031250e+01 +1.009011983871459961e+00 -7.332048034667968750e+01 +1.009142279624938965e+00 -7.293751525878906250e+01 +1.009272575378417969e+00 -7.251565551757812500e+01 +1.009402990341186523e+00 -7.206501007080078125e+01 +1.009533286094665527e+00 -7.159320831298828125e+01 +1.009663581848144531e+00 -7.110652923583984375e+01 +1.009793877601623535e+00 -7.060981750488281250e+01 +1.009924173355102539e+00 -7.010655212402343750e+01 +1.010145783424377441e+00 -6.924359130859375000e+01 +1.010367274284362793e+00 -6.837960052490234375e+01 +1.010588765144348145e+00 -6.752004241943359375e+01 +1.010810375213623047e+00 -6.666783142089843750e+01 +1.011031866073608398e+00 -6.582414245605468750e+01 +1.011253476142883301e+00 -6.498931121826171875e+01 +1.011601924896240234e+00 -6.368210983276367188e+01 +1.011950373649597168e+00 -6.235556411743164062e+01 +1.012298822402954102e+00 -6.096501159667968750e+01 +1.012647271156311035e+00 -5.941593170166015625e+01 +1.012995719909667969e+00 -5.750837326049804688e+01 +1.013082861900329590e+00 -5.690219497680664062e+01 +1.013170003890991211e+00 -5.616603851318359375e+01 +1.013257145881652832e+00 -5.524655532836914062e+01 +1.013344287872314453e+00 -5.411119842529296875e+01 +1.013365983963012695e+00 -5.377533721923828125e+01 +1.013387799263000488e+00 -5.339432144165039062e+01 +1.013409614562988281e+00 -5.297850036621093750e+01 +1.013431310653686523e+00 -5.251800918579101562e+01 +1.013453125953674316e+00 -5.199626159667968750e+01 +1.013474941253662109e+00 -5.139112472534179688e+01 +1.013496756553649902e+00 -5.069021987915039062e+01 +1.013518452644348145e+00 -4.986330795288085938e+01 +1.013540267944335938e+00 -4.886272430419921875e+01 +1.013562083244323730e+00 -4.759924697875976562e+01 +1.013583779335021973e+00 -4.596282958984375000e+01 +1.013605594635009766e+00 -4.373835372924804688e+01 +1.013627409934997559e+00 -4.054758071899414062e+01 +1.013649106025695801e+00 -3.565874099731445312e+01 +1.013670921325683594e+00 -2.786275100708007812e+01 +1.013682246208190918e+00 -2.219725418090820312e+01 +1.013689756393432617e+00 -1.785577201843261719e+01 +1.013697385787963867e+00 -1.337776660919189453e+01 +1.013704895973205566e+00 -9.146274566650390625e+00 +1.013712406158447266e+00 -5.533134937286376953e+00 +1.013720035552978516e+00 -2.767569065093994141e+00 +1.013727545738220215e+00 -8.142220377922058105e-01 +1.013732433319091797e+00 6.675173342227935791e-02 +1.013737440109252930e+00 6.210120320320129395e-01 +1.013742446899414062e+00 8.906840085983276367e-01 +1.013747334480285645e+00 9.491816759109497070e-01 +1.013752341270446777e+00 8.381766080856323242e-01 +1.013757348060607910e+00 5.602663755416870117e-01 +1.013762235641479492e+00 1.291086375713348389e-01 +1.013767242431640625e+00 -4.154306650161743164e-01 +1.013772249221801758e+00 -1.039631724357604980e+00 +1.013777136802673340e+00 -1.734148025512695312e+00 +1.013782143592834473e+00 -2.496266603469848633e+00 +1.013787150382995605e+00 -3.311170339584350586e+00 +1.013792037963867188e+00 -4.158343791961669922e+00 +1.013797044754028320e+00 -5.027078628540039062e+00 +1.013802051544189453e+00 -5.916303157806396484e+00 +1.013806939125061035e+00 -6.822744369506835938e+00 +1.013811945915222168e+00 -7.737337112426757812e+00 +1.013816952705383301e+00 -8.652715682983398438e+00 +1.013821840286254883e+00 -9.567711830139160156e+00 +1.013826847076416016e+00 -1.048278713226318359e+01 +1.013831853866577148e+00 -1.139521598815917969e+01 +1.013836741447448730e+00 -1.230100345611572266e+01 +1.013841748237609863e+00 -1.319893360137939453e+01 +1.013846755027770996e+00 -1.409014511108398438e+01 +1.013851642608642578e+00 -1.497479724884033203e+01 +1.013856649398803711e+00 -1.585130596160888672e+01 +1.013861656188964844e+00 -1.671862220764160156e+01 +1.013866543769836426e+00 -1.757747459411621094e+01 +1.013871550559997559e+00 -1.842894554138183594e+01 +1.013879299163818359e+00 -1.973963546752929688e+01 +1.013887047767639160e+00 -2.103209686279296875e+01 +1.013894677162170410e+00 -2.230721664428710938e+01 +1.013902425765991211e+00 -2.356706047058105469e+01 +1.013917684555053711e+00 -2.601805114746093750e+01 +1.013932943344116211e+00 -2.843140983581542969e+01 +1.013948321342468262e+00 -3.082322692871093750e+01 +1.013963580131530762e+00 -3.320513153076171875e+01 +1.013978838920593262e+00 -3.558768844604492188e+01 +1.013994097709655762e+00 -3.797840499877929688e+01 +1.014009356498718262e+00 -4.038064193725585938e+01 +1.014033079147338867e+00 -4.412617874145507812e+01 +1.014056801795959473e+00 -4.781307983398437500e+01 +1.014080643653869629e+00 -5.132147979736328125e+01 +1.014104366302490234e+00 -5.452622222900390625e+01 +1.014128088951110840e+00 -5.733792877197265625e+01 +1.014151930809020996e+00 -5.974950408935546875e+01 +1.014175653457641602e+00 -6.176091003417968750e+01 +1.014199376106262207e+00 -6.340298461914062500e+01 +1.014223217964172363e+00 -6.476057434082031250e+01 +1.014246940612792969e+00 -6.593183135986328125e+01 +1.014270663261413574e+00 -6.696395111083984375e+01 +1.014294505119323730e+00 -6.785570526123046875e+01 +1.014318227767944336e+00 -6.861429595947265625e+01 +1.014341950416564941e+00 -6.927654266357421875e+01 +1.014365673065185547e+00 -6.987570190429687500e+01 +1.014389514923095703e+00 -7.041738128662109375e+01 +1.014413237571716309e+00 -7.089640045166015625e+01 +1.014436960220336914e+00 -7.131946563720703125e+01 +1.014460802078247070e+00 -7.170162963867187500e+01 +1.014484524726867676e+00 -7.205084228515625000e+01 +1.014508247375488281e+00 -7.236627960205078125e+01 +1.014532089233398438e+00 -7.264776611328125000e+01 +1.014555811882019043e+00 -7.290032958984375000e+01 +1.014579534530639648e+00 -7.312937164306640625e+01 +1.014603376388549805e+00 -7.333665466308593750e+01 +1.014627099037170410e+00 -7.352227783203125000e+01 +1.014650821685791016e+00 -7.368779754638671875e+01 +1.014674544334411621e+00 -7.383587646484375000e+01 +1.014698386192321777e+00 -7.396836090087890625e+01 +1.014722108840942383e+00 -7.408592224121093750e+01 +1.014745831489562988e+00 -7.418928527832031250e+01 +1.014769673347473145e+00 -7.427974700927734375e+01 +1.014806032180786133e+00 -7.439571380615234375e+01 +1.014842510223388672e+00 -7.448694610595703125e+01 +1.014878869056701660e+00 -7.455630493164062500e+01 +1.014915347099304199e+00 -7.460579681396484375e+01 +1.014983415603637695e+00 -7.465161132812500000e+01 +1.015051484107971191e+00 -7.464561462402343750e+01 +1.015119552612304688e+00 -7.459616088867187500e+01 +1.015187621116638184e+00 -7.451063537597656250e+01 +1.015255689620971680e+00 -7.439509582519531250e+01 +1.015323758125305176e+00 -7.425426483154296875e+01 +1.015432000160217285e+00 -7.398750305175781250e+01 +1.015540242195129395e+00 -7.367899322509765625e+01 +1.015648603439331055e+00 -7.333802795410156250e+01 +1.015756845474243164e+00 -7.297196197509765625e+01 +1.015865206718444824e+00 -7.258668518066406250e+01 +1.015973448753356934e+00 -7.218681335449218750e+01 +1.016081690788269043e+00 -7.177598571777343750e+01 +1.016263246536254883e+00 -7.107096099853515625e+01 +1.016444683074951172e+00 -7.035379791259765625e+01 +1.016626119613647461e+00 -6.963174438476562500e+01 +1.016807556152343750e+00 -6.890946197509765625e+01 +1.016988992691040039e+00 -6.819098663330078125e+01 +1.017170429229736328e+00 -6.747808837890625000e+01 +1.017351865768432617e+00 -6.677255249023437500e+01 +1.017533421516418457e+00 -6.607270812988281250e+01 +1.017714858055114746e+00 -6.538097381591796875e+01 +1.017896294593811035e+00 -6.468946838378906250e+01 +1.018077731132507324e+00 -6.399879837036132812e+01 +1.018259167671203613e+00 -6.330052947998046875e+01 +1.018440604209899902e+00 -6.259780502319335938e+01 +1.018622040748596191e+00 -6.188908004760742188e+01 +1.018803596496582031e+00 -6.115329360961914062e+01 +1.018985033035278320e+00 -6.036925506591796875e+01 +1.019166469573974609e+00 -5.951843261718750000e+01 +1.019347906112670898e+00 -5.857019424438476562e+01 +1.019529342651367188e+00 -5.744470977783203125e+01 +1.019710779190063477e+00 -5.603475570678710938e+01 +1.019756197929382324e+00 -5.558567810058593750e+01 +1.019801497459411621e+00 -5.505092239379882812e+01 +1.019846916198730469e+00 -5.444883346557617188e+01 +1.019892215728759766e+00 -5.376362991333007812e+01 +1.019937634468078613e+00 -5.292377090454101562e+01 +1.019982933998107910e+00 -5.184263610839843750e+01 +1.020028352737426758e+00 -5.037401962280273438e+01 +1.020073771476745605e+00 -4.834168624877929688e+01 +1.020078897476196289e+00 -4.804086303710937500e+01 +1.020084142684936523e+00 -4.769799423217773438e+01 +1.020089387893676758e+00 -4.733786010742187500e+01 +1.020094633102416992e+00 -4.696257400512695312e+01 +1.020099878311157227e+00 -4.656223678588867188e+01 +1.020105123519897461e+00 -4.613038635253906250e+01 +1.020110368728637695e+00 -4.566606140136718750e+01 +1.020115613937377930e+00 -4.516764068603515625e+01 +1.020120859146118164e+00 -4.462964248657226562e+01 +1.020126104354858398e+00 -4.404484176635742188e+01 +1.020131349563598633e+00 -4.340686416625976562e+01 +1.020136594772338867e+00 -4.270962524414062500e+01 +1.020141839981079102e+00 -4.194498062133789062e+01 +1.020149827003479004e+00 -4.062490463256835938e+01 +1.020157814025878906e+00 -3.907735824584960938e+01 +1.020165801048278809e+00 -3.724625778198242188e+01 +1.020173788070678711e+00 -3.506322479248046875e+01 +1.020181775093078613e+00 -3.244709014892578125e+01 +1.020194292068481445e+00 -2.725678634643554688e+01 +1.020201921463012695e+00 -2.347482299804687500e+01 +1.020209431648254395e+00 -1.923937034606933594e+01 +1.020216941833496094e+00 -1.475457096099853516e+01 +1.020224452018737793e+00 -1.037910938262939453e+01 +1.020231962203979492e+00 -6.485013008117675781e+00 +1.020237088203430176e+00 -4.248546600341796875e+00 +1.020242333412170410e+00 -2.432409763336181641e+00 +1.020247459411621094e+00 -1.021265745162963867e+00 +1.020252704620361328e+00 1.335068047046661377e-02 +1.020257830619812012e+00 7.032673358917236328e-01 +1.020263075828552246e+00 1.090967655181884766e+00 +1.020268201828002930e+00 1.224498510360717773e+00 +1.020273447036743164e+00 1.145912170410156250e+00 +1.020278573036193848e+00 8.873941898345947266e-01 +1.020283818244934082e+00 4.755212664604187012e-01 +1.020288944244384766e+00 -6.424966454505920410e-02 +1.020294189453125000e+00 -7.074375152587890625e-01 +1.020301938056945801e+00 -1.829130291938781738e+00 +1.020309805870056152e+00 -3.081596136093139648e+00 +1.020317673683166504e+00 -4.421465396881103516e+00 +1.020325422286987305e+00 -5.816086292266845703e+00 +1.020333290100097656e+00 -7.240248680114746094e+00 +1.020341157913208008e+00 -8.675456047058105469e+00 +1.020348906517028809e+00 -1.010928821563720703e+01 +1.020361185073852539e+00 -1.232103443145751953e+01 +1.020373344421386719e+00 -1.449237918853759766e+01 +1.020385503768920898e+00 -1.661767768859863281e+01 +1.020397663116455078e+00 -1.869567108154296875e+01 +1.020409941673278809e+00 -2.072863006591796875e+01 +1.020422101020812988e+00 -2.272123718261718750e+01 +1.020434260368347168e+00 -2.468004226684570312e+01 +1.020446419715881348e+00 -2.661237907409667969e+01 +1.020465850830078125e+00 -2.964683914184570312e+01 +1.020485162734985352e+00 -3.265858840942382812e+01 +1.020504593849182129e+00 -3.567220687866210938e+01 +1.020524024963378906e+00 -3.870489501953125000e+01 +1.020543336868286133e+00 -4.175797653198242188e+01 +1.020562767982482910e+00 -4.480915451049804688e+01 +1.020582079887390137e+00 -4.781171798706054688e+01 +1.020601511001586914e+00 -5.070167160034179688e+01 +1.020620822906494141e+00 -5.341057968139648438e+01 +1.020640254020690918e+00 -5.588055038452148438e+01 +1.020659685134887695e+00 -5.807590103149414062e+01 +1.020678997039794922e+00 -5.998813247680664062e+01 +1.020698428153991699e+00 -6.163462448120117188e+01 +1.020717740058898926e+00 -6.305146789550781250e+01 +1.020737171173095703e+00 -6.428067016601562500e+01 +1.020756483078002930e+00 -6.535713958740234375e+01 +1.020775914192199707e+00 -6.630458068847656250e+01 +1.020795345306396484e+00 -6.714110565185546875e+01 +1.020814657211303711e+00 -6.788460540771484375e+01 +1.020834088325500488e+00 -6.855195617675781250e+01 +1.020853400230407715e+00 -6.915535736083984375e+01 +1.020872831344604492e+00 -6.970240783691406250e+01 +1.020892143249511719e+00 -7.019922637939453125e+01 +1.020911574363708496e+00 -7.065220642089843750e+01 +1.020931005477905273e+00 -7.106713104248046875e+01 +1.020950317382812500e+00 -7.144806671142578125e+01 +1.020969748497009277e+00 -7.179784393310546875e+01 +1.020989060401916504e+00 -7.211915588378906250e+01 +1.021018981933593750e+00 -7.256476593017578125e+01 +1.021048903465270996e+00 -7.295747375488281250e+01 +1.021078705787658691e+00 -7.330381011962890625e+01 +1.021108627319335938e+00 -7.360877227783203125e+01 +1.021159529685974121e+00 -7.404566955566406250e+01 +1.021210432052612305e+00 -7.439353942871093750e+01 +1.021261334419250488e+00 -7.466649627685546875e+01 +1.021312236785888672e+00 -7.487635040283203125e+01 +1.021363139152526855e+00 -7.503279113769531250e+01 +1.021414041519165039e+00 -7.514360809326171875e+01 +1.021464943885803223e+00 -7.521516418457031250e+01 +1.021545886993408203e+00 -7.526108551025390625e+01 +1.021626710891723633e+00 -7.523870086669921875e+01 +1.021707534790039062e+00 -7.516116333007812500e+01 +1.021788358688354492e+00 -7.503882598876953125e+01 +1.021910905838012695e+00 -7.478597259521484375e+01 +1.022033452987670898e+00 -7.447106170654296875e+01 +1.022156000137329102e+00 -7.411038970947265625e+01 +1.022278428077697754e+00 -7.371560668945312500e+01 +1.022400975227355957e+00 -7.329535675048828125e+01 +1.022523522377014160e+00 -7.285634613037109375e+01 +1.022708177566528320e+00 -7.216989135742187500e+01 +1.022892832756042480e+00 -7.146511840820312500e+01 +1.023077607154846191e+00 -7.075263214111328125e+01 +1.023262262344360352e+00 -7.003929901123046875e+01 +1.023446917533874512e+00 -6.932897186279296875e+01 +1.023631572723388672e+00 -6.862397003173828125e+01 +1.023816227912902832e+00 -6.792721557617187500e+01 +1.024001002311706543e+00 -6.723916625976562500e+01 +1.024185657501220703e+00 -6.656011962890625000e+01 +1.024370312690734863e+00 -6.588763427734375000e+01 +1.024554967880249023e+00 -6.522546386718750000e+01 +1.024739623069763184e+00 -6.456358337402343750e+01 +1.024924397468566895e+00 -6.390193939208984375e+01 +1.025109052658081055e+00 -6.323044204711914062e+01 +1.025293707847595215e+00 -6.255639648437500000e+01 +1.025478363037109375e+00 -6.188111877441406250e+01 +1.025663018226623535e+00 -6.117990493774414062e+01 +1.025847792625427246e+00 -6.045443725585937500e+01 +1.025893926620483398e+00 -6.025886154174804688e+01 +1.025940060615539551e+00 -6.005141448974609375e+01 +1.025986313819885254e+00 -5.984492111206054688e+01 +1.026032447814941406e+00 -5.963843917846679688e+01 +1.026078581809997559e+00 -5.942505264282226562e+01 +1.026124835014343262e+00 -5.920819091796875000e+01 +1.026170969009399414e+00 -5.898506164550781250e+01 +1.026217103004455566e+00 -5.874961853027343750e+01 +1.026263236999511719e+00 -5.849142456054687500e+01 +1.026309490203857422e+00 -5.823012161254882812e+01 +1.026355624198913574e+00 -5.796654891967773438e+01 +1.026401758193969727e+00 -5.768784332275390625e+01 +1.026448011398315430e+00 -5.736917877197265625e+01 +1.026494145393371582e+00 -5.703341293334960938e+01 +1.026540279388427734e+00 -5.668022918701171875e+01 +1.026586532592773438e+00 -5.634148406982421875e+01 +1.026619911193847656e+00 -5.606926345825195312e+01 +1.026653289794921875e+00 -5.573027038574218750e+01 +1.026686668395996094e+00 -5.538498306274414062e+01 +1.026709437370300293e+00 -5.515527725219726562e+01 +1.026732087135314941e+00 -5.488626861572265625e+01 +1.026754736900329590e+00 -5.458708953857421875e+01 +1.026777505874633789e+00 -5.427109909057617188e+01 +1.026800155639648438e+00 -5.394044494628906250e+01 +1.026822805404663086e+00 -5.356670379638671875e+01 +1.026845574378967285e+00 -5.313830566406250000e+01 +1.026868224143981934e+00 -5.266225051879882812e+01 +1.026890873908996582e+00 -5.214607238769531250e+01 +1.026913642883300781e+00 -5.155647277832031250e+01 +1.026936292648315430e+00 -5.084555053710937500e+01 +1.026958942413330078e+00 -4.997639465332031250e+01 +1.026981711387634277e+00 -4.893759918212890625e+01 +1.027004361152648926e+00 -4.766393661499023438e+01 +1.027027130126953125e+00 -4.600901031494140625e+01 +1.027049779891967773e+00 -4.367323684692382812e+01 +1.027072429656982422e+00 -4.025855636596679688e+01 +1.027086734771728516e+00 -3.720411682128906250e+01 +1.027097225189208984e+00 -3.420817184448242188e+01 +1.027107715606689453e+00 -3.041830825805664062e+01 +1.027118206024169922e+00 -2.566609764099121094e+01 +1.027125954627990723e+00 -2.154637145996093750e+01 +1.027133703231811523e+00 -1.704385566711425781e+01 +1.027141332626342773e+00 -1.246458148956298828e+01 +1.027149081230163574e+00 -8.242345809936523438e+00 +1.027154564857482910e+00 -5.650176525115966797e+00 +1.027160048484802246e+00 -3.476511001586914062e+00 +1.027165651321411133e+00 -1.737539172172546387e+00 +1.027171134948730469e+00 -4.411928057670593262e-01 +1.027176618576049805e+00 4.288343489170074463e-01 +1.027182102203369141e+00 9.431852698326110840e-01 +1.027187585830688477e+00 1.182316064834594727e+00 +1.027193069458007812e+00 1.183700084686279297e+00 +1.027198553085327148e+00 9.604490399360656738e-01 +1.027204036712646484e+00 5.447914004325866699e-01 +1.027209639549255371e+00 -1.247794181108474731e-02 +1.027215123176574707e+00 -6.740579009056091309e-01 +1.027220606803894043e+00 -1.427010536193847656e+00 +1.027226090431213379e+00 -2.261763811111450195e+00 +1.027231574058532715e+00 -3.156217813491821289e+00 +1.027237057685852051e+00 -4.086537837982177734e+00 +1.027242541313171387e+00 -5.042024135589599609e+00 +1.027248024940490723e+00 -6.020570755004882812e+00 +1.027253627777099609e+00 -7.015780925750732422e+00 +1.027259111404418945e+00 -8.016482353210449219e+00 +1.027264595031738281e+00 -9.015815734863281250e+00 +1.027270078659057617e+00 -1.001357841491699219e+01 +1.027275562286376953e+00 -1.100960636138916016e+01 +1.027281045913696289e+00 -1.199994277954101562e+01 +1.027286529541015625e+00 -1.298067569732666016e+01 +1.027292013168334961e+00 -1.395175552368164062e+01 +1.027297496795654297e+00 -1.491485881805419922e+01 +1.027303099632263184e+00 -1.586963367462158203e+01 +1.027308583259582520e+00 -1.681417274475097656e+01 +1.027314066886901855e+00 -1.774806976318359375e+01 +1.027319550514221191e+00 -1.867289161682128906e+01 +1.027325034141540527e+00 -1.958983421325683594e+01 +1.027330517768859863e+00 -2.049853324890136719e+01 +1.027339220046997070e+00 -2.191117477416992188e+01 +1.027347803115844727e+00 -2.330451583862304688e+01 +1.027356505393981934e+00 -2.468202018737792969e+01 +1.027365088462829590e+00 -2.604794502258300781e+01 +1.027379870414733887e+00 -2.835879516601562500e+01 +1.027394652366638184e+00 -3.065323829650878906e+01 +1.027409434318542480e+00 -3.294109344482421875e+01 +1.027424216270446777e+00 -3.523189163208007812e+01 +1.027438998222351074e+00 -3.753260421752929688e+01 +1.027453780174255371e+00 -3.984650802612304688e+01 +1.027468442916870117e+00 -4.217059707641601562e+01 +1.027483224868774414e+00 -4.449314880371093750e+01 +1.027498006820678711e+00 -4.679349517822265625e+01 +1.027512788772583008e+00 -4.904373550415039062e+01 +1.027527570724487305e+00 -5.121219635009765625e+01 +1.027542352676391602e+00 -5.326796340942382812e+01 +1.027557134628295898e+00 -5.518549728393554688e+01 +1.027571797370910645e+00 -5.694800186157226562e+01 +1.027586579322814941e+00 -5.854865264892578125e+01 +1.027601361274719238e+00 -5.998978805541992188e+01 +1.027616143226623535e+00 -6.128082656860351562e+01 +1.027630925178527832e+00 -6.243565368652343750e+01 +1.027645707130432129e+00 -6.347001647949218750e+01 +1.027667880058288574e+00 -6.482911682128906250e+01 +1.027690052986145020e+00 -6.599630737304687500e+01 +1.027712225914001465e+00 -6.701004028320312500e+01 +1.027734279632568359e+00 -6.790081787109375000e+01 +1.027756452560424805e+00 -6.869051361083984375e+01 +1.027778625488281250e+00 -6.939381408691406250e+01 +1.027800798416137695e+00 -7.002223968505859375e+01 +1.027822971343994141e+00 -7.058698272705078125e+01 +1.027845144271850586e+00 -7.109792327880859375e+01 +1.027867317199707031e+00 -7.156186676025390625e+01 +1.027889490127563477e+00 -7.198320007324218750e+01 +1.027911663055419922e+00 -7.236598205566406250e+01 +1.027933835983276367e+00 -7.271457672119140625e+01 +1.027967691421508789e+00 -7.318981933593750000e+01 +1.028001666069030762e+00 -7.360253143310546875e+01 +1.028035521507263184e+00 -7.396133422851562500e+01 +1.028069496154785156e+00 -7.427278137207031250e+01 +1.028103351593017578e+00 -7.454185485839843750e+01 +1.028158426284790039e+00 -7.490083312988281250e+01 +1.028213500976562500e+00 -7.517836761474609375e+01 +1.028268575668334961e+00 -7.538739776611328125e+01 +1.028323531150817871e+00 -7.553836822509765625e+01 +1.028378605842590332e+00 -7.564025115966796875e+01 +1.028433680534362793e+00 -7.570063018798828125e+01 +1.028488755226135254e+00 -7.572554779052734375e+01 +1.028573989868164062e+00 -7.570544433593750000e+01 +1.028659343719482422e+00 -7.562667846679687500e+01 +1.028744578361511230e+00 -7.550055694580078125e+01 +1.028829932212829590e+00 -7.533621978759765625e+01 +1.028915166854858398e+00 -7.514095306396484375e+01 +1.029000520706176758e+00 -7.492054748535156250e+01 +1.029085874557495117e+00 -7.467963409423828125e+01 +1.029215693473815918e+00 -7.428199005126953125e+01 +1.029345512390136719e+00 -7.385610198974609375e+01 +1.029475450515747070e+00 -7.340965270996093750e+01 +1.029605269432067871e+00 -7.294858551025390625e+01 +1.029735207557678223e+00 -7.247768402099609375e+01 +1.029865026473999023e+00 -7.200066375732421875e+01 +1.029994845390319824e+00 -7.152037048339843750e+01 +1.030218839645385742e+00 -7.069087982177734375e+01 +1.030442833900451660e+00 -6.986647796630859375e+01 +1.030666708946228027e+00 -6.905260467529296875e+01 +1.030890703201293945e+00 -6.825148773193359375e+01 +1.031114697456359863e+00 -6.746551513671875000e+01 +1.031338691711425781e+00 -6.669308471679687500e+01 +1.031562566757202148e+00 -6.593670654296875000e+01 +1.031786561012268066e+00 -6.518679809570312500e+01 +1.032010555267333984e+00 -6.444423675537109375e+01 +1.032234430313110352e+00 -6.371035003662109375e+01 +1.032458424568176270e+00 -6.297325515747070312e+01 +1.032682418823242188e+00 -6.223880767822265625e+01 +1.032906293869018555e+00 -6.146751403808593750e+01 +1.032962322235107422e+00 -6.126530838012695312e+01 +1.033018350601196289e+00 -6.106454086303710938e+01 +1.033074378967285156e+00 -6.085915756225585938e+01 +1.033130288124084473e+00 -6.064901733398437500e+01 +1.033186316490173340e+00 -6.043517684936523438e+01 +1.033242344856262207e+00 -6.021516799926757812e+01 +1.033298254013061523e+00 -5.998792266845703125e+01 +1.033354282379150391e+00 -5.975705337524414062e+01 +1.033410310745239258e+00 -5.952481460571289062e+01 +1.033466219902038574e+00 -5.928257369995117188e+01 +1.033522248268127441e+00 -5.902170562744140625e+01 +1.033578276634216309e+00 -5.874552154541015625e+01 +1.033634185791015625e+00 -5.847120285034179688e+01 +1.033690214157104492e+00 -5.818925476074218750e+01 +1.033746242523193359e+00 -5.787240219116210938e+01 +1.033802151679992676e+00 -5.751039886474609375e+01 +1.033858180046081543e+00 -5.714308547973632812e+01 +1.033899188041687012e+00 -5.687387847900390625e+01 +1.033940076828002930e+00 -5.657421112060546875e+01 +1.033981084823608398e+00 -5.623462677001953125e+01 +1.034022092819213867e+00 -5.586777877807617188e+01 +1.034062981605529785e+00 -5.548962783813476562e+01 +1.034103989601135254e+00 -5.506883239746093750e+01 +1.034144997596740723e+00 -5.457042312622070312e+01 +1.034186005592346191e+00 -5.395161819458007812e+01 +1.034226894378662109e+00 -5.327541732788085938e+01 +1.034253358840942383e+00 -5.278717803955078125e+01 +1.034272909164428711e+00 -5.234416961669921875e+01 +1.034292340278625488e+00 -5.185004043579101562e+01 +1.034311771392822266e+00 -5.130375671386718750e+01 +1.034331202507019043e+00 -5.068784332275390625e+01 +1.034350633621215820e+00 -4.996349716186523438e+01 +1.034370064735412598e+00 -4.910141754150390625e+01 +1.034389495849609375e+00 -4.805704116821289062e+01 +1.034408926963806152e+00 -4.676334762573242188e+01 +1.034428358078002930e+00 -4.508861923217773438e+01 +1.034447789192199707e+00 -4.284345245361328125e+01 +1.034467339515686035e+00 -3.967770004272460938e+01 +1.034486770629882812e+00 -3.503475952148437500e+01 +1.034500479698181152e+00 -3.031393241882324219e+01 +1.034509539604187012e+00 -2.626640701293945312e+01 +1.034518599510192871e+00 -2.148854064941406250e+01 +1.034527659416198730e+00 -1.618760299682617188e+01 +1.034536719322204590e+00 -1.089506912231445312e+01 +1.034542679786682129e+00 -7.734103202819824219e+00 +1.034548759460449219e+00 -5.017329216003417969e+00 +1.034554719924926758e+00 -2.812122583389282227e+00 +1.034560680389404297e+00 -1.130622625350952148e+00 +1.034566760063171387e+00 3.322536498308181763e-02 +1.034572720527648926e+00 7.255477309226989746e-01 +1.034578680992126465e+00 1.047464966773986816e+00 +1.034584760665893555e+00 1.094254016876220703e+00 +1.034590721130371094e+00 9.001009464263916016e-01 +1.034596681594848633e+00 4.726105928421020508e-01 +1.034602761268615723e+00 -1.465684473514556885e-01 +1.034608721733093262e+00 -8.905089497566223145e-01 +1.034614682197570801e+00 -1.719613552093505859e+00 +1.034620761871337891e+00 -2.630845546722412109e+00 +1.034626722335815430e+00 -3.617805719375610352e+00 +1.034632682800292969e+00 -4.650696754455566406e+00 +1.034638762474060059e+00 -5.701207160949707031e+00 +1.034644722938537598e+00 -6.764478683471679688e+00 +1.034650683403015137e+00 -7.845070362091064453e+00 +1.034656763076782227e+00 -8.935457229614257812e+00 +1.034662723541259766e+00 -1.002226352691650391e+01 +1.034668684005737305e+00 -1.109833431243896484e+01 +1.034674763679504395e+00 -1.216734123229980469e+01 +1.034680724143981934e+00 -1.323143196105957031e+01 +1.034686684608459473e+00 -1.428547763824462891e+01 +1.034692764282226562e+00 -1.532542514801025391e+01 +1.034698724746704102e+00 -1.635356521606445312e+01 +1.034704685211181641e+00 -1.737330436706542969e+01 +1.034710764884948730e+00 -1.838376235961914062e+01 +1.034716725349426270e+00 -1.938218498229980469e+01 +1.034722685813903809e+00 -2.036895942687988281e+01 +1.034728765487670898e+00 -2.134724044799804688e+01 +1.034734725952148438e+00 -2.231868171691894531e+01 +1.034740686416625977e+00 -2.328221702575683594e+01 +1.034746766090393066e+00 -2.423716735839843750e+01 +1.034752726554870605e+00 -2.518528556823730469e+01 +1.034758687019348145e+00 -2.612888526916503906e+01 +1.034764647483825684e+00 -2.706851196289062500e+01 +1.034770727157592773e+00 -2.800364685058593750e+01 +1.034776687622070312e+00 -2.893483352661132812e+01 +1.034782648086547852e+00 -2.986384391784667969e+01 +1.034792065620422363e+00 -3.130791282653808594e+01 +1.034801363945007324e+00 -3.275196838378906250e+01 +1.034810662269592285e+00 -3.419738769531250000e+01 +1.034820079803466797e+00 -3.564522171020507812e+01 +1.034836649894714355e+00 -3.822010040283203125e+01 +1.034853100776672363e+00 -4.081180572509765625e+01 +1.034869670867919922e+00 -4.341218185424804688e+01 +1.034886240959167480e+00 -4.599911117553710938e+01 +1.034902811050415039e+00 -4.853630065917968750e+01 +1.034919261932373047e+00 -5.098001098632812500e+01 +1.034935832023620605e+00 -5.328748703002929688e+01 +1.034952402114868164e+00 -5.542396545410156250e+01 +1.034968852996826172e+00 -5.736736679077148438e+01 +1.034985423088073730e+00 -5.910990905761718750e+01 +1.035001993179321289e+00 -6.065696334838867188e+01 +1.035018563270568848e+00 -6.202384567260742188e+01 +1.035035014152526855e+00 -6.323155593872070312e+01 +1.035051584243774414e+00 -6.430252075195312500e+01 +1.035068154335021973e+00 -6.525746917724609375e+01 +1.035084724426269531e+00 -6.611396026611328125e+01 +1.035101175308227539e+00 -6.688639831542968750e+01 +1.035117745399475098e+00 -6.758661651611328125e+01 +1.035143613815307617e+00 -6.855737304687500000e+01 +1.035169363021850586e+00 -6.940422821044921875e+01 +1.035195231437683105e+00 -7.014952850341796875e+01 +1.035220980644226074e+00 -7.081093597412109375e+01 +1.035246849060058594e+00 -7.140131378173828125e+01 +1.035272598266601562e+00 -7.192963409423828125e+01 +1.035312891006469727e+00 -7.264660644531250000e+01 +1.035353064537048340e+00 -7.325357055664062500e+01 +1.035393238067626953e+00 -7.376742553710937500e+01 +1.035433530807495117e+00 -7.420314788818359375e+01 +1.035473704338073730e+00 -7.457257843017578125e+01 +1.035513997077941895e+00 -7.488452148437500000e+01 +1.035575389862060547e+00 -7.526661682128906250e+01 +1.035636901855468750e+00 -7.555323791503906250e+01 +1.035698294639587402e+00 -7.576079559326171875e+01 +1.035759806632995605e+00 -7.590296173095703125e+01 +1.035821199417114258e+00 -7.599070739746093750e+01 +1.035882711410522461e+00 -7.603268432617187500e+01 +1.035944104194641113e+00 -7.603601074218750000e+01 +1.036036968231201172e+00 -7.598049926757812500e+01 +1.036129951477050781e+00 -7.586607360839843750e+01 +1.036222815513610840e+00 -7.570477294921875000e+01 +1.036315679550170898e+00 -7.550607299804687500e+01 +1.036465167999267578e+00 -7.512596893310546875e+01 +1.036614656448364258e+00 -7.469119262695312500e+01 +1.036764144897460938e+00 -7.421954345703125000e+01 +1.036913514137268066e+00 -7.372275543212890625e+01 +1.037063002586364746e+00 -7.320849609375000000e+01 +1.037212491035461426e+00 -7.268313598632812500e+01 +1.037361979484558105e+00 -7.215210723876953125e+01 +1.037511467933654785e+00 -7.161880493164062500e+01 +1.037660837173461914e+00 -7.108586120605468750e+01 +1.037810325622558594e+00 -7.055595397949218750e+01 +1.037959814071655273e+00 -7.003073883056640625e+01 +1.038109302520751953e+00 -6.951049804687500000e+01 +1.038258671760559082e+00 -6.899612426757812500e+01 +1.038408160209655762e+00 -6.848917388916015625e+01 +1.038557648658752441e+00 -6.798980712890625000e+01 +1.038707137107849121e+00 -6.749651336669921875e+01 +1.038856625556945801e+00 -6.700959777832031250e+01 +1.039005994796752930e+00 -6.653038024902343750e+01 +1.039155483245849609e+00 -6.605827331542968750e+01 +1.039304971694946289e+00 -6.558908081054687500e+01 +1.039454460144042969e+00 -6.512375640869140625e+01 +1.039603948593139648e+00 -6.466513824462890625e+01 +1.039753317832946777e+00 -6.421041107177734375e+01 +1.039902806282043457e+00 -6.375017929077148438e+01 +1.040052294731140137e+00 -6.328818893432617188e+01 +1.040201783180236816e+00 -6.282777404785156250e+01 +1.040351271629333496e+00 -6.238013458251953125e+01 +1.040500640869140625e+00 -6.191254425048828125e+01 +1.040611267089843750e+00 -6.154252624511718750e+01 +1.040721893310546875e+00 -6.117369461059570312e+01 +1.040832519531250000e+00 -6.080197525024414062e+01 +1.040943145751953125e+00 -6.040757751464843750e+01 +1.041053771972656250e+00 -5.999265670776367188e+01 +1.041164398193359375e+00 -5.956604385375976562e+01 +1.041275024414062500e+00 -5.911016082763671875e+01 +1.041385650634765625e+00 -5.861387252807617188e+01 +1.041496276855468750e+00 -5.805910491943359375e+01 +1.041606903076171875e+00 -5.744200897216796875e+01 +1.041717529296875000e+00 -5.671152114868164062e+01 +1.041745185852050781e+00 -5.650662612915039062e+01 +1.041772842407226562e+00 -5.629737091064453125e+01 +1.041800498962402344e+00 -5.607124328613281250e+01 +1.041828155517578125e+00 -5.582941818237304688e+01 +1.041855812072753906e+00 -5.557338333129882812e+01 +1.041883468627929688e+00 -5.530241394042968750e+01 +1.041911125183105469e+00 -5.500506210327148438e+01 +1.041938781738281250e+00 -5.467860412597656250e+01 +1.041966438293457031e+00 -5.432251739501953125e+01 +1.041994094848632812e+00 -5.393775939941406250e+01 +1.042021751403808594e+00 -5.350494766235351562e+01 +1.042049407958984375e+00 -5.300724792480468750e+01 +1.042077064514160156e+00 -5.242581176757812500e+01 +1.042104721069335938e+00 -5.176123428344726562e+01 +1.042132377624511719e+00 -5.097561645507812500e+01 +1.042160034179687500e+00 -4.999350357055664062e+01 +1.042187690734863281e+00 -4.871686172485351562e+01 +1.042215347290039062e+00 -4.702680969238281250e+01 +1.042243003845214844e+00 -4.467447280883789062e+01 +1.042270660400390625e+00 -4.114283370971679688e+01 +1.042277574539184570e+00 -3.993592834472656250e+01 +1.042284488677978516e+00 -3.851056289672851562e+01 +1.042291402816772461e+00 -3.686356353759765625e+01 +1.042298316955566406e+00 -3.496628952026367188e+01 +1.042305231094360352e+00 -3.275718688964843750e+01 +1.042312145233154297e+00 -3.016466712951660156e+01 +1.042319059371948242e+00 -2.714208412170410156e+01 +1.042325973510742188e+00 -2.368921279907226562e+01 +1.042332887649536133e+00 -1.986608886718750000e+01 +1.042339801788330078e+00 -1.581947994232177734e+01 +1.042346715927124023e+00 -1.180189037322998047e+01 +1.042353630065917969e+00 -8.123357772827148438e+00 +1.042360544204711914e+00 -5.025801181793212891e+00 +1.042367339134216309e+00 -2.593507766723632812e+00 +1.042374253273010254e+00 -8.099573850631713867e-01 +1.042381167411804199e+00 3.384348750114440918e-01 +1.042388081550598145e+00 8.869864940643310547e-01 +1.042394995689392090e+00 9.698059558868408203e-01 +1.042401909828186035e+00 7.537999153137207031e-01 +1.042408823966979980e+00 3.057900667190551758e-01 +1.042415738105773926e+00 -3.791679441928863525e-01 +1.042422652244567871e+00 -1.272692561149597168e+00 +1.042429566383361816e+00 -2.295782566070556641e+00 +1.042436480522155762e+00 -3.385779857635498047e+00 +1.042443394660949707e+00 -4.539071083068847656e+00 +1.042450308799743652e+00 -5.757670879364013672e+00 +1.042457222938537598e+00 -7.004720687866210938e+00 +1.042464137077331543e+00 -8.243210792541503906e+00 +1.042471051216125488e+00 -9.475334167480468750e+00 +1.042477965354919434e+00 -1.071755409240722656e+01 +1.042484879493713379e+00 -1.196250915527343750e+01 +1.042491793632507324e+00 -1.318759822845458984e+01 +1.042498707771301270e+00 -1.438784313201904297e+01 +1.042505621910095215e+00 -1.557790756225585938e+01 +1.042512536048889160e+00 -1.676459884643554688e+01 +1.042519450187683105e+00 -1.793679046630859375e+01 +1.042526364326477051e+00 -1.908556175231933594e+01 +1.042533278465270996e+00 -2.021842765808105469e+01 +1.042540192604064941e+00 -2.134635543823242188e+01 +1.042547106742858887e+00 -2.246767616271972656e+01 +1.042554020881652832e+00 -2.357580566406250000e+01 +1.042560935020446777e+00 -2.466938209533691406e+01 +1.042567849159240723e+00 -2.575577545166015625e+01 +1.042574763298034668e+00 -2.683971023559570312e+01 +1.042581677436828613e+00 -2.791834259033203125e+01 +1.042588591575622559e+00 -2.898922920227050781e+01 +1.042595505714416504e+00 -3.005588531494140625e+01 +1.042602419853210449e+00 -3.112323951721191406e+01 +1.042609333992004395e+00 -3.219183731079101562e+01 +1.042616248130798340e+00 -3.325936889648437500e+01 +1.042623162269592285e+00 -3.432596969604492188e+01 +1.042630076408386230e+00 -3.539491271972656250e+01 +1.042636990547180176e+00 -3.646834564208984375e+01 +1.042643904685974121e+00 -3.754516220092773438e+01 +1.042650818824768066e+00 -3.862366867065429688e+01 +1.042657732963562012e+00 -3.970429992675781250e+01 +1.042664647102355957e+00 -4.078824234008789062e+01 +1.042671561241149902e+00 -4.187472534179687500e+01 +1.042678475379943848e+00 -4.296115875244140625e+01 +1.042685389518737793e+00 -4.404527664184570312e+01 +1.042692303657531738e+00 -4.512580108642578125e+01 +1.042702794075012207e+00 -4.675100708007812500e+01 +1.042713284492492676e+00 -4.835300827026367188e+01 +1.042723774909973145e+00 -4.991961669921875000e+01 +1.042734265327453613e+00 -5.143838500976562500e+01 +1.042751073837280273e+00 -5.375786972045898438e+01 +1.042768001556396484e+00 -5.589230346679687500e+01 +1.042784810066223145e+00 -5.782252120971679688e+01 +1.042801737785339355e+00 -5.954582977294921875e+01 +1.042818546295166016e+00 -6.107174301147460938e+01 +1.042835474014282227e+00 -6.241766357421875000e+01 +1.042852282524108887e+00 -6.360553741455078125e+01 +1.042869210243225098e+00 -6.465855407714843750e+01 +1.042886018753051758e+00 -6.559799194335937500e+01 +1.042912483215332031e+00 -6.688719940185546875e+01 +1.042939066886901855e+00 -6.798736572265625000e+01 +1.042965531349182129e+00 -6.893688964843750000e+01 +1.042992115020751953e+00 -6.976930236816406250e+01 +1.043018579483032227e+00 -7.050756072998046875e+01 +1.043045163154602051e+00 -7.116272735595703125e+01 +1.043071627616882324e+00 -7.174264526367187500e+01 +1.043098211288452148e+00 -7.225856781005859375e+01 +1.043124675750732422e+00 -7.272208404541015625e+01 +1.043151259422302246e+00 -7.313983154296875000e+01 +1.043177723884582520e+00 -7.351461791992187500e+01 +1.043204307556152344e+00 -7.384999084472656250e+01 +1.043230772018432617e+00 -7.415117645263671875e+01 +1.043257355690002441e+00 -7.442250823974609375e+01 +1.043283820152282715e+00 -7.466629791259765625e+01 +1.043310403823852539e+00 -7.488423919677734375e+01 +1.043336868286132812e+00 -7.507873535156250000e+01 +1.043363451957702637e+00 -7.525235748291015625e+01 +1.043404698371887207e+00 -7.548496246337890625e+01 +1.043445944786071777e+00 -7.567667388916015625e+01 +1.043487191200256348e+00 -7.583235931396484375e+01 +1.043528556823730469e+00 -7.595635223388671875e+01 +1.043600082397460938e+00 -7.610695648193359375e+01 +1.043671607971191406e+00 -7.618920135498046875e+01 +1.043743133544921875e+00 -7.621520233154296875e+01 +1.043814659118652344e+00 -7.619465637207031250e+01 +1.043886303901672363e+00 -7.613552856445312500e+01 +1.043957829475402832e+00 -7.604434967041015625e+01 +1.044029355049133301e+00 -7.592639923095703125e+01 +1.044152021408081055e+00 -7.567406463623046875e+01 +1.044274687767028809e+00 -7.537248992919921875e+01 +1.044397354125976562e+00 -7.503382110595703125e+01 +1.044519901275634766e+00 -7.466733551025390625e+01 +1.044642567634582520e+00 -7.428046417236328125e+01 +1.044765233993530273e+00 -7.387892913818359375e+01 +1.044887900352478027e+00 -7.346696472167968750e+01 +1.045095324516296387e+00 -7.275550079345703125e+01 +1.045302867889404297e+00 -7.203598022460937500e+01 +1.045510411262512207e+00 -7.131629943847656250e+01 +1.045717835426330566e+00 -7.060194396972656250e+01 +1.045925378799438477e+00 -6.989718627929687500e+01 +1.046132802963256836e+00 -6.920484161376953125e+01 +1.046340346336364746e+00 -6.852580261230468750e+01 +1.046547889709472656e+00 -6.786039733886718750e+01 +1.046755313873291016e+00 -6.720888519287109375e+01 +1.047067642211914062e+00 -6.625350952148437500e+01 +1.047379970550537109e+00 -6.532212829589843750e+01 +1.047692298889160156e+00 -6.440673065185546875e+01 +1.048004508018493652e+00 -6.349892807006835938e+01 +1.048316836357116699e+00 -6.258887100219726562e+01 +1.048629164695739746e+00 -6.165032577514648438e+01 +1.048941493034362793e+00 -6.064650344848632812e+01 +1.049253702163696289e+00 -5.952233123779296875e+01 +1.049566030502319336e+00 -5.818599700927734375e+01 +1.049644112586975098e+00 -5.778858184814453125e+01 +1.049722194671630859e+00 -5.734508514404296875e+01 +1.049800276756286621e+00 -5.684922409057617188e+01 +1.049878358840942383e+00 -5.630104827880859375e+01 +1.049956440925598145e+00 -5.564889907836914062e+01 diff --git a/test/ephys/test_extractor.py b/test/ephys/test_extractor.py new file mode 100644 index 0000000000..ae45a53164 --- /dev/null +++ b/test/ephys/test_extractor.py @@ -0,0 +1,175 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import mock + +import pytest +import numpy as np +from allensdk.ephys.ephys_extractor import EphysSweepSetFeatureExtractor, input_resistance +import allensdk.ephys.ephys_extractor as ephys_extractor +import os +path = os.path.dirname(__file__) + + +def test_extractor_no_values(): + ext = EphysSweepSetFeatureExtractor() + + +def test_extractor_wrong_inputs(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + i = np.zeros_like(v) + + with pytest.raises(ValueError): + ext = EphysSweepSetFeatureExtractor(t, v, i) + + with pytest.raises(ValueError): + ext = EphysSweepSetFeatureExtractor([t], v, i) + + with pytest.raises(ValueError): + ext = EphysSweepSetFeatureExtractor([t], [v], i) + + with pytest.raises(ValueError): + ext = EphysSweepSetFeatureExtractor([t, t], [v], [i]) + + with pytest.raises(ValueError): + ext = EphysSweepSetFeatureExtractor([t, t], [v, v], [i]) + + +def test_extractor_on_sample_data(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + + ext = EphysSweepSetFeatureExtractor([t], [v]) + ext.process_spikes() + swp = ext.sweeps()[0] + spikes = swp.spikes() + + keys = swp.spike_feature_keys() + swp_keys = swp.sweep_feature_keys() + result = swp.spike_feature(keys[0]) + result = swp.sweep_feature("first_isi") + result = ext.sweep_features("first_isi") + result = ext.spike_feature_averages(keys[0]) + + with pytest.raises(KeyError): + result = swp.spike_feature("nonexistent_key") + + with pytest.raises(KeyError): + result = swp.sweep_feature("nonexistent_key") + + +def test_extractor_on_sample_data_with_i(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + i = np.zeros_like(v) + + ext = EphysSweepSetFeatureExtractor([t], [v], [i]) + ext.process_spikes() + + +def test_extractor_on_zero_voltage(): + t = np.arange(0, 4000) * 5e-6 + v = np.zeros_like(t) + i = np.zeros_like(t) + + ext = EphysSweepSetFeatureExtractor([t], [v], [i]) + ext.process_spikes() + + +def test_extractor_on_variable_time_step(): + data = np.loadtxt(os.path.join(path, "data/spike_test_var_dt.txt")) + t = data[:, 0] + v = data[:, 1] + + ext = EphysSweepSetFeatureExtractor([t], [v]) + ext.process_spikes() + expected_thresh_ind = np.array([73, 183, 314, 463, 616, 770]) + sweep = ext.sweeps()[0] + assert np.allclose(sweep.spike_feature("threshold_index"), expected_thresh_ind) + + +def test_extractor_with_high_init_dvdt(): + data = np.loadtxt(os.path.join(path, "data/spike_test_high_init_dvdt.txt")) + t = data[:, 0] + v = data[:, 1] + + ext = EphysSweepSetFeatureExtractor([t], [v]) + ext.process_spikes() + expected_thresh_ind = np.array([11222, 16258, 24060]) + sweep = ext.sweeps()[0] + assert np.allclose(sweep.spike_feature("threshold_index"), expected_thresh_ind) + + +def test_extractor_input_resistance(): + t = np.arange(0, 1.0, 5e-6) + v1 = np.ones_like(t) * -5. + v2 = np.ones_like(t) * -10. + i1 = np.ones_like(t) * -50. + i2 = np.ones_like(t) * -100. + + ext = EphysSweepSetFeatureExtractor([t, t], [v1, v2], [i1, i2]) + ri = input_resistance(ext) + assert np.allclose(ri, 100.) + + +def test_fit_fi_slope(): + + nsweeps = 5 + weights = np.array([ 2, 1 ]) + + amps = np.random.rand(nsweeps) + iteramps = iter(amps) + + design = np.array([amps, np.ones_like(amps)]).T + rates = np.dot(design, weights) + build_stim_amps = lambda: lambda sweep: next(iteramps) + + class Ext(object): + def sweeps(self): + return np.zeros([nsweeps]) + def sweep_features(self, key): + return rates + + with mock.patch( + 'allensdk.ephys.ephys_extractor._step_stim_amp', + new_callable=build_stim_amps) as p: + + slope_obt = ephys_extractor.fit_fi_slope(Ext()) + assert(np.allclose(weights[0], slope_obt)) \ No newline at end of file diff --git a/test/ephys/test_features.py b/test/ephys/test_features.py new file mode 100644 index 0000000000..ec1b35f541 --- /dev/null +++ b/test/ephys/test_features.py @@ -0,0 +1,268 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import allensdk.ephys.ephys_features as ft +import numpy as np +import os +path = os.path.dirname(__file__) + + +def test_v_and_t_are_arrays(): + v = [0, 1, 2] + t = [0, 1, 2] + with pytest.raises(TypeError): + ft.detect_putative_spikes(v, t) + + with pytest.raises(TypeError): + ft.detect_putative_spikes(np.array(v), t) + + +def test_size_mismatch(): + v = np.array([0, 1, 2]) + t = np.array([0, 1]) + with pytest.raises(ft.FeatureError): + ft.detect_putative_spikes(v, t) + + +def test_find_time_out_of_bounds(): + t = np.array([0, 1, 2]) + t_0 = 4 + + with pytest.raises(ft.FeatureError): + ft.find_time_index(t, t_0) + + +def test_dvdt_no_filter(): + t = np.array([0, 1, 2, 3]) + v = np.array([1, 1, 1, 1]) + + assert np.allclose(ft.calculate_dvdt(v, t), np.diff(v) / np.diff(t)) + + +def test_fixed_dt(): + t = [0, 1, 2, 3] + assert ft.has_fixed_dt(t) == True + + # Change the first time point to make time steps inconsistent + t[0] -= 3. + assert ft.has_fixed_dt(t) == False + + +def test_detect_one_spike(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + expected_spikes = np.array([728]) + + assert np.allclose(ft.detect_putative_spikes(v[:3000], t[:3000]), expected_spikes) + + +def test_detect_two_spikes(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + expected_spikes = np.array([728, 3386]) + + assert np.allclose(ft.detect_putative_spikes(v, t), expected_spikes) + + +def test_detect_no_spikes(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = np.zeros_like(t) + + assert len(ft.detect_putative_spikes(v, t)) == 0 + + +def test_detect_no_spike_peaks(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = np.zeros_like(t) + spikes = np.array([]) + + assert len(ft.find_peak_indexes(v, t, spikes)) == 0 + + +def test_detect_two_spike_peaks(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + spikes = np.array([728, 3386]) + expected_peaks = np.array([812, 3478]) + + assert np.allclose(ft.find_peak_indexes(v, t, spikes), expected_peaks) + + +def test_filter_problem_spikes(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + spikes = np.array([728, 3386]) + peaks = np.array([812, 3478]) + + new_spikes, new_peaks = ft.filter_putative_spikes(v, t, spikes, peaks) + assert np.allclose(spikes, new_spikes) + assert np.allclose(peaks, new_peaks) + + +def test_filter_no_spikes(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = np.zeros_like(t) + spikes = np.array([]) + peaks = np.array([]) + + new_spikes, new_peaks = ft.filter_putative_spikes(v, t, spikes, peaks) + assert len(new_spikes) == len(new_peaks) == 0 + + +def test_upstrokes(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + spikes = np.array([728, 3386]) + peaks = np.array([812, 3478]) + + expected_upstrokes = np.array([778, 3440]) + assert np.allclose(ft.find_upstroke_indexes(v, t, spikes, peaks), expected_upstrokes) + + +def test_thresholds(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + upstrokes = np.array([778, 3440]) + + expected_thresholds = np.array([725, 3382]) + assert np.allclose(ft.refine_threshold_indexes(v, t, upstrokes), expected_thresholds) + + +def test_thresholds_cannot_find_target(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + upstrokes = np.array([778, 3440]) + + expected = np.array([0, 778]) + assert np.allclose(ft.refine_threshold_indexes(v, t, upstrokes, thresh_frac=-5.0), expected) + + +def test_check_spikes_and_peaks(): + t = np.arange(0, 30) * 5e-6 + v = np.zeros_like(t) + spikes = np.array([0, 5]) + peaks = np.array([10, 15]) + upstrokes = np.array([3, 13]) + + new_spikes, new_peaks, new_upstrokes, clipped = ft.check_thresholds_and_peaks(v, t, spikes, peaks, upstrokes) + assert np.allclose(new_spikes, spikes[:-1]) + assert np.allclose(new_peaks, peaks[1:]) + + +def test_troughs(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + spikes = np.array([725, 3382]) + peaks = np.array([812, 3478]) + + expected_troughs = np.array([1089, 3741]) + assert np.allclose(ft.find_trough_indexes(v, t, spikes, peaks), expected_troughs) + + +def test_troughs_with_peak_at_end(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + spikes = np.array([725, 3382]) + peaks = np.array([812, 3478]) + clipped = np.array([False, True]) + + troughs = ft.find_trough_indexes(v[:peaks[-1]], t[:peaks[-1]], + spikes, peaks, clipped=clipped) + assert np.isnan(troughs[-1]) + + +def test_downstrokes(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + peaks = np.array([812, 3478]) + troughs = np.array([1089, 3741]) + + expected_downstrokes = np.array([862, 3532]) + assert np.allclose(ft.find_downstroke_indexes(v, t, peaks, troughs), expected_downstrokes) + + +def test_downstrokes_too_many_troughs(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + peaks = np.array([812, 3478]) + troughs = np.array([1089, 3741, 3999]) + + with pytest.raises(ft.FeatureError): + ft.find_downstroke_indexes(v, t, peaks, troughs) + + +def test_width_calculation(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + spikes = np.array([725, 3382]) + peaks = np.array([812, 3478]) + troughs = np.array([1089, 3741]) + + expected_widths = np.array([0.000545, 0.000585]) + assert np.allclose(ft.find_widths(v, t, spikes, peaks, troughs), expected_widths) + + +def test_width_calculation_too_many_troughs(): + data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) + t = data[:, 0] + v = data[:, 1] + spikes = np.array([725, 3382]) + peaks = np.array([812, 3478]) + troughs = np.array([1089, 3741, 3999]) + + with pytest.raises(ft.FeatureError): + ft.find_widths(v, t, spikes, peaks, troughs) + + +@pytest.mark.skipif(True, reason="not implemented") +def test_width_calculation_with_burst(): + # example sp 487663469, sweep 43 + pass diff --git a/test/glif_tests.py b/test/glif_tests.py new file mode 100644 index 0000000000..e5d940103f --- /dev/null +++ b/test/glif_tests.py @@ -0,0 +1,114 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import matplotlib +matplotlib.use('agg') +import matplotlib.pyplot as plt # noqa: #402 +from allensdk.api.queries.glif_api import GlifApi # noqa: #402 +import allensdk.core.json_utilities as json_utilities # noqa: #402 +from allensdk.model.glif.glif_neuron import GlifNeuron # noqa: #402 +from allensdk.model.glif.simulate_neuron import simulate_neuron # noqa: #402 +import os # noqa: #402 +import shutil # noqa: #402 +import logging # noqa: #402 + + +# NEURONAL_MODEL_ID = 491547163 # level 1 LIF +NEURONAL_MODEL_ID = 491547171 # level 5 GLIF + +OUTPUT_DIR = 'tmp' + + +def test_download(): + if os.path.exists(OUTPUT_DIR): + shutil.rmtree(OUTPUT_DIR) + + os.makedirs(OUTPUT_DIR) + + glif_api = GlifApi() + glif_api.get_neuronal_model(NEURONAL_MODEL_ID) + glif_api.cache_stimulus_file(os.path.join( + OUTPUT_DIR, '%d.nwb' % NEURONAL_MODEL_ID)) + + neuron_config = glif_api.get_neuron_config() + json_utilities.write(os.path.join( + OUTPUT_DIR, '%d_neuron_config.json' % NEURONAL_MODEL_ID), neuron_config) + + ephys_sweeps = glif_api.get_ephys_sweeps() + json_utilities.write(os.path.join( + OUTPUT_DIR, 'ephys_sweeps.json'), ephys_sweeps) + + +def test_run(): + # initialize the neuron + neuron_config = json_utilities.read(os.path.join( + OUTPUT_DIR, '%d_neuron_config.json' % NEURONAL_MODEL_ID)) + neuron = GlifNeuron.from_dict(neuron_config) + + # make a short square pulse. stimulus units should be in Amps. + stimulus = [0.0] * 100 + [10e-9] * 100 + [0.0] * 100 + + # important! set the neuron's dt value for your stimulus in seconds + neuron.dt = 5e-6 + + # simulate the neuron + output = neuron.run(stimulus) + + voltage = output['voltage'] + threshold = output['threshold'] + + plt.plot(voltage) + plt.plot(threshold) + plt.savefig(os.path.join(OUTPUT_DIR, 'plot.png')) + + +def test_simulate(): + logging.getLogger().setLevel(logging.DEBUG) + neuron_config = json_utilities.read(os.path.join( + OUTPUT_DIR, '%d_neuron_config.json' % NEURONAL_MODEL_ID)) + ephys_sweeps = json_utilities.read( + os.path.join(OUTPUT_DIR, 'ephys_sweeps.json')) + ephys_file_name = os.path.join(OUTPUT_DIR, '%d.nwb' % NEURONAL_MODEL_ID) + + neuron = GlifNeuron.from_dict(neuron_config) + + sweep_numbers = [s['sweep_number'] for s in ephys_sweeps] + simulate_neuron(neuron, sweep_numbers, + ephys_file_name, ephys_file_name, 0.05) + +if __name__ == "__main__": + # test_download() + # test_run() + test_simulate() diff --git a/test/internal/__pycache__/conftest.cpython-37.pyc b/test/internal/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06f230a4c1b6a9864dfad04c1d8d1e5937e27990 GIT binary patch literal 533 zcmYjOJx{|h5OtEOlu8|05Q9fL&<<<}A=;`#rBV<LOBAVc?Q0S>*pcmk!iK~T0WtBH zvNG`(m^h~(angM~y=R}#<6f^z(B%6wqaGojuK6<`i%WEKgh3GD<s{l=FY<&hf)^6` z!dsGl>kAoV!JWdH%K`cXy-{28>Iv@+Rog%vHeImmocgJxVG0JQ1!E08R+`!rC|3fZ z6siXAQ_dt+GOwsEUD0rI#aT`z*hi(el-ULx<vB<?lg4JYv_Lm_;8?Rv(k0J8au{?e zTGR`t%WyThzPg!D!)e{Jx`bbFwg{)Ui_yIA*S<1!I{^#w0lQYgY+ARulAA2~AbJm< z_?=A7;yVM{#4KfEux5`;R`EzOqzQH!qtwKz0BJZzRiu@P=h-?onT3;r@hwXLwQg)9 zwnMjuVJ0nT$?~DQ${~ZIst=0Fm8&d~O2djPlyKX2Yi@QQ=zXmFfp*)E+B<fGHG}>O X9VFD9^Lr)A94_$diD_Zz_?_Sf-no-L literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_annotated_region_metrics.cpython-37.pyc b/test/internal/__pycache__/test_annotated_region_metrics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9b30a9f12609530754262fc3ce090e32e03a68e GIT binary patch literal 2246 zcmaJ?&yO256t+D-H_4{E{aq-isBoAA+XEK_6>2FU4%J>-E~7}%Z0shpo6JPE(<ar7 z1l@Ar!2hrjC;p|ma_YapiSId^Y}$&>#Bcmw>}S8v-+TUkcelmx6o37e{Sh<v4=L-% zL+1gSu@I6;K4$6a%TobejJ=7U`kX0t97s?4uh}V2LwQw(GJ4I^$k}7L<Lt51TC(l5 z9odn)uUXoXU3m%Lw%n8Z_;%!Fc?I8H$)B*~+8eCQ4inzo%!;D4nN_l{)i5uM{zO@w z56pl@tREkpM`)%CVc9X4+zKiF6!7I8CgKeRt0}I8r-8JKsY<*?6w}l%3uPMrs4T~S zGab?}68~0@zUlp9ls3I=l*xmm>_t{AdJl_iP!=-#s;7$QrdLi?VFr-pbhI$N$N5pu z<W_w-%?2mgP+{(Pj1ltWo>j))%L}V?k&T_!|G&Tvri;d(WacEmK8%21LgR?o(*Y+1 z5B)>Uh5Q3LmYs2gE!q^kkbLRY(BHBN*aU1|#VfHCJyCnLUoril@}98DcR=O8V!8Y_ zMB;10G>yl3VGxdL#57Oii87<1&Ses$u~v4bi~hXf_$^W~pEqK$xPVYcaL`=BupB2? zPV+&3l1=F#Ob3GTt9bXgk5}(Pf9pUgQWqT^hGnM=`{Uq)8@aWHJ21CUJA0W=W_Co2 zT*0I@a>R(YToa<sHDPMO?o(o%IQ;2D-aFaY=5{6(xxcyP{t~%&hlGxYMmuuuKSzho zpkfv1h%@nPQHf(w;e<|vxnsRoTvA-(aEPJq0qo=}?Wn;(6~y!0E}FoMvZ-pi4-E)u zkpn+!UFyWs6q}|Uq#h=0!Qv3vC(`w|J$-_qhBnA}j8|VqZ$m1w@1VKOzeEQcWuOVK zK`5UQT`WICR#jf*R{}HwnU-uB)<G2<qbeY%udV-zSHW4Z#B7qVJtmtC&!Q^8Jip>M z*ze@Ss|59)iCY+ZB9`1dr;!d4@9@p1*Z~q(;-jxpKh}HHCw!XA1FcXKHYEYs(uB4g z=f>)N8sM4P#4)(>kb_C+5~vABDj$w)6THZ!9cfn-+BCeqt}Sr%E{r!EjPEaa7ZVL3 z$ao82hIj>fU9ei;hIPXVV*3Wz3QENtu*g6MtX~HNEWr(U0s^Mu=g@}u$FIVQA!GeI zs^fa6ZrR`r7Raay0lUBCx7d=`?JBC;XR!l)WOr~7G4z(x=cJ!Qt0_G+WmwX_z*Ju& z>vf29f0MI|^J=?-GLmYj70PAsVx+Wcyh&c1!#&C7NoU1JN-KSf#787HAnT9Gx34jY zWHwJjt+QgN(m)^OnQ_MHyXaqc=)bq2d+@adzR$0tjO_87X!<k!H=tCchjz08|1lJ# zAh8;3cHjp!Af}`Qp928x6Z`}|ZjY#rtY1YoI2Go;4FRB6MJJ*8+4U)P{X++45^RO( zqIU7q+UZ4I%8Mkrz&mXZm0e$E4)>;&8&q4H6)3m9%m*tjgZPx<9|pGxwKB7@eHXqx z2jA98-@=ulL|U<ycq@1Ztkqw@mhh)ZHw~u?nwAE|Y%*P}E`q!3tL$KXiya*4EHC=y z5sK3D%$9nws$J2ue2$wzxs+Sg>rI_<6~|?VJ0-W~)|M}-d3=9T%Gp?bM>I8*|5UI# Rq8qe!x<NOH!?+W7{sX7c>45+M literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_biophysical_modules.cpython-37.pyc b/test/internal/__pycache__/test_biophysical_modules.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a524d8307e1a19284e81d4a6de91fc97197d3682 GIT binary patch literal 2174 zcmeHI&2Jk;6rWjdY$qgXs}>arBrcVj6~<2DsHGNPO|B4$A_Uqv8jW{e;z?#_H#4(! zjGO~%?;MdhCE^5sk|j=@_!l_wW*rCP5~(fX#z^z^=Ii&~yx)7<D=SL`i~i|5{%f6( z-~41+DmeHQtKG&%5J445X-ugf2P%jI>?^90hH*#<1V;-Z6bsMEGa6S#Rn(r7xF+gi z5&OCbz9iAo?|2W1==jdI%<}%w%7m-WGf^mboXcHYSjf3c`ibA>3&k2>-N9;?v2h6E z89gH-g4YGR-`?yymv>q%ewyh{dwqR9qQ)PHXk6)~{AXf9oc%G_>2$xcU~HH7xoGzI zfa_uRvF1sp1#fpjKegQ~2W=B<OK9ECWUp(bgZFcu9P>lKvr6F(aoloXT}x^QMsrop zSnn@|SXydioB42jV^+>{S@Vi`NF=BSriy*yb@atc7qOPQet-i(&!{8kbcDvf2)@60 z7L3SwFrpXu0bk=6d_kU&Z}0=oDx=`MGOBpF@OBAz<qz-u^7eT3$Yz?Q_K=+vV1|4L zEi-Sg7J_O$-E0Z&c&psj^rt>K`3SWD)#>a)VKP(`zX{ZnLN`pxJDtR!WsKyFJt^)< zz4c&gqy2DWV`G1^EOnv^0gVAD#g270(Ck1euxoPy=7u>$4So5Bw;ZVXP1l{WIV3U# zy_TEo2ol$r3Yg=EwgKM3n8_qFU<>8eCW4cMU4frNbIn6je0UGKi*=?*oW#LP;*2hl z*a1LpFHw|}S)A6%v{1#>`sH+DplAw#tBHx2gEUv%!P?(VcO@^+y`=f^_VQ1&yi{vX z7b%);VDG`neRTQz`+G@NXou4St}N_Fq49xXT+Mpk?D5@0aBL2TDYPBm<rX>T7?NCp zV3|&U4W#Si1>W=HH(xx&q!=%yS#msa*>N3C@s}NllE;%~!9V_v=ODZ0<yG8a%dkd6 zx=QcRaLM@S@!xRm#~T;7jVCr={MQ8gM|QP0AGJ3(+mE(hk6lw*{Ld2%V{`m@C7!$% zO$;Vg65oE&Q?2pQe#(Vgb6k+Zcn3Cb_{OJ(8Q*{F8sE3?;=XymUqM;47;jCJS96-T zni%<;KH^KT&Dk_HNnZ??%TyXy^Pzt*4m~eR>c_PMdFl!SC67yL8UM}<&=PXV)cS{$ U3qSUWu0*#S)ai0%wN}6NCuc9ZVgLXD literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_core_feature_extract.cpython-37.pyc b/test/internal/__pycache__/test_core_feature_extract.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d3f6f19c6186d2f0f14ce3906ac7cbc41650723 GIT binary patch literal 2578 zcma)8&2QX96!(nn&1S!nZqhVO%U3~&MP*A{BoL~qhO`w(Rgg$HU@e&Gj<YfG+U|_E zNl<&B;aUkea6mmEapK0A1LE)Sl~ewOUf}m;y-Rkte0Vg^&-32AH#6`3-uS(Gy<*{s zfBH(ib=tE2ppVhR!Q4RCH$kK&S!8+i<`L_2kN0iQ?mM2-cRiO`(w5HGmRFLlEa5#T z=VTf0vYeL{yyqp`vRc(+Sh6--PQI`c#?seW*as0R%j-K~lm*Jy`$3TE{3RprCPL}J zkCM3O>w5#C0$=n~Uj|Vo^0`>VelN(nWRo6R?>zbjy8aDBGSj%EX87LxLo2f$SV!z3 zd%&c<$Mx$Od&Fo=@*_STy+NbJd`D9Ir}<xyX3v_i>%i`#zb*9a8R?HhX^+iFel-#c zr{!)chFu&RViWf#o)%ZM(Y&#)b)d2^iEk;Ds20ze$n8)b{A{Tj6rLVzyxaL0D!L<f zg>2sy`yxK<tjD68#8O=C1o3^{Nzx$JUC<=mJ=C2$;oXi7v*3+XboWFrz}zT;hTOZ9 z1v<MF#)wfYBJ<^U69i-@5ZM6l;2=|?o3+!!e3^9psR++uP5J_e#a39E)p!Mc$T`I~ zjh4Wx2DB!^N|Q}k8#oMvf`=3iJ7hgRJU|m7_p$wuWeDsMlO=?popA)wB;o^h6G2Ck z@*aoeeIwzNoU;1F#&}KE4Ofy4xnQ_Oc}g~k>p6vwC3u<k@f}$*>9Zu4CZy!&m%`7o zJdG8vJmK)PEYB2t3H)loFM=<0#{MYn&dRkOm**Zk<DD(;@o$)}7|WC<=Qs13L5&{| z`ga4RN;oW&Ik%A%)l?u)q@TpmVO|Zp5dnxkjwy?}lw0)Bhl9R_u9rc2K*Xmtg9q!Z z^)0{Wz!g&q5SjFXY2JP_XWD!XNgcwcm1|L`vu@H)ufI&j$a2a0^3@_IPJq09ElRo~ z($~R^rsP#I$P$0J=-k-}^=`{HUh~F&qV{&8WS=TV7UT`89)oD0{XraNx|q2m!YGhA zPuIPAU&I3u6~;Vgy`O4DnKYIRl|3f|Cbsjc40Kn8DPhX9w=W+6YP8?H5fC^`wIY9z zT{!@`df@Tx%jj3I#6>8oQ>5)?hiRZOM3BvGz(-M4f-x$!UTIk2rj9Ld&YsT;P}i@3 zSZt9s(AR(&Y7P40)N72|B41|eMd(dnhP)Zf{7_&9x#u9;P@v`96Bqa?V`P3}q*CZq z$2zsiS)<%63TPQQ{&`X8D7R1Aug}<T0Bu8^k^KeWZerGyeFpo#|8M*C8T*a@wht^_ zC_K=4OzvQIPt!Y?@gS*gOxWqU6Ga|-g3s^AWxlz2OraXW_B=SRvT^y&*2ahHA8p-I zD<nDx(sI4#IO750D9i>j7y|M+Qd%W)mI#5`E0dAiA8g)IO&VJxLdkzj=std)$ZJHd z5OG0}pi}`)CTs4Rt9Ck9M_9%U{%<$*+pwm|yv3TPt#GRF&*mG&c$1NqqNPn_Gl9uu z^Jief;<}ZrxUwze$=WDS!s1dLOQ{mSGn8hC=n<RIp!wc7BF?5d11}~bxsBfpfSFFn z98K<`28pbIbI$HhpH9snx%fHx1k*GHz+w)NTf^Rn)<D%ojJ7IXDLtea-o?>X+aBGr zZBuvJ&$?#KKY*z)!=Rbv(Y0ynfH^*6|HR_xr$AAO&db;Oi5x`1bxIUX$ya8pZg~~$ F!e5nFUCRIf literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_eye_calibration.cpython-37.pyc b/test/internal/__pycache__/test_eye_calibration.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5f2d908146ba164eb2b065357f657e214fb711d GIT binary patch literal 3197 zcmeHJ&2Jk;6rY*>@cJW3n>vl#&{Epc#%-FSQVEJ^>k>r>se}rOge*&D<JoLBS?^l2 zn-YihfwmGS1QJ3BF4!uUUV7{WAt59r{sJln5TIU~8wb<_C*B)7agu_XRvg*YzM1#t z&D)vxe(%k^G%%1M@B}yBv#$>jau=DkCkvete9;6YgcDAEQtr02%z$UUR@ciqC0yhB zby7CC!A)pQhb*Mp7Ed{>o#qx#^Ng!?D9_F@CCTvtKDbFT#Nkzv9dis?#&`1J>*N|O zXL`1FshN2`!bea~anSE_J-ZK#I&2}!caIUA0d^VK9pwdOH}@ag-NW}Py91oQL5gFm z=);*Jl|xR`sn%@Yn-zBKg+UDm@L}*-@J+!Nm4L*gP2ppla>g}Wvf^}fDsmlGVJ*@^ zsg{to-XRG^I>$P6!GNEpW;_g(S3+_b$m-8vcJ&V+9t4RLP050WwCYYY?+TAg!xqAB zO7lt-+qFfRn)B^Ab^=K+7n!8Xk~VJ=0iYm%MN=<S-i#a(RqT12PtMx!*g>;$A+T#< z!0l%%PH-ivgbgQ%YCyxrd^4(C^kyrO7ds~!VBB^cnCttX!52@)P86T?g4hv(?JKUj z#Z8lqrcBpFwP6dp9vQHP$OJ;@Fx^eX5cD3)k#t**G-tfRx+4>G<oEDHp#v$J0v982 zF(QQoV<^%{Fp-K(VAhBn5_Dac3_?%l8cPk&?`;W{H*RSs@GGOf!>f%Dyaq^_K$i%c zdrOh~W#eq-&fPO5_uc%hmw#U=eB)x1zm+bz$M1jo%g673ci#Q{Gkl&ex%bB_AAY-Z zu;ga$+<<u_B^PYNbGqdH37e@Q^6<fp;1(1D8_<c#0&TMdaMfWgz+p>^wYDB>3r5>a z0A-vdG*1eoLlbS0M5p7_Rf-x3>+6h>g!DMj8&ldXu+g>>9cOiD<l{U}0I}MP`^gVS z?qw%;p6jjgxAVoczy->|>83N)&ztgLL_^OtRWGR4!==dS!X^v__W~PGrGg_hdp0VY zK8Sp`tOuc}%fSl~z!%**Ekr0l#rKPb%x!eI%=A4jSxuC+IP|6F2(dMiMFenlI}6$Y zTZu6G#5Aczb$SpGoTp+hNLKc3{QE@Bt~<i6iZE7%BI<eM@LKo)hKRuR@FBVoMJjw8 z0t*3SoI%haj1WX9A_<LI8)`F@5Cf6V%?}I+hJKB-jMxBbCVJacIw@|s3~F`C#X8xY zXZ2(-f-(R_3Uu+ak`(YXT8`6KDcVSk#DsAxF%~l1+Cvhv+ZJFQdD2QNJ`Hjlhqfor zBx$ggO(@UoAz1)No+KHN<TgqQq?J{Ao1{u_)67xQ%JtSakXY~^u$kl%ePIxLqwB!! z(2r<z3Rk{K8&{WA+R)pg{WfYV$Yy8UFP<B@`ONK0=iRTqzVqX+$xmndISAo^=U6{v zMMLZciOkjN)rJEI_Ld!AjG}1A)_}{Qo@5Q?-aQQp2t<~wDuQ`Y98&2ahN0grMVP_@ z%ZDn9@@TKhJTz5CV2U)nD6j*O$LR<rsnx<rYLOR+T_`I6DGsPTh<!Mon|if+Y5Mi* zrB~jXz9_ZJuU(Y1CJpsdr7g8tn@bJ$(65A&Eepw-59HA)l}FoLa8-EjeEcLVB03C& zm^!3W_svri-U7UNnp5pK9jB92oB+MYOc?$DgjuWf|B^76=G}yWUI9|3doC#LM@tw& zdd2Qosh2R~35cA^69qf5AJ~362t<K60OVomAf7@^gt|D0WF6?@5V8oQe+IgE8i$S` zIf`T)31)*RA~}Ynf6^aEb^^(kGyl;LJ}1H;J_Ba9kMK#*E)JH>MiX<XYy?a7MpG4r z@}af+*5uk%YZ5M@aCC;Va28&%<4`oa#RTtDs)R_rZi~foR$aTCSa>T=_m+d_m1GT1 xWt705ZrG{Xv%2C~FV;i8<U8lEUPTx~3r@Wpvkc3$;N%;o2XYqOPfrz){tXfG{^0-s literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_internal.cpython-37.pyc b/test/internal/__pycache__/test_internal.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb635edb24820aae15dda584b993a98e764ef506 GIT binary patch literal 742 zcmah{y>8nu5GE!0r$SsH=nHTv;33kG%?OI5SvnL(0H;F*0SY5BmKvHANV<s)WC)Ts z>C}hFi+JtSSLoCuRW@yx9>4=B@w@N7@A!5yNfCtna!;QyLf_mWL=2l_Smre(h6=<m ziv%t($Dbk=v*Zyy;38%NHhe@y!lDJ5j<#p1<;GU6v|LLn(u4m-nw|r~kSnFhMZjH< zm11kbv-CT#qj~Le2<Q}@!ZHaYhJiQQeq7L1CphUgj-On$w|1=oP9PSXLpjX}wKLLK z+s*QvsXFWLW=bz}E^|R0G7recu7pR=zakw0(R2DCPG{u@!?h`CLs@o7Z>ZdqCz94m zGJ05Y`Pr1J<I>cSRo84x`M$j@O>6l<N9$|4<bV|dZm{dz^9JSq^xHq^aktNStu%DU zDt_x#PMmnx6H2u6pmvV9aNpeW?(D(F&kWtc<iMqP`|fX-daKs5wyl!nrnL>R&A%QJ zY6z8t>g9UHrR^=%j&VN4#ePtc1p(8@_f(9-pJ(H=dsDkTM;oNPf-k+4SPx)79qdL` p1=FdjV%QI;82y@wuj_C9QPPjb*Bu}AZ|2PlS91s{!Q=Sl@F%S}!VCZa literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_mtrain_api.cpython-37.pyc b/test/internal/__pycache__/test_mtrain_api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa2b9b4684b8a12a2ef5d0350a484cfb4a054cf5 GIT binary patch literal 3201 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 literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_optimize_config_reader.cpython-37.pyc b/test/internal/__pycache__/test_optimize_config_reader.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29b034456ede50cce67d288dcf74bd29ca985ee1 GIT binary patch literal 4213 zcmeHKOLH4V5T04RR<bS2v5E5{C3K)lRalm62PZ0u!f_NTlr0C_!C?_KY&4sA?bWWB zS;yFk58xb0apeXnF7Olh13B^o_R1-LffL=cT45{lqbfzg!6Qx2&d#&Dzkck^p`i?c z;{Nij`TGbVe_|&pNqG1Os{9cMC!9K@MGZ>vS#vZ)gEr>GT5%)ZN*D=Bb_Uf*(nzfl zcZ?GJsW&Mj^*M31`-I00ohOVmPZ}9Z+Zf;}u0JFD)EHE~G|#Bskm?QaLDkFhA)b9k zjA1^^bI|7a2tNny2-j9far713judGyw$%3Rmc47ud+tN~(XwT7OVo>6kZ7BJb3I76 zyyhnJ+LmiRr-WplWb#l7uC*mR*K}CR<CasX=AZ1n7mjROj>9%xZ`)-LZO4)@_JtbB z=fkzQ9(L%N$NZhPh5K~oc4jq&W%?FprVnF<sd8m{qEeYCUt6ubU%hstTArCGU$2(S zh4Aoj5o~UAm_Bu5sxo_hcIrmYpli19q{2<xYp?G}yJ<R$$i*#7HiZr1@Z8@0w%Ytu z*En$bjy#U!l^u1*@bVQb5kFzu*?dp6UuO0)W}uyE<OE>6fkygDKLXb=`ibE750p;> z_QGpWzcx{xny5^#Rw~sQ{P%%+h?QwT`gD1Eb|yMmfi8l1y<@5h<9AH~==Uul4?(=} z8o-Y@yerPr!Mo4RI<`3lB@%E1>;o`Y@P2s)@00vqS0DNO=`_;EDITMd2vBEG&c6|q zn;31e0HR46>O53g1>%!^vIkkh9`&iOZN#`XPW-r^;IZd)U;80P$y4%k@+o~mDOrQO z;8U_p?!!BX;qm(Jh-0@TYgtm7kF3&$^xWM<34=96_B4b}&LD1?#gxEvMGQ!wKiIMz z-*#o7Glo8bF%ids%L{iFSJ+~0Wo7Q;8mlj{yK~EPi|qEDh1yDxRhy~PFseg-5c8TM z$f`GZE`xMo{Wl^8VXMD(=c|o-5}ZuKTsL{?fw^tEJB>NlY<ey?ryG|0ST^vQvI$g0 z;l_gfpdoGFnrNHNP2dLBIu6X>o0GmJ{Yl#euLT*0>On#hW-SbMgtUd>^(;|p?*zlH z2X_H4*BSZ@E+p|*L`!OMEkm<(OcPn?{|8DD2{`wlIs~SRB88-n5|-+<16mLWoT4T$ z_Y?z2kgbpm!Bdd)T<Z|;$l>d}=iu%Ck@qWy0Jyq#2!SUv?{6Pge7i66=a6|wWL3cy z#Xb*Jegfnv*#KL-2$?$67}Pk_#AZxh_33vMEK%c0KeiEnp`l%FB-Gp#%+b|6P2R?N z9IZ254{|*@t`vA+FxK;0rM`h?bNk(2e;VDrFo~u#>3h%uj3uPezB27sYV~-()sRdU zlR;WpBU*fros(dHn9A0K@I-Jv4DhUHvGNPS#d_`D@=|?nfh{iGsx5?&tF6|SSAv|{ zva?wE5~^&c7kXK=Q5Kn=+(UutKnT4`lT@eTZFuf4cMc;*$Xz>D?x-V_ePXjC_pU~8 z1U09_$X5q6B1YjXaURJSlDB}IAapT~bN&D?QcQ{qxacC1OGuPcy^K#+fE1}f%jz$g zu4O)hDN=nsb|iC&imULhzif74<lmN!pN!<TPk9<7_P8stO#O`{_6h|A-tJhj1u^jQ zAUib7UfB&RRCNtoeh+g(f7TTqi0>Ud<(x4S#fwrDDoSSCE`7aa3EPqo75haDr9&gx z-ocaLiyS_7RhSID@c?6;XbC}5d1}P87)Ao${lrK;w7>DUgcaI^QorH@(XQ00E_Z+} r<*}8s)<1wx=Pk$j5UpAw1O_#o=BP#o!D6zb@hk9)Wry&mr*!>q@dMJa literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_optimize_manifest.cpython-37.pyc b/test/internal/__pycache__/test_optimize_manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c76d6f508a3508df5a94448112f6454a3aeeaf8f GIT binary patch literal 6623 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 ISI8Cq2clX;e*gdg literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_roi_filter.cpython-37.pyc b/test/internal/__pycache__/test_roi_filter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfd4cd73ffd62d39360da9f2a020dca18fab2326 GIT binary patch literal 6063 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 NIF99vJI5UBe*qH_(nbIP literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_simulate_manifest.cpython-37.pyc b/test/internal/__pycache__/test_simulate_manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5df914cd5e85e312691d26795ce52d4da6d9101c GIT binary patch literal 8608 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 literal 0 HcmV?d00001 diff --git a/test/internal/__pycache__/test_simulate_update_output.cpython-37.pyc b/test/internal/__pycache__/test_simulate_update_output.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1823f992a5bb061305e2d5bbdfafb277abbd211d GIT binary patch literal 5020 zcmeHL-ESL35Z^t2JBjPGp`oFaC~p?TA8`^V76O`*BBVAIO-qU~S}xvAbIJMc*gYq8 z+6d89LPA1)L%bk?c;cVo54cyJ`X|5>GkbP$Tw6tmmI`H0J9m4tpEL8@ncbDKu{43? z{QQ;q`#C~>!$LR3;p08X>U$uZaB7n#tx<~KhHcagct`9=Gg^x_W3?D1?NQB%*Ag4V znV<w8{U=dNd_o-K4&l*SlE-Q(9<QZ^u`|LGJo$(m(b}jkrFdGG#&l_fkLpr}kMYbS zQai)X@GQKue4L+!_c%A!N$%Vem>tQ{U~<KBz3sNL8m4{S<t<y>6ebsPEoTHV&-5GH zL8|FCcA4u5$NZ8KlD?mwhBV`dmUJD{W=)q1d!{;l|M0DlvoCC$?K<wh!?rA2DByjn zIn&c&TWk+K^wnd2+Y{JNr*5ZKLkiOuoS8oGX6A~e@@%OzTU@wRTC6TCSBvwr#ieSo zI1>&YHiFJA4%O$D=Sr2O%G`1v(=nSk(#*-l3;TVc8q)H7%XRwuYkB-{O`~V>9eE60 zD;qY)aPlQgo$e0x`?K_6+Po7v)xk4N;W_D`Yec;UI)fJ8HK+OI#f5UET&%D?OZqLq zhPdYmX*Gr8=bin{6E@Yc&^bumj<uyI-<9TF!MG(w1HRj6s0B~DJ5W@GrrT1Y0SH61 zsKTCWmypR9DszRCkYuvuu;VEeP7eMLv9~Z=T%0W~-zqIs=StObdA3*?hQ0a9($ai! zv9i>=I@~up*jw9Jx$QLErYD6`f}fZkRC@|<Lxvu#>mj>Kh`8gKJq@mRW2fMHvEb@% z*j-(8t>qMC|1*$155<--bvr)YJ-b+XvAbtDs>Uw{C=HA(F&U6kkgq^iRUke&B8LzW zA5x$C#!iGAlf;kuF&_Dr9vP3blsq6m#vjn1C?y*Z1Ajzrk~{DZ;??Nd!MJTT6>EaC z0PmRJQLb|k%VSguQEUogM9v^UGjj=v<4OpUNRZrYS+;LEDo8Sheups`MaG3|A6{Q) z*H_oqFMqJg)^0FxM(pZ`*H+hqjP6R0g{~dK;K*iE1{wVaM`aKdZ~sE%D0KA4!If(L zwh~g+&25wCH_d(1Y1c11X2W&3S*{CbPt|dfssU6-+VyMJW?fmnnDxxYF02LG+7Lr1 zzFY8x@(Y&Z3kiX>E-_^_TQ)?VEOdy>ZTViy&wK4)%yAh66%2;jvhHrfbQI2s7;z(N zq-lmu7%~Ip|3D!U+$iZ)g~Vf#OduJcfE#O|gpLLznoQ1+c*2q+NN`ah8H2AN<2s^e z-7Wa{^t!X~_hnr7)Ct48wb5gF&tAB{->dM40~dZ47Y?U1o$!r7xB^*S1@eIG0RAq( zNfdGfaujlGH=-{2^dSZG89a{YgL)BNF9H0du4AYbtiutFskI>67eFeBg9Q_PzxA0e zFf49uef`bFgNXuyr{KE<anEdew!o<PiEcSLs3pW}xoD8m*h6#&nadC>N<5#fO6khr zd<PYMjf1Ri(qZa-fod%D8`B6Pj)g#aj8Z~7CG-+aQ+W}-28;4@;0zI^F;tW&aujE5 zw<F49AtMJBkpxb?N5~TH7Kl8LWCF=6Ktee-{)O|v@yTGwVMR{jaKC;GXpG8Nar_HN zrjWb_Bu6EptY4y|TB03{eg_p)5=bc0DJoxw@4-Ud1J3glsvqqN{D|@th*}<tI=%L? zi24aSuUu@9yn_fh2@pCWe6Y|v`@;`VLFo%BZO2m-#6FGPo~>27o+jUQGI`Up@?W&z zkSbJu^RK%gyw!orAco#hNbOT=aj%Wag^Me=5Yiqt+{{N9>o{8QuX>|LmCG|o#(~rl zTh=|lB}E89Z8droh%jvtdVW2N(p$dX?UQeZ6L|+W33Um`sF9>uYS2*{r<rrnH==Jw MBbhOLl8I#EPpRI=&Hw-a literal 0 HcmV?d00001 diff --git a/test/internal/api/__pycache__/test_api_prerelease.cpython-37.pyc b/test/internal/api/__pycache__/test_api_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3821f35f77c84eecbfafefbe9d7ef5083377423 GIT binary patch literal 837 zcmZ`%JC74F5VpOKY@SGzG&D3RND4ZH5aDzkicTP!)k-U0>|8e4^{&Rw-K~@>;P@el zsQ626sZRU@D#k_$*WlHB^H_U4GoRlNhdqKzegDFLQ9^z?=ePni-l6CV1VIEXN%~jQ zlzN|~%<CWxQL{3t;xwj2vUNuUBK$_~X_}zd-S-YeL?ZT)zM!ATxbuKn$$U)haMlzT zAVHRrYq@aY<HC~28H$b(47n$Gkm4C&=>H(#O7!si`s{V~Sxe9vUvV+H<TqTk*-Y_8 ztptCSNp-EWx{*pR5bI{u>g+>tnd!pFmknQR_?5)7Wr;h)W@@B1(?S^uikDN~6h4xp zkvFGOCrxVu47m|%R}o<lAuha)hI2v`-@->U4B1mb5A=>1whs2;jtX{QcfrXE&<jnp zk9Xk?|4_0c`wrR|r^N3{(58BBx?hn497i~R5SZD<hQpOKHqxdBIqq4e8XL$~T2^Zt zHr%XixULIjLj@pgbOYFW`V6FjLSD;!S(FG+SGmi8<FK*3Ews^gG}Aa)Q`G7lpoVee zyG;8_l^a<#xhMeK44~s6ad09AT>tjDn`i$2tDfK{JwPC=$3}ES2W-ILDf;69^ijbG zA&r~XB}yZ;t(q3PF81Qc+2lyq1SxUyh$;VG($2EDHCv?5@nXY@!zS(hqtoB_sB+(f aFF$!x)nZ%9x9&aqIun*q{MaBEMSlPTeAy)c literal 0 HcmV?d00001 diff --git a/test/internal/api/__pycache__/test_grid_data_api_prerelease.cpython-37.pyc b/test/internal/api/__pycache__/test_grid_data_api_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fc6060227e8c71f7b05aef2d200a13ff0e9f3fd GIT binary patch literal 3098 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 literal 0 HcmV?d00001 diff --git a/test/internal/api/__pycache__/test_mouse_connectivity_api_prerelease.cpython-37.pyc b/test/internal/api/__pycache__/test_mouse_connectivity_api_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35edcb7fe67f0b7b003be2b17e10924ecd232a06 GIT binary patch literal 4183 zcmd5<OLN>r5Y~*e+Fg5h?W~>HPEsL+SC)`<oD>|W6kr@5Qk6KwaSBiwgsd6cvR9AH z%-XTpr2uo`M1BB=HJrHf8~6>Bt`t?|!Vlm?_v~7JYz)PtQjton(KoH0p6;IRnRm<O z0Ryh+`!BrCh++JKAA6Sxjd$RYzX4$eBMrmpzKKKhH+86fn~tg9mXm`wZP;Pn$rI!? z8-=jw6m{Eb41|NuU|4cW#Ng&yndO-Mm9aydivG&8g8mv}MQ4}|I49t#LeEHNbk|^m ztfYHSW=NS;G;%6KhS;!1#xmptt7>FCLq^!BMkX@kBs-;%(~R6RYGaRKw#HnIq-9S^ zE|e?0KynE{WlhGB+f+d#Pyrw`J$E~9N<I@u5%*QF5vZ-{BzRA7!5iF@JRNrV!-R_< z<dJe&;47b?bhz-HgJ%XFSp~v~GS*0kwxG3315}01Ip);VRLx9jEK@7-)M{$2#X$tR z3@%5m;$Z?(#Sex+FaGiM%$tk%L1nq<t$M7!<ZXJ<*5Y*J`EkU&Yl}SEkc)A`Bk2Q; zlhrM`cq>?1l!4-x6VG4wRyh3IXaEOWpHy6`$skf(L|$XkO9G9!Ax_x^k=dMG=yQ{7 z*7am7ElCv%5Qpl?3eJ%NF{mg3^>rH>R`1b9co{x=CLm~nHdSWFYJov^DKS*8MR!Qs zY?<0H+v5iY0Ncj`98yRB)NEmcB#}o_K!S0c<~9Y)Qs9U+OKTyDh!>ZG26rPb<c=Bo zo;GBc3}Scb;5^Yy5=9!cLQ1qi#1OQDUtxgM5^=12?86I(#J(AL<PGpO!v%BPO~0+Q zVd^bd3T@IN9m33AFu^*N*A@K|5tCWF-FFUp><I%9-~o=0Gmd;8M?rIZo^cfWI0iJw zcRdb*qbLic{+J;kRpkKrDMLVtvH|%S5tY~af>t|Sjeqa)nQXADDJ!khM?~5OxS^-Z z4fr|4AD#y(g<a!@@zH3TwrKC4i`e&wJh=EiSPtA?o_mbTrdH9x6flWq#+XHiukeUL z=wo~(B3^@-fEZ<5mI06n_i+tsKTC9s5?&<Xm%w)$LBw^4ZpLDLxe;%=Qh5;j7#@3& z)N-W~O<y$ycVTQD)ER&QBv0T_8RYpQj<!NM251nWLIGrttY4y#iR1dTytBvk_C%*N zU=FObeXX3)CygY~YEEUJ5v8Y=4*KDJ)LU8-e8VYq-+_nvI>pQcsZlEmOj)U!#7SD2 z*4YtwW`&4FYOZjVj=A?1=I_re+@GIy7v^VY-T6Cr7TlXR(upT_%uU~(P0v2DYkFq> z&fJH$QxlR=YHxUrCL~-lHATFcnvhh}oW_o>*OQpE<k77AJZLT70Ag5_9CsIJfmZ1S z0ynJ^xalc6PR3!Wi}Ud3q0Eher`Pr{G?bx8%UGj3kfwB;lDV2GFvq1MbFsP^CJl}S zfHQ3=XACU09|vwT0viU~SYdQNIXb1YI3@R(e{R7jd#UvTw0+bJFHBPy!CK2TXfRBk zP-9x=4w*38mLhAkW40_tA(NQxT<@DQ3z9D8A4F}H>(~rd_cx>Me9P$MTXxH2_O3|` zT$6W=dE*14mG2Z<xt5J-TF*Z}_c(?TQ)@*8Y<prqBpDPIsFCi~*XxlGY`b!xI(~Yk zy?uMH_SE;vP8~`MJ_pOo^uZEa7hFN^-{7uJ<jW!s!M3{gJjT^kE2bud_>r2B+RL#B zJ(XHv?60ReD6RggbDG7QQ6u)4+oy6m*4qsDs3LRY$mi~6pjK;zuG28@bSsL<1D57c z2cFt8ZVDgX$`iOg%oWyGVxH6fJ$~rBAX)Da3~G@Q8HU@Y0}#gJR9u0+XT;^=1+>76 zK(<f!5-{ewr|WX@5{wUN3ilF6TrOTg>>`pH5a�@qTT^tH9CcS#b$}ehtZGBy}W{ zNO1RcVAF8^ut)ple**l+xpWHpo<W!HuZU&gbxYaPS;ha#rTyCezb@^Uj|uNMmtK7) zU3!9f%5y_cu0N%G{0}@?%@${-<bQPF*x@yqiT&&^{B{lcYG-sFaV#uYI(;~HvW3E& zT+|HVs6(T~DeGn(;UHSkwcjac#mt9Npid#r+ZlGKz&&Wf84=Dee|xmj=NG*RbMni< zL)?pY&oa2D72`;-=!w%nptgBp-5J<FnCX3tz-@vq90F5~z~B@((*s#d=QDl&DO?X@ l)@<;%a0@9hyTdk#bng-^(P6V<RSFh?J6F9_%~gl+{u9tGQF;IX literal 0 HcmV?d00001 diff --git a/test/internal/api/__pycache__/test_pre_release.cpython-37.pyc b/test/internal/api/__pycache__/test_pre_release.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc304fcf673e58f453c7cf3c9f422e8333d99443 GIT binary patch literal 4172 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 literal 0 HcmV?d00001 diff --git a/test/internal/api/test_api_prerelease.py b/test/internal/api/test_api_prerelease.py new file mode 100644 index 0000000000..4f3c06e204 --- /dev/null +++ b/test/internal/api/test_api_prerelease.py @@ -0,0 +1,25 @@ +import os + +import nrrd +import pytest +import numpy as np + +from allensdk.internal.api.api_prerelease import ApiPrerelease + + +@pytest.fixture +def api(): + return ApiPrerelease() + + +@pytest.mark.prerelease() +def test_retrieve_file_from_storage(api, fn_temp_dir): + eye = np.eye(100) + + target = os.path.join(fn_temp_dir, 'target') + store = os.path.join(fn_temp_dir, 'store') + nrrd.write(store, eye) + + api.retrieve_file_from_storage(store, target) + + assert os.path.exists(target) diff --git a/test/internal/api/test_grid_data_api_prerelease.py b/test/internal/api/test_grid_data_api_prerelease.py new file mode 100644 index 0000000000..c70207e773 --- /dev/null +++ b/test/internal/api/test_grid_data_api_prerelease.py @@ -0,0 +1,95 @@ +import os + +import nrrd +import mock +import pytest +import numpy as np +from numpy.testing import assert_raises + +from allensdk.config.manifest import Manifest + +from allensdk.internal.api.queries.grid_data_api_prerelease \ + import GridDataApiPrerelease, _get_grid_storage_directories + +@pytest.fixture +def storage_dirs(fn_temp_dir): + return {"111" : os.path.join(fn_temp_dir, "111"), + "222" : os.path.join(fn_temp_dir, "222")} + +@pytest.fixture +def query_result(fn_temp_dir): + return [{b'id' : 111, b'storage_directory' : os.path.join(fn_temp_dir, "111")}, + {b'id' : 222, b'storage_directory' : os.path.join(fn_temp_dir, "222")}] + +@pytest.fixture +def grid_data(storage_dirs, fn_temp_dir): + gda = GridDataApiPrerelease(storage_dirs) + return gda + + +# ---------------------------------------------------------------------------- +# module level functions +# ---------------------------------------------------------------------------- +@pytest.mark.prerelease() +def test_get_grid_storage_directories(storage_dirs, query_result, fn_temp_dir): + # ------------------------------------------------------------------------ + # test dirs only have grid/ subdirectory + with mock.patch('allensdk.internal.core.lims_utilities.query', + new=lambda a: query_result): + obtained = _get_grid_storage_directories(GridDataApiPrerelease.GRID_DATA_DIRECTORY) + + assert not obtained + + # ------------------------------------------------------------------------ + # test returns storage_dirs + for path in storage_dirs.values(): + Manifest.safe_make_parent_dirs(os.path.join(path, 'grid')) + + with mock.patch('allensdk.internal.core.lims_utilities.query', + new=lambda a: query_result): + obtained = _get_grid_storage_directories(GridDataApiPrerelease.GRID_DATA_DIRECTORY) + + for key, value in obtained: + assert storage_dirs[key] == value + + +# ---------------------------------------------------------------------------- +# GridDataApiPrerelease class +# ---------------------------------------------------------------------------- +@pytest.mark.prerelease() +def test_from_file_name(storage_dirs, fn_temp_dir): + file_name = os.path.join(fn_temp_dir, 'storage_dirs.json') + + with mock.patch('allensdk.internal.api.queries.grid_data_api_prerelease.' + '_get_grid_storage_directories', + new=lambda a: storage_dirs): + grid_data = GridDataApiPrerelease.from_file_name(file_name) + + with mock.patch('allensdk.internal.api.queries.grid_data_api_prerelease.' + '_get_grid_storage_directories') as ggsd: + grid_data = GridDataApiPrerelease.from_file_name(file_name) + + ggsd.assert_not_called() + assert os.path.exists(file_name) + + +@pytest.mark.prerelease() +def test_download_projection_grid_data(grid_data, fn_temp_dir): + + eye = np.eye(100) + eid = 111 + target = os.path.join(fn_temp_dir, 'target') + + # test invalid experiment id/no grid + assert_raises(ValueError, grid_data.download_projection_grid_data, target, + 0, 'projection_density_100.nrrd') + assert not os.path.exists(target) + + # test valid + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage', + new=lambda a, b, c: nrrd.write(c, eye)): + + grid_data.download_projection_grid_data(target, 111, 'projection_density_100.nrrd') + + assert os.path.exists(target) diff --git a/test/internal/api/test_mouse_connectivity_api_prerelease.py b/test/internal/api/test_mouse_connectivity_api_prerelease.py new file mode 100644 index 0000000000..39e7217962 --- /dev/null +++ b/test/internal/api/test_mouse_connectivity_api_prerelease.py @@ -0,0 +1,138 @@ +import os + +import nrrd +import mock +import pytest +import numpy as np +from numpy.testing import assert_raises + +from allensdk.core import json_utilities + +from allensdk.internal.api.queries.mouse_connectivity_api_prerelease \ + import MouseConnectivityApiPrerelease, _experiment_dict + +@pytest.fixture +def storage_dirs(fn_temp_dir): + return {"111" : os.path.join(fn_temp_dir, "111")} + +@pytest.fixture +def connectivity(storage_dirs, fn_temp_dir): + file_name = os.path.join(fn_temp_dir, 'storage_directories.json') + json_utilities.write(file_name, storage_dirs) + + mca = MouseConnectivityApiPrerelease(file_name) + return mca + +_STRUCTURE_TREE_ROOT_ID = 997 +_STRUCTURE_TREE_ROOT_NAME = "root" +_STRUCTURE_TREE_ROOT_ACRONYM = "root" + +# ---------------------------------------------------------------------------- +# module level functions +# ---------------------------------------------------------------------------- +@pytest.mark.prerelease() +def tests_experiment_dict(): + # ------------------------------------------------------------------------ + # null row + row = {b'id':1, + b'age' : None, + b'gender' : None, + b'project_code' : None, + b'specimen_name' : None, + b'transgenic_line' : None, + b'workflow_state' : None, + b'workflows' : None, + b'structure_id' : None, + b'structure_name' : None, + b'structure_acronym' : None, + b'injection_structures_id' : None, + b'injection_structures_name' : None, + b'injection_structures_acronym' : None} + + exp = _experiment_dict(row) + + assert exp.pop('id') == 1 + + assert exp.get('structure_id') == exp.get('injection_structures')[0].get('id') + assert exp.get('structure_name') == exp.get('injection_structures')[0].get('name') + assert exp.get('structure_abbrev') == exp.get('injection_structures')[0].get('abbreviation') + + assert exp.pop('structure_id') == _STRUCTURE_TREE_ROOT_ID + assert exp.pop('structure_name') == _STRUCTURE_TREE_ROOT_NAME + assert exp.pop('structure_abbrev') == _STRUCTURE_TREE_ROOT_ACRONYM + + assert len(exp.pop('injection_structures')) == 1 + + assert exp.get('workflows')[0] == "" + assert len(exp.pop('workflows')) == 1 + + for value in exp.values(): + assert value == "" + + +# ---------------------------------------------------------------------------- +# MouseConnectivityApiPrerelease class +# ---------------------------------------------------------------------------- +@pytest.mark.prerelease() +def test_get_structure_unionizes(connectivity): + assert_raises(NotImplementedError, connectivity.get_structure_unionizes) + + +@pytest.mark.prerelease() +def test_download_injection_density(connectivity, storage_dirs, fn_temp_dir): + eid = 111 + store = storage_dirs[str(eid)] + source = os.path.join(store, 'grid', 'injection_density_25.nrrd') + target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'injection_density_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage') as gda: + connectivity.download_injection_density(target, eid, 25) + + gda.assert_called_once_with(source, target) + + +@pytest.mark.prerelease() +def test_download_projection_density(connectivity, storage_dirs, fn_temp_dir): + eid = 111 + store = storage_dirs[str(eid)] + source = os.path.join(store, 'grid', 'projection_density_25.nrrd') + target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'projection_density_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage') as gda: + connectivity.download_projection_density(target, eid, 25) + + gda.assert_called_once_with(source, target) + + +@pytest.mark.prerelease() +def test_download_injection_fraction(connectivity, storage_dirs, fn_temp_dir): + eid = 111 + store = storage_dirs[str(eid)] + source = os.path.join(store, 'grid', 'injection_fraction_25.nrrd') + target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'injection_fraction_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage') as gda: + connectivity.download_injection_fraction(target, eid, 25) + + gda.assert_called_once_with(source, target) + + +@pytest.mark.prerelease() +def test_download_data_mask(connectivity, storage_dirs, fn_temp_dir): + eid = 111 + store = storage_dirs[str(eid)] + source = os.path.join(store, 'grid', 'data_mask_25.nrrd') + target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'data_mask_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage') as gda: + connectivity.download_data_mask(target, eid, 25) + + gda.assert_called_once_with(source, target) diff --git a/test/internal/api/test_pre_release.py b/test/internal/api/test_pre_release.py new file mode 100644 index 0000000000..3b7a190b77 --- /dev/null +++ b/test/internal/api/test_pre_release.py @@ -0,0 +1,168 @@ +from allensdk.internal.api.queries.pre_release import BrainObservatoryApiPreRelease +from allensdk.core.brain_observatory_cache import BrainObservatoryCache +from six import integer_types +import pytest +import os +import numpy as np + +@pytest.fixture(scope='function') +def tmpdir(tmpdir_factory): + fn = tmpdir_factory.mktemp('tmpdir') + return fn + + +@pytest.mark.prerelease +def test_pre_release_get_containers(tmpdir): + + # Values from original boc/api: + temp_dir_base = os.path.join(str(tmpdir), 'base-api') + outfile_base = os.path.join(temp_dir_base, 'manifest.json') + boc_base = BrainObservatoryCache(manifest_file=outfile_base) + containers_base = boc_base.get_experiment_containers() + + # # For development: print key/val pairs needed to be populated by adapter: + # for key, val in sorted(containers_base[0].items(), key=lambda x: x[0]): + # print key, val + # raise + + try: + temp_dir_extended = os.path.join(str(tmpdir), 'extended-api') + outfile_extended = os.path.join(temp_dir_extended, 'manifest.json') + boc_extended = BrainObservatoryCache(manifest_file=outfile_extended, api=BrainObservatoryApiPreRelease()) + except TypeError: + import allensdk + raise RuntimeError('Allensdk out-of-date; upgrade with "pip install --force --upgrade allensdk"') + + containers_extended = boc_extended.get_experiment_containers() + + # # For development: print key/val pairs actually populated by adapter: + # for key, val in sorted(containers_extended[0].items(), key=lambda x: x[0]): + # print key, val + # raise + + + assert len(containers_extended) > 0 + check_key_list = ['failed', 'tags', 'specimen_name', 'imaging_depth', 'donor_name', 'reporter_line', 'targeted_structure', 'cre_line', 'id'] + for key in check_key_list: + assert key in containers_extended[0] + assert len(containers_extended[0]) == len(containers_base[0]) + set(containers_extended[0].keys()) == set(containers_base[0].keys()) + + id_container_dict = {} + for c_e in containers_extended: + curr_id = c_e['id'] + id_container_dict[curr_id] = c_e + + for c_b in containers_base: + c_e = id_container_dict[c_b['id']] + for key in c_e: + if not c_e[key] == c_b[key]: + print(key, c_e[key], c_b[key]) + raise Exception() + + +@pytest.mark.prerelease +def test_pre_release_get_experiments(tmpdir): + + # Values from original boc/api: + temp_dir_base = os.path.join(str(tmpdir), 'base-api') + outfile_base = os.path.join(temp_dir_base, 'manifest.json') + boc_base = BrainObservatoryCache(manifest_file=outfile_base) + experiments_base = boc_base.get_ophys_experiments() + + # # For development: print key/val pairs needed to be populated by adapter: + # for key, val in sorted(experiments_base[0].items(), key=lambda x: x[0]): + # print key, val + # raise + + + try: + temp_dir_extended = os.path.join(str(tmpdir), 'extended-api') + outfile_extended = os.path.join(temp_dir_extended, 'manifest.json') + boc_extended = BrainObservatoryCache(manifest_file=outfile_extended, api=BrainObservatoryApiPreRelease()) + except TypeError: + import allensdk + raise RuntimeError('Allensdk out-of-date; upgrade with "pip install --force --upgrade allensdk"') + + experiments_extended = boc_extended.get_ophys_experiments() + + # # For development: print key/val pairs actually populated by adapter: + # for key, val in sorted(containers_extended[0].items(), key=lambda x: x[0]): + # print key, val + # raise + + check_key_list = ['acquisition_age_days', 'cre_line', 'donor_name', 'experiment_container_id', 'fail_eye_tracking', 'id', 'imaging_depth', 'reporter_line', 'session_type', 'specimen_name', 'targeted_structure'] + for key in check_key_list: + assert key in experiments_extended[0] + + assert len(experiments_extended) > 0 + assert set(experiments_base[0].keys()) == set(experiments_extended[0].keys()) + + id_experiment_dict = {} + for c_e in experiments_extended: + curr_id = c_e['id'] + id_experiment_dict[curr_id] = c_e + + for c_b in experiments_base: + c_e = id_experiment_dict[c_b['id']] + for key in c_e: + # assert c_e[key] == c_b[key] + if not c_e[key] == c_b[key]: + print(key, c_e[key], c_b[key]) + raise Exception() + + +@pytest.mark.prerelease +def test_pre_release_get_cell_specimens(tmpdir): + + # Values from original boc/api: Useful debugging code below, commented out + # import warnings + # warnings.warn('hard coding tmpdir while I dev, because query takes a long time') + # temp_dir_base = '/home/nicholasc/tmp/base-api' + temp_dir_base = os.path.join(str(tmpdir), 'base-api') + outfile_base = os.path.join(temp_dir_base, 'manifest.json') + boc_base = BrainObservatoryCache(manifest_file=outfile_base) + + cell_specimens_base = boc_base.get_cell_specimens(include_failed=True) + + # # For development: print key/val pairs needed to be populated by adapter: + # for container in cell_specimens_base: + # if container['all_stim'] == True: + # for key, val in sorted(container.items(), key=lambda x: x[0]): + # print key, val + # raise + + try: + temp_dir_extended = os.path.join(str(tmpdir), 'extended-api') + outfile_extended = os.path.join(temp_dir_extended, 'manifest.json') + boc_extended = BrainObservatoryCache(manifest_file=outfile_extended, api=BrainObservatoryApiPreRelease()) + except TypeError: + import allensdk + raise RuntimeError('Allensdk out-of-date; upgrade with "pip install --force --upgrade allensdk"') + + cell_specimens_extended = boc_extended.get_cell_specimens(include_failed=True) + + + assert len(cell_specimens_extended) > 0 + assert set(cell_specimens_base[0].keys()) == set(cell_specimens_extended[0].keys()) + + id_experiment_dict = {} + for c_b in cell_specimens_base: + curr_id = c_b['cell_specimen_id'] + id_experiment_dict[curr_id] = c_b + + for c_e in cell_specimens_extended: + if c_e['cell_specimen_id'] in id_experiment_dict: + c_b = id_experiment_dict[c_e['cell_specimen_id']] + for key in sorted([key2 for key2 in c_b]): + assert key in c_e + if not c_e[key] == c_b[key] and not key == 'specimen_id': # Failure mode 1: specimen_id changed + + if isinstance(c_b[key], (float, complex) + integer_types) and isinstance(c_e[key], (float, complex) + integer_types): + assert np.isclose(c_e[key], c_b[key], 1e-12) # Failure mode 2: floating-point precision + elif c_b[key] is None and isinstance(c_e[key], (float, complex) + integer_types): + pass + else: + # assert c_b[key] is None and isinstance(c_e[key], (int, long, float, complex)) + print(key, c_e[key], c_b[key]) + raise Exception() diff --git a/test/internal/biophysical/__pycache__/conftest.cpython-37.pyc b/test/internal/biophysical/__pycache__/conftest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5283d0afeec0798798117f7ce0dc3a1f20f491e GIT binary patch literal 323 zcmXv|y-ve05Vn&LRiJj_5g6z|Gq53q_)#|$B-$>KrO2_5)JkecwgXBx-lP>155UW0 zW#Sc>xK!e#`|eKneRtpeczjGS^v65@!umZ7{}Ezyi|Ni0B$2cx87WCdf$Rbq?5PZ^ z(4GO^g)-Vxii`!B9{nJjq}j=GzF6kzeD(a4_K~+OY)?HnpPR<3joLzPTRm&KY19YC zWfNiQ8idbPsf~p`F2RF-?PK0FpyemAF`hlZuY0&+D+kswzUFdP@HehIcBi>8TJlSV zI>!vkoIo_qx^wJN70f9Q7Y!E`F9EgqPdiy9gR4Yo4_5O!Dbzur1on9EW!R$4essMt RvaR8Uq7OHi8HEv@&_6oTVXpuH literal 0 HcmV?d00001 diff --git a/test/internal/biophysical/__pycache__/test_ephys_utils.cpython-37.pyc b/test/internal/biophysical/__pycache__/test_ephys_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8c23d1f99c4031f4bc08fdbd5bd47d192742dcb GIT binary patch literal 1076 zcmY*YJ8u**5VpOK+j~Vw1OX|iXtv<4potJ7mqc`sf=6SmwDPT;%aVOzdoP^0D<EkR z4GoAQfr_8NU)h!_9W@nW9~T|7npxYQKktmc*}Z<hgTRXK?^x&{^vg_E26Hq5S1%xN z#Bqk`@{K8hImw*dr7m8sdAUyzMtRG|z{WOhV<gb44tKbFhE6f<a*z9Gi1s*sj>6U@ zoQw`a+_+E6<Tx=iV+7m--v?LQ5IEN89CLDkH~$~QxnG?H(&Q8^uqND_Bkq47a~wN! z`-OuE(7}H1T$)NJUp^cAxf41xP&&=)tX54Rg{sOz3EEdIud=k5#FA-2JL*J;D&|bH zkTh<=azT4i=vo%>lx4LD-G&rZ<1@*MiI667+MWm<TcY6@ZWEXoE1`cNY0~)fcK<>2 zQVFRdcEtE#%uZM_i*^f^lm%z^BT-CMR92!;3B<BGnyKhXI*wGT#l4Cp$7~{in`N+r z9}l%qdYBek$bx0VacT)^0%L>3!tmo-r<od5Gueg=THtB}0wO)!!-3;t7k7xo5^UDN zj0Qfq)uDm`2MtmTHw|jc(HwJp8(omdS&)UZa5Xu1<^-b4oeRv}O~BN)_TGasfH+r( zXOU-Dh+!@{zC|*FaAZ2<fcBOe6m>op^3tRvO=m839eo^`!M9Ia`QAUJ?~X#h>8_Pb zZ(RuzPvbP!@u4hpqlPra(Jqsc&0_JoW|=hi(roN1&_<_a@mR`IhMv8a2CD{78=N*+ zTNRg~YZy1}Jy%SrbSmOXib|G=Q0fMNss{n#fcW?t-hxM7hk4kiel;^R>OpNFi%rJO z;YV2Z(Qqa2V5RIJFS*DDYx)k>>kL-=8qaQ|-L;*v4<Dti!}JYwudoH#Jk}~PohfZO Y!9zHp&cq|r3CgSoIDj^}<7{mF1)#JUTmS$7 literal 0 HcmV?d00001 diff --git a/test/internal/biophysical/__pycache__/test_optimize_run.cpython-37.pyc b/test/internal/biophysical/__pycache__/test_optimize_run.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..568676adde56afef1a31be6ade0b43fde814d8ca GIT binary patch literal 256238 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 GpZ_1pq=7vE literal 0 HcmV?d00001 diff --git a/test/internal/biophysical/__pycache__/test_simulate_run.cpython-37.pyc b/test/internal/biophysical/__pycache__/test_simulate_run.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..604c519f12589ed5e771057c35f58d707b6fd2b8 GIT binary patch literal 19472 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 G0{AbXU~)_V literal 0 HcmV?d00001 diff --git a/test/internal/biophysical/conftest.py b/test/internal/biophysical/conftest.py new file mode 100644 index 0000000000..c467d2d328 --- /dev/null +++ b/test/internal/biophysical/conftest.py @@ -0,0 +1,6 @@ +import os + +# ignore test_optimize_run.py if don't have neuron installed +collect_ignore = [] +if os.getenv("TEST_NEURON") != 'true': + collect_ignore.append("test_optimize_run.py") diff --git a/test/internal/biophysical/test_ephys_utils.py b/test/internal/biophysical/test_ephys_utils.py new file mode 100644 index 0000000000..88c9b59d08 --- /dev/null +++ b/test/internal/biophysical/test_ephys_utils.py @@ -0,0 +1,28 @@ +import pytest +import numpy as np +from mock import Mock +import allensdk.internal.model.biophysical.ephys_utils as ephys_utils + + +@pytest.fixture +def data_set(): + data = { 'stimulus': 1.0 * np.arange(10), + 'response': 1.0 * np.arange(10), + 'sampling_rate': 0.1 + } + + data_set = Mock() + data_set.get_sweep = Mock(name='sweep_data', + return_value=data) + + return data_set + + +def test_passive_preprocess(data_set): + s = { 'sweep_number': 5 } + + v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, + s['sweep_number']) + assert np.array_equal(v, np.arange(10) * 1000.0) + assert np.array_equal(i, np.arange(10) * 1.0e12) + assert np.array_equal(t, np.arange(10) * 10.0) diff --git a/test/internal/biophysical/test_optimize_run.py b/test/internal/biophysical/test_optimize_run.py new file mode 100644 index 0000000000..c6180c56df --- /dev/null +++ b/test/internal/biophysical/test_optimize_run.py @@ -0,0 +1,6869 @@ +import pytest +import sys +from mock import patch, mock_open, Mock, MagicMock +from allensdk.model.biophysical.utils import Utils +from allensdk.model.biophys_sim.config import Config +import os +import mock +import shutil +try: + import __builtin__ as builtins +except: + import builtins +from allensdk.model.biophysical import runner +from allensdk.internal.model.biophysical.run_optimize \ + import RunOptimize +from allensdk.internal.api.queries.optimize_config_reader \ + import OptimizeConfigReader +from allensdk.model.biophys_sim.neuron.hoc_utils import HocUtils + +real_import = __import__ + +#import allensdk.eclipse_debug + + +MANIFEST_JSON = ''' +{ + "biophys": [ + { + "model_file": [ + "/local1/tmp/manifest_sdk.json" + ] + } + ], + "runs": [ + { + "specimen_id": 318733871, + "sweeps": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 55, + 56, + 57, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 106 + ] + } + ], + "neuron": [ + { + "hoc": [ + "stdgui.hoc", + "import3d.hoc", + "cell.hoc" + ] + } + ], + "manifest": [ + { + "type": "dir", + "spec": "/local1/tmp", + "key": "BASEDIR" + }, + { + "type": "dir", + "spec": "/projects/mousecelltypes/vol1/prod192/neuronal_model_329322394/work", + "key": "WORKDIR" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/Nr5a1-Cre_Ai14-169248.04.02.01_491253825_m.swc", + "key": "MORPHOLOGY" + }, + { + "type": "dir", + "spec": "modfiles", + "key": "MODFILE_DIR" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", + "key": "MOD_FILE_Kv2like", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", + "key": "MOD_FILE_NaV", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", + "key": "MOD_FILE_Ca_HVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", + "key": "MOD_FILE_Ca_LVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", + "key": "MOD_FILE_CaDynamics", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", + "key": "MOD_FILE_Ih", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", + "key": "MOD_FILE_Im", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", + "key": "MOD_FILE_Im_v2", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", + "key": "MOD_FILE_K_P", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", + "key": "MOD_FILE_K_T", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", + "key": "MOD_FILE_Kd", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", + "key": "MOD_FILE_Kv3_1", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", + "key": "MOD_FILE_Nap", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", + "key": "MOD_FILE_NaTa", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", + "key": "MOD_FILE_NaTs", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", + "key": "MOD_FILE_SK", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", + "key": "MOD_FILE_Kv2like", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", + "key": "MOD_FILE_NaV", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", + "key": "MOD_FILE_Ca_HVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", + "key": "MOD_FILE_Ca_LVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", + "key": "MOD_FILE_CaDynamics", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", + "key": "MOD_FILE_Ih", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", + "key": "MOD_FILE_Im", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", + "key": "MOD_FILE_Im_v2", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", + "key": "MOD_FILE_K_P", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", + "key": "MOD_FILE_K_T", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", + "key": "MOD_FILE_Kd", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", + "key": "MOD_FILE_Kv3_1", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", + "key": "MOD_FILE_Nap", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", + "key": "MOD_FILE_NaTa", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", + "key": "MOD_FILE_NaTs", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", + "key": "MOD_FILE_SK", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", + "key": "MOD_FILE_Kv2like", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", + "key": "MOD_FILE_NaV", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", + "key": "MOD_FILE_Ca_HVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", + "key": "MOD_FILE_Ca_LVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", + "key": "MOD_FILE_CaDynamics", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", + "key": "MOD_FILE_Ih", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", + "key": "MOD_FILE_Im", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", + "key": "MOD_FILE_Im_v2", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", + "key": "MOD_FILE_K_P", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", + "key": "MOD_FILE_K_T", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", + "key": "MOD_FILE_Kd", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", + "key": "MOD_FILE_Kv3_1", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", + "key": "MOD_FILE_Nap", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", + "key": "MOD_FILE_NaTa", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", + "key": "MOD_FILE_NaTs", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", + "key": "MOD_FILE_SK", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/318733869.nwb", + "key": "stimulus_path", + "format": "NWB" + }, + { + "type": "file", + "spec": "/local1/tmp/manifest_sdk.json", + "key": "manifest" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "318733869.nwb", + "key": "output", + "format": "NWB" + }, + { + "type": "file", + "spec": "/local1/tmp/lims_message_optimize.json", + "key": "neuronal_model_data" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "upbase.dat", + "key": "upfile" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "downbase.dat", + "key": "downfile" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "passive_fit_data.json", + "key": "passive_fit_data" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "stage_1_jobs.json", + "key": "stage_1_jobs" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "fit_1_data.json", + "key": "fit_1_file" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "fit_2_data.json", + "key": "fit_2_file" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "fit_3_data.json", + "key": "fit_3_file" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "%s", + "key": "fit_type_path" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "target.json", + "key": "target_path" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "%s/config.json", + "key": "fit_config_json" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "%s/s%d/final_hof_fit.txt", + "key": "final_hof_fit" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "%s/s%d/final_hof.txt", + "key": "final_hof" + }, + { + "type": "file", + "spec": "fit_%s_%s.json", + "key": "output_fit_file" + } + ] +} +''' + +LIMS_MESSAGE = ''' +{ + "created_at": "2015-02-13T16:52:57-08:00", + "id": 329322394, + "name": "Biophysical - perisomatic_Nr5a1-Cre;Ai14-169248.04.02.01", + "neuronal_model_template": { + "created_at": "2015-02-13T11:51:50-08:00", + "id": 329230710, + "name": "Biophysical - perisomatic", + "neuronal_model_template_type": { + "created_at": "2015-02-12T19:46:16-08:00", + "description": "Biophysical Neuronal Model Template", + "id": 328959041, + "name": "BIOPHYS", + "updated_at": "2016-02-12T15:30:27-08:00" + }, + "neuronal_model_template_type_id": 328959041, + "updated_at": "2015-02-13T11:51:50-08:00", + "well_known_files": [ + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-11-13T13:47:51-08:00", + "file_source_id": null, + "filename": "Kv2like.mod", + "id": 491113425, + "published_at": "2016-03-03", + "size": 1433, + "storage_directory": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-11-13T13:47:51-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "audio/x-mod", + "created_at": "2015-03-16T11:07:34-07:00", + "file_source_id": null, + "filename": "NaV.mod", + "id": 464138096, + "published_at": "2015-05-14", + "size": 4061, + "storage_directory": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-03-16T11:08:04-07:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:20-08:00", + "file_source_id": null, + "filename": "Ca_HVA.mod", + "id": 395337003, + "published_at": "2015-05-14", + "size": 1211, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:05-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:30-08:00", + "file_source_id": null, + "filename": "Ca_LVA.mod", + "id": 395337007, + "published_at": "2015-05-14", + "size": 1069, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:13-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:40-08:00", + "file_source_id": null, + "filename": "CaDynamics.mod", + "id": 395337011, + "published_at": "2015-05-14", + "size": 704, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:20-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:48-08:00", + "file_source_id": null, + "filename": "Ih.mod", + "id": 395337015, + "published_at": "2015-05-14", + "size": 1005, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:27-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:57-08:00", + "file_source_id": null, + "filename": "Im.mod", + "id": 395337019, + "published_at": "2015-05-14", + "size": 859, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:34-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:21-08:00", + "file_source_id": null, + "filename": "Im_v2.mod", + "id": 395337042, + "published_at": "2015-05-14", + "size": 761, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:40-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:29-08:00", + "file_source_id": null, + "filename": "K_P.mod", + "id": 395337046, + "published_at": "2015-05-14", + "size": 1161, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:47-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:42-08:00", + "file_source_id": null, + "filename": "K_T.mod", + "id": 395337050, + "published_at": "2015-05-14", + "size": 1031, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:53-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:02-08:00", + "file_source_id": null, + "filename": "Kd.mod", + "id": 395337054, + "published_at": "2015-05-14", + "size": 705, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:59-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:20-08:00", + "file_source_id": null, + "filename": "Kv3_1.mod", + "id": 395337062, + "published_at": "2015-05-14", + "size": 631, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:13-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:29-08:00", + "file_source_id": null, + "filename": "Nap.mod", + "id": 395337066, + "published_at": "2015-05-14", + "size": 1170, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:19-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:38-08:00", + "file_source_id": null, + "filename": "NaTa.mod", + "id": 395337070, + "published_at": "2015-05-14", + "size": 1413, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:29-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:48:22-08:00", + "file_source_id": null, + "filename": "NaTs.mod", + "id": 395337225, + "published_at": "2015-05-14", + "size": 1267, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:36-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:49:02-08:00", + "file_source_id": null, + "filename": "SK.mod", + "id": 395337293, + "published_at": "2015-05-14", + "size": 942, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:48-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-11-13T13:47:51-08:00", + "file_source_id": null, + "filename": "Kv2like.mod", + "id": 491113425, + "published_at": "2016-03-03", + "size": 1433, + "storage_directory": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-11-13T13:47:51-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "audio/x-mod", + "created_at": "2015-03-16T11:07:34-07:00", + "file_source_id": null, + "filename": "NaV.mod", + "id": 464138096, + "published_at": "2015-05-14", + "size": 4061, + "storage_directory": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-03-16T11:08:04-07:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:20-08:00", + "file_source_id": null, + "filename": "Ca_HVA.mod", + "id": 395337003, + "published_at": "2015-05-14", + "size": 1211, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:05-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:30-08:00", + "file_source_id": null, + "filename": "Ca_LVA.mod", + "id": 395337007, + "published_at": "2015-05-14", + "size": 1069, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:13-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:40-08:00", + "file_source_id": null, + "filename": "CaDynamics.mod", + "id": 395337011, + "published_at": "2015-05-14", + "size": 704, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:20-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:48-08:00", + "file_source_id": null, + "filename": "Ih.mod", + "id": 395337015, + "published_at": "2015-05-14", + "size": 1005, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:27-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:57-08:00", + "file_source_id": null, + "filename": "Im.mod", + "id": 395337019, + "published_at": "2015-05-14", + "size": 859, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:34-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:21-08:00", + "file_source_id": null, + "filename": "Im_v2.mod", + "id": 395337042, + "published_at": "2015-05-14", + "size": 761, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:40-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:29-08:00", + "file_source_id": null, + "filename": "K_P.mod", + "id": 395337046, + "published_at": "2015-05-14", + "size": 1161, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:47-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:42-08:00", + "file_source_id": null, + "filename": "K_T.mod", + "id": 395337050, + "published_at": "2015-05-14", + "size": 1031, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:53-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:02-08:00", + "file_source_id": null, + "filename": "Kd.mod", + "id": 395337054, + "published_at": "2015-05-14", + "size": 705, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:59-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:20-08:00", + "file_source_id": null, + "filename": "Kv3_1.mod", + "id": 395337062, + "published_at": "2015-05-14", + "size": 631, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:13-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:29-08:00", + "file_source_id": null, + "filename": "Nap.mod", + "id": 395337066, + "published_at": "2015-05-14", + "size": 1170, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:19-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:38-08:00", + "file_source_id": null, + "filename": "NaTa.mod", + "id": 395337070, + "published_at": "2015-05-14", + "size": 1413, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:29-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:48:22-08:00", + "file_source_id": null, + "filename": "NaTs.mod", + "id": 395337225, + "published_at": "2015-05-14", + "size": 1267, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:36-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:49:02-08:00", + "file_source_id": null, + "filename": "SK.mod", + "id": 395337293, + "published_at": "2015-05-14", + "size": 942, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:48-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-11-13T13:47:51-08:00", + "file_source_id": null, + "filename": "Kv2like.mod", + "id": 491113425, + "published_at": "2016-03-03", + "size": 1433, + "storage_directory": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-11-13T13:47:51-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "audio/x-mod", + "created_at": "2015-03-16T11:07:34-07:00", + "file_source_id": null, + "filename": "NaV.mod", + "id": 464138096, + "published_at": "2015-05-14", + "size": 4061, + "storage_directory": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-03-16T11:08:04-07:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:20-08:00", + "file_source_id": null, + "filename": "Ca_HVA.mod", + "id": 395337003, + "published_at": "2015-05-14", + "size": 1211, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:05-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:30-08:00", + "file_source_id": null, + "filename": "Ca_LVA.mod", + "id": 395337007, + "published_at": "2015-05-14", + "size": 1069, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:13-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:40-08:00", + "file_source_id": null, + "filename": "CaDynamics.mod", + "id": 395337011, + "published_at": "2015-05-14", + "size": 704, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:20-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:48-08:00", + "file_source_id": null, + "filename": "Ih.mod", + "id": 395337015, + "published_at": "2015-05-14", + "size": 1005, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:27-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:42:57-08:00", + "file_source_id": null, + "filename": "Im.mod", + "id": 395337019, + "published_at": "2015-05-14", + "size": 859, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:34-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:21-08:00", + "file_source_id": null, + "filename": "Im_v2.mod", + "id": 395337042, + "published_at": "2015-05-14", + "size": 761, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:40-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:29-08:00", + "file_source_id": null, + "filename": "K_P.mod", + "id": 395337046, + "published_at": "2015-05-14", + "size": 1161, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:47-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:46:42-08:00", + "file_source_id": null, + "filename": "K_T.mod", + "id": 395337050, + "published_at": "2015-05-14", + "size": 1031, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:53-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:02-08:00", + "file_source_id": null, + "filename": "Kd.mod", + "id": 395337054, + "published_at": "2015-05-14", + "size": 705, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:50:59-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:20-08:00", + "file_source_id": null, + "filename": "Kv3_1.mod", + "id": 395337062, + "published_at": "2015-05-14", + "size": 631, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:13-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:29-08:00", + "file_source_id": null, + "filename": "Nap.mod", + "id": 395337066, + "published_at": "2015-05-14", + "size": 1170, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:19-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:47:38-08:00", + "file_source_id": null, + "filename": "NaTa.mod", + "id": 395337070, + "published_at": "2015-05-14", + "size": 1413, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:29-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:48:22-08:00", + "file_source_id": null, + "filename": "NaTs.mod", + "id": 395337225, + "published_at": "2015-05-14", + "size": 1267, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:36-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + }, + { + "ar_association_key_name": "329230710", + "attachable_id": 305094322, + "attachable_type": "Project", + "content_type": "video/mpeg", + "created_at": "2015-02-27T11:49:02-08:00", + "file_source_id": null, + "filename": "SK.mod", + "id": 395337293, + "published_at": "2015-05-14", + "size": 942, + "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", + "updated_at": "2015-02-27T11:51:48-08:00", + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "workflow_state": null + } + ] + }, + "neuronal_model_template_id": 329230710, + "specimen": { + "alignment3d_id": 473077597, + "barcode": "0318733871", + "biophysical_model_state": "review_required", + "carousel_well_name": null, + "cell_depth": null, + "cell_prep_id": null, + "cell_reporter_id": 491913822, + "created_at": "2015-01-07T12:12:35-08:00", + "created_by": null, + "data": null, + "donor_id": 318293721, + "ephys_cell_plan_id": 308388019, + "ephys_neural_tissue_plan_id": null, + "ephys_roi_result": { + "blowout_mv": 3.63650708459318, + "created_at": "2015-01-07T12:12:34-08:00", + "electrode_0_pa": -2.87437500016974, + "ephys_qc_criteria": { + "access_resistance_mohm_max": 20.0, + "access_resistance_mohm_min": 1.0, + "blowout_mv_max": 10.0, + "blowout_mv_min": -10.0, + "created_at": "2015-01-29T13:51:29-08:00", + "electrode_0_pa_max": 200.0, + "electrode_0_pa_min": -200.0, + "id": 324256702, + "input_vs_access_resistance_min": 0.15, + "leak_pa_max": 100.0, + "leak_pa_min": -100.0, + "name": "Ephys QC Criteria v1.1", + "post_noise_rms_mv_max": 0.07, + "pre_noise_rms_mv_max": 0.07, + "seal_gohm_min": 1.0, + "slow_noise_rms_mv_max": 0.5, + "updated_at": "2015-01-29T13:51:29-08:00", + "vm_delta_mv_max": 1.0 + }, + "ephys_qc_criteria_id": 324256702, + "ephys_specimen_roi_plan_id": 318696412, + "failed_bad_rs": false, + "failed_clogged_pipette": false, + "failed_electrode_0": false, + "failed_no_seal": null, + "failed_other": null, + "id": 318733869, + "initial_access_resistance_mohm": 12.415662, + "input_access_resistance_ratio": 0.0638893902110391, + "input_resistance_mohm": 194.330576, + "notes": null, + "published_at": "2015-05-13T17:00:00-07:00", + "recording_date": "2015-01-07T03:24:48-08:00", + "rig_name": null, + "seal_gohm": 2.35573504, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-07-08T05:57:54-07:00", + "well_known_files": [ + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "application/octet-stream; charset=binary", + "created_at": "2015-01-07T12:14:58-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.pxp", + "id": 318736730, + "published_at": null, + "size": 2641238729, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-01-07T12:14:58-08:00", + "well_known_file_type": { + "created_at": "2014-07-10T19:36:42-07:00", + "id": 305301981, + "name": "IGOR Output", + "updated_at": "2014-07-10T19:36:42-07:00" + }, + "well_known_file_type_id": 305301981, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "image/tiff; charset=binary", + "created_at": "2015-01-07T12:14:58-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.40x.tif", + "id": 318736732, + "published_at": null, + "size": 2895604, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-01-07T12:14:58-08:00", + "well_known_file_type": { + "created_at": "2014-07-10T19:36:43-07:00", + "id": 305301983, + "name": "Cell Image", + "updated_at": "2014-07-10T19:36:43-07:00" + }, + "well_known_file_type_id": 305301983, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "image/tiff; charset=binary", + "created_at": "2015-01-07T12:14:58-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.40x_patched_bf.tif", + "id": 318736734, + "published_at": null, + "size": 2895604, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-01-07T12:14:58-08:00", + "well_known_file_type": { + "created_at": "2014-11-11T19:23:14-08:00", + "id": 310980879, + "name": "Cell Image: BreakIn Contrast", + "updated_at": "2014-11-11T19:23:14-08:00" + }, + "well_known_file_type_id": 310980879, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "image/tiff; charset=binary", + "created_at": "2015-01-07T12:14:58-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.40x_patched_epi.tif", + "id": 318736736, + "published_at": null, + "size": 2895604, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-01-07T12:14:58-08:00", + "well_known_file_type": { + "created_at": "2014-11-11T19:23:15-08:00", + "id": 310980881, + "name": "Cell Image: BreakIn 565nm", + "updated_at": "2014-11-11T19:23:15-08:00" + }, + "well_known_file_type_id": 310980881, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "image/tiff; charset=binary", + "created_at": "2015-01-07T12:14:58-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.4x.tif", + "id": 318736738, + "published_at": null, + "size": 2895604, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-01-07T12:14:58-08:00", + "well_known_file_type": { + "created_at": "2014-08-14T14:53:07-07:00", + "id": 306905520, + "name": "Low Magnification Image", + "updated_at": "2014-08-14T14:53:07-07:00" + }, + "well_known_file_type_id": 306905520, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "application/x-hdf; charset=binary", + "created_at": "2015-01-07T12:14:58-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.h5", + "id": 318736740, + "published_at": null, + "size": 2643186456, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-01-07T12:14:58-08:00", + "well_known_file_type": { + "created_at": "2014-08-14T14:53:09-07:00", + "id": 306905526, + "name": "HDF5", + "updated_at": "2014-08-14T14:53:09-07:00" + }, + "well_known_file_type_id": 306905526, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "application/json", + "created_at": "2015-07-08T06:55:38-07:00", + "file_source_id": null, + "filename": "318733869_ephys_features.json", + "id": 480630908, + "published_at": null, + "size": null, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-07-08T06:55:38-07:00", + "well_known_file_type_id": null, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "image/png; charset=binary", + "created_at": "2015-10-02T11:03:09-07:00", + "file_source_id": null, + "filename": "morphology_summary.png", + "id": 487660096, + "published_at": "2015-05-14", + "size": 988, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-11-30T20:38:38-08:00", + "well_known_file_type": { + "created_at": "2015-07-09T13:57:28-07:00", + "id": 480715721, + "name": "MorphologyThumbnail", + "updated_at": "2015-07-09T13:57:28-07:00" + }, + "well_known_file_type_id": 480715721, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "image/png; charset=binary", + "created_at": "2015-10-01T14:46:12-07:00", + "file_source_id": null, + "filename": "ephys_summary.png", + "id": 487611469, + "published_at": "2015-05-14", + "size": 9227, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2016-01-29T02:02:59-08:00", + "well_known_file_type": { + "created_at": "2015-07-09T13:58:28-07:00", + "id": 480715749, + "name": "EphysSummaryThumbnail", + "updated_at": "2015-07-09T13:58:28-07:00" + }, + "well_known_file_type_id": 480715749, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "image/png; charset=binary", + "created_at": "2015-11-30T21:30:02-08:00", + "file_source_id": null, + "filename": "ephys_inst_threshold.png", + "id": 491381583, + "published_at": "2015-05-14", + "size": 1477, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2016-01-29T02:02:59-08:00", + "well_known_file_type": { + "created_at": "2015-10-14T10:14:10-07:00", + "id": 488673261, + "name": "EphysInstantaneousThresholdThumbnail", + "updated_at": "2015-10-14T10:14:10-07:00" + }, + "well_known_file_type_id": 488673261, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "application/x-hdf; charset=binary", + "created_at": "2015-01-29T22:38:04-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.orca", + "id": 324326353, + "published_at": null, + "size": null, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-01-29T22:38:04-08:00", + "well_known_file_type": { + "created_at": "2014-11-20T19:45:24-08:00", + "id": 311813285, + "name": "ORCA", + "updated_at": "2014-11-20T19:45:24-08:00" + }, + "well_known_file_type_id": 311813285, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "application/x-hdf; charset=binary", + "created_at": "2015-04-28T20:08:07-07:00", + "file_source_id": null, + "filename": "318733869.nwb", + "id": 475693115, + "published_at": null, + "size": null, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-04-28T20:08:07-07:00", + "well_known_file_type": { + "created_at": "2015-04-16T14:09:40-07:00", + "id": 475137571, + "name": "NWB", + "updated_at": "2015-04-16T14:09:40-07:00" + }, + "well_known_file_type_id": 475137571, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "application/x-hdf; charset=binary", + "created_at": "2015-11-16T14:00:58-08:00", + "file_source_id": null, + "filename": "318733869_ephys.nwb", + "id": 491198860, + "published_at": "2015-05-14", + "size": null, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-11-16T14:00:58-08:00", + "well_known_file_type": { + "created_at": "2015-07-14T14:11:16-07:00", + "id": 481007198, + "name": "NWBDownload", + "updated_at": "2015-07-14T14:11:16-07:00" + }, + "well_known_file_type_id": 481007198, + "workflow_state": null + }, + { + "attachable_id": 318733869, + "attachable_type": "EphysRoiResult", + "content_type": "application/x-hdf; charset=binary", + "created_at": "2015-11-16T14:00:58-08:00", + "file_source_id": null, + "filename": "318733869_uncompressed.nwb", + "id": 491198863, + "published_at": "2015-05-14", + "size": null, + "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", + "updated_at": "2015-11-16T14:00:58-08:00", + "well_known_file_type": { + "created_at": "2015-06-09T15:21:33-07:00", + "id": 478840678, + "name": "NWBUncompressed", + "updated_at": "2015-06-09T15:21:33-07:00" + }, + "well_known_file_type_id": 478840678, + "workflow_state": null + } + ], + "workflow_state": "manual_passed" + }, + "ephys_roi_result_id": 318733869, + "ephys_sweeps": [ + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[7]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338141, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338141, + "ephys_sweep_tags": [], + "id": 396323610, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0356589965522289, + "post_vm_mv": -73.690673828125, + "pre_noise_rms_mv": 0.0380660705268383, + "pre_vm_mv": -73.6825790405273, + "slow_noise_rms_mv": 0.181937232613564, + "slow_vm_mv": -73.6825790405273, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.072995, + "stimulus_interval": 0.035, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 87, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.00809478759765625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[6]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338137, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338137, + "ephys_sweep_tags": [], + "id": 396323608, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0338849276304245, + "post_vm_mv": -73.9566116333008, + "pre_noise_rms_mv": 0.0396845452487469, + "pre_vm_mv": -74.0519638061523, + "slow_noise_rms_mv": 0.18243981897831, + "slow_vm_mv": -74.0519638061523, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.064995, + "stimulus_interval": 0.031, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 86, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0953521728515625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[5]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338131, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338131, + "ephys_sweep_tags": [], + "id": 396323606, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0375229977071285, + "post_vm_mv": -73.8176422119141, + "pre_noise_rms_mv": 0.0395662672817707, + "pre_vm_mv": -73.6396636962891, + "slow_noise_rms_mv": 0.279655814170837, + "slow_vm_mv": -73.6396636962891, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.056995, + "stimulus_interval": 0.027, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 85, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.177978515625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[6]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338137, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338137, + "ephys_sweep_tags": [], + "id": 396323584, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0425188019871712, + "post_vm_mv": -73.2127685546875, + "pre_noise_rms_mv": 0.0361235067248344, + "pre_vm_mv": -73.4286575317383, + "slow_noise_rms_mv": 0.178375139832497, + "slow_vm_mv": -73.4286575317383, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.064995, + "stimulus_interval": 0.031, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 78, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.215888977050781, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[5]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338131, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338131, + "ephys_sweep_tags": [], + "id": 396323582, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0382817052304745, + "post_vm_mv": -73.6458282470703, + "pre_noise_rms_mv": 0.0396089442074299, + "pre_vm_mv": -73.4182739257812, + "slow_noise_rms_mv": 0.228058248758316, + "slow_vm_mv": -73.4182739257812, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.056995, + "stimulus_interval": 0.027, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 77, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.227554321289062, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[4]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338127, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338127, + "ephys_sweep_tags": [], + "id": 396323580, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0367705412209034, + "post_vm_mv": -73.3423385620117, + "pre_noise_rms_mv": 0.0410844683647156, + "pre_vm_mv": -73.2242660522461, + "slow_noise_rms_mv": 0.295760065317154, + "slow_vm_mv": -73.2242660522461, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.048995, + "stimulus_interval": 0.023, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 76, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.118072509765625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[3]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338123, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338123, + "ephys_sweep_tags": [], + "id": 396323577, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0412763878703117, + "post_vm_mv": -73.5490570068359, + "pre_noise_rms_mv": 0.0366058796644211, + "pre_vm_mv": -73.0638885498047, + "slow_noise_rms_mv": 0.171120792627335, + "slow_vm_mv": -73.0638885498047, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.040995, + "stimulus_interval": 0.019, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 75, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.48516845703125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[2]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338119, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338119, + "ephys_sweep_tags": [], + "id": 396323573, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0449937023222446, + "post_vm_mv": -73.4591293334961, + "pre_noise_rms_mv": 0.0359138548374176, + "pre_vm_mv": -73.5854873657227, + "slow_noise_rms_mv": 0.337626546621323, + "slow_vm_mv": -73.5854873657227, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.032995, + "stimulus_interval": 0.015, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 74, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.126358032226562, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[1]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338115, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338115, + "ephys_sweep_tags": [], + "id": 396323570, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0407821051776409, + "post_vm_mv": -73.443000793457, + "pre_noise_rms_mv": 0.050120122730732, + "pre_vm_mv": -73.2168655395508, + "slow_noise_rms_mv": 0.144578456878662, + "slow_vm_mv": -73.2168655395508, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.024995, + "stimulus_interval": 0.011, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 73, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.22613525390625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:15-08:00", + "description": "C2SSTRIPLE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338111, + "updated_at": "2015-01-29T22:53:15-08:00" + }, + "ephys_stimulus_id": 324338111, + "ephys_sweep_tags": [], + "id": 396323568, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0424049384891987, + "post_vm_mv": -73.3690872192383, + "pre_noise_rms_mv": 0.040862325578928, + "pre_vm_mv": -73.4466323852539, + "slow_noise_rms_mv": 0.147407010197639, + "slow_vm_mv": -73.4466323852539, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.016995, + "stimulus_interval": 0.007, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 72, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.077545166015625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[7]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338141, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338141, + "ephys_sweep_tags": [], + "id": 396323566, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0450072474777699, + "post_vm_mv": -73.5418701171875, + "pre_noise_rms_mv": 0.0406083464622498, + "pre_vm_mv": -73.3598327636719, + "slow_noise_rms_mv": 0.273215651512146, + "slow_vm_mv": -73.3598327636719, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.072995, + "stimulus_interval": 0.035, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 71, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.182037353515625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[6]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338137, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338137, + "ephys_sweep_tags": [], + "id": 396323564, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0368791185319424, + "post_vm_mv": -73.338981628418, + "pre_noise_rms_mv": 0.0398431569337845, + "pre_vm_mv": -73.1990432739258, + "slow_noise_rms_mv": 0.220605164766312, + "slow_vm_mv": -73.1990432739258, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.064995, + "stimulus_interval": 0.031, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 70, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.139938354492188, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[5]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338131, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338131, + "ephys_sweep_tags": [], + "id": 396323558, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0424865819513798, + "post_vm_mv": -73.4840774536133, + "pre_noise_rms_mv": 0.0386396385729313, + "pre_vm_mv": -73.3247375488281, + "slow_noise_rms_mv": 0.158759966492653, + "slow_vm_mv": -73.3247375488281, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.056995, + "stimulus_interval": 0.027, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 69, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.159339904785156, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[4]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338127, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338127, + "ephys_sweep_tags": [], + "id": 396323556, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0348531827330589, + "post_vm_mv": -73.8137969970703, + "pre_noise_rms_mv": 0.0357643850147724, + "pre_vm_mv": -73.6382293701172, + "slow_noise_rms_mv": 0.243798926472664, + "slow_vm_mv": -73.6382293701172, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.048995, + "stimulus_interval": 0.023, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 68, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.175567626953125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:18:36-08:00", + "description": "C2NSRMPRHE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305829, + "name": "Ramp to Rheobase", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305829, + "id": 324321519, + "updated_at": "2015-01-29T22:18:36-08:00" + }, + "ephys_stimulus_id": 324321519, + "ephys_sweep_tags": [], + "id": 396323540, + "leak_pa": -12.028151512146, + "num_spikes": 59, + "peak_deflection": null, + "post_noise_rms_mv": 0.0456047654151917, + "post_vm_mv": -74.8246002197266, + "pre_noise_rms_mv": 0.0413780510425568, + "pre_vm_mv": -73.5059814453125, + "slow_noise_rms_mv": 0.223160579800606, + "slow_vm_mv": -73.5059814453125, + "specimen_id": 318733871, + "stimulus_amplitude": 255.750004507505, + "stimulus_duration": 29.999975, + "stimulus_interval": 0.0, + "stimulus_start_time": 2.02002, + "stimulus_units": "Amps", + "sweep_number": 62, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 1.31861877441406, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:18:36-08:00", + "description": "C2NSRMPRHE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305829, + "name": "Ramp to Rheobase", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305829, + "id": 324321519, + "updated_at": "2015-01-29T22:18:36-08:00" + }, + "ephys_stimulus_id": 324321519, + "ephys_sweep_tags": [], + "id": 396323513, + "leak_pa": -14.9712104797363, + "num_spikes": 80, + "peak_deflection": null, + "post_noise_rms_mv": 0.0416221991181374, + "post_vm_mv": -74.8126831054688, + "pre_noise_rms_mv": 0.0385609716176987, + "pre_vm_mv": -72.8345184326172, + "slow_noise_rms_mv": 0.207559898495674, + "slow_vm_mv": -72.8345184326172, + "specimen_id": 318733871, + "stimulus_amplitude": 255.750004507505, + "stimulus_duration": 29.999975, + "stimulus_interval": 0.0, + "stimulus_start_time": 2.02002, + "stimulus_units": "Amps", + "sweep_number": 61, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 1.97816467285156, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.8, + "created_at": "2015-01-29T22:13:02-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324318810, + "updated_at": "2015-01-29T22:13:02-08:00" + }, + "ephys_stimulus_id": 324318810, + "ephys_sweep_tags": [], + "id": 396323510, + "leak_pa": -9.98080635070801, + "num_spikes": 16, + "peak_deflection": null, + "post_noise_rms_mv": 0.0378606133162975, + "post_vm_mv": -73.6508865356445, + "pre_noise_rms_mv": 0.0414417758584023, + "pre_vm_mv": -72.4496307373047, + "slow_noise_rms_mv": 0.236516460776329, + "slow_vm_mv": -72.4496307373047, + "specimen_id": 318733871, + "stimulus_amplitude": 180.000001015479, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 60, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 1.20125579833984, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:09-08:00", + "description": "C1RP25PR1S141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305749, + "name": "Ramp", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305749, + "id": 324305751, + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_id": 324305751, + "ephys_sweep_tags": [], + "id": 396323508, + "leak_pa": 0.0, + "num_spikes": 17, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0400054045021534, + "pre_vm_mv": -72.8523635864258, + "slow_noise_rms_mv": 0.152621924877167, + "slow_vm_mv": -72.8523635864258, + "specimen_id": 318733871, + "stimulus_amplitude": 800.000010681146, + "stimulus_duration": 31.997495, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.0225, + "stimulus_units": "Amps", + "sweep_number": 6, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.8, + "created_at": "2015-01-29T22:13:02-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324318810, + "updated_at": "2015-01-29T22:13:02-08:00" + }, + "ephys_stimulus_id": 324318810, + "ephys_sweep_tags": [], + "id": 396323506, + "leak_pa": -12.028151512146, + "num_spikes": 13, + "peak_deflection": null, + "post_noise_rms_mv": 0.0390940234065056, + "post_vm_mv": -73.9824295043945, + "pre_noise_rms_mv": 0.0369674041867256, + "pre_vm_mv": -73.267463684082, + "slow_noise_rms_mv": 0.177908077836037, + "slow_vm_mv": -73.267463684082, + "specimen_id": 318733871, + "stimulus_amplitude": 180.000001015479, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 59, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.7149658203125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.8, + "created_at": "2015-01-29T22:13:02-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324318810, + "updated_at": "2015-01-29T22:13:02-08:00" + }, + "ephys_stimulus_id": 324318810, + "ephys_sweep_tags": [], + "id": 396323504, + "leak_pa": -14.9712104797363, + "num_spikes": 14, + "peak_deflection": null, + "post_noise_rms_mv": 0.0380340926349163, + "post_vm_mv": -74.5748748779297, + "pre_noise_rms_mv": 0.0393643826246262, + "pre_vm_mv": -73.4411468505859, + "slow_noise_rms_mv": 0.236093729734421, + "slow_vm_mv": -73.4411468505859, + "specimen_id": 318733871, + "stimulus_amplitude": 180.000001015479, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 58, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 1.13372802734375, + "workflow_state": "auto_failed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.4, + "created_at": "2015-01-29T22:13:02-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324318800, + "updated_at": "2015-01-29T22:13:02-08:00" + }, + "ephys_stimulus_id": 324318800, + "ephys_sweep_tags": [], + "id": 396323501, + "leak_pa": -14.9712104797363, + "num_spikes": 7, + "peak_deflection": null, + "post_noise_rms_mv": 0.0387220717966557, + "post_vm_mv": -74.2508087158203, + "pre_noise_rms_mv": 0.0425904989242554, + "pre_vm_mv": -73.5337600708008, + "slow_noise_rms_mv": 0.274801641702652, + "slow_vm_mv": -73.5337600708008, + "specimen_id": 318733871, + "stimulus_amplitude": 139.999997705864, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 57, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.717048645019531, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.4, + "created_at": "2015-01-29T22:13:02-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324318800, + "updated_at": "2015-01-29T22:13:02-08:00" + }, + "ephys_stimulus_id": 324318800, + "ephys_sweep_tags": [], + "id": 396323497, + "leak_pa": -14.9712104797363, + "num_spikes": 7, + "peak_deflection": null, + "post_noise_rms_mv": 0.0402530431747437, + "post_vm_mv": -74.1909713745117, + "pre_noise_rms_mv": 0.0405836701393127, + "pre_vm_mv": -73.9143676757812, + "slow_noise_rms_mv": 0.143637120723724, + "slow_vm_mv": -73.9143676757812, + "specimen_id": 318733871, + "stimulus_amplitude": 139.999997705864, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 56, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.276603698730469, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.4, + "created_at": "2015-01-29T22:13:02-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324318800, + "updated_at": "2015-01-29T22:13:02-08:00" + }, + "ephys_stimulus_id": 324318800, + "ephys_sweep_tags": [], + "id": 396323494, + "leak_pa": -14.9712104797363, + "num_spikes": 6, + "peak_deflection": null, + "post_noise_rms_mv": 0.0446703843772411, + "post_vm_mv": -74.1566619873047, + "pre_noise_rms_mv": 0.0386499427258968, + "pre_vm_mv": -73.4279251098633, + "slow_noise_rms_mv": 0.285361737012863, + "slow_vm_mv": -73.4279251098633, + "specimen_id": 318733871, + "stimulus_amplitude": 139.999997705864, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 55, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.728736877441406, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:13:24-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324320270, + "updated_at": "2015-01-29T22:13:24-08:00" + }, + "ephys_stimulus_id": 324320270, + "ephys_sweep_tags": [], + "id": 396323492, + "leak_pa": -14.9712104797363, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0452239476144314, + "post_vm_mv": -73.4174270629883, + "pre_noise_rms_mv": 0.044888649135828, + "pre_vm_mv": -72.06005859375, + "slow_noise_rms_mv": 0.587946355342865, + "slow_vm_mv": -72.06005859375, + "specimen_id": 318733871, + "stimulus_amplitude": 100.000001335143, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 54, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.35736846923828, + "workflow_state": "auto_failed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:13:24-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324320270, + "updated_at": "2015-01-29T22:13:24-08:00" + }, + "ephys_stimulus_id": 324320270, + "ephys_sweep_tags": [], + "id": 396323490, + "leak_pa": -14.9712104797363, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.039005272090435, + "post_vm_mv": -73.7748794555664, + "pre_noise_rms_mv": 0.0346203036606312, + "pre_vm_mv": -73.50634765625, + "slow_noise_rms_mv": 0.164012134075165, + "slow_vm_mv": -73.50634765625, + "specimen_id": 318733871, + "stimulus_amplitude": 100.000001335143, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 53, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.268531799316406, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:13:24-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324320270, + "updated_at": "2015-01-29T22:13:24-08:00" + }, + "ephys_stimulus_id": 324320270, + "ephys_sweep_tags": [], + "id": 396323488, + "leak_pa": -14.9712104797363, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0385660864412785, + "post_vm_mv": -73.2594223022461, + "pre_noise_rms_mv": 0.0388743877410889, + "pre_vm_mv": -72.9849166870117, + "slow_noise_rms_mv": 0.202888786792755, + "slow_vm_mv": -72.9849166870117, + "specimen_id": 318733871, + "stimulus_amplitude": 100.000001335143, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 52, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.274505615234375, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:09-08:00", + "description": "C1RP25PR1S141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305749, + "name": "Ramp", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305749, + "id": 324305751, + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_id": 324305751, + "ephys_sweep_tags": [], + "id": 396323480, + "leak_pa": 0.0, + "num_spikes": 8, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0415542982518673, + "pre_vm_mv": -73.3303985595703, + "slow_noise_rms_mv": 0.0891085341572762, + "slow_vm_mv": -73.3303985595703, + "specimen_id": 318733871, + "stimulus_amplitude": 800.000010681146, + "stimulus_duration": 31.997495, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.0225, + "stimulus_units": "Amps", + "sweep_number": 5, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:03:09-08:00", + "description": "C1NSSEED_2141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305777, + "name": "Noise 2", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305777, + "id": 324312198, + "updated_at": "2015-01-29T22:03:09-08:00" + }, + "ephys_stimulus_id": 324312198, + "ephys_sweep_tags": [], + "id": 396323475, + "leak_pa": -12.028151512146, + "num_spikes": 23, + "peak_deflection": null, + "post_noise_rms_mv": 0.037276167422533, + "post_vm_mv": -74.3984375, + "pre_noise_rms_mv": 0.0387932918965816, + "pre_vm_mv": -73.5012130737305, + "slow_noise_rms_mv": 0.178911685943604, + "slow_vm_mv": -73.5012130737305, + "specimen_id": 318733871, + "stimulus_amplitude": 212.249995357183, + "stimulus_duration": 18.999995, + "stimulus_interval": 8.0, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 48, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.897224426269531, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:03:09-08:00", + "description": "C1NSSEED_1141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305771, + "name": "Noise 1", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305771, + "id": 324312194, + "updated_at": "2015-01-29T22:03:09-08:00" + }, + "ephys_stimulus_id": 324312194, + "ephys_sweep_tags": [], + "id": 396323471, + "leak_pa": -12.028151512146, + "num_spikes": 26, + "peak_deflection": null, + "post_noise_rms_mv": 0.0358653254806995, + "post_vm_mv": -73.3166122436523, + "pre_noise_rms_mv": 0.0393880866467953, + "pre_vm_mv": -72.8331680297852, + "slow_noise_rms_mv": 0.148469358682632, + "slow_vm_mv": -72.8331680297852, + "specimen_id": 318733871, + "stimulus_amplitude": 208.62500615948, + "stimulus_duration": 18.999995, + "stimulus_interval": 8.0, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 47, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.483444213867188, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:03:09-08:00", + "description": "C1NSSEED_2141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305777, + "name": "Noise 2", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305777, + "id": 324312198, + "updated_at": "2015-01-29T22:03:09-08:00" + }, + "ephys_stimulus_id": 324312198, + "ephys_sweep_tags": [], + "id": 396323468, + "leak_pa": -14.0115156173706, + "num_spikes": 25, + "peak_deflection": null, + "post_noise_rms_mv": 0.040932834148407, + "post_vm_mv": -74.2956924438477, + "pre_noise_rms_mv": 0.0322319604456425, + "pre_vm_mv": -72.9757995605469, + "slow_noise_rms_mv": 0.173675671219826, + "slow_vm_mv": -72.9757995605469, + "specimen_id": 318733871, + "stimulus_amplitude": 212.249995357183, + "stimulus_duration": 18.999995, + "stimulus_interval": 8.0, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 46, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.31989288330078, + "workflow_state": "auto_failed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:03:09-08:00", + "description": "C1NSSEED_1141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305771, + "name": "Noise 1", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305771, + "id": 324312194, + "updated_at": "2015-01-29T22:03:09-08:00" + }, + "ephys_stimulus_id": 324312194, + "ephys_sweep_tags": [], + "id": 396323466, + "leak_pa": -14.0115156173706, + "num_spikes": 23, + "peak_deflection": null, + "post_noise_rms_mv": 0.0391243994235992, + "post_vm_mv": -73.6055221557617, + "pre_noise_rms_mv": 0.0382960624992847, + "pre_vm_mv": -73.330451965332, + "slow_noise_rms_mv": 0.197248265147209, + "slow_vm_mv": -73.330451965332, + "specimen_id": 318733871, + "stimulus_amplitude": 208.62500615948, + "stimulus_duration": 18.999995, + "stimulus_interval": 8.0, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 45, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.275070190429688, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:03:09-08:00", + "description": "C1NSSEED_2141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305777, + "name": "Noise 2", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305777, + "id": 324312198, + "updated_at": "2015-01-29T22:03:09-08:00" + }, + "ephys_stimulus_id": 324312198, + "ephys_sweep_tags": [], + "id": 396323464, + "leak_pa": -14.0115156173706, + "num_spikes": 31, + "peak_deflection": null, + "post_noise_rms_mv": 0.0463137738406658, + "post_vm_mv": -72.9353485107422, + "pre_noise_rms_mv": 0.036839384585619, + "pre_vm_mv": -73.1283111572266, + "slow_noise_rms_mv": 0.166697889566422, + "slow_vm_mv": -73.1283111572266, + "specimen_id": 318733871, + "stimulus_amplitude": 212.249995357183, + "stimulus_duration": 18.999995, + "stimulus_interval": 8.0, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 44, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.192962646484375, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:03:09-08:00", + "description": "C1NSSEED_1141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305771, + "name": "Noise 1", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305771, + "id": 324312194, + "updated_at": "2015-01-29T22:03:09-08:00" + }, + "ephys_stimulus_id": 324312194, + "ephys_sweep_tags": [], + "id": 396323462, + "leak_pa": -14.0115156173706, + "num_spikes": 32, + "peak_deflection": null, + "post_noise_rms_mv": 0.0393371880054474, + "post_vm_mv": -73.7409057617188, + "pre_noise_rms_mv": 0.0401734113693237, + "pre_vm_mv": -73.3647308349609, + "slow_noise_rms_mv": 0.203217536211014, + "slow_vm_mv": -73.3647308349609, + "specimen_id": 318733871, + "stimulus_amplitude": 208.62500615948, + "stimulus_duration": 18.999995, + "stimulus_interval": 8.0, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 43, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.376174926757812, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:18:33-08:00", + "description": "C1LSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324321353, + "updated_at": "2015-01-29T22:18:33-08:00" + }, + "ephys_stimulus_id": 324321353, + "ephys_sweep_tags": [], + "id": 396323459, + "leak_pa": -12.028151512146, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0324449688196182, + "post_vm_mv": -72.5376968383789, + "pre_noise_rms_mv": 0.0383681282401085, + "pre_vm_mv": -72.81201171875, + "slow_noise_rms_mv": 0.204954192042351, + "slow_vm_mv": -72.81201171875, + "specimen_id": 318733871, + "stimulus_amplitude": 90.0000005077395, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 42, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.274314880371094, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:07-08:00", + "description": "C1LSCOARSE141203[13]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310907, + "updated_at": "2015-01-29T21:58:07-08:00" + }, + "ephys_stimulus_id": 324310907, + "ephys_sweep_tags": [], + "id": 396323441, + "leak_pa": -7.99744129180908, + "num_spikes": 18, + "peak_deflection": null, + "post_noise_rms_mv": 0.0342174433171749, + "post_vm_mv": -72.9227523803711, + "pre_noise_rms_mv": 0.0359137654304504, + "pre_vm_mv": -72.2949981689453, + "slow_noise_rms_mv": 0.146864429116249, + "slow_vm_mv": -72.2949981689453, + "specimen_id": 318733871, + "stimulus_amplitude": 149.999998533268, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 35, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.627754211425781, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:07-08:00", + "description": "C1LSCOARSE141203[12]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310903, + "updated_at": "2015-01-29T21:58:07-08:00" + }, + "ephys_stimulus_id": 324310903, + "ephys_sweep_tags": [], + "id": 396323439, + "leak_pa": -7.99744129180908, + "num_spikes": 14, + "peak_deflection": null, + "post_noise_rms_mv": 0.0305392686277628, + "post_vm_mv": -72.4750366210938, + "pre_noise_rms_mv": 0.04054119810462, + "pre_vm_mv": -72.5203247070312, + "slow_noise_rms_mv": 0.177269637584686, + "slow_vm_mv": -72.5203247070312, + "specimen_id": 318733871, + "stimulus_amplitude": 129.99999687846, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 34, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.0452880859375, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[11]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310899, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310899, + "ephys_sweep_tags": [], + "id": 396323437, + "leak_pa": -7.99744129180908, + "num_spikes": 10, + "peak_deflection": null, + "post_noise_rms_mv": 0.0409046038985252, + "post_vm_mv": -72.9968566894531, + "pre_noise_rms_mv": 0.0379738472402096, + "pre_vm_mv": -73.0722732543945, + "slow_noise_rms_mv": 0.136501178145409, + "slow_vm_mv": -73.0722732543945, + "specimen_id": 318733871, + "stimulus_amplitude": 110.000002162547, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 33, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.0754165649414062, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[10]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310891, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310891, + "ephys_sweep_tags": [], + "id": 396323435, + "leak_pa": -7.99744129180908, + "num_spikes": 4, + "peak_deflection": null, + "post_noise_rms_mv": 0.0394844189286232, + "post_vm_mv": -72.8281784057617, + "pre_noise_rms_mv": 0.0399150885641575, + "pre_vm_mv": -72.929557800293, + "slow_noise_rms_mv": 0.221334338188171, + "slow_vm_mv": -72.929557800293, + "specimen_id": 318733871, + "stimulus_amplitude": 90.0000005077395, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 32, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.10137939453125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[9]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310887, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310887, + "ephys_sweep_tags": [], + "id": 396323433, + "leak_pa": -4.990403175354, + "num_spikes": 2, + "peak_deflection": null, + "post_noise_rms_mv": 0.038056381046772, + "post_vm_mv": -71.3184967041016, + "pre_noise_rms_mv": 0.039063710719347, + "pre_vm_mv": -71.836311340332, + "slow_noise_rms_mv": 0.288136333227158, + "slow_vm_mv": -71.836311340332, + "specimen_id": 318733871, + "stimulus_amplitude": 69.9999988529321, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 31, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.517814636230469, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310797, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310797, + "ephys_sweep_tags": [], + "id": 396323380, + "leak_pa": -4.990403175354, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0418095923960209, + "post_vm_mv": -70.9423675537109, + "pre_noise_rms_mv": 0.0406226739287376, + "pre_vm_mv": -72.5032501220703, + "slow_noise_rms_mv": 0.300107926130295, + "slow_vm_mv": -72.5032501220703, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 20, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.56088256835938, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310797, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310797, + "ephys_sweep_tags": [], + "id": 396323375, + "leak_pa": -4.990403175354, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0419786125421524, + "post_vm_mv": -70.9460601806641, + "pre_noise_rms_mv": 0.0391221158206463, + "pre_vm_mv": -72.9047927856445, + "slow_noise_rms_mv": 0.138547375798225, + "slow_vm_mv": -72.9047927856445, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 19, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.95873260498047, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSCOARSE141203[5]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310725, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310725, + "ephys_sweep_tags": [], + "id": 396323356, + "leak_pa": -1.9833652973175, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0374195724725723, + "post_vm_mv": -71.2353363037109, + "pre_noise_rms_mv": 0.0365947894752026, + "pre_vm_mv": -72.5235977172852, + "slow_noise_rms_mv": 0.45252200961113, + "slow_vm_mv": -72.5235977172852, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 12, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.28826141357422, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.6, + "created_at": "2015-01-29T22:39:35-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324331247, + "updated_at": "2015-01-29T22:39:35-08:00" + }, + "ephys_stimulus_id": 324331247, + "ephys_sweep_tags": [], + "id": 396323338, + "leak_pa": -39.9872055053711, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0446453168988228, + "post_vm_mv": -79.0671920776367, + "pre_noise_rms_mv": 0.0347333513200283, + "pre_vm_mv": -80.5915985107422, + "slow_noise_rms_mv": 0.0647063180804253, + "slow_vm_mv": -80.5915985107422, + "specimen_id": 318733871, + "stimulus_amplitude": 659.999999097494, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 101, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.52440643310547, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.6, + "created_at": "2015-01-29T22:39:35-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324331247, + "updated_at": "2015-01-29T22:39:35-08:00" + }, + "ephys_stimulus_id": 324331247, + "ephys_sweep_tags": [], + "id": 396323336, + "leak_pa": -39.9872055053711, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0389018692076206, + "post_vm_mv": -79.1583862304688, + "pre_noise_rms_mv": 0.0407516062259674, + "pre_vm_mv": -80.5845718383789, + "slow_noise_rms_mv": 0.0986397936940193, + "slow_vm_mv": -80.5845718383789, + "specimen_id": 318733871, + "stimulus_amplitude": 659.999999097494, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 100, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.42618560791016, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:03:11-08:00", + "description": "C2SSHM80CS141203[6]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324312332, + "updated_at": "2015-01-29T22:03:11-08:00" + }, + "ephys_stimulus_id": 324312332, + "ephys_sweep_tags": [], + "id": 396323638, + "leak_pa": -38.0038414001465, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0389880537986755, + "post_vm_mv": -78.6123733520508, + "pre_noise_rms_mv": 0.0441122837364674, + "pre_vm_mv": -80.0253067016602, + "slow_noise_rms_mv": 0.094309464097023, + "slow_vm_mv": -80.0253067016602, + "specimen_id": 318733871, + "stimulus_amplitude": 700.000002407108, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 94, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.41293334960938, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:03:11-08:00", + "description": "C2SSHM80CS141203[5]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324312328, + "updated_at": "2015-01-29T22:03:11-08:00" + }, + "ephys_stimulus_id": 324312328, + "ephys_sweep_tags": [], + "id": 396323629, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0430155098438263, + "post_vm_mv": -79.0539321899414, + "pre_noise_rms_mv": 0.0329440385103226, + "pre_vm_mv": -80.0455932617188, + "slow_noise_rms_mv": 0.122686624526978, + "slow_vm_mv": -80.0455932617188, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 93, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.991661071777344, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:03:11-08:00", + "description": "C2SSHM80CS141203[4]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324312324, + "updated_at": "2015-01-29T22:03:11-08:00" + }, + "ephys_stimulus_id": 324312324, + "ephys_sweep_tags": [], + "id": 396323626, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0356684438884258, + "post_vm_mv": -79.3998413085938, + "pre_noise_rms_mv": 0.0402687676250935, + "pre_vm_mv": -80.3027191162109, + "slow_noise_rms_mv": 0.115302167832851, + "slow_vm_mv": -80.3027191162109, + "specimen_id": 318733871, + "stimulus_amplitude": 499.999985859034, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 92, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.902877807617188, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:03:11-08:00", + "description": "C2SSHM80CS141203[3]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324312320, + "updated_at": "2015-01-29T22:03:11-08:00" + }, + "ephys_stimulus_id": 324312320, + "ephys_sweep_tags": [], + "id": 396323622, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0391330868005753, + "post_vm_mv": -79.5965576171875, + "pre_noise_rms_mv": 0.0413624010980129, + "pre_vm_mv": -80.125602722168, + "slow_noise_rms_mv": 0.107317678630352, + "slow_vm_mv": -80.125602722168, + "specimen_id": 318733871, + "stimulus_amplitude": 400.000005340573, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 91, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.529045104980469, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:03:11-08:00", + "description": "C2SSHM80CS141203[2]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324312316, + "updated_at": "2015-01-29T22:03:11-08:00" + }, + "ephys_stimulus_id": 324312316, + "ephys_sweep_tags": [], + "id": 396323620, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0377324000000954, + "post_vm_mv": -79.911735534668, + "pre_noise_rms_mv": 0.0349041931331158, + "pre_vm_mv": -80.4060821533203, + "slow_noise_rms_mv": 0.0945140942931175, + "slow_vm_mv": -80.4060821533203, + "specimen_id": 318733871, + "stimulus_amplitude": 299.999997066536, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 90, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.494346618652344, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:07-08:00", + "description": "C1SSCOARSE141203[2]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310977, + "updated_at": "2015-01-29T21:58:07-08:00" + }, + "ephys_stimulus_id": 324310977, + "ephys_sweep_tags": [], + "id": 396323618, + "leak_pa": -1.9833652973175, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0408011488616467, + "post_vm_mv": -73.0553512573242, + "pre_noise_rms_mv": 0.0391559898853302, + "pre_vm_mv": -74.0001449584961, + "slow_noise_rms_mv": 0.120690539479256, + "slow_vm_mv": -74.0001449584961, + "specimen_id": 318733871, + "stimulus_amplitude": 299.999997066536, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 9, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.944793701171875, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:03:11-08:00", + "description": "C2SSHM80CS141203[1]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324312312, + "updated_at": "2015-01-29T22:03:11-08:00" + }, + "ephys_stimulus_id": 324312312, + "ephys_sweep_tags": [], + "id": 396323616, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0408409088850021, + "post_vm_mv": -80.1303558349609, + "pre_noise_rms_mv": 0.0355650298297405, + "pre_vm_mv": -80.3894729614258, + "slow_noise_rms_mv": 0.11452279984951, + "slow_vm_mv": -80.3894729614258, + "specimen_id": 318733871, + "stimulus_amplitude": 200.000002670286, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 89, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.259117126464844, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:03:11-08:00", + "description": "C2SSHM80CS141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324312308, + "updated_at": "2015-01-29T22:03:11-08:00" + }, + "ephys_stimulus_id": 324312308, + "ephys_sweep_tags": [], + "id": 396323614, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0406179688870907, + "post_vm_mv": -80.2863159179688, + "pre_noise_rms_mv": 0.0393210723996162, + "pre_vm_mv": -80.4844284057617, + "slow_noise_rms_mv": 0.0890119299292564, + "slow_vm_mv": -80.4844284057617, + "specimen_id": 318733871, + "stimulus_amplitude": 100.000001335143, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 88, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.198112487792969, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:07-08:00", + "description": "C1SSCOARSE141203[1]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310939, + "updated_at": "2015-01-29T21:58:07-08:00" + }, + "ephys_stimulus_id": 324310939, + "ephys_sweep_tags": [], + "id": 396323590, + "leak_pa": -1.9833652973175, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0383650623261929, + "post_vm_mv": -73.1851806640625, + "pre_noise_rms_mv": 0.0382653698325157, + "pre_vm_mv": -73.8074264526367, + "slow_noise_rms_mv": 0.151183858513832, + "slow_vm_mv": -73.8074264526367, + "specimen_id": 318733871, + "stimulus_amplitude": 200.000002670286, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 8, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.622245788574219, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1SSCOARSE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310895, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310895, + "ephys_sweep_tags": [], + "id": 396323561, + "leak_pa": -1.9833652973175, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0413788892328739, + "post_vm_mv": -73.5245513916016, + "pre_noise_rms_mv": 0.0370076186954975, + "pre_vm_mv": -73.7009048461914, + "slow_noise_rms_mv": 0.159169092774391, + "slow_vm_mv": -73.7009048461914, + "specimen_id": 318733871, + "stimulus_amplitude": 100.000001335143, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 7, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.176353454589844, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 0.9, + "created_at": "2015-01-29T22:03:10-08:00", + "description": "C2SQRHELNG141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305801, + "name": "Square - 2s Suprathreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305801, + "id": 324312282, + "updated_at": "2015-01-29T22:03:10-08:00" + }, + "ephys_stimulus_id": 324312282, + "ephys_sweep_tags": [], + "id": 396323484, + "leak_pa": -14.9712104797363, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0418485626578331, + "post_vm_mv": -72.9245529174805, + "pre_noise_rms_mv": 0.0361919216811657, + "pre_vm_mv": -73.2862548828125, + "slow_noise_rms_mv": 0.257177621126175, + "slow_vm_mv": -73.2862548828125, + "specimen_id": 318733871, + "stimulus_amplitude": 90.0000005077395, + "stimulus_duration": 1.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 51, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.361701965332031, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:10-08:00", + "description": "C1SQCAPCHK141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305793, + "name": "Square - 0.5ms Subthreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305793, + "id": 324305795, + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_id": 324305795, + "ephys_sweep_tags": [], + "id": 396323482, + "leak_pa": -12.9878444671631, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0411632247269154, + "post_vm_mv": -72.7104568481445, + "pre_noise_rms_mv": 0.0371528267860413, + "pre_vm_mv": -72.659553527832, + "slow_noise_rms_mv": 0.483349621295929, + "slow_vm_mv": -72.659553527832, + "specimen_id": 318733871, + "stimulus_amplitude": -200.000002670286, + "stimulus_duration": 7.218495, + "stimulus_interval": 0.2005, + "stimulus_start_time": 0.8215, + "stimulus_units": "Amps", + "sweep_number": 50, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.0509033203125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:10-08:00", + "description": "C1SQCAPCHK141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305793, + "name": "Square - 0.5ms Subthreshold", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305793, + "id": 324305795, + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_id": 324305795, + "ephys_sweep_tags": [], + "id": 396323478, + "leak_pa": -9.98080635070801, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0388185605406761, + "post_vm_mv": -72.0395355224609, + "pre_noise_rms_mv": 0.0417257361114025, + "pre_vm_mv": -72.4330215454102, + "slow_noise_rms_mv": 0.372666418552399, + "slow_vm_mv": -72.4330215454102, + "specimen_id": 318733871, + "stimulus_amplitude": -200.000002670286, + "stimulus_duration": 7.218495, + "stimulus_interval": 0.2005, + "stimulus_start_time": 0.8215, + "stimulus_units": "Amps", + "sweep_number": 49, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 0.393486022949219, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310797, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310797, + "ephys_sweep_tags": [], + "id": 396323371, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0344671793282032, + "post_vm_mv": -71.8193130493164, + "pre_noise_rms_mv": 0.0410925038158894, + "pre_vm_mv": -73.4055023193359, + "slow_noise_rms_mv": 0.126336947083473, + "slow_vm_mv": -73.4055023193359, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 18, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.58618927001953, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 5.9, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310793, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310793, + "ephys_sweep_tags": [], + "id": 396323364, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0410074442625046, + "post_vm_mv": -71.8181533813477, + "pre_noise_rms_mv": 0.0411656834185123, + "pre_vm_mv": -73.622314453125, + "slow_noise_rms_mv": 0.156922787427902, + "slow_vm_mv": -73.622314453125, + "specimen_id": 318733871, + "stimulus_amplitude": 589.999993305668, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 15, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.80416107177734, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 5.7, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310761, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310761, + "ephys_sweep_tags": [], + "id": 396323362, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0384085476398468, + "post_vm_mv": -72.1192779541016, + "pre_noise_rms_mv": 0.0402040779590607, + "pre_vm_mv": -73.5760116577148, + "slow_noise_rms_mv": 0.155263319611549, + "slow_vm_mv": -73.5760116577148, + "specimen_id": 318733871, + "stimulus_amplitude": 569.99999165086, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 14, + "updated_at": "2015-10-01T14:46:14-07:00", + "vm_delta_mv": 1.45673370361328, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 5.5, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310729, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310729, + "ephys_sweep_tags": [], + "id": 396323359, + "leak_pa": -1.9833652973175, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0412728488445282, + "post_vm_mv": -71.3994064331055, + "pre_noise_rms_mv": 0.0415022782981396, + "pre_vm_mv": -73.0148086547852, + "slow_noise_rms_mv": 0.316595315933228, + "slow_vm_mv": -73.0148086547852, + "specimen_id": 318733871, + "stimulus_amplitude": 549.999989996053, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 13, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.61540222167969, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSCOARSE141203[4]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310721, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310721, + "ephys_sweep_tags": [], + "id": 396323354, + "leak_pa": -1.9833652973175, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.036531925201416, + "post_vm_mv": -72.4496383666992, + "pre_noise_rms_mv": 0.0378439091145992, + "pre_vm_mv": -73.8205032348633, + "slow_noise_rms_mv": 0.171630755066872, + "slow_vm_mv": -73.8205032348633, + "specimen_id": 318733871, + "stimulus_amplitude": 499.999985859034, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 11, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.37086486816406, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 0.0, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:54:26-08:00", + "description": "EXTPBLWOUT141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305553, + "name": "Test", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305553, + "id": 324342566, + "updated_at": "2015-01-29T22:54:26-08:00" + }, + "ephys_stimulus_id": 324342566, + "ephys_sweep_tags": [], + "id": 396323352, + "leak_pa": 0.0, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.040760412812233, + "post_vm_mv": 3.6764862537384, + "pre_noise_rms_mv": 0.0346001163125038, + "pre_vm_mv": 3.61960768699646, + "slow_noise_rms_mv": 0.0639408603310585, + "slow_vm_mv": 3.61960768699646, + "specimen_id": 318733871, + "stimulus_amplitude": 0.0, + "stimulus_duration": 0.0, + "stimulus_interval": 0.0, + "stimulus_start_time": 0.0, + "stimulus_units": "Amps", + "sweep_number": 106, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.0568785667419434, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.6, + "created_at": "2015-01-29T22:39:35-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324331247, + "updated_at": "2015-01-29T22:39:35-08:00" + }, + "ephys_stimulus_id": 324331247, + "ephys_sweep_tags": [], + "id": 396323342, + "leak_pa": -39.9872055053711, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0422713197767735, + "post_vm_mv": -79.9530029296875, + "pre_noise_rms_mv": 0.0398413836956024, + "pre_vm_mv": -81.1040573120117, + "slow_noise_rms_mv": 0.0926332622766495, + "slow_vm_mv": -81.1040573120117, + "specimen_id": 318733871, + "stimulus_amplitude": 659.999999097494, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 103, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.15105438232422, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.6, + "created_at": "2015-01-29T22:39:35-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324331247, + "updated_at": "2015-01-29T22:39:35-08:00" + }, + "ephys_stimulus_id": 324331247, + "ephys_sweep_tags": [], + "id": 396323340, + "leak_pa": -39.9872055053711, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0415031537413597, + "post_vm_mv": -79.8756713867188, + "pre_noise_rms_mv": 0.0380181893706322, + "pre_vm_mv": -80.8639144897461, + "slow_noise_rms_mv": 0.10466530174017, + "slow_vm_mv": -80.8639144897461, + "specimen_id": 318733871, + "stimulus_amplitude": 659.999999097494, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 102, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.988243103027344, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSCOARSE141203[3]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310717, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310717, + "ephys_sweep_tags": [], + "id": 396323332, + "leak_pa": -1.9833652973175, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.039756141602993, + "post_vm_mv": -72.707145690918, + "pre_noise_rms_mv": 0.0399281866848469, + "pre_vm_mv": -73.8104858398438, + "slow_noise_rms_mv": 0.128612071275711, + "slow_vm_mv": -73.8104858398438, + "specimen_id": 318733871, + "stimulus_amplitude": 400.000005340573, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 10, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.10334014892578, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:06-08:00", + "ephys_stimulus": { + "amplitude": 6.6, + "created_at": "2015-01-29T22:39:35-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324331247, + "updated_at": "2015-01-29T22:39:35-08:00" + }, + "ephys_stimulus_id": 324331247, + "ephys_sweep_tags": [], + "id": 396323650, + "leak_pa": -39.9872055053711, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0323205776512623, + "post_vm_mv": -78.8193435668945, + "pre_noise_rms_mv": 0.0379347428679466, + "pre_vm_mv": -80.441047668457, + "slow_noise_rms_mv": 0.107122242450714, + "slow_vm_mv": -80.441047668457, + "specimen_id": 318733871, + "stimulus_amplitude": 659.999999097494, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 99, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.6217041015625, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:06-08:00", + "ephys_stimulus": { + "amplitude": 6.5, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324338195, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338195, + "ephys_sweep_tags": [], + "id": 396323647, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0388760976493359, + "post_vm_mv": -79.2106018066406, + "pre_noise_rms_mv": 0.0425901263952255, + "pre_vm_mv": -80.2001800537109, + "slow_noise_rms_mv": 0.0826516449451447, + "slow_vm_mv": -80.2001800537109, + "specimen_id": 318733871, + "stimulus_amplitude": 649.99999827009, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 98, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.989578247070312, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:06-08:00", + "ephys_stimulus": { + "amplitude": 6.6, + "created_at": "2015-01-29T22:39:35-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324331247, + "updated_at": "2015-01-29T22:39:35-08:00" + }, + "ephys_stimulus_id": 324331247, + "ephys_sweep_tags": [], + "id": 396323644, + "leak_pa": -38.0038414001465, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.044320821762085, + "post_vm_mv": -78.6921768188477, + "pre_noise_rms_mv": 0.041571956127882, + "pre_vm_mv": -80.1463775634766, + "slow_noise_rms_mv": 0.136154472827911, + "slow_vm_mv": -80.1463775634766, + "specimen_id": 318733871, + "stimulus_amplitude": 659.999999097494, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 97, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.45420074462891, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:06-08:00", + "ephys_stimulus": { + "amplitude": 6.7, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324338199, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338199, + "ephys_sweep_tags": [], + "id": 396323642, + "leak_pa": -38.0038414001465, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0409424975514412, + "post_vm_mv": -78.6946182250977, + "pre_noise_rms_mv": 0.0409116707742214, + "pre_vm_mv": -79.6254272460938, + "slow_noise_rms_mv": 0.874026298522949, + "slow_vm_mv": -79.6254272460938, + "specimen_id": 318733871, + "stimulus_amplitude": 669.999999924897, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 96, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.930809020996094, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:06-08:00", + "ephys_stimulus": { + "amplitude": 6.5, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSHM80FN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305569, + "name": "Short Square - Hold -80mV", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305569, + "id": 324338195, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338195, + "ephys_sweep_tags": [], + "id": 396323640, + "leak_pa": -38.0038414001465, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0357376858592033, + "post_vm_mv": -79.0951156616211, + "pre_noise_rms_mv": 0.0444186888635159, + "pre_vm_mv": -80.1246490478516, + "slow_noise_rms_mv": 0.110739670693874, + "slow_vm_mv": -80.1246490478516, + "specimen_id": 318733871, + "stimulus_amplitude": 649.99999827009, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 95, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.02953338623047, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:09-08:00", + "description": "C1RP25PR1S141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:09-08:00", + "id": 324305749, + "name": "Ramp", + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_type_id": 324305749, + "id": 324305751, + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_id": 324305751, + "ephys_sweep_tags": [], + "id": 396323452, + "leak_pa": 0.0, + "num_spikes": 9, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0401654802262783, + "pre_vm_mv": -73.7982177734375, + "slow_noise_rms_mv": 0.220393180847168, + "slow_vm_mv": -73.7982177734375, + "specimen_id": 318733871, + "stimulus_amplitude": 800.000010681146, + "stimulus_duration": 31.997495, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.0225, + "stimulus_units": "Amps", + "sweep_number": 4, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:07-08:00", + "description": "C1LSCOARSE141203[16]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310919, + "updated_at": "2015-01-29T21:58:07-08:00" + }, + "ephys_stimulus_id": 324310919, + "ephys_sweep_tags": [], + "id": 396323447, + "leak_pa": -7.99744129180908, + "num_spikes": 28, + "peak_deflection": null, + "post_noise_rms_mv": 0.0427638366818428, + "post_vm_mv": -73.8689270019531, + "pre_noise_rms_mv": 0.0446272566914558, + "pre_vm_mv": -72.5650634765625, + "slow_noise_rms_mv": 0.176345944404602, + "slow_vm_mv": -72.5650634765625, + "specimen_id": 318733871, + "stimulus_amplitude": 210.00000349769, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 38, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.30386352539062, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:07-08:00", + "description": "C1LSCOARSE141203[15]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310915, + "updated_at": "2015-01-29T21:58:07-08:00" + }, + "ephys_stimulus_id": 324310915, + "ephys_sweep_tags": [], + "id": 396323445, + "leak_pa": -7.99744129180908, + "num_spikes": 22, + "peak_deflection": null, + "post_noise_rms_mv": 0.0413710474967957, + "post_vm_mv": -72.8272399902344, + "pre_noise_rms_mv": 0.0437457673251629, + "pre_vm_mv": -71.9559326171875, + "slow_noise_rms_mv": 0.297846466302872, + "slow_vm_mv": -71.9559326171875, + "specimen_id": 318733871, + "stimulus_amplitude": 190.000001842883, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 37, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.871307373046875, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:07-08:00", + "description": "C1LSCOARSE141203[14]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310911, + "updated_at": "2015-01-29T21:58:07-08:00" + }, + "ephys_stimulus_id": 324310911, + "ephys_sweep_tags": [], + "id": 396323443, + "leak_pa": -7.99744129180908, + "num_spikes": 21, + "peak_deflection": null, + "post_noise_rms_mv": 0.0392543375492096, + "post_vm_mv": -72.5036392211914, + "pre_noise_rms_mv": 0.0393037050962448, + "pre_vm_mv": -72.1030654907227, + "slow_noise_rms_mv": 0.281521439552307, + "slow_vm_mv": -72.1030654907227, + "specimen_id": 318733871, + "stimulus_amplitude": 170.000000188075, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 36, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.40057373046875, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310797, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310797, + "ephys_sweep_tags": [], + "id": 396323368, + "leak_pa": -4.990403175354, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0358530394732952, + "post_vm_mv": -71.6928253173828, + "pre_noise_rms_mv": 0.0396796762943268, + "pre_vm_mv": -73.5050048828125, + "slow_noise_rms_mv": 0.135289296507835, + "slow_vm_mv": -73.5050048828125, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 17, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.81217956542969, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[6]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310837, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310837, + "ephys_sweep_tags": [], + "id": 396323401, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.046930156648159, + "post_vm_mv": -71.696891784668, + "pre_noise_rms_mv": 0.0421544797718525, + "pre_vm_mv": -72.1745986938477, + "slow_noise_rms_mv": 0.144713699817657, + "slow_vm_mv": -72.1745986938477, + "specimen_id": 318733871, + "stimulus_amplitude": 9.99999996004197, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 28, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.477706909179688, + "workflow_state": "manual_failed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[7]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310841, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310841, + "ephys_sweep_tags": [], + "id": 396323404, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0400526039302349, + "post_vm_mv": -71.804801940918, + "pre_noise_rms_mv": 0.036600898951292, + "pre_vm_mv": -71.5464630126953, + "slow_noise_rms_mv": 0.205636784434319, + "slow_vm_mv": -71.5464630126953, + "specimen_id": 318733871, + "stimulus_amplitude": 29.9999990127642, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 29, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.258338928222656, + "workflow_state": "manual_failed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[3]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338123, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338123, + "ephys_sweep_tags": [], + "id": 396323600, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.035027839243412, + "post_vm_mv": -73.2114715576172, + "pre_noise_rms_mv": 0.0415959544479847, + "pre_vm_mv": -73.2385482788086, + "slow_noise_rms_mv": 0.187070429325104, + "slow_vm_mv": -73.2385482788086, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.040995, + "stimulus_interval": 0.019, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 83, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0270767211914062, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[4]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338127, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338127, + "ephys_sweep_tags": [], + "id": 396323604, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0420295111835003, + "post_vm_mv": -74.1104354858398, + "pre_noise_rms_mv": 0.0353056378662586, + "pre_vm_mv": -73.7717056274414, + "slow_noise_rms_mv": 0.246308460831642, + "slow_vm_mv": -73.7717056274414, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.048995, + "stimulus_interval": 0.023, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 84, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.338729858398438, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 0.0, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:07-08:00", + "description": "EXTPSMOKET141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305553, + "name": "Test", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305553, + "id": 324305555, + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_id": 324305555, + "ephys_sweep_tags": [], + "id": 396323328, + "leak_pa": 0.0, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0, + "pre_vm_mv": 0.0, + "slow_noise_rms_mv": 0.0, + "slow_vm_mv": 0.0, + "specimen_id": 318733871, + "stimulus_amplitude": 9.99999977648258, + "stimulus_duration": 0.069995, + "stimulus_interval": 0.05, + "stimulus_start_time": 0.03, + "stimulus_units": "Volts", + "sweep_number": 0, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "unknown" + }, + { + "bridge_balance_mohm": 0.0, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:07-08:00", + "description": "EXTPINBATH141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305553, + "name": "Test", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305553, + "id": 324305559, + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_id": 324305559, + "ephys_sweep_tags": [], + "id": 396323330, + "leak_pa": 0.0, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0, + "pre_vm_mv": 0.0, + "slow_noise_rms_mv": 0.0, + "slow_vm_mv": 0.0, + "specimen_id": 318733871, + "stimulus_amplitude": 9.99999977648258, + "stimulus_duration": 0.069995, + "stimulus_interval": 0.05, + "stimulus_start_time": 0.03, + "stimulus_units": "Volts", + "sweep_number": 1, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "unknown" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:08-08:00", + "description": "EXTPEXPEND141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305553, + "name": "Test", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305553, + "id": 324305637, + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_id": 324305637, + "ephys_sweep_tags": [], + "id": 396323346, + "leak_pa": -39.9872055053711, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0, + "pre_vm_mv": 0.0, + "slow_noise_rms_mv": 0.0, + "slow_vm_mv": 0.0, + "specimen_id": 318733871, + "stimulus_amplitude": 9.99999977648258, + "stimulus_duration": 0.069995, + "stimulus_interval": 0.05, + "stimulus_start_time": 0.03, + "stimulus_units": "Volts", + "sweep_number": 104, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "unknown" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:08-08:00", + "description": "EXTPGGAEND141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305553, + "name": "Test", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305553, + "id": 324305641, + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_id": 324305641, + "ephys_sweep_tags": [], + "id": 396323350, + "leak_pa": -39.9872055053711, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0, + "pre_vm_mv": 0.0, + "slow_noise_rms_mv": 0.0, + "slow_vm_mv": 0.0, + "specimen_id": 318733871, + "stimulus_amplitude": 9.99999977648258, + "stimulus_duration": 0.069995, + "stimulus_interval": 0.05, + "stimulus_start_time": 0.03, + "stimulus_units": "Volts", + "sweep_number": 105, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "unknown" + }, + { + "bridge_balance_mohm": 0.0, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:09-08:00", + "description": "EXTPBREAKN141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305553, + "name": "Test", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305553, + "id": 324305705, + "updated_at": "2015-01-29T21:33:09-08:00" + }, + "ephys_stimulus_id": 324305705, + "ephys_sweep_tags": [], + "id": 396323406, + "leak_pa": 0.0, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0, + "pre_vm_mv": 0.0, + "slow_noise_rms_mv": 0.0, + "slow_vm_mv": 0.0, + "specimen_id": 318733871, + "stimulus_amplitude": 9.99999977648258, + "stimulus_duration": 0.069995, + "stimulus_interval": 0.05, + "stimulus_start_time": 0.03, + "stimulus_units": "Volts", + "sweep_number": 3, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "unknown" + }, + { + "bridge_balance_mohm": 0.0, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:33:08-08:00", + "description": "EXTPCllATT141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305553, + "name": "Test", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305553, + "id": 324305665, + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_id": 324305665, + "ephys_sweep_tags": [], + "id": 396323378, + "leak_pa": 0.0, + "num_spikes": 0, + "peak_deflection": null, + "post_noise_rms_mv": 0.0, + "post_vm_mv": 0.0, + "pre_noise_rms_mv": 0.0, + "pre_vm_mv": 0.0, + "slow_noise_rms_mv": 0.0, + "slow_vm_mv": 0.0, + "specimen_id": 318733871, + "stimulus_amplitude": 9.99999977648258, + "stimulus_duration": 0.069995, + "stimulus_interval": 0.05, + "stimulus_start_time": 0.03, + "stimulus_units": "Volts", + "sweep_number": 2, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0, + "workflow_state": "unknown" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[7]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338141, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338141, + "ephys_sweep_tags": [], + "id": 396323587, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0352929159998894, + "post_vm_mv": -73.169921875, + "pre_noise_rms_mv": 0.0338610708713531, + "pre_vm_mv": -73.5805969238281, + "slow_noise_rms_mv": 0.198360458016396, + "slow_vm_mv": -73.5805969238281, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.072995, + "stimulus_interval": 0.035, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 79, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.410675048828125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:15-08:00", + "description": "C2SSTRIPLE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338111, + "updated_at": "2015-01-29T22:53:15-08:00" + }, + "ephys_stimulus_id": 324338111, + "ephys_sweep_tags": [], + "id": 396323592, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0363268032670021, + "post_vm_mv": -73.3690032958984, + "pre_noise_rms_mv": 0.0389319099485874, + "pre_vm_mv": -73.3859329223633, + "slow_noise_rms_mv": 0.242742508649826, + "slow_vm_mv": -73.3859329223633, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.016995, + "stimulus_interval": 0.007, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 80, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.0169296264648438, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[1]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338115, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338115, + "ephys_sweep_tags": [], + "id": 396323594, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0395385921001434, + "post_vm_mv": -73.3211059570312, + "pre_noise_rms_mv": 0.043050542473793, + "pre_vm_mv": -73.5779342651367, + "slow_noise_rms_mv": 0.205265551805496, + "slow_vm_mv": -73.5779342651367, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.024995, + "stimulus_interval": 0.011, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 81, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.256828308105469, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:05-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[2]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338119, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338119, + "ephys_sweep_tags": [], + "id": 396323597, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0375289209187031, + "post_vm_mv": -73.3284530639648, + "pre_noise_rms_mv": 0.0366559848189354, + "pre_vm_mv": -73.0539169311523, + "slow_noise_rms_mv": 0.326934158802032, + "slow_vm_mv": -73.0539169311523, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.032995, + "stimulus_interval": 0.015, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 82, + "updated_at": "2015-10-01T14:46:15-07:00", + "vm_delta_mv": 0.2745361328125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[5]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310833, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310833, + "ephys_sweep_tags": [], + "id": 396323397, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": -76.34375, + "post_noise_rms_mv": 0.0391541942954063, + "post_vm_mv": -72.0367660522461, + "pre_noise_rms_mv": 0.0414051413536072, + "pre_vm_mv": -71.9976196289062, + "slow_noise_rms_mv": 0.180227696895599, + "slow_vm_mv": -71.9976196289062, + "specimen_id": 318733871, + "stimulus_amplitude": -9.99999996004197, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 27, + "updated_at": "2015-07-08T05:57:52-07:00", + "vm_delta_mv": 0.0391464233398438, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[8]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310847, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310847, + "ephys_sweep_tags": [], + "id": 396323408, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": -48.09375, + "post_noise_rms_mv": 0.043704766780138, + "post_vm_mv": -71.5417327880859, + "pre_noise_rms_mv": 0.0406602211296558, + "pre_vm_mv": -71.6712112426758, + "slow_noise_rms_mv": 0.288515567779541, + "slow_vm_mv": -71.6712112426758, + "specimen_id": 318733871, + "stimulus_amplitude": 50.0000006675716, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 30, + "updated_at": "2015-07-08T05:57:52-07:00", + "vm_delta_mv": 0.129478454589844, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.8, + "created_at": "2015-01-29T22:18:33-08:00", + "description": "C1LSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324321357, + "updated_at": "2015-01-29T22:18:33-08:00" + }, + "ephys_stimulus_id": 324321357, + "ephys_sweep_tags": [], + "id": 396323456, + "leak_pa": -12.028151512146, + "num_spikes": 0, + "peak_deflection": -44.28125, + "post_noise_rms_mv": 0.0415375158190727, + "post_vm_mv": -72.9263229370117, + "pre_noise_rms_mv": 0.0367179661989212, + "pre_vm_mv": -73.3893051147461, + "slow_noise_rms_mv": 0.140569120645523, + "slow_vm_mv": -73.3893051147461, + "specimen_id": 318733871, + "stimulus_amplitude": 79.9999996803358, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 41, + "updated_at": "2015-07-08T05:57:52-07:00", + "vm_delta_mv": 0.462982177734375, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[3]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310825, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310825, + "ephys_sweep_tags": [], + "id": 396323392, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": -89.53125, + "post_noise_rms_mv": 0.0390310399234295, + "post_vm_mv": -73.2279891967773, + "pre_noise_rms_mv": 0.0365938991308212, + "pre_vm_mv": -73.35302734375, + "slow_noise_rms_mv": 0.156366005539894, + "slow_vm_mv": -73.35302734375, + "specimen_id": 318733871, + "stimulus_amplitude": -50.0000006675716, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 25, + "updated_at": "2015-07-08T05:57:54-07:00", + "vm_delta_mv": 0.125038146972656, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.7, + "created_at": "2015-01-29T22:18:33-08:00", + "description": "C1LSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324321349, + "updated_at": "2015-01-29T22:18:33-08:00" + }, + "ephys_stimulus_id": 324321349, + "ephys_sweep_tags": [], + "id": 396323454, + "leak_pa": -12.028151512146, + "num_spikes": 0, + "peak_deflection": -48.90625, + "post_noise_rms_mv": 0.0441768728196621, + "post_vm_mv": -73.1199493408203, + "pre_noise_rms_mv": 0.0386229529976845, + "pre_vm_mv": -72.9328842163086, + "slow_noise_rms_mv": 0.16550201177597, + "slow_vm_mv": -72.9328842163086, + "specimen_id": 318733871, + "stimulus_amplitude": 69.9999988529321, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 40, + "updated_at": "2015-07-08T05:57:54-07:00", + "vm_delta_mv": 0.187065124511719, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[4]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310829, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310829, + "ephys_sweep_tags": [], + "id": 396323394, + "leak_pa": -4.990403175354, + "num_spikes": 0, + "peak_deflection": -83.34375, + "post_noise_rms_mv": 0.0405874624848366, + "post_vm_mv": -72.389518737793, + "pre_noise_rms_mv": 0.0415650308132172, + "pre_vm_mv": -72.2010955810547, + "slow_noise_rms_mv": 0.131545454263687, + "slow_vm_mv": -72.2010955810547, + "specimen_id": 318733871, + "stimulus_amplitude": -29.9999990127642, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 26, + "updated_at": "2015-07-08T05:57:52-07:00", + "vm_delta_mv": 0.188423156738281, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T22:18:36-08:00", + "description": "C2NSRMPRHE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305829, + "name": "Ramp to Rheobase", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305829, + "id": 324321519, + "updated_at": "2015-01-29T22:18:36-08:00" + }, + "ephys_stimulus_id": 324321519, + "ephys_sweep_tags": [], + "id": 396323542, + "leak_pa": -9.98080635070801, + "num_spikes": 57, + "peak_deflection": null, + "post_noise_rms_mv": 0.0380563996732235, + "post_vm_mv": -75.0327987670898, + "pre_noise_rms_mv": 0.0397848822176456, + "pre_vm_mv": -73.5854339599609, + "slow_noise_rms_mv": 0.180791780352592, + "slow_vm_mv": -73.5854339599609, + "specimen_id": 318733871, + "stimulus_amplitude": 255.750004507505, + "stimulus_duration": 29.999975, + "stimulus_interval": 0.0, + "stimulus_start_time": 2.02002, + "stimulus_units": "Amps", + "sweep_number": 63, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.44736480712891, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:15-08:00", + "description": "C2SSTRIPLE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338111, + "updated_at": "2015-01-29T22:53:15-08:00" + }, + "ephys_stimulus_id": 324338111, + "ephys_sweep_tags": [], + "id": 396323544, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.037385605275631, + "post_vm_mv": -73.5233383178711, + "pre_noise_rms_mv": 0.0444515310227871, + "pre_vm_mv": -73.5065689086914, + "slow_noise_rms_mv": 0.173128440976143, + "slow_vm_mv": -73.5065689086914, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.016995, + "stimulus_interval": 0.007, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 64, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.0167694091796875, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[1]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338115, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338115, + "ephys_sweep_tags": [], + "id": 396323548, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0440761931240559, + "post_vm_mv": -73.6457672119141, + "pre_noise_rms_mv": 0.0434141494333744, + "pre_vm_mv": -73.6492462158203, + "slow_noise_rms_mv": 0.180153012275696, + "slow_vm_mv": -73.6492462158203, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.024995, + "stimulus_interval": 0.011, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 65, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.00347900390625, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[2]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338119, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338119, + "ephys_sweep_tags": [], + "id": 396323552, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0393132194876671, + "post_vm_mv": -73.7283935546875, + "pre_noise_rms_mv": 0.0338524095714092, + "pre_vm_mv": -73.6042861938477, + "slow_noise_rms_mv": 0.159617558121681, + "slow_vm_mv": -73.6042861938477, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.032995, + "stimulus_interval": 0.015, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 66, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.124107360839844, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:04-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T22:53:16-08:00", + "description": "C2SSTRIPLE141203[3]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:10-08:00", + "id": 324305839, + "name": "Short Square - Triple", + "updated_at": "2015-01-29T21:33:10-08:00" + }, + "ephys_stimulus_type_id": 324305839, + "id": 324338123, + "updated_at": "2015-01-29T22:53:16-08:00" + }, + "ephys_stimulus_id": 324338123, + "ephys_sweep_tags": [], + "id": 396323554, + "leak_pa": -9.98080635070801, + "num_spikes": 3, + "peak_deflection": null, + "post_noise_rms_mv": 0.0420318059623241, + "post_vm_mv": -73.6357803344727, + "pre_noise_rms_mv": 0.0342406034469604, + "pre_vm_mv": -73.4720077514648, + "slow_noise_rms_mv": 0.228944271802902, + "slow_vm_mv": -73.4720077514648, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.040995, + "stimulus_interval": 0.019, + "stimulus_start_time": 2.02, + "stimulus_units": "Amps", + "sweep_number": 67, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.163772583007812, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310797, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310797, + "ephys_sweep_tags": [], + "id": 396323382, + "leak_pa": -4.990403175354, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0378184206783772, + "post_vm_mv": -70.87744140625, + "pre_noise_rms_mv": 0.0403490774333477, + "pre_vm_mv": -72.5947113037109, + "slow_noise_rms_mv": 0.153314620256424, + "slow_vm_mv": -72.5947113037109, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 21, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.71726989746094, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 6.0, + "created_at": "2015-01-29T21:58:05-08:00", + "description": "C1SSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:07-08:00", + "id": 324305563, + "name": "Short Square", + "updated_at": "2015-01-29T21:33:07-08:00" + }, + "ephys_stimulus_type_id": 324305563, + "id": 324310797, + "updated_at": "2015-01-29T21:58:05-08:00" + }, + "ephys_stimulus_id": 324310797, + "ephys_sweep_tags": [], + "id": 396323366, + "leak_pa": -4.990403175354, + "num_spikes": 1, + "peak_deflection": null, + "post_noise_rms_mv": 0.0432348102331161, + "post_vm_mv": -71.8769836425781, + "pre_noise_rms_mv": 0.0401340462267399, + "pre_vm_mv": -73.5547409057617, + "slow_noise_rms_mv": 0.11938589066267, + "slow_vm_mv": -73.5547409057617, + "specimen_id": 318733871, + "stimulus_amplitude": 599.999994133071, + "stimulus_duration": 0.002995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 16, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 1.67775726318359, + "workflow_state": "manual_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[2]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310821, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310821, + "ephys_sweep_tags": [], + "id": 396323390, + "leak_pa": -6.97376823425293, + "num_spikes": 0, + "peak_deflection": -93.40625, + "post_noise_rms_mv": 0.0433307066559792, + "post_vm_mv": -73.8148193359375, + "pre_noise_rms_mv": 0.0394219271838665, + "pre_vm_mv": -73.3753662109375, + "slow_noise_rms_mv": 0.185792118310928, + "slow_vm_mv": -73.3753662109375, + "specimen_id": 318733871, + "stimulus_amplitude": -69.9999988529321, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 24, + "updated_at": "2015-07-08T05:57:54-07:00", + "vm_delta_mv": 0.439453125, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:03-08:00", + "ephys_stimulus": { + "amplitude": 0.6, + "created_at": "2015-01-29T22:13:04-08:00", + "description": "C1LSFINEST141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324318916, + "updated_at": "2015-01-29T22:13:04-08:00" + }, + "ephys_stimulus_id": 324318916, + "ephys_sweep_tags": [], + "id": 396323449, + "leak_pa": -7.99744129180908, + "num_spikes": 0, + "peak_deflection": -51.7187538146973, + "post_noise_rms_mv": 0.0381619110703468, + "post_vm_mv": -72.2404022216797, + "pre_noise_rms_mv": 0.0412812754511833, + "pre_vm_mv": -72.1742477416992, + "slow_noise_rms_mv": 0.184022128582001, + "slow_vm_mv": -72.1742477416992, + "specimen_id": 318733871, + "stimulus_amplitude": 59.9999980255284, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 39, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.0661544799804688, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[1]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310817, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310817, + "ephys_sweep_tags": [], + "id": 396323388, + "leak_pa": -6.97376823425293, + "num_spikes": 0, + "peak_deflection": -96.9687576293945, + "post_noise_rms_mv": 0.0375870503485203, + "post_vm_mv": -73.6441040039062, + "pre_noise_rms_mv": 0.0391277000308037, + "pre_vm_mv": -73.8342666625977, + "slow_noise_rms_mv": 0.149396568536758, + "slow_vm_mv": -73.8342666625977, + "specimen_id": 318733871, + "stimulus_amplitude": -90.0000005077395, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 23, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.190162658691406, + "workflow_state": "auto_passed" + }, + { + "bridge_balance_mohm": 14.224663734436, + "created_at": "2015-03-02T15:04:02-08:00", + "ephys_stimulus": { + "amplitude": 1.0, + "created_at": "2015-01-29T21:58:06-08:00", + "description": "C1LSCOARSE141203[0]", + "ephys_stimulus_type": { + "created_at": "2015-01-29T21:33:08-08:00", + "id": 324305675, + "name": "Long Square", + "updated_at": "2015-01-29T21:33:08-08:00" + }, + "ephys_stimulus_type_id": 324305675, + "id": 324310813, + "updated_at": "2015-01-29T21:58:06-08:00" + }, + "ephys_stimulus_id": 324310813, + "ephys_sweep_tags": [], + "id": 396323384, + "leak_pa": -6.97376823425293, + "num_spikes": 0, + "peak_deflection": -100.156257629395, + "post_noise_rms_mv": 0.0376262404024601, + "post_vm_mv": -74.3083114624023, + "pre_noise_rms_mv": 0.0403164774179459, + "pre_vm_mv": -73.7102813720703, + "slow_noise_rms_mv": 0.212610512971878, + "slow_vm_mv": -73.7102813720703, + "specimen_id": 318733871, + "stimulus_amplitude": -110.000002162547, + "stimulus_duration": 0.999995, + "stimulus_interval": 0.0, + "stimulus_start_time": 1.02, + "stimulus_units": "Amps", + "sweep_number": 22, + "updated_at": "2015-10-01T14:46:13-07:00", + "vm_delta_mv": 0.598030090332031, + "workflow_state": "auto_passed" + } + ], + "external_specimen_name": null, + "facs_well_id": null, + "frozen_at": null, + "hemisphere_id": 2, + "histology_well_name": null, + "id": 318733871, + "location_id": null, + "name": "Nr5a1-Cre;Ai14-169248.04.02.01", + "neuron_reconstructions": [ + { + "average_bifurcation_angle_local": 82.2651, + "average_bifurcation_angle_remote": 80.9024, + "average_contraction": 0.891136, + "average_diameter": 0.424899, + "average_fragmentation": 38.9318, + "average_parent_daughter_ratio": 0.828312, + "created_at": "2015-02-06T11:08:53-08:00", + "hausdorff_dimension": 1.17512, + "id": 326737179, + "manual": true, + "max_branch_order": 8, + "max_euclidean_distance": 411.175, + "max_path_distance": 482.472, + "nodes_over_branches": 39.955, + "number_bifurcations": 20, + "number_branches": 44, + "number_nodes": 1758, + "number_stems": 6, + "number_tips": 25, + "overall_depth": 103.41, + "overall_height": 463.378, + "overall_width": 246.074, + "scale_factor_x": 0.1144, + "scale_factor_y": 0.1144, + "scale_factor_z": 0.28, + "soma_surface": 610.486, + "specimen_id": 318733871, + "superseded": true, + "total_length": 2159.88, + "total_surface": 2869.99, + "total_volume": 363.123, + "updated_at": "2015-02-12T10:50:05-08:00", + "user_id": 250, + "well_known_files": [ + { + "attachable_id": 326737179, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-02-06T11:08:54-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_326737179_m.swc", + "id": 326737181, + "published_at": null, + "size": 74992, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2015-02-06T11:08:54-08:00", + "well_known_file_type": { + "created_at": "2014-05-16T12:29:39-07:00", + "id": 303941301, + "name": "3DNeuronReconstruction", + "updated_at": "2014-05-16T12:29:39-07:00" + }, + "well_known_file_type_id": 303941301, + "workflow_state": null + } + ] + }, + { + "average_bifurcation_angle_local": 85.3917, + "average_bifurcation_angle_remote": 98.8257, + "average_contraction": 0.73481, + "average_diameter": 0.359785, + "average_fragmentation": 18.9057, + "average_parent_daughter_ratio": 1.06767, + "created_at": "2015-01-29T20:23:08-08:00", + "hausdorff_dimension": 1.21225, + "id": 324291233, + "manual": false, + "max_branch_order": 9, + "max_euclidean_distance": 176.473, + "max_path_distance": 194.904, + "nodes_over_branches": 19.9245283018868, + "number_bifurcations": 25, + "number_branches": 53, + "number_nodes": 1056, + "number_stems": 5, + "number_tips": 29, + "overall_depth": 40.2531, + "overall_height": 153.476, + "overall_width": 206.151, + "scale_factor_x": 0.1144, + "scale_factor_y": 0.1144, + "scale_factor_z": 0.28, + "soma_surface": 332.412, + "specimen_id": 318733871, + "superseded": true, + "total_length": 1363.13, + "total_surface": 1542.32, + "total_volume": 168.265, + "updated_at": "2015-02-06T11:08:48-08:00", + "user_id": null, + "well_known_files": [ + { + "attachable_id": 324291233, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-01-29T20:23:09-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_324291233_m.swc", + "id": 324291238, + "published_at": null, + "size": 44867, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2015-01-29T20:23:09-08:00", + "well_known_file_type": { + "created_at": "2014-05-16T12:29:39-07:00", + "id": 303941301, + "name": "3DNeuronReconstruction", + "updated_at": "2014-05-16T12:29:39-07:00" + }, + "well_known_file_type_id": 303941301, + "workflow_state": null + } + ] + }, + { + "average_bifurcation_angle_local": 0.0, + "average_bifurcation_angle_remote": 0.0, + "average_contraction": 0.993603, + "average_diameter": 0.394682, + "average_fragmentation": 1.0, + "average_parent_daughter_ratio": 0.122453, + "created_at": "2015-02-06T11:08:48-08:00", + "hausdorff_dimension": 1.14685, + "id": 326737168, + "manual": true, + "max_branch_order": 1, + "max_euclidean_distance": 173.051, + "max_path_distance": 7.13842, + "nodes_over_branches": 508.0, + "number_bifurcations": 0, + "number_branches": 1, + "number_nodes": 508, + "number_stems": 1, + "number_tips": 19, + "overall_depth": 40.32, + "overall_height": 187.387, + "overall_width": 136.524, + "scale_factor_x": 0.1144, + "scale_factor_y": 0.1144, + "scale_factor_z": 0.28, + "soma_surface": 610.486, + "specimen_id": 318733871, + "superseded": true, + "total_length": 649.368, + "total_surface": 839.568, + "total_volume": 109.605, + "updated_at": "2015-02-06T11:17:55-08:00", + "user_id": 250, + "well_known_files": [ + { + "attachable_id": 326737168, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-02-06T11:08:48-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_326737168_m.swc", + "id": 326737170, + "published_at": null, + "size": 21450, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2015-02-06T11:08:48-08:00", + "well_known_file_type": { + "created_at": "2014-05-16T12:29:39-07:00", + "id": 303941301, + "name": "3DNeuronReconstruction", + "updated_at": "2014-05-16T12:29:39-07:00" + }, + "well_known_file_type_id": 303941301, + "workflow_state": null + } + ] + }, + { + "average_bifurcation_angle_local": 85.3913, + "average_bifurcation_angle_remote": 98.8256, + "average_contraction": 0.73481, + "average_diameter": 0.359784, + "average_fragmentation": 18.9057, + "average_parent_daughter_ratio": 1.06765, + "created_at": "2015-02-12T10:50:05-08:00", + "hausdorff_dimension": 1.21225, + "id": 328874691, + "manual": true, + "max_branch_order": 9, + "max_euclidean_distance": 176.473, + "max_path_distance": 194.904, + "nodes_over_branches": 19.9245283018868, + "number_bifurcations": 25, + "number_branches": 53, + "number_nodes": 1056, + "number_stems": 5, + "number_tips": 29, + "overall_depth": 40.2531, + "overall_height": 153.476, + "overall_width": 206.151, + "scale_factor_x": 0.1144, + "scale_factor_y": 0.1144, + "scale_factor_z": 0.28, + "soma_surface": 332.412, + "specimen_id": 318733871, + "superseded": true, + "total_length": 1363.12, + "total_surface": 1542.32, + "total_volume": 168.265, + "updated_at": "2015-02-12T11:10:10-08:00", + "user_id": 250, + "well_known_files": [ + { + "attachable_id": 328874691, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-02-12T10:50:06-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_328874691_m.swc", + "id": 328874693, + "published_at": null, + "size": 44831, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2015-02-12T10:50:06-08:00", + "well_known_file_type": { + "created_at": "2014-05-16T12:29:39-07:00", + "id": 303941301, + "name": "3DNeuronReconstruction", + "updated_at": "2014-05-16T12:29:39-07:00" + }, + "well_known_file_type_id": 303941301, + "workflow_state": null + } + ] + }, + { + "average_bifurcation_angle_local": 72.8762, + "average_bifurcation_angle_remote": 79.2273, + "average_contraction": 0.869187, + "average_diameter": 0.383292, + "average_fragmentation": 40.4, + "average_parent_daughter_ratio": 0.995908, + "created_at": "2015-02-12T10:50:17-08:00", + "hausdorff_dimension": 1.13073, + "id": 328874724, + "manual": true, + "max_branch_order": 6, + "max_euclidean_distance": 267.871, + "max_path_distance": 285.128, + "nodes_over_branches": 41.425, + "number_bifurcations": 17, + "number_branches": 40, + "number_nodes": 1657, + "number_stems": 8, + "number_tips": 24, + "overall_depth": 60.5338, + "overall_height": 280.407, + "overall_width": 307.497, + "scale_factor_x": 0.1144, + "scale_factor_y": 0.1144, + "scale_factor_z": 0.28, + "soma_surface": 332.412, + "specimen_id": 318733871, + "superseded": true, + "total_length": 1983.17, + "total_surface": 2399.98, + "total_volume": 270.642, + "updated_at": "2015-03-09T16:36:48-07:00", + "user_id": 250, + "well_known_files": [ + { + "attachable_id": 328874724, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-02-12T10:50:17-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_328874724_m.swc", + "id": 328874726, + "published_at": null, + "size": 70938, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2015-02-12T10:50:17-08:00", + "well_known_file_type": { + "created_at": "2014-05-16T12:29:39-07:00", + "id": 303941301, + "name": "3DNeuronReconstruction", + "updated_at": "2014-05-16T12:29:39-07:00" + }, + "well_known_file_type_id": 303941301, + "workflow_state": null + } + ] + }, + { + "average_bifurcation_angle_local": 72.9421, + "average_bifurcation_angle_remote": 79.422, + "average_contraction": 0.865652, + "average_diameter": 0.386189, + "average_fragmentation": 40.9474, + "average_parent_daughter_ratio": 1.01323, + "created_at": "2015-03-09T16:36:48-07:00", + "hausdorff_dimension": 1.12508, + "id": 403165543, + "manual": true, + "max_branch_order": 6, + "max_euclidean_distance": 267.871, + "max_path_distance": 285.128, + "nodes_over_branches": 41.974, + "number_bifurcations": 16, + "number_branches": 38, + "number_nodes": 1595, + "number_stems": 8, + "number_tips": 23, + "overall_depth": 60.5338, + "overall_height": 280.407, + "overall_width": 307.497, + "scale_factor_x": 0.1144, + "scale_factor_y": 0.1144, + "scale_factor_z": 0.28, + "soma_surface": 332.412, + "specimen_id": 318733871, + "superseded": true, + "total_length": 1911.04, + "total_surface": 2330.19, + "total_volume": 264.918, + "updated_at": "2015-11-20T16:57:05-08:00", + "user_id": 250, + "well_known_files": [ + { + "attachable_id": 403165543, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-03-09T16:36:48-07:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_403165543_m.swc", + "id": 403165565, + "published_at": null, + "size": 68212, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2015-03-09T16:36:48-07:00", + "well_known_file_type": { + "created_at": "2014-05-16T12:29:39-07:00", + "id": 303941301, + "name": "3DNeuronReconstruction", + "updated_at": "2014-05-16T12:29:39-07:00" + }, + "well_known_file_type_id": 303941301, + "workflow_state": null + } + ] + }, + { + "average_bifurcation_angle_local": 70.8819434043627, + "average_bifurcation_angle_remote": 78.2563982076947, + "average_contraction": 0.880835021187539, + "average_diameter": 0.311525009419645, + "average_fragmentation": 43.9428571428571, + "average_parent_daughter_ratio": 0.698053892074704, + "created_at": "2015-11-20T16:57:05-08:00", + "hausdorff_dimension": null, + "id": 491253825, + "manual": true, + "max_branch_order": 6, + "max_euclidean_distance": 212.511020927765, + "max_path_distance": 220.853847497628, + "nodes_over_branches": 44.9714285714286, + "number_bifurcations": 15, + "number_branches": 35, + "number_nodes": 1574, + "number_stems": 7, + "number_tips": 21, + "overall_depth": 273.94130015488, + "overall_height": 173.135753853, + "overall_width": 59.117962518888, + "scale_factor_x": 0.1144, + "scale_factor_y": 0.1144, + "scale_factor_z": 0.28, + "soma_surface": 232.051781050739, + "specimen_id": 318733871, + "superseded": false, + "total_length": 1434.15149446666, + "total_surface": 1398.00481682895, + "total_volume": 126.335576025326, + "updated_at": "2016-02-03T16:39:02-08:00", + "user_id": 250, + "well_known_files": [ + { + "attachable_id": 491253825, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2015-11-20T16:57:05-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14-169248.04.02.01_491253825_m.swc", + "id": 491253827, + "published_at": "2015-05-14", + "size": 68572, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2015-11-20T16:57:05-08:00", + "well_known_file_type": { + "created_at": "2014-05-16T12:29:39-07:00", + "id": 303941301, + "name": "3DNeuronReconstruction", + "updated_at": "2014-05-16T12:29:39-07:00" + }, + "well_known_file_type_id": 303941301, + "workflow_state": null + }, + { + "attachable_id": 491253825, + "attachable_type": "NeuronReconstruction", + "content_type": "text/plain; charset=us-ascii", + "created_at": "2016-01-18T18:49:54-08:00", + "file_source_id": null, + "filename": "Nr5a1-Cre_Ai14-169248.04.02.01_491253825_marker_m.swc", + "id": 496607168, + "published_at": "2015-05-14", + "size": 600, + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "updated_at": "2016-01-18T18:49:54-08:00", + "well_known_file_type": { + "created_at": "2015-09-16T15:37:33-07:00", + "id": 486753749, + "name": "3DNeuronMarker", + "updated_at": "2015-09-16T15:37:33-07:00" + }, + "well_known_file_type_id": 486753749, + "workflow_state": null + } + ] + } + ], + "normalization_group_id": null, + "parent_id": 318694179, + "parent_x_coord": 0, + "parent_y_coord": 0, + "parent_z_coord": 1, + "plane_of_section_id": 1, + "postmortem_interval_id": null, + "preparation_method_id": null, + "priority": null, + "project": { + "code": "T301", + "created_at": "2014-07-01T09:52:32-07:00", + "current_directory": 659, + "failed_trigger_dir": "/projects/incoming/mousecelltypes/failed_trigger/", + "file_storage": "/data/aibstemp/josem/WellKnownFiles/", + "id": 305094322, + "incoming_directory": null, + "name": "in vitro Single Cell Characterization", + "non_cached_schema_name": null, + "process_triggers": true, + "subdirectory_count": 337, + "trigger_dir": "/projects/incoming/mousecelltypes/trigger/", + "updated_at": "2016-03-21T11:17:41-07:00" + }, + "project_id": 305094322, + "reference_space_id": 9, + "rna_integrity_number": null, + "specimen_preparation_method_id": null, + "specimen_set_id": null, + "specimen_tags": [ + { + "ar_association_key_name": "318733871", + "created_at": "2015-03-24T12:13:03-07:00", + "description": "neurons with no truncation", + "id": 470927414, + "is_public": true, + "name": "apical - intact", + "updated_at": "2015-03-24T12:13:03-07:00" + }, + { + "ar_association_key_name": "318733871", + "created_at": "2015-03-24T12:15:22-07:00", + "description": "initial high-level dendrite type to support May release search - spiny", + "id": 470928297, + "is_public": true, + "name": "dendrite type - spiny", + "updated_at": "2015-03-24T12:15:22-07:00" + } + ], + "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", + "structure_id": 721, + "task_flow_id": null, + "tissue_ph": null, + "tissue_processing_id": null, + "updated_at": "2015-12-10T19:52:02-08:00", + "updated_by": null + }, + "specimen_id": 318733871, + "storage_directory": "/projects/mousecelltypes/vol1/prod192/neuronal_model_329322394/", + "updated_at": "2016-01-21T23:24:14-08:00", + "well_known_files": [ + { + "attachable_id": 329322394, + "attachable_type": "NeuronalModel", + "content_type": "application/json", + "created_at": "2016-01-21T23:24:14-08:00", + "file_source_id": null, + "filename": "318733871_fit.json", + "id": 497237577, + "published_at": "2015-05-14", + "size": null, + "storage_directory": "/projects/mousecelltypes/vol1/prod192/neuronal_model_329322394/", + "updated_at": "2016-01-21T23:24:14-08:00", + "well_known_file_type": { + "created_at": "2015-02-13T11:41:41-08:00", + "id": 329230374, + "name": "NeuronalModelParameters", + "updated_at": "2015-02-13T11:41:41-08:00" + }, + "well_known_file_type_id": 329230374, + "workflow_state": null + } + ], + "workflow_state": "has_been_fit" +} +''' + + +def mock_import(mod, *args): + if mod == "neuron": + return MagicMock() + return real_import(mod, *args) + + +def mock_read_lims_file(self, lims_path): + self.lims_path = lims_path + self.read_json_string(LIMS_MESSAGE) + self.lims_update_data = dict(self.lims_data) + + +@pytest.fixture +def run_optimize(): + rs = RunOptimize('manifest_sdk.json', 'out.json') + + mock.patch.object(OptimizeConfigReader, + 'read_lims_file', + mock_read_lims_file) + + return rs + + +def xtest_init(run_optimize): + assert run_optimize.input_json == 'manifest_sdk.json' + assert run_optimize.output_json == 'out.json' + assert run_optimize.app_config == None + assert run_optimize.manifest == None + + +orig_open = open + +def open_configs(n, *args): + (_, fn) = os.path.split(n) + + if fn == 'manifest_sdk.json': + data_string = MANIFEST_JSON + elif fn == 'lims_message_optimize.json': + data_string = LIMS_MESSAGE + else: + return orig_open(n, *args) + + return mock_open(read_data=data_string)(n, *args) + + +@pytest.mark.requires_neuron +@patch("os.path.exists", return_value=True) +@patch("shutil.copy") +@patch("allensdk.model.biophysical.runner.save_nwb") +@patch.object(HocUtils, "__init__") +@patch(builtins.__name__+".__import__", side_effect=mock_import) +@patch("allensdk.core.json_utilities.write") +@patch("allensdk.internal.model.biophysical.fit_stage_2.run_stage_2") +@patch("allensdk.internal.model.biophysical.fit_stage_2.prepare_stage_2") +@patch("allensdk.internal.model.biophysical.fit_stage_1.run_stage_1") +@patch("allensdk.internal.model.biophysical.fit_stage_1.prepare_stage_1") +@patch("allensdk.internal.model.biophysical.run_passive_fit.run_passive_fit") +@patch("allensdk.core.nwb_data_set.NwbDataSet") +def test_start_specimen(nwb_data_set, + passive_fit, + prepare_stage_1, + run_stage_1, + prepare_stage_2, + run_stage_2, + json_utilities_write, + import_mock, + hoc_init, + save_nwb, + shutil_copy, + path_exists, + run_optimize): + with patch(builtins.__name__+".open", open_configs): + fit_description = Config().load('manifest_sdk.json') + Utils.description = fit_description + run_optimize.start_specimen() + + assert True diff --git a/test/internal/biophysical/test_simulate_run.py b/test/internal/biophysical/test_simulate_run.py new file mode 100644 index 0000000000..2b91040f67 --- /dev/null +++ b/test/internal/biophysical/test_simulate_run.py @@ -0,0 +1,753 @@ +import pytest +from mock import patch, mock_open, Mock, MagicMock +try: + import __builtin__ as builtins +except: + import builtins +from allensdk.model.biophysical.utils import Utils +from allensdk.model.biophys_sim.config import Config +from allensdk.internal.model.biophysical.run_simulate_lims \ + import RunSimulateLims +from allensdk.model.biophys_sim.neuron.hoc_utils import HocUtils + +MANIFEST_JSON = ''' +{ + "biophys": [ + { + "model_type": "Biophysical - perisomatic", + "model_file": [ + "manifest_sdk.json", + "/projects/mousecelltypes/vol1/prod520/neuronal_model_488462965/487667205_fit.json" + ] + } + ], + "runs": [ + { + "sweeps_by_type": { + "Noise 1": [ + 39, + 41, + 43, + 45 + ], + "Noise 2": [ + 38, + 40, + 42, + 44 + ], + "Ramp": [ + 89, + 90, + 91 + ], + "Unknown": [ + 5 + ], + "Short Square": [ + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88 + ], + "Ramp to Rheobase": [ + 21, + 22, + 23 + ], + "Square - 2s Suprathreshold": [ + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35 + ], + "Long Square": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74 + ], + "Square - 0.5ms Subthreshold": [ + 36, + 37 + ], + "Test": [ + 0, + 1, + 2, + 3, + 4, + 6, + 7, + 20 + ] + }, + "sweeps": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 87, + 91 + ], + "neuronal_model_run_id": 496537307 + } + ], + "neuron": [ + { + "hoc": [ + "stdgui.hoc", + "import3d.hoc", + "cell.hoc" + ] + } + ], + "manifest": [ + { + "type": "dir", + "spec": "/local1/tmp", + "key": "BASEDIR" + }, + { + "type": "dir", + "spec": "/local1/tmp", + "key": "WORKDIR" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod534/specimen_487667205/Pvalb-IRES-Cre_Ai14-212813.03.01.01_496163999_m.swc", + "key": "MORPHOLOGY" + }, + { + "type": "dir", + "spec": "templates", + "key": "CODE_DIR" + }, + { + "type": "dir", + "spec": "modfiles", + "key": "MODFILE_DIR" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", + "key": "MOD_FILE_Kv2like", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", + "key": "MOD_FILE_NaV", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", + "key": "MOD_FILE_Ca_HVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", + "key": "MOD_FILE_Ca_LVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", + "key": "MOD_FILE_CaDynamics", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", + "key": "MOD_FILE_Ih", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", + "key": "MOD_FILE_Im", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", + "key": "MOD_FILE_Im_v2", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", + "key": "MOD_FILE_K_P", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", + "key": "MOD_FILE_K_T", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", + "key": "MOD_FILE_Kd", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", + "key": "MOD_FILE_Kv3_1", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", + "key": "MOD_FILE_Nap", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", + "key": "MOD_FILE_NaTa", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", + "key": "MOD_FILE_NaTs", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", + "key": "MOD_FILE_SK", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", + "key": "MOD_FILE_Kv2like", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", + "key": "MOD_FILE_NaV", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", + "key": "MOD_FILE_Ca_HVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", + "key": "MOD_FILE_Ca_LVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", + "key": "MOD_FILE_CaDynamics", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", + "key": "MOD_FILE_Ih", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", + "key": "MOD_FILE_Im", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", + "key": "MOD_FILE_Im_v2", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", + "key": "MOD_FILE_K_P", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", + "key": "MOD_FILE_K_T", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", + "key": "MOD_FILE_Kd", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", + "key": "MOD_FILE_Kv3_1", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", + "key": "MOD_FILE_Nap", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", + "key": "MOD_FILE_NaTa", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", + "key": "MOD_FILE_NaTs", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", + "key": "MOD_FILE_SK", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", + "key": "MOD_FILE_Kv2like", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", + "key": "MOD_FILE_NaV", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", + "key": "MOD_FILE_Ca_HVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", + "key": "MOD_FILE_Ca_LVA", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", + "key": "MOD_FILE_CaDynamics", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", + "key": "MOD_FILE_Ih", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", + "key": "MOD_FILE_Im", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", + "key": "MOD_FILE_Im_v2", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", + "key": "MOD_FILE_K_P", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", + "key": "MOD_FILE_K_T", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", + "key": "MOD_FILE_Kd", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", + "key": "MOD_FILE_Kv3_1", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", + "key": "MOD_FILE_Nap", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", + "key": "MOD_FILE_NaTa", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", + "key": "MOD_FILE_NaTs", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", + "key": "MOD_FILE_SK", + "format": "MODFILE" + }, + { + "type": "file", + "spec": "lims_message_simulate.json", + "key": "neuronal_model_run_data" + }, + { + "type": "file", + "spec": "/projects/mousecelltypes/vol1/prod514/Ephys_Roi_Result_487667203/487667203.nwb", + "key": "stimulus_path", + "format": "NWB" + }, + { + "type": "file", + "spec": "/local1/tmp/manifest_sdk.json", + "key": "manifest" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "spec": "496537307_virtual_experiment.nwb", + "key": "output_path", + "format": "NWB" + }, + { + "type": "dir", + "spec": "/projects/mousecelltypes/vol1/prod520/neuronal_model_488462965/487667205_fit.json", + "key": "fit_parameters" + } + ], + "passive": [ + { + "ra": 29.0745151982, + "cm": [ + { + "section": "soma", + "cm": 3.31732779736 + }, + { + "section": "axon", + "cm": 3.31732779736 + }, + { + "section": "dend", + "cm": 3.31732779736 + } + ], + "e_pas": -85.65570068359375 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 56 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -85.65570068359375 + } + ], + "genome": [ + { + "section": "soma", + "name": "gbar_Ih", + "value": 0.00090995210221476205, + "mechanism": "Ih" + }, + { + "section": "soma", + "name": "gbar_NaV", + "value": 0.081906946478702058, + "mechanism": "NaV" + }, + { + "section": "soma", + "name": "gbar_Kd", + "value": 2.4740872017758875e-08, + "mechanism": "Kd" + }, + { + "section": "soma", + "name": "gbar_Kv2like", + "value": 0.00160565599090932, + "mechanism": "Kv2like" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": 2.296430043469444, + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_K_T", + "value": 0.059053715441415355, + "mechanism": "K_T" + }, + { + "section": "soma", + "name": "gbar_Im_v2", + "value": 3.9951061122506237e-14, + "mechanism": "Im_v2" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": 6.8067829150919579e-10, + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": 0.0001014254260681964, + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": 0.0097584217102168799, + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": 0.0007405691124034076, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": 410.14174188957332, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "g_pas", + "value": 5.2241645387452482e-05, + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": 2.2719709304318236e-05, + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": 1.0099597920543875e-07, + "mechanism": "" + } + ] +} +''' + +@pytest.fixture +def run_simulate(): + rs = RunSimulateLims('manifest.json', 'out.json') + + return rs + + +def test_init(run_simulate): + assert run_simulate.input_json == 'manifest.json' + assert run_simulate.output_json == 'out.json' + assert run_simulate.app_config == None + assert run_simulate.manifest == None + + +@pytest.mark.xfail +@patch.object(Utils, "h") +@patch.object(HocUtils, "__init__") +def test_simulate(hoc_init, mock_h, run_simulate): + # import allensdk.eclipse_debug + + mock_utils = Mock(name='mock_utils', + h=mock_h) + + with patch('allensdk.internal.api.queries.biophysical_module_reader.BiophysicalModuleReader', + MagicMock(name="bio_mod_reader")) as bio_mod_reader: + with patch('allensdk.model.biophysical.runner.save_nwb', + MagicMock(name="save_nwb")) as save_nwb: + with patch('allensdk.model.biophysical.runner.NwbDataSet', + MagicMock(name='nwb_data_set')) as nwb_data_set: + with patch('allensdk.model.biophysical.runner.copy', + MagicMock(name='shutil_copy')) as cp: + with patch('allensdk.model.biophysical.utils.create_utils', + return_value=mock_utils) as cu: + with patch(builtins.__name__ + ".open", + mock_open( + read_data=MANIFEST_JSON)): + fit_description = Config().load('manifest.json') + Utils.description = fit_description + run_simulate.simulate() diff --git a/test/internal/brain_observatory/__pycache__/test_roi_filter_utils.cpython-37.pyc b/test/internal/brain_observatory/__pycache__/test_roi_filter_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fd476c6c21b9cc5c54a5722d46d0008a431fd17 GIT binary patch literal 1475 zcmb7E&2QX96rUM;9cS}VBo1&u)xZU<NS)9C2NWfwA2+B35g#(HtXa>jce?i2otaH{ zSDOP(g}5NZ5l$dZ{0T_>Bly}=j$C`<jk}wKR-pFT^YeVXnfKoBz448WjV=OFzkS30 z?jZEo4VJPFosXcIKLI%6xInS{k^+|`CKw5H&-=ya9?YSf0QxO<0DbPT<1p_m)}M}? zUI1%&;J?7W70?X%Dx9)7A8d9+z`K0ydou8I<eqkJg|9E>yk805;G2)oDUL&qk5KQ* z8AO2Y^l<Z9E^I0lmzgkWf0}Y>EK`}7MOF)u)|FJ&Y|;B;p{M5~F{wpn1>d4#l8M^N zN}XXi@QgU{0rH=Ja`M-~qVvZ=zT3*<gV~#(un8@h&4zSojpkY~D>Su3rsxj%)oB%G zyJ}qaVZIuGZYh)jQ-(@-RaR*YUPScv!W(*>=9Q)IX3ha8kUz8v?ItvH4`A+bJPP%W zMRPnyr{u)9m=o?jLYB<Q+&?9^fTL4v2G)Cs)dzF$hb@f$r48AAPCIehUqU^6iatYM z!50|r%)Yb2SaZRUp%0`TQX|W{5cK*jdJNuI+C=m)vtw4!tm1+WnW68WuXQQNpwg7l zJ~J|-nJ9{DEj3c*)K>KCQmV-o1)Ku1iR-fo^cgUEx7~jybGdQiL389BK{Kxd<Y<oW zzLJm=d_sT{G9o{c`~DI79qAQV?s*M~b{Z@iEZd0|o_u@r!{l=#v`N^I@u<%pFf~mM z70W8c*={1#u}P{LvXuc=^>AvEk7YkG(u!*}%SJ30u(v2cgO9cyPuoytLMv8m_cfC$ zt@?2OF#~?4?Ru&!nGR$DO6l0j!bJ7-Nq4V+YR#&$-hbOg<f<<~vmJL}`X6;2?G;tV z3bPNL<>r^?=You$r$aESU7cz7>$q6bYi{U%8t*_`c-Ql_bF=Xv{KlKfy4gH55UaaG zx3#WxuM@9bx_a^Y<*V0(%d6L{o?pFYWpRI>G2OiJe?++a8s{9k8saX#N&-OrDvW!p zaZpd)-uS&`lA>jPqUZ7xJ)4@R0s1A=qj;@mnw7$8ITLXJsWrmrD`2GQe!+^dXhUwT sUUJ^K){@tRdu7GPh1ho$Y~BJ0$+{n4;!(Vb1MDxp0S-Na-4oz{03Y0vq5uE@ literal 0 HcmV?d00001 diff --git a/test/internal/brain_observatory/__pycache__/test_run_ophys_time_sync.cpython-37.pyc b/test/internal/brain_observatory/__pycache__/test_run_ophys_time_sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9b3386ff3fe6d8b743625ffaede26069182416d GIT binary patch literal 4295 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 literal 0 HcmV?d00001 diff --git a/test/internal/brain_observatory/__pycache__/test_time_sync.cpython-37.pyc b/test/internal/brain_observatory/__pycache__/test_time_sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c232dca799380b90cee0d7033c543073e37c7755 GIT binary patch literal 17805 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 YG>F30yh2MH2>~1YH`G0Z#d9<M2h_E5rT_o{ literal 0 HcmV?d00001 diff --git a/test/internal/brain_observatory/test_roi_filter_utils.py b/test/internal/brain_observatory/test_roi_filter_utils.py new file mode 100644 index 0000000000..835dc0f9fc --- /dev/null +++ b/test/internal/brain_observatory/test_roi_filter_utils.py @@ -0,0 +1,43 @@ +import pytest + +from allensdk.internal.brain_observatory.roi_filter_utils import ( + get_indices_by_distance) + + +@pytest.mark.parametrize( + "tree_points, query_points, expected, exception", + [ + ( + [[0, 0], [0, 1], [0, 2], [1, 2], [2, 2]], + [[0, 0], [2, 2]], + [0, 4], + None + ), + ( + [[0, 0], [0, 1], [0, 2], [1, 2], [2, 2]], + [[0, 0.4], [0.1, 0.6]], + [0, 1], + pytest.raises(AssertionError, + match="Max match distance greater than 0") + ), + ( + [], + [], + [], + pytest.raises(ValueError, + match=("number of dimensions is incorrect. " + "Expected 2 got 1")) + ) + ]) +def test_get_indices_by_distance(tree_points, query_points, + expected, exception): + """tests exceptions with simple 2D vectors. Actual code has 5D vectors + for a basic cell-matching to [minx, miny, maxx, maxy, area] + """ + if exception is None: + indices = get_indices_by_distance(query_points, tree_points) + assert all([e == i for e, i in zip(expected, indices)]) + else: + with exception: + indices = get_indices_by_distance(query_points, tree_points) + assert all([e == i for e, i in zip(expected, indices)]) diff --git a/test/internal/brain_observatory/test_run_ophys_time_sync.py b/test/internal/brain_observatory/test_run_ophys_time_sync.py new file mode 100644 index 0000000000..dd01684db5 --- /dev/null +++ b/test/internal/brain_observatory/test_run_ophys_time_sync.py @@ -0,0 +1,158 @@ +""" Tests for the executable that synchronizes distinct data streams within an +ophys experiment. For tests of the logic used by this executable, see +test_time_sync +""" + +import os +import json +from typing import NamedTuple + +import pytest +import numpy as np +import h5py + +import allensdk +from allensdk.internal.pipeline_modules.run_ophys_time_sync import ( + TimeSyncOutputs, TimeSyncWriter, check_stimulus_delay, run_ophys_time_sync +) + + +@pytest.fixture +def outputs(): + return TimeSyncOutputs( + 100, + 0.35, + 0, + 1, + 2, + 3, + np.linspace(0, 1, 10), + np.linspace(1, 2, 10), + np.linspace(2, 3, 10), + np.linspace(3, 4, 10), + np.arange(10), + np.arange(10, 20), + np.arange(20, 30) + ) + +@pytest.fixture +def writer(tmpdir_factory): + tmpdir_path = str(tmpdir_factory.mktemp("run_ophys_time_sync_tests")) + return TimeSyncWriter( + os.path.join(tmpdir_path, "data.h5"), + os.path.join(tmpdir_path, "output.json") + ) + + +def test_validate_paths_writable(writer): + try: + writer.validate_paths() + except Exception as err: + pytest.fail(f"expected no error. Got: {err.__class__.__name__}(\"{err}\")") + + +@pytest.mark.parametrize("h5_key,expected", [ + ["stimulus_alignment", np.arange(10)], + ["eye_tracking_alignment", np.arange(10, 20)], + ["body_camera_alignment", np.arange(20, 30)], + ["twop_vsync_fall", np.linspace(0, 1, 10)], + ["ophys_delta", 0], + ["stim_delta", 1], + ["stim_delay", 0.35], + ["eye_delta", 2], + ["behavior_delta", 3] +]) +def test_write_output_h5(writer, outputs, h5_key, expected): + + writer.write_output_h5(outputs) + + with h5py.File(writer.output_h5_path, "r") as obtained_file: + obtained = obtained_file[h5_key] + + if isinstance(expected, np.ndarray): + assert np.allclose(obtained, expected) + else: + assert obtained.value == expected + + +@pytest.mark.parametrize("json_key,expected", [ + ["allensdk_version", allensdk.__version__], + ["experiment_id", 100], + ["ophys_delta", 0], + ["stim_delta", 1], + ["stim_delay", 0.35], + ["eye_delta", 2], + ["behavior_delta", 3] +]) +def test_write_output_json(writer, outputs, json_key, expected): + + writer.write_output_json(outputs) + + with open(writer.output_json_path, "r") as jf: + obtained_dict = json.load(jf) + obtained = obtained_dict[json_key] + + assert obtained == expected + + +@pytest.mark.parametrize("obt", np.linspace(0, 1, 4)) +@pytest.mark.parametrize("mn", np.linspace(0, 1, 4)) +@pytest.mark.parametrize("mx", np.linspace(0, 1, 4)) +def test_check_stimulus_delay(obt, mn, mx): + + if obt < mn or obt > mx: + with pytest.raises(ValueError): + check_stimulus_delay(obt, mn, mx) + else: + check_stimulus_delay(obt, mn, mx) + + +def test_run_ophys_time_sync(): + + class Aligner(NamedTuple): + corrected_stim_timestamps: np.ndarray + corrected_ophys_timestamps: np.ndarray + corrected_eye_video_timestamps: np.ndarray + corrected_behavior_video_timestamps: np.ndarray + + aligner = Aligner( + (np.arange(10), 0, 0.5), + (np.arange(10), 1), + (np.arange(10), 2), + (np.arange(10), 3) + ) + + obtained = run_ophys_time_sync(aligner, 100, 0.0, 2.0) + + # store mismatches in an array so we can show every distinct failure + mismatches = [] + for name, expected in [ + ["experiment_id", 100], + ["stimulus_delay", 0.5], + ["ophys_delta", 1], + ["stimulus_delta", 0], + ["eye_delta", 2], + ["behavior_delta", 3], + ["ophys_times", np.arange(10)], + ["stimulus_times", np.arange(10)], + ["eye_times", np.arange(10)], + ["behavior_times", np.arange(10)], + ["stimulus_alignment", np.arange(10)], + ["eye_alignment", np.arange(10)], + ["behavior_alignment", np.arange(10)] + ]: + + current_obt = getattr(obtained, name) + + if isinstance(expected, np.ndarray): + match = np.allclose(expected, current_obt) + else: + match = expected == current_obt + + if not match: + mismatches.append( + f"{name} mismatched: expected {expected}, " + f"obtained {current_obt}" + ) + + assert len(mismatches) == 0, "\n" + "\n".join(mismatches) \ No newline at end of file diff --git a/test/internal/brain_observatory/test_time_sync.py b/test/internal/brain_observatory/test_time_sync.py new file mode 100644 index 0000000000..f332cd0fd1 --- /dev/null +++ b/test/internal/brain_observatory/test_time_sync.py @@ -0,0 +1,693 @@ +import pytest +import numpy as np +import json +import os +import h5py +from pkg_resources import resource_filename +from mock import patch +from allensdk.internal.brain_observatory import time_sync as ts +from allensdk.internal.pipeline_modules import run_ophys_time_sync +from allensdk.brain_observatory.sync_dataset import Dataset + + +ASSUMED_DELAY = 0.0351 + + +data_file = resource_filename(__name__, "time_sync_test_data.json") +test_data = json.load(open(data_file, "r")) + +data_skip = False +if not os.path.exists(test_data["nikon"]["sync_file"]): + data_skip = True + +# Functions from lims2_modules ophys_time_sync.py for regression testing + +MIN_BOUND = .03 +MAX_BOUND = .04 + + +mock_keys = { + "photodiode": "photodiode", + "2p": "2p_vsync", + "stimulus": "stim_vsync", + "eye_camera": "cam2_exposure", + "behavior_camera": "cam1_exposure", + "acquiring": "2p_acquiring", + "lick_sensor": "lick_1" +} + + +class MockSyncDataset(Dataset): + """ + Mock the Dataset class so it doesn't load an h5 file upon + initialization. + """ + def __init__(self, data, line_labels=None): + self.dfile = data + self.line_labels = line_labels + + +def mock_get_real_photodiode_events(data, key): + return data + + +def mock_get_events_by_line(line, units="seconds"): + return line + + +def calculate_stimulus_alignment(stim_time, valid_twop_vsync_fall): + stimulus_alignment = np.empty(len(stim_time)) + + for index in range(len(stim_time)): + crossings = np.nonzero( + np.ediff1d( + np.sign(valid_twop_vsync_fall - stim_time[index])) > 0) + try: + stimulus_alignment[index] = int(crossings[0][0]) + except: # noqa: E722 + stimulus_alignment[index] = np.NaN + + return stimulus_alignment + + +def calculate_valid_twop_vsync_fall(sync_data, sample_frequency): + twop_vsync_fall = sync_data.get_falling_edges('2p_vsync') /\ + sample_frequency + + if len(twop_vsync_fall) == 0: + raise ValueError('Error: twop_vsync_fall length is 0, possible ' + 'invalid, missing, and/or bad data') + + ophys_start = twop_vsync_fall[0] + valid_twop_vsync_fall = twop_vsync_fall[np.where( + twop_vsync_fall > ophys_start)[0]] + + return valid_twop_vsync_fall + + +def calculate_stim_vsync_fall(sync_data, sample_frequency): + stim_vsync_fall = sync_data.get_falling_edges('stim_vsync')[0:] /\ + sample_frequency + return stim_vsync_fall + + +def find_start(twop_vsync_fall): + start_index = 0 + + in_start_frames = True + found_start = False + + prev_value = None + index = 0 + for value in twop_vsync_fall: + if not found_start: + if prev_value is not None: + diff = value - prev_value + if diff < MIN_BOUND or diff > MAX_BOUND: + if in_start_frames: + in_start_frames = False + elif not in_start_frames: + found_start = True + start_index = index + + prev_value = value + index += 1 + + return start_index + + +def sync_camera_stimulus(sync_data, sample_frequency, camera, + ophys_experiment_id): + twop_vsync_fall = sync_data.get_falling_edges('2p_vsync') /\ + sample_frequency + + if len(twop_vsync_fall) == 0: + raise ValueError('Error: twop_vsync_fall length is 0, ' + 'possible invalid, missing, and/or bad data') + + try: + twop_acquiring = sync_data.get_rising_edges('2p_acquiring') + ophys_start = twop_acquiring / sample_frequency + except: # noqa: E722 + ophys_start = [find_start(twop_vsync_fall)] + + twop_vsync_fall = twop_vsync_fall[np.where( + twop_vsync_fall > ophys_start)[0]] + + cam_fall = None + + if camera == 1: + cam_fall = sync_data.get_falling_edges('cam1_exposure') /\ + sample_frequency + elif camera == 2: + cam_fall = sync_data.get_falling_edges('cam2_exposure') /\ + sample_frequency + else: + raise ValueError(f'Error: camera value {camera} is invalid') + + frames = np.zeros((len(twop_vsync_fall), 1)) + + for i in range(len(frames)): + crossings = np.nonzero( + np.ediff1d(np.sign(cam_fall - twop_vsync_fall[i])) > 0) + try: + frames[i] = crossings[0][0] + except: # noqa: E722 + frames[i] = np.NaN + + return frames + +# End of regression functions + + +@pytest.fixture +def nikon_input(): + input_data = test_data["nikon"].copy() + input_data.pop("ophys_experiment_id") + return input_data + + +@pytest.fixture +def scientifica_input(): + input_data = test_data["scientifica"].copy() + input_data.pop("ophys_experiment_id") + return input_data + + +@pytest.fixture +def input_json(tmpdir_factory): + output_file = str(tmpdir_factory.mktemp("test").join("output.h5")) + input_data = test_data["nikon"].copy() + input_data['output_file'] = output_file + json_file = str(tmpdir_factory.mktemp("test").join("input.json")) + with open(json_file, "w") as f: + json.dump(input_data, f) + + return json_file + + +def test_get_alignment_array(): + bigger = np.linspace(0, 5, 300) + smaller = np.linspace(0.2, 3, 50) + + alignment = ts.get_alignment_array(bigger, smaller) + assert np.all(~np.isnan(alignment)) + assert np.all(bigger[alignment.astype(int)] < smaller) + + alignment = ts.get_alignment_array(smaller, bigger) + assert np.all(np.isnan(alignment[bigger <= 0.2])) + assert np.all(np.isnan(alignment[bigger >= 50])) + big_idx = np.where(~np.isnan(alignment))[0] + small_idx = alignment[big_idx].astype(int) + assert np.all(smaller[small_idx] < bigger[big_idx]) + + +@pytest.mark.skipif(data_skip, reason="No sync or data") +def test_regression_valid_2p_timestamps(nikon_input, scientifica_input): + sync_file = nikon_input.pop("sync_file") + aligner = ts.OphysTimeAligner(sync_file, **nikon_input) + freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] + old_times = calculate_valid_twop_vsync_fall(aligner.dataset, freq) + new_times = aligner.ophys_timestamps + assert np.allclose(new_times[1:], old_times) + + # old scientifica used falling edges as timestamps incorrectly + sync_file = scientifica_input.pop("sync_file") + aligner = ts.OphysTimeAligner(sync_file, **scientifica_input) + freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] + old_times = calculate_valid_twop_vsync_fall(aligner.dataset, freq) + new_times = aligner.ophys_timestamps + assert len(new_times) - len(old_times) == 1 + assert np.all(new_times[1:] < old_times) + assert np.all(new_times[2:] > old_times[:-1]) + + +@pytest.mark.skipif(data_skip, reason="No sync or data") +def test_regression_stim_timestamps(nikon_input, scientifica_input): + for input_data in [nikon_input, scientifica_input]: + sync_file = input_data.pop("sync_file") + aligner = ts.OphysTimeAligner(sync_file, **input_data) + freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] + old_times = calculate_stim_vsync_fall(aligner.dataset, freq) + assert np.allclose(aligner.stim_timestamps, old_times) + + +@pytest.mark.skipif(data_skip, reason="No sync or data") +def test_regression_calculate_stimulus_alignment(nikon_input, + scientifica_input): + for input_data in [nikon_input, scientifica_input]: + sync_file = input_data.pop("sync_file") + aligner = ts.OphysTimeAligner(sync_file, **input_data) + old_align = calculate_stimulus_alignment(aligner.stim_timestamps, + aligner.ophys_timestamps) + new_align = ts.get_alignment_array(aligner.ophys_timestamps, + aligner.stim_timestamps) + + # Old alignment assigned simultaneous stim frames to the previous ophys + # frame. Methods should only differ when ophys and stim are identical. + mismatch = old_align != new_align + mis_o = aligner.ophys_timestamps[new_align[mismatch].astype(int)] + mis_s = aligner.stim_timestamps[mismatch] + assert np.all(mis_o == mis_s) + # Occurence of mismatch should be rare + assert len(mis_o) < 0.005*len(aligner.ophys_timestamps) + + +@pytest.mark.skipif(data_skip, reason="No sync or data") +def test_regression_calculate_camera_alignment(nikon_input, + scientifica_input): + for input_data in [nikon_input, scientifica_input]: + sync_file = input_data.pop("sync_file") + aligner = ts.OphysTimeAligner(sync_file, **input_data) + freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] + old_eye_align = sync_camera_stimulus(aligner.dataset, freq, 2, 1) + # old alignment throws out the first ophys timestamp + new_eye_align = ts.get_alignment_array(aligner.eye_video_timestamps, + aligner.ophys_timestamps[1:], + int_method=np.ceil) + mismatch = np.where(old_eye_align[:, 0] != new_eye_align) + mis_e = \ + aligner.eye_video_timestamps[new_eye_align[mismatch].astype(int)] + mis_o = aligner.ophys_timestamps[1:][mismatch] + mis_o_plus = aligner.ophys_timestamps[1:][(mismatch[0]+1,)] + # New method should only disagree when old method was wrong (old method + # set an eye tracking frame to an earlier ophys frame). + assert np.all(mis_o < mis_e) + assert np.all(mis_o_plus >= mis_e) + # Occurence of mismatch should be rare + assert len(mis_o) < 0.005*len(aligner.ophys_timestamps[1:]) + + +@pytest.mark.parametrize("eye_data_length", (None, 5000, 6000)) +def test_get_corrected_eye_times(eye_data_length): + true_times = np.arange(6000) + + with patch.object(ts, "get_keys", return_value=mock_keys): + with patch.object(ts.Dataset, "load"): + aligner = ts.OphysTimeAligner("test") + + aligner.eye_data_length = eye_data_length + with patch.object(ts.Dataset, "get_falling_edges", + return_value=true_times) as mock_falling: + with patch("logging.info") as mock_log: + times, delta = aligner.corrected_eye_video_timestamps + + if eye_data_length != 6000: + mock_log.assert_called_once() + else: + assert mock_log.call_count == 0 + + mock_falling.assert_called_once() + assert np.all(times == true_times) + + if eye_data_length is None: + assert delta == 0 + else: + assert delta == (len(true_times) - eye_data_length) + + +@pytest.mark.parametrize("behavior_data_length", (None, 5000, 6000)) +def test_get_corrected_behavior_times(behavior_data_length): + true_times = np.arange(6000) + + with patch.object(ts, "get_keys", return_value=mock_keys): + with patch.object(ts.Dataset, "load"): + aligner = ts.OphysTimeAligner("test") + + aligner.behavior_data_length = behavior_data_length + with patch.object(ts.Dataset, "get_falling_edges", + return_value=true_times) as mock_falling: + with patch("logging.info") as mock_log: + times, delta = aligner.corrected_behavior_video_timestamps + + if behavior_data_length != 6000: + mock_log.assert_called_once() + else: + assert mock_log.call_count == 0 + + mock_falling.assert_called_once() + assert np.all(times == true_times) + + if behavior_data_length is None: + assert delta == 0 + else: + assert delta == (len(true_times) - behavior_data_length) + + +@pytest.mark.parametrize("stim_data_length,start_delay", [ + (None, False), + (None, True), + (5000, False), + (5000, True), + (6000, False), + (6000, True) + ]) +def test_get_corrected_stim_times(stim_data_length, start_delay): + true_falling = np.arange(0, 60, 0.01) + true_rising = true_falling + 0.005 + if start_delay: + true_falling[0] -= 3 + true_rising[0] -= 3 + + with patch.object(ts, "get_keys", return_value=mock_keys): + with patch.object(ts.Dataset, "load"): + aligner = ts.OphysTimeAligner("test") + + aligner.stim_data_length = stim_data_length + with patch.object(ts, "calculate_monitor_delay", + return_value=ASSUMED_DELAY): + with patch.object(ts.Dataset, "get_falling_edges", + return_value=true_falling): + with patch.object(ts.Dataset, "get_rising_edges", + return_value=true_rising) as mock_rising: + with patch("logging.info") as mock_log: + times, delta, stim_delay = \ + aligner.corrected_stim_timestamps + + if stim_data_length is None: + mock_log.assert_called_once() + assert mock_rising.call_count == 0 + assert delta == 0 + elif stim_data_length != len(true_falling) and start_delay: + mock_rising.assert_called_once() + assert mock_log.call_count == 2 + assert len(times) == len(true_falling) - 1 + assert delta == len(true_falling) - 1 - stim_data_length + assert np.all(times == true_falling[1:] + ASSUMED_DELAY) + elif stim_data_length != len(true_falling): + mock_rising.assert_called_once() + mock_log.assert_called_once() + assert delta == len(true_falling) - stim_data_length + assert np.all(times == true_falling + ASSUMED_DELAY) + else: + assert mock_rising.call_count == 0 + assert np.all(times == true_falling + ASSUMED_DELAY) + assert mock_log.call_count == 0 + assert delta == 0 + + +@pytest.mark.parametrize("ophys_data_length", (None, 5000, 6000, 7000)) +def test_get_corrected_ophys_times_nikon(ophys_data_length): + true_times = np.arange(6000) + + with patch.object(ts, "get_keys", return_value=mock_keys): + with patch.object(ts.Dataset, "load"): + aligner = ts.OphysTimeAligner("test", "NIKONA1RMP") + + aligner.ophys_data_length = ophys_data_length + with patch.object(ts.Dataset, "get_falling_edges", + return_value=true_times): + with patch.object(ts.Dataset, "get_rising_edges", + return_value=[0]): + with patch("logging.info") as mock_log: + if ophys_data_length is not None and \ + ophys_data_length > len(true_times): + with pytest.raises(ValueError): + times, delta = aligner.corrected_ophys_timestamps + else: + times, delta = aligner.corrected_ophys_timestamps + if ophys_data_length is None: + assert np.all(times == true_times) + mock_log.assert_called_once() + assert delta == 0 + elif ophys_data_length != len(true_times): + assert np.all(times == true_times[:-delta]) + mock_log.assert_called_once() + else: + assert mock_log.call_count == 0 + assert np.all(times == true_times) + + aligner.scanner = "bad" + with pytest.raises(ValueError): + aligner.corrected_ophys_timestamps + + +@pytest.mark.skipif(data_skip, reason="No sync or data") +def test_module(input_json): + with patch("sys.argv", ["test_run", input_json]): + with patch("logging.info"): + run_ophys_time_sync.main() + + with open(input_json, "r") as f: + input_data = json.load(f) + + output_file = input_data.pop("output_file") + assert os.path.exists(output_file) + + input_data.pop("ophys_experiment_id") + sync_file = input_data.pop("sync_file") + aligner = ts.OphysTimeAligner(sync_file, **input_data) + with h5py.File(output_file) as f: + t, d = aligner.corrected_ophys_timestamps + assert np.all(t == f['twop_vsync_fall'].value) + assert np.all(d == f['ophys_delta'].value) + st, sd, stim_delay = aligner.corrected_stim_timestamps + align = ts.get_alignment_array(t, st) + assert np.allclose(align, f['stimulus_alignment'].value, + equal_nan=True) + assert np.all(sd == f['stim_delta'].value) + et, ed = aligner.corrected_eye_video_timestamps + align = ts.get_alignment_array(et, t, int_method=np.ceil) + assert np.allclose(align, f['eye_tracking_alignment'].value, + equal_nan=True) + assert np.all(ed == f['eye_delta'].value) + bt, bd = aligner.corrected_behavior_video_timestamps + align = ts.get_alignment_array(bt, t, int_method=np.ceil) + assert np.allclose(align, f['body_camera_alignment'].value, + equal_nan=True) + + +@pytest.mark.parametrize( + "sync_dset,stim_times,transition_interval,expected", + [ + (np.array([1.0, 2.0, 3.0, 4.0, 5.0]), + np.array([0.99, 1.99, 2.99, 3.99, 4.99]), 1, 0.01), + (np.array([1.0, 2.0, 3.0, 4.0]), + np.array([0.95, 2.0, 2.95, 4.0]), 1, 0.025), + (np.array([1.0]), np.array([1.0]), 1, 0.0) + ], +) +def test_monitor_delay(sync_dset, stim_times, transition_interval, expected, + monkeypatch): + monkeypatch.setattr(ts, "get_real_photodiode_events", + mock_get_real_photodiode_events) + pytest.approx(expected, + ts.calculate_monitor_delay(sync_dset, stim_times, "key", + transition_interval)) + + +@pytest.mark.parametrize( + "sync_dset,stim_times,transition_interval", + [ + # Negative + (np.array([1.0, 2.0, 3.0]), np.array([0.9, 1.9, 2.9]), 1,), + # Too big + (np.array([1.0, 2.0, 3.0, 4.0]), np.array([1.1, 2.1, 3.1, 4.1]), 1,), + ], +) +def test_monitor_delay_raises_error( + sync_dset, stim_times, transition_interval, + monkeypatch): + monkeypatch.setattr(ts, "get_real_photodiode_events", + mock_get_real_photodiode_events) + with pytest.raises(ValueError): + ts.calculate_monitor_delay(sync_dset, stim_times, + "key", transition_interval) + + +@pytest.mark.parametrize( + "arr,cond,n,expected", + [ + (np.array([1, 1, 1, 2]), lambda x: x < 2, 3, 0), + (np.array([2, 1, 1, 1]), lambda x: x < 2, 3, 1), + (np.array([1, 2, 2, 1, 1]), lambda x: x >= 1, 2, 0), + (np.array([]), lambda x: x < 1, 1, None), + (np.array([1, 2, 3]), lambda x: x < 3, 4, None), + (np.array([1, 2, 2, 3, 2]), lambda x: x == 2, 3, None), + ] +) +def test_find_n(arr, cond, n, expected): + assert expected == ts._find_n(arr, n, cond) + + +@pytest.mark.parametrize( + "arr,cond,n,expected", + [ + (np.array([1, 1, 1, 2]), lambda x: x < 2, 3, 2), + (np.array([2, 1, 1, 1]), lambda x: x < 2, 3, 3), + (np.array([1, 2, 2, 1, 1]), lambda x: x >= 1, 2, 4), + (np.array([]), lambda x: x < 1, 1, None), + (np.array([1, 2, 3]), lambda x: x < 3, 4, None), + (np.array([1, 2, 2, 3, 2]), lambda x: x == 2, 3, None), + ] +) +def test_find_last_n(arr, cond, n, expected): + assert expected == ts._find_last_n(arr, n, cond) + + +@pytest.mark.parametrize( + "sync_dset,expected", + [ + ([0.25, 0.5, 0.75, 1., 2., 3., 5., 5.75], [1., 2., 3.]), + ([1., 2., 3., 4.], [1., 2., 3., 4.]), + # false alarm start + ([0.25, 1., 2., 2.1, 2.2, 3., 4., 5.], [3., 4., 5.]), + # false alarm end + ([0.25, 1., 2., 3., 4., 4.5, 5.1, 6.1], [1., 2., 3., 4.]), + ], +) +def test_get_photodiode_events(sync_dset, expected, monkeypatch): + ds = MockSyncDataset(sync_dset) + monkeypatch.setattr(ds, "get_events_by_line", mock_get_events_by_line) + np.testing.assert_array_equal( + expected, ts.get_photodiode_events(ds, sync_dset)) + + +@pytest.mark.parametrize( + "sync_dset,", + [ + ([]), + ([0.25, 0.25]), + ([1., 2.]), + ] +) +def test_photodiode_events_error_if_none_found(sync_dset, monkeypatch): + ds = MockSyncDataset(sync_dset) + monkeypatch.setattr(ds, "get_events_by_line", mock_get_events_by_line) + with pytest.raises(ValueError): + ts.get_photodiode_events(ds, sync_dset) + + +@pytest.mark.parametrize("deserialized_pkl,expected", [ + ({"vsynccount": 100}, 100), + ({"items": {"behavior": {"intervalsms": [2, 2, 2, 2, 2]}}}, 6), + ({"vsynccount": 20, "items": {"behavior": {"intervalsms": [3, 3]}}}, 20) +]) +def test_get_stim_data_length(monkeypatch, deserialized_pkl, expected): + def mock_read_pickle(*args, **kwargs): + return deserialized_pkl + + monkeypatch.setattr(ts.pd, "read_pickle", mock_read_pickle) + obtained = ts.get_stim_data_length("dummy_filepath") + + assert obtained == expected + + +@pytest.mark.parametrize( + "sync_dset, line_labels, expected_line_labels, expected_log", + [ + (None, ['2p_vsync', 'stim_vsync', 'stim_photodiode', + 'acq_trigger', '', 'cam1_exposure', + 'cam2_exposure', 'lick_sensor'], + { + "photodiode": "stim_photodiode", + "2p": "2p_vsync", + "stimulus": "stim_vsync", + "eye_camera": "cam2_exposure", + "behavior_camera": "cam1_exposure", + "lick_sensor": "lick_sensor", + "acquiring": "acq_trigger"}, + []), + (None, ['2p_vsync', 'stim_vsync', 'photodiode', + 'acq_trigger', 'behavior_monitoring', + 'eye_tracking', 'lick_1'], + { + "photodiode": "photodiode", + "2p": "2p_vsync", + "stimulus": "stim_vsync", + "eye_camera": "eye_tracking", + "behavior_camera": "behavior_monitoring", + "lick_sensor": "lick_1", + "acquiring": "acq_trigger"}, + []), + (None, ['2p_vsync', 'stim_vsync', 'photodiode', + 'acq_trigger', '', 'behavior_monitoring', + 'lick_1'], + { + "photodiode": "photodiode", + "2p": "2p_vsync", + "stimulus": "stim_vsync", + "behavior_camera": "behavior_monitoring", + "lick_sensor": "lick_1", + "acquiring": "acq_trigger"}, + [('root', 30, 'Could not find valid lines for the ' + 'following data sources'), + ('root', 30, "eye_camera (valid line label(s) = " + "['cam2_exposure', 'eye_tracking', " + "'eye_frame_received']")]), + (None, [], + {}, + [('root', 30, + 'Could not find valid lines for the ' + 'following data sources'), + ('root', 30, + "photodiode (valid line label(s) = " + "['stim_photodiode', 'photodiode']"), + ('root', 30, + "2p (valid line label(s) = ['2p_vsync']"), + ('root', 30, + "stimulus (valid line label(s) = " + "['stim_vsync', 'vsync_stim']"), + ('root', 30, + "eye_camera (valid line label(s) = " + "['cam2_exposure', 'eye_tracking', 'eye_frame_received']"), + ('root', 30, "behavior_camera (valid line label(s) " + "= ['cam1_exposure', " + "'behavior_monitoring', " + "'beh_frame_received']"), + ('root', 30, "acquiring (valid line label(s) = " + "['2p_acquiring', 'acq_trigger']"), + ('root', 30, "lick_sensor (valid line label(s) = " + "['lick_1', 'lick_sensor']")]), + (None, ['', 'stim_vsync', 'photodiode', 'acq_trigger', + 'eye_tracking', 'lick_1', 'acq_trigger', + 'cam1_exposure'], + { + "photodiode": "photodiode", + "stimulus": "stim_vsync", + "eye_camera": "eye_tracking", + "behavior_camera": "cam1_exposure", + "lick_sensor": "lick_1", + "acquiring": "acq_trigger"}, + [('root', 30, 'Could not find valid lines for the ' + 'following data sources'), + ('root', 30, "2p (valid line label(s) = " + "['2p_vsync']")]), + (None, ['barcode_ephys', 'vsync_stim', + 'stim_photodiode', 'stim_running', + 'beh_frame_received', 'eye_frame_received', + 'face_frame_received', 'stim_running_opto', + 'stim_trial_opto', 'face_came_frame_readout', + 'eye_cam_frame_readout', + 'beh_cam_frame_readout', 'face_cam_exposing', + 'eye_cam_exposing', 'beh_cam_exposing', + 'lick_sensor'], + { + "photodiode": "stim_photodiode", + "stimulus": "vsync_stim", + "eye_camera": "eye_frame_received", + "behavior_camera": "beh_frame_received", + "lick_sensor": "lick_sensor"}, + [('root', 30, 'Could not find valid lines for the ' + 'following data sources'), + ('root', 30, "2p (valid line label(s) = " + "['2p_vsync']"), + ('root', 30, "acquiring (valid line label(s) = " + "['2p_acquiring', 'acq_trigger']")]) + ]) +def test_get_keys(sync_dset, line_labels, expected_line_labels, expected_log, + caplog): + """ + Test Cases: + 1) Test Case with V2 keys + 2) Test Case with V1 keys + 3) Test Case with eye camera key missing + 4) Test Case with all keys missing + 5) Test Case with 2p key missing + 6) Test Case with V3 keys + + """ + ds = MockSyncDataset(None, line_labels) + keys = ts.get_keys(ds) + assert keys == expected_line_labels + assert caplog.record_tuples == expected_log diff --git a/test/internal/brain_observatory/time_sync_test_data.json b/test/internal/brain_observatory/time_sync_test_data.json new file mode 100644 index 0000000000..38260eb667 --- /dev/null +++ b/test/internal/brain_observatory/time_sync_test_data.json @@ -0,0 +1,20 @@ +{ + "nikon": { + "scanner": "NIKONA1RMP", + "sync_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_sync.h5", + "dff_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_dff.h5", + "stimulus_pkl": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_stim.pkl", + "eye_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_video-1.avi", + "behavior_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_video-0.avi", + "ophys_experiment_id": 501254258 + }, + "scientifica": { + "scanner": "SCIVIVO", + "sync_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_sync.h5", + "dff_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_dff.h5", + "stimulus_pkl": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_stim.pkl", + "eye_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_video-1.avi", + "behavior_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_video-0.avi", + "ophys_experiment_id": 547573479 + } +} \ No newline at end of file diff --git a/test/internal/conftest.py b/test/internal/conftest.py new file mode 100644 index 0000000000..94bc19245a --- /dev/null +++ b/test/internal/conftest.py @@ -0,0 +1,9 @@ +import os + +import pytest + + +def pytest_ignore_collect(path, config): + ''' These tests (or the code they test) can only run on the local network at the Allen Institute for Brain Science. + ''' + return(os.getenv('TEST_COMPLETE') != 'true') and (os.getenv('TEST_INTERNAL') != 'true') diff --git a/test/internal/core/__pycache__/test_mouse_connectivity_cache_prerelease.cpython-37.pyc b/test/internal/core/__pycache__/test_mouse_connectivity_cache_prerelease.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6ec820b93d104b4460e71a6a733bb270e9eefb4 GIT binary patch literal 5712 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 K)$RJ+;Qw#G$fL#p literal 0 HcmV?d00001 diff --git a/test/internal/core/test_mouse_connectivity_cache_prerelease.py b/test/internal/core/test_mouse_connectivity_cache_prerelease.py new file mode 100644 index 0000000000..6d978b55ff --- /dev/null +++ b/test/internal/core/test_mouse_connectivity_cache_prerelease.py @@ -0,0 +1,204 @@ +import os + +import mock +import pytest +import nrrd +import numpy as np +import pandas as pd + +from allensdk.core import json_utilities + +from allensdk.internal.core.mouse_connectivity_cache_prerelease \ + import MouseConnectivityCachePrerelease + + +@pytest.fixture(scope='function') +def mcc(fn_temp_dir): + storage_dirs = {"111" : os.path.join(fn_temp_dir, "111"), + "222" : os.path.join(fn_temp_dir, "222")} + + file_name = os.path.join(fn_temp_dir, 'storage_directories.json') + json_utilities.write(file_name, storage_dirs) + + manifest_path = os.path.join(fn_temp_dir, 'manifest.json') + return MouseConnectivityCachePrerelease( + manifest_file=manifest_path, storage_directories_file_name=file_name) + +@pytest.fixture +def experiments(): + return [{'id':111, + 'age' : "10 wks", + 'gender' : "M", + 'project_code' : "Connectional Atlas", + 'specimen_name' : "", + 'transgenic_line' : "", + 'workflow_state' : "passed", + 'workflows' : ["2P Serial Imaging"], + 'structure_id' : 184, + 'structure_name' : "Frontal pole, cerebral cortex", + 'structure_abbrev' : "FRP", + 'injection_structures' : [ + {'id' : 184, + 'name' : "Frontal pole, cerebral cortex", + 'abbreviation' : 'FRP'}, + {'id' : 993, + 'name' : "Secondary motor area", + 'abbreviation' : 'MOs'}]}] + +@pytest.mark.prerelease +def test_init(mcc, fn_temp_dir): + manifest_path = os.path.join(fn_temp_dir, 'manifest.json') + assert os.path.exists(manifest_path) + + +@pytest.mark.prerelease +def test_get_projection_density(mcc, fn_temp_dir): + eye = np.eye(100) + eid = 111 + path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'projection_density_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_projection_density(eid) + + with mock.patch.object(mcc.api.grid_data_api.api, + "retrieve_file_from_storage") as mock_rtrv: + mcc.get_projection_density(eid) + + mock_rtrv.assert_not_called() + assert np.allclose(obtained, eye) + assert os.path.exists(path) + + +@pytest.mark.prerelease +def test_get_injection_density(mcc, fn_temp_dir): + eye = np.eye(100) + eid = 111 + path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'injection_density_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_injection_density(eid) + + with mock.patch.object(mcc.api.grid_data_api.api, + "retrieve_file_from_storage") as mock_rtrv: + mcc.get_injection_density(eid) + + mock_rtrv.assert_not_called() + assert np.allclose(obtained, eye) + assert os.path.exists(path) + + +@pytest.mark.prerelease +def test_get_injection_fraction(mcc, fn_temp_dir): + eye = np.eye(100) + eid = 111 + path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'injection_fraction_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_injection_fraction(eid) + + with mock.patch.object(mcc.api.grid_data_api.api, + "retrieve_file_from_storage") as mock_rtrv: + mcc.get_injection_fraction(eid) + + mock_rtrv.assert_not_called() + assert np.allclose(obtained, eye) + assert os.path.exists(path) + + +@pytest.mark.prerelease +def test_get_data_mask(mcc, fn_temp_dir): + eye = np.eye(100) + eid = 111 + path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), + 'data_mask_25.nrrd') + + with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' + 'retrieve_file_from_storage', + new=lambda a, b, c: nrrd.write(c, eye)): + obtained, _ = mcc.get_data_mask(eid) + + with mock.patch.object(mcc.api.grid_data_api.api, + "retrieve_file_from_storage") as mock_rtrv: + mcc.get_data_mask(eid) + + mock_rtrv.assert_not_called() + assert np.allclose(obtained, eye) + assert os.path.exists(path) + + +@pytest.mark.prerelease +def test_filter_experiments(mcc, experiments): + + # ------------------------------------------------------------------------ + # test cre + cre = mcc.filter_experiments(experiments, cre=True) + wt = mcc.filter_experiments(experiments, cre=False) + + assert not cre + assert len(wt) == 1 + + # ------------------------------------------------------------------------ + # test injection_structure_ids + sid_line = mcc.filter_experiments(experiments, injection_structure_ids=[184, 98]) + + assert len(sid_line) == 1 + + # ------------------------------------------------------------------------ + # test age + pass_age = mcc.filter_experiments(experiments, age=['10 wks', '12 wks']) + fail_age = mcc.filter_experiments(experiments, age=['12 wks']) + + assert len(pass_age) == 1 + assert not fail_age + + # ------------------------------------------------------------------------ + # test gender + pass_gender = mcc.filter_experiments(experiments, gender=['MALE']) + fail_gender = mcc.filter_experiments(experiments, gender=['f']) + + assert len(pass_gender) == 1 + assert not fail_gender + + # ------------------------------------------------------------------------ + # test workflow-sate + pass_ws = mcc.filter_experiments(experiments, workflow_state=['qc', 'passed']) + fail_ws = mcc.filter_experiments(experiments, workflow_state=['failed']) + + assert len(pass_ws) == 1 + assert not fail_ws + + # ------------------------------------------------------------------------ + # test workflows + pass_w = mcc.filter_experiments(experiments, workflows=['2P SERial ImaGing']) + fail_w = mcc.filter_experiments(experiments, workflows=['trans-synaptic']) + + assert len(pass_w) == 1 + assert not fail_w + + # ------------------------------------------------------------------------ + # test project_code + pass_pc = mcc.filter_experiments(experiments, project_code=['ConNECTIOnal Atlas']) + fail_pc = mcc.filter_experiments(experiments, project_code=['not a code']) + + assert len(pass_pc) == 1 + assert not fail_pc + + # ------------------------------------------------------------------------ + # test a bunch + conditions = dict(injection_structure_ids=[184, 98], + age=['10 wKS', '12 wks'], + gender=['maLE'], + workflow_state=['qC', 'pASsed'], + workflows=['2p serial imaging']) + passed = mcc.filter_experiments(experiments, **conditions) + + assert len(passed) == 1 diff --git a/test/internal/gbm/__pycache__/test_generate_gbm_heatmap.cpython-37.pyc b/test/internal/gbm/__pycache__/test_generate_gbm_heatmap.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..582a5b42d157680541d04773333a5a1e04c8d5f0 GIT binary patch literal 3559 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 literal 0 HcmV?d00001 diff --git a/test/internal/gbm/test_generate_gbm_heatmap.py b/test/internal/gbm/test_generate_gbm_heatmap.py new file mode 100644 index 0000000000..fe1a82fce9 --- /dev/null +++ b/test/internal/gbm/test_generate_gbm_heatmap.py @@ -0,0 +1,112 @@ +import pytest +import allensdk.internal.pipeline_modules.gbm.generate_gbm_heatmap as heatmap +import pandas as pd +import os +import numpy as np + + +TEST_DIR = os.path.dirname(__file__) +TEST_GENE_FILE = os.path.join(TEST_DIR, "test.genes.results") +TEST_TRANSCRIPT_FILE = os.path.join(TEST_DIR, "test.isoforms.results") +TEST2_GENE_FILE = os.path.join(TEST_DIR, "test2.genes.results") +TEST2_TRANSCRIPT_FILE = os.path.join(TEST_DIR, "test2.isoforms.results") + + +def test_create_transcripts_for_genes(): + + analysis_run_gene_file = {"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": + TEST_TRANSCRIPT_FILE, "rna_well_id": 300173630} + + data = heatmap.create_transcripts_for_genes(analysis_run_gene_file) + d = [["gene_id", "transcript_id(s)"], + ["1000", "NM_001792_3"], + ["124989", "NM_001195192_1,NM_152347_4"], + ["100008586", "NM_001098405_1"]] + expected_data = pd.DataFrame(data=d) + assert(expected_data.equals(data)) + + +def test_create_genes_for_transcripts(): + + analysis_run_transcript_file = {"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": + TEST_TRANSCRIPT_FILE, "rna_well_id": + 300173630} + + data = heatmap.create_genes_for_transcripts(analysis_run_transcript_file) + d = [["transcript_id", "gene_id"], + ["NM_000015_2", "10"], + ["NM_130786_3", "1"], + ["tRNA-Tyr.100009601.chr14", "100"]] + expected_data = pd.DataFrame(data=d) + assert(expected_data.equals(data)) + + +def test_create_gene_fpkm_table(): + + analysis_run_records = [{"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": + TEST_TRANSCRIPT_FILE, "rna_well_id": 300173630}, + {"analysis_run_gene_path": TEST2_GENE_FILE, "analysis_run_transcript_path": + TEST2_TRANSCRIPT_FILE, "rna_well_id": 300173634}] + + data = heatmap.create_gene_fpkm_table(analysis_run_records) + d = np.column_stack([["108.14", "5.10", "0.00"], ["11.05", "21.41", "11.57"]]) + expected_data = pd.DataFrame(data=d, columns=[300173630, 300173634], index=[1000, 124989, 100008586]) + assert (expected_data.equals(data)) + + +def test_create_transcript_fpkm_table(): + + analysis_run_records = [{"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": + TEST_TRANSCRIPT_FILE, "rna_well_id": 300173630}, + {"analysis_run_gene_path": TEST2_GENE_FILE, "analysis_run_transcript_path": + TEST2_TRANSCRIPT_FILE, "rna_well_id": 300173634}] + + data = heatmap.create_transcript_fpkm_table(analysis_run_records) + d = np.column_stack([["10.00", "100.00", "100.00"], ["0.00", "100.00", "0.00"]]) + expected_data = pd.DataFrame(data=d, columns=[300173630, 300173634], index=["NM_000015_2", "NM_130786_3", + "tRNA-Tyr.100009601.chr14"]) + assert(expected_data.equals(data)) + + +def test_create_sample_metadata(): + + sample_metadata_records = [ + { + "structure_name": "Microvascular proliferation sampled by reference histology", + "structure_id": 309780906, + "structure_color": "ff330", + "block_id": 703397, + "polygon_id": 298726077, + "specimen_id": 297710593, + "tumor_name": "W1-1-2", + "rna_well_id": 300173634, + "structure_abbreviation": "CTmvp-reference-histology", + "block_name": "W1-1-2-D.2", + "tumor_id": 703393, + "specimen_name": "W1-1-2-D.2.01" + }, + { + "structure_name": "Cellular Tumor sampled by reference histology", + "structure_id": 309780592, + "structure_color": "5d04", + "block_id": 703397, + "polygon_id": 298727153, + "specimen_id": 297710593, + "tumor_name": "W1-1-2", + "rna_well_id": 300173630, + "structure_abbreviation": "CT-reference-histology", + "block_name": "W1-1-2-D.2", + "tumor_id": 703393, + "specimen_name": "W1-1-2-D.2.01" + } + ] + data = heatmap.create_sample_metadata(sample_metadata_records) + d = [[300173630, 703397, "W1-1-2-D.2", 298727153, 297710593, "W1-1-2-D.2.01", "CT-reference-histology", "5d04", + 309780592, "Cellular Tumor sampled by reference histology", 703393, "W1-1-2"], + [300173634, 703397, "W1-1-2-D.2", 298726077, 297710593, "W1-1-2-D.2.01", "CTmvp-reference-histology", "ff330", + 309780906, "Microvascular proliferation sampled by reference histology", 703393, "W1-1-2"]] + + expected_data = pd.DataFrame(data=d, columns=["rna_well_id", "block_id", "block_name", "polygon_id", "specimen_id", + "specimen_name", "structure_abbreviation", "structure_color", + "structure_id", "structure_name", "tumor_id", "tumor_name"]) + pd.testing.assert_frame_equal(expected_data, data, check_like=True) diff --git a/test/internal/morphology/__pycache__/test_apply_affine.cpython-37.pyc b/test/internal/morphology/__pycache__/test_apply_affine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3816b49ca0f84550614b3dba1a92ca4f14db8a78 GIT binary patch literal 934 zcmaJ<y>1jS5cYU~ZwZG&K}dr{1sB0Zhz=n{2y~DJA*9u!le2d2mfJsUC)~nr0pS7i z02GO+5Iqm$mg-)C2F8~}929so;~CG)H{-D%UA!0(T;-P!?3+W#4{Mw+ipoP|bqfV2 z9C8xdo#s%`n1a=v+$r4HMcw7zClY%co|Az;#|*MF024i{WId_!YTTgZ?o?c))@N4_ z`2zAbvigofV+~G`Ejiph4Df_<#6+Uja~O<iM>MqL5IQ*XEbZf7w}|5~b~>k}t+Pft zw}oTcx+j2LS~Oe1v$<ni54it1>bw?SJDjeQ&Yx|x-m!Z^9+Ows650h_*oN9W_FKOV z*2xJ>sXEfZM|gAe5+{JS4R$18_w$9oA(HtoTys0VL1bvgjjNkl7?>Go47`hd$#}M} zj9)V;N^Qb)lI0xLIM7mvQO4tbS{3Nk1^Uq*gwg^_iy5!5y3U&s+uO@ZVR|Lbbd+aG z8!ywMu&|95O2<CN$!cc$TS^J3v#NX|WhDnadC9_fg?*aXQz^?4MoU(zoN0l13*@*j zX0=GQ;3He&PTa3{HN%o;wsEGSG2Q{o_r+HtuOQ~n_uKc97g$UsY{K|(m%U|WlWdhN ztxC@BCZar0NmYwdr6{X<(x~KVwwoyI{C3UKDH{vS&2x<4(@lGg&8*ZymMq^~^t<>< z3&&`A48yuHt2X?v(*S!?8z>0egpm5+LxdDU<WTsRLK?wkkXJE!;LBCq;v46k49}Yw t{%K-KJ$;w!|BbdYJbgr4VKJ^Hv4&?RykAs&KNk<|Pf|XLkgmXr^Bc-e0^tAv literal 0 HcmV?d00001 diff --git a/test/internal/morphology/test_apply_affine.py b/test/internal/morphology/test_apply_affine.py new file mode 100644 index 0000000000..666c9aa6cd --- /dev/null +++ b/test/internal/morphology/test_apply_affine.py @@ -0,0 +1,32 @@ +import pytest + +from allensdk.internal.morphology.morphology import Morphology +from allensdk.internal.morphology.node import Node + + +def test_apply_affine(): + node_list = [Node(0, 1, 0, 0, 0, 3, -1), Node(1, 2, 0, 0, 1, 1, 0)] + morph = Morphology(node_list) + + scale = [2, 0, 0, + 0, 2, 0, + 0, 0, 2] + translate = [1, 0, 0] + affine = scale + translate + morph.apply_affine(affine) + + # was at (0, 0, 1) with r = 1 + expected_node1 = {'id': 1, + 'type': 2, + 'x': 1, + 'y': 0, + 'z': 2, + 'radius': 2, + 'parent': 0, + 'children': [], + 'tree_id': 0, + 'compartment_id': 0} + + obtained_node1 = morph.node_list[1] + for key, value in expected_node1.items(): + assert value == pytest.approx(obtained_node1[key]) diff --git a/test/internal/mouse_connectivity/__pycache__/test_interval_unionizer.cpython-37.pyc b/test/internal/mouse_connectivity/__pycache__/test_interval_unionizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6a8d8b0583d0394bc28149efa21172d847bc887 GIT binary patch literal 4063 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 literal 0 HcmV?d00001 diff --git a/test/internal/mouse_connectivity/__pycache__/test_tissuecyte_unionize_record.cpython-37.pyc b/test/internal/mouse_connectivity/__pycache__/test_tissuecyte_unionize_record.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c91814b309e80cfdee7f47fa44f36662a5c1923f GIT binary patch literal 4343 zcmZ`+-H+T>75BaNcs_P^c6N8NAK8$Gh_9*IO#mUPDoWb44XsF5L8U5K8;mp8*?8CE znOu9ev(YSqZ2AUL5j>%)+JP57B={eA;e}@&EFKU%!2AbQp7@<(k7u$3k9>UZIp=!r z{hd$WTwJUfxT4?u#QSW;F#bi8=~cquHQe#vK$M|GXmo`m1dU}V9h0AyWAU@(l<+h| zyIXe3tYd|hZq=#sxD?j93(i8f?$o=B&Z01UYrmmvRsNY!6;*v=oCs%0)zrch!)Zdc ze7d6Qc;Dil981+uORTY)OPYmbS*@_7rB+o7YtQ8x=hT{7<F)H*gEiLFraBLeb+x4~ z;JKmXdq(?n6P(Rxi?pJG!ypcN(GDinAn`TsZj6aN)Lyjbx6O3zyFnZe{LWG0-}GYt z{Rry8BR}1m@!yH|{Z0aYA-pgX-qF3Y(#rio#QJUFl;TdW?{{cJbeXspaKC{&{w+vi zoC+nz;u!Fc0JSnclGkQj0j>Zr)-zlQt^~J4+>tSoc#EXBOrOeb(L2oPd}NGCr<jvG z=kdR*GVAjgdKu49m5=16p{k!$0cve$qOe~rKqi|+zD?v75eX7J!PzEX!>C<#R)Q&H z?tSes7S5XI9lHLo6As8C1wUQs7YMq_kK!OXN|)z&e&p-DBWHQ`%3RB7&RCgJT8jr= zw;v4sFm}!rV>gHresSQ(&I_|e&sAt!sf_xL)r<T%wLNx|w9*}fNzf0E+NLA#KXhdH zFg252|96I7!-=2%{Eb(4-;aGA?|KhBwSCX~(2I_CUyr;_FH+vucm3!v-i04T><zvC zgQIx&c5rVOhxK3Xdz}Ms&&S#@goZk}lK63Qg*L4tFTB$24PxKLn<DbUL*T;-Zc;d| zJIKA()qba^)pq|VT~J=)xt`YEQQW{D<BK4MSrc_Ry`_+%BI=?kTA&r7H=t3tDjC(n z&93?q28nTE92>(+iLo!<H14h)iv%t^5+`uI0~t3G^Ral?_yCy%?jm>CQ`(lMjFVPf zHx7GA?7C@r&riH0(P`uL7?4q1y`^<ew<RFGH%KjtQHC`m>$JW>khu2{pfF~Td<neR z1~H_Kt!p}4TK1xj+dWhha?uVEy5N<3^Dz=k_!#i;k#IS>Tt0-0*ue3mGDi}83skBS zDCVcu2(cw_)P13B9QEy_^cd^+O;tXS`W{AzNbvi_j~YC;rgMg)vNNgUzjYO4LWpRx z$sTT8|F|((#zS8MY1<5#CPuo{^@i?Y5AKXpD}R_S&luBCsUlSR-kt|%*`oEPegO|h zdQmDn56<GaI>WJ8_cHY3^B{(43;qGr>{*iycuQ02uRxlbalc>SO0H43#|V=mZ^$j< zSO7<$m}N6nI+lq9x+dJk1fnJ(IzkZurUoIZcSq)aiO`I1CpNG(_sgn+*^p+@1(uqa z?-x><v6S(x?r5rc6Y}6JMJ>_j^F%IzOz3=jfA~FJ|Gd$zXw*eRuM%PZ%#y_{5#>2# zG4>O;z+8WU^a*ACMG*LQ8;{gdh_ciSdmrixB%_Ql=ep}N$e(%Jn^22M*DxFKVT(bp z%Zg|K@P^P=At{2fj0tU&y||Bog6}>7=E^)lFrHBTuz)%tEf{I@6qREH-yWOC*6><l zjx5r=dv#YHmyYek8rdhAH{W4zwomP`F)C4IP~~+4=)OYyhp*%TUD+v2Pnm%>^B(S) zjvT;@cU#B@R62|?LSr4l@(cOULM9LsvP@gfAV;Lj?W?H_f-_h>tzA<=C+YOM{p;VS zm(xGl#-kVKAPj?!pQp9$YhkbBh4J<6*|JFsOY~)sNrec7|AdU)E^BgEHn&rc=U$^p z2ln$Lwk_Oz&~29;<bKMX`U**{2f^M0Hg789Fck->I6SlYbnW@O`~d6YCWs+dgvEAl zVAK@)26&Gy6;&vHiHB#M5Xez3(~BS-0)#F)3Z0Mr;TGgs_M%?E1^h~E(TF|3HK|*0 zEzWEu&TKYvT3Nx?s+?3#tEw^<V++w~s_G_3WQ*+oy`)BwsA}K|wZObE=hc}9UxD6_ znTNLSz|x;Wzd^E*u|={!k}PUwTxjGRL_KN$75pW181Pco{(GTKT+(I^{++a+Lc7V@ zI2~l4vGz*Nh4#lHuJc|@wG6!#=3LA<s|Dw3&S@2#o5bNfa&Cul<~$wz8;-%*Lw^-e zbAyBQO5+&`{sX1dKJ0~qu8;mRKm|_Rx%MTK1b>E&ocXpU<7cMjTtzP8wB}Y$yOtxg z*hL)}P8`yk<2)mN)Lxj?59dO@o#*<Mro5kCe4eamn2xfPN7*j5dxNAuNM>Q2)f<aT z6~8Qt4-<N4L!&thjqEKx-WYF#pynX))u`T30+egAg>IyUG`J?4b94nEvm*3cSn*6A zq9%ZY;71r_rF|r*fhDIJn_RR})Zs3dsXsw!wv?5WPHkwE#t4J4!A|^IF0Cm0Inp2G z(khpzFrU?U_K0SAk=NhAE+%(Cf?uM7v&(Q{3M$Cp`b7v}Alh?UMds=ZLaN(T>$9># zCYb~HRhr%;!j*^2fNVfD4y{r!IE(TIqde<xi+}hjR&W!Db_o@|AufuGRASx%zd#dy zj9i<e`D+X)n~$lK12r^5NG3=nDC;ipqgDw?#72oPQ4ct_fV4y#MD5Y_qzt4bwMU#@ zEF>6tS|g;D+@R3?VXk4R>i=k%tnoP4SWq?Sf1J<iJo}VpjQGM%7N3+G^*4!-0rV}9 z;4gog8h|=4Ho%13r@fe3-CpOwslMy&1)X;>oO5ADo2sq;77;G?vtEG>GP8xrw$N`w z(=iboXAQE+2AK=#!Xm%IlC1c{$Fp9`=CXfTTqeuhhP=I*)?D}gAQ@=ibv31arxXpk z{Ude}$L`~sHBK~rhoNW%LoQ@a6{GEL@6eCA;5px!epYNxzbGI*`$dt-4!yAWl-U0N zpBGt%Az#silvBPR3~7@Y8r+LpT~8l43w?Y)b^S!+gPL1NZfdyhaU`<?@>%DQ<MxT0 o{>rs(PYpu<I@LdJG^jnIUmagDtx{{FQa-<aeznp#|K&>Kzj=Kl%m4rY literal 0 HcmV?d00001 diff --git a/test/internal/mouse_connectivity/__pycache__/test_unionize_record.cpython-37.pyc b/test/internal/mouse_connectivity/__pycache__/test_unionize_record.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4585b9edd2ad32ebc4337b41557e9d5913352d17 GIT binary patch literal 682 zcmZWmO^?$s5Vf5&NlVKGiT}_8?Ey{*t$-CPA)!iuRv;^q<;LFDo5YT6r>mgd!>WiY zf1wp8{!*@-_zRqvq;!Q~q<J2H%)F=Pmy^i|LFjL{JjV$A=r+fQp?D7IP5=ZFxIpx< zVv1o;3Q`6%z(}IYa5oTv2*p4|B3^}iA`&tDjJB9Y0>4Mo(NCCx7E|0N=UN%9KFKyJ zrC%G-CX6YqJY#g2@gl1W?qxfytf}~_D<f0;s`eS^>w^FeAx|OQ69A8P*pofJ!9Li9 zez3=1A7bRAYkZBiL|{R-1fvh2{VjTjKEeu$f&~pOjG^I$a_eafEXzxo`8H-u%PYog zN7F`C<E8U7vRpao+6N2cUzb%OOR2pSudFq;jaSlh@9mV>0GcSN^><{)Q2zRI`ZPUv z(z=wdxtJ~a71vGrLi5aM!5^nmZ(M3Bsa*zWs&(ViH)@$W<>jM_XE|R<=q(C(A@X^r zWv+nPYF^AsQ#;9Ek_O>wqkPjpVD%q|nU$HbVpcWnr0cx9=-hJ=018HAjO~4>rm^jg zX;_*pr)NjX*^zDbKilDM!;8DYvwx@$CWa-qIlWhL%i+r{{C&^ZJM<S!fWA$hl}6Ns OJn5Y5H6}PA<KQ>!S;kHP literal 0 HcmV?d00001 diff --git a/test/internal/mouse_connectivity/test_interval_unionizer.py b/test/internal/mouse_connectivity/test_interval_unionizer.py new file mode 100644 index 0000000000..66ac2c6665 --- /dev/null +++ b/test/internal/mouse_connectivity/test_interval_unionizer.py @@ -0,0 +1,120 @@ +from __future__ import division + +import numpy as np +import pytest +import mock +from six import iteritems + +from allensdk.internal.mouse_connectivity.interval_unionize.interval_unionizer \ + import IntervalUnionizer + + +@pytest.fixture(scope='function') +def annotation(): + + annot = np.zeros((10, 10, 10)) + annot[:, :, 4:] = 1 # 4 off, 6 on, ... + annot[5:8, :, :] = 2 # solid block from 500:800 + + return annot + + +def test_init(): + + iu = IntervalUnionizer([1, 2, 3]) + assert( np.allclose(iu.exclude_structure_ids, [1, 2, 3]) ) + + iu = IntervalUnionizer() + assert( sum(iu.exclude_structure_ids) == 0 ) + + +def test_setup_interval_map(annotation): + + bounds_exp = {1: (280, 700), 2: (700, 1000)} + + iu = IntervalUnionizer() + iu.setup_interval_map(annotation) + + for k, v in iteritems(iu.interval_map): + assert( np.allclose(v, bounds_exp[k]) ) + + +def test_extract_data(): + + iu = IntervalUnionizer() + + with pytest.raises(NotImplementedError): + iu.extract_data('olive', 'reticulated', 'western_woma') + + +def test_propagate_record(): + + with pytest.raises(NotImplementedError): + IntervalUnionizer.propagate_record('olive', 'reticulated') + + +def test_propagate_unionizes(): + + uns = {1: {'a': 1, 'b': 2}, + 2: {'a': 2, 'b': 3}, + 3: {'a': 3, 'b': 4}} + + amap = {1: [1, 2], 2: [2], 3: [3]} + + def dummy_prop(cls, c, a): + return {k: c[k] + a[k] for k in c} + + IntervalUnionizer.propagate_record = classmethod(dummy_prop) + ou = IntervalUnionizer.propagate_unionizes(uns, amap) + + assert( ou[3]['a'] == 3 ) + assert( ou[2]['b'] == 5 ) + assert( ou[1]['a'] == 1 ) + + +def test_postprocess_unionizes(): + + iu = IntervalUnionizer() + with pytest.raises(NotImplementedError): + iu.postprocess_unionizes('foo') + + +def test_sort_data_arrays(): + + data_arrays = {1: np.arange(10), 2: np.arange(10, 20)} + sort = np.array([3, 1, 5, 2, 6, 4, 7, 8, 9, 0]) + + iu = IntervalUnionizer() + iu.sort = sort + + obt = iu.sort_data_arrays(data_arrays) + + assert( np.allclose(obt[1], sort) ) + assert( np.allclose(obt[2], 10 + sort ) ) + + +def test_direct_unionize(): + + data = {'savu': np.arange(1000)} + im = {1: (280, 700), 2: (700, 1000)} + + + with mock.patch('allensdk.internal.mouse_connectivity.interval_unionize.' + 'interval_unionizer.IntervalUnionizer.sort_data_arrays', + new=lambda s, x: x): + + class IU(IntervalUnionizer): + def extract_data(self, d, l, h, **k): + return d['savu'][l:h].sum() + + iu = IU() + + iu.interval_map = im + + obt = iu.direct_unionize(data) + + assert( obt[1] == np.arange(280, 700).sum() ) + assert( obt[2] == np.arange(700, 1000).sum() ) + + + diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_projection_functions.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_projection_functions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f44eda3ad2641b3cadf72ea69028c51dba28a3c GIT binary patch literal 1390 zcmZuxOK%e~5VpO~zCsJ7JP(|Zf<$@%A%PI0R6HtBFMx!sl_EEGlWq4U+bIc34m_^> zhen74e`&9r@)tNU<Fr)^^~z(9Ju{y9W@eu)EzJ`c#gEUT=@If9nd1RGc?#2P1Cd11 zjPTh?Idi<neOOr*<ROnJQDiTcp7g(wuawWpK!)E4pO=x0VO@}Oavs)2N#By@!W3+h z?Ix{PD_!oXj!ny=z1uI`#&qx&2Zb5H+=OXv1F>X}N(z)o_MIJi@E&|!Z$ih!`iH@Y zOwhi+J&i%SNqHdcuu@ZoTv)TB;-S!@=qeuVW~HzX?(;}1(-W1deUsXKzVcGptz2}~ z3ti?LT8kmL83^3`A{x#9`MLQhd2f_9iRcO0+7TZ`F-$fJ(J2cl?j@=?FiBad!gPR^ zRc~mLH|b6S_SM}=boRkI=w=y6$o+Mzj9pI)t8^i<^}OsG)doui!g7$>p%ZAI0?PLK z`A#9y?7y262wT;#Zm5CCt4y^I%B-KOIdI+hKnS}@H75QH&X{k9^L5x*atJshsw2qo zJ~L~UeW8*7w%)czBN}tl^lGotyL=JcJy6=V#UM3xW5WPAn9}E3mm1*n${p*Vn-TP+ zUcs<2&J)E8aD3$8Jk<^0I`{|<EP|6lNPs~H!8JNz2^-Tfvset^a+gi0WLL=8gA*Ui zvCFU&y9{r}KAZ+4Z^S0dyt3gJ>Ue(ycFYIlU5L>v#3{Z$#bBrS_B2Ei0cl2h0T$lK z#o$z4G)mRMC#6fHQI5xu<4#rr8jGkFIMjKBYJdndiK=Yx^i~b3+FiruU%)Ooz|KB- z8O$2j!)%#dq-$)M>NPk!0S>c@e!I-xfz2^+5;|z&j}ZXup|dbSe?z8^V9=PC=`xaQ zNLGR96(CK21_L+-WhSip7YheM({oYlCD5q7bK<({;yTC1Ezmfs2MFs1zPQB0YKZcD z?rn;-z4h+3#`t(p^z&-yQotV`w^r-8t6KkeRqMQl()gp8MHTI)1KZbX<~>%UL)Q6m iDmC~+(5|54$9XCHnR<d{V^ASxF^$=x*9hY<Uib@waat7s literal 0 HcmV?d00001 diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_visualization_utilities.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_visualization_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6130ee6be9ca5ef16577955e7afbd6fa490146c GIT binary patch literal 2202 zcmZ`)&2Jnv6!*u>>|~p48>oPYQo^@Zlx+p55-6lC<wI3bkO*)XEn3a4oyj!bnZfp^ z-Dp<=T8<p}4-#>KzX9=2a6y;@NL;!%&b^fPJV}~{;+3DDJ#U}=e*V4ZcNZ3#1X}UK z*XdUwA%ElKpm9(xLpKV9Ac88A)FVxppYtT}W0*uRGSwKy$s8q;+-M3ef;;3kO-}e( zC?Y?b7Yz~LA<2T66HORf;)Ixo@uXM~Ef`M;x=z|BXRsq#Yg6~+c5X(g%6C$mmql-6 zbCug%ngJSMqtM~t<SKOYG6+j<P(eX5!M<a=91kMGjPKDYvB7RQA$zz*v^M({tlKmR zg&kLNhE8S?iUzJnjun-QQk@o=Od1=iOzp)tlZKXNGp(cxOm4T5#Sf*uHcT`5fi8zv zv`)uxW}a&O6VWHY&AlJ5zTN%INNu|5W-2=U^k!O&yH|>IP!=M6qbrMT(=97mm;uPL z+8mqiM|r;s-sNjmI@ki=@L#3CLTsJ4(%AEPVWloob$(cmjO>A@LJn-co!hZD=vBJB zfhz!*-5d@3MVhPn%m1L+sm87)Z>7UZ$=-IUMnj3GHvtI3&QQGo<00h8i$lm)VPeTH zK<)wF*MJSchi~~3nZi}<GJ)_jyofu*@(G#H3A@eT1Af$3aUZ<Q?n9g5g%0pivElx> z(>io>21G_C<crf?J_T=6j$S4_<KMF{gY_D4k9s?BtaHIp?P%s`->=nT9(>$uuBhDD zK{>2epFqb9L_~I;6S)~^X#vq;T6I=bIY^aR1?9lH9cbi+jzPF^N9xizzLQsN?zoo1 zg_)MJa6w;<<grcN!b9E{abI*pSd*TnO{$*;{h_!qc2DZ(K|zF(xKla-q;DgZfT<^T zFy#UO0zzkC2<`5rTDhBDu9d$&-dEt`zRf?E+RSlaL$U<)*_PV&9-OaKr3M5bT0B$| zARLaDee1ZqRUHrPEOHV__-HRn;KE>95!z%i)z5-<80SMw`W(JsoEDN6W5s9><7Pf} z8L|j9WZMKVSRpo=03H-a=Eq>S0j!{V%zR?wZ>YzHuVp{~^4sr!PX2hO%{8*?foRX^ zIaqL*%07cJm3>ZYWLz?jiQY5mhU}@r-@oIk%v@M$NJJMyZVpswq-$L<km#6o?`vIZ z*a)*mKZ62`>~Y{0J#a_8FN2k7fgtP@pw*-;KrCkZC0IGc4B6U%?zwRRlo}&JYewva zfEps`@e?8NC0Zg|%$&2qJ{pa+89JFE!)C9e5GbyLIEu~;Z>JsBC_G*uC!h|?9+sa1 zjy?9c>1D9eFQO?s5-^sJ2Px;C^07X`M+fX`da%bJWPJ|i1L(ft0g*aB)Cv>~6|Wvf zOaPksB*<6>#K;)bce2Y5Z1$)Kq3$z~@Ew0sgs5H#{JbU=6r(*TCh$L?(1ZhVlx^%o z6|HG}Q)ZqruY#suL4nhD?8%UDIhHPjlAn%~XhY?d(lumZABwinFW?_MK0y-Y_*NL# zxGD2&(;9siKYE571FY!*^ByjOjq$HETc*pvjCrc@-rI{wRE^OtnOo1XbYJ`Qy1$bo zEJnj>T%WHwOl_q~tMY!r!76#{;5F$SJS3g}J|vw-y&)QDQwP`B$Zy$^mi3imo$#6M rsp>D$AMps~eSBDcUA!_Z#Yo9jMA4iE5p$q95PhDvqE;L?Vi5lVnnn_k literal 0 HcmV?d00001 diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_projector.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_projector.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ea74a265ff59fb8e4817f59786769aa418f11fd GIT binary patch literal 2912 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 R<(y+Xh0TIfd}qli{0pi^i2DEl literal 0 HcmV?d00001 diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_utilities.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71a159831c0b86751bddbca3facd38cccf64b1c3 GIT binary patch literal 3060 zcmb_eOK;mo5aupPiIQzuaU92XTE{4gv}_ZlNQ0m#f;<{DMf%X8X?h?8sI+z?GZr6R zuH49w4sCMi&ydhl{}N9Hda3?F(NkxJ5^XC^dMOFca`rj%&Fr`P*~&`QfG7IxXa85n zF#bek{(x@WgD?FHgfIl_8D3s8kCSeC7L|5b;s!IqGD(MI#j7$y8qbyl7v@Xj1@o3k zvxH6BiYSTlOT()PM^vC(6;-hWWgU8*8?T9Fu_9_+TxYe*pK?(nZ8g`re8NRtoTHh} z&qk~XXoYrD^6|Q;O&E+?5$C&{^mWu}+y${g<1UDcViQ)}5L;p!%8P<MHrz{7@YZN{ zP~yYjE5Y{wzH|eGHpWaa^hz7g_{16+Lj%TH%_)c0sfoe@;hLG12KpegABBEbdP}H0 z?8Uymb<<^;8HC;64TT{8GkNf7>q#nA+Vb~((b)5U@}oiPe&l!JNcbPOWOSIe;zUMi z2V|V=57O4x!Cnhyl-Cl!a{%+h*j^8Mh=c1|ruupiX{jQ=cRh^zscgeck?iQ;Fwg_) z&`wnR3~S=3t@r!kUgQV8yyY<N^+Vb2>!26tK&FjkkS)nD(Svq?uAt2+x@hn<rZ9mD zv=9OtK0>PjKgVcw%?TSB!WtUFzFm}>kIkV0Eo_MBmzvXM7&Wb-sG~sqU2}>dn3hrC z>aLaXD9P+2sp3@Og4ww*q$Z#rsyMu_ls|B}XZlJh97Q<iqJq7v@=!*(H@H+vyMWi3 z18<e73sBd=mGMDOiwyW46!ZygZkZ!C;v<uMz?^^=yyWQ>ZT-TimSdg>i)wEdwWhG~ zrP^<?R$vB|nhI@Eh@rwXQn<1r0PM_!sCZkLL+!5Ax#{i1SAHlV(5YI3zL^6#(CNjg z%xd>jNGOc%=Ss!OwJ1&*PZRi#JRWx!A=$ySX}@-Xi!gtR*c-ggH`oSKm*Bqu35_m5 zdKZ*ANTVEx*_I)fcMF%TW*54`vvY6uvpxUWxaZmm_gl7F*wm4j)a0r{d(<Wfms7a1 z(ySG2JQ3-w({AOR+8F*_=r~Jb2>A|Z|Ccv^+@(m)T>AU&%oFt%nudWoWj*FzX2yGZ zF(R91njQ;r1xDnSW3ujocI2eNk-RFOCnwSev#EoD!3T4x*qOIL$pa+V7VwwgTc87* znIo>vu{GqdBTa3OOG7rqjJ~1Evn(~6l#%41>(Jg)7<jLOVS4f?(w|V+y!9e%Xd0#} zP|u?G7INf~%uKL6vx!~QWteRdiiIeinDImCouUDTxyh<rVeTDO(tSV4;XuEq>mbfX z;sa<wB<4H>esgV&?HmF0{s8xLY34m^y5-zwoHF<3JpN&(dYgsIBJjI0ux}eExvTf{ zM71)T>{9RG2%@F4e0}?L*cYa{31f4AtvdSq9_R)Ao(i&nmbq(!P2e5PbxS~ik#s4< z#*j@oxNVHf<TeK|sK>|@<`C!$=o(9)ZD?_ZoKoTkT{$K$%re-BxPC4$_n?9ZZT63S zC_CNi0)!C$fm8*K*#_a5_^Fm{ILG34zH5o&iQ19liR@2oBr7YYA)bLMEA@QU1)?By z3G4+@*gb~$l~srv?trZ+o<G2Ltj?DK=_(!$TwQ~@Q+OAwcL*)Vcmv|NiRLx`g*c%4 zf-%JRHONy0N)&<0(1bYgRO#w00_7$h7%rdU7FP`vZ;SxX4;VaU+@*zRsP}Pr5e?;{ ziu)w969wToiMhh<r>>%SE!dae1U9hQH!wQI?S$8f9BU^>8}a@K>fKGRlnihh&yM<G zlGBJ+c^rgEPd@tYEAqhma()A9%r8HUS1&(}v+g~O#Ve2J%%||yUY)~RKWh@NzBo(H z3gxH4bKO^xPGCB#=;)*qhsZm#LSG$tOS98l0U;8N0XP1rH0^LoJHp}wGg4C1b;h|J k#-iVockr^1ZiB#!jKg=#TB%lXDo)9<Z&bF~PQ_XM7aIPyAOHXW literal 0 HcmV?d00001 diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py b/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py new file mode 100644 index 0000000000..91515d8f3c --- /dev/null +++ b/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py @@ -0,0 +1,36 @@ +import pytest + +import SimpleITK as sitk +import numpy as np + +from allensdk.internal.mouse_connectivity.projection_thumbnail import projection_functions as prf + + +@pytest.fixture +def example_volume(): + array = np.arange(8, dtype=np.float64).reshape([2, 2, 2]) + return sitk.GetImageFromArray(array) + + +def test_convert_axis(): # :) + + obt = prf.convert_axis(2) + assert(obt == 0) + + +def test_max_projection(example_volume): + + max_obt, depth_obt = prf.max_projection(example_volume, 2) + + depth_exp = np.zeros([2, 2]) + 1 + max_exp = np.array([[4, 5], [6, 7]]) + + assert(np.allclose(depth_exp, depth_obt)) + assert(np.allclose(max_exp, max_obt)) + + +def test_template_projection(example_volume): + + obt = prf.template_projection(example_volume, 2, 1, 1) + exp = np.array([[16, 25], [20, 5]]) + diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py b/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py new file mode 100644 index 0000000000..d996ef2177 --- /dev/null +++ b/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py @@ -0,0 +1,61 @@ +import pytest + + +import SimpleITK as sitk +import numpy as np +import matplotlib as mpl + +from allensdk.internal.mouse_connectivity.projection_thumbnail import visualization_utilities as vis + + +@pytest.fixture +def example_volume(): + arr = np.arange(5*6*7, dtype=np.float64).reshape([5, 6, 7]) + return sitk.GetImageFromArray(arr) + + +@pytest.fixture +def discrete_cmap(): + red = np.arange(255) + green = np.arange(255)[::-1] + blue = np.zeros(256) + return [[r, g, b] for r, g, b in zip(red, green, blue)] + + +def test_convert_discrete_colormap(discrete_cmap): + cmap = vis.convert_discrete_colormap(discrete_cmap) + + obt = cmap(0.75) + exp = [3 * 255 / 4.0, 1 * 255 / 4.0, 0.0, 1.0] + + +def test_sitk_safe_ln(example_volume): + + obt = sitk.GetArrayFromImage(vis.sitk_safe_ln(example_volume)) + arr = sitk.GetArrayFromImage(example_volume) + + arr = np.log(arr) + arr[0, 0, 0] = np.log(10**-10) + + print(obt) + print(arr) + + assert(np.allclose(arr, obt)) + + +def test_normalize_intensity(example_volume): + + obt = vis.normalize_intensity(example_volume, 2, 4, 50, 100) + obt = sitk.GetArrayFromImage(obt) + + assert(75 == obt[0, 0, 3]) + + +def test_blend(): + + images = [np.eye(2), np.array([[1, 2], [3, 4]])] + weights = [np.fliplr(np.eye(2)), [[0, 0], [0, 1]]] + + exp = [[1, 0], [0, 4]] + obt = vis.blend(images, weights) + assert(np.allclose(exp, obt)) diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py b/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py new file mode 100644 index 0000000000..bd1f560b4f --- /dev/null +++ b/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py @@ -0,0 +1,79 @@ +import pytest +import numpy as np +import SimpleITK as sitk + +from allensdk.internal.mouse_connectivity.projection_thumbnail.volume_projector import VolumeProjector + + +@pytest.fixture +def simple_volume(): + arr = np.arange(8 * 9 * 10, dtype=np.float64).reshape([8, 9, 10]) + return sitk.GetImageFromArray(arr) # swaps 0 <=> 2 axes + + +@pytest.fixture +def cube_volume(): + arr = np.arange(1000, dtype=np.float64).reshape([10, 10, 10]) + return sitk.GetImageFromArray(arr) + + +def test_init(simple_volume): + vp = VolumeProjector(simple_volume) + assert(vp.view_volume.GetPixel(3, 5, 3) == simple_volume.GetPixel(3, 5, 3)) + + +def test_build_rotation_transform(simple_volume): + + vp = VolumeProjector(simple_volume) + trans_obt = vp.build_rotation_transform(0, 2, np.pi / 2.0) + + exp = [0, 0, -1, 0, 1, 0, 1, 0, 0] # just hstacked rows + assert(np.allclose(trans_obt.GetMatrix(), exp)) + + +@pytest.mark.parametrize('angle,check', [(2*np.pi, [2, 3, 4]), (np.pi, [7, 3, 3])]) +def test_rotate(simple_volume, angle, check): + + vp = VolumeProjector(simple_volume) + obt = vp.rotate(0, 2, angle) + + assert(np.allclose(simple_volume.GetPixel(2, 3, 4), obt.GetPixel(*check))) + + +def test_extract(): + + arr = np.eye(20) + vp = VolumeProjector(arr) + + obt = vp.extract(np.sum) + exp = 20 + + assert(obt == exp) + + +@pytest.mark.parametrize('angle,exp', [(0.0, 0.0), (2 * np.pi, 0.0)]) +def test_rotate_and_extract(angle, exp, cube_volume): + + cb = lambda x: x.GetPixel(0, 0, 0) + vp = VolumeProjector(cube_volume) + + for obt in vp.rotate_and_extract([0], [2], [angle], cb): + assert(np.allclose(obt, exp)) + + +def test_fixed_factory(simple_volume): + + shape = [5, 6, 7] + vp = VolumeProjector.fixed_factory(simple_volume, shape) + + shape_obt = vp.view_volume.GetSize() + assert(np.allclose(shape, shape_obt)) + + +def test_safe_factory(simple_volume): + + vp = VolumeProjector.safe_factory(simple_volume) + + shape_exp = [16, 17, 16] + assert(np.allclose(shape_exp, vp.view_volume.GetSize())) + assert(vp.view_volume.GetPixel(8, 9, 8) == simple_volume.GetPixel(5, 5, 4)) diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py b/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py new file mode 100644 index 0000000000..97b141b514 --- /dev/null +++ b/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py @@ -0,0 +1,92 @@ +import pytest +import numpy as np +import SimpleITK as sitk + +import allensdk.internal.mouse_connectivity.projection_thumbnail.volume_utilities as vol + + +@pytest.fixture +def empty_image(): + img = sitk.Image(2, 3, 4, sitk.sitkFloat64) + return img + + +@pytest.fixture +def even_image(): + arr = np.zeros([12, 14, 16]) + arr[6, 7, 8] = 1 + arr[6, 7, 8] = 1 + img = sitk.GetImageFromArray(arr) + return img + + +def test_sitk_get_image_parameters(empty_image): + + sp, sz, og = vol.sitk_get_image_parameters(empty_image) + + assert(np.allclose(sp, [1, 1, 1])) + assert(np.allclose(sz, [2, 3, 4])) + assert(np.allclose(og, [0, 0, 0])) + + +def test_sitk_get_center_even(even_image): + + center = vol.sitk_get_center(even_image) + assert(np.allclose(center, [7.5, 6.5, 5.5])) + + +def test_sitk_get_center_odd(empty_image): + obt = vol.sitk_get_center(empty_image) + assert(np.allclose(obt, [0.5, 1, 1.5])) + + +@pytest.mark.parametrize('size,exp', [([2, 3], [0, 1]), ([3, 3], [1, 1])]) +def test_sitk_get_size_parity(size, exp): + + image = sitk.Image(size[0], size[1], sitk.sitkUInt8) + obt = vol.sitk_get_size_parity(image) + + assert(np.allclose(exp, obt)) + + +@pytest.mark.parametrize('shape,exp', [([1, 1, 1], np.sqrt(3)), + ([2, 4], np.sqrt(20))]) +def test_sitk_get_diagonal_length(shape, exp): + + img = sitk.GetImageFromArray(np.zeros(shape)) + obt = vol.sitk_get_diagonal_length(img) + + assert(exp == obt) + + +def test_sitk_paste_into_center_even(): + + smaller = sitk.GetImageFromArray(np.eye(2)) + larger = sitk.GetImageFromArray(np.zeros((4, 4))) + + obt = vol.sitk_paste_into_center(smaller, larger) + obt = sitk.GetArrayFromImage(obt) + + exp = np.zeros((4, 4)) + exp[1, 1] = 1 + exp[2, 2] = 1 + + assert(np.allclose(obt, exp)) + + +def test_sitk_paste_into_center_odd(): + + smaller = sitk.GetImageFromArray(np.eye(3, 3)) + larger = sitk.GetImageFromArray(np.zeros((5, 5))) + + obt = vol.sitk_paste_into_center(smaller, larger) + obt = sitk.GetArrayFromImage(obt) + + print(obt) + + exp = np.zeros((5, 5)) + exp[1, 1] = 1 + exp[2, 2] = 1 + exp[3, 3] = 1 + + assert(np.allclose(exp, obt)) diff --git a/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py b/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py new file mode 100644 index 0000000000..640aea02ee --- /dev/null +++ b/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py @@ -0,0 +1,170 @@ +from __future__ import division + +import numpy as np +import pytest +import mock +from six import iteritems +from six.moves import xrange + +from allensdk.internal.mouse_connectivity.interval_unionize\ + .tissuecyte_unionize_record import TissuecyteBaseUnionize, \ + TissuecyteInjectionUnionize,TissuecyteProjectionUnionize + + +@pytest.fixture(scope='function') +def data_arrays(): + + fq = np.ones(100) + fq[25:] = 0 + + lq = np.ones(100) + lq[:75] = 0 + + top = np.ones(100) + top[:70] = 0 + + return {'injection_fraction': fq, + 'aav_exclusion_fraction': top, + 'projection_density': np.arange(100), + 'projection_energy': np.arange(100) * 2, + 'injection_density': np.multiply(np.arange(100), fq), + 'injection_energy': np.multiply(np.arange(100) * 2, fq), + 'sum_pixels': np.ones(100) * 900, + 'sum_pixel_intensities': np.ones(100), + 'injection_sum_pixel_intensities': np.ones(100)[:50] + } + + +def test_base_init(): + + tbu = TissuecyteBaseUnionize() + for item in TissuecyteBaseUnionize.__slots__: + assert( getattr(tbu, item) == 0 ) + + +@pytest.mark.parametrize('anc_mvd', [0, 1]) +def test_base_propagate(anc_mvd): + + an = TissuecyteBaseUnionize() + an.sum_pixels = 12 + an.max_voxel_index = 100 + an.max_voxel_density = anc_mvd + + ch = TissuecyteBaseUnionize() + ch.sum_pixels = 5 + ch.max_voxel_index = 50 + ch.max_voxel_density = 0.5 + + ch.propagate(an) + + assert( an.sum_pixels == 17 ) + + if an.max_voxel_density == 1: + assert( an.max_voxel_index == 100 ) + else: + assert( an.max_voxel_index == 50 ) + + +@pytest.mark.parametrize('spp', [0, 1]) +def test_base_set_max_voxel(spp): + + darr = np.arange(25) / 24 + darr[15:] = 0 + low = 12 + + tbu = TissuecyteBaseUnionize() + tbu.sum_projection_pixels = spp + tbu.set_max_voxel(darr, low) + + if spp == 1: + assert( tbu.max_voxel_index == 26 ) + assert( tbu.max_voxel_density == 14 / 24 ) + else: + assert( tbu.max_voxel_index == 0 ) + assert( tbu.max_voxel_density == 0 ) + + +def test_base_slice_arrays(): + + arrays = {ii: np.arange(10) + ii for ii in xrange(20)} + low = 5 + high = 8 + + tbu = TissuecyteBaseUnionize() + sl = tbu.slice_arrays(low, high, arrays) + + for k, v in iteritems(sl): + assert( len(v) == 3 ) + assert( v.sum() == k * 3 + 18 ) + + +@pytest.mark.parametrize('sum_pixels,sum_projection_pixels', [(0, 2), (0, 2)]) +def test_base_output(sum_pixels, sum_projection_pixels): + + tbu = TissuecyteBaseUnionize() + + tbu.sum_pixels = sum_pixels + tbu.direct_sum_projection_pixels = sum_projection_pixels / 2 + tbu.sum_projection_pixels = sum_projection_pixels + tbu.sum_projection_pixel_intensity = 100 + + tbu.max_voxel_index = 999 + tbu.max_voxel_density = 1 + + out = tbu.output(10, 900, (10, 10, 10), np.arange(1000)) + + assert( out['volume'] == sum_pixels * 900 ) + assert( out['direct_projection_volume'] == sum_projection_pixels * 450 ) + assert( out['projection_volume'] == sum_projection_pixels * 900 ) + + if sum_pixels > 0: + assert( out['projection_density'] == sum_projection_pixels / sum_pixels ) + else: + assert( out['projection_density'] == 0 ) + + if sum_pixels > 0: + assert( out['projection_energy'] == 100 / sum_pixels ) + else: + assert( out['projection_energy'] == 0 ) + + if sum_projection_pixels > 0: + assert( out['projection_intensity'] == 100 / sum_projection_pixels ) + else: + assert( out['projection_intensity'] == 0 ) + + assert( out['max_voxel_x'] == 90 ) + assert( out['max_voxel_y'] == 90 ) + assert( out['max_voxel_z'] == 90 ) + + +def test_injection_calculate(data_arrays): + + tiu = TissuecyteInjectionUnionize() + + tiu.calculate(20, 80, data_arrays) + + assert( tiu.sum_pixels == 4500 ) + assert( tiu.sum_projection_pixels == 900 * np.arange(20, 25).sum() ) + assert( tiu.sum_projection_pixel_intensity == 1800 * np.arange(20, 25).sum() ) + + assert( tiu.max_voxel_index == 24 ) + assert( tiu.max_voxel_density == 24 ) + + +def test_projection_calculate(data_arrays): + + tiu = mock.MagicMock() + tiu.sum_pixels = 1 + tiu.sum_projection_pixels = 2 + tiu.sum_projection_pixel_intensity = 3 + + tpu = TissuecyteProjectionUnionize() + tpu.calculate(20, 80, data_arrays, tiu) + + assert( tpu.sum_pixels == 900 * 50 - 1 ) + assert( tpu.sum_projection_pixels == 900 * np.arange(20, 70).sum() - 2 ) + assert( tpu.sum_projection_pixel_intensity == 1800 * np.arange(20, 70).sum() - 3 ) + + assert( tpu.max_voxel_index == 69 ) + assert( tpu.max_voxel_density == 69 ) + diff --git a/test/internal/mouse_connectivity/test_unionize_record.py b/test/internal/mouse_connectivity/test_unionize_record.py new file mode 100644 index 0000000000..80131b9ac6 --- /dev/null +++ b/test/internal/mouse_connectivity/test_unionize_record.py @@ -0,0 +1,15 @@ + + +import pytest +import mock + +from allensdk.internal.mouse_connectivity.interval_unionize.unionize_record import Unionize + + +@pytest.mark.parametrize('method', ['__init__', 'calculate', 'propagate', 'output']) +def test_unionize(method): + + un = object.__new__(Unionize) + + with pytest.raises(NotImplementedError): + getattr(un, method)('foo', 'fish') diff --git a/test/internal/test_annotated_region_metrics.py b/test/internal/test_annotated_region_metrics.py new file mode 100644 index 0000000000..a23fbeee1f --- /dev/null +++ b/test/internal/test_annotated_region_metrics.py @@ -0,0 +1,67 @@ +import pytest +import numpy as np +from allensdk.internal.brain_observatory import annotated_region_metrics + +@pytest.fixture +def mask(): + return np.ones((10,10), dtype=bool) + + +def retinotopic_map(return_x=True): + x = np.linspace(-np.pi, np.pi, 640) + y = np.linspace(-np.pi, np.pi, 540) + xx, yy = np.meshgrid(x, y) + if return_x: + return xx + return yy + + +@pytest.fixture +def azimuth_map(): + return retinotopic_map() + + +@pytest.fixture +def altitude_map(): + return retinotopic_map(False) + + +def test_eccentricity(azimuth_map, altitude_map): + ecc = annotated_region_metrics.eccentricity(azimuth_map, altitude_map, + 0.0, 0.0) + assert(ecc.shape == azimuth_map.shape) + + +def test_create_region_mask(mask): + height, width = mask.shape + x = y = 30 + region_mask = annotated_region_metrics.create_region_mask((100,100), + x, y, width, + height, + mask.tolist()) + assert(region_mask.shape == (100,100)) + assert(region_mask.sum() == mask.sum()) + assert(np.all(region_mask[y:y+height,x:x+width] == mask)) + + +def test_retinotopy_metric(azimuth_map, mask): + height, width = mask.shape + x = y = 30 + region_mask = annotated_region_metrics.create_region_mask( + azimuth_map.shape, x, y, width, height, mask.tolist()) + rmin, rmax, rrange, rbias = annotated_region_metrics.retinotopy_metric( + region_mask, azimuth_map) + rmap = np.degrees(azimuth_map[np.where(region_mask > 0)]) + assert(rmin == rmap.min()) + assert(rmax == rmap.max()) + + +def test_get_metrics(altitude_map, azimuth_map, mask): + height, width = mask.shape + x = y = 30 + result = annotated_region_metrics.get_metrics(altitude_map, azimuth_map, + x=x, y=y, width=width, + height=height, + mask=mask.tolist()) + assert(isinstance(result, dict)) + assert('azimuth_min' in result) diff --git a/test/internal/test_biophysical_modules.py b/test/internal/test_biophysical_modules.py new file mode 100644 index 0000000000..6e5464c398 --- /dev/null +++ b/test/internal/test_biophysical_modules.py @@ -0,0 +1,45 @@ +from allensdk.internal.api.queries.biophysical_module_api \ + import BiophysicalModuleApi +import pytest +from mock import patch + + +@pytest.fixture +def biophysical_api(): + bma = BiophysicalModuleApi('http://axon:3000') + + return bma + + +def test_get_neuronal_model_runs(biophysical_api): + neuronal_model_run_id = 464137111 + with patch.object(biophysical_api, "json_msg_query") as mock_query: + biophysical_api.get_neuronal_model_runs(neuronal_model_run_id) + expected = ("http://axon:3000/api/v2/data/query.json?q=model::Neuronal" + "ModelRun,rma::criteria,[id$in464137111],rma::include,well_" + "known_files(well_known_file_type),neuronal_model(well_known_" + "files(well_known_file_type),specimen(project,specimen_tags," + "ephys_roi_result(ephys_qc_criteria,well_known_files(well_" + "known_file_type)),neuron_reconstructions(well_known_files" + "(well_known_file_type)),ephys_sweeps(ephys_sweep_tags,ephys_" + "stimulus(ephys_stimulus_type))),neuronal_model_template" + "(neuronal_model_template_type,well_known_files(well_known_" + "file_type))),rma::options[num_rows$eq'all'][count$eqfalse]") + mock_query.assert_called_once_with(expected) + + +def test_get_neuronal_models(biophysical_api): + neuronal_model_id = 329322394 + with patch.object(biophysical_api, "json_msg_query") as mock_query: + biophysical_api.get_neuronal_models(neuronal_model_id) + expected = ("http://axon:3000/api/v2/data/query.json?q=model::Neuronal" + "Model,rma::criteria,[id$in329322394],rma::include," + "well_known_files(well_known_file_type),specimen(project," + "specimen_tags,ephys_roi_result(ephys_qc_criteria,well_known_" + "files(well_known_file_type)),neuron_reconstructions(well_" + "known_files(well_known_file_type)),ephys_sweeps(ephys_sweep_" + "tags,ephys_stimulus(ephys_stimulus_type))),neuronal_model_" + "template(neuronal_model_template_type,well_known_files(well_" + "known_file_type)),rma::options[num_rows$eq'all'][count$" + "eqfalse]") + mock_query.assert_called_once_with(expected) diff --git a/test/internal/test_core_feature_extract.py b/test/internal/test_core_feature_extract.py new file mode 100644 index 0000000000..87143be6e9 --- /dev/null +++ b/test/internal/test_core_feature_extract.py @@ -0,0 +1,106 @@ +import pytest +from allensdk.internal.ephys.core_feature_extract import ( find_stim_start, + filter_sweeps, + find_coarse_long_square_amp_delta, + nan_get ) + +def test_find_stim_start(): + a = [0,0,0,1,1,1,0,0,0] + idx = find_stim_start(a) + assert idx == 3 + + idx = find_stim_start(a, 1) + assert idx == 3 + + a = [0,0,0,-1,-1,-1,0,0,0] + idx = find_stim_start(a) + assert idx == 3 + + a = [] + idx = find_stim_start(a) + assert idx == -1 + + a = [0,0,0] + idx = find_stim_start(a) + assert idx == -1 + + a = [0] + idx = find_stim_start(a) + assert idx == -1 + +def test_filter_sweeps(): + a = [ { 'sweep_number': 1 }, { 'sweep_number': 0 } ] + sweeps = filter_sweeps(a, passed_only=False, iclamp_only=False) + assert len(sweeps) == 2 + assert [ s['sweep_number'] for s in sweeps ] == [ 0,1 ] + + a = [ { 'sweep_number': 1, 'workflow_state': 'auto_passed', 'stimulus_units': 'fish' }, + { 'sweep_number': 0, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, + { 'sweep_number': 2, 'workflow_state': 'manual_passed', 'stimulus_units': 'Amps' }, + { 'sweep_number': 3, 'workflow_state': 'manual_failed', 'stimulus_units': 'taco' } ] + sweeps = filter_sweeps(a, passed_only=True, iclamp_only=False) + assert len(sweeps) == 2 + + sweeps = filter_sweeps(a, passed_only=True, iclamp_only=True) + assert len(sweeps) == 1 + + a = [ { 'sweep_number': 1, 'ephys_stimulus': { 'description': 'T1x' } }, + { 'sweep_number': 0, 'ephys_stimulus': { 'description': 'T2x' } }, + { 'sweep_number': 2, 'ephys_stimulus': { 'description': 'T3x' } }, + { 'sweep_number': 3, 'ephys_stimulus': { 'description': 'T1x' } } ] + + sweeps = filter_sweeps(a, passed_only=False, iclamp_only=False, types=['T1', 'T2']) + assert len(sweeps) == 3 + +def test_find_coarse_long_square_amp_delta(): + a = [ { 'stimulus_amplitude': 10, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 10, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSFINE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 10, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 10, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] + + delta = find_coarse_long_square_amp_delta(a) + assert delta == 0 + + a = [ { 'stimulus_amplitude': 10, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 20, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSFINE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 30, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 40, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] + + delta = find_coarse_long_square_amp_delta(a) + assert delta == 10 + + a = [ { 'stimulus_amplitude': 10, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 20, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSFINE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 20, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 30, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] + + delta = find_coarse_long_square_amp_delta(a) + assert delta == 10 + + a = [ { 'stimulus_amplitude': 10, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 20, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 20, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 30, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, + { 'stimulus_amplitude': 50, 'sweep_number': 5, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] + + delta = find_coarse_long_square_amp_delta(a) + assert delta == 10 + +def test_nan_get(): + a = {} + v = nan_get(a, 'fish') + assert v == None + + a = { 'fish': 1 } + v = nan_get(a, 'fish') + assert v == 1 + + a = { 'fish': float("nan") } + v = nan_get(a, 'fish') + assert v == None + + + + + + diff --git a/test/internal/test_eye_calibration.py b/test/internal/test_eye_calibration.py new file mode 100644 index 0000000000..2df6d2210f --- /dev/null +++ b/test/internal/test_eye_calibration.py @@ -0,0 +1,80 @@ +import pytest +import numpy as np +from allensdk.internal.brain_observatory import eye_calibration + +def cr_params(): + x, y = np.meshgrid(np.array([300, 320, 340]), + np.array([220, 240, 260])) + return np.vstack((x.flatten(), y.flatten())).T + +def pupil_params(): + x, y = np.meshgrid(np.array([280, 320, 380]), + np.array([200, 240, 280])) + return np.vstack((x.flatten(), y.flatten())).T + + +@pytest.mark.parametrize("led_position,eye_radius", [ + (np.array([25.89, -6.12, 3.21]), 0.1682), + (np.array([24.6, 9.23, 5.26]), 0.1682), + (np.array([20.0, 20.0, 20.0]), 500), +]) +def test_cr_position_in_mouse_eye_coordinates(led_position, eye_radius): + cr = eye_calibration.EyeCalibration.cr_position_in_mouse_eye_coordinates( + led_position, eye_radius) + tol = 0.000000001 + assert(np.abs(np.linalg.norm(cr) - 0.5*eye_radius) < tol) + err = np.abs(cr/np.linalg.norm(cr) - \ + led_position/np.linalg.norm(led_position)) + assert(np.all(err < tol)) + + +@pytest.mark.parametrize("led_position,camera_rotations", [ + (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, 0.0])), + (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, np.pi/4])) +]) +def test_pupil_position_in_mouse_eye_coordinates_right( + led_position, camera_rotations): + CM_PER_PIXEL = 10.2/10000 + TOL = 0.0000000001 + c = eye_calibration.EyeCalibration( + led_position=led_position, cm_per_pixel=CM_PER_PIXEL, + eye_radius=0.1682, camera_rotations=camera_rotations, + camera_position=np.array([13.0, 0.0, 0.0])) + pupil = pupil_params() + cr = cr_params() + bad = c.pupil_position_in_mouse_eye_coordinates(np.array([[1000, 0], [0, 1000]]), + np.array([[0, 0], [0, 0]])) + assert(np.all(np.isnan(bad))) + pos = c.pupil_position_in_mouse_eye_coordinates(pupil, cr) + x = (pupil.T[0] - cr.T[0])*CM_PER_PIXEL + y = (cr.T[1] - pupil.T[1])*CM_PER_PIXEL + xr = x*np.cos(-camera_rotations[2]) - y*np.sin(-camera_rotations[2]) + yr = x*np.sin(-camera_rotations[2]) + y*np.cos(-camera_rotations[2]) + assert(np.all(np.abs(pos.T[2] - (yr + c.cr[2])) < TOL)) + assert(np.all(np.abs(pos.T[1] - (xr + c.cr[1])) < TOL)) + + +@pytest.mark.parametrize("led_position,camera_rotations", [ + (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, 0.0])), + (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, np.pi/4])) +]) +def test_pupil_position_in_mouse_eye_coordinates_front( + led_position, camera_rotations): + CM_PER_PIXEL = 10.2/10000 + TOL = 0.0000000001 + c = eye_calibration.EyeCalibration( + led_position=led_position, cm_per_pixel=CM_PER_PIXEL, + eye_radius=0.1682, camera_rotations=camera_rotations, + camera_position=np.array([0.0, 13.0, 0.0])) + pupil = pupil_params() + cr = cr_params() + bad = c.pupil_position_in_mouse_eye_coordinates(np.array([[1000, 0], [0, 1000]]), + np.array([[0, 0], [0, 0]])) + assert(np.all(np.isnan(bad))) + pos = c.pupil_position_in_mouse_eye_coordinates(pupil, cr) + x = (pupil.T[0] - cr.T[0])*CM_PER_PIXEL + y = (cr.T[1] - pupil.T[1])*CM_PER_PIXEL + xr = x*np.cos(-camera_rotations[2]) - y*np.sin(-camera_rotations[2]) + yr = x*np.sin(-camera_rotations[2]) + y*np.cos(-camera_rotations[2]) + assert(np.all(np.abs(pos.T[2] - (yr + c.cr[2])) < TOL)) + assert(np.all(np.abs(pos.T[0] + (xr - c.cr[0])) < TOL)) diff --git a/test/internal/test_internal.py b/test/internal/test_internal.py new file mode 100644 index 0000000000..c9e5470493 --- /dev/null +++ b/test/internal/test_internal.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +test_internal +---------------------------------- + +Tests for `internal` module. +""" +import pytest + + +@pytest.fixture +def decorated_example(): + """Sample pytest fixture. + See more at: http://doc.pytest.org/en/latest/fixture.html + """ + +def test_example(decorated_example): + """Sample pytest test function with the pytest fixture as an argument. + """ + import allensdk.internal + + + + diff --git a/test/internal/test_mtrain_api.py b/test/internal/test_mtrain_api.py new file mode 100644 index 0000000000..9e10283522 --- /dev/null +++ b/test/internal/test_mtrain_api.py @@ -0,0 +1,117 @@ +import pytest + +from allensdk.internal.api.mtrain_api import MtrainApi, MtrainSqlApi + + +@pytest.mark.nightly +@pytest.mark.parametrize('api', [ + pytest.param(MtrainApi()), + pytest.param(MtrainSqlApi()), +]) +def test_get_subjects(api): + subject_list = api.get_subjects() + assert len(subject_list) > 190 and 423746 in subject_list + + +@pytest.mark.nightly +@pytest.mark.parametrize('api', [ + pytest.param(MtrainApi()), + pytest.param(MtrainSqlApi()), +]) +def test_get_behavior_training_df(api): + LabTracks_ID = 423986 + df = api.get_behavior_training_df(LabTracks_ID) + # assert list(df.columns) == [u'stage_name', u'regimen_name', u'date', + # u'behavior_session_id'] + assert len(df) == 24 + + +@pytest.mark.nightly +@pytest.mark.parametrize('LabTracks_ID', [ + pytest.param(423986), +]) +def test_get_current_stage(LabTracks_ID): + api = MtrainApi() + stage = api.get_current_stage(LabTracks_ID) + assert stage == 'OPHYS_6_images_B' + + +@pytest.mark.nightly +@pytest.mark.parametrize('behavior_session_uuid, behavior_session_id', + [pytest.param('394a910e-94c7-4472-9838-5345aff59ed8', + None), + pytest.param(None, 823847007), + pytest.param('394a910e-94c7-4472-9838-5345aff59ed8', + 823847007), + ]) +def test_get_session(behavior_session_uuid, behavior_session_id): + api = MtrainApi() + kwargs = {key: val for key, val in + [('behavior_session_uuid', behavior_session_uuid), + ('behavior_session_id', behavior_session_id)] if + val is not None} + session_dict = api.get_session(**kwargs) + trials_df = session_dict.pop('trials') + assert len(trials_df) == 576 + assert "stages" in session_dict.keys() # Remove stages because it's + # very long + del session_dict["stages"] + assert session_dict == {u'name': u'TRAINING_1_gratings', + u'parameters': {u'auto_reward_delay': 0.15, + u'change_time_scale': 2.0, + u'end_after_response': True, + u'change_flashes_max': None, + u'change_time_dist': + u'exponential', + u'stimulus_window': 6.0, + u'response_window': [0.15, 1.0], + u'change_flashes_min': None, + u'catch_frequency': 0.25, + u'min_no_lick_time': 0.0, + u'timeout_duration': 0.3, + u'free_reward_trials': 10, + u'volume_limit': 5.0, + u'max_task_duration_min': 60.0, + u'reward_volume': 0.01, + u'end_after_response_sec': 3.5, + u'start_stop_padding': 20.0, + u'periodic_flash': None, + u'stage': u'TRAINING_1_gratings', + u'auto_reward_vol': 0.005, + u'task_id': u'DoC', + u'stimulus': { + u'params': {u'phase': 0.25, + u'tex': u'sqr', + u'units': u'deg', + u'sf': 0.04, + u'size': [200, + 150]}, + u'class': u'grating', + u'groups': {u'horizontal': { + u'Ori': [90, 270]}, + u'vertical': { + u'Ori': [0, + 180]}}}, + u'failure_repeats': 5, + u'warm_up_trials': 5, + u'pre_change_time': 2.25}, + u'script': + u'http://stash.corp.alleninstitute.org/' + u'projects/VB/repos/visual_behavior_scripts/' + u'raw/change_detection_with_fingerprint.py?at=' + u'021ec55fbbdbb05aad1681c016e83066fe5aa1dd', + 'behavior_session_uuid': + u'394a910e-94c7-4472-9838-5345aff59ed8', + u'script_md5': u'e0535f3b6f03ccc8eeccaed2118f3c1d', + u'LabTracks_ID': 431151, + u'date': + u'2019-02-15T13:01:23.672000', + 'regimen_name': u'VisualBehavior_Task1A_v1.0.1', + u'default_x': False, + u'regimens': [{u'active': False, + u'default': False, + u'id': 14, + u'name': + u'VisualBehavior_Task1A_v1.0.1' + }], + u'default_y': False} diff --git a/test/internal/test_optimize_config_reader.py b/test/internal/test_optimize_config_reader.py new file mode 100644 index 0000000000..4bddb9756e --- /dev/null +++ b/test/internal/test_optimize_config_reader.py @@ -0,0 +1,146 @@ +from allensdk.internal.api.queries.optimize_config_reader import \ + OptimizeConfigReader +import pytest +from mock import patch, mock_open +try: + import __builtin__ as builtins +except: + import builtins + + +LIMS_MESSAGE_NO_PARAM_FILES = """ +{ + "neuronal_model": {}, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 11111 + } + ] +} +""" + +LIMS_MESSAGE_ONE_PARAM_FILE = """ +{ + "neuronal_model": {}, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 11111 + }, + { + "well_known_file_type": { + "created_at": "2015-02-13T11:41:41-08:00", + "id": 329230374, + "name": "NeuronalModelParameters", + "updated_at": "2015-02-13T11:41:41-08:00" + }, + "well_known_file_type_id": 329230374, + "id": 22222 + } + ] +} +""" + +LIMS_MESSAGE_TWO_PARAM_FILES = """ +{ + "neuronal_model": {}, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 22222 + }, + { + "well_known_file_type": { + "created_at": "2015-02-13T11:41:41-08:00", + "id": 329230374, + "name": "NeuronalModelParameters", + "updated_at": "2015-02-13T11:41:41-08:00" + }, + "well_known_file_type_id": 329230374, + "id": 22222 + } + ] +} +""" + + +@pytest.fixture +def no_param_config(): + ocr = OptimizeConfigReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_NO_PARAM_FILES)): + ocr.read_lims_file(lims_json_path) + + return ocr + + +@pytest.fixture +def one_param_config(): + ocr = OptimizeConfigReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_ONE_PARAM_FILE)): + ocr.read_lims_file(lims_json_path) + + return ocr + + +@pytest.fixture +def two_param_config(): + ocr = OptimizeConfigReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_TWO_PARAM_FILES)): + ocr.read_lims_file(lims_json_path) + + return ocr + + +def test_no_params(no_param_config): + assert no_param_config.lims_data['well_known_files'][0]['well_known_file_type']['id'] != 329230374 + no_param_config.update_well_known_file('/path/to/params_fit.json', + OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) + assert no_param_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 329230374 + + +def test_one_param(one_param_config): + assert one_param_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 329230374 + one_param_config.update_well_known_file('/path/to/params_fit.json', + OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) + assert one_param_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 329230374 + assert one_param_config.lims_update_data['well_known_files'][1]['id'] == 22222 + + +def test_two_params(two_param_config): + assert two_param_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 329230374 + two_param_config.update_well_known_file('/path/to/params_fit.json', + OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) + assert two_param_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 329230374 + assert two_param_config.lims_update_data['well_known_files'][1]['id'] == 22222 + assert len(two_param_config.lims_update_data['well_known_files']) == 2 diff --git a/test/internal/test_optimize_manifest.py b/test/internal/test_optimize_manifest.py new file mode 100644 index 0000000000..aa9ff5067a --- /dev/null +++ b/test/internal/test_optimize_manifest.py @@ -0,0 +1,203 @@ +from allensdk.internal.api.queries.optimize_config_reader import \ + OptimizeConfigReader +import pytest +from mock import patch, mock_open, MagicMock +from six import StringIO +from io import IOBase +import json +try: + import __builtin__ as builtins +except: + import builtins + + +LIMS_MESSAGE_ONE_PARAM_FILE = """ +{ + "storage_directory": "storage directory 11111", + "specimen_id": 98765, + "specimen": { + "neuron_reconstructions": [ + { + "superseded": false, + "manual": true, + "well_known_files": [ + { + "well_known_file_type_id": 303941301, + "storage_directory": "/path/to/morphology", + "filename": "morphology_file.swc" + } + ] + } + ], + "ephys_roi_result": { + "well_known_files": [ + { + "well_known_file_type_id": 475137571, + "storage_directory": "/path/to/stimulus_nwb", + "filename": "stimulus_1234.nwb" + } + ] + }, + "ephys_sweeps": [ + { + "sweep_number": 1, + "workflow_state": "auto_passed" + }, + { + "sweep_number": 2, + "workflow_state": "manual_passed" + }, + { + "sweep_number": 3, + "workflow_state": "failed" + } + ] + }, + "neuronal_model_template": { + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 11111, + "storage_directory": "/path/to/mod_files", + "filename": "mod_file_1.mod" + } + ] + }, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2015-02-13T11:41:41-08:00", + "id": 329230374, + "name": "NeuronalModelParameters", + "updated_at": "2015-02-13T11:41:41-08:00" + }, + "well_known_file_type_id": 329230374, + "id": 22222, + "storage_directory": "/path/to/neuronal_model", + "filename": "existing_well_known.file" + } + ] +} +""" + + +def manifest_as_string(reader): + output = StringIO() + + with patch(builtins.__name__ + ".open", + mock_open(), + create=True) as manifest_f: + manifest_f.return_value = MagicMock(spec=IOBase) + file_handle = manifest_f.return_value.__enter__.return_value + file_handle.write.side_effect = output.write + + reader.to_manifest("test_manifest.json") + + return output.getvalue() + + +@pytest.fixture +def no_param_config(): + json_data = json.loads(LIMS_MESSAGE_ONE_PARAM_FILE) + json_data['well_known_files'] = [] + lims_message_no_param_file = json.dumps(json_data) + ocr = OptimizeConfigReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=lims_message_no_param_file)): + ocr.read_lims_file(lims_json_path) + + return ocr + + +@pytest.fixture +def one_param_config(): + ocr = OptimizeConfigReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_ONE_PARAM_FILE)): + ocr.read_lims_file(lims_json_path) + + return ocr + + +@pytest.fixture +def one_param_manifest_dict(one_param_config): + reader = one_param_config + json_string = manifest_as_string(reader) + the_dict = json.loads(json_string) + + return the_dict + + +def test_to_manifest(one_param_config): + with patch(builtins.__name__ + ".open", + mock_open(), + create=True) as manifest_f: + manifest_f.return_value = MagicMock(spec=IOBase) + file_handle = manifest_f.return_value.__enter__.return_value + one_param_config.to_manifest("test_manifest.json") + manifest_f.assert_called_once_with("test_manifest.json", "wb+") + + +def test_top_level_keys(one_param_manifest_dict): + assert set(one_param_manifest_dict.keys()) == set(['biophys', 'runs', 'neuron', 'manifest']) + + +def test_manifest_hoc(one_param_manifest_dict): + assert set(one_param_manifest_dict['neuron'][0].keys()) == set(['hoc']) + + +def test_specimen_id(one_param_manifest_dict): + assert one_param_manifest_dict['runs'][0]['specimen_id'] == 98765 + + +def test_sweeps(one_param_manifest_dict): + assert set(one_param_manifest_dict['runs'][0]['sweeps']) == set([1, 2]) + + +def test_mod_file_paths(one_param_config): + assert set(one_param_config.mod_file_paths()) == set(['/path/to/mod_files/mod_file_1.mod']) + + +def test_update_well_known_file_not_existing(no_param_config): + fit_file_type = 329230374 + no_param_config.update_well_known_file('/path/to/new_fit.json') + wkf = no_param_config.lims_update_data['well_known_files'][0] + assert 'id' not in wkf + assert wkf['storage_directory'] == '/path/to' + assert wkf['filename'] == 'new_fit.json' + assert wkf['well_known_file_type_id'] == fit_file_type + + +def test_update_well_known_file_existing(one_param_config): + fit_file_type = 329230374 + one_param_config.update_well_known_file('/path/to/new_fit.json') + wkf = one_param_config.lims_update_data['well_known_files'][0] + assert wkf['id'] == 22222 + assert wkf['storage_directory'] == '/path/to' + assert wkf['filename'] == 'new_fit.json' + assert wkf['well_known_file_type_id'] == fit_file_type + + +def test_manifest_keys(one_param_manifest_dict): + expected_keys = set(['BASEDIR', 'WORKDIR', 'MORPHOLOGY', 'MODFILE_DIR', + 'MOD_FILE_mod_file_1', 'stimulus_path', 'manifest', + 'output', 'neuronal_model_data', 'upfile', 'downfile', + 'passive_fit_data', 'stage_1_jobs', 'fit_1_file', + 'fit_2_file', 'fit_3_file', 'fit_type_path', + 'target_path', 'fit_config_json', 'final_hof_fit', + 'final_hof', 'output_fit_file']) + + actual_keys = set([e['key'] for e in one_param_manifest_dict['manifest']]) + assert actual_keys == expected_keys diff --git a/test/internal/test_roi_filter.py b/test/internal/test_roi_filter.py new file mode 100644 index 0000000000..e7d818270b --- /dev/null +++ b/test/internal/test_roi_filter.py @@ -0,0 +1,166 @@ +import pytest +import pandas as pd +import numpy as np +from skimage import draw +from allensdk.internal.brain_observatory import roi_filter +from allensdk.internal.brain_observatory import roi_filter_utils +from allensdk.internal.pipeline_modules import run_roi_filter + +OVERLAP_THRESHOLD = 0.9 + + +class TestSegmentation(object): + def __init__(self, stack, n_rois, has_duplicates, has_unions): + self.stack = stack + self.n_rois = n_rois + self.has_duplicates = has_duplicates + self.has_unions = has_unions + + +def create_mask_plane(img_shape, dot_positions, radius=15): + img = np.zeros(img_shape, dtype=np.uint8) + for r, c in dot_positions: + img[draw.circle(r, c, radius, shape=img_shape)] = 1 + return img + + +@pytest.fixture(params=[(False, False), (True, True), + (False, True), (True, False)]) +def segmentation(request): + has_unions, has_duplicates = request.param + plane1 = create_mask_plane((200,200), [(20,20), (130,60), (170,110)]) + plane2 = create_mask_plane((200,200), [(130,85)]) + n_rois = 4 + masks = [plane1, plane2] + + if has_unions: + uplane = create_mask_plane((200,200), [(131,62), (131, 85)]) + masks.append(uplane) + n_rois += 1 + if has_duplicates: + dplane = create_mask_plane((200,200), [(21,20)]) + masks.append(dplane) + n_rois += 1 + + return TestSegmentation(np.array(masks), n_rois, has_duplicates, + has_unions) + + +@pytest.fixture +def object_list(): + columns = ["index", "traceindex", "tempIndex", "cx", "cy", "mask2Frame", + "frame", "object", "minx", "miny", "maxx", "maxy", "area", + "shape0", "shape1", "eXcluded", "meanInt0", "maxInt0", + "meanInt1", "maxInt1", "maxMeanRatio", "snpoffsetmean", + "snpoffsetstdv", "act2", "act3", "OvlpCount", "OvlpAreaPer", + "OvlpObj0", "corcoef0", "OvlpObj1", "corcoef1"] + data = [ + [0, 0, 112, 363, 12, 0, 81, 1, 354, 5, 371, 18, 170, 0.679, 9, 0, 49, + 73, 32, 54, 0.6875, -18.598810, 12.540119, 2778, 995, 1, 82, 85, + -1.000, 0, 0.000], + [1, 1, 12, 224, 13, 0, 2, 1, 218, 8, 230, 18, 106, 0.653, 10, 11, 30, + 62, 12, 23, 0.9167, -34.688274, 16.209919, 2818, 390, 0, 0, 0, + 0.000, 0, 0.000], + [2, 999, 109, 323, 9, 0, 206, 2, 315, 2, 331, 22, 193, 0.454, 16, 2, + 123, 255, 92, 225, 1.4457, 0.000000, 0.000000, 0, 0, 0, 0, 0, 0.000, + 0, 0.000] + ] + return pd.DataFrame(data=data, columns=columns) + + +@pytest.fixture(scope="module") +def xy_data(): + data = ["0.5,1.7","-1.2,2.5"] + return data + + +@pytest.fixture(scope="module") +def old_csv(tmpdir_factory, xy_data): + data = ["0,{},154.086,-14.9831,0,0,1,0.0254625".format(xy_data[0]), + "1,{},-0.78758,-2.39286,0,0,0,0.348251".format(xy_data[1])] + filename = str(tmpdir_factory.mktemp("test").join("old.csv")) + with open(filename, "w") as f: + f.write("\n".join(data)) + return filename + + +@pytest.fixture(scope="module") +def new_csv(tmpdir_factory, xy_data): + data = ["framenumber,x,y,correlation,input_x,input_y,estimate", + "0,{},0.65566,3.00745,-1.75258,PhaseCorrelated".format(xy_data[0]), + "1,{},0.65727,3.15259,-2.8105,PhaseCorrelated".format(xy_data[1])] + filename = str(tmpdir_factory.mktemp("test").join("new.csv")) + with open(filename, "w") as f: + f.write("\n".join(data)) + return filename + + +def model_data(ol, is_valid=True): + training_columns = list(ol.columns) + if is_valid: + training_columns.extend([1, "depth", "driver1", "driver2", "reporter1"]) + else: + training_columns.extend([2, "depth", "driver1", "driver2", "reporter1"]) + data = {"structure_ids": [1], + "drivers": ["driver1", "driver2"], + "reporters": ["reporter1"], + "training_features": pd.DataFrame(columns=training_columns)} + return data + + +def test_calculate_max_border_all_outliers(): + df = pd.DataFrame( + np.ones((100,9)), + columns=["index", "x", "y", "a", "b", "c", "d", "e", "f"]) + with pytest.raises(ValueError): + border = roi_filter_utils.calculate_max_border(df, 0) + + +def test_get_rois(segmentation): + rois = roi_filter_utils.get_rois(segmentation.stack) + assert(len(rois) == segmentation.n_rois) + + +def test_label_unions_and_duplicates(segmentation): + rois = roi_filter_utils.get_rois(segmentation.stack) + rois = roi_filter.label_unions_and_duplicates(rois, OVERLAP_THRESHOLD) + duplicates = False + unions = False + for roi in rois: + if "duplicate" in roi.labels: + duplicates |= 1 + if "union" in roi.labels: + unions |= 1 + assert(duplicates == segmentation.has_duplicates) + assert(unions == segmentation.has_unions) + + +def test_create_feature_array(object_list): + depth = 250 + structure_id = 1 + drivers = ["driver1", "driver2"] + reporters = ["reporter1"] + passing_data = model_data(object_list, True) + failing_data = model_data(object_list, False) + with pytest.raises(KeyError): + roi_filter.create_feature_array(failing_data, object_list, depth, + structure_id, drivers, reporters) + feature_array = roi_filter.create_feature_array(passing_data, object_list, + depth, structure_id, + drivers, reporters) + assert(np.all(feature_array.columns == + passing_data["training_features"].columns)) + + +def test_training_label_classifier(object_list): + classifier = roi_filter_utils.TrainingMultiLabelClassifier() + assert(classifier.labels == sorted(roi_filter_utils.CRITERIA().keys())) + + +def test_read_csv(old_csv, new_csv): + assert(not run_roi_filter.is_deprecated_motion_file(new_csv)) + assert(run_roi_filter.is_deprecated_motion_file(old_csv)) + old_data = run_roi_filter.load_rigid_motion_transform(old_csv) + new_data = run_roi_filter.load_rigid_motion_transform(new_csv) + assert(np.all(np.isclose(old_data["x"], new_data["x"]))) + assert(np.all(np.isclose(old_data["y"], new_data["y"]))) diff --git a/test/internal/test_simulate_manifest.py b/test/internal/test_simulate_manifest.py new file mode 100644 index 0000000000..0ee7908679 --- /dev/null +++ b/test/internal/test_simulate_manifest.py @@ -0,0 +1,266 @@ +from allensdk.internal.api.queries.biophysical_module_reader import \ + BiophysicalModuleReader +import pytest +from mock import patch, mock_open, MagicMock +from six import StringIO +from io import IOBase +import json +try: + import __builtin__ as builtins +except: + import builtins + + +LIMS_MESSAGE_ONE_PARAM_FILE = """ +{ + "id": 8888, + "storage_directory": "/neuronal/model/run/storage/directory", + "neuronal_model": { + "storage_directory": "storage directory 11111", + "specimen_id": 98765, + "specimen": { + "neuron_reconstructions": [ + { + "superseded": false, + "manual": true, + "well_known_files": [ + { + "well_known_file_type_id": 303941301, + "storage_directory": "/path/to/morphology", + "filename": "morphology_file.swc" + } + ] + } + ], + "ephys_roi_result": { + "well_known_files": [ + { + "well_known_file_type_id": 475137571, + "storage_directory": "/path/to/stimulus_nwb", + "filename": "stimulus_1234.nwb" + } + ] + }, + "ephys_sweeps": [ + { + "sweep_number": 1, + "workflow_state": "auto_passed", + "ephys_stimulus": { + "ephys_stimulus_type": { + "name": "Test" + } + } + }, + { + "sweep_number": 2, + "workflow_state": "manual_passed", + "ephys_stimulus": { + "ephys_stimulus_type": { + "name": "Unknown" + } + } + }, + { + "sweep_number": 3, + "workflow_state": "failed", + "ephys_stimulus": { + "ephys_stimulus_type": { + "name": "Long Square" + } + } + } + ] + }, + "neuronal_model_template": { + "name": "Biophysical - perisomatic", + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 11111, + "storage_directory": "/path/to/mod_files", + "filename": "mod_file_1.mod" + } + ] + }, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2015-02-13T11:41:41-08:00", + "id": 329230374, + "name": "NeuronalModelParameters", + "updated_at": "2015-02-13T11:41:41-08:00" + }, + "well_known_file_type_id": 329230374, + "id": 22222, + "storage_directory": "/path/to/neuronal_model", + "filename": "existing_well_known.file" + }, + { + "well_known_file_type": { + "id": 475137571, + "name": "NWB" + }, + "well_known_file_type_id": 475137571, + "id": 343434, + "storage_directory": "/path/to/nwb_file/roi_maybe", + "filename": "stimulus_input.nwb" + } + ] + }, + "well_known_files": [ + { + "well_known_file_type": { + "id": 478840678, + "name": "NWB_UNCOMPRESSED" + }, + "well_known_file_type_id": 478840678, + "id": 343434, + "storage_directory": "/neuronal/model/run/dir", + "filename": "pre_existing_output.nwb" + } + ] +} +""" + + +def manifest_as_string(reader): + output = StringIO() + + with patch(builtins.__name__ + ".open", + mock_open(), + create=True) as manifest_f: + manifest_f.return_value = MagicMock(spec=IOBase) + file_handle = manifest_f.return_value.__enter__.return_value + file_handle.write.side_effect = output.write + + reader.to_manifest("test_manifest.json") + + manifest_string = output.getvalue() + print(manifest_string) + + return manifest_string + + +@pytest.fixture +def no_param_config(): + json_data = json.loads(LIMS_MESSAGE_ONE_PARAM_FILE) + json_data['well_known_files'] = [] + lims_message_no_param_file = json.dumps(json_data) + scr = BiophysicalModuleReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=lims_message_no_param_file)): + scr.read_lims_file(lims_json_path) + + return scr + + +@pytest.fixture +def one_param_config(): + scr = BiophysicalModuleReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_ONE_PARAM_FILE)): + scr.read_lims_file(lims_json_path) + + return scr + + +@pytest.fixture +def one_param_manifest_dict(one_param_config): + reader = one_param_config + json_string = manifest_as_string(reader) + the_dict = json.loads(json_string) + + return the_dict + + +def test_to_manifest(one_param_config): + with patch(builtins.__name__ + ".open", + mock_open(), + create=True) as manifest_f: + manifest_f.return_value = MagicMock(spec=IOBase) + file_handle = manifest_f.return_value.__enter__.return_value + one_param_config.to_manifest("test_manifest.json") + manifest_f.assert_called_once_with("test_manifest.json", "wb+") + + +def test_top_level_keys(one_param_manifest_dict): + assert set(one_param_manifest_dict.keys()) == \ + set(['biophys', 'runs', 'neuron', 'manifest']) + + +def test_manifest_hoc(one_param_manifest_dict): + assert set(one_param_manifest_dict['neuron'][0].keys()) == set(['hoc']) + + +def test_neuronal_model_run_id(one_param_manifest_dict): + assert one_param_manifest_dict['runs'][0]['neuronal_model_run_id'] == 8888 + + +def test_sweeps(one_param_manifest_dict): + assert set(one_param_manifest_dict['runs'][0]['sweeps']) == set([1, 2]) + + +def test_sweeps_by_type(one_param_manifest_dict): + sweeps_by_type = one_param_manifest_dict['runs'][0]['sweeps_by_type'] + assert set(sweeps_by_type['Test']) == set([1]) + assert set(sweeps_by_type['Unknown']) == set([2]) + assert set(sweeps_by_type['Long Square']) == set([3]) + assert len(sweeps_by_type.keys()) == 3 + + +def test_mod_file_paths(one_param_config): + assert set(one_param_config.mod_file_paths()) == \ + set(['/path/to/mod_files/mod_file_1.mod']) + + +def test_update_well_known_file_not_existing(no_param_config): + nwb_uncompressed_file_type = 478840678 + no_param_config.update_well_known_file('/path/to/pre_existing_output.nwb') + wkf = no_param_config.lims_update_data['well_known_files'][0] + assert 'id' not in wkf + assert wkf['storage_directory'] == '/path/to' + assert wkf['filename'] == 'pre_existing_output.nwb' + assert wkf['well_known_file_type_id'] == nwb_uncompressed_file_type + + +def test_update_well_known_file_existing(one_param_config): + nwb_uncompressed_file_type = 478840678 + one_param_config.update_well_known_file('/neuronal/model/run/dir/pre_existing_output.nwb') + wkf = one_param_config.lims_update_data['well_known_files'][0] + assert wkf['id'] == 343434 + assert wkf['storage_directory'] == '/neuronal/model/run/dir' + assert wkf['filename'] == 'pre_existing_output.nwb' + assert wkf['well_known_file_type_id'] == nwb_uncompressed_file_type + + +def test_update_well_known_file_existing_name_mismatch(one_param_config): + nwb_uncompressed_file_type = 478840678 + one_param_config.update_well_known_file( + '/neuronal/model/run/dir/8888_virtual_experiment.nwb') + wkf = one_param_config.lims_update_data['well_known_files'][0] + assert 'id' not in wkf + assert wkf['storage_directory'] == '/neuronal/model/run/dir' + assert wkf['filename'] == '8888_virtual_experiment.nwb' + assert wkf['well_known_file_type_id'] == nwb_uncompressed_file_type + + +def test_manifest_keys(one_param_manifest_dict): + expected_keys = set(['BASEDIR', 'WORKDIR', 'MORPHOLOGY', 'CODE_DIR', + 'MODFILE_DIR', 'MOD_FILE_mod_file_1', 'stimulus_path', + 'manifest', 'output_path', 'fit_parameters', + 'neuronal_model_run_data', 'fit_parameters']) + + actual_keys = set([e['key'] for e in one_param_manifest_dict['manifest']]) + assert actual_keys == expected_keys diff --git a/test/internal/test_simulate_update_output.py b/test/internal/test_simulate_update_output.py new file mode 100644 index 0000000000..74c8970c50 --- /dev/null +++ b/test/internal/test_simulate_update_output.py @@ -0,0 +1,162 @@ +from allensdk.internal.api.queries.biophysical_module_reader import \ + BiophysicalModuleReader +import pytest +from mock import patch, mock_open +try: + import __builtin__ as builtins +except: + import builtins + + +LIMS_MESSAGE_NO_NWB_FILES = """ +{ + "neuronal_model": {}, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 11111 + } + ] +} +""" + + +LIMS_MESSAGE_ONE_NWB_FILE = """ +{ + "neuronal_model": {}, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 11111 + }, + { + "filename": "496537307_virtual_experiment.nwb", + "id": 22222, + "storage_directory": "/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/", + "well_known_file_type": { + "created_at": "2015-06-09T15:21:33-07:00", + "id": 478840678, + "name": "NWBUncompressed", + "updated_at": "2015-06-09T15:21:33-07:00" + }, + "well_known_file_type_id": 478840678 + } + ] +} +""" + + +LIMS_MESSAGE_TWO_NWB_FILES = """ +{ + "neuronal_model": {}, + "well_known_files": [ + { + "well_known_file_type": { + "created_at": "2013-11-05T16:59:04-08:00", + "id": 292178729, + "name": "BiophysicalModelDescription", + "updated_at": "2013-11-05T16:59:04-08:00" + }, + "well_known_file_type_id": 292178729, + "id": 11111 + }, + { + "filename": "496537307_virtual_experiment.nwb", + "id": 22222, + "storage_directory": "/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/", + "well_known_file_type": { + "created_at": "2015-06-09T15:21:33-07:00", + "id": 478840678, + "name": "NWBUncompressed", + "updated_at": "2015-06-09T15:21:33-07:00" + }, + "well_known_file_type_id": 478840678 + }, + { + "filename": "496537307_virtual_experiment.nwb", + "id": 33333, + "storage_directory": "/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/", + "well_known_file_type": { + "created_at": "2015-06-09T15:21:33-07:00", + "id": 478840678, + "name": "NWBUncompressed", + "updated_at": "2015-06-09T15:21:33-07:00" + }, + "well_known_file_type_id": 478840678 + } + ] +} +""" + + +@pytest.fixture +def no_nwb_config(): + bmr = BiophysicalModuleReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_NO_NWB_FILES)): + bmr.read_lims_file(lims_json_path) + + return bmr + + +@pytest.fixture +def one_nwb_config(): + bmr = BiophysicalModuleReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_ONE_NWB_FILE)): + bmr.read_lims_file(lims_json_path) + + return bmr + + +@pytest.fixture +def two_nwb_config(): + bmr = BiophysicalModuleReader() + + lims_json_path = 'lims_message.json' + + with patch(builtins.__name__ + ".open", + mock_open(read_data=LIMS_MESSAGE_TWO_NWB_FILES)): + bmr.read_lims_file(lims_json_path) + + return bmr + + +def test_no_nwb(no_nwb_config): + assert no_nwb_config.lims_data['well_known_files'][0]['well_known_file_type']['id'] != 478840678 + no_nwb_config.update_well_known_file('/path/to/example.nwb') + assert no_nwb_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 478840678 + + + +def test_one_nwb(one_nwb_config): + assert one_nwb_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 478840678 + one_nwb_config.update_well_known_file('/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/496537307_virtual_experiment.nwb') + assert one_nwb_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 478840678 + assert one_nwb_config.lims_update_data['well_known_files'][1]['id'] == 22222 + + +def test_two_nwb(two_nwb_config): + assert two_nwb_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 478840678 + two_nwb_config.update_well_known_file('/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/496537307_virtual_experiment.nwb') + assert two_nwb_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 478840678 + assert two_nwb_config.lims_update_data['well_known_files'][1]['id'] == 22222 + assert len(two_nwb_config.lims_update_data['well_known_files']) == 2 diff --git a/test/internal/tissuecyte_stitching/__pycache__/test_stitcher.cpython-37.pyc b/test/internal/tissuecyte_stitching/__pycache__/test_stitcher.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d45c93f4089dcd748ed9f5c3043e72071cfb8a9f GIT binary patch literal 4715 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 WlI1nLy4Sq5;5EG&&-0eN<^KWknn9WX literal 0 HcmV?d00001 diff --git a/test/internal/tissuecyte_stitching/__pycache__/test_tile.cpython-37.pyc b/test/internal/tissuecyte_stitching/__pycache__/test_tile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..498ca75f3f1fb3cd43645c560b9693b57f348b8e GIT binary patch literal 3202 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 literal 0 HcmV?d00001 diff --git a/test/internal/tissuecyte_stitching/test_stitcher.py b/test/internal/tissuecyte_stitching/test_stitcher.py new file mode 100644 index 0000000000..4aef1a1cdc --- /dev/null +++ b/test/internal/tissuecyte_stitching/test_stitcher.py @@ -0,0 +1,150 @@ +import operator as op + +import pytest +import mock +import numpy as np + +import allensdk.internal.mouse_connectivity.tissuecyte_stitching.stitcher as stitcher + + +def test_initialize_image(): + + image = stitcher.initialize_image({'row': 40, 'column': 12}, 2, np.float32, 'F') + + assert( np.allclose( image.shape, [40, 12, 2] ) ) + assert( np.sum(image) == 0 ) + assert( image.dtype == np.float32 ) + assert( image.flags.f_contiguous ) + + +def test_initialize_images(): + + a, b, = stitcher.initialize_images({'row': 40, 'column': 12}, 1) + + assert(a.dtype == np.uint16) + assert(b.dtype == np.int8) + assert(len(a.shape) == 3) + + +def test_make_blended_tile(): + + tile = np.arange(25, dtype=float).reshape(5, 5) + current_region = np.ones((5, 5)) * 30 + blend = np.zeros((5, 5)) + blend[-1, :] = 1 + blend[-2, :] = 0.5 + + exp = tile.copy() + exp[-1, :] = 30 + exp[-2, :] = (np.arange(15, 20, dtype=float) + 30) / 2 + + obt = stitcher.make_blended_tile(blend, tile, current_region) + assert(np.allclose(exp, obt)) + + +@pytest.mark.parametrize('lg,axis,point', [(op.lt, 0, 0), (op.gt, 0, 8), (op.lt, 1, 1), (op.gt, 1, 7)]) +def test_get_indicator_bound_point(lg, axis, point): + + indicator = np.zeros((10, 10)) + indicator[9:, :] = 1 + indicator[:, 8:] = 1 + indicator[0, :] = 1 + indicator[:, :2] = 1 + indicator[7:, 7:] = 0 + + obt = stitcher.get_indicator_bound_point(indicator, lg, axis) + + assert( obt == point ) + + +def test_blend_component_from_point(): + + mesh = np.tile(np.arange(20), (10, 1)) + point = 15 # indexed in the diff: 17 -> only last r/c + lg = op.gt + + exp = np.zeros((10, 20)) + exp[:, :18] = 0 + exp[:, -3] = 1.0 / 3.0 + exp[:, -2] = 2.0 / 3.0 + exp[:, -1] = 1 + + obt = stitcher.blend_component_from_point(point, mesh, lg) + assert( np.allclose( obt, exp ) ) + + +def test_blend_component_from_point_divzero(): + + mesh = np.zeros((20, 20)) + point = 0 + + lg = op.gt + obt = stitcher.blend_component_from_point(point, mesh, lg) + + assert( np.allclose(obt, mesh) ) + + +def test_get_blend_component_nopoint(): + + with mock.patch('allensdk.internal.mouse_connectivity.tissuecyte_stitching.stitcher.get_indicator_bound_point', + new=lambda *a, **k: None): + + assert( len(stitcher.get_blend_component(1, 2, 3, 4)) == 0 ) + + +def test_get_blend_component_actual(): + + indicator = np.zeros((20, 10)) + indicator[16:, :] = 1 + + lg = op.gt + axis = 0 + meshes = np.meshgrid(np.arange(20), np.arange(10), indexing='ij') + + exp = np.zeros_like(indicator) + exp[17, :] = 1.0 / 3.0 + exp[18, :] = 2.0 / 3.0 + exp[19, :] = 1.0 + + obt = stitcher.get_blend_component(indicator, lg, axis, meshes) + assert( np.allclose( obt, exp ) ) + + +def test_get_overall_blend(): + + meshes = np.meshgrid(np.arange(20), np.arange(20), indexing='ij') + + indicator = np.zeros((20, 20)) + indicator[16:, :] = 1 + indicator[:, 17:] = 1 + + exp = np.zeros_like(indicator) + exp[17, :] = 1.0 / 3.0 + exp[:, 18] = 1.0 / 2.0 + exp[18, :] = 2.0 / 3.0 + exp[:, -1] = 1 + exp[-1, :] = 1 + + obt = stitcher.get_overall_blend(indicator, meshes) + assert( np.allclose(obt, exp) ) + + +def test_get_blend(): + + indicator = np.zeros((20, 10)) + indicator[16:, :] = 1 + indicator[:, 7:] = 1 + + stup = (20, 10) + cb = np.sqrt + + exp = np.zeros_like(indicator) + exp[17, :] = 1.0 / 3.0 + exp[:, 8] = 1.0 / 2.0 + exp[18, :] = 2.0 / 3.0 + exp[:, -1] = 1 + exp[-1, :] = 1 + exp = np.sqrt(exp) + + obt = stitcher.get_blend(indicator, stup, cb) + assert( np.allclose( obt, exp ) ) diff --git a/test/internal/tissuecyte_stitching/test_tile.py b/test/internal/tissuecyte_stitching/test_tile.py new file mode 100644 index 0000000000..d7dc4662ad --- /dev/null +++ b/test/internal/tissuecyte_stitching/test_tile.py @@ -0,0 +1,106 @@ +import pytest +import mock +import numpy as np + +from allensdk.internal.mouse_connectivity.tissuecyte_stitching.tile import Tile + + + +@pytest.fixture(scope='function') +def small_tile(): + + index = 20 + image = np.arange(200).reshape((10, 20)) # columns fast + is_missing = False + bounds = {'row': {'start': 40, 'end': 48}, 'column': {'start': 500, 'end': 516}} + channel = 2 + size = {'row': 8, 'column': 16} + margins = {'row': 1, 'column': 2} + + return Tile(index, image, is_missing, bounds, channel, size, margins) + + +def test_trim_self(small_tile): + + small_tile.trim_self() + + assert( np.allclose( small_tile.image.shape, [8, 16] ) ) + assert( np.amin(small_tile.image) == 22 ) + + + +def test_trim(small_tile): + + image = np.diag(np.arange(20)) + out = small_tile.trim(image) + + assert( np.allclose( out.shape, [8, 16] ) ) + assert( np.amax(out) == 8 ) + + +@pytest.mark.parametrize('rs,cs,yn', [(8, 16, False), (11, 21, True)]) +def test_average_tile_is_untrimmed(small_tile, rs, cs, yn): + + image = np.zeros((rs, cs)) + res = small_tile.average_tile_is_untrimmed(image) + + assert( res == yn ) + + +@pytest.mark.parametrize('avt,do_trim', [(np.ones((8, 16)) * 2, True), + (np.ones((8, 16)) * 2, True), + (np.ones((10, 20)) * 2, True), + (np.ones((10, 20)) * 2, False)]) +def test_apply_average_tile(small_tile, avt, do_trim): + + if do_trim: + small_tile.trim_self() + + res = small_tile.apply_average_tile(avt) + assert( np.allclose(res, small_tile.image * 2) ) + + +def test_no_average_tile(small_tile): + + res = small_tile.apply_average_tile(None) + assert( np.allclose(res, small_tile.image) ) + + +def test_apply_average_tile_to_self(small_tile): + + av = np.ones((10, 20)) * 3 + prev = small_tile.image.copy() + small_tile.apply_average_tile_to_self(av) + + assert( np.allclose( small_tile.image, prev * 3 ) ) + + +def test_get_image_region(small_tile): + + image = np.zeros((1000, 1000, 3)) + image[:, :, 0] += 1 + image[:, :, 1] += 2 + image[:, :, 2] += 3 + image[45, 505, 2] = 4 + + slc = small_tile.get_image_region() + image = image[slc] + + assert( np.allclose( image.shape, [8, 16] ) ) + assert( image.sum() == 8 * 16 * 3 + 1 ) + + +def test_get_missing_path(small_tile): + + obt = small_tile.get_missing_path() + exp = [40, 500, 48, 500, 48, 516, 40, 516] + + assert( np.allclose(obt, exp) ) + + +def test_initialize_image(small_tile): + + exp = np.zeros((8, 16)) + small_tile.initialize_image() + + assert( np.allclose( small_tile.image, exp ) ) diff --git a/test/model/__pycache__/check_parser.cpython-37.pyc b/test/model/__pycache__/check_parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fac5a126202dbca154b3656e77ad4074273f4b1 GIT binary patch literal 459 zcmYjN!Ait15KYo;EsKl(g2#e(1#cpv?p3^qmr@9`&9E(P(~@*o7QD#%A&Mve#V_d9 zlfU4}Np;16d6UWHy_w9_WHM%C`t=dsDSo(QYl03J<o1|AF~uuZ^MrGzgz}zPBG6N# zQkX;J&!ZQX_$bidxVnGKqTrKQEaLsx7PV}_STq@TcVsSl<TG-+PtdWBKd=oS=#1$6 zCKA2hnnHK|Xhm#N3T&2R4R6c@MES~Rr|BK3+7xn7@f_|!uhUBnS)&!4q^MUmZCcbe zBW&7yZPV*wp4y_rqZYCf7D(Kxq8F;1c4)h4-6*W4)Fvx`XO7!-zqi2dCsh*6!n)C| zTMy$VB<w>eYbdmoH&KurY$fACEuI%c?;?XLHcPG17{~o%YN%1lemv}G&^NxTyHEau XouSbgX)Y@~cN?^>_pS)Nkca#mtG;;; literal 0 HcmV?d00001 diff --git a/test/model/__pycache__/test_biophysical_perisomatic.cpython-37.pyc b/test/model/__pycache__/test_biophysical_perisomatic.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3e206b10d3f7af00a9b910ba623749f5504fcc6 GIT binary patch literal 1690 zcmZux&2Jnv6d%vdOeXu8Y}1m^Qc~2*9=bVji-4vLpHjaB6bZA^$QgTgy_vBG+q3Pi zW)Bdq75oXi>H+mH;m!qVPDq?Mazz|?o=rjz*z)sx&+pm(z4z?<tybNECSHC=RxQW* z!wMJ81Lg>ZPJmE{qQt@L8DUh(E_PvdlUnLw581U^;->))D&9*r(h!Fg?<bpS9oLb= zoJnKSqygQa;S0BtT6B}ve{jyw8NzLfzHoYtKjB2@Q4f{Du@pl-0?vPGc%p%6en^bv zx#7&p?fYD2<C*3$N$zF*%Xudw%5akG8>S5x);Um&Xena5t!-N{0vN|I^g9UPp#=b0 zAOjH2(88r&;YO%%CvM>si25&F<e1vhqrnOR=bt%CfUrV~n%O9<hgW!$aN!rV$>t&` zf@PhCu)0xr%SN%WY+8sb*ZP8{wQ^wgm+iuzbZBGGq0KV{)*)>bVYEftK({N}rJcf$ zu7J<Z%2{lJ&((9^Yj&nvi#nY62Hl1|>^|K+XVIWn7EKr}v%B0YHtEiuvqD8<*D0Di z&Z2#;y;^Bopy`-5m)DDW(Jnfx8erR9-YD8DL>s5xPe|W1Z+#ERhNN73#J}0>-6&Ci zzB@K1J3Kfb8SkGc!o{7GWPPbdANLU6ekRo^ggv5MvDip8n|Fm0e40v{>;oC{gz0%J zC4vtjL;VS42G<`x{`|?Oj~_h#<m=KWI_A6#_(({_6r{%)!GQMr-BJCwm)ZOEU+%6o zM?W5|ne6AIc~|Bp%S|+ui6JA_r^MimAvd-N%I+i=vEfognKVq;0vY}D>aSlPo;<l* zqG^dt@22wM4BU=MJZ2HpPMRmVF6(O<b|a-Lbs6ZHHY`;x7?)lm2~{=AqH!5sfGWcg zGf_s&7+)DN!4xqpN~OxiGLfTM888t`%J7bLk7AZ2V5~^W3{x5hpB*P8&9J9sO3E6r zrB7KxX1GRkg?*!q%y0|BD;15VB*~e^jUgBCCP>2PtgNYAlwNgZU*u^vgP<x!X39Ql z+|*>sF2aOcvCM^ugcNh8WZAx_HG>Bv#Yaj>)!V|`g5^pIk^lm@M#L%Zthvh+WA`L0 z8<go-@yz;`es15Z+J^H~*B%Nk7x34C@oa=~ZOUTYIM197n6f_-cGIs)Hw9GZD;5fF zo(tf|^eacb4VHgDKRz5hg&XSu857z+A<u}I4ekjNOF_xI116?=ATuU(47B<x1`qhj zKy$<HWF$U?QUTv20SkJ1U_Xt63SGrUC;$B}QN|RvDKR|mLrAx*?dt}2;6C~gh~s&# z=Y}XiZB%!g2sk%Db<{<ny8~M2Zs3Ms5rSP8dB}6Gp|0C@)h+Pub#Rc)?Cz=!qS^z3 zZ(UrmU)`>Mez8dNv=30>m#iuh@BhD@{T}=4oY-o`*DuYWh^n^|+12V-U02ENOAGtX zzs&(W(-+6u?IO@uPp0%zqE2z3PkF|N*nd7GJgJaWDSD0U!_j5<9w5jQ_Q7qCv@H&Z M1N7#)*KFMW1;s=3J^%m! literal 0 HcmV?d00001 diff --git a/test/model/__pycache__/test_glif.cpython-37.pyc b/test/model/__pycache__/test_glif.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef896384219039afdf1543203ca786c6b92acd28 GIT binary patch literal 2643 zcmb7FOK%)S5bmDG&g|@Z{S2}5260&g4hRXM2n9@HK_s+9a>!w1X*AyMU5`CGGj#XH zaWs1X2Z;mXH`wCD9d2Cs51i&mPPxGiaiXfmUO$uzv+AC%>YCc>ufD4ObY>=C@MJ%I z6aTiz*b5X+9vc>)z|g<IB$(hS3-N8Gd}M_duXXmwu^49~H*`s3r;U*pdbD;@f7A?{ z$Cg1DNVd}wu4p`G2Rv+(<O!do8IqbJAgM!AOSDOvC22-<NSY&QR?Lw!Ptv?tAZbA? zilyf)ToinRbuYby$XTz;EAO*38LSlvECXEj<XGhyO1-_U`>}~Pr0H|Ch6mpcjC(M2 z2PVUI_@Pw-1V<LQwR+DMGI9|0^K6g|S9dfxvnwmtl~crKyK;8&1l_j=S!Cp>h(w}( zW~vF!{+0LcY<{Js(wp&iELOMTy*S(7T+3o`CgS%uW%fjG=7r33ALhK+-q)L7BwL$0 zG4h=v?(fD!3E!qEScu)*Mrw0=lna^CG8)41R*U`We2CE?N#)ykAPXjDsTR!t=fv|8 z1BvvWl!ZP%uyVnPYT)F-)aA;@HJ-AbkX+TdFDZ`qKz$NN8`gao^dRyWA0hu1ECibX z>WKetL*2r+;47drkc|UKv9S)=23S#6!udz*8;_#3hYzCl-u;JPKIlE_+7x5u0jLRN zT%q?a4}F=50#aly2J0hyQCuV+fT5=1upBGk0rxG1TsRji#!Io{xdorFvW_Hqy!`v? z<Qh0IUvni+Bg#^ghzozJX5s5K7#dl};QvU|CkYe?@RW}jSIG`p$&Wb46+dDV$5@AU zX_d|qlqKjK(7B|uOSjemLcG^?!-b(V(fNqN`BU97qpJ>5IvSfKO-v$n<?bn<UpR-B zXPMA#5GoWfaY|uAtC@54QMJ#0a^dvVVqHXIB?XZe(f=HrX!OMF!18&UhFSu-PyB@i z?jrvP{{j{UuqfFPpIEd4d?q&J#3^lI0cQY@(mCLhM%e(YTw$-Etyg-&fnDD?hi++s zrYT&|HCEVFRyL!C@FqdoJoHLmSY_}XcmkVN*#bQM-m|tg$!MI8^=h`arH~F)n@S|g z#-lB%D*wb_2z&7S^>H|(<57_&*)USEk;%&n80o7y*sL5SW1%qDRTGgWSIQ=Npz;y4 zk-n)cVJcgVvu^toakT(O3R*a;W^1sq;G--a$*Oe*efSu9lz@(>UPI$Xov6w;;II$z zRE>OWit)w5P;Y?sV;FiFCPo$E*gp4phx<;zJGR3YEV7zr2#aFM+YdpQ=EZ`%0ADFD zz}?b@ytt(cd2x>O0$HNGKz;ye_f<%%OW=}D(RBzubr}`-j|zhXP_fAoAqg3E4aMs? z-N5N4PKd$<Mv^WAJvDzk>-3}+?M+XJT@O!598|D4Jz-suH3x@WSW8UU_4_h(ij&pE z5x~y~2C&ZoYZtFa0hgkHt5CoNxa|{T8-R{?1l%+J0o%27W}4q}>U%T2V`?$>Qa}j9 zJ3qYp=a2jAcZYv(zxe*wfBv`|25TGru~ITK8Y);NBGN^&D<j~p)ZsN~gHjcF3fZ6T zY%8g^^HhY(uiB;WuDoLBNuC<Gp2E4)KZvw}8>4EPsY~zJsvDe18<JeD;B*D2t1wl8 zNCpE5arb5A?8<#z*;<;av!>ztG)bPVE0wFRM~$IQHkH9G^gxM4)`qk4X(9V~xIrRQ zp)aJnTEr_f0{&C`sSBcn4>h_Vs@pg01~ejvTl5Po)rFnzQrIZ=@#FCN$#uL6&1?1R zu~g7BS5NK|x^=>9Q=5LSBwe9r8mxm#!XvynHKYrJ+|<76*r*|dSEg3v4*E}oWgP)R zbq!#1481|})Ie)JQwn&C)%_a#DV1yu7M|%0Hgt{C4eoygfs9jm_f4?Sm>+1#d;vzA R`*z2LU#sJFI-TWC=Rfh3cp3lz literal 0 HcmV?d00001 diff --git a/test/model/__pycache__/test_runner.cpython-37.pyc b/test/model/__pycache__/test_runner.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..411aa28bed319585f683f44c07d67739f72a897c GIT binary patch literal 632 zcmYjOv5wR*5Ve!+Zg!8QxPpoz1<e+lD`*fxz;Qw}rxOy;M3ExL_GZIo?a1TYk%%im ze8`=s_@%T|`~nqY?;+htGxm(%JkPV=ESC#{rha~7uL44TyX3!NPF|zKV+?`_+K}w9 z(u|5ggg;0Y2>OAnqCbcr7u-c>t}{kILx=YmEV-e=_lT&9Zs|1<ldt3^5Yt<_o52$s zey8^_VkRaPo?TPK(L3A}&K*v~c;kF{w@A=FO0daBo1~Ey<9))ENR+&C)w0&@wuhRt zCfREtn*{28*Dzaam0+;}&oEBg-fp!Tg7tn#uq+jbU22gc^=&ENO1>*vW<Z)@xo4{0 zxWmt&RThEm%3;#k&HCAJv|h6>S{1f$<;5x*7toch(Od$I4-PE4vu$U`sgN8;8Xukl zlDdiB8l%lB$c~t)pg5?>VxOR%U&PGt8UI#i&+|{%0Xf?;k(TU=sXjkdjB6#>(_E@c z$aRYnI7Y8OKd;LiYAe?*<2zPK?7b6t;zXW!k$zj4PAO^9wjby2sBqUu?hoB(lF2bW n4j)l7$NehI+`A#jgqZr8AMsvrO=J85`MXBGq?mcKn8v|BVA!)= literal 0 HcmV?d00001 diff --git a/test/model/aa_model/468193142_fit.json b/test/model/aa_model/468193142_fit.json new file mode 100644 index 0000000000..3c1524d29d --- /dev/null +++ b/test/model/aa_model/468193142_fit.json @@ -0,0 +1,297 @@ +{ + "passive": [ + { + "ra": 100 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 42 + ] + } + ], + "conditions": [ + { + "celsius": 34, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "axon", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "apic", + "ek": -107.0 + }, + { + "ena": 53.0, + "section": "dend", + "ek": -107.0 + } + ], + "v_init": -90 + } + ], + "genome": [ + { + "section": "soma", + "name": "g_pas", + "value": "0.000115204", + "mechanism": "" + }, + { + "section": "soma", + "name": "e_pas", + "value": "-60.8666", + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": "0.00357173", + "mechanism": "" + }, + { + "section": "axon", + "name": "e_pas", + "value": "-89.2642", + "mechanism": "" + }, + { + "section": "apic", + "name": "g_pas", + "value": "0.000734207", + "mechanism": "" + }, + { + "section": "apic", + "name": "e_pas", + "value": "-85.0301", + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": "0.000599527", + "mechanism": "" + }, + { + "section": "dend", + "name": "e_pas", + "value": "-77.8017", + "mechanism": "" + }, + { + "section": "soma", + "name": "cm", + "value": "5.74988", + "mechanism": "" + }, + { + "section": "soma", + "name": "Ra", + "value": "80.4097", + "mechanism": "" + }, + { + "section": "axon", + "name": "cm", + "value": "6.40968", + "mechanism": "" + }, + { + "section": "axon", + "name": "Ra", + "value": "134.494", + "mechanism": "" + }, + { + "section": "apic", + "name": "cm", + "value": "1.661", + "mechanism": "" + }, + { + "section": "apic", + "name": "Ra", + "value": "134.795", + "mechanism": "" + }, + { + "section": "dend", + "name": "cm", + "value": "3.60089", + "mechanism": "" + }, + { + "section": "dend", + "name": "Ra", + "value": "132.962", + "mechanism": "" + }, + { + "section": "axon", + "name": "gbar_NaV", + "value": "0.00858067", + "mechanism": "NaV" + }, + { + "section": "axon", + "name": "gbar_K_T", + "value": "0.00041204", + "mechanism": "K_T" + }, + { + "section": "axon", + "name": "gbar_Kd", + "value": "0.00991589", + "mechanism": "Kd" + }, + { + "section": "axon", + "name": "gbar_Kv2like", + "value": "0.028411", + "mechanism": "Kv2like" + }, + { + "section": "axon", + "name": "gbar_Kv3_1", + "value": "0.470895", + "mechanism": "Kv3_1" + }, + { + "section": "axon", + "name": "gbar_SK", + "value": "0.00666493", + "mechanism": "SK" + }, + { + "section": "axon", + "name": "gbar_Ca_HVA", + "value": "2.26824e-05", + "mechanism": "Ca_HVA" + }, + { + "section": "axon", + "name": "gbar_Ca_LVA", + "value": "0.000777723", + "mechanism": "Ca_LVA" + }, + { + "section": "axon", + "name": "gamma_CaDynamics", + "value": "0.0286496", + "mechanism": "CaDynamics" + }, + { + "section": "axon", + "name": "decay_CaDynamics", + "value": "810.579", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "gbar_NaV", + "value": "0.0411485", + "mechanism": "NaV" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": "0.00724519", + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": "0.552412", + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": "9.37709e-05", + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": "0.00134904", + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": "0.0107353", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": "376.44", + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "gbar_Ih", + "value": "7.26846e-06", + "mechanism": "Ih" + }, + { + "section": "apic", + "name": "gbar_NaV", + "value": "0.0116712", + "mechanism": "NaV" + }, + { + "section": "apic", + "name": "gbar_Kv3_1", + "value": "0.593147", + "mechanism": "Kv3_1" + }, + { + "section": "apic", + "name": "gbar_Im_v2", + "value": "0.00986108", + "mechanism": "Im_v2" + }, + { + "section": "apic", + "name": "gbar_Ih", + "value": "9.41351e-06", + "mechanism": "Ih" + }, + { + "section": "dend", + "name": "gbar_NaV", + "value": "0.035328", + "mechanism": "NaV" + }, + { + "section": "dend", + "name": "gbar_Kv3_1", + "value": "0.394028", + "mechanism": "Kv3_1" + }, + { + "section": "dend", + "name": "gbar_Im_v2", + "value": "0.00107209", + "mechanism": "Im_v2" + }, + { + "section": "dend", + "name": "gbar_Ih", + "value": "2.18585e-06", + "mechanism": "Ih" + } + ] +} \ No newline at end of file diff --git a/test/model/aa_model/__pycache__/test_biophysical_all_active.cpython-37.pyc b/test/model/aa_model/__pycache__/test_biophysical_all_active.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..898e30ae716379f4a3786dee7a13b2153e2b01c0 GIT binary patch literal 1720 zcmY)uO^+Kj)SgTxlh57FZcDd?l0q+g*entkgb>~Bf}m2r_~-#E(#RP*iL;)M+MZNd zO(dXjE<Yg=2h@MS??B=*CnQc4C$5MC&y#FRZTZ>n`Mu}&<#)T?ZXg)(&)?B!ZG`@` z$i=9@;TV=S02pFeBC_5w!6ohx2X;qRBA2+>-c@8Z@`xAJNUg+O=|^=^FV9ukh?=BX zo;}%$+N52cvFwlzN7Jq8HmfoJ2lNz^9frR`2lW^5GP-|&3-2_EM`C>76xByYNL_SJ zq&x|YnDG(^md<UFq?5T8A(bbo07~l<YV55rf@{mc?R_xf)MSe5&?>hB97i6kQ&_rz z5i)3r8D`GdSz(Nf^As&Btg^xjWZWFgTi_f|s|zPbQ*TkpE6W;l;nvOZ($C#xomH8) za+VENTVbmK=*<;^-C4GBXWC}|K4SH!aJQ(kMqUj%tO;<dgxd^wf*p|QuF%2*nca=- zUb&;`CDsOctE01z7B#lD@Xh7r8@b1}_t6UHwJT^*-%xf+iob^z4c1*W&6VYT-puQH zV^smqu9|DhH%rU`uUdJF?VdS5VeOf>zQ=42QgG?~PNN6oYpzXil&Id2hG$QxV!bel zQfkD|#&_OJMm;m(J;}#3ocE}dhqTO2FG?7fy3|4Hv5LhEDDu1xa3mzxN9XN`#$p8e z`%|67q;c=Tmk&RGaQDGy-xO7<Lm>)JjN?S{^J->BhaV`&5E{dR@yD(4+duyG#jn?Y zzqO_uKRaF@(qE2AZ6u5l@wn(tvlz@t;vh{7kBy*m{O|L>f4et)c&os(0-N)0l9@C! z!7P!6j(ML^^P&qc+&{QpG;}shRT6Toi$*x%;aLDhCY1yCg)0-vlxvT8Qur6n6#kf- z03tLYyJH@6MGX(4M5U8NCgXYG@i>Ig6dvPtCwo>+5OOI&NYRKJt~BxPoJty{#MMbe ziwYczD#Vk{Nrh#KRE;)CO4<r^C>G49%(y1ak%*z@sTAkDsHiM1T=0e#)i{gNIRsTH zI#;&hNlViizwo)JNFJ-2rC(<7ehBtw267B6Iu&Q!emkwXvXT5$sYD&Lizb7gq(o|I z1tbVQr`iD($_9^Yz4CY+3s)Nvk;;sR%66W@iNM}X=&g~YwLyT*y0XE_I5xokjUmsG zx&h+<e0%!g;1O7)2XsPNe@LIucs@9ZX_&-}zCYmcOb?Qj$2tU9_J_e;F&t=N_+bjA z45<cL365)ac4VLmkIITYq7<?Pp)P5`@KtXKfIC<hcORm;Yh_-)r+qL@zXt$$9jAqT z>^UB8;49d7_ONHC<2k<L1K!0hEDJl%HdgO~%t4oU>D;O<oJ6auKq5CTOzf9N^*8ne zT10(t6<T9ijKu!D(v{cwY)|a3b7Q-DS*_&eOJ16a{^N`*Xp<M3twaEHRkhDwd&vrQ zR{o8^YAYM-x{x|AIm#wmR*~v}Y~e;!osliYA7=u(ZV>ZKC2{F#nZy5qcPzjE5xAI1 V{_#z~w5=kD6U-LghGnPk{0E%!0!{z` literal 0 HcmV?d00001 diff --git a/test/model/aa_model/manifest.json b/test/model/aa_model/manifest.json new file mode 100644 index 0000000000..bb14aec992 --- /dev/null +++ b/test/model/aa_model/manifest.json @@ -0,0 +1,131 @@ +{ + "biophys": [ + { + "model_file": [ + "manifest.json", + "468193142_fit.json" + ], + "model_type": "Biophysical - all active" + } + ], + "runs": [ + { + "sweeps": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 55, + 58, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76 + ] + } + ], + "neuron": [ + { + "hoc": [ + "stdgui.hoc", + "import3d.hoc" + ] + } + ], + "manifest": [ + { + "type": "dir", + "spec": ".", + "key": "BASEDIR" + }, + { + "type": "dir", + "spec": "work", + "key": "WORKDIR", + "parent": "BASEDIR" + }, + { + "type": "file", + "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc", + "key": "MORPHOLOGY" + }, + { + "type": "file", + "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_marker_m.swc", + "key": "MARKER" + }, + { + "type": "dir", + "spec": "modfiles", + "key": "MODFILE_DIR" + }, + { + "type": "file", + "format": "NWB", + "spec": "468193140.nwb", + "key": "stimulus_path" + }, + { + "parent_key": "WORKDIR", + "type": "file", + "format": "NWB", + "spec": "468193140.nwb", + "key": "output_path" + } + ] +} \ No newline at end of file diff --git a/test/model/aa_model/test_biophysical_all_active.py b/test/model/aa_model/test_biophysical_all_active.py new file mode 100644 index 0000000000..708db12c64 --- /dev/null +++ b/test/model/aa_model/test_biophysical_all_active.py @@ -0,0 +1,85 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import os +import numpy +from allensdk.model.biophys_sim.config import Config +from allensdk.model.biophysical.utils import Utils, AllActiveUtils +from allensdk.api.queries.biophysical_api import BiophysicalApi +from allensdk.core.dat_utilities import DatUtilities +from allensdk.ephys import ephys_features +import subprocess + +@pytest.mark.requires_neuron +def test_biophysical_aa(): + """ + Test for backward compatibility of the legacy all-active models + """ + + subprocess.check_call(['nrnivmodl', 'modfiles/']) + + description = Config().load('manifest.json') + utils = AllActiveUtils(description) + h = utils.h + + manifest = description.manifest + morphology_path = manifest.get_path('MORPHOLOGY') + utils.generate_morphology(morphology_path.encode('ascii', 'ignore').decode("utf-8")) + utils.load_cell_parameters() + + stim = h.IClamp(h.soma[0](0.5)) + stim.amp = 0.33 # Sweep 46 + stim.delay = 1000.0 + stim.dur = 1000.0 + + h.tstop = 3000.0 + + vec = utils.record_values() + + h.finitialize() + h.run() + + junction_potential = description.data['fitting'][0]['junction_potential'] + ms = 1.0e-3 + + output_data = (numpy.array(vec['v']) - junction_potential) # in mV + output_times = numpy.array(vec['t']) * ms # in s + output_path = 'output_voltage.dat' + + DatUtilities.save_voltage(output_path, output_data, output_times) + + num_spikes = len(ephys_features.detect_putative_spikes(output_data, output_times)) + assert num_spikes == 18 # taken from the web app where the legacy model output is shown diff --git a/test/model/check_parser.py b/test/model/check_parser.py new file mode 100644 index 0000000000..5843fc6c2d --- /dev/null +++ b/test/model/check_parser.py @@ -0,0 +1,8 @@ +from allensdk.model.biophysical.runner import sim_parser + +def get_parsed_args(schema): + print(vars(schema)) + +if __name__ == '__main__': + schema = sim_parser.parse_args() + get_parsed_args(schema) diff --git a/test/model/peri_model/468193142_fit.json b/test/model/peri_model/468193142_fit.json new file mode 100644 index 0000000000..9d72939efc --- /dev/null +++ b/test/model/peri_model/468193142_fit.json @@ -0,0 +1,145 @@ +{ + "passive": [ + { + "ra": 32.0772432623, + "cm": [ + { + "section": "soma", + "cm": 1.0 + }, + { + "section": "axon", + "cm": 1.0 + }, + { + "section": "dend", + "cm": 3.7002019468166822 + }, + { + "section": "apic", + "cm": 3.7002019468166822 + } + ], + "e_pas": -84.74527740478516 + } + ], + "fitting": [ + { + "junction_potential": -14.0, + "sweeps": [ + 46 + ] + } + ], + "conditions": [ + { + "celsius": 34.0, + "erev": [ + { + "ena": 53.0, + "section": "soma", + "ek": -107.0 + } + ], + "v_init": -84.74527740478516 + } + ], + "genome": [ + { + "section": "soma", + "name": "gbar_Im", + "value": 0.00011215709095308002, + "mechanism": "Im" + }, + { + "section": "soma", + "name": "gbar_Ih", + "value": 0.00045041730360183556, + "mechanism": "Ih" + }, + { + "section": "soma", + "name": "gbar_NaTs", + "value": 1.1281486914123688, + "mechanism": "NaTs" + }, + { + "section": "soma", + "name": "gbar_Nap", + "value": 0.00095782168667023497, + "mechanism": "Nap" + }, + { + "section": "soma", + "name": "gbar_K_P", + "value": 0.096648124440568361, + "mechanism": "K_P" + }, + { + "section": "soma", + "name": "gbar_K_T", + "value": 2.2406204607139379e-05, + "mechanism": "K_T" + }, + { + "section": "soma", + "name": "gbar_SK", + "value": 0.0068601737830082388, + "mechanism": "SK" + }, + { + "section": "soma", + "name": "gbar_Kv3_1", + "value": 0.33043773066721083, + "mechanism": "Kv3_1" + }, + { + "section": "soma", + "name": "gbar_Ca_HVA", + "value": 0.00026836177945335608, + "mechanism": "Ca_HVA" + }, + { + "section": "soma", + "name": "gbar_Ca_LVA", + "value": 0.0077938181828292709, + "mechanism": "Ca_LVA" + }, + { + "section": "soma", + "name": "gamma_CaDynamics", + "value": 0.00044743022380752001, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "decay_CaDynamics", + "value": 998.99266101400383, + "mechanism": "CaDynamics" + }, + { + "section": "soma", + "name": "g_pas", + "value": 0.00091710033541291013, + "mechanism": "" + }, + { + "section": "axon", + "name": "g_pas", + "value": 0.00074804303211946897, + "mechanism": "" + }, + { + "section": "dend", + "name": "g_pas", + "value": 0.00016449702719528828, + "mechanism": "" + }, + { + "section": "apic", + "name": "g_pas", + "value": 4.4606771501076728e-05, + "mechanism": "" + } + ] +} \ No newline at end of file diff --git a/test/model/peri_model/__pycache__/test_biophysical_peri.cpython-37.pyc b/test/model/peri_model/__pycache__/test_biophysical_peri.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..875d19a7fedd8d322f58aafa7a4309b3cefac15c GIT binary patch literal 1712 zcmZt`OOG2h*q%%#ljrWH+tO_TrO?YBnnmJ*5Td(X5Fqs>pa)E(ku!D@XFZSFo>W;) z4p8p!6B2Pi{W}~u_=Lo%N3MtipJ%fz5_sg#{+{!_{N3wzTL@PA^LO;yE<%4e<Z{*E zatvD=01PoK5xF=q!4>Wi4^B_k5})|k@oKW31SCirq*39%43j2lR`<GWC2i8K?t$zi zUDB=YSoTPdqxsH!mo-@U1A30h9>ZUu!{$r)GkSQ4ZE%{U6EQvXZ2gH5Qrq5%lqazf z3tr(M(z_?Je74jgrt%~gK<Ru!jpGU<xONiU@uLZ+rchkR&bV6;I0|5&!qzQ}kU?wA zF!QF~24iHr=V)DHwGCb&<Coyx3YU0ZUwI{(2di3HTQ`^wT))KYu=LkWR%gM+Tenza zgPjGSw>Jn*Z`~=qd6$I;h&7)BZ&hclvL5wV8{kd_cNxe;d!W<bpj7}mSGKzQ)rsa; zSr_!3jotxTHQ3H7G}qQ|lmXj4KpR{(uA^0ROWCU^;XYcmSbx<v*VhMSyKI)NO${Qu zVQ#M9tS}Fv>XaRJ<;?pD>%hGAJ!bn*f~)7JtpTjBxi*7IrUqjgpFN|B4dN`xsS#tB z-{l~i49tuVa;}8V5}?O}Bx79aN}DuOm5K#W<ara|L`bfW&btXs#RM!5=Q>MC>%pTh zAAkPn{-e*nv306rA#5O~X{Pvjy)ctIA1J5|n!<+l``ziJTEE@Bpd9~rd~wNtIVO#X zFh-<P+n*OHv`Lmmd1iQO1eMdjU;O#&gYo0L7B4I|=l!fOd10bOCJmkPA*1HyP58sZ z!?$fq7vo%IG1uC*;u(+6B4{tEJm6bjW|S%SOe~(+@G=-1PPvI7H#2f&%2TeW;Zc&Q ze3r><y0igLV@Qn+7<VVxcV?oPO9@JfCfsnPN$|y~q)ASEmrh%QtF1#m>5|k~p-A0m zljWqVz=mScg35wx(w>MEx}8dK&TUN<sr4ZmYU^o{<V#4ZQgo?Yual0Z3w{~1tx2A$ zhNE9&@c$V6FAP)>M076BxO;F~bLBGmsZyCb?AkViH>5=FXch_t&r<Dy3DtLYc3ww( zkqciNk&xPg$I8td>m}gtHucU)(%B*)=0e$GRUTX5|JIQgNZkVUzsl1OM^C^bJ)$$p zhGY7SrpwVuO5-eL^!*V}7kZTCJk>G4YBG%Oi}6Sc!|&wK#87I`l@PdQXGaFQ@Tlt8 zBiF-FFGzMpjmEF%O5}J$$mCTg|6dL`rr!gAf}YpGAr8C%xA1iwdiywVpBH$c7XseL zK5Pej-Y!<}g3e)|1o_e#wqB;y4Iq(QmktgqhlX2UA}x|31PUXuYDF^me>pb`hZmJ` zZK`}{^Y$xQnv3Dn0z%^Y(z4TtfUfFJ^yVv3=(6f%M9x|@P%ql3_e!D~u2m1I9_U&> zq3Vq6DE_n%Fm0oh7b;7uNUI9|3%ujx!;c`uLh_Gq1EyUML7w32;9c163%!2;l&Jq( literal 0 HcmV?d00001 diff --git a/test/model/peri_model/manifest.json b/test/model/peri_model/manifest.json new file mode 100644 index 0000000000..79b3cbd3c6 --- /dev/null +++ b/test/model/peri_model/manifest.json @@ -0,0 +1,131 @@ +{ + "biophys": [ + { + "model_type": "Biophysical - perisomatic", + "model_file": [ + "manifest.json", + "468193142_fit.json" + ] + } + ], + "runs": [ + { + "sweeps": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 55, + 58, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76 + ] + } + ], + "neuron": [ + { + "hoc": [ + "stdgui.hoc", + "import3d.hoc" + ] + } + ], + "manifest": [ + { + "type": "dir", + "spec": ".", + "key": "BASEDIR" + }, + { + "parent": "BASEDIR", + "type": "dir", + "spec": "work", + "key": "WORKDIR" + }, + { + "type": "file", + "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc", + "key": "MORPHOLOGY" + }, + { + "type": "file", + "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_marker_m.swc", + "key": "MARKER" + }, + { + "type": "dir", + "spec": "modfiles", + "key": "MODFILE_DIR" + }, + { + "type": "file", + "spec": "468193140.nwb", + "key": "stimulus_path", + "format": "NWB" + }, + { + "key": "output_path", + "type": "file", + "spec": "468193140.nwb", + "parent_key": "WORKDIR", + "format": "NWB" + } + ] +} \ No newline at end of file diff --git a/test/model/peri_model/test_biophysical_peri.py b/test/model/peri_model/test_biophysical_peri.py new file mode 100644 index 0000000000..f7891a97e2 --- /dev/null +++ b/test/model/peri_model/test_biophysical_peri.py @@ -0,0 +1,85 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import os +import numpy +from allensdk.model.biophys_sim.config import Config +from allensdk.model.biophysical.utils import Utils, AllActiveUtils +from allensdk.api.queries.biophysical_api import BiophysicalApi +from allensdk.core.dat_utilities import DatUtilities +from allensdk.ephys import ephys_features +import subprocess + +@pytest.mark.requires_neuron +def test_biophysical_peri(): + """ + Test for backward compatibility of the perisomatic models + """ + + subprocess.check_call(['nrnivmodl', 'modfiles/']) + + description = Config().load('manifest.json') + utils = Utils(description) + h = utils.h + + manifest = description.manifest + morphology_path = manifest.get_path('MORPHOLOGY') + utils.generate_morphology(morphology_path.encode('ascii', 'ignore').decode("utf-8")) + utils.load_cell_parameters() + + stim = h.IClamp(h.soma[0](0.5)) + stim.amp = 0.35 # Sweep 47 + stim.delay = 1000.0 + stim.dur = 1000.0 + + h.tstop = 3000.0 + + vec = utils.record_values() + + h.finitialize() + h.run() + + junction_potential = description.data['fitting'][0]['junction_potential'] + ms = 1.0e-3 + + output_data = (numpy.array(vec['v']) - junction_potential) # in mV + output_times = numpy.array(vec['t']) * ms # in s + output_path = 'output_voltage.dat' + + DatUtilities.save_voltage(output_path, output_data, output_times) + + num_spikes = len(ephys_features.detect_putative_spikes(output_data, output_times)) + assert num_spikes == 27 # taken from the web app diff --git a/test/model/test_biophysical_perisomatic.py b/test/model/test_biophysical_perisomatic.py new file mode 100644 index 0000000000..c84fd669ff --- /dev/null +++ b/test/model/test_biophysical_perisomatic.py @@ -0,0 +1,90 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +import os +import numpy +from allensdk.model.biophys_sim.config import Config +from allensdk.model.biophysical.utils import Utils +from allensdk.core.dat_utilities import DatUtilities +from allensdk.api.queries.biophysical_api import BiophysicalApi + + +@pytest.mark.skipif(True, + reason="partial testing") +@pytest.mark.xfail +def test_biophysical(): + neuronal_model_id = 472451419 # get this from the web site + + model_directory = '.' + + bp = BiophysicalApi('http://api.brain-map.org') + bp.cache_stimulus = False # don't want to download the large stimulus NWB file + bp.cache_data(neuronal_model_id, working_directory=model_directory) + os.system('nrnivmodl modfiles') + + description = Config().load('manifest.json') + utils = Utils(description) + h = utils.h + + manifest = description.manifest + morphology_path = manifest.get_path('MORPHOLOGY') + utils.generate_morphology(morphology_path.encode('ascii', 'ignore')) + utils.load_cell_parameters() + + stim = h.IClamp(h.soma[0](0.5)) + stim.amp = 0.18 + stim.delay = 1000.0 + stim.dur = 1000.0 + + h.tstop = 3000.0 + + vec = utils.record_values() + + h.finitialize() + h.run() + + output_path = 'output_voltage.dat' + + junction_potential = description.data['fitting'][0]['junction_potential'] + mV = 1.0e-3 + ms = 1.0e-3 + + output_data = (numpy.array(vec['v']) - junction_potential) * mV + output_times = numpy.array(vec['t']) * ms + + DatUtilities.save_voltage(output_path, output_data, output_times) + + assert numpy.count_nonzero(output_data) > 0 diff --git a/test/model/test_glif.py b/test/model/test_glif.py new file mode 100644 index 0000000000..e96dd0d255 --- /dev/null +++ b/test/model/test_glif.py @@ -0,0 +1,144 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from allensdk.api.queries.glif_api import GlifApi +import allensdk.core.json_utilities as json_utilities +from allensdk.model.glif.glif_neuron import GlifNeuron +from allensdk.core.nwb_data_set import NwbDataSet +import os + + +@pytest.fixture +def neuron_config_file(fn_temp_dir): + return os.path.join(fn_temp_dir, "neuron_config.json") + + +@pytest.fixture +def ephys_sweeps_file(fn_temp_dir): + return os.path.join(fn_temp_dir, "ephys_sweeps.json") + + +@pytest.fixture +def glif_api(): + endpoint = None + + if 'TEST_API_ENDPOINT' in os.environ: + endpoint = os.environ['TEST_API_ENDPOINT'] + return GlifApi(endpoint) + else: + return GlifApi() + + +@pytest.fixture +def neuronal_model_id(): + neuronal_model_id = 566302806 + + return neuronal_model_id + + +@pytest.fixture +def configured_glif_api(glif_api, neuronal_model_id, neuron_config_file, + ephys_sweeps_file): + glif_api.get_neuronal_model(neuronal_model_id) + + neuron_config = glif_api.get_neuron_config() + json_utilities.write(neuron_config_file, neuron_config) + + ephys_sweeps = glif_api.get_ephys_sweeps() + json_utilities.write(ephys_sweeps_file, ephys_sweeps) + + return glif_api + + +@pytest.fixture +def output(neuron_config_file, ephys_sweeps_file): + neuron_config = json_utilities.read(neuron_config_file) + ephys_sweeps = json_utilities.read(ephys_sweeps_file) + ephys_file_name = 'stimulus.nwb' + + # pull out the stimulus for the first sweep + ephys_sweep = ephys_sweeps[0] + ds = NwbDataSet(ephys_file_name) + data = ds.get_sweep(ephys_sweep['sweep_number']) + stimulus = data['stimulus'] + + # initialize the neuron + # important! update the neuron's dt for your stimulus + neuron = GlifNeuron.from_dict(neuron_config) + neuron.dt = 1.0 / data['sampling_rate'] + + # simulate the neuron + truncate = 56041 + output = neuron.run(stimulus[0:truncate]) + + return output + + +@pytest.fixture +def stimulus(neuron_config_file, ephys_sweeps_file): + ephys_sweeps = json_utilities.read(ephys_sweeps_file) + ephys_file_name = 'stimulus.nwb' + + # pull out the stimulus for the first sweep + ephys_sweep = ephys_sweeps[0] + ds = NwbDataSet(ephys_file_name) + data = ds.get_sweep(ephys_sweep['sweep_number']) + stimulus = data['stimulus'] + + return stimulus + + +def test_run_glifneuron(configured_glif_api, neuron_config_file): + # initialize the neuron + neuron_config = json_utilities.read(neuron_config_file) + neuron = GlifNeuron.from_dict(neuron_config) + + # make a short square pulse. stimulus units should be in Amps. + stimulus = [0.0] * 100 + [10e-9] * 100 + [0.0] * 100 + + # important! set the neuron's dt value for your stimulus in seconds + neuron.dt = 5e-6 + + # simulate the neuron + output = neuron.run(stimulus) + + expected_fields = {"AScurrents", "grid_spike_times", + "interpolated_spike_threshold", + "interpolated_spike_times", + "interpolated_spike_voltage", + "spike_time_steps", "threshold", "voltage"} + + assert expected_fields.difference(output.keys()) == set() diff --git a/test/model/test_runner.py b/test/model/test_runner.py new file mode 100644 index 0000000000..236f650469 --- /dev/null +++ b/test/model/test_runner.py @@ -0,0 +1,14 @@ +import pytest +import subprocess + +def test_args(): + """ + Test for legacy and newest biophysical model simulation calls + """ + # Legacy all-active simulation call pattern + args_legacy = subprocess.check_output(['python', '-m', 'allensdk.test.model.check_parser', 'manifest.json']) + assert 'stub' not in args_legacy.decode('utf-8') + + # Current all-active simulation call pattern + args_new = subprocess.check_output(['python', '-m', 'allensdk.test.model.check_parser', 'manifest.json', '--axon_type', 'stub']) + assert 'stub' in args_new.decode('utf-8') diff --git a/test/mouse_connectivity/__init__.py b/test/mouse_connectivity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mouse_connectivity/__pycache__/__init__.cpython-37.pyc b/test/mouse_connectivity/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f67dae59181a3987632c9d6bc44c1ad2b90019ca GIT binary patch literal 200 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VFY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_<+i%ax#^Gl0U<ADa`r6!kTmSvVy>c_`t=4F<|$LkeT-r}&y R%}*)KNwotx<ued7007QqIoJRI literal 0 HcmV?d00001 diff --git a/test/mouse_connectivity/grid/__init__.py b/test/mouse_connectivity/grid/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..572b0f95127d1634c3e5ea52bf174fd7d5a98468 GIT binary patch literal 205 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsq+6(Q`_O3M7%8fpYldt6JBe*%44&n#j zFCpX$*~jrru<ZQ?V||VIDdJ|!rU^rfvzSMxhv>%fAD`i{k{7~`B$S|&46a~<+*!z- z)v%Ok2a>KuOF7fEWgvMpnIz+J(L!E9ft;;t-q2O*k$l>?o>1`ti@7(0@gXfbqf@1f VHD0Nt4bSPiak{T@Gyd~ti!TAsJF)-( literal 0 HcmV?d00001 diff --git a/test/mouse_connectivity/grid/__pycache__/test_base_subimage.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_base_subimage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65938ae740d5d4710b9221c68452ac78669506d9 GIT binary patch literal 6027 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 literal 0 HcmV?d00001 diff --git a/test/mouse_connectivity/grid/__pycache__/test_cav_subimage.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_cav_subimage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e513e172f0f82f5d9373ef705d209b811d6e106 GIT binary patch literal 1404 zcmZuxzi%T&6rLIHuGfz3M7kh!S3tcIIFaa3bmT4^5)w)i(TprvlYQg8N%j{ryCz0H z-ND_JApU?9iKzHLD50T1Xj>|`6cjY@X6$tk@T~dv&3kX(ynXK*KOPSI1SS9OOYyT$ z$ZvMjN(Yr=T;@XrAV5>X*H6l++cVz5CriD|=RPHpTm;Yo?`sM^1h2?T%Dd2o@D<@9 z&@&SCR+x#LMzq;E5%aV9{Nqd{vI%E(9#^W!Bg%af7p07CTq`|PPH>rz5P(+Xh6005 z!fw~P2i{iq!M8dD_FU*CUP7S{JGdVt9t^J;jIMpGWcPICVK#MGBOG57lFXd^@<H;` zk5&$kBc_huwq69(Up)MmZVheBM!(s`7z?d^qdWULPcz7rF)B}{l}csPkHvgiX%R~u z`Fx-y)UlkVaxPQeRrwTDW_TYJQ;Hbh;-k0_+Q{vGP!{PTDe|exXGO#smY0n$v=)o+ ziME|{@aOZB_a~nksm(+@6)-**pNo7kd6bK|$U(d}k@?(Au<^NTe^EYNn8_#Vd}353 z-^HUZaZdPdnqmZ89#qm)2U$^LA($YSIK8>576*w|;G9$YU8X))cEICuvHs9fXpxzr zo#h?^VT=yk&!ZvrsNO+aOsxkcz=f1tkNyu-+~9HacEHalbe5Kc-fM<PUb7iHvJnj0 z2nPOg<6FnMh|Y{G$v5;_XUUeG3lD-LvZPMyqSm?bZwX!JvGlPgdC*^am|@4Agt$Ga zjqowT-$ra|fx*@`+`JK>Wwei{Ty$agKDlM)*DCzVk~qK<T2J6SzgrIwr0U+OI_n~@ ze!yvJ+Z^={;>v2;_DI_%sm~a~W4yAfZ*jW<3x^i|LRq1c@V=?DX{oMcYNDRTl!SXl zE=}WqA$4K23kuxC41Xgova+u1d>!A)RA49%kpgjA7|91Bj_a&WMOA3ij2;<em%YPJ zv@UcMxLGzVs~Q&LGK$~3qxw`{;T^9e@OyVPZH;%d)%MS+d0^Rwb^K2~_t9_OLLh8J z_ucAK{IRgz(>?Zp>NhbW>hYjl*j(JpiujWId7YJubt9sd+T;JSdTd!eZpplEQ+KAW ls#;6;nJ)c5s&?1Tl^z~t1=Oj0Xs2bYDWoA5H|XvU{sz(IZo~ip literal 0 HcmV?d00001 diff --git a/test/mouse_connectivity/grid/__pycache__/test_classic_subimage.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_classic_subimage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acc31f0cd0dc85695e772e7b79bec8d8ffb34a91 GIT binary patch literal 5349 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 G-S{t1O0FjW literal 0 HcmV?d00001 diff --git a/test/mouse_connectivity/grid/__pycache__/test_image_series_gridder.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_image_series_gridder.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9be59dece446cede63fb0b35acea5417e0df1ace GIT binary patch literal 5402 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 SPqDMrC#vp(d&I4~$NvL6jU>AO literal 0 HcmV?d00001 diff --git a/test/mouse_connectivity/grid/__pycache__/test_image_utilities.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_image_utilities.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1d2c198c3b06a36d4af588688d01ebc87050c63 GIT binary patch literal 5439 zcmbtYOOM;u6(%nqqNI6S9?#g0<G5~G1@73jQ>PEtj_t-tkYZ|dlAs`_RXMtp%o#~k zE-5=>NCj%UOQR^zMUh1@gQAQ6hyH*rv*xNmH`PBVvg&uvr8pXSvS}sozAt(Co$q}2 zT;7|XuNe6C{_@-4@5_eqFRDy_4hrw$O1?xQ4QX}^U+1Q8a$Wcq=eF-47ag}-@;%cC zjoq@er2W#Aj&xrb&rQEF)mD-ow^e0XR$dtXoUF<@<nwY~E+AjP*u{e-xfnXT%b~Tq z(h_a+P{<{@%=1pk6?qEdYO*FzBR?%y<r(Cwa!sxyKO@h|bI8}^dHEXhb$LO)j{K~= zDBnPSPMTXr{n8k3Wo*{XY%%Hv?XWROqfV4YVUl^RL9dxcaj$OrPST9~VUxzv&&1{8 zx{oW_K$02<rsRKW?21EsWDJc1OA7k8twYm9U0UxL)Q+dxn_~ieO!pZJBy~HplPKNG zoDXRg{xVfQ4V!7K9(3X$z4>-l*$UIGe$b41Z7j%^QPTgLq3AYWJ-h$I?N5?WCELNH zKyK^=PlDe5_T664jC(S;u^sjvC)-$mkKZEhKiW^We;Vy<<00X9aLYYB5_3BpjF5X* z(=bV|cH==3HgJO;RuMgp(*3J#6-n-F%s{o#-_Kmx>b5$vjP)cQ62n?CmxL$O9Lfc7 z)Ikjl+<6oL8iO>ITOf_qo@1C4p{xidMLgu!olUCf$SOgr)#wK*=q5GP69Ux`Y949v z@MBinM$fBOORWPNmJ-BU*iD#5>KwSRW$AFLHMyO7&&<51j2;IwTpFMJf_fy`xU@Ou zC38ZrF}9GjapCvRJ9*(hcj^^YLW?5MvMSk~Eq>#ACZYj|5T-fYi8g*Fdi~6Uv6`JY z3A4)k1ue3Ly9ro8lzmUBSY>7O{Y*ve2o%QMx>Lw8XscxD#w$-)$4ayf#R~psO|^!W zlVR+kCx;QBwE-JBd)rFIu61aQjMP4G0G|tx$kG@AkZz_Wz^8jW^yG8U^Khz%fGwfV z<2k$3!@!m|qbo4w_#b%mSR&EXV5TghdLqP7H6ttc!Y3L`4fzsHUZLa^b(aXr=xL}< zQxnlhts<$L>I{|1)pWw(Ei-t<9UC{~H!vW_?L1HeZm*%`7;Z#{`!tN!J;AN5=_XFb ztSx}cwJBT(F`_56e=yaqiD+^AuM4zXjg} syNg1oja$>KrA^!{eYRa?<||kn8da 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 W#VdQ|i*w$Jw}}6|x9nBD>VE<H6~*cR literal 0 HcmV?d00001 diff --git a/test/mouse_connectivity/grid/test_base_subimage.py b/test/mouse_connectivity/grid/test_base_subimage.py new file mode 100644 index 0000000000..8cff6486a3 --- /dev/null +++ b/test/mouse_connectivity/grid/test_base_subimage.py @@ -0,0 +1,231 @@ +import sys + +import pytest +import mock + +import numpy as np + +sys.modules['jpeg_twok'] = mock.Mock() +from allensdk.mouse_connectivity.grid.subimage.base_subimage import SubImage, \ + SegmentationSubImage, IntensitySubImage, PolygonSubImage + + +#============================================================================== +#============================================================================== + + +@pytest.fixture(scope='function') +def base_params(): + return {'reduce_level': 4, + 'in_dims': np.array([30000, 40000]), + 'in_spacing': np.array([0.35, 0.35]), + 'coarse_spacing': np.array([16.8, 16.8])} + + +@pytest.fixture(scope='function') +def segmentation_params(): + return {'reduce_level': 4, + 'in_dims': np.array([30000, 40000]), + 'in_spacing': np.array([0.35, 0.35]), + 'coarse_spacing': np.array([16.8, 16.8]), + 'segmentation_paths': {'name_one': 'path_one', + 'name_two': 'path_two'}} + + +@pytest.fixture(scope='function') +def intensity_params(): + return {'reduce_level': 4, + 'in_dims': np.array([30000, 40000]), + 'in_spacing': np.array([0.35, 0.35]), + 'coarse_spacing': np.array([16.8, 16.8]), + 'intensity_paths': {'name_one': {'path': 'path_one', 'channel': 2}}} + + +@pytest.fixture(scope='function') +def polygon_params(): + return {'reduce_level': 4, + 'in_dims': np.array([30000, 40000]), + 'in_spacing': np.array([0.35, 0.35]), + 'coarse_spacing': np.array([16.8, 16.8]), + 'polygon_info': {'hello_am_square': [[(8000, 8000), (16000, 8000), + (16000, 16000), (8000, 16000)]]}} + + +#============================================================================== +#============================================================================== + + +def test_init_base(base_params): + + si = SubImage(**base_params) + + assert(np.allclose( si.coarse_dims, [625, 834] )) + + +def test_binarize(base_params): + + si = SubImage(**base_params) + + si.images['fish'] = np.arange(25).reshape([5, 5]) + si.binarize('fish') + + expected = np.ones([5, 5]) + expected[0, 0] = 0 + + assert( np.allclose(si.images['fish'], expected) ) + + +@pytest.mark.parametrize('positive', [(True), (False)]) +def test_apply_mask(base_params, positive): + + si = SubImage(**base_params) + + si.images['submarine'] = np.arange(25).reshape([5, 5]) + si.images['aquaman'] = np.eye(5).astype(np.uint8) + si.images['aquaman'][3, 3] = 0 + + if positive: + exp = [0, 6, 12, 0, 24] + else: + exp = [0, 0, 0, 18, 0] + + si.apply_mask('submarine', 'aquaman', positive) + assert( np.allclose( np.diag(si.images['submarine']), exp ) ) + + +def test_make_pixel_counter(base_params): + + si = SubImage(**base_params) + reducer = si.make_pixel_counter() + + img = np.zeros([10000, 13334]) + img[::3, :] = 1 + + reduced = reducer(img) + + exp = np.ones([625, 834]) * 48 * 2 + exp[:, -1] = 16 * 2 + + assert(np.allclose(exp, reduced)) + + +#============================================================================== +#============================================================================== + + +def test_init_segmentation(segmentation_params): + si = SegmentationSubImage(**segmentation_params) + assert( si.segmentation_paths['name_one'] == 'path_one' ) + + +def test_extract_signal_from_segmentation(segmentation_params): + + si = SegmentationSubImage(**segmentation_params) + + segmentation_name = 'fish' + signal_name = 'fish_signal' + + si.images[segmentation_name] = np.arange(256) + si.extract_signal_from_segmentation(segmentation_name, signal_name) + + exp = np.array([0] * 128 + [1] * 128) + assert(np.allclose( exp, si.images[signal_name] )) + + +def test_extract_injection_from_segmentation(segmentation_params): + + si = SegmentationSubImage(**segmentation_params) + + + segmentation_name = 'fish' + injection_name = 'fish_injection' + + si.images[segmentation_name] = np.arange(256) + si.extract_injection_from_segmentation(segmentation_name, injection_name) + + exp = np.arange(256) + exp[exp % 32 == 0] = 0 + exp[exp > 0] = 1 + + assert(np.allclose( exp, si.images[injection_name] )) + + + +def test_read_segmentation_image(segmentation_params): + + si = SegmentationSubImage(**segmentation_params) + arr = np.zeros((32, 32)) + arr[:16, :] = 1 + + exp = np.array([[1, 1], [0, 0]]) + + with mock.patch('allensdk.mouse_connectivity.grid.utilities.image_utilities.read_segmentation_image', return_value=arr) as p: + si.read_segmentation_image('name_one') + p.assert_called_once_with('path_one') + + assert(np.allclose( exp, si.images['name_one'] )) + +#============================================================================== +#============================================================================== + + +def test_init_intensity(intensity_params): + + si = IntensitySubImage(**intensity_params) + + assert(si.intensity_paths['name_one']['path'] == 'path_one') + assert(si.intensity_paths['name_one']['channel'] == 2) + + +def test_get_intensity(intensity_params): + + arr = np.eye(1000) + arr[999, 0] = 1 + + si = IntensitySubImage(**intensity_params) + + with mock.patch( + 'allensdk.mouse_connectivity.grid.subimage.base_subimage.IntensitySubImage.required_intensities', + new_callable=mock.PropertyMock + ) as a: + a.return_value = ['name_one'] + + with mock.patch('allensdk.mouse_connectivity.grid.utilities.image_utilities.read_intensity_image', return_value=arr) as p: + si.get_intensity() + + p.assert_called_once_with('path_one', 4, 2) + assert(np.allclose( si.images['name_one'], arr )) + + +#============================================================================== +#============================================================================== + + +def test_init_polygon(polygon_params): + + si = PolygonSubImage(**polygon_params) + + assert(np.allclose( si.polygon_info['hello_am_square'], + np.array([[(8000, 8000), (16000, 8000), (16000, 16000), (8000, 16000)]]) )) + + +def test_get_polygons(polygon_params): + + si = PolygonSubImage(**polygon_params) + + arr = np.zeros([1875, 2500]) + arr[500:1000, 500:1000] = 1 + + with mock.patch( + 'allensdk.mouse_connectivity.grid.subimage.base_subimage.PolygonSubImage.required_polys', + new_callable=mock.PropertyMock + ) as a: + a.return_value = ['hello_am_square'] + + si.get_polygons() + assert(np.allclose( si.images['hello_am_square'], arr )) + + +#============================================================================== +#============================================================================== + diff --git a/test/mouse_connectivity/grid/test_cav_subimage.py b/test/mouse_connectivity/grid/test_cav_subimage.py new file mode 100644 index 0000000000..456da1cf21 --- /dev/null +++ b/test/mouse_connectivity/grid/test_cav_subimage.py @@ -0,0 +1,47 @@ +import pytest +import mock + +import numpy as np + +from allensdk.mouse_connectivity.grid.subimage import CavSubImage + + +#============================================================================== +#============================================================================== + + +@pytest.fixture(scope='function') +def cav_params(): + return {'reduce_level': 4, + 'in_dims': np.array([30000, 40000]), + 'in_spacing': np.array([0.35, 0.35]), + 'coarse_spacing': np.array([16.8, 16.8]), + 'polygon_info': {'missing_tile': [[(8000, 8000), (16000, 8000), + (16000, 16000), (8000, 16000)]], + 'cav_tracer': [(4000, 4000), (8000, 4000), + (8000, 8000), (4000, 8000)]}} + + +def test_compute_coarse_planes(cav_params): + + mt = np.ones([1875, 2500]) + mt[:300, :] = 0 + + ct = np.zeros([1875, 2500]) + ct[:, :300] = 1 + + si = CavSubImage(**cav_params) + si.images['cav_tracer'] = ct + si.images['missing_tile'] = mt + + si.compute_coarse_planes() + + cav_tracer_expected = np.zeros([625, 834]) + cav_tracer_expected[:100, :100] = 144 + + sum_pixels_expected = np.zeros([625, 834]) + sum_pixels_expected[:100, :] = 144 + sum_pixels_expected[:100, -1] = 48 + + assert(np.allclose( sum_pixels_expected * 2, si.accumulators['sum_pixels'] )) + assert(np.allclose( cav_tracer_expected * 2, si.accumulators['cav_tracer'] )) diff --git a/test/mouse_connectivity/grid/test_classic_subimage.py b/test/mouse_connectivity/grid/test_classic_subimage.py new file mode 100644 index 0000000000..43fe74b3c4 --- /dev/null +++ b/test/mouse_connectivity/grid/test_classic_subimage.py @@ -0,0 +1,208 @@ +import pytest +import mock + +import numpy as np + +from allensdk.mouse_connectivity.grid.subimage import ClassicSubImage + + +#============================================================================== +#============================================================================== + + +@pytest.fixture(scope='function') +def classic_params(): + return {'reduce_level': 4, + 'in_dims': np.array([30000, 40000]), + 'in_spacing': np.array([0.35, 0.35]), + 'coarse_spacing': np.array([16.8, 16.8]), + 'segmentation_paths': {'segmentation': '/path/to_segmentation'}, + 'intensity_paths': {'green': {'path': '/path/to/intensity', 'channel': 1}}, + 'polygon_info': {'missing_tile': [[(8000, 8000), (16000, 8000), + (16000, 16000), (8000, 16000)]], + 'no_signal': [(4000, 4000), (8000, 4000), + (8000, 8000), (4000, 8000)]}} + + +@pytest.fixture(scope='function') +def missing_tile(): + image = np.zeros([1875, 2500], dtype=np.uint8) + image[500:1000, 500:1000] = 1 + return image + + +@pytest.fixture(scope='function') +def no_signal(): + image = np.zeros([1875, 2500], dtype=np.uint8) + image[250:500, 250:500] = 1 + return image + + +@pytest.fixture(scope='function') +def segmentation_image(): + + image = np.zeros([1875, 2500], dtype=np.uint8) + image[:1000, :] += 1 + image[:, :1000] += 128 + image[:20, :20] = 64 + + return image + + +@pytest.fixture(scope='function') +def projection(): + + image = np.zeros([1875, 2500], dtype=np.uint8) + + image[:, :1000] = 1 + image[:20, :20] = 0 + image[500:1000, 500:1000] = 0 + image[250:500, 250:500] = 0 + + return image + + +@pytest.fixture(scope='function') +def injection(): + + image = np.zeros([1875, 2500], dtype=np.uint8) + + image[:1000, :] = 1 + image[:20, :20] = 0 + image[500:1000, 500:1000] = 0 + + return image + + +#============================================================================== +#============================================================================== + + +def test_init_classic(classic_params): + + si = ClassicSubImage(**classic_params) + + assert( hasattr(si, 'intensity_paths') ) + assert( hasattr(si, 'segmentation_paths') ) + assert( hasattr(si, 'polygon_info') ) + + +def test_process_segmentation(classic_params, segmentation_image, + missing_tile, no_signal, projection, injection): + + si = ClassicSubImage(**classic_params) + si.images['segmentation'] = segmentation_image + si.images['missing_tile'] = missing_tile + si.images['no_signal'] = no_signal + + si.process_segmentation() + + assert(np.allclose( projection, si.images['projection'] )) + assert(np.allclose( injection, si.images['injection'] )) + assert( 'segmentation' not in si.images ) + + +def test_compute_intensity(classic_params): + + pr = np.zeros([1875, 2500]) + pr[:600, :] = 1 + + ij = np.zeros([1875, 2500]) + ij[:, :600] = 1 + + si = ClassicSubImage(**classic_params) + si.images['green'] = np.ones([1875, 2500]) * 2 + si.images['projection'] = pr + si.images['injection'] = ij + + si.compute_intensity() + + spi_expected = np.ones([625, 834]) * 144 * 2 + spi_expected[:, -1] = 48 * 2 + + ispi_expected = np.zeros_like(spi_expected) + ispi_expected[:, :200] = spi_expected[:, :200] + + sppi_expected = np.zeros_like(spi_expected) + sppi_expected[:200, :] = spi_expected[:200, :] + + isppi_expected = np.zeros_like(spi_expected) + isppi_expected[:200, :200] = spi_expected[:200, :200] + + assert(np.allclose( spi_expected * 2, si.accumulators['sum_pixel_intensities'] )) + assert(np.allclose( ispi_expected * 2, si.accumulators['injection_sum_pixel_intensities'] )) + assert(np.allclose( sppi_expected * 2, si.accumulators['sum_projecting_pixel_intensities'] )) + assert(np.allclose( isppi_expected * 2, si.accumulators['injectionsum_projecting_pixel_intensities'] )) + assert( 'intensity' not in si.images ) + + +def test_compute_injection(classic_params): + + pr = np.zeros([1875, 2500]) + pr[:600, :] = 1 + + ij = np.zeros([1875, 2500]) + ij[:, :600] = 1 + + si = ClassicSubImage(**classic_params) + si.images['projection'] = pr + si.images['injection'] = ij + + si.compute_injection() + + isp_expected = np.zeros([625, 834]) + isp_expected[:, :200] = 144 + + ispp_expected = np.zeros([625, 834]) + ispp_expected[:200, :200] = 144 + + assert(np.allclose( isp_expected * 2, si.accumulators['injection_sum_pixels'] )) + assert(np.allclose( ispp_expected * 2, si.accumulators['injection_sum_projecting_pixels'] )) + assert( 'injection' not in si.images ) + + +def test_compute_projection(classic_params): + + pr = np.zeros([1875, 2500]) + pr[:600, :] = 1 + + si = ClassicSubImage(**classic_params) + si.images['projection'] = pr + + si.compute_projection() + + spp_expected = np.zeros([625, 834]) + spp_expected[:200, :] = 144 + spp_expected[:200, -1] = 48 + + assert(np.allclose( spp_expected * 2, si.accumulators['sum_projecting_pixels'] )) + assert( 'projection' not in si.images ) + + +def test_compute_sum_pixels_aav(classic_params): + + mt = np.zeros([1875, 2500]) + mt[:300, :300] = 1 + + aav = np.zeros([1875, 2500]) + aav[300:600, :] = 1 + + si = ClassicSubImage(**classic_params) + si.images['missing_tile'] = mt + si.images['aav_exclusion'] = aav + + si.compute_sum_pixels() + + sp_expected = np.zeros([625, 834]) + 144 + sp_expected[:100, :100] = 0 +# sp_expected[100, :101] = 48 +# sp_expected[:101, 100] = 48 + sp_expected[:, -1] = 48 + + aesp_expected = np.zeros([625, 834]) + aesp_expected[100:200, :] = 144 + aesp_expected[100:200, -1] = 48 + + assert(np.allclose( aesp_expected * 2, si.accumulators['aav_exclusion_sum_pixels'] )) + assert(np.allclose( sp_expected * 2, si.accumulators['sum_pixels'] )) + diff --git a/test/mouse_connectivity/grid/test_image_series_gridder.py b/test/mouse_connectivity/grid/test_image_series_gridder.py new file mode 100644 index 0000000000..351c9aa1b5 --- /dev/null +++ b/test/mouse_connectivity/grid/test_image_series_gridder.py @@ -0,0 +1,191 @@ +import pytest +import mock +from six.moves import range + +import numpy as np +import SimpleITK as sitk + +from allensdk.mouse_connectivity.grid.image_series_gridder import ImageSeriesGridder + + +def small_gridder(): + + in_dims = [12353, 16471, 140] + in_spacing = [0.85, 0.85, 100.0] + out_dims = [1320, 800, 1140] + out_spacing = [10.0, 10.0, 10.0] + reduce_level = 0 + + subimages = [{'index': 12, + 'segmentation_path': '/path/to/projection_12.jp2', + 'intensity_path': '/path/to/image_12.jp2', + 'polygon_info': {'missing_tile': [], + 'no_signal': [], + 'aav_exclusion': []}}] + + subimage_kwargs = {'cls': dict, 'channel': 1} + + nprocesses = 8 + + affine_params = [2, 0 , 0, 0, 2, 0, 0, 0, 2, 1, 1, 1] + dfmfld_path = '/path/to/deformation_field_header.mhd' + + + return ImageSeriesGridder(in_dims, in_spacing, out_dims, out_spacing, + reduce_level, subimages, subimage_kwargs, + nprocesses, affine_params, dfmfld_path) + + +def large_gridder(): + + in_dims = [30000, 40000, 140] + in_spacing = [0.35, 0.35, 100.0] + out_dims = [1320, 800, 1140] + out_spacing = [10.0, 10.0, 10.0] + reduce_level = 1 + + subimages = [{'index': 12, + 'segmentation_path': '/path/to/projection_12.jp2', + 'intensity_path': '/path/to/image_12.jp2', + 'polygon_info': {'missing_tile': [], + 'no_signal': [], + 'aav_exclusion': []}}] + + subimage_kwargs = {'cls': dict, 'channel': 1} + + nprocesses = 8 + + affine_params = [2, 0 , 0, 0, 2, 0, 0, 0, 2, 1, 1, 1] + dfmfld_path = '/path/to/deformation_field_header.mhd' + + + return ImageSeriesGridder(in_dims, in_spacing, out_dims, out_spacing, + reduce_level, subimages, subimage_kwargs, + nprocesses, affine_params, dfmfld_path) + + +@pytest.mark.parametrize('gridder_fn,cgd,cgs,cgr', [(small_gridder, [951, 1267, 140], [11.05, 11.05, 100], 6), + (large_gridder, [1000, 1334, 140], [10.5, 10.5, 100], 7)]) +def test_set_coarse_grid_parameters(gridder_fn, cgd, cgs, cgr): + + gridder = gridder_fn() + gridder.set_coarse_grid_parameters() + + assert(np.allclose( gridder.coarse_dims, cgd )) + assert(np.allclose( gridder.coarse_spacing, cgs )) + assert(np.allclose( gridder.coarse_grid_radius, cgr )) + + +@pytest.mark.parametrize('gridder_fn,reduce_level', [(small_gridder, 0), (large_gridder, 1)]) +def test_setup_subimages(gridder_fn, reduce_level): + + gridder = gridder_fn() + gridder.setup_subimages() + + for s in gridder.subimages: + assert( s['reduce_level'] == reduce_level ) + gridder = gridder_fn() + + +def test_initialize_coarse_volume(): + + key = 'amethystine' + size = [1, 2, 3] + spacing = [4, 5, 6] + + gridder = small_gridder() + gridder.coarse_dims = size + gridder.coarse_spacing = spacing + + gridder.initialize_coarse_volume(key, sitk.sitkFloat32) + + assert(np.allclose( gridder.volumes[key].GetSize(), size )) + assert(np.allclose( gridder.volumes[key].GetSpacing(), spacing )) + + +def test_paste_slice(): + + key = 'halmahera' + slice_array = np.eye(1000) + index = 12 + + volume = sitk.Image(1000, 1000, 140, sitk.sitkFloat32) + volume.SetSpacing([1, 1, 100]) + + gridder = small_gridder() + gridder.coarse_spacing = [1, 1, 100] + gridder.volumes[key] = volume + + gridder.paste_slice(key, index, slice_array) + + obt = sitk.GetArrayFromImage(gridder.volumes[key]) + assert(np.allclose( obt[12, :, :], slice_array )) + + +def test_paste_subimage(): + + index = 1 + output = {'a': 1, 'b': 2} + + gridder = small_gridder() + gridder.paste_slice = mock.MagicMock() + + gridder.paste_subimage(index, output) + + assert( len(gridder.paste_slice.mock_calls) == 2 ) + assert( output['a'] is None and output['b'] is None ) + + +def test_build_coarse_grids(): + # mp is hard to test + + class Dummy(object): + + def __init__(self, *a, **k): + pass + + def imap_unordered(*a, **k): + for ii in range(20): + yield ii, ii + + with mock.patch('multiprocessing.Pool', new=Dummy) as p: + + gridder = small_gridder() + gridder.paste_subimage = mock.MagicMock() + + gridder.build_coarse_grids() + + for ii in range(20): + assert( mock.call(ii, ii) in gridder.paste_subimage.mock_calls ) + + +def test_resample_volume(): + + def make_dfield(*a , **k): + return + + def make_transform(*a, **k): + return sitk.TranslationTransform(3, [2, 2, 2]) + + key = 'green_tree' + + volume = sitk.Image(10, 10, 10, sitk.sitkFloat32) + volume.SetSpacing([1, 1, 1]) + volume += 1 + + with mock.patch('SimpleITK.ReadImage', new=make_dfield) as p: + with mock.patch( + 'allensdk.mouse_connectivity.grid.utilities.image_utilities.build_composite_transform', + new=make_transform + ) as q: + + gridder = small_gridder() + gridder.out_dims = [10, 10, 10] + gridder.out_spacing = [1, 1, 1] + + gridder.volumes[key] = volume + gridder.resample_volume(key) + + arr = sitk.GetArrayFromImage(gridder.volumes[key]) + assert( arr.sum() == 8**3 ) + diff --git a/test/mouse_connectivity/grid/test_image_utilities.py b/test/mouse_connectivity/grid/test_image_utilities.py new file mode 100644 index 0000000000..61d8e75ff5 --- /dev/null +++ b/test/mouse_connectivity/grid/test_image_utilities.py @@ -0,0 +1,176 @@ +import pytest +import mock + +import SimpleITK as sitk +import numpy as np + +from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu + +@pytest.fixture(scope='function') +def dfmfld(): + + disp = sitk.Image(10, 10, 10, sitk.sitkVectorFloat64) + disp.SetSpacing([1, 1, 1]) + + disp += 2 + + return disp + + +@pytest.fixture(scope='function') +def aff_params(): + return [2, 0, 0, 0, 2, 0, 0, 0, 2, 1, 1, 1] + + +def test_set_image_spacing(): + + im = sitk.Image(5, 5, 5, sitk.sitkFloat32) + + iu.set_image_spacing(im, [1, 2, 3]) + + assert( np.allclose(im.GetSpacing(), [1, 2, 3]) ) + assert( np.allclose(im.GetOrigin(), [0.5, 1, 1.5]) ) + + +def test_new_image_3d(): + + im = iu.new_image([300, 200, 100], [1, 2, 3], sitk.sitkFloat32) + + assert( np.allclose(im.GetSize(), [300, 200, 100]) ) + assert( np.allclose(im.GetSpacing(), [1, 2, 3]) ) + assert( np.allclose(im.GetOrigin(), [0.5, 1, 1.5]) ) + + +def test_new_image_2d(): + + im = iu.new_image([300, 200], [1, 2], sitk.sitkFloat32) + + assert( np.allclose(im.GetSize(), [300, 200]) ) + assert( np.allclose(im.GetSpacing(), [1, 2]) ) + assert( np.allclose(im.GetOrigin(), [0.5, 1]) ) + + +@pytest.mark.parametrize("np_type,sitk_type", [(np.float32, sitk.sitkFloat32)]) +def test_np_sitk_convert(np_type, sitk_type): + + arr = np.zeros((100, 100), dtype=np_type) + + sitk_obt = iu.np_sitk_convert(arr.dtype) + np_obt = iu.sitk_np_convert(sitk_obt) + + assert( sitk_obt == sitk_type ) + assert( np_obt == np_type ) + + +def test_compute_coarse_parameters(): + + in_dims = [1000, 2000] + in_spacing = [5, 5] + out_spacing = [100, 100] + reduce_level = 2 + + cgd_exp = [50, 100] + cgs_exp = [100, 100] + cgr_exp = [2, 2] + + cgd_obt, cgs_obt, cgr_obt = iu.compute_coarse_parameters(in_dims, in_spacing, out_spacing, reduce_level) + + assert( np.allclose(cgd_obt, cgd_exp) ) + assert( np.allclose(cgs_obt, cgs_exp) ) + assert( np.allclose(cgr_obt, cgr_exp) ) + + +def test_block_apply(): + + row_blocks = [(ii, jj) for ii, jj in zip(range(0, 10, 2), range(2, 12, 2))] + col_blocks = [(ii, jj) for ii, jj in zip(range(0, 10, 5), range(5, 15, 5))] + blocks = [row_blocks, col_blocks] + + in_image = np.ones((10, 10)) + out_shape = [5, 2] + dtype = np.float32 + + out_image = iu.block_apply(in_image, out_shape, dtype, blocks, np.sum) + + assert( np.allclose(out_image, np.ones([5, 2]) * 10) ) + + +def test_grid_image_blocks(): + + in_shape = [10, 10] + in_spacing = [5, 5] + out_spacing = [20, 20] + + os_exp = [3, 3] + b_exp = [[(0, 4), (4, 8), (8, 10)]] * 2 + + blocks, out_shape = iu.grid_image_blocks(in_shape, in_spacing, out_spacing) + + assert( np.allclose(b_exp, blocks) ) + assert( np.allclose(os_exp, out_shape) ) + + +def test_rasterize_polygons(): + + shape = [10, 10] + scale = [1, 1] + points_list = [ [ (4, 4), (6, 4), (6, 6), (4, 6) ] ] + + exp = np.zeros((10, 10)) + exp[4:6, 4:6] = 1 + + obt = iu.rasterize_polygons(shape, scale, points_list) + assert( np.allclose(obt, exp) ) + + +def test_resample_into_volume(): + + vol = sitk.Image(20, 20, 10, sitk.sitkFloat32) + vol.SetSpacing([10, 10, 10]) + + im = sitk.Image(20, 20, sitk.sitkFloat32) + im.SetSpacing([10, 10]) + im += 5 + + obt = iu.resample_into_volume(im, None, 5, vol) + + arr = sitk.GetArrayFromImage(obt) + + assert( arr[5, :, :].sum() == 2000 ) + assert( arr.sum() == 2000 ) + + +def test_build_affine_transform(aff_params): + + point = (1, 2, 3) + + tf = iu.build_affine_transform(aff_params) + tp = tf.TransformPoint(point) + + assert( np.allclose(tp, [3, 5, 7]) ) + assert( np.allclose(tf.GetParameters(), aff_params) ) + + +def test_build_composite_transform(dfmfld, aff_params): + + point = (5, 5, 5) + exp = (15, 15, 15) + + trans = iu.build_composite_transform(dfmfld, aff_params) + obt = trans.TransformPoint(point) + + assert( np.allclose(exp, obt) ) + + +def test_resample_volume(): + + volume = np.ones((10, 10, 10)).astype(np.float32) + dims = [10, 10, 10] + spacing = [1, 1, 1] + + transform = sitk.TranslationTransform(3, [2, 2, 2]) + + obt = iu.resample_volume(sitk.GetImageFromArray(volume), dims, spacing, transform=transform, interpolator=sitk.sitkNearestNeighbor) # id + obt_arr = sitk.GetArrayFromImage(obt) + + assert( obt_arr.sum() == 8**3 ) diff --git a/test/test_argschema_utilities.py b/test/test_argschema_utilities.py new file mode 100644 index 0000000000..b2455df7cb --- /dev/null +++ b/test/test_argschema_utilities.py @@ -0,0 +1,182 @@ +import os +import stat +import platform +from pathlib import Path + +import pytest +from allensdk.brain_observatory.argschema_utilities import ( + InputFile, + OutputFile, + RaisingSchema, + check_write_access, + check_write_access_overwrite) +from marshmallow import Schema, ValidationError + +READ_ONLY = stat.S_IREAD | stat.S_IRGRP | stat.S_IROTH +READ_WRITE = READ_ONLY | stat.S_IWRITE | stat.S_IWGRP | stat.S_IWOTH + + +def write_some_text(path): + with open(path, "w") as fil: + fil.write("some_text") + + +def try_write_bad_permissions(path): + try: + p = os.path.join(path, "check") + open(p, "w") + pytest.skip() + except PermissionError: + pass + + +class WriteAccessTestHarness(object): + def __init__(self, base_path): + self.base_path = base_path + + def setup(self): + raise NotImplementedError() + + def teardown(self): + pass + + +class ExistingFile(WriteAccessTestHarness): + def setup(self): + self.path = os.path.join(self.base_path, "parent", "foo") + os.makedirs(os.path.dirname(self.path)) + write_some_text(self.path) + return self.path + + +class NonexistentFile(WriteAccessTestHarness): + def setup(self): + self.path = os.path.join(self.base_path, "parent", "nonexistent_file.txt") + return self.path + + +class FileInBadPermissionsDir(WriteAccessTestHarness): + def setup(self): + self.first = os.path.join(self.base_path, "no_write") + + os.makedirs(self.first) + os.chmod(self.first, READ_ONLY) + + try_write_bad_permissions(self.first) + + self.path = os.path.join(self.first, "foo.txt") + return self.path + + def teardown(self): + os.chmod(self.first, READ_WRITE) + + +class FileInBadPermissionsMiddleDir(WriteAccessTestHarness): + def setup(self): + self.first = os.path.join(self.base_path, "first") + self.second = os.path.join(self.first, "second") + + os.makedirs(self.first) + os.chmod(self.first, READ_ONLY) + + try_write_bad_permissions(self.first) + + self.path = os.path.join(self.second, "foo.txt") + return self.path + + def teardown(self): + os.chmod(self.first, READ_WRITE) + + +@pytest.mark.parametrize( + "harness_cls,fn,raises", + [ + [ExistingFile, check_write_access, True], + [ExistingFile, check_write_access_overwrite, False], + [NonexistentFile, check_write_access, False], + [NonexistentFile, check_write_access_overwrite, False], + [FileInBadPermissionsDir, check_write_access, True], + [FileInBadPermissionsDir, check_write_access_overwrite, True], + [FileInBadPermissionsMiddleDir, check_write_access, True], + [FileInBadPermissionsMiddleDir, check_write_access_overwrite, True], + ], +) +def test_check_write_access(tmpdir_factory, harness_cls, fn, raises): + + base_dir = str(tmpdir_factory.mktemp("HW")) + + harness = harness_cls(base_dir) + testpath = harness.setup() + + if raises: + with pytest.raises(ValidationError): + fn(testpath) + else: + assert fn(testpath) + + harness.teardown() + + +class GenericInputSchema(Schema): + input_file = InputFile(required=True) + + +class GenericOutputSchema(RaisingSchema): + output_file = OutputFile(required=True) + + +class TestInputFile(object): + + def setup_method(self): + self.parser = GenericInputSchema() + + @pytest.mark.parametrize("input_data", [ + ({"input_file": "/some/invalid_filepath/input.h5"}), + ]) + def test_invalid_input_file(self, input_data): + with pytest.raises(ValidationError, match=r"No such file or directory"): + self.parser.load(input_data) + + def test_valid_input_file(self, tmpdir): + p = tmpdir.mkdir("input_file").join("valid_input.h5") + p.write("stuff") + + path_str = str(p) + obtained = self.parser.load({"input_file": path_str}) + assert obtained["input_file"] == Path(path_str) + + +class TestOutputFile(object): + + def setup_method(self): + self.parser = GenericOutputSchema() + + @pytest.mark.parametrize("output_data", [ + ({"output_file": "////invalid_filepath/output.json"}), + ]) + def test_invalid_output_file(self, output_data): + # Apparently allensdk.brain_observatory.argschema_utilities tests are + # skipped on Windows systems and the `check_write_access_overwrite` + # function itself does not work correctly on Windows systems. + # TODO: This is a stopgap for now + if os.name == 'nt': + pytest.skip() + # This test was failing on Bamboo because it was run in a container + # as root (which means pretty much anything is writable). If this test + # is run as root, skip it as it will always successfully create the + # output file. + if os.getuid() == 0: + pytest.skip() + if platform.system() == "Darwin": + # this should improve when we update to current argschema + pytest.skip() + + with pytest.raises(ValidationError, match="Can't build path to requested location"): + self.parser.load(output_data) + + def test_valid_output_file(self, tmpdir): + p = tmpdir.mkdir("output_file").join("output_file.json") + + path_str = str(p) + obtained = self.parser.load({"output_file": path_str}) + assert obtained["output_file"] == Path(path_str) diff --git a/test/test_deprecated.py b/test/test_deprecated.py new file mode 100644 index 0000000000..e226ae88f6 --- /dev/null +++ b/test/test_deprecated.py @@ -0,0 +1,85 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import pytest +from allensdk.deprecated import deprecated, class_deprecated +import warnings + + +@pytest.fixture +def deprecated_method(): + + @deprecated() + def i_am_deprecated(): + pass + + return i_am_deprecated + + +@pytest.fixture +def deprecated_class(): + + @class_deprecated('msg') + class dep_cls(object): + def __init__(self, a): + self.a = a + + return dep_cls + + +def test_deprecated(deprecated_method): + expected = "Function i_am_deprecated is deprecated. " + + with warnings.catch_warnings(record=True) as c: + warnings.simplefilter('always') + deprecated_method() + + print(expected) + print(str(c[-1].message)) + + assert expected == str(c[-1].message) + + +def test_deprecated_class(deprecated_class, deprecated_method): + expected = 'Class dep_cls is deprecated. msg' + + with warnings.catch_warnings(record=True) as c: + warnings.simplefilter('always') + deprecated_method() + + obj = deprecated_class(1) + + assert( expected == str(c[-1].message) ) + assert( obj.a == 1 ) diff --git a/test/test_inline_examples.py b/test/test_inline_examples.py new file mode 100644 index 0000000000..d20a2b11bb --- /dev/null +++ b/test/test_inline_examples.py @@ -0,0 +1,23 @@ +import subprocess as sp +import os + +import pytest + + +EXAMPLE_DIR = os.path.join( + os.path.dirname(__file__), + '..', + '..', + 'doc_template', + 'examples_root', + 'examples' +) +EXAMPLES = [filename for filename in os.listdir(EXAMPLE_DIR) if filename.split('.')[-1] == 'py'] + + +@pytest.mark.nightly +@pytest.mark.parametrize('script_name', EXAMPLES) +def test_inline_examples(script_name, tmpdir_factory): + + data_dir = tmpdir_factory.mktemp('inline_examples_data') + sp.check_call(['python', os.path.join(EXAMPLE_DIR, script_name)], cwd=str(data_dir)) \ No newline at end of file diff --git a/test/test_temp_dir.py b/test/test_temp_dir.py new file mode 100644 index 0000000000..16fe1951fc --- /dev/null +++ b/test/test_temp_dir.py @@ -0,0 +1,39 @@ +import pytest +import os +import numpy as np +from mock import patch, MagicMock +from allensdk.test_utilities import temp_dir + + +@pytest.fixture +def mock_request(): + return MagicMock() + + +@pytest.mark.parametrize("ismount,base_path",[ + (True, os.path.normpath(os.path.join('/', 'dev', 'shm'))), + (False, os.path.dirname(temp_dir.__file__)) +]) +@patch("numpy.random.randint", side_effect=([1, 2, 3, 4, 5, 6], + [1, 2, 3, 4, 5, 7])) +@patch("os.listdir", return_value=["allensdk_test_123456"]) +@patch("os.makedirs") +def test_tmp_dir(os_makedirs, os_listdir, randint, + mock_request, ismount, base_path): + with patch("os.path.exists", return_value=True): + with patch("os.path.ismount", return_value=ismount): + path = temp_dir.temp_dir(mock_request) + mock_request.addfinalizer.assert_called_once() + expected_path = os.path.join(base_path, "allensdk_test_123457") + os_makedirs.assert_called_once_with(expected_path) + assert path == expected_path + with patch("shutil.rmtree") as mock_rmtree: + with patch("os.path.exists", return_value=True): + with pytest.warns(UserWarning): + # run the finalizer + mock_request.addfinalizer.call_args[0][0]() + mock_rmtree.assert_called_once_with(expected_path) + mock_rmtree.reset_mock() + with patch("os.path.exists", return_value=False): + mock_request.addfinalizer.call_args[0][0]() + mock_rmtree.assert_called_once_with(expected_path) diff --git a/test_utilities/__init__.py b/test_utilities/__init__.py new file mode 100644 index 0000000000..92ceaf67c3 --- /dev/null +++ b/test_utilities/__init__.py @@ -0,0 +1,35 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# \ No newline at end of file diff --git a/test_utilities/__pycache__/__init__.cpython-37.pyc b/test_utilities/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b36722a9e59e253f9402e4427d46779a26e582b GIT binary patch literal 191 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUm4C;F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>za+J|B)+sHGbghoGqqShK0Y%qvm`!Vub}c4hfQvNN@-52 L9moZrftUdR2g^36 literal 0 HcmV?d00001 diff --git a/test_utilities/__pycache__/custom_comparators.cpython-37.pyc b/test_utilities/__pycache__/custom_comparators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f3fd665dd64c21aa8b1dcbef944a699093086d6 GIT binary patch literal 3755 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 literal 0 HcmV?d00001 diff --git a/test_utilities/__pycache__/regression_fixture.cpython-37.pyc b/test_utilities/__pycache__/regression_fixture.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69a43689692eb4c90784455667575f3c361ac468 GIT binary patch literal 935 zcmZuw&2AGh5VrRxyNOZ+0)&b<aN&>xDH1nSRiw0_N>va|k;*E_a@Njvn~lBLPGPI` zfLaMSA>N>f6R+eeCtjf^#+y{?fmzMi9^2#jzM0)zS!p2<@#{0?9zuWI;!1p&JO|YW zU>IV!K*?gn39i>(;?<*{_%M1!Fb$IsBj$5-)R;8XrW={RijqjQc*tWGoOwyaLe@A( zNt59L>O_AbI_h_@y`{L8GnH~O&I>N+lqZk&w+H)Vuss;;yzY};zqk8turnZg+pqSP zzOCMV?_{UjT{B#pwUMH^AabO+I;KXds&*62wa%p=RM4W*xh9Hd@L26*)KF67+H{Y! z6sb$b2?lL~Iui6tFa{lAhF8%yWV{QXc_z4reqxMFXaeS+dEf7!qAzHSS-`^c*fcJp zIqYwtGXVJp?V$sp4&XNW%7s3O3rSfnvWFI{)Onmh1yBHb8&p34lc70!f9Dj>f$vrH z6-_)9%<&KJLja+$jgGl;Abz8cXT9!|q@B)`0{T9gnc{GuSysy<Dui&C>cz9+TOdad z=^<s^5&cL-HS7tRO2O#UAs5GbC`&GM3Raefl^*WqqoK|Xe_YaZLNg9`3n-6flLfgm zlNY(kxn8@*>N16HSzWf)9lNQVmK!%6E(fxKPC6MkHSa`@NlDEiVR>r0>xE2dp*LW1 zb*mFwUsu|;mrzJ9#?nTG%rYR*hK!G9nQhjEbe&@ZhrkA|o;Gki0~2^$Gtj{*g7;Mn z#@_vJ3T>C9+ef&CZ{Rjot{k0~^`utrZ&B`qa#-w2Imw`z7HzAQgJvTjF;`Nk8*UX7 k;yRg-I!c|xHB+Y%uTLeL6@0_Bfp&3Yy!hH)3xj(904R+A6aWAK literal 0 HcmV?d00001 diff --git a/test_utilities/__pycache__/temp_dir.cpython-37.pyc b/test_utilities/__pycache__/temp_dir.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ada1c73a596da37ae9a7e7e2a504fd780aca617 GIT binary patch literal 1029 zcmY*YTWb?R6rRiOW}Bv05k>nDiwFU23xW?)iq%&Mf=FQrglT5dY_dDMotgBKZXU#f z^<Ql8$#;Lvy!zC?&=)<ku|;P&XU=^4ojK=x$-Z4$sv}tP`)BqWqF?TCy9fkt!1Qx) z9C4hWXujhJS7#EDYNwIM38$AR@;Uy9THZBepmq<t4ORfQ07k*|PjCheaY-sqId-`- zI>S?3Azp!JSiP!Ze;yZjN@Sx#0#gGf<d$JUAfjhG+$*VBFm<yyY?Mpf=K-(H=ok0a z<6*g6cr#qkQBAc!pyT$zygDriUnsl>XhyyPQm$N~8OG=<>SJE#i<jZlFHpH!_zt~7 zFjb>{gSRc^;v}MakXoeNeAiCEYd7I!l_iOgnvc3hXw$uzM$7*rJz(7}52AZu`WZNA z0M8pRWJpWT#cI>|Wxz2EOfU!!Es*x)k-NLeW7WLanKreFlcXumVr}%3R%in~7z1Pj zl^P|4C7HHf&dk6DbCL~DnUb+Q0^CJ*@sk$nV2=GjEo_%`E_!i4?sZ+BT7m9v2Jc>X z98Y)Hfbp$EcFN>=XJ4{jCOLcA5%NTLvK)r*fzR^6x$eA=4?8+G;ziDSBX%Sp_pdzL zl{~J`*u+A^G0nR$(N=zLX+M_xP8Fvp!gbuhllyms-6ZR=MDJ|@tF@-we@Z$1Z74I9 zR&#p8ES74~fwfqt*;pD|gUcmLg$=view>JI*VYn{3}8!BmRqWgvP9;f8<RXsZO!d5 zqy~Msm>C<UY$SlMqXy#~%CjV%2-OOJDvrnSn?$}z^S-tVhfIq~yNLD^4WEQ7t=3(y zPRtfot1e!1Erz$Fxo=EwfJ5XVJb~9BbxiOEUd91g$92;1>qKqB`&KZYy9TjpfQx)N iPV;m1*a41FmHEfbEA6HkA17k(DKK;hF2wMV(E9@xh!=_g literal 0 HcmV?d00001 diff --git a/test_utilities/custom_comparators.py b/test_utilities/custom_comparators.py new file mode 100644 index 0000000000..6db4bf48ac --- /dev/null +++ b/test_utilities/custom_comparators.py @@ -0,0 +1,124 @@ +import re +from typing import Union +import difflib +import pandas as pd +import numpy as np + + +class WhitespaceStrippedString(object): + """Comparator class to compare strings that have been stripped of + whitespace. By default removes any unicode whitespace character that + matches the regex \\s, (which includes [ \\t\\n\\r\\f\\v], + and other unicode whitespace characters). + """ + def __init__(self, string: str, whitespace_chars: str = r"\s", + ASCII: bool = False): + self.orig = string + self.whitespace_chars = whitespace_chars + self.flags = re.ASCII if ASCII else 0 + self.differ = difflib.Differ() + self.value = re.sub(self.whitespace_chars, "", string, self.flags) + + def __eq__(self, other: Union[str, "WhitespaceStrippedString"]): + if isinstance(other, str): + other = WhitespaceStrippedString( + other, self.whitespace_chars, self.flags) + self.diff = list(self.differ.compare(self.value, other.value)) + return self.value == other.value + + +def safe_df_comparison(expected: pd.DataFrame, + obtained: pd.DataFrame, + expect_identical_column_order: bool = False): + """ + Compare two dataframes in a way that is agnostic to column order + and datatype of NULL values + + Parameters + ---------- + expected: pd.DataFrame + + obtained: pd.DataFrame + + expect_identical_column_order: bool + If True, raise an error if columns are not + in the same order (default=False) + + Raises + ------ + RuntimeError + If: + - dataframes do not have the same columns + - dataframes do not have identical indexes + - dataframe columns do not have identical contents + + When comparing the contents of dataframe columns, + the function: + - verifies that NULL values (whether None or NaN) are in + the same location + - loops over non-null values, casts arrays into lists, and + compares with == + """ + msg = '' + columns_match = True + if not expect_identical_column_order: + obtained_column_set = set(obtained.columns) + expected_column_set = set(expected.columns) + if obtained_column_set != expected_column_set: + columns_match = False + else: + if not obtained.columns.equals(expected.columns): + columns_match = False + + if not columns_match: + msg += 'column mis-match\n' + msg += 'obtained columns\n' + msg += f'{obtained.columns}\n' + msg += 'expected columns\n' + msg += f'{expected.columns}\n' + + missing_from_obtained = [] + for c in expected.columns: + if c not in obtained.columns: + missing_from_obtained.append(c) + missing_from_expected = [] + for c in obtained.columns: + if c not in expected.columns: + missing_from_expected.append(c) + msg += f'missing from obtained\n{missing_from_obtained}\n' + msg += f'missing from expected\n{missing_from_expected}\n' + raise RuntimeError(msg) + + if not expected.index.equals(obtained.index): + msg += 'index mis-match\n' + msg += 'expected index\n' + msg += f'{expected.index}\n' + msg += 'obtained index\n' + msg += f'{obtained.index}\n' + raise RuntimeError(msg) + + for col in expected.columns: + expected_null = expected[col].isnull() + obtained_null = obtained[col].isnull() + if not expected_null.equals(obtained_null): + msg += f'\n{col} not null at same point in ' + msg += 'obtained and expected\n' + continue + expected_valid = expected[~expected_null] + obtained_valid = obtained[~obtained_null] + if not expected_valid.index.equals(obtained_valid.index): + msg += '\nindex mismatch in non-null when checking ' + msg += f'{col}\n' + for index_val in expected_valid.index.values: + e = expected_valid.at[index_val, col] + o = obtained_valid.at[index_val, col] + if isinstance(e, np.ndarray): + e = list(e) + if isinstance(o, np.ndarray): + o = list(o) + if not e == o: + msg += f'\n{col}\n' + msg += f'expected: {e}\n' + msg += f'obtained: {o}\n' + if msg != '': + raise RuntimeError(msg) diff --git a/test_utilities/regression_fixture.py b/test_utilities/regression_fixture.py new file mode 100644 index 0000000000..8cd9cdb71a --- /dev/null +++ b/test_utilities/regression_fixture.py @@ -0,0 +1,16 @@ +import os +import sys +import logging +import json +from pkg_resources import resource_filename # @UnresolvedImport + +if 'TEST_SESSION_ANALYSIS_REGRESSION_DATA' in os.environ: + data_file = os.environ['TEST_SESSION_ANALYSIS_REGRESSION_DATA'] +else: + data_file = resource_filename(__name__, '../test/brain_observatory/test_session_analysis_regression_data_list.json') + +def get_list_of_path_dict(): + pyversion = sys.version_info[0] + logging.debug("loading " + data_file) + with open(data_file,'r') as f: + return [curr_fixture for curr_fixture in json.load(f) if curr_fixture['version'] == pyversion] diff --git a/test_utilities/temp_dir.py b/test_utilities/temp_dir.py new file mode 100644 index 0000000000..d738a7ff22 --- /dev/null +++ b/test_utilities/temp_dir.py @@ -0,0 +1,72 @@ +# Allen Institute Software License - This software license is the 2-clause BSD +# license plus a third clause that prohibits redistribution for commercial +# purposes without further permission. +# +# Copyright 2017. Allen Institute. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Redistributions for commercial purposes are not permitted without the +# Allen Institute's written permission. +# For purposes of this license, commercial purposes is the incorporation of the +# Allen Institute's software into anything for which you will charge fees or +# other compensation. Contact terms@alleninstitute.org for commercial licensing +# opportunities. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +import os +import shutil +import warnings + +import numpy as np + + +# Intended as a fixture. Used in conftest.py. +def temp_dir(request): + + tmpfs = os.path.normpath(os.path.join('/', 'dev', 'shm')) + # would like to check mount type, but that requires system calls + if os.path.exists(tmpfs) and os.path.ismount(tmpfs): + + base_path = tmpfs + + else: + + base_path = os.path.dirname(__file__) + + fls = os.listdir(base_path) + while True: + dname = ''.join(map(str, np.random.randint(0, 10, 6))) + if "allensdk_test_{}".format(dname) not in fls: + break + + specific_path = os.path.join(base_path, 'allensdk_test_' + dname) + os.makedirs(specific_path) + + def fin(): + shutil.rmtree(specific_path) + if os.path.exists(specific_path): + warnings.warn('test dir {0} still exists!', UserWarning) + + request.addfinalizer(fin) + + return specific_path From 36a3c6c855ba1df6b6208605d0f383cd2ea2a200 Mon Sep 17 00:00:00 2001 From: Ahad Bawany <ahad.bawany@alleninstitute.org> Date: Wed, 24 Nov 2021 12:56:13 -0800 Subject: [PATCH 02/11] Fixing file path issue --- allensdk/__init__.py | 79 - allensdk/api/__init__.py | 38 - allensdk/api/api.py | 443 - allensdk/api/cloud_cache/README.md | 130 - allensdk/api/cloud_cache/__init__.py | 1 - allensdk/api/cloud_cache/cloud_cache.py | 1301 - allensdk/api/cloud_cache/file_attributes.py | 69 - allensdk/api/cloud_cache/manifest.py | 240 - allensdk/api/cloud_cache/utils.py | 89 - allensdk/api/queries/__init__.py | 35 - .../annotated_section_data_sets_api.py | 234 - allensdk/api/queries/biophysical_api.py | 390 - allensdk/api/queries/brain_observatory_api.py | 780 - allensdk/api/queries/cell_types_api.py | 400 - allensdk/api/queries/connected_services.py | 1119 - allensdk/api/queries/glif_api.py | 250 - allensdk/api/queries/grid_data_api.py | 252 - allensdk/api/queries/image_download_api.py | 500 - allensdk/api/queries/mouse_atlas_api.py | 150 - .../api/queries/mouse_connectivity_api.py | 505 - allensdk/api/queries/ontologies_api.py | 314 - allensdk/api/queries/reference_space_api.py | 293 - allensdk/api/queries/rma_api.py | 600 - allensdk/api/queries/rma_pager.py | 99 - allensdk/api/queries/rma_template.py | 134 - allensdk/api/queries/svg_api.py | 96 - allensdk/api/queries/synchronization_api.py | 239 - allensdk/api/queries/tree_search_api.py | 98 - allensdk/api/warehouse_cache/__init__.py | 1 - allensdk/api/warehouse_cache/cache.py | 674 - .../api/warehouse_cache/caching_utilities.py | 188 - allensdk/brain_observatory/__init__.py | 95 - .../brain_observatory/argschema_utilities.py | 156 - .../brain_observatory/behavior/__init__.py | 11 - .../behavior/behavior_ophys_analysis.py | 115 - .../behavior/behavior_ophys_experiment.py | 755 - .../behavior/behavior_ophys_session.py | 18 - .../behavior_project_cache/__init__.py | 2 - .../behavior_project_cache.py | 617 - .../external/__init__.py | 0 .../behavior_project_metadata_writer.py | 220 - .../project_apis/abcs/__init__.py | 1 - .../abcs/behavior_project_base.py | 67 - .../project_apis/data_io/__init__.py | 2 - .../data_io/behavior_project_cloud_api.py | 402 - .../data_io/behavior_project_lims_api.py | 637 - .../behavior_project_cache/tables/__init__.py | 0 .../tables/experiments_table.py | 70 - .../tables/ophys_mixin.py | 20 - .../tables/ophys_sessions_table.py | 51 - .../tables/project_table.py | 49 - .../tables/sessions_table.py | 119 - .../tables/util/__init__.py | 0 .../tables/util/experiments_table_utils.py | 126 - .../tables/util/prior_exposure_processing.py | 180 - .../behavior/behavior_session.py | 946 - .../brain_observatory/behavior/criteria.py | 216 - .../behavior/data_files/__init__.py | 3 - .../behavior/data_files/_data_file_abc.py | 92 - .../data_files/avg_projection_file.py | 0 .../behavior/data_files/demix_file.py | 66 - .../behavior/data_files/dff_file.py | 65 - .../data_files/event_detection_file.py | 73 - .../behavior/data_files/eye_tracking_file.py | 50 - .../data_files/max_projection_file.py | 0 .../data_files/rigid_motion_transform_file.py | 62 - .../behavior/data_files/stimulus_file.py | 74 - .../behavior/data_files/sync_file.py | 71 - .../behavior/data_objects/__init__.py | 7 - .../behavior/data_objects/base/__init__.py | 0 .../data_objects/base/_data_object_abc.py | 160 - .../data_objects/base/readable_interfaces.py | 105 - .../data_objects/base/writable_interfaces.py | 40 - .../data_objects/cell_specimens/__init__.py | 0 .../cell_specimens/cell_specimens.py | 606 - .../data_objects/cell_specimens/events.py | 137 - .../data_objects/cell_specimens/rois_mixin.py | 89 - .../cell_specimens/traces/__init__.py | 0 .../traces/corrected_fluorescence_traces.py | 83 - .../cell_specimens/traces/dff_traces.py | 88 - .../data_objects/eye_tracking/__init__.py | 0 .../eye_tracking/eye_tracking_table.py | 198 - .../data_objects/eye_tracking/rig_geometry.py | 284 - .../behavior/data_objects/licks.py | 124 - .../data_objects/metadata/__init__.py | 0 .../metadata/behavior_metadata/__init__.py | 0 .../behavior_metadata/behavior_metadata.py | 320 - .../behavior_metadata/behavior_session_id.py | 54 - .../behavior_session_uuid.py | 49 - .../behavior_metadata/date_of_acquisition.py | 116 - .../metadata/behavior_metadata/equipment.py | 73 - .../metadata/behavior_metadata/foraging_id.py | 32 - .../behavior_metadata/session_type.py | 36 - .../behavior_metadata/stimulus_frame_rate.py | 33 - .../metadata/behavior_ophys_metadata.py | 167 - .../ophys_experiment_metadata/__init__.py | 0 .../experiment_container_id.py | 35 - .../field_of_view_shape.py | 48 - .../imaging_depth.py | 35 - .../imaging_plane.py | 107 - .../multi_plane_metadata/__init__.py | 0 .../imaging_plane_group.py | 77 - .../multi_plane_metadata.py | 102 - .../ophys_experiment_metadata.py | 138 - .../ophys_session_id.py | 35 - .../ophys_experiment_metadata/project_code.py | 26 - .../metadata/subject_metadata/__init__.py | 0 .../metadata/subject_metadata/age.py | 77 - .../metadata/subject_metadata/driver_line.py | 47 - .../subject_metadata/full_genotype.py | 57 - .../metadata/subject_metadata/mouse_id.py | 42 - .../subject_metadata/reporter_line.py | 113 - .../metadata/subject_metadata/sex.py | 41 - .../subject_metadata/subject_metadata.py | 162 - .../data_objects/motion_correction.py | 71 - .../behavior/data_objects/projections.py | 128 - .../behavior/data_objects/rewards.py | 92 - .../data_objects/running_speed/__init__.py | 0 .../running_speed/running_acquisition.py | 209 - .../running_speed/running_processing.py | 407 - .../running_speed/running_speed.py | 176 - .../behavior/data_objects/stimuli/__init__.py | 0 .../data_objects/stimuli/presentations.py | 215 - .../behavior/data_objects/stimuli/stimuli.py | 62 - .../stimuli/stimulus_templates.py | 290 - .../data_objects/stimuli/templates.py | 139 - .../behavior/data_objects/stimuli/util.py | 63 - .../behavior/data_objects/task_parameters.py | 234 - .../data_objects/timestamps/__init__.py | 0 .../timestamps/ophys_timestamps.py | 104 - .../stimulus_timestamps/__init__.py | 0 .../stimulus_timestamps.py | 142 - .../timestamps_processing.py | 49 - .../behavior/data_objects/timestamps/util.py | 5 - .../behavior/data_objects/trials/__init__.py | 0 .../behavior/data_objects/trials/trial.py | 423 - .../data_objects/trials/trial_table.py | 150 - allensdk/brain_observatory/behavior/dprime.py | 106 - .../behavior/dprime_readme.md | 39 - .../behavior/event_detection.py | 41 - .../behavior/eye_tracking_processing.py | 243 - .../brain_observatory/behavior/image_api.py | 45 - allensdk/brain_observatory/behavior/mtrain.py | 409 - .../behavior/rewards_processing.py | 43 - .../brain_observatory/behavior/schemas.py | 309 - .../behavior/session_metrics.py | 37 - .../behavior/stimulus_processing.py | 540 - .../behavior/swdb/analysis_tools.py | 92 - .../behavior/swdb/behavior_project_cache.py | 549 - .../behavior/swdb/create_multi_session_df.py | 26 - .../behavior/swdb/run_multi_session_df.py | 27 - ...save_extended_stimulus_presentations_df.py | 35 - .../swdb/run_save_flash_response_df.py | 35 - .../swdb/run_save_trial_response_df.py | 35 - .../behavior/swdb/run_summary_figures.py | 40 - ...save_extended_stimulus_presentations_df.py | 250 - .../behavior/swdb/save_flash_response_df.py | 446 - .../behavior/swdb/save_trial_response_df.py | 338 - .../behavior/swdb/summary_figures.py | 560 - .../behavior/swdb/utilities.py | 365 - .../behavior/sync/__init__.py | 236 - .../behavior/sync/process_sync.py | 127 - .../brain_observatory/behavior/trial_masks.py | 63 - .../behavior/trials_processing.py | 1348 - .../behavior/write_behavior_nwb/__init__.py | 0 .../behavior/write_behavior_nwb/__main__.py | 87 - .../behavior/write_behavior_nwb/_schemas.py | 81 - .../behavior/write_nwb/__init__.py | 0 .../behavior/write_nwb/__main__.py | 93 - .../behavior/write_nwb/_schemas.py | 144 - .../behavior/write_nwb/extensions/__init__.py | 0 .../extensions/event_detection/__init__.py | 0 .../event_detection/extension_builder.py | 54 - ...aibs-ophys-event-detection.extensions.yaml | 16 - ...-aibs-ophys-event-detection.namespace.yaml | 14 - .../event_detection/ndx_ophys_events.py | 15 - .../extensions/stimulus_template/__init__.py | 0 .../stimulus_template/extension_builder.py | 55 - ...ndx-aibs-stimulus-template.extensions.yaml | 16 - .../ndx-aibs-stimulus-template.namespace.yaml | 13 - .../ndx_stimulus_template.py | 15 - .../brain_observatory_exceptions.py | 48 - .../brain_observatory_plotting.py | 1007 - .../chisquare_categorical.py | 178 - allensdk/brain_observatory/circle_plots.py | 753 - .../brain_observatory/comparison_utils.py | 70 - allensdk/brain_observatory/demixer.py | 411 - allensdk/brain_observatory/dff.py | 423 - .../brain_observatory/drifting_gratings.py | 505 - allensdk/brain_observatory/ecephys/README.md | 16 - .../brain_observatory/ecephys/__init__.py | 30 - .../ecephys/align_timestamps/README.md | 27 - .../ecephys/align_timestamps/__init__.py | 0 .../ecephys/align_timestamps/__main__.py | 111 - .../ecephys/align_timestamps/_schemas.py | 92 - .../ecephys/align_timestamps/barcode.py | 303 - .../align_timestamps/barcode_sync_dataset.py | 70 - .../align_timestamps/channel_states.py | 60 - .../align_timestamps/probe_synchronizer.py | 164 - .../ecephys/copy_utility/README.md | 4 - .../ecephys/copy_utility/__init__.py | 0 .../ecephys/copy_utility/__main__.py | 171 - .../ecephys/copy_utility/_schemas.py | 74 - .../ecephys/current_source_density/README.md | 52 - .../current_source_density/__init__.py | 0 .../current_source_density/__main__.py | 188 - .../_current_source_density.py | 182 - .../current_source_density/_filter_utils.py | 74 - .../_interpolation_utils.py | 175 - .../current_source_density/_schemas.py | 103 - .../ecephys/ecephys_project_api/__init__.py | 4 - .../ecephys_project_api.py | 71 - .../ecephys_project_fixed_api.py | 38 - .../ecephys_project_lims_api.py | 629 - .../ecephys_project_warehouse_api.py | 310 - .../ecephys_project_api/http_engine.py | 235 - .../ecephys/ecephys_project_api/rma_engine.py | 136 - .../ecephys/ecephys_project_api/utilities.py | 93 - .../ecephys/ecephys_project_cache.py | 777 - .../ecephys/ecephys_session.py | 1239 - .../ecephys/ecephys_session_api/__init__.py | 3 - .../ecephys_nwb1_session_api.py | 298 - .../ecephys_nwb_session_api.py | 421 - .../ecephys_session_api.py | 72 - .../ecephys/file_io/__init__.py | 0 .../ecephys/file_io/continuous_file.py | 140 - .../ecephys/file_io/ecephys_sync_dataset.py | 114 - .../ecephys/file_io/stim_file.py | 73 - .../ecephys/lfp_subsampling/__init__.py | 35 - .../ecephys/lfp_subsampling/__main__.py | 142 - .../ecephys/lfp_subsampling/_schemas.py | 88 - .../ecephys/lfp_subsampling/subsampling.py | 239 - .../brain_observatory/ecephys/nwb/__init__.py | 20 - .../nwb/ecephys_nwb_extension_builder.py | 155 - .../nwb/ndx-aibs-ecephys.extension.yaml | 126 - .../nwb/ndx-aibs-ecephys.namespace.yaml | 9 - .../ecephys/optotagging_table/README.md | 30 - .../ecephys/optotagging_table/__init__.py | 0 .../ecephys/optotagging_table/__main__.py | 61 - .../ecephys/optotagging_table/_schemas.py | 48 - .../ecephys/stimulus_analysis/__init__.py | 7 - .../ecephys/stimulus_analysis/__main__.py | 215 - .../ecephys/stimulus_analysis/_schemas.py | 83 - .../ecephys/stimulus_analysis/dot_motion.py | 216 - .../stimulus_analysis/drifting_gratings.py | 751 - .../ecephys/stimulus_analysis/flashes.py | 221 - .../stimulus_analysis/natural_movies.py | 92 - .../stimulus_analysis/natural_scenes.py | 192 - .../receptive_field_mapping.py | 585 - .../stimulus_analysis/static_gratings.py | 454 - .../stimulus_analysis/stimulus_analysis.py | 847 - .../ecephys/stimulus_sync.py | 159 - .../ecephys/stimulus_table/README.md | 24 - .../ecephys/stimulus_table/__init__.py | 0 .../ecephys/stimulus_table/__main__.py | 104 - .../ecephys/stimulus_table/_schemas.py | 109 - ...ecephys_visual_coding_time_alignment.ipynb | 598 - .../stimulus_table/ephys_pre_spikes.py | 437 - .../stimulus_table/naming_utilities.py | 188 - .../stimulus_table/output_validation.py | 47 - .../stimulus_parameter_extraction.py | 104 - .../stimulus_table/visualization/__init__.py | 0 .../visualization/view_blocks.py | 121 - .../ecephys/visualization/__init__.py | 111 - .../ecephys/write_nwb/__init__.py | 0 .../ecephys/write_nwb/__main__.py | 1050 - .../ecephys/write_nwb/_schemas.py | 236 - .../extract_running_speed/README.md | 25 - .../extract_running_speed/__init__.py | 0 .../extract_running_speed/__main__.py | 147 - .../extract_running_speed/_schemas.py | 36 - .../extract_running_speed/examples.ipynb | 2050 - .../eye_tracking/__main__.py | 113 - .../eye_tracking/_schemas.py | 21 - .../brain_observatory/eye_tracking/build.py | 150 - .../eye_tracking/stage_1/.gitignore | 1 - .../eye_tracking/stage_1/DLC_Eye_Tracking.py | 75 - .../eye_tracking/stage_1/Dockerfile | 39 - .../stage_2/DLC_Ellipse_Fitting.py | 147 - .../eye_tracking/stage_2/Dockerfile | 40 - .../eye_tracking/stage_3/.gitignore | 1 - .../eye_tracking/stage_3/DLC_Labeled_Video.py | 65 - .../eye_tracking/stage_3/Dockerfile | 39 - .../eye_tracking/stage_4/DLC_Ellipse_Video.py | 108 - .../eye_tracking/stage_4/Dockerfile | 40 - allensdk/brain_observatory/findlevel.py | 51 - .../brain_observatory/gaze_mapping/README.md | 82 - .../gaze_mapping/__init__.py | 0 .../gaze_mapping/__main__.py | 346 - .../gaze_mapping/_filter_utils.py | 132 - .../gaze_mapping/_gaze_mapper.py | 403 - .../gaze_mapping/_schemas.py | 109 - .../brain_observatory/locally_sparse_noise.py | 476 - allensdk/brain_observatory/natural_movie.py | 212 - allensdk/brain_observatory/natural_scenes.py | 408 - allensdk/brain_observatory/nwb/__init__.py | 1117 - .../behavior_ophys_nwb_extension_builder.py | 24 - .../nwb/eye_tracking/__init__.py | 0 .../nwb/eye_tracking/extension_builder.py | 99 - .../ndx-ellipse-eye-tracking.extensions.yaml | 56 - .../ndx-ellipse-eye-tracking.namespace.yaml | 15 - .../eye_tracking/ndx_ellipse_eye_tracking.py | 17 - allensdk/brain_observatory/nwb/metadata.py | 125 - .../ndx-aibs-behavior-ophys.extension.yaml | 183 - .../ndx-aibs-behavior-ophys.namespace.yaml | 9 - allensdk/brain_observatory/nwb/nwb_api.py | 117 - allensdk/brain_observatory/nwb/nwb_utils.py | 85 - allensdk/brain_observatory/nwb/schemas.py | 8 - .../brain_observatory/observatory_plots.py | 511 - allensdk/brain_observatory/ophys/__init__.py | 0 .../ophys/trace_extraction/__init__.py | 8 - .../ophys/trace_extraction/__main__.py | 163 - .../ophys/trace_extraction/_schemas.py | 74 - allensdk/brain_observatory/r_neuropil.py | 370 - .../receptive_field_analysis/__init__.py | 35 - .../receptive_field_analysis/chisquarerf.py | 510 - .../eventdetection.py | 157 - .../fit_parameters.py | 86 - .../receptive_field_analysis/fitgaussian2D.py | 175 - .../postprocessing.py | 137 - .../receptive_field.py | 204 - .../receptive_field_analysis/tools.py | 67 - .../receptive_field_analysis/utilities.py | 293 - .../receptive_field_analysis/visualization.py | 266 - allensdk/brain_observatory/roi_masks.py | 523 - allensdk/brain_observatory/running_speed.py | 22 - .../brain_observatory/session_analysis.py | 599 - .../brain_observatory/session_api_utils.py | 231 - allensdk/brain_observatory/static_gratings.py | 594 - .../brain_observatory/stimulus_analysis.py | 606 - allensdk/brain_observatory/stimulus_info.py | 873 - allensdk/brain_observatory/sync_dataset.py | 853 - .../sync_utilities/__init__.py | 65 - .../visualization/__init__.py | 36 - allensdk/config/__init__.py | 61 - allensdk/config/app/__init__.py | 40 - allensdk/config/app/application_config.py | 367 - allensdk/config/app/logging.conf | 35 - allensdk/config/manifest.py | 416 - allensdk/config/manifest_builder.py | 110 - allensdk/config/model/__init__.py | 35 - allensdk/config/model/description.py | 132 - allensdk/config/model/description_parser.py | 106 - allensdk/config/model/formats/__init__.py | 35 - allensdk/config/model/formats/hdf5_util.py | 67 - .../model/formats/json_description_parser.py | 142 - .../model/formats/pycfg_description_parser.py | 125 - allensdk/core/__init__.py | 35 - allensdk/core/auth_config.py | 31 - allensdk/core/authentication.py | 112 - allensdk/core/brain_observatory_cache.py | 665 - .../core/brain_observatory_nwb_data_set.py | 1128 - allensdk/core/cache_method_utilities.py | 18 - allensdk/core/cell_types_cache.py | 419 - allensdk/core/dat_utilities.py | 58 - allensdk/core/exceptions.py | 26 - allensdk/core/h5_utilities.py | 128 - allensdk/core/json_utilities.py | 262 - allensdk/core/lazy_property/__init__.py | 3 - allensdk/core/lazy_property/lazy_property.py | 33 - .../core/lazy_property/lazy_property_mixin.py | 29 - allensdk/core/mouse_connectivity_cache.py | 794 - allensdk/core/nwb_data_set.py | 391 - allensdk/core/obj_utilities.py | 101 - allensdk/core/ontology.py | 227 - .../ophys_experiment_session_id_mapping.py | 1377 - allensdk/core/reference_space.py | 418 - allensdk/core/reference_space_cache.py | 330 - allensdk/core/simple_tree.py | 398 - allensdk/core/sitk_utilities.py | 175 - allensdk/core/structure_tree.py | 458 - allensdk/core/swc.py | 1031 - allensdk/core/typing.py | 16 - allensdk/deprecated.py | 103 - allensdk/ephys/__init__.py | 35 - allensdk/ephys/ephys_extractor.py | 1108 - allensdk/ephys/ephys_features.py | 1191 - allensdk/ephys/extract_cell_features.py | 230 - allensdk/ephys/feature_extractor.py | 694 - allensdk/internal/README.md | 45 - allensdk/internal/__init__.py | 0 allensdk/internal/api/__init__.py | 126 - allensdk/internal/api/api_prerelease.py | 24 - allensdk/internal/api/lims_api.py | 45 - allensdk/internal/api/mtrain_api.py | 188 - allensdk/internal/api/queries/__init__.py | 0 .../api/queries/biophysical_module_api.py | 111 - .../api/queries/biophysical_module_reader.py | 419 - .../api/queries/grid_data_api_prerelease.py | 115 - .../mouse_connectivity_api_prerelease.py | 186 - .../api/queries/optimize_config_reader.py | 409 - allensdk/internal/api/queries/pre_release.py | 170 - .../cell_specimens_pre_release_query.sql | 48 - .../container_pre_release_query.sql | 67 - .../experiment_pre_release_query.sql | 49 - .../pre_release_sql/processing_query.sql | 52 - .../internal/brain_observatory/__init__.py | 0 .../annotated_region_metrics.py | 131 - .../brain_observatory/demix_report.py | 250 - .../internal/brain_observatory/demixer.py | 359 - .../brain_observatory/eye_calibration.py | 346 - .../internal/brain_observatory/fit_ellipse.py | 238 - .../brain_observatory/frame_stream.py | 334 - .../internal/brain_observatory/itracker.py | 810 - .../brain_observatory/itracker_utils.py | 268 - .../internal/brain_observatory/mask_set.py | 196 - .../ophys_session_decomposition.py | 97 - .../brain_observatory/resources/__init__.py | 0 .../resources/cr_weights.npy | Bin 82000 -> 0 bytes .../resources/pupil_weights.npy | Bin 32848 -> 0 bytes .../roi_filter_training_criteria.json | 38 - .../resources/svm_trained.pkl | Bin 644 -> 0 bytes .../resources/svm_trained.pkl_01.npy | Bin 96 -> 0 bytes .../resources/svm_trained.pkl_02.npy | Bin 16464 -> 0 bytes .../resources/svm_trained.pkl_03.npy | Bin 88 -> 0 bytes .../internal/brain_observatory/roi_filter.py | 327 - .../brain_observatory/roi_filter_utils.py | 302 - .../brain_observatory/run_itracker.py | 189 - .../internal/brain_observatory/time_sync.py | 443 - allensdk/internal/core/__init__.py | 0 .../internal/core/lims_pipeline_module.py | 125 - allensdk/internal/core/lims_utilities.py | 194 - .../mouse_connectivity_cache_prerelease.py | 208 - allensdk/internal/core/simpletree.py | 82 - allensdk/internal/core/swc.py | 103 - allensdk/internal/ephys/__init__.py | 0 .../internal/ephys/core_feature_extract.py | 325 - allensdk/internal/ephys/plot_qc_figures.py | 805 - allensdk/internal/ephys/plot_qc_figures3.py | 839 - allensdk/internal/model/AIC.py | 33 - allensdk/internal/model/GLM.py | 148 - allensdk/internal/model/__init__.py | 0 .../internal/model/biophysical/__init__.py | 0 .../model/biophysical/biophysical_archiver.py | 89 - .../model/biophysical/check_fi_shift.py | 83 - .../internal/model/biophysical/deap_utils.py | 226 - .../internal/model/biophysical/ephys_utils.py | 39 - .../internal/model/biophysical/fit_stage_1.py | 397 - .../internal/model/biophysical/fit_stage_2.py | 115 - .../model/biophysical/fits/__init__.py | 0 .../model/biophysical/fits/config_base.json | 25 - .../biophysical/fits/fit_styles/__init__.py | 0 .../fits/fit_styles/f12_fit_style.json | 43 - .../fits/fit_styles/f12_noapic_fit_style.json | 42 - .../fits/fit_styles/f13_fit_style.json | 48 - .../fits/fit_styles/f13_noapic_fit_style.json | 47 - .../fits/fit_styles/f6_fit_style.json | 139 - .../fits/fit_styles/f6_noapic_fit_style.json | 132 - .../fits/fit_styles/f9_fit_style.json | 144 - .../fits/fit_styles/f9_noapic_fit_style.json | 137 - .../model/biophysical/make_deap_fit_json.py | 208 - .../model/biophysical/neuron_parallel.py | 46 - .../internal/model/biophysical/optimize.py | 251 - .../biophysical/passive_fitting/__init__.py | 0 .../passive_fitting/neuron_passive_fit.py | 130 - .../passive_fitting/neuron_passive_fit2.py | 104 - .../neuron_passive_fit_elec.py | 121 - .../passive_fitting/neuron_utils.py | 57 - .../passive_fitting/output_grabber.py | 70 - .../passive_fitting/passive/__init__.py | 0 .../passive_fitting/passive/circuit.ses | 61 - .../passive_fitting/passive/fixnseg.hoc | 43 - .../passive_fitting/passive/iclamp.ses | 33 - .../passive_fitting/passive/mrf.ses | 36 - .../passive_fitting/passive/mrf.ses.fd1 | 162026 --------------- .../passive_fitting/passive/mrf.ses.ft1 | 14 - .../passive_fitting/passive/mrf2.ses | 36 - .../passive_fitting/passive/mrf2.ses.fd1 | 162026 --------------- .../passive_fitting/passive/mrf2.ses.ft1 | 13 - .../passive_fitting/passive/mrf3.ses | 36 - .../passive_fitting/passive/mrf3.ses.fd1 | 162026 --------------- .../passive_fitting/passive/mrf3.ses.ft1 | 14 - .../passive_fitting/passive/params.hoc | 44 - .../passive_fitting/passive/pyr_params.hoc | 28 - .../passive_fitting/passive/setup.hoc | 3 - .../biophysical/passive_fitting/preprocess.py | 80 - .../model/biophysical/run_optimize.py | 233 - .../model/biophysical/run_optimize.sh | 33 - .../biophysical/run_optimize_workflow.py | 12 - .../model/biophysical/run_passive_fit.py | 144 - .../model/biophysical/run_simulate.sh | 31 - .../model/biophysical/run_simulate_lims.py | 137 - .../biophysical/run_simulate_workflow.py | 12 - allensdk/internal/model/data_access.py | 104 - allensdk/internal/model/glif/ASGLM.py | 249 - allensdk/internal/model/glif/MLIN.py | 143 - allensdk/internal/model/glif/__init__.py | 0 .../glif/are_two_lists_of_arrays_the_same.py | 16 - .../internal/model/glif/configure_model.py | 411 - .../internal/model/glif/error_functions.py | 241 - allensdk/internal/model/glif/find_spikes.py | 122 - allensdk/internal/model/glif/find_sweeps.py | 201 - .../internal/model/glif/glif_experiment.py | 162 - .../internal/model/glif/glif_optimizer.py | 296 - .../model/glif/glif_optimizer_neuron.py | 632 - .../internal/model/glif/optimize_neuron.py | 128 - allensdk/internal/model/glif/plotting.py | 107 - .../internal/model/glif/preprocess_neuron.py | 494 - allensdk/internal/model/glif/rc.py | 50 - allensdk/internal/model/glif/spike_cutting.py | 219 - .../model/glif/threshold_adaptation.py | 649 - allensdk/internal/morphology/__init__.py | 0 allensdk/internal/morphology/compartment.py | 31 - allensdk/internal/morphology/morphology.py | 1001 - allensdk/internal/morphology/morphvis.py | 385 - allensdk/internal/morphology/node.py | 129 - allensdk/internal/morphology/validate_swc.py | 248 - .../internal/mouse_connectivity/__init__.py | 0 .../interval_unionize/__init__.py | 0 .../interval_unionize/cav_unionize.py | 34 - .../interval_unionize/cav_unionizer.py | 56 - .../interval_unionize/data_utilities.py | 104 - .../interval_unionize/interval_unionizer.py | 222 - .../run_tissuecyte_unionize_cav.py | 70 - .../run_tissuecyte_unionize_classic.py | 92 - .../tissuecyte_unionize_record.py | 155 - .../interval_unionize/tissuecyte_unionizer.py | 108 - .../interval_unionize/unionize_record.py | 39 - .../.volume_utilities.py.swp | Bin 12288 -> 0 bytes .../projection_thumbnail/__init__.py | 0 .../generate_projection_strip.py | 109 - .../projection_thumbnail/image_sheet.py | 44 - .../projection_functions.py | 36 - .../visualization_utilities.py | 100 - .../projection_thumbnail/volume_projector.py | 83 - .../projection_thumbnail/volume_utilities.py | 41 - .../tissuecyte_stitching/__init__.py | 0 .../tissuecyte_stitching/stitcher.py | 145 - .../tissuecyte_stitching/tile.py | 92 - .../IVSCC/ephys_nwb/convert_igor_nwb.py | 174 - .../IVSCC/ephys_nwb/extract_nwb_data.py | 524 - .../ephys_nwb/feature_extraction_module.py | 93 - .../IVSCC/ephys_nwb/lab_notebook_reader.py | 181 - .../IVSCC/ephys_nwb/nwb_metadata.yml | 38 - .../IVSCC/ephys_nwb/nwb_publish.py | 667 - .../pipeline_modules/IVSCC/ephys_nwb/qc.py | 254 - .../IVSCC/ephys_nwb/qc_support.py | 189 - .../IVSCC/ephys_nwb/resource_file.py | 187 - .../internal/pipeline_modules/__init__.py | 0 .../morphology/calculate_features.py | 96 - .../cell_types/morphology/cortical_layers.py | 425 - .../morphology/surrogate_strategy.py | 150 - .../morphology/upright_transform.py | 392 - .../internal/pipeline_modules/gbm/__init__.py | 0 .../gbm/generate_gbm_analysis_run_records.py | 39 - .../gbm/generate_gbm_heatmap.py | 143 - .../gbm/generate_gbm_sample_metadata.py | 43 - .../run_annotated_region_metrics.py | 50 - .../internal/pipeline_modules/run_demixing.py | 198 - .../pipeline_modules/run_dff_computation.py | 59 - .../pipeline_modules/run_eye_tracking.py | 73 - .../run_neuropil_correction.py | 250 - .../run_observatory_analysis.py | 124 - .../run_observatory_container_thumbnails.py | 67 - .../run_observatory_thumbnails.py | 547 - .../run_ophys_eye_calibration.py | 178 - .../run_ophys_session_decomposition.py | 115 - .../pipeline_modules/run_ophys_time_sync.py | 268 - .../pipeline_modules/run_roi_filter.py | 291 - ...ssuecyte_projection_thumbnail_from_json.py | 96 - .../run_tissuecyte_stitching_classic.py | 135 - .../run_tissuecyte_unionize_cav_from_json.py | 19 - ...ecyte_unionize_classic_counts_from_json.py | 17 - ...n_tissuecyte_unionize_classic_from_json.py | 19 - allensdk/model/__init__.py | 35 - allensdk/model/biophys_sim/__init__.py | 35 - allensdk/model/biophys_sim/bps_command.py | 97 - allensdk/model/biophys_sim/config.py | 127 - allensdk/model/biophys_sim/logging.conf | 36 - .../model/biophys_sim/manifest_default.json | 88 - allensdk/model/biophys_sim/neuron/__init__.py | 35 - .../model/biophys_sim/neuron/hoc_utils.py | 95 - .../model/biophys_sim/scripts/__init__.py | 35 - allensdk/model/biophys_sim/scripts/bps | 3 - allensdk/model/biophysical/__init__.py | 35 - allensdk/model/biophysical/cell.hoc | 36 - allensdk/model/biophysical/logging.conf | 35 - allensdk/model/biophysical/run_simulate.py | 140 - allensdk/model/biophysical/runner.py | 240 - allensdk/model/biophysical/utils.py | 451 - allensdk/model/glif/__init__.py | 39 - allensdk/model/glif/glif_neuron.py | 500 - allensdk/model/glif/glif_neuron_methods.py | 513 - allensdk/model/glif/simulate_neuron.py | 187 - allensdk/morphology/__init__.py | 35 - allensdk/morphology/validate_swc.py | 102 - allensdk/mouse_connectivity/__init__.py | 0 allensdk/mouse_connectivity/grid/__init__.py | 19 - allensdk/mouse_connectivity/grid/__main__.py | 136 - allensdk/mouse_connectivity/grid/_schemas.py | 105 - .../grid/image_series_gridder.py | 157 - .../grid/subimage/__init__.py | 27 - .../grid/subimage/base_subimage.py | 270 - .../grid/subimage/cav_subimage.py | 37 - .../grid/subimage/classic_subimage.py | 119 - .../grid/subimage/count_subimage.py | 84 - .../grid/utilities/__init__.py | 0 .../grid/utilities/downsampling_utilities.py | 81 - .../grid/utilities/image_utilities.py | 291 - .../grid/writers/__init__.py | 118 - allensdk/test/api/__init__.py | 14 - allensdk/test/api/cloud_cache/__init__.py | 1 - allensdk/test/api/cloud_cache/conftest.py | 185 - allensdk/test/api/cloud_cache/test_cache.py | 812 - .../test/api/cloud_cache/test_change_log.py | 181 - .../api/cloud_cache/test_file_attributes.py | 73 - .../test/api/cloud_cache/test_full_process.py | 261 - .../test/api/cloud_cache/test_local_cache.py | 50 - .../test/api/cloud_cache/test_manifest.py | 173 - .../api/cloud_cache/test_smart_download.py | 523 - .../cloud_cache/test_static_local_cache.py | 203 - allensdk/test/api/cloud_cache/test_utils.py | 53 - .../cloud_cache/test_windows_isilon_paths.py | 70 - allensdk/test/api/cloud_cache/utils.py | 148 - .../472451419_response.json | 227 - .../test_annotated_section_data_set_api.py | 97 - allensdk/test/api/test_api.py | 175 - allensdk/test/api/test_biophysical_api.py | 79 - .../test/api/test_brain_observatory_api.py | 547 - allensdk/test/api/test_cache.py | 233 - allensdk/test/api/test_cacheable.py | 317 - allensdk/test/api/test_caching_utilities.py | 263 - allensdk/test/api/test_cell_types_api.py | 151 - allensdk/test/api/test_file_download.py | 228 - allensdk/test/api/test_glif_api.py | 131 - allensdk/test/api/test_grid_data_api.py | 163 - allensdk/test/api/test_image_download_api.py | 611 - allensdk/test/api/test_mouse_atlas_api.py | 103 - .../test/api/test_mouse_connectivity_api.py | 461 - allensdk/test/api/test_ontologies_api.py | 217 - allensdk/test/api/test_pager.py | 272 - allensdk/test/api/test_reference_space_api.py | 256 - allensdk/test/api/test_rma_template.py | 265 - allensdk/test/api/test_svg_api.py | 109 - allensdk/test/api/test_synchronization_api.py | 130 - allensdk/test/api/test_tree_search_api.py | 97 - .../behavior_project_cache/__init__.py | 1 - .../behavior_project_cache/conftest.py | 234 - .../test_behavior_project_cloud_api.py | 237 - .../test_behavior_project_lims_api.py | 108 - .../test_experiments_table_utils.py | 160 - .../behavior_project_cache/test_from_s3.py | 363 - .../behavior/behavior_project_cache/utils.py | 154 - .../conftest.py | 699 - .../test_behavior_project_cache.py | 173 - .../brain_observatory/behavior/conftest.py | 94 - .../behavior/data_files/test_stimulus_file.py | 82 - .../behavior/data_files/test_sync_file.py | 112 - .../data_objects/base/test_data_object.py | 81 - .../behavior/data_objects/conftest.py | 24 - .../eye_tracking/test_eye_tracking_table.py | 85 - .../eye_tracking/test_rig_geometry.py | 127 - .../behavior/data_objects/lims_util.py | 16 - .../test_behavior_metadata.py | 307 - .../metadata/test_behavior_ophys_metadata.py | 198 - .../behavior/data_objects/nwb_input_json.py | 23 - .../running_speed/test_running_acquisition.py | 312 - .../running_speed/test_running_processing.py | 290 - .../running_speed/test_running_speed.py | 349 - .../test_stimulus_timestamps.py | 312 - .../test_timestamps_processing.py | 80 - .../data_objects/test_cell_specimens.py | 273 - .../data_objects/test_data/avg_projection.png | Bin 39966 -> 0 bytes .../test_data/behavior_stimulus_file.pkl | Bin 653 -> 0 bytes .../data_objects/test_data/demix_file.h5 | Bin 2144 -> 0 bytes .../behavior/data_objects/test_data/events.h5 | Bin 4368 -> 0 bytes .../test_data/eye_tracking_rig_geometry.json | 1 - .../test_data/eye_tracking_table.pkl | Bin 19916 -> 0 bytes .../behavior/data_objects/test_data/licks.pkl | Bin 885 -> 0 bytes .../data_objects/test_data/max_projection.png | Bin 74085 -> 0 bytes .../data_objects/test_data/presentations.pkl | Bin 37441 -> 0 bytes .../raw_eye_tracking_rig_geometry.pkl | Bin 2145 -> 0 bytes .../data_objects/test_data/rewards.pkl | Bin 2304 -> 0 bytes .../test_data/rigid_motion_transform_file.csv | 4 - .../data_objects/test_data/stimulus_file.pkl | Bin 598 -> 0 bytes .../behavior/data_objects/test_data/sync.h5 | Bin 3448 -> 0 bytes .../test_data/task_parameters.json | 13 - .../data_objects/test_data/templates.pkl | Bin 20736642 -> 0 bytes .../data_objects/test_data/test_input.json | 144 - .../data_objects/test_data/trials.pkl | Bin 78578 -> 0 bytes .../behavior/data_objects/test_licks.py | 182 - .../data_objects/test_motion_correction.py | 116 - .../data_objects/test_ophys_timestamps.py | 91 - .../behavior/data_objects/test_projections.py | 107 - .../behavior/data_objects/test_rewards.py | 110 - .../behavior/data_objects/test_stimuli.py | 125 - .../data_objects/test_task_parameters.py | 67 - .../behavior/data_objects/test_trial_table.py | 181 - .../resources/example_stimulus.pkl.gz | Bin 2970855 -> 0 bytes .../rig_geometry_multiple_rig_configs.pkl | Bin 2237 -> 0 bytes .../expected/im065_unwarped.pkl | Bin 18432165 -> 0 bytes .../expected/im065_warped.pkl | Bin 2304165 -> 0 bytes .../input/test_image_set.pkl | Bin 1077913 -> 0 bytes .../behavior/test_behavior_metadata_legacy.py | 338 - .../test_behavior_ophys_experiment.py | 387 - .../behavior/test_behavior_session.py | 34 - .../behavior/test_criteria.py | 382 - .../brain_observatory/behavior/test_dprime.py | 175 - .../behavior/test_event_detection.py | 21 - .../behavior/test_eye_tracking_processing.py | 228 - .../behavior/test_mtrain_annotate.py | 18 - .../test_prior_exposure_count_processing.py | 65 - .../behavior/test_rewards_processing.py | 38 - .../behavior/test_session_metrics.py | 71 - .../behavior/test_stimulus_processing.py | 459 - .../behavior/test_sync_processing.py | 76 - .../behavior/test_trial_masks.py | 107 - .../behavior/test_trials_processing.py | 742 - .../behavior/test_write_behavior_nwb.py | 76 - .../behavior/test_write_nwb_behavior_ophys.py | 82 - allensdk/test/brain_observatory/conftest.py | 41 - .../brain_observatory/ecephys/__init__.py | 0 .../ecephys/align_timestamps/__init__.py | 0 .../test_align_timestamps_module.py | 186 - .../ecephys/align_timestamps/test_barcode.py | 97 - .../test_barcode_sync_dataset.py | 60 - .../align_timestamps/test_channel_states.py | 28 - .../test_probe_synchronizer.py | 78 - .../brain_observatory/ecephys/conftest.py | 11 - .../test_ecephys_nwb1_session_api.py | 61 - .../ecephys/stimulus_analysis/__init__.py | 0 .../ecephys/stimulus_analysis/conftest.py | 66 - .../stimulus_analysis/test_dot_motion.py | 95 - .../test_drifting_gratings.py | 230 - .../ecephys/stimulus_analysis/test_flashes.py | 81 - .../stimulus_analysis/test_natural_movies.py | 57 - .../stimulus_analysis/test_natural_scenes.py | 91 - .../test_receptive_field_mapping.py | 187 - .../stimulus_analysis/test_static_gratings.py | 134 - .../test_stimulus_analysis.py | 380 - .../ecephys/stimulus_table/__init__.py | 0 .../stimulus_table/test_ephys_pre_spikes.py | 270 - .../stimulus_table/test_naming_utilities.py | 191 - .../test_stimulus_parameter_extraction.py | 62 - .../test_stimulus_table_module.py | 316 - .../ecephys/test_copy_utility.py | 201 - .../ecephys/test_current_source_density.py | 267 - .../ecephys/test_ecephys_project_cache.py | 512 - .../ecephys/test_ecephys_project_fixed_api.py | 16 - .../ecephys/test_ecephys_project_lims_api.py | 227 - .../test_ecephys_project_warehouse_api.py | 73 - .../ecephys/test_ecephys_session.py | 555 - .../ecephys/test_ecephys_session_nwb_api.py | 30 - .../ecephys/test_ecephys_sync_dataset.py | 70 - .../ecephys/test_http_engine.py | 115 - .../ecephys/test_lfp_subsampling.py | 108 - .../ecephys/test_rma_engine.py | 32 - .../ecephys/test_stim_file.py | 67 - .../ecephys/test_stimulus_sync.py | 178 - .../ecephys/test_visualization.py | 14 - .../ecephys/test_write_nwb.py | 1082 - .../extract_running_speed/__init__.py | 0 .../test_extract_running_speed_module.py | 88 - .../gaze_mapping/__init__.py | 0 .../gaze_mapping/test_gaze_mapping.py | 344 - .../gaze_mapping/test_main.py | 188 - .../test/brain_observatory/nwb/__init__.py | 0 .../test/brain_observatory/nwb/conftest.py | 12 - .../test/brain_observatory/nwb/test_nwb.py | 57 - .../brain_observatory/nwb/test_nwb_api.py | 11 - .../brain_observatory/nwb/test_nwb_utils.py | 30 - .../test_chisquarerf.py | 309 - .../test_fitgaussian2D.py | 189 - .../sync_utilities/__init__.py | 0 .../sync_utilities/test_sync_utilities.py | 116 - .../brain_observatory/test_circle_plots.py | 130 - .../test/brain_observatory/test_demixer.py | 125 - allensdk/test/brain_observatory/test_dff.py | 160 - .../test_drifting_gratings.py | 164 - .../test_locally_sparse_noise.py | 175 - .../brain_observatory/test_natural_movie.py | 144 - .../brain_observatory/test_natural_scenes.py | 163 - .../test/brain_observatory/test_notebook.py | 281 - .../test_observatory_plots.py | 268 - .../test_observatory_plots_data.json | 24 - .../test/brain_observatory/test_roi_masks.py | 215 - .../test_session_analysis.py | 141 - .../test_session_analysis_regression.py | 279 - ...test_session_analysis_regression_data.json | 18 - ...session_analysis_regression_data_list.json | 44 - .../test_session_api_utils.py | 313 - .../brain_observatory/test_static_gratings.py | 198 - .../test_stimulus_analysis.py | 140 - .../brain_observatory/test_stimulus_info.py | 399 - .../config/test_config_single_file_json.py | 73 - allensdk/test/config/test_json_comments.py | 209 - allensdk/test/config/test_manifest.py | 96 - .../test/config/test_multi_file_config.py | 134 - allensdk/test/config/test_pyconfig_parser.py | 136 - allensdk/test/core/nwb_ephys_files.txt | 1 - allensdk/test/core/nwb_files.txt | 4 - allensdk/test/core/test_authentication.py | 75 - .../test/core/test_brain_observatory_cache.py | 379 - .../test_brain_observatory_nwb_data_set.py | 360 - allensdk/test/core/test_cell_filters.py | 360 - .../test/core/test_cell_types_cache_unit.py | 622 - allensdk/test/core/test_h5_utilities.py | 87 - allensdk/test/core/test_json_utilities.py | 124 - allensdk/test/core/test_lazy_property.py | 42 - .../core/test_mouse_connectivity_cache.py | 525 - .../core/test_mouse_connectivity_notebook.py | 307 - allensdk/test/core/test_nwb_data_set.py | 233 - allensdk/test/core/test_obj_utilities.py | 94 - allensdk/test/core/test_reference_space.py | 232 - .../test/core/test_reference_space_cache.py | 222 - .../core/test_reference_space_notebook.py | 264 - allensdk/test/core/test_simple_tree.py | 194 - allensdk/test/core/test_sitk_utilities.py | 182 - allensdk/test/core/test_structure_tree.py | 250 - .../ephys/data/spike_test_high_init_dvdt.txt | 28000 --- allensdk/test/ephys/data/spike_test_pair.txt | 4000 - .../test/ephys/data/spike_test_var_dt.txt | 911 - allensdk/test/ephys/test_extractor.py | 175 - allensdk/test/ephys/test_features.py | 268 - allensdk/test/glif_tests.py | 114 - .../test/internal/api/test_api_prerelease.py | 25 - .../api/test_grid_data_api_prerelease.py | 95 - .../test_mouse_connectivity_api_prerelease.py | 138 - .../test/internal/api/test_pre_release.py | 168 - .../test/internal/biophysical/conftest.py | 6 - .../internal/biophysical/test_ephys_utils.py | 28 - .../internal/biophysical/test_optimize_run.py | 6869 - .../internal/biophysical/test_simulate_run.py | 753 - .../test_roi_filter_utils.py | 43 - .../test_run_ophys_time_sync.py | 158 - .../brain_observatory/test_time_sync.py | 693 - .../time_sync_test_data.json | 20 - allensdk/test/internal/conftest.py | 9 - ...est_mouse_connectivity_cache_prerelease.py | 204 - allensdk/test/internal/gbm/test.genes.results | 4 - .../test/internal/gbm/test.isoforms.results | 4 - .../test/internal/gbm/test2.genes.results | 4 - .../test/internal/gbm/test2.isoforms.results | 4 - .../internal/gbm/test_generate_gbm_heatmap.py | 112 - .../internal/morphology/test_apply_affine.py | 32 - .../test_interval_unionizer.py | 120 - .../test_projection_functions.py | 36 - .../test_visualization_utilities.py | 61 - .../test_volume_projector.py | 79 - .../test_volume_utilities.py | 92 - .../test_tissuecyte_unionize_record.py | 170 - .../test_unionize_record.py | 15 - .../internal/test_annotated_region_metrics.py | 67 - .../test/internal/test_biophysical_modules.py | 45 - .../internal/test_core_feature_extract.py | 106 - .../test/internal/test_eye_calibration.py | 80 - allensdk/test/internal/test_internal.py | 26 - allensdk/test/internal/test_mtrain_api.py | 117 - .../internal/test_optimize_config_reader.py | 146 - .../test/internal/test_optimize_manifest.py | 203 - allensdk/test/internal/test_roi_filter.py | 166 - .../test/internal/test_simulate_manifest.py | 266 - .../internal/test_simulate_update_output.py | 162 - .../tissuecyte_stitching/test_stitcher.py | 150 - .../tissuecyte_stitching/test_tile.py | 106 - .../test/model/aa_model/468193142_fit.json | 297 - ...3-Cre_Ai14-177297.06.01.01_491120155_m.swc | 2595 - allensdk/test/model/aa_model/manifest.json | 131 - .../model/aa_model/modfiles/CaDynamics.mod | 40 - .../test/model/aa_model/modfiles/Ca_HVA.mod | 82 - .../test/model/aa_model/modfiles/Ca_LVA.mod | 69 - allensdk/test/model/aa_model/modfiles/Ih.mod | 71 - allensdk/test/model/aa_model/modfiles/Im.mod | 62 - .../test/model/aa_model/modfiles/Im_v2.mod | 59 - allensdk/test/model/aa_model/modfiles/K_P.mod | 71 - allensdk/test/model/aa_model/modfiles/K_T.mod | 68 - allensdk/test/model/aa_model/modfiles/Kd.mod | 62 - .../test/model/aa_model/modfiles/Kv2like.mod | 89 - .../test/model/aa_model/modfiles/Kv3_1.mod | 54 - .../test/model/aa_model/modfiles/NaTa.mod | 95 - .../test/model/aa_model/modfiles/NaTs.mod | 95 - allensdk/test/model/aa_model/modfiles/NaV.mod | 186 - allensdk/test/model/aa_model/modfiles/Nap.mod | 77 - allensdk/test/model/aa_model/modfiles/SK.mod | 56 - .../aa_model/test_biophysical_all_active.py | 85 - allensdk/test/model/check_parser.py | 8 - .../test/model/peri_model/468193142_fit.json | 145 - ...3-Cre_Ai14-177297.06.01.01_491120155_m.swc | 2595 - allensdk/test/model/peri_model/manifest.json | 131 - .../model/peri_model/modfiles/CaDynamics.mod | 40 - .../test/model/peri_model/modfiles/Ca_HVA.mod | 82 - .../test/model/peri_model/modfiles/Ca_LVA.mod | 69 - .../test/model/peri_model/modfiles/Ih.mod | 71 - .../test/model/peri_model/modfiles/Im.mod | 62 - .../test/model/peri_model/modfiles/Im_v2.mod | 59 - .../test/model/peri_model/modfiles/K_P.mod | 71 - .../test/model/peri_model/modfiles/K_T.mod | 68 - .../test/model/peri_model/modfiles/Kd.mod | 62 - .../model/peri_model/modfiles/Kv2like.mod | 89 - .../test/model/peri_model/modfiles/Kv3_1.mod | 54 - .../test/model/peri_model/modfiles/NaTa.mod | 95 - .../test/model/peri_model/modfiles/NaTs.mod | 95 - .../test/model/peri_model/modfiles/NaV.mod | 186 - .../test/model/peri_model/modfiles/Nap.mod | 77 - .../test/model/peri_model/modfiles/SK.mod | 56 - .../model/peri_model/test_biophysical_peri.py | 85 - .../model/test_biophysical_perisomatic.py | 90 - allensdk/test/model/test_glif.py | 144 - allensdk/test/model/test_runner.py | 14 - allensdk/test/mouse_connectivity/__init__.py | 0 .../test/mouse_connectivity/grid/__init__.py | 0 .../grid/test_base_subimage.py | 231 - .../grid/test_cav_subimage.py | 47 - .../grid/test_classic_subimage.py | 208 - .../grid/test_image_series_gridder.py | 191 - .../grid/test_image_utilities.py | 176 - allensdk/test/test_argschema_utilities.py | 182 - allensdk/test/test_deprecated.py | 85 - allensdk/test/test_inline_examples.py | 23 - allensdk/test/test_temp_dir.py | 39 - allensdk/test_utilities/__init__.py | 35 - allensdk/test_utilities/custom_comparators.py | 124 - allensdk/test_utilities/regression_fixture.py | 16 - allensdk/test_utilities/temp_dir.py | 72 - .../ophys_experiment.cpython-37.pyc | Bin 24818 -> 24846 bytes .../__pycache__/ophys_session.cpython-37.pyc | Bin 31717 -> 31952 bytes .../imaging_plane_group.cpython-37.pyc | Bin 3088 -> 3088 bytes .../running_acquisition.cpython-37.pyc | Bin 5922 -> 6388 bytes .../running_processing.cpython-37.pyc | Bin 13457 -> 13457 bytes .../running_speed/running_acquisition.py | 25 +- .../running_speed/running_processing.py | 6 +- .../stimulus_timestamps.cpython-37.pyc | Bin 4788 -> 5089 bytes .../timestamps_processing.cpython-37.pyc | Bin 1965 -> 2672 bytes .../stimulus_timestamps.py | 15 +- .../timestamps_processing.py | 21 + .../behavior/ophys_experiment.py | 44 +- brain_observatory/behavior/ophys_session.py | 77 +- 927 files changed, 128 insertions(+), 681026 deletions(-) delete mode 100644 allensdk/__init__.py delete mode 100644 allensdk/api/__init__.py delete mode 100644 allensdk/api/api.py delete mode 100644 allensdk/api/cloud_cache/README.md delete mode 100644 allensdk/api/cloud_cache/__init__.py delete mode 100644 allensdk/api/cloud_cache/cloud_cache.py delete mode 100644 allensdk/api/cloud_cache/file_attributes.py delete mode 100644 allensdk/api/cloud_cache/manifest.py delete mode 100644 allensdk/api/cloud_cache/utils.py delete mode 100644 allensdk/api/queries/__init__.py delete mode 100644 allensdk/api/queries/annotated_section_data_sets_api.py delete mode 100644 allensdk/api/queries/biophysical_api.py delete mode 100644 allensdk/api/queries/brain_observatory_api.py delete mode 100644 allensdk/api/queries/cell_types_api.py delete mode 100644 allensdk/api/queries/connected_services.py delete mode 100644 allensdk/api/queries/glif_api.py delete mode 100644 allensdk/api/queries/grid_data_api.py delete mode 100644 allensdk/api/queries/image_download_api.py delete mode 100644 allensdk/api/queries/mouse_atlas_api.py delete mode 100644 allensdk/api/queries/mouse_connectivity_api.py delete mode 100644 allensdk/api/queries/ontologies_api.py delete mode 100644 allensdk/api/queries/reference_space_api.py delete mode 100644 allensdk/api/queries/rma_api.py delete mode 100644 allensdk/api/queries/rma_pager.py delete mode 100644 allensdk/api/queries/rma_template.py delete mode 100644 allensdk/api/queries/svg_api.py delete mode 100644 allensdk/api/queries/synchronization_api.py delete mode 100644 allensdk/api/queries/tree_search_api.py delete mode 100644 allensdk/api/warehouse_cache/__init__.py delete mode 100755 allensdk/api/warehouse_cache/cache.py delete mode 100644 allensdk/api/warehouse_cache/caching_utilities.py delete mode 100644 allensdk/brain_observatory/__init__.py delete mode 100644 allensdk/brain_observatory/argschema_utilities.py delete mode 100644 allensdk/brain_observatory/behavior/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_ophys_analysis.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_ophys_experiment.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_ophys_session.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/external/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/project_table.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py delete mode 100644 allensdk/brain_observatory/behavior/behavior_session.py delete mode 100644 allensdk/brain_observatory/behavior/criteria.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/_data_file_abc.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/avg_projection_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/demix_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/dff_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/event_detection_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/max_projection_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/rigid_motion_transform_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/stimulus_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_files/sync_file.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/base/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/base/_data_object_abc.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/base/readable_interfaces.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/base/writable_interfaces.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/cell_specimens/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/cell_specimens/events.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/eye_tracking/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/licks.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/motion_correction.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/projections.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/rewards.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/running_speed/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/running_speed/running_speed.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/stimuli/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/stimuli/stimuli.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/stimuli/templates.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/stimuli/util.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/task_parameters.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/timestamps/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/timestamps/util.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/trials/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/trials/trial.py delete mode 100644 allensdk/brain_observatory/behavior/data_objects/trials/trial_table.py delete mode 100644 allensdk/brain_observatory/behavior/dprime.py delete mode 100644 allensdk/brain_observatory/behavior/dprime_readme.md delete mode 100644 allensdk/brain_observatory/behavior/event_detection.py delete mode 100644 allensdk/brain_observatory/behavior/eye_tracking_processing.py delete mode 100644 allensdk/brain_observatory/behavior/image_api.py delete mode 100644 allensdk/brain_observatory/behavior/mtrain.py delete mode 100644 allensdk/brain_observatory/behavior/rewards_processing.py delete mode 100644 allensdk/brain_observatory/behavior/schemas.py delete mode 100644 allensdk/brain_observatory/behavior/session_metrics.py delete mode 100644 allensdk/brain_observatory/behavior/stimulus_processing.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/analysis_tools.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/behavior_project_cache.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/run_multi_session_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/run_save_flash_response_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/run_save_trial_response_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/run_summary_figures.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/summary_figures.py delete mode 100644 allensdk/brain_observatory/behavior/swdb/utilities.py delete mode 100644 allensdk/brain_observatory/behavior/sync/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/sync/process_sync.py delete mode 100644 allensdk/brain_observatory/behavior/trial_masks.py delete mode 100644 allensdk/brain_observatory/behavior/trials_processing.py delete mode 100644 allensdk/brain_observatory/behavior/write_behavior_nwb/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/write_behavior_nwb/__main__.py delete mode 100644 allensdk/brain_observatory/behavior/write_behavior_nwb/_schemas.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/__main__.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/_schemas.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml delete mode 100644 allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py delete mode 100644 allensdk/brain_observatory/brain_observatory_exceptions.py delete mode 100644 allensdk/brain_observatory/brain_observatory_plotting.py delete mode 100644 allensdk/brain_observatory/chisquare_categorical.py delete mode 100644 allensdk/brain_observatory/circle_plots.py delete mode 100644 allensdk/brain_observatory/comparison_utils.py delete mode 100644 allensdk/brain_observatory/demixer.py delete mode 100644 allensdk/brain_observatory/dff.py delete mode 100644 allensdk/brain_observatory/drifting_gratings.py delete mode 100644 allensdk/brain_observatory/ecephys/README.md delete mode 100644 allensdk/brain_observatory/ecephys/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/README.md delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/_schemas.py delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/barcode.py delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/channel_states.py delete mode 100644 allensdk/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py delete mode 100644 allensdk/brain_observatory/ecephys/copy_utility/README.md delete mode 100644 allensdk/brain_observatory/ecephys/copy_utility/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/copy_utility/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/copy_utility/_schemas.py delete mode 100644 allensdk/brain_observatory/ecephys/current_source_density/README.md delete mode 100644 allensdk/brain_observatory/ecephys/current_source_density/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/current_source_density/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/current_source_density/_current_source_density.py delete mode 100644 allensdk/brain_observatory/ecephys/current_source_density/_filter_utils.py delete mode 100644 allensdk/brain_observatory/ecephys/current_source_density/_interpolation_utils.py delete mode 100644 allensdk/brain_observatory/ecephys/current_source_density/_schemas.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/http_engine.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/rma_engine.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_api/utilities.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_project_cache.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_session.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_session_api/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py delete mode 100644 allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py delete mode 100644 allensdk/brain_observatory/ecephys/file_io/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/file_io/continuous_file.py delete mode 100644 allensdk/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py delete mode 100644 allensdk/brain_observatory/ecephys/file_io/stim_file.py delete mode 100644 allensdk/brain_observatory/ecephys/lfp_subsampling/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/lfp_subsampling/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/lfp_subsampling/_schemas.py delete mode 100644 allensdk/brain_observatory/ecephys/lfp_subsampling/subsampling.py delete mode 100644 allensdk/brain_observatory/ecephys/nwb/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py delete mode 100644 allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml delete mode 100644 allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml delete mode 100644 allensdk/brain_observatory/ecephys/optotagging_table/README.md delete mode 100644 allensdk/brain_observatory/ecephys/optotagging_table/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/optotagging_table/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/optotagging_table/_schemas.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/_schemas.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/dot_motion.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/flashes.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/natural_movies.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/static_gratings.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_sync.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/README.md delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/_schemas.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/ecephys_visual_coding_time_alignment.ipynb delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/naming_utilities.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/output_validation.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/visualization/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py delete mode 100644 allensdk/brain_observatory/ecephys/visualization/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/write_nwb/__init__.py delete mode 100644 allensdk/brain_observatory/ecephys/write_nwb/__main__.py delete mode 100644 allensdk/brain_observatory/ecephys/write_nwb/_schemas.py delete mode 100644 allensdk/brain_observatory/extract_running_speed/README.md delete mode 100644 allensdk/brain_observatory/extract_running_speed/__init__.py delete mode 100644 allensdk/brain_observatory/extract_running_speed/__main__.py delete mode 100644 allensdk/brain_observatory/extract_running_speed/_schemas.py delete mode 100644 allensdk/brain_observatory/extract_running_speed/examples.ipynb delete mode 100644 allensdk/brain_observatory/eye_tracking/__main__.py delete mode 100644 allensdk/brain_observatory/eye_tracking/_schemas.py delete mode 100644 allensdk/brain_observatory/eye_tracking/build.py delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_1/.gitignore delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_1/Dockerfile delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_2/Dockerfile delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_3/.gitignore delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_3/Dockerfile delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py delete mode 100644 allensdk/brain_observatory/eye_tracking/stage_4/Dockerfile delete mode 100644 allensdk/brain_observatory/findlevel.py delete mode 100644 allensdk/brain_observatory/gaze_mapping/README.md delete mode 100644 allensdk/brain_observatory/gaze_mapping/__init__.py delete mode 100644 allensdk/brain_observatory/gaze_mapping/__main__.py delete mode 100644 allensdk/brain_observatory/gaze_mapping/_filter_utils.py delete mode 100644 allensdk/brain_observatory/gaze_mapping/_gaze_mapper.py delete mode 100644 allensdk/brain_observatory/gaze_mapping/_schemas.py delete mode 100644 allensdk/brain_observatory/locally_sparse_noise.py delete mode 100644 allensdk/brain_observatory/natural_movie.py delete mode 100644 allensdk/brain_observatory/natural_scenes.py delete mode 100644 allensdk/brain_observatory/nwb/__init__.py delete mode 100644 allensdk/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py delete mode 100644 allensdk/brain_observatory/nwb/eye_tracking/__init__.py delete mode 100644 allensdk/brain_observatory/nwb/eye_tracking/extension_builder.py delete mode 100644 allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml delete mode 100644 allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml delete mode 100644 allensdk/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py delete mode 100644 allensdk/brain_observatory/nwb/metadata.py delete mode 100644 allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml delete mode 100644 allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml delete mode 100644 allensdk/brain_observatory/nwb/nwb_api.py delete mode 100644 allensdk/brain_observatory/nwb/nwb_utils.py delete mode 100644 allensdk/brain_observatory/nwb/schemas.py delete mode 100644 allensdk/brain_observatory/observatory_plots.py delete mode 100644 allensdk/brain_observatory/ophys/__init__.py delete mode 100644 allensdk/brain_observatory/ophys/trace_extraction/__init__.py delete mode 100644 allensdk/brain_observatory/ophys/trace_extraction/__main__.py delete mode 100644 allensdk/brain_observatory/ophys/trace_extraction/_schemas.py delete mode 100644 allensdk/brain_observatory/r_neuropil.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/__init__.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/chisquarerf.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/eventdetection.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/fit_parameters.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/fitgaussian2D.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/postprocessing.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/receptive_field.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/tools.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/utilities.py delete mode 100644 allensdk/brain_observatory/receptive_field_analysis/visualization.py delete mode 100644 allensdk/brain_observatory/roi_masks.py delete mode 100644 allensdk/brain_observatory/running_speed.py delete mode 100644 allensdk/brain_observatory/session_analysis.py delete mode 100644 allensdk/brain_observatory/session_api_utils.py delete mode 100644 allensdk/brain_observatory/static_gratings.py delete mode 100644 allensdk/brain_observatory/stimulus_analysis.py delete mode 100755 allensdk/brain_observatory/stimulus_info.py delete mode 100644 allensdk/brain_observatory/sync_dataset.py delete mode 100644 allensdk/brain_observatory/sync_utilities/__init__.py delete mode 100644 allensdk/brain_observatory/visualization/__init__.py delete mode 100644 allensdk/config/__init__.py delete mode 100644 allensdk/config/app/__init__.py delete mode 100644 allensdk/config/app/application_config.py delete mode 100644 allensdk/config/app/logging.conf delete mode 100644 allensdk/config/manifest.py delete mode 100644 allensdk/config/manifest_builder.py delete mode 100644 allensdk/config/model/__init__.py delete mode 100644 allensdk/config/model/description.py delete mode 100644 allensdk/config/model/description_parser.py delete mode 100644 allensdk/config/model/formats/__init__.py delete mode 100644 allensdk/config/model/formats/hdf5_util.py delete mode 100644 allensdk/config/model/formats/json_description_parser.py delete mode 100644 allensdk/config/model/formats/pycfg_description_parser.py delete mode 100644 allensdk/core/__init__.py delete mode 100644 allensdk/core/auth_config.py delete mode 100644 allensdk/core/authentication.py delete mode 100644 allensdk/core/brain_observatory_cache.py delete mode 100755 allensdk/core/brain_observatory_nwb_data_set.py delete mode 100644 allensdk/core/cache_method_utilities.py delete mode 100644 allensdk/core/cell_types_cache.py delete mode 100644 allensdk/core/dat_utilities.py delete mode 100644 allensdk/core/exceptions.py delete mode 100644 allensdk/core/h5_utilities.py delete mode 100644 allensdk/core/json_utilities.py delete mode 100644 allensdk/core/lazy_property/__init__.py delete mode 100644 allensdk/core/lazy_property/lazy_property.py delete mode 100644 allensdk/core/lazy_property/lazy_property_mixin.py delete mode 100644 allensdk/core/mouse_connectivity_cache.py delete mode 100644 allensdk/core/nwb_data_set.py delete mode 100644 allensdk/core/obj_utilities.py delete mode 100644 allensdk/core/ontology.py delete mode 100644 allensdk/core/ophys_experiment_session_id_mapping.py delete mode 100644 allensdk/core/reference_space.py delete mode 100644 allensdk/core/reference_space_cache.py delete mode 100644 allensdk/core/simple_tree.py delete mode 100644 allensdk/core/sitk_utilities.py delete mode 100644 allensdk/core/structure_tree.py delete mode 100644 allensdk/core/swc.py delete mode 100644 allensdk/core/typing.py delete mode 100644 allensdk/deprecated.py delete mode 100644 allensdk/ephys/__init__.py delete mode 100644 allensdk/ephys/ephys_extractor.py delete mode 100644 allensdk/ephys/ephys_features.py delete mode 100755 allensdk/ephys/extract_cell_features.py delete mode 100644 allensdk/ephys/feature_extractor.py delete mode 100644 allensdk/internal/README.md delete mode 100644 allensdk/internal/__init__.py delete mode 100644 allensdk/internal/api/__init__.py delete mode 100644 allensdk/internal/api/api_prerelease.py delete mode 100644 allensdk/internal/api/lims_api.py delete mode 100644 allensdk/internal/api/mtrain_api.py delete mode 100644 allensdk/internal/api/queries/__init__.py delete mode 100644 allensdk/internal/api/queries/biophysical_module_api.py delete mode 100644 allensdk/internal/api/queries/biophysical_module_reader.py delete mode 100644 allensdk/internal/api/queries/grid_data_api_prerelease.py delete mode 100644 allensdk/internal/api/queries/mouse_connectivity_api_prerelease.py delete mode 100644 allensdk/internal/api/queries/optimize_config_reader.py delete mode 100644 allensdk/internal/api/queries/pre_release.py delete mode 100644 allensdk/internal/api/queries/pre_release_sql/cell_specimens_pre_release_query.sql delete mode 100644 allensdk/internal/api/queries/pre_release_sql/container_pre_release_query.sql delete mode 100644 allensdk/internal/api/queries/pre_release_sql/experiment_pre_release_query.sql delete mode 100644 allensdk/internal/api/queries/pre_release_sql/processing_query.sql delete mode 100644 allensdk/internal/brain_observatory/__init__.py delete mode 100644 allensdk/internal/brain_observatory/annotated_region_metrics.py delete mode 100644 allensdk/internal/brain_observatory/demix_report.py delete mode 100644 allensdk/internal/brain_observatory/demixer.py delete mode 100755 allensdk/internal/brain_observatory/eye_calibration.py delete mode 100644 allensdk/internal/brain_observatory/fit_ellipse.py delete mode 100644 allensdk/internal/brain_observatory/frame_stream.py delete mode 100644 allensdk/internal/brain_observatory/itracker.py delete mode 100644 allensdk/internal/brain_observatory/itracker_utils.py delete mode 100644 allensdk/internal/brain_observatory/mask_set.py delete mode 100644 allensdk/internal/brain_observatory/ophys_session_decomposition.py delete mode 100644 allensdk/internal/brain_observatory/resources/__init__.py delete mode 100644 allensdk/internal/brain_observatory/resources/cr_weights.npy delete mode 100644 allensdk/internal/brain_observatory/resources/pupil_weights.npy delete mode 100644 allensdk/internal/brain_observatory/resources/roi_filter_training_criteria.json delete mode 100644 allensdk/internal/brain_observatory/resources/svm_trained.pkl delete mode 100644 allensdk/internal/brain_observatory/resources/svm_trained.pkl_01.npy delete mode 100644 allensdk/internal/brain_observatory/resources/svm_trained.pkl_02.npy delete mode 100644 allensdk/internal/brain_observatory/resources/svm_trained.pkl_03.npy delete mode 100644 allensdk/internal/brain_observatory/roi_filter.py delete mode 100644 allensdk/internal/brain_observatory/roi_filter_utils.py delete mode 100644 allensdk/internal/brain_observatory/run_itracker.py delete mode 100644 allensdk/internal/brain_observatory/time_sync.py delete mode 100644 allensdk/internal/core/__init__.py delete mode 100644 allensdk/internal/core/lims_pipeline_module.py delete mode 100644 allensdk/internal/core/lims_utilities.py delete mode 100644 allensdk/internal/core/mouse_connectivity_cache_prerelease.py delete mode 100644 allensdk/internal/core/simpletree.py delete mode 100644 allensdk/internal/core/swc.py delete mode 100644 allensdk/internal/ephys/__init__.py delete mode 100644 allensdk/internal/ephys/core_feature_extract.py delete mode 100644 allensdk/internal/ephys/plot_qc_figures.py delete mode 100644 allensdk/internal/ephys/plot_qc_figures3.py delete mode 100644 allensdk/internal/model/AIC.py delete mode 100644 allensdk/internal/model/GLM.py delete mode 100644 allensdk/internal/model/__init__.py delete mode 100644 allensdk/internal/model/biophysical/__init__.py delete mode 100644 allensdk/internal/model/biophysical/biophysical_archiver.py delete mode 100755 allensdk/internal/model/biophysical/check_fi_shift.py delete mode 100644 allensdk/internal/model/biophysical/deap_utils.py delete mode 100644 allensdk/internal/model/biophysical/ephys_utils.py delete mode 100644 allensdk/internal/model/biophysical/fit_stage_1.py delete mode 100755 allensdk/internal/model/biophysical/fit_stage_2.py delete mode 100644 allensdk/internal/model/biophysical/fits/__init__.py delete mode 100644 allensdk/internal/model/biophysical/fits/config_base.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/__init__.py delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f12_fit_style.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f13_fit_style.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f6_fit_style.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f9_fit_style.json delete mode 100644 allensdk/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json delete mode 100755 allensdk/internal/model/biophysical/make_deap_fit_json.py delete mode 100644 allensdk/internal/model/biophysical/neuron_parallel.py delete mode 100755 allensdk/internal/model/biophysical/optimize.py delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/__init__.py delete mode 100755 allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit.py delete mode 100755 allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py delete mode 100755 allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/neuron_utils.py delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/output_grabber.py delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/__init__.py delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/circuit.ses delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/fixnseg.hoc delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/iclamp.ses delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.fd1 delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.ft1 delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.fd1 delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.ft1 delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.fd1 delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.ft1 delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/params.hoc delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/pyr_params.hoc delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/passive/setup.hoc delete mode 100644 allensdk/internal/model/biophysical/passive_fitting/preprocess.py delete mode 100755 allensdk/internal/model/biophysical/run_optimize.py delete mode 100755 allensdk/internal/model/biophysical/run_optimize.sh delete mode 100644 allensdk/internal/model/biophysical/run_optimize_workflow.py delete mode 100644 allensdk/internal/model/biophysical/run_passive_fit.py delete mode 100755 allensdk/internal/model/biophysical/run_simulate.sh delete mode 100644 allensdk/internal/model/biophysical/run_simulate_lims.py delete mode 100644 allensdk/internal/model/biophysical/run_simulate_workflow.py delete mode 100644 allensdk/internal/model/data_access.py delete mode 100644 allensdk/internal/model/glif/ASGLM.py delete mode 100644 allensdk/internal/model/glif/MLIN.py delete mode 100644 allensdk/internal/model/glif/__init__.py delete mode 100644 allensdk/internal/model/glif/are_two_lists_of_arrays_the_same.py delete mode 100644 allensdk/internal/model/glif/configure_model.py delete mode 100644 allensdk/internal/model/glif/error_functions.py delete mode 100644 allensdk/internal/model/glif/find_spikes.py delete mode 100644 allensdk/internal/model/glif/find_sweeps.py delete mode 100644 allensdk/internal/model/glif/glif_experiment.py delete mode 100644 allensdk/internal/model/glif/glif_optimizer.py delete mode 100644 allensdk/internal/model/glif/glif_optimizer_neuron.py delete mode 100644 allensdk/internal/model/glif/optimize_neuron.py delete mode 100644 allensdk/internal/model/glif/plotting.py delete mode 100644 allensdk/internal/model/glif/preprocess_neuron.py delete mode 100644 allensdk/internal/model/glif/rc.py delete mode 100644 allensdk/internal/model/glif/spike_cutting.py delete mode 100644 allensdk/internal/model/glif/threshold_adaptation.py delete mode 100644 allensdk/internal/morphology/__init__.py delete mode 100644 allensdk/internal/morphology/compartment.py delete mode 100644 allensdk/internal/morphology/morphology.py delete mode 100644 allensdk/internal/morphology/morphvis.py delete mode 100644 allensdk/internal/morphology/node.py delete mode 100755 allensdk/internal/morphology/validate_swc.py delete mode 100644 allensdk/internal/mouse_connectivity/__init__.py delete mode 100644 allensdk/internal/mouse_connectivity/interval_unionize/__init__.py delete mode 100644 allensdk/internal/mouse_connectivity/interval_unionize/cav_unionize.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/cav_unionizer.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/data_utilities.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/interval_unionizer.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py delete mode 100755 allensdk/internal/mouse_connectivity/interval_unionize/unionize_record.py delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/.volume_utilities.py.swp delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/__init__.py delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/image_sheet.py delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/projection_functions.py delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/volume_projector.py delete mode 100644 allensdk/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py delete mode 100644 allensdk/internal/mouse_connectivity/tissuecyte_stitching/__init__.py delete mode 100644 allensdk/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py delete mode 100644 allensdk/internal/mouse_connectivity/tissuecyte_stitching/tile.py delete mode 100755 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py delete mode 100644 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py delete mode 100755 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py delete mode 100644 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py delete mode 100644 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_metadata.yml delete mode 100755 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py delete mode 100755 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py delete mode 100644 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py delete mode 100644 allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py delete mode 100644 allensdk/internal/pipeline_modules/__init__.py delete mode 100644 allensdk/internal/pipeline_modules/cell_types/morphology/calculate_features.py delete mode 100755 allensdk/internal/pipeline_modules/cell_types/morphology/cortical_layers.py delete mode 100755 allensdk/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py delete mode 100644 allensdk/internal/pipeline_modules/cell_types/morphology/upright_transform.py delete mode 100644 allensdk/internal/pipeline_modules/gbm/__init__.py delete mode 100644 allensdk/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py delete mode 100644 allensdk/internal/pipeline_modules/gbm/generate_gbm_heatmap.py delete mode 100644 allensdk/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py delete mode 100644 allensdk/internal/pipeline_modules/run_annotated_region_metrics.py delete mode 100644 allensdk/internal/pipeline_modules/run_demixing.py delete mode 100644 allensdk/internal/pipeline_modules/run_dff_computation.py delete mode 100755 allensdk/internal/pipeline_modules/run_eye_tracking.py delete mode 100755 allensdk/internal/pipeline_modules/run_neuropil_correction.py delete mode 100644 allensdk/internal/pipeline_modules/run_observatory_analysis.py delete mode 100644 allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py delete mode 100644 allensdk/internal/pipeline_modules/run_observatory_thumbnails.py delete mode 100644 allensdk/internal/pipeline_modules/run_ophys_eye_calibration.py delete mode 100644 allensdk/internal/pipeline_modules/run_ophys_session_decomposition.py delete mode 100644 allensdk/internal/pipeline_modules/run_ophys_time_sync.py delete mode 100644 allensdk/internal/pipeline_modules/run_roi_filter.py delete mode 100644 allensdk/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py delete mode 100644 allensdk/internal/pipeline_modules/run_tissuecyte_stitching_classic.py delete mode 100644 allensdk/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py delete mode 100644 allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py delete mode 100644 allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py delete mode 100644 allensdk/model/__init__.py delete mode 100644 allensdk/model/biophys_sim/__init__.py delete mode 100644 allensdk/model/biophys_sim/bps_command.py delete mode 100644 allensdk/model/biophys_sim/config.py delete mode 100644 allensdk/model/biophys_sim/logging.conf delete mode 100644 allensdk/model/biophys_sim/manifest_default.json delete mode 100644 allensdk/model/biophys_sim/neuron/__init__.py delete mode 100644 allensdk/model/biophys_sim/neuron/hoc_utils.py delete mode 100644 allensdk/model/biophys_sim/scripts/__init__.py delete mode 100644 allensdk/model/biophys_sim/scripts/bps delete mode 100644 allensdk/model/biophysical/__init__.py delete mode 100644 allensdk/model/biophysical/cell.hoc delete mode 100644 allensdk/model/biophysical/logging.conf delete mode 100644 allensdk/model/biophysical/run_simulate.py delete mode 100644 allensdk/model/biophysical/runner.py delete mode 100644 allensdk/model/biophysical/utils.py delete mode 100644 allensdk/model/glif/__init__.py delete mode 100755 allensdk/model/glif/glif_neuron.py delete mode 100644 allensdk/model/glif/glif_neuron_methods.py delete mode 100644 allensdk/model/glif/simulate_neuron.py delete mode 100644 allensdk/morphology/__init__.py delete mode 100644 allensdk/morphology/validate_swc.py delete mode 100755 allensdk/mouse_connectivity/__init__.py delete mode 100755 allensdk/mouse_connectivity/grid/__init__.py delete mode 100755 allensdk/mouse_connectivity/grid/__main__.py delete mode 100755 allensdk/mouse_connectivity/grid/_schemas.py delete mode 100755 allensdk/mouse_connectivity/grid/image_series_gridder.py delete mode 100755 allensdk/mouse_connectivity/grid/subimage/__init__.py delete mode 100755 allensdk/mouse_connectivity/grid/subimage/base_subimage.py delete mode 100755 allensdk/mouse_connectivity/grid/subimage/cav_subimage.py delete mode 100755 allensdk/mouse_connectivity/grid/subimage/classic_subimage.py delete mode 100755 allensdk/mouse_connectivity/grid/subimage/count_subimage.py delete mode 100755 allensdk/mouse_connectivity/grid/utilities/__init__.py delete mode 100755 allensdk/mouse_connectivity/grid/utilities/downsampling_utilities.py delete mode 100755 allensdk/mouse_connectivity/grid/utilities/image_utilities.py delete mode 100755 allensdk/mouse_connectivity/grid/writers/__init__.py delete mode 100644 allensdk/test/api/__init__.py delete mode 100644 allensdk/test/api/cloud_cache/__init__.py delete mode 100644 allensdk/test/api/cloud_cache/conftest.py delete mode 100644 allensdk/test/api/cloud_cache/test_cache.py delete mode 100644 allensdk/test/api/cloud_cache/test_change_log.py delete mode 100644 allensdk/test/api/cloud_cache/test_file_attributes.py delete mode 100644 allensdk/test/api/cloud_cache/test_full_process.py delete mode 100644 allensdk/test/api/cloud_cache/test_local_cache.py delete mode 100644 allensdk/test/api/cloud_cache/test_manifest.py delete mode 100644 allensdk/test/api/cloud_cache/test_smart_download.py delete mode 100644 allensdk/test/api/cloud_cache/test_static_local_cache.py delete mode 100644 allensdk/test/api/cloud_cache/test_utils.py delete mode 100644 allensdk/test/api/cloud_cache/test_windows_isilon_paths.py delete mode 100644 allensdk/test/api/cloud_cache/utils.py delete mode 100644 allensdk/test/api/response_test_data/472451419_response.json delete mode 100644 allensdk/test/api/test_annotated_section_data_set_api.py delete mode 100644 allensdk/test/api/test_api.py delete mode 100644 allensdk/test/api/test_biophysical_api.py delete mode 100644 allensdk/test/api/test_brain_observatory_api.py delete mode 100755 allensdk/test/api/test_cache.py delete mode 100644 allensdk/test/api/test_cacheable.py delete mode 100644 allensdk/test/api/test_caching_utilities.py delete mode 100644 allensdk/test/api/test_cell_types_api.py delete mode 100644 allensdk/test/api/test_file_download.py delete mode 100644 allensdk/test/api/test_glif_api.py delete mode 100644 allensdk/test/api/test_grid_data_api.py delete mode 100644 allensdk/test/api/test_image_download_api.py delete mode 100644 allensdk/test/api/test_mouse_atlas_api.py delete mode 100644 allensdk/test/api/test_mouse_connectivity_api.py delete mode 100644 allensdk/test/api/test_ontologies_api.py delete mode 100644 allensdk/test/api/test_pager.py delete mode 100644 allensdk/test/api/test_reference_space_api.py delete mode 100644 allensdk/test/api/test_rma_template.py delete mode 100644 allensdk/test/api/test_svg_api.py delete mode 100644 allensdk/test/api/test_synchronization_api.py delete mode 100644 allensdk/test/api/test_tree_search_api.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache/__init__.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache/conftest.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache/utils.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py delete mode 100644 allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py delete mode 100644 allensdk/test/brain_observatory/behavior/conftest.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_files/test_stimulus_file.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_files/test_sync_file.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/base/test_data_object.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/conftest.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/lims_util.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/nwb_input_json.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_cell_specimens.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/avg_projection.png delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/behavior_stimulus_file.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/demix_file.h5 delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/events.h5 delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_table.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/licks.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/max_projection.png delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/presentations.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/raw_eye_tracking_rig_geometry.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/rewards.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/stimulus_file.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/sync.h5 delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/templates.pkl delete mode 100755 allensdk/test/brain_observatory/behavior/data_objects/test_data/test_input.json delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_data/trials.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_licks.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_motion_correction.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_projections.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_rewards.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_stimuli.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_task_parameters.py delete mode 100644 allensdk/test/brain_observatory/behavior/data_objects/test_trial_table.py delete mode 100755 allensdk/test/brain_observatory/behavior/resources/example_stimulus.pkl.gz delete mode 100644 allensdk/test/brain_observatory/behavior/resources/rig_geometry_multiple_rig_configs.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/resources/stimulus_template/expected/im065_unwarped.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/resources/stimulus_template/expected/im065_warped.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/resources/stimulus_template/input/test_image_set.pkl delete mode 100644 allensdk/test/brain_observatory/behavior/test_behavior_metadata_legacy.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_behavior_ophys_experiment.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_behavior_session.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_criteria.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_dprime.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_event_detection.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_eye_tracking_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_mtrain_annotate.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_prior_exposure_count_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_rewards_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_session_metrics.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_stimulus_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_sync_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_trial_masks.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_trials_processing.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_write_behavior_nwb.py delete mode 100644 allensdk/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py delete mode 100644 allensdk/test/brain_observatory/conftest.py delete mode 100644 allensdk/test/brain_observatory/ecephys/__init__.py delete mode 100644 allensdk/test/brain_observatory/ecephys/align_timestamps/__init__.py delete mode 100644 allensdk/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py delete mode 100644 allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode.py delete mode 100644 allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py delete mode 100644 allensdk/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py delete mode 100644 allensdk/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py delete mode 100644 allensdk/test/brain_observatory/ecephys/conftest.py delete mode 100644 allensdk/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/__init__.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/conftest.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_table/__init__.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py delete mode 100644 allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_copy_utility.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_current_source_density.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_ecephys_project_cache.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_ecephys_session.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_http_engine.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_lfp_subsampling.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_rma_engine.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_stim_file.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_stimulus_sync.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_visualization.py delete mode 100644 allensdk/test/brain_observatory/ecephys/test_write_nwb.py delete mode 100644 allensdk/test/brain_observatory/extract_running_speed/__init__.py delete mode 100644 allensdk/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py delete mode 100644 allensdk/test/brain_observatory/gaze_mapping/__init__.py delete mode 100644 allensdk/test/brain_observatory/gaze_mapping/test_gaze_mapping.py delete mode 100644 allensdk/test/brain_observatory/gaze_mapping/test_main.py delete mode 100644 allensdk/test/brain_observatory/nwb/__init__.py delete mode 100644 allensdk/test/brain_observatory/nwb/conftest.py delete mode 100644 allensdk/test/brain_observatory/nwb/test_nwb.py delete mode 100644 allensdk/test/brain_observatory/nwb/test_nwb_api.py delete mode 100644 allensdk/test/brain_observatory/nwb/test_nwb_utils.py delete mode 100644 allensdk/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py delete mode 100644 allensdk/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py delete mode 100644 allensdk/test/brain_observatory/sync_utilities/__init__.py delete mode 100644 allensdk/test/brain_observatory/sync_utilities/test_sync_utilities.py delete mode 100644 allensdk/test/brain_observatory/test_circle_plots.py delete mode 100644 allensdk/test/brain_observatory/test_demixer.py delete mode 100644 allensdk/test/brain_observatory/test_dff.py delete mode 100644 allensdk/test/brain_observatory/test_drifting_gratings.py delete mode 100644 allensdk/test/brain_observatory/test_locally_sparse_noise.py delete mode 100644 allensdk/test/brain_observatory/test_natural_movie.py delete mode 100644 allensdk/test/brain_observatory/test_natural_scenes.py delete mode 100644 allensdk/test/brain_observatory/test_notebook.py delete mode 100644 allensdk/test/brain_observatory/test_observatory_plots.py delete mode 100644 allensdk/test/brain_observatory/test_observatory_plots_data.json delete mode 100644 allensdk/test/brain_observatory/test_roi_masks.py delete mode 100644 allensdk/test/brain_observatory/test_session_analysis.py delete mode 100644 allensdk/test/brain_observatory/test_session_analysis_regression.py delete mode 100644 allensdk/test/brain_observatory/test_session_analysis_regression_data.json delete mode 100644 allensdk/test/brain_observatory/test_session_analysis_regression_data_list.json delete mode 100644 allensdk/test/brain_observatory/test_session_api_utils.py delete mode 100644 allensdk/test/brain_observatory/test_static_gratings.py delete mode 100644 allensdk/test/brain_observatory/test_stimulus_analysis.py delete mode 100755 allensdk/test/brain_observatory/test_stimulus_info.py delete mode 100644 allensdk/test/config/test_config_single_file_json.py delete mode 100644 allensdk/test/config/test_json_comments.py delete mode 100644 allensdk/test/config/test_manifest.py delete mode 100644 allensdk/test/config/test_multi_file_config.py delete mode 100644 allensdk/test/config/test_pyconfig_parser.py delete mode 100644 allensdk/test/core/nwb_ephys_files.txt delete mode 100644 allensdk/test/core/nwb_files.txt delete mode 100644 allensdk/test/core/test_authentication.py delete mode 100644 allensdk/test/core/test_brain_observatory_cache.py delete mode 100755 allensdk/test/core/test_brain_observatory_nwb_data_set.py delete mode 100644 allensdk/test/core/test_cell_filters.py delete mode 100644 allensdk/test/core/test_cell_types_cache_unit.py delete mode 100644 allensdk/test/core/test_h5_utilities.py delete mode 100644 allensdk/test/core/test_json_utilities.py delete mode 100644 allensdk/test/core/test_lazy_property.py delete mode 100755 allensdk/test/core/test_mouse_connectivity_cache.py delete mode 100644 allensdk/test/core/test_mouse_connectivity_notebook.py delete mode 100644 allensdk/test/core/test_nwb_data_set.py delete mode 100644 allensdk/test/core/test_obj_utilities.py delete mode 100644 allensdk/test/core/test_reference_space.py delete mode 100644 allensdk/test/core/test_reference_space_cache.py delete mode 100644 allensdk/test/core/test_reference_space_notebook.py delete mode 100644 allensdk/test/core/test_simple_tree.py delete mode 100644 allensdk/test/core/test_sitk_utilities.py delete mode 100644 allensdk/test/core/test_structure_tree.py delete mode 100644 allensdk/test/ephys/data/spike_test_high_init_dvdt.txt delete mode 100644 allensdk/test/ephys/data/spike_test_pair.txt delete mode 100644 allensdk/test/ephys/data/spike_test_var_dt.txt delete mode 100644 allensdk/test/ephys/test_extractor.py delete mode 100644 allensdk/test/ephys/test_features.py delete mode 100644 allensdk/test/glif_tests.py delete mode 100644 allensdk/test/internal/api/test_api_prerelease.py delete mode 100644 allensdk/test/internal/api/test_grid_data_api_prerelease.py delete mode 100644 allensdk/test/internal/api/test_mouse_connectivity_api_prerelease.py delete mode 100644 allensdk/test/internal/api/test_pre_release.py delete mode 100644 allensdk/test/internal/biophysical/conftest.py delete mode 100644 allensdk/test/internal/biophysical/test_ephys_utils.py delete mode 100644 allensdk/test/internal/biophysical/test_optimize_run.py delete mode 100644 allensdk/test/internal/biophysical/test_simulate_run.py delete mode 100644 allensdk/test/internal/brain_observatory/test_roi_filter_utils.py delete mode 100644 allensdk/test/internal/brain_observatory/test_run_ophys_time_sync.py delete mode 100644 allensdk/test/internal/brain_observatory/test_time_sync.py delete mode 100644 allensdk/test/internal/brain_observatory/time_sync_test_data.json delete mode 100644 allensdk/test/internal/conftest.py delete mode 100644 allensdk/test/internal/core/test_mouse_connectivity_cache_prerelease.py delete mode 100644 allensdk/test/internal/gbm/test.genes.results delete mode 100644 allensdk/test/internal/gbm/test.isoforms.results delete mode 100644 allensdk/test/internal/gbm/test2.genes.results delete mode 100644 allensdk/test/internal/gbm/test2.isoforms.results delete mode 100644 allensdk/test/internal/gbm/test_generate_gbm_heatmap.py delete mode 100644 allensdk/test/internal/morphology/test_apply_affine.py delete mode 100644 allensdk/test/internal/mouse_connectivity/test_interval_unionizer.py delete mode 100644 allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py delete mode 100644 allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py delete mode 100644 allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py delete mode 100644 allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py delete mode 100644 allensdk/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py delete mode 100644 allensdk/test/internal/mouse_connectivity/test_unionize_record.py delete mode 100644 allensdk/test/internal/test_annotated_region_metrics.py delete mode 100644 allensdk/test/internal/test_biophysical_modules.py delete mode 100644 allensdk/test/internal/test_core_feature_extract.py delete mode 100644 allensdk/test/internal/test_eye_calibration.py delete mode 100644 allensdk/test/internal/test_internal.py delete mode 100644 allensdk/test/internal/test_mtrain_api.py delete mode 100644 allensdk/test/internal/test_optimize_config_reader.py delete mode 100644 allensdk/test/internal/test_optimize_manifest.py delete mode 100644 allensdk/test/internal/test_roi_filter.py delete mode 100644 allensdk/test/internal/test_simulate_manifest.py delete mode 100644 allensdk/test/internal/test_simulate_update_output.py delete mode 100644 allensdk/test/internal/tissuecyte_stitching/test_stitcher.py delete mode 100644 allensdk/test/internal/tissuecyte_stitching/test_tile.py delete mode 100644 allensdk/test/model/aa_model/468193142_fit.json delete mode 100644 allensdk/test/model/aa_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc delete mode 100644 allensdk/test/model/aa_model/manifest.json delete mode 100644 allensdk/test/model/aa_model/modfiles/CaDynamics.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Ca_HVA.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Ca_LVA.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Ih.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Im.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Im_v2.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/K_P.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/K_T.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Kd.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Kv2like.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Kv3_1.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/NaTa.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/NaTs.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/NaV.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/Nap.mod delete mode 100644 allensdk/test/model/aa_model/modfiles/SK.mod delete mode 100644 allensdk/test/model/aa_model/test_biophysical_all_active.py delete mode 100644 allensdk/test/model/check_parser.py delete mode 100644 allensdk/test/model/peri_model/468193142_fit.json delete mode 100644 allensdk/test/model/peri_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc delete mode 100644 allensdk/test/model/peri_model/manifest.json delete mode 100644 allensdk/test/model/peri_model/modfiles/CaDynamics.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Ca_HVA.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Ca_LVA.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Ih.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Im.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Im_v2.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/K_P.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/K_T.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Kd.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Kv2like.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Kv3_1.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/NaTa.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/NaTs.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/NaV.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/Nap.mod delete mode 100644 allensdk/test/model/peri_model/modfiles/SK.mod delete mode 100644 allensdk/test/model/peri_model/test_biophysical_peri.py delete mode 100644 allensdk/test/model/test_biophysical_perisomatic.py delete mode 100644 allensdk/test/model/test_glif.py delete mode 100644 allensdk/test/model/test_runner.py delete mode 100644 allensdk/test/mouse_connectivity/__init__.py delete mode 100644 allensdk/test/mouse_connectivity/grid/__init__.py delete mode 100644 allensdk/test/mouse_connectivity/grid/test_base_subimage.py delete mode 100644 allensdk/test/mouse_connectivity/grid/test_cav_subimage.py delete mode 100644 allensdk/test/mouse_connectivity/grid/test_classic_subimage.py delete mode 100644 allensdk/test/mouse_connectivity/grid/test_image_series_gridder.py delete mode 100644 allensdk/test/mouse_connectivity/grid/test_image_utilities.py delete mode 100644 allensdk/test/test_argschema_utilities.py delete mode 100644 allensdk/test/test_deprecated.py delete mode 100644 allensdk/test/test_inline_examples.py delete mode 100644 allensdk/test/test_temp_dir.py delete mode 100644 allensdk/test_utilities/__init__.py delete mode 100644 allensdk/test_utilities/custom_comparators.py delete mode 100644 allensdk/test_utilities/regression_fixture.py delete mode 100644 allensdk/test_utilities/temp_dir.py diff --git a/allensdk/__init__.py b/allensdk/__init__.py deleted file mode 100644 index 5e5fe6633c..0000000000 --- a/allensdk/__init__.py +++ /dev/null @@ -1,79 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging - -__version__ = '2.13.1' - - -try: - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - - -class OneResultExpectedError(RuntimeError): - pass - - -def one(x): - if isinstance(x, str): - return x - try: - xlen = len(x) - except TypeError: - return x - if xlen != 1: - raise OneResultExpectedError("Expected length one result, received: " - f"{x} results from queryr") - if isinstance(x, set): - return list(x)[0] - else: - return x[0] - - -logging.getLogger(__name__).addHandler(NullHandler()) - -if True: - file_download_log = logging.getLogger( - 'allensdk.api.api.retrieve_file_over_http') - file_download_log.setLevel(logging.INFO) - console = logging.StreamHandler() - formatter = logging.Formatter("%(asctime)s %(name)-12s " - "%(levelname)-8s %(message)s") - console.setFormatter(formatter) - file_download_log.addHandler(console) diff --git a/allensdk/api/__init__.py b/allensdk/api/__init__.py deleted file mode 100644 index 361bcf102b..0000000000 --- a/allensdk/api/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -''' Subclasses of allensdk.api.api.Api to implement specific queries to the -`Allen Brain Atlas Data Portal <http://www.brain-map.org/api/index.html>`_. -''' diff --git a/allensdk/api/api.py b/allensdk/api/api.py deleted file mode 100644 index c69e53b75b..0000000000 --- a/allensdk/api/api.py +++ /dev/null @@ -1,443 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from contextlib import closing -import logging -import os -import errno -import warnings -import io -import zipfile - -import requests -import pandas as pd -from requests_toolbelt import exceptions -from requests_toolbelt.downloadutils import stream - -import allensdk.core.json_utilities as json_utilities - - -class Api(object): - _log = logging.getLogger('allensdk.api.api') - _file_download_log = logging.getLogger('allensdk.api.api.retrieve_file_over_http') - default_api_url = 'http://api.brain-map.org' - download_url = 'http://download.alleninstitute.org' - - def __init__(self, api_base_url_string=None): - if api_base_url_string is None: - api_base_url_string = Api.default_api_url - - self.set_api_urls(api_base_url_string) - self.default_working_directory = os.getcwd() - - def set_api_urls(self, api_base_url_string): - '''Set the internal RMA and well known file download endpoint urls - based on a api server endpoint. - - Parameters - ---------- - api_base_url_string : string - url of the api to point to - ''' - self.api_url = api_base_url_string - - # http://help.brain-map.org/display/api/Downloading+a+WellKnownFile - self.well_known_file_endpoint = api_base_url_string + \ - '/api/v2/well_known_file_download' - - # http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data - self.grid_data_endpoint = api_base_url_string + '/grid_data' - - # http://help.brain-map.org/display/api/Downloading+and+Displaying+SVG - self.svg_endpoint = api_base_url_string + '/api/v2/svg' - self.svg_download_endpoint = api_base_url_string + '/api/v2/svg_download' - - # http://help.brain-map.org/display/api/Downloading+an+Ontology%27s+Structure+Graph - self.structure_graph_endpoint = api_base_url_string + \ - '/api/v2/structure_graph_download' - - # http://help.brain-map.org/display/api/Searching+a+Specimen+or+Structure+Tree - self.tree_search_endpoint = api_base_url_string + '/api/v2/tree_search' - - # http://help.brain-map.org/display/api/Searching+Annotated+SectionDataSets - self.annotated_section_data_sets_endpoint = api_base_url_string + \ - '/api/v2/annotated_section_data_sets' - self.compound_annotated_section_data_sets_endpoint = api_base_url_string + \ - '/api/v2/compound_annotated_section_data_sets' - - # http://help.brain-map.org/display/api/Image-to-Image+Synchronization#Image-to-ImageSynchronization-ImagetoImage - self.image_to_atlas_endpoint = api_base_url_string + '/api/v2/image_to_atlas' - self.image_to_image_endpoint = api_base_url_string + '/api/v2/image_to_image' - self.image_to_image_2d_endpoint = api_base_url_string + '/api/v2/image_to_image_2d' - self.reference_to_image_endpoint = api_base_url_string + '/api/v2/reference_to_image' - self.image_to_reference_endpoint = api_base_url_string + '/api/v2/image_to_reference' - self.structure_to_image_endpoint = api_base_url_string + '/api/v2/structure_to_image' - - # http://help.brain-map.org/display/mouseconnectivity/API - self.section_image_download_endpoint = api_base_url_string + \ - '/api/v2/section_image_download' - self.atlas_image_download_endpoint = api_base_url_string + \ - '/api/v2/atlas_image_download' - self.projection_image_download_endpoint = api_base_url_string + \ - '/api/v2/projection_image_download' - self.image_download_endpoint = api_base_url_string + \ - '/api/v2/image_download' - self.informatics_archive_endpoint = Api.download_url + '/informatics-archive' - - self.rma_endpoint = api_base_url_string + '/api/v2/data' - - def set_default_working_directory(self, working_directory): - '''Set the working directory where files will be saved. - - Parameters - ---------- - working_directory : string - the absolute path string of the working directory. - ''' - self.default_working_directory = working_directory - - def read_data(self, parsed_json): - '''Return the message data from the parsed query. - - Parameters - ---------- - parsed_json : dict - A python structure corresponding to the JSON data returned from the API. - - Notes - ----- - See `API Response Formats - Response Envelope <http://help.brain-map.org/display/api/API+Response+Formats#APIResponseFormats-ResponseEnvelope>`_ - for additional documentation. - ''' - return parsed_json['msg'] - - def json_msg_query(self, url, dataframe=False): - ''' Common case where the url is fully constructed - and the response data is stored in the 'msg' field. - - Parameters - ---------- - url : string - Where to get the data in json form - dataframe : boolean - True converts to a pandas dataframe, False (default) doesn't - - Returns - ------- - dict or DataFrame - returned data; type depends on dataframe option - ''' - - data = self.do_query(lambda *a, **k: url, - self.read_data) - - if dataframe is True: - warnings.warn("dataframe argument is deprecated", DeprecationWarning) - data = pd.DataFrame(data) - - return data - - def do_query(self, url_builder_fn, json_traversal_fn, *args, **kwargs): - '''Bundle an query url construction function - with a corresponding response json traversal function. - - Parameters - ---------- - url_builder_fn : function - A function that takes parameters and returns an rma url. - json_traversal_fn : function - A function that takes a json-parsed python data structure and returns data from it. - post : boolean, optional kwarg - True does an HTTP POST, False (default) does a GET - args : arguments - Arguments to be passed to the url builder function. - kwargs : keyword arguments - Keyword arguments to be passed to the rma builder function. - - Returns - ------- - any type - The data extracted from the json response. - - Examples - -------- - `A simple Api subclass example - <data_api_client.html#creating-new-api-query-classes>`_. - ''' - api_url = url_builder_fn(*args, **kwargs) - - post = kwargs.get('post', False) - - json_parsed_data = self.retrieve_parsed_json_over_http(api_url, post) - - return json_traversal_fn(json_parsed_data) - - def do_rma_query(self, rma_builder_fn, json_traversal_fn, *args, **kwargs): - '''Bundle an RMA query url construction function - with a corresponding response json traversal function. - - ..note:: Deprecated in AllenSDK 0.9.2 - `do_rma_query` will be removed in AllenSDK 1.0, it is replaced by - `do_query` because the latter is more general. - - Parameters - ---------- - rma_builder_fn : function - A function that takes parameters and returns an rma url. - json_traversal_fn : function - A function that takes a json-parsed python data structure and returns data from it. - args : arguments - Arguments to be passed to the rma builder function. - kwargs : keyword arguments - Keyword arguments to be passed to the rma builder function. - - Returns - ------- - any type - The data extracted from the json response. - - Examples - -------- - `A simple Api subclass example - <data_api_client.html#creating-new-api-query-classes>`_. - ''' - return self.do_query(rma_builder_fn, json_traversal_fn, *args, **kwargs) - - def load_api_schema(self): - '''Download the RMA schema from the current RMA endpoint - - Returns - ------- - dict - the parsed json schema message - - Notes - ----- - This information and other - `Allen Brain Atlas Data Portal Data Model <http://help.brain-map.org/display/api/Data+Model>`_ - documentation is also available as a - `Class Hierarchy <http://api.brain-map.org/class_hierarchy>`_ - and `Class List <http://api.brain-map.org/class_hierarchy>`_. - - ''' - schema_url = self.rma_endpoint + '/enumerate.json' - json_parsed_schema_data = self.retrieve_parsed_json_over_http( - schema_url) - - return json_parsed_schema_data - - def construct_well_known_file_download_url(self, well_known_file_id): - '''Join data api endpoint and id. - - Parameters - ---------- - well_known_file_id : integer or string representing an integer - well known file id - - Returns - ------- - string - the well-known-file download url for the current api api server - - See Also - -------- - retrieve_file_over_http: Can be used to retrieve the file from the url. - ''' - return self.well_known_file_endpoint + '/' + str(well_known_file_id) - - def cleanup_truncated_file(self, file_path): - '''Helper for removing files. - - Parameters - ---------- - file_path : string - Absolute path including the file name to remove.''' - try: - os.remove(file_path) - except OSError as e: - if e.errno != errno.ENOENT: - raise - - def retrieve_file_over_http(self, url, file_path, zipped=False): - '''Get a file from the data api and save it. - - Parameters - ---------- - url : string - Url[1]_ from which to get the file. - file_path : string - Absolute path including the file name to save. - zipped : bool, optional - If true, assume that the response is a zipped directory and attempt - to extract contained files into the directory containing file_path. - Default is False. - - See Also - -------- - construct_well_known_file_download_url: Can be used to construct the url. - - References - ---------- - .. [1] Allen Brain Atlas Data Portal: `Downloading a WellKnownFile <http://help.brain-map.org/display/api/Downloading+a+WellKnownFile>`_. - ''' - - self._file_download_log.info("Downloading URL: %s", url) - - try: - if zipped: - stream_zip_directory_over_http(url, os.path.dirname(file_path)) - else: - stream_file_over_http(url, file_path) - - except exceptions.StreamingError as e: - self._file_download_log.error("Couldn't retrieve file %s from %s (streaming)." % (file_path,url)) - self.cleanup_truncated_file(file_path) - raise - - except requests.exceptions.ConnectionError as e: - self._file_download_log.error("Couldn't retrieve file %s from %s (connection)." % (file_path,url)) - self.cleanup_truncated_file(file_path) - raise - - except requests.exceptions.ReadTimeout as e: - self._file_download_log.error("Couldn't retrieve file %s from %s (timeout)." % (file_path,url)) - self.cleanup_truncated_file(file_path) - raise - - except requests.exceptions.RequestException as e: - self._file_download_log.error("Couldn't retrieve file %s from %s (request)." % (file_path,url)) - self.cleanup_truncated_file(file_path) - raise - - except Exception as e: - self._file_download_log.error("Couldn't retrieve file %s from %s" % (file_path, url)) - self.cleanup_truncated_file(file_path) - raise - - - def retrieve_parsed_json_over_http(self, url, post=False): - '''Get the document and put it in a Python data structure - - Parameters - ---------- - url : string - Full API query url. - post : boolean - True does an HTTP POST, False (default) encodes the URL and does a GET - - Returns - ------- - dict - Result document as parsed by the JSON library. - ''' - self._log.info("Downloading URL: %s", url) - - if post is False: - data = json_utilities.read_url_get( - requests.utils.quote(url, - ';/?:@&=+$,')) - else: - data = json_utilities.read_url_post(url) - - return data - - def retrieve_xml_over_http(self, url): - '''Get the document and put it in a Python data structure - - Parameters - ---------- - url : string - Full API query url. - - Returns - ------- - string - Unparsed xml string. - ''' - self._log.info("Downloading URL: %s", url) - - response = requests.get(url) - - return response.content - - -def stream_zip_directory_over_http(url, directory, members=None, timeout=(9.05, 31.1)): - ''' Supply an http get request and stream the response to a file. - - Parameters - ---------- - url : str - Send the request to this url - directory : str - Extract the response to this directory - members : list of str, optional - Extract only these files - timeout : float or tuple of float, optional - Specify a timeout for the request. If a tuple, specify seperate connect - and read timeouts. - - ''' - - buf = io.BytesIO() - - with closing( requests.get(url, stream=True, timeout=timeout) ) as request: - stream.stream_response_to_file( request, buf ) - - zipper = zipfile.ZipFile(buf) - zipper.extractall(path=directory, members=members) - zipper.close() - - -def stream_file_over_http(url, file_path, timeout=(9.05, 31.1)): - ''' Supply an http get request and stream the response to a file. - - Parameters - ---------- - url : str - Send the request to this url - file_path : str - Stream the response to this path - timeout : float or tuple of float, optional - Specify a timeout for the request. If a tuple, specify seperate connect - and read timeouts. - - ''' - - with closing(requests.get(url, stream=True, timeout=timeout)) as response: - - response.raise_for_status() - with open(file_path, 'wb') as fil: - stream.stream_response_to_file(response, path=fil) diff --git a/allensdk/api/cloud_cache/README.md b/allensdk/api/cloud_cache/README.md deleted file mode 100644 index b726348b18..0000000000 --- a/allensdk/api/cloud_cache/README.md +++ /dev/null @@ -1,130 +0,0 @@ -Cloud Cache -=========== - -## High level summary - -The classes defined in this directory are designed to provide programmatic -access to version-controlled, cloud-hosted datasets. Users download these -datasets using sub-classes of the `CloudCacheBase` class defined in -`cloud_cache.py`. The datasets accessed by the cloud cache generally -consist of three parts - -- Some arbitrary number of metadata files. These will be csv files suitable for -reading with pandas. -- Some arbitrary number of data files. These can be of any form. -- A manifest.json file defining the contents of the dataset. - -For each version of the dataset, there will be a distinct manifest file loaded -into the cloud service behind the cloud cache. All other files are -version-controlled using the cloud service's native functionality. To load a -dataset, the user instantiates a sub-class of `CloudCacheBase` and runs -`cache.load_manifest('name_of_manifest.json')`. Valid manifest file names can -be accessed through `cache.manifest_file_names`. Loading the manifest -essentially configures the cloud cache to access the corresponding version of -the dataset. - -`cache.download_data(file_id)` will download a data file to the local -sytem and return the path to where that file has been downloaded. If the file -has already been downloaded, `cache.download_data(file_id)` will just -return the path to the local copy of the file without downloading it again. -In this call `file_id` is a unique identifier for each data file corresponding -to a column in the metadata files. The name of that column can be found with -`cache.file_id_column`. - -`cache.download_metadata(metadata_fname)` will download a metadata -file to the local system and return the path where the file has been stored. -The list of valid values for `metadata_fname` can be found with -`cache.metadata_file_names`. If users wish to directly access a -pandas DataFrame of a given metadata file, they can use -`cache.get_metadata(metadata_fname)`. - -## Structure of `manifest.json` - -The `manifest.json` files are structured like so -``` - -{ - "project_name" : my-project-name-string, - "dataset_version" : dataset_version_string, - "file_id_column": name_of_column_uniquely_identifying_files, - "metadata_files":{ - metadata_file_name_1: {"url": "full/url/to/file", - "version_id": version_id_string, - "file_hash": file_hash_of_metadata_file}, - metadata_file_name_2: {"url": "full/url/to/file", - "version_id": version_id_string, - "file_hash": file_hash_of_metadata_file}, - ... - }, - "data_files": { - file_id_1: {"url": "full/url/to/imaging_plane.nwb", - "version_id": version_id_string, - "file_hash": file_hash_of_file}, - file_id_2: {"url": "full/url/to/behavior_only_session.nwb", - "version_id": version_id_string, - "file_hash": file_hash_of_file}, - ... - } -} -``` -The entries under `metadata_files` and `data_files` provide the information -necessary for the cloud cache to - -- locate the online resoure -- determine where it should be stored locally -- determine if the copy that is stored locally is valid - -When a user asks to download a file, `cache._manifest` (an -instantiation of the `Manifest` class defined in `manifest.py`) constructs -a candidate local path for the resource like -``` -cache_dir/file_hash/relative_path_to_resource -``` -where `cache_dir` is a parent directory for all local data storage specified by -the user upon instantiating the cloud cache. If a file already exists at that -location, the cloud cache compares its `file_hash` to the `file_hash` reported -in the manifest. If they match, the file does not need to be downloaded. -If either - -- a file does not exist at the candidate local path or -- the `file_hash` of the file at the candidate local path does not match the -`file_hash` reported in the manifest - -then the cloud cache downloads the online resource to the candidate local path. -By including `file_hash` in the local path, we ensure that, if `data_file_1` -did not change between versions 1 and 2 of the dataset, it will not be -needlessly downloaded again when the user switches between those versions of -the dataset. Furthermore, when the user switches to version 3 of the dataset, -they will not lose the old version of `data_file_1` that they previously -downloaded, the cloud cache will merely redirect them to using the newer -version of the data file. - -The `version_id` entry in the `manifest.json` description of resources is -necessary to disambiguate different versions of the same file when downloading -the resources from the cloud service. - -## Implementation of `CloudCacheBase` - -`CloudCacheBase` is actually just a base class that is meant to be -cloud-provider agnostic. In order to actually access a dataset, a sub-class -of `CloudCacheBase` must be implemented which knows how to access the -specific cloud service hosting the data (see, for instance `S3CloudCache`, -also defined in `cloud_cache.py`). Sub-classes of `CloudCacheBase` must -implement - -### `_list_all_manifests` - -Takes no arguments beyond `self`. Returns a list of all `manifest.json` files -in the dataset (with the `manifest/` prefix removed from the path). - -### `_download_manifest` - -Takes the name of a `manifest.json` file an `io.BytesIO` stream. Downloads the -contents of the `manifest.json`, loads it into the stream, and resets the -stream to the beginning (i.e. `stream.seek(0)`). Returns nothing. - -### `_download_file` - -Takes a `CacheFileAttributes` (defined in `file_attributes.py`) describing a -file. Checks to see if the local file exists in a valid state. If not, -downloads the file. diff --git a/allensdk/api/cloud_cache/__init__.py b/allensdk/api/cloud_cache/__init__.py deleted file mode 100644 index fa81adaff6..0000000000 --- a/allensdk/api/cloud_cache/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# empty file diff --git a/allensdk/api/cloud_cache/cloud_cache.py b/allensdk/api/cloud_cache/cloud_cache.py deleted file mode 100644 index 207ec81c90..0000000000 --- a/allensdk/api/cloud_cache/cloud_cache.py +++ /dev/null @@ -1,1301 +0,0 @@ -from typing import List, Tuple, Dict, Optional, Union -from abc import ABC, abstractmethod -from pathlib import Path -import os -import pathlib -import pandas as pd -import boto3 -import semver -import tqdm -import re -import json -import warnings -from botocore import UNSIGNED -from botocore.client import Config -from allensdk.internal.core.lims_utilities import safe_system_path -from allensdk.api.cloud_cache.manifest import Manifest -from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes -from allensdk.api.cloud_cache.utils import file_hash_from_path -from allensdk.api.cloud_cache.utils import bucket_name_from_url -from allensdk.api.cloud_cache.utils import relative_path_from_url - - -class OutdatedManifestWarning(UserWarning): - pass - - -class MissingLocalManifestWarning(UserWarning): - pass - - -class BasicLocalCache(ABC): - """ - A class to handle the loading and accessing a project's data and - metadata from a local cache directory. Does NOT include any 'smart' - features like: - 1. Keeping track of last loaded manifest - 2. Constructing symlinks for valid data from previous dataset versions - 3. Warning of outdated manifests - - For those features (and more) see the CloudCacheBase class - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data and metadata are stored on the - local system - - project_name: str - the name of the project this cache is supposed to access. This will - be the root directory for all files stored in the bucket. - - ui_class_name: Optional[str] - Name of the class users are actually using to manipulate this - functionality (used to populate helpful error messages) - """ - - def __init__( - self, - cache_dir: Union[str, Path], - project_name: str, - ui_class_name: Optional[str] = None - ): - os.makedirs(cache_dir, exist_ok=True) - - # the class users are actually interacting with - # (for warning message purposes) - if ui_class_name is None: - self._user_interface_class = type(self).__name__ - else: - self._user_interface_class = ui_class_name - - self._manifest = None - self._manifest_name = None - - self._cache_dir = cache_dir - self._project_name = project_name - - self._manifest_file_names = self._list_all_manifests() - - # ====================== BasicLocalCache properties ======================= - - @property - def ui(self): - return self._user_interface_class - - @property - def current_manifest(self) -> Union[None, str]: - """The name of the currently loaded manifest""" - return self._manifest_name - - @property - def project_name(self) -> str: - """The name of the project that this cache is accessing""" - return self._project_name - - @property - def manifest_prefix(self) -> str: - """On-line prefix for manifest files""" - return f'{self.project_name}/manifests/' - - @property - def file_id_column(self) -> str: - """The col name in metadata files used to uniquely identify data files - """ - return self._manifest.file_id_column - - @property - def version(self) -> str: - """The version of the dataset currently loaded""" - return self._manifest.version - - @property - def metadata_file_names(self) -> list: - """List of metadata file names associated with this dataset""" - return self._manifest.metadata_file_names - - @property - def manifest_file_names(self) -> list: - """Sorted list of manifest file names associated with this dataset - """ - return self._manifest_file_names - - @property - def latest_manifest_file(self) -> str: - """parses on-line available manifest files for semver string - and returns the latest one - self.manifest_file_names are assumed to be of the form - '<anything>_v<semver_str>.json' - - Returns - ------- - str - the filename whose semver string is the latest one - """ - return self._find_latest_file(self.manifest_file_names) - - # ====================== BasicLocalCache methods ========================== - - @abstractmethod - def _list_all_manifests(self) -> list: - """ - Return a list of all of the file names of the manifests associated - with this dataset - """ - raise NotImplementedError() - - def list_all_downloaded_manifests(self) -> list: - """ - Return a list of all of the manifest files that have been - downloaded for this dataset - """ - output = [x for x in os.listdir(self._cache_dir) - if re.fullmatch(".*_manifest_v.*.json", x)] - output.sort() - return output - - def _find_latest_file(self, file_name_list: List[str]) -> str: - """ - Take a list of files named like - - {blob}_v{version}.json - - and return the one with the latest version - """ - vstrs = [s.split(".json")[0].split("_v")[-1] - for s in file_name_list] - versions = [semver.VersionInfo.parse(v) for v in vstrs] - imax = versions.index(max(versions)) - return file_name_list[imax] - - def _load_manifest( - self, - manifest_name: str, - use_static_project_dir: bool = False - ) -> Manifest: - """ - Load and return a manifest from this dataset. - - Parameters - ---------- - manifest_name: str - The name of the manifest to load. Must be an element in - self.manifest_file_names - use_static_project_dir: bool - When determining what the local path of a remote resource - (data or metadata file) should be, the Manifest class will - typically create a versioned project subdirectory under the user - provided `cache_dir` - (e.g. f"{cache_dir}/{project_name}-{manifest_version}") - to allow the possibility of multiple manifest (and data) versions - to be used. In certain cases, like when using a project's s3 bucket - directly as the cache_dir, the project directory name needs to be - static (e.g. f"{cache_dir}/{project_name}"). When set to True, - the Manifest class will use a static project directory to determine - local paths for remote resources. Defaults to False. - - Returns - ------- - Manifest - """ - if manifest_name not in self.manifest_file_names: - raise ValueError( - f"Manifest to load ({manifest_name}) is not one of the " - "valid manifest names for this dataset. Valid names include:\n" - f"{self.manifest_file_names}" - ) - - if use_static_project_dir: - manifest_path = os.path.join( - self._cache_dir, self.project_name, "manifests", manifest_name - ) - else: - manifest_path = os.path.join(self._cache_dir, manifest_name) - - with open(manifest_path, "r") as f: - local_manifest = Manifest( - cache_dir=self._cache_dir, - json_input=f, - use_static_project_dir=use_static_project_dir - ) - - return local_manifest - - def load_manifest(self, manifest_name: str): - """ - Load a manifest from this dataset. - - Parameters - ---------- - manifest_name: str - The name of the manifest to load. Must be an element in - self.manifest_file_names - """ - self._manifest = self._load_manifest(manifest_name) - self._manifest_name = manifest_name - - def _file_exists(self, file_attributes: CacheFileAttributes) -> bool: - """ - Given a CacheFileAttributes describing a file, assess whether or - not that file exists locally. - - Parameters - ---------- - file_attributes: CacheFileAttributes - Description of the file to look for - - Returns - ------- - bool - True if the file exists and is valid; False otherwise - - Raises - ----- - RuntimeError - If file_attributes.local_path exists but is not a file. - It would be unclear how the cache should proceed in this case. - """ - file_exists = False - - if file_attributes.local_path.exists(): - if not file_attributes.local_path.is_file(): - raise RuntimeError(f"{file_attributes.local_path}\n" - "exists, but is not a file;\n" - "unsure how to proceed") - - file_exists = True - - return file_exists - - def metadata_path(self, fname: str) -> dict: - """ - Return the local path to a metadata file, and test for the - file's existence - - Parameters - ---------- - fname: str - The name of the metadata file to be accessed - - Returns - ------- - dict - - 'path' will be a pathlib.Path pointing to the file's location - - 'exists' will be a boolean indicating if the file - exists in a valid state - - 'file_attributes' is a CacheFileAttributes describing the file - in more detail - - Raises - ------ - RuntimeError - If the file cannot be downloaded - """ - file_attributes = self._manifest.metadata_file_attributes(fname) - exists = self._file_exists(file_attributes) - local_path = file_attributes.local_path - output = {'local_path': local_path, - 'exists': exists, - 'file_attributes': file_attributes} - - return output - - def data_path(self, file_id) -> dict: - """ - Return the local path to a data file, and test for the - file's existence - - Parameters - ---------- - file_id: - The unique identifier of the file to be accessed - - Returns - ------- - dict - - 'local_path' will be a pathlib.Path pointing to the file's location - - 'exists' will be a boolean indicating if the file - exists in a valid state - - 'file_attributes' is a CacheFileAttributes describing the file - in more detail - - Raises - ------ - RuntimeError - If the file cannot be downloaded - """ - file_attributes = self._manifest.data_file_attributes(file_id) - exists = self._file_exists(file_attributes) - local_path = file_attributes.local_path - output = {'local_path': local_path, - 'exists': exists, - 'file_attributes': file_attributes} - - return output - - -class CloudCacheBase(BasicLocalCache): - """ - A class to handle the downloading and accessing of data served from a cloud - storage system - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - project_name: str - the name of the project this cache is supposed to access. This will - be the root directory for all files stored in the bucket. - - ui_class_name: Optional[str] - Name of the class users are actually using to manipulate this - functionality (used to populate helpful error messages) - """ - - _bucket_name = None - - def __init__(self, cache_dir, project_name, ui_class_name=None): - super().__init__(cache_dir=cache_dir, project_name=project_name, - ui_class_name=ui_class_name) - - # what latest_manifest was the last time an OutdatedManifestWarning - # was emitted - self._manifest_last_warned_on = None - - c_path = pathlib.Path(self._cache_dir) - - # self._manifest_last_used contains the name of the manifest - # last loaded from this cache dir (if applicable) - self._manifest_last_used = c_path / '_manifest_last_used.txt' - - # self._downloaded_data_path is where we will keep a JSONized - # dict mapping paths to downloaded files to their file_hashes; - # this will be used when determining if a downloaded file - # can instead be a symlink - self._downloaded_data_path = c_path / '_downloaded_data.json' - - # if the local manifest is missing but there are - # data files in cache_dir, emit a warning - # suggesting that the user run - # self.construct_local_manifest - if not self._downloaded_data_path.exists(): - file_list = c_path.glob('**/*') - has_files = False - for fname in file_list: - if fname.is_file(): - if 'json' not in fname.name: - has_files = True - break - if has_files: - msg = 'This cache directory appears to ' - msg += 'contain data files, but it has no ' - msg += 'record of what those files are. ' - msg += 'You might want to consider running\n\n' - msg += f'{self.ui}.construct_local_manifest()\n\n' - msg += 'to avoid needlessly downloading duplicates ' - msg += 'of data files that did not change between ' - msg += 'data releases. NOTE: running this method ' - msg += 'will require hashing every data file you ' - msg += 'have currently downloaded and could be ' - msg += 'very time consuming.\n\n' - msg += 'To avoid this warning in the future, make ' - msg += 'sure that\n\n' - msg += f'{str(self._downloaded_data_path.resolve())}\n\n' - msg += 'is not deleted between instantiations of this ' - msg += 'cache' - warnings.warn(msg, MissingLocalManifestWarning) - - def construct_local_manifest(self) -> None: - """ - Construct the dict that maps between file_hash and - absolute local path. Save it to self._downloaded_data_path - """ - lookup = {} - files_to_hash = set() - c_dir = pathlib.Path(self._cache_dir) - file_iterator = c_dir.glob('**/*') - for file_name in file_iterator: - if file_name.is_file(): - if 'json' not in file_name.name: - if file_name != self._manifest_last_used: - files_to_hash.add(file_name.resolve()) - - with tqdm.tqdm(files_to_hash, - total=len(files_to_hash), - unit='(files hashed)') as pbar: - - for local_path in pbar: - hsh = file_hash_from_path(local_path) - lookup[str(local_path.absolute())] = hsh - - with open(self._downloaded_data_path, 'w') as out_file: - out_file.write(json.dumps(lookup, indent=2, sort_keys=True)) - - def _warn_of_outdated_manifest(self, manifest_name: str) -> None: - """ - Warn that manifest_name is not the latest manifest available - """ - if self._manifest_last_warned_on is not None: - if self.latest_manifest_file == self._manifest_last_warned_on: - return None - - self._manifest_last_warned_on = self.latest_manifest_file - - msg = '\n\n' - msg += 'The manifest file you are loading is not the ' - msg += 'most up to date manifest file available for ' - msg += 'this dataset. The most up to data manifest file ' - msg += 'available for this dataset is \n\n' - msg += f'{self.latest_manifest_file}\n\n' - msg += 'To see the differences between these manifests,' - msg += 'run\n\n' - msg += f"{self.ui}.compare_manifests('{manifest_name}', " - msg += f"'{self.latest_manifest_file}')\n\n" - msg += "To see all of the manifest files currently downloaded " - msg += "onto your local system, run\n\n" - msg += "self.list_all_downloaded_manifests()\n\n" - msg += "If you just want to load the latest manifest, run\n\n" - msg += "self.load_latest_manifest()\n\n" - warnings.warn(msg, OutdatedManifestWarning) - return None - - @property - def latest_downloaded_manifest_file(self) -> str: - """parses downloaded available manifest files for semver string - and returns the latest one - self.manifest_file_names are assumed to be of the form - '<anything>_v<semver_str>.json' - - Returns - ------- - str - the filename whose semver string is the latest one - """ - file_list = self.list_all_downloaded_manifests() - if len(file_list) == 0: - return '' - return self._find_latest_file(self.list_all_downloaded_manifests()) - - def load_last_manifest(self): - """ - If this Cache was used previously, load the last manifest - used in this cache. If this cache has never been used, load - the latest manifest. - """ - if not self._manifest_last_used.exists(): - self.load_latest_manifest() - return None - - with open(self._manifest_last_used, 'r') as in_file: - to_load = in_file.read() - - latest = self.latest_manifest_file - - if to_load not in self.manifest_file_names: - msg = 'The manifest version recorded as last used ' - msg += f'for this cache -- {to_load}-- ' - msg += 'is not a valid manifest for this dataset. ' - msg += f'Loading latest version -- {latest} -- ' - msg += 'instead.' - warnings.warn(msg, UserWarning) - self.load_latest_manifest() - return None - - if latest != to_load: - self._manifest_last_warned_on = self.latest_manifest_file - msg = f"You are loading {to_load}. A more up to date " - msg += f"version of the dataset -- {latest} -- exists " - msg += "online. To see the changes between the two " - msg += "versions of the dataset, run\n" - msg += f"{self.ui}.compare_manifests('{to_load}'," - msg += f" '{latest}')\n" - msg += "To load another version of the dataset, run\n" - msg += f"{self.ui}.load_manifest('{latest}')" - warnings.warn(msg, OutdatedManifestWarning) - self.load_manifest(to_load) - return None - - def load_latest_manifest(self): - latest_downloaded = self.latest_downloaded_manifest_file - latest = self.latest_manifest_file - if latest != latest_downloaded: - if latest_downloaded != '': - msg = f'You are loading\n{self.latest_manifest_file}\n' - msg += 'which is newer than the most recent manifest ' - msg += 'file you have previously been working with\n' - msg += f'{latest_downloaded}\n' - msg += 'It is possible that some data files have changed ' - msg += 'between these two data releases, which will ' - msg += 'force you to re-download those data files ' - msg += '(currently downloaded files will not be overwritten).' - msg += f' To continue using {latest_downloaded}, run\n' - msg += f"{self.ui}.load_manifest('{latest_downloaded}')" - warnings.warn(msg, OutdatedManifestWarning) - self.load_manifest(self.latest_manifest_file) - - @abstractmethod - def _download_manifest(self, - manifest_name: str): - """ - Download a manifest from the dataset - - Parameters - ---------- - manifest_name: str - The name of the manifest to load. Must be an element in - self.manifest_file_names - """ - raise NotImplementedError() - - @abstractmethod - def _download_file(self, file_attributes: CacheFileAttributes) -> bool: - """ - Check if a file exists locally. If it does not, download it and - return True. Return False otherwise. - - Parameters - ---------- - file_attributes: CacheFileAttributes - Describes the file to download - - Returns - ------- - bool - True if the file was downloaded; False otherwise - - Raises - ------ - RuntimeError - If the path to the directory where the file is to be saved - points to something that is not a directory. - - RuntimeError - If it is not able to successfully download the file after - 10 iterations - """ - raise NotImplementedError() - - def load_manifest(self, manifest_name: str): - """ - Load a manifest from this dataset. - - Parameters - ---------- - manifest_name: str - The name of the manifest to load. Must be an element in - self.manifest_file_names - """ - if manifest_name not in self.manifest_file_names: - raise ValueError( - f"Manifest to load ({manifest_name}) is not one of the " - "valid manifest names for this dataset. Valid names include:\n" - f"{self.manifest_file_names}" - ) - - if manifest_name != self.latest_manifest_file: - self._warn_of_outdated_manifest(manifest_name) - - # If desired manifest does not exist, try to download it - manifest_path = os.path.join(self._cache_dir, manifest_name) - if not os.path.exists(manifest_path): - self._download_manifest(manifest_name) - - self._manifest = self._load_manifest(manifest_name) - - # Keep track of the newly loaded manifest - with open(self._manifest_last_used, 'w') as out_file: - out_file.write(manifest_name) - - self._manifest_name = manifest_name - - def _update_list_of_downloads(self, - file_attributes: CacheFileAttributes - ) -> None: - """ - Update the local file that keeps track of files that have actually - been downloaded to reflect a newly downloaded file. - - Parameters - ---------- - file_attributes: CacheFileAttributes - - Returns - ------- - None - """ - if not file_attributes.local_path.exists(): - # This file does not exist; there is nothing to do - return None - - if self._downloaded_data_path.exists(): - with open(self._downloaded_data_path, 'rb') as in_file: - downloaded_data = json.load(in_file) - else: - downloaded_data = {} - - abs_path = str(file_attributes.local_path.resolve()) - if abs_path in downloaded_data: - if downloaded_data[abs_path] == file_attributes.file_hash: - # this file has already been logged; - # there is nothing to do - return None - - downloaded_data[abs_path] = file_attributes.file_hash - with open(self._downloaded_data_path, 'w') as out_file: - out_file.write(json.dumps(downloaded_data, - indent=2, - sort_keys=True)) - return None - - def _check_for_identical_copy(self, - file_attributes: CacheFileAttributes - ) -> bool: - """ - Check the manifest of files that have been locally downloaded to - see if a file with an identical hash to the requested file has already - been downloaded. If it has, create a symlink to the downloaded file - at the requested file's localpath, update the manifest of downloaded - files, and return True. - - Else return False - - Parameters - ---------- - file_attributes: CacheFileAttributes - The file we are considering downloading - - Returns - ------- - bool - """ - if not self._downloaded_data_path.exists(): - return False - - with open(self._downloaded_data_path, 'rb') as in_file: - available_files = json.load(in_file) - - matched_path = None - for abs_path in available_files: - if available_files[abs_path] == file_attributes.file_hash: - matched_path = pathlib.Path(abs_path) - - # check that the file still exists, - # in case someone accidentally deleted - # the file at the root of a symlink - if matched_path.is_file(): - break - else: - matched_path = None - - if matched_path is None: - return False - - local_parent = file_attributes.local_path.parent.resolve() - if not local_parent.exists(): - os.makedirs(local_parent) - - file_attributes.local_path.symlink_to(matched_path.resolve()) - return True - - def _file_exists(self, file_attributes: CacheFileAttributes) -> bool: - """ - Given a CacheFileAttributes describing a file, assess whether or - not that file exists locally and is valid (i.e. has the expected - file hash) - - Parameters - ---------- - file_attributes: CacheFileAttributes - Description of the file to look for - - Returns - ------- - bool - True if the file exists and is valid; False otherwise - - Raises - ----- - RuntimeError - If file_attributes.local_path exists but is not a file. - It would be unclear how the cache should proceed in this case. - """ - file_exists = False - - if file_attributes.local_path.exists(): - if not file_attributes.local_path.is_file(): - raise RuntimeError(f"{file_attributes.local_path}\n" - "exists, but is not a file;\n" - "unsure how to proceed") - - file_exists = True - - if not file_exists: - file_exists = self._check_for_identical_copy(file_attributes) - - return file_exists - - def download_data(self, file_id) -> pathlib.Path: - """ - Return the local path to a data file, downloading the file - if necessary - - Parameters - ---------- - file_id: - The unique identifier of the file to be accessed - - Returns - ------- - pathlib.Path - The path indicating where the file is stored on the - local system - - Raises - ------ - RuntimeError - If the file cannot be downloaded - """ - super_attributes = self.data_path(file_id) - file_attributes = super_attributes['file_attributes'] - was_downloaded = self._download_file(file_attributes) - if was_downloaded: - self._update_list_of_downloads(file_attributes) - return file_attributes.local_path - - def download_metadata(self, fname: str) -> pathlib.Path: - """ - Return the local path to a metadata file, downloading the - file if necessary - - Parameters - ---------- - fname: str - The name of the metadata file to be accessed - - Returns - ------- - pathlib.Path - The path indicating where the file is stored on the - local system - - Raises - ------ - RuntimeError - If the file cannot be downloaded - """ - super_attributes = self.metadata_path(fname) - file_attributes = super_attributes['file_attributes'] - was_downloaded = self._download_file(file_attributes) - if was_downloaded: - self._update_list_of_downloads(file_attributes) - return file_attributes.local_path - - def get_metadata(self, fname: str) -> pd.DataFrame: - """ - Return a pandas DataFrame of metadata - - Parameters - ---------- - fname: str - The name of the metadata file to load - - Returns - ------- - pd.DataFrame - - Notes - ----- - This method will check to see if the specified metadata file exists - locally. If it does not, the method will download the file. Use - self.metadata_path() to find where the file is stored - """ - local_path = self.download_metadata(fname) - return pd.read_csv(local_path) - - def _detect_changes(self, - filename_to_hash: dict) -> List[Tuple[str, str]]: - """ - Assemble list of changes between two manifests - - Parameters - ---------- - filename_to_hash: dict - filename_to_hash[0] is a dict mapping file names to file hashes - for manifest 0 - - filename_to_hash[1] is a dict mapping file names to file hashes - for manifest 1 - - Returns - ------- - List[Tuple[str, str]] - List of changes between manifest 0 and manifest 1. - - Notes - ----- - Changes are tuples of the form - (fname, string describing how fname changed) - - e.g. - - ('data/f1.txt', 'data/f1.txt renamed data/f5.txt') - ('data/f2.txt', 'data/f2.txt deleted') - ('data/f3.txt', 'data/f3.txt created') - ('data/f4.txt', 'data/f4.txt changed') - """ - output = [] - n0 = set(filename_to_hash[0].keys()) - n1 = set(filename_to_hash[1].keys()) - all_file_names = n0.union(n1) - - hash_to_filename: dict = dict() - for v in (0, 1): - hash_to_filename[v] = {} - for fname in filename_to_hash[v]: - hash_to_filename[v][filename_to_hash[v][fname]] = fname - - for fname in all_file_names: - delta = None - if fname in filename_to_hash[0] and fname in filename_to_hash[1]: - h0 = filename_to_hash[0][fname] - h1 = filename_to_hash[1][fname] - if h0 != h1: - delta = f'{fname} changed' - elif fname in filename_to_hash[0]: - h0 = filename_to_hash[0][fname] - if h0 in hash_to_filename[1]: - f1 = hash_to_filename[1][h0] - delta = f'{fname} renamed {f1}' - else: - delta = f'{fname} deleted' - elif fname in filename_to_hash[1]: - h1 = filename_to_hash[1][fname] - if h1 not in hash_to_filename[0]: - delta = f'{fname} created' - else: - raise RuntimeError("should never reach this line") - - if delta is not None: - output.append((fname, delta)) - - return output - - def summarize_comparison(self, - manifest_0_name: str, - manifest_1_name: str - ) -> Dict[str, List[Tuple[str, str]]]: - """ - Compare two manifests from this dataset. Return a dict - containing the list of metadata and data files that changed - between them - - Note: this assumes that manifest_0 predates manifest_1 (i.e. - changes are listed relative to manifest_0) - - Parameters - ---------- - manifest_0_name: str - - manifest_1_name: str - - Returns - ------- - result: Dict[List[Tuple[str, str]]] - result['data_changes'] lists changes to data files - result['metadata_changes'] lists changes to metadata files - - Notes - ----- - Changes are tuples of the form - (fname, string describing how fname changed) - - e.g. - - ('data/f1.txt', 'data/f1.txt renamed data/f5.txt') - ('data/f2.txt', 'data/f2.txt deleted') - ('data/f3.txt', 'data/f3.txt created') - ('data/f4.txt', 'data/f4.txt changed') - """ - for manifest_name in [manifest_0_name, manifest_1_name]: - manifest_path = os.path.join(self._cache_dir, manifest_name) - if not os.path.exists(manifest_path): - self._download_manifest(manifest_name) - - man0 = self._load_manifest(manifest_0_name) - man1 = self._load_manifest(manifest_1_name) - - result: dict = dict() - for (result_key, - file_id_list, - attr_lookup) in zip(('metadata_changes', 'data_changes'), - ((man0.metadata_file_names, - man1.metadata_file_names), - (man0.file_id_values, - man1.file_id_values)), - ((man0.metadata_file_attributes, - man1.metadata_file_attributes), - (man0.data_file_attributes, - man1.data_file_attributes))): - - filename_to_hash: dict = dict() - for version in (0, 1): - filename_to_hash[version] = {} - for file_id in file_id_list[version]: - obj = attr_lookup[version](file_id) - file_name = relative_path_from_url(obj.url) - file_name = '/'.join(file_name.split('/')[1:]) - filename_to_hash[version][file_name] = obj.file_hash - changes = self._detect_changes(filename_to_hash) - result[result_key] = changes - return result - - def compare_manifests(self, - manifest_0_name: str, - manifest_1_name: str - ) -> str: - """ - Compare two manifests from this dataset. Return a dict - containing the list of metadata and data files that changed - between them - - Note: this assumes that manifest_0 predates manifest_1 - - Parameters - ---------- - manifest_0_name: str - - manifest_1_name: str - - Returns - ------- - str - A string summarizing all of the changes going from - manifest_0 to manifest_1 - """ - - changes = self.summarize_comparison(manifest_0_name, - manifest_1_name) - if len(changes['data_changes']) == 0: - if len(changes['metadata_changes']) == 0: - return "The two manifests are equivalent" - - data_change_dict = {} - for delta in changes['data_changes']: - data_change_dict[delta[0]] = delta[1] - metadata_change_dict = {} - for delta in changes['metadata_changes']: - metadata_change_dict[delta[0]] = delta[1] - - msg = 'Changes going from\n' - msg += f'{manifest_0_name}\n' - msg += 'to\n' - msg += f'{manifest_1_name}\n\n' - - m_keys = list(metadata_change_dict.keys()) - m_keys.sort() - for m in m_keys: - msg += f'{metadata_change_dict[m]}\n' - d_keys = list(data_change_dict.keys()) - d_keys.sort() - for d in d_keys: - msg += f'{data_change_dict[d]}\n' - return msg - - -class S3CloudCache(CloudCacheBase): - """ - A class to handle the downloading and accessing of data served from - an S3-based storage system - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - bucket_name: str - for example, if bucket URI is 's3://mybucket' this value should be - 'mybucket' - - project_name: str - the name of the project this cache is supposed to access. This will - be the root directory for all files stored in the bucket. - - ui_class_name: Optional[str] - Name of the class users are actually using to maniuplate this - functionality (used to populate helpful error messages) - """ - - def __init__(self, cache_dir, bucket_name, project_name, - ui_class_name=None): - self._manifest = None - self._bucket_name = bucket_name - - super().__init__(cache_dir=cache_dir, project_name=project_name, - ui_class_name=ui_class_name) - - _s3_client = None - - @property - def s3_client(self): - if self._s3_client is None: - s3_config = Config(signature_version=UNSIGNED) - self._s3_client = boto3.client('s3', - config=s3_config) - return self._s3_client - - def _list_all_manifests(self) -> list: - """ - Return a list of all of the file names of the manifests associated - with this dataset - """ - paginator = self.s3_client.get_paginator('list_objects_v2') - subset_iterator = paginator.paginate( - Bucket=self._bucket_name, - Prefix=self.manifest_prefix - ) - - output = [] - for subset in subset_iterator: - if 'Contents' in subset: - for obj in subset['Contents']: - output.append(pathlib.Path(obj['Key']).name) - - output.sort() - return output - - def _download_manifest(self, - manifest_name: str): - """ - Download a manifest from the dataset - - Parameters - ---------- - manifest_name: str - The name of the manifest to load. Must be an element in - self.manifest_file_names - """ - - manifest_key = self.manifest_prefix + manifest_name - response = self.s3_client.get_object(Bucket=self._bucket_name, - Key=manifest_key) - - filepath = os.path.join(self._cache_dir, manifest_name) - - with open(filepath, 'wb') as f: - for chunk in response['Body'].iter_chunks(): - f.write(chunk) - - def _download_file(self, file_attributes: CacheFileAttributes) -> bool: - """ - Check if a file exists locally. If it does not, download it - and return True. Return False otherwise. - - Parameters - ---------- - file_attributes: CacheFileAttributes - Describes the file to download - - Returns - ------- - bool - True if the file was downloaded; False otherwise - - Raises - ------ - RuntimeError - If the path to the directory where the file is to be saved - points to something that is not a directory. - - RuntimeError - If it is not able to successfully download the file after - 10 iterations - """ - was_downloaded = False - - local_path = file_attributes.local_path - - local_dir = pathlib.Path(safe_system_path(str(local_path.parents[0]))) - - # make sure Windows references to Allen Institute - # local networked file system get handled correctly - local_path = pathlib.Path(safe_system_path(str(local_path))) - - # using os here rather than pathlib because safe_system_path - # returns a str - os.makedirs(local_dir, exist_ok=True) - if not os.path.isdir(local_dir): - raise RuntimeError(f"{local_dir}\n" - "is not a directory") - - bucket_name = bucket_name_from_url(file_attributes.url) - obj_key = relative_path_from_url(file_attributes.url) - - n_iter = 0 - max_iter = 10 # maximum number of times to try download - - version_id = file_attributes.version_id - - pbar = None - if not self._file_exists(file_attributes): - response = self.s3_client.list_object_versions(Bucket=bucket_name, - Prefix=str(obj_key)) - object_info = [i for i in response["Versions"] - if i["VersionId"] == version_id][0] - pbar = tqdm.tqdm(desc=object_info["Key"].split("/")[-1], - total=object_info["Size"], - unit_scale=True, - unit_divisor=1000., - unit="MB") - - while not self._file_exists(file_attributes): - was_downloaded = True - response = self.s3_client.get_object(Bucket=bucket_name, - Key=str(obj_key), - VersionId=version_id) - - if 'Body' in response: - with open(local_path, 'wb') as out_file: - for chunk in response['Body'].iter_chunks(): - out_file.write(chunk) - pbar.update(len(chunk)) - - # Verify the hash of the downloaded file - full_path = file_attributes.local_path.resolve() - test_checksum = file_hash_from_path(full_path) - if test_checksum != file_attributes.file_hash: - file_attributes.local_path.exists() - file_attributes.local_path.unlink() - - n_iter += 1 - if n_iter > max_iter: - pbar.close() - raise RuntimeError("Could not download\n" - f"{file_attributes}\n" - "In {max_iter} iterations") - if pbar is not None: - pbar.close() - - return was_downloaded - - -class LocalCache(CloudCacheBase): - """A class to handle accessing of data that has already been downloaded - locally. Supports multiple manifest versions from a given dataset. - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - project_name: str - the name of the project this cache is supposed to access. This will - be the root directory for all files stored in the bucket. - - ui_class_name: Optional[str] - Name of the class users are actually using to maniuplate this - functionality (used to populate helpful error messages) - """ - def __init__(self, cache_dir, project_name, ui_class_name=None): - super().__init__(cache_dir=cache_dir, project_name=project_name, - ui_class_name=ui_class_name) - - def _list_all_manifests(self) -> list: - return self.list_all_downloaded_manifests() - - def _download_manifest(self, manifest_name: str): - raise NotImplementedError() - - def _download_file(self, file_attributes: CacheFileAttributes) -> bool: - raise NotImplementedError() - - -class StaticLocalCache(BasicLocalCache): - """A class to handle accessing data that has already been downloaded - locally and whose directory structure and/or contained files are not - expected to be changed in any way. Does NOT support multiple manifest - versions for a given dataset. - - Example intended use case: - Calling - VisualBehaviorOphysProjectCache.from_local_cache(use_static_cache=True) - where the cache directory is a mounted S3 public bucket. - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - project_name: str - the name of the project this cache is supposed to access. This will - be the root directory for all files stored in the bucket. - - ui_class_name: Optional[str] - Name of the class users are actually using to maniuplate this - functionality (used to populate helpful error messages) - """ - - def __init__(self, cache_dir, project_name, ui_class_name=None): - super().__init__(cache_dir=cache_dir, project_name=project_name, - ui_class_name=ui_class_name) - - def _list_all_manifests(self) -> list: - """ - Return a list of all of the file names of the manifests associated - with this dataset. For the StaticLocalCache only return only the - latest manifest. - """ - manifest_dir = os.path.join( - self._cache_dir, self.project_name, "manifests" - ) - if not os.path.exists(manifest_dir): - raise RuntimeError( - f"Expected the provided cache_dir ({self._cache_dir})" - "to have the following subfolders but it did not: " - f"{self.project_name}/manifests" - ) - - output = [x for x in os.listdir(manifest_dir) - if re.fullmatch(".*_manifest_v.*.json", x)] - - return [self._find_latest_file(output)] - - def list_all_downloaded_manifests(self) -> list: - """ - Return a list of all of the manifest files for this dataset. - For the StaticLocalCache, this will only be the latest manifest. - """ - return self._list_all_manifests() - - def load_last_manifest(self): - """For the StaticLocalCache always load the latest manifest.""" - self.load_manifest(self.latest_manifest_file) - - def load_manifest(self, manifest_name: str): - """ - Load a manifest from this dataset. - - Parameters - ---------- - manifest_name: str - The name of the manifest to load. Must be an element in - self.manifest_file_names - """ - self._manifest = self._load_manifest( - manifest_name, - use_static_project_dir=True - ) - self._manifest_name = manifest_name - - def compare_manifests(self, manifest_0_name: str, manifest_1_name: str): - raise RuntimeError( - "The ability to load many manifest versions and use the " - "`compare_manifests()` method is not available for the " - "StaticLocalCache class!" - ) diff --git a/allensdk/api/cloud_cache/file_attributes.py b/allensdk/api/cloud_cache/file_attributes.py deleted file mode 100644 index 682ceb457d..0000000000 --- a/allensdk/api/cloud_cache/file_attributes.py +++ /dev/null @@ -1,69 +0,0 @@ -import json -import pathlib - - -class CacheFileAttributes(object): - """ - This class will contain the attributes of a remotely stored file - so that they can easily and consistently be passed around between - the methods making up the remote file cache and manifest classes - - Parameters - ---------- - url: str - The full URL of the remote file - version_id: str - A string specifying the version of the file (probably calculated - by S3) - file_hash: str - The (hexadecimal) file hash of the file - local_path: pathlib.Path - The path to the location where the file's local copy should be stored - (probably computed by the Manifest class) - """ - - def __init__(self, - url: str, - version_id: str, - file_hash: str, - local_path: pathlib.Path): - - if not isinstance(url, str): - raise ValueError(f"url must be str; got {type(url)}") - if not isinstance(version_id, str): - raise ValueError(f"version_id must be str; got {type(version_id)}") - if not isinstance(file_hash, str): - raise ValueError(f"file_hash must be str; " - f"got {type(file_hash)}") - if not isinstance(local_path, pathlib.Path): - raise ValueError(f"local_path must be pathlib.Path; " - f"got {type(local_path)}") - - self._url = url - self._version_id = version_id - self._file_hash = file_hash - self._local_path = local_path - - @property - def url(self) -> str: - return self._url - - @property - def version_id(self) -> str: - return self._version_id - - @property - def file_hash(self) -> str: - return self._file_hash - - @property - def local_path(self) -> pathlib.Path: - return self._local_path - - def __str__(self): - output = {'url': self.url, - 'version_id': self.version_id, - 'file_hash': self.file_hash, - 'local_path': str(self.local_path)} - output = json.dumps(output, indent=2, sort_keys=True) - return f'CacheFileParameters{output}' diff --git a/allensdk/api/cloud_cache/manifest.py b/allensdk/api/cloud_cache/manifest.py deleted file mode 100644 index 6e3160d203..0000000000 --- a/allensdk/api/cloud_cache/manifest.py +++ /dev/null @@ -1,240 +0,0 @@ -from typing import Dict, List, Any -import json -import pathlib -from typing import Union -from allensdk.api.cloud_cache.utils import relative_path_from_url # noqa: E501 -from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 - - -class Manifest(object): - """ - A class for loading and manipulating the online manifest.json associated - with a dataset release - - Each Manifest instance should represent the data for 1 and only 1 - manifest.json file. - - Parameters - ---------- - cache_dir: str or pathlib.Path - The path to the directory where local copies of files will be stored - json_input: - A ''.read()''-supporting file-like object containing - a JSON document to be deserialized (i.e. same as the - first argument to json.load) - use_static_project_dir: bool - When determining what the local path of a remote resource - (data or metadata file) should be, the Manifest class will typically - create a versioned project subdirectory under the user provided - `cache_dir` (e.g. f"{cache_dir}/{project_name}-{manifest_version}") - to allow the possibility of multiple manifest (and data) versions to be - used. In certain cases, like when using a project's s3 bucket - directly as the cache_dir, the project directory name needs to be - static (e.g. f"{cache_dir}/{project_name}"). When set to True, - the Manifest class will use a static project directory to determine - local paths for remote resources. Defaults to False. - """ - - def __init__( - self, - cache_dir: Union[str, pathlib.Path], - json_input, - use_static_project_dir: bool = False - ): - if isinstance(cache_dir, str): - self._cache_dir = pathlib.Path(cache_dir).resolve() - elif isinstance(cache_dir, pathlib.Path): - self._cache_dir = cache_dir.resolve() - else: - raise ValueError("cache_dir must be either a str " - "or a pathlib.Path; " - f"got {type(cache_dir)}") - - self._use_static_project_dir = use_static_project_dir - - self._data: Dict[str, Any] = json.load(json_input) - if not isinstance(self._data, dict): - raise ValueError("Expected to deserialize manifest into a dict; " - f"instead got {type(self._data)}") - self._project_name: str = self._data["project_name"] - self._version: str = self._data['manifest_version'] - self._file_id_column: str = self._data['metadata_file_id_column_name'] - self._data_pipeline: str = self._data["data_pipeline"] - - self._metadata_file_names: List[str] = [ - file_name for file_name in self._data['metadata_files'] - ] - self._metadata_file_names.sort() - - self._file_id_values: List[Any] = [ii for ii in - self._data['data_files'].keys()] - self._file_id_values.sort() - - @property - def project_name(self): - """ - The name of the project whose data and metadata files this - manifest tracks. - """ - return self._project_name - - @property - def version(self): - """ - The version of the dataset currently loaded - """ - return self._version - - @property - def file_id_column(self): - """ - The column in the metadata files used to uniquely - identify data files - """ - return self._file_id_column - - @property - def metadata_file_names(self): - """ - List of metadata file names associated with this dataset - """ - return self._metadata_file_names - - @property - def file_id_values(self): - """ - List of valid file_id values - """ - return self._file_id_values - - def _create_file_attributes(self, - remote_path: str, - version_id: str, - file_hash: str) -> CacheFileAttributes: - """ - Create the cache_file_attributes describing a file. - This method does the work of assigning a local_path for a remote file. - - Parameters - ---------- - remote_path: str - The full URL to a file - version_id: str - The string specifying the version of the file - file_hash: str - The (hexadecimal) file hash of the file - - Returns - ------- - CacheFileAttributes - """ - - if self._use_static_project_dir: - # If we only want to support 1 version of the project on disk - # like when mounting the project S3 bucket as a file system - project_dir_name = f"{self._project_name}" - else: - # If we want to support multiple versions of the project on disk - # paths should be built like: - # {cache_dir} / {project_name}-{manifest_version} / relative_path - # Example: - # my_cache_dir/visual-behavior-ophys-1.0.0/behavior_sessions/etc... - project_dir_name = f"{self._project_name}-{self._version}" - - project_dir = self._cache_dir / project_dir_name - - # The convention of the data release tool is to have all - # relative_paths from remote start with the project name which - # we want to remove since we already specified a project_dir_name - relative_path = relative_path_from_url(remote_path) - shaved_rel_path = "/".join(relative_path.split("/")[1:]) - - local_path = project_dir / shaved_rel_path - - obj = CacheFileAttributes( - remote_path, - version_id, - file_hash, - local_path - ) - - return obj - - def metadata_file_attributes( - self, - metadata_file_name: str - ) -> CacheFileAttributes: - """ - Return the CacheFileAttributes associated with a metadata file - - Parameters - ---------- - metadata_file_name: str - Name of the metadata file. Must be in self.metadata_file_names - - Return - ------ - CacheFileAttributes - - Raises - ------ - RuntimeError - If you try to run this method when self._data is None (meaning - you haven't yet loaded a manifest.json) - - ValueError - If the metadata_file_name is not a valid option - """ - if self._data is None: - raise RuntimeError("You cannot retrieve " - "metadata_file_attributes;\n" - "you have not yet loaded a manifest.json file") - - if metadata_file_name not in self._metadata_file_names: - raise ValueError(f"{metadata_file_name}\n" - "is not in self.metadata_file_names:\n" - f"{self._metadata_file_names}") - - file_data = self._data['metadata_files'][metadata_file_name] - return self._create_file_attributes(file_data['url'], - file_data['version_id'], - file_data['file_hash']) - - def data_file_attributes(self, file_id) -> CacheFileAttributes: - """ - Return the CacheFileAttributes associated with a data file - - Parameters - ---------- - file_id: - The identifier of the data file whose attributes are to be - returned. Must be a key in self._data['data_files'] - - Return - ------ - CacheFileAttributes - - Raises - ------ - RuntimeError - If you try to run this method when self._data is None (meaning - you haven't yet loaded a manifest.json file) - - ValueError - If the file_id is not a valid option - """ - if self._data is None: - raise RuntimeError("You cannot retrieve data_file_attributes;\n" - "you have not yet loaded a manifest.json file") - - if file_id not in self._data['data_files']: - valid_keys = list(self._data['data_files'].keys()) - valid_keys.sort() - raise ValueError(f"file_id: {file_id}\n" - "Is not a data file listed in manifest:\n" - f"{valid_keys}") - - file_data = self._data['data_files'][file_id] - return self._create_file_attributes(file_data['url'], - file_data['version_id'], - file_data['file_hash']) diff --git a/allensdk/api/cloud_cache/utils.py b/allensdk/api/cloud_cache/utils.py deleted file mode 100644 index 473161c856..0000000000 --- a/allensdk/api/cloud_cache/utils.py +++ /dev/null @@ -1,89 +0,0 @@ -from typing import Optional, Union -from pathlib import Path -import warnings -import re -import urllib.parse as url_parse -import hashlib - - -def bucket_name_from_url(url: str) -> Optional[str]: - """ - Read in a URL and return the name of the AWS S3 bucket it points towards. - - Parameters - ---------- - URL: str - A generic URL, suitable for retrieving an S3 object via an - HTTP GET request. - - Returns - ------- - str - An AWS S3 bucket name. Note: if 's3.amazonaws.com' does not occur in - the URL, this method will return None and emit a warning. - - Note - ----- - URLs passed to this method should conform to the "new" scheme as described - here - https://aws.amazon.com/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/ - """ - s3_pattern = re.compile('\.s3[\.,a-z,0-9,\-]*\.amazonaws.com') # noqa: W605, E501 - url_params = url_parse.urlparse(url) - raw_location = url_params.netloc - s3_match = s3_pattern.search(raw_location) - - if s3_match is None: - warnings.warn(f"{s3_pattern} does not occur in url {url}") - return None - - s3_match = raw_location[s3_match.start():s3_match.end()] - return url_params.netloc.replace(s3_match, '') - - -def relative_path_from_url(url: str) -> str: - """ - Read in a url and return the relative path of the object - - Parameters - ---------- - url: str - The url of the object whose path you want - - Returns - ------- - str: - Relative path of the object - - Notes - ----- - This method returns a str rather than a pathlib.Path because - it is used to get the S3 object Key from a URL. If using - Pathlib.path on a Windows system, the '/' will get transformed - into '\', confusing S3. - """ - url_params = url_parse.urlparse(url) - return url_params.path[1:] - - -def file_hash_from_path(file_path: Union[str, Path]) -> str: - """ - Return the hexadecimal file hash for a file - - Parameters - ---------- - file_path: Union[str, Path] - path to a file - - Returns - ------- - str: - The file hash (Blake2b; hexadecimal) of the file - """ - hasher = hashlib.blake2b() - with open(file_path, 'rb') as in_file: - chunk = in_file.read(1000000) - while len(chunk) > 0: - hasher.update(chunk) - chunk = in_file.read(1000000) - return hasher.hexdigest() diff --git a/allensdk/api/queries/__init__.py b/allensdk/api/queries/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/api/queries/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/api/queries/annotated_section_data_sets_api.py b/allensdk/api/queries/annotated_section_data_sets_api.py deleted file mode 100644 index 72cefbf874..0000000000 --- a/allensdk/api/queries/annotated_section_data_sets_api.py +++ /dev/null @@ -1,234 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .rma_api import RmaApi -from allensdk.api.warehouse_cache.cache import cacheable - - -class AnnotatedSectionDataSetsApi(RmaApi): - '''See: - `Searching Annotated SectionDataSets <http://help.brain-map.org/display/api/Searching+Annotated+SectionDataSets>`_ - ''' - - def __init__(self, base_uri=None): - super(AnnotatedSectionDataSetsApi, self).__init__(base_uri) - - def get_annotated_section_data_sets(self, - structures, - intensity_values=None, - density_values=None, - pattern_values=None, - age_names=None): - '''For a list of target structures, find the SectionDataSet - that matches the parameters for intensity_values, density_values, pattern_values, and Age. - - Parameters - ---------- - structure_graph_id : dict of integers - what to retrieve - intensity_values : array of strings, optional - 'High','Low', 'Medium' (default) - density_values : array of strings, optional - 'High', 'Low' - pattern_values : array of strings, optional - 'Full' - age_names : array of strings, options - for example 'E11.5', '13.5' - - Returns - ------- - data : dict - The parsed JSON repsonse message. - - Notes - ----- - This method uses the non-RMA Annotated SectionDataSet endpoint. - ''' - params = ['structures=' + ','.join((str(s) for s in structures))] - - if intensity_values is not None and len(intensity_values) > 0: - params.append('intensity_values=' + - ','.join(("'%s'" % (v) for v in intensity_values))) - - if density_values is not None and len(density_values) > 0: - params.append('density_values=' + - ','.join(("'%s'" % (v) for v in density_values))) - - if pattern_values is not None and len(pattern_values) > 0: - params.append('pattern_values=' + - ','.join(("'%s'" % (v) for v in pattern_values))) - - if age_names is not None and len(age_names) > 0: - params.append('age_names=' + - ','.join(("'%s'" % (v) for v in age_names))) - - url_params = '?' + '&'.join(params) - - url = ''.join([self.annotated_section_data_sets_endpoint, - '.json', - url_params]) - - return self.json_msg_query(url) - - @cacheable() - def get_annotated_section_data_sets_via_rma(self, - structures, - intensity_values=None, - density_values=None, - pattern_values=None, - age_names=None): - '''For a list of target structures, find the SectionDataSet - that matches the parameters for intensity_values, density_values, pattern_values, and Age. - - Parameters - ---------- - structure_graph_id : dict of integers - what to retrieve - intensity_values : array of strings, optional - intensity values, 'High','Low', 'Medium' (default) - density_values : array of strings, optional - density values, 'High', 'Low' - pattern_values : array of strings, optional - pattern values, 'Full' - age_names : array of strings, options - for example 'E11.5', '13.5' - - Returns - ------- - data : dict - The parsed JSON response message. - - Notes - ----- - This method uses the RMA endpoint to search annotated SectionDataSet data. - ''' - age_include_strings = ['age'] - - if age_names is not None and len(age_names) > 0: - age_include_strings.append('[name$in') - age_include_strings.append( - ','.join(("'%s'" % (a) for a in age_names))) - age_include_strings.append(']') - age_include = ''.join(age_include_strings) - - criteria_strings = ['manual_annotations'] - - if intensity_values is not None and len(intensity_values) > 0: - criteria_strings.append('[intensity_call$in%s]' % - (','.join(("'%s'" % (v) for v in intensity_values)))) - - if density_values is not None and len(density_values) > 0: - criteria_strings.append('[density_call$in%s]' % - (','.join(("'%s'" % (v) for v in density_values)))) - - if pattern_values is not None and len(pattern_values) > 0: - criteria_strings.append('[pattern_call$in%s]' % - (','.join(("'%s'" % (v) for v in pattern_values)))) - - criteria_strings.append('(structure[id$in%s])' % - (','.join((str(s) for s in structures)))) - - criteria_clause = ''.join(criteria_strings) - - include_clause = ''.join(['specimen', - '(donor(', - age_include, - ')),', - 'probes(gene),' - 'plane_of_section']) - - order_by_array = ['genes.acronym', - 'ages.embryonic+desc', - 'ages.days', - 'data_sets.id'] - - data = self.model_query('SectionDataSet', - criteria=criteria_clause, - include=include_clause, - start_row=0, - num_rows=50, - order=order_by_array) - - return data - - def get_compound_annotated_section_data_sets(self, - queries, - fmt='json'): - '''Find the SectionDataSet that matches several annotated_section_data_sets queries - linked together with a Boolean 'and' or 'or'. - - Parameters - ---------- - queries : array of dicts - dicts with args like build_query - fmt : string, optional - 'json' or 'xml' - - Returns - ------- - data : dict - The parsed JSON repsonse message. - ''' - url_strings = ['?query='] - - for query in queries: - url_strings.append('[') - - params = ['structures $in ' + - ','.join((str(s) for s in query['structures']))] - - for key in ['intensity_values', 'density_values', 'pattern_values', 'age_names']: - if key in query and len(query[key]) > 0: - params.append('%s $in %s' % - (key, - ','.join(("'%s'" % (v) for v in query['intensity_values'])))) - - url_strings.append(' : '.join(params)) - - url_strings.append(']') - - if 'link' in query and query['link'] == 'or': - url_strings.append(' or ') - if 'link' in query and query['link'] == 'and': - url_strings.append(' and ') - - url_params = ''.join(url_strings) - - url = ''.join([self.compound_annotated_section_data_sets_endpoint, - '.', - fmt, - url_params]) - - return self.json_msg_query(url) diff --git a/allensdk/api/queries/biophysical_api.py b/allensdk/api/queries/biophysical_api.py deleted file mode 100644 index 70fd7a4fb9..0000000000 --- a/allensdk/api/queries/biophysical_api.py +++ /dev/null @@ -1,390 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.api.queries.rma_template import RmaTemplate -from allensdk.api.warehouse_cache.cache import cacheable -import os -import simplejson as json -from collections import OrderedDict -from allensdk.config.manifest import Manifest - - -class BiophysicalApi(RmaTemplate): - _NWB_file_type = 'NWBDownload' - _SWC_file_type = '3DNeuronReconstruction' - _MOD_file_type = 'BiophysicalModelDescription' - _FIT_file_type = 'NeuronalModelParameters' - _MARKER_file_type = '3DNeuronMarker' - BIOPHYSICAL_MODEL_TYPE_IDS = (491455321, 329230710,) - - rma_templates = \ - {"model_queries": [ - {'name': 'models_by_specimen', - 'description': 'see name', - 'model': 'NeuronalModel', - 'num_rows': 'all', - 'count': False, - 'criteria': '[neuronal_model_template_id$in{{biophysical_model_types}}],[specimen_id$in{{specimen_ids}}]', - 'criteria_params': ['specimen_ids', 'biophysical_model_types'] - }]} - - - def __init__(self, base_uri=None): - super(BiophysicalApi, self).__init__(base_uri, query_manifest=BiophysicalApi.rma_templates) - self.cache_stimulus = True - self.ids = {} - self.sweeps = [] - self.manifest = {} - self.model_type = None - - - @cacheable() - def get_neuronal_models(self, specimen_ids, num_rows='all', count=False, model_type_ids=None, **kwargs): - '''Fetch all of the biophysically detailed model records associated with - a particular specimen_id - - Parameters - ---------- - specimen_ids : list - One or more integer ids identifying specimen records. - num_rows : int, optional - how many records to retrieve. Default is 'all'. - count : bool, optional - If True, return a count of the lines found by the query. Default is False. - model_type_ids : list, optional - One or more integer ids identifying categories of neuronal model. Defaults - to all-active and perisomatic biophysical_models. - - Returns - ------- - List of dict - Each element is a biophysical model record, containing a unique integer - id, the id of the associated specimen, and the id of the model type to - which this model belongs. - - ''' - - if model_type_ids is None: - model_type_ids = self.BIOPHYSICAL_MODEL_TYPE_IDS - - return self.template_query('model_queries', 'models_by_specimen', - specimen_ids=specimen_ids, - biophysical_model_types=list(model_type_ids), - num_rows=num_rows, count=count) - - - def build_rma(self, neuronal_model_id, fmt='json'): - '''Construct a query to find all files related to a neuronal model. - - Parameters - ---------- - neuronal_model_id : integer or string representation - key of experiment to retrieve. - fmt : string, optional - json (default) or xml - - Returns - ------- - string - RMA query url. - ''' - include_associations = ''.join([ - 'neuronal_model_template(well_known_files(well_known_file_type)),', - 'specimen(ephys_result(well_known_files(well_known_file_type)),', - 'neuron_reconstructions(well_known_files(well_known_file_type)),', - 'ephys_sweeps),', - 'well_known_files(well_known_file_type)']) - criteria_associations = ''.join([ - ("[id$eq%d]," % (neuronal_model_id)), - include_associations]) - - return ''.join([self.rma_endpoint, - '/query.', - fmt, - '?q=', - 'model::NeuronalModel,', - 'rma::criteria,', - criteria_associations, - ',rma::include,', - include_associations]) - - def read_json(self, json_parsed_data): - '''Get the list of well_known_file ids from a response body - containing nested sample,microarray_slides,well_known_files. - - Parameters - ---------- - json_parsed_data : dict - Response from the Allen Institute Api RMA. - - Returns - ------- - list of strings - Well known file ids. - ''' - self.ids = { - 'stimulus': {}, - 'morphology': {}, - 'marker': {}, - 'modfiles': {}, - 'fit': {} - } - self.sweeps = [] - - if 'msg' in json_parsed_data: - for neuronal_model in json_parsed_data['msg']: - if 'well_known_files' in neuronal_model: - for well_known_file in neuronal_model['well_known_files']: - if ('id' in well_known_file and - 'path' in well_known_file and - self.is_well_known_file_type(well_known_file, - BiophysicalApi._FIT_file_type)): - self.ids['fit'][str(well_known_file['id'])] = \ - os.path.split(well_known_file['path'])[1] - - if 'neuronal_model_template' in neuronal_model: - neuronal_model_template = neuronal_model[ - 'neuronal_model_template'] - self.model_type = neuronal_model_template['name'] - if 'well_known_files' in neuronal_model_template: - for well_known_file in neuronal_model_template['well_known_files']: - if ('id' in well_known_file and - 'path' in well_known_file and - self.is_well_known_file_type(well_known_file, - BiophysicalApi._MOD_file_type)): - self.ids['modfiles'][str(well_known_file['id'])] = \ - os.path.join('modfiles', - os.path.split(well_known_file['path'])[1]) - - if 'specimen' in neuronal_model: - specimen = neuronal_model['specimen'] - - if 'neuron_reconstructions' in specimen: - for neuron_reconstruction in specimen['neuron_reconstructions']: - if 'well_known_files' in neuron_reconstruction: - for well_known_file in neuron_reconstruction['well_known_files']: - if ('id' in well_known_file and 'path' in well_known_file): - if self.is_well_known_file_type(well_known_file, BiophysicalApi._SWC_file_type): - self.ids['morphology'][str(well_known_file['id'])] = \ - os.path.split( - well_known_file['path'])[1] - elif self.is_well_known_file_type(well_known_file, BiophysicalApi._MARKER_file_type): - self.ids['marker'][str(well_known_file['id'])] = \ - os.path.split( - well_known_file['path'])[1] - - if 'ephys_result' in specimen: - ephys_result = specimen['ephys_result'] - if 'well_known_files' in ephys_result: - for well_known_file in ephys_result['well_known_files']: - if ('id' in well_known_file and - 'path' in well_known_file and - self.is_well_known_file_type(well_known_file, BiophysicalApi._NWB_file_type)): - self.ids['stimulus'][str(well_known_file['id'])] = \ - "%d.nwb" % (ephys_result['id']) - - self.sweeps = [sweep['sweep_number'] - for sweep in specimen['ephys_sweeps'] - if sweep['stimulus_name'] != 'Test'] - - return self.ids - - def is_well_known_file_type(self, wkf, name): - '''Check if a structure has the expected name. - - Parameters - ---------- - wkf : dict - A well-known-file structure with nested type information. - name : string - The expected type name - - See Also - -------- - read_json: where this helper function is used. - ''' - try: - return wkf['well_known_file_type']['name'] == name - except: - return False - - def get_well_known_file_ids(self, neuronal_model_id): - '''Query the current RMA endpoint with a neuronal_model id - to get the corresponding well known file ids. - - Returns - ------- - list - A list of well known file id strings. - ''' - rma_builder_fn = self.build_rma - json_traversal_fn = self.read_json - - return self.do_query(rma_builder_fn, json_traversal_fn, neuronal_model_id) - - def create_manifest(self, - fit_path='', - model_type='', - stimulus_filename='', - swc_morphology_path='', - marker_path='', - sweeps=[]): - '''Generate a json configuration file with parameters for a - a biophysical experiment. - - Parameters - ---------- - fit_path : string - filename of a json configuration file with cell parameters. - stimulus_filename : string - path to an NWB file with input currents. - swc_morphology_path : string - file in SWC format. - sweeps : array of integers - which sweeps in the stimulus file are to be used. - ''' - self.manifest = OrderedDict() - self.manifest['biophys'] = [{ - 'model_file': ['manifest.json', fit_path], - 'model_type': model_type - }] - self.manifest['runs'] = [{ - 'sweeps': sweeps - }] - self.manifest['neuron'] = [{ - 'hoc': ['stdgui.hoc', 'import3d.hoc'] - }] - self.manifest['manifest'] = [ - { - 'type': 'dir', - 'spec': '.', - 'key': 'BASEDIR' - }, - { - 'type': 'dir', - 'spec': 'work', - 'key': 'WORKDIR', - 'parent': 'BASEDIR' - }, - { - 'type': 'file', - 'spec': swc_morphology_path, - 'key': 'MORPHOLOGY' - }, - { - 'type': 'file', - 'spec': marker_path, - 'key': 'MARKER' - }, - { - 'type': 'dir', - 'spec': 'modfiles', - 'key': 'MODFILE_DIR' - }, - { - 'type': 'file', - 'format': 'NWB', - 'spec': stimulus_filename, - 'key': 'stimulus_path' - }, - { - 'parent_key': 'WORKDIR', - 'type': 'file', - 'format': 'NWB', - 'spec': stimulus_filename, - 'key': 'output_path' - } - ] - - def cache_data(self, - neuronal_model_id, - working_directory=None): - '''Take a an experiment id, query the Api RMA to get well-known-files - download the files, and store them in the working directory. - - Parameters - ---------- - neuronal_model_id : int or string representation - found in the neuronal_model table in the api - working_directory : string - Absolute path name where the downloaded well-known files will be stored. - ''' - if working_directory is None: - working_directory = self.default_working_directory - - well_known_file_id_dict = self.get_well_known_file_ids( - neuronal_model_id) - - if not well_known_file_id_dict or \ - (not any(list(well_known_file_id_dict.values()))): - raise(Exception("No data found for neuronal model id %d" % - (neuronal_model_id))) - - Manifest.safe_mkdir(working_directory) - - work_dir = os.path.join(working_directory, 'work') - Manifest.safe_mkdir(work_dir) - - modfile_dir = os.path.join(working_directory, 'modfiles') - Manifest.safe_mkdir(modfile_dir) - - for key, id_dict in well_known_file_id_dict.items(): - if (not self.cache_stimulus) and (key == 'stimulus'): - continue - - for well_known_id, filename in id_dict.items(): - well_known_file_url = self.construct_well_known_file_download_url( - well_known_id) - cached_file_path = os.path.join(working_directory, filename) - self.retrieve_file_over_http( - well_known_file_url, cached_file_path) - - fit_path = list(self.ids['fit'].values())[0] - stimulus_filename = list(self.ids['stimulus'].values())[0] - swc_morphology_path = list(self.ids['morphology'].values())[0] - marker_path = \ - list(self.ids['marker'].values())[0] if 'marker' in self.ids else '' - sweeps = sorted(self.sweeps) - - self.create_manifest(fit_path, - self.model_type, - stimulus_filename, - swc_morphology_path, - marker_path, - sweeps) - - manifest_path = os.path.join(working_directory, 'manifest.json') - with open(manifest_path, 'w') as f: - json.dump(self.manifest, f, indent=2) diff --git a/allensdk/api/queries/brain_observatory_api.py b/allensdk/api/queries/brain_observatory_api.py deleted file mode 100644 index e6ce48bc31..0000000000 --- a/allensdk/api/queries/brain_observatory_api.py +++ /dev/null @@ -1,780 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import logging - -import pandas as pd -from six import string_types - -from allensdk.config.manifest import Manifest -import allensdk.brain_observatory.stimulus_info as stimulus_info - -from .rma_template import RmaTemplate -from allensdk.api.warehouse_cache.cache import cacheable, Cache -from .rma_pager import pageable - -from dateutil.parser import parse as parse_date - -class BrainObservatoryApi(RmaTemplate): - _log = logging.getLogger('allensdk.api.queries.brain_observatory_api') - - NWB_FILE_TYPE = 'NWBOphys' - OPHYS_ANALYSIS_FILE_TYPE = 'OphysExperimentCellRoiMetricsFile' - OPHYS_EVENTS_FILE_TYPE = 'ObservatoryEventsFile' - CELL_MAPPING_ID = 590985414 - - rma_templates = \ - {"brain_observatory_queries": [ - {'name': 'list_isi_experiments', - 'description': 'see name', - 'model': 'IsiExperiment', - 'num_rows': 'all', - 'count': False, - 'criteria_params': [] - }, - {'name': 'isi_experiment_by_ids', - 'description': 'see name', - 'model': 'IsiExperiment', - 'criteria': '[id$in{{ isi_experiment_ids }}]', - 'include': 'experiment_container(ophys_experiments,targeted_structure)', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['isi_experiment_ids'] - }, - {'name': 'ophys_experiment_by_ids', - 'description': 'see name', - 'model': 'OphysExperiment', - 'criteria': '{% if ophys_experiment_ids is defined %}[id$in{{ ophys_experiment_ids }}]{%endif%}', - 'include': 'experiment_container,well_known_files(well_known_file_type),targeted_structure,specimen(donor(age,transgenic_lines))', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['ophys_experiment_ids'] - }, - {'name': 'ophys_experiment_data', - 'description': 'see name', - 'model': 'WellKnownFile', - 'criteria': '[attachable_id$eq{{ ophys_experiment_id }}],well_known_file_type[name$eq%s]' % NWB_FILE_TYPE, - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['ophys_experiment_id'] - }, - {'name': 'ophys_analysis_file', - 'description': 'see name', - 'model': 'WellKnownFile', - 'criteria': '[attachable_id$eq{{ ophys_experiment_id }}],well_known_file_type[name$eq%s]' % OPHYS_ANALYSIS_FILE_TYPE, - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['ophys_experiment_id'] - }, - {'name': 'ophys_events_file', - 'description': 'see name', - 'model': 'WellKnownFile', - 'criteria': '[attachable_id$eq{{ ophys_experiment_id }}],well_known_file_type[name$eq%s]' % OPHYS_EVENTS_FILE_TYPE, - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['ophys_experiment_id'] - }, - {'name': 'column_definitions', - 'description': 'see name', - 'model': 'ApiColumnDefinition', - 'criteria': '[api_class_name$eq{{ api_class_name }}]', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['api_class_name'] - }, - {'name': 'column_definition_class_names', - 'description': 'see name', - 'model': 'ApiColumnDefinition', - 'only': ['api_class_name'], - 'num_rows': 'all', - 'count': False, - }, - {'name': 'stimulus_mapping', - 'description': 'see name', - 'model': 'ApiCamStimulusMapping', - 'criteria': '{% if stimulus_mapping_ids is defined %}[id$in{{ stimulus_mapping_ids }}]{%endif%}', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['stimulus_mapping_ids'] - }, - {'name': 'experiment_container', - 'description': 'see name', - 'model': 'ExperimentContainer', - 'criteria': '{% if experiment_container_ids is defined %}[id$in{{ experiment_container_ids }}]{%endif%}', - 'include': 'ophys_experiments,isi_experiment,specimen(donor(conditions,age,transgenic_lines)),targeted_structure', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['experiment_container_ids'] - }, - {'name': 'experiment_container_metric', - 'description': 'see name', - 'model': 'ApiCamExperimentContainerMetric', - 'criteria': '{% if experiment_container_metric_ids is defined %}[id$in{{ experiment_container_metric_ids }}]{%endif%}', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['experiment_container_metric_ids'] - }, - {'name': 'cell_metric', - 'description': 'see name', - 'model': 'ApiCamCellMetric', - 'criteria': '{% if cell_specimen_ids is defined %}[cell_specimen_id$in{{ cell_specimen_ids }}]{%endif%}', - 'criteria_params': ['cell_specimen_ids'] - }, - {'name': 'cell_specimen_id_mapping_table', - 'description': 'see name', - 'model': 'WellKnownFile', - 'criteria': '[id$eq{{ mapping_table_id }}],well_known_file_type[name$eqOphysCellSpecimenIdMapping]', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['mapping_table_id'] - }, - {'name': 'eye_gaze_mapping_file', - 'description': 'h5 file containing mouse eye gaze mapped onto screen coordinates (as well as pupil and eye sizes)', - 'model': 'WellKnownFile', - 'criteria': '[attachable_id$eq{{ ophys_session_id }}],well_known_file_type[name$eqEyeDlcScreenMapping]', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['ophys_session_id'] - }, - # NOTE: 'all_eye_mapping_files' query is for facilitating an ugly - # hack to get around lack of relationship between experiment id - # and session id in current warehouse. This should be removed when - # the relationship is added. - {'name': 'all_eye_mapping_files', - 'description': 'Get a list of dictionaries for all eye mapping wkfs', - 'model': 'WellKnownFile', - 'criteria': 'well_known_file_type[name$eqEyeDlcScreenMapping]', - 'num_rows': 'all', - 'count': False - } - ]} - - _QUERY_TEMPLATES = { - "=": '({0} == {1})', - "<": '({0} < {1})', - ">": '({0} > {1})', - "<=": '({0} <= {1})', - ">=": '({0} >= {1})', - "between": '({0} >= {1}) and ({0} <= {2})', - "in": '({0} == {1})', - "is": '({0} == {1})' - } - - def __init__(self, base_uri=None, datacube_uri=None): - super(BrainObservatoryApi, self).__init__(base_uri, - query_manifest=BrainObservatoryApi.rma_templates) - - self.datacube_uri = datacube_uri - - @cacheable() - def get_ophys_experiments(self, ophys_experiment_ids=None): - ''' Get OPhys Experiments by id - - Parameters - ---------- - ophys_experiment_ids : integer or list of integers, optional - only select specific experiments. - - Returns - ------- - dict : ophys experiment metadata - ''' - data = self.template_query('brain_observatory_queries', - 'ophys_experiment_by_ids', - ophys_experiment_ids=ophys_experiment_ids) - - return data - - def get_isi_experiments(self, isi_experiment_ids=None): - ''' Get ISI Experiments by id - - Parameters - ---------- - isi_experiment_ids : integer or list of integers, optional - only select specific experiments. - - Returns - ------- - dict : isi experiment metadata - ''' - data = self.template_query('brain_observatory_queries', - 'isi_experiment_by_ids', - isi_experiment_ids=isi_experiment_ids) - - return data - - def list_isi_experiments(self, isi_ids=None): - '''List ISI experiments available through the Allen Institute API - - Parameters - ---------- - neuronal_model_ids : integer or list of integers, optional - only select specific isi experiments. - - Returns - ------- - dict : neuronal model metadata - ''' - data = self.template_query('brain_observatory_queries', - 'list_isi_experiments') - - return data - - def list_column_definition_class_names(self): - ''' Get column definitions - - Parameters - ---------- - - Returns - ------- - list : api class name strings - ''' - data = self.template_query('brain_observatory_queries', - 'column_definition_class_names') - - names = list(set([n['api_class_name'] for n in data])) - - return names - - def get_column_definitions(self, api_class_name=None): - ''' Get column definitions - - Parameters - ---------- - api_class_names : string or list of strings, optional - only select specific column definition records. - - Returns - ------- - dict : column definition metadata - ''' - data = self.template_query('brain_observatory_queries', - 'column_definitions', - api_class_name=api_class_name) - - return data - - @cacheable() - def get_stimulus_mappings(self, stimulus_mapping_ids=None): - ''' Get stimulus mappings by id - - Parameters - ---------- - stimulus_mapping_ids : integer or list of integers, optional - only select specific stimulus mapping records. - - Returns - ------- - dict : stimulus mapping metadata - ''' - data = self.template_query('brain_observatory_queries', - 'stimulus_mapping', - stimulus_mapping_ids=stimulus_mapping_ids) - - return data - - @cacheable() - @pageable(num_rows=2000, total_rows='all') - def get_cell_metrics(self, cell_specimen_ids=None, *args, **kwargs): - ''' Get cell metrics by id - - Parameters - ---------- - cell_metrics_ids : integer or list of integers, optional - only select specific cell metric records. - - Returns - ------- - dict : cell metric metadata - ''' - - order = kwargs.pop('order', ['\'cell_specimen_id\'']) - - data = self.template_query('brain_observatory_queries', - 'cell_metric', - cell_specimen_ids=cell_specimen_ids, - order=order, - *args, - **kwargs) - - return data - - @cacheable() - def get_experiment_containers(self, experiment_container_ids=None): - ''' Get experiment container by id - - Parameters - ---------- - experiment_container_ids : integer or list of integers, optional - only select specific experiment containers. - - Returns - ------- - dict : experiment container metadata - ''' - data = self.template_query('brain_observatory_queries', - 'experiment_container', - experiment_container_ids=experiment_container_ids) - - return data - - def get_experiment_container_metrics(self, experiment_container_metric_ids=None): - ''' Get experiment container metrics by id - - Parameters - ---------- - isi_experiment_ids : integer or list of integers, optional - only select specific experiments. - - Returns - ------- - dict : isi experiment metadata - ''' - data = self.template_query('brain_observatory_queries', - 'experiment_container_metric', - experiment_container_metric_ids=experiment_container_metric_ids) - - return data - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=2, - path_keyword='file_name')) - def save_ophys_experiment_data(self, ophys_experiment_id, file_name): - data = self.template_query('brain_observatory_queries', - 'ophys_experiment_data', - ophys_experiment_id=ophys_experiment_id) - - try: - file_url = data[0]['download_link'] - except Exception as _: - raise Exception("ophys experiment %d has no data file" % - ophys_experiment_id) - - self._log.warning( - "Downloading ophys_experiment %d NWB. This can take some time." % ophys_experiment_id) - - self.retrieve_file_over_http(self.api_url + file_url, file_name) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=2, - path_keyword='file_name')) - def save_ophys_experiment_analysis_data(self, ophys_experiment_id, file_name): - - data = self.template_query('brain_observatory_queries', - 'ophys_analysis_file', - ophys_experiment_id=ophys_experiment_id) - - try: - file_url = data[0]['download_link'] - except Exception as _: - raise Exception("ophys experiment %d has no %s analysis file" % - (ophys_experiment_id, )) - - self._log.warning( - "Downloading ophys_experiment %d analysis file. This can take some time." % (ophys_experiment_id, )) - - self.retrieve_file_over_http(self.api_url + file_url, file_name) - - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=2, - path_keyword='file_name')) - def save_ophys_experiment_event_data(self, ophys_experiment_id, file_name): - data = self.template_query('brain_observatory_queries', - 'ophys_events_file', - ophys_experiment_id=ophys_experiment_id) - try: - file_url = data[0]['download_link'] - except Exception: - raise Exception("ophys experiment %d has no events file" % - ophys_experiment_id) - self._log.warning( - "Downloading ophys_experiment %d events file. This can take some time." % ophys_experiment_id) - - self.retrieve_file_over_http(self.api_url + file_url, file_name) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=3, - path_keyword='file_name')) - def save_ophys_experiment_eye_gaze_data(self, - ophys_experiment_id: int, - ophys_session_id: int, - file_name: str): - data = self.template_query('brain_observatory_queries', - 'eye_gaze_mapping_file', - ophys_session_id=ophys_session_id) - - experiment_session_string = f"ophys_experiment '{ophys_experiment_id}' (session '{ophys_session_id}')" - - try: - file_url = data[0]['download_link'] - except Exception: - raise Exception(f"{experiment_session_string} has no eye gaze mapping file") - self._log.warning( - f"Downloading {experiment_session_string} gaze mapping file. This can take some time." - ) - - self.retrieve_file_over_http(self.api_url + file_url, file_name) - - def filter_experiments_and_containers(self, objs, - ids=None, - targeted_structures=None, - imaging_depths=None, - cre_lines=None, - reporter_lines=None, - transgenic_lines=None, - include_failed=False): - - if not include_failed: - objs = [o for o in objs if not o.get('failed', False)] - - if ids is not None: - objs = [o for o in objs if o['id'] in ids] - - if targeted_structures is not None: - objs = [o for o in objs if o[ - 'targeted_structure']['acronym'] in targeted_structures] - - if imaging_depths is not None: - objs = [o for o in objs if o[ - 'imaging_depth'] in imaging_depths] - - if cre_lines is not None: - tls = [ tl.lower() for tl in cre_lines ] - obj_tls = [ find_specimen_cre_line(o['specimen']) for o in objs ] - obj_tls = [ o.lower() if o else None for o in obj_tls ] - objs = [o for i,o in enumerate(objs) if obj_tls[i] in tls] - - if reporter_lines is not None: - tls = [ tl.lower() for tl in reporter_lines ] - obj_tls = [ find_specimen_reporter_line(o['specimen']) for o in objs ] - obj_tls = [ o.lower() if o else None for o in obj_tls ] - objs = [o for i,o in enumerate(objs) if obj_tls[i] in tls] - - if transgenic_lines is not None: - tls = set([ tl.lower() for tl in transgenic_lines ]) - objs = [ o for o in objs - if len(tls & set([ tl.lower() - for tl in find_specimen_transgenic_lines(o['specimen']) ]) ) ] - - return objs - - def filter_experiment_containers(self, containers, - ids=None, - targeted_structures=None, - imaging_depths=None, - cre_lines=None, - reporter_lines=None, - transgenic_lines=None, - include_failed=False, - simple=False): - - containers = self.filter_experiments_and_containers(containers, - ids=ids, - targeted_structures=targeted_structures, - imaging_depths=imaging_depths, - cre_lines=cre_lines, - reporter_lines=reporter_lines, - transgenic_lines=transgenic_lines, - include_failed=include_failed) - - if simple: - containers = self.simplify_experiment_containers(containers) - - return containers - - def filter_ophys_experiments(self, experiments, - ids=None, - experiment_container_ids=None, - targeted_structures=None, - imaging_depths=None, - cre_lines=None, - reporter_lines=None, - transgenic_lines=None, - stimuli=None, - session_types=None, - include_failed=False, - require_eye_tracking=False, - simple=False): - - experiments = self.filter_experiments_and_containers(experiments, - ids=ids, - targeted_structures=targeted_structures, - imaging_depths=imaging_depths, - cre_lines=cre_lines, - reporter_lines=reporter_lines, - transgenic_lines=transgenic_lines) - - if require_eye_tracking: - experiments = [e for e in experiments - if e.get('fail_eye_tracking', None) is False] - if not include_failed: - experiments = [e for e in experiments - if not e.get('experiment_container',{}).get('failed', False)] - - if experiment_container_ids is not None: - experiments = [e for e in experiments if e[ - 'experiment_container_id'] in experiment_container_ids] - - if session_types is not None: - experiments = [e for e in experiments if e[ - 'stimulus_name'] in session_types] - - if stimuli is not None: - experiments = [e for e in experiments - if len(set(stimuli) & set(stimulus_info.stimuli_in_session(e['stimulus_name']))) > 0] - - if simple: - experiments = self.simplify_ophys_experiments(experiments) - - return experiments - - def filter_cell_specimens(self, cell_specimens, - ids=None, - experiment_container_ids=None, - include_failed=False, - filters=None): - """ - Filter a list of cell specimen records returned from the get_cell_metrics method according - some of their properties. - - Parameters - ---------- - cell_specimens: list of dicts - List of records returned by the get_cell_metrics method. - - ids: list of integers - Return only records for cells with cell specimen ids in this list - - experiment_container_ids: list of integers - Return only records for cells that belong to experiment container ids in this list - - include_failed: bool - Whether to include cells from failed experiment containers - - filters: list of dicts - Custom query used to reproduce filter sets created in the Allen Brain Observatory - web application. The general form is a list of dictionaries each of which - describes a filtering operation based on a metric. For more information, see - dataframe_query. - """ - - if not include_failed: - cell_specimens = [c for c in cell_specimens if not c.get( - 'failed_experiment_container', False)] - - if ids is not None: - cell_specimens = [c for c in cell_specimens if c[ - 'cell_specimen_id'] in ids] - - if experiment_container_ids is not None: - cell_specimens = [c for c in cell_specimens if c[ - 'experiment_container_id'] in experiment_container_ids] - - if filters is not None: - cell_specimens = self.dataframe_query(cell_specimens, - filters, - 'cell_specimen_id') - - return cell_specimens - - def dataframe_query_string(self, - filters): - """ - Convert a list of cell metric filter dictionaries into a - Pandas query string. - """ - - def _quote_string(v): - if isinstance(v, string_types): - return "'%s'" % (v) - else: - return str(v) - - def _filter_clause(op, field, value): - if op == 'in': - query_args = [field, str(value)] - elif type(value) is list: - query_args = [field] + list(map(_quote_string, value)) - else: - query_args = [field, str(value)] - - cluster_string = self._QUERY_TEMPLATES[op].\ - format(*query_args) - - return cluster_string - - query_string = ' & '.join(_filter_clause(f['op'], - f['field'], - f['value']) for f in filters) - - return query_string - - def dataframe_query(self, - data, - filters, - primary_key): - """ - Given a list of dictionary records and a list of filter dictionaries, - filter the records using Pandas and return the filtered set of records. - - Parameters - ---------- - data: list of dicts - List of dictionaries - - filters: list of dicts - Each dictionary describes a filtering operation on a field in the dictionary. - The general form is { 'field': <field>, 'op': <operation>, 'value': <filter_value(s)> }. - For example, you can apply a threshold on the "osi_dg" column with something like this: - { 'field': 'osi_dg', 'op': '>', 'value': 1.0 }. See _QUERY_TEMPLATES for a full list - of operators. - """ - - if len(filters) == 0: - return data - - queries = self.dataframe_query_string(filters) - result_dataframe = pd.DataFrame(data) - result_dataframe = result_dataframe.query(queries) - - result_keys = set(result_dataframe[primary_key]) - result = [d for d in data - if d[primary_key] - in result_keys] - - return result - - def get_cell_specimen_id_mapping(self, file_name, mapping_table_id=None): - '''Download mapping table from old to new cell specimen IDs. - - The mapping table is a CSV file that maps cell specimen ids - that have changed between processing runs of the Brain - Observatory pipeline. - - Parameters - ---------- - file_name : string - Filename to save locally. - mapping_table_id : integer - ID of the mapping table file. Defaults to the most recent - mapping table. - - Returns - ------- - pandas.DataFrame - Mapping table as a DataFrame. - ''' - if mapping_table_id is None: - mapping_table_id = self.CELL_MAPPING_ID - data = self.template_query('brain_observatory_queries', - 'cell_specimen_id_mapping_table', - mapping_table_id=mapping_table_id) - - try: - file_url = data[0]['download_link'] - except Exception as _: - raise Exception("No OphysCellSpecimenIdMapping file found.") - - self.retrieve_file_over_http(self.api_url + file_url, file_name) - - return pd.read_csv(file_name) - - def simplify_experiment_containers(self, containers): - return [{ - 'id': c['id'], - 'imaging_depth': c['imaging_depth'], - 'targeted_structure': c['targeted_structure']['acronym'], - 'cre_line': find_specimen_cre_line(c['specimen']), - 'reporter_line': find_specimen_reporter_line(c['specimen']), - 'donor_name': c['specimen']['donor']['external_donor_name'], - 'specimen_name': c['specimen']['name'], - 'tags': find_container_tags(c), - 'failed': c['failed'] - } for c in containers] - - - def simplify_ophys_experiments(self, exps): - return [{ - 'id': e['id'], - 'imaging_depth': e['imaging_depth'], - 'targeted_structure': e['targeted_structure']['acronym'], - 'cre_line': find_specimen_cre_line(e['specimen']), - 'reporter_line': find_specimen_reporter_line(e['specimen']), - 'acquisition_age_days': find_experiment_acquisition_age(e), - 'experiment_container_id': e['experiment_container_id'], - 'session_type': e['stimulus_name'], - 'donor_name': e['specimen']['donor']['external_donor_name'], - 'specimen_name': e['specimen']['name'], - 'fail_eye_tracking': e.get('fail_eye_tracking', None) - } for e in exps] - - - -def find_specimen_cre_line(specimen): - try: - return next(tl['name'] for tl in specimen['donor']['transgenic_lines'] - if tl['transgenic_line_type_name'] == 'driver' and - 'Cre' in tl['name']) - except StopIteration: - return None - - -def find_specimen_reporter_line(specimen): - try: - return next(tl['name'] for tl in specimen['donor']['transgenic_lines'] - if tl['transgenic_line_type_name'] == 'reporter') - except StopIteration: - return None - - -def find_specimen_transgenic_lines(specimen): - return [ tl['name'] for tl in specimen['donor']['transgenic_lines'] ] - - -def find_experiment_acquisition_age(exp): - try: - return (parse_date(exp['date_of_acquisition']) - parse_date(exp['specimen']['donor']['date_of_birth'])).days - except KeyError as e: - return None - - -def find_container_tags(container): - """ Custom logic for extracting tags from donor conditions. Filtering - out tissuecyte tags. """ - conditions = container['specimen']['donor'].get('conditions', []) - return [c['name'] for c in conditions if not c['name'].startswith('tissuecyte')] diff --git a/allensdk/api/queries/cell_types_api.py b/allensdk/api/queries/cell_types_api.py deleted file mode 100644 index de95627576..0000000000 --- a/allensdk/api/queries/cell_types_api.py +++ /dev/null @@ -1,400 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .rma_api import RmaApi -from allensdk.api.warehouse_cache.cache import cacheable -from allensdk.config.manifest import Manifest -from allensdk.api.warehouse_cache.cache import Cache -from allensdk.deprecated import deprecated - - -class CellTypesApi(RmaApi): - NWB_FILE_TYPE = 'NWBDownload' - SWC_FILE_TYPE = '3DNeuronReconstruction' - MARKER_FILE_TYPE = '3DNeuronMarker' - - MOUSE = 'Mus musculus' - HUMAN = 'Homo Sapiens' - - def __init__(self, base_uri=None): - super(CellTypesApi, self).__init__(base_uri) - - - @cacheable() - def list_cells_api(self, - id=None, - require_morphology=False, - require_reconstruction=False, - reporter_status=None, - species=None): - - - criteria = None - - if id: - criteria = "[specimen__id$eq%d]" % id - - cells = self.model_query( - 'ApiCellTypesSpecimenDetail', criteria=criteria, num_rows='all') - - return cells - - @deprecated("please use list_cells_api instead") - def list_cells(self, - id=None, - require_morphology=False, - require_reconstruction=False, - reporter_status=None, - species=None): - """ - Query the API for a list of all cells in the Cell Types Database. - - Parameters - ---------- - id: int - ID of a cell. If not provided returns all matching cells. - - require_morphology: boolean - Only return cells that have morphology images. - - require_reconstruction: boolean - Only return cells that have morphological reconstructions. - - reporter_status: list - Return cells that have a particular cell reporter status. - - species: list - Filter for cells that belong to one or more species. If None, return all. - Must be one of [ CellTypesApi.MOUSE, CellTypesApi.HUMAN ]. - - Returns - ------- - list - Meta data for all cells. - """ - - if id: - criteria = "[id$eq'%d']" % id - else: - criteria = "[is_cell_specimen$eq'true'],products[name$in'Mouse Cell Types','Human Cell Types'],ephys_result[failed$eqfalse]" - - include = ('structure,cortex_layer,donor(transgenic_lines,organism,conditions),specimen_tags,cell_soma_locations,' + - 'ephys_features,data_sets,neuron_reconstructions,cell_reporter') - - cells = self.model_query( - 'Specimen', criteria=criteria, include=include, num_rows='all') - - for cell in cells: - # specimen tags - for tag in cell['specimen_tags']: - tag_name, tag_value = tag['name'].split(' - ') - tag_name = tag_name.replace(' ', '_') - cell[tag_name] = tag_value - - # morphology and reconstuction - cell['has_reconstruction'] = len( - cell['neuron_reconstructions']) > 0 - cell['has_morphology'] = len(cell['data_sets']) > 0 - - # transgenic line - cell['transgenic_line'] = None - for tl in cell['donor']['transgenic_lines']: - if tl['transgenic_line_type_name'] == 'driver': - cell['transgenic_line'] = tl['name'] - - # cell reporter status - cell['reporter_status'] = cell.get('cell_reporter', {}).get('name', None) - - # species - cell['species'] = cell.get('donor',{}).get('organism',{}).get('name', None) - - # conditions (whitelist) - condition_types = [ 'disease categories' ] - condition_keys = dict(zip(condition_types, - [ ct.replace(' ', '_') for ct in condition_types ])) - for ct, ck in condition_keys.items(): - cell[ck] = [] - - conditions = cell.get('donor',{}).get('conditions', []) - for condition in conditions: - c_type, c_val = condition['name'].split(' - ') - if c_type in condition_keys: - cell[condition_keys[c_type]].append(c_val) - - result = self.filter_cells(cells, require_morphology, require_reconstruction, reporter_status, species) - - return result - - def get_cell(self, id): - ''' - Query the API for a one cells in the Cell Types Database. - - - Returns - ------- - list - Meta data for one cell. - ''' - - cells = self.list_cells_api(id=id) - cell = None if not cells else cells[0] - return cell - - @cacheable() - def get_ephys_sweeps(self, specimen_id): - """ - Query the API for a list of sweeps for a particular cell in the Cell Types Database. - - Parameters - ---------- - specimen_id: int - Specimen ID of a cell. - - Returns - ------- - list: List of sweep dictionaries belonging to a cell - """ - criteria = "[specimen_id$eq%d]" % specimen_id - sweeps = self.model_query( - 'EphysSweep', criteria=criteria, num_rows='all') - return sorted(sweeps, key=lambda x: x['sweep_number']) - - - @deprecated("please use filter_cells_api") - def filter_cells(self, cells, require_morphology, require_reconstruction, reporter_status, species): - """ - Filter a list of cell specimens to those that optionally have morphologies - or have morphological reconstructions. - - Parameters - ---------- - - cells: list - List of cell metadata dictionaries to be filtered - - require_morphology: boolean - Filter out cells that have no morphological images. - - require_reconstruction: boolean - Filter out cells that have no morphological reconstructions. - - reporter_status: list - Filter for cells that have a particular cell reporter status - - species: list - Filter for cells that belong to one or more species. If None, return all. - Must be one of [ CellTypesApi.MOUSE, CellTypesApi.HUMAN ]. - """ - - if require_morphology: - cells = [c for c in cells if c['has_morphology']] - - if require_reconstruction: - cells = [c for c in cells if c['has_reconstruction']] - - if reporter_status: - cells = [c for c in cells if c[ - 'reporter_status'] in reporter_status] - - if species: - species_lower = [ s.lower() for s in species ] - cells = [c for c in cells if c['donor']['organism']['name'].lower() in species_lower] - - return cells - - def filter_cells_api(self, cells, - require_morphology=False, - require_reconstruction=False, - reporter_status=None, - species=None, - simple=True): - """ - """ - if require_morphology or require_reconstruction: - cells = [c for c in cells if c.get('nr__reconstruction_type') is not None] - - if reporter_status: - cells = [c for c in cells if c.get('cell_reporter_status') in reporter_status] - - if species: - species_lower = [ s.lower() for s in species ] - cells = [c for c in cells if c.get('donor__species',"").lower() in species_lower] - - if simple: - cells = self.simplify_cells_api(cells) - - return cells - - def simplify_cells_api(self, cells): - return [{ - 'reporter_status': cell['cell_reporter_status'], - 'cell_soma_location': [ cell['csl__x'], cell['csl__y'], cell['csl__z'] ], - 'species': cell['donor__species'], - 'id': cell['specimen__id'], - 'name': cell['specimen__name'], - 'structure_layer_name': cell['structure__layer'], - 'structure_area_id': cell['structure_parent__id'], - 'structure_area_abbrev': cell['structure_parent__acronym'], - 'transgenic_line': cell['line_name'], - 'dendrite_type': cell['tag__dendrite_type'], - 'apical': cell['tag__apical'], - 'reconstruction_type': cell['nr__reconstruction_type'], - 'disease_state': cell['donor__disease_state'], - 'donor_id': cell['donor__id'], - 'structure_hemisphere': cell['specimen__hemisphere'], - 'normalized_depth': cell['csl__normalized_depth'] - } for cell in cells ] - - @cacheable() - def get_ephys_features(self): - """ - Query the API for the full table of EphysFeatures for all cells. - """ - - return self.model_query( - 'EphysFeature', - criteria='specimen(ephys_result[failed$eqfalse])', - num_rows='all') - - @cacheable() - def get_morphology_features(self): - """ - Query the API for the full table of morphology features for all cells - - Notes - ----- - by default the tags column is removed because it isn't useful - """ - return self.model_query( - 'NeuronReconstruction', - criteria="specimen(ephys_result[failed$eqfalse])", - excpt='tags', - num_rows='all') - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=2, - path_keyword='file_name')) - def save_ephys_data(self, specimen_id, file_name): - """ - Save the electrophysology recordings for a cell as an NWB file. - - Parameters - ---------- - specimen_id: int - ID of the specimen, from the Specimens database model in the Allen Institute API. - - file_name: str - Path to save the NWB file. - """ - criteria = '[id$eq%d],ephys_result(well_known_files(well_known_file_type[name$eq%s]))' % ( - specimen_id, self.NWB_FILE_TYPE) - includes = 'ephys_result(well_known_files(well_known_file_type))' - - results = self.model_query('Specimen', - criteria=criteria, - include=includes, - num_rows='all') - - try: - file_url = results[0]['ephys_result'][ - 'well_known_files'][0]['download_link'] - except Exception as _: - raise Exception("Specimen %d has no ephys data" % specimen_id) - - self.retrieve_file_over_http(self.api_url + file_url, file_name) - - def save_reconstruction(self, specimen_id, file_name): - """ - Save the morphological reconstruction of a cell as an SWC file. - - Parameters - ---------- - specimen_id: int - ID of the specimen, from the Specimens database model in the Allen Institute API. - - file_name: str - Path to save the SWC file. - """ - - Manifest.safe_make_parent_dirs(file_name) - - criteria = '[id$eq%d],neuron_reconstructions(well_known_files)' % specimen_id - includes = 'neuron_reconstructions(well_known_files(well_known_file_type[name$eq\'%s\']))' % self.SWC_FILE_TYPE - - results = self.model_query('Specimen', - criteria=criteria, - include=includes, - num_rows='all') - - try: - file_url = results[0]['neuron_reconstructions'][ - 0]['well_known_files'][0]['download_link'] - except: - raise Exception("Specimen %d has no reconstruction" % specimen_id) - - self.retrieve_file_over_http(self.api_url + file_url, file_name) - - def save_reconstruction_markers(self, specimen_id, file_name): - """ - Save the marker file for the morphological reconstruction of a cell. These are - comma-delimited files indicating points of interest in a reconstruction (truncation - points, early tracing termination, etc). - - Parameters - ---------- - specimen_id: int - ID of the specimen, from the Specimens database model in the Allen Institute API. - - file_name: str - Path to save the marker file. - """ - - Manifest.safe_make_parent_dirs(file_name) - - criteria = '[id$eq%d],neuron_reconstructions(well_known_files)' % specimen_id - includes = 'neuron_reconstructions(well_known_files(well_known_file_type[name$eq\'%s\']))' % self.MARKER_FILE_TYPE - - results = self.model_query('Specimen', - criteria=criteria, - include=includes, - num_rows='all') - - try: - file_url = results[0]['neuron_reconstructions'][ - 0]['well_known_files'][0]['download_link'] - except: - raise LookupError("Specimen %d has no marker file" % specimen_id) - - self.retrieve_file_over_http(self.api_url + file_url, file_name) diff --git a/allensdk/api/queries/connected_services.py b/allensdk/api/queries/connected_services.py deleted file mode 100644 index 17060012b5..0000000000 --- a/allensdk/api/queries/connected_services.py +++ /dev/null @@ -1,1119 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .rma_api import RmaApi - - -class ConnectedServices(object): - ''' - A class representing a schema of informatics web services. - - Notes - ----- - See `Connected Services and Pipes <http://help.brain-map.org/display/api/Connected+Services+and+Pipes>`_ - for a human-readable list of services and parameters. - - The URL format is documented at - `Service Pipelines <http://help.brain-map.org/display/api/Service+Pipelines>`_. - - Connected Services only include API services that are accessed - via the RMA endpoint using an rma::services stage. - ''' - ARRAY = 'array' - STRING = 'string' - INTEGER = 'integer' - FLOAT = 'float' - BOOLEAN = 'boolean' - - def __init__(self): - pass - - def build_url(self, service_name, kwargs): - '''Create a single stage RMA url from a service name and parameters. - ''' - rma = RmaApi() - fmt = kwargs.get('fmt', 'json') - - schema_entry = ConnectedServices._schema[service_name] - - params = [] - - for parameter in schema_entry['parameters']: - value = kwargs.get(parameter['name'], None) - if value is not None: - params.append((parameter['name'], value)) - - service_stage = rma.service_stage(service_name, - params) - - url = rma.build_query_url([service_stage], fmt) - - return url - - @classmethod - @property - def schema(cls): - '''Dictionary of service names and parameters. - - Notes - ----- - See `Connected Services and Pipes <http://help.brain-map.org/display/api/Connected+Services+and+Pipes>`_ - for a human-readable list of connected services and their parameters. - ''' - return cls._schema - - _schema = { - 'dev_human_correlation': { - 'parameters': [ - {'name': 'set', - 'optional': True, - 'type': STRING, - 'values': ['rna_seq_genes', - 'rna_seq_exons', - 'exon_microarray_genes' - 'exon_microarray_exons'] - }, - {'name': 'donors', - 'optional': True, - 'type': ARRAY - }, - {'name': 'structures', - 'optional': False, - 'type': ARRAY - }, - {'name': 'probes', - 'optional': False, - 'type': INTEGER - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': ['desc'] - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'dev_human_differential': { - 'parameters': [ - {'name': 'set', - 'type': STRING, - 'values': ['rna_seq_genes', - 'rna_seq_exons', - 'exon_microarray_genes', - 'exon_microarray_exons'] - }, - {'name': 'donors1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'donors2', - 'type': ARRAY, - 'optional': True, - 'array_type': INTEGER - }, - {'name': 'structures2', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'sort_by', - 'type': STRING, - 'optional': True, - 'values': ['p-value', 'fold-change'], - 'default': 'p-value' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'dev_human_expression': { - 'parameters': [ - {'name': 'set', - 'type': STRING, - 'values': ['rna_seq_genes', - 'rna_seq_exons', - 'exon_microarray_genes', - 'exon_microarray_exons'] - }, - {'name': 'probes', - 'type': INTEGER - }, - {'name': 'donors', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'dev_human_microarray_correlation': { - 'parameters': [ - {'name': 'donors', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING] - }, - {'name': 'probes', - 'type': INTEGER - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'dev_human_microarray_differential': { - 'parameters': [ - {'name': 'donors1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'donors2', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures2', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'sort_by', - 'type': STRING, - 'optional': True, - 'values': ['p-value', 'fold-change'], - 'default': 'p-value' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'dev_human_microarray_expression': { - 'parameters': [ - {'name': 'probes', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - }, - {'name': 'donors', - 'type': INTEGER, - 'optional': True, - }, - {'name': 'structures', - 'type': INTEGER, - 'optional': True - } - ] - }, - 'dev_mouse_agea': { - 'parameters': [ - {'name': 'seed_age', - 'type': STRING - }, - {'name': 'map_age', - 'type': STRING - }, - {'name': 'seed_point', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'seed_threshold', - 'type': ARRAY, - 'array_type': FLOAT - }, - {'name': 'map_threshold', - 'type': ARRAY, - 'array_type': FLOAT - }, - {'name': 'contrast_threshold', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'target_threshold', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'dev_mouse_correlation': { - 'parameters': [ - {'name': 'row', - 'type': INTEGER - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'ages', - 'type': ARRAY, - 'array_type': STRING, - 'optional': True - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'gbm_correlation': { - 'parameters': [ - {'name': 'donors', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING] - }, - {'name': 'probes', - 'type': INTEGER - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'gbm_differential': { - 'parameters': [ - {'name': 'donors1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'donors2', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures2', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'sort_by', - 'type': STRING, - 'optional': True, - 'values': ['p-value', 'fold-change'], - 'default': 'p-value' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'gbm_expression': { - 'parameters': [ - {'name': 'probes', - 'type': INTEGER, - 'array_type': INTEGER - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - }, - {'name': 'donors', - 'type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': INTEGER, - 'optional': True - } - ] - }, - 'gbm_ish_differential': { - 'parameters': [ - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'structures2', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'threshold1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'threshold2', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'gbm_ish_expression': { - 'parameters': [ - {'name': 'structures', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'threshold', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'human_microarray_correlation': { - 'parameters': [ - {'name': 'donors', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING] - }, - {'name': 'probes', - 'type': INTEGER - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'human_microarray_differential': { - 'parameters': [ - {'name': 'donors1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'donors2', - 'type': ARRAY, - 'optional': True, - 'array_type': INTEGER - }, - {'name': 'structures2', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'sort_by', - 'type': STRING, - 'values': ['p-value', 'fold-change'], - 'default': 'p-value' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'human_microarray_expression': { - 'parameters': [ - {'name': 'probes', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'donors', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'mouse_agea': { - 'parameters': [ - {'name': 'set', - 'type': STRING - }, - {'name': 'seed_age', - 'type': STRING - }, - {'name': 'map_age', - 'type': STRING - }, - {'name': 'seed_point', - 'type': ARRAY, - 'array_type': FLOAT - }, - {'name': 'correlation_threshold1', - 'type': FLOAT, - 'optional': True, - }, - {'name': 'correlation_threshold2', - 'type': FLOAT, - 'optional': True - }, - {'name': 'threshold1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'threshold2', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'mouse_correlation': { - 'parameters': [ - {'name': 'set', - 'type': STRING, - 'values': ['mouse', 'mouse_coronal'] - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'row', - 'type': INTEGER - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'mouse_differential': { - 'parameters': [ - {'name': 'set', - 'type': STRING, - 'values': ['mouse', 'mouse_coronal'] - }, - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'structures2', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'threshold1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'threshold2', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'mouse_connectivity_correlation': { - 'parameters': [ - {'name': 'row', - 'type': INTEGER - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'product_ids', - 'type': ARRAY, - 'array_type': [INTEGER], - 'optional': True - }, - {'name': 'hemisphere', - 'type': STRING, - 'optional': True, - 'values': ['right', 'left'] - }, - {'name': 'transgenic_lines', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'injection_structures', - 'type': 'Array', - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'primary_structure_only', - 'type': BOOLEAN, - 'optional': True, - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'mouse_connectivity_injection_coordinate': { - 'parameters': [ - {'name': 'seed_point', - 'type': ARRAY, - 'array_type': FLOAT, - 'optional': False, - }, - {'name': 'transgenic_lines', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'injection_structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'product_ids', - 'type': ARRAY, - 'array_type': [INTEGER], - 'optional': True - }, - {'name': 'primary_structure_only', - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'mouse_connectivity_injection_structure': { - 'parameters': [ - {'name': 'injection_structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING] - }, - {'name': 'target_domain', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'injection_hemisphere', - 'type': STRING, - 'optional': True, - 'values': ['right', 'left'] - }, - {'name': 'target_hemisphere', - 'type': STRING, - 'optional': True, - 'values': ['right', 'left'] - }, - {'name': 'transgenic_lines', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'injection_domain', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'product_ids', - 'type': ARRAY, - 'array_type': [INTEGER], - 'optional': True - }, - {'name': 'primary_structure_only', - 'type': BOOLEAN, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'mouse_connectivity_target_spatial': { - 'parameters': [ - {'name': 'seed_point', - 'type': ARRAY, - 'array_type': FLOAT, - }, - {'name': 'transgenic_lines', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'section_data_set', - 'type': INTEGER, - 'optional': True - }, - {'name': 'injection_structures', - 'type': ARRAY, - 'array_type': [INTEGER, STRING], - 'optional': True - }, - {'name': 'product_ids', - 'type': ARRAY, - 'array_type': [INTEGER], - 'optional': True - }, - {'name': 'primary_structure_only', - 'type': BOOLEAN, - 'optional': True - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'nhp_lmd_microarray_correlation': { - 'parameters': [ - {'name': 'donors', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': INTEGER, - }, - {'name': 'probes', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'nhp_lmd_microarray_differential': { - 'parameters': [ - {'name': 'donors1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'donors2', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures2', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'sort_by', - 'type': STRING, - 'optional': True, - 'values': ['p-value', 'fold-change'], - 'default': 'p-value' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'nhp_lmd_microarray_expression': { - 'parameters': [ - {'name': 'probes', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'nhp_macro_microarray_correlation': { - 'parameters': [ - {'name': 'donors', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'probes', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'sort_order', - 'type': STRING, - 'optional': True, - 'values': ['asc', 'desc'], - 'default': 'desc' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'nhp_macro_microarray_differential': { - 'parameters': [ - {'name': 'donors1', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures1', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'donors2', - 'type': ARRAY, - 'array_type': INTEGER, - 'optional': True - }, - {'name': 'structures2', - 'array_type': INTEGER, - 'type': ARRAY - }, - {'name': 'sort_by', - 'type': STRING, - 'optional': True, - 'values': ['p-value', 'fold-change'], - 'default': 'p-value' - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'nhp_macro_microarray_expression': { - 'parameters': [ - {'name': 'probes', - 'type': ARRAY, - 'array_type': INTEGER - }, - {'name': 'start_row', - 'type': INTEGER, - 'optional': True, - 'default': 0 - }, - {'name': 'num_rows', - 'type': INTEGER, - 'optional': True, - 'default': 2000 - } - ] - }, - 'text_search': { - 'parameters': [ - {'name': 'query_string', - 'type': STRING - }, - {'name': 'k', - 'type': STRING - } - ] - } - } diff --git a/allensdk/api/queries/glif_api.py b/allensdk/api/queries/glif_api.py deleted file mode 100644 index 35d682bad5..0000000000 --- a/allensdk/api/queries/glif_api.py +++ /dev/null @@ -1,250 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import simplejson as json -import logging -from ...deprecated import deprecated -from .rma_template import RmaTemplate - - -class GlifApi(RmaTemplate): - - _log = logging.getLogger('allensdk.api.queries.glif_api') - - NWB_FILE_TYPE = None - GLIF_TYPES = [ 395310498, 395310469, 395310475, 395310479, 471355161 ] - - rma_templates = \ - {"glif_queries": [ - {'name': 'neuronal_model_templates', - 'description': 'see name', - 'model': 'NeuronalModelTemplate', - 'num_rows': 'all', - 'count': False, - }, - {'name': 'neuronal_models', - 'description': 'see name', - 'model': 'Specimen', - 'include': 'neuronal_models(well_known_files,neuronal_model_template[id$in' + ','.join(map(str,GLIF_TYPES)) + '],neuronal_model_runs(well_known_files))', - 'criteria':'{% if ephys_experiment_ids is defined %}[id$in{{ ephys_experiment_ids }}]{%endif%}', - 'num_rows': 'all', - 'criteria_params':['ephys_experiment_ids'], - 'count': False, - }, - {'name': 'neuron_config', - 'description': 'see name', - 'model': 'NeuronalModel', - 'include': 'well_known_files(well_known_file_type)', - 'criteria':'[id$in{{ neuronal_model_ids }}]', - 'num_rows': 'all', - 'criteria_params':['neuronal_model_ids'], - 'count': False, - } - ] - } - - def __init__(self, base_uri=None): - super(GlifApi, self).__init__(base_uri, query_manifest=GlifApi.rma_templates) - - def get_neuronal_model_templates(self): - - return self.template_query('glif_queries', - 'neuronal_model_templates') - - def get_neuronal_models(self, ephys_experiment_ids=None): - return self.template_query('glif_queries', - 'neuronal_models', ephys_experiment_ids=ephys_experiment_ids) - - def get_neuronal_models_by_id(self, neuronal_model_ids=None): - return self.template_query('glif_queries', - 'neuron_config', neuronal_model_ids=neuronal_model_ids) - - def get_neuron_configs(self, neuronal_model_ids=None): - - data = self.template_query('glif_queries', - 'neuron_config', neuronal_model_ids=neuronal_model_ids) - - return_dict = {} - for curr_config in data: - neuron_config_url = curr_config['well_known_files'][0]['download_link'] - return_dict[curr_config['id']] = self.retrieve_parsed_json_over_http(self.api_url + - neuron_config_url) - - return return_dict - - - @deprecated() - def list_neuronal_models(self): - ''' DEPRECATED Query the API for a list of all GLIF neuronal models. - - Returns - ------- - list - Meta data for all GLIF neuronal models. - ''' - - include = "specimen(ephys_result[failed$eqfalse]),neuronal_model_template[name$il'*LIF*']" - - return self.model_query('NeuronalModel', - include=include, - num_rows='all') - - @deprecated() - def get_neuronal_model(self, neuronal_model_id): - '''DEPRECATED Query the current RMA endpoint with a neuronal_model id - to get the corresponding well known files and meta data. - - Returns - ------- - dict - A dictionary containing - ''' - - - include = ('neuronal_model_template(well_known_files(well_known_file_type)),' + - 'specimen(ephys_sweeps,ephys_result(well_known_files(well_known_file_type))),' + - 'well_known_files(well_known_file_type)') - - criteria = "[id$eq%d]" % neuronal_model_id - - self.neuronal_model = self.model_query('NeuronalModel', - criteria=criteria, - include=include, - num_rows='all')[0] - - self.ephys_sweeps = None - self.neuron_config_url = None - self.stimulus_url = None - - # sweeps come from the specimen - try: - specimen = self.neuronal_model['specimen'] - self.ephys_sweeps = specimen['ephys_sweeps'] - except Exception as e: - logging.info(e.args) - self.ephys_sweeps = None - - if self.ephys_sweeps is None: - logging.warning( - "Could not find ephys_sweeps for this model (%d)" % self.neuronal_model['id']) - - # neuron config file comes from the neuronal model's well known files - try: - for wkf in self.neuronal_model['well_known_files']: - if wkf['path'].endswith('neuron_config.json'): - self.neuron_config_url = wkf['download_link'] - break - except Exception as e: - self.neuron_config_url = None - - if self.neuron_config_url is None: - logging.warning( - "Could not find neuron config well_known_file for this model (%d)" % self.neuronal_model['id']) - - # NWB file comes from the ephys_result's well known files - try: - ephys_result = specimen['ephys_result'] - for wkf in ephys_result['well_known_files']: - if wkf['well_known_file_type']['name'] == 'NWBDownload': - self.stimulus_url = wkf['download_link'] - break - except Exception as e: - self.stimulus_url = None - - if self.stimulus_url is None: - logging.warning( - "Could not find stimulus well_known_file for this model (%d)" % self.neuronal_model['id']) - - self.metadata = { - 'neuron_config_url': self.neuron_config_url, - 'stimulus_url': self.stimulus_url, - 'ephys_sweeps': self.ephys_sweeps, - 'neuronal_model': self.neuronal_model - } - - return self.metadata - - @deprecated() - def get_ephys_sweeps(self): - ''' DEPRECATED Retrieve ephys sweep information out of downloaded metadata for a neuronal model - - Returns - ------- - list - A list of sweeps metadata dictionaries - ''' - - return self.ephys_sweeps - - @deprecated() - def get_neuron_config(self, output_file_name=None): - ''' DEPRECATED Retrieve a model configuration file from the API, optionally save it to disk, and - return the contents of that file as a dictionary. - - Parameters - ---------- - output_file_name: string - File name to store the neuron configuration (optional). - ''' - - if self.neuron_config_url is None: - raise Exception("URL for neuron config file is empty.") - - logging.info(self.api_url + self.neuron_config_url) - - neuron_config = self.retrieve_parsed_json_over_http( - self.api_url + self.neuron_config_url) - - if output_file_name: - with open(output_file_name, 'wb') as f: - f.write(json.dumps(neuron_config, indent=2)) - - return neuron_config - - @deprecated() - def cache_stimulus_file(self, output_file_name): - ''' DEPRECATED Download the NWB file for the current neuronal model and save it to a file. - - Parameters - ---------- - output_file_name: string - File name to store the NWB file. - ''' - - if self.stimulus_url is None: - raise Exception("URL for stimulus file is empty.") - - self.retrieve_file_over_http( - self.api_url + self.metadata['stimulus_url'], output_file_name) diff --git a/allensdk/api/queries/grid_data_api.py b/allensdk/api/queries/grid_data_api.py deleted file mode 100644 index 9702326a72..0000000000 --- a/allensdk/api/queries/grid_data_api.py +++ /dev/null @@ -1,252 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from allensdk.api.warehouse_cache.cache import cacheable -from allensdk.deprecated import deprecated -from .rma_api import RmaApi - - -class GridDataApi(RmaApi): - '''HTTP Client for the Allen 3-D Expression Grid Data Service. - - See: `Downloading 3-D Expression Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data>`_ - ''' - - INJECTION_DENSITY = 'injection_density' - PROJECTION_DENSITY = 'projection_density' - INJECTION_FRACTION = 'injection_fraction' - INJECTION_ENERGY = 'injection_energy' - PROJECTION_ENERGY = 'projection_energy' - DATA_MASK = 'data_mask' - - ENERGY = 'energy' - DENSITY = 'density' - INTENSITY = 'intensity' - - def __init__(self, - resolution=None, - base_uri=None): - super(GridDataApi, self).__init__(base_uri) - - if resolution is None: - resolution = 25 - self.resolution = resolution - - - def download_gene_expression_grid_data(self, - section_data_set_id, - volume_type, - path): - ''' Download a metaimage file containing registered gene expression grid data - - Parameters - ---------- - section_data_set_id : int - Download data from this experiment - volume_type : str - Download this type of data (options are GridDataApi.ENERGY, - GridDataApi.DENSITY, GridDataApi.INTENSITY) - path : str - Download to this path - - ''' - - include = '?include={}'.format(volume_type) - url = ''.join([self.grid_data_endpoint, '/download/', str(section_data_set_id), include]) - self.retrieve_file_over_http(url, path, zipped=True) - - - @deprecated(message='Use download_gene_expression_grid_data instead') - def download_expression_grid_data(self, - section_data_set_id, - include=None, - path=None): - '''Download in zipped metaimage format. - - Parameters - ---------- - section_data_set_id : integer - What to download. - include : list of strings, optional - Image volumes. 'energy' (default), 'density', 'intensity'. - path : string, optional - File name to save as. - - Returns - ------- - file : 3-D expression grid data packaged into a compressed archive file (.zip). - - Notes - ----- - ''' - if include is not None: - include_clause = ''.join(['?include=', - ','.join(include)]) - else: - include_clause = '' - - url = ''.join([self.grid_data_endpoint, - '/download/', - str(section_data_set_id), - include_clause]) - - if path is None: - path = str(section_data_set_id) + '.zip' - - self.retrieve_file_over_http(url, path) - - def download_projection_grid_data(self, - section_data_set_id, - image=None, - resolution=None, - save_file_path=None): - '''Download in NRRD format. - - Parameters - ---------- - section_data_set_id : integer - What to download. - image : list of strings, optional - Image volume. 'projection_density', 'projection_energy', 'injection_fraction', 'injection_density', 'injection_energy', 'data_mask'. - resolution : integer, optional - in microns. 10, 25, 50, or 100 (default). - save_file_path : string, optional - File name to save as. - - Notes - ----- - See `Downloading 3-D Projection Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#name="Downloading3-DExpressionGridData-DOWNLOADING3DPROJECTIONGRIDDATA">`_ - for additional documentation. - ''' - params_list = [] - - if image is not None: - params_list.append('image=' + ','.join(image)) - - if resolution is not None: - params_list.append('resolution=%d' % (resolution)) - - if len(params_list) > 0: - params_clause = '?' + '&'.join(params_list) - else: - params_clause = '' - - url = ''.join([self.grid_data_endpoint, - '/download_file/', - str(section_data_set_id), - params_clause]) - - if save_file_path is None: - save_file_path = str(section_data_set_id) + '.nrrd' - - self.retrieve_file_over_http(url, save_file_path) - - - def download_deformation_field(self, - section_data_set_id, - header_path=None, - voxel_path=None, - voxel_type='DeformationFieldVoxels', - header_type='DeformationFieldHeader' - ): - ''' Download the local alignment parameters for this dataset. This a 3D vector image (3 components) describing - a deformable local mapping from CCF voxels to this section data set's affine-aligned image stack. - - Parameters - ---------- - section_data_set_id : int - Download the deformation field for this data set - header_path : str, optional - If supplied, the deformation field header will be downloaded to this path. - voxel_path : str, optiona - If supplied, the deformation field voxels will be downloaded to this path. - voxel_type : str - WellKnownFileType of this dataset's data file - header_type : str - WellKnownFileType of this dataset's header file - ''' - - header_path = '{}_dfmfld.mhd'.format(section_data_set_id) if header_path is None else header_path - voxel_path = '{}_dfmfld.raw'.format(section_data_set_id) if voxel_path is None else voxel_path - - well_known_files = self.model_query( - model='WellKnownFile', - filters={'attachable_id': section_data_set_id}, - criteria='well_known_file_type[name$in\'DeformationFieldHeader\',\'DeformationFieldVoxels\']', - include='well_known_file_type' - ) - - well_known_file_urls = { - wkf['well_known_file_type']['name']: - self.construct_well_known_file_download_url(wkf['id']) for wkf in well_known_files - } - - self.retrieve_file_over_http(well_known_file_urls[header_type], header_path) - self.retrieve_file_over_http(well_known_file_urls[voxel_type], voxel_path) - - - @cacheable() - def download_alignment3d(self, section_data_set_id, num_rows='all', count=False, **kwargs): - ''' Download the parameters of the 3D affine tranformation mapping this section data set's image-space stack to - CCF-space (or vice-versa). - - Parameters - ---------- - section_data_set_id : int - download the parameters for this data set. - - Returns - ------- - dict : - parameters of this section data set's alignment3d - ''' - - results = self.model_query( - model='SectionDataSet', - filters={'id': section_data_set_id}, - include='alignment3d', - num_rows=num_rows, - count=count, - **kwargs - ) - - results = [result for result in results if 'alignment3d' in result] - if len(results) == 0: - raise ValueError('no SectionDataSet with attached alignment3d found for id {}'.format(section_data_set_id)) - elif len(results) > 1: - raise ValueError('found multiple SectionDataSets with attached alignment3ds for id {}: {}'.format(section_data_set_id, results)) - - return results[0]['alignment3d'] diff --git a/allensdk/api/queries/image_download_api.py b/allensdk/api/queries/image_download_api.py deleted file mode 100644 index d4685e3b62..0000000000 --- a/allensdk/api/queries/image_download_api.py +++ /dev/null @@ -1,500 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .rma_template import RmaTemplate -from allensdk.api.warehouse_cache.cache import cacheable -from six import string_types - - -class ImageDownloadApi(RmaTemplate): - '''HTTP Client to download whole or partial two-dimensional images from the Allen Institute - with the SectionImage, AtlasImage and ProjectionImage Download Services. - - See `Downloading an Image <http://help.brain-map.org/display/api/Downloading+an+Image>`_ - for more documentation. - ''' - - _FILTER_TYPES = [ 'range', 'rgb', 'contrast' ] - COLORMAPS = { "gray": 0, - "hotmetal": 1, - "jet": 2, - "redtemp": 3, - "expression": 4, - "red": 5, - "blue": 6, - "green": 7, - "aba": 8, - "aibsmap_alt": 9, - "colormap": 10, - "projection": 11 - } - - rma_templates = \ - {"image_queries": [ - {'name': 'section_image_ranges', - 'description': 'see name', - 'model': 'Equalization', - 'num_rows': 'all', - 'count': False, - 'only': ['blue_lower', 'blue_upper', 'red_lower', 'red_upper', 'green_lower', 'green_upper'], - 'criteria': 'section_data_set(section_images[id$in{{ section_image_ids }}])', - 'criteria_params': ['section_image_ids'] - }, - {'name': 'section_images_by_data_set_id', - 'description': 'see name', - 'model': 'SectionImage', - 'num_rows': 'all', - 'count': False, - 'criteria': '[data_set_id$eq{{ data_set_id }}]', - 'criteria_params': ['data_set_id'] - }, - {'name': 'section_data_sets_by_product_id', - 'description': 'see name', - 'model': 'SectionDataSet', - 'num_rows': 'all', - 'count': False, - 'criteria': '[failed$in{{failed}}],products[id$in{{ product_ids }}]', - 'criteria_params': ['product_ids', 'failed'] - }]} - - def __init__(self, base_uri=None): - super(ImageDownloadApi, self).__init__(base_uri, query_manifest=ImageDownloadApi.rma_templates) - - @cacheable() - def get_section_image_ranges(self, section_image_ids, num_rows='all', count=False, as_lists=True, **kwargs): - '''Section images from the Mouse Connectivity Atlas are displayed on connectivity.brain-map.org after having been - linearly windowed and leveled. This method obtains parameters defining channelwise upper and lower bounds of the windows used for - one or more images. - - Parameters - ---------- - section_image_ids : list of int - Each element is a unique identifier for a section image. - num_rows : int, optional - how many records to retrieve. Default is 'all'. - count : bool, optional - If True, return a count of the lines found by the query. Default is False. - as_lists : bool, optional - If True, return the window parameters in a list, rather than a dict - (this is the format of the range parameter on ImageDownloadApi.download_image). - Default is False. - - Returns - ------- - list of dict or list of list : - For each section image id provided, return the window bounds for each channel. - - ''' - - dict_ranges = self.template_query('image_queries', 'section_image_ranges', - section_image_ids=section_image_ids, - num_rows=num_rows, count=count) - - if not as_lists: - return dict_ranges - - list_ranges = [] - for rng in dict_ranges: - list_ranges.append([ rng['red_lower'], rng['red_upper'], rng['green_lower'], rng['green_upper'], rng['blue_lower'], rng['blue_upper'] ]) - - return list_ranges - - - @cacheable() - def get_section_data_sets_by_product(self, product_ids, include_failed=False, num_rows='all', count=False, **kwargs): - '''List all of the section data sets produced as part of one or more products - - Parameters - ---------- - product_ids : list of int - Integer specifiers for Allen Institute products. A product is a set of related data. - include_failed : bool, optional - If True, find both failed and passed datasets. Default is False - num_rows : int, optional - how many records to retrieve. Default is 'all'. - count : bool, optional - If True, return a count of the lines found by the query. Default is False. - - Returns - ------- - list of dict : - Each returned element is a section data set record. - - Notes - ----- - See http://api.brain-map.org/api/v2/data/query.json?criteria=model::Product for a list of products. - - ''' - - if include_failed: - failed_crit = "\'false\',\'true\'" - else: - failed_crit = "\'false\'" - - return self.template_query('image_queries', 'section_data_sets_by_product_id', - product_ids=product_ids, - failed=failed_crit, - num_rows=num_rows, count=count) - - - @cacheable() - def section_image_query(self, section_data_set_id, num_rows='all', count=False, **kwargs): - '''List section images belonging to a specified section data set - - Parameters - ---------- - atlas_id : integer, optional - Find images from this section data set. - num_rows : int - how many records to retrieve. Default is 'all' - count : bool - If True, return a count of the lines found by the query. - - Returns - ------- - list of dict : - Each element is an SectionImage record. - - Notes - ----- - The SectionDataSet model is used to represent single experiments which produce an array of images. - This includes Mouse Connectivity and Mouse Brain Atlas experiments, among other projects. - You may see references to the ids of experiments from those projects. - These are the same as section data set ids. - ''' - - return self.template_query('image_queries', 'section_images_by_data_set_id', - data_set_id=section_data_set_id, - num_rows=num_rows, count=count) - - def download_section_image(self, - section_image_id, - file_path=None, - **kwargs): - self.download_image(section_image_id, - file_path, - endpoint=self.section_image_download_endpoint, - **kwargs) - - def download_atlas_image(self, - atlas_image_id, - file_path=None, - **kwargs): - self.download_image(atlas_image_id, - file_path, - endpoint=self.atlas_image_download_endpoint, - **kwargs) - - def download_projection_image(self, - projection_image_id, - file_path=None, - **kwargs): - self.download_image(projection_image_id, - file_path, - endpoint=self.projection_image_download_endpoint, - **kwargs) - - def download_image(self, - image_id, - file_path=None, - endpoint=None, - **kwargs): - ''' Download whole or partial two-dimensional images - from the Allen Institute with the SectionImage or AtlasImage service. - - Parameters - ---------- - image_id : integer - SubImage to download. - file_path : string, optional - where to put it, defaults to image_id.jpg - downsample : int, optional - Number of times to downsample the original image. - quality : int, optional - jpeg quality of the returned image, 0 to 100 (default) - expression : boolean, optional - Request the expression mask for the SectionImage. - view : string, optional - 'expression', 'projection', 'tumor_feature_annotation' - or 'tumor_feature_boundary' - top : int, optional - Index of the topmost row of the region of interest. - left :int, optional - Index of the leftmost column of the region of interest. - width : int, optional - Number of columns in the output image. - height : int, optional - Number of rows in the output image. - range : list of ints, optional - Filter to specify the RGB channels. low,high,low,high,low,high - colormap : list of floats, optional - Filter to specify the RGB channels. [lower_threshold,colormap] - gain 0-1, colormap id is a string from ImageDownloadApi.COLORMAPS - rgb : list of floats, optional - Filter to specify the RGB channels. [red,green,blue] 0-1 - contrast : list of floats, optional - Filter to specify contrast parameters. [gain,bias] 0-1 - annotation : boolean, optional - Request the annotated AtlasImage - atlas : int, optional - Specify the desired Atlas' annotations. - projection : boolean, optional - Request projection for the specified image. - downsample_dimensions : boolean, optional - Indicates if the width and height should be adjusted - to account for downsampling. - - Returns - ------- - None - the file is downloaded and saved to the path. - - Notes - ----- - By default, an unfiltered full-sized image with the highest quality - is returned as a download if no parameters are provided. - - 'downsample=1' halves the number of pixels of the original image - both horizontally and vertically. range_list = kwargs.get('range', None) - - - Specifying 'downsample=2' quarters the height and width values. - - Quality must be an integer from 0, for the lowest quality, - up to as high as 100. If it is not specified, - it defaults to the highest quality. - - Top is specified in full-resolution (largest tier) pixel coordinates. - SectionImage.y is the default value. - - Left is specified in full-resolution (largest tier) pixel coordinates. - SectionImage.x is the default value. - - Width is specified in tier-resolution (desired tier) pixel coordinates. - SectionImage.width is the default value. It is automatically adjusted when downsampled. - - Height is specified in tier-resolution (desired tier) pixel coordinates. - SectionImage.height is the default value. It is automatically adjusted when downsampled. - - The range parameter consists of 6 comma delimited integers - that define the lower (0) and upper (4095) bound for each channel in red-green-blue order - (i.e. "range=0,1500,0,1000,0,4095"). - The default range values can be determined by referring to the following fields - on the Equalization model associated with the SectionDataSet: - red_lower, red_uppper, green_lower, green_upper, blue_lower, blue_upper. - For more information, see the - `Image Controls <http://help.brain-map.org/display/mouseconnectivity/Projection#Projection-ImageControls>`_ - section of the Allen Mouse Brain Connectivity Atlas: - `Projection Dataset <http://help.brain-map.org/display/mouseconnectivity/Projection>`_ - help topic. - See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ - ''' - params = [] - - if endpoint is None: - endpoint = self.image_download_endpoint - - downsample = kwargs.get('downsample', None) - - if downsample is not None: - params.append('downsample=%d' % (downsample)) - - quality = kwargs.get('quality', None) - - if quality is not None: - params.append('quality=%d' % (quality)) - - tumor_feature_annotation = kwargs.get('tumor_feature_annotation', None) - - if tumor_feature_annotation is not None: - if tumor_feature_annotation: - params.append('tumor_feature_annotation=true') - else: - params.append('tumor_feature_annotation=false') - - tumor_feature_boundary = kwargs.get('tumor_feature_boundary', None) - - if tumor_feature_boundary is not None: - if tumor_feature_boundary: - params.append('tumor_feature_boundary=true') - else: - params.append('tumor_feature_boundary=false') - - annotation = kwargs.get('annotation', None) - - if annotation is not None: - if annotation is True: - params.append('annotation=true') - else: - params.append('annotation=false') - - atlas = kwargs.get('atlas', None) - - if atlas is not None: - params.append('atlas=%d' % (atlas)) - - projection = kwargs.get('projection', None) - - if projection is not None: - if projection is True: - params.append('projection=true') - else: - params.append('projection=false') - - expression = kwargs.get('expression', None) - - if expression is not None: - if expression: - params.append('expression=true') - else: - params.append('expression=false') - - colormap_filter = kwargs.get('colormap', None) - - if colormap_filter is not None: - if isinstance(colormap_filter, string_types): - params.append('colormap=%s' % (colormap_filter)) - else: - lower_threshold = colormap_filter[0] - colormap_id = ImageDownloadApi.COLORMAPS[colormap_filter[1]] - filter_values_list = '0.5,%s,0,256,%d' % (str(lower_threshold), - colormap_id) - params.append('colormap=%s' % (filter_values_list)) - - # see - # http://api.brain-map.org/api/v2/data/SectionDataSet/100141599.xml?include=equalization,section_images - for filter_type in ImageDownloadApi._FILTER_TYPES: - filter_values = kwargs.get(filter_type, None) - - if filter_values is not None: - filter_values_list = ','.join(str(r) for r in filter_values) - params.append('%s=%s' % (filter_type, filter_values_list)) - - view = kwargs.get('view', None) - - if view is not None: - if view in ['expression', - 'projection', - 'tumor_feature_annotation', - 'tumor_feature_boundary']: - params.append('view=%s' % (view)) - else: - raise ValueError("view argument should be 'expression', 'projection', 'tumor_feature_annotation' or 'tumor_feature_boundary'") - - # region of interest - for roi_key in ['left', 'top', 'width', 'height']: - roi_value = kwargs.get(roi_key, None) - if roi_value is not None: - params.append('%s=%d' % (roi_key, roi_value)) - - downsample_dimensions = kwargs.get('downsample_dimensions', None) - - if downsample_dimensions is not None: - if downsample_dimensions: - params.append('downsample_dimensions=true') - else: - params.append('downsample_dimensions=false') - - if len(params) > 0: - url_params = "?" + "&".join(params) - else: - url_params = '' - - image_url = ''.join([endpoint, - '/', - str(image_id), - url_params]) - - if file_path is None: - file_path = '%d.jpg' % (image_id) - - self.retrieve_file_over_http(image_url, file_path) - - - def atlas_image_query(self, atlas_id, image_type_name=None): - '''List atlas images belonging to a specified atlas - - Parameters - ---------- - atlas_id : integer, optional - Find images from this atlas. - image_type_name : string, optional - Restrict response to images of this type. If not provided, - the query will get it from the atlas id. - - Returns - ------- - list of dict : - Each element is an AtlasImage record. - - Notes - ----- - See `Downloading Atlas Images and Graphics <http://help.brain-map.org/display/api/Atlas+Drawings+and+Ontologies#AtlasDrawingsandOntologies-DownloadingAtlasImagesAndGraphics>`_ - for additional documentation. - :py:meth:`allensdk.api.queries.ontologies_api.OntologiesApi.get_atlases` can also be used to list atlases along with their ids. - ''' - - stages = [] - - if image_type_name is None: - atlas_stage = self.model_stage('Atlas', - criteria='[id$eq%d]' % (atlas_id), - only=['image_type']) - stages.append(atlas_stage) - - atlas_name_pipe_stage = self.pipe_stage('list', - parameters=[('type_name', - self.IS, - self.quote_string('image_type'))]) - stages.append(atlas_name_pipe_stage) - - image_type_name = '$type_name' - else: - image_type_name = self.quote_string(image_type_name) - - criteria_list = ['[annotated$eqtrue],', - 'atlas_data_set(atlases[id$eq%d]),' % (atlas_id), - "alternate_images[image_type$eq%s]" % (image_type_name)] - - atlas_image_model_stage = self.model_stage('AtlasImage', - criteria=criteria_list, - order=[ - 'sub_images.section_number'], - num_rows='all') - - stages.append(atlas_image_model_stage) - - return self.json_msg_query( - self.build_query_url(stages)) diff --git a/allensdk/api/queries/mouse_atlas_api.py b/allensdk/api/queries/mouse_atlas_api.py deleted file mode 100644 index b02dada34f..0000000000 --- a/allensdk/api/queries/mouse_atlas_api.py +++ /dev/null @@ -1,150 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2018. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from allensdk.core import sitk_utilities -from allensdk.api.warehouse_cache.cache import Cache, cacheable - -from .reference_space_api import ReferenceSpaceApi -from .grid_data_api import GridDataApi -from .rma_pager import pageable - - - -class MouseAtlasApi(ReferenceSpaceApi, GridDataApi): - ''' Downloads Mouse Brain Atlas grid data, reference volumes, and metadata. - ''' - - MOUSE_ATLAS_PRODUCTS = (1,) - DEVMOUSE_ATLAS_PRODUCTS = (3,) - MOUSE_ORGANISM = (2,) - HUMAN_ORGANISM = (1,) - - @cacheable() - @pageable(num_rows=2000, total_rows='all') - def get_section_data_sets(self, gene_ids=None, product_ids=None, **kwargs): - ''' Download a list of section data sets (experiments) from the Mouse Brain - Atlas project. - - Parameters - ---------- - gene_ids : list of int, optional - Filter results based on the genes whose expression was characterized - in each experiment. Default is all. - product_ids : list of int, optional - Filter results to a subset of products. Default is the Mouse Brain Atlas. - - Returns - ------- - list of dict : - Each element is a section data set record, with one or more gene - records nested in a list. - - ''' - - if product_ids is None: - product_ids = list(self.MOUSE_ATLAS_PRODUCTS) - criteria = 'products[id$in{}]'.format(','.join(map(str, product_ids))) - - if gene_ids is not None: - criteria += ',genes[id$in{}]'.format(','.join(map(str, gene_ids))) - - order = kwargs.pop('order', ['\'id\'']) - - return self.model_query(model='SectionDataSet', - criteria=criteria, - include='genes', - order=order, - **kwargs) - - @cacheable() - @pageable(num_rows=2000, total_rows='all') - def get_genes(self, organism_ids=None, chromosome_ids=None, **kwargs): - ''' Download a list of genes - - Parameters - ---------- - organism_ids : list of int, optional - Filter genes to those appearing in these organisms. Defaults to mouse (2). - chromosome_ids : list of int, optional - Filter genes to those appearing on these chromosomes. Defaults to all. - - Returns - ------- - list of dict: - Each element is a gene record, with a nested chromosome record (also a dict). - - ''' - - if organism_ids is None: - organism_ids = list(self.MOUSE_ORGANISM) - criteria = '[organism_id$in{}]'.format(','.join(map(str, organism_ids))) - - if chromosome_ids is not None: - criteria += ',[chromosome_id$in{}]'.format(','.join(map(str, chromosome_ids))) - - order = kwargs.pop('order', ['\'id\'']) - - return self.model_query(model='Gene', - criteria=criteria, - include='chromosome', - order=order, - **kwargs) - - @cacheable(strategy='create', - reader = sitk_utilities.read_ndarray_with_sitk, - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_expression_density(self, path, experiment_id): - self.download_gene_expression_grid_data( - experiment_id, GridDataApi.DENSITY, path) - - - @cacheable(strategy='create', - reader = sitk_utilities.read_ndarray_with_sitk, - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_expression_energy(self, path, experiment_id): - self.download_gene_expression_grid_data( - experiment_id, GridDataApi.ENERGY, path) - - - @cacheable(strategy='create', - reader = sitk_utilities.read_ndarray_with_sitk, - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_expression_intensity(self, path, experiment_id): - self.download_gene_expression_grid_data( - experiment_id, GridDataApi.INTENSITY, path) diff --git a/allensdk/api/queries/mouse_connectivity_api.py b/allensdk/api/queries/mouse_connectivity_api.py deleted file mode 100644 index 5fb6a8c0ed..0000000000 --- a/allensdk/api/queries/mouse_connectivity_api.py +++ /dev/null @@ -1,505 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .reference_space_api import ReferenceSpaceApi -from .grid_data_api import GridDataApi -from allensdk.api.warehouse_cache.cache import cacheable, Cache -import numpy as np -import nrrd -import six - - -class MouseConnectivityApi(ReferenceSpaceApi, GridDataApi): - ''' - HTTP Client for the Allen Mouse Brain Connectivity Atlas. - - See: `Mouse Connectivity API <http://help.brain-map.org/display/mouseconnectivity/API>`_ - ''' - PRODUCT_IDS = [5, 31] - - def __init__(self, base_uri=None): - super(MouseConnectivityApi, self).__init__(base_uri=base_uri) - - - @cacheable() - def get_experiments(self, - structure_ids, - **kwargs): - ''' - Fetch experiment metadata from the Mouse Brain Connectivity Atlas. - - Parameters - ---------- - structure_ids : integer or list, optional - injection structure - - Returns - ------- - url : string - The constructed URL - ''' - criteria_list = ['[failed$eqfalse]', - 'products[id$in%s]' % (','.join(str(i) for i in MouseConnectivityApi.PRODUCT_IDS))] - - if structure_ids is not None: - if type(structure_ids) is not list: - structure_ids = [structure_ids] - criteria_list.append('[id$in%s]' % ','.join(str(i) - for i in structure_ids)) - - criteria_string = ','.join(criteria_list) - - return self.model_query('SectionDataSet', - criteria=criteria_string, - **kwargs) - - @cacheable() - def get_experiments_api(self): - ''' - Fetch experiment metadata from the Mouse Brain Connectivity Atlas via the ApiConnectivity table. - - Returns - ------- - url : string - The constructed URL - ''' - return self.model_query('ApiConnectivity', num_rows='all') - - @cacheable() - def get_manual_injection_summary(self, experiment_id): - ''' Retrieve manual injection summary. ''' - - criteria = '[id$in%d]' % (experiment_id) - - include = ['specimen(donor(transgenic_mouse(transgenic_lines)),', - 'injections(structure,age)),', - 'equalization,products'] - - only = ['id', - 'failed', - 'storage_directory', - 'red_lower', - 'red_upper', - 'green_lower', - 'green_upper', - 'blue_lower', - 'blue_upper', - 'products.id', - 'specimen_id', - 'structure_id', - 'reference_space_id', - 'primary_injection_structure_id', - 'registration_point', - 'coordinates_ap', - 'coordinates_dv', - 'coordinates_ml', - 'angle', - 'sex', - 'strain', - 'injection_materials', - 'acronym', - 'structures.name', - 'days', - 'transgenic_mice.name', - 'transgenic_lines.name', - 'transgenic_lines.description', - 'transgenic_lines.id', - 'donors.id'] - - return self.model_query('SectionDataSet', - criteria=criteria, - include=include, - only=only) - - @cacheable() - def get_experiment_detail(self, experiment_id): - '''Retrieve the experiments data.''' - - criteria = '[id$eq%d]' % (experiment_id) - include = ['specimen(stereotaxic_injections(primary_injection_structure,structures,stereotaxic_injection_coordinates)),', - 'equalization,', - 'sub_images'] - order = ["'sub_images.section_number$asc'"] - - return self.model_query('SectionDataSet', - criteria=criteria, - include=include, - order=order) - - @cacheable() - def get_projection_image_info(self, - experiment_id, - section_number): - '''Fetch meta-information of one projection image. - - Parameters - ---------- - experiment_id : integer - - section_number : integer - - Notes - ----- - See: image examples under - `Experimental Overview and Metadata <http://help.brain-map.org/display/mouseconnectivity/API##API-ExperimentalOverviewandMetadata>`_ - for additional documentation. - Download the image using :py:meth:`allensdk.api.queries.image_download_api.ImageDownloadApi.download_section_image` - ''' - - criteria = '[id$eq%d]' % (experiment_id) - include = ['equalization,sub_images[section_number$eq%d]' % - (section_number)] - - return self.model_query('SectionDataSet', - criteria=criteria, - include=include) - - - def download_reference_aligned_image_channel_volumes(self, - data_set_id, - save_file_path=None): - ''' - Returns - ------- - The well known file is downloaded - ''' - well_known_file_url = self.get_reference_aligned_image_channel_volumes_url( - data_set_id) - - if save_file_path is None: - save_file_path = str(data_set_id) + '.zip' - - self.retrieve_file_over_http(well_known_file_url, save_file_path) - - def build_reference_aligned_image_channel_volumes_url(self, - data_set_id): - '''Construct url to download the red, green, and blue channels - aligned to the 25um adult mouse brain reference space volume. - - Parameters - ---------- - data_set_id : integerallensdk.api.queries - aka attachable_id - - Notes - ----- - See: `Reference-aligned Image Channel Volumes <http://help.brain-map.org/display/mouseconnectivity/API#API-ReferencealignedImageChannelVolumes>`_ - for additional documentation. - ''' - - criteria = ['well_known_file_type', - "[name$eq'ImagesResampledTo25MicronARA']", - "[attachable_id$eq%d]" % (data_set_id)] - - model_stage = self.model_stage('WellKnownFile', - criteria=criteria) - - url = self.build_query_url([model_stage]) - - return url - - def get_reference_aligned_image_channel_volumes_url(self, - data_set_id): - '''Retrieve the download link for a specific data set.\ - - Notes - ----- - See `Reference-aligned Image Channel Volumes <http://help.brain-map.org/display/mouseconnectivity/API#API-ReferencealignedImageChannelVolumes>`_ - for additional documentation. - ''' - download_link = self.do_query(self.build_reference_aligned_image_channel_volumes_url, - lambda parsed_json: str( - parsed_json['msg'][0]['download_link']), - data_set_id) - - url = self.api_url + download_link - - return url - - def experiment_source_search(self, **kwargs): - '''Search over the whole projection signal statistics dataset - to find experiments with specific projection profiles. - - Parameters - ---------- - injection_structures : list of integers or strings - Integer Structure.id or String Structure.acronym. - target_domain : list of integers or strings, optional - Integer Structure.id or String Structure.acronym. - injection_hemisphere : string, optional - 'right' or 'left', Defaults to both hemispheres. - target_hemisphere : string, optional - 'right' or 'left', Defaults to both hemispheres. - transgenic_lines : list of integers or strings, optional - Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. - injection_domain : list of integers or strings, optional - Integer Structure.id or String Structure.acronym. - primary_structure_only : boolean, optional - product_ids : list of integers, optional - Integer Product.id - start_row : integer, optional - For paging purposes. Defaults to 0. - num_rows : integer, optional - For paging purposes. Defaults to 2000. - - Notes - ----- - See `Source Search <http://help.brain-map.org/display/mouseconnectivity/API#API-SourceSearch>`_, - `Target Search <http://help.brain-map.org/display/mouseconnectivity/API#API-TargetSearch>`_, - and - `service::mouse_connectivity_injection_structure <http://help.brain-map.org/display/api/Connected+Services+and+Pipes#ConnectedServicesandPipes-service%3A%3Amouseconnectivityinjectionstructure>`_. - - ''' - tuples = [(k, v) for k, v in six.iteritems(kwargs)] - return self.service_query('mouse_connectivity_injection_structure', parameters=tuples) - - def experiment_spatial_search(self, **kwargs): - '''Displays all SectionDataSets - with projection signal density >= 0.1 at the seed point. - This service also returns the path - along the most dense pixels from the seed point - to the center of each injection site.. - - Parameters - ---------- - seed_point : list of floats - The coordinates of a point in 3-D SectionDataSet space. - transgenic_lines : list of integers or strings, optional - Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. - section_data_sets : list of integers, optional - Ids to filter the results. - injection_structures : list of integers or strings, optional - Integer Structure.id or String Structure.acronym. - primary_structure_only : boolean, optional - product_ids : list of integers, optional - Integer Product.id - start_row : integer, optional - For paging purposes. Defaults to 0. - num_rows : integer, optional - For paging purposes. Defaults to 2000. - - Notes - ----- - See `Spatial Search <http://help.brain-map.org/display/mouseconnectivity/API#API-SpatialSearch>`_ - and - `service::mouse_connectivity_target_spatial <http://help.brain-map.org/display/api/Connected+Services+and+Pipes#ConnectedServicesandPipes-service%3A%3Amouseconnectivitytargetspatial>`_. - - ''' - - tuples = [(k, v) for k, v in six.iteritems(kwargs)] - return self.service_query('mouse_connectivity_target_spatial', parameters=tuples) - - def experiment_injection_coordinate_search(self, **kwargs): - '''User specifies a seed location within the 3D reference space. - The service returns a rank list of experiments - by distance of its injection site to the specified seed location. - - Parameters - ---------- - seed_point : list of floats - The coordinates of a point in 3-D SectionDataSet space. - transgenic_lines : list of integers or strings, optional - Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. - injection_structures : list of integers or strings, optional - Integer Structure.id or String Structure.acronym. - primary_structure_only : boolean, optional - product_ids : list of integers, optional - Integer Product.id - start_row : integer, optional - For paging purposes. Defaults to 0. - num_rows : integer, optional - For paging purposes. Defaults to 2000. - - Notes - ----- - See `Injection Coordinate Search <http://help.brain-map.org/display/mouseconnectivity/API#API-InjectionCoordinateSearch>`_ - and - `service::mouse_connectivity_injection_coordinate <http://help.brain-map.org/display/api/Connected+Services+and+Pipes#ConnectedServicesandPipes-service%3A%3Amouseconnectivityinjectioncoordinate>`_. - - ''' - tuples = [(k, v) for k, v in six.iteritems(kwargs)] - return self.service_query('mouse_connectivity_injection_coordinate', parameters=tuples) - - def experiment_correlation_search(self, **kwargs): - '''Select a seed experiment and a domain over - which the similarity comparison is to be made. - - - Parameters - ---------- - row : integer - SectionDataSet.id to correlate against. - structures : list of integers or strings, optional - Integer Structure.id or String Structure.acronym. - hemisphere : string, optional - Use 'right' or 'left'. Defaults to both hemispheres. - transgenic_lines : list of integers or strings, optional - Integer TransgenicLine.id or String TransgenicLine.name. Specify ID 0 to exclude all TransgenicLines. - injection_structures : list of integers or strings, optional - Integer Structure.id or String Structure.acronym. - primary_structure_only : boolean, optional - product_ids : list of integers, optional - Integer Product.id - start_row : integer, optional - For paging purposes. Defaults to 0. - num_rows : integer, optional - For paging purposes. Defaults to 2000. - - Notes - ----- - See `Correlation Search <http://help.brain-map.org/display/mouseconnectivity/API#API-CorrelationSearch>`_ - and - `service::mouse_connectivity_correlation <http://help.brain-map.org/display/api/Connected+Services+and+Pipes#ConnectedServicesandPipes-service%3A%3Amouseconnectivitycorrelation>`_. - - ''' - tuples = sorted(six.iteritems(kwargs)) - return self.service_query('mouse_connectivity_correlation', - parameters=tuples) - - @cacheable() - def get_structure_unionizes(self, - experiment_ids, - is_injection=None, - structure_name=None, - structure_ids=None, - hemisphere_ids=None, - normalized_projection_volume_limit=None, - include=None, - debug=None, - order=None): - - experiment_filter = '[section_data_set_id$in%s]' %\ - ','.join(str(i) for i in experiment_ids) - - if is_injection is True: - is_injection_filter = '[is_injection$eqtrue]' - elif is_injection is False: - is_injection_filter = '[is_injection$eqfalse]' - else: - is_injection_filter = '' - - if normalized_projection_volume_limit is not None: - volume_filter = '[normalized_projection_volume$gt%f]' %\ - (normalized_projection_volume_limit) - else: - volume_filter = '' - - if hemisphere_ids is not None: - hemisphere_filter = '[hemisphere_id$in%s]' %\ - ','.join(str(h) for h in hemisphere_ids) - else: - hemisphere_filter = '' - - if structure_name is not None: - structure_filter = ",structure[name$eq'%s']" % (structure_name) - elif structure_ids is not None: - structure_filter = '[structure_id$in%s]' %\ - ','.join(str(i) for i in structure_ids) - else: - structure_filter = '' - - return self.model_query( - 'ProjectionStructureUnionize', - criteria=''.join([experiment_filter, - is_injection_filter, - volume_filter, - hemisphere_filter, - structure_filter]), - include=include, - order=order, - num_rows='all', - debug=debug, - count=False) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_injection_density(self, path, experiment_id, resolution): - self.download_projection_grid_data( - experiment_id, [GridDataApi.INJECTION_DENSITY], resolution, path) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_projection_density(self, path, experiment_id, resolution): - self.download_projection_grid_data( - experiment_id, [GridDataApi.PROJECTION_DENSITY], resolution, path) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_injection_fraction(self, path, experiment_id, resolution): - self.download_projection_grid_data( - experiment_id, [GridDataApi.INJECTION_FRACTION], resolution, path) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_data_mask(self, path, experiment_id, resolution): - self.download_projection_grid_data( - experiment_id, [GridDataApi.DATA_MASK], resolution, path) - - def calculate_injection_centroid(self, - injection_density, - injection_fraction, - resolution=25): - ''' - Compute the centroid of an injection site. - - Parameters - ---------- - - injection_density: np.ndarray - The injection density volume of an experiment - - injection_fraction: np.ndarray - The injection fraction volume of an experiment - - ''' - - # find all voxels with injection_fraction > 0 - injection_voxels = np.nonzero(injection_fraction) - injection_density_computed = np.multiply(injection_density[injection_voxels], - injection_fraction[injection_voxels]) - sum_density = np.sum(injection_density_computed) - - # compute centroid in CCF coordinates - if sum_density > 0: - centroid = np.dot(injection_density_computed, - list(zip(*injection_voxels))) / sum_density * resolution - else: - centroid = None - - return centroid diff --git a/allensdk/api/queries/ontologies_api.py b/allensdk/api/queries/ontologies_api.py deleted file mode 100644 index 7a5cb27239..0000000000 --- a/allensdk/api/queries/ontologies_api.py +++ /dev/null @@ -1,314 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .rma_template import RmaTemplate -from allensdk.api.warehouse_cache.cache import cacheable - -from allensdk.core.structure_tree import StructureTree - - -class OntologiesApi(RmaTemplate): - ''' - See: `Atlas Drawings and Ontologies - <http://help.brain-map.org/display/api/Atlas+Drawings+and+Ontologies>`_ - ''' - - rma_templates = \ - {"ontology_queries": [ - {'name': 'structures_by_graph_ids', - 'description': 'see name', - 'model': 'Structure', - 'criteria': '[graph_id$in{{ graph_ids }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['graph_ids'] - }, - {'name': 'structures_by_graph_names', - 'description': 'see name', - 'model': 'Structure', - 'criteria': 'graph[structure_graphs.name$in{{ graph_names }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['graph_names'] - }, - {'name': 'structures_by_set_ids', - 'description': 'see name', - 'model': 'Structure', - 'criteria': '[structure_set_id$in{{ set_ids }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['set_ids'] - }, - {'name': 'structures_by_set_names', - 'description': 'see name', - 'model': 'Structure', - 'criteria': 'structure_sets[name$in{{ set_names }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['set_names'] - }, - {'name': 'structure_graphs_list', - 'description': 'see name', - 'model': 'StructureGraph', - 'num_rows': 'all', - 'count': False - }, - {'name': 'structure_sets_list', - 'description': 'see name', - 'model': 'StructureSet', - 'num_rows': 'all', - 'count': False - }, - {'name': 'atlases_list', - 'description': 'see name', - 'model': 'Atlas', - 'num_rows': 'all', - 'count': False - }, - {'name': 'atlases_table', - 'description': 'see name', - 'model': 'Atlas', - 'criteria': '{% if atlas_ids is defined %}[id$in{{ atlas_ids }}],{%endif%}structure_graph(ontology),graphic_group_labels', - 'include': 'structure_graph(ontology),graphic_group_labels', - 'only': ['atlases.id', - 'atlases.name', - 'atlases.image_type', - 'ontologies.id', - 'ontologies.name', - 'structure_graphs.id', - 'structure_graphs.name', - 'graphic_group_labels.id', - 'graphic_group_labels.name'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['atlas_ids'] - }, - {'name': 'structures_with_sets', - 'description': 'see name', - 'model': 'Structure', - 'include': 'structure_sets', - 'criteria': '[graph_id$in{{ graph_ids }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['graph_ids'] - }, - {'name': 'structure_sets_by_id', - 'description': 'see name', - 'model': 'StructureSet', - 'criteria': '[id$in{{ set_ids }}]', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['set_ids'] - } - ]} - - def __init__(self, base_uri=None): - super(OntologiesApi, self).__init__(base_uri, - query_manifest=OntologiesApi.rma_templates) - - @cacheable() - def get_structures(self, - structure_graph_ids=None, - structure_graph_names=None, - structure_set_ids=None, - structure_set_names=None, - order=['structures.graph_order'], - num_rows='all', - count=False, - **kwargs): - '''Retrieve data about anatomical structures. - - Parameters - ---------- - structure_graph_ids : int or list of ints, optional - database keys to get all structures in particular graphs - structure_graph_names : string or list of strings, optional - list of graph names to narrow the query - structure_set_ids : int or list of ints, optional - database keys to get all structures in a particular set - structure_set_names : string or list of strings, optional - list of set names to narrow the query. - order : list of strings - list of RMA order clauses for sorting - num_rows : int - how many records to retrieve - - Returns - ------- - dict - the parsed json response containing data from the API - - Notes - ----- - Only one of the methods of limiting the query should be used at a time. - ''' - if structure_graph_ids is not None: - data = self.template_query('ontology_queries', - 'structures_by_graph_ids', - graph_ids=structure_graph_ids, - order=order, - num_rows=num_rows, - count=count) - elif structure_graph_names is not None: - data = self.template_query('ontology_queries', - 'structures_by_graph_names', - graph_names=structure_graph_names, - order=order, - num_rows=num_rows, - count=count) - elif structure_set_ids is not None: - data = self.template_query('ontology_queries', - 'structures_by_set_ids', - set_ids=structure_set_ids, - order=order, - num_rows=num_rows, - count=count) - elif structure_set_names is not None: - data = self.template_query('ontology_queries', - 'structures_by_set_names', - set_names=structure_set_names, - order=order, - num_rows=num_rows, - count=count) - - return data - - - @cacheable() - def get_structures_with_sets(self, structure_graph_ids, order=['structures.graph_order'], - num_rows='all', count=False, **kwargs): - '''Download structures along with the sets to which they belong. - - Parameters - ---------- - structure_graph_ids : int or list of int - Only fetch structure records from these graphs. - order : list of strings - list of RMA order clauses for sorting - num_rows : int - how many records to retrieve - - Returns - ------- - dict - the parsed json response containing data from the API - - ''' - - return self.template_query('ontology_queries', 'structures_with_sets', - graph_ids=structure_graph_ids, - order=order, num_rows=num_rows, - count=count) - - - def unpack_structure_set_ancestors(self, structure_dataframe): - '''Convert a slash-separated structure_id_path field to a list. - - Parameters - ---------- - structure_dataframe : DataFrame - structure data from the API - - Returns - ------- - None - A new column is added to the dataframe containing the ancestor list. - ''' - ancestors = structure_dataframe['structure_id_path'].apply( - lambda e: [int(a) for a in e.split('/')[1:-1]]) - structure_ancestors = [ - [n for n in ancestors_n] for ancestors_n in ancestors - ] - structure_dataframe['structure_set_ancestor'] = structure_ancestors - - @cacheable() - def get_atlases_table(self, atlas_ids=None, brief=True): - '''List Atlases available through the API - with associated ontologies and structure graphs. - - Parameters - ---------- - atlas_ids : integer or list of integers, optional - only select specific atlases - brief : boolean, optional - True (default) requests only name and id fields. - - Returns - ------- - dict : atlas metadata - - Notes - ----- - This query is based on the - `table of available Atlases <http://help.brain-map.org/display/api/Atlas+Drawings+and+Ontologies>`_. - See also: `Class: Atlas <http://api.brain-map.org/doc/Atlas.html>`_ - ''' - if brief is True: - data = self.template_query('ontology_queries', - 'atlases_table', - atlas_ids=atlas_ids) - else: - data = self.template_query('ontology_queries', - 'atlases_table', - atlas_ids=atlas_ids, - only=None) - - return data - - @cacheable() - def get_atlases(self): - return self.template_query('ontology_queries', - 'atlases_list') - - @cacheable() - def get_structure_graphs(self): - return self.template_query('ontology_queries', - 'structure_graphs_list') - - @cacheable() - def get_structure_sets(self, structure_set_ids=None): - - if structure_set_ids is None: - return self.template_query('ontology_queries', - 'structure_sets_list') - else: - return self.template_query('ontology_queries', - 'structure_sets_by_id', - set_ids=list(structure_set_ids)) diff --git a/allensdk/api/queries/reference_space_api.py b/allensdk/api/queries/reference_space_api.py deleted file mode 100644 index 1a5d5811c6..0000000000 --- a/allensdk/api/queries/reference_space_api.py +++ /dev/null @@ -1,293 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .rma_api import RmaApi -from allensdk.api.warehouse_cache.cache import cacheable, Cache -from allensdk.core.obj_utilities import read_obj -import allensdk.core.sitk_utilities as sitk_utilities -import numpy as np -import nrrd -import six - - -class ReferenceSpaceApi(RmaApi): - - AVERAGE_TEMPLATE = 'average_template' - ARA_NISSL = 'ara_nissl' - MOUSE_2011 = 'annotation/mouse_2011' - DEVMOUSE_2012 = 'annotation/devmouse_2012' - CCF_2015 = 'annotation/ccf_2015' - CCF_2016 = 'annotation/ccf_2016' - CCF_2017 = 'annotation/ccf_2017' - CCF_VERSION_DEFAULT = CCF_2017 - - VOXEL_RESOLUTION_10_MICRONS = 10 - VOXEL_RESOLUTION_25_MICRONS = 25 - VOXEL_RESOLUTION_50_MICRONS = 50 - VOXEL_RESOLUTION_100_MICRONS = 100 - - - def __init__(self, base_uri=None): - super(ReferenceSpaceApi, self).__init__(base_uri=base_uri) - - - @cacheable(strategy='create', - reader=nrrd.read, - pathfinder=Cache.pathfinder(file_name_position=3, - path_keyword='file_name')) - def download_annotation_volume(self, - ccf_version, - resolution, - file_name): - ''' - Download the annotation volume at a particular resolution. - - Parameters - ---------- - ccf_version: string - Which reference space version to download. Defaults to "annotation/ccf_2017" - resolution: int - Desired resolution to download in microns. - Must be 10, 25, 50, or 100. - file_name: string - Where to save the annotation volume. - - Note: the parameters must be used as positional parameters, not keywords - ''' - - if ccf_version is None: - ccf_version = ReferenceSpaceApi.CCF_VERSION_DEFAULT - - self.download_volumetric_data(ccf_version, - 'annotation_%d.nrrd' % resolution, - save_file_path=file_name) - - - @cacheable(strategy='create', reader=sitk_utilities.read_ndarray_with_sitk, - pathfinder=Cache.pathfinder(file_name_position=3, - path_keyword='file_name')) - def download_mouse_atlas_volume(self, age, volume_type, file_name): - '''Download a reference volume (annotation, grid annotation, atlas volume) - from the mouse brain atlas project - - Parameters - ---------- - age : str - Specify a mouse age for which to download the reference volume - volume_type : str - Specify the type of volume to download - file_name : str - Specify the path to the downloaded volume - ''' - - remote_file_name = '{}_{}.zip'.format(age, volume_type) - url = '/'.join([ self.informatics_archive_endpoint, - 'current-release', 'mouse_annotation', - remote_file_name ]) - - self.retrieve_file_over_http(url, file_name, zipped=True) - - - @cacheable(strategy='create', - reader=nrrd.read, - pathfinder=Cache.pathfinder(file_name_position=2, - path_keyword='file_name')) - def download_template_volume(self, resolution, file_name): - ''' - Download the registration template volume at a particular resolution. - - Parameters - ---------- - - resolution: int - Desired resolution to download in microns. Must be 10, 25, 50, or 100. - - file_name: string - Where to save the registration template volume. - ''' - self.download_volumetric_data(ReferenceSpaceApi.AVERAGE_TEMPLATE, - 'average_template_%d.nrrd' % resolution, - save_file_path=file_name) - - @cacheable(strategy='create', - reader=nrrd.read, - pathfinder=Cache.pathfinder(file_name_position=4, - path_keyword='file_name')) - def download_structure_mask(self, structure_id, ccf_version, resolution, file_name): - '''Download an indicator mask for a specific structure. - - Parameters - ---------- - structure_id : int - Unique identifier for the annotated structure - ccf_version : string - Which reference space version to download. Defaults to "annotation/ccf_2017" - resolution : int - Desired resolution to download in microns. Must be 10, 25, 50, or 100. - file_name : string - Where to save the downloaded mask. - - ''' - - if ccf_version is None: - ccf_version = ReferenceSpaceApi.CCF_VERSION_DEFAULT - - structure_mask_dir = 'structure_masks_{0}'.format(resolution) - data_path = '{0}/{1}/{2}'.format(ccf_version, 'structure_masks', structure_mask_dir) - remote_file_name = 'structure_{0}.nrrd'.format(structure_id) - - try: - self.download_volumetric_data(data_path, remote_file_name, save_file_path=file_name) - except Exception as e: - self._file_download_log.error('''We weren't able to download a structure mask for structure {0}. - You can instead build the mask locally using - ReferenceSpace.many_structure_masks''') - raise - - - @cacheable(strategy='create', - reader=read_obj, - pathfinder=Cache.pathfinder(file_name_position=3, - path_keyword='file_name')) - def download_structure_mesh(self, structure_id, ccf_version, file_name): - '''Download a Wavefront obj file containing a triangulated 3d mesh built - from an annotated structure. - - Parameters - ---------- - structure_id : int - Unique identifier for the annotated structure - ccf_version : string - Which reference space version to download. Defaults to "annotation/ccf_2017" - file_name : string - Where to save the downloaded mask. - - ''' - - if ccf_version is None: - ccf_version = ReferenceSpaceApi.CCF_VERSION_DEFAULT - - data_path = '{0}/{1}'.format(ccf_version, 'structure_meshes') - remote_file_name = '{0}.obj'.format(structure_id) - - try: - self.download_volumetric_data(data_path, remote_file_name, save_file_path=file_name) - except Exception as e: - self._file_download_log.error('unable to download a structure mesh for structure {0}.'.format(structure_id)) - raise - - - def build_volumetric_data_download_url(self, - data_path, - file_name, - voxel_resolution=None, - release=None, - coordinate_framework=None): - '''Construct url to download 3D reference model in NRRD format. - - Parameters - ---------- - data_path : string - 'average_template', 'ara_nissl', 'annotation/ccf_{year}', - 'annotation/mouse_2011', or 'annotation/devmouse_2012' - voxel_resolution : int - 10, 25, 50 or 100 - coordinate_framework : string - 'mouse_ccf' (default) or 'mouse_annotation' - - Notes - ----- - See: `3-D Reference Models <http://help.brain-map.org/display/mouseconnectivity/API#API-3DReferenceModels>`_ - for additional documentation. - ''' - - if voxel_resolution is None: - voxel_resolution = ReferenceSpaceApi.VOXEL_RESOLUTION_10_MICRONS - - if release is None: - release = 'current-release' - - if coordinate_framework is None: - coordinate_framework = 'mouse_ccf' - - url = ''.join([self.informatics_archive_endpoint, - '/%s/%s/' % (release, coordinate_framework), - data_path, - '/', - file_name]) - - return url - - - def download_volumetric_data(self, - data_path, - file_name, - voxel_resolution=None, - save_file_path=None, - release=None, - coordinate_framework=None): - '''Download 3D reference model in NRRD format. - - Parameters - ---------- - data_path : string - 'average_template', 'ara_nissl', 'annotation/ccf_{year}', - 'annotation/mouse_2011', or 'annotation/devmouse_2012' - file_name : string - server-side file name. 'annotation_10.nrrd' for example. - voxel_resolution : int - 10, 25, 50 or 100 - coordinate_framework : string - 'mouse_ccf' (default) or 'mouse_annotation' - - Notes - ----- - See: `3-D Reference Models <http://help.brain-map.org/display/mouseconnectivity/API#API-3DReferenceModels>`_ - for additional documentation. - ''' - url = self.build_volumetric_data_download_url(data_path, - file_name, - voxel_resolution, - release, - coordinate_framework) - - if save_file_path is None: - save_file_path = file_name - - if save_file_path is None: - save_file_path = 'volumetric_data.nrrd' - - self.retrieve_file_over_http(url, save_file_path) - diff --git a/allensdk/api/queries/rma_api.py b/allensdk/api/queries/rma_api.py deleted file mode 100644 index 3ea14337ad..0000000000 --- a/allensdk/api/queries/rma_api.py +++ /dev/null @@ -1,600 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from ..api import Api -import warnings - - -class RmaApi(Api): - ''' - See: `RESTful Model Access (RMA) <http://help.brain-map.org/display/api/RESTful+Model+Access+%28RMA%29>`_ - ''' - MODEL = 'model::' - PIPE = 'pipe::' - SERVICE = 'service::' - CRITERIA = 'rma::criteria' - INCLUDE = 'rma::include' - OPTIONS = 'rma::options' - ORDER = 'order' - NUM_ROWS = 'num_rows' - ALL = 'all' - START_ROW = 'start_row' - COUNT = 'count' - ONLY = 'only' - EXCEPT = 'except' - EXCPT = 'excpt' - TABULAR = 'tabular' - DEBUG = 'debug' - PREVIEW = 'preview' - TRUE = 'true' - FALSE = 'false' - IS = '$is' - EQ = '$eq' - - def __init__(self, base_uri=None): - super(RmaApi, self).__init__(base_uri) - - def build_query_url(self, - stage_clauses, - fmt='json'): - '''Combine one or more RMA query stages into a single RMA query. - - Parameters - ---------- - stage_clauses : list of strings - subqueries - fmt : string, optional - json (default), xml, or csv - - Returns - ------- - string - complete RMA url - ''' - if not type(stage_clauses) is list: - stage_clauses = [stage_clauses] - - url = ''.join([ - self.rma_endpoint, - '/query.', - fmt, - '?q=', - ','.join(stage_clauses)]) - - return url - - def model_stage(self, - model, - **kwargs): - '''Construct a model stage of an RMA query string. - - Parameters - ---------- - model : string - The top level data type - filters : dict - key, value comparisons applied to the top-level model to narrow the results. - criteria : string - raw RMA criteria clause to choose what object are returned - include : string - raw RMA include clause to return associated objects - only : list of strings, optional - to be joined into an rma::options only filter to limit what data is returned - except : list of strings, optional - to be joined into an rma::options except filter to limit what data is returned - tabular : list of string, optional - return columns as a tabular data structure rather than a nested tree. - count : boolean, optional - False to skip the extra database count query. - debug : string, optional - 'true', 'false' or 'preview' - num_rows : int or string, optional - how many database rows are returned (may not correspond directly to JSON tree structure) - start_row : int or string, optional - which database row is start of returned data (may not correspond directly to JSON tree structure) - - - Notes - ----- - See `RMA Path Syntax <http://help.brain-map.org/display/api/RMA+Path+Syntax#RMAPathSyntax-DoubleColonforAxis>`_ - for a brief overview of the normalized RMA syntax. - Normalized RMA syntax differs from the legacy syntax - used in much of the RMA documentation. - Using the &debug=true option with an RMA URL will include debugging information in the - response, including the normalized query. - ''' - clauses = [RmaApi.MODEL + model] - - filters = kwargs.get('filters', None) - - if filters is not None: - clauses.append(self.filters(filters)) - - criteria = kwargs.get('criteria', None) - - if criteria is not None: - clauses.append(',') - clauses.append(RmaApi.CRITERIA) - clauses.append(',') - clauses.extend(criteria) - - include = kwargs.get('include', None) - - if include is not None: - clauses.append(',') - clauses.append(RmaApi.INCLUDE) - clauses.append(',') - clauses.extend(include) - - options_clause = self.options_clause(**kwargs) - - if options_clause != '': - clauses.append(',') - clauses.append(options_clause) - - stage = ''.join(clauses) - - return stage - - def pipe_stage(self, - pipe_name, - parameters): - '''Connect model and service stages via their JSON responses. - - Notes - ----- - See: `Service Pipelines <http://help.brain-map.org/display/api/Service+Pipelines>`_ - and - `Connected Services and Pipes <http://help.brain-map.org/display/api/Connected+Services+and+Pipes>`_ - ''' - clauses = [RmaApi.PIPE + pipe_name] - - clauses.append(self.tuple_filters(parameters)) - - stage = ''.join(clauses) - - return stage - - def service_stage(self, - service_name, - parameters=None): - '''Construct an RMA query fragment to send a request to a connected service. - - Parameters - ---------- - service_name : string - Name of a documented connected service. - parameters : dict - key-value pairs as in the online documentation. - - Notes - ----- - See: `Service Pipelines <http://help.brain-map.org/display/api/Service+Pipelines>`_ - and - `Connected Services and Pipes <http://help.brain-map.org/display/api/Connected+Services+and+Pipes>`_ - ''' - clauses = [RmaApi.SERVICE + service_name] - - if parameters is not None: - clauses.append(self.tuple_filters(parameters)) - - stage = ''.join(clauses) - - return stage - - def model_query(self, *args, **kwargs): - '''Construct and execute a model stage of an RMA query string. - - Parameters - ---------- - model : string - The top level data type - filters : dict - key, value comparisons applied to the top-level model to narrow the results. - criteria : string - raw RMA criteria clause to choose what object are returned - include : string - raw RMA include clause to return associated objects - only : list of strings, optional - to be joined into an rma::options only filter to limit what data is returned - except : list of strings, optional - to be joined into an rma::options except filter to limit what data is returned - excpt : list of strings, optional - synonym for except parameter to avoid a reserved word conflict. - tabular : list of string, optional - return columns as a tabular data structure rather than a nested tree. - count : boolean, optional - False to skip the extra database count query. - debug : string, optional - 'true', 'false' or 'preview' - num_rows : int or string, optional - how many database rows are returned (may not correspond directly to JSON tree structure) - start_row : int or string, optional - which database row is start of returned data (may not correspond directly to JSON tree structure) - - - Notes - ----- - See `RMA Path Syntax <http://help.brain-map.org/display/api/RMA+Path+Syntax#RMAPathSyntax-DoubleColonforAxis>`_ - for a brief overview of the normalized RMA syntax. - Normalized RMA syntax differs from the legacy syntax - used in much of the RMA documentation. - Using the &debug=true option with an RMA URL will include debugging information in the - response, including the normalized query. - ''' - return self.json_msg_query( - self.build_query_url( - self.model_stage(*args, **kwargs))) - - def service_query(self, *args, **kwargs): - '''Construct and Execute a single-stage RMA query - to send a request to a connected service. - - Parameters - ---------- - service_name : string - Name of a documented connected service. - parameters : dict - key-value pairs as in the online documentation. - - Notes - ----- - See: `Service Pipelines <http://help.brain-map.org/display/api/Service+Pipelines>`_ - and - `Connected Services and Pipes <http://help.brain-map.org/display/api/Connected+Services+and+Pipes>`_ - ''' - return self.json_msg_query( - self.build_query_url( - self.service_stage(*args, **kwargs))) - - def options_clause(self, **kwargs): - '''build rma:: options clause. - - Parameters - ---------- - only : list of strings, optional - except : list of strings, optional - tabular : list of string, optional - count : boolean, optional - debug : string, optional - 'true', 'false' or 'preview' - num_rows : int or string, optional - start_row : int or string, optional - ''' - clause = '' - options_params = [] - - only = kwargs.get(RmaApi.ONLY, None) - - if only is not None: - options_params.append( - self.only_except_tabular_clause(RmaApi.ONLY, - only)) - - # handle alternate 'except' spelling to avoid reserved word conflict - excpt = kwargs.get(RmaApi.EXCEPT, None) - excpt2 = kwargs.get(RmaApi.EXCPT, None) - - if excpt is not None and excpt2 is not None: - warnings.warn('excpt and except options should not be used together', - Warning) - elif excpt2 is not None: - excpt = excpt2 - - if excpt is not None: - options_params.append( - self.only_except_tabular_clause(RmaApi.EXCEPT, - excpt)) - - tabular = kwargs.get(RmaApi.TABULAR, None) - - if tabular is not None: - options_params.append( - self.only_except_tabular_clause(RmaApi.TABULAR, - tabular)) - - num_rows = kwargs.get(RmaApi.NUM_ROWS, None) - - if num_rows is not None: - if num_rows == RmaApi.ALL: - options_params.append("[%s$eq'all']" % (RmaApi.NUM_ROWS)) - else: - options_params.append('[%s$eq%d]' % (RmaApi.NUM_ROWS, - num_rows)) - - start_row = kwargs.get(RmaApi.START_ROW, None) - - if start_row is not None: - options_params.append('[%s$eq%d]' % (RmaApi.START_ROW, - start_row)) - - order = kwargs.get(RmaApi.ORDER, None) - - if order is not None: - options_params.append(self.order_clause(order)) - - debug = kwargs.get(RmaApi.DEBUG, None) - - if debug is not None: - options_params.append(self.debug_clause(debug)) - - cnt = kwargs.get(RmaApi.COUNT, None) - - if cnt is not None: - if cnt is True or cnt == 'true': - options_params.append('[%s$eq%s]' % (RmaApi.COUNT, - RmaApi.TRUE)) - elif cnt is False or cnt == 'false': - options_params.append('[%s$eq%s]' % (RmaApi.COUNT, - RmaApi.FALSE)) - else: - pass - - if len(options_params) > 0: - clause = RmaApi.OPTIONS + ''.join(options_params) - - return clause - - def only_except_tabular_clause(self, filter_type, attribute_list): - '''Construct a clause to filter which attributes are returned - for use in an rma::options clause. - - Parameters - ---------- - filter_type : string - 'only', 'except', or 'tabular' - attribute_list : list of strings - for example ['acronym', 'products.name', 'structure.id'] - - Returns - ------- - clause : string - The query clause for inclusion in an RMA query URL. - - Notes - ----- - The title of tabular columns can be set by adding '+as+<title>' - to the attribute. - The tabular filter type requests a response that is row-oriented - rather than a nested structure. - Because of this, the tabular option can mask the lazy query behavior - of an rma::include clause. - The tabular option does not mask the inner-join behavior of an rma::include - clause. - The tabular filter is required for .csv format RMA requests. - ''' - clause = '' - - if attribute_list is not None: - clause = '[%s$eq%s]' % (filter_type, - ','.join(attribute_list)) - - return clause - - def order_clause(self, order_list=None): - '''Construct a debug clause for use in an rma::options clause. - - Parameters - ---------- - order_list : list of strings - for example ['acronym', 'products.name+asc', 'structure.id+desc'] - - Returns - ------- - clause : string - The query clause for inclusion in an RMA query URL. - - Notes - ----- - Optionally adding '+asc' (default) or '+desc' after an attribute - will change the sort order. - ''' - clause = '' - - if order_list is not None: - clause = '[order$eq%s]' % (','.join(order_list)) - - return clause - - def debug_clause(self, debug_value=None): - '''Construct a debug clause for use in an rma::options clause. - Parameters - ---------- - debug_value : string or boolean - True, False, None (default) or 'preview' - - Returns - ------- - clause : string - The query clause for inclusion in an RMA query URL. - - Notes - ----- - True will request debugging information in the response. - False will request no debugging information. - None will return an empty clause. - 'preview' will request debugging information without the query being run. - - ''' - clause = '' - - if debug_value is None: - clause = '' - if debug_value is True or debug_value == 'true': - clause = '[debug$eqtrue]' - elif debug_value is False or debug_value == 'false': - clause = '[debug$eqfalse]' - elif debug_value == 'preview': - clause = "[debug$eq'preview']" - - return clause - - # TODO: deprecate for something that can preserve order - def filters(self, filters): - '''serialize RMA query filter clauses. - - Parameters - ---------- - filters : dict - keys and values for narrowing a query. - - Returns - ------- - string - filter clause for an RMA query string. - ''' - filters_builder = [] - - for (key, value) in filters.items(): - filters_builder.append(self.filter(key, value)) - - return ''.join(filters_builder) - - # TODO: this needs to be more rigorous. - def tuple_filters(self, filters): - '''Construct an RMA filter clause. - - Notes - ----- - - See `RMA Path Syntax - Square Brackets for Filters <http://help.brain-map.org/display/api/RMA+Path+Syntax#RMAPathSyntax-SquareBracketsforFilters>`_ for additional documentation. - ''' - filters_builder = [] - - for filt in sorted(filters): - if filt[-1] is None: - continue - if len(filt) == 2: - val = filt[1] - if type(val) is list: - val_array = [] - for v in val: - if type(v) is str: - val_array.append(v) - else: - val_array.append(str(v)) - val = ','.join(val_array) - filters_builder.append("[%s$eq%s]" % (filt[0], val)) - elif type(val) is int: - filters_builder.append("[%s$eq%d]" % (filt[0], val)) - elif type(val) is bool: - if val: - filters_builder.append("[%s$eqtrue]" % (filt[0])) - else: - filters_builder.append("[%s$eqfalse]" % (filt[0])) - elif type(val) is str: - filters_builder.append("[%s$eq%s]" % (filt[0], filt[1])) - elif len(filt) == 3: - filters_builder.append("[%s%s%s]" % (filt[0], - filt[1], - str(filt[2]))) - - return ''.join(filters_builder) - - def quote_string(self, the_string): - '''Wrap a clause in single quotes. - - Parameters - ---------- - the_string : string - a clause to be included in an rma query that needs to be quoted - - Returns - ------- - string - input wrapped in single quotes - ''' - return ''.join(["'", the_string, "'"]) - - def filter(self, key, value): - '''serialize a single RMA query filter clause. - - Parameters - ---------- - key : string - keys for narrowing a query. - value : string - value for narrowing a query. - - Returns - ------- - string - a single filter clause for an RMA query string. - ''' - return "".join(['[', - key, - RmaApi.EQ, - str(value), - ']']) - - def build_schema_query(self, clazz=None, fmt='json'): - '''Build the URL that will fetch the data schema. - - Parameters - ---------- - clazz : string, optional - Name of a specific class or None (default). - fmt : string, optional - json (default) or xml - - Returns - ------- - url : string - The constructed URL - - Notes - ----- - If a class is specified, only the schema information for that class - will be requested, otherwise the url requests the entire schema. - ''' - if clazz is not None: - class_clause = '/' + clazz - else: - class_clause = '' - - url = ''.join([self.rma_endpoint, - class_clause, - '.', - fmt]) - - return url - - def get_schema(self, clazz=None): - '''Retrieve schema information.''' - schema_data = self.do_query(self.build_schema_query, - self.read_data, - clazz) - - return schema_data diff --git a/allensdk/api/queries/rma_pager.py b/allensdk/api/queries/rma_pager.py deleted file mode 100644 index 1edb58bedb..0000000000 --- a/allensdk/api/queries/rma_pager.py +++ /dev/null @@ -1,99 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import functools - - -class RmaPager(object): - def __init__(self): - pass - - @staticmethod - def pager(fn, - *args, - **kwargs): - total_rows = kwargs.pop('total_rows', None) - num_rows = kwargs.get('num_rows', None) - - if total_rows == 'all': - start_row = 0 - result_count = num_rows - kwargs = kwargs - kwargs['count'] = False - - while result_count == num_rows: - kwargs['start_row'] = start_row - data = fn(*args, **kwargs) - - start_row = start_row + num_rows - result_count = len(data) - for r in data: - yield r - - else: - start_row = 0 - kwargs = kwargs - kwargs['count'] = False - - while start_row < total_rows: - kwargs['start_row'] = start_row - - data = fn(*args, **kwargs) - result_count = len(data) - - start_row = start_row + result_count - for r in data: - yield r - -def pageable(total_rows=None, - num_rows=None): - def decor(func): - decor.total_rows=total_rows - decor.num_rows=num_rows - - @functools.wraps(func) - def w(*args, - **kwargs): - if decor.num_rows and not 'num_rows' in kwargs: - kwargs['num_rows'] = decor.num_rows - if decor.total_rows and not 'total_rows' in kwargs: - kwargs['total_rows'] = decor.total_rows - - result = RmaPager.pager(func, - *args, - **kwargs) - return result - return w - return decor diff --git a/allensdk/api/queries/rma_template.py b/allensdk/api/queries/rma_template.py deleted file mode 100644 index 1b3c44f1c6..0000000000 --- a/allensdk/api/queries/rma_template.py +++ /dev/null @@ -1,134 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .rma_api import RmaApi -from jinja2 import Template - - -class RmaTemplate(RmaApi): - ''' - See: `Atlas Drawings and Ontologies - <http://help.brain-map.org/display/api/Atlas+Drawings+and+Ontologies>`_ - ''' - - def __init__(self, base_uri=None, query_manifest=None): - super(RmaTemplate, self).__init__(base_uri) - self.templates = query_manifest - - def to_filter_rhs(self, rhs): - if type(rhs) == list: - return ','.join(str(r) for r in rhs) - - return rhs - - def template_query(self, template_name, entry_name, **kwargs): - cb = self.templates[template_name] - templates = [e for e in cb if e['name'] == entry_name] - - if len(templates) > 0: - template = templates[0] - else: - raise Exception('Entry %s not found.' % (entry_name)) - - query_args = {'model': template['model']} - - if 'criteria' in template: - criteria_template = Template(template['criteria']) - - if 'criteria_params' in template: - criteria_params = {key: self.to_filter_rhs(kwargs.get(key)) - for key in template['criteria_params'] - if key in kwargs and kwargs.get(key) is not None} - else: - criteria_params = {} - - criteria_str = str(criteria_template.render(**criteria_params)) - if criteria_str: - query_args['criteria'] = criteria_str - - if 'include' in template: - include_template = Template(template['include']) - - if 'include_params' in template: - include_params = {key: self.to_filter_rhs(kwargs.get(key)) - for key in template['include_params'] - if key in kwargs and kwargs.get(key) is not None} - else: - include_params = {} - - include_str = str(include_template.render(**include_params)) - if include_str: - query_args['include'] = include_str - - if 'only' in kwargs: - if kwargs.get('only') is not None: - query_args['only'] = [self.quote_string( - ','.join(kwargs.get('only')))] - elif 'only' in template: - query_args['only'] = [ - self.quote_string(','.join(template['only']))] - - if 'except' in kwargs: - if kwargs.get('except') is not None: - query_args['except'] = [self.quote_string( - ','.join(kwargs.get('except')))] - elif 'except' in template: - query_args['except'] = template['except'] - - if 'start_row' in kwargs: - query_args['start_row'] = kwargs.get('start_row') - elif 'start_row' in template: - query_args['start_row'] = template['start_row'] - - if 'num_rows' in kwargs: - query_args['num_rows'] = kwargs.get('num_rows') - elif 'num_rows' in template: - query_args['num_rows'] = template['num_rows'] - - if 'count' in kwargs: - query_args['count'] = kwargs.get('count') - elif 'count' in template: - query_args['count'] = template['count'] - - if 'order' in kwargs: - query_args['order'] = kwargs.get('order') - elif 'order' in template: - query_args['order'] = template['order'] - - query_args.update(kwargs) - - data = self.model_query(**query_args) - - return data diff --git a/allensdk/api/queries/svg_api.py b/allensdk/api/queries/svg_api.py deleted file mode 100644 index 29678b9ea7..0000000000 --- a/allensdk/api/queries/svg_api.py +++ /dev/null @@ -1,96 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from ..api import Api - - -class SvgApi(Api): - - def __init__(self, base_uri=None): - super(SvgApi, self).__init__(base_uri) - - def build_query(self, section_image_id, groups=None, download=False): - '''Build the URL that will fetch meta data for the specified structure. - - Parameters - ---------- - section_image_id : integer - Key of the object to be retrieved. - groups : array of integers - Keys of the group labels to filter the svg types that are returned. - - Returns - ------- - url : string - The constructed URL - ''' - if download is True: - endpoint = self.svg_download_endpoint - else: - endpoint = self.svg_endpoint - - if groups is None: - groups = [] - - if groups and len(groups) > 0: - url_params = '?groups=' + ','.join([str(g) for g in groups]) - else: - url_params = '' - - url = ''.join([endpoint, - '/', - str(section_image_id), - url_params]) - - return url - - def download_svg(self, - section_image_id, - groups=None, - file_path=None): - '''Download the svg file''' - if file_path is None: - file_path = '%d.svg' % (section_image_id) - - svg_url = self.build_query(section_image_id, groups, download=True) - self.retrieve_file_over_http(svg_url, file_path) - - def get_svg(self, - section_image_id, - groups=None): - '''Get the svg document.''' - svg_url = self.build_query(section_image_id, groups) - - return self.retrieve_xml_over_http(svg_url) diff --git a/allensdk/api/queries/synchronization_api.py b/allensdk/api/queries/synchronization_api.py deleted file mode 100644 index 5895783789..0000000000 --- a/allensdk/api/queries/synchronization_api.py +++ /dev/null @@ -1,239 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from ..api import Api - - -class SynchronizationApi(Api): - '''HTTP client for image synchronization services uses the image alignment results from - the Informatics Data Processing Pipeline. - Note: all locations on SectionImages are reported in pixel coordinates - and all locations in 3-D ReferenceSpaces are reported in microns. - - See `Image to Image Synchronization <http://help.brain-map.org/display/api/Image-to-Image+Synchronization>`_ - for additional documentation. - ''' - - def __init__(self, base_uri=None): - super(SynchronizationApi, self).__init__(base_uri) - - def get_image_to_atlas(self, - section_image_id, - x, y, - atlas_id): - '''For a specified Atlas, find the closest annotated SectionImage - and (x,y) location as defined by a seed SectionImage and seed (x,y) location. - - Parameters - ---------- - section_image_id : integer - Seed for spatial sync. - x : float - Pixel coordinate of the seed location in the seed SectionImage. - y : float - Pixel coordinate of the seed location in the seed SectionImage. - atlas_id : int - Target Atlas for image sync. - - Returns - ------- - dict - The parsed json response - ''' - url = ''.join([self.image_to_atlas_endpoint, - '/', - str(section_image_id), - '.json', - '?x=%f&y=%f' % (x, y), - '&atlas_id=', - str(atlas_id)]) - - return self.json_msg_query(url) - - def get_image_to_image(self, - section_image_id, - x, y, - section_data_set_ids): - '''For a list of target SectionDataSets, find the closest SectionImage - and (x,y) location as defined by a seed SectionImage and seed (x,y) pixel location. - - Parameters - ---------- - section_image_id : integer - Seed for spatial sync. - x : float - Pixel coordinate of the seed location in the seed SectionImage. - y : float - Pixel coordinate of the seed location in the seed SectionImage. - section_data_set_ids : list of integers - Target SectionDataSet IDs for image sync. - - Returns - ------- - dict - The parsed json response - ''' - url = ''.join([self.image_to_image_endpoint, - '/', - str(section_image_id), - '.json', - '?x=%f&y=%f' % (x, y), - '§ion_data_set_ids=', - ','.join(str(i) for i in section_data_set_ids)]) - - return self.json_msg_query(url) - - def get_image_to_image_2d(self, - section_image_id, - x, y, - section_image_ids): - '''For a list of target SectionImages, find the closest (x,y) location - as defined by a seed SectionImage and seed (x,y) location. - - Parameters - ---------- - section_image_id : integer - Seed for image sync. - x : float - Pixel coordinate of the seed location in the seed SectionImage. - y : float - Pixel coordinate of the seed location in the seed SectionImage. - section_image_ids : list of ints - Target SectionImage IDs for image sync. - - Returns - ------- - dict - The parsed json response - ''' - url = ''.join([self.image_to_image_2d_endpoint, - '/', - str(section_image_id), - '.json', - '?x=%f&y=%f' % (x, y), - '§ion_image_ids=', - ','.join(str(i) for i in section_image_ids)]) - - return self.json_msg_query(url) - - def get_reference_to_image(self, - reference_space_id, - x, y, z, - section_data_set_ids): - '''For a list of target SectionDataSets, find the closest SectionImage - and (x,y) location as defined by a (x,y,z) location in a specified ReferenceSpace. - - Parameters - ---------- - reference_space_id : integer - Seed for spatial sync. - x : float - Coordinate (in microns) of the seed location in the seed ReferenceSpace. - y : float - Coordinate (in microns) of the seed location in the seed ReferenceSpace. - z : float - Coordinate (in microns) of the seed location in the seed ReferenceSpace. - section_data_set_ids : list of ints - Target SectionDataSets IDs for image sync. - - Returns - ------- - dict - The parsed json response - ''' - url = ''.join([self.reference_to_image_endpoint, - '/', - str(reference_space_id), - '.json', - '?x=%f&y=%f&z=%f' % (x, y, z), - '§ion_data_set_ids=', - ','.join(str(i) for i in section_data_set_ids)]) - - return self.json_msg_query(url) - - def get_image_to_reference(self, - section_image_id, - x, y): - '''For a specified SectionImage and (x,y) location, - return the (x,y,z) location in the ReferenceSpace of the associated SectionDataSet. - - Parameters - ---------- - section_image_id : integer - Seed for image sync. - x : float - Pixel coordinate on the specified SectionImage. - y : float - Pixel coordinate on the specified SectionImage. - - Returns - ------- - dict - The parsed json response - ''' - url = ''.join([self.image_to_reference_endpoint, - '/', - str(section_image_id), - '.json', - '?x=%f&y=%f' % (x, y)]) - - return self.json_msg_query(url) - - def get_structure_to_image(self, - section_data_set_id, - structure_ids): - '''For a list of target structures, find the closest SectionImage - and (x,y) location as defined by the centroid of each Structure. - - Parameters - ---------- - section_data_set_id : integer - primary key - structure_ids : list of integers - primary key - - Returns - ------- - dict - The parsed json response - ''' - url = ''.join([self.structure_to_image_endpoint, - '/', - str(section_data_set_id), - '.json', - '?structure_ids=', - ','.join([str(i) for i in structure_ids])]) - - return self.json_msg_query(url) diff --git a/allensdk/api/queries/tree_search_api.py b/allensdk/api/queries/tree_search_api.py deleted file mode 100644 index 1b84c248f3..0000000000 --- a/allensdk/api/queries/tree_search_api.py +++ /dev/null @@ -1,98 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from ..api import Api - - -class TreeSearchApi(Api): - ''' - - See `Searching a Specimen or Structure Tree <http://help.brain-map.org/display/api/Image-to-Image+Synchronization>`_ - for additional documentation. - ''' - - def __init__(self, base_uri=None): - super(TreeSearchApi, self).__init__(base_uri) - - def get_tree(self, - kind, - db_id, - ancestors=None, - descendants=None): - '''Fetch meta data for the specified structure or specimen. - - Parameters - ---------- - kind : string - 'Structure' or 'Specimen' - db_id : integer - The id of the structure or specimen to search. - ancestors : boolean, optional - whether to include ancestors in the response (defaults to False) - descendants : boolean, optional - whether to include descendants in the response (defaults to False) - - Returns - ------- - dict - parsed json response data - ''' - params = [] - url_params = '' - - if ancestors is True: - params.append('ancestors=true') - elif ancestors is False: - params.append('ancestors=false') - - if descendants is True: - params.append('descendants=true') - elif descendants is False: - params.append('descendants=false') - - if len(params) > 0: - url_params = '?' + '&'.join(params) - else: - url_params = '' - - url = ''.join([self.tree_search_endpoint, - '/', - kind, - '/', - str(db_id), - '.json', - url_params]) - - return self.json_msg_query(url) diff --git a/allensdk/api/warehouse_cache/__init__.py b/allensdk/api/warehouse_cache/__init__.py deleted file mode 100644 index 1bb8bf6d7f..0000000000 --- a/allensdk/api/warehouse_cache/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# empty diff --git a/allensdk/api/warehouse_cache/cache.py b/allensdk/api/warehouse_cache/cache.py deleted file mode 100755 index 2c12f70895..0000000000 --- a/allensdk/api/warehouse_cache/cache.py +++ /dev/null @@ -1,674 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.config.manifest import Manifest, ManifestVersionError -from allensdk.config.manifest_builder import ManifestBuilder -import allensdk.core.json_utilities as ju -from allensdk.deprecated import deprecated - -import pandas as pd -import pandas.io.json as pj - -import functools -from functools import wraps, _make_key -import os -import logging -import csv - - -def memoize(f): - """ - Creates an unbound cache of function calls and results. Note that arguments - of different types are not cached separately (so f(3.0) and f(3) are not - treated as distinct calls) - - Arguments to the cached function must be hashable. - - View the cache size with f.cache_size(). - Clear the cache with f.cache_clear(). - Access the underlying function with f.__wrapped__. - """ - cache = {} - sentinel = object() # unique object for cache misses - make_key = _make_key # efficient key building from function args - cache_get = cache.get - cache_len = cache.__len__ - - @wraps(f) - def wrapper(*args, **kwargs): - - # Don't consider 3.0 and 3 different - key = make_key(args, kwargs, typed=False) - - result = cache_get(key, sentinel) - if result is not sentinel: - return result - result = f(*args, **kwargs) - cache[key] = result - return result - - def cache_clear(): - cache.clear() - - def cache_size(): - return cache_len() - - wrapper.cache_clear = cache_clear - wrapper.cache_size = cache_size - - return wrapper - - -class Cache(object): - _log = logging.getLogger('allensdk.api.cache') - - def __init__(self, - manifest=None, - cache=True, - version=None, - **kwargs): - self.cache = cache - if version is None and hasattr(self, 'MANIFEST_VERSION'): - version = self.MANIFEST_VERSION - self.load_manifest(manifest, version) - - def get_cache_path(self, file_name, manifest_key, *args): - '''Helper method for accessing path specs from manifest keys. - - Parameters - ---------- - file_name : string - manifest_key : string - args : ordered parameters - - Returns - ------- - string or None - path - ''' - if self.cache: - if file_name: - return file_name - elif self.manifest: - return self.manifest.get_path(manifest_key, *args) - - return None - - def load_manifest(self, file_name, version=None): - '''Read a keyed collection of path specifications. - - Parameters - ---------- - file_name : string - path to the manifest file - - Returns - ------- - Manifest - ''' - if file_name is not None: - if not os.path.exists(file_name): - - # make the directory if it doesn't exist already - dirname = os.path.dirname(file_name) - if dirname: - Manifest.safe_mkdir(dirname) - - self.build_manifest(file_name) - - try: - self.manifest = Manifest( - ju.read(file_name)['manifest'], - os.path.dirname(file_name), - version=version) - except ManifestVersionError as e: - if e.outdated is True: - intro = "is out of date" - elif e.outdated is False: - intro = "was made with a newer version of the AllenSDK" - elif e.outdated is None: - intro = "version did not match the expected version" - - ref_url = "https://github.com/alleninstitute/allensdk/wiki" - raise ManifestVersionError(("Your manifest file (%s) %s" + - " (its version is '%s', but" + - " version '%s' is expected). " + - " Please remove this file" + - " and it will be regenerated for" + - " you the next time you" + - " instantiate this class." + - " WARNING: There may be new data" + - " files available that replace" + - " the ones you already have" + - " downloaded. Read the notes" + - " for this release for more" + - " details on what has changed" + - " (%s).") % - (file_name, intro, - e.found_version, e.version, - ref_url), - e.version, e.found_version) - - self.manifest_path = file_name - - else: - self.manifest = None - - def build_manifest(self, file_name): - '''Creation of default path specifications. - - Parameters - ---------- - file_name : string - where to save it - ''' - - manifest_builder = ManifestBuilder() - manifest_builder.set_version(self.MANIFEST_VERSION) - - manifest_builder = self.add_manifest_paths(manifest_builder) - - manifest_builder.write_json_file(file_name) - - def add_manifest_paths(self, manifest_builder): - '''Add cache-class specific paths to the manifest. In derived classes, - should call super. - ''' - manifest_builder.add_path('BASEDIR', '.') - if hasattr(self, 'MANIFEST_CONFIG'): - for key, config in self.MANIFEST_CONFIG.items(): - manifest_builder.add_path(key, **config) - return manifest_builder - - def manifest_dataframe(self): - '''Convenience method to view manifest as a pandas dataframe. - ''' - return pd.DataFrame.from_dict(self.manifest.path_info, - orient='index') - - @staticmethod - def json_remove_keys(data, keys): - for r in data: - for key in keys: - del r[key] - - return data - - @staticmethod - def remove_keys(data, keys=None): - ''' DataFrame version - ''' - if keys is None: - keys = [] - - for key in keys: - del data[key] - - @staticmethod - def json_rename_columns(data, - new_old_name_tuples=None): - '''Convenience method to rename columns in a pandas dataframe. - - Parameters - ---------- - data : dataframe - edited in place. - new_old_name_tuples : list of string tuples (new, old) - ''' - if new_old_name_tuples is None: - new_old_name_tuples = [] - - for new_name, old_name in new_old_name_tuples: - for r in data: - r[new_name] = r[old_name] - del r[old_name] - - @staticmethod - def rename_columns(data, - new_old_name_tuples=None): - '''Convenience method to rename columns in a pandas dataframe. - - Parameters - ---------- - data : dataframe - edited in place. - new_old_name_tuples : list of string tuples (new, old) - ''' - if new_old_name_tuples is None: - new_old_name_tuples = [] - - for new_name, old_name in new_old_name_tuples: - data.columns = [new_name if c == old_name else c - for c in data.columns] - - def load_csv(self, - path, - rename=None, - index=None): - '''Read a csv file as a pandas dataframe. - - Parameters - ---------- - rename : list of string tuples (new old), optional - columns to rename - index : string, optional - post-rename column to use as the row label. - ''' - data = pd.read_csv(path, parse_dates=True) - - Cache.rename_columns(data, rename) - - if index is not None: - data.set_index([index], inplace=True) - - return data - - def load_json(self, - path, - rename=None, - index=None): - '''Read a json file as a pandas dataframe. - - Parameters - ---------- - rename : list of string tuples (new old), optional - columns to rename - index : string, optional - post-rename column to use as the row label. - ''' - data = pj.read_json(path, orient='records') - - Cache.rename_columns(data, rename) - - if index is not None: - data.set_index([index], inplace=True) - - return data - - @staticmethod - def cacher(fn, - *args, - **kwargs): - '''make an rma query, save it and return the dataframe. - - Parameters - ---------- - fn : function reference - makes the actual query using kwargs. - path : string - where to save the data - strategy : string or None, optional - 'create' always generates the data, - 'file' loads from disk, - 'lazy' queries the server if no file exists, - None generates the data and bypasses all caching behavior - pre : function - df|json->df|json, takes one data argument and returns - filtered version, None for pass-through - post : function - df|json->?, takes one data argument and returns Object - reader : function, optional - path -> data, default NOP - writer : function, optional - path, data -> None, default NOP - kwargs : objects - passed through to the query function - - Returns - ------- - Object or None - data type depends on fn, reader and/or post methods. - ''' - path = kwargs.pop('path', None) - strategy = kwargs.pop('strategy', None) - pre = kwargs.pop('pre', lambda d: d) - post = kwargs.pop('post', None) - reader = kwargs.pop('reader', None) - writer = kwargs.pop('writer', None) - - if strategy is None: - if writer or path: - strategy = 'lazy' - else: - strategy = 'pass_through' - - if strategy not in ['lazy', 'pass_through', - 'file', 'create']: - raise ValueError("Unknown query strategy: {}.".format(strategy)) - - if 'lazy' == strategy: - if os.path.exists(path): - strategy = 'file' - else: - strategy = 'create' - - if strategy == 'pass_through': - data = fn(*args, **kwargs) - elif strategy in ['create']: - Manifest.safe_make_parent_dirs(path) - - if writer: - data = fn(*args, **kwargs) - data = pre(data) - writer(path, data) - else: - data = fn(*args, **kwargs) - - if reader: - data = reader(path) - - # Note: don't provide post if fn or reader doesn't return data - if post: - data = post(data) - return data - - try: - data - return data - except Exception: - pass - - return - - @staticmethod - def csv_writer(pth, gen): - csv_writer = None - - first_row = True - row_count = 1 - - with open(pth, 'w') as output: - for row in gen: - if first_row: - field_names = [str(k) for k in row.keys()] - csv_writer = csv.DictWriter(output, - fieldnames=field_names, - delimiter=',', - quoting=csv.QUOTE_ALL) - csv_writer.writeheader() - first_row = False - Cache._log.info('row: {}'.format(row_count)) - row_count = row_count + 1 - csv_writer.writerow(row) - - @staticmethod - def cache_csv_json(): - - def reader(f): - return pd.read_csv(f, parse_dates=True).to_dict('records') - - return { - 'writer': Cache.csv_writer, - 'reader': reader - } - - @staticmethod - def cache_csv_dataframe(): - return { - 'writer': Cache.csv_writer, - 'reader': lambda f: pd.read_csv(f, parse_dates=True) - } - - @staticmethod - def nocache_dataframe(): - return { - 'post': pd.DataFrame - } - - @staticmethod - def nocache_json(): - return { - } - - @staticmethod - def cache_json_dataframe(): - return { - 'writer': ju.write, - 'reader': lambda p: pj.read_json(p, orient='records') - } - - @staticmethod - def cache_json(): - return { - 'writer': ju.write, - 'reader': ju.read - } - - @staticmethod - def cache_csv(): - return { - 'writer': Cache.csv_writer, - 'reader': lambda f: pd.read_csv(f, parse_dates=True) - } - - @staticmethod - def pathfinder(file_name_position, - secondary_file_name_position=None, - path_keyword=None): - '''helper method to find path argument in legacy methods written - prior to the @cacheable decorator. Do not use for new - @cacheable methods. - - Parameters - ---------- - file_name_position : integer - zero indexed position in the decorated method args - where file path may be found. - secondary_file_name_position : integer - zero indexed position in the decorated method args where - the file path may be found. - path_keyword : string - kwarg that may have the file path. - - Notes - ----- - This method is only intended to provide backward-compatibility - for some methods that otherwise do not follow the path conventions - of the @cacheable decorator. - ''' - def pf(*args, **kwargs): - file_name = None - - if path_keyword is not None and path_keyword in kwargs: - file_name = kwargs[path_keyword] - else: - if file_name_position < len(args): - file_name = args[file_name_position] - - if (file_name is None and - secondary_file_name_position and - secondary_file_name_position < len(args)): # noqa E129 - file_name = args[secondary_file_name_position] - - return file_name - return pf - - @deprecated() - def wrap(self, fn, path, cache, - save_as_json=True, - return_dataframe=False, - index=None, - rename=None, - **kwargs): - '''make an rma query, save it and return the dataframe. - - Parameters - ---------- - fn : function reference - makes the actual query using kwargs. - path : string - where to save the data - cache : boolean - True will make the query, False just loads from disk - save_as_json : boolean, optional - True (default) will save data as json, False as csv - return_dataframe : boolean, optional - True will cast the return value to a pandas dataframe, - False (default) will not - index : string, optional - column to use as the pandas index - rename : list of string tuples, optional - (new, old) columns to rename - kwargs : objects - passed through to the query function - - Returns - ------- - dict or DataFrame - data type depends on return_dataframe option. - - Notes - ----- - Column renaming happens after the file is reloaded for json - ''' - if cache is True: - json_data = fn(**kwargs) - - if save_as_json is True: - ju.write(path, json_data) - else: - df = pd.DataFrame(json_data) - Cache.rename_columns(df, rename) - - if index is not None: - df.set_index([index], inplace=True) - - df.to_csv(path) - - # read it back in - if save_as_json is True: - if return_dataframe is True: - data = pj.read_json(path, orient='records') - Cache.rename_columns(data, rename) - if index is not None: - data.set_index([index], inplace=True) - else: - data = ju.read(path) - elif return_dataframe is True: - data = pd.read_csv(path, parse_dates=True) - else: - raise ValueError( - 'save_as_json=False cannot be used with ' - 'return_dataframe=False') - - return data - - -def cacheable(strategy=None, - pre=None, - writer=None, - reader=None, - post=None, - pathfinder=None): - '''decorator for rma queries, save it and return the dataframe. - - Parameters - ---------- - fn : function reference - makes the actual query using kwargs. - path : string - where to save the data - strategy : string or None, optional - 'create' always gets the data from the source (server or generated), - 'file' loads from disk, - 'lazy' creates the data and saves to file if no file exists, - None queries the server and bypasses all caching behavior - pre : function - df|json->df|json, takes one data argument and returns - filtered version, None for pass-through - post : function - df|json->?, takes one data argument and returns Object - reader : function, optional - path -> data, default NOP - writer : function, optional - path, data -> None, default NOP - kwargs : objects - passed through to the query function - - Returns - ------- - dict or DataFrame - data type depends on dataframe option. - - Notes - ----- - Column renaming happens after the file is reloaded for json - ''' - def decor(func): - decor.strategy = strategy - decor.pre = pre - decor.writer = writer - decor.reader = reader - decor.post = post - decor.pathfinder = pathfinder - - @functools.wraps(func) - def w(*args, - **kwargs): - if decor.pathfinder and 'pathfinder' not in kwargs: - pathfinder = decor.pathfinder - else: - pathfinder = kwargs.pop('pathfinder', None) - - if pathfinder and 'path' not in kwargs: - found_path = pathfinder(*args, **kwargs) - - if found_path: - kwargs['path'] = found_path - if decor.strategy and 'strategy' not in kwargs: - kwargs['strategy'] = decor.strategy - if decor.pre and 'pre' not in kwargs: - kwargs['pre'] = decor.pre - if decor.writer and 'writer' not in kwargs: - kwargs['writer'] = decor.writer - if decor.reader and 'reader' not in kwargs: - kwargs['reader'] = decor.reader - if decor.post and not 'post in kwargs': - kwargs['post'] = decor.post - - result = Cache.cacher(func, - *args, - **kwargs) - return result - - return w - return decor - - -def get_default_manifest_file(cache_name): - return os.environ.get( - '{}_MANIFEST'.format(cache_name.upper()), - '{}/manifest.json'.format(cache_name.lower()) - ) diff --git a/allensdk/api/warehouse_cache/caching_utilities.py b/allensdk/api/warehouse_cache/caching_utilities.py deleted file mode 100644 index a457294510..0000000000 --- a/allensdk/api/warehouse_cache/caching_utilities.py +++ /dev/null @@ -1,188 +0,0 @@ -import functools -from pathlib import Path -import warnings -import os -import logging - -from typing import overload, Callable, Any, Union, Optional, TypeVar - -from allensdk.config.manifest import Manifest - - -P = TypeVar("P") -Q = TypeVar("Q") - -AnyPath = Union[Path, str] - - -@overload -def call_caching( - fetch: Callable[[], Q], - write: Callable[[Q], None], - read: Callable[[], P], - pre_write: Optional[Callable[[Q], Q]] = None, - cleanup: Optional[Callable[[], None]] = None, - lazy: bool = True, - num_tries: int = 1, - failure_message: str = "" -) -> P: - """ Case where a reader is provided - """ - - -@overload -def call_caching( - fetch: Callable[[], Q], - write: Callable[[Q], None], - read: None = None, - pre_write: Optional[Callable[[Q], Q]] = None, - cleanup: Optional[Callable[[], None]] = None, - lazy: bool = True, - num_tries: int = 1, - failure_message: str = "" -) -> None: - """ Case where no reader is provided (fetches and writes, but returns nothing) - """ - - -def call_caching( - fetch: Callable[[], Q], - write: Callable[[Q], None], - read: Optional[Callable[[], P]] = None, - pre_write: Optional[Callable[[Q], Q]] = None, - cleanup: Optional[Callable[[], None]] = None, - lazy: bool = True, - num_tries: int = 1, - failure_message: str = "" -) -> Optional[P]: - """ Access data, caching on a local store for future accesses. - - Parameters - ---------- - fetch : - Function which pulls data from a remote/expensive source. - write : - Function which stores data in a local/inexpensive store. - read : - Function which pulls data from a local/inexpensive store. - pre_write : - Function applied to obtained data after fetching, but before writing. - cleanup : - Function for fixing a failed fetch. e.g. unlinking a partially - downloaded file. Exceptions raised by cleanup are not themselves - handled - lazy : - If True, attempt to read the data from the local/inexpensive store - before fetching it. If False, forcibly fetch from the - remote/expensive store. - num_tries : - How many fetches to attempt before (re)raising an exception. A fetch - is failed if reading the result raises an exception. - failure_message : - Provides additional context in the event of a failed download. Emitted - when retrying, and when a fetch failure occurs after tries are - exhausted - - Returns - ------- - The result of calling read - - """ - logger = logging.getLogger("call_caching") - - try: - if not lazy or read is None: - logger.info("Fetching data from remote") - data = fetch() - if pre_write is not None: - data = pre_write(data) - logger.info("Writing data to cache") - write(data) - - if read is not None: - logger.info("Reading data from cache") - return read() - except Exception as e: - if isinstance(e, FileNotFoundError): - logger.info("No cache file found.") - # Pandas throws ValueError rather than FileNotFoundError - elif (isinstance(e, ValueError) - and str(e) == "Expected object or value"): - logger.info("No cache file found.") - if cleanup is not None and not lazy: - cleanup() - - num_tries -= 1 - lazy # don't count fetchless reads - - if num_tries <= 0: - if failure_message: - warnings.warn(failure_message) - raise - - retry_message = f"retrying fetch ({num_tries} tries remaining)" - if failure_message: - retry_message = f"{failure_message} {retry_message}" - - if not lazy: - warnings.warn(retry_message) - - return call_caching( - fetch, - write, - read, - pre_write=pre_write, - cleanup=cleanup, - lazy=False, - num_tries=num_tries, - failure_message=failure_message, - ) - - return None # required by mypy - - -def one_file_call_caching( - path: AnyPath, - fetch: Callable[[], Q], - write: Callable[[AnyPath, Q], None], - read: Optional[Callable[[AnyPath], P]] = None, - pre_write: Optional[Callable[[Q], Q]] = None, - cleanup: Optional[Callable[[], None]] = None, - lazy: bool = True, - num_tries: int = 1, - failure_message: str = "", -) -> Optional[P]: - """ A call_caching variant where the local store is a single file. See - call_caching for complete documentation. - - Parameters - ---------- - path : - Path at which the data will be stored - - """ - def safe_unlink(): - try: - os.unlink(path) - except IOError: - pass - - def safe_write(data: Q): - Manifest.safe_make_parent_dirs(path) - write(path, data) - - if read is not None: - read = functools.partial(read, path) - - if cleanup is None: - cleanup = safe_unlink - - return call_caching( - fetch, - safe_write, - read, - pre_write=pre_write, - cleanup=cleanup, - lazy=lazy, - num_tries=num_tries, - failure_message=failure_message, - ) diff --git a/allensdk/brain_observatory/__init__.py b/allensdk/brain_observatory/__init__.py deleted file mode 100644 index 180adeeb9d..0000000000 --- a/allensdk/brain_observatory/__init__.py +++ /dev/null @@ -1,95 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import numpy as np -import sys -if sys.version_info < (3, 3): - from collections import Iterable -else: - from collections.abc import Iterable -import json -import uuid -import datetime -import dateutil - - -def dict_to_indexed_array(dc, order=None): - ''' Given a dictionary and an ordered arr, build a concatenation of the dictionary's values and an index describing - how that concatenation can be unpacked - ''' - - if order is None: - order = dc.keys() - - data = [] - index = [] - counter = 0 - - for key in order: - - if isinstance(dc[key], (np.ndarray, list)): - extended = dc[key] - if isinstance(dc[key], Iterable): - extended = [x for x in dc[key]] - else: - extended = [dc[key]] - - counter += len(extended) - index.append(counter) - data.append(extended) - - data = np.concatenate(data) - return index, data - - -class JSONEncoder(json.JSONEncoder): - def default(self, o): - if isinstance(o, datetime.datetime): - return o.isoformat() - elif isinstance(o, uuid.UUID): - return str(o) - return json.JSONEncoder.default(self, o) - - -def hook(json_dict): - for key, value in json_dict.items(): - if key == 'experiment_date': - json_dict[key] = dateutil.parser.parse(value) - elif key == 'behavior_session_uuid': - json_dict[key] = uuid.UUID(value) - else: - pass - return json_dict diff --git a/allensdk/brain_observatory/argschema_utilities.py b/allensdk/brain_observatory/argschema_utilities.py deleted file mode 100644 index e581fdc462..0000000000 --- a/allensdk/brain_observatory/argschema_utilities.py +++ /dev/null @@ -1,156 +0,0 @@ -import argparse -import os -import pathlib - -import marshmallow -from argschema import ArgSchemaParser -from argschema.schemas import DefaultSchema -from marshmallow import RAISE, ValidationError - - -class InputFile(marshmallow.fields.String): - """A marshmallow String field subclass which deserializes json str fields - that represent a desired input path to pathlib.Path. - Also performs read access checking. - """ - - def _deserialize(self, value, attr, obj, **kwargs) -> pathlib.Path: - return pathlib.Path(value) - - def _serialize(self, value, attr, obj, **kwargs) -> str: - return str(value) - - def _validate(self, value: pathlib.Path): - check_read_access(str(value)) - - -class OutputFile(marshmallow.fields.String): - """A marshmallow String field subclass which deserializes json str fields - that represent a desired output file path to a pathlib.Path. - Also performs write access checking. - """ - - def _deserialize(self, value, attr, obj, **kwargs) -> pathlib.Path: - return pathlib.Path(value) - - def _serialize(self, value, attr, obj, **kwargs) -> str: - return str(value) - - def _validate(self, value: pathlib.Path): - check_write_access_overwrite(str(value)) - - -def write_or_print_outputs(data, parser): - data.update({'input_parameters': parser.args}) - if 'output_json' in parser.args: - parser.output(data, indent=2) - else: - print(parser.get_output_json(data)) - - -def check_write_access_dir(dirpath): - if os.path.exists(dirpath): - test_filepath = pathlib.Path(dirpath, 'test_file.txt') - try: - with test_filepath.open() as _: - pass - os.remove(test_filepath) - return True - except PermissionError: - raise ValidationError( - f'don\'t have permissions to write in directory {dirpath}') - else: - try: - pathlib.Path(dirpath).mkdir(parents=True) - pathlib.Path(dirpath).rmdir() - return True - except PermissionError: - raise ValidationError( - f'Can\'t build path to requested location {dirpath}') - - raise RuntimeError('Unhandled case; this should not happen') - - -def check_write_access(filepath, allow_exists=False): - try: - fd = os.open(filepath, os.O_CREAT | os.O_EXCL) - os.close(fd) - os.remove(filepath) - return True - except FileExistsError: - - if not allow_exists: - raise ValidationError(f'file at {filepath} already exists') - else: - return True - - except (FileNotFoundError, PermissionError): - base_dir = os.path.dirname(filepath) - return check_write_access_dir(base_dir) - except Exception as e: - raise e - - raise RuntimeError('Unhandled case; this should not happen') - - -def check_write_access_overwrite(path): - return check_write_access(path, allow_exists=True) - - -def check_read_access(path): - try: - f = open(path, mode='r') - f.close() - return True - except Exception as err: - raise ValidationError( - f'file at #{path} not readable (#{type(err)}: {err}') - - -class RaisingSchema(DefaultSchema): - class Meta: - unknown = RAISE - - -class ArgSchemaParserPlus(ArgSchemaParser): # pragma: no cover - - def __init__(self, *args, **kwargs): - parser = argparse.ArgumentParser() - [known_args, extra_args] = parser.parse_known_args() - self.args = known_args - - super(ArgSchemaParserPlus, self).__init__(args=extra_args, **kwargs) - - -def optional_lims_inputs(argv, input_schema, output_schema, lims_input_getter): - remaining_args = argv[1:] - input_data = {} - - if "--get_inputs_from_lims" in argv: - lims_parser = argparse.ArgumentParser(add_help=False) - lims_parser.add_argument("--host", type=str, default="http://lims2") - lims_parser.add_argument("--job_queue", type=str, default=None) - lims_parser.add_argument("--strategy", type=str, default=None) - lims_parser.add_argument("--ecephys_session_id", type=int, - default=None) - lims_parser.add_argument("--output_root", type=str, default=None) - - lims_args, remaining_args = lims_parser.parse_known_args( - remaining_args) - remaining_args = [ - item for item in remaining_args if item != "--get_inputs_from_lims" - ] - input_data = lims_input_getter(**lims_args.__dict__) - - try: - parser = ArgSchemaParser( - args=remaining_args, - input_data=input_data, - schema_type=input_schema, - output_schema_type=output_schema, - ) - except ValidationError: - print(input_data) - raise - - return parser diff --git a/allensdk/brain_observatory/behavior/__init__.py b/allensdk/brain_observatory/behavior/__init__.py deleted file mode 100644 index 0ac0fbbaf3..0000000000 --- a/allensdk/brain_observatory/behavior/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ - -IMAGE_SETS = {'Natural_Images_Lum_Matched_set_ophys_6_2017.07.14': '//allen/programs/braintv/workgroups/nc-ophys/Doug/Stimulus_Code/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_6_2017.07.14.pkl', - 'Natural_Images_Lum_Matched_set_training_2017.07.14': '//allen/programs/braintv/workgroups/nc-ophys/Doug/Stimulus_Code/image_dictionaries/Natural_Images_Lum_Matched_set_training_2017.07.14.pkl', - 'Natural_Images_Lum_Matched_set_training_2017.07.14_2': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_training_2017.07.14.pkl', - 'Natural_Images_Lum_Matched_set_ophys_6_2017.07.14_2': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_6_2017.07.14.pkl', - 'Natural_Images_Lum_Matched_set_ophys_H_2019.05.26': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_H_2019.05.26.pkl', - 'Natural_Images_Lum_Matched_set_ophys_G_2019.05.26': '//allen/programs/braintv/workgroups/nc-ophys/visual_behavior/image_dictionaries/Natural_Images_Lum_Matched_set_ophys_G_2019.05.26.pkl'} - - - -assert len(IMAGE_SETS) == len(set(IMAGE_SETS.keys())) == len(set(IMAGE_SETS.values())) \ No newline at end of file diff --git a/allensdk/brain_observatory/behavior/behavior_ophys_analysis.py b/allensdk/brain_observatory/behavior/behavior_ophys_analysis.py deleted file mode 100644 index 016a665a66..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_ophys_analysis.py +++ /dev/null @@ -1,115 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -import seaborn as sns - -from allensdk.core.lazy_property import LazyProperty, LazyPropertyMixin -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ - BehaviorOphysExperiment - -def plot_trace(timestamps, trace, ax=None, xlabel='time (seconds)', ylabel='fluorescence', title='roi'): - if ax is None: - fig, ax = plt.subplots(figsize=(15, 5)) - colors = sns.color_palette() - ax.plot(timestamps, trace, color=colors[0], linewidth=3) - ax.set_xlabel(xlabel) - ax.set_ylabel(ylabel) - ax.set_title(title) - ax.set_xlim([timestamps[0], timestamps[-1]]) - return ax - - -def plot_example_traces_and_behavior(dataset, cell_roi_ids, xmin_seconds, length_mins, save_dir=None, - include_running=False, cell_label=False): - suffix = '' - if include_running: - n = 2 - else: - n = 1 - interval_seconds = 20 - xmax_seconds = xmin_seconds + (length_mins * 60) + 1 - xlim = [xmin_seconds, xmax_seconds] - - figsize = (15, 10) - fig, ax = plt.subplots(len(cell_roi_ids) + n, 1, figsize=figsize, sharex=True) - ax = ax.ravel() - - ymins = [] - ymaxs = [] - for i, cell_roi_id in enumerate(cell_roi_ids): - trace = dataset.dff_traces[dataset.dff_traces['cell_roi_id']==cell_roi_id]['dff'].values[0] - ax[i] = plot_trace(dataset.ophys_timestamps, trace, ax=ax[i], - title='', ylabel=str(cell_roi_id)) - ax[i] = add_stim_color_span(dataset, ax=ax[i], xlim=xlim) - ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) - ax[i].set_xlabel('') - ymin, ymax = ax[i].get_ylim() - ymins.append(ymin) - ymaxs.append(ymax) - if cell_label: - ax[i].set_ylabel(str(cell_index)) - else: - ax[i].set_ylabel('dF/F') - sns.despine(ax=ax[i]) - - for i, cell_roi_id in enumerate(cell_roi_ids): - ax[i].set_ylim([np.amin(ymins), np.amax(ymaxs)]) - - i += 1 - ax[i].set_ylim([np.amin(ymins), 1]) - ax[i] = plot_behavior_events(dataset, ax=ax[i], behavior_only=True) - ax[i] = add_stim_color_span(dataset, ax=ax[i], xlim=xlim) - ax[i].set_xlim(xlim) - ax[i].set_ylabel('') - ax[i].axes.get_yaxis().set_visible(False) - ax[i].legend(loc='upper left', fontsize=14) - sns.despine(ax=ax[i]) - - if include_running: - i += 1 - ax[i].plot(dataset.stimulus_timestamps, dataset.running_speed) - ax[i] = add_stim_color_span(dataset, ax=ax[i], xlim=xlim) - ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) - ax[i].set_ylabel('run speed\n(cm/s)') - # ax[i].axes.get_yaxis().set_visible(False) - sns.despine(ax=ax[i]) - - ax[i].set_xlabel('time (seconds)') - ax[0].set_title(dataset.ophys_experiment_id) - fig.tight_layout() - plt.subplots_adjust(wspace=0, hspace=0) - if save_dir is not None: - save_figure(fig, figsize, save_dir, 'example_traces', 'example_traces_' + str(xlim[0]) + suffix) - save_figure(fig, figsize, save_dir, 'example_traces', - str(dataset.ophys_experiment_id) + '_' + str(xlim[0]) + suffix) - plt.close() - -class BehaviorOphysAnalysis(LazyPropertyMixin): - - def __init__(self, session, api=None): - - self.session = session - self.api = self if api is None else api - # self.active_cell_roi_ids = LazyProperty(self.api.get_active_cell_roi_ids, ophys_experiment_id=self.ophys_experiment_id) - - - - - - def plot_example_traces_and_behavior(self, N=10): - dff_traces_df = self.session.dff_traces - dff_traces_df['mean'] = dff_traces_df['dff'].apply(np.mean) - dff_traces_df['std'] = dff_traces_df['dff'].apply(np.std) - dff_traces_df['snr'] = dff_traces_df['mean']/dff_traces_df['std'] - active_cell_roi_ids = dff_traces_df.sort_values('snr', ascending=False)['cell_roi_id'].values[:N] - - length_mins = 1 - for xmin_seconds in np.arange(0, 5000, length_mins * 60): - plot_example_traces_and_behavior(self.session, active_cell_roi_ids, xmin_seconds, length_mins, cell_label=False, include_running=True) - - -if __name__ == "__main__": - - session = BehaviorOphysExperiment(789359614) - analysis = BehaviorOphysAnalysis(session) - analysis.plot_example_traces_and_behavior() - diff --git a/allensdk/brain_observatory/behavior/behavior_ophys_experiment.py b/allensdk/brain_observatory/behavior/behavior_ophys_experiment.py deleted file mode 100644 index f13171ff57..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_ophys_experiment.py +++ /dev/null @@ -1,755 +0,0 @@ -from typing import Optional - -import numpy as np -import pandas as pd -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.behavior_session import ( - BehaviorSession) -from allensdk.brain_observatory.behavior.data_files import SyncFile -from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ - EyeTrackingFile -from allensdk.brain_observatory.behavior.data_files\ - .rigid_motion_transform_file import \ - RigidMotionTransformFile -from allensdk.brain_observatory.behavior.data_objects import \ - BehaviorSessionId, StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.cell_specimens \ - .cell_specimens import \ - CellSpecimens, EventsParams -from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ - .eye_tracking_table import \ - EyeTrackingTable -from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ - .rig_geometry import \ - RigGeometry as EyeTrackingRigGeometry -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.date_of_acquisition import \ - DateOfAcquisitionOphys, DateOfAcquisition -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_ophys_metadata import \ - BehaviorOphysMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.multi_plane_metadata.imaging_plane_group \ - import \ - ImagingPlaneGroup -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.multi_plane_metadata.multi_plane_metadata \ - import \ - MultiplaneMetadata -from allensdk.brain_observatory.behavior.data_objects.motion_correction \ - import \ - MotionCorrection -from allensdk.brain_observatory.behavior.data_objects.projections import \ - Projections -from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ - calculate_monitor_delay -from allensdk.brain_observatory.behavior.data_objects.timestamps \ - .ophys_timestamps import \ - OphysTimestamps, OphysTimestampsMultiplane -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.deprecated import legacy -from allensdk.brain_observatory.behavior.image_api import Image -from allensdk.internal.api import db_connection_creator - - -class BehaviorOphysExperiment(BehaviorSession): - """Represents data from a single Visual Behavior Ophys imaging session. - Initialize by using class methods `from_lims` or `from_nwb_path`. - """ - - def __init__(self, - behavior_session: BehaviorSession, - projections: Projections, - ophys_timestamps: OphysTimestamps, - cell_specimens: CellSpecimens, - metadata: BehaviorOphysMetadata, - motion_correction: MotionCorrection, - eye_tracking_table: Optional[EyeTrackingTable], - eye_tracking_rig_geometry: Optional[EyeTrackingRigGeometry], - date_of_acquisition: DateOfAcquisition): - super().__init__( - behavior_session_id=behavior_session._behavior_session_id, - licks=behavior_session._licks, - metadata=behavior_session._metadata, - raw_running_speed=behavior_session._raw_running_speed, - rewards=behavior_session._rewards, - running_speed=behavior_session._running_speed, - running_acquisition=behavior_session._running_acquisition, - stimuli=behavior_session._stimuli, - stimulus_timestamps=behavior_session._stimulus_timestamps, - task_parameters=behavior_session._task_parameters, - trials=behavior_session._trials, - date_of_acquisition=date_of_acquisition - ) - - self._metadata = metadata - self._projections = projections - self._ophys_timestamps = ophys_timestamps - self._cell_specimens = cell_specimens - self._motion_correction = motion_correction - self._eye_tracking = eye_tracking_table - self._eye_tracking_rig_geometry = eye_tracking_rig_geometry - - def to_nwb(self) -> NWBFile: - nwbfile = super().to_nwb(add_metadata=False) - - self._metadata.to_nwb(nwbfile=nwbfile) - self._projections.to_nwb(nwbfile=nwbfile) - self._cell_specimens.to_nwb(nwbfile=nwbfile, - ophys_timestamps=self._ophys_timestamps) - self._motion_correction.to_nwb(nwbfile=nwbfile) - self._eye_tracking.to_nwb(nwbfile=nwbfile) - self._eye_tracking_rig_geometry.to_nwb(nwbfile=nwbfile) - - return nwbfile - # ==================== class and utility methods ====================== - - @classmethod - def from_lims(cls, - ophys_experiment_id: int, - eye_tracking_z_threshold: float = 3.0, - eye_tracking_dilation_frames: int = 2, - events_filter_scale: float = 2.0, - events_filter_n_time_steps: int = 20, - exclude_invalid_rois=True, - skip_eye_tracking=False) -> \ - "BehaviorOphysExperiment": - """ - Parameters - ---------- - ophys_experiment_id - eye_tracking_z_threshold - See `BehaviorOphysExperiment.from_nwb` - eye_tracking_dilation_frames - See `BehaviorOphysExperiment.from_nwb` - events_filter_scale - See `BehaviorOphysExperiment.from_nwb` - events_filter_n_time_steps - See `BehaviorOphysExperiment.from_nwb` - exclude_invalid_rois - Whether to exclude invalid rois - skip_eye_tracking - Used to skip returning eye tracking data - """ - def _is_multi_plane_session(): - imaging_plane_group_meta = ImagingPlaneGroup.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - return cls._is_multi_plane_session( - imaging_plane_group_meta=imaging_plane_group_meta) - - def _get_motion_correction(): - rigid_motion_transform_file = RigidMotionTransformFile.from_lims( - ophys_experiment_id=ophys_experiment_id, db=lims_db - ) - return MotionCorrection.from_data_file( - rigid_motion_transform_file=rigid_motion_transform_file) - - def _get_eye_tracking_table(sync_file: SyncFile): - eye_tracking_file = EyeTrackingFile.from_lims( - db=lims_db, ophys_experiment_id=ophys_experiment_id) - eye_tracking_table = EyeTrackingTable.from_data_file( - data_file=eye_tracking_file, - sync_file=sync_file, - z_threshold=eye_tracking_z_threshold, - dilation_frames=eye_tracking_dilation_frames - ) - return eye_tracking_table - - lims_db = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP - ) - sync_file = SyncFile.from_lims(db=lims_db, - ophys_experiment_id=ophys_experiment_id) - stimulus_timestamps = StimulusTimestamps.from_sync_file( - sync_file=sync_file) - behavior_session_id = BehaviorSessionId.from_lims( - db=lims_db, ophys_experiment_id=ophys_experiment_id) - is_multiplane_session = _is_multi_plane_session() - meta = BehaviorOphysMetadata.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, - is_multiplane=is_multiplane_session - ) - monitor_delay = calculate_monitor_delay( - sync_file=sync_file, equipment=meta.behavior_metadata.equipment) - date_of_acquisition = DateOfAcquisitionOphys.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - behavior_session = BehaviorSession.from_lims( - lims_db=lims_db, - behavior_session_id=behavior_session_id.value, - stimulus_timestamps=stimulus_timestamps, - monitor_delay=monitor_delay, - date_of_acquisition=date_of_acquisition - ) - if is_multiplane_session: - ophys_timestamps = OphysTimestampsMultiplane.from_sync_file( - sync_file=sync_file, - group_count=meta.ophys_metadata.imaging_plane_group_count, - plane_group=meta.ophys_metadata.imaging_plane_group - ) - else: - ophys_timestamps = OphysTimestamps.from_sync_file( - sync_file=sync_file) - - projections = Projections.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - cell_specimens = CellSpecimens.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, - ophys_timestamps=ophys_timestamps, - segmentation_mask_image_spacing=projections.max_projection.spacing, - events_params=EventsParams( - filter_scale=events_filter_scale, - filter_n_time_steps=events_filter_n_time_steps), - exclude_invalid_rois=exclude_invalid_rois - ) - motion_correction = _get_motion_correction() - if skip_eye_tracking: - eye_tracking_table = None - eye_tracking_rig_geometry = None - else: - eye_tracking_table = _get_eye_tracking_table(sync_file=sync_file) - eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - - return BehaviorOphysExperiment( - behavior_session=behavior_session, - cell_specimens=cell_specimens, - ophys_timestamps=ophys_timestamps, - metadata=meta, - projections=projections, - motion_correction=motion_correction, - eye_tracking_table=eye_tracking_table, - eye_tracking_rig_geometry=eye_tracking_rig_geometry, - date_of_acquisition=date_of_acquisition - ) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile, - eye_tracking_z_threshold: float = 3.0, - eye_tracking_dilation_frames: int = 2, - events_filter_scale: float = 2.0, - events_filter_n_time_steps: int = 20, - exclude_invalid_rois=True - ) -> "BehaviorOphysExperiment": - """ - - Parameters - ---------- - nwbfile - eye_tracking_z_threshold : float, optional - The z-threshold when determining which frames likely contain - outliers for eye or pupil areas. Influences which frames - are considered 'likely blinks'. By default 3.0 - eye_tracking_dilation_frames : int, optional - Determines the number of adjacent frames that will be marked - as 'likely_blink' when performing blink detection for - `eye_tracking` data, by default 2 - events_filter_scale : float, optional - Stdev of halfnorm distribution used to convolve ophys events with - a 1d causal half-gaussian filter to smooth it for visualization, - by default 2.0 - events_filter_n_time_steps : int, optional - Number of time steps to use for convolution of ophys events - exclude_invalid_rois - Whether to exclude invalid rois - """ - def _is_multi_plane_session(): - imaging_plane_group_meta = ImagingPlaneGroup.from_nwb( - nwbfile=nwbfile) - return cls._is_multi_plane_session( - imaging_plane_group_meta=imaging_plane_group_meta) - - behavior_session = BehaviorSession.from_nwb(nwbfile=nwbfile) - projections = Projections.from_nwb(nwbfile=nwbfile) - cell_specimens = CellSpecimens.from_nwb( - nwbfile=nwbfile, - segmentation_mask_image_spacing=projections.max_projection.spacing, - events_params=EventsParams( - filter_scale=events_filter_scale, - filter_n_time_steps=events_filter_n_time_steps - ), - exclude_invalid_rois=exclude_invalid_rois - ) - eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_nwb( - nwbfile=nwbfile) - eye_tracking_table = EyeTrackingTable.from_nwb( - nwbfile=nwbfile, z_threshold=eye_tracking_z_threshold, - dilation_frames=eye_tracking_dilation_frames) - motion_correction = MotionCorrection.from_nwb(nwbfile=nwbfile) - is_multiplane_session = _is_multi_plane_session() - metadata = BehaviorOphysMetadata.from_nwb( - nwbfile=nwbfile, is_multiplane=is_multiplane_session) - if is_multiplane_session: - ophys_timestamps = OphysTimestampsMultiplane.from_nwb( - nwbfile=nwbfile) - else: - ophys_timestamps = OphysTimestamps.from_nwb(nwbfile=nwbfile) - date_of_acquisition = DateOfAcquisitionOphys.from_nwb(nwbfile=nwbfile) - - return BehaviorOphysExperiment( - behavior_session=behavior_session, - cell_specimens=cell_specimens, - eye_tracking_rig_geometry=eye_tracking_rig_geometry, - eye_tracking_table=eye_tracking_table, - motion_correction=motion_correction, - metadata=metadata, - ophys_timestamps=ophys_timestamps, - projections=projections, - date_of_acquisition=date_of_acquisition - ) - - @classmethod - def from_json(cls, - session_data: dict, - eye_tracking_z_threshold: float = 3.0, - eye_tracking_dilation_frames: int = 2, - events_filter_scale: float = 2.0, - events_filter_n_time_steps: int = 20, - exclude_invalid_rois=True, - skip_eye_tracking=False) -> \ - "BehaviorOphysExperiment": - """ - - Parameters - ---------- - session_data - eye_tracking_z_threshold - See `BehaviorOphysExperiment.from_nwb` - eye_tracking_dilation_frames - See `BehaviorOphysExperiment.from_nwb` - events_filter_scale - See `BehaviorOphysExperiment.from_nwb` - events_filter_n_time_steps - See `BehaviorOphysExperiment.from_nwb` - exclude_invalid_rois - Whether to exclude invalid rois - skip_eye_tracking - Used to skip returning eye tracking data - - """ - def _is_multi_plane_session(): - imaging_plane_group_meta = ImagingPlaneGroup.from_json( - dict_repr=session_data) - return cls._is_multi_plane_session( - imaging_plane_group_meta=imaging_plane_group_meta) - - def _get_motion_correction(): - rigid_motion_transform_file = RigidMotionTransformFile.from_json( - dict_repr=session_data) - return MotionCorrection.from_data_file( - rigid_motion_transform_file=rigid_motion_transform_file) - - def _get_eye_tracking_table(sync_file: SyncFile): - eye_tracking_file = EyeTrackingFile.from_json( - dict_repr=session_data) - eye_tracking_table = EyeTrackingTable.from_data_file( - data_file=eye_tracking_file, - sync_file=sync_file, - z_threshold=eye_tracking_z_threshold, - dilation_frames=eye_tracking_dilation_frames - ) - return eye_tracking_table - - sync_file = SyncFile.from_json(dict_repr=session_data) - is_multiplane_session = _is_multi_plane_session() - meta = BehaviorOphysMetadata.from_json( - dict_repr=session_data, is_multiplane=is_multiplane_session) - monitor_delay = calculate_monitor_delay( - sync_file=sync_file, equipment=meta.behavior_metadata.equipment) - behavior_session = BehaviorSession.from_json( - session_data=session_data, - monitor_delay=monitor_delay - ) - - if is_multiplane_session: - ophys_timestamps = OphysTimestampsMultiplane.from_sync_file( - sync_file=sync_file, - group_count=meta.ophys_metadata.imaging_plane_group_count, - plane_group=meta.ophys_metadata.imaging_plane_group - ) - else: - ophys_timestamps = OphysTimestamps.from_sync_file( - sync_file=sync_file) - - projections = Projections.from_json(dict_repr=session_data) - cell_specimens = CellSpecimens.from_json( - dict_repr=session_data, - ophys_timestamps=ophys_timestamps, - segmentation_mask_image_spacing=projections.max_projection.spacing, - events_params=EventsParams( - filter_scale=events_filter_scale, - filter_n_time_steps=events_filter_n_time_steps), - exclude_invalid_rois=exclude_invalid_rois - ) - motion_correction = _get_motion_correction() - if skip_eye_tracking: - eye_tracking_table = None - eye_tracking_rig_geometry = None - else: - eye_tracking_table = _get_eye_tracking_table(sync_file=sync_file) - eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_json( - dict_repr=session_data) - - return BehaviorOphysExperiment( - behavior_session=behavior_session, - cell_specimens=cell_specimens, - ophys_timestamps=ophys_timestamps, - metadata=meta, - projections=projections, - motion_correction=motion_correction, - eye_tracking_table=eye_tracking_table, - eye_tracking_rig_geometry=eye_tracking_rig_geometry, - date_of_acquisition=behavior_session._date_of_acquisition - ) - - # ========================= 'get' methods ========================== - - def get_segmentation_mask_image(self) -> Image: - """a 2D binary image of all valid cell masks - - Returns - ---------- - allensdk.brain_observatory.behavior.image_api.Image: - array-like interface to segmentation_mask image data and - metadata - """ - return self._cell_specimens.segmentation_mask_image - - @legacy('Consider using "dff_traces" instead.') - def get_dff_traces(self, cell_specimen_ids=None): - - if cell_specimen_ids is None: - cell_specimen_ids = self.get_cell_specimen_ids() - - csid_table = \ - self.cell_specimen_table.reset_index()[['cell_specimen_id']] - csid_subtable = csid_table[csid_table['cell_specimen_id'].isin( - cell_specimen_ids)].set_index('cell_specimen_id') - dff_table = csid_subtable.join(self.dff_traces, how='left') - dff_traces = np.vstack(dff_table['dff'].values) - timestamps = self.ophys_timestamps - - assert (len(cell_specimen_ids), len(timestamps)) == dff_traces.shape - return timestamps, dff_traces - - @legacy() - def get_cell_specimen_indices(self, cell_specimen_ids): - return [self.cell_specimen_table.index.get_loc(csid) - for csid in cell_specimen_ids] - - @legacy("Consider using cell_specimen_table['cell_specimen_id'] instead.") - def get_cell_specimen_ids(self): - cell_specimen_ids = self.cell_specimen_table.index.values - - if np.isnan(cell_specimen_ids.astype(float)).sum() == \ - len(self.cell_specimen_table): - raise ValueError("cell_specimen_id values not assigned " - f"for {self.ophys_experiment_id}") - return cell_specimen_ids - - # ====================== properties ======================== - - @property - def ophys_experiment_id(self) -> int: - """Unique identifier for this experimental session. - :rtype: int - """ - return self._metadata.ophys_metadata.ophys_experiment_id - - @property - def ophys_session_id(self) -> int: - """Unique identifier for this ophys session. - :rtype: int - """ - return self._metadata.ophys_metadata.ophys_session_id - - @property - def metadata(self): - behavior_meta = super()._get_metadata( - behavior_metadata=self._metadata.behavior_metadata) - ophys_meta = { - 'indicator': self._cell_specimens.meta.imaging_plane.indicator, - 'emission_lambda': self._cell_specimens.meta.emission_lambda, - 'excitation_lambda': - self._cell_specimens.meta.imaging_plane.excitation_lambda, - 'experiment_container_id': - self._metadata.ophys_metadata.experiment_container_id, - 'field_of_view_height': - self._metadata.ophys_metadata.field_of_view_shape.height, - 'field_of_view_width': - self._metadata.ophys_metadata.field_of_view_shape.width, - 'imaging_depth': self._metadata.ophys_metadata.imaging_depth, - 'imaging_plane_group': - self._metadata.ophys_metadata.imaging_plane_group - if isinstance(self._metadata.ophys_metadata, - MultiplaneMetadata) else None, - 'imaging_plane_group_count': - self._metadata.ophys_metadata.imaging_plane_group_count - if isinstance(self._metadata.ophys_metadata, - MultiplaneMetadata) else 0, - 'ophys_experiment_id': - self._metadata.ophys_metadata.ophys_experiment_id, - 'ophys_frame_rate': - self._cell_specimens.meta.imaging_plane.ophys_frame_rate, - 'ophys_session_id': self._metadata.ophys_metadata.ophys_session_id, - 'project_code': self._metadata.ophys_metadata.project_code, - 'targeted_structure': - self._cell_specimens.meta.imaging_plane.targeted_structure - } - return { - **behavior_meta, - **ophys_meta - } - - @property - def max_projection(self) -> Image: - """2D max projection image. - :rtype: allensdk.brain_observatory.behavior.image_api.Image - """ - return self._projections.max_projection - - @property - def average_projection(self) -> Image: - """2D image of the microscope field of view, averaged across the - experiment - :rtype: allensdk.brain_observatory.behavior.image_api.Image - """ - return self._projections.avg_projection - - @property - def ophys_timestamps(self) -> np.ndarray: - """Timestamps associated with frames captured by the microscope - :rtype: numpy.ndarray - """ - return self._ophys_timestamps.value - - @property - def dff_traces(self) -> pd.DataFrame: - """traces of change in fluoescence / fluorescence - - Returns - ------- - pd.DataFrame - dataframe of traces of dff - (change in fluorescence / fluorescence) - - dataframe columns: - cell_specimen_id [index]: (int) - unified id of segmented cell across experiments - assigned after cell matching - cell_roi_id: (int) - experiment specific id of segmented roi, - assigned before cell matching - dff: (list of float) - fluorescence fractional values relative to baseline - (arbitrary units) - - """ - return self._cell_specimens.dff_traces - - @property - def events(self) -> pd.DataFrame: - """A dataframe containing spiking events in traces derived - from the two photon movies, organized by cell specimen id. - For more information on event detection processing - please see the event detection portion of the white paper. - - Returns - ------- - pd.DataFrame - cell_specimen_id [index]: (int) - unified id of segmented cell across experiments - (assigned after cell matching) - cell_roi_id: (int) - experiment specific id of segmented roi (assigned - before cell matching) - events: (np.array of float) - event trace where events correspond to the rise time - of a calcium transient in the dF/F trace, with a - magnitude roughly proportional the magnitude of the - increase in dF/F. - filtered_events: (np.array of float) - Events array with a 1d causal half-gaussian filter to - smooth it for visualization. Uses a halfnorm - distribution as weights to the filter - lambdas: (float64) - regularization value selected to make the minimum - event size be close to N * noise_std - noise_stds: (float64) - estimated noise standard deviation for the events trace - - """ - return self._cell_specimens.events - - @property - def cell_specimen_table(self) -> pd.DataFrame: - """Cell information organized into a dataframe. Table only - contains roi_valid = True entries, as invalid ROIs/ non cell - segmented objects have been filtered out - - Returns - ------- - pd.DataFrame - dataframe columns: - cell_specimen_id [index]: (int) - unified id of segmented cell across experiments - (assigned after cell matching) - cell_roi_id: (int) - experiment specific id of segmented roi - (assigned before cell matching) - height: (int) - height of ROI/cell in pixels - mask_image_plane: (int) - which image plane an ROI resides on. Overlapping - ROIs are stored on different mask image planes - max_corretion_down: (float) - max motion correction in down direction in pixels - max_correction_left: (float) - max motion correction in left direction in pixels - max_correction_right: (float) - max motion correction in right direction in pixels - max_correction_up: (float) - max motion correction in up direction in pixels - roi_mask: (array of bool) - an image array that displays the location of the - roi mask in the field of view - valid_roi: (bool) - indicates if cell classification found the segmented - ROI to be a cell or not (True = cell, False = not cell). - width: (int) - width of ROI in pixels - x: (float) - x position of ROI in field of view in pixels (top - left corner) - y: (float) - y position of ROI in field of view in pixels (top - left corner) - """ - return self._cell_specimens.table - - @property - def corrected_fluorescence_traces(self) -> pd.DataFrame: - """Corrected fluorescence traces which are neuropil corrected - and demixed. Sampling rate can be found in metadata - ‘ophys_frame_rate’ - - Returns - ------- - pd.DataFrame - Dataframe that contains the corrected fluorescence traces - for all valid cells. - - dataframe columns: - cell_specimen_id [index]: (int) - unified id of segmented cell across experiments - (assigned after cell matching) - cell_roi_id: (int) - experiment specific id of segmented roi - (assigned before cell matching) - corrected_fluorescence: (list of float) - fluorescence values (arbitrary units) - - """ - return self._cell_specimens.corrected_fluorescence_traces - - @property - def motion_correction(self) -> pd.DataFrame: - """a dataframe containing the x and y offsets applied during - motion correction - - Returns - ------- - pd.DataFrame - dataframe columns: - x: (int) - frame shift along x axis - y: (int) - frame shift along y axis - """ - return self._motion_correction.value - - @property - def segmentation_mask_image(self) -> Image: - """A 2d binary image of all valid cell masks - :rtype: allensdk.brain_observatory.behavior.image_api.Image - """ - return self._cell_specimens.segmentation_mask_image - - @property - def eye_tracking(self) -> pd.DataFrame: - """A dataframe containing ellipse fit parameters for the eye, pupil - and corneal reflection (cr). Fits are derived from tracking points - from a DeepLabCut model applied to video frames of a subject's - right eye. Raw tracking points and raw video frames are not exposed - by the SDK. - - Notes: - - All columns starting with 'pupil_' represent ellipse fit parameters - relating to the pupil. - - All columns starting with 'eye_' represent ellipse fit parameters - relating to the eyelid. - - All columns starting with 'cr_' represent ellipse fit parameters - relating to the corneal reflection, which is caused by an infrared - LED positioned near the eye tracking camera. - - All positions are in units of pixels. - - All areas are in units of pixels^2 - - All values are in the coordinate space of the eye tracking camera, - NOT the coordinate space of the stimulus display (i.e. this is not - gaze location), with (0, 0) being the upper-left corner of the - eye-tracking image. - - The 'likely_blink' column is True for any row (frame) where the pupil - fit failed OR eye fit failed OR an outlier fit was identified on the - pupil or eye fit. - - The pupil_area, cr_area, eye_area columns are set to NaN wherever - 'likely_blink' == True. - - The pupil_area_raw, cr_area_raw, eye_area_raw columns contains all - pupil fit values (including where 'likely_blink' == True). - - All ellipse fits are derived from tracking points that were output by - a DeepLabCut model that was trained on hand-annotated data from a - subset of imaging sessions on optical physiology rigs. - - Raw DeepLabCut tracking points are not publicly available. - - :rtype: pandas.DataFrame - """ - return self._eye_tracking.value - - @property - def eye_tracking_rig_geometry(self) -> dict: - """the eye tracking equipment geometry associate with a - given ophys experiment session. - - Returns - ------- - dict - dictionary with the following keys: - camera_eye_position_mm (array of float) - camera_rotation_deg (array of float) - equipment (string) - led_position (array of float) - monitor_position_mm (array of float) - monitor_rotation_deg (array of float) - """ - return self._eye_tracking_rig_geometry.to_dict()['rig_geometry'] - - @property - def roi_masks(self) -> pd.DataFrame: - return self.cell_specimen_table[['cell_roi_id', 'roi_mask']] - - def _get_identifier(self) -> str: - return str(self.ophys_experiment_id) - - @staticmethod - def _is_multi_plane_session( - imaging_plane_group_meta: ImagingPlaneGroup) -> bool: - """Returns whether this experiment is part of a multiplane session""" - return imaging_plane_group_meta is not None and \ - imaging_plane_group_meta.plane_group_count > 1 - - def _get_session_type(self) -> str: - return self._metadata.behavior_metadata.session_type - - @staticmethod - def _get_keywords(): - """Keywords for NWB file""" - return ["2-photon", "calcium imaging", "visual cortex", - "behavior", "task"] diff --git a/allensdk/brain_observatory/behavior/behavior_ophys_session.py b/allensdk/brain_observatory/behavior/behavior_ophys_session.py deleted file mode 100644 index 30186cfb48..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_ophys_session.py +++ /dev/null @@ -1,18 +0,0 @@ -import warnings - -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ - BehaviorOphysExperiment as BOE - -# alias as BOE prevents someone becoming comfortable with -# import BehaviorOphysExperiment from this to-be-deprecated module - -class BehaviorOphysSession(BOE): - def __init__(self, **kwargs): - warnings.warn( - "allensdk.brain_observatory.behavior.behavior_ophys_session." - "BehaviorOphysSession is deprecated. use " - "allensdk.brain_observatory.behavior.behavior_ophys_experiment." - "BehaviorOphysExperiment.", - DeprecationWarning, - stacklevel=3) - super().__init__(**kwargs) diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/__init__.py deleted file mode 100644 index ff862b37ca..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from allensdk.brain_observatory.behavior.behavior_project_cache.\ - behavior_project_cache import VisualBehaviorOphysProjectCache # noqa F401 diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py b/allensdk/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py deleted file mode 100644 index db8e737690..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py +++ /dev/null @@ -1,617 +0,0 @@ -from functools import partial -from typing import Optional, List, Union -from pathlib import Path -import pandas as pd -import logging - -from allensdk.api.warehouse_cache.cache import Cache -from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ - .experiments_table import \ - ExperimentsTable -from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ - .sessions_table import \ - SessionsTable -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import ( # noqa: E501 - BehaviorProjectLimsApi, BehaviorProjectCloudApi) -from allensdk.api.warehouse_cache.caching_utilities import \ - one_file_call_caching, call_caching -from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ - .ophys_sessions_table import \ - BehaviorOphysSessionsTable -from allensdk.core.authentication import DbCredentials - - -class VBOLimsCache(Cache): - """ - A class that ineherits from the warehouse Cache and provides - that functionality to VisualBehaviorOphysProjectCache - """ - - MANIFEST_VERSION = "0.0.1-alpha.3" - OPHYS_SESSIONS_KEY = "ophys_sessions" - BEHAVIOR_SESSIONS_KEY = "behavior_sessions" - OPHYS_EXPERIMENTS_KEY = "ophys_experiments" - OPHYS_CELLS_KEY = "ophys_cells" - - MANIFEST_CONFIG = { - OPHYS_SESSIONS_KEY: { - "spec": f"{OPHYS_SESSIONS_KEY}.csv", - "parent_key": "BASEDIR", - "typename": "file" - }, - BEHAVIOR_SESSIONS_KEY: { - "spec": f"{BEHAVIOR_SESSIONS_KEY}.csv", - "parent_key": "BASEDIR", - "typename": "file" - }, - OPHYS_EXPERIMENTS_KEY: { - "spec": f"{OPHYS_EXPERIMENTS_KEY}.csv", - "parent_key": "BASEDIR", - "typename": "file" - }, - OPHYS_CELLS_KEY: { - "spec": f"{OPHYS_CELLS_KEY}.csv", - "parent_key": "BASEDIR", - "typename": "file" - } - } - - -class VisualBehaviorOphysProjectCache(object): - - def __init__( - self, - fetch_api: Optional[Union[BehaviorProjectLimsApi, - BehaviorProjectCloudApi]] = None, - fetch_tries: int = 2, - manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None, - cache: bool = True): - """ Entrypoint for accessing visual behavior data. Supports - access to summaries of session data and provides tools for - downloading detailed session data (such as dff traces). - - Likely you will want to use a class constructor, such as `from_lims`, - to initialize a VisualBehaviorOphysProjectCache, rather than calling - this directly. - - --- NOTE --- - Because NWB files are not currently supported for this project (as of - 11/2019), this cache will not actually save any files of session data - to the local machine. Only summary tables will be saved to the local - cache. File retrievals for specific sessions will be handled by - the fetch api used for the Session object, and cached in-memory - only to enable fast retrieval for subsequent calls. - - If you are looping over session objects, be sure to clean up - your memory when it is not needed by calling `cache_clear` from - your session object. - - Parameters - ========== - fetch_api : - Used to pull data from remote sources, after which it is locally - cached. Any object inheriting from BehaviorProjectBase is - suitable. Current options are: - BehaviorProjectLimsApi :: Fetches bleeding-edge data from the - Allen Institute"s internal database. Only works if you are - on our internal network. - fetch_tries : - Maximum number of times to attempt a download before giving up and - raising an exception. Note that this is total tries, not retries. - Default=2. - manifest : str or Path - full path at which manifest json will be stored. Defaults - to "behavior_project_manifest.json" in the local directory. - version : str - version of manifest file. If this mismatches the version - recorded in the file at manifest, an error will be raised. - Defaults to the manifest version in the class. - cache : bool - Whether to write to the cache. Default=True. - """ - if cache: - manifest_ = manifest or "behavior_project_manifest.json" - else: - manifest_ = None - - self.fetch_api = fetch_api - self.cache = None - - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - if cache: - self.cache = VBOLimsCache(manifest=manifest_, - version=version, - cache=cache) - self.fetch_tries = fetch_tries - self.logger = logging.getLogger(self.__class__.__name__) - - @property - def manifest(self): - if self.cache is None: - api_name = type(self.fetch_api).__name__ - raise NotImplementedError(f"A {type(self).__name__} " - f"based on {api_name} " - "does not have an accessible manifest " - "property") - return self.cache.manifest - - @classmethod - def from_s3_cache(cls, cache_dir: Union[str, Path], - bucket_name: str = "visual-behavior-ophys-data", - project_name: str = "visual-behavior-ophys" - ) -> "VisualBehaviorOphysProjectCache": - """instantiates this object with a connection to an s3 bucket and/or - a local cache related to that bucket. - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - bucket_name: str - for example, if bucket URI is 's3://mybucket' this value should be - 'mybucket' - - project_name: str - the name of the project this cache is supposed to access. This - project name is the first part of the prefix of the release data - objects. I.e. s3://<bucket_name>/<project_name>/<object tree> - - Returns - ------- - VisualBehaviorOphysProjectCache instance - - """ - fetch_api = BehaviorProjectCloudApi.from_s3_cache( - cache_dir, bucket_name, project_name, - ui_class_name=cls.__name__) - return cls(fetch_api=fetch_api) - - @classmethod - def from_local_cache( - cls, - cache_dir: Union[str, Path], - project_name: str = "visual-behavior-ophys", - use_static_cache: bool = False - ) -> "VisualBehaviorOphysProjectCache": - """instantiates this object with a local cache. - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - project_name: str - the name of the project this cache is supposed to access. This - project name is the first part of the prefix of the release data - objects. I.e. s3://<bucket_name>/<project_name>/<object tree> - - Returns - ------- - VisualBehaviorOphysProjectCache instance - - """ - fetch_api = BehaviorProjectCloudApi.from_local_cache( - cache_dir, - project_name, - ui_class_name=cls.__name__, - use_static_cache=use_static_cache - ) - return cls(fetch_api=fetch_api) - - @classmethod - def from_lims(cls, manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None, - cache: bool = False, - fetch_tries: int = 2, - lims_credentials: Optional[DbCredentials] = None, - mtrain_credentials: Optional[DbCredentials] = None, - host: Optional[str] = None, - scheme: Optional[str] = None, - asynchronous: bool = True, - data_release_date: Optional[Union[str, List[str]]] = None - ) -> "VisualBehaviorOphysProjectCache": - """ - Construct a VisualBehaviorOphysProjectCache with a lims api. Use this - method to create a VisualBehaviorOphysProjectCache instance rather - than calling VisualBehaviorOphysProjectCache directly. - - Parameters - ========== - manifest : str or Path - full path at which manifest json will be stored - version : str - version of manifest file. If this mismatches the version - recorded in the file at manifest, an error will be raised. - cache : bool - Whether to write to the cache - fetch_tries : int - Maximum number of times to attempt a download before giving up and - raising an exception. Note that this is total tries, not retries - lims_credentials : DbCredentials - Optional credentials to access LIMS database. - If not set, will look for credentials in environment variables. - mtrain_credentials: DbCredentials - Optional credentials to access mtrain database. - If not set, will look for credentials in environment variables. - host : str - Web host for the app_engine. Currently unused. This argument is - included for consistency with EcephysProjectCache.from_lims. - scheme : str - URI scheme, such as "http". Currently unused. This argument is - included for consistency with EcephysProjectCache.from_lims. - asynchronous : bool - Whether to fetch from web asynchronously. Currently unused. - data_release_date: str or list of str - Use to filter tables to only include data released on date - ie 2021-03-25 or ['2021-03-25', '2021-08-12'] - Returns - ======= - VisualBehaviorOphysProjectCache - VisualBehaviorOphysProjectCache instance with a LIMS fetch API - """ - if host and scheme: - app_kwargs = {"host": host, "scheme": scheme, - "asynchronous": asynchronous} - else: - app_kwargs = None - fetch_api = BehaviorProjectLimsApi.default( - lims_credentials=lims_credentials, - mtrain_credentials=mtrain_credentials, - data_release_date=data_release_date, - app_kwargs=app_kwargs) - return cls(fetch_api=fetch_api, manifest=manifest, version=version, - cache=cache, fetch_tries=fetch_tries) - - def _cache_not_implemented(self, method_name: str) -> None: - """ - Raise a NotImplementedError explaining that method_name - does not exist for VisualBehaviorOphysProjectCache - that does not have a fetch_api based on LIMS - """ - msg = f"Method {method_name} does not exist for this " - msg += f"{type(self).__name__}, which is based on " - msg += f"{type(self.fetch_api).__name__}" - raise NotImplementedError(msg) - - def construct_local_manifest(self) -> None: - """ - Construct the local file used to determine if two files are - duplicates of each other or not. Save it into the expected - place in the cache. (You will see a warning if the cache - thinks that you need to run this method). - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('construct_local_manifest') - self.fetch_api.cache.construct_local_manifest() - - def compare_manifests(self, - manifest_0_name: str, - manifest_1_name: str - ) -> str: - """ - Compare two manifests from this dataset. Return a dict - containing the list of metadata and data files that changed - between them - - Note: this assumes that manifest_0 predates manifest_1 - - Parameters - ---------- - manifest_0_name: str - - manifest_1_name: str - - Returns - ------- - str - A string summarizing all of the changes going from - manifest_0 to manifest_1 - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('compare_manifests') - return self.fetch_api.cache.compare_manifests(manifest_0_name, - manifest_1_name) - - def load_latest_manifest(self) -> None: - """ - Load the manifest corresponding to the most up to date - version of the dataset. - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('load_latest_manifest') - self.fetch_api.cache.load_latest_manifest() - - def latest_downloaded_manifest_file(self) -> str: - """ - Return the name of the most up to date data manifest - available on your local system. - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('latest_downloaded_manifest_file') - return self.fetch_api.cache.latest_downloaded_manifest_file - - def latest_manifest_file(self) -> str: - """ - Return the name of the most up to date data manifest - corresponding to this dataset, checking in the cloud - if this is a cloud-backed cache. - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('latest_manifest_file') - return self.fetch_api.cache.latest_manifest_file - - def load_manifest(self, manifest_name: str): - """ - Load a specific versioned manifest for this dataset. - - Parameters - ---------- - manifest_name: str - The name of the manifest to load. Must be an element in - self.manifest_file_names - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('load_manifest') - self.fetch_api.load_manifest(manifest_name) - - def list_all_downloaded_manifests(self) -> list: - """ - Return a sorted list of the names of the manifest files - that have been downloaded to this cache. - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('list_all_downloaded_manifests') - return self.fetch_api.cache.list_all_downloaded_manifests() - - def list_manifest_file_names(self) -> list: - """ - Return a sorted list of the names of the manifest files - associated with this dataset. - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('list_manifest_file_names') - return self.fetch_api.cache.manifest_file_names - - def current_manifest(self) -> Union[None, str]: - """ - Return the name of the dataset manifest currently being - used by this cache. - """ - if not isinstance(self.fetch_api, BehaviorProjectCloudApi): - self._cache_not_implemented('current_manifest') - return self.fetch_api.cache.current_manifest - - def get_ophys_session_table( - self, - suppress: Optional[List[str]] = None, - index_column: str = "ophys_session_id", - as_df=True, - include_behavior_data=True, - passed_only=True) -> \ - Union[pd.DataFrame, BehaviorOphysSessionsTable]: - """ - Return summary table of all ophys_session_ids in the database. - :param suppress: optional list of columns to drop from the resulting - dataframe. - :type suppress: list of str - :param index_column: (default="ophys_session_id"). Column to index - on, either - "ophys_session_id" or "ophys_experiment_id". - If index_column="ophys_experiment_id", then each row will only have - one experiment id, of type int (vs. an array of 1>more). - :type index_column: str - :param as_df: whether to return as df or as BehaviorOphysSessionsTable - :param include_behavior_data - Whether to include behavior data - :rtype: pd.DataFrame - """ - if isinstance(self.fetch_api, BehaviorProjectCloudApi): - return self.fetch_api.get_ophys_session_table() - if self.cache is not None: - path = self.cache.get_cache_path(None, - self.cache.OPHYS_SESSIONS_KEY) - ophys_sessions = one_file_call_caching( - path, - self.fetch_api.get_ophys_session_table, - _write_json, - lambda path: _read_json(path, index_name='ophys_session_id')) - else: - ophys_sessions = self.fetch_api.get_ophys_session_table() - - if include_behavior_data: - # Merge behavior data in - behavior_sessions_table = self.get_behavior_session_table( - suppress=suppress, as_df=True, include_ophys_data=False) - ophys_sessions = behavior_sessions_table.merge( - ophys_sessions, - left_index=True, - right_on='behavior_session_id', - suffixes=('_behavior', '_ophys')) - - sessions = BehaviorOphysSessionsTable(df=ophys_sessions, - suppress=suppress, - index_column=index_column) - if passed_only: - oet = self.get_ophys_experiment_table(passed_only=True) - for i in sessions.table.index: - sub_df = oet.query(f"ophys_session_id=={i}") - values = list(set(sub_df["ophys_container_id"].values)) - values.sort() - sessions.table.at[i, "ophys_container_id"] = values - - return sessions.table if as_df else sessions - - def get_ophys_experiment_table( - self, - suppress: Optional[List[str]] = None, - as_df=True, - passed_only=True) -> Union[pd.DataFrame, SessionsTable]: - """ - Return summary table of all ophys_experiment_ids in the database. - :param suppress: optional list of columns to drop from the resulting - dataframe. - :type suppress: list of str - :param as_df: whether to return as df or as SessionsTable - :param passed_only: if True, return only experiments flagged as - 'passed' and containers flagged as 'published' - (default=True) - :rtype: pd.DataFrame - """ - if isinstance(self.fetch_api, BehaviorProjectCloudApi): - return self.fetch_api.get_ophys_experiment_table() - if self.cache is not None: - path = self.cache.get_cache_path(None, - self.cache.OPHYS_EXPERIMENTS_KEY) - experiments = one_file_call_caching( - path, - self.fetch_api.get_ophys_experiment_table, - _write_json, - lambda path: _read_json(path, - index_name='ophys_experiment_id')) - else: - experiments = self.fetch_api.get_ophys_experiment_table() - - # Merge behavior data in - behavior_sessions_table = self.get_behavior_session_table( - suppress=suppress, as_df=True, include_ophys_data=False) - experiments = behavior_sessions_table.merge( - experiments, left_index=True, right_on='behavior_session_id', - suffixes=('_behavior', '_ophys')) - experiments = ExperimentsTable(df=experiments, - suppress=suppress, - passed_only=passed_only) - return experiments.table if as_df else experiments - - def get_ophys_cells_table(self) -> pd.DataFrame: - """ - Return summary table of all cells in this project cache - :rtype: pd.DataFrame - """ - if isinstance(self.fetch_api, BehaviorProjectCloudApi): - return self.fetch_api.get_ophys_cells_table() - if self.cache is not None: - path = self.cache.get_cache_path(None, - self.cache.OPHyS_CELLS_KEY) - ophys_cells_table = one_file_call_caching( - path, - self.fetch_api.get_ophys_cells_table, - _write_json, - lambda path: _read_json(path, - index_name='cell_roi_id')) - else: - ophys_cells_table = self.fetch_api.get_ophys_cells_table() - - return ophys_cells_table - - def get_behavior_session_table( - self, - suppress: Optional[List[str]] = None, - as_df=True, - include_ophys_data=True, - passed_only=True) -> Union[pd.DataFrame, SessionsTable]: - """ - Return summary table of all behavior_session_ids in the database. - :param suppress: optional list of columns to drop from the resulting - dataframe. - :param as_df: whether to return as df or as SessionsTable - :param include_ophys_data - Whether to include ophys data - :type suppress: list of str - :rtype: pd.DataFrame - """ - if isinstance(self.fetch_api, BehaviorProjectCloudApi): - return self.fetch_api.get_behavior_session_table() - if self.cache is not None: - path = self.cache.get_cache_path(None, - self.cache.BEHAVIOR_SESSIONS_KEY) - sessions = one_file_call_caching( - path, - self.fetch_api.get_behavior_session_table, - _write_json, - lambda path: _read_json(path, - index_name='behavior_session_id')) - else: - sessions = self.fetch_api.get_behavior_session_table() - - if include_ophys_data: - ophys_session_table = self.get_ophys_session_table( - suppress=suppress, - as_df=False, - include_behavior_data=False, - passed_only=passed_only) - else: - ophys_session_table = None - sessions = SessionsTable(df=sessions, suppress=suppress, - fetch_api=self.fetch_api, - ophys_session_table=ophys_session_table) - - return sessions.table if as_df else sessions - - def get_behavior_ophys_experiment(self, ophys_experiment_id: int, - fixed: bool = False): - """ - Note -- This method mocks the behavior of a cache. Future - development will include an NWB reader to read from - a true local cache (once nwb files are created). - TODO: Using `fixed` will raise a NotImplementedError since there - is no real cache. - """ - if fixed: - raise NotImplementedError - fetch_session = partial(self.fetch_api.get_behavior_ophys_experiment, - ophys_experiment_id) - return call_caching( - fetch_session, - lambda x: x, # not writing anything - lazy=False, # can't actually read from file cache - read=fetch_session - ) - - def get_behavior_session(self, behavior_session_id: int, - fixed: bool = False): - """ - Note -- This method mocks the behavior of a cache. Future - development will include an NWB reader to read from - a true local cache (once nwb files are created). - TODO: Using `fixed` will raise a NotImplementedError since there - is no real cache. - """ - if fixed: - raise NotImplementedError - - fetch_session = partial(self.fetch_api.get_behavior_session, - behavior_session_id) - return call_caching( - fetch_session, - lambda x: x, # not writing anything - lazy=False, # can't actually read from file cache - read=fetch_session - ) - - -def _write_json(path, df): - """Wrapper to change the arguments for saving a pandas json - dataframe so that it conforms to expectations of the internal - cache methods. Can't use partial with the native `to_json` method - because the dataframe is not yet created at the time we need to - pass in the save method. - Saves a dataframe in json format to `path`, in split orientation - to save space on disk. - Converts dates to seconds from epoch. - NOTE: Date serialization is a big pain. Make sure if columns - are being added, the _read_json is updated to properly deserialize - them back to the expected format by adding them to `convert_dates`. - In the future we could schematize this data using marshmallow - or something similar.""" - df.to_json(path, orient="split", date_unit="s", date_format="epoch") - - -def _read_json(path, index_name: Optional[str] = None): - """Reads a dataframe file written to the cache by _write_json.""" - df = pd.read_json(path, date_unit="s", orient="split", - convert_dates=["date_of_acquisition"]) - if index_name: - df = df.rename_axis(index=index_name) - return df diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/external/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/external/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py b/allensdk/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py deleted file mode 100644 index c46379bdad..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py +++ /dev/null @@ -1,220 +0,0 @@ -import argparse -import json -import logging -import os -import warnings -from typing import List, Union - -import pandas as pd - -import allensdk -from allensdk.brain_observatory.behavior.behavior_project_cache import \ - VisualBehaviorOphysProjectCache - -######### -# These columns should be dropped from external-facing metadata -######### -SESSION_SUPPRESS = ( - 'donor_id', - 'foraging_id', - 'session_name', - 'specimen_id' -) -OPHYS_EXPERIMENTS_SUPPRESS = SESSION_SUPPRESS + ( - 'behavior_session_uuid', - 'published_at', - 'isi_experiment_id' -) -OPHYS_EXPERIMENTS_SUPPRESS_FINAL = [ - 'container_workflow_state', - 'experiment_workflow_state'] -######### - -OUTPUT_METADATA_FILENAMES = { - 'behavior_session_table': 'behavior_session_table.csv', - 'ophys_session_table': 'ophys_session_table.csv', - 'ophys_experiment_table': 'ophys_experiment_table.csv', - 'ophys_cells_table': 'ophys_cells_table.csv' -} - - -class BehaviorProjectMetadataWriter: - """Class to write project-level metadata to csv""" - - def __init__(self, behavior_project_cache: VisualBehaviorOphysProjectCache, - out_dir: str, project_name: str, - data_release_date: Union[str, List[str]], - overwrite_ok=False): - - self._behavior_project_cache = behavior_project_cache - self._out_dir = out_dir - self._project_name = project_name - self._data_release_date = data_release_date - self._overwrite_ok = overwrite_ok - self._logger = logging.getLogger(self.__class__.__name__) - - self._release_behavior_only_nwb = self._behavior_project_cache \ - .fetch_api.get_release_files(file_type='BehaviorNwb') - self._release_behavior_with_ophys_nwb = self._behavior_project_cache \ - .fetch_api.get_release_files(file_type='BehaviorOphysNwb') - - def write_metadata(self): - """Writes metadata to csv""" - os.makedirs(self._out_dir, exist_ok=True) - - self._write_behavior_sessions() - self._write_ophys_sessions() - self._write_ophys_experiments() - self._write_ophys_cells() - - self._write_manifest() - - def _write_behavior_sessions(self, suppress=SESSION_SUPPRESS, - output_filename=OUTPUT_METADATA_FILENAMES[ - 'behavior_session_table']): - behavior_sessions = self._behavior_project_cache. \ - get_behavior_session_table(suppress=suppress, - as_df=True) - - # Add release files - behavior_sessions = behavior_sessions \ - .merge(self._release_behavior_only_nwb, - left_index=True, - right_index=True, - how='left') - if "file_id" in behavior_sessions.columns: - if behavior_sessions["file_id"].isnull().values.any(): - msg = (f"{output_filename} field `file_id` contains missing " - "values and pandas.to_csv() converts it to float") - warnings.warn(msg) - self._write_metadata_table(df=behavior_sessions, - filename=output_filename) - - def _write_ophys_cells(self, - output_filename=OUTPUT_METADATA_FILENAMES[ - 'ophys_cells_table']): - ophys_cells = self._behavior_project_cache. \ - get_ophys_cells_table() - self._write_metadata_table(df=ophys_cells, - filename=output_filename) - - def _write_ophys_sessions(self, suppress=SESSION_SUPPRESS, - output_filename=OUTPUT_METADATA_FILENAMES[ - 'ophys_session_table' - ]): - ophys_sessions = self._behavior_project_cache. \ - get_ophys_session_table(suppress=suppress, as_df=True) - self._write_metadata_table(df=ophys_sessions, - filename=output_filename) - - def _write_ophys_experiments(self, suppress=OPHYS_EXPERIMENTS_SUPPRESS, - output_filename=OUTPUT_METADATA_FILENAMES[ - 'ophys_experiment_table' - ]): - ophys_experiments = \ - self._behavior_project_cache.get_ophys_experiment_table( - suppress=suppress, as_df=True) - - # Add release files - ophys_experiments = ophys_experiments.merge( - self._release_behavior_with_ophys_nwb - .drop('behavior_session_id', axis=1), - left_index=True, - right_index=True, - how='left') - - # users don't need to see these - ophys_experiments.drop( - labels=OPHYS_EXPERIMENTS_SUPPRESS_FINAL, - inplace=True, - axis=1) - - self._write_metadata_table(df=ophys_experiments, - filename=output_filename) - - def _write_metadata_table(self, df: pd.DataFrame, filename: str): - """ - Writes file to csv - - Parameters - ---------- - df - The dataframe to write - filename - Filename to save as - """ - filepath = os.path.join(self._out_dir, filename) - self._pre_file_write(filepath=filepath) - - self._logger.info(f'Writing {filepath}') - - df = df.reset_index() - df.to_csv(filepath, index=False) - - self._logger.info('Writing successful') - - def _write_manifest(self): - def get_abs_path(filename): - return os.path.abspath(os.path.join(self._out_dir, filename)) - - metadata_filenames = OUTPUT_METADATA_FILENAMES.values() - metadata_files = [get_abs_path(f) for f in metadata_filenames] - data_pipeline = [{ - 'name': 'AllenSDK', - 'version': allensdk.__version__, - 'comment': 'AllenSDK version used to produce data NWB and ' - 'metadata CSV files for this release' - }] - - manifest = { - 'metadata_files': metadata_files, - 'data_pipeline_metadata': data_pipeline, - 'project_name': self._project_name, - } - - save_path = os.path.join(self._out_dir, 'manifest.json') - self._pre_file_write(filepath=save_path) - - with open(save_path, 'w') as f: - f.write(json.dumps(manifest, indent=4)) - - def _pre_file_write(self, filepath: str): - """Checks if file exists at filepath. If so, and overwrite_ok is False, - raises an exception""" - if os.path.exists(filepath): - if self._overwrite_ok: - pass - else: - raise RuntimeError(f'{filepath} already exists. In order ' - f'to overwrite this file, pass the ' - f'--overwrite_ok flag') - - -def main(): - parser = argparse.ArgumentParser(description='Write project metadata to ' - 'csvs') - parser.add_argument('--out_dir', help='directory to save csvs', - required=True) - parser.add_argument('--project_name', help='project name', required=True) - parser.add_argument('--data_release_date', help='Project release date. ' - 'Ie 2021-03-25', - required=True, - nargs="+") - parser.add_argument('--overwrite_ok', help='Whether to allow overwriting ' - 'existing output files', - dest='overwrite_ok', action='store_true') - args = parser.parse_args() - - bpc = VisualBehaviorOphysProjectCache.from_lims( - data_release_date=args.data_release_date) - bpmw = BehaviorProjectMetadataWriter( - behavior_project_cache=bpc, - out_dir=args.out_dir, - project_name=args.project_name, - data_release_date=args.data_release_date, - overwrite_ok=args.overwrite_ok) - bpmw.write_metadata() - - -if __name__ == '__main__': - main() diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py deleted file mode 100644 index 53b4621b76..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.abcs.behavior_project_base import BehaviorProjectBase # noqa: F401, E501 diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py deleted file mode 100644 index 7f701aa27a..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py +++ /dev/null @@ -1,67 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Iterable - -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( - BehaviorOphysExperiment) -from allensdk.brain_observatory.behavior.behavior_session import ( - BehaviorSession) -import pandas as pd - - -class BehaviorProjectBase(ABC): - @abstractmethod - def get_behavior_ophys_experiment(self, ophys_experiment_id: int - ) -> BehaviorOphysExperiment: - """Returns a BehaviorOphysExperiment object that contains methods - to analyze a single behavior+ophys session. - :param ophys_experiment_id: id that corresponds to an ophys experiment - :type ophys_experiment_id: int - :rtype: BehaviorOphysExperiment - """ - pass - - @abstractmethod - def get_ophys_session_table(self) -> pd.DataFrame: - """Return a pd.Dataframe table with all ophys_session_ids and relevant - metadata.""" - pass - - @abstractmethod - def get_behavior_session( - self, behavior_session_id: int) -> BehaviorSession: - """Returns a BehaviorSession object that contains methods to - analyze a single behavior session. - :param behavior_session_id: id that corresponds to a behavior session - :type behavior_session_id: int - :rtype: BehaviorSession - """ - pass - - @abstractmethod - def get_behavior_session_table(self) -> pd.DataFrame: - """Returns a pd.DataFrame table with all behavior session_ids to the - user with additional metadata. - :rtype: pd.DataFrame - """ - pass - - @abstractmethod - def get_natural_movie_template(self, number: int) -> Iterable[bytes]: - """ Download a template for the natural movie stimulus. This is the - actual movie that was shown during the recording session. - :param number: identifier for this scene - :type number: int - :returns: An iterable yielding an npy file as bytes - """ - pass - - @abstractmethod - def get_natural_scene_template(self, number: int) -> Iterable[bytes]: - """Download a template for the natural scene stimulus. This is the - actual image that was shown during the recording session. - :param number: idenfifier for this movie (note that this is an int, - so to get the template for natural_movie_three should pass 3) - :type number: int - :returns: iterable yielding a tiff file as bytes - """ - pass diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py deleted file mode 100644 index 929b6e69e1..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io.behavior_project_lims_api import BehaviorProjectLimsApi # noqa: F401, E501 -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io.behavior_project_cloud_api import BehaviorProjectCloudApi # noqa: F401, E501 diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py deleted file mode 100644 index 0979334dbd..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py +++ /dev/null @@ -1,402 +0,0 @@ -import pandas as pd -from typing import Iterable, Union, List, Optional -from pathlib import Path -import logging -import ast -import semver - -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.abcs import BehaviorProjectBase # noqa: E501 -from allensdk.brain_observatory.behavior.behavior_session import ( - BehaviorSession) -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( - BehaviorOphysExperiment) -from allensdk.api.cloud_cache.cloud_cache import ( - S3CloudCache, LocalCache, StaticLocalCache) - - -# [min inclusive, max exclusive) -MANIFEST_COMPATIBILITY = ["1.0.0", "2.0.0"] - - -class BehaviorCloudCacheVersionException(Exception): - pass - - -def version_check(manifest_version: str, - data_pipeline_version: str, - cmin: str = MANIFEST_COMPATIBILITY[0], - cmax: str = MANIFEST_COMPATIBILITY[1]): - mver_parsed = semver.VersionInfo.parse(manifest_version) - cmin_parsed = semver.VersionInfo.parse(cmin) - cmax_parsed = semver.VersionInfo.parse(cmax) - if (mver_parsed < cmin_parsed) | (mver_parsed >= cmax_parsed): - estr = (f"the manifest has manifest_version {manifest_version} but " - "this version of AllenSDK is compatible only with manifest " - f"versions {cmin} <= X < {cmax}. \n" - "Consider using a version of AllenSDK closer to the version " - f"used to release the data: {data_pipeline_version}") - raise BehaviorCloudCacheVersionException(estr) - - -def literal_col_eval(df: pd.DataFrame, - columns: List[str] = ["ophys_experiment_id", - "ophys_container_id", - "driver_line"]) -> pd.DataFrame: - def converter(x): - if isinstance(x, str): - x = ast.literal_eval(x) - return x - - for column in columns: - if column in df.columns: - df.loc[df[column].notnull(), column] = \ - df[column][df[column].notnull()].apply(converter) - return df - - -class BehaviorProjectCloudApi(BehaviorProjectBase): - """API for downloading data released on S3 and returning tables. - - Parameters - ---------- - cache: S3CloudCache - an instantiated S3CloudCache object, which has already run - `self.load_manifest()` which populates the columns: - - metadata_file_names - - file_id_column - skip_version_check: bool - whether to skip the version checking of pipeline SDK version - vs. running SDK version, which may raise Exceptions. (default=False) - local: bool - Whether to operate in local mode, where no data will be downloaded - and instead will be loaded from local - """ - def __init__( - self, - cache: Union[S3CloudCache, LocalCache, StaticLocalCache], - skip_version_check: bool = False, - local: bool = False - ): - - self.cache = cache - self.skip_version_check = skip_version_check - self._local = local - self.load_manifest() - - def load_manifest(self, manifest_name: Optional[str] = None): - """ - Load the specified manifest file into the CloudCache - - Parameters - ---------- - manifest_name: Optional[str] - Name of manifest file to load. If None, load latest - (default: None) - """ - if manifest_name is None: - self.cache.load_last_manifest() - else: - self.cache.load_manifest(manifest_name) - - expected_metadata = set(["behavior_session_table", - "ophys_session_table", - "ophys_experiment_table", - "ophys_cells_table"]) - - if self.cache._manifest.metadata_file_names is None: - raise RuntimeError("S3CloudCache object has no metadata " - "file names. BehaviorProjectCloudApi " - "expects a S3CloudCache passed which " - "has already run load_manifest()") - cache_metadata = set(self.cache._manifest.metadata_file_names) - - if cache_metadata != expected_metadata: - raise RuntimeError("expected S3CloudCache object to have " - f"metadata file names: {expected_metadata} " - f"but it has {cache_metadata}") - - if not self.skip_version_check: - data_sdk_version = [i for i in self.cache._manifest._data_pipeline - if i['name'] == "AllenSDK"][0]["version"] - version_check(self.cache._manifest.version, data_sdk_version) - - # version_check(self.cache._manifest._data_pipeline) - self.logger = logging.getLogger("BehaviorProjectCloudApi") - self._get_ophys_session_table() - self._get_behavior_session_table() - self._get_ophys_experiment_table() - self._get_ophys_cells_table() - - @staticmethod - def from_s3_cache(cache_dir: Union[str, Path], - bucket_name: str, - project_name: str, - ui_class_name: str) -> "BehaviorProjectCloudApi": - """instantiates this object with a connection to an s3 bucket and/or - a local cache related to that bucket. - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - bucket_name: str - for example, if bucket URI is 's3://mybucket' this value should be - 'mybucket' - - project_name: str - the name of the project this cache is supposed to access. This - project name is the first part of the prefix of the release data - objects. I.e. s3://<bucket_name>/<project_name>/<object tree> - - ui_class_name: str - Name of user interface class (used to populate error messages) - - Returns - ------- - BehaviorProjectCloudApi instance - - """ - cache = S3CloudCache(cache_dir, - bucket_name, - project_name, - ui_class_name=ui_class_name) - return BehaviorProjectCloudApi(cache) - - @staticmethod - def from_local_cache( - cache_dir: Union[str, Path], - project_name: str, - ui_class_name: str, - use_static_cache: bool = False - ) -> "BehaviorProjectCloudApi": - """instantiates this object with a local cache. - - Parameters - ---------- - cache_dir: str or pathlib.Path - Path to the directory where data will be stored on the local system - - project_name: str - the name of the project this cache is supposed to access. This - project name is the first part of the prefix of the release data - objects. I.e. s3://<bucket_name>/<project_name>/<object tree> - - ui_class_name: str - Name of user interface class (used to populate error messages) - - Returns - ------- - BehaviorProjectCloudApi instance - - """ - if use_static_cache: - cache = StaticLocalCache( - cache_dir, - project_name, - ui_class_name=ui_class_name - ) - else: - cache = LocalCache( - cache_dir, - project_name, - ui_class_name=ui_class_name - ) - return BehaviorProjectCloudApi(cache, local=True) - - def get_behavior_session( - self, behavior_session_id: int) -> BehaviorSession: - """get a BehaviorSession by specifying behavior_session_id - - Parameters - ---------- - behavior_session_id: int - the id of the behavior_session - - Returns - ------- - BehaviorSession - - Notes - ----- - entries in the _behavior_session_table represent - (1) ophys_sessions which have a many-to-one mapping between nwb files - and behavior sessions. (file_id is NaN) - AND - (2) behavior only sessions, which have a one-to-one mapping with - nwb files. (file_id is not Nan) - In the case of (1) this method returns an object which is just behavior - data which is shared by all experiments in 1 session. This is extracted - from the nwb file for the first-listed ophys_experiment. - - """ - row = self._behavior_session_table.query( - f"behavior_session_id=={behavior_session_id}") - if row.shape[0] != 1: - raise RuntimeError("The behavior_session_table should have " - "1 and only 1 entry for a given " - "behavior_session_id. For " - f"{behavior_session_id} " - f" there are {row.shape[0]} entries.") - row = row.squeeze() - has_file_id = not pd.isna(row[self.cache.file_id_column]) - if not has_file_id: - oeid = row.ophys_experiment_id[0] - row = self._ophys_experiment_table.query(f"index=={oeid}") - file_id = str(int(row[self.cache.file_id_column])) - data_path = self._get_data_path(file_id=file_id) - return BehaviorSession.from_nwb_path(str(data_path)) - - def get_behavior_ophys_experiment(self, ophys_experiment_id: int - ) -> BehaviorOphysExperiment: - """get a BehaviorOphysExperiment by specifying ophys_experiment_id - - Parameters - ---------- - ophys_experiment_id: int - the id of the ophys_experiment - - Returns - ------- - BehaviorOphysExperiment - - """ - row = self._ophys_experiment_table.query( - f"index=={ophys_experiment_id}") - if row.shape[0] != 1: - raise RuntimeError("The behavior_ophys_experiment_table should " - "have 1 and only 1 entry for a given " - f"ophys_experiment_id. For " - f"{ophys_experiment_id} " - f" there are {row.shape[0]} entries.") - file_id = str(int(row[self.cache.file_id_column])) - data_path = self._get_data_path(file_id=file_id) - return BehaviorOphysExperiment.from_nwb_path( - str(data_path)) - - def _get_ophys_session_table(self): - session_table_path = self._get_metadata_path( - fname="ophys_session_table") - df = literal_col_eval(pd.read_csv(session_table_path)) - self._ophys_session_table = df.set_index("ophys_session_id") - - def get_ophys_session_table(self) -> pd.DataFrame: - """Return a pd.Dataframe table summarizing ophys_sessions - and associated metadata. - - Notes - ----- - - Each entry in this table represents the metadata of an ophys_session. - Link to nwb-hosted files in the cache is had via the - 'ophys_experiment_id' column (can be a list) - and experiment_table - """ - return self._ophys_session_table - - def _get_behavior_session_table(self): - session_table_path = self._get_metadata_path( - fname='behavior_session_table') - df = literal_col_eval(pd.read_csv(session_table_path)) - self._behavior_session_table = df.set_index("behavior_session_id") - - def get_behavior_session_table(self) -> pd.DataFrame: - """Return a pd.Dataframe table with both behavior-only - (BehaviorSession) and with-ophys (BehaviorOphysExperiment) - sessions as entries. - - Notes - ----- - - In the first case, provides a critical mapping of - behavior_session_id to file_id, which the cache uses to find the - nwb path in cache. - - In the second case, provides a critical mapping of - behavior_session_id to a list of ophys_experiment_id(s) - which can be used to find file_id mappings in ophys_experiment_table - see method get_behavior_session() - """ - return self._behavior_session_table - - def _get_ophys_experiment_table(self): - experiment_table_path = self._get_metadata_path( - fname="ophys_experiment_table") - df = literal_col_eval(pd.read_csv(experiment_table_path)) - self._ophys_experiment_table = df.set_index("ophys_experiment_id") - - def _get_ophys_cells_table(self): - ophys_cells_table_path = self._get_metadata_path( - fname="ophys_cells_table") - df = literal_col_eval(pd.read_csv(ophys_cells_table_path)) - # NaN's for invalid cells force this to float, push to int - df['cell_specimen_id'] = pd.array(df['cell_specimen_id'], - dtype="Int64") - self._ophys_cells_table = df.set_index("cell_roi_id") - - def get_ophys_cells_table(self): - return self._ophys_cells_table - - def get_ophys_experiment_table(self): - """returns a pd.DataFrame where each entry has a 1-to-1 - relation with an ophys experiment (i.e. imaging plane) - - Notes - ----- - - the file_id column allows the underlying cache to link - this table to a cache-hosted NWB file. There is a 1-to-1 - relation between nwb files and ophy experiments. See method - get_behavior_ophys_experiment() - """ - return self._ophys_experiment_table - - def get_natural_movie_template(self, number: int) -> Iterable[bytes]: - """ Download a template for the natural movie stimulus. This is the - actual movie that was shown during the recording session. - :param number: identifier for this scene - :type number: int - :returns: An iterable yielding an npy file as bytes - """ - raise NotImplementedError() - - def get_natural_scene_template(self, number: int) -> Iterable[bytes]: - """Download a template for the natural scene stimulus. This is the - actual image that was shown during the recording session. - :param number: idenfifier for this movie (note that this is an int, - so to get the template for natural_movie_three should pass 3) - :type number: int - :returns: iterable yielding a tiff file as bytes - """ - raise NotImplementedError() - - def _get_metadata_path(self, fname: str): - if self._local: - path = self._get_local_path(fname=fname) - else: - path = self.cache.download_metadata(fname=fname) - return path - - def _get_data_path(self, file_id: str): - if self._local: - data_path = self._get_local_path(file_id=file_id) - else: - data_path = self.cache.download_data(file_id=file_id) - return data_path - - def _get_local_path(self, fname: Optional[str] = None, file_id: - Optional[str] = None): - if fname is None and file_id is None: - raise ValueError('Must pass either fname or file_id') - - if fname is not None and file_id is not None: - raise ValueError('Must pass only one of fname or file_id') - - if fname is not None: - path = self.cache.metadata_path(fname=fname) - else: - path = self.cache.data_path(file_id=file_id) - - exists = path['exists'] - local_path = path['local_path'] - if not exists: - raise FileNotFoundError(f'You started a cache without a ' - f'connection to s3 and {local_path} is ' - 'not already on your system') - return local_path diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py deleted file mode 100644 index 99b8b02e1b..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py +++ /dev/null @@ -1,637 +0,0 @@ -import pandas as pd -from typing import Optional, List, Dict, Any, Iterable, Union -import logging - -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.abcs import BehaviorProjectBase # noqa: E501 -from allensdk.brain_observatory.behavior.behavior_session import ( - BehaviorSession) -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( - BehaviorOphysExperiment) -from allensdk.internal.api import db_connection_creator -from allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine \ - import (HttpEngine) -from allensdk.core.typing import SupportsStr -from allensdk.core.authentication import DbCredentials -from allensdk.core.auth_config import ( - MTRAIN_DB_CREDENTIAL_MAP, LIMS_DB_CREDENTIAL_MAP) - - -class BehaviorProjectLimsApi(BehaviorProjectBase): - def __init__(self, lims_engine, mtrain_engine, app_engine, - data_release_date: Optional[Union[str, List[str]]] = None): - """ Downloads visual behavior data from the Allen Institute's - internal Laboratory Information Management System (LIMS). Only - functional if connected to the Allen Institute Network. Used to load - data into BehaviorProjectCache. - - Typically want to construct an instance of this class by calling - `BehaviorProjectLimsApi.default()`. - - Set log level to debug to see SQL queries dumped by - "BehaviorProjectLimsApi" logger. - - Note -- Currently the app engine is unused because we aren't yet - supporting the download of stimulus templates for visual behavior - data. This feature will be added at a later date. - - Parameters - ---------- - lims_engine : - used for making queries against the LIMS postgres database. Must - implement: - select : takes a postgres query as a string. Returns a pandas - dataframe of results - fetchall : takes a postgres query as a string. If there is - exactly one column in the response, return the values as a - list. - mtrain_engine : - used for making queries against the mtrain postgres database. Must - implement: - select : takes a postgres query as a string. Returns a pandas - dataframe of results - fetchall : takes a postgres query as a string. If there is - exactly one column in the response, return the values as a - list. - app_engine : - used for making queries agains the lims web application. Must - implement: - stream : takes a url as a string. Returns an iterable yielding - the response body as bytes. - data_release_date: str or list of str - Use to filter tables to only include data released on date - ie 2021-03-25 or ['2021-03-25', '2021-08-12'] - """ - self.lims_engine = lims_engine - self.mtrain_engine = mtrain_engine - self.app_engine = app_engine - self.data_release_date = data_release_date - self.logger = logging.getLogger("BehaviorProjectLimsApi") - - @classmethod - def default( - cls, - lims_credentials: Optional[DbCredentials] = None, - mtrain_credentials: Optional[DbCredentials] = None, - app_kwargs: Optional[Dict[str, Any]] = None, - data_release_date: Optional[Union[str, List[str]]] = None) -> \ - "BehaviorProjectLimsApi": - """Construct a BehaviorProjectLimsApi instance with default - postgres and app engines. - - Parameters - ---------- - lims_credentials: Optional[DbCredentials] - Credentials to pass to the postgres connector to the lims database. - If left unspecified, will check environment variables for the - appropriate values. - mtrain_credentials: Optional[DbCredentials] - Credentials to pass to the postgres connector to the mtrain - database. If left unspecified, will check environment variables - for the appropriate values. - data_release_date: Optional[Union[str, List[str]] - Filters tables to include only data released on date - ie 2021-03-25 or ['2021-03-25', '2021-08-12'] - app_kwargs: Dict - Dict of arguments to pass to the app engine. Currently unused. - - Returns - ------- - BehaviorProjectLimsApi - """ - - _app_kwargs = {"scheme": "http", "host": "lims2"} - if app_kwargs: - _app_kwargs.update(app_kwargs) - - lims_engine = db_connection_creator( - credentials=lims_credentials, - fallback_credentials=LIMS_DB_CREDENTIAL_MAP) - mtrain_engine = db_connection_creator( - credentials=mtrain_credentials, - fallback_credentials=MTRAIN_DB_CREDENTIAL_MAP) - - app_engine = HttpEngine(**_app_kwargs) - return cls(lims_engine, mtrain_engine, app_engine, - data_release_date=data_release_date) - - @staticmethod - def _build_in_list_selector_query( - col, - valid_list: Optional[SupportsStr] = None, - operator: str = "WHERE") -> str: - """ - Filter for rows where the value of a column is contained in a list. - If no list is specified in `valid_list`, return an empty string. - - NOTE: if string ids are used, then the strings in `valid_list` must - be enclosed in single quotes, or else the query will throw a column - does not exist error. E.g. ["'mystringid1'", "'mystringid2'"...] - - :param col: name of column to compare if in a list - :type col: str - :param valid_list: iterable of values that can be mapped to str - (e.g. string, int, float). - :type valid_list: list - :param operator: SQL operator to start the clause. Default="WHERE". - Valid inputs: "AND", "OR", "WHERE" (not case-sensitive). - :type operator: str - """ - if not valid_list: - return "" - session_query = ( - f"""{operator} {col} IN ({",".join( - sorted(set(map(str, valid_list))))})""") - return session_query - - def _build_experiment_from_session_query(self) -> str: - """Aggregate sql sub-query to get all ophys_experiment_ids associated - with a single ophys_session_id.""" - if self.data_release_date: - release_filter = self._get_ophys_experiment_release_filter() - else: - release_filter = '' - query = f""" - -- -- begin getting all ophys_experiment_ids -- -- - SELECT - (ARRAY_AGG(DISTINCT(oe.id))) AS experiment_ids, os.id - FROM ophys_sessions os - RIGHT JOIN ophys_experiments oe ON oe.ophys_session_id = os.id - {release_filter} - GROUP BY os.id - -- -- end getting all ophys_experiment_ids -- -- - """ - return query - - def _build_container_from_session_query(self) -> str: - """Aggregate sql sub-query to get all ophys_container_ids associated - with a single ophys_session_id.""" - if self.data_release_date: - release_filter = self._get_ophys_experiment_release_filter() - else: - release_filter = '' - query = f""" - -- -- begin getting all ophys_container_ids -- -- - SELECT - (ARRAY_AGG( - DISTINCT(oec.visual_behavior_experiment_container_id)) - ) AS container_ids, os.id - FROM ophys_experiments_visual_behavior_experiment_containers oec - JOIN visual_behavior_experiment_containers vbc - ON oec.visual_behavior_experiment_container_id = vbc.id - JOIN ophys_experiments oe ON oe.id = oec.ophys_experiment_id - JOIN ophys_sessions os ON os.id = oe.ophys_session_id - {release_filter} - GROUP BY os.id - -- -- end getting all ophys_container_ids -- -- - """ - return query - - @staticmethod - def _build_line_from_donor_query(line="driver") -> str: - """Sub-query to get a line from a donor. - :param line: 'driver' or 'reporter' - """ - query = f""" - -- -- begin getting {line} line from donors -- -- - SELECT ARRAY_AGG (g.name) AS {line}_line, d.id AS donor_id - FROM donors d - LEFT JOIN donors_genotypes dg ON dg.donor_id=d.id - LEFT JOIN genotypes g ON g.id=dg.genotype_id - LEFT JOIN genotype_types gt ON gt.id=g.genotype_type_id - WHERE gt.name='{line}' - GROUP BY d.id - -- -- end getting {line} line from donors -- -- - """ - return query - - def _get_behavior_summary_table(self) -> pd.DataFrame: - """Build and execute query to retrieve summary data for all data, - or a subset of session_ids (via the session_sub_query). - Should pass an empty string to `session_sub_query` if want to get - all data in the database. - :rtype: pd.DataFrame - """ - query = f""" - SELECT - bs.id AS behavior_session_id, - equipment.name as equipment_name, - bs.date_of_acquisition, - d.id as donor_id, - d.full_genotype, - d.external_donor_name AS mouse_id, - reporter.reporter_line, - driver.driver_line, - g.name AS sex, - DATE_PART('day', bs.date_of_acquisition - d.date_of_birth) - AS age_in_days, - bs.foraging_id - FROM behavior_sessions bs - JOIN donors d on bs.donor_id = d.id - JOIN genders g on g.id = d.gender_id - LEFT OUTER JOIN ( - {self._build_line_from_donor_query("reporter")} - ) reporter on reporter.donor_id = d.id - LEFT OUTER JOIN ( - {self._build_line_from_donor_query("driver")} - ) driver on driver.donor_id = d.id - LEFT OUTER JOIN equipment ON equipment.id = bs.equipment_id - """ - - if self.data_release_date is not None: - query += self._get_behavior_session_release_filter() - - self.logger.debug(f"get_behavior_session_table query: \n{query}") - return self.lims_engine.select(query) - - def _get_foraging_ids_from_behavior_session( - self, behavior_session_ids: List[int]) -> List[str]: - behav_ids = self._build_in_list_selector_query("id", - behavior_session_ids, - operator="AND") - forag_ids_query = f""" - SELECT foraging_id - FROM behavior_sessions - WHERE foraging_id IS NOT NULL - {behav_ids}; - """ - self.logger.debug("get_foraging_ids_from_behavior_session query: \n" - f"{forag_ids_query}") - foraging_ids = self.lims_engine.fetchall(forag_ids_query) - - self.logger.debug(f"Retrieved {len(foraging_ids)} foraging ids for" - f" behavior stage query. Ids = {foraging_ids}") - return foraging_ids - - def _get_behavior_stage_table( - self, - behavior_session_ids: Optional[List[int]] = None): - # Select fewer rows if possible via behavior_session_id - if behavior_session_ids: - foraging_ids = self._get_foraging_ids_from_behavior_session( - behavior_session_ids) - foraging_ids = [f"'{fid}'" for fid in foraging_ids] - # Otherwise just get the full table from mtrain - else: - foraging_ids = None - - foraging_ids_query = self._build_in_list_selector_query( - "bs.id", foraging_ids) - - query = f""" - SELECT - stages.name as session_type, - bs.id AS foraging_id - FROM behavior_sessions bs - JOIN stages ON stages.id = bs.state_id - {foraging_ids_query}; - """ - self.logger.debug(f"_get_behavior_stage_table query: \n {query}") - return self.mtrain_engine.select(query) - - def get_behavior_stage_parameters(self, - foraging_ids: List[str]) -> pd.Series: - """Gets the stage parameters for each foraging id from mtrain - - Parameters - ---------- - foraging_ids - List of foraging ids - - - Returns - --------- - Series with index of foraging id and values stage parameters - """ - foraging_ids_query = self._build_in_list_selector_query( - "bs.id", foraging_ids) - - query = f""" - SELECT - bs.id AS foraging_id, - stages.parameters as stage_parameters - FROM behavior_sessions bs - JOIN stages ON stages.id = bs.state_id - {foraging_ids_query}; - """ - df = self.mtrain_engine.select(query) - df = df.set_index('foraging_id') - return df['stage_parameters'] - - def get_behavior_ophys_experiment(self, ophys_experiment_id: int - ) -> BehaviorOphysExperiment: - """Returns a BehaviorOphysExperiment object that contains methods - to analyze a single behavior+ophys session. - :param ophys_experiment_id: id that corresponds to an ophys experiment - :type ophys_experiment_id: int - :rtype: BehaviorOphysExperiment - """ - return BehaviorOphysExperiment.from_lims( - ophys_experiment_id=ophys_experiment_id) - - def _get_ophys_experiment_table(self) -> pd.DataFrame: - """ - Helper function for easier testing. - Return a pd.Dataframe table with all ophys_experiment_ids and relevant - metadata. - Return columns: ophys_session_id, behavior_session_id, - ophys_experiment_id, project_code, session_name, - session_type, equipment_name, date_of_acquisition, - specimen_id, full_genotype, sex, age_in_days, - reporter_line, driver_line, mouse_id - - :rtype: pd.DataFrame - """ - query = """ - SELECT - oe.id as ophys_experiment_id, - os.id as ophys_session_id, - os.stimulus_name as session_type, - bs.id as behavior_session_id, - oec.visual_behavior_experiment_container_id as - ophys_container_id, - pr.code as project_code, - vbc.workflow_state as container_workflow_state, - oe.workflow_state as experiment_workflow_state, - os.name as session_name, - os.date_of_acquisition, - os.isi_experiment_id, - id.depth as imaging_depth, - st.acronym as targeted_structure, - vbc.published_at - FROM ophys_experiments_visual_behavior_experiment_containers oec - JOIN visual_behavior_experiment_containers vbc - ON oec.visual_behavior_experiment_container_id = vbc.id - JOIN ophys_experiments oe ON oe.id = oec.ophys_experiment_id - JOIN ophys_sessions os ON os.id = oe.ophys_session_id - JOIN behavior_sessions bs ON os.id = bs.ophys_session_id - LEFT OUTER JOIN projects pr ON pr.id = os.project_id - LEFT JOIN imaging_depths id ON id.id = oe.imaging_depth_id - JOIN structures st ON st.id = oe.targeted_structure_id - """ - - if self.data_release_date is not None: - query += self._get_ophys_experiment_release_filter() - - self.logger.debug(f"get_ophys_experiment_table query: \n{query}") - return self.lims_engine.select(query) - - def _get_ophys_cells_table(self): - """ - Helper function for easier testing. - Return a pd.Dataframe table with all cell_roi_id and associated - cell_specimen_id and ophys_experiment_id - metadata. - Return columns: ophys_experiment_id, - cell_roi_id, - cell_specimen_id - - :rtype: pd.DataFrame - """ - query = """ - SELECT - cr.id as cell_roi_id, - cr.cell_specimen_id, - cr.ophys_experiment_id - FROM cell_rois AS cr - JOIN ophys_cell_segmentation_runs AS ocsr - ON ocsr.id=cr.ophys_cell_segmentation_run_id - JOIN ophys_experiments AS oe - ON oe.id=cr.ophys_experiment_id - """ - if self.data_release_date is not None: - query += self._get_ophys_experiment_release_filter() - query += "\nAND cr.valid_roi = True" - else: - query += "\nWHERE cr.valid_roi = True" - query += "\nAND ocsr.current=True" - - self.logger.debug(f"get_ophys_experiment_table query: \n{query}") - df = self.lims_engine.select(query) - - # NaN's for invalid cells force this to float, push to int - df['cell_specimen_id'] = pd.array(df['cell_specimen_id'], - dtype="Int64") - return df - - def get_ophys_cells_table(self): - df = self._get_ophys_cells_table() - df = df.set_index("cell_roi_id") - return df - - def _get_ophys_session_table(self) -> pd.DataFrame: - """Helper function for easier testing. - Return a pd.Dataframe table with all ophys_session_ids and relevant - metadata. - Return columns: ophys_session_id, behavior_session_id, - ophys_experiment_id, project_code, session_name, - session_type, equipment_name, date_of_acquisition, - specimen_id, full_genotype, sex, age_in_days, - reporter_line, driver_line, mouse_id - - :rtype: pd.DataFrame - """ - query = f""" - SELECT - os.id as ophys_session_id, - bs.id as behavior_session_id, - exp_ids.experiment_ids as ophys_experiment_id, - cntr_ids.container_ids as ophys_container_id, - pr.code as project_code, - os.name as session_name, - os.date_of_acquisition, - os.specimen_id, - os.stimulus_name as session_type - FROM ophys_sessions os - JOIN behavior_sessions bs ON os.id = bs.ophys_session_id - LEFT OUTER JOIN projects pr ON pr.id = os.project_id - JOIN ( - {self._build_experiment_from_session_query()} - ) exp_ids ON os.id = exp_ids.id - JOIN ( - {self._build_container_from_session_query()} - ) cntr_ids ON os.id = cntr_ids.id - """ - - if self.data_release_date is not None: - query += self._get_ophys_session_release_filter() - self.logger.debug(f"get_ophys_session_table query: \n{query}") - return self.lims_engine.select(query) - - def get_ophys_session_table(self) -> pd.DataFrame: - """Return a pd.Dataframe table with all ophys_session_ids and relevant - metadata. - Return columns: ophys_session_id, behavior_session_id, - ophys_experiment_id, project_code, session_name, - session_type, equipment_name, date_of_acquisition, - specimen_id, full_genotype, sex, age_in_days, - reporter_line, driver_line - :rtype: pd.DataFrame - """ - # There is one ophys_session_id from 2018 that has multiple behavior - # ids, causing duplicates -- drop all dupes for now; # TODO - table = (self._get_ophys_session_table() - .drop_duplicates(subset=["ophys_session_id"], keep=False) - .set_index("ophys_session_id")) - return table - - def get_behavior_session( - self, behavior_session_id: int) -> BehaviorSession: - """Returns a BehaviorSession object that contains methods to - analyze a single behavior session. - :param behavior_session_id: id that corresponds to a behavior session - :type behavior_session_id: int - :rtype: BehaviorSession - """ - return BehaviorSession.from_lims( - behavior_session_id=behavior_session_id) - - def get_ophys_experiment_table( - self, - ophys_experiment_ids: Optional[List[int]] = None) -> pd.DataFrame: - """Return a pd.Dataframe table with all ophys_experiment_ids and - relevant metadata. This is the most specific and most informative - level to examine the data. - Return columns: - ophys_experiment_id, ophys_session_id, behavior_session_id, - ophys_container_id, project_code, container_workflow_state, - experiment_workflow_state, session_name, session_type, - equipment_name, date_of_acquisition, isi_experiment_id, - specimen_id, sex, age_in_days, full_genotype, reporter_line, - driver_line, imaging_depth, targeted_structure, published_at - :param ophys_experiment_ids: optional list of ophys_experiment_ids - to include - :rtype: pd.DataFrame - """ - df = self._get_ophys_experiment_table() - return df.set_index("ophys_experiment_id") - - def get_behavior_session_table(self) -> pd.DataFrame: - """Returns a pd.DataFrame table with all behavior session_ids to the - user with additional metadata. - - Can't return age at time of session because there is no field for - acquisition date for behavior sessions (only in the stimulus pkl file) - :rtype: pd.DataFrame - """ - summary_tbl = self._get_behavior_summary_table() - stimulus_names = self._get_behavior_stage_table( - behavior_session_ids=summary_tbl.index.tolist()) - return (summary_tbl.merge(stimulus_names, - on=["foraging_id"], how="left") - .set_index("behavior_session_id")) - - def get_release_files(self, file_type='BehaviorNwb') -> pd.DataFrame: - """Gets the release nwb files. - - Parameters - ---------- - file_type - NWB files to return ('BehaviorNwb', 'BehaviorOphysNwb') - - Returns - --------- - Dataframe of release files and file metadata - -index of behavior_session_id or ophys_experiment_id - -columns file_id and isilon filepath - """ - if self.data_release_date is None: - raise RuntimeError('data_release_date must be set in constructor') - - if file_type not in ('BehaviorNwb', 'BehaviorOphysNwb'): - raise ValueError(f'cannot retrieve file type {file_type}') - - if file_type == 'BehaviorNwb': - attachable_id_alias = 'behavior_session_id' - select_clause = f''' - SELECT attachable_id as {attachable_id_alias}, id as file_id, - filename, storage_directory - ''' - join_clause = '' - else: - attachable_id_alias = 'ophys_experiment_id' - select_clause = f''' - SELECT attachable_id as {attachable_id_alias}, - bs.id as behavior_session_id, wkf.id as file_id, - filename, wkf.storage_directory - ''' - join_clause = """ - JOIN ophys_experiments oe ON oe.id = attachable_id - JOIN ophys_sessions os ON os.id = oe.ophys_session_id - JOIN behavior_sessions bs on bs.ophys_session_id = os.id - """ - - if isinstance(self.data_release_date, str): - release_date_list = [self.data_release_date] - else: - release_date_list = self.data_release_date - release_date_str = ",".join([f"'{i}'" for i in release_date_list]) - - query = f''' - {select_clause} - FROM well_known_files wkf - {join_clause} - WHERE published_at IN ({release_date_str}) AND - well_known_file_type_id IN ( - SELECT id - FROM well_known_file_types - WHERE name = '{file_type}' - ); - ''' - - res = self.lims_engine.select(query) - res['isilon_filepath'] = res['storage_directory'] \ - .str.cat(res['filename']) - res = res.drop(['filename', 'storage_directory'], axis=1) - return res.set_index(attachable_id_alias) - - def _get_behavior_session_release_filter(self): - # 1) Get release behavior only session ids - behavior_only_release_files = self.get_release_files( - file_type='BehaviorNwb') - release_behavior_only_session_ids = \ - behavior_only_release_files.index.tolist() - - # 2) Get release behavior with ophys session ids - ophys_release_files = self.get_release_files( - file_type='BehaviorOphysNwb') - release_behavior_with_ophys_session_ids = \ - ophys_release_files['behavior_session_id'].tolist() - - # 3) release behavior session ids is combination - release_behavior_session_ids = \ - release_behavior_only_session_ids + \ - release_behavior_with_ophys_session_ids - - return self._build_in_list_selector_query( - "bs.id", release_behavior_session_ids) - - def _get_ophys_session_release_filter(self): - release_files = self.get_release_files( - file_type='BehaviorOphysNwb') - return self._build_in_list_selector_query( - "bs.id", release_files['behavior_session_id'].tolist()) - - def _get_ophys_experiment_release_filter(self): - release_files = self.get_release_files( - file_type='BehaviorOphysNwb') - return self._build_in_list_selector_query( - "oe.id", release_files.index.tolist()) - - def get_natural_movie_template(self, number: int) -> Iterable[bytes]: - """ Download a template for the natural movie stimulus. This is the - actual movie that was shown during the recording session. - :param number: identifier for this scene - :type number: int - :returns: An iterable yielding an npy file as bytes - """ - raise NotImplementedError() - - def get_natural_scene_template(self, number: int) -> Iterable[bytes]: - """Download a template for the natural scene stimulus. This is the - actual image that was shown during the recording session. - :param number: idenfifier for this movie (note that this is an int, - so to get the template for natural_movie_three should pass 3) - :type number: int - :returns: iterable yielding a tiff file as bytes - """ - raise NotImplementedError() diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py deleted file mode 100644 index bd60be859f..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py +++ /dev/null @@ -1,70 +0,0 @@ -from typing import Optional, List - -import pandas as pd - -from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ - .ophys_mixin import \ - OphysMixin -from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ - .project_table import \ - ProjectTable -from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ - .util.experiments_table_utils import ( - add_experience_level_to_experiment_table, - add_passive_flag_to_ophys_experiment_table, - add_image_set_to_experiment_table) - - -class ExperimentsTable(ProjectTable, OphysMixin): - """Class for storing and manipulating project-level data - at the behavior-ophys experiment level""" - def __init__(self, df: pd.DataFrame, - suppress: Optional[List[str]] = None, - passed_only: bool = True): - """ - Parameters - ---------- - df: pd.DataFrame - The behavior-ophys experiment-level data - suppress: Optional[List[str]] - columns to drop from table (default=None) - passed_only: bool - If True, only return experiments whose - exeriment_workflow_state is True - """ - self._passed_only = passed_only - ProjectTable.__init__(self, df=df, suppress=suppress) - OphysMixin.__init__(self) - self.final_processing() - - def postprocess_base(self): - """ - It actually is possible for the same ophys_experiment_id - to map to more than one container, so we don't want to - eliminate duplicate instances of the index - """ - pass - - def postprocess_additional(self): - pass - - def final_processing(self): - # This method is necessary because self.post_process_additional() - # is called by the ProjectTable.__init__(), which is called - # before OphysMixin.__init__(). OphysMixin.__init__() joins - # some of the Behavior and Ophys columns into sigle, session-wide - # columns, which the functions below must access (specifically, - # OphysMixin.__init__() joins session_type_behavior and - # session_type_ophys into session_type, which is the column - # that add_image_set_to_experiment acts on. A future ticket - # should revisit the workflow of these classes to make it - # possible for the function calls below to be incorporated - # into post_process_additional - - self._df = add_experience_level_to_experiment_table(self._df) - self._df = add_passive_flag_to_ophys_experiment_table(self._df) - self._df = add_image_set_to_experiment_table(self._df) - - if self._passed_only: - self._df = self._df.query("experiment_workflow_state=='passed'") - self._df = self._df.query("container_workflow_state=='published'") diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py deleted file mode 100644 index 68438bba29..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py +++ /dev/null @@ -1,20 +0,0 @@ -class OphysMixin: - """A mixin class for ophys project data""" - def __init__(self): - # If we're in the state of combining behavior and ophys data - if 'date_of_acquisition_behavior' in self._df and \ - 'date_of_acquisition_ophys' in self._df: - - # Prioritize ophys_date_of_acquisition - self._df['date_of_acquisition'] = \ - self._df['date_of_acquisition_ophys'] - self._df = self._df.drop( - ['date_of_acquisition_behavior', - 'date_of_acquisition_ophys'], axis=1) - - # Prioritize ophys session_type - self._df['session_type'] = \ - self._df['session_type_ophys'] - self._df = self._df.drop( - ['session_type_behavior', - 'session_type_ophys'], axis=1) diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py deleted file mode 100644 index dc5760f6d1..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py +++ /dev/null @@ -1,51 +0,0 @@ -import logging -from typing import Optional, List - -import pandas as pd - -from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ - .ophys_mixin import \ - OphysMixin -from allensdk.brain_observatory.behavior.behavior_project_cache.tables\ - .project_table import ProjectTable - - -class BehaviorOphysSessionsTable(ProjectTable, OphysMixin): - """Class for storing and manipulating project-level data - at the behavior-ophys session level""" - def __init__(self, df: pd.DataFrame, - suppress: Optional[List[str]] = None, - index_column: str = 'ophys_session_id'): - """ - Parameters - ---------- - df - The behavior-ophys session-level data - suppress - columns to drop from table - index_column - See description in BehaviorProjectCache.get_session_table - """ - - self._logger = logging.getLogger(self.__class__.__name__) - self._index_column = index_column - ProjectTable.__init__(self, df=df, suppress=suppress) - OphysMixin.__init__(self) - - def postprocess_additional(self): - # Possibly explode and reindex - self.__explode() - - def __explode(self): - if self._index_column == "ophys_session_id": - pass - elif self._index_column == "ophys_experiment_id": - self._df = (self._df.reset_index() - .explode("ophys_experiment_id") - .set_index("ophys_experiment_id")) - else: - self._logger.warning( - f"Invalid value for `by`, '{self._index_column}', passed to " - f"BehaviorOphysSessionsCacheTable." - " Valid choices for `by` are 'ophys_experiment_id' and " - "'ophys_session_id'.") diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/project_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/project_table.py deleted file mode 100644 index c14380590f..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/project_table.py +++ /dev/null @@ -1,49 +0,0 @@ -from abc import abstractmethod, ABC -from typing import Optional, Iterable - -import pandas as pd - - -class ProjectTable(ABC): - """Class for storing and manipulating project-level data""" - def __init__(self, df: pd.DataFrame, - suppress: Optional[Iterable[str]] = None): - """ - Parameters - ---------- - df - The project-level data - suppress - columns to drop from table - - """ - self._df = df - - if suppress is not None: - suppress = list(suppress) - self._suppress = suppress - - self.postprocess() - - @property - def table(self): - return self._df - - def postprocess_base(self): - """Postprocessing to apply to all project-level data""" - # Make sure the index is not duplicated (it is rare) - self._df = self._df[~self._df.index.duplicated()].copy() - - def postprocess(self): - """Postprocess loop""" - self.postprocess_base() - self.postprocess_additional() - - if self._suppress: - self._df.drop(columns=self._suppress, inplace=True, - errors="ignore") - - @abstractmethod - def postprocess_additional(self): - """Additional postprocessing should be overridden by subclassess""" - raise NotImplementedError() diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py deleted file mode 100644 index 22d1c026cc..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py +++ /dev/null @@ -1,119 +0,0 @@ -import re -from typing import Optional, List - -import pandas as pd - -from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ - .ophys_sessions_table import \ - BehaviorOphysSessionsTable -from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ - .util.prior_exposure_processing import \ - get_prior_exposures_to_session_type, get_prior_exposures_to_image_set, \ - get_prior_exposures_to_omissions -from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ - .project_table import \ - ProjectTable -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import BehaviorProjectLimsApi # noqa: E501 - -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.full_genotype import \ - FullGenotype - -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.reporter_line import \ - ReporterLine - - -class SessionsTable(ProjectTable): - """Class for storing and manipulating project-level data - at the session level""" - - def __init__( - self, df: pd.DataFrame, - fetch_api: BehaviorProjectLimsApi, - suppress: Optional[List[str]] = None, - ophys_session_table: Optional[BehaviorOphysSessionsTable] = None): - """ - Parameters - ---------- - df - The session-level data - fetch_api - The api needed to call mtrain db - suppress - columns to drop from table - ophys_session_table - BehaviorOphysSessionsTable, to optionally merge in ophys data - """ - self._fetch_api = fetch_api - self._ophys_session_table = ophys_session_table - super().__init__(df=df, suppress=suppress) - - def postprocess_additional(self): - self._df['reporter_line'] = self._df['reporter_line'].apply( - ReporterLine.parse) - self._df['cre_line'] = self._df['full_genotype'].apply( - lambda x: FullGenotype(x).parse_cre_line()) - self._df['indicator'] = self._df['reporter_line'].apply( - lambda x: ReporterLine(x).parse_indicator()) - - self.__add_session_number() - - self._df['prior_exposures_to_session_type'] = \ - get_prior_exposures_to_session_type(df=self._df) - self._df['prior_exposures_to_image_set'] = \ - get_prior_exposures_to_image_set(df=self._df) - self._df['prior_exposures_to_omissions'] = \ - get_prior_exposures_to_omissions(df=self._df, - fetch_api=self._fetch_api) - - if self._ophys_session_table is not None: - # Merge in ophys data - self._df = self._df.reset_index() \ - .merge(self._ophys_session_table.table.reset_index(), - on='behavior_session_id', - how='left', - suffixes=('_behavior', '_ophys')) - self._df = self._df.set_index('behavior_session_id') - - # Prioritize behavior date_of_acquisition - self._df['date_of_acquisition'] = \ - self._df['date_of_acquisition_behavior'] - self._df = self._df.drop(['date_of_acquisition_behavior', - 'date_of_acquisition_ophys'], axis=1) - - self._df['session_type'] = \ - self.__get_session_type() - self._df = self._df.drop( - ['session_type_behavior', - 'session_type_ophys'], axis=1) - - def __add_session_number(self): - """Parses session number from session type and and adds to dataframe""" - - def parse_session_number(session_type: str): - """Parse the session number from session type""" - match = re.match(r'OPHYS_(?P<session_number>\d+)', - session_type) - if match is None: - return None - return int(match.group('session_number')) - - session_type = self._df['session_type'] - session_type = session_type[session_type.notnull()] - - self._df.loc[session_type.index, 'session_number'] = \ - session_type.apply(parse_session_number) - - def __get_session_type(self) -> pd.Series: - """Session type is returned by both mtrain for behavior sessions - as well as in LIMS table ophys_sessions. - - This method applies logic to use the mtrain value for behavior-only - sessions and LIMS value otherwise - """ - behavior_only = self._df['ophys_session_id'].isnull() - behavior_only_session = \ - self._df[behavior_only]['session_type_behavior'] - behavior_ophys_session = self._df[~behavior_only]['session_type_ophys'] - return pd.concat([behavior_only_session, behavior_ophys_session]) diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py deleted file mode 100644 index d767154448..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py +++ /dev/null @@ -1,126 +0,0 @@ -import pandas as pd - - -def add_experience_level_to_experiment_table( - experiments_table: pd.DataFrame) -> pd.DataFrame: - """ - adds a column to ophys_experiment_table that contains a string - indicating whether a session had exposure level of Familiar, - Novel 1, or Novel >1, based on session number and - prior_exposure_to_image_set - - Parameters - ---------- - experiments_table: pd.DataFrame - - Returns - ------- - experiments_table: pd.DataFrame - - Notes - ----- - Does not change the input DataFrame in-place - """ - # Ported from - # https://github.com/AllenInstitute/visual_behavior_analysis/ - # blob/master/visual_behavior/data_access/utilities.py#L1307 - - # do not modify in place - experiments_table = experiments_table.copy(deep=True) - - # add experience_level column with strings indicating relevant conditions - experiments_table['experience_level'] = 'None' - - session_123 = experiments_table.session_number.isin([1, 2, 3]) - familiar_indices = experiments_table[session_123].index.values - - experiments_table.at[familiar_indices, 'experience_level'] = 'Familiar' - - session_4 = (experiments_table.session_number == 4) - zero_prior_exp = (experiments_table.prior_exposures_to_image_set == 0) - - novel_indices = experiments_table[ - session_4 - & zero_prior_exp].index.values - - experiments_table.at[novel_indices, - 'experience_level'] = 'Novel 1' - - session_456 = experiments_table.session_number.isin([4, 5, 6]) - nonzero_prior_exp = (experiments_table.prior_exposures_to_image_set != 0) - novel_gt_1_indices = experiments_table[ - session_456 - & nonzero_prior_exp].index.values - - experiments_table.at[novel_gt_1_indices, - 'experience_level'] = 'Novel >1' - - return experiments_table - - -def add_passive_flag_to_ophys_experiment_table( - experiments_table: pd.DataFrame) -> pd.DataFrame: - """ - adds a column to ophys_experiment_table that contains a Boolean - indicating whether a session was passive or not based on session - number - - Parameters - ---------- - experiments_table: pd.DataFrame - - Returns - ------- - experiments_table: pd.DataFrame - - Note - ---- - Does not change the input DataFrame in-place - """ - - # Ported from - # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master - # /visual_behavior/data_access/utilities.py#L1344 - - experiments_table = experiments_table.copy(deep=True) - - experiments_table['passive'] = False - - session_25 = experiments_table.session_number.isin([2, 5]) - passive_indices = experiments_table[session_25].index.values - experiments_table.at[passive_indices, 'passive'] = True - - return experiments_table - - -def add_image_set_to_experiment_table( - experiments_table: pd.DataFrame) -> pd.DataFrame: - """ - Adds a column 'image_set' to the experiment_table, determined based - on the image set listed in the session_type column string - - Parameters - ---------- - experiments_table: pd.DataFrame - - Returns - -------- - experiments_table: pd.DataFrame - - Notes - ----- - Does not alter the input DataFrame in-place - """ - - # Ported from - # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/ - # visual_behavior/data_access/utilities.py#L1403 - - experiments_table = experiments_table.copy(deep=True) - - experiments_table['image_set'] = [ - session_type[15] - if len(session_type) > 15 else 'N/A' - for session_type - in experiments_table.session_type.values.astype(str)] - return experiments_table diff --git a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py deleted file mode 100644 index 037e338aca..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py +++ /dev/null @@ -1,180 +0,0 @@ -import re -from typing import Optional - -import pandas as pd - -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import BehaviorProjectLimsApi # noqa: E501 - - -def get_prior_exposures_to_session_type(df: pd.DataFrame) -> pd.Series: - """Get prior exposures to session type - - Parameters - ---------- - df - The sessions df - - Returns - --------- - Series with index same as df and values prior exposure counts to - session type - """ - return __get_prior_exposure_count(df=df, to=df['session_type']) - - -def get_prior_exposures_to_image_set(df: pd.DataFrame) -> pd.Series: - """Get prior exposures to image set - - The image set here is the letter part of the session type - ie for session type OPHYS_1_images_B, it would be "B" - - Some session types don't have an image set name, such as - gratings, which will be set to null - - Parameters - ---------- - df - The session df - - Returns - -------- - Series with index same as df and values prior exposure counts to image set - """ - - def __get_image_set_name(session_type: Optional[str]): - match = re.match(r'.*images_(?P<image_set>\w)', session_type) - if match is None: - return None - return match.group('image_set') - - session_type = df['session_type'][ - df['session_type'].notnull()] - image_set = session_type.apply(__get_image_set_name) - return __get_prior_exposure_count(df=df, to=image_set) - - -def get_prior_exposures_to_omissions(df: pd.DataFrame, - fetch_api: BehaviorProjectLimsApi) -> \ - pd.Series: - """Get prior exposures to omissions - - Parameters - ---------- - df - The session df - fetch_api - API needed to query mtrain - - Returns - --------- - Series with index same as df and values prior exposure counts to omissions - """ - df = df[df['session_type'].notnull()] - - contains_omissions = pd.Series(False, index=df.index) - - def __get_habituation_sessions(df: pd.DataFrame): - """Returns all habituation sessions""" - return df[ - df['session_type'].str.lower().str.contains('habituation')] - - def __get_habituation_sessions_contain_omissions( - habituation_sessions: pd.DataFrame, - fetch_api: BehaviorProjectLimsApi) -> pd.Series: - """Habituation sessions are not supposed to include omissions but - because of a mistake omissions were included for some habituation - sessions. - - This queries mtrain to figure out if omissions were included - for any of the habituation sessions - - Parameters - ---------- - habituation_sessions - the habituation sessions - - Returns - --------- - series where index is same as habituation sessions and values - indicate whether omissions were included - """ - - def __session_contains_omissions( - mtrain_stage_parameters: dict) -> bool: - return 'flash_omit_probability' in mtrain_stage_parameters \ - and \ - mtrain_stage_parameters['flash_omit_probability'] > 0 - - foraging_ids = habituation_sessions['foraging_id'].tolist() - foraging_ids = [f'\'{x}\'' for x in foraging_ids] - mtrain_stage_parameters = fetch_api. \ - get_behavior_stage_parameters(foraging_ids=foraging_ids) - return habituation_sessions.apply( - lambda session: __session_contains_omissions( - mtrain_stage_parameters=mtrain_stage_parameters[ - session['foraging_id']]), axis=1) - - habituation_sessions = __get_habituation_sessions(df=df) - if not habituation_sessions.empty: - contains_omissions.loc[habituation_sessions.index] = \ - __get_habituation_sessions_contain_omissions( - habituation_sessions=habituation_sessions, - fetch_api=fetch_api) - - contains_omissions.loc[ - (df['session_type'].str.lower().str.contains('ophys')) & - (~df.index.isin(habituation_sessions.index)) - ] = True - return __get_prior_exposure_count(df=df, to=contains_omissions, - agg_method='cumsum') - - -def __get_prior_exposure_count(df: pd.DataFrame, to: pd.Series, - agg_method='cumcount') -> pd.Series: - """Returns prior exposures a subject had to something - i.e can be prior exposures to a stimulus type, a image_set or - omission - - Parameters - ---------- - df - The sessions df - to - The array to calculate prior exposures to - Needs to have the same index as self._df - agg_method - The aggregation method to apply on the groups (cumcount or cumsum) - - Returns - --------- - Series with index same as self._df and with values of prior - exposure counts - """ - index = df.index - df = df.sort_values('date_of_acquisition') - df = df[df['session_type'].notnull()] - - # reindex "to" to df - to = to.loc[df.index] - - # exclude missing values from cumcount - to = to[to.notnull()] - - # reindex df to match "to" index with missing values removed - df = df.loc[to.index] - - if agg_method == 'cumcount': - counts = df.groupby(['mouse_id', to]).cumcount() - elif agg_method == 'cumsum': - df['to'] = to - - def cumsum(x): - return x.cumsum().shift(fill_value=0).astype('int64') - - counts = df.groupby(['mouse_id'])['to'].apply(cumsum) - counts.name = None - else: - raise ValueError(f'agg method {agg_method} not supported') - - # reindex to original index - return counts.reindex(index) diff --git a/allensdk/brain_observatory/behavior/behavior_session.py b/allensdk/brain_observatory/behavior/behavior_session.py deleted file mode 100644 index 36f875eed1..0000000000 --- a/allensdk/brain_observatory/behavior/behavior_session.py +++ /dev/null @@ -1,946 +0,0 @@ -import datetime -from typing import Any, List, Dict, Optional -import pynwb -import pandas as pd -import numpy as np -import pytz - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, NwbReadableInterface, \ - LimsReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.licks import Licks -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.behavior_metadata import \ - BehaviorMetadata, get_expt_description -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.date_of_acquisition import \ - DateOfAcquisition -from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards -from allensdk.brain_observatory.behavior.data_objects.stimuli.stimuli import \ - Stimuli -from allensdk.brain_observatory.behavior.data_objects.task_parameters import \ - TaskParameters -from allensdk.brain_observatory.behavior.data_objects.trials.trial_table \ - import \ - TrialTable -from allensdk.brain_observatory.behavior.trials_processing import ( - construct_rolling_performance_df, calculate_reward_rate_fix_nans) -from allensdk.brain_observatory.behavior.data_objects import ( - BehaviorSessionId, StimulusTimestamps, RunningSpeed, RunningAcquisition, - DataObject -) - -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.internal.api import db_connection_creator, PostgresQueryMixin - - -class BehaviorSession(DataObject, LimsReadableInterface, - NwbReadableInterface, - JsonReadableInterface, NwbWritableInterface): - """Represents data from a single Visual Behavior behavior session. - Initialize by using class methods `from_lims` or `from_nwb_path`. - """ - def __init__( - self, - behavior_session_id: BehaviorSessionId, - stimulus_timestamps: StimulusTimestamps, - running_acquisition: RunningAcquisition, - raw_running_speed: RunningSpeed, - running_speed: RunningSpeed, - licks: Licks, - rewards: Rewards, - stimuli: Stimuli, - task_parameters: TaskParameters, - trials: TrialTable, - metadata: BehaviorMetadata, - date_of_acquisition: DateOfAcquisition - ): - super().__init__(name='behavior_session', value=self) - - self._behavior_session_id = behavior_session_id - self._licks = licks - self._rewards = rewards - self._running_acquisition = running_acquisition - self._running_speed = running_speed - self._raw_running_speed = raw_running_speed - self._stimuli = stimuli - self._stimulus_timestamps = stimulus_timestamps - self._task_parameters = task_parameters - self._trials = trials - self._metadata = metadata - self._date_of_acquisition = date_of_acquisition - - # ==================== class and utility methods ====================== - - @classmethod - def from_json(cls, - session_data: dict, - monitor_delay: Optional[float] = None) \ - -> "BehaviorSession": - """ - - Parameters - ---------- - session_data - Dict of input data necessary to construct a session - monitor_delay - Monitor delay. If not provided, will use an estimate. - To provide this value, see for example - allensdk.brain_observatory.behavior.data_objects.stimuli.util. - calculate_monitor_delay - - Returns - ------- - `BehaviorSession` instance - - """ - behavior_session_id = BehaviorSessionId.from_json( - dict_repr=session_data) - stimulus_file = StimulusFile.from_json(dict_repr=session_data) - stimulus_timestamps = StimulusTimestamps.from_json( - dict_repr=session_data) - running_acquisition = RunningAcquisition.from_json( - dict_repr=session_data) - raw_running_speed = RunningSpeed.from_json( - dict_repr=session_data, filtered=False - ) - running_speed = RunningSpeed.from_json(dict_repr=session_data) - metadata = BehaviorMetadata.from_json(dict_repr=session_data) - - if monitor_delay is None: - monitor_delay = cls._get_monitor_delay() - - licks, rewards, stimuli, task_parameters, trials = \ - cls._read_data_from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - trial_monitor_delay=monitor_delay - ) - date_of_acquisition = DateOfAcquisition.from_json( - dict_repr=session_data)\ - .validate( - stimulus_file=stimulus_file, - behavior_session_id=behavior_session_id.value) - - return BehaviorSession( - behavior_session_id=behavior_session_id, - stimulus_timestamps=stimulus_timestamps, - running_acquisition=running_acquisition, - raw_running_speed=raw_running_speed, - running_speed=running_speed, - metadata=metadata, - licks=licks, - rewards=rewards, - stimuli=stimuli, - task_parameters=task_parameters, - trials=trials, - date_of_acquisition=date_of_acquisition - ) - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: Optional[PostgresQueryMixin] = None, - stimulus_timestamps: Optional[StimulusTimestamps] = None, - monitor_delay: Optional[float] = None, - date_of_acquisition: Optional[DateOfAcquisition] = None) \ - -> "BehaviorSession": - """ - - Parameters - ---------- - behavior_session_id - Behavior session id - lims_db - Database connection. If not provided will create a new one. - stimulus_timestamps - Stimulus timestamps. If not provided, will calculate stimulus - timestamps from stimulus file. - monitor_delay - Monitor delay. If not provided, will use an estimate. - To provide this value, see for example - allensdk.brain_observatory.behavior.data_objects.stimuli.util. - calculate_monitor_delay - date_of_acquisition - Date of acquisition. If not provided, will read from - behavior_sessions table. - Returns - ------- - `BehaviorSession` instance - """ - if lims_db is None: - lims_db = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP - ) - - behavior_session_id = BehaviorSessionId(behavior_session_id) - stimulus_file = StimulusFile.from_lims( - db=lims_db, behavior_session_id=behavior_session_id.value) - if stimulus_timestamps is None: - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file) - running_acquisition = RunningAcquisition.from_lims( - lims_db, behavior_session_id.value - ) - raw_running_speed = RunningSpeed.from_lims( - lims_db, behavior_session_id.value, filtered=False, - stimulus_timestamps=stimulus_timestamps - ) - running_speed = RunningSpeed.from_lims( - lims_db, behavior_session_id.value, - stimulus_timestamps=stimulus_timestamps - ) - behavior_metadata = BehaviorMetadata.from_lims( - behavior_session_id=behavior_session_id, lims_db=lims_db - ) - - if monitor_delay is None: - monitor_delay = cls._get_monitor_delay() - - licks, rewards, stimuli, task_parameters, trials = \ - cls._read_data_from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - trial_monitor_delay=monitor_delay - ) - if date_of_acquisition is None: - date_of_acquisition = DateOfAcquisition.from_lims( - behavior_session_id=behavior_session_id.value, lims_db=lims_db) - date_of_acquisition = date_of_acquisition.validate( - stimulus_file=stimulus_file, - behavior_session_id=behavior_session_id.value) - - return BehaviorSession( - behavior_session_id=behavior_session_id, - stimulus_timestamps=stimulus_timestamps, - running_acquisition=running_acquisition, - raw_running_speed=raw_running_speed, - running_speed=running_speed, - metadata=behavior_metadata, - licks=licks, - rewards=rewards, - stimuli=stimuli, - task_parameters=task_parameters, - trials=trials, - date_of_acquisition=date_of_acquisition - ) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile, **kwargs) -> "BehaviorSession": - behavior_session_id = BehaviorSessionId.from_nwb(nwbfile) - stimulus_timestamps = StimulusTimestamps.from_nwb(nwbfile) - running_acquisition = RunningAcquisition.from_nwb(nwbfile) - raw_running_speed = RunningSpeed.from_nwb(nwbfile, filtered=False) - running_speed = RunningSpeed.from_nwb(nwbfile) - metadata = BehaviorMetadata.from_nwb(nwbfile) - licks = Licks.from_nwb(nwbfile=nwbfile) - rewards = Rewards.from_nwb(nwbfile=nwbfile) - stimuli = Stimuli.from_nwb(nwbfile=nwbfile) - task_parameters = TaskParameters.from_nwb(nwbfile=nwbfile) - trials = TrialTable.from_nwb(nwbfile=nwbfile) - date_of_acquisition = DateOfAcquisition.from_nwb(nwbfile=nwbfile) - - return BehaviorSession( - behavior_session_id=behavior_session_id, - stimulus_timestamps=stimulus_timestamps, - running_acquisition=running_acquisition, - raw_running_speed=raw_running_speed, - running_speed=running_speed, - metadata=metadata, - licks=licks, - rewards=rewards, - stimuli=stimuli, - task_parameters=task_parameters, - trials=trials, - date_of_acquisition=date_of_acquisition - ) - - @classmethod - def from_nwb_path(cls, nwb_path: str, **kwargs) -> "BehaviorSession": - """ - - Parameters - ---------- - nwb_path - Path to nwb file - kwargs - Kwargs to be passed to `from_nwb` - - Returns - ------- - An instantiation of a `BehaviorSession` - """ - with pynwb.NWBHDF5IO(str(nwb_path), 'r') as read_io: - nwbfile = read_io.read() - return cls.from_nwb(nwbfile=nwbfile, **kwargs) - - def to_nwb(self, add_metadata=True) -> NWBFile: - """ - - Parameters - ---------- - add_metadata - Set this to False to prevent adding metadata to the nwb - instance. - """ - nwbfile = NWBFile( - session_description=self._get_session_type(), - identifier=self._get_identifier(), - session_start_time=self._date_of_acquisition.value, - file_create_date=pytz.utc.localize(datetime.datetime.now()), - institution="Allen Institute for Brain Science", - keywords=self._get_keywords(), - experiment_description=get_expt_description( - session_type=self._get_session_type()) - ) - - self._stimulus_timestamps.to_nwb(nwbfile=nwbfile) - self._running_acquisition.to_nwb(nwbfile=nwbfile) - self._raw_running_speed.to_nwb(nwbfile=nwbfile) - self._running_speed.to_nwb(nwbfile=nwbfile) - - if add_metadata: - self._metadata.to_nwb(nwbfile=nwbfile) - - self._licks.to_nwb(nwbfile=nwbfile) - self._rewards.to_nwb(nwbfile=nwbfile) - self._stimuli.to_nwb(nwbfile=nwbfile) - self._task_parameters.to_nwb(nwbfile=nwbfile) - self._trials.to_nwb(nwbfile=nwbfile) - - return nwbfile - - def list_data_attributes_and_methods(self) -> List[str]: - """Convenience method for end-users to list attributes and methods - that can be called to access data for a BehaviorSession. - - NOTE: Because BehaviorOphysExperiment inherits from BehaviorSession, - this method will also be available there. - - Returns - ------- - List[str] - A list of attributes and methods that end-users can access or call - to get data. - """ - attrs_and_methods_to_ignore: set = { - "from_json", - "from_lims", - "from_nwb_path", - "list_data_attributes_and_methods" - } - attrs_and_methods_to_ignore.update(dir(NwbReadableInterface)) - attrs_and_methods_to_ignore.update(dir(NwbWritableInterface)) - attrs_and_methods_to_ignore.update(dir(DataObject)) - class_dir = dir(self) - attrs_and_methods = [ - r for r in class_dir - if (r not in attrs_and_methods_to_ignore and not r.startswith("_")) - ] - return attrs_and_methods - - # ========================= 'get' methods ========================== - - def get_reward_rate(self) -> np.ndarray: - """ Get the reward rate of the subject for the task calculated over a - 25 trial rolling window and provides a measure of the rewards - earned per unit time (in units of rewards/minute). - - Returns - ------- - np.ndarray - The reward rate (rewards/minute) of the subject for the - task calculated over a 25 trial rolling window. - """ - return calculate_reward_rate_fix_nans( - self.trials, - self.task_parameters['response_window_sec'][0]) - - def get_rolling_performance_df(self) -> pd.DataFrame: - """Return a DataFrame containing trial by trial behavior response - performance metrics. - - Returns - ------- - pd.DataFrame - A pandas DataFrame containing: - trials_id [index]: (int) - Index of the trial. All trials, including aborted trials, - are assigned an index starting at 0 for the first trial. - reward_rate: (float) - Rewards earned in the previous 25 trials, normalized by - the elapsed time of the same 25 trials. Units are - rewards/minute. - hit_rate_raw: (float) - Fraction of go trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - hit_rate: (float) - Fraction of go trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. With trial count correction applied. - false_alarm_rate_raw: (float) - Fraction of catch trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - false_alarm_rate: (float) - Fraction of catch trials where the mouse licked in - the response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - rolling_dprime: (float) - d prime calculated using the rolling hit_rate and - rolling false_alarm _rate. - - """ - return construct_rolling_performance_df( - self.trials, - self.task_parameters['response_window_sec'][0], - self.task_parameters["session_type"]) - - def get_performance_metrics( - self, - engaged_trial_reward_rate_threshold: float = 2.0 - ) -> dict: - """Get a dictionary containing a subject's behavior response - summary data. - - Parameters - ---------- - engaged_trial_reward_rate_threshold : float, optional - The number of rewards per minute that needs to be attained - before a subject is considered 'engaged', by default 2.0 - - Returns - ------- - dict - Returns a dict of performance metrics with the following fields: - trial_count: (int) - The length of the trial dataframe - (including all 'go', 'catch', and 'aborted' trials) - go_trial_count: (int) - Number of 'go' trials in a behavior session - catch_trial_count: (int) - Number of 'catch' trial types during a behavior session - hit_trial_count: (int) - Number of trials with a hit behavior response - type in a behavior session - miss_trial_count: (int) - Number of trials with a miss behavior response - type in a behavior session - false_alarm_trial_count: (int) - Number of trials where the mouse had a false alarm - behavior response - correct_reject_trial_count: (int) - Number of trials with a correct reject behavior - response during a behavior session - auto_reward_count: - Number of trials where the mouse received an auto - reward of water. - earned_reward_count: - Number of trials where the mouse was eligible to receive a - water reward ('go' trials) and did receive an earned - water reward - total_reward_count: - Number of trials where the mouse received a - water reward (earned or auto rewarded) - total_reward_volume: (float) - Volume of all water rewards received during a - behavior session (earned and auto rewarded) - maximum_reward_rate: (float) - The peak of the rolling reward rate (rewards/minute) - engaged_trial_count: (int) - Number of trials where the mouse is engaged - (reward rate > 2 rewards/minute) - mean_hit_rate: (float) - The mean of the rolling hit_rate - mean_hit_rate_uncorrected: - The mean of the rolling hit_rate_raw - mean_hit_rate_engaged: (float) - The mean of the rolling hit_rate, excluding epochs - when the rolling reward rate was below 2 rewards/minute - mean_false_alarm_rate: (float) - The mean of the rolling false_alarm_rate, excluding - epochs when the rolling reward rate was below 2 - rewards/minute - mean_false_alarm_rate_uncorrected: (float) - The mean of the rolling false_alarm_rate_raw - mean_false_alarm_rate_engaged: (float) - The mean of the rolling false_alarm_rate, - excluding epochs when the rolling reward rate - was below 2 rewards/minute - mean_dprime: (float) - The mean of the rolling d_prime - mean_dprime_engaged: (float) - The mean of the rolling d_prime, excluding - epochs when the rolling reward rate was - below 2 rewards/minute - max_dprime: (float) - The peak of the rolling d_prime - max_dprime_engaged: (float) - The peak of the rolling d_prime, excluding epochs - when the rolling reward rate was below 2 rewards/minute - """ - performance_metrics = {} - performance_metrics['trial_count'] = len(self.trials) - performance_metrics['go_trial_count'] = self.trials.go.sum() - performance_metrics['catch_trial_count'] = self.trials.catch.sum() - performance_metrics['hit_trial_count'] = self.trials.hit.sum() - performance_metrics['miss_trial_count'] = self.trials.miss.sum() - performance_metrics['false_alarm_trial_count'] = \ - self.trials.false_alarm.sum() - performance_metrics['correct_reject_trial_count'] = \ - self.trials.correct_reject.sum() - performance_metrics['auto_reward_count'] = \ - self.trials.auto_rewarded.sum() - # Although 'earned_reward_count' will currently have the same value as - # 'hit_trial_count', in the future there may be variants of the - # task where rewards are withheld. In that case the - # 'earned_reward_count' will be smaller than (and different from) - # the 'hit_trial_count'. - performance_metrics['earned_reward_count'] = self.trials.hit.sum() - performance_metrics['total_reward_count'] = len(self.rewards) - performance_metrics['total_reward_volume'] = self.rewards.volume.sum() - - rpdf = self.get_rolling_performance_df() - engaged_trial_mask = ( - rpdf['reward_rate'] > - engaged_trial_reward_rate_threshold) - performance_metrics['maximum_reward_rate'] = \ - np.nanmax(rpdf['reward_rate'].values) - performance_metrics['engaged_trial_count'] = (engaged_trial_mask).sum() - performance_metrics['mean_hit_rate'] = \ - rpdf['hit_rate'].mean() - performance_metrics['mean_hit_rate_uncorrected'] = \ - rpdf['hit_rate_raw'].mean() - performance_metrics['mean_hit_rate_engaged'] = \ - rpdf['hit_rate'][engaged_trial_mask].mean() - performance_metrics['mean_false_alarm_rate'] = \ - rpdf['false_alarm_rate'].mean() - performance_metrics['mean_false_alarm_rate_uncorrected'] = \ - rpdf['false_alarm_rate_raw'].mean() - performance_metrics['mean_false_alarm_rate_engaged'] = \ - rpdf['false_alarm_rate'][engaged_trial_mask].mean() - performance_metrics['mean_dprime'] = \ - rpdf['rolling_dprime'].mean() - performance_metrics['mean_dprime_engaged'] = \ - rpdf['rolling_dprime'][engaged_trial_mask].mean() - performance_metrics['max_dprime'] = \ - rpdf['rolling_dprime'].max() - performance_metrics['max_dprime_engaged'] = \ - rpdf['rolling_dprime'][engaged_trial_mask].max() - - return performance_metrics - - # ====================== properties ======================== - - @property - def behavior_session_id(self) -> int: - """Unique identifier for a behavioral session. - :rtype: int - """ - return self._behavior_session_id.value - - @property - def licks(self) -> pd.DataFrame: - """A dataframe containing lick timestmaps and frames, sampled - at 60 Hz. - - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. - - Returns - ------- - np.ndarray - A dataframe containing lick timestamps. - dataframe columns: - timestamps: (float) - time of lick, in seconds - frame: (int) - frame of lick - - """ - return self._licks.value - - @property - def rewards(self) -> pd.DataFrame: - """Retrieves rewards from data file saved at the end of the - behavior session. - - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. - - Returns - ------- - pd.DataFrame - A dataframe containing timestamps of delivered rewards. - Timestamps are sampled at 60Hz. - - dataframe columns: - volume: (float) - volume of individual water reward in ml. - 0.007 if earned reward, 0.005 if auto reward. - timestamps: (float) - time in seconds - autorewarded: (bool) - True if free reward was delivered for that trial. - Occurs during the first 5 trials of a session and - throughout as needed - - """ - return self._rewards.value - - @property - def running_speed(self) -> pd.DataFrame: - """Running speed and timestamps, sampled at 60Hz. By default - applies a 10Hz low pass filter to the data. To get the - running speed without the filter, use `raw_running_speed`. - - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. - - Returns - ------- - pd.DataFrame - Dataframe containing running speed and timestamps - dataframe columns: - timestamps: (float) - time in seconds - speed: (float) - speed in cm/sec - """ - return self._running_speed.value - - @property - def raw_running_speed(self) -> pd.DataFrame: - """Get unfiltered running speed data. Sampled at 60Hz. - - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. - - Returns - ------- - pd.DataFrame - Dataframe containing unfiltered running speed and timestamps - dataframe columns: - timestamps: (float) - time in seconds - speed: (float) - speed in cm/sec - """ - return self._raw_running_speed.value - - @property - def stimulus_presentations(self) -> pd.DataFrame: - """Table whose rows are stimulus presentations (i.e. a given image, - for a given duration, typically 250 ms) and whose columns are - presentation characteristics. - - Returns - ------- - pd.DataFrame - Table whose rows are stimulus presentations - (i.e. a given image, for a given duration, typically 250 ms) - and whose columns are presentation characteristics. - - dataframe columns: - stimulus_presentations_id [index]: (int) - identifier for a stimulus presentation - (presentation of an image) - duration: (float) - duration of an image presentation (flash) - in seconds (stop_time - start_time). NaN if omitted - end_frame: (float) - image presentation end frame - image_index: (int) - image index (0-7) for a given session, - corresponding to each image name - image_set: (string) - image set for this behavior session - index: (int) - an index assigned to each stimulus presentation - omitted: (bool) - True if no image was shown for this stimulus - presentation - start_frame: (int) - image presentation start frame - start_time: (float) - image presentation start time in seconds - stop_time: (float) - image presentation end time in seconds - """ - return self._stimuli.presentations.value - - @property - def stimulus_templates(self) -> pd.DataFrame: - """Get stimulus templates (movies, scenes) for behavior session. - - Returns - ------- - pd.DataFrame - A pandas DataFrame object containing the stimulus images for the - experiment. - - dataframe columns: - image_name [index]: (string) - name of image presented, if 'omitted' - then no image was presented - unwarped: (array of int) - image array of unwarped stimulus image - warped: (array of int) - image array of warped stimulus image - - """ - return self._stimuli.templates.value.to_dataframe() - - @property - def stimulus_timestamps(self) -> np.ndarray: - """Timestamps associated with the stimulus presetntation on - the monitor retrieveddata file saved at the end of the - behavior session. Sampled at 60Hz. - - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. - - Returns - ------- - np.ndarray - Timestamps associated with stimulus presentations on the monitor - """ - return self._stimulus_timestamps.value - - @property - def task_parameters(self) -> dict: - """Get task parameters from data file saved at the end of - the behavior session file. - - Returns - ------- - dict - A dictionary containing parameters used to define the task runtime - behavior. - auto_reward_volume: (float) - Volume of auto rewards in ml. - blank_duration_sec : (list of floats) - Duration in seconds of inter stimulus interval. - Inter-stimulus interval chosen as a uniform random value. - between the range defined by the two values. - Values are ignored if `stimulus_duration_sec` is null. - response_window_sec: (list of floats) - Range of period following an image change, in seconds, - where mouse response influences trial outcome. - First value represents response window start. - Second value represents response window end. - Values represent time before display lag is - accounted for and applied. - n_stimulus_frames: (int) - Total number of visual stimulus frames presented during - a behavior session. - task: (string) - Type of visual stimulus task. - session_type: (string) - Visual stimulus type run during behavior session. - omitted_flash_fraction: (float) - Probability that a stimulus image presentations is omitted. - Change stimuli, and the stimulus immediately preceding the - change, are never omitted. - stimulus_distribution: (string) - Distribution for drawing change times. - Either 'exponential' or 'geometric'. - stimulus_duration_sec: (float) - Duration in seconds of each stimulus image presentation - reward_volume: (float) - Volume of earned water reward in ml. - stimulus: (string) - Stimulus type ('gratings' or 'images'). - - """ - return self._task_parameters.to_dict()['task_parameters'] - - @property - def trials(self) -> pd.DataFrame: - """Get trials from data file saved at the end of the - behavior session. - - Returns - ------- - pd.DataFrame - A dataframe containing trial and behavioral response data, - by cell specimen id - - dataframe columns: - trials_id: (int) - trial identifier - lick_times: (array of float) - array of lick times in seconds during that trial. - Empty array if no licks occured during the trial. - reward_time: (NaN or float) - Time the reward is delivered following a correct - response or on auto rewarded trials. - reward_volume: (float) - volume of reward in ml. 0.005 for auto reward - 0.007 for earned reward - hit: (bool) - Behavior response type. On catch trial mouse licks - within reward window. - false_alarm: (bool) - Behavior response type. On catch trial mouse licks - within reward window. - miss: (bool) - Behavior response type. On a go trial, mouse either - does not lick at all, or licks after reward window - stimulus_change: (bool) - True if an image change occurs during the trial - (if the trial was both a 'go' trial and the trial - was not aborted) - aborted: (bool) - Behavior response type. True if the mouse licks - before the scheduled change time. - go: (bool) - Trial type. True if there was a change in stimulus - image identity on this trial - catch: (bool) - Trial type. True if there was not a change in stimulus - identity on this trial - auto_rewarded: (bool) - True if free reward was delivered for that trial. - Occurs during the first 5 trials of a session and - throughout as needed. - correct_reject: (bool) - Behavior response type. On a catch trial, mouse - either does not lick at all or licks after reward - window - start_time: (float) - start time of the trial in seconds - stop_time: (float) - end time of the trial in seconds - trial_length: (float) - duration of trial in seconds (stop_time -start_time) - response_time: (float) - time of first lick in trial in seconds and NaN if - trial aborted - initial_image_name: (string) - name of image presented at start of trial - change_image_name: (string) - name of image that is changed to at the change time, - on go trials - """ - return self._trials.value - - @property - def metadata(self) -> Dict[str, Any]: - """metadata for a given session - - Returns - ------- - Dict - A dictionary containing behavior session specific metadata - dictionary keys: - age_in_days: (int) - age of mouse in days - behavior_session_uuid: (int) - unique identifier for a behavior session - behavior_session_id: (int) - unique identifier for a behavior session - cre_line: (string) - cre driver line for a transgenic mouse - date_of_acquisition: (date time object) - date and time of experiment acquisition, - yyyy-mm-dd hh:mm:ss - driver_line: (list of string) - all driver lines for a transgenic mouse - equipment_name: (string) - identifier for equipment data was collected on - full_genotype: (string) - full genotype of transgenic mouse - mouse_id: (int) - unique identifier for a mouse - reporter_line: (string) - reporter line for a transgenic mouse - session_type: (string) - visual stimulus type displayed during behavior - session - sex: (string) - sex of the mouse - stimulus_frame_rate: (float) - frame rate (Hz) at which the visual stimulus is - displayed - """ - return self._get_metadata(behavior_metadata=self._metadata) - - @classmethod - def _read_data_from_stimulus_file( - cls, stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps, - trial_monitor_delay: float): - """Helper method to read data from stimulus file""" - licks = Licks.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps) - rewards = Rewards.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps) - stimuli = Stimuli.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps) - task_parameters = TaskParameters.from_stimulus_file( - stimulus_file=stimulus_file) - trials = TrialTable.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - licks=licks, - rewards=rewards, - monitor_delay=trial_monitor_delay - ) - return licks, rewards, stimuli, task_parameters, trials - - def _get_metadata(self, behavior_metadata: BehaviorMetadata) -> dict: - """Returns dict of metadata""" - return { - 'equipment_name': behavior_metadata.equipment.value, - 'sex': behavior_metadata.subject_metadata.sex, - 'age_in_days': behavior_metadata.subject_metadata.age_in_days, - 'stimulus_frame_rate': behavior_metadata.stimulus_frame_rate, - 'session_type': behavior_metadata.session_type, - 'date_of_acquisition': self._date_of_acquisition.value, - 'reporter_line': behavior_metadata.subject_metadata.reporter_line, - 'cre_line': behavior_metadata.subject_metadata.cre_line, - 'behavior_session_uuid': behavior_metadata.behavior_session_uuid, - 'driver_line': behavior_metadata.subject_metadata.driver_line, - 'mouse_id': behavior_metadata.subject_metadata.mouse_id, - 'full_genotype': behavior_metadata.subject_metadata.full_genotype, - 'behavior_session_id': behavior_metadata.behavior_session_id - } - - def _get_identifier(self) -> str: - return str(self._behavior_session_id) - - def _get_session_type(self) -> str: - return self._metadata.session_type - - @staticmethod - def _get_keywords(): - """Keywords for NWB file""" - return ["visual", "behavior", "task"] - - @staticmethod - def _get_monitor_delay(): - # This is the median estimate across all rigs - # as discussed in - # https://github.com/AllenInstitute/AllenSDK/issues/1318 - return 0.02115 diff --git a/allensdk/brain_observatory/behavior/criteria.py b/allensdk/brain_observatory/behavior/criteria.py deleted file mode 100644 index 6743e3717d..0000000000 --- a/allensdk/brain_observatory/behavior/criteria.py +++ /dev/null @@ -1,216 +0,0 @@ -""" -Functions for calculating mtrain state transitions. -If criteria are met, return true. Otherwise, return false. -""" - -import logging -from allensdk.core.exceptions import DataFrameKeyError, DataFrameIndexError - - -logger = logging.getLogger(__name__) - - -def two_out_of_three_aint_bad(session_summary): - """Returns true if 2 of the last 3 days showed a peak - d-prime above 2. - - Args: - session_summary (pd.DataFrame): Pandas dataframe with daily values for 'dprime_peak', - ordered ascending by training day, for at least the past 3 days. If dataframe is not - properly ordered, criterion may not be correctly calculated. This function does not - sort the data to preserve prior behavior (sorting column was not required by mtrain function). - The mtrain implementation created the required columns if they didn't exist, so - a more informative error is raised here to assist end-users in debugging. - Returns: - bool: True if criterion is met, False otherwise - """ - if len(session_summary) < 3: - raise DataFrameIndexError("Not enough data in session_summary frame. " - "Expected >= 3 rows, got {}".format(len(session_summary))) - try: - last_three = session_summary["dprime_peak"][-3:] - except KeyError as e: - raise DataFrameKeyError("Failed accessing last three values in colum" - "'dprime_peak'.\n df length={}, df columns={}\n" - .format(len(session_summary), list(session_summary)), e) - logger.info('dprime_peak over last three days: {}'.format(list(last_three))) - criteria = bool( - ((last_three > 2).sum() > 1) # at least two of the last three - ) - logger.info("'Two out of three ain't bad' criteria met: '{}'".format(criteria)) - return criteria - -def yesterday_was_good(session_summary): - """Returns true if the last day showed a peak d-prime above 2 - Args: - session_summary (pd.DataFrame): Pandas dataframe with daily values for 'dprime_peak', - ordered ascending by training day, for at least 1 day. If dataframe is not - properly ordered, criterion may not be correctly calculated. This function does not - sort the data to preserve prior behavior (sorting column was not required by mtrain function). - The mtrain implementation created the required columns if they didn't exist, so - a more informative error is raised here to assist end-users in debugging. - Returns: - bool: True if criterion is met, False otherwise - """ - if len(session_summary) < 1: - raise DataFrameIndexError("Not enough data in session_summary frame. " - "Expected >= 1 row(s), got {}".format(len(session_summary))) - try: - last_day = session_summary['dprime_peak'].iloc[-1] - except KeyError as e: - raise DataFrameKeyError("Failed accessing last three values in colum" - "'dprime_peak'.\n df length={}, df columns={}\n" - .format(len(session_summary), list(session_summary)), e) - criteria = bool(last_day > 2) - logger.info("'Yesterday was good' criteria met: {}".format(criteria)) - return criteria - - -def no_response_bias(session_summary): - """the mouse meets this criterion if their last session exhibited a - response bias between 10% and 90% - Args: - session_summary (pd.DataFrame): Pandas dataframe with daily values for 'response_bias', - ordered ascending by training day, for at least 1 day. If dataframe is not - properly ordered, criterion may not be correctly calculated. This function does not - sort the data to preserve prior behavior (sorting column was not required by mtrain function). - The mtrain implementation created the required columns if they didn't exist, so - a more informative error is raised here to assist end-users in debugging. - Returns: - bool: True if criterion is met, False otherwise - """ - if len(session_summary) < 1: - raise DataFrameIndexError("Not enough data in session_summary frame. " - "Expected >= 1 row(s), got {}".format(len(session_summary))) - try: - response_bias = session_summary['response_bias'].iloc[-1] - except KeyError as e: - raise DataFrameKeyError("Failed accessing last values in colum" - "'response_bias'.\n df length={}, df columns={}\n" - .format(len(session_summary), list(session_summary)), e) - criteria = (response_bias < 0.9) & (response_bias > 0.1) - logger.info("'No response bias' criteria met: {} (response bias={})" - .format(criteria, response_bias)) - return criteria - - -def whole_lotta_trials(session_summary): - """ - Mouse meets this criterion if the last session has more than 300 trials. - Args: - session_summary (pd.DataFrame): Pandas dataframe with daily values for 'num_contingent_trials', - ordered ascending by training day, for at least 1 day. If dataframe is not - properly ordered, criterion may not be correctly calculated. This function does not - sort the data to preserve prior behavior (sorting column was not required by mtrain function). - The mtrain implementation created the required columns if they didn't exist, so - a more informative error is raised here to assist end-users in debugging. - Returns: - bool: True if criterion is met, False otherwise - """ - if len(session_summary) < 1: - raise DataFrameIndexError("Not enough data in session_summary frame. " - "Expected >= 1 row(s), got {}".format(len(session_summary))) - try: - num_trials = session_summary['num_contingent_trials'].iloc[-1] - except KeyError as e: - raise DataFrameKeyError("Failed accessing last values in colum" - "'num_contingent_trials'.\n df length={}, df columns={}\n" - .format(len(session_summary), list(session_summary)), e) - criteria = num_trials > 300 - logger.info("'Trials > 300' criteria met: {} (n trials={})".format(criteria, num_trials)) - return criteria - - -def mostly_useful(trials): - """ - Returns True if fewer than half the trial time on the last day were - aborted trials. - Args: - trials (pd.DataFrame): Pandas dataframe with columns 'training_day', 'trial_type', - and 'trial_length'. - Returns: - bool: True if criterion is met, False otherwise - """ - if len(trials) == 0: # empty df would return true, but shouldn't - return False - last_day = trials['training_day'].max() - group = trials.groupby('training_day').get_group(last_day) - trial_fractions = group.groupby('trial_type')['trial_length'].sum() \ - / group['trial_length'].sum() - aborted = trial_fractions['aborted'] - criteria = aborted < 0.5 - logger.info("Fewer than half the trials were aborted on the last training day: {} " - "(% aborted trials={})".format(criteria, aborted)) - return criteria - - -def consistency_is_key(session_summary): - '''need some way to judge consistency of various parameters - - - dprime - - num trials - - hit rate - - fa rate - - lick timing - ''' - raise NotImplementedError - - -def consistent_behavior_within_session(session_summary): - '''need some way to measure consistent performance within a session - - - compare peak to overall dprime? - - variance in rolling window dprime? - ''' - raise NotImplementedError - - -def n_complete(threshold, count): - """ - For compatibility with original API. If count >= threshold, return True. - Otherwise return False. - Args: - threshold (numeric): Threshold for the count to meet. - count (numeric): The count to compare to the threshold. - Returns: - True if count >= threshold, otherwise False. - """ - return count >= threshold - - -def meets_engagement_criteria(session_summary): - """ - Returns true if engagement criteria were met for the past 3 days, else false. - Args: - session_summary (pd.DataFrame): Pandas dataframe with daily values for 'dprime_peak' and 'num_engaged_trials', - ordered ascending by training day, for at least 3 days. If dataframe is not - properly ordered, criterion may not be correctly calculated. This function does not - sort the data to preserve prior behavior (sorting column was not required by mtrain function) - The mtrain implementation created the required columns if they didn't exist, so - a more informative error is raised here to assist end-users in debugging. - Returns: - bool: True if criterion is met, False otherwise - """ - criteria = 3 - if len(session_summary) < 3: - raise DataFrameIndexError("Not enough data in session_summary frame. " - "Expected >= 3 rows, got {}".format(len(session_summary))) - try: - session_summary['engagement_criteria'] = ( - (session_summary['dprime_peak'] > 1.0) - & (session_summary['num_engaged_trials'] > 100) - ) - engaged_days = session_summary['engagement_criteria'].iloc[-3:].sum() - except KeyError as e: - raise DataFrameKeyError("Failed accessing columns 'dprime_peak' and/or " - "'num_engaged_trials' for 3 days.\n df length={}, df columns={}\n" - .format(len(session_summary), list(session_summary)), e) - return engaged_days == criteria - - -def summer_over(trials): - """ - Returns true if the maximum value of 'training_day' in the trials dataframe is >= 40, - else false. - """ - return trials['training_day'].max() >= 40 diff --git a/allensdk/brain_observatory/behavior/data_files/__init__.py b/allensdk/brain_observatory/behavior/data_files/__init__.py deleted file mode 100644 index 67cbc71759..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from allensdk.brain_observatory.behavior.data_files._data_file_abc import DataFile # noqa E501, F401 -from allensdk.brain_observatory.behavior.data_files.stimulus_file import StimulusFile # noqa E501, F401 -from allensdk.brain_observatory.behavior.data_files.sync_file import SyncFile # noqa E501, F401 diff --git a/allensdk/brain_observatory/behavior/data_files/_data_file_abc.py b/allensdk/brain_observatory/behavior/data_files/_data_file_abc.py deleted file mode 100644 index 2461fec828..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/_data_file_abc.py +++ /dev/null @@ -1,92 +0,0 @@ -import abc -from typing import Any, Union -from pathlib import Path - - -class DataFile(abc.ABC): - """An abstract class that prototypes methods for accessing internal - data files. - - These data files contain information necessary to sucessfully instantiate - one or many `DataObject`(s). - - External users should ignore this class (and subclasses) as as they - will only ever be using `from_nwb()` and `to_nwb()` `DataObject` methods. - """ - - def __init__(self, filepath: Union[str, Path]): # pragma: no cover - self._filepath: str = str(filepath) - self._data = self.load_data(filepath=self._filepath) - - @property - def data(self) -> Any: # pragma: no cover - return self._data - - @property - def filepath(self) -> str: # pragma: no cover - return self._filepath - - @classmethod - @abc.abstractmethod - def from_json(cls, dict_repr: dict) -> "DataFile": # pragma: no cover - """Populates a DataFile from a JSON compatible dict (likely parsed by - argschema) - - Returns - ------- - DataFile: - An instantiated DataFile which has `data` and `filepath` properties - """ - # Example: - # filepath = dict_repr["my_data_file_path"] - # return cls.instantiate(filepath=filepath) - raise NotImplementedError() - - @abc.abstractmethod - def to_json(self) -> dict: # pragma: no cover - """Given an already populated DataFile, return the dict that - when used with the `from_json()` classmethod would produce the same - DataFile - - Returns - ------- - dict: - The JSON (in dict form) that would produce the DataFile. - """ - raise NotImplementedError() - - @classmethod - @abc.abstractmethod - def from_lims(cls) -> "DataFile": # pragma: no cover - """Populate a DataFile from an internal database (likely LIMS) - - Returns - ------- - DataFile: - An instantiated DataFile which has `data` and `filepath` properties - """ - # Example: - # query = """SELECT my_file FROM some_lims_table""" - # filepath = dbconn.fetchone(query, strict=True) - # return cls.instantiate(filepath=filepath) - raise NotImplementedError() - - @staticmethod - @abc.abstractmethod - def load_data(filepath: Union[str, Path]) -> Any: # pragma: no cover - """Given a filepath (that is meant to by read by the DataFile type), - load the contents of the file into a Python type. - (dict, DataFrame, list, etc...) - - Parameters - ---------- - filepath : Union[str, Path] - The filepath that the DataFile class should load. - - Returns - ------- - Any - A Python data type that has been parsed/loaded from the provided - filepath. - """ - raise NotImplementedError() diff --git a/allensdk/brain_observatory/behavior/data_files/avg_projection_file.py b/allensdk/brain_observatory/behavior/data_files/avg_projection_file.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_files/demix_file.py b/allensdk/brain_observatory/behavior/data_files/demix_file.py deleted file mode 100644 index 69aa81958d..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/demix_file.py +++ /dev/null @@ -1,66 +0,0 @@ -import json -from typing import Dict, Union -from pathlib import Path - -import h5py -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -import pandas as pd - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import DataFile - - -def from_json_cache_key(cls, dict_repr: dict): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key(cls, db, ophys_experiment_id: int): - return hashkey(ophys_experiment_id) - - -class DemixFile(DataFile): - """A DataFile which contains methods for accessing and loading - demixed traces. - """ - - def __init__(self, filepath: Union[str, Path]): - super().__init__(filepath=filepath) - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) - def from_json(cls, dict_repr: dict) -> "DemixFile": - filepath = dict_repr["demix_file"] - return cls(filepath=filepath) - - def to_json(self) -> Dict[str, str]: - return {"demix_file": str(self.filepath)} - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, db: PostgresQueryMixin, - ophys_experiment_id: Union[int, str] - ) -> "DemixFile": - query = """ - SELECT wkf.storage_directory || wkf.filename AS demix_file - FROM ophys_experiments oe - JOIN well_known_files wkf ON wkf.attachable_id = oe.id - JOIN well_known_file_types wkft - ON wkft.id = wkf.well_known_file_type_id - WHERE wkf.attachable_type = 'OphysExperiment' - AND wkft.name = 'DemixedTracesFile' - AND oe.id = {}; - """.format(ophys_experiment_id) - filepath = db.fetchone(query, strict=True) - return cls(filepath=filepath) - - @staticmethod - def load_data(filepath: Union[str, Path]) -> pd.DataFrame: - with h5py.File(filepath, 'r') as in_file: - traces = in_file['data'][()] - roi_id = in_file['roi_names'][()] - idx = pd.Index(roi_id, name='cell_roi_id', dtype=int) - return pd.DataFrame({'corrected_fluorescence': list(traces)}, - index=idx) diff --git a/allensdk/brain_observatory/behavior/data_files/dff_file.py b/allensdk/brain_observatory/behavior/data_files/dff_file.py deleted file mode 100644 index f36f3962af..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/dff_file.py +++ /dev/null @@ -1,65 +0,0 @@ -import json -import numpy as np -from typing import Dict, Union -from pathlib import Path - -import h5py -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -import pandas as pd - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import DataFile - - -def from_json_cache_key(cls, dict_repr: dict): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key(cls, db, ophys_experiment_id: int): - return hashkey(ophys_experiment_id) - - -class DFFFile(DataFile): - """A DataFile which contains methods for accessing and loading - DFF traces. - """ - - def __init__(self, filepath: Union[str, Path]): - super().__init__(filepath=filepath) - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) - def from_json(cls, dict_repr: dict) -> "DFFFile": - filepath = dict_repr["dff_file"] - return cls(filepath=filepath) - - def to_json(self) -> Dict[str, str]: - return {"dff_file": str(self.filepath)} - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, db: PostgresQueryMixin, - ophys_experiment_id: Union[int, str] - ) -> "DFFFile": - query = """ - SELECT wkf.storage_directory || wkf.filename AS dff_file - FROM ophys_experiments oe - JOIN well_known_files wkf ON wkf.attachable_id = oe.id - JOIN well_known_file_types wkft - ON wkft.id = wkf.well_known_file_type_id - WHERE wkft.name = 'OphysDffTraceFile' - AND oe.id = {}; - """.format(ophys_experiment_id) - filepath = db.fetchone(query, strict=True) - return cls(filepath=filepath) - - @staticmethod - def load_data(filepath: Union[str, Path]) -> pd.DataFrame: - with h5py.File(filepath, 'r') as raw_file: - traces = np.asarray(raw_file['data'], dtype=np.float64) - roi_names = np.asarray(raw_file['roi_names']) - idx = pd.Index(roi_names, name='cell_roi_id', dtype=int) - return pd.DataFrame({'dff': [x for x in traces]}, index=idx) diff --git a/allensdk/brain_observatory/behavior/data_files/event_detection_file.py b/allensdk/brain_observatory/behavior/data_files/event_detection_file.py deleted file mode 100644 index 1956b045d8..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/event_detection_file.py +++ /dev/null @@ -1,73 +0,0 @@ -import json -import numpy as np -from typing import Dict, Union, Tuple -from pathlib import Path - -import h5py -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -import pandas as pd - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import DataFile -from allensdk.internal.core.lims_utilities import safe_system_path - - -def from_json_cache_key(cls, dict_repr: dict): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key(cls, db, ophys_experiment_id: int): - return hashkey(ophys_experiment_id) - - -class EventDetectionFile(DataFile): - """A DataFile which contains methods for accessing and loading - events. - """ - - def __init__(self, filepath: Union[str, Path]): - super().__init__(filepath=filepath) - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) - def from_json(cls, dict_repr: dict) -> "EventDetectionFile": - filepath = dict_repr["events_file"] - return cls(filepath=filepath) - - def to_json(self) -> Dict[str, str]: - return {"events_file": str(self.filepath)} - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, db: PostgresQueryMixin, - ophys_experiment_id: Union[int, str] - ) -> "EventDetectionFile": - query = f''' - SELECT wkf.storage_directory || wkf.filename AS event_detection_filepath - FROM ophys_experiments oe - LEFT JOIN well_known_files wkf ON wkf.attachable_id = oe.id - JOIN well_known_file_types wkft ON wkf.well_known_file_type_id = wkft.id - WHERE wkft.name = 'OphysEventTraceFile' - AND oe.id = {ophys_experiment_id}; - ''' # noqa E501 - filepath = safe_system_path(db.fetchone(query, strict=True)) - return cls(filepath=filepath) - - @staticmethod - def load_data(filepath: Union[str, Path]) -> \ - Tuple[np.ndarray, pd.DataFrame]: - with h5py.File(filepath, 'r') as f: - events = f['events'][:] - lambdas = f['lambdas'][:] - noise_stds = f['noise_stds'][:] - roi_ids = f['roi_names'][:] - - df = pd.DataFrame({ - 'lambda': lambdas, - 'noise_std': noise_stds, - 'cell_roi_id': roi_ids - }) - return events, df diff --git a/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py b/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py deleted file mode 100644 index e8a281b786..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py +++ /dev/null @@ -1,50 +0,0 @@ -from typing import Dict, Union -from pathlib import Path - -import pandas as pd - -from allensdk.brain_observatory.behavior.eye_tracking_processing import \ - load_eye_tracking_hdf -from allensdk.internal.api import PostgresQueryMixin -from allensdk.internal.core.lims_utilities import safe_system_path -from allensdk.brain_observatory.behavior.data_files import DataFile - - -class EyeTrackingFile(DataFile): - """A DataFile which contains methods for accessing and loading - eye tracking data. - """ - - def __init__(self, filepath: Union[str, Path]): - super().__init__(filepath=filepath) - - @classmethod - def from_json(cls, dict_repr: dict) -> "EyeTrackingFile": - filepath = dict_repr["eye_tracking_filepath"] - return cls(filepath=filepath) - - def to_json(self) -> Dict[str, str]: - return {"eye_tracking_filepath": str(self.filepath)} - - @classmethod - def from_lims( - cls, db: PostgresQueryMixin, - ophys_experiment_id: Union[int, str] - ) -> "EyeTrackingFile": - query = f""" - SELECT wkf.storage_directory || wkf.filename AS eye_tracking_file - FROM ophys_experiments oe - LEFT JOIN well_known_files wkf ON wkf.attachable_id = oe.ophys_session_id - JOIN well_known_file_types wkft ON wkf.well_known_file_type_id = wkft.id - WHERE wkf.attachable_type = 'OphysSession' - AND wkft.name = 'EyeTracking Ellipses' - AND oe.id = {ophys_experiment_id}; - """ # noqa E501 - filepath = db.fetchone(query, strict=True) - return cls(filepath=filepath) - - @staticmethod - def load_data(filepath: Union[str, Path]) -> pd.DataFrame: - filepath = safe_system_path(file_name=filepath) - # TODO move the contents of this function here - return load_eye_tracking_hdf(filepath) diff --git a/allensdk/brain_observatory/behavior/data_files/max_projection_file.py b/allensdk/brain_observatory/behavior/data_files/max_projection_file.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_files/rigid_motion_transform_file.py b/allensdk/brain_observatory/behavior/data_files/rigid_motion_transform_file.py deleted file mode 100644 index 4349bc27c5..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/rigid_motion_transform_file.py +++ /dev/null @@ -1,62 +0,0 @@ -import json -from typing import Dict, Union -from pathlib import Path - -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -import pandas as pd - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import DataFile -from allensdk.internal.core.lims_utilities import safe_system_path - - -def from_json_cache_key(cls, dict_repr: dict): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key(cls, db, ophys_experiment_id: int): - return hashkey(ophys_experiment_id) - - -class RigidMotionTransformFile(DataFile): - """A DataFile which contains methods for accessing and loading - rigid motion transform output. - """ - - def __init__(self, filepath: Union[str, Path]): - super().__init__(filepath=filepath) - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) - def from_json(cls, dict_repr: dict) -> "RigidMotionTransformFile": - filepath = dict_repr["rigid_motion_transform_file"] - return cls(filepath=filepath) - - def to_json(self) -> Dict[str, str]: - return {"rigid_motion_transform_file": str(self.filepath)} - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, db: PostgresQueryMixin, - ophys_experiment_id: Union[int, str] - ) -> "RigidMotionTransformFile": - query = """ - SELECT wkf.storage_directory || wkf.filename AS transform_file - FROM ophys_experiments oe - JOIN well_known_files wkf ON wkf.attachable_id = oe.id - JOIN well_known_file_types wkft - ON wkft.id = wkf.well_known_file_type_id - WHERE wkf.attachable_type = 'OphysExperiment' - AND wkft.name = 'OphysMotionXyOffsetData' - AND oe.id = {}; - """.format(ophys_experiment_id) - filepath = safe_system_path(db.fetchone(query, strict=True)) - return cls(filepath=filepath) - - @staticmethod - def load_data(filepath: Union[str, Path]) -> pd.DataFrame: - motion_correction = pd.read_csv(filepath) - return motion_correction[['x', 'y']] diff --git a/allensdk/brain_observatory/behavior/data_files/stimulus_file.py b/allensdk/brain_observatory/behavior/data_files/stimulus_file.py deleted file mode 100644 index 3feeb0378c..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/stimulus_file.py +++ /dev/null @@ -1,74 +0,0 @@ -import json -from typing import Dict, Union -from pathlib import Path - -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -import pandas as pd - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.internal.core.lims_utilities import safe_system_path -from allensdk.brain_observatory.behavior.data_files import DataFile - -# Query returns path to StimulusPickle file for given behavior session -STIMULUS_FILE_QUERY_TEMPLATE = """ - SELECT - wkf.storage_directory || wkf.filename AS stim_file - FROM - well_known_files wkf - WHERE - wkf.attachable_id = {behavior_session_id} - AND wkf.attachable_type = 'BehaviorSession' - AND wkf.well_known_file_type_id IN ( - SELECT id - FROM well_known_file_types - WHERE name = 'StimulusPickle'); -""" - - -def from_json_cache_key(cls, dict_repr: dict): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key(cls, db, behavior_session_id: int): - return hashkey(behavior_session_id) - - -class StimulusFile(DataFile): - """A DataFile which contains methods for accessing and loading visual - behavior stimulus *.pkl files. - - This file type contains a number of parameters collected during a behavior - session including information about stimulus presentations, rewards, - trials, and timing for all of the above. - """ - - def __init__(self, filepath: Union[str, Path]): - super().__init__(filepath=filepath) - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) - def from_json(cls, dict_repr: dict) -> "StimulusFile": - filepath = dict_repr["behavior_stimulus_file"] - return cls(filepath=filepath) - - def to_json(self) -> Dict[str, str]: - return {"behavior_stimulus_file": str(self.filepath)} - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, db: PostgresQueryMixin, - behavior_session_id: Union[int, str] - ) -> "StimulusFile": - query = STIMULUS_FILE_QUERY_TEMPLATE.format( - behavior_session_id=behavior_session_id - ) - filepath = db.fetchone(query, strict=True) - return cls(filepath=filepath) - - @staticmethod - def load_data(filepath: Union[str, Path]) -> dict: - filepath = safe_system_path(file_name=filepath) - return pd.read_pickle(filepath) diff --git a/allensdk/brain_observatory/behavior/data_files/sync_file.py b/allensdk/brain_observatory/behavior/data_files/sync_file.py deleted file mode 100644 index dab04f9f71..0000000000 --- a/allensdk/brain_observatory/behavior/data_files/sync_file.py +++ /dev/null @@ -1,71 +0,0 @@ -import json -from typing import Dict, Union -from pathlib import Path - -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.internal.core.lims_utilities import safe_system_path -from allensdk.brain_observatory.behavior.sync import get_sync_data -from allensdk.brain_observatory.behavior.data_files import DataFile - - -# Query returns path to sync timing file associated with ophys experiment -SYNC_FILE_QUERY_TEMPLATE = """ - SELECT wkf.storage_directory || wkf.filename AS sync_file - FROM ophys_experiments oe - JOIN ophys_sessions os ON oe.ophys_session_id = os.id - JOIN well_known_files wkf ON wkf.attachable_id = os.id - JOIN well_known_file_types wkft - ON wkft.id = wkf.well_known_file_type_id - WHERE wkf.attachable_type = 'OphysSession' - AND wkft.name = 'OphysRigSync' - AND oe.id = {ophys_experiment_id}; -""" - - -def from_json_cache_key(cls, dict_repr: dict): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key(cls, db, ophys_experiment_id: int): - return hashkey(ophys_experiment_id) - - -class SyncFile(DataFile): - """A DataFile which contains methods for accessing and loading visual - behavior stimulus *.pkl files. - - This file type contains global timing information for different data - streams collected during a behavior + ophys session. - """ - - def __init__(self, filepath: Union[str, Path]): - super().__init__(filepath=filepath) - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) - def from_json(cls, dict_repr: dict) -> "SyncFile": - filepath = dict_repr["sync_file"] - return cls(filepath=filepath) - - def to_json(self) -> Dict[str, str]: - return {"sync_file": str(self.filepath)} - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, db: PostgresQueryMixin, - ophys_experiment_id: Union[int, str] - ) -> "SyncFile": - query = SYNC_FILE_QUERY_TEMPLATE.format( - ophys_experiment_id=ophys_experiment_id - ) - filepath = db.fetchone(query, strict=True) - return cls(filepath=filepath) - - @staticmethod - def load_data(filepath: Union[str, Path]) -> dict: - filepath = safe_system_path(file_name=filepath) - return get_sync_data(sync_path=filepath) diff --git a/allensdk/brain_observatory/behavior/data_objects/__init__.py b/allensdk/brain_observatory/behavior/data_objects/__init__.py deleted file mode 100644 index 9ea4e7d0c3..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from allensdk.brain_observatory.behavior.data_objects.base._data_object_abc import DataObject # noqa: E501, F401 -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.behavior_session_id import BehaviorSessionId # noqa: E501, F401 -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .stimulus_timestamps.stimulus_timestamps import StimulusTimestamps # noqa: E501, F401 -from allensdk.brain_observatory.behavior.data_objects.running_speed.running_speed import RunningSpeed # noqa: E501, F401 -from allensdk.brain_observatory.behavior.data_objects.running_speed.running_acquisition import RunningAcquisition # noqa: E501, F401 diff --git a/allensdk/brain_observatory/behavior/data_objects/base/__init__.py b/allensdk/brain_observatory/behavior/data_objects/base/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/base/_data_object_abc.py b/allensdk/brain_observatory/behavior/data_objects/base/_data_object_abc.py deleted file mode 100644 index 3119ee77a3..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/base/_data_object_abc.py +++ /dev/null @@ -1,160 +0,0 @@ -import abc -from collections import deque -from enum import Enum -from typing import Any, Optional, Set - -from allensdk.brain_observatory.comparison_utils import compare_fields - - -class DataObject(abc.ABC): - """An abstract class that prototypes properties that represent a - category of experimental data/metadata (e.g. running speed, - rewards, licks, etc.) and that prototypes methods to allow conversion of - the experimental data/metadata to and from various - data sources and sinks (e.g. LIMS, JSON, NWB). - """ - - def __init__(self, name: str, value: Any, - exclude_from_equals: Optional[Set[str]] = None): - """ - :param name - Name - :param value - Value - :param exclude_from_equals - Optional set which will exclude these properties from comparison - checks to another DataObject - """ - self._name = name - self._value = value - - efe = exclude_from_equals if exclude_from_equals else set() - self._exclude_from_equals = efe - - @property - def name(self) -> str: - return self._name - - @property - def value(self) -> Any: - return self._value - - def to_dict(self) -> dict: - """ - Serialize DataObject to dict - :return - A nested dict serializing the DataObject - - notes - If a DataObject contains properties, these properties will either: - 1) be serialized to nested dict with "name" attribute of - DataObject if the property is itself a DataObject - 2) Value for property will be added with name of property - :examples - >>> class Simple(DataObject): - ... def __init__(self): - ... super().__init__(name='simple', value=1) - >>> s = Simple() - >>> assert s.to_dict() == {'simple': 1} - - >>> class B(DataObject): - ... def __init__(self): - ... super().__init__(name='b', value='!') - - >>> class A(DataObject): - ... def __init__(self, b: B): - ... super().__init__(name='a', value=self) - ... self._b = b - ... @property - ... def prop1(self): - ... return self._b - ... @property - ... def prop2(self): - ... return '@' - >>> a = A(b=B()) - >>> assert a.to_dict() == {'a': {'b': '!', 'prop2': '@'}} - """ - res = dict() - q = deque([(self._name, self, [])]) - - while q: - name, value, path = q.popleft() - if isinstance(value, DataObject): - # The path stores the nested key structure - # Here, build onto the nested key structure - newpath = path + [name] - - def _get_keys_and_values(base_value: DataObject): - properties = [] - for name, value in base_value._get_properties().items(): - if value is base_value: - # skip properties that return self - # (leads to infinite recursion) - continue - if name == 'name': - # The name is the key - continue - - if isinstance(value, DataObject): - # The key will be the DataObject "name" field - name = value._name - else: - # The key will be the property name - pass - properties.append((name, value, newpath)) - return properties - properties = _get_keys_and_values(base_value=value) - - # Find the nested dict - cur = res - for p in path: - cur = cur[p] - - if isinstance(value._value, DataObject): - # it's nested - cur[value._name] = dict() - for p in properties: - q.append(p) - else: - # it's flat - cur[name] = value._value - - else: - cur = res - for p in path: - cur = cur[p] - - if isinstance(value, Enum): - # convert to string - value = value.value - cur[name] = value - - return res - - def _get_properties(self): - """Returns all property names and values""" - def is_prop(attr): - return isinstance(getattr(type(self), attr, None), property) - props = [attr for attr in dir(self) if is_prop(attr)] - return {name: getattr(self, name) for name in props} - - def __eq__(self, other: "DataObject"): - if type(self) != type(other): - msg = f'Do not know how to compare with type {type(other)}' - raise NotImplementedError(msg) - - d_self = self.to_dict() - d_other = other.to_dict() - - for p in d_self: - if p in self._exclude_from_equals: - continue - x1 = d_self[p] - x2 = d_other[p] - - try: - compare_fields(x1=x1, x2=x2, - ignore_keys=self._exclude_from_equals) - except AssertionError: - return False - return True diff --git a/allensdk/brain_observatory/behavior/data_objects/base/readable_interfaces.py b/allensdk/brain_observatory/behavior/data_objects/base/readable_interfaces.py deleted file mode 100644 index f7c589802c..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/base/readable_interfaces.py +++ /dev/null @@ -1,105 +0,0 @@ -import abc - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject - - -class JsonReadableInterface(abc.ABC): - """Marks a data object as readable from json""" - @classmethod - @abc.abstractmethod - def from_json(cls, dict_repr: dict) -> "DataObject": # pragma: no cover - """Populates a DataFile from a JSON compatible dict (likely parsed by - argschema) - - Returns - ------- - DataObject: - An instantiated DataObject which has `name` and `value` properties - """ - raise NotImplementedError() - - -class LimsReadableInterface(abc.ABC): - """Marks a data object as readable from LIMS""" - @classmethod - @abc.abstractmethod - def from_lims(cls, *args) -> "DataObject": # pragma: no cover - """Populate a DataObject from an internal database (likely LIMS) - - Returns - ------- - DataObject: - An instantiated DataObject which has `name` and `value` properties - """ - # Example: - # return cls(name="my_data_object", value=42) - raise NotImplementedError() - - -class NwbReadableInterface(abc.ABC): - """Marks a data object as readable from NWB""" - @classmethod - @abc.abstractmethod - def from_nwb(cls, nwbfile: NWBFile) -> "DataObject": # pragma: no cover - """Populate a DataObject from a pyNWB file object. - - Parameters - ---------- - nwbfile: - The file object (NWBFile) of a pynwb dataset file. - - Returns - ------- - DataObject: - An instantiated DataObject which has `name` and `value` properties - """ - raise NotImplementedError() - - -class DataFileReadableInterface(abc.ABC): - """Marks a data object as readable from various data files, not covered by - existing interfaces""" - @classmethod - @abc.abstractmethod - def from_data_file(cls, *args) -> "DataObject": - """Populate a DataObject from the data file - - Returns - ------- - DataObject: - An instantiated DataObject which has `name` and `value` properties - """ - raise NotImplementedError() - - -class StimulusFileReadableInterface(abc.ABC): - """Marks a data object as readable from stimulus file""" - @classmethod - @abc.abstractmethod - def from_stimulus_file(cls, stimulus_file: StimulusFile) -> "DataObject": - """Populate a DataObject from the stimulus file - - Returns - ------- - DataObject: - An instantiated DataObject which has `name` and `value` properties - """ - raise NotImplementedError() - - -class SyncFileReadableInterface(abc.ABC): - """Marks a data object as readable from sync file""" - @classmethod - @abc.abstractmethod - def from_sync_file(cls, *args) -> "DataObject": - """Populate a DataObject from the sync file - - Returns - ------- - DataObject: - An instantiated DataObject which has `name` and `value` properties - """ - raise NotImplementedError() diff --git a/allensdk/brain_observatory/behavior/data_objects/base/writable_interfaces.py b/allensdk/brain_observatory/behavior/data_objects/base/writable_interfaces.py deleted file mode 100644 index 04d04fef96..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/base/writable_interfaces.py +++ /dev/null @@ -1,40 +0,0 @@ -import abc - -from pynwb import NWBFile - - -class JsonWritableInterface(abc.ABC): - """Marks a data object as writable to NWB""" - @abc.abstractmethod - def to_json(self) -> dict: # pragma: no cover - """Given an already populated DataObject, return the dict that - when used with the `from_json()` classmethod would produce the same - DataObject - - Returns - ------- - dict: - The JSON (in dict form) that would produce the DataObject. - """ - raise NotImplementedError() - - -class NwbWritableInterface(abc.ABC): - """Marks a data object as writable to NWB""" - @abc.abstractmethod - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: # pragma: no cover - """Given an already populated DataObject, return an pyNWB file object - that had had DataObject data added. - - Parameters - ---------- - nwbfile : NWBFile - An NWB file object - - Returns - ------- - NWBFile - An NWB file object that has had data from the DataObject added - to it. - """ - raise NotImplementedError() diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/__init__.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py deleted file mode 100644 index a626083a9f..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py +++ /dev/null @@ -1,606 +0,0 @@ -from typing import Optional, Tuple - -import numpy as np -import pandas as pd -from pynwb import NWBFile, ProcessingModule -from pynwb.ophys import OpticalChannel, ImageSegmentation - -import allensdk.brain_observatory.roi_masks as roi -from allensdk.brain_observatory.behavior.data_files.demix_file import DemixFile -from allensdk.brain_observatory.behavior.data_files.dff_file import DFFFile -from allensdk.brain_observatory.behavior.data_files.event_detection_file \ - import \ - EventDetectionFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.cell_specimens.events \ - import \ - Events -from allensdk.brain_observatory.behavior.data_objects.cell_specimens.traces \ - .corrected_fluorescence_traces import \ - CorrectedFluorescenceTraces -from allensdk.brain_observatory.behavior.data_objects.cell_specimens.traces \ - .dff_traces import \ - DFFTraces -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.field_of_view_shape import \ - FieldOfViewShape -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.imaging_plane import \ - ImagingPlane -from allensdk.brain_observatory.behavior.data_objects.timestamps \ - .ophys_timestamps import \ - OphysTimestamps -from allensdk.brain_observatory.behavior.image_api import Image -from allensdk.brain_observatory.nwb import CELL_SPECIMEN_COL_DESCRIPTIONS -from allensdk.brain_observatory.nwb.nwb_utils import add_image_to_nwb -from allensdk.internal.api import PostgresQueryMixin - - -class EventsParams: - """Container for arguments to event detection""" - - def __init__(self, - filter_scale: float = 2, - filter_n_time_steps: int = 20): - """ - :param filter_scale - See Events.filter_scale - :param filter_n_time_steps - See Events.filter_n_time_steps - """ - self._filter_scale = filter_scale - self._filter_n_time_steps = filter_n_time_steps - - @property - def filter_scale(self): - return self._filter_scale - - @property - def filter_n_time_steps(self): - return self._filter_n_time_steps - - -class CellSpecimenMeta(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface): - """Cell specimen metadata""" - def __init__(self, imaging_plane: ImagingPlane, emission_lambda=520.0): - super().__init__(name='cell_spcimen_meta', value=self) - self._emission_lambda = emission_lambda - self._imaging_plane = imaging_plane - - @property - def emission_lambda(self): - return self._emission_lambda - - @property - def imaging_plane(self): - return self._imaging_plane - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin, - ophys_timestamps: OphysTimestamps) -> "CellSpecimenMeta": - imaging_plane_meta = ImagingPlane.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, - ophys_timestamps=ophys_timestamps) - return cls(imaging_plane=imaging_plane_meta) - - @classmethod - def from_json(cls, dict_repr: dict, - ophys_timestamps: OphysTimestamps) -> "CellSpecimenMeta": - imaging_plane_meta = ImagingPlane.from_json( - dict_repr=dict_repr, ophys_timestamps=ophys_timestamps) - return cls(imaging_plane=imaging_plane_meta) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "CellSpecimenMeta": - ophys_module = nwbfile.processing['ophys'] - image_seg = ophys_module.data_interfaces['image_segmentation'] - plane_segmentations = image_seg.plane_segmentations - cell_specimen_table = plane_segmentations['cell_specimen_table'] - - imaging_plane = cell_specimen_table.imaging_plane - optical_channel = imaging_plane.optical_channel[0] - emission_lambda = optical_channel.emission_lambda - - imaging_plane = ImagingPlane.from_nwb(nwbfile=nwbfile) - return CellSpecimenMeta(emission_lambda=emission_lambda, - imaging_plane=imaging_plane) - - -class CellSpecimens(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface, - NwbWritableInterface): - def __init__(self, - cell_specimen_table: pd.DataFrame, - meta: CellSpecimenMeta, - dff_traces: DFFTraces, - corrected_fluorescence_traces: CorrectedFluorescenceTraces, - events: Events, - ophys_timestamps: OphysTimestamps, - segmentation_mask_image_spacing: Tuple, - exclude_invalid_rois=True): - """ - A container for cell specimens including traces, events, metadata, etc. - - Parameters - ---------- - cell_specimen_table - index cell_specimen_id - columns: - - cell_roi_id - - height - - mask_image_plane - - max_correction_down - - max_correction_left - - max_correction_right - - max_correction_up - - roi_mask - - valid_roi - - width - - x - - y - meta - dff_traces - corrected_fluorescence_traces - events - ophys_timestamps - segmentation_mask_image_spacing - Spacing to pass to sitk when constructing segmentation mask image - exclude_invalid_rois - Whether to exclude invalid rois - - """ - super().__init__(name='cell_specimen_table', value=self) - - # Validate ophys timestamps, traces - ophys_timestamps = ophys_timestamps.validate( - number_of_frames=dff_traces.get_number_of_frames()) - self._validate_traces( - ophys_timestamps=ophys_timestamps, dff_traces=dff_traces, - corrected_fluorescence_traces=corrected_fluorescence_traces, - cell_roi_ids=cell_specimen_table['cell_roi_id'].values) - - if exclude_invalid_rois: - cell_specimen_table = cell_specimen_table[ - cell_specimen_table['valid_roi']] - - # Filter/reorder rois according to cell_specimen_table - dff_traces.filter_and_reorder( - roi_ids=cell_specimen_table['cell_roi_id'].values) - corrected_fluorescence_traces.filter_and_reorder( - roi_ids=cell_specimen_table['cell_roi_id'].values) - - # Note: setting raise_if_rois_missing to False for events, since - # there seem to be cases where cell_specimen_table contains rois not in - # events - # See ie https://app.zenhub.com/workspaces/allensdk-10-5c17f74db59cfb36f158db8c/issues/alleninstitute/allensdk/2139 # noqa - events.filter_and_reorder( - roi_ids=cell_specimen_table['cell_roi_id'].values, - raise_if_rois_missing=False) - - self._meta = meta - self._cell_specimen_table = cell_specimen_table - self._dff_traces = dff_traces - self._corrected_fluorescence_traces = corrected_fluorescence_traces - self._events = events - self._segmentation_mask_image = self._get_segmentation_mask_image( - spacing=segmentation_mask_image_spacing) - - @property - def table(self) -> pd.DataFrame: - return self._cell_specimen_table - - @property - def roi_masks(self) -> pd.DataFrame: - return self._cell_specimen_table[['cell_roi_id', 'roi_mask']] - - @property - def meta(self) -> CellSpecimenMeta: - return self._meta - - @property - def dff_traces(self) -> pd.DataFrame: - df = self.table[['cell_roi_id']].join(self._dff_traces.value, - on='cell_roi_id') - return df - - @property - def corrected_fluorescence_traces(self) -> pd.DataFrame: - df = self.table[['cell_roi_id']].join( - self._corrected_fluorescence_traces.value, on='cell_roi_id') - return df - - @property - def events(self) -> pd.DataFrame: - df = self.table.reset_index() - df = df[['cell_roi_id', 'cell_specimen_id']] \ - .merge(self._events.value, on='cell_roi_id') - df = df.set_index('cell_specimen_id') - return df - - @property - def segmentation_mask_image(self) -> Image: - return self._segmentation_mask_image - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin, - ophys_timestamps: OphysTimestamps, - segmentation_mask_image_spacing: Tuple, - exclude_invalid_rois=True, - events_params: Optional[EventsParams] = None) \ - -> "CellSpecimens": - def _get_ophys_cell_segmentation_run_id() -> int: - """Get the ophys cell segmentation run id associated with an - ophys experiment id""" - query = """ - SELECT oseg.id - FROM ophys_experiments oe - JOIN ophys_cell_segmentation_runs oseg - ON oe.id = oseg.ophys_experiment_id - WHERE oseg.current = 't' - AND oe.id = {}; - """.format(ophys_experiment_id) - return lims_db.fetchone(query, strict=True) - - def _get_cell_specimen_table(): - ophys_cell_seg_run_id = _get_ophys_cell_segmentation_run_id() - query = """ - SELECT * - FROM cell_rois cr - WHERE cr.ophys_cell_segmentation_run_id = {}; - """.format(ophys_cell_seg_run_id) - initial_cs_table = pd.read_sql(query, lims_db.get_connection()) - cst = initial_cs_table.rename( - columns={'id': 'cell_roi_id', 'mask_matrix': 'roi_mask'}) - cst.drop(['ophys_experiment_id', - 'ophys_cell_segmentation_run_id'], - inplace=True, axis=1) - cst = cst.to_dict() - fov_shape = FieldOfViewShape.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - cst = cls._postprocess( - cell_specimen_table=cst, fov_shape=fov_shape) - return cst - - def _get_dff_traces(): - dff_file = DFFFile.from_lims( - ophys_experiment_id=ophys_experiment_id, - db=lims_db) - return DFFTraces.from_data_file( - dff_file=dff_file) - - def _get_corrected_fluorescence_traces(): - demix_file = DemixFile.from_lims( - ophys_experiment_id=ophys_experiment_id, - db=lims_db) - return CorrectedFluorescenceTraces.from_data_file( - demix_file=demix_file) - - def _get_events(): - events_file = EventDetectionFile.from_lims( - ophys_experiment_id=ophys_experiment_id, - db=lims_db) - return cls._get_events(events_file=events_file, - events_params=events_params) - - cell_specimen_table = _get_cell_specimen_table() - meta = CellSpecimenMeta.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db, - ophys_timestamps=ophys_timestamps) - dff_traces = _get_dff_traces() - corrected_fluorescence_traces = _get_corrected_fluorescence_traces() - events = _get_events() - - return CellSpecimens( - cell_specimen_table=cell_specimen_table, meta=meta, - dff_traces=dff_traces, - corrected_fluorescence_traces=corrected_fluorescence_traces, - events=events, - ophys_timestamps=ophys_timestamps, - segmentation_mask_image_spacing=segmentation_mask_image_spacing, - exclude_invalid_rois=exclude_invalid_rois - ) - - @classmethod - def from_json(cls, dict_repr: dict, - ophys_timestamps: OphysTimestamps, - segmentation_mask_image_spacing: Tuple, - exclude_invalid_rois=True, - events_params: Optional[EventsParams] = None) \ - -> "CellSpecimens": - cell_specimen_table = dict_repr['cell_specimen_table_dict'] - fov_shape = FieldOfViewShape.from_json(dict_repr=dict_repr) - cell_specimen_table = cls._postprocess( - cell_specimen_table=cell_specimen_table, fov_shape=fov_shape) - - def _get_dff_traces(): - dff_file = DFFFile.from_json(dict_repr=dict_repr) - return DFFTraces.from_data_file( - dff_file=dff_file) - - def _get_corrected_fluorescence_traces(): - demix_file = DemixFile.from_json(dict_repr=dict_repr) - return CorrectedFluorescenceTraces.from_data_file( - demix_file=demix_file) - - def _get_events(): - events_file = EventDetectionFile.from_json(dict_repr=dict_repr) - return cls._get_events(events_file=events_file, - events_params=events_params) - - meta = CellSpecimenMeta.from_json(dict_repr=dict_repr, - ophys_timestamps=ophys_timestamps) - dff_traces = _get_dff_traces() - corrected_fluorescence_traces = _get_corrected_fluorescence_traces() - events = _get_events() - return CellSpecimens( - cell_specimen_table=cell_specimen_table, meta=meta, - dff_traces=dff_traces, - corrected_fluorescence_traces=corrected_fluorescence_traces, - events=events, - ophys_timestamps=ophys_timestamps, - segmentation_mask_image_spacing=segmentation_mask_image_spacing, - exclude_invalid_rois=exclude_invalid_rois) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile, - segmentation_mask_image_spacing: Tuple, - exclude_invalid_rois=True, - events_params: Optional[EventsParams] = None) \ - -> "CellSpecimens": - # NOTE: ROI masks are stored in full frame width and height arrays - ophys_module = nwbfile.processing['ophys'] - image_seg = ophys_module.data_interfaces['image_segmentation'] - plane_segmentations = image_seg.plane_segmentations - cell_specimen_table = plane_segmentations['cell_specimen_table'] - - def _read_table(cell_specimen_table): - df = cell_specimen_table.to_dataframe() - - # Ensure int64 used instead of int32 - df = df.astype( - {col: 'int64' for col in df.select_dtypes('int32').columns}) - - # Because pynwb stores this field as "image_mask", it is renamed - # here - df = df.rename(columns={'image_mask': 'roi_mask'}) - - df.index.rename('cell_roi_id', inplace=True) - df['cell_specimen_id'] = [None if id_ == -1 else id_ - for id_ in df['cell_specimen_id'].values] - - df.reset_index(inplace=True) - df.set_index('cell_specimen_id', inplace=True) - return df - - df = _read_table(cell_specimen_table=cell_specimen_table) - meta = CellSpecimenMeta.from_nwb(nwbfile=nwbfile) - dff_traces = DFFTraces.from_nwb(nwbfile=nwbfile) - corrected_fluorescence_traces = CorrectedFluorescenceTraces.from_nwb( - nwbfile=nwbfile) - - def _get_events(): - ep = EventsParams() if events_params is None else events_params - return Events.from_nwb( - nwbfile=nwbfile, filter_scale=ep.filter_scale, - filter_n_time_steps=ep.filter_n_time_steps) - - events = _get_events() - ophys_timestamps = OphysTimestamps.from_nwb(nwbfile=nwbfile) - - return CellSpecimens( - cell_specimen_table=df, meta=meta, dff_traces=dff_traces, - corrected_fluorescence_traces=corrected_fluorescence_traces, - events=events, - ophys_timestamps=ophys_timestamps, - segmentation_mask_image_spacing=segmentation_mask_image_spacing, - exclude_invalid_rois=exclude_invalid_rois) - - def to_nwb(self, nwbfile: NWBFile, - ophys_timestamps: OphysTimestamps) -> NWBFile: - """ - :param nwbfile - In-memory nwb file object - :param ophys_timestamps - ophys timestamps - """ - # 1. Add cell specimen table - cell_roi_table = self.table.reset_index().set_index( - 'cell_roi_id') - metadata = nwbfile.lab_meta_data['metadata'] - - device = nwbfile.get_device() - - # FOV: - fov_width = metadata.field_of_view_width - fov_height = metadata.field_of_view_height - imaging_plane_description = \ - "{} field of view in {} at depth {} " \ - "um".format( - (fov_width, fov_height), - self._meta.imaging_plane.targeted_structure, - metadata.imaging_depth) - - # Optical Channel: - optical_channel = OpticalChannel( - name='channel_1', - description='2P Optical Channel', - emission_lambda=self._meta.emission_lambda) - - # Imaging Plane: - imaging_plane = nwbfile.create_imaging_plane( - name='imaging_plane_1', - optical_channel=optical_channel, - description=imaging_plane_description, - device=device, - excitation_lambda=self._meta.imaging_plane.excitation_lambda, - imaging_rate=self._meta.imaging_plane.ophys_frame_rate, - indicator=self._meta.imaging_plane.indicator, - location=self._meta.imaging_plane.targeted_structure) - - # Image Segmentation: - image_segmentation = ImageSegmentation(name="image_segmentation") - - if 'ophys' not in nwbfile.processing: - ophys_module = ProcessingModule('ophys', 'Ophys processing module') - nwbfile.add_processing_module(ophys_module) - else: - ophys_module = nwbfile.processing['ophys'] - - ophys_module.add_data_interface(image_segmentation) - - # Plane Segmentation: - plane_segmentation = image_segmentation.create_plane_segmentation( - name='cell_specimen_table', - description="Segmented rois", - imaging_plane=imaging_plane) - - for col_name in cell_roi_table.columns: - # the columns 'roi_mask', 'pixel_mask', and 'voxel_mask' are - # already defined in the nwb.ophys::PlaneSegmentation Object - if col_name not in ['id', 'mask_matrix', 'roi_mask', - 'pixel_mask', 'voxel_mask']: - # This builds the columns with name of column and description - # of column both equal to the column name in the cell_roi_table - plane_segmentation.add_column( - col_name, - CELL_SPECIMEN_COL_DESCRIPTIONS.get( - col_name, - "No Description Available")) - - # go through each roi and add it to the plan segmentation object - for cell_roi_id, table_row in cell_roi_table.iterrows(): - # NOTE: The 'roi_mask' in this cell_roi_table has already been - # processing by the function from - # allensdk.brain_observatory.behavior.session_apis.data_io - # .ophys_lims_api - # get_cell_specimen_table() method. As a result, the ROI is - # stored in - # an array that is the same shape as the FULL field of view of the - # experiment (e.g. 512 x 512). - mask = table_row.pop('roi_mask') - - csid = table_row.pop('cell_specimen_id') - table_row['cell_specimen_id'] = -1 if csid is None else csid - table_row['id'] = cell_roi_id - plane_segmentation.add_roi(image_mask=mask, **table_row.to_dict()) - - # 2. Add DFF traces - self._dff_traces.to_nwb(nwbfile=nwbfile, - ophys_timestamps=ophys_timestamps) - - # 3. Add Corrected fluorescence traces - self._corrected_fluorescence_traces.to_nwb(nwbfile=nwbfile) - - # 4. Add events - self._events.to_nwb(nwbfile=nwbfile) - - # 5. Add segmentation mask image - add_image_to_nwb(nwbfile=nwbfile, - image_data=self._segmentation_mask_image, - image_name='segmentation_mask_image') - - return nwbfile - - def _get_segmentation_mask_image(self, spacing: tuple) -> Image: - """a 2D binary image of all cell masks - - Parameters - ---------- - spacing - See image_api.Image for details - - Returns - ---------- - allensdk.brain_observatory.behavior.image_api.Image: - array-like interface to segmentation_mask image data and - metadata - """ - mask_data = np.sum(self.roi_masks['roi_mask']).astype(int) - - mask_image = Image( - data=mask_data, - spacing=spacing, - unit='mm' - ) - return mask_image - - @staticmethod - def _postprocess(cell_specimen_table: dict, - fov_shape: FieldOfViewShape) -> pd.DataFrame: - """Converts raw cell_specimen_table dict to dataframe""" - cell_specimen_table = pd.DataFrame.from_dict( - cell_specimen_table).set_index( - 'cell_roi_id').sort_index() - fov_width = fov_shape.width - fov_height = fov_shape.height - - # Convert cropped ROI masks to uncropped versions - roi_mask_list = [] - for cell_roi_id, table_row in cell_specimen_table.iterrows(): - # Deserialize roi data into AllenSDK RoiMask object - curr_roi = roi.RoiMask(image_w=fov_width, image_h=fov_height, - label=None, mask_group=-1) - curr_roi.x = table_row['x'] - curr_roi.y = table_row['y'] - curr_roi.width = table_row['width'] - curr_roi.height = table_row['height'] - curr_roi.mask = np.array(table_row['roi_mask']) - roi_mask_list.append(curr_roi.get_mask_plane().astype(np.bool)) - - cell_specimen_table['roi_mask'] = roi_mask_list - cell_specimen_table = cell_specimen_table[ - sorted(cell_specimen_table.columns)] - - cell_specimen_table.index.rename('cell_roi_id', inplace=True) - cell_specimen_table.reset_index(inplace=True) - cell_specimen_table.set_index('cell_specimen_id', inplace=True) - return cell_specimen_table - - def _validate_traces( - self, ophys_timestamps: OphysTimestamps, - dff_traces: DFFTraces, - corrected_fluorescence_traces: CorrectedFluorescenceTraces, - cell_roi_ids: np.ndarray): - """validates traces""" - trace_col_map = { - 'dff_traces': 'dff', - 'corrected_fluorescence_traces': 'corrected_fluorescence' - } - for traces in (dff_traces, corrected_fluorescence_traces): - # validate traces contain expected roi ids - if not np.in1d(traces.value.index, cell_roi_ids).all(): - raise RuntimeError(f"{traces.name} contains ROI IDs that " - f"are not in " - f"cell_specimen_table.cell_roi_id") - if not np.in1d(cell_roi_ids, traces.value.index).all(): - raise RuntimeError(f"cell_specimen_table contains ROI IDs " - f"that are not in {traces.name}") - - # validate traces contain expected timepoints - num_trace_timepoints = len(traces.value.iloc[0] - [trace_col_map[traces.name]]) - num_ophys_timestamps = ophys_timestamps.value.shape[0] - if num_trace_timepoints != num_ophys_timestamps: - raise RuntimeError(f'{traces.name} contains ' - f'{num_trace_timepoints} ' - f'but there are {num_ophys_timestamps} ' - f'ophys timestamps') - - @staticmethod - def _get_events(events_file: EventDetectionFile, - events_params: Optional[EventsParams] = None): - if events_params is None: - events_params = EventsParams() - return Events.from_data_file( - events_file=events_file, - filter_scale=events_params.filter_scale, - filter_n_time_steps=events_params.filter_n_time_steps) diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/events.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/events.py deleted file mode 100644 index ac45f255ae..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/events.py +++ /dev/null @@ -1,137 +0,0 @@ -import numpy as np -import pandas as pd -from hdmf.backends.hdf5 import H5DataIO -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files.event_detection_file \ - import \ - EventDetectionFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - DataFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ - .rois_mixin import \ - RoisMixin -from allensdk.brain_observatory.behavior.event_detection import \ - filter_events_array -from allensdk.brain_observatory.behavior.write_nwb.extensions\ - .event_detection.ndx_ophys_events import \ - OphysEventDetection - - -class Events(DataObject, RoisMixin, DataFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - """Events - columns: - events: np.array - lambda: float - noise_std: float - cell_roi_id: int - """ - def __init__(self, - events: np.ndarray, - events_meta: pd.DataFrame, - filter_scale: float = 2, - filter_n_time_steps: int = 20): - """ - Parameters - ---------- - events - events - events_meta - lambda, noise_std, cell_roi_id for each roi - filter_scale - See filter_events_array for description - filter_n_time_steps - See filter_events_array for description - """ - - filtered_events = filter_events_array( - arr=events, scale=filter_scale, n_time_steps=filter_n_time_steps) - - # Convert matrix to list of 1d arrays so that it can be stored - # in a single column of the dataframe - events = [x for x in events] - filtered_events = [x for x in filtered_events] - - df = pd.DataFrame({ - 'events': events, - 'filtered_events': filtered_events, - 'lambda': events_meta['lambda'], - 'noise_std': events_meta['noise_std'], - 'cell_roi_id': events_meta['cell_roi_id'] - }) - super().__init__(name='events', value=df) - - @classmethod - def from_data_file(cls, - events_file: EventDetectionFile, - filter_scale: float = 2, - filter_n_time_steps: int = 20) -> "Events": - events, events_meta = events_file.data - return cls(events=events, events_meta=events_meta, - filter_scale=filter_scale, - filter_n_time_steps=filter_n_time_steps) - - @classmethod - def from_nwb(cls, - nwbfile: NWBFile, - filter_scale: float = 2, - filter_n_time_steps: int = 20) -> "Events": - event_detection = nwbfile.processing['ophys']['event_detection'] - # NOTE: The rois with events are stored in event detection - partial_cell_specimen_table = event_detection.rois.to_dataframe() - - events = event_detection.data[:] - - # events stored time x roi. Change back to roi x time - events = events.T - - events_meta = pd.DataFrame({ - 'cell_roi_id': partial_cell_specimen_table.index, - 'lambda': event_detection.lambdas[:], - 'noise_std': event_detection.noise_stds[:] - }) - return cls(events=events, events_meta=events_meta, - filter_scale=filter_scale, - filter_n_time_steps=filter_n_time_steps) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - events = self.value.set_index('cell_roi_id') - - ophys_module = nwbfile.processing['ophys'] - dff_interface = ophys_module.data_interfaces['dff'] - traces = dff_interface.roi_response_series['traces'] - seg_interface = ophys_module.data_interfaces['image_segmentation'] - - cell_specimen_table = ( - seg_interface.plane_segmentations['cell_specimen_table']) - cell_specimen_df = cell_specimen_table.to_dataframe() - - # We only want to store the subset of rois that have events data - rois_with_events_indices = [cell_specimen_df.index.get_loc(label) - for label in events.index] - roi_table_region = cell_specimen_table.create_roi_table_region( - description="Cells with detected events", - region=rois_with_events_indices) - - events_data = np.vstack(events['events']) - events = OphysEventDetection( - # time x rois instead of rois x time - # store using compression since sparse - data=H5DataIO(events_data.T, compression=True), - - lambdas=events['lambda'].values, - noise_stds=events['noise_std'].values, - unit='N/A', - rois=roi_table_region, - timestamps=traces.timestamps - ) - - ophys_module.add_data_interface(events) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py deleted file mode 100644 index dda58a7a67..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py +++ /dev/null @@ -1,89 +0,0 @@ -import warnings - -import numpy as np -import pandas as pd - - -class RoisMixin: - """A mixin for a collection of rois stored as a dataframe - (._value is a dataframe)""" - _value: pd.DataFrame - - def filter_and_reorder(self, roi_ids: np.ndarray, - raise_if_rois_missing=True): - """Orders dataframe according to input roi_ids. - Will also filter dataframe to contain only rois given by roi_ids. - Use for, ie excluding invalid rois - - Parameters - ---------- - roi_ids - Filter/reorder _value to these roi_ids - raise_if_rois_missing - Whether to raise exception if there are rois in the input roi_ids - not in the dataframe - - Notes - ---------- - Will both filter and reorder dataframe to have same order as the - input roi_ids. - - If there are values in the input roi_ids that are not in the dataframe, - then these roi ids will be ignored and a warning will be logged. - - Raises - ---------- - RuntimeError if raise_if_rois_missing and there are input roi_ids not - in dataframe - """ - def handle_rois_in_input_not_in_dataframe(): - msg = f'Input contains roi ids not in ' \ - f'{type(self).__name__}.' - if raise_if_rois_missing: - raise RuntimeError(msg) - warnings.warn(msg) - - # Drop rows where NaN - self._value = self._value.dropna(axis=0) - - # Make sure dtypes same after dropping NaN rows - # (adding NaN records coerces int to float) - for c in self._value: - # Skipping column added due to reset_index - if c == 'index': - continue - - if self._value[c].dtype != original_dtypes[c]: - self._value[c] = self._value[c].astype(original_dtypes[c]) - - original_index_name = self._value.index.name - original_index_type = self._value.index.dtype - original_dtypes = self._value.dtypes - if original_index_name is None: - original_index_name = 'index' - - if original_index_name != 'cell_roi_id': - self._value = (self._value - .reset_index() - .set_index('cell_roi_id')) - - # Reorders dataframe according to roi_ids - self._value = self._value.reindex(roi_ids) - - is_na = self._value.isna().any(axis=0) - - if is_na.any(): - # There are some roi ids in input not in index. - handle_rois_in_input_not_in_dataframe() - - if original_index_name != 'cell_roi_id': - # Set it back to the original index - self._value = (self._value - .reset_index() - .set_index(original_index_name)) - # Set index back to original dtype - # (can get coerced from int to float) - self._value.index = self._value.index.astype(original_index_type) - if original_index_name == 'index': - # Set it back to None - self._value.index.name = None diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py deleted file mode 100644 index 36f9a2cd9a..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py +++ /dev/null @@ -1,83 +0,0 @@ -import numpy as np -import pandas as pd -from pynwb import NWBFile -from pynwb.ophys import Fluorescence - -from allensdk.brain_observatory.behavior.data_files.demix_file import DemixFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - DataFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ - .rois_mixin import \ - RoisMixin - - -class CorrectedFluorescenceTraces(DataObject, RoisMixin, - DataFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - def __init__(self, traces: pd.DataFrame): - """ - - Parameters - ---------- - traces - index cell_roi_id - columns: - - corrected_fluorescence - list of float - """ - super().__init__(name='corrected_fluorescence_traces', value=traces) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) \ - -> "CorrectedFluorescenceTraces": - corr_fluorescence_nwb = nwbfile.processing[ - 'ophys'].data_interfaces[ - 'corrected_fluorescence'].roi_response_series['traces'] - # f traces stored as timepoints x rois in NWB - # We want rois x timepoints, hence the transpose - f_traces = corr_fluorescence_nwb.data[:].T - df = pd.DataFrame({'corrected_fluorescence': f_traces.tolist()}, - index=pd.Index( - data=corr_fluorescence_nwb.rois.table.id[:], - name='cell_roi_id')) - return cls(traces=df) - - @classmethod - def from_data_file(cls, - demix_file: DemixFile) \ - -> "CorrectedFluorescenceTraces": - corrected_fluorescence_traces = demix_file.data - return cls(traces=corrected_fluorescence_traces) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - corrected_fluorescence_traces = self.value['corrected_fluorescence'] - - # Convert from Series of lists to numpy array - # of shape ROIs x timepoints - traces = np.stack( - [x for x in corrected_fluorescence_traces]) - - # Create/Add corrected_fluorescence_traces modules and interfaces: - ophys_module = nwbfile.processing['ophys'] - - roi_table_region = \ - nwbfile.processing['ophys'].data_interfaces[ - 'dff'].roi_response_series[ - 'traces'].rois # noqa: E501 - ophys_timestamps = ophys_module.get_data_interface( - 'dff').roi_response_series['traces'].timestamps - f_interface = Fluorescence(name='corrected_fluorescence') - ophys_module.add_data_interface(f_interface) - - f_interface.create_roi_response_series( - name='traces', - data=traces.T, # Should be stored as timepoints x rois - unit='NA', - rois=roi_table_region, - timestamps=ophys_timestamps) - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py deleted file mode 100644 index 8b8f5af6aa..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py +++ /dev/null @@ -1,88 +0,0 @@ -import pandas as pd -import numpy as np -from pynwb import NWBFile -from pynwb.ophys import DfOverF - -from allensdk.brain_observatory.behavior.data_files.dff_file import DFFFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - DataFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ - .rois_mixin import \ - RoisMixin -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .ophys_timestamps import \ - OphysTimestamps - - -class DFFTraces(DataObject, RoisMixin, - DataFileReadableInterface, NwbReadableInterface, - NwbWritableInterface): - def __init__(self, traces: pd.DataFrame): - """ - Parameters - ---------- - traces - index cell_roi_id - columns: - dff: List of float - """ - super().__init__(name='dff_traces', value=traces) - - def to_nwb(self, nwbfile: NWBFile, - ophys_timestamps: OphysTimestamps) -> NWBFile: - dff_traces = self.value[['dff']] - - ophys_module = nwbfile.processing['ophys'] - # trace data in the form of rois x timepoints - trace_data = np.array([dff_traces.loc[cell_roi_id].dff - for cell_roi_id in dff_traces.index.values]) - - cell_specimen_table = nwbfile.processing['ophys'].data_interfaces[ - 'image_segmentation'].plane_segmentations[ - 'cell_specimen_table'] # noqa: E501 - roi_table_region = cell_specimen_table.create_roi_table_region( - description="segmented cells labeled by cell_specimen_id", - region=slice(len(dff_traces))) - - # Create/Add dff modules and interfaces: - assert dff_traces.index.name == 'cell_roi_id' - dff_interface = DfOverF(name='dff') - ophys_module.add_data_interface(dff_interface) - - dff_interface.create_roi_response_series( - name='traces', - data=trace_data.T, # Should be stored as timepoints x rois - unit='NA', - rois=roi_table_region, - timestamps=ophys_timestamps.value) - - return nwbfile - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "DFFTraces": - dff_nwb = nwbfile.processing[ - 'ophys'].data_interfaces['dff'].roi_response_series['traces'] - # dff traces stored as timepoints x rois in NWB - # We want rois x timepoints, hence the transpose - dff_traces = dff_nwb.data[:].T - - df = pd.DataFrame({'dff': dff_traces.tolist()}, - index=pd.Index(data=dff_nwb.rois.table.id[:], - name='cell_roi_id')) - return DFFTraces(traces=df) - - @classmethod - def from_data_file(cls, dff_file: DFFFile) -> "DFFTraces": - dff_traces = dff_file.data - return DFFTraces(traces=dff_traces) - - def get_number_of_frames(self) -> int: - """Returns the number of frames in the movie""" - if self.value.empty: - raise RuntimeError('Cannot determine number of frames') - return len(self.value.iloc[0]['dff']) diff --git a/allensdk/brain_observatory/behavior/data_objects/eye_tracking/__init__.py b/allensdk/brain_observatory/behavior/data_objects/eye_tracking/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py b/allensdk/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py deleted file mode 100644 index 6a765afe28..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py +++ /dev/null @@ -1,198 +0,0 @@ -import logging -import warnings -from pathlib import Path -from typing import Optional - -import numpy as np -import pandas as pd -from pynwb import NWBFile, TimeSeries - -from allensdk.brain_observatory import sync_utilities -from allensdk.brain_observatory.behavior.data_files import SyncFile -from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ - EyeTrackingFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - NwbReadableInterface, DataFileReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.eye_tracking_processing import \ - process_eye_tracking_data, determine_outliers, determine_likely_blinks -from allensdk.brain_observatory.nwb.eye_tracking.ndx_ellipse_eye_tracking \ - import \ - EllipseSeries, EllipseEyeTracking -from allensdk.brain_observatory.sync_dataset import Dataset - - -class EyeTrackingTable(DataObject, DataFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - """corneal, eye, and pupil ellipse fit data""" - _logger = logging.getLogger(__name__) - - def __init__(self, eye_tracking: pd.DataFrame): - super().__init__(name='eye_tracking', value=eye_tracking) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - eye_tracking_df = self.value - - eye_tracking = EllipseSeries( - name='eye_tracking', - reference_frame='nose', - data=eye_tracking_df[['eye_center_x', 'eye_center_y']].values, - area=eye_tracking_df['eye_area'].values, - area_raw=eye_tracking_df['eye_area_raw'].values, - width=eye_tracking_df['eye_width'].values, - height=eye_tracking_df['eye_height'].values, - angle=eye_tracking_df['eye_phi'].values, - timestamps=eye_tracking_df['timestamps'].values - ) - - pupil_tracking = EllipseSeries( - name='pupil_tracking', - reference_frame='nose', - data=eye_tracking_df[['pupil_center_x', 'pupil_center_y']].values, - area=eye_tracking_df['pupil_area'].values, - area_raw=eye_tracking_df['pupil_area_raw'].values, - width=eye_tracking_df['pupil_width'].values, - height=eye_tracking_df['pupil_height'].values, - angle=eye_tracking_df['pupil_phi'].values, - timestamps=eye_tracking - ) - - corneal_reflection_tracking = EllipseSeries( - name='corneal_reflection_tracking', - reference_frame='nose', - data=eye_tracking_df[['cr_center_x', 'cr_center_y']].values, - area=eye_tracking_df['cr_area'].values, - area_raw=eye_tracking_df['cr_area_raw'].values, - width=eye_tracking_df['cr_width'].values, - height=eye_tracking_df['cr_height'].values, - angle=eye_tracking_df['cr_phi'].values, - timestamps=eye_tracking - ) - - likely_blink = TimeSeries(timestamps=eye_tracking, - data=eye_tracking_df['likely_blink'].values, - name='likely_blink', - description='blinks', - unit='N/A') - - ellipse_eye_tracking = EllipseEyeTracking( - eye_tracking=eye_tracking, - pupil_tracking=pupil_tracking, - corneal_reflection_tracking=corneal_reflection_tracking, - likely_blink=likely_blink - ) - - nwbfile.add_acquisition(ellipse_eye_tracking) - return nwbfile - - @classmethod - def from_nwb(cls, nwbfile: NWBFile, - z_threshold: float = 3.0, - dilation_frames: int = 2) -> Optional["EyeTrackingTable"]: - """ - Parameters - ----------- - nwbfile - z_threshold - See from_lims for description - dilation_frames - See from_lims for description - """ - try: - eye_tracking_acquisition = nwbfile.acquisition['EyeTracking'] - except KeyError as e: - warnings.warn("This ophys session " - f"'{int(nwbfile.identifier)}' has no eye " - f"tracking data. (NWB error: {e})") - return None - - eye_tracking = eye_tracking_acquisition.eye_tracking - pupil_tracking = eye_tracking_acquisition.pupil_tracking - corneal_reflection_tracking = \ - eye_tracking_acquisition.corneal_reflection_tracking - - eye_tracking_dict = { - "timestamps": eye_tracking.timestamps[:], - "cr_area": corneal_reflection_tracking.area_raw[:], - "eye_area": eye_tracking.area_raw[:], - "pupil_area": pupil_tracking.area_raw[:], - "likely_blink": eye_tracking_acquisition.likely_blink.data[:], - - "pupil_area_raw": pupil_tracking.area_raw[:], - "cr_area_raw": corneal_reflection_tracking.area_raw[:], - "eye_area_raw": eye_tracking.area_raw[:], - - "cr_center_x": corneal_reflection_tracking.data[:, 0], - "cr_center_y": corneal_reflection_tracking.data[:, 1], - "cr_width": corneal_reflection_tracking.width[:], - "cr_height": corneal_reflection_tracking.height[:], - "cr_phi": corneal_reflection_tracking.angle[:], - - "eye_center_x": eye_tracking.data[:, 0], - "eye_center_y": eye_tracking.data[:, 1], - "eye_width": eye_tracking.width[:], - "eye_height": eye_tracking.height[:], - "eye_phi": eye_tracking.angle[:], - - "pupil_center_x": pupil_tracking.data[:, 0], - "pupil_center_y": pupil_tracking.data[:, 1], - "pupil_width": pupil_tracking.width[:], - "pupil_height": pupil_tracking.height[:], - "pupil_phi": pupil_tracking.angle[:], - - } - - eye_tracking_data = pd.DataFrame(eye_tracking_dict) - eye_tracking_data.index = eye_tracking_data.index.rename('frame') - - # re-calculate likely blinks for new z_threshold and dilate_frames - area_df = eye_tracking_data[['eye_area_raw', 'pupil_area_raw']] - outliers = determine_outliers(area_df, z_threshold=z_threshold) - likely_blinks = determine_likely_blinks( - eye_tracking_data['eye_area_raw'], - eye_tracking_data['pupil_area_raw'], - outliers, - dilation_frames=dilation_frames) - - eye_tracking_data["likely_blink"] = likely_blinks - eye_tracking_data.at[likely_blinks, "eye_area"] = np.nan - eye_tracking_data.at[likely_blinks, "pupil_area"] = np.nan - eye_tracking_data.at[likely_blinks, "cr_area"] = np.nan - - return EyeTrackingTable(eye_tracking=eye_tracking_data) - - @classmethod - def from_data_file(cls, data_file: EyeTrackingFile, - sync_file: SyncFile, - z_threshold: float = 3.0, dilation_frames: int = 2 - ) -> "EyeTrackingTable": - """ - Parameters - ---------- - data_file - sync_file - z_threshold : float, optional - See EyeTracking.from_lims - dilation_frames : int, optional - See EyeTracking.from_lims - """ - cls._logger.info(f"Getting eye_tracking_data with " - f"'z_threshold={z_threshold}', " - f"'dilation_frames={dilation_frames}'") - - sync_path = Path(sync_file.filepath) - - frame_times = sync_utilities.get_synchronized_frame_times( - session_sync_file=sync_path, - sync_line_label_keys=Dataset.EYE_TRACKING_KEYS, - trim_after_spike=False) - - eye_tracking_data = process_eye_tracking_data(data_file.data, - frame_times, - z_threshold, - dilation_frames) - return EyeTrackingTable(eye_tracking=eye_tracking_data) diff --git a/allensdk/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py b/allensdk/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py deleted file mode 100644 index 692e818eb8..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py +++ /dev/null @@ -1,284 +0,0 @@ -import warnings - -import numpy as np -import pandas as pd -from typing import Optional - -import pynwb -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - LimsReadableInterface, JsonReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.schemas import \ - OphysEyeTrackingRigMetadataSchema -from allensdk.brain_observatory.nwb import load_pynwb_extension -from allensdk.internal.api import PostgresQueryMixin - - -class Coordinates: - """Represents coordinates in 3d space""" - def __init__(self, x: float, y: float, z: float): - self._x = x - self._y = y - self._z = z - - @property - def x(self): - return self._x - - @property - def y(self): - return self._y - - @property - def z(self): - return self._z - - def __iter__(self): - yield self._x - yield self._y - yield self._z - - def __eq__(self, other): - if type(other) not in (type(self), list): - raise ValueError(f'Do not know how to compare with type ' - f'{type(other)}') - if isinstance(other, list): - return self._x == other[0] and \ - self._y == other[1] and \ - self._z == other[2] - else: - return self._x == other.x and \ - self._y == other.y and \ - self._z == other.z - - def __str__(self): - return f'[{self._x}, {self._y}, {self._z}]' - - -class RigGeometry(DataObject, LimsReadableInterface, JsonReadableInterface, - NwbReadableInterface, NwbWritableInterface): - def __init__(self, equipment: str, - monitor_position_mm: Coordinates, - monitor_rotation_deg: Coordinates, - camera_position_mm: Coordinates, - camera_rotation_deg: Coordinates, - led_position: Coordinates): - super().__init__(name='rig_geometry', value=self) - self._monitor_position_mm = monitor_position_mm - self._monitor_rotation_deg = monitor_rotation_deg - self._camera_position_mm = camera_position_mm - self._camera_rotation_deg = camera_rotation_deg - self._led_position = led_position - self._equipment = equipment - - @property - def monitor_position_mm(self): - return self._monitor_position_mm - - @property - def monitor_rotation_deg(self): - return self._monitor_rotation_deg - - @property - def camera_position_mm(self): - return self._camera_position_mm - - @property - def camera_rotation_deg(self): - return self._camera_rotation_deg - - @property - def led_position(self): - return self._led_position - - @property - def equipment(self): - return self._equipment - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - eye_tracking_rig_mod = pynwb.ProcessingModule( - name='eye_tracking_rig_metadata', - description='Eye tracking rig metadata module') - - nwb_extension = load_pynwb_extension( - OphysEyeTrackingRigMetadataSchema, 'ndx-aibs-behavior-ophys') - - rig_metadata = nwb_extension( - name="eye_tracking_rig_metadata", - equipment=self._equipment, - monitor_position=list(self._monitor_position_mm), - monitor_position__unit_of_measurement="mm", - camera_position=list(self._camera_position_mm), - camera_position__unit_of_measurement="mm", - led_position=list(self._led_position), - led_position__unit_of_measurement="mm", - monitor_rotation=list(self._monitor_rotation_deg), - monitor_rotation__unit_of_measurement="deg", - camera_rotation=list(self._camera_rotation_deg), - camera_rotation__unit_of_measurement="deg" - ) - - eye_tracking_rig_mod.add_data_interface(rig_metadata) - nwbfile.add_processing_module(eye_tracking_rig_mod) - return nwbfile - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> Optional["RigGeometry"]: - try: - et_mod = \ - nwbfile.get_processing_module("eye_tracking_rig_metadata") - except KeyError as e: - warnings.warn("This ophys session " - f"'{int(nwbfile.identifier)}' has no eye " - f"tracking rig metadata. (NWB error: {e})") - return None - - meta = et_mod.get_data_interface("eye_tracking_rig_metadata") - - monitor_position = meta.monitor_position[:] - monitor_position = (monitor_position.tolist() - if isinstance(monitor_position, np.ndarray) - else monitor_position) - - monitor_rotation = meta.monitor_rotation[:] - monitor_rotation = (monitor_rotation.tolist() - if isinstance(monitor_rotation, np.ndarray) - else monitor_rotation) - - camera_position = meta.camera_position[:] - camera_position = (camera_position.tolist() - if isinstance(camera_position, np.ndarray) - else camera_position) - - camera_rotation = meta.camera_rotation[:] - camera_rotation = (camera_rotation.tolist() - if isinstance(camera_rotation, np.ndarray) - else camera_rotation) - - led_position = meta.led_position[:] - led_position = (led_position.tolist() - if isinstance(led_position, np.ndarray) - else led_position) - - return RigGeometry( - equipment=meta.equipment, - monitor_position_mm=Coordinates(*monitor_position), - camera_position_mm=Coordinates(*camera_position), - led_position=Coordinates(*led_position), - monitor_rotation_deg=Coordinates(*monitor_rotation), - camera_rotation_deg=Coordinates(*camera_rotation) - ) - - @classmethod - def from_json(cls, dict_repr: dict) -> "RigGeometry": - rg = dict_repr['eye_tracking_rig_geometry'] - return RigGeometry( - equipment=rg['equipment'], - monitor_position_mm=Coordinates(*rg['monitor_position_mm']), - monitor_rotation_deg=Coordinates(*rg['monitor_rotation_deg']), - camera_position_mm=Coordinates(*rg['camera_position_mm']), - camera_rotation_deg=Coordinates(*rg['camera_rotation_deg']), - led_position=Coordinates(*rg['led_position']) - ) - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> Optional["RigGeometry"]: - query = f''' - SELECT oec.*, oect.name as config_type, equipment.name as - equipment_name - FROM ophys_sessions os - JOIN observatory_experiment_configs oec ON oec.equipment_id = - os.equipment_id - JOIN observatory_experiment_config_types oect ON oect.id = - oec.observatory_experiment_config_type_id - JOIN ophys_experiments oe ON oe.ophys_session_id = os.id - JOIN equipment ON equipment.id = oec.equipment_id - WHERE oe.id = {ophys_experiment_id} AND - oec.active_date <= os.date_of_acquisition AND - oect.name IN ('eye camera position', 'led position', 'screen position') - ''' # noqa E501 - # Get the raw data - rig_geometry = pd.read_sql(query, lims_db.get_connection()) - - if rig_geometry.empty: - # There is no rig geometry for this experiment - return None - - # Map the config types to new names - rig_geometry_config_type_map = { - 'eye camera position': 'camera', - 'screen position': 'monitor', - 'led position': 'led' - } - rig_geometry['config_type'] = rig_geometry['config_type'] \ - .map(rig_geometry_config_type_map) - - rig_geometry = cls._select_most_recent_geometry( - rig_geometry=rig_geometry) - - # Construct dictionary for positions - position = rig_geometry[['center_x_mm', 'center_y_mm', 'center_z_mm']] - position.index = [ - f'{v}_position_mm' if v != 'led' - else f'{v}_position' for v in position.index] - position = position.to_dict(orient='index') - position = { - config_type: - Coordinates( - values['center_x_mm'], - values['center_y_mm'], - values['center_z_mm']) - for config_type, values in position.items() - } - - # Construct dictionary for rotations - rotation = rig_geometry[['rotation_x_deg', 'rotation_y_deg', - 'rotation_z_deg']] - rotation = rotation[rotation.index != 'led'] - rotation.index = [f'{v}_rotation_deg' for v in rotation.index] - rotation = rotation.to_dict(orient='index') - rotation = { - config_type: - Coordinates( - values['rotation_x_deg'], - values['rotation_y_deg'], - values['rotation_z_deg'] - ) - for config_type, values in rotation.items() - } - - # Combine the dictionaries - rig_geometry = { - **position, - **rotation, - 'equipment': rig_geometry['equipment_name'].iloc[0] - } - return RigGeometry(**rig_geometry) - - @staticmethod - def _select_most_recent_geometry(rig_geometry: pd.DataFrame): - """There can be multiple geometry entries in LIMS for a rig. - Select most recent one. - - Parameters - ---------- - rig_geometry - Table of geometries for rig as returned by LIMS - - Notes - ---------- - The geometries in rig_geometry are assumed to precede the - date_of_acquisition of the session - (only relevant for retrieving from LIMS) - """ - rig_geometry = rig_geometry.sort_values('active_date', ascending=False) - rig_geometry = rig_geometry.groupby('config_type') \ - .apply(lambda x: x.iloc[0]) - return rig_geometry diff --git a/allensdk/brain_observatory/behavior/data_objects/licks.py b/allensdk/brain_observatory/behavior/data_objects/licks.py deleted file mode 100644 index 1d93240140..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/licks.py +++ /dev/null @@ -1,124 +0,0 @@ -import logging -from typing import Optional - -import pandas as pd -from pynwb import NWBFile, TimeSeries, ProcessingModule - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - StimulusFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface - - -class Licks(DataObject, StimulusFileReadableInterface, NwbReadableInterface, - NwbWritableInterface): - _logger = logging.getLogger(__name__) - - def __init__(self, licks: pd.DataFrame): - """ - :param licks - dataframe containing the following columns: - - timestamps: float - stimulus timestamps in which there was a lick - - frame: int - frame number in which there was a lick - """ - super().__init__(name='licks', value=licks) - - @classmethod - def from_stimulus_file(cls, stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps) -> "Licks": - """Get lick data from pkl file. - This function assumes that the first sensor in the list of - lick_sensors is the desired lick sensor. - - Since licks can occur outside of a trial context, the lick times - are extracted from the vsyncs and the frame number in `lick_events`. - Since we don't have a timestamp for when in "experiment time" the - vsync stream starts (from self.get_stimulus_timestamps), we compute - it by fitting a linear regression (frame number x time) for the - `start_trial` and `end_trial` events in the `trial_log`, to true - up these time streams. - - :returns: pd.DataFrame - Two columns: "time", which contains the sync time - of the licks that occurred in this session and "frame", - the frame numbers of licks that occurred in this session - """ - data = stimulus_file.data - - lick_frames = (data["items"]["behavior"]["lick_sensors"][0] - ["lick_events"]) - - # there's an occasional bug where the number of logged - # frames is one greater than the number of vsync intervals. - # If the animal licked on this last frame it will cause an - # error here. This fixes the problem. - # see: https://github.com/AllenInstitute/visual_behavior_analysis - # /issues/572 # noqa: E501 - # & https://github.com/AllenInstitute/visual_behavior_analysis - # /issues/379 # noqa:E501 - # - # This bugfix copied from - # https://github.com/AllenInstitute/visual_behavior_analysis/blob - # /master/visual_behavior/translator/foraging2/extract.py#L640-L647 - - if len(lick_frames) > 0: - if lick_frames[-1] == len(stimulus_timestamps.value): - lick_frames = lick_frames[:-1] - cls._logger.error('removed last lick - ' - 'it fell outside of stimulus_timestamps ' - 'range') - - lick_times = \ - [stimulus_timestamps.value[frame] for frame in lick_frames] - df = pd.DataFrame({"timestamps": lick_times, "frame": lick_frames}) - return cls(licks=df) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> Optional["Licks"]: - if 'licking' in nwbfile.processing: - lick_module = nwbfile.processing['licking'] - licks = lick_module.get_data_interface('licks') - timestamps = licks.timestamps[:] - frame = licks.data[:] - else: - timestamps = [] - frame = [] - - df = pd.DataFrame({ - 'timestamps': timestamps, - 'frame': frame - }) - - return cls(licks=df) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - - # If there is no lick data, do not write - # anything to the NWB file (this is - # expected for passive sessions) - if len(self.value['frame']) == 0: - return nwbfile - - lick_timeseries = TimeSeries( - name='licks', - data=self.value['frame'].values, - timestamps=self.value['timestamps'].values, - description=('Timestamps and stimulus presentation ' - 'frame indices for lick events'), - unit='N/A' - ) - - # Add lick interface to nwb file, by way of a processing module: - licks_mod = ProcessingModule('licking', - 'Licking behavior processing module') - licks_mod.add_data_interface(lick_timeseries) - nwbfile.add_processing_module(licks_mod) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py deleted file mode 100644 index d7a77c9234..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py +++ /dev/null @@ -1,320 +0,0 @@ -import uuid -from typing import Dict, Optional -import re -import numpy as np -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - BehaviorSessionId -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, NwbReadableInterface, \ - LimsReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - JsonWritableInterface, NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.behavior_session_uuid import \ - BehaviorSessionUUID -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.equipment import \ - Equipment -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.foraging_id import \ - ForagingId -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.session_type import \ - SessionType -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.stimulus_frame_rate import \ - StimulusFrameRate -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.subject_metadata import \ - SubjectMetadata -from allensdk.brain_observatory.behavior.schemas import BehaviorMetadataSchema -from allensdk.brain_observatory.nwb import load_pynwb_extension -from allensdk.internal.api import PostgresQueryMixin - -description_dict = { - # key is a regex and value is returned on match - r"\AOPHYS_0_images": "A behavior training session performed on the 2-photon calcium imaging setup but without recording neural activity, with the goal of habituating the mouse to the experimental setup before commencing imaging of neural activity. Habituation sessions are change detection with the same image set on which the mouse was trained. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 - r"\AOPHYS_[1|3]_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse performs a visual change detection task with a set of natural images upon which it has been previously trained. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 - r"\AOPHYS_2_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse is passively shown changes in natural scene images upon which it was previously trained as the change detection task is played in open loop mode, with the lick-response sensory withdrawn and the mouse is unable to respond to changes or receive reward feedback. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 - r"\AOPHYS_[4|6]_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse performs a visual change detection task with natural scene images that are unique from those on which the mouse was trained prior to the imaging phase of the experiment. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 - r"\AOPHYS_5_images": "2-photon calcium imaging in the visual cortex of the mouse brain as the mouse is passively shown changes in natural scene images that are unique from those on which the mouse was trained prior to the imaging phase of the experiment. In this session, the change detection task is played in open loop mode, with the lick-response sensory withdrawn and the mouse is unable to respond to changes or receive reward feedback. Image stimuli are displayed for 250 ms with a 500 ms intervening gray period. 5% of non-change image presentations are randomly omitted. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session.", # noqa: E501 - r"\ATRAINING_0_gratings": "An associative training session where a mouse is automatically rewarded when a grating stimulus changes orientation. Grating stimuli are full-field, square-wave static gratings with a spatial frequency of 0.04 cycles per degree, with orientation changes between 0 and 90 degrees, at two spatial phases. Delivered rewards are 5ul in volume, and the session lasts for 15 minutes.", # noqa: E501 - r"\ATRAINING_1_gratings": "An operant behavior training session where a mouse must lick following a change in stimulus identity to earn rewards. Stimuli consist of full-field, square-wave static gratings with a spatial frequency of 0.04 cycles per degree. Orientation changes between 0 and 90 degrees occur with no intervening gray period. Delivered rewards are 10ul in volume, and the session lasts 60 minutes", # noqa: E501 - r"\ATRAINING_2_gratings": "An operant behavior training session where a mouse must lick following a change in stimulus identity to earn rewards. Stimuli consist of full-field, square-wave static gratings with a spatial frequency of 0.04 cycles per degree. Gratings of 0 or 90 degrees are presented for 250 ms with a 500 ms intervening gray period. Delivered rewards are 10ul in volume, and the session lasts 60 minutes.", # noqa: E501 - r"\ATRAINING_3_images": "An operant behavior training session where a mouse must lick following a change in stimulus identity to earn rewards. Stimuli consist of 8 natural scene images, for a total of 64 possible pairwise transitions. Images are shown for 250 ms with a 500 ms intervening gray period. Delivered rewards are 10ul in volume, and the session lasts for 60 minutes", # noqa: E501 - r"\ATRAINING_4_images": "An operant behavior training session where a mouse must lick a spout following a change in stimulus identity to earn rewards. Stimuli consist of 8 natural scene images, for a total of 64 possible pairwise transitions. Images are shown for 250 ms with a 500 ms intervening gray period. Delivered rewards are 7ul in volume, and the session lasts for 60 minutes", # noqa: E501 - r"\ATRAINING_5_images": "An operant behavior training session where a mouse must lick a spout following a change in stimulus identity to earn rewards. Stimuli consist of 8 natural scene images, for a total of 64 possible pairwise transitions. Images are shown for 250 ms with a 500 ms intervening gray period. Delivered rewards are 7ul in volume. The session is 75 minutes long, with 5 minutes of gray screen before and after 60 minutes of behavior, followed by 10 repeats of a 30 second natural movie stimulus at the end of the session." # noqa: E501 - } - - -def get_expt_description(session_type: str) -> str: - """Determine a behavior ophys session's experiment description based on - session type. Matches the regex patterns defined as the keys in - description_dict - - Parameters - ---------- - session_type : str - A session description string (e.g. OPHYS_1_images_B ) - - Returns - ------- - str - A description of the experiment based on the session_type. - - Raises - ------ - RuntimeError - Behavior ophys sessions should only have 6 different session types. - Unknown session types (or malformed session_type strings) will raise - an error. - """ - match = dict() - for k, v in description_dict.items(): - if re.match(k, session_type) is not None: - match.update({k: v}) - - if len(match) != 1: - emsg = (f"session type should match one and only one possible pattern " - f"template. '{session_type}' matched {len(match)} pattern " - "templates.") - if len(match) > 1: - emsg += f"{list(match.keys())}" - emsg += f"the regex pattern templates are {list(description_dict)}" - raise RuntimeError(emsg) - - return match.popitem()[1] - - -def get_task_parameters(data: Dict) -> Dict: - """ - Read task_parameters metadata from the behavior stimulus pickle file. - - Parameters - ---------- - data: dict - The nested dict read in from the behavior stimulus pickle file. - All of the data expected by this method lives under - data['items']['behavior'] - - Returns - ------- - dict - A dict containing the task_parameters associated with this session. - """ - behavior = data["items"]["behavior"] - stimuli = behavior['stimuli'] - config = behavior["config"] - doc = config["DoC"] - - task_parameters = {} - - task_parameters['blank_duration_sec'] = \ - [float(x) for x in doc['blank_duration_range']] - - if 'images' in stimuli: - stim_key = 'images' - elif 'grating' in stimuli: - stim_key = 'grating' - else: - msg = "Cannot get stimulus_duration_sec\n" - msg += "'images' and/or 'grating' not a valid " - msg += "key in pickle file under " - msg += "['items']['behavior']['stimuli']\n" - msg += f"keys: {list(stimuli.keys())}" - raise RuntimeError(msg) - - stim_duration = stimuli[stim_key]['flash_interval_sec'] - - # from discussion in - # https://github.com/AllenInstitute/AllenSDK/issues/1572 - # - # 'flash_interval' contains (stimulus_duration, gray_screen_duration) - # (as @matchings said above). That second value is redundant with - # 'blank_duration_range'. I'm not sure what would happen if they were - # set to be conflicting values in the params. But it looks like - # they're always consistent. It should always be (0.25, 0.5), - # except for TRAINING_0 and TRAINING_1, which have statically - # displayed stimuli (no flashes). - - if stim_duration is None: - stim_duration = np.NaN - else: - stim_duration = stim_duration[0] - - task_parameters['stimulus_duration_sec'] = stim_duration - - task_parameters['omitted_flash_fraction'] = \ - behavior['params'].get('flash_omit_probability', float('nan')) - task_parameters['response_window_sec'] = \ - [float(x) for x in doc["response_window"]] - task_parameters['reward_volume'] = config["reward"]["reward_volume"] - task_parameters['auto_reward_volume'] = doc['auto_reward_volume'] - task_parameters['session_type'] = behavior["params"]["stage"] - task_parameters['stimulus'] = next(iter(behavior["stimuli"])) - task_parameters['stimulus_distribution'] = doc["change_time_dist"] - - task_id = config['behavior']['task_id'] - if 'DoC' in task_id: - task_parameters['task'] = 'change detection' - else: - msg = "metadata.get_task_parameters does not " - msg += f"know how to parse 'task_id' = {task_id}" - raise RuntimeError(msg) - - n_stimulus_frames = 0 - for stim_type, stim_table in behavior["stimuli"].items(): - n_stimulus_frames += sum(stim_table.get("draw_log", [])) - task_parameters['n_stimulus_frames'] = n_stimulus_frames - - return task_parameters - - -class BehaviorMetadata(DataObject, LimsReadableInterface, - JsonReadableInterface, - NwbReadableInterface, - JsonWritableInterface, - NwbWritableInterface): - """Container class for behavior metadata""" - def __init__(self, - subject_metadata: SubjectMetadata, - behavior_session_id: BehaviorSessionId, - equipment: Equipment, - stimulus_frame_rate: StimulusFrameRate, - session_type: SessionType, - behavior_session_uuid: BehaviorSessionUUID): - super().__init__(name='behavior_metadata', value=self) - self._subject_metadata = subject_metadata - self._behavior_session_id = behavior_session_id - self._equipment = equipment - self._stimulus_frame_rate = stimulus_frame_rate - self._session_type = session_type - self._behavior_session_uuid = behavior_session_uuid - - self._exclude_from_equals = set() - - @classmethod - def from_lims( - cls, - behavior_session_id: BehaviorSessionId, - lims_db: PostgresQueryMixin - ) -> "BehaviorMetadata": - subject_metadata = SubjectMetadata.from_lims( - behavior_session_id=behavior_session_id, lims_db=lims_db) - equipment = Equipment.from_lims( - behavior_session_id=behavior_session_id.value, lims_db=lims_db) - - stimulus_file = StimulusFile.from_lims( - db=lims_db, behavior_session_id=behavior_session_id.value) - stimulus_frame_rate = StimulusFrameRate.from_stimulus_file( - stimulus_file=stimulus_file) - session_type = SessionType.from_stimulus_file( - stimulus_file=stimulus_file) - - foraging_id = ForagingId.from_lims( - behavior_session_id=behavior_session_id.value, lims_db=lims_db) - behavior_session_uuid = BehaviorSessionUUID.from_stimulus_file( - stimulus_file=stimulus_file)\ - .validate(behavior_session_id=behavior_session_id.value, - foraging_id=foraging_id.value, - stimulus_file=stimulus_file) - - return cls( - subject_metadata=subject_metadata, - behavior_session_id=behavior_session_id, - equipment=equipment, - stimulus_frame_rate=stimulus_frame_rate, - session_type=session_type, - behavior_session_uuid=behavior_session_uuid, - ) - - @classmethod - def from_json(cls, dict_repr: dict) -> "BehaviorMetadata": - subject_metadata = SubjectMetadata.from_json(dict_repr=dict_repr) - behavior_session_id = BehaviorSessionId.from_json(dict_repr=dict_repr) - equipment = Equipment.from_json(dict_repr=dict_repr) - - stimulus_file = StimulusFile.from_json(dict_repr=dict_repr) - stimulus_frame_rate = StimulusFrameRate.from_stimulus_file( - stimulus_file=stimulus_file) - session_type = SessionType.from_stimulus_file( - stimulus_file=stimulus_file) - session_uuid = BehaviorSessionUUID.from_stimulus_file( - stimulus_file=stimulus_file) - - return cls( - subject_metadata=subject_metadata, - behavior_session_id=behavior_session_id, - equipment=equipment, - stimulus_frame_rate=stimulus_frame_rate, - session_type=session_type, - behavior_session_uuid=session_uuid, - ) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "BehaviorMetadata": - subject_metadata = SubjectMetadata.from_nwb(nwbfile=nwbfile) - - behavior_session_id = BehaviorSessionId.from_nwb(nwbfile=nwbfile) - equipment = Equipment.from_nwb(nwbfile=nwbfile) - stimulus_frame_rate = StimulusFrameRate.from_nwb(nwbfile=nwbfile) - session_type = SessionType.from_nwb(nwbfile=nwbfile) - session_uuid = BehaviorSessionUUID.from_nwb(nwbfile=nwbfile) - - return cls( - subject_metadata=subject_metadata, - behavior_session_id=behavior_session_id, - equipment=equipment, - stimulus_frame_rate=stimulus_frame_rate, - session_type=session_type, - behavior_session_uuid=session_uuid - ) - - @property - def equipment(self) -> Equipment: - return self._equipment - - @property - def stimulus_frame_rate(self) -> float: - return self._stimulus_frame_rate.value - - @property - def session_type(self) -> str: - return self._session_type.value - - @property - def behavior_session_uuid(self) -> Optional[uuid.UUID]: - return self._behavior_session_uuid.value - - @property - def behavior_session_id(self) -> int: - return self._behavior_session_id.value - - @property - def subject_metadata(self): - return self._subject_metadata - - def to_json(self) -> dict: - pass - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - self._subject_metadata.to_nwb(nwbfile=nwbfile) - self._equipment.to_nwb(nwbfile=nwbfile) - extension = load_pynwb_extension(BehaviorMetadataSchema, - 'ndx-aibs-behavior-ophys') - nwb_metadata = extension( - name='metadata', - behavior_session_id=self.behavior_session_id, - behavior_session_uuid=str(self.behavior_session_uuid), - stimulus_frame_rate=self.stimulus_frame_rate, - session_type=self.session_type, - equipment_name=self.equipment.value - ) - nwbfile.add_lab_meta_data(nwb_metadata) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py deleted file mode 100644 index 058462494a..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py +++ /dev/null @@ -1,54 +0,0 @@ -from pynwb import NWBFile - -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - JsonWritableInterface -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_objects import DataObject - - -def from_lims_cache_key(cls, db, ophys_experiment_id: int): - return hashkey(ophys_experiment_id) - - -class BehaviorSessionId(DataObject, LimsReadableInterface, - JsonReadableInterface, - NwbReadableInterface, - JsonWritableInterface): - def __init__(self, behavior_session_id: int): - super().__init__(name="behavior_session_id", value=behavior_session_id) - - @classmethod - def from_json(cls, dict_repr: dict) -> "BehaviorSessionId": - return cls(behavior_session_id=dict_repr["behavior_session_id"]) - - def to_json(self) -> dict: - return {"behavior_session_id": self.value} - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, db: PostgresQueryMixin, - ophys_experiment_id: int - ) -> "BehaviorSessionId": - query = f""" - SELECT bs.id - FROM ophys_experiments oe - -- every ophys_experiment should have an ophys_session - JOIN ophys_sessions os ON oe.ophys_session_id = os.id - JOIN behavior_sessions bs ON os.id = bs.ophys_session_id - WHERE oe.id = {ophys_experiment_id}; - """ - behavior_session_id = db.fetchone(query, strict=True) - return cls(behavior_session_id=behavior_session_id) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "BehaviorSessionId": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(behavior_session_id=metadata.behavior_session_id) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py deleted file mode 100644 index 0129e8d104..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py +++ /dev/null @@ -1,49 +0,0 @@ -import uuid -from typing import Optional - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - NwbReadableInterface, StimulusFileReadableInterface - - -class BehaviorSessionUUID(DataObject, StimulusFileReadableInterface, - NwbReadableInterface): - """the universally unique identifier (UUID)""" - def __init__(self, behavior_session_uuid: Optional[uuid.UUID]): - super().__init__(name="behavior_session_uuid", - value=behavior_session_uuid) - - @classmethod - def from_stimulus_file( - cls, stimulus_file: StimulusFile) -> "BehaviorSessionUUID": - id = stimulus_file.data.get('session_uuid') - if id: - id = uuid.UUID(id) - return cls(behavior_session_uuid=id) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "BehaviorSessionUUID": - metadata = nwbfile.lab_meta_data['metadata'] - id = uuid.UUID(metadata.behavior_session_uuid) - return cls(behavior_session_uuid=id) - - def validate(self, behavior_session_id: int, - foraging_id: int, - stimulus_file: StimulusFile) -> "BehaviorSessionUUID": - """ - Sanity check to ensure that pkl file data matches up with - the behavior session that the pkl file has been associated with. - """ - assert_err_msg = ( - f"The behavior session UUID ({self.value}) in the " - f"behavior stimulus *.pkl file " - f"({stimulus_file.filepath}) does " - f"does not match the foraging UUID ({foraging_id}) for " - f"behavior session: {behavior_session_id}") - assert self.value == foraging_id, assert_err_msg - - return self diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py deleted file mode 100644 index 7f2789c9a0..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py +++ /dev/null @@ -1,116 +0,0 @@ -import warnings -from datetime import datetime - -import pytz -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class DateOfAcquisition(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface): - """timestamp for when experiment was started in UTC""" - def __init__(self, date_of_acquisition: datetime): - super().__init__(name="date_of_acquisition", value=date_of_acquisition) - - @classmethod - def from_json(cls, dict_repr: dict) -> "DateOfAcquisition": - doa = dict_repr['date_of_acquisition'] - doa = datetime.strptime(doa, "%Y-%m-%d %H:%M:%S") - tz = pytz.timezone("America/Los_Angeles") - doa = tz.localize(doa) - - # NOTE: LIMS writes to JSON in local time. Needs to be converted to UTC - doa = doa.astimezone(pytz.utc) - - return cls(date_of_acquisition=doa) - - @classmethod - def from_lims( - cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "DateOfAcquisition": - query = """ - SELECT bs.date_of_acquisition - FROM behavior_sessions bs - WHERE bs.id = {}; - """.format(behavior_session_id) - - experiment_date = lims_db.fetchone(query, strict=True) - experiment_date = cls._postprocess_lims_datetime( - datetime=experiment_date) - return cls(date_of_acquisition=experiment_date) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "DateOfAcquisition": - return cls(date_of_acquisition=nwbfile.session_start_time) - - def validate(self, stimulus_file: StimulusFile, - behavior_session_id: int) -> "DateOfAcquisition": - """raise a warning if the date differs too much from the - datetime obtained from the behavior stimulus (*.pkl) file.""" - pkl_data = stimulus_file.data - pkl_raw_acq_date = pkl_data["start_time"] - if isinstance(pkl_raw_acq_date, datetime): - pkl_acq_date = pytz.utc.localize(pkl_raw_acq_date) - - elif isinstance(pkl_raw_acq_date, (int, float)): - # We are dealing with an older pkl file where the acq time is - # stored as a Unix style timestamp string - parsed_pkl_acq_date = datetime.fromtimestamp(pkl_raw_acq_date) - pkl_acq_date = pytz.utc.localize(parsed_pkl_acq_date) - else: - pkl_acq_date = None - warnings.warn( - "Could not parse the acquisition datetime " - f"({pkl_raw_acq_date}) found in the following stimulus *.pkl: " - f"{stimulus_file.filepath}" - ) - - if pkl_acq_date: - acq_start_diff = ( - self.value - pkl_acq_date).total_seconds() - # If acquisition dates differ by more than an hour - if abs(acq_start_diff) > 3600: - session_id = behavior_session_id - warnings.warn( - "The `date_of_acquisition` field in LIMS " - f"({self.value}) for behavior session " - f"({session_id}) deviates by more " - f"than an hour from the `start_time` ({pkl_acq_date}) " - "specified in the associated stimulus *.pkl file: " - f"{stimulus_file.filepath}" - ) - return self - - @staticmethod - def _postprocess_lims_datetime(datetime: datetime): - """Applies postprocessing to datetime read from LIMS""" - # add utc tz - datetime = pytz.utc.localize(datetime) - - return datetime - - -class DateOfAcquisitionOphys(DateOfAcquisition): - """Ophys experiments read date of acquisition from the ophys_sessions - table in LIMS instead of the behavior_sessions table""" - - @classmethod - def from_lims( - cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "DateOfAcquisitionOphys": - query = f""" - SELECT os.date_of_acquisition - FROM ophys_experiments oe - JOIN ophys_sessions os ON oe.ophys_session_id = os.id - WHERE oe.id = {ophys_experiment_id}; - """ - doa = lims_db.fetchone(query=query) - doa = cls._postprocess_lims_datetime( - datetime=doa) - return DateOfAcquisitionOphys(date_of_acquisition=doa) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py deleted file mode 100644 index 4b8020fc6b..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py +++ /dev/null @@ -1,73 +0,0 @@ -from enum import Enum - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - JsonWritableInterface, NwbWritableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class EquipmentType(Enum): - MESOSCOPE = 'MESOSCOPE' - OTHER = 'OTHER' - - -class Equipment(DataObject, JsonReadableInterface, LimsReadableInterface, - NwbReadableInterface, JsonWritableInterface, - NwbWritableInterface): - """the name of the experimental rig.""" - def __init__(self, equipment_name: str): - super().__init__(name="equipment_name", value=equipment_name) - - @classmethod - def from_json(cls, dict_repr: dict) -> "Equipment": - return cls(equipment_name=dict_repr["rig_name"]) - - def to_json(self) -> dict: - return {"eqipment_name": self.value} - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "Equipment": - query = f""" - SELECT e.name AS device_name - FROM behavior_sessions bs - JOIN equipment e ON e.id = bs.equipment_id - WHERE bs.id = {behavior_session_id}; - """ - equipment_name = lims_db.fetchone(query, strict=True) - return cls(equipment_name=equipment_name) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "Equipment": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(equipment_name=metadata.equipment_name) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - if self.type == EquipmentType.MESOSCOPE: - device_config = { - "name": self.value, - "description": "Allen Brain Observatory - Mesoscope 2P Rig" - } - else: - device_config = { - "name": self.value, - "description": "Allen Brain Observatory - Scientifica 2P " - "Rig", - "manufacturer": "Scientifica" - } - nwbfile.create_device(**device_config) - return nwbfile - - @property - def type(self): - if self.value.startswith('MESO'): - et = EquipmentType.MESOSCOPE - else: - et = EquipmentType.OTHER - return et diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py deleted file mode 100644 index 3b2bae4200..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py +++ /dev/null @@ -1,32 +0,0 @@ -import uuid - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class ForagingId(DataObject, LimsReadableInterface, JsonReadableInterface): - """Foraging id""" - def __init__(self, foraging_id: uuid.UUID): - super().__init__(name="foraging_id", value=foraging_id) - - @classmethod - def from_json(cls, dict_repr: dict) -> "ForagingId": - pass - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "ForagingId": - query = f""" - SELECT - foraging_id - FROM - behavior_sessions - WHERE - behavior_sessions.id = {behavior_session_id}; - """ - foraging_id = lims_db.fetchone(query, strict=True) - foraging_id = uuid.UUID(foraging_id) - return cls(foraging_id=foraging_id) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py deleted file mode 100644 index 67c43d2308..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py +++ /dev/null @@ -1,36 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - NwbReadableInterface, StimulusFileReadableInterface - - -class SessionType(DataObject, StimulusFileReadableInterface, - NwbReadableInterface): - """the stimulus set used""" - def __init__(self, session_type: str): - super().__init__(name="session_type", value=session_type) - - @classmethod - def from_stimulus_file( - cls, - stimulus_file: StimulusFile) -> "SessionType": - try: - stimulus_name = \ - stimulus_file.data["items"]["behavior"]["cl_params"]["stage"] - except KeyError: - raise RuntimeError( - f"Could not obtain stimulus_name/stage information from " - f"the *.pkl file ({stimulus_file.filepath}) " - f"for the behavior session to save as NWB! The " - f"following series of nested keys did not work: " - f"['items']['behavior']['cl_params']['stage']" - ) - return cls(session_type=stimulus_name) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "SessionType": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(session_type=metadata.session_type) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py deleted file mode 100644 index a9e75b5145..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py +++ /dev/null @@ -1,33 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - NwbReadableInterface, StimulusFileReadableInterface -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .stimulus_timestamps.stimulus_timestamps import \ - StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.timestamps.util import \ - calc_frame_rate - - -class StimulusFrameRate(DataObject, StimulusFileReadableInterface, - NwbReadableInterface): - """Stimulus frame rate""" - def __init__(self, stimulus_frame_rate: float): - super().__init__(name="stimulus_frame_rate", value=stimulus_frame_rate) - - @classmethod - def from_stimulus_file( - cls, - stimulus_file: StimulusFile) -> "StimulusFrameRate": - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file) - frame_rate = calc_frame_rate(timestamps=stimulus_timestamps.value) - return cls(stimulus_frame_rate=frame_rate) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "StimulusFrameRate": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(stimulus_frame_rate=metadata.stimulus_frame_rate) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py deleted file mode 100644 index 1a28168e06..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py +++ /dev/null @@ -1,167 +0,0 @@ -from typing import Union - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - BehaviorSessionId -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, NwbReadableInterface, \ - LimsReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.behavior_metadata import \ - BehaviorMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.multi_plane_metadata\ - .multi_plane_metadata import \ - MultiplaneMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.ophys_experiment_metadata import \ - OphysExperimentMetadata -from allensdk.brain_observatory.behavior.schemas import \ - OphysBehaviorMetadataSchema -from allensdk.brain_observatory.nwb import load_pynwb_extension -from allensdk.internal.api import PostgresQueryMixin - - -class BehaviorOphysMetadata(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface, - NwbWritableInterface): - def __init__(self, behavior_metadata: BehaviorMetadata, - ophys_metadata: Union[OphysExperimentMetadata, - MultiplaneMetadata]): - super().__init__(name='behavior_ophys_metadata', value=self) - - self._behavior_metadata = behavior_metadata - self._ophys_metadata = ophys_metadata - - @property - def behavior_metadata(self) -> BehaviorMetadata: - return self._behavior_metadata - - @property - def ophys_metadata(self) -> Union["OphysExperimentMetadata", - "MultiplaneMetadata"]: - return self._ophys_metadata - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin, - is_multiplane=False) -> "BehaviorOphysMetadata": - """ - - Parameters - ---------- - ophys_experiment_id - lims_db - is_multiplane - Whether to fetch metadata for an experiment that is part of a - container containing multiple imaging planes - """ - behavior_session_id = BehaviorSessionId.from_lims( - ophys_experiment_id=ophys_experiment_id, db=lims_db) - - behavior_metadata = BehaviorMetadata.from_lims( - behavior_session_id=behavior_session_id, lims_db=lims_db) - - if is_multiplane: - ophys_metadata = MultiplaneMetadata.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - else: - ophys_metadata = OphysExperimentMetadata.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - - return cls(behavior_metadata=behavior_metadata, - ophys_metadata=ophys_metadata) - - @classmethod - def from_json(cls, dict_repr: dict, - is_multiplane=False) -> "BehaviorOphysMetadata": - """ - - Parameters - ---------- - dict_repr - is_multiplane - Whether to fetch metadata for an experiment that is part of a - container containing multiple imaging planes - - Returns - ------- - - """ - behavior_metadata = BehaviorMetadata.from_json(dict_repr=dict_repr) - - if is_multiplane: - ophys_metadata = MultiplaneMetadata.from_json( - dict_repr=dict_repr) - else: - ophys_metadata = OphysExperimentMetadata.from_json( - dict_repr=dict_repr) - - return cls(behavior_metadata=behavior_metadata, - ophys_metadata=ophys_metadata) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile, - is_multiplane=False) -> "BehaviorOphysMetadata": - """ - - Parameters - ---------- - nwbfile - is_multiplane - Whether to fetch metadata for an experiment that is part of a - container containing multiple imaging planes - """ - behavior_metadata = BehaviorMetadata.from_nwb(nwbfile=nwbfile) - - if is_multiplane: - ophys_metadata = MultiplaneMetadata.from_nwb( - nwbfile=nwbfile) - else: - ophys_metadata = OphysExperimentMetadata.from_nwb( - nwbfile=nwbfile) - - return cls(behavior_metadata=behavior_metadata, - ophys_metadata=ophys_metadata) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - self._behavior_metadata.subject_metadata.to_nwb(nwbfile=nwbfile) - self._behavior_metadata.equipment.to_nwb(nwbfile=nwbfile) - - nwb_extension = load_pynwb_extension( - OphysBehaviorMetadataSchema, 'ndx-aibs-behavior-ophys') - - behavior_meta = self._behavior_metadata - ophys_meta = self._ophys_metadata - - if isinstance(ophys_meta, MultiplaneMetadata): - imaging_plane_group = ophys_meta.imaging_plane_group - imaging_plane_group_count = ophys_meta.imaging_plane_group_count - else: - imaging_plane_group_count = 0 - imaging_plane_group = -1 - - nwb_metadata = nwb_extension( - name='metadata', - ophys_session_id=ophys_meta.ophys_session_id, - field_of_view_width=ophys_meta.field_of_view_shape.width, - field_of_view_height=ophys_meta.field_of_view_shape.height, - imaging_plane_group=imaging_plane_group, - imaging_plane_group_count=imaging_plane_group_count, - stimulus_frame_rate=behavior_meta.stimulus_frame_rate, - experiment_container_id=ophys_meta.experiment_container_id, - ophys_experiment_id=ophys_meta.ophys_experiment_id, - session_type=behavior_meta.session_type, - equipment_name=behavior_meta.equipment.value, - imaging_depth=ophys_meta.imaging_depth, - behavior_session_uuid=str(behavior_meta.behavior_session_uuid), - behavior_session_id=behavior_meta.behavior_session_id - ) - nwbfile.add_lab_meta_data(nwb_metadata) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py deleted file mode 100644 index dc358de3ee..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py +++ /dev/null @@ -1,35 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class ExperimentContainerId(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface): - """"experiment container id""" - def __init__(self, experiment_container_id: int): - super().__init__(name='experiment_container_id', - value=experiment_container_id) - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "ExperimentContainerId": - query = """ - SELECT visual_behavior_experiment_container_id - FROM ophys_experiments_visual_behavior_experiment_containers - WHERE ophys_experiment_id = {}; - """.format(ophys_experiment_id) - container_id = lims_db.fetchone(query, strict=False) - return cls(experiment_container_id=container_id) - - @classmethod - def from_json(cls, dict_repr: dict) -> "ExperimentContainerId": - return cls(experiment_container_id=dict_repr['container_id']) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "ExperimentContainerId": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(experiment_container_id=metadata.experiment_container_id) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py deleted file mode 100644 index f085e4aca2..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py +++ /dev/null @@ -1,48 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class FieldOfViewShape(DataObject, LimsReadableInterface, - NwbReadableInterface, JsonReadableInterface): - def __init__(self, height: int, width: int): - super().__init__(name='field_of_view_shape', value=self) - - self._height = height - self._width = width - - @property - def height(self): - return self._height - - @property - def width(self): - return self._width - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "FieldOfViewShape": - query = f""" - SELECT oe.movie_width as width, oe.movie_height as height - FROM ophys_experiments oe - WHERE oe.id = {ophys_experiment_id}; - """ - df = lims_db.select(query=query) - height = df.iloc[0]['height'] - width = df.iloc[0]['width'] - return cls(height=height, width=width) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "FieldOfViewShape": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(height=metadata.field_of_view_height, - width=metadata.field_of_view_width) - - @classmethod - def from_json(cls, dict_repr: dict) -> "FieldOfViewShape": - return cls(height=dict_repr['movie_height'], - width=dict_repr['movie_width']) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py deleted file mode 100644 index f5b265a2d2..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py +++ /dev/null @@ -1,35 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class ImagingDepth(DataObject, LimsReadableInterface, NwbReadableInterface, - JsonReadableInterface): - def __init__(self, imaging_depth: int): - super().__init__(name='imaging_depth', value=imaging_depth) - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "ImagingDepth": - query = """ - SELECT id.depth - FROM ophys_experiments oe - JOIN ophys_sessions os ON oe.ophys_session_id = os.id - LEFT JOIN imaging_depths id ON id.id = oe.imaging_depth_id - WHERE oe.id = {}; - """.format(ophys_experiment_id) - imaging_depth = lims_db.fetchone(query, strict=True) - return cls(imaging_depth=imaging_depth) - - @classmethod - def from_json(cls, dict_repr: dict) -> "ImagingDepth": - return cls(imaging_depth=dict_repr['targeted_depth']) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "ImagingDepth": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(imaging_depth=metadata.imaging_depth) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py deleted file mode 100644 index 7c48b6df3a..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py +++ /dev/null @@ -1,107 +0,0 @@ -from typing import Optional - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - BehaviorSessionId -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, NwbReadableInterface, \ - LimsReadableInterface -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.reporter_line import \ - ReporterLine -from allensdk.brain_observatory.behavior.data_objects.timestamps \ - .ophys_timestamps import OphysTimestamps -from allensdk.brain_observatory.behavior.data_objects.timestamps.util import \ - calc_frame_rate -from allensdk.internal.api import PostgresQueryMixin - - -class ImagingPlane(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface): - def __init__(self, ophys_frame_rate: float, - targeted_structure: str, - excitation_lambda: float, - indicator: Optional[str]): - super().__init__(name='imaging_plane', value=self) - self._ophys_frame_rate = ophys_frame_rate - self._targeted_structure = targeted_structure - self._excitation_lambda = excitation_lambda - self._indicator = indicator - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin, - ophys_timestamps: OphysTimestamps, - excitation_lambda=910.0) -> "ImagingPlane": - behavior_session_id = BehaviorSessionId.from_lims( - db=lims_db, ophys_experiment_id=ophys_experiment_id) - ophys_frame_rate = calc_frame_rate(timestamps=ophys_timestamps.value) - targeted_structure = cls._get_targeted_structure_from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - reporter_line = ReporterLine.from_lims( - behavior_session_id=behavior_session_id.value, lims_db=lims_db) - indicator = reporter_line.parse_indicator(warn=True) - return cls(ophys_frame_rate=ophys_frame_rate, - targeted_structure=targeted_structure, - excitation_lambda=excitation_lambda, - indicator=indicator) - - @classmethod - def from_json(cls, dict_repr: dict, - ophys_timestamps: OphysTimestamps, - excitation_lambda=910.0) -> "ImagingPlane": - targeted_structure = dict_repr['targeted_structure'] - ophys_fame_rate = calc_frame_rate(timestamps=ophys_timestamps.value) - reporter_line = ReporterLine.from_json(dict_repr=dict_repr) - indicator = reporter_line.parse_indicator(warn=True) - return cls(targeted_structure=targeted_structure, - ophys_frame_rate=ophys_fame_rate, - excitation_lambda=excitation_lambda, - indicator=indicator) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "ImagingPlane": - ophys_module = nwbfile.processing['ophys'] - image_seg = ophys_module.data_interfaces['image_segmentation'] - imaging_plane = image_seg.plane_segmentations[ - 'cell_specimen_table'].imaging_plane - ophys_frame_rate = imaging_plane.imaging_rate - targeted_structure = imaging_plane.location - excitation_lambda = imaging_plane.excitation_lambda - - reporter_line = ReporterLine.from_nwb(nwbfile=nwbfile) - indicator = reporter_line.parse_indicator(warn=True) - return cls(ophys_frame_rate=ophys_frame_rate, - targeted_structure=targeted_structure, - excitation_lambda=excitation_lambda, - indicator=indicator) - - @property - def ophys_frame_rate(self) -> float: - return self._ophys_frame_rate - - @property - def targeted_structure(self) -> str: - return self._targeted_structure - - @property - def excitation_lambda(self) -> float: - return self._excitation_lambda - - @property - def indicator(self) -> Optional[str]: - return self._indicator - - @staticmethod - def _get_targeted_structure_from_lims(ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> str: - query = """ - SELECT st.acronym - FROM ophys_experiments oe - LEFT JOIN structures st ON st.id = oe.targeted_structure_id - WHERE oe.id = {}; - """.format(ophys_experiment_id) - targeted_structure = lims_db.fetchone(query, strict=True) - return targeted_structure diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py deleted file mode 100644 index 176325c586..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py +++ /dev/null @@ -1,77 +0,0 @@ -from typing import Optional - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class ImagingPlaneGroup(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface): - def __init__(self, plane_group: int, plane_group_count: int): - super().__init__(name='plane_group', value=self) - self._plane_group = plane_group - self._plane_group_count = plane_group_count - - @property - def plane_group(self): - return self._plane_group - - @property - def plane_group_count(self): - return self._plane_group_count - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> \ - Optional["ImagingPlaneGroup"]: - """ - - Parameters - ---------- - ophys_experiment_id - lims_db - - Returns - ------- - ImagingPlaneGroup instance if ophys_experiment given by - ophys_experiment_id is part of a plane group - else None - - """ - query = f''' - SELECT oe.id as ophys_experiment_id, pg.group_order AS plane_group - FROM ophys_experiments oe - JOIN ophys_sessions os ON oe.ophys_session_id = os.id - JOIN ophys_imaging_plane_groups pg - ON pg.id = oe.ophys_imaging_plane_group_id - WHERE os.id = ( - SELECT oe.ophys_session_id - FROM ophys_experiments oe - WHERE oe.id = {ophys_experiment_id} - ) - ''' - df = lims_db.select(query=query) - if df.empty: - return None - df = df.set_index('ophys_experiment_id') - plane_group = df.loc[ophys_experiment_id, 'plane_group'] - plane_group_count = df['plane_group'].nunique() - return cls(plane_group=plane_group, - plane_group_count=plane_group_count) - - @classmethod - def from_json(cls, dict_repr: dict) -> "ImagingPlaneGroup": - plane_group = dict_repr['imaging_plane_group'] - plane_group_count = dict_repr['plane_group_count'] - return cls(plane_group=plane_group, - plane_group_count=plane_group_count) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "ImagingPlaneGroup": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(plane_group=metadata.imaging_plane_group, - plane_group_count=metadata.imaging_plane_group_count) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py deleted file mode 100644 index e1f5317ace..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py +++ /dev/null @@ -1,102 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.experiment_container_id import \ - ExperimentContainerId -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.field_of_view_shape import \ - FieldOfViewShape -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.imaging_depth import \ - ImagingDepth -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.multi_plane_metadata \ - .imaging_plane_group import \ - ImagingPlaneGroup -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.ophys_experiment_metadata import \ - OphysExperimentMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.ophys_session_id import \ - OphysSessionId -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .ophys_experiment_metadata.project_code import \ - ProjectCode -from allensdk.internal.api import PostgresQueryMixin - - -class MultiplaneMetadata(OphysExperimentMetadata): - def __init__(self, - ophys_experiment_id: int, - ophys_session_id: OphysSessionId, - experiment_container_id: ExperimentContainerId, - field_of_view_shape: FieldOfViewShape, - imaging_depth: ImagingDepth, - imaging_plane_group: ImagingPlaneGroup, - project_code: ProjectCode): - super().__init__( - ophys_experiment_id=ophys_experiment_id, - ophys_session_id=ophys_session_id, - experiment_container_id=experiment_container_id, - field_of_view_shape=field_of_view_shape, - imaging_depth=imaging_depth, - project_code=project_code - ) - self._imaging_plane_group = imaging_plane_group - - @classmethod - def from_lims( - cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "MultiplaneMetadata": - ophys_experiment_metadata = OphysExperimentMetadata.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - imaging_plane_group = ImagingPlaneGroup.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - return cls( - ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, - ophys_session_id=ophys_experiment_metadata._ophys_session_id, - experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 - field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, - imaging_depth=ophys_experiment_metadata._imaging_depth, - project_code=ophys_experiment_metadata._project_code, - imaging_plane_group=imaging_plane_group - ) - - @classmethod - def from_json(cls, dict_repr: dict) -> "MultiplaneMetadata": - ophys_experiment_metadata = super().from_json(dict_repr=dict_repr) - imaging_plane_group = ImagingPlaneGroup.from_json(dict_repr=dict_repr) - return cls( - ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, - ophys_session_id=ophys_experiment_metadata._ophys_session_id, - experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 - field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, - imaging_depth=ophys_experiment_metadata._imaging_depth, - project_code=ophys_experiment_metadata._project_code, - imaging_plane_group=imaging_plane_group - ) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "MultiplaneMetadata": - ophys_experiment_metadata = super().from_nwb(nwbfile=nwbfile) - imaging_plane_group = ImagingPlaneGroup.from_nwb(nwbfile=nwbfile) - return cls( - ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, - ophys_session_id=ophys_experiment_metadata._ophys_session_id, - experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 - field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, - imaging_depth=ophys_experiment_metadata._imaging_depth, - project_code=ophys_experiment_metadata._project_code, - imaging_plane_group=imaging_plane_group - ) - - @property - def imaging_plane_group(self) -> int: - return self._imaging_plane_group.plane_group - - @property - def imaging_plane_group_count(self) -> int: - # TODO this is at the wrong level of abstraction. - # It is an attribute of the session, not the experiment. - # Currently, an Ophys Session metadata abstraction doesn't exist - return self._imaging_plane_group.plane_group_count diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py deleted file mode 100644 index 247df5c87b..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py +++ /dev/null @@ -1,138 +0,0 @@ -from typing import Optional - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, NwbReadableInterface, \ - LimsReadableInterface -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.experiment_container_id import \ - ExperimentContainerId -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.field_of_view_shape import \ - FieldOfViewShape -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.imaging_depth import \ - ImagingDepth -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.ophys_session_id import \ - OphysSessionId -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.project_code import \ - ProjectCode -from allensdk.internal.api import PostgresQueryMixin - - -class OphysExperimentMetadata(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface): - """Container class for ophys experiment metadata""" - def __init__(self, - ophys_experiment_id: int, - ophys_session_id: OphysSessionId, - experiment_container_id: ExperimentContainerId, - field_of_view_shape: FieldOfViewShape, - imaging_depth: ImagingDepth, - project_code: Optional[ProjectCode] = None): - super().__init__(name='ophys_experiment_metadata', value=self) - self._ophys_experiment_id = ophys_experiment_id - self._ophys_session_id = ophys_session_id - self._experiment_container_id = experiment_container_id - self._field_of_view_shape = field_of_view_shape - self._imaging_depth = imaging_depth - self._project_code = project_code - - # project_code needs to be excluded from comparison - # since it's only exposed internally - self._exclude_from_equals = {'project_code'} - - @classmethod - def from_lims( - cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "OphysExperimentMetadata": - ophys_session_id = OphysSessionId.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - experiment_container_id = ExperimentContainerId.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - field_of_view_shape = FieldOfViewShape.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - imaging_depth = ImagingDepth.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - project_code = ProjectCode.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - - return cls( - ophys_experiment_id=ophys_experiment_id, - ophys_session_id=ophys_session_id, - experiment_container_id=experiment_container_id, - field_of_view_shape=field_of_view_shape, - imaging_depth=imaging_depth, - project_code=project_code - ) - - @classmethod - def from_json(cls, dict_repr: dict) -> "OphysExperimentMetadata": - ophys_session_id = OphysSessionId.from_json(dict_repr=dict_repr) - experiment_container_id = ExperimentContainerId.from_json( - dict_repr=dict_repr) - ophys_experiment_id = dict_repr['ophys_experiment_id'] - field_of_view_shape = FieldOfViewShape.from_json(dict_repr=dict_repr) - imaging_depth = ImagingDepth.from_json(dict_repr=dict_repr) - - return OphysExperimentMetadata( - ophys_experiment_id=ophys_experiment_id, - ophys_session_id=ophys_session_id, - experiment_container_id=experiment_container_id, - field_of_view_shape=field_of_view_shape, - imaging_depth=imaging_depth - ) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "OphysExperimentMetadata": - ophys_experiment_id = int(nwbfile.identifier) - ophys_session_id = OphysSessionId.from_nwb(nwbfile=nwbfile) - experiment_container_id = ExperimentContainerId.from_nwb( - nwbfile=nwbfile) - field_of_view_shape = FieldOfViewShape.from_nwb(nwbfile=nwbfile) - imaging_depth = ImagingDepth.from_nwb(nwbfile=nwbfile) - - return OphysExperimentMetadata( - ophys_experiment_id=ophys_experiment_id, - ophys_session_id=ophys_session_id, - experiment_container_id=experiment_container_id, - field_of_view_shape=field_of_view_shape, - imaging_depth=imaging_depth - ) - - # TODO rename to ophys_container_id - @property - def experiment_container_id(self) -> int: - return self._experiment_container_id.value - - @property - def field_of_view_shape(self) -> FieldOfViewShape: - return self._field_of_view_shape - - @property - def imaging_depth(self) -> int: - return self._imaging_depth.value - - @property - def ophys_experiment_id(self) -> int: - return self._ophys_experiment_id - - @property - def ophys_session_id(self) -> int: - # TODO this is at the wrong layer of abstraction. - # Should be at ophys session level - # (need to create ophys session class) - return self._ophys_session_id.value - - @property - def project_code(self) -> Optional[str]: - if self._project_code is None: - pc = self._project_code - else: - pc = self._project_code.value - return pc diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py deleted file mode 100644 index f70ea85741..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py +++ /dev/null @@ -1,35 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class OphysSessionId(DataObject, LimsReadableInterface, - JsonReadableInterface, NwbReadableInterface): - """"Ophys session id""" - def __init__(self, session_id: int): - super().__init__(name='session_id', - value=session_id) - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "OphysSessionId": - query = """ - SELECT oe.ophys_session_id - FROM ophys_experiments oe - WHERE id = {}; - """.format(ophys_experiment_id) - session_id = lims_db.fetchone(query, strict=False) - return cls(session_id=session_id) - - @classmethod - def from_json(cls, dict_repr: dict) -> "OphysSessionId": - return cls(session_id=dict_repr['ophys_session_id']) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "OphysSessionId": - metadata = nwbfile.lab_meta_data['metadata'] - return cls(session_id=metadata.ophys_session_id) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py deleted file mode 100644 index 60216326e6..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py +++ /dev/null @@ -1,26 +0,0 @@ -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base\ - .readable_interfaces import \ - LimsReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class ProjectCode(DataObject, LimsReadableInterface): - def __init__(self, project_code: str): - super().__init__(name='project_code', value=project_code) - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "ProjectCode": - query = f""" - SELECT projects.code AS project_code - FROM ophys_sessions - JOIN projects ON projects.id = ophys_sessions.project_id - WHERE ophys_sessions.id = ( - SELECT oe.ophys_session_id - FROM ophys_experiments oe - WHERE oe.id = {ophys_experiment_id} - ) - """ - project_code = lims_db.fetchone(query, strict=True) - return cls(project_code=project_code) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py deleted file mode 100644 index 111ac436fb..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py +++ /dev/null @@ -1,77 +0,0 @@ -import re -import warnings -from typing import Optional - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class Age(DataObject, JsonReadableInterface, LimsReadableInterface, - NwbReadableInterface): - """Age of animal (in days)""" - def __init__(self, age: int): - super().__init__(name="age_in_days", value=age) - - @classmethod - def from_json(cls, dict_repr: dict) -> "Age": - age = dict_repr["age"] - age = cls._age_code_to_days(age=age) - return cls(age=age) - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "Age": - query = f""" - SELECT a.name AS age - FROM behavior_sessions bs - JOIN donors d ON d.id = bs.donor_id - JOIN ages a ON a.id = d.age_id - WHERE bs.id = {behavior_session_id}; - """ - age = lims_db.fetchone(query, strict=True) - age = cls._age_code_to_days(age=age) - return cls(age=age) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "Age": - age = cls._age_code_to_days(age=nwbfile.subject.age) - return cls(age=age) - - @staticmethod - def to_iso8601(age: int): - if age is None: - return 'null' - return f'P{age}D' - - @staticmethod - def _age_code_to_days(age: str, warn=False) -> Optional[int]: - """Converts the age code into a numeric days representation - - Parameters - ---------- - age - age code, ie P123 - warn - Whether to output warning if parsing fails - """ - if not age.startswith('P'): - if warn: - warnings.warn('Could not parse numeric age from age code ' - '(age code does not start with "P")') - return None - - match = re.search(r'\d+', age) - - if match is None: - if warn: - warnings.warn('Could not parse numeric age from age code ' - '(no numeric values found in age code)') - return None - - start, end = match.span() - return int(age[start:end]) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py deleted file mode 100644 index 1d0a8a34c2..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py +++ /dev/null @@ -1,47 +0,0 @@ -from typing import List - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin, \ - OneOrMoreResultExpectedError - - -class DriverLine(DataObject, LimsReadableInterface, JsonReadableInterface, - NwbReadableInterface): - """the genotype name(s) of the driver line(s)""" - def __init__(self, driver_line: List[str]): - super().__init__(name="driver_line", value=driver_line) - - @classmethod - def from_json(cls, dict_repr: dict) -> "DriverLine": - return cls(driver_line=dict_repr['driver_line']) - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "DriverLine": - query = f""" - SELECT g.name AS driver_line - FROM behavior_sessions bs - JOIN donors d ON bs.donor_id=d.id - JOIN donors_genotypes dg ON dg.donor_id=d.id - JOIN genotypes g ON g.id=dg.genotype_id - JOIN genotype_types gt - ON gt.id=g.genotype_type_id AND gt.name = 'driver' - WHERE bs.id={behavior_session_id}; - """ - result = lims_db.fetchall(query) - if result is None or len(result) < 1: - raise OneOrMoreResultExpectedError( - f"Expected one or more, but received: '{result}' " - f"from query:\n'{query}'") - driver_line = sorted(result) - return cls(driver_line=driver_line) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "DriverLine": - driver_line = sorted(list(nwbfile.subject.driver_line)) - return cls(driver_line=driver_line) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py deleted file mode 100644 index be9977fc24..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py +++ /dev/null @@ -1,57 +0,0 @@ -import warnings -from typing import Optional - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class FullGenotype(DataObject, LimsReadableInterface, JsonReadableInterface, - NwbReadableInterface): - """the name of the subject's genotype""" - def __init__(self, full_genotype: str): - super().__init__(name="full_genotype", value=full_genotype) - - @classmethod - def from_json(cls, dict_repr: dict) -> "FullGenotype": - return cls(full_genotype=dict_repr['full_genotype']) - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "FullGenotype": - query = f""" - SELECT d.full_genotype - FROM behavior_sessions bs - JOIN donors d ON d.id=bs.donor_id - WHERE bs.id= {behavior_session_id}; - """ - genotype = lims_db.fetchone(query, strict=True) - return cls(full_genotype=genotype) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "FullGenotype": - return cls(full_genotype=nwbfile.subject.genotype) - - def parse_cre_line(self, warn=False) -> Optional[str]: - """ - Parameters - ---------- - warn - Whether to output warning if parsing fails - - Returns - ---------- - cre_line - just the Cre line, e.g. Vip-IRES-Cre, or None if not possible to - parse - """ - full_genotype = self.value - if ';' not in full_genotype: - if warn: - warnings.warn('Unable to parse cre_line from full_genotype') - return None - return full_genotype.split(';')[0].replace('/wt', '') diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py deleted file mode 100644 index d29b9069df..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py +++ /dev/null @@ -1,42 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class MouseId(DataObject, LimsReadableInterface, JsonReadableInterface, - NwbReadableInterface): - """the LabTracks ID""" - def __init__(self, mouse_id: int): - super().__init__(name="mouse_id", value=mouse_id) - - @classmethod - def from_json(cls, dict_repr: dict) -> "MouseId": - mouse_id = dict_repr['external_specimen_name'] - mouse_id = int(mouse_id) - return cls(mouse_id=mouse_id) - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "MouseId": - # TODO: Should this even be included? - # Found sometimes there were entries with NONE which is - # why they are filtered out; also many entries in the table - # match the donor_id, which is why used DISTINCT - query = f""" - SELECT DISTINCT(sp.external_specimen_name) - FROM behavior_sessions bs - JOIN donors d ON bs.donor_id=d.id - JOIN specimens sp ON sp.donor_id=d.id - WHERE bs.id={behavior_session_id} - AND sp.external_specimen_name IS NOT NULL; - """ - mouse_id = int(lims_db.fetchone(query, strict=True)) - return cls(mouse_id=mouse_id) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "MouseId": - return cls(mouse_id=int(nwbfile.subject.subject_id)) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py deleted file mode 100644 index 56fcfb8382..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py +++ /dev/null @@ -1,113 +0,0 @@ -import warnings -from typing import Optional, List, Union - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.internal.api import PostgresQueryMixin, \ - OneOrMoreResultExpectedError - - -class ReporterLine(DataObject, LimsReadableInterface, JsonReadableInterface, - NwbReadableInterface): - """the genotype name(s) of the reporter line(s)""" - def __init__(self, reporter_line: Optional[str]): - super().__init__(name="reporter_line", value=reporter_line) - - @classmethod - def from_json(cls, dict_repr: dict) -> "ReporterLine": - reporter_line = dict_repr['reporter_line'] - reporter_line = cls.parse(reporter_line=reporter_line, warn=True) - return cls(reporter_line=reporter_line) - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "ReporterLine": - query = f""" - SELECT g.name AS reporter_line - FROM behavior_sessions bs - JOIN donors d ON bs.donor_id=d.id - JOIN donors_genotypes dg ON dg.donor_id=d.id - JOIN genotypes g ON g.id=dg.genotype_id - JOIN genotype_types gt - ON gt.id=g.genotype_type_id AND gt.name = 'reporter' - WHERE bs.id={behavior_session_id}; - """ - result = lims_db.fetchall(query) - if result is None or len(result) < 1: - raise OneOrMoreResultExpectedError( - f"Expected one or more, but received: '{result}' " - f"from query:\n'{query}'") - reporter_line = cls.parse(reporter_line=result, warn=True) - return cls(reporter_line=reporter_line) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "ReporterLine": - return cls(reporter_line=nwbfile.subject.reporter_line) - - @staticmethod - def parse(reporter_line: Union[Optional[List[str]], str], - warn=False) -> Optional[str]: - """There can be multiple reporter lines, so it is returned from LIMS - as a list. But there shouldn't be more than 1 for behavior. This - tries to convert to str - - Parameters - ---------- - reporter_line - List of reporter line - warn - Whether to output warnings if parsing fails - - Returns - --------- - single reporter line, or None if not possible - """ - if reporter_line is None: - if warn: - warnings.warn('Error parsing reporter line. It is null.') - return None - - if len(reporter_line) == 0: - if warn: - warnings.warn('Error parsing reporter line. ' - 'The array is empty') - return None - - if isinstance(reporter_line, str): - return reporter_line - - if len(reporter_line) > 1: - if warn: - warnings.warn('More than 1 reporter line. Returning the first ' - 'one') - - return reporter_line[0] - - def parse_indicator(self, warn=False) -> Optional[str]: - """Parses indicator from reporter""" - reporter_line = self.value - reporter_substring_indicator_map = { - 'GCaMP6f': 'GCaMP6f', - 'GC6f': 'GCaMP6f', - 'GCaMP6s': 'GCaMP6s' - } - if reporter_line is None: - if warn: - warnings.warn( - 'Could not parse indicator from reporter because ' - 'there is no reporter') - return None - - for substr, indicator in reporter_substring_indicator_map.items(): - if substr in reporter_line: - return indicator - - if warn: - warnings.warn( - 'Could not parse indicator from reporter because none' - 'of the expected substrings were found in the reporter') - return None diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py deleted file mode 100644 index aa81242fb8..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py +++ /dev/null @@ -1,41 +0,0 @@ -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - JsonWritableInterface -from allensdk.internal.api import PostgresQueryMixin - - -class Sex(DataObject, LimsReadableInterface, JsonReadableInterface, - NwbReadableInterface, JsonWritableInterface): - """sex of the animal (M/F)""" - def __init__(self, sex: str): - super().__init__(name="sex", value=sex) - - @classmethod - def from_json(cls, dict_repr: dict) -> "Sex": - return cls(sex=dict_repr["sex"]) - - def to_json(self) -> dict: - return {"sex": self.value} - - @classmethod - def from_lims(cls, behavior_session_id: int, - lims_db: PostgresQueryMixin) -> "Sex": - query = f""" - SELECT g.name AS sex - FROM behavior_sessions bs - JOIN donors d ON bs.donor_id = d.id - JOIN genders g ON g.id = d.gender_id - WHERE bs.id = {behavior_session_id}; - """ - sex = lims_db.fetchone(query, strict=True) - return cls(sex=sex) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "Sex": - return cls(sex=nwbfile.subject.sex) diff --git a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py deleted file mode 100644 index 710a07ed44..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py +++ /dev/null @@ -1,162 +0,0 @@ -from typing import Optional, List - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - BehaviorSessionId -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - JsonWritableInterface, NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.age import \ - Age -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.driver_line import \ - DriverLine -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.full_genotype import \ - FullGenotype -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.mouse_id import \ - MouseId -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.reporter_line import \ - ReporterLine -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.sex import \ - Sex -from allensdk.brain_observatory.behavior.schemas import SubjectMetadataSchema -from allensdk.brain_observatory.nwb import load_pynwb_extension -from allensdk.internal.api import PostgresQueryMixin - - -class SubjectMetadata(DataObject, LimsReadableInterface, NwbReadableInterface, - NwbWritableInterface, JsonReadableInterface, - JsonWritableInterface): - """Subject metadata""" - - def __init__(self, - sex: Sex, - age: Age, - reporter_line: ReporterLine, - full_genotype: FullGenotype, - driver_line: DriverLine, - mouse_id: MouseId): - super().__init__(name='subject_metadata', value=self) - self._sex = sex - self._age = age - self._reporter_line = reporter_line - self._full_genotype = full_genotype - self._driver_line = driver_line - self._mouse_id = mouse_id - - @classmethod - def from_lims(cls, - behavior_session_id: BehaviorSessionId, - lims_db: PostgresQueryMixin) -> "SubjectMetadata": - sex = Sex.from_lims(behavior_session_id=behavior_session_id.value, - lims_db=lims_db) - age = Age.from_lims(behavior_session_id=behavior_session_id.value, - lims_db=lims_db) - reporter_line = ReporterLine.from_lims( - behavior_session_id=behavior_session_id.value, lims_db=lims_db) - full_genotype = FullGenotype.from_lims( - behavior_session_id=behavior_session_id.value, lims_db=lims_db) - driver_line = DriverLine.from_lims( - behavior_session_id=behavior_session_id.value, lims_db=lims_db) - mouse_id = MouseId.from_lims( - behavior_session_id=behavior_session_id.value, - lims_db=lims_db) - return cls( - sex=sex, - age=age, - full_genotype=full_genotype, - driver_line=driver_line, - mouse_id=mouse_id, - reporter_line=reporter_line - ) - - @classmethod - def from_json(cls, dict_repr: dict) -> "SubjectMetadata": - sex = Sex.from_json(dict_repr=dict_repr) - age = Age.from_json(dict_repr=dict_repr) - reporter_line = ReporterLine.from_json(dict_repr=dict_repr) - full_genotype = FullGenotype.from_json(dict_repr=dict_repr) - driver_line = DriverLine.from_json(dict_repr=dict_repr) - mouse_id = MouseId.from_json(dict_repr=dict_repr) - - return cls( - sex=sex, - age=age, - full_genotype=full_genotype, - driver_line=driver_line, - mouse_id=mouse_id, - reporter_line=reporter_line - ) - - def to_json(self) -> dict: - pass - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "SubjectMetadata": - mouse_id = MouseId.from_nwb(nwbfile=nwbfile) - sex = Sex.from_nwb(nwbfile=nwbfile) - age = Age.from_nwb(nwbfile=nwbfile) - reporter_line = ReporterLine.from_nwb(nwbfile=nwbfile) - driver_line = DriverLine.from_nwb(nwbfile=nwbfile) - genotype = FullGenotype.from_nwb(nwbfile=nwbfile) - - return cls( - mouse_id=mouse_id, - sex=sex, - age=age, - reporter_line=reporter_line, - driver_line=driver_line, - full_genotype=genotype - ) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - BehaviorSubject = load_pynwb_extension(SubjectMetadataSchema, - 'ndx-aibs-behavior-ophys') - nwb_subject = BehaviorSubject( - description="A visual behavior subject with a LabTracks ID", - age=Age.to_iso8601(age=self.age_in_days), - driver_line=self.driver_line, - genotype=self.full_genotype, - subject_id=str(self.mouse_id), - reporter_line=self.reporter_line, - sex=self.sex, - species='Mus musculus') - nwbfile.subject = nwb_subject - return nwbfile - - @property - def sex(self) -> str: - return self._sex.value - - @property - def age_in_days(self) -> Optional[int]: - return self._age.value - - @property - def reporter_line(self) -> Optional[str]: - return self._reporter_line.value - - @property - def full_genotype(self) -> str: - return self._full_genotype.value - - @property - def cre_line(self) -> Optional[str]: - return self._full_genotype.parse_cre_line(warn=True) - - @property - def driver_line(self) -> List[str]: - return self._driver_line.value - - @property - def mouse_id(self) -> int: - return self._mouse_id.value diff --git a/allensdk/brain_observatory/behavior/data_objects/motion_correction.py b/allensdk/brain_observatory/behavior/data_objects/motion_correction.py deleted file mode 100644 index a6121aa491..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/motion_correction.py +++ /dev/null @@ -1,71 +0,0 @@ -import pandas as pd -from pynwb import NWBFile, TimeSeries - -from allensdk.brain_observatory.behavior.data_files\ - .rigid_motion_transform_file import \ - RigidMotionTransformFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - DataFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface - - -class MotionCorrection(DataObject, DataFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - """motion correction output""" - def __init__(self, motion_correction: pd.DataFrame): - """ - :param motion_correction - Columns: - x: float - y: float - """ - super().__init__(name='motion_correction', value=motion_correction) - - @classmethod - def from_data_file( - cls, rigid_motion_transform_file: RigidMotionTransformFile) \ - -> "MotionCorrection": - df = rigid_motion_transform_file.data - return cls(motion_correction=df) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "MotionCorrection": - ophys_module = nwbfile.processing['ophys'] - - motion_correction_data = { - 'x': ophys_module.get_data_interface( - 'ophys_motion_correction_x').data[:], - 'y': ophys_module.get_data_interface( - 'ophys_motion_correction_y').data[:] - } - - df = pd.DataFrame(motion_correction_data) - return cls(motion_correction=df) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - ophys_module = nwbfile.processing['ophys'] - ophys_timestamps = ophys_module.get_data_interface( - 'dff').roi_response_series['traces'].timestamps - - t1 = TimeSeries( - name='ophys_motion_correction_x', - data=self.value['x'].values, - timestamps=ophys_timestamps, - unit='pixels' - ) - - t2 = TimeSeries( - name='ophys_motion_correction_y', - data=self.value['y'].values, - timestamps=ophys_timestamps, - unit='pixels' - ) - - ophys_module.add_data_interface(t1) - ophys_module.add_data_interface(t2) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/projections.py b/allensdk/brain_observatory/behavior/data_objects/projections.py deleted file mode 100644 index 97ae9536cb..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/projections.py +++ /dev/null @@ -1,128 +0,0 @@ -from matplotlib import image as mpimg -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, NwbReadableInterface, \ - LimsReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.image_api import ImageApi, Image -from allensdk.brain_observatory.nwb.nwb_utils import get_image, \ - add_image_to_nwb -from allensdk.internal.api import PostgresQueryMixin -from allensdk.internal.core.lims_utilities import safe_system_path - - -class Projections(DataObject, LimsReadableInterface, JsonReadableInterface, - NwbReadableInterface, NwbWritableInterface): - def __init__(self, max_projection: Image, avg_projection: Image): - super().__init__(name='projections', value=self) - self._max_projection = max_projection - self._avg_projection = avg_projection - - @property - def max_projection(self) -> Image: - return self._max_projection - - @property - def avg_projection(self) -> Image: - return self._avg_projection - - @classmethod - def from_lims(cls, ophys_experiment_id: int, - lims_db: PostgresQueryMixin) -> "Projections": - def _get_filepaths(): - query = """ - SELECT - wkf.storage_directory || wkf.filename AS filepath, - wkft.name as wkfn - FROM ophys_experiments oe - JOIN ophys_cell_segmentation_runs ocsr - ON ocsr.ophys_experiment_id = oe.id - JOIN well_known_files wkf ON wkf.attachable_id = ocsr.id - JOIN well_known_file_types wkft - ON wkft.id = wkf.well_known_file_type_id - WHERE ocsr.current = 't' - AND wkf.attachable_type = 'OphysCellSegmentationRun' - AND wkft.name IN ('OphysMaxIntImage', - 'OphysAverageIntensityProjectionImage') - AND oe.id = {}; - """.format(ophys_experiment_id) - res = lims_db.select(query=query) - res['filepath'] = res['filepath'].apply(safe_system_path) - return res - - def _get_pixel_size(): - query = """ - SELECT sc.resolution - FROM ophys_experiments oe - JOIN scans sc ON sc.image_id=oe.ophys_primary_image_id - WHERE oe.id = {}; - """.format(ophys_experiment_id) - return lims_db.fetchone(query, strict=True) - - res = _get_filepaths() - pixel_size = _get_pixel_size() - - max_projection_filepath = \ - res[res['wkfn'] == 'OphysMaxIntImage'].iloc[0]['filepath'] - max_projection = cls._from_filepath(filepath=max_projection_filepath, - pixel_size=pixel_size) - - avg_projection_filepath = \ - (res[res['wkfn'] == 'OphysAverageIntensityProjectionImage'].iloc[0] - ['filepath']) - avg_projection = cls._from_filepath(filepath=avg_projection_filepath, - pixel_size=pixel_size) - return Projections(max_projection=max_projection, - avg_projection=avg_projection) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "Projections": - max_projection = get_image(nwbfile=nwbfile, name='max_projection', - module='ophys') - avg_projection = get_image(nwbfile=nwbfile, name='average_image', - module='ophys') - return Projections(max_projection=max_projection, - avg_projection=avg_projection) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - add_image_to_nwb(nwbfile=nwbfile, - image_data=self._max_projection, - image_name='max_projection') - add_image_to_nwb(nwbfile=nwbfile, - image_data=self._avg_projection, - image_name='average_image') - - return nwbfile - - @classmethod - def from_json(cls, dict_repr: dict) -> "Projections": - max_projection_filepath = dict_repr['max_projection_file'] - avg_projection_filepath = \ - dict_repr['average_intensity_projection_image_file'] - pixel_size = dict_repr['surface_2p_pixel_size_um'] - - max_projection = cls._from_filepath(filepath=max_projection_filepath, - pixel_size=pixel_size) - avg_projection = cls._from_filepath(filepath=avg_projection_filepath, - pixel_size=pixel_size) - return Projections(max_projection=max_projection, - avg_projection=avg_projection) - - @staticmethod - def _from_filepath(filepath: str, pixel_size: float) -> Image: - """ - :param filepath - path to image - :param pixel_size - pixel size in um - """ - img = mpimg.imread(filepath) - img = ImageApi.serialize(img, [pixel_size / 1000., - pixel_size / 1000.], 'mm') - img = ImageApi.deserialize(img=img) - return img diff --git a/allensdk/brain_observatory/behavior/data_objects/rewards.py b/allensdk/brain_observatory/behavior/data_objects/rewards.py deleted file mode 100644 index c117b94cde..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/rewards.py +++ /dev/null @@ -1,92 +0,0 @@ -from typing import Optional - -import pandas as pd -from pynwb import NWBFile, TimeSeries, ProcessingModule - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - StimulusFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface - - -class Rewards(DataObject, StimulusFileReadableInterface, NwbReadableInterface, - NwbWritableInterface): - def __init__(self, rewards: pd.DataFrame): - super().__init__(name='rewards', value=rewards) - - @classmethod - def from_stimulus_file( - cls, stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps) -> "Rewards": - """Get reward data from pkl file, based on timestamps - (not sync file). - """ - data = stimulus_file.data - - trial_df = pd.DataFrame(data["items"]["behavior"]["trial_log"]) - rewards_dict = {"volume": [], "timestamps": [], "autorewarded": []} - for idx, trial in trial_df.iterrows(): - rewards = trial["rewards"] - # as i write this there can only ever be one reward per trial - if rewards: - rewards_dict["volume"].append(rewards[0][0]) - rewards_dict["timestamps"].append( - stimulus_timestamps.value[rewards[0][2]]) - auto_rwrd = trial["trial_params"]["auto_reward"] - rewards_dict["autorewarded"].append(auto_rwrd) - - df = pd.DataFrame(rewards_dict) - return cls(rewards=df) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> Optional["Rewards"]: - if 'rewards' in nwbfile.processing: - rewards = nwbfile.processing['rewards'] - time = rewards.get_data_interface('autorewarded').timestamps[:] - autorewarded = rewards.get_data_interface('autorewarded').data[:] - volume = rewards.get_data_interface('volume').data[:] - else: - volume = [] - time = [] - autorewarded = [] - - df = pd.DataFrame({ - 'volume': volume, - 'timestamps': time, - 'autorewarded': autorewarded}) - return cls(rewards=df) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - - # If there is no rewards data, do not - # write anything to the NWB file (this - # is expected for passive sessions) - if len(self.value['timestamps']) == 0: - return nwbfile - - reward_volume_ts = TimeSeries( - name='volume', - data=self.value['volume'].values, - timestamps=self.value['timestamps'].values, - unit='mL' - ) - - autorewarded_ts = TimeSeries( - name='autorewarded', - data=self.value['autorewarded'].values, - timestamps=reward_volume_ts.timestamps, - unit='mL' - ) - - rewards_mod = ProcessingModule('rewards', - 'Licking behavior processing module') - rewards_mod.add_data_interface(reward_volume_ts) - rewards_mod.add_data_interface(autorewarded_ts) - nwbfile.add_processing_module(rewards_mod) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/__init__.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py deleted file mode 100644 index 2f640e1586..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py +++ /dev/null @@ -1,209 +0,0 @@ - -import json -from typing import Optional - -from cachetools import cached, LRUCache -from cachetools.keys import hashkey - -import pandas as pd - -from pynwb import NWBFile, ProcessingModule -from pynwb.base import TimeSeries - -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - LimsReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - JsonWritableInterface, NwbWritableInterface -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_objects import ( - DataObject, StimulusTimestamps -) -from allensdk.brain_observatory.behavior.data_files import ( - StimulusFile -) -from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 - get_running_df -) - - -def from_json_cache_key( - cls, dict_repr: dict -): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key( - cls, db, - behavior_session_id: int, ophys_experiment_id: Optional[int] = None -): - return hashkey( - behavior_session_id, ophys_experiment_id - ) - - -class RunningAcquisition(DataObject, LimsReadableInterface, - NwbReadableInterface, NwbWritableInterface, - JsonWritableInterface): - """A DataObject which contains properties and methods to load, process, - and represent running acquisition data. - - Running aquisition data is represented as: - - Pandas Dataframe with an index of timestamps and the following columns: - "dx": Angular change, computed during data collection - "v_sig": Voltage signal from the encoder - "v_in": The theoretical maximum voltage that the encoder - will reach prior to "wrapping". This should - theoretically be 5V (after crossing 5V goes to 0V, or - vice versa). In practice the encoder does not always - reach this value before wrapping, which can cause - transient spikes in speed at the voltage "wraps". - """ - - def __init__( - self, - running_acquisition: pd.DataFrame, - stimulus_file: Optional[StimulusFile] = None, - stimulus_timestamps: Optional[StimulusTimestamps] = None, - ): - super().__init__(name="running_acquisition", value=running_acquisition) - self._stimulus_file = stimulus_file - self._stimulus_timestamps = stimulus_timestamps - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_json_cache_key) - def from_json( - cls, - dict_repr: dict, - ) -> "RunningAcquisition": - stimulus_file = StimulusFile.from_json(dict_repr) - stimulus_timestamps = StimulusTimestamps.from_json(dict_repr) - running_acq_df = get_running_df( - data=stimulus_file.data, time=stimulus_timestamps.value, - ) - running_acq_df.drop("speed", axis=1, inplace=True) - - return cls( - running_acquisition=running_acq_df, - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - ) - - def to_json(self) -> dict: - """[summary] - - Returns - ------- - dict - [description] - - Raises - ------ - RuntimeError - [description] - """ - if self._stimulus_file is None or self._stimulus_timestamps is None: - raise RuntimeError( - "RunningAcquisition DataObject lacks information about the " - "StimulusFile or StimulusTimestamps. This is likely due to " - "instantiating from NWB which prevents to_json() functionality" - ) - output_dict = dict() - output_dict.update(self._stimulus_file.to_json()) - output_dict.update(self._stimulus_timestamps.to_json()) - return output_dict - - @classmethod - @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) - def from_lims( - cls, - db: PostgresQueryMixin, - behavior_session_id: int, - ophys_experiment_id: Optional[int] = None, - ) -> "RunningAcquisition": - - stimulus_file = StimulusFile.from_lims(db, behavior_session_id) - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file - ) - running_acq_df = get_running_df( - data=stimulus_file.data, time=stimulus_timestamps.value, - ) - running_acq_df.drop("speed", axis=1, inplace=True) - - return cls( - running_acquisition=running_acq_df, - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - ) - - @classmethod - def from_nwb( - cls, - nwbfile: NWBFile - ) -> "RunningAcquisition": - running_module = nwbfile.modules['running'] - dx_interface = running_module.get_data_interface('dx') - - dx = dx_interface.data - v_in = nwbfile.get_acquisition('v_in').data - v_sig = nwbfile.get_acquisition('v_sig').data - timestamps = dx_interface.timestamps[:] - - running_acq_df = pd.DataFrame( - { - 'dx': dx, - 'v_in': v_in, - 'v_sig': v_sig - }, - index=pd.Index(timestamps, name='timestamps') - ) - return cls(running_acquisition=running_acq_df) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - running_acquisition_df: pd.DataFrame = self.value - - running_dx_series = TimeSeries( - name='dx', - data=running_acquisition_df['dx'].values, - timestamps=running_acquisition_df.index.values, - unit='cm', - description=( - 'Running wheel angular change, computed during data collection' - ) - ) - v_sig = TimeSeries( - name='v_sig', - data=running_acquisition_df['v_sig'].values, - timestamps=running_acquisition_df.index.values, - unit='V', - description='Voltage signal from the running wheel encoder' - ) - v_in = TimeSeries( - name='v_in', - data=running_acquisition_df['v_in'].values, - timestamps=running_acquisition_df.index.values, - unit='V', - description=( - 'The theoretical maximum voltage that the running wheel ' - 'encoder will reach prior to "wrapping". This should ' - 'theoretically be 5V (after crossing 5V goes to 0V, or ' - 'vice versa). In practice the encoder does not always ' - 'reach this value before wrapping, which can cause ' - 'transient spikes in speed at the voltage "wraps".') - ) - - if 'running' in nwbfile.processing: - running_mod = nwbfile.processing['running'] - else: - running_mod = ProcessingModule('running', - 'Running speed processing module') - nwbfile.add_processing_module(running_mod) - - running_mod.add_data_interface(running_dx_series) - nwbfile.add_acquisition(v_sig) - nwbfile.add_acquisition(v_in) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py deleted file mode 100644 index 7222cb7d10..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py +++ /dev/null @@ -1,407 +0,0 @@ -import scipy.signal as signal -from scipy.stats import zscore -import numpy as np -import pandas as pd -import warnings -from typing import Iterable, Union, Optional - - -def calc_deriv(x, time): - dx = np.diff(x, prepend=np.nan) - dt = np.diff(time, prepend=np.nan) - return dx / dt - - -def _angular_change(summed_voltage: np.ndarray, - vmax: Union[np.ndarray, float]) -> np.ndarray: - """ - Compute the change in degrees in radians at each point from the - summed voltage encoder data. - - Parameters - ---------- - summed_voltage: 1d np.ndarray - The "unwrapped" voltage signal from the encoder, cumulatively - summed. See `_unwrap_voltage_signal`. - vmax: 1d np.ndarray or float - Either a constant float, or a 1d array (typically constant) - of values. These values represent the theoretical max voltage - value of the encoder. If an array, needs to be the same length - as the summed_voltage array. - Returns - ------- - np.ndarray - 1d array of change in degrees in radians from each point - """ - delta_theta = np.diff(summed_voltage, prepend=np.nan) / vmax * 2 * np.pi - return delta_theta - - -def _shift( - arr: Iterable, - periods: int = 1, - fill_value: float = np.nan) -> np.ndarray: - """ - Shift index of an iterable (array-like) by desired number of - periods with an optional fill value (default = NaN). - - Parameters - ---------- - arr: Iterable (array-like) - Iterable containing numeric data. If int, will be converted to - float in returned object. - periods: int (default=1) - The number of elements to shift. - fill_value: float (default=np.nan) - The value to fill at the beginning of the shifted array - Returns - ------- - np.ndarray (1d) - Copy of input object as a 1d array, shifted. - """ - if periods <= 0: - raise ValueError("Can only shift for periods > 0.") - if fill_value is None: - fill_value = np.nan - if isinstance(fill_value, float): - # Circumvent issue if int-like array with np.nan as fill - shifted = np.roll(arr, periods).astype(float) - else: - shifted = np.roll(arr, periods) - shifted[:periods] = fill_value - return shifted - - -def deg_to_dist(angular_speed: np.ndarray) -> np.ndarray: - """ - Takes the angular speed (radians/s) at each step in radians, and - computes the linear speed in cm/s. - - Parameters - ---------- - angular_speed: np.ndarray (1d) - 1d array of angular speed in radians/s - Returns - ------- - np.ndarray (1d) - Linear speed in cm/s at each time point. - """ - wheel_diameter = 6.5 * 2.54 # 6.5" wheel diameter, 2.54 = cm/in - running_radius = 0.5 * ( - # assume the animal runs at 2/3 the distance from the wheel center - 2.0 * wheel_diameter / 3.0) - running_speed_cm_per_sec = angular_speed * running_radius - return running_speed_cm_per_sec - - -def _identify_wraps(vsig: Iterable, *, - min_threshold: float = 1.5, - max_threshold: float = 3.5): - """ - Identify "wraps" in the voltage signal. In practice, this is when - the encoder voltage signal crosses 5V and wraps to 0V, or - vice-versa. - - Argument defaults and implementation suggestion via @dougo - - Parameters - ---------- - vsig: Iterable (array-like) - 1d array-like iterable of voltage signal - min_threshold: float (default=1.5) - The min_threshold value that must be crossed to be considered - a possible wrapping point. - max_threshold: float (default=3.5) - The max threshold value that must be crossed to be considered - a possible wrapping point. - - Returns - ------- - Tuple - Tuple of ([indices of positive wraps], [indices of negative wraps]) - """ - # Compare against previous value - shifted_vsig = _shift(vsig) - if not isinstance(vsig, np.ndarray): - vsig = np.array(vsig) - # Suppress warnings for when comparing to nan values - with np.errstate(invalid='ignore'): - pos_wraps = np.asarray( - np.logical_and(vsig < min_threshold, shifted_vsig > max_threshold) - ).nonzero()[0] - neg_wraps = np.asarray( - np.logical_and(vsig > max_threshold, shifted_vsig < min_threshold) - ).nonzero()[0] - return pos_wraps, neg_wraps - - -def _local_boundaries(time, index, span: float = 0.25) -> tuple: - """ - Given a 1d array of monotonically increasing timestamps, and a - point in that array (`index`), compute the indices that form the - inclusive boundary around `index` for timespan `span`. - - Values in `time` must monotonically increase. Flat lines (same value - multiple times) are OK. The neighborhood may terminate around the - index if the `span` is too small for the sampling rate. A warning - will be raised in this case. - - Returns - ------- - Tuple - Tuple of corresponding to the start, end indices that bound - a time span of length `span` (maximally) - - E.g. - ``` - time = np.array([0, 1, 1.5, 2, 2.2, 2.5, 3, 3.5]) - _local_boundary(time, 3, 1.0) - >>> (1, 6) - ``` - """ - if np.diff(time[~np.isnan(time)]).min() < 0: - raise ValueError("Data do not monotonically increase. This probably " - "means there is an error in your time series.") - t_val = time[index] - max_val = t_val + abs(span) - min_val = t_val - abs(span) - eligible_indices = np.nonzero((time <= max_val) & (time >= min_val))[0] - max_ix = eligible_indices.max() - min_ix = eligible_indices.min() - if (min_ix == index) or (max_ix == index): - warnings.warn("Unable to find two data points around index " - f"for span={span} that do not include the index. " - "This could mean that your time span is too small for " - "the time data sampling rate, the data are not " - "monotonically increasing, or that you are trying " - "to find a neighborhood at the beginning/end of the " - "data stream.") - return min_ix, max_ix - - -def _clip_speed_wraps(speed, time, wrap_indices, t_span: float = 0.25): - """ - Correct for artifacts at the voltage 'wraps'. Sometimes there are - transient spikes in speed at the 'wrap' points. This doesn't make - sense since speed on a running wheel should be a smoothly varying - function. Take the neighborhood of values in +/- `t_span` seconds - around wrap points, and clip the value at the wrap point - such that it does not exceed the min/max values in the neighborhood. - """ - corrected_speed = speed.copy() - for wrap in wrap_indices: - start_ix, end_ix = _local_boundaries(time, wrap, t_span) - local_slice = np.concatenate( # Remove the wrap point - (speed[start_ix:wrap], speed[wrap+1:end_ix+1])) - corrected_speed[wrap] = np.clip( - speed[wrap], np.nanmin(local_slice), np.nanmax(local_slice)) - return corrected_speed - - -def _unwrap_voltage_signal( - vsig: Iterable, - pos_wrap_ix: Iterable, - neg_wrap_ix: Iterable, - *, - vmax: Optional[float] = None, - max_threshold: float = 5.1, - max_diff: float = 1.0) -> np.ndarray: - """ - Calculate the change in voltage at each timestamp. - 'Unwraps' the - voltage data coming from the encoder at the value `vmax`. If `vmax` - is a float, use that value to 'wrap'. If it is None, then compute - the maximum value from the observed voltage signal (`vsig`, as long - as the maximum value is under the value of `max_threshold` (to - account for possible outlier data/encoder errors). - The reason is because the rotary encoder should theoretically wrap - at 5V, but in practice does not always reach 5V before wrapping - back to 0V. If it is assumed that the encoder wraps at 5V, but - actually does not reach that voltage, then the computed running - speed can be transiently higher at the timestamps of the signal - 'wraps'. - - Parameters - ---------- - vsig: Iterable (array-like) - The raw voltage data from the rotary encoder - vmax: Optional[float] (default=None) - The value at which, upon passing this threshold, the voltage - "wraps" back to 0V on the encoder. - max_threshold: float (default=5.1) - The maximum threshold for the `vmax` value. Used only if - `vmax` is `None`. To account for the possibility of outlier - data/encoder errors, the computed `vmax` should not exceed - this value. - max_diff: float (default=1.0) - The maximum voltage difference allowed between two adjacent - points, after accounting for the voltage "wrap". Values - exceeding this threshold will be set to np.nan. - Returns - ------- - np.ndarray - 1d np.ndarray of the "unwrapped" signal from `vsig`. - """ - if not isinstance(vsig, np.ndarray): - vsig = np.array(vsig) - if vmax is None: - vmax = vsig[vsig < max_threshold].max() - unwrapped_diff = np.zeros(vsig.shape) - vsig_last = _shift(vsig) - if len(pos_wrap_ix): - # positive wraps: subtract from the previous value and add vmax - unwrapped_diff[pos_wrap_ix] = ( - (vsig[pos_wrap_ix] + vmax) - vsig_last[pos_wrap_ix]) - # negative: subtract vmax and the previous value - if len(neg_wrap_ix): - unwrapped_diff[neg_wrap_ix] = ( - vsig[neg_wrap_ix] - (vsig_last[neg_wrap_ix] + vmax)) - # Other indices, just compute straight diff from previous value - wrap_ix = np.concatenate((pos_wrap_ix, neg_wrap_ix)) - other_ix = np.array(list(set(range(len(vsig_last))).difference(wrap_ix))) - unwrapped_diff[other_ix] = vsig[other_ix] - vsig_last[other_ix] - # Correct for wrap artifacts based on allowed `max_diff` value - # (fill with nan) - # Suppress warnings when comparing with nan values to reduce noise - with np.errstate(invalid='ignore'): - unwrapped_diff = np.where( - np.abs(unwrapped_diff) <= max_diff, unwrapped_diff, np.nan) - # Get nan indices to propogate to the cumulative sum (otherwise - # treated as 0) - unwrapped_nans = np.array(np.isnan(unwrapped_diff)).nonzero() - summed_diff = np.nancumsum(unwrapped_diff) + vsig[0] # Add the baseline - summed_diff[unwrapped_nans] = np.nan - return summed_diff - - -def _zscore_threshold_1d(data: np.ndarray, - threshold: float = 5.0) -> np.ndarray: - """ - Replace values in 1d array `data` that exceed `threshold` number - of SDs from the mean with NaN. - Parameters - --------- - data: np.ndarray - 1d np array of values - threshold: float (default=5.0) - Z-score threshold to replace with NaN. - Returns - ------- - np.ndarray (1d) - A copy of `data` with values exceeding `threshold` SDs from - the mean replaced with NaN. - """ - corrected_data = data.copy().astype("float") - scores = zscore(data, nan_policy="omit") - # Suppress warnings when comparing to nan values to reduce noise - with np.errstate(invalid='ignore'): - corrected_data[np.abs(scores) > threshold] = np.nan - return corrected_data - - -def get_running_df( - data, time: np.ndarray, lowpass: bool = True, zscore_threshold=10.0 -): - """ - Given the data from the behavior 'pkl' file object and a 1d - array of timestamps, compute the running speed. Returns a - dataframe with the raw voltage data as well as the computed speed - at each timestamp. By default, the running speed is filtered with - a 10 Hz Butterworth lowpass filter to remove artifacts caused by - the rotary encoder. - - Parameters - ---------- - data - Deserialized 'behavior pkl' file data - time: np.ndarray (1d) - Timestamps for running data measurements - lowpass: bool (default=True) - Whether to apply a 10Hz low-pass filter to the running speed - data. - zscore_threshold: float - The threshold to use for removing outlier running speeds which might - be noise and not true signal. - - Returns - ------- - pd.DataFrame - Dataframe with an index of timestamps and the following - columns: - "speed": computed running speed - "dx": angular change, computed during data collection - "v_sig": voltage signal from the encoder - "v_in": the theoretical maximum voltage that the encoder - will reach prior to "wrapping". This should - theoretically be 5V (after crossing 5V goes to 0V, or - vice versa). In practice the encoder does not always - reach this value before wrapping, which can cause - transient spikes in speed at the voltage "wraps". - The raw data are provided so that the user may compute their - own speed from source, if desired. - - Notes - ----- - Though the angular change is available in the raw data - (key="dx"), this method recomputes the angular change from the - voltage signal (key="vsig") due to very specific, low-level - artifacts in the data caused by the encoder. See method - docstrings for more detailed information. The raw data is - included in the final output in case the end user wants to apply - their own corrections and compute running speed from the raw - source. - """ - v_sig = data["items"]["behavior"]["encoders"][0]["vsig"] - v_in = data["items"]["behavior"]["encoders"][0]["vin"] - - if len(v_in) > len(time) + 1: - error_string = ("length of v_in ({}) cannot be longer than length of " - "time ({}) + 1, they are off by {}").format( - len(v_in), - len(time), - abs(len(v_in) - len(time)) - ) - raise ValueError(error_string) - if len(v_in) == len(time) + 1: - warnings.warn( - "Time array is 1 value shorter than encoder array. Last encoder " - "value removed\n", UserWarning, stacklevel=1) - v_in = v_in[:-1] - v_sig = v_sig[:-1] - - # dx = 'd_theta' = angular change - # There are some issues with angular change in the raw data so we - # recompute this value - dx_raw = data["items"]["behavior"]["encoders"][0]["dx"] - # Identify "wraps" in the voltage signal that need to be unwrapped - # This is where the encoder switches from 0V to 5V or vice versa - pos_wraps, neg_wraps = _identify_wraps( - v_sig, min_threshold=1.5, max_threshold=3.5) - # Unwrap the voltage signal and apply correction for transient spikes - unwrapped_vsig = _unwrap_voltage_signal( - v_sig, pos_wraps, neg_wraps, max_threshold=5.1, max_diff=1.0) - angular_change_point = _angular_change(unwrapped_vsig, v_in) - angular_change = np.nancumsum(angular_change_point) - # Add the nans back in (get turned to 0 in nancumsum) - angular_change[np.isnan(angular_change_point)] = np.nan - angular_speed = calc_deriv(angular_change, time) # speed in radians/s - linear_speed = deg_to_dist(angular_speed) - # Artifact correction to speed data - wrap_corrected_linear_speed = _clip_speed_wraps( - linear_speed, time, np.concatenate([pos_wraps, neg_wraps]), - t_span=0.25) - outlier_corrected_linear_speed = _zscore_threshold_1d( - wrap_corrected_linear_speed, threshold=zscore_threshold) - - # Final filtering (optional) for smoothing out the speed data - if lowpass: - b, a = signal.butter(3, Wn=4, fs=60, btype="lowpass") - outlier_corrected_linear_speed = signal.filtfilt( - b, a, np.nan_to_num(outlier_corrected_linear_speed)) - - return pd.DataFrame({ - 'speed': outlier_corrected_linear_speed[:len(time)], - 'dx': dx_raw[:len(time)], - 'v_sig': v_sig[:len(time)], - 'v_in': v_in[:len(time)], - }, index=pd.Index(time, name='timestamps')) diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_speed.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_speed.py deleted file mode 100644 index 694d5f49f5..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_speed.py +++ /dev/null @@ -1,176 +0,0 @@ -from typing import Optional - -import pandas as pd - -from pynwb import NWBFile, ProcessingModule -from pynwb.base import TimeSeries - -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - JsonWritableInterface, NwbWritableInterface -from allensdk.core.exceptions import DataFrameIndexError -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_objects import ( - DataObject, StimulusTimestamps -) -from allensdk.brain_observatory.behavior.data_files import ( - StimulusFile -) -from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 - get_running_df -) - - -class RunningSpeed(DataObject, LimsReadableInterface, NwbReadableInterface, - NwbWritableInterface, JsonReadableInterface, - JsonWritableInterface): - """A DataObject which contains properties and methods to load, process, - and represent running speed data. - - Running speed data is represented as: - - Pandas Dataframe with the following columns: - "timestamps": Timestamps (in s) for calculated speed values - "speed": Computed running speed in cm/s - """ - - def __init__( - self, - running_speed: pd.DataFrame, - stimulus_file: Optional[StimulusFile] = None, - stimulus_timestamps: Optional[StimulusTimestamps] = None, - filtered: bool = True - ): - super().__init__(name='running_speed', value=running_speed) - self._stimulus_file = stimulus_file - self._stimulus_timestamps = stimulus_timestamps - self._filtered = filtered - - @staticmethod - def _get_running_speed_df( - stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps, - filtered: bool = True, - zscore_threshold: float = 1.0 - ) -> pd.DataFrame: - running_data_df = get_running_df( - data=stimulus_file.data, time=stimulus_timestamps.value, - lowpass=filtered, zscore_threshold=zscore_threshold - ) - if running_data_df.index.name != "timestamps": - raise DataFrameIndexError( - f"Expected running_data_df index to be named 'timestamps' " - f"But instead got: '{running_data_df.index.name}'" - ) - running_speed = pd.DataFrame({ - "timestamps": running_data_df.index.values, - "speed": running_data_df.speed.values - }) - return running_speed - - @classmethod - def from_json( - cls, - dict_repr: dict, - filtered: bool = True, - zscore_threshold: float = 10.0 - ) -> "RunningSpeed": - stimulus_file = StimulusFile.from_json(dict_repr) - stimulus_timestamps = StimulusTimestamps.from_json(dict_repr) - - running_speed = cls._get_running_speed_df( - stimulus_file, stimulus_timestamps, filtered, zscore_threshold - ) - return cls( - running_speed=running_speed, - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - filtered=filtered) - - def to_json(self) -> dict: - if self._stimulus_file is None or self._stimulus_timestamps is None: - raise RuntimeError( - "RunningSpeed DataObject lacks information about the " - "StimulusFile or StimulusTimestamps. This is likely due to " - "instantiating from NWB which prevents to_json() functionality" - ) - output_dict = dict() - output_dict.update(self._stimulus_file.to_json()) - output_dict.update(self._stimulus_timestamps.to_json()) - return output_dict - - @classmethod - def from_lims( - cls, - db: PostgresQueryMixin, - behavior_session_id: int, - filtered: bool = True, - zscore_threshold: float = 10.0, - stimulus_timestamps: Optional[StimulusTimestamps] = None - ) -> "RunningSpeed": - stimulus_file = StimulusFile.from_lims(db, behavior_session_id) - if stimulus_timestamps is None: - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file - ) - - running_speed = cls._get_running_speed_df( - stimulus_file, stimulus_timestamps, filtered, zscore_threshold - ) - return cls( - running_speed=running_speed, - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - filtered=filtered - ) - - @classmethod - def from_nwb( - cls, - nwbfile: NWBFile, - filtered=True - ) -> "RunningSpeed": - running_module = nwbfile.modules['running'] - interface_name = 'speed' if filtered else 'speed_unfiltered' - running_interface = running_module.get_data_interface(interface_name) - - timestamps = running_interface.timestamps[:] - values = running_interface.data[:] - - running_speed = pd.DataFrame( - { - "timestamps": timestamps, - "speed": values - } - ) - return cls(running_speed=running_speed, filtered=filtered) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - running_speed: pd.DataFrame = self.value - data = running_speed['speed'].values - timestamps = running_speed['timestamps'].values - - if self._filtered: - data_interface_name = "speed" - else: - data_interface_name = "speed_unfiltered" - - running_speed_series = TimeSeries( - name=data_interface_name, - data=data, - timestamps=timestamps, - unit='cm/s') - - if 'running' in nwbfile.processing: - running_mod = nwbfile.processing['running'] - else: - running_mod = ProcessingModule('running', - 'Running speed processing module') - nwbfile.add_processing_module(running_mod) - - running_mod.add_data_interface(running_speed_series) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/stimuli/__init__.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py deleted file mode 100644 index 7797bf7631..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py +++ /dev/null @@ -1,215 +0,0 @@ -from typing import Optional, List - -import pandas as pd -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - StimulusFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.stimulus_processing import \ - get_stimulus_presentations, get_stimulus_metadata, is_change_event -from allensdk.brain_observatory.nwb import \ - create_stimulus_presentation_time_interval, get_column_name -from allensdk.brain_observatory.nwb.nwb_api import NwbApi - - -class Presentations(DataObject, StimulusFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - """Stimulus presentations""" - def __init__(self, presentations: pd.DataFrame): - super().__init__(name='presentations', value=presentations) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - """Adds a stimulus table (defining stimulus characteristics for each - time point in a session) to an nwbfile as TimeIntervals. - """ - stimulus_table = self.value.copy() - - ts = nwbfile.processing['stimulus'].get_data_interface('timestamps') - possible_names = {'stimulus_name', 'image_name'} - stimulus_name_column = get_column_name(stimulus_table.columns, - possible_names) - stimulus_names = stimulus_table[stimulus_name_column].unique() - - for stim_name in sorted(stimulus_names): - specific_stimulus_table = stimulus_table[stimulus_table[ - stimulus_name_column] == stim_name] # noqa: E501 - # Drop columns where all values in column are NaN - cleaned_table = specific_stimulus_table.dropna(axis=1, how='all') - # For columns with mixed strings and NaNs, fill NaNs with 'N/A' - for colname, series in cleaned_table.items(): - types = set(series.map(type)) - if len(types) > 1 and str in types: - series.fillna('N/A', inplace=True) - cleaned_table[colname] = series.transform(str) - - interval_description = (f"Presentation times and stimuli details " - f"for '{stim_name}' stimuli. " - f"\n" - f"Note: image_name references " - f"control_description in " - f"stimulus/templates") - presentation_interval = create_stimulus_presentation_time_interval( - name=f"{stim_name}_presentations", - description=interval_description, - columns_to_add=cleaned_table.columns - ) - - for row in cleaned_table.itertuples(index=False): - row = row._asdict() - - presentation_interval.add_interval( - **row, tags='stimulus_time_interval', timeseries=ts) - - nwbfile.add_time_intervals(presentation_interval) - - return nwbfile - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "Presentations": - # Note: using NwbApi class because ecephys uses this method - # TODO figure out how behavior and ecephys can share this method - nwbapi = NwbApi.from_nwbfile(nwbfile=nwbfile) - df = nwbapi.get_stimulus_presentations() - - df['is_change'] = is_change_event(stimulus_presentations=df) - df = cls._postprocess(presentations=df, fill_omitted_values=False) - return Presentations(presentations=df) - - @classmethod - def from_stimulus_file( - cls, stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps, - limit_to_images: Optional[List] = None) -> "Presentations": - """Get stimulus presentation data. - - :param stimulus_file - :param limit_to_images - Only return images given by these image names - :param stimulus_timestamps - - - :returns: pd.DataFrame -- - Table whose rows are stimulus presentations - (i.e. a given image, for a given duration, typically 250 ms) - and whose columns are presentation characteristics. - """ - stimulus_timestamps = stimulus_timestamps.value - data = stimulus_file.data - raw_stim_pres_df = get_stimulus_presentations( - data, stimulus_timestamps) - - # Fill in nulls for image_name - # This makes two assumptions: - # 1. Nulls in `image_name` should be "gratings_<orientation>" - # 2. Gratings are only present (or need to be fixed) when all - # values for `image_name` are null. - if pd.isnull(raw_stim_pres_df["image_name"]).all(): - if ~pd.isnull(raw_stim_pres_df["orientation"]).all(): - raw_stim_pres_df["image_name"] = ( - raw_stim_pres_df["orientation"] - .apply(lambda x: f"gratings_{x}")) - else: - raise ValueError("All values for 'orentation' and 'image_name'" - " are null.") - - stimulus_metadata_df = get_stimulus_metadata(data) - - idx_name = raw_stim_pres_df.index.name - stimulus_index_df = ( - raw_stim_pres_df - .reset_index() - .merge(stimulus_metadata_df.reset_index(), on=["image_name"]) - .set_index(idx_name)) - stimulus_index_df = ( - stimulus_index_df[["image_set", "image_index", "start_time", - "phase", "spatial_frequency"]] - .rename(columns={"start_time": "timestamps"}) - .sort_index() - .set_index("timestamps", drop=True)) - stim_pres_df = raw_stim_pres_df.merge( - stimulus_index_df, left_on="start_time", right_index=True, - how="left") - if len(raw_stim_pres_df) != len(stim_pres_df): - raise ValueError("Length of `stim_pres_df` should not change after" - f" merge; was {len(raw_stim_pres_df)}, now " - f" {len(stim_pres_df)}.") - - stim_pres_df['is_change'] = is_change_event( - stimulus_presentations=stim_pres_df) - - # Sort columns then drop columns which contain only all NaN values - stim_pres_df = \ - stim_pres_df[sorted(stim_pres_df)].dropna(axis=1, how='all') - if limit_to_images is not None: - stim_pres_df = \ - stim_pres_df[stim_pres_df['image_name'].isin(limit_to_images)] - stim_pres_df.index = pd.Int64Index( - range(stim_pres_df.shape[0]), name=stim_pres_df.index.name) - stim_pres_df = cls._postprocess(presentations=stim_pres_df) - return Presentations(presentations=stim_pres_df) - - @classmethod - def _postprocess(cls, presentations: pd.DataFrame, - fill_omitted_values=True, - omitted_time_duration: float = 0.25) \ - -> pd.DataFrame: - """ - 1. Filter/rearrange columns - 2. Optionally fill missing values for omitted flashes (no need when - reading from NWB since already filled) - - Parameters - ---------- - presentations - Presentations df - fill_omitted_values - Whether to fill stop time and duration for omitted flashes - omitted_time_duration - Amount of time a stimuli is omitted for in seconds""" - - def _filter_arrange_columns(df: pd.DataFrame): - df = df.drop(['index'], axis=1, errors='ignore') - df = df[['start_time', 'stop_time', - 'duration', - 'image_name', 'image_index', - 'is_change', 'omitted', - 'start_frame', 'end_frame', - 'image_set']] - return df - - df = _filter_arrange_columns(df=presentations) - if fill_omitted_values: - cls._fill_missing_values_for_omitted_flashes( - df=df, omitted_time_duration=omitted_time_duration) - return df - - @staticmethod - def _fill_missing_values_for_omitted_flashes( - df: pd.DataFrame, omitted_time_duration: float = 0.25) \ - -> pd.DataFrame: - """ - This function sets the stop time for a row that is an omitted - stimulus. An omitted stimulus is a stimulus where a mouse is - shown only a grey screen and these last for 250 milliseconds. - These do not include a stop_time or end_frame like other stimuli in - the stimulus table due to design choices. - - Parameters - ---------- - df - Stimuli presentations dataframe - omitted_time_duration - Amount of time a stimulus is omitted for in seconds - """ - omitted = df['omitted'] - df.loc[omitted, 'stop_time'] = \ - df.loc[omitted, 'start_time'] + omitted_time_duration - df.loc[omitted, 'duration'] = omitted_time_duration - return df diff --git a/allensdk/brain_observatory/behavior/data_objects/stimuli/stimuli.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/stimuli.py deleted file mode 100644 index 330e3a6795..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/stimuli/stimuli.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import Optional, List - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - StimulusFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.stimuli.presentations \ - import \ - Presentations -from allensdk.brain_observatory.behavior.data_objects.stimuli.templates \ - import \ - Templates - - -class Stimuli(DataObject, StimulusFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - def __init__(self, presentations: Presentations, - templates: Templates): - super().__init__(name='stimuli', value=self) - self._presentations = presentations - self._templates = templates - - @property - def presentations(self) -> Presentations: - return self._presentations - - @property - def templates(self) -> Templates: - return self._templates - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "Stimuli": - p = Presentations.from_nwb(nwbfile=nwbfile) - t = Templates.from_nwb(nwbfile=nwbfile) - return Stimuli(presentations=p, templates=t) - - @classmethod - def from_stimulus_file( - cls, stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps, - limit_to_images: Optional[List] = None) -> "Stimuli": - p = Presentations.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - limit_to_images=limit_to_images) - t = Templates.from_stimulus_file(stimulus_file=stimulus_file, - limit_to_images=limit_to_images) - return Stimuli(presentations=p, templates=t) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - nwbfile = self._templates.to_nwb( - nwbfile=nwbfile, stimulus_presentations=self._presentations) - nwbfile = self._presentations.to_nwb(nwbfile=nwbfile) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py deleted file mode 100644 index d5a7bfa69e..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py +++ /dev/null @@ -1,290 +0,0 @@ -from typing import Dict, List - -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ - convert_filepath_caseinsensitive -from allensdk.brain_observatory.stimulus_info import BrainObservatoryMonitor - - -class StimulusImage: - """Container class for image stimuli""" - - def __init__(self, warped: np.ndarray, unwarped: np.ndarray, name: str): - """ - Parameters - ---------- - warped: - The warped stimulus image - unwarped: - The unwarped stimulus image - name: - Name of the stimulus image - """ - self._name = name - self.warped = warped - self.unwarped = unwarped - - @property - def name(self): - return self._name - - -class StimulusImageFactory: - """Factory for StimulusImage""" - _monitor = BrainObservatoryMonitor() - - def from_unprocessed(self, input_array: np.ndarray, - name: str) -> StimulusImage: - """Creates a StimulusImage from unprocessed input (usually pkl). - Image needs to be warped and preprocessed""" - resized, unwarped = self._get_unwarped(arr=input_array) - warped = self._get_warped(arr=resized) - image = StimulusImage(name=name, warped=warped, unwarped=unwarped) - return image - - @staticmethod - def from_processed(warped: np.ndarray, unwarped: np.ndarray, - name: str) -> StimulusImage: - """Creates a StimulusImage from processed input (usually nwb). - Image has already been warped and preprocessed""" - image = StimulusImage(name=name, warped=warped, unwarped=unwarped) - return image - - def _get_warped(self, arr: np.ndarray): - """Note: The Stimulus image is warped when shown to the mice to account - "for distance of the flat screen to the eye at each point on - the monitor.""" - return self._monitor.warp_image(img=arr) - - def _get_unwarped(self, arr: np.ndarray): - """This produces the pixels that would be visible in the unwarped image - post-warping""" - # 1. Resize image to the same size as the monitor - resized_array = self._monitor.natural_scene_image_to_screen( - arr, origin='upper') - # 2. Remove unseen pixels - arr = self._exclude_unseen_pixels(arr=resized_array) - - return resized_array, arr - - def _exclude_unseen_pixels(self, arr: np.ndarray): - """After warping, some pixels are not visible on the screen. - This sets those pixels to nan to make downstream analysis easier.""" - mask = self._monitor.get_mask() - arr = arr.astype(np.float) - arr *= mask - arr[arr == 0] = np.nan - return arr - - def _warp(self, arr: np.ndarray) -> np.ndarray: - """The Stimulus image is warped when shown to the mice to account - "for distance of the flat screen to the eye at each point on - the monitor." This applies the warping.""" - return self._monitor.warp_image(img=arr) - - -class StimulusTemplate: - """Container class for a collection of image stimuli""" - - def __init__(self, image_set_name: str, images: List[StimulusImage]): - """ - Parameters - ---------- - image_set_name: - the name of the image set - images - List of images - """ - self._image_set_name = image_set_name - - image_set_name = convert_filepath_caseinsensitive( - image_set_name) - self._image_set_filepath = image_set_name - - self._images: Dict[str, StimulusImage] = {} - - for image in images: - self._images[image.name] = image - - @property - def image_set_name(self) -> str: - return self._image_set_name - - @property - def image_names(self) -> List[str]: - return list(self.keys()) - - @property - def images(self) -> List[StimulusImage]: - return list(self.values()) - - def keys(self): - return self._images.keys() - - def values(self): - return self._images.values() - - def items(self): - return self._images.items() - - def to_dataframe(self) -> pd.DataFrame: - index = pd.Index(self.image_names, name='image_name') - warped = [img.warped for img in self.images] - unwarped = [img.unwarped for img in self.images] - df = pd.DataFrame({'unwarped': unwarped, 'warped': warped}, - index=index) - df.name = self._image_set_name - return df - - def __add_image(self, warped_values: np.ndarray, - unwarped_values: np.ndarray, name: str): - """ - Parameters - ---------- - name : str - Name of the image - warped_values : np.ndarray - The image array corresponding to the 'warped' version of the - stimuli. - unwarped_values : np.ndarray - The image array corresponding to the 'unwarped' version of the - stimuli. - """ - image = StimulusImage(warped=warped_values, - unwarped=unwarped_values, - name=name) - self._images[name] = image - - def __getitem__(self, item) -> StimulusImage: - """ - Given an image name, returns the corresponding StimulusImage - """ - return self._images[item] - - def __len__(self): - return len(self._images) - - def __iter__(self): - yield from self._images - - def __repr__(self): - return f'{self._images}' - - def __eq__(self, other: object): - if isinstance(other, StimulusTemplate): - if self.image_set_name != other.image_set_name: - return False - - if sorted(self.image_names) != sorted(other.image_names): - return False - - for (img_name, self_img) in self.items(): - other_img = other._images[img_name] - warped_equal = np.array_equal( - self_img.warped, other_img.warped) - unwarped_equal = np.allclose(self_img.unwarped, - other_img.unwarped, - equal_nan=True) - if not (warped_equal and unwarped_equal): - return False - - return True - else: - raise NotImplementedError( - "Cannot compare a StimulusTemplate with an object of type: " - f"{type(other)}!") - - -class StimulusTemplateFactory: - """Factory for StimulusTemplate""" - - @staticmethod - def from_unprocessed(image_set_name: str, image_attributes: List[dict], - images: List[np.ndarray]) -> StimulusTemplate: - """Create StimulusTemplate from pkl or unprocessed input. Stimulus - templates created this way need to be processed to acquire unwarped - versions of the images presented. - - NOTE: The ordering of image_attributes and images matter! - - NOTE: Warped images display what was seen on a monitor by a subject. - Unwarped images display a 'diagnostic' version of the stimuli to be - presented. - - Parameters - ---------- - image_set_name : str - The name of the image set. Example: - Natural_Images_Lum_Matched_set_TRAINING_2017.07.14 - image_attributes : List[dict] - A list of dictionaries containing image metadata. Must at least - contain the key: - image_name - But will usually also contain: - image_category, orientation, phase, - spatial_frequency, image_index - images : List[np.ndarray] - A list of image arrays - - Returns - ------- - StimulusTemplate - A StimulusTemplate object - """ - stimulus_images = [] - for i, image in enumerate(images): - name = image_attributes[i]['image_name'] - stimulus_image = StimulusImageFactory().from_unprocessed( - name=name, input_array=image) - stimulus_images.append(stimulus_image) - return StimulusTemplate(image_set_name=image_set_name, - images=stimulus_images) - - @staticmethod - def from_processed(image_set_name: str, image_attributes: List[dict], - unwarped: List[np.ndarray], - warped: List[np.ndarray]) -> StimulusTemplate: - """Create StimulusTemplate from nwb or other processed input. - Stimulus templates created this way DO NOT need to be processed - to acquire unwarped versions of the images presented. - - NOTE: The ordering of image_attributes, unwarped, and warped matter! - - NOTE: Warped images display what was seen on a monitor by a subject. - Unwarped images display a 'diagnostic' version of the stimuli to be - presented. - - Parameters - ---------- - image_set_name : str - The name of the image set. Example: - Natural_Images_Lum_Matched_set_TRAINING_2017.07.14 - image_attributes : List[dict] - A list of dictionaries containing image metadata. Must at least - contain the key: - image_name - But will usually also contain: - image_category, orientation, phase, - spatial_frequency, image_index - unwarped : List[np.ndarray] - A list of unwarped image arrays - warped : List[np.ndarray] - A list of warped image arrays - - Returns - ------- - StimulusTemplate - A StimulusTemplate object - """ - stimulus_images = [] - for i, attrs in enumerate(image_attributes): - warped_image = warped[i] - unwarped_image = unwarped[i] - name = attrs['image_name'] - stimulus_image = StimulusImageFactory.from_processed( - name=name, warped=warped_image, unwarped=unwarped_image) - stimulus_images.append(stimulus_image) - return StimulusTemplate(image_set_name=image_set_name, - images=stimulus_images) diff --git a/allensdk/brain_observatory/behavior/data_objects/stimuli/templates.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/templates.py deleted file mode 100644 index 168a9d367d..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/stimuli/templates.py +++ /dev/null @@ -1,139 +0,0 @@ -import os -import numpy as np -from typing import Optional, List - -import imageio -from pynwb import NWBFile - -from allensdk.brain_observatory import nwb -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - StimulusFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.stimuli.presentations \ - import \ - Presentations -from allensdk.brain_observatory.behavior.stimulus_processing import \ - get_stimulus_templates -from allensdk.brain_observatory.behavior.data_objects.stimuli \ - .stimulus_templates import \ - StimulusTemplate, StimulusTemplateFactory -from allensdk.brain_observatory.behavior.write_nwb.extensions\ - .stimulus_template.ndx_stimulus_template import \ - StimulusTemplateExtension -from allensdk.internal.core.lims_utilities import safe_system_path - - -class Templates(DataObject, StimulusFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - def __init__(self, templates: StimulusTemplate): - super().__init__(name='stimulus_templates', value=templates) - - @classmethod - def from_stimulus_file( - cls, stimulus_file: StimulusFile, - limit_to_images: Optional[List] = None) -> "Templates": - """Get stimulus templates (movies, scenes) for behavior session.""" - - # TODO: Eventually the `grating_images_dict` should be provided by the - # BehaviorLimsExtractor/BehaviorJsonExtractor classes. - # - NJM 2021/2/23 - - gratings_dir = "/allen/programs/braintv/production/visualbehavior" - gratings_dir = os.path.join(gratings_dir, - "prod5/project_VisualBehavior") - grating_images_dict = { - "gratings_0.0": { - "warped": np.asarray(imageio.imread( - safe_system_path(os.path.join(gratings_dir, - "warped_grating_0.png")))), - "unwarped": np.asarray(imageio.imread( - safe_system_path(os.path.join( - gratings_dir, "masked_unwarped_grating_0.png")))) - }, - "gratings_90.0": { - "warped": np.asarray(imageio.imread( - safe_system_path(os.path.join(gratings_dir, - "warped_grating_90.png")))), - "unwarped": np.asarray(imageio.imread( - safe_system_path(os.path.join( - gratings_dir, "masked_unwarped_grating_90.png")))) - }, - "gratings_180.0": { - "warped": np.asarray(imageio.imread( - safe_system_path(os.path.join(gratings_dir, - "warped_grating_180.png")))), - "unwarped": np.asarray(imageio.imread( - safe_system_path(os.path.join( - gratings_dir, "masked_unwarped_grating_180.png")))) - }, - "gratings_270.0": { - "warped": np.asarray(imageio.imread( - safe_system_path(os.path.join(gratings_dir, - "warped_grating_270.png")))), - "unwarped": np.asarray(imageio.imread( - safe_system_path(os.path.join( - gratings_dir, "masked_unwarped_grating_270.png")))) - } - } - - pkl = stimulus_file.data - t = get_stimulus_templates(pkl=pkl, - grating_images_dict=grating_images_dict, - limit_to_images=limit_to_images) - return Templates(templates=t) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "Templates": - image_set_name = list(nwbfile.stimulus_template.keys())[0] - image_data = list(nwbfile.stimulus_template.values())[0] - - image_attributes = [{'image_name': image_name} - for image_name in image_data.control_description] - t = StimulusTemplateFactory.from_processed( - image_set_name=image_set_name, image_attributes=image_attributes, - warped=image_data.data[:], unwarped=image_data.unwarped[:] - ) - return Templates(templates=t) - - def to_nwb(self, nwbfile: NWBFile, - stimulus_presentations: Presentations) -> NWBFile: - stimulus_templates = self.value - - unwarped_images = [] - warped_images = [] - image_names = [] - for image_name, image_data in stimulus_templates.items(): - image_names.append(image_name) - unwarped_images.append(image_data.unwarped) - warped_images.append(image_data.warped) - - image_index = np.zeros(len(image_names)) - image_index[:] = np.nan - - visual_stimulus_image_series = \ - StimulusTemplateExtension( - name=stimulus_templates.image_set_name, - data=warped_images, - unwarped=unwarped_images, - control=list(range(len(image_names))), - control_description=image_names, - unit='NA', - format='raw', - timestamps=image_index) - - nwbfile.add_stimulus_template(visual_stimulus_image_series) - - # Add index for this template to NWB in-memory object: - nwb_template = nwbfile.stimulus_template[ - stimulus_templates.image_set_name] - stimulus_index = stimulus_presentations.value[ - stimulus_presentations.value[ - 'image_set'] == nwb_template.name] - nwb.add_stimulus_index(nwbfile, stimulus_index, nwb_template) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/stimuli/util.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/util.py deleted file mode 100644 index b3f38b7eb6..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/stimuli/util.py +++ /dev/null @@ -1,63 +0,0 @@ -import warnings -from pathlib import Path - -from allensdk.brain_observatory.behavior.data_files import SyncFile -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.equipment import \ - Equipment -from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner - - -def convert_filepath_caseinsensitive(filename_in): - return filename_in.replace('TRAINING', 'training') - - -def get_image_set_name(image_set_path: str) -> str: - """ - Strips the stem from the image_set filename - """ - return Path(image_set_path).stem - - -def calculate_monitor_delay(sync_file: SyncFile, - equipment: Equipment) -> float: - """Calculates monitor delay using sync file. If that fails, looks up - monitor delay from known values for equipment. - - Raises - -------- - RuntimeError - If input equipment is unknown - """ - aligner = OphysTimeAligner(sync_file=sync_file.filepath) - - try: - delay = aligner.monitor_delay - except ValueError as ee: - equipment_name = equipment.value - - warning_msg = 'Monitory delay calculation failed ' - warning_msg += 'with ValueError\n' - warning_msg += f' "{ee}"' - warning_msg += '\nlooking monitor delay up from table ' - warning_msg += f'for rig: {equipment_name} ' - - # see - # https://github.com/AllenInstitute/AllenSDK/issues/1318 - # https://github.com/AllenInstitute/AllenSDK/issues/1916 - delay_lookup = {'CAM2P.1': 0.020842, - 'CAM2P.2': 0.037566, - 'CAM2P.3': 0.021390, - 'CAM2P.4': 0.021102, - 'CAM2P.5': 0.021192, - 'MESO.1': 0.03613} - - if equipment_name not in delay_lookup: - msg = warning_msg - msg += f'\nequipment_name {equipment_name} not in lookup table' - raise RuntimeError(msg) - delay = delay_lookup[equipment_name] - warning_msg += f'\ndelay: {delay} seconds' - warnings.warn(warning_msg) - - return delay diff --git a/allensdk/brain_observatory/behavior/data_objects/task_parameters.py b/allensdk/brain_observatory/behavior/data_objects/task_parameters.py deleted file mode 100644 index a1780ff491..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/task_parameters.py +++ /dev/null @@ -1,234 +0,0 @@ -from enum import Enum -import numpy as np -from typing import List - -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - StimulusFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.schemas import \ - BehaviorTaskParametersSchema -from allensdk.brain_observatory.nwb import load_pynwb_extension - - -class BehaviorStimulusType(Enum): - IMAGES = 'images' - GRATING = 'grating' - - -class StimulusDistribution(Enum): - EXPONENTIAL = 'exponential' - GEOMETRIC = 'geometric' - - -class TaskType(Enum): - CHANGE_DETECTION = 'change detection' - - -class TaskParameters(DataObject, StimulusFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - def __init__(self, - blank_duration_sec: List[float], - stimulus_duration_sec: float, - omitted_flash_fraction: float, - response_window_sec: List[float], - reward_volume: float, - auto_reward_volume: float, - session_type: str, - stimulus: str, - stimulus_distribution: StimulusDistribution, - task_type: TaskType, - n_stimulus_frames: int): - super().__init__(name='task_parameters', value=self) - self._blank_duration_sec = blank_duration_sec - self._stimulus_duration_sec = stimulus_duration_sec - self._omitted_flash_fraction = omitted_flash_fraction - self._response_window_sec = response_window_sec - self._reward_volume = reward_volume - self._auto_reward_volume = auto_reward_volume - self._session_type = session_type - self._stimulus = BehaviorStimulusType(stimulus) - self._stimulus_distribution = StimulusDistribution( - stimulus_distribution) - self._task = TaskType(task_type) - self._n_stimulus_frames = n_stimulus_frames - - @property - def blank_duration_sec(self) -> List[float]: - return self._blank_duration_sec - - @property - def stimulus_duration_sec(self) -> float: - return self._stimulus_duration_sec - - @property - def omitted_flash_fraction(self) -> float: - return self._omitted_flash_fraction - - @property - def response_window_sec(self) -> List[float]: - return self._response_window_sec - - @property - def reward_volume(self) -> float: - return self._reward_volume - - @property - def auto_reward_volume(self) -> float: - return self._auto_reward_volume - - @property - def session_type(self) -> str: - return self._session_type - - @property - def stimulus(self) -> str: - return self._stimulus - - @property - def stimulus_distribution(self) -> float: - return self._stimulus_distribution - - @property - def task(self) -> TaskType: - return self._task - - @property - def n_stimulus_frames(self) -> int: - return self._n_stimulus_frames - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - nwb_extension = load_pynwb_extension( - BehaviorTaskParametersSchema, 'ndx-aibs-behavior-ophys' - ) - task_parameters = self.to_dict()['task_parameters'] - task_parameters_clean = BehaviorTaskParametersSchema().dump( - task_parameters - ) - - new_task_parameters_dict = {} - for key, val in task_parameters_clean.items(): - if isinstance(val, list): - new_task_parameters_dict[key] = np.array(val) - else: - new_task_parameters_dict[key] = val - nwb_task_parameters = nwb_extension( - name='task_parameters', **new_task_parameters_dict) - nwbfile.add_lab_meta_data(nwb_task_parameters) - return nwbfile - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "TaskParameters": - metadata_nwb_obj = nwbfile.lab_meta_data['task_parameters'] - data = BehaviorTaskParametersSchema().dump(metadata_nwb_obj) - data['task_type'] = data['task'] - del data['task'] - return TaskParameters(**data) - - @classmethod - def from_stimulus_file(cls, - stimulus_file: StimulusFile) -> "TaskParameters": - data = stimulus_file.data - - behavior = data["items"]["behavior"] - config = behavior["config"] - doc = config["DoC"] - - blank_duration_sec = [float(x) for x in doc['blank_duration_range']] - stim_duration = cls._calculate_stimulus_duration( - stimulus_file=stimulus_file) - omitted_flash_fraction = \ - behavior['params'].get('flash_omit_probability', float('nan')) - response_window_sec = [float(x) for x in doc["response_window"]] - reward_volume = config["reward"]["reward_volume"] - auto_reward_volume = doc['auto_reward_volume'] - session_type = behavior["params"]["stage"] - stimulus = next(iter(behavior["stimuli"])) - stimulus_distribution = doc["change_time_dist"] - task = cls._parse_task(stimulus_file=stimulus_file) - n_stimulus_frames = cls._calculuate_n_stimulus_frames( - stimulus_file=stimulus_file) - return TaskParameters( - blank_duration_sec=blank_duration_sec, - stimulus_duration_sec=stim_duration, - omitted_flash_fraction=omitted_flash_fraction, - response_window_sec=response_window_sec, - reward_volume=reward_volume, - auto_reward_volume=auto_reward_volume, - session_type=session_type, - stimulus=stimulus, - stimulus_distribution=stimulus_distribution, - task_type=task, - n_stimulus_frames=n_stimulus_frames - ) - - @staticmethod - def _calculate_stimulus_duration(stimulus_file: StimulusFile) -> float: - data = stimulus_file.data - - behavior = data["items"]["behavior"] - stimuli = behavior['stimuli'] - - def _parse_stimulus_key(): - if 'images' in stimuli: - stim_key = 'images' - elif 'grating' in stimuli: - stim_key = 'grating' - else: - msg = "Cannot get stimulus_duration_sec\n" - msg += "'images' and/or 'grating' not a valid " - msg += "key in pickle file under " - msg += "['items']['behavior']['stimuli']\n" - msg += f"keys: {list(stimuli.keys())}" - raise RuntimeError(msg) - - return stim_key - stim_key = _parse_stimulus_key() - stim_duration = stimuli[stim_key]['flash_interval_sec'] - - # from discussion in - # https://github.com/AllenInstitute/AllenSDK/issues/1572 - # - # 'flash_interval' contains (stimulus_duration, gray_screen_duration) - # (as @matchings said above). That second value is redundant with - # 'blank_duration_range'. I'm not sure what would happen if they were - # set to be conflicting values in the params. But it looks like - # they're always consistent. It should always be (0.25, 0.5), - # except for TRAINING_0 and TRAINING_1, which have statically - # displayed stimuli (no flashes). - - if stim_duration is None: - stim_duration = np.NaN - else: - stim_duration = stim_duration[0] - return stim_duration - - @staticmethod - def _parse_task(stimulus_file: StimulusFile) -> TaskType: - data = stimulus_file.data - config = data["items"]["behavior"]["config"] - - task_id = config['behavior']['task_id'] - if 'DoC' in task_id: - task = TaskType.CHANGE_DETECTION - else: - msg = "metadata.get_task_parameters does not " - msg += f"know how to parse 'task_id' = {task_id}" - raise RuntimeError(msg) - return task - - @staticmethod - def _calculuate_n_stimulus_frames(stimulus_file: StimulusFile) -> int: - data = stimulus_file.data - behavior = data["items"]["behavior"] - - n_stimulus_frames = 0 - for stim_type, stim_table in behavior["stimuli"].items(): - n_stimulus_frames += sum(stim_table.get("draw_log", [])) - return n_stimulus_frames diff --git a/allensdk/brain_observatory/behavior/data_objects/timestamps/__init__.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py deleted file mode 100644 index 7e9ad3e243..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py +++ /dev/null @@ -1,104 +0,0 @@ -import logging - -import numpy as np -from pynwb import NWBFile - -from allensdk.brain_observatory.behavior.data_files import SyncFile -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - SyncFileReadableInterface, NwbReadableInterface - - -class OphysTimestamps(DataObject, SyncFileReadableInterface, - NwbReadableInterface): - _logger = logging.getLogger(__name__) - - def __init__(self, timestamps: np.ndarray): - """ - :param timestamps - ophys timestamps - """ - super().__init__(name='ophys_timestamps', value=timestamps) - - @classmethod - def from_sync_file(cls, sync_file: SyncFile) -> "OphysTimestamps": - ophys_timestamps = sync_file.data['ophys_frames'] - return cls(timestamps=ophys_timestamps) - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "OphysTimestamps": - ts = nwbfile.processing[ - 'ophys'].get_data_interface('dff').roi_response_series[ - 'traces'].timestamps[:] - return cls(timestamps=ts) - - def validate(self, number_of_frames: int) -> "OphysTimestamps": - """Validates that number of ophys timestamps do not exceed number of - dff traces. If so, truncates number of ophys timestamps to the same - length as dff traces - - :param number_of_frames - number of frames in the movie - - Notes - --------- - Modifies self._value if ophys timestamps exceed length of - number_of_frames - """ - # Scientifica data has extra frames in the sync file relative - # to the number of frames in the video. These sentinel frames - # should be removed. - # NOTE: This fix does not apply to mesoscope data. - # See http://confluence.corp.alleninstitute.org/x/9DVnAg - ophys_timestamps = self.value - num_of_timestamps = len(ophys_timestamps) - if number_of_frames < num_of_timestamps: - self._logger.info( - "Truncating acquisition frames ('ophys_frames') " - f"(len={num_of_timestamps}) to the number of frames " - f"in the df/f trace ({number_of_frames}).") - self._value = ophys_timestamps[:number_of_frames] - elif number_of_frames > num_of_timestamps: - raise RuntimeError( - f"dff_frames (len={number_of_frames}) is longer " - f"than timestamps (len={num_of_timestamps}).") - return self - - -class OphysTimestampsMultiplane(OphysTimestamps): - def __init__(self, timestamps: np.ndarray): - super().__init__(timestamps=timestamps) - - @classmethod - def from_sync_file(cls, sync_file: SyncFile, - group_count: int, - plane_group: int) -> "OphysTimestampsMultiplane": - if group_count == 0: - raise ValueError('Group count cannot be 0') - - ophys_timestamps = sync_file.data['ophys_frames'] - cls._logger.info( - "Mesoscope data detected. Splitting timestamps " - f"(len={len(ophys_timestamps)} over {group_count} " - "plane group(s).") - - # Resample if collecting multiple concurrent planes - # because the frames are interleaved - ophys_timestamps = ophys_timestamps[plane_group::group_count] - - return cls(timestamps=ophys_timestamps) - - def validate(self, number_of_frames: int) -> "OphysTimestampsMultiplane": - """ - Raises error if length of timestamps and number of frames are not equal - :param number_of_frames - See super().validate - """ - ophys_timestamps = self.value - num_of_timestamps = len(ophys_timestamps) - if number_of_frames != num_of_timestamps: - raise RuntimeError( - f"dff_frames (len={number_of_frames}) is not equal to " - f"number of split timestamps (len={num_of_timestamps}).") - return self diff --git a/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py deleted file mode 100644 index 2df1042c40..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py +++ /dev/null @@ -1,142 +0,0 @@ - -import json -from typing import Optional - -from cachetools.keys import hashkey - -import numpy as np -from pynwb import NWBFile, ProcessingModule -from pynwb.base import TimeSeries - -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - JsonReadableInterface, LimsReadableInterface, NwbReadableInterface, \ - StimulusFileReadableInterface, SyncFileReadableInterface -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_files import ( - StimulusFile, SyncFile -) -from allensdk.brain_observatory.behavior.data_objects.base \ - .writable_interfaces import \ - JsonWritableInterface, NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .stimulus_timestamps.timestamps_processing import ( - get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps) -from allensdk.internal.api import PostgresQueryMixin - - -def from_json_cache_key(cls, dict_repr: dict): - return hashkey(json.dumps(dict_repr)) - - -def from_lims_cache_key( - cls, db, behavior_session_id: int, - ophys_experiment_id: Optional[int] = None -): - return hashkey(behavior_session_id, ophys_experiment_id) - - -class StimulusTimestamps(DataObject, StimulusFileReadableInterface, - SyncFileReadableInterface, JsonReadableInterface, - NwbReadableInterface, LimsReadableInterface, - NwbWritableInterface, JsonWritableInterface): - """A DataObject which contains properties and methods to load, process, - and represent visual behavior stimulus timestamp data. - - Stimulus timestamp data is represented as: - - Numpy array whose length is equal to the number of timestamps collected - and whose values are timestamps (in seconds) - """ - - def __init__( - self, - timestamps: np.ndarray, - stimulus_file: Optional[StimulusFile] = None, - sync_file: Optional[SyncFile] = None - ): - super().__init__(name="stimulus_timestamps", value=timestamps) - self._stimulus_file = stimulus_file - self._sync_file = sync_file - - @classmethod - def from_stimulus_file( - cls, - stimulus_file: StimulusFile) -> "StimulusTimestamps": - stimulus_timestamps = get_behavior_stimulus_timestamps( - stimulus_pkl=stimulus_file.data - ) - - return cls( - timestamps=stimulus_timestamps, - stimulus_file=stimulus_file - ) - - @classmethod - def from_sync_file(cls, sync_file: SyncFile) -> "StimulusTimestamps": - stimulus_timestamps = get_ophys_stimulus_timestamps( - sync_path=sync_file.filepath - ) - return cls( - timestamps=stimulus_timestamps, - sync_file=sync_file - ) - - @classmethod - def from_json(cls, dict_repr: dict) -> "StimulusTimestamps": - if 'sync_file' in dict_repr: - sync_file = SyncFile.from_json(dict_repr=dict_repr) - return cls.from_sync_file(sync_file=sync_file) - else: - stim_file = StimulusFile.from_json(dict_repr=dict_repr) - return cls.from_stimulus_file(stimulus_file=stim_file) - - def from_lims( - cls, - db: PostgresQueryMixin, - behavior_session_id: int, - ophys_experiment_id: Optional[int] = None - ) -> "StimulusTimestamps": - stimulus_file = StimulusFile.from_lims(db, behavior_session_id) - - if ophys_experiment_id: - sync_file = SyncFile.from_lims( - db=db, ophys_experiment_id=ophys_experiment_id) - return cls.from_sync_file(sync_file=sync_file) - else: - return cls.from_stimulus_file(stimulus_file=stimulus_file) - - def to_json(self) -> dict: - if self._stimulus_file is None: - raise RuntimeError( - "StimulusTimestamps DataObject lacks information about the " - "StimulusFile. This is likely due to instantiating from NWB " - "which prevents to_json() functionality" - ) - - output_dict = dict() - output_dict.update(self._stimulus_file.to_json()) - if self._sync_file is not None: - output_dict.update(self._sync_file.to_json()) - return output_dict - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "StimulusTimestamps": - stim_module = nwbfile.processing["stimulus"] - stim_ts_interface = stim_module.get_data_interface("timestamps") - stim_timestamps = stim_ts_interface.timestamps[:] - return cls(timestamps=stim_timestamps) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - stimulus_ts = TimeSeries( - data=self._value, - name="timestamps", - timestamps=self._value, - unit="s" - ) - - stim_mod = ProcessingModule("stimulus", "Stimulus Times processing") - stim_mod.add_data_interface(stimulus_ts) - nwbfile.add_processing_module(stim_mod) - - return nwbfile diff --git a/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py deleted file mode 100644 index b34f9b0e1b..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Union -from pathlib import Path - -import numpy as np - -from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner - - -def get_behavior_stimulus_timestamps(stimulus_pkl: dict) -> np.ndarray: - """Obtain visual behavior stimuli timing information from a behavior - stimulus *.pkl file. - - Parameters - ---------- - stimulus_pkl : dict - A dictionary containing stimulus presentation timing information - during a behavior session. Presentation timing info is stored as - an array of times between frames (frame time intervals) in - milliseconds. - - Returns - ------- - np.ndarray - Timestamps (in seconds) for presented stimulus frames during a session. - """ - vsyncs = stimulus_pkl["items"]["behavior"]["intervalsms"] - stimulus_timestamps = np.hstack((0, vsyncs)).cumsum() / 1000.0 - return stimulus_timestamps - - -def get_ophys_stimulus_timestamps(sync_path: Union[str, Path]) -> np.ndarray: - """Obtain visual behavior stimuli timing information from a sync *.h5 file. - - Parameters - ---------- - sync_path : Union[str, Path] - The path to a sync *.h5 file that contains global timing information - about multiple data streams (e.g. behavior, ophys, eye_tracking) - during a session. - - Returns - ------- - np.ndarray - Timestamps (in seconds) for presented stimulus frames during a - behavior + ophys session. - """ - aligner = OphysTimeAligner(sync_file=sync_path) - stimulus_timestamps, _ = aligner.clipped_stim_timestamps - return stimulus_timestamps diff --git a/allensdk/brain_observatory/behavior/data_objects/timestamps/util.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/util.py deleted file mode 100644 index 8e162adde2..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/timestamps/util.py +++ /dev/null @@ -1,5 +0,0 @@ -import numpy as np - - -def calc_frame_rate(timestamps: np.ndarray): - return np.round(1 / np.mean(np.diff(timestamps)), 0) diff --git a/allensdk/brain_observatory/behavior/data_objects/trials/__init__.py b/allensdk/brain_observatory/behavior/data_objects/trials/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/data_objects/trials/trial.py b/allensdk/brain_observatory/behavior/data_objects/trials/trial.py deleted file mode 100644 index e8d3729995..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/trials/trial.py +++ /dev/null @@ -1,423 +0,0 @@ -from typing import List, Dict, Any, Tuple - -import numpy as np - -from allensdk import one -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.licks import Licks -from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards - - -class Trial: - def __init__(self, trial: dict, start: float, end: float, - behavior_stimulus_file: StimulusFile, - index: int, monitor_delay: float, - stimulus_timestamps: StimulusTimestamps, - licks: Licks, rewards: Rewards, stimuli: dict): - self._trial = trial - self._start = start - self._end = self._calculate_trial_end( - trial_end=end, behavior_stimulus_file=behavior_stimulus_file) - self._index = index - self._data = self._match_to_sync_timestamps( - monitor_delay=monitor_delay, - stimulus_timestamps=stimulus_timestamps, licks=licks, - rewards=rewards, stimuli=stimuli) - - @property - def data(self): - return self._data - - def _match_to_sync_timestamps( - self, monitor_delay: float, - stimulus_timestamps: StimulusTimestamps, - licks: Licks, rewards: Rewards, - stimuli: dict) -> Dict[str, Any]: - event_dict = { - (e[0], e[1]): { - 'timestamp': stimulus_timestamps.value[e[3]], - 'frame': e[3]} for e in self._trial['events'] - } - - tr_data = {"trial": self._trial["index"]} - lick_frames = licks.value['frame'].values - timestamps = stimulus_timestamps.value - reward_times = rewards.value['timestamps'].values - - # this block of code is trying to mimic - # https://github.com/AllenInstitute/visual_behavior_analysis - # /blob/master/visual_behavior/translator/foraging2 - # /stimulus_processing.py - # #L377-L381 - # https://github.com/AllenInstitute/visual_behavior_analysis - # /blob/master/visual_behavior/translator/foraging2 - # /extract_movies.py#L59-L94 - # https://github.com/AllenInstitute/visual_behavior_analysis - # /blob/master/visual_behavior/translator/core/annotate.py#L11-L36 - # - # In summary: there are cases where an "epilogue movie" is shown - # after the proper stimuli; we do not want licks that occur - # during this epilogue movie to be counted as belonging to - # the last trial - # https://github.com/AllenInstitute/visual_behavior_analysis - # /issues/482 - - # select licks that fall between trial_start and trial_end; - # licks on the boundary get assigned to the trial that is ending, - # rather than the trial that is starting - if self._end > 0: - valid_idx = np.where(np.logical_and(lick_frames > self._start, - lick_frames <= self._end)) - else: - valid_idx = np.where(lick_frames > self._start) - - valid_licks = lick_frames[valid_idx] - if len(valid_licks) > 0: - tr_data["lick_times"] = timestamps[valid_licks] - else: - tr_data["lick_times"] = np.array([], dtype=float) - - tr_data["reward_time"] = self._get_reward_time( - reward_times, - event_dict[('trial_start', '')]['timestamp'], - event_dict[('trial_end', '')]['timestamp'] - ) - tr_data.update(self._get_trial_data()) - tr_data.update(self._get_trial_timing( - event_dict, - tr_data['lick_times'], - tr_data['go'], - tr_data['catch'], - tr_data['auto_rewarded'], - tr_data['hit'], - tr_data['false_alarm'], - tr_data["aborted"], - timestamps, - monitor_delay - )) - tr_data.update(self._get_trial_image_names(stimuli)) - - self._validate_trial_condition_exclusivity(tr_data=tr_data) - - return tr_data - - @staticmethod - def _get_reward_time(rebased_reward_times, - start_time, - stop_time) -> float: - """extract reward times in time range""" - reward_times = rebased_reward_times[np.where(np.logical_and( - rebased_reward_times >= start_time, - rebased_reward_times <= stop_time - ))] - return float('nan') if len(reward_times) == 0 else one( - reward_times) - - @staticmethod - def _calculate_trial_end(trial_end, - behavior_stimulus_file: StimulusFile) -> int: - if trial_end < 0: - bhv = behavior_stimulus_file.data['items']['behavior']['items'] - if 'fingerprint' in bhv.keys(): - trial_end = bhv['fingerprint']['starting_frame'] - return trial_end - - def _get_trial_data(self) -> Dict[str, Any]: - """ - Infer trial logic from trial log. Returns a dictionary. - - * reward volume: volume of water delivered on the trial, in mL - - Each of the following values is boolean: - - Trial category values are mutually exclusive - * go: trial was a go trial (trial with a stimulus change) - * catch: trial was a catch trial (trial with a sham stimulus change) - - stimulus_change/sham_change are mutually exclusive - * stimulus_change: did the stimulus change (True on 'go' trials) - * sham_change: stimulus did not change, but response was evaluated - (True on 'catch' trials) - - Each trial can be one (and only one) of the following: - * hit (stimulus changed, animal responded in response window) - * miss (stimulus changed, animal did not respond in response window) - * false_alarm (stimulus did not change, - animal responded in response window) - * correct_reject (stimulus did not change, - animal did not respond in response window) - * aborted (animal responded before change time) - * auto_rewarded (reward was automatically delivered following the - change. - This will bias the animals choice and should not be - categorized as hit/miss) - """ - trial_event_names = [val[0] for val in self._trial['events']] - hit = 'hit' in trial_event_names - false_alarm = 'false_alarm' in trial_event_names - miss = 'miss' in trial_event_names - sham_change = 'sham_change' in trial_event_names - stimulus_change = 'stimulus_changed' in trial_event_names - aborted = 'abort' in trial_event_names - - if aborted: - go = catch = auto_rewarded = False - else: - catch = self._trial["trial_params"]["catch"] is True - auto_rewarded = self._trial["trial_params"]["auto_reward"] - go = not catch and not auto_rewarded - - correct_reject = catch and not false_alarm - - if auto_rewarded: - hit = miss = correct_reject = false_alarm = False - - return { - "reward_volume": sum([ - r[0] for r in self._trial.get("rewards", [])]), - "hit": hit, - "false_alarm": false_alarm, - "miss": miss, - "sham_change": sham_change, - "stimulus_change": stimulus_change, - "aborted": aborted, - "go": go, - "catch": catch, - "auto_rewarded": auto_rewarded, - "correct_reject": correct_reject, - } - - @staticmethod - def _get_trial_timing( - event_dict: dict, - licks: List[float], go: bool, catch: bool, auto_rewarded: bool, - hit: bool, false_alarm: bool, aborted: bool, - timestamps: np.ndarray, - monitor_delay: float) -> Dict[str, Any]: - """ - Extract a dictionary of trial timing data. - See trial_data_from_log for a description of the trial types. - - Parameters - ========== - event_dict: dict - Dictionary of trial events in the well-known `pkl` file - licks: List[float] - list of lick timestamps, from the `get_licks` response for - the BehaviorOphysExperiment.api. - go: bool - True if "go" trial, False otherwise. Mutually exclusive with - `catch`. - catch: bool - True if "catch" trial, False otherwise. Mutually exclusive - with `go.` - auto_rewarded: bool - True if "auto_rewarded" trial, False otherwise. - hit: bool - True if "hit" trial, False otherwise - false_alarm: bool - True if "false_alarm" trial, False otherwise - aborted: bool - True if "aborted" trial, False otherwise - timestamps: np.ndarray[1d] - Array of ground truth timestamps for the session - (sync times, if available) - monitor_delay: float - The monitor delay in seconds associated with the session - - Returns - ======= - dict - start_time: float - The time the trial started (in seconds elapsed from - recording start) - stop_time: float - The time the trial ended (in seconds elapsed from - recording start) - trial_length: float - Duration of the trial in seconds - response_time: float - The response time, for non-aborted trials. This is equal - to the first lick in the trial. For aborted trials or trials - without licks, `response_time` is NaN. - change_frame: int - The frame number that the stimulus changed - change_time: float - The time in seconds that the stimulus changed - response_latency: float or None - The time in seconds between the stimulus change and the - animal's lick response, if the trial is a "go", "catch", or - "auto_rewarded" type. If the animal did not respond, - return `float("inf")`. In all other cases, return None. - - Notes - ===== - The following parameters are mutually exclusive (exactly one can - be true): - hit, miss, false_alarm, aborted, auto_rewarded - """ - assert not (aborted and (hit or false_alarm or auto_rewarded)), ( - "'aborted' trials cannot be 'hit', 'false_alarm', " - "or 'auto_rewarded'") - assert not (hit and false_alarm), ( - "both `hit` and `false_alarm` cannot be True, they are mutually " - "exclusive categories") - assert not (go and catch), ( - "both `go` and `catch` cannot be True, they are mutually " - "exclusive " - "categories") - assert not (go and auto_rewarded), ( - "both `go` and `auto_rewarded` cannot be True, they are mutually " - "exclusive categories") - - def _get_response_time(licks: List[float], aborted: bool) -> float: - """ - Return the time the first lick occurred in a non-"aborted" trial. - A response time is not returned for on an "aborted trial", since by - definition, the animal licked before the change stimulus. - """ - if aborted: - return float("nan") - if len(licks): - return licks[0] - else: - return float("nan") - - start_time = event_dict["trial_start", ""]['timestamp'] - stop_time = event_dict["trial_end", ""]['timestamp'] - - response_time = _get_response_time(licks, aborted) - - if go or auto_rewarded: - change_frame = event_dict.get(('stimulus_changed', ''))['frame'] - change_time = timestamps[change_frame] + monitor_delay - elif catch: - change_frame = event_dict.get(('sham_change', ''))['frame'] - change_time = timestamps[change_frame] + monitor_delay - else: - change_time = float("nan") - change_frame = float("nan") - - if not (go or catch or auto_rewarded): - response_latency = None - elif len(licks) > 0: - response_latency = licks[0] - change_time - else: - response_latency = float("inf") - - return { - "start_time": start_time, - "stop_time": stop_time, - "trial_length": stop_time - start_time, - "response_time": response_time, - "change_frame": change_frame, - "change_time": change_time, - "response_latency": response_latency, - } - - def _get_trial_image_names(self, stimuli) -> Dict[str, str]: - """ - Gets the name of the stimulus presented at the beginning of the - trial and - what is it changed to at the end of the trial. - Parameters - ---------- - stimuli: The stimuli presentation log for the behavior session - - Returns - ------- - A dictionary indicating the starting_stimulus and what the - stimulus is - changed to. - - """ - grating_oris = {'horizontal', 'vertical'} - trial_start_frame = self._trial["events"][0][3] - initial_image_category_name, _, initial_image_name = \ - self._resolve_initial_image( - stimuli, trial_start_frame) - if len(self._trial["stimulus_changes"]) == 0: - change_image_name = initial_image_name - else: - ((from_set, from_name), - (to_set, to_name), - _, _) = self._trial["stimulus_changes"][0] - - # do this to fix names if the stimuli is a grating - if from_set in grating_oris: - from_name = f'gratings_{from_name}' - if to_set in grating_oris: - to_name = f'gratings_{to_name}' - assert from_name == initial_image_name - change_image_name = to_name - - return { - "initial_image_name": initial_image_name, - "change_image_name": change_image_name - } - - @staticmethod - def _resolve_initial_image(stimuli, start_frame) -> Tuple[str, str, str]: - """Attempts to resolve the initial image for a given start_frame for - a trial - - Parameters - ---------- - stimuli: Mapping - foraging2 shape stimuli mapping - start_frame: int - start frame of the trial - - Returns - ------- - initial_image_category_name: str - stimulus category of initial image - initial_image_group: str - group name of the initial image - initial_image_name: str - name of the initial image - """ - max_frame = float("-inf") - initial_image_group = '' - initial_image_name = '' - initial_image_category_name = '' - - for stim_category_name, stim_dict in stimuli.items(): - for set_event in stim_dict["set_log"]: - set_frame = set_event[3] - if start_frame >= set_frame >= max_frame: - # hack assumes initial_image_group == initial_image_name, - # only initial_image_name is present for natual_scenes - initial_image_group = initial_image_name = set_event[1] - initial_image_category_name = stim_category_name - if initial_image_category_name == 'grating': - initial_image_name = f'gratings_{initial_image_name}' - max_frame = set_frame - - return initial_image_category_name, initial_image_group, \ - initial_image_name - - def _validate_trial_condition_exclusivity(self, tr_data: dict) -> None: - """ensure that only one of N possible mutually - exclusive trial conditions is True""" - trial_conditions = {} - for key in ['hit', - 'miss', - 'false_alarm', - 'correct_reject', - 'auto_rewarded', - 'aborted']: - trial_conditions[key] = tr_data[key] - - on = [] - for condition, value in trial_conditions.items(): - if value: - on.append(condition) - - if len(on) != 1: - all_conditions = list(trial_conditions.keys()) - msg = f"expected exactly 1 trial condition out of " \ - f"{all_conditions} " - msg += f"to be True, instead {on} were True (trial {self._index})" - raise AssertionError(msg) diff --git a/allensdk/brain_observatory/behavior/data_objects/trials/trial_table.py b/allensdk/brain_observatory/behavior/data_objects/trials/trial_table.py deleted file mode 100644 index 6650020bd7..0000000000 --- a/allensdk/brain_observatory/behavior/data_objects/trials/trial_table.py +++ /dev/null @@ -1,150 +0,0 @@ -from typing import List, Tuple - -import pandas as pd -from pynwb import NWBFile - -from allensdk.brain_observatory import dict_to_indexed_array -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import DataObject, \ - StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.base \ - .readable_interfaces import \ - StimulusFileReadableInterface, NwbReadableInterface -from allensdk.brain_observatory.behavior.data_objects.base\ - .writable_interfaces import \ - NwbWritableInterface -from allensdk.brain_observatory.behavior.data_objects.licks import Licks -from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards -from allensdk.brain_observatory.behavior.data_objects.trials.trial import Trial - - -class TrialTable(DataObject, StimulusFileReadableInterface, - NwbReadableInterface, NwbWritableInterface): - def __init__(self, trials: pd.DataFrame): - super().__init__(name='trials', value=trials) - - def to_nwb(self, nwbfile: NWBFile) -> NWBFile: - trials = self.value - order = list(trials.index) - for _, row in trials[['start_time', 'stop_time']].iterrows(): - row_dict = row.to_dict() - nwbfile.add_trial(**row_dict) - - for c in trials.columns: - if c in ['start_time', 'stop_time']: - continue - index, data = dict_to_indexed_array(trials[c].to_dict(), order) - if data.dtype == '<U1': # data type is composed of unicode - # characters - data = trials[c].tolist() - if not len(data) == len(order): - if len(data) == 0: - data = [''] - nwbfile.add_trial_column( - name=c, - description='NOT IMPLEMENTED: %s' % c, - data=data, - index=index) - else: - nwbfile.add_trial_column( - name=c, - description='NOT IMPLEMENTED: %s' % c, - data=data) - return nwbfile - - @classmethod - def from_nwb(cls, nwbfile: NWBFile) -> "TrialTable": - trials = nwbfile.trials.to_dataframe() - if 'lick_events' in trials.columns: - trials.drop('lick_events', inplace=True, axis=1) - trials.index = trials.index.rename('trials_id') - return TrialTable(trials=trials) - - @classmethod - def from_stimulus_file(cls, stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps, - licks: Licks, - rewards: Rewards, - monitor_delay: float - ) -> "TrialTable": - bsf = stimulus_file.data - - stimuli = bsf["items"]["behavior"]["stimuli"] - trial_log = bsf["items"]["behavior"]["trial_log"] - - trial_bounds = cls._get_trial_bounds(trial_log=trial_log) - - all_trial_data = [None] * len(trial_log) - - for idx, trial in enumerate(trial_log): - trial_start, trial_end = trial_bounds[idx] - t = Trial(trial=trial, start=trial_start, end=trial_end, - behavior_stimulus_file=stimulus_file, - index=idx, - monitor_delay=monitor_delay, - stimulus_timestamps=stimulus_timestamps, - licks=licks, rewards=rewards, - stimuli=stimuli - ) - all_trial_data[idx] = t.data - - trials = pd.DataFrame(all_trial_data).set_index('trial') - trials.index = trials.index.rename('trials_id') - - # Order/Filter columns - trials = trials[['initial_image_name', 'change_image_name', - 'stimulus_change', 'change_time', - 'go', 'catch', 'lick_times', 'response_time', - 'response_latency', 'reward_time', 'reward_volume', - 'hit', 'false_alarm', 'miss', 'correct_reject', - 'aborted', 'auto_rewarded', 'change_frame', - 'start_time', 'stop_time', 'trial_length']] - - return TrialTable(trials=trials) - - @staticmethod - def _get_trial_bounds(trial_log: List) -> List[Tuple[int, int]]: - """ - Adjust trial boundaries from a trial_log so that there is no dead time - between trials. - - Parameters - ---------- - trial_log: list - The trial_log read in from the well known behavior stimulus - pickle file - - Returns - ------- - list - Each element in the list is a tuple of the form - (start_frame, end_frame) so that the ith element - of the list gives the start and end frames of - the ith trial. The endframe of the last trial will - be -1, indicating that it should map to the last - timestamp in the session - """ - start_frames = [] - - for trial in trial_log: - start_f = None - for event in trial['events']: - if event[0] == 'trial_start': - start_f = event[-1] - break - if start_f is None: - msg = "Could not find a 'trial_start' event " - msg += "for all trials in the trial log\n" - msg += f"{trial}" - raise ValueError(msg) - - if len(start_frames) > 0 and start_f < start_frames[-1]: - msg = "'trial_start' frames in trial log " - msg += "are not in ascending order" - msg += f"\ntrial_log: {trial_log}" - raise ValueError(msg) - - start_frames.append(start_f) - - end_frames = [idx for idx in start_frames[1:] + [-1]] - return list([(s, e) for s, e in zip(start_frames, end_frames)]) diff --git a/allensdk/brain_observatory/behavior/dprime.py b/allensdk/brain_observatory/behavior/dprime.py deleted file mode 100644 index 9519cd703b..0000000000 --- a/allensdk/brain_observatory/behavior/dprime.py +++ /dev/null @@ -1,106 +0,0 @@ -import pandas as pd -import numpy as np -from scipy.stats import norm - -from allensdk import one - - -SLIDING_WINDOW = 100 - -def get_go_responses(hit=None, miss=None, aborted=None): - assert len(hit) == len(miss) == len(aborted) - not_aborted = np.logical_not(np.array(aborted, dtype=np.bool)) - hit = np.array(hit, dtype=np.bool)[not_aborted] - miss = np.array(miss, dtype=np.bool)[not_aborted] - - # Go responses are nan when catch (aborted are masked out); 0 for miss, 1 for hit - # This allows pd.Series.rolling to ignore non-go trial data - go_responses = np.empty_like(hit, dtype=np.float) - go_responses.fill(float('nan')) - go_responses[hit] = 1 - go_responses[miss] = 0 - return go_responses - - -def get_hit_rate(hit=None, miss=None, aborted=None, sliding_window=SLIDING_WINDOW): - go_responses = get_go_responses(hit=hit, miss=miss, aborted=aborted) - hit_rate = pd.Series(go_responses).rolling(window=sliding_window, min_periods=0).mean().values - return hit_rate - - -def get_trial_count_corrected_hit_rate(hit=None, miss=None, aborted=None, sliding_window=SLIDING_WINDOW): - go_responses = get_go_responses(hit=hit, miss=miss, aborted=aborted) - go_responses_count = pd.Series(go_responses).rolling(window=sliding_window, min_periods=0).count() - hit_rate = pd.Series(go_responses).rolling(window=sliding_window, min_periods=0).mean().values - trial_count_corrected_hit_rate = np.vectorize(trial_number_limit)(hit_rate, go_responses_count) - return trial_count_corrected_hit_rate - - -def get_catch_responses(correct_reject=None, false_alarm=None, aborted=None): - assert len(correct_reject) == len(false_alarm) == len(aborted) - not_aborted = np.logical_not(np.array(aborted, dtype=np.bool)) - correct_reject = np.array(correct_reject, dtype=np.bool)[not_aborted] - false_alarm = np.array(false_alarm, dtype=np.bool)[not_aborted] - - # Catch responses are nan when go (aborted are masked out); 0 for correct-rejection, 1 for false-alarm - # This allows pd.Series.rolling to ignore non-catch trial data - catch_responses = np.empty_like(correct_reject, dtype=np.float) - catch_responses.fill(float('nan')) - catch_responses[false_alarm] = 1 - catch_responses[correct_reject] = 0 - return catch_responses - - -def get_false_alarm_rate(correct_reject=None, false_alarm=None, aborted=None, sliding_window=SLIDING_WINDOW): - catch_responses = get_catch_responses(correct_reject=correct_reject, false_alarm=false_alarm, aborted=aborted) - false_alarm_rate = pd.Series(catch_responses).rolling(window=sliding_window, min_periods=0).mean().values - return false_alarm_rate - - -def get_trial_count_corrected_false_alarm_rate(correct_reject=None, false_alarm=None, aborted=None, sliding_window=SLIDING_WINDOW): - catch_responses = get_catch_responses(correct_reject=correct_reject, false_alarm=false_alarm, aborted=aborted) - catch_responses_count = pd.Series(catch_responses).rolling(window=sliding_window, min_periods=0).count() - false_alarm_rate = pd.Series(catch_responses).rolling(window=sliding_window, min_periods=0).mean().values - trial_count_corrected_false_alarm_rate = np.vectorize(trial_number_limit)(false_alarm_rate, catch_responses_count) - return trial_count_corrected_false_alarm_rate - - -def get_rolling_dprime(rolling_hit_rate, rolling_fa_rate, sliding_window=SLIDING_WINDOW): - return np.array([get_dprime(hr, far, sliding_window=SLIDING_WINDOW) for hr, far in zip(rolling_hit_rate, rolling_fa_rate)]) - - -def get_dprime(hit_rate, fa_rate, sliding_window=SLIDING_WINDOW): - """ calculates the d-prime for a given hit rate and false alarm rate - https://en.wikipedia.org/wiki/Sensitivity_index - Parameters - ---------- - hit_rate : float - rate of hits in the True class - fa_rate : float - rate of false alarms in the False class - limits : tuple, optional - limits on extreme values, which distort. default: (0.01,0.99) - Returns - ------- - d_prime - """ - - limits = (1/SLIDING_WINDOW, 1 - 1/SLIDING_WINDOW) - assert limits[0] > 0.0, 'limits[0] must be greater than 0.0' - assert limits[1] < 1.0, 'limits[1] must be less than 1.0' - Z = norm.ppf - - # Limit values in order to avoid d' infinity - hit_rate = np.clip(hit_rate, limits[0], limits[1]) - fa_rate = np.clip(fa_rate, limits[0], limits[1]) - d_prime = Z(pd.Series(hit_rate)) - Z(pd.Series(fa_rate)) - return one(d_prime) - - -def trial_number_limit(p, N): - if N == 0: - return np.nan - if not pd.isnull(p): - p = np.max((p, 1. / (2 * N))) - p = np.min((p, 1 - 1. / (2 * N))) - return p diff --git a/allensdk/brain_observatory/behavior/dprime_readme.md b/allensdk/brain_observatory/behavior/dprime_readme.md deleted file mode 100644 index 7bdb8378e0..0000000000 --- a/allensdk/brain_observatory/behavior/dprime_readme.md +++ /dev/null @@ -1,39 +0,0 @@ -# A brief description of the use of dprime as applied in the AllenSDK for quantifying performance - -## Motivation: -A common metric of sensitivity/discriminability in go/no-go experiment is d', which provides a measure the separation of the hit and false alarm rates. More specifically, the metric assumes that the observer is drawing from normally distributed signal and noise distributions with equal standard deviations. d' is thus defined as: - - d' = Z(hit rate) - Z(false alarm rate) - -where Z represents the inverse of the cumulative normal distribution. - -Both the hit rate and the false alarm rate are calculated using traditional signal detection theory framework, in which the hit rate is the probability of response given when the stimulus is present and the false alarm rate is the probability of response when the signal is absent. In a go/no-go task: - - hit rate = (number of responses on go trials)/(number of go trials) - false alarm rate = (number of responses on no-go trials)/(number of no-go trials) - -For a more in-depth discussion of d', see the "Understanding Yes-No Data" section in Chapter 1 of Macmillan and Creelman's "Detection Theory" text [1] (https://books.google.com/books/about/Detection_Theory.html?id=jrDHjTQ4_U4C) or the "Sensitivity Index" entry on Wikipedia (https://en.wikipedia.org/wiki/Sensitivity_index). - - -## Correction to avoid infinite values -An important point to note about d' is that the metric will be infinite with perfect performance, given that Z(0) = -infinity and Z(1) = infinity. Low trial counts exacerbate this issue. For example, with only one sample of a go-trial, the hit rate will either be 1 or 0. Macmillan and Creelman [1] offer a correction on the hit and false alarm rates to avoid infinite values whereby the response probabilities (P) are bounded by functions of trial count, N: - - 1/(2N) < P < 1 - 1/(2N) - -Thus, for the example of just a single trial, the trial-corrected hit rate would be 0.5. Or after only two trials, the hit rate could take on the values of 0.25, 0.5, or 0.75. - -## Application of these functions in the `behavior_ophys_session` API: - -The session object generated by the behavior_ophys_session API contains a method called `get_rolling_performance_df`. This method will calculate the hit rate, false alarm rate and d' over a rolling window (default size = 100 trials) and will return a dataframe with the following columns: - -| Variable Name |Definition -|:--- |:--- -| reward_rate | The number of rewards earned in the window, divided by the elapsed time over the window (units = rewards/minute). This metric can be a useful proxy of engagement (low reward rate = disengagement) -| hit_rate_raw | The uncorrected hit rate, calculated as the number of hits divided by the number of go-trials in the sliding window -| hit_rate | The hit rate after applying the trial count correction (to avoid extreme values) -| false_alarm_rate_raw | The uncorrected false alarm rate, calculated as the number of false alarms divided by the number of catch-trials in the sliding window -| false_alarm_rate | The false alarm rate after applying the trial count correction -| rolling_dprime | d' calculated using the trial-count-corrected hit and false alarm rates. Note that d' is undefined until there has been at least one go and catch trial. - - -[1] Macmillan, Neil A., and C. Douglas Creelman. Detection theory: A user's guide. Psychology press, 2004. diff --git a/allensdk/brain_observatory/behavior/event_detection.py b/allensdk/brain_observatory/behavior/event_detection.py deleted file mode 100644 index 9fd88b730b..0000000000 --- a/allensdk/brain_observatory/behavior/event_detection.py +++ /dev/null @@ -1,41 +0,0 @@ -import numpy as np -from scipy import stats - - -def filter_events_array(arr: np.ndarray, scale: float = 2, - n_time_steps: int = 20) -> np.ndarray: - """ - Convolve the trace array with a 1d causal half-gaussian filter - to smooth it for visualization - - Uses a halfnorm distribution as weights to the filter - - Modified from initial implementation by Nick Ponvert - - Parameters - ---------- - arr: np.ndarray - Trace matrix of dimension n traces x n frames - scale: float - std deviation of halfnorm distribution - n_time_steps: int - number of time steps to use for the convolution operation - - Returns - ---------- - np.ndarray: - Output of the convolution operation - """ - if len(arr.shape) == 1: - raise ValueError('Expected a 2d array but received a 1d array') - - if n_time_steps < 1: - raise ValueError(f'n_time_steps must be a minimum of 1 but received ' - f'{n_time_steps}') - - filt = stats.halfnorm(loc=0, scale=scale).pdf(np.arange(n_time_steps)) - filt = filt / np.sum(filt) # normalize filter - filtered_arr = np.zeros(arr.shape) - for i, trace in enumerate(arr): - filtered_arr[i] = np.convolve(arr[i], filt)[:len(arr[i])] - return filtered_arr diff --git a/allensdk/brain_observatory/behavior/eye_tracking_processing.py b/allensdk/brain_observatory/behavior/eye_tracking_processing.py deleted file mode 100644 index 7333487794..0000000000 --- a/allensdk/brain_observatory/behavior/eye_tracking_processing.py +++ /dev/null @@ -1,243 +0,0 @@ -from pathlib import Path - -import numpy as np -import pandas as pd - -from scipy import ndimage, stats - - -def load_eye_tracking_hdf(eye_tracking_file: Path) -> pd.DataFrame: - """Load a DeepLabCut hdf5 file containing eye tracking data into a - dataframe. - - Note: The eye tracking hdf5 file contains 3 separate dataframes. One for - corneal reflection (cr), eye, and pupil ellipse fits. This function - loads and returns this data as a single dataframe. - - Parameters - ---------- - eye_tracking_file : Path - Path to an hdf5 file produced by the DeepLabCut eye tracking pipeline. - The hdf5 file will contain the following keys: "cr", "eye", "pupil". - Each key has an associated dataframe with the following - columns: "center_x", "center_y", "height", "width", "phi". - - Returns - ------- - pd.DataFrame - A dataframe containing combined corneal reflection (cr), eyelid (eye), - and pupil data. Column names for each field will be renamed by - prepending the field name. (e.g. center_x -> eye_center_x) - """ - eye_tracking_fields = ["cr", "eye", "pupil"] - - eye_tracking_dfs = [] - for field_name in eye_tracking_fields: - field_data = pd.read_hdf(eye_tracking_file, key=field_name) - new_col_name_map = {col_name: f"{field_name}_{col_name}" - for col_name in field_data.columns} - field_data.rename(new_col_name_map, axis=1, inplace=True) - eye_tracking_dfs.append(field_data) - - eye_tracking_data = pd.concat(eye_tracking_dfs, axis=1) - eye_tracking_data.index.name = 'frame' - - # Values in the hdf5 may be complex (likely an artifact of the ellipse - # fitting process). Take only the real component. - eye_tracking_data = eye_tracking_data.apply(lambda x: np.real(x.to_numpy())) # noqa: E501 - - return eye_tracking_data.astype(float) - - -def determine_outliers(data_df: pd.DataFrame, - z_threshold: float) -> pd.Series: - """Given a dataframe and some z-score threshold return a pandas boolean - Series where each entry indicates whether a given row contains at least - one outlier (where outliers are calculated along columns). - - Parameters - ---------- - data_df : pd.DataFrame - A dataframe containing only columns where outlier detection is - desired. (e.g. "cr_area", "eye_area", "pupil_area") - z_threshold : float - z-score values higher than the z_threshold will be considered outliers. - - Returns - ------- - pd.Series - A pandas boolean Series whose length == len(data_df.index). - True denotes that a row in the data_df contains at least one outlier. - """ - - outliers = data_df.apply(stats.zscore, - nan_policy='omit').apply(np.abs) > z_threshold - return pd.Series(outliers.any(axis=1)) - - -def compute_circular_area(df_row: pd.Series) -> float: - """Calculate the area of the pupil as a circle using the max of the - height/width as radius. - - Note: This calculation assumes that the pupil is a perfect circle - and any eccentricity is a result of the angle at which the pupil is - being viewed. - - Parameters - ---------- - df_row : pd.Series - A row from an eye tracking dataframe containing only "pupil_width" - and "pupil_height". - - Returns - ------- - float - The circular area of the pupil in pixels^2. - """ - max_dim = max(df_row.iloc[0], df_row.iloc[1]) - return np.pi * max_dim * max_dim - - -def compute_elliptical_area(df_row: pd.Series) -> float: - """Calculate the area of corneal reflection (cr) or eye ellipse fits using - the ellipse formula. - - Parameters - ---------- - df_row : pd.Series - A row from an eye tracking dataframe containing either: - "cr_width", "cr_height" - or - "eye_width", "eye_height" - - Returns - ------- - float - The elliptical area of the eye or cr in pixels^2 - """ - return np.pi * df_row.iloc[0] * df_row.iloc[1] - - -def determine_likely_blinks(eye_areas: pd.Series, - pupil_areas: pd.Series, - outliers: pd.Series, - dilation_frames: int = 2) -> pd.Series: - """Determine eye tracking frames which contain likely blinks or outliers - - Parameters - ---------- - eye_areas : pd.Series - A pandas series of eye areas. - pupil_areas : pd.Series - A pandas series of pupil areas. - outliers : pd.Series - A pandas series containing bool values of outlier rows. - dilation_frames : int, optional - Determines the number of additional adjacent frames to mark as - 'likely_blink', by default 2. - - Returns - ------- - pd.Series - A pandas series of bool values that has the same length as the number - of eye tracking dataframe rows (frames). - """ - blinks = pd.isnull(eye_areas) | pd.isnull(pupil_areas) | outliers - if dilation_frames > 0: - likely_blinks = ndimage.binary_dilation(blinks, - iterations=dilation_frames) - else: - likely_blinks = blinks - return pd.Series(likely_blinks) - - -def process_eye_tracking_data(eye_data: pd.DataFrame, - frame_times: pd.Series, - z_threshold: float = 3.0, - dilation_frames: int = 2) -> pd.DataFrame: - """Processes and refines raw eye tracking data by adding additional - computed feature columns. - - Parameters - ---------- - eye_data : pd.DataFrame - A 'raw' eye tracking dataframe produced by load_eye_tracking_hdf() - frame_times : pd.Series - A series of frame times acquired from a behavior + ophy session - 'sync file'. - z_threshold : float - z-score values higher than the z_threshold will be considered outliers, - by default 3.0. - dilation_frames : int, optional - Determines the number of additional adjacent frames to mark as - 'likely_blink', by default 2. - - Returns - ------- - pd.DataFrame - A refined eye tracking dataframe that contains additional information - about frame times, eye areas, pupil areas, and frames with likely - blinks/outliers. - - Raises - ------ - RuntimeError - If the number of sync file frame times does not match the number of - eye tracking frames. - """ - - n_sync = len(frame_times) - n_eye_frames = len(eye_data.index) - - # If n_sync exceeds n_eye_frames by <= 15, - # just trim the excess sync pulses from the end - # of the timestamps array. - # - # This solution was discussed in - # https://github.com/AllenInstitute/AllenSDK/issues/1545 - - if n_sync > n_eye_frames and n_sync <= n_eye_frames+15: - frame_times = frame_times[:n_eye_frames] - n_sync = len(frame_times) - - if n_sync != n_eye_frames: - raise RuntimeError(f"Error! The number of sync file frame times " - f"({len(frame_times)}) does not match the " - f"number of eye tracking frames " - f"({len(eye_data.index)})!") - - cr_areas = (eye_data[["cr_width", "cr_height"]] - .apply(compute_elliptical_area, axis=1)) - eye_areas = (eye_data[["eye_width", "eye_height"]] - .apply(compute_elliptical_area, axis=1)) - pupil_areas = (eye_data[["pupil_width", "pupil_height"]] - .apply(compute_circular_area, axis=1)) - - # only use eye and pupil areas for outlier detection - area_df = pd.concat([eye_areas, pupil_areas], axis=1) - outliers = determine_outliers(area_df, z_threshold=z_threshold) - - likely_blinks = determine_likely_blinks(eye_areas, - pupil_areas, - outliers, - dilation_frames=dilation_frames) - - # remove outliers/likely blinks `pupil_area`, `cr_area`, `eye_area` - pupil_areas_raw = pupil_areas.copy() - cr_areas_raw = cr_areas.copy() - eye_areas_raw = eye_areas.copy() - - pupil_areas[likely_blinks] = np.nan - cr_areas[likely_blinks] = np.nan - eye_areas[likely_blinks] = np.nan - - eye_data.insert(0, "timestamps", frame_times) - eye_data.insert(1, "cr_area", cr_areas) - eye_data.insert(2, "eye_area", eye_areas) - eye_data.insert(3, "pupil_area", pupil_areas) - eye_data.insert(4, "likely_blink", likely_blinks) - eye_data.insert(5, "pupil_area_raw", pupil_areas_raw) - eye_data.insert(6, "cr_area_raw", cr_areas_raw) - eye_data.insert(7, "eye_area_raw", eye_areas_raw) - - return eye_data diff --git a/allensdk/brain_observatory/behavior/image_api.py b/allensdk/brain_observatory/behavior/image_api.py deleted file mode 100644 index 8418d1bcdf..0000000000 --- a/allensdk/brain_observatory/behavior/image_api.py +++ /dev/null @@ -1,45 +0,0 @@ -import SimpleITK as sitk -import numpy as np -from typing import NamedTuple - - -class Image(NamedTuple): - ''' Describes a 2D Image - - data : np.ndarray - Image data points - spacing : tuple - Spacing describes the physical size of each pixel - unit : str - Physical unit of the spacing (currently constrained to be isotropic) - ''' - - data: np.ndarray - spacing: tuple - unit: str = 'mm' - - def __eq__(self, other): - a = np.array_equal(self.data, other.data) - b = self.spacing == other.spacing - c = self.unit == other.unit - return a and b and c - - def __array__(self): - return np.array(self.data) - - -class ImageApi: - - @staticmethod - def serialize(data, spacing, unit): - img = sitk.GetImageFromArray(data) - img.SetSpacing(np.array(spacing, dtype=np.double)) - img.SetMetaData('unit', unit) - return img - - @staticmethod - def deserialize(img): - data = sitk.GetArrayFromImage(img) - spacing = img.GetSpacing() - unit = img.GetMetaData('unit') - return Image(data, spacing, unit) diff --git a/allensdk/brain_observatory/behavior/mtrain.py b/allensdk/brain_observatory/behavior/mtrain.py deleted file mode 100644 index 002e4bf8b1..0000000000 --- a/allensdk/brain_observatory/behavior/mtrain.py +++ /dev/null @@ -1,409 +0,0 @@ -from marshmallow import Schema, fields -from datetime import datetime, date -import numpy as np - - -def annotate_change_detect(trials): - """ adds `change` and `detect` columns to dataframe - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - inplace : bool, optional - modify `trials` in place. if False, returns a copy. default: True - - See Also - -------- - io.load_trials - """ - - trials['change'] = trials['trial_type'] == 'go' - trials['detect'] = trials['response'] == 1.0 - - return trials - - -def assign_session_id(trials): - """ adds a column with a unique ID for the session defined as - a combination of the mouse ID and startdatetime - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - inplace : bool, optional - modify `trials` in place. if False, returns a copy. default: True - - See Also - -------- - io.load_trials - """ - trials['session_id'] = (trials['mouse_id'] - + '_' - + trials['startdatetime'].map( - lambda x: x.isoformat())) - - return trials - - -def fix_change_time(trials): - """ forces `None` values in the `change_time` column to numpy NaN - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - inplace : bool, optional - modify `trials` in place. if False, returns a copy. default: True - - See Also - -------- - io.load_trials - """ - trials['change_time'] = trials['change_time'].map( - lambda x: np.nan if x is None else x) - - return trials - - -def explode_response_window(trials): - """ explodes the `response_window` column in lower & upper columns - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - inplace : bool, optional - modify `trials` in place. if False, returns a copy. default: True - - See Also - -------- - io.load_trials - """ - trials['response_window_lower'] = \ - trials['response_window'].map(lambda x: x[0]) - trials['response_window_upper'] = \ - trials['response_window'].map(lambda x: x[1]) - - return trials - - -def annotate_trials(trials): - """ performs multiple annotatations: - - - annotate_change_detect - - fix_change_time - - explode_response_window - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - inplace : bool, optional - modify `trials` in place. if False, returns a copy. default: True - - See Also - -------- - io.load_trials - """ - # build arrays for change detection - trials = annotate_change_detect(trials) - - # assign a session ID to each row - trials = assign_session_id(trials) - - # calculate reaction times - trials = fix_change_time(trials) - - # unwrap the response window - trials = explode_response_window(trials) - - return trials - - -class FriendlyDateTime(fields.DateTime): - def _deserialize(self, value, attr, data, **kwargs): - if isinstance(value, datetime): - return value - result = super(FriendlyDateTime, self)._deserialize(value, attr, data) - return result - - -class FriendlyDate(fields.Date): - def _deserialize(self, value, attr, data, **kwargs): - if isinstance(value, date): - return value - result = super(FriendlyDate, self)._deserialize(value, attr, data) - return result - - -class ExtendedTrialSchema(Schema): - """ - This schema describes the edf core trial structure - """ - - index = fields.Int( - description='Trial number in this session', - required=True, - ) - startframe = fields.Int( - description='frame when this trial starts', - required=True, - ) - starttime = fields.Float( - description='time in seconds when this trial starts', - required=True, - ) - endframe = fields.Int( - description='frame when this trial ends', - required=True, - ) - endtime = fields.Float( - description='time in seconds when this trial ends', - required=True, - ) - trial_length = fields.Float( - required=True, - ) - - # timing paramters - change_frame = fields.Float( - description='The stimulus frame when the change occured on this trial', - required=True, - allow_nan=True, - ) - scheduled_change_time = fields.Float( - description=("The time when the change was scheduled to occur " - "on this trial"), - required=True, - ) - change_time = fields.Float( - description='The time when the change occured on this trial', - required=True, - allow_nan=True, - ) - - # image parameters - initial_image_category = fields.String( - description='The category of the initial images on this trial', - required=True, - allow_none=True, - ) - initial_image_name = fields.String( - description=("The name of the last initial image before the " - "change on this trial"), - required=True, - allow_none=True, - ) - change_image_category = fields.String( - description='The category of the change images on this trial', - required=True, - allow_none=True, - ) - change_image_name = fields.String( - description='The name of the first change image on this trial', - required=True, - allow_none=True, - ) - - # oriented gratings paramters - initial_contrast = fields.Float( - description='The contrast of the initial orientation on this trial', - required=True, - allow_none=True, - ) - change_contrast = fields.Float( - description='The contrast of the change orientation on this trial', - required=True, - allow_none=True, - ) - initial_ori = fields.Float( - description='The orientation of the initial orientation on this trial', - required=True, - allow_none=True, - ) - change_ori = fields.Float( - description='The orientation of the change orientation on this trial', - required=True, - allow_none=True, - allow_nan=True, - ) - delta_ori = fields.Float( - description=("The difference between the initial and change " - "orientations on this trial"), - required=True, - allow_none=True, - ) - - # licks - lick_times = fields.List( - fields.Float, - description='times of licks on this trial', - required=True, - ) - response_latency = fields.Float( - description=("The latency between the change and the first lick " - "on this trial"), - required=True, - allow_nan=True, - ) - response_time = fields.List( - fields.Float, - description='need to check this with Doug', - required=True, - ) - reward_frames = fields.List( - fields.Int, - required=True, - ) - reward_times = fields.List( - fields.Float, - required=True, - ) - reward_volume = fields.Float( - required=True, - ) - rewarded = fields.Bool( - required=True, - ) - - auto_rewarded = fields.Bool( - description='whether this trial was an auto_rewarded trial', - required=True, - allow_none=True, - ) - cumulative_reward_number = fields.Int( - description=("the cumulative number of rewards in the session at " - "trial end"), - required=True, - ) - cumulative_volume = fields.Float( - description='the total volume of rewards in the session at trial end', - required=True, - ) - - # optogenetics - optogenetics = fields.Bool( - description=("whether optogenetic stimulation was applied " - "on this trial"), - required=True, - ) - - blank_duration_range = fields.List( - fields.Float, - required=True, - ) - blank_screen_timeout = fields.Bool( - required=True, - ) - color = fields.String( - required=True, - ) - computer_name = fields.String( - required=True, - ) - distribution_mean = fields.Float( - required=True, - ) - LDT_mode = fields.String( - required=True, - ) - lick_frames = fields.List( - fields.Integer(strict=True), - required=True, - ) - mouse_id = fields.String( - required=True, - ) - number_of_rewards = fields.Integer( - required=True, - strict=True, - ) - prechange_minimum = fields.Float( - required=True, - ) - response = fields.Float( - required=True, - ) - response_type = fields.String( - required=True, - ) - response_window = fields.List( - fields.Float, - required=True, - ) - reward_licks = fields.List( - fields.Float, - required=True, - allow_none=True, - ) - reward_lick_count = fields.Integer( - required=True, - # strict=True, - allow_none=True, - ) - reward_lick_latency = fields.Float( - allow_none=True, - allow_nan=True, - ) - reward_rate = fields.Float( - allow_none=True, - allow_nan=True, - ) - rig_id = fields.String( - required=True, - ) - session_duration = fields.Float( - required=True, - ) - stage = fields.String( - required=True, - ) - stim_duration = fields.Float( - required=True, - ) - stimulus = fields.String( - required=True, - ) - stimulus_distribution = fields.String( - required=True, - ) - task = fields.String( - required=True, - ) - trial_type = fields.String( - required=True, - ) - user_id = fields.String( - required=True, - ) - startdatetime = FriendlyDateTime( - required=True, - strict=True, - ) - date = FriendlyDate( - required=True, - ) - year = fields.Integer( - strict=True - ) - month = fields.Integer( - required=True, - strict=True, - ) - day = fields.Integer( - required=True, - strict=True, - ) - hour = fields.Integer( - required=True, - strict=True, - ) - dayofweek = fields.Integer( - strict=True, - required=True, - ) - behavior_session_uuid = fields.UUID( - required=True, - ) diff --git a/allensdk/brain_observatory/behavior/rewards_processing.py b/allensdk/brain_observatory/behavior/rewards_processing.py deleted file mode 100644 index 81b66bb9dc..0000000000 --- a/allensdk/brain_observatory/behavior/rewards_processing.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Dict -import numpy as np -import pandas as pd - - -def get_rewards(data: Dict, - timestamps: np.ndarray) -> pd.DataFrame: - """ - Construct and return a pandas DataFrame containing reward data for this - session - - Parameters - --------- - data: Dict - The dict that results from reading the stimulus pickle file - associated with the session - - timestamps: np.ndarray[1d] - A numpy array of timestamps associated with the stimulus - frames in this session. timestamps[ii] is the clock time - of the iith frame. - - Returns - ------- - pd.DataFrame - containing the data associated with rewards given in this - session - - """ - trial_df = pd.DataFrame(data["items"]["behavior"]["trial_log"]) - rewards_dict = {"volume": [], "timestamps": [], "autorewarded": []} - for idx, trial in trial_df.iterrows(): - rewards = trial["rewards"] - # as i write this there can only ever be one reward per trial - if rewards: - rewards_dict["volume"].append(rewards[0][0]) - rewards_dict["timestamps"].append(timestamps[rewards[0][2]]) - auto_rwrd = trial["trial_params"]["auto_reward"] - rewards_dict["autorewarded"].append(auto_rwrd) - - df = pd.DataFrame(rewards_dict) - - return df diff --git a/allensdk/brain_observatory/behavior/schemas.py b/allensdk/brain_observatory/behavior/schemas.py deleted file mode 100644 index 80e064191e..0000000000 --- a/allensdk/brain_observatory/behavior/schemas.py +++ /dev/null @@ -1,309 +0,0 @@ -from marshmallow import Schema, fields, RAISE -import numpy as np - - -STYPE_DICT = {fields.Float: 'float', fields.Int: 'int', - fields.String: 'text', fields.List: 'text', - fields.DateTime: 'text', fields.UUID: 'text'} -TYPE_DICT = {fields.Float: float, fields.Int: int, fields.String: str, - fields.List: np.ndarray, fields.DateTime: str, fields.UUID: str} - - -class RaisingSchema(Schema): - class Meta: - unknown = RAISE - - -class SubjectMetadataSchema(RaisingSchema): - """This schema contains metadata pertaining to a subject in either a - behavior or behavior + ophys experiment. - """ - - neurodata_type = 'BehaviorSubject' - neurodata_type_inc = 'Subject' - neurodata_doc = "Metadata for an AIBS behavior or behavior + ophys subject" - # Fields to skip converting to extension - # In this case they already exist in the 'Subject' builtin pyNWB class - neurodata_skip = {"age_in_days", "genotype", "sex", "subject_id"} - - age_in_days = fields.String( - doc='Age of the specimen donor/subject (in days)', - required=True, - ) - driver_line = fields.List( - fields.String, - doc="Driver line of subject", - required=True, - shape=(None,), - ) - # 'full_genotype' will be stored in pynwb Subject 'genotype' attr - genotype = fields.String( - doc='full genotype of subject', - required=True, - ) - # 'mouse_id' will be stored in pynwb Subject 'subject_id' attr - subject_id = fields.Int( - doc='Mouse ID of subject', - required=True, - ) - reporter_line = fields.String( - doc="Reporter line of subject", - required=True, - ) - sex = fields.String( - doc='Sex of the specimen donor/subject', - required=True, - ) - - -class BehaviorMetadataSchema(RaisingSchema): - """This schema contains metadata pertaining to behavior. - """ - neurodata_type = 'BehaviorMetadata' - neurodata_type_inc = 'LabMetaData' - neurodata_doc = "Metadata for behavior and behavior + ophys experiments" - neurodata_skip = {"date_of_acquisition"} - - behavior_session_id = fields.Int( - doc='The unique ID for the behavior session', - required=True - ) - behavior_session_uuid = fields.UUID( - doc='MTrain record for session, also called foraging_id', - required=True, - ) - stimulus_frame_rate = fields.Float( - doc=('Frame rate (frames/second) of the ' - 'visual_stimulus from the monitor'), - required=True, - ) - session_type = fields.String( - doc='Experimental session description', - allow_none=True, - required=True, - ) - # 'date_of_acquisition' will be stored in - # pynwb NWBFile 'session_start_time' attr - date_of_acquisition = fields.DateTime( - doc='Date of the experiment (UTC, as string)', - required=True, - ) - equipment_name = fields.String( - doc='Name of behavior or optical physiology experiment rig', - required=True, - ) - - -class NwbOphysMetadataSchema(RaisingSchema): - """This schema contains fields that will be stored in pyNWB base classes - pertaining to optical physiology.""" - # 'emission_lambda' will be stored in - # pyNWB OpticalChannel 'emission_lambda' attr - emission_lambda = fields.Float( - doc='Emission lambda of fluorescent indicator', - required=True, - ) - # 'excitation_lambda' will be stored in the pyNWB ImagingPlane - # 'excitation_lambda' attr - excitation_lambda = fields.Float( - doc='Excitation lambda of fluorescent indicator', - required=True, - ) - # 'indicator' will be stored in the pyNWB ImagingPlane 'indicator' attr - indicator = fields.String( - doc='Name of optical physiology fluorescent indicator', - required=True, - ) - # 'targeted_structure' will be stored in the pyNWB - # ImagingPlane 'location' attr - targeted_structure = fields.String( - doc='Anatomical structure targeted for two-photon acquisition', - required=True, - ) - # 'ophys_frame_rate' will be stored in the pyNWB ImagingPlane - # 'imaging_rate' attr - ophys_frame_rate = fields.Float( - doc='Frame rate (frames/second) of the two-photon microscope', - required=True, - ) - - -class OphysMetadataSchema(NwbOphysMetadataSchema): - """This schema contains metadata pertaining to optical physiology (ophys). - """ - ophys_experiment_id = fields.Int( - doc='Unique ID for the ophys experiment (aka imaging plane)', - required=True - ) - ophys_session_id = fields.Int( - doc='Unique ID for the ophys session', - required=True - ) - experiment_container_id = fields.Int( - doc='Container ID for the container that contains this ophys session', - required=True, - ) - imaging_depth = fields.Int( - doc=('Depth (microns) below the cortical surface ' - 'targeted for two-photon acquisition'), - required=True, - ) - field_of_view_width = fields.Int( - doc='Width of optical physiology imaging plane in pixels', - required=True, - ) - field_of_view_height = fields.Int( - doc='Height of optical physiology imaging plane in pixels', - required=True, - ) - imaging_plane_group = fields.Int( - doc=('A numeric index which indicates the order that an imaging plane ' - 'was acquired for a mesoscope experiment. Will be -1 for ' - 'non-mesoscope data'), - required=True - ) - imaging_plane_group_count = fields.Int( - doc=('The total number of plane groups collected in a session ' - 'for a mesoscope experiment. Will be 0 if the scope did not ' - 'capture multiple concurrent imaging planes.'), - required=True - ) - - -class OphysBehaviorMetadataSchema(BehaviorMetadataSchema, OphysMetadataSchema): - """ This schema contains fields pertaining to ophys+behavior. It is used - as a template for generating our custom NWB behavior + ophys extension. - """ - - neurodata_type = 'OphysBehaviorMetadata' - neurodata_type_inc = 'BehaviorMetadata' - neurodata_doc = "Metadata for behavior + ophys experiments" - # Fields to skip converting to extension - # They already exist as attributes for the following pyNWB classes: - # OpticalChannel, ImagingPlane, NWBFile - neurodata_skip = {"emission_lambda", "excitation_lambda", "indicator", - "targeted_structure", "date_of_acquisition", - "ophys_frame_rate"} - - -class CompleteOphysBehaviorMetadataSchema(OphysBehaviorMetadataSchema, - SubjectMetadataSchema): - """This schema combines fields from behavior, ophys, and subject schemas. - Metadata info is passed by the behavior+ophys session in a combined lump - containing all the field types. - """ - pass - - -class BehaviorTaskParametersSchema(RaisingSchema): - """This schema encompasses task parameters used for behavior or - ophys + behavior. - """ - neurodata_type = 'BehaviorTaskParameters' - neurodata_type_inc = 'LabMetaData' - neurodata_doc = "Metadata for behavior or behavior + ophys task parameters" - - blank_duration_sec = fields.List( - fields.Float, - doc=('The lower and upper bound (in seconds) for a randomly chosen ' - 'inter-stimulus interval duration for a trial'), - required=True, - shape=(2,), - ) - stimulus_duration_sec = fields.Float( - doc='Duration of each stimulus presentation in seconds', - required=True, - allow_nan=True - ) - omitted_flash_fraction = fields.Float( - doc='Fraction of flashes/image presentations that were omitted', - required=True, - allow_nan=True, - ) - response_window_sec = fields.List( - fields.Float, - doc=('The lower and upper bound (in seconds) for a randomly chosen ' - 'time window where subject response influences trial outcome'), - required=True, - shape=(2,), - ) - reward_volume = fields.Float( - doc='Volume of water (in mL) delivered as reward', - required=True, - ) - auto_reward_volume = fields.Float( - doc='Volume of water (in mL) delivered as an automatic reward', - required=True, - ) - session_type = fields.String( - doc='Stage of behavioral task', - required=True, - ) - stimulus = fields.String( - doc='Stimulus type', - required=True, - ) - stimulus_distribution = fields.String( - doc=("Distribution type of drawing change times " - "(e.g. 'geometric', 'exponential')"), - required=True, - ) - task = fields.String( - doc='The name of the behavioral task', - required=True, - ) - n_stimulus_frames = fields.Int( - doc='Total number of stimuli frames', - required=True, - ) - - -class EyeTrackingRigGeometry(RaisingSchema): - """Eye tracking rig geometry""" - values = fields.Float( - doc='position/rotation with respect to (x, y, z)', - required=True, - shape=(3,) - ) - unit_of_measurement = fields.Str( - doc='Unit of measurement for the data', - required=True - ) - - -class OphysEyeTrackingRigMetadataSchema(RaisingSchema): - """This schema encompasses metadata for ophys experiment rig - """ - neurodata_type = 'OphysEyeTrackingRigMetadata' - neurodata_type_inc = 'NWBDataInterface' - neurodata_doc = "Metadata for ophys experiment rig" - - equipment = fields.Str( - doc='Description of rig', - required=True - ) - monitor_position = fields.Nested( - EyeTrackingRigGeometry, - doc='position of monitor (x, y, z)', - required=True - ) - camera_position = fields.Nested( - EyeTrackingRigGeometry, - doc='position of camera (x, y, z)', - required=True - ) - led_position = fields.Nested( - EyeTrackingRigGeometry, - doc='position of LED (x, y, z)', - required=True - ) - monitor_rotation = fields.Nested( - EyeTrackingRigGeometry, - doc='rotation of monitor (x, y, z)', - required=True - ) - camera_rotation = fields.Nested( - EyeTrackingRigGeometry, - doc='rotation of camera (x, y, z)', - required=True - ) diff --git a/allensdk/brain_observatory/behavior/session_metrics.py b/allensdk/brain_observatory/behavior/session_metrics.py deleted file mode 100644 index d9f523b954..0000000000 --- a/allensdk/brain_observatory/behavior/session_metrics.py +++ /dev/null @@ -1,37 +0,0 @@ -import numpy as np -from allensdk.brain_observatory.behavior import trial_masks as masks - -def response_bias(trials, detect_col, trial_types=("go", "catch")): - """ - Calculate the response bias for a subset of trial types from a behavioral - training dataframe. - Args: - trials (pandas.DataFrame): Dataframe containing trial-level information - from a behavioral training session. Required columns: - "trial_type", `detect_col`. - detect_col (str): Name of column containing boolean - or numeric codings (0/1) for whether or not the mouse had a - response. - trial_types (iterable<str>): Iterable containing string trial types - to check for the response bias. Trials of types not included in this - iterable will be ignored. Default=("go", "catch") - Return: - The response bias (or average value of the `detect_col`) - for trials in `trial_types`. - """ - mask = masks.trial_types(trials, trial_types) - return trials[mask][detect_col].mean() - - -def num_contingent_trials(session_trials): - """ - Returns the number of "go" and "catch" trials in a training session - dataframe. - Args: - session_trials (pandas.DataFrame): a pandas.DataFrame describing - behavior training trials, with the string column "trial_type" - describing the type of trial. - Returns (int): Number of "go" and "catch" trials - """ - return session_trials["trial_type"].isin(["go", "catch"]).sum() - diff --git a/allensdk/brain_observatory/behavior/stimulus_processing.py b/allensdk/brain_observatory/behavior/stimulus_processing.py deleted file mode 100644 index a95b048656..0000000000 --- a/allensdk/brain_observatory/behavior/stimulus_processing.py +++ /dev/null @@ -1,540 +0,0 @@ -import pickle -import warnings -from typing import Dict, List, Tuple, Union, Optional - -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.behavior.data_objects.stimuli\ - .stimulus_templates import \ - StimulusTemplate, StimulusTemplateFactory -from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ - convert_filepath_caseinsensitive, get_image_set_name - - -def load_pickle(pstream): - return pickle.load(pstream, encoding="bytes") - - -def get_stimulus_presentations(data, stimulus_timestamps) -> pd.DataFrame: - """ - This function retrieves the stimulus presentation dataframe and - renames the columns, adds a stop_time column, and set's index to - stimulus_presentation_id before sorting and returning the dataframe. - :param data: stimulus file associated with experiment id - :param stimulus_timestamps: timestamps indicating when stimuli switched - during experiment - :return: stimulus_table: dataframe containing the stimuli metadata as well - as what stimuli was presented - """ - stimulus_table = get_visual_stimuli_df(data, stimulus_timestamps) - # workaround to rename columns to harmonize with visual - # coding and rebase timestamps to sync time - stimulus_table.insert(loc=0, column='flash_number', - value=np.arange(0, len(stimulus_table))) - stimulus_table = stimulus_table.rename( - columns={'frame': 'start_frame', - 'time': 'start_time', - 'flash_number': 'stimulus_presentations_id'}) - stimulus_table.start_time = [stimulus_timestamps[int(start_frame)] - for start_frame in - stimulus_table.start_frame.values] - end_time = [] - for end_frame in stimulus_table.end_frame.values: - if not np.isnan(end_frame): - end_time.append(stimulus_timestamps[int(end_frame)]) - else: - end_time.append(float('nan')) - - stimulus_table.insert(loc=4, column='stop_time', value=end_time) - stimulus_table.set_index('stimulus_presentations_id', inplace=True) - stimulus_table = stimulus_table[sorted(stimulus_table.columns)] - return stimulus_table - - -def get_images_dict(pkl) -> Dict: - """ - Gets the dictionary of images that were presented during an experiment - along with image set metadata and the image specific metadata. This - function uses the path to the image pkl file to read the images and their - metadata from the pkl file and return this dictionary. - Parameters - ---------- - pkl: The pkl file containing the data for the stimuli presented during - experiment - - Returns - ------- - Dict: - A dictionary containing keys images, metadata, and image_attributes. - These correspond to paths to image arrays presented, metadata - on the whole set of images, and metadata on specific images, - respectively. - - """ - # Sometimes the source is a zipped pickle: - pkl_stimuli = pkl["items"]["behavior"]["stimuli"] - metadata = {'image_set': pkl_stimuli["images"]["image_path"]} - - # Get image file name; - # These are encoded case-insensitive in the pickle file :/ - filename = convert_filepath_caseinsensitive(metadata['image_set']) - - image_set = load_pickle(open(filename, 'rb')) - images = [] - images_meta = [] - - ii = 0 - for cat, cat_images in image_set.items(): - for img_name, img in cat_images.items(): - meta = dict( - image_category=cat.decode("utf-8"), - image_name=img_name.decode("utf-8"), - orientation=np.NaN, - phase=np.NaN, - spatial_frequency=np.NaN, - image_index=ii, - ) - - images.append(img) - images_meta.append(meta) - - ii += 1 - - images_dict = dict( - metadata=metadata, - images=images, - image_attributes=images_meta, - ) - - return images_dict - - -def get_gratings_metadata(stimuli: Dict, start_idx: int = 0) -> pd.DataFrame: - """ - This function returns the metadata for each unique grating that was - presented during the experiment. If no gratings were displayed during - this experiment it returns an empty dataframe with the expected columns. - Parameters - ---------- - stimuli: - The stimuli field (pkl['items']['behavior']['stimuli']) loaded - from the experiment pkl file. - start_idx: - The index to start index column - - Returns - ------- - pd.DataFrame: - DataFrame containing the unique stimuli presented during an - experiment. The columns contained in this DataFrame are - 'image_category', 'image_name', 'image_set', 'phase', - 'spatial_frequency', 'orientation', and 'image_index'. - This returns empty if no gratings were presented. - - """ - if 'grating' in stimuli: - phase = stimuli['grating']['phase'] - correct_freq = stimuli['grating']['sf'] - set_logs = stimuli['grating']['set_log'] - unique_oris = set([set_log[1] for set_log in set_logs]) - - image_names = [] - - for unique_ori in unique_oris: - image_names.append(f"gratings_{float(unique_ori)}") - - grating_dict = { - 'image_category': ['grating'] * len(unique_oris), - 'image_name': image_names, - 'orientation': list(unique_oris), - 'image_set': ['grating'] * len(unique_oris), - 'phase': [phase] * len(unique_oris), - 'spatial_frequency': [correct_freq] * len(unique_oris), - 'image_index': range(start_idx, start_idx + len(unique_oris), 1) - } - grating_df = pd.DataFrame.from_dict(grating_dict) - else: - grating_df = pd.DataFrame(columns=['image_category', - 'image_name', - 'image_set', - 'phase', - 'spatial_frequency', - 'orientation', - 'image_index']) - return grating_df - - -def get_stimulus_templates( - pkl: dict, grating_images_dict: Optional[dict] = None, - limit_to_images: Optional[List] = None) -> Optional[StimulusTemplate]: - """ - Gets images presented during experiments from the behavior stimulus file - (*.pkl) - - Parameters - ---------- - pkl : dict - Loaded pkl dict containing data for the presented stimuli. - grating_images_dict : Optional[dict] - Because behavior pkl files do not contain image versions of grating - stimuli, they must be obtained from an external source. The - grating_images_dict is a nested dictionary where top level keys - correspond to grating image names (e.g. 'gratings_0.0', - 'gratings_270.0') as they would appear in table returned by - get_gratings_metadata(). Sub-nested dicts are expected to have 'warped' - and 'unwarped' keys where values are numpy image arrays - of aforementioned warped or unwarped grating stimuli. - limit_to_images: Optional[list] - Only return images given by these image names - - Returns - ------- - StimulusTemplate: - StimulusTemplate object containing images that were presented during - the experiment - - """ - - pkl_stimuli = pkl['items']['behavior']['stimuli'] - if 'images' in pkl_stimuli: - images = get_images_dict(pkl) - image_set_filepath = images['metadata']['image_set'] - image_set_name = get_image_set_name(image_set_path=image_set_filepath) - image_set_name = convert_filepath_caseinsensitive( - image_set_name) - - attrs = images['image_attributes'] - image_values = images['images'] - if limit_to_images is not None: - keep_idxs = [ - i for i in range(len(images)) if - attrs[i]['image_name'] in limit_to_images] - attrs = [attrs[i] for i in keep_idxs] - image_values = [image_values[i] for i in keep_idxs] - - return StimulusTemplateFactory.from_unprocessed( - image_set_name=image_set_name, - image_attributes=attrs, - images=image_values - ) - elif 'grating' in pkl_stimuli: - if (grating_images_dict is None) or (not grating_images_dict): - raise RuntimeError("The 'grating_images_dict' param MUST " - "be provided to get stimulus templates " - "because this pkl data contains " - "gratings presentations.") - gratings_metadata = get_gratings_metadata( - pkl_stimuli).to_dict(orient='records') - - unwarped_images = [] - warped_images = [] - for image_attrs in gratings_metadata: - image_name = image_attrs['image_name'] - grating_imgs_sub_dict = grating_images_dict[image_name] - unwarped_images.append(grating_imgs_sub_dict['unwarped']) - warped_images.append(grating_imgs_sub_dict['warped']) - - return StimulusTemplateFactory.from_processed( - image_set_name='grating', - image_attributes=gratings_metadata, - unwarped=unwarped_images, - warped=warped_images - ) - else: - warnings.warn( - "Could not determine stimulus template images from pkl file. " - f"The pkl stimuli nested dict " - "(pkl['items']['behavior']['stimuli']) contained neither " - "'images' nor 'grating' but instead: " - f"'{pkl_stimuli.keys()}'" - ) - return None - - -def get_stimulus_metadata(pkl) -> pd.DataFrame: - """ - Gets the stimulus metadata for each type of stimulus presented during - the experiment. The metadata is return for gratings, images, and omitted - stimuli. - Parameters - ---------- - pkl: the pkl file containing the information about what stimuli were - presented during the experiment - - Returns - ------- - pd.DataFrame: - The dataframe containing a row for every stimulus that was presented - during the experiment. The row contains the following data, - image_category, image_name, image_set, phase, spatial_frequency, - orientation, and image index. - - """ - stimuli = pkl['items']['behavior']['stimuli'] - if 'images' in stimuli: - images = get_images_dict(pkl) - stimulus_index_df = pd.DataFrame(images['image_attributes']) - image_set_filename = convert_filepath_caseinsensitive( - images['metadata']['image_set']) - stimulus_index_df['image_set'] = get_image_set_name( - image_set_path=image_set_filename) - else: - stimulus_index_df = pd.DataFrame(columns=[ - 'image_name', 'image_category', 'image_set', 'phase', - 'spatial_frequency', 'image_index']) - - # get the grating metadata will be empty if gratings are absent - grating_df = get_gratings_metadata(stimuli, - start_idx=len(stimulus_index_df)) - stimulus_index_df = stimulus_index_df.append(grating_df, - ignore_index=True, - sort=False) - - # Add an entry for omitted stimuli - omitted_df = pd.DataFrame({'image_category': ['omitted'], - 'image_name': ['omitted'], - 'image_set': ['omitted'], - 'orientation': np.NaN, - 'phase': np.NaN, - 'spatial_frequency': np.NaN, - 'image_index': len(stimulus_index_df)}) - stimulus_index_df = stimulus_index_df.append(omitted_df, ignore_index=True, - sort=False) - stimulus_index_df.set_index(['image_index'], inplace=True, drop=True) - return stimulus_index_df - - -def _resolve_image_category(change_log, frame): - for change in (unpack_change_log(c) for c in change_log): - if frame < change['frame']: - return change['from_category'] - - return change['to_category'] - - -def _get_stimulus_epoch(set_log: List[Tuple[str, Union[str, int], int, int]], - current_set_index: int, start_frame: int, - n_frames: int) -> Tuple[int, int]: - """ - Gets the frame range for which a stimuli was presented and the transition - to the next stimuli was ongoing. Returns this in the form of a tuple. - Parameters - ---------- - set_log: List[Tuple[str, Union[str, int], int, int - The List of Tuples in the form of - (stimuli_type ('Image' or 'Grating'), - stimuli_descriptor (image_name or orientation of grating in degrees), - nonsynced_time_of_display (not sure, it's never used), - display_frame (frame that stimuli was displayed)) - current_set_index: int - Index of stimuli set to calculate window - start_frame: int - frame where stimuli was set, set_log[current_set_index][3] - n_frames: int - number of frames for which stimuli were displayed - - Returns - ------- - Tuple[int, int]: - A tuple where index 0 is start frame of stimulus window and index 1 is - end frame of stimulus window - - """ - try: - next_set_event = set_log[current_set_index + 1] - except IndexError: # assume this is the last set event - next_set_event = (None, None, None, n_frames,) - - return start_frame, next_set_event[3] # end frame isn't inclusive - - -def _get_draw_epochs(draw_log: List[int], start_frame: int, - stop_frame: int) -> List[Tuple[int, int]]: - """ - Gets the frame numbers of the active frames within a stimulus window. - Stimulus epochs come in the form [0, 0, 1, 1, 0, 0] where the stimulus is - active for some amount of time in the window indicated by int 1 at that - frame. This function returns the ranges for which the set_log is 1 within - the draw_log window. - Parameters - ---------- - draw_log: List[int] - A list of ints indicating for what frames stimuli were active - start_frame: int - The start frame to search within the draw_log for active values - stop_frame: int - The end frame to search within the draw_log for active values - - Returns - ------- - List[Tuple[int, int]] - A list of tuples indicating the start and end frames of every - contiguous set of active values within the specified window - of the draw log. - """ - draw_epochs = [] - current_frame = start_frame - - while current_frame <= stop_frame: - epoch_length = 0 - while current_frame < stop_frame and draw_log[current_frame] == 1: - epoch_length += 1 - current_frame += 1 - else: - current_frame += 1 - - if epoch_length: - draw_epochs.append( - (current_frame - epoch_length - 1, current_frame - 1,) - ) - - return draw_epochs - - -def unpack_change_log(change): - (from_category, from_name), (to_category, to_name,), time, frame = change - - return dict( - frame=frame, - time=time, - from_category=from_category, - to_category=to_category, - from_name=from_name, - to_name=to_name, - ) - - -def get_visual_stimuli_df(data, time) -> pd.DataFrame: - """ - This function loads the stimuli and the omitted stimuli into a dataframe. - These stimuli are loaded from the input data, where the set_log and - draw_log contained within are used to calculate the epochs. These epochs - are used as start_frame and end_frame and converted to times by input - stimulus timestamps. The omitted stimuli do not have a end_frame by design - though there duration is always 250ms. - :param data: the behavior data file - :param time: the stimulus timestamps indicating when each stimuli is - displayed - :return: df: a pandas dataframe containing the stimuli and omitted stimuli - that were displayed with their frame, end_frame, start_time, - and duration - """ - - stimuli = data['items']['behavior']['stimuli'] - n_frames = len(time) - visual_stimuli_data = [] - for stimuli_group_name, stim_dict in stimuli.items(): - for idx, (attr_name, attr_value, _time, frame,) in \ - enumerate(stim_dict["set_log"]): - orientation = attr_value if attr_name.lower() == "ori" else np.nan - image_name = attr_value if attr_name.lower() == "image" else np.nan - - stimulus_epoch = _get_stimulus_epoch( - stim_dict["set_log"], - idx, - frame, - n_frames, - ) - draw_epochs = _get_draw_epochs( - stim_dict["draw_log"], - *stimulus_epoch - ) - - for idx, (epoch_start, epoch_end,) in enumerate(draw_epochs): - # visual stimulus doesn't actually change until start of - # following frame, so we need to bump the - # epoch_start & epoch_end to get the timing right - epoch_start += 1 - epoch_end += 1 - - visual_stimuli_data.append({ - "orientation": orientation, - "image_name": image_name, - "frame": epoch_start, - "end_frame": epoch_end, - "time": time[epoch_start], - "duration": time[epoch_end] - time[epoch_start], - # this will always work because an epoch - # will never occur near the end of time - "omitted": False, - }) - - visual_stimuli_df = pd.DataFrame(data=visual_stimuli_data) - - # Add omitted flash info: - try: - omitted_flash_frame_log = \ - data['items']['behavior']['omitted_flash_frame_log'] - except KeyError: - # For sessions for which there were no omitted flashes - omitted_flash_frame_log = dict() - - omitted_flash_list = [] - for _, omitted_flash_frames in omitted_flash_frame_log.items(): - stim_frames = visual_stimuli_df['frame'].values - omitted_flash_frames = np.array(omitted_flash_frames) - - # Test offsets of omitted flash frames - # to see if they are in the stim log - offsets = np.arange(-3, 4) - offset_arr = np.add( - np.repeat(omitted_flash_frames[:, np.newaxis], - offsets.shape[0], axis=1), - offsets) - matched_any_offset = np.any(np.isin(offset_arr, stim_frames), axis=1) - - # Remove omitted flashes that also exist in the stimulus log - was_true_omitted = np.logical_not(matched_any_offset) # bool - omitted_flash_frames_to_keep = omitted_flash_frames[was_true_omitted] - - # Have to remove frames that are double-counted in omitted log - omitted_flash_list += list(np.unique(omitted_flash_frames_to_keep)) - - omitted = np.ones_like(omitted_flash_list).astype(bool) - time = [time[fi] for fi in omitted_flash_list] - omitted_df = pd.DataFrame({'omitted': omitted, - 'frame': omitted_flash_list, - 'time': time, - 'image_name': 'omitted'}) - - df = pd.concat((visual_stimuli_df, omitted_df), - sort=False).sort_values('frame').reset_index() - return df - - -def is_change_event(stimulus_presentations: pd.DataFrame) -> pd.Series: - """ - Returns whether a stimulus is a change stimulus - A change stimulus is defined as the first presentation of a new image_name - Omitted stimuli are ignored - The first stimulus in the session is ignored - - :param stimulus_presentations - The stimulus presentations table - - :return: is_change: pd.Series indicating whether a given stimulus is a - change stimulus - """ - stimuli = stimulus_presentations['image_name'] - - # exclude omitted stimuli - stimuli = stimuli[~stimulus_presentations['omitted']] - - prev_stimuli = stimuli.shift() - - # exclude first stimulus - stimuli = stimuli.iloc[1:] - prev_stimuli = prev_stimuli.iloc[1:] - - is_change = stimuli != prev_stimuli - - # reset back to original index - is_change = is_change \ - .reindex(stimulus_presentations.index) \ - .rename('is_change') - - # Excluded stimuli are not change events - is_change = is_change.fillna(False) - - return is_change diff --git a/allensdk/brain_observatory/behavior/swdb/analysis_tools.py b/allensdk/brain_observatory/behavior/swdb/analysis_tools.py deleted file mode 100644 index 30c6fed88b..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/analysis_tools.py +++ /dev/null @@ -1,92 +0,0 @@ -import sys -import os -import numpy as np -import pandas as pd -import bisect - -def get_nearest_frame(timepoint, timestamps): - ''' - Get the nearest frame timestamp for any time point - - This is kinda not true. This returns the index at which you would - insert the timepoint to retain the sort order of the list, so if you - use the index on the list of timestamps you will always get the smallest - timestamps that is larger than your input timestamp (not alway the closest) - - Args: - timepoint (float): The timepoint you want a frame time for - timestamps (list or np.array) The timestamps of each frame - - Returns: - nearest_frame (int): The index of the next frame in time - ''' - nearest_frame = bisect.bisect_left(timestamps, timepoint) - return nearest_frame - -def get_trace_around_timepoint(trace, timepoint, timestamps, - window_around_timepoint_seconds, frame_rate): - ''' - Return the values around a timepoint using a window defined in seconds - - Args: - trace (np.array): The trace values - timepoint (float): The timepoint around which to apply the window - timestamps (np.array): Timestamp in seconds for each point in the trace - window_around_timepoint_seconds (list with len==2): - [-2, 3] for a window that starts 2 seconds before the timepoint and - ends 3 seconds after. - frame_rate (float): The frame rate at which the trace is collected. - ''' - - assert trace.shape == timestamps.shape - - window = window_around_timepoint_seconds - frame_for_timepoint = get_nearest_frame(timepoint, timestamps) - lower_frame = frame_for_timepoint + int((window[0] * frame_rate)) - upper_frame = frame_for_timepoint + int((window[1] * frame_rate)) - trace = np.array(trace[lower_frame:upper_frame]) - timepoints = np.array(timestamps[lower_frame:upper_frame]) - return trace, timepoints - -def get_mean_in_window(trace, window_after_trace_start_seconds, frame_rate): - window = window_after_trace_start_seconds.copy() - mean = np.nanmean(trace[int(window[0] * frame_rate): int(window[1] * frame_rate)]) - return mean - -if __name__=="__main__": - trace = np.arange(100, dtype=float) - timestamps = np.arange(100, dtype=float) - - a = get_nearest_frame(49.9, timestamps) - b = get_nearest_frame(50.1, timestamps) - - assert timestamps[a] == 50.0 - assert timestamps[b] == 51.0 - - window_around_timepoint_seconds = [-5, 5] - t_vals, t_ts = get_trace_around_timepoint(trace, 49.9, timestamps, - window_around_timepoint_seconds, - frame_rate=1) - - assert np.all(t_vals == np.array([45., 46., 47., 48., 49., 50., 51., 52., 53., 54.])) - -# def traces_around_timepoints(trace_values, trace_timestamps, event_times, window): -# ''' -# Get peri-event slices of a trace. -# -# Args: -# trace_values (1d np.array): Trace for one cell -# trace_timestamps (1d np.array): Timestamps for each trace value -# event_times (np.array): The times of events you want traces for -# window (2-tuple): Time range around event times -# -# Returns -# eventlocked_traces (np.array with shape (n_events, n_samples_in_window)) -# ''' - - - - - - - diff --git a/allensdk/brain_observatory/behavior/swdb/behavior_project_cache.py b/allensdk/brain_observatory/behavior/swdb/behavior_project_cache.py deleted file mode 100644 index 9c63015f57..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/behavior_project_cache.py +++ /dev/null @@ -1,549 +0,0 @@ -import os -import pandas as pd -import numpy as np -import json -import re - -from allensdk import one -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.behavior_metadata import \ - BehaviorMetadata -from allensdk.brain_observatory.behavior.session_apis.data_io import ( - BehaviorOphysNwbApi) -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ - BehaviorOphysExperiment -from allensdk.core.lazy_property import LazyProperty -from allensdk.brain_observatory.behavior.trials_processing import \ - calculate_reward_rate -from allensdk.deprecated import deprecated - -csv_io = { - 'reader': lambda path: pd.read_csv(path, index_col='Unnamed: 0'), - 'writer': lambda path, df: df.to_csv(path) -} - -cache_path_example = '/allen/programs/braintv/workgroups/nc-ophys/' \ - 'visual_behavior/SWDB_2019/cache_20190813' - - -@deprecated("swdb.behavior_project_cache.BehaviorProjectCache is deprecated " - "and will be removed in version 1.3. Please use brain_observatory." - "behavior.behavior_project_cache.BehaviorProjectCache.") -class BehaviorProjectCache(object): - def __init__(self, cache_base): - ''' - A cache-level object for the behavior/ophys data. Provides access to - the manifest of - ophys/behavior containers, as well as pre-computed analysis files - for each - experiment. - - Args: - cache_base (str): Path to the directory containing the cached - behavior/ophys data - - Attributes: - experiment_table: (pd.DataFrame) - Table containing information about all ophys experiments. - analysis_files_metadata (dict): - Metadata relating to the creation of the analysis files. - - Methods: - get_session(ophys_experiment_id): - Returns an extended BehaviorOphysExperiment object, including - trial_response_df and flash_response_df - - get_container_sessions(container_id): - Returns a dictionary with behavior stages as keys and the - corresponding session object from that container, that stage as - the value. - ''' - - self.cache_paths = { - 'manifest_path': os.path.join(cache_base, - 'visual_behavior_data_manifest.csv'), - 'nwb_base_dir': os.path.join(cache_base, 'nwb_files'), - 'analysis_files_base_dir': os.path.join(cache_base, - 'analysis_files'), - 'analysis_files_metadata_path': os.path.join( - cache_base, 'analysis_files_metadata.json'), - } - - self.experiment_table = csv_io['reader']( - self.cache_paths['manifest_path']) - - self.experiment_table['cre_line'] = self.experiment_table[ - 'full_genotype'].apply(BehaviorMetadata.parse_cre_line) - self.experiment_table['passive_session'] = self.experiment_table[ - 'stage_name'].apply(parse_passive) - self.experiment_table['image_set'] = self.experiment_table[ - 'stage_name'].apply(parse_image_set) - - self.experiment_table = self.experiment_table[[ - 'ophys_experiment_id', - 'container_id', - 'full_genotype', - 'cre_line', - 'imaging_depth', - 'targeted_structure', - 'image_set', - 'stage_name', - 'passive_session', - 'animal_name', - 'sex', - 'date_of_acquisition', - 'retake_number' - ]] - - self.nwb_base_dir = self.cache_paths['nwb_base_dir'] - self.analysis_files_base_dir = self.cache_paths[ - 'analysis_files_base_dir'] - self.analysis_files_metadata = self.get_analysis_files_metadata( - self.cache_paths['analysis_files_metadata_path'] - ) - - def get_analysis_files_metadata(self, path): - with open(path, 'r') as metadata_path: - metadata = json.load(metadata_path) - return metadata - - def get_nwb_filepath(self, experiment_id): - return os.path.join( - self.nwb_base_dir, - 'behavior_ophys_session_{}.nwb'.format(experiment_id) - ) - - def get_trial_response_df_path(self, experiment_id): - return os.path.join( - self.analysis_files_base_dir, - 'trial_response_df_{}.h5'.format(experiment_id) - ) - - def get_flash_response_df_path(self, experiment_id): - return os.path.join( - self.analysis_files_base_dir, - 'flash_response_df_{}.h5'.format(experiment_id) - ) - - def get_extended_stimulus_presentations_df(self, experiment_id): - return os.path.join( - self.analysis_files_base_dir, - 'extended_stimulus_presentations_df_{}.h5'.format(experiment_id) - ) - - def get_session(self, experiment_id): - ''' - Return a BehaviorOphysExperiment object given an ophys_experiment_id. - ''' - nwb_path = self.get_nwb_filepath(experiment_id) - trial_response_df_path = self.get_trial_response_df_path(experiment_id) - flash_response_df_path = self.get_flash_response_df_path(experiment_id) - extended_stim_df_path = self.get_extended_stimulus_presentations_df( - experiment_id) - api = ExtendedNwbApi( - nwb_path, - trial_response_df_path, - flash_response_df_path, - extended_stim_df_path - ) - session = ExtendedBehaviorOphysExperiment(api) - return session - - def get_container_sessions(self, container_id): - container_stages = {} - container_experiments = self.experiment_table.groupby( - 'container_id').get_group(container_id) - for ind_row, row in container_experiments.iterrows(): - container_stages.update( - {row['stage_name']: self.get_session( - row['ophys_experiment_id'])} - ) - return container_stages - - -def parse_passive(behavior_stage): - ''' - Args: - behavior_stage (str): the stage string, e.g. OPHYS_1_images_A or - OPHYS_1_images_A_passive - Returns: - passive (bool): whether or not the session was a passive session - ''' - r = re.compile(".*_passive") - if r.match(behavior_stage): - return True - else: - return False - - -def parse_image_set(behavior_stage): - ''' - Args: - behavior_stage (str): the stage string, e.g. OPHYS_1_images_A or - OPHYS_1_images_A_passive - Returns: - image_set (str): which image set is designated by the stage name - ''' - r = re.compile(".*images_(?P<image_set>[AB]).*") - image_set = r.match(behavior_stage).groups('image_set')[0] - return image_set - - -class ExtendedNwbApi(BehaviorOphysNwbApi): - def __init__(self, nwb_path, trial_response_df_path, - flash_response_df_path, - extended_stimulus_presentations_df_path): - ''' - Api to read data from an NWB file and associated analysis HDF5 files. - ''' - super(ExtendedNwbApi, self).__init__(path=nwb_path, - filter_invalid_rois=True) - self.trial_response_df_path = trial_response_df_path - self.flash_response_df_path = flash_response_df_path - self.extended_stimulus_presentations_df_path = \ - extended_stimulus_presentations_df_path - - def get_trial_response_df(self): - tdf = pd.read_hdf(self.trial_response_df_path, key='df') - tdf.reset_index(inplace=True) - tdf.drop(columns=['cell_roi_id'], inplace=True) - return tdf - - def get_flash_response_df(self): - fdf = pd.read_hdf(self.flash_response_df_path, key='df') - fdf.reset_index(inplace=True) - fdf.drop(columns=['image_name', 'cell_roi_id'], inplace=True) - fdf = fdf.join(self.get_stimulus_presentations(), on='flash_id', - how='left') - return fdf - - def get_extended_stimulus_presentations_df(self): - return pd.read_hdf(self.extended_stimulus_presentations_df_path, - key='df') - - def get_task_parameters(self): - ''' - The task parameters are incorrect. - See: https://github.com/AllenInstitute/AllenSDK/issues/637 - We need to hard-code the omitted flash fraction and stimulus - duration here. - ''' - task_parameters = super(ExtendedNwbApi, self).get_task_parameters() - task_parameters['omitted_flash_fraction'] = 0.05 - task_parameters['stimulus_duration_sec'] = 0.25 - task_parameters['blank_duration_sec'] = 0.5 - task_parameters.pop('task') - return task_parameters - - def get_metadata(self): - metadata = super(ExtendedNwbApi, self).get_metadata() - - # We want stage name in metadata for easy access by the students - task_parameters = self.get_task_parameters() - metadata['stage'] = task_parameters['stage'] - - # metadata should not include 'session_type' because it is 'Unknown' - metadata.pop('session_type') - - # For SWDB only - # metadata should not include 'behavior_session_uuid' because it is - # not useful to students and confusing - metadata.pop('behavior_session_uuid') - - # Rename LabTracks_ID to mouse_id to reduce student confusion - metadata['mouse_id'] = metadata.pop('LabTracks_ID') - - return metadata - - def get_running_speed(self): - # We want the running speed attribute to be a dataframe (like licks, - # rewards, etc.) instead of a - # RunningSpeed object. This will improve consistency for students. - # For SWDB we have also opted to - # have columns for both 'timestamps' and 'values' of things, - # since this is more intuitive for students - running_speed = super(ExtendedNwbApi, self).get_running_speed() - return pd.DataFrame({'speed': running_speed.speed, - 'timestamps': running_speed.timestamps}) - - def get_trials(self, filter_aborted_trials=True): - trials = super(ExtendedNwbApi, self).get_trials() - stimulus_presentations = super(ExtendedNwbApi, - self).get_stimulus_presentations() - - # Note: everything between dashed lines is a patch to deal with - # timing issues in - # the AllenSDK - # This should be removed in the future after issues #876 and #802 - # are fixed. - # -------------------------------------------------------------------------------- - - # gets start_time of next stimulus after timestamp in - # stimulus_presentations - def get_next_flash(timestamp): - query = stimulus_presentations.query('start_time >= @timestamp') - if len(query) > 0: - return query.iloc[0]['start_time'] - else: - return None - - trials['change_time'] = trials['change_time'].map( - lambda x: get_next_flash(x)) - - # This method can lead to a NaN change time for any trials at the - # end of the session. - # However, aborted trials at the end of the session also don't - # have change times. - # The safest method seems like just droping any trials that aren't - # covered by the - # stimulus_presentations - # Using start time in case last stim is omitted - last_stimulus_presentation = stimulus_presentations.iloc[-1][ - 'start_time'] - trials = trials[ - np.logical_not(trials['stop_time'] > last_stimulus_presentation)] - - # recalculates response latency based on corrected change time and - # first lick time - def recalculate_response_latency(row): - if len(row['lick_times'] > 0) and not pd.isnull( - row['change_time']): - return row['lick_times'][0] - row['change_time'] - else: - return np.nan - - trials['response_latency'] = trials.apply(recalculate_response_latency, - axis=1) - # ------------------------------------------------------------------------------- - - # asserts that every change time exists in the - # stimulus_presentations table - for change_time in ( - trials[trials['change_time'].notna()]['change_time']): - assert change_time in stimulus_presentations['start_time'].values - - # Return only non-aborted trials from this API by default - if filter_aborted_trials: - trials = trials.query('not aborted') - - # Reorder / drop some columns to make more sense to students - trials = trials[[ - 'initial_image_name', - 'change_image_name', - 'change_time', - 'lick_times', - 'response_latency', - 'reward_time', - 'go', - 'catch', - 'hit', - 'miss', - 'false_alarm', - 'correct_reject', - 'aborted', - 'auto_rewarded', - 'reward_volume', - 'start_time', - 'stop_time', - 'trial_length' - ]] - - # Calculate reward rate per trial - trials['reward_rate'] = calculate_reward_rate( - response_latency=trials.response_latency, - starttime=trials.start_time, - window=.75, - trial_window=25, - initial_trials=10 - ) - - # Response_binary is just whether or not they responded - e.g. true - # for hit or FA. - hit = trials['hit'].values - fa = trials['false_alarm'].values - trials['response_binary'] = np.logical_or(hit, fa) - - return trials - - def get_stimulus_presentations(self): - stimulus_presentations = super(ExtendedNwbApi, - self).get_stimulus_presentations() - extended_stimulus_presentations = \ - self.get_extended_stimulus_presentations_df() - extended_stimulus_presentations = extended_stimulus_presentations.drop( - columns=['omitted']) - stimulus_presentations = stimulus_presentations.join( - extended_stimulus_presentations) - - # Reorder the columns returned to make more sense to students - stimulus_presentations = stimulus_presentations[[ - 'image_name', - 'image_index', - 'start_time', - 'stop_time', - 'omitted', - 'change', - 'duration', - 'licks', - 'rewards', - 'running_speed', - 'index', - 'time_from_last_lick', - 'time_from_last_reward', - 'time_from_last_change', - 'block_index', - 'image_block_repetition', - 'repeat_within_block', - 'image_set' - ]] - - # Rename some columns to make more sense to students - stimulus_presentations = stimulus_presentations.rename( - columns={'index': 'absolute_flash_number', - 'running_speed': 'mean_running_speed'}) - # Replace image set with A/B - stimulus_presentations['image_set'] = \ - self.get_task_parameters()['stage'][15] - # Change index name for easier merge with flash_response_df - stimulus_presentations.index.rename('flash_id', inplace=True) - return stimulus_presentations - - def get_stimulus_templates(self): - # super stim templates is a dict with one annoyingly-long key, - # so pop the val out - stimulus_templates = super(ExtendedNwbApi, - self).get_stimulus_templates() - stimulus_template_array = stimulus_templates[ - list(stimulus_templates.keys())[0]] - - # What we really want is a dict with image_name as key - template_dict = {} - image_index_names = self.get_image_index_names() - for image_index, image_name in image_index_names.iteritems(): - if image_name != 'omitted': - template_dict.update( - {image_name: stimulus_template_array[image_index, :, :]}) - return template_dict - - def get_licks(self): - # Licks column 'time' should be 'timestamps' to be consistent with - # rest of session - licks = super(ExtendedNwbApi, self).get_licks() - licks = licks.rename(columns={'time': 'timestamps'}) - return licks - - def get_rewards(self): - # Rewards has timestamps in the index which is confusing and not - # consistent with the - # rest of the session. Use a normal index and have timestamps as a - # column - rewards = super(ExtendedNwbApi, self).get_rewards() - rewards = rewards.reset_index() - return rewards - - def get_dff_traces(self): - # We want to drop the 'cell_roi_id' column from the dff traces - # dataframe - # This is just for Friday Harbor, not for eventual inclusion in the - # LIMS api. - dff_traces = super(ExtendedNwbApi, self).get_dff_traces() - dff_traces = dff_traces.drop(columns=['cell_roi_id']) - return dff_traces - - def get_image_index_names(self): - image_index_names = self.get_stimulus_presentations().groupby( - 'image_index').apply( - lambda group: one(group['image_name'].unique()) - ) - return image_index_names - - -class ExtendedBehaviorOphysExperiment(BehaviorOphysExperiment): - """Represents data from a single Visual Behavior Ophys imaging session. - LazyProperty attributes access the data only on the first demand, - and then memoize the result for reuse. - - Attributes: - ophys_experiment_id : int (LazyProperty) - Unique identifier for this experimental session - max_projection : allensdk.brain_observatory.behavior.image_api.Image - (LazyProperty) - 2D max projection image - stimulus_timestamps : numpy.ndarray (LazyProperty) - Timestamps associated the stimulus presentations on the monitor - ophys_timestamps : numpy.ndarray (LazyProperty) - Timestamps associated with frames captured by the microscope - metadata : dict (LazyProperty) - A dictionary of session-specific metadata - dff_traces : pandas.DataFrame (LazyProperty) - The traces of dff organized into a dataframe; index is the cell - roi ids - segmentation_mask_image: - allensdk.brain_observatory.behavior.image_api.Image (LazyProperty) - An image with pixel value 1 if that pixel was included in an - ROI, and 0 otherwise - roi_masks: dict (LazyProperty) - A dictionary with individual ROI masks for each cell specimen - ID. Keys are cell specimen IDs, values are 2D numpy arrays. - cell_specimen_table : pandas.DataFrame (LazyProperty) - Cell roi information organized into a dataframe; index is the - cell roi ids - running_speed : pandas.DataFrame (LazyProperty) - A dataframe containing the running_speed in cm/s and the - timestamps of each data point - stimulus_presentations : pandas.DataFrame (LazyProperty) - Table whose rows are stimulus presentations (i.e. a given image, - for a given duration, typically 250 ms) and whose columns are - presentation characteristics. - stimulus_templates : dict (LazyProperty) - A dictionary containing the stimulus images presented during the - session. Keys are image names, values are 2D numpy arrays. - licks : pandas.DataFrame (LazyProperty) - A dataframe containing lick timestamps - rewards : pandas.DataFrame (LazyProperty) - A dataframe containing timestamps of delivered rewards - task_parameters : dict (LazyProperty) - A dictionary containing parameters used to define the task - runtime behavior - trials : pandas.DataFrame (LazyProperty) - A dataframe containing behavioral trial start/stop times, - and trial data - corrected_fluorescence_traces : pandas.DataFrame (LazyProperty) - The motion-corrected fluorescence traces organized into a - dataframe; index is the cell roi ids - average_projection : allensdk.brain_observatory.behavior.image_api - .Image (LazyProperty) - 2D image of the microscope field of view, averaged across the - experiment - motion_correction : pandas.DataFrame (LazyProperty) - A dataframe containing trace data used during motion correction - computation - - """ - - def __init__(self, api): - super(ExtendedBehaviorOphysExperiment, self).__init__(api) - self.api = api - - self.trial_response_df = LazyProperty(self.api.get_trial_response_df) - self.flash_response_df = LazyProperty(self.api.get_flash_response_df) - self.image_index = LazyProperty(self.api.get_image_index_names) - self.roi_masks = LazyProperty(self.get_roi_masks) - - def get_roi_masks(self): - masks = super(ExtendedBehaviorOphysExperiment, self).get_roi_masks() - return { - cell_specimen_id: masks.loc[ - {"cell_specimen_id": cell_specimen_id}].data - for cell_specimen_id in masks["cell_specimen_id"].data - } - - def get_segmentation_mask_image(self): - masks = self.roi_masks - return np.any([submask for submask in masks.values()], axis=0) - - -if __name__ == "__main__": - cache = BehaviorProjectCache(cache_path_example) - session = cache.get_session( - cache.experiment_table.iloc[0]['ophys_experiment_id']) diff --git a/allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py b/allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py deleted file mode 100644 index a7f2c844ce..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -import h5py -import pandas as pd -from allensdk.brain_observatory.behavior.swdb import behavior_project_cache as bpc -from allensdk.brain_observatory.behavior.swdb import utilities as ut - - -cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', - 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/analysis_files', - 'analysis_files_metadata_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/analysis_files_metadata.json', - } - -cache = bpc.BehaviorProjectCache(cache_json) -manifest = cache.manifest -experiment_ids = manifest.ophys_experiment_id.unique() - -print('generating mega_trial_mdf') -mega_trial_mdf = ut.create_multi_session_mean_df(cache, experiment_ids, conditions=['cell_specimen_id','change_image_name']) -save_dir = r'/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019' -mega_trial_mdf.to_hdf(os.path.join(save_dir, 'multi_session_mean_trials_df.h5'), key='df') -print('done with trials, creating mega_flash_mdf') -mega_flash_mdf = ut.create_multi_session_mean_df(cache, experiment_ids, flashes=True, conditions=['cell_specimen_id','image_name']) -save_dir = r'/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019' -mega_flash_mdf.to_hdf(os.path.join(save_dir, 'multi_session_mean_flashes_df.h5'), key='df') -print('done with flash df') \ No newline at end of file diff --git a/allensdk/brain_observatory/behavior/swdb/run_multi_session_df.py b/allensdk/brain_observatory/behavior/swdb/run_multi_session_df.py deleted file mode 100644 index 5cf0b1029d..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/run_multi_session_df.py +++ /dev/null @@ -1,27 +0,0 @@ -import os -import sys -sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') -from pbstools import PythonJob -import behavior_project_cache as bpc - -# python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" - -python_file = r"/home/marinag/AllenSDK/allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py" - -jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/visb_swdb_summary_figures' - -job_settings = {'queue': 'braintv', - 'mem': '100g', - 'walltime': '2:00:00', - 'ppn':1, - 'jobdir': jobdir, - } - -PythonJob( - python_file, - python_executable = '/home/marinag/anaconda2/envs/visual_behavior_sdk/bin/python', - python_args = None, - conda_env = None, - jobname = 'multi_session_dfs', - **job_settings - ).run(dryrun=False) diff --git a/allensdk/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py b/allensdk/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py deleted file mode 100644 index c02b3484d2..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -import sys -sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') -from pbstools import PythonJob -import behavior_project_cache as bpc - -python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py" - -jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/20190813_save_extended_stim' - -job_settings = {'queue': 'braintv', - 'mem': '15g', - 'walltime': '0:30:00', - 'ppn':1, - 'jobdir': jobdir, - } - -cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', - 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/extra_files_final' - } - -cache = bpc.BehaviorProjectCache(cache_json) - -experiment_ids = cache.manifest['ophys_experiment_id'].values - -for experiment_id in experiment_ids: - PythonJob( - python_file, - python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', - python_args = experiment_id, - conda_env = None, - jobname = 'extended_stimulus_df_{}'.format(experiment_id), - **job_settings - ).run(dryrun=False) diff --git a/allensdk/brain_observatory/behavior/swdb/run_save_flash_response_df.py b/allensdk/brain_observatory/behavior/swdb/run_save_flash_response_df.py deleted file mode 100644 index 48e705bc4f..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/run_save_flash_response_df.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -import sys -sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') -from pbstools import PythonJob -import behavior_project_cache as bpc - -python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py" - -jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/20190810_save_flash_response_df' - -job_settings = {'queue': 'braintv', - 'mem': '24g', - 'walltime': '12:00:00', - 'ppn':1, - 'jobdir': jobdir, - } - -cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', - 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/extra_files' - } - -cache = bpc.BehaviorProjectCache(cache_json) - -experiment_ids = cache.manifest['ophys_experiment_id'].values - -for experiment_id in experiment_ids: - PythonJob( - python_file, - python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', - python_args = experiment_id, - conda_env = None, - jobname = 'flash_response_df_{}'.format(experiment_id), - **job_settings - ).run(dryrun=False) diff --git a/allensdk/brain_observatory/behavior/swdb/run_save_trial_response_df.py b/allensdk/brain_observatory/behavior/swdb/run_save_trial_response_df.py deleted file mode 100644 index 7779ec4682..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/run_save_trial_response_df.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -import sys -sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') -from pbstools import PythonJob -import behavior_project_cache as bpc - -python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py" - -jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/20190810_save_trial_response_df' - -job_settings = {'queue': 'braintv', - 'mem': '15g', - 'walltime': '0:30:00', - 'ppn':1, - 'jobdir': jobdir, - } - -cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/nwb_files', - 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/extra_files' - } - -cache = bpc.BehaviorProjectCache(cache_json) - -experiment_ids = cache.manifest['ophys_experiment_id'].values - -for experiment_id in experiment_ids: - PythonJob( - python_file, - python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', - python_args = experiment_id, - conda_env = None, - jobname = 'trial_response_df_{}'.format(experiment_id), - **job_settings - ).run(dryrun=False) diff --git a/allensdk/brain_observatory/behavior/swdb/run_summary_figures.py b/allensdk/brain_observatory/behavior/swdb/run_summary_figures.py deleted file mode 100644 index 582db74bec..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/run_summary_figures.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -import sys -sys.path.append('/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/pbstools') -from pbstools import PythonJob -import behavior_project_cache as bpc - -# python_file = r"/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" - -python_file = r"/home/marinag/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" -# python_file = r"/home/nick.ponvert/src/AllenSDK/allensdk/brain_observatory/behavior/swdb/summary_figures.py" - -jobdir = '/allen/programs/braintv/workgroups/nc-ophys/nick.ponvert/cluster_jobs/visb_swdb_summary_figures' - -job_settings = {'queue': 'braintv', - 'mem': '15g', - 'walltime': '0:30:00', - 'ppn':1, - 'jobdir': jobdir, - } - -cache_json = {'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/nwb_files', - 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files', - 'analysis_files_metadata_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files_metadata.json', - } - -cache = bpc.BehaviorProjectCache(cache_json) - -experiment_ids = cache.manifest['ophys_experiment_id'].values - -for experiment_id in experiment_ids: - PythonJob( - python_file, - python_args = experiment_id, - python_executable = '/home/marinag/anaconda2/envs/visual_behavior_sdk/bin/python', - conda_env = None, - jobname = 'trial_response_df_{}'.format(experiment_id), - **job_settings - ).run(dryrun=False) -# python_executable = '/home/nick.ponvert/anaconda3/envs/allen/bin/python', diff --git a/allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py b/allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py deleted file mode 100644 index f8969af2d7..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py +++ /dev/null @@ -1,250 +0,0 @@ -import sys -import os -import numpy as np - -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( - BehaviorOphysExperiment) -from allensdk.brain_observatory.behavior.session_apis.data_io import ( - BehaviorOphysNwbApi) - -import behavior_project_cache as bpc -from importlib import reload - -reload(bpc) - - -def time_from_last(flash_times, other_times): - last_other_index = np.searchsorted(a=other_times, v=flash_times) - 1 - time_from_last_other = flash_times - other_times[last_other_index] - - # flashes that happened before the other thing happened should return nan - time_from_last_other[last_other_index == -1] = np.nan - - return time_from_last_other - - -def trace_average(values, timestamps, start_time, stop_time): - values_this_range = values[ - ((timestamps >= start_time) & (timestamps < stop_time))] - return values_this_range.mean() - - -test_values = np.array([1, 2, 3, 4, 5, 6]) -test_timestamps = np.array([1, 2, 3, 4, 5, 6]) -test_start_times = np.array([0, 0, 2.5]) -test_stop_times = np.array([7, 6, 4.5]) -expected = np.array([3.5, 3.0, 3.5]) - - -def find_change(image_index, omitted_index): - ''' - Args: - image_index (pd.Series): The index of the presented image for each - flash - omitted_index (int): The index value for omitted stimuli - - Returns: - change (np.array of bool): Whether each flash was a change flash - ''' - - change = np.diff(image_index) != 0 - change = np.concatenate( - [np.array([False]), change]) # First flash not a change - omitted = image_index == omitted_index - omitted_inds = np.flatnonzero(omitted) - change[omitted_inds] = False - - if image_index.iloc[-1] == omitted_index: - # If the last flash is omitted we can't set the +1 for that omitted idx - change[omitted_inds[:-1] + 1] = False - else: - change[omitted_inds + 1] = False - - return change - - -def get_extended_stimulus_presentations(session): - intermediate_df = session.stimulus_presentations.copy() - - lick_times = session.licks["time"].values - reward_times = session.rewards.index.values - flash_times = intermediate_df["start_time"].values - change_times = session.trials["change_time"].values - change_times = change_times[~np.isnan(change_times)] - - # Time from last other for each flash - - if len(lick_times) < 5: # Passive sessions - time_from_last_lick = np.full(len(flash_times), np.nan) - else: - time_from_last_lick = time_from_last(flash_times, lick_times) - - if len(reward_times) < 1: # Sometimes mice are bad - time_from_last_reward = np.full(len(flash_times), np.nan) - else: - time_from_last_reward = time_from_last(flash_times, reward_times) - - time_from_last_change = time_from_last(flash_times, change_times) - - intermediate_df["time_from_last_lick"] = time_from_last_lick - intermediate_df["time_from_last_reward"] = time_from_last_reward - intermediate_df["time_from_last_change"] = time_from_last_change - - # Was the flash a change flash? - omitted_index = intermediate_df.groupby("image_name").apply( - lambda group: group["image_index"].unique()[0] - )["omitted"] - changes = find_change(intermediate_df["image_index"], omitted_index) - omitted = intermediate_df["image_index"] == omitted_index - - intermediate_df["change"] = changes - intermediate_df["omitted"] = omitted - - # Index of each image block - changes_including_first = np.copy(changes) - changes_including_first[0] = True - change_indices = np.flatnonzero(changes_including_first) - flash_inds = np.arange(len(intermediate_df)) - block_inds = np.searchsorted(a=change_indices, v=flash_inds, - side="right") - 1 - - intermediate_df["block_index"] = block_inds - - # Block repetition number - blocks_per_image = intermediate_df.groupby("image_name").apply( - lambda group: np.unique(group["block_index"]) - ) - block_repetition_number = np.copy(block_inds) - - for image_name, image_blocks in blocks_per_image.iteritems(): - if image_name != "omitted": - for ind_block, block_number in enumerate(image_blocks): - # block_rep_number starts as a copy of block_inds, so we can - # go write over the index number with the rep number - block_repetition_number[ - block_repetition_number == block_number] = ind_block - - intermediate_df["image_block_repetition"] = block_repetition_number - - # Repeat number within a block - repeat_number = np.full(len(intermediate_df), np.nan) - - # Assuming that the row index starts at zero - assert intermediate_df.iloc[0].name == 0 - - for ind_group, group in intermediate_df.groupby("block_index"): - repeat = 0 - for ind_row, row in group.iterrows(): - if row["image_name"] != "omitted": - repeat_number[ind_row] = repeat - repeat += 1 - - intermediate_df["repeat_within_block"] = repeat_number - - # Lists of licks/rewards on each flash - licks_each_flash = intermediate_df.apply( - lambda row: lick_times[ - ((lick_times > row["start_time"]) & ( - lick_times < row["start_time"] + 0.75)) - ], - axis=1, - ) - rewards_each_flash = intermediate_df.apply( - lambda row: reward_times[ - ( - (reward_times > row["start_time"]) - & (reward_times < row["start_time"] + 0.75) - ) - ], - axis=1, - ) - - intermediate_df["licks"] = licks_each_flash - intermediate_df["rewards"] = rewards_each_flash - - # Average running speed on each flash - flash_running_speed = intermediate_df.apply( - lambda row: trace_average( - session.running_speed.values, - session.running_speed.timestamps, - row["start_time"], - row["start_time"] + 0.25, - ), - axis=1, - ) - - intermediate_df["running_speed"] = flash_running_speed - - # Do some tests - # assert sum(licks_each_flash) == len(session.licks) #something like this - - extended_stim_columns = [ - "time_from_last_lick", - "time_from_last_reward", - "time_from_last_change", - "change", - "omitted", - "block_index", - "image_block_repetition", - "repeat_within_block", - "licks", - "rewards", - "running_speed", - ] - - return intermediate_df[extended_stim_columns] - - -if __name__ == "__main__": - - case = 0 - - cache_json = { - "manifest_path": "/allen/programs/braintv/workgroups/nc-ophys" - "/visual_behavior/SWDB_2019/" - "visual_behavior_data_manifest.csv", - "nwb_base_dir": "/allen/programs/braintv/workgroups/nc-ophys" - "/visual_behavior/SWDB_2019/nwb_files", - "analysis_files_base_dir": - "/allen/programs/braintv/workgroups/nc-ophys/visual_behavior" - "/SWDB_2019/extra_files", - } - - cache = bpc.BehaviorProjectCache(cache_json) - - if case == 0: - - experiment_id = sys.argv[1] - # experiment_id = cache.manifest.iloc[5]['ophys_experiment_id'] - nwb_path = cache.get_nwb_filepath(experiment_id) - api = BehaviorOphysNwbApi(nwb_path) - session = BehaviorOphysExperiment(api) - - # output_path = "/allen/programs/braintv/workgroups/nc-ophys - # /visual_behavior/SWDB_2019/extra_files_final" - output_path = "/allen/programs/braintv/workgroups/nc-ophys" \ - "/visual_behavior/SWDB_2019/corrected_extended_stim" - - extended_stimulus_presentations_df = \ - get_extended_stimulus_presentations(session) - - output_fn = os.path.join( - output_path, - "extended_stimulus_presentations_df_{}.h5".format(experiment_id) - ) - print("Writing extended_stimulus_presentations_df to {}".format( - output_fn)) - extended_stimulus_presentations_df.to_hdf(output_fn, key="df") - - elif case == 1: - - failed_oeid = 825623170 - success_oeid = 826585773 - - # nwb_path = cache.get_nwb_filepath(success_oeid) - nwb_path = cache.get_nwb_filepath(failed_oeid) - api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) - session = BehaviorOphysExperiment(api) - - extended_stimulus_presentations_df = \ - get_extended_stimulus_presentations(session) diff --git a/allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py b/allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py deleted file mode 100644 index 30fe156265..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py +++ /dev/null @@ -1,446 +0,0 @@ -import sys -import os -import numpy as np -import pandas as pd -import itertools - -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ - BehaviorOphysExperiment -from allensdk.brain_observatory.behavior.session_apis.data_io import ( - BehaviorOphysNwbApi) -from allensdk.brain_observatory.behavior.swdb import \ - behavior_project_cache as bpc -from allensdk.brain_observatory.behavior.swdb.analysis_tools import \ - get_trace_around_timepoint, get_mean_in_window - -''' - This script computes the flash_response_df for a BehaviorOphysExperiment - object - -''' - - -def get_flash_response_df(session, response_analysis_params): - ''' - Builds the flash response dataframe for <session> - - INPUTS: - <session> BehaviorOphysExperiment to build the flash response - dataframe for - <response_analyis_params> A dictionary with the following keys - 'window_around_timepoint_seconds' is the time window to save - out the dff_trace around the flash onset. - 'response_window_duration_seconds' is the length of time - after the flash onset to compute the mean_response - 'baseline_window_duration_seconds' is the length of time - before the flash onset to compute the baseline response - - OUTPUTS: - A dataframe with index: (cell_specimen_id, flash_id) - and columns: - cell_roi_id, the cell's roi id for that session - mean_response, the mean df/f in the response_window - baseline_response, the mean df/f in the baseline_window - dff_trace, the dff trace in the window_around_timepoint_seconds - dff_trace_timestamps, the timestamps for the dff_trace - - ''' - frame_rate = 31. # Shouldn't hard code this here - - # get data to analyze - dff_traces = session.dff_traces.copy() - flashes = session.stimulus_presentations.copy() - - # get params to define response window, in seconds - window_around_timepoint_seconds = response_analysis_params[ - 'window_around_timepoint_seconds'] - response_window_duration_seconds = response_analysis_params[ - 'response_window_duration_seconds'] - baseline_window_duration_seconds = response_analysis_params[ - 'baseline_window_duration_seconds'] - mean_response_window_seconds = [np.abs(window_around_timepoint_seconds[0]), - np.abs(window_around_timepoint_seconds[ - 0]) + - response_window_duration_seconds] - baseline_window_seconds = [np.abs( - window_around_timepoint_seconds[0]) - baseline_window_duration_seconds, - np.abs(window_around_timepoint_seconds[0])] - - # Build a dataframe with multiindex defined as product of cell_id X - # flash_id - cell_flash_combinations = itertools.product(dff_traces.index, - flashes.index) - index = pd.MultiIndex.from_tuples(cell_flash_combinations, - names=['cell_specimen_id', 'flash_id']) - df = pd.DataFrame(index=index) - traces_list = [] - trace_timestamps_list = [] - - # Iterate though cell/flash pairs and build table - for cell_specimen_id, flash_id in itertools.product(dff_traces.index, - flashes.index): - timepoint = flashes.loc[flash_id]['start_time'] - cell_roi_id = dff_traces.loc[cell_specimen_id]['cell_roi_id'] - full_cell_trace = dff_traces.loc[cell_specimen_id, 'dff'] - trace, trace_timestamps = get_trace_around_timepoint( - full_cell_trace, - timepoint, - session.ophys_timestamps, - window_around_timepoint_seconds, - frame_rate) - mean_response = get_mean_in_window(trace, mean_response_window_seconds, - frame_rate) - baseline_response = get_mean_in_window(trace, baseline_window_seconds, - frame_rate) - traces_list.append(trace) - trace_timestamps_list.append(trace_timestamps) - df.loc[(cell_specimen_id, flash_id), 'cell_roi_id'] = int(cell_roi_id) - df.loc[(cell_specimen_id, flash_id), 'mean_response'] = mean_response - df.loc[(cell_specimen_id, - flash_id), 'baseline_response'] = baseline_response - df.insert(loc=1, column='dff_trace', value=traces_list) - df.insert(loc=2, column='dff_trace_timestamps', - value=trace_timestamps_list) - return df - - -def get_p_values_from_shuffled_spontaneous(session, flash_response_df, - response_window_duration=0.5, - number_of_shuffles=10000): - ''' - Computes the P values for each cell/flash. The P value is the - probability of observing a response of that - magnitude in the spontaneous window. The algorithm is copied from VBA - - INPUTS: - <session> a BehaviorOphysExperiment object - <flash_response_df> the flash_response_df for this session - <response_window_duration> is the duration of the - response_window that was used to compute the mean_response in - the flash_response_df. This is used here to extract an - equivalent duration df/f trace from the spontaneous timepoint - <number_of_shuffles> the number of shuffles of spontaneous - activity used to compute the pvalue - - OUTPUTS: - fdf, a copy of the flash_response_df with a new column appended - 'p_value' which is the per-flash X per-cell p-value - - ASSERTS: - each p value is bounded by 0 and 1, and does not include any NaNs - - ''' - # Organize Data - fdf = flash_response_df.copy() - st = session.stimulus_presentations.copy() - included_flashes = fdf.index.get_level_values(1).unique() - st = st[st.index.isin(included_flashes)] - - # Get Sample of Spontaneous Frames - spontaneous_frames = get_spontaneous_frames(session) - - # Compute the number of response_window frames - ophys_frame_rate = 31 # Shouldn't hard code this here - n_mean_response_window_frames = int( - np.round(response_window_duration * ophys_frame_rate, 0)) - cell_ids = np.unique(fdf.index.get_level_values(0)) - n_cells = len(cell_ids) - - # Get Shuffled responses from spontaneous frames - # get mean response for shuffles of the spontaneous activity frames - # in a window the same size as the stim response window duration - shuffled_responses = np.empty( - (n_cells, number_of_shuffles, n_mean_response_window_frames)) - idx = np.random.choice(spontaneous_frames, number_of_shuffles) - dff_traces = np.stack(session.dff_traces.to_numpy()[:, 1], axis=0) - for i in range(n_mean_response_window_frames): - shuffled_responses[:, :, i] = dff_traces[:, idx + i] - shuffled_mean = shuffled_responses.mean(axis=2) - - # compare flash responses to shuffled values and make a dataframe of - # p_value for cell_id X flash_id - iterables = [cell_ids, st.index.values] - flash_p_values = pd.DataFrame(index=pd.MultiIndex.from_product( - iterables, - names=[ - 'cell_specimen_id', - 'flash_id'])) - for i, cell_index in enumerate(cell_ids): - responses = fdf.loc[cell_index].mean_response.values - null_dist_mat = np.tile(shuffled_mean[i, :], reps=(len(responses), 1)) - actual_is_less = responses.reshape(len(responses), 1) <= null_dist_mat - p_values = np.mean(actual_is_less, axis=1) - for j in range(0, len(p_values)): - flash_p_values.at[(cell_index, j), 'p_value'] = p_values[j] - fdf = pd.concat([fdf, flash_p_values], axis=1) - - # Test to ensure p values are bounded between 0 and 1, and dont include - # NaNs - assert np.all(fdf['p_value'].values <= 1) - assert np.all(fdf['p_value'].values >= 0) - assert np.all(~np.isnan(fdf['p_value'].values)) - - return fdf - - -def get_spontaneous_frames(session): - ''' - Returns a list of the frames that occur during the before and after - spontaneous windows. This is copied from VBA. Does not use the full - spontaneous period because that is what VBA did. It only uses 4 - minutes of the before and after spontaneous period. - - INPUTS: - <session> a BehaviorOphysExperiment object to get all the - spontaneous frames - - OUTPUTS: a list of the frames during the spontaneous period - ''' - st = session.stimulus_presentations.copy() - # dont use full 5 mins to avoid fingerprint and countdown - # spont_duration_frames = 4 * 60 * 60 # 4 mins * * 60s/min * 60Hz - spont_duration = 4 * 60 # 4mins * 60sec - - # for spontaneous at beginning of session - behavior_start_time = st.iloc[0].start_time - spontaneous_start_time_pre = behavior_start_time - spont_duration - spontaneous_end_time_pre = behavior_start_time - spontaneous_start_frame_pre = get_successive_frame_list( - spontaneous_start_time_pre, session.ophys_timestamps) - spontaneous_end_frame_pre = get_successive_frame_list( - spontaneous_end_time_pre, session.ophys_timestamps) - spontaneous_frames_pre = np.arange(spontaneous_start_frame_pre, - spontaneous_end_frame_pre, 1) - - # for spontaneous epoch at end of session - behavior_end_time = st.iloc[-1].stop_time - spontaneous_start_time_post = behavior_end_time + 0.5 - spontaneous_end_time_post = behavior_end_time + spont_duration - spontaneous_start_frame_post = get_successive_frame_list( - spontaneous_start_time_post, session.ophys_timestamps) - spontaneous_end_frame_post = get_successive_frame_list( - spontaneous_end_time_post, session.ophys_timestamps) - spontaneous_frames_post = np.arange(spontaneous_start_frame_post, - spontaneous_end_frame_post, 1) - - # add them together - spontaneous_frames = list(spontaneous_frames_pre) + ( - list(spontaneous_frames_post)) - return spontaneous_frames - - -def get_successive_frame_list(timepoints_array, timestamps): - ''' - Returns the next frame after timestamps in timepoints_array - copied from VBA - ''' - # This is a modification of get_nearest_frame for speedup - # This implementation looks for the first 2p frame consecutive to the stim - successive_frames = np.searchsorted(timestamps, timepoints_array) - return successive_frames - - -def add_image_name(session, fdf): - ''' - Adds a column to flash_response_df with the image_name taken from - the stimulus_presentations table - Slow to run, could probably be improved with some more intelligent - use of pandas - - INPUTS: - <session> a BehaviorOphysExperiment object - <fdf> a flash_response_df for this session - - OUTPUTS: - fdf, with a new column appended 'image_name' which gives the image - identity (like 'im066') for each flash. - ''' - - fdf = fdf.reset_index() - fdf = fdf.set_index('flash_id') - fdf['image_name'] = '' - # So slow!!! - for stim_id in np.unique(fdf.index.values): - fdf.loc[stim_id, 'image_name'] = session.stimulus_presentations.loc[ - stim_id].image_name - fdf = fdf.reset_index() - fdf = fdf.set_index(['cell_specimen_id', 'flash_id']) - return fdf - - -def annotate_flash_response_df_with_pref_stim(fdf): - ''' - Adds a column to flash_response_df with a boolean value of whether - that flash was that cells pref image. - Computes preferred image by looking for the image that on average - evokes the largest response. - Slow to run, could probably be improved with more intelligent pandas - use - - INPUTS: - fdf, a flash_response_dataframe - - RETURNS: - fdf, appended with 'pref_stim' column - - ASSERTS: - each cell has one unique preferred_stimulus - - ''' - # Prepare dataframe - fdf = fdf.reset_index() - if 'cell_specimen_id' in fdf.keys(): - cell_key = 'cell_specimen_id' - else: - cell_key = 'cell' - - # Set up empty column - fdf['pref_stim'] = False - - # Compute average response for each image - mean_response = fdf.groupby([cell_key, 'image_name']).apply(get_mean_sem) - m = mean_response.unstack() - - # Iterate through each cell and find which image evoked the largest - # average response - for cell in m.index: - temp = np.where(m.loc[cell]['mean_response'].values == np.nanmax( - m.loc[cell]['mean_response'].values))[0] - # If the mean_response was NaN, then temp is empty, so we have this - # check here - if len(temp) > 0: - image_index = temp[0] - pref_image = m.loc[cell]['mean_response'].index[image_index] - # find all repeats of that cell X pref_image, and set - # 'pref_stim' to True - cell_flash_pairs = fdf[ - (fdf[cell_key] == cell) & (fdf.image_name == pref_image)].index - fdf.loc[cell_flash_pairs, 'pref_stim'] = True - - # Test to ensure preferred stimulus is unique for each cell - for cell in fdf['cell_specimen_id'].unique(): - assert len(fdf.set_index('cell_specimen_id').loc[cell].query( - 'pref_stim').image_name.unique()) == 1 - - # Reset the df index - fdf = fdf.set_index(['cell_specimen_id', 'flash_id']) - return fdf - - -def get_mean_sem(group): - ''' - Returns the mean and sem of the mean_response values for all entries - in the group. Copied from VBA - - INPUTS: - group is a pandas group - - Output, a pandas series with the average 'mean_response' from the - group, and the sem 'mean_response' from the group - ''' - mean_response = np.mean(group['mean_response']) - sem_response = np.std(group['mean_response'].values) / np.sqrt( - len(group['mean_response'].values)) - return pd.Series( - {'mean_response': mean_response, 'sem_response': sem_response}) - - -if __name__ == '__main__': - - case = 0 - - if case == 0: - # This is the main usage case. - - # Grab the experiment ID - experiment_id = sys.argv[1] - - # Define the cache - cache_json = { - 'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys' - '/visual_behavior/SWDB_2019/' - 'visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys' - '/visual_behavior/SWDB_2019/nwb_files', - 'analysis_files_base_dir': - '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior' - '/SWDB_2019/extra_files' - } - - # load the session - cache = bpc.BehaviorProjectCache(cache_json) - nwb_path = cache.get_nwb_filepath(experiment_id) - api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) - session = BehaviorOphysExperiment(api) - - # Where to save the results - output_path = '/allen/programs/braintv/workgroups/nc-ophys' \ - '/visual_behavior/SWDB_2019/' \ - 'flash_response_500msec_response' - - # Define parameters for dff_trace, and response_window - response_analysis_params = { - 'window_around_timepoint_seconds': [-.5, .75], # -500ms, 750ms - 'response_window_duration_seconds': 0.5, - 'baseline_window_duration_seconds': 0.5} - - # compute the base flash_response_df - flash_response_df = get_flash_response_df(session, - response_analysis_params) - - # Add p_value, image_name, and pref_stim - flash_response_df = get_p_values_from_shuffled_spontaneous( - session, - flash_response_df) - flash_response_df = add_image_name(session, flash_response_df) - flash_response_df = annotate_flash_response_df_with_pref_stim( - flash_response_df) - - # Test columns in flash_response_df - for new_key in ['cell_roi_id', 'mean_response', 'baseline_response', - 'dff_trace', 'dff_trace_timestamps', 'p_value', - 'image_name', 'pref_stim']: - assert new_key in flash_response_df.keys() - - # Save the flash_response_df to file - output_fn = os.path.join(output_path, 'flash_response_df_{}.h5'.format( - experiment_id)) - print('Writing flash response df to {}'.format(output_fn)) - flash_response_df.to_hdf(output_fn, key='df', complib='bzip2', - complevel=9) - - elif case == 1: - # This case is just for debugging. It computes the flash_response_df - # on a truncated portion of the data. - nwb_path = '/allen/programs/braintv/workgroups/nc-ophys' \ - '/visual_behavior/SWDB_2019/nwb_files' \ - '/behavior_ophys_session_880961028.nwb' - api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) - session = BehaviorOphysExperiment(api) - - # Small data for testing - session.__dict__['dff_traces'].value = session.dff_traces.iloc[:5] - session.__dict__[ - 'stimulus_presentations'].value = \ - session.stimulus_presentations.iloc[ - :20] - - response_analysis_params = { - 'window_around_timepoint_seconds': [-.5, .75], # -500ms, 750ms - 'response_window_duration_seconds': 0.5, - 'baseline_window_duration_seconds': 0.5} - - flash_response_df = get_flash_response_df(session, - response_analysis_params) - flash_response_df = get_p_values_from_shuffled_spontaneous( - session, - flash_response_df) - flash_response_df = add_image_name(session, flash_response_df) - flash_response_df = annotate_flash_response_df_with_pref_stim( - flash_response_df) - - # Test columns in flash_response_df - for new_key in ['cell_roi_id', 'mean_response', 'baseline_response', - 'dff_trace', 'dff_trace_timestamps', 'p_value', - 'image_name', 'pref_stim']: - assert new_key in flash_response_df.keys() diff --git a/allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py b/allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py deleted file mode 100644 index faa750f7c7..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py +++ /dev/null @@ -1,338 +0,0 @@ -import sys -import os -import numpy as np -import pandas as pd -from scipy import stats -import itertools - -from allensdk.brain_observatory.behavior.swdb import \ - behavior_project_cache as bpc -from importlib import reload - -from allensdk.brain_observatory.behavior.swdb.analysis_tools import \ - get_trace_around_timepoint, get_mean_in_window - -reload(bpc) - -''' - This file contains functions and a script for computing the - trial_response_df dataframe. - This file was hastily constructed before friday harbor. Places where - there are known issues are flagged with PROBLEM -''' - - -def add_p_vals_tr(tr, response_window=[4, 4.5]): - ''' - Computes the p value for each cell's response on each trial. The - p-value is computed using the function 'get_p_val' - - INPUT: - tr, trial_response_dataframe - response_window, the time points in the dff trace to use for - computing the p-value. - PROBLEM: The default value here assumes that the - dff_trace starts 4 seconds before the change time. - This should be set up with more care and flexibility. - - OUTPUTS: - tr, the same trial_response_dataframe, with a new column 'p_value' - appended. - - ASSERTS: - tr['p_value'] is inclusively bounded between 0 and 1, and does not - include NaNs - ''' - - # Set up empty column - tr['p_value'] = 1. - ophys_frame_rate = 31. # Shouldn't hard code this PROBLEM - - # Iterate over trial/cell pairs, and compute p-value - for index, row in tr.iterrows(): - tr.at[index, 'p_value'] = get_p_val(row.dff_trace, response_window, - ophys_frame_rate) - - # Test to ensure p values are bounded between 0 and 1, and dont include - # NaNs - assert np.all(tr['p_value'].values <= 1) - assert np.all(tr['p_value'].values >= 0) - assert np.all(~np.isnan(tr['p_value'].values)) - - return tr - - -def get_p_val(trace, response_window, frame_rate): - ''' - Computes a p-value for the trace by comparing the dff in the - response_window to the same sized trace before the response_window. - PROBLEM: This should be computed by comparing to spontaneous - activity to be consistent with the flash_response_df - - INPUTS: - trace, the dff trace for this cell/trial - response_window, [start_time, end_time] the time in seconds from the - start of trace to asses whether the activity is significant - frame_rate, the number of samples in trace per second. - - OUTPUTS: - a p-value - ''' - response_window_duration = response_window[1] - response_window[0] - baseline_end = int(response_window[0] * frame_rate) - baseline_start = int( - (response_window[0] - response_window_duration) * frame_rate) - stim_start = int(response_window[0] * frame_rate) - stim_end = int( - (response_window[0] + response_window_duration) * frame_rate) - (_, p) = stats.f_oneway(trace[baseline_start:baseline_end], - trace[stim_start:stim_end]) - return p - - -def annotate_trial_response_df_with_pref_stim(trial_response_df): - ''' - Computes the preferred stimulus for each cell/trial combination. - Preferred image is computed by seeing which image evoked the largest - average mean_response across all change_images. - - INPUTS: - trial_response_df, the trial_response_df to be annotated - - OUTPUTS: - a copy of trial_response_df with a new column appended 'pref_stim' - which is a boolean TRUE/FALSE for whether that change_image was that - cell's preferred image. - - ASSERTS: - Each cell has one unique preferred stimulus - ''' - - # Copy the trial_response_df - rdf = trial_response_df.copy() - - # Set up empty column - rdf['pref_stim'] = False - - # get average mean_response for each cell X change_image - mean_response = rdf.groupby( - ['cell_specimen_id', 'change_image_name']).apply(get_mean_sem_trace) - m = mean_response.unstack() - - # set index to be cell/image pairs - rdf = rdf.reset_index() - rdf = rdf.set_index(['cell_specimen_id', 'change_image_name']) - - # Iterate through cells, and determine which change_image evoked the - # largest response - for cell in m.index: - image_index = np.where(m.loc[cell]['mean_response'].values == np.max( - m.loc[cell]['mean_response'].values))[0][0] - pref_image = m.loc[cell]['mean_response'].index[image_index] - - # Update the cell X change_image pairs to have the pref_stim set to - # True - rdf.at[(cell, pref_image), 'pref_stim'] = True - - # Test to ensure preferred stimulus is unique for each cell - for cell in rdf.reset_index()['cell_specimen_id'].unique(): - assert len( - rdf.reset_index().set_index('cell_specimen_id').loc[cell].query( - 'pref_stim').change_image_name.unique()) == 1 - - # Reset index to be cell/trial pairs - rdf = rdf.reset_index() - rdf = rdf.set_index(['cell_specimen_id', 'trial_id']) - return rdf - - -def get_mean_sem_trace(group): - ''' - Computes the average and sem of the mean_response column - - INPUTS: - group, a pandas group - - OUTPUT: - a pandas series with the mean_response, sem_response, mean_trace, - sem_trace, and mean_responses computed for the group. - ''' - mean_response = np.mean(group['mean_response']) - mean_responses = group['mean_response'].values - sem_response = np.std(group['mean_response'].values) / np.sqrt( - len(group['mean_response'].values)) - mean_trace = np.mean(group['dff_trace']) - sem_trace = np.std(group['dff_trace'].values) / np.sqrt( - len(group['dff_trace'].values)) - return pd.Series( - {'mean_response': mean_response, 'sem_response': sem_response, - 'mean_trace': mean_trace, 'sem_trace': sem_trace, - 'mean_responses': mean_responses}) - - -def get_trial_response_df(session, response_analysis_params): - ''' - Computes the trial_response_df for the session - PROBLEM: Ignores aborted trials - - INPUTS: - session, a behaviorOphysSession object to be analyzed - response_analysis_params, a dictionary with keys: - 'window_around_timepoint_seconds' The window around the - change_time to use in the dff trace - 'response_window_duration_seconds' The duration after the - change time to use in the mean_response - 'baseline_window_duration_seconds' The duration before the - change time to use as the baseline_response - - OUTPUTS: - trial_response_df, a pandas dataframe with multi-index ( - cell_specimen_id/trial_id), and columns: - cell_roi_id, this sessions roi_id - mean_response, the average dff in the response_window - baseline_response, the average dff in the baseline window - dff_trace, the dff_trace in the window_around_timepoint_seconds - dff_trace_timestamps, the timestamps for the dff_trace - ''' - frame_rate = 31. # PROBLEM, shouldnt hard code this here - - # get data to analyze - dff_traces = session.dff_traces.copy() - trials = session.trials.copy() - trials = trials[~trials.aborted] # PROBLEM - - # get params to define response window, in seconds - window_around_timepoint_seconds = response_analysis_params[ - 'window_around_timepoint_seconds'] - response_window_duration_seconds = response_analysis_params[ - 'response_window_duration_seconds'] - baseline_window_duration_seconds = response_analysis_params[ - 'baseline_window_duration_seconds'] - mean_response_window_seconds = [np.abs(window_around_timepoint_seconds[0]), - np.abs(window_around_timepoint_seconds[ - 0]) + - response_window_duration_seconds] - baseline_window_seconds = [np.abs( - window_around_timepoint_seconds[0]) - baseline_window_duration_seconds, - np.abs(window_around_timepoint_seconds[0])] - - # Set up multi-index dataframe - cell_trial_combinations = itertools.product(dff_traces.index, trials.index) - index = pd.MultiIndex.from_tuples(cell_trial_combinations, - names=['cell_specimen_id', 'trial_id']) - df = pd.DataFrame(index=index) - - # Iterate through cell/trial pairs, and construct the columns - traces_list = [] - trace_timestamps_list = [] - for cell_specimen_id, trial_id in itertools.product(dff_traces.index, - trials.index): - timepoint = trials.loc[trial_id]['change_time'] - cell_roi_id = dff_traces.loc[cell_specimen_id]['cell_roi_id'] - full_cell_trace = dff_traces.loc[cell_specimen_id, 'dff'] - trace, trace_timestamps = get_trace_around_timepoint( - full_cell_trace, - timepoint, - session.ophys_timestamps, - window_around_timepoint_seconds, - frame_rate) - mean_response = get_mean_in_window(trace, mean_response_window_seconds, - frame_rate) - baseline_response = get_mean_in_window(trace, baseline_window_seconds, - frame_rate) - - traces_list.append(trace) - trace_timestamps_list.append(trace_timestamps) - df.loc[(cell_specimen_id, trial_id), 'cell_roi_id'] = int(cell_roi_id) - df.loc[(cell_specimen_id, trial_id), 'mean_response'] = mean_response - df.loc[(cell_specimen_id, - trial_id), 'baseline_response'] = baseline_response - df.insert(loc=1, column='dff_trace', value=traces_list) - df.insert(loc=2, column='dff_trace_timestamps', - value=trace_timestamps_list) - return df - - -if __name__ == '__main__': - # Load cache - cache_json = { - 'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys' - '/visual_behavior/SWDB_2019/' - 'visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys' - '/visual_behavior/SWDB_2019/nwb_files', - 'analysis_files_base_dir': - '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior' - '/SWDB_2019/extra_files_final' - } - cache = bpc.BehaviorProjectCache(cache_json) - - case = 0 - if case == 0: - # this is the main use case - experiment_id = sys.argv[1] # get experiment_id to analyze - - # Load session object - # experiment_id = cache.manifest.iloc[5]['ophys_experiment_id'] - # nwb_path = cache.get_nwb_filepath(experiment_id) - # api = BehaviorOphysNwbApi(nwb_path, filter_invalid_rois=True) - # session = BehaviorOphysExperiment(api) - - # Get the session using the cache so that the change time fix is - # applied - session = cache.get_session(experiment_id) - change_times = session.trials['change_time'][ - ~pd.isnull(session.trials['change_time'])].values - flash_times = session.stimulus_presentations['start_time'].values - assert np.all(np.isin(change_times, flash_times)) - - output_path = '/allen/programs/braintv/workgroups/nc-ophys' \ - '/visual_behavior/SWDB_2019/extra_files_final' - - response_analysis_params = {'window_around_timepoint_seconds': [-4, 8], - 'response_window_duration_seconds': 0.5, - 'baseline_window_duration_seconds': 0.5} - - trial_response_df = get_trial_response_df(session, - response_analysis_params) - - trial_metadata = session.trials.copy() - trial_metadata.index.names = ['trial_id'] - trial_response_df = trial_response_df.join(trial_metadata) - trial_response_df = add_p_vals_tr(trial_response_df) - trial_response_df = annotate_trial_response_df_with_pref_stim( - trial_response_df) - - output_fn = os.path.join(output_path, 'trial_response_df_{}.h5'.format( - experiment_id)) - print('Writing trial response df to {}'.format(output_fn)) - trial_response_df.to_hdf(output_fn, key='df', complib='bzip2', - complevel=9) - - elif case == 1: - # This is a debugging case - experiment_id = 846487947 - - session = cache.get_session(experiment_id) - - change_times = session.trials['change_time'][ - ~pd.isnull(session.trials['change_time'])].values - flash_times = session.stimulus_presentations['start_time'].values - assert np.all(np.isin(change_times, flash_times)) - - output_path = '/allen/programs/braintv/workgroups/nc-ophys' \ - '/visual_behavior/SWDB_2019/extra_files_final' - - response_analysis_params = {'window_around_timepoint_seconds': [-4, 8], - 'response_window_duration_seconds': 0.5, - 'baseline_window_duration_seconds': 0.5} - - trial_response_df = get_trial_response_df(session, - response_analysis_params) - - trial_metadata = session.trials.copy() - trial_metadata.index.names = ['trial_id'] - trial_response_df = trial_response_df.join(trial_metadata) - trial_response_df = add_p_vals_tr(trial_response_df) - trial_response_df = annotate_trial_response_df_with_pref_stim( - trial_response_df) diff --git a/allensdk/brain_observatory/behavior/swdb/summary_figures.py b/allensdk/brain_observatory/behavior/swdb/summary_figures.py deleted file mode 100644 index 080536f498..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/summary_figures.py +++ /dev/null @@ -1,560 +0,0 @@ -import os -import numpy as np -import pandas as pd -import matplotlib.pyplot as plt -import seaborn as sns - -sns.set_context('notebook', font_scale=1.5, rc={'lines.markeredgewidth': 2}) -sns.set_style('white') -sns.set_palette('deep'); - -from allensdk.brain_observatory.behavior.swdb import behavior_project_cache as bpc -from allensdk.brain_observatory.behavior.swdb import utilities as ut - - -def get_color_for_image_name(session, image_name): - images = np.sort(session.stimulus_presentations.image_name.unique()) - images = images[images != 'omitted'] - colors = sns.color_palette("hls", len(images)) - image_index = np.where(images == image_name)[0][0] - color = colors[image_index] - return color - - -def addSpan(ax, amin, amax, color='k', alpha=0.3, axtype='x', zorder=1): - if axtype == 'x': - ax.axvspan(amin, amax, facecolor=color, edgecolor='none', alpha=alpha, linewidth=0, zorder=zorder) - if axtype == 'y': - ax.axhspan(amin, amax, facecolor=color, edgecolor='none', alpha=alpha, linewidth=0, zorder=zorder) - - -def add_stim_color_span(session, ax, xlim=None): - # xlim should be in seconds - if xlim is None: - stim_table = session.stimulus_presentations.copy() - else: - stim_table = session.stimulus_presentations.copy() - stim_table = stim_table[(stim_table.start_time >= xlim[0]) & (stim_table.stop_time <= xlim[1])] - if 'omitted' in stim_table.keys(): - stim_table = stim_table[stim_table.omitted == False].copy() - for idx in stim_table.index: - start_time = stim_table.loc[idx]['start_time'] - end_time = stim_table.loc[idx]['stop_time'] - image_name = stim_table.loc[idx]['image_name'] - color = get_color_for_image_name(session, image_name) - addSpan(ax, start_time, end_time, color=color) - return ax - - -def plot_behavior_events(session, ax, behavior_only=False): - lick_times = session.licks.timestamps.values - reward_times = session.rewards.timestamps.values - if behavior_only: - lick_y = 0 - reward_y = 0.25 - ax.set_ylim([-0.5, 1]) - else: - ymin, ymax = ax.get_ylim() - lick_y = ymin + (ymax * 0.05) - reward_y = ymin + (ymax * 0.1) - lick_y_array = np.empty(len(lick_times)) - lick_y_array[:] = lick_y - reward_y_array = np.empty(len(reward_times)) - reward_y_array[:] = reward_y - ax.plot(lick_times, lick_y_array, '|', color='g', markeredgewidth=1, label='licks') - ax.plot(reward_times, reward_y_array, 'o', markerfacecolor='purple', markeredgecolor='purple', markeredgewidth=0.1, - label='rewards') - return ax - - -def restrict_axes(xmin, xmax, interval, ax): - xticks = np.arange(xmin, xmax, interval) - ax.set_xticks(xticks) - ax.set_xlim([xmin, xmax]) - return ax - - -def plot_behavior_events_trace(session, xmin=360, length=3, ax=None, save_dir=None): - xmax = xmin + 60 * length - interval = 20 - if ax is None: - figsize = (15, 4) - fig, ax = plt.subplots(figsize=figsize) - ax.plot(session.running_speed.timestamps, session.running_speed.speed, color=sns.color_palette()[0]) - ax = add_stim_color_span(session, ax, xlim=[xmin, xmax]) - ax = plot_behavior_events(session, ax) - ax = restrict_axes(xmin, xmax, interval, ax) - ax.set_ylabel('running speed (cm/s)') - ax.set_xlabel('time (sec)') - if save_dir: - fig.tight_layout() - ut.save_figure(fig, figsize, save_dir, 'behavior_events', - str(session.metadata['ophys_experiment_id']) + '_' + str(xmin)) - plt.close() - return ax - - -def plot_traces_heatmap(session, ax=None): - dff_traces = session.dff_traces - dff_traces_array = np.vstack(dff_traces.dff.values) - if ax is None: - fig, ax = plt.subplots(figsize=(20, 5)) - cax = ax.pcolormesh(dff_traces_array, cmap='magma', vmin=0, vmax=np.percentile(dff_traces_array, 99)) - ax.set_yticks(np.arange(0, len(dff_traces_array)), 10); - ax.set_ylabel('cells') - ax.set_xlabel('time (sec)') - ax.set_xticks(np.arange(0, len(session.ophys_timestamps), 10*60*31.)); - ax.set_xticklabels(np.arange(0, session.ophys_timestamps[-1], 10*60)); - cb = plt.colorbar(cax, pad=0.015) - cb.set_label('dF/F', labelpad=3) - return ax - - -def plot_behavior_segment(session, xlims=[620, 640], ax=None): - if ax is None: - fig, ax = plt.subplots() - ax.plot(session.running_speed.timestamps, session.running_speed.speed) - ax.set_ylabel('running speed\ncm/s') - ax.set_xlabel('time (s)') - ax.set_xlim(xlims) - ax.set_ylim(-15, 60) - ax.plot(session.rewards.index.values, -10 * np.ones(np.shape(session.rewards.index.values)), 'ro') - ax.vlines(session.licks.timestamps.values, ymin=-10, ymax=-5) - image_index = -1 - last_omitted = False - for index, row in session.stimulus_presentations.iterrows(): - if row.omitted is False: - ax.axvspan(row.start_time, row.stop_time, alpha=0.3, facecolor='gray') - if not (row.image_index == image_index) and (last_omitted==False): - ax.axvspan(row.start_time, row.stop_time, alpha=0.3, facecolor='blue') - image_index = row.image_index - last_omitted = row.omitted - return ax - - -def plot_lick_raster(trials, ax=None): - trials = trials[trials.aborted == False] - trials = trials.reset_index() - if ax is None: - fig, ax = plt.subplots(figsize=(5, 10)) - for trial_index, trial_data in trials.iterrows(): - # get times relative to change time - lick_times = [(t - trial_data.change_time) for t in trial_data.lick_times] - reward_time = [(t - trial_data.change_time) for t in [trial_data.reward_time]] - # plot reward times - if len(reward_time) > 0: - ax.plot(reward_time[0], trial_index + 0.5, '.', color='b', label='reward', markersize=6) - # plot lick times - ax.vlines(lick_times, trial_index, trial_index + 1, color='k', linewidth=1) - # put a line at the change time - ax.vlines(0, trial_index, trial_index + 1, color=[.5, .5, .5], linewidth=1) - # gray bar for response window - ax.axvspan(0.15, 0.75, facecolor='gray', alpha=.3, edgecolor='none') - ax.grid(False) - ax.set_ylim(0, len(trials)) - ax.set_xlim([-1, 4]) - ax.set_ylabel('trials') - ax.set_xlabel('time (sec)') - ax.set_title('lick raster') - plt.gca().invert_yaxis() - return ax - - -def plot_trace(timestamps, trace, ax=None, xlabel='time (seconds)', ylabel='fluorescence', title='roi', - color=sns.color_palette()[0]): - if ax is None: - fig, ax = plt.subplots(figsize=(15, 5)) - ax.plot(timestamps, trace, color=color, linewidth=2) - ax.set_xlabel(xlabel) - ax.set_ylabel(ylabel) - ax.set_title(title) - ax.set_xlim([timestamps[0], timestamps[-1]]) - return ax - - -def plot_trace(timestamps, trace, ax=None, xlabel='time (seconds)', ylabel='fluorescence', title='roi', - color=sns.color_palette()[0]): - if ax is None: - fig, ax = plt.subplots(figsize=(15, 5)) - ax.plot(timestamps, trace, color=color, linewidth=2) - ax.set_xlabel(xlabel) - ax.set_ylabel(ylabel) - ax.set_title(title) - ax.set_xlim([timestamps[0], timestamps[-1]]) - return ax - - -def plot_example_traces_and_behavior(session, xmin_seconds, length_mins, cell_label=False, save_dir=None): - traces = np.stack(session.dff_traces.dff.values) - cell_indices = ut.get_active_cell_indices(traces) - - interval_seconds = 10 - xmax_seconds = xmin_seconds + (length_mins * 60) + 1 - xlim = [xmin_seconds, xmax_seconds] - - figsize = (14, 10) - fig, ax = plt.subplots(len(cell_indices) + 1, 1, figsize=figsize) - ax = ax.ravel() - - ymins = [] - ymaxs = [] - for i, cell_index in enumerate(cell_indices): - ax[i].tick_params(reset=True, which='both', bottom='off', top='off', right='off', left='off', - labeltop='off', labelright='off', labelleft='off', labelbottom='off') - ax[i] = plot_trace(session.ophys_timestamps, traces[cell_index, :], ax=ax[i], - title='', ylabel=str(cell_index), color=[.5, .5, .5]) - ax[i] = add_stim_color_span(session, ax=ax[i], xlim=xlim) - ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) - ax[i].set_xticks([]) - ax[i].set_xlabel('') - ax[i].set_xlim(xlim) - ymin, ymax = ax[i].get_ylim() - ymins.append(ymin) - ymaxs.append(ymax) - if cell_label: - ax[i].set_ylabel('cell ' + str(i), fontsize=12) - else: - ax[i].set_ylabel('') - ax[i].set_yticks([]) - sns.despine(ax=ax[i], left=True, bottom=True) - ymin, ymax = ax[i].get_ylim() - if 'Vip' in session.metadata['full_genotype']: - ax[i].vlines(x=xmin_seconds, ymin=0, ymax=2, linewidth=4) - ax[i].set_ylim(ymin=-0.5, ymax=5) - elif 'Slc' in session.metadata['full_genotype']: - ax[i].vlines(x=xmin_seconds, ymin=0, ymax=1, linewidth=4) - ax[i].set_ylim(ymin=-0.5, ymax=3) - ax[i].get_xaxis().set_ticks([]) - ax[i].get_yaxis().set_ticks([]) - ax[i].tick_params(which='both', bottom='off', top='off', right='off', left='off', - labeltop='off', labelright='off', labelleft='off', labelbottom='off') - ax[i].set_xticklabels('') - - i += 1 - ax[i].tick_params(axis="x", bottom=True, top=False, labelbottom=True, labeltop=False) - ax[i].plot(session.running_speed.timestamps, session.running_speed.speed, color=sns.color_palette()[0]) - ax[i] = plot_behavior_events(session, ax=ax[i]) - ax[i] = add_stim_color_span(session, ax=ax[i], xlim=xlim) - ax[i] = restrict_axes(xmin_seconds, xmax_seconds, interval_seconds, ax=ax[i]) - ax[i].set_xlim(xlim) - ax[i].set_ylabel('run speed\n(cm/s)', fontsize=12) - sns.despine(ax=ax[i], left=True, bottom=True) - ax[i].set_yticklabels('') - xticks = np.arange(xmin_seconds, xmax_seconds, interval_seconds) - ax[i].set_xticks(xticks) - ax[i].set_xticklabels(xticks) - ax[i].set_xlabel('time (seconds)') - - ax[0].set_title( - str(session.metadata['ophys_experiment_id']) + '_' + session.metadata['full_genotype'].split('-')[0]) - plt.subplots_adjust(wspace=0, hspace=0) - plt.subplots_adjust(bottom=0.2) - - if save_dir: - ut.save_figure(fig, figsize, save_dir, 'example_traces', - str(session.metadata['ophys_experiment_id']) + '_' + str(xlim[0])) - - -def plot_transitions_response_heatmap(trials, ax=None): - trials = trials[trials.aborted == False] - trials['response_binary'] = [1 if response_latency < 0.75 else 0 for response_latency in - trials.response_latency.values] - - response_matrix = pd.pivot_table(trials, - values='response_binary', - index=['initial_image_name'], - columns=['change_image_name']) - if ax is None: - fig, ax = plt.subplots(figsize=(5, 5)) - ax = sns.heatmap(response_matrix, cmap='magma', square=True, annot=False, - annot_kws={"fontsize": 10}, vmin=0, vmax=1, - robust=True, cbar_kws={"drawedges": False, "shrink": 0.7, "label": 'response probability'}, ax=ax) - return ax - - - -def plot_mean_trace_heatmap(mean_df, ax=None, save_dir=None, window=[-4, 8], interval_sec=2): - """ - There must be only one row per cell in the input df. - For example, if it is a mean of the trial_response_df, select only trials where go=True before passing to this function. - """ - data = mean_df[mean_df.pref_stim == True].copy() - if ax is None: - figsize = (3, 6) - fig, ax = plt.subplots(1, 1, figsize=figsize) - - order = np.argsort(data.mean_response.values)[::-1] - cells = data.cell_specimen_id.unique()[order] - len_trace = len(data.mean_trace.values[0]) - response_array = np.empty((len(cells), len_trace)) - for x, cell_specimen_id in enumerate(cells): - tmp = data[data.cell_specimen_id == cell_specimen_id] - if len(tmp) >= 1: - trace = tmp.mean_trace.values[0] - else: - trace = np.empty((len_trace)) - trace[:] = np.nan - response_array[x, :] = trace - - sns.heatmap(data=response_array, vmin=0, vmax=np.percentile(response_array, 99), ax=ax, cmap='magma', cbar=False) - xticks, xticklabels = ut.get_xticks_xticklabels(trace, 31., interval_sec=interval_sec, window=window) - ax.set_xticks(xticks) - ax.set_xticklabels([int(x) for x in xticklabels]) - if response_array.shape[0] < 50: - interval = 10 - else: - interval = 50 - ax.set_yticks(np.arange(0, response_array.shape[0], interval)) - ax.set_yticklabels(np.arange(0, response_array.shape[0], interval)) - ax.set_xlabel('time after change (s)', fontsize=16) - ax.set_ylabel('cells') - - if save_dir: - fig.tight_layout() - ut.save_figure(fig, figsize, save_dir, 'experiment_summary', 'mean_trace_heatmap_' + condition + suffix) - return ax - - -def plot_mean_image_response_heatmap(mean_df, title=None, ax=None, save_dir=None): - df = mean_df.copy() - if 'change_image_name' in df.keys(): - image_key = 'change_image_name' - else: - image_key = 'image_name' - images = np.sort(df[image_key].unique()) - cell_list = [] - for image in images: - tmp = df[(df[image_key] == image) & (df.pref_stim == True)] - order = np.argsort(tmp.mean_response.values)[::-1] - cell_ids = list(tmp.cell_specimen_id.values[order]) - cell_list = cell_list + cell_ids - - response_matrix = np.empty((len(cell_list), len(images))) - for i, cell in enumerate(cell_list): - responses = [] - for image in images: - response = df[(df.cell_specimen_id == cell) & (df[image_key] == image)].mean_response.values[0] - responses.append(response) - response_matrix[i, :] = np.asarray(responses) - - if ax is None: - figsize = (4, 7) - fig, ax = plt.subplots(figsize=figsize) - - vmax = 0.3 - label = 'mean dF/F' - ax = sns.heatmap(response_matrix, cmap='magma', linewidths=0, linecolor='white', square=False, - vmin=0, vmax=vmax, robust=True, - cbar_kws={"drawedges": False, "shrink": 1, "label": label}, ax=ax) - - if title is None: - title = 'mean response by image' - ax.set_title(title, va='bottom', ha='center') - ax.set_xticklabels(images, rotation=90) - ax.set_ylabel('cells') - if response_matrix.shape[0] < 50: - interval = 10 - else: - interval = 50 - ax.set_yticks(np.arange(0, response_matrix.shape[0], interval)) - ax.set_yticklabels(np.arange(0, response_matrix.shape[0], interval)) - if save_dir: - fig.tight_layout() - ut.save_figure(fig, figsize, save_dir, 'experiment_summary', 'mean_image_response_heatmap' + suffix) - - -def plot_max_proj_and_roi_masks(session, save_dir=None): - figsize = (15, 5) - fig, ax = plt.subplots(1,3,figsize=figsize) - ax = ax.ravel() - - ax[0].imshow(session.max_projection, cmap='gray', vmin=0, vmax=np.amax(session.max_projection)) - ax[0].axis('off') - ax[0].set_title('max intensity projection') - - ax[1].imshow(session.segmentation_mask_image, cmap='gray') - ax[1].set_title('roi masks') - ax[1].axis('off') - - ax[2].imshow(session.max_projection, cmap='gray', vmin=0, vmax=np.amax(session.max_projection)) - ax[2].axis('off') - ax[2].set_title(str(session.metadata['ophys_experiment_id'])) - - tmp = session.segmentation_mask_image.data.copy() - mask = np.empty(session.segmentation_mask_image.data.shape, dtype=np.float) - mask[:] = np.nan - mask[tmp > 0] = 1 - cax = ax[2].imshow(mask, cmap='hsv', alpha=0.4, vmin=0, vmax=1) - - if save_dir: - ut.save_figure(fig, figsize, save_dir, 'roi_masks', str(session.metadata['ophys_experiment_id'])) - - -def placeAxesOnGrid(fig, dim=[1, 1], xspan=[0, 1], yspan=[0, 1], wspace=None, hspace=None, sharex=False, sharey=False): - ''' - Takes a figure with a gridspec defined and places an array of sub-axes on a portion of the gridspec - - Takes as arguments: - fig: figure handle - required - dim: number of rows and columns in the subaxes - defaults to 1x1 - xspan: fraction of figure that the subaxes subtends in the x-direction (0 = left edge, 1 = right edge) - yspan: fraction of figure that the subaxes subtends in the y-direction (0 = top edge, 1 = bottom edge) - wspace and hspace: white space between subaxes in vertical and horizontal directions, respectively - - returns: - subaxes handles - ''' - import matplotlib.gridspec as gridspec - - outer_grid = gridspec.GridSpec(100, 100) - inner_grid = gridspec.GridSpecFromSubplotSpec(dim[0], dim[1], - subplot_spec=outer_grid[int(100 * yspan[0]):int(100 * yspan[1]), - # flake8: noqa: E999 - int(100 * xspan[0]):int(100 * xspan[1])], wspace=wspace, - hspace=hspace) # flake8: noqa: E999 - - # NOTE: A cleaner way to do this is with list comprehension: - # inner_ax = [[0 for ii in range(dim[1])] for ii in range(dim[0])] - inner_ax = dim[0] * [dim[1] * [ - fig]] # filling the list with figure objects prevents an error when it they are later replaced by axis handles - inner_ax = np.array(inner_ax) - idx = 0 - for row in range(dim[0]): - for col in range(dim[1]): - if row > 0 and sharex == True: - share_x_with = inner_ax[0][col] - else: - share_x_with = None - - if col > 0 and sharey == True: - share_y_with = inner_ax[row][0] - else: - share_y_with = None - - inner_ax[row][col] = plt.Subplot(fig, inner_grid[idx], sharex=share_x_with, sharey=share_y_with) - fig.add_subplot(inner_ax[row, col]) - idx += 1 - - inner_ax = np.array(inner_ax).squeeze().tolist() # remove redundant dimension - return inner_ax - - -def plot_experiment_summary_figure(session, save_dir=None): - import allensdk.brain_observatory.behavior.swdb.utilities as ut - - meta = session.metadata - title = meta['driver_line'][0] + ', ' + meta['targeted_structure'] + ', ' + str(meta['imaging_depth']) + ', ' + \ - session.task_parameters['stage'] - - interval_seconds = 600 - ophys_frame_rate = int(session.metadata['ophys_frame_rate']) - - figsize = [2 * 11, 2 * 8.5] - fig = plt.figure(figsize=figsize, facecolor='white') - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.0, .2), yspan=(0, .2)) - ax.imshow(session.max_projection, cmap='gray') - ax.set_title('max intensity projection') - ax.axis('off') - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(0, .18), yspan=(.24, .4)) - trials = session.trials.copy() - trials = trials[trials.reward_rate > 1] - plot_transitions_response_heatmap(trials, ax=ax) - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.24, .86), yspan=(0, .26)) - ax = plot_traces_heatmap(session, ax=ax) - ax.set_title(title) - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.28, .92), yspan=(.32, .44)) - ax.plot(session.running_speed.timestamps, session.running_speed.speed) - ax.set_xlabel('time (seconds)') - ax.set_ylabel('running speed\n(cm/s)') - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.86, 1.), yspan=(0, .2)) - image_index = 0 - ax.imshow(session.stimulus_templates[image_index, :, :], cmap='gray') - st = session.stimulus_presentations.copy() - image_name = st[st.image_index==image_index].image_name.values[0] - ax.set_title(image_name) - ax.axis('off') - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.0, .17), yspan=(.54, .99)) - ax = plot_lick_raster(session.trials, ax=ax) - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.24, .42), yspan=(.54, .99)) - fr = session.flash_response_df - mdf = ut.get_mean_df(fr, conditions=['cell_specimen_id', 'image_name']) - plot_mean_image_response_heatmap(mdf, title=None, ax=ax) - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.52, .68), yspan=(.54, .99)) - tr = session.trial_response_df.copy() - mdf = ut.get_mean_df(tr[tr.go], conditions=['cell_specimen_id']) - mdf['pref_stim'] = True - ax = plot_mean_trace_heatmap(mdf, ax=ax, window=[-4, 8], interval_sec=2) - ax.set_title('mean trace for pref image') - ax.set_ylabel('cells') - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.76, .98), yspan=(.5, .62)) - ax.plot(session.trials.reward_rate) - ax.set_ylabel('reward rate') - ax.set_xlabel('trials') - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.76, 0.98), yspan=(.68, .8)) - plot_behavior_segment(session, xlims=[620, 640], ax=ax) - - ax = placeAxesOnGrid(fig, dim=(1, 1), xspan=(.76, .98), yspan=(.86, .99)) - traces = tr[(tr.go == True)].dff_trace.values - ax = ut.plot_mean_trace(traces, window=[-4, 8], ax=ax) - ax = ut.plot_flashes_on_trace(ax, window=[-4, 8], go_trials_only=True) - ax.set_xlabel('time after change (sec)'); - ax.set_ylabel('mean dF/F'); - - fig.tight_layout() - - if save_dir: - fig.tight_layout() - ut.save_figure(fig, figsize, save_dir, 'experiment_summary', str(experiment_id)) - - -if __name__ == '__main__': - import sys - experiment_id = sys.argv[1] - - cache_json = { - 'manifest_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/visual_behavior_data_manifest.csv', - 'nwb_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/nwb_files', - 'analysis_files_base_dir': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files', - 'analysis_files_metadata_path': '/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/cache_20190813/analysis_files_metadata.json', - } - - # cache_json = { - # 'manifest_path': r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\visual_behavior_data_manifest.csv', - # 'nwb_base_dir': r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\nwb_files', - # 'analysis_files_base_dir': r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\analysis_files', - # 'analysis_files_metadata_path':r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\analysis_files_metadata.json', - # } - - from allensdk.brain_observatory.behavior.swdb import behavior_project_cache as bpc - - cache = bpc.BehaviorProjectCache(cache_json) - manifest = cache.manifest - - # experiment_id = manifest.ophys_experiment_id.values[16] - # save_dir = r'\\allen\programs\braintv\workgroups\nc-ophys\visual_behavior\SWDB_2019\summary_figures' - - save_dir = r'/allen/programs/braintv/workgroups/nc-ophys/visual_behavior/SWDB_2019/summary_figures' - print('loading session') - session = cache.get_session(experiment_id) - print('plotting experiment summary') - plot_experiment_summary_figure(session, save_dir=save_dir) - plot_max_proj_and_roi_masks(session, save_dir=save_dir) - print('plotting example traces') - for xmin_seconds in np.arange(500, 1000, 60): - plot_example_traces_and_behavior(session, xmin_seconds=xmin_seconds, length_mins=1, save_dir=save_dir) - for xmin_seconds in np.arange(1600, 1800, 18): - plot_example_traces_and_behavior(session, xmin_seconds=xmin_seconds, length_mins=.3, save_dir=save_dir) - print('plotting behavior events') - for xmin in np.arange(0, 1200, 30): - plot_behavior_events_trace(session, xmin=xmin, length=0.5, ax=None, save_dir=save_dir) - print('done') diff --git a/allensdk/brain_observatory/behavior/swdb/utilities.py b/allensdk/brain_observatory/behavior/swdb/utilities.py deleted file mode 100644 index 36fd9e3f7f..0000000000 --- a/allensdk/brain_observatory/behavior/swdb/utilities.py +++ /dev/null @@ -1,365 +0,0 @@ -import os -import numpy as np -import pandas as pd -import seaborn as sns -import matplotlib as mpl - -''' - This file contains a set of functions that are useful in analyzing visual behavior data -''' - - -def save_figure(fig, figsize, save_dir, folder, filename, formats=['.png']): - ''' - Function for saving a figure - - INPUTS: - fig: a figure object - figsize: tuple of desired figure size - save_dir: string, the directory to save the figure - folder: string, the sub-folder to save the figure in. if the folder does not exist, it will be created - filename: string, the desired name of the saved figure - formats: a list of file formats as strings to save the figure as, ex: ['.png','.pdf'] - ''' - fig_dir = os.path.join(save_dir, folder) - if not os.path.exists(fig_dir): - os.mkdir(fig_dir) - mpl.rcParams['pdf.fonttype'] = 42 - fig.set_size_inches(figsize) - for f in formats: - fig.savefig(os.path.join(fig_dir, fig_title + f), transparent=True, orientation='landscape') - - -def get_dff_matrix(session): - ''' - Returns the dff_trace of a session as a numpy matrix - - INPUTS: - session: a behaviorOphysSession object - - OUTPUTS: - dff: a matrix of cells x dff_trace for the entire session - ''' - dff = np.stack(session.dff_traces.dff, axis=0) - return dff - - -def get_mean_df(response_df, conditions=['cell_specimen_id', 'image_name']): - ''' - Computes an analysis on a selection of responses (either flashes or trials). Computes mean_response, sem_response, the pref_stim, fraction_active_responses. - - INPUTS - response_df: the dataframe to group - conditions: the conditions to group by, the first entry should be 'cell_specimen_id', the second could be 'image_name' or 'change_image_name' - - OUTPUTS: - mdf: a dataframe with the following columns: - mean_response: the average mean_response for each condition - sem_response: the sem of the mean_response - mean_trace: the average dff trace for each condition - sem_trace: the sem of the mean_trace - mean_responses: the list of mean_responses for each element of each group - pref_stim: if conditions includes image_name or change_image_name, sets a boolean column for whether that was the cell's preferred stimulus - fraction_significant_responses: the fraction of individual image presentations or trials that were significant (p_value > 0.05) - ''' - - # Group by conditions - rdf = response_df.copy() - mdf = rdf.groupby(conditions).apply(get_mean_sem_trace) - mdf = mdf[['mean_response', 'sem_response', 'mean_trace', 'sem_trace', 'mean_responses']] - mdf = mdf.reset_index() - - # Add preferred stimulus if we can - if ('image_name' in conditions) or ('change_image_name' in conditions): - mdf = annotate_mean_df_with_pref_stim(mdf) - - # What fraction of individual responses were significant? - fraction_significant_responses = rdf.groupby(conditions).apply(get_fraction_significant_responses) - fraction_significant_responses = fraction_significant_responses.reset_index() - mdf['fraction_significant_responses'] = fraction_significant_responses.fraction_significant_responses - - if 'index' in mdf.keys(): - mdf = mdf.drop(columns=['index']) - return mdf - - -def get_mean_sem_trace(group): - ''' - Computes the average and sem of the mean_response column - - INPUTS: - group: a pandas groupby object - - OUTPUT: - a pandas series with the mean_response, sem_response, mean_trace, sem_trace, and mean_responses computed for the group. - ''' - mean_response = np.mean(group['mean_response']) - mean_responses = group['mean_response'].values - sem_response = np.std(group['mean_response'].values) / np.sqrt(len(group['mean_response'].values)) - mean_trace = np.mean(group['dff_trace']) - sem_trace = np.std(group['dff_trace'].values) / np.sqrt(len(group['dff_trace'].values)) - return pd.Series({'mean_response': mean_response, 'sem_response': sem_response, - 'mean_trace': mean_trace, 'sem_trace': sem_trace, - 'mean_responses': mean_responses}) - - -def annotate_mean_df_with_pref_stim(mean_df): - ''' - Computes the preferred stimulus for each cell/trial or cell/flash combination. Preferred image is computed by seeing which image evoked the largest average mean_response across all images. - - INPUTS: - mean_df: the mean_df to be annotated - - OUTPUTS: - mean_df with a new column appended 'pref_stim' which is a boolean TRUE/FALSE for whether that image was that cell's preferred image. - - ASSERTS: - Each cell has one unique preferred stimulus - ''' - - # Are we dealing with flash_response or trial_response - if 'image_name' in mean_df.keys(): - image_name = 'image_name' - else: - image_name = 'change_image_name' - - # set up dataframe - mdf = mean_df.reset_index() - mdf['pref_stim'] = False - - # Iterate through cells in df - for cell in mdf['cell_specimen_id'].unique(): - mc = mdf[(mdf['cell_specimen_id'] == cell)] - mc = mc[mc[image_name] != 'omitted'] - temp = mc[(mc.mean_response == np.max(mc.mean_response.values))][image_name].values - if len(temp) > 0: # need this test if the mean_response was nan - pref_image = temp[0] - # PROBLEM, this is slow, and sets on slice, better to use mdf.at[test, 'pref_stim'] - row = mdf[(mdf['cell_specimen_id'] == cell) & (mdf[image_name] == pref_image)].index - mdf.loc[row, 'pref_stim'] = True - - # Test to ensure preferred stimulus is unique for each cell - for cell in mdf.reset_index()['cell_specimen_id'].unique(): - if image_name == 'image_name': - assert len( - mdf.reset_index().set_index('cell_specimen_id').loc[cell].query('pref_stim').image_name.unique()) == 1 - else: - assert len(mdf.reset_index().set_index('cell_specimen_id').loc[cell].query( - 'pref_stim').change_image_name.unique()) == 1 - return mdf - - -def get_fraction_significant_responses(group, threshold=0.05): - ''' - Calculates the fraction of trials or flashes that have a p_value below threshold - Note that this function does not handle multiple comparisons - - INPUT: - group: a pandas groupby object - threshold: the p_value threshold for significance for an individual response - - OUTPUT: - a pandas series with column 'fraction_significant_responses' - ''' - fraction_significant_responses = len(group[group.p_value < threshold]) / float(len(group)) - return pd.Series({'fraction_significant_responses': fraction_significant_responses}) - - -def get_xticks_xticklabels(trace, ophys_frame_rate=31., interval_sec=1, window=[-4, 8]): - """ - Function that accepts a timeseries, evaluates the number of points in the trace, - and converts from acquisition frames to timestamps relative to a given window of time covered by the trace. - - :param trace: a single trace where length = the number of timepoints - :param ophys_frame_rate: ophys frame rate if plotting a calcium trace, stimulus frame rate if plotting running speed - :param interval_sec: interval in seconds in between labels - - :return: xticks, xticklabels = xticks in units of ophys frames frames, xticklabels in seconds relative - """ - interval_frames = interval_sec * ophys_frame_rate - n_frames = len(trace) - n_sec = n_frames / ophys_frame_rate - xticks = np.arange(0, n_frames + 1, interval_frames) - xticklabels = np.arange(0, n_sec + 0.1, interval_sec) - if not window: - xticklabels = xticklabels - n_sec / 2 - else: - xticklabels = xticklabels + window[0] - if interval_sec >= 1: - xticklabels = [int(x) for x in xticklabels] - return xticks, xticklabels - - -def plot_mean_trace(traces, window=[-4, 8], interval_sec=1, ylabel='dF/F', legend_label=None, color='k', ax=None): - """ - Function that accepts an array of single trial traces and plots the mean and SEM of the trace, with xticklabels in seconds - - :param traces: array of individual trial traces to average and plot. traces must be of equal length - :param frame_rate: ophys frame rate if plotting a calcium trace, stimulus frame rate if plotting running speed - :param y_label: 'dF/F' for calcium trace, 'running speed (cm/s)' for running speed trace - :param legend_label: string describing trace for legend (ex: 'go', 'catch', image name or other condition identifier) - :param color: color to plot the trace - :param interval_sec: interval in seconds for x_axis labels - :param xlims: range in seconds to plot. Must be <= the length of the traces - :param ax: if None, create figure and axes to plot. If axis handle is provided, plot is created on that axis - - :return: axis handle - """ - ophys_frame_rate = 31. # PROBLEM, shouldn't hard code this here - if ax is None: - fig, ax = plt.subplots() - if len(traces) > 0: - trace = np.mean(traces, axis=0) - times = np.arange(0, len(trace), 1) - sem = (traces.std()) / np.sqrt(float(len(traces))) - ax.plot(trace, label=legend_label, linewidth=3, color=color) - ax.fill_between(times, trace + sem, trace - sem, alpha=0.5, color=color) - - xticks, xticklabels = get_xticks_xticklabels(trace, ophys_frame_rate, interval_sec, window=window) - ax.set_xticks(xticks) - if interval_sec < 1: - ax.set_xticklabels(xticklabels) - else: - ax.set_xticklabels([int(x) for x in xticklabels]) - ax.set_xlim(0, len(trace)) - ax.set_xlabel('time (sec)') - ax.set_ylabel(ylabel) - sns.despine(ax=ax) - return ax - - -def plot_flashes_on_trace(ax, window=[-4, 8], go_trials_only=False, omitted=False, flashes=False, alpha=0.25, - facecolor='gray'): - """ - Function to create transparent gray bars spanning the duration of visual stimulus presentations to overlay on existing figure - - :param ax: axis on which to plot stimulus presentation times - :param window: window of time the trace covers, in seconds - :param trial_type: 'go' or 'catch'. If 'go', different alpha levels are used for stimulus presentations before and after change time - :param omitted: boolean, use True if plotting response to omitted flashes - :param alpha: value between 0-1 to set transparency level of gray bars demarcating stimulus times - - :return: axis handle - """ - # PROBLEM: shouldn't hard code these things here - frame_rate = 31. - stim_duration = .25 - blank_duration = .5 - change_frame = np.abs(window[0]) * frame_rate - end_frame = (window[1] + np.abs(window[0])) * frame_rate - interval = blank_duration + stim_duration - if omitted: - array = np.arange((change_frame + interval), end_frame, interval * frame_rate) - array = array[1:] - else: - array = np.arange(change_frame, end_frame, interval * frame_rate) - for i, vals in enumerate(array): - amin = array[i] - amax = array[i] + (stim_duration * frame_rate) - ax.axvspan(amin, amax, facecolor=facecolor, edgecolor='none', alpha=alpha, linewidth=0, zorder=1) - if go_trials_only: - alpha = alpha * 3 - else: - alpha - array = np.arange(change_frame - ((blank_duration) * frame_rate), 0, -interval * frame_rate) - for i, vals in enumerate(array): - amin = array[i] - amax = array[i] - (stim_duration * frame_rate) - ax.axvspan(amin, amax, facecolor=facecolor, edgecolor='none', alpha=alpha, linewidth=0, zorder=1) - return ax - - -def create_multi_session_mean_df(cache, experiment_ids, conditions=['cell_specimen_id', 'change_image_name'], - flashes=False): - ''' - Creates a mean response dataframe by combining multiple sessions. - - INPUTS: - cache: the cache object for the dataset - experiment_ids: a list of experiment_ids for sessions to merge - conditions: the set of conditions to group by. The first entry should be 'cell_specimen_id' - flashes: if TRUE, uses the flash_response_df to merge, otherwise uses the trial_response_df - - OUTPUTS - mega_mdf, a dataframe with index given by the session experiment ids. This allows for easy analysis like: - mega_mdf.groupby('experiment_id').mean_response.mean() - ''' - manifest = cache.experiment_table - mega_mdf = pd.DataFrame() - # Iterate through experiments - for experiment_id in experiment_ids: - # load the session object - session = cache.get_session(experiment_id) - print(session.metadata['ophys_experiment_id']) - # Get the individual session mean_df - if flashes: - mdf = get_mean_df(session.flash_response_df, conditions=conditions) - else: - mdf = get_mean_df(session.trial_response_df, conditions=conditions) - - # Append metadata - mdf['experiment_id'] = session.metadata['ophys_experiment_id'] - mdf['experiment_container_id'] = session.metadata['experiment_container_id'] - stage = manifest[manifest.ophys_experiment_id == session.metadata['ophys_experiment_id']].stage_name.values[0] - mdf['stage_name'] = stage - mdf['passive'] = parse_stage_for_passive(stage) - mdf['image_set'] = parse_stage_for_image_set(stage) - mdf['targeted_structure'] = session.metadata['targeted_structure'] - mdf['imaging_depth'] = session.metadata['imaging_depth'] - mdf['full_genotype'] = session.metadata['full_genotype'] - mdf['cre_line'] = session.metadata['full_genotype'].split('/')[0] - mdf['retake_number'] = \ - manifest[manifest.ophys_experiment_id == session.metadata['ophys_experiment_id']].retake_number.values[0] - - # Concatenate this session to the other sessions - mega_mdf = pd.concat([mega_mdf, mdf]) - - # Clean up indexes - mega_mdf = mega_mdf.reset_index() - mega_mdf = mega_mdf.set_index('experiment_id') - if 'index' in mega_mdf.keys(): - mega_mdf = mega_mdf.drop(columns=['index']) - if 'level_0' in mega_mdf.keys(): - mega_mdf = mega_mdf.drop(columns=['level_0']) - - return mega_mdf - - -def parse_stage_for_passive(stage): - ''' - Returns TRUE if the stage_name indicates a passive sessions - ''' - return 'passive' in stage - - -def parse_stage_for_image_set(stage): - ''' - Returns the character for the image_set, for example 'A' - ''' - return stage[15] - - -def get_active_cell_indices(dff_traces): - ''' - Returns the ten most active cells. - Computes active cells by SNR = mean/std over all timepoints. - ''' - snr_values = [] - for i, trace in enumerate(dff_traces): - mean = np.mean(trace, axis=0) - std = np.std(trace, axis=0) - snr = mean / std - snr_values.append(snr) - active_cell_indices = np.argsort(snr_values)[-10:] - return active_cell_indices - - -def compute_lifetime_sparseness(image_responses): - # image responses should be an array of the trial averaged responses to each image - # sparseness = 1-(sum of trial averaged responses to images / N)squared / (sum of (squared mean responses / n)) / (1-(1/N)) - # N = number of images - # after Vinje & Gallant, 2000; Froudarakis et al., 2014 - N = float(len(image_responses)) - ls = ((1 - (1 / N) * ((np.power(image_responses.sum(axis=0), 2)) / (np.power(image_responses, 2).sum(axis=0)))) / ( - 1 - (1 / N))) - return ls diff --git a/allensdk/brain_observatory/behavior/sync/__init__.py b/allensdk/brain_observatory/behavior/sync/__init__.py deleted file mode 100644 index 50610532ac..0000000000 --- a/allensdk/brain_observatory/behavior/sync/__init__.py +++ /dev/null @@ -1,236 +0,0 @@ -""" -Created on Sunday July 15 2018 - -@author: marinag -""" -from itertools import chain -from typing import Dict, Any, Optional, List, Union -from allensdk.brain_observatory.behavior.sync.process_sync import ( - filter_digital, calculate_delay) # NOQA: E402 -from allensdk.brain_observatory.sync_dataset import Dataset as SyncDataset # NOQA: E402 -import numpy as np -import scipy.stats as sps - - -def get_raw_stimulus_frames( - dataset: SyncDataset, - permissive: bool = False -) -> np.ndarray: - """ Report the raw timestamps of each stimulus frame. This corresponds to - the time at which the psychopy window's flip method returned, but not - necessarily to the time at which the stimulus frame was displayed. - - Parameters - ---------- - dataset : describes experiment timing - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Returns - ------- - array of timestamps (floating point; seconds; relative to experiment start). - - """ - try: - return dataset.get_edges("falling",'stim_vsync', "seconds") - except KeyError: - if not permissive: - raise - return - - -def get_ophys_frames( - dataset: SyncDataset, - permissive: bool = False -) -> np.ndarray: - """ Report the timestamps of each optical physiology video frame - - Parameters - ---------- - dataset : describes experiment timing - - Returns - ------- - array of timestamps (floating point; seconds; relative to experiment start). - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Notes - ----- - use rising edge for Scientifica, falling edge for Nikon - http://confluence.corp.alleninstitute.org/display/IT/Ophys+Time+Sync - This function uses rising edges - - """ - try: - return dataset.get_edges("rising", '2p_vsync', "seconds") - except KeyError: - if not permissive: - raise - return - - -def get_lick_times( - dataset: SyncDataset, - permissive: bool = False -) -> Optional[np.ndarray]: - """ Report the timestamps of each detected lick - - Parameters - ---------- - dataset : describes experiment timing - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Returns - ------- - array of timestamps (floating point; seconds; relative to experiment start) - or None. If None, no lick timestamps were found in this sync - dataset. - - """ - return dataset.get_edges( - "rising", ["lick_times", "lick_sensor"], "seconds", permissive) - - -def get_stim_photodiode( - dataset: SyncDataset, - permissive: bool = False -) -> Optional[List[float]]: - """ Report the timestamps of each detected sync square transition (both - black -> white and white -> black) in this experiment. - - Parameters - ---------- - dataset : describes experiment timing - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Returns - ------- - array of timestamps (floating point; seconds; relative to experiment start) - or None. If None, no photodiode timestamps were found in this sync - dataset. - - """ - return dataset.get_edges( - "all", ["stim_photodiode", "photodiode"], "seconds", permissive) - - -def get_trigger( - dataset: SyncDataset, - permissive: bool = False -) -> Optional[np.ndarray]: - """ Returns (as a 1-element array) the time at which optical physiology - acquisition was started. - - Parameters - ---------- - dataset : describes experiment timing - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Returns - ------- - timestamps (floating point; seconds; relative to experiment start) - or None. If None, no timestamps were found in this sync dataset. - - Notes - ----- - Ophys frame timestamps can be recorded before acquisition start when - experimenters are setting up the recording session. These do not - correspond to acquired ophys frames. - - """ - return dataset.get_edges( - "rising", ["2p_trigger", "acq_trigger"], "seconds", permissive) - - -def get_eye_tracking( - dataset: SyncDataset, - permissive: bool = False -) -> Optional[np.ndarray]: - """ Report the timestamps of each frame of the eye tracking video - - Parameters - ---------- - dataset : describes experiment timing - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Returns - ------- - array of timestamps (floating point; seconds; relative to experiment start) - or None. If None, no eye tracking timestamps were found in this sync - dataset. - - """ - return dataset.get_edges( - "rising", ["cam2_exposure", "eye_tracking"], "seconds", permissive) - - -def get_behavior_monitoring( - dataset: SyncDataset, - permissive: bool = False -) -> Optional[np.ndarray]: - """ Report the timestamps of each frame of the behavior - monitoring video - - Parameters - ---------- - dataset : describes experiment timing - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Returns - ------- - array of timestamps (floating point; seconds; relative to experiment start) - or None. If None, no behavior monitoring timestamps were found in this - sync dataset. - - """ - return dataset.get_edges( - "rising", ["cam1_exposure", "behavior_monitoring"], "seconds", - permissive) - - -def get_sync_data( - sync_path: str, - permissive: bool = False -) -> Dict[str, Union[List, np.ndarray, None]]: - """ Convenience function for extracting several timestamp arrays from a - sync file. - - Parameters - ---------- - sync_path : The hdf5 file here ought to be a Visual Behavior sync output - file. See allensdk.brain_observatory.sync_dataset for more details of - this format. - permissive : If True, None will be returned if timestamps are not found. If - False, a KeyError will be raised - - Returns - ------- - A dictionary with the following keys. All timestamps in seconds: - ophys_frames : timestamps of each optical physiology frame - lick_times : timestamps of each detected lick - ophys_trigger : The time at which ophys acquisition was started - eye_tracking : timestamps of each eye tracking video frame - behavior_monitoring : timestamps of behavior monitoring video frame - stim_photodiode : timestamps of each photodiode transition - stimulus_times_no_delay : raw stimulus frame timestamps - Some values may be None. This indicates that the corresponding timestamps - were not located in this sync file. - - """ - - sync_dataset = SyncDataset(sync_path) - return { - 'ophys_frames': get_ophys_frames(sync_dataset, permissive), - 'lick_times': get_lick_times(sync_dataset, permissive), - 'ophys_trigger': get_trigger(sync_dataset, permissive), - 'eye_tracking': get_eye_tracking(sync_dataset, permissive), - 'behavior_monitoring': get_behavior_monitoring(sync_dataset, permissive), - 'stim_photodiode': get_stim_photodiode(sync_dataset, permissive), - 'stimulus_times_no_delay': get_raw_stimulus_frames(sync_dataset, permissive) - } diff --git a/allensdk/brain_observatory/behavior/sync/process_sync.py b/allensdk/brain_observatory/behavior/sync/process_sync.py deleted file mode 100644 index d054f33b2b..0000000000 --- a/allensdk/brain_observatory/behavior/sync/process_sync.py +++ /dev/null @@ -1,127 +0,0 @@ - - -import numpy as np - - -import logging -logger = logging.getLogger(__name__) - - -def filter_digital(rising, falling, threshold=0.0001): - """ - Removes short transients from digital signal. - - Rising and falling should be same length and units - in seconds. - - Kwargs: - threshold (float): transient width - """ - # forwards (removes low-to-high transients) - dif_f = falling - rising - falling_f = falling[np.abs(dif_f) > threshold] - rising_f = rising[np.abs(dif_f) > threshold] - # backwards (removes high-to-low transients ) - dif_b = rising_f[1:] - falling_f[:-1] - dif_br = np.append([threshold * 2], dif_b) - dif_bf = np.append(dif_b, [threshold * 2]) - rising_f = rising_f[np.abs(dif_br) > threshold] - falling_f = falling_f[np.abs(dif_bf) > threshold] - - return rising_f, falling_f - - -def calculate_delay(sync_data, stim_vsync_fall, sample_frequency): - # from http://stash.corp.alleninstitute.org/projects/INF/repos/lims2_modules/browse/CAM/ophys_time_sync/ophys_time_sync.py - ASSUMED_DELAY = 0.0351 - DELAY_THRESHOLD = 0.001 - FIRST_ELEMENT_INDEX = 0 - ROUND_PRECISION = 4 - ONE = 1 - - logger.info('calculating monitor delay') - - # try: - # photodiode transitions - photodiode_rise = sync_data.get_rising_edges('stim_photodiode') / sample_frequency - - # Find start and stop of stimulus - # test and correct for photodiode transition errors - photodiode_rise_diff = np.ediff1d(photodiode_rise) - min_short_photodiode_rise = 0.1 - max_short_photodiode_rise = 0.3 - min_medium_photodiode_rise = 0.5 - max_medium_photodiode_rise = 1.5 - - # find the short and medium length photodiode rises - short_rise_indexes = np.where(np.logical_and(photodiode_rise_diff > min_short_photodiode_rise, - photodiode_rise_diff < max_short_photodiode_rise))[ - FIRST_ELEMENT_INDEX] - medium_rise_indexes = np.where(np.logical_and(photodiode_rise_diff > min_medium_photodiode_rise, - photodiode_rise_diff < max_medium_photodiode_rise))[ - FIRST_ELEMENT_INDEX] - - short_set = set(short_rise_indexes) - - # iterate through the medium photodiode rise indexes to find the start and stop indexes - # lookng for three rise pattern - next_frame = ONE - start_pattern_index = 2 - end_pattern_index = 3 - ptd_start = None - ptd_end = None - - for medium_rise_index in medium_rise_indexes: - if set(range(medium_rise_index - start_pattern_index, medium_rise_index)) <= short_set: - ptd_start = medium_rise_index + next_frame - elif set(range(medium_rise_index + next_frame, medium_rise_index + end_pattern_index)) <= short_set: - ptd_end = medium_rise_index - - # if the photodiode signal exists - if ptd_start is not None and ptd_end is not None: - # check to make sure there are no there are no photodiode errors - # sometimes two consecutive photodiode events take place close to each other - # correct this case if it happens - photodiode_rise_error_threshold = 1.8 - last_frame_index = -1 - - # iterate until all of the errors have been corrected - while any(photodiode_rise_diff[ptd_start:ptd_end] < photodiode_rise_error_threshold): - error_frames = np.where(photodiode_rise_diff[ptd_start:ptd_end] < photodiode_rise_error_threshold)[ - FIRST_ELEMENT_INDEX] + ptd_start - # remove the bad photodiode event - photodiode_rise = np.delete(photodiode_rise, error_frames[last_frame_index]) - ptd_end -= 1 - photodiode_rise_diff = np.ediff1d(photodiode_rise) - - # Find the delay - # calculate monitor delay - first_pulse = ptd_start - number_of_photodiode_rises = ptd_end - ptd_start - half_vsync_fall_events_per_photodiode_rise = 60 - vsync_fall_events_per_photodiode_rise = half_vsync_fall_events_per_photodiode_rise * 2 - - delay_rise = np.empty(number_of_photodiode_rises) - for photodiode_rise_index in range(number_of_photodiode_rises): - delay_rise[photodiode_rise_index] = photodiode_rise[photodiode_rise_index + first_pulse] - \ - stim_vsync_fall[(photodiode_rise_index * vsync_fall_events_per_photodiode_rise) + half_vsync_fall_events_per_photodiode_rise] - - # get a single delay value by finding the mean of all of the delays - skip the last element in the array (the end of the experimenet) - delay = np.mean(delay_rise[:last_frame_index]) - delay_std = np.std(delay_rise[:last_frame_index]) - - if (delay_std > DELAY_THRESHOLD or np.isnan(delay)): - - logger.error("Sync photodiode error needs to be fixed. Using assumed monitor delay: {}".format(round(delay, ROUND_PRECISION))) - raise - - # assume delay - else: - raise - # delay = ASSUMED_DELAY - # except Exception as e: - # logger.info(e) - # delay = ASSUMED_DELAY - # logger.error("Process without photodiode signal. Assumed delay: {}".format(round(delay, ROUND_PRECISION))) - - return delay diff --git a/allensdk/brain_observatory/behavior/trial_masks.py b/allensdk/brain_observatory/behavior/trial_masks.py deleted file mode 100644 index 363b10b436..0000000000 --- a/allensdk/brain_observatory/behavior/trial_masks.py +++ /dev/null @@ -1,63 +0,0 @@ -import numpy as np -import pandas as pd - -def trial_types(trials, trial_types): - """ only include trials of certain trial types - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - trial_types : list or other iterator - - - Returns - ------- - mask : pandas Series of booleans, indexed to trials DataFrame - - """ - - if trial_types is not None and len(trial_types) > 0: - return trials['trial_type'].isin(trial_types) - else: - return pd.Series(np.ones((len(trials), ), dtype=bool), - name="trial_type", index=trials.index) - - -def contingent_trials(trials): - """ GO & CATCH trials only - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - - Returns - ------- - mask : pandas Series of booleans, indexed to trials DataFrame - - """ - return trial_types(trials, ('go', 'catch')) - - -def reward_rate(trials, thresh=2.0): - """ masks trials where the reward rate (per minute) is below some threshold. - - This de facto omits trials in which the animal was not licking for extended periods - or periods when they were licking indiscriminantly. - - Parameters - ---------- - trials : pandas DataFrame - dataframe of trials - thresh : float, optional - threshold under which trials will not be included, default: 2.0 - - Returns - ------- - mask : pandas Series of booleans, indexed to trials DataFrame - - """ - - mask = trials['reward_rate'] > thresh - return mask diff --git a/allensdk/brain_observatory/behavior/trials_processing.py b/allensdk/brain_observatory/behavior/trials_processing.py deleted file mode 100644 index 78de900423..0000000000 --- a/allensdk/brain_observatory/behavior/trials_processing.py +++ /dev/null @@ -1,1348 +0,0 @@ -from typing import List, Dict -import uuid -from copy import deepcopy -import collections -import dateutil - -import pandas as pd -import numpy as np - -from allensdk import one -from allensdk.brain_observatory.behavior.dprime import ( - get_rolling_dprime, get_trial_count_corrected_false_alarm_rate, - get_trial_count_corrected_hit_rate, - get_hit_rate, get_false_alarm_rate) - -# TODO: add trial column descriptions -TRIAL_COLUMN_DESCRIPTION_DICT = {} - -EDF_COLUMNS = ['index', 'lick_times', 'auto_rewarded', 'cumulative_volume', - 'cumulative_reward_number', 'reward_volume', 'reward_times', - 'reward_frames', 'rewarded', 'optogenetics', 'response_type', - 'response_time', 'change_time', 'change_frame', - 'response_latency', 'starttime', 'startframe', 'trial_length', - 'scheduled_change_time', 'endtime', 'endframe', - 'initial_image_category', 'initial_image_name', - 'change_image_name', 'change_image_category', 'change_ori', - 'change_contrast', 'initial_ori', 'initial_contrast', - 'delta_ori', 'mouse_id', 'response_window', 'task', 'stage', - 'session_duration', 'user_id', 'LDT_mode', - 'blank_screen_timeout', 'stim_duration', - 'blank_duration_range', 'prechange_minimum', - 'stimulus_distribution', 'stimulus', 'distribution_mean', - 'computer_name', 'behavior_session_uuid', 'startdatetime', - 'date', 'year', 'month', 'day', 'hour', 'dayofweek', - 'number_of_rewards', 'rig_id', 'trial_type', - 'lick_frames', 'reward_licks', 'reward_lick_count', - 'reward_lick_latency', 'reward_rate', 'response', 'color'] - -RIG_NAME = { - 'W7DTMJ19R2F': 'A1', - 'W7DTMJ35Y0T': 'A2', - 'W7DTMJ03J70R': 'Dome', - 'W7VS-SYSLOGIC2': 'A3', - 'W7VS-SYSLOGIC3': 'A4', - 'W7VS-SYSLOGIC4': 'A5', - 'W7VS-SYSLOGIC5': 'A6', - 'W7VS-SYSLOGIC7': 'B1', - 'W7VS-SYSLOGIC8': 'B2', - 'W7VS-SYSLOGIC9': 'B3', - 'W7VS-SYSLOGIC10': 'B4', - 'W7VS-SYSLOGIC11': 'B5', - 'W7VS-SYSLOGIC12': 'B6', - 'W7VS-SYSLOGIC13': 'C1', - 'W7VS-SYSLOGIC14': 'C2', - 'W7VS-SYSLOGIC15': 'C3', - 'W7VS-SYSLOGIC16': 'C4', - 'W7VS-SYSLOGIC17': 'C5', - 'W7VS-SYSLOGIC18': 'C6', - 'W7VS-SYSLOGIC19': 'D1', - 'W7VS-SYSLOGIC20': 'D2', - 'W7VS-SYSLOGIC21': 'D3', - 'W7VS-SYSLOGIC22': 'D4', - 'W7VS-SYSLOGIC23': 'D5', - 'W7VS-SYSLOGIC24': 'D6', - 'W7VS-SYSLOGIC31': 'E1', - 'W7VS-SYSLOGIC32': 'E2', - 'W7VS-SYSLOGIC33': 'E3', - 'W7VS-SYSLOGIC34': 'E4', - 'W7VS-SYSLOGIC35': 'E5', - 'W7VS-SYSLOGIC36': 'E6', - 'W7DT102905': 'F1', - 'W10DT102905': 'F1', - 'W7DT102904': 'F2', - 'W7DT102903': 'F3', - 'W7DT102914': 'F4', - 'W7DT102913': 'F5', - 'W7DT12497': 'F6', - 'W7DT102906': 'G1', - 'W7DT102907': 'G2', - 'W7DT102908': 'G3', - 'W7DT102909': 'G4', - 'W7DT102910': 'G5', - 'W7DT102911': 'G6', - 'W7VS-SYSLOGIC26': 'Widefield-329', - 'OSXLTTF6T6.local': 'DougLaptop', - 'W7DTMJ026LUL': 'DougPC', - 'W7DTMJ036PSL': 'Marina2P_Sutter', - 'W7DT2PNC1STIM': '2P6', - 'W7DTMJ234MG': 'peterl_2p', - 'W7DT2P3STiM': '2P3', - 'W7DT2P4STIM': '2P4', - 'W7DT2P5STIM': '2P5', - 'W10DTSM118296': 'NP3', - 'meso1stim': 'MS1', - 'localhost': 'localhost' -} -RIG_NAME = {k.lower(): v for k, v in RIG_NAME.items()} -COMPUTER_NAME = dict((v, k) for k, v in RIG_NAME.items()) - - -def resolve_initial_image(stimuli, start_frame): - """Attempts to resolve the initial image for a given start_frame for a trial - - Parameters - ---------- - stimuli: Mapping - foraging2 shape stimuli mapping - start_frame: int - start frame of the trial - - Returns - ------- - initial_image_category_name: str - stimulus category of initial image - initial_image_group: str - group name of the initial image - initial_image_name: str - name of the initial image - """ - max_frame = float("-inf") - initial_image_group = '' - initial_image_name = '' - initial_image_category_name = '' - - for stim_category_name, stim_dict in stimuli.items(): - for set_event in stim_dict["set_log"]: - set_frame = set_event[3] - if set_frame <= start_frame and set_frame >= max_frame: - # hack assumes initial_image_group == initial_image_name, - # only initial_image_name is present for natual_scenes - initial_image_group = initial_image_name = set_event[1] - initial_image_category_name = stim_category_name - if initial_image_category_name == 'grating': - initial_image_name = f'gratings_{initial_image_name}' - max_frame = set_frame - - return initial_image_category_name, initial_image_group, initial_image_name - - -def trial_data_from_log(trial): - ''' - Infer trial logic from trial log. Returns a dictionary. - - * reward volume: volume of water delivered on the trial, in mL - - Each of the following values is boolean: - - Trial category values are mutually exclusive - * go: trial was a go trial (trial with a stimulus change) - * catch: trial was a catch trial (trial with a sham stimulus change) - - stimulus_change/sham_change are mutually exclusive - * stimulus_change: did the stimulus change (True on 'go' trials) - * sham_change: stimulus did not change, but response was evaluated - (True on 'catch' trials) - - Each trial can be one (and only one) of the following: - * hit (stimulus changed, animal responded in response window) - * miss (stimulus changed, animal did not respond in response window) - * false_alarm (stimulus did not change, - animal responded in response window) - * correct_reject (stimulus did not change, - animal did not respond in response window) - * aborted (animal responded before change time) - * auto_rewarded (reward was automatically delivered following the change. - This will bias the animals choice and should not be - categorized as hit/miss) - ''' - trial_event_names = [val[0] for val in trial['events']] - hit = 'hit' in trial_event_names - false_alarm = 'false_alarm' in trial_event_names - miss = 'miss' in trial_event_names - sham_change = 'sham_change' in trial_event_names - stimulus_change = 'stimulus_changed' in trial_event_names - aborted = 'abort' in trial_event_names - - if aborted: - go = catch = auto_rewarded = False - else: - catch = trial["trial_params"]["catch"] is True - auto_rewarded = trial["trial_params"]["auto_reward"] - go = not catch and not auto_rewarded - - correct_reject = catch and not false_alarm - - if auto_rewarded: - hit = miss = correct_reject = false_alarm = False - - return { - "reward_volume": sum([r[0] for r in trial.get("rewards", [])]), - "hit": hit, - "false_alarm": false_alarm, - "miss": miss, - "sham_change": sham_change, - "stimulus_change": stimulus_change, - "aborted": aborted, - "go": go, - "catch": catch, - "auto_rewarded": auto_rewarded, - "correct_reject": correct_reject, - } - - -def validate_trial_condition_exclusivity(trial_index, **trial_conditions): - '''ensure that only one of N possible mutually - exclusive trial conditions is True''' - on = [] - for condition, value in trial_conditions.items(): - if value: - on.append(condition) - - if len(on) != 1: - all_conditions = list(trial_conditions.keys()) - msg = f"expected exactly 1 trial condition out of {all_conditions} " - msg += f"to be True, instead {on} were True (trial {trial_index})" - raise AssertionError(msg) - - -def get_trial_reward_time(rebased_reward_times, - start_time, - stop_time): - '''extract reward times in time range''' - reward_times = rebased_reward_times[np.where(np.logical_and( - rebased_reward_times >= start_time, - rebased_reward_times <= stop_time - ))] - return float('nan') if len(reward_times) == 0 else one(reward_times) - - -def _get_response_time(licks: List[float], aborted: bool) -> float: - """ - Return the time the first lick occurred in a non-"aborted" trial. - A response time is not returned for on an "aborted trial", since by - definition, the animal licked before the change stimulus. - - Parameters - ========== - licks: List[float] - List of timestamps that a lick occurred during this trial. - The list should contain all licks that occurred while the trial - was active (between 'trial_start' and 'trial_end' events) - aborted: bool - Whether or not the trial was "aborted". This means that the - response occurred before the stimulus change and should not be - a valid response. - Returns - ======= - float - Time of first lick if there was a valid response, otherwise - NaN. See rules above. - """ - if aborted: - return float("nan") - if len(licks): - return licks[0] - else: - return float("nan") - - -def get_trial_timing( - event_dict: dict, - licks: List[float], go: bool, catch: bool, auto_rewarded: bool, - hit: bool, false_alarm: bool, aborted: bool, - timestamps: np.ndarray, - monitor_delay: float): - """ - Extract a dictionary of trial timing data. - See trial_data_from_log for a description of the trial types. - - Parameters - ========== - event_dict: dict - Dictionary of trial events in the well-known `pkl` file - licks: List[float] - list of lick timestamps, from the `get_licks` response for - the BehaviorOphysExperiment.api. - go: bool - True if "go" trial, False otherwise. Mutually exclusive with - `catch`. - catch: bool - True if "catch" trial, False otherwise. Mutually exclusive - with `go.` - auto_rewarded: bool - True if "auto_rewarded" trial, False otherwise. - hit: bool - True if "hit" trial, False otherwise - false_alarm: bool - True if "false_alarm" trial, False otherwise - aborted: bool - True if "aborted" trial, False otherwise - timestamps: np.ndarray[1d] - Array of ground truth timestamps for the session - (sync times, if available) - monitor_delay: float - The monitor delay in seconds associated with the session - - Returns - ======= - dict - start_time: float - The time the trial started (in seconds elapsed from - recording start) - stop_time: float - The time the trial ended (in seconds elapsed from - recording start) - trial_length: float - Duration of the trial in seconds - response_time: float - The response time, for non-aborted trials. This is equal - to the first lick in the trial. For aborted trials or trials - without licks, `response_time` is NaN. - change_frame: int - The frame number that the stimulus changed - change_time: float - The time in seconds that the stimulus changed - response_latency: float or None - The time in seconds between the stimulus change and the - animal's lick response, if the trial is a "go", "catch", or - "auto_rewarded" type. If the animal did not respond, - return `float("inf")`. In all other cases, return None. - - Notes - ===== - The following parameters are mutually exclusive (exactly one can - be true): - hit, miss, false_alarm, aborted, auto_rewarded - """ - assert not (aborted and (hit or false_alarm or auto_rewarded)), ( - "'aborted' trials cannot be 'hit', 'false_alarm', or 'auto_rewarded'") - assert not (hit and false_alarm), ( - "both `hit` and `false_alarm` cannot be True, they are mutually " - "exclusive categories") - assert not (go and catch), ( - "both `go` and `catch` cannot be True, they are mutually exclusive " - "categories") - assert not (go and auto_rewarded), ( - "both `go` and `auto_rewarded` cannot be True, they are mutually " - "exclusive categories") - - start_time = event_dict["trial_start", ""]['timestamp'] - stop_time = event_dict["trial_end", ""]['timestamp'] - - response_time = _get_response_time(licks, aborted) - - if go or auto_rewarded: - change_frame = event_dict.get(('stimulus_changed', ''))['frame'] - change_time = timestamps[change_frame] + monitor_delay - elif catch: - change_frame = event_dict.get(('sham_change', ''))['frame'] - change_time = timestamps[change_frame] + monitor_delay - else: - change_time = float("nan") - change_frame = float("nan") - - if not (go or catch or auto_rewarded): - response_latency = None - elif len(licks) > 0: - response_latency = licks[0] - change_time - else: - response_latency = float("inf") - - return { - "start_time": start_time, - "stop_time": stop_time, - "trial_length": stop_time - start_time, - "response_time": response_time, - "change_frame": change_frame, - "change_time": change_time, - "response_latency": response_latency, - } - - -def get_trial_image_names(trial, stimuli) -> Dict[str, str]: - """ - Gets the name of the stimulus presented at the beginning of the trial and - what is it changed to at the end of the trial. - Parameters - ---------- - trial: A trial in a behavior ophys session - stimuli: The stimuli presentation log for the behavior session - - Returns - ------- - A dictionary indicating the starting_stimulus and what the stimulus is - changed to. - - """ - grating_oris = {'horizontal', 'vertical'} - trial_start_frame = trial["events"][0][3] - initial_image_category_name, _, initial_image_name = resolve_initial_image( - stimuli, trial_start_frame) - if len(trial["stimulus_changes"]) == 0: - change_image_name = initial_image_name - else: - ((from_set, from_name), - (to_set, to_name), - _, _) = trial["stimulus_changes"][0] - - # do this to fix names if the stimuli is a grating - if from_set in grating_oris: - from_name = f'gratings_{from_name}' - if to_set in grating_oris: - to_name = f'gratings_{to_name}' - assert from_name == initial_image_name - change_image_name = to_name - - return { - "initial_image_name": initial_image_name, - "change_image_name": change_image_name - } - - -def get_trial_bounds(trial_log: List) -> List: - """ - Adjust trial boundaries from a trial_log so that there is no dead time - between trials. - - Parameters - ---------- - trial_log: list - The trial_log read in from the well known behavior stimulus pickle file - - Returns - ------- - list - Each element in the list is a tuple of the form - (start_frame, end_frame) so that the ith element - of the list gives the start and end frames of - the ith trial. The endframe of the last trial will - be -1, indicating that it should map to the last - timestamp in the session - """ - start_frames = [] - - for trial in trial_log: - start_f = None - for event in trial['events']: - if event[0] == 'trial_start': - start_f = event[-1] - break - if start_f is None: - msg = "Could not find a 'trial_start' event " - msg += "for all trials in the trial log\n" - msg += f"{trial}" - raise ValueError(msg) - - if len(start_frames) > 0 and start_f < start_frames[-1]: - msg = "'trial_start' frames in trial log " - msg += "are not in ascending order" - msg += f"\ntrial_log: {trial_log}" - raise ValueError(msg) - - start_frames.append(start_f) - - end_frames = [idx for idx in start_frames[1:]+[-1]] - return list([(s, e) for s, e in zip(start_frames, end_frames)]) - - -def get_trials_from_data_transform(input_transform) -> pd.DataFrame: - """ - Create and return a pandas DataFrame containing data about - the trials associated with this session - - Parameters - ---------- - input_transform: - An instantiation of a class that inherits from either - BehaviorDataTransform or BehaviorOphysDataTransform. - This object will be used to get at the data needed by - this method to create the trials dataframe. - - Returns - ------- - pd.DataFrame - A dataframe containing data pertaining to the trials that - make up this session - - Notes - ----- - The input_transform object must have the following methods: - - input_transform._behavior_stimulus_file - Which returns the dict resulting from reading in this session's - stimulus_data pickle file - - input_transform.get_rewards - Which returns a dataframe containing data about rewards given - during this session, i.e. the output of - allensdk/brain_observatory/behavior/rewards_processing.get_rewards - - input_transform.get_licks - Which returns a dataframe containing the columns `time` and `frame` - denoting the time (in seconds) and frame number at which licks - occurred during this session - - input_transform.get_stimulus_timestamps - Which returns a numpy.ndarray of timestamps (in seconds) associated - with the frames presented in this session. - - input_transform.get_monitor_delay - Which returns the monitory delay (in seconds) associated with the - experimental rig - """ - - missing_data_streams = [] - for method_name in ('get_rewards', 'get_licks', - 'get_stimulus_timestamps', - 'get_monitor_delay', - '_behavior_stimulus_file'): - if not hasattr(input_transform, method_name): - missing_data_streams.append(method_name) - if len(missing_data_streams) > 0: - msg = 'Cannot run trials_processing.get_trials\n' - msg += 'The object you passed as input is missing ' - msg += 'the following required methods:\n' - for method_name in missing_data_streams: - msg += f'{method_name}\n' - raise ValueError(msg) - - rewards_df = input_transform.get_rewards() - licks_df = input_transform.get_licks() - timestamps = input_transform.get_stimulus_timestamps() - monitor_delay = input_transform.get_monitor_delay() - data = input_transform._behavior_stimulus_file() - - stimuli = data["items"]["behavior"]["stimuli"] - trial_log = data["items"]["behavior"]["trial_log"] - - trial_bounds = get_trial_bounds(trial_log) - - all_trial_data = [None] * len(trial_log) - lick_frames = licks_df.frame.values - reward_times = rewards_df['timestamps'].values - - for idx, trial in enumerate(trial_log): - # match each event in the trial log to the sync timestamps - event_dict = {(e[0], e[1]): {'timestamp': timestamps[e[3]], - 'frame': e[3]} - for e in trial['events']} - - tr_data = {"trial": trial["index"]} - - trial_start = trial_bounds[idx][0] - trial_end = trial_bounds[idx][1] - - # this block of code is trying to mimic - # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/visual_behavior/translator/foraging2/__init__.py#L377-L381 - # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/visual_behavior/translator/foraging2/extract_movies.py#L59-L94 - # https://github.com/AllenInstitute/visual_behavior_analysis/blob/master/visual_behavior/translator/core/annotate.py#L11-L36 - # - # In summary: there are cases where an "epilogue movie" is shown - # after the proper stimuli; we do not want licks that occur - # during this epilogue movie to be counted as belonging to - # the last trial - # https://github.com/AllenInstitute/visual_behavior_analysis/issues/482 - - if trial_end < 0: - bhv = data['items']['behavior']['items'] - if 'fingerprint' in bhv.keys(): - trial_end = bhv['fingerprint']['starting_frame'] - - # select licks that fall between trial_start and trial_end; - # licks on the boundary get assigned to the trial that is ending, - # rather than the trial that is starting - if trial_end > 0: - valid_idx = np.where(np.logical_and(lick_frames > trial_start, - lick_frames <= trial_end)) - else: - valid_idx = np.where(lick_frames > trial_start) - - valid_licks = lick_frames[valid_idx] - if len(valid_licks) > 0: - tr_data["lick_times"] = timestamps[valid_licks] - else: - tr_data["lick_times"] = np.array([], dtype=float) - - tr_data["reward_time"] = get_trial_reward_time( - reward_times, - event_dict[('trial_start', '')]['timestamp'], - event_dict[('trial_end', '')]['timestamp'] - ) - tr_data.update(trial_data_from_log(trial)) - tr_data.update(get_trial_timing( - event_dict, - tr_data['lick_times'], - tr_data['go'], - tr_data['catch'], - tr_data['auto_rewarded'], - tr_data['hit'], - tr_data['false_alarm'], - tr_data["aborted"], - timestamps, - monitor_delay - )) - tr_data.update(get_trial_image_names(trial, stimuli)) - - # ensure that only one trial condition is True - # (they are mutually exclusive) - condition_dict = {} - for key in ['hit', - 'miss', - 'false_alarm', - 'correct_reject', - 'auto_rewarded', - 'aborted']: - condition_dict[key] = tr_data[key] - validate_trial_condition_exclusivity(idx, **condition_dict) - - all_trial_data[idx] = tr_data - - trials = pd.DataFrame(all_trial_data).set_index('trial') - trials.index = trials.index.rename('trials_id') - del trials["sham_change"] - - return trials - - -def local_time(iso_timestamp, timezone=None): - datetime = pd.to_datetime(iso_timestamp) - if not datetime.tzinfo: - tzinfo = dateutil.tz.gettz('America/Los_Angeles') - datetime = datetime.replace(tzinfo=tzinfo) - return datetime.isoformat() - - -def get_time(exp_data): - vsyncs = exp_data["items"]["behavior"]["intervalsms"] - return np.hstack((0, vsyncs)).cumsum() / 1000.0 - - -def data_to_licks(data, time): - lick_frames = data['items']['behavior']['lick_sensors'][0]['lick_events'] - lick_times = time[lick_frames] - return pd.DataFrame(data={"timestamps": lick_times, - "frame": lick_frames}) - - -def get_mouse_id(exp_data): - return exp_data["items"]["behavior"]['config']['behavior']['mouse_id'] - - -def get_params(exp_data): - - params = deepcopy(exp_data["items"]["behavior"].get("params", {})) - params.update(exp_data["items"]["behavior"].get("cl_params", {})) - - if "response_window" in params: - # tuple to list - params["response_window"] = list(params["response_window"]) - - return params - - -def get_even_sampling(data): - """Get status of even_sampling - - Parameters - ---------- - data: Mapping - foraging2 experiment output data - - Returns - ------- - bool: - True if even_sampling is enabled - """ - - stimuli = data['items']['behavior']['stimuli'] - for stimuli_group_name, stim in stimuli.items(): - if (stim['obj_type'].lower() == 'docimagestimulus' - and stim['sampling'] in ['even', 'file']): - - return True - - return False - - -def data_to_metadata(data, time): - - config = data['items']['behavior']['config'] - doc = config['DoC'] - stimuli = data['items']['behavior']['stimuli'] - - metadata = { - "startdatetime": local_time(data["start_time"], - timezone='America/Los_Angeles'), - "rig_id": RIG_NAME.get(data['platform_info']['computer_name'].lower(), - 'unknown'), - "computer_name": data['platform_info']['computer_name'], - "reward_vol": config["reward"]["reward_volume"], - "auto_reward_vol": doc["auto_reward_volume"], - "params": get_params(data), - "mouseid": config['behavior']['mouse_id'], - "response_window": list(data["items"]["behavior"].get("config", {}).get("DoC", {}).get("response_window")), # noqa: E501 - "task": config["behavior"]['task_id'], - "stage": data["items"]["behavior"]["params"]["stage"], - "stoptime": time[-1] - time[0], - "userid": data["items"]["behavior"]['cl_params']['user_id'], - "lick_detect_training_mode": "single", - "blankscreen_on_timeout": False, - "stim_duration": doc['stimulus_window'] * 1000, - "blank_duration_range": list(doc['blank_duration_range']), - "delta_minimum": doc['pre_change_time'], - "stimulus_distribution": doc["change_time_dist"], - "delta_mean": doc["change_time_scale"], - "trial_duration": None, - "n_stimulus_frames": sum([sum(s.get("draw_log", [])) - for s in stimuli.values()]), - "stimulus": list(stimuli.keys())[0], - "warm_up_trials": doc["warm_up_trials"], - "stimulus_window": doc["stimulus_window"], - "volume_limit": config["behavior"]["volume_limit"], - "failure_repeats": doc["failure_repeats"], - "catch_frequency": doc["catch_freq"], - "auto_reward_delay": doc.get("auto_reward_delay", 0.0), - "free_reward_trials": doc["free_reward_trials"], - "min_no_lick_time": doc["min_no_lick_time"], - "max_session_duration": doc["max_task_duration_min"], - "abort_on_early_response": doc["abort_on_early_response"], - "initial_blank_duration": doc["initial_blank"], - "even_sampling_enabled": get_even_sampling(data), - "behavior_session_uuid": uuid.UUID(data["session_uuid"]), - "periodic_flash": doc['periodic_flash'], - "platform_info": data['platform_info'] - } - - return metadata - - -def get_response_latency(change_event, trial): - - for response_event in trial['events']: - if response_event[0] in ['hit', 'false_alarm']: - return response_event[2] - change_event[2] - return float('inf') - - -def get_change_time_frame_response_latency(trial): - - for change_event in trial['events']: - if change_event[0] in ['stimulus_changed', 'sham_change']: - return (change_event[2], - change_event[3], - get_response_latency(change_event, trial)) - return None, None, None - - -def get_stimulus_attr_changes(stim_dict, - change_frame, - first_frame, - last_frame): - """ - Notes - ----- - - assumes only two stimuli are ever shown - - converts attr_names to lowercase - - gets the net attr changes from the start of a trial to the end of a trial - """ - initial_attr = {} - change_attr = {} - - for attr_name, set_value, set_time, set_frame in stim_dict["set_log"]: - if set_frame <= first_frame: - initial_attr[attr_name.lower()] = set_value - elif set_frame <= last_frame: - change_attr[attr_name.lower()] = set_value - else: - pass - - return initial_attr, change_attr - - -def get_image_info_from_trial(trial_log, ti): - - if ti == -1: - raise RuntimeError('Should not have been possible') - - if len(trial_log[ti]["stimulus_changes"]) == 1: - - ((from_group, from_name, ), - (to_group, to_name), - _, _) = trial_log[ti]["stimulus_changes"][0] - - return from_group, from_name, to_group, to_name - else: - - (_, _, - prev_group, - prev_name) = get_image_info_from_trial(trial_log, ti - 1) - - return prev_group, prev_name, prev_group, prev_name - - -def get_ori_info_from_trial(trial_log, ti, ): - if ti == -1: - raise IndexError('No change on first trial.') - - if len(trial_log[ti]["stimulus_changes"]) == 1: - - ((initial_group, initial_orientation), - (change_group, change_orientation, ), - _, _) = trial_log[ti]["stimulus_changes"][0] - - return change_orientation, change_orientation, None - else: - return get_ori_info_from_trial(trial_log, ti - 1) - - -def get_trials_v0(data, time): - stimuli = data["items"]["behavior"]["stimuli"] - if len(list(stimuli.keys())) != 1: - raise ValueError('Only one stimuli supported.') - - stim_name, stim = next(iter(stimuli.items())) - if stim_name not in ['images', 'grating', ]: - raise ValueError('Unsupported stimuli name: {}.'.format(stim_name)) - - doc = data["items"]["behavior"]["config"]["DoC"] - - implied_type = stim["obj_type"] - trial_log = data["items"]["behavior"]["trial_log"] - pre_change_time = doc['pre_change_time'] - initial_blank_duration = doc["initial_blank"] - - # we need this for the situations where a - # change doesn't occur in the first trial - initial_stim = stim['set_log'][0] - - trials = collections.defaultdict(list) - for ti, trial in enumerate(trial_log): - - trials['index'].append(trial["index"]) - trials['lick_times'].append([lick[0] for lick in trial["licks"]]) - trials['auto_rewarded'].append(trial["trial_params"]["auto_reward"] - if not trial['trial_params']['catch'] - else None) - - trials['cumulative_volume'].append(trial["cumulative_volume"]) - trials['cumulative_reward_number'].append(trial["cumulative_rewards"]) - - trials['reward_volume'].append(sum([r[0] - for r in trial.get("rewards", [])])) - - trials['reward_times'].append([reward[1] - for reward in trial["rewards"]]) - - trials['reward_frames'].append([reward[2] - for reward in trial["rewards"]]) - - trials['rewarded'].append(trial["trial_params"]["catch"] is False) - trials['optogenetics'].append(trial["trial_params"].get("optogenetics", False)) # noqa: E501 - trials['response_type'].append([]) - trials['response_time'].append([]) - trials['change_time'].append(get_change_time_frame_response_latency(trial)[0]) # noqa: E501 - trials['change_frame'].append(get_change_time_frame_response_latency(trial)[1]) # noqa: E501 - trials['response_latency'].append(get_change_time_frame_response_latency(trial)[2]) # noqa: E501 - trials['starttime'].append(trial["events"][0][2]) - trials['startframe'].append(trial["events"][0][3]) - trials['trial_length'].append(trial["events"][-1][2] - - trial["events"][0][2]) - trials['scheduled_change_time'].append(pre_change_time + - initial_blank_duration + - trial["trial_params"]["change_time"]) # noqa: E501 - trials['endtime'].append(trial["events"][-1][2]) - trials['endframe'].append(trial["events"][-1][3]) - - # Stimulus: - if implied_type == 'DoCImageStimulus': - (from_group, - from_name, - to_group, - to_name) = get_image_info_from_trial(trial_log, ti) - trials['initial_image_name'].append(from_name) - trials['initial_image_category'].append(from_group) - trials['change_image_name'].append(to_name) - trials['change_image_category'].append(to_group) - trials['change_ori'].append(None) - trials['change_contrast'].append(None) - trials['initial_ori'].append(None) - trials['initial_contrast'].append(None) - trials['delta_ori'].append(None) - elif implied_type == 'DoCGratingStimulus': - try: - (change_orientation, - initial_orientation, - delta_orientation) = get_ori_info_from_trial(trial_log, ti) - except IndexError: - # shape: group_name, orientation, - # stimulus time relative to start, frame - orientation = initial_stim[1] - change_orientation = orientation - initial_orientation = orientation - delta_orientation = None - trials['initial_image_category'].append('') - trials['initial_image_name'].append('') - trials['change_image_name'].append('') - trials['change_image_category'].append('') - trials['change_ori'].append(change_orientation) - trials['change_contrast'].append(None) - trials['initial_ori'].append(initial_orientation) - trials['initial_contrast'].append(None) - trials['delta_ori'].append(delta_orientation) - else: - msg = 'Unsupported stimulus type: {}'.format(implied_type) - raise NotImplementedError(msg) - - return pd.DataFrame(trials) - - -def categorize_one_trial(tr): - if pd.isnull(tr['change_time']): - if (len(tr['lick_times']) > 0): - trial_type = 'aborted' - else: - trial_type = 'other' - else: - if (tr['auto_rewarded'] is True): - return 'autorewarded' - elif (tr['rewarded'] is True): - return 'go' - elif (tr['rewarded'] == 0): - return 'catch' - else: - return 'other' - return trial_type - - -def find_licks(reward_times, licks, window=3.5): - if len(reward_times) == 0: - return [] - else: - reward_time = one(reward_times) - reward_lick_mask = ((licks['timestamps'] > reward_time) & - (licks['timestamps'] < (reward_time + window))) - - tr_licks = licks[reward_lick_mask].copy() - tr_licks['timestamps'] -= reward_time - return tr_licks['timestamps'].values - - -def calculate_reward_rate(response_latency=None, - starttime=None, - window=0.75, - trial_window=25, - initial_trials=10): - - assert len(response_latency) == len(starttime) - - df = pd.DataFrame({'response_latency': response_latency, - 'starttime': starttime}) - - # adds a column called reward_rate to the input dataframe - # the reward_rate column contains a rolling average of rewards/min - # window sets the window in which a response is considered correct, - # so a window of 1.0 means licks before 1.0 second are considered correct - # - # Reorganized into this unit-testable form by Nick Cain April 25 2019 - - reward_rate = np.zeros(len(df)) - # make the initial reward rate infinite, - # so that you include the first trials automatically. - reward_rate[:initial_trials] = np.inf - - for trial_number in range(initial_trials, len(df)): - - min_index = np.max((0, trial_number - trial_window)) - max_index = np.min((trial_number + trial_window, len(df))) - df_roll = df.iloc[min_index:max_index] - - # get a rolling number of correct trials - correct = len(df_roll[df_roll.response_latency < window]) - - # get the time elapsed over the trials - time_elapsed = df_roll.starttime.iloc[-1] - df_roll.starttime.iloc[0] - - # calculate the reward rate, rewards/min - reward_rate_on_this_lap = correct / time_elapsed * 60 - - reward_rate[trial_number] = reward_rate_on_this_lap - return reward_rate - - -def get_response_type(trials): - - response_type = [] - for idx in trials.index: - if trials.loc[idx].trial_type.lower() == 'aborted': - response_type.append('EARLY_RESPONSE') - elif (trials.loc[idx].rewarded) & (trials.loc[idx].response == 1): - response_type.append('HIT') - elif (trials.loc[idx].rewarded) & (trials.loc[idx].response != 1): - response_type.append('MISS') - elif (not trials.loc[idx].rewarded) & (trials.loc[idx].response == 1): - response_type.append('FA') - elif (not trials.loc[idx].rewarded) & (trials.loc[idx].response != 1): - response_type.append('CR') - else: - response_type.append('other') - - return response_type - - -def colormap(trial_type, response_type): - - if trial_type == 'aborted': - return 'lightgray' - - if trial_type == 'autorewarded': - return 'darkblue' - - if trial_type == 'go': - if response_type == 'HIT': - return '#55a868' - return '#ccb974' - - if trial_type == 'catch': - if response_type == 'FA': - return '#c44e52' - return '#4c72b0' - - -def create_extended_trials(trials=None, metadata=None, time=None, licks=None): - - startdatetime = dateutil.parser.parse(metadata['startdatetime']) - edf = trials[~pd.isnull(trials['reward_times'])].reset_index(drop=True).copy() # noqa: E501 - - # Buggy computation of trial_length (for backwards compatibility) - edf.drop(['trial_length'], axis=1, inplace=True) - - edf['endtime_buggy'] = [edf['starttime'].iloc[ti + 1] - if ti < len(edf) - 1 - else time[-1] - for ti in range(len(edf))] - - edf['trial_length'] = edf['endtime_buggy'] - edf['starttime'] - edf.drop(['endtime_buggy'], axis=1, inplace=True) - - # Make trials contiguous, and rebase time: - edf.drop(['endframe', - 'starttime', - 'endtime', - 'change_time', - 'lick_times', - 'reward_times'], axis=1, inplace=True) - - edf['endframe'] = [edf['startframe'].iloc[ti + 1] - if ti < len(edf) - 1 - else len(time) - 1 - for ti in range(len(edf))] - - _lks = licks['frame'] - edf['lick_frames'] = [_lks[np.logical_and(_lks > int(row['startframe']), - _lks <= int(row['endframe']))].values - for _, row in edf.iterrows()] - - # this variable was created to bring code into - # line with pep8; deleting to protect against - # changing logic - del _lks - - edf['starttime'] = [time[edf['startframe'].iloc[ti]] - for ti in range(len(edf))] - - edf['endtime'] = [time[edf['endframe'].iloc[ti]] - for ti in range(len(edf))] - - # Proper computation of trial_length: - # edf['trial_length'] = edf['endtime'] - edf['starttime'] - - edf['change_time'] = [time[int(cf)] - if not np.isnan(cf) - else float('nan') - for cf in edf['change_frame']] - - edf['lick_times'] = [[time[fi] for fi in frame_arr] - for frame_arr in edf['lick_frames']] - - edf['trial_type'] = edf.apply(categorize_one_trial, axis=1) - - edf['reward_times'] = [[time[fi] for fi in frame_list] - for frame_list in edf['reward_frames']] - - edf['number_of_rewards'] = edf['reward_times'].map(len) - edf['reward_licks'] = edf['reward_times'].apply(find_licks, args=(licks,)) - edf['reward_lick_count'] = edf['reward_licks'].map(len) - - edf['reward_lick_latency'] = edf['reward_licks'].map(lambda ll: None - if len(ll) == 0 - else np.min(ll)) - - # Things that dont depend on time/trial: - edf['mouse_id'] = metadata['mouseid'] - edf['response_window'] = [metadata['response_window']] * len(edf) - edf['task'] = metadata['task'] - edf['stage'] = metadata['stage'] - edf['session_duration'] = metadata['stoptime'] - edf['user_id'] = metadata['userid'] - edf['LDT_mode'] = metadata['lick_detect_training_mode'] - edf['blank_screen_timeout'] = metadata['blankscreen_on_timeout'] - edf['stim_duration'] = metadata['stim_duration'] - edf['blank_duration_range'] = [metadata['blank_duration_range']] * len(edf) - edf['prechange_minimum'] = metadata['delta_minimum'] - edf['stimulus_distribution'] = metadata['stimulus_distribution'] - edf['stimulus'] = metadata['stimulus'] - edf['distribution_mean'] = metadata['delta_mean'] - edf['computer_name'] = metadata['computer_name'] - edf['behavior_session_uuid'] = metadata['behavior_session_uuid'] - edf['startdatetime'] = startdatetime - edf['date'] = startdatetime.date() - edf['year'] = startdatetime.year - edf['month'] = startdatetime.month - edf['day'] = startdatetime.day - edf['hour'] = startdatetime.hour - edf['dayofweek'] = startdatetime.weekday() - edf['rig_id'] = metadata['rig_id'] - edf['cumulative_volume'] = edf['reward_volume'].cumsum() - - # Compute response latency (kinda tricky): - edf['valid_response_licks'] = [[lk for lk in tt.lick_times - if lk - tt.change_time > tt.response_window[0]] # noqa: E50 - for _, tt in edf.iterrows()] - - edf['response_latency'] = edf['valid_response_licks'].map(lambda x: float('inf') # noqa: E501 - if len(x) == 0 - else x[0]) - edf['response_latency'] -= edf['change_time'] - - edf.drop('valid_response_licks', axis=1, inplace=True) - - # Complicated: - assert len(edf.startdatetime.unique()) == 1 - np.testing.assert_array_equal(list(edf.index.values), np.arange(len(edf))) - - _latency = edf['response_latency'].values - _starttime = edf['starttime'].values - edf['reward_rate'] = calculate_reward_rate(response_latency=_latency, - starttime=_starttime) - - # this variable was created to bring code into - # line with pep8; deleting to protect against - # changing logic - del _latency - del _starttime - - # Response/trial metadata encoding: - _lt = edf['response_latency'] <= metadata['response_window'][1] - _gt = edf['response_latency'] >= metadata['response_window'][0] - edf['response'] = (~pd.isnull(edf['change_time']) & - ~pd.isnull(edf['response_latency']) & - _gt & - _lt).astype(np.float64) - - # this variable was created to bring code into - # line with pep8; deleting to protect against - # changing logic - del _lt - del _gt - - edf['response_type'] = get_response_type(edf[['trial_type', - 'response', - 'rewarded']]) - edf['color'] = [colormap(trial.trial_type, trial.response_type) - for _, trial in edf.iterrows()] - - # Reorder columns for backwards-compatibility: - return edf[EDF_COLUMNS] - - -def get_extended_trials(data, time=None): - if time is None: - time = get_time(data) - - return create_extended_trials(trials=get_trials_v0(data, time), - metadata=data_to_metadata(data, time), - time=time, - licks=data_to_licks(data, time)) - - -def calculate_response_latency_list( - trials: pd.DataFrame, response_window_start: float) -> List: - """per trial, detemines a response latency - - Parameters - ---------- - trials: pd.DataFrame - contains columns "lick_times" and "change_times" - response_window_start: float - [seconds] relative to the non-display-lag-compensated presentation - of the change-image - - Returns - ------- - response_latency_list: list - len() = trials.shape[0] - value is 'inf' if there are no valid licks in the trial - - """ - response_latency_list = [] - for _, t in trials.iterrows(): - valid_response_licks = \ - [x for x in t.lick_times - if x - t.change_time > response_window_start] - response_latency = ( - float('inf') - if len(valid_response_licks) == 0 - else valid_response_licks[0] - t.change_time) - response_latency_list.append(response_latency) - return response_latency_list - - -def calculate_reward_rate_fix_nans( - trials: pd.DataFrame, response_window_start: float) -> np.ndarray: - """per trial, detemines the reward rate, replacing infs with nans - - Parameters - ---------- - trials: pd.DataFrame - contains columns "lick_times", "change_times", and "start_time" - response_window_start: float - [seconds] relative to the non-display-lag-compensated presentation - of the change-image - - Returns - ------- - reward_rate: np.ndarray - size = trials.shape[0] - value is nan if calculate_reward_rate evaluates to 'inf' - - """ - response_latency_list = calculate_response_latency_list( - trials, - response_window_start) - reward_rate = calculate_reward_rate( - response_latency=response_latency_list, - starttime=trials.start_time.values) - reward_rate[np.isinf(reward_rate)] = float('nan') - return reward_rate - - -def construct_rolling_performance_df(trials: pd.DataFrame, - response_window_start, - session_type) -> pd.DataFrame: - """Return a DataFrame containing trial by trial behavior response - performance metrics. - - Parameters - ---------- - trials: pd.DataFrame - contains columns "lick_times", "change_times", and "start_time" - response_window_start: float - [seconds] relative to the non-display-lag-compensated presentation - of the change-image - session_type: str - used to check if this was a passive session - - Returns - ------- - pd.DataFrame - A pandas DataFrame containing: - trials_id [index]: - Index of the trial. All trials, including aborted trials, - are assigned an index starting at 0 for the first trial. - reward_rate: - Rewards earned in the previous 25 trials, normalized by - the elapsed time of the same 25 trials. Units are - rewards/minute. - hit_rate_raw: - Fraction of go trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - hit_rate: - Fraction of go trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. With trial count correction applied. - false_alarm_rate_raw: - Fraction of catch trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - false_alarm_rate: - Fraction of catch trials where the mouse licked in - the response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - rolling_dprime: - d prime calculated using the rolling hit_rate and - rolling false_alarm _rate. - - """ - reward_rate = calculate_reward_rate_fix_nans( - trials, - response_window_start) - - # Indices to build trial metrics dataframe: - trials_index = trials.index - not_aborted_index = \ - trials[np.logical_not(trials.aborted)].index - - # Initialize dataframe: - performance_metrics_df = pd.DataFrame(index=trials_index) - - # Reward rate: - performance_metrics_df['reward_rate'] = \ - pd.Series(reward_rate, index=trials.index) - - # Hit rate raw: - hit_rate_raw = get_hit_rate( - hit=trials.hit, - miss=trials.miss, - aborted=trials.aborted) - performance_metrics_df['hit_rate_raw'] = \ - pd.Series(hit_rate_raw, index=not_aborted_index) - - # Hit rate with trial count correction: - hit_rate = get_trial_count_corrected_hit_rate( - hit=trials.hit, - miss=trials.miss, - aborted=trials.aborted) - performance_metrics_df['hit_rate'] = \ - pd.Series(hit_rate, index=not_aborted_index) - - # False-alarm rate raw: - false_alarm_rate_raw = \ - get_false_alarm_rate( - false_alarm=trials.false_alarm, - correct_reject=trials.correct_reject, - aborted=trials.aborted) - performance_metrics_df['false_alarm_rate_raw'] = \ - pd.Series(false_alarm_rate_raw, index=not_aborted_index) - - # False-alarm rate with trial count correction: - false_alarm_rate = \ - get_trial_count_corrected_false_alarm_rate( - false_alarm=trials.false_alarm, - correct_reject=trials.correct_reject, - aborted=trials.aborted) - performance_metrics_df['false_alarm_rate'] = \ - pd.Series(false_alarm_rate, index=not_aborted_index) - - # Rolling-dprime: - if session_type.endswith('passive'): - # It does not make sense to calculate d' for a passive session - # So just set it to zeros - rolling_dprime = np.zeros(len(hit_rate)) - else: - rolling_dprime = get_rolling_dprime(hit_rate, false_alarm_rate) - performance_metrics_df['rolling_dprime'] = \ - pd.Series(rolling_dprime, index=not_aborted_index) - - return performance_metrics_df diff --git a/allensdk/brain_observatory/behavior/write_behavior_nwb/__init__.py b/allensdk/brain_observatory/behavior/write_behavior_nwb/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/write_behavior_nwb/__main__.py b/allensdk/brain_observatory/behavior/write_behavior_nwb/__main__.py deleted file mode 100644 index 9932f64eaa..0000000000 --- a/allensdk/brain_observatory/behavior/write_behavior_nwb/__main__.py +++ /dev/null @@ -1,87 +0,0 @@ -import os -import logging -import sys -import argschema -import marshmallow -from pynwb import NWBHDF5IO - -from allensdk.brain_observatory.behavior.behavior_session import ( - BehaviorSession) -from allensdk.brain_observatory.behavior.write_behavior_nwb._schemas import ( - InputSchema, OutputSchema) -from allensdk.brain_observatory.argschema_utilities import ( - write_or_print_outputs) -from allensdk.brain_observatory.session_api_utils import sessions_are_equal - - -def write_behavior_nwb(session_data, nwb_filepath): - - nwb_filepath_inprogress = nwb_filepath+'.inprogress' - nwb_filepath_error = nwb_filepath+'.error' - - # Clean out files from previous runs: - for filename in [nwb_filepath_inprogress, - nwb_filepath_error, - nwb_filepath]: - if os.path.exists(filename): - os.remove(filename) - - try: - json_session = BehaviorSession.from_json(session_data) - - behavior_session_id = session_data['behavior_session_id'] - lims_session = BehaviorSession.from_lims(behavior_session_id) - - logging.info("Comparing a BehaviorSession created from JSON " - "with a BehaviorSession created from LIMS") - assert sessions_are_equal(json_session, lims_session, reraise=True) - - nwbfile = lims_session.to_nwb() - with NWBHDF5IO(nwb_filepath_inprogress, 'w') as nwb_file_writer: - nwb_file_writer.write(nwbfile) - - logging.info("Comparing a BehaviorSession created from JSON " - "with a BehaviorSession created from NWB") - nwb_session = BehaviorSession.from_nwb_path(nwb_filepath_inprogress) - assert sessions_are_equal(json_session, nwb_session, reraise=True) - - os.rename(nwb_filepath_inprogress, nwb_filepath) - return {'output_path': nwb_filepath} - except Exception as e: - if os.path.isfile(nwb_filepath_inprogress): - os.rename(nwb_filepath_inprogress, nwb_filepath_error) - raise e - - -def main(): - - logging.basicConfig( - format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') - - args = sys.argv[1:] - try: - parser = argschema.ArgSchemaParser( - args=args, - schema_type=InputSchema, - output_schema_type=OutputSchema, - ) - logging.info('Input successfully parsed') - except marshmallow.exceptions.ValidationError as err: - logging.error('Parsing failure') - print(err) - raise err - - try: - output = write_behavior_nwb(parser.args['session_data'], - parser.args['output_path']) - logging.info('File successfully created') - except Exception as err: - logging.error('NWB write failure') - print(err) - raise err - - write_or_print_outputs(output, parser) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/behavior/write_behavior_nwb/_schemas.py b/allensdk/brain_observatory/behavior/write_behavior_nwb/_schemas.py deleted file mode 100644 index df45dabda0..0000000000 --- a/allensdk/brain_observatory/behavior/write_behavior_nwb/_schemas.py +++ /dev/null @@ -1,81 +0,0 @@ -from argschema import ArgSchema -from argschema.fields import (LogLevel, String, Int, Nested, List) -import marshmallow as mm -import pandas as pd - -from allensdk.brain_observatory.argschema_utilities import ( - check_read_access, check_write_access_overwrite, RaisingSchema) - - -class BehaviorSessionData(RaisingSchema): - behavior_session_id = Int(required=True, - description=("Unique identifier for the " - "behavior session to write into " - "NWB format")) - foraging_id = String(required=True, - description=("The foraging_id for the behavior " - "session")) - driver_line = List(String, - required=True, - description='Genetic driver line(s) of subject') - reporter_line = List(String, - required=True, - description='Genetic reporter line(s) of subject') - full_genotype = String(required=True, - description='Full genotype of subject') - rig_name = String(required=True, - description=("Name of experimental rig used for " - "the behavior session")) - date_of_acquisition = String(required=True, - description=("Date of acquisition of " - "behavior session, in string " - "format")) - external_specimen_name = Int(required=True, - description='LabTracks ID of the subject') - behavior_stimulus_file = String(required=True, - validate=check_read_access, - description=("Path of behavior_stimulus " - "camstim *.pkl file")) - date_of_birth = String(required=True, description="Subject date of birth") - sex = String(required=True, description="Subject sex") - age = String(required=True, description="Subject age") - stimulus_name = String(required=True, - description=("Name of stimulus presented during " - "behavior session")) - - @mm.pre_load - def set_stimulus_name(self, data, **kwargs): - if data.get("stimulus_name") is None: - pkl = pd.read_pickle(data["behavior_stimulus_file"]) - try: - stimulus_name = pkl["items"]["behavior"]["cl_params"]["stage"] - except KeyError: - raise mm.ValidationError( - f"Could not obtain stimulus_name/stage information from " - f"the *.pkl file ({data['behavior_stimulus_file']}) " - f"for the behavior session to save as NWB! The " - f"following series of nested keys did not work: " - f"['items']['behavior']['cl_params']['stage']" - ) - data["stimulus_name"] = stimulus_name - return data - - -class InputSchema(ArgSchema): - class Meta: - unknown = mm.RAISE - log_level = LogLevel(default='INFO', - description='Logging level of the module') - session_data = Nested(BehaviorSessionData, - required=True, - description='Data pertaining to a behavior session') - output_path = String(required=True, - validate=check_write_access_overwrite, - description='Path of output.json to be written') - - -class OutputSchema(RaisingSchema): - input_parameters = Nested(InputSchema) - output_path = String(required=True, - validate=check_write_access_overwrite, - description='Path of output.json to be written') diff --git a/allensdk/brain_observatory/behavior/write_nwb/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/write_nwb/__main__.py b/allensdk/brain_observatory/behavior/write_nwb/__main__.py deleted file mode 100644 index 127ddcad8a..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/__main__.py +++ /dev/null @@ -1,93 +0,0 @@ -import os -import logging -import sys -import argschema -import marshmallow -from pynwb import NWBHDF5IO - -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import ( - BehaviorOphysExperiment) -from allensdk.brain_observatory.behavior.write_nwb._schemas import ( - InputSchema, OutputSchema) -from allensdk.brain_observatory.argschema_utilities import ( - write_or_print_outputs) -from allensdk.brain_observatory.session_api_utils import sessions_are_equal - - -def write_behavior_ophys_nwb(session_data: dict, - nwb_filepath: str, - skip_eye_tracking: bool): - - nwb_filepath_inprogress = nwb_filepath+'.inprogress' - nwb_filepath_error = nwb_filepath+'.error' - - # Clean out files from previous runs: - for filename in [nwb_filepath_inprogress, - nwb_filepath_error, - nwb_filepath]: - if os.path.exists(filename): - os.remove(filename) - - try: - json_session = BehaviorOphysExperiment.from_json( - session_data=session_data, skip_eye_tracking=skip_eye_tracking) - lims_session = BehaviorOphysExperiment.from_lims( - ophys_experiment_id=session_data['ophys_experiment_id'], - skip_eye_tracking=skip_eye_tracking) - - logging.info("Comparing a BehaviorOphysExperiment created from JSON " - "with a BehaviorOphysExperiment created from LIMS") - assert sessions_are_equal(json_session, lims_session, reraise=True, - ignore_keys={'metadata': {'project_code'}}) - - nwbfile = json_session.to_nwb() - with NWBHDF5IO(nwb_filepath_inprogress, 'w') as nwb_file_writer: - nwb_file_writer.write(nwbfile) - - logging.info("Comparing a BehaviorOphysExperiment created from JSON " - "with a BehaviorOphysExperiment created from NWB") - nwb_session = BehaviorOphysExperiment.from_nwb(nwbfile=nwbfile) - assert sessions_are_equal(json_session, nwb_session, reraise=True) - - os.rename(nwb_filepath_inprogress, nwb_filepath) - return {'output_path': nwb_filepath} - except Exception as e: - if os.path.isfile(nwb_filepath_inprogress): - os.rename(nwb_filepath_inprogress, nwb_filepath_error) - raise e - - -def main(): - - logging.basicConfig( - format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') - - args = sys.argv[1:] - try: - parser = argschema.ArgSchemaParser( - args=args, - schema_type=InputSchema, - output_schema_type=OutputSchema, - ) - logging.info('Input successfully parsed') - except marshmallow.exceptions.ValidationError as err: - logging.error('Parsing failure') - print(err) - raise err - - try: - skip_eye_tracking = parser.args['skip_eye_tracking'] - output = write_behavior_ophys_nwb(parser.args['session_data'], - parser.args['output_path'], - skip_eye_tracking) - logging.info('File successfully created') - except Exception as err: - logging.error('NWB write failure') - print(err) - raise err - - write_or_print_outputs(output, parser) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/behavior/write_nwb/_schemas.py b/allensdk/brain_observatory/behavior/write_nwb/_schemas.py deleted file mode 100644 index c4b454cdb9..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/_schemas.py +++ /dev/null @@ -1,144 +0,0 @@ -from argschema import ArgSchema, InputFile -from argschema.fields import LogLevel, String, Int, Nested, \ - Boolean, \ - Float, List, Dict -from marshmallow import RAISE - -from allensdk.brain_observatory.argschema_utilities import check_read_access, \ - check_write_access_overwrite, RaisingSchema - - -class CellSpecimenTable(RaisingSchema): - cell_roi_id = Dict(String, Int, required=True) - cell_specimen_id = Dict(String, Int(allow_none=True), required=True) - x = Dict(String, Int, required=True) - y = Dict(String, Int, required=True) - max_correction_up = Dict(String, Float, required=True) - max_correction_right = Dict(String, Float, required=True) - max_correction_down = Dict(String, Float, required=True) - max_correction_left = Dict(String, Float, required=True) - valid_roi = Dict(String, Boolean, required=True) - height = Dict(String, Int, required=True) - width = Dict(String, Int, required=True) - mask_image_plane = Dict(String, Int, required=True) - roi_mask = Dict(String, List(List(Boolean)), required=True) - - -class SessionData(RaisingSchema): - ophys_experiment_id = Int(required=True, - description='unique identifier for this ophys ' - 'session') - ophys_session_id = Int(required=True, - description='The ophys session id that the ophys ' - 'experiment to be written to NWB is ' - 'from') - behavior_session_id = Int(required=True, - description='The behavior session id that the ' - 'ophys experiment to be written to ' - 'written to NWB is from') - foraging_id = String(required=True, - description='The foraging id associated with the ' - 'ophys session') - rig_name = String(required=True, description='name of ophys device') - movie_height = Int(required=True, - description='height of field-of-view for 2p movie') - movie_width = Int(required=True, - description='width of field-of-view for 2p movie') - container_id = Int(required=True, - description='container that this experiment is in') - sync_file = String(required=True, description='path to sync file') - max_projection_file = String(required=True, - description='path to max_projection file') - behavior_stimulus_file = String(required=True, - description='path to behavior_stimulus ' - 'file') - dff_file = String(required=True, description='path to dff file') - demix_file = String(required=True, description='path to demix file') - average_intensity_projection_image_file = String( - required=True, - description='path to ' - 'average_intensity_projection_image file') - rigid_motion_transform_file = String(required=True, - description='path to ' - 'rigid_motion_transform' - ' file') - targeted_structure = String(required=True, - description='Anatomical structure that the ' - 'experiment targeted') - targeted_depth = Int(required=True, - description='Cortical depth that the experiment ' - 'targeted') - stimulus_name = String(required=True, description='Stimulus Name') - date_of_acquisition = String(required=True, - description='date of acquisition of ' - 'experiment, as string (no ' - 'timezone info but relative ot ' - 'UTC)') - reporter_line = List(String, required=True, description='reporter line') - driver_line = List(String, required=True, description='driver line') - external_specimen_name = Int(required=True, - description='LabTracks ID of the animal') - full_genotype = String(required=True, description='full genotype') - surface_2p_pixel_size_um = Float(required=True, - description='the spatial extent (in um) ' - 'of the 2p field-of-view') - ophys_cell_segmentation_run_id = Int(required=True, - description='ID of the active ' - 'segmentation run used ' - 'to generate this file') - cell_specimen_table_dict = Nested(CellSpecimenTable, required=True, - description='Table of cell specimen ' - 'info') - sex = String(required=True, description='sex') - age = String(required=True, description='age') - eye_tracking_rig_geometry = Dict( - required=True, - description="Mapping containing information about session rig " - "geometry used for eye gaze mapping." - ) - eye_tracking_filepath = String( - required=True, - validate=check_read_access, - description="h5 filepath containing eye tracking ellipses" - ) - events_file = InputFile( - required=True, - description='h5 filepath to events data' - ) - imaging_plane_group = Int( - required=True, - allow_none=True, - description="A numeric index that indicates the order that the " - "frames were acquired when dealing with an imaging plane " - "in a mesoscope experiment. Will be None for Scientifica " - "experiments." - ) - plane_group_count = Int( - required=True, - description="The total number of plane groups associated with the " - "ophys session that the experiment belongs to. Will be 0 " - "for Scientifica experiments and nonzero for Mesoscope " - "experiments." - ) - - -class InputSchema(ArgSchema): - class Meta: - unknown = RAISE - - log_level = LogLevel(default='INFO', - description='set the logging level of the module') - session_data = Nested(SessionData, required=True, - description='records of the individual probes ' - 'used for this experiment') - output_path = String(required=True, validate=check_write_access_overwrite, - description='write outputs to here') - skip_eye_tracking = Boolean( - required=True, default=False, - description="Whether or not to skip processing eye tracking data. " - "If True, no eye tracking data will be written to NWB") - - -class OutputSchema(RaisingSchema): - input_parameters = Nested(InputSchema) - output_path = String(required=True, description='write outputs to here') diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py deleted file mode 100644 index e04eaa82e8..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py +++ /dev/null @@ -1,54 +0,0 @@ -import os.path - -from pynwb.spec import NWBNamespaceBuilder, export_spec, NWBGroupSpec, \ - NWBDatasetSpec - -NAMESPACE = 'ndx-aibs-ophys-event-detection' - - -def main(): - - ns_builder = NWBNamespaceBuilder( - doc="Detected events from optical physiology ROI fluorescence traces", - name=f"""{NAMESPACE}""", - version="""0.1.0""", - author="""Allen Institute for Brain Science""", - contact="""waynew@alleninstitute.org""" - ) - - ns_builder.include_type('RoiResponseSeries', namespace='core') - ns_builder.include_type('DynamicTableRegion', namespace='core') - ns_builder.include_type('TimeSeries', namespace='core') - ns_builder.include_type('NWBDataInterface', namespace='core') - - ophys_events_spec = NWBGroupSpec( - neurodata_type_def='OphysEventDetection', - neurodata_type_inc='RoiResponseSeries', - name='event_detection', - doc='Stores event detection output', - datasets=[ - NWBDatasetSpec( - name='lambdas', - dtype='float', - doc='calculated regularization weights', - shape=(None,) - ), - NWBDatasetSpec( - name='noise_stds', - dtype='float', - doc='calculated noise std deviations', - shape=(None,) - ) - ] - ) - - new_data_types = [ophys_events_spec] - - # export the spec to yaml files in the spec folder - output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) - export_spec(ns_builder, new_data_types, output_dir) - - -if __name__ == "__main__": - # usage: python create_extension_spec.py - main() diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml deleted file mode 100644 index 38004437d9..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml +++ /dev/null @@ -1,16 +0,0 @@ -groups: -- neurodata_type_def: OphysEventDetection - neurodata_type_inc: RoiResponseSeries - name: event_detection - doc: Stores event detection output - datasets: - - name: lambdas - dtype: float - shape: - - null - doc: calculated regularization weights - - name: noise_stds - dtype: float - shape: - - null - doc: calculated noise std deviations diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml deleted file mode 100644 index 0120333451..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml +++ /dev/null @@ -1,14 +0,0 @@ -namespaces: -- author: Allen Institute for Brain Science - contact: waynew@alleninstitute.org - doc: Detected events from optical physiology ROI fluorescence traces - name: ndx-aibs-ophys-event-detection - schema: - - namespace: core - neurodata_types: - - RoiResponseSeries - - DynamicTableRegion - - TimeSeries - - NWBDataInterface - - source: ndx-aibs-ophys-event-detection.extensions.yaml - version: 0.1.0 diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py deleted file mode 100644 index 142c234173..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py +++ /dev/null @@ -1,15 +0,0 @@ -import os -from pynwb import load_namespaces, get_class - -# Set path of the namespace.yaml file to the expected install location -ndx_ophys_events_specpath = os.path.join( - os.path.dirname(__file__), - 'ndx-aibs-ophys-event-detection.namespace.yaml' -) - -# Load the namespace -load_namespaces(ndx_ophys_events_specpath) - - -OphysEventDetection = get_class('OphysEventDetection', - 'ndx-aibs-ophys-event-detection') diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py deleted file mode 100644 index 954a2ac25f..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py +++ /dev/null @@ -1,55 +0,0 @@ -import os.path - -from pynwb.spec import NWBNamespaceBuilder, export_spec, NWBGroupSpec, \ - NWBDatasetSpec - -NAMESPACE = 'ndx-aibs-stimulus-template' - - -def main(): - - ns_builder = NWBNamespaceBuilder( - doc="Stimulus images", - name=f"""{NAMESPACE}""", - version="""0.1.0""", - author="""Allen Institute for Brain Science""", - contact="""waynew@alleninstitute.org""" - ) - - ns_builder.include_type('ImageSeries', namespace='core') - ns_builder.include_type('TimeSeries', namespace='core') - ns_builder.include_type('NWBDataInterface', namespace='core') - - stimulus_template_spec = NWBGroupSpec( - neurodata_type_def='StimulusTemplate', - neurodata_type_inc='ImageSeries', - doc='Note: image names in control_description are referenced by ' - 'stimulus/presentation table as well as intervals ' - '\n' - 'Each image shown to the animals is warped to account for ' - 'distance and eye position relative to the monitor. This ' - 'extension stores the warped images that were shown to the animal ' - 'as well as an unwarped version of each image in which a mask has ' - 'been applied such that only the pixels visible after warping are ' - 'included', - datasets=[ - NWBDatasetSpec( - name='unwarped', - dtype='float', - doc='Original image with mask applied such that only the ' - 'pixels visible after warping are included', - shape=(None, None, None) - ) - ] - ) - - new_data_types = [stimulus_template_spec] - - # export the spec to yaml files in the spec folder - output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) - export_spec(ns_builder, new_data_types, output_dir) - - -if __name__ == "__main__": - # usage: python create_extension_spec.py - main() diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml deleted file mode 100644 index 23d3c63a04..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml +++ /dev/null @@ -1,16 +0,0 @@ -groups: -- neurodata_type_def: StimulusTemplate - neurodata_type_inc: ImageSeries - doc: Each image shown to the animals is warped to account for distance and eye position - relative to the monitor. This extension stores the warped images that were shown - to the animal as well as an unwarped version of each image in which a mask has - been applied such that only the pixels visible after warping are included - datasets: - - name: unwarped - dtype: float - shape: - - null - - null - - null - doc: Original image with mask applied such that only the pixels visible after - warping are included diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml deleted file mode 100644 index bf40bfa516..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml +++ /dev/null @@ -1,13 +0,0 @@ -namespaces: -- author: Allen Institute for Brain Science - contact: waynew@alleninstitute.org - doc: Stimulus images - name: ndx-aibs-stimulus-template - schema: - - namespace: core - neurodata_types: - - ImageSeries - - TimeSeries - - NWBDataInterface - - source: ndx-aibs-stimulus-template.extensions.yaml - version: 0.1.0 diff --git a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py deleted file mode 100644 index 1e90c78da9..0000000000 --- a/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py +++ /dev/null @@ -1,15 +0,0 @@ -import os -from pynwb import load_namespaces, get_class - -# Set path of the namespace.yaml file to the expected install location -ndx_stimulus_template_specpath = os.path.join( - os.path.dirname(__file__), - 'ndx-aibs-stimulus-template.namespace.yaml' -) - -# Load the namespace -load_namespaces(ndx_stimulus_template_specpath) - - -StimulusTemplateExtension = get_class('StimulusTemplate', - 'ndx-aibs-stimulus-template') diff --git a/allensdk/brain_observatory/brain_observatory_exceptions.py b/allensdk/brain_observatory/brain_observatory_exceptions.py deleted file mode 100644 index aa170b079f..0000000000 --- a/allensdk/brain_observatory/brain_observatory_exceptions.py +++ /dev/null @@ -1,48 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -class BrainObservatoryAnalysisException(Exception): pass - -class MissingStimulusException(Exception): pass - -class NoEyeTrackingException(Exception): pass - -class EpochSeparationException(Exception): - - def __init__(self, *args, **kwargs): - - self.delta = kwargs.pop('delta') - - super(EpochSeparationException, self).__init__(*args, **kwargs) \ No newline at end of file diff --git a/allensdk/brain_observatory/brain_observatory_plotting.py b/allensdk/brain_observatory/brain_observatory_plotting.py deleted file mode 100644 index 9985d23d15..0000000000 --- a/allensdk/brain_observatory/brain_observatory_plotting.py +++ /dev/null @@ -1,1007 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import matplotlib.pyplot as plt -from matplotlib.ticker import MaxNLocator -import numpy as np -import pandas as pd -import os -import logging - - -def plot_drifting_grating_traces(dg, save_dir): - '''saves figures with a Ori X TF grid of mean resposes''' - logging.info("Plotting Ori and TF mean response for all cells") - - blank = dg.sweep_response[dg.stim_table.temporal_frequency == 0] - for nc in range(dg.numbercells): - if np.mod(nc, 20) == 0: - logging.info("Cell #%s", str(nc)) - xtime = np.arange(-1 * dg.interlength / dg.acquisition_rate, (dg.sweeplength + - dg.interlength) / dg.acquisition_rate, 1 / dg.acquisition_rate) - plt.figure(nc, figsize=(20, 16)) - vmax = 0 - vmin = 0 - try: - blank_p = blank[str(nc)].mean() + \ - (blank[str(nc)].std() / len(blank[str(nc)])) - blank_n = blank[str(nc)].mean() - \ - (blank[str(nc)].std() / len(blank[str(nc)])) - except: - blank_p = blank.iloc[:, nc].apply( - np.mean) + (blank.iloc[:, nc].apply(np.std) / blank.iloc[:, nc].apply(len)) - blank_n = blank.iloc[:, nc].apply( - np.mean) - (blank.iloc[:, nc].apply(np.std) / blank.iloc[:, nc].apply(len)) - for ori in dg.orivals: - ori_pt = np.where(dg.orivals == ori)[0][0] - for tf in dg.tfvals[1:]: - tf_pt = np.where(dg.tfvals == tf)[0][0] - sp_pt = (5 * ori_pt) + tf_pt - subset_response = dg.sweep_response[ - (dg.stim_table.temporal_frequency == tf) & (dg.stim_table.orientation == ori)] - try: - subset_response_p = subset_response[str(nc)].mean( - ) + (subset_response[str(nc)][:-1].std() / len(subset_response[str(nc)])) - subset_response_n = subset_response[str(nc)].mean( - ) - (subset_response[str(nc)][:-1].std() / len(subset_response[str(nc)])) - except: - subset_response_p = subset_response.iloc[:, nc].apply( - np.mean) + (subset_response.iloc[:, nc].apply(np.std) / subset_response.iloc[:, nc].apply(len)) - subset_response_n = subset_response.iloc[:, nc].apply( - np.mean) - (subset_response.iloc[:, nc].apply(np.std) / subset_response.iloc[:, nc].apply(len)) - ax = plt.subplot(8, 5, sp_pt) - while len(xtime) > len(subset_response[str(nc)].mean()): - xtime = np.delete(xtime, -1) - try: - ax.fill_between(xtime, subset_response_p, - subset_response_n, color='b', alpha=0.5) - except: - pass - try: - ax.fill_between(xtime, blank_p, blank_n, - color='k', alpha=0.5) - except: - pass - try: - ax.plot(xtime, subset_response[ - str(nc)].mean(), color='b', lw=2) - except: - pass - ax.plot(xtime, subset_response[ - str(nc)].mean(), color='b', lw=2) - # TODO: remove the [:119] and [:-1] and the try/except - ax.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) - ax.axvspan(0, dg.sweeplength / dg.acquisition_rate, - ymin=0, ymax=1, facecolor='gray', alpha=0.3) - ax.set_xlim(-1, 3) - ax.set_xticks(range(-1, 4)) - ax.yaxis.set_major_locator(MaxNLocator(4)) - vmax = np.where(np.amax(subset_response_p) > - vmax, np.amax(subset_response_p), vmax) - vmin = np.where(np.amin(subset_response_n) < - vmin, np.amin(subset_response_n), vmin) - - if ori_pt < 7: - ax.set_xticks([]) - else: - ax.set_xlabel("Time (s)", fontsize=20) - if tf_pt > 1: - ax.set_yticks([]) - else: - ax.set_ylabel(str(dg.orivals[ori_pt]), fontsize=24) - if ori_pt == 0: - ax.set_title(str(dg.tfvals[tf_pt]), fontsize=24) - - for i in range(1, sp_pt + 1): - ax = plt.subplot(8, 5, i) - ax.set_ylim(vmin, vmax) - plt.tick_params(labelsize=16) - plt.tight_layout() - plt.suptitle("Cell " + str(nc + 1), fontsize=20) - plt.subplots_adjust(top=0.9) - filename = 'Traces DG Cell_' + str(nc + 1) + '.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() - - -def plot_ns_traces(nsa, save_dir): - logging.info("Plotting Natural Scene traces for each cell") - xtime = np.arange(-1 * nsa.interlength / nsa.acquisition_rate, (nsa.sweeplength + - nsa.interlength) / nsa.acquisition_rate, 1 / nsa.acquisition_rate) - blank = nsa.sweep_response[nsa.stim_table.frame == -1] - for nc in range(nsa.numbercells): - if np.mod(nc, 20) == 0: - logging.info("Cell #%s", str(nc)) - vmax = 0 - vmin = 0 - blank_p = blank[str(nc)].mean() + \ - (blank[str(nc)].std() / len(blank[str(nc)])) - blank_n = blank[str(nc)].mean() - \ - (blank[str(nc)].std() / len(blank[str(nc)])) - plt.figure(nc, figsize=(30, 25)) - for ns in range(nsa.number_scenes - 1): - subset_response = nsa.sweep_response[nsa.stim_table.frame == ns] - subset_response_p = subset_response[str(nc)].mean( - ) + (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) - subset_response_n = subset_response[str(nc)].mean( - ) - (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) - ax = plt.subplot(10, 12, ns + 1) - try: - ax.fill_between(xtime, subset_response_p, - subset_response_n, color='b', alpha=0.5) - except: - xtime = xtime[:-1] - ax.fill_between(xtime, subset_response_p, - subset_response_n, color='b', alpha=0.5) - ax.fill_between(xtime, blank_p, blank_n, color='k', alpha=0.5) - ax.plot(xtime, subset_response[str(nc)].mean(), color='b', lw=2) - ax.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) - ax.axvspan(0, nsa.sweeplength / nsa.acquisition_rate, - ymin=0, ymax=1, facecolor='gray', alpha=0.3) - ax.yaxis.set_major_locator(MaxNLocator(4)) - vmax = np.where(np.amax(subset_response_p) > vmax, - np.amax(subset_response_p), vmax) - vmin = np.where(np.amin(subset_response_n) < vmin, - np.amin(subset_response_n), vmin) - if ns < 108: - ax.set_xticks([]) - if np.mod(ns, 12): - ax.set_yticks([]) - for i in range(1, nsa.number_scenes): - ax = plt.subplot(10, 12, i) - ax.set_ylim(vmin, vmax) - plt.tight_layout() - plt.suptitle("Cell " + str(nc + 1), fontsize=20) - plt.subplots_adjust(top=0.9) - filename = 'NS Traces Cell_' + str(nc + 1) + '.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() - - -def plot_sg_traces(sg, save_dir): - logging.info("Plotting Static Grating traces for each cell") - xtime = np.arange(-1 * sg.interlength / sg.acquisition_rate, (sg.sweeplength + - sg.interlength) / sg.acquisition_rate, 1 / sg.acquisition_rate) - blank = sg.sweep_response[sg.stim_table.spatial_frequency == 0] - for nc in range(sg.numbercells): - if np.mod(nc, 20) == 0: - logging.info("Cell #%s", str(nc)) - vmax = 0 - vmin = 0 - blank_p = blank[str(nc)].mean() + \ - (blank[str(nc)].std() / len(blank[str(nc)])) - blank_n = blank[str(nc)].mean() - \ - (blank[str(nc)].std() / len(blank[str(nc)])) - while len(xtime) > len(blank_p): - xtime = np.delete(xtime, -1) - plt.figure(nc, figsize=(30, 30)) - ph_dict = {0: 0, 0.25: 6, 0.5: 77, 0.75: 83} - for ori in sg.orivals: - ori_pt = np.where(sg.orivals == ori)[0][0] - for sf in sg.sfvals[1:]: - sf_pt = np.where(sg.sfvals == sf)[0][0] - for phase in sg.phasevals: - ph_pt = ph_dict[phase] - subplotnum = sf_pt + (ori_pt * 11) + ph_pt - subset_response = sg.sweep_response[(sg.stim_table.spatial_frequency == sf) & ( - sg.stim_table.orientation == ori) & (sg.stim_table.phase == phase)] - subset_response_p = subset_response[str(nc)].mean( - ) + (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) - subset_response_n = subset_response[str(nc)].mean( - ) - (subset_response[str(nc)][:].std() / len(subset_response[str(nc)])) - ax = plt.subplot(13, 11, subplotnum) - ax.fill_between(xtime, subset_response_p, - subset_response_n, color='b', alpha=0.5) - ax.fill_between(xtime, blank_p, blank_n, - color='k', alpha=0.5) - ax.plot(xtime, subset_response[ - str(nc)].mean(), color='b', lw=2) - ax.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) - ax.axvspan(0, sg.sweeplength / sg.acquisition_rate, - ymin=0, ymax=1, facecolor='gray', alpha=0.3) - ax.yaxis.set_major_locator(MaxNLocator(4)) - vmax = np.where(np.amax(subset_response_p) - > vmax, np.amax(subset_response_p), vmax) - vmin = np.where(np.amin(subset_response_n) - < vmin, np.amin(subset_response_n), vmin) - if np.mod(subplotnum, 11) != 1: - ax.set_yticks([]) - else: - ax.set_ylabel(ori, fontsize=20) - if subplotnum < 133: - ax.set_xticks([]) - if subplotnum < 12: - ax.set_title(sf, fontsize=20) - if subplotnum == 3: - ax.set_title("Phase 0.0", fontsize=20) - if subplotnum == 9: - ax.set_title("Phase 0.25", fontsize=20) - if subplotnum == 80: - ax.set_title("Phase 0.5", fontsize=20) - if subplotnum == 86: - ax.set_title("Phase 0.75", fontsize=20) - for i in range(1, 144): - ax = plt.subplot(13, 11, i) - ax.set_ylim(vmin, vmax) - plt.tight_layout() - plt.suptitle("Cell " + str(nc + 1), fontsize=20) - plt.subplots_adjust(top=0.9) - filename = 'SG Traces Cell_' + str(nc + 1) + '.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() - - -def plot_lsn_traces(lsn, save_dir, suffix=''): - logging.info("Plotting LSN traces for all cells") - xtime = np.arange(-lsn.interlength / lsn.acquisition_rate, - (lsn.interlength + lsn.sweeplength) / lsn.acquisition_rate, - 1.0 / lsn.acquisition_rate) - - for nc in range(lsn.numbercells): - if np.mod(nc, 20) == 0: - logging.info("Cell #%s", str(nc)) - - plt.figure(nc, figsize=(24, 20)) - vmax = 0 - vmin = 0 - one_cell = lsn.sweep_response[str(nc)] - - for yp in range(16): - for xp in range(28): - sp_pt = (yp * 28) + xp + 1 - on_frame = np.where(lsn.LSN[:, yp, xp] == 255)[0] - off_frame = np.where(lsn.LSN[:, yp, xp] == 0)[0] - subset_on = one_cell[lsn.stim_table.frame.isin(on_frame)] - subset_off = one_cell[lsn.stim_table.frame.isin(off_frame)] - - subset_on_mean = subset_on.mean() - subset_off_mean = subset_off.mean() - - ax = plt.subplot(16, 28, sp_pt) - ax.plot(xtime, subset_on_mean, color='r', lw=2) - ax.plot(xtime, subset_off_mean, color='b', lw=2) - ax.axvspan(0, lsn.sweeplength / lsn.acquisition_rate, - ymin=0, ymax=1, facecolor='gray', alpha=0.3) - vmax = np.where(np.amax(subset_on_mean) > vmax, - np.amax(subset_on_mean), vmax) - vmax = np.where(np.amax(subset_off_mean) > vmax, - np.amax(subset_off_mean), vmax) - vmin = np.where(np.amin(subset_on_mean) < vmin, - np.amin(subset_on_mean), vmin) - vmin = np.where(np.amin(subset_off_mean) < vmin, - np.amin(subset_off_mean), vmin) - ax.set_xticks([]) - ax.set_yticks([]) - - for i in range(1, sp_pt + 1): - ax = plt.subplot(16, 28, i) - ax.set_ylim(vmin, vmax) - - plt.tight_layout() - plt.suptitle("Cell " + str(nc + 1), fontsize=20) - plt.subplots_adjust(top=0.9) - filename = 'Traces LSN Cell_' + str(nc + 1) + suffix + '.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() - - -def _plot_3sa(dg, nm1, nm3, save_dir): - logging.info("Plotting for all cell") - for nc in range(dg.numbercells): - if np.mod(nc, 20) == 0: - logging.info("Cell #%s", str(nc)) - plt.figure(nc, figsize=(20, 20)) - ax1 = plt.subplot2grid((6, 6), (0, 0), colspan=4) # full trace - ax2 = plt.subplot2grid((6, 6), (0, 4)) # histogram of F - ax3 = plt.subplot2grid((6, 6), (1, 0), colspan=4) # running speed - ax4 = plt.subplot2grid((6, 6), (1, 4)) - ax5 = plt.subplot2grid((6, 6), (1, 5), sharex=ax4, sharey=ax4) - ax6 = plt.subplot2grid((6, 6), (2, 0), colspan=2) - ax7 = plt.subplot2grid((6, 6), (2, 2), colspan=2) - ax8 = plt.subplot2grid((6, 6), (2, 4), colspan=2) - ax9 = plt.subplot2grid((6, 6), (3, 0)) - ax10 = plt.subplot2grid((6, 6), (4, 0), colspan=3) - ax11 = plt.subplot2grid((6, 6), (5, 0), colspan=3) - ax12 = plt.subplot2grid((6, 6), (4, 3), colspan=3) - ax13 = plt.subplot2grid((6, 6), (5, 3), colspan=3) - - xtime = np.arange(0, np.size(dg.celltraces, 1), 1.) - xtime /= dg.acquisition_rate - dif = np.ediff1d(dg.stim_table.start.values, - to_begin=8000, to_end=8000) - test = np.argwhere(dif > 5000) - ax1.plot(xtime, dg.celltraces[nc, :]) - for i in range(len(test) - 1): - ax1.axvspan(xmin=(dg.stim_table.start.iloc[test[i]].values / dg.acquisition_rate), xmax=( - dg.stim_table.end.iloc[test[i + 1] - 1].values / dg.acquisition_rate), color='gray', alpha=0.3) - ax1.axvspan(xmin=nm1.stim_table.start.min() / nm1.acquisition_rate, xmax=( - (nm1.stim_table.start.max() + nm1.sweeplength) / nm1.acquisition_rate), color='red', alpha=0.3) - dif = np.ediff1d(nm3.stim_table.start.values, - to_begin=8000, to_end=8000) - test = np.argwhere(dif > 5000) - for i in range(len(test) - 1): - ax1.axvspan(xmin=(nm3.stim_table.start.iloc[test[i]].values / nm3.acquisition_rate), xmax=( - (nm3.stim_table.end.iloc[test[i + 1] - 1].values + nm3.sweeplength) / nm3.acquisition_rate), color='blue', alpha=0.3) - ax1.set_xlabel("Time (s)", fontsize=20) - ax1.set_ylabel("Fluorescence", fontsize=20) - - ax2.hist(dg.celltraces[nc, :], bins=70) - ax2.set_yscale('log') - ax2.set_xlabel("Fluorescence", fontsize=20) - ax2.set_ylabel("Count", fontsize=20) - - xtime = np.arange(0, np.size(dg.dxcm), 1.) - xtime /= dg.acquisition_rate - ax3.plot(xtime, dg.dxcm, color='k') - ax3.set_xlabel("Time (s)", fontsize=20) - ax3.set_xlabel("Speed (cm/s)", fontsize=20) - - smax = nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[ - nc, :, 0]), 0] + nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[nc, :, 0]), 1] - vmax = nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[ - nc, :, 0]), 0] + nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[nc, :, 0]), 1] - rmax = np.where(smax > vmax, smax, vmax) - smin = nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[ - nc, :, 0]), 0] - nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[nc, :, 0]), 1] - vmin = nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[ - nc, :, 0]), 0] - nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[nc, :, 0]), 1] - rmin = np.where(smin < vmin, smin, vmin) - - ax4.errorbar(nm1.binned_dx_sp[:, 0], nm1.binned_cells_sp[ - nc, :, 0], yerr=nm1.binned_cells_sp[nc, :, 1], fmt='.', color='k') - ax4.set_ylim(rmin, rmax) - ax4.set_xlabel("Speed (cm/s)", fontsize=20) - ax4.set_ylabel("DF/F", fontsize=20) - ax4.set_title("Spontaneous", fontsize=20) - - ax5.errorbar(nm1.binned_dx_vis[:, 0], nm1.binned_cells_vis[ - nc, :, 0], yerr=nm1.binned_cells_vis[nc, :, 1], fmt='.') - ax5.set_ylim(rmin, rmax) - ax5.set_xlabel("Speed (cm/s)", fontsize=20) - ax5.set_ylabel("DF/F", fontsize=20) - ax5.set_title("Visual Stimuli", fontsize=20) - - peakori = dg.peak.ori_dg[nc] - peaktf = dg.peak.tf_dg[nc] - ax6.errorbar(dg.orivals, dg.response[:, peaktf, nc, 0], yerr=dg.response[ - :, peaktf, nc, 1], fmt='bo-', lw=2) - ax6.fill_between(dg.orivals, np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], dg.number_ori), np.repeat( - dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], dg.number_ori), color='gray', alpha=0.5) - ax6.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k') - ax6.annotate(str(dg.tfvals[peaktf]) + " Hz", - xy=(0, 0.9), xycoords='axes fraction', fontsize=14) - ax6.set_xticks(dg.orivals) - ax7.set_xlim(-10, 325) - ax6.set_xlabel("Direction (d)", fontsize=20) - ax6.set_ylabel("Mean DF/F (%)", fontsize=20) - ax6.yaxis.set_major_locator(MaxNLocator(6)) - - ax7.errorbar(range(5), dg.response[peakori, 1:, nc, 0], yerr=dg.response[ - peakori, 1:, nc, 1], fmt='bo-', lw=2) - ax7.fill_between(range(5), np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], 5), np.repeat( - dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], 5), color='gray', alpha=0.5) - ax7.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k', lw=2) - ax7.annotate(str(dg.orivals[peakori]) + " Deg", - xy=(0, 0.9), xycoords='axes fraction', fontsize=14) - ax7.set_xlim(-0.2, 4.2) - ax7.set_xticks(range(5)) - ax7.set_xticklabels(dg.tfvals[1:]) - ax7.set_xlabel("Temporal frequency (Hz)", fontsize=20) - - subset = dg.sweep_response[(dg.stim_table.orientation == dg.orivals[peakori]) & ( - dg.stim_table.temporal_frequency == dg.tfvals[peaktf])] - xtime = np.arange(-1 * dg.interlength / dg.acquisition_rate, (dg.sweeplength + - dg.interlength) / dg.acquisition_rate, 1 / dg.acquisition_rate) - while len(xtime) > len(subset[str(nc)].mean()): - xtime = np.delete(xtime, -1) - for index, row in subset.iterrows(): - ax8.plot(xtime, subset[str(nc)][index], lw=2) - ax8.set_xlim(-1, 3) - ax8.annotate(str(dg.orivals[peakori]) + " Deg / " + str( - dg.tfvals[peaktf]) + " Hz", xy=(0, 0.9), xycoords='axes fraction', fontsize=14) - ax8.set_xlabel("Time (s)", fontsize=20) - ax8.set_ylabel("DF/F (%)", fontsize=20) - ax8.axvspan(0, dg.sweeplength / dg.acquisition_rate, - ymin=0, ymax=1, facecolor='gray', alpha=0.3) - ax8.yaxis.set_major_locator(MaxNLocator(6)) - ax8.set_title("Trial responses to prefered ori/tf", fontsize=20) - - im = ax9.imshow(dg.response[:, 1:, nc, 0], - cmap='gray', interpolation='none') - ax9.set_ylabel("Direction (d)", fontsize=20) - ax9.set_yticks(range(8)) - ax9.set_yticklabels(dg.orivals) - ax9.set_xlabel("Temporal frequency (Hz)", fontsize=20) - ax9.set_xticks(range(5)) - ax9.set_xticklabels(dg.tfvals[1:]) - cbar = plt.colorbar(im, ax=ax9) - cbar.ax.set_ylabel('DF/F (%)', fontsize=8) - for t in cbar.ax.get_yticklabels(): - t.set_fontsize(8) - - xtime = np.arange(0, nm1.sweeplength / - nm1.acquisition_rate, 1 / nm1.acquisition_rate) - while len(xtime) > len(nm1.sweep_response[str(nc)].mean()): - xtime = np.delete(xtime, -1) - for index, row in nm1.sweep_response.iterrows(): - ax10.plot(xtime, nm1.sweep_response[str(nc)][index], lw=2) - ax10.set_xlabel("Time (s)", fontsize=20) - ax10.set_ylabel("DF/F", fontsize=20) - ax10.set_title("Natural Movie 1", fontsize=20, color='red') - - temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) - for i in range(len(nm1.stim_table)): - temp[i, :] = nm1.sweep_response[str(nc)].iloc[i] - ax11.imshow(temp, cmap='gray', interpolation='none', aspect=40) - ax11.set_ylabel("Trials", fontsize=20) - ax11.set_xticks([]) - - xtime = np.arange(0, nm3.sweeplength / - nm3.acquisition_rate, 1 / nm3.acquisition_rate) - while len(xtime) > len(nm3.sweep_response[str(nc)].mean()): - xtime = np.delete(xtime, -1) - for index, row in nm3.sweep_response.iterrows(): - ax12.plot(xtime, nm3.sweep_response[str(nc)][index], lw=2) - ax12.set_xlabel("Time (s)", fontsize=20) - ax12.set_ylabel("DF/F", fontsize=20) - ax12.set_title("Natural Movie Long", fontsize=20, color='blue') - - temp = np.empty((len(nm3.stim_table), nm3.sweeplength)) - for i in range(len(nm3.stim_table)): - temp[i, :] = nm3.sweep_response[str(nc)].iloc[i] - ax13.imshow(temp, cmap='gray', interpolation='none', aspect=100) - ax13.set_ylabel("Trials", fontsize=20) - ax13.set_xticks([]) - - plt.tick_params(labelsize=16) - plt.tight_layout() - filename = 'Cell_' + str(nc + 1) + '_3SA.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() - - -def _plot_3sc(lsn, nm1, nm2, save_dir, suffix=''): - logging.info("Plotting for all cells") - for nc in range(lsn.numbercells): - if np.mod(nc, 20) == 0: - logging.info("Cell #%s", str(nc)) - - plt.figure(nc, figsize=(20, 20)) - ax1 = plt.subplot2grid((6, 6), (0, 0), colspan=4) # full trace - ax2 = plt.subplot2grid((6, 6), (0, 4)) # histogram of F - ax11 = plt.subplot2grid((6, 6), (1, 0), colspan=4) - ax12 = plt.subplot2grid((6, 6), (1, 4)) - ax13 = plt.subplot2grid((6, 6), (1, 5), sharex=ax12, sharey=ax12) - ax3 = plt.subplot2grid((6, 6), (2, 0), colspan=3) # movie 1 - ax4 = plt.subplot2grid((6, 6), (3, 0), colspan=3) - ax5 = plt.subplot2grid((6, 6), (2, 3), colspan=3) # movie 2 - ax6 = plt.subplot2grid((6, 6), (3, 3), colspan=3) - ax7 = plt.subplot2grid((6, 6), (4, 0), colspan=3) # receptive fields - ax8 = plt.subplot2grid((6, 6), (4, 3), colspan=3) - ax9 = plt.subplot2grid((6, 6), (5, 0), colspan=3) - ax10 = plt.subplot2grid((6, 6), (5, 3), colspan=3) - - xtime = np.arange(0, np.size(lsn.celltraces, 1), 1.) - xtime /= lsn.acquisition_rate - dif = np.ediff1d(lsn.stim_table.start.values, - to_begin=8000, to_end=8000) - test = np.argwhere(dif > 5000) - ax1.plot(xtime, lsn.celltraces[nc, :]) - for i in range(len(test) - 1): - ax1.axvspan(xmin=(lsn.stim_table.start.iloc[test[i]].values / lsn.acquisition_rate), xmax=( - lsn.stim_table.end.iloc[test[i + 1] - 1].values / lsn.acquisition_rate), color='gray', alpha=0.3) - ax1.axvspan(nm1.stim_table.start.min() / nm1.acquisition_rate, nm1.stim_table.end.max() / - nm1.acquisition_rate, ymin=0, ymax=1, color='red', alpha=0.3) - ax1.axvspan(nm2.stim_table.start.min() / nm2.acquisition_rate, nm2.stim_table.end.max() / - nm2.acquisition_rate, ymin=0, ymax=1, color='green', alpha=0.3) - ax1.set_xlabel("Time (s)", fontsize=20) - ax1.set_ylabel("Fluorescence", fontsize=20) - - ax2.hist(lsn.celltraces[nc, :], bins=70) - ax2.set_yscale('log') - ax2.set_xlabel("Fluorescence", fontsize=20) - ax2.set_ylabel("Count", fontsize=20) - - xtime = np.arange(0, np.size(lsn.dxcm), 1.) - xtime /= lsn.acquisition_rate - ax11.plot(xtime, lsn.dxcm, color='k') - ax11.set_xlabel("Time (s)", fontsize=20) - ax11.set_xlabel("Speed (cm/s)", fontsize=20) - - smax = nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[ - nc, :, 0]), 0] + nm1.binned_cells_sp[nc, np.argmax(nm1.binned_cells_sp[nc, :, 0]), 1] - vmax = nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[ - nc, :, 0]), 0] + nm1.binned_cells_vis[nc, np.argmax(nm1.binned_cells_vis[nc, :, 0]), 1] - rmax = np.where(smax > vmax, smax, vmax) - smin = nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[ - nc, :, 0]), 0] - nm1.binned_cells_sp[nc, np.argmin(nm1.binned_cells_sp[nc, :, 0]), 1] - vmin = nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[ - nc, :, 0]), 0] - nm1.binned_cells_vis[nc, np.argmin(nm1.binned_cells_vis[nc, :, 0]), 1] - rmin = np.where(smin < vmin, smin, vmin) - - ax12.errorbar(nm1.binned_dx_sp[:, 0], nm1.binned_cells_sp[ - nc, :, 0], yerr=nm1.binned_cells_sp[nc, :, 1], fmt='.', color='k') - ax12.set_ylim(rmin, rmax) - ax12.set_xlabel("Speed (cm/s)", fontsize=20) - ax12.set_ylabel("DF/F", fontsize=20) - ax12.set_title("Spontaneous", fontsize=20) - - ax13.errorbar(nm1.binned_dx_vis[:, 0], nm1.binned_cells_vis[ - nc, :, 0], yerr=nm1.binned_cells_vis[nc, :, 1], fmt='.') - ax13.set_ylim(rmin, rmax) - ax13.set_xlabel("Speed (cm/s)", fontsize=20) - ax13.set_ylabel("DF/F", fontsize=20) - ax13.set_title("Visual Stimuli", fontsize=20) - - xtime = np.arange(0, nm1.sweeplength / - nm1.acquisition_rate, 1 / nm1.acquisition_rate) - for index, row in nm1.sweep_response.iterrows(): - ax3.plot(xtime, nm1.sweep_response[str(nc)][index], lw=2) - ax3.set_xlabel("Time (s)", fontsize=20) - ax3.set_ylabel("DF/F", fontsize=20) - ax3.set_title("Natural Movie 1", fontsize=20, color='red') - - temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) - for i in range(len(nm1.stim_table)): - temp[i, :] = nm1.sweep_response[str(nc)].iloc[i] - ax4.imshow(temp, cmap='gray', interpolation='none', aspect=40) - ax4.set_ylabel("Trials", fontsize=20) - ax4.set_xticks([]) - - xtime = np.arange(0, nm2.sweeplength / - nm2.acquisition_rate, 1 / nm2.acquisition_rate) - for index, row in nm2.sweep_response.iterrows(): - ax5.plot(xtime, nm2.sweep_response[str(nc)][index], lw=2) - ax5.set_xlabel("Time (s)", fontsize=20) - ax5.set_ylabel("DF/F", fontsize=20) - ax5.set_title("Natural Movie 2", fontsize=20, color='green') - - temp = np.empty((len(nm2.stim_table), nm2.sweeplength)) - for i in range(len(nm2.stim_table)): - temp[i, :] = nm2.sweep_response[str(nc)].iloc[i] - ax6.imshow(temp, cmap='gray', interpolation='none', aspect=40) - ax6.set_ylabel("Trials", fontsize=20) - ax6.set_xticks([]) - - vMax = np.where(np.amax(lsn.receptive_field[:, :, nc, 0]) > np.amax(lsn.receptive_field[ - :, :, nc, 1]), np.amax(lsn.receptive_field[:, :, nc, 0]), np.amax(lsn.receptive_field[:, :, nc, 1])) - vMin = np.where(np.amin(lsn.receptive_field[:, :, nc, 0]) < np.amin(lsn.receptive_field[ - :, :, nc, 1]), np.amin(lsn.receptive_field[:, :, nc, 0]), np.amin(lsn.receptive_field[:, :, nc, 1])) - - imon = ax7.imshow(lsn.receptive_field[ - :, :, nc, 0], cmap='gray', interpolation='None', vmin=vMin, vmax=vMax) - ax7.set_title("ON", fontsize=20) - ax7.set_xticks([]) - ax7.set_yticks([]) - cbar = plt.colorbar(imon, ax=ax7, fraction=0.046, pad=0.04) - cbar.ax.set_ylabel('DF/F (%)', fontsize=10) - for t in cbar.ax.get_yticklabels(): - t.set_fontsize(8) - - imoff = ax8.imshow(lsn.receptive_field[ - :, :, nc, 1], cmap='gray', interpolation='None', vmin=vMin, vmax=vMax) - ax8.set_title("OFF", fontsize=20) - ax8.set_xticks([]) - ax8.set_yticks([]) - cbar = plt.colorbar(imoff, ax=ax8, fraction=0.046, pad=0.04) - cbar.ax.set_ylabel('DF/F (%)', fontsize=10) - for t in cbar.ax.get_yticklabels(): - t.set_fontsize(8) - - zon = (lsn.receptive_field[:, :, nc, 0] - np.mean(lsn.receptive_field[ - :, :, nc, 0])) / np.std(lsn.receptive_field[:, :, nc, 0]) - zon = np.where(abs(zon) > 2, zon, 0) - Vmax_on = np.where(abs(np.amax(zon)) > abs( - np.amin(zon)), np.amax(zon), -1 * np.amin(zon)) - zoff = (lsn.receptive_field[:, :, nc, 1] - np.mean(lsn.receptive_field[ - :, :, nc, 1])) / np.std(lsn.receptive_field[:, :, nc, 1]) - zoff = np.where(abs(zoff) > 2, zoff, 0) - Vmax_off = np.where(abs(np.amax(zoff)) > abs( - np.amin(zoff)), np.amax(zoff), -1 * np.amin(zoff)) - Vmax = np.where(Vmax_on > Vmax_off, Vmax_on, Vmax_off) - imzon = ax9.imshow(zon, cmap='RdBu_r', - interpolation='none', vmin=-1 * Vmax, vmax=Vmax) - ax9.set_title("On Z-score", fontsize=20) - ax9.set_xticks([]) - ax9.set_yticks([]) - cbar = plt.colorbar(imzon, ax=ax9, fraction=0.046, pad=0.04) - - zoff = (lsn.receptive_field[:, :, nc, 1] - np.mean(lsn.receptive_field[ - :, :, nc, 1])) / np.std(lsn.receptive_field[:, :, nc, 1]) - zoff = np.where(abs(zoff) > 2, zoff, 0) - imzoff = ax10.imshow( - zoff, cmap='RdBu', interpolation='none', vmin=-1 * Vmax, vmax=Vmax) - ax10.set_title("Off Z-score", fontsize=20) - ax10.set_xticks([]) - ax10.set_yticks([]) - cbar = plt.colorbar(imzoff, ax=ax10, fraction=0.046, pad=0.04) - - plt.tick_params(labelsize=16) - plt.tight_layout() - filename = 'Cell_' + str(nc + 1) + '_3SC' + suffix + '.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() - - -def _plot_3sb(sg, nm1, ns, save_dir): - logging.info("Plotting for all cells") - for nc in range(sg.numbercells): - if np.mod(nc, 20) == 0: - logging.info("Cell #%s", str(nc)) - plt.figure(nc, figsize=(20, 24)) - ax1 = plt.subplot2grid((6, 6), (0, 0), colspan=4) # full trace - ax2 = plt.subplot2grid((6, 6), (0, 4)) # histogram of F - ax14 = plt.subplot2grid((6, 6), (1, 4)) # speed tuning - ax16 = plt.subplot2grid((6, 6), (1, 5), sharex=ax14, sharey=ax14) - ax15 = plt.subplot2grid((6, 6), (1, 0), colspan=4) - ax3 = plt.subplot2grid((6, 6), (2, 0), colspan=2) # Ori tuning - ax4 = plt.subplot2grid((6, 6), (2, 2), colspan=2) # sf tuning - ax13 = plt.subplot2grid((6, 6), (2, 4), colspan=2) # response at peak - ax5 = plt.subplot2grid((6, 6), (3, 0)) - ax6 = plt.subplot2grid((6, 6), (3, 1)) - ax7 = plt.subplot2grid((6, 6), (3, 2)) - ax8 = plt.subplot2grid((6, 6), (3, 3)) - ax9 = plt.subplot2grid((6, 6), (4, 0), colspan=3) # movie - ax10 = plt.subplot2grid((6, 6), (5, 0), colspan=3) - ax11 = plt.subplot2grid((6, 6), (4, 3), colspan=2) # natural scenes - ax12 = plt.subplot2grid((6, 6), (5, 3), colspan=2) - - xtime = np.arange(0, np.size(sg.celltraces, 1), 1.) - xtime /= sg.acquisition_rate - dif = np.ediff1d(sg.stim_table.start.values, - to_begin=8000, to_end=8000) - test = np.argwhere(dif > 5000) - ax1.plot(xtime, sg.celltraces[nc, :]) - for i in range(len(test) - 1): - ax1.axvspan(xmin=(sg.stim_table.start.iloc[test[i]].values / sg.acquisition_rate), xmax=( - sg.stim_table.end.iloc[test[i + 1] - 1].values / sg.acquisition_rate), color='gray', alpha=0.3) - ax1.axvspan(nm1.stim_table.start.min() / nm1.acquisition_rate, nm1.stim_table.end.max() / - nm1.acquisition_rate, ymin=0, ymax=1, color='red', alpha=0.3) - dif = np.ediff1d(ns.stim_table.start.values, - to_begin=8000, to_end=8000) - test = np.argwhere(dif > 5000) - for i in range(len(test) - 1): - ax1.axvspan(xmin=(ns.stim_table.start.iloc[test[i]].values / ns.acquisition_rate), xmax=( - ns.stim_table.end.iloc[test[i + 1] - 1].values / ns.acquisition_rate), color='blue', alpha=0.3) - ax1.set_xlabel("Time (s)", fontsize=20) - ax1.set_ylabel("Fluorescence", fontsize=20) - - ax2.hist(sg.celltraces[nc, :], bins=70) - ax2.set_yscale('log') - ax2.set_xlabel("Fluorescence", fontsize=20) - ax2.set_ylabel("Count", fontsize=20) - - xtime = np.arange(0, np.size(sg.dxcm), 1.) - xtime /= sg.acquisition_rate - ax15.plot(xtime, sg.dxcm, color='k') - ax15.set_xlabel("Time (s)", fontsize=20) - ax15.set_xlabel("Speed (cm/s)", fontsize=20) - - peakori = sg.peak.ori_sg[nc] - peaksf = sg.peak.sf_sg[nc] - ax3.errorbar(sg.orivals, sg.response[:, peaksf, 0, nc, 0], yerr=sg.response[ - :, peaksf, 0, nc, 1], color='blue', fmt='o-', lw=2) - ax3.errorbar(sg.orivals, sg.response[:, peaksf, 1, nc, 0], yerr=sg.response[ - :, peaksf, 1, nc, 1], color='cornflowerblue', fmt='o-', lw=2) - ax3.errorbar(sg.orivals, sg.response[:, peaksf, 2, nc, 0], yerr=sg.response[ - :, peaksf, 2, nc, 1], color='steelblue', fmt='o-', lw=2) - ax3.errorbar(sg.orivals, sg.response[:, peaksf, 3, nc, 0], yerr=sg.response[ - :, peaksf, 3, nc, 1], color='lightskyblue', fmt='o-', lw=2) - ax3.fill_between(sg.orivals, np.repeat(sg.response[0, 0, 0, nc, 0] + sg.response[0, 0, 0, nc, 1], sg.number_ori), np.repeat( - sg.response[0, 0, 0, nc, 0] - sg.response[0, 0, 0, nc, 1], sg.number_ori), color='gray', alpha=0.5) - ax3.axhline(y=sg.response[0, 0, 0, nc, 0], ls='--', color='k', lw=2) - ax3.set_xlim(-10, 160) - ax3.set_xticks(sg.orivals) - ax3.set_xlabel("Orientation (d)", fontsize=20) - ax3.set_ylabel("DF/F (%)", fontsize=20) - - ax4.errorbar(range(5), sg.response[peakori, 1:, 0, nc, 0], yerr=sg.response[ - peakori, 1:, 0, nc, 1], color='blue', fmt='o-', lw=2) - ax4.errorbar(range(5), sg.response[peakori, 1:, 1, nc, 0], yerr=sg.response[ - peakori, 1:, 1, nc, 1], color='cornflowerblue', fmt='o-', lw=2) - ax4.errorbar(range(5), sg.response[peakori, 1:, 2, nc, 0], yerr=sg.response[ - peakori, 1:, 2, nc, 1], color='steelblue', fmt='o-', lw=2) - ax4.errorbar(range(5), sg.response[peakori, 1:, 3, nc, 0], yerr=sg.response[ - peakori, 1:, 3, nc, 1], color='lightskyblue', fmt='o-', lw=2) - ax4.fill_between(range(5), np.repeat(sg.response[0, 0, 0, nc, 0] + sg.response[0, 0, 0, nc, 1], 5), np.repeat( - sg.response[0, 0, 0, nc, 0] - sg.response[0, 0, 0, nc, 1], 5), color='gray', alpha=0.5) - ax4.axhline(y=sg.response[0, 0, 0, nc, 0], ls='--', color='k', lw=2) - ax4.set_xlim(-0.2, 4.2) - ax4.set_xticks(range(5)) - ax4.set_xticklabels(sg.sfvals[1:]) - ax4.set_xlabel("Spatial frequency (cpd)", fontsize=20) - - xtime = np.arange(-1 * sg.interlength / sg.acquisition_rate, (sg.sweeplength + - sg.interlength) / sg.acquisition_rate, 1 / sg.acquisition_rate) - peakori = sg.peak.ori_sg[nc] - peaksf = sg.peak.sf_sg[nc] - peakphase = sg.peak.phase_sg[nc] - subset = sg.sweep_response[(sg.stim_table.orientation == sg.orivals[peakori]) & ( - sg.stim_table.spatial_frequency == sg.sfvals[peaksf]) & (sg.stim_table.phase == sg.phasevals[peakphase])] - subset_p = subset[str(nc)].mean( - ) + (subset[str(nc)].std() / np.sqrt(len(subset[str(nc)]))) - subset_n = subset[str(nc)].mean( - ) - (subset[str(nc)].std() / np.sqrt(len(subset[str(nc)]))) - try: - ax13.fill_between(xtime, subset_p, subset_n, color='b', alpha=0.5) - except: - xtime = xtime[:-1] - ax13.fill_between(xtime, subset_p, subset_n, color='b', alpha=0.5) - blank = sg.sweep_response[(sg.stim_table.orientation == 0) & ( - sg.stim_table.spatial_frequency == 0) & (sg.stim_table.phase == 0)] - blank_p = blank[str(nc)].mean() + \ - (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) - blank_n = blank[str(nc)].mean() - \ - (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) - ax13.fill_between(xtime, blank_p, blank_n, color='gray', alpha=0.5) - ax13.plot(xtime, subset[str(nc)].mean(), color='b', lw=2) - ax13.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) - ax13.axvspan(0, sg.sweeplength / sg.acquisition_rate, - ymin=0, ymax=1, facecolor='gray', alpha=0.3) - ax13.yaxis.set_major_locator(MaxNLocator(4)) - ax13.set_xlabel("Time (s)", fontsize=20) - ax13.set_ylabel("DF/F (%)", fontsize=20) - - Vmax = sg.response[:, 1:, :, nc, 0].max() - ax5.imshow(sg.response[:, 1:, 0, nc, 0], cmap='gray', - interpolation='none', vmin=0, vmax=Vmax) - ax5.set_ylabel("Orientation (d)", fontsize=20) - ax5.set_yticks(range(6)) - ax5.set_yticklabels(sg.orivals) - ax5.set_xlabel("Spatial frequency (cpd)", fontsize=20) - ax5.set_xticks(range(5)) - ax5.set_xticklabels(sg.sfvals[1:]) - ax5.set_title("Phase 0.0", color='blue', fontsize=20) - - ax6.imshow(sg.response[:, 1:, 1, nc, 0], cmap='gray', - interpolation='none', vmin=0, vmax=Vmax) - ax6.set_xlabel("Spatial frequency (cpd)", fontsize=20) - ax6.set_xticks(range(5)) - ax6.set_xticklabels(sg.sfvals[1:]) - ax6.set_yticks(range(6)) - ax6.set_yticklabels(sg.orivals) - ax6.set_title("Phase 0.25", color='cornflowerblue', fontsize=20) - - ax7.imshow(sg.response[:, 1:, 2, nc, 0], cmap='gray', - interpolation='none', vmin=0, vmax=Vmax) - ax7.set_xlabel("Spatial frequency (cpd)", fontsize=20) - ax7.set_xticks(range(5)) - ax7.set_xticklabels(sg.sfvals[1:]) - ax7.set_yticks(range(6)) - ax7.set_yticklabels(sg.orivals) - ax7.set_title("Phase 0.5", color='steelblue', fontsize=20) - - ax8.imshow(sg.response[:, 1:, 3, nc, 0], cmap='gray', - interpolation='none', vmin=0, vmax=Vmax) - ax8.set_xlabel("Spatial frequency (cpd)", fontsize=20) - ax8.set_xticks(range(5)) - ax8.set_xticklabels(sg.sfvals[1:]) - ax8.set_yticks(range(6)) - ax8.set_yticklabels(sg.orivals) - ax8.set_title("Phase 0.75", color='lightskyblue', fontsize=20) - - xtime = np.arange(0, nm1.sweeplength / - nm1.acquisition_rate, 1 / nm1.acquisition_rate) - while len(xtime) > nm1.sweeplength: - xtime = np.delete(xtime, -1) - for index, row in nm1.sweep_response.iterrows(): - ax9.plot(xtime, nm1.sweep_response[str(nc)][index], lw=2) - ax9.set_xlabel("Time (s)", fontsize=20) - ax9.set_ylabel("DF/F", fontsize=20) - ax9.set_title("Natural Movie 1", fontsize=20, color='red') - - temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) - for i in range(len(nm1.stim_table)): - temp[i, :] = nm1.sweep_response[str(nc)].iloc[i] - ax10.imshow(temp, cmap='gray', interpolation='none', aspect=40) - ax10.set_ylabel("Trials", fontsize=20) - ax10.set_xticks([]) - - temp = np.copy(ns.response[1:, nc, :2]) - scene_response = pd.DataFrame(temp, columns=('response', 'error')) - scene_response = scene_response.sort( - columns='response', ascending=False) - ax11.errorbar(range(ns.number_scenes - 1), scene_response.response, - yerr=scene_response.error, fmt='o', color='k') - ax11.fill_between(range(ns.number_scenes - 1), np.repeat(ns.response[0, nc, 0] + ns.response[0, nc, 1], ns.number_scenes - 1), np.repeat( - ns.response[0, nc, 0] - ns.response[0, nc, 1], ns.number_scenes - 1), color='gray', alpha=0.3) - ax11.axhline(y=ns.response[0, nc, 0], ls='--', lw=2, color='k') - ax11.set_xlim(-2, 120) - ax11.set_title("Natural Scenes", fontsize=20, color='blue') - ax11.set_xlabel("Scene", fontsize=20) - ax11.set_ylabel("DF/F (%)", fontsize=20) - - xtime = np.arange(-1 * ns.interlength / ns.acquisition_rate, (ns.sweeplength + - ns.interlength) / ns.acquisition_rate, 1 / ns.acquisition_rate) - nsp = np.argmax(ns.response[1:, nc, 0]) - subset_response = ns.sweep_response[ns.stim_table.frame == nsp] - subset_response_p = subset_response[str(nc)].mean( - ) + (subset_response[str(nc)][:].std() / np.sqrt(len(subset_response[str(nc)]))) - subset_response_n = subset_response[str(nc)].mean( - ) - (subset_response[str(nc)][:].std() / np.sqrt(len(subset_response[str(nc)]))) - try: - ax12.fill_between(xtime, subset_response_p, - subset_response_n, color='b', alpha=0.5) - except: - xtime = xtime[:-1] - ax12.fill_between(xtime, subset_response_p, - subset_response_n, color='b', alpha=0.5) - blank = ns.sweep_response[ns.stim_table.frame == -1] - blank_p = blank[str(nc)].mean() + \ - (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) - blank_n = blank[str(nc)].mean() - \ - (blank[str(nc)].std() / np.sqrt(len(blank[str(nc)]))) - ax12.fill_between(xtime, blank_p, blank_n, color='gray', alpha=0.5) - ax12.plot(xtime, subset_response[str(nc)].mean(), color='b', lw=2) - ax12.plot(xtime, blank[str(nc)].mean(), color='k', lw=2) - ax12.axvspan(0, ns.sweeplength / ns.acquisition_rate, - ymin=0, ymax=1, facecolor='gray', alpha=0.3) - ax12.yaxis.set_major_locator(MaxNLocator(4)) - ax12.set_xlabel("Time (s)", fontsize=20) - ax12.set_ylabel("DF/F (%)", fontsize=20) - - plt.tick_params(labelsize=16) - plt.tight_layout() - filename = 'Cell_' + str(nc + 1) + '_3SB.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() - - -def plot_running_a(dg, nm1, nm3, save_dir): - logging.info("Plotting running data summary") - nc = -1 - plt.figure(1, figsize=(10, 8)) - ax1 = plt.subplot2grid((4, 4), (0, 0), colspan=3) - ax2 = plt.subplot2grid((4, 4), (0, 3)) - ax3 = plt.subplot2grid((4, 4), (1, 0)) - ax4 = plt.subplot2grid((4, 4), (1, 1)) - ax5 = plt.subplot2grid((4, 4), (1, 2)) - ax6 = plt.subplot2grid((4, 4), (2, 0), colspan=2) - ax7 = plt.subplot2grid((4, 4), (3, 0), colspan=2) - ax8 = plt.subplot2grid((4, 4), (2, 2), colspan=2) - ax9 = plt.subplot2grid((4, 4), (3, 2), colspan=2) - - xtime = np.arange(0, np.size(dg.dxcm), 1.) - xtime /= dg.acquisition_rate - dif = np.ediff1d(dg.stim_table.start.values, to_begin=8000, to_end=8000) - test = np.argwhere(dif > 5000) - ax1.plot(xtime, dg.dxcm, color='k') - for i in range(len(test) - 1): - ax1.axvspan(xmin=(dg.stim_table.start.iloc[test[i]].values / dg.acquisition_rate), xmax=( - dg.stim_table.end.iloc[test[i + 1] - 1].values / dg.acquisition_rate), color='gray', alpha=0.3) - ax1.axvspan(xmin=nm1.stim_table.start.min() / nm1.acquisition_rate, xmax=( - (nm1.stim_table.start.max() + nm1.sweeplength) / nm1.acquisition_rate), color='red', alpha=0.3) - dif = np.ediff1d(nm3.stim_table.start.values, to_begin=8000, to_end=8000) - test = np.argwhere(dif > 5000) - for i in range(len(test) - 1): - ax1.axvspan(xmin=(nm3.stim_table.start.iloc[test[i]].values / nm3.acquisition_rate), xmax=( - (nm3.stim_table.end.iloc[test[i + 1] - 1].values + nm3.sweeplength) / nm3.acquisition_rate), color='blue', alpha=0.3) - ax1.set_xlabel("Time (s)", fontsize=20) - ax1.set_ylabel("Speed (cm/s)", fontsize=20) - - dx = dg.dxcm[np.logical_not(np.isnan(dg.dxcm))] - ax2.hist(dx, bins=80, range=(-20, 100), color='gray') - ax2.set_xlabel("Speed (cm/s)", fontsize=20) - - run_peak = np.where(dg.response[:, 1:, nc, 0] - == np.nanmax(dg.response[:, 1:, nc, 0])) - peakori = run_peak[0][0] - peaktf = run_peak[1][0] + 1 - - ax3.errorbar(dg.orivals, dg.response[:, peaktf, nc, 0], yerr=dg.response[ - :, peaktf, nc, 1], fmt='b.-', lw=2) - ax3.fill_between(dg.orivals, np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], dg.number_ori), np.repeat( - dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], dg.number_ori), color='gray', alpha=0.5) - ax3.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k') - ax3.annotate(str(dg.tfvals[peaktf]) + " Hz", - xy=(0, 0.9), xycoords='axes fraction', fontsize=14) - ax3.set_xtick = (dg.orivals) - ax3.set_xlabel("Direction (deg)", fontsize=20) - ax3.set_ylabel("Speed (cm/s)", fontsize=20) - ax3.yaxis.set_major_locator(MaxNLocator(6)) - - ax4.errorbar(dg.tfvals[1:], dg.response[peakori, 1:, nc, 0], yerr=dg.response[ - peakori, 1:, nc, 1], fmt='b.-', lw=2) - ax4.fill_between(dg.tfvals[1:], np.repeat(dg.response[0, 0, nc, 0] + dg.response[0, 0, nc, 1], dg.number_tf - 1), - np.repeat(dg.response[0, 0, nc, 0] - dg.response[0, 0, nc, 1], dg.number_tf - 1), color='gray', alpha=0.5) - ax4.axhline(y=dg.response[0, 0, nc, 0], ls='--', color='k') - ax4.annotate(str(dg.orivals[peakori]) + " Deg", - xy=(0, 0.9), xycoords='axes fraction', fontsize=14) - ax4.set_xticks = (dg.tfvals[1:]) - ax4.set_xlabel("Temporal frequency (Hz)", fontsize=20) - ax4.yaxis.set_major_locator(MaxNLocator(6)) - - im = ax5.imshow(dg.response[:, 1:, nc, 0], - cmap='gray', interpolation='none') - ax5.set_ylabel("Direction", fontsize=16) - ax5.set_xlabel("TF", fontsize=16) - ax5.set_yticks(range(dg.number_ori)) - ax5.set_yticklabels(list(dg.orivals.astype(int).astype(str))) - ax5.set_xticks(range(dg.number_tf - 1)) - ax5.set_xticklabels(list(dg.tfvals[1:].astype(int).astype(str))) - cbar = plt.colorbar(im, ax=ax5) - cbar.ax.set_ylabel('Speed (cm/s)', fontsize=8) - for t in cbar.ax.get_yticklabels(): - t.set_fontsize(8) - - xtime = np.arange(0, nm1.sweeplength / - nm1.acquisition_rate, 1 / nm1.acquisition_rate) - while len(xtime) > len(nm1.sweep_response['dx'].mean()): - xtime = np.delete(xtime, -1) - for index, row in nm1.sweep_response.iterrows(): - ax6.plot(xtime, nm1.sweep_response['dx'][index], lw=2) - ax6.set_xlabel("Time (s)", fontsize=20) - ax6.set_ylabel("DF/F", fontsize=20) - ax6.set_title("Natural Movie 1", fontsize=20, color='red') - - temp = np.empty((len(nm1.stim_table), nm1.sweeplength)) - for i in range(len(nm1.stim_table)): - temp[i, :] = nm1.sweep_response['dx'].iloc[i][:, 0] - ax7.imshow(temp, cmap='gray', interpolation='none', aspect=40) - ax7.set_ylabel("Trials", fontsize=20) - ax7.set_xticks([]) - - xtime = np.arange(0, nm3.sweeplength / - nm3.acquisition_rate, 1 / nm3.acquisition_rate) - while len(xtime) > len(nm3.sweep_response['dx'].mean()): - xtime = np.delete(xtime, -1) - for index, row in nm3.sweep_response.iterrows(): - ax8.plot(xtime, nm3.sweep_response['dx'][index], lw=2) - ax8.set_xlabel("Time (s)", fontsize=20) - ax8.set_ylabel("DF/F", fontsize=20) - ax8.set_title("Natural Movie Long", fontsize=20, color='blue') - - temp = np.empty((len(nm3.stim_table), nm3.sweeplength)) - for i in range(len(nm3.stim_table)): - temp[i, :] = nm3.sweep_response['dx'].iloc[i][:, 0] - ax9.imshow(temp, cmap='gray', interpolation='none', aspect=100) - ax9.set_ylabel("Trials", fontsize=20) - ax9.set_xticks([]) - - plt.tick_params(labelsize=16) - plt.tight_layout() - plt.suptitle("Running Summary", fontsize=20) - plt.subplots_adjust(top=0.9) - filename = 'Running Summary.png' - fullfilename = os.path.join(save_dir, filename) - plt.savefig(fullfilename) - plt.close() diff --git a/allensdk/brain_observatory/chisquare_categorical.py b/allensdk/brain_observatory/chisquare_categorical.py deleted file mode 100644 index 4400cdc889..0000000000 --- a/allensdk/brain_observatory/chisquare_categorical.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- -""" -Created on Wed Jun 5 15:52:22 2019 - -@author: dan -""" -# TODO: Fix header - -import numpy as np -import warnings - - -def chisq_from_stim_table(stim_table, - columns, - mean_sweep_events, - num_shuffles=1000, - verbose=False): - # stim_table is a pandas DataFrame with len = num_sweeps - # columns is a list of column names that define the categories (e.g. ['Ori','Contrast']) - # mean_sweep_events is a numpy array with shape (num_sweeps,num_cells) - - sweep_categories = stim_table_to_categories(stim_table,columns,verbose=verbose) - p_vals = compute_chi_shuffle(mean_sweep_events,sweep_categories,num_shuffles=num_shuffles) - - return p_vals - -def compute_chi_shuffle(mean_sweep_events, - sweep_categories, - num_shuffles=1000): - - # mean_sweep_events is a numpy array with shape (num_sweeps,num_cells) - # sweep_conditions is a numpy array with shape (num_sweeps) - # sweep_conditions gives the category label for each sweep - - (num_sweeps,num_cells) = np.shape(mean_sweep_events) - - if len(sweep_categories) != num_sweeps: - warnings.warn('sweep_categories and num_sweeps do not match') - return np.nan - - - sweep_categories_dummy = make_category_dummy(sweep_categories) - - expected = compute_expected(mean_sweep_events,sweep_categories_dummy) - observed = compute_observed(mean_sweep_events,sweep_categories_dummy) - chi_actual = compute_chi(observed,expected) - - chi_shuffle = np.zeros((num_cells,num_shuffles)) - for ns in range(num_shuffles): - shuffle_sweeps = np.random.choice(num_sweeps,size=(num_sweeps,)) - shuffle_sweep_events = mean_sweep_events[shuffle_sweeps] - - shuffle_expected = compute_expected(shuffle_sweep_events,sweep_categories_dummy) - shuffle_observed = compute_observed(shuffle_sweep_events,sweep_categories_dummy) - - chi_shuffle[:,ns] = compute_chi(shuffle_observed,shuffle_expected) - - p_vals = np.mean(chi_actual.reshape(num_cells,1)<chi_shuffle,axis=1) - - return p_vals - -def stim_table_to_categories(stim_table, - columns, - verbose=False): - # get the categories for all sweeps with each unique combination of - # parameters in 'columns' being one category - # sweeps with non-finite values in ANY column (e.g. np.NaN) are labeled - # as blank sweeps (category = -1) - # TODO: Replace with EcephysSession.get_stimulus_conditions - - num_sweeps = len(stim_table) - num_params = len(columns) - - unique_params = [] - options_per_column = [] - max_combination = 1 - for column in columns: - column_params = np.unique(stim_table[column].values) - # column_params = column_params[np.isfinite(column_params)] - unique_params.append(column_params) - options_per_column.append(len(column_params)) - max_combination*=len(column_params) - - category = 0 - sweep_categories = -1*np.ones((num_sweeps,)) - curr_combination = np.zeros((num_params,),dtype=np.int) - options_per_column = np.array(options_per_column).astype(np.int) - all_tried = False - while not all_tried: - - matches_combination = np.ones((num_sweeps,),dtype=np.bool) - for i_col,column in enumerate(columns): - param = unique_params[i_col][curr_combination[i_col]] - matches_param = stim_table[column].values == param - matches_combination *= matches_param - - if np.any(matches_combination): - sweep_categories[matches_combination] = category - if verbose: - print('Category ' + str(category)) - for i_col,column in enumerate(columns): - param = unique_params[i_col][curr_combination[i_col]] - print(column + ': ' + str(param)) - - category+=1 - - #advance the combination - curr_combination = advance_combination(curr_combination,options_per_column) - all_tried = curr_combination[0]==options_per_column[0] - - if verbose: - blank_sweeps = sweep_categories==-1 - print('num blank: ' + str(blank_sweeps.sum())) - - return sweep_categories - -def advance_combination(curr_combination, - options_per_column): - - num_cols = len(curr_combination) - - might_carry = True - col = num_cols-1 - while might_carry: - curr_combination[col] += 1 - if col==0 or curr_combination[col]<options_per_column[col]: - might_carry = False - else: - curr_combination[col] = 0 - col-=1 - - return curr_combination - - -def make_category_dummy(sweep_categories): - #makes a dummy variable version of the sweep category list - - num_sweeps = len(sweep_categories) - categories = np.unique(sweep_categories) - num_categories = len(categories) - - sweep_category_mat = np.zeros((num_sweeps,num_categories),dtype=np.bool) - for i_cat,category in enumerate(categories): - category_idx = np.argwhere(sweep_categories==category)[:,0] - sweep_category_mat[category_idx,i_cat] = True - - return sweep_category_mat - -def compute_observed(mean_sweep_events,sweep_conditions): - - (num_sweeps,num_conditions) = np.shape(sweep_conditions) - num_cells = np.shape(mean_sweep_events)[1] - - observed_mat = (mean_sweep_events.T).reshape(num_cells,num_sweeps,1) * sweep_conditions.reshape(1,num_sweeps,num_conditions) - observed = np.sum(observed_mat,axis=1) - - return observed - -def compute_expected(mean_sweep_events,sweep_conditions): - - num_conditions = np.shape(sweep_conditions)[1] - num_cells = np.shape(mean_sweep_events)[1] - - sweeps_per_condition = np.sum(sweep_conditions,axis=0) - events_per_sweep = np.mean(mean_sweep_events,axis=0) - - expected = sweeps_per_condition.reshape(1,num_conditions) * events_per_sweep.reshape(num_cells,1) - - return expected - -def compute_chi(observed,expected): - - chi = (observed - expected) ** 2 /expected - chi = np.where(expected>0,chi,0.0) - return np.sum(chi,axis=1) - -# %% \ No newline at end of file diff --git a/allensdk/brain_observatory/circle_plots.py b/allensdk/brain_observatory/circle_plots.py deleted file mode 100644 index dff091c0e3..0000000000 --- a/allensdk/brain_observatory/circle_plots.py +++ /dev/null @@ -1,753 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import math - -try: - xrange -except: - from past.builtins import xrange - -import numpy as np -import pandas as pd -from matplotlib.colors import LinearSegmentedColormap -import matplotlib.pyplot as plt -import matplotlib.patches as mpatches -from matplotlib.collections import PatchCollection, LineCollection -import matplotlib.transforms as mxfms -import matplotlib.colors as mcolors -import skimage.transform -from six import iteritems - - -DEFAULT_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[.7,0,.7,0.0],[.7,0,0,1]]) -DEFAULT_MEAN_RESP_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[0.0,0.0,0.5,0.0],[0.0,0.0,0.5,1]]) -DEFAULT_AXIS_COLOR = (0.8, 0.8, 0.8) -DEFAULT_LABEL_COLOR = (0.8, 0.8, 0.8) -LSN_ON_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[.7,0,.7,0.0],[.7,0,0,1]]) -LSN_OFF_COLOR_MAP = LinearSegmentedColormap.from_list('default', [[0.0,0.7,.7,0.0],[0,0,0.7,1]]) -HEX_POSITIONS = [] - - -def polar_to_xy(angles, radius): - """ Convert an array of angles (in radians) and a radius in polar coordinates - to an array of x,y coordinates. - """ - - x = radius*np.cos(angles) - y = radius*np.sin(angles) - return np.array([x,y]).T - - -def polar_linspace(radius, start_angle, stop_angle, num, endpoint=False, degrees=True): - """ Evenly distributed list of x,y coordinates from an input range of angles - and a radius in polar coordinates. - """ - angles = np.linspace(start_angle, stop_angle, num=num, endpoint=endpoint) - - if degrees is True: - angles *= np.pi / 180.0 - - return polar_to_xy(angles, radius) - - -def spiral_trials(radii, x=0.0, y=0.0): - radii = np.array(radii) - circles = [] - - if radii.size > 0: - spiral = hex_pack(radii[0], len(radii)) - - for i,radius in enumerate(radii): - circles.append(mpatches.Circle((spiral[i][0], spiral[i][1]), radii[i])) - - pos_xfm = mxfms.Affine2D().translate(x,y) - - collection = PatchCollection(circles) - collection.set_transform(pos_xfm) - - return collection - - -def spiral_trials_polar(r, theta, radii, offset=None): - if offset is None: - offset = [0,0] - - collection = spiral_trials(radii, r + offset[0], offset[1]) - - rot_xfm = mxfms.Affine2D().rotate(theta) - collection.set_transform(collection.get_transform() + rot_xfm) - - return collection - - -def angle_lines(angles, inner_radius, outer_radius): - inner_pos = polar_to_xy(angles, inner_radius) - outer_pos = polar_to_xy(angles, outer_radius) - - segments = np.array(list(zip(inner_pos, outer_pos))) - - return LineCollection(segments) - - -def radial_arcs(rs, start_theta, end_theta): - arcs = [] - - for r in rs: - arcs.append(mpatches.Arc((0,0), 2*r, 2*r, - theta1=start_theta*180.0/np.pi, - theta2=end_theta*180.0/np.pi)) - - - return PatchCollection(arcs) - -def rings_in_hex_pack(ct): - return np.ceil((-3.0 + np.sqrt(9.0 - 12.0*(1.0 - ct))) / 6.0 + 1.0) - -def radial_circles(rs): - circles = [ mpatches.Circle((0,0), r) for r in rs ] - - return PatchCollection(circles) - -def reset_hex_pack(): - global HEX_POSITIONS - HEX_POSITIONS = [] - -def hex_pack(radius, n): - global HEX_POSITIONS - - if len(HEX_POSITIONS) < n: - HEX_POSITIONS = build_hex_pack(n) - - return HEX_POSITIONS[:n]*radius*2.0 - -def build_hex_pack(n): - pos = [] - sq32 = math.sqrt(3.0) / 2.0 - - N = 1 - - vs = [ [-0.5, -sq32], [-1.0, 0.0], [-0.5, sq32], [0.5, sq32], [1, 0], [0.5, -sq32] ] - pos.append([0,0]) - while len(pos) < n: - layer_pos = [ ] - - for i,v in enumerate(vs): - x = - N * v[1] * sq32 - y = N * v[0] * sq32 - - if N % 2 == 1: - x -= 0.5 * v[0] - y -= 0.5 * v[1] - - layer_pos.append([]) - layer_pos[i].append([x,y]) - mag = 1 - sign = 1 - - for j in xrange(N-1): - x += v[0] * mag * sign - y += v[1] * mag * sign - mag += 1 - sign = -sign - layer_pos[i].append([x,y]) - - for j in range(N): - for i in range(len(vs)): - if j < len(layer_pos[i]): - pos.append(layer_pos[i][j]) - N+=1 - - return np.array(pos) - - -def polar_line_circles(radii, theta, start_r=0): - circles = [ mpatches.Circle( (0,0), radii[0] ) ] - - line_xfm = mxfms.Affine2D().translate(start_r,0).rotate(theta) - - x = 0 - for ri in range(1, len(radii)): - x += radii[ri-1] + radii[ri] - - circles.append(mpatches.Circle( (x,0), radii[ri] )) - - collection = PatchCollection(circles) - collection.set_transform(line_xfm) - - return collection - - -def wedge_ring(N, inner_radius, outer_radius, start=0, stop=360): - degs = np.linspace(start, stop, N+1, endpoint=True) - wedges = [] - - if stop > start: - for i in range(len(degs)-1): - wedges.append( mpatches.Wedge( (0,0), outer_radius, degs[i], degs[i+1], width=outer_radius-inner_radius ) ) - else: - for i in range(1,len(degs)): - wedges.append( mpatches.Wedge( (0,0), outer_radius, degs[i], degs[i-1], width=outer_radius-inner_radius ) ) - - return PatchCollection(wedges) - - -def add_angle_labels(ax, angles, labels, radius, color=None, fontdict=None, offset=0.05): - angle_pos = polar_to_xy(angles, radius) - - for i in range(len(angle_pos)): - xy = angle_pos[i,:] - u = xy + xy / np.linalg.norm(xy) * offset - ax.text(u[0], u[1], - labels[i], color=color, - horizontalalignment='center', - verticalalignment='center', - fontdict=fontdict) - - -def add_arrow(ax, radius, start_angle, end_angle, color=None, width=18.0): - if color is None: - color = DEFAULT_LABEL_COLOR - - fig = ax.get_figure() - size = fig.get_size_inches() - dpi = fig.get_dpi() - mutation_scale = size[0] * dpi / 500.0 * width - - d_angle = end_angle - start_angle - - start_pos = (radius * np.cos(start_angle), radius * np.sin(start_angle)) - end_pos = (radius * np.cos(end_angle), radius * np.sin(end_angle)) - - connstyle = mpatches.ConnectionStyle.Angle3(angleA=0, angleB=(d_angle*180.0/np.pi)) - arrowstyle = mpatches.ArrowStyle.Simple(tail_width=0.33, head_length=0.66, head_width=1.0) - ax.add_patch(mpatches.FancyArrowPatch(posA=start_pos, posB=end_pos, - arrowstyle=arrowstyle, - connectionstyle=connstyle, - facecolor=color, - linewidth=0, - mutation_scale=mutation_scale)) - -def make_pincushion_plot(data, trials, on, nrows, ncols, clim=None, color_map=None, radius=None): - if radius is None: - max_sweeps = 0 - for sweeps in trials.itervalues(): - max_sweeps = max(max_sweeps, len(sweeps[0])) - - rings = rings_in_hex_pack(max_sweeps) - radius = 0.5 / (2.0 * rings - 1.0) - - if clim is None: - clim = [ data.min(), data.max() ] - - if color_map is None: - color_map = LSN_ON_COLOR_MAP if on else LSN_OFF_COLOR_MAP - - ax = plt.gca() - for (col,row,on_state), sweeps in iteritems(trials): - if on_state != on: - continue - - valid_sweeps = sweeps[0][sweeps[0] < data.size] - responses = np.sort(data[valid_sweeps])[::-1] - responses = responses[responses >= clim[0]] - - if responses.size > 0: - coll = spiral_trials(np.ones(responses.shape)*radius, col+0.5, row+0.5) - coll.set_transform(coll.get_transform() + ax.transData) - coll.set_array(responses) - coll.set_cmap(color_map) - coll.set_clim(clim) - coll.set_linewidths(0) - ax.add_collection(coll) - - ax.set_ylim((0,nrows)) - ax.set_xlim((0,ncols)) - - - -class PolarPlotter( object ): - DIR_CW = -1 - DIR_CCW = 1 - - def __init__(self, - direction=DIR_CW, - angle_start=0, - circle_scale=1.1, - inner_radius=None, - plot_center=(0.0,0.0), - plot_scale=0.9): - - self.plot_scale = plot_scale - self.plot_center = plot_center - - self.angle_transform = np.vectorize(lambda x: ((x + angle_start)*direction)*np.pi/180.0) - self.inner_radius = inner_radius - self.circle_scale = circle_scale - - def finalize(self): - ax = plt.gca() - fig = plt.gcf() - figsize = fig.get_size_inches() - - aspect = figsize[0] / figsize[1] - w = 2.0 / self.plot_scale - h = w / aspect - - bounds = ( self.plot_center[0] - w*.5, - self.plot_center[0] + w*.5, - self.plot_center[1] - h*.5, - self.plot_center[1] + h*.5 ) - - ax.set_xlim(bounds[0], bounds[1]) - ax.set_ylim(bounds[2], bounds[3]) - - plt.subplots_adjust(left=0,right=1,bottom=0,top=1) - - @classmethod - def _clim(self, clim, data): - - if clim is None: - clim = [ data.min(), data.max() ] - - if clim[0] == clim[1]: - clim[0] = 0 - if clim[0] == clim[1]: - clim[1] = 1 - - return clim - - -class TrackPlotter( PolarPlotter ): - def __init__(self, - direction=PolarPlotter.DIR_CW, - angle_start=270.0, - inner_radius=.45, - ring_length=None, - *args, **kwargs): - super(TrackPlotter, self).__init__(direction=direction, - angle_start=angle_start, - inner_radius=inner_radius, - *args, **kwargs) - - self.ring_length = ring_length - - def show_arrow(self, color=None): - start, end = self.angle_transform([0.0, 40.0]) - add_arrow(plt.gca(), self.inner_radius * .85, start, end, color) - - def plot(self, data, - clim=None, - cmap=DEFAULT_COLOR_MAP, - mean_cmap=DEFAULT_MEAN_RESP_COLOR_MAP, - norm=None): - - ax = plt.gca() - - clim = self._clim(clim, data) - if self.ring_length: - data = skimage.transform.resize(data.astype(np.float64), - (data.shape[0], self.ring_length), - mode='constant', - anti_aliasing=False) - - data_mean = data.mean(axis=0) - data = np.vstack((data, data_mean)) - - radii = np.linspace(self.inner_radius, 1.0, data.shape[0]+2) - start,stop = self.angle_transform([0,360])*180.0/np.pi - - if norm is None: - norm = mcolors.PowerNorm(0.5, vmin=clim[0], vmax=clim[1], clip=True) - - for i, row_data in enumerate(data): - inner_radius = radii[i] - - if i < data.shape[0] - 1: - outer_radius = radii[i+1] - ring_cmap = cmap - else: - outer_radius = radii[i+2] - ring_cmap = mean_cmap - - - wedges = wedge_ring(len(row_data), - inner_radius, outer_radius, - start=start, stop=stop) - - wedges.set_array(row_data) - #wedges.set_clim(clim) - wedges.set_cmap(ring_cmap) - wedges.set_norm(norm) - wedges.set_edgecolors((0,0,0,0)) - - ax.add_collection(wedges) - - self.finalize() - - -class CoronaPlotter( PolarPlotter ): - def __init__(self, - angle_start=270, - plot_scale=1.2, - inner_radius=.3, - *args, **kwargs): - super(CoronaPlotter, self).__init__(inner_radius=inner_radius, angle_start=angle_start, plot_scale=plot_scale, *args, **kwargs) - - self.categories = None - self.cat_idx_map = None - - def infer_dims(self, category_data): - self.set_dims(np.sort(np.unique(category_data))) - - def set_dims(self, categories): - self.categories = categories - self.cat_idx_map = dict(zip(categories, range(len(categories)))) - - def show_arrow(self, color=None): - start, end = self.angle_transform([0.0, 40.0]) - add_arrow(plt.gca(), self.inner_radius * .85, start, end, color) - - def show_circle(self, color=None): - if color is None: - color = DEFAULT_LABEL_COLOR - ax = plt.gca() - collection = radial_circles([0.96 * self.inner_radius]) - collection.set_facecolor((0,0,0,0)) - collection.set_edgecolor(color) - collection.set_zorder(1) - ax.add_collection(collection) - - def plot(self, category_data, - data=None, - clim=None, - cmap=DEFAULT_COLOR_MAP): - - ax = plt.gca() - - if self.categories is None: - self.infer_dims(category_data) - - if data is None: - data = np.ones(len(category_data)) - - clim = self._clim(clim, data) - - num_cats = len(self.categories) - hth = 180.0 / num_cats - degs = np.linspace(hth, 360.0-hth, num_cats) - degs = self.angle_transform(degs) - circle_radius = self.inner_radius * abs(np.sin((degs[1] - degs[0]) * .5)) - - radii = np.ones(len(data)) * circle_radius * self.circle_scale - - df = pd.DataFrame({ 'category': category_data }) - gb = df.groupby(['category']) - - for category, trials in iteritems(gb.groups): - idx = self.cat_idx_map[category] - order = np.argsort(data[trials])[::-1] - trial_order = np.array(trials)[order] - - circles = polar_line_circles(radii[trial_order], - degs[idx], - self.inner_radius) - - circles.set_transform(circles.get_transform() + ax.transData) - circles.set_array(data[trial_order]) - circles.set_cmap(cmap) - circles.set_clim(clim) - circles.set_edgecolors((0,0,0,0)) - circles.set_zorder(2) - - ax.add_collection(circles) - - self.finalize() - -class FanPlotter( PolarPlotter ): - def __init__(self, group_scale=0.9, *args, **kwargs): - super(FanPlotter, self).__init__(*args, **kwargs) - - self.group_scale = group_scale - - self.angles = None - self.xangles = None - self.angle_map = None - - self.rs = None - self.radii = None - self.r_radius_map = None - - self.groups = None - self.group_offsets = None - self.group_offset_map = None - - self.group_radius = None - - def infer_dims(self, r_data, angle_data, group_data): - rs = np.sort(np.unique(r_data)) - angles = np.sort(np.unique(angle_data)) - groups = np.sort(np.unique(group_data)) if group_data is not None else None - - self.set_dims(rs, angles, groups) - - def set_dims(self, rs, angles, groups): - self.angles = angles - self.xangles = self.angle_transform(angles) - self.angle_map = dict(zip(self.angles, self.xangles)) - - self.rs = rs - num_rs = len(rs) - - # map r value to radius - if self.inner_radius is None: - self.inner_radius = 1.0 / ( 2 * num_rs ) - - hdr = ( 1.0 - self.inner_radius ) / num_rs / 2.0 - self.radii = np.linspace(self.inner_radius + hdr, - 1.0 - hdr, - num_rs) - - self.r_radius_map = dict(zip(rs, self.radii)) - self.group_radius = hdr * self.group_scale - self.groups = groups if groups is not None else [ np.nan ] - num_groups = len(self.groups) - - # map group to group offset - if num_groups == 1: - self.group_offsets = [ [ 0, 0 ] ] - else: - offset_radius = self.group_radius * self.circle_scale - - self.group_offsets = polar_linspace(offset_radius/np.sqrt(2), - -45, -45-360, num_groups) - - self.group_radius = offset_radius * 0.5 - - self.group_offset_map = dict(zip(self.groups, self.group_offsets)) - - - def show_axes(self, angles=None, radii=None, closed=False, color=None): - ax = plt.gca() - - if self.angles is None: - raise Exception("dimensions not set!") - - if color is None: - color = DEFAULT_AXIS_COLOR - - if angles is None: - angles = self.xangles - - if radii is None: - radii = self.radii - - lines = angle_lines(angles, radii[0], radii[-1]) - lines.set_zorder(1) - lines.set_edgecolors(color) - ax.add_collection(lines) - - if closed: - collection = radial_circles(radii) - else: - collection = radial_arcs(radii, min(angles), max(angles)) - - collection.set_facecolors((0,0,0,0.0)) - collection.set_edgecolors(color) - collection.set_zorder(1) - ax.add_collection(collection) - - - def show_angle_labels(self, angles=None, labels=None, color=None, offset=.05, fontdict=None): - if angles is None: - angles = self.xangles - - if labels is None: - labels = self.angles.astype(int) - - if color is None: - color = DEFAULT_LABEL_COLOR - - add_angle_labels(plt.gca(), angles, labels, 1.0, offset=offset, color=color, fontdict=fontdict) - - - def show_group_labels(self, groups=None, color=None, fontdict=None): - ax = plt.gca() - - if groups is None: - groups = self.groups - - if color is None: - color = DEFAULT_LABEL_COLOR - - r = self.inner_radius*.5 - angle = 90.0 - - x = r * np.cos(angle) - y = r * np.sin(angle) - - for group in groups: - off = self.group_offset_map[group] - - xfm = mxfms.Affine2D().translate(r+off[0]*2.0,off[1]*2.0).rotate(self.angle_transform(angle)) - p = xfm.transform_point([0,0]) - - ax.text(p[0], p[1], - group, color=color, - horizontalalignment='center', - verticalalignment='center', - fontdict=fontdict) - - start_theta = self.angle_transform(angle+20) - end_theta = self.angle_transform(angle-20) - - ax.add_patch(mpatches.Arc((0,0), 2*r, 2*r, - theta1=start_theta*180.0/np.pi, - theta2=end_theta*180.0/np.pi, - color=color)) - - ax.add_collection(LineCollection([[[0, .7*r], [0, 1.3*r]]], color=color)) - - - - - def show_r_labels(self, radii=None, labels=None, color=None, offset=.1, fontdict=None): - ax = plt.gca() - - if radii is None: - radii = self.radii - - if labels is None: - labels = self.rs - - if color is None: - color = DEFAULT_LABEL_COLOR - - if labels is None: - labels = self.rs - - line_th = self.xangles[0] - line_x = radii * np.cos(line_th) - line_y = radii * np.sin(line_th) - for i,(x,y) in enumerate(zip(line_x,line_y)): - ax.text(x, y-offset, - labels[i], color=color, - horizontalalignment='center', - verticalalignment='center', - fontdict=fontdict) - - def plot(self, - r_data, - angle_data, - group_data=None, - data=None, - cmap=DEFAULT_COLOR_MAP, - clim=None, - rmap=None, - rlim=None, - axis_color=None, - label_color=None): - - ax = plt.gca() - - if data is None: - data = np.ones(len(r_data)) - - clim = self._clim(clim, data) - - if rmap is None: - rnorm = np.vectorize(lambda x: 1.0) - else: - if rlim is None: - rlim = clim - norm = mcolors.Normalize(clim[0], clim[1]) - rnorm = np.vectorize(lambda x: rmap(norm(x))) - - if self.angles is None: - self.infer_dims(r_data, angle_data, group_data) - - num_groups = len(self.groups) - num_rs = len(self.rs) - num_angles = len(self.angles) - - df = pd.DataFrame({ 'group': group_data, - 'angle': angle_data, - 'r': r_data }) - - # compute circle radius - trials_per_group = float(len(df)) / num_groups / num_rs / num_angles - rings = rings_in_hex_pack(trials_per_group) - circle_radius = self.group_radius / (2*rings - 1) * self.circle_scale - - gb = df.groupby(['group', 'angle', 'r']) - - for (group, angle, r), trials in iteritems(gb.groups): - responses = np.sort(data[trials])[::-1] - - circles = spiral_trials_polar(self.r_radius_map[r], - self.angle_map[angle], - rnorm(responses) * circle_radius, - offset=self.group_offset_map[group]) - - circles.set_transform(circles.get_transform() + ax.transData) - circles.set_array(responses) - circles.set_cmap(cmap) - circles.set_clim(clim) - circles.set_zorder(2) - circles.set_linewidths(0) - - ax.add_collection(circles) - - self.finalize() - - @staticmethod - def for_static_gratings(): - return FanPlotter(angle_start=180, - plot_scale=0.9, - circle_scale=2.0, - group_scale=0.4, - plot_center=[0,.45], - inner_radius=.2) - - @staticmethod - def for_drifting_gratings(): - return FanPlotter() - - - - - - diff --git a/allensdk/brain_observatory/comparison_utils.py b/allensdk/brain_observatory/comparison_utils.py deleted file mode 100644 index a9b6b1ab22..0000000000 --- a/allensdk/brain_observatory/comparison_utils.py +++ /dev/null @@ -1,70 +0,0 @@ -import datetime -import math -from typing import Any, Optional, Set - -import SimpleITK as sitk -import numpy as np -import pandas as pd -import xarray as xr -from pandas.util.testing import assert_frame_equal - - -def compare_fields(x1: Any, x2: Any, err_msg="", - ignore_keys: Optional[Set[str]] = None): - """Helper function to compare if two fields (attributes) - are equal to one another. - - Parameters - ---------- - x1 : Any - The first field - x2 : Any - The other field - err_msg : str, optional - The error message to display if two compared fields do not equal - one another, by default "" (an empty string) - ignore_keys - For dictionary comparison, ignore these keys - """ - if ignore_keys is None: - ignore_keys = set() - - if isinstance(x1, pd.DataFrame): - try: - assert_frame_equal(x1, x2, check_like=True) - except Exception: - print(err_msg) - raise - elif isinstance(x1, np.ndarray): - np.testing.assert_array_almost_equal(x1, x2, err_msg=err_msg) - elif isinstance(x1, xr.DataArray): - xr.testing.assert_allclose(x1, x2) - elif isinstance(x1, (list, tuple)): - assert len(x1) == len(x2) - for i in range(len(x1)): - compare_fields(x1=x1[i], x2=x2[i]) - elif isinstance(x1, (sitk.Image,)): - assert x1.GetSize() == x2.GetSize(), err_msg - assert x1 == x2, err_msg - elif isinstance(x1, (datetime.datetime, pd.Timestamp)): - if isinstance(x1, pd.Timestamp): - x1 = x1.to_pydatetime() - if isinstance(x2, pd.Timestamp): - x2 = x2.to_pydatetime() - time_delta = (x1 - x2).total_seconds() - # Timestamp differences should be less than 60 seconds - assert abs(time_delta) < 60 - elif isinstance(x1, (float,)): - if math.isnan(x1) or math.isnan(x2): - both_nan = (math.isnan(x1) and math.isnan(x2)) - assert both_nan, err_msg - else: - assert x1 == x2, err_msg - elif isinstance(x1, (dict,)): - for key in set(x1.keys()).union(set(x2.keys())): - if key in ignore_keys: - continue - key_err_msg = f"Mismatch when checking key {key}. {err_msg}" - compare_fields(x1[key], x2[key], err_msg=key_err_msg) - else: - assert x1 == x2, err_msg diff --git a/allensdk/brain_observatory/demixer.py b/allensdk/brain_observatory/demixer.py deleted file mode 100644 index e661d035b7..0000000000 --- a/allensdk/brain_observatory/demixer.py +++ /dev/null @@ -1,411 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from typing import Tuple, Optional -import os -import logging - -import numpy as np -import scipy.sparse as sparse -import scipy.linalg as linalg -import matplotlib.pyplot as plt -import matplotlib.colors as colors - -import allensdk.internal.brain_observatory.mask_set as mask_set -from allensdk.config.manifest import Manifest - - -def identify_valid_masks(mask_array): - ms = mask_set.MaskSet(masks=mask_array.astype(bool)) - valid_masks = np.ones(mask_array.shape[0]).astype(bool) - - # detect duplicates - duplicates = ms.detect_duplicates(overlap_threshold=0.9) - if len(duplicates) > 0: - valid_masks[duplicates.keys()] = False - - # detect unions, only for remaining valid masks - valid_idxs = np.where(valid_masks) - ms = mask_set.MaskSet(masks=mask_array[valid_idxs].astype(bool)) - unions = ms.detect_unions() - - if len(unions) > 0: - un_idxs = unions.keys() - valid_masks[valid_idxs[0][un_idxs]] = False - - return valid_masks - - -def _demix_point(source_frame: np.ndarray, mask_traces: np.ndarray, - flat_masks: sparse, - pixels_per_mask: np.ndarray) -> Optional[np.ndarray]: - """ - Helper function to run demixing for single point in time for a - source with overlapping traces. - - Parameters - ========== - source_frame: values of movie source at the single time point, - unraveled in the x-y dimension (1d array of length HxW ) - flat_masks: 2d-array of binary masks unraveled in the x-y dimension - mask traces: values of mask trace at single time point (1d-array of - length n, where `n` is number of masks) - pixels_per_mask: Number of pixels for each mask associated with - trace (1d-array of length `n`) - - Returns - ======= - Array of demixed trace values for each mask if all trace data is - nonzero. Otherwise, returns None. - """ - mask_weighted_trace = mask_traces * pixels_per_mask - - # Skip if there is zero signal anywhere in one of the traces - if (mask_weighted_trace == 0).any(): - return None - norm_mat = sparse.diags(pixels_per_mask / mask_weighted_trace, offsets=0) - source_mat = sparse.diags(source_frame, offsets=0) - source_mask_projection = flat_masks.dot(source_mat) - weighted_masks = norm_mat.dot(source_mask_projection) - # cast to dense numpy array for linear solver because solution is dense - overlap = flat_masks.dot(weighted_masks.T).toarray() - try: - demix_traces = linalg.solve(overlap, mask_weighted_trace) - except linalg.LinAlgError: - logging.warning("Singular matrix, using least squares to solve.") - x, _, _, _ = linalg.lstsq(overlap, mask_weighted_trace) - demix_traces = x - return demix_traces - - -def demix_time_dep_masks(raw_traces: np.ndarray, stack: np.ndarray, - masks: np.ndarray, - max_block_size: int = 1000) -> Tuple[np.ndarray, list]: - """ - Demix traces of potentially overlapping masks extraced from a single - 2p recording. - - :param raw_traces: 2d array of traces for each mask, of dimensions - (n, t), where `t` is the number of time points and `n` is the - number of masks. - :param stack: 3d array representing a 1p recording movie, of - dimensions (t, H, W) or corresponding hdf5 dataset. - :param masks: 3d array of binary roi masks, of shape (n, H, W), - where `n` is the number of masks, and HW are the dimensions of - an individual frame in the movie `stack`. - :max_block_size: int representing maximum number of movie frames to read - at a time (-1 for full length `t` of `stack`) (the default is 1000) - :return: Tuple of demixed traces and whether each frame was skipped - in the demixing calculation. - """ - N, T = raw_traces.shape - _, x, y = masks.shape - P = x * y - - if max_block_size == -1: - max_block_size = T - elif max_block_size < 1: - raise ValueError("Invalid maximum block size {}. Must be strictly " - "positive (>= 1), or -1 for full length block " - "size.".format(max_block_size)) - - num_pixels_in_mask = np.sum(masks, axis=(1, 2)) - - flat_masks = masks.reshape(N, P) - flat_masks = sparse.csr_matrix(flat_masks) - - drop_frames = [] - demix_traces = np.zeros((N, T)) - - for t in range(T): - - block_t = t % max_block_size - if block_t == 0: # load next block into memory and reshape - block_T = np.min([(T - t), max_block_size]) - stack_block = stack[t : t+block_T].reshape(block_T, P) - - demixed_point = _demix_point( - stack_block[block_t], raw_traces[:, t], flat_masks, - num_pixels_in_mask) - if demixed_point is not None: - demix_traces[:, t] = demixed_point - drop_frames.append(False) - else: - drop_frames.append(True) - return demix_traces, drop_frames - - -def plot_traces(raw_trace, demix_trace, roi_id, roi_ind, save_file): - fig, ax = plt.subplots() - - ax.plot(raw_trace, label='Fluoresence') - ax.plot(demix_trace, label='Demixed') - ax.set_title("ROI ID(%d) index (%d)" % (roi_id, roi_ind)) - ax.legend() - plt.savefig(save_file) - plt.close(fig) - - -def find_zero_baselines(traces): - means = traces.mean(axis=1) - stds = traces.std(axis=1) - return np.where((means-stds) < 0) - - -def plot_negative_baselines(raw_traces, demix_traces, mask_array, - roi_ids_mask, plot_dir, ext='png'): - N, T = raw_traces.shape - _, x, y = mask_array.shape - - logging.debug("finding negative baselines") - neg_inds = find_negative_baselines(demix_traces)[0] - - overlap_inds = set() - logging.debug("detected negative baselines: %s", str(neg_inds)) - for roi_ind in neg_inds: - Manifest.safe_mkdir(plot_dir) - - save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative.' + ext) - plot_traces(raw_traces[roi_ind], demix_traces[roi_ind], roi_ids_mask[roi_ind], roi_ind, save_file) - - ''' plot overlapping masks ''' - save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative_masks.' + ext) - roi_overlap_inds = plot_overlap_masks_lengthOne(roi_ind, mask_array, save_file) - - overlap_inds.update(roi_overlap_inds) - - zero_inds = find_zero_baselines(demix_traces)[0] - logging.debug("detected zero baselines: %s", str(zero_inds)) - overlap_inds.update(zero_inds) - - return list(overlap_inds) - - -def plot_negative_transients(raw_traces, demix_traces, valid_roi, mask_array, - roi_ids_mask, plot_dir, ext='png'): - - N, T = raw_traces.shape - _, x, y = mask_array.shape - - logging.debug("finding negative transients") - trans_ind_list1 = [find_negative_transients_threshold(trace=demix_traces[n]) for n in range(N)] - rois_with_trans1 = [i for i in range(N) if len(trans_ind_list1[i]) > 0] - rois_with_trans = np.unique(rois_with_trans1) - rois_with_trans = [r for r in rois_with_trans if len(trans_ind_list1[r][0]) > 0] - - logging.debug("plotting negative transients") - - flat_masks = mask_array.reshape(N, x*y) - overlap = flat_masks.dot(flat_masks.T) - overlap ^= np.diag(np.diag(overlap)) - - for roi_ind in rois_with_trans: - - ''' plot biggest negative transient of this roi ''' - trans_ind_list = trans_ind_list1[roi_ind] - - trans_ind_list = trans_ind_list[0] - trans_list = [] - for i in trans_ind_list: - if i > 100 and i < T - 100: - trans_list.append(demix_traces[roi_ind, i - 100:i + 100]) - elif i > 100 and i >= T - 100: - trans_list.append(demix_traces[roi_ind, i - 100:]) - else: - trans_list.append(demix_traces[roi_ind, :i + 100]) - - # trans_list = [demix_traces[roi_ind, i-100:i+100] for i in trans_ind_list if i > 100 and i < Nt] - Ntrans = len(trans_list) - biggest_trans = 0 - for i in range(1, Ntrans): - if np.amin(trans_list[i]) < np.amin(trans_list[biggest_trans]): - biggest_trans = i - - trans_ind = trans_ind_list[biggest_trans] - - # trans_ind_list = np.concatenate((trans_ind_list1[roi_ind][0], trans_ind_list2[roi_ind][0])) - # trans_list_min = np.where(demix_traces[roi_ind, trans_ind_list] == min(demix_traces[roi_ind, trans_ind_list]))[0] - - if np.sum(overlap[roi_ind]) > 0: - - if valid_roi[roi_ind]: - - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_valid.' + ext) - plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) - - ''' plot overlapping masks ''' - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_valid.' + ext) - plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) - # plot_overlap_masks(roi_ind, mask_test, savefile) - else: - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_invalid.' + ext) - plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) - - ''' plot overlapping masks ''' - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_invalid.' + ext) - plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) - # plot_overlap_masks(roi_ind, mask_test, savefile) - # - else: - continue - - return rois_with_trans - - -def rolling_window(trace, window=500): - ''' - - :param trace: - :param window: - :return: - ''' - - shape = trace.shape[:-1] + (trace.shape[-1] - window + 1, window) - strides = trace.strides + (trace.strides[-1], ) - - return np.lib.stride_tricks.as_strided(trace, shape=shape, strides=strides) - - -def find_negative_baselines(trace): - means = trace.mean(axis=1) - stds = trace.std(axis=1) - return np.where((means+stds) < 0) - - -def find_negative_transients_threshold(trace, window=500, length=10, std_devs=3): - trace = np.pad(trace, pad_width=(window-1, 0), mode='constant', constant_values=[np.mean(trace[:window])]) - rolling_mean = np.mean(rolling_window(trace, window), -1) - rolling_std = np.std(rolling_window(trace, window), -1) - - below_thresh = (trace[window-1:] < rolling_mean - std_devs*rolling_std) - below_thresh = np.pad(below_thresh, pad_width=(window-1, 0), mode='constant') - trans_length = np.sum(rolling_window(below_thresh, length), -1) - trans_length = trans_length[window-length:] - - trans_ind = np.where(trans_length == length) - - return trans_ind - - -def plot_overlap_masks_lengthOne(roi_ind, masks, savefile=None, weighted=False): - - masks = np.array(masks).astype(float) - N, x, y = masks.shape - if np.sum(masks[-1]) == x*y: - masks = masks[:-1] - N -= 1 - - flat_masks = masks.reshape(N, x*y) - masks_overlap = flat_masks.dot(flat_masks.T) - - ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with - for i in ind_plot: # rois that overlap with each roi k - ind_k = np.where(masks_overlap[i, :] > 0)[0] - ind_plot = np.concatenate((ind_plot, ind_k)) - - ind_plot = np.unique(ind_plot) - ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) - - plt.figure() - color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] - Ncol = len(color_list) - for num, i in enumerate(ind_plot): - mask_plot = masks[i] - if not weighted: - mask_plot = ((num % Ncol)+1)*np.ma.array(masks[i], mask=(masks[i] == 0)) - plt.imshow(mask_plot, clim=(1., Ncol+1), cmap=colors.ListedColormap(color_list), alpha=0.5, interpolation='nearest') - # plt.imshow(mask_plot, clim=(1., len(ind_plot)), alpha=.5) - - elif weighted: - mask_plot = np.ma.array(masks[i], mask=(masks[i] == 0)) - plt.imshow(mask_plot, cmap='gray_r', alpha=.5, interpolation='nearest') - - plt.text(np.mean(np.where(np.sum(mask_plot, axis=0))), np.mean(np.where(np.sum(mask_plot, axis=1))) ,str(i)) - - mask_tot = np.sum(masks[ind_plot, :, :], axis=0) - mask_x = np.sum(mask_tot, axis=0) - mask_y = np.sum(mask_tot, axis=1) - - plt.xlim((np.amin(np.where(mask_x))-5, np.amax(np.where(mask_x))+5)) - plt.ylim((np.amin(np.where(mask_y))-5, np.amax(np.where(mask_y))+5)) - plt.title('Masks') - - if savefile is not None: - plt.savefig(savefile) - plt.close() - - return ind_plot - - -def plot_transients(roi_ind, t_trans, masks, traces, demix_traces, savefile): - - masks = np.array(masks).astype(float) - N, x, y = masks.shape - _, Nt = traces.shape - - flat_masks = masks.reshape(N, x*y) - masks_overlap = flat_masks.dot(flat_masks.T) - - ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with - for i in ind_plot: # rois that overlap with each roi k - ind_k = np.where(masks_overlap[i, :] > 0)[0] - ind_plot = np.concatenate((ind_plot, ind_k)) - - ind_plot = np.unique(ind_plot) - ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) - - if t_trans > 150 and t_trans < Nt - 150: - plot_t = range(t_trans - 150, t_trans + 150) - elif t_trans > 150 and t_trans >= Nt - 150: - plot_t = range(t_trans - 150, Nt) - else: - plot_t = range(0, t_trans + 150) - - fig, ax = plt.subplots(1, 2, figsize=(12, 6), sharex=True, sharey=True) - color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] - Ncol = len(color_list) - - for num, i in enumerate(ind_plot): - ax[0].plot(plot_t, traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) - ax[1].plot(plot_t, demix_traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) - - ax[0].set_title('Raw') - ax[0].set_ylabel('Fluorescence') - ax[1].set_title('Demixed') - ax[1].set_xlabel('Time') - ax[0].legend(loc=0) - - plt.savefig(savefile) - plt.close(fig) diff --git a/allensdk/brain_observatory/dff.py b/allensdk/brain_observatory/dff.py deleted file mode 100644 index a41dc6eb7c..0000000000 --- a/allensdk/brain_observatory/dff.py +++ /dev/null @@ -1,423 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -import os -import argparse -import matplotlib.pyplot as plt -import warnings -import h5py -import numpy as np -from functools import partial -from scipy.ndimage.filters import median_filter - -from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet - -GAUSSIAN_MAD_STD_SCALE = 1.4826 - - -def movingmode_fast(x, kernelsize, y): - """Compute the windowed mode of an array. A running mode is initialized - with a histogram of values over the initial kernelsize/2 values. The mode - is then updated as the kernel moves by adding and subtracting values from - the histogram. - - Parameters - ---------- - x : np.ndarray - Array to be analyzed - kernelsize : int - Size of the moving window - y : np.ndarray - Output array to store the results - """ - - # offset so that the trace is non-negative - minval = min(x.min(), 0) - if minval < 0: - x = x - minval - - maxval = x.max() - - # compute a histogram of a half kernel - halfsize = int(kernelsize / 2) - histo = np.bincount(np.rint(x[:halfsize]).astype( - np.uint32), minlength=int(maxval + 2)) - - # find the mode of the first half kernel - mode = np.argmax(histo) - - # here initial mode is available - for m in range(0, halfsize): - q = int(round(x[halfsize + m])) - - histo[q] += 1 - - if histo[q] > histo[mode]: - mode = q - - y[m] = mode - - for m in range(halfsize, x.shape[0] - halfsize): - p = int(round(x[m - halfsize])) - histo[p] -= 1 - - # need to find possibly new mode value - if p == mode: - mode = np.argmax(histo) - - q = int(round(x[m + halfsize])) - - histo[q] += 1 - - if histo[q] > histo[mode]: - mode = q - - y[m] = mode - - for m in range(x.shape[0] - halfsize, x.shape[0]): - p = int(round(x[m - halfsize])) - histo[p] -= 1 - - # need to find possibly new mode value - if p == mode: - mode = np.argmax(histo) - - y[m] = mode - - # undo the offset - if minval < 0: - y += minval - - return 0 - - -def movingaverage(x, kernelsize, y): - """Compute the windowed average of an array. - - Parameters - ---------- - x : np.ndarray - Array to be analyzed - kernelsize : int - Size of the moving window - y : np.ndarray - Output array to store the results - """ - - halfsize = int(kernelsize / 2) - sumkernel = np.sum(x[0:halfsize]) - for m in range(0, halfsize): - sumkernel = sumkernel + x[m + halfsize] - y[m] = sumkernel / (halfsize + m) - - sumkernel = np.sum(x[0:kernelsize]) - for m in range(halfsize, x.shape[0] - halfsize): - sumkernel = sumkernel - x[m - halfsize] + x[m + halfsize] - y[m] = sumkernel / kernelsize - - for m in range(x.shape[0] - halfsize, x.shape[0]): - sumkernel = sumkernel - x[m - halfsize] - y[m] = sumkernel / (halfsize - 1 + (x.shape[0] - m)) - - return 0 - - -def plot_onetrace(dff, fc): - """Debug plotting function""" - qs = np.rint(np.linspace(0, len(dff), 5)).astype(int) - - dff_max = dff.max() - dff_min = dff.min() - fc_max = fc.max() - fc_min = fc.min() - - for qi in range(len(qs) - 1): - r = qs[qi], qs[qi + 1] - - frames = np.arange(r[0], r[1]) - ax = plt.subplot(len(qs), 1, qi + 1) - ax.plot(frames, dff[r[0]:r[1]], 'g') - ax.set_ylim(dff_min, dff_max) - ax.set_xlim(r[0], r[1]) - ax.set_xlabel('frames', fontsize=18) - ax.set_ylabel('DF/F', fontsize=18, color='g') - - ax = ax.twinx() - ax.plot(frames, fc[r[0]:r[1]], 'b') - ax.set_ylim(fc_min, fc_max) - ax.set_xlim(r[0], r[1]) - ax.set_ylabel('FC', fontsize=18, color='b') - - return 0 - - -def compute_dff_windowed_mode(traces, - mode_kernelsize=5400, - mean_kernelsize=3000): - """Compute dF/F of a set of traces using a low-pass windowed-mode operator. - - The operation is basically: - - T_mm = windowed_mean(windowed_mode(T)) - - T_dff = (T - T_mm) / T_mm - - Parameters - ---------- - traces : np.ndarray - 2D array of traces to be analyzed. - mode_kernelsize : int - Window size to use for windowed_mode. - mean_kernelsize : int - Window size to use for windowed_mean. - - Returns - ------- - dff : np.ndarray - 2D array of dF/F traces. - """ - if mode_kernelsize >= traces.shape[1]: - mode_kernelsize = traces.shape[1] // 2 - logging.warning("Changing mode_kernelsize to " + str(mode_kernelsize)) - - if mean_kernelsize >= traces.shape[1]: - mean_kernelsize = traces.shape[1] // 4 - logging.warning("Changing mean_kernelsize to " + str(mean_kernelsize)) - - if mode_kernelsize == 0 or mean_kernelsize == 0: - raise ValueError("Kernel length is 0!") - - logging.debug("trace matrix shape: %d %d" % - (traces.shape[0], traces.shape[1])) - - modeline = np.zeros(traces.shape[1]) - modelineLP = np.zeros(traces.shape[1]) - dff = np.zeros((traces.shape[0], traces.shape[1])) - - logging.debug("computing df/f") - - for n in range(0, traces.shape[0]): - if np.any(np.isnan(traces[n])): - logging.warning( - "trace for roi %d contains NaNs, setting to NaN", n) - dff[n, :] = np.nan - continue - - movingmode_fast(traces[n, :], mode_kernelsize, modeline[:]) - movingaverage(modeline[:], mean_kernelsize, modelineLP[:]) - dff[n, :] = (traces[n, :] - modelineLP[:]) / modelineLP[:] - - logging.debug("finished trace %d/%d" % (n + 1, traces.shape[0])) - - return dff - - -def compute_dff_windowed_median(traces, - median_kernel_long=5401, - median_kernel_short=101, - noise_stds=None, - n_small_baseline_frames=None, - **kwargs): - """Compute dF/F of a set of traces with median filter detrending. - - The operation is basically: - - T_long = windowed_median(T) # long timescale kernel - - T_dff1 = (T - T_long) / elementwise_max(T_long, noise_std(T)) - - T_short = windowed_median(T_dff1) # short timescale kernel - - T_dff = T_dff1 - elementwise_min(T_short, 2.5*noise_std(T_dff1)) - - Parameters - ---------- - traces : np.ndarray - 2D array of traces to be analyzed. - median_kernel_long : int - Window size to use for long timescale median detrending. - median_kernel_short : int - Window size to use for short timescale median detrending. - noise_stds : list - List that will contain noise_std(T_dff1) for each trace. The - value for each trace will be appended to the list if provided. - n_small_baseline_frames : list - List that will contain the number of frames for each trace where - the long-timescale median window is less than noise_std(T). The - value for each trace will be appended to the list if provided. - kwargs: - Additional keyword arguments are passed to :func:`noise_std` . - - Returns - ------- - dff : np.ndarray - 2D array of dF/F traces. - """ - _check_kernel(median_kernel_long, traces.shape[1]) - _check_kernel(median_kernel_short, traces.shape[1]) - - dff_traces = np.copy(traces) - - for dff in dff_traces: - sigma_f = noise_std(dff, **kwargs) - - # long timescale median filter for baseline subtraction - tf = median_filter(dff, median_kernel_long, mode='constant') - dff -= tf - dff /= np.maximum(tf, sigma_f) - - if n_small_baseline_frames is not None: - n_small_baseline_frames.append(np.sum(tf <= sigma_f)) - - sigma_dff = noise_std(dff, **kwargs) - if noise_stds is not None: - noise_stds.append(sigma_dff) - - # short timescale detrending - tf = median_filter(dff, median_kernel_short, mode='constant') - tf = np.minimum(tf, 2.5*sigma_dff) - dff -= tf - - return dff_traces - - -def _check_kernel(kernel_size, data_size): - if kernel_size % 2 == 0 or kernel_size <= 0 or kernel_size >= data_size: - raise ValueError("Invalid kernel length {} for data length {}. Kernel " - "length must be positive and odd, and less than data " - "length.".format(kernel_size, data_size)) - - -def noise_std(x, noise_kernel_length=31, positive_peak_scale=1.5, - outlier_std_scale=2.5): - """Robust estimate of the standard deviation of the trace noise.""" - _check_kernel(noise_kernel_length, len(x)) - if any(np.isnan(x)): - return np.NaN - x = x - median_filter(x, noise_kernel_length, mode='constant') - # first pass removing big pos peak outliers - x = x[x < positive_peak_scale*np.abs(x.min())] - rstd = robust_std(x) - # second pass removing remaining pos and neg peak outliers - x = x[abs(x) < outlier_std_scale*rstd] - return robust_std(x) - - -def robust_std(x): - """Robust estimate of standard deviation. - - Estimate of the standard deviation using the median absolute - deviation of x. - """ - median_absolute_deviation = np.median(np.abs(x - np.median(x))) - return GAUSSIAN_MAD_STD_SCALE*median_absolute_deviation - - -def calculate_dff(traces, dff_computation_cb=None, save_plot_dir=None): - """Apply dF/F computation to a set of traces. - - The default computation method is :func:`compute_dff_windowed_median` - using default window parameters. - - Parameters - ---------- - traces : np.ndarray - 2D array of traces to be analyzed. - dff_computation_cb : function - Function that takes traces as an argument and returns an array - of the same shape that is the calculated dF/F. - save_plot_dir : str - Directory to save dF/F plots to. By default no plots are saved. - - Returns - ------- - dff : np.ndarray - 2D array of dF/F traces. - """ - if dff_computation_cb is None: - dff_computation_cb = compute_dff_windowed_median - - dff = dff_computation_cb(traces) - - if save_plot_dir is not None: - if not os.path.exists(save_plot_dir): - os.makedirs(save_plot_dir) - - for n in range(0, traces.shape[0]): - if np.any(np.isnan(traces[n])): - continue - - fig = plt.figure(figsize=(150, 40)) - plot_onetrace(dff[n, :], traces[n, :]) - - plt.title('ROI ' + str(n) + ' ', fontsize=18) - fig.savefig(os.path.join(save_plot_dir, 'dff_%d.png' % - n), orientation='landscape') - plt.close(fig) - - return dff - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("input_h5") - parser.add_argument("output_h5") - parser.add_argument("--plot_dir") - parser.add_argument("--log_level", default=logging.INFO) - - args = parser.parse_args() - - logging.getLogger().setLevel(args.log_level) - - # read from "data" - if args.input_h5.endswith("nwb"): - timestamps, traces = BrainObservatoryNwbDataSet( - args.input_h5).get_corrected_fluorescence_traces() - else: - input_h5 = h5py.File(args.input_h5, "r") - traces = input_h5["data"].value - input_h5.close() - - dff = calculate_dff(traces, save_plot_dir=args.plot_dir) - - # write to "data" - output_h5 = h5py.File(args.output_h5, "w") - output_h5["data"] = dff - output_h5.close() - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/drifting_gratings.py b/allensdk/brain_observatory/drifting_gratings.py deleted file mode 100644 index 7e2a72e9cb..0000000000 --- a/allensdk/brain_observatory/drifting_gratings.py +++ /dev/null @@ -1,505 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .stimulus_analysis import StimulusAnalysis -import scipy.stats as st -import pandas as pd -import numpy as np -import h5py -from math import sqrt -import logging -from . import observatory_plots as oplots -from . import circle_plots as cplots -from .brain_observatory_exceptions import MissingStimulusException -import matplotlib.pyplot as plt - -class DriftingGratings(StimulusAnalysis): - """ Perform tuning analysis specific to drifting gratings stimulus. - - Parameters - ---------- - data_set: BrainObservatoryNwbDataSet object - """ - - _log = logging.getLogger('allensdk.brain_observatory.drifting_gratings') - - def __init__(self, data_set, **kwargs): - super(DriftingGratings, self).__init__(data_set, **kwargs) - - self.sweeplength = 60 - self.interlength = 30 - self.extralength = 0 - - self._orivals = DriftingGratings._PRELOAD - self._tfvals = DriftingGratings._PRELOAD - self._number_ori = DriftingGratings._PRELOAD - self._number_tf = DriftingGratings._PRELOAD - - @property - def orivals(self): - if self._orivals is DriftingGratings._PRELOAD: - self.populate_stimulus_table() - - return self._orivals - - @property - def tfvals(self): - if self._tfvals is DriftingGratings._PRELOAD: - self.populate_stimulus_table() - - return self._tfvals - - @property - def number_ori(self): - if self._number_ori is DriftingGratings._PRELOAD: - self.populate_stimulus_table() - - return self._number_ori - - @property - def number_tf(self): - if self._number_tf is DriftingGratings._PRELOAD: - self.populate_stimulus_table() - - return self._number_tf - - def populate_stimulus_table(self): - stimulus_table = self.data_set.get_stimulus_table('drifting_gratings') - self._stim_table = stimulus_table.fillna(value=0.) - self._orivals = np.unique(self.stim_table.orientation).astype(int) - self._tfvals = np.unique(self.stim_table.temporal_frequency).astype(int) - self._number_ori = len(self.orivals) - self._number_tf = len(self.tfvals) - - def get_response(self): - ''' Computes the mean response for each cell to each stimulus condition. Return is - a (# orientations, # temporal frequencies, # cells, 3) np.ndarray. The final dimension - contains the mean response to the condition (index 0), standard error of the mean of the response - to the condition (index 1), and the number of trials with a significant response (p < 0.05) - to that condition (index 2). - - Returns - ------- - Numpy array storing mean responses. - ''' - DriftingGratings._log.info("Calculating mean responses") - - response = np.empty( - (self.number_ori, self.number_tf, self.numbercells + 1, 3)) - - def ptest(x): - return len(np.where(x < (0.05 / (8 * 5)))[0]) - - for ori in self.orivals: - ori_pt = np.where(self.orivals == ori)[0][0] - for tf in self.tfvals: - tf_pt = np.where(self.tfvals == tf)[0][0] - subset_response = self.mean_sweep_response[ - (self.stim_table.temporal_frequency == tf) & (self.stim_table.orientation == ori)] - subset_pval = self.pval[(self.stim_table.temporal_frequency == tf) & ( - self.stim_table.orientation == ori)] - response[ori_pt, tf_pt, :, 0] = subset_response.mean(axis=0) - response[ori_pt, tf_pt, :, 1] = subset_response.std( - axis=0) / sqrt(len(subset_response)) - response[ori_pt, tf_pt, :, 2] = subset_pval.apply( - ptest, axis=0) - return response - - def get_peak(self): - ''' Computes metrics related to each cell's peak response condition. - - Returns - ------- - Pandas data frame containing the following columns (_dg suffix is - for drifting grating): - * ori_dg (orientation) - * tf_dg (temporal frequency) - * reliability_dg - * osi_dg (orientation selectivity index) - * dsi_dg (direction selectivity index) - * peak_dff_dg (peak dF/F) - * ptest_dg - * p_run_dg - * run_modulation_dg - * cv_dg (circular variance) - ''' - DriftingGratings._log.info('Calculating peak response properties') - - peak = pd.DataFrame(index=range(self.numbercells), columns=('ori_dg', 'tf_dg', 'reliability_dg', - 'osi_dg', 'dsi_dg', 'peak_dff_dg', - 'ptest_dg', 'p_run_dg', 'run_modulation_dg', - 'cv_os_dg', 'cv_ds_dg', 'tf_index_dg', - 'cell_specimen_id')) - cids = self.data_set.get_cell_specimen_ids() - - orivals_rad = np.deg2rad(self.orivals) - for nc in range(self.numbercells): - cell_peak = np.where(self.response[:, 1:, nc, 0] == np.nanmax( - self.response[:, 1:, nc, 0])) - prefori = cell_peak[0][0] - preftf = cell_peak[1][0] + 1 - peak.cell_specimen_id.iloc[nc] = cids[nc] - peak.ori_dg.iloc[nc] = prefori - peak.tf_dg.iloc[nc] = preftf - - pref = self.response[prefori, preftf, nc, 0] - orth1 = self.response[np.mod(prefori + 2, 8), preftf, nc, 0] - orth2 = self.response[np.mod(prefori - 2, 8), preftf, nc, 0] - orth = (orth1 + orth2) / 2 - null = self.response[np.mod(prefori + 4, 8), preftf, nc, 0] - - tuning = self.response[:, preftf, nc, 0] - tuning = np.where(tuning>0, tuning, 0) - #new circular variance below - CV_top_os = np.empty((8), dtype=np.complex128) - CV_top_ds = np.empty((8), dtype=np.complex128) - for i in range(8): - CV_top_os[i] = (tuning[i]*np.exp(1j*2*orivals_rad[i])) - CV_top_ds[i] = (tuning[i]*np.exp(1j*orivals_rad[i])) - peak.cv_os_dg.iloc[nc] = np.abs(CV_top_os.sum())/tuning.sum() - peak.cv_ds_dg.iloc[nc] = np.abs(CV_top_ds.sum())/tuning.sum() - - peak.osi_dg.iloc[nc] = (pref - orth) / (pref + orth) - peak.dsi_dg.iloc[nc] = (pref - null) / (pref + null) - peak.peak_dff_dg.iloc[nc] = pref - - groups = [] - for ori in self.orivals: - for tf in self.tfvals[1:]: - groups.append(self.mean_sweep_response[(self.stim_table.temporal_frequency == tf) & ( - self.stim_table.orientation == ori)][str(nc)]) - groups.append(self.mean_sweep_response[ - self.stim_table.temporal_frequency == 0][str(nc)]) - _, p = st.f_oneway(*groups) - peak.ptest_dg.iloc[nc] = p - - subset = self.mean_sweep_response[(self.stim_table.temporal_frequency == self.tfvals[ - preftf]) & (self.stim_table.orientation == self.orivals[prefori])] - #running modulation - subset_stat = subset[subset.dx < 1] - subset_run = subset[subset.dx >= 1] - if (len(subset_run) > 2) & (len(subset_stat) > 2): - (_,peak.p_run_dg.iloc[nc]) = st.ttest_ind(subset_run[str(nc)], subset_stat[str(nc)], equal_var=False) - - if subset_run[str(nc)].mean()>subset_stat[str(nc)].mean(): - peak.run_modulation_dg.iloc[nc] = (subset_run[str(nc)].mean() - subset_stat[str(nc)].mean())/np.abs(subset_run[str(nc)].mean()) - elif subset_run[str(nc)].mean()<subset_stat[str(nc)].mean(): - peak.run_modulation_dg.iloc[nc] = -1*((subset_stat[str(nc)].mean() - subset_run[str(nc)].mean())/np.abs(subset_stat[str(nc)].mean())) - - else: - peak.p_run_dg.iloc[nc] = np.NaN - peak.run_modulation_dg.iloc[nc] = np.NaN - - #reliability - subset = self.sweep_response[(self.stim_table.temporal_frequency == self.tfvals[ - preftf]) & (self.stim_table.orientation == self.orivals[prefori])] - corr_matrix = np.empty((len(subset),len(subset))) - for i in range(len(subset)): - for j in range(len(subset)): - r,p = st.pearsonr(subset[str(nc)].iloc[i][30:90], subset[str(nc)].iloc[j][30:90]) - corr_matrix[i,j] = r - mask = np.ones((len(subset), len(subset))) - for i in range(len(subset)): - for j in range(len(subset)): - if i>=j: - mask[i,j] = np.NaN - corr_matrix *= mask - peak.reliability_dg.iloc[nc] = np.nanmean(corr_matrix) - - #TF index - tf_tuning = self.response[prefori,1:,nc,0] - trials = self.mean_sweep_response[(self.stim_table.temporal_frequency!=0)&(self.stim_table.orientation==self.orivals[prefori])][str(nc)].values - SSE_part = np.sqrt(np.sum((trials-trials.mean())**2)/(len(trials)-5)) - peak.tf_index_dg.iloc[nc] = (np.ptp(tf_tuning))/(np.ptp(tf_tuning) + 2*SSE_part) - - return peak - - def open_star_plot(self, cell_specimen_id=None, include_labels=False, cell_index=None): - cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) - - df = self.mean_sweep_response[str(cell_index)] - st = self.data_set.get_stimulus_table('drifting_gratings') - mask = st.dropna(subset=['orientation']).index - - data = df.values - - cmin = self.response[0,0,cell_index,0] - cmax = max(cmin, data.mean() + data.std()*3) - - fp = cplots.FanPlotter.for_drifting_gratings() - fp.plot(r_data=st.temporal_frequency.ix[mask].values, - angle_data=st.orientation.ix[mask].values, - data=df.ix[mask].values, - clim=[cmin, cmax]) - fp.show_axes(closed=True) - - if include_labels: - fp.show_r_labels() - fp.show_angle_labels() - - def plot_orientation_selectivity(self, - si_range=oplots.SI_RANGE, - n_hist_bins=oplots.N_HIST_BINS, - color=oplots.STIM_COLOR, - p_value_max=oplots.P_VALUE_MAX, - peak_dff_min=oplots.PEAK_DFF_MIN): - # responsive cells - vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) - - # orientation selective cells - osi_cells = vis_cells & (self.peak.osi_dg > si_range[0]) & (self.peak.osi_dg < si_range[1]) - - peak_osi = self.peak.ix[osi_cells] - osis = peak_osi.osi_dg.values - - oplots.plot_selectivity_cumulative_histogram(osis, - "orientation selectivity index", - si_range=si_range, - n_hist_bins=n_hist_bins, - color=color) - - def plot_direction_selectivity(self, - si_range=oplots.SI_RANGE, - n_hist_bins=oplots.N_HIST_BINS, - color=oplots.STIM_COLOR, - p_value_max=oplots.P_VALUE_MAX, - peak_dff_min=oplots.PEAK_DFF_MIN): - - # responsive cells - vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) - - # direction selective cells - dsi_cells = vis_cells & (self.peak.dsi_dg > si_range[0]) & (self.peak.dsi_dg < si_range[1]) - - peak_dsi = self.peak.ix[dsi_cells] - dsis = peak_dsi.dsi_dg.values - - oplots.plot_selectivity_cumulative_histogram(dsis, - "direction selectivity index", - si_range=si_range, - n_hist_bins=n_hist_bins, - color=color) - - def plot_preferred_direction(self, - include_labels=False, - si_range=oplots.SI_RANGE, - color=oplots.STIM_COLOR, - p_value_max=oplots.P_VALUE_MAX, - peak_dff_min=oplots.PEAK_DFF_MIN): - vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) - pref_dirs = self.peak.ix[vis_cells].ori_dg.values - pref_dirs = [ self.orivals[pref_dir] for pref_dir in pref_dirs ] - - angles, counts = np.unique(pref_dirs, return_counts=True) - oplots.plot_radial_histogram(angles, - counts, - include_labels=include_labels, - all_angles=self.orivals, - direction=-1, - offset=0.0, - closed=True, - color=color) - - def plot_preferred_temporal_frequency(self, - si_range=oplots.SI_RANGE, - color=oplots.STIM_COLOR, - p_value_max=oplots.P_VALUE_MAX, - peak_dff_min=oplots.PEAK_DFF_MIN): - - vis_cells = (self.peak.ptest_dg < p_value_max) & (self.peak.peak_dff_dg > peak_dff_min) - pref_tfs = self.peak.ix[vis_cells].tf_dg.values - - oplots.plot_condition_histogram(pref_tfs, - self.tfvals[1:], - color=color) - - plt.xlabel("temporal frequency (Hz)") - plt.ylabel("number of cells") - - def reshape_response_array(self): - ''' - :return: response array in cells x stim x repetition for noise correlations - ''' - - mean_sweep_response = self.mean_sweep_response.values[:, :self.numbercells] - - reps = [] - stim_table = self.stim_table - - tfvals = self.tfvals - tfvals = tfvals[tfvals != 0] # blank sweep - - response_new = np.zeros((self.numbercells, self.number_ori, self.number_tf-1), dtype='object') - - for i, ori in enumerate(self.orivals): - for j, tf in enumerate(tfvals): - ind = (stim_table.orientation.values == ori) * (stim_table.temporal_frequency.values == tf) - for c in range(self.numbercells): - response_new[c, i, j] = mean_sweep_response[ind, c] - - ind = (stim_table.temporal_frequency.values == 0) - response_blank = mean_sweep_response[ind, :].T - - return response_new, response_blank - - def get_signal_correlation(self, corr='spearman'): - logging.debug("Calculating signal correlation") - - response = self.response[:, 1:, :self.numbercells, 0] # orientation x freq x cell, no blank - response = response.reshape(self.number_ori * (self.number_tf-1), self.numbercells).T - N, Nstim = response.shape - - signal_corr = np.zeros((N, N)) - signal_p = np.empty((N, N)) - if corr == 'pearson': - for i in range(N): - for j in range(i, N): # matrix is symmetric - signal_corr[i, j], signal_p[i, j] = st.pearsonr(response[i], response[j]) - - elif corr == 'spearman': - for i in range(N): - for j in range(i, N): # matrix is symmetric - signal_corr[i, j], signal_p[i, j] = st.spearmanr(response[i], response[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - signal_corr = np.triu(signal_corr) + np.triu(signal_corr, 1).T # fill in lower triangle - signal_p = np.triu(signal_p) + np.triu(signal_p, 1).T # fill in lower triangle - - return signal_corr, signal_p - - - def get_representational_similarity(self, corr='spearman'): - logging.debug("Calculating representational similarity") - - response = self.response[:, 1:, :self.numbercells, 0] # orientation x freq x phase x cell, no blank - response = response.reshape(self.number_ori * (self.number_tf-1), self.numbercells) - Nstim, N = response.shape - - rep_sim = np.zeros((Nstim, Nstim)) - rep_sim_p = np.empty((Nstim, Nstim)) - if corr == 'pearson': - for i in range(Nstim): - for j in range(i, Nstim): # matrix is symmetric - rep_sim[i, j], rep_sim_p[i, j] = st.pearsonr(response[i], response[j]) - - elif corr == 'spearman': - for i in range(Nstim): - for j in range(i, Nstim): # matrix is symmetric - rep_sim[i, j], rep_sim_p[i, j] = st.spearmanr(response[i], response[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - rep_sim = np.triu(rep_sim) + np.triu(rep_sim, 1).T # fill in lower triangle - rep_sim_p = np.triu(rep_sim_p) + np.triu(rep_sim_p, 1).T # fill in lower triangle - - return rep_sim, rep_sim_p - - - def get_noise_correlation(self, corr='spearman'): - logging.debug("Calculating noise correlations") - - response, response_blank = self.reshape_response_array() - noise_corr = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_tf-1)) - noise_corr_p = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_tf-1)) - - noise_corr_blank = np.zeros((self.numbercells, self.numbercells)) - noise_corr_blank_p = np.zeros((self.numbercells, self.numbercells)) - - if corr == 'pearson': - for k in range(self.number_ori): - for l in range(self.number_tf-1): - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr[i, j, k, l], noise_corr_p[i, j, k, l] = st.pearsonr(response[i, k, l], response[j, k, l]) - - noise_corr[:, :, k, l] = np.triu(noise_corr[:, :, k, l]) + np.triu(noise_corr[:, :, k, l], 1).T - - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.pearsonr(response_blank[i], response_blank[j]) - - elif corr == 'spearman': - for k in range(self.number_ori): - for l in range(self.number_tf-1): - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr[i, j, k, l], noise_corr_p[i, j, k, l] = st.spearmanr(response[i, k, l], response[j, k, l]) - - noise_corr[:, :, k, l] = np.triu(noise_corr[:, :, k, l]) + np.triu(noise_corr[:, :, k, l], 1).T - - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.spearmanr(response_blank[i], response_blank[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - noise_corr_blank[:, :] = np.triu(noise_corr_blank[:, :]) + np.triu(noise_corr_blank[:, :], 1).T - - return noise_corr, noise_corr_p, noise_corr_blank, noise_corr_blank_p - - - @staticmethod - def from_analysis_file(data_set, analysis_file): - dg = DriftingGratings(data_set) - - try: - dg.populate_stimulus_table() - - dg._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_dg") - dg._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_dg") - dg._peak = pd.read_hdf(analysis_file, "analysis/peak") - - with h5py.File(analysis_file, "r") as f: - dg._response = f["analysis/response_dg"].value - dg._binned_dx_sp = f["analysis/binned_dx_sp"].value - dg._binned_cells_sp = f["analysis/binned_cells_sp"].value - dg._binned_dx_vis = f["analysis/binned_dx_vis"].value - dg._binned_cells_vis = f["analysis/binned_cells_vis"].value - if "analysis/noise_corr_dg" in f: - dg.noise_correlation = f["analysis/noise_corr_dg"].value - if "analysis/signal_corr_dg" in f: - dg.signal_correlation = f["analysis/signal_corr_dg"].value - if "analysis/rep_similarity_dg" in f: - dg.representational_similarity = f["analysis/rep_similarity_dg"].value - - except Exception as e: - raise MissingStimulusException(e.args) - - return dg - diff --git a/allensdk/brain_observatory/ecephys/README.md b/allensdk/brain_observatory/ecephys/README.md deleted file mode 100644 index 70deddcc30..0000000000 --- a/allensdk/brain_observatory/ecephys/README.md +++ /dev/null @@ -1,16 +0,0 @@ -Extracellular Electrophysiology -=============================== - -At the Allen Institute for Brain Science we collect **e**xtra**c**ellular **e**lectro**phys**iology (abbreviated as **ecephys**) data using [Neuropixels probes](https://www.nature.com/articles/nature24636). The primary data consists of spike times recorded from individual units, as well as continuous local field potential (LFP) signals recorded from individual electrodes. Each data point is spatially registered to a location along the Neuropixels probe shank and (in most cases) a specific 3D point in the Allen Mouse Common Coordinate Framework (CCFv3). These datasets are incredibly rich, and can be used to address a variety of scientific questions related to visual physiology, inter-area interactions, and state-dependent signal processing. - -This subpackage of the AllenSDK contains: - -- code for accessing and working with our ecephys data -- code for data pre-processing and [NWB file](https://www.nwb.org/how-to-use/) packaging -- code for analyzing these data in our pipelines - - -Python compatibility --------------------- -The code in this subpackage is guaranteed to be compatible with Python versions 3.6 and later. It is not compatible with Python 2. - diff --git a/allensdk/brain_observatory/ecephys/__init__.py b/allensdk/brain_observatory/ecephys/__init__.py deleted file mode 100644 index 62f154428e..0000000000 --- a/allensdk/brain_observatory/ecephys/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -import numpy as np - - - -UNIT_FILTER_DEFAULTS = { - "amplitude_cutoff_maximum": { - "value": 0.1, - "missing": np.inf - }, - "presence_ratio_minimum": { - "value": 0.95, - "missing": -np.inf - }, - "isi_violations_maximum": { - "value": 0.5, - "missing": np.inf - } -} - - -def get_unit_filter_value(key, pop=True, replace_none=True, **source): - if pop: - value = source.pop(key, UNIT_FILTER_DEFAULTS[key]["value"]) - else: - value = source.get(key, UNIT_FILTER_DEFAULTS[key]["value"]) - - if value is None and replace_none: - value = UNIT_FILTER_DEFAULTS[key]["missing"] - - return value diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/README.md b/allensdk/brain_observatory/ecephys/align_timestamps/README.md deleted file mode 100644 index 6044780796..0000000000 --- a/allensdk/brain_observatory/ecephys/align_timestamps/README.md +++ /dev/null @@ -1,27 +0,0 @@ -Align Timestamps -================ -Computes a transformation from probe sample indices to times on the experiment master clock, then maps zero or more timestamp -arrays through that transform. - - -Running -------- -``` -python -m allensdk.brain_observatory.ecephys.align_timestamps --input_json <path to input json> --output_json <path to output json> -``` -See the schema file for detailed information about input json contents. - - -Input data ----------- -- Sync h5 : Contains information about barcode pulses assessed on the master clock -- For each probe - - barcode channel states file: lists rising and falling edges on the probe's barcode line - - barcode timestamps file: lists probe samples at which rising and falling edges were detected - - mappable timestamp files: Will be transformed to the master clock. An example would be a file listing timestamps of detected spikes. - - - -Output data ------------ -Each mappable file for each probe is aligned and written out. Additionally, the transform is written into the output json. \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/__init__.py b/allensdk/brain_observatory/ecephys/align_timestamps/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/__main__.py b/allensdk/brain_observatory/ecephys/align_timestamps/__main__.py deleted file mode 100644 index 31773553c5..0000000000 --- a/allensdk/brain_observatory/ecephys/align_timestamps/__main__.py +++ /dev/null @@ -1,111 +0,0 @@ -import numpy as np - -from allensdk.brain_observatory.argschema_utilities import \ - ArgSchemaParserPlus, \ - write_or_print_outputs -from ._schemas import InputParameters, OutputParameters -from .barcode_sync_dataset import BarcodeSyncDataset -from .channel_states import extract_barcodes_from_states, \ - extract_splits_from_states -from .probe_synchronizer import ProbeSynchronizer - - -def align_timestamps(args): - sync_dataset = BarcodeSyncDataset.factory(args["sync_h5_path"]) - sync_times, sync_codes = sync_dataset.extract_barcodes() - - probe_output_info = [] - for probe in args["probes"]: - print(probe["name"]) - this_probe_output_info = {} - - channel_states = np.load(probe["barcode_channel_states_path"]) - timestamps = np.load(probe["barcode_timestamps_path"]) - - probe_barcode_times, probe_barcodes = extract_barcodes_from_states( - channel_states, timestamps, probe["sampling_rate"] - ) - probe_split_times = extract_splits_from_states( - channel_states, timestamps, probe["sampling_rate"] - ) - - print("Split times:") - print(probe_split_times) - - synchronizers = [] - - for idx, split_time in enumerate(probe_split_times): - - min_time = probe_split_times[idx] - - if idx == (len(probe_split_times) - 1): - max_time = np.Inf - else: - max_time = probe_split_times[idx + 1] - - synchronizer = ProbeSynchronizer.compute( - sync_times, - sync_codes, - probe_barcode_times, - probe_barcodes, - min_time, - max_time, - probe["start_index"], - probe["sampling_rate"], - ) - - synchronizers.append(synchronizer) - - mapped_files = {} - - for timestamp_file in probe["mappable_timestamp_files"]: - # print(timestamp_file["name"]) - timestamps = np.load(timestamp_file["input_path"]) - aligned_timestamps = np.copy(timestamps).astype("float64") - - for synchronizer in synchronizers: - aligned_timestamps = synchronizer(aligned_timestamps) - print( - "total time shift: " + str(synchronizer.total_time_shift)) - print( - "actual sampling rate: " - + str(synchronizer.global_probe_sampling_rate) - ) - - np.save( - timestamp_file["output_path"], aligned_timestamps, - allow_pickle=False - ) - mapped_files[timestamp_file["name"]] = timestamp_file[ - "output_path"] - - lfp_sampling_rate = ( - probe["lfp_sampling_rate"] * synchronizer.sampling_rate_scale - ) - - this_probe_output_info[ - "total_time_shift"] = synchronizer.total_time_shift - this_probe_output_info[ - "global_probe_sampling_rate" - ] = synchronizer.global_probe_sampling_rate - this_probe_output_info[ - "global_probe_lfp_sampling_rate"] = lfp_sampling_rate - this_probe_output_info["output_paths"] = mapped_files - this_probe_output_info["name"] = probe["name"] - - probe_output_info.append(this_probe_output_info) - - return {"probe_outputs": probe_output_info} - - -def main(): - mod = ArgSchemaParserPlus( - schema_type=InputParameters, output_schema_type=OutputParameters - ) - output = align_timestamps(mod.args) - - write_or_print_outputs(data=output, parser=mod) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/_schemas.py b/allensdk/brain_observatory/ecephys/align_timestamps/_schemas.py deleted file mode 100644 index 5cb0e75632..0000000000 --- a/allensdk/brain_observatory/ecephys/align_timestamps/_schemas.py +++ /dev/null @@ -1,92 +0,0 @@ -from argschema import ArgSchema, ArgSchemaParser -from argschema.schemas import DefaultSchema -from argschema.fields import Nested, InputDir, String, Float, Dict, Int, List - - -class ProbeMappable(DefaultSchema): - name = String( - required=True, - help='What kind of mappable data is this? e.g. "spike_timestamps"', - ) - input_path = String( - required=True, - help="Input path for this file. Should point to a file containing a 1D timestamps array with values in probe samples.", - ) - output_path = String( - required=True, - help="Output path for the mapped version of this file. Will write a 1D timestamps array with values in seconds on the master clock.", - ) - - -class ProbeInputParameters(DefaultSchema): - name = String(required=True, help="Identifier for this probe") - sampling_rate = Float( - required=True, - help="The sampling rate of the probe, in Hz, assessed on the probe clock.", - ) - lfp_sampling_rate = Float( - required=True, help="The sampling rate of the LFP collected on this probe." - ) - start_index = Int( - default=0, help="Sample index of probe recording start time. Defaults to 0." - ) - barcode_channel_states_path = String( - required=True, - help="Path to the channel states file. This file contains a 1-dimensional array whose axis is events and whose " - "values indicate the state of the channel line (rising or falling) at that event.", - ) - barcode_timestamps_path = String( - required=True, - help="Path to the timestamps file. This file contains a 1-dimensional array whose axis is events and whose " - "values indicate the sample on which each event was detected.", - ) - mappable_timestamp_files = Nested( - ProbeMappable, - many=True, - help="Timestamps files for this probe. Describe the times (in probe samples) when e.g. lfp samples were taken or spike events occured", - ) - - -class InputParameters(ArgSchema): - probes = Nested( - ProbeInputParameters, - many=True, - help="Probes whose data will be aligned to the master clock.", - ) - sync_h5_path = String( - required=True, help="path to h5 file containing syncronization information" - ) - - -class ProbeOutputParameters(DefaultSchema): - name = String(required=True, help="Identifier for this probe") - output_paths = Dict( - required=True, - help="Paths of each mappable file written by this run of the module.", - ) - total_time_shift = Float( - required=True, - help="Translation (in seconds) from master->probe times computed for this probe.", - ) - global_probe_sampling_rate = Float( - required=True, - help="The sampling rate of this probe in Hz, assessed on the master clock.", - ) - global_probe_lfp_sampling_rate = Float( - required=True, - help="The sampling rate of LFP collected on this probe in Hz, assessed on the master clock.", - ) - - -class OutputSchema(DefaultSchema): - input_parameters = Nested( - InputParameters, - description="Input parameters the module was run with", - required=True, - ) - - -class OutputParameters(OutputSchema): - probe_outputs = Nested( - ProbeOutputParameters, many="True", help="Probewise outputs." - ) diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/barcode.py b/allensdk/brain_observatory/ecephys/align_timestamps/barcode.py deleted file mode 100644 index 850308ee31..0000000000 --- a/allensdk/brain_observatory/ecephys/align_timestamps/barcode.py +++ /dev/null @@ -1,303 +0,0 @@ -import numpy as np - - -def extract_barcodes_from_times( - on_times, - off_times, - inter_barcode_interval=10, - bar_duration=0.03, - barcode_duration_ceiling=2, - nbits=32, -): - """Read barcodes from timestamped rising and falling edges. - - Parameters - ---------- - on_times : numpy.ndarray - Timestamps of rising edges on the barcode line - off_times : numpy.ndarray - Timestamps of falling edges on the barcode line - inter_barcode_interval : numeric, optional - Minimun duration of time between barcodes. - bar_duration : numeric, optional - A value slightly shorter than the expected duration of each bar - barcode_duration_ceiling : numeric, optional - The maximum duration of a single barcode - nbits : int, optional - The bit-depth of each barcode - - Returns - ------- - barcode_start_times : list of numeric - For each detected barcode, the time at which that barcode started - barcodes : list of int - For each detected barcode, the value of that barcode as an integer. - - Notes - ----- - ignores first code in prod (ok, but not intended) - ignores first on pulse (intended - this is needed to identify that a barcode is starting) - - """ - - start_indices = np.diff(on_times) - a = np.where(start_indices > inter_barcode_interval)[0] - barcode_start_times = on_times[a + 1] - - barcodes = [] - - for i, t in enumerate(barcode_start_times): - - oncode = on_times[ - np.where( - np.logical_and(on_times > t, on_times < t + barcode_duration_ceiling) - )[0] - ] - offcode = off_times[ - np.where( - np.logical_and(off_times > t, off_times < t + barcode_duration_ceiling) - )[0] - ] - - currTime = offcode[0] - - bits = np.zeros((nbits,)) - - for bit in range(0, nbits): - - nextOn = np.where(oncode > currTime)[0] - nextOff = np.where(offcode > currTime)[0] - - if nextOn.size > 0: - nextOn = oncode[nextOn[0]] - else: - nextOn = t + inter_barcode_interval - - if nextOff.size > 0: - nextOff = offcode[nextOff[0]] - else: - nextOff = t + inter_barcode_interval - - if nextOn < nextOff: - bits[bit] = 1 - - currTime += bar_duration - - barcode = 0 - - # least sig left - for bit in range(0, nbits): - barcode += bits[bit] * pow(2, bit) - - barcodes.append(barcode) - - return barcode_start_times, barcodes - - -def find_matching_index(master_barcodes, probe_barcodes, alignment_type="start"): - """Given a set of barcodes for the master clock and the probe clock, find the - indices of a matching set, either starting from the beginning or the end - of the list. - - Parameters - ---------- - master_barcodes : np.ndarray - barcode values on the master line. One per barcode - probe_barcodes : np.ndarray - barcode values on the probe line. One per barcode - alignment_type : string - 'start' or 'end' - - Returns - ------- - master_barcode_index : int - matching index for master barcodes (None if not found) - probe_barcode_index : int - matching index for probe barcodes (None if not found) - - """ - - foundMatch = False - master_barcode_index = None - - if alignment_type == "start": - probe_barcode_index = 0 - direction = 1 - else: - probe_barcode_index = -1 - direction = -1 - - while not foundMatch and abs(probe_barcode_index) < len(probe_barcodes): - - master_barcode_index = np.where( - master_barcodes == probe_barcodes[probe_barcode_index] - )[0] - - assert len(master_barcode_index) < 2 - - if len(master_barcode_index) == 1: - foundMatch = True - else: - probe_barcode_index += direction - - if foundMatch: - return master_barcode_index, probe_barcode_index - else: - return None, None - - -def match_barcodes(master_times, master_barcodes, probe_times, probe_barcodes): - """Given sequences of barcode values and (local) times on a probe line and a master - line, find the time points on each clock corresponding to the first and last shared - barcode. - - If there's only one probe barcode, only the first matching timepoint is returned. - - Parameters - ---------- - master_times : np.ndarray - start times of barcodes (according to the master clock) on the master line. - One per barcode. - master_barcodes : np.ndarray - barcode values on the master line. One per barcode - probe_times : np.ndarray - start times (according to the probe clock) of barcodes on the probe line. - One per barcode - probe_barcodes : np.ndarray - barcode values on the probe_line. One per barcode - - Returns - ------- - probe_interval : np.ndarray - Start and end times of the matched interval according to the probe_clock. - master_interval : np.ndarray - Start and end times of the matched interval according to the master clock - - """ - - master_start_index, probe_start_index = find_matching_index( - master_barcodes, probe_barcodes, alignment_type="start" - ) - - if master_start_index is not None: - t_m_start = master_times[master_start_index] - t_p_start = probe_times[probe_start_index] - else: - t_m_start, t_p_start = None, None - - # print(master_barcodes) - # print(probe_barcodes) - - print("Master start index: " + str(master_start_index)) - if len(probe_barcodes) > 2: - master_end_index, probe_end_index = find_matching_index(master_barcodes, probe_barcodes, alignment_type='end') - - if probe_end_index is not None: - print("Probe end index: " + str(probe_end_index)) - t_m_end = master_times[master_end_index] - t_p_end = probe_times[probe_end_index] - else: - t_m_end = None - t_p_end = None - else: - t_m_end, t_p_end = None, None - - return np.array([t_p_start, t_p_end]), np.array([t_m_start, t_m_end]) - - -def linear_transform_from_intervals(master, probe): - """Find a scale and translation which aligns two 1d segments - - Parameters - ---------- - master : iterable - Pair of floats defining the master interval. Order is [start, end]. - probe : iterable - Pair of floats defining the probe interval. Order is [start, end]. - - Returns - ------- - scale : float - Scale factor. If > 1.0, the probe clock is running fast compared to the - master clock. If < 1.0, the probe clock is running slow. - translation : float - If > 0, the probe clock started before the master clock. If > 0, after. - - Notes - ----- - solves - (master + translation) * scale = probe - for scale and translation - """ - - if probe[1] is not None: - scale = (probe[1] - probe[0]) / (master[1] - master[0]) - else: - scale = 1.0 - - if master[0] is not None: - translation = probe[0] / scale - master[0] - else: - translation = None - - return scale, translation - - -def get_probe_time_offset( - master_times, - master_barcodes, - probe_times, - probe_barcodes, - acq_start_index, - local_probe_rate, -): - """Time offset between master clock and recording probes. For converting probe time to master clock. - - Parameters - ---------- - master_times : np.ndarray - start times of barcodes (according to the master clock) on the master line. - One per barcode. - master_barcodes : np.ndarray - barcode values on the master line. One per barcode - probe_times : np.ndarray - start times (according to the probe clock) of barcodes on the probe line. - One per barcode - probe_barcodes : np.ndarray - barcode values on the probe_line. One per barcode - acq_start_index : int - sample index of probe acquisition start time - local_probe_rate : float - the probe's apparent sampling rate - - - Returns - ------- - total_time_shift : float - Time at which the probe started acquisition, assessed on - the master clock. If < 0, the probe started earlier than the master line. - probe_rate : float - The probe's sampling rate, assessed on the master clock - master_endpoints : iterable - Defines the start and end times of the sync interval on the master clock - - """ - - probe_endpoints, master_endpoints = match_barcodes( - master_times, master_barcodes, probe_times, probe_barcodes - ) - rate_scale, time_offset = linear_transform_from_intervals( - master_endpoints, probe_endpoints - ) - - if time_offset is not None: - probe_rate = local_probe_rate * rate_scale - acq_start_time = acq_start_index / probe_rate - - total_time_shift = time_offset - acq_start_time - else: - print("Not enough barcodes...setting sampling rate to 0") - total_time_shift = 0 - probe_rate = 0 - - return total_time_shift, probe_rate, master_endpoints diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py b/allensdk/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py deleted file mode 100644 index 2f151c8807..0000000000 --- a/allensdk/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py +++ /dev/null @@ -1,70 +0,0 @@ -import warnings - -import numpy as np - -from . import barcode -from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import ( - EcephysSyncDataset, -) - - -class BarcodeSyncDataset(EcephysSyncDataset): - @property - def barcode_line(self): - """ Obtain the index of the barcode line for this dataset. - - """ - - if "barcode" in self.line_labels: - return self.line_labels.index("barcode") - elif "barcodes" in self.line_labels: - return self.line_labels.index("barcodes") - else: - raise ValueError("no barcode line found") - - def extract_barcodes(self, **barcode_kwargs): - """ Read barcodes and their times from this dataset's barcode line. - - Parameters - ---------- - **barcode_kwargs : - Will be passed to .barcode.extract_barcodes_from_times - - Returns - ------- - times : np.ndarray - The start times of each detected barcode. - codes : np.ndarray - The values of each detected barcode - - """ - - sample_freq_digital = float(self.sample_frequency) - barcode_channel = self.barcode_line - - on_events = self.get_rising_edges(barcode_channel) - off_events = self.get_falling_edges(barcode_channel) - - on_times = on_events / sample_freq_digital - off_times = off_events / sample_freq_digital - - return barcode.extract_barcodes_from_times( - on_times, off_times, **barcode_kwargs - ) - - def get_barcode_table(self, **barcode_kwargs): - """ A convenience method for getting barcode times and codes in a dictionary. - - Notes - ----- - This method is deprecated! - - """ - warnings.warn( - np.VisibleDeprecationWarning( - "This function is deprecated as unecessary (and slated for removal). Instead, simply use extract_barcodes." - ) - ) - - barcode_times, barcodes = self.extract_barcodes(**barcode_kwargs) - return {"codes": barcodes, "times": barcode_times} diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/channel_states.py b/allensdk/brain_observatory/ecephys/align_timestamps/channel_states.py deleted file mode 100644 index ce33d09e5e..0000000000 --- a/allensdk/brain_observatory/ecephys/align_timestamps/channel_states.py +++ /dev/null @@ -1,60 +0,0 @@ -import numpy as np - -from . import barcode - - -def extract_barcodes_from_states( - channel_states, timestamps, sampling_rate, **barcode_kwargs -): - """Obtain barcodes from timestamped rising/falling edges. - - Parameters - ---------- - channel_states : numpy.ndarray - Rising and falling edges, denoted 1 and -1 - timestamps : numpy.ndarray - Sample index of each event. - sampling_rate : numeric - Samples / second - **barcode_kwargs : - Additional parameters describing the barcodes. - - - """ - - on_events = np.where(channel_states == 1) - off_events = np.where(channel_states == -1) - - T_on = timestamps[on_events] / float(sampling_rate) - T_off = timestamps[off_events] / float(sampling_rate) - - return barcode.extract_barcodes_from_times(T_on, T_off, **barcode_kwargs) - - -def extract_splits_from_states( - channel_states, timestamps, sampling_rate, **barcode_kwargs -): - """Obtain barcodes from timestamped rising/falling edges. - - Parameters - ---------- - channel_states : numpy.ndarray - Rising and falling edges, denoted 1 and -1 - timestamps : numpy.ndarray - Sample index of each event. - sampling_rate : numeric - Samples / second - **barcode_kwargs : - Additional parameters describing the barcodes. - - - """ - - split_events = np.where(channel_states == 0) - - T_split = timestamps[split_events] / float(sampling_rate) - - if len(T_split) == 0: - T_split = np.array([0]) - - return T_split diff --git a/allensdk/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py b/allensdk/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py deleted file mode 100644 index a624e94863..0000000000 --- a/allensdk/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py +++ /dev/null @@ -1,164 +0,0 @@ -from . import barcode - -import numpy as np - - -class ProbeSynchronizer(object): - @property - def sampling_rate_scale(self): - """ The ratio of the probe's sampling rate assessed on the global clock to the - probe's locally assessed sampling rate. - """ - - return self.global_probe_sampling_rate / self.local_probe_sampling_rate - - def __init__( - self, - global_probe_sampling_rate, - local_probe_sampling_rate, - total_time_shift, - min_time, - max_time, - ): - """Converts probe sample indices to master clock times. - - Parameters - ---------- - global_probe_sampling_rate : float - The sampling rate of the probe (Hz) assessed on the master clock. - local_probe_sampling_rate : float - The sampling rate of the probe (Hz) assessed on the probe clock. - total_time_shift : float - Offset (s) from probe to master times. - min_time : float - minimum time for this synchronizer - max_time : float - maximum time for this synchronizer - - """ - - self.global_probe_sampling_rate = global_probe_sampling_rate - self.local_probe_sampling_rate = local_probe_sampling_rate - self.total_time_shift = total_time_shift - self.min_time = min_time - self.max_time = max_time - - def __call__(self, samples, sync_condition="master"): - """Applies a computed transform to input probe sample indices. - - Parameters - ---------- - samples : numpy.ndarray - Array of timestamps in probe samples. - sync_condition : str, optional - How to synchronize the timestamps. Available options are: - 'master': Default, synchronize to master clock - 'probe': adjust probe samples -> probe times - - Returns - ------- - numpy.ndarray : - Sample timestamps in seconds on the master (default) or probe clock. - - """ - - in_range = np.where( - ((samples / self.local_probe_sampling_rate) >= self.min_time) - * ((samples / self.local_probe_sampling_rate) < self.max_time) - )[0] - - if self.global_probe_sampling_rate > 0: - - if sync_condition == "probe": - samples[in_range] = samples[in_range] / self.local_probe_sampling_rate - - elif sync_condition == "master": - samples[in_range] = ( - samples[in_range] / self.global_probe_sampling_rate - - self.total_time_shift - ) - - else: - raise ValueError( - "unrecognized sync condition: {}".format(sync_condition) - ) - - else: - samples[in_range] = -1 - - return samples - - @classmethod - def compute( - cls, - master_barcode_times, - master_barcodes, - probe_barcode_times, - probe_barcodes, - min_time, - max_time, - probe_start_index, - local_probe_sampling_rate, - ): - """Compute a transform from probe samples to master times by aligning barcodes. - - Parameters - ---------- - master_barcode_times : np.ndarray - start times of barcodes (according to the master clock) on the master line. - One per barcode. - master_barcodes : np.ndarray - barcode values on the master line. One per barcode - probe_barcode_times : np.ndarray - start times (according to the probe clock) of barcodes on the probe line. - One per barcode - probe_barcodes : np.ndarray - barcode values on the probe_line. One per barcode - min_time : Float - time (in seconds) of first barcode to align - max_time : Float - time (in seconds) of last barcode to align - probe_start_index : int - sample index of probe acquisition start time - local_probe_sampling_rate : float - the probe's apparent sampling rate - - Returns - ------- - ProbeSynchronizer : - When called, applies the transform computed here to samples on the probe clock. - - """ - - times_array = np.array(probe_barcode_times) - barcodes_array = np.array(probe_barcodes) - - ok_barcodes = np.where((times_array > min_time) * (times_array < max_time))[0] - times_to_align = list(times_array[ok_barcodes]) - barcodes_to_align = list(barcodes_array[ok_barcodes]) - - if len(barcodes_to_align) > 0: - - print("Num barcodes: " + str(len(barcodes_to_align))) - - total_time_shift, global_probe_sampling_rate, _ = barcode.get_probe_time_offset( - master_barcode_times, - master_barcodes, - times_to_align, - barcodes_to_align, - probe_start_index, - local_probe_sampling_rate, - ) - - else: - print("Not enough barcodes...setting sampling rate to 0") - total_time_shift = 0 - global_probe_sampling_rate = 0 - - return cls( - global_probe_sampling_rate, - local_probe_sampling_rate, - total_time_shift, - min_time, - max_time, - ) diff --git a/allensdk/brain_observatory/ecephys/copy_utility/README.md b/allensdk/brain_observatory/ecephys/copy_utility/README.md deleted file mode 100644 index 49fe6bd7ff..0000000000 --- a/allensdk/brain_observatory/ecephys/copy_utility/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Copy Utility -========== - -A simple utility that we use at the Allen Institute uploading data to our internal database. Basically just a wrapper around common copying utilities, but with a schema for tracking file identities and contents. \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/copy_utility/__init__.py b/allensdk/brain_observatory/ecephys/copy_utility/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/copy_utility/__main__.py b/allensdk/brain_observatory/ecephys/copy_utility/__main__.py deleted file mode 100644 index fdc59e5eaf..0000000000 --- a/allensdk/brain_observatory/ecephys/copy_utility/__main__.py +++ /dev/null @@ -1,171 +0,0 @@ -import logging -import subprocess as sp -import shutil -import warnings -import copy as cp -from pathlib import Path - -import argschema - -from allensdk.config.manifest import Manifest -from ._schemas import ( - SessionUploadInputSchema, - SessionUploadOutputSchema, - available_hashers -) - - -def hash_file(path, hasher_cls, blocks_per_chunk=128): - """ - - """ - hasher = hasher_cls() - with open(path, 'rb') as f: - # TODO: Update to new assignment syntax if drop < python 3.8 support - for chunk in iter( - lambda: f.read(hasher.block_size*blocks_per_chunk), b""): - hasher.update(chunk) - return hasher.digest() - - -def walk_fs_tree(root, fn): - root = Path(root) - fn(root) - - if root.is_dir(): - for item in root.iterdir(): - walk_fs_tree(item, fn) - - -def copy_file_entry(source, dest, use_rsync, make_parent_dirs, chmod=None): - - leftmost = None - if make_parent_dirs: - leftmost = Manifest.safe_make_parent_dirs(dest) - - if use_rsync: - sp.check_call(['rsync', '-a', source, dest]) - else: - if Path(source).is_dir(): - shutil.copytree(source, dest) - else: - shutil.copy(source, dest) - - if chmod is not None: - chmod_target = leftmost if leftmost is not None else dest - - def apply_permissions(path): - return path.chmod(int(f"0o{chmod}", 0)) - - walk_fs_tree(chmod_target, apply_permissions) - - logging.info(f"copied from {source} to {dest}") - - -def raise_or_warn(message, do_raise, typ=None): - if do_raise is False: - typ = UserWarning if typ is None else typ - warnings.warn(message, typ) - - else: - typ = ValueError if typ is None else typ - raise typ(message) - - -def compare(source, dest, hasher_cls, raise_if_comparison_fails): - source_path = Path(source) - dest_path = Path(dest) - - if source_path.is_dir() and dest_path.is_dir(): - return compare_directories( - source, dest, hasher_cls, raise_if_comparison_fails) - elif (not source_path.is_dir()) and (not dest_path.is_dir()): - return compare_files( - source, dest, hasher_cls, raise_if_comparison_fails) - else: - raise_or_warn( - f"unable to compare files with directories: {source}, {dest}", - raise_if_comparison_fails - ) - - -def compare_files(source, dest, hasher_cls, raise_if_comparison_fails): - source_hash = hash_file(source, hasher_cls) - dest_hash = hash_file(dest, hasher_cls) - - if source_hash != dest_hash: - raise_or_warn( - f"comparison of {source} and {dest} " - f"using {hasher_cls.__name__} failed", raise_if_comparison_fails) - - return source_hash, dest_hash - - -def compare_directories(source, dest, hasher_cls, raise_if_comparison_fails): - source_contents = sorted([node for node in Path(source).iterdir()]) - dest_contents = sorted([node for node in Path(dest).iterdir()]) - - if len(source_contents) != len(dest_contents): - raise_or_warn( - f"{source} contains {len(source_contents)} items " - f"while {dest} contains {len(dest_contents)} items", - raise_if_comparison_fails - ) - - for sitem, ditem in zip(source_contents, dest_contents): - spath = str(Path(source, sitem)) - dpath = str(Path(dest, ditem)) - - if sitem != ditem: - raise_or_warn( - f"mismatch between {spath} and {dpath}", - raise_if_comparison_fails - ) - compare(spath, dpath, hasher_cls, raise_if_comparison_fails) - - -def main( - files, - use_rsync=True, - hasher_key=None, - raise_if_comparison_fails=True, - make_parent_dirs=True, - chmod=775, - **kwargs -): - hasher_cls = available_hashers[hasher_key] - output = [] - - for file_entry in files: - record = cp.deepcopy(file_entry) - - copy_file_entry( - file_entry['source'], file_entry['destination'], - use_rsync, make_parent_dirs, chmod=chmod - ) - - if hasher_cls is not None: - hashes = compare( - file_entry['source'], file_entry['destination'], - hasher_cls, raise_if_comparison_fails - ) - if hashes is not None: - record['source_hash'] = [int(ii) for ii in hashes[0]] - record['destination_hash'] = [int(ii) for ii in hashes[1]] - - output.append(record) - - return {'files': output} - - -if __name__ == '__main__': - logging.basicConfig( - format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') - - parser = argschema.ArgSchemaParser( - schema_type=SessionUploadInputSchema, - output_schema_type=SessionUploadOutputSchema, - ) - - output = main(**parser.args) - parser.output(output, indent=2) diff --git a/allensdk/brain_observatory/ecephys/copy_utility/_schemas.py b/allensdk/brain_observatory/ecephys/copy_utility/_schemas.py deleted file mode 100644 index ea3c7f7c14..0000000000 --- a/allensdk/brain_observatory/ecephys/copy_utility/_schemas.py +++ /dev/null @@ -1,74 +0,0 @@ -import hashlib -from argschema import ArgSchema -from argschema.fields import ( - LogLevel, String, Int, Nested, Boolean, List, InputFile) -from argschema.schemas import DefaultSchema - - -available_hashers = { - 'sha3_256': hashlib.sha3_256, - 'sha256': hashlib.sha256, - None: None -} - - -class FileExists(InputFile): - pass - - -class FileToCopy(DefaultSchema): - source = InputFile( - required=True, - description='copy from here') - destination = String( - required=True, - description='copy to here (full path, not just directory!)') - key = String(required=True, - description='will be passed through to outputs, allowing a ' - 'name or kind to be associated with this file') - - -class CopiedFile(DefaultSchema): - source = InputFile(required=True, description='copied from here') - destination = FileExists(required=True, description='copied to here') - key = String(required=False, description='passed from inputs') - source_hash = List(Int, - required=False) # int array vs bytes for JSONability - destination_hash = List(Int, required=False) - - -class NonFileParameters(DefaultSchema): - use_rsync = Boolean(default=True, - description='copy files using rsync rather than ' - 'shutil (this is not likely to work if ' - 'you are running windows!)' - ) - hasher_key = String(default='sha256', - validate=lambda st: st in available_hashers, - allow_none=True, - description='select a hash function to compute over ' - 'base64-encoded pre- and post-copy files' - ) - raise_if_comparison_fails = Boolean(default=True, - description='if a hash comparison ' - 'fails, throw an error (' - 'vs. a warning)') - make_parent_dirs = Boolean(default=True, - description='build missing parent directories ' - 'for destination') - chmod = Int(default=775, - description="destination files (and any created parents will " - "have these permissions") - - -class SessionUploadInputSchema(ArgSchema, NonFileParameters): - log_level = LogLevel(default='INFO', - description='set the logging level of the module') - files = Nested(FileToCopy, many=True, required=True, - description='files to be copied') - - -class SessionUploadOutputSchema(DefaultSchema): - input_parameters = Nested(NonFileParameters) - files = Nested(CopiedFile, many=True, required=True, - description='copied files') diff --git a/allensdk/brain_observatory/ecephys/current_source_density/README.md b/allensdk/brain_observatory/ecephys/current_source_density/README.md deleted file mode 100644 index 119274815a..0000000000 --- a/allensdk/brain_observatory/ecephys/current_source_density/README.md +++ /dev/null @@ -1,52 +0,0 @@ -Current Source Density -====================== -Computes the current source density for one or more probes - - -Running -------- -You can run this module from an input json: -``` -python -m allensdk.brain_observatory.ecephys.current_source_density --input_json <path to input json> --output_json <path to output json> -``` -If you are on the Allen Institute's network, you can also run the module from information in our LIMS: -``` -python -m allensdk.brain_observatory.ecephys.current_source_density --source lims --session_id <id of an ecephys_session> --output_root <path to output data directory> --output_json <path to output json> -``` - - -Input data ----------- -This module takes in an array of LFP samples and their associated timestamps for each probe. The CSD is calculated for some window in time around the onset of a stimulus. The window, as well as the stimulus, need to be specified. The stimulus table is required in order to determine when these stimulus onsets occured. See the schema file for detailed information on the module inputs. - - -Processing steps ----------------- - -For each neuropixels probe, the following steps are performed to compute CSD -for a window in time around stimuli onset: - -1) Trial events are analyzed to create an array of timestamps surrounding stimuli onset. - -2) LFP data is loaded. - -3) Temporal slices of LFP data are extracted for times surrounding stimuli onset. (Using time windows from step 1.) - -4) Reference and noisy probe channels are removed from temporally sliced LFP data. - -5) Each remaining channel in LFP data is bandpass filtered. - -6) Cleaned and filtered LFP data is interpolated to new virtual locations along -the center of the probe to account for the staggered physical layout -of real channels. - -7) LFP data is averaged across trials. - -8) CSD is calculated using the numerical approximation to the Laplacian, after Pitts (1952). - - -Output data ------------ -- a (channels X samples) npy file containing CSD data -- a 1D npy file defining sample timestamps in seconds relative to stimulus onset -- in the output json, an array of channel ids identifying the channels at each row in the csd data file diff --git a/allensdk/brain_observatory/ecephys/current_source_density/__init__.py b/allensdk/brain_observatory/ecephys/current_source_density/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/current_source_density/__main__.py b/allensdk/brain_observatory/ecephys/current_source_density/__main__.py deleted file mode 100644 index 1d6eef4f3b..0000000000 --- a/allensdk/brain_observatory/ecephys/current_source_density/__main__.py +++ /dev/null @@ -1,188 +0,0 @@ -import numpy as np -import requests -import logging -import sys - -import os -import pandas as pd -import h5py - -from pathlib import Path - -from typing import Optional - -from ._schemas import InputParameters, OutputParameters -from ._current_source_density import ( - accumulate_lfp_data, - compute_csd, - extract_trial_windows -) -from ._filter_utils import filter_lfp_channels, select_good_channels -from ._interpolation_utils import ( - interp_channel_locs, - make_actual_channel_locations, - make_interp_channel_locations -) -from allensdk.brain_observatory.ecephys.file_io.continuous_file import ( - ContinuousFile -) -from allensdk.brain_observatory.argschema_utilities import ( - write_or_print_outputs, optional_lims_inputs -) - - -def get_inputs_from_lims(args) -> dict: - - session_id = args.session_id - output_root = args.output_root - host = args.host - - request_str = ''.join(''' - {}/input_jsons? - strategy_class=EcephysCurrentSourceDensityStrategy& - object_id={}& - object_class=EcephysSession& - job_queue_name=ECEPHYS_CURRENT_SOURCE_DENSITY_QUEUE - '''.format(host, session_id).split()) - - response = requests.get(request_str) - data = response.json() - - if data['num_trials'] == 'null': - data['num_trials'] = None - else: - data['num_trials'] = int(data['num_trials']) - - data['pre_stimulus_time'] = float(data['pre_stimulus_time']) - data['post_stimulus_time'] = float(data['post_stimulus_time']) - data['surface_channel_adjustment'] = int(data['surface_channel_adjustment']) - - for probe in data['probes']: - probe['surface_channel_adjustment'] = int(probe['surface_channel_adjustment']) - probe['csd_output_path'] = os.path.join(output_root, os.path.split(probe['csd_output_path'])[-1]) - probe['phase'] = str(probe['phase']) - - return data - - -def run_csd(args: dict) -> dict: - - stimulus_table = pd.read_csv(args['stimulus']['stimulus_table_path']) - - probewise_outputs = [] - for probe_idx, probe in enumerate(args['probes']): - logging.info('Processing probe: {} (index: {})'.format(probe['name'], - probe_idx)) - - time_step = 1.0 / probe['sampling_rate'] - logging.info('Calculated time step: {}'.format(time_step)) - - logging.info('Extracting trial windows') - trial_windows, relative_window = extract_trial_windows( - stimulus_table=stimulus_table, - stimulus_name=args['stimulus']['key'], - time_step=time_step, - pre_stimulus_time=args['pre_stimulus_time'], - post_stimulus_time=args['post_stimulus_time'], - num_trials=args['num_trials'], - stimulus_index=args['stimulus']['index'] - ) - - logging.info('Loading LFP data') - lfp_data_file = ContinuousFile(probe['lfp_data_path'], - probe['lfp_timestamps_path'], - probe['total_channels']) - lfp_raw, timestamps = lfp_data_file.load(memmap=args['memmap'], - memmap_thresh=args['memmap_thresh']) - - if probe['phase'].lower() == '3a': - lfp_channels = lfp_data_file.get_lfp_channel_order() - else: - lfp_channels = np.arange(0, probe['total_channels']) - - logging.info('Accumulating LFP data') - accumulated_lfp_data = accumulate_lfp_data(timestamps=timestamps, - lfp_raw=lfp_raw, - lfp_channels=lfp_channels, - trial_windows=trial_windows, - volts_per_bit=args['volts_per_bit']) - - logging.info('Removing noisy and reference channels') - clean_lfp, clean_channels = select_good_channels(lfp=accumulated_lfp_data, - reference_channels=probe['reference_channels'], - noisy_channel_threshold=args['noisy_channel_threshold']) - - logging.info('Bandpass filtering LFP channel data') - filt_lfp = filter_lfp_channels(lfp=clean_lfp, - sampling_rate=probe['sampling_rate'], - filter_cuts=args['filter_cuts'], - filter_order=args['filter_order']) - - logging.info('Interpolating LFP channel locations') - actual_locs = make_actual_channel_locations(0, accumulated_lfp_data.shape[1]) - clean_actual_locs = actual_locs[clean_channels, :] - interp_locs = make_interp_channel_locations(0, accumulated_lfp_data.shape[1]) - interp_lfp, spacing = interp_channel_locs(lfp=filt_lfp, - actual_locs=clean_actual_locs, - interp_locs=interp_locs) - - logging.info('Averaging LFPs over trials') - trial_mean_lfp = np.nanmean(interp_lfp, axis=0) - - logging.info('Computing CSD') - current_source_density, csd_channels = compute_csd(trial_mean_lfp=trial_mean_lfp, - spacing=spacing) - - logging.info('Saving data') - write_csd_to_h5( - path=probe["csd_output_path"], - csd=current_source_density, - relative_window=relative_window, - channels=csd_channels, - csd_locations=interp_locs, - stimulus_name=args['stimulus']['key'], - stimulus_index=args["stimulus"]["index"], - num_trials=args["num_trials"] - ) - - probewise_outputs.append({ - 'name': probe['name'], - 'csd_path': probe['csd_output_path'], - }) - - return { - 'probe_outputs': probewise_outputs, - } - - -def write_csd_to_h5(path: Path, csd: np.ndarray, relative_window, - channels: np.ndarray, csd_locations: np.ndarray, - stimulus_name: str, stimulus_index: Optional[int], - num_trials: Optional[int]): - with h5py.File(str(path), "w") as output: - output.create_dataset("current_source_density", data=csd) - output.create_dataset("timestamps", data=relative_window) - output.create_dataset("channels", data=channels) - output.create_dataset("csd_locations", data=csd_locations) - - output.attrs["stimulus_name"] = str(stimulus_name) - - if num_trials is not None: - output.attrs["num_trials"] = int(num_trials) - - if stimulus_index is not None: - output.attrs["stimulus_index"] = int(stimulus_index) - - -def main(): - - logging.basicConfig(format=('%(asctime)s:%(funcName)s' - ':%(levelname)s:%(message)s')) - parser = optional_lims_inputs(sys.argv, InputParameters, - OutputParameters, get_inputs_from_lims) - output = run_csd(parser.args) - write_or_print_outputs(output, parser) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/ecephys/current_source_density/_current_source_density.py b/allensdk/brain_observatory/ecephys/current_source_density/_current_source_density.py deleted file mode 100644 index c80f6b019e..0000000000 --- a/allensdk/brain_observatory/ecephys/current_source_density/_current_source_density.py +++ /dev/null @@ -1,182 +0,0 @@ -import logging - -import numpy as np -import pandas as pd - -from typing import Callable, List, Optional, Tuple - -from ._interpolation_utils import regular_grid_extractor_factory - - -def extract_trial_windows( - stimulus_table: pd.DataFrame, stimulus_name: str, - time_step: float, pre_stimulus_time: float, post_stimulus_time: float, - num_trials: Optional[int] = None, - stimulus_index: Optional[int] = None, - name_field: str = 'stimulus_name', index_field: str = 'stimulus_index', - start_field: str = 'Start', end_field: str = 'End' -) -> Tuple[List[np.ndarray], np.ndarray]: - '''Obtains time interval surrounding stimulus sweep onsets - - Parameters - ---------- - stimulus_table : pandas.DataFrame - Each row is a stimulus sweep. Columns report stimulus name and - parameters for that sweep, as well as its start and end times. - stimulus_name : str - Obtain sweeps from stimuli with this name - (identifies the kind of stimulus presented). - stimulus_index : Optional[int], optional - Obtain sweeps from stimuli with this index - (used to disambiguate presentations of stimuli with the same name), - by default None. - time_step : float - Specifies the step of the resulting temporal domain (seconds). - pre_stimulus_time : float - How far before stimulus onset to begin the temporal domain (seconds). - post_stimulus_time : float - How far after stimulus onset to end the temporal domain - (exclusive, seconds). - num_trials : Optional[int], optional - A window will be computed for this many sweeps, by default None - name_field : str, optional - Column from which to extract stimulus name, by default 'stimulus_name' - index_field : str, optional - Column from which to extract stimulus index, - by default 'stimulus_index' - start_field : str, optional - Column from which to extract start times, by default 'Start' - end_field : str, optional - Column from which to extract end times, by default 'End' - - Returns - ------- - Tuple[trial_windows, relative_times] - trial_windows : List[numpy.ndarray] - For each trial, an array of timestamps surrounding that - trial's onset. - relative_times : numpy.ndarray - The basic time domain, centered on 0. - ''' - - if stimulus_index is None: - stimulus_index = np.amin(stimulus_table[stimulus_table[name_field] - == stimulus_name][index_field].values) - - stimulus_name_mask = (stimulus_table[name_field] == stimulus_name) - stimulus_index_mask = (stimulus_table[index_field] == stimulus_index) - trials = stimulus_table[stimulus_name_mask & stimulus_index_mask] - - if num_trials is not None: - trials = trials.iloc[:num_trials, :] - trials = trials.to_dict('record') - - relative_times = np.arange(-pre_stimulus_time, - post_stimulus_time, - time_step) - trial_windows = [relative_times + trial[start_field] for trial in trials] - - msg = 'calculated relative timestamps: {} ({} timestamps per trial)' - logging.info(msg.format(relative_times, len(relative_times))) - msg = 'setup {} trial windows spanning {} to {}' - logging.info(msg.format(len(trial_windows), - trial_windows[0][0], - trial_windows[-1][-1])) - return (trial_windows, relative_times) - - -def accumulate_lfp_data(timestamps: np.ndarray, lfp_raw: np.ndarray, - lfp_channels: np.ndarray, - trial_windows: List[np.ndarray], - volts_per_bit: float = 1.0, - extractor_factory: Callable = ( - regular_grid_extractor_factory) - ) -> np.ndarray: - ''' Extracts slices of LFP data at defined channels and times. - - Parameters - ---------- - timestamps : numpy.ndarray - Associates LFP sample indices with times in seconds. - lfp_raw : numpy.ndarray - Dimensions are samples X channels. - lfp_channels : numpy.ndarray - Indices of channels to be used in accumulation - trial_windows : List[numpy.ndarray] - Each window is a list of times from which LFP data will be extracted. - volts_per_bit: float, optional - Scaling factor for raw integers into microvolts, defaults to 1.0 - (no conversion) - extractor_factory: Callable - The LFP extractor function to use, defaults to - regular_grid_extractor_factory - - Returns - ------- - accumulated : numpy.ndarray - Extracted data. Dimensions are trials X channels X samples - - ''' - - num_samples = min(len(tw) for tw in trial_windows) - num_trials = len(trial_windows) - num_channels = len(lfp_channels) - - accumulated = np.zeros((num_trials, num_channels, num_samples), - dtype=lfp_raw.dtype) - - for channel_idx, chan in enumerate(lfp_channels): - logging.info('extracting lfp for channel {}'.format(chan)) - extractor = extractor_factory(timestamps, lfp_raw, chan) - - for trial_index, trial_window in enumerate(trial_windows): - current = extractor(trial_window)[:num_samples] - - if np.issubdtype(accumulated.dtype, np.integer): - current = np.around(current).astype(accumulated.dtype) - accumulated[trial_index, channel_idx, :] = current - - msg = 'extracted lfp data for {} trials, {} channels, and {} samples' - logging.info(msg.format(*accumulated.shape)) - return accumulated * volts_per_bit - - -def compute_csd(trial_mean_lfp: np.ndarray, - spacing: float) -> Tuple[np.ndarray, np.ndarray]: - '''Compute current source density for real or virtual channels from - a neuropixels probe. - - Compute a second spatial derivative along the probe length - as a 1D approximation of the Laplacian, after Pitts (1952). - - Parameters - ---------- - trial_mean_lfp: numpy.ndarray - LFP traces surrounding presentation of a common stimulus that - have been averaged over trials. Dimensions are channels X time samples. - spacing : float - Distance between channels, in millimeters. This spacing may be - physical distances between channels or a virtual distance if channels - have been interpolated to new virtual positions. - - Returns - ------- - Tuple[csd, csd_channels]: - csd : numpy.ndarray - Current source density. Dimensions are channels X time samples. - csd_channels: numpy.ndarray - Array of channel indices for CSD. - ''' - - # Need to pad lfp channels for Laplacian approx. - padded_lfp = np.pad(trial_mean_lfp, - pad_width=((1, 1), (0, 0)), - mode='edge') - - csd = (1 / (spacing ** 2)) * (padded_lfp[2:, :] - - (2 * padded_lfp[1:-1, :]) - + padded_lfp[:-2, :]) - - csd_channels = np.arange(0, trial_mean_lfp.shape[0]) - - return (csd, csd_channels) diff --git a/allensdk/brain_observatory/ecephys/current_source_density/_filter_utils.py b/allensdk/brain_observatory/ecephys/current_source_density/_filter_utils.py deleted file mode 100644 index 262422cd64..0000000000 --- a/allensdk/brain_observatory/ecephys/current_source_density/_filter_utils.py +++ /dev/null @@ -1,74 +0,0 @@ -from typing import List, Tuple -import numpy as np - -from scipy import signal - - -def select_good_channels(lfp: np.ndarray, - reference_channels: List[int], - noisy_channel_threshold: float - ) -> Tuple[np.ndarray, np.ndarray]: - """Remove reference channels and channels that are too noisy from lfp data. - - Parameters - ---------- - lfp : numpy.ndarray - LFP data in the form of: trials x channels x time samples - reference_channels : List[int] - Reference channel indices for this probe. - noisy_channel_threshold : float - Lowest mean standard deviation that constitutes a "clean" LFP channel - - Returns - ------- - Tuple[cleaned_lfp, good_indices] - cleaned_lfp: numpy.ndarray - LFP where reference and noisy channels have been removed. - Data still in form of: trials x channel x time samples - good_indices: numpy.ndarray - Array of channel indices that are neither reference nor noisy. - """ - channel_variance = np.mean(np.std(lfp, 2), 0) - noisy_channels = np.where(channel_variance > noisy_channel_threshold)[0] - - to_remove = np.concatenate((np.array(reference_channels), noisy_channels)) - good_indices = np.delete(np.arange(0, lfp.shape[1]), to_remove) - - # Remove noisy or reference channels (axis=1) - cleaned_lfp = np.delete(lfp, to_remove, axis=1) - - return (cleaned_lfp, good_indices) - - -def filter_lfp_channels(lfp: np.ndarray, - sampling_rate: float, - filter_cuts: List[float], - filter_order: int) -> np.ndarray: - '''Bandpass filter lfp channel data. - - Parameters - ---------- - lfp : numpy.ndarray - LFP data to be filtered in the form of: - trials x channels x time samples - sampling_rate : float - Sampling rate for lfp data - filter_cuts : List[float] - Low and high cut for bandpass filter - filter_order : int - Order for bandpass filter - - Returns - ------- - filtered_lfp: numpy.ndarray - LFP that has been bandpassed filtered along the sample axis. - Still in the form of: trials x channels x time samples - ''' - - wn = (sampling_rate / 2) - filter_cutoffs = np.array(filter_cuts) / wn - b, a = signal.butter(filter_order, filter_cutoffs, 'bandpass') - # Bandpass filter time samples (axis=2) - filtered_lfp = signal.filtfilt(b, a, lfp, axis=2) - - return filtered_lfp diff --git a/allensdk/brain_observatory/ecephys/current_source_density/_interpolation_utils.py b/allensdk/brain_observatory/ecephys/current_source_density/_interpolation_utils.py deleted file mode 100644 index 6f6545af49..0000000000 --- a/allensdk/brain_observatory/ecephys/current_source_density/_interpolation_utils.py +++ /dev/null @@ -1,175 +0,0 @@ -from typing import Tuple - -import numpy as np - -from scipy.interpolate import RegularGridInterpolator, griddata - - -def regular_grid_extractor_factory(timestamps: np.ndarray, - lfp_raw: np.ndarray, - channel: int, - method: str = 'linear') -> np.ndarray: - '''Builds an LFP data extractor using interpolation on a regular grid - - Ignores timestamps less than zero (which result from unaligned - data segments) - - Parameters - ---------- - timestamps : numpy.ndarray - Associates LFP sample indices with times in seconds. - lfp_raw : numpy.ndarray - Dimensions are samples X channels. - channel : int - Index of channel to interpolate to regular grid. - method : str, optional - Interpolation method ['linear', 'cubic', 'nearest'], - by default 'linear'. - - Returns - ------- - numpy.ndarray - LFP data that has been interpolated to a regular grid. - ''' - - valid_timestamps = (timestamps >= 0) - - return RegularGridInterpolator((timestamps[valid_timestamps],), - lfp_raw[valid_timestamps, channel], - method=method, - bounds_error=False, - fill_value=np.nan) - - -def make_actual_channel_locations(min_chan: int = 0, - max_chan: int = 384) -> np.ndarray: - '''Generate x/y locations of Neuropixels recording sites. - - 0 8 16 24 32 40 48 - 60 * - - - * - - - 50 - - - - - - - - 40 - - * - - - * <-- actual recording site (*) - 30 - - - - - - - - 20 * - - - * - - - 10 - - - - - - - - 0 - - * - - - * - - Parameters - ---------- - min_chan : int, optional - Lowest channel number to use, by default 0 - max_chan : int, optional - Highest channel number to use, by default 384 - - Returns - ------- - actual_channel_locations: numpy.ndarray - column 1 = x positions in microns - column 2 = y positions in microns - ''' - - actual_channel_locations = np.zeros((max_chan, 2)) - - x_locations = [16, 48, 0, 32] - - for ch in range(min_chan, max_chan): - actual_channel_locations[ch, 0] = x_locations[ch % 4] - actual_channel_locations[ch, 1] = np.floor(ch / 2) * 20 - - return actual_channel_locations[min_chan:, :] - - -def make_interp_channel_locations(min_chan: int = 0, - max_chan: int = 384) -> np.ndarray: - '''Generate x/y locations for interpolated Neuropixels recording sites. - - This version just returns the central column of interpolated sites. - - 0 8 16 24 32 40 48 - 60 * - - o * - - - 50 - - - o - - - - 40 - - * o - - * <-- actual recording site (*) - 30 - - - o - - - - 20 * - - o * - - - 10 - - - o - - - - 0 - - * o - - * - ^ - interpolated column sites (o) - - Parameters - ---------- - min_chan : int, optional - Lowest channel number to use, by default 0 - max_chan : int, optional - Highest channel number to use, by default 384 - - Returns - ------- - interp_channel_locations: numpy.ndarray - column 1 = interpolated x positions in microns - column 2 = y positions in microns - ''' - - interp_channel_locations = np.zeros((max_chan, 2)) - - for ch in range(min_chan, max_chan): - interp_channel_locations[ch, 0] = 24 - interp_channel_locations[ch, 1] = ch * 10 - - return interp_channel_locations[min_chan:, :] - - -def interp_channel_locs(lfp: np.ndarray, - actual_locs: np.ndarray, - interp_locs: np.ndarray, - method: str = 'cubic') -> Tuple[np.ndarray, float]: - '''Interpolates single-trial lfp channel locations to account for - channel stagger. - - Parameters - ---------- - lfp : numpy.ndarray - LFP data in the form of: trials x channels x time samples - actual_locs: numpy.ndarray - An array of actual x, y locations for all channels in lfp. The - number of actual_locs should equal the number of channels in the 'lfp'. - interp_locs: numpy.ndarray - An array of virtual x, y locations for where channels in lfp - should be interpolated to. - - method : str, optional - Interpolation method ['cubic', 'linear', 'nearest'], by default 'cubic' - - Returns - ------- - Tuple[interp_lfp, spacing] - interp_lfp: numpy.ndarray - Channel location interpolated lfp data in the form of: - trials x channels x time samples - spacing: float - Distance between new interpolated virtual channel sites - (in millimeters) - ''' - - if lfp.shape[1] != actual_locs.shape[0]: - e_msg = (f"Number of 'lfp' channels ({lfp.shape[1]}) does not " - f"match number of 'actual_locs' ({actual_locs.shape[0]})!") - raise RuntimeError(e_msg) - - spacing = np.mean(np.diff(interp_locs[:, 1])) / 1000 - - interp_lfp = np.zeros((lfp.shape[0], # number of interp trials - interp_locs.shape[0], # number of interp channels - lfp.shape[2])) # number of interp samples - - for trial in range(lfp.shape[0]): # trials - trial_data = lfp[trial, :, :] - for t in range(0, lfp.shape[2]): # time samples - interp_lfp[trial, :, t] = griddata(points=actual_locs, - values=trial_data[:, t], - xi=interp_locs, - method=method, - fill_value=0, - rescale=False) - - return (interp_lfp, spacing) diff --git a/allensdk/brain_observatory/ecephys/current_source_density/_schemas.py b/allensdk/brain_observatory/ecephys/current_source_density/_schemas.py deleted file mode 100644 index 6d5c0b0bc0..0000000000 --- a/allensdk/brain_observatory/ecephys/current_source_density/_schemas.py +++ /dev/null @@ -1,103 +0,0 @@ -import numpy as np -from argschema import ArgSchema -from argschema.fields import Nested, String, Float, Int, List, Bool -from argschema.schemas import DefaultSchema - - -class ProbeInputParameters(DefaultSchema): - name = String(required=True, help='Identifier for this probe.') - lfp_data_path = String(required=True, - help='Path to lfp data for this probe') - lfp_timestamps_path = String(required=True, - help="Path to aligned lfp timestamps for " - "this probe.") - surface_channel = Int(required=True, - help='Estimate of surface (pia boundary) channel ' - 'index') - reference_channels = List(Int, many=True, - help='Indices of reference channels for this ' - 'probe') - csd_output_path = String(required=True, - help='CSD output will be written here.') - sampling_rate = Float(required=True, - help='sampling rate assessed on master clock') - total_channels = Int(default=384, - help='Total channel count for this probe.') - surface_channel_adjustment = Int(default=40, - help='Erring up in the surface channel ' - 'estimate is less dangerous for ' - 'the CSD calculation than erring ' - 'down, so an adjustment is ' - 'provided.') - spacing = Float(default=0.04, - help='distance (in millimiters) between ' - 'lengthwise-adjacent rows of recording sites on ' - 'this probe.') - phase = String(required=True, - help='The probe type (3a or PXI) which determines if ' - 'channels need to be reordered') - - -class StimulusInputParameters(DefaultSchema): - stimulus_table_path = String(required=True, help='Path to stimulus table') - key = String(required=True, - help='CSD is calculated from a specific stimulus, defined (' - 'in part) by this key.') - index = Int(default=None, allow_none=True, - help='CSD is calculated from a specific stimulus, defined (' - 'in part) by this index.') - - -class InputParameters(ArgSchema): - stimulus = Nested(StimulusInputParameters, required=True, - help='Defines the stimulus from which CSD is calculated') - probes = Nested(ProbeInputParameters, many=True, required=True, - help='Probewise parameters.') - pre_stimulus_time = Float(required=True, - help='how much time pre stimulus onset is used ' - 'for CSD calculation ') - post_stimulus_time = Float(required=True, - help='how much time post stimulus onset is ' - 'used for CSD calculation ') - num_trials = Int(default=None, allow_none=True, - help='Number of trials after stimulus onset from which ' - 'to compute CSD') - volts_per_bit = Float(default=1.0, - help='If the data are not in units of volts, ' - 'they must be converted. In the past, ' - 'this value was 0.195') - memmap = Bool(default=False, - help='whether to memory map the data file on disk or load ' - 'it directly to main memory') - memmap_thresh = Float(default=np.inf, - help='files larger than this threshold (bytes) ' - 'will be memmapped, regardless of the memmap ' - 'setting.') - filter_cuts = List(Float, default=[5.0, 150.0], - cli_as_single_argument=True, - help='Cutoff frequencies for bandpass filter') - filter_order = Int(default=5, help='Order for bandpass filter') - reorder_channels = Bool(default=True, - help='Determines whether LFP channels should be ' - 're-ordered') - noisy_channel_threshold = Float(default=1500.0, - help='Threshold for removing noisy ' - 'channels from analysis') - - -class ProbeOutputParameters(DefaultSchema): - name = String(required=True, help='Identifier for this probe.') - csd_path = String(required=True, - help='Path to current source density file.') - - -class OutputSchema(DefaultSchema): - input_parameters = Nested(InputParameters, - description=("Input parameters the module " - "was run with"), - required=True) - - -class OutputParameters(OutputSchema): - probe_outputs = Nested(ProbeOutputParameters, many=True, required=True, - help='probewise outputs') diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/__init__.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/__init__.py deleted file mode 100644 index 72a218f380..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .ecephys_project_api import EcephysProjectApi -from .ecephys_project_lims_api import EcephysProjectLimsApi -from .ecephys_project_warehouse_api import EcephysProjectWarehouseApi -from .ecephys_project_fixed_api import EcephysProjectFixedApi, MissingDataError diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py deleted file mode 100644 index 6db0e473d3..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py +++ /dev/null @@ -1,71 +0,0 @@ -from typing import Optional, TypeVar, Iterable - -import numpy as np -import pandas as pd - - -# TODO: This should be a generic over the type of the values, but there is not -# good support currently for numpy and pandas type annotations -# we should investigate numpy and pandas typing support and migrate -# https://github.com/numpy/numpy-stubs -# https://github.com/pandas-dev/pandas/blob/master/pandas/_typing.py -ArrayLike = TypeVar("ArrayLike", list, np.ndarray, pd.Series, tuple) - - -class EcephysProjectApi: - def get_sessions( - self, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ): - raise NotImplementedError() - - def get_session_data(self, session_id: int) -> Iterable: - raise NotImplementedError() - - def get_isi_experiments(self, *args, **kwargs): - raise NotImplementedError() - - def get_units( - self, - unit_ids: Optional[ArrayLike] = None, - channel_ids: Optional[ArrayLike] = None, - probe_ids: Optional[ArrayLike] = None, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ): - raise NotImplementedError() - - def get_channels( - self, - channel_ids: Optional[ArrayLike] = None, - probe_ids: Optional[ArrayLike] = None, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ): - raise NotImplementedError() - - def get_probes( - self, - probe_ids: Optional[ArrayLike] = None, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ): - raise NotImplementedError() - - def get_probe_lfp_data(self, probe_id: int) -> Iterable: - raise NotImplementedError() - - def get_natural_movie_template(self, number) -> Iterable: - raise NotImplementedError() - - def get_natural_scene_template(self, number) -> Iterable: - raise NotImplementedError() - - def get_unit_analysis_metrics( - self, - unit_ids: Optional[ArrayLike] = None, - ecephys_session_ids: Optional[ArrayLike] = None, - session_types: Optional[ArrayLike] = None - ) -> pd.DataFrame: - raise NotImplementedError() \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py deleted file mode 100644 index 9e7431c995..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py +++ /dev/null @@ -1,38 +0,0 @@ -from allensdk.brain_observatory.ecephys.ecephys_project_api import EcephysProjectApi - - -class MissingDataError(ValueError): - pass - - -class EcephysProjectFixedApi(EcephysProjectApi): - - def get_session_data(self, session_id, *args, **kwargs): - raise MissingDataError(f"data for session {session_id} not found!") - - def get_probe_lfp_data(self, probe_id, *args, **kwargs): - raise MissingDataError(f"lfp data for probe {probe_id} not found!") - - def get_sessions(self, *args, **kwargs): - raise MissingDataError(f"Data not found!") - - def get_targeted_regions(self, *args, **kwargs): - raise MissingDataError(f"Data not found!") - - def get_isi_experiments(self, *args, **kwargs): - raise MissingDataError(f"Data not found!") - - def get_units(self, *args, **kwargs): - raise MissingDataError(f"Data not found!") - - def get_channels(self, *args, **kwargs): - raise MissingDataError(f"Data not found!") - - def get_probes(self, *args, **kwargs): - raise MissingDataError(f"Data not found!") - - def get_natural_movie_template(self, number, *args, **kwargs): - raise MissingDataError(f"natural movie template not found for movie {number}") - - def get_natural_scene_template(self, number, *args, **kwargs): - raise MissingDataError(f"natural scene template not found for scene {number}") diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py deleted file mode 100644 index 6eb6a854cf..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py +++ /dev/null @@ -1,629 +0,0 @@ -from typing import Optional, Iterable, NamedTuple - -import pandas as pd - -from .ecephys_project_api import EcephysProjectApi, ArrayLike -from .http_engine import HttpEngine, AsyncHttpEngine -from .utilities import postgres_macros, build_and_execute - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.core.authentication import credential_injector, DbCredentials -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP - - -class EcephysProjectLimsApi(EcephysProjectApi): - - STIMULUS_TEMPLATE_NAMESPACE = "brain_observatory_1.1" - - def __init__(self, postgres_engine, app_engine): - """ Downloads extracellular ephys data from the Allen Institute's - internal Laboratory Information Management System (LIMS). If you are - on our network you can use this class to get bleeding-edge data into - an EcephysProjectCache. If not, it won't work at all - - Parameters - ---------- - postgres_engine : - used for making queries against the LIMS postgres database. Must - implement: - select : takes a postgres query as a string. Returns a pandas - dataframe of results - select_one : takes a postgres query as a string. If there is - exactly one record in the response, returns that record as - a dict. Otherwise returns an empty dict. - app_engine : - used for making queries agains the lims web application. Must - implement: - stream : takes a url as a string. Returns an iterable yielding - the response body as bytes. - - Notes - ----- - You almost certainly want to construct this class by calling - EcephysProjectLimsApi.default() rather than this constructor directly. - - """ - - - self.postgres_engine = postgres_engine - self.app_engine = app_engine - - def get_session_data(self, session_id: int) -> Iterable[bytes]: - """ Download an NWB file containing detailed data for an ecephys - session. - - Parameters - ---------- - session_id : - Download an NWB file for this session - - Returns - ------- - An iterable yielding an NWB file as bytes. - - """ - - nwb_response = build_and_execute( - """ - select wkf.id, wkf.filename, wkf.storage_directory, wkf.attachable_id from well_known_files wkf - join ecephys_analysis_runs ear on ( - ear.id = wkf.attachable_id - and wkf.attachable_type = 'EcephysAnalysisRun' - ) - join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id - where ear.current - and wkft.name = 'EcephysNwb' - and ear.ecephys_session_id = {{session_id}} - """, - engine=self.postgres_engine.select, - session_id=session_id, - ) - - if nwb_response.shape[0] != 1: - raise ValueError( - f"expected exactly 1 current NWB file for session {session_id}, " - f"found {nwb_response.shape[0]}: {pd.DataFrame(nwb_response)}" - ) - - nwb_id = nwb_response.loc[0, "id"] - return self.app_engine.stream( - f"well_known_files/download/{nwb_id}?wkf_id={nwb_id}" - ) - - def get_probe_lfp_data(self, probe_id: int) -> Iterable[bytes]: - """ Download an NWB file containing detailed data for the local field - potential recorded from an ecephys probe. - - Parameters - ---------- - probe_id : - Download an NWB file for this probe's LFP - - Returns - ------- - An iterable yielding an NWB file as bytes. - - """ - - nwb_response = build_and_execute( - """ - select wkf.id from well_known_files wkf - join ecephys_analysis_run_probes earp on ( - earp.id = wkf.attachable_id - and wkf.attachable_type = 'EcephysAnalysisRunProbe' - ) - join ecephys_analysis_runs ear on ear.id = earp.ecephys_analysis_run_id - join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id - where wkft.name ~ 'EcephysLfpNwb' - and ear.current - and earp.ecephys_probe_id = {{probe_id}} - """, - engine=self.postgres_engine.select, - probe_id=probe_id - ) - - if nwb_response.shape[0] != 1: - raise ValueError( - f"expected exactly 1 current LFP NWB file for probe {probe_id}, " - f"found {nwb_response.shape[0]}: {pd.DataFrame(nwb_response)}" - ) - - nwb_id = nwb_response.loc[0, "id"] - return self.app_engine.stream( - f"well_known_files/download/{nwb_id}?wkf_id={nwb_id}" - ) - - def get_units( - self, - unit_ids: Optional[ArrayLike] = None, - channel_ids: Optional[ArrayLike] = None, - probe_ids: Optional[ArrayLike] = None, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ) -> pd.DataFrame: - """ Download a table of records describing sorted ecephys units. - - Parameters - ---------- - unit_ids : - A collection of integer identifiers for sorted ecephys units. If - provided, only return records describing these units. - channel_ids : - A collection of integer identifiers for ecephys channels. If - provided, results will be filtered to units recorded from these - channels. - probe_ids : - A collection of integer identifiers for ecephys probes. If - provided, results will be filtered to units recorded from these - probes. - session_ids : - A collection of integer identifiers for ecephys sessions. If - provided, results will be filtered to units recorded during - these sessions. - published_at : - A date (rendered as "YYYY-MM-DD"). If provided, only units - recorded during sessions published before this date will be - returned. - - Returns - ------- - a pd.DataFrame whose rows are ecephys channels. - - """ - - response = build_and_execute( - """ - {%- import 'postgres_macros' as pm -%} - {%- import 'macros' as m -%} - select - eu.id, - eu.ecephys_channel_id, - eu.quality, - eu.snr, - eu.firing_rate, - eu.isi_violations, - eu.presence_ratio, - eu.amplitude_cutoff, - eu.isolation_distance, - eu.l_ratio, - eu.d_prime, - eu.nn_hit_rate, - eu.nn_miss_rate, - eu.silhouette_score, - eu.max_drift, - eu.cumulative_drift, - eu.epoch_name_quality_metrics, - eu.epoch_name_waveform_metrics, - eu.duration, - eu.halfwidth, - eu.\"PT_ratio\", - eu.repolarization_slope, - eu.recovery_slope, - eu.amplitude, - eu.spread, - eu.velocity_above, - eu.velocity_below - from ecephys_units eu - join ecephys_channels ec on ec.id = eu.ecephys_channel_id - join ecephys_probes ep on ep.id = ec.ecephys_probe_id - join ecephys_sessions es on es.id = ep.ecephys_session_id - where - not es.habituation - and ec.valid_data - and ep.workflow_state != 'failed' - and es.workflow_state != 'failed' - {{pm.optional_not_null('es.published_at', published_at_not_null)}} - {{pm.optional_le('es.published_at', published_at)}} - {{pm.optional_contains('eu.id', unit_ids) -}} - {{pm.optional_contains('ec.id', channel_ids) -}} - {{pm.optional_contains('ep.id', probe_ids) -}} - {{pm.optional_contains('es.id', session_ids) -}} - """, - base=postgres_macros(), - engine=self.postgres_engine.select, - unit_ids=unit_ids, - channel_ids=channel_ids, - probe_ids=probe_ids, - session_ids=session_ids, - **_split_published_at(published_at)._asdict() - ) - return response.set_index("id", inplace=False) - - def get_channels( - self, - channel_ids: Optional[ArrayLike] = None, - probe_ids: Optional[ArrayLike] = None, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ) -> pd.DataFrame: - """ Download a table of ecephys channel records. - - Parameters - ---------- - channel_ids : - A collection of integer identifiers for ecephys channels. If - provided, results will be filtered to these channels. - probe_ids : - A collection of integer identifiers for ecephys probes. If - provided, results will be filtered to channels on these probes. - session_ids : - A collection of integer identifiers for ecephys sessions. If - provided, results will be filtered to channels recorded from during - these sessions. - published_at : - A date (rendered as "YYYY-MM-DD"). If provided, only channels - recorded from during sessions published before this date will be - returned. - - Returns - ------- - a pd.DataFrame whose rows are ecephys channels. - - """ - - response = build_and_execute( - """ - {%- import 'postgres_macros' as pm -%} - select - ec.id, - ec.ecephys_probe_id, - ec.local_index, - ec.probe_vertical_position, - ec.probe_horizontal_position, - ec.manual_structure_id as ecephys_structure_id, - st.acronym as ecephys_structure_acronym, - ec.anterior_posterior_ccf_coordinate, - ec.dorsal_ventral_ccf_coordinate, - ec.left_right_ccf_coordinate - from ecephys_channels ec - join ecephys_probes ep on ep.id = ec.ecephys_probe_id - join ecephys_sessions es on es.id = ep.ecephys_session_id - left join structures st on ec.manual_structure_id = st.id - where - not es.habituation - and valid_data - and ep.workflow_state != 'failed' - and es.workflow_state != 'failed' - {{pm.optional_not_null('es.published_at', published_at_not_null)}} - {{pm.optional_le('es.published_at', published_at)}} - {{pm.optional_contains('ec.id', channel_ids) -}} - {{pm.optional_contains('ep.id', probe_ids) -}} - {{pm.optional_contains('es.id', session_ids) -}} - """, - base=postgres_macros(), - engine=self.postgres_engine.select, - channel_ids=channel_ids, - probe_ids=probe_ids, - session_ids=session_ids, - **_split_published_at(published_at)._asdict() - ) - return response.set_index("id") - - def get_probes( - self, - probe_ids: Optional[ArrayLike] = None, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ) -> pd.DataFrame: - """ Download a table of ecephys probe records. - - Parameters - ---------- - probe_ids : - A collection of integer identifiers for ecephys probes. If - provided, results will be filtered to these probes. - session_ids : - A collection of integer identifiers for ecephys sessions. If - provided, results will be filtered to probes recorded from during - these sessions. - published_at : - A date (rendered as "YYYY-MM-DD"). If provided, only probes - recorded from during sessions published before this date will be - returned. - - Returns - ------- - a pd.DataFrame whose rows are ecephys probes. - - """ - - response = build_and_execute( - """ - {%- import 'postgres_macros' as pm -%} - select - ep.id, - ep.ecephys_session_id, - ep.name, - ep.global_probe_sampling_rate as sampling_rate, - ep.global_probe_lfp_sampling_rate as lfp_sampling_rate, - ep.phase, - ep.air_channel_index, - ep.surface_channel_index, - ep.use_lfp_data as has_lfp_data, - ep.temporal_subsampling_factor as lfp_temporal_subsampling_factor - from ecephys_probes ep - join ecephys_sessions es on es.id = ep.ecephys_session_id - where - not es.habituation - and ep.workflow_state != 'failed' - and es.workflow_state != 'failed' - {{pm.optional_not_null('es.published_at', published_at_not_null)}} - {{pm.optional_le('es.published_at', published_at)}} - {{pm.optional_contains('ep.id', probe_ids) -}} - {{pm.optional_contains('es.id', session_ids) -}} - """, - base=postgres_macros(), - engine=self.postgres_engine.select, - probe_ids=probe_ids, - session_ids=session_ids, - **_split_published_at(published_at)._asdict() - ) - return response.set_index("id") - - - def get_sessions( - self, - session_ids: Optional[ArrayLike] = None, - published_at: Optional[str] = None - ) -> pd.DataFrame: - """ Download a table of ecephys session records. - - Parameters - ---------- - session_ids : - A collection of integer identifiers for ecephys sessions. If - provided, results will be filtered to these sessions. - published_at : - A date (rendered as "YYYY-MM-DD"). If provided, only sessions - published before this date will be returned. - - Returns - ------- - a pd.DataFrame whose rows are ecephys sessions. - - """ - - response = build_and_execute( - """ - {%- import 'postgres_macros' as pm -%} - {%- import 'macros' as m -%} - select - es.id, - es.specimen_id, - es.stimulus_name as session_type, - es.isi_experiment_id, - es.date_of_acquisition, - es.published_at, - dn.full_genotype as genotype, - gd.name as sex, - ages.days as age_in_days, - case - when nwb_id is not null then true - else false - end as has_nwb - from ecephys_sessions es - join specimens sp on sp.id = es.specimen_id - join donors dn on dn.id = sp.donor_id - join genders gd on gd.id = dn.gender_id - join ages on ages.id = dn.age_id - left join ( - select ecephys_sessions.id as ecephys_session_id, - wkf.id as nwb_id - from ecephys_sessions - join ecephys_analysis_runs ear on ( - ear.ecephys_session_id = ecephys_sessions.id - and ear.current - ) - join well_known_files wkf on ( - wkf.attachable_id = ear.id - and wkf.attachable_type = 'EcephysAnalysisRun' - ) - join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id - where wkft.name = 'EcephysNwb' - ) nwb on es.id = nwb.ecephys_session_id - where - not es.habituation - and es.workflow_state != 'failed' - {{pm.optional_contains('es.id', session_ids) -}} - {{pm.optional_not_null('es.published_at', published_at_not_null)}} - {{pm.optional_le('es.published_at', published_at)}} - """, - base=postgres_macros(), - engine=self.postgres_engine.select, - session_ids=session_ids, - **_split_published_at(published_at)._asdict() - ) - - response.set_index("id", inplace=True) - response["genotype"].fillna("wt", inplace=True) - return response - - - def get_unit_analysis_metrics( - self, - unit_ids: Optional[ArrayLike] = None, - ecephys_session_ids: Optional[ArrayLike] = None, - session_types: Optional[ArrayLike] = None - ) -> pd.DataFrame: - """ Fetch analysis metrics (stimulus set-specific characterizations of - unit response patterns) for ecephys units. Note that the metrics - returned depend on the stimuli that were presented during recording ( - and thus on the session_type) - - Parameters - --------- - unit_ids : - integer identifiers for a set of ecephys units. If provided, the - response will only include metrics calculated for these units - ecephys_session_ids : - integer identifiers for a set of ecephys sessions. If provided, the - response will only include metrics calculated for units identified - during these sessions - session_types : - string names identifying ecephys session types (e.g. - "brain_observatory_1.1" or "functional_connectivity") - - Returns - ------- - a pandas dataframe indexed by ecephys unit id whose columns are - metrics. - - """ - - response = build_and_execute( - """ - {%- import 'postgres_macros' as pm -%} - {%- import 'macros' as m -%} - select eumb.data, eumb.ecephys_unit_id from ecephys_unit_metric_bundles eumb - join ecephys_analysis_runs ear on eumb.ecephys_analysis_run_id = ear.id - join ecephys_units eu on eumb.ecephys_unit_id = eu.id - join ecephys_channels ec on eu.ecephys_channel_id = ec.id - join ecephys_probes ep on ec.ecephys_probe_id = ep.id - join ecephys_sessions es on es.id = ep.ecephys_session_id - where ear.current - {{pm.optional_contains('eumb.id', unit_ids) -}} - {{pm.optional_contains('es.id', ecephys_session_ids) -}} - {{pm.optional_contains('es.stimulus_name', session_types, True) -}} - """, - base=postgres_macros(), - engine=self.postgres_engine.select, - unit_ids=unit_ids, - ecephys_session_ids=ecephys_session_ids, - session_types=session_types - ) - - data = pd.DataFrame(response.pop("data").values.tolist(), index=response.index) - response = pd.merge(response, data, left_index=True, right_index=True) - response.set_index("ecephys_unit_id", inplace=True) - - return response - - - def _get_template(self, name, namespace): - """ Identify the WellKnownFile record associated with a stimulus - template and stream its data if present. - """ - - try: - well_known_file = build_and_execute( - f""" - select - st.well_known_file_id - from stimuli st - join stimulus_namespaces sn on sn.id = st.stimulus_namespace_id - where - st.name = '{name}' - and sn.name = '{namespace}' - """, - base=postgres_macros(), - engine=self.postgres_engine.select_one - ) - wkf_id = well_known_file["well_known_file_id"] - except (KeyError, IndexError): - raise ValueError(f"expected exactly 1 template for {name}") - - download_link = f"well_known_files/download/{wkf_id}?wkf_id={wkf_id}" - return self.app_engine.stream(download_link) - - - def get_natural_movie_template(self, number: int) -> Iterable[bytes]: - """ Download a template for the natural movie stimulus. This is the - actual movie that was shown during the recording session. - - Parameters - ---------- - number : - idenfifier for this movie (note that this is an integer, so to get - the template for natural_movie_three you should pass in 3) - - Returns - ------- - An iterable yielding an npy file as bytes - - """ - - return self._get_template( - f"natural_movie_{number}", self.STIMULUS_TEMPLATE_NAMESPACE - ) - - - def get_natural_scene_template(self, number: int) -> Iterable[bytes]: - """ Download a template for the natural scene stimulus. This is the - actual image that was shown during the recording session. - - Parameters - ---------- - number : - idenfifier for this scene - - Returns - ------- - An iterable yielding a tiff file as bytes. - - """ - return self._get_template( - f"natural_scene_{int(number)}", self.STIMULUS_TEMPLATE_NAMESPACE - ) - - - @classmethod - def default(cls, lims_credentials: Optional[DbCredentials] = None, - app_kwargs=None, asynchronous=False): - """ Construct a "straightforward" lims api that can fetch data from - lims2. - - Parameters - ---------- - lims_credentials : DbCredentials - Credentials and configuration for postgres queries against - the LIMS database. If left unspecified will attempt to provide - credentials from environment variables. - app_kwargs : dict - High-level configuration for http requests. See - allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine.HttpEngine - and AsyncHttpEngine for details. - asynchronous : bool - If true, (http) queries will be made asynchronously. - - Returns - ------- - EcephysProjectLimsApi - - """ - - _app_kwargs = {"scheme": "http", "host": "lims2", "asynchronous": asynchronous} - if app_kwargs is not None: - if "asynchronous" in app_kwargs: - raise TypeError("please specify asynchronicity option at the api level rather than for the http engine") - _app_kwargs.update(app_kwargs) - - app_engine_cls = AsyncHttpEngine if _app_kwargs["asynchronous"] else HttpEngine - app_engine = app_engine_cls(**_app_kwargs) - - if lims_credentials is not None: - pg_engine = PostgresQueryMixin( - dbname=lims_credentials.dbname, user=lims_credentials.user, - host=lims_credentials.host, password=lims_credentials.password, - port=lims_credentials.port) - else: - # Currying is equivalent to decorator syntactic sugar - pg_engine = (credential_injector(LIMS_DB_CREDENTIAL_MAP) - (PostgresQueryMixin)()) - - return cls(pg_engine, app_engine) - - -class SplitPublishedAt(NamedTuple): - published_at: Optional[str] - published_at_not_null: Optional[bool] - - -def _split_published_at(published_at: Optional[str]) -> SplitPublishedAt: - """ LIMS queries that filter on published_at need a couple of - reformattings of the argued date string. - """ - - return SplitPublishedAt( - published_at=f"'{published_at}'" if published_at is not None else None, - published_at_not_null=None if published_at is None else True - ) diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py deleted file mode 100644 index bad7c764ce..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py +++ /dev/null @@ -1,310 +0,0 @@ -import re -import json -import ast - -import pandas as pd -import numpy as np - -from .rma_engine import RmaEngine, AsyncRmaEngine -from .ecephys_project_api import EcephysProjectApi -from .utilities import rma_macros, build_and_execute - - -class EcephysProjectWarehouseApi(EcephysProjectApi): - - movie_re = re.compile(r".*natural_movie_(?P<num>\d+).npy") - scene_re = re.compile(r".*/(?P<num>\d+).tiff") - - def __init__(self, rma_engine=None): - if rma_engine is None: - rma_engine = RmaEngine(scheme="http", host="api.brain-map.org") - self.rma_engine = rma_engine - - def get_session_data(self, session_id, **kwargs): - well_known_files = build_and_execute( - ( - "criteria=model::WellKnownFile" - ",rma::criteria,well_known_file_type[name$eq'EcephysNwb']" - "[attachable_type$eq'EcephysSession']" - r"[attachable_id$eq{{session_id}}]" - ), - engine=self.rma_engine.get_rma_tabular, session_id=session_id - ) - - if well_known_files.shape[0] != 1: - raise ValueError(f"expected exactly 1 nwb file for session {session_id}, found: {well_known_files}") - - download_link = well_known_files.iloc[0]["download_link"] - return self.rma_engine.stream(download_link) - - def get_natural_movie_template(self, number): - well_known_files = self.stimulus_templates[self.stimulus_templates["movie_number"] == number] - if well_known_files.shape[0] != 1: - raise ValueError(f"expected exactly one natural movie template with number {number}, found {well_known_files}") - - download_link = well_known_files.iloc[0]["download_link"] - return self.rma_engine.stream(download_link) - - def get_natural_scene_template(self, number): - well_known_files = self.stimulus_templates[self.stimulus_templates["scene_number"] == number] - if well_known_files.shape[0] != 1: - raise ValueError(f"expected exactly one natural scene template with number {number}, found {well_known_files}") - - download_link = well_known_files.iloc[0]["download_link"] - return self.rma_engine.stream(download_link) - - @property - def stimulus_templates(self): - if not hasattr(self, "_stimulus_templates_list"): - self._stimulus_templates_list = self._list_stimulus_templates() - return self._stimulus_templates_list - - def _list_stimulus_templates(self, ecephys_product_id=714914585): - well_known_files = build_and_execute( - ( - "criteria=model::WellKnownFile" - ",rma::criteria,well_known_file_type[name$eq'Stimulus']" - "[attachable_type$eq'Product']" - r"[attachable_id$eq{{ecephys_product_id}}]" - ), - engine=self.rma_engine.get_rma_tabular, - ecephys_product_id=ecephys_product_id - ) - - scene_number = [] - movie_number = [] - for _, row in well_known_files.iterrows(): - scene_match = self.scene_re.match(row["path"]) - movie_match = self.movie_re.match(row["path"]) - - if scene_match is not None: - scene_number.append(int(scene_match["num"])) - movie_number.append(None) - - elif movie_match is not None: - movie_number.append(int(movie_match["num"])) - scene_number.append(None) - - well_known_files["scene_number"] = scene_number - well_known_files["movie_number"] = movie_number - return well_known_files - - def get_probe_lfp_data(self, probe_id): - well_known_files = build_and_execute( - ( - "criteria=model::WellKnownFile" - ",rma::criteria,well_known_file_type[name$eq'EcephysLfpNwb']" - "[attachable_type$eq'EcephysProbe']" - r"[attachable_id$eq{{probe_id}}]" - ), - engine=self.rma_engine.get_rma_tabular, probe_id=probe_id - ) - - if well_known_files.shape[0] != 1: - raise ValueError(f"expected exactly 1 LFP NWB file for probe {probe_id}, found: {well_known_files}") - - download_link = well_known_files.loc[0, "download_link"] - return self.rma_engine.stream(download_link) - - def get_sessions(self, session_ids=None, has_eye_tracking=None, stimulus_names=None): - response = build_and_execute( - ( - "{% import 'rma_macros' as rm %}" - "{% import 'macros' as m %}" - "criteria=model::EcephysSession" - r"{{rm.optional_contains('id',session_ids)}}" - r"{%if has_eye_tracking is not none%}[fail_eye_tracking$eq{{m.str(not has_eye_tracking).lower()}}]{%endif%}" - r"{{rm.optional_contains('stimulus_name',stimulus_names,True)}}" - ",rma::include,specimen(donor(age))" - ",well_known_files(well_known_file_type)" - ), - base=rma_macros(), - engine=self.rma_engine.get_rma_tabular, - session_ids=session_ids, - has_eye_tracking=has_eye_tracking, - stimulus_names=stimulus_names - ) - - response.set_index("id", inplace=True) - - age_in_days = [] - sex = [] - genotype = [] - has_nwb = [] - - for idx, row in response.iterrows(): - age_in_days.append(row["specimen"]["donor"]["age"]["days"]) - sex.append(row["specimen"]["donor"]["sex"]) - - gt = row["specimen"]["donor"]["full_genotype"] - if gt is None: - gt = "wt" - genotype.append(gt) - - current_has_nwb = False - for wkf in row["well_known_files"]: - if wkf["well_known_file_type"]["name"] == "EcephysNwb": - current_has_nwb = True - has_nwb.append(current_has_nwb) - - response["age_in_days"] = age_in_days - response["sex"] = sex - response["genotype"] = genotype - response["has_nwb"] = has_nwb - - response.drop(columns=["specimen", "fail_eye_tracking", "well_known_files"], inplace=True) - response.rename(columns={"stimulus_name": "session_type"}, inplace=True) - - return response - - def get_probes(self, probe_ids=None, session_ids=None): - response = build_and_execute( - ( - "{% import 'rma_macros' as rm %}" - "{% import 'macros' as m %}" - "criteria=model::EcephysProbe" - r"{{rm.optional_contains('id',probe_ids)}}" - r"{{rm.optional_contains('ecephys_session_id',session_ids)}}" - ), - base=rma_macros(), - engine=self.rma_engine.get_rma_tabular, - session_ids=session_ids, - probe_ids=probe_ids - ) - response.set_index("id", inplace=True) - # Clarify name for external users - response.rename(columns={"use_lfp_data": "has_lfp_data"}, inplace=True) - return response - - def get_channels(self, channel_ids=None, probe_ids=None): - response = build_and_execute( - ( - "{% import 'rma_macros' as rm %}" - "{% import 'macros' as m %}" - "criteria=model::EcephysChannel" - r"{{rm.optional_contains('id',channel_ids)}}" - r"{{rm.optional_contains('ecephys_probe_id',probe_ids)}}" - ",rma::include,structure" - ",rma::options[tabular$eq'" - "ecephys_channels.id" - ",ecephys_probe_id" - ",local_index" - ",probe_horizontal_position" - ",probe_vertical_position" - ",anterior_posterior_ccf_coordinate" - ",dorsal_ventral_ccf_coordinate" - ",left_right_ccf_coordinate" - ",structures.id as ecephys_structure_id" - ",structures.acronym as ecephys_structure_acronym" - "']" - ), - base=rma_macros(), - engine=self.rma_engine.get_rma_tabular, - probe_ids=probe_ids, - channel_ids=channel_ids - ) - - response.set_index("id", inplace=True) - return response - - def get_units(self, unit_ids=None, channel_ids=None, probe_ids=None, session_ids=None, *a, **k): - response = build_and_execute( - ( - "{% import 'macros' as m %}" - "criteria=model::EcephysUnit" - r"{% if unit_ids is not none %},rma::criteria[id$in{{m.comma_sep(unit_ids)}}]{% endif %}" - r"{% if channel_ids is not none %},rma::criteria[ecephys_channel_id$in{{m.comma_sep(channel_ids)}}]{% endif %}" - r"{% if probe_ids is not none %},rma::criteria,ecephys_channel(ecephys_probe[id$in{{m.comma_sep(probe_ids)}}]){% endif %}" - r"{% if session_ids is not none %},rma::criteria,ecephys_channel(ecephys_probe(ecephys_session[id$in{{m.comma_sep(session_ids)}}])){% endif %}" - ), - base=rma_macros(), engine=self.rma_engine.get_rma_tabular, - session_ids=session_ids, - probe_ids=probe_ids, - channel_ids=channel_ids, - unit_ids=unit_ids - ) - - response.set_index("id", inplace=True) - - return response - - def get_unit_analysis_metrics(self, unit_ids=None, ecephys_session_ids=None, session_types=None): - """ Download analysis metrics - precalculated descriptions of unitwise responses to visual stimulation. - - Parameters - ---------- - unit_ids : array-like of int, optional - Unique identifiers for ecephys units. If supplied, only download - metrics for these units. - ecephys_session_ids : array-like of int, optional - Unique identifiers for ecephys sessions. If supplied, only download - metrics for units collected during these sessions. - session_types : array-like of str, optional - Names of session types. e.g. "brain_observatory_1.1" or - "functional_connectivity". If supplied, only download - metrics for units collected during sessions of these types - - Returns - ------- - pd.DataFrame : - A table of analysis metrics, indexed by unit_id. - - """ - - response = build_and_execute( - ( - "{% import 'macros' as m %}" - "criteria=model::EcephysUnitMetricBundle" - r"{% if unit_ids is not none %},rma::criteria[ecephys_unit_id$in{{m.comma_sep(unit_ids)}}]{% endif %}" - r"{% if session_ids is not none %},rma::criteria,ecephys_unit(ecephys_channel(ecephys_probe(ecephys_session[id$in{{m.comma_sep(session_ids)}}]))){% endif %}" - r"{% if session_types is not none %},rma::criteria,ecephys_unit(ecephys_channel(ecephys_probe(ecephys_session[stimulus_name$in{{m.comma_sep(session_types, True)}}]))){% endif %}" - ), - base=rma_macros(), - engine=self.rma_engine.get_rma_list, - session_ids=ecephys_session_ids, - unit_ids=unit_ids, - session_types=session_types - ) - - output = [] - for item in response: - data = json.loads(item.pop("data")) - item.update(data) - output.append(item) - - output = pd.DataFrame(output) - output.set_index("ecephys_unit_id", inplace=True) - output.drop(columns="id", inplace=True) - - for colname in output.columns: - try: - output[colname] = output.apply(lambda row: ast.literal_eval(str(row[colname])), axis=1) - except ValueError: - pass - - # TODO: remove this - # on_screen_rf and p_value_rf were correctly calculated, - # but switched with one another. This snippet unswitches them. - columns = set(output.columns.values.tolist()) - if "p_value_rf" in columns and "on_screen_rf" in columns: - - pv_is_bool = np.issubdtype(output["p_value_rf"].values[0], np.bool) - on_screen_is_float = np.issubdtype(output["on_screen_rf"].values[0].dtype, np.floating) - - # this is not a good test, but it avoids the case where we fix - # these in the data for a future release, but - # reintroduce the bug by forgetting to update the code. - if pv_is_bool and on_screen_is_float: - p_value_rf = output["p_value_rf"].copy() - output["p_value_rf"] = output["on_screen_rf"].copy() - output["on_screen_rf"] = p_value_rf - - return output - - @classmethod - def default(cls, asynchronous=False, **rma_kwargs): - _rma_kwargs = {"scheme": "http", "host": "api.brain-map.org"} - _rma_kwargs.update(rma_kwargs) - - engine_cls = AsyncRmaEngine if asynchronous else RmaEngine - return cls(engine_cls(**_rma_kwargs)) diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/http_engine.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/http_engine.py deleted file mode 100644 index d2fe54d6a7..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/http_engine.py +++ /dev/null @@ -1,235 +0,0 @@ -import functools -import os -import asyncio -import time -import warnings -import logging -from typing import Optional, Iterable, Callable, AsyncIterator, Awaitable - -import requests -import aiohttp -import nest_asyncio -from tqdm.auto import tqdm - -DEFAULT_TIMEOUT = 20 * 60 # seconds -DEFAULT_CHUNKSIZE = 1024 * 10 # bytes - - -class HttpEngine: - def __init__( - self, - scheme: str, - host: str, - timeout: float = DEFAULT_TIMEOUT, - chunksize: int = DEFAULT_CHUNKSIZE, - **kwargs - ): - """ Simple tool for making streaming http requests. - - Parameters - ---------- - scheme : - e.g "http" or "https" - host : - will be used as the base for request urls - timeout : - requests taking longer than this (in seconds) will raise a - `requests.Timeout` error. The clock on this timeout starts running - when the initial request is made. - chunksize : - When streaming data, how many bytes ought to be requested at once. - **kwargs : - unused. Defined here so that parameters can fall through from - subclasses - """ - - self.scheme = scheme - self.host = host - self.timeout = timeout - self.chunksize = chunksize - - def _build_url(self, route): - return f"{self.scheme}://{self.host}/{route}" - - def stream(self, route): - """ Makes an http request and returns an iterator over the response. - - Parameters - ---------- - route : - the http route (under this object's host) to request against. - - """ - - url = self._build_url(route) - - start_time = time.perf_counter() - response = requests.get(url, stream=True) - response_b = None - if "Content-length" in response.headers: - response_b = float(response.headers["Content-length"]) - - size_message = f"{response_b / 1024 ** 2:3.3f}MiB" if response_b is not None else "potentially large" - logging.warning(f"downloading a {size_message} file from {url}") - progress = tqdm( unit="B", total=response_b, unit_scale=True, desc="Downloading") - - for chunk in response.iter_content(self.chunksize): - if chunk: # filter out keep-alive new chunks - progress.update(len(chunk)) - yield chunk - - elapsed = time.perf_counter() - start_time - if elapsed > self.timeout: - raise requests.Timeout(f"Download took {elapsed} seconds, but timeout was set to {self.timeout}") - - @staticmethod - def write_bytes(path: str, stream: Iterable[bytes]): - write_from_stream(path, stream) - - -AsyncStreamCallbackType = Callable[[AsyncIterator[bytes]], Awaitable[None]] - - -class AsyncHttpEngine(HttpEngine): - - def __init__( - self, - scheme: str, - host: str, - session: Optional[aiohttp.ClientSession] = None, - **kwargs - ): - """ Simple tool for making asynchronous streaming http requests. - - Parameters - ---------- - scheme : - e.g "http" or "https" - host : - will be used as the base for request urls - session : - If provided, this preconstructed session will be used rather than - a new one. Keep in mind that AsyncHttpEngine closes its session - when it is garbage collected! - **kwargs : - Will be passed to parent. - - """ - - super(AsyncHttpEngine, self).__init__(scheme, host, **kwargs) - - if session: - self.session = session - warnings.warn( - "Recieved preconstructed session, ignoring timeout parameter." - ) - else: - self.session = aiohttp.ClientSession( - timeout=aiohttp.client.ClientTimeout(self.timeout) - ) - - async def _stream_coroutine( - self, - route: str, - callback: AsyncStreamCallbackType - ): - url = self._build_url(route) - - async with self.session.get(url) as response: - await callback(response.content.iter_chunked(self.chunksize)) - - def stream( - self, - route: str - ) -> Callable[[AsyncStreamCallbackType], Awaitable[None]]: - """ Returns a coroutine which - - makes an http request - - exposes internally an asynchronous iterator over the response - - takes a callback parameter, which should consume the iterator. - - Parameters - ---------- - route : - the http route (under this object's host) to request against. - - Notes - ----- - To use this method, you will need an appropriate consumer. For - instance, If you want to write the streamed data to a local file, you - can use write_bytes_from_coroutine. - - Examples - -------- - >>> engine = AsyncHttpEngine("http", "examplehost") - >>> stream_coro = engine.stream("example/route") - >>> write_bytes_from_coroutine("example/file/path.txt", stream_coro) - - """ - - return functools.partial(self._stream_coroutine, route) - - def __del__(self): - if hasattr(self, "session"): - nest_asyncio.apply() - loop = asyncio.get_event_loop() - loop.run_until_complete(self.session.close()) - - @staticmethod - def write_bytes( - path: str, - coroutine: Callable[[AsyncStreamCallbackType], Awaitable[None]]): - write_bytes_from_coroutine(path, coroutine) - - -def write_bytes_from_coroutine( - path: str, - coroutine: Callable[[AsyncStreamCallbackType], Awaitable[None]] -): - """ Utility for streaming http from an asynchronous requester to a file. - - Parameters - ---------- - path : - Write to this file - coroutine : - The source of the data. Needs to have a specific structure, namely: - - the first-position parameter of the coroutine ought to accept a - callback. This callback ought to itself be awaitable. - - within the coroutine, this callback ought to be called with a - single argument. That single argument should be an asynchronous - iterator. - Please see AsyncHttpEngine.stream (and - AsyncHttpEngine._stream_coroutine) for an example. - - """ - - os.makedirs(os.path.dirname(path), exist_ok=True) - - async def callback(file_, iterable): - async for chunk in iterable: - file_.write(chunk) - - async def wrapper(): - with open(path, "wb") as file_: - callback_ = functools.partial(callback, file_) - await coroutine(callback_) - - nest_asyncio.apply() - loop = asyncio.get_event_loop() - loop.run_until_complete(wrapper()) - - -def write_from_stream(path: str, stream: Iterable[bytes]): - """ Write bytes to a file from an iterator - - Parameters - ---------- - path : - write to this file - stream : - iterable yielding bytes to be written - - """ - with open(path, "wb") as fil: - for chunk in stream: - fil.write(chunk) diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/rma_engine.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/rma_engine.py deleted file mode 100644 index 9126d6ab5b..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/rma_engine.py +++ /dev/null @@ -1,136 +0,0 @@ -import sys -import logging -import time -import ast - -import requests -import pandas as pd - -from .http_engine import HttpEngine, AsyncHttpEngine - - -class RmaRequestError(Exception): - pass - - -class RmaEngine(HttpEngine): - - @property - def format_query_string(self): - return f"query.{self.rma_format}" - - def __init__( - self, - scheme, - host, - rma_prefix: str = "api/v2/data", - rma_format: str = "json", - page_size: int = 5000, - **kwargs - ): - """ Simple tool for making rma and streaming http requests. - - Parameters - ---------- - scheme : - e.g "http" or "https" - host : - will be used as the base for request urls - rma_prefix : - rma request routes will be prefixed with this string - rma_format : - Format of reuturned response. e.g. "json", "xml", "csv" - page_size : - how many rma records to request in one query. - **kwargs : - will be passed to parent - """ - - super(RmaEngine, self).__init__(scheme, host, **kwargs) - self.rma_prefix = rma_prefix - self.rma_format = rma_format - self.page_size = page_size - - def add_page_params(self, url, start, count=None): - if count is None: - count = self.page_size - return f"{url},rma::options[start_row$eq{start}][num_rows$eq{count}][order$eq'id']" - - def get_rma(self, query: str): - """ Makes a paging rma query - - Parameters - ---------- - query : - The RMA query parameters - - """ - url = f"{self.scheme}://{self.host}/{self.rma_prefix}/{self.format_query_string}?{query}" - logging.debug(url) - - start_row = 0 - total_rows = None - - start_time = time.time() - while total_rows is None or start_row < total_rows: - current_url = self.add_page_params(url, start_row) - response_json = requests.get(current_url).json() - if not response_json["success"]: - raise RmaRequestError(response_json["msg"]) - - start_row += response_json["num_rows"] - if total_rows is None: - total_rows = response_json["total_rows"] - - logging.debug(f"downloaded {start_row} of {total_rows} records ({time.time() - start_time:.3f} seconds)") - yield response_json["msg"] - - - def get_rma_list(self, query): - response = [] - for chunk in self.get_rma(query): - response.extend(chunk) - return response - - def get_rma_tabular(self, query, try_infer_dtypes=True): - response = pd.DataFrame(self.get_rma_list(query)) - - if try_infer_dtypes: - response = infer_column_types(response) - - return response - - -class AsyncRmaEngine(RmaEngine, AsyncHttpEngine): - - def __init__(self, scheme: str, host: str, **kwargs): - """ Simple tool for making rma and asynchronous streaming http - requests. - - Parameters - ---------- - scheme : - e.g "http" or "https" - host : - will be used as the base for request urls - **kwargs : - will be passed to parent - """ - - super(AsyncRmaEngine, self).__init__(scheme, host, **kwargs) - - -def infer_column_types(dataframe): - """ RMA queries often come back with string-typed columns. This utility tries to infer numeric types. - """ - - dataframe = dataframe.copy() - - for colname in dataframe.columns: - try: - dataframe[colname] = dataframe[colname].apply(ast.literal_eval) - except (ValueError, SyntaxError): - continue - - dataframe = dataframe.infer_objects() - return dataframe \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_api/utilities.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/utilities.py deleted file mode 100644 index 826e4fc56c..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_api/utilities.py +++ /dev/null @@ -1,93 +0,0 @@ -import copy as cp - -from jinja2 import Environment, BaseLoader, DictLoader - - -def macros(): - return { - "macros": """ - {%- macro comma_sep(data, quote=False) -%} - {%- for datum in data -%} - {% if quote%}\'{%endif -%} - {{datum}} - {%- if quote %}\'{% endif %} - {% if not loop.last %},{% endif %} - {%- endfor -%} - {%- endmacro -%} - {%- macro str(x) -%} - {{- x ~ "" -}} - {%- endmacro -%} - """ - } - - -def postgres_macros(): - return { - "postgres_macros": """ - {% import 'macros' as m %} - {% macro optional_contains(key, data, quote=False) %} - {% if data is not none -%} - and {{key}} in ({{m.comma_sep(data, quote)}}) - {% endif %} - {% endmacro %} - {% macro optional_equals(key, value) %} - {% if value is not none -%} - and {{key}} = {{value}} - {% endif %} - {% endmacro %} - {% macro optional_not_null(key, value=True) %} - {% if value is not none -%} - and {{key}} is {{- ' not ' if value -}} null - {% endif %} - {% endmacro %} - {% macro optional_le(key, value) %} - {% if value is not none -%} - and {{key}} <= {{value}} - {% endif %} - {% endmacro %} - {% macro optional_ge(key, value) %} - {% if value is not none -%} - and {{key}} >= {{value}} - {% endif %} - {% endmacro %} - """, - "macros": macros()["macros"] - } - - -def rma_macros(): - return { - "rma_macros": """ - {% import 'macros' as m %} - {% macro optional_contains(key, data, quote=False) -%} - {%- if data is not none %}[{{key}}$in{{m.comma_sep(data,quote)}}]{% endif -%} - {%- endmacro -%} - """, - "macros": macros()["macros"] - } - - - -def build_and_execute(query, base=None, engine=None, **kwargs): - env = build_environment({"__tmp__": query}, base=base) - return execute_templated(env, "__tmp__", engine=engine, **kwargs) - - -def build_environment(template_strings, base=None): - if base is None: - base = {} - else: - base = cp.deepcopy(base) - - base.update(template_strings) - return Environment(loader=DictLoader(base), lstrip_blocks=True, trim_blocks=True) - - -def execute_templated(environment, name, engine, engine_kwargs=None, **kwargs): - if engine_kwargs is None: - engine_kwargs = {} - - template = environment.get_template(name) - rendered = template.render(**kwargs) - - return engine(rendered) diff --git a/allensdk/brain_observatory/ecephys/ecephys_project_cache.py b/allensdk/brain_observatory/ecephys/ecephys_project_cache.py deleted file mode 100644 index 89cb62210a..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_project_cache.py +++ /dev/null @@ -1,777 +0,0 @@ -from functools import partial -from pathlib import Path -from typing import Any, List, Optional, Union, Callable -import ast - -import pandas as pd -import SimpleITK as sitk -import numpy as np -import pynwb - -from allensdk.api.warehouse_cache.cache import Cache -from allensdk.core.authentication import DbCredentials -from allensdk.brain_observatory.ecephys.ecephys_project_api import ( - EcephysProjectApi, EcephysProjectLimsApi, EcephysProjectWarehouseApi, - EcephysProjectFixedApi -) -from allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine import ( - write_bytes_from_coroutine, write_from_stream -) -from allensdk.brain_observatory.ecephys.ecephys_session_api import ( - EcephysNwbSessionApi -) -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession -from allensdk.brain_observatory.ecephys import get_unit_filter_value -from allensdk.api.warehouse_cache.caching_utilities import one_file_call_caching - - -class EcephysProjectCache(Cache): - - SESSIONS_KEY = 'sessions' - PROBES_KEY = 'probes' - CHANNELS_KEY = 'channels' - UNITS_KEY = 'units' - - SESSION_DIR_KEY = 'session_data' - SESSION_NWB_KEY = 'session_nwb' - PROBE_LFP_NWB_KEY = "probe_lfp_nwb" - - NATURAL_MOVIE_DIR_KEY = "movie_dir" - NATURAL_MOVIE_KEY = "natural_movie" - - NATURAL_SCENE_DIR_KEY = "natural_scene_dir" - NATURAL_SCENE_KEY = "natural_scene" - - SESSION_ANALYSIS_METRICS_KEY = "session_analysis_metrics" - TYPEWISE_ANALYSIS_METRICS_KEY = "typewise_analysis_metrics" - - MANIFEST_VERSION = '0.3.0' - - SUPPRESS_FROM_UNITS = ("air_channel_index", - "surface_channel_index", - "has_nwb", - "lfp_temporal_subsampling_factor", - "epoch_name_quality_metrics", - "epoch_name_waveform_metrics", - "isi_experiment_id") - SUPPRESS_FROM_CHANNELS = ( - "air_channel_index", "surface_channel_index", "name", - "date_of_acquisition", "published_at", "specimen_id", "session_type", "isi_experiment_id", "age_in_days", - "sex", "genotype", "has_nwb", "lfp_temporal_subsampling_factor" - ) - SUPPRESS_FROM_PROBES = ( - "air_channel_index", "surface_channel_index", - "date_of_acquisition", "published_at", "specimen_id", "session_type", "isi_experiment_id", "age_in_days", - "sex", "genotype", "has_nwb", "lfp_temporal_subsampling_factor" - ) - SUPPRESS_FROM_SESSION_TABLE = ( - "has_nwb", - "isi_experiment_id", - "date_of_acquisition" - ) - - def __init__( - self, - fetch_api: Optional[EcephysProjectApi] = None, - fetch_tries: int = 2, - stream_writer: Optional[Callable] = None, - manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None, - cache: bool = True): - """ Entrypoint for accessing ecephys (neuropixels) data. Supports - access to cross-session data (like stimulus templates) and high-level - summaries of sessionwise data and provides tools for downloading detailed - sessionwise data (such as spike times). - - To ensure correct configuration, it is recommended to use one of the - class constructors rather than to initialize this class directly. - - Parameters - ========== - fetch_api : Optional[EcephysProjectApi] - Used to pull data from remote sources, after which it is locally - cached. Any object exposing the EcephysProjectApi interface is - suitable. Standard options are: - EcephysProjectWarehouseApi :: The default. Fetches publically - available Allen Institute data - EcephysProjectFixedApi :: Refuses to fetch any data - only the - existing local cache is accessible. Useful if you want to - settle on a fixed dataset for analysis - EcephysProjectLimsApi :: Fetches bleeding-edge data from the - Allen Institute's internal database. Only works if you are - on our internal network. - By default None. If None, then fetch_api will be set to: - EcephysProjectWarehouseApi.default() - fetch_tries : int - Maximum number of times to attempt a download before giving up and - raising an exception. Note that this is total tries, not retries - stream_writer: Callable - The method used to write from stream. Depends on whether the - engine is synchronous or asynchronous. If not set, will use the - `write_bytes` method native to the `fetch_api`'s `rma_engine`. - If the method is incompatible with the `fetch_api`'s `rma_engine`, - will likely encounter errors. For this reason it is recommended - to leave this field unspecified, or to use one of the class - constructors. - manifest : str or Path - full path at which manifest json will be stored (default = - "ecephys_project_manifest.json" in the local directory.) - version : str - version of manifest file. If this mismatches the version - recorded in the file at manifest, an error will be raised. - cache: bool - Whether to write to the cache (default=True) - - Notes - ===== - It is highly recommended to construct an instance of this class - using one of the following constructor methods: - - from_warehouse(scheme: Optional[str] = None, - host: Optional[str] = None, - asynchronous: bool = True, - manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None, - cache: bool = True, - fetch_tries: int = 2) - Create an instance of EcephysProjectCache with an - EcephysProjectWarehouseApi. Retrieves released data stored - in the warehouse. Suitable for all users downloading - published Allen Institute data. - from_lims(lims_credentials: Optional[DbCredentials] = None, - scheme: Optional[str] = None, - host: Optional[str] = None, - asynchronous: bool = True, - manifest: Optional[str] = None, - version: Optional[str] = None, - cache: bool = True, - fetch_tries: int = 2) - Create an instance of EcephysProjectCache with an - EcephysProjectLimsApi. Retrieves bleeding-edge data stored - locally on Allen Institute servers. Suitable for internal - users on-site at the Allen Institute or using the corporate - vpn. Requires Allen Institute database credentials. - fixed(manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None) - Create an instance of EcephysProjectCache that will only - use locally stored data, downloaded previously from LIMS - or warehouse using the EcephysProjectCache. - Suitable for users who want to analyze a fixed dataset they - have previously downloaded using EcephysProjectCache. - """ - manifest_ = manifest or "ecephys_project_manifest.json" - version_ = version or self.MANIFEST_VERSION - - super(EcephysProjectCache, self).__init__(manifest=manifest_, - version=version_, - cache=cache) - self.fetch_api = (EcephysProjectWarehouseApi.default() - if fetch_api is None else fetch_api) - self.fetch_tries = fetch_tries - self.stream_writer = (stream_writer - or self.fetch_api.rma_engine.write_bytes) - if stream_writer is not None: - self.stream_writer = stream_writer - else: - if hasattr(self.fetch_api, "rma_engine"): # EcephysProjectWarehouseApi # noqa - self.stream_writer = self.fetch_api.rma_engine.write_bytes - # TODO: Make these names consistent in the different fetch apis - elif hasattr(self.fetch_api, "app_engine"): # EcephysProjectLimsApi # noqa - self.stream_writer = self.fetch_api.app_engine.write_bytes - else: - raise ValueError( - "Must either set value for `stream_writer`, or use a " - "`fetch_api` with an rma_engine or app_engine attribute " - "that implements `write_bytes`. See `HttpEngine` and " - "`AsyncHttpEngine` from " - "allensdk.brain_observatory.ecephys.ecephys_project_api." - "http_engine for examples.") - - def _get_sessions(self): - path = self.get_cache_path(None, self.SESSIONS_KEY) - response = one_file_call_caching(path, self.fetch_api.get_sessions, write_csv, read_csv, num_tries=self.fetch_tries) - - if "structure_acronyms" in response.columns: # unfortunately, structure_acronyms is a list of str - response["ecephys_structure_acronyms"] = [ast.literal_eval(item) for item in response["structure_acronyms"]] - response.drop(columns=["structure_acronyms"], inplace=True) - - return response - - def _get_probes(self): - path: str = self.get_cache_path(None, self.PROBES_KEY) - probes = one_file_call_caching(path, self.fetch_api.get_probes, write_csv, read_csv, num_tries=self.fetch_tries) - # Divide the lfp sampling by the subsampling factor for clearer presentation (if provided) - if all(c in list(probes) for c in - ["lfp_sampling_rate", "lfp_temporal_subsampling_factor"]): - probes["lfp_sampling_rate"] = ( - probes["lfp_sampling_rate"] / probes["lfp_temporal_subsampling_factor"]) - return probes - - def _get_channels(self): - path = self.get_cache_path(None, self.CHANNELS_KEY) - return one_file_call_caching(path, self.fetch_api.get_channels, write_csv, read_csv, num_tries=self.fetch_tries) - - def _get_units(self, filter_by_validity: bool = True, **unit_filter_kwargs) -> pd.DataFrame: - path = self.get_cache_path(None, self.UNITS_KEY) - - units = one_file_call_caching(path, self.fetch_api.get_units, write_csv, read_csv, num_tries=self.fetch_tries) - units = units.rename(columns={ - 'PT_ratio': 'waveform_PT_ratio', - 'amplitude': 'waveform_amplitude', - 'duration': 'waveform_duration', - 'halfwidth': 'waveform_halfwidth', - 'recovery_slope': 'waveform_recovery_slope', - 'repolarization_slope': 'waveform_repolarization_slope', - 'spread': 'waveform_spread', - 'velocity_above': 'waveform_velocity_above', - 'velocity_below': 'waveform_velocity_below', - 'l_ratio': 'L_ratio', - }) - - units = units[ - (units["amplitude_cutoff"] <= get_unit_filter_value("amplitude_cutoff_maximum", **unit_filter_kwargs)) - & (units["presence_ratio"] >= get_unit_filter_value("presence_ratio_minimum", **unit_filter_kwargs)) - & (units["isi_violations"] <= get_unit_filter_value("isi_violations_maximum", **unit_filter_kwargs)) - ] - - if "quality" in units.columns and filter_by_validity: - units = units[units["quality"] == "good"] - units.drop(columns="quality", inplace=True) - - if "ecephys_structure_id" in units.columns and unit_filter_kwargs.get("filter_out_of_brain_units", True): - units = units[~(units["ecephys_structure_id"].isna())] - - return units - - def _get_annotated_probes(self): - sessions = self._get_sessions() - probes = self._get_probes() - - return pd.merge(probes, sessions, left_on="ecephys_session_id", right_index=True, suffixes=['_probe', '_session']) - - def _get_annotated_channels(self): - channels = self._get_channels() - probes = self._get_annotated_probes() - - return pd.merge(channels, probes, left_on="ecephys_probe_id", right_index=True, suffixes=['_channel', '_probe']) - - def _get_annotated_units(self, filter_by_validity: bool = True, **unit_filter_kwargs) -> pd.DataFrame: - units = self._get_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) - channels = self._get_annotated_channels() - annotated_units = pd.merge(units, channels, left_on='ecephys_channel_id', right_index=True, suffixes=['_unit', '_channel']) - annotated_units = annotated_units.rename(columns={ - 'name': 'probe_name', - 'phase': 'probe_phase', - 'sampling_rate': 'probe_sampling_rate', - 'lfp_sampling_rate': 'probe_lfp_sampling_rate', - 'local_index': 'peak_channel' - }) - - return pd.merge(units, channels, left_on='ecephys_channel_id', right_index=True, suffixes=['_unit', '_channel']) - - def get_session_table(self, suppress=None) -> pd.DataFrame: - sessions = self._get_sessions() - - count_owned(sessions, self._get_annotated_units(), "ecephys_session_id", "unit_count", inplace=True) - count_owned(sessions, self._get_annotated_channels(), "ecephys_session_id", "channel_count", inplace=True) - count_owned(sessions, self._get_annotated_probes(), "ecephys_session_id", "probe_count", inplace=True) - - get_grouped_uniques(sessions, self._get_annotated_channels(), "ecephys_session_id", "ecephys_structure_acronym", "ecephys_structure_acronyms", inplace=True) - - if suppress is None: - suppress = list(self.SUPPRESS_FROM_SESSION_TABLE) - sessions.drop(columns=suppress, inplace=True, errors="ignore") - sessions = sessions.rename(columns={'genotype': 'full_genotype'}) - return sessions - - def get_probes(self, suppress=None): - probes = self._get_annotated_probes() - - count_owned(probes, self._get_annotated_units(), "ecephys_probe_id", "unit_count", inplace=True) - count_owned(probes, self._get_annotated_channels(), "ecephys_probe_id", "channel_count", inplace=True) - - get_grouped_uniques(probes, self._get_annotated_channels(), "ecephys_probe_id", "ecephys_structure_acronym", "ecephys_structure_acronyms", inplace=True) - - if suppress is None: - suppress = list(self.SUPPRESS_FROM_PROBES) - probes.drop(columns=suppress, inplace=True, errors="ignore") - - return probes - - def get_channels(self, suppress=None): - """ Load (potentially downloading and caching) a table whose rows are individual channels. - """ - - channels = self._get_annotated_channels() - count_owned(channels, self._get_annotated_units(), "ecephys_channel_id", "unit_count", inplace=True) - - if suppress is None: - suppress = list(self.SUPPRESS_FROM_CHANNELS) - channels.drop(columns=suppress, inplace=True, errors="ignore") - channels.rename(columns={"name": "probe_name"}, inplace=True, errors="ignore") - - return channels - - def get_units(self, suppress: Optional[List[str]] = None, filter_by_validity: bool = True, **unit_filter_kwargs) -> pd.DataFrame: - """Reports a table consisting of all sorted units across the entire extracellular electrophysiology project. - - Parameters - ---------- - suppress : Optional[List[str]], optional - A list of dataframe column names to hide, by default None - (None will hide dataframe columns specified in: SUPPRESS_FROM_UNITS) - - filter_by_validity : bool, optional - Filter units so that only 'valid' units are returned, by default True - - **unit_filter_kwargs : - Additional keyword arguments that can be used to filter units (for power users). - - Returns - ------- - pd.DataFrame - A table consisting of sorted units across the entire extracellular electrophysiology project - """ - if suppress is None: - suppress = list(self.SUPPRESS_FROM_UNITS) - - units = self._get_annotated_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) - units.drop(columns=suppress, inplace=True, errors="ignore") - - return units - - def get_session_data(self, session_id: int, filter_by_validity: bool = True, **unit_filter_kwargs): - """ Obtain an EcephysSession object containing detailed data for a single session - """ - - def read(_path): - session_api = self._build_nwb_api_for_session(_path, session_id, filter_by_validity, **unit_filter_kwargs) - return EcephysSession(api=session_api, test=True) - - return one_file_call_caching( - self.get_cache_path(None, self.SESSION_NWB_KEY, session_id, session_id), - partial(self.fetch_api.get_session_data, session_id), - self.stream_writer, - read, - num_tries=self.fetch_tries - ) - - def _build_nwb_api_for_session(self, path, session_id, filter_by_validity, **unit_filter_kwargs): - - get_analysis_metrics = partial( - self.get_unit_analysis_metrics_for_session, - session_id=session_id, - annotate=False, - filter_by_validity=True, - **unit_filter_kwargs - ) - - return EcephysNwbSessionApi( - path=path, - probe_lfp_paths=self._setup_probe_promises(session_id), - additional_unit_metrics=get_analysis_metrics, - external_channel_columns=partial(self._get_substitute_channel_columns, session_id), - filter_by_validity=filter_by_validity, - **unit_filter_kwargs - ) - - def _setup_probe_promises(self, session_id): - probes = self.get_probes() - probe_ids = probes[probes["ecephys_session_id"] == session_id].index.values - - return { - probe_id: partial( - one_file_call_caching, - self.get_cache_path(None, self.PROBE_LFP_NWB_KEY, session_id, probe_id), - partial(self.fetch_api.get_probe_lfp_data, probe_id), - self.stream_writer, - read_nwb, - num_tries=self.fetch_tries - ) - for probe_id in probe_ids - } - - def _get_substitute_channel_columns(self, session_id): - channels = self.get_channels() - return channels.loc[channels["ecephys_session_id"] == session_id, [ - "ecephys_structure_id", - "ecephys_structure_acronym", - "anterior_posterior_ccf_coordinate", - "dorsal_ventral_ccf_coordinate", - "left_right_ccf_coordinate" - ]] - - def get_natural_movie_template(self, number): - return one_file_call_caching( - self.get_cache_path(None, self.NATURAL_MOVIE_KEY, number), - partial(self.fetch_api.get_natural_movie_template, number=number), - self.stream_writer, - read_movie, - num_tries=self.fetch_tries - ) - - def get_natural_scene_template(self, number): - return one_file_call_caching( - self.get_cache_path(None, self.NATURAL_SCENE_KEY, number), - partial(self.fetch_api.get_natural_scene_template, number=number), - self.stream_writer, - read_scene, - num_tries=self.fetch_tries - ) - - def get_all_session_types(self, **session_kwargs): - return self._get_all_values("session_type", self.get_session_table, **session_kwargs) - - def get_all_full_genotypes(self, **session_kwargs): - return self._get_all_values("full_genotype", self.get_session_table, **session_kwargs) - - def get_structure_acronyms(self, **channel_kwargs) -> List[str]: - return self._get_all_values("ecephys_structure_acronym", self.get_channels, **channel_kwargs) - - def get_all_ages(self, **session_kwargs): - return self._get_all_values("age_in_days", self.get_session_table, **session_kwargs) - - def get_all_sexes(self, **session_kwargs): - return self._get_all_values("sex", self.get_session_table, **session_kwargs) - - def _get_all_values(self, key, method=None, **method_kwargs) -> List[Any]: - if method is None: - method = self.get_session_table - data = method(**method_kwargs) - return data[key].unique().tolist() - - def get_unit_analysis_metrics_for_session(self, session_id, annotate: bool = True, filter_by_validity: bool = True, **unit_filter_kwargs): - """ Cache and return a table of analysis metrics calculated on each unit from a specified session. See - get_session_table for a list of sessions. - - Parameters - ---------- - session_id : int - identifies the session from which to fetch analysis metrics. - annotate : bool, optional - if True, information from the annotated units table will be merged onto the outputs - filter_by_validity : bool, optional - Filter units used by analysis so that only 'valid' units are returned, by default True - **unit_filter_kwargs : - Additional keyword arguments that can be used to filter units (for power users). - - Returns - ------- - metrics : pd.DataFrame - Each row corresponds to a single unit, describing a set of analysis metrics calculated on that unit. - - """ - - path = self.get_cache_path(None, self.SESSION_ANALYSIS_METRICS_KEY, session_id, session_id) - fetch_metrics = partial(self.fetch_api.get_unit_analysis_metrics, ecephys_session_ids=[session_id]) - - metrics = one_file_call_caching(path, fetch_metrics, write_metrics_csv, read_metrics_csv, num_tries=self.fetch_tries) - - if annotate: - units = self.get_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) - units = units[units["ecephys_session_id"] == session_id] - metrics = pd.merge(units, metrics, left_index=True, right_index=True, how="inner") - metrics.index.rename("ecephys_unit_id", inplace=True) - - return metrics - - def get_unit_analysis_metrics_by_session_type(self, session_type, annotate: bool = True, filter_by_validity: bool = True, **unit_filter_kwargs): - """ Cache and return a table of analysis metrics calculated on each unit from a specified session type. See - get_all_session_types for a list of session types. - - Parameters - ---------- - session_type : str - identifies the session type for which to fetch analysis metrics. - annotate : bool, optional - if True, information from the annotated units table will be merged onto the outputs - filter_by_validity : bool, optional - Filter units used by analysis so that only 'valid' units are returned, by default True - **unit_filter_kwargs : - Additional keyword arguments that can be used to filter units (for power users). - - Returns - ------- - metrics : pd.DataFrame - Each row corresponds to a single unit, describing a set of analysis metrics calculated on that unit. - - """ - - known_session_types = self.get_all_session_types() - if session_type not in known_session_types: - raise ValueError(f"unrecognized session type: {session_type}. Available types: {known_session_types}") - - path = self.get_cache_path(None, self.TYPEWISE_ANALYSIS_METRICS_KEY, session_type) - fetch_metrics = partial(self.fetch_api.get_unit_analysis_metrics, session_types=[session_type]) - - metrics = one_file_call_caching( - path, - fetch_metrics, - write_metrics_csv, - read_metrics_csv, - num_tries=self.fetch_tries - ) - - if annotate: - units = self.get_units(filter_by_validity=filter_by_validity, **unit_filter_kwargs) - metrics = pd.merge(units, metrics, left_index=True, right_index=True, how="inner") - metrics.index.rename("ecephys_unit_id", inplace=True) - - return metrics - - def add_manifest_paths(self, manifest_builder): - manifest_builder = super(EcephysProjectCache, self).add_manifest_paths(manifest_builder) - - manifest_builder.add_path( - self.SESSIONS_KEY, 'sessions.csv', parent_key='BASEDIR', typename='file' - ) - - manifest_builder.add_path( - self.PROBES_KEY, 'probes.csv', parent_key='BASEDIR', typename='file' - ) - - manifest_builder.add_path( - self.CHANNELS_KEY, 'channels.csv', parent_key='BASEDIR', typename='file' - ) - - manifest_builder.add_path( - self.UNITS_KEY, 'units.csv', parent_key='BASEDIR', typename='file' - ) - - manifest_builder.add_path( - self.SESSION_DIR_KEY, 'session_%d', parent_key='BASEDIR', typename='dir' - ) - - manifest_builder.add_path( - self.SESSION_NWB_KEY, 'session_%d.nwb', parent_key=self.SESSION_DIR_KEY, typename='file' - ) - - manifest_builder.add_path( - self.SESSION_ANALYSIS_METRICS_KEY, 'session_%d_analysis_metrics.csv', parent_key=self.SESSION_DIR_KEY, typename='file' - ) - - manifest_builder.add_path( - self.PROBE_LFP_NWB_KEY, 'probe_%d_lfp.nwb', parent_key=self.SESSION_DIR_KEY, typename='file' - ) - - manifest_builder.add_path( - self.NATURAL_MOVIE_DIR_KEY, "natural_movie_templates", parent_key="BASEDIR", typename="dir" - ) - - manifest_builder.add_path( - self.TYPEWISE_ANALYSIS_METRICS_KEY, "%s_analysis_metrics.csv", parent_key='BASEDIR', typename="file" - ) - - manifest_builder.add_path( - self.NATURAL_MOVIE_KEY, "natural_movie_%d.h5", parent_key=self.NATURAL_MOVIE_DIR_KEY, typename="file" - ) - - manifest_builder.add_path( - self.NATURAL_SCENE_DIR_KEY, "natural_scene_templates", parent_key="BASEDIR", typename="dir" - ) - - manifest_builder.add_path( - self.NATURAL_SCENE_KEY, "natural_scene_%d.tiff", parent_key=self.NATURAL_SCENE_DIR_KEY, typename="file" - ) - - return manifest_builder - - @classmethod - def _from_http_source_default(cls, fetch_api_cls, fetch_api_kwargs, **kwargs): - fetch_api_kwargs = { - "asynchronous": True - } if fetch_api_kwargs is None else fetch_api_kwargs - - if kwargs.get("stream_writer") is None: - if fetch_api_kwargs.get("asynchronous", True): - kwargs["stream_writer"] = write_bytes_from_coroutine - else: - kwargs["stream_writer"] = write_from_stream - - return cls( - fetch_api=fetch_api_cls.default(**fetch_api_kwargs), - **kwargs - ) - - @classmethod - def from_lims(cls, lims_credentials: Optional[DbCredentials] = None, - scheme: Optional[str] = None, - host: Optional[str] = None, - asynchronous: bool = False, - manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None, - cache: bool = True, - fetch_tries: int = 2): - """ - Create an instance of EcephysProjectCache with an - EcephysProjectLimsApi. Retrieves bleeding-edge data stored - locally on Allen Institute servers. Only available for use - on-site at the Allen Institute or through a vpn. Requires Allen - Institute database credentials. - - Parameters - ========== - lims_credentials : DbCredentials - Credentials to access LIMS database. If not provided will - attempt to find credentials in environment variables. - scheme : str - URI scheme, such as "http". Defaults to - EcephysProjectLimsApi.default value if unspecified. - Will not be used unless `host` is also specified. - host : str - Web host. Defaults to EcephysProjectLimsApi.default - value if unspecified. Will not be used unless `scheme` is - also specified. - asynchronous : bool - Whether to fetch file asynchronously. Defaults to False. - manifest : str or Path - full path at which manifest json will be stored - version : str - version of manifest file. If this mismatches the version - recorded in the file at manifest, an error will be raised. - cache: bool - Whether to write to the cache (default=True) - fetch_tries : int - Maximum number of times to attempt a download before giving up and - raising an exception. Note that this is total tries, not retries - """ - if scheme and host: - app_kwargs = {"scheme": scheme, "host": host} - else: - app_kwargs = None - return cls._from_http_source_default( - EcephysProjectLimsApi, - {"lims_credentials": lims_credentials, - "app_kwargs": app_kwargs, - "asynchronous": asynchronous, - }, # expects dictionary of kwargs - manifest=manifest, version=version, cache=cache, - fetch_tries=fetch_tries) - - @classmethod - def from_warehouse(cls, - scheme: Optional[str] = None, - host: Optional[str] = None, - asynchronous: bool = False, - manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None, - cache: bool = True, - fetch_tries: int = 2, - timeout: int = 1200): - """ - Create an instance of EcephysProjectCache with an - EcephysProjectWarehouseApi. Retrieves released data stored in - the warehouse. - - Parameters - ========== - scheme : str - URI scheme, such as "http". Defaults to - EcephysProjectWarehouseAPI.default value if unspecified. - Will not be used unless `host` is also specified. - host : str - Web host. Defaults to EcephysProjectWarehouseApi.default - value if unspecified. Will not be used unless `scheme` is also - specified. - asynchronous : bool - Whether to fetch file asynchronously. Defaults to False. - manifest : str or Path - full path at which manifest json will be stored - version : str - version of manifest file. If this mismatches the version - recorded in the file at manifest, an error will be raised. - cache: bool - Whether to write to the cache (default=True) - fetch_tries : int - Maximum number of times to attempt a download before giving up and - raising an exception. Note that this is total tries, not retries - timeout : int - Amount of time (in seconds) to wait on an HTTP request before raising - an error. Increase this duration if you find that warehouse servers - are not responding quickly. Defaults to 1200 seconds (20 minutes). - """ - if scheme and host: - app_kwargs = {"scheme": scheme, "host": host, - "asynchronous": asynchronous} - else: - app_kwargs = {"asynchronous": asynchronous} - app_kwargs['timeout'] = timeout - return cls._from_http_source_default( - EcephysProjectWarehouseApi, app_kwargs, manifest=manifest, - version=version, cache=cache, fetch_tries=fetch_tries - ) - - @classmethod - def fixed(cls, manifest: Optional[Union[str, Path]] = None, - version: Optional[str] = None): - """ - Creates a EcephysProjectCache that refuses to fetch any data - - only the existing local cache is accessible. Useful if you - want to settle on a fixed dataset for analysis. - - Parameters - ========== - manifest : str or Path - full path to existing manifest json - version : str - version of manifest file. If this mismatches the version - recorded in the file at manifest, an error will be raised. - """ - return cls(fetch_api=EcephysProjectFixedApi(), manifest=manifest, - version=version) - - -def count_owned(this, other, foreign_key, count_key, inplace=False): - if not inplace: - this = this.copy() - - counts = other.loc[:, foreign_key].value_counts() - this[count_key] = 0 - this.loc[counts.index.values, count_key] = counts.values - - if not inplace: - return this - - -def get_grouped_uniques(this, other, foreign_key, field_key, unique_key, inplace=False): - if not inplace: - this = this.copy() - - uniques = other.groupby(foreign_key)\ - .apply(lambda grp: pd.DataFrame(grp)[field_key].unique()) - this[unique_key] = 0 - this.loc[uniques.index.values, unique_key] = uniques.values - - if not inplace: - return this - - -def read_csv(path) -> pd.DataFrame: - return pd.read_csv(path, index_col="id") - - -def write_csv(path, df): - df.to_csv(path) - - -def write_metrics_csv(path, df): - df.to_csv(path) - - -def read_metrics_csv(path): - return pd.read_csv(path, index_col='ecephys_unit_id') - - -def read_scene(path): - return sitk.GetArrayFromImage(sitk.ReadImage(path)) - - -def read_movie(path): - return np.load(path, allow_pickle=False) - - -def read_nwb(path): - reader = pynwb.NWBHDF5IO(str(path), 'r') - nwbfile = reader.read() - nwbfile.identifier # if the file is corrupt, make sure an exception gets raised during read - return nwbfile diff --git a/allensdk/brain_observatory/ecephys/ecephys_session.py b/allensdk/brain_observatory/ecephys/ecephys_session.py deleted file mode 100644 index 8f9a8429aa..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_session.py +++ /dev/null @@ -1,1239 +0,0 @@ -import warnings -from collections.abc import Collection -from collections import defaultdict -from typing import Optional - -import xarray as xr -import numpy as np -import pandas as pd -import scipy.stats - -from allensdk.core.lazy_property import LazyPropertyMixin -from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi, EcephysNwbSessionApi, EcephysNwb1Api -from allensdk.brain_observatory.ecephys.stimulus_table import naming_utilities -from allensdk.brain_observatory.ecephys.stimulus_table._schemas import default_stimulus_renames, default_column_renames - - -NON_STIMULUS_PARAMETERS = tuple([ - 'start_time', - 'stop_time', - 'duration', - 'stimulus_block', - "stimulus_condition_id" -]) # stimulus_presentation column names not describing a parameter of a stimulus - - -class EcephysSession(LazyPropertyMixin): - ''' Represents data from a single EcephysSession - - Attributes - ---------- - units : pd.Dataframe - A table whose rows are sorted units (putative neurons) and whose columns are characteristics - of those units. - Index is: - unit_id : int - Unique integer identifier for this unit. - Columns are: - firing_rate : float - This unit's firing rate (spikes / s) calculated over the window of that unit's activity - (the time from its first detected spike to its last). - isi_violations : float - Estamate of this unit's contamination rate (larger means that more of the spikes assigned - to this unit probably originated from other neurons). Calculated as a ratio of the firing - rate of the unit over periods where spikes would be isi-violating vs the total firing - rate of the unit. - peak_channel_id : int - Unique integer identifier for this unit's peak channel. A unit's peak channel is the channel on - which its peak-to-trough amplitude difference is maximized. This is assessed using the kilosort 2 - templates rather than the mean waveforms for a unit. - snr : float - Signal to noise ratio for this unit. - probe_horizontal_position : numeric - The horizontal (short-axis) position of this unit's peak channel in microns. - probe_vertical_position : numeric - The vertical (long-axis, lower values are closer to the probe base) position of - this unit's peak channel in microns. - probe_id : int - Unique integer identifier for this unit's probe. - probe_description : str - Human-readable description carrying miscellaneous information about this unit's probe. - location : str - Gross-scale location of this unit's probe. - spike_times : dict - Maps integer unit ids to arrays of spike times (float) for those units. - running_speed : RunningSpeed - NamedTuple with two fields - timestamps : numpy.ndarray - Timestamps of running speed data samples - values : np.ndarray - Running speed of the experimental subject (in cm / s). - mean_waveforms : dict - Maps integer unit ids to xarray.DataArrays containing mean spike waveforms for that unit. - stimulus_presentations : pd.DataFrame - Table whose rows are stimulus presentations and whose columns are presentation characteristics. - A stimulus presentation is the smallest unit of distinct stimulus presentation and lasts for - (usually) 1 60hz frame. Since not all parameters are relevant to all stimuli, this table - contains many 'null' values. - Index is - stimulus_presentation_id : int - Unique identifier for this stimulus presentation - Columns are - start_time : float - Time (s) at which this presentation began - stop_time : float - Time (s) at which this presentation ended - duration : float - stop_time - start_time (s). Included for convenience. - stimulus_name : str - Identifies the stimulus family (e.g. "drifting_gratings" or "natural_movie_3") used - for this presentation. The stimulus family, along with relevant parameter values, provides the - information required to reconstruct the stimulus presented during this presentation. The empty - string indicates a blank period. - stimulus_block : numeric - A stimulus block is made by sequentially presenting presentations from the same stimulus family. - This value is the index of the block which contains this presentation. During a blank period, - this is 'null'. - TF : float - Temporal frequency, or 'null' when not appropriate. - SF : float - Spatial frequency, or 'null' when not appropriate - Ori : float - Orientation (in degrees) or 'null' when not appropriate - Contrast : float - Pos_x : float - Pos_y : float - Color : numeric - Image : numeric - Phase : float - stimulus_condition_id : integer - identifies the session-unique stimulus condition (permutation of parameters) to which this presentation - belongs - stimulus_conditions : pd.DataFrame - Each row is a unique permutation (within this session) of stimulus parameters presented during this experiment. - Columns are as stimulus presentations, sans start_time, end_time, stimulus_block, and duration. - inter_presentation_intervals : pd.DataFrame - The elapsed time between each immediately sequential pair of stimulus presentations. This is a dataframe with a - two-level multiindex (levels are 'from_presentation_id' and 'to_presentation_id'). It has a single column, - 'interval', which reports the elapsed time between the two presentations in seconds on the experiment's master - clock. - - ''' - - DETAILED_STIMULUS_PARAMETERS = ( - "colorSpace", - "flipHoriz", - "flipVert", - "depth", - "interpolate", - "mask", - "opacity", - "rgbPedestal", - "tex", - "texRes", - "units", - "rgb", - "signalDots", - "noiseDots", - "fieldSize", - "fieldShape", - "fieldPos", - "nDots", - "dotSize", - "dotLife", - "color_triplet" - ) - - @property - def num_units(self): - return self._units.shape[0] - - @property - def num_probes(self): - return self.probes.shape[0] - - @property - def num_channels(self): - return self.channels.shape[0] - - @property - def num_stimulus_presentations(self): - return self.stimulus_presentations.shape[0] - - @property - def stimulus_names(self): - return self.stimulus_presentations['stimulus_name'].unique().tolist() - - @property - def stimulus_conditions(self): - self.stimulus_presentations - return self._stimulus_conditions - - @property - def rig_geometry_data(self): - if self._rig_metadata: - return self._rig_metadata["geometry"] - else: - return None - - @property - def rig_equipment_name(self): - if self._rig_metadata: - return self._rig_metadata["equipment"] - else: - return None - - @property - def specimen_name(self): - return self._metadata["specimen_name"] - - @property - def age_in_days(self): - return self._metadata["age_in_days"] - - @property - def sex(self): - return self._metadata["sex"] - - @property - def full_genotype(self): - return self._metadata["full_genotype"] - - @property - def session_type(self): - return self._metadata["stimulus_name"] - - @property - def units(self): - return self._units.drop(columns=['width_rf', 'height_rf', - 'on_screen_rf', 'time_to_peak_fl', - 'time_to_peak_rf', 'time_to_peak_sg', - 'sustained_idx_fl', 'time_to_peak_dg'], - errors='ignore') - - @property - def structure_acronyms(self): - return self.channels["ecephys_structure_acronym"].unique().tolist() - - @property - def structurewise_unit_counts(self): - return self.units["ecephys_structure_acronym"].value_counts() - - @property - def metadata(self): - return { - "specimen_name": self.specimen_name, - "session_type": self.session_type, - "full_genotype": self.full_genotype, - "sex": self.sex, - "age_in_days": self.age_in_days, - "rig_equipment_name": self.rig_equipment_name, - "num_units": self.num_units, - "num_channels": self.num_channels, - "num_probes": self.num_probes, - "num_stimulus_presentations": self.num_stimulus_presentations, - "session_start_time": self.session_start_time, - "ecephys_session_id": self.ecephys_session_id, - "structure_acronyms": self.structure_acronyms, - "stimulus_names": self.stimulus_names - } - - @property - def stimulus_presentations(self): - return self.__class__._remove_detailed_stimulus_parameters(self._stimulus_presentations) - - @property - def spike_times(self): - if not hasattr(self, "_accessed_spike_times"): - self._accessed_spike_times = True - self._warn_invalid_spike_intervals() - - return self._spike_times - - def __init__( - self, - api: EcephysSessionApi, - test: bool = False, - **kwargs - ): - """ Construct an EcephysSession object, which provides access to - detailed data for a single extracellular electrophysiology - (neuropixels) session. - - Parameters - ---------- - api : - Used to access data, which is then cached on this object. Must - expose the EcephysSessionApi interface. Standard options include - instances of: - EcephysSessionNwbApi :: reads data from a neurodata without - borders 2.0 file. - test : - If true, check during construction that this session's api is - valid. - - """ - - self.api: EcephysSessionApi = api - - self.ecephys_session_id = self.LazyProperty(self.api.get_ecephys_session_id) - self.session_start_time = self.LazyProperty(self.api.get_session_start_time) - self.running_speed = self.LazyProperty(self.api.get_running_speed) - self.mean_waveforms = self.LazyProperty(self.api.get_mean_waveforms, wrappers=[self._build_mean_waveforms]) - self._spike_times = self.LazyProperty(self.api.get_spike_times, wrappers=[self._build_spike_times]) - self.optogenetic_stimulation_epochs = self.LazyProperty(self.api.get_optogenetic_stimulation) - self.spike_amplitudes = self.LazyProperty(self.api.get_spike_amplitudes) - - self.probes = self.LazyProperty(self.api.get_probes) - self.channels = self.LazyProperty(self.api.get_channels) - - self._stimulus_presentations = self.LazyProperty(self.api.get_stimulus_presentations, - wrappers=[self._build_stimulus_presentations, self._mask_invalid_stimulus_presentations]) - self.inter_presentation_intervals = self.LazyProperty(self._build_inter_presentation_intervals) - self.invalid_times = self.LazyProperty(self.api.get_invalid_times) - - self._units = self.LazyProperty(self.api.get_units, wrappers=[self._build_units_table]) - self._rig_metadata = self.LazyProperty(self.api.get_rig_metadata) - self._metadata = self.LazyProperty(self.api.get_metadata) - - if test: - self.api.test() - - def get_current_source_density(self, probe_id): - """ Obtain current source density (CSD) of trial-averaged response to a flash stimuli for this probe. - See allensdk.brain_observatory.ecephys.current_source_density for details of CSD calculation. - - CSD is computed with a 1D method (second spatial derivative) without prior spatial smoothing - User should apply spatial smoothing of their choice (e.g., Gaussian filter) to the computed CSD - - - Parameters - ---------- - probe_id : int - identify the probe whose CSD data ought to be loaded - - Returns - ------- - xr.DataArray : - dimensions are channel (id) and time (seconds, relative to stimulus onset). Values are current source - density assessed on that channel at that time (V/m^2) - - """ - - return self.api.get_current_source_density(probe_id) - - def get_lfp(self, probe_id, mask_invalid_intervals=True): - ''' Load an xarray DataArray with LFP data from channels on a single probe - - Parameters - ---------- - probe_id : int - identify the probe whose LFP data ought to be loaded - mask_invalid_intervals : bool - if True (default) will mask data in the invalid intervals with np.nan - Returns - ------- - xr.DataArray : - dimensions are channel (id) and time (seconds). Values are sampled LFP data. - - Notes - ----- - Unlike many other data access methods on this class. This one does not cache the loaded data in memory due to - the large size of the LFP data. - - ''' - - if mask_invalid_intervals: - probe_name = self.probes.loc[probe_id]["description"] - fail_tags = ["all_probes", probe_name] - invalid_time_intervals = self._filter_invalid_times_by_tags(fail_tags) - lfp = self.api.get_lfp(probe_id) - time_points = lfp.time - valid_time_points = self._get_valid_time_points(time_points, invalid_time_intervals) - return lfp.where(cond=valid_time_points) - else: - return self.api.get_lfp(probe_id) - - def _get_valid_time_points(self, time_points, invalid_time_intevals): - - all_time_points = xr.DataArray( - name="time_points", - data=[True] * len(time_points), - dims=['time'], - coords=[time_points] - ) - - valid_time_points = all_time_points - for ix, invalid_time_interval in invalid_time_intevals.iterrows(): - invalid_time_points = (time_points >= invalid_time_interval['start_time']) & (time_points <= invalid_time_interval['stop_time']) - valid_time_points = np.logical_and(valid_time_points, np.logical_not(invalid_time_points)) - - return valid_time_points - - def _filter_invalid_times_by_tags(self, tags): - """ - Parameters - ---------- - invalid_times: pd.DataFrame - of invalid times - tags: list - of tags - - Returns - ------- - pd.DataFrame of invalid times having tags - """ - invalid_times = self.invalid_times.copy() - if not invalid_times.empty: - mask = invalid_times['tags'].apply(lambda x: any([t in x for t in tags])) - invalid_times = invalid_times[mask] - - return invalid_times - - def get_inter_presentation_intervals_for_stimulus(self, stimulus_names): - ''' Get a subset of this session's inter-presentation intervals, filtered by stimulus name. - - Parameters - ---------- - stimulus_names : array-like of str - The names of stimuli to include in the output. - - Returns - ------- - pd.DataFrame : - inter-presentation intervals, filtered to the requested stimulus names. - - ''' - - stimulus_names = coerce_scalar(stimulus_names, f'expected stimulus_names to be a collection (list-like), but found {type(stimulus_names)}: {stimulus_names}') - filtered_presentations = self.stimulus_presentations[self.stimulus_presentations['stimulus_name'].isin(stimulus_names)] - filtered_ids = set(filtered_presentations.index.values) - - return self.inter_presentation_intervals[ - (self.inter_presentation_intervals.index.isin(filtered_ids, level='from_presentation_id')) - & (self.inter_presentation_intervals.index.isin(filtered_ids, level='to_presentation_id')) - ] - - def get_stimulus_table(self, stimulus_names=None, include_detailed_parameters=False, include_unused_parameters=False): - '''Get a subset of stimulus presentations by name, with irrelevant parameters filtered off - - Parameters - ---------- - stimulus_names : array-like of str - The names of stimuli to include in the output. - - Returns - ------- - pd.DataFrame : - Rows are filtered presentations, columns are the relevant subset of stimulus parameters - - ''' - - if stimulus_names is None: - stimulus_names = self.stimulus_names - - stimulus_names = coerce_scalar(stimulus_names, f'expected stimulus_names to be a collection (list-like), but found {type(stimulus_names)}: {stimulus_names}') - presentations = self._stimulus_presentations[self._stimulus_presentations['stimulus_name'].isin(stimulus_names)] - - if not include_detailed_parameters: - presentations = self.__class__._remove_detailed_stimulus_parameters(presentations) - - if not include_unused_parameters: - presentations = removed_unused_stimulus_presentation_columns(presentations) - - return presentations - - def get_stimulus_epochs(self, duration_thresholds=None): - """ Reports continuous periods of time during which a single kind of stimulus was presented -flipVert - Parameters - --------- - duration_thresholds : dict, optional - keys are stimulus names, values are floating point durations in seconds. All epochs with - - a given stimulus name - - a duration shorter than the associated threshold - will be removed from the results - - """ - - if duration_thresholds is None: - duration_thresholds = {"spontaneous_activity": 90.0} - - presentations = self.stimulus_presentations.copy() - diff_indices = nan_intervals(presentations["stimulus_block"].values) - - epochs = [] - for left, right in zip(diff_indices[:-1], diff_indices[1:]): - epochs.append({ - "start_time": presentations.iloc[left]["start_time"], - "stop_time": presentations.iloc[right - 1]["stop_time"], - "stimulus_name": presentations.iloc[left]["stimulus_name"], - "stimulus_block": presentations.iloc[left]["stimulus_block"] - }) - epochs = pd.DataFrame(epochs) - epochs["duration"] = epochs["stop_time"] - epochs["start_time"] - - for key, threshold in duration_thresholds.items(): - epochs = epochs[ - (epochs["stimulus_name"] != key) - | (epochs["duration"] >= threshold) - ] - - return epochs.loc[:, ["start_time", "stop_time", "duration", "stimulus_name", "stimulus_block"]] - - def get_invalid_times(self): - """ Report invalid time intervals with tags describing the scope of invalid data - - The tags format: [scope,scope_id,label] - - scope: - 'EcephysSession': data is invalid across session - 'EcephysProbe': data is invalid for a single probe - label: - 'all_probes': gain fluctuations on the Neuropixels probe result in missed spikes and LFP saturation events - 'stimulus' : very long frames (>3x the normal frame length) make any stimulus-locked analysis invalid - 'probe#': probe # stopped sending data during this interval (spikes and LFP samples will be missing) - 'optotagging': missing optotagging data - - Returns - ------- - pd.DataFrame : - Rows are invalid intervals, columns are 'start_time' (s), 'stop_time' (s), 'tags' - """ - - return self.invalid_times - - def get_screen_gaze_data(self, include_filtered_data=False) -> Optional[pd.DataFrame]: - """Return a dataframe with estimated gaze position on screen. - - Parameters - ---------- - include_filtered_data : bool, optional - Whether to include filtered version of data (where filtered - values are replaced by NaN), by default False. - - Returns - ------- - pd.DataFrame - Contains columns for estimated gaze position: - *_eye_area - *_pupil_area - *_screen_coordinates_x_cm - *_screen_coordinates_y_cm - *_screen_coordinates_spherical_x_deg - *_screen_coorindates_spherical_y_deg - """ - return self.api.get_screen_gaze_data(include_filtered_data=include_filtered_data) - - def get_pupil_data(self) -> Optional[pd.DataFrame]: - """Return a dataframe with eye tracking ellipse fit data - - - Returns - ------- - pd.DataFrame - Contains eye, pupil and corneal reflection (cr) ellipse fits: - *_center_x - *_center_y - *_height - *_width - *_phi - """ - return self.api.get_pupil_data() - - def _mask_invalid_stimulus_presentations(self, stimulus_presentations): - """Mask invalid stimulus presentations - - Find stimulus presentations overlapping with invalid times - Mask stimulus names with "invalid_presentation", keep "start_time" and "stop_time", mask remaining data with np.nan - - Parameters - ---------- - stimulus_presentations : pd.DataFrame - table including all stimulus presentations - - Returns - ------- - pd.DataFrame : - table with masked invalid presentations - - """ - - fail_tags = ["stimulus"] - invalid_times = self._filter_invalid_times_by_tags(fail_tags) - - for ix_sp, sp in stimulus_presentations.iterrows(): - stim_epoch = sp['start_time'], sp['stop_time'] - - for ix_it, it in invalid_times.iterrows(): - invalid_interval = it['start_time'], it['stop_time'] - if _overlap(stim_epoch, invalid_interval): - stimulus_presentations.iloc[ix_sp, :] = np.nan - stimulus_presentations.at[ix_sp, "stimulus_name"] = "invalid_presentation" - stimulus_presentations.at[ix_sp, "start_time"] = stim_epoch[0] - stimulus_presentations.at[ix_sp, "stop_time"] = stim_epoch[1] - - return stimulus_presentations - - def presentationwise_spike_counts( - self, - bin_edges, - stimulus_presentation_ids, - unit_ids, - binarize=False, - dtype=None, - large_bin_size_threshold=0.001, - time_domain_callback=None - ): - ''' Build an array of spike counts surrounding stimulus onset per unit and stimulus frame. - - Parameters - --------- - bin_edges : numpy.ndarray - Spikes will be counted into the bins defined by these edges. Values are in seconds, relative - to stimulus onset. - stimulus_presentation_ids : array-like - Filter to these stimulus presentations - unit_ids : array-like - Filter to these units - binarize : bool, optional - If true, all counts greater than 0 will be treated as 1. This results in lower storage overhead, - but is only reasonable if bin sizes are fine (<= 1 millisecond). - large_bin_size_threshold : float, optional - If binarize is True and the largest bin width is greater than this value, a warning will be emitted. - time_domain_callback : callable, optional - The time domain is a numpy array whose values are trial-aligned bin - edges (each row is aligned to a different trial). This optional function will be - applied to the time domain before counting spikes. - - Returns - ------- - xarray.DataArray : - Data array whose dimensions are stimulus presentation, unit, - and time bin and whose values are spike counts. - - ''' - - stimulus_presentations = self._filter_owned_df('stimulus_presentations', ids=stimulus_presentation_ids) - units = self._filter_owned_df('units', ids=unit_ids) - - largest_bin_size = np.amax(np.diff(bin_edges)) - if binarize and largest_bin_size > large_bin_size_threshold: - warnings.warn( - f'You\'ve elected to binarize spike counts, but your maximum bin width is {largest_bin_size:2.5f} seconds. ' - 'Binarizing spike counts with such a large bin width can cause significant loss of accuracy! ' - f'Please consider only binarizing spike counts when your bins are <= {large_bin_size_threshold} seconds wide.' - ) - - bin_edges = np.array(bin_edges) - domain = build_time_window_domain(bin_edges, stimulus_presentations['start_time'].values, callback=time_domain_callback) - - out_of_order = np.where(np.diff(domain, axis=1) < 0) - if len(out_of_order[0]) > 0: - out_of_order_time_bins = [(row, col) for row, col in zip(out_of_order)] - raise ValueError(f"The time domain specified contains out-of-order bin edges at indices: {out_of_order_time_bins}") - - ends = domain[:, -1] - starts = domain[:, 0] - time_diffs = starts[1:] - ends[:-1] - overlapping = np.where(time_diffs < 0)[0] - - if len(overlapping) > 0: - # Ignoring intervals that overlaps multiple time bins because trying to figure that out would take O(n) - overlapping = [(s, s + 1) for s in overlapping] - warnings.warn(f"You've specified some overlapping time intervals between neighboring rows: {overlapping}, " - f"with a maximum overlap of {np.abs(np.min(time_diffs))} seconds.") - - tiled_data = build_spike_histogram( - domain, self.spike_times, units.index.values, dtype=dtype, binarize=binarize - ) - - tiled_data = xr.DataArray( - name='spike_counts', - data=tiled_data, - coords={ - 'stimulus_presentation_id': stimulus_presentations.index.values, - 'time_relative_to_stimulus_onset': bin_edges[:-1] + np.diff(bin_edges) / 2, - 'unit_id': units.index.values - }, - dims=['stimulus_presentation_id', 'time_relative_to_stimulus_onset', 'unit_id'] - ) - - return tiled_data - - def presentationwise_spike_times(self, stimulus_presentation_ids=None, unit_ids=None): - ''' Produce a table associating spike times with units and stimulus presentations - - Parameters - ---------- - stimulus_presentation_ids : array-like - Filter to these stimulus presentations - unit_ids : array-like - Filter to these units - - Returns - ------- - pandas.DataFrame : - Index is - spike_time : float - On the session's master clock. - Columns are - stimulus_presentation_id : int - The stimulus presentation on which this spike occurred. - unit_id : int - The unit that emitted this spike. - ''' - - stimulus_presentations = self._filter_owned_df('stimulus_presentations', ids=stimulus_presentation_ids) - units = self._filter_owned_df('units', ids=unit_ids) - - presentation_times = np.zeros([stimulus_presentations.shape[0] * 2]) - presentation_times[::2] = np.array(stimulus_presentations['start_time']) - presentation_times[1::2] = np.array(stimulus_presentations['stop_time']) - all_presentation_ids = np.array(stimulus_presentations.index.values) - - presentation_ids = [] - unit_ids = [] - spike_times = [] - - for ii, unit_id in enumerate(units.index.values): - data = self.spike_times[unit_id] - indices = np.searchsorted(presentation_times, data) - 1 - - index_valid = indices % 2 == 0 - presentations = all_presentation_ids[np.floor(indices / 2).astype(int)] - - sorder = np.argsort(presentations) - presentations = presentations[sorder] - index_valid = index_valid[sorder] - data = data[sorder] - - changes = np.where(np.ediff1d(presentations, to_begin=1, to_end=1))[0] - for ii, jj in zip(changes[:-1], changes[1:]): - values = data[ii:jj][index_valid[ii:jj]] - if values.size == 0: - continue - - unit_ids.append(np.zeros([values.size]) + unit_id) - presentation_ids.append(np.zeros([values.size]) + presentations[ii]) - spike_times.append(values) - - if not spike_times: - # If there are no units firing during the given stimulus return an empty dataframe - return pd.DataFrame(columns=['spike_times', 'stimulus_presentation', - 'unit_id', 'time_since_stimulus_presentation_onset']) - - spike_df = pd.DataFrame({ - 'stimulus_presentation_id': np.concatenate(presentation_ids).astype(int), - 'unit_id': np.concatenate(unit_ids).astype(int) - }, index=pd.Index(np.concatenate(spike_times), name='spike_time')) - - # Add time since stimulus presentation onset - onset_times = self._filter_owned_df( - "stimulus_presentations", ids=all_presentation_ids)["start_time"] - spikes_with_onset = spike_df.join(onset_times, - on=["stimulus_presentation_id"]) - spikes_with_onset["time_since_stimulus_presentation_onset"] = ( - spikes_with_onset.index - spikes_with_onset["start_time"] - ) - spikes_with_onset.sort_values('spike_time', axis=0, inplace=True) - spikes_with_onset.drop(columns=["start_time"], inplace=True) - return spikes_with_onset - - def conditionwise_spike_statistics(self, stimulus_presentation_ids=None, unit_ids=None, use_rates=False): - """ Produce summary statistics for each distinct stimulus condition - - Parameters - ---------- - stimulus_presentation_ids : array-like - identifies stimulus presentations from which spikes will be considered - unit_ids : array-like - identifies units whose spikes will be considered - use_rates : bool, optional - If True, use firing rates. If False, use spike counts. - - Returns - ------- - pd.DataFrame : - Rows are indexed by unit id and stimulus condition id. Values are summary statistics describing spikes - emitted by a specific unit across presentations within a specific condition. - - """ - # TODO: Need to return an empty df if no matching unit-ids or presentation-ids are found - # TODO: To use filter_owned_df() make sure to convert the results from a Series to a Dataframe - stimulus_presentation_ids = (stimulus_presentation_ids if stimulus_presentation_ids is not None - else self.stimulus_presentations.index.values) # In case - presentations = self.stimulus_presentations.loc[stimulus_presentation_ids, ["stimulus_condition_id", "duration"]] - - spikes = self.presentationwise_spike_times( - stimulus_presentation_ids=stimulus_presentation_ids, unit_ids=unit_ids - ) - - if spikes.empty: - # In the case there are no spikes - spike_counts = pd.DataFrame({'spike_count': 0}, - index=pd.MultiIndex.from_product([stimulus_presentation_ids, unit_ids], - names=['stimulus_presentation_id', 'unit_id'])) - - else: - spike_counts = spikes.copy() - spike_counts["spike_count"] = np.zeros(spike_counts.shape[0]) - spike_counts = spike_counts.groupby(["stimulus_presentation_id", "unit_id"]).count() - unit_ids = unit_ids if unit_ids is not None else spikes['unit_id'].unique() # If not explicity stated get unit ids from spikes table. - spike_counts = spike_counts.reindex(pd.MultiIndex.from_product([stimulus_presentation_ids, - unit_ids], - names=['stimulus_presentation_id', - 'unit_id']), fill_value=0) - - sp = pd.merge(spike_counts, presentations, left_on="stimulus_presentation_id", right_index=True, how="left") - sp.reset_index(inplace=True) - - if use_rates: - sp["spike_rate"] = sp["spike_count"] / sp["duration"] - sp.drop(columns=["spike_count"], inplace=True) - extractor = _extract_summary_rate_statistics - else: - sp.drop(columns=["duration"]) - extractor = _extract_summary_count_statistics - - summary = [] - for ind, gr in sp.groupby(["stimulus_condition_id", "unit_id"]): - summary.append(extractor(ind, gr)) - - return pd.DataFrame(summary).set_index(keys=["unit_id", "stimulus_condition_id"]) - - def get_parameter_values_for_stimulus(self, stimulus_name, drop_nulls=True): - """ For each stimulus parameter, report the unique values taken on by that - parameter while a named stimulus was presented. - - Parameters - ---------- - stimulus_name : str - filter to presentations of this stimulus - - Returns - ------- - dict : - maps parameters (column names) to their unique values. - - """ - - presentation_ids = self.get_stimulus_table([stimulus_name]).index.values - return self.get_stimulus_parameter_values(presentation_ids, drop_nulls=drop_nulls) - - def get_stimulus_parameter_values(self, stimulus_presentation_ids=None, drop_nulls=True): - ''' For each stimulus parameter, report the unique values taken on by that - parameter throughout the course of the session. - - Parameters - ---------- - stimulus_presentation_ids : array-like, optional - If provided, only parameter values from these stimulus presentations will be considered. - - Returns - ------- - dict : - maps parameters (column names) to their unique values. - - ''' - - stimulus_presentations = self._filter_owned_df('stimulus_presentations', ids=stimulus_presentation_ids) - stimulus_presentations = stimulus_presentations.drop(columns=list(NON_STIMULUS_PARAMETERS) + ['stimulus_name']) - stimulus_presentations = removed_unused_stimulus_presentation_columns(stimulus_presentations) - - parameters = {} - for colname in stimulus_presentations.columns: - uniques = stimulus_presentations[colname].unique() - - non_null = np.array(uniques[uniques != "null"]) - non_null = non_null - non_null = np.sort(non_null) - - if not drop_nulls and "null" in uniques: - non_null = np.concatenate([non_null, ["null"]]) - - parameters[colname] = non_null - - return parameters - - def channel_structure_intervals(self, channel_ids): - - """ find on a list of channels the intervals of channels inserted into particular structures - - Parameters - ---------- - channel_ids : list - A list of channel ids - structure_id_key : str - use this column for numerically identifying structures - structure_label_key : str - use this column for human-readable structure identification - - Returns - ------- - labels : np.ndarray - for each detected interval, the label associated with that interval - intervals : np.ndarray - one element longer than labels. Start and end indices for intervals. - - """ - structure_id_key = "ecephys_structure_id" - structure_label_key = "ecephys_structure_acronym" - np.array(channel_ids).sort() - table = self.channels.loc[channel_ids] - - unique_probes = table["probe_id"].unique() - if len(unique_probes) > 1: - warnings.warn("Calculating structure boundaries across channels from multiple probes.") - - intervals = nan_intervals(table[structure_id_key].values) - labels = table[structure_label_key].iloc[intervals[:-1]].values - - return labels, intervals - - def _build_spike_times(self, spike_times): - retained_units = set(self._units.index.values) - output_spike_times = {} - - for unit_id in list(spike_times.keys()): - data = spike_times.pop(unit_id) - if unit_id not in retained_units: - continue - output_spike_times[unit_id] = data - - return output_spike_times - - def _build_stimulus_presentations(self, stimulus_presentations, nonapplicable="null"): - stimulus_presentations.index.name = 'stimulus_presentation_id' - stimulus_presentations = stimulus_presentations.drop(columns=['stimulus_index']) - - # TODO: putting these here for now; after SWDB 2019, will rerun stimulus table module for all sessions - # and can remove these - stimulus_presentations = naming_utilities.collapse_columns(stimulus_presentations) - stimulus_presentations = naming_utilities.standardize_movie_numbers(stimulus_presentations) - stimulus_presentations = naming_utilities.add_number_to_shuffled_movie(stimulus_presentations) - stimulus_presentations = naming_utilities.map_stimulus_names( - stimulus_presentations, default_stimulus_renames - ) - stimulus_presentations = naming_utilities.map_column_names(stimulus_presentations, default_column_renames) - - # pandas groupby ops ignore nans, so we need a new "nonapplicable" value that pandas does not recognize as null ... - stimulus_presentations.replace("", nonapplicable, inplace=True) - stimulus_presentations.fillna(nonapplicable, inplace=True) - - stimulus_presentations['duration'] = stimulus_presentations['stop_time'] - stimulus_presentations['start_time'] - - # TODO: database these - stimulus_conditions = {} - presentation_conditions = [] - cid_counter = -1 - - # TODO: Can we have parameters on what columns to omit? If stimulus_block or duration is left in it can affect - # how conditionwise_spike_statistics counts spikes - params_only = stimulus_presentations.drop(columns=["start_time", "stop_time", "duration", "stimulus_block"]) - for row in params_only.itertuples(index=False): - - if row in stimulus_conditions: - cid = stimulus_conditions[row] - else: - cid_counter += 1 - stimulus_conditions[row] = cid_counter - cid = cid_counter - - presentation_conditions.append(cid) - - cond_ids = [] - cond_vals = [] - - for cv, ci in stimulus_conditions.items(): - cond_ids.append(ci) - cond_vals.append(cv) - - self._stimulus_conditions = pd.DataFrame(cond_vals, index=pd.Index(data=cond_ids, name="stimulus_condition_id")) - stimulus_presentations["stimulus_condition_id"] = presentation_conditions - - return stimulus_presentations - - def _build_units_table(self, units_table): - channels = self.channels.copy() - probes = self.probes.copy() - - self._unmerged_units = units_table.copy() - table = pd.merge(units_table, channels, left_on='peak_channel_id', right_index=True, suffixes=['_unit', '_channel']) - table = pd.merge(table, probes, left_on='probe_id', right_index=True, suffixes=['_unit', '_probe']) - - table.index.name = 'unit_id' - table = table.rename(columns={ - 'description': 'probe_description', - 'local_index_channel': 'channel_local_index', - 'PT_ratio': 'waveform_PT_ratio', - 'amplitude': 'waveform_amplitude', - 'duration': 'waveform_duration', - 'halfwidth': 'waveform_halfwidth', - 'recovery_slope': 'waveform_recovery_slope', - 'repolarization_slope': 'waveform_repolarization_slope', - 'spread': 'waveform_spread', - 'velocity_above': 'waveform_velocity_above', - 'velocity_below': 'waveform_velocity_below', - 'sampling_rate': 'probe_sampling_rate', - 'lfp_sampling_rate': 'probe_lfp_sampling_rate', - 'has_lfp_data': 'probe_has_lfp_data', - 'l_ratio': 'L_ratio', - 'pref_images_multi_ns': 'pref_image_multi_ns', - }) - - return table.sort_values(by=['probe_description', 'probe_vertical_position', 'probe_horizontal_position']) - - def _build_nwb1_waveforms(self, mean_waveforms): - # _build_mean_waveforms() assumes every unit has the same number of waveforms and that a unit-waveform exists - # for all channels. This is not true for NWB 1 files where each unit has ONE waveform on ONE channel - units_df = self._units - output_waveforms = {} - sampling_rate_lu = {uid: self.probes.loc[r['probe_id']]['sampling_rate'] for uid, r in units_df.iterrows()} - - for uid in list(mean_waveforms.keys()): - data = mean_waveforms.pop(uid) - output_waveforms[uid] = xr.DataArray( - data=data, - dims=['channel_id', 'time'], - coords={ - 'channel_id': [units_df.loc[uid]['peak_channel_id']], - 'time': np.arange(data.shape[1]) / sampling_rate_lu[uid] - } - ) - - return output_waveforms - - def _build_mean_waveforms(self, mean_waveforms): - if isinstance(self.api, EcephysNwb1Api): - return self._build_nwb1_waveforms(mean_waveforms) - - channel_id_lut = defaultdict(lambda: -1) - for cid, row in self.channels.iterrows(): - channel_id_lut[(row["local_index"], row["probe_id"])] = cid - - probe_id_lut = {uid: row['probe_id'] for uid, row in self._units.iterrows()} - - output_waveforms = {} - for uid in list(mean_waveforms.keys()): - data = mean_waveforms.pop(uid) - - if uid not in probe_id_lut: # It's been filtered out during unit table generation! - continue - - probe_id = probe_id_lut[uid] - output_waveforms[uid] = xr.DataArray( - data=data, - dims=['channel_id', 'time'], - coords={ - 'channel_id': [channel_id_lut[(ii, probe_id)] for ii in range(data.shape[0])], - 'time': np.arange(data.shape[1]) / self.probes.loc[probe_id]['sampling_rate'] - } - ) - output_waveforms[uid] = output_waveforms[uid][output_waveforms[uid]["channel_id"] != -1] - - return output_waveforms - - def _build_inter_presentation_intervals(self): - intervals = pd.DataFrame({ - 'from_presentation_id': self.stimulus_presentations.index.values[:-1], - 'to_presentation_id': self.stimulus_presentations.index.values[1:], - 'interval': self.stimulus_presentations['start_time'].values[1:] - self.stimulus_presentations['stop_time'].values[:-1] - }) - return intervals.set_index(['from_presentation_id', 'to_presentation_id'], inplace=False) - - def _filter_owned_df(self, key, ids=None, copy=True): - df = getattr(self, key) - - if copy: - df = df.copy() - - if ids is None: - return df - - ids = coerce_scalar(ids, f'a scalar ({ids}) was provided as ids, filtering to a single row of {key}.') - - df = df.loc[ids] - - if df.shape[0] == 0: - warnings.warn(f'filtering to an empty set of {key}!') - - return df - - @classmethod - def _remove_detailed_stimulus_parameters(cls, presentations): - columns = list(cls.DETAILED_STIMULUS_PARAMETERS) - return presentations.drop(columns=columns, errors="ignore") - - @classmethod - def from_nwb_path(cls, path, nwb_version=2, api_kwargs=None, **kwargs): - api_kwargs = {} if api_kwargs is None else api_kwargs - # TODO: Is there a way for pynwb to check the file before actually loading it with io read? If so we could - # automatically check what NWB version is being inputed - - nwb_version = int(nwb_version) # only use major version - if nwb_version >= 2: - NWBAdaptorCls = EcephysNwbSessionApi - - elif nwb_version == 1: - NWBAdaptorCls = EcephysNwb1Api - - else: - raise Exception(f'specified NWB version {nwb_version} not supported. Supported versions are: 2.X, 1.X') - - return cls(api=NWBAdaptorCls.from_path(path=path, **api_kwargs), **kwargs) - - def _warn_invalid_spike_intervals(self): - - fail_tags = list(self.probes["description"]) - fail_tags.append("all_probes") - invalid_time_intervals = self._filter_invalid_times_by_tags(fail_tags) - - if not invalid_time_intervals.empty: - warnings.warn("Session includes invalid time intervals that could be accessed with the attribute 'invalid_times'," - "Spikes within these intervals are invalid and may need to be excluded from the analysis.") - - -def build_spike_histogram(time_domain, spike_times, unit_ids, dtype=None, binarize=False): - - time_domain = np.array(time_domain) - unit_ids = np.array(unit_ids) - - tiled_data = np.zeros( - (time_domain.shape[0], time_domain.shape[1] - 1, unit_ids.size), - dtype=(np.uint8 if binarize else np.uint16) if dtype is None else dtype - ) - - starts = time_domain[:, :-1] - ends = time_domain[:, 1:] - - for ii, unit_id in enumerate(unit_ids): - data = np.array(spike_times[unit_id]) - - start_positions = np.searchsorted(data, starts.flat) - end_positions = np.searchsorted(data, ends.flat, side="right") - counts = (end_positions - start_positions) - - tiled_data[:, :, ii].flat = counts > 0 if binarize else counts - - return tiled_data - - -def build_time_window_domain(bin_edges, offsets, callback=None): - callback = (lambda x: x) if callback is None else callback - domain = np.tile(bin_edges[None, :], (len(offsets), 1)) - domain += offsets[:, None] - return callback(domain) - - -def removed_unused_stimulus_presentation_columns(stimulus_presentations): - to_drop = [] - for cn in stimulus_presentations.columns: - if np.all(stimulus_presentations[cn].isna()): - to_drop.append(cn) - elif np.all(stimulus_presentations[cn].astype(str).values == ''): - to_drop.append(cn) - elif np.all(stimulus_presentations[cn].astype(str).values == 'null'): - to_drop.append(cn) - return stimulus_presentations.drop(columns=to_drop) - - -def nan_intervals(array, nan_like=["null"]): - """ find interval bounds (bounding consecutive identical values) in an array, which may contain nans - - Parameters - ----------- - array : np.ndarray - - Returns - ------- - np.ndarray : - start and end indices of detected intervals (one longer than the number of intervals) - - """ - - intervals = [0] - current = array[0] - for ii, item in enumerate(array[1:]): - if is_distinct_from(item, current): - intervals.append(ii + 1) - current = item - intervals.append(len(array)) - - return np.unique(intervals) - - -def is_distinct_from(left, right): - if type(left) != type(right): - return True - if pd.isna(left) and pd.isna(right): - return False - if left is None and right is None: - return False - - return left != right - - -def array_intervals(array): - """ find interval bounds (bounding consecutive identical values) in an array - - Parameters - ----------- - array : np.ndarray - - Returns - ------- - np.ndarray : - start and end indices of detected intervals (one longer than the number of intervals) - - """ - - changes = np.flatnonzero(np.diff(array)) + 1 - return np.concatenate([[0], changes, [len(array)]]) - - -def coerce_scalar(value, message, warn=False): - if not isinstance(value, Collection) or isinstance(value, str): - if warn: - warnings.warn(message) - return [value] - return value - - -def _extract_summary_count_statistics(index, group): - return { - "stimulus_condition_id": index[0], - "unit_id": index[1], - "spike_count": group["spike_count"].sum(), - "stimulus_presentation_count": group.shape[0], - "spike_mean": np.mean(group["spike_count"].values), - "spike_std": np.std(group["spike_count"].values, ddof=1), - "spike_sem": scipy.stats.sem(group["spike_count"].values) - } - - -def _extract_summary_rate_statistics(index, group): - return { - "stimulus_condition_id": index[0], - "unit_id": index[1], - "stimulus_presentation_count": group.shape[0], - "spike_mean": np.mean(group["spike_rate"].values), - "spike_std": np.std(group["spike_rate"].values, ddof=1), - "spike_sem": scipy.stats.sem(group["spike_rate"].values) - } - - -def _overlap(a, b): - """Check if the two intervals overlap - - Parameters - ---------- - a : tuple - start, stop times - b : tuple - start, stop times - Returns - ------- - bool : True if overlap, otherwise False - """ - return max(a[0], b[0]) <= min(a[1], b[1]) diff --git a/allensdk/brain_observatory/ecephys/ecephys_session_api/__init__.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/__init__.py deleted file mode 100644 index fcfc68ab3f..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_session_api/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .ecephys_session_api import EcephysSessionApi -from .ecephys_nwb_session_api import EcephysNwbSessionApi -from .ecephys_nwb1_session_api import EcephysNwb1Api \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py deleted file mode 100644 index dfde475749..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py +++ /dev/null @@ -1,298 +0,0 @@ -from typing import Dict -import pandas as pd -import numpy as np -import h5py -import collections -import warnings - -# from allensdk.brain_observatory.nwb.nwb_api import NwbApi -from .ecephys_session_api import EcephysSessionApi -from allensdk.brain_observatory.running_speed import RunningSpeed - - -class IDCreator(object): - def __init__(self, init_id=0): - self._c_id = init_id - self._map = {} - - def get_id(self, key): - if key in self._map: - return self._map[key] - else: - id_val = self._c_id - self._c_id += 1 - self._map[key] = id_val - return id_val - - def __getitem__(self, key): - return self.get_id(key) - - def __contains__(self, key): - return isinstance(key, collections.Hashable) - - -class EcephysNwb1Api(EcephysSessionApi): - """An EcephySession adaptor for reading NWB1.0 files. - - Was created by sight using an assortment of existing NWB1 files. It is possible that parts of the NWB1 standard (?!) - is missing or not properly implemented. - - NWB1 vs NWB2 issues: - * In NWB 1 there is no difference between global unit-ids and probe's local-index. A unit is unique to one channel - * Units are missing information about firing_rate, isi_violation, and quality. - - So that EcephysSession._build_units() actually return values I had to set quality=good for all units - * NWB Stimulus_presentations missing stimulus_block, stimulus_index and Image column - - To get EcephysSession.conditionwise_spikes() working had to make up a block number for every stimulus type - * NWB1 missing a 'valid_data' tag for channels. Had to set to True otherwise EcephysSession won't see any channels - * There were no 'channels' table/group in NWB1. Instead we had to iterate through all the units and pull out the - distinct channel info. - * In NWB2 each unit has a mean-waveform for every channel on the probe. In NWB1 A unit only has a single waveform - * The NWB1 identifier is a string - """ - - def __init__(self, path, *args, **kwargs): - self._path = path - self._h5_root = h5py.File(self._path, 'r') - try: - # check file is a valid NWB 1 file - version_str = self._h5_root['nwb_version'][()] - if not (version_str.startswith('NWB-1.') or version_str.startswith('1.')): - raise Exception('{} is not a valid NWB 1 file path'.format(self._path)) - except Exception: - raise - - # EcephysSession requires session wide ids for units/channels/etc but NWB 1 doesn't have such a thing (ids - # are relative to the probe). The following data-stuctures are used build and fetch session ids without having - # to parse all the tables. - self._unit_ids = IDCreator() - self._channel_ids = IDCreator() - self._probe_ids = IDCreator() - - - @property - def processing_grp(self): - return self._h5_root['/processing'] - - @property - def running_speed_grp(self): - return self._h5_root['/acquisition/timeseries/RunningSpeed'] - - def _probe_groups(self): - return [(pname, pgrp) for pname, pgrp in self.processing_grp.items() - if isinstance(pgrp, h5py.Group) and pname.lower().startswith('probe')] - - def get_running_speed(self): - running_speed_grp = self.running_speed_grp - - return pd.DataFrame({ - "start_time": running_speed_grp['timestamps'][:], - "velocity": running_speed_grp['data'][:] # average velocities over a given interval - }) - - __stim_col_map = { - # Used for mapping column names from NWB 1.0 features ds to their appropiate NWB 2.0 name - b'temporal_frequency': 'TF', - b'spatial_frequency': 'SF', - b'pos_x': 'Pos_x', - b'pos_y': 'Pos_y', - b'orientation': 'Ori', - b'color': 'Color', - b'phase': 'Phase', - b'frame': 'Image' - } - - def get_stimulus_presentations(self) -> pd.DataFrame: - # TODO: Missing 'stimulus_block', 'stimulus_index, Image, - stimulus_presentations_df = None - presentation_ids = 0 # make up a id for every stim-presentation - stim_pres_grp = self._h5_root['/stimulus/presentation'] - - # Stimulus-presentations are heirarchily grouped by presentation name. Iterate through all of them and build - # a single table. - for block_i, (stim_name, stim_grp) in enumerate(stim_pres_grp.items()): - timestamps = stim_grp['timestamps'][()] - start_times = timestamps[:, 0] - if timestamps.shape[1] == 2: - stop_times = timestamps[:, 1] - else: - # Some of the datasets have an optotagging stimulus with no stop time. - continue - stop_times = np.nan - - n_stims = stim_grp['num_samples'][()] - try: - # parse the features/data datasets, map old column names (temporal freq->TF, phase-> phase, etc). - stim_props = {self.__stim_col_map.get(ftr_name, ftr_name): stim_grp['data'][:, i] - for i, ftr_name in enumerate(stim_grp['features'][()])} - except Exception: - stim_props = {} - - stim_df = pd.DataFrame({ - 'stimulus_presentation_id': np.arange(presentation_ids, presentation_ids + n_stims), - 'start_time': start_times, - 'stop_time': stop_times, - 'stimulus_name': stim_name, - 'TF': stim_props.get('TF', np.nan), - 'SF': stim_props.get('SF', np.nan), - 'Ori': stim_props.get('Ori', np.nan), - 'Pos_x': stim_props.get('Pos_x', np.nan), - 'Pos_y': stim_props.get('Pos_y', np.nan), - 'Color': stim_props.get('Color', np.nan), - 'Phase': stim_props.get('Phase', np.nan), - 'Image': stim_props.get('Image', np.nan), - 'stimulus_block': block_i # Required by conditionwise_spike_counts(), add made-up number - }) - - presentation_ids += n_stims - if stimulus_presentations_df is None: - stimulus_presentations_df = stim_df - else: - stimulus_presentations_df = stimulus_presentations_df.append(stim_df) - - stimulus_presentations_df['stimulus_index'] = 0 # I'm not sure what column is, but is droped by EcephysSession - stimulus_presentations_df.set_index('stimulus_presentation_id', inplace=True) - return stimulus_presentations_df - - - def get_probes(self) -> pd.DataFrame: - probe_ids = [] - locations = [] - for prb_name, prb_grp in self._probe_groups(): - probe_ids.append(self._probe_ids[prb_name]) - locations.append(prb_name) - - probes_df = pd.DataFrame({ - 'id': pd.Series(probe_ids, dtype=np.uint64), - 'location': pd.Series(locations, dtype=object), - 'description': "" # TODO: Find description - }) - probes_df.set_index('id', inplace=True) - probes_df['sampling_rate'] = 30000.0 # TODO: calculate real sampling rate for each probe. - return probes_df - - - def get_channels(self) -> pd.DataFrame: - # TODO: Missing: manual_structure_id - processing_grp = self.processing_grp - - max_channels = sum(len(prb_grp['unit_list']) for prb_grp in processing_grp.values()) - channel_ids = np.zeros(max_channels, dtype=np.uint64) - local_channel_indices = np.zeros(max_channels, dtype=np.int64) - prb_ids = np.zeros(max_channels, dtype=np.uint64) - prb_hrz_pos = np.zeros(max_channels, dtype=np.int64) - prb_vert_pos = np.zeros(max_channels, dtype=np.int64) - struct_acronyms = np.empty(max_channels, dtype=object) - - channel_indx = 0 - existing_channels = set() - # In NWB 1.0 files I used I couldn't find a channel group/dataset. Instead we have to iterate through all units - # to get information about all available channels - for prb_name, prb_grp in self._probe_groups(): - prb_id = self._probe_ids[prb_name] - unit_list = prb_grp['unit_list'][()] - for indx, uid in enumerate(unit_list): - unit_grp = prb_grp['UnitTimes'][str(uid)] - local_channel_index = unit_grp['channel'][()] - channel_id = self._channel_ids[(prb_name, local_channel_index)] - if channel_id in existing_channels: - # If a channel has already been processed (ie it's shared by another unit) skip it. I'm assuming - # position/ccf info is the same for every probe/channel_id. - continue - else: - channel_ids[channel_indx] = channel_id - local_channel_indices[channel_indx] = local_channel_index - prb_ids[channel_indx] = prb_id - prb_hrz_pos[channel_indx] = unit_grp['xpos_probe'][()] - prb_vert_pos[channel_indx] = unit_grp['ypos_probe'][()] - try: - struct_acronyms[channel_indx] = str(unit_grp['ccf_structure'][()], encoding='ascii') - except TypeError: - struct_acronyms[channel_indx] = unit_grp['ccf_structure'][()] - - - existing_channels.add(channel_id) - channel_indx += 1 - - n_channels = len(existing_channels) - channels_df = pd.DataFrame({ - 'id': channel_ids[:n_channels], - 'local_index': local_channel_indices[:n_channels], - 'probe_id': prb_ids[:n_channels], - 'probe_horizontal_position': prb_hrz_pos[:n_channels], - 'probe_vertical_position': prb_vert_pos[:n_channels], - 'ecephys_structure_acronym': struct_acronyms[:n_channels], - 'valid_data': True # TODO: Pull out valid table column from NWB - }) - channels_df.set_index('id', inplace=True) - return channels_df - - def get_mean_waveforms(self) -> Dict[int, np.ndarray]: - waveforms = {} - for prb_name, prb_grp in self._probe_groups(): - # There is one waveform for any given spike, but still calling it "mean" wavefor - for indx, uid in enumerate(prb_grp['unit_list']): - unit_grp = prb_grp['UnitTimes'][str(uid)] - unit_id = self._unit_ids[(prb_name, uid)] - waveforms[unit_id] = np.array([unit_grp['waveform'][()],]) # EcephysSession is expecting an array of waveforms - - return waveforms - - def get_spike_times(self) -> Dict[int, np.ndarray]: - spike_times = {} - for prb_name, prb_grp in self._probe_groups(): - for indx, uid in enumerate(prb_grp['unit_list']): - unit_grp = prb_grp['UnitTimes'][str(uid)] - unit_id = self._unit_ids[(prb_name, uid)] - spike_times[unit_id] = unit_grp['times'][()] - - return spike_times - - def get_units(self) -> pd.DataFrame: - # TODO: Missing properties: firing_rate, isi_violations - unit_ids = np.zeros(0, dtype=np.uint64) - local_indices = np.zeros(0, dtype=np.int64) - peak_channel_ids = np.zeros(0, dtype=np.int64) - snrs = np.zeros(0, dtype=np.float64) - - for prb_name, prb_grp in self._probe_groups(): - # visit every /processing/probeN/UnitList/N/ group to build - # TODO: Since just visting the tree is so expensive, maybe build the channels and probes at the same time. - unit_list = prb_grp['unit_list'][()] - prb_uids = np.zeros(len(unit_list), dtype=np.uint64) - prb_channels = np.zeros(len(unit_list), dtype=np.int64) - prb_snr = np.zeros(len(unit_list), dtype=np.float64) - for indx, uid in enumerate(unit_list): - unit_grp = prb_grp['UnitTimes'][str(uid)] - prb_uids[indx] = self._unit_ids[(prb_name, uid)] - prb_channels[indx] = self._channel_ids[(prb_name, unit_grp['channel'][()])] - prb_snr[indx] = unit_grp['snr'][()] - - unit_ids = np.append(unit_ids, prb_uids) - local_indices = np.append(local_indices, unit_list) - peak_channel_ids = np.append(peak_channel_ids, prb_channels) - snrs = np.append(snrs, prb_snr) - - units_df = pd.DataFrame({ - 'unit_id': pd.Series(unit_ids, dtype=np.int64), - 'local_index': local_indices, - 'peak_channel_id': peak_channel_ids, - 'snr': snrs, - 'quality': "good" # TODO: NWB 1.0 is missing quality table, need to find an equivelent - }) - - units_df.set_index('unit_id', inplace=True) - return units_df - - def get_invalid_times(self) -> pd.DataFrame: - # ecephys nwb v1 files do not appear to contain any - # info on invalid_times - return pd.DataFrame() - - def get_ecephys_session_id(self) -> int: - # Doesn't look like the session_id is stored - return EcephysSessionApi.session_na - - @classmethod - def from_path(cls, path, **kwargs): - # TODO: Validate that file is proper NWB1 - return cls(path=path, **kwargs) diff --git a/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py deleted file mode 100644 index 34a2f06f98..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py +++ /dev/null @@ -1,421 +0,0 @@ -from typing import Dict, Union, List, Optional, Callable -import re -import ast -import warnings - -import h5py -import pandas as pd -import numpy as np -import xarray as xr -import pynwb - -from .ecephys_session_api import EcephysSessionApi -from allensdk.brain_observatory.nwb.nwb_api import NwbApi -import allensdk.brain_observatory.ecephys.nwb # noqa Necessary to import pyNWB namespaces -from allensdk.brain_observatory.ecephys import get_unit_filter_value -from allensdk.brain_observatory.nwb import check_nwbfile_version - -color_triplet_re = re.compile(r"\[(-{0,1}\d*\.\d*,\s*)*(-{0,1}\d*\.\d*)\]") - -# TODO: If ecephys write_nwb is revisited, need to re-add `manual_structure_id` -# column and add the structure ids to the nwbfile for the -# add_ecephys_electrodes() function. -STRUCTURE_ACRONYM_ID_MAP = { - "grey": 8, "SCig": 10, "SCiw": 17, "IGL": 27, "LT": 66, "VL": 81, - "MRN": 128, "LD": 155, "LGd": 170, "LGv": 178, "APN": 215, "LP": 218, - "RT": 262, "MB": 313, "SGN": 325, "BMAa": 327, "CA": 375, "CA1": 382, - "VISp": 385, "VISam": 394, "VISal": 402, "VISl": 409, "VISrl": 417, - "CA2": 423, "CA3": 463, "SUB": 502, "VISpm": 533, "TH": 549, - "NOT": 628, "COAa": 639, "COApm": 663, "VIS": 669, "CP": 672, - "OLF": 698, "OP": 706, "VPL": 718, "DG": 726, "VPM": 733, "ZI": 797, - "SCzo": 834, "SCsg": 842, "SCop": 851, "PF": 930, "PO": 1020, - "POL": 1029, "POST": 1037, "PP": 1044, "PPT": 1061, "MGd": 1072, - "MGv": 1079, "PRE": 1084, "MGm": 1088, "HPF": 1089, - "VISli": 312782574, "VISmma": 480149258, "VISmmp": 480149286, - "ProS": 484682470, "RPF": 549009203, "Eth": 560581551, - "PIL": 560581563, "PoT": 563807435, "IntG": 563807439 -} - - -class EcephysNwbSessionApi(NwbApi, EcephysSessionApi): - - def __init__(self, - path, - probe_lfp_paths: Optional[Dict[int, Callable[[], pynwb.NWBFile]]] = None, - additional_unit_metrics=None, - external_channel_columns=None, - **kwargs): - - self.filter_out_of_brain_units = kwargs.pop("filter_out_of_brain_units", True) - self.filter_by_validity = kwargs.pop("filter_by_validity", True) - self.amplitude_cutoff_maximum = get_unit_filter_value("amplitude_cutoff_maximum", **kwargs) - self.presence_ratio_minimum = get_unit_filter_value("presence_ratio_minimum", **kwargs) - self.isi_violations_maximum = get_unit_filter_value("isi_violations_maximum", **kwargs) - - super(EcephysNwbSessionApi, self).__init__(path, **kwargs) - self.probe_lfp_paths = probe_lfp_paths - - self.additional_unit_metrics = additional_unit_metrics - self.external_channel_columns = external_channel_columns - - if hasattr(self, "path") and self.path: - check_nwbfile_version( - nwbfile_path=self.path, - desired_minimum_version="2.2.2", - warning_msg=( - f"It looks like the Visual Coding Neuropixels nwbfile " - f"you are trying to access ({self.path})" - f"was created by a previous (and incompatible) version of " - f"AllenSDK and pynwb. You will need to either 1) use " - f"AllenSDK version < 2.0.0 or 2) re-download an updated " - f"version of the nwbfile to access the desired data.")) - - def test(self): - """ A minimal test to make sure that this API's NWB file exists and is - readable. Ecephys NWB files use the required session identifier field - to store the session id, so this is guaranteed to be present for any - uncorrupted NWB file. - - Of course, this does not ensure that the file as a whole is correct. - """ - self.get_ecephys_session_id() - - def get_session_start_time(self): - return self.nwbfile.session_start_time - - def get_stimulus_presentations(self): - table = super(EcephysNwbSessionApi, self).get_stimulus_presentations() - - if "color" in table.columns: - # the color column actually contains two parameters. One is coded as rgb triplets and the other as -1 or 1 - if "color_triplet" not in table.columns: - table["color_triplet"] = pd.Series("", index=table.index) - rgb_color_match = table["color"].str.match(color_triplet_re) - table.loc[rgb_color_match, "color_triplet"] = table.loc[rgb_color_match, "color"] - table.loc[rgb_color_match, "color"] = "" - - # make sure the color column's values are numeric - table.loc[table["color"] != "", "color"] = table.loc[table["color"] != "", "color"].apply(ast.literal_eval) - - return table - - def _probe_nwbfile(self, probe_id: int): - if self.probe_lfp_paths is None: - raise TypeError( - "EcephysNwbSessionApi assumes a split NWB file, with " - "probewise LFP stored in individual files. " - "this object was not configured with probe_lfp_paths" - ) - elif probe_id not in self.probe_lfp_paths: - raise KeyError(f"no probe lfp file path is recorded for probe {probe_id}") - - return self.probe_lfp_paths[probe_id]() - - def get_probes(self) -> pd.DataFrame: - probes: Union[List, pd.DataFrame] = [] - for k, v in self.nwbfile.electrode_groups.items(): - probes.append({ - 'id': v.probe_id, - 'name': v.name, - 'location': v.location, - "sampling_rate": v.device.sampling_rate, - "lfp_sampling_rate": v.lfp_sampling_rate, - "has_lfp_data": v.has_lfp_data - }) - probes = pd.DataFrame(probes) - probes = probes.set_index(keys='id', drop=True) - probes = probes.rename(columns={"name": "description"}) - return probes - - def get_channels(self) -> pd.DataFrame: - channels = self.nwbfile.electrodes.to_dataframe() - channels.drop(columns=['imp', 'group', - 'group_name', 'filtering'], inplace=True) - - # Rename columns for clarity/compatibility with example notebooks - channels.rename( - columns={"location": "ecephys_structure_acronym", - "x": "anterior_posterior_ccf_coordinate", - "y": "dorsal_ventral_ccf_coordinate", - "z": "left_right_ccf_coordinate", - "name": "description"}, - inplace=True) - - channels["ecephys_structure_acronym"] = [ - ch_acr if ch_acr not in set(["None", ""]) - else np.nan - for ch_acr in channels["ecephys_structure_acronym"] - ] - - channels["ecephys_structure_id"] = [ - np.nan if ch_acr is np.nan else STRUCTURE_ACRONYM_ID_MAP.get(ch_acr, np.nan) - for ch_acr in channels["ecephys_structure_acronym"] - ] - - if self.external_channel_columns is not None: - external_channel_columns = self.external_channel_columns() - channels = clobbering_merge(channels, external_channel_columns, left_index=True, right_index=True) - - if self.filter_by_validity: - channels = channels[channels["valid_data"]] - channels = channels.drop(columns=["valid_data"]) - - return channels - - def get_mean_waveforms(self) -> Dict[int, np.ndarray]: - units_table = self._get_full_units_table() - return units_table['waveform_mean'].to_dict() - - def get_spike_times(self) -> Dict[int, np.ndarray]: - units_table = self._get_full_units_table() - return units_table['spike_times'].to_dict() - - def get_spike_amplitudes(self) -> Dict[int, np.ndarray]: - units_table = self._get_full_units_table() - return units_table["spike_amplitudes"].to_dict() - - def get_units(self) -> pd.DataFrame: - units = self._get_full_units_table() - - to_drop = set(["spike_times", "spike_amplitudes", "waveform_mean"]) & set(units.columns) - units.drop(columns=list(to_drop), inplace=True) - - if self.additional_unit_metrics is not None: - additional_metrics = self.additional_unit_metrics() - units = pd.merge(units, additional_metrics, left_index=True, right_index=True) - - return units - - def get_lfp(self, probe_id: int) -> xr.DataArray: - lfp_file = self._probe_nwbfile(probe_id) - lfp = lfp_file.get_acquisition(f'probe_{probe_id}_lfp') - series = lfp.get_electrical_series(f'probe_{probe_id}_lfp_data') - - electrodes = lfp_file.electrodes.to_dataframe() - - data = series.data[:] - timestamps = series.timestamps[:] - - return xr.DataArray( - name="LFP", - data=data, - dims=['time', 'channel'], - coords=[timestamps, electrodes.index.values] - ) - - def get_running_speed(self, include_rotation=False) -> pd.DataFrame: - running_module = self.nwbfile.get_processing_module("running") - running_speed_series = running_module["running_speed"] - running_speed_start_times = running_speed_series.timestamps[:] - - running_speed_end_series = running_module["running_speed_end_times"] - running_speed_end_times = running_speed_end_series.timestamps[:] - - running = pd.DataFrame({ - "start_time": running_speed_start_times, - "end_time": running_speed_end_times, - "velocity": running_speed_series.data[:] - }) - - if include_rotation: - rotation_series = running_module["running_wheel_rotation"] - running["net_rotation"] = rotation_series.data[:] - - return running - - def get_raw_running_data(self): - rotation_series = self.nwbfile.get_acquisition("raw_running_wheel_rotation") - signal_voltage_series = self.nwbfile.get_acquisition("running_wheel_signal_voltage") - supply_voltage_series = self.nwbfile.get_acquisition("running_wheel_supply_voltage") - - return pd.DataFrame({ - "frame_time": rotation_series.timestamps[:], - "net_rotation": rotation_series.data[:], - "signal_voltage": signal_voltage_series.data[:], - "supply_voltage": supply_voltage_series.data[:] - }) - - def get_rig_metadata(self) -> Optional[dict]: - try: - et_mod = self.nwbfile.get_processing_module("eye_tracking_rig_metadata") - except KeyError as e: - print(f"This ecephys session '{int(self.nwbfile.identifier)}' has no eye tracking rig metadata. (NWB error: {e})") - return None - - meta = et_mod.get_data_interface("eye_tracking_rig_metadata") - - rig_geometry = pd.DataFrame({ - f"monitor_position_{meta.monitor_position__unit}": meta.monitor_position, - f"camera_position_{meta.camera_position__unit}": meta.camera_position, - f"led_position_{meta.led_position__unit}": meta.led_position, - f"monitor_rotation_{meta.monitor_rotation__unit}": meta.monitor_rotation, - f"camera_rotation_{meta.camera_rotation__unit}": meta.camera_rotation - }) - - rig_geometry = rig_geometry.rename(index={0: 'x', 1: 'y', 2: 'z'}) - - returned_metadata = { - "geometry": rig_geometry, - "equipment": meta.equipment - } - - return returned_metadata - - def get_screen_gaze_data(self, include_filtered_data=False) -> Optional[pd.DataFrame]: - try: - rgm_mod = self.nwbfile.get_processing_module("raw_gaze_mapping") - fgm_mod = self.nwbfile.get_processing_module("filtered_gaze_mapping") - except KeyError as e: - print(f"This ecephys session '{int(self.nwbfile.identifier)}' has no eye tracking data. (NWB error: {e})") - return None - - raw_eye_area_ts = rgm_mod.get_data_interface("eye_area") - raw_pupil_area_ts = rgm_mod.get_data_interface("pupil_area") - raw_screen_coordinates_ts = rgm_mod.get_data_interface("screen_coordinates") - raw_screen_coordinates_spherical_ts = rgm_mod.get_data_interface("screen_coordinates_spherical") - - filtered_eye_area_ts = fgm_mod.get_data_interface("eye_area") - filtered_pupil_area_ts = fgm_mod.get_data_interface("pupil_area") - filtered_screen_coordinates_ts = fgm_mod.get_data_interface("screen_coordinates") - filtered_screen_coordinates_spherical_ts = fgm_mod.get_data_interface("screen_coordinates_spherical") - - gaze_data = { - "raw_eye_area": raw_eye_area_ts.data[:], - "raw_pupil_area": raw_pupil_area_ts.data[:], - "raw_screen_coordinates_x_cm": raw_screen_coordinates_ts.data[:, 1], - "raw_screen_coordinates_y_cm": raw_screen_coordinates_ts.data[:, 0], - "raw_screen_coordinates_spherical_x_deg": raw_screen_coordinates_spherical_ts.data[:, 1], - "raw_screen_coordinates_spherical_y_deg": raw_screen_coordinates_spherical_ts.data[:, 0] - } - - if include_filtered_data: - gaze_data.update( - { - "filtered_eye_area": filtered_eye_area_ts.data[:], - "filtered_pupil_area": filtered_pupil_area_ts.data[:], - "filtered_screen_coordinates_x_cm": filtered_screen_coordinates_ts.data[:, 1], - "filtered_screen_coordinates_y_cm": filtered_screen_coordinates_ts.data[:, 0], - "filtered_screen_coordinates_spherical_x_deg": filtered_screen_coordinates_spherical_ts.data[:, 1], - "filtered_screen_coordinates_spherical_y_deg": filtered_screen_coordinates_spherical_ts.data[:, 0] - } - ) - - index = pd.Index(data=raw_eye_area_ts.timestamps[:], name="Time (s)") - return pd.DataFrame(gaze_data, index=index) - - def get_pupil_data(self) -> Optional[pd.DataFrame]: - try: - et_mod = self.nwbfile.get_processing_module("eye_tracking") - rgm_mod = self.nwbfile.get_processing_module("raw_gaze_mapping") - except KeyError as e: - print(f"This ecephys session '{int(self.nwbfile.identifier)}' has no eye tracking data. (NWB error: {e})") - return None - - cr_ellipse_fits = et_mod.get_data_interface("cr_ellipse_fits").to_dataframe() - eye_ellipse_fits = et_mod.get_data_interface("eye_ellipse_fits").to_dataframe() - pupil_ellipse_fits = et_mod.get_data_interface("pupil_ellipse_fits").to_dataframe() - - # NOTE: ellipse fit "height" and "width" parameters describe the - # "half-height" and "half-width" of fitted ellipse. - eye_tracking_data = { - "corneal_reflection_center_x": cr_ellipse_fits["center_x"].values, - "corneal_reflection_center_y": cr_ellipse_fits["center_y"].values, - "corneal_reflection_height": 2 * cr_ellipse_fits["height"].values, - "corneal_reflection_width": 2 * cr_ellipse_fits["width"].values, - "corneal_reflection_phi": cr_ellipse_fits["phi"].values, - - "pupil_center_x": pupil_ellipse_fits["center_x"].values, - "pupil_center_y": pupil_ellipse_fits["center_y"].values, - "pupil_height": 2 * pupil_ellipse_fits["height"].values, - "pupil_width": 2 * pupil_ellipse_fits["width"].values, - "pupil_phi": pupil_ellipse_fits["phi"].values, - - "eye_center_x": eye_ellipse_fits["center_x"].values, - "eye_center_y": eye_ellipse_fits["center_y"].values, - "eye_height": 2 * eye_ellipse_fits["height"].values, - "eye_width": 2 * eye_ellipse_fits["width"].values, - "eye_phi": eye_ellipse_fits["phi"].values - } - - timestamps = rgm_mod.get_data_interface("eye_area").timestamps[:] - index = pd.Index(data=timestamps, name="Time (s)") - return pd.DataFrame(eye_tracking_data, index=index) - - def get_ecephys_session_id(self) -> int: - return int(self.nwbfile.identifier) - - def get_current_source_density(self, probe_id): - csd_mod = self._probe_nwbfile(probe_id).get_processing_module("current_source_density") - nwb_csd = csd_mod["ecephys_csd"] - csd_data = nwb_csd.time_series.data[:].T # csd data stored as (timepoints x channels) but we want (channels x timepoints) - - csd = xr.DataArray( - name="CSD", - data=csd_data, - dims=["virtual_channel_index", "time"], - coords={ - "virtual_channel_index": np.arange(csd_data.shape[0]), - "time": nwb_csd.time_series.timestamps[:], - "vertical_position": (("virtual_channel_index",), nwb_csd.virtual_electrode_y_positions), - "horizontal_position": (("virtual_channel_index",), nwb_csd.virtual_electrode_x_positions) - } - ) - return csd - - def get_optogenetic_stimulation(self) -> pd.DataFrame: - mod = self.nwbfile.get_processing_module("optotagging") - table = mod.get_data_interface("optogenetic_stimulation").to_dataframe() - table.drop(columns=["tags", "timeseries"], inplace=True) - return table - - def _get_full_units_table(self) -> pd.DataFrame: - units = self.nwbfile.units.to_dataframe() - units.index = units.index.astype(int) - - if self.filter_by_validity or self.filter_out_of_brain_units: - channels = self.get_channels() - - if self.filter_out_of_brain_units: - channels = channels[~(channels["ecephys_structure_id"].isna())] - - channel_ids = set(channels.index.values.tolist()) - units = units[units["peak_channel_id"].isin(channel_ids)] - - if self.filter_by_validity: - units = units[units["quality"] == "good"] - units.drop(columns=["quality"], inplace=True) - - units = units[units["amplitude_cutoff"] <= self.amplitude_cutoff_maximum] - units = units[units["presence_ratio"] >= self.presence_ratio_minimum] - units = units[units["isi_violations"] <= self.isi_violations_maximum] - - return units - - def get_metadata(self): - nwb_subject = self.nwbfile.subject - metadata = { - "specimen_name": nwb_subject.specimen_name, - "age_in_days": nwb_subject.age_in_days, - "full_genotype": nwb_subject.genotype, - "strain": nwb_subject.strain, - "sex": nwb_subject.sex, - "stimulus_name": self.nwbfile.stimulus_notes, - "subject_id": nwb_subject.subject_id, - "age": nwb_subject.age, - "species": nwb_subject.species - } - return metadata - - -def clobbering_merge(to_df, from_df, **kwargs): - overlapping = set(to_df.columns) & set(from_df.columns) - - for merge_param in ["on", "left_on", "right_on"]: - if merge_param in kwargs: - merge_arg = kwargs.get(merge_param) - if isinstance(merge_arg, str): - merge_arg = [merge_arg] - overlapping = overlapping - set(list(merge_arg)) - - to_df = to_df.drop(columns=list(overlapping)) - return pd.merge(to_df, from_df, **kwargs) diff --git a/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py deleted file mode 100644 index 5334aa00f0..0000000000 --- a/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py +++ /dev/null @@ -1,72 +0,0 @@ -from typing import Dict, Optional -from datetime import datetime - -import numpy as np -import pandas as pd -import xarray as xr - -from ...running_speed import RunningSpeed - - -class EcephysSessionApi: - - session_na = -1 - - __slots__: tuple = tuple([]) - - def __init__(self, *args, **kwargs): - pass - - def test(self) -> bool: - raise NotImplementedError - - def get_session_start_time(self) -> datetime: - raise NotImplementedError - - def get_running_speed(self) -> RunningSpeed: - raise NotImplementedError - - def get_stimulus_presentations(self) -> pd.DataFrame: - raise NotImplementedError - - def get_invalid_times(self) -> pd.DataFrame: - raise NotImplementedError - - def get_probes(self) -> pd.DataFrame: - raise NotImplementedError - - def get_channels(self) -> pd.DataFrame: - raise NotImplementedError - - def get_mean_waveforms(self) -> Dict[int, np.ndarray]: - raise NotImplementedError - - def get_spike_times(self) -> Dict[int, np.ndarray]: - raise NotImplementedError - - def get_units(self) -> pd.DataFrame: - raise NotImplementedError - - def get_ecephys_session_id(self) -> int: - raise NotImplementedError - - def get_lfp(self, probe_id: int) -> xr.DataArray: - raise NotImplementedError - - def get_optogenetic_stimulation(self) -> pd.DataFrame: - raise NotImplementedError - - def get_spike_amplitudes(self) -> Dict[int, np.ndarray]: - raise NotImplementedError - - def get_rig_metadata(self) -> Optional[dict]: - raise NotImplementedError - - def get_screen_gaze_data(self, include_filtered_data=False) -> Optional[pd.DataFrame]: - raise NotImplementedError - - def get_pupil_data(self) -> Optional[pd.DataFrame]: - raise NotImplementedError - - def get_metadata(self): - raise NotImplementedError diff --git a/allensdk/brain_observatory/ecephys/file_io/__init__.py b/allensdk/brain_observatory/ecephys/file_io/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/file_io/continuous_file.py b/allensdk/brain_observatory/ecephys/file_io/continuous_file.py deleted file mode 100644 index fa950f3b8f..0000000000 --- a/allensdk/brain_observatory/ecephys/file_io/continuous_file.py +++ /dev/null @@ -1,140 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2019. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -from pathlib import Path -import logging - - -class ContinuousFile(): - - """ - Represents a continuous (.dat) file, and its associated timestamps - - """ - - def __init__(self, data_path, timestamps_path, total_num_channels=384, dtype=np.int16): - - """ - data_path : str - Path to file containing LFP data. The file is expected to be a raw binary with channels as its fast axis and samples as its slow axis. - timestamps_path : str - Path to file containing timestamps for the associated LFP samples. The file is expected to be a .npy file. - total_num_channels : int, optional - Count of channels on this probe. - dtype : type, optional - The data array will be interpreted as containing samples of this type. - """ - - self.data_path = data_path - self.timestamps_path = timestamps_path - self.total_num_channels = total_num_channels - self.dtype = dtype - - - def load(self, memmap=False, memmap_thresh = 10e9): - - """ - Reads lfp data and timestamps from the filesystem - - Parameters: - ---------- - - memmap : bool, optional - If True, the returned data array will be a memory map of the file on disk. Default is True. - memmap_thresh : float, optional - Files above this size in bytes will be memory-mapped, regardless of memmap setting - - Returns: - -------- - lfp_raw : numpy.ndarray - Contains LFP data read directly off of disk. Dimensions are samples X channels. - timestamps : numpy.ndarray - 1D array defining the times at which each LFP sample was taken. - - """ - - logging.info('loading timestamps from {}'.format(self.timestamps_path)) - timestamps = np.load(self.timestamps_path, allow_pickle=False) - logging.info('done loading timestamps from {}. Count: {}'.format(self.timestamps_path, timestamps.size)) - - bytes_per_sample = self.dtype(0).nbytes - num_samples = timestamps.size * self.total_num_channels - expected_num_bytes = num_samples * bytes_per_sample - logging.info('calculated LFP filesize: {} bytes'.format(expected_num_bytes)) - - num_bytes = Path(self.data_path).stat().st_size - if not expected_num_bytes == num_bytes: - raise IOError('expected LFP data filesize to be {} bytes, but its size was {} bytes'.format(expected_num_bytes, num_bytes)) - - shape = (timestamps.size, self.total_num_channels) - logging.info('calculated LFP data shape: {}'.format(shape)) - - if memmap or num_bytes > memmap_thresh: - logging.info('memmaping LFP file at {}'.format(self.data_path)) - lfp_raw = np.memmap(self.data_path, dtype=self.dtype, shape=shape, mode='r') - logging.info('done memmaping LFP file at {}'.format(self.data_path)) - else: - with open(self.data_path, 'rb') as data_file: - logging.info('reading LFP file at {}'.format(self.data_path)) - lfp_raw = np.frombuffer(data_file.read(), dtype=self.dtype) - logging.info('done reading LFP file at {}'.format(self.data_path)) - lfp_raw = lfp_raw.reshape(shape) - - return lfp_raw, timestamps - - - def get_lfp_channel_order(self): - - """ - Returns the channel ordering for LFP data extracted from NPX files. - - Parameters: - ---------- - None - - Returns: - --------- - channel_order : numpy.ndarray - Contains the actual channel ordering. - """ - - remapping_pattern = np.array([0, 12, 1, 13, 2, 14, 3, 15, 4, 16, 5, 17, 6, 18, 7, 19, - 8, 20, 9, 21, 10, 22, 11, 23, 24, 36, 25, 37, 26, 38, - 27, 39, 28, 40, 29, 41, 30, 42, 31, 43, 32, 44, 33, 45, 34, 46, 35, 47]) - - channel_order = np.concatenate([remapping_pattern + 48*i for i in range(0,8)]) - - return channel_order diff --git a/allensdk/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py b/allensdk/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py deleted file mode 100644 index fcafbbd4b1..0000000000 --- a/allensdk/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py +++ /dev/null @@ -1,114 +0,0 @@ -from itertools import product -import functools -from collections import defaultdict -import logging -import warnings - -import numpy as np - -from allensdk.brain_observatory.sync_dataset import Dataset -from allensdk.brain_observatory.ecephys import stimulus_sync -from allensdk.brain_observatory import sync_utilities - - -class EcephysSyncDataset(Dataset): - - @property - def sample_frequency(self): - return self.meta_data['ni_daq']['counter_output_freq'] - - - @sample_frequency.setter - def sample_frequency(self, value): - if not hasattr(self, 'meta_data'): - self.meta_data = defaultdict(dict) - self.meta_data['ni_daq']['counter_output_freq'] = value - - - def __init__(self): - '''In-memory representation of a sync h5 file as produced by the sync package. - - Notes - ----- - base is from here: http://aibspi/mpe_apps/sync/blob/master/sync/dataset.py - Construction works slightly differently for this class as its base. In particular, - this class' __init__ method merely constructs the object. To make a new SyncDataset in client code, use the - factory classmethod. This is done for ease of testability. - - ''' - pass - - - def extract_led_times(self, keys=Dataset.OPTOGENETIC_STIMULATION_KEYS, fallback_line=18): - - try: - led_times = self.get_edges( - kind="rising", - keys=keys, - units="seconds" - ) - except KeyError: - warnings.warn(f"unable to find LED times using line labels {keys}, returning line {fallback_line}") - led_times = self.get_rising_edges(fallback_line, units="seconds") - - return led_times - - - def extract_frame_times_from_photodiode(self, photodiode_cycle=60, frame_keys=Dataset.FRAME_KEYS, photodiode_keys=Dataset.PHOTODIODE_KEYS): - photodiode_times = self.get_edges('all', photodiode_keys) - vsync_times = self.get_edges('falling', frame_keys) - vsync_times = sync_utilities.trim_discontiguous_times(vsync_times) - - logging.info(f"Total vsyncs: {len(vsync_times)}") - - photodiode_times = stimulus_sync.trim_border_pulses(photodiode_times, vsync_times) - photodiode_times = stimulus_sync.correct_on_off_effects(photodiode_times) - photodiode_times = stimulus_sync.fix_unexpected_edges(photodiode_times, cycle=photodiode_cycle) - - frame_duration = stimulus_sync.estimate_frame_duration(photodiode_times, cycle=photodiode_cycle) - irregular_interval_policy = functools.partial(stimulus_sync.allocate_by_vsync, np.diff(vsync_times)) - frame_indices, frame_start_times, frame_end_times = stimulus_sync.compute_frame_times( - photodiode_times, frame_duration, len(vsync_times), - cycle=photodiode_cycle, irregular_interval_policy=irregular_interval_policy - ) - - return frame_start_times - - - def extract_frame_times_from_vsyncs(self, photodiode_cycle=60, - frame_keys=Dataset.FRAME_KEYS, photodiode_keys=Dataset.PHOTODIODE_KEYS - ): - raise NotImplementedError() - - - def extract_frame_times(self, strategy, photodiode_cycle=60, - frame_keys=Dataset.FRAME_KEYS, photodiode_keys=Dataset.PHOTODIODE_KEYS - ): - - if strategy == 'use_photodiode': - return self.extract_frame_times_from_photodiode( - photodiode_cycle=photodiode_cycle, frame_keys=frame_keys, photodiode_keys=photodiode_keys - ) - elif strategy == 'use_vsyncs': - return self.extract_frame_times_from_vsyncs( - photodiode_cycle=photodiode_cycle, frame_keys=frame_keys, photodiode_keys=photodiode_keys - ) - else: - raise ValueError('unrecognized strategy: {}'.format(strategy)) - - - @classmethod - def factory(cls, path): - ''' Build a new SyncDataset. - - Parameters - ---------- - path : str - Filesystem path to the h5 file containing sync information to be loaded. - - ''' - - obj = cls() - obj.load(path) - return obj - diff --git a/allensdk/brain_observatory/ecephys/file_io/stim_file.py b/allensdk/brain_observatory/ecephys/file_io/stim_file.py deleted file mode 100644 index a9298169ba..0000000000 --- a/allensdk/brain_observatory/ecephys/file_io/stim_file.py +++ /dev/null @@ -1,73 +0,0 @@ -import pandas as pd -import numpy as np - - -class CamStimOnePickleStimFile(object): - - - @property - def stimuli(self): - '''List of dictionaries containing information about individual stimuli - ''' - return self.data['stimuli'] - - - @property - def frames_per_second(self): - '''Framerate of stimulus presentation - ''' - return self.data['fps'] - - - @property - def pre_blank_sec(self): - '''Time (s) before initial stimulus presentation - ''' - return self.data['pre_blank_sec'] - - - @property - def angular_wheel_velocity(self): - ''' Extract the mean angular velocity of the running wheel (degrees / s) for each - frame. - ''' - return self.frames_per_second * self.angular_wheel_rotation - - - @property - def angular_wheel_rotation(self): - ''' Extract the total rotation of the running wheel on each frame. - ''' - return self._extract_running_array("dx") - - - @property - def vsig(self): - """Running speed signal voltage - """ - return self._extract_running_array("vsig") - - @property - def vin(self): - return self._extract_running_array("vin") - - - def __init__(self, data, **kwargs): - self.data = data - - - def _extract_running_array(self, key): - try: - result = self.data['items']['foraging']['encoders'][0][key] - except (KeyError, IndexError): - try: - result = self.data[key] - except KeyError: - raise KeyError(f'unable to extract {key} from this stimulus pickle') - - return np.array(result) - - @classmethod - def factory(cls, path, **kwargs): - data = pd.read_pickle(path) - return cls(data, **kwargs) \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/lfp_subsampling/__init__.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/__init__.py deleted file mode 100644 index 6afec2b7ff..0000000000 --- a/allensdk/brain_observatory/ecephys/lfp_subsampling/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2019. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# diff --git a/allensdk/brain_observatory/ecephys/lfp_subsampling/__main__.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/__main__.py deleted file mode 100644 index 7ac8c2e245..0000000000 --- a/allensdk/brain_observatory/ecephys/lfp_subsampling/__main__.py +++ /dev/null @@ -1,142 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2019. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging - -import numpy as np - -from allensdk.brain_observatory.argschema_utilities import \ - ArgSchemaParserPlus, \ - write_or_print_outputs -from allensdk.brain_observatory.ecephys.file_io.continuous_file import \ - ContinuousFile -from ._schemas import InputParameters, OutputParameters -from .subsampling import select_channels, subsample_timestamps, \ - subsample_lfp, \ - remove_lfp_offset, remove_lfp_noise - -logger = logging.getLogger(__name__) - - -def subsample(args): - """ - - :param args: - :return: - """ - params = args['lfp_subsampling'] - - probe_outputs = [] - for probe in args['probes']: - logging.info("Sub-sampling LFP for " + probe['name']) - lfp_data_file = ContinuousFile(probe['lfp_input_file_path'], - probe['lfp_timestamps_input_path'], - probe['total_channels']) - - logging.info("loading lfp data...") - lfp_raw, timestamps = lfp_data_file.load() - if params['reorder_channels']: - lfp_channel_order = lfp_data_file.get_lfp_channel_order() - else: - lfp_channel_order = np.arange(0, probe['total_channels']) - - logging.info("selecting channels...") - channels_to_save, actual_channels = select_channels( - probe['total_channels'], - probe['surface_channel'], - params['surface_padding'], - params['start_channel_offset'], - params['channel_stride'], - lfp_channel_order, - probe.get('noisy_channels', []), - params['remove_noisy_channels'], - probe['reference_channels'], - params['remove_reference_channels']) - - ts_subsampled = subsample_timestamps(timestamps, params[ - 'temporal_subsampling_factor']) - - logging.info("subsampling data...") - lfp_subsampled = subsample_lfp(lfp_raw, channels_to_save, - params['temporal_subsampling_factor']) - - del lfp_raw - - logging.info("removing offset...") - lfp_filtered = remove_lfp_offset(lfp_subsampled, - probe['lfp_sampling_rate'] / params[ - 'temporal_subsampling_factor'], - params['cutoff_frequency'], - params['filter_order']) - - del lfp_subsampled - - logging.info("Surface channel: " + str(probe['surface_channel'])) - - logging.info("removing noise...") - lfp = remove_lfp_noise(lfp_filtered, probe['surface_channel'], - actual_channels) - del lfp_filtered - - if params['remove_channels_out_of_brain']: - channels_to_keep = actual_channels < ( - probe['surface_channel'] + 10) - actual_channels = actual_channels[channels_to_keep] - lfp = lfp[:, channels_to_keep] - - logging.info('Writing to disk...') - lfp.tofile(probe['lfp_data_path']) - np.save(probe['lfp_timestamps_path'], ts_subsampled) - np.save(probe['lfp_channel_info_path'], actual_channels) - - probe_outputs.append({'name': probe['name'], - 'lfp_data_path': probe['lfp_data_path'], - 'lfp_timestamps_path': probe[ - 'lfp_timestamps_path'], - 'lfp_channel_info_path': probe[ - 'lfp_channel_info_path']}) - - return {'probe_outputs': probe_outputs} - - -def main(): - mod = ArgSchemaParserPlus(schema_type=InputParameters, - output_schema_type=OutputParameters) - output = subsample(mod.args) - write_or_print_outputs(data=output, parser=mod) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/ecephys/lfp_subsampling/_schemas.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/_schemas.py deleted file mode 100644 index 6c7424fef2..0000000000 --- a/allensdk/brain_observatory/ecephys/lfp_subsampling/_schemas.py +++ /dev/null @@ -1,88 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2019. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from argschema import ArgSchema, ArgSchemaParser -from argschema.schemas import DefaultSchema -from argschema.fields import Nested, InputDir, String, Boolean, Float, Dict, Int, NumpyArray - - -class ProbeInputParameters(DefaultSchema): - name = String(required=True, help='Identifier for this probe') - lfp_input_file_path = String(required=True, description="path to original LFP .dat file") - lfp_timestamps_input_path = String(required=True, description="path to LFP timestamps") - lfp_data_path = String(required=True, help="Path to LFP data continuous file") - lfp_timestamps_path = String(required=True, help="Path to LFP timestamps aligned to master clock") - lfp_channel_info_path = String(required=True, help="Path to LFP channel info") - total_channels = Int(default=384, help='Total channel count for this probe.') - surface_channel = Int(required=True, help="Probe surface channel") - reference_channels = NumpyArray(required=False, help="Probe reference channels") - lfp_sampling_rate = Float(required=True, help="Sampling rate of LFP data") - noisy_channels = NumpyArray(required=False, help="Noisy channels to remove") - - -class LfpSubsamplingParameters(DefaultSchema): - temporal_subsampling_factor = Int(default=2, description="Ratio of input samples to output samples in time") - channel_stride = Int(default=4, description="Distance between channels to keep") - surface_padding = Int(default=40, description="Number of channels above surface to include") - start_channel_offset = Int(default=2, description="Offset of first channel (from bottom of the probe)") - reorder_channels = Boolean(default=True, description="Implement channel reordering") - cutoff_frequency = Float(default=0.1, description="Cutoff frequency for DC offset filter (Butterworth)") - filter_order = Int(default=1, description="Order of DC offset filter (Butterworth)") - remove_reference_channels = Boolean(default=False, - description="indicates whether references should be removed from output") - remove_channels_out_of_brain = Boolean(default=False, - description="indicates whether to remove channels outside the brain") - remove_noisy_channels = Boolean(default=False, - description="indicates whether noisy channels should be removed from output") - - -class InputParameters(ArgSchema): - probes = Nested(ProbeInputParameters, many=True, help='Probes for LFP subsampling') - lfp_subsampling = Nested(LfpSubsamplingParameters, help='Parameters for this module') - - -class OutputSchema(DefaultSchema): - input_parameters = Nested(InputParameters, description="Input parameters the module was run with", required=True) - - -class ProbeOutputParameters(DefaultSchema): - name = String(required=True, help='Identifier for this probe.') - lfp_data_path = String(required=True, help='Output subsampled data file.') - lfp_timestamps_path = String(required=True, help='Timestamps for subsampled data.') - lfp_channel_info_path = String(required=True, help='LFP channels from that was subsampled.') - - -class OutputParameters(OutputSchema): - probe_outputs = Nested(ProbeOutputParameters, many=True, required=True, help='probewise outputs') diff --git a/allensdk/brain_observatory/ecephys/lfp_subsampling/subsampling.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/subsampling.py deleted file mode 100644 index 032af9d0b5..0000000000 --- a/allensdk/brain_observatory/ecephys/lfp_subsampling/subsampling.py +++ /dev/null @@ -1,239 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2019. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging - -import numpy as np -from scipy.signal import decimate, butter, filtfilt - - -logger = logging.getLogger(__name__) - - -def select_channels(total_channels, - surface_channel, - surface_padding, - start_channel_offset, - channel_stride, - channel_order, - noisy_channels=np.array([]), - remove_noisy_channels=False, - reference_channels=np.array([]), - remove_references=False): - """ - Selects a subset of channels for spatial downsampling - - Parameters: - ---------- - - total_channels : int - Number of channels in the original data file - surface_channel : int - Index of channel at brain surface - surface_padding : int - Number of channels above surface to save - start_channel_offset : int - First channel to save - channel_stride : int - Number of channels to skip in output - channel_order : np.ndarray - Actual order of LFP channels (needed to account for the bug in NPX extraction) - noisy_channels : numpy.ndarray - Array indicating noisy channels - remove_noisy_channels : bool - Flag to remove noisy channels - reference_channels : numpy.ndarray - Array indicating refence channels - remove_references : bool - Flag to remove reference channels - - Returns: - -------- - selected_channels : numpy.ndarray - Indices of channels to select (relative to non-remapped data) - actual_channel_numbers : numpy.ndarray - Actual probe channels in subsampled data - - """ - assert surface_channel <= total_channels - - max_channel = np.min([total_channels, surface_channel + surface_padding]) - - selected_channels = channel_order[start_channel_offset:max_channel:channel_stride] - - actual_channel_numbers = np.arange(total_channels) - actual_channel_numbers = actual_channel_numbers[start_channel_offset:max_channel:channel_stride] - - if remove_references or remove_noisy_channels: - # TODO: Is there a case that reference/noisy channels won't be removed? If not then we should remove flags and - # just check if the arrays are empty - logger.info("Before:") - logger.info(actual_channel_numbers) - # create mask to filter out reference channels - mask = (not remove_references) or np.isin(actual_channel_numbers, reference_channels, assume_unique=True, - invert=True) - - # mask to remove noisy channels - mask &= (not remove_noisy_channels) or np.isin(actual_channel_numbers, noisy_channels, assume_unique=True, - invert=True) - actual_channel_numbers = actual_channel_numbers[mask] - selected_channels = selected_channels[mask] - logger.info("After:") - logger.info(actual_channel_numbers) - - return selected_channels, actual_channel_numbers - - -def subsample_timestamps(timestamps, subsampling_factor): - """ - Subsamples an array of timestamps - - Parameters: - ---------- - - timestamps : numpy.ndarray - 1D array of timestamp values - downsampling_factor : int - Factor by which to subsample the timestamps - - Returns: - - timestamps_sub : numpy.ndarray - New 1D array of timestamps - - """ - return timestamps[::subsampling_factor] - - -def subsample_lfp(lfp_raw, selected_channels, subsampling_factor): - """ - Subsamples LFP data - - Parameters: - ---------- - - lfp_raw : numpy.ndarray - 2D array of LFP values (time x channels) - selected_channels : numpy.ndarray - Indices of channels to select (spatial subsampling) - downsampling_factor : int - Factor by which to subsample in time - - Returns: - - lfp_subsampled : numpy.ndarray - New 2D array of LFP values - - """ - - num_samples = len(lfp_raw[::subsampling_factor, 0]) # np.round(lfp_raw.shape[0] / subsampling_factor).astype('int') - num_channels = selected_channels.size - - lfp_subsampled = np.zeros((num_samples, num_channels), dtype='int16') - - for new_ch, old_ch in enumerate(selected_channels): - tmp = decimate(lfp_raw[:, old_ch], subsampling_factor, ftype='iir', zero_phase=True) - assert(len(tmp) == num_samples) - lfp_subsampled[:, new_ch] = tmp.astype('int16') - - return lfp_subsampled - - -def remove_lfp_offset(lfp, sampling_frequency, cutoff_frequency, filter_order): - """ - High-pass filters LFP data to remove offset - - Parameters: - ---------- - - lfp : numpy.ndarray - 2D array of LFP values (time x channels) - sampling_frequency : float - Sampling frequency in Hz - cutoff_frequency : float - Cutoff frequency for highpass filter - filter_order : int - Butterworth filter order - - Returns: - - lfp_filtered : numpy.ndarray - New 2D array of LFP values - - """ - lfp_filtered = np.zeros(lfp.shape, dtype='int16') - b, a = butter(filter_order, cutoff_frequency / (sampling_frequency/2), btype='high') - - for ch in range(lfp.shape[1]): - tmp = filtfilt(b, a, lfp[:, ch]) - lfp_filtered[:, ch] = tmp.astype('int16') - - return lfp_filtered - - -def remove_lfp_noise(lfp, surface_channel, channel_numbers, channel_max=384, channel_limit=380): - """ - Subtract mean of channels out of brain to remove noise - - Parameters: - ---------- - - lfp : numpy.ndarray - 2D array of LFP values (time x channels) - surface_channel : int - Surface channel (relative to original probe) - channel_numbers : numpy.ndarray - Channel numbers in 'lfp' array (relative to original probe) - - Returns: - - lfp_noise_removed : numpy.ndarray - New 2D array of LFP values - - """ - - lfp_noise_removed = np.zeros(lfp.shape, dtype='int16') - - surface_channel = channel_limit if surface_channel >= channel_max else surface_channel - - channel_selection = np.where(channel_numbers > surface_channel)[0] - - median_signal_out_of_brain = np.median(lfp[:, channel_selection], 1) - - for ch in range(lfp.shape[1]): - tmp = lfp[:, ch] - median_signal_out_of_brain - lfp_noise_removed[:, ch] = tmp.astype('int16') - - return lfp_noise_removed diff --git a/allensdk/brain_observatory/ecephys/nwb/__init__.py b/allensdk/brain_observatory/ecephys/nwb/__init__.py deleted file mode 100644 index bc79a7ed5e..0000000000 --- a/allensdk/brain_observatory/ecephys/nwb/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -from pathlib import Path - -import pynwb - - -file_dir = Path(__file__).parent -namespace_path = (file_dir / "ndx-aibs-ecephys.namespace.yaml").resolve() -pynwb.load_namespaces(str(namespace_path)) - -EcephysProbe = pynwb.get_class('EcephysProbe', 'ndx-aibs-ecephys') - -EcephysElectrodeGroup = pynwb.get_class('EcephysElectrodeGroup', - 'ndx-aibs-ecephys') - -EcephysSpecimen = pynwb.get_class('EcephysSpecimen', 'ndx-aibs-ecephys') - -EcephysEyeTrackingRigMetadata = pynwb.get_class('EcephysEyeTrackingRigMetadata', - 'ndx-aibs-ecephys') - -EcephysCSD = pynwb.get_class('EcephysCSD', 'ndx-aibs-ecephys') diff --git a/allensdk/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py b/allensdk/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py deleted file mode 100644 index fbe4520c7a..0000000000 --- a/allensdk/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py +++ /dev/null @@ -1,155 +0,0 @@ -from pynwb.spec import (NWBAttributeSpec, NWBDatasetSpec, - NWBGroupSpec, NWBNamespaceBuilder) - -# This is the script used to generate the AIBS ecephys NWB extension .yaml -# files. It can be run by installing pynwb and executing -# `nwb_extension_builder.py`. It will generate the .yaml extension files in -# the same directory which the script is run in. For more details see: -# https://pynwb.readthedocs.io/en/stable/extensions.html - -ns_builder = NWBNamespaceBuilder(doc="Allen Institute Ecephys Extension", - version="0.2.0", - name="ndx-aibs-ecephys", - author="Allen Institute for Brain Science", - contact="waynew@alleninstitute.org") - -probe_id_attr = NWBAttributeSpec(name="probe_id", - doc="Unique ID of the neuropixels probe", - dtype="int") - -# Ecephys probe device extension (inherits from NWB `Device`) -sampling_rate_attr = NWBAttributeSpec(name="sampling_rate", - doc="The sampling rate for the device", - dtype="float64") - -ecephys_probe_attributes = [sampling_rate_attr, probe_id_attr] - -ecephys_probe_ext = NWBGroupSpec(doc="A neuropixels probe device", - attributes=ecephys_probe_attributes, - neurodata_type_def="EcephysProbe", - neurodata_type_inc="Device") - -# Ecephys electrode group extension (inherits from NWB `ElectrodeGroup`) -has_lfp_data_attr = NWBAttributeSpec(name="has_lfp_data", - doc="Indicates availability of LFP data", - dtype="bool") - -lfp_sampling_rate = NWBAttributeSpec(name="lfp_sampling_rate", - doc=("The sampling rate at which data " - "were acquired on this electrode " - "group's channels"), - dtype="float64") - -ecephys_egroup_attributes = [has_lfp_data_attr, probe_id_attr, - lfp_sampling_rate] - -ecephys_egroup_ext = NWBGroupSpec(doc=("A group consisting of the channels " - "on a single neuropixels probe"), - attributes=ecephys_egroup_attributes, - neurodata_type_def="EcephysElectrodeGroup", - neurodata_type_inc="ElectrodeGroup") - -# Ecephys specimen metadata extension (inherits from NWB `Subject`) -specimen_name_attr = NWBAttributeSpec(name="specimen_name", - doc="Full name of specimen", - dtype="text") - -age_in_days_attr = NWBAttributeSpec(name="age_in_days", - doc="Age of specimen in days", - dtype="float") - -strain_attr = NWBAttributeSpec(name="strain", - doc="Specimen strain", - dtype="text") - -ecephys_specimen_attributes = [specimen_name_attr, age_in_days_attr, - strain_attr] - -ecephys_specimen_ext = NWBGroupSpec(doc="Metadata for ecephys specimen", - attributes=ecephys_specimen_attributes, - neurodata_type_def="EcephysSpecimen", - neurodata_type_inc="Subject") - -# Ecephys eye tracking rig metadata extension (inherits from `NWBDataInterface`) -rig_equipment_attr = NWBAttributeSpec(name="equipment", - doc="Description of rig", - dtype="text") - -unit_attr = NWBAttributeSpec('unit', 'Unit of measurement for the data', 'text') - -rig_monitor_position_dset = NWBDatasetSpec(name="monitor_position", - doc="position of monitor (x, y, z)", - attributes=[unit_attr], - dtype='float32', - dims=(3,)) - -rig_camera_position_dset = NWBDatasetSpec(name="camera_position", - doc="position of camera (x, y, z)", - attributes=[unit_attr], - dtype='float32', - dims=(3,)) - -rig_led_position_dset = NWBDatasetSpec(name="led_position", - doc="position of LED (x, y, z)", - attributes=[unit_attr], - dtype='float32', - dims=(3,)) - -rig_monitor_rotation_dset = NWBDatasetSpec(name="monitor_rotation", - doc="rotation of monitor (x, y, z)", - attributes=[unit_attr], - dtype='float32', - dims=(3,)) - -rig_camera_rotation_dset = NWBDatasetSpec(name="camera_rotation", - doc="rotation of camera (x, y, z)", - attributes=[unit_attr], - dtype='float32', - dims=(3,)) - -ecephys_eye_tracking_rig_metadata_ext = NWBGroupSpec( - doc="Metadata for ecephys experiment rig", - attributes=[rig_equipment_attr], - datasets=[rig_monitor_position_dset, - rig_camera_position_dset, - rig_led_position_dset, - rig_monitor_rotation_dset, - rig_camera_rotation_dset], - neurodata_type_def="EcephysEyeTrackingRigMetadata", - neurodata_type_inc="NWBDataInterface" -) - -# Ecephys CSD extension -csd_timeseries_group = NWBGroupSpec(doc="A timeseries containing current source density (CSD) data", - neurodata_type_inc="TimeSeries") - -csd_virtual_electrode_vertical_positions = NWBDatasetSpec(name="virtual_electrode_y_positions", - doc="Virtual vertical positions of electrodes from which CSD was calculated", - attributes=[unit_attr], - dtype='float32', - shape=(None,)) - -csd_virtual_electrode_horizontal_positions = NWBDatasetSpec(name="virtual_electrode_x_positions", - doc="Virtual horizontal positions of electrodes from which CSD was calculated", - attributes=[unit_attr], - dtype='float32', - shape=(None,)) - -ecephys_csd_ext = NWBGroupSpec( - doc="A group containing current source density (CSD) data and virtual electrode locations", - groups=[csd_timeseries_group], - datasets=[csd_virtual_electrode_horizontal_positions, - csd_virtual_electrode_vertical_positions], - neurodata_type_def="EcephysCSD", - neurodata_type_inc="NWBDataInterface" -) - -ext_source = "ndx-aibs-ecephys.extension.yaml" -ns_builder.add_spec(ext_source, ecephys_probe_ext) -ns_builder.add_spec(ext_source, ecephys_egroup_ext) -ns_builder.add_spec(ext_source, ecephys_specimen_ext) -ns_builder.add_spec(ext_source, ecephys_eye_tracking_rig_metadata_ext) -ns_builder.add_spec(ext_source, ecephys_csd_ext) - -namespace_path = "ndx-aibs-ecephys.namespace.yaml" -ns_builder.export(namespace_path) diff --git a/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml b/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml deleted file mode 100644 index 1fe62578f4..0000000000 --- a/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml +++ /dev/null @@ -1,126 +0,0 @@ -groups: -- neurodata_type_def: EcephysProbe - neurodata_type_inc: Device - doc: A neuropixels probe device - attributes: - - name: sampling_rate - dtype: float64 - doc: The sampling rate for the device - - name: probe_id - dtype: int - doc: Unique ID of the neuropixels probe -- neurodata_type_def: EcephysElectrodeGroup - neurodata_type_inc: ElectrodeGroup - doc: A group consisting of the channels on a single neuropixels probe - attributes: - - name: has_lfp_data - dtype: bool - doc: Indicates availability of LFP data - - name: probe_id - dtype: int - doc: Unique ID of the neuropixels probe - - name: lfp_sampling_rate - dtype: float64 - doc: The sampling rate at which data were acquired on this electrode group's channels -- neurodata_type_def: EcephysSpecimen - neurodata_type_inc: Subject - doc: Metadata for ecephys specimen - attributes: - - name: specimen_name - dtype: text - doc: Full name of specimen - - name: age_in_days - dtype: float - doc: Age of specimen in days - - name: strain - dtype: text - doc: Specimen strain -- neurodata_type_def: EcephysEyeTrackingRigMetadata - neurodata_type_inc: NWBDataInterface - doc: Metadata for ecephys experiment rig - attributes: - - name: equipment - dtype: text - doc: Description of rig - datasets: - - name: monitor_position - dtype: float32 - dims: - - 3 - shape: - - null - doc: position of monitor (x, y, z) - attributes: - - name: unit - dtype: text - doc: Unit of measurement for the data - - name: camera_position - dtype: float32 - dims: - - 3 - shape: - - null - doc: position of camera (x, y, z) - attributes: - - name: unit - dtype: text - doc: Unit of measurement for the data - - name: led_position - dtype: float32 - dims: - - 3 - shape: - - null - doc: position of LED (x, y, z) - attributes: - - name: unit - dtype: text - doc: Unit of measurement for the data - - name: monitor_rotation - dtype: float32 - dims: - - 3 - shape: - - null - doc: rotation of monitor (x, y, z) - attributes: - - name: unit - dtype: text - doc: Unit of measurement for the data - - name: camera_rotation - dtype: float32 - dims: - - 3 - shape: - - null - doc: rotation of camera (x, y, z) - attributes: - - name: unit - dtype: text - doc: Unit of measurement for the data -- neurodata_type_def: EcephysCSD - neurodata_type_inc: NWBDataInterface - doc: A group containing current source density (CSD) data and virtual electrode - locations - datasets: - - name: virtual_electrode_x_positions - dtype: float32 - shape: - - null - doc: Virtual horizontal positions of electrodes from which CSD was calculated - attributes: - - name: unit - dtype: text - doc: Unit of measurement for the data - - name: virtual_electrode_y_positions - dtype: float32 - shape: - - null - doc: Virtual vertical positions of electrodes from which CSD was calculated - attributes: - - name: unit - dtype: text - doc: Unit of measurement for the data - groups: - - neurodata_type_inc: TimeSeries - doc: A timeseries containing current source density (CSD) data diff --git a/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml b/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml deleted file mode 100644 index 9e87f91b99..0000000000 --- a/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml +++ /dev/null @@ -1,9 +0,0 @@ -namespaces: -- author: Allen Institute for Brain Science - contact: waynew@alleninstitute.org - doc: Allen Institute Ecephys Extension - name: ndx-aibs-ecephys - schema: - - namespace: core - - source: ndx-aibs-ecephys.extension.yaml - version: 0.2.0 diff --git a/allensdk/brain_observatory/ecephys/optotagging_table/README.md b/allensdk/brain_observatory/ecephys/optotagging_table/README.md deleted file mode 100644 index f354c9b33c..0000000000 --- a/allensdk/brain_observatory/ecephys/optotagging_table/README.md +++ /dev/null @@ -1,30 +0,0 @@ -Optotagging table -================= - -Compiles a table of information about the optotagging stimulation on this experiment. This table has the following columns: -- Start: the onset time (global clock) of optical stimulation -- condition: integer identifier for the optical stimulation pattern -- level: intensity (in volts output to the LED) of stimulation - -The conditions are: -- 0 = 2.5 ms pulses at 10 Hz for 1 s -- 1 = 5 ms pulse -- 2 = 10 ms pulse -- 3 = 1 s raised cosine pulse - -See the example gallery for a plot of the conditions. - - -Input data ----------- -- Optotagging pickle : a pickled Python dictionary containing 4 keys: - 1. opto_conditions: The condition labels described above - 2. opto_levels: The light levels described above - 3. opto_waveforms: templates showing the signal associated with each condition - 4. opto_ISIs: inter-stimulus-intervals. These are drawn from the software controller without accounting for hardware delays, so they are slightly (but consistently) shorter than the gap between adjacent LED times. -- Sync file : an h5 file containging information about timing on this experiment's global clock. We are mainly interested in the LED times, which define the onsets of optical stimulation. - - -Output data ------------ -- optotagging table : a csv containing optical stimulation times, conditions, and levels \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/optotagging_table/__init__.py b/allensdk/brain_observatory/ecephys/optotagging_table/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/optotagging_table/__main__.py b/allensdk/brain_observatory/ecephys/optotagging_table/__main__.py deleted file mode 100644 index 24c5813a22..0000000000 --- a/allensdk/brain_observatory/ecephys/optotagging_table/__main__.py +++ /dev/null @@ -1,61 +0,0 @@ -import pandas as pd - -from allensdk.brain_observatory.argschema_utilities import \ - ArgSchemaParserPlus, \ - write_or_print_outputs -from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import ( - EcephysSyncDataset, -) -from ._schemas import InputParameters, OutputParameters - - -def build_opto_table(args): - opto_file = pd.read_pickle(args['opto_pickle_path']) - sync_file = EcephysSyncDataset.factory(args['sync_h5_path']) - - start_times = sync_file.extract_led_times() - conditions = [str(item) for item in opto_file['opto_conditions']] - levels = opto_file['opto_levels'] - - assert len(conditions) == len(levels) - if len(start_times) > len(conditions): - raise ValueError( - f"there are {len(start_times) - len(conditions)} extra " - f"optotagging sync times!") - - optotagging_table = pd.DataFrame({ - 'start_time': start_times, - 'condition': conditions, - 'level': levels - }) - optotagging_table = optotagging_table.sort_values(by='start_time', axis=0) - - stop_times = [] - names = [] - conditions = [] - for ii, row in optotagging_table.iterrows(): - condition = args["conditions"][row["condition"]] - stop_times.append(row["start_time"] + condition["duration"]) - names.append(condition["name"]) - conditions.append(condition["condition"]) - - optotagging_table["stop_time"] = stop_times - optotagging_table["stimulus_name"] = names - optotagging_table["condition"] = conditions - optotagging_table["duration"] = \ - optotagging_table["stop_time"] - optotagging_table["start_time"] - - optotagging_table.to_csv(args['output_opto_table_path'], index=False) - return {'output_opto_table_path': args['output_opto_table_path']} - - -def main(): - mod = ArgSchemaParserPlus(schema_type=InputParameters, - output_schema_type=OutputParameters) - output = build_opto_table(mod.args) - - write_or_print_outputs(data=output, parser=mod) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/ecephys/optotagging_table/_schemas.py b/allensdk/brain_observatory/ecephys/optotagging_table/_schemas.py deleted file mode 100644 index cb300838ce..0000000000 --- a/allensdk/brain_observatory/ecephys/optotagging_table/_schemas.py +++ /dev/null @@ -1,48 +0,0 @@ -from argschema import ArgSchema, ArgSchemaParser -from argschema.schemas import DefaultSchema -from argschema.fields import Nested, InputDir, String, Float, Dict, Int - - -known_conditions = { - "0": { - "duration": 1.0, - "name": "fast_pulses", - "condition": "2.5 ms pulses at 10 Hz" - }, - "1": { - "duration": 0.005, - "name": "pulse", - "condition": "a single square pulse" - }, - "2": { - "duration": 0.01, - "name": "pulse", - "condition": "a single square pulse" - }, - "3": { - "duration": 1.0, - "name": "raised_cosine", - "condition": "half-period of a cosine wave" - } -} - - -class Condition(DefaultSchema): - duration = Float(required=True) - name = String(required=True) - condition = String(required=True) - - -class InputParameters(ArgSchema): - opto_pickle_path = String(required=True, help='path to file containing optotagging information') - sync_h5_path = String(required=True, help='path to h5 file containing syncronization information') - output_opto_table_path = String(required=True, help='the optotagging stimulation table will be written here') - conditions = Dict(String, Nested(Condition), default=known_conditions) - - -class OutputSchema(DefaultSchema): - input_parameters = Nested(InputParameters, description=('Input parameters the module was run with'), required=True) - - -class OutputParameters(OutputSchema): - output_opto_table_path = String(required=True, help='path to optotagging stimulation table') \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/__init__.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/__init__.py deleted file mode 100644 index e5c88f5b3c..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .static_gratings import StaticGratings -from .natural_scenes import NaturalScenes -from .drifting_gratings import DriftingGratings -from .flashes import Flashes -from .dot_motion import DotMotion -from .natural_movies import NaturalMovies -from .receptive_field_mapping import ReceptiveFieldMapping \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/__main__.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/__main__.py deleted file mode 100644 index e5197864ef..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/__main__.py +++ /dev/null @@ -1,215 +0,0 @@ -import logging -import os -import pathlib -import time - -import numpy as np -import pandas as pd -from argschema import ArgSchemaParser - -from allensdk.brain_observatory.argschema_utilities import \ - write_or_print_outputs -from .dot_motion import DotMotion -from .drifting_gratings import DriftingGratings -from .flashes import Flashes -from .natural_movies import NaturalMovies -from .natural_scenes import NaturalScenes -from .receptive_field_mapping import ReceptiveFieldMapping -from .static_gratings import StaticGratings -from ..ecephys_session import EcephysSession - -try: - from mpi4py import MPI - - comm = MPI.COMM_WORLD - MPI_rank = comm.Get_rank() - MPI_size = comm.Get_size() - barrier = comm.Barrier - gather = comm.gather -except ModuleNotFoundError: - # Run without mpi4py installed - MPI_rank = 0 - MPI_size = 1 - barrier = lambda: None # noqa F841 - gather = lambda data, root: data # noqa F841 - -logger = logging.getLogger(__name__) - -# Map between json file subsections and StimAnalysis subclass -# TODO: Try to order this list by how long each subclass takes to finish. -# Helps spread work evenly across cores -stim_classes = [ - ('receptive_field_mapping', ReceptiveFieldMapping), - ('drifting_gratings', DriftingGratings), - ('dot_motion', DotMotion), - ('static_gratings', StaticGratings), - ('natural_scenes', NaturalScenes), - ('natural_moves', NaturalMovies), - ('flashes', Flashes), -] - - -def log_info(message, all_ranks=False): - if all_ranks or MPI_rank == 0: - logger.info(message) - - -def load_session(nwb_path, stimulus_class, **session_params): - session = EcephysSession.from_nwb_path(nwb_path, api_kwargs={ - "amplitude_cutoff_maximum": np.inf, - "presence_ratio_minimum": -np.inf, - "isi_violations_maximum": np.inf, - "filter_by_validity": False - # actually you probably still want this one - }) - return stimulus_class(session, **session_params) - - -""" -NOTE: There are two version of caclulate_stimulus_metrics, both should -produce the same results but have different ways -of working across multiple cores. The best one to use will depend on the -data and the limitations of lims/ - -caclulate_stimulus_metrics_ondisk - each core calculates the individual -metrics and saves them to a temporary csv file. -Rank 0 then reads each csv and cobmines them into the final result. A more -memory efficient way, however will be slower -due to the cost of reading/writing to disk multiple times. - -caclulate_stimulus_metrics_gather - runs each metric across different cores, -but uses the MPI Gather() method to send -all the combined dataframes to Rank 0 where it is collolated and saved to -disk. Should run faster but can use up to -2x the amount of memory. -""" - - -def calculate_stimulus_metrics_ondisk(args): - """Runs the individual metrics for a given session, combines and saves - them into a single table. - - Same as below except pass the metric tables between ranks by - writing/reading to a file. - """ - log_info('ecephys: stimulus metrics module') - start = time.time() - - input_session_nwb = args['input_session_nwb'] - output_file = args['output_file'] - - # For each stimulus class that needs to be processed; calculate and save - # the metrics on a different rank (unless - # MPI_size is small and one rank has to process two or more metrics). - def _temp_csv_file(stim_class): - # filename to save temporary stim_analysis csv files before being - # merged into final - output_dir = pathlib.Path(output_file).parents[0] - session_name = pathlib.Path(input_session_nwb).stem - return os.path.join(output_dir, - '{}.{}.csv'.format(session_name, stim_class)) - - relevant_stim_class = [(sc[0], sc[1], _temp_csv_file(sc[0])) - for sc in stim_classes if sc[ - 0] in args] # only stims specified in the - # input json - for sc_name, stim_class, tmp_csv in relevant_stim_class[ - MPI_rank::MPI_size]: - analysis_obj = load_session(input_session_nwb, stim_class, - **args[sc_name]) - # analysis_obj = stim_class(input_session_nwb, **args[sc_name]) - analysis_obj.metrics.to_csv(tmp_csv) - - barrier() # wait till all the csv files have been created - - # Have the first rank go through all the created csv files and merge - # into one - if MPI_rank == 0: - final_table = pd.read_csv(relevant_stim_class[0][2]) - for _, _, tmp_csv in relevant_stim_class[1:]: - tmp_table = pd.read_csv(tmp_csv) - final_table = pd.merge(final_table, tmp_table, on='unit_id') - - final_table.to_csv(output_file) - - # Delete the temporary files - for _, _, tmp_csv in relevant_stim_class: - if os.path.exists(tmp_csv): - try: - os.remove(tmp_csv) - except Exception: - pass - - barrier() - - execution_time = time.time() - start - log_info(f'total time: {str(np.around(execution_time, 2))} seconds') - return {"execution_time": execution_time} - - -def calculate_stimulus_metrics_gather(args): - """Runs the individual metrics for a given session, combines and saves - them into a single table. - - Same as above but uses MPI Gather to send the dataframes across ranks - """ - log_info('ecephys: stimulus metrics module') - start = time.time() - - input_session_nwb = args['input_session_nwb'] - output_file = args['output_file'] - - # Divide the work across the ranks, calculate each metric and combine - # all the result on each rank. - combined_df = None - relevant_stim_class = [(sc[0], sc[1]) for sc in stim_classes if - sc[0] in args] # metrics for this rank - if MPI_rank < len(relevant_stim_class): - for sc_name, stim_class in relevant_stim_class[MPI_rank::MPI_size]: - analysis_obj = load_session(input_session_nwb, stim_class, - **args[sc_name]) - analysis_df = analysis_obj.metrics - - if combined_df is None: - combined_df = analysis_df - else: - combined_df = pd.merge(combined_df, analysis_df, on='unit_id') - - barrier() - - if MPI_size == 1: - combined_df.to_csv(output_file) - execution_time = time.time() - start - return {"execution_time": execution_time} - - # Use MPI Gather to send the combined_df on each rank to Rank 0 where it - # will be collolated and saved - all_ranks_data = gather(combined_df, root=0) - if MPI_rank == 0: - final_df = all_ranks_data[0] - for df in all_ranks_data[1:]: - if df is None: - continue - final_df = pd.merge(final_df, df, on='unit_id') - - final_df.to_csv(output_file) - - barrier() - execution_time = time.time() - start - return {"execution_time": execution_time} - - -def main(): - from ._schemas import InputParameters, OutputParameters - - mod = ArgSchemaParser(schema_type=InputParameters, - output_schema_type=OutputParameters) - # output = calculate_stimulus_metrics_ondisk(mod.args) - output = calculate_stimulus_metrics_gather(mod.args) - if MPI_rank == 0: - write_or_print_outputs(data=output, parser=mod) - barrier() - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/_schemas.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/_schemas.py deleted file mode 100644 index 5403ebfede..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/_schemas.py +++ /dev/null @@ -1,83 +0,0 @@ -from argschema import ArgSchema -from argschema.schemas import DefaultSchema -from argschema.fields import Nested, String, Float, List, Int - -from .drifting_gratings import DriftingGratings -from .static_gratings import StaticGratings -from .natural_scenes import NaturalScenes -from .dot_motion import DotMotion -from .flashes import Flashes -from .receptive_field_mapping import ReceptiveFieldMapping - - -class DriftingGratings(DefaultSchema): - stimulus_key = List(String, default=DriftingGratings.known_stimulus_keys(), help='Key for the drifting gratings stimulus') - trial_duration = Float(default=2.0, help='typical length of a epoch for given stimulus in seconds') - psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') - - - -class StaticGratings(DefaultSchema): - stimulus_key = List(String, default=StaticGratings.known_stimulus_keys(), help='Key for the static gratings stimulus') - trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') - psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') - - -class NaturalScenes(DefaultSchema): - stimulus_key = List(String, default=NaturalScenes.known_stimulus_keys(), help='Key for the natural scenes stimulus') - trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') - psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') - - -#class NaturalMovies(DefaultSchema): -# stimulus_key = String(help='Key for the natural movies stimulus') -# trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') - - -class DotMotion(DefaultSchema): - stimulus_key = List(String, default=DotMotion.known_stimulus_keys(), help='Key for the dot motion stimulus') - trial_duration = Float(default=1.0, help='typical length of a epoch for given stimulus in seconds') - psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') - - -#class ContrastTuning(DefaultSchema): -# stimulus_key = String(help='Key for the contrast tuning stimulus') -# trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') - - -class Flashes(DefaultSchema): - stimulus_key = List(String, default=Flashes.known_stimulus_keys(), help='Key for the flash stimulus') - trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') - psth_resolution = Float(default=0.001, help='resultion (seconds) for generating PSTH') - - -class ReceptiveFieldMapping(DefaultSchema): - stimulus_key = List(String, default=ReceptiveFieldMapping.known_stimulus_keys(), help='Key for the receptive field mapping stimulus') - trial_duration = Float(default=0.25, help='typical length of a epoch for given stimulus in seconds') - minimum_spike_count = Int(default=10, help='Minimum number of spikes for computing receptive field parameters') - mask_threshold = Float(default=1.0, help='Threshold (as fraction of peak) for computing receptive field mask') - stimulus_step_size = Float(default=10.0, help='Distance between stimulus locations in degrees') - - -class InputParameters(ArgSchema): - drifting_gratings = Nested(DriftingGratings) - static_gratings = Nested(StaticGratings) - natural_scenes = Nested(NaturalScenes) - # natural_movies = Nested(NaturalMovies) - dot_motion = Nested(DotMotion) - # contrast_tuning = Nested(ContrastTuning) - flashes = Nested(Flashes) - receptive_field_mapping = Nested(ReceptiveFieldMapping) - - input_session_nwb = String(required=True, help='Ecephys spiking nwb file for session') - output_file = String(required=True, help='Location for saving output file') - - -class OutputSchema(DefaultSchema): - input_parameters = Nested(InputParameters, - description=("Input parameters the module was run with"), - required=True) - - -class OutputParameters(OutputSchema): - execution_time = Float() diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/dot_motion.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/dot_motion.py deleted file mode 100644 index feb7aab081..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/dot_motion.py +++ /dev/null @@ -1,216 +0,0 @@ -import warnings -import numpy as np -import pandas as pd -import logging -import matplotlib.pyplot as plt - -from .stimulus_analysis import StimulusAnalysis - - -warnings.simplefilter(action='ignore', category=FutureWarning) - -logger = logging.getLogger(__name__) - - -class DotMotion(StimulusAnalysis): - """ - A class for computing single-unit metrics from the dot motion stimulus of an ecephys session NWB file. - - To use, pass in a EcephysSession object:: - session = EcephysSession.from_nwb_path('/path/to/my.nwb') - dm_analysis = DotMotion(session) - - or, alternatively, pass in the file path:: - dm_analysis = DotMotion('/path/to/my.nwb') - - You can also pass in a unit filter dictionary which will only select units with certain properties. For example - to get only those units which are on probe C and found in the VISp area:: - dm_analysis = DotMotion(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) - - or a list of unit_ids: - dm_analysis = DotMotion(session, filter=[914580630, 914580280, 914580278]) - - To get a table of the individual unit metrics ranked by unit ID:: - metrics_table_df = dm_analysis.metrics() - - """ - def __init__(self, ecephys_session, col_dir='Dir', col_speeds='Speed', trial_duration=1.0, **kwargs): - super(DotMotion, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) - - self._dirvals = None - self._number_dir = None - self._speedvals = None - self._number_speed = None - - self._col_dir = col_dir - self._col_speed = col_speeds - - if self._params is not None: - self._params = self._params['dot_motion'] - self._stimulus_key = self._params['stimulus_key'] - #else: - # self._stimulus_key = 'motion_stimulus' - - @property - def name(self): - return 'Dot Motion' - - @property - def directions(self): - if self._dirvals is None: - self._get_stim_table_stats() - - return self._dirvals - - @property - def number_directions(self): - if self._number_dir is None: - self._get_stim_table_stats() - - return self._number_dir - - @property - def speeds(self): - if self._speedvals is None: - self._get_stim_table_stats() - - return self._speedvals - - @property - def number_speeds(self): - if self._number_speed is None: - self._get_stim_table_stats() - - return self._number_speed - - @property - def known_spontaneous_keys(self): - return ['dot_motion', "spontaneous_activity"] - - @property - def null_condition(self): - """ Stimulus condition ID for null stimulus (not used, so set to -1) """ - return -1 - - @property - def METRICS_COLUMNS(self): - return [('pref_speed_dm', np.float64), - ('pref_speed_multi_dm', bool), - ('pref_dir_dm', np.float64), - ('pref_dir_multi_dm', bool), - ('firing_rate_dm', np.float64), - ('fano_dm', np.float64), - ('time_to_peak_dm', np.float64), - ('lifetime_sparseness_dm', np.float64), - ('run_mod_dm', np.float64), - ('run_pval_dm', np.float64)] - - @property - def metrics(self): - if self._metrics is None: - logger.info('Calculating metrics for ' + self.name) - unit_ids = self.unit_ids - metrics_df = self.empty_metrics_table() - - if len(self.stim_table) > 0: - metrics_df['pref_speed_dm'] = [self._get_pref_speed(unit) for unit in unit_ids] - metrics_df['pref_speed_multi_dm'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_speed, self.speeds) for unit_id in unit_ids - ] - metrics_df['pref_dir_dm'] = [self._get_pref_dir(unit) for unit in unit_ids] - metrics_df['pref_dir_multi_dm'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_dir, self.directions) for unit_id in unit_ids - ] - metrics_df['firing_rate_dm'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] - metrics_df['fano_dm'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - # metrics_df['speed_tuning_idx_dm'] = [self._get_speed_tuning_index(unit) for unit in unit_ids] - metrics_df['time_to_peak_dm'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) for - unit in unit_ids] - metrics_df['lifetime_sparseness_dm'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] - metrics_df.loc[:, ['run_pval_dm', 'run_mod_dm']] = \ - [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - - - self._metrics = metrics_df - - return self._metrics - - @classmethod - def known_stimulus_keys(cls): - return ['motion_stimulus', 'dot_motion'] - - def _get_stim_table_stats(self): - """ Extract directions and speeds from the stimulus table """ - self._dirvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_dir] - != 'null'][self._col_dir].unique()) - self._number_dir = len(self._dirvals) - - self._speedvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_speed] - != 'null'][self._col_speed].unique()) - self._number_speed = len(self._speedvals) - - def _get_pref_speed(self, unit_id): - """ Calculate the preferred speed condition for a given unit - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - pref_speed : - stimulus speed driving the maximal response - """ - # TODO: Most of the _get_pref_*() methods can be combined into one method and shared among the classes - similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_speed] - == speed].tolist() for speed in self.speeds] - df = pd.DataFrame( - index=self.speeds, - data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in similar_conditions]} - ).rename_axis(self._col_speed) - - return df.idxmax().iloc[0] - - def _get_pref_dir(self, unit_id): - """Calculate the preferred direction condition for a given unit - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - pref_dir : float - stimulus direction driving the maximal response - """ - similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_dir] - == direction].tolist() for direction in self.directions] - df = pd.DataFrame( - index=self.directions, - data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in similar_conditions]} - ).rename_axis(self._col_dir) - - return df.idxmax().iloc[0] - - def _get_speed_tuning_index(self, unit_id): - """ Calculate the speed tuning for a given unit - - SEE: https://github.com/AllenInstitute/ecephys_analysis_modules/blob/master/ecephys_analysis_modules/modules/tuning/tuning_speed.py - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - speed_tuning : float - degree to which the unit's responses are modulated by stimulus speed - """ - # TODO: Not implemented yet. - return np.nan diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py deleted file mode 100644 index 4d91d1d18a..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py +++ /dev/null @@ -1,751 +0,0 @@ -import numpy as np -import pandas as pd -from six import string_types -import scipy.ndimage as ndi -import scipy.stats as st -from scipy.signal import welch -from scipy.optimize import curve_fit -from scipy.fftpack import fft -from scipy import signal -import logging - -import matplotlib.pyplot as plt - -from .stimulus_analysis import StimulusAnalysis, osi, dsi, deg2rad -from ...circle_plots import FanPlotter - -import warnings -warnings.simplefilter(action='ignore', category=FutureWarning) - - -logger = logging.getLogger(__name__) - - -class DriftingGratings(StimulusAnalysis): - """ - A class for computing single-unit metrics from the drifting gratings stimulus of an ecephys session NWB file. - - To use, pass in a EcephysSession object:: - session = EcephysSession.from_nwb_path('/path/to/my.nwb') - dg_analysis = DriftingGratings(session) - - or, alternatively, pass in the file path:: - dg_analysis = DriftingGratings('/path/to/my.nwb') - - You can also pass in a unit filter dictionary which will only select units with certain properties. For example - to get only those units which are on probe C and found in the VISp area:: - dg_analysis = DriftingGratings(session, filter={'location': 'probeC', 'structure_acronym': 'VISp'}) - - To get a table of the individual unit metrics ranked by unit ID:: - metrics_table_df = dg_analysis.metrics() - - """ - def __init__(self, ecephys_session, col_ori='orientation', col_tf='temporal_frequency', col_contrast='contrast', - trial_duration=2.0, **kwargs): - super(DriftingGratings, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) - - self._metrics = None - - self._orivals = None - self._number_ori = None - self._tfvals = None - self._number_tf = None - self._contrastvals = None - self._number_constrast = None - - self._col_ori = col_ori - self._col_tf = col_tf - self._col_contrast = col_contrast - - if self._params is not None: - # TODO: Need to make sure - self._params = self._params.get('drifting_gratings', {}) - self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars - else: - self._params = {} - - self._stim_table_contrast = None - - #stim_table = self.stim_table - #self._stim_table_contrast = stim_table[stim_table['stimulus_name'] == 'drifting_gratings_contrast'] - #self._stim_table = stim_table[stim_table['stimulus_name'] != 'drifting_gratings_contrast'] - self._conditionwise_statistics_contrast = None - self._stimulus_conditions_contrast = None - - - @property - def stim_table_contrast(self): - if self._stim_table_contrast is None: - stim_table = self.ecephys_session.stimulus_presentations - if 'drifting_gratings_contrast' in stim_table['stimulus_name'].unique(): - self._stim_table_contrast = stim_table[stim_table['stimulus_name'] == 'drifting_gratings_contrast'] - else: - self._stim_table_contrast = pd.DataFrame() - - return self._stim_table_contrast - - @property - def name(self): - return 'Drifting Gratings' - - @property - def orivals(self): - """ Array of grating orientation conditions """ - if self._orivals is None: - self._get_stim_table_stats() - - return self._orivals - - @property - def number_ori(self): - """ Number of grating orientation conditions """ - if self._number_ori is None: - self._get_stim_table_stats() - - return self._number_ori - - @property - def tfvals(self): - """ Array of grating temporal frequency conditions """ - if self._tfvals is None: - self._get_stim_table_stats() - - return self._tfvals - - @property - def number_tf(self): - """ Number of grating temporal frequency conditions """ - if self._tfvals is None: - self._get_stim_table_stats() - - return self._number_tf - - @property - def contrastvals(self): - """ Array of grating temporal frequency conditions """ - if self._contrastvals is None: - self._get_stim_table_stats() - - return self._contrastvals - - @property - def number_contrast(self): - """ Number of grating temporal frequency conditions """ - if self._number_contrast is None: - self._get_stim_table_stats() - - return self._number_contrast - - @property - def null_condition(self): - """ Stimulus condition ID for null (blank) stimulus """ - return self.stimulus_conditions[self.stimulus_conditions[self._col_tf] == 'null'].index - - @property - def stimulus_conditions_contrast(self): - """ Stimulus conditions for contrast stimulus """ - if self._stimulus_conditions_contrast is None: - # TODO: look into efficiency of using a table intersect instead. - contrast_condition_list = self.stim_table_contrast.stimulus_condition_id.unique() - - self._stimulus_conditions_contrast = self.ecephys_session.stimulus_conditions[ - self.ecephys_session.stimulus_conditions.index.isin(contrast_condition_list) - ] - - return self._stimulus_conditions_contrast - - @property - def conditionwise_statistics_contrast(self): - """ Conditionwise statistics for contrast stimulus """ - if self._conditionwise_statistics_contrast is None: - self._conditionwise_statistics_contrast = self.ecephys_session.conditionwise_spike_statistics( - self.stim_table_contrast.index.values, - self.unit_ids - ) - - return self._conditionwise_statistics_contrast - - @property - def METRICS_COLUMNS(self): - return [('pref_ori_dg', np.float64), - ('pref_ori_multi_dg', bool), - ('pref_tf_dg', np.float64), - ('pref_tf_multi_dg', bool), - ('c50_dg', np.float64), - ('f1_f0_dg', np.float64), - ('mod_idx_dg', np.float64), - ('g_osi_dg', np.float64), - ('g_dsi_dg', np.float64), - ('firing_rate_dg', np.float64), - ('fano_dg', np.float64), - ('lifetime_sparseness_dg', np.float64), - ('run_pval_dg', np.float64), - ('run_mod_dg', np.float64)] - - @property - def metrics(self): - - if self._metrics is None: - logger.info('Calculating metrics for ' + self.name) - unit_ids = self.unit_ids - metrics_df = self.empty_metrics_table() - - if len(self.stim_table) > 0: - metrics_df['pref_ori_dg'] = [self._get_pref_ori(unit) for unit in unit_ids] - metrics_df['pref_ori_multi_dg'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_ori, self.orivals) for unit_id in unit_ids - ] - metrics_df['pref_tf_dg'] = [self._get_pref_tf(unit) for unit in unit_ids] - metrics_df['pref_tf_multi_dg'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_tf, self.tfvals) for unit_id in unit_ids - ] - metrics_df['f1_f0_dg'] = [self._get_f1_f0(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['mod_idx_dg'] = [self._get_modulation_index(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['g_osi_dg'] = [self._get_selectivity(unit, metrics_df.loc[unit]['pref_tf_dg'], 'osi') - for unit in unit_ids] - metrics_df['g_dsi_dg'] = [self._get_selectivity(unit, metrics_df.loc[unit]['pref_tf_dg'], 'dsi') - for unit in unit_ids] - metrics_df['firing_rate_dg'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] - metrics_df['fano_dg'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['lifetime_sparseness_dg'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] - metrics_df.loc[:, ['run_pval_dg', 'run_mod_dg']] = [ - self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - - if len(self.stim_table_contrast) > 0: - metrics_df['c50_dg'] = [self._get_c50(unit) for unit in unit_ids] - - - self._metrics = metrics_df - - return self._metrics - - @classmethod - def known_stimulus_keys(cls): - return ['drifting_gratings', 'drifting_gratings_75_repeats'] - - def _get_stim_table_stats(self): - """ Extract orientations and temporal frequencies from the stimulus table """ - self._orivals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_ori] - != 'null'][self._col_ori].unique()) - self._number_ori = len(self._orivals) - - self._tfvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_tf] - != 'null'][self._col_tf].unique()) - self._number_tf = len(self._tfvals) - - self._contrastvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_contrast] - != 'null'][self._col_contrast].unique()) - self._number_contrast = len(self._contrastvals) - - def _get_pref_ori(self, unit_id): - """ Calculate the preferred orientation condition for a given unit - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - pref_ori : float - stimulus orientation driving the maximal response - """ - # TODO: Most of the _get_pref_*() methods can be combined into one method and shared among the classes - similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_ori] == ori].tolist() - for ori in self.orivals] - df = pd.DataFrame( - index=self.orivals, - data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in similar_conditions]} - ).rename_axis(self._col_ori) - - return df.idxmax().iloc[0] - - def _get_pref_tf(self, unit_id): - """ Calculate the preferred temporal frequency condition for a given unit - - Params: - ------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - pref_tf : float - stimulus temporal frequency driving the maximal response - """ - similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_tf] == tf].tolist() - for tf in self.tfvals] - df = pd.DataFrame( - index=self.tfvals, - data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in similar_conditions]} - ).rename_axis(self._col_tf) - - return df.idxmax().iloc[0] - - def _get_selectivity(self, unit_id, pref_tf, selectivity_type='osi'): - """ Calculate the orientation or direction selectivity for a given unit - - Params: - ------- - unit_id - unique ID for the unit of interest - pref_tf - preferred temporal frequency for this unit - selectivity_type - 'osi' or 'dsi' - - Returns: - ------- - selectivity - orientation or direction selectivity value - - """ - orivals_rad = deg2rad(self.orivals).astype('complex128') - - condition_inds = self.stimulus_conditions[self.stimulus_conditions[self._col_tf] == pref_tf].index.values - df = self.conditionwise_statistics.loc[unit_id].loc[condition_inds] - df = df.assign(ori=self.stimulus_conditions.loc[df.index.values][self._col_ori]) - df = df.sort_values(by=['ori']) # do not replace with self._col_ori unless we modify the line above - - tuning = np.array(df['spike_mean'].values) - - if selectivity_type == 'osi': - return osi(orivals_rad, tuning) - elif selectivity_type == 'dsi': - return dsi(orivals_rad, tuning) - else: - warnings.warn(f'unkown selectivity function {selectivity_type}.') - return np.nan - - def _get_f1_f0(self, unit_id, condition_id): - """ Calculate F1/F0 for a given unit - - A measure of how tightly locked a unit's firing rate is to the cycles of a drifting grating - - Parameters - ---------- - unit_id - unique ID for the unit of interest - condition_id - ID for the condition of interest (usually the preferred condition) - - Returns - ------- - f1_f0 - metric - - """ - presentation_ids = self.stim_table[self.stim_table['stimulus_condition_id'] == condition_id].index.values - - tf = self.stim_table.loc[presentation_ids[0]][self._col_tf] - - dataset = self.ecephys_session.presentationwise_spike_counts( - bin_edges=np.arange(0, self.trial_duration, 0.001), - stimulus_presentation_ids=presentation_ids, - unit_ids=[unit_id] - ).drop('unit_id') - - arr = np.squeeze(dataset.values) - trial_duration = dataset.time_relative_to_stimulus_onset.max() #TODO: If there a reason not to use self.trial_duration? - return f1_f0(arr, tf, trial_duration) - - def _get_modulation_index(self, unit_id, condition_id): - """ Calculate modulation index for a given unit. - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - condition_id : - ID for the condition of interest (usually the preferred condition) - - Returns - ------- - modulation_index : metric - """ - tf = self.stimulus_conditions.loc[condition_id][self._col_tf] - - data = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=condition_id).data - sample_rate = 1 / np.mean(np.diff(self.conditionwise_psth.time_relative_to_stimulus_onset)) - - return modulation_index(data, tf, sample_rate) - - def _get_c50(self, unit_id): - """ Calculate C50 for a given unit. Only valid if the contrast tuning stimulus is present. Otherwise, - return NaN value - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns: - ------- - c50 : float - metric - - """ - - contrast_conditions = self.stim_table_contrast[ - (self.stim_table_contrast[self._col_ori] == self._get_pref_ori(unit_id))]['stimulus_condition_id'].unique() - - # contrasts = self.stimulus_conditions_contrast.loc[contrast_conditions]['contrast'].values.astype('float') - contrasts = self.stimulus_conditions_contrast.loc[contrast_conditions][self._col_contrast].values.astype('float') - mean_responses = self.conditionwise_statistics_contrast.loc[unit_id].loc[contrast_conditions]['spike_mean'].values.astype('float') - - return c50(contrasts, mean_responses) - - # Methods need to either be removed or updated to work with latest adaptor. Talked with Jsh and decision still - # pending. - ''' - def _get_tfdi(self, unit_id, pref_ori): - """ Calculate temporal frequency discrimination index for a given unit - - Only valid if the contrast tuning stimulus is present - Otherwise, return NaN value - - Params: - ------- - unit_id - unique ID for the unit of interest - pref_ori - preferred orientation for that cell - - Returns: - ------- - tfdi - metric - - """ - - ### NEEDS TO BE UPDATED FOR NEW ADAPTER - - v = list(self.spikes.keys())[nc] - tf_tuning = self.response_events[pref_ori, 1:, nc, 0] - trials = self.mean_sweep_events[(self.stim_table['Ori'] == self.orivals[pref_ori])][v].values - sse_part = np.sqrt(np.sum((trials-trials.mean())**2)/(len(trials)-5)) - return (np.ptp(tf_tuning))/(np.ptp(tf_tuning) + 2*sse_part) - ''' - - ''' - def _get_suppressed_contrast(self, unit_id, pref_ori, pref_tf): - """ Calculate two metrics used to determine if a unit is suppressed by contrast - - Params: - ------- - unit_id - unique ID for the unit of interest - pref_ori - preferred orientation for that cell - pref_tf - preferred temporal frequency for that cell - - Returns: - ------- - peak_blank - metric - all_blank - metric - - """ - - ### NEEDS TO BE UPDATED FOR NEW ADAPTER - - blank = self.response_events[0, 0, nc, 0] - peak = self.response_events[pref_ori, pref_tf+1, nc, 0] - all_resp = self.response_events[:, 1:, nc, 0].mean() - peak_blank = peak - blank - all_blank = all_resp - blank - - return peak_blank, all_blank - ''' - - ''' - def _fit_tf_tuning(self, unit_id, pref_ori, pref_tf): - - """ Performs Gaussian or exponential fit on the temporal frequency tuning curve at the preferred orientation. - - Params: - ------- - unit_id - unique ID for the unit of interest - pref_ori - preferred orientation for that cell - pref_tf - preferred temporal frequency for that cell - - Returns: - ------- - fit_tf_ind - metric - fit_tf - metric - tf_low_cutoff - metric - tf_high_cutoff - metric - """ - - ### NEEDS TO BE UPDATED FOR NEW ADAPTER - - tf_tuning = self.response_events[pref_ori, 1:, nc, 0] - fit_tf_ind = np.NaN - fit_tf = np.NaN - tf_low_cutoff = np.NaN - tf_high_cutoff = np.NaN - if pref_tf in range(1, 4): - try: - popt, pcov = curve_fit(gauss_function, range(5), tf_tuning, p0=[np.amax(tf_tuning), pref_tf, 1.], - maxfev=2000) - tf_prediction = gauss_function(np.arange(0., 4.1, 0.1), *popt) - fit_tf_ind = popt[1] - fit_tf = np.power(2, popt[1]) - low_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[:tf_prediction.argmax()].argmin() - high_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[ - tf_prediction.argmax():].argmin() + tf_prediction.argmax() - if low_cut_ind > 0: - low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] - tf_low_cutoff = np.power(2, low_cutoff) - elif high_cut_ind < 49: - high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] - tf_high_cutoff = np.power(2, high_cutoff) - except Exception: - pass - else: - fit_tf_ind = pref_tf - fit_tf = self.tfvals[pref_tf] - try: - popt, pcov = curve_fit(exp_function, range(5), tf_tuning, - p0=[np.amax(tf_tuning), 2., np.amin(tf_tuning)], maxfev=2000) - tf_prediction = exp_function(np.arange(0., 4.1, 0.1), *popt) - if pref_tf == 0: - high_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[ - tf_prediction.argmax():].argmin() + tf_prediction.argmax() - high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] - tf_high_cutoff = np.power(2, high_cutoff) - else: - low_cut_ind = np.abs(tf_prediction - (tf_prediction.max() / 2.))[ - :tf_prediction.argmax()].argmin() - low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] - tf_low_cutoff = np.power(2, low_cutoff) - except Exception: - pass - return fit_tf_ind, fit_tf, tf_low_cutoff, tf_high_cutoff - ''' - - ## VISUALIZATION ## - def plot_raster(self, stimulus_condition_id, unit_id): - """ Plot raster for one condition and one unit """ - idx_tf = np.where(self.tfvals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_tf])[0] - idx_ori = np.where(self.orivals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_ori])[0] - - if len(idx_tf) == len(idx_ori) == 1: - - presentation_ids = self.presentationwise_statistics.xs(unit_id, level=1)[ - self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] == stimulus_condition_id - ].index.values - - df = self.presentationwise_spike_times[ - (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & - (self.presentationwise_spike_times['unit_id'] == unit_id)] - - x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time - _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) - - plt.subplot(self.number_tf, self.number_ori, idx_tf*self.number_ori + idx_ori + 1) - plt.scatter(x, y, c='k', s=1, alpha=0.25) - plt.axis('off') - - def plot_response_summary(self, unit_id, bar_thickness=0.25): - """ Plot the spike counts across conditions """ - df = self.stimulus_conditions.drop(index=self.null_condition) - - df['tf_index'] = np.searchsorted(self.tfvals, df[self._col_tf].values) - df['ori_index'] = np.searchsorted(self.orivals, df[self._col_ori].values) - - cond_values = self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] - - x = df.loc[cond_values.values]['tf_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 - y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] - c = df.loc[cond_values.values]['tf_index'] - - plt.subplot(2, 1, 1) - plt.scatter(y, x, c=c, alpha=0.5, cmap='Purples', vmin=-5) - locs, labels = plt.yticks(ticks=np.arange(self.number_tf), labels=self.tfvals) - plt.ylabel('Temporal frequency') - plt.xlabel('Spikes per trial') - plt.ylim([self.number_tf, -1]) - - x = df.loc[cond_values.values]['ori_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 - y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] - c = df.loc[cond_values.values]['ori_index'] - - plt.subplot(2, 1, 2) - plt.scatter(x, y, c=c, alpha=0.5, cmap='Spectral') - locs, labels = plt.xticks(ticks=np.arange(self.number_ori), labels=self.orivals) - plt.xlabel('Orientation') - plt.ylabel('Spikes per trial') - - def make_star_plot(self, unit_id): - """ Make a 2P-style Star Plot based on presentationwise spike counts""" - angle_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_ori].values - r_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_tf].values - data = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'].values - - null_trials = np.where(angle_data == 'null')[0] - - angle_data = np.delete(angle_data, null_trials) - r_data = np.delete(r_data, null_trials) - data = np.delete(data, null_trials) - - cmin = np.min(data) - cmax = np.max(data) - - fp = FanPlotter.for_drifting_gratings() - fp.plot(r_data=r_data, angle_data=angle_data, data=data, clim=[cmin, cmax]) - fp.show_axes(closed=False) - plt.ylim([-5, 5]) - plt.axis('equal') - plt.axis('off') - - -### General functions ### -def _gauss_function(x, a, x0, sigma): - """ - fit gaussian function at log scale - good for fitting band pass, not good at low pass or high pass - """ - return a*np.exp(-(x-x0)**2/(2*sigma**2)) - - -def _exp_function(x, a, b, c): - return a*np.exp(-b*x)+c - - -def _contrast_curve(x, b, c, d, e): - """Difference of gaussian. - fit sigmoid function at log scale - not good for fitting band pass - - b: hill slope - - c: min response - - d: max response - - e: EC50 - """ - return c+(d-c)/(1+np.exp(b*(np.log(x)-np.log(e)))) - - -def c50(contrasts, responses): - """Computes C50, the halfway point between the maximum and minimum values in a curved fitted against a difference - of gaussian for the contrast values and their responese (mean spike rates) - - Parameters - ---------- - contrasts : array of floats - list of different contrast stimuli - responses : array of floats - array of responses (spike rates) - - Returns - ------- - c50 : float - """ - if contrasts.size == 0 or contrasts.size != responses.size: - warnings.warn('the contrasts and responses arrays must be of the same length') - return np.nan - - try: - # find the paraemters that best fit the contrast curve give x = contrast-vals and y = responses - fitCoefs, _ = curve_fit(_contrast_curve, contrasts, responses, maxfev=100000) - - except RuntimeError as e: - warnings.warn(str(e)) - return np.nan - - # Create the constrast curve using the optimized parameters, get the halfway range point on the curve - # resids = responses - contrast_curve(contrasts.astype('float'), *fitCoefs) - X = np.linspace(min(contrasts)*0.9, max(contrasts)*1.1, 256) # - y_fit = _contrast_curve(X, *fitCoefs) - y_middle = (np.max(y_fit) - np.min(y_fit)) / 2 + np.min(y_fit) - - try: - # y_fit is unlikely to be sorted, so to get the optimial value we should sort by y_fit and X before calling - # numpy's searchsorted() - sorted_indicies = np.argsort(y_fit) - X_sorted = X[sorted_indicies] - y_fit_sorted = y_fit[sorted_indicies] - c50 = X_sorted[np.searchsorted(y_fit_sorted, y_middle)] - - except IndexError as e: - warnings.warn(str(e)) - return np.nan - - return c50 - - -def f1_f0(arr, tf, trial_duration): - """Computes F1/F0 of a drifting grating response - - Parameters - ---------- - arr : - DataArray with trials x bin-times - tf : - temporal frequency of the stimulus - - Returns - ------- - f1_f0 : float - metric - - """ - if arr.size == 0: - return np.nan - - if arr.ndim == 1: - arr = arr.reshape(1, arr.size) - - # For each trial group the bins into blocks that will go to the length of the temporal frequency - num_bins = arr.shape[1] - num_trials = arr.shape[0] - cycles_per_trial = int(tf * trial_duration) - bins_per_cycle = int(num_bins / cycles_per_trial) - if bins_per_cycle == 0: - # can occur if temp-freq x trial duration is greater than the total trial duration - return np.nan - - arr = arr[:, :cycles_per_trial*bins_per_cycle].reshape((num_trials, cycles_per_trial, bins_per_cycle)) - avg_rate = np.mean(arr, 1) - AMP = 2*np.abs(fft(avg_rate, bins_per_cycle)) / bins_per_cycle - - f0 = 0.5*AMP[:, 0] - f1 = AMP[:, 1] - selection = f0 > 0.0 - if not np.any(selection): - # No spikes found - return np.nan - - return np.nanmean(f1[selection]/f0[selection]) - - -def modulation_index(response_psth, tf, sample_rate): - """Depth of modulation by each cycle of a drifting grating; similar to F1/F0 - - ref: Matteucci et al. (2019) Nonlinear processing of shape information - in rat lateral extrastriate cortex. J Neurosci 39: 1649-1670 - - Parameters - ---------- - response_psth : array of floats - the binned responses of a unit for a given stimuli - tf : float - the temporal frequency - sample_rate : float - the sampling rate of response_psth - - Returns - ------- - modulation_index : float - the mi value - - """ - if response_psth.size == 0: - warnings.warn('response_psth is empty') - return np.nan - - f, psd = signal.welch(response_psth, fs=sample_rate, nperseg=1024) # get freqs. and power spectral density - mean_psd = np.mean(psd) - if mean_psd == 0.0: - # TODO: Check with josh, should it be 0 or nan? - return 0.0 - - tf_index = np.searchsorted(f, tf) - if not 0 <= tf_index < psd.size: - warnings.warn('specified temporal frequency is not within the singals sampling range. Please adjust tf and/or' - 'sample_rate parameters.') - return np.nan - - return abs((psd[tf_index] - np.mean(psd))/np.sqrt(np.mean(psd**2)- mean_psd**2)) - diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/flashes.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/flashes.py deleted file mode 100644 index e9d7d5b2ef..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/flashes.py +++ /dev/null @@ -1,221 +0,0 @@ -import numpy as np -import pandas as pd -from six import string_types -import scipy.ndimage as ndi -import scipy.stats as st -from scipy.optimize import curve_fit -import logging - -import matplotlib.pyplot as plt - -from .stimulus_analysis import StimulusAnalysis, get_fr - -import warnings -warnings.simplefilter(action='ignore', category=FutureWarning) - - -logger = logging.getLogger(__name__) - - -class Flashes(StimulusAnalysis): - """ - A class for computing single-unit metrics from the full-field flash stimulus of an ecephys session NWB file. - - To use, pass in a EcephysSession object:: - session = EcephysSession.from_nwb_path('/path/to/my.nwb') - fl_analysis = Flashes(session) - - or, alternatively, pass in the file path:: - fl_analysis = Flashes('/path/to/my.nwb') - - You can also pass in a unit filter dictionary which will only select units with certain properties. For example - to get only those units which are on probe C and found in the VISp area:: - fl_analysis = Flashes(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) - - To get a table of the individual unit metrics ranked by unit ID:: - metrics_table_df = fl_analysis.metrics() - - """ - - def __init__(self, ecephys_session, col_color='color', trial_duration=0.25, **kwargs): - super(Flashes, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) - self._metrics = None - - self._colors = None - self._col_color = col_color - - if self._params is not None: - self._params = self._params.get('flashes', {}) - self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars - else: - self._params = {} - - @property - def name(self): - return 'Flashes' - - @property - def colors(self): - """ Array of 'color' conditions (black vs. white flash) """ - if self._colors is None: - self._get_stim_table_stats() - - return self._colors - - @property - def number_colors(self): - """ Number of 'color' conditions (black vs. white flash) """ - if self._colors is None: - self._get_stim_table_stats() - - return len(self._colors) - - @property - def null_condition(self): - """ Stimulus condition ID for null stimulus (not used, so set to -1) """ - # TODO: If null_condition is not used remove it, parent should have it set to 1 - return -1 - - @property - def METRICS_COLUMNS(self): - return [('on_off_ratio_fl', np.float64), - ('sustained_idx_fl', np.float64), - ('firing_rate_fl', np.float64), - ('time_to_peak_fl', np.float64), - ('fano_fl', np.float64), - ('lifetime_sparseness_fl', np.float64), - ('run_pval_fl', np.float64), - ('run_mod_fl', np.float64)] - - @property - def metrics(self): - if self._metrics is None: - logger.info('Calculating metrics for ' + self.name) - unit_ids = self.unit_ids - metrics_df = self.empty_metrics_table() - - if len(self. stim_table) > 0: - metrics_df['on_off_ratio_fl'] = [self._get_on_off_ratio(unit) for unit in unit_ids] - metrics_df['sustained_idx_fl'] = [self._get_sustained_index(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['firing_rate_fl'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] - metrics_df['time_to_peak_fl'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['fano_fl'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['lifetime_sparseness_fl'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] - metrics_df.loc[:, ['run_pval_fl', 'run_mod_fl']] = [ - self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - - self._metrics = metrics_df - - return self._metrics - - def _find_stimulus_key(self, stim_table): - """Tries to guess the correct stimulus_key based on the data. - - :param stim_table: - :return: - """ - known_keys_lc = [k.lower() for k in self.__class__.known_stimulus_keys()] - - for table_key in stim_table['stimulus_name'].unique(): - table_key_lc = table_key.lower() - for known_key in known_keys_lc: - if table_key_lc.startswith(known_key): - return table_key - - else: - return None - - @classmethod - def known_stimulus_keys(cls): - return ['flash', 'flashes'] - - def _get_stim_table_stats(self): - """ Extract colors from the stimulus table """ - self._colors = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_color] - != 'null'][self._col_color].unique()) - - def _get_sustained_index(self, unit_id, condition_id): - """ Calculate the sustained index for a given unit, a measure of the transience of the flash response. - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - sustained_index : - ratio of the mean PSTH and the maximum of the PSTH - A cell that fires very transiently will have a sustained index close to 0 - A cell that first continuously throughout the flash will have a sustained index closer to 1 - """ - psth = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=condition_id).data - return np.mean(psth)/np.amax(psth) - - def _get_on_off_ratio(self, unit_id): - """Gets the ratio of mean spikes for on-stimuli vs off stimuli. - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - on_off_ratio : float - """ - on_condition_id = self.stimulus_conditions[self.stimulus_conditions[self._col_color] == 1.0].index.values - off_condition_id = self.stimulus_conditions[self.stimulus_conditions[self._col_color] == -1.0].index.values - - on_mean_spikes = self.conditionwise_statistics.loc[unit_id].loc[on_condition_id]['spike_mean'].values - off_mean_spikes = self.conditionwise_statistics.loc[unit_id].loc[off_condition_id]['spike_mean'].values - - if len(on_mean_spikes) == 0 or len(off_mean_spikes) == 0: - return np.nan - - if off_mean_spikes[0] > 0: - return on_mean_spikes[0] / off_mean_spikes[0] - else: - return np.nan - - ## VISUALIZATION ## - def plot_raster(self, stimulus_condition_id, unit_id): - - """ Plot raster for one condition and one unit """ - - idx_color = np.where(self.colors == self.stimulus_conditions.loc[stimulus_condition_id][self._col_color])[0] - - if len(idx_color) == 1: - - presentation_ids = self.presentationwise_statistics.xs(unit_id, level=1)[ - self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] - == stimulus_condition_id].index.values - - df = self.presentationwise_spike_times[ - (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & - (self.presentationwise_spike_times['unit_id'] == unit_id) - ] - - x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time - _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) - - plt.subplot(self.number_colors, 1, idx_color + 1) - plt.scatter(x, y, c='k', s=1, alpha=0.25) - plt.axis('off') - - def plot_response(self, unit_id): - """ Plot a histogram for the two conditions """ - plot_colors = ('darkslateblue', 'grey') - - for idx, color in enumerate(self.colors): - - condition_id = self.stimulus_conditions[self.stimulus_conditions['color'] == color].index.values[0] - - psth = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=condition_id).values - - plt.bar(np.arange(len(psth))-0.5, psth, color=plot_colors[idx], alpha=0.5, width=1.0) - plt.step(np.arange(len(psth)), psth, color=plot_colors[idx]) - plt.axis('off') diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_movies.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_movies.py deleted file mode 100644 index cd8461a144..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_movies.py +++ /dev/null @@ -1,92 +0,0 @@ -import numpy as np -import pandas as pd -from six import string_types -import scipy.ndimage as ndi -import scipy.stats as st -from scipy.optimize import curve_fit -import logging - -import matplotlib.pyplot as plt - -from .stimulus_analysis import StimulusAnalysis, get_fr - -import warnings -warnings.simplefilter(action='ignore', category=FutureWarning) - - -logger = logging.getLogger(__name__) - - -class NaturalMovies(StimulusAnalysis): - """ - A class for computing single-unit metrics from the natural movies stimulus of an ecephys session NWB file. - - To use, pass in a EcephysSession object:: - session = EcephysSession.from_nwb_path('/path/to/my.nwb') - nm_analysis = NaturalMovies(session) - - or, alternatively, pass in the file path:: - nm_analysis = Flashes('/path/to/my.nwb') - - You can also pass in a unit filter dictionary which will only select units with certain properties. For example - to get only those units which are on probe C and found in the VISp area:: - nm_analysis = NaturalMovies(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) - - To get a table of the individual unit metrics ranked by unit ID:: - metrics_table_df = nm_analysis.metrics() - - TODO: Need to find a default trial_duration otherwise class will fail - """ - - def __init__(self, ecephys_session, trial_duration=None, **kwargs): - super(NaturalMovies, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) - - self._metrics = None - - if self._params is not None: - self._params = self._params['natural_movies'] - self._stimulus_key = self._params['stimulus_key'] - #else: - # self._stimulus_key = 'natural_movies' - - @property - def name(self): - return 'Natural Movies' - - @property - def null_condition(self): - return -1 - - @property - def METRICS_COLUMNS(self): - return [('fano_nm', np.uint64), - ('firing_rate_nm', np.float64), - ('lifetime_sparseness_nm', np.float64), - ('run_pval_ns', np.float64), - ('run_mod_ns', np.float64)] - - @property - def metrics(self): - if self._metrics is None: - logger.info('Calculating metrics for ' + self.name) - - unit_ids = self.unit_ids - metrics_df = self.empty_metrics_table() - metrics_df['fano_nm'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['firing_rate_nm'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] - metrics_df['lifetime_sparseness_nm'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] - run_vals = [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - metrics_df['run_pval_nm'] = [rv[0] for rv in run_vals] - metrics_df['run_mod_nm'] = [rv[1] for rv in run_vals] - - self._metrics = metrics_df - - return self._metrics - - @classmethod - def known_stimulus_keys(cls): - return ['natural_movies', 'natural_movie_1', 'natural_movie_3'] - - def _get_stim_table_stats(self): - pass diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py deleted file mode 100644 index f2cb2a3e89..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py +++ /dev/null @@ -1,192 +0,0 @@ -import numpy as np -import pandas as pd -import logging -import warnings - -from .stimulus_analysis import StimulusAnalysis - - -warnings.simplefilter(action='ignore', category=FutureWarning) - - -logger = logging.getLogger(__name__) - - -class NaturalScenes(StimulusAnalysis): - """ - A class for computing single-unit metrics from the natural scenes stimulus of an ecephys session NWB file. - - To use, pass in a EcephysSession object:: - session = EcephysSession.from_nwb_path('/path/to/my.nwb') - ns_analysis = NaturalScenes(session) - - or, alternatively, pass in the file path:: - ns_analysis = NaturalScenes('/path/to/my.nwb') - - You can also pass in a unit filter dictionary which will only select units with certain properties. For example - to get only those units which are on probe C and found in the VISp area:: - ns_analysis = NaturalScenes(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) - - To get a table of the individual unit metrics ranked by unit ID:: - metrics_table_df = ns_analysis.metrics() - - """ - - def __init__(self, ecephys_session, col_image='frame', trial_duration=0.25, **kwargs): - super(NaturalScenes, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) - - self._images = None - self._number_images = None - self._images_nonblank = None - self._number_nonblank = None # does not include Image number = -1. - self._mean_sweep_events = None - self._response_events = None - self._response_trials = None - self._metrics = None - - self._col_image = col_image - - if self._params is not None: - self._params = self._params.get('natural_scenes', {}) - self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars - else: - self._params = {} - - @property - def name(self): - return 'Natural Scenes' - - @property - def images(self): - """ Array of iamge labels """ - if self._images is None: - self._get_stim_table_stats() - - return self._images - - @property - def images_nonblank(self): - if self._images_nonblank is None: - self._get_stim_table_stats() - - return self._images_nonblank - - @property - def frames(self): - # Required to deal with naming difference between NWB 1 and 2 - return self.images - - @property - def number_images(self): - """ Number of images shown """ - if self._images is None: - self._get_stim_table_stats() - - return self._number_images - - @property - def number_nonblank(self): - """ Number of images shown (excluding blank condition) """ - if self._number_nonblank is None: - self._get_stim_table_stats() - - return self._number_nonblank - - @property - def null_condition(self): - """ Stimulus condition ID for null (blank) stimulus """ - return self.stimulus_conditions[self.stimulus_conditions[self._col_image] == -1].index - - @property - def METRICS_COLUMNS(self): - return [('pref_image_ns', np.uint64), - ('image_selectivity_ns', np.float64), - ('firing_rate_ns', np.float64), - ('fano_ns', np.float64), - ('time_to_peak_ns', np.float64), - ('lifetime_sparseness_ns', np.float64), - ('run_pval_ns', np.float64), - ('run_mod_ns', np.float64)] - - @property - def metrics(self): - if self._metrics is None: - logger.info('Calculating metrics for ' + self.name) - - unit_ids = self.unit_ids - metrics_df = self.empty_metrics_table() - - if len(self.stim_table) > 0: - logger.info('Calculating metrics for ' + self.name) - - metrics_df['pref_image_ns'] = [self._get_preferred_condition(unit) for unit in unit_ids] - metrics_df['pref_images_multi_ns'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_image, self.images_nonblank) - for unit_id in unit_ids - ] - metrics_df['image_selectivity_ns'] = [self._get_image_selectivity(unit) for unit in unit_ids] - metrics_df['firing_rate_ns'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] - metrics_df['fano_ns'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['time_to_peak_ns'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['lifetime_sparseness_ns'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] - metrics_df.loc[:, ['run_pval_ns', 'run_mod_ns']] = [ - self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - - self._metrics = metrics_df - - return self._metrics - - @classmethod - def known_stimulus_keys(cls): - return ['natural_scenes', 'Natural_Images', 'Natural Images'] - - def _get_stim_table_stats(self): - """ Extract image labels from the stimulus table """ - self._images = np.sort(self.stimulus_conditions[self._col_image].unique()).astype(np.int64) - self._number_images = len(self._images) - self._images_nonblank = self._images[self._images >= 0] - self._number_nonblank = len(self._images_nonblank) - - def _get_image_selectivity(self, unit_id, num_steps=1000): - """ Calculate the image selectivity for a given unit using spike means at every image""" - - unit_stats = self.conditionwise_statistics.loc[unit_id].drop(index=self.null_condition) - return image_selectivity(unit_stats['spike_mean'].values, num_steps=num_steps) - - -def image_selectivity(spike_means, num_steps=1000): - """Quantifies how selective a cell is for images, based on Quian Quiroga et al., 2007. A value of 0 indicates - the cell responds the same no mater what the image. While if the neuron only responds to a single image it - will have a selectivity of 1 - 2/N (1.0 and N goes to inf). - - Parameters - ---------- - spike_means : array of floats - Averaged spiking responses to a series of images for a given neuron - num_steps : int - Number of threshold values used to build response distribution (default to 1000 as in Quian paper) - - Returns - ------- - selectivity : float - selectivity of neuron to images - """ - if spike_means.size < 2 or num_steps < 2: - # What is the selectivity of none of 0 spikes (by definition should be 0 and 1) - return np.nan - - # Essentially creates a cumulative distribution function of responses at a given set of thresholds, finds the - # area under the response distribution and normalizes between 0 and 1. - fmin = spike_means.min() - fmax = spike_means.max() - if fmin == fmax: - # A uniform response of none for each image, make sure to return 0 - return 0.0 - - j = np.arange(num_steps) - thresh = fmin + j*((fmax - fmin) / num_steps) - rtj = [np.mean(spike_means > t) for t in thresh] - - return 1 - (2 * np.mean(rtj)) diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py deleted file mode 100644 index 3d849c1ad1..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py +++ /dev/null @@ -1,585 +0,0 @@ -import numpy as np -import scipy.ndimage as ndi -from scipy.optimize import curve_fit, leastsq -import logging -import matplotlib.pyplot as plt - -from ...chisquare_categorical import chisq_from_stim_table -from .stimulus_analysis import StimulusAnalysis - -import warnings -warnings.simplefilter(action='ignore', category=FutureWarning) - - -logger = logging.getLogger(__name__) - - -class ReceptiveFieldMapping(StimulusAnalysis): - """ - A class for computing single-unit metrics from the receptive field mapping stimulus of an ecephys session NWB file. - - To use, pass in a EcephysSession object:: - session = EcephysSession.from_nwb_path('/path/to/my.nwb') - rf_analysis = ReceptiveFieldMapping(session) - - or, alternatively, pass in the file path:: - rf_analysis = ReceptiveFieldMapping('/path/to/my.nwb') - - You can also pass in a unit filter dictionary which will only select units with certain properties. For example - to get only those units which are on probe C and found in the VISp area:: - rf_analysis = ReceptiveFieldMapping(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) - - To get a table of the individual unit metrics ranked by unit ID:: - metrics_table_df = rf_analysis.metrics() - - """ - def __init__(self, ecephys_session, col_pos_x='x_position', col_pos_y='y_position', trial_duration=0.25, - minimum_spike_count=10.0, mask_threshold=0.5, **kwargs): - super(ReceptiveFieldMapping, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) - - self._pos_x = None - self._pos_y = None - - self._rf_matrix = None - - self._col_pos_x = col_pos_x - self._col_pos_y = col_pos_y - - self._minimum_spike_count = minimum_spike_count - self._mask_threshold = mask_threshold - - #if self._params is not None: - # self._params = self._params['receptive_field_mapping'] - # self._stimulus_key = self._params['stimulus_key'] - # self._minimum_spike_count = self._params.get('minimum_spike_count', minimum_spike_count) - # self._mask_threshold = self._params.get('mask_threshold', mask_threshold) - - @property - def name(self): - return 'Receptive Field Mapping' - - @property - def elevations(self): - """ Array of stimulus elevations """ - if self._pos_y is None: - self._get_stim_table_stats() - - return self._pos_y - - @property - def azimuths(self): - """ Array of stimulus azimuths """ - if self._pos_x is None: - self._get_stim_table_stats() - - return self._pos_x - - @property - def number_elevations(self): - """ Number of stimulus elevations """ - if self._pos_y is None: - self._get_stim_table_stats() - - return len(self._pos_y) - - @property - def number_azimuths(self): - """ Number of stimulus azimuths """ - if self._pos_x is None: - self._get_stim_table_stats() - - return len(self._pos_y) # TODO: Save this instead of calculating every time. - - @property - def null_condition(self): - """ Stimulus condition ID for null stimulus (not used, so set to -1) """ - # TODO: Remove - return -1 - - @property - def receptive_fields(self): - """ Spatial receptive fields for N units (9 x 9 x N matrix of responses) """ - if self._rf_matrix is None: - bin_edges = np.linspace(0, 0.249, 3) - - self.stim_table.loc[:, self._col_pos_y] = 40.0 - self.stim_table[self._col_pos_y] - presentationwise_response_matrix = self.ecephys_session.presentationwise_spike_counts( - bin_edges=bin_edges, - stimulus_presentation_ids=self.stim_table.index.values, - unit_ids=self.unit_ids, - ) - - self._rf_matrix = self._response_by_stimulus_position(presentationwise_response_matrix, self.stim_table) - - return self._rf_matrix - - - @property - def METRICS_COLUMNS(self): - return [('azimuth_rf', np.float64), - ('elevation_rf', np.float64), - ('width_rf', np.float64), - ('height_rf', np.float64), - ('area_rf', np.float64), - ('p_value_rf', np.float64), - ('on_screen_rf', bool), - ('firing_rate_rf', np.float64), - ('fano_rf', np.float64), - ('time_to_peak_rf', np.float64), - ('lifetime_sparseness_rf', np.float64), - ('run_mod_rf', np.float64), - ('run_pval_rf', np.float64) - ] - - @property - def metrics(self): - if self._metrics is None: - logger.info('Calculating metrics for ' + self.name) - unit_ids = self.unit_ids - metrics_df = self.empty_metrics_table() - - if len(self.stim_table) > 0: - metrics_df.loc[:, ['azimuth_rf', - 'elevation_rf', - 'width_rf', - 'height_rf', - 'area_rf', - 'p_value_rf', - 'on_screen_rf', - ]] = [self._get_rf_stats(unit) for unit in unit_ids] - metrics_df['firing_rate_rf'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] - metrics_df['fano_rf'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['time_to_peak_rf'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) - for unit in unit_ids] - metrics_df['lifetime_sparseness_rf'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] - metrics_df.loc[:, ['run_pval_rf', 'run_mod_rf']] = \ - [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - - self._metrics = metrics_df - - return self._metrics - - @classmethod - def known_stimulus_keys(cls): - return ['receptive_field_mapping', 'gabor', "gabors"] - - def _find_stimulus_key(self, stim_table): - known_keys_lc = [k.lower() for k in self.__class__.known_stimulus_keys()] - - for table_key in stim_table['stimulus_name'].unique(): - table_key_lc = table_key.lower() - for known_key in known_keys_lc: - if table_key_lc.startswith(known_key): - return table_key - - else: - return None - - def _get_stim_table_stats(self): - """ Extract azimuths and elevations from stimulus table.""" - - self._pos_y = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_pos_y] - != 'null'][self._col_pos_y].unique()) - self._pos_x = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_pos_x] - != 'null'][self._col_pos_x].unique()) - - def get_receptive_field(self, unit_id): - """ Alias for _get_rf - """ - - return self._get_rf(unit_id) - - def _get_rf(self, unit_id): - """ Extract the receptive field for one unit - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - receptive_field : 9 x 9 numpy array - """ - return self.receptive_fields['spike_counts'].sel(unit_id=unit_id).data - - - def _response_by_stimulus_position(self, dataset, presentations, row_key=None, column_key=None, unit_key='unit_id', - time_key='time_relative_to_stimulus_onset', spike_count_key='spike_count'): - """ Calculate the unit's response to different locations - of the Gabor patch - - Returns - ------- - dataset : xarray - dataset of receptive fields - """ - - if row_key is None: - row_key = self._col_pos_y - if column_key is None: - column_key = self._col_pos_x - - dataset = dataset.copy() - dataset[spike_count_key] = dataset.sum(dim=time_key) - dataset = dataset.drop(time_key) - - dataset[row_key] = presentations.loc[:, row_key] - dataset[column_key] = presentations.loc[:, column_key] - dataset = dataset.to_dataframe() - - dataset = dataset.reset_index(unit_key).groupby([row_key, column_key, unit_key]).sum() - - return dataset.to_xarray() - - def _get_rf_stats(self, unit_id): - """ Calculate a variety of metrics for one unit's receptive field - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - azimuth : - preferred azimuth in degrees, based on center of mass of thresholded RF - elevation : - preferred elevation in degrees, based on center of mass of thresholded RF - width : - receptive field width in degrees, based on Gaussian fit - height : - receptive field height in degrees, based on Gaussian fit - area : - receptive field area in degrees^2, based on thresholded RF area - p_value : - probability that a significant receptive field is present, based on categorical chi-square test - on_screen : - True if the receptive field is away from the screen edge, based on Gaussian fit - """ - rf = self._get_rf(unit_id) - spikes_per_trial = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'].values - - - if np.sum(spikes_per_trial) < self._minimum_spike_count: - return np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, False - - p_value = chisq_from_stim_table(self.stim_table, [self._col_pos_x, self._col_pos_y], - np.expand_dims(spikes_per_trial,1)) - - #print(self._params) - #exit() - rf_thresh, azimuth, elevation, area = threshold_rf(rf, self._mask_threshold) - - if is_rf_inverted(rf_thresh): - rf = invert_rf(rf) - - (peak_height, center_y, center_x, width_y, width_x), success = fit_2d_gaussian(rf) - on_screen = rf_on_screen(rf, center_y, center_x) - - height_deg = convert_pixels_to_degrees(width_y) - width_deg = convert_pixels_to_degrees(width_x) - azimuth_deg = convert_azimuth_to_degrees(azimuth) - elevation_deg = convert_elevation_to_degrees(elevation) - area_deg = convert_pixel_area_to_degrees(area) - - return azimuth_deg, elevation_deg, width_deg, height_deg, area_deg, p_value[0], on_screen - - ## VISUALIZATION ## - def plot_raster(self, stimulus_condition_id, unit_id): - - """ Plot raster for one condition and one unit """ - - idx_elev = np.where(self.elevations == self.stimulus_conditions.loc[stimulus_condition_id][self._col_pos_y])[0] - idx_azi = np.where(self.azimuths == self.stimulus_conditions.loc[stimulus_condition_id][self._col_pos_x])[0] - - if len(idx_elev) == len(idx_azi) == 1: - - presentation_ids = self.presentationwise_statistics.xs(unit_id, level=1)[ - self.presentationwise_statistics.xs(unit_id, level=1)[ - 'stimulus_condition_id'] == stimulus_condition_id].index.values - - df = self.presentationwise_spike_times[ \ - (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & \ - (self.presentationwise_spike_times['unit_id'] == unit_id) ] - - x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time - _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) - - idx_elev = self.number_elevations - idx_elev - 1 # reverse the elevation index so it matches the RF - - plt.subplot(self.number_elevations, self.number_azimuths, idx_elev*self.number_azimuths + idx_azi + 1) - plt.scatter(x, y, c='k', s=1, alpha=0.25) - plt.axis('off') - - def plot_rf(self, unit_id): - """ Plot the spike counts across conditions """ - plt.imshow(self._get_rf(unit_id), cmap='Greys') - plt.axis('off') - - -#### HELPER FUNCTIONS #### -def _gaussian_function_2d(peak_height, center_y, center_x, width_y, width_x): - """Returns a 2D Gaussian function - - Parameters - ---------- - peak_height : - peak of distribution - center_y : - y-coordinate of distribution center - center_x : - x-coordinate of distribution center - width_y : - width of distribution along x-axis - width_x : - width of distribution along y-axis - - Returns - ------- - f(x,y) : function - Returns the value of the distribution at a particular x,y coordinate - - """ - - return lambda x,y: peak_height \ - * np.exp( \ - -( \ - ((center_y - y) / width_y)**2 \ - + ((center_x - x) / width_x)**2 \ - ) \ - / 2 \ - ) - - -def gaussian_moments_2d(data): - """Finds the moments of a 2D Gaussian distribution, given an input matrix - - Parameters - ---------- - data : numpy.ndarray - 2D matrix - - Returns - ------- - peak_height : - peak of distribution - center_y : - y-coordinate of distribution center - center_x : - x-coordinate of distribution center - width_y : - width of distribution along x-axis - width_x : - width of distribution along y-axis - """ - - total = data.sum() - height = data.max() - - Y, X = np.indices(data.shape) - center_y = (Y*data).sum()/total - center_x = (X*data).sum()/total - - if np.isnan(center_y) or np.isinf(center_y) or np.isnan(center_x) or np.isinf(center_x): - return None - - col = data[:, int(center_x)] - row = data[int(center_y), :] - - width_y = np.sqrt(np.abs((np.arange(row.size)-center_y)**2*row).sum()/row.sum()) - width_x = np.sqrt(np.abs((np.arange(col.size)-center_x)**2*col).sum()/col.sum()) - - return height, center_y, center_x, width_y, width_x - - -def fit_2d_gaussian(matrix): - """Fits a receptive field with a 2-dimensional Gaussian distribution - - Parameters - ---------- - matrix : numpy.ndarray - 2D matrix of spike counts - - Returns - ------- - parameters - tuple - peak_height : peak of distribution - center_y : y-coordinate of distribution center - center_x : x-coordinate of distribution center - width_y : width of distribution along x-axis - width_x : width of distribution along y-axis - success - bool - True if a fit was found, False otherwise - """ - - params = gaussian_moments_2d(matrix) - if params is None: - return (np.nan, np.nan, np.nan, np.nan, np.nan), False - - errorfunction = lambda p: np.ravel(_gaussian_function_2d(*p)(*np.indices(matrix.shape)) - matrix) - fit_params, ier = leastsq(errorfunction, params) - success = True if ier < 5 else False - - return fit_params, success - - -def is_rf_inverted(rf_thresh): - """Checks if the receptive field mapping timulus is suppressing or exciting the cell - - Parameters - ---------- - rf_thresh : matrix - matrix of spike counts at each stimulus position - - Returns - ------- - if_rf_inverted : bool - True if the receptive field is inverted - """ - edge_mask = np.zeros(rf_thresh.shape) - - edge_mask[:,0] = 1 - edge_mask[:,-1] = 1 - edge_mask[0,:] = 1 - edge_mask[-1,:] = 1 - - num_edge_pixels = np.sum(rf_thresh * edge_mask) - - return num_edge_pixels > np.sum(edge_mask) / 2 - - -def invert_rf(rf): - """Creates an inverted version of the receptive field - - Parameters - ---------- - rf - matrix of spike counts at each stimulus position - - Returns - ------- - rf_inverted - new RF matrix - - """ - return np.max(rf) - rf - - -def threshold_rf(rf, threshold): - """Creates a spatial mask based on the receptive field peak, and returns the x, y coordinates of the center of - mass, as well as the area. - - Parameters - ---------- - rf : numpy.ndarray - 2D matrix of spike counts - threshold : float - Threshold as ratio of the RF's standard deviation - - Returns - ------- - threshold_rf : numpy.ndarray - Thresholded version of the original RF - center_x : float - x-coordinate of mask center of mass - center_y : float - y-coordinate of mask center of mass - area : float - area of mask - """ - rf_filt = ndi.gaussian_filter(rf, 1) - - threshold_value = np.max(rf_filt) - np.std(rf_filt) * threshold - - rf_thresh = np.zeros(rf.shape, dtype='bool') - rf_thresh[rf_filt > threshold_value] = True - - labels, num_features = ndi.label(rf_thresh) - - best_label = np.argmax(ndi.maximum(rf_filt, labels=labels, index=np.unique(labels))) - - labels[labels != best_label] = 0 - labels[labels > 0] = 1 - - center_y, center_x = ndi.measurements.center_of_mass(labels) - area = float(np.sum(labels)) - - return labels, np.around(center_x, 4), np.around(center_y, 4), area - - -def rf_on_screen(rf, center_y, center_x): - """Checks whether the receptive field is on the screen, given the center location.""" - return 0 < center_y < rf.shape[0] and 0 < center_x < rf.shape[1] - - -def convert_elevation_to_degrees(elevation_in_pixels, elevation_offset_degrees=-30): - """Converts a pixel-based elevation into degrees relative to center of gaze - - The receptive field computed by this class is oriented such that the - pixel values are in the correct relative location when using matplotlib.pyplot.imshow(), - which places (0,0) in the upper-left corner of the figure. - - Therefore, we need to invert the elevation value prior to converting to degrees. - - Parameters - ---------- - elevation_in_pixels : float - elevation_offset_degrees: float - - Returns - ------- - elevation_in_degrees : float - """ - elevation_in_degrees = convert_pixels_to_degrees(8 - elevation_in_pixels) + elevation_offset_degrees - - return elevation_in_degrees - - -def convert_azimuth_to_degrees(azimuth_in_pixels, azimuth_offset_degrees=10): - """Converts a pixel-based azimuth into degrees relative to center of gaze - - Parameters - ---------- - azimuth_in_pixels : float - azimuth_offset_degrees: float - - Returns - ------- - azimuth_in_degrees : float - """ - azimuth_in_degrees = convert_pixels_to_degrees((azimuth_in_pixels)) + azimuth_offset_degrees - - return azimuth_in_degrees - - -def convert_pixels_to_degrees(value_in_pixels, degrees_to_pixels_ratio=10): - """Converts a pixel-based distance into degrees - - Parameters - ---------- - value_in_pixels : float - degrees_to_pixels_ratio: float - - Returns - ------- - value in degrees : float - """ - return value_in_pixels * degrees_to_pixels_ratio - - -def convert_pixel_area_to_degrees(area_in_pixels): - """Converts a pixel-based area measure into degrees - - Each pixel is a square with side of length <degrees_to_pixels_ratio> - - So the area in degrees is area_in_pixels * <degrees to_pixels_ratio>^2 - - Parameters - ---------- - area_in_pixels : float - - Returns - ------- - area_in_degrees : float - """ - return area_in_pixels * pow(convert_pixels_to_degrees(1), 2) diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/static_gratings.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/static_gratings.py deleted file mode 100644 index e01f41ccc7..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/static_gratings.py +++ /dev/null @@ -1,454 +0,0 @@ -from six import string_types -import numpy as np -import pandas as pd -from scipy.optimize import curve_fit -from functools import partial -import logging - -import matplotlib.pyplot as plt - -from .stimulus_analysis import StimulusAnalysis -from .stimulus_analysis import osi, deg2rad -from ...circle_plots import FanPlotter - -import warnings -warnings.simplefilter(action='ignore', category=FutureWarning) - - -logger = logging.getLogger(__name__) - - -class StaticGratings(StimulusAnalysis): - """ - A class for computing single-unit metrics from the static gratings stimulus of an ecephys session NWB file. - - To use, pass in a EcephysSession object:: - session = EcephysSession.from_nwb_path('/path/to/my.nwb') - sg_analysis = StaticGratings(session) - - or, alternatively, pass in the file path:: - sg_analysis = StaticGratings('/path/to/my.nwb') - - You can also pass in a unit filter dictionary which will only select units with certain properties. For example - to get only those units which are on probe C and found in the VISp area:: - sg_analysis = StaticGratings(session, filter={'location': 'probeC', 'ecephys_structure_acronym': 'VISp'}) - - To get a table of the individual unit metrics ranked by unit ID:: - metrics_table_df = sg_analysis.metrics() - - """ - - def __init__(self, ecephys_session, col_ori='orientation', col_sf='spatial_frequency', col_phase='phase', - trial_duration=0.25, **kwargs): - super(StaticGratings, self).__init__(ecephys_session, trial_duration=trial_duration, **kwargs) - self._orivals = None - self._number_ori = None - self._sfvals = None - self._number_sf = None - self._phasevals = None - self._number_phase = None - # self._response_events = None - # self._response_trials = None - - self._metrics = None - - self._col_ori = col_ori - self._col_sf = col_sf - self._col_phase = col_phase - self._trial_duration = trial_duration - # self._module_name = 'Static Gratings' # TODO: module_name should be a static class variable - - if self._params is not None: - self._params = self._params.get('static_gratings', {}) - self._stimulus_key = self._params.get('stimulus_key', None) # Overwrites parent value with argvars - else: - self._params = {} - - @property - def name(self): - return 'Static Gratings' - - @property - def orivals(self): - """ Array of grating orientation conditions """ - if self._orivals is None: - self._get_stim_table_stats() - - return self._orivals - - @property - def number_ori(self): - """ Number of grating orientation conditions """ - if self._number_ori is None: - self._get_stim_table_stats() - - return self._number_ori - - @property - def sfvals(self): - """ Array of grating spatial frequency conditions """ - if self._sfvals is None: - self._get_stim_table_stats() - - return self._sfvals - - @property - def number_sf(self): - """ Number of grating orientation conditions """ - if self._number_sf is None: - self._get_stim_table_stats() - - return self._number_sf - - @property - def phasevals(self): - """ Array of grating phase conditions """ - if self._phasevals is None: - self._get_stim_table_stats() - - return self._phasevals - - @property - def number_phase(self): - """ Number of grating phase conditions """ - if self._number_phase is None: - self._get_stim_table_stats() - - return self._number_phase - - @property - def null_condition(self): - """ Stimulus condition ID for null (blank) stimulus """ - return self.stimulus_conditions[self.stimulus_conditions[self._col_sf] == 'null'].index - - - @property - def METRICS_COLUMNS(self): - return [('pref_sf_sg', np.float64), - ('pref_sf_multi_sg', bool), - ('pref_ori_sg', np.float64), - ('pref_ori_multi_sg', bool), - ('pref_phase_sg', np.float64), - ('pref_phase_multi_sg', bool), - ('g_osi_sg', np.float64), - ('time_to_peak_sg', np.float64), - ('firing_rate_sg', np.float64), - ('fano_sg', np.float64), - ('lifetime_sparseness_sg', np.float64), - ('run_pval_sg', np.float64), - ('run_mod_sg', np.float64)] - - @property - def metrics(self): - if self._metrics is None: - logger.info('Calculating metrics for ' + self.name) - unit_ids = self.unit_ids - metrics_df = self.empty_metrics_table() - - if len(self.stim_table) > 0: - metrics_df['pref_sf_sg'] = [self._get_pref_sf(unit) for unit in unit_ids] - metrics_df['pref_sf_multi_sg'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_sf, self.sfvals) for unit_id in unit_ids - ] - metrics_df['pref_ori_sg'] = [self._get_pref_ori(unit) for unit in unit_ids] - metrics_df['pref_ori_multi_sg'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_ori, self.orivals) for unit_id in unit_ids - ] - metrics_df['pref_phase_sg'] = [self._get_pref_phase(unit) for unit in unit_ids] - metrics_df['pref_phase_multi_sg'] = [ - self._check_multiple_pref_conditions(unit_id, self._col_phase, self.phasevals) for unit_id in unit_ids - ] - metrics_df['g_osi_sg'] = [self._get_osi(unit, metrics_df.loc[unit]['pref_sf_sg'], metrics_df.loc[unit]['pref_phase_sg']) for unit in unit_ids] - metrics_df['time_to_peak_sg'] = [self._get_time_to_peak(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - metrics_df['firing_rate_sg'] = [self._get_overall_firing_rate(unit) for unit in unit_ids] - metrics_df['fano_sg'] = [self._get_fano_factor(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - metrics_df['lifetime_sparseness_sg'] = [self._get_lifetime_sparseness(unit) for unit in unit_ids] - metrics_df.loc[:, ['run_pval_sg', 'run_mod_sg']] = \ - [self._get_running_modulation(unit, self._get_preferred_condition(unit)) for unit in unit_ids] - - self._metrics = metrics_df - - return self._metrics - - @classmethod - def known_stimulus_keys(cls): - return ['static_gratings'] - - def _get_stim_table_stats(self): - """ Extract orientations, spatial frequencies, and phases from the stimulus table """ - self._orivals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_ori] != 'null'][self._col_ori].unique()) - self._number_ori = len(self._orivals) - - self._sfvals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_sf] != 'null'][self._col_sf].unique()) - self._number_sf = len(self._sfvals) - - self._phasevals = np.sort(self.stimulus_conditions.loc[self.stimulus_conditions[self._col_phase] != 'null'][self._col_phase].unique()) - self._number_phase = len(self._phasevals) - - def _get_pref_sf(self, unit_id): - """Calculate the preferred spatial frequency condition for a given unit. - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - pref_sf : float - spatial frequency driving the maximal response - - """ - # TODO: Most of the _get_pref_*() methods can be combined into one method and shared among the classes - # Combine the stimulus_condition_id values that have the save spatial-frequency - similar_conditions_ids = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_sf] == sf].tolist() - for sf in self.sfvals] - - # For each spatial frequency average up conditionwise_statistics 'spike_mean' column using the indicies above. - # return the sf with the largest spike_mean. - df = pd.DataFrame( - index=self.sfvals, - data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in similar_conditions_ids]} - ).rename_axis(self._col_sf) - - return df.idxmax().iloc[0] - - def _get_pref_ori(self, unit_id): - """ Calculate the preferred orientation condition for a given unit - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - pref_ori :float - stimulus orientation driving the maximal response - """ - - # Combine the stimulus_condition_id values that have the save orientations - similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_ori] == ori].tolist() - for ori in self.orivals] - - # For each orientations average up conditionwise_statistics 'spike_mean' column using the indicies above. - # Return the oris with the largest spike_mean. - df = pd.DataFrame( - index=self.orivals, - data={'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in similar_conditions]} - ).rename_axis(self._col_ori) - - return df.idxmax().iloc[0] - - def _get_pref_phase(self, unit_id): - """Calculate the preferred phase condition for a given unit - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - - Returns - ------- - pref_phase : float - stimulus phase driving the maximal response - """ - combined_cond_ids = [self.stimulus_conditions.index[self.stimulus_conditions[self._col_phase] == phase].tolist() - for phase in self.phasevals] - df = pd.DataFrame( - index=self.phasevals, - data = {'spike_mean': [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in combined_cond_ids]} - ).rename_axis(self._col_phase) - - return df.idxmax().iloc[0] - - def _get_osi(self, unit_id, pref_sf, pref_phase): - """ Calculate the orientation selectivity for a given unit - - Parameters - ---------- - unit_id : int - unique ID for the unit of interest - pref_sf : float - preferred spatial frequency for this unit - pref_phase : float - preferred phase for this unit - - Returns - ------- - osi : float - orientation selectivity value - """ - orivals_rad = deg2rad(self.orivals).astype('complex128') # TODO: can we use numpy deg2rad? - - condition_inds = self.stimulus_conditions[ - (self.stimulus_conditions[self._col_sf] == pref_sf) & - (self.stimulus_conditions[self._col_phase] == pref_phase) - ].index.values - df = self.conditionwise_statistics.loc[unit_id].loc[condition_inds] - df = df.assign(ori=self.stimulus_conditions.loc[df.index.values][self._col_ori]) - df = df.sort_values(by=['ori']) - tuning = np.array(df['spike_mean'].values) - return osi(orivals_rad, tuning) - - ## VISUALIZATION ## - def plot_raster(self, stimulus_condition_id, unit_id): - """ Plot raster for one condition and one unit """ - - idx_sf = np.where(self.sfvals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_sf])[0] - idx_ori = np.where(self.orivals == self.stimulus_conditions.loc[stimulus_condition_id][self._col_ori])[0] - - if len(idx_sf) == len(idx_ori) == 1: - - presentation_ids = \ - self.presentationwise_statistics.xs(unit_id, level=1)\ - [self.presentationwise_statistics.xs(unit_id, level=1)\ - ['stimulus_condition_id'] == stimulus_condition_id].index.values - - df = self.presentationwise_spike_times[ \ - (self.presentationwise_spike_times['stimulus_presentation_id'].isin(presentation_ids)) & \ - (self.presentationwise_spike_times['unit_id'] == unit_id) ] - - x = df.index.values - self.stim_table.loc[df.stimulus_presentation_id].start_time - _, y = np.unique(df.stimulus_presentation_id, return_inverse=True) - - plt.subplot(self.number_sf, self.number_ori, idx_sf*self.number_ori + idx_ori + 1) - plt.scatter(x, y, c='k', s=1, alpha=0.25) - plt.axis('off') - - - def plot_response_summary(self, unit_id, bar_thickness=0.25): - - """ Plot the spike counts across conditions """ - df = self.stimulus_conditions.drop(index=self.null_condition) - - df['sf_index'] = np.searchsorted(self.sfvals, df[self._col_sf].values) - df['ori_index'] = np.searchsorted(self.orivals, df[self._col_ori].values) - df['phase_index'] = np.searchsorted(self.phasevals, df[self._col_phase].values) - - cond_values = self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id'] - - x = df.loc[cond_values.values]['sf_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 - y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] - c = df.loc[cond_values.values]['phase_index'] - - plt.subplot(2,1,1) - plt.scatter(y,x,c=c,alpha=0.5,cmap='Blues',vmin=-5) - locs, labels = plt.yticks(ticks=np.arange(self.number_sf), labels=self.sfvals) - plt.ylabel('Spatial frequency') - plt.xlabel('Spikes per trial') - plt.ylim([self.number_sf,-1]) - - x = df.loc[cond_values.values]['ori_index'] + np.random.rand(cond_values.size) * bar_thickness - bar_thickness/2 - y = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'] - c = df.loc[cond_values.values]['phase_index'] - - plt.subplot(2,1,2) - plt.scatter(x,y,c=c,alpha=0.5,cmap='Spectral') - locs, labels = plt.xticks(ticks=np.arange(self.number_ori), labels=self.orivals) - plt.xlabel('Orientation') - plt.ylabel('Spikes per trial') - - def make_fan_plot(self, unit_id): - """ Make a 2P-style Fan Plot based on presentationwise spike counts""" - - angle_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_ori].values - r_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_sf].values - group_data = self.stimulus_conditions.loc[self.presentationwise_statistics.xs(unit_id, level=1)['stimulus_condition_id']][self._col_phase].values - data = self.presentationwise_statistics.xs(unit_id, level=1)['spike_counts'].values - - null_trials = np.where(angle_data == 'null')[0] - - angle_data = np.delete(angle_data, null_trials) - r_data = np.delete(r_data, null_trials) - group_data = np.delete(group_data, null_trials) - data = np.delete(data, null_trials) - - cmin = np.min(data) - cmax = np.max(data) - - fp = FanPlotter.for_static_gratings() - fp.plot(r_data = r_data, angle_data = angle_data, group_data = group_data, data =data, clim=[cmin, cmax]) - fp.show_axes(closed=False) - plt.axis('off') - - -def fit_sf_tuning(sf_tuning_responses, sf_values, pref_sf_index): - """Performs gaussian or exponential fit on the spatial frequency tuning curve at preferred orientation/phase for - a given cell. - - :param sf_tuning_responses: An array of len N, with each value the (averaged) response of a cell at a given spatial - freq. stimulus. - :param sf_values: An array of len N, with each value the spatial freq. of the stimulus (corresponding to - sf_tuning_response). - :param pref_sf_index: The pre-determined prefered spatial frequency (sf_values index) of the cell. - :return: index for the preferred sf from the curve fit, prefered sf from the curve fit, low cutoff sf from the - curve fit, high cutoff sf from the curve fit - """ - fit_sf_ind = np.NaN - fit_sf = np.NaN - sf_low_cutoff = np.NaN - sf_high_cutoff = np.NaN - if pref_sf_index in range(1, len(sf_values)-1): - # If the prefered spatial freq is an interior case try to fit the tunning curve with a gaussian. - try: - popt, pcov = curve_fit(gauss_function, np.arange(len(sf_values)), sf_tuning_responses, p0=[np.amax(sf_tuning_responses), - pref_sf_index, 1.], maxfev=2000) - sf_prediction = gauss_function(np.arange(0., 4.1, 0.1), *popt) - fit_sf_ind = popt[1] - fit_sf = 0.02*np.power(2, popt[1]) - low_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[:sf_prediction.argmax()].argmin() - high_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[sf_prediction.argmax():].argmin() + sf_prediction.argmax() - if low_cut_ind > 0: - low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] - sf_low_cutoff = 0.02*np.power(2, low_cutoff) - elif high_cut_ind < 4: - high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] - sf_high_cutoff = 0.02*np.power(2, high_cutoff) - except Exception as e: - pass - else: - # If the prefered spatial freq is a boundary value try to fit the tunning curve with an exponential - fit_sf_ind = pref_sf_index - fit_sf = sf_values[pref_sf_index] - try: - popt, pcov = curve_fit(exp_function, np.arange(len(sf_values)), sf_tuning_responses, - p0=[np.amax(sf_tuning_responses), 2., np.amin(sf_tuning_responses)], maxfev=2000) - sf_prediction = exp_function(np.arange(0., 4.1, 0.1), *popt) - if pref_sf_index == 0: - high_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[sf_prediction.argmax():].argmin()+sf_prediction.argmax() - high_cutoff = np.arange(0, 4.1, 0.1)[high_cut_ind] - sf_high_cutoff = 0.02*np.power(2, high_cutoff) - else: - low_cut_ind = np.abs(sf_prediction-(sf_prediction.max()/2.))[:sf_prediction.argmax()].argmin() - low_cutoff = np.arange(0, 4.1, 0.1)[low_cut_ind] - sf_low_cutoff = 0.02*np.power(2, low_cutoff) - except Exception as e: - pass - - return fit_sf_ind, fit_sf, sf_low_cutoff, sf_high_cutoff - - -def get_sfdi(sf_tuning_responses, mean_sweeps_trials, bias=5): - """Computes spatial frequency discrimination index for cell - - :param sf_tuning_responses: sf_tuning_responses: An array of len N, with each value the (averaged) response of a - cell at a given spatial freq. stimulus. - :param mean_sweeps_trials: The set of events (spikes) across all trials of varying - :param bias: - :return: The sfdi value (float) - """ - trial_mean = mean_sweeps_trials.mean() - sse_part = np.sqrt(np.sum((mean_sweeps_trials - trial_mean)**2) / (len(mean_sweeps_trials) - bias)) - return (np.ptp(sf_tuning_responses)) / (np.ptp(sf_tuning_responses) + 2 * sse_part) - - -def gauss_function(x, a, x0, sigma): - return a*np.exp(-(x-x0)**2/(2*sigma**2)) - - -def exp_function(x, a, b, c): - return a*np.exp(-b*x)+c diff --git a/allensdk/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py deleted file mode 100644 index 0d1cfdb14e..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py +++ /dev/null @@ -1,847 +0,0 @@ -from six import string_types -import numpy as np -import pandas as pd -import scipy.stats as st -import scipy.ndimage as ndi -import warnings - -from scipy.optimize import curve_fit -from scipy.ndimage import gaussian_filter - - -from ..ecephys_session import EcephysSession -from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysNwbSessionApi - -import warnings -warnings.simplefilter(action='ignore', category=RuntimeWarning) - -class StimulusAnalysis(object): - def __init__(self, ecephys_session, trial_duration=None, **kwargs): - """ - :param ecephys_session: an EcephySession object or path to ece nwb file. - """ - # TODO: Create a set of a class methods. - if isinstance(ecephys_session, EcephysSession): - self._ecephys_session = ecephys_session - elif isinstance(ecephys_session, string_types): - nwb_version = kwargs.get('nwb_version', 2) - self._ecephys_session = EcephysSession.from_nwb_path(path=ecephys_session, nwb_version=nwb_version) - elif isinstance(ecephys_session, EcephysNwbSessionApi): - # nwb_version = kwargs.get('nwb_version', 2) - self._ecephys_session = EcephysSession(api=ecephys_session) - else: - raise TypeError(f"Don't know how to make a stimulus analysis object from a {type(ecephys_session)}") - - self._unit_ids = None - self._unit_filter = kwargs.get('filter', None) - self._params = kwargs.get('params', None) - self._unit_count = None - self._stim_table = None - self._conditionwise_statistics = None - self._presentationwise_statistics = None - self._presentationwise_spikes = None - self._conditionwise_psth = None - self._stimulus_conditions = None - - self._spikes = None - self._stim_table_spontaneous = None - self._stimulus_key = kwargs.get('stimulus_key', None) - self._running_speed = None - # self._sweep_events = None - # self._mean_sweep_events = None - # self._sweep_p_values = None - self._metrics = None - - # start and stop times of blocks for the relevant stimulus. Used by the overall_firing_rate functions that only - # need to be calculated once, but not accessable to the user - self._block_starts = None - self._block_stops = None - - # self._module_name = None # TODO: Remove, .name() should be hardcoded - - self._psth_resolution = kwargs.get('psth_resolution', 0.001) - - # Duration a sponteous stimulus should last for before it gets included in the analysis. - self._spontaneous_threshold = kwargs.get('spontaneous_threshold', 100.0) - - # Roughly the length of each stimulus duration, used for calculating spike statististics - self._trial_duration = trial_duration - - # Keeps track of preferred stimulus_condition_id for each unit - self._preferred_condition = {} - - @property - def ecephys_session(self): - return self._ecephys_session - - @property - def unit_ids(self): - """Returns a list of unit IDs for which to apply the analysis""" - if self._unit_ids is None: - units_df = self.ecephys_session.units - if isinstance(self._unit_filter, (list, tuple, np.ndarray, pd.Series)): - # If the user passes a list/array of ids - units_df = units_df.loc[self._unit_filter] - - elif isinstance(self._unit_filter, dict): - if 'unit_id' in self._unit_filter.keys(): - # If user wants to filter by the unit_id column which is actually the dataframe index - units_df = units_df.loc[self._unit_filter['unit_id']] - - else: - # Create a mask for all units that match the all of specified conditions. - mask = True - for col, val in self._unit_filter.items(): - if isinstance(val, (list, np.ndarray)): - mask &= units_df[col].isin(val) - else: - mask &= units_df[col] == val - units_df = units_df[mask] - - if units_df is None or units_df.empty: - # If not units are found don't proceed. - raise Exception('Could not find units for ecephys session.') - - self._unit_ids = units_df.index.values - - return self._unit_ids - - @property - def unit_count(self): - """Get the number of units.""" - if not self._unit_count: - self._unit_count = len(self.unit_ids) - return self._unit_count - - @property - def name(self): - """ Return the stimulus name.""" - return self._module_name - - @property - def trial_duration(self): - if self._trial_duration is None or self._trial_duration < 0.0: - # TODO: Should we calculate trial_duration from min(stim_table['duration']) if not set by user/subclass? - raise TypeError(f'Invalid value {self._trial_duration} for parameter "trial_duration".') - - return self._trial_duration - - @property - def spikes(self): - """Returns a dictionary of unit_id -> spike-times.""" - # TODO: This may be unecessary since we already have the presentationwise_spike_times table. - if self._spikes is None: - self._spikes = self.ecephys_session.spike_times - if len(self._spikes) > self.unit_count: - # if a filter has been applied such that not all the cells are being used in the analysis - self._spikes = {k: v for k, v in self._spikes.items() if k in self.unit_ids} - - return self._spikes - - @property - def stim_table(self): - # Stimulus table is already in EcephysSession object, just need to subselect presentations for this stimulus. - if self._stim_table is None: - if self._stimulus_key is None: - stims_table = self.ecephys_session.stimulus_presentations - self._stimulus_key = self._find_stimulus_key(stims_table) - if self._stimulus_key is None: - raise Exception('Could not find approipate stimulus_name key for current stimulus type. Please ' - 'specify using the stimulus_key parameter.') - - self._stim_table = self.ecephys_session.get_stimulus_table( - [self._stimulus_key] if isinstance(self._stimulus_key, string_types) else self._stimulus_key - ) - - if self._stim_table.empty: - raise Exception(f'Could not find stimulus data with "stimulus_key" {self._stimulus_key}') - - # TODO: Should we remove columns that are not relevant to the selected stimulus? If a feature for another - # has random junk it can mess up stimulus_conditions table. - - return self._stim_table - - def _find_stimulus_key(self, stim_table): - """Tries to guess the correct stimulus_key based on the data. - - :param stim_table: - :return: - """ - known_keys_lc = [k.lower() for k in self.__class__.known_stimulus_keys()] - for table_key in stim_table['stimulus_name'].unique(): - if table_key.lower() in known_keys_lc: - return table_key - - else: - return None - - @property - def known_spontaneous_keys(self): - return ['spontaneous', "spontaneous_activity"] - - @property - def total_presentations(self): - """ Total nmber of presentations / trials""" - return len(self.stim_table) - - @property - def metrics_names(self): - return [c[0] for c in self.METRICS_COLUMNS] - - @property - def metrics_dtypes(self): - return [c[1] for c in self.METRICS_COLUMNS] - - @property - def METRICS_COLUMNS(self): - raise NotImplementedError - - @property - def stim_table_spontaneous(self): - """Returns a stimulus table with only 'spontaneous' stimulus selected.""" - # Used by sweep_p_events for creating null dist. - # TODO: This may not be need anymore? Ask the scientists if sweep_p_events will be required in the future. - if self._stim_table_spontaneous is None: - stim_table = self.ecephys_session.get_stimulus_table(self.known_spontaneous_keys) - # TODO: If duration does not exists in stim_table create it from stop and start times - self._stim_table_spontaneous = stim_table[stim_table['duration'] > self._spontaneous_threshold] - - return self._stim_table_spontaneous - - @property - def null_condition(self): - raise NotImplementedError() - - @property - def conditionwise_psth(self): - """For every unit and stimulus-condition construction a PSTH table. ie. the spike-counts at a each time-interval - during a stimulus, averaged over all trials of the same stim condition. - - Each PSTH will count and average spikes over a time-window as determined by class parameter 'trial_duration' - which ideally be a similar value as the duration of each stimulus (in seconds). The length of each time-bin - is determined by the class parameter 'psth_resolution' (in seconds). - - Returns - ------- - conditionwise_psth xarray.DataArray - An 3D table that contains the PSTH for every unit/condition, with the following coordinates - - stimulus_condition_id - - time_relative_to_stimulus_onset - - unit_id - """ - - if self._conditionwise_psth is None: - if self._psth_resolution > self.trial_duration: - warnings.warn('parameter "psth_resolution" > "trial_duration", PSTH will not be properly created.') - - # get the spike-counts for every stimulus_presentation_id - dataset = self.ecephys_session.presentationwise_spike_counts( - bin_edges=np.arange(0, self.trial_duration, self._psth_resolution), - stimulus_presentation_ids=self.stim_table.index.values, - unit_ids=self.unit_ids - ) - - # replace the stimulus_presentation_id (which will be unique for every single stim) with the corresponding - # stimulus_condition_id (which will be shared among presenations with the same conditions. - da = dataset.assign_coords(stimulus_presentation_id=self.stim_table['stimulus_condition_id'].values) - da = da.rename({'stimulus_presentation_id': 'stimulus_condition_id'}) - - # Average spike counts across each stimulus_condition_id. - n_stimuli = len(da['stimulus_condition_id']) - n_cond_ids = len(np.unique(da.coords['stimulus_condition_id'].values)) - if n_stimuli == n_cond_ids: - # If every condition_id is unique then calling groupby().mean() is unnecessary and will raise an error. - self._conditionwise_psth = da - else: - self._conditionwise_psth = da.groupby('stimulus_condition_id').mean(dim='stimulus_condition_id') - - return self._conditionwise_psth - - @property - def conditionwise_statistics(self): - """Create a table of spike statistics, averaged and indexed by every unit_id, stimulus_condition_id pair. - - Returns - ------- - conditionwise_statistics: pd.DataFrame - A dataframe indexed by unit_id and stimulus_condition containing spike_count, spike_mean, spike_sem, - spike_std and stimulus_presentation_count information. - """ - if self._conditionwise_statistics is None: - self._conditionwise_statistics = self.ecephys_session.conditionwise_spike_statistics( - self.stim_table.index.values, self.unit_ids) - - return self._conditionwise_statistics - - @property - def presentationwise_spike_times(self): - """Constructs a table containing all the relevant spike_times plus the stimulus_presentation_id and unit_id - for the given spike. - - Returns - ------- - presentationwise_spike_times : pd.DataFrame - Indexed by spike_time, each spike containing the corresponding stimulus_presentation_id and unit_id - - """ - if self._presentationwise_spikes is None: - self._presentationwise_spikes = self.ecephys_session.presentationwise_spike_times( - stimulus_presentation_ids=self.stim_table.index.values, - unit_ids=self.unit_ids - ) - - return self._presentationwise_spikes - - @property - def presentationwise_statistics(self): - """Returns a table of the spike-counts, stimulus-conditions and running speed for every stimulus_presentation_id - , unit_id pair. - - Returns - ------- - presentationwise_statistics: pd.DataFrame - MultiIndex : unit_id, stimulus_presentation_id - Columns : spike_count, stimulus_condition_id, running_speed - - """ - if self._presentationwise_statistics is None: - # for each presentation_id and unit_id get the spike_counts across the entire duration. Since there is only - # a single bin we can drop time_relative_to_stimulus_onset. - df = self.ecephys_session.presentationwise_spike_counts( - bin_edges=np.array([0.0, self.trial_duration]), - stimulus_presentation_ids=self.stim_table.index.values, - unit_ids=self.unit_ids - ).to_dataframe().reset_index(level='time_relative_to_stimulus_onset', drop=True) - - # left join table with stimulus_condition_id and mean running_speed joined on stimulus_presentation_id - df = df.join(self.stim_table.loc[df.index.levels[0].values]['stimulus_condition_id']) - self._presentationwise_statistics = df.join(self.running_speed) - - return self._presentationwise_statistics - - @property - def stimulus_conditions(self): - """Returns a table of relevant stimulus_conditions. - - Returns - ------- - pd.DataFrame : - Index : stimulus_condition_id - Columns : stimulus parameter types - - """ - - if self._stimulus_conditions is None: - condition_list = self.stim_table['stimulus_condition_id'].unique() - self._stimulus_conditions = self.ecephys_session.stimulus_conditions[ - self.ecephys_session.stimulus_conditions.index.isin(condition_list) - ] - - return self._stimulus_conditions - - @property - def running_speed(self): - """Construct a dataframe with the averaged running speed for each stimulus_presenation_id - - Return - ------- - running_speed: pd.DataFrame: - For each stimulus_presenation_id (index) contains the averaged running velocity. - - """ - if self._running_speed is None: - def get_velocity(presentation_id): - """Helper function for getting avg. velocities for a given presenation_id""" - pres_row = self.stim_table.loc[presentation_id] - mask = (self.ecephys_session.running_speed['start_time'] >= pres_row['start_time']) \ - & (self.ecephys_session.running_speed['start_time'] < pres_row['stop_time']) - - return self.ecephys_session.running_speed[mask]['velocity'].mean() - - self._running_speed = pd.DataFrame(index=self.stim_table.index.values, - data={'running_speed': - [get_velocity(i) for i in self.stim_table.index.values] - }).rename_axis('stimulus_presentation_id') - - # TODO: The below is equivelent but uses numpy vectorization, profile to see if it's worth swapping out. - # stim_times = np.zeros(len(self.stim_table)*2, dtype=np.float64) - # stim_times[::2] = self.stim_table['start_time'].values - # stim_times[1::2] = self.stim_table['stop_time'].values - # sampled_indicies = np.where((self._ecephys_session.running_speed.start_time >= stim_times[0]) - # & (self._ecephys_session.running_speed.start_time < stim_times[-1]))[0] - # relevant_dxtimes = self._ecephys_session.running_speed.start_time[sampled_indicies] - # relevant_dxcms = self._ecephys_session.running_speed.velocity[sampled_indicies] - # - # indices = np.searchsorted(stim_times, relevant_dxtimes.values, side='right') - # rs_tmp_df = pd.DataFrame({'running_speed': relevant_dxcms, 'stim_indicies': indices}) - # - # # get averaged running speed for each stimulus - # rs_tmp_df = rs_tmp_df.groupby('stim_indicies').agg('mean') - # self._running_speed = rs_tmp_df.set_index(self.stim_table.index) - - return self._running_speed - - ''' - @property - def sweep_p_values(self): - """mean sweeps taken from randomized 'spontaneous' trial data.""" - if self._sweep_p_values is None: - self._sweep_p_values = self._calc_sweep_p_values() - - return self._sweep_p_values - - def _calc_sweep_p_values(self, n_samples=10000, step_size=0.0001, offset=0.33): - """ Calculates the probability, for each unit and stimulus presentation, that the number of spikes emitted by - that unit during that presentation could have been produced by that unit's spontaneous activity. This is - implemented as a permutation test using spontaneous activity (gray screen) periods as input data. - - Parameters - ========== - - Returns - ======= - sweep_p_values : pd.DataFrame - Each row is a stimulus presentation. Each column is a unit. Cells contain the probability that the - unit's spontaneous activity could account for its observed spiking activity during that presentation - (uncorrected for multiple comparisons). - - """ - # TODO: Code is currently a speed bottle-neck and could probably be improved. - # Recreate the mean-sweep-table but using randomly selected 'spontaneuous' stimuli. - shuffled_mean = np.empty((self.unit_count, n_samples)) - #print(self.stim_table_spontaneous) - #exit() - idx = np.random.choice(np.arange(self.stim_table_spontaneous['start_time'].iloc[0], - self.stim_table_spontaneous['stop_time'].iloc[0], - step_size), n_samples) # TODO: what step size for np.arange? - for shuf in range(n_samples): - for i, v in enumerate(self.spikes.keys()): - spikes = self.spikes[v] - shuffled_mean[i, shuf] = len(spikes[(spikes > idx[shuf]) & (spikes < (idx[shuf] + offset))]) - - sweep_p_values = pd.DataFrame(index=self.stim_table.index.values, columns=self.sweep_events.columns) - for i, unit_id in enumerate(self.spikes.keys()): - subset = self.mean_sweep_events[unit_id].values - null_dist_mat = np.tile(shuffled_mean[i, :], reps=(len(subset), 1)) - actual_is_less = subset.reshape(len(subset), 1) <= null_dist_mat - p_values = np.mean(actual_is_less, axis=1) - sweep_p_values[unit_id] = p_values - - return sweep_p_values - ''' - - @property - def metrics(self): - """Returns a pandas DataFrame of the stimulus response metrics for each unit.""" - raise NotImplementedError() - - def empty_metrics_table(self): - # pandas can have issues interpreting type and makes the column 'object' type, this should enforce the - # correct data type for each column - empty_array = np.empty(self.unit_count, dtype=np.dtype(self.METRICS_COLUMNS)) - empty_array[:] = np.nan - - return pd.DataFrame(empty_array, index=self.unit_ids).rename_axis('unit_id') - - - def _find_stimuli(self): - raise NotImplementedError() - - ## Helper functions for calling metrics of individual units. ## - def _get_preferred_condition(self, unit_id): - """Determines and caches the prefered stimulus_condition_id based on mean spikes, ignoring null conditions.""" - # TODO: Should probably be renamed to preferred_condition_id so there is no confusion. - if unit_id not in self._preferred_condition: - # Use conditionwise_statistics 'spike_mean' column to find stimulus_condition_id that gives the highest - # value. - try: - df = self.conditionwise_statistics.drop(index=self.null_condition, level=1) - except (IndexError, NotImplementedError) as err: - df = self.conditionwise_statistics - - # TODO: Calculated preferred condition_id once for all units and store in a table. - self._preferred_condition[unit_id] = df.loc[unit_id]['spike_mean'].idxmax() - - return self._preferred_condition[unit_id] - - def _check_multiple_pref_conditions(self, unit_id, stim_cond_col, valid_conditions): - # find all stimulus_condition which share the same 'stim_cond_col' (eg TF, ORI, etc) value, calculate the avg - # spiking - similar_conditions = [self.stimulus_conditions.index[self.stimulus_conditions[stim_cond_col] == v].tolist() - for v in valid_conditions] - spike_means = [self.conditionwise_statistics.loc[unit_id].loc[condition_inds]['spike_mean'].mean() - for condition_inds in similar_conditions] - - # Check if there is more than one stimulus condition that provokes a maximum response - return len(np.argwhere(spike_means == np.amax(spike_means))) > 1 - - - def _get_running_modulation(self, unit_id, preferred_condition, threshold=1.0): - """Get running modulation for the preferred condition of a given unit""" - subset = self.presentationwise_statistics[ - self.presentationwise_statistics['stimulus_condition_id'] == preferred_condition - ].xs(unit_id, level='unit_id') - - spike_counts = subset['spike_counts'].values - running_speeds = subset['running_speed'].values - return running_modulation(spike_counts, running_speeds, threshold) - - def _get_lifetime_sparseness(self, unit_id): - """Computes lifetime sparseness of responses for one unit""" - df = self.conditionwise_statistics.drop(index=self.null_condition, level=1) - responses = df.loc[unit_id]['spike_count'].values - - return lifetime_sparseness(responses) - - def _get_reliability(self, unit_id, preferred_condition): - # Reliability calculation goes here: - # Depends on the trial-to-trial correlation of the smoothed response - # What smoothing window is appropriate for ephys? We need to test this more - # TODO: If not implemented soon should be removed - return np.nan - - def _get_fano_factor(self, unit_id, preferred_condition): - # See: https://en.wikipedia.org/wiki/Fano_factor - subset = self.presentationwise_statistics[ - self.presentationwise_statistics['stimulus_condition_id'] == preferred_condition - ].xs(unit_id, level=1) - - spike_counts = subset['spike_counts'].values - return fano_factor(spike_counts) - - def _get_time_to_peak(self, unit_id, preferred_condition): - """Equal to the time of the maximum firing rate of the average PSTH at the preferred condition""" - try: - # TODO: Try to find a way to generalize that doesn't rely on conditionwise_psth - psth = self.conditionwise_psth.sel(unit_id=unit_id, stimulus_condition_id=preferred_condition) - peak_time = psth.where(psth == psth.max(), drop=True)['time_relative_to_stimulus_onset'][0].values - except Exception as e: - peak_time = np.nan - - return peak_time - - def _get_overall_firing_rate(self, unit_id): - """ Average firing rate over the entire stimulus interval""" - if self._block_starts is None: - # For the stimulus, create a list of start and stop times for the given block of trials. Only needs to be - # calculated once TODO: see if python allows for private property variables - start_time_intervals = np.diff(self.stim_table['start_time']) - - interval_end_inds = np.concatenate((np.where(start_time_intervals > self.trial_duration * 2)[0], - np.array([self.total_presentations-1]))) - interval_start_inds = np.concatenate((np.array([0]), - np.where(start_time_intervals > self.trial_duration * 2)[0] + 1)) - - self._block_starts = self.stim_table.iloc[interval_start_inds]['start_time'].values - self._block_stops = self.stim_table.iloc[interval_end_inds]['stop_time'].values - # TODO: Check start and start times that differences are positive - - return overall_firing_rate(start_times=self._block_starts, stop_times=self._block_stops, - spike_times=self.ecephys_session.spike_times[unit_id]) - - def get_intrinsic_timescale(self, unit_ids): - """Calculates the intrinsic timescale for a subset of units""" - # TODO: Recently added by not yet being used, should indicate if/how it will be used! Maybe make protected? - dataset = self.ecephys_session.presentationwise_spike_counts( - bin_edges=np.arange(0, self.trial_duration, 0.025), - stimulus_presentation_ids = self.stim_table.index.values, - unit_ids=unit_ids - ) - rsc_time_matrix = calculate_time_delayed_correlation(dataset) - t, y, y_std, a, intrinsic_timescale, c = fit_exp(rsc_time_matrix) - return intrinsic_timescale - - ### VISUALIZATION ### - def plot_conditionwise_raster(self, unit_id): - """ Plot a matrix of rasters for each condition (orientations x temporal frequencies) """ - _ = [self.plot_raster(cond, unit_id) for cond in self.stimulus_conditions.index.values] - - def plot_raster(self, condition, unit_id): - raise NotImplementedError() - - - @classmethod - def known_stimulus_keys(cls): - """Used for discovering the correct stimulus_name key for a given StimulusAnalysis subclass (when stimulus_key - is not explicity set). Should return a list of "stimulus_name" strings. - """ - raise NotImplementedError() - - -def running_modulation(spike_counts, running_speeds, speed_threshold=1.0): - """Given a series of trials that include the spike-counts and (averaged) running-speed, does a statistical - comparison to see if there was any difference in spike firing while running and while stationary. - - Requires at least 2 trials while the mouse is running and two when the mouse is stationary. - - Parameters - ---------- - spike_counts : array of floats of size N. - The spike counts for each trial - running_speeds: array floats of size N. - The running velocities (cm/s) of each trial. - speed_threshold: float - The minimum threshold for which the animal can be considered running (default 1.0). - - Returns - ------- - p_value : float or Nan - T-test p-value between the running and stationary trials. - run_mod : float or Nan - Relative difference between running and stationary mean firing rates. - """ - if(len(spike_counts) != len(running_speeds)): - warnings.warn('spike_counts and running_speeds must be arrays of the same shape.') - return np.NaN, np.NaN - - is_running = running_speeds >= speed_threshold # keep track of when the animal is and isn't running - - # Requires at-least two periods when the mouse is running and two when the mouse is not running. - if 1 < np.sum(is_running) < (len(running_speeds) - 1): - # calculate the relative differerence between mean running and stationary spike counts - run = spike_counts[is_running] - stat = spike_counts[np.invert(is_running)] - - run_mean = np.mean(run) - stat_mean = np.mean(stat) - - if run_mean == stat_mean == 0: - return np.NaN, np.NaN - if run_mean > stat_mean: - run_mod = (run_mean - stat_mean) / run_mean - else: - run_mod = -1 * (stat_mean - run_mean) / stat_mean - - # Get the p-value between the two populations. - (_, p) = st.ttest_ind(run, stat, equal_var=False) - return p, run_mod - else: - return np.NaN, np.NaN - - -def lifetime_sparseness(responses): - """Computes the lifetime sparseness for one unit. See Olsen & Wilson 2008. - - Parameters - ---------- - responses : array of floats - An array of a unit's spike-counts over the duration of multiple trials within a given session - - Returns - ------- - lifetime_sparsness : float - The lifetime sparseness for one unit - """ - if len(responses) <= 1: - # Unable to calculate, return nan - warnings.warn('responses array must contain at least two or more values to calculate.') - return np.nan - - coeff = 1.0/len(responses) - return (1.0 - coeff*((np.power(np.sum(responses), 2)) / (np.sum(np.power(responses, 2))))) / (1.0 - coeff) - - -def fano_factor(spike_counts): - """Computers the fano factor (var/mean) for the spike-counts across a series of trials. - - Parameters - ---------- - spike_counts : array - The spike counts across a series of 2 or more trials - - Returns - ------- - fano_factor : float - """ - spike_count_mean = np.mean(spike_counts) - if spike_count_mean == 0: - return np.nan - - return np.var(spike_counts) / spike_count_mean - - -def overall_firing_rate(start_times, stop_times, spike_times): - """Computes the global firing rate of a series of spikes, for only those values within the given start and - stop times. - - Parameters - ---------- - start_times : array of N floats - A series of stimulus block start times (seconds) - stop_times : array of N floats - Times when the stimulus block ends - spike_times : array of floats - A list of spikes for a given unit - - Returns - ------- - firing_rate : float - """ - if len(start_times) != len(stop_times): - warnings.warn('start_times and stop_times must be arrays of the same length') - return np.nan - - if len(spike_times) == 0: - # No spikes, firing rate 0 - return 0.0 - - total_time = np.sum(stop_times - start_times) - if total_time <= 0: - # Probably start and stop times got inverted. - warnings.warn(f'The total duration was {total_time} seconds.') - return np.nan - - return np.sum(spike_times.searchsorted(stop_times) - spike_times.searchsorted(start_times)) / total_time - - -def get_fr(spikes, num_timestep_second=30, sweep_length=3.1, filter_width=0.1): - """Uses a gaussian convolution to convert the spike-times into a contiguous firing-rate series. - - Parameters - ---------- - spikes : array - An array of spike times (shifted to start at 0) - num_timestep_second : float - The sampling frequency - sweep_length : float - The lenght of the returned array - filter_width: float - The window of the gaussian method - - Returns - ------- - firing_rate : float - A linear-spaced array of length num_timestep_second*sweep_length of the smoothed firing rates series. - """ - spikes = spikes.astype(float) - spike_train = np.zeros((int(sweep_length*num_timestep_second))) - spike_train[(spikes*num_timestep_second).astype(int)] = 1 - filter_width = int(filter_width*num_timestep_second) - fr = ndi.gaussian_filter(spike_train, filter_width) - return fr - - -def reliability(unit_sweeps, padding=1.0, num_timestep_second=30, filter_width=0.1, window_beg=0, window_end=None): - """Computes the trial-to-trial reliability for a set of sweeps for a given cell - - :param unit_sweeps: - :param padding: - :return: - """ - if isinstance(unit_sweeps, (list, tuple)): - unit_sweeps = np.array([np.array(l) for l in unit_sweeps]) - - unit_sweeps = unit_sweeps + padding # DO NOT use the += as for python arrays that will do in-place modification - corr_matrix = np.empty((len(unit_sweeps), len(unit_sweeps))) - fr_window = slice(window_beg, window_end) - for i in range(len(unit_sweeps)): - fri = get_fr(unit_sweeps[i], num_timestep_second=num_timestep_second, filter_width=filter_width) - for j in range(len(unit_sweeps)): - frj = get_fr(unit_sweeps[j], num_timestep_second=num_timestep_second, filter_width=filter_width) - # Warning: the pearson coefficient is likely to have a denominator of 0 for some cells/stimulus and give - # a divide by 0 warning. - r, p = st.pearsonr(fri[fr_window], frj[fr_window]) - corr_matrix[i, j] = r - - inds = np.triu_indices(len(unit_sweeps), k=1) - upper = corr_matrix[inds[0], inds[1]] - return np.nanmean(upper) - - -def osi(orivals, tuning): - """Computes the orientation selectivity of a cell. The calculation of the orientation is done using the normalized - circular variance (CirVar) as described in Ringbach 2002 - - Parameters - ---------- - ori_vals : complex array of length N - Each value the oriention of the stimulus. - tuning : float array of length N - Each value the (averaged) response of the cell at a different orientation. - - Returns - ------- - osi : float - An N-dimensional array of the circular variance (scalar value, in radians) of the responses. - """ - if len(orivals) == 0 or len(orivals) != len(tuning): - warnings.warn('orivals and tunings are of different lengths') - return np.nan - - tuning_sum = tuning.sum() - if tuning_sum == 0.0: - return np.nan - - cv_top = tuning * np.exp(1j * 2 * orivals) - return np.abs(cv_top.sum()) / tuning_sum - - -def dsi(orivals, tuning): - """Computes the direction selectivity of a cell. See Ringbach 2002, Van Hooser 2014 - - Parameters - ---------- - ori_vals : complex array of length N - Each value the oriention of the stimulus. - tuning : float array of length N - Each value the (averaged) response of the cell at a different orientation. - - Returns - ------- - osi : float - An N-dimensional array of the circular variance (scalar value, in radians) of the responses. - """ - if len(orivals) == 0 or len(orivals) != len(tuning): - warnings.warn('orivals and tunings are of different lengths') - return np.nan - - tuning_sum = tuning.sum() - if tuning_sum == 0.0: - return np.nan - - cv_top = tuning * np.exp(1j * orivals) - return np.abs(cv_top.sum()) / tuning_sum - - -def deg2rad(arr): - """ Converts array-like input from degrees to radians""" - # TODO: Is there any reason not to use np.deg2rad? - return arr / 180 * np.pi - -def fit_exp(rsc_time_matrix): - - intr = abs(rsc_time_matrix) - tmp = np.nanmean(intr, axis=0) - n=intr.shape[0] - - t = np.arange(len(tmp))[1:] - y=gaussian_filter(np.nanmean(tmp, axis=0)[1:],0.8) - - p, amo = curve_fit(lambda t,a,b,c: a*np.exp(-1/b*t)+c, t, y, p0=(-4, 2, 1), maxfev = 1000000000) - - a=p[0] - b=p[1] # this is the intrinsic timescale - c=p[2] - y_std = np.nanstd(tmp, axis=0)[1:]/np.sqrt(n) - - return t, y, y_std, a, b, c - - -def calculate_time_delayed_correlation(dataset): - - nbins = dataset.time_relative_to_stimulus_onset.size - num_units = dataset.unit_id.size - - rsc_time_matrix = np.zeros((num_units, nbins, nbins)) * np.nan - - for unit_idx, unit in enumerate(dataset.unit_id): - - spikes_for_unit = dataset.sel(unit_id=unit).data - - for i in np.arange(nbins-1): - for j in np.arange(i+1, nbins): - good_trials = (spikes_for_unit[:,i] * spikes_for_unit[:,j]) > 0 # remove zero spike count bins - r, p = st.pearsonr(spikes_for_unit[good_trials,i], spikes_for_unit[good_trials,j]) - rsc_time_matrix[unit_idx, i, j] = r - - return rsc_time_matrix diff --git a/allensdk/brain_observatory/ecephys/stimulus_sync.py b/allensdk/brain_observatory/ecephys/stimulus_sync.py deleted file mode 100644 index ddcd15d007..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_sync.py +++ /dev/null @@ -1,159 +0,0 @@ -import warnings - -import numpy as np -import scipy.spatial.distance as distance - - -def trimmed_stats(data, pctiles=(10, 90)): - low = np.percentile(data, pctiles[0]) - high = np.percentile(data, pctiles[1]) - - trimmed = data[np.logical_and( - data <= high, - data >= low - )] - - return np.mean(trimmed), np.std(trimmed) - - -def trim_border_pulses(pd_times, vs_times, frame_interval=1/60, num_frames=5): - pd_times = np.array(pd_times) - return pd_times[np.logical_and( - pd_times >= vs_times[0], - pd_times <= vs_times[-1] + num_frames * frame_interval - )] - - -def correct_on_off_effects(pd_times): - ''' - - Notes - ----- - This cannot (without additional info) determine whether an assymmetric offset is odd-long or even-long. - ''' - - pd_diff = np.diff(pd_times) - odd_diff_mean, odd_diff_std = trimmed_stats(pd_diff[1::2]) - even_diff_mean, even_diff_std = trimmed_stats(pd_diff[0::2]) - - half_diff = np.diff(pd_times[0::2]) - full_period_mean, full_period_std = trimmed_stats(half_diff) - half_period_mean = full_period_mean / 2 - - odd_offset = odd_diff_mean - half_period_mean - even_offset = even_diff_mean - half_period_mean - - pd_times[::2] -= odd_offset / 2 - pd_times[1::2] -= even_offset / 2 - - return pd_times - - -def flag_unexpected_edges(pd_times, ndevs=10): - pd_diff = np.diff(pd_times) - diff_mean, diff_std = trimmed_stats(pd_diff) - - expected_duration_mask = np.ones(pd_diff.size) - expected_duration_mask[np.logical_or( - pd_diff < diff_mean - ndevs * diff_std, - pd_diff > diff_mean + ndevs * diff_std - )] = 0 - expected_duration_mask[1:] = np.logical_and(expected_duration_mask[:-1], expected_duration_mask[1:]) - expected_duration_mask = np.concatenate([expected_duration_mask, [expected_duration_mask[-1]]]) - - return expected_duration_mask - - -def fix_unexpected_edges(pd_times, ndevs=10, cycle=60, max_frame_offset=4): - pd_times = np.array(pd_times) - expected_duration_mask = flag_unexpected_edges(pd_times, ndevs=ndevs) - diff_mean, diff_std = trimmed_stats(np.diff(pd_times)) - frame_interval = diff_mean / cycle - - bad_edges = np.where(expected_duration_mask == 0)[0] - bad_blocks = np.sort(np.unique(np.concatenate([ - [0], - np.where(np.diff(bad_edges) > 1)[0] + 1, - [len(bad_edges)] - ]))) - - output_edges = [] - for low, high in zip(bad_blocks[:-1], bad_blocks[1:]): - current_bad_edge_indices = bad_edges[low: high-1] - current_bad_edges = pd_times[current_bad_edge_indices] - low_bound = pd_times[current_bad_edge_indices[0]] - high_bound = pd_times[current_bad_edge_indices[-1] + 1] - - edges_missing = int(np.around((high_bound - low_bound) / diff_mean)) - expected = np.linspace(low_bound, high_bound, edges_missing + 1) - - distances = distance.cdist(current_bad_edges[:, None], expected[:, None]) - distances = np.around(distances / frame_interval).astype(int) - - min_offsets = np.amin(distances, axis=0) - min_offset_indices = np.argmin(distances, axis=0) - output_edges = np.concatenate([ - output_edges, - expected[min_offsets > max_frame_offset], - current_bad_edges[min_offset_indices[min_offsets <= max_frame_offset]] - ]) - - return np.sort(np.concatenate([output_edges, pd_times[expected_duration_mask > 0]])) - - -def estimate_frame_duration(pd_times, cycle=60): - return trimmed_stats(np.diff(pd_times))[0] / cycle - - -def assign_to_last(index, starts, ends, frame_duration, irregularity, cycle): - ends[-1] += frame_duration * np.sign(irregularity) - return starts, ends - - -def allocate_by_vsync(vs_diff, index, starts, ends, frame_duration, irregularity, cycle): - current_vs_diff = vs_diff[index * cycle: (index + 1) * cycle] - sign = np.sign(irregularity) - - if sign > 0: - vs_ind = np.argmax(current_vs_diff) - elif sign < 0: - vs_ind = np.argmin(current_vs_diff) - - ends[vs_ind:] += sign * frame_duration - starts[vs_ind + 1:] += sign * frame_duration - - return starts, ends - - -def compute_frame_times(photodiode_times, frame_duration, num_frames, cycle, irregular_interval_policy=assign_to_last): - - indices = np.arange(num_frames) - starts = np.zeros(num_frames, dtype=float) - ends = np.zeros(num_frames, dtype=float) - - num_intervals = len(photodiode_times) - 1 - for start_index, (start_time, end_time) in enumerate(zip(photodiode_times[:-1], photodiode_times[1:])): - - interval_duration = end_time - start_time - irregularity = int(np.around((interval_duration) / frame_duration)) - cycle - - local_frame_duration = interval_duration / (cycle + irregularity) - durations = np.zeros(cycle + ( start_index == num_intervals - 1 )) + local_frame_duration - - current_ends = np.cumsum(durations) + start_time - current_starts = current_ends - durations - - while irregularity != 0: - current_starts, current_ends = irregular_interval_policy( - start_index, current_starts, current_ends, local_frame_duration, irregularity, cycle - ) - irregularity += -1 * np.sign(irregularity) - - early_frame = start_index * cycle - late_frame = (start_index + 1) * cycle + ( start_index == num_intervals - 1 ) - - remaining = starts[early_frame: late_frame].size - starts[early_frame: late_frame] = current_starts[:remaining] - ends[early_frame: late_frame] = current_ends[:remaining] - - return indices, starts, ends \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/README.md b/allensdk/brain_observatory/ecephys/stimulus_table/README.md deleted file mode 100644 index 173c6ed97a..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/README.md +++ /dev/null @@ -1,24 +0,0 @@ -Stimulus Table -============== -Builds a table of stimulus parameters. Each row describes a single sweep of stimulus presentation and has start and end times (in seconds, on the master clock) -as well as the values of each applicable stimulus parameter during that sweep. - - -Running -------- -``` -python -m ecephys_pipeline.modules.stimulus_table --input_json <path to input json> --output_json <path to output json> -``` -See the schema file for detailed information about input json contents. - - -Input data ----------- -- Stimulus pickle : Written by camstim (http://aibspi/braintv/camstim). Contains information about the stimuli that were -presented in this experiment. -- Sync h5 : Contains information about the times at which each frame was presented. - - -Output data ------------ -- Stimulus table csv : The complete stimulus table. \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/__init__.py b/allensdk/brain_observatory/ecephys/stimulus_table/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/__main__.py b/allensdk/brain_observatory/ecephys/stimulus_table/__main__.py deleted file mode 100644 index 167cbfe891..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/__main__.py +++ /dev/null @@ -1,104 +0,0 @@ -import functools - -import numpy as np - -from allensdk.brain_observatory.argschema_utilities import \ - ArgSchemaParserPlus, \ - write_or_print_outputs -from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import ( - EcephysSyncDataset, -) -from allensdk.brain_observatory.ecephys.file_io.stim_file import ( - CamStimOnePickleStimFile, -) -from . import ephys_pre_spikes -from . import naming_utilities -from . import output_validation -from ._schemas import InputParameters, OutputSchema - - -def build_stimulus_table( - stimulus_pkl_path, - sync_h5_path, - frame_time_strategy, - minimum_spontaneous_activity_duration, - extract_const_params_from_repr, - drop_const_params, - maximum_expected_spontanous_activity_duration, - stimulus_name_map, - column_name_map, - output_stimulus_table_path, - output_frame_times_path, - fail_on_negative_duration, - **kwargs -): - stim_file = CamStimOnePickleStimFile.factory(stimulus_pkl_path) - - sync_dataset = EcephysSyncDataset.factory(sync_h5_path) - frame_times = sync_dataset.extract_frame_times( - strategy=frame_time_strategy) - - def seconds_to_frames(seconds): - return \ - (np.array(seconds) + stim_file.pre_blank_sec) * \ - stim_file.frames_per_second - - minimum_spontaneous_activity_duration = ( - minimum_spontaneous_activity_duration / stim_file.frames_per_second - ) - - stimulus_tabler = functools.partial( - ephys_pre_spikes.build_stimuluswise_table, - seconds_to_frames=seconds_to_frames, - extract_const_params_from_repr=extract_const_params_from_repr, - drop_const_params=drop_const_params, - ) - spon_tabler = functools.partial( - ephys_pre_spikes.make_spontaneous_activity_tables, - duration_threshold=minimum_spontaneous_activity_duration, - ) - - stim_table_full = ephys_pre_spikes.create_stim_table( - stim_file.stimuli, stimulus_tabler, spon_tabler - ) - stim_table_full = ephys_pre_spikes.apply_frame_times( - stim_table_full, frame_times, stim_file.frames_per_second, True - ) - - output_validation.validate_epoch_durations( - stim_table_full, fail_on_negative_durations=fail_on_negative_duration) - output_validation.validate_max_spontaneous_epoch_duration( - stim_table_full, maximum_expected_spontanous_activity_duration - ) - - stim_table_full = naming_utilities.collapse_columns(stim_table_full) - stim_table_full = naming_utilities.drop_empty_columns(stim_table_full) - stim_table_full = naming_utilities.standardize_movie_numbers( - stim_table_full) - stim_table_full = naming_utilities.add_number_to_shuffled_movie( - stim_table_full) - stim_table_full = naming_utilities.map_stimulus_names( - stim_table_full, stimulus_name_map - ) - stim_table_full = naming_utilities.map_column_names(stim_table_full, - column_name_map) - - stim_table_full.to_csv(output_stimulus_table_path, index=False) - np.save(output_frame_times_path, frame_times, allow_pickle=False) - return { - "output_path": output_stimulus_table_path, - "output_frame_times_path": output_frame_times_path, - } - - -def main(): - mod = ArgSchemaParserPlus( - schema_type=InputParameters, output_schema_type=OutputSchema - ) - output = build_stimulus_table(**mod.args) - - write_or_print_outputs(data=output, parser=mod) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/_schemas.py b/allensdk/brain_observatory/ecephys/stimulus_table/_schemas.py deleted file mode 100644 index 753e0aa509..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/_schemas.py +++ /dev/null @@ -1,109 +0,0 @@ -import sys - -from argschema import ArgSchema, ArgSchemaParser -from argschema.schemas import DefaultSchema -from argschema.fields import Nested, InputDir, String, Float, Dict, Int, List, Bool - -from . import naming_utilities as nu - - -default_stimulus_renames = { - "": "spontaneous", - - "natural_movie_1" : "natural_movie_one", - "natural_movie_3" : "natural_movie_three", - "Natural Images": "natural_scenes", - "flash_250ms": "flashes", - "gabor_20_deg_250ms": "gabors", - "drifting_gratings" : "drifting_gratings", - "static_gratings" : "static_gratings", - - "contrast_response": "drifting_gratings_contrast", - "natural_movie_1_more_repeats" : "natural_movie_one", - "natural_movie_shuffled" : "natural_movie_one_shuffled", - "motion_stimulus" : "dot_motion", - "drifting_gratings_more_repeats" : "drifting_gratings_75_repeats", - - "signal_noise_test_0_200_repeats": "test_movie_one", - - "signal_noise_test_0": "test_movie_one", - "signal_noise_test_0": "test_movie_two", - "signal_noise_session_1" : "dense_movie_one", - "signal_noise_session_2" : "dense_movie_two", - "signal_noise_session_3" : "dense_movie_three", - "signal_noise_session_4" : "dense_movie_four", - "signal_noise_session_5" : "dense_movie_five", - "signal_noise_session_6" : "dense_movie_six", -} - - -default_column_renames = { - "Contrast": "contrast", - "Ori": "orientation", - "SF": "spatial_frequency", - "TF": "temporal_frequency", - "Phase": "phase", - "Color": "color", - "Image": "frame", - "Pos_x": "x_position", - "Pos_y": "y_position" -} - - -class InputParameters(ArgSchema): - stimulus_pkl_path = String( - required=True, help="path to pkl file containing raw stimulus information" - ) - sync_h5_path = String( - required=True, help="path to h5 file containing syncronization information" - ) - output_stimulus_table_path = String( - required=True, help="the output stimulus table csv will be written here" - ) - output_frame_times_path = String(required=True, help="output all frame times here") - minimum_spontaneous_activity_duration = Float( - default=sys.float_info.epsilon, - help="detected spontaneous activity sweeps will be rejected if they last fewer that this many seconds", - ) - maximum_expected_spontanous_activity_duration = Float( - default=1225.02541, - help="validation will fail if a spontanous activity epoch longer than this one is computed.", - ) - frame_time_strategy = String( - default="use_photodiode", - help="technique used to align frame times. Options are 'use_photodiode', which interpolates frame times between photodiode edge times (preferred when vsync times are unreliable) and 'use_vsyncs', which is preferred when reliable vsync times are available.", - ) - stimulus_name_map = Dict( - keys=String(), - values=String(), - help="optionally rename stimuli", - default=default_stimulus_renames - ) - column_name_map = Dict( - keys=String(), - values=String(), - help="optionally rename stimulus parameters", - default=default_column_renames - ) - extract_const_params_from_repr = Bool(default=True) - drop_const_params = List( - String(), - help="columns to be dropped from the stimulus table", - default=["name", "maskParams", "win", "autoLog", "autoDraw"], - ) - - fail_on_negative_duration = Bool( - default=False, - help="Determine if the module should fail if a stimulus epoch has a negative duration." - ) - - -class OutputSchema(DefaultSchema): - input_parameters = Nested( - InputParameters, - description=("Input parameters the module " "was run with"), - required=True, - ) - output_path = String(help="Path to output csv file") - output_frame_times_path = String(help="output all frame times here") - diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/ecephys_visual_coding_time_alignment.ipynb b/allensdk/brain_observatory/ecephys/stimulus_table/ecephys_visual_coding_time_alignment.ipynb deleted file mode 100644 index f117015f17..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/ecephys_visual_coding_time_alignment.ipynb +++ /dev/null @@ -1,598 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Timing\n", - "\n", - "In order to analyze ecephys passive viewing data, you need to be able to answer questions of the form:\n", - "```\n", - "At time t, what stimulus was being displayed to the subject?\n", - "```\n", - "Where `t` is any time of interest, such as a spiking event." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Background\n", - "\n", - "To draw stimuli on the monitor, we use an in-house Python package called [camstim](http://aibspi/braintv/camstim). camstim uses [psychopy](https://www.psychopy.org/index.html) to display stimuli, while listening to and recording events from a National Instruments Digital Acquisition system (DAQ). Under the hood, psychopy itself relies on [opengl](https://www.opengl.org/) for communication with the GPU. camstim is driven by a stimulus script. These are [stored here](http://stash.corp.alleninstitute.org/users/joshs/repos/ecephys_stimulus_scripts/browse). Our extracellular electrophysiology (ecephys) sessions have been collected using camstim version 0.2.9.\n", - "\n", - "###### event loop\n", - "\n", - "camstim repeatedly executes [the following loop](http://aibspi/braintv/camstim/blob/0.2.9/camstim/sweepstim.py#L1044):\n", - "- iteratively update contained stimuli. This:\n", - " - potentially alters stimulus parameters, e.g. changing the orientation of a static grating\n", - " - draws the stimulus using psychopy. The prepared frame is written to the back opengl buffer.\n", - "- iteratively update contained \"items\". These can be a bit eclectic but might involve sampling the orientation of the running wheel, for instance.\n", - "- on the DAQ, set the \"vsync\" line (which might be called \"stim_vsync\" or similar) high.\n", - "- call [flip](http://aibspi/braintv/camstim/blob/0.2.9/camstim/window.py#L637) on the session's shared psychopy window. This swaps the front and back buffers, so that the GPU sends the new stimulus frame to the monitor.\n", - "- on the DAQ, set the vsync line low.\n", - "\n", - "Based on this loop, the falling edges on the vsync line are the closest recorded timestamps to the display time of the stimulus. However, they are not the times at which the stimuli are displayed! This is because:\n", - "1. it takes time for the monitor to receive and display the frame from the GPU\n", - "2. the monitor displays frames on its own, ~60hz clock.\n", - "\n", - "###### photodiode\n", - "\n", - "To record the actual times at which frames are displayed to the subject, a patch of the frame (the \"sync square\") is reserved from the stimuli. The sync square is flipped between black and white every 60 frames (this is implemented as a camstim stimulus). To record these flips, a photodiode is attached to the monitor, placed over the sync square. When the sync square transitions, the photidiode writes a rising or falling edge to a line on the DAQ. Since we know the time at which the `60 * i`th frame was flipped onto the front buffer as well as the time of the `i`th photodiode edge, we can calculate a transform between the vsync falling edge times and photodiode times, then apply that transform to obtain the time at which an arbitrary frame was displayed." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## example: 2p ophys\n", - "\n", - "Here is an example of stimulus synchronization using an arbitrarily chosen 2P (optical physiology) passive viewing experiment." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Python import boilerplate\n", - "\n", - "from pathlib import Path\n", - "\n", - "import h5py\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "from allensdk.brain_observatory.sync_dataset import Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# set up some paths\n", - "\n", - "ophys_dir = Path(\"/allen/programs/braintv/production/neuralcoding/prod5/specimen_491604967/ophys_experiment_496908818/\")\n", - "ophys_sync_path = ophys_dir / Path(\"496908818_222181_20160120_sync.h5\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# load the recorded edge times\n", - "\n", - "ophys_sync = Dataset(ophys_sync_path)\n", - "ophys_vs = ophys_sync.get_edges(keys=(\"stim_vsync\",), kind=\"falling\")\n", - "ophys_pd = ophys_sync.get_edges(keys=(\"stim_photodiode\",), kind=\"all\", units=\"seconds\")\n", - "ophys_pd_falling = ophys_sync.get_edges(keys=(\"stim_photodiode\",), kind=\"falling\")\n", - "ophys_pd_rising = ophys_sync.get_edges(keys=(\"stim_photodiode\",), kind=\"rising\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To start, we'll plot the first few photodiode timestamps:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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TQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoEk0AaBJNAGgSTQBoOmQzVvqJ7Zdk6/HHbMaqAQ54lx9x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\n", - "text/plain": [ - "<Figure size 576x576 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "\n", - "num_pd_samples = 8\n", - "step_vals = np.vstack([np.zeros(num_pd_samples), np.ones(num_pd_samples)]).T.flatten()\n", - "ax.step(ophys_pd[:num_pd_samples*2], step_vals)\n", - "\n", - "# validate that the edge directions are oriented correctly\n", - "ax.vlines(ophys_pd_falling[:num_pd_samples], ymin=-0.05, ymax=1.05, color=\"black\")\n", - "\n", - "ax.tick_params(\"y\", left=False, labelleft=False)\n", - "ax.set_xlabel(\"time (s)\")\n", - "ax.set_title(f\"first {num_pd_samples * 2} edges from the photodiode line\")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This shows three distinct modes:\n", - "1. a pre-experiment state interrupted by a spike when the window is initialized\n", - "2. several fast \"sentinel\" pulses at the start of the experiment\n", - "3. a regular 2hz square wave\n", - "\n", - "There is also a set of sentinel pulses (and a spike) at the end of the session. We can plot the the photodiode interval lengths to get a better sense of what is going on:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 576x576 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "\n", - "pd_diff = np.diff(ophys_pd)\n", - "med_diff = np.median(pd_diff)\n", - "frame_dur_exp = 1 / 60\n", - "\n", - "ax.plot(ophys_pd[1:], pd_diff)\n", - "\n", - "for ii in range(30):\n", - " ax.hlines([med_diff + frame_dur_exp * ii], xmin=ophys_pd[1]-20, xmax=ophys_pd[-1]+20)\n", - "\n", - "plt.ylim(top=1.5, bottom=0)\n", - "\n", - "ax.set_ylabel(\"interval duration (s)\")\n", - "ax.set_xlabel(\"interval end time (s)\")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Black lines are drawn at 1s + n frames. If one or more frames are dropped, we ought to see these as photodiode intervals lying on (or a couple ms from - the photodiode intervals vary in general by ~2.5 ms depending on whether the transition is black -> white or white -> black) these black lines.\n", - "\n", - "Overall, there are a few standouts:\n", - "1. at the start and end of the session, there are fast sentinel flashes, window on/off events, and long periods where the sync square does not change.\n", - "2. There are dropped frames scattered throughout the session. Often, they clump into a single photodiode interval.\n", - "3. There are a few cases where the interval is ~0. This probably reflects a brief oscillation around the transition time.\n", - "4. around 882 seconds in, about 26 frames worth of time was dropped.\n", - "\n", - "We only care about frame-driven sync square changes, so we ought to drop the pre- and post-session flashes. We can also safely remove the periodic ultra-short flash groups." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "first_vs = ophys_vs[0]\n", - "last_vs = ophys_vs[-1]\n", - "\n", - "ophys_pd = ophys_pd[np.logical_and(ophys_pd > first_vs, ophys_pd < last_vs)]\n", - "\n", - "short_intervals = np.where(np.diff(ophys_pd) < frame_dur_exp)\n", - "ophys_pd = np.delete(ophys_pd, short_intervals)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfsAAAHkCAYAAAA5C4acAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deZxkZX3v8c+v11nYYRI2FSEYAgYRBzeMdzDGKO4RLxpvjEtCrtcYl2gk0SvG5N5ovGo0GHmNXoIYL664YdwQCRrXAVFGExUVE9xmYNhm6/V3/zhnmAanu2ug6pyqpz7v16tfXXVOddXvqVPd3/Occ/p5IjORJEnlGmm7AEmS1FuGvSRJhTPsJUkqnGEvSVLhDHtJkgpn2EuSVLiehX1EnB8RmyJi4yLr10XELRFxdf31ql7VIknSMBvr4XNfAJwLXLjEYz6fmY/rYQ2SJA29nvXsM/MKYEuvnl+SJHWm7XP2D4mIb0TEJyLihJZrkSSpSL08jL+cq4B7ZebWiDgd+DBw7J4eGBFnAWcBrF69+gHHHXdcc1VKktSyK6+88obMXHNXfz56OTZ+RBwFXJKZ9+3gsdcBazPzhqUet3bt2tywYUNX6pMkaRBExJWZufau/nxrh/Ej4tCIiPr2A+tabmyrHkmSStWzw/gRcRGwDjgkIq4HzgHGATLzPOAM4HkRMQvsAJ6WTsEnSVLX9SzsM/Ppy6w/l+pf8yRJUg+1fTW+JEnqMcNekqTCGfaSJBXOsJckqXCGvSRJhTPsJUkqXJvD5faFdevWtV2CJKkgl19+edsl/AJ79pIkFW7oe/b9uAcmSVI32bOXJKlwhr0kSYUz7CVJKpxhL0lS4Qx7SZIKZ9hLklQ4w16SpMIZ9pIkFc6wlySpcIa9JEmFM+wlSSrc0I+N76x3kqRu6sc5V+zZS5JUuKHv2ffjHpgkSd1kz16SpMIZ9pIkFc6wlySpcIa9JEmFM+wlSSqcYS9JUuEMe0mSCmfYS5JUOMNekqTCGfaSJBVu6IfLdSIcSVI39eMw7PbsJUkq3ND37PtxD0ySpG6yZy9JUuEMe0mSCmfYS5JUOMNekqTCGfaSJBXOsJckqXCGvSRJhTPsJUkqnGEvSVLhDHtJkgpn2EuSVLihHxvfWe8kSd3Uj3Ou2LOXJKlwQ9+z78c9sFJdu+k21uyzgv1XjbddiiQNFXv2aswj33gFT3jrF9ouQ5KGjmGvRv3oxu1tlyBJQ8ewlySpcIa9JEmFM+wlSSqcYS9JUuEMe0mSCmfYS5JUOMNekqTCGfaSJBXOsJckqXBDPza+s9416MEvA3zPJZWtH+dcsWcvSVLhhr5n3497YKU66uyPA77nktQ0e/aSJBXOsJckqXCGvSRJhTPsJUkqnGEvSVLhDHtJkgpn2EuSVDjDXpKkwhn2kiQVzrCXJKlwPQv7iDg/IjZFxMZlHndKRMxGxBm9qkWSpGHWy7HxLwDOBS5c7AERMQq8Dvh0D+tYkjOwNchZ7yQNgX6c/6NnPfvMvALYsszDXgB8ENjUqzokSRp2rc16FxFHAE8GTgNOaauOftwDK5Wz3klSO9q8QO/vgJdn5vxyD4yIsyJiQ0Rs2Lx5cwOlSZJUjjbns18LvCciAA4BTo+I2cz88J0fmJnrgfUAa9euzUarlCRpwLUW9pl57123I+IC4JI9Bb0kSbp7ehb2EXERsA44JCKuB84BxgEy87xeva4kSbqjnoV9Zj59Lx77rF7VIUnSsHMEPUmSCmfYS5JUOMNekqTCGfaSJBXOsJckqXCGvSRJhWtzBL2+4AxsDXLWO0lDoB/n/7BnL0lS4Ya+Z9+Pe2ClctY7SWqHPXtJkgpn2EuSVDjDXpKkwhn2kiQVzrCXJKlwhr0kSYUz7CVJKpxhL0lS4Qx7SZIKZ9hLklQ4w16SpMIN/dj4zsDWIGe9kzQE+nH+D3v2kiQVbuh79v24B1YqZ72TpHbYs5ckqXCGvSRJhTPsJUkqnGEvSVLhDHtJkgpn2EuSVDjDXpKkwhn2kiQVzrCXJKlwhr0kSYUb+uFynZSlQU6EI2kI9OOQ4PbsJUkq3ND37PtxD6xUToQjSe2wZy9JUuEMe0mSCmfYS5JUOMNekqTCGfaSJBXOsJckqXCGvSRJhTPsJUkqnGEvSVLhDHtJkgpn2EuSVLihHxvfGdga5Kx3koZAP87/Yc9ekqTCDX3Pvh/3wErlrHeS1A579pIkFc6wlySpcIa9JEmFM+wlSSqcYS9JUuEMe0mSCmfYS5JUOMNekqTCGfaSJBXOsJckqXCGvSRJhRv6sfGdga1BznonaQj04/wf9uwlSSrc0Pfs+3EPrFTOeidJ7bBnL0lS4Qx7SZIKZ9hLklQ4w16SpMIZ9pIkFc6wlySpcIa9JEmFM+wlSSqcYS9JUuEMe0mSCtezsI+I8yNiU0RsXGT9EyPimxFxdURsiIiH9aoWSZKGWS/Hxr8AOBe4cJH1nwU+mpkZEScC7wOO62E9e+QMbA1y1jtJQ6Af5//oWc8+M68AtiyxfmtmZn13NZCLPVaSJN11rc56FxFPBv4G+CXgsW3U0I97YKVy1jtJakerF+hl5ocy8zjgScBfLfa4iDirPq+/YfPmzc0VKElSAfriavz6kP/REXHIIuvXZ+bazFy7Zs2ahquTJGmwtRb2EfErERH17ZOBSeDGtuqRJKlUy56zj4gjgacBvwEcDuwANgIfBz6RmfOL/NxFwDrgkIi4HjgHGAfIzPOApwDPjIiZ+jnPXHDBniRJ6pIlwz4i/hE4ArgEeB2wCVgB3Ad4NPCKiDi7Pgx/B5n59KWeOzNfVz+nJEnqoeV69m/IzD0NirMRuDgiJoB7dr8sSZLULUues99T0EfEgfUgOGTmdGZe26viJEnS3dfRBXoRcXlE7BcRBwFXAW+PiDf1tjRJktQNnV6Nv39m3gr8DnBhZj4I+M3elSVJkrql07Afi4jDgP9KdbGeJEkaEJ2G/WuATwHXZubXIuJo4Hu9K0uSJHVLR2PjZ+b7gfcvuP8Dqv+TH3jOwNYgZ72TNAT6cf6PJXv2EfHK+qK8xdY/IiIe1/2yJElStyzXs78G+FhE7KS6Cn8z1aA6xwInAZcC/7unFfZYP+6BlcpZ7ySpHUuGfWZ+BPhIRBwLnAocBtwK/BNwVmbu6H2JkiTp7uj0nP338II8SZIGUl9McStJknrHsJckqXCGvSRJhevonH1ErAH+EDhq4c9k5nN6U5YkSeqWjsIe+Ajweap/tZvrXTmSJKnbOg37VZn58p5WIkmSeqLTc/aXRMTpPa1EkiT1RKdh/0KqwN8ZEbfVX7f2sjBJktQdnQ6qs2+vC2mLk7I0yIlwJA2BfhwSvNNz9kTEE4CH13cvz0zntZckaQB0+q93rwVOAd5dL3phRJyamX/es8oa0o97YKVyIhxJakenPfvTgZMycx4gIt4JfB0Y+LCXJKl0ezOC3gELbu/f7UIkSVJvdNqz/xvg6xHxOSCozt2f3bOqJElS13R6Nf5FEXE51Xl7gJdn5s96VpUkSeqaJQ/jR8Rx9feTgcOA6+uvw+tlkiSpzy3Xs38JcBbwhj2sS+ARXa9IkiR11ZJhn5ln1Tcfk5k7F66LiBU9q0qSJHVNp1fjf7HDZZIkqc8s2bOPiEOBI4CVEXF/qivxAfYDVvW4NkmS1AXLnbP/beBZwJHAGxcsvw34ix7VJEmSumi5c/bvBN4ZEU/JzA82VJMkSeqiTv/P/oMR8VjgBGDFguWv6VVhTXEGtgY5652kIdCP8390dIFeRJwHnAm8gOq8/VOBe/WwLkmS1CWdDpf70Mw8MSK+mZl/GRFvAD7Ry8Ka0o97YKVy1jtJaken/3q363/st0fE4cAM1Yh6kiSpz3Xas/9YRBwAvB64imr0vLf3rCpJktQ1y4Z9RIwAn83Mm4EPRsQlwIrMvKXn1UmSpLtt2cP4mTkPvHXB/SmDXnsrM9suQZKGVqfn7D8bEU+JiFj+oZIkqZ90GvZ/BLwfmIqIWyPitoi4tYd1SZKkLul0UJ19e12IJEnqjY7CPiIevqflmXlFd8uRJEnd1um/3r1swe0VwAOBK4FHdL0iSZLUVZ0exn/8wvsRcQ/g73pSkSRJ6qpOL9C7s+uBX+tmIZIkqTc6PWf/91Sj5kG1g3AS1Uh6A88Z2JqR4Kx3koZCP87/0ek5+w0Lbs8CF2Xmv/agHkmS1GWdnrN/Z68LaUs/7oGVaH4+Ofov/hnwPZekpi0Z9hFxDbsP3/+CzDyx6xVJkqSuWq5n/7j6+/Pr7++qv/83ltgJkCRJ/WPJsM/MHwFExG9l5v0XrHp5RFwFnN3L4iRJ0t3X6b/eRUScuuDOQ/fiZyVJUos6vRr/ucD5EbF/ff9m4Dm9KUmSJHVTp1fjXwncb1fYO5+9JEmDo9OePWDIS5I0iDzvLklS4Qx7NcL/05Sk9iw3qM7vLLU+My/ubjmSJKnbljtn//gl1iVg2EuS1OeWG1Tn2U0V0hZnYGtGEvDglwK+55LK1o/zf3R8NX5EPBY4AVixa1lmvqYXRUmSpO7pdD7784BVwGnAO4AzgK/2sK7G9OMeWInm5pNjnPVOklrR6dX4D83MZwI3ZeZfAg8B7tO7siRJUrd0GvY76u/bI+JwYAY4rDclSZKkbur0nP0lEXEA8HrgKqor8d/es6okSVLXdDo2/l/VNz8YEZcAKxw6V3sj02F1JKktHR3Gj4hvRsRfRMQxmTll0EuSNDg6PWf/eGAWeF9EfC0iXhoR9+xhXZIkqUs6CvvM/FFm/m1mPgD4XeBE4Ic9rUySJHXF3gyqcy/gzPprDvizXhUlSZK6p9NBdb4CjAPvA56amT/oaVWSJKlrlg37iBgBLs7M1zVQjyRJ6rJlz9ln5jzw1L194og4PyI2RcTGRdY/o77K/5qI+GJE3G9vX0OSJC2v03P2l0bES4H3Att2LczMLUv8zAXAucCFi6z/IfBfMvOmiHgMsB54UIf1dI0zsDXDWe8kDYt+nP+j07A/s/7+/AXLEjh6sR/IzCsi4qgl1n9xwd0vA0d2WIsGUUTbFUjS0Op0BL1797iO5wKfWGxlRJwFnAVwz3t299/7+3EPrEQzc/Mc+4pqE/ueS1KzOh1Bb1VEvDIi1tf3j42Ix3WjgIg4jSrsX77YYzJzfWauzcy1a9as6cbLSpI0NDodQe8fgWngofX9HwN/fXdfPCJOBN4BPDEzb7y7zydJkn5Rp2F/TGb+LdXUtmTmduBunYSth9u9GPi9zPzu3XkuSZK0uE4v0JuOiJVUF+UREccAU0v9QERcBKwDDomI64FzqAbmITPPA14FHAz8Q1QXb81m5tq70AZJkrSETsP+1cAngXtExLuBU4FnL/UDmfn0Zdb/AfAHHb6+JEm6izq9Gv/TEXEl8GCqw/cvzMwbelqZJEnqik6vxv9sZt6YmR/PzEsy84aI+Gyvi5MkSXffkj37iFgBrKI6734guy/K2w84ose1qSCZbVcgScNrucP4fwS8CDgcuJLdYX8r1VC4kiSpzy0Z9pn5ZuDNEfGCzPz7hmqSJEld1OkFen8fEQ8Fjlr4M5m52CQ3A8NJWZqRMQIP+lPA91xS2fpxSPCOwj4i3gUcA1wNzNWLk8VntJMkSX2i0/+zXwscn1neZVb9uAdWounZee7zSifCkaQ2dDpc7kbg0F4WIkmSeqPTnv0hwLcj4qssGCY3M5/Qk6okSVLX7M1wuZIkaQB1ejX+v/S6EJUtKe5yD0kaGMuNoPeFzHxYRNwGd/hrHUBm5n49rU6SJN1tyw2q87D6+77NlCNJkrqt06vxJUnSgDLsJUkqnGEvSVLhDHtJkgpn2EuSVLhOB9UpljOwNSNjFB70EsD3XFLZ+nH+D3v2aoRD6khSe4a+Z9+Pe2Al2jkzx3H/85OA77kkNc2evSRJhTPsJUkqnGEvSVLhDHtJkgpn2EuSVDjDXpKkwhn2kiQVzrCXJKlwhr0kSYUz7CVJKpxhL0lS4YZ+bHxnYGvGfIzBg14M+J5LKls/zv9hz16SpMINfc++H/fASuSsd5LUHnv2kiQVzrCXJKlwhr0kSYUz7NWIzLYrkKThZdhLklQ4w16SpMIZ9pIkFc6wlySpcIa9JEmFM+wlSSqcYS9JUuGGfmx8Z2BrxvzIGDzQWe8kla8f5/+wZ6+GRNsFSNLQGvqefT/ugZVo+/Qsx7/qU4DvuSQ1zZ69JEmFM+wlSSqcYS9JUuEMe0mSCmfYS5JUOMNekqTCGfaSJBXOsFcjMtuuQJKGl2EvSVLhDHtJkgpn2EuSVLihHxvfGdiaMT8yDg98EeB7Lqls/Tj/hz17SZIKN/Q9+37cAyvRtqlZTjjHWe8kqQ327CVJKpxhL0lS4Qx7NcIxdSSpPYa9JEmFM+wlSSqcYS9JUuEMe0mSCmfYS5JUOMNekqTC9SzsI+L8iNgUERsXWX9cRHwpIqYi4qW9qkOSpGHXy+FyLwDOBS5cZP0W4E+AJ/WwhmU5KUsznAhH0rDoxyHBe9azz8wrqAJ9sfWbMvNrwEyvalAfiWi7AkkaWk6E04d7YCW6becMv/7qTwO+55LUtIG4QC8izoqIDRGxYfPmzW2XI0nSQBmIsM/M9Zm5NjPXrlmzpu1yJEkaKAMR9pIk6a7r2Tn7iLgIWAccEhHXA+cA4wCZeV5EHApsAPYD5iPiRcDxmXlrr2qSJGkY9SzsM/Ppy6z/GXBkr15fkiRVPIwvSVLhDHtJkgpn2KsR2XYBkjTEDHtJkgpn2EuSVDjDXpKkwg392PjOwNaM+dEJOOWFgO+5pLL14/wf9uwlSSrc0Pfs+3EPrES37pzhRGe9k6RW2LOXJKlwhr0kSYUz7CVJKpxhr0akQ+hJUmsMe0mSCmfYS5JUOMNekqTCGfaSJBXOsJckqXCGvSRJhTPsJUkq3NCPjd/tGdh+/qu/w9jUrRx83aVdfd5BceO9HsHc5L780nc/coflc6OTcMqfAM56N8zmR8b5ya8/k0N+8ElW3PbjtsuReqIf5/+wZ99lOw48htsOvX/bZbTmtsMewPaD7tN2GepT06vWMLvyIG6657q2S5GGytD37Lu9B3bU2R/vyfMOisXaf8v2Ge73Gme9G3ZX/ugmnvK2L3L8Ccfzobde3nY50tCwZy9JUuEMe0mSCmfYS5JUOMNeUoOc/lBqg2EvSVLhDHtJkgpn2EuSVDjDXo1Iz9VKUmsMe0mSCmfYS5JUOMNekqTCDf3Y+F2fge3BL+vN8w6KRdo/N7oCTnnBHtdpeOzc53C47zP49re+zbp1r2i7HKkn+nH+D3v2kiQVbuh79s56112Ltf/m7dOc9JrP7HHdsJibT8697Fqe87Cj2HfFeNvltOLKH23hKW/70lDPeveVH9zITdunefR9D2u7lNZd+KXr+I1j13DvQ1a3XUrx7NlLDfnna37Kmy79Lq/9xL+3XYpadOb6L/Pf/+mqtsto3fx88qqPfIsnvfVf2y5lKBj2UkOmZ+cB2DE913IlUvt2jbxx686ZVusYFoa9GpGOqSNpgfSPQqMMe6khEdV3/8RJu5n5zTDspYbcHvb+dZPc6W2YYS9Japz7vM0y7KWGBFXX3r9xkpNjNc2wlxqy+zB+u3VIGj6GvSSpce70Nsuwlxrm3zhJTTPspYZ5Nb5kz75pQz82vrPeddlis96NrYS1f7zHdcNi68HHwbGP57LLLmPd+pe0XU4rnPUO/0bU5kfG4IEvBsp7L/px/g979lLTdl2pJw01fw+aNPQ9e2e9667F2r9l2zQn/9Vwz3r3sW/8hBdc9HVOW3cab337n7ZdTiuc9c6/Ebtsm5rlhHM+BfheNMGevdQQO/TSbp6yb5ZhLzXMwUQkNc2wlxoSnqOUbud/pTTLsJca5t84ycP4TTPspYY4XK60m78HzTLspYZ4EF9SWwx7NcLzc7t5gZ6Ex/EbZthLDfEwvrSbO73NMuylxnggX9rFnd5mGfaSJBVu6IfLHZaJcKZXHESOTjC57We9fSEnwlnUtgN/BX71yXz+C19g3fkvbbucVuyeCOdbToQzpL8Hu5T8N6Efh/+1Zz8kfnLSc/npr/9e22UMNQ/iS2rL0Pfsh2UinKbqWux1btw6xQP++tJGauhXn/7WzzjrXVdy6qkP4x3rX9R2Oa3YNRHOCSecwMVOhNNuIS27YesUa4f8b0KT7NlLklQ4w15qSNw+7Z2XIUtejd8sw16N8Pd69zl7/8hJ/p990wx7SZIKZ9hLDbl9BL12y5D6g78IjTLspYbsHi7Xv3KSvwXNMuwlSY1zn7dZhr3UMP/GCTzCo2YZ9lJDor4e37/xAj8HXo3fLMNeklow7FE37Ds7TetZ2EfE+RGxKSI2LrI+IuItEXFtRHwzIk7uVS1SP9jVk/FvnMDD+MPd+uZFrz5wEfFwYCtwYWbedw/rTwdeAJwOPAh4c2Y+aLnnXbt2bW7YsKFrda5bt47Z8X24/gHP69pzSpKG01Fffn1PxvqPiCszc+1d/fme9ewz8wpgyxIPeSLVjkBm5peBAyLisF7Vs6RwPjJJUrnaPGd/BPCfC+5fXy9r1OWXX87HPvTBpl9WklSgfp3BbyAu0IuIsyJiQ0Rs2Lx5c9eff+XEaNefU5KkftHmfPY/Bu6x4P6R9bJfkJnrgfVQnbPvdiErxkd58SPvw5su/W63n1oLHHfovvzoxu3smJnb4/qJ0RGm5+Y7eq6V46PsmJlj1cQos3PJ5NgI22fmGI1g1eQo26fnmBit9mW3Ts0yMTbC3HwyN7/nj08ETI6NsHNmz68/MTbCqolRZmbnmZ6bZ2Zu6Y/hPpNjzM0n03PzrBwfZXQk2Dkzx3GH7cf3N229vabp2Tu+3srxUeazas/ISDASwZZt0wCMjgQrxkZYPTnG7HwyU//sjpk5ZueT/VZUr7ltunp/D1w1DsAtO2YYGx1hfCTYMTPH5NgoM3PzzNbvxeqJUVZOjHLD1mn2naz+JNw2NcuK8RH2WzHOlm3TrBgfZcX4KDdtn2ZuPhkfDVaOj3LAqgn+Y8v26j0aHWH15Cg3bZ9h37qWFeOjzM0n85mMjgSrJ8YYGw22Tc2xenKUidERpmbnGR8Ntk/PMT07z+rJMaZm51gxPsqO6Tl2zswxn7D/ynEmxkYYCbhlxyyTYyNMzVbrdtUzW2/jibERVk+MsXVqlunZebZNV4+HYGwkmJqt3qOZuaq2A1aOM1O/H9unZtl/5TjjYyPctnOWuflk5fgo2+pttmbfSf5jy3YyYXJ8hINWTXDg6gm2Tc0SEdy4dYp9JscYHx1hZm7+Dp+9bdOzHHfofmy6bYrrb9rOxOgISVX/PpNj3LB1munZecZGg/HRqq2TY6NsnZplfDSYmUvGRoLJsRHmMtk+NceKiVF2zswxOTbClm3TTI6NcvA+E/V2GiFJZmaTkYB9V4xz845pZuvP7+x8st/KMaZm5tkxM0cAc/PJzFzya4fvx83bq8funJnjoNUTzGWyY3qO1ZNjTI6N8OObd3Dgqgl21r+L46MjzGdWv5vjY2zeOsXK8aozddP2afZfOX775+7g1RPc46BV/OyWnWyd2rV9qppWT46x+dad7LtinB0zc6wYH6l/B0aI+nd6bCSYGKs+PxP1ew0wNlr93oyOBFOz8+yYrn5+dj6ZqOsbGxlhdn6esZERRkeq07jbp2fZf9UE+06OsWXbNKsnR9mybZqp+vcsE444YCVjo8HN22eYGBthbCSYz+TWnbPsMznG/3nqiUv+XWhTm2H/UeCPI+I9VBfo3ZKZP22rmBc+8lhe+Mhj23p5SZJ6pmdhHxEXAeuAQyLieuAcYBwgM88D/pnqSvxrge3As3tViyRJw6xnYZ+ZT19mfQLP79XrS5KkykBcoCdJku46w16SpMIZ9pIkFc6wlySpcIa9JEmFM+wlSSqcYS9JUuEMe0mSCmfYS5JUOMNekqTCGfaSJBXOsJckqXCGvSRJhTPsJUkqnGEvSVLhDHtJkgoXmdl2DXslIjYDP+rCUx0C3NCF5+kntmlwlNgu2zQYbNPgWNiue2Xmmrv6RAMX9t0SERsyc23bdXSTbRocJbbLNg0G2zQ4utkuD+NLklQ4w16SpMINc9ivb7uAHrBNg6PEdtmmwWCbBkfX2jW05+wlSRoWw9yzlyRpKAxd2EfEoyPiOxFxbUSc3XY9eysirouIayLi6ojYUC87KCI+ExHfq78fWC+PiHhL3dZvRsTJ7VZfiYjzI2JTRGxcsGyv2xARv18//nsR8ftttGVBLXtq06sj4sf1tro6Ik5fsO7P6zZ9JyJ+e8Hyvvl8RsQ9IuJzEfHtiPhWRLywXj6w22qJNg3stoqIFRHx1Yj4Rt2mv6yX3zsivlLX996ImKiXT9b3r63XH7XgufbY1jYs0a4LIuKHC7bVSfXyvv/81bWMRsTXI+KS+n4z2ykzh+YLGAW+DxwNTADfAI5vu669bMN1wCF3Wva3wNn17bOB19W3Twc+AQTwYOArbddf1/Vw4GRg411tA3AQ8IP6+4H17QP7rE2vBl66h8ceX3/2JoF715/J0X77fAKHASfXt/cFvlvXPrDbaok2Dey2qt/vferb48BX6vf/fcDT6uXnAc+rb/8P4Lz69tOA9y7V1hY/f4u16wLgjD08vu8/f3U9LwH+H3BJfb+R7TRsPfsHAtdm5g8ycxp4D/DElmvqhicC76xvvxN40oLlF2bly8ABEXFYGwUulJlXAFvutHhv2/DbwGcyc0tm3gR8Bnh076vfs0XatJgnAu/JzKnM/CFwLdVns68+n5n508y8qr59G/BvwBEM8LZaok2L6fttVb/fW+u74/VXAo8APlAvv/N22rX9PgD8ZkQEi7e1FUu0azF9//mLiCOBxwLvqO8HDW2nYQv7I4D/XHD/epb+Re9HCXw6Iq6MiLPqZb+cmT+tb/8M+OX69iC1d2/bMCht++P6kOL5uw53M4Btqg8h3p+qd1XEtrpTm2CAt1V9aPhqYBNVmH0fuDkzZ/dQ3+211+tvAQ6mz9oEv9iuzNy1rf5Xva3eFBGT9bJB2FZ/B/wZMF/fP5iGttOwhX0JHpaZJwOPAZ4fEQ9fuDKr4zwD/Y49HJsAAAbKSURBVC8WJbSh9jbgGOAk4KfAG9ot566JiH2ADwIvysxbF64b1G21hzYN9LbKzLnMPAk4kqqXd1zLJXXFndsVEfcF/pyqfadQHZp/eYsldiwiHgdsyswr23j9YQv7HwP3WHD/yHrZwMjMH9ffNwEfovrF/vmuw/P19031wwepvXvbhr5vW2b+vP5jNQ+8nd2H2gamTRExThWK787Mi+vFA72t9tSmErYVQGbeDHwOeAjVYeyxetXC+m6vvV6/P3AjfdomuEO7Hl2fisnMnAL+kcHZVqcCT4iI66hO+zwCeDMNbadhC/uvAcfWVz9OUF308NGWa+pYRKyOiH133QYeBWykasOuK0x/H/hIffujwDPrq1QfDNyy4PBrv9nbNnwKeFREHFgfcn1Uvaxv3On6iCdTbSuo2vS0+mrbewPHAl+lzz6f9fnB/wv8W2a+ccGqgd1Wi7VpkLdVRKyJiAPq2yuB36K6FuFzwBn1w+68nXZtvzOAy+ojNIu1tRWLtOvfF+xoBtX57YXbqm8/f5n555l5ZGYeRfV5uSwzn0FT22m5K/hK+6K6YvO7VOe0XtF2PXtZ+9FUV2F+A/jWrvqpzuN8FvgecClwUL08gLfWbb0GWNt2G+q6LqI6VDpDdb7puXelDcBzqC5OuRZ4dh+26V11zd+sf0EPW/D4V9Rt+g7wmH78fAIPozpE/03g6vrr9EHeVku0aWC3FXAi8PW69o3Aq+rlR1OFwLXA+4HJevmK+v619fqjl2trn7XrsnpbbQT+id1X7Pf9529BPevYfTV+I9vJEfQkSSrcsB3GlyRp6Bj2kiQVzrCXJKlwhr0kSYUz7CVJKpxhL0lS4Qx7qcci4osdPOZFEbGqgVouiIgzln9kd543Ip4VEYcvuP+OiDi+B6+/MiL+JSJGl3jMpQvGvJeGimEv9VhmPrSDh70I2KuwXyrY+sizgNvDPjP/IDO/3YPXeQ5wcWbOLfGYd1FNGyoNHcNe6rGI2Fp/XxcRl0fEByLi3yPi3fXQnn9CFYifi4jP1Y99VER8KSKuioj31xO3EBHXRcTrIuIq4GUR8dUFr3NURFxT335VRHwtIjZGxPp6aNGlajwmIj4Z1WyKn4+I4+rlF0TEWyLiixHxg12997rucyPiOxFxKfBLe3jOM4C1wLsj4uq69315RKzd9b5ExOsj4lt1r/uB9fofRMQT6seM1o/5WlSznP3RIk14BvUwoxFxWERcUb/mxoj4jfoxHwWevtz2kkpk2EvNuj9VL/54qmEyT83MtwA/AU7LzNMi4hDglcAjs5rhcAPwkgXPcWNmnpyZrwUm6vGxAc4E3lvfPjczT8nM+wIrgcctU9d64AWZ+QDgpcA/LFh3GNUws48DXlsvezLwq3U7ngn8wtGLzPxAXfszMvOkzNxxp4esphrv+wTgNuCvqcY/fzLwmvoxz6Ua4/wUqlnO/nBBewGox6Y/OjOvqxf9LvCprGZLux/VkLhkNZf5ZEQcvMx7IRVnbPmHSOqir2bm9QBRzdN9FPCFOz3mwVQh+q91h3wC+NKC9e9dcPt9VCH/2vr7mfXy0yLiz6hODRxENZfCx/ZUUH3U4KHA+xccAJhc8JAPZzUb3LcjYtfc9Q8HLqoPm/8kIi5btuW/aBr4ZH37GmAqM2fqoxNH1csfBZy44HqA/akm/vjhguc5BLh5wf2vAedHNbvdhzPz6gXrNlEdRbnxLtQrDSzDXmrW1ILbc+z5dzCAz2TmYoecty24/V6qkL6Yanr570XECqqe+drM/M+IeDXVpBqLGQFurnvCy9W85OmAvTSTuyfnmN/1Opk5H7un/AyqIw5LzVK2gwXty8wrIuLhwGOBCyLijZl5Yb16Rf14aah4GF/qD7cB+9a3vwycGhG/ArdPbXyfPf1QZn6faqfhf7K7x78r+G6oe+1LXn2fmbcCP4yIp9avFxFxv2XqvQI4sz6nfhhwWgftuis+BTyv7qUTEfeJanrnhfXfBIzWOzlExL2An2fm24F3ACfXywM4FLjubtQjDSR79lJ/WA98MiJ+Up+3fxZwUUTsOpz+SqrpVPfkvcDrgXsDZObNEfF2qilAf0Z1WHs5zwDeFhGvBMaB91BNpbyYDwGPAL4N/Ad3PM2w0AXAeRGxA3hIB3Xc2TuoDulfVYf1Zqo5zO/s01TXFVxKNX3oyyJiBthKdU0BwAOAL2fm7F2oQxpoTnEraeBFxMnAizPz95Z4zJuBj2bmZ5urTOoPHsaXNPAy8yqqf11cauyBjQa9hpU9e0mSCmfPXpKkwhn2kiQVzrCXJKlwhr0kSYUz7CVJKtz/B7K7jxmDNZwkAAAAAElFTkSuQmCC\n", - "text/plain": [ - "<Figure size 576x576 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "\n", - "pd_diff = np.diff(ophys_pd)\n", - "med_diff = np.median(pd_diff)\n", - "frame_dur_exp = 1 / 60\n", - "\n", - "ax.plot(ophys_pd[1:], pd_diff)\n", - "\n", - "for ii in range(30):\n", - " ax.hlines([med_diff + frame_dur_exp * ii], xmin=ophys_pd[1]-20, xmax=ophys_pd[-1]+20)\n", - "\n", - "plt.ylim(top=1.5)\n", - "\n", - "ax.set_ylabel(\"interval duration (s)\")\n", - "ax.set_xlabel(\"interval end time (s)\")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So now we're left with dropped frames. We also have a sensible number of photodiode edges:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3772\n", - "3772\n" - ] - } - ], - "source": [ - "print(ophys_pd.size)\n", - "print(ophys_vs[::60].size)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To investigate the dropped frames, we'll look at the vsync intervals:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 576x576 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "\n", - "vs_diff = np.diff(ophys_vs)\n", - "ax.plot(ophys_vs[1:], vs_diff)\n", - "\n", - "for ii in range(1, 31):\n", - " ax.hlines([frame_dur_exp * ii], xmin=ophys_pd[1]-20, xmax=ophys_pd[-1]+20)\n", - "\n", - "plt.ylim(top=0.5)\n", - " \n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These look almost exactly the same as the photodiode delay values, suggesting that we indeed have some bursts of dropped frames. Some things to note:\n", - "- The vsync intervals are for the most part very close to 1/60 seconds. Sometimes they dip a bit above or below, and this gets rectified out by the monitor's clock.\n", - "- Unlike the other bursts of dropped frames, the one at around ~520 seconds seems to have taken less than one full frame. Since this was reflected in a photodiode delay of ~1/60 seconds, our best guess is that the frame was just late enough to miss the monitor's refresh.\n", - "\n", - "Now we can go ahead an calculate the monitor delay for this session:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 576x576 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "monitor_delays = ophys_pd - ophys_vs[::60]\n", - "\n", - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "plt.hist(monitor_delays, bins=100)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Example: extracellular ephys" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "ecephys_dir = Path(\"/allen/programs/braintv/production/neuralcoding/prod56/specimen_719828690/ecephys_session_754312389\")\n", - "ecephys_sync_path = ecephys_dir / Path(\"754312389_404570_20180917.sync\")\n", - "\n", - "ecephys_sync = Dataset(ecephys_sync_path)\n", - "\n", - "ecephys_pd = ecephys_sync.get_edges(keys=[\"stim_photodiode\"], kind=\"all\", units=\"seconds\")\n", - "ecephys_vs = ecephys_sync.get_edges(keys=[\"stim_vsync\"], kind=\"falling\", units=\"seconds\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 576x576 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "\n", - "plt.plot(ecephys_vs[1:], np.diff(ecephys_vs))\n", - "\n", - "for ii in range(1, 10):\n", - " ax.hlines([frame_dur_exp * ii], xmin=ecephys_vs[1]-20, xmax=ecephys_vs[-1]+20)\n", - "\n", - "plt.ylim(top=0.5)\n", - " \n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAAZACAYAAAAhDI6nAAAgAElEQVR4XuzdC/BdVX0v8BUE5KGQohGBBIJU5JkAkshLkSpgIdQXCLRF8NHWO1ocaxlLpyWxKEbq9d6KInjriCK9rVw73lGvkCpIlUcJ2luo9lZQQVQ0DyQlJCQQc+ecDsif7PzP+e//Pvus9duf/wzTEfZea/0+vzXrzqzvPefM2Lx58+bkjwABAgQIECBAgAABAgQIECBAgAABAgQIECAQSGCGACRQN5VCgAABAgQIECBAgAABAgQIECBAgAABAgQI9AUEIDYCAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AAECBAgQIECAAAECBAgQIECAAAECBAgQIBBOQAASrqUKIkCAAAECBAgQIECAAAECBAgQIECAAAECBAQg9gABAgQIECBAgAABAgQIECBAgAABAgQIECAQTkAAEq6lCiJAgAABAgQIECBAgAABAgQIECBAgAABAgQEIPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEE5AABKupQoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBCD2AIEKgUcffTTddddd/f8ya9astO2223IiQIAAAQIECBAgQIAAAQIECBAgQGBIgccffzytXLmy//Shhx6adthhhyHf9BiB5gQEIM1ZGimQwPLly9PChQsDVaQUAgQIECBAgAABAgQIECBAgAABAuMRuP3229OCBQvGM7lZOy0gAOl0+xW/NQEBiL1BgAABAgQIECBAgAABAgQIECBAoBkBAUgzjkaZuoAAZOpm3uiAwL333pv23XfffqW9A3qPPfboQNVKJECAAAECBAgQIECAAAECBAgQINCMwAMPPPDkN6z88Ic/THPnzm1mYKMQmIKAAGQKWB7tjsCPf/zjNGfOnH7B999/f5o9e3Z3ilcpAQIECBAgQIAAAQIECBAgQIAAgWkKuF+bJqDXGxEQgDTCaJBoAg7oaB1VDwECBAgQIECAAAECBAgQIECA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MlJeg3dcQADSkQ2wYsWKdPvtt/f/Wb58ef+f1atX96s/99xz01VXXdWIxB133JFuuumm/vjf/e53U+9Hth988MG0/fbbpz333DMdddRR6bzzzksnnHDCUPOtW7cuffSjH03XXntt+v73v582bNiQ5syZk0499dR0/vnnp3322Weocab6UFcCED+CPtWd4XkCBAgQIECAAAECBAgQyFlg/WOb0ss+8q0JS/zwa16YXrrfr+W8bGvruIAfQe/4BlD+SAUEICPlzWfwyX7rockA5Ljjjks333zzwMLPOOOM9JnPfCbtsMMOW332nnvuSaecckq6++67K5/ZZZdd0jXXXJMWLVo0cL6pPtCVAGSqLp4nQIAAAQIECBAgQIAAAQI5C6zfuCkdeNF1E5b4yXOPTK84cPecl21tBEIKuF8L2dbiihKAFNeyegt+agCy9957pwMOOCAtW7asP1iTAcgrXvGKtGnTpnTMMcekAw88MO2xxx5pt912638S5F/+5V/SFVdckX74wx/25z3zzDPT3/7t31YW9PDDD6cjjzwyfe97//kjZb/3e7+XzjrrrLTjjjumG2+8MX3gAx9Ia9euTTvttFM/cDnssMPqwWzlLQd0o5wGI0CAAAECBAgQIECAAAECrQgIQFphNgmBoQTcrw3F5KERCwhARgycy/CLFy9OCxYs6P+z++67p3vvvTftu+++/eU1GYA8/vjjadttt91q2evXr0+/8Ru/kW677bb+M71QZN68eVs8f9FFF6WLL764/+8vvfTSdMEFF0x45pZbbknHH3986s3X+79f//rXG6V2QDfKaTACBAgQIECAAAECBAgQINCKQFUA8tdvPDK98iCfAGmlASYh8BQB92u2Qw4CApAcujCGNYwqABmmlN6nPs4+++z+o73f93j7298+4bXHHnss9b77cM2aNf1Pkfzrv/5r2mabbbYY+m1ve1u68sor+/++99smvXCnqT8HdFOSxiFAgAABAgQIECBAgAABAu0JPPrYpnTAn0/8CiwBSHv+ZiLwVAH3a/ZDDgICkBy6MIY1jDMA+fKXv/zk73Z86EMfSu9+97snCPS+muvkk0/u/7ulS5em97znPZVCvU+RHH300f3/duGFF6ZLLrmkMUkHdGOUBiJAgAABAgQIECBAgAABAq0J+ARIa9QmIjBQwP3aQCIPtCAgAGkBOccpxhmAnHPOOemzn/1sn+VLX/pSOvXUUycQPfXrr2699dZ01FFHVRL2vv5q1113TevWrUsve9nL0k033dQYtQO6MUoDESBAgAABAgQIECBAgACB1gQEIK1Rm4jAQAH3awOJPNCCgACkBeQcp2gzAPnlL3/Z/xH073znO+myyy5LX/jCF/okvR9iv+uuu7b4zZDTTz89ff7zn+8/84tf/CLNnDlzq4Tz589Pd955Z/8rs1asWNEYtQO6MUoDESBAgAABAgQIECBAgACB1gR8BVZr1CYiMFDA/dpAIg+0ICAAaQE5xynaCEDmzp2b7rvvvsryX/CCF/Q//dH7jY+n//U+8fFP//RPaeedd05r166dlG/RokWp95Vavb9HH300PfOZzxyKu3cAT/b3wAMPpIULF/Yfuf/++9Ps2bOHGtdDBAgQIECAAAECBAgQIECAwPgEBCDjszczgacLCEDsiRwEBCA5dGEMaxhXALLtttumJUuWpPPPPz89+9nPrqz84IMPTt/97nfT7rvvnn72s59NqnPmmWemz33uc/1nVq1alZ7znOcMpTljxoyhnhOADM3kQQIECBAgQIAAAQIECBAgMHaBqgDkf7zxyHTiQbuPfW0WQKBrAgKQrnU8z3oFIHn2ZeSraiMA+d73vpc2btyYel+BtXr16nTzzTenj3/84/2gohdcXH755elZz3rWFrXut99+6Qc/+EGaM2dO+tGPfjSpxRvf+MZ09dVX95+Zyic1BCAj32ImIECAAAECBAgQIECAAAECrQsIQFonNyGBrQoIQGyOHAQEIDl0YQxraCMAqSqr95seJ598clq+fHmaN29ePxR5egjSxidAfAXWGDadKQkQIECAAAECBAgQIECAwIgFBCAjBjY8gSkICECmgOXRkQkIQEZGm/fA4wpAeir/9m//lg466KA+0IUXXpguueSSCVht/AbIoO44oAcJ+e8ECBAgQIAAAQIECBAgQCA/gaoA5BPnvDiddPDz81usFREILuB+LXiDCylPAFJIo5pe5jgDkF4t+++/f7r77rvTC1/4wtT7qqyn/p1++unp85//fP9f9T4xMnPmzK2WP3/+/HTnnXemWbNmpRUrVjTG5IBujNJABAgQIECAAAECBAgQIECgNQEBSGvUJiIwUMD92kAiD7QgIABpATnHKcYdgBx77LHplltuSdtvv33asGHDBKKLLrooXXzxxf1/d+utt6beJ0Kq/h5//PF+OPLII4+kl73sZemmm25qjNoB3RilgQgQIECAAAECBAgQIECAQGsCvgKrNWoTERgo4H5tIJEHWhAQgLSAnOMU4w5A5s6dm+67776022679X8g/al/y5Yt6/9OSO9v6dKl6T3veU8l4W233ZaOPvro/n+r+iqt6bg7oKej510CBAgQIECAAAECBAgQIDAeAZ8AGY+7WQlUCbhfsy9yEBCA5NCFMaxhnAFI7wfQFy5c2K/6+OOPT1//+tcnCGzcuDE973nPS2vWrEkHHnhg+s53vpNmzJixhdLb3va2dOWVV/b//e23354WLFjQmKQDujFKAxEgQIAAAQIECBAgQIAAgdYEBCCtUZuIwEAB92sDiTzQgoAApAXkHKeoE4BcddVV6U1velO/nMWLF6clS5ZMKK0XQmy77bbpiCOO2GrJP/nJT9KJJ57Y/yH03t8nP/nJ9OY3v3mL55/6NViXXnppuuCCCyY80/tqrN7XXvW+BqsqRJmuuQN6uoLeJ0CAAAECBAgQIECAAAEC7QtUBSBXnvPidLIfQW+/GWbsvID7tc5vgSwABCBZtGH0i/jmN7+Z7rnnnicnWrVq1ZOhQu/3ON761rdOWMR55523xaIGBSBP/PdjjjkmnXbaaemwww7r/zh5768XfNx4443pU5/6VP+THb2/V77ylen6669P22yzzRZzPfzww+nII4988gfSf//3fz+dddZZaccdd+yPc8kll6S1a9f2/3fvt0R6czX554BuUtNYBAgQIECAAAECBAgQIECgHQEBSDvOZiEwjID7tWGUPDNqAQHIqIUzGb8XaHz6058eejWbN2/e4tlhA5BhJumt52Mf+1jaaaedtvp4L7A55ZRT0t133135zC677JKuueaatGjRomGmnNIzDugpcXmYAAECBAgQIECAAAECBAhkISAAyaINFkGgL+B+zUbIQUAAkkMXWlhDGwHI+vXrU+8HzG+44Yb07W9/O/30pz9NP//5z9Njjz2Wdt111/Trv/7rqfdpk3POOSfNmzdvqKofeeSRflBy7bXX9j/B0vt9kDlz5vSDkXe+851pn332GWqcqT7kgJ6qmOcJECBAgAABAgQIECBAgMD4BaoCkCt+98XpVYc8f/yLswICHRNwv9axhmdargAk08ZY1ngFHNDj9Tc7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Pv05mv7rSgDiR9Cb3jnGI0CAAAECBAgQIECAAIFxCqxcuzGd8rQfQX/3CXuns/wI+jjbYu4BAn4E3RYhMDoBAcjobLMaebLfemgqAPnKV76SXvva16YNGzZMWvvzn//89Dd/8zfphBNO2OpzApCsto/FECBAgAABAgQIECBAgACBIgR+/h+Pppdc8rUJa1182kHpTcfuW8T6LZJAJIGu/H8wjtSziLUIQCJ2taKmpwYge++9dzrggAPSsmXL+k82FYB89rOfTeecc07aZptt0oknnphe9apXpfnz5/c/7dE78K655pr0d3/3d/05d9ppp3TzzTenww47rLIDTwQgr371q9P73ve+rXZp++23T/vvv3/jXXRAN05qQAIECBAgQIAAAQIECBAgMHKBqgDkokUHpTcfJwAZOb4JCDxNwP2aLZGDgAAkhy60sIbFixenBQsW9P/Zfffd+18bte++//n/+DcVgPTCjRtvvDH96Z/+aeqFLFV/l112WTr//PP7/6n3CZAbbrih8rknApCm1jZVYgf0VMU8T4AAAQIECBAgQIAAAQIExi8gABl/D6yAwBMC7tfshRwEBCA5dGEMaxhFADJsGb0Q5o477uh/UuTnP/95eu5zn7vFqwKQYTU9R4AAAQIECBAgQIAAAQIECDwhIACxFwjkIyAAyacXXV6JAKSj3R9nAHLBBRekD33oQ3353o+y9wKRp/8JQDq6MZVNgAABAgQIECBAgAABAgSmIfCzNY+moz4w8TdAfAXWNEC9SmAaAgKQaeB5tTEBAUhjlGUNNM4ApPcVWL2vwur9fetb30pHHHGEAKSs7WO1BAgQIECAAAECBAgQIEAgSwEBSJZtsaiOCghAOtr4zMoWgGTWkLaWM84ApPfD6HfeeWfabrvt0qpVq9Iuu+yy1QCk9zslvf/+/e9/P23atKn/+yULFy5MZ599dur9QPpTf9y9STsHdJOaxiJAgAABAgQIECBAgAABAu0ICEDacTYLgWEE3K8No+SZUQsIQEYtnOn44wpAvvzlL6dFixb1VXr/94tf/GKl0BNfgTUZ37HHHpt6P7y+1157TVm5dwBP9vfAAw/0g5be3/33359mz5495Tm8QIAAAQIECBAgQIAAAQIECLQrUBWA/Pmig9Jbjtu33YWYjQCBJACxCXIQEIDk0IUxrGEcAciDDz7Y/7qr++67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juHKM16VX0MqJpCxgPu1jIdXUOkCkIKGqZV4Ag7oeJZWIkCAAAECBAgQIECAAAECXQkIQLqStg+B0QLu10YbeaJ9AQFI+8Z2yFDAAZ3h0JRMgAABAgQIECBAgAABAtULDAtAXrXnovAnZxxWvQ8AAl0KuF/rUttewwQEIN4NAgMEajmgN23aZP4ECBAgQIAAAQIECBAgQKAYgTs3bQlrvvyDWf2seMkvhi+8a99i+tRIWQIzMzNlNfT/d1PL/VqRwyuoKQFIQcPUSjyBWg7oBQsWxEOzEgECBAgQIECAAAECBAgQmLLAc3baIyx+/4Wzqvjne/42PHDlv59ydbYnMFhg69atRdLUcr9W5PAKakoAUtAwtRJPoJYDWgAS752xEgECBAgQIECAAAECBAhMX+A5M8vC4vf94axC/mnD34YHrxKATH9CKhgkIADxXhBoT0AA0p6tlTMWEIBkPDylEyBAgAABAgQIECBAgEC1AgKQakefdeMCkKzHp/jEBQQgiQ9IedMREIBMx92uBAgQIECAAAECBAgQIEBgEoFhAYg/gTWJqs+2LSAAaVvY+jULCEAqmf6DDz4Y1q9f3//fbbfd1v/fQw891O/+lFNOCZdeemkUiZ/+9Kfh2muvDX/5l38Zvv/974cNGzaELVu2hB122CHsv//+4dhjjw3vf//7+//3Jj+bN28OF1xwQbjmmmv6a/V+li1bFo4//vjw4Q9/OCxatKjJMvN+ppYAxJegz/vV8AECBAgQIECAAAECBAgQSFjg7zdtCe/2JegJT0hpgwR8Cbr3gkB7AgKQ9myTWnmu73qIFYB84xvfCG9/+9vDv/zLv8zZ+6677hq++tWvhte//vVzPnfrrbf2g477779/4HO77bZbPxhZtWpVdOtaApDocBYkQIAAAQIECBAgQIAAAQJTFPhv9z0afumz355VweEvXRS++oHDpliZrQnUJ+B+rb6Zp9ixACTFqbRQ07YByO677x722WefsG7duv5OsQKQr3zlK+G9731veNaznhXe/OY3h6OPPjoceOCB/d/26B14V1xxRbjqqqv6e77gBS8IN998czjooIMGdrtx48Zw6KGHht5vKGy33XbhIx/5SP+3R3o/vd8wOf/888MTTzwRdt5553D77beHpUuXRlVzQEfltBgBAgQIECBAgAABAgQIEOhEQADSCbNNCDQS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ym0zAgQIECBAgAABAgQIECAQRUAAEoXRIh0LCEA6BrddVQICkKrGrdmmAgKQplKeI0CAAAECBAgQIECAAAEC6QgMDUB+8M3w0HXnp1OoSghsIyAA8ToQaE9AANKebVIrP/jgg2H9+vX9/9122239/z300EP9Gk855ZRw6aWXRqn3iSeeCHfcccfT+/T2+9GPfhSefPLJ/vp33313WLZs2ci9es/cc889I5/bY489woYNG0Y+N98HaglAfAn6fN8MzxMgQIAAAQIECBAgQIBAygLDvgT9ra9YFM7xJegpj67q2nwJetXj13zLAgKQloFTWX6u73qIGYCcc8454eyzzx7atgAklTdCHQQIECBAgAABAgQIECBAoDyBZWddN7Cpdxy8JJx/0kHlNawjAgkL1PL/wTjhESgthCAAqeQ12DYA2X333cM+++wT1q1b1+8+ZgDSCz96IUjv53nPe1446KCDQu+3DO66667+f5tvAHLccceFT37yk0On9NznPjfstdde0afogI5OakECBAgQIECAAAECBAgQINC6gACkdWIbEGgs4H6tMZUHWxQQgLSIm9LSa9euDStXruz/b5dddun/2ajly5f3S4wZgNxwww39tVetWhUOOOCAsN1224VTTz01XHbZZWMFIDFrm888HNDz0fIsAQIECBAgQIAAAQIECBBIQ0AAksYcVEGgJ+B+zXuQgoAAJIUpTKGGtgKQQa0IQKYwYFsSIECAAAECBAgQIECAAIEKBQQgFQ5dy8kKCECSHU1VhQlAqhr3vzUrAJl78A7oSv8fhrYJECBAgAABAgQIECBAIGuBYQHI2w9eEn7fd4BkPVvF5yfgfi2/mZVYsQCkxKk26EkAIgBp8Jp4hAABAgQIECBAgAABAgQIZCUgAMlqXIotXEAAUviAM2lPAJLJoGKXmUsA0vueku23377/JepPPvlk//tLet8vsmbNmtD7gvRtv9w9ppEDOqamtQgQIECAAAECBAgQIECAQDcCApBunO1CoImA+7UmSp5pW0AA0rZwouvnEoDMxXfEEUeEq666KixZsmTeyr0DeK6f++67rx+09H42btwYli5dOu89fIAAAQIECBAgQIAAAQIECBDoVkAA0q233QjMJSAA8X6kICAASWEKU6gh9QBkr732Cvvuu294y1veEvbff/+wcOHC8Mgjj4Tvfve74Qtf+EI/lOj99J7p/bfev8/nZz6/OSIAmY+sZwkQIECAAAECBAgQIECAwPQEBCDTs7czgZ8XEIB4J1IQEICkMIUp1JB6ANILO3bYYYeBMo899lg44YQTwrp16/r//tu//dvh/PPPn5eiAGReXB4mQIAAAQIECBAgQIAAAQJZCAwLQI4/aHH4g185OIseFEmgFAEBSCmTzLsPAUje8xu7+tQDkFGN/fSnPw177rlnePjhh8MLX/jC/v/53Oc+d9THnv53fwKrMZUHCRAgQIAAAQIECBAgQIBANgICkGxGpdAKBAQgFQw5gxYFIBkMqY0Scw9AeiYf+tCHwuc///k+z8033xwOP/zwaFQO6GiUFiJAgAABAgQIECBAgAABAp0JCEA6o7YRgZEC7tdGEnmgAwEBSAfIKW5RQgBy4YUXhl//9V/v81599dXhxBNPjEbtgI5GaSECBAgQIECAAAECBAgQINCZgACkM2obERgp4H5tJJEHOhAQgHSAnOIWJQQgvd/+6P0WiAAkxTdMTQQIECBAgAABAgQIECBAoHsBAUj35nYkMExAAOLdSEFAAJLCFKZQQwkBSO+3P3q/BdL7+c53vhOOOOKIaJIO6GiUFiJAgAABAgQIECBAgAABAp0JDAtAjjtocfisL0HvbA42ItATcL/mPUhBQACSwhSmUEPuAUjvS9Bf+tKXhoceeii84AUv6H8J+i/8wi9Ek3RAR6O0EAECBAgQe1YunQAAIABJREFUIECAAAECBAgQ6ExAANIZtY0IjBRwvzaSyAMdCAhAOkBOcYtxApBLL700nHbaaf121q5dG84+++xGrZ166qnhsssu6z979913h2XLls35ueuvvz689rWvDc9//vMHPvf444+Hd77znWHdunX9f/+N3/iNcMEFFzSqpelDDuimUp4jQIAAAQIECBAgQIAAAQLpCAhA0pmFSgi4X/MOpCAgAElhCh3U0PsTUXfeeefTO23evDl87GMf6//fe3866vTTT39GFb3Q4ud/mgQgvXDia1/72jM+eskll4Sbb765/98+/elPh5122unpfz/ooINC73/b/rzuda8Ld9xxR3jHO94RXv3qV/d/0+NFL3pR6P3Wx9/8zd+EL37xi+EnP/lJ/yN77713/7/tuOOOURUd0FE5LUaAAAECBAgQIECAAAECBDoREIB0wmwTAo0E3K81YvJQ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h389/V2RdVI5BPIWEIDk3d9UVicASaVTJddZRQBS5meAdLPcL3/5y+Fzn/tc69HLL788/PEf/3E3r3X1jAO6KyYPESBAgAABAgQIECBAgMAQBAQgApAhbDtTEuhZwP1az2ReqEBAAFIBagpDVhGAXHjhheHEE09sLf/aa68NRxxxREeKk046KVxwwQWt7z/wwAOh+EDzXr+uv/76cPjhh7deO++889Z9qHqv47R73gFdhqIxCBAgQIAAAQIECBAgQKAKAQFIZ9VOfwLLb4BUsRONSWD9Au7X7JAYBAQgMXRhCDVUEYDccsst4aCDDmqt5uyzzw7Fb4R0+jr44IPDzTffHKZNmxaWL18epk+f3rPCDTfcEA477LDWewKQnvm8QIAAAQIECBAgQIAAAQKJCghABCCJbl1lN0xAANKwhke6XAFIpI2puqwqApDnnnsubLnllmHFihXhkEMOCTfeeGPbZRTfnzt3bnj22WfD3nvvHe68886+lnv++eev+62Pb33rW+FDH/pQX+O0e8kBXRqlgQgQIECAAAECBAgQIECgZAEBSGfQM773s3DpXY9PeMBvgJS8CQ1HoAsB92tdIHmkcgEBSOXEcU5QRQBSrPTQQw9tBR/Fb3Y89thjYcGCBRMArrjiinDUUUe1/nm/v7lRfAj6m970pvDggw+2xlm0aFHYZpttSsN2QJdGaSACBAgQIECAAAECBAgQKFlAANIZVABS8mYzHIEBBNyvDYDn1dIEBCClUaY1UD8ByCWXXBKOPfbY1kLPOOOMcOaZZ05Y9Ng/g/We97wnXHPNNWHq1KnrnluyZEnYfffdW4HF7Nmzw6OPPhrmzJkzbpxbb701vPnNb259v93XypUrw8c//vFw6aWXtr797ne/O3z/+98vtQEO6FI5DUaAAAECBAgQIECAAAECJQoIQDpjCkBK3GiGIjCggPu1AQG9XoqAAKQUxvgHueOOO8LDDz88Log45ZRTWv/3PvvsEz72sY+NW8QxxxwzYVHdBCDFS8VvdxS/5VF8HXjggeHkk08O8+fPD/fff3/40pe+FB555JHW9y666KJw3HHHTZinmPvqq68ORYBywAEHhNe//vVh0003DcuWLQs//vGPw9e//vXw85//vPXeVlttFe6+++6www47lNoEB3SpnAYjQIAAAQIECBAgQIAAgRIFBCCdMQUgJW40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+ebW6ssOQI466qhwxRVXtMY+8MADw0knnRTmz58f7r///nDWWWe1fpOj+LrooovCcccd17YDzz33XNhjjz3CL37xi9b3P/7xj4cPfvCDYdasWeHWW28NZ599dli2bFnYcMMNww9/+MOw2267ldrJphzQApBSt43BCBAgQIAAAQIECBAgQIAAAQI9CQhAeuLyMIGeBQQgPZOl+ULx2xZ77rln6z/Fn6JauHBh2GGHHVqLKTMAueWWW8JBBx3UGvfd7353uPbaa8PUqVPXoS1ZsiTsvvvuYdGiRWH27Nnh0UcfDXPmzJmAWvyGyBe/+MXWPz/vvPPCKaecMu6ZO++8M+y///5h1apVrf/vbbfdVmpjBCClchqMAAECBAgQIECAAAECBAgQIECgjYAAxLYgUK2AAKRa32hHryoAKf5k1Y033himTZsWHnvssbBgwYIJBsVvhxS/JdIp3Fi5cmWYO3du+O1vfxt22mmn8LOf/SwUfzbrlV/HH39867dIiq/is02KcKesr6YEID944MnwCX8Cq6xtYxwCBAgQIECAAAECBAgQIECAQE8C/+3oPcI7d57X0zupPNyU+7VU+tHUOgUgDe18FQFI8Werttxyy7BixYpwyCGHtIKQdl/F94uA49lnn219GHrx2xxjv4o/zXXwwQe3/tE555wTTj311Lbj3H333es+TP3zn/98689rlfXVlANaAFLWjjEOAQIECBAgQIAAAQIECBAgQKB3Ab8B0ruZNwj0IiAA6UUro2erCEDG/vmr4jM6TjvttI5iRcBRBB3Fb4osX748TJ8+fd2zY//81V133RXe+ta3th2n+PNXm222Wev9/fbbL9x+++2ldagpAYjPACltyxiIAAECBAgQIECAAAECBAgQINCzgACkZzIvEOhJQADSE1c+D1cRgFx44YXhxBNPbCEVn/1xxBFHdAQrPhj9ggsuaH3/gQceCDvvvPO6Z4888shw9dVXt/7vZ555pvVZIZ2+dt1113Dfffe1fqPkqaeeKq1BTQlA/AZIaVvGQAQIECBAgAABAgQIECBAgACBngX8CayeybxAoCcBAUhPXPk8XEUAUvzGx7nnnttCuvfee8Mee+zREez8889f98HmN91007o/eVW8UPzGx49+9KOw0UYbhWXLlq0X/fDDDw/XX39965kXX3wxzJw5s6smFQHH+r6eeOKJsNdee7Ue+eUvf9n2s0y6mijyhwQgkTdIeQQIECBAgAABAgQIECBAgEDWAgKQrNtrcREICEAiaMIwSqgiADnhhBPCV7/61dZyHnzwwbDjjjt2XNrXvva18MlPfrL1/auuuiq8//3vX/fsG97whvDzn/88zJs3Lzz55JPr5fnABz4Q/u7v/q71zJIlS8IWW2zRFefIyEhXzxUP5RyA+BNYXW8DDxIgQIAAAQIECBAgQIAAAQIEShfwJ7BKJzUggXECApCGbogqApCPfvSj4Zvf/GZL9JFHHgmvfvWrO+oWzxXPF1+XXXZZ+PCHP7zu2de85jXh0UcfDdtss01YtGjRejt09NFHt97vNagQgLzM6jdAGnoAWDYBAgQIECBAgAABAgQIECAQhYAAJIo2KCJjAQFIxs1d39KqCEBS+g0QfwJLANLQH33LJkCAAAECBAgQIECAAAECBCIS8CewImqGUrIUEIBk2dbJF1VFAJLSZ4BMJtSUD0G/6WdPhuO/9ePJOHyfAAECBAgQIECAAAECBAgQIECgAgG/AVIBqiEJjBEQgDR0O1QRgFx44YXhxBNPbIlee+214Ygjjuioe9JJJ4ULLrig9f0HHngg7LzzzuuePfLII8PVV1/d+r+feeaZMHv27I7j7LrrruG+++4Lc+fODU899VRp3WxKAHLj/U+EP7n8J6W5GYgAAQIECBAgQIAAAQIECBAgQKB7gf/64d3DIbu8qvsXEnqyKfdrCbWkkaUKQBrZ9hCqCEBuueWWcNBBB7VEzz777FD8Rkinr4MPPjjcfPPNYdq0aWH58uVh+vTp6x49/fTTwxe/+MXW/33XXXeFt771rW2HWbVqVSscef7558N+++0Xbr/99tK62ZQD+vr7nggnfFsAUtrGMRABAgQIECBAgAABAgQIECBAoAeB//rht4RDdvm9Ht5I59Gm3K+l05FmVioAaWbfKwlAnnvuubDllluGFStWhEMOOSTceOONbXWL7xe/sfHss8+GvffeO9x5553jniuCkSIgKb7OOeeccOqpp7Yd5+677269X3x9/vOfD2eddVZp3WzKAf33P/3/w4nf+ZfS3AxEgAABAgQIECBAgAABAgQIECDQvcBXP/SWcOgbBSDdi3mSQG8CApDevLJ5uorfAClwDj300FbwUfxmx2OPPRYWLFgwweyKK64IRx11VOufn3feeeGUU04Z90wRkGy11Vbht7/9bdhpp51afyJrZGRkwjjHH398uOiii1r//J577gl77rlnaf1pSgBy8wNPhuMu8xkgpW0cAxEgQIAAAQIECBAgQIAAAQIEehD45jF7hLfvOK+HN9J5tCn3a+l0pJmVCkCa2fe+fgPkkksuCccee2xL7IwzzghnnnnmBL2xfwbrPe95T7jmmmvC1KlT1z23ZMmSsPvuu4dFixa1/nzVo48+GubMmTNhnLF/BqtdSFL8aaziz14VfwZr//33D7fddlupnWzKAX3rvz0Vjr343lLtDEaAAAECBAgQIECAAAECBAgQINCdwCXH7hkOeP1W3T2c2FNNuV9LrC2NK1cA0pCW33HHHeHhhx8eF0Ss/c2LffbZJ3zsYx8bJ3HMMcdMkOkmACleKn67o/gtj+LrwAMPDCeffHKYP39+uP/++8OXvvSl8Mgjj7S+V/z2xnHHHde2A8Wf09pjjz3CL37xi9b3i+c++MEPhlmzZoVbb7219eeuli1b1vq/iz+htdtuu5XayaYc0I8sXhau+vG/h6/d9nJPfBEgQIAAgbIFpk8dCStXj5Y9rPEINEZg841mhN88vyKa9W44Y2rYdvMNw/988rloalJIZ4HJzuApIyG8NBrCtCkjofil++K83mD6lPDiypdag249e1Z4fsWqsHT5ynGTFM/Mnz0rPLr4+XH/fMa0KWHW9KnhhRWrw7SpI2HV6tGwYvXLYxVfm2wwLby4cvVA/14o6txk5rSwwfSpYfmK1WHZ71ZVugWKNa1Y9b/XMNlkrfWvXD3ZY119f+0fQhhdz79Gi96tKppY8tdGM6aG51d0v47YzqqSOSYdrujV+vo06QAeGJrA2DOv7iIOecOrwh/tuSC8acHssOXGM+uevpb5mnK/VgumSfoWEID0TZfWi0Wgcemll3Zd9Gibf3N3G4C88MIL4cgjjww33HBD2/mmTJkSvvCFL7T9DZKxLxSBTfEntR566KG242y66abh8ssvD4cffnjX6+r2QQf0y1Lbn3b9OLLPvvN14cSDXtsto+cIECBAgAABAgQIECBAgECtAq/837HF5AvPOazWGkxGgMDLAu7X7IQYBAQgMXShhhrqDEDWLufb3/52KEKTn/70p2Hp0qVh3rx5Yd999w2f+tSn1n14+WRLf/7558Pf/M3fhCuvvLL1GyzF54Nss802rWDkpJNOCtttt91kQ/T1fQf0y2wCkL62j5cIECBAgAABAgQIECBAYEgCApAhwZuWQBsB92u2RQwCApAYuqCG6AQc0AKQ6DalgggQIECAAAECBAgQIEBgUgEByKREHiBQm4D7tdqoTbQeAQGI7UFAQt1xD/gNED8eBAgQIECAAAECBAgQIJCSgAAkpW6pNXcBAUjuHU5jfQKQNPqkypoFHNAvgwtAat54piNAgAABAgQIECBAgACBgQQEIAPxeZlAqQLu10rlNFifAgKQPuG8lreAA7p9APKn73pd+NTbfQh63rvf6ggQIECAAAECBAgQIJCugAAk3d6pPD8B92v59TTFFQlAUuyamisXcEALQCrfZCYgQIAAAQIECBAgQIAAgdIFBCClkxqQQN8C7tf6pvNiiQICkBIxDZWPgANaAJLPbrYSAgQIECBAgAABAgQINEdAANKcXltp/ALu1+LvURMqFIA0ocvW2LOAA1oA0vOm8QIBAgQIECBAgAABAgQIDF1AADL0FiiAwDoB92s2QwwCApAYuqCG6AQc0AKQ6DalgggQIECAAAECBAgQIEBgUgEByKREHiBQm4D7tdqoTbQeAQGI7UGgjYADWgDiB4MAAQIECBAgQIAAAQIE0hMQgKTXMxXnK+B+Ld/eprQyAUhK3VJrbQIOaAFIbZvNRAQIECBAgAABAgQIECBQmoAApDRKAxEYWMD92sCEBihBQABSAqIh8hNwQLcPQE45+PXhhAN/P7+GWxEBAgQIECBAgAABAgQIZCEgAMmijRaRiYD7tUwamfgyBCCJN1D51Qg4oAUg1ewsoxIgQIAAAQIECBAgQIBAlQICkCp1jU2gNwH3a715eboaAQFINa5GTVzAAS0ASXwLK58AAQIECBAgQIAAAQKNFBCANLLtFh2pgPu1SBvTsLIEIA1ruOV2J+CAFoB0t1M8RYAAAQIECBAgQIAAAQIxCQhAYuqGWpou4H6t6TsgjvULQOLogyoiE3BAC0Ai25LKIUCAAAECBAgQIECAAIEuBAQgXSB5hEBNAu7XaoI2zXoFBCA2CIE2Ag5oAYgfDAIECBAgQIAAAQIECBBIT0AAkl7PVJyvgPu1fHub0soEICl1S621CTigBSC1bTYTESBAgAABAgQIECBAgEBpAgKQ0igNRGBgAfdrAxMaoAQBAUgJiIbIT8ABLQDJb1dbEQECBAgQIECAAAECBPIXEIDk32MrTEfA/Vo6vcq5UgFIzt21tr4FHNACkL43jxcJECBAgAABAgQIECBAYGgCApCh0ZuYwAQB92s2RQwCApAYuqCG6AQc0O0DkM8d8vrwyQN+P7p+KYgAAQIECBAgQIAAAQIECBQCAhD7gEA8Au7X4ulFkysRgDS5+9beUcABLQDx40GAAAECBAgQIECAAAEC6QkIQNLrmYrzFXC/lm9vU1qZACSlbqm1NgEHtACkts1mIgIECBAgQIAAAQIECBAoTUAAUhqlgQgMLOB+bWBCA5QgIAApAdEQ+Qk4oAUg+e1qKyJAgAABAgQIECBAgED+AgKQ/HtshekIuF9Lp1c5VyoAybm71ta3gANaANL35vEiAQIECBAgQIAAAQIECAxNQAAyNHoTE5gg4H7NpohBQAASQxfUEJ2AA1oAEt2mVBABAgQIECBAgAABAgQITCogAJmUyAMEahNwv1YbtYnWIyAAsT0ItBFwQAtA/GAQIECAAAECBAgQIECAQHoCApD0eqbifAXcr+Xb25RWJgBJqVtqrU3AAd0+ADn1kB3Dnxzwmtr6YCICBAgQIECAAAECBAgQINCLgACkFy3PEqhWwP1atb5G705AANKdk6caJuCAFoA0bMtbLgECBAgQIECAAAECBLIQEIBk0UaLyETA/VomjUx8GQKQxBuo/GoEmnJAL168eL2Ae37lnnHf/9S+C8JH9ppfDbpRCRAgQIAAAQIECBAgQIDAgAKv/N+xxXD3fnavAUf1OoFqBebOnVvtBEMavSn3a0PiNW2XAgKQLqE81iyBphzQIyMj623sdqdeN+77z9x2cXj2R1c3azNYLQECBAgQIECAAAECBAgkI/DK/x1bFP74uYcnU79CmykwOjqa5cKbcr+WZfMyWpQAJKNmWkp5Ak05oAUg5e0ZIxEgQIAAAQIECBAgQIDA8AXmf+xrYfoW26wr5MVF94dff+fzwy9MBQTWIyAAsT0IVCcgAKnO1sgJCwhAXm7ehN8AufXi8Ow9fgMk4a2tdAIECBAgQIAAAQIECGQtMHPBG8K8o84KI1OmhtFVK8MTl302rHzq0azXbHHpCwhA0u+hFcQrIACJtzcqG6KAAEQAMsTtZ2oCBAgQIECAAAECBAgQGEBgxqteG2ZuvVN4cdF9YeXihQOM5FUC9QgIQOpxNkszBQQgzey7VU8i0JQApNcPQT9x323C0Xv9nv1DgAABAgQIECBAgAABAgQIECBQkoAPQS8J0jAE2ggIQGwLAm0xAMh/AAAgAElEQVQEmhKATNb87U+7ftwjp/3hjuH4/V8z2Wu+T4AAAQIECBAgQIAAAQIECBAg0HAB92sN3wCRLF8AEkkjlBGXgAP65X68MgD5/B/uGD4hAIlrs6qGAAECBAgQIECAAAECBAgQIBChgPu1CJvSwJIEIA1suiVPLuCAbh+A+A2QyfeOJwgQIECAAAECBAgQIECAAAECBEJwv2YXxCAgAImhC2qITsABLQCJblMqiAABAgQIECBAgAABAgQIECCQkID7tYSalXGpApCMm2tp/Qs4oNsHIP4EVv97ypsECBAgQIAAAQIECBAgQIAAgSYJuF9rUrfjXasAJN7eqGyIAg5oAcgQt5+pCRAgQIAAAQIECBAgQIAAAQLJC7hfS76FWSxAAJJFGy2ibAEHtACk7D1lPAIECBAgQIAAAQIECBAgQIBAkwTcrzWp2/GuVQASb29UNkQBB7QAZIjbz9QECBAgQIAAAQIECBAgQIAAgeQF3K8l38IsFiAAyaKNFlG2gAO6fQDyZ4fuGI7b7zVlcxuPAAECBAgQIECAAAECBAgQIEAgMwH3a5k1NNHlCEASbZyyqxVwQAtAqt1hRidAgAABAgQIECBAgAABAgQI5C3gfi3v/qayOgFIKp1SZ60CDmgBSK0bzmQECBAgQIAAAQIECBAgQIAAgcwE3K9l1tBElyMASbRxyq5WwAEtAKl2hxmdAAECBAgQIECAAAECBAgQIJC3gPu1vPubyuoEIKl0Sp21CjigBSC1bjiTESBAgAABAgQIECBAgAABAgQyE3C/lllDE12OACTRxim7WgEHdPsA5M8P3Sl8fL9XV4tvdAIECBAgQIAAAQIECBAgQIAAgeQF3K8l38IsFiAAyaKNFlG2gAO6fQBy7vvfGD6w57ZlcxuPAAECBAgQIECAAAECBAgQIEAgMwH3a5k1NNHlCEASbZyyqxVwQL/s+x8uuTfc8j+fav2/N5wxNfzkC+8MG0yfWi2+0QkQIECAAAECBAgQIECAAAECBJIXcL+WfAuzWIAAJIs2WkTZAg7ol0V//eyL4S+vfzAsXb4ifPqg14Y9t9+8bGrjESBAgAABAgQIECBAgAABAgQIZCjgfi3Dpia4JAFIgk1TcvUCDujqjc1AgAABAgQIECBAgAABAgQIECCQr4D7tXx7m9LKBCApdUuttQk4oGujNhEBAgQIECBAgAABAgQIECBAgECGAu7XMmxqgksSgCTYNCVXL+CArt7YDAQIECBAgAABAgQIECBAgAABAvkKuF/Lt7cprUwAklK31FqbgAO6NmoTESBAgAABAgQIECBAgAABAgQIZCjgfi3Dpia4JAFIgk1TcvUCDujqjc1AgAABAgQIECBAgAABAgQIECCQr4D7tXx7m9LKBCApdUuttQk4oGujNhEBAgQIECBAgAABAgQIECBAgECGAu7XMmxqgksSgCTYNCVXL+CArt7YDAQIECBAgAABAgQIECBAgAABAvkKuF/Lt7cprUwAklK31FqbgAO6NmoTESBAgAABAgQIECBAgAABAgQIZCjgfi3Dpia4JAFIgk1TcvUCDujqjc1AgAABAgQIECBAgAABAgQIECCQr4D7tXx7m9LKBCApdUuttQk4oGujNhEBAgQIECBAgAABAgQIECBAgECGAu7XMmxqgksSgCTYNCVXL+CArt7YDAQIECBAgAABAgQIECBAgAABAvkKuF/Lt7cprUwAklK31FqbgAO6NmoTESBAgAABAgQIECBAgAABAgQIZCjgfi3Dpia4JAFIgk1TcvUCDujqjc1AgAABAgQIECBAgAABAgQIECCQr4D7tXx7m9LKBCApdUuttQk4oGujNhEBAgQIECBAgAABAgQIECBAgECGAu7XMmxqgksSgCTYNCVXL+CArt7YDAQIECBAgAABAgQIECBAgAABAvkKuF/Lt7cprUwAklK31FqbgAO6NmoTESBAgAABAgQIECBAgAABAgQIZCjgfi3Dpia4JAFIgk1TcvUCDujqjc1AgAABAgQIECBAgAABAgQIECCQr4D7tXx7m9LKBCApdUuttQk4oGujNhEBAgQIECBAgAABAgQIECBAgECGAu7XMmxqgksSgCTYNCVXL+CArt7YDAQIECBAgAABAgQIECBAgAABAvkKuF/Lt7cprUwAklK31FqbgAO6NmoTESBAgAABAgQIECBAgAABAgQIZCjgfi3Dpia4JAFIgk1TcvUCDujqjc1AgAABAgQIECBAgAABAgQIECCQr4D7tXx7m9LKBCApdUuttQk4oGujNhEBAgQIECBAgAABAgQIECBAgECGAu7XMmxqgksSgCTYNCVXL+CArt7YDAQIECBAgAABAgQIECBAgAABAvkKuF/Lt7cprUwAklK31FqbgAO6NmoTESBAgAABAgQIECBAgAABAgQIZCjgfi3Dpia4JAFIgk1TcvUCDujqjc1AgAABAgQIECBAgAABAgQIECCQr4D7tXx7m9LKBCApdUuttQk4oGujNhEBAgQIECBAgAABAgQIECBAgECGAu7XMmxqgksSgCTYNCVXL+CArt7YDAQIECBAgAABAgQIECBAgAABAvkKuF/Lt7cprUwAklK31FqbgAO6NmoTESBA4H+1d+dht0114MAX4SJTuDJVriRzhsyEeHAzZ46ox5gxKSKSyFhmj4yPKYSkZOpJJD3iUjKTeeZGKEN18Xu++/c77++9977n3ndfe7/vOnt/1j/c96yzzlqfddY+56zvXmsRIECAAAECBAgQIECAAIEGCphfa2Cn9mCTBEB6sNNUuX4BF+j6jb0CAQIECBAgQIAAAQIECBAgQIBAcwXMrzW3b3upZQIgvdRb6jpkAi7QQ0bthQgQIECAAAECBAgQIECAAAECBBooYH6tgZ3ag00SAOnBTlPl+gXacoEeO3Zs/ZhegQABAgQIECBAgAABAgQIECBAoKvAyJEjG6nTlvm1RnZegxolANKgztSU6gTacoGeaqqpqkNTEgECBAgQIECAAAECBAgQIECAQGmBDz74oPRzeuEJbZlf64W+aHMdBUDa3Pva3lWgLRdoARCDgAABAgQIECBAgAABAgQIECAwvAICIMPr79WbLSAA0uz+1bopFBAAmUI4TyNAgAABAgQIECBAgAABAgQIECglIABSiktmAqUEBEBKccncFgEBkLb0tHYSIECAAAECBAgQIECAAAECBIZXQABkeP29erMFBECa3b9aN4UCbQmAOAR9Ct8gnkaAAAECBAgQIECAAAECBAgQqEjAIegVQSqGwAACAiDeFgQGEGhLAETnEyBAgAABAgQIECBAgAABAgQIEKhDwPxaHarKLCsgAFJWTP5WCLhAt6KbNZIAAQIECBAgQIAAAQIECBAgQKAmAfNrNcEqtpSAAEgpLpnbIuAC3Zae1k4CBAgQIECAAAECBAgQIECAAIE6BMyv1aGqzLICAiBlxeRvhYALdCu6WSMJECBAgAABAgQIECBAgAABAgRqEjC/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wHiundgLECBAoDYBAZDaaBVMgAABAgQIECBAgAABAgQIECBAgAABAgQIDJeAAMhwyXtdAgQIECBAgAABAgQIECBAgAABAgQIECBAoDYBAZDaaBVMgAABAgQIECBAgAABAgQIECBAgAABAgQIDJeAAMhwyXtdAgQIECBAgAABAgQIECBAgAABAgQIECBAoDYBAZDaaBVMgAABAgQIECBAgAABAgQIECBAgAABAgQIDJeAAMhwyXtdAgQIECBAgAABAgQIECBAgAABAgQIECBAoDYBAZDaaBVMgAABAgQIECBAgAABAgQIECBAgAABAgQIDJeAAMhwyXtdAgQIECBAgAABAgQIECBAgAABAgQIECBAoDYBAZDaaBVMgAABAgQIECBAgAABAgQIECBAgAABAgQIDJeAAMhwyXtdAgQIECBAgAABAgQIECBAgAABAgQIECBAoDYBAZDaaBVMIE+Bp59+Op1yyinp2muvTc8++2waMWJE+vSnP5222mqrtOeee6YZZ5wxz4qrFYHMBe6666503XXXpdtuuy09+OCDaezYsWnaaadN8847b1p11VXTTjvtlFZbbbVBt+L6669PZ511VhozZkxR1siRI9Pyyy+fdt111zR69OhBlTNu3Lh0zjnnpJ/97Gfp4YcfTv/+97+L+qyzzjppn332SYsvvvigyvnHP/5RXDeuvvrq9NRTTxXPWWCBBdKmm26a9t133zTHHHMMqhyZCPS6wIEHHpiOO+64vmbcfPPNac0115xks4zlXu919W+awDPPPJPOPffc4rtwfC/+17/+VXzGxufaWmutVXwnXmKJJbo225hu2jtCe3pR4L///W+68MIL0xVXXJHuvffe9NprrxXfu+ebb760yiqrpF122aX47+SS8Tw5IY8TIECgGQICIM3oR60gMCiBa665Jm2//fbpzTffHDD/wgsvXPwYXGihhQZVnkwECPxfgS984Qvpj3/842Q5dthhh3T22Wen6aabrmve999/vwhyxORMt7TzzjunM888M0099dRd80TQ4ktf+lIRQBkoRfDztNNOS1HWpNIdd9xRBDpeeumlAbPNM888RWBkhRVWmGz7ZSDQywL33HNPEYSMwGInTSoAYiz3cm+re1MFTj311HTQQQelt956q2sTI7B/0kknTfS4Md3Ud4V29ZpABC432GCD9MADD0yy6nvvvXc6+eST01RTTWU891onqy8BAgQqFhAAqRhUcQRyFfjrX/9a3IX+zjvvpJlmmqn48Rd3ucW/L7vssmJSNlIEQeJO9plnnjnXpqgXgewEImj4+OOPF6srttxyy7T66qunT37yk+m9995Lt99+e/rJT36Snn/++aLe2267bbrkkku6tiHG5jHHHFM8vswyy6QDDjigWKUV5ced5zGWI0W+o446asBy4nXjrvRYjRLpy1/+cnEn3Oyzz54ioHHkkUemV155pQig/OY3v+m6oiRWiS233HLFCpRpppkmfetb30obbrhhUWY874QTTigmg+eaa6509913p/nnnz+7vlEhAlUIxMTnSiutVAQU4/0e4yfSpAIgxnIV8sogUJ1AfPYdeuihfd9343MxgpqzzjprevXVV4vP11/+8pdpxRVXLD7fJkzGdHV9oSQCUyrwv//9r/h+3Al+LLXUUsX3089+9rPFaq747hvfuztBzqOPPjp997vfNZ6nFNzzCBAg0BABAZCGdKRmEJicQOcO9ZjEvPXWW9PKK6883lOOP/74YqI10mGHHZZ+8IMfTK5IjxMg8P8EIigQqzs233zz9JGPfGQil1iNEQHIRx99tHjsD3/4Q7FqZMIUj8e2VBFU+PznP1+M1RlmmKEv29tvv53WWGONIkgZY/mhhx4acMXWeeedV2y5FWmPPfZIp59++ngv9dhjjxWBjVgNFsGbKCfKmzBFmy666KLiz5dffnkR3Omf4m9bb7118acdd9wxnX/++d4TBBopEHeD77fffmmRRRZJm222WYoJlUjdAiDGciPfBhrVwwI33XRTsf1jpPhsi+0hY7ucgVJsrTPhSk1juoc7X9UbJXDllVf2fR+N37OxAnvC795xU048FsGS2Wabre9Gng6E8dyot4TGECBAYFACAiCDYpKJQG8L3HnnncXdbJF222239NOf/nSiBsXdrbHfcUyExhfFuLu12w/D3tZQewLDIxArJjbaaKPixWNJfpypMWGKYMUZZ5xR/DlWjsQd5xOmP//5z30BzIGCG5F/scUWK8ZyrPiIVRwDne0Tq0zibtZIAwU3Ysur2Ec5rg3rrbdeuuGGGwaEW3/99dONN95YrCaJVS5zzz338AB7VQI1CcR5ARGYjDN0brnlliLocfjhhxev1i0AYizX1BmKJTAFAvE5FsHLv//97+lzn/tc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FHAGSJ79olbNF3jyySeLFRUvvPBC8QMttr2KQ8e7JecGNP89oYX5C8Sqj1j9EXeX/upXv5roztFoweQCIMZy/v2shu0R+M9//jPeVpBxFl5sFTlQiu/MM888c7GSMT6/Y4I1kjHdnveLluYvECszI6gR6fzzz0877rjjRJWOMbzuuuumm2++uVgJHau+4rPdeM6/f9WQAAECdQkIgNQlq1wCGQnEIcivvvpq8cXvnnvu6Vqz/vskb7nllunyyy/PqBWqQqB3BCLoESs/nnjiieLus/iBtsMOO0yyATEps9FGGxV5TjzxxOJAx24pHu/czRZ3rHbOA4n8cdZI7IkcKc4uWHrppbuWEwGZOEgy6hhnd/S/0z22Drj77rvTrLPOml5//fVJ1j3yvPnmm8UBs52D3nunt9SUwP8X2G233dJZZ51V3En6ox/9aECaK6+8su8cn9heY7HFFivyxfiNMWQse0cRyEsgtp3sbJMTW1wttdRSXSsY54O89NJLxRZZERCNZEzn1Z9q016BOOsjfte+9tprxaHnjzzySFeMOAy9s7VrfKeO787Gc3vfO1pOgAABARDvAQItEOjszx8TMzGROc000wzY6ttvvz2tssoqxWOx1/Hhhx/eAh1NJFCtQGy3EYcnx9Y5kU477bS05557TvZFIlgSZ+9EiknYuOO0W+pM0sbj8bxRo0b1ZT3vvPPSTjvtVPz70ksvTdtss03XcmKC59FHHy3OCXr66afHyxcBm4suuqj424svvpjmnnvuAcuJx+add97isXjOBRdcMNm2ykAgV4Gvfe1rU/wejlVfCyywQDEmjeVce1i92iiw1lprpVtuuaVoetwJvswyy3Rl6ARLFl988XT//fcX+YzpNr5rtDlHgQhORpAy0tZbb50uu+yyrtXsvwvC+uuvn66//nrjOcdOVScCBAgMkYAAyBBBexkCwylw8MEHp6OPPrqoQv9DHSes0zHHHJMOOuig4s9xVkEsHZYIEBi8wBtvvFEcXh4TLJFiTB144IGDKiDuapt//vmLLbMWWWSR9NBDD3V93qKLLlrcmTrffPOlZ599tljB0UkR0IjARqTdd989nXHGGQOW0/9H5LbbbpsuueSS8fLFXfARaIkUPzDjh+ZAKR6L50c688wz06677jqo9spEIEeBKgIgxnKOPatObRY47LDDijMBIsUKrs03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CBAgQIAAAQIECOQgIACSQy+oAwECBAgQIECAAAECBAgQIECAAAECBAgQIFCpgABIpZwKI0CAAAECBAgQIECAAAECBAgQIECAAAECBHIQEADJoRfUgQABAgQIECBAgAABAgQIECBAgAABAgQIEKhUQACkUk6FESBAgAABAgQIECBAgAABAgQIECBAgAABAjkICIDk0AvqQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFQqIABSKafCCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRwEBEBy6AV1IECAAAECBAgQIECAAAECBAgQIECAAAECBCoVEACplFNhBAgQIECAAAECBAgQIECAAAECBAgQIECAQA4CAiA59II6ECBAgAABAgQIECBAgAABAgQIECBAgAABApUKCIBUyqkwAgQIECBAgAABAgQIECBAgAABAgQIECBAIAcBAZAcekEdCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUoFBEAq5VQYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkIOAAEgOvaAOBAgQIECAAAECBAgQIECAAAECBAgQIECAQKUCAiCVciqMAAECBAgQIECAAAECBAgQIECAAAECBAgQyEFAACSHXlAHAgQIECBAgAABAgQIECBAgAABAgQIECBAoFIBAZBKORVGgAABAgQIECBAgAABAgQIECBAgAABAgQI5CAgAJJDL6gDAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUKmAAEilnAojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEchAQAMmhF9SBAAECBAgQIECAAAECBAgQIECAAAECBAgQqFRAAKRSToURIECAAAECBAgQIECAAAECBAgQIECAAAECOQgIgOTQC+pAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCogAFIpp8IIECBAgAABAgQIECBAgAABAgQIECBAgACBHAQEQHLoBXUgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEKhUQAKmUU2EECBAgQIAAAQIECBAgQIAAAQIECBAgQIBADgICIDn0gjoQIECAAAECBAgQIECAAAECBAgQIECAAAEClQoIgFTKqTACBAgQIECAAAECBAgQIECAAAECBAgQIEAgBwEBkBx6QR0IECBAgAABAgQIECBAgAABAgQIECBAgACBSgUEQCrlVBgBAgQIECBAgAABAgQIECBAgAABAgQIECCQg4AASA69oA4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIBApQICIJVyKowAAQIECBAgQIAAAQIECBAgQIAAAQIECBDIQUAAJIdeUAcCBAgQIECAAAECBAgQIECAAAECBAgQIECgUgEBkEo5FUaAAAECBAgQIECAAAECBAgQIECAAAECBAjkICAAkkMvqAMBAgQIECBAgAABAgQIECBAgAABAgQIECBQqYAASKWcCiNAgAABAgQIECBAgAABAgQIECBAgAABAgRyEBAAyaEX1IEAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoVEAApFJOhREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI5CAiA5NAL6kCAAAECBAgQIECAAAECBAgQIECAAAECBAhUKiAAUimnwggQIECAAAECBAgQIECAAAECBAgQIECAAIEcBARAcugFdSBAgAABAgQIECBAgAABAgQIECBAgAABAgQqFRAAqZRTYQQIECBAgAABAgQIECBAgAABAgQIECBAgEAOAgIgOfSCOhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVCgiAVMqpMAIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAHAQGQHHpBHQgQIECAAAECBAgQIECAAAECBAgQIECAAIFKBQRAKuVUGAECBAgQIECAAAECBAgQIECAAAECBAgQIJCDgABIDr2gDgQIECBAgAABAgQIECBAgAABAgQIECBAgEClAgIglXIqjAABAgQIECBAgAABAgQIECBAgAABAgQIEMhBQAAkh15QBwIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBSAQGQSjkVRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECOQgIACSQy+oAwECBAgQIECAAAECBAgQIECAAAECBAgQIFCpgABIpZwKI0CAAAECBAgQIECAAAECBAgQIECAAAECBHIQEADJoRfUgQABAgQIECBAgAABAgQIECBAgAABAgQIEKhUQACkUk6FESBAgAABAgQIECBAgAABAgQIECBAgAABAjkICIDk0AvqQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFQqIABSKafCCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRwEBEBy6AV1IECAAAECBAgQIECAAAECBAgQIECAAAECBCoVEACplFNhBAgQIECAAAECBAgQIECAAAECBAgQIECAQA4CAiA59II6ECBAgAABAgQIECBAgAABAgQIECBAgAABApUKCIBUyqkwAgQIECBAgAABAgQIECBAgAABAgQIECBAIAcBAZAcekEdCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUoFBEAq5VQYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkIOAAEgOvaAOBAgQIECAAAECBAgQIECAAAECBAgQIECAQKUCAiCVciqMAAECBAgQIECAAAECBAgQIECAAAECBAgQyEFAACSHXlAHAgQIECBAgAABAgQIECBAgAABAgQIECBAoFIBAZBKORVGgAABAgQIECBAgAABAgQIECBAgAABAgQI5CAgAJJDL6gDAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUKmAAEilnAojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEchAQAMmhF9SBAAECBAgQIECAAAECBAgQIECAAAECBAgQqFRAAKRSToURIECAAAECBAgQIECAAAECBAgQIECAAAECOQgIgOTQC+pAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCogAFIpp8IIECBAgAABAgQIECBAgAABAgQIECBAgACBHAQEQHLoBXUgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEKhUQAKmUU2EECBAgQIAAAQIECBAgQIAAAQIECBAgQIBADgICIDn0gjoQIECAAAECBAgQIECAAAECBAgQIECAAAEClQoIgFTKqTACBAgQIECAAAECBAgQIECAAAECBAgQIEAgBwEBkBx6QR0IECBAgAABAgQIECBAgAABAgQIECBAgACBSgUEQCrlVBgBAgQIECBAgAABAgQIECBAgAABAgQIECCQg4AASA69oA4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIBApQICIJVyKowAAQIECBAgQIAAAQIECBAgQIAAAQIECBDIQUAAJIdeUAcCBAgQIECAAAECBAgQIECAAAECBAgQIECgUgEBkEo5FUaAAAECBAgQIECAAAECBAgQIECAAAECBAjkICAAkkMvqAMBAgQIECBAgAABAgQIECBAgAABAgQIECBQqYAASKWcCiNAgAABAgQIECBAgAABAgQIECBAgAABAgRyEBAAyaEX1IEAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoVEAApFJOhREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI5CAiA5NAL6kCAAAECBAgQIECAAAECBAgQIECAAAECBAhUKiAAUimnwggQIECAAAECBAgQIECAAAECBAgQIECAAIEcBARAcugFdSBAgAABAgQIECBAgAABAgQIECBAgAABAgQqFRAAqZRTYQQIECBAgAABAgQIECBAgAABAgQIECBAgEAOAgIgOfSCOhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKVCgiAVMqpMAIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAHAQGQHHpBHQgQIECAAAECBAgQIECAAAECBAgQIECAAIFKBQRAKuVUGAECBAgQIECAAAECBAgQIECAAAECBAgQIJCDgABIDr2gDgQIECBAgAABAgQIECBAgAABAgQIECBAgEClAgIglXIqjAABAgQIECBAgAABAgQIECBAgAABAgQIEMhBQAAkh15QBwIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBSAQGQSjkVRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECOQgIACSQy+oAwECBAgQIECAAAECBAgQIECAAAECBAgQIFCpgABIpZwKI0CAAAECBAgQIECAAAECBAgQIECAAAECBHIQEADJoRfUgQABAgQIECBAgAABAgQIECBAgAABAgQIEKhUQACkUk6FESBAgAABAgQIECBAgAABAgQIECBAgAABAjkICIDk0AvqQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECFQqIABSKafCCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRwEBEBy6AV1IECAAAECBAgQIECAAAECBAgQIECAAAECBCoVEACplFNhBAgQIECAAAECBAgQIECAAAECBAgQIECAQA4CAiA59II6ECBAgAABAgQIECBAgAABAgQIECBAgAABApUKCIBUyqkwAgQIECBAgAABAgQIECBAgAABAgQIECBAIAcBAZAcekEdCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUoFBEAq5VQYAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkIOAAEgOvaAOBAgQIECAAAECBAgQIECAAAECBAgQIECAQKUCAiCVciqMAAECBAgQIECAAAECBAgQIECAAAECBAgQyEFAACSHXlAHAgQIECBAgAABAgQIECBAgAABAgQIECBAoFIBAZBKORVGgAABAgQIECBAgAABAgQIECBAgAABAgQI5CAgAJJDL6gDAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUKmAAEilnAojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEchAQAMmhF9SBAAECBAgQIECAAAECBAgQIECAAAECBAgQqFRAAKRSToURIECAAAECBAgQIECAAAECBAgQIECAAAECOQgIgOTQC+pAgAABAgQIECBAgAABAgQIECBAgAABAgQIVCogAFIpp8IIECBAgAABAgQIECBAgAABAgQIECBAgACBHAQEQHLoBXUgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEKhUQAKmUU2EECBAgQIAAAQIECBAgQIAAAQIECBAgQIBADgICIDn0gjoQIECAAAECBAgQIECAAAECBAgQIECAAAEClQr8H5RZ2MA27zeOAAAAAElFTkSuQmCC\" width=\"800\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "\n", - "ecephys_pd_trim = ecephys_pd[np.logical_and(ecephys_pd > ecephys_vs[0], ecephys_pd < ecephys_vs[-1])]\n", - "ecephys_pd_trim_diff = np.diff(ecephys_pd_trim)\n", - "ecephys_pd_trim_diff_med = np.median(ecephys_pd_trim_diff)\n", - "\n", - "plt.plot(ecephys_pd_trim[1:], ecephys_pd_trim_diff)\n", - "\n", - "for ii in range(-2, 20):\n", - " ax.hlines([ecephys_pd_trim_diff_med + frame_dur_exp * ii], xmin=ecephys_pd_trim[1]-20, xmax=ecephys_pd_trim[-1]+20)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Two things jump out:\n", - "- the vsync falling edge times are noisy. There are numerous intervals that are not close to 1/60 seconds.\n", - "- vsync intervals may approach the dropped frame threshold, with no dropped frame visible in the photodiode intervals.\n", - "- there are short photodiode intervals. This does not fit with our understanding of dropped frames, where a dropped frame simply delays the presentation of (all future) stimulus frames.\n", - "\n", - "The latter issue is particularly odd. The sync square is updated or not on each frame according to [this function](http://aibspi/braintv/camstim/blob/0.2.9/camstim/synchro.py#L103), which chooses whether to update the color based on simple modular arithmetic. What could be going on?\n", - "\n", - "One possibility is that the call to `draw()` operates asynchronously. If the updated sync square is still being drawn when the window is flipped, we would expect the underlying stimulus to show through, which could result in a long photodiode interval immediately followed by a short one. This could explain the cases we see in this session.\n", - "\n", - "However, other sessions might be more complicated:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "messy_ecephys_sync_path = Path(\n", - " \"/allen/programs/braintv/production/neuralcoding/prod56/specimen_718643567/\"\n", - " \"ecephys_session_737581020/737581020_404568_20180816.sync\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "messy_sync = Dataset(messy_ecephys_sync_path)\n", - "messy_pd = messy_sync.get_edges(keys=[\"photodiode\"], kind=\"all\", units=\"seconds\")\n", - "messy_vs = messy_sync.get_edges(keys=[\"frames\"], kind=\"falling\", units=\"seconds\")" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkAAAAZACAYAAAAhDI6nAAAgAElEQVR4XuzdDcxmVXkv/D12EBQUIwyUD3GwOYipWCwCJ2Jbm/p1Ao20lRLeRMDUV8+JbWk1RlptwMScYFrJkUZbTZNCrI3S1sNJ4QCTtqatVmHAvCmtaRMNg2ikDHjwI7x+zDAn930qh5m5P56977322te1f09CGpm911rX71qsPFn/3nNvO3DgwIHGDwECBAgQIECAAAECBAgQIECAAAECBAgQIEAgkcA2AUiibiqFAAECBAgQIECAAAECBAgQIECAAAECBAgQmAsIQGwEAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQOwBAgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACRdSxVEgAABAgQIECBAgAABAgQIECBAgAABAgQICEDsAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAkXUsVRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECAhA7AECBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAJF1LFUSAAAECBAgQIECAAAECBAgQIECAAAECBAgIQCayBx5++OHm7rvvnv+ze/fu+T+PPvrovPorrriiufHGG3uR+OY3v9nceuutzV/91V81X/jCF5o9e/Y0jz/+ePOc5zynefGLX9xcdNFFza/8yq/M//dWfh555JHmhhtuaG655Zb5WLOfnTt3NhdffHFz1VVXNccdd9xWhvEMAQIECBAgQIAAAQIECBAgQIAAAQIECExMQAAykYZv27ZtaaV9BSC333578wu/8AvN9773vZWqP/qjP9r86Z/+afOzP/uzK5+766675kHHQw89tPC5k046aR6MnHfeeRPpojIJECBAgAABAgQIECBAgAABAgQIECBAYKsCApCtSgV/7qkByGmnndaceeaZza5du+ZV9RWA/Mmf/Enzxje+sXna057WvPrVr25e97rXNT/xEz8x/7THV7/61ebjH/9488lPfnI+5zOf+czms5/9bHP22WcvlH3wwQebc845p9m7d2+zffv25u1vf/v80yOzn9knTK6//vpm3759zQknnNDce++9zamnnhq8Q5ZPgAABAgQIECBAgAABAgQIECBAgAABAn0KCED61BzxWNdcc01z7rnnzv858cQT53+d1Omnn95rADILNz796U83v/3bv93MQpZFP7//+7/f/Pqv//r8j2afAPmbv/mbhc9dfvnlzcc+9rH5n918883NJZdcctBzs3936aWX9rr+EbfP0ggQIECAAAECBAgQIECAAAECBAgQIECgpYAApCVYlsdLBCBbtZmFMPfcc8/8kyL/9m//1hx//PEHvTr7K69OOeWU5oknnmhe+9rXNnfcccfCoWefMLnzzjvn43zta19rZn+1lh8CBAgQIECAAAECBAgQIECAAAECBAgQIDATEIBMdB/UDEDe+c53Nr/3e783l599KfssEHnqz0c/+tHmrW996/xffeITn3jykx6Htmr2Z5dddtn8X3/kIx9p3vKWt0y0m8omQIAAAQIECBAgQIAAAQIECBAgQIAAgUMFBCAT3RM1A5DZX4E1+6uwZj+z7+/4yZ/8yYO68NS//urrX//60k92zP7s5JNPnr87e+emm26aaDeVTYAAAQIECBAgQIAAAQIECBAgQIAAAQICEHtgLlAzAJl9Mfo//uM/NkcccUTzyCOPNM9+9rMP6srLXvayeTBy7LHHNo899tjKjs2e+da3vjX/FMns0yR+CBAgQIAAAQIECBAgQIAAAQIECBAgQIDATMAnQCa6D2oFILfddltz0UUXzdVn//cv//IvD+vA7Ls8Zt8N8uM//uPNP/3TP63s0Itf/OLmn//5n+efEpl9ImSrP1/96ldXPvrd7363+Zd/+Zf5F8bv2LGj2b59+1aH9hwBAgQIECBAgAABAgQIECBAgACByQvs27ev2bt379zhrLPOao466qjJmwAYXkAAMrz5KGasEYB84xvfmP91Vw888EDzIz/yI83u3bubl770pYd5HH300c3jjz/enH/++c3nP//5lV6zZ2af/DjmmGOab3/721u23bZt25af9SABAgQIECBAgAABAgQIECBAgAABAt0FFn0PcPfRvElg6wICkK1bpXpy6ABk//7980983HHHHXPHa665prn22msXms7CkSeeeKL5qZ/6qebv/u7vVrr/9E//dPP3f//380Bllipv9UcAslUpzxEgQIAAAQIECBAgQIAAAQIECBDYTEAAspmft7sLCEC624V+c+gA5K1vfWvz0Y9+dG42C0JuueWWeWix6GeIT4Cs+yuwHnzwweblL3/5fHmzA/qkk04K3W+LJ5Bd4D/+178+rMTP//bPZS9bfQQIECBAgMASgUN/N3ju0Uc0//Oqn+ZFgEACgVf+7qeb7/7giYMq8bt/gsYqIaXA7K+rP++88+a13X///c3OnTtT1qmocQsIQMbdn2KrGzIA+a3f+q3muuuum9cy+1THnXfe2TzjGc9YWtsQ3wGyDnYWkDzv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/wLu1/o3NWJ7AQFIezNvTEDAAT2BJisxlYAAJFU7FUOAAAECBDYWEIBsTGgAAqMVEICMtjUWRuAwAfdrNsUYBAQgY+iCNYxOwAE9upZYEIGVAgIQG4QAAQIECBB4qoAAxH4gkFdAAJK3tyrLJ+B+LV9PI1YkAInYNWsuLuCALk5sAgK9CghAeuU0GAECBAgQCC8gAAnfQgUQWCogALE5CMQRcL8Wp1eZVyoAydzdp9T28MMPN3fffff8n927d8//efTRR+dPXHHFFc2NN97Yi8S+ffua++6778l5ZvN98YtfbPbv3z8f//7772927ty55bkeeeSR5oYbbmhuueWWZs+ePfP3Zu9ffPHFzVVXXdUcd9xxWx6rzYMO6DZaniVQX0AAUr8HVkCAAAECBMYkIAAZUzeshUC/AgKQfj2NRqCkgPu1krrG3qqAAGSrUsGf27Zt29IK+gxA3vve9zbXXnvt0rnaBCB33XXXPOh46KGHFo530kknzYOR8847r/fuOKB7JzUggaICApCivAYnQIAAAQLhBAQg4VpmwQS2LCAA2TKVBwlUF3C/Vr0FFtA0jQBkItvgqQHIaaed1px55pnNrl275tX3GYDMwo9ZCDL7Oeqoo5qzzz672bt3b/PlL395/u+2GoA8+OCDzTnnnDN/d/v27c3b3/725qKLLpqPceuttzbXX399M/u0yQknnNDce++9zamnntprJx3QvXIajEBxAQFIcWITECBAgACBUAICkFDtslgCrQQEIK24PEygqoD7tar8Jv93AQHIRLbCNddc05x77rnzf0488cT5Xyd1+umnz6vvMwC5884752PPPpVx1llnzcOLK6+8srnppptaBSCXX35587GPfWz+zs0339xccsklB3Vq9u8uvfTS3tf/w0kc0BP5D0OZaQQEIGlaqRACBAgQINCLgACkF0aDEBilgABklG2xKAILBdyv2RhjEBCAjKELFdZQKgBZVMr/Zu9OwKyq7nzv/2tilkEoQKBAhkRERfNS5RBFJaQDERPNhW6wM6hvFL0aordtoxBbc9/caOHUHUO08aYjXqNyOyomEUSTdkgcENp0C6KJMhQgosxQUExF1fvsTVPhnDpVZ+9z1tp7Dd96njy3Y+291n99/uss6+5fzjlxA5DgI68GDhwoTU1NMmHCBFm8eHFOoYkTJ0oQuJSWlsrGjRul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cOBAOf300+Ub3/iGdOiQ/heXN954IznH73//e9Hzbd++Xfr16yfHHXdcco4DDjigWZKzzjpLfv7zn5fEpufaZ599SjrW5SA2aBctjkWg8gIEIJXvAStAAAEEEECgmgQIQPy7QQDib2d9JAGI9Q5THwLhBbi/Ft6UGd0FCEDczXI74sEHH5Tx48fLmjVritYwePDgJBgZNGiQd4233367XHDBBbJly5aic9TW1soNN9wg559//m7PQQDizc9ABKIVIACJtvUUjgACCCCAQFEBAhD/C4MAxN/O+kgCEOsdpj4EwgsQgIQ3ZUZ3AQIQd7Ncjpg7d64cfvjhsnHjRunUqZNMmjRJRo0alfx55syZ8pOf/CSpS0OQ559/Xjp37uxcp87zpS99KRnXtWtXmThxoowePTp5l4me//rrr5fXXntNWrVqlZxT33VS7KshANF3jfzud79rdh1DhgyRtm3bOq+1pQFs0C0J8X0EqkuAAKS6+sFqEEAAAQQQqLQAAYh/BwhA/O2sj+QZINY7TH0IhBfg/lp4U2Z0FyAAcTfL5YijjjpKZs2aJW3atJEnnnhCDjvssII6fvjDH8qll16a/N1VV10lU6ZMcapzw4YNsu+++8ry5cuTgGX27NnyiU98omAOfefJEUccIQsWLJDevXsnYYge2/irIQAZMGCALF682GkdoQ5mgw4lyTwIZCNAAJKNM2dBAAEEEEAgLwIEIP6dIgDxt7M+kgDEeoepD4HwAtxfC2/KjO4CBCDuZrkbMWfOHBkxYkSy7nPPPVemT5/epAZ9TocGFosWLZJu3bolQYbLOyseeOABOe2005J5r7jiCrnmmmuKOj322GPJs0D06+abby76UVgEILm7xFgwAhUXIACpeAtYAAIIIIAAAlUlQADi3w4CEH876yMJQKx3mPoQCC9AABLelBndBQhA3M1yN2Ly5Mly7bXXJut+5plndoUhjQuZOnVq8tFY+qUfPTV27NiSa7388svluuuuS45/8sknk4/bKva1devW5OO1Nm3aJEcffbQ8/vjjTQ4jACmZnQMRQODvAgQgXAoIIIAAAggg8FEBAhD/64EAxN/O+shiAciTl42SPffokGnpzb2+M10IJ0MAgRYFCEBaJOKADAQIQDJArvQpGj7+qmPHjrJ69erkY7CKfenHVo0cOTL51pVXXilXX311yUufMGGC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BCBtnO1CoIaAAKSGojX6CghA+gqOUP3ChQvTzjvv3AUTa665ZjryyCPTbrvt1v3vHEacccYZXTc5BLn66qu7JzYGfV122WVpl112SY899lhaccUV04EHHphe/epXp0022STddttt6ayzzko5hMmv1VZbLV133XXpmc985rRtJgOQ7bffPv3v//2/Zz2NbbbZZtDTXObxLtDLJHIAgaESEIAM1TicDAECBAgQWO4CApDyEQhAyu1UthEQgLRxtguBGgLur9VQtEZfAQFIX8ERqs/BxKWXXppWWmmldMkll6Qdd9xxytmfeOKJ6fDDD+/+2THHHJOOPfbYgbvbd999uydI8uu0005L73rXu6at8b73vS996lOf6v55/sitU089ddoxkwHIrrvumi6++OKBz6NvgQt0X0H1BNoKCEDaetuNAAECBAgMu4AApHxCApByO5VtBAQgbZztQqCGgPtrNRSt0VdAANJXcETqr7zyyvTiF7+4O9v88VSnn376tDPPT23kpyluvPHGtO6666a77747rbzyygN1mD/a6r777kvrr79++vnPfz5j7f3339+tn1/bbrttuuaaa6YdJwAZiN3BBMZeQAAy9r8CAAgQIECAwBQBAUj5L4QApNxOZRsBAUgbZ7sQqCEgAKmhaI2+AgKQvoIjUv+hD30ofexjH+vO9oorrlgUhix5+ieccEL30Vj5ddFFF6U99thjoA7zR2vlLzzPH1111VVXLbV2ww037AKSHLj84Ac/mHacAGQgdgcTGHsBAcjY/woAIECAAAECUwQEIOW/EAKQcjuVbQQEIG2c7UKghoAApIaiNfoKCED6Co5I/eTHX62xxhrpl7/8ZfcxWDO9Lr/88rTTTjt1Pzr66KPTcccdN1CH2223Xfre97436xMg+QvY11lnnW7d/fbbL5177rnT9hCADMTuYAJjLyAAGftfAQAECBAgQGCKgACk/BdCAFJup7KNgACkjbNdCNQQEIDUULRGXwEBSF/BEamffOLi+c9/frr22muXetb546vyx1jl1/7775++/OUvD9Rh/iL1d7zjHV3NZz7zmXTwwQdPq//ABz6QPvnJT3b//Fvf+lZ6+ctfPu2YyQBk4403Tptvvnn64Q9/mH71q1+lDTbYIOWQJQcnb3rTmwb+iK65NuMCPVcpxxEYDgEByHDMwVkQIECAAIFhERCAlE9CAFJup7KNgACkjbNdCNQQcH+thqI1+goIQPoKjkB9Dg5WW2217kz32WefdOGFF8561pMfY/WSl7wk5SdCBnn9/ve/T29961vTF77whbTiiit2//+rXvWq9JSnPCXddttt6eyzz07nnXdet+SHP/zh9NGPfnTG5ScDkNn2fs5zntM9PfLsZz97kFPsjs0X4Nled955Z3rRi17UHXL77benpz71qQPvoYAAgXYCApB21nYiQIAAAQKjICAAKZ+SAKTcTmUbAQFIG2e7EKghIACpoWiNvgICkL6CI1B/zz33pI022qg70ze84Q3pnHPOmfWs81MX+QvQl/b9HHNpOQcTxx9/fFq4cOG0w3fbbbeUv5Nkpic/Jg/+b//tv3UByt57753yUyv5S9UffPDB7uO1PvvZz3Zf1J5f+VzzF7w/7WlPm8tpLTpmhRVWmPPxApA5UzmQwHITEIAsN3obEyBAgACBoRQQgJSPRQBSbqeyjYAApI2zXQjUEBCA1FC0Rl8BAUhfwRGozzfwJwOCt7zlLd3TGbO98rG5Zosttkg333zzwB3mcOKII45I3/jGN9Lvfve7afVPfOIT02te85ruY7A23XTTGdfP31Oy7rrrzviz3/72t+ntb397Ouuss7qfv/a1r03/8A//MNB5CkAG4nIwgaEXEIAM/YicIAECBAgQaCogACnnFoCU26lsIyAAaeNsFwI1BAQgNRSt0VdAANJXcATqWz4Bcumll6ZXvvKV6f777+++uyN/xNXuu+/efa/IXXfdlc4///x01FFHpXvvvTdtsskm6Zvf/GbaeuutB1bMwUp+QiV/N0h+5Qvq0sKUmRb3EVgDkysgMNQCApChHo+TI0CAAAECzQUEIOXkApByO5VtBAQgbZztQqCGgACkhqI1+goIQPoKjkB9q+8A+fWvf909NfLTn/40PfnJT+4+/ir/3yVf119/fdp+++27LzXPX2h+9dVXFymeeOKJ6fDDD+9qv/SlL6U//uM/LlpnaQHJZptt1v3IR2BVY7UQgXkTEIDMG62FCRAgQIDASAqUBCDrr7FKuuao3Uey35onfeOdD6S9Trp0ypLnHbJzesFmMz+hX3NvaxGYi4AAZC5KjiEwHAICkOGYw7ifhQBkTH4DNthgg/SLX/yi+z6Na6+9dqld33fffd3TGvm1//77py9/+ctzFvra177W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V2effXY66KCD0qOPPrrUNdZbb710zjnnpN13332px9x8881p7733Tj/+8Y9nPGbttddOX/rSl9K+++5bfK6zFbpAzwurRQnMm4AAZN5oLUyAAAECBEZSQABSPjYBSLmdyjYCApA2znYhUEPA/bUaitboKyAA6Ss4IvULFy5MO++8cxdMrLnmmunII49Mu+22W/e/cxhxxhlndJ3kEOTqq6/untgY9HXZZZelXXbZJT322GNpxRVXTAceeGB69atfnTbZZJN02223pbPOOivlECa/VltttXTdddelZz7zmdO2efDBB9P222+ffvSjH3U/e/vb357e+MY3djXf/va308c+9rH00EMPdU+r5D1f8IIXDHqqyzzeBXqZRA4gMFQCApChGoeTIUCAAAECy11AAFI+AgFIuZ3KNgICkDbOdiFQQ8D9tRqK1ugrIADpKzgi9TmYuPTSS9NKK62ULrnkkrTjjjtOOfMTTzwxHX744d0/O+aYY9Kxxx47cGf5aYz8BEl+nXbaaeld73rXtDXe9773pU996lPdP88fuZU/4mrJ19FHH50+8pGPdP/4E5/4RPrABz4w5ZB//dd/Tbvuumv63e9+1/3fiy++eOBzXVaBC/SyhPycwHAJCECGax7OhgABAgQILG8BAUj5BAQg5XYq2wgIQNo424VADQH312ooWqOvgACkr+AI1F955ZXpxS9+cXem+eOpTj/99GlnnZ/a2GabbdKNN96Y1l133XT33XenlVdeeaDu8kdb3XfffWn99ddPP//5z2esvf/++7v182vbbbdN11xzzZTjfvvb36YNN9ww5eOe/exnd0+J5KdJlnzl7xH57Gc/2/3j3N8OO+ww0Lku62AX6GUJ+TmB4RIQgAzXPJwNAQIECBBY3gICkPIJCEDK7VS2ERCAtHG2C4EaAu6v1VC0Rl8BAUhfwRGo/9CHPtR9bFR+XXHFFYvCkCVP/YQTTug+Giu/LrroorTHHnsM1F3+aK38hef546uuuuqqpdbmgCMHJDlw+cEPfjDluG9+85vpFa94RffP8vkcccQRM66T+5h8iiWf8/HHHz/QuS7rYBfoZQn5OYHhEhCADNc8nA0BAgQIEFjeAgKQ8gkIQMrtVLYREIC0cbYLgRoC7q/VULRGXwEBSF/BEaif/PirNdZYI/3yl7/sPgZrptfll1+edtppp+5H+WOojjvuuIG622677dL3vve9WZ8AyV/Avs4663Tr7rfffuncc8+dssfiH3+Vz+clL3nJjOeQP/4qr/PII4903zvyne98Z6BzXdbBLtDLEvJzAsMlIAAZrnk4GwIECBAgsLwFBCDlExCAlNupbCMgAGnjbBcCNQTcX6uhaI2+AgKQvoIjUD/5xMXzn//8dO211y71jPPHV+WPscqv/fffP335y18eqLv8RerveMc7uprPfOYzKX9M1ZKv/H0en/zkJ7t//K1vfSu9/OUvn3LI6173uvTVr361+2f5fCY/LmumE8n9fP/73+8+Mit/ZFfNlwt0TU1rEZh/AQHI/BvbgQABAgQIjJKAAKR8WgKQcjuVbQQEIG2c7UKghoD7azUUrdFXQADSV3DI63/1q1+l1VZbrTvLffbZJ1144YWznvHkx1jlJy/yExiDvH7/+9+nt771rekLX/hC970d+f9/1atelZ7ylKek2267LZ199tnpvPPO65b88Ic/nD760Y9OWz7v+2//9m8pP63y0EMPzbr94l+6nvtcddVV53y6+QI82+v2229f9DRM/o6R3IMXAQLDK3DUedelb91w15QTvOJDfzS8J+zMCBAgQIAAgXkVeMnx/zJt/ck/Gxxw5hXp5rsfnvbzDdZcJV142B/O63mNwuL/ec9D6U1n/NuUUz3rrTukP3jy2qNw+s5xDARme3+PQftaJDBSAnfeeWd60Yte1J3zf/7nf6anP/3pI3X+TjaGgAAkxhyX2sU999yTNtpoo+7nb3jDG9I555wza8cbb7xx9zTFTN/PMVeq/LFW+Ts5Fi5cOK1kt912S/k7SZZ88mPywK233jrdcMMNKZ/Hz372s1m3zP1MPqWSv1Mkf/n6XF8rrLDCXA91HAECBAgQIECAAAECBAgQIECAAAECPQTyXzDeYYcdeqyglECZgACkzG1kqvKTDE972tO6833LW97SPZ0x2ysfm2u22GKLdPPNNw/c54033th9cfk3vvGNlL+nY8nXE5/4xPSa17ym+xisTTfddNrP877/8R//kTbbbLPuqZHZXn/yJ3/SPVWSX/mcn/rUp875fAUgc6ZyIAECBAgQIECAAAECBAgQIECAAIFeAgKQXnyKewgIQHrgjUJpyydALr300vTKV74y3X///WnzzTfvPuJq9913775X5K677krnn39+Ouqoo9K9996bNtlkk/TNb34z5Sc+Fn+1egJkWR+BlT9S66abbuqeRMnfMbK0L44fhd+BJc9x8ccPfbzXKE7QOROYKuA97TeCQBwB7+c4s9QJAe9nvwMEYgl4T8eap27aCeS/HJ3vTebXc5/73JT/YrQXgdYCApDW4o33a/UdIL/+9a+7p0Z++tOfpic/+cndx1/l/7vk6/rrr0/bb799yue13XbbpauvvnrKIa2+A6TxGIZqO19ANVTjcDIEegt4T/cmtACBoRHwfh6aUTgRAr0FvJ97E1qAwFAJeE8P1TicDAECBAYSEIAMxDWaB2+wwQbpF7/4RXr+85+frr322qU2cd9993VPa+TX/vvvv+j7NebS9de+9rXuo63y66/+6q+67/lY2uvtb397OvPMM7sf5/PJ5zX5et3rXpe++tWvdv8zn8+666671HVy3fe///3uCY38vSVecxPwB7e5OTmKwKgIeE+PyqScJ4FlC3g/L9vIEQRGRcD7eVQm5TwJzE3Ae3puTo4iQIDAMAoIQIZxKpXPaZdddkn546nWWGON9Mtf/nKpH+d0+eWXp5122qnb/eijj07HHXfcnM/khBNOSEceeWR3fP7+jz333HOptaeffnp65zvf2f08fyl7/jLzyVfe9yMf+Uj3P/P55CdCZnrlR+hyOPLwww+n3N93vvOdOZ/ruB/oD27j/hug/2gC3tPRJqqfcRbwfh7n6es9moD3c7SJ6mfcBbynx/03QP8ECIyygABklKc3x3PPT2N87GMf646+4oor0otf/OIZKxcPMS666KK0xx57zHGH1H2p+Qc+8IHu+AsuuCDtu+++S6095ZRT0mGHHdb9/Nxzz0377bffomPz94K84hWv6P53Pp/8heozvXIfO+64Y/ejHLwcf/zxcz7XcT/QH9zG/TdA/9EEvKejTVQ/4yzg/TzO09d7NAHv52gT1c+4C3hPj/tvgP4JEBhlAQHIKE9vjueev+h6MvQ46KCDUn4CY8nXY489lrbZZpt04403dk9W5I+UWnnllee4Q+o+tip/fFV+HX744enjH//4UmsX/5ira665Jm277baLjv3Nb36TNtpoo+6L1J/97Gen/J0hK6ywwrS1Dj744PTZz362++e5vx122GHO5zruB/qD27j/Bug/moD3dLSJ6mecBbyfx3n6eo8m4P0cbaL6GXcB7+lx/w3QPwECoywgABnl6Q1w7pMfg7XSSiulSy65ZNHTE5NLnHjiiV1wkV/HHHNMOvbYY6esfvHFF6fddtut+2cHHnhg+vznPz/l5/mjtTbddNP0yCOPpLXWWitddtll6bnPfe60M8wfj5WfDsmBSz7+tttuSyuuuOKU4xb/GKxPfOITi54smTwofzRW7id/DNauu+6a8rl5zV3AH9zmbuVIAqMg4D09ClNyjgTmJuD9PDcnRxEYBQHv51GYknMkMHcB7+m5WzmSAAECwyYgABm2iczT+SxcuDDtvPPO6dFHH01rrrlm9yXlOdDI/zt/D8fnPve5buetttoqXX311V2IsfhrWQFIPjZ/d0cOL/Ir7/Hud7877b777ulJT3pSuuuuu1L+ovQzzjijCy7y6+yzz04HHHDAtI4ffPDBtP3226cf/ehH3c/e8Y53pDe+8Y1ptdVWS9/+9re7j7t66KGHuv/9r//6r+kFL3jBPKnFXNYf3GLOVVfjK+A9Pb6z13k8Ae/neDPV0fgKeD+P7+x1HlPAezrmXHVFgMB4CAhAxmPOXZf5uzly4PDAAw/M2HUOPxYsWJC23HLLaT+fSwDy+OOPp/e+973ppJNOSvn/X9orf7RWDjHe//73L/WYm2++Oe29997pxz/+8VLknaYAACAASURBVIzHrL322ulLX/rSrN81MkajHahVf3AbiMvBBIZewHt66EfkBAnMWcD7ec5UDiQw9ALez0M/IidIYCAB7+mBuBxMgACBoRIQgAzVOOb/ZG699dYuoMhBR/4X+CqrrNIFHvvvv3869NBD0+qrrz7jScwlAJkszN/rceaZZ6bvfve7Ke+XPxYrPxGS98kfWZW/hySHLct6Pfzww+m0005LX/nKV1IORPL3g2y22WZdMPKe97wnbb755staws8JECBAgAABAgQIECBAgAABAgQIECBAYEwFBCBjOnhtEyBAgAABAgQIECBAgAABAgQIECBAgACByAICkMjT1RsBAgQIECBAgAABAgQIECBAgAABAgQIEBhTAQHImA5e2wQIECBAgAABAgQIECBAgAABAgQIECBAILKAACTydPVGgAABAgQIECBAgAABAgQIECBAgAABAgTGVEAAMqaD1zYBAgQIECBAgAABAgQIECBAgAABAgQIEIgsIACJPF29ESBAgAABAgQIECBAgAABAgQIECBAgACBMRUQgIzp4LVNgAABAgQIECBAgAABAgQIECBAgAABAgQiCwhAIk9XbwQIECBAgAABAgQIECBAgAABAgQIECBAYEwFBCBjOnhtEyBAgAABAgQIECBAgAABAgQIECBAgACByAICkMjT1RuBJQRuvfXWdPLJJ6cFCxak22+/Pa266qppiy22SK9//evTIYccklZffXVmBAgUCFx99dXp61//evrud7+bbrjhhnTPPfeklVdeOW2yySZp5513Tv/jf/yP9NKXvnTOK3/jG99In/vc59JVV13VrbXhhhumHXbYIb3jHe9Ie+2115zW+d3vfpfOPPPM9KUvfSnddNNN6aGHHurO5+Uvf3k67LDD0tZbbz2ndX7+8593143zzjsv3XLLLV3N05/+9PSa17wmvec970nrr7/+nNZxEIEIAkcccUT6xCc+saiVb3/72+llL3vZrK15P0eYvB4iCdx2223pf/2v/9X9eTj/2fjBBx/s/j2b/9222267dX8u3mabbZbasvd0pN8GvYyqwG9+85v0hS98IX3lK19J3//+99O9997b/dl70003TTvttFN6+9vf3v3fZb28n5cl5OcECBCIISAAiTFHXRBYpsAFF1yQDjjggPTAAw/MeOxWW23V/Yfglltuucy1HECAwP8vsMsuu6RLL710mSR/8id/ks4444y0yiqrLPXYxx57rAs58o2Zpb3e9ra3pc9+9rNpxRVXXOoxObTYe++9uwBlplcOP0899dSU15rt9W//9m9d0PGzn/1sxsOe8pSndMHIi170omX27wACoy5w7bXXdkFkDhcnX7MFIN7Poz5x5x9R4JRTTklHHnlkevjhh5faXg73P/3pT0/7ufd0xN8IPY2iQA4u99lnn3T99dfPevrvfve700knnZRWWGEF7+dRHLRzJkCAQEUBAUhFTEsRGFaBhQsXdn8L/dFHH01rrrlm9x9++W+45f99zjnndDdl8yuHIPlvsq+11lrD2orzIjB0Ajk0/MlPftI9XbH//vunP/zDP0xPe9rT0u9///t0+eWXp7/+679OP/3pT7vzftOb3pT+z//5P0vtIb83TzjhhO7nL3zhC9Phhx/ePaWV189/6zy/l/MrH3f88cfPuE7eN/+N9Pw0Sn799//+37u/BbfeeuulHGh89KMfTXfffXcXoFx44YVLfaIkPyW23XbbdU+grLTSSum9731v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fGH3F4dyiJm/q+uyyy7r/jJQ/ss92267bfr617+eNt54Y+/niL8IeiJAgMAAAgKQAbAcSmDUBPIN0I022qg77fwZ/vnz+md75T8c5i9Azzc0f/CDH4xau86XwFAK5P8Iy09m5Fd+CuSrX/3qtPM88cQTuydD8usb3/hGyl8uvrRX/vnkUx/5s43f9773LTo0B535P/Ty69FHH01PfOITl7rOEUcckT7xiU90P/9/27vzUMvHPw7g32SdjF1ZYyYKI1n+sGcZYYpB9p2sWZIUDSMx1hTGkiwjWwhNJGu2pilNgxCJMJax1giF1Ix+vb91bvfOnDtz+T0znnPu6/nL3PM9z/18X8/5Ovec9/d5nsVDmcwGyYfK7BmUvYOW1nJMwp0EqPmwqRHoB4EEHvvss097V2nuJM37YqctKwBxPffDK8A59IvA4BnOeU/MzUHZAyvXad5L87O5c+c2eU/svN8dccQRzcyZMwcIXNP98mpwHv0kkJt38jf2jBkz2n09Brd8pp0yZUo7q2vMmDFDHnM999OrwLkQIEBg5AICkJFbOZJAzwlkg+Ss75928sknNw8//PBSzyHH5jmZVvzZZ5/13PkqmEBtApmWf8ABBzQLFy5sw8gEi51QcnCt06ZNa/feSXvttdea/ffff9hTef3115uJEye2j+d5U6dOHTg2P8/jaYsWLWpWWmmlYfvJ78vz0/Jl71577TVwbL70zd2ye++9dzNr1qylsnb2Gcpzcp4agV4XyJIZWTYyX65kE9VOUNg5r2UFIK7nXn8FqL+fBObPn99svvnmA6eUL0PffffdIbMe82BuGsjskPfff789NmFIAv7Oe6336H56VTiXXhfI+3Tei++///52xnO3luVcr7zyymby5MlDHvYe3eujr34CBAj8OwEByL9z8ywCPSFgBkhPDJMi+1Qgy0IlQMjdp7nD9OWXX24SFnRr7kbr0xeB0+pJgU7AkZsCsm/A4P1xckLLCkBczz057IruU4HsF5D98DotmydPnz6969lm6atDDjmkfeziiy9ubrnllva/XdN9+uJwWj0pkOWaJ02a1N68k5tvMhP69NNPb8aPH9/O8JozZ05zzTXXNLNnz26Xrsxs6c7eea7nnhxyRRMgQKCIgACkCKNOCNQpYA+QOsdFVf0vMG/evHZGxXfffdd+OMuyV9l0fLhmz4D+f004w94QyKyPzP7I3aXPPvvsEneO5iyWFYC4nntjrFU5OgT++uuvIctBZj+8LBfZreXv5rFjx7azGfMeni9Y01zTo+O14ix7QyAzMxNqpD344IPNqaeeukThuYYPPPDA5o033mhnQ2fWV97bXc+9McaqJECAwPIQEIAsD1V9EqhIIJsgL1iwoP2j77333hu2ssFrJB999NHNk08+WdFZKIVA7wgk9MjMjy+++KK98ywfzk455ZSlnkC+kDn00EPbY2699dZ2M8fhWh7v3MmWu1U7+4Hk+Ow1kvWQ07JvwY477jhsPwlksolkaszeHYPvcs+yAe+8806z9tprN7/88stSa88xv/32W7u5bGej994ZLZUSGCpwzjnnNPfee297J+l1113Xlefpp58e2Msny2tst9127XG5hnMduZ69qgjUJZClJzvL5GSJqx122GHYArM/yA8//NAukZVANM01Xdd4qmb0CmSvj3y2/fnnn9tNzz/55JNhMbIZemd51/xdnb+fXc+j97XjzAkQICAA8Rog0OcCnfX586VMvshceeWVu57xW2+91eyxxx7tY1nn+Oqrr+5zGadHoLxAltrIxslZNiftzjvvbM4///xl/qKEJdl7Jy1fwOZu0+Fa5wvaPJ7njRs3buDQBx54oDnjjDPafz/++OPNcccdN2w/+XLn008/bfcJ+uqrr4Ycl8DmkUceaX/2/fffNxtttFHXfvLYJpts0j6W5zz00EPLPFcHEKhZ4LTTTvvXr+PM/Npyyy3b69L1XPMoq220Cey3337Nm2++2Z527gTfaaedhiXohCUTJkxoPvzww/Y41/Roe8U431oFEk4mpEw79thjmyeeeGLYUgevhHDwwQc3L774ouu51oFVFwECBFaAgABkBSD7FQT+S4HLL7+8ueGGG9oSBm/ouHhNN954YzNlypT2x9mrINOGNQIERi7w66+/tpuX58uVtFxTl1122Yg6yB1tm222Wbtk1jbbbNN8/PHHwz5v2223be9K3XTTTZtvvvmmncHRaQk0EmyknXvuuc3dd9/dtZ/BHyCPP/745rHHHhtyXO6AT9CSlg+X+ZDZreWxPD/tnnvuac4+++wRna+DCNQqUCIAcT3XOrrqGq0CV111VbsnQFpmcB155JFdKTKbcZ111mlyDefv4Pw9nOaaHq2vHOddm8DgPX1yHed6Hq5ldvNaa63VPpy9fZ577jnXc20Dqh4CBAisQAEByArE9qsI/BcCWZJm1113bX/1cHeW//33383222/ffumaD34//fRTs8oqq/wX5fqdBHpS4I8//mi/LMl0+7Qrrriiufbaa//RuZx33nkDgUVmZO22225LPD8h5u67797+PMffddddSxyT5XhyLa+33nptQDJmzJgljhkceGa5uyx7N7glIEnAkv83HHTQQc1LL73U9VxyR12+IMr6yt9+++2wM0X+EYSDCVQusKw9QDrXZyeAdD1XPqDK63uBDz74YGD9/xNPPLF59NFHu55zZjEmBE2bNm1aM3Xq1IHjvEf3/cvECfaAQP4uXXfdddulVzMDOTOYh1vdYPDSdRdeeGFz++23u557YIyVSIAAgeUlIABZXrL6JVCRQGcZrPyBOGvWrIEvUDsl3nzzzc2ll17a/jN3yeXLHY0AgZEJZLPkrP3/yiuvtE+46KKLmttuu21kTx50VGZvJLxYtGhRkz04cq2uscYaA0f8+eefTa7lt99+u/2wl2W2tt566yV+z+BlsLL8VpbhGtw+//zzZuedd24/PG611VZtWNLtw+PgZbCeeuqp5qijjhrST352zDHHtD/LBpTZ60QjMBoERhKAuJ5HwyvBOfaSQPbLyhI4Cezzfj1x4sQh5Sf4z15W8+fPb1ZdddV22avcCNBpruleGm219rPACSec0C7zmpb343x2Xbxlb8vs/9FZknbx1Q1cz/38CnFuBAgQ6C4gAPHKIDAKBLIZ8p577tnkC9Q111yzybJYWQ85/84SNlnuJi2byeXL1bFjx44CFadIoIxApuDPnDmz7SxLYCX8GLws1eK/JV+s5Frr1rIMXWZnpGWN8iyhlb0EElrcdNNN7cbmaTnu+uuv79pHApTsQ9KZjZL6zjrrrPaOucwIy12tmeWVL4Fyd9ykSZO69pPZI7vssku7cWwCkksuuaRdQiAtz8tm6wsXLmw23HDDdtmvLOGlERgNAiMJQDrXqet5NLwinGMvCOQLz8yIzn54q6++epNNkROK5EaDvDdmudiEH2l5v+3cGDT43LxH98JIq7HfBbIMbP4+zezrtNyElBtxxo8f32Tfj8yWzt/iX3/9dft4ws5XX311CRbXc7+/UpwfAQIEhgoIQLwiCIwSgax7etJJJ7V3fXdr+UL2+eefb+8I1wgQGLnA0sKObr1sscUWzZdfftn1F2Rqf8KKzOIYrmWT84SWCTCGa1kjOV/szJ07t+shq622Wjsz5Mwzz1zqic6ZM6c5/PDDm9wZ261lc/RnnnlmYJm9kas5kkDvCow0AHE99+4Yq7w/BWbPnt3OZvzxxx+7nmDez7OEZW4U6NZc0/35unBWvSeQQCN70OXv3aW13JiUfUJyE9DizfXce+OuYgIECPw/AgKQ/0fPcwn0mEDWSZ0+fXobdHSm+CfwyPr/F1xwQde9AnrsFJVLYIULlAxAOsW/8MILbciRACMf7jbYYIN2aY7s4zPcjI3FTzyzM+677752g/Msc/X777+36yXnTrgs0zVhwoQRWeX35/8bCTo6wc24ceOaww47rL2Ddv311x9RPw4i0C8CIw1AXM/9MuLOo58EFixY0Nxxxx3te9q8efOaLGO58cYbN/vuu2+TfQIy+3JZzXv0soQ8TmD5C+RanjFjRru03UcffdTO7sqM5dyck7+Zs1TW5MmTlzorO1W6npf/WPkNBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiP34qBAAACXVJREFUAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoKCECKcuqMAAECBAgQIECAAAECBAgQIECAAAECBAgQqEFAAFLDKKiBAAECBAgQIECAAAECBAgQIECAAAECBAgQKCogACnKqTMCBAgQIECAAAECBAgQIECAAAECBAgQIECgBgEBSA2joAYCBAgQIECAAAECBAgQIECAAAECBAgQIECgqIAApCinzggQIECAAAECBAgQIECAAAECBAgQIECAAIEaBAQgNYyCGggQIECAAAECBAgQIECAAAECBAgQIECAAIGiAgKQopw6I0CAAAECBAgQIECAAAECBAgQIECAAAECBGoQEIDUMApqIECAAAECBAgQIECAAAECBAgQIECAAAECBIoK/A8KtAC6RIvj3AAAAABJRU5ErkJggg==\" width=\"800\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%matplotlib notebook\n", - "\n", - "fig, ax = plt.subplots(figsize=(8, 8))\n", - "\n", - "messy_pd_trim = messy_pd[np.logical_and(messy_pd > messy_vs[0], messy_pd < messy_vs[-1])]\n", - "messy_pd_trim_diff = np.diff(messy_pd_trim)\n", - "messy_pd_trim_diff_med = np.median(messy_pd_trim_diff)\n", - "\n", - "plt.plot(messy_pd_trim[1:], messy_pd_trim_diff)\n", - "\n", - "for ii in range(-10, 11):\n", - " ax.hlines(\n", - " [messy_pd_trim_diff_med + frame_dur_exp * ii], \n", - " xmin=messy_pd_trim[1] - 20, \n", - " xmax=messy_pd_trim[-1] + 20\n", - " )\n", - "\n", - "plt.ylim([0.8, 1.2])\n", - " \n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This session shows:\n", - "- long -> short intervals\n", - "- long -> normal ... -> short\n", - "- apparently isolated long and short intervals\n", - "- intervals of extreme length\n", - "\n", - "We don't have a good explanation for these." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Collection phases\n", - "\n", - "Ecephys sessions were collected under multiple sync-relevant conditions:\n", - "- in early sessions (and maybe some later ones?) experimenters might have run other software on the rig. This causes noisy vsyncs.\n", - "- up till 2019, the rigs were running antivirus softare. Data acquired after that has less noisy (but still not clean compared to ophys) vsync intervals.\n", - "\n", - "We do not know whether the short photodiode intervals occur evenly across these conditions." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py37", - "language": "python", - "name": "py37" - }, - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py b/allensdk/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py deleted file mode 100644 index a22d9d02fe..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py +++ /dev/null @@ -1,437 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Fri Dec 16 15:11:23 2016 - -@author: Xiaoxuan Jia -""" - -import ast -import re -import logging - -import numpy as np -import pandas as pd - -import warnings - -from . import stimulus_parameter_extraction as spe - - -def create_stim_table( - stimuli, - stimulus_tabler, - spontaneous_activity_tabler, - sort_key="Start", - block_key="stimulus_block", - index_key="stimulus_index", -): - """ Build a full stimulus table - - Parameters - ---------- - stimuli : list of dict - Each element is a stimulus dictionary, as provided by the stim.pkl file. - stimulus_tabler : function - A function which takes a single stimulus dictionary as its argument and returns a stimulus table dataframe. - spontaneous_activity_tabler : function - A function which takes a list of stimulus tables as arguments and returns a list of 0 or more tables - describing spontaneous activity sweeps. - sort_key : str, optional - Sort the final stimulus table in ascending order by this key. Defaults to 'Start'. - - Returns - ------- - stim_table_full : pandas.DataFrame - Each row is a sweep. Has columns describing (in frames) the start and end times of each sweep. Other columns - describe the values of stimulus parameters on those sweeps. - - """ - - stimulus_tables = [] - max_index = 0 - - for ii, stimulus in enumerate(stimuli): - current_tables = stimulus_tabler(stimulus) - for table in current_tables: - table[index_key] = ii - - stimulus_tables.extend(current_tables) - - stimulus_tables = sorted(stimulus_tables, key=lambda df: min(df[sort_key].values)) - for ii, stim_table in enumerate(stimulus_tables): - stim_table[block_key] = ii - - stimulus_tables.extend(spontaneous_activity_tabler(stimulus_tables)) - - stim_table_full = pd.concat(stimulus_tables, ignore_index=True, sort=False) - stim_table_full.sort_values(by=[sort_key], inplace=True) - stim_table_full.reset_index(drop=True, inplace=True) - - return stim_table_full - - -def make_spontaneous_activity_tables( - stimulus_tables, start_key="Start", end_key="End", duration_threshold=0.0 -): - """ Fills in frame gaps in a set of stimulus tables. Suitable for use as the spontaneous_activity_tabler in - create_stim_table. - - Parameters - ---------- - stimulus_tables : list of pd.DataFrame - Input tables - should have start_key and end_key columns. - start_key : str, optional - Column name for the start of a sweep. Defaults to 'Start'. - end_key : str, optional - Column name for the end of a sweep. Defaults to 'End'. - duration_threshold : numeric or None - If not None (default is 0), remove spontaneous activity sweeps whose duration is - less than this threshold. - - Returns - ------- - list : - Either empty, or contains a single pd.DataFrame. The rows of the dataframe are spontenous activity sweeps. - - """ - - nstimuli = len(stimulus_tables) - if nstimuli == 0: - return [] - - spon_start = np.zeros(nstimuli + 1, dtype=int) - spon_end = np.zeros(nstimuli, dtype=int) - - for ii, table in enumerate(stimulus_tables): - spon_start[ii + 1] = table[end_key].values[-1] - spon_end[ii] = table[start_key].values[0] - - spon_start = spon_start[:-1] - spon_sweeps = pd.DataFrame({start_key: spon_start, end_key: spon_end}) - - if duration_threshold is not None: - spon_sweeps = spon_sweeps[ - np.fabs(spon_sweeps[start_key] - spon_sweeps[end_key]) > duration_threshold - ] - spon_sweeps.reset_index(drop=True, inplace=True) - - return [spon_sweeps] - - -def apply_frame_times( - stimulus_table, - frame_times, - frames_per_second=None, - extra_frame_time=False, - map_columns=("Start", "End"), -): - """ Converts sweep times from frames to seconds. - - Parameters - ---------- - stimulus_table : pd.DataFrame - Rows are sweeps. Columns are stimulus parameters as well as start and end frames for each sweep. - frame_times : numpy.ndarrray - Gives the time in seconds at which each frame (indices) began. - frames_per_second : numeric, optional - If provided, and extra_frame_time is True, will be used to calculcate the extra_frame_time. - extra_frame_time : float, optional - If provided, an additional frame time will be appended. The time will be incremented by extra_frame_time from - the previous last frame time, to denote the time at which the last frame ended. If False, no extra time will be - appended. If None (default), the increment will be 1.0/fps. - map_columns : tuple of str, optional - Which columns to replace with times. Defaults to 'Start' and 'End - - Returns - ------- - stimulus_table : pd.DataFrame - As above, but with map_columns values converted to seconds from frames. - - """ - - stimulus_table = stimulus_table.copy() - - if extra_frame_time is True and frames_per_second is not None: - extra_frame_time = 1.0 / frames_per_second - if extra_frame_time is not False: - frame_times = np.append(frame_times, frame_times[-1] + extra_frame_time) - - for column in map_columns: - stimulus_table[column] = frame_times[ - np.around(stimulus_table[column]).astype(int) - ] - - return stimulus_table - - -def apply_display_sequence( - sweep_frames_table, - frame_display_sequence, - start_key="Start", - end_key="End", - diff_key="dif", - block_key="stimulus_block", -): - """ Adjust raw sweep frames for a stimulus based on the display sequence - for that stimulus. - - Parameters - ---------- - sweep_frames_table : pd.DataFrame - Each row is a sweep. Has two columns, 'start' and 'end', - which describe (in frames) when that sweep began and ended. - frame_display_sequence : np.ndarray - 2D array. Rows are display intervals. The 0th column is the start frame of - that interval, the 1st the end frame. - - Returns - ------- - sweep_frames_table : pd.DataFrame - As above, but start and end frames have been adjusted based on the display sequence. - - Notes - ----- - The frame values in the raw sweep_frames_table are given in 0-indexed offsets from the - start of display for this stimulus. This domain only takes into account frames which are part - of a display interval for that stimulus, so the frame ids need to be adjusted to lie on the global - frame sequence. - - """ - - sweep_frames_table = sweep_frames_table.copy() - if not block_key in sweep_frames_table.columns.values: - sweep_frames_table[block_key] = np.zeros( - (sweep_frames_table.shape[0]), dtype=int - ) - - sweep_frames_table[diff_key] = ( - sweep_frames_table[end_key] - sweep_frames_table[start_key] - ) - - sweep_frames_table[start_key] += frame_display_sequence[0, 0] - for seg in range(len(frame_display_sequence) - 1): - match_inds = sweep_frames_table[start_key] >= frame_display_sequence[seg, 1] - - sweep_frames_table.loc[match_inds, start_key] += ( - frame_display_sequence[seg + 1, 0] - frame_display_sequence[seg, 1] - ) - sweep_frames_table.loc[match_inds, block_key] = seg + 1 - - sweep_frames_table[end_key] = ( - sweep_frames_table[start_key] + sweep_frames_table[diff_key] - ) - sweep_frames_table = sweep_frames_table[ - sweep_frames_table[end_key] <= frame_display_sequence[-1, 1] - ] - sweep_frames_table = sweep_frames_table[ - sweep_frames_table[start_key] <= frame_display_sequence[-1, 1] - ] - - sweep_frames_table.drop(diff_key, inplace=True, axis=1) - return sweep_frames_table - - -def read_stimulus_name_from_path(stimulus): - """Obtains a human-readable stimulus name by looking at the filename of the 'stim_path' item. - - Parameters - ---------- - stimulus : dict - must contain a 'stim_path' item. - - Returns - ------- - str : - name of stimulus - - """ - - return stimulus["stim_path"].split("\\")[-1].split(".")[0] - - -def build_stimuluswise_table( - stimulus, - seconds_to_frames, - start_key="Start", - end_key="End", - name_key="stimulus_name", - block_key="stimulus_block", - get_stimulus_name=None, - extract_const_params_from_repr=False, - drop_const_params=spe.DROP_PARAMS, -): - """ Construct a table of sweeps, including their times on the experiment-global clock - and the values of each relevant parameter. - - Parameters - ---------- - stimulus : dict - Describes presentation of a stimulus on a particular experiment. Has a number of fields, - of which we are using: - stim_path : str - windows file path to the stimulus data - sweep_frames : list of lists - rows are sweeps, columns are start and end frames of that sweep - (in the stimulus-specific frame domain). C-order. - sweep_order : list of int - indices are frames, values are the sweep on that frame - display_sequence : list of list - rows are intervals in which the stimulus was displayed. Columns are start - and end times (s, global) of the display. C-order. - dimnames : list of str - Names of parameters for this stimulus (such as "Contrast") - sweep_table : list of tuple - Each element is a tuple of parameter values (1 per dimname) describing - a single sweep. - seconds_to_frames : function - Converts experiment seconds to frames - start_key : str, optional - key to use for start frame indices. Defaults to 'Start' - end_key : str, optional - key to use for end frame indices. Defaults to 'End' - name_key : str, optional - key to use for stimulus name annotations. Defaults to 'stimulus_name' - block_key : str, optional - key to use for the 0-index position of this stimulus block - get_stimulus_name : function | dict -> str, optional - extracts stimulus name from the stimulus dictionary. Default is read_stimulus_name_from_path - - Returns - ------- - list of pandas.DataFrame : - Each table corresponds to an entry in the display sequence. - Rows are sweeps, columns are stimulus parameter values as well as "Start" and "End". - - """ - - if get_stimulus_name is None: - get_stimulus_name = read_stimulus_name_from_path - - frame_display_sequence = seconds_to_frames(stimulus["display_sequence"]) - - sweep_frames_table = pd.DataFrame( - stimulus["sweep_frames"], columns=(start_key, end_key) - ) - sweep_frames_table[block_key] = np.zeros([sweep_frames_table.shape[0]], dtype=int) - sweep_frames_table = apply_display_sequence( - sweep_frames_table, frame_display_sequence, block_key=block_key - ) - - stim_table = pd.DataFrame( - { - start_key: sweep_frames_table[start_key], - end_key: sweep_frames_table[end_key] + 1, - name_key: get_stimulus_name(stimulus), - block_key: sweep_frames_table[block_key], - } - ) - - sweep_order = stimulus["sweep_order"][: len(sweep_frames_table)] - dimnames = stimulus["dimnames"] - - if not dimnames or "ReplaceImage" in dimnames: - stim_table["Image"] = sweep_order - else: - stim_table["sweep_number"] = sweep_order - sweep_table = pd.DataFrame(stimulus["sweep_table"], columns=dimnames) - sweep_table["sweep_number"] = sweep_table.index - - stim_table = assign_sweep_values(stim_table, sweep_table) - stim_table = split_column( - stim_table, - "Pos", - {"Pos_x": lambda field: field[0], "Pos_y": lambda field: field[1]}, - ) - - if extract_const_params_from_repr: - const_params = spe.parse_stim_repr( - stimulus["stim"], drop_params=drop_const_params - ) - existing_columns = set(stim_table.columns) - for const_param_key, const_param_value in const_params.items(): - - existing_cap = const_param_key.capitalize() in existing_columns - existing_upper = const_param_key.upper() in existing_columns - existing = const_param_key in existing_columns - - if not (existing_cap or existing_upper or existing): - stim_table[const_param_key] = [const_param_value] * stim_table.shape[0] - else: - logging.info( - f"found sweep_param named: {const_param_key}, ignoring const param of the same name (value: {const_param_value})" - ) - - unique_indices = np.unique(stim_table[block_key].values) - output = [stim_table.loc[stim_table[block_key] == ii, :] for ii in unique_indices] - - return output - - -def split_column(table, column, new_columns, drop_old=True): - """ Divides a dataframe column into multiple columns. - - Parameters - ---------- - table : pandas.DataFrame - Columns will be drawn from and assigned to this dataframe. This dataframe will NOT be modified inplace. - column : str - This column will be split. - new_columns : dict, mapping strings to functions - Each key will be the name of a new column, while its value (a function) will be used to build the - new column's values. The functions should map from a single value of the original column to a single value - of the new column. - drop_old : bool, optional - If True, the original column will be dropped from the table. - - Returns - ------- - table : pd.DataFrame - The modified table - - """ - - if not column in table: - return table - table = table.copy() - - for new_column, rule in new_columns.items(): - table[new_column] = table[column].apply(rule) - - if drop_old: - table.drop(column, inplace=True, axis=1) - return table - - -def assign_sweep_values( - stim_table, - sweep_table, - on="sweep_number", - drop=True, - tmp_suffix="_stimtable_todrop", -): - """ Left joins a stimulus table to a sweep table in order to associate epochs in time with stimulus characteristics. - - Parameters - ---------- - stim_table : pd.DataFrame - Each row is a stimulus epoch, with start and end times and a foreign key onto a particular sweep. - sweep_table : pd.DataFrame - Each row is a sweep. Should have columns in common with the stim_table - the resulting table will use values from - the sweep_table. - on : str, optional - Column on which to join. - drop : bool, optional - If True (default), the join column (argument on) will be dropped from the output. - tmp_suffix : str, optional - Will be used to identify overlapping columns. Should not appear in the name of any column in either dataframe. - - """ - - joined_table = stim_table.join(sweep_table, on=on, lsuffix=tmp_suffix) - for dim in joined_table.columns.values: - if tmp_suffix in dim: - joined_table.drop(dim, inplace=True, axis=1) - - if drop: - joined_table.drop(on, inplace=True, axis=1) - return joined_table diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/naming_utilities.py b/allensdk/brain_observatory/ecephys/stimulus_table/naming_utilities.py deleted file mode 100644 index 56f68141f7..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/naming_utilities.py +++ /dev/null @@ -1,188 +0,0 @@ -import re -import warnings -import functools - -import pandas as pd -import numpy as np - - -GABOR_DIAMETER_RE = re.compile(r"gabor_(\d*\.{0,1}\d*)_{0,1}deg(?:_\d+ms){0,1}") -GENERIC_MOVIE_RE = re.compile( - r"natural_movie_(?P<number>\d+|one|two|three|four|five|six|seven|eight|nine)(_shuffled){0,1}(_more_repeats){0,1}" -) -DIGIT_NAMES = { - "1": "one", - "2": "two", - "3": "three", - "4": "four", - "5": "five", - "6": "six", - "7": "seven", - "8": "eight", - "9": "nine", -} -SHUFFLED_MOVIE_RE = re.compile(r"natural_movie_shuffled") -NUMERAL_RE = re.compile(r"(?P<number>\d+)") - - -def drop_empty_columns(table): - """ Remove from the stimulus table columns whose values are all nan - """ - - to_drop = [] - - for colname in table.columns: - if table[colname].isna().all(): - to_drop.append(colname) - - table.drop(columns=to_drop, inplace=True) - return table - - -def collapse_columns(table): - """ merge, where possible, columns that describe the same parameter. This is pretty conservative - it - only matches columns by capitalization and it only overrides nans. - """ - - colnames = set(table.columns) - - matches = [] - for col in table.columns: - for transformed in (col.upper(), col.capitalize()): - if transformed in colnames and col != transformed: - - col_notna = ~(table[col].isna()) - trans_notna = ~(table[transformed].isna()) - if (col_notna & trans_notna).sum() != 0: - continue - - mask = ~(col_notna) & (trans_notna) - - matches.append(transformed) - table.loc[mask, col] = table[transformed][mask] - break - - table.drop(columns=matches, inplace=True) - return table - - -def add_number_to_shuffled_movie( - table, - natural_movie_re=GENERIC_MOVIE_RE, - template_re=SHUFFLED_MOVIE_RE, - stim_colname="stimulus_name", - template="natural_movie_{}_shuffled", - tmp_colname="__movie_number__", -): - """ - """ - - if not table[stim_colname].str.contains(SHUFFLED_MOVIE_RE).any(): - return table - table = table.copy() - - table[tmp_colname] = table[stim_colname].str.extract(natural_movie_re, expand=True)[ - "number" - ] - - unique_numbers = [ - item for item in table[tmp_colname].dropna(inplace=False).unique() - ] - if len(unique_numbers) != 1: - raise ValueError( - f"unable to uniquely determine a movie number for this session. Candidates: {unique_numbers}" - ) - movie_number = unique_numbers[0] - - def renamer(row): - if not isinstance(row[stim_colname], str): - return row[stim_colname] - if not template_re.match(row[stim_colname]): - return row[stim_colname] - else: - return template.format(movie_number) - - table[stim_colname] = table.apply(renamer, axis=1) - table.drop(columns=tmp_colname, inplace=True) - return table - - -def standardize_movie_numbers( - table, - movie_re=GENERIC_MOVIE_RE, - numeral_re=NUMERAL_RE, - digit_names=DIGIT_NAMES, - stim_colname="stimulus_name", -): - """ Natural movie stimuli in visual coding are numbered using words, like "natural_movie_two" rather than - "natural_movie_2". This function ensures that all of the natural movie stimuli in an experiment are named by - that convention. - - Parameters - ---------- - table : pd.DataFrame - the incoming stimulus table - movie_re : re.Pattern, optional - regex that matches movie stimulus names - numeral_re : re.Pattern, optional - regex that extracts movie numbers from stimulus names - digit_names : dict, optional - map from numerals to english words - stim_colname : str, optional - the name of the dataframe column that contains stimulus names - - Returns - ------- - table : pd.DataFrame - the stimulus table with movie numerals having been mapped to english words - - """ - - replace = lambda match_obj: digit_names[match_obj["number"]] - - # for some reason pandas really wants us to use the captures - warnings.filterwarnings("ignore", "This pattern has match groups") - - movie_rows = table[stim_colname].str.contains(movie_re, na=False) - table.loc[movie_rows, stim_colname] = table.loc[ - movie_rows, stim_colname - ].str.replace(numeral_re, replace) - - return table - - -def map_stimulus_names(table, name_map=None, stim_colname="stimulus_name"): - """ Applies a mappting to the stimulus names in a stimulus table - - Parameters - ---------- - table : pd.DataFrame - the input stimulus table - name_map : dict, optional - rename the stimuli according to this mapping - stim_colname: str, optional - look in this column for stimulus names - - """ - - if name_map is None: - return table - - if "" in name_map: - name_map[np.nan] = name_map[""] - - table[stim_colname] = table[stim_colname].replace( - to_replace=name_map, inplace=False - ) - return table - - -def map_column_names(table, name_map=None, ignore_case=True): - - if ignore_case and name_map is not None: - name_map = {key.lower(): value for key, value in name_map.items()} - mapper = lambda name: name if name.lower() not in name_map else name_map[name.lower()] - else: - mapper = name_map - - return table.rename(columns=mapper) \ No newline at end of file diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/output_validation.py b/allensdk/brain_observatory/ecephys/stimulus_table/output_validation.py deleted file mode 100644 index a62cc6ac8f..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/output_validation.py +++ /dev/null @@ -1,47 +0,0 @@ -import numpy as np -import warnings - - -def validate_epoch_durations(table, start_key="Start", end_key="End", fail_on_negative_durations=False): - durations = table[end_key] - table[start_key] - min_duration_index = durations.idxmin() - min_duration = durations[min_duration_index] - - if min_duration == 0: - warnings.warn( - f"there is an epoch in this stimulus table (index: {min_duration_index}) with duration = {min_duration}", - UserWarning, - ) - if min_duration < 0: - msg = f"there is an epoch with negative duration (index: {min_duration_index})" - if fail_on_negative_durations: - raise ValueError(msg) - warnings.warn(msg) - - -def validate_epoch_order(table, time_keys=("Start", "End")): - for time_key in time_keys: - change = np.diff(table[time_key].values) - assert np.amin(change) > 0 - - -def validate_max_spontaneous_epoch_duration( - table, - max_duration, - get_spontanous_epochs=None, - index_key="stimulus_index", - start_key="Start", - end_key="End", -): - if get_spontanous_epochs is None: - get_spontanous_epochs = lambda table: table[np.isnan(table[index_key])] - - spontaneous_epochs = get_spontanous_epochs(table) - durations = ( - spontaneous_epochs[end_key].values - spontaneous_epochs[start_key].values - ) - if np.amax(durations) > max_duration: - warnings.warn( - f"there is a spontaneous activity duration longer than {max_duration}", - UserWarning, - ) diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py b/allensdk/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py deleted file mode 100644 index 0571e41f67..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py +++ /dev/null @@ -1,104 +0,0 @@ -import re -import ast - - -REPR_PARAMS_RE = re.compile(r"([a-z0-9]+=[^=]+)[,\)]", re.IGNORECASE) -REPR_CLASS_RE = re.compile(r"^(?P<class_name>[a-z0-9]+)\(.*\)$", re.IGNORECASE) -ARRAY_RE = re.compile(r"array\((?P<contents>\[.*\])\)") - -DROP_PARAMS = ( # psychopy boilerplate, more or less - "name", - "autoLog", - "autoDraw", - "win", -) - - -def parse_stim_repr( - stim_repr, - drop_params=DROP_PARAMS, - repr_params_re=REPR_PARAMS_RE, - array_re=ARRAY_RE, - raise_on_unrecognized=False, -): - """ Read the string representation of a psychopy stimulus and extract stimulus parameters. - - Parameters - ---------- - stim_repr : str - drop_params : tuple - repr_params_re : re.Pattern - array_re : re.Pattern - - - Returns - ------- - dict : - maps extracted parameter names to values - - """ - - stim_params = extract_const_params_from_stim_repr( - stim_repr, repr_params_re=repr_params_re, array_re=array_re - ) - - for drop_param in drop_params: - if drop_param in stim_params: - del stim_params[drop_param] - - return stim_params - - -# This is not currently in use by the stimulus_table module, but is a potentially handy utility -def extract_stim_class_from_repr(stim_repr, repr_class_re=REPR_CLASS_RE): - match = repr_class_re.match(stim_repr) - if match is not None and "class_name" in match.groupdict(): - return match["class_name"] - - -def extract_const_params_from_stim_repr( - stim_repr, repr_params_re=REPR_PARAMS_RE, array_re=ARRAY_RE -): - """Parameters which are not set as sweep_params in the stimulus script (usually because they are not - varied during the course of the session) are not output in an easily machine-readable format. This function - attempts to recover them by parsing the string repr of the stimulus. - - Parameters - ---------- - stim_repr : str - The repr of the camstim stimulus object. Served up per-stimulus in the stim pickle. - repr_params_re : re.Pattern - Extracts attributes as "="-seperated strings - array_re : re.Pattern - Extracts list reprs from numpy array reprs. - - Returns - ------- - repr_params : dict - dictionary of paramater keys and values extracted from the stim repr. Where possible, the values are converted - to native Python types. - - """ - - repr_params = {} - - for match in repr_params_re.findall(stim_repr): - k, v = match.split("=") - - if k not in repr_params: - - m = array_re.match(v) - if m is not None: - v = m["contents"] - - try: - v = ast.literal_eval(v) - except ValueError as err: - pass - - repr_params[k] = v - - else: - raise KeyError(f"duplicate key: {k}") - - return repr_params diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/visualization/__init__.py b/allensdk/brain_observatory/ecephys/stimulus_table/visualization/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py b/allensdk/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py deleted file mode 100644 index a97fa06ca1..0000000000 --- a/allensdk/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py +++ /dev/null @@ -1,121 +0,0 @@ -import argparse -import itertools as it - -import numpy as np -import pandas as pd -import matplotlib.pyplot as plt -import seaborn as sns - - -def build_colormap(table, existing_map={}, base_colors=sns.color_palette("pastel")): - - colormap = {} - - unique_names = table["stimulus_name"].unique() - color_iterator = iter(base_colors) - - for un in unique_names: - if un in existing_map: - colormap[un] = existing_map[un] - continue - - if isinstance(un, float) and np.isnan(un): - un = "spontaneous_activity" - - colormap[un] = next(color_iterator) - - return colormap - - -def get_blocks(table): - changes = np.where(np.diff(table["stimulus_block"].values))[0] + 1 - changes = np.sort(np.unique(np.concatenate([changes, [0, table.shape[0]]]))) - - blocks = [] - for ii, (low, high) in enumerate(zip(changes[:-1], changes[1:])): - block = table.iloc[low:high, :] - - recorded_blocks = np.unique(block["stimulus_block"].values) - if len(recorded_blocks) > 1: - raise ValueError( - "expected one recorded block per block, found: {}".format( - recorded_blocks - ) - ) - else: - recorded_block = recorded_blocks[0] - - start = block["Start"].values[0] - end = block["End"].values[-1] - - names = np.unique(block["stimulus_name"].values) - if len(names) > 1: - raise ValueError("expected one name per block, found: {}".format(names)) - else: - name = names[0] - - indices = np.unique(block["stimulus_index"].values) - if len(indices) > 1: - raise ValueError("expected one index per block, found: {}".format(indices)) - else: - index = indices[0] - - if isinstance(name, float) and np.isnan(name): - name = "spontaneous_activity" - - blocks.append({"name": name, "index": index, "start": start, "end": end}) - - return blocks - - -def plot_blocks(blocks, colormap): - fig, ax = plt.subplots(figsize=(9, 9)) - - used = set([]) - max_time = -np.inf - handles = [] - labels = [] - - for block in blocks: - - handle = ax.axvspan( - block["start"], - block["end"], - facecolor=colormap[block["name"]], - alpha=1.0, - linestyle="-", - edgecolor="black", - ) - if not block["name"] in used: - labels.append(block["name"]) - handles.append(handle) - - max_time = max([max_time, block["end"]]) - used.add(block["name"]) - - ax.set_xlim([0, max_time]) - ax.get_yaxis().set_visible(False) - ax.set_xlabel("time (s)") - - plt.legend(handles, labels) - - -def main(table_csv_path): - - table = pd.read_csv(table_csv_path) - - colormap = build_colormap(table) - blocks = get_blocks(table) - - plot_blocks(blocks, colormap) - plt.show() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "table_csv_path", type=str, help="filesystem path to stimulus table csv" - ) - - args = parser.parse_args() - main(args.table_csv_path) diff --git a/allensdk/brain_observatory/ecephys/visualization/__init__.py b/allensdk/brain_observatory/ecephys/visualization/__init__.py deleted file mode 100644 index ecff26ed01..0000000000 --- a/allensdk/brain_observatory/ecephys/visualization/__init__.py +++ /dev/null @@ -1,111 +0,0 @@ -from mpl_toolkits.axes_grid1 import make_axes_locatable -import matplotlib.pyplot as plt -import numpy as np - - -def plot_mean_waveforms(mean_waveforms, unit_ids, peak_channels): # pragma: no cover - ''' Utility for plotting mean waveforms on each unit's peak channel - - Parameters - ---------- - mean_waveforms : dictionary - Maps unit ids to channelwise averege spike waveforms for those units - unit_ids : array-like - unique integer identifiers for units to be included - - ''' - - fig, ax = plt.subplots(figsize=(10, 10)) - - for uid in unit_ids: - wf = mean_waveforms[uid] - ax.plot(wf.loc[{'channel_id': peak_channels[uid]}]) - - ax.legend(unit_ids) - ax.set_ylabel('membrane potential (uV)', fontsize=16) - ax.set_xlabel('time (s)', fontsize=16) - - ax.set_xticks(np.arange(0, len(wf['time']), 20)) - ax.set_xticklabels([f'{float(ii):1.4f}' for ii in wf['time'][::20]], rotation=45) - - return fig - - -def plot_spike_counts( - data_array, - time_coords, - cbar_label, - title, - xlabel='time relative to stimulus onset (s)', - ylabel='unit', - xtick_step=20 -): # pragma: no cover - '''Utility for making a simple spike counts plot. - - Parameters - ---------- - data_array : xarray.DataArray - 2D data array unitwise values per time bin. See EcephysSession.sweepwise_spike_counts - - ''' - - fig, ax = plt.subplots(figsize=(12, 12)) - div = make_axes_locatable(ax) - cbar_axis = div.append_axes("right", 0.2, pad=0.05) - - img = ax.imshow( - data_array.T, - interpolation='none' - ) - plt.colorbar(img, cax=cbar_axis) - - cbar_axis.set_ylabel(cbar_label, fontsize=16) - - ax.yaxis.set_major_locator(plt.NullLocator()) - ax.set_ylabel(ylabel, fontsize=16) - - reltime = np.array(time_coords) - ax.set_xticks(np.arange(0, len(reltime), xtick_step)) - ax.set_xticklabels([f'{mp:1.3f}' for mp in reltime[::xtick_step]], rotation=45) - ax.set_xlabel(xlabel, fontsize=16) - - ax.set_title(title, fontsize=20) - - return fig - - -class _VlPlotter: - def __init__(self, ax, num_objects, cmap=plt.cm.tab20, cycle_colors=False): - self.ii = 0 - self.ax = ax - self.num_objects = num_objects - self.cmap = cmap - self.cycle_colors = cycle_colors - - def __call__(self, gb): - low = self.ii / self.num_objects - high = (self.ii + 1) / self.num_objects - - cindex = self.ii % self.cmap.N if self.cycle_colors else np.random.randint(self.cmap.N) - color = self.cmap(cindex) - - self.ax.vlines(gb.index.values, low, high, colors=color) - self.ii += 1 - - -def raster_plot(spike_times, figsize=(8,8), cmap=plt.cm.tab20, title='spike raster', cycle_colors=False): - - fig, ax = plt.subplots(figsize=figsize) - plotter = _VlPlotter(ax, num_objects=len(spike_times['unit_id'].unique()), cmap=cmap, cycle_colors=cycle_colors) - # aggregate is called on each column, so pass only one (eg the stimulus_presentation_id) - # to plot each unit once - spike_times[['stimulus_presentation_id', 'unit_id']].groupby('unit_id').agg(plotter) - - ax.set_xlabel('time (s)', fontsize=16) - ax.set_ylabel('unit', fontsize=16) - ax.set_title(title, fontsize=20) - - plt.yticks([]) - plt.axis('tight') - - return fig diff --git a/allensdk/brain_observatory/ecephys/write_nwb/__init__.py b/allensdk/brain_observatory/ecephys/write_nwb/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ecephys/write_nwb/__main__.py b/allensdk/brain_observatory/ecephys/write_nwb/__main__.py deleted file mode 100644 index 2840ebb68e..0000000000 --- a/allensdk/brain_observatory/ecephys/write_nwb/__main__.py +++ /dev/null @@ -1,1050 +0,0 @@ -import logging -import sys -from typing import Any, Dict, List, Optional, Tuple -from pathlib import Path, PurePath -import multiprocessing as mp -from functools import partial - -import h5py -import pynwb -import requests -import pandas as pd -import numpy as np -from hdmf.backends.hdf5.h5_utils import H5DataIO - -from allensdk.config.manifest import Manifest - -from ._schemas import InputSchema, OutputSchema -from allensdk.brain_observatory.nwb import setup_table_for_invalid_times # noqa: F401 -from allensdk.brain_observatory.nwb import ( - add_stimulus_presentations, - add_stimulus_timestamps, - add_invalid_times, - setup_table_for_epochs, - read_eye_dlc_tracking_ellipses, - read_eye_gaze_mappings, - add_eye_tracking_ellipse_fit_data_to_nwbfile, - add_eye_gaze_mapping_data_to_nwbfile, - eye_tracking_data_is_valid -) -from allensdk.brain_observatory.argschema_utilities import ( - write_or_print_outputs, optional_lims_inputs -) -from allensdk.brain_observatory import dict_to_indexed_array -from allensdk.brain_observatory.ecephys.file_io.continuous_file import ContinuousFile -from allensdk.brain_observatory.ecephys.nwb import (EcephysProbe, - EcephysElectrodeGroup, - EcephysSpecimen, - EcephysEyeTrackingRigMetadata, - EcephysCSD) -from allensdk.brain_observatory.sync_dataset import Dataset -import allensdk.brain_observatory.sync_utilities as su - - -STIM_TABLE_RENAMES_MAP = {"Start": "start_time", "End": "stop_time"} - - -def load_and_squeeze_npy(path): - return np.squeeze(np.load(path, allow_pickle=False)) - - -def fill_df(df, str_fill=""): - df = df.copy() - - for colname in df.columns: - if not pd.api.types.is_numeric_dtype(df[colname]): - df[colname].fillna(str_fill) - - if np.all(pd.isna(df[colname]).values): - df[colname] = [str_fill for ii in range(df.shape[0])] - - if pd.api.types.is_string_dtype(df[colname]): - df[colname] = df[colname].astype(str) - - return df - - -def get_inputs_from_lims(host, ecephys_session_id, output_root, job_queue, strategy): - """ - This is a development / testing utility for running this module from the Allen Institute for Brain Science's - Laboratory Information Management System (LIMS). It will only work if you are on our internal network. - - Parameters - ---------- - ecephys_session_id : int - Unique identifier for session of interest. - output_root : str - Output file will be written into this directory. - job_queue : str - Identifies the job queue from which to obtain configuration data - strategy : str - Identifies the LIMS strategy which will be used to write module inputs. - - Returns - ------- - data : dict - Response from LIMS. Should meet the schema defined in _schemas.py - - """ - - uri = f"{host}/input_jsons?object_id={ecephys_session_id}&object_class=EcephysSession&strategy_class={strategy}&job_queue_name={job_queue}&output_directory={output_root}" - response = requests.get(uri) - data = response.json() - - if len(data) == 1 and "error" in data: - raise ValueError("bad request uri: {} ({})".format(uri, data["error"])) - - return data - - -def read_stimulus_table(path: str, - column_renames_map: Dict[str, str] = None, - columns_to_drop: List[str] = None) -> pd.DataFrame: - """ Loads from a CSV on disk the stimulus table for this session. - Optionally renames columns to match NWB epoch specifications. - - Parameters - ---------- - path : str - path to stimulus table csv - column_renames_map : Dict[str, str], optional - If provided, will be used to rename columns from keys -> values. - Default renames: ('Start' -> 'start_time') and ('End' -> 'stop_time') - columns_to_drop : List, optional - A list of column names to drop. Columns will be dropped BEFORE - any renaming occurs. If None, no columns are dropped. - By default None. - - Returns - ------- - pd.DataFrame : - stimulus table with applied renames - - """ - if column_renames_map is None: - column_renames_map = STIM_TABLE_RENAMES_MAP - - ext = PurePath(path).suffix - - if ext == ".csv": - stimulus_table = pd.read_csv(path) - else: - raise IOError(f"unrecognized stimulus table extension: {ext}") - - if columns_to_drop: - stimulus_table = stimulus_table.drop(errors='ignore', - columns=columns_to_drop) - - return stimulus_table.rename(columns=column_renames_map, index={}) - - -def read_spike_times_to_dictionary( - spike_times_path, spike_units_path, local_to_global_unit_map=None -): - """ Reads spike times and assigned units from npy files into a lookup table. - - Parameters - ---------- - spike_times_path : str - npy file identifying, per spike, the time at which that spike occurred. - spike_units_path : str - npy file identifying, per spike, the unit associated with that spike. These are probe-local, so a - local_to_global_unit_map is used to associate spikes with global unit identifiers. - local_to_global_unit_map : dict, optional - Maps probewise local unit indices to global unit ids - - Returns - ------- - output_times : dict - keys are unit identifiers, values are spike time arrays - - """ - - spike_times = load_and_squeeze_npy(spike_times_path) - spike_units = load_and_squeeze_npy(spike_units_path) - - return group_1d_by_unit(spike_times, spike_units, local_to_global_unit_map) - - -def read_spike_amplitudes_to_dictionary( - spike_amplitudes_path, spike_units_path, - templates_path, spike_templates_path, inverse_whitening_matrix_path, - local_to_global_unit_map=None, - scale_factor=1.0 -): - - spike_amplitudes = load_and_squeeze_npy(spike_amplitudes_path) - spike_units = load_and_squeeze_npy(spike_units_path) - - templates = load_and_squeeze_npy(templates_path) - spike_templates = load_and_squeeze_npy(spike_templates_path) - inverse_whitening_matrix = load_and_squeeze_npy(inverse_whitening_matrix_path) - - for temp_idx in range(templates.shape[0]): - templates[temp_idx, :, :] = np.dot( - np.ascontiguousarray(templates[temp_idx, :, :]), - np.ascontiguousarray(inverse_whitening_matrix) - ) - - scaled_amplitudes = scale_amplitudes(spike_amplitudes, templates, spike_templates, scale_factor=scale_factor) - return group_1d_by_unit(scaled_amplitudes, spike_units, local_to_global_unit_map) - - -def scale_amplitudes(spike_amplitudes, templates, spike_templates, scale_factor=1.0): - - template_full_amplitudes = templates.max(axis=1) - templates.min(axis=1) - template_amplitudes = template_full_amplitudes.max(axis=1) - - template_amplitudes = template_amplitudes[spike_templates] - spike_amplitudes = template_amplitudes * spike_amplitudes * scale_factor - return spike_amplitudes - - -def filter_and_sort_spikes(spike_times_mapping: Dict[int, np.ndarray], - spike_amplitudes_mapping: Dict[int, np.ndarray]) -> Tuple[Dict[int, np.ndarray], Dict[int, np.ndarray]]: - """Filter out invalid spike timepoints and sort spike data - (times + amplitudes) by times. - - Parameters - ---------- - spike_times_mapping : Dict[int, np.ndarray] - Keys: unit identifiers, Values: spike time arrays - spike_amplitudes_mapping : Dict[int, np.ndarray] - Keys: unit identifiers, Values: spike amplitude arrays - - Returns - ------- - Tuple[Dict[int, np.ndarray], Dict[int, np.ndarray]] - A tuple containing filtered and sorted spike_times_mapping and - spike_amplitudes_mapping data. - """ - sorted_spike_times_mapping = {} - sorted_spike_amplitudes_mapping = {} - - for unit_id, _ in spike_times_mapping.items(): - spike_times = spike_times_mapping[unit_id] - spike_amplitudes = spike_amplitudes_mapping[unit_id] - - valid = spike_times >= 0 - filtered_spike_times = spike_times[valid] - filtered_spike_amplitudes = spike_amplitudes[valid] - - order = np.argsort(filtered_spike_times) - sorted_spike_times = filtered_spike_times[order] - sorted_spike_amplitudes = filtered_spike_amplitudes[order] - - sorted_spike_times_mapping[unit_id] = sorted_spike_times - sorted_spike_amplitudes_mapping[unit_id] = sorted_spike_amplitudes - - return (sorted_spike_times_mapping, sorted_spike_amplitudes_mapping) - - -def group_1d_by_unit(data, data_unit_map, local_to_global_unit_map=None): - sort_order = np.argsort(data_unit_map, kind="stable") - data_unit_map = data_unit_map[sort_order] - data = data[sort_order] - - changes = np.concatenate( - [ - np.array([0]), - np.where(np.diff(data_unit_map))[0] + 1, - np.array([data.size]), - ] - ) - - output = {} - for jj, (low, high) in enumerate(zip(changes[:-1], changes[1:])): - local_unit = data_unit_map[low] - current = data[low:high] - - if local_to_global_unit_map is not None: - if local_unit not in local_to_global_unit_map: - logging.warning( - f"unable to find unit at local position {local_unit}" - ) - continue - global_id = local_to_global_unit_map[local_unit] - output[global_id] = current - else: - output[local_unit] = current - - return output - - -def add_metadata_to_nwbfile(nwbfile, input_metadata): - metadata = input_metadata.copy() - - if "full_genotype" in metadata: - metadata["genotype"] = metadata.pop("full_genotype") - - if "stimulus_name" in metadata: - nwbfile.stimulus_notes = metadata.pop("stimulus_name") - - if "age_in_days" in metadata: - metadata["age"] = f"P{int(metadata['age_in_days'])}D" - - if "donor_id" in metadata: - metadata["subject_id"] = str(metadata.pop("donor_id")) - - nwbfile.subject = EcephysSpecimen(**metadata) - return nwbfile - - -def read_waveforms_to_dictionary( - waveforms_path, local_to_global_unit_map=None, peak_channel_map=None -): - """ Builds a lookup table for unitwise waveform data - - Parameters - ---------- - waveforms_path : str - npy file containing waveform data for each unit. Dimensions ought to be units X samples X channels - local_to_global_unit_map : dict, optional - Maps probewise local unit indices to global unit ids - peak_channel_map : dict, optional - Maps unit identifiers to indices of peak channels. If provided, the output will contain only samples on the peak - channel for each unit. - - Returns - ------- - output_waveforms : dict - Keys are unit identifiers, values are samples X channels data arrays. - - """ - - waveforms = np.squeeze(np.load(waveforms_path, allow_pickle=False)) - output_waveforms = {} - for unit_id, waveform in enumerate( - np.split(waveforms, waveforms.shape[0], axis=0) - ): - if local_to_global_unit_map is not None: - if unit_id not in local_to_global_unit_map: - logging.warning( - f"unable to find unit at local position {unit_id} while reading waveforms" - ) - continue - unit_id = local_to_global_unit_map[unit_id] - - if peak_channel_map is not None: - waveform = waveform[:, peak_channel_map[unit_id]] - - output_waveforms[unit_id] = np.squeeze(waveform) - - return output_waveforms - - -def read_running_speed(path): - """ Reads running speed data and timestamps into a RunningSpeed named tuple - - Parameters - ---------- - path : str - path to running speed store - - - Returns - ------- - tuple : - first item is dataframe of running speed data, second is dataframe of - raw values (vsig, vin, encoder rotation) - - """ - - return ( - pd.read_hdf(path, key="running_speed"), - pd.read_hdf(path, key="raw_data") - ) - - -def add_probe_to_nwbfile(nwbfile, probe_id, sampling_rate, lfp_sampling_rate, - has_lfp_data, name, - location="See electrode locations"): - """ Creates objects required for representation of a single - extracellular ephys probe within an NWB file. - - Parameters - ---------- - nwbfile : pynwb.NWBFile - file to which probe information will be assigned. - probe_id : int - unique identifier for this probe - sampling_rate: float, - sampling rate of the neuropixels probe - lfp_sampling_rate: float - sampling rate of LFP - has_lfp_data: bool - True if LFP data is available for the probe, otherwise False - name : str, optional - human-readable name for this probe. - Practically, we use tags like "probeA" or "probeB" - location : str, optional - A required field for the `EcephysElectrodeGroup`. Because the group - contains a number of electrodes/channels along the neuropixels probe, - location will vary significantly. Thus by default this field is: - "See electrode locations" where the nwbfile.electrodes table will - provide much more detailed location information. - - Returns - ------ - nwbfile : pynwb.NWBFile - the updated file object - probe_nwb_device : pynwb.device.Device - device object corresponding to this probe - probe_nwb_electrode_group : pynwb.ecephys.ElectrodeGroup - electrode group object corresponding to this probe - - """ - probe_nwb_device = EcephysProbe(name=name, - description="Neuropixels 1.0 Probe", # required field - manufacturer="imec", - probe_id=probe_id, - sampling_rate=sampling_rate) - - probe_nwb_electrode_group = EcephysElectrodeGroup( - name=name, - description="Ecephys Electrode Group", # required field - probe_id=probe_id, - location=location, - device=probe_nwb_device, - lfp_sampling_rate=lfp_sampling_rate, - has_lfp_data=has_lfp_data - ) - - nwbfile.add_device(probe_nwb_device) - nwbfile.add_electrode_group(probe_nwb_electrode_group) - - return nwbfile, probe_nwb_device, probe_nwb_electrode_group - - -def add_ecephys_electrode_columns(nwbfile: pynwb.NWBFile, - columns_to_add: Optional[List[Tuple[str, str]]] = None): - """Add additional columns to ecephys nwbfile electrode table. - - Parameters - ---------- - nwbfile : pynwb.NWBFile - An nwbfile to add additional electrode columns to - columns_to_add : Optional[List[Tuple[str, str]]] - A list of (column_name, column_description) tuples to be added - to the nwbfile electrode table, by default None. If None, default - columns are added. - """ - default_columns = [ - ("probe_vertical_position", "Length-wise position of electrode/channel on device (microns)"), - ("probe_horizontal_position", "Width-wise position of electrode/channel on device (microns)"), - ("probe_id", "The unique id of this electrode's/channel's device"), - ("local_index", "The local index of electrode/channel on device"), - ("valid_data", "Whether data from this electrode/channel is usable") - ] - - if columns_to_add is None: - columns_to_add = default_columns - - for col_name, col_description in columns_to_add: - if (not nwbfile.electrodes) or (col_name not in nwbfile.electrodes.colnames): - nwbfile.add_electrode_column(name=col_name, - description=col_description) - - -def add_ecephys_electrodes(nwbfile: pynwb.NWBFile, - channels: List[dict], - electrode_group: EcephysElectrodeGroup, - local_index_whitelist: Optional[np.ndarray] = None): - """Add electrode information to an ecephys nwbfile electrode table. - - Parameters - ---------- - nwbfile : pynwb.NWBFile - The nwbfile to add electrodes data to - channels : List[dict] - A list of 'channel' dictionaries containing the following fields: - id: The unique id for a given electrode/channel - probe_id: The unique id for an electrode's/channel's device - valid_data: Whether the data for an electrode/channel is usable - local_index: The local index of an electrode/channel on a given device - probe_vertical_position: Length-wise position of electrode/channel on device (microns) - probe_horizontal_position: Width-wise position of electrode/channel on device (microns) - manual_structure_id: The LIMS id associated with an anatomical structure - manual_structure_acronym: Acronym associated with an anatomical structure - anterior_posterior_ccf_coordinate - dorsal_ventral_ccf_coordinate - left_right_ccf_coordinate - - Optional fields which may be used in the future: - impedence: The impedence of a given channel. - filtering: The type of hardware filtering done a channel. - (e.g. "1000 Hz low-pass filter") - - electrode_group : EcephysElectrodeGroup - The pynwb electrode group that electrodes should be associated with - local_index_whitelist : Optional[np.ndarray], optional - If provided, only add electrodes (a.k.a. channels) specified by the - whitelist (and in order specified), by default None - """ - add_ecephys_electrode_columns(nwbfile) - - channel_table = pd.DataFrame(channels) - - if local_index_whitelist is not None: - channel_table.set_index("local_index", inplace=True) - channel_table = channel_table.loc[local_index_whitelist, :] - channel_table.reset_index(inplace=True) - - for _, row in channel_table.iterrows(): - x = row["anterior_posterior_ccf_coordinate"] - y = row["dorsal_ventral_ccf_coordinate"] - z = row["left_right_ccf_coordinate"] - - nwbfile.add_electrode( - id=row["id"], - x=(np.nan if x is None else x), # Not all probes have CCF coords - y=(np.nan if y is None else y), - z=(np.nan if z is None else z), - probe_vertical_position=row["probe_vertical_position"], - probe_horizontal_position=row["probe_horizontal_position"], - local_index=row["local_index"], - valid_data=row["valid_data"], - probe_id=row["probe_id"], - group=electrode_group, - location=row["manual_structure_acronym"], - imp=row["impedence"], - filtering=row["filtering"] - ) - - -def add_ragged_data_to_dynamic_table( - table, data, column_name, column_description="" -): - """ Builds the index and data vectors required for writing ragged array data to a pynwb dynamic table - - Parameters - ---------- - table : pynwb.core.DynamicTable - table to which data will be added (as VectorData / VectorIndex) - data : dict - each key-value pair describes some grouping of data - column_name : str - used to set the name of this column - column_description : str, optional - used to set the description of this column - - Returns - ------- - nwbfile : pynwb.NWBFile - - """ - - idx, values = dict_to_indexed_array(data, table.id.data) - del data - - table.add_column( - name=column_name, description=column_description, data=values, index=idx - ) - - -DEFAULT_RUNNING_SPEED_UNITS = { - "velocity": "cm/s", - "vin": "V", - "vsig": "V", - "rotation": "radians" -} - - -def add_running_speed_to_nwbfile(nwbfile, running_speed, units=None): - if units is None: - units = DEFAULT_RUNNING_SPEED_UNITS - - running_mod = pynwb.ProcessingModule("running", "running speed data") - nwbfile.add_processing_module(running_mod) - - running_speed_timeseries = pynwb.base.TimeSeries( - name="running_speed", - timestamps=running_speed["start_time"].values, - data=running_speed["velocity"].values, - unit=units["velocity"] - ) - - # Create an 'empty' timeseries that only stores end times - # An array of nans needs to be created to avoid an nwb schema violation - running_speed_end_timeseries = pynwb.base.TimeSeries( - name="running_speed_end_times", - data=np.full(running_speed["velocity"].shape, np.nan), - timestamps=running_speed["end_time"].values, - unit=units["velocity"] - ) - - rotation_timeseries = pynwb.base.TimeSeries( - name="running_wheel_rotation", - timestamps=running_speed_timeseries, - data=running_speed["net_rotation"].values, - unit=units["rotation"] - ) - - running_mod.add_data_interface(running_speed_timeseries) - running_mod.add_data_interface(running_speed_end_timeseries) - running_mod.add_data_interface(rotation_timeseries) - - return nwbfile - - -def add_raw_running_data_to_nwbfile(nwbfile, raw_running_data, units=None): - if units is None: - units = DEFAULT_RUNNING_SPEED_UNITS - - raw_rotation_timeseries = pynwb.base.TimeSeries( - name="raw_running_wheel_rotation", - timestamps=np.array(raw_running_data["frame_time"]), - data=raw_running_data["dx"].values, - unit=units["rotation"] - ) - - vsig_ts = pynwb.base.TimeSeries( - name="running_wheel_signal_voltage", - timestamps=raw_rotation_timeseries, - data=raw_running_data["vsig"].values, - unit=units["vsig"] - ) - - vin_ts = pynwb.base.TimeSeries( - name="running_wheel_supply_voltage", - timestamps=raw_rotation_timeseries, - data=raw_running_data["vin"].values, - unit=units["vin"] - ) - - nwbfile.add_acquisition(raw_rotation_timeseries) - nwbfile.add_acquisition(vsig_ts) - nwbfile.add_acquisition(vin_ts) - - return nwbfile - - -def write_probe_lfp_file(session_id, session_metadata, session_start_time, - log_level, probe): - """ Writes LFP data (and associated channel information) for one - probe to a standalone nwb file - """ - - logging.getLogger('').setLevel(log_level) - logging.info(f"writing lfp file for probe {probe['id']}") - - nwbfile = pynwb.NWBFile( - session_description='LFP data and associated channel info for a single Ecephys probe', - identifier=f"{probe['id']}", - session_id=f"{session_id}", - session_start_time=session_start_time, - institution="Allen Institute for Brain Science" - ) - - if session_metadata is not None: - nwbfile = add_metadata_to_nwbfile(nwbfile, session_metadata) - - if probe.get("temporal_subsampling_factor", None) is not None: - probe["lfp_sampling_rate"] = probe["lfp_sampling_rate"] / probe["temporal_subsampling_factor"] - - nwbfile, probe_nwb_device, probe_nwb_electrode_group = add_probe_to_nwbfile( - nwbfile, - probe_id=probe["id"], - name=probe["name"], - sampling_rate=probe["sampling_rate"], - lfp_sampling_rate=probe["lfp_sampling_rate"], - has_lfp_data=probe["lfp"] is not None - ) - - lfp_channels = np.load(probe['lfp']['input_channels_path'], - allow_pickle=False) - - add_ecephys_electrodes(nwbfile, probe["channels"], - probe_nwb_electrode_group, - local_index_whitelist=lfp_channels) - - electrode_table_region = nwbfile.create_electrode_table_region( - region=np.arange(len(nwbfile.electrodes)).tolist(), # must use raw indices here - name='electrodes', - description=f"lfp channels on probe {probe['id']}" - ) - - lfp_data, lfp_timestamps = ContinuousFile( - data_path=probe['lfp']['input_data_path'], - timestamps_path=probe['lfp']['input_timestamps_path'], - total_num_channels=len(nwbfile.electrodes) - ).load(memmap=False) - - lfp_data = lfp_data.astype(np.float32) - lfp_data = lfp_data * probe["amplitude_scale_factor"] - - lfp = pynwb.ecephys.LFP(name=f"probe_{probe['id']}_lfp") - - nwbfile.add_acquisition(lfp.create_electrical_series( - name=f"probe_{probe['id']}_lfp_data", - data=H5DataIO(data=lfp_data, compression='gzip', compression_opts=9), - timestamps=H5DataIO(data=lfp_timestamps, compression='gzip', compression_opts=9), - electrodes=electrode_table_region - )) - - nwbfile.add_acquisition(lfp) - - csd, csd_times, csd_locs = read_csd_data_from_h5(probe["csd_path"]) - nwbfile = add_csd_to_nwbfile(nwbfile, csd, csd_times, csd_locs) - - with pynwb.NWBHDF5IO(probe['lfp']['output_path'], 'w') as lfp_writer: - logging.info(f"writing probe lfp file to {probe['lfp']['output_path']}") - lfp_writer.write(nwbfile, cache_spec=True) - return {"id": probe["id"], "nwb_path": probe["lfp"]["output_path"]} - - -def read_csd_data_from_h5(csd_path): - with h5py.File(csd_path, "r") as csd_file: - return (csd_file["current_source_density"][:], - csd_file["timestamps"][:], - csd_file["csd_locations"][:]) - - -def add_csd_to_nwbfile(nwbfile: pynwb.NWBFile, csd: np.ndarray, - times: np.ndarray, csd_virt_channel_locs: np.ndarray, - csd_unit="V/cm^2", position_unit="um") -> pynwb.NWBFile: - """Add current source density (CSD) data to an nwbfile - - Parameters - ---------- - nwbfile : pynwb.NWBFile - nwbfile to add CSD data to - csd : np.ndarray - CSD data in the form of: (channels x timepoints) - times : np.ndarray - Timestamps for CSD data (timepoints) - csd_virt_channel_locs : np.ndarray - Location of interpolated channels - csd_unit : str, optional - Units of CSD data, by default "V/cm^2" - position_unit : str, optional - Units of virtual channel locations, by default "um" (micrometer) - - Returns - ------- - pynwb.NWBFiles - nwbfile which has had CSD data added - """ - - csd_mod = pynwb.ProcessingModule("current_source_density", "Precalculated current source density from interpolated channel locations.") - nwbfile.add_processing_module(csd_mod) - - csd_ts = pynwb.base.TimeSeries( - name="current_source_density", - data=csd.T, # TimeSeries should have data in (timepoints x channels) format - timestamps=times, - unit=csd_unit - ) - - x_locs, y_locs = np.split(csd_virt_channel_locs.astype(np.uint64), 2, axis=1) - - csd = EcephysCSD(name="ecephys_csd", - time_series=csd_ts, - virtual_electrode_x_positions=x_locs.flatten(), - virtual_electrode_x_positions__unit=position_unit, - virtual_electrode_y_positions=y_locs.flatten(), - virtual_electrode_y_positions__unit=position_unit) - - csd_mod.add_data_interface(csd) - - return nwbfile - - -def write_probewise_lfp_files(probes, session_id, session_metadata, - session_start_time, pool_size=3): - - output_paths = [] - - pool = mp.Pool(processes=pool_size) - write = partial(write_probe_lfp_file, session_id, session_metadata, - session_start_time, logging.getLogger("").getEffectiveLevel()) - - for pout in pool.imap_unordered(write, probes): - output_paths.append(pout) - - return output_paths - - -ParsedProbeData = Tuple[pd.DataFrame, # unit_tables - Dict[int, np.ndarray], # spike_times - Dict[int, np.ndarray], # spike_amplitudes - Dict[int, np.ndarray]] # mean_waveforms - - -def parse_probes_data(probes: List[Dict[str, Any]]) -> ParsedProbeData: - """Given a list of probe dictionaries specifying data file locations, load - and parse probe data into intermediate data structures needed for adding - probe data to an nwbfile. - - Parameters - ---------- - probes : List[Dict[str, Any]] - A list of dictionaries (one entry for each probe), where each probe - dictionary contains metadata (id, name, sampling_rate, etc...) as well - as filepaths pointing to where probe lfp data can be found. - - Returns - ------- - ParsedProbeData : Tuple[...] - unit_tables : pd.DataFrame - A table containing unit metadata from all probes. - spike_times : Dict[int, np.ndarray] - Keys: unit identifiers, Values: spike time arrays - spike_amplitudes : Dict[int, np.ndarray] - Keys: unit identifiers, Values: spike amplitude arrays - mean_waveforms : Dict[int, np.ndarray] - Keys: unit identifiers, Values: mean waveform arrays - """ - - unit_tables = [] - spike_times = {} - spike_amplitudes = {} - mean_waveforms = {} - - for probe in probes: - unit_tables.append(pd.DataFrame(probe['units'])) - - local_to_global_unit_map = {unit['cluster_id']: unit['id'] for unit in probe['units']} - - spike_times.update(read_spike_times_to_dictionary( - probe['spike_times_path'], probe['spike_clusters_file'], local_to_global_unit_map - )) - mean_waveforms.update(read_waveforms_to_dictionary( - probe['mean_waveforms_path'], local_to_global_unit_map - )) - - spike_amplitudes.update(read_spike_amplitudes_to_dictionary( - probe["spike_amplitudes_path"], probe["spike_clusters_file"], - probe["templates_path"], probe["spike_templates_path"], probe["inverse_whitening_matrix_path"], - local_to_global_unit_map=local_to_global_unit_map, - scale_factor=probe["amplitude_scale_factor"] - )) - - units_table = pd.concat(unit_tables).set_index(keys='id', drop=True) - - return (units_table, spike_times, spike_amplitudes, mean_waveforms) - - -def add_probewise_data_to_nwbfile(nwbfile, probes): - """ Adds channel (electrode) and spike data for a single probe to the session-level nwb file. - """ - for probe in probes: - logging.info(f'found probe {probe["id"]} with name {probe["name"]}') - - if probe.get("temporal_subsampling_factor", None) is not None: - probe["lfp_sampling_rate"] = probe["lfp_sampling_rate"] / probe["temporal_subsampling_factor"] - - nwbfile, probe_nwb_device, probe_nwb_electrode_group = add_probe_to_nwbfile( - nwbfile, - probe_id=probe["id"], - name=probe["name"], - sampling_rate=probe["sampling_rate"], - lfp_sampling_rate=probe["lfp_sampling_rate"], - has_lfp_data=probe["lfp"] is not None - ) - - add_ecephys_electrodes(nwbfile, probe["channels"], probe_nwb_electrode_group) - - units_table, spike_times, spike_amplitudes, mean_waveforms = parse_probes_data(probes) - nwbfile.units = pynwb.misc.Units.from_dataframe(fill_df(units_table), name='units') - - sorted_spike_times, sorted_spike_amplitudes = filter_and_sort_spikes(spike_times, spike_amplitudes) - - add_ragged_data_to_dynamic_table( - table=nwbfile.units, - data=sorted_spike_times, - column_name="spike_times", - column_description="times (s) of detected spiking events", - ) - - add_ragged_data_to_dynamic_table( - table=nwbfile.units, - data=sorted_spike_amplitudes, - column_name="spike_amplitudes", - column_description="amplitude (s) of detected spiking events" - ) - - add_ragged_data_to_dynamic_table( - table=nwbfile.units, - data=mean_waveforms, - column_name="waveform_mean", - column_description="mean waveforms on peak channels (and over samples)", - ) - - return nwbfile - - -def add_optotagging_table_to_nwbfile(nwbfile, optotagging_table, tag="optical_stimulation"): - # "name" is a pynwb reserved column name that older versions of the - # pre-processed optotagging_table may use. - if "name" in optotagging_table.columns: - optotagging_table = optotagging_table.rename(columns={"name": "stimulus_name"}) - - opto_ts = pynwb.base.TimeSeries( - name="optotagging", - timestamps=optotagging_table["start_time"].values, - data=optotagging_table["duration"].values, - unit="seconds" - ) - - opto_mod = pynwb.ProcessingModule("optotagging", "optogenetic stimulution data") - opto_mod.add_data_interface(opto_ts) - nwbfile.add_processing_module(opto_mod) - - optotagging_table = setup_table_for_epochs(optotagging_table, opto_ts, tag) - - if len(optotagging_table) > 0: - container = pynwb.epoch.TimeIntervals.from_dataframe(optotagging_table, "optogenetic_stimulation") - opto_mod.add_data_interface(container) - - return nwbfile - - -def add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile: pynwb.NWBFile, - eye_tracking_rig_geometry: dict) -> pynwb.NWBFile: - """ Rig geometry dict should consist of the following fields: - monitor_position_mm: [x, y, z] - monitor_rotation_deg: [x, y, z] - camera_position_mm: [x, y, z] - camera_rotation_deg: [x, y, z] - led_position: [x, y, z] - equipment: A string describing rig - """ - eye_tracking_rig_mod = pynwb.ProcessingModule(name='eye_tracking_rig_metadata', - description='Eye tracking rig metadata module') - - rig_metadata = EcephysEyeTrackingRigMetadata( - name="eye_tracking_rig_metadata", - equipment=eye_tracking_rig_geometry['equipment'], - monitor_position=eye_tracking_rig_geometry['monitor_position_mm'], - monitor_position__unit="mm", - camera_position=eye_tracking_rig_geometry['camera_position_mm'], - camera_position__unit="mm", - led_position=eye_tracking_rig_geometry['led_position'], - led_position__unit="mm", - monitor_rotation=eye_tracking_rig_geometry['monitor_rotation_deg'], - monitor_rotation__unit="deg", - camera_rotation=eye_tracking_rig_geometry['camera_rotation_deg'], - camera_rotation__unit="deg" - ) - - eye_tracking_rig_mod.add_data_interface(rig_metadata) - nwbfile.add_processing_module(eye_tracking_rig_mod) - - return nwbfile - - -def add_eye_tracking_data_to_nwbfile(nwbfile: pynwb.NWBFile, - eye_tracking_frame_times: pd.Series, - eye_dlc_tracking_data: Dict[str, pd.DataFrame], - eye_gaze_data: Dict[str, pd.DataFrame]) -> pynwb.NWBFile: - - if eye_tracking_data_is_valid(eye_dlc_tracking_data=eye_dlc_tracking_data, - synced_timestamps=eye_tracking_frame_times): - add_eye_tracking_ellipse_fit_data_to_nwbfile(nwbfile, - eye_dlc_tracking_data=eye_dlc_tracking_data, - synced_timestamps=eye_tracking_frame_times) - - # --- Add gaze mapped positions to nwb file --- - if eye_gaze_data: - add_eye_gaze_mapping_data_to_nwbfile(nwbfile, - eye_gaze_data=eye_gaze_data) - - return nwbfile - - -def write_ecephys_nwb( - output_path, - session_id, session_start_time, - stimulus_table_path, - invalid_epochs, - probes, - running_speed_path, - session_sync_path, - eye_tracking_rig_geometry, - eye_dlc_ellipses_path, - eye_gaze_mapping_path, - pool_size, - optotagging_table_path=None, - session_metadata=None, - **kwargs -): - - nwbfile = pynwb.NWBFile( - session_description='Data and metadata for an Ecephys session', - identifier=f"{session_id}", - session_id=f"{session_id}", - session_start_time=session_start_time, - institution="Allen Institute for Brain Science" - ) - - if session_metadata is not None: - nwbfile = add_metadata_to_nwbfile(nwbfile, session_metadata) - - stimulus_columns_to_drop = [ - "colorSpace", "depth", "interpolate", "pos", "rgbPedestal", "tex", - "texRes", "flipHoriz", "flipVert", "rgb", "signalDots" - ] - stimulus_table = read_stimulus_table(stimulus_table_path, - columns_to_drop=stimulus_columns_to_drop) - nwbfile = add_stimulus_timestamps(nwbfile, stimulus_table['start_time'].values) # TODO: patch until full timestamps are output by stim table module - nwbfile = add_stimulus_presentations(nwbfile, stimulus_table) - nwbfile = add_invalid_times(nwbfile, invalid_epochs) - - if optotagging_table_path is not None: - optotagging_table = pd.read_csv(optotagging_table_path) - nwbfile = add_optotagging_table_to_nwbfile(nwbfile, optotagging_table) - - nwbfile = add_probewise_data_to_nwbfile(nwbfile, probes) - - running_speed, raw_running_data = read_running_speed(running_speed_path) - add_running_speed_to_nwbfile(nwbfile, running_speed) - add_raw_running_data_to_nwbfile(nwbfile, raw_running_data) - - add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile, - eye_tracking_rig_geometry) - - # Collect eye tracking/gaze mapping data from files - eye_tracking_frame_times = su.get_synchronized_frame_times(session_sync_file=session_sync_path, - sync_line_label_keys=Dataset.EYE_TRACKING_KEYS) - eye_dlc_tracking_data = read_eye_dlc_tracking_ellipses(Path(eye_dlc_ellipses_path)) - if eye_gaze_mapping_path: - eye_gaze_data = read_eye_gaze_mappings(Path(eye_gaze_mapping_path)) - else: - eye_gaze_data = None - - add_eye_tracking_data_to_nwbfile(nwbfile, - eye_tracking_frame_times, - eye_dlc_tracking_data, - eye_gaze_data) - - Manifest.safe_make_parent_dirs(output_path) - with pynwb.NWBHDF5IO(output_path, mode='w') as io: - logging.info(f"writing session nwb file to {output_path}") - io.write(nwbfile, cache_spec=True) - - probes_with_lfp = [p for p in probes if p["lfp"] is not None] - probe_outputs = write_probewise_lfp_files(probes_with_lfp, session_id, - session_metadata, - session_start_time, - pool_size=pool_size) - - return { - 'nwb_path': output_path, - "probe_outputs": probe_outputs - } - - -def main(): - logging.basicConfig( - format="%(asctime)s - %(process)s - %(levelname)s - %(message)s" - ) - - parser = optional_lims_inputs(sys.argv, InputSchema, OutputSchema, get_inputs_from_lims) - - output = write_ecephys_nwb(**parser.args) - write_or_print_outputs(output, parser) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/ecephys/write_nwb/_schemas.py b/allensdk/brain_observatory/ecephys/write_nwb/_schemas.py deleted file mode 100644 index f704c16661..0000000000 --- a/allensdk/brain_observatory/ecephys/write_nwb/_schemas.py +++ /dev/null @@ -1,236 +0,0 @@ -import marshmallow as mm -import numpy as np - -from argschema import ArgSchema -from argschema.fields import ( - LogLevel, - Dict, - String, - Int, - DateTime, - Nested, - Boolean, - Float, -) - -from allensdk.brain_observatory.argschema_utilities import ( - check_read_access, - check_write_access, - RaisingSchema, -) - - -class Channel(RaisingSchema): - - @mm.pre_load - def set_field_defaults(self, data, **kwargs): - if data.get("filtering") is None: - data["filtering"] = ("AP band: 500 Hz high-pass; " - "LFP band: 1000 Hz low-pass") - if data.get("manual_structure_acronym") is None: - data["manual_structure_acronym"] = "" - return data - - id = Int(required=True) - probe_id = Int(required=True) - valid_data = Boolean(required=True) - local_index = Int(required=True) - probe_vertical_position = Int(required=True) - probe_horizontal_position = Int(required=True) - manual_structure_id = Int(required=True, allow_none=True) - manual_structure_acronym = String(required=True) - anterior_posterior_ccf_coordinate = Float(allow_none=True) - dorsal_ventral_ccf_coordinate = Float(allow_none=True) - left_right_ccf_coordinate = Float(allow_none=True) - impedence = Float(required=False, allow_none=True, default=None) - filtering = String(required=False) - - @mm.post_load - def set_impedence_default(self, data, **kwargs): - # This must be a post_load operation as np.nan is not a valid - # JSON format 'float' type for the Marshmallow `Float` field - # (so validation fails if this is set at pre_load) - if data.get("impedence") is None: - data["impedence"] = np.nan - return data - - -class Unit(RaisingSchema): - id = Int(required=True) - peak_channel_id = Int(required=True) - local_index = Int( - required=True, - help="within-probe index of this unit.", - ) - cluster_id = Int( - required=True, - help="within-probe identifier of this unit", - ) - quality = String(required=True) - firing_rate = Float(required=True) - snr = Float(required=True, allow_none=True) - isi_violations = Float(required=True) - presence_ratio = Float(required=True) - amplitude_cutoff = Float(required=True) - isolation_distance = Float(required=True, allow_none=True) - l_ratio = Float(required=True, allow_none=True) - d_prime = Float(required=True, allow_none=True) - nn_hit_rate = Float(required=True, allow_none=True) - nn_miss_rate = Float(required=True, allow_none=True) - max_drift = Float(required=True, allow_none=True) - cumulative_drift = Float(required=True, allow_none=True) - silhouette_score = Float(required=True, allow_none=True) - waveform_duration = Float(required=True, allow_none=True) - waveform_halfwidth = Float(required=True, allow_none=True) - PT_ratio = Float(required=True, allow_none=True) - repolarization_slope = Float(required=True, allow_none=True) - recovery_slope = Float(required=True, allow_none=True) - amplitude = Float(required=True, allow_none=True) - spread = Float(required=True, allow_none=True) - velocity_above = Float(required=True, allow_none=True) - velocity_below = Float(required=True, allow_none=True) - - -class Lfp(RaisingSchema): - input_data_path = String(required=True, validate=check_read_access) - input_timestamps_path = String(required=True, validate=check_read_access) - input_channels_path = String(required=True, validate=check_read_access) - output_path = String(required=True) - - -class Probe(RaisingSchema): - id = Int(required=True) - name = String(required=True) - spike_times_path = String(required=True, validate=check_read_access) - spike_clusters_file = String(required=True, validate=check_read_access) - mean_waveforms_path = String(required=True, validate=check_read_access) - channels = Nested(Channel, many=True, required=True) - units = Nested(Unit, many=True, required=True) - lfp = Nested(Lfp, many=False, required=True, allow_none=True) - csd_path = String(required=True, - validate=check_read_access, - allow_none=True, - help="path to h5 file containing calculated current source density") - sampling_rate = Float(default=30000.0, help="sampling rate (Hz, master clock) at which raw data were acquired on this probe") - lfp_sampling_rate = Float(default=2500.0, allow_none=True, help="sampling rate of LFP data on this probe") - temporal_subsampling_factor = Float(default=2.0, allow_none=True, help="subsampling factor applied to lfp data for this probe (across time)") - spike_amplitudes_path = String( - validate=check_read_access, - help="path to npy file containing scale factor applied to the kilosort template used to extract each spike" - ) - spike_templates_path = String( - validate=check_read_access, - help="path to file associating each spike with a kilosort template" - ) - templates_path = String( - validate=check_read_access, - help="path to file contianing an (nTemplates)x(nSamples)x(nUnits) array of kilosort templates" - ) - inverse_whitening_matrix_path = String( - validate=check_read_access, - help="Kilosort templates are whitened. In order to use them for scaling spike amplitudes to volts, we need to remove the whitening" - ) - amplitude_scale_factor = Float( - default=0.195e-6, - help="amplitude scale factor converting raw amplitudes to Volts. Default converts from bits -> uV -> V" - ) - - -class InvalidEpoch(RaisingSchema): - id = Int(required=True) - type = String(required=True) - label = String(required=True) - start_time = Float(required=True) - end_time = Float(required=True) - - -class SessionMetadata(RaisingSchema): - specimen_name = String(required=True) - age_in_days = Float(required=True) - full_genotype = String(required=True) - strain = String(required=True) - sex = String(required=True) - stimulus_name = String(required=True) - species = String(required=True) - donor_id = Int(required=True) - - -class InputSchema(ArgSchema): - class Meta: - unknown = mm.RAISE - - log_level = LogLevel( - default="INFO", help="set the logging level of the module" - ) - output_path = String( - required=True, - validate=check_write_access, - help="write outputs to here", - ) - session_id = Int( - required=True, help="unique identifier for this ecephys session" - ) - session_start_time = DateTime( - required=True, - help="the date and time (iso8601) at which the session started", - ) - stimulus_table_path = String( - required=True, - validate=check_read_access, - help="path to stimulus table file", - ) - invalid_epochs = Nested( - InvalidEpoch, - many=True, - required=True, - help="epochs with invalid data" - ) - probes = Nested( - Probe, - many=True, - required=True, - help="records of the individual probes used for this experiment", - ) - running_speed_path = String( - required=True, - help="data collected about the running behavior of the experiment's subject", - ) - session_sync_path = String( - required=True, - validate=check_read_access, - help="Path to an h5 experiment session sync file (*.sync). This file relates events from different acquisition modalities to one another in time." - ) - eye_tracking_rig_geometry = Dict( - required=True, - help="Mapping containing information about session rig geometry used for eye gaze mapping." - ) - eye_dlc_ellipses_path = String( - required=True, - validate=check_read_access, - help="h5 filepath containing raw ellipse fits produced by Deep Lab Cuts of subject eye, pupil, and corneal reflections during experiment" - ) - eye_gaze_mapping_path = String( - required=False, - allow_none=True, - help="h5 filepath containing eye gaze behavior of the experiment's subject" - ) - pool_size = Int( - default=3, - help="number of child processes used to write probewise lfp files" - ) - optotagging_table_path = String( - required=False, - validate=check_read_access, - help="file at this path contains information about the optogenetic stimulation applied during this " - ) - session_metadata = Nested(SessionMetadata, allow_none=True, required=False, help="miscellaneous information describing this session") - - -class ProbeOutputs(RaisingSchema): - nwb_path = String(required=True) - id = Int(required=True) - - -class OutputSchema(RaisingSchema): - nwb_path = String(required=True, description='path to output file') - probe_outputs = Nested(ProbeOutputs, required=True, many=True) diff --git a/allensdk/brain_observatory/extract_running_speed/README.md b/allensdk/brain_observatory/extract_running_speed/README.md deleted file mode 100644 index 769b3e0436..0000000000 --- a/allensdk/brain_observatory/extract_running_speed/README.md +++ /dev/null @@ -1,25 +0,0 @@ -Extract running speed -===================== -Calculates an average running speed for the subject on each stimulus frame. - - -Running -------- -``` -python -m allensdk.brain_observatory.extract_running_speed --input_json <path to input json> --output_json <path to output json> -``` -See the schema file for detailed information about input json contents. - - -Input data ----------- -- Stimulus pickle : Written by camstim (http://aibspi/braintv/camstim). Contains information about the stimuli that were -presented in this experiment. -- Sync h5 : Contains information about the times at which each frame was presented. - - -Output data ------------ -- Running speeds h5 : Contains two tables. These are: - - running_speed : rows are intervals. Columns list start and stop times, mean velocities, and the net rotations from which those velocities are calculated. Known artifacts are removed, but the data are otherwise unfiltered. - - raw_data : rows are samples. Columns list acquisition times, signal and supply voltages, and net rotations since the last timestamp. \ No newline at end of file diff --git a/allensdk/brain_observatory/extract_running_speed/__init__.py b/allensdk/brain_observatory/extract_running_speed/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/extract_running_speed/__main__.py b/allensdk/brain_observatory/extract_running_speed/__main__.py deleted file mode 100644 index 43b9ea3750..0000000000 --- a/allensdk/brain_observatory/extract_running_speed/__main__.py +++ /dev/null @@ -1,147 +0,0 @@ -import warnings - -import numpy as np -import pandas as pd - -from allensdk.brain_observatory import sync_utilities -from allensdk.brain_observatory.argschema_utilities import \ - ArgSchemaParserPlus, \ - write_or_print_outputs -from allensdk.brain_observatory.sync_dataset import Dataset -from ._schemas import InputParameters, OutputParameters - -DEGREES_TO_RADIANS = np.pi / 180.0 - - -def check_encoder(parent, key): - if len(parent["encoders"]) != 1: - return False - if key not in parent["encoders"][0]: - return False - if len(parent["encoders"][0][key]) == 0: - return False - return True - - -def running_from_stim_file(stim_file, key, expected_length): - if "behavior" in stim_file["items"] and check_encoder( - stim_file["items"]["behavior"], key - ): - return stim_file["items"]["behavior"]["encoders"][0][key][:] - if "foraging" in stim_file["items"] and check_encoder( - stim_file["items"]["foraging"], key - ): - return stim_file["items"]["foraging"]["encoders"][0][key][:] - if key in stim_file: - return stim_file[key][:] - - warnings.warn(f"unable to read {key} from this stimulus file") - return np.ones(expected_length) * np.nan - - -def degrees_to_radians(degrees): - return np.array(degrees) * DEGREES_TO_RADIANS - - -def angular_to_linear_velocity(angular_velocity, radius): - return np.multiply(angular_velocity, radius) - - -def extract_running_speeds( - frame_times, dx_deg, vsig, vin, wheel_radius, subject_position, - use_median_duration=False -): - # the first interval does not have a known start time, so we can't compute - # an average velocity from dx - dx_rad = degrees_to_radians(dx_deg[1:]) - - start_times = frame_times[:-1] - end_times = frame_times[1:] - - durations = end_times - start_times - if use_median_duration: - angular_velocity = dx_rad / np.median(durations) - else: - angular_velocity = dx_rad / durations - - radius = wheel_radius * subject_position - linear_velocity = angular_to_linear_velocity(angular_velocity, radius) - - df = pd.DataFrame( - { - "start_time": start_times, - "end_time": end_times, - "velocity": linear_velocity, - "net_rotation": dx_rad, - } - ) - - # due to an acquisition bug (the buffer of raw orientations may be updated - # more slowly than it is read, leading to a 0 value for the change in - # orientation over an interval) there may be exact zeros in the velocity. - df = df[~(np.isclose(df["net_rotation"], 0.0))] - - return df - - -def main( - stimulus_pkl_path, sync_h5_path, output_path, wheel_radius, - subject_position, use_median_duration, **kwargs -): - stim_file = pd.read_pickle(stimulus_pkl_path) - sync_dataset = Dataset(sync_h5_path) - - # Why the rising edge? See Sweepstim.update in camstim. This method does: - # 1. updates the stimuli - # 2. updates the "items", causing a running speed sample to be acquired - # 3. sets the vsync line high - # 4. flips the buffer - frame_times = sync_dataset.get_edges( - "rising", Dataset.FRAME_KEYS, units="seconds" - ) - - # occasionally an extra set of frame times are acquired after the rest of - # the signals. We detect and remove these - frame_times = sync_utilities.trim_discontiguous_times(frame_times) - num_raw_timestamps = len(frame_times) - - dx_deg = running_from_stim_file(stim_file, "dx", num_raw_timestamps) - - if num_raw_timestamps != len(dx_deg): - raise ValueError( - f"found {num_raw_timestamps} rising edges on the vsync line, " - f"but only {len(dx_deg)} rotation samples" - ) - - vsig = running_from_stim_file(stim_file, "vsig", num_raw_timestamps) - vin = running_from_stim_file(stim_file, "vin", num_raw_timestamps) - - velocities = extract_running_speeds( - frame_times=frame_times, - dx_deg=dx_deg, - vsig=vsig, - vin=vin, - wheel_radius=wheel_radius, - subject_position=subject_position, - use_median_duration=use_median_duration - ) - - raw_data = pd.DataFrame( - {"vsig": vsig, "vin": vin, "frame_time": frame_times, "dx": dx_deg} - ) - - store = pd.HDFStore(output_path) - store.put("running_speed", velocities) - store.put("raw_data", raw_data) - store.close() - - return {"output_path": output_path} - - -if __name__ == "__main__": - mod = ArgSchemaParserPlus( - schema_type=InputParameters, output_schema_type=OutputParameters - ) - - output = main(**mod.args) - write_or_print_outputs(data=output, parser=mod) diff --git a/allensdk/brain_observatory/extract_running_speed/_schemas.py b/allensdk/brain_observatory/extract_running_speed/_schemas.py deleted file mode 100644 index 4ec30e7b27..0000000000 --- a/allensdk/brain_observatory/extract_running_speed/_schemas.py +++ /dev/null @@ -1,36 +0,0 @@ -from argschema import ArgSchema, ArgSchemaParser -from argschema.schemas import DefaultSchema -from argschema.fields import Nested, InputDir, String, Float, Dict, Int, Boolean - - -class InputParameters(ArgSchema): - output_path = String(required=True, help="write outputs to here") - stimulus_pkl_path = String( - required=True, - help="path to pkl file containing raw stimulus information", - ) - sync_h5_path = String( - required=True, - help="path to h5 file containing synchronization information", - ) - wheel_radius = Float(default=8.255, help="radius, in cm, of running wheel") - subject_position = Float( - default=2 / 3, - help="normalized distance of the subject from the center of the running wheel (1 is rim, 0 is center)", - ) - use_median_duration = Boolean( - default=True, - help="frame timestamps are often too noisy to use as the denominator in the velocity calculation. Can instead use the median frame duration." - ) - - -class OutputSchema(DefaultSchema): - input_parameters = Nested( - InputParameters, - description=("Input parameters the module " "was run with"), - required=True, - ) - - -class OutputParameters(OutputSchema): - output_path = String(required=True, help="path to output file") diff --git a/allensdk/brain_observatory/extract_running_speed/examples.ipynb b/allensdk/brain_observatory/extract_running_speed/examples.ipynb deleted file mode 100644 index a1e6555e30..0000000000 --- a/allensdk/brain_observatory/extract_running_speed/examples.ipynb +++ /dev/null @@ -1,2050 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Running speed module\n", - "\n", - "All BrainTV projects need to provide running speed data to end users. Currently each project does this differently, which makes the code hard to maintain and the user experience unpredictable.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "from pprint import pprint\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "import numpy as np\n", - "from scipy.ndimage import median_filter\n", - "\n", - "from allensdk.brain_observatory.extract_running_speed.__main__ import main" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def roundtrip(inputs):\n", - " output_path = main(**inputs)[\"output_path\"] \n", - " return pd.read_hdf(output_path, key=\"running_speed\")\n", - " \n", - "def midpoints(obt):\n", - " return obt[\"start_time\"] + (obt[\"end_time\"] - obt[\"start_time\"]) / 2\n", - "\n", - "def remove_outliers(data, filter_width=5, percentile=99.9999):\n", - " data = np.array(data)\n", - " filtered_data = median_filter(data, size=filter_width)\n", - " diffs = np.fabs(data - filtered_data)\n", - " data[np.where(diffs > np.percentile(diffs, percentile))[0]] = np.nan\n", - " return data" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "local_dir = Path(\"extract_running_speed_examples\")\n", - "\n", - "wheel_radius = 6.5 * 2.54 / 2\n", - "subject_position = 2 / 3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ecephys" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/nile/Desktop/715_running/allensdk/allensdk/brain_observatory/extract_running_speed/__main__.py:34: UserWarning: unable to read vsig from this stimulus file\n", - " warnings.warn(f\"unable to read {key} from this stimulus file\")\n", - "/home/nile/Desktop/715_running/allensdk/allensdk/brain_observatory/extract_running_speed/__main__.py:34: UserWarning: unable to read vin from this stimulus file\n", - " warnings.warn(f\"unable to read {key} from this stimulus file\")\n" - ] - } - ], - "source": [ - "ec_storage = Path(\n", - " \"/\", \"allen\", \"programs\", \"braintv\", \"production\", \"neuralcoding\", \n", - " \"prod0\", \"specimen_717038288\", \"ecephys_session_732592105\"\n", - ")\n", - "\n", - "ec_inputs = {\n", - " \"sync_h5_path\": ec_storage / Path(\"732592105_404553_20180808.sync\"),\n", - " \"stimulus_pkl_path\": ec_storage / Path(\"732592105_404553_20180808.stim.pkl\"),\n", - " \"output_path\": local_dir / Path(\"ecephys_running_speed.h5\"),\n", - " \"wheel_radius\": wheel_radius,\n", - " \"subject_position\": subject_position\n", - "}\n", - "\n", - "ec_obt = roundtrip(ec_inputs)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>start_time</th>\n", - " <th>end_time</th>\n", - " <th>velocity</th>\n", - " <th>net_rotation</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>21.52729</td>\n", - " <td>21.55997</td>\n", - " <td>24.954197</td>\n", - " <td>0.148183</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>21.55997</td>\n", - " <td>21.57787</td>\n", - " <td>42.648001</td>\n", - " <td>0.138716</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>21.57787</td>\n", - " <td>21.60883</td>\n", - " <td>23.930170</td>\n", - " <td>0.134624</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>21.60883</td>\n", - " <td>21.62547</td>\n", - " <td>45.849774</td>\n", - " <td>0.138632</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>21.62547</td>\n", - " <td>21.66045</td>\n", - " <td>21.959595</td>\n", - " <td>0.139578</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " start_time end_time velocity net_rotation\n", - "0 21.52729 21.55997 24.954197 0.148183\n", - "1 21.55997 21.57787 42.648001 0.138716\n", - "2 21.57787 21.60883 23.930170 0.134624\n", - "3 21.60883 21.62547 45.849774 0.138632\n", - "4 21.62547 21.66045 21.959595 0.139578" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ec_obt.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('<div/>');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", - " 'ui-helper-clearfix\"/>');\n", - " var titletext = $(\n", - " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", - " 'text-align: center; padding: 3px;\"/>');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('<div/>');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('<canvas/>');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('<canvas/>');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('<button/>');\n", - " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", - " 'ui-button-icon-only');\n", - " button.attr('role', 'button');\n", - " button.attr('aria-disabled', 'false');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - "\n", - " var icon_img = $('<span/>');\n", - " icon_img.addClass('ui-button-icon-primary ui-icon');\n", - " icon_img.addClass(image);\n", - " icon_img.addClass('ui-corner-all');\n", - "\n", - " var tooltip_span = $('<span/>');\n", - " tooltip_span.addClass('ui-button-text');\n", - " tooltip_span.html(tooltip);\n", - "\n", - " button.append(icon_img);\n", - " button.append(tooltip_span);\n", - "\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " var fmt_picker_span = $('<span/>');\n", - "\n", - " var fmt_picker = $('<select/>');\n", - " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", - " fmt_picker_span.append(fmt_picker);\n", - " nav_element.append(fmt_picker_span);\n", - " this.format_dropdown = fmt_picker[0];\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = $(\n", - " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", - " fmt_picker.append(option);\n", - " }\n", - "\n", - " // Add hover states to the ui-buttons\n", - " $( \".ui-button\" ).hover(\n", - " function() { $(this).addClass(\"ui-state-hover\");},\n", - " function() { $(this).removeClass(\"ui-state-hover\");}\n", - " );\n", - "\n", - " var status_bar = $('<span class=\"mpl-message\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "}\n", - "\n", - "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", - "}\n", - "\n", - "mpl.figure.prototype.send_message = function(type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "}\n", - "\n", - "mpl.figure.prototype.send_draw_message = function() {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", - " }\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1]);\n", - " fig.send_message(\"refresh\", {});\n", - " };\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", - " var x0 = msg['x0'] / mpl.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", - " var x1 = msg['x1'] / mpl.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0, 0, fig.canvas.width, fig.canvas.height);\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", - " var cursor = msg['cursor'];\n", - " switch(cursor)\n", - " {\n", - " case 0:\n", - " cursor = 'pointer';\n", - " break;\n", - " case 1:\n", - " cursor = 'default';\n", - " break;\n", - " case 2:\n", - " cursor = 'crosshair';\n", - " break;\n", - " case 3:\n", - " cursor = 'move';\n", - " break;\n", - " }\n", - " fig.rubberband_canvas.style.cursor = cursor;\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_message = function(fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message(\"ack\", {});\n", - "}\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function(fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " evt.data.type = \"image/png\";\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src);\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " evt.data);\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig[\"handle_\" + msg_type];\n", - " } catch (e) {\n", - " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", - " }\n", - " }\n", - " };\n", - "}\n", - "\n", - "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function(e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e)\n", - " e = window.event;\n", - " if (e.target)\n", - " targ = e.target;\n", - " else if (e.srcElement)\n", - " targ = e.srcElement;\n", - " if (targ.nodeType == 3) // defeat Safari bug\n", - " targ = targ.parentNode;\n", - "\n", - " // jQuery normalizes the pageX and pageY\n", - " // pageX,Y are the mouse positions relative to the document\n", - " // offset() returns the position of the element relative to the document\n", - " var x = e.pageX - $(targ).offset().left;\n", - " var y = e.pageY - $(targ).offset().top;\n", - "\n", - " return {\"x\": x, \"y\": y};\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * http://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys (original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object')\n", - " obj[key] = original[key]\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function(event, name) {\n", - " var canvas_pos = mpl.findpos(event)\n", - "\n", - " if (name === 'button_press')\n", - " {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * mpl.ratio;\n", - " var y = canvas_pos.y * mpl.ratio;\n", - "\n", - " this.send_message(name, {x: x, y: y, button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event)});\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "}\n", - "\n", - "mpl.figure.prototype.key_event = function(event, name) {\n", - "\n", - " // Prevent repeat events\n", - " if (name == 'key_press')\n", - " {\n", - " if (event.which === this._key)\n", - " return;\n", - " else\n", - " this._key = event.which;\n", - " }\n", - " if (name == 'key_release')\n", - " this._key = null;\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.which != 17)\n", - " value += \"ctrl+\";\n", - " if (event.altKey && event.which != 18)\n", - " value += \"alt+\";\n", - " if (event.shiftKey && event.which != 16)\n", - " value += \"shift+\";\n", - "\n", - " value += 'k';\n", - " value += event.which.toString();\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, {key: value,\n", - " guiEvent: simpleKeys(event)});\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", - " if (name == 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message(\"toolbar_button\", {name: name});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.close = function() {\n", - " comm.close()\n", - " };\n", - " ws.send = function(m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function(msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(msg['content']['data'])\n", - " });\n", - " return ws;\n", - "}\n", - "\n", - "mpl.mpl_figure_comm = function(comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = $(\"#\" + id);\n", - " var ws_proxy = comm_websocket_adapter(comm)\n", - "\n", - " function ondownload(figure, format) {\n", - " window.open(figure.imageObj.src);\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy,\n", - " ondownload,\n", - " element.get(0));\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element.get(0);\n", - " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", - " if (!fig.cell_info) {\n", - " console.error(\"Failed to find cell for figure\", id, fig);\n", - " return;\n", - " }\n", - "\n", - " var output_index = fig.cell_info[2]\n", - " var cell = fig.cell_info[0];\n", - "\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function(fig, msg) {\n", - " var width = fig.canvas.width/mpl.ratio\n", - " fig.root.unbind('remove')\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable()\n", - " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", - " fig.close_ws(fig, msg);\n", - "}\n", - "\n", - "mpl.figure.prototype.close_ws = function(fig, msg){\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "}\n", - "\n", - "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width/mpl.ratio\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message(\"ack\", {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () { fig.push_to_output() }, 1000);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items){\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) { continue; };\n", - "\n", - " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", - " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " event.shiftKey = false;\n", - " // Send a \"J\" for go to next cell\n", - " event.which = 74;\n", - " event.keyCode = 74;\n", - " manager.command_mode();\n", - " manager.handle_keydown(event);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4XuzYQREAAAgCQelf2h43awNWXuwcAQIECBAgQIAAAQIECBAgQIAAAQJZgWWTCUaAAAECBAgQIECAAAECBAgQIECAwBkAlYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgN4nvXoAACAASURBVAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAHBjAPwAAG8VJREFUgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIBAWMAAGH6uaAQIECBAgAABAgQIECBAgAABAgQMgDpAgAABAgQIECBAgAABAgQIECBAICxgAAw/VzQCBAgQIECAAAECBAgQIECAAAECBkAdIECAAAECBAgQIECAAAECBAgQIBAWMACGnysaAQIECBAgQIAAAQIECBAgQIAAAQOgDhAgQIAAAQIECBAgQIAAAQIECBAICxgAw88VjQABAgQIECBAgAABAgQIECBAgIABUAcIECBAgAABAgQIECBAgAABAgQIhAUMgOHnikaAAAECBAgQIECAAAECBAgQIEDAAKgDBAgQIECAAAECBAgQIECAAAECBMICBsDwc0UjQIAAAQIECBAgQIAAAQIECBAgYADUAQIECBAgQIAAAQIECBAgQIAAAQJhAQNg+LmiESBAgAABAgQIECBAgAABAgQIEDAA6gABAgQIECBAgAABAgQIECBAgACBsIABMPxc0QgQIECAAAECBAgQIECAAAECBAgYAHWAAAECBAgQIECAAAECBAgQIECAQFjAABh+rmgECBAgQIAAAQIECBAgQIAAAQIEDIA6QIAAAQIECBAgQIAAAQIECBAgQCAsYAAMP1c0AgQIECBAgAABAgQIECBAgAABAgZAHSBAgAABAgQIECBAgAABAgQIECAQFjAAhp8rGgECBAgQIECAAAECBAgQIECAAAEDoA4QIECAAAECBAgQIECAAAECBAgQCAsYAMPPFY0AAQIECBAgQIAAAQIECBAgQICAAVAHCBAgQIAAAQIECBAgQIAAAQIECIQFDIDh54pGgAABAgQIECBAgAABAgQIECBAwACoAwQIECBAgAABAgQIECBAgAABAgTCAgbA8HNFI0CAAAECBAgQIECAAAECBAgQIGAA1AECBAgQIECAAAECBAgQIECAAAECYQEDYPi5ohEgQIAAAQIECBAgQIAAAQIECBAwAOoAAQIECBAgQIAAAQIECBAgQIAAgbCAATD8XNEIECBAgAABAgQIECBAgAABAgQIGAB1gAABAgQIECBAgAABAgQIECBAgEBYwAAYfq5oBAgQIECAAAECBAgQIECAAAECBAyAOkCAAAECBAgQIECAAAECBAgQIEAgLGAADD9XNAIECBAgQIAAAQIECBAgQIAAAQIGQB0gQIAAAQIECBAgQIAAAQIECBAgEBYwAIafKxoBAgQIECBAgAABAgQIECBAgAABA6AOECBAgAABAgQIECBAgAABAgQIEAgLGADDzxWNAAECBAgQIECAAAECBAgQIECAgAFQBwgQIECAAAECBAgQIECAAAECBAiEBQyA4eeKRoAAAQIECBAgQIAAAQIECBAgQMAAqAMECBAgQIAAAQIECBAgQIAAAQIEwgIGwPBzRSNAgAABAgQIECBAgAABAgQIECBgANQBAgQIECBAgAABAgQIECBAgAABAmEBA2D4uaIRIECAAAECBAgQIECAAAECBAgQMADqAAECBAgQIECAAAECBAgQIECAAIGwgAEw/FzRCBAgQIAAAQIECBAgQIAAAQIECBgAdYAAAQIECBAgQIAAAQIECBAgQIDAt2PHNAAAAAjD/Luej6USKFyMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECDkAbIECAAAECBAgQIECAAAECBAgQIDAWcACOyxWNAAECBAgQIECAAAECBAgQIECAgAPQBggQIECAAAECBAgQIECAAAECBAiMBRyA43JFI0CAAAECBAgQIECAAAECBAgQIOAAtAECBAgQIECAAAECBAgQIECAAAECYwEH4Lhc0QgQIECAAAECBAgQIECAAAECBAg4AG2AAAECBAgQIECAAAECBAgQIECAwFjAATguVzQCBAgQIECAAAECBAgQIECAAAECAdJxA8G228vPAAAAAElFTkSuQmCC\" width=\"640\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[<matplotlib.lines.Line2D at 0x7f0ae44a50b8>]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%matplotlib notebook\n", - "plt.plot(midpoints(ec_obt), ec_obt[\"velocity\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visbeh" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "vb_storage = Path(\n", - " \"/allen/programs/braintv/production/visualbehavior/prod0/specimen_843387586/ophys_session_884528231/\"\n", - ")\n", - "\n", - "vb_inputs = {\n", - " \"sync_h5_path\": vb_storage / Path(\"884528231_sync.h5\"),\n", - " \"stimulus_pkl_path\": vb_storage / Path(\"884528231_stim.pkl\"),\n", - " \"output_path\": local_dir / Path(\"vb_running_speed.h5\"),\n", - " \"wheel_radius\": wheel_radius,\n", - " \"subject_position\": subject_position\n", - "}\n", - "\n", - "vb_obt = roundtrip(vb_inputs)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>start_time</th>\n", - " <th>end_time</th>\n", - " <th>velocity</th>\n", - " <th>net_rotation</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>6.46675</td>\n", - " <td>6.48474</td>\n", - " <td>0.265567</td>\n", - " <td>0.000868</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>6.48474</td>\n", - " <td>6.50459</td>\n", - " <td>3.175110</td>\n", - " <td>0.011452</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>6.50459</td>\n", - " <td>6.52496</td>\n", - " <td>0.428678</td>\n", - " <td>0.001587</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>6.52496</td>\n", - " <td>6.53461</td>\n", - " <td>-9.318928</td>\n", - " <td>-0.016341</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>6.53461</td>\n", - " <td>6.55456</td>\n", - " <td>1.133344</td>\n", - " <td>0.004108</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " start_time end_time velocity net_rotation\n", - "0 6.46675 6.48474 0.265567 0.000868\n", - "1 6.48474 6.50459 3.175110 0.011452\n", - "2 6.50459 6.52496 0.428678 0.001587\n", - "3 6.52496 6.53461 -9.318928 -0.016341\n", - "4 6.53461 6.55456 1.133344 0.004108" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vb_obt.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('<div/>');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", - " 'ui-helper-clearfix\"/>');\n", - " var titletext = $(\n", - " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", - " 'text-align: center; padding: 3px;\"/>');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('<div/>');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('<canvas/>');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('<canvas/>');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('<button/>');\n", - " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", - " 'ui-button-icon-only');\n", - " button.attr('role', 'button');\n", - " button.attr('aria-disabled', 'false');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - "\n", - " var icon_img = $('<span/>');\n", - " icon_img.addClass('ui-button-icon-primary ui-icon');\n", - " icon_img.addClass(image);\n", - " icon_img.addClass('ui-corner-all');\n", - "\n", - " var tooltip_span = $('<span/>');\n", - " tooltip_span.addClass('ui-button-text');\n", - " tooltip_span.html(tooltip);\n", - "\n", - " button.append(icon_img);\n", - " button.append(tooltip_span);\n", - "\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " var fmt_picker_span = $('<span/>');\n", - "\n", - " var fmt_picker = $('<select/>');\n", - " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", - " fmt_picker_span.append(fmt_picker);\n", - " nav_element.append(fmt_picker_span);\n", - " this.format_dropdown = fmt_picker[0];\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = $(\n", - " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", - " fmt_picker.append(option);\n", - " }\n", - "\n", - " // Add hover states to the ui-buttons\n", - " $( \".ui-button\" ).hover(\n", - " function() { $(this).addClass(\"ui-state-hover\");},\n", - " function() { $(this).removeClass(\"ui-state-hover\");}\n", - " );\n", - "\n", - " var status_bar = $('<span class=\"mpl-message\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "}\n", - "\n", - "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", - "}\n", - "\n", - "mpl.figure.prototype.send_message = function(type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "}\n", - "\n", - "mpl.figure.prototype.send_draw_message = function() {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", - " }\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1]);\n", - " fig.send_message(\"refresh\", {});\n", - " };\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", - " var x0 = msg['x0'] / mpl.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", - " var x1 = msg['x1'] / mpl.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0, 0, fig.canvas.width, fig.canvas.height);\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", - " var cursor = msg['cursor'];\n", - " switch(cursor)\n", - " {\n", - " case 0:\n", - " cursor = 'pointer';\n", - " break;\n", - " case 1:\n", - " cursor = 'default';\n", - " break;\n", - " case 2:\n", - " cursor = 'crosshair';\n", - " break;\n", - " case 3:\n", - " cursor = 'move';\n", - " break;\n", - " }\n", - " fig.rubberband_canvas.style.cursor = cursor;\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_message = function(fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message(\"ack\", {});\n", - "}\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function(fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " evt.data.type = \"image/png\";\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src);\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " evt.data);\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig[\"handle_\" + msg_type];\n", - " } catch (e) {\n", - " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", - " }\n", - " }\n", - " };\n", - "}\n", - "\n", - "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function(e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e)\n", - " e = window.event;\n", - " if (e.target)\n", - " targ = e.target;\n", - " else if (e.srcElement)\n", - " targ = e.srcElement;\n", - " if (targ.nodeType == 3) // defeat Safari bug\n", - " targ = targ.parentNode;\n", - "\n", - " // jQuery normalizes the pageX and pageY\n", - " // pageX,Y are the mouse positions relative to the document\n", - " // offset() returns the position of the element relative to the document\n", - " var x = e.pageX - $(targ).offset().left;\n", - " var y = e.pageY - $(targ).offset().top;\n", - "\n", - " return {\"x\": x, \"y\": y};\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * http://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys (original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object')\n", - " obj[key] = original[key]\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function(event, name) {\n", - " var canvas_pos = mpl.findpos(event)\n", - "\n", - " if (name === 'button_press')\n", - " {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * mpl.ratio;\n", - " var y = canvas_pos.y * mpl.ratio;\n", - "\n", - " this.send_message(name, {x: x, y: y, button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event)});\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "}\n", - "\n", - "mpl.figure.prototype.key_event = function(event, name) {\n", - "\n", - " // Prevent repeat events\n", - " if (name == 'key_press')\n", - " {\n", - " if (event.which === this._key)\n", - " return;\n", - " else\n", - " this._key = event.which;\n", - " }\n", - " if (name == 'key_release')\n", - " this._key = null;\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.which != 17)\n", - " value += \"ctrl+\";\n", - " if (event.altKey && event.which != 18)\n", - " value += \"alt+\";\n", - " if (event.shiftKey && event.which != 16)\n", - " value += \"shift+\";\n", - "\n", - " value += 'k';\n", - " value += event.which.toString();\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, {key: value,\n", - " guiEvent: simpleKeys(event)});\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", - " if (name == 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message(\"toolbar_button\", {name: name});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.close = function() {\n", - " comm.close()\n", - " };\n", - " ws.send = function(m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function(msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(msg['content']['data'])\n", - " });\n", - " return ws;\n", - "}\n", - "\n", - "mpl.mpl_figure_comm = function(comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = $(\"#\" + id);\n", - " var ws_proxy = comm_websocket_adapter(comm)\n", - "\n", - " function ondownload(figure, format) {\n", - " window.open(figure.imageObj.src);\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy,\n", - " ondownload,\n", - " element.get(0));\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element.get(0);\n", - " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", - " if (!fig.cell_info) {\n", - " console.error(\"Failed to find cell for figure\", id, fig);\n", - " return;\n", - " }\n", - "\n", - " var output_index = fig.cell_info[2]\n", - " var cell = fig.cell_info[0];\n", - "\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function(fig, msg) {\n", - " var width = fig.canvas.width/mpl.ratio\n", - " fig.root.unbind('remove')\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable()\n", - " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", - " fig.close_ws(fig, msg);\n", - "}\n", - "\n", - "mpl.figure.prototype.close_ws = function(fig, msg){\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "}\n", - "\n", - "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width/mpl.ratio\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message(\"ack\", {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () { fig.push_to_output() }, 1000);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items){\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) { continue; };\n", - "\n", - " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", - " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " event.shiftKey = false;\n", - " // Send a \"J\" for go to next cell\n", - " event.which = 74;\n", - " event.keyCode = 74;\n", - " manager.command_mode();\n", - " manager.handle_keydown(event);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4XuzdCbQdVZk37jcJIQwKEZBBkkAEIQEiBBIEwijIFJBmagVUQAkg4PC1DTTtABKEiHbT3/pLK6gMn6I2ggMKCMqkQCAJqKiE2UgQMGEUBJRA/qsOK+ncm3vuPefcqnOq9nnOWuk2ubt27f28++616kfVqSGLFy9eHD4ECBAgQIAAAQIECBAgQIAAAQIECCQpMEQAmGRdTYoAAQIECBAgQIAAAQIECBAgQIBATUAAaCEQIECAAAECBAgQIECAAAECBAgQSFhAAJhwcU2NAAECBAgQIECAAAECBAgQIECAgADQGiBAgAABAgQIECBAgAABAgQIECCQsIAAMOHimhoBAgQIECBAgAABAgQIECBAgAABAaA1QIAAAQIECBAgQIAAAQIECBAgQCBhAQFgwsU1NQIECBAgQIAAAQIECBAgQIAAAQICQGuAAAECBAgQIECAAAECBAgQIECAQMICAsCEi2tqBAgQIECAAAECBAgQIECAAAECBASA1gABAgQIECBAgAABAgQIECBAgACBhAUEgAkX19QIECBAgAABAgQIECBAgAABAgQICACtAQIECBAgQIAAAQIECBAgQIAAAQIJCwgAEy6uqREgQIAAAQIECBAgQIAAAQIECBAQAFoDBAgQIECAAAECBAgQIECAAAECBBIWEAAmXFxTI0CAAAECBAgQIECAAAECBAgQICAAtAYIECBAgAABAgQIECBAgAABAgQIJCwgAEy4uKZGgAABAgQIECBAgAABAgQIECBAQABoDRAgQIAAAQIECBAgQIAAAQIECBBIWEAAmHBxTY0AAQIECBAgQIAAAQIECBAgQICAANAaIECAAAECBAgQIECAAAECBAgQIJCwgAAw4eKaGgECBAgQIECAAAECBAgQIECAAAEBoDVAgAABAgQIECBAgAABAgQIECBAIGEBAWDCxTU1AgQIECBAgAABAgQIECBAgAABAgJAa4AAAQIECBAgQIAAAQIECBAgQIBAwgICwISLa2oECBAgQIAAAQIECBAgQIAAAQIEBIDWAAECBAgQIECAAAECBAgQIECAAIGEBQSACRfX1AgQIECAAAECBAgQIECAAAECBAgIAK0BAgQIECBAgAABAgQIECBAgAABAgkLCAATLq6pESBAgAABAgQIECBAgAABAgQIEBAAWgMECBAgQIAAAQIECBAgQIAAAQIEEhYQACZcXFMjQIAAAQIECBAgQIAAAQIECBAgIAC0BggQIECAAAECBAgQIECAAAECBAgkLCAATLi4pkaAAAECBAgQIECAAAECBAgQIEBAAGgNECBAgAABAgQIECBAgAABAgQIEEhYQACYcHFNjQABAgQIECBAgAABAgQIECBAgIAA0BogQIAAAQIECBAgQIAAAQIECBAgkLCAADDh4poaAQIECBAgQIAAAQIECBAgQIAAAQGgNUCAAAECBAgQIECAAAECBAgQIEAgYQEBYMLFNTUCBAgQIECAAAECBAgQIECAAAECAkBrgAABAgQIECBAgAABAgQIECBAgEDCAgLAhItragQIECBAgAABAgQIECBAgAABAgQEgNYAAQIECBAgQIAAAQIECBAgQIAAgYQFBIAJF9fUCBAgQIAAAQIECBAgQIAAAQIECAgArQECBAgQIECAAAECBAgQIECAAAECCQsIABMurqkRIECAAAECBAgQIECAAAECBAgQEABaAwQIECBAgAABAgQIECBAgAABAgQSFhAAJlxcUyNAgAABAgQIECBAgAABAgQIECAgALQGCBAgQIAAAQIECBAgQIAAAQIECCQsIABMuLimRoAAAQIECBAgQIAAAQIECBAgQEAAaA0QIECAAAECBAgQIECAAAECBAgQSFhAAJhwcU2NAAECBAgQIECAAAECBAgQIECAgADQGiBAgAABAgQIECBAgAABAgQIECCQsIAAMOHimhoBAgQIECBAgAABAgQIECBAgAABAaA1QIAAAQIECBAgQIAAAQIECBAgQCBhAQFgwsU1NQIECBAgQIAAAQIECBAgQIAAAQICQGuAAAECBAgQIECAAAECBAgQIECAQMICAsCEi2tqBAgQIECAAAECBAgQIECAAAECBASA1gABAgQIECBAgAABAgQIECBAgACBhAUEgAkX19QIECBAgAABAgQIECBAgAABAgQICACtAQIECBAgQIAAAQIECBAgQIAAAQIJCwgAEy6uqREgQIAAAQIECBAgQIAAAQIECBAQAFoDBAgQIECAAAECBAgQIECAAAECBBIWEAAmXFxTI0CAAAECBAgQIECAAAECBAgQICAAtAYIECBAgAABAgQIECBAgAABAgQIJCwgAEy4uKZGgAABAgQIECBAgAABAgQIECBAQABoDRAgQIAAAQIECBAgQIAAAQIECBBIWEAAmHBxTY0AAQIECBAgQIAAAQIECBAgQICAANAaIECAAAECBAgQIECAAAECBAgQIJCwgAAw4eKaGgECBAgQIECAAAECBAgQIECAAAEBoDVAgAABAgQIECBAgAABAgQIECBAIGEBAWDCxTU1AgQIECBAgAABAgQIECBAgAABAgJAa4AAAQIECBAgQIAAAQIECBAgQIBAwgICwISLa2oECBAgQIAAAQIECBAgQIAAAQIEBIDWAAECBAgQIECAAAECBAgQIECAAIGEBQSACRfX1AgQIECAAAECBAgQIECAAAECBAgIAK0BAgQIECBAgAABAgQIECBAgAABAgkLCAATLq6pESBAgAABAgQIECBAgAABAgQIEBAAWgMECBAgQIAAAQIECBAgQIAAAQIEEhYQACZcXFMjQIAAAQIECBAgQIAAAQIECBAgIAC0BggQIECAAAECBAgQIECAAAECBAgkLCAATLi4pkaAAAECBAgQIECAAAECBAgQIEBAAGgNECBAgAABAgQIECBAgAABAgQIEEhYQACYcHFNjQABAgQIECBAgAABAgQIECBAgIAA0BogQIAAAQIECBAgQIAAAQIECBAgkLCAADDh4poaAQIECBAgQIAAAQIECBAgQIAAAQGgNUCAAAECBAgQIECAAAECBAgQIEAgYQEBYMLFNTUCBAgQIECAAAECBAgQIECAAAECAkBrgAABAgQIECBAgAABAgQIECBAgEDCAgLAhItragQIECBAgAABAgQIECBAgAABAgQEgNYAAQIECBAgQIAAAQIECBAgQIAAgYQFBIAJF9fUCBAgQIAAAQIECBAgQIAAAQIECAgArQECBAgQIECAAAECBAgQIECAAAECCQsIABMurqkRIECAAAECBAgQIECAAAECBAgQEABaAwQIECBAgAABAgQIECBAgAABAgQSFhAAJlxcUyNAgAABAgQIECBAgAABAgQIECAgALQGCBAgQIAAAQIECBAgQIAAAQIECCQsIABMuLimRoAAAQIECBAgQIAAAQIECBAgQEAAaA0QIECAAAECBAgQIECAAAECBAgQSFhAAJhwcU2NAAECBAgQIECAAAECBAgQIECAgADQGiBAgAABAgQIECBAgAABAgQIECCQsIAAMOHimhoBAgQIECBAgAABAgQIECBAgAABAaA1QIAAAQIECBAgQIAAAQIECBAgQCBhAQFgwsU1NQIECBAgQIAAAQIECBAgQIAAAQICQGuAAAECBAgQIECAAAECBAgQIECAQMICAsCEi2tqBAgQIECAAAECBAgQIECAAAECBASA1gABAgQIECBAgAABAgQIECBAgACBhAUEgAkX19QIECBAgAABAgQIECBAgAABAgQICACtAQIECBAgQIAAAQIECBAgQIAAAQIJCwgAEy6uqREgQIAAAQIECBAgQIAAAQIECBAQAFoDBAgQIECAAAECBAgQIECAAAECBBIWEAAmXFxTI0CAAAECBAgQIECAAAECBAgQICAAtAYIECBAgAABAgQIECBAgAABAgQIJCwgAEy4uGWe2iuvvBK/+93vakN861vfGiussEKZh2tsBAgQIECAAAECBAgQIECgkgKLFi2KhQsX1sY+YcKEWGmllSo5D4MenIAAcHB+jm5RYPbs2bHtttu2eLTDCBAgQIAAAQIECBAgQIAAgWYFZs2aFZMnT272MO0TEBAAJlDEKk5BAFjFqhkzAQIECBAgQIAAAQIECFRZQABY5eoNbuwCwMH5ObpFgXnz5sXYsWNrR2cb0HrrrddiTw4jQIAAAQIECBAgQIAAAQIE6gk88cQTS5/A++Mf/xgbbrghrC4UEAB2YdHLMOXHHnssRo8eXRvK/PnzY9SoUWUYljEQIECAAAECBAgQIECAAIGkBFx/J1XOlicjAGyZzoGDEbABDUbPsQQIECBAgAABAgQIECBAoDEB19+NOaXeSgCYeoVLOj8bUEkLY1gECBAgQIAAAQIECBAgkJSA6++kytnyZASALdM5cDACNqDB6DmWAAECBAgQIECAAAECBAg0JuD6uzGn1FsJAFOvcEnnZwMqaWEMiwABAgQIECBAgAABAgSSEnD9nVQ5W56MALBlOgcORsAGNBg9xxIgQIAAAQIECBAgQIAAgcYEXH835pR6KwFg6hUu6fxsQCUtjGERIECAAAECBAgQIECAQFICrr+TKmfLkxEAtkznwMEI2IAGo+dYAgQIECBAgAABAgQIECDQmIDr78acUm8lAEy9wiWdnw2opIUxLAIECBAgQIAAAQIECBBISsD1d1LlbHkyAsCW6Rw4GAEb0GD0HEuAAAECBAgQIECAAAECBBoTcP3dmFPqrQSAqVe4pPOzAZW0MIZFgAABAgQIECBAgAABAkkJuP5OqpwtT0YA2DKdAwcjYAMajJ5jCRAgQIAAAQIECBAgQIBAYwKuvxtzSr2VADD1Cpd0fjagkhbGsAgQIECAAAECBAgQIEAgKQHX30mVs+XJCABbpnPgYARsQIPRcywBAgQIECBAgAABAgQIEGhMwPV3Y06ptxIApl7hks7PBlTSwhgWAQIECBAgQIAAAQIECCQl4Po7qXK2PBkBYMt0DhyMgA1oMHqOJUCAAAECBAgQIECAAAECjQm4/m7MKfVWAsDUK1zS+dmASloYwyJAgAABAgQIECBAgACBpARcfydVzpYnIwBsmc6BgxGwAQ1Gz7EECBAgQIAAAQIECBAgQKAxAdffjTml3koAmHqFSzo/G1BJC2NYBAgQIECAAAECBAgQIJCUgOvvpMrZ8mQEgC3TOXAwAjagweg5lgABAgQIECBAgAABAgQINCbg+rsxp9RbCQBTr3BJ52cDKmlhDIsAAQIECBAgQIAAAQIEkhJw/Z1UOVuejACwZToHDkbABjQYPccSIECAAAECBAgQIECAAIHGBFx/N+aUeisBYOoVLun8bEAlLYxhESBAgAABAgQIECBAgEBSAq6/kypny5MRALZM58DBCNiABqPnWAIECBAgQIAAAQIECBAg0JiA6+/GnFJvJQBMvcIlnZ8NqKSFMSwCBAgQIECAAAECBAgQSErA9XdS5Wx5MgLAlukcOBgBG9Bg9BxLgAABAgQIECBAgAABAgQaE3D93ZhT6q0EgKlXuKTzswGVtDCGRYAAAQIECBAgQIAAAQJJCbj+TqqcLU9GANgynQMHI2ADGoyeYwkQIECAAAECBAgQIECAQGMCrr8bc0q9lQAw9QqXdH42oJIWxrAIECBAgAABAgQIECBAICkB199JlbPlyQgAW6Zr/sAFCxbErFmzan9mz55d+/P000/XOjryyCPjkksu6bfTefPmxdixY5s68QYbbBDZcb0/u+66a9xyyy0N9bV48eKG2jXTyAbUjJa2BAgQIECAAAECBAgQIJCXwJ+fezle+vui2HjtN8WQIUPy6ra0/bj+Lm1p2jowAWAbufvbWIoKAPfcc8+47rrrBIBtrLNTESBAgAABAgQIECBAgEA5BS6fPT9O++Hv4rXXF8c/TxoV5x6yZTkHmuOoBIA5Yla4KwFgG4u3bAA4ZsyYGDduXFx//fW1ETQSAL766qtx//33Dzjic845J77zne/U2l122WVx+OGH1w0AJ02aFBdffHG/fW6xxRYDnrPZBjagZsW0J0CAAAECBAgQIECAAIHBCmz4b1f36OKGT+0SG731TYPtttTHu/4udXnaNjgBYNuoI04//fSYPHly7c8666xTezR3ySO9jQSAjQz1tddeiyxcfPzxx+PNb35z/OUvf4mVV165bgC4yy67xM0339xI17m2sQHlyqkzAgQIECBAgAABAgQIEGhAoHcAOP2ftogPbrdBA0dWt4nr7+rWLs+RCwDz1GyyryICwOxx37333rs2kqOPPjouuuiiPke15DsABYBNFk1zAgQIECBAgAABAgQIEKisgABwfowaNaqy9TPw1gUEgK3bDfrIIgLAI444Yunjv9mdfVnA19dHADjo8umAAAECBAgQIECAAAECBComIAAUAFZsyeY2XAFgbpTNd5R3APjCCy/EuuuuGy+99FJsuOGG8cgjj9R9o5EAsPl6OYIAAQIECBAgQIAAAQIEqi0gABQAVnsFtz56AWDrdoM+Mu8AMHuZx4c//OHauD772c/GmWeeWXeMSwLA7LsIN9hgg9rLRV555ZVYa621YptttomDDz44DjvssBg+fPig59lXB76DoBBWnRIgQIAAAQIECBAgQIBAPwICQAFgt/6CCAA7WPm8A8Dddttt6Qs9Hnzwwdh4440HDAD7m/5mm20WV1xxRYwfP75ppSzg6+/zxBNPxLbbbltrMn++DahpYAcQIECAAAECBAgQIECAQNMCAkDX300vmkQOEAB2sJB5BoCPPvpo7bHfxYsXxw477BC33XZbvzN797vfHUOHDo199903ttxyy1hzzTUje4T47rvvjgsuuCDmzp1bOz67Q3DWrFm1Nws38xkyZEjDzQWADVNpSIAAAQIECBAgQIAAAQKDEBAACgAHsXwqfagAsIPlyzMAPPvss+PTn/50bTZf+9rX4rjjjut3Zs8991yMHDmyzzavvvpqTJs2LS699NLazw888MD4wQ9+0JSUALApLo0JECBAgAABAgQIECBAoA0CAkABYBuWWSlPIQDsYFnyDACzx3Tvu+++GDFiRDz55JN1w71Gp7to0aLYYostat8NmH2yR3rXX3/9Rg+vte/v4xHghik1JECAAAECBAgQIECAAIGcBASAAsCcllLluhEAdrBkeQWA2SO673rXu2ozOfTQQ+Pyyy/PZVZf+tKX4pRTTqn1ddlll8Xhhx+eS79LAsXRo0fX+vMIcG6sOiJAgAABAgQIECBAgACBfgQEgALAbv0FEQB2sPJ5BYAnnXRSnH/++bWZ/OQnP4n99tsvl1ldffXVS/s699xz4+STT86lXwFgbow6IkCAAAECBAgQIECAAIEmBASAAsAmlktSTQWAHSxnHgFg9n196623Xjz99NOx9tprx5///OdYYYUVcpnVNddcE1OnTq31JQDMhVQnBAgQIECAAAECBAgQINBBAQGgALCDy6+jpxYAdpA/jwDwRz/6Ue0lHdnnk5/8ZJx33nm5zejLX/7y0rv+vv3tb8cRRxyRW9/ZdwR6BDg3Th0RIECAAAECBAgQIECAQAMCAkABYAPLJMkmAsAOljWPAPCggw6KH/7wh7VZ/PrXv46tttoqlxllLwF55zvfGXPnzq319+ijjy4N7PI4gQAwD0V9ECBAgAABAgQIECBAgEAzAgJAAWAz6yWltgLADlZzsAHgM888U3v89x//+EdMmDAh7rnnnoZmc9NNN8XEiRPrvik4e6x42rRpcemll9b623///eOqq65qqO9GGwkAG5XSjgABAgQIECBAgAABAgTyEhAACgDzWktV60cA2MaK3XrrrfHQQw8tPeNTTz219BHbKVOmxDHHHNNjNEcddVS/o/vv//7vOPHEE2ttssd1P/WpTzU0m6zfK6+8Mt773vfGrrvuGptuummsttpq8eKLL8Zdd90VF154Ydx77721vrLvFbzjjjti7NixDfXdaCMBYKNS2hEgQIAAAQIECBAgQIBAXgKtBoBPv/j3uGHugnj7W1eNSRuukddw2tKP6++2MJf+JALANpYoC96W3FXXyGkXL17cb7Ptttsu7rzzzhg2bFhkv9DrrrtuI91Go+PI7ir83ve+F5tttllD/TbTyAbUjJa2BAgQIECAAAECBAgQIJCHQCsB4PMvvxp7/OctsfCFv9eG8F/v2yr+aeL6eQynLX24/m4Lc+lPIgBsY4kaDd6WDKm/APDBBx+MTTbZpNZ07733jmuvvbbhmWTf63fdddfFzJkza3f6LVy4MLLHiUeMGBHrrLNOTJo0KQ455JDay0WycLGIjw2oCFV9EiBAgAABAgQIECBAgEB/AssFgAdsHh/cfsN+0f6/Gx6M//j5Az3azJsxtTLQrr8rU6pCByoALJRX5/UEbEDWBgECBAgQIECAAAECBAi0W6CVAPDA/74tfv3ocwLAdhfL+XIVEADmyqmzRgUEgI1KaUeAAAECBAgQIECAAAECeQkIAL0EJK+1VLV+BIBVq1gi4xUAJlJI0yBAgAABAgQIECBAgECFBASAAsAKLddchyoAzJVTZ40KCAAbldKOAAECBAgQIECAAAECBPISEAAKAPNaS1XrRwBYtYolMl4BYCKFNA0CBAgQIECAAAECBAhUSEAAKACs0HLNdagCwFw5ddaogACwUSntCBAgQIAAAQIECBAgQCAvAQGgADCvtVS1fgSAVatYIuMVACZSSNMgQIAAAQIECBAgQIBAhQQEgALACi3XXIcqAMyVU2eNCggAG5XSjgABAgQIECBAgAABAgTyEhAACgDzWktV60cAWLWKJTJeAWAihTQNAgQIECBAgAABAgQIVEhAACgArNByzXWoAsBcOXXWqIAAsFEp7QgQIECAAAECBAgQIEAgLwEBoAAwr7VUtX4EgFWrWCLjFQAmUkjTIECAAAECBAgQIECAQIUEBIACwAot11yHKgDMlVNnjQoIABuV0o4AAQIECBAgQIAAAQIE8hIQAAoA81pLVetHAFi1iiUyXgFgIoU0DQIECBAgQIAAAQIECFRIQAAoAKzQcs11qALAXDl11qiAALBRKe0IECBAgAABAgQIECBAIC8BAaAAMK+1VLV+BIBVq1gi4xUAJlJI0yBAgAABAgQIECBAgECFBASAAsAKLddchyoAzJVTZ40KCAAbldKOAAECBAgQIECAAAECBPISaCUAPOi/b4u7H32uxxDmzZia15AK78f1d+HElTiBALASZUpvkDag9GpqRgQIECBAgAABAgQIECi7gADQHYBlX6NFjU8AWJSsfvsVEABaIAQIECBAgAABAgQIECDQboHeAeCZB2weH9p+w36H4Q7AdlfJ+YoQEAAWoarPAQUEgAMSaUCAAAECBAgQIECAAAECOQsIAN0BmPOSqkx3AsDKlCqtgQoA06qn2RAgQIAAAQIECBAgQKAKAgJAAWAV1mkRYxQAFqGqzwEFBIADEmlAgAABAgQIECBAgAABAjkL+A5AAWDOS6oy3QkAK1OqtAYqAEyrnmZDgAABAgQIECBAgACB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Wr1Iltz6dv2dG2WlOxIAdrB8nQoAs8eO99prr9rMZ8yYEaeeemqfCnfccUdsv/32tZ+ddtppcfbZZ+emZQPKjVJHBAgQIECAAIHKCQgAK1cyAyZQqECeAeDixYtrY132K7iKeAR4x43Xim8f865CXfLq3PV3XpLV7kcA2MH6dSoAXPbx35kzZ8Z2223Xp0L2+O/qq68e2ZuCd95557jlllty07IB5UapIwIECBAgQIBA5QQEgJUrmQETKFQgrwDwqt8+Hv925T3x+uLFcc5BE+LAiaNq4y4iAMz6rfedgYVitdC56+8W0BI8RADYwaIONgDcdddd4/7774+nnnoqsjf2brzxxrHHHnvERz/60Vh//fXrzuyQQw6JK6+8svbzZ599tu6LQrKfb7nllnHPPffUHhlesGBBblo2oNwodUSAAAECBAgQqJyAALByJTNgAoUK5BEAvvb64ph45vXx11cW1ca66orD4jen7xnDhw0VAD72WIwePbrmMn/+/MheGOrTfQICwA7WfLABYL2hr7TSSvFf//Vfcdxxx/XZJLvj784774xVV1219qbf/j777bdfXH311bUmr7zySowYMaIhsSzg6+/zxBNPxLbbbmsDakhTIwIECBAgQIBAWgICwLTqaTYEBiuQRwA476m/xa5f7vnyyp9+bMfYYv3VBYACwMEu0SSOFwB2sIytBoDZ23sPOuig2vfzLUnxH3nkkdpdfVdccUUs+c6D7AUexx577HIz3HzzzePee++tvYn4ySef7Ffgfe97X1x++eW1NtmdhmuuuWZDYst+38JAB/gvEAMJ+TkBAgQIECBAIC0BAWBa9TQbAoMV6B0ArrHqinH3Z9/TVLcCwPpcnsBraikl21gA2MHSthIAZm/uzR73rRew/fSnP62Fg9mbfldZZZV4+OGHY9111+0xy4022iiywDALDx999NF+BT70oQ/Ft771rVqbZoI6AWAHF5ZTEyBAgAABAgRKLiAALHmBDI9AmwUEgMWCCwCL9a1K7wLADlaqlQCwkeGeddZZ8dnPfrbWNPvfn/70p3sc1o47AD0C3EiltCFAgAABAgQIdKfAB75xZ9z60FM9Jl+VL9PvzoqZNYFiBcoeAP7z12bGrHnPLIdQlX1LAFjs+q1K7wLADlaqqAAwe1lHdtdf9ijwe97znrj++ut7zLId3wE4EKsNaCAhPydAgAABAgQIpCsgAEy3tmZGoBUBAWArao0f4/q7cauUWwoAO1jdogLAbErZW3uz7+zbbLPN4g9/+EOPWXoLcAeL7tQECBAgQIAAAQIhALQICBBYVkAAWOx6EAAW61uV3gWAHaxUkQHg2muvHQsXLuwzAPzc5z4X2YtEss/MmTMjuyOwr8+iRYti5MiR8be//S123nnnuOWWW3LTsgHlRqkjAgQIECBAgEBpBR74ywvxs98/GePXWy3es9k6S8cpACxtyQyMQEcEBIDFsrv+Lta3Kr0LADtYqaICwCz4y97wmz0CvMcee8TPf/7zHrPMHgnea6+9av82Y8aMOPXUU/tUuOOOO2pvGs4+p512Wpx99tm5admAcqPUEQECBAgQIECglAKPPftS7P4ft8TfF71eG99/HLplHLzNqNr/FgCWsmQGRaBjAgLAYuldfxfrW5XeBYAdrFRRAeAXvvCF+MxnPlObWXan35L/vWSq//jHPyK7QzB7o/D48eNrjwj39dbe448/Pi644ILaYbNmzYrJkyfnpmUDyo1SRwQIECBAgACBUgr8y+W/iR/c/eceY1vyhfkCwFKWzKAIdExAAFgsvevvYn2r0rsAsIOVajYAzNo/++yzMXHixLqj/ulPfxoHH3xwZCHfyiuvHA8++GCsv/76y7Vf9jHgc889N04++eQebbJHg7PHfrPHgHfZZZe4+eabc5WyAeXKqTMCBAgQIECAQOkEtj/nhnji+VcEgKWrjAERKJ+AALDYmrj+Lta3Kr0LANtYqVtvvTUeeuihpWfMXtKxJHibMmVKHHPMMT1Gc9RRR/X4exbC7bbbbrXHcvfff//Ycssta3fyZZ9HHnkkrrjiitqf7NHf7HP++efHCSec0OcMX3jhhZg0aVI88MADtZ8fe+yx8f73v78WGt500021x31ffPHF2t9vv/322GqrrXKVsgHlyqkzAgQIECBAgEDpBASApSuJAREorYAAsNjSuP4u1rcqvQsA21ipLNC79NJLGz7jkiBvyQFLAsCBOlhllVXivPPOq4V6/X2yMHLfffet3SXY12e11VaLyy67LPbbb7+BTtn0z21ATZM5gAABAgQIECBQKQEBYKXKZbAEOiogACyW3/V3sb5V6V0A2MZKDTYAzO7au+qqq2pv7p0zZ0488cQTkd1FmD2m+5a3vCU233zz2H333Wt3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O9du8JFpvtltMSM5NmzY0E7D/Oijj4bqvZw/78MEfZ1gJtPQtm7d2o4O6Z1qNlSFDhpXAiUDQO+PcfXSGRcXe+fOnfYeJ6P8Epo9ePCg+euvv9rRcVlLL6PjEpJ98cUXQ93zZERd1oa9cuVKW1em6i5durT58ssvuxs2DQObz41MT75161bz6NGjZubMmc26devae6/O5h2vqyefOWlLlovItWU5gDlz5oMjJAkAAAbjSURBVLTBYD6DEvYrBP6LwLABoM+O/6LsdwkQKCUgACwlqR4CBAgQIECAAAECBAgQIECAAAECFQoIACvsFE0iQIAAAQIECBAgQIAAAQIECBAgUEpAAFhKUj0ECBAgQIAAAQIECBAgQIAAAQIEKhQQAFbYKZpEgAABAgQIECBAgAABAgQIECBAoJSAALCUpHoIECBAgAABAgQIECBAgAABAgQIVCggAKywUzSJAAECBAgQIECAAAECBAgQIECAQCkBAWApSfUQIECAAAECBAgQIECAAAECBAgQqFBAAFhhp2gSAQIECBAgQIAAAQIECBAgQIAAgVICAsBSkuohQIAAAQIECBAgQIAAAQIECBAgUKGAALDCTtEkAgQIECBAgAABAgQIECBAgAABAqUEBIClJNVDgAABAgQIECBAgAABAgQIECBAoEIBAWCFnaJJBAgQIECAAAECBAgQIECAAAECBEoJCABLSaqHAAECBAgQIECAAAECBAgQIECAQIUCAsAKO0WTCBAgQIAAAQIECBAgQIAAAQIECJQSEACWklQPAQIECBAgQIAAAQIECBAgQIAAgQoFBIAVdoomESBAgAABAgQIECBAgAABAgQIECglIAAsJakeAgQIECBAgAABAgQIECBAgAABAhUKCAAr7BRNIkCAAAECBAgQIECAAAECBAgQIFBKQABYSlI9BAgQIECAAAECBAgQIECAAAECBCoUEABW2CmaRIAAAQIECBAgQIAAAQIECBAgQKCUgACwlKR6CBAgQIAAAQIECBAgQIAAAQIECFQoIACssFM0iQABAgQIECBAgAABAgQIECBAgEApAQFgKUn1ECBAgAABAgQIECBAgAABAgQIEKhQQABYYadoEgECBAgQIECAAAECBAgQIECAAIFSAgLAUpLqIUCAAAECBAgQIECAAAECBAgQIFChgACwwk7RJAIECBAgQIAAAQIECBAgQIAAAQKlBASApSTVQ4AAAQIECBAgQIAAAQIECBAgQKBCAQFghZ2iSQQIECBAgAABAgQIECBAgAABAgRKCQgAS0mqhwABAgQIECBAgAABAgQIECBAgECFAgLACjtFkwgQIECAAAECBAgQIECAAAECBAiUEhAAlpJUDwECBAgQIECAAAECBAgQIECAAIEKBQSAFXaKJhEgQIAAAQIECBAgQIAAAQIECBAoJSAALCWpHgIECBAgQIAAAQIECBAgQIAAAQIVCggAK+wUTSJAgAABAgQIECBAgAABAgQIECBQSkAAWEpSPQQIECBAgAABAgQIECBAgAABAgQqFBAAVtgpmkSAAAECBAgQIECAAAECBAgQIECglIAAsJSkeggQIECAAAECBAgQIECAAAECBAhUKCAArLBTNIkAAQIECBAgQIAAAQIECBAgQIBAKQEBYClJ9RAgQIAAAQIECBAgQIAAAQIECBCoUEAAWGGnaBIBAgQIECBAgAABAgQIECBAgACBUgICwFKS6iFAgAABAgQIECBAgAABAgQIECBQoYAAsMJO0SQCBAgQIECAAAECBAgQIECAAAECpQQEgKUk1UOAAAECBAgQIECAAAECBAgQIECgQgEBYIWdokkECBAgQIAAAQIECBAgQIAAAQIESgkIAEtJqocAAQIECBAgQIAAAQIECBAgQIBAhQICwAo7RZMIECBAgAABAgQIECBAgAABAgQIlBIQAJaSVA8BAgQIECBAgAABAgQIECBAgACBCgUEgBV2iiYRIECAAAECBAgQIECAAAECBAgQKCUgACwlqR4CBAgQIECAAAECBAgQIECAAAECFQoIACvsFE0iQIAAAQIECBAgQIAAAQIECBAgUEpAAFhKUj0ECBAgQIAAAQIECBAgQIAAAQIEKhQQAFbYKZpEgAABAgQIECBAgAABAgQIECBAoJSAALCUpHoIECBAgAABAgQIECBAgAABAgQIVCggAKywUzSJAAECBAgQIECAAAECBAgQIECAQCkBAWApSfUQIECAAAECBAgQIECAAAECBAgQqFBAAFhhp2gSAQIECBAgQIAAAQIECBAgQIAAgVICAsBSkuohQIAAAQIECBAgQIAAAQIECBAgUKGAALDCTtEkAgQIECBAgAABAgQIECBAgAABAqUEBIClJNVDgAABAgQIECBAgAABAgQIECBAoEIBAWCFnaJJBAgQIECAAAECBAgQIECAAAECBEoJCABLSaqHAAECBAgQIECAAAECBAgQIECAQIUCAsAKO0WTCBAgQIAAAQIECBAgQIAAAQIECJQSEACWklQPAQIECBAgQIAAAQIECBAgQIAAgQoFBIAVdoomESBAgAABAgQIECBAgAABAgQIECgl8C++Gg5ru8ctOAAAAABJRU5ErkJggg==\" width=\"640\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[<matplotlib.lines.Line2D at 0x7f0aea986630>]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%matplotlib notebook\n", - "plt.subplots()\n", - "plt.plot(midpoints(vb_obt), remove_outliers(vb_obt[\"velocity\"]))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.isnan(remove_outliers(vb_obt[\"velocity\"])).sum()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Use" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def running_in_intervals(\n", - " running, intervals, start_key=\"start_time\", end_key=\"end_time\", data_key=\"velocity\"\n", - "):\n", - " # TODO: handle bounds\n", - " \n", - " intervals = np.array(intervals) # N X (start, end)\n", - " \n", - " start_indices = np.searchsorted(running[end_key], intervals[:, 0])\n", - " end_indices = np.searchsorted(running[end_key], intervals[:, 1])\n", - " \n", - " durations = running[end_key] - running[start_key]\n", - "\n", - " values = []\n", - " for ii, (start_index, end_index) in enumerate(zip(start_indices, end_indices)):\n", - " \n", - " start = intervals[ii, 0]\n", - " end = intervals[ii, 1]\n", - " \n", - " raw_weights = durations[start_index:end_index+1].values\n", - " raw_weights[0] -= start - running.loc[start_index, start_key]\n", - " raw_weights[-1] -= running.loc[end_index, end_key] - end\n", - " \n", - " weights = raw_weights / raw_weights.sum()\n", - " values.append(np.multiply(weights, running.loc[start_index:end_index, data_key]).sum())\n", - " \n", - " return values" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[3.25]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "running_in_intervals(\n", - " pd.DataFrame({\n", - " \"start_time\": np.array([0, 2, 4, 5, 6]),\n", - " \"end_time\": np.array([1.5, 4, 5, 6, 8]),\n", - " \"velocity\": np.arange(5)\n", - " }), \n", - " [(4.0, 8)]\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py37", - "language": "python", - "name": "py37" - }, - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/allensdk/brain_observatory/eye_tracking/__main__.py b/allensdk/brain_observatory/eye_tracking/__main__.py deleted file mode 100644 index e31c9ae41f..0000000000 --- a/allensdk/brain_observatory/eye_tracking/__main__.py +++ /dev/null @@ -1,113 +0,0 @@ -import os -import subprocess -import shutil -import contextlib -import logging -import marshmallow -import sys -import argschema -import uuid - -from _schemas import InputSchema, OutputSchema - -raise NotImplementedError('refactoring in progress') - -# def run_rule(rule, **kwargs): - -# dockerfile = kwargs.get('dockerfile') -# modelfile = kwargs.get('modelfile') -# video_input_file = kwargs.get('video_input_file') -# ellipse_output_data_file = kwargs.get('ellipse_output_data_file') - -# # Parameters: -# dlc_hash, fork = 'dev3', 'nicain' -# token = os.environ.get('TOKEN', None) -# container = str(uuid.uuid4()) -# model = os.path.splitext(os.path.basename(modelfile))[0] -# tag = 'dlc-eye-tracking:{model}'.format(model=model) - -# dlc_filename = 'dlc-eye-tracking.zip' -# video_input_file_ext = os.path.splitext(video_input_file)[1] -# internal_video_input_file = '/workdir/video_input_file{video_input_file_ext}'.format(video_input_file_ext=video_input_file_ext) -# internal_ellipse_output_data_file = '/workdir/{}'.format(os.path.basename(ellipse_output_data_file)) - -# if rule == 'clean': - -# pipe = subprocess.Popen(['docker', 'container', 'rm', container], stdout=subprocess.PIPE, stderr=subprocess.PIPE) -# outs, errs = pipe.communicate() -# if not (errs == b'') and b'No such container' not in errs: -# raise RuntimeError - -# elif rule == 'setup': -# run_rule('clean', **kwargs) -# command = ['curl', '-H', "Authorization: token {token}".format(token=token), "-L", "https://github.com/{fork}/dlc-eye-tracking/archive/{dlc_hash}.zip".format(dlc_hash=dlc_hash, fork=fork)] -# subprocess.check_call(command, stdout=open(dlc_filename, "wb")) - -# elif rule == 'build': -# run_rule('setup', **kwargs) -# shutil.copyfile(modelfile, 'modelfile.zip') -# subprocess.check_call(['docker', 'build', -# '--build-arg', 'MODELFILE={modelfile}'.format(modelfile='modelfile.zip'), -# '--build-arg', 'DLC_FILENAME={dlc_filename}'.format(dlc_filename=dlc_filename), -# '-t', tag, '-f', dockerfile, '.']) - -# elif rule == 'run': - -# output_filename_dict = {} -# output_filename_dict[internal_ellipse_output_data_file] = ellipse_output_data_file - -# arg_list = ['--video_input_file={}'.format(internal_video_input_file), -# '--ellipse_output_data_file={}'.format(internal_ellipse_output_data_file)] - -# if 'ellipse_output_video_file' in kwargs: -# internal_ellipse_output_video_file = '/workdir/{}'.format(os.path.basename(kwargs['ellipse_output_video_file'])) -# arg_list.append('--ellipse_output_video_file={}'.format(internal_ellipse_output_video_file)) -# output_filename_dict[internal_ellipse_output_video_file] = kwargs['ellipse_output_video_file'] - -# if 'points_output_video_file' in kwargs: -# internal_points_output_video_file = '/workdir/{}'.format(os.path.basename(kwargs['points_output_video_file'])) -# arg_list.append('--points_output_video_file={}'.format(internal_points_output_video_file)) -# output_filename_dict['/workdir/video_input_fileDeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000_labeled.mp4'] = kwargs['points_output_video_file'] - -# subprocess.check_call(['docker', 'create', '--name', container, -# '--device', '/dev/nvidia0:/dev/nvidia0', -# '--runtime=nvidia', -# '-e', 'SCRIPT=DLC_Eye_Tracking_and_Ellipse_Fitting.py', -# '-e', 'ARGS={}'.format(' '.join(arg_list)), -# tag]) -# subprocess.check_call(['docker', 'cp', video_input_file, '{container}:{internal_video_input_file}'.format(container=container, internal_video_input_file=internal_video_input_file)]) -# subprocess.check_call(['docker', 'start', container, '-i']) -# for internal_file, external_file in output_filename_dict.items(): -# subprocess.check_call(['docker', 'cp', '{container}:{internal_file}'.format(container=container, internal_file=internal_file), external_file]) -# subprocess.check_call(['docker', 'container', 'rm', container]) - -# elif rule == 'debug': -# subprocess.check_call(['docker', 'run', '--name', container, '-it', tag, '/bin/bash']) - -# elif rule == 'image-size': -# subprocess.check_call(['docker', 'image', 'inspect', tag, '--format={{.Size}}']) - - -# def main(): - -# logging.basicConfig(format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') - -# args = sys.argv[1:] - -# try: -# parser = argschema.ArgSchemaParser( -# args=args, -# schema_type=InputSchema, -# output_schema_type=OutputSchema, -# ) -# logging.info('Input successfully parsed') -# except marshmallow.exceptions.ValidationError as err: -# logging.error('Parsing failure') -# print(err) -# raise err - -# run_rule(**parser.args) - -# if __name__ == "__main__": - -# main() diff --git a/allensdk/brain_observatory/eye_tracking/_schemas.py b/allensdk/brain_observatory/eye_tracking/_schemas.py deleted file mode 100644 index 6110fb1f2b..0000000000 --- a/allensdk/brain_observatory/eye_tracking/_schemas.py +++ /dev/null @@ -1,21 +0,0 @@ -from argschema import ArgSchema, ArgSchemaParser -from argschema.schemas import DefaultSchema -from argschema.fields import LogLevel, String, Int, DateTime, Nested, Boolean, Float, List, Dict -from marshmallow import RAISE, ValidationError - -from allensdk.brain_observatory.argschema_utilities import check_read_access, check_write_access_overwrite, RaisingSchema - -class InputSchema(ArgSchema): - class Meta: - unknown = RAISE - log_level = LogLevel(default='INFO', description='set the logging level of the module') - rule = String(default='run', required=False) - dockerfile = String(required=True, validate=check_read_access, description='Dockerfile for image') - modelfile = String(required=True, validate=check_read_access, description='Zip file for model') - video_input_file = String(required=True, validate=check_read_access, description='Eye tracking movie') - ellipse_output_data_file = String(required=True, validate=check_write_access_overwrite, description='write outputs to here') - ellipse_output_video_file = String(required=False, validate=check_write_access_overwrite, description='write outputs to here') - points_output_video_file = String(required=False, validate=check_write_access_overwrite, description='write outputs to here') - -class OutputSchema(RaisingSchema): - output_path = String(required=True, description='write outputs to here') \ No newline at end of file diff --git a/allensdk/brain_observatory/eye_tracking/build.py b/allensdk/brain_observatory/eye_tracking/build.py deleted file mode 100644 index d2bc8b75ce..0000000000 --- a/allensdk/brain_observatory/eye_tracking/build.py +++ /dev/null @@ -1,150 +0,0 @@ -import argparse -import os -import subprocess -import contextlib -import shutil - - -CURR_FILE_DIR = os.path.dirname(os.path.abspath(__file__)) -DOCKERFILE_STAGE_1 = os.path.join(CURR_FILE_DIR, 'stage_1', 'Dockerfile') -DOCKERFILE_STAGE_2 = os.path.join(CURR_FILE_DIR, 'stage_2', 'Dockerfile') -DOCKERFILE_STAGE_3 = os.path.join(CURR_FILE_DIR, 'stage_3', 'Dockerfile') -DOCKERFILE_STAGE_4 = os.path.join(CURR_FILE_DIR, 'stage_4', 'Dockerfile') -MODELFILE_CACHE_LOC = os.path.join(CURR_FILE_DIR, 'stage_1', 'modelfile.zip') - - -def run_rule(rule, **kwargs): - - if rule == 'clean': - - with contextlib.suppress(FileNotFoundError): - os.remove(MODELFILE_CACHE_LOC) - - elif rule == 'build:stage-1': - - # Download and cache modelfile: - modelfile = kwargs.get('modelfile') - if not modelfile: - - if not os.path.exists(MODELFILE_CACHE_LOC): - from google.cloud import storage - - source_bucketname = 'dlc-eye-tracking-models' - source_filename = 'universal_eye_tracking-peterl-2019-07-10.zip' - target_filename = MODELFILE_CACHE_LOC - - client = storage.Client() - bucket = client.get_bucket(source_bucketname) - blob = bucket.blob(source_filename) - blob.download_to_filename(target_filename) - modelfile = MODELFILE_CACHE_LOC - assert os.path.exists(modelfile) - - subprocess.check_call(['docker', 'build', - '--build-arg', 'MODELFILE={modelfile}'.format(modelfile='modelfile.zip'), - '-t', 'dlc-eye-tracking:stage-1', '-f', DOCKERFILE_STAGE_1, 'stage_1']) - - elif rule == 'build:stage-2': - subprocess.check_call(['docker', 'build', - '-t', 'dlc-eye-tracking:stage-2', '-f', DOCKERFILE_STAGE_2, 'stage_2']) - - elif rule == 'build:stage-4': - subprocess.check_call(['docker', 'build', - '-t', 'dlc-eye-tracking:stage-4', '-f', DOCKERFILE_STAGE_4, 'stage_4']) - - elif rule == 'build:stage-3': - - # Download and cache modelfile: - modelfile = kwargs.get('modelfile') - if not modelfile: - - if not os.path.exists(MODELFILE_CACHE_LOC): - from google.cloud import storage - - source_bucketname = 'dlc-eye-tracking-models' - source_filename = 'universal_eye_tracking-peterl-2019-07-10.zip' - target_filename = MODELFILE_CACHE_LOC - - client = storage.Client() - bucket = client.get_bucket(source_bucketname) - blob = bucket.blob(source_filename) - blob.download_to_filename(target_filename) - modelfile = MODELFILE_CACHE_LOC - assert os.path.exists(modelfile) - shutil.copyfile(modelfile, os.path.join(CURR_FILE_DIR, 'stage_3', 'modelfile.zip')) - - subprocess.check_call(['docker', 'build', - '--build-arg', 'MODELFILE={modelfile}'.format(modelfile='modelfile.zip'), - '-t', 'dlc-eye-tracking:stage-3', '-f', DOCKERFILE_STAGE_3, 'stage_3']) - - elif rule in ['run:stage-1', 'run:stage-2']: - assert kwargs['modelfile'] is None - video_input_file = kwargs.get('video_input_file') - stage = rule.split(':')[-1] - - subprocess.check_call(['docker', 'run', - '--runtime=nvidia', - '-e', 'VIDEO_INPUT_FILE={}'.format(video_input_file), 'dlc-eye-tracking:{}'.format(stage)]) - - elif rule in ['tag:stage-1', 'tag:stage-2', 'tag:stage-3', 'tag:stage-4']: - stage = rule.split(':')[-1] - subprocess.check_call(['docker', 'tag', 'dlc-eye-tracking:{}'.format(stage), 'us.gcr.io/aibs-pilot/dlc-eye-tracking:{}'.format(stage)]) - - elif rule in ['tag-aibs:stage-1', 'tag-aibs:stage-2', 'tag-aibs:stage-3']: - stage = rule.split(':')[-1] - subprocess.check_call(['docker', 'tag', 'dlc-eye-tracking:{}'.format(stage), 'docker.aibs-artifactory.corp.alleninstitute.org/dlc-eye-tracking:{}'.format(stage)]) - - elif rule in ['push:stage-1', 'push:stage-2', 'push:stage-3', 'push:stage-4']: - stage = rule.split(':')[-1] - subprocess.check_call(['docker', 'push', 'us.gcr.io/aibs-pilot/dlc-eye-tracking:{}'.format(stage)]) - - elif rule in ['push-aibs:stage-1', 'push-aibs:stage-2', 'push-aibs:stage-3']: - stage = rule.split(':')[-1] - subprocess.check_call(['docker', 'push', 'docker.aibs-artifactory.corp.alleninstitute.org/dlc-eye-tracking:{}'.format(stage)]) - - elif rule == 'build:all': - run_rule('build:stage-1', **kwargs) - run_rule('build:stage-2', **kwargs) - run_rule('build:stage-3', **kwargs) - run_rule('build:stage-4', **kwargs) - - elif rule == 'tag:all': - run_rule('tag:stage-1', **kwargs) - run_rule('tag:stage-2', **kwargs) - run_rule('tag:stage-3', **kwargs) - run_rule('tag:stage-4', **kwargs) - - elif rule == 'push:all': - run_rule('push:stage-1', **kwargs) - run_rule('push:stage-2', **kwargs) - run_rule('push:stage-3', **kwargs) - run_rule('push:stage-4', **kwargs) - - elif rule == 'all': - run_rule('build:all', **kwargs) - run_rule('tag:all', **kwargs) - run_rule('push:all', **kwargs) - else: - - raise RuntimeError('Invalid rule: {}'.format(rule)) - - -if __name__ == "__main__": - - # Sanity check: - for filename in [DOCKERFILE_STAGE_1, DOCKERFILE_STAGE_2]: - assert os.path.exists(filename) - - parser = argparse.ArgumentParser() - parser.add_argument("rule", help="Rule to run", choices=['build:stage-1', 'run:stage-1', 'tag:stage-1', 'push:stage-1', - 'build:stage-2', 'run:stage-2', 'tag:stage-2', 'push:stage-2', - 'build:stage-3', 'tag:stage-3', 'push:stage-3', - 'build:stage-4', 'tag:stage-4', 'push:stage-4', - 'tag-aibs:stage-1', 'tag-aibs:stage-2', 'push-aibs:stage-1', 'push-aibs:stage-2', - 'clean', 'build:all', 'tag:all', 'push:all', 'all'], nargs='+') - parser.add_argument("--modelfile", help="DLC model zip file location", type=str) - parser.add_argument("--video_input_file", help="input artifact", type=str) - - args = vars(parser.parse_args()) - for rule in args.pop('rule'): - run_rule(rule, **args) diff --git a/allensdk/brain_observatory/eye_tracking/stage_1/.gitignore b/allensdk/brain_observatory/eye_tracking/stage_1/.gitignore deleted file mode 100644 index 6d99f6041f..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_1/.gitignore +++ /dev/null @@ -1 +0,0 @@ -modelfile.zip \ No newline at end of file diff --git a/allensdk/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py b/allensdk/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py deleted file mode 100644 index 9c15e39a2f..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py +++ /dev/null @@ -1,75 +0,0 @@ -import time -t0 = time.time() -import tensorflow as tf -import os -os.environ["DLClight"]="True" -import deeplabcut - -from matplotlib.patches import Ellipse -import matplotlib.pyplot as plt -from moviepy.video.io.bindings import mplfig_to_npimage -from moviepy.editor import * -import numpy as np -import collections -import pandas as pd -import sys -import re -import argparse -import logging - - -ch = logging.StreamHandler() -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -ch.setFormatter(formatter) -logger = logging.getLogger('dlc-eye-tracking') -logger.setLevel(logging.INFO) -logger.addHandler(ch) -logger.propagate = False - -parser = argparse.ArgumentParser() -parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") -parser.add_argument("--ellipse_output_video_file", type=str, required=False, help="Create ellipse video file") -parser.add_argument("--points_output_video_file", type=str, required=False, help="Create ellipse video file") -args = parser.parse_args() - -video_file_path = args.video_input_file -bucket_data_blobname = video_file_path[:-4] + 'DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000.h5' -output_data_file = '/workdir/{}'.format(bucket_data_blobname) - -from google.cloud import storage -client = storage.Client() -src_bucket = client.get_bucket('brain-observatory-eye-videos') -tgt_bucket = client.get_bucket('brain-observatory-dlc-eye-tracking') -blob = src_bucket.get_blob(video_file_path) -blob.download_to_filename(video_file_path) - -path_config_file = '/workdir/model/config.yaml' - -# ### Track points in video and generate h5 file: - -initialization_time = time.time() - t0 -dlc_analysis_t0 = time.time() -deeplabcut.analyze_videos(path_config_file, [video_file_path]) -dlc_analysis_time = time.time() - dlc_analysis_t0 - - -blob2 = tgt_bucket.blob(bucket_data_blobname) -blob2.upload_from_filename(filename=output_data_file) - - -logger.info('Initialization Time: {}'.format(initialization_time)) -logger.info('DLC Analysis Time: {}'.format(dlc_analysis_time)) -logger.info('Total Walltime: {}'.format(time.time()-t0)) - -#optional: display video in notebook -#animation.ipython_display(fps=fps) - - -#optional: plot some of the ellipse parameters over time -# %matplotlib inline - -# import seaborn as sns -# sns.set() -# raw = pd.read_hdf(flat_file, key='flat') -# raw.plot(y=['pupil_area', 'pupil_center_x', 'pupil_center_y', 'reflection_x', 'reflection_y'], subplots = True, layout=(1,5), figsize=[25,5], ls='', marker='.', ms=5, title = video_file_path) - diff --git a/allensdk/brain_observatory/eye_tracking/stage_1/Dockerfile b/allensdk/brain_observatory/eye_tracking/stage_1/Dockerfile deleted file mode 100644 index b848816691..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_1/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM tensorflow/tensorflow:1.13.2-gpu - -RUN apt-get update && apt-get install -y \ - wget \ - vim \ - python-wxtools \ - xvfb \ - curl \ - unzip \ - ffmpeg \ - git \ - bzip2 - -#Install MINICONDA -RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda.sh && \ - /bin/bash Miniconda.sh -b -p /opt/conda && \ - rm Miniconda.sh -ENV PATH /opt/conda/bin:$PATH - -#Install ANACONDA Environment -RUN conda create -y -n dlc python=3.6 imageio=2.3.0 numpy=1.14.5 six=1.11.0 wxPython anaconda && \ - /opt/conda/envs/dlc/bin/pip install tensorflow-gpu deeplabcut==2.0.7.2 google-cloud-storage - -# Setup working dir: -RUN mkdir -p /workdir -WORKDIR /workdir - -# Add trained model: -ARG MODELFILE -COPY ${MODELFILE} . -RUN mkdir -p /workdir/model -RUN unzip ${MODELFILE} -d ./tmp -RUN mv ${MODELFILE} tmp/*/* model - -# Add dlc-eye-tracking code: -COPY DLC_Eye_Tracking.py . - -# For debugging: -CMD ["/bin/bash", "-c", "source activate dlc && python DLC_Eye_Tracking.py --video_input_file=$VIDEO_INPUT_FILE"] diff --git a/allensdk/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py b/allensdk/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py deleted file mode 100644 index 0ccf1b2e71..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py +++ /dev/null @@ -1,147 +0,0 @@ -import time -t0 = time.time() -import os - -from matplotlib.patches import Ellipse -import matplotlib.pyplot as plt -from moviepy.video.io.bindings import mplfig_to_npimage -from moviepy.editor import * -import numpy as np -import collections -import pandas as pd -import sys -import re -import argparse -import logging -from ellipses import LSqEllipse -from google.cloud import storage - - -ch = logging.StreamHandler() -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -ch.setFormatter(formatter) -logger = logging.getLogger('dlc-ellipse-fitting') -logger.setLevel(logging.INFO) -logger.addHandler(ch) -logger.propagate = False - -parser = argparse.ArgumentParser() -parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") -args = parser.parse_args() - -video_file_path = args.video_input_file -h5file_path = video_file_path[:-4] + 'DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000.h5' - -ellipse_bucket_data_blobname = '{}.h5'.format(os.path.splitext(video_file_path)[0]) -ellipse_output_data_file = '/workdir/{}'.format(ellipse_bucket_data_blobname) - - -client = storage.Client() -src_bucket = client.get_bucket('brain-observatory-dlc-eye-tracking') -tgt_bucket = client.get_bucket('dlc-ellipse-fitting') -blob = src_bucket.get_blob(h5file_path) -blob.download_to_filename(h5file_path) - -path_config_file = '/workdir/model/config.yaml' - - -def fit_ellipse(h5name): - - df = pd.read_hdf(h5name).DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000 - - l_threshold = 0.8 #increased likelihood threshold for points that are allowed in fit - min_num_points = 6 - - # uses https://github.com/bdhammel/least-squares-ellipse-fitting - # based on the publication Halir, R., Flusser, J.: 'Numerically Stable Direct Least Squares Fitting of Ellipses' - - cr = [] - eye = [] - pupil = [] - - #new for loop - loop_t0 = time.time() - last_loop_time = time.time() - for j in range(len(df)): - - #fit ellipses to the pupil & eye points in 4/25 - - frac_completed = max(1,float(j))/len(df) - frac_rem = 1-frac_completed - tot_time_est = (time.time() - loop_t0)/frac_completed - progress_str = "{:10.2f} {:10.2f} {:5s} {:10.2f}".format(time.time()-last_loop_time, time.time()-loop_t0, "{0:.0%}".format(frac_completed), tot_time_est) - logger.info('Ellipse fit: {}'.format(progress_str)) - last_loop_time = time.time() - - x_data = df.filter(regex=("cr*")).iloc[j].values[0::3] - y_data = df.filter(regex=("cr*")).iloc[j].values[1::3] - l = df.filter(regex=("cr*")).iloc[j].values[2::3] - try: - if len(l[l>l_threshold]) >= min_num_points: #at least 6 tracked points for annotation quality data - lsqe = LSqEllipse() #make fitting object - lsqe.fit([x_data[l>l_threshold], y_data[l>l_threshold]]) - center, width, height, phi = lsqe.parameters() - ellipse_dict = {'center_x' : center[0], 'center_y' : center[1], 'width' : width, 'height' : height, 'phi' : phi} - else: - ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} - except Exception as e: - ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} - print(e) - cr.append(ellipse_dict) - #eye - x_data = df.filter(regex=("eye*")).iloc[j].values[0::3] - y_data = df.filter(regex=("eye*")).iloc[j].values[1::3] - l = df.filter(regex=("eye*")).iloc[j].values[2::3] - try: - if len(l[l>l_threshold]) >= min_num_points: #at least 6 tracked points for annotation quality data - lsqe = LSqEllipse() #make fitting object - lsqe.fit([x_data[l>l_threshold], y_data[l>l_threshold]]) - center, width, height, phi = lsqe.parameters() - ellipse_dict = {'center_x' : center[0], 'center_y' : center[1], 'width' : width, 'height' : height, 'phi' : phi} - else: - ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} - except Exception as e: - ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} - print(e) - eye.append(ellipse_dict) - - - #pupil - x_data = df.filter(regex=("pupil*")).iloc[j].values[0::3] - y_data = df.filter(regex=("pupil*")).iloc[j].values[1::3] - l = df.filter(regex=("pupil*")).iloc[j].values[2::3] - try: - if len(l[l>l_threshold]) >= min_num_points: #at least 6 tracked points for annotation quality data - lsqe = LSqEllipse() #make fitting object - lsqe.fit([x_data[l>l_threshold], y_data[l>l_threshold]]) - center, width, height, phi = lsqe.parameters() - ellipse_dict = {'center_x' : center[0], 'center_y' : center[1], 'width' : width, 'height' : height, 'phi' : phi} - else: - ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} - except Exception as e: - ellipse_dict = {'center_x' : np.nan, 'center_y' : np.nan, 'width' : np.nan, 'height' : np.nan, 'phi' : np.nan} - print(e) - pupil.append(ellipse_dict) - - pd.DataFrame(cr).to_hdf(ellipse_output_data_file, key='cr', mode='w') #overwrite file - pd.DataFrame(eye).to_hdf(ellipse_output_data_file, key='eye', mode='a') - pd.DataFrame(pupil).to_hdf(ellipse_output_data_file, key='pupil', mode='a') - - - blob2 = tgt_bucket.blob(ellipse_bucket_data_blobname) - blob2.upload_from_filename(filename=ellipse_output_data_file) - - - return cr, eye, pupil - -initialization_time = time.time() - t0 -ellipse_fit_t0 = time.time() -cr, eye, pupil = fit_ellipse(h5file_path) -ellipse_fit_time = time.time() - ellipse_fit_t0 - -logger.info('Initialization Time: {}'.format(initialization_time)) -logger.info('Ellipse Fit Time: {}'.format(ellipse_fit_time)) -logger.info('Total Walltime: {}'.format(time.time()-t0)) - - - diff --git a/allensdk/brain_observatory/eye_tracking/stage_2/Dockerfile b/allensdk/brain_observatory/eye_tracking/stage_2/Dockerfile deleted file mode 100644 index 6eb29242c1..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_2/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM tensorflow/tensorflow:1.13.2-gpu - -RUN apt-get update && apt-get install -y \ - wget \ - vim \ - python-wxtools \ - xvfb \ - curl \ - unzip \ - ffmpeg \ - git \ - bzip2 - -#Install MINICONDA -RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda.sh && \ - /bin/bash Miniconda.sh -b -p /opt/conda && \ - rm Miniconda.sh -ENV PATH /opt/conda/bin:$PATH - -#Install ANACONDA Environment -RUN conda create -y -n dlc python=3.6 imageio=2.3.0 numpy=1.14.5 six=1.11.0 wxPython anaconda && \ - /opt/conda/envs/dlc/bin/pip install google-cloud-storage deeplabcut==2.0.7.2 - -# Setup working dir: -RUN mkdir -p /workdir -WORKDIR /workdir - -# Add ellipses dependency: -RUN git clone https://github.com/AllenInstitute/least-squares-ellipse-fitting.git -ENV PYTHONPATH="$PYTHONPATH:/workdir/least-squares-ellipse-fitting" - -# Add dlc-eye-tracking code: -COPY DLC_Ellipse_Fitting.py . - -# For debugging: -# COPY 770233648_410314_20181030.eye.avi ./video_input_file.api -CMD ["/bin/bash", "-c", "source activate dlc && python DLC_Ellipse_Fitting.py --video_input_file=770233648_410314_20181030.eye.avi"] - -# Entrypoint -# CMD ["/bin/bash", "-c", "source activate dlc && python $SCRIPT $ARGS"] diff --git a/allensdk/brain_observatory/eye_tracking/stage_3/.gitignore b/allensdk/brain_observatory/eye_tracking/stage_3/.gitignore deleted file mode 100644 index 6d99f6041f..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_3/.gitignore +++ /dev/null @@ -1 +0,0 @@ -modelfile.zip \ No newline at end of file diff --git a/allensdk/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py b/allensdk/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py deleted file mode 100644 index a8032606c3..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py +++ /dev/null @@ -1,65 +0,0 @@ -import time -t0 = time.time() -import tensorflow as tf -import os -os.environ["DLClight"]="True" -import deeplabcut - -from matplotlib.patches import Ellipse -import matplotlib.pyplot as plt -from moviepy.video.io.bindings import mplfig_to_npimage -from moviepy.editor import * -import numpy as np -import collections -import pandas as pd -import sys -import re -import argparse -import logging - - -ch = logging.StreamHandler() -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -ch.setFormatter(formatter) -logger = logging.getLogger('dlc-eye-tracking') -logger.setLevel(logging.INFO) -logger.addHandler(ch) -logger.propagate = False - -parser = argparse.ArgumentParser() -parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") -parser.add_argument("--ellipse_output_video_file", type=str, required=False, help="Create ellipse video file") -parser.add_argument("--points_output_video_file", type=str, required=False, help="Create ellipse video file") -args = parser.parse_args() - -video_file_path = args.video_input_file -bucket_data_blobname = video_file_path[:-4] + 'DeepCut_resnet50_universal_eye_trackingJul10shuffle1_1030000_labeled.mp4' -output_data_file = '/workdir/{}'.format(bucket_data_blobname) - -from google.cloud import storage -client = storage.Client() -src_bucket = client.get_bucket('brain-observatory-eye-videos') -tgt_bucket = client.get_bucket('dlc-labeled-videos') -blob = src_bucket.get_blob(video_file_path) -blob.download_to_filename(video_file_path) -path_config_file = '/workdir/model/config.yaml' -initialization_time = time.time() - t0 - -dlc_analysis_t0 = time.time() -deeplabcut.analyze_videos(path_config_file, [video_file_path]) -dlc_analysis_time = time.time() - dlc_analysis_t0 - -dlc_movie_t0 = time.time() -deeplabcut.create_labeled_video(path_config_file, [video_file_path]) -dlc_movie_time = time.time() - dlc_movie_t0 - - - -blob2 = tgt_bucket.blob(bucket_data_blobname) -blob2.upload_from_filename(filename=output_data_file) - - -logger.info('Initialization Time: {}'.format(initialization_time)) -logger.info('DLC Analysis Time: {}'.format(dlc_analysis_time)) -logger.info('DLC Movie Generation Time: {}'.format(dlc_movie_time)) -logger.info('Total Walltime: {}'.format(time.time()-t0)) diff --git a/allensdk/brain_observatory/eye_tracking/stage_3/Dockerfile b/allensdk/brain_observatory/eye_tracking/stage_3/Dockerfile deleted file mode 100644 index 34250af85b..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_3/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM tensorflow/tensorflow:1.13.2-gpu - -RUN apt-get update && apt-get install -y \ - wget \ - vim \ - python-wxtools \ - xvfb \ - curl \ - unzip \ - ffmpeg \ - git \ - bzip2 - -#Install MINICONDA -RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda.sh && \ - /bin/bash Miniconda.sh -b -p /opt/conda && \ - rm Miniconda.sh -ENV PATH /opt/conda/bin:$PATH - -#Install ANACONDA Environment -RUN conda create -y -n dlc python=3.6 imageio=2.3.0 numpy=1.14.5 six=1.11.0 wxPython anaconda && \ - /opt/conda/envs/dlc/bin/pip install tensorflow-gpu deeplabcut==2.0.7.2 google-cloud-storage - -# Setup working dir: -RUN mkdir -p /workdir -WORKDIR /workdir - -# Add trained model: -ARG MODELFILE -COPY ${MODELFILE} . -RUN mkdir -p /workdir/model -RUN unzip ${MODELFILE} -d ./tmp -RUN mv ${MODELFILE} tmp/*/* model - -# Add dlc-eye-tracking code: -COPY DLC_Labeled_Video.py . - -# For debugging: -CMD ["/bin/bash", "-c", "source activate dlc && python DLC_Labeled_Video.py --video_input_file=$VIDEO_INPUT_FILE"] diff --git a/allensdk/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py b/allensdk/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py deleted file mode 100644 index 9bfb0cab4f..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py +++ /dev/null @@ -1,108 +0,0 @@ -import time -t0 = time.time() -import os - -from matplotlib.patches import Ellipse -import matplotlib.pyplot as plt -from moviepy.video.io.bindings import mplfig_to_npimage -from moviepy.editor import * -import numpy as np -import collections -import pandas as pd -import sys -import re -import argparse -import logging -from ellipses import LSqEllipse -from google.cloud import storage - - -ch = logging.StreamHandler() -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') -ch.setFormatter(formatter) -logger = logging.getLogger('dlc-ellipse-fitting') -logger.setLevel(logging.INFO) -logger.addHandler(ch) -logger.propagate = False - -parser = argparse.ArgumentParser() -parser.add_argument("--video_input_file", type=str, required=True, help="path to video file, mp4 or avi") -args = parser.parse_args() - -video_file_path = args.video_input_file -ellipse_bucket_data_blobname = '{}.h5'.format(os.path.splitext(video_file_path)[0]) -source_ellipse_data_file = '/workdir/{}'.format(ellipse_bucket_data_blobname) -source_ellipse_data_file = ellipse_bucket_data_blobname - -client = storage.Client() -fit_src_bucket = client.get_bucket('dlc-ellipse-fitting') -blob = fit_src_bucket.get_blob(ellipse_bucket_data_blobname) -blob.download_to_filename(source_ellipse_data_file) - -movie_src_bucket = client.get_bucket('brain-observatory-eye-videos') -blob = movie_src_bucket.get_blob(video_file_path) -blob.download_to_filename(video_file_path) - -ellipse_output_blob_name = "{}_ellipse_output_video_file.mp4".format(os.path.splitext(video_file_path)[0]) -ellipse_output_video_file = "/workdir/{}".format(ellipse_output_blob_name) -ellipse_output_video_file = ellipse_output_blob_name - -cr = pd.read_hdf(source_ellipse_data_file, key='cr') -eye = pd.read_hdf(source_ellipse_data_file, key='eye') -pupil = pd.read_hdf(source_ellipse_data_file, key='pupil') - -def make_frame(t): - - fi = np.int(np.round(t*fps)) - - ax.clear() - ax.imshow(clip.get_frame(t)) - #that is the pupi; ellipse in red - try: - ellipse = Ellipse((cr.loc[fi]['center_x'], cr.loc[fi]['center_y']), 2*cr.loc[fi]['width'], 2*cr.loc[fi]['height'], np.rad2deg(cr.loc[fi]['phi']), alpha=0.8, ec='r', fc=None, lw=2, fill=False) - ax.add_patch(ellipse) - except Exception as e: - print(e) - #that is the eye ellipse in green - try: - ellipse = Ellipse((eye.loc[fi]['center_x'], eye.loc[fi]['center_y']), 2*eye.loc[fi]['width'], 2*eye.loc[fi]['height'], np.rad2deg(eye.loc[fi]['phi']), alpha=0.8, ec='g', fc=None, lw=2, fill=False) - ax.add_patch(ellipse) - except Exception as e: - print(e) - - #Corneal reflection in blue - try: - ellipse = Ellipse((pupil.loc[fi]['center_x'], pupil.loc[fi]['center_y']), 2*pupil.loc[fi]['width'], 2*pupil.loc[fi]['height'], np.rad2deg(pupil.loc[fi]['phi']), alpha=0.8, ec='b', fc=None, lw=2, fill=False) - ax.add_patch(ellipse) - ax.set_axis_off() - except Exception as e: - print(e) - - return mplfig_to_npimage(fig) - -initialization_time = time.time() - t0 -ellipse_video_t0 = time.time() - -fps = 30.0 -clip = VideoFileClip(video_file_path) -fig, ax = plt.subplots() -fig.set_size_inches([6.4, 4.8], forward=True) -ax.set_xlim(0, clip.size[0]) -ax.set_ylim(0, clip.size[1]) -fig.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=None, hspace=None) - -animation = VideoClip(make_frame, duration=clip.duration).resize(newsize=clip.size) - -animation.write_videofile(ellipse_output_video_file, fps=fps) -tgt_bucket = client.get_bucket('dlc-ellipse-videos') -blob2 = tgt_bucket.blob(ellipse_output_blob_name) -blob2.upload_from_filename(filename=ellipse_output_video_file) - -ellipse_video_time = time.time() - ellipse_video_t0 - -logger.info('Initialization Time: {}'.format(initialization_time)) -# logger.info('Ellipse Video Time: {}'.format(ellipse_video_time)) -logger.info('Total Walltime: {}'.format(time.time()-t0)) - - - diff --git a/allensdk/brain_observatory/eye_tracking/stage_4/Dockerfile b/allensdk/brain_observatory/eye_tracking/stage_4/Dockerfile deleted file mode 100644 index 088aa55ab1..0000000000 --- a/allensdk/brain_observatory/eye_tracking/stage_4/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM tensorflow/tensorflow:1.13.2-gpu - -RUN apt-get update && apt-get install -y \ - wget \ - vim \ - python-wxtools \ - xvfb \ - curl \ - unzip \ - ffmpeg \ - git \ - bzip2 - -#Install MINICONDA -RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda.sh && \ - /bin/bash Miniconda.sh -b -p /opt/conda && \ - rm Miniconda.sh -ENV PATH /opt/conda/bin:$PATH - -#Install ANACONDA Environment -RUN conda create -y -n dlc python=3.6 imageio=2.3.0 numpy=1.14.5 six=1.11.0 wxPython anaconda && \ - /opt/conda/envs/dlc/bin/pip install google-cloud-storage deeplabcut==2.0.7.2 - -# Setup working dir: -RUN mkdir -p /workdir -WORKDIR /workdir - -# Add ellipses dependency: -RUN git clone https://github.com/AllenInstitute/least-squares-ellipse-fitting.git -ENV PYTHONPATH="$PYTHONPATH:/workdir/least-squares-ellipse-fitting" - -# Add dlc-eye-tracking code: -COPY DLC_Ellipse_Video.py . - -# For debugging: -# COPY 770233648_410314_20181030.eye.avi ./video_input_file.api -CMD ["/bin/bash", "-c", "source activate dlc && python DLC_Ellipse_Video.py --video_input_file=770233648_410314_20181030.eye.avi"] - -# Entrypoint -# CMD ["/bin/bash", "-c", "source activate dlc && python $SCRIPT $ARGS"] diff --git a/allensdk/brain_observatory/findlevel.py b/allensdk/brain_observatory/findlevel.py deleted file mode 100644 index 27a06c36c1..0000000000 --- a/allensdk/brain_observatory/findlevel.py +++ /dev/null @@ -1,51 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np - - -def findlevel(inwave, threshold, direction='both'): - temp = inwave - threshold - if (direction.find("up") + 1): - crossings = np.nonzero(np.ediff1d(np.sign(temp), to_begin=0) > 0) - elif (direction.find("down") + 1): - crossings = np.nonzero(np.ediff1d(np.sign(temp), to_begin=0) < 0) - else: - crossings = np.nonzero(np.ediff1d(np.sign(temp), to_begin=0)) - - if len(crossings) == 0 or len(crossings[0]) == 0: - return None - - return crossings[0][0] diff --git a/allensdk/brain_observatory/gaze_mapping/README.md b/allensdk/brain_observatory/gaze_mapping/README.md deleted file mode 100644 index ccfbcd1b0e..0000000000 --- a/allensdk/brain_observatory/gaze_mapping/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# Eye tracking gaze mapping - -This module takes `eye_tracking` pupil and corneal reflection (CR) ellipse -fits and uses information about the eye tracking rig geometry -(subject position, monitor position, camera position, LED position) in order -to map gaze location in terms of monitor screen coordinates. - -Running the module ----- -In an environment which has AllenSDK installed one can run: - -`python -m allensdk.brain_observatory.gaze_mapping --help` - - -Eye tracking rig geometry conventions ----- - -1. Assumes eye is spherical (with radius of 0.1682 cm) - -2. 'Eye coordinate system' (ECS) with origin (x=0, y=0, z=0) located at - the center of the right eye. - - ECS: - - +X: subject's right side - - +Y: subject's anterior - - +Z: subject's dorsal - -3. Position of monitor screen center, camera lens center, and led (x, y, z) - are expressed in terms of ECS. - - (e.g. camera position of x=130, y=0, z=0 means that camera's lens center - is 130 cm to the right of the center of the right eye) - -4. Monitor and camera have a different coordinate systems from the eye - and are as follows for the monitor (MCS) and camera lens (CCS) - coordinate systems. - - MCS: - - +X: right side of screen when looking directly at screen - - +Y: top half of screen when looking directly at screen - - +Z: Normal to MCS XY plane and pointed directly at center of the right eye - - CCS: - - +X: left side of camera image (right side of camera if looking toward front of camera) - - +Y: top half of camera image - - +Z: Normal to MCS XY plane and pointed directly at center of the right eye - -5. Provided monitor 'rotations' are applied in the MCS - -6. Provided camera 'rotations' are applied in the CCS - -7. Eye tracking video images are presented as if looking at right eye with - subject anterior to right of image and subject posterior to the left of - image. (camera is actually pointed at a dichroic mirror but video frames are - compensated [rotated 180 degrees about y-axis] prior to video upload) - -General strategy ----- - -1. Determine where virtual image of LED is located (in ECS) by treating eye as - a spherical convex mirror. - -2. Determine the location of the pupil center in terms of ECS. - - In CCS, calculate the delta between the pupil center and corneal reflection. - - Find the transform that will convert from ECS -> CCS. - - Convert the LED virtual image location determined in `1.` to CCS. - - Using CR transformed LED virtual image as a reference point, - apply delta to it, in order to get pupil estimates (in CCS). - - Filter pupil estimates (remove any estimates that would result in a - pupil location outside of eye radius). - - Undo ECS -> CCS transform to get pupil location estimates in ECS. - -3. Project a ray from origin through an estimated pupil position (`2.`) in - order to determine the point (in ECS) at which it intersects a plane - representing the monitor. - - Compute the unit normal vector for the monitor plane (in MCS) - - Find the transform that will convert from MCS -> ECS and apply it to - the monitor unit vector. - - Project through estimated pupil positions to find intersection - points with monitor plane (in ECS). - -4. Transform monitor and gaze-ray intersection point (`3.`) from ECS -> MCS \ No newline at end of file diff --git a/allensdk/brain_observatory/gaze_mapping/__init__.py b/allensdk/brain_observatory/gaze_mapping/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/gaze_mapping/__main__.py b/allensdk/brain_observatory/gaze_mapping/__main__.py deleted file mode 100644 index 71d17fb946..0000000000 --- a/allensdk/brain_observatory/gaze_mapping/__main__.py +++ /dev/null @@ -1,346 +0,0 @@ -import logging -import sys -from pathlib import Path -from typing import Dict - -import numpy as np -import pandas as pd -from argschema import ArgSchemaParser - - -import allensdk -from allensdk.brain_observatory.argschema_utilities import ( - write_or_print_outputs -) -from allensdk.brain_observatory.gaze_mapping._schemas import ( - InputSchema, - OutputSchema -) -from allensdk.brain_observatory.gaze_mapping._gaze_mapper import ( - compute_circular_areas, - compute_elliptical_areas, - GazeMapper -) -from allensdk.brain_observatory.gaze_mapping._filter_utils import ( - post_process_areas, - post_process_cr, -) - -from allensdk.brain_observatory.sync_dataset import Dataset -import allensdk.brain_observatory.sync_utilities as su - - -def load_ellipse_fit_params(input_file: Path) -> Dict[str, pd.DataFrame]: - """Load Deep Lab Cut (DLC) ellipse fit h5 data as a dictionary of pandas - DataFrames. - - Parameters - ---------- - input_file : Path - Path to DLC .h5 file containing ellipse fits for pupil, - cr (corneal reflection), and eye. - - Returns - ------- - Dict[str, pd.DataFrame] - Dictionary where keys specify name of ellipse fit param type and values - are pandas DataFrames containing ellipse fit params. - - Raises - ------ - RuntimeError - If pupil, cr, and eye ellipse fits don't have the same number of rows. - """ - # TODO: Some ellipses.h5 files have the 'cr' key as complex type instead of - # float. For now, when loading ellipses.h5 files, always coerce to float - # but this should eventually be resolved upstream... - pupil_params = pd.read_hdf(input_file, key="pupil").astype(float) - cr_params = pd.read_hdf(input_file, key="cr").astype(float) - eye_params = pd.read_hdf(input_file, key="eye").astype(float) - - num_frames_match = ((pupil_params.shape[0] == cr_params.shape[0]) - and (cr_params.shape[0] == eye_params.shape[0])) - if not num_frames_match: - raise RuntimeError("The number of frames for ellipse fits don't " - "match when they should: " - f"pupil_params ({pupil_params.shape[0]}), " - f"cr_params ({cr_params.shape[0]}), " - f"eye_params ({eye_params.shape[0]}).") - - return {"pupil_params": pupil_params, - "cr_params": cr_params, - "eye_params": eye_params} - - -def preprocess_input_args(parser_args: dict) -> dict: - """Preprocess arguments obtained by argschema. - - 1) Converts individual coordinate/rotation fields to numpy - position/rotation arrays. - - 2) Convert all arguments in millimeters to centimeters - - Parameters - ---------- - parser_args (dict): Parsed args obtained from argschema. - - Returns - ------- - dict: Repackaged args. - """ - new_args: dict = {} - - new_args.update(load_ellipse_fit_params(parser_args["input_file"])) - - new_args["session_sync_file"] = parser_args["session_sync_file"] - new_args["output_file"] = parser_args["output_file"] - - monitor_position = np.array([parser_args["monitor_position_x_mm"], - parser_args["monitor_position_y_mm"], - parser_args["monitor_position_z_mm"]]) / 10 - new_args["monitor_position"] = monitor_position - - monitor_rotations_deg = np.array([parser_args["monitor_rotation_x_deg"], - parser_args["monitor_rotation_y_deg"], - parser_args["monitor_rotation_z_deg"]]) - new_args["monitor_rotations"] = np.radians(monitor_rotations_deg) - - camera_position = np.array([parser_args["camera_position_x_mm"], - parser_args["camera_position_y_mm"], - parser_args["camera_position_z_mm"]]) / 10 - new_args["camera_position"] = camera_position - - camera_rotations_deg = np.array([parser_args["camera_rotation_x_deg"], - parser_args["camera_rotation_y_deg"], - parser_args["camera_rotation_z_deg"]]) - new_args["camera_rotations"] = np.radians(camera_rotations_deg) - - led_position = np.array([parser_args["led_position_x_mm"], - parser_args["led_position_y_mm"], - parser_args["led_position_z_mm"]]) / 10 - new_args["led_position"] = led_position - new_args["eye_radius_cm"] = parser_args["eye_radius_cm"] - new_args["cm_per_pixel"] = parser_args["cm_per_pixel"] - - new_args["equipment"] = parser_args["equipment"] - new_args["date_of_acquisition"] = parser_args["date_of_acquisition"] - new_args["eye_video_file"] = parser_args["eye_video_file"] - return new_args - - -def run_gaze_mapping(pupil_parameters: pd.DataFrame, - cr_parameters: pd.DataFrame, - eye_parameters: pd.DataFrame, - monitor_position: np.ndarray, - monitor_rotations: np.ndarray, - camera_position: np.ndarray, - camera_rotations: np.ndarray, - led_position: np.ndarray, - eye_radius_cm: float, - cm_per_pixel: float) -> dict: - """Map gaze positions onto monitor coordinates and - calculate eye/pupil areas - - Note: Monitor and Camera positions/rotations are in their own coordinate - systems which have are different from the eye coordinate system. - - Example: Z-axis for monitor and camera are aligned with X-axis for eye - coordinate system - - Parameters - ---------- - pupil_parameters (pd.DataFrame): A table of pupil parameters with - 5 columns ("center_x", "center_y", "height", "phi", "width") - and n-row timepoints. - cr_parameters (pd.DataFrame): A table of corneal reflection params with - 5 columns ("center_x", "center_y", "height", "phi", "width") - and n-row timepoints. - eye_parameters (pd.DataFrame): A table of eye parameters with - 5 columns ("center_x", "center_y", "height", "phi", "width") - and n-row timepoints. - monitor_position (np.ndarray): An array describing monitor position - [x, y, z] - monitor_rotations (np.ndarray): An array describing monitor orientation - about [x, y, z] axes. - camera_position (np.ndarray): An array describing camera position - [x, y, z] - camera_rotations (np.ndarray): An array describing camera orientation - about [x, y, z] axes. - led_position (np.ndarray): An array describing LED position [x, y, z] - eye_radius_cm (float): Radius of eye being tracked in cm. - cm_per_pixel (float): Ratio of centimeters per pixel - - Returns - ------- - dict: A dictionary of gaze mapping outputs with - fields for: `pupil_areas` (in cm^2), `eye_areas` (in cm^2), - `pupil_on_monitor_cm`, and `pupil_on_monitor_deg`. - """ - output = {} - - gaze_mapper = GazeMapper(monitor_position=monitor_position, - monitor_rotations=monitor_rotations, - led_position=led_position, - camera_position=camera_position, - camera_rotations=camera_rotations, - eye_radius=eye_radius_cm, - cm_per_pixel=cm_per_pixel) - - pupil_params_in_cm = pupil_parameters * cm_per_pixel - raw_pupil_areas = compute_circular_areas(pupil_params_in_cm) - - eye_params_in_cm = eye_parameters * cm_per_pixel - raw_eye_areas = compute_elliptical_areas(eye_params_in_cm) - - raw_pupil_on_monitor_cm = gaze_mapper.pupil_position_on_monitor_in_cm( - cam_pupil_params=pupil_parameters[["center_x", "center_y"]].values, - cam_cr_params=cr_parameters[["center_x", "center_y"]].values - ) - - raw_pupil_on_monitor_deg = gaze_mapper.pupil_position_on_monitor_in_degrees( - pupil_pos_on_monitor_in_cm=raw_pupil_on_monitor_cm - ) - - # Make bool mask for all time indices where - # pupil_area or eye_area or pupil_on_monitor_* is np.nan - raw_nan_mask = (raw_pupil_areas.isna() - | raw_eye_areas.isna() - | np.isnan(raw_pupil_on_monitor_deg.T[0])) - raw_pupil_areas[raw_nan_mask] = np.nan - raw_eye_areas[raw_nan_mask] = np.nan - raw_pupil_on_monitor_cm[raw_nan_mask, :] = np.nan - raw_pupil_on_monitor_deg[raw_nan_mask, :] = np.nan - - output["raw_pupil_areas"] = pd.Series(raw_pupil_areas) - output["raw_eye_areas"] = pd.Series(raw_eye_areas) - output["raw_pupil_on_monitor_cm"] = pd.DataFrame(raw_pupil_on_monitor_cm, columns=["x_pos_cm", "y_pos_cm"]) - output["raw_pupil_on_monitor_deg"] = pd.DataFrame(raw_pupil_on_monitor_deg, columns=["x_pos_deg", "y_pos_deg"]) - - # Perform post processing of data - new_pupil_areas = raw_pupil_areas.copy() - new_eye_areas = raw_eye_areas.copy() - new_pupil_on_monitor_cm = raw_pupil_on_monitor_cm.copy() - new_pupil_on_monitor_deg = raw_pupil_on_monitor_deg.copy() - - new_pupil_areas = post_process_areas(new_pupil_areas.values) - new_eye_areas = post_process_areas(new_eye_areas.values) - _, filtered_pos_indices = post_process_cr(cr_parameters[["center_x", - "center_y", - "phi", - "width", - "height"]].values) - - new_nan_mask = (np.isnan(new_pupil_areas) - | np.isnan(new_eye_areas) - | filtered_pos_indices) - new_pupil_areas[new_nan_mask] = np.nan - new_eye_areas[new_nan_mask] = np.nan - new_pupil_on_monitor_cm[new_nan_mask, :] = np.nan - new_pupil_on_monitor_deg[new_nan_mask, :] = np.nan - - output["new_pupil_areas"] = pd.Series(new_pupil_areas) - output["new_eye_areas"] = pd.Series(new_eye_areas) - output["new_pupil_on_monitor_cm"] = pd.DataFrame(new_pupil_on_monitor_cm, columns=["x_pos_cm", "y_pos_cm"]) - output["new_pupil_on_monitor_deg"] = pd.DataFrame(new_pupil_on_monitor_deg, columns=["x_pos_deg", "y_pos_deg"]) - - return output - - -def write_gaze_mapping_output_to_h5(output_savepath: Path, - gaze_map_output: dict): - """Write output of gaze mapping to an h5 file. - - Args: - output_savepath (Path): Desired output save path - gaze_map_output (dict): A dictionary of gaze mapping outputs with - fields for: `pupil_areas`, `eye_areas`, `pupil_on_monitor_cm`, and - `pupil_on_monitor_deg`. - """ - - gaze_map_output["raw_eye_areas"].to_hdf(output_savepath, key="raw_eye_areas", mode="w") - gaze_map_output["raw_pupil_areas"].to_hdf(output_savepath, key="raw_pupil_areas", mode="a") - gaze_map_output["raw_pupil_on_monitor_cm"].to_hdf(output_savepath, key="raw_screen_coordinates", mode="a") - gaze_map_output["raw_pupil_on_monitor_deg"].to_hdf(output_savepath, key="raw_screen_coordinates_spherical", mode="a") - - gaze_map_output["new_eye_areas"].to_hdf(output_savepath, key="new_eye_areas", mode="a") - gaze_map_output["new_pupil_areas"].to_hdf(output_savepath, key="new_pupil_areas", mode="a") - gaze_map_output["new_pupil_on_monitor_cm"].to_hdf(output_savepath, key="new_screen_coordinates", mode="a") - gaze_map_output["new_pupil_on_monitor_deg"].to_hdf(output_savepath, key="new_screen_coordinates_spherical", mode="a") - - gaze_map_output["synced_frame_timestamps_sec"].to_hdf(output_savepath, key="synced_frame_timestamps", mode="a") - - version = pd.Series({"version": allensdk.__version__}) - version.to_hdf(output_savepath, key="version", mode="a") - - -def load_sync_file_timings(sync_file: Path, - pupil_params_rows: int, - truncate_timestamps: bool) -> pd.Series: - """Load sync file timings from .h5 file. - - Parameters - ---------- - sync_file : Path - Path to .h5 sync file. - pupil_params_rows : int - Number of rows in pupil params. - truncate_timestamps: bool - When True, sync time array gets truncated at large gaps - - Returns - ------- - pd.Series - A series of frame times. (New frame times according to synchronized - timings from DAQ) - - Raises - ------ - RuntimeError - If the number of eye tracking frames (pupil_params_rows) does not match - up with number of new frame times from the sync file. - """ - # Add synchronized frame times - frame_times = su.get_synchronized_frame_times(session_sync_file=sync_file, - sync_line_label_keys=Dataset.EYE_TRACKING_KEYS, - trim_after_spike=truncate_timestamps) - if (pupil_params_rows != len(frame_times)): - raise RuntimeError("The number of camera sync pulses in the " - f"sync file ({len(frame_times)}) do not match " - "with the number of eye tracking frames " - f"({pupil_params_rows})!!!") - return frame_times - - -def main(): - - logging.basicConfig(format=('%(asctime)s:%(funcName)s' - ':%(levelname)s:%(message)s')) - - parser = ArgSchemaParser(args=sys.argv[1:], - schema_type=InputSchema, - output_schema_type=OutputSchema) - - args = preprocess_input_args(parser.args) - - output = run_gaze_mapping(pupil_parameters=args["pupil_params"], - cr_parameters=args["cr_params"], - eye_parameters=args["eye_params"], - monitor_position=args["monitor_position"], - monitor_rotations=args["monitor_rotations"], - camera_position=args["camera_position"], - camera_rotations=args["camera_rotations"], - led_position=args["led_position"], - eye_radius_cm=args["eye_radius_cm"], - cm_per_pixel=args["cm_per_pixel"]) - - output["synced_frame_timestamps_sec"] = load_sync_file_timings(args["session_sync_file"], - args["pupil_params"].shape[0], - parser.args["truncate_timestamps"]) - - write_gaze_mapping_output_to_h5(args["output_file"], output) - module_output = {"screen_mapping_file": str(args["output_file"])} - write_or_print_outputs(module_output, parser) - - -if __name__ == "__main__": - main() diff --git a/allensdk/brain_observatory/gaze_mapping/_filter_utils.py b/allensdk/brain_observatory/gaze_mapping/_filter_utils.py deleted file mode 100644 index 669d410015..0000000000 --- a/allensdk/brain_observatory/gaze_mapping/_filter_utils.py +++ /dev/null @@ -1,132 +0,0 @@ -import logging -import numpy as np - - -def medfilt_custom(x, kernel_size=3): - '''This median filter returns 'nan' whenever any value in the kernal width - is 'nan' and the median otherwise''' - T = x.shape[0] - delta = kernel_size // 2 - - x_med = np.zeros(x.shape) - window = x[0:delta + 1] - if np.any(np.isnan(window)): - x_med[0] = np.nan - else: - x_med[0] = np.median(window) - - # print window - for t in range(1, T): - window = x[t - delta:t + delta + 1] - # print window - if np.any(np.isnan(window)): - x_med[t] = np.nan - else: - x_med[t] = np.median(window) - - return x_med - - -def median_absolute_deviation(a, consistency_constant=1.4826): - '''Calculate the median absolute deviation of a univariate dataset. - - Parameters - ---------- - a : numpy.ndarray - Sample data. - consistency_constant : float - Constant to make the MAD a consistent estimator of the population - standard deviation (1.4826 for a normal distribution). - - Returns - ------- - float - Median absolute deviation of the data. - ''' - return consistency_constant * np.nanmedian(np.abs(a - np.nanmedian(a))) - - -def post_process_cr(cr_params): - """This will replace questionable values of the CR x and y position with - 'nan'. - - 1) threshold ellipse area by 99th percentile area distribution - 2) median filter using custom median filter - 3) remove deviations from discontinuous jumps - - The 'nan' values likely represent obscured CRs, secondary reflections, - merges with the secondary reflection, or visual distortions due to - the whisker or deformations of the eye - - Parameters - ---------- - cr_params: numpy.ndarray - (Nx5) array of pupil parameters [x, y, angle, axis1, axis2]. - """ - - area = np.pi * (cr_params.T[3] / 2) * (cr_params.T[4] / 2) - - # compute a threshold on the area of the cr ellipse - dev = median_absolute_deviation(area) - if dev == 0: - logging.warning("Median absolute deviation is 0," - "falling back to standard deviation.") - dev = np.nanstd(area) - threshold = np.nanmedian(area) + 3 * dev - - x_center = cr_params.T[0] - y_center = cr_params.T[1] - - # set x,y where area is over threshold to nan - x_center[area > threshold] = np.nan - y_center[area > threshold] = np.nan - - # median filter - x_center_med = medfilt_custom(x_center, kernel_size=3) - y_center_med = medfilt_custom(y_center, kernel_size=3) - - x_mask_finite = np.where(np.isfinite(x_center_med))[0] - y_mask_finite = np.where(np.isfinite(y_center_med))[0] - - # if y increases discontinuously or x decreases discontinuously, - # that is probably a CR secondary reflection - mean_x = np.mean(x_center_med[x_mask_finite]) - mean_y = np.mean(y_center_med[y_mask_finite]) - - std_x = np.std(x_center_med[x_mask_finite]) - std_y = np.std(y_center_med[y_mask_finite]) - - # set these extreme values to nan - x_center_med[np.abs(x_center_med - mean_x) > 3*std_x] = np.nan - y_center_med[np.abs(y_center_med - mean_y) > 3*std_y] = np.nan - - either_nan_mask = np.isnan(x_center_med) | np.isnan(y_center_med) - x_center_med[either_nan_mask] = np.nan - y_center_med[either_nan_mask] = np.nan - - new_cr = np.vstack([x_center_med, y_center_med]).T - - bad_points_mask = either_nan_mask - - return new_cr, bad_points_mask - - -def post_process_areas(areas: np.ndarray, percent_thresh: int = 99): - '''Filter pupil or eye area data by replacing outliers with nan - - Parameters - ---------- - areas: np.ndarray - (N x 1) Arra of ellipse areas for either eye or pupil - percent_thresh: int - Percentile to threshold at. Default is 99 - - Returns - ------- - numpy.ndarray - Eye/pupil areas with outliers replaced with nan - ''' - threshold = np.percentile(areas[np.isfinite(areas)], percent_thresh) - outlier_indices = areas > threshold - areas[outlier_indices] = np.nan - return areas diff --git a/allensdk/brain_observatory/gaze_mapping/_gaze_mapper.py b/allensdk/brain_observatory/gaze_mapping/_gaze_mapper.py deleted file mode 100644 index 39c0b8f1a7..0000000000 --- a/allensdk/brain_observatory/gaze_mapping/_gaze_mapper.py +++ /dev/null @@ -1,403 +0,0 @@ -import numpy as np -import pandas as pd - -from scipy.spatial.transform import Rotation - - -class EyeTrackingRigObject(object): - """Class encompassing coordinate transforms on objects in the - eye tracking rig (camera, monitor). - - Parameters - ---------- - position_in_eye_coord_frame : numpy.ndarray - [x, y, z] position of the rig object in the eye coordinate system - rotations_in_self_coord_frame: numpy.ndarray - [x, y, z] rotations about the x, then y, then z axes to be applied - in the rig object's own coordinate system - - """ - def __init__(self, - position_in_eye_coord_frame: np.ndarray, - rotations_in_self_coord_frame: np.ndarray): - self.position = position_in_eye_coord_frame - self.rotations = rotations_in_self_coord_frame - - def generate_rotations_xform(self) -> Rotation: - return generate_object_rotation_xform(*self.rotations) - - def compute_unit_normal_in_eye_coord_frame(self) -> np.ndarray: - """Compute unit normal to the object XY plane in eye coordinates.""" - self_to_eye_frame_xform = self.generate_self_to_eye_frame_xform() - return self_to_eye_frame_xform.apply(self._compute_unit_normal()) - - def _compute_unit_normal(self) -> np.ndarray: - """Compute the unit normal vector for the object - (after its orientation rotations have been applied). - """ - # By convention Z-axis is the normal axis for both camera and monitor - # rig imaging/screen planes - unit_normal = [0, 0, 1] - - rotation_xform = self.generate_rotations_xform() - return rotation_xform.apply(unit_normal) - - def generate_self_to_eye_frame_xform(self) -> Rotation: - """Generate rotation matrix to transform base object coordinate frame - to eye coordinate frame. - - By convention, any other object's coordinate frame before rotations - is set with positive Z pointing from the object's position back - to the origin of the eye coordinate system, with X parallel to the - eye X-Y plane. - - Returns - ------- - scipy.spatial.transform.Rotation - A Rotation instance which will transform from an object's - coordinate system (CCS/MCS) to the eye coordinate system (ECS) - """ - # Determine unit normal vector representing +Z axis of CCS/MCS - # in terms of ECS - obj_norm = -(self.position / np.linalg.norm(self.position)) - - # Determine rotation in ECS needed to rotate obj_norm vector so that - # its x-axis aligns with the ECS x-axis. - theta_z = -(np.pi / 2 + np.arctan2(obj_norm[1], obj_norm[0])) - rz = Rotation.from_euler('z', theta_z, degrees=False) - obj_norm_prime = rz.apply(obj_norm) - - # Determine rotation in ECS needed to rotate transformed obj_norm - # vector so that its z-axis aligns with the ECS z-axis - theta_x = np.pi / 2 - np.arctan2(obj_norm_prime[2], obj_norm_prime[1]) - rx = Rotation.from_euler('x', theta_x, degrees=False) - - # Compose rotations, note the order! - eye_to_object_xform = rx * rz - return eye_to_object_xform.inv() - - -class GazeMapper(object): - """Class for performing eye-tracking gaze mapping. - - Provides methods for estimating the position of the pupil in - 3D space and map the gaze onto the monitor in both - 3D space and monitor space given the experimental geometry. - - Parameters - ---------- - monitor_position : numpy.ndarray - [x,y,z] position of monitor in cm. - monitor_rotations : numpy.ndarray - [x,y,z] rotations of monitor in radians. - led_position : numpy.ndarray - [x,y,z] position of LED in cm. - camera_position : numpy.ndarray - [x,y,z] position of camera in cm. - camera_rotations : numpy.ndarray - [x,y,z] rotations for camera in radians. X and Y must be 0. - eye_radius : float - Radius of the eye in cm. - cm_per_pixel : float - Pixel size of eye-tracking camera. - """ - def __init__(self, - monitor_position: np.ndarray, - monitor_rotations: np.ndarray, - led_position: np.ndarray, - camera_position: np.ndarray, - camera_rotations: np.ndarray, - eye_radius: float, - cm_per_pixel: float): - self.eye_radius = eye_radius - self.cm_per_pixel = cm_per_pixel - self.led_pos = led_position - self.monitor = EyeTrackingRigObject(position_in_eye_coord_frame=monitor_position, - rotations_in_self_coord_frame=monitor_rotations) - self.camera = EyeTrackingRigObject(position_in_eye_coord_frame=camera_position, - rotations_in_self_coord_frame=camera_rotations) - self.cr = self.compute_cr_coordinate() - - def compute_cr_coordinate(self) -> np.ndarray: - """Determine the 3D position of the corneal reflection (cr). - - Model the eye as a spherical mirror, so use the mirror - equation to determine where the virtual image of the led would - appear to be coming from if looking at the eye (like the camera is). - - Definitions: - - focal length: - radius_of_curvature/2 - - mirror equations: - 1/focal_length = 1/object_distance + 1/image_distance - magnification = image_height/object_height - = -image_distance/object_distance - - Conventions: - - Center of right eye is considered origin (x=0, y=0, z=0) - - To use mirror equation (object_distance, image_distance) variables - need to be offset so that the mirror pole is considered origin - (x=0, y=0, z=0). - - Focal length is negative for convex mirrors - - Objects in front of mirror have positive distance - - Objects behind mirror (virtual image) have negative distance - - Returns - ------- - numpy.ndarray - [x,y,z] location of the corneal reflection in eye coordinates (cm). - """ - focal_len = -(self.eye_radius / 2) - # In system conventions, Z gives the 'height' of our LED (object) - object_height = self.led_pos[-1] - # Object distance from the mirror pole is the euclidean norm of our - # x and y coordinate components minus the eye_radius. - object_dist = np.linalg.norm(self.led_pos[:2]) - self.eye_radius - # Alternate form of mirror equation - image_dist = (object_dist * focal_len) / (object_dist - focal_len) - # Undo mirror pole offset - image_dist_from_origin = self.eye_radius + image_dist - image_height = -(image_dist / object_dist) * object_height - image_dist_from_origin_mag = np.linalg.norm([image_height, - image_dist_from_origin]) - # To get full 3D position of virtual image we multiply the LED unit - # position vector with magnitude of the image distance from origin. - led_unit_position_vec = (self.led_pos / np.linalg.norm(self.led_pos)) - return led_unit_position_vec * image_dist_from_origin_mag - - def pupil_pos_in_eye_coords(self, - cam_pupil_params: np.ndarray, - cam_cr_params: np.ndarray) -> np.ndarray: - """Compute the 3D pupil position in eye coordinates. - - Parameters - ---------- - cam_pupil_params : numpy.ndarray - [nx2] Array of pupil parameters (x, y) for each eye tracking frame. - cam_cr_params : numpy.ndarray - [nx2] Array of corneal reflection parameters (x, y) for each eye - tracking frame. - - Returns - ------- - numpy.ndarray - Pupil position estimates in eye coordinates (in centimeters). - """ - # x, y are in camera image coordinates - # x increases towards the right of image - # y increases towards the bottom of image - pupil_cr_delta = (cam_pupil_params - cam_cr_params) * self.cm_per_pixel - delta_px = pupil_cr_delta.T[0] - delta_py = pupil_cr_delta.T[1] - - R_eye_to_cam = self.camera.generate_self_to_eye_frame_xform().inv() - R_cam = self.camera.generate_rotations_xform() - - cr_pos_in_cam_coord_frame = R_cam.apply(R_eye_to_cam.apply(self.cr)) - px_cam = cr_pos_in_cam_coord_frame[0] + delta_px - py_cam = cr_pos_in_cam_coord_frame[1] + delta_py - # np.sqrt(np.array([-5, 25])) will result in np.array([np.nan, 5.]) - # and an 'invalid' value RuntimeWarning which is fine - with np.errstate(invalid='ignore'): - pz_cam = np.sqrt(self.eye_radius**2 - px_cam**2 - py_cam**2) - - # Find and assign np.nan to pupil positions which land outside of eyeball radius. - # An operation like: np.array([np.nan, 5, 1]) > 2 will result in array([False, True, False]) - # and an 'invalid' value RuntimeWarning which is fine - with np.errstate(invalid='ignore'): - bad_idx = np.linalg.norm([px_cam, py_cam], axis=0) > self.eye_radius - px_cam[bad_idx] = np.nan - py_cam[bad_idx] = np.nan - pz_cam[bad_idx] = np.nan - - # Create [nx3] pupil position (x, y, z) estimates - pupil_pos_cam = np.vstack([px_cam, py_cam, pz_cam]).T - - # Undo 'cam rotation' and 'eye to cam rotation' to get - # pupil positions in eye coordinates (in centimeters) - cam_to_eye_xform = R_eye_to_cam.inv() * R_cam.inv() - return cam_to_eye_xform.apply(pupil_pos_cam) - - def pupil_position_on_monitor_in_cm(self, - cam_pupil_params: np.ndarray, - cam_cr_params: np.ndarray) -> np.ndarray: - """Compute the pupil position on the monitor in cm. - - General strategy: - 1) Figure out the positions of pupil center in eye coordinates - Using pre-calculated (compute_cr_coordinate) corneal reflection - virtual image location as a reference point. - - 2) Project a ray from origin through an estimated pupil position - and determine the point (in eye coordinate system) at which it - intersects a plane representing the monitor - - 3) Convert the intersection point into the monitor coordinate system - - Parameters - ---------- - cam_pupil_params : numpy.ndarray - [nx2] Array of pupil parameters (x, y) for each eye tracking frame. - cam_cr_params : numpy.ndarray - [nx2] Array of corneal reflection parameters (x, y) for each eye - tracking frame. - - Returns - ------- - numpy.ndarray - [nx2] Pupil position estimates (x, y) for each frame in eye - coordinates (in centimeters). Estimate values will have the - center of the monitor as the (0, 0) origin. - """ - pupil_positions = self.pupil_pos_in_eye_coords(cam_pupil_params, - cam_cr_params) - - monitor_normal = self.monitor.compute_unit_normal_in_eye_coord_frame() - # Project pupil locations from origin of eye coordinate system - line_points = np.tile([0, 0, 0], (pupil_positions.shape[0], 1)) - projected_positions = project_to_plane(plane_normal=monitor_normal, - plane_point=self.monitor.position, - line_vectors=pupil_positions, - line_points=line_points) - - monitor_positions = projected_positions - self.monitor.position - - R_monitor = self.monitor.generate_rotations_xform() - R_monitor_to_eye = self.monitor.generate_self_to_eye_frame_xform() - eye_to_monitor_xform = R_monitor.inv() * R_monitor_to_eye.inv() - result = eye_to_monitor_xform.apply(monitor_positions) - - # Discard z component of monitor locs as it's orthogonal to viewing plane - return np.delete(result, 2, axis=1) - - def pupil_position_on_monitor_in_degrees(self, - pupil_pos_on_monitor_in_cm: np.ndarray) -> np.ndarray: - """Get pupil position on monitor measured in visual degrees. - - Parameters - ---------- - pupil_pos_on_monitor_in_cm : numpy.ndarray - [nx2] Array of pupil positions mapped to monitor coordinates (x, y) - - Returns - ------- - numpy.ndarray - [nx2] Pupil position estimate (x, y) in visual degrees. - """ - x = pupil_pos_on_monitor_in_cm.T[0] - y = pupil_pos_on_monitor_in_cm.T[1] - - mag = np.linalg.norm(self.monitor.position) - meridian = np.degrees(np.arctan(x / mag)) - elevation = np.degrees(np.arctan(y / np.linalg.norm([x, mag], axis=0))) - - angles = np.vstack([meridian, elevation]).T - - return angles - - -def compute_circular_areas(ellipse_params: pd.DataFrame) -> pd.Series: - """Compute circular area of a pupil using half-major axis. - - Assume the pupil is a circle, and that as it moves off-axis - with the camera, the observed ellipse semi-major axis remains the - radius of the circle. - - Parameters - ---------- - ellipse_params (pandas.DataFrame): A table of pupil parameters consisting - of 5 columns: ("center_x", "center_y", "height", "phi", "width") - and n-row timepoints. - - NOTE: For ellipse_params produced by the Deep Lab Cut pipeline, - "width" and "height" columns, in fact, refer to the - "half-width" and "half-height". - - Returns - ------- - pandas.Series: A series of pupil areas for n-timepoints. - """ - # Take the biggest value between height and width columns and - # assume that it is the pupil circle radius. - radii = ellipse_params[["height", "width"]].max(axis=1) - return np.pi * radii * radii - - -def compute_elliptical_areas(ellipse_params: pd.DataFrame) -> pd.Series: - """Compute the elliptical area using elliptical fit parameters. - - Parameters - ---------- - ellipse_params (pandas.DataFrame): A table of pupil parameters consisting - of 5 columns: ("center_x", "center_y", "height", "phi", "width") - and n-row timepoints. - - NOTE: For ellipse_params produced by the Deep Lab Cut pipeline, - "width" and "height" columns, in fact, refer to the - "half-width" and "half-height". - - Returns - ------- - pd.Series - pandas.Series: A series of areas for n-timepoints. - """ - return np.pi * ellipse_params["height"] * ellipse_params["width"] - - -def project_to_plane(plane_normal: np.ndarray, - plane_point: np.ndarray, - line_vectors: np.ndarray, - line_points: np.ndarray) -> np.ndarray: - """Find the points of intersection between a plane and a series of lines. - - See: https://en.wikipedia.org/wiki/Line–plane_intersection - - Parameters - ---------- - plane_normal : numpy.ndarray - [x, y, z] normal vector for the plane. - plane_point : numpy.ndarray - [x, y, z] A point on the plane. - line_vectors : numpy.ndarray - [nx3] A sequence of 'n' vectors (x, y, z) each representing a line. - line_points : numpy.ndarray - [nx3] A sequence of 'n' (x, y, z) values which specify a point on the - corresponding 'n'th line vector. - - Returns - ------- - numpy.ndarray - [nx3] A sequence of 'n' (x, y, z) coordinates which represent the - point of intersection between the plane and the 'n'th line vector. - """ - factors = np.dot((plane_point - line_points), plane_normal) / np.dot(line_vectors, plane_normal) - factors = factors.reshape(-1, 1) - - return factors * line_vectors + line_points - - -def generate_object_rotation_xform(x_rotation: float, - y_rotation: float, - z_rotation: float) -> Rotation: - """Generate a matrix for rotating an object in place. - - Parameters - ---------- - x_rotation : float - Rotation about x axis in radians. - y_rotation : float - Rotation about y' axis in radians. - z_rotation : float - Rotation about z'' axis in radians. - - ------- - Rotation (scipy.spatial.transform.Rotation) - A rotation instance. See: - https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.html - """ - rx = Rotation.from_euler('x', x_rotation, degrees=False) - ry = Rotation.from_euler('y', y_rotation, degrees=False) - rz = Rotation.from_euler('z', z_rotation, degrees=False) - - # Compose rotations with * operator. Note the order! - return rz * ry * rx diff --git a/allensdk/brain_observatory/gaze_mapping/_schemas.py b/allensdk/brain_observatory/gaze_mapping/_schemas.py deleted file mode 100644 index 67829c7bb0..0000000000 --- a/allensdk/brain_observatory/gaze_mapping/_schemas.py +++ /dev/null @@ -1,109 +0,0 @@ -from argschema import ArgSchema -from argschema.fields import Float, LogLevel, String, Boolean, Nested - -from allensdk.brain_observatory.argschema_utilities import ( - InputFile, - OutputFile, - RaisingSchema -) - - -class InputSchema(ArgSchema): - # ============== Required fields ============== - input_file = InputFile( - required=True, - description=('An h5 file containing ellipses fits for ' - 'eye, pupil, and corneal reflections.') - ) - - session_sync_file = InputFile( - required=True, - description=('An h5 file containing timestamps to synchronize ' - 'eye tracking video frames with rest of ephys ' - 'session events.') - ) - - output_file = OutputFile( - required=True, - description=('Full save path of output h5 file that ' - 'will be created by this module.') - ) - - monitor_position_x_mm = Float(required=True, - description=("Monitor center X position in " - "'global' coordinates " - "(millimeters).")) - monitor_position_y_mm = Float(required=True, - description=("Monitor center Y position in " - "'global' coordinates " - "(millimeters).")) - monitor_position_z_mm = Float(required=True, - description=("Monitor center Z position in " - "'global' coordinates " - "(millimeters).")) - monitor_rotation_x_deg = Float(required=True, - description="Monitor X rotation in degrees") - monitor_rotation_y_deg = Float(required=True, - description="Monitor Y rotation in degrees") - monitor_rotation_z_deg = Float(required=True, - description="Monitor Z rotation in degrees") - camera_position_x_mm = Float(required=True, - description=("Camera center X position in " - "'global' coordinates " - "(millimeters)")) - camera_position_y_mm = Float(required=True, - description=("Camera center Y position in " - "'global' coordinates " - "(millimeters)")) - camera_position_z_mm = Float(required=True, - description=("Camera center Z position in " - "'global' coordinates " - "(millimeters)")) - camera_rotation_x_deg = Float(required=True, - description="Camera X rotation in degrees") - camera_rotation_y_deg = Float(required=True, - description="Camera Y rotation in degrees") - camera_rotation_z_deg = Float(required=True, - description="Camera Z rotation in degrees") - led_position_x_mm = Float(required=True, - description=("LED X position in 'global' " - "coordinates (millimeters)")) - led_position_y_mm = Float(required=True, - description=("LED Y position in 'global' " - "coordinates (millimeters)")) - led_position_z_mm = Float(required=True, - description=("LED Z position in 'global' " - "coordinates (millimeters)")) - equipment = String(required=True, - description=('String describing equipment setup used ' - 'to acquire eye tracking videos.')) - date_of_acquisition = String(required=True, - description='Acquisition datetime string.') - eye_video_file = InputFile(required=True, - description=('Full path to raw eye video ' - 'file (*.avi).')) - - # ============== Optional fields ============== - eye_radius_cm = Float(default=0.1682, - description=('Radius of tracked eye(s) in ' - 'centimeters.')) - cm_per_pixel = Float(default=(10.2 / 10000.0), - description=('Centimeter per pixel conversion ' - 'ratio.')) - log_level = LogLevel(default='INFO', - description='Set the logging level of the module.') - - truncate_timestamps = Boolean(default=True, - description=('If True, truncate sync ' - 'timestamps whenever unusually ' - 'large gapes occur; ' - 'Default=True')) - - -class OutputSchema(RaisingSchema): - input_parameters = Nested(InputSchema) - screen_mapping_file = OutputFile(required=True, - description=( - 'Full save path of output h5 ' - 'file that will be created ' - 'by this module.')) diff --git a/allensdk/brain_observatory/locally_sparse_noise.py b/allensdk/brain_observatory/locally_sparse_noise.py deleted file mode 100644 index 7158addeaf..0000000000 --- a/allensdk/brain_observatory/locally_sparse_noise.py +++ /dev/null @@ -1,476 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -import allensdk.brain_observatory.stimulus_info as stimulus_info -import h5py -import numpy as np -import pandas as pd -import scipy.ndimage -from .receptive_field_analysis.receptive_field import compute_receptive_field_with_postprocessing -from .receptive_field_analysis.visualization import plot_receptive_field_data - -from . import circle_plots as cplots -from . import observatory_plots as oplots -from .brain_observatory_exceptions import MissingStimulusException -from .stimulus_analysis import StimulusAnalysis -from .receptive_field_analysis.tools import dict_generator, read_h5_group -from scipy.stats.mstats import zscore - -import matplotlib.pyplot as plt - -class LocallySparseNoise(StimulusAnalysis): - """ Perform tuning analysis specific to the locally sparse noise stimulus. - - Parameters - ---------- - data_set: BrainObservatoryNwbDataSet object - - stimulus: string - Name of locally sparse noise stimulus. See brain_observatory.stimulus_info. - - nrows: int - Number of rows in the stimulus template - - ncol: int - Number of columns in the stimulus template - """ - - LSN_ON = 255 - LSN_OFF = 0 - LSN_GREY = 127 - LSN_OFF_SCREEN = 64 - - def __init__(self, data_set, stimulus=None, **kwargs): - super(LocallySparseNoise, self).__init__(data_set, **kwargs) - if stimulus is None: - self.stimulus = stimulus_info.LOCALLY_SPARSE_NOISE - else: - self.stimulus = stimulus - - try: - lsn_dims = stimulus_info.LOCALLY_SPARSE_NOISE_DIMENSIONS[self.stimulus] - except KeyError as e: - raise KeyError("Unknown stimulus name: %s" % self.stimulus) - - self.nrows = lsn_dims[0] - self.ncols = lsn_dims[1] - - self._LSN = LocallySparseNoise._PRELOAD - self._LSN_mask = LocallySparseNoise._PRELOAD - self._sweeplength = LocallySparseNoise._PRELOAD - self._interlength = LocallySparseNoise._PRELOAD - self._extralength = LocallySparseNoise._PRELOAD - self._mean_response = LocallySparseNoise._PRELOAD - self._receptive_field = LocallySparseNoise._PRELOAD - self._cell_index_receptive_field_analysis_data = LocallySparseNoise._PRELOAD - - @property - def LSN(self): - if self._LSN is LocallySparseNoise._PRELOAD: - self.populate_stimulus_table() - - return self._LSN - - @property - def LSN_mask(self): - if self._LSN_mask is LocallySparseNoise._PRELOAD: - self.populate_stimulus_table() - - return self._LSN_mask - - @property - def sweeplength(self): - if self._sweeplength is LocallySparseNoise._PRELOAD: - self.populate_stimulus_table() - - return self._sweeplength - - @property - def interlength(self): - if self._interlength is LocallySparseNoise._PRELOAD: - self.populate_stimulus_table() - - return self._interlength - - @property - def extralength(self): - if self._extralength is LocallySparseNoise._PRELOAD: - self.populate_stimulus_table() - - return self._extralength - - @property - def receptive_field(self): - if self._receptive_field is LocallySparseNoise._PRELOAD: - self._receptive_field = self.get_receptive_field() - - return self._receptive_field - - @property - def cell_index_receptive_field_analysis_data(self): - if self._cell_index_receptive_field_analysis_data is LocallySparseNoise._PRELOAD: - self._cell_index_receptive_field_analysis_data = self.get_receptive_field_analysis_data() - - return self._cell_index_receptive_field_analysis_data - - @property - def mean_response(self): - if self._mean_response is LocallySparseNoise._PRELOAD: - self._mean_response = self.get_mean_response() - - return self._mean_response - - - def get_peak(self): - LocallySparseNoise._log.info('Calculating peak response properties') - - peak = pd.DataFrame(index=range(self.numbercells), columns=('rf_center_on_x_lsn', 'rf_center_on_y_lsn', - 'rf_center_off_x_lsn', 'rf_center_off_y_lsn', - 'rf_area_on_lsn', 'rf_area_off_lsn', - 'rf_distance_lsn', 'rf_overlap_index_lsn', - 'rf_chi2_lsn', - 'cell_specimen_id')) - csids = self.data_set.get_cell_specimen_ids() - - df = self.get_receptive_field_attribute_df() - peak.cell_specimen_id = csids - - for nc in range(self.numbercells): - peak['rf_chi2_lsn'].iloc[nc] = df['chi_squared_analysis/min_p'].iloc[nc] - - # find the index of the largest on subunit, if it exists - on_i = None - if 'on/gaussian_fit/area' in df.columns: - area_on = df['on/gaussian_fit/area'].iloc[nc] - - # watch out for NaNs and Nones - if isinstance(area_on, np.ndarray): - area_on[np.equal(area_on, None)] = np.nan - if not np.all(np.isnan(area_on.astype(float))): - on_i = np.nanargmax(area_on) - else: - on_i = None - - if on_i is None: - peak['rf_area_on_lsn'].iloc[nc] = np.nan - peak['rf_center_on_x_lsn'].iloc[nc] = np.nan - peak['rf_center_on_y_lsn'].iloc[nc] = np.nan - else: - peak['rf_area_on_lsn'].iloc[nc] = df['on/gaussian_fit/area'].iloc[nc][on_i] - peak['rf_center_on_x_lsn'].iloc[nc] = df['on/gaussian_fit/center_x'].iloc[nc][on_i] - peak['rf_center_on_y_lsn'].iloc[nc] = df['on/gaussian_fit/center_y'].iloc[nc][on_i] - - # find the index of the largest off subunit, if it exists - off_i = None - if 'off/gaussian_fit/area' in df.columns: - area_off = df['off/gaussian_fit/area'].iloc[nc] - - # watch out for NaNs and Nones - if isinstance(area_off, np.ndarray): - area_off[np.equal(area_off, None)] = np.nan - if not np.all(np.isnan(area_off.astype(float))): - off_i = np.nanargmax(area_off) - else: - off_i = None - - if off_i is None: - peak['rf_area_off_lsn'].iloc[nc] = np.nan - peak['rf_center_off_x_lsn'].iloc[nc] = np.nan - peak['rf_center_off_y_lsn'].iloc[nc] = np.nan - else: - peak['rf_area_off_lsn'].iloc[nc] = df['off/gaussian_fit/area'].iloc[nc][off_i] - peak['rf_center_off_x_lsn'].iloc[nc] = df['off/gaussian_fit/center_x'].iloc[nc][off_i] - peak['rf_center_off_y_lsn'].iloc[nc] = df['off/gaussian_fit/center_y'].iloc[nc][off_i] - - - if on_i is not None and off_i is not None: - peak['rf_distance_lsn'].iloc[nc] = df['on/gaussian_fit/distance'].iloc[nc][on_i][off_i] - peak['rf_overlap_index_lsn'].iloc[nc] = df['on/gaussian_fit/overlap'].iloc[nc][on_i][off_i] - else: - peak['rf_distance_lsn'].iloc[nc] = np.nan - peak['rf_overlap_index_lsn'].iloc[nc] = np.nan - - return peak - - def populate_stimulus_table(self): - self._stim_table = self.data_set.get_stimulus_table(self.stimulus) - self._LSN, self._LSN_mask = self.data_set.get_locally_sparse_noise_stimulus_template( - self.stimulus, mask_off_screen=False) - self._sweeplength = self._stim_table['end'][ - 1] - self._stim_table['start'][1] - self._interlength = 4 * self._sweeplength - self._extralength = self._sweeplength - - - def get_mean_response(self): - logging.debug("Calculating mean responses") - mean_response = np.empty( - (self.nrows, self.ncols, self.numbercells + 1, 2)) - - for xp in range(self.nrows): - for yp in range(self.ncols): - on_frame = np.where(self.LSN[:, xp, yp] == self.LSN_ON)[0] - off_frame = np.where(self.LSN[:, xp, yp] == self.LSN_OFF)[0] - subset_on = self.mean_sweep_response[ - self.stim_table.frame.isin(on_frame)] - subset_off = self.mean_sweep_response[ - self.stim_table.frame.isin(off_frame)] - mean_response[xp, yp, :, 0] = subset_on.mean(axis=0) - mean_response[xp, yp, :, 1] = subset_off.mean(axis=0) - return mean_response - - def get_receptive_field(self): - ''' Calculates receptive fields for each cell - ''' - - receptive_field = np.zeros((self.nrows, self.ncols, self.numbercells, 2)) - - for cell_index in range(len(self.cell_index_receptive_field_analysis_data)): - curr_rf = self.cell_index_receptive_field_analysis_data[str(cell_index)] - rf_on = curr_rf['on']['rts_convolution']['data'].copy() - rf_off = curr_rf['off']['rts_convolution']['data'].copy() - rf_on[np.logical_not(curr_rf['on']['fdr_mask']['data'].sum(axis=0))] = np.nan - rf_off[np.logical_not(curr_rf['off']['fdr_mask']['data'].sum(axis=0))] = np.nan - receptive_field[:,:,cell_index, 0] = rf_on - receptive_field[:, :, cell_index, 1] = rf_off - - return receptive_field - - - def get_receptive_field_analysis_data(self): - ''' Calculates receptive fields for each cell - ''' - - csid_rf = {} - for cell_index in range(self.data_set.number_of_cells): - csid_rf[str(cell_index)] = compute_receptive_field_with_postprocessing( - self.data_set, cell_index, self.stimulus, alpha=.05, number_of_shuffles=10000) - - return csid_rf - - - def plot_receptive_field_analysis_data(self, cell_index, **kwargs): - rf = self._cell_index_receptive_field_analysis_data[str(cell_index)] - return plot_receptive_field_data(rf, self, **kwargs) - - def get_receptive_field_attribute_df(self): - - df_list = [] - for cell_index_as_str, rf in self.cell_index_receptive_field_analysis_data.items(): - - attribute_dict = {} - for x in dict_generator(rf): - if x[-3] == 'attrs': - if len(x[:-3]) == 0: - key = x[-2] - else: - key = '/'.join(['/'.join(x[:-3]), x[-2]]) - attribute_dict[key] = x[-1] - - massaged_dict = {} - for key, val in attribute_dict.items(): - massaged_dict[key] = [val] - - massaged_dict['oeid'] = self.data_set.get_metadata()['ophys_experiment_id'] - - curr_df = pd.DataFrame.from_dict(massaged_dict) - df_list.append(curr_df) - - attribute_df = pd.concat(df_list, sort=True) - - return attribute_df.sort_values('cell_index') - - @staticmethod - def merge_mean_response(rc1, rc2): - """ Move out of this class, to session analysis - """ - - # make sure that rc1 is the larger one - if rc2.shape[0] > rc1.shape[0]: - rc1, rc2 = rc2, rc1 - - shape_mult = np.array(rc1.shape) / np.array(rc2.shape) - - rc2_zoom = scipy.ndimage.zoom(rc2, shape_mult, order=0) - - return rc1 + rc2_zoom - - def plot_cell_receptive_field(self, on, cell_specimen_id=None, color_map=None, clim=None, mask=None, cell_index=None, scalebar=True): - if color_map is None: - color_map = 'Reds' if on else 'Blues' - - onst = 'on' if on else 'off' - cell_idx = self.row_from_cell_id(cell_specimen_id, cell_index) - rf = self.cell_index_receptive_field_analysis_data[str(cell_idx)] - rts = rf[onst]['rts']['data'] - rts[np.logical_not(rf[onst]['fdr_mask']['data'].sum(axis=0))] = np.nan - - oplots.plot_receptive_field(rts, - color_map=color_map, - clim=clim, - mask=mask, - scalebar=scalebar) - - def plot_population_receptive_field(self, color_map='RdPu', clim=None, mask=None, scalebar=True): - rf = np.nansum(self.receptive_field, axis=(2,3)) - oplots.plot_receptive_field(rf, - color_map=color_map, - clim=clim, - mask=mask, - scalebar=scalebar) - - def sort_trials(self): - ds = self.data_set - - lsn_movie, lsn_mask = ds.get_locally_sparse_noise_stimulus_template(self.stimulus, - mask_off_screen=False) - - baseline_trials = np.unique(np.where(lsn_movie[:,-5:,-1] != LocallySparseNoise.LSN_GREY)[0]) - baseline_df = self.mean_sweep_response.loc[baseline_trials] - cell_baselines = np.nanmean(baseline_df.values, axis=0) - - lsn_movie[:,~lsn_mask] = LocallySparseNoise.LSN_OFF_SCREEN - - trials = {} - for row in range(self.nrows): - for col in range(self.ncols): - on_trials = np.where(lsn_movie[:,row,col] == LocallySparseNoise.LSN_ON) - off_trials = np.where(lsn_movie[:,row,col] == LocallySparseNoise.LSN_OFF) - - trials[(col,row,True)] = on_trials - trials[(col,row,False)] = off_trials - - return trials, cell_baselines - - - def open_pincushion_plot(self, on, cell_specimen_id=None, color_map=None, cell_index=None): - cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) - - trials, baselines = self.sort_trials() - data = self.mean_sweep_response[str(cell_index)].values - - cplots.make_pincushion_plot(data, trials, on, - self.nrows, self.ncols, - clim=[ baselines[cell_index], data.mean() + data.std() * 3 ], - color_map=color_map, - radius=1.0/16.0) - - @staticmethod - def from_analysis_file(data_set, analysis_file, stimulus): - lsn = LocallySparseNoise(data_set, stimulus) - - lsn.populate_stimulus_table() - - if stimulus == stimulus_info.LOCALLY_SPARSE_NOISE: - stimulus_suffix = stimulus_info.LOCALLY_SPARSE_NOISE_SHORT - elif stimulus == stimulus_info.LOCALLY_SPARSE_NOISE_4DEG: - stimulus_suffix = stimulus_info.LOCALLY_SPARSE_NOISE_4DEG_SHORT - elif stimulus == stimulus_info.LOCALLY_SPARSE_NOISE_8DEG: - stimulus_suffix = stimulus_info.LOCALLY_SPARSE_NOISE_8DEG_SHORT - - try: - - with h5py.File(analysis_file, "r") as f: - k = "analysis/mean_response_%s" % stimulus_suffix - if k in f: - lsn._mean_response = f[k].value - - lsn._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_%s" % stimulus_suffix) - lsn._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_%s" % stimulus_suffix) - - with h5py.File(analysis_file, "r") as f: - lsn._cell_index_receptive_field_analysis_data = LocallySparseNoise.read_cell_index_receptive_field_analysis(f, stimulus) - - except Exception as e: - raise MissingStimulusException(e.args) - - return lsn - - @staticmethod - def save_cell_index_receptive_field_analysis(cell_index_receptive_field_analysis_data, new_nwb, prefix): - - attr_list = [] - file_handle = h5py.File(new_nwb.nwb_file, 'a') - if prefix in file_handle['analysis']: - del file_handle['analysis'][prefix] - f = file_handle.create_group('analysis/%s' % prefix) - for x in dict_generator(cell_index_receptive_field_analysis_data): - if x[-2] == 'data': - f['/'.join(x[:-1])] = x[-1] - elif x[-3] == 'attrs': - attr_list.append(x) - else: - raise Exception - - for x in attr_list: - - # replace None => nan before writing - # set array type to float - for ii, item in enumerate(x): - if isinstance( item, np.ndarray ): - if item.dtype == np.dtype('O'): - item[ item == None ] = np.nan - x[ii] = np.array(item, dtype=float) - - if len(x) > 3: - f['/'.join(x[:-3])].attrs[x[-2]] = x[-1] - else: - assert len(x) == 3 - - if x[-1] is None: - f.attrs[x[-2]] = np.NaN - else: - f.attrs[x[-2]] = x[-1] - - file_handle.close() - - - @staticmethod - def read_cell_index_receptive_field_analysis(file_handle, prefix, path=None): - k = 'analysis/%s' % prefix - if k in file_handle: - f = file_handle['analysis/%s' % prefix] - if path is None: - rf = read_h5_group(f) - else: - rf = read_h5_group(f[path]) - - return rf - else: - return None - - - diff --git a/allensdk/brain_observatory/natural_movie.py b/allensdk/brain_observatory/natural_movie.py deleted file mode 100644 index 474ee53903..0000000000 --- a/allensdk/brain_observatory/natural_movie.py +++ /dev/null @@ -1,212 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import scipy.stats as st -import pandas as pd -import numpy as np -import h5py -from .stimulus_analysis import StimulusAnalysis -from .brain_observatory_exceptions import MissingStimulusException -from . import stimulus_info as stiminfo -from . import circle_plots as cplots - -class NaturalMovie(StimulusAnalysis): - """ Perform tuning analysis specific to natural movie stimulus. - - Parameters - ---------- - data_set: BrainObservatoryNwbDataSet object - - movie_name: string - one of [ stimulus_info.NATURAL_MOVIE_ONE, stimulus_info.NATURAL_MOVIE_TWO, - stimulus_info.NATURAL_MOVIE_THREE ] - """ - - def __init__(self, data_set, movie_name, **kwargs): - super(NaturalMovie, self).__init__(data_set, **kwargs) - - self.movie_name = movie_name - self._sweeplength = NaturalMovie._PRELOAD - self._sweep_response = NaturalMovie._PRELOAD - - @property - def sweeplength(self): - if self._sweeplength is NaturalMovie._PRELOAD: - self.populate_stimulus_table() - - return self._sweeplength - - @property - def sweep_response(self): - if self._sweep_response is NaturalMovie._PRELOAD: - self._sweep_response = self.get_sweep_response() - - return self._sweep_response - - def populate_stimulus_table(self): - stimulus_table = self.data_set.get_stimulus_table(self.movie_name) - self._stim_table = stimulus_table[stimulus_table.frame == 0] - self._sweeplength = \ - self.stim_table.start.iloc[1] - self.stim_table.start.iloc[0] - - def get_sweep_response(self): - ''' Returns the dF/F response for each cell - - Returns - ------- - Numpy array - ''' - sweep_response = pd.DataFrame(index=self.stim_table.index.values, columns=np.array( - range(self.numbercells)).astype(str)) - for index, row in self.stim_table.iterrows(): - start = row.start - end = start + self.sweeplength - for nc in range(self.numbercells): - sweep_response[str(nc)][index] = self.dfftraces[nc, start:end] - return sweep_response - - def get_peak(self): - ''' Computes properties of the peak response condition for each cell. - - Returns - ------- - Pandas data frame with the below fields. A suffix of "nm1", "nm2" or "nm3" is appended to the field name depending - on which of three movie clips was presented. - * peak_nm1 (frame with peak response) - * response_variability_nm1 - ''' - peak_movie = pd.DataFrame(index=range(self.numbercells), columns=( - 'peak', 'response_reliability', 'cell_specimen_id')) - cids = self.data_set.get_cell_specimen_ids() - - mask = np.ones((10,10)) - for i in range(10): - for j in range(10): - if i>=j: - mask[i,j] = np.NaN - - for nc in range(self.numbercells): - peak_movie.cell_specimen_id.iloc[nc] = cids[nc] - meanresponse = self.sweep_response[str(nc)].mean() - -# movie_len = len(meanresponse) / 30 -# output = np.empty((movie_len, 10)) -# for tr in range(10): -# test = self.sweep_response[str(nc)].iloc[tr] -# for i in range(movie_len): -# _, p = st.ks_2samp( -# test[i * 30:(i + 1) * 30], test[(i + 1) * 30:(i + 2) * 30]) -# output[i, tr] = p -# output = np.where(output < 0.05, 1, 0) -# ptime = np.sum(output, axis=1) -# ptime *= 10 - peak = np.argmax(meanresponse) -# if peak > 30: -# peak_movie.response_reliability.iloc[ -# nc] = ptime[(peak - 30) / 30] -# else: -# peak_movie.response_reliability.iloc[nc] = ptime[0] - peak_movie.peak.iloc[nc] = peak - - #reliability - corr_matrix = np.empty((10,10)) - for i in range(10): - for j in range(10): - r,p = st.pearsonr(self.sweep_response[str(nc)].iloc[i], self.sweep_response[str(nc)].iloc[j]) - corr_matrix[i,j] = r - corr_matrix*=mask - peak_movie.response_reliability.iloc[nc] = np.nanmean(corr_matrix) - - if self.movie_name == stiminfo.NATURAL_MOVIE_ONE: - peak_movie.rename(columns={ - 'peak': 'peak_'+stiminfo.NATURAL_MOVIE_ONE_SHORT, - 'response_reliability': 'response_reliability_'+stiminfo.NATURAL_MOVIE_ONE_SHORT}, - inplace=True) - elif self.movie_name == stiminfo.NATURAL_MOVIE_TWO: - peak_movie.rename(columns={ - 'peak': 'peak_'+stiminfo.NATURAL_MOVIE_TWO_SHORT, - 'response_reliability': 'response_reliability_'+stiminfo.NATURAL_MOVIE_TWO_SHORT}, - inplace=True) - elif self.movie_name == stiminfo.NATURAL_MOVIE_THREE: - peak_movie.rename(columns={ - 'peak': 'peak_'+stiminfo.NATURAL_MOVIE_THREE_SHORT, - 'response_reliability': 'response_reliability_'+stiminfo.NATURAL_MOVIE_THREE_SHORT}, - inplace=True) - - return peak_movie - - def open_track_plot(self, cell_specimen_id=None, cell_index=None): - cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) - - cell_rows = self.sweep_response[str(cell_index)] - data = [] - for i in range(len(cell_rows)): - data.append(cell_rows.iloc[i]) - - data = np.vstack(data) - - tp = cplots.TrackPlotter(ring_length=360) - tp.plot(data, - clim=[0, data.mean() + data.std()*3]) - tp.show_arrow() - - @staticmethod - def from_analysis_file(data_set, analysis_file, movie_name): - nm = NaturalMovie(data_set, movie_name) - nm.populate_stimulus_table() - - # TODO: deal with this properly - suffix_map = { - stiminfo.NATURAL_MOVIE_ONE: '_'+stiminfo.NATURAL_MOVIE_ONE_SHORT, - stiminfo.NATURAL_MOVIE_TWO: '_'+stiminfo.NATURAL_MOVIE_TWO_SHORT, - stiminfo.NATURAL_MOVIE_THREE: '_'+stiminfo.NATURAL_MOVIE_THREE_SHORT - } - - try: - suffix = suffix_map[movie_name] - - - nm._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response"+suffix) - nm._peak = pd.read_hdf(analysis_file, "analysis/peak") - - with h5py.File(analysis_file, "r") as f: - nm._binned_dx_sp = f["analysis/binned_dx_sp"].value - nm._binned_cells_sp = f["analysis/binned_cells_sp"].value - nm._binned_dx_vis = f["analysis/binned_dx_vis"].value - nm._binned_cells_vis = f["analysis/binned_cells_vis"].value - except Exception as e: - raise MissingStimulusException(e.args) - - return nm diff --git a/allensdk/brain_observatory/natural_scenes.py b/allensdk/brain_observatory/natural_scenes.py deleted file mode 100644 index 9ff5651e4a..0000000000 --- a/allensdk/brain_observatory/natural_scenes.py +++ /dev/null @@ -1,408 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import scipy.stats as st -import numpy as np -import pandas as pd -from .stimulus_analysis import StimulusAnalysis -import logging -import h5py -from . import observatory_plots as oplots -from . import circle_plots as cplots -from .brain_observatory_exceptions import MissingStimulusException - -class NaturalScenes(StimulusAnalysis): - """ Perform tuning analysis specific to natural scenes stimulus. - - Parameters - ---------- - data_set: BrainObservatoryNwbDataSet object - """ - - _log = logging.getLogger('allensdk.brain_observatory.natural_scenes') - - def __init__(self, data_set, **kwargs): - super(NaturalScenes, self).__init__(data_set, **kwargs) - - self._number_scenes = StimulusAnalysis._PRELOAD - self._sweeplength = StimulusAnalysis._PRELOAD - self._interlength = StimulusAnalysis._PRELOAD - self._extralength = StimulusAnalysis._PRELOAD - - @property - def number_scenes(self): - if self._number_scenes is StimulusAnalysis._PRELOAD: - self.populate_stimulus_table() - - return self._number_scenes - - @property - def sweeplength(self): - if self._sweeplength is StimulusAnalysis._PRELOAD: - self.populate_stimulus_table() - - return self._sweeplength - - @property - def interlength(self): - if self._interlength is StimulusAnalysis._PRELOAD: - self.populate_stimulus_table() - - return self._interlength - - @property - def extralength(self): - if self._extralength is StimulusAnalysis._PRELOAD: - self.populate_stimulus_table() - - return self._extralength - - def populate_stimulus_table(self): - self._stim_table = self.data_set.get_stimulus_table('natural_scenes') - self._number_scenes = len(np.unique(self._stim_table.frame)) - self._sweeplength = self._stim_table.end.iloc[ - 1] - self._stim_table.start.iloc[1] - self._interlength = 4 * self._sweeplength - self._extralength = self._sweeplength - - def get_response(self): - ''' Computes the mean response for each cell to each stimulus condition. Return is - a (# scenes, # cells, 3) np.ndarray. The final dimension - contains the mean response to the condition (index 0), standard error of the mean of the response - to the condition (index 1), and the number of trials with a significant (p < 0.05) response - to that condition (index 2). - - Returns - ------- - Numpy array storing mean responses. - ''' - NaturalScenes._log.info("Calculating mean responses") - - response = np.empty((self.number_scenes, self.numbercells + 1, 3)) - - def ptest(x): - return len(np.where(x < (0.05 / (self.number_scenes - 1)))[0]) - - for ns in range(self.number_scenes): - subset_response = self.mean_sweep_response[ - self.stim_table.frame == (ns - 1)] - subset_pval = self.pval[self.stim_table.frame == (ns - 1)] - response[ns, :, 0] = subset_response.mean(axis=0) - response[ns, :, 1] = subset_response.std( - axis=0) / np.sqrt(len(subset_response)) - response[ns, :, 2] = subset_pval.apply(ptest, axis=0) - - return response - - def get_peak(self): - ''' Computes metrics about peak response condition for each cell. - - Returns - ------- - Pandas data frame with the following fields ('_ns' suffix is for - natural scene): - * scene_ns (scene number) - * reliability_ns - * peak_dff_ns (peak dF/F) - * ptest_ns - * p_run_ns - * run_modulation_ns - * time_to_peak_ns - ''' - NaturalScenes._log.info('Calculating peak response properties') - peak = pd.DataFrame(index=range(self.numbercells), columns=('scene_ns', 'reliability_ns', 'peak_dff_ns', - 'ptest_ns', 'p_run_ns', 'run_modulation_ns', - 'time_to_peak_ns', - 'cell_specimen_id','image_selectivity_ns')) - cids = self.data_set.get_cell_specimen_ids() - - for nc in range(self.numbercells): - nsp = np.argmax(self.response[1:, nc, 0]) - peak.cell_specimen_id.iloc[nc] = cids[nc] - peak.scene_ns[nc] = nsp -# peak.response_reliability_ns[nc] = self.response[ -# nsp + 1, nc, 2] / 0.50 # assume 50 trials - peak.peak_dff_ns[nc] = self.response[nsp + 1, nc, 0] -# subset = self.mean_sweep_response[self.stim_table.frame == nsp] -# subset_stat = subset[subset.dx < 2] -# subset_run = subset[subset.dx >= 2] -# if (len(subset_run) > 5) & (len(subset_stat) > 5): -# (_, peak.p_run_ns[nc]) = st.ks_2samp( -# subset_run[str(nc)], subset_stat[str(nc)]) -# peak.run_modulation_ns[nc] = subset_run[ -# str(nc)].mean() / subset_stat[str(nc)].mean() -# else: -# peak.p_run_ns[nc] = np.NaN -# peak.run_modulation_ns[nc] = np.NaN - groups = [] - for im in range(self.number_scenes): - subset = self.mean_sweep_response[ - self.stim_table.frame == (im - 1)] - groups.append(subset[str(nc)].values) - (_, peak.ptest_ns[nc]) = st.f_oneway(*groups) - test = self.sweep_response[ - self.stim_table.frame == nsp][str(nc)].mean() - peak.time_to_peak_ns[nc] = ( - np.argmax(test) - self.interlength) / self.acquisition_rate - - #running modulation - subset = self.mean_sweep_response[self.stim_table.frame==nsp] - subset_run = subset[subset.dx>=1] - subset_stat = subset[subset.dx<1] - if (len(subset_run)>4) & (len(subset_stat)>4): - (_,peak.p_run_ns.iloc[nc]) = st.ttest_ind(subset_run[str(nc)], subset_stat[str(nc)], equal_var=False) - - if subset_run[str(nc)].mean()>subset_stat[str(nc)].mean(): - peak.run_modulation_ns.iloc[nc] = (subset_run[str(nc)].mean() - subset_stat[str(nc)].mean())/np.abs(subset_run[str(nc)].mean()) - elif subset_run[str(nc)].mean()<subset_stat[str(nc)].mean(): - peak.run_modulation_ns.iloc[nc] = -1*((subset_stat[str(nc)].mean() - subset_run[str(nc)].mean())/np.abs(subset_stat[str(nc)].mean())) - else: - peak.p_run_ns.iloc[nc] = np.NaN - peak.run_modulation_ns.iloc[nc] = np.NaN - - #reliability - subset = self.sweep_response[self.stim_table.frame==nsp] - corr_matrix = np.empty((len(subset),len(subset))) - for i in range(len(subset)): - for j in range(len(subset)): - r,p = st.pearsonr(subset[str(nc)].iloc[i][28:42], subset[str(nc)].iloc[j][28:42]) - corr_matrix[i,j] = r - mask = np.ones((len(subset), len(subset))) - for i in range(len(subset)): - for j in range(len(subset)): - if i>=j: - mask[i,j] = np.NaN - corr_matrix *= mask - peak.reliability_ns.iloc[nc] = np.nanmean(corr_matrix) - - #image selectivity - fmin = self.response[1:,nc,0].min() - fmax = self.response[1:,nc,0].max() - rtj = np.empty((1000,1)) - for j in range(1000): - thresh = fmin + j*((fmax-fmin)/1000.) - theta = np.empty((118,1)) - for im in range(118): - if self.response[im+1,nc,0] > thresh: #im+1 to only look at images, not blanksweep - theta[im] = 1 - else: - theta[im] = 0 - rtj[j] = theta.mean() - - biga = rtj.mean() - bigs = 1 - (2*biga) - peak.image_selectivity_ns.iloc[nc] = bigs - - return peak - - def plot_time_to_peak(self, - p_value_max=oplots.P_VALUE_MAX, - color_map=oplots.STIMULUS_COLOR_MAP): - stimulus_table = self.data_set.get_stimulus_table('natural_scenes') - - resps = [] - - for index, row in self.peak.iterrows(): - mean_response = self.sweep_response.ix[stimulus_table.frame==row.scene_ns][str(index)].mean() - resps.append((mean_response - mean_response.mean() / mean_response.std())) - - mean_responses = np.array(resps) - - sorted_table = self.peak[self.peak.ptest_ns < p_value_max].sort_values('time_to_peak_ns') - cell_order = sorted_table.index - - # time to peak is relative to stimulus start in seconds - ttps = sorted_table.time_to_peak_ns.values + self.interlength / self.acquisition_rate - msrs_sorted = mean_responses[cell_order,:] - - oplots.plot_time_to_peak(msrs_sorted, ttps, - 0, (2*self.interlength + self.sweeplength) / self.acquisition_rate, - (self.interlength) / self.acquisition_rate, - (self.interlength + self.sweeplength) / self.acquisition_rate, - color_map) - - def open_corona_plot(self, cell_specimen_id=None, cell_index=None): - cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) - - df = self.mean_sweep_response[str(cell_index)] - data = df.values - - st = self.data_set.get_stimulus_table('natural_scenes') - mask = st[st.frame >= 0].index - - cmin = self.response[0,cell_index,0] - cmax = max(cmin, data.mean() + data.std()*3) - - cp = cplots.CoronaPlotter() - cp.plot(st.frame.ix[mask].values, - data=df.ix[mask].values, - clim=[cmin, cmax]) - cp.show_arrow() - cp.show_circle() - - def reshape_response_array(self): - ''' - :return: response array in cells x stim x repetition for noise correlations - ''' - - mean_sweep_response = self.mean_sweep_response.values[:, :self.numbercells] - - stim_table = self.stim_table - frames = np.unique(stim_table.frame.values) - - reps = [len(np.where(stim_table.frame.values == frame)[0]) for frame in frames] - Nreps = min(reps) # just in case there are different numbers of repetitions - - response_new = np.zeros((self.numbercells, self.number_scenes), dtype='object') - for i, frame in enumerate(frames): - ind = np.where(stim_table.frame.values == frame)[0][:Nreps] - for c in range(self.numbercells): - response_new[c, i] = mean_sweep_response[ind, c] - - return response_new - - def get_signal_correlation(self, corr='spearman'): - logging.debug("Calculating signal correlations") - - response = self.response[:, :, 0].T - response = response[:self.numbercells, :] - N, Nstim = response.shape - - signal_corr = np.zeros((N, N)) - signal_p = np.empty((N, N)) - if corr == 'pearson': - for i in range(N): - for j in range(i, N): # matrix is symmetric - signal_corr[i, j], signal_p[i, j] = st.pearsonr(response[i], response[j]) - - elif corr == 'spearman': - for i in range(N): - for j in range(i, N): # matrix is symmetric - signal_corr[i, j], signal_p[i, j] = st.spearmanr(response[i], response[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - signal_corr = np.triu(signal_corr) + np.triu(signal_corr, 1).T # fill in lower triangle - signal_p = np.triu(signal_p) + np.triu(signal_p, 1).T # fill in lower triangle - - return signal_corr, signal_p - - def get_representational_similarity(self, corr='spearman'): - logging.debug("Calculating representational similarity") - - response = self.response[:, :, 0] - response = response[:, :self.numbercells] - Nstim, N = response.shape - - rep_sim = np.zeros((Nstim, Nstim)) - rep_sim_p = np.empty((Nstim, Nstim)) - if corr == 'pearson': - for i in range(Nstim): - for j in range(i, Nstim): # matrix is symmetric - rep_sim[i, j], rep_sim_p[i, j] = st.pearsonr(response[i], response[j]) - - elif corr == 'spearman': - for i in range(Nstim): - for j in range(i, Nstim): # matrix is symmetric - rep_sim[i, j], rep_sim_p[i, j] = st.spearmanr(response[i], response[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - rep_sim = np.triu(rep_sim) + np.triu(rep_sim, 1).T # fill in lower triangle - rep_sim_p = np.triu(rep_sim_p) + np.triu(rep_sim_p, 1).T # fill in lower triangle - - return rep_sim, rep_sim_p - - def get_noise_correlation(self, corr='spearman'): - logging.debug("Calculating noise correlations") - - response = self.reshape_response_array() - noise_corr = np.zeros((self.numbercells, self.numbercells, self.number_scenes)) - noise_corr_p = np.zeros((self.numbercells, self.numbercells, self.number_scenes)) - - if corr == 'pearson': - for k in range(self.number_scenes): - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr[i, j, k], noise_corr_p[i, j, k] = st.pearsonr(response[i, k], response[j, k]) - - noise_corr[:, :, k] = np.triu(noise_corr[:, :, k]) + np.triu(noise_corr[:, :, k], 1).T - noise_corr_p[:, :, k] = np.triu(noise_corr_p[:, :, k]) + np.triu(noise_corr_p[:, :, k], 1).T - - elif corr == 'spearman': - for k in range(self.number_scenes): - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr[i, j, k], noise_corr_p[i, j, k] = st.spearmanr(response[i, k], response[j, k]) - - noise_corr[:, :, k] = np.triu(noise_corr[:, :, k]) + np.triu(noise_corr[:, :, k], 1).T - noise_corr_p[:, :, k] = np.triu(noise_corr_p[:, :, k]) + np.triu(noise_corr_p[:, :, k], 1).T - - else: - raise Exception('correlation should be pearson or spearman') - - return noise_corr, noise_corr_p - - @staticmethod - def from_analysis_file(data_set, analysis_file): - ns = NaturalScenes(data_set) - ns.populate_stimulus_table() - - try: - ns._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_ns") - ns._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_ns") - ns._peak = pd.read_hdf(analysis_file, "analysis/peak") - - with h5py.File(analysis_file, "r") as f: - ns._response = f["analysis/response_ns"].value - ns._binned_dx_sp = f["analysis/binned_dx_sp"].value - ns._binned_cells_sp = f["analysis/binned_cells_sp"].value - ns._binned_dx_vis = f["analysis/binned_dx_vis"].value - ns._binned_cells_vis = f["analysis/binned_cells_vis"].value - - if "analysis/noise_corr_ns" in f: - ns.noise_correlation = f["analysis/noise_corr_ns"].value - if "analysis/signal_corr_ns" in f: - ns.signal_correlation = f["analysis/signal_corr_ns"].value - if "analysis/rep_similarity_ns" in f: - ns.representational_similarity = f["analysis/rep_similarity_ns"].value - - except Exception as e: - raise MissingStimulusException(e.args) - - return ns - diff --git a/allensdk/brain_observatory/nwb/__init__.py b/allensdk/brain_observatory/nwb/__init__.py deleted file mode 100644 index 30e4fc8471..0000000000 --- a/allensdk/brain_observatory/nwb/__init__.py +++ /dev/null @@ -1,1117 +0,0 @@ -import logging -import warnings -from pathlib import Path -from typing import Iterable, Optional - -import h5py -import marshmallow -import numpy as np -import pandas as pd -import datetime -import uuid -import SimpleITK as sitk -import pynwb -from pynwb.base import TimeSeries, Images -from pynwb import ProcessingModule, NWBFile -from pynwb.image import GrayscaleImage, IndexSeries -from pynwb.ophys import ( - DfOverF, ImageSegmentation, OpticalChannel, Fluorescence) - -from allensdk.brain_observatory.behavior.data_objects.stimuli\ - .stimulus_templates import StimulusTemplate -from allensdk.brain_observatory.behavior.write_nwb.extensions.stimulus_template.ndx_stimulus_template import StimulusTemplateExtension # noqa: E501 -from allensdk.brain_observatory.nwb.nwb_utils import (get_column_name) -from allensdk.brain_observatory import dict_to_indexed_array -from allensdk.brain_observatory.behavior.image_api import Image -from allensdk.brain_observatory.behavior.image_api import ImageApi -from allensdk.brain_observatory.behavior.schemas import ( - CompleteOphysBehaviorMetadataSchema, NwbOphysMetadataSchema, - BehaviorMetadataSchema, OphysBehaviorMetadataSchema, - BehaviorTaskParametersSchema, SubjectMetadataSchema -) -from allensdk.brain_observatory.nwb.metadata import load_pynwb_extension - - -log = logging.getLogger("allensdk.brain_observatory.nwb") - -CELL_SPECIMEN_COL_DESCRIPTIONS = { - 'cell_specimen_id': 'Unified id of segmented cell across experiments ' - '(after cell matching)', - 'height': 'Height of ROI in pixels', - 'width': 'Width of ROI in pixels', - 'mask_image_plane': 'Which image plane an ROI resides on. Overlapping ' - 'ROIs are stored on different mask image planes.', - 'max_correction_down': 'Max motion correction in down direction in pixels', - 'max_correction_left': 'Max motion correction in left direction in pixels', - 'max_correction_up': 'Max motion correction in up direction in pixels', - 'max_correction_right': 'Max motion correction in right direction in ' - 'pixels', - 'valid_roi': 'Indicates if cell classification found the ROI to be a cell ' - 'or not', - 'x': 'x position of ROI in Image Plane in pixels (top left corner)', - 'y': 'y position of ROI in Image Plane in pixels (top left corner)' -} - - -def check_nwbfile_version(nwbfile_path: str, - desired_minimum_version: str, - warning_msg: str): - with h5py.File(nwbfile_path, 'r') as f: - # nwb 2.x files store version as an attribute - try: - nwb_version = str(f.attrs["nwb_version"]).split(".") - except KeyError: - # nwb 1.x files store version as dataset - try: - nwb_version = str(f["nwb_version"][...].astype(str)) - # Stored in the form: `NWB-x.y.z` - nwb_version = nwb_version.split("-")[1].split(".") - except (KeyError, IndexError): - nwb_version = None - - if nwb_version is None: - warnings.warn(f"'{nwbfile_path}' doesn't appear to be a valid " - f"Neurodata Without Borders (*.nwb) format file as " - f"neither a 'nwb_version' field nor dataset could " - f"be found!") - else: - if tuple(nwb_version) < tuple(desired_minimum_version.split(".")): - warnings.warn(warning_msg) - - -def read_eye_dlc_tracking_ellipses(input_path: Path) -> dict: - """Reads eye tracking ellipse fit data from an h5 file. - - Args: - input_path (Path): Path to eye tracking ellipse fit h5 file - - Returns: - dict: Loaded h5 data. Each 'params' field contains dataframes with] - ellipse fit parameters. Dataframes contain 5 columns each - consisting of: "center_x", "center_y", "height", "phi", "width" - """ - - eye_dlc_tracking_data = {} - - # TODO: Some ellipses.h5 files have the 'cr' key as complex type instead of - # float. For now, when loading ellipses.h5 files, always coerce to float - # but this should eventually be resolved upstream... - # See: allensdk.brain_observatory.eye_tracking - pupil_params = pd.read_hdf(input_path, key="pupil").astype(float) - cr_params = pd.read_hdf(input_path, key="cr").astype(float) - eye_params = pd.read_hdf(input_path, key="eye").astype(float) - - eye_dlc_tracking_data["pupil_params"] = pupil_params - eye_dlc_tracking_data["cr_params"] = cr_params - eye_dlc_tracking_data["eye_params"] = eye_params - - return eye_dlc_tracking_data - - -def read_eye_gaze_mappings(input_path: Path) -> dict: - """Reads eye gaze mapping data from an h5 file. - - Args: - input_path (Path): Path to eye gaze mapping h5 data file produced by - 'allensdk.brain_observatory.gaze_mapping' module. - - Returns: - dict: Loaded h5 data. - *_eye_areas: Area of eye (in pixels^2) over time - *_pupil_areas: Area of pupil (in pixels^2) over time - *_screen_coordinates: y, x screen coordinates (in cm) over time - *_screen_coordinates_spherical: y, x screen coordinates (in deg) - over time - synced_frame_timestamps: synced timestamps for video frames - (in sec) - """ - - eye_gaze_data = {} - eye_gaze_data["raw_eye_areas"] = \ - pd.read_hdf(input_path, key="raw_eye_areas") - eye_gaze_data["raw_pupil_areas"] = \ - pd.read_hdf(input_path, key="raw_pupil_areas") - eye_gaze_data["raw_screen_coordinates"] = \ - pd.read_hdf(input_path, key="raw_screen_coordinates") - eye_gaze_data["raw_screen_coordinates_spherical"] = \ - pd.read_hdf(input_path, key="raw_screen_coordinates_spherical") - eye_gaze_data["new_eye_areas"] = \ - pd.read_hdf(input_path, key="new_eye_areas") - eye_gaze_data["new_pupil_areas"] = \ - pd.read_hdf(input_path, key="new_pupil_areas") - eye_gaze_data["new_screen_coordinates"] = \ - pd.read_hdf(input_path, key="new_screen_coordinates") - eye_gaze_data["new_screen_coordinates_spherical"] = \ - pd.read_hdf(input_path, key="new_screen_coordinates_spherical") - eye_gaze_data["synced_frame_timestamps"] = \ - pd.read_hdf(input_path, key="synced_frame_timestamps") - - return eye_gaze_data - - -def create_eye_gaze_mapping_dataframe(eye_gaze_data: dict) -> pd.DataFrame: - - eye_gaze_mapping_df = pd.DataFrame({ - "raw_eye_area": eye_gaze_data["raw_eye_areas"].values, - "raw_pupil_area": eye_gaze_data["raw_pupil_areas"].values, - "raw_screen_coordinates_x_cm": - eye_gaze_data["raw_screen_coordinates"]["x_pos_cm"].values, - "raw_screen_coordinates_y_cm": - eye_gaze_data["raw_screen_coordinates"]["y_pos_cm"].values, - "raw_screen_coordinates_spherical_x_deg": - eye_gaze_data["raw_screen_coordinates_spherical"]["x_pos_deg"].values, - "raw_screen_coordinates_spherical_y_deg": - eye_gaze_data["raw_screen_coordinates_spherical"]["y_pos_deg"].values, - "filtered_eye_area": eye_gaze_data["new_eye_areas"].values, - "filtered_pupil_area": eye_gaze_data["new_pupil_areas"].values, - "filtered_screen_coordinates_x_cm": - eye_gaze_data["new_screen_coordinates"]["x_pos_cm"].values, - "filtered_screen_coordinates_y_cm": - eye_gaze_data["new_screen_coordinates"]["y_pos_cm"].values, - "filtered_screen_coordinates_spherical_x_deg": - eye_gaze_data["new_screen_coordinates_spherical"]["x_pos_deg"].values, - "filtered_screen_coordinates_spherical_y_deg": - eye_gaze_data["new_screen_coordinates_spherical"]["y_pos_deg"].values - }, - index=eye_gaze_data["synced_frame_timestamps"].values - ) - return eye_gaze_mapping_df - - -def eye_tracking_data_is_valid(eye_dlc_tracking_data: dict, - synced_timestamps: pd.Series) -> bool: - is_valid = True - - pupil_params = eye_dlc_tracking_data["pupil_params"] - cr_params = eye_dlc_tracking_data["cr_params"] - eye_params = eye_dlc_tracking_data["eye_params"] - - num_frames_match = ((pupil_params.shape[0] == cr_params.shape[0]) - and (cr_params.shape[0] == eye_params.shape[0])) - if not num_frames_match: - log.warn("The number of frames for ellipse fits don't " - "match when they should. No ellipse fits will be written! " - f"pupil_params ({pupil_params.shape[0]}), " - f"cr_params ({cr_params.shape[0]}), " - f"eye_params ({eye_params.shape[0]})") - is_valid = False - - if (pupil_params.shape[0] != len(synced_timestamps)): - log.warn("The number of camera sync pulses in the " - f"sync file ({len(synced_timestamps)}) do not match " - "with the number of eye tracking frames " - f"({pupil_params.shape[0]})! No ellipse fits will be " - "written!") - is_valid = False - - return is_valid - - -def create_eye_tracking_nwb_processing_module(eye_dlc_tracking_data: dict, - synced_timestamps: pd.Series - ) -> pynwb.ProcessingModule: - - # Top level container for eye tracking processed data - eye_tracking_mod = pynwb.ProcessingModule( - name='eye_tracking', - description='Eye tracking processing module') - - # Data interfaces of dlc_fits_container - pupil_fits = eye_dlc_tracking_data["pupil_params"].assign( - timestamps=synced_timestamps) - pupil_params = pynwb.core.DynamicTable.from_dataframe( - df=pupil_fits, name="pupil_ellipse_fits") - - cr_fits = eye_dlc_tracking_data["cr_params"].assign( - timestamps=synced_timestamps) - cr_params = pynwb.core.DynamicTable.from_dataframe(df=cr_fits, - name="cr_ellipse_fits") - - eye_fits = eye_dlc_tracking_data["eye_params"].assign( - timestamps=synced_timestamps) - eye_params = pynwb.core.DynamicTable.from_dataframe( - df=eye_fits, name="eye_ellipse_fits") - - eye_tracking_mod.add_data_interface(pupil_params) - eye_tracking_mod.add_data_interface(cr_params) - eye_tracking_mod.add_data_interface(eye_params) - - return eye_tracking_mod - - -def add_eye_gaze_data_interfaces(pynwb_container: pynwb.NWBContainer, - pupil_areas: pd.Series, - eye_areas: pd.Series, - screen_coordinates: pd.DataFrame, - screen_coordinates_spherical: pd.DataFrame, - synced_timestamps: pd.Series - ) -> pynwb.NWBContainer: - - pupil_area_ts = pynwb.base.TimeSeries( - name="pupil_area", - data=pupil_areas.values, - timestamps=synced_timestamps.values, - unit="Pixels ^ 2" - ) - - eye_area_ts = pynwb.base.TimeSeries( - name="eye_area", - data=eye_areas.values, - timestamps=synced_timestamps.values, - unit="Pixels ^ 2" - ) - - screen_coord_ts = pynwb.base.TimeSeries( - name="screen_coordinates", - data=screen_coordinates.values, - timestamps=synced_timestamps.values, - unit="Centimeters" - ) - - screen_coord_spherical_ts = pynwb.base.TimeSeries( - name="screen_coordinates_spherical", - data=screen_coordinates_spherical.values, - timestamps=synced_timestamps.values, - unit="Degrees" - ) - - pynwb_container.add_data_interface(pupil_area_ts) - pynwb_container.add_data_interface(eye_area_ts) - pynwb_container.add_data_interface(screen_coord_ts) - pynwb_container.add_data_interface(screen_coord_spherical_ts) - - return pynwb_container - - -def create_gaze_mapping_nwb_processing_modules(eye_gaze_data: dict): - # Container for raw gaze mapped data - raw_gaze_mapping_mod = pynwb.ProcessingModule( - name='raw_gaze_mapping', - description='Gaze mapping processing module raw outputs') - - raw_gaze_mapping_mod = add_eye_gaze_data_interfaces( - raw_gaze_mapping_mod, - pupil_areas=eye_gaze_data["raw_pupil_areas"], - eye_areas=eye_gaze_data["raw_eye_areas"], - screen_coordinates=eye_gaze_data["raw_screen_coordinates"], - screen_coordinates_spherical=eye_gaze_data["raw_screen_coordinates_spherical"], # noqa: E501 - synced_timestamps=eye_gaze_data["synced_frame_timestamps"]) - - # Container for filtered gaze mapped data - filt_gaze_mapping_mod = pynwb.ProcessingModule( - name='filtered_gaze_mapping', - description='Gaze mapping processing module filtered outputs') - - filt_gaze_mapping_mod = add_eye_gaze_data_interfaces( - filt_gaze_mapping_mod, - pupil_areas=eye_gaze_data["new_pupil_areas"], - eye_areas=eye_gaze_data["new_eye_areas"], - screen_coordinates=eye_gaze_data["new_screen_coordinates"], - screen_coordinates_spherical=eye_gaze_data["new_screen_coordinates_spherical"], # noqa: E501 - synced_timestamps=eye_gaze_data["synced_frame_timestamps"]) - - return (raw_gaze_mapping_mod, filt_gaze_mapping_mod) - - -def add_eye_tracking_ellipse_fit_data_to_nwbfile(nwbfile: pynwb.NWBFile, - eye_dlc_tracking_data: dict, - synced_timestamps: pd.Series - ) -> pynwb.NWBFile: - eye_tracking_mod = create_eye_tracking_nwb_processing_module( - eye_dlc_tracking_data, synced_timestamps) - nwbfile.add_processing_module(eye_tracking_mod) - - return nwbfile - - -def add_eye_gaze_mapping_data_to_nwbfile(nwbfile: pynwb.NWBFile, - eye_gaze_data: dict) -> pynwb.NWBFile: - raw_gaze_mapping_mod, filt_gaze_mapping_mod = \ - create_gaze_mapping_nwb_processing_modules(eye_gaze_data) - nwbfile.add_processing_module(raw_gaze_mapping_mod) - nwbfile.add_processing_module(filt_gaze_mapping_mod) - - return nwbfile - - -def add_running_acquisition_to_nwbfile(nwbfile, - running_acquisition_df: pd.DataFrame): - - running_dx_series = TimeSeries( - name='dx', - data=running_acquisition_df['dx'].values, - timestamps=running_acquisition_df.index.values, - unit='cm', - description=( - 'Running wheel angular change, computed during data collection') - ) - - v_sig = TimeSeries( - name='v_sig', - data=running_acquisition_df['v_sig'].values, - timestamps=running_acquisition_df.index.values, - unit='V', - description='Voltage signal from the running wheel encoder' - ) - - v_in = TimeSeries( - name='v_in', - data=running_acquisition_df['v_in'].values, - timestamps=running_acquisition_df.index.values, - unit='V', - description=( - 'The theoretical maximum voltage that the running wheel encoder ' - 'will reach prior to "wrapping". This should ' - 'theoretically be 5V (after crossing 5V goes to 0V, or ' - 'vice versa). In practice the encoder does not always ' - 'reach this value before wrapping, which can cause ' - 'transient spikes in speed at the voltage "wraps".') - ) - - if 'running' in nwbfile.processing: - running_mod = nwbfile.processing['running'] - else: - running_mod = ProcessingModule('running', - 'Running speed processing module') - nwbfile.add_processing_module(running_mod) - - running_mod.add_data_interface(running_dx_series) - nwbfile.add_acquisition(v_sig) - nwbfile.add_acquisition(v_in) - - return nwbfile - - -def add_running_speed_to_nwbfile(nwbfile, running_speed, - name='speed', unit='cm/s', - from_dataframe=False): - ''' Adds running speed data to an NWBFile as a timeseries in acquisition - - Parameters - ---------- - nwbfile : pynwb.NWBFile - File to which running speeds will be written - running_speed : Union[RunningSpeed, pd.DataFrame] - Either a RunningSpeed object or pandas DataFrame. - Contains attributes 'values' and 'timestamps' - name : str, optional - Used as name of timeseries object - unit : str, optional - SI units of running speed values - from_dataframe : bool, optional - Whether `running_speed` is a dataframe or not. Default is False. - - Returns - ------- - nwbfile : pynwb.NWBFile - - ''' - - if from_dataframe: - data = running_speed['speed'].values - timestamps = running_speed['timestamps'].values - else: - data = running_speed.values - timestamps = running_speed.timestamps - - running_speed_series = pynwb.base.TimeSeries( - name=name, - data=data, - timestamps=timestamps, - unit=unit) - - if 'running' in nwbfile.processing: - running_mod = nwbfile.processing['running'] - else: - running_mod = ProcessingModule('running', - 'Running speed processing module') - nwbfile.add_processing_module(running_mod) - - running_mod.add_data_interface(running_speed_series) - - return nwbfile - - -def add_stimulus_template(nwbfile: NWBFile, - stimulus_template: StimulusTemplate): - unwarped_images = [] - warped_images = [] - image_names = [] - for image_name, image_data in stimulus_template.items(): - image_names.append(image_name) - unwarped_images.append(image_data.unwarped) - warped_images.append(image_data.warped) - - image_index = np.zeros(len(image_names)) - image_index[:] = np.nan - - visual_stimulus_image_series = \ - StimulusTemplateExtension( - name=stimulus_template.image_set_name, - data=warped_images, - unwarped=unwarped_images, - control=list(range(len(image_names))), - control_description=image_names, - unit='NA', - format='raw', - timestamps=image_index) - - nwbfile.add_stimulus_template(visual_stimulus_image_series) - return nwbfile - - -def create_stimulus_presentation_time_interval( - name: str, description: str, - columns_to_add: Iterable) -> pynwb.epoch.TimeIntervals: - column_descriptions = { - "stimulus_name": "Name of stimulus", - "stimulus_block": ("Index of contiguous presentations of " - "one stimulus type"), - "temporal_frequency": "Temporal frequency of stimulus", - "x_position": "Horizontal position of stimulus on screen", - "y_position": "Vertical position of stimulus on screen", - "mask": "Shape of mask applied to stimulus", - "opacity": "Opacity of stimulus", - "phase": "Phase of grating stimulus", - "size": "Size of stimulus (see ‘units’ field for units)", - "units": "Units of stimulus size", - "stimulus_index": "Index of stimulus type", - "orientation": "Orientation of stimulus", - "spatial_frequency": "Spatial frequency of stimulus", - "frame": "Frame of movie stimulus", - "contrast": "Contrast of stimulus", - "Speed": "Speed of moving dot field", - "Dir": "Direction of stimulus motion", - "coherence": "Coherence of moving dot field", - "dotLife": "Longevity of individual dots", - "dotSize": "Size of individual dots", - "fieldPos": "Position of moving dot field", - "fieldShape": "Shape of moving dot field", - "fieldSize": "Size of moving dot field", - "nDots": "Number of dots in moving dot field" - } - - columns_to_ignore = {'start_time', 'stop_time', 'tags', 'timeseries'} - - interval = pynwb.epoch.TimeIntervals(name=name, - description=description) - - for column_name in columns_to_add: - if column_name not in columns_to_ignore: - description = column_descriptions.get( - column_name, "No description") - interval.add_column(name=column_name, description=description) - - return interval - - -def add_stimulus_presentations(nwbfile, stimulus_table, - tag='stimulus_time_interval'): - """Adds a stimulus table (defining stimulus characteristics for each - time point in a session) to an nwbfile as TimeIntervals. - - Parameters - ---------- - nwbfile : pynwb.NWBFile - stimulus_table: pd.DataFrame - Each row corresponds to an interval of time. Columns define the - interval (start and stop time) and its characteristics. - Nans in columns with string data will be replaced with the empty - strings. - Required columns are: - start_time :: the time at which this interval started - stop_time :: the time at which this interval ended - tag : str, optional - Each interval in an nwb file has one or more tags. This string will be - applied as a tag to all TimeIntervals created here - - Returns - ------- - nwbfile : pynwb.NWBFile - - """ - stimulus_table = stimulus_table.copy() - ts = nwbfile.processing['stimulus'].get_data_interface('timestamps') - possible_names = {'stimulus_name', 'image_name'} - stimulus_name_column = get_column_name(stimulus_table.columns, - possible_names) - stimulus_names = stimulus_table[stimulus_name_column].unique() - - for stim_name in sorted(stimulus_names): - specific_stimulus_table = stimulus_table[stimulus_table[stimulus_name_column] == stim_name] # noqa: E501 - # Drop columns where all values in column are NaN - cleaned_table = specific_stimulus_table.dropna(axis=1, how='all') - # For columns with mixed strings and NaNs, fill NaNs with 'N/A' - for colname, series in cleaned_table.items(): - types = set(series.map(type)) - if len(types) > 1 and str in types: - series.fillna('N/A', inplace=True) - cleaned_table[colname] = series.transform(str) - - interval_description = (f"Presentation times and stimuli details " - f"for '{stim_name}' stimuli. " - f"\n" - f"Note: image_name references " - f"control_description in stimulus/templates") - presentation_interval = create_stimulus_presentation_time_interval( - name=f"{stim_name}_presentations", - description=interval_description, - columns_to_add=cleaned_table.columns - ) - - for row in cleaned_table.itertuples(index=False): - row = row._asdict() - - presentation_interval.add_interval(**row, tags=tag, timeseries=ts) - - nwbfile.add_time_intervals(presentation_interval) - - return nwbfile - - -def add_invalid_times(nwbfile, epochs): - """ - Write invalid times to nwbfile if epochs are not empty - Parameters - ---------- - nwbfile: pynwb.NWBFile - epochs: list of dicts - records of invalid epochs - - Returns - ------- - pynwb.NWBFile - """ - table = setup_table_for_invalid_times(epochs) - - if not table.empty: - container = pynwb.epoch.TimeIntervals('invalid_times') - - for index, row in table.iterrows(): - - container.add_interval(start_time=row['start_time'], - stop_time=row['stop_time'], - tags=row['tags'], - ) - - nwbfile.invalid_times = container - - return nwbfile - - -def setup_table_for_invalid_times(invalid_epochs): - """ - Create table with invalid times if invalid_epochs are present - - Parameters - ---------- - invalid_epochs: list of dicts - of invalid epoch records - - Returns - ------- - pd.DataFrame of invalid times if epochs are not empty, - otherwise return None - """ - - if invalid_epochs: - df = pd.DataFrame.from_dict(invalid_epochs) - - start_time = df['start_time'].values - stop_time = df['end_time'].values - tags = [[_type, str(_id), label] - for _type, _id, label - in zip(df['type'], df['id'], df['label'])] - - table = pd.DataFrame({'start_time': start_time, - 'stop_time': stop_time, - 'tags': tags} - ) - table.index.name = 'id' - - else: - table = pd.DataFrame() - - return table - - -def setup_table_for_epochs(table, timeseries, tag): - table = table.copy() - indices = np.searchsorted(timeseries.timestamps[:], - table['start_time'].values) - if len(indices > 0): - diffs = np.concatenate([np.diff(indices), - [table.shape[0] - indices[-1]]]) - else: - diffs = [] - - table['tags'] = [(tag,)] * table.shape[0] - table['timeseries'] = [[[indices[ii], diffs[ii], timeseries]] - for ii in range(table.shape[0])] - return table - - -def add_stimulus_timestamps(nwbfile, stimulus_timestamps, - module_name='stimulus'): - stimulus_ts = TimeSeries( - data=stimulus_timestamps, - name='timestamps', - timestamps=stimulus_timestamps, - unit='s' - ) - - stim_mod = ProcessingModule(module_name, 'Stimulus Times processing') - - nwbfile.add_processing_module(stim_mod) - stim_mod.add_data_interface(stimulus_ts) - - return nwbfile - - -def add_trials(nwbfile, trials, description_dict={}): - order = list(trials.index) - for _, row in trials[['start_time', 'stop_time']].iterrows(): - row_dict = row.to_dict() - nwbfile.add_trial(**row_dict) - - for c in trials.columns: - if c in ['start_time', 'stop_time']: - continue - index, data = dict_to_indexed_array(trials[c].to_dict(), order) - if data.dtype == '<U1': # data type is composed of unicode characters - data = trials[c].tolist() - if not len(data) == len(order): - if len(data) == 0: - data = [''] - nwbfile.add_trial_column( - name=c, - description=description_dict.get( - c, 'NOT IMPLEMENTED: %s' % c), - data=data, - index=index) - else: - nwbfile.add_trial_column( - name=c, - description=description_dict.get( - c, 'NOT IMPLEMENTED: %s' % c), - data=data) - - -def add_licks(nwbfile, licks): - - lick_timeseries = TimeSeries( - name='licks', - data=licks.frame.values, - timestamps=licks.timestamps.values, - description=('Timestamps and stimulus presentation ' - 'frame indices for lick events'), - unit='N/A' - ) - - # Add lick interface to nwb file, by way of a processing module: - licks_mod = ProcessingModule('licking', - 'Licking behavior processing module') - licks_mod.add_data_interface(lick_timeseries) - nwbfile.add_processing_module(licks_mod) - - return nwbfile - - -def add_rewards(nwbfile, rewards_df): - reward_volume_ts = TimeSeries( - name='volume', - data=rewards_df.volume.values, - timestamps=rewards_df['timestamps'].values, - unit='mL' - ) - - autorewarded_ts = TimeSeries( - name='autorewarded', - data=rewards_df.autorewarded.values, - timestamps=reward_volume_ts.timestamps, - unit='mL' - ) - - rewards_mod = ProcessingModule('rewards', - 'Licking behavior processing module') - rewards_mod.add_data_interface(reward_volume_ts) - rewards_mod.add_data_interface(autorewarded_ts) - nwbfile.add_processing_module(rewards_mod) - - return nwbfile - - -def add_image(nwbfile, image_data, image_name, module_name, - module_description, image_api=None): - - description = '{} image at pixels/cm resolution'.format(image_name) - - if image_api is None: - image_api = ImageApi - - if isinstance(image_data, sitk.Image): - data, spacing, unit = ImageApi.deserialize(image_data) - elif isinstance(image_data, Image): - data = image_data.data - spacing = image_data.spacing - unit = image_data.unit - else: - raise ValueError("Not a supported image_data type: " - f"{type(image_data)}") - - assert spacing[0] == spacing[1] and len(spacing) == 2 and unit == 'mm' - - if module_name not in nwbfile.processing: - ophys_mod = ProcessingModule(module_name, module_description) - nwbfile.add_processing_module(ophys_mod) - else: - ophys_mod = nwbfile.processing[module_name] - - image = GrayscaleImage(image_name, - data, - resolution=spacing[0] / 10, - description=description) - - if 'images' not in ophys_mod.containers: - images = Images(name='images') - ophys_mod.add_data_interface(images) - else: - images = ophys_mod['images'] - images.add_image(image) - - return nwbfile - - -def add_max_projection(nwbfile, max_projection, image_api=None): - add_image(nwbfile, - max_projection, - 'max_projection', - 'ophys', - 'Ophys processing module', - image_api=image_api) - - -def add_average_image(nwbfile, average_image, image_api=None): - add_image(nwbfile, - average_image, - 'average_image', - 'ophys', - 'Ophys processing module', - image_api=image_api) - - -def add_segmentation_mask_image(nwbfile, - segmentation_mask_image, - image_api=None): - add_image(nwbfile, - segmentation_mask_image, - 'segmentation_mask_image', - 'ophys', - 'Ophys processing module', - image_api=image_api) - - -def add_stimulus_index(nwbfile, stimulus_index, nwb_template): - - image_index = IndexSeries( - name=nwb_template.name, - data=stimulus_index['image_index'].values, - unit='None', - indexed_timeseries=nwb_template, - timestamps=stimulus_index['start_time'].values) - - nwbfile.add_stimulus(image_index) - - -def add_metadata(nwbfile, metadata: dict, behavior_only: bool): - # Rename or reformat incoming metadata fields to conform with pynwb fields - tmp_metadata = metadata.copy() - tmp_metadata["subject_id"] = tmp_metadata.pop("mouse_id") - tmp_metadata["genotype"] = tmp_metadata.pop("full_genotype") - - if not behavior_only: - imaging_plane_group = metadata["imaging_plane_group"] - if imaging_plane_group is None: - tmp_metadata["imaging_plane_group"] = -1 - else: - tmp_metadata["imaging_plane_group"] = imaging_plane_group - - metadata_clean = CompleteOphysBehaviorMetadataSchema().dump(tmp_metadata) - - # Subject related metadata should be saved to our BehaviorSubject - # (augmented pyNWB 'Subject') NWB class - subject_fields = {"age_in_days", "driver_line", "genotype", - "subject_id", "reporter_line", "sex"} - subject_metadata = {k: v for k, v in metadata_clean.items() - if k in subject_fields} - for subject_key in subject_metadata.keys(): - metadata_clean.pop(subject_key, None) - - BehaviorSubject = load_pynwb_extension(SubjectMetadataSchema, - 'ndx-aibs-behavior-ophys') - - def _get_age(age_in_days: Optional[int]) -> Optional[str]: - """Convert numeric age_in_days to ISO 8601""" - if age_in_days is None: - return 'null' - return f'P{age_in_days}D' - - nwb_subject = BehaviorSubject( - description="A visual behavior subject with a LabTracks ID", - age=_get_age(age_in_days=subject_metadata['age_in_days']), - driver_line=subject_metadata["driver_line"], - genotype=subject_metadata["genotype"], - subject_id=str(subject_metadata["subject_id"]), - reporter_line=subject_metadata["reporter_line"], - sex=subject_metadata["sex"], - species='Mus musculus') - nwbfile.subject = nwb_subject - - # Remove metadata that will go into pyNWB base classes - for key in OphysBehaviorMetadataSchema.neurodata_skip: - metadata_clean.pop(key, None) - - # Remaining metadata can go into our custom extension - new_metadata_dict = {} - for key, val in metadata_clean.items(): - if isinstance(val, list): - new_metadata_dict[key] = np.array(val) - elif isinstance(val, (datetime.datetime, uuid.UUID)): - new_metadata_dict[key] = str(val) - else: - new_metadata_dict[key] = val - - if behavior_only: - BehaviorMetadata = load_pynwb_extension(BehaviorMetadataSchema, - 'ndx-aibs-behavior-ophys') - nwb_metadata = BehaviorMetadata(name='metadata', **new_metadata_dict) - else: - OphysBehaviorMetadata = load_pynwb_extension( - OphysBehaviorMetadataSchema, 'ndx-aibs-behavior-ophys') - nwb_metadata = OphysBehaviorMetadata(name='metadata', - **new_metadata_dict) - nwbfile.add_lab_meta_data(nwb_metadata) - - -def add_task_parameters(nwbfile, task_parameters): - - OphysBehaviorTaskParameters = load_pynwb_extension( - BehaviorTaskParametersSchema, 'ndx-aibs-behavior-ophys' - ) - task_parameters_clean = BehaviorTaskParametersSchema().dump( - task_parameters - ) - - new_task_parameters_dict = {} - for key, val in task_parameters_clean.items(): - if isinstance(val, list): - new_task_parameters_dict[key] = np.array(val) - else: - new_task_parameters_dict[key] = val - nwb_task_parameters = OphysBehaviorTaskParameters( - name='task_parameters', **new_task_parameters_dict) - nwbfile.add_lab_meta_data(nwb_task_parameters) - - -def add_cell_specimen_table(nwbfile: NWBFile, - cell_specimen_table: pd.DataFrame, - session_metadata: dict): - """ - This function takes the cell specimen table and writes the ROIs - contained within. It writes these to a new NWB imaging plane - based off the previously supplied metadata - - Parameters - ---------- - nwbfile: NWBFile - this is the in memory NWBFile currently being written to which ROI data - is added - cell_specimen_table: pd.DataFrame - this is the DataFrame containing the cells segmented from a ophys - experiment, stored in json file and loaded. - example: /home/nicholasc/projects/allensdk/allensdk/test/ - brain_observatory/behavior/cell_specimen_table_789359614.json - session_metadata: dict - Dictionary containing cell_specimen_table related metadata. Should - include at minimum the following fields: - "emission_lambda", "excitation_lambda", "indicator", - "targeted_structure", and ophys_frame_rate" - - Returns - ------- - nwbfile: NWBFile - The altered in memory NWBFile object that now has a specimen table - """ - cell_specimen_metadata = NwbOphysMetadataSchema().load( - session_metadata, unknown=marshmallow.EXCLUDE) - cell_roi_table = cell_specimen_table.reset_index().set_index('cell_roi_id') - - # Device: - device_name: str = nwbfile.lab_meta_data['metadata'].equipment_name - if device_name.startswith("MESO"): - device_config = { - "name": device_name, - "description": "Allen Brain Observatory - Mesoscope 2P Rig" - } - else: - device_config = { - "name": device_name, - "description": "Allen Brain Observatory - Scientifica 2P Rig", - "manufacturer": "Scientifica" - } - nwbfile.create_device(**device_config) - device = nwbfile.get_device(device_name) - - # FOV: - fov_width = nwbfile.lab_meta_data['metadata'].field_of_view_width - fov_height = nwbfile.lab_meta_data['metadata'].field_of_view_height - imaging_plane_description = "{} field of view in {} at depth {} um".format( - (fov_width, fov_height), - cell_specimen_metadata['targeted_structure'], - nwbfile.lab_meta_data['metadata'].imaging_depth) - - # Optical Channel: - optical_channel = OpticalChannel( - name='channel_1', - description='2P Optical Channel', - emission_lambda=cell_specimen_metadata['emission_lambda']) - - # Imaging Plane: - imaging_plane = nwbfile.create_imaging_plane( - name='imaging_plane_1', - optical_channel=optical_channel, - description=imaging_plane_description, - device=device, - excitation_lambda=cell_specimen_metadata['excitation_lambda'], - imaging_rate=cell_specimen_metadata['ophys_frame_rate'], - indicator=cell_specimen_metadata['indicator'], - location=cell_specimen_metadata['targeted_structure']) - - # Image Segmentation: - image_segmentation = ImageSegmentation(name="image_segmentation") - - if 'ophys' not in nwbfile.processing: - ophys_module = ProcessingModule('ophys', 'Ophys processing module') - nwbfile.add_processing_module(ophys_module) - else: - ophys_module = nwbfile.processing['ophys'] - - ophys_module.add_data_interface(image_segmentation) - - # Plane Segmentation: - plane_segmentation = image_segmentation.create_plane_segmentation( - name='cell_specimen_table', - description="Segmented rois", - imaging_plane=imaging_plane) - - for col_name in cell_roi_table.columns: - # the columns 'roi_mask', 'pixel_mask', and 'voxel_mask' are - # already defined in the nwb.ophys::PlaneSegmentation Object - if col_name not in ['id', 'mask_matrix', 'roi_mask', - 'pixel_mask', 'voxel_mask']: - # This builds the columns with name of column and description - # of column both equal to the column name in the cell_roi_table - plane_segmentation.add_column( - col_name, - CELL_SPECIMEN_COL_DESCRIPTIONS.get( - col_name, - "No Description Available")) - - # go through each roi and add it to the plan segmentation object - for cell_roi_id, table_row in cell_roi_table.iterrows(): - - # NOTE: The 'roi_mask' in this cell_roi_table has already been - # processing by the function from - # allensdk.brain_observatory.behavior.session_apis.data_io.ophys_lims_api - # get_cell_specimen_table() method. As a result, the ROI is stored in - # an array that is the same shape as the FULL field of view of the - # experiment (e.g. 512 x 512). - mask = table_row.pop('roi_mask') - - csid = table_row.pop('cell_specimen_id') - table_row['cell_specimen_id'] = -1 if csid is None else csid - table_row['id'] = cell_roi_id - plane_segmentation.add_roi(image_mask=mask, **table_row.to_dict()) - - return nwbfile - - -def add_dff_traces(nwbfile, dff_traces, ophys_timestamps): - dff_traces = dff_traces.reset_index().set_index('cell_roi_id')[['dff']] - - ophys_module = nwbfile.processing['ophys'] - # trace data in the form of rois x timepoints - trace_data = np.array([dff_traces.loc[cell_roi_id].dff - for cell_roi_id in dff_traces.index.values]) - - cell_specimen_table = nwbfile.processing['ophys'].data_interfaces['image_segmentation'].plane_segmentations['cell_specimen_table'] # noqa: E501 - roi_table_region = cell_specimen_table.create_roi_table_region( - description="segmented cells labeled by cell_specimen_id", - region=slice(len(dff_traces))) - - # Create/Add dff modules and interfaces: - assert dff_traces.index.name == 'cell_roi_id' - dff_interface = DfOverF(name='dff') - ophys_module.add_data_interface(dff_interface) - - dff_interface.create_roi_response_series( - name='traces', - data=trace_data.T, # Should be stored as timepoints x rois - unit='NA', - rois=roi_table_region, - timestamps=ophys_timestamps) - - return nwbfile - - -def add_corrected_fluorescence_traces(nwbfile, corrected_fluorescence_traces): - corrected_fluorescence_traces = \ - corrected_fluorescence_traces.reset_index().set_index( - 'cell_roi_id')[['corrected_fluorescence']] - - # Create/Add corrected_fluorescence_traces modules and interfaces: - assert corrected_fluorescence_traces.index.name == 'cell_roi_id' - ophys_module = nwbfile.processing['ophys'] - # trace data in the form of rois x timepoints - f_trace_data = np.array( - [corrected_fluorescence_traces.loc[cell_roi_id].corrected_fluorescence - for cell_roi_id in corrected_fluorescence_traces.index.values]) - - roi_table_region = nwbfile.processing['ophys'].data_interfaces['dff'].roi_response_series['traces'].rois # noqa: E501 - ophys_timestamps = ophys_module.get_data_interface( - 'dff').roi_response_series['traces'].timestamps - f_interface = Fluorescence(name='corrected_fluorescence') - ophys_module.add_data_interface(f_interface) - - f_interface.create_roi_response_series( - name='traces', - data=f_trace_data.T, # Should be stored as timepoints x rois - unit='NA', - rois=roi_table_region, - timestamps=ophys_timestamps) - - return nwbfile - - -def add_motion_correction(nwbfile, motion_correction): - - ophys_module = nwbfile.processing['ophys'] - ophys_timestamps = ophys_module.get_data_interface( - 'dff').roi_response_series['traces'].timestamps - - t1 = TimeSeries( - name='ophys_motion_correction_x', - data=motion_correction['x'].values, - timestamps=ophys_timestamps, - unit='pixels' - ) - - t2 = TimeSeries( - name='ophys_motion_correction_y', - data=motion_correction['y'].values, - timestamps=ophys_timestamps, - unit='pixels' - ) - - ophys_module.add_data_interface(t1) - ophys_module.add_data_interface(t2) diff --git a/allensdk/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py b/allensdk/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py deleted file mode 100644 index 3857c59d66..0000000000 --- a/allensdk/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py +++ /dev/null @@ -1,24 +0,0 @@ -import os - -from allensdk.brain_observatory.behavior.schemas import ( - BehaviorMetadataSchema, - OphysBehaviorMetadataSchema, - BehaviorTaskParametersSchema, - SubjectMetadataSchema, OphysEyeTrackingRigMetadataSchema -) -from allensdk.brain_observatory.nwb.metadata import ( - create_pynwb_extension_from_schemas -) - -if __name__ == "__main__": - - # Run this module to regenerate the extension yaml files into this dir: - prefix = 'ndx-aibs-behavior-ophys' - schemas = [ - BehaviorTaskParametersSchema, SubjectMetadataSchema, - BehaviorMetadataSchema, OphysBehaviorMetadataSchema, - OphysEyeTrackingRigMetadataSchema] - - curr_dir = os.path.abspath(os.path.dirname(__file__)) - create_pynwb_extension_from_schemas(schemas, prefix, save_dir=curr_dir) - print("Creation of NWB extension complete!") diff --git a/allensdk/brain_observatory/nwb/eye_tracking/__init__.py b/allensdk/brain_observatory/nwb/eye_tracking/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/nwb/eye_tracking/extension_builder.py b/allensdk/brain_observatory/nwb/eye_tracking/extension_builder.py deleted file mode 100644 index 4b28c824d3..0000000000 --- a/allensdk/brain_observatory/nwb/eye_tracking/extension_builder.py +++ /dev/null @@ -1,99 +0,0 @@ -import os.path - -from pynwb.spec import (NWBNamespaceBuilder, export_spec, - NWBGroupSpec, NWBDatasetSpec) - -NAMESPACE = 'ndx-ellipse-eye-tracking' - - -def main(): - # these arguments were auto-generated from your cookiecutter inputs - ns_builder = NWBNamespaceBuilder( - doc="""Store the elliptical eye tracking output of DeepLabCut""", - name=f"""{NAMESPACE}""", - version="""0.1.0""", - author=list(map(str.strip, """Ben Dichter""".split(','))), - contact=list(map(str.strip, """bdichter@lbl.gov""".split(','))) - ) - - ns_builder.include_type('SpatialSeries', namespace='core') - ns_builder.include_type('EyeTracking', namespace='core') - ns_builder.include_type('TimeSeries', namespace='core') - - ellipse_series_spec = NWBGroupSpec( - neurodata_type_def='EllipseSeries', - neurodata_type_inc='SpatialSeries', - doc='Information about an ellipse moving over time', - datasets=[ - NWBDatasetSpec( - name='data', # override SpatialSeries 'data' dataset to be more explicit - dtype='numeric', - doc='The (x, y) coordinates of the center of the ellipse at each time point.', - dims=('num_times', 'x, y'), - shape=(None, 2), - ), - NWBDatasetSpec( - name='area', - dtype='float', - doc='ellipse area, with nan values in likely blink times', - shape=(None, ) - ), - NWBDatasetSpec( - name='area_raw', - dtype='float', - doc='ellipse area, with no regard to likely blink times', - shape=(None, ) - ), - NWBDatasetSpec( - name='width', - dtype='float', - doc='width of ellipse', - shape=(None, ) - ), - NWBDatasetSpec( - name='height', - dtype='float', - doc='height of ellipse', - shape=(None, ) - ), - NWBDatasetSpec( - name='angle', - dtype='float', - doc='angle that ellipse is rotated by (phi)', - shape=(None, ) - ) - ] - ) - - ellipse_eye_tracking_spec = NWBGroupSpec( - neurodata_type_def='EllipseEyeTracking', - neurodata_type_inc='EyeTracking', - name=None, - default_name='EyeTracking', - doc='Stores detailed eye tracking information output from DeepLabCut', - groups=[ - NWBGroupSpec( - neurodata_type_inc=ellipse_series_spec, - name=x, - doc=x.replace('_', ' ') - ) for x in ('eye_tracking', 'pupil_tracking', 'corneal_reflection_tracking') - ] + [ - NWBGroupSpec( - neurodata_type_inc='TimeSeries', - name='likely_blink', - doc='Indicator of whether there was a probable blink for this frame' - ) - ] - - ) - - new_data_types = [ellipse_series_spec, ellipse_eye_tracking_spec] - - # export the spec to yaml files in the spec folder - output_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) - export_spec(ns_builder, new_data_types, output_dir) - - -if __name__ == "__main__": - # usage: python create_extension_spec.py - main() diff --git a/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml b/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml deleted file mode 100644 index c0c0833222..0000000000 --- a/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml +++ /dev/null @@ -1,56 +0,0 @@ -groups: -- neurodata_type_def: EllipseSeries - neurodata_type_inc: SpatialSeries - doc: Information about an ellipse moving over time - datasets: - - name: data - dtype: numeric - dims: - - num_times - - x, y - shape: - - null - - 2 - doc: The (x, y) coordinates of the center of the ellipse at each time point. - - name: area - dtype: float - shape: - - null - doc: ellipse area, with nan values in likely blink times - - name: area_raw - dtype: float - shape: - - null - doc: ellipse area, with no regard to likely blink times - - name: width - dtype: float - shape: - - null - doc: width of ellipse - - name: height - dtype: float - shape: - - null - doc: height of ellipse - - name: angle - dtype: float - shape: - - null - doc: angle that ellipse is rotated by (phi) -- neurodata_type_def: EllipseEyeTracking - neurodata_type_inc: EyeTracking - default_name: EyeTracking - doc: Stores detailed eye tracking information output from DeepLabCut - groups: - - name: eye_tracking - neurodata_type_inc: EllipseSeries - doc: eye tracking - - name: pupil_tracking - neurodata_type_inc: EllipseSeries - doc: pupil tracking - - name: corneal_reflection_tracking - neurodata_type_inc: EllipseSeries - doc: corneal reflection tracking - - name: likely_blink - neurodata_type_inc: TimeSeries - doc: Indicator of whether there was a probable blink for this frame diff --git a/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml b/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml deleted file mode 100644 index 00347dc45a..0000000000 --- a/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml +++ /dev/null @@ -1,15 +0,0 @@ -namespaces: -- author: - - Ben Dichter - contact: - - bdichter@lbl.gov - doc: Store the elliptical eye tracking output of DeepLabCut - name: ndx-ellipse-eye-tracking - schema: - - namespace: core - neurodata_types: - - SpatialSeries - - EyeTracking - - TimeSeries - - source: ndx-ellipse-eye-tracking.extensions.yaml - version: 0.1.0 diff --git a/allensdk/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py b/allensdk/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py deleted file mode 100644 index 3127c9640f..0000000000 --- a/allensdk/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py +++ /dev/null @@ -1,17 +0,0 @@ -import os -from pynwb import load_namespaces, get_class -# import ndx_events - -# Set path of the namespace.yaml file to the expected install location -ndx_ellipse_eye_tracking_specpath = os.path.join( - os.path.dirname(__file__), - 'ndx-ellipse-eye-tracking.namespace.yaml' -) - -# Load the namespace -# load_namespaces(ndx_events.ndx_events_specpath) -load_namespaces(ndx_ellipse_eye_tracking_specpath) - - -EllipseSeries = get_class('EllipseSeries', 'ndx-ellipse-eye-tracking') -EllipseEyeTracking = get_class('EllipseEyeTracking', 'ndx-ellipse-eye-tracking') \ No newline at end of file diff --git a/allensdk/brain_observatory/nwb/metadata.py b/allensdk/brain_observatory/nwb/metadata.py deleted file mode 100644 index e9024d2fa6..0000000000 --- a/allensdk/brain_observatory/nwb/metadata.py +++ /dev/null @@ -1,125 +0,0 @@ -import os - -from marshmallow import fields -import pynwb -from pynwb.spec import NWBNamespaceBuilder, NWBGroupSpec, NWBAttributeSpec, NWBDatasetSpec - -from allensdk.brain_observatory.behavior.schemas import STYPE_DICT, TYPE_DICT - - -def extract_from_schema(schema): - if hasattr(schema, 'neurodata_skip'): - fields_to_skip = schema.neurodata_skip - else: - fields_to_skip = set() - - # Extract fields from Schema: - docval_list = [{'name': 'name', 'type': str, 'doc': 'name'}] - - attributes = _extract_attributes(attributes=schema().fields, fields_to_skip=fields_to_skip) - datasets = [] - nwbfields_list = [] - - for name, val in schema().fields.items(): - - if name in fields_to_skip: - continue - - if type(val) == fields.Nested: - dataset = _extract_dataset(val=val) - datasets.append(dataset) - continue - - docval_list.append({'name': name, - 'type': TYPE_DICT[type(val)], - 'doc': val.metadata['doc']}) - nwbfields_list.append(name) - - return docval_list, attributes, nwbfields_list, datasets - - -def load_pynwb_extension(schema, prefix: str): - neurodata_type = schema.neurodata_type - outdir = os.path.abspath(os.path.dirname(__file__)) - ns_path = f'{prefix}.namespace.yaml' - - # Read spec and load namespace: - ns_abs_path = os.path.join(outdir, ns_path) - pynwb.load_namespaces(ns_abs_path) - - return pynwb.get_class(neurodata_type, prefix) - - -def create_pynwb_extension_from_schemas(schema_list, prefix: str, save_dir: str): - # Initializations: - outdir = os.path.abspath(os.path.dirname(__file__)) - ext_source = f'{prefix}.extension.yaml' - ns_path = f'{prefix}.namespace.yaml' - - print(f"Saving extensions to: {save_dir}") - - extension_doc = ("Allen Institute behavior and optical " - "physiology extensions") - - ns_builder = NWBNamespaceBuilder( - doc=extension_doc, - name=prefix, - version="0.2.0", - author="Allen Institute for Brain Science", - contact="waynew@alleninstitute.org") - - # Loops through and create NWB custom group specs for schemas found in: - # allensdk.brain_observatory.behavior.schemas - for schema in schema_list: - docval_list, attributes, nwbfields_list, datasets = extract_from_schema(schema) - - # Build the spec: - ext_group_spec = NWBGroupSpec( - neurodata_type_def=schema.neurodata_type, - neurodata_type_inc=schema.neurodata_type_inc, - doc=schema.neurodata_doc, - attributes=attributes, - datasets=datasets) - - # Add spec to builder: - ns_builder.add_spec(ext_source, ext_group_spec) - - # Export spec - ns_builder.export(ns_path, outdir=save_dir) - - -def _extract_dataset(val): - if val.many: - raise NotImplementedError('many not supported') - if 'values' not in val.schema.fields: - raise ValueError('A dataset must contain an attribute called "values"') - values = val.schema.fields['values'] - attributes = _extract_attributes(attributes=val.schema.fields, fields_to_skip=['values']) - - return NWBDatasetSpec( - name=val.name, - attributes=attributes, - doc=val.metadata['doc'], - dtype=STYPE_DICT[type(values)], - dims=values.metadata['shape'] - ) - - -def _extract_attributes(attributes, fields_to_skip=None): - res = [] - for name, val in attributes.items(): - if fields_to_skip and name in fields_to_skip: - continue - - if type(val) == fields.List: - res.append(NWBAttributeSpec(name=name, - dtype=STYPE_DICT[type(val)], - doc=val.metadata['doc'], - shape=val.metadata['shape'])) - elif type(val) == fields.Nested: - continue - else: - res.append(NWBAttributeSpec(name=name, - dtype=STYPE_DICT[type(val)], - doc=val.metadata['doc'])) - return res diff --git a/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml b/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml deleted file mode 100644 index d9f78f3b51..0000000000 --- a/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml +++ /dev/null @@ -1,183 +0,0 @@ -groups: -- neurodata_type_def: BehaviorTaskParameters - neurodata_type_inc: LabMetaData - doc: Metadata for behavior or behavior + ophys task parameters - attributes: - - name: stimulus_distribution - dtype: text - doc: Distribution type of drawing change times (e.g. 'geometric', 'exponential') - - name: task - dtype: text - doc: The name of the behavioral task - - name: reward_volume - dtype: float - doc: Volume of water (in mL) delivered as reward - - name: n_stimulus_frames - dtype: int - doc: Total number of stimuli frames - - name: auto_reward_volume - dtype: float - doc: Volume of water (in mL) delivered as an automatic reward - - name: session_type - dtype: text - doc: Stage of behavioral task - - name: response_window_sec - dtype: text - shape: - - 2 - doc: The lower and upper bound (in seconds) for a randomly chosen time window - where subject response influences trial outcome - - name: blank_duration_sec - dtype: text - shape: - - 2 - doc: The lower and upper bound (in seconds) for a randomly chosen inter-stimulus - interval duration for a trial - - name: stimulus_duration_sec - dtype: float - doc: Duration of each stimulus presentation in seconds - - name: omitted_flash_fraction - dtype: float - doc: Fraction of flashes/image presentations that were omitted - - name: stimulus - dtype: text - doc: Stimulus type -- neurodata_type_def: BehaviorSubject - neurodata_type_inc: Subject - doc: Metadata for an AIBS behavior or behavior + ophys subject - attributes: - - name: reporter_line - dtype: text - doc: Reporter line of subject - - name: driver_line - dtype: text - shape: - - null - doc: Driver line of subject -- neurodata_type_def: BehaviorMetadata - neurodata_type_inc: LabMetaData - doc: Metadata for behavior and behavior + ophys experiments - attributes: - - name: behavior_session_uuid - dtype: text - doc: MTrain record for session, also called foraging_id - - name: equipment_name - dtype: text - doc: Name of behavior or optical physiology experiment rig - - name: session_type - dtype: text - doc: Experimental session description - - name: behavior_session_id - dtype: int - doc: The unique ID for the behavior session - - name: stimulus_frame_rate - dtype: float - doc: Frame rate (frames/second) of the visual_stimulus from the monitor -- neurodata_type_def: OphysBehaviorMetadata - neurodata_type_inc: BehaviorMetadata - doc: Metadata for behavior + ophys experiments - attributes: - - name: experiment_container_id - dtype: int - doc: Container ID for the container that contains this ophys session - - name: behavior_session_id - dtype: int - doc: The unique ID for the behavior session - - name: behavior_session_uuid - dtype: text - doc: MTrain record for session, also called foraging_id - - name: equipment_name - dtype: text - doc: Name of behavior or optical physiology experiment rig - - name: session_type - dtype: text - doc: Experimental session description - - name: field_of_view_width - dtype: int - doc: Width of optical physiology imaging plane in pixels - - name: ophys_session_id - dtype: int - doc: Unique ID for the ophys session - - name: field_of_view_height - dtype: int - doc: Height of optical physiology imaging plane in pixels - - name: imaging_plane_group_count - dtype: int - doc: The total number of plane groups collected in a session for a mesoscope experiment. - Will be 0 if the scope did not capture multiple concurrent imaging planes. - - name: ophys_experiment_id - dtype: int - doc: Unique ID for the ophys experiment (aka imaging plane) - - name: imaging_depth - dtype: int - doc: Depth (microns) below the cortical surface targeted for two-photon acquisition - - name: imaging_plane_group - dtype: int - doc: A numeric index which indicates the order that an imaging plane was acquired - for a mesoscope experiment. Will be -1 for non-mesoscope data - - name: stimulus_frame_rate - dtype: float - doc: Frame rate (frames/second) of the visual_stimulus from the monitor -- neurodata_type_def: OphysEyeTrackingRigMetadata - neurodata_type_inc: NWBDataInterface - doc: Metadata for ophys experiment rig - attributes: - - name: equipment - dtype: text - doc: Description of rig - datasets: - - name: monitor_rotation - dtype: float - dims: - - 3 - shape: - - null - doc: rotation of monitor (x, y, z) - attributes: - - name: unit_of_measurement - dtype: text - doc: Unit of measurement for the data - - name: camera_position - dtype: float - dims: - - 3 - shape: - - null - doc: position of camera (x, y, z) - attributes: - - name: unit_of_measurement - dtype: text - doc: Unit of measurement for the data - - name: led_position - dtype: float - dims: - - 3 - shape: - - null - doc: position of LED (x, y, z) - attributes: - - name: unit_of_measurement - dtype: text - doc: Unit of measurement for the data - - name: camera_rotation - dtype: float - dims: - - 3 - shape: - - null - doc: rotation of camera (x, y, z) - attributes: - - name: unit_of_measurement - dtype: text - doc: Unit of measurement for the data - - name: monitor_position - dtype: float - dims: - - 3 - shape: - - null - doc: position of monitor (x, y, z) - attributes: - - name: unit_of_measurement - dtype: text - doc: Unit of measurement for the data diff --git a/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml b/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml deleted file mode 100644 index 66adbc846b..0000000000 --- a/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml +++ /dev/null @@ -1,9 +0,0 @@ -namespaces: -- author: Allen Institute for Brain Science - contact: waynew@alleninstitute.org - doc: Allen Institute behavior and optical physiology extensions - name: ndx-aibs-behavior-ophys - schema: - - namespace: core - - source: ndx-aibs-behavior-ophys.extension.yaml - version: 0.2.0 diff --git a/allensdk/brain_observatory/nwb/nwb_api.py b/allensdk/brain_observatory/nwb/nwb_api.py deleted file mode 100644 index 8c74139c02..0000000000 --- a/allensdk/brain_observatory/nwb/nwb_api.py +++ /dev/null @@ -1,117 +0,0 @@ -from pathlib import Path - -import pandas as pd -import pynwb -import SimpleITK as sitk -import collections - -from allensdk.brain_observatory.running_speed import RunningSpeed -from allensdk.brain_observatory.behavior.image_api import ImageApi - -namespace_path = Path(__file__).parent / 'ndx-aibs-behavior-ophys.namespace.yaml' -pynwb.load_namespaces(str(namespace_path)) - - -class NwbApi: - - __slots__ = ('path', '_nwbfile') - - @property - def nwbfile(self): - if hasattr(self, '_nwbfile'): - return self._nwbfile - - io = pynwb.NWBHDF5IO(self.path, 'r') - return io.read() - - def __init__(self, path, **kwargs): - ''' Reads data for a single Brain Observatory session from an NWB 2.0 file - ''' - - self.path = path - - @classmethod - def from_nwbfile(cls, nwbfile, **kwargs): - - obj = cls(path=None, **kwargs) - obj._nwbfile = nwbfile - - return obj - - @classmethod - def from_path(cls, path, **kwargs): - with open(path, 'r'): - pass - - return cls(path=path, **kwargs) - - def get_running_speed(self, lowpass=True) -> RunningSpeed: - """ - Gets the running speed - Parameters - ---------- - lowpass: bool - Whether to return the running speed with lowpass filter applied or without - - Returns - ------- - RunningSpeed: - The running speed - """ - - interface_name = 'speed' if lowpass else 'speed_unfiltered' - values = self.nwbfile.modules['running'].get_data_interface(interface_name).data[:] - timestamps = self.nwbfile.modules['running'].get_data_interface(interface_name).timestamps[:] - - return RunningSpeed( - timestamps=timestamps, - values=values, - ) - - def get_stimulus_presentations(self) -> pd.DataFrame: - - columns_to_ignore = set(['tags', 'timeseries', 'tags_index', 'timeseries_index']) - - presentation_dfs = [] - for interval_name, interval in self.nwbfile.intervals.items(): - if interval_name.endswith('_presentations'): - presentations = collections.defaultdict(list) - for col in interval.columns: - if col.name not in columns_to_ignore: - presentations[col.name].extend(col.data) - df = pd.DataFrame(presentations).replace({'N/A': ''}) - presentation_dfs.append(df) - - table = pd.concat(presentation_dfs, sort=False) - table = table.sort_values(by=["start_time"]) - table = table.reset_index(drop=True) - table.index.name = 'stimulus_presentations_id' - table.index = table.index.astype(int) - - for colname, series in table.items(): - types = set(series.map(type)) - if len(types) > 1 and str in types: - series.fillna('', inplace=True) - table[colname] = series.transform(str) - - return table[sorted(table.columns)] - - def get_invalid_times(self) -> pd.DataFrame: - - container = self.nwbfile.invalid_times - if container: - return container.to_dataframe() - else: - return pd.DataFrame() - - def get_image(self, name, module, image_api=None) -> sitk.Image: - - if image_api is None: - image_api = ImageApi - - nwb_img = self.nwbfile.modules[module].get_data_interface('images')[name] - data = nwb_img.data - resolution = nwb_img.resolution # px/cm - spacing = [resolution * 10, resolution * 10] - - return ImageApi.serialize(data, spacing, 'mm') diff --git a/allensdk/brain_observatory/nwb/nwb_utils.py b/allensdk/brain_observatory/nwb/nwb_utils.py deleted file mode 100644 index 5807eba461..0000000000 --- a/allensdk/brain_observatory/nwb/nwb_utils.py +++ /dev/null @@ -1,85 +0,0 @@ -# All of the omitted stimuli have a duration of 250ms as defined -# by the Visual Behavior team. For questions about duration contact that -# team. -from pynwb import NWBFile, ProcessingModule -from pynwb.base import Images -from pynwb.image import GrayscaleImage - -from allensdk.brain_observatory.behavior.image_api import ImageApi, Image - - -def get_column_name(table_cols: list, - possible_names: set) -> str: - """ - This function returns a column name, given a table with unknown - column names and a set of possible column names which are expected. - The table column name returned should be the only name contained in - the "expected" possible names. - :param table_cols: the table columns to search for the possible name within - :param possible_names: the names that could exist within the data columns - :return: the first entry of the intersection between the possible names - and the names of the columns of the stimulus table - """ - - column_set = set(table_cols) - column_names = list(column_set.intersection(possible_names)) - if not len(column_names) == 1: - raise KeyError("Table expected one name column in intersection, found:" - f" {column_names}") - return column_names[0] - - -def get_image(nwbfile: NWBFile, name: str, module: str) -> Image: - nwb_img = nwbfile.processing[module].get_data_interface('images')[name] - data = nwb_img.data - resolution = nwb_img.resolution # px/cm - spacing = [resolution * 10, resolution * 10] - - img = ImageApi.serialize(data, spacing, 'mm') - img = ImageApi.deserialize(img=img) - return img - - -def add_image_to_nwb(nwbfile: NWBFile, image_data: Image, image_name: str): - """ - Adds image given by image_data with name image_name to nwbfile - - Parameters - ---------- - nwbfile - nwbfile to add image to - image_data - The image data - image_name - Image name - - Returns - ------- - None - """ - module_name = 'ophys' - description = '{} image at pixels/cm resolution'.format(image_name) - - data, spacing, unit = image_data - - assert spacing[0] == spacing[1] and len( - spacing) == 2 and unit == 'mm' - - if module_name not in nwbfile.processing: - ophys_mod = ProcessingModule(module_name, - 'Ophys processing module') - nwbfile.add_processing_module(ophys_mod) - else: - ophys_mod = nwbfile.processing[module_name] - - image = GrayscaleImage(image_name, - data, - resolution=spacing[0] / 10, - description=description) - - if 'images' not in ophys_mod.containers: - images = Images(name='images') - ophys_mod.add_data_interface(images) - else: - images = ophys_mod['images'] - images.add_image(image) diff --git a/allensdk/brain_observatory/nwb/schemas.py b/allensdk/brain_observatory/nwb/schemas.py deleted file mode 100644 index 653fa72103..0000000000 --- a/allensdk/brain_observatory/nwb/schemas.py +++ /dev/null @@ -1,8 +0,0 @@ -from argschema.fields import String - -from allensdk.brain_observatory.argschema_utilities import check_read_access, check_write_access, RaisingSchema - - -class RunningSpeedPathsSchema(RaisingSchema): - running_speed_path = String(required=True, validate=check_read_access) - running_speed_timestamps_path = String(required=True, validate=check_read_access) \ No newline at end of file diff --git a/allensdk/brain_observatory/observatory_plots.py b/allensdk/brain_observatory/observatory_plots.py deleted file mode 100644 index 25ef1a8341..0000000000 --- a/allensdk/brain_observatory/observatory_plots.py +++ /dev/null @@ -1,511 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import matplotlib.pyplot as plt -import matplotlib.colors as mcolors -from matplotlib.colors import LinearSegmentedColormap -from matplotlib.collections import PatchCollection -import matplotlib.lines as mlines -import matplotlib.patches as mpatches -import scipy.interpolate as si -from scipy.stats import gaussian_kde -import matplotlib.colorbar as cbar -from mpl_toolkits.axes_grid1 import ImageGrid - -import allensdk.brain_observatory.circle_plots as cplots -from contextlib import contextmanager - -import numpy as np - -SI_RANGE = [ 0, 1.5 ] -P_VALUE_MAX = 0.05 -PEAK_DFF_MIN = 3 -N_HIST_BINS = 50 -STIM_COLOR = "#ccccdd" -STIMULUS_COLOR_MAP = LinearSegmentedColormap.from_list('default',[ [1.0,1.0,1.0,0.0], [.6,.6,.85,1.0] ]) -PUPIL_COLOR_MAP = LinearSegmentedColormap.from_list( - 'custom_plasma', [[0.050383, 0.029803, 0.527975], - [0.417642, 0.000564, 0.658390], - [0.692840, 0.165141, 0.564522], - [0.881443, 0.392529, 0.383229], - [0.988260, 0.652325, 0.211364], - [0.940015, 0.975158, 0.131326]]) -EVOKED_COLOR = "#b30000" -SPONTANEOUS_COLOR = "#0000b3" - -def plot_cell_correlation(sig_corrs, labels, colors, scale=15): - if len(sig_corrs) > 1: - alpha = 1.0 / (len(sig_corrs) + 1) - else: - alpha = 1.0 - - ax = plt.gca() - ps = [] - for sig_corr, color, label in zip(sig_corrs, colors, labels): - ax.hist(sig_corr, bins=30, range=[-1,1], - histtype='stepfilled', - facecolor=(.6,.6,.6,alpha), - edgecolor=color, - linewidth=1.5, - label=label) - - ax.set_xlabel("signal correlation") - ax.set_ylabel("cell count") - ax.xaxis.grid(True) - - leg = ax.legend(loc='upper left', frameon=False) - for i, t in enumerate(leg.get_texts()): - t.set_color(colors[i]) - - plt.text(.125, .5, u'\u2014', transform=ax.transAxes, - horizontalalignment='center', verticalalignment='center', - weight='bold', size='xx-large') - plt.text(.875, .5, '+', transform=ax.transAxes, - horizontalalignment='center', verticalalignment='center', - weight='bold', size='xx-large') - -def population_correlation_scatter(sig_corrs, noise_corrs, labels, colors, scale=15): - alpha = max(0.85 - 0.15 * (len(sig_corrs)-1), 0.2) - ax = plt.gca() - for sig_corr, noise_corr, color, label in zip(sig_corrs, noise_corrs, colors, labels): - inds = np.tril_indices(len(sig_corr)) - ax.scatter(sig_corr[inds], noise_corr[inds], - s=scale, - color=color, - linewidth=0.5, edgecolor='#333333', - label=label, - alpha=alpha) - ax.set_xlabel("signal correlation") - ax.set_ylabel("noise correlation") - ax.set_xlim([-1,1]) - ax.set_ylim([-1,1]) - leg = ax.legend(loc='upper left', frameon=False) - for i, t in enumerate(leg.get_texts()): - t.set_color(colors[i]) - - -def plot_mask_outline(mask, ax, color='k'): - pim = np.pad(mask, 1, 'constant', constant_values=(0,0)) - hedges = np.argwhere(np.diff(pim, axis=0)) - vedges = np.argwhere(np.diff(pim, axis=1)) - hlines = [ [ [r-.5, c-1.5], [r-.5, c-.5] ] for r,c in hedges ] - vlines = [ [ [r-1.5, c-.5], [r-.5, c-.5] ] for r,c in vedges ] - - for p1,p2 in hlines + vlines: - ax.add_line(mlines.Line2D([ p1[1], p2[1] ], - [ p1[0], p2[0] ], - linewidth=3, - color=color, - clip_on=False)) - - -class DimensionPatchHandler(object): - def __init__(self, vals, start_color, end_color, *args, **kwargs): - super(DimensionPatchHandler, self).__init__(*args, **kwargs) - self.vals = vals - self.start_color = start_color - self.end_color = end_color - - def legend_artist(self, legend, orig_handle, fontsize, handlebox): - x0, y0 = handlebox.xdescent, handlebox.ydescent - width, height = handlebox.width, handlebox.height - - num_vals = len(self.vals) - sub_width = float(width) / num_vals - x = x0 - for i in range(len(self.vals)): - rgb = self.dim_color(i) - r = mpatches.Rectangle((x+i*sub_width, y0), - sub_width, y0+height, - facecolor=rgb, linewidth=0) - - r.set_clip_on(False) - handlebox.add_artist(r) - return r - - def dim_color(self, index): - rgb1 = np.array(mcolors.colorConverter.to_rgb(self.start_color)) - rgb2 = np.array(mcolors.colorConverter.to_rgb(self.end_color)) - t = float(index) / (len(self.vals)+1) - rgb = t * rgb2 + (1.0 - t) * rgb1 - return rgb - -def float_label(n): - if isinstance(n, int): - return str(n) - if n.is_integer(): - return str(int(n)) - else: - return "%.2f" % n - -def plot_representational_similarity(rs, dims=None, dim_labels=None, colors=None, dim_order=None, labels=True): - if np.all(np.isnan(rs)): - return # if rs is all NaN (happens with only 1 cell), there is nothing to plot - if dim_order is not None: - rsr = np.arange(len(rs)).reshape(*map(len,dims)) - rsrt = rsr.transpose(dim_order) - ri = rsrt.flatten() - rs = rs[ri,:][:,ri] - - dims = np.array(dims)[dim_order] - colors = np.array(colors)[dim_order] - dim_labels = np.array(dim_labels)[dim_order] - - # force the color map to be centered at zero - clim = np.nanpercentile(rs, [5.0,95.0], axis=None) - vrange = max(abs(clim[0]), abs(clim[1])) - - rs = rs.copy() - np.fill_diagonal(rs, np.nan) - - if labels: - grid = ImageGrid(plt.gcf(), 111, - nrows_ncols=(1,1), - cbar_location="right", - cbar_mode="single", - cbar_size="7%", - cbar_pad=0.05) - - for ax in grid: pass - else: - ax = plt.gca() - - im = ax.imshow(rs, interpolation='nearest', cmap='RdBu_r', vmin=-vrange, vmax=vrange) - ax.set_xticklabels([]) - ax.set_yticklabels([]) - ax.set_xticks([]) - ax.set_yticks([]) - - if labels: - cbar = ax.cax.colorbar(im) - cbar.set_label_text('stimulus correlation') - - if dims is not None: - dim_labels = ["%s(%s)" % (dim_labels[i],', '.join(map(float_label, dims[i].tolist()))) for i in range(len(dims)) ] - dim_handlers = [ DimensionPatchHandler(dims[i], colors[i], 'w') for i in range(len(dims)) ] - - n = len(rs) - for cell_i in range(n): - idx = np.unravel_index(cell_i, map(len, dims)) - - start = -(len(dims))*2 - width = 1.8 - for dim_i, color in enumerate(colors): - v_i = idx[dim_i] - rgb = dim_handlers[dim_i].dim_color(v_i) - r = mpatches.Rectangle((start + dim_i * width, cell_i-.5), - width, 1.2, - facecolor=rgb, linewidth=0) - r.set_clip_on(False) - ax.add_patch(r) - - r = mpatches.Rectangle((cell_i-.5, start + dim_i * width), - 1.2, width, - facecolor=rgb, linewidth=0) - r.set_clip_on(False) - ax.add_patch(r) - - if labels: - patches = [ mpatches.Patch(label=dim_labels[i]) for i in range(len(dims)) ] - ax.legend(handles=patches, - handler_map=dict(zip(patches,dim_handlers)), - loc='upper left', - bbox_to_anchor=(0,0), - ncol=2, - fontsize=9, - frameon=False) - - if labels: - plt.subplots_adjust(left=0.07, - right=.88, - wspace=0.0, hspace=0.0) - -def plot_condition_histogram(vals, bins, color=STIM_COLOR): - plt.grid() - if len(vals) > 1: - vals = [np.array(vals).flatten()] # matplotlib >= 2.1 needs this - if len(vals) > 0: - n, hbins, patches = plt.hist(vals, - bins=np.arange(len(bins)+1)+1, - align='left', - density=False, - rwidth=.8, - color=color, - zorder=3) - else: - hbins = np.arange(len(bins)+1)+1 - plt.xticks(hbins[:-1], np.round(bins, 2)) - - -def plot_selectivity_cumulative_histogram(sis, - xlabel, - si_range=SI_RANGE, - n_hist_bins=N_HIST_BINS, - color=STIM_COLOR): - if len(sis) > 1: - sis = [np.array(sis).flatten()] # matplotlib >= 2.1 needs this - - bins = np.linspace(si_range[0], si_range[1], n_hist_bins) - yticks = np.linspace(0,1,5) - xticks = np.linspace(si_range[0], si_range[1], 4) - - yscale = 1.0 - # this is for normalizing to total # cells, not just significant cells - # yscale = float(num_cells) / len(osis) - - # orientation selectivity cumulative histogram - if len(sis) > 0: - n, bins, patches = plt.hist(sis, density=True, bins=bins, - cumulative=True, histtype='stepfilled', - color=color) - plt.xlim(si_range) - plt.ylim([0,yscale]) - plt.yticks(yticks*yscale, yticks) - plt.xticks(xticks) - - plt.xlabel(xlabel) - plt.ylabel("fraction of cells") - plt.grid() - -def plot_radial_histogram(angles, - counts, - all_angles=None, - include_labels=False, - offset=180.0, - direction=-1, - closed=False, - color=STIM_COLOR): - if all_angles is None: - if len(angles) < 2: - all_angles = np.linspace(0, 315, 8) - else: - all_angles = angles - - dth = (all_angles[1] - all_angles[0]) * 0.5 - - if len(counts) == 0: - max_count = 1 - else: - max_count = max(counts) - - wedges = [] - for count, angle in zip(counts, angles): - angle = angle*direction + offset - wedge = mpatches.Wedge((0,0), count, angle-dth, angle+dth) - wedges.append(wedge) - - wedge_coll = PatchCollection(wedges) - wedge_coll.set_facecolor(color) - wedge_coll.set_zorder(2) - - angles_rad = (all_angles*direction + offset)*np.pi/180.0 - - if closed: - border_coll = cplots.radial_circles([max_count]) - else: - border_coll = cplots.radial_arcs([max_count], - min(angles_rad), - max(angles_rad)) - border_coll.set_facecolor((0,0,0,0)) - border_coll.set_zorder(1) - - line_coll = cplots.angle_lines(angles_rad, 0, max_count) - line_coll.set_edgecolor((0,0,0,1)) - line_coll.set_linestyle(":") - line_coll.set_zorder(1) - - ax = plt.gca() - ax.add_collection(wedge_coll) - ax.add_collection(border_coll) - ax.add_collection(line_coll) - - if include_labels: - cplots.add_angle_labels(ax, angles_rad, all_angles.astype(int), max_count, (0,0,0,1), offset=max_count*0.1) - ax.set(xlim=(-max_count*1.2, max_count*1.2), - ylim=(-max_count*1.2, max_count*1.2), - aspect=1.0) - else: - ax.set(xlim=(-max_count*1.05, max_count*1.05), - ylim=(-max_count*1.05, max_count*1.05), - aspect=1.0) - -def plot_time_to_peak(msrs, ttps, t_start, t_end, stim_start, stim_end, cmap): - plt.plot(ttps, np.arange(msrs.shape[0],0,-1)-0.5, color='black') - if msrs.shape[0] > 0: - plt.imshow(msrs, - cmap=cmap, clim=[0,3], - aspect=float((t_end-t_start) / msrs.shape[0]), # float to get rid of MPL error - extent=[t_start, t_end, 0, msrs.shape[0]], interpolation='nearest') - plt.ylim([0,msrs.shape[0]]) - else: - plt.ylim([0, 1]) - plt.xlim([t_start, t_end]) - - plt.axvline(stim_start, linestyle=':', color='black') - plt.axvline(stim_end, linestyle=':', color='black') - - xticks = np.array([ t_start, stim_start, stim_end, t_end ]) - plt.xticks(xticks, np.round(xticks - stim_start, 2)) - plt.xlabel("time from stimulus start (s)") - - yticks, _ = plt.yticks() - plt.ylabel("cell number") - -@contextmanager -def figure_in_px(w, h, file_name, dpi=96.0, transparent=False): - fig = plt.figure(figsize=(w/dpi, h/dpi), dpi=dpi) - - yield fig - - plt.savefig(file_name, dpi=dpi, transparent=transparent) - plt.close() - -def finalize_no_axes(pad=0.0): - plt.axis('off') - plt.subplots_adjust(left=pad, - right=1.0-pad, - bottom=pad, - top=1.0-pad, - wspace=0.0, hspace=0.0) - -def finalize_with_axes(pad=.3): - plt.tight_layout(pad=pad) - -def finalize_no_labels(pad=.3, legend=False): - ax = plt.gca() - ax.set_xlabel("") - ax.set_ylabel("") - ax.set_xticklabels([]) - ax.set_yticklabels([]) - if not legend and ax.legend_ is not None: - ax.legend_.remove() - plt.tight_layout(pad=pad) - -def plot_combined_speed(binned_resp_vis, binned_dx_vis, binned_resp_sp, binned_dx_sp, - evoked_color, spont_color): - ax = plt.gca() - num_bins = max(binned_dx_vis.shape[0], binned_dx_sp.shape[0]) - - plot_speed(binned_resp_vis, binned_dx_vis, num_bins, evoked_color) - plot_speed(binned_resp_sp, binned_dx_sp, num_bins, spont_color) - - xmin = min(binned_dx_vis[:,0].min(), binned_dx_sp[:,0].min()) - xmax = max(binned_dx_vis[:,0].max(), binned_dx_sp[:,0].max()) - - - ymin = min(binned_resp_vis[:,0].min(), binned_resp_sp[:,0].min()) - ymax = max(binned_resp_vis[:,0].max(), binned_resp_sp[:,0].max()) - - xpadding = (xmax-xmin)*.05 - ypadding = (ymax-ymin)*.20 - - ax.set_xlim([xmin - xpadding, xmax + xpadding]) - ax.set_ylim([ymin - ypadding, ymax + ypadding]) - - -def plot_speed(binned_resp, binned_dx, num_bins, color): - ax = plt.gca() - - # plot the zero bin as a dot with whiskers - ax.errorbar([ binned_dx[0,0] ], [ binned_resp[0,0] ], yerr=[ binned_resp[0,1] ], fmt='o', color=color) - - # if there's only one bin, drop out - if len(binned_dx[:,0]) <= 1: - return - - f = si.interp1d(binned_dx[:,0], binned_resp[:,0]) - x = np.linspace(min(binned_dx[:,0]), max(binned_dx[:,0]), num=num_bins, endpoint=True) - y = f(x) - - f_up = si.interp1d(binned_dx[:,0], binned_resp[:,0] + binned_resp[:,1]) - y_up = f_up(x) - - f_down = si.interp1d(binned_dx[:,0], binned_resp[:,0] - binned_resp[:,1]) - y_down = f_down(x) - - ax.plot(x, y, color=color) - ax.fill_between(x, y_down, y_up, facecolor=color, alpha=0.1) - - -def plot_receptive_field(rf, color_map=None, clim=None, - mask=None, outline_color='#cccccc', - scalebar=True): - if mask is not None: - rf = np.ma.array(rf, mask=~mask) - - if clim is None: - clim = np.nanpercentile(rf, [1.0,99.0], axis=None) - - plt.imshow(rf, interpolation='nearest', - cmap=color_map, - clim=clim, - origin='bottom') - - if mask is not None: - plot_mask_outline(mask, plt.gca(), outline_color) - - if scalebar: - scale_dims = np.array([ 28.0, 16.0 ]) - scale_p = [ 26.8, 14.8 ] - text_p = [ scale_p[0]+0.5, scale_p[1]-0.5 ] - - - ax = plt.gca() - ax.add_patch(mpatches.Rectangle(scale_p / scale_dims, - 1.0/scale_dims[0], 1.0/scale_dims[1], - facecolor='w', - transform=ax.transAxes, - linewidth=1.0, - edgecolor=outline_color)) - plt.text(text_p[0] / scale_dims[0], text_p[1] / scale_dims[1], "4deg", - horizontalalignment='center', - verticalalignment='center', - transform=ax.transAxes) - - - -def plot_pupil_location(xy_deg, s=1, c=None, cmap=PUPIL_COLOR_MAP, - edgecolor='', include_labels=True): - if c is None: - xy_deg = xy_deg[~np.isnan(xy_deg).any(axis=1)] - c = gaussian_kde(xy_deg.T)(xy_deg.T) - plt.scatter(xy_deg[:,0], xy_deg[:,1], s=s, c=c, cmap=cmap, - edgecolor=edgecolor) - plt.xlim(-70, 70) - plt.ylim(-70, 70) - - if include_labels: - plt.xlabel("azimuth (degrees)") - plt.ylabel("altitude (degrees)") diff --git a/allensdk/brain_observatory/ophys/__init__.py b/allensdk/brain_observatory/ophys/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/brain_observatory/ophys/trace_extraction/__init__.py b/allensdk/brain_observatory/ophys/trace_extraction/__init__.py deleted file mode 100644 index 1a36940705..0000000000 --- a/allensdk/brain_observatory/ophys/trace_extraction/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import warnings - -warnings.warn("trace_extraction functionality has been moved from AllenSDK " - "to https://github.com/AllenInstitute/ophys_etl_pipelines ." - "The functionality in this AllenSDK package will be removed " - "in v3.0.0.", - category=DeprecationWarning, - stacklevel=2) diff --git a/allensdk/brain_observatory/ophys/trace_extraction/__main__.py b/allensdk/brain_observatory/ophys/trace_extraction/__main__.py deleted file mode 100644 index b45fa05bd9..0000000000 --- a/allensdk/brain_observatory/ophys/trace_extraction/__main__.py +++ /dev/null @@ -1,163 +0,0 @@ -import logging -import sys -import marshmallow -import argparse -import os -import sys - -import numpy as np -import requests -import h5py -import argschema - -from allensdk.brain_observatory.argschema_utilities import write_or_print_outputs -from allensdk.brain_observatory import roi_masks - -from ._schemas import InputSchema, OutputSchema - - -def create_roi_masks(rois, w, h, motion_border): - roi_list = [] - - for roi in rois: - mask = np.array(roi["mask"], dtype=bool) - px = np.argwhere(mask) - px[:,0] += roi["y"] - px[:,1] += roi["x"] - - mask = roi_masks.create_roi_mask(w, h, motion_border, - pix_list=px[:,[1,0]], - label=str(roi["id"]), - mask_group=roi.get("mask_page",-1)) - - roi_list.append(mask) - - # sort by roi id - roi_list.sort(key=lambda x: x.label) - - return roi_list - - -def get_inputs_from_lims( - host, ophys_experiment_id, output_root, - job_queue, strategy -): - ''' This is a development / testing utility for running this module from the Allen Institute for Brain Science's - Laboratory Information Management System (LIMS). It will only work if you are on our internal network. - - Parameters - ---------- - ophys_experiment_id : int - Unique identifier for experiment of interest. - output_root : str - Output file will be written into this directory. - job_queue : str - Identifies the job queue from which to obtain configuration data - strategy : str - Identifies the LIMS strategy which will be used to write module inputs. - - Returns - ------- - data : dict - Response from LIMS. Should meet the schema defined in _schemas.py - - ''' - - uri = f'{host}/input_jsons?object_id={ophys_experiment_id}&object_class=OphysExperiment&strategy_class={strategy}&job_queue_name={job_queue}&output_directory={output_root}' - response = requests.get(uri) - data = response.json() - - if len(data) == 1 and 'error' in data: - raise ValueError('bad request uri: {} ({})'.format(uri, data['error'])) - - return data - - -def write_trace_file(data, names, path): - logging.debug("Writing {}".format(path)) - - if sys.version_info.major == 2: - utf_dtype = h5py.special_dtype(vlen=unicode) - elif sys.version_info.major == 3: - utf_dtype = h5py.special_dtype(vlen=str) - else: - raise TypeError("unable to create a variable length h5 string dtype in python version: {}", sys.version_info) - - with h5py.File(path, 'w') as fil: - fil["data"] = data - fil.create_dataset("roi_names", data=np.array(names).astype(np.string_), dtype=utf_dtype) - - -def extract_traces(motion_corrected_stack, motion_border, storage_directory, rois, log_0, **kwargs): - - # find width and height of movie - with h5py.File(motion_corrected_stack, "r") as f: - d = f["data"] - h = d.shape[1] - w = d.shape[2] - - # motion border - border = [ - motion_border["x0"], - motion_border["x1"], - motion_border["y0"], - motion_border["y1"] - ] - - # create roi mask objects - roi_mask_list = create_roi_masks(rois, w, h, border) - roi_names = [ roi.label for roi in roi_mask_list ] - - # extract traces - roi_traces, neuropil_traces, exclusions = roi_masks.calculate_roi_and_neuropil_traces( - motion_corrected_stack, roi_mask_list, border - ) - - roi_file = os.path.abspath(os.path.join(storage_directory, "roi_traces.h5")) - write_trace_file(roi_traces, roi_names, roi_file) - - np_file = os.path.abspath(os.path.join(storage_directory, "neuropil_traces.h5")) - write_trace_file(neuropil_traces, roi_names, np_file) - - return { - 'neuropil_trace_file': np_file, - 'roi_trace_file': roi_file, - 'exclusion_labels': exclusions - } - - -def main(): - logging.basicConfig(format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') - - remaining_args = sys.argv[1:] - input_data = {} - if '--get_inputs_from_lims' in sys.argv: - lims_parser = argparse.ArgumentParser(add_help=False) - lims_parser.add_argument('--host', type=str, default='http://lims2') - lims_parser.add_argument('--job_queue', type=str, default='OPHYS_EXTRACT_TRACES_QUEUE') - lims_parser.add_argument('--strategy', type=str,default='ExtractTracesStrategy') - lims_parser.add_argument('--ophys_experiment_id', type=int, default=None) - lims_parser.add_argument('--output_root', type=str, default= None) - - lims_args, remaining_args = lims_parser.parse_known_args(remaining_args) - remaining_args = [item for item in remaining_args if item != '--get_inputs_from_lims'] - input_data = get_inputs_from_lims(**lims_args.__dict__) - - - try: - parser = argschema.ArgSchemaParser( - args=remaining_args, - input_data=input_data, - schema_type=InputSchema, - output_schema_type=OutputSchema, - ) - except marshmallow.exceptions.ValidationError as err: - print(input_data) - raise - - output = extract_traces(**parser.args) - write_or_print_outputs(output, parser) - - -if __name__ == '__main__': - main() diff --git a/allensdk/brain_observatory/ophys/trace_extraction/_schemas.py b/allensdk/brain_observatory/ophys/trace_extraction/_schemas.py deleted file mode 100644 index 89c6528b7d..0000000000 --- a/allensdk/brain_observatory/ophys/trace_extraction/_schemas.py +++ /dev/null @@ -1,74 +0,0 @@ -from argschema import ArgSchema -from argschema.fields import LogLevel, String, Nested, Boolean, Float, List, \ - Integer -from marshmallow import RAISE - -from allensdk.brain_observatory.argschema_utilities import RaisingSchema - - -class MotionBorder(RaisingSchema): - x0 = Float(default=0.0, - description='') # TODO: be really certain about how these - # relate to physical space and then write it here - x1 = Float(default=0.0, description='') - y0 = Float(default=0.0, description='') - y1 = Float(default=0.0, description='') - - -class Roi(RaisingSchema): - mask = List(List(Boolean), required=True, description='raster mask') - y = Integer(required=True, - description='y position (pixels) of mask\'s bounding box') - x = Integer(required=True, - description='x position (pixels) of mask\'s bounding box') - width = Integer(required=True, - description='width (pixels)of mask\'s bounding box') - height = Integer(required=True, - description='height (pixels) of mask\'s bounding box') - valid = Boolean(default=True, description='Is this Roi known to be valid?') - id = Integer(required=True, - description='unique integer identifier for this Roi') - mask_page = Integer(default=-1, - description='') # TODO: this isn't in the examples - # I'm looking at. What is it? - - -class ExclusionLabel(RaisingSchema): - roi_id = String(required=True) - exclusion_label_name = String(required=True) - - -class InputSchema(ArgSchema): - class Meta: - unknown = RAISE - - log_level = LogLevel(default='INFO', - description='set the logging level of the module') - motion_border = Nested(MotionBorder, required=True, - description='border widths - pixels outside the ' - 'border are considered invalid') - storage_directory = String(required=True, - description='used to set output directory') - motion_corrected_stack = String(required=True, - description='path to h5 file containing ' - 'motion corrected image stack') - rois = Nested(Roi, many=True, - description='specifications of individual regions of ' - 'interest') - log_0 = String(required=True, - description='path to motion correction output csv') # - # TODO: is this redundant with motion border? - - -class OutputSchema(RaisingSchema): - input_parameters = Nested(InputSchema) - neuropil_trace_file = String( - required=True, - description='path to output h5 file containing neuropil traces') # - # TODO rename these to _path - roi_trace_file = String( - required=True, - description='path to output h5 file containing roi traces') - exclusion_labels = Nested( - ExclusionLabel, many=True, - description='a report of roi-wise problems detected during extraction') diff --git a/allensdk/brain_observatory/r_neuropil.py b/allensdk/brain_observatory/r_neuropil.py deleted file mode 100644 index 7619b31217..0000000000 --- a/allensdk/brain_observatory/r_neuropil.py +++ /dev/null @@ -1,370 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -import scipy.sparse as sparse -from scipy.linalg import solve_banded -import logging - - -def get_diagonals_from_sparse(mat): - ''' Returns a dictionary of diagonals keyed by offsets - - Parameters - ---------- - mat: scipy.sparse matrix - - Returns - ------- - dictionary: diagonals keyed by offsets - ''' - - mat_dia = mat.todia() # make sure the matrix is in diagonal format - - offsets = mat_dia.offsets - diagonals = mat_dia.data - - mat_dict = {} - - for i, o in enumerate(offsets): - mat_dict[o] = diagonals[i] - - return mat_dict - - -def ab_from_diagonals(mat_dict): - ''' Constructs value for scipy.linalg.solve_banded - - Parameters - ---------- - mat_dict: dictionary of diagonals keyed by offsets - - Returns - ------- - ab: value for scipy.linalg.solve_banded - ''' - offsets = list(mat_dict.keys()) - l = -np.min(offsets) - u = np.max(offsets) - - T = mat_dict[offsets[0]].shape[0] - - ab = np.zeros([l + u + 1, T]) - - for o in offsets: - index = u - o - ab[index] = mat_dict[o] - - return ab - - -def error_calc(F_M, F_N, F_C, r): - - er = np.sqrt(np.mean(np.square(F_C - (F_M - r * F_N)))) / np.mean(F_M) - - return er - - -def error_calc_outlier(F_M, F_N, F_C, r): - - std_F_M = np.std(F_M) - mean_F_M = np.mean(F_M) - ind_outlier = np.where(F_M > mean_F_M + 2. * std_F_M) - - er = np.sqrt(np.mean(np.square( - F_C[ind_outlier] - (F_M[ind_outlier] - r * F_N[ind_outlier])))) / np.mean(F_M[ind_outlier]) - - return er - - -def ab_from_T(T, lam, dt): - # using csr because multiplication is fast - Ls = -sparse.eye(T - 1, T, format='csr') + \ - sparse.eye(T - 1, T, 1, format='csr') - Ls /= dt - Ls2 = Ls.T.dot(Ls) - - M = sparse.eye(T) + lam * Ls2 - mat_dict = get_diagonals_from_sparse(M) - ab = ab_from_diagonals(mat_dict) - - return ab - - -def normalize_F(F_M, F_N): - F_N_min, F_N_max = float(np.amin(F_N)), float(np.amax(F_N)) - - # rescale so F_N is [0,1] - F_M_s = (F_M - F_N_min) / (F_N_max - F_N_min) - F_N_s = (F_N - F_N_min) / (F_N_max - F_N_min) - - return F_M_s, F_N_s - - -def alpha_filter(A=1.0, alpha=0.05, beta=0.25, T=100): - return A * np.exp(-alpha * np.arange(T)) - np.exp(-beta * np.arange(T)) - - -def validate_with_synthetic_F(T, N): - """ Compute N synthetic traces of length T with known values of r, then estimate r. - TODO: docs - """ - af1 = alpha_filter() - af2 = alpha_filter(alpha=0.1, beta=0.5) - - r_truth_vals = [] - r_est_vals = [] - - for n in range(N): - F_M_truth, F_N_truth, F_C_truth, r_truth = synthesize_F(T, af1, af2) - results = estimate_contamination_ratios(F_M_truth, F_N_truth) - - r_est = results['r'] - - r_truth_vals.append(r_truth) - r_est_vals.append(r_est) - - return r_truth_vals, r_est_vals - - -def synthesize_F(T, af1, af2, p1=0.05, p2=0.1): - """ Build a synthetic F_C, F_M, F_N, and r of length T - TODO: docs - """ - x1 = np.random.random(T) < p1 - F_C = np.convolve(af1, x1, mode='full')[:T] - - x2 = np.random.random(T) < p2 - F_N = np.convolve(af2, x2, mode='full')[:T] - - r = 2.0 * np.random.random() - - F_M = F_C + r * F_N - - return F_M, F_N, F_C, r - - -class NeuropilSubtract(object): - """ TODO: docs - """ - - def __init__(self, lam=0.05, dt=1.0, folds=4): - self.lam = lam - self.dt = dt - self.folds = folds - - self.T = None - self.T_f = None - self.ab = None - - self.F_M = None - self.F_N = None - - self.r_vals = None - self.error_vals = None - self.r = None - self.error = None - - def set_F(self, F_M, F_N): - """ Break the F_M and F_N traces into the number of folds specified - in the class constructor and normalize each fold of F_M and R_N relative to F_N. - """ - - F_M_len = len(F_M) - F_N_len = len(F_N) - - if F_M_len != F_N_len: - raise Exception( - "F_M and F_N must have the same length (%d vs %d)" % (F_M_len, F_N_len)) - - if self.T != F_M_len: - logging.debug("updating ab matrix for new T=%d", F_M_len) - self.T = F_M_len - self.T_f = int(self.T / self.folds) - self.ab = ab_from_T(self.T_f, self.lam, self.dt) - - self.F_M = [] - self.F_N = [] - - for fi in range(self.folds): - # F_M_i_s, F_N_i_s = normalize_F(F_M[fi*self.T_f:(fi+1)*self.T_f], - # F_N[fi*self.T_f:(fi+1)*self.T_f]) - self.F_M.append(F_M[fi * self.T_f:(fi + 1) * self.T_f]) - self.F_N.append(F_N[fi * self.T_f:(fi + 1) * self.T_f]) - - def fit_block_coordinate_desc(self, r_init=5.0, min_delta_r=0.00000001): - F_M = np.concatenate(self.F_M) - F_N = np.concatenate(self.F_N) - - r_vals = [] - error_vals = [] - r = r_init - - delta_r = None - it = 0 - - ab = ab_from_T(self.T, self.lam, self.dt) - while delta_r is None or delta_r > min_delta_r: - F_C = solve_banded((1, 1), ab, F_M - r * F_N) - new_r = - np.sum((F_C - F_M) * F_N) / np.sum(np.square(F_N)) - error = self.estimate_error(new_r) - - error_vals.append(error) - r_vals.append(new_r) - - if r is not None: - delta_r = np.abs(r - new_r) / r - - r = new_r - it += 1 - - self.r_vals = r_vals - self.error_vals = error_vals - self.r = r_vals[-1] - self.error = error_vals.min() - - def fit(self, r_range=[0.0, 2.0], iterations=3, dr=0.1, dr_factor=0.1): - """ Estimate error values for a range of r values. Identify a new r range - around the minimum error values and repeat multiple times. - TODO: docs - """ - global_min_error = None - global_min_r = None - - r_vals = [] - error_vals = [] - - it_range = r_range - it = 0 - - it_dr = dr - while it < iterations: - it_errors = [] - - # build a set of r values evenly distributed in a current range - rs = np.arange(it_range[0], it_range[1], it_dr) - - # estimate error for each r - for r in rs: - error = self.estimate_error(r) - it_errors.append(error) - - r_vals.append(r) - error_vals.append(error) - - # find the minimum in this range and update the global minimum - min_i = np.argmin(it_errors) - min_error = it_errors[min_i] - - if global_min_error is None or min_error < global_min_error: - global_min_error = min_error - global_min_r = rs[min_i] - - logging.debug("iteration %d, r=%0.4f, e=%.6e", - it, global_min_r, global_min_error) - - # if the minimum error is on the upper boundary, - # extend the boundary and redo this iteration - if min_i == len(it_errors) - 1: - logging.debug( - "minimum error found on upper r bound, extending range") - it_range = [rs[-1], rs[-1] + (rs[-1] - rs[0])] - else: - # error is somewhere on either side of the minimum error index - it_range = [rs[max(min_i - 1, 0)], - rs[min(min_i + 1, len(rs) - 1)]] - it_dr *= dr_factor - it += 1 - - self.r_vals = r_vals - self.error_vals = error_vals - self.r = global_min_r - self.error = global_min_error - - def estimate_error(self, r): - """ Estimate error values for a given r for each fold and return the mean. """ - - errors = np.zeros(self.folds) - for fi in range(self.folds): - F_M = self.F_M[fi] - F_N = self.F_N[fi] - F_C = solve_banded((1, 1), self.ab, F_M - r * F_N) - errors[fi] = abs(error_calc(F_M, F_N, F_C, r)) - - return np.mean(errors) - - -def estimate_contamination_ratios(F_M, F_N, - lam=0.05, folds=4, iterations=3, - r_range=[0.0, 2.0], dr=0.1, dr_factor=0.1): - ''' Calculates neuropil contamination of ROI - - Parameters - ---------- - F_M: ROI trace - F_N: Neuropil trace - - Returns - ------- - dictionary: key-value pairs - * 'r': the contamination ratio -- corrected trace = M - r*N - * 'err': RMS error - * 'min_error': minimum error - * 'bounds_error': boolean. True if error or R are outside tolerance - ''' - - ns = NeuropilSubtract(lam=lam, folds=folds) - - ns.set_F(F_M, F_N) - - ns.fit(r_range=r_range, - iterations=iterations, - dr=dr, - dr_factor=dr_factor) - - # ns.fit_block_coordinate_desc() - - if ns.r < 0: - logging.warning("r is negative (%f). return 0.0.", ns.r) - ns.r = 0 - - return { - "r": ns.r, - "r_vals": ns.r_vals, - "err": ns.error, - "err_vals": ns.error_vals, - "min_error": ns.error, - "it": len(ns.r_vals) - } diff --git a/allensdk/brain_observatory/receptive_field_analysis/__init__.py b/allensdk/brain_observatory/receptive_field_analysis/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/brain_observatory/receptive_field_analysis/chisquarerf.py b/allensdk/brain_observatory/receptive_field_analysis/chisquarerf.py deleted file mode 100644 index 97647b9c6f..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/chisquarerf.py +++ /dev/null @@ -1,510 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -import scipy.interpolate as si -import scipy.ndimage.filters as filt -import scipy.stats as stats - - -ON_LUMINANCE = 255 -OFF_LUMINANCE = 0 - - -def chi_square_binary(events, LSN_template): - # note: can only be applied to binary events for trial responses - # - # *****INPUT***** - # events: 2D numpy bool with shape (num_trials,num_cells) for presence - # or absence of response on a given trial - # LSN_template: 3D numpy int8 with shape (num_trials,num_y_pixels,num_x_pixels) - # for luminance at each pixel location - # - # *****OUTPUT***** - # chi_square_grid_NLL: 3D numpy float with shape (num_cells,num_y_pixels,num_x_pixels) - # that gives the p value for the hypothesis that a receptive field is contained - # within a 7x7 pixel mask centered on a given pixel location as measured - # by a chi-square test for the responses among the pixels (both on and off) - # that fall within the mask. - - num_trials = np.shape(events)[0] - num_cells = np.shape(events)[1] - num_y = np.shape(LSN_template)[1] - num_x = np.shape(LSN_template)[2] - - # for each pixel location, get a mask that is centered on that location - # disc_masks has shape (num_y,num_x,num_y,num_x) - disc_masks = get_disc_masks(LSN_template) - - # determine which trials each pixel is active (i.e not gray), - # broken up by ON and OFF pixels. - # trial_matrix has shape (num_y,num_x,2,num_trials) - trial_matrix = build_trial_matrix(LSN_template, num_trials) - - # get the total number of trials each pixel is active (i.e. not gray) - # trials_per_pixel has shape (num_y,num_x,2) - trials_per_pixel = np.sum(trial_matrix, axis=3) - - # get the sum of the number of events across all trials that each pixel is active - # events_per_pixel has shape (num_cells,num_y,num_x,2) - events_per_pixel = get_events_per_pixel(events, trial_matrix) - - # smooth stimulus-triggered average spatially with a gaussian - for n in range(num_cells): - for on_off in range(2): - events_per_pixel[n, :, :, on_off] = smooth_STA(events_per_pixel[n, :, :, on_off]) - - # calculate the p_value for each exclusion region - chi_square_grid = np.zeros((num_cells, num_y, num_x)) - for y in range(num_y): - for x in range(num_x): - exclusion_mask = np.ones((num_y, num_x, 2)) * disc_masks[y, x, :, :].reshape(num_y, num_x, 1) - p_vals, __ = chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel) - chi_square_grid[:, y, x] = p_vals - - return chi_square_grid - - -def get_peak_significance(chi_square_grid_NLL, - LSN_template, - alpha=0.05): - # ****INPUT***** - # chi_square_grid_NLL: result of chi_square_binary(events,LSN_template) - # LSN_template: 3D numpy int8 with shape (num_trials,num_y_pixels,num_x_pixels) - # for luminance at each pixel location - # - # *****OUTPUT***** - # significant_cells: 1D numpy bool with shape (num_cells,) that indicates - # whether or not each cell has a location with a significant chance of a - # true receptive field - # best_exclusion_region_list: list of 2D numpy bool with len (num_cells). For each cell, - # the array is a mask for the best pixel, or all false - - num_cells = np.shape(chi_square_grid_NLL)[0] - num_y = np.shape(chi_square_grid_NLL)[1] - num_x = np.shape(chi_square_grid_NLL)[2] - - chi_square_grid = NLL_to_pvalue(chi_square_grid_NLL) - - # get the average size of all masks in units of number of pixels - disc_masks = get_disc_masks(LSN_template) - pixels_per_mask_per_pixel = np.sum(disc_masks, axis=(2, 3)).astype(float) - - # find the smallest p-value and determine if it's significant - significant_cells = np.zeros((num_cells)).astype(bool) - best_p = np.zeros((num_cells)) - p_value_correction_factor_per_pixel = (1.0 * num_y * num_x / pixels_per_mask_per_pixel) - - best_exclusion_region_list = [] - corrected_p_value_array_list = [] - for n in range(num_cells): - - # Sidak correction: - p_value_corrected_per_pixel = 1-np.power((1-chi_square_grid[n, :,:]), p_value_correction_factor_per_pixel) - corrected_p_value_array_list.append(p_value_corrected_per_pixel) - - y, x = np.unravel_index(p_value_corrected_per_pixel.argmin(), (num_y, num_x)) - - # if more than one p-value that maxes out, use the median location - if np.sum(p_value_corrected_per_pixel == 0.0) > 1: - - y, x = np.unravel_index(np.argwhere(p_value_corrected_per_pixel.flatten() == 0.0)[:, 0], (num_y, num_x)) - center_y, center_x = locate_median(y, x) - - best_p[n] = p_value_corrected_per_pixel[y,x] - if best_p[n] < alpha: - significant_cells[n] = True - best_exclusion_region_list.append(disc_masks[y, x, :,:].astype(np.bool)) - else: - best_exclusion_region_list.append(np.zeros((disc_masks.shape[0], disc_masks.shape[1]), dtype=np.bool)) - - return significant_cells, best_p, corrected_p_value_array_list, best_exclusion_region_list - - -def locate_median(y, x): - - med_x = np.median(x) - med_y = np.median(y) - center_x = x[0] - center_y = y[0] - - for i in range(len(x)): - dx = x[i] - med_x - dy = y[i] - med_y - dc_x = center_x - med_x - dc_y = center_y - med_y - - if np.sqrt(dx ** 2 + dy ** 2) < np.sqrt(dc_x ** 2 + dc_y ** 2): - center_x = x[i] - center_y = y[i] - - return center_y, center_x - - -def pvalue_to_NLL(p_values, max_NLL=10.0): - return np.where(p_values == 0.0, max_NLL, -np.log10(p_values)) - - -def NLL_to_pvalue(NLLs, log_base=10.0): - return (log_base ** (-NLLs)) - - -def get_events_per_pixel(responses_np, trial_matrix): - '''Obtain a matrix linking cellular responses to pixel activity. - - Parameters - ---------- - responses_np : np.ndarray - Dimensions are (nTrials, nCells). Boolean values indicate presence/absence - of a response on a given trial. - trial_matrix : np.ndarray - Dimensions are (nYPixels, nXPixels, {on, off}, nTrials). Boolean values - indicate that a pixel was on/off on a particular trial. - - Returns - ------- - events_per_pixel : np.ndarray - Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Values for each - cell, pixel, and on/off state are the sum of events for that cell across - all trials where the pixel was in the on/off state. - - ''' - - num_cells = np.shape(responses_np)[1] - num_y = np.shape(trial_matrix)[0] - num_x = np.shape(trial_matrix)[1] - - events_per_pixel = np.zeros((num_cells, num_y, num_x, 2)) - for y in range(num_y): - for x in range(num_x): - for on_off in range(2): - frames = np.argwhere(trial_matrix[y, x, on_off, :])[:, 0] - events_per_pixel[:, y, x, on_off] = np.sum(responses_np[frames, :], axis=0) - - return events_per_pixel - - -def smooth_STA(STA, gauss_std=0.75, total_degrees=64): - '''Smooth an image by convolution with a gaussian kernel - - Parameters - ---------- - STA : np.ndarray - Input image - gauss_std : numeric, optional - Standard deviation of the gaussian kernel. Will be applied to the - upsampled image, so units are visual degrees. Default is 0.75 - total_degrees : int, optional - Size in visual degrees of the input image along its zeroth (row) axis. - Used to set the scale factor for up/downsampling. - - Returns - ------- - STA_smoothed : np.ndarray - Smoothed image - ''' - - deg_per_pnt = total_degrees // STA.shape[0] - STA_interpolated = interpolate_RF(STA, deg_per_pnt) - STA_interpolated_smoothed = filt.gaussian_filter(STA_interpolated, gauss_std) - STA_smoothed = deinterpolate_RF(STA_interpolated_smoothed, STA.shape[1], STA.shape[0], deg_per_pnt) - - return STA_smoothed - - -def interpolate_RF(rf_map, deg_per_pnt): - '''Upsample an image - - Parameters - ---------- - rf_map : np.ndarray - Input image - deg_per_pnt : numeric - scale factor - - Returns - ------- - interpolated : np.ndarray - Upsampled image - ''' - - x_pnts = np.shape(rf_map)[1] - y_pnts = np.shape(rf_map)[0] - - x_coor = np.arange(-(x_pnts - 1) * deg_per_pnt / 2, (x_pnts + 1) * deg_per_pnt / 2, deg_per_pnt) - y_coor = np.arange(-(y_pnts - 1) * deg_per_pnt / 2, (y_pnts + 1) * deg_per_pnt / 2, deg_per_pnt) - - x_interpolated = np.arange(-(x_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (x_pnts / 2 - 1) * deg_per_pnt + 1, 1) - y_interpolated = np.arange(-(y_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (y_pnts / 2 - 1) * deg_per_pnt + 1, 1) - - interpolated = si.interp2d(x_coor, y_coor, rf_map) - interpolated = interpolated(x_interpolated, y_interpolated) - - return interpolated - - -def deinterpolate_RF(rf_map, x_pnts, y_pnts, deg_per_pnt): - '''Downsample an image - - Parameters - ---------- - rf_map : np.ndarray - Input image - x_pnts : np.ndarray - Count of sample points along the first (column) axis - y_pnts : np.ndarray - Count of sample points along the zeroth (row) axis - deg_per_pnt : numeric - scale factor - - Returns - ------- - sampled_yx : np.ndarray - Downsampled image - ''' - - # x_pnts = 28 - # y_pnts = 16 - - x_interpolated = np.arange(-(x_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (x_pnts / 2 - 1) * deg_per_pnt + 1, 1) - y_interpolated = np.arange(-(y_pnts - 1) * deg_per_pnt / 2, deg_per_pnt / 2 + (y_pnts / 2 - 1) * deg_per_pnt + 1, 1) - - x_deinterpolate = np.arange(0, len(x_interpolated), deg_per_pnt) - y_deinterpolate = np.arange(0, len(y_interpolated), deg_per_pnt) - - sampled_y = rf_map[y_deinterpolate, :] - sampled_yx = sampled_y[:, x_deinterpolate] - - return sampled_yx - - -def chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel): - '''Determine if cells respond preferentially to on/off pixels in a mask using - a chi2 test. - - Parameters - ---------- - exclusion_mask : np.ndarray - Dimensions are (nYPixels, nXPixels, {on, off}). Integer indicator for INCLUSION (!) - of a pixel within the testing region. - events_per_pixel : np.ndarray - Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Integer values - are response counts by cell to on/off luminance at each pixel. - trials_per_pixel : np.ndarray - Dimensions are (nYPixels, nXPixels, {on, off}). Integer values are - counts of trials where a pixel is on/off. - - Returns - ------- - p_vals : np.ndarray - One-dimensional, of length nCells. Float values are p-values - for the hypothesis that a given cell has a receptive field within the - exclusion mask. - chi : np.ndarray - Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Values (float) - are squared residual event counts divided by expected event counts. - ''' - - num_y = np.shape(exclusion_mask)[0] - num_x = np.shape(exclusion_mask)[1] - - # d.f. is number of pixels in mask minus one - degrees_of_freedom = int(np.sum(exclusion_mask)) - 1 - - # observed_by_pixel has shape (num_cells,num_y,num_x,2) - expected_by_pixel = get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel) - observed_by_pixel = (events_per_pixel * exclusion_mask.reshape(1, num_y, num_x, 2)).astype(float) - - # calculate test statistic given observed and expected - residual_by_pixel = observed_by_pixel - expected_by_pixel - chi = (residual_by_pixel ** 2) / expected_by_pixel - chi_sum = np.nansum(chi, axis=(1, 2, 3)) - - # get p-value given test statistic and degrees of freedom - p_vals = 1.0 - stats.chi2.cdf(chi_sum, degrees_of_freedom) - - return p_vals, chi - - -def get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel): - '''Calculate expected number of events per pixel - - Parameters - ---------- - exclusion_mask : np.ndarray - Dimensions are (nYPixels, nXPixels, {on, off}). Integer indicator for INCLUSION (!) - of a pixel within the testing region. - events_per_pixel : np.ndarray - Dimensions are (nCells, nYPixels, nXPixels, {on, off}). Integer values - are response counts by cell to on/off luminance at each pixel. - trials_per_pixel : np.ndarray - Dimensions are (nYPixels, nXPixels, {on, off}). Integer values are - counts of trials where a pixel is on/off. - - Returns - ------- - np.ndarray : - Dimensions (nCells, nYPixels, nXPixels, {on, off}). Float values are - pixelwise counts of events expected if events are evenly distributed - in mask across trials. - ''' - - num_y = np.shape(exclusion_mask)[0] - num_x = np.shape(exclusion_mask)[1] - num_cells = np.shape(events_per_pixel)[0] - - exclusion_mask = exclusion_mask.reshape(1, num_y, num_x, 2) - trials_per_pixel = trials_per_pixel.reshape(1, num_y, num_x, 2) - - masked_trials = exclusion_mask * trials_per_pixel - masked_events = exclusion_mask * events_per_pixel - - total_trials = np.sum(masked_trials).astype(float) - total_events_by_cell = np.sum(masked_events, axis=(1, 2, 3)).astype(float) - - expected_by_cell_per_trial = total_events_by_cell / total_trials - return masked_trials * expected_by_cell_per_trial.reshape(num_cells, 1, 1, 1) - - -def build_trial_matrix(LSN_template, - num_trials, - on_off_luminance=(ON_LUMINANCE, OFF_LUMINANCE)): - '''Construct indicator arrays for on/off pixels across trials. - - Parameters - ---------- - LSN_template : np.ndarray - Dimensions are (nTrials, nYPixels, nXPixels). Luminance values per pixel - and trial. The size of the first dimension may be larger than the num_trials - argument (in which case only the first num_trials slices will be used) - but may not be smaller. - num_trials : int - The number of trials (left-justified) to build indicators for. - on_off_luminance : array-like, optional - The zeroth element is the luminance value of a pixel when on, the first when off. - Defaults are [255, 0]. - - Returns - ------- - trial_mat : np.ndarray - Dimensions are (nYPixels, nXPixels, {on, off}, nTrials). Boolean values - indicate that a pixel was on/off on a particular trial. - ''' - - _, num_y, num_x = np.shape(LSN_template) - trial_mat = np.zeros( (num_y, num_x, 2, num_trials), dtype=bool ) - - for y in range(num_y): - for x in range(num_x): - for oo, on_off in enumerate(on_off_luminance): - - frame = np.argwhere( LSN_template[:num_trials, y, x] == on_off )[:, 0] - trial_mat[y, x, oo, frame] = True - - return trial_mat - - -def get_disc_masks(LSN_template, radius=3, on_luminance=ON_LUMINANCE, off_luminance=OFF_LUMINANCE): - '''Obtain an indicator mask surrounding each pixel. The mask is a square, excluding pixels which - are coactive on any trial with the main pixel. - - Parameters - ---------- - LSN_template : np.ndarray - Dimensions are (nTrials, nYPixels, nXPixels). Luminance values per pixel - and trial. - radius : int - The base mask will be a box whose sides are 2 * radius + 1 in length. - on_luminance : int, optional - The value of the luminance for on trials. Default is 255 - off_luminance : int, optional - The value of the luminance for off trials. Default is 0 - - - Returns - ------- - masks : np.ndarray - Dimensions are (nYPixels, nXPixels, nYPixels, nXPixels). The first 2 - dimensions describe the pixel from which the mask was computed. The last - 2 serve as the dimensions of the mask images themselves. Masks are binary - arrays of type float, with 1 indicating inside, 0 outside. - ''' - - num_y = np.shape(LSN_template)[1] - num_x = np.shape(LSN_template)[2] - - # convert template to true on trials a pixel is not gray and false when gray - LSN_binary = np.where(LSN_template == off_luminance, 1, LSN_template) - LSN_binary = np.where(LSN_binary == on_luminance, 1, LSN_binary) - LSN_binary = np.where(LSN_binary == 1, 1.0, 0.0) - - # get number of trials each pixel is not gray - on_trials = LSN_binary.sum(axis=0).astype(float) # shape is (num_y,num_x) - - masks = np.zeros((num_y, num_x, num_y, num_x)) - for y in range(num_y): - for x in range(num_x): - trials_not_gray = np.argwhere( LSN_binary[:, y, x] > 0 )[:, 0] - raw_mask = np.divide( LSN_binary[trials_not_gray, :, :].sum(axis=0), on_trials ) - - center_y, center_x = np.unravel_index( raw_mask.argmax(), (num_y, num_x) ) - - # include center pixel in mask - raw_mask[center_y, center_x] = 0.0 - - x_max = center_x + radius + 1 - if x_max > num_x: - x_max = num_x - x_min = center_x - radius - if x_min < 0: - x_min = 0 - y_max = center_y + radius + 1 - if y_max > num_y: - y_max = num_y - y_min = center_y - radius - if y_min < 0: - y_min = 0 - - # don't include far away pixels that just happen - # to not have any trials in common with center pixel - clean_mask = np.ones(np.shape(raw_mask)) - clean_mask[y_min:y_max, x_min:x_max] = raw_mask[y_min:y_max, x_min:x_max] - - masks[y, x, :, :] = clean_mask - - masks = np.where(masks > 0, 0.0, 1.0) - - return masks - diff --git a/allensdk/brain_observatory/receptive_field_analysis/eventdetection.py b/allensdk/brain_observatory/receptive_field_analysis/eventdetection.py deleted file mode 100644 index 93b56d6f99..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/eventdetection.py +++ /dev/null @@ -1,157 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .utilities import smooth -import numpy as np -import scipy.stats as sps - -def detect_events(data, cell_index, stimulus, debug_plots=False): - - - - stimulus_table = data.get_stimulus_table(stimulus) - dff_trace = data.get_dff_traces()[1][cell_index, :] - - - - k_min = 0 - k_max = 10 - delta = 3 - - dff_trace = smooth(dff_trace, 5) - - - - var_dict = {} - debug_dict = {} - for ii, fi in enumerate(stimulus_table['start'].values): - - if ii > 0 and stimulus_table.iloc[ii].start == stimulus_table.iloc[ii-1].end: - offset = 1 - else: - offset = 0 - - if fi + k_min >= 0 and fi + k_max <= len(dff_trace): - trace = dff_trace[fi + k_min+1+offset:fi + k_max+1+offset] - - xx = (trace - trace[0])[delta] - (trace - trace[0])[0] - yy = max((trace - trace[0])[delta + 2] - (trace - trace[0])[0 + 2], - (trace - trace[0])[delta + 3] - (trace - trace[0])[0 + 3], - (trace - trace[0])[delta + 4] - (trace - trace[0])[0 + 4]) - - var_dict[ii] = (trace[0], trace[-1], xx, yy) - debug_dict[fi + k_min+1+offset] = (ii, trace) - - xx_list, yy_list = [], [] - for _, _, xx, yy in var_dict.values(): - xx_list.append(xx) - yy_list.append(yy) - - mu_x = np.median(xx_list) - mu_y = np.median(yy_list) - - xx_centered = np.array(xx_list)-mu_x - yy_centered = np.array(yy_list)-mu_y - - std_factor = 1 - std_x = 1./std_factor*np.percentile(np.abs(xx_centered), [100*(1-2*(1-sps.norm.cdf(std_factor)))]) - std_y = 1./std_factor*np.percentile(np.abs(yy_centered), [100*(1-2*(1-sps.norm.cdf(std_factor)))]) - - curr_inds = [] - allowed_sigma = 4 - for ii, (xi, yi) in enumerate(zip(xx_centered, yy_centered)): - if np.sqrt(((xi)/std_x)**2+((yi)/std_y)**2) < allowed_sigma: - curr_inds.append(True) - else: - curr_inds.append(False) - - curr_inds = np.array(curr_inds) - data_x = xx_centered[curr_inds] - data_y = yy_centered[curr_inds] - Cov = np.cov(data_x, data_y) - Cov_Factor = np.linalg.cholesky(Cov) - Cov_Factor_Inv = np.linalg.inv(Cov_Factor) - - #=================================================================================================================== - - noise_threshold = max(allowed_sigma * std_x + mu_x, allowed_sigma * std_y + mu_y) - mu_array = np.array([mu_x, mu_y]) - yes_set, no_set = set(), set() - for ii, (t0, tf, xx, yy) in var_dict.items(): - - - xi_z, yi_z = Cov_Factor_Inv.dot((np.array([xx,yy]) - mu_array)) - - # Conditions in order: - # 1) Outside noise blob - # 2) Minimum change in df/f - # 3) Change evoked by this trial, not previous - # 4) At end of trace, ended up outside of noise floor - - if np.sqrt(xi_z**2 + yi_z**2) > 4 and yy > .05 and xx < yy and tf > noise_threshold/2: - yes_set.add(ii) - else: - no_set.add(ii) - - - - assert len(var_dict) == len(stimulus_table) - b = np.zeros(len(stimulus_table), dtype=np.bool) - for yi in yes_set: - b[yi] = True - - if debug_plots == True: - import matplotlib.pyplot as plt - fig, ax = plt.subplots(1,2) - # ax[0].plot(dff_trace) - for key, val in debug_dict.items(): - ti, trace = val - if ti in no_set: - ax[0].plot(np.arange(key, key+len(trace)), trace, 'b') - elif ti in yes_set: - ax[0].plot(np.arange(key, key + len(trace)), trace, 'r', linewidth=2) - else: - raise Exception - - for ii in yes_set: - ax[1].plot([var_dict[ii][2]], [var_dict[ii][3]], 'r.') - - for ii in no_set: - ax[1].plot([var_dict[ii][2]], [var_dict[ii][3]], 'b.') - - print('number_of_events: %d' % b.sum()) - plt.show() - - return b diff --git a/allensdk/brain_observatory/receptive_field_analysis/fit_parameters.py b/allensdk/brain_observatory/receptive_field_analysis/fit_parameters.py deleted file mode 100644 index 4d3273d709..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/fit_parameters.py +++ /dev/null @@ -1,86 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .fitgaussian2D import fitgaussian2D, GaussianFitError, gaussian2D -import numpy as np -import pandas as pd -import collections -import sys -import warnings - -def add_to_fit_parameters_dict_single(fit_parameters_dict, p): - - fit_parameters_dict['height'].append(p[0]) - fit_parameters_dict['center_y'].append(p[1]) - fit_parameters_dict['center_x'].append(p[2]) - fit_parameters_dict['width_y'].append(p[3]) - fit_parameters_dict['width_x'].append(p[4]) - fit_parameters_dict['rotation'].append(p[5]) - if (p[3] is None) or (p[4] is None): - fit_parameters_dict['area'].append(None) - else: - fit_parameters_dict['area'].append(np.pi * (3./2) ** 2 * np.abs(p[3]) * np.abs(p[4])) - -def get_gaussian_fit_single_channel(rf, fit_parameters_dict): - - try: - p_fit = fitgaussian2D(rf) - add_to_fit_parameters_dict_single(fit_parameters_dict, p_fit) - data_fitted_on = gaussian2D(*p_fit)(*np.indices(rf.shape)) - fit_parameters_dict['data'].append(data_fitted_on) - except GaussianFitError: - warnings.warn('GaussianFitError (on subfield) caught') - add_to_fit_parameters_dict_single(fit_parameters_dict, [None]*6) - fit_parameters_dict['data'].append(np.zeros_like(rf)) - -def compute_distance(center_on, center_off): - - center_x_on, center_y_on = center_on - center_x_off, center_y_off = center_off - - if (center_x_on is None) or (center_y_on is None) or (center_x_off is None) or (center_y_off is None): - return None - else: - return np.sqrt((center_x_off-center_x_on)**2+(center_y_off-center_y_on)**2) - -def compute_overlap(data_fitted_on, data_fitted_off): - - on_bin = np.where(data_fitted_on > 0.001, 1, 0) - off_bin = np.where(data_fitted_off > 0.001, 1, 0) - - return float((np.multiply(on_bin, off_bin)).sum()) / (np.sqrt(on_bin.sum()) * np.sqrt(off_bin.sum())) - - - diff --git a/allensdk/brain_observatory/receptive_field_analysis/fitgaussian2D.py b/allensdk/brain_observatory/receptive_field_analysis/fitgaussian2D.py deleted file mode 100644 index c0de787fd1..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/fitgaussian2D.py +++ /dev/null @@ -1,175 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -from scipy import optimize - - -class GaussianFitError(RuntimeError): pass - - -def gaussian2D(height, center_x, center_y, width_x, width_y, rotation): - '''Build a function which evaluates a scaled 2d gaussian pdf - - Parameters - ---------- - height : float - scale factor - center_x : float - first coordinate of mean - center_y : float - second coordinate of mean - width_x : float - standard deviation along x axis - width_y : float - standard deviation along y axis - rotation : float - degrees clockwise by which to rotate the gaussian - - Returns - ------- - rotgauss: fn - parameters are x and y positions (row/column semantics are set by your - inputs to this function). Return value is the scaled gaussian pdf - evaluated at the argued point. - - ''' - - width_x = float(width_x) - width_y = float(width_y) - - rotation = np.deg2rad(rotation) - center_xp = center_x*np.cos(rotation) - center_y*np.sin(rotation) - center_yp = center_x*np.sin(rotation) + center_y*np.cos(rotation) - - def rotgauss(x,y): - xp = x*np.cos(rotation) - y*np.sin(rotation) - yp = x*np.sin(rotation) + y*np.cos(rotation) - g = height*np.exp(-((center_xp-xp)/width_x)**2/2.0 - ((center_yp-yp)/width_y)**2/2.) - return g - return rotgauss - - -def moments2(data): - '''Treating input image data as an independent multivariate gaussian, - estimate mean and standard deviations - - Parameters - ---------- - data : np.ndarray - 2d numpy array. - - Returns - ------- - height : float - The maximum observed value in the data - y : float - Mean row index - x : float - Mean column index - width_y : float - The standard deviation along the mean row - width_x : float - The standard deviation along the mean column - None : - This function returns an instance of None. - - Notes - ----- - uses original method from website for finding center - - ''' - - total = data.sum() - - Y,X = np.indices(data.shape) - x = ( X * data ).sum() / total - y = ( Y * data ).sum() / total - - col = data[:, int(np.around(x))] - width_x = np.sqrt( abs( ( np.arange(col.size) - y ) ** 2 * col ).sum() / col.sum() ) - - row = data[int(np.around(y)), :] - width_y = np.sqrt( abs( ( np.arange(row.size) - x ) ** 2 * row ).sum() / row.sum() ) - - height = data.max() - - return height, y, x, width_y, width_x, None - - -def fitgaussian2D(data): - '''Fit a 2D gaussian to an image - - Parameters - ---------- - data : np.ndarray - input image - - Returns - ------- - p2 : list - height - row mean - column mean - row standard deviation - column standard deviation - rotation - - Notes - ----- - see gaussian2D for details about output values - - ''' - - params = moments2(data) - def errorfunction(p): - p2 = np.array([p[0], params[1], params[2], np.abs(p[1]), np.abs(p[2]), p[3]]) - - - val = np.ravel(gaussian2D(*p2)(*np.indices(data.shape)) - data) - - return (val**2).sum() - - res = optimize.minimize(errorfunction, [ params[0], params[3], params[4], 0.0 ], method='Nelder-Mead', options={'maxfev':2500}) - p = res.x - p2 = np.array([p[0], params[1], params[2], np.abs(p[1]), np.abs(p[2]), p[3]]) - success = res.success - if not success and res.status != 2: # Status 2 is loss of precision; might need to handle this separately instead of passing... - print(success) - print(res.message) - print(res.status) - raise GaussianFitError('Gaussian optimization failed to converge:\n%s' % res.message) - - return p2 diff --git a/allensdk/brain_observatory/receptive_field_analysis/postprocessing.py b/allensdk/brain_observatory/receptive_field_analysis/postprocessing.py deleted file mode 100644 index ebb294b4fa..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/postprocessing.py +++ /dev/null @@ -1,137 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .fit_parameters import get_gaussian_fit_single_channel, compute_distance, compute_overlap -from .chisquarerf import chi_square_binary, get_peak_significance, pvalue_to_NLL -from .utilities import upsample_image_to_degrees -import collections -import numpy as np -import sys - -def get_gaussian_fit(rf): - - fit_parameters_dict_combined = {'on':collections.defaultdict(list), 'off':collections.defaultdict(list)} - counter = {'on':0, 'off':0} - for on_off_key in ['on', 'off']: - fit_parameters_dict = fit_parameters_dict_combined[on_off_key] - for ci in range(rf[on_off_key]['fdr_mask']['attrs']['number_of_components']): - curr_component_mask = upsample_image_to_degrees(np.logical_not(rf[on_off_key]['fdr_mask']['data'][ci,:,:])) > .5 - rf_response = upsample_image_to_degrees(rf[on_off_key]['rts_convolution']['data'].copy()) - rf_response[curr_component_mask] = 0 - - if rf_response.sum() > 0: - get_gaussian_fit_single_channel(rf_response, fit_parameters_dict) - counter[on_off_key] += 1 - - for ii_off in range(counter['on']): - fit_parameters_dict_combined['on']['distance'].append([None]*counter['off']) - fit_parameters_dict_combined['on']['overlap'].append([None] * counter['off']) - - for ii_off in range(counter['off']): - fit_parameters_dict_combined['off']['distance'].append([None] * counter['on']) - fit_parameters_dict_combined['off']['overlap'].append([None]*counter['on']) - - - for ii_on in range(counter['on']): - for ii_off in range(counter['off']): - center_on = fit_parameters_dict_combined['on']['center_x'][ii_on], fit_parameters_dict_combined['on']['center_y'][ii_on] - center_off = fit_parameters_dict_combined['off']['center_x'][ii_off], fit_parameters_dict_combined['off']['center_y'][ii_off] - curr_distance = compute_distance(center_on, center_off) - fit_parameters_dict_combined['on']['distance'][ii_on][ii_off] = curr_distance - fit_parameters_dict_combined['off']['distance'][ii_off][ii_on] = curr_distance - - data_on = fit_parameters_dict_combined['on']['data'][ii_on] - data_off = fit_parameters_dict_combined['off']['data'][ii_off] - curr_overlap = compute_overlap(data_on, data_off) - fit_parameters_dict_combined['on']['overlap'][ii_on][ii_off] = curr_overlap - fit_parameters_dict_combined['off']['overlap'][ii_off][ii_on] = curr_overlap - - return fit_parameters_dict_combined, counter - -def run_postprocessing(data, rf): - - stimulus = rf['attrs']['stimulus'] - - # Gaussian fit postprocessing: - fit_parameters_dict_combined, counter = get_gaussian_fit(rf) - - for on_off_key in ['on', 'off']: - - if counter[on_off_key] > 0: - - rf[on_off_key]['gaussian_fit'] = {} - rf[on_off_key]['gaussian_fit']['attrs'] = {} - - fit_parameters_dict = fit_parameters_dict_combined[on_off_key] - for key, val in fit_parameters_dict.items(): - - if key == 'data': - rf[on_off_key]['gaussian_fit']['data'] = np.array(val) - else: - rf[on_off_key]['gaussian_fit']['attrs'][key] = np.array(val) - - # Chi squared test statistic postprocessing: - cell_index = rf['attrs']['cell_index'] - locally_sparse_noise_template = data.get_stimulus_template(stimulus) - - event_array = np.zeros((rf['event_vector']['data'].shape[0], 1), dtype=np.bool) - event_array[:,0] = rf['event_vector']['data'] - - chi_squared_grid = chi_square_binary(event_array, locally_sparse_noise_template) - alpha = rf['on']['fdr_mask']['attrs']['alpha'] - assert rf['off']['fdr_mask']['attrs']['alpha'] == alpha - chi_square_grid_NLL = pvalue_to_NLL(chi_squared_grid) - - peak_significance = get_peak_significance(chi_square_grid_NLL, locally_sparse_noise_template, alpha=alpha) - significant = peak_significance[0][0] - min_p = peak_significance[1][0] - pvalues_chi_square = peak_significance[2][0] - best_exclusion_region_mask = peak_significance[3][0] - - chi_squared_grid_dict = { - 'best_exclusion_region_mask':{'data':best_exclusion_region_mask}, - 'attrs':{'significant':significant, 'alpha': alpha, 'min_p':min_p}, - 'pvalues':{'data':pvalues_chi_square} - } - - rf['chi_squared_analysis'] = chi_squared_grid_dict - - return rf - -if __name__ == "__main__": - # csid = 517472416 # triple! - csid = 517526760 # two ON - # csid = 539917553 - # csid = 540988186 diff --git a/allensdk/brain_observatory/receptive_field_analysis/receptive_field.py b/allensdk/brain_observatory/receptive_field_analysis/receptive_field.py deleted file mode 100644 index 6e0be15186..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/receptive_field.py +++ /dev/null @@ -1,204 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from .eventdetection import detect_events -from statsmodels.sandbox.stats.multicomp import multipletests -import numpy as np -from .utilities import get_A, get_A_blur, get_shuffle_matrix, get_components, dict_generator -from .postprocessing import run_postprocessing -import h5py - -def events_to_pvalues_no_fdr_correction(data, event_vector, A, number_of_shuffles=5000, response_detection_error_std_dev=.1, seed=1): - - number_of_pixels = A.shape[0] // 2 - - # Initializations: - number_of_events = event_vector.sum() - np.random.seed(seed) - - shuffle_data = get_shuffle_matrix(data, event_vector, A, number_of_shuffles=number_of_shuffles, response_detection_error_std_dev=response_detection_error_std_dev) - - # Build list of p-values: - response_triggered_stimulus_vector = A.dot(event_vector)/number_of_events - p_value_list = [] - for pi in range(2*number_of_pixels): - curr_p_value = 1-(shuffle_data[pi, :] < response_triggered_stimulus_vector[pi]).sum()*1./number_of_shuffles - p_value_list.append(curr_p_value) - - return np.array(p_value_list) - -def compute_receptive_field(data, cell_index, stimulus, **kwargs): - - alpha = kwargs.pop('alpha') - - event_vector = detect_events(data, cell_index, stimulus) - - A_blur = get_A_blur(data, stimulus) - number_of_pixels = A_blur.shape[0] // 2 - - pvalues = events_to_pvalues_no_fdr_correction(data, event_vector, A_blur, **kwargs) - - - stimulus_table = data.get_stimulus_table(stimulus) - stimulus_template = data.get_stimulus_template(stimulus)[stimulus_table['frame'].values, :, :] - s1, s2 = stimulus_template.shape[1], stimulus_template.shape[2] - pvalues_on, pvalues_off = pvalues[:number_of_pixels].reshape(s1, s2), pvalues[number_of_pixels:].reshape(s1, s2) - - - - fdr_corrected_pvalues = multipletests(pvalues, alpha=alpha)[1] - - fdr_corrected_pvalues_on = fdr_corrected_pvalues[:number_of_pixels].reshape(s1, s2) - _fdr_mask_on = np.zeros_like(pvalues_on, dtype=np.bool) - _fdr_mask_on[fdr_corrected_pvalues_on < alpha] = True - components_on, number_of_components_on = get_components(_fdr_mask_on) - - fdr_corrected_pvalues_off = fdr_corrected_pvalues[number_of_pixels:].reshape(s1, s2) - _fdr_mask_off = np.zeros_like(pvalues_off, dtype=np.bool) - _fdr_mask_off[fdr_corrected_pvalues_off < alpha] = True - components_off, number_of_components_off = get_components(_fdr_mask_off) - - A = get_A(data, stimulus) - A_blur = get_A_blur(data, stimulus) - - response_triggered_stimulus_field = A.dot(event_vector) - response_triggered_stimulus_field_on = response_triggered_stimulus_field[:number_of_pixels].reshape(s1, s2) - response_triggered_stimulus_field_off = response_triggered_stimulus_field[number_of_pixels:].reshape(s1, s2) - - response_triggered_stimulus_field_convolution = A_blur.dot(event_vector) - response_triggered_stimulus_field_convolution_on = response_triggered_stimulus_field_convolution[:number_of_pixels].reshape(s1, s2) - response_triggered_stimulus_field_convolution_off = response_triggered_stimulus_field_convolution[number_of_pixels:].reshape(s1, s2) - - on_dict = {'pvalues':{'data':pvalues_on}, - 'fdr_corrected':{'data':fdr_corrected_pvalues_on, 'attrs':{'alpha':alpha, 'min_p':fdr_corrected_pvalues_on.min()}}, - 'fdr_mask': {'data':components_on, 'attrs':{'alpha':alpha, 'number_of_components':number_of_components_on, 'number_of_pixels':components_on.sum(axis=1).sum(axis=1)}}, - 'rts_convolution':{'data':response_triggered_stimulus_field_convolution_on}, - 'rts': {'data': response_triggered_stimulus_field_on} - } - off_dict = {'pvalues':{'data':pvalues_off}, - 'fdr_corrected':{'data':fdr_corrected_pvalues_off, 'attrs':{'alpha':alpha, 'min_p':fdr_corrected_pvalues_off.min()}}, - 'fdr_mask': {'data':components_off, 'attrs':{'alpha':alpha, 'number_of_components':number_of_components_off, 'number_of_pixels':components_off.sum(axis=1).sum(axis=1)}}, - 'rts_convolution': {'data': response_triggered_stimulus_field_convolution_off}, - 'rts': {'data': response_triggered_stimulus_field_off} - } - - result_dict = {'event_vector': {'data':event_vector, 'attrs':{'number_of_events':event_vector.sum()}}, - 'on':on_dict, - 'off':off_dict, - 'attrs':{'cell_index':cell_index, 'stimulus':stimulus}} - - return result_dict - -def compute_receptive_field_with_postprocessing(data, cell_index, stimulus, **kwargs): - rf = compute_receptive_field(data, cell_index, stimulus, **kwargs) - rf = run_postprocessing(data, rf) - - return rf - -def get_attribute_dict(rf): - - attribute_dict = {} - for x in dict_generator(rf): - if x[-3] == 'attrs': - if len(x[:-3]) == 0: - key = x[-2] - else: - key = '/'.join(['/'.join(x[:-3]), x[-2]]) - attribute_dict[key] = x[-1] - - return attribute_dict - - -def print_summary(rf): - for key_val in sorted(get_attribute_dict(rf).iteritems(), key=lambda x:x[0]): - print("%s : %s" % key_val) - -def write_receptive_field_to_h5(rf, file_name, prefix=''): - - attr_list = [] - f = h5py.File(file_name, 'a') - for x in dict_generator(rf): - - if x[-2] == 'data': - f['/'.join([prefix]+x[:-1])] = x[-1] - elif x[-3] == 'attrs': - attr_list.append(x) - else: - raise Exception - - for x in attr_list: - if len(x) > 3: - f['/'.join([prefix]+x[:-3])].attrs[x[-2]] = x[-1] - else: - assert len(x) == 3 - if prefix == '': - - if x[-1] is None: - f.attrs[x[-2]] = np.NaN - else: - f.attrs[x[-2]] = x[-1] - else: - if x[-1] is None: - f[prefix].attrs[x[-2]] = np.NaN - else: - f[prefix].attrs[x[-2]] = x[-1] - - f.close() - -def read_h5_group(g): - return_dict = {} - if len(g.attrs) > 0: - return_dict['attrs'] = dict(g.attrs) - for key in g: - if key == 'data': - return_dict[key] = g[key].value - else: - return_dict[key] = read_h5_group(g[key]) - - return return_dict - -def read_receptive_field_from_h5(file_name, path=None): - - f = h5py.File(file_name, 'r') - if path is None: - rf = read_h5_group(f) - else: - rf = read_h5_group(f[path]) - f.close() - - return rf - - - diff --git a/allensdk/brain_observatory/receptive_field_analysis/tools.py b/allensdk/brain_observatory/receptive_field_analysis/tools.py deleted file mode 100644 index df15993b6d..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/tools.py +++ /dev/null @@ -1,67 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -def list_of_dicts_to_dict_of_lists(list_of_dicts): - return {key:[item[key] for item in list_of_dicts] for key in list_of_dicts[0].keys() } - -def dict_generator(indict, pre=None): - - pre = pre[:] if pre else [] - if isinstance(indict, dict): - for key, value in indict.items(): - if isinstance(value, dict): - for d in dict_generator(value, pre + [key] ): - yield d - elif isinstance(value, list): - for v in value: - for d in dict_generator(v, pre + [key]): - yield d - else: - yield pre + [key, value] - else: - yield indict - -def read_h5_group(g): - return_dict = {} - if len(g.attrs) > 0: - return_dict['attrs'] = dict(g.attrs) - for key in g: - if key == 'data': - return_dict[key] = g[key].value - else: - return_dict[key] = read_h5_group(g[key]) - - return return_dict - diff --git a/allensdk/brain_observatory/receptive_field_analysis/utilities.py b/allensdk/brain_observatory/receptive_field_analysis/utilities.py deleted file mode 100644 index bbef432f3c..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/utilities.py +++ /dev/null @@ -1,293 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from scipy.ndimage.filters import gaussian_filter -import numpy as np -import scipy.interpolate as spinterp -from .tools import dict_generator -from allensdk.api.warehouse_cache.cache import memoize -import os -import warnings -from skimage.measure import block_reduce - -def upsample_image_to_degrees(img): - - upsample = 74.4/img.shape[0] - x = np.arange(img.shape[0]) - y = np.arange(img.shape[1]) - - g = spinterp.interp2d(y, x, img, kind='linear') - ZZ_on = g(np.arange(0, img.shape[1], 1. / upsample), np.arange(0, img.shape[0], 1. / upsample)) - - return ZZ_on - -def convolve(img, sigma=4): - ''' - 2D Gaussian convolution - ''' - - if img.sum() == 0: - return img - - img_pad = np.zeros((3 * img.shape[0], 3 * img.shape[1])) - img_pad[img.shape[0]:2 * img.shape[0], img.shape[1]:2 * img.shape[1]] = img - - x = np.arange(3 * img.shape[0]) - y = np.arange(3 * img.shape[1]) - g = spinterp.interp2d(y, x, img_pad, kind='linear') - - if img.shape[0] == 16: - upsample = 4 - offset = -(1 - .625) - elif img.shape[0] == 8: - upsample = 8 - offset = -(1 - .5625) - else: - raise NotImplementedError - ZZ_on = g(offset + np.arange(0, img.shape[1] * 3, 1. / upsample), offset + np.arange(0, img.shape[0] * 3, 1. / upsample)) - ZZ_on_f = gaussian_filter(ZZ_on, float(sigma), mode='constant') - - z_on_new = block_reduce(ZZ_on_f, (upsample, upsample)) - z_on_new = z_on_new / z_on_new.sum() * img.sum() - z_on_new = z_on_new[img.shape[0]:2 * img.shape[0], img.shape[1]:2 * img.shape[1]] - - return z_on_new - - - -@memoize -def get_A(data, stimulus): - - stimulus_table = data.get_stimulus_table(stimulus) - stimulus_template = data.get_stimulus_template(stimulus)[stimulus_table['frame'].values, :,:] - - number_of_pixels = stimulus_template.shape[1]*stimulus_template.shape[2] - - A = np.zeros((2*number_of_pixels, stimulus_template.shape[0])) - for fi in range(stimulus_template.shape[0]): - A[:number_of_pixels, fi] = (stimulus_template[fi,:,:].flatten() > 127).astype(float) - A[number_of_pixels:, fi] = (stimulus_template[fi, :, :].flatten() < 127).astype(float) - - return A - -@memoize -def get_A_blur(data, stimulus): - - stimulus_table = data.get_stimulus_table(stimulus) - stimulus_template = data.get_stimulus_template(stimulus)[stimulus_table['frame'].values, :, :] - - A = get_A(data, stimulus).copy() - - - number_of_pixels = A.shape[0] // 2 - for fi in range(A.shape[1]): - A[:number_of_pixels,fi] = convolve(A[:number_of_pixels, fi].reshape(stimulus_template.shape[1], stimulus_template.shape[2])).flatten() - A[number_of_pixels:,fi] = convolve(A[number_of_pixels:, fi].reshape(stimulus_template.shape[1], stimulus_template.shape[2])).flatten() - - - return A - -def get_shuffle_matrix(data, event_vector, A, number_of_shuffles=5000, response_detection_error_std_dev=.1): - - number_of_events = event_vector.sum() - number_of_pixels = A.shape[0] // 2 - shuffle_data = np.zeros((2*number_of_pixels, number_of_shuffles)) - evr = range(len(event_vector)) - for ii in range(number_of_shuffles): - - size = number_of_events + int(np.round(response_detection_error_std_dev*number_of_events*np.random.randn())) - shuffled_event_inds = np.random.choice(evr, size=size, replace=False) - - b_tmp = np.zeros(len(event_vector), dtype=np.bool) - b_tmp[shuffled_event_inds] = True - shuffle_data[:, ii] = A[:,b_tmp].sum(axis=1)/float(size) - - return shuffle_data - -def get_sparse_noise_epoch_mask_list(st, number_of_acquisition_frames, threshold=7): - - delta = (st.start.values[1:] - st.end.values[:-1]) - cut_inds = np.where(delta > threshold)[0] + 1 - - epoch_mask_list = [] - - if len(cut_inds) > 2: - warnings.warn('more than 2 epochs cut') - print(' %d %d' % (len(delta), cut_inds)) - - for ii in range(len(cut_inds)+1): - - if ii == 0: - first_ind = st.iloc[0].start - else: - first_ind = st.iloc[cut_inds[ii-1]].start - - if ii == len(cut_inds): - last_ind_inclusive = st.iloc[-1].end - else: - last_ind_inclusive = st.iloc[cut_inds[ii]-1].end - - epoch_mask_list.append((first_ind,last_ind_inclusive)) - - return epoch_mask_list - -def smooth(x,window_len=11,window='hanning', mode='valid'): - """smooth the data using a window with requested size. - - This method is based on the convolution of a scaled window with the signal. - The signal is prepared by introducing reflected copies of the signal - (with the window size) in both ends so that transient parts are minimized - in the begining and end part of the output signal. - - input: - x: the input signal - window_len: the dimension of the smoothing window; should be an odd integer - window: the type of window from 'flat', 'hanning', 'hamming', 'bartlett', 'blackman' - flat window will produce a moving average smoothing. - - output: - the smoothed signal - - example: - - t=linspace(-2,2,0.1) - x=sin(t)+randn(len(t))*0.1 - y=smooth(x) - - see also: - - numpy.hanning, numpy.hamming, numpy.bartlett, numpy.blackman, numpy.convolve - scipy.signal.lfilter - - TODO: the window parameter could be the window itself if an array instead of a string - NOTE: length(output) != length(input), to correct this: return y[(window_len/2-1):-(window_len/2)] instead of just y. - """ - - if x.ndim != 1: - raise ValueError("smooth only accepts 1 dimension arrays.") - - if x.size < window_len: - raise ValueError("Input vector needs to be bigger than window size.") - - - if window_len<3: - return x - - - if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']: - raise ValueError("Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'") - - - s=np.r_[x[window_len-1:0:-1],x,x[-1:-window_len:-1]] - #print(len(s)) - if window == 'flat': #moving average - w=np.ones(window_len,'d') - else: - w=eval('np.'+window+'(window_len)') - - y=np.convolve(w/w.sum(),s,mode=mode) - return y - - -def get_components(receptive_field_data): - - s1, s2 = receptive_field_data.shape - - candidate_pixel_list = np.where(receptive_field_data.flatten()==True)[0] - pixel_coord_dict = dict((px, (int(px/s2), (px - s2 * int(px/s2)), px% (s1 * s2) == px)) for px in candidate_pixel_list) - - component_list = [] - - for curr_pixel in candidate_pixel_list: - - curr_x, curr_y, curr_frame = pixel_coord_dict[curr_pixel] - - component_list.append([curr_pixel]) - dist_to_component_dict = {} - for ii, curr_component in enumerate(component_list): - dist_to_component_dict[ii] = np.inf - for other_pixel in curr_component: - - other_x, other_y, other_frame = pixel_coord_dict[other_pixel] - - if other_frame == curr_frame: - x_dist = np.abs(curr_x - other_x) - y_dist = np.abs(curr_y - other_y) - curr_dist = max(x_dist, y_dist) - if curr_dist < dist_to_component_dict[ii]: - dist_to_component_dict[ii] = curr_dist - - # Merge all components with a distance leq 1 to current pixel - new_component_list = [] - tmp = [] - for ii, curr_component in enumerate(component_list): - if dist_to_component_dict[ii] <= 1: - tmp += curr_component - else: - new_component_list.append(curr_component) - - new_component_list.append(tmp) - component_list = new_component_list - - - if len(component_list) == 0: - return np.zeros((1, receptive_field_data.shape[0], receptive_field_data.shape[1])), len(component_list) - elif len(component_list) == 1: - return_array = np.zeros((1,receptive_field_data.shape[0], receptive_field_data.shape[1])) - else: - return_array = np.zeros((len(component_list), receptive_field_data.shape[0], receptive_field_data.shape[1])) - - for ii, component in enumerate(component_list): - curr_component_mask = np.zeros_like(receptive_field_data, dtype=np.bool).flatten() - curr_component_mask[component] = True - return_array[ii,:,:] = curr_component_mask.reshape(receptive_field_data.shape) - - - - return return_array, len(component_list) - -def get_attribute_dict(rf): - - attribute_dict = {} - for x in dict_generator(rf): - if x[-3] == 'attrs': - if len(x[:-3]) == 0: - key = x[-2] - else: - key = '/'.join(['/'.join(x[:-3]), x[-2]]) - attribute_dict[key] = x[-1] - - return attribute_dict - diff --git a/allensdk/brain_observatory/receptive_field_analysis/visualization.py b/allensdk/brain_observatory/receptive_field_analysis/visualization.py deleted file mode 100644 index a3c6cad2a2..0000000000 --- a/allensdk/brain_observatory/receptive_field_analysis/visualization.py +++ /dev/null @@ -1,266 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import matplotlib.pyplot as plt -from matplotlib import ticker -import numpy as np -import matplotlib.gridspec as gridspec -import matplotlib.pyplot as plt -import matplotlib.patches as mpatches - -DEFAULT_CMAP = 'magma' - -def plot_ellipses(gaussian_fit_dict, ax=None, show=True, close=True, save_file_name=None, color='b'): - '''Example Usage: - oeid, cell_index, stimulus = 512176430, 12, 'locally_sparse_noise' - brain_observatory_cache = BrainObservatoryCache() - data_set = brain_observatory_cache.get_ophys_experiment_data(oeid) - lsn = LocallySparseNoise(data_set, stimulus) - result = compute_receptive_field_with_postprocessing(data_set, cell_index, stimulus, alpha=.05, number_of_shuffles=5000) - plot_ellipses(result['off']['gaussian_fit'], color='r') - ''' - - if ax is None: - fig, ax = plt.subplots(1) - ax.set_xlim(0, 130) - ax.set_ylim(0, 74) - plt.axis('off') - - on_comp = len(gaussian_fit_dict['attrs']['center_x']) - for i in range(on_comp): - xy = (gaussian_fit_dict['attrs']['center_x'][i], gaussian_fit_dict['attrs']['center_y'][i]) - width = 3 * np.abs(gaussian_fit_dict['attrs']['width_x'][i]) - height = 3 * np.abs(gaussian_fit_dict['attrs']['width_y'][i]) - angle = gaussian_fit_dict['attrs']['rotation'][i] - if np.logical_not(any(np.isnan(xy))): - ellipse = mpatches.Ellipse(xy, width=width, height=height, angle=angle, lw=2, edgecolor=color, - facecolor='none') - ax.add_artist(ellipse) - - if not save_file_name is None: - fig.savefig(save_file_name) - - if show == True: - plt.show() - - if close: - plt.close(fig) - - return ax - -def pvalue_to_NLL(p_values, - max_NLL=10.0): - return np.where(p_values == 0.0, max_NLL, -np.log10(p_values)) - -def plot_chi_square_summary(rf_data, ax=None, cax=None, cmap=DEFAULT_CMAP): - if ax is None: - ax = plt.gca() - - chi_squared_grid = rf_data['chi_squared_analysis']['pvalues']['data'] - chi_square_grid_NLL = pvalue_to_NLL(chi_squared_grid) - clim = (0, max(2,chi_square_grid_NLL.max())) - img = ax.imshow(chi_square_grid_NLL, interpolation='none', origin='lower', clim=clim, cmap=cmap) - - if cax is None: - cb = ax.figure.colorbar(img, ax=ax, ticks=clim) - else: - cb = ax.figure.colorbar(img, cax=cax, ticks=clim) - - tick_locator = ticker.MaxNLocator(nbins=5) - cb.locator = tick_locator - cb.update_ticks() - ax.axes.get_xaxis().set_visible(False) - ax.axes.get_yaxis().set_visible(False) - ax.set_title('Significant: %s (min_p=%s)' % (rf_data['chi_squared_analysis']['attrs']['significant'], - rf_data['chi_squared_analysis']['attrs']['min_p']) ) - -def plot_msr_summary(lsn, cell_index, ax_on, ax_off, ax_cbar=None, cmap=None): - min_clim = lsn.mean_response[:, :, cell_index,:].min() - max_clim = lsn.mean_response[:, :, cell_index,:].max() - plot_fields(lsn.mean_response[:, :, cell_index, 0], - lsn.mean_response[:, :, cell_index, 1], - ax_on, ax_off, clim=(min_clim, max_clim), cmap=cmap, cbar_axes=ax_cbar) - -def plot_fields(on_data, off_data, on_axes, off_axes, cbar_axes=None, clim=None, cmap=DEFAULT_CMAP): - if cbar_axes is None: - on_axes.figure.subplots_adjust(right=0.9) - cbar_axes = on_axes.figure.add_axes([0.93, 0.37, 0.02, .28]) - - if clim is None: - clim_max = max(np.nanmax(on_data), np.nanmax(off_data)) - clim = (0,clim_max) - on_axes.imshow(on_data, clim=clim, cmap=cmap, interpolation='none', origin='lower') - on_axes.set_title("on") - img = off_axes.imshow(off_data, clim=clim, cmap=cmap, interpolation='none', origin='lower') - off_axes.set_title("off") - cb = cbar_axes.figure.colorbar(img, cax=cbar_axes, ticks=clim) - tick_locator = ticker.MaxNLocator(nbins=5) - cb.locator = tick_locator - cb.update_ticks() - for frame in [on_axes, off_axes]: - frame.axes.get_xaxis().set_visible(False) - frame.axes.get_yaxis().set_visible(False) - -def plot_rts_summary(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): - rts_on = rf_data['on']['rts']['data'] - rts_off = rf_data['off']['rts']['data'] - plot_fields(rts_on, rts_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) - -def plot_rts_blur_summary(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): - rts_on_blur = rf_data['on']['rts_convolution']['data'] - rts_off_blur = rf_data['off']['rts_convolution']['data'] - plot_fields(rts_on_blur, rts_off_blur, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) - -def plot_p_values(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): - pvalues_on = rf_data['on']['pvalues']['data'] - pvalues_off = rf_data['off']['pvalues']['data'] - clim_max = max(pvalues_on.max(), pvalues_off.max()) - plot_fields(pvalues_on, pvalues_off, ax_on, ax_off, cbar_axes=ax_cbar, clim=(0, clim_max/2), cmap=cmap) - -def plot_mask(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): - pvalues_on = rf_data['on']['pvalues']['data'] - pvalues_off = rf_data['off']['pvalues']['data'] - - rf_on = pvalues_on.copy() - rf_off = pvalues_off.copy() - - rf_on[np.logical_not(rf_data['on']['fdr_mask']['data'].sum(axis=0))] = np.nan - rf_off[np.logical_not(rf_data['off']['fdr_mask']['data'].sum(axis=0))] = np.nan - - plot_fields(rf_on, rf_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) - -def plot_gaussian_fit(rf_data, ax_on, ax_off, ax_cbar=None, cmap=DEFAULT_CMAP): - - gf_on_exists = 'gaussian_fit' in rf_data['on'] - gf_off_exists = 'gaussian_fit' in rf_data['off'] - - if not gf_on_exists and not gf_off_exists: - return - - img_data_on = rf_data['on']['gaussian_fit']['data'].sum(axis=0) if gf_on_exists else None - img_data_off = rf_data['off']['gaussian_fit']['data'].sum(axis=0) if gf_off_exists else None - - if gf_on_exists and gf_off_exists: - plot_fields(img_data_on, img_data_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) - else: - if gf_on_exists: - img_data_off = np.zeros(img_data_on.shape) - else: - img_data_on = np.zeros(img_data_off.shape) - - plot_fields(img_data_on, img_data_off, ax_on, ax_off, cbar_axes=ax_cbar, cmap=cmap) - -def plot_receptive_field_data(rf, lsn, show=True, save_file_name=None, close=True, cmap=DEFAULT_CMAP): - cell_index = rf['attrs']['cell_index'] - - # Prepare plotting figure:n - number_of_major_rows = 7 if lsn else 6 - pwidth = 1.7 - pheight = 1.0 - fig = plt.figure(figsize=(pwidth*2.3, pheight*number_of_major_rows)) - gsp = gridspec.GridSpec(number_of_major_rows, 3, width_ratios=[1,1,.1], right=0.9) - ax_list = [] - - # Plot chi-square summary: - row = 0 - curr_axes = fig.add_subplot(gsp[row,:2]) - cbar_axes = fig.add_subplot(gsp[row,-1]) - ax_list += [curr_axes] - plot_chi_square_summary(rf, ax=curr_axes, cax=cbar_axes, cmap=cmap) - - # MSR plot: - if not lsn is None: - row += 1 - curr_on_axes = fig.add_subplot(gsp[row, 0]) - curr_off_axes = fig.add_subplot(gsp[row, 1]) - cbar_axes = fig.add_subplot(gsp[row, 2]) - ax_list += [curr_on_axes, curr_off_axes] - plot_msr_summary(lsn, cell_index, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) - - # RTS no blur: - row += 1 - curr_on_axes = fig.add_subplot(gsp[row, 0]) - curr_off_axes = fig.add_subplot(gsp[row, 1]) - cbar_axes = fig.add_subplot(gsp[row,2]) - ax_list += [curr_on_axes, curr_off_axes] - plot_rts_summary(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) - - # RTS no blur: - row += 1 - curr_on_axes = fig.add_subplot(gsp[row, 0]) - curr_off_axes = fig.add_subplot(gsp[row, 1]) - cbar_axes = fig.add_subplot(gsp[row,2]) - ax_list += [curr_on_axes, curr_off_axes] - plot_rts_blur_summary(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) - - # PValues: - row += 1 - curr_on_axes = fig.add_subplot(gsp[row, 0]) - curr_off_axes = fig.add_subplot(gsp[row, 1]) - cbar_axes = fig.add_subplot(gsp[row,2]) - ax_list += [curr_on_axes, curr_off_axes] - plot_p_values(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) - - # Mask: - row += 1 - curr_on_axes = fig.add_subplot(gsp[row, 0]) - curr_off_axes = fig.add_subplot(gsp[row, 1]) - cbar_axes = fig.add_subplot(gsp[row,2]) - ax_list += [curr_on_axes, curr_off_axes] - plot_mask(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) - - # Gaussian fit: - row += 1 - curr_on_axes = fig.add_subplot(gsp[row, 0]) - curr_off_axes = fig.add_subplot(gsp[row, 1]) - cbar_axes = fig.add_subplot(gsp[row,2]) - ax_list += [curr_on_axes, curr_off_axes] - plot_gaussian_fit(rf, curr_on_axes, curr_off_axes, cbar_axes, cmap=cmap) - - # gs.tight_layout(fig) - - plt.subplots_adjust(top=0.95) - - for ax in ax_list: - ax.set_adjustable('box-forced') - - if not save_file_name is None: - fig.savefig(save_file_name) - - if show == True: - plt.show() - - if close: - plt.close(fig) diff --git a/allensdk/brain_observatory/roi_masks.py b/allensdk/brain_observatory/roi_masks.py deleted file mode 100644 index 39d8873ec5..0000000000 --- a/allensdk/brain_observatory/roi_masks.py +++ /dev/null @@ -1,523 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -import math -import scipy.ndimage.morphology as morphology -import logging -import h5py - -# constants used for accessing border array -RIGHT_SHIFT = 0 -LEFT_SHIFT = 1 -DOWN_SHIFT = 2 -UP_SHIFT = 3 - - -class Mask(object): - ''' - Abstract class to represent image segmentation mask. Its two - main subclasses are RoiMask and NeuropilMask. The former represents - the mask of a region of interest (ROI), such as a cell observed in - 2-photon imaging. The latter represents the neuropil around that cell, - and is useful when subtracting the neuropil signal from the measured - ROI signal. - - This class should not be instantiated directly. - - Parameters - ---------- - image_w: integer - Width of image that ROI resides in - - image_h: integer - Height of image that ROI resides in - - label: text - User-defined text label to identify mask - - mask_group: integer - User-defined number to help put masks into different categories - ''' - - @property - def overlaps_motion_border(self): - # flags like this are now in self.flags, patch for backwards compatibility - return 'overlaps_motion_border' in self.flags - - def __init__(self, image_w, image_h, label, mask_group): - ''' - Mask class constructor. The Mask class is designed to be abstract - and it should not be instantiated directly. - ''' - - self.img_rows = image_h - self.img_cols = image_w - # initialize to invalid state. Mask must be manually initialized - # by pixel list or mask array - self.x = 0 - self.width = 0 - self.y = 0 - self.height = 0 - self.mask = None - # label is for distinguishing neuropil from ROI, in case - # these masks are mixed together - self.label = label - # auxiliary metadata. if a particula mask is part of an group, - # that data can be stored here - self.mask_group = mask_group - self.flags = set([]) - - def __str__(self): - return "%s: TL=%d,%d w,h=%d,%d\n%s" % (self.label, self.x, self.y, self.width, self.height, str(self.mask)) - - def init_by_pixels(self, border, pix_list): - ''' - Initialize mask using a list of mask pixels - - Parameters - ---------- - border: float[4] - Coordinates defining useable area of image. See create_roi_mask() - - pix_list: integer[][2] - List of pixel coordinates (x,y) that define the mask - ''' - assert pix_list.shape[1] == 2, "Pixel list not properly formed" - array = np.zeros((self.img_rows, self.img_cols), dtype=bool) - - # pix_list stores array of [x,y] coordinates - array[pix_list[:, 1], pix_list[:, 0]] = 1 - - self.init_by_mask(border, array) - - def get_mask_plane(self): - ''' - Returns mask content on full-size image plane - - Returns - ------- - numpy 2D array [img_rows][img_cols] - ''' - mask = np.zeros((self.img_rows, self.img_cols)) - mask[self.y:self.y + self.height, self.x:self.x + self.width] = self.mask - return mask - - -def create_roi_mask(image_w, image_h, border, pix_list=None, roi_mask=None, label=None, mask_group=-1): - ''' - Conveninece function to create and initializes an RoiMask - - Parameters - ---------- - - image_w: integer - Width of image that ROI resides in - - image_h: integer - Height of image that ROI resides in - - border: float[4] - Coordinates defining useable area of image. If the entire image - is usable, and masks are valid anywhere in the image, this should - be [0, 0, 0, 0]. The following constants - help describe the array order: - - RIGHT_SHIFT = 0 - - LEFT_SHIFT = 1 - - DOWN_SHIFT = 2 - - UP_SHIFT = 3 - - When parts of the image are unusable, for example due motion - correction shifting of different image frames, the border array - should store the usable image area - - pix_list: integer[][2] - List of pixel coordinates (x,y) that define the mask - - roi_mask: integer[image_h][image_w] - Image-sized array that describes the mask. Active parts of the - mask should have values >0. Background pixels must be zero - - label: text - User-defined text label to identify mask - - mask_group: integer - User-defined number to help put masks into different categories - - Returns - ------- - RoiMask object - ''' - m = RoiMask(image_w, image_h, label, mask_group) - if pix_list is not None: - m.init_by_pixels(border, pix_list) - elif roi_mask is not None: - m.init_by_mask(border, roi_mask) - else: - assert False, "Must specify either roi_mask or pix_list" - return m - - -class RoiMask(Mask): - - def __init__(self, image_w, image_h, label, mask_group): - ''' - RoiMask class constructor - - Parameters - ---------- - image_w: integer - Width of image that ROI resides in - - image_h: integer - Height of image that ROI resides in - - label: text - User-defined text label to identify mask - - mask_group: integer - User-defined number to help put masks into different categories - ''' - super(RoiMask, self).__init__(image_w, image_h, label, mask_group) - - def init_by_mask(self, border, array): - ''' - Initialize mask using spatial mask - - Parameters - ---------- - border: float[4] - Coordinates defining useable area of image. See create_roi_mask(). - - roi_mask: integer[image height][image width] - Image-sized array that describes the mask. Active parts of the - mask should have values >0. Background pixels must be zero - ''' - px = np.argwhere(array) - - if len(px) == 0: - self.flags.add('zero_pixels') - return - - (top, left), (bottom, right) = px.min(0), px.max(0) - - # left and right border insets - l_inset = math.ceil(border[RIGHT_SHIFT]) - r_inset = math.floor(self.img_cols - border[LEFT_SHIFT]) - 1 - # top and bottom border insets - t_inset = math.ceil(border[DOWN_SHIFT]) - b_inset = math.floor(self.img_rows - border[UP_SHIFT]) - 1 - - # if ROI crosses border, it's considered invalid - if left < l_inset or right > r_inset: - self.flags.add('overlaps_motion_border') - if top < t_inset or bottom > b_inset: - self.flags.add('overlaps_motion_border') - # - self.x = left - self.width = right - left + 1 - self.y = top - self.height = bottom - top + 1 - # make copy of mask - self.mask = array[top:bottom + 1, left:right + 1] - - -def create_neuropil_mask(roi, border, combined_binary_mask, label=None): - ''' - Conveninece function to create and initializes a Neuropil mask. - Neuropil masks are defined as the region around an ROI, up to 13 - pixels out, that does not include other ROIs - - Parameters - ---------- - - roi: RoiMask object - The ROI that the neuropil masks will be based on - - border: float[4] - Border widths on the [right, left, down, up] sides. The resulting - neuropil mask will not include pixels falling into a border. - - combined_binary_mask - List of pixel coordinates (x,y) that define the mask - - combined_binary_mask: integer[image_h][image_w] - Image-sized array that shows the position of all ROIs in the - image. ROI masks should have a value of one. Background pixels - must be zero. In other words, ithe combined_binary_mask is a - bitmap union of all ROI masks - - label: text - User-defined text label to identify the mask - - Returns - ------- - NeuropilMask object - ''' - # combined_binary_mask is a bitmap union of ALL ROI masks - # create a binary mask of the ROI - binary_mask = np.zeros((roi.img_rows, roi.img_cols)) - binary_mask[roi.y:roi.y + roi.height, roi.x:roi.x + roi.width] = roi.mask - binary_mask = binary_mask > 0 - # dilate the mask - binary_mask_dilated = morphology.binary_dilation( - binary_mask, structure=np.ones((3, 3)), iterations=13) # T/F - # eliminate ROIs from the dilation - binary_mask_dilated = binary_mask_dilated > combined_binary_mask - # create mask from binary dilation - m = NeuropilMask(w=roi.img_cols, h=roi.img_rows, - label=label, mask_group=roi.mask_group) - m.init_by_mask(border, binary_mask_dilated) - return m - - -class NeuropilMask(Mask): - - def __init__(self, w, h, label, mask_group): - ''' - NeuropilMask class constructor. This class should be created by - calling create_neuropil_mask() - - Parameters - ---------- - label: text - User-defined text label to identify mask - - mask_group: integer - User-defined number to help put masks into different categories - ''' - super(NeuropilMask, self).__init__(w, h, label, mask_group) - - def init_by_mask(self, border, array): - ''' - Initialize mask using spatial mask - - Parameters - ---------- - border: float[4] - Border widths on the [right, left, down, up] sides. The resulting - neuropil mask will not include pixels falling into a border. - array: integer[image height][image width] - Image-sized array that describes the mask. Active parts of the - mask should have values >0. Background pixels must be zero - ''' - px = np.argwhere(array) - - if len(px) == 0: - self.flags.add('zero_pixels') - return - - (top, left), (bottom, right) = px.min(0), px.max(0) - - # left and right border insets - l_inset = math.ceil(border[RIGHT_SHIFT]) - r_inset = math.floor(self.img_cols - border[LEFT_SHIFT]) - 1 - # top and bottom border insets - t_inset = math.ceil(border[DOWN_SHIFT]) - b_inset = math.floor(self.img_rows - border[UP_SHIFT]) - 1 - # restrict neuropil masks to center area of frame (ie, exclude - # areas that overlap with movement correction buffer) - if left < l_inset: - left = l_inset - if right < l_inset: - right = l_inset - if right > r_inset: - right = r_inset - if left > r_inset: - left = r_inset - if top < t_inset: - top = t_inset - if bottom < t_inset: - bottom = t_inset - if bottom > b_inset: - bottom = b_inset - if top > b_inset: - top = b_inset - # - self.x = left - self.width = right - left + 1 - self.y = top - self.height = bottom - top + 1 - # make copy of mask - self.mask = array[top:bottom + 1, left:right + 1] - -def validate_mask(mask): - '''Check a given roi or neuropil mask for (a subset of) disqualifying problems. - ''' - - exclusions = [] - - if 'zero_pixels' in mask.flags or mask.mask.sum() == 0: - - if isinstance(mask, NeuropilMask): - label = 'empty_neuropil_mask' - elif isinstance(mask, RoiMask): - label = 'empty_roi_mask' - else: - label = 'zero_pixels' - - exclusions.append({ - 'roi_id': mask.label, - 'exclusion_label_name': label - }) - - if 'overlaps_motion_border' in mask.flags: - exclusions.append({ - 'roi_id': mask.label, - 'exclusion_label_name': 'motion_border' - }) - - return exclusions - - -def calculate_traces(stack, mask_list, block_size=1000): - ''' - Calculates the average response of the specified masks in the - image stack - - Parameters - ---------- - stack: float[image height][image width] - Image stack that masks are applied to - - mask_list: list<Mask> - List of masks - - Returns - ------- - float[number masks][number frames] - This is the average response for each Mask in each image frame - ''' - - traces = np.zeros((len(mask_list), stack.shape[0]), dtype=float) - num_frames = stack.shape[0] - - mask_areas = np.zeros(len(mask_list), dtype=float) - valid_masks = np.ones(len(mask_list), dtype=bool) - - exclusions = [] - - for i, mask in enumerate(mask_list): - - current_exclusions = validate_mask(mask) - if len(current_exclusions) > 0: - traces[i,:] = np.nan - valid_masks[i] = False - exclusions.extend(current_exclusions) - reasons = ", ".join([item["exclusion_label_name"] for item in current_exclusions]) - logging.warning("unable to extract traces for mask \"{}\": {} ".format(mask.label, reasons)) - continue - - if not isinstance(mask.mask, np.ndarray): - mask.mask = np.array(mask.mask) - mask_areas[i] = mask.mask.sum() - - # calculate traces - for frame_num in range(0, num_frames, block_size): - if frame_num % block_size == 0: - logging.debug("frame " + str(frame_num) + " of " + str(num_frames)) - frames = stack[frame_num:frame_num+block_size] - - for i in range(len(mask_list)): - if not valid_masks[i]: - continue - - mask = mask_list[i] - subframe = frames[:,mask.y:mask.y + mask.height, - mask.x:mask.x + mask.width] - - total = subframe[:, mask.mask].sum(axis=1) - traces[i, frame_num:frame_num+block_size] = total / mask_areas[i] - - return traces, exclusions - -def calculate_roi_and_neuropil_traces(movie_h5, roi_mask_list, motion_border): - """ get roi and neuropil masks """ - - # a combined binary mask for all ROIs (this is used to - # subtracted ROIs from annuli - mask_array = create_roi_mask_array(roi_mask_list) - combined_mask = mask_array.max(axis=0) - - logging.info("%d total ROIs" % len(roi_mask_list)) - - # create neuropil masks for the central ROIs - neuropil_masks = [] - for m in roi_mask_list: - nmask = create_neuropil_mask(m, motion_border, combined_mask, "neuropil for " + m.label) - neuropil_masks.append(nmask) - - num_rois = len(roi_mask_list) - combined_list = roi_mask_list + neuropil_masks # read the large image stack only once - - with h5py.File(movie_h5, "r") as movie_f: - stack_frames = movie_f["data"] - - logging.info("Calculating %d traces (neuropil + ROI) over %d frames" % (len(combined_list), len(stack_frames))) - traces, exclusions = calculate_traces(stack_frames, combined_list) - - roi_traces = traces[:num_rois] - neuropil_traces = traces[num_rois:] - - return roi_traces, neuropil_traces, exclusions - - -def create_roi_mask_array(rois): - '''Create full image mask array from list of RoiMasks. - - Parameters - ---------- - rois: list<RoiMask> - List of roi masks. - - Returns - ------- - np.ndarray: NxWxH array - Boolean array of of len(rois) image masks. - ''' - if rois: - height = rois[0].img_rows - width = rois[0].img_cols - masks = np.zeros((len(rois), height, width), dtype=np.uint8) - for i, roi in enumerate(rois): - masks[i, :, :] = roi.get_mask_plane() - else: - masks = None - return masks - diff --git a/allensdk/brain_observatory/running_speed.py b/allensdk/brain_observatory/running_speed.py deleted file mode 100644 index c579a15af5..0000000000 --- a/allensdk/brain_observatory/running_speed.py +++ /dev/null @@ -1,22 +0,0 @@ -from typing import NamedTuple - -import numpy as np - - -class RunningSpeed(NamedTuple): - ''' Describes the rate at which an experimental subject ran during a session. - - values : np.ndarray - running speed (cm/s) at each sample point - timestamps : np.ndarray - The time at which each sample was collected (s). - - ''' - - timestamps: np.ndarray - values: np.ndarray - - def __eq__(self, other): - a = np.array_equal(self.timestamps, other.timestamps) - b = np.array_equal(self.values, other.values) - return a and b diff --git a/allensdk/brain_observatory/session_analysis.py b/allensdk/brain_observatory/session_analysis.py deleted file mode 100644 index eff434bc58..0000000000 --- a/allensdk/brain_observatory/session_analysis.py +++ /dev/null @@ -1,599 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -from .static_gratings import StaticGratings -from .locally_sparse_noise import LocallySparseNoise -from .natural_scenes import NaturalScenes -from .drifting_gratings import DriftingGratings -from .natural_movie import NaturalMovie -import six -from allensdk.core.brain_observatory_nwb_data_set \ - import BrainObservatoryNwbDataSet -from . import stimulus_info -from allensdk.brain_observatory.brain_observatory_exceptions \ - import BrainObservatoryAnalysisException -from . import brain_observatory_plotting as cp -import argparse -import logging -import os - -from allensdk.deprecated import deprecated - - - -def multi_dataframe_merge(dfs): - """ merge a number of pd.DataFrames into a single dataframe on their index columns. - If any columns are duplicated, prefer the first occuring instance of the column """ - - out_df = None - for _, df in enumerate(dfs): - if out_df is None: - out_df = df - else: - out_df = out_df.merge(df, left_index=True, - right_index=True, suffixes=['', '_deleteme']) - - bad_columns = set([c for c in out_df.columns if c.endswith('deleteme')]) - out_df.drop(list(bad_columns), axis=1, inplace=True) - - return out_df - - -class SessionAnalysis(object): - """ - Run all of the stimulus-specific analyses associated with a single experiment session. - - Parameters - ---------- - nwb_path: string, path to NWB file - - save_path: string, path to HDF5 file to store outputs. Recommended NOT to modify the NWB file. - """ - - _log = logging.getLogger('allensdk.brain_observatory.session_analysis') - - def __init__(self, nwb_path, save_path): - self.nwb = BrainObservatoryNwbDataSet(nwb_path) - self.save_path = save_path - self.save_dir = os.path.dirname(save_path) - - self.metrics_a = dict(cell={},experiment={}) - self.metrics_b = dict(cell={},experiment={}) - self.metrics_c = dict(cell={},experiment={}) - - self.metadata = self.nwb.get_metadata() - - def append_metadata(self, df): - """ Append the metadata fields from the NWB file as columns to a pd.DataFrame """ - - for k, v in six.iteritems(self.metadata): - df[k] = v - - def save_session_a(self, dg, nm1, nm3, peak): - """ Save the output of session A analysis to self.save_path. - - Parameters - ---------- - dg: DriftingGratings instance - - nm1: NaturalMovie instance - This NaturalMovie instance should have been created with - movie_name = stimulus_info.NATURAL_MOVIE_ONE - - nm3: NaturalMovie instance - This NaturalMovie instance should have been created with - movie_name = stimulus_info.NATURAL_MOVIE_THREE - - peak: pd.DataFrame - The combined peak response property table created in self.session_a(). - """ - - nwb = BrainObservatoryNwbDataSet(self.save_path) - - nwb.save_analysis_dataframes( - ('stim_table_dg', dg.stim_table), - ('sweep_response_dg', dg.sweep_response), - ('mean_sweep_response_dg', dg.mean_sweep_response), - ('peak', peak), - ('sweep_response_nm1', nm1.sweep_response), - ('stim_table_nm1', nm1.stim_table), - ('sweep_response_nm3', nm3.sweep_response)) - - nwb.save_analysis_arrays( - ('response_dg', dg.response), - ('binned_cells_sp', nm1.binned_cells_sp), - ('binned_cells_vis', nm1.binned_cells_vis), - ('binned_dx_sp', nm1.binned_dx_sp), - ('binned_dx_vis', nm1.binned_dx_vis), - ('noise_corr_dg', dg.noise_correlation), - ('signal_corr_dg', dg.signal_correlation), - ('rep_similarity_dg', dg.representational_similarity) - ) - - - def save_session_b(self, sg, nm1, ns, peak): - """ Save the output of session B analysis to self.save_path. - - Parameters - ---------- - sg: StaticGratings instance - - nm1: NaturalMovie instance - This NaturalMovie instance should have been created with - movie_name = stimulus_info.NATURAL_MOVIE_ONE - - ns: NaturalScenes instance - - peak: pd.DataFrame - The combined peak response property table created in self.session_b(). - """ - - nwb = BrainObservatoryNwbDataSet(self.save_path) - - nwb.save_analysis_dataframes( - ('stim_table_sg', sg.stim_table), - ('sweep_response_sg', sg.sweep_response), - ('mean_sweep_response_sg', sg.mean_sweep_response), - ('sweep_response_nm1', nm1.sweep_response), - ('stim_table_nm1', nm1.stim_table), - ('sweep_response_ns', ns.sweep_response), - ('stim_table_ns', ns.stim_table), - ('mean_sweep_response_ns', ns.mean_sweep_response), - ('peak', peak)) - - nwb.save_analysis_arrays( - ('response_sg', sg.response), - ('response_ns', ns.response), - ('binned_cells_sp', nm1.binned_cells_sp), - ('binned_cells_vis', nm1.binned_cells_vis), - ('binned_dx_sp', nm1.binned_dx_sp), - ('binned_dx_vis', nm1.binned_dx_vis), - ('noise_corr_sg', sg.noise_correlation), - ('signal_corr_sg', sg.signal_correlation), - ('rep_similarity_sg', sg.representational_similarity), - ('noise_corr_ns', ns.noise_correlation), - ('signal_corr_ns', ns.signal_correlation), - ('rep_similarity_ns', ns.representational_similarity) - ) - - def save_session_c(self, lsn, nm1, nm2, peak): - """ Save the output of session C analysis to self.save_path. - - Parameters - ---------- - lsn: LocallySparseNoise instance - - nm1: NaturalMovie instance - This NaturalMovie instance should have been created with - movie_name = stimulus_info.NATURAL_MOVIE_ONE - - nm2: NaturalMovie instance - This NaturalMovie instance should have been created with - movie_name = stimulus_info.NATURAL_MOVIE_TWO - - peak: pd.DataFrame - The combined peak response property table created in self.session_c(). - """ - - nwb = BrainObservatoryNwbDataSet(self.save_path) - - nwb.save_analysis_dataframes( - ('stim_table_lsn', lsn.stim_table), - ('sweep_response_nm1', nm1.sweep_response), - ('peak', peak), - ('sweep_response_nm2', nm2.sweep_response), - ('sweep_response_lsn', lsn.sweep_response), - ('mean_sweep_response_lsn', lsn.mean_sweep_response)) - - nwb.save_analysis_arrays( - ('receptive_field_lsn', lsn.receptive_field), - ('mean_response_lsn', lsn.mean_response), - ('binned_dx_sp', nm1.binned_dx_sp), - ('binned_dx_vis', nm1.binned_dx_vis), - ('binned_cells_sp', nm1.binned_cells_sp), - ('binned_cells_vis', nm1.binned_cells_vis)) - - LocallySparseNoise.save_cell_index_receptive_field_analysis(lsn.cell_index_receptive_field_analysis_data, nwb, stimulus_info.LOCALLY_SPARSE_NOISE) - - def save_session_c2(self, lsn4, lsn8, nm1, nm2, peak): - """ Save the output of session C2 analysis to self.save_path. - - Parameters - ---------- - lsn4: LocallySparseNoise instance - This LocallySparseNoise instance should have been created with - self.stimulus = stimulus_info.LOCALLY_SPARSE_NOISE_4DEG. - - lsn8: LocallySparseNoise instance - This LocallySparseNoise instance should have been created with - self.stimulus = stimulus_info.LOCALLY_SPARSE_NOISE_8DEG. - - nm1: NaturalMovie instance - This NaturalMovie instance should have been created with - movie_name = stimulus_info.NATURAL_MOVIE_ONE - - nm2: NaturalMovie instance - This NaturalMovie instance should have been created with - movie_name = stimulus_info.NATURAL_MOVIE_TWO - - peak: pd.DataFrame - The combined peak response property table created in self.session_c2(). - """ - - nwb = BrainObservatoryNwbDataSet(self.save_path) - - nwb.save_analysis_dataframes( - ('stim_table_lsn4', lsn4.stim_table), - ('stim_table_lsn8', lsn8.stim_table), - ('sweep_response_nm1', nm1.sweep_response), - ('peak', peak), - ('sweep_response_nm2', nm2.sweep_response), - ('sweep_response_lsn4', lsn4.sweep_response), - ('sweep_response_lsn8', lsn8.sweep_response), - ('mean_sweep_response_lsn4', lsn4.mean_sweep_response), - ('mean_sweep_response_lsn8', lsn8.mean_sweep_response)) - - merge_mean_response = LocallySparseNoise.merge_mean_response( - lsn4.mean_response, - lsn8.mean_response) - - nwb.save_analysis_arrays( - ('mean_response_lsn4', lsn4.mean_response), - ('mean_response_lsn8', lsn8.mean_response), - ('receptive_field_lsn4', lsn4.receptive_field), - ('receptive_field_lsn8', lsn8.receptive_field), - ('merge_mean_response', merge_mean_response), - ('binned_dx_sp', nm1.binned_dx_sp), - ('binned_dx_vis', nm1.binned_dx_vis), - ('binned_cells_sp', nm1.binned_cells_sp), - ('binned_cells_vis', nm1.binned_cells_vis)) - - LocallySparseNoise.save_cell_index_receptive_field_analysis(lsn4.cell_index_receptive_field_analysis_data, nwb, stimulus_info.LOCALLY_SPARSE_NOISE_4DEG) - LocallySparseNoise.save_cell_index_receptive_field_analysis(lsn8.cell_index_receptive_field_analysis_data, nwb, stimulus_info.LOCALLY_SPARSE_NOISE_8DEG) - - def append_metrics_drifting_grating(self, metrics, dg): - """ Extract metrics from the DriftingGratings peak response table into a dictionary. """ - - metrics["osi_dg"] = dg.peak["osi_dg"] - metrics["dsi_dg"] = dg.peak["dsi_dg"] - metrics["pref_dir_dg"] = [dg.orivals[i] - for i in dg.peak["ori_dg"].values] - metrics["pref_tf_dg"] = [dg.tfvals[i] for i in dg.peak["tf_dg"].values] - metrics["p_dg"] = dg.peak["ptest_dg"] - metrics["g_osi_dg"] = dg.peak["cv_os_dg"] - metrics["g_dsi_dg"] = dg.peak["cv_ds_dg"] - metrics["reliability_dg"] = dg.peak["reliability_dg"] - metrics["tfdi_dg"] = dg.peak["tf_index_dg"] - metrics["run_mod_dg"] = dg.peak["run_modulation_dg"] - metrics["p_run_mod_dg"] = dg.peak["p_run_dg"] - metrics["peak_dff_dg"] = dg.peak["peak_dff_dg"] - - def append_metrics_static_grating(self, metrics, sg): - """ Extract metrics from the StaticGratings peak response table into a dictionary. """ - - metrics["osi_sg"] = sg.peak["osi_sg"] - metrics["pref_ori_sg"] = [sg.orivals[i] - for i in sg.peak["ori_sg"].values] - metrics["pref_sf_sg"] = [sg.sfvals[i] for i in sg.peak["sf_sg"].values] - metrics["pref_phase_sg"] = [sg.phasevals[i] - for i in sg.peak["phase_sg"].values] - metrics["p_sg"] = sg.peak["ptest_sg"] - metrics["time_to_peak_sg"] = sg.peak["time_to_peak_sg"] - metrics["run_mod_sg"] = sg.peak["run_modulation_sg"] - metrics["p_run_mod_sg"] = sg.peak["p_run_sg"] - metrics["g_osi_sg"] = sg.peak["cv_os_sg"] - metrics["sfdi_sg"] = sg.peak["sf_index_sg"] - metrics["peak_dff_sg"] = sg.peak["peak_dff_sg"] - metrics["reliability_sg"] = sg.peak["reliability_sg"] - - def append_metrics_natural_scene(self, metrics, ns): - """ Extract metrics from the NaturalScenes peak response table into a dictionary. """ - - metrics["pref_image_ns"] = ns.peak["scene_ns"] - metrics["p_ns"] = ns.peak["ptest_ns"] - metrics["time_to_peak_ns"] = ns.peak["time_to_peak_ns"] - metrics["image_sel_ns"] = ns.peak["image_selectivity_ns"] - metrics["reliability_ns"] = ns.peak["reliability_ns"] - metrics["run_mod_ns"] = ns.peak["run_modulation_ns"] - metrics["p_run_mod_ns"] = ns.peak["p_run_ns"] - metrics["peak_dff_ns"] = ns.peak["peak_dff_ns"] - - def append_metrics_locally_sparse_noise(self, metrics, lsn): - """ Extract metrics from the LocallySparseNoise peak response table into a dictionary. """ - - metrics['rf_chi2_lsn'] = lsn.peak['rf_chi2_lsn'] - metrics['rf_area_on_lsn'] = lsn.peak['rf_area_on_lsn'] - metrics['rf_center_on_x_lsn'] = lsn.peak['rf_center_on_x_lsn'] - metrics['rf_center_on_y_lsn'] = lsn.peak['rf_center_on_y_lsn'] - metrics['rf_area_off_lsn'] = lsn.peak['rf_area_off_lsn'] - metrics['rf_center_off_x_lsn'] = lsn.peak['rf_center_off_x_lsn'] - metrics['rf_center_off_y_lsn'] = lsn.peak['rf_center_off_y_lsn'] - metrics['rf_distance_lsn'] = lsn.peak['rf_distance_lsn'] - metrics['rf_overlap_index_lsn'] = lsn.peak['rf_overlap_index_lsn'] - - def append_metrics_natural_movie_one(self, metrics, nma): - """ Extract metrics from the NaturalMovie(stimulus_info.NATURAL_MOVIE_ONE) peak response table into a dictionary. """ - metrics['reliability_nm1'] = nma.peak['response_reliability_nm1'] - - def append_metrics_natural_movie_two(self, metrics, nma): - """ Extract metrics from the NaturalMovie(stimulus_info.NATURAL_MOVIE_TWO) peak response table into a dictionary. """ - metrics['reliability_nm2'] = nma.peak['response_reliability_nm2'] - - def append_metrics_natural_movie_three(self, metrics, nma): - """ Extract metrics from the NaturalMovie(stimulus_info.NATURAL_MOVIE_THREE) peak response table into a dictionary. """ - metrics['reliability_nm3'] = nma.peak['response_reliability_nm3'] - - def append_experiment_metrics(self, metrics): - """ Extract stimulus-agnostic metrics from an experiment into a dictionary """ - dxcm, dxtime = self.nwb.get_running_speed() - metrics['mean_running_speed'] = np.nanmean(dxcm) - - def verify_roi_lists_equal(self, roi1, roi2): - """ TODO: replace this with simpler numpy comparisons """ - - if len(roi1) != len(roi2): - raise BrainObservatoryAnalysisException( - "Error -- ROI lists are of different length") - - for i in range(len(roi1)): - if roi1[i] != roi2[i]: - raise BrainObservatoryAnalysisException( - "Error -- ROI lists have different entries") - - def session_a(self, plot_flag=False, save_flag=True): - """ Run stimulus-specific analysis for natural movie one, natural movie three, and drifting gratings. - The input NWB be for a stimulus_info.THREE_SESSION_A experiment. - - Parameters - ---------- - plot_flag: bool - Whether to generate brain_observatory_plotting work plots after running analysis. - - save_flag: bool - Whether to save the output of analysis to self.save_path upon completion. - """ - - nm1 = NaturalMovie(self.nwb, 'natural_movie_one') - nm3 = NaturalMovie(self.nwb, 'natural_movie_three') - dg = DriftingGratings(self.nwb) - - dg.noise_correlation, _, _, _ = dg.get_noise_correlation() - dg.signal_correlation, _ = dg.get_signal_correlation() - dg.representational_similarity, _ = dg.get_representational_similarity() - - SessionAnalysis._log.info("Session A analyzed") - peak = multi_dataframe_merge( - [nm1.peak_run, dg.peak, nm1.peak, nm3.peak]) - - self.append_metrics_drifting_grating(self.metrics_a['cell'], dg) - self.append_metrics_natural_movie_one(self.metrics_a['cell'], nm1) - self.append_metrics_natural_movie_three(self.metrics_a['cell'], nm3) - self.append_experiment_metrics(self.metrics_a['experiment']) - self.metrics_a['cell']['roi_id'] = dg.roi_id - - self.append_metadata(peak) - - if save_flag: - self.save_session_a(dg, nm1, nm3, peak) - - if plot_flag: - cp._plot_3sa(dg, nm1, nm3, self.save_dir) - cp.plot_drifting_grating_traces(dg, self.save_dir) - - def session_b(self, plot_flag=False, save_flag=True): - """ Run stimulus-specific analysis for natural scenes, static gratings, and natural movie one. - The input NWB be for a stimulus_info.THREE_SESSION_B experiment. - - Parameters - ---------- - plot_flag: bool - Whether to generate brain_observatory_plotting work plots after running analysis. - - save_flag: bool - Whether to save the output of analysis to self.save_path upon completion. - """ - - ns = NaturalScenes(self.nwb) - sg = StaticGratings(self.nwb) - nm1 = NaturalMovie(self.nwb, 'natural_movie_one') - SessionAnalysis._log.info("Session B analyzed") - peak = multi_dataframe_merge( - [nm1.peak_run, sg.peak, ns.peak, nm1.peak]) - self.append_metadata(peak) - - self.append_metrics_static_grating(self.metrics_b['cell'], sg) - self.append_metrics_natural_scene(self.metrics_b['cell'], ns) - self.append_metrics_natural_movie_one(self.metrics_b['cell'], nm1) - self.append_experiment_metrics(self.metrics_b['experiment']) - self.verify_roi_lists_equal(sg.roi_id, ns.roi_id) - self.metrics_b['cell']['roi_id'] = sg.roi_id - - sg.noise_correlation, _, _, _ = sg.get_noise_correlation() - sg.signal_correlation, _ = sg.get_signal_correlation() - sg.representational_similarity, _ = sg.get_representational_similarity() - - ns.noise_correlation, _ = ns.get_noise_correlation() - ns.signal_correlation, _ = ns.get_signal_correlation() - ns.representational_similarity, _ = ns.get_representational_similarity() - - if save_flag: - self.save_session_b(sg, nm1, ns, peak) - - if plot_flag: - cp._plot_3sb(sg, nm1, ns, self.save_dir) - cp.plot_ns_traces(ns, self.save_dir) - cp.plot_sg_traces(sg, self.save_dir) - - def session_c(self, plot_flag=False, save_flag=True): - """ Run stimulus-specific analysis for natural movie one, natural movie two, and locally sparse noise. - The input NWB be for a stimulus_info.THREE_SESSION_C experiment. - - Parameters - ---------- - plot_flag: bool - Whether to generate brain_observatory_plotting work plots after running analysis. - - save_flag: bool - Whether to save the output of analysis to self.save_path upon completion. - """ - - lsn = LocallySparseNoise(self.nwb, stimulus_info.LOCALLY_SPARSE_NOISE) - nm2 = NaturalMovie(self.nwb, 'natural_movie_two') - nm1 = NaturalMovie(self.nwb, 'natural_movie_one') - SessionAnalysis._log.info("Session C analyzed") - peak = multi_dataframe_merge([nm1.peak_run, nm1.peak, nm2.peak, lsn.peak]) - self.append_metadata(peak) - - self.append_metrics_locally_sparse_noise(self.metrics_c['cell'], lsn) - self.append_metrics_natural_movie_one(self.metrics_c['cell'], nm1) - self.append_metrics_natural_movie_two(self.metrics_c['cell'], nm2) - self.append_experiment_metrics(self.metrics_c['experiment']) - self.metrics_c['cell']['roi_id'] = nm1.roi_id - - if save_flag: - self.save_session_c(lsn, nm1, nm2, peak) - - if plot_flag: - cp._plot_3sc(lsn, nm1, nm2, self.save_dir) - cp.plot_lsn_traces(lsn, self.save_dir) - - def session_c2(self, plot_flag=False, save_flag=True): - """ Run stimulus-specific analysis for locally sparse noise (4 deg.), locally sparse noise (8 deg.), - natural movie one, and natural movie two. The input NWB be for a stimulus_info.THREE_SESSION_C2 experiment. - - Parameters - ---------- - plot_flag: bool - Whether to generate brain_observatory_plotting work plots after running analysis. - - save_flag: bool - Whether to save the output of analysis to self.save_path upon completion. - """ - - lsn4 = LocallySparseNoise(self.nwb, stimulus_info.LOCALLY_SPARSE_NOISE_4DEG) - lsn8 = LocallySparseNoise(self.nwb, stimulus_info.LOCALLY_SPARSE_NOISE_8DEG) - - nm2 = NaturalMovie(self.nwb, 'natural_movie_two') - nm1 = NaturalMovie(self.nwb, 'natural_movie_one') - SessionAnalysis._log.info("Session C2 analyzed") - - if self.nwb.get_metadata()['targeted_structure'] == 'VISp': - lsn_peak = lsn4 - else: - lsn_peak = lsn8 - - peak = multi_dataframe_merge([nm1.peak_run, nm1.peak, nm2.peak, lsn_peak.peak]) - self.append_metadata(peak) - - self.append_metrics_locally_sparse_noise(self.metrics_c['cell'], lsn_peak) - self.append_metrics_natural_movie_one(self.metrics_c['cell'], nm1) - self.append_metrics_natural_movie_two(self.metrics_c['cell'], nm2) - self.append_experiment_metrics(self.metrics_c['experiment']) - self.metrics_c['cell']['roi_id'] = nm1.roi_id - - if save_flag: - self.save_session_c2(lsn4, lsn8, nm1, nm2, peak) - - if plot_flag: - cp._plot_3sc(lsn4, nm1, nm2, self.save_dir, '_4deg') - cp._plot_3sc(lsn8, nm1, nm2, self.save_dir, '_8deg') - cp.plot_lsn_traces(lsn4, self.save_dir, '_4deg') - cp.plot_lsn_traces(lsn4, self.save_dir, '_8deg') - - -def run_session_analysis(nwb_path, save_path, plot_flag=False, save_flag=True): - """ Inspect an NWB file to determine which experiment session was run - and compute all stimulus-specific analyses. - - Parameters - ---------- - nwb_path: string - Path to NWB file. - - save_path: string - path to save results. Recommended NOT to use NWB file. - - plot_flag: bool - Whether to save brain_observatory_plotting work plots. - - save_flag: bool - Whether to save results to save_path. - """ - - save_dir = os.path.abspath(os.path.dirname(save_path)) - - if not os.path.exists(save_dir): - os.makedirs(save_dir) - - session_analysis = SessionAnalysis(nwb_path, save_path) - - session = session_analysis.nwb.get_session_type() - - if session == stimulus_info.THREE_SESSION_A: - session_analysis.session_a(plot_flag=plot_flag, save_flag=save_flag) - metrics = session_analysis.metrics_a - elif session == stimulus_info.THREE_SESSION_B: - session_analysis.session_b(plot_flag=plot_flag, save_flag=save_flag) - metrics = session_analysis.metrics_b - elif session == stimulus_info.THREE_SESSION_C: - session_analysis.session_c(plot_flag=plot_flag, save_flag=save_flag) - metrics = session_analysis.metrics_c - elif session == stimulus_info.THREE_SESSION_C2: - session_analysis.session_c2(plot_flag=plot_flag, save_flag=save_flag) - metrics = session_analysis.metrics_c - else: - raise IndexError("Unknown session: %s" % session) - - return metrics - - -@deprecated('use the standalone version in bin/brain_observatory') -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("input_nwb") - parser.add_argument("output_h5") - - parser.add_argument("--plot", action='store_true') - - args = parser.parse_args() - logging.basicConfig() - logging.getLogger().setLevel(logging.DEBUG) - - run_session_analysis(args.input_nwb, args.output_h5, args.plot) - - -if __name__ == '__main__': - main() diff --git a/allensdk/brain_observatory/session_api_utils.py b/allensdk/brain_observatory/session_api_utils.py deleted file mode 100644 index 2b07882ca7..0000000000 --- a/allensdk/brain_observatory/session_api_utils.py +++ /dev/null @@ -1,231 +0,0 @@ -import inspect -import logging -import warnings -from collections import Callable - -from itertools import zip_longest -from typing import Any, Dict, List, Optional, Set, Iterable - -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.comparison_utils import compare_fields -from allensdk.brain_observatory.behavior.data_objects import DataObject - - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - - -def is_equal(a: Any, b: Any) -> bool: - """Function to deal with checking if two variables of possibly mixed types - have the same value.""" - - if type(a) != type(b): - return False - - if isinstance(a, (pd.Series, pd.DataFrame)): - return a.equals(b) - elif isinstance(a, np.ndarray): - return np.array_equal(a, b) - elif isinstance(a, (list, tuple)): - for a_elem, b_elem in zip_longest(a, b): - if not is_equal(a_elem, b_elem): - return False - return True - elif isinstance(a, set): - for a_elem, b_elem in zip_longest(sorted(a), sorted(b)): - if not is_equal(a_elem, b_elem): - return False - return True - elif isinstance(a, dict): - for (a_k, a_v), (b_k, b_v) in zip_longest(sorted(a.items()), - sorted(b.items())): - if (a_k != b_k) or (not is_equal(a_v, b_v)): - return False - return True - else: - return bool(a == b) - - -class ParamsMixin: - """This mixin adds parameter management functionality to the class it is - mixed into. - - This mixin expects that the class it is mixed into will have an __init__ - with type annotated parameters. It also expects for the class to have - semi-private attributes of the __init__ type annotated parameters. - - Example: - - SomeClassWhereParamManagementIsDesired(ParamsMixin): - - # Managed params should be typed (with simple types if possible)! - def __init__(self, param_to_ignore, a_param_1: int, a_param_2: float, - b_param_1: list): - # Parameters can be ignored by the mixin - super().__init__(ignore={'param_to_ignore'}) - - # Pay attention to the naming scheme! - self._a_param_1 = a_param_1 - self._a_param_2 = a_param_2 - self._b_param_1 = b_param_1 - - ... - - After being mixed in, methods like 'get_params', 'set_params', - 'needs_data_refresh', and 'clear_updated_params' will be available. - """ - - def __init__(self, ignore: set = {'api'}): - self._updated_params: set = set() - self._ignore = ignore - - @classmethod - def _get_param_signatures(cls) -> List[inspect.Parameter]: - init = getattr(cls, '__init__') - if init is object.__init__: - # Class has a default __init__ and thus no params - return [] - init_signature = inspect.signature(init) - # Filter out 'self' and '**kwargs' params - parameters = [p for p in init_signature.parameters.values() - if (p.name != 'self') and (p.kind != p.VAR_KEYWORD)] - return parameters - - @classmethod - def _get_param_type_annotations(cls) -> Dict[str, type]: - parameters = cls._get_param_signatures() - return {p.name: p.annotation for p in parameters} - - @classmethod - def _get_param_names(cls) -> List[str]: - parameters = cls._get_param_signatures() - return sorted([p.name for p in parameters]) - - def get_params(self) -> Dict[str, Any]: - """Get managed params and their values""" - out = dict() - for param in self._get_param_names(): - if param in self._ignore: - continue - value = getattr(self, f"_{param}") - out.update({param: value}) - return out - - def set_params(self, **params): - """Set managed params""" - valid_params = self.get_params().keys() - param_types = self._get_param_type_annotations() - current_params = self.get_params() - - for param, value in params.items(): - if param in valid_params: - current_value = current_params[param] - - if isinstance(value, param_types[param]): - if not is_equal(current_value, value): - setattr(self, f"_{param}", value) - self._updated_params.add(param) - else: - warnings.warn(f"The value ({value}) for parameter " - f"'{param}' should be of type " - f"'{param_types[param]}' but is instead " - f"{type(value)}. It will remain as: " - f"{current_value} " - f"({type(current_value)}).", - stacklevel=2) - else: - warnings.warn(f"The parameter '{param}' is not valid " - f"and is being ignored! " - f"Possible params are: {valid_params}", - stacklevel=2) - - def needs_data_refresh(self, data_params: set) -> bool: - """Check if specific params have been updated via `set_params()`""" - return bool(data_params & self._updated_params) - - def clear_updated_params(self, data_params: set): - """This method clears 'updated params' whose data have been updated""" - self._updated_params -= data_params - - -def sessions_are_equal(A, B, reraise=False, - ignore_keys: Optional[Dict[str, Set[str]]] = None, - skip_fields: Optional[Iterable] = None, - test_methods=False) \ - -> bool: - """Check if two Session objects are equal (have same property and - get method values). - - Parameters - ---------- - A : Session A - The first session to compare - B : Session B - The second session to compare - reraise : bool, optional - Whether to reraise when encountering an Assertion or AttributeError, - by default False - ignore_keys - Set of keys to ignore for property/method. Should be given as - {property/method name: {field_to_ignore, ...}, ...} - test_methods - Whether to test get methods - skip_fields - Do not compare these fields - - Returns - ------- - bool - Whether the two sessions are equal to one another. - """ - if ignore_keys is None: - ignore_keys = dict() - if skip_fields is None: - - skip_fields = set() - - A_data_attrs_and_methods = A.list_data_attributes_and_methods() - B_data_attrs_and_methods = B.list_data_attributes_and_methods() - field_set = set(A_data_attrs_and_methods).union(B_data_attrs_and_methods) - - logger.info(f"Comparing the following fields: {field_set}") - - for field in sorted(field_set): - if field in skip_fields: - continue - - try: - logger.info(f"Comparing field: {field}") - x1, x2 = getattr(A, field), getattr(B, field) - if test_methods: - if isinstance(x1, Callable): - x1 = x1() - x2 = x2() - else: - continue - - err_msg = (f"{field} on {A} did not equal {field} " - f"on {B} (\n{x1} vs\n{x2}\n)") - if isinstance(x1, DataObject): - x1 = x1.value - if isinstance(x2, DataObject): - x2 = x2.value - compare_fields(x1, x2, err_msg, - ignore_keys=ignore_keys.get(field, None)) - - except NotImplementedError: - A_implements_get_field = hasattr( - A.api, getattr(type(A), field).getter_name) - B_implements_get_field = hasattr( - B.api, getattr(type(B), field).getter_name) - assert ((A_implements_get_field is False) - and (B_implements_get_field is False)) - - except (AssertionError, AttributeError): - if reraise: - raise - return False - - return True diff --git a/allensdk/brain_observatory/static_gratings.py b/allensdk/brain_observatory/static_gratings.py deleted file mode 100644 index 735bb2eb4e..0000000000 --- a/allensdk/brain_observatory/static_gratings.py +++ /dev/null @@ -1,594 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import scipy.stats as st -import numpy as np -import pandas as pd -from math import sqrt -import logging -from .stimulus_analysis import StimulusAnalysis -from .brain_observatory_exceptions import BrainObservatoryAnalysisException, MissingStimulusException -from . import observatory_plots as oplots -from . import circle_plots as cplots -import h5py -import matplotlib.pyplot as plt - -class StaticGratings(StimulusAnalysis): - """ Perform tuning analysis specific to static gratings stimulus. - - Parameters - ---------- - data_set: BrainObservatoryNwbDataSet object - """ - - _log = logging.getLogger('allensdk.brain_observatory.static_gratings') - - def __init__(self, data_set, **kwargs): - super(StaticGratings, self).__init__(data_set, **kwargs) - - self._sweeplength = StaticGratings._PRELOAD - self._interlength = StaticGratings._PRELOAD - self._extralength = StaticGratings._PRELOAD - self._orivals = StaticGratings._PRELOAD - self._sfvals = StaticGratings._PRELOAD - self._phasevals = StaticGratings._PRELOAD - self._number_ori = StaticGratings._PRELOAD - self._number_sf = StaticGratings._PRELOAD - self._number_phase = StaticGratings._PRELOAD - - @property - def sweeplength(self): - if self._sweeplength is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._sweeplength - - @property - def interlength(self): - if self._interlength is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._interlength - - @property - def extralength(self): - if self._extralength is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._extralength - - @property - def orivals(self): - if self._orivals is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._orivals - - @property - def sfvals(self): - if self._sfvals is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._sfvals - - @property - def phasevals(self): - if self._phasevals is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._phasevals - - @property - def number_ori(self): - if self._number_ori is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._number_ori - - @property - def number_sf(self): - if self._number_sf is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._number_sf - - @property - def number_phase(self): - if self._number_phase is StaticGratings._PRELOAD: - self.populate_stimulus_table() - - return self._number_phase - - def populate_stimulus_table(self): - stimulus_table = self.data_set.get_stimulus_table('static_gratings') - self._stim_table = stimulus_table.fillna(value=0.) - self._sweeplength = self.stim_table['end'].iloc[ - 1] - self.stim_table['start'].iloc[1] - self._interlength = 4 * self._sweeplength - self._extralength = self._sweeplength - self._orivals = np.unique(self._stim_table.orientation.dropna()) - self._sfvals = np.unique(self._stim_table.spatial_frequency.dropna()) - self._phasevals = np.unique(self._stim_table.phase.dropna()) - self._number_ori = len(self._orivals) - self._number_sf = len(self._sfvals) - self._number_phase = len(self._phasevals) - - def get_response(self): - ''' Computes the mean response for each cell to each stimulus condition. Return is - a (# orientations, # spatial frequencies, # phasees, # cells, 3) np.ndarray. The final dimension - contains the mean response to the condition (index 0), standard error of the mean of the response - to the condition (index 1), and the number of trials with a significant response (p < 0.05) - to that condition (index 2). - - Returns - ------- - Numpy array storing mean responses. - ''' - StaticGratings._log.info("Calculating mean responses") - - response = np.empty((self.number_ori, self.number_sf, - self.number_phase, self.numbercells + 1, 3)) - - def ptest(x): - return len(np.where(x < (0.05 / (self.number_ori * (self.number_sf - 1))))[0]) - - for ori in self.orivals: - ori_pt = np.where(self.orivals == ori)[0][0] - - for sf in self.sfvals: - sf_pt = np.where(self.sfvals == sf)[0][0] - - for phase in self.phasevals: - phase_pt = np.where(self.phasevals == phase)[0][0] - subset_response = self.mean_sweep_response[(self.stim_table.spatial_frequency == sf) & ( - self.stim_table.orientation == ori) & (self.stim_table.phase == phase)] - subset_pval = self.pval[(self.stim_table.spatial_frequency == sf) & ( - self.stim_table.orientation == ori) & (self.stim_table.phase == phase)] - response[ori_pt, sf_pt, phase_pt, :, - 0] = subset_response.mean(axis=0) - response[ori_pt, sf_pt, phase_pt, :, 1] = subset_response.std( - axis=0) / sqrt(len(subset_response)) - response[ori_pt, sf_pt, phase_pt, :, - 2] = subset_pval.apply(ptest, axis=0) - - return response - - def get_peak(self): - ''' Computes metrics related to each cell's peak response condition. - - Returns - ------- - Panda data frame with the following fields (_sg suffix is - for static grating): - * ori_sg (orientation) - * sf_sg (spatial frequency) - * phase_sg - * response_variability_sg - * osi_sg (orientation selectivity index) - * peak_dff_sg (peak dF/F) - * ptest_sg - * time_to_peak_sg - ''' - StaticGratings._log.info('Calculating peak response properties') - - peak = pd.DataFrame(index=range(self.numbercells), columns=('ori_sg', 'sf_sg', 'phase_sg', 'reliability_sg', - 'osi_sg', 'peak_dff_sg', 'ptest_sg', 'time_to_peak_sg', - 'cell_specimen_id','p_run_sg', 'cv_os_sg', - 'run_modulation_sg', 'sf_index_sg')) - cids = self.data_set.get_cell_specimen_ids() - - orivals_rad = np.deg2rad(self.orivals) - for nc in range(self.numbercells): - cell_peak = np.where(self.response[:, 1:, :, nc, 0] == np.nanmax( - self.response[:, 1:, :, nc, 0])) - pref_ori = cell_peak[0][0] - pref_sf = cell_peak[1][0] + 1 - pref_phase = cell_peak[2][0] - peak.cell_specimen_id.iloc[nc] = cids[nc] - peak.ori_sg[nc] = pref_ori - peak.sf_sg[nc] = pref_sf - peak.phase_sg[nc] = pref_phase - -# peak.response_reliability_sg[nc] = self.response[ -# pref_ori, pref_sf, pref_phase, nc, 2] / 0.48 # TODO: check number of trials - - pref = self.response[pref_ori, pref_sf, pref_phase, nc, 0] - orth = self.response[ - np.mod(pref_ori + 3, 6), pref_sf, pref_phase, nc, 0] - tuning = self.response[:, pref_sf, pref_phase, nc, 0] - tuning = np.where(tuning>0, tuning, 0) - CV_top_os = np.empty((6), dtype=np.complex128) - for i in range(6): - CV_top_os[i] = (tuning[i]*np.exp(1j*2*orivals_rad[i])) - peak.cv_os_sg.iloc[nc] = np.abs(CV_top_os.sum())/tuning.sum() - - peak.osi_sg[nc] = (pref - orth) / (pref + orth) - peak.peak_dff_sg[nc] = pref - groups = [] - - for ori in self.orivals: - for sf in self.sfvals[1:]: - for phase in self.phasevals: - groups.append(self.mean_sweep_response[(self.stim_table.spatial_frequency == sf) & ( - self.stim_table.orientation == ori) & (self.stim_table.phase == phase)][str(nc)]) - groups.append(self.mean_sweep_response[ - self.stim_table.spatial_frequency == 0][str(nc)]) - - _, p = st.f_oneway(*groups) - peak.ptest_sg[nc] = p - - test_rows = (self.stim_table.orientation == self.orivals[pref_ori]) & \ - (self.stim_table.spatial_frequency == self.sfvals[pref_sf]) & \ - (self.stim_table.phase == self.phasevals[pref_phase]) - - if len(test_rows) < 2: - msg = "Static grating p value requires at least 2 trials at the preferred " - "orientation/spatial frequency/phase. Cell %d (%f, %f, %f) has %d." % \ - (int(nc), self.orivals[pref_ori], self.sfvals[pref_sf], - self.phasevals[pref_phase], len(test_rows)) - - raise BrainObservatoryAnalysisException(msg) - - test = self.sweep_response[test_rows][str(nc)].mean() - peak.time_to_peak_sg[nc] = ( - np.argmax(test) - self.interlength) / self.acquisition_rate - - #running modulation - subset = self.mean_sweep_response[(self.stim_table.spatial_frequency==self.sfvals[pref_sf])&(self.stim_table.orientation==self.orivals[pref_ori])&(self.stim_table.phase==self.phasevals[pref_phase])] - subset_run = subset[subset.dx>=1] - subset_stat = subset[subset.dx<1] - if (len(subset_run)>4) & (len(subset_stat)>4): - (_,peak.p_run_sg.iloc[nc]) = st.ttest_ind(subset_run[str(nc)], subset_stat[str(nc)], equal_var=False) - - if subset_run[str(nc)].mean()>subset_stat[str(nc)].mean(): - peak.run_modulation_sg.iloc[nc] = (subset_run[str(nc)].mean() - subset_stat[str(nc)].mean())/np.abs(subset_run[str(nc)].mean()) - elif subset_run[str(nc)].mean()<subset_stat[str(nc)].mean(): - peak.run_modulation_sg.iloc[nc] = -1*((subset_stat[str(nc)].mean() - subset_run[str(nc)].mean())/np.abs(subset_stat[str(nc)].mean())) - else: - peak.p_run_sg.iloc[nc] = np.NaN - peak.run_modulation_sg.iloc[nc] = np.NaN - - #reliability - subset = self.sweep_response[(self.stim_table.spatial_frequency==self.sfvals[pref_sf])&(self.stim_table.orientation==self.orivals[pref_ori])&(self.stim_table.phase==self.phasevals[pref_phase])] - corr_matrix = np.empty((len(subset),len(subset))) - for i in range(len(subset)): - for j in range(len(subset)): - r,p = st.pearsonr(subset[str(nc)].iloc[i][28:42], subset[str(nc)].iloc[j][28:42]) - corr_matrix[i,j] = r - mask = np.ones((len(subset), len(subset))) - for i in range(len(subset)): - for j in range(len(subset)): - if i>=j: - mask[i,j] = np.NaN - corr_matrix *= mask - peak.reliability_sg.iloc[nc] = np.nanmean(corr_matrix) - - #SF index - sf_tuning = self.response[pref_ori,1:,pref_phase,nc,0] - trials = self.mean_sweep_response[(self.stim_table.spatial_frequency!=0)&(self.stim_table.orientation==self.orivals[pref_ori])&(self.stim_table.phase==self.phasevals[pref_phase])][str(nc)].values - SSE_part = np.sqrt(np.sum((trials-trials.mean())**2)/(len(trials)-5)) - peak.sf_index_sg.iloc[nc] = (np.ptp(sf_tuning))/(np.ptp(sf_tuning) + 2*SSE_part) - - return peak - - def plot_time_to_peak(self, - p_value_max=oplots.P_VALUE_MAX, - color_map=oplots.STIMULUS_COLOR_MAP): - stimulus_table = self.data_set.get_stimulus_table('static_gratings') - - resps = [] - - for index, row in self.peak.iterrows(): - pref_rows = (stimulus_table.orientation==self.orivals[row.ori_sg]) & \ - (stimulus_table.spatial_frequency==self.sfvals[row.sf_sg]) & \ - (stimulus_table.phase==self.phasevals[row.phase_sg]) - - mean_response = self.sweep_response[pref_rows][str(index)].mean() - resps.append((mean_response - mean_response.mean() / mean_response.std())) - - mean_responses = np.array(resps) - - sorted_table = self.peak[self.peak.ptest_sg < p_value_max].sort_values('time_to_peak_sg') - cell_order = sorted_table.index - - # time to peak is relative to stimulus start in seconds - ttps = sorted_table.time_to_peak_sg.values + self.interlength / self.acquisition_rate - msrs_sorted = mean_responses[cell_order,:] - - oplots.plot_time_to_peak(msrs_sorted, ttps, - 0, (2*self.interlength + self.sweeplength) / self.acquisition_rate, - (self.interlength) / self.acquisition_rate, - (self.interlength + self.sweeplength) / self.acquisition_rate, - color_map) - - - def plot_orientation_selectivity(self, - si_range=oplots.SI_RANGE, - n_hist_bins=oplots.N_HIST_BINS, - color=oplots.STIM_COLOR, - p_value_max=oplots.P_VALUE_MAX, - peak_dff_min=oplots.PEAK_DFF_MIN): - - # responsive cells - vis_cells = (self.peak.ptest_sg < p_value_max) & (self.peak.peak_dff_sg > peak_dff_min) - - # orientation selective cells - osi_cells = vis_cells & (self.peak.osi_sg > si_range[0]) & (self.peak.osi_sg < si_range[1]) - - peak_osi = self.peak.ix[osi_cells] - osis = peak_osi.osi_sg.values - - oplots.plot_selectivity_cumulative_histogram(osis, - "orientation selectivity index", - si_range=si_range, - n_hist_bins=n_hist_bins, - color=color) - - def plot_preferred_orientation(self, - include_labels=False, - si_range=oplots.SI_RANGE, - color=oplots.STIM_COLOR, - p_value_max=oplots.P_VALUE_MAX, - peak_dff_min=oplots.PEAK_DFF_MIN): - - vis_cells = (self.peak.ptest_sg < p_value_max) & (self.peak.peak_dff_sg > peak_dff_min) - pref_oris = self.peak.ix[vis_cells].ori_sg.values - pref_oris = [ self.orivals[pref_ori] for pref_ori in pref_oris ] - - angles, counts = np.unique(pref_oris, return_counts=True) - - oplots.plot_radial_histogram(angles, - counts, - include_labels=include_labels, - all_angles=self.orivals, - direction=-1, - offset=180.0, - color=color) - - if len(counts) == 0: - max_count = 1 - else: - max_count = max(counts) - - center_x = 0.0 - center_y = 0.5 * max_count - - # dimensions to get plot to fit - h = 1.6 * max_count - w = 2.4 * max_count - - plt.gca().set(xlim=(center_x - w*0.5, center_x + w*0.5), - ylim = (center_y - h*0.5, center_y + h*0.5), - aspect=1.0) - - def plot_preferred_spatial_frequency(self, - si_range=oplots.SI_RANGE, - color=oplots.STIM_COLOR, - p_value_max=oplots.P_VALUE_MAX, - peak_dff_min=oplots.PEAK_DFF_MIN): - - vis_cells = (self.peak.ptest_sg < p_value_max) & (self.peak.peak_dff_sg > peak_dff_min) - pref_sfs = self.peak.ix[vis_cells].sf_sg.values - - oplots.plot_condition_histogram(pref_sfs, - self.sfvals[1:], - color=color) - - plt.xlabel("spatial frequency (cycles/deg)") - plt.ylabel("number of cells") - - def open_fan_plot(self, cell_specimen_id=None, include_labels=False, cell_index=None): - cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) - - df = self.mean_sweep_response[str(cell_index)] - st = self.data_set.get_stimulus_table('static_gratings') - mask = st.dropna(subset=['orientation']).index - - data = df.values - - cmin = self.response[0,0,0,cell_index,0] - cmax = max(cmin, data.mean() + data.std()*3) - - fp = cplots.FanPlotter.for_static_gratings() - fp.plot(r_data=st.spatial_frequency.ix[mask].values, - angle_data=st.orientation.ix[mask].values, - group_data=st.phase.ix[mask].values, - data=df.ix[mask].values, - clim=[cmin, cmax]) - fp.show_axes(closed=False) - - if include_labels: - fp.show_r_labels() - fp.show_angle_labels() - - - def reshape_response_array(self): - ''' - :return: response array in cells x stim conditions x repetition for noise correlations - this is a re-organization of the mean sweep response table - ''' - - mean_sweep_response = self.mean_sweep_response.values[:, :self.numbercells] - - stim_table = self.stim_table - sfvals = self.sfvals - sfvals = sfvals[sfvals != 0] # blank sweep - - response_new = np.zeros((self.numbercells, self.number_ori, self.number_sf-1, self.number_phase), dtype='object') - - for i, ori in enumerate(self.orivals): - for j, sf in enumerate(sfvals): - for k, phase in enumerate(self.phasevals): - ind = (stim_table.orientation.values == ori) * (stim_table.spatial_frequency.values == sf) * (stim_table.phase.values == phase) - for c in range(self.numbercells): - response_new[c, i, j, k] = mean_sweep_response[ind, c] - - ind = (stim_table.spatial_frequency.values == 0) - response_blank = mean_sweep_response[ind, :].T - - return response_new, response_blank - - - def get_signal_correlation(self, corr='spearman'): - logging.debug("Calculating signal correlation") - - response = self.response[:, 1:, :, :self.numbercells, 0] # orientation x freq x phase x cell, no blank - response = response.reshape(self.number_ori * (self.number_sf-1) * self.number_phase, self.numbercells).T - N, Nstim = response.shape - - signal_corr = np.zeros((N, N)) - signal_p = np.empty((N, N)) - if corr == 'pearson': - for i in range(N): - for j in range(i, N): # matrix is symmetric - signal_corr[i, j], signal_p[i, j] = st.pearsonr(response[i], response[j]) - - elif corr == 'spearman': - for i in range(N): - for j in range(i, N): # matrix is symmetric - signal_corr[i, j], signal_p[i, j] = st.spearmanr(response[i], response[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - signal_corr = np.triu(signal_corr) + np.triu(signal_corr, 1).T # fill in lower triangle - signal_p = np.triu(signal_p) + np.triu(signal_p, 1).T # fill in lower triangle - - return signal_corr, signal_p - - - def get_representational_similarity(self, corr='spearman'): - logging.debug("Calculating representational similarity") - - response = self.response[:, 1:, :, :self.numbercells, 0] # orientation x freq x phase x cell - response = response.reshape(self.number_ori * (self.number_sf-1) * self.number_phase, self.numbercells) - Nstim, N = response.shape - - rep_sim = np.zeros((Nstim, Nstim)) - rep_sim_p = np.empty((Nstim, Nstim)) - if corr == 'pearson': - for i in range(Nstim): - for j in range(i, Nstim): # matrix is symmetric - rep_sim[i, j], rep_sim_p[i, j] = st.pearsonr(response[i], response[j]) - - elif corr == 'spearman': - for i in range(Nstim): - for j in range(i, Nstim): # matrix is symmetric - rep_sim[i, j], rep_sim_p[i, j] = st.spearmanr(response[i], response[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - rep_sim = np.triu(rep_sim) + np.triu(rep_sim, 1).T # fill in lower triangle - rep_sim_p = np.triu(rep_sim_p) + np.triu(rep_sim_p, 1).T # fill in lower triangle - - return rep_sim, rep_sim_p - - - def get_noise_correlation(self, corr='spearman'): - logging.debug("Calculating noise correlation") - - response, response_blank = self.reshape_response_array() - noise_corr = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_sf-1, self.number_phase)) - noise_corr_p = np.zeros((self.numbercells, self.numbercells, self.number_ori, self.number_sf-1, self.number_phase)) - - noise_corr_blank = np.zeros((self.numbercells, self.numbercells)) - noise_corr_blank_p = np.zeros((self.numbercells, self.numbercells)) - - if corr == 'pearson': - for k in range(self.number_ori): - for l in range(self.number_sf-1): - for m in range(self.number_phase): - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr[i, j, k, l, m], noise_corr_p[i, j, k, l, m] = st.pearsonr(response[i, k, l, m], response[j, k, l, m]) - - noise_corr[:, :, k, l, m] = np.triu(noise_corr[:, :, k, l, m]) + np.triu(noise_corr[:, :, k, l, m], 1).T - - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.pearsonr(response_blank[i], response_blank[j]) - - elif corr == 'spearman': - for k in range(self.number_ori): - for l in range(self.number_sf-1): - for m in range(self.number_phase): - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr[i, j, k, l, m], noise_corr_p[i, j, k, l, m] = st.spearmanr(response[i, k, l, m], response[j, k, l, m]) - - noise_corr[:, :, k, l, m] = np.triu(noise_corr[:, :, k, l, m]) + np.triu(noise_corr[:, :, k, l, m], 1).T - - for i in range(self.numbercells): - for j in range(i, self.numbercells): - noise_corr_blank[i, j], noise_corr_blank_p[i, j] = st.spearmanr(response_blank[i], response_blank[j]) - - else: - raise Exception('correlation should be pearson or spearman') - - noise_corr_blank[:, :] = np.triu(noise_corr_blank[:, :]) + np.triu(noise_corr_blank[:, :], 1).T - - return noise_corr, noise_corr_p, noise_corr_blank, noise_corr_blank_p - - - @staticmethod - def from_analysis_file(data_set, analysis_file): - sg = StaticGratings(data_set) - - try: - sg.populate_stimulus_table() - - sg._sweep_response = pd.read_hdf(analysis_file, "analysis/sweep_response_sg") - sg._mean_sweep_response = pd.read_hdf(analysis_file, "analysis/mean_sweep_response_sg") - sg._peak = pd.read_hdf(analysis_file, "analysis/peak") - - with h5py.File(analysis_file, "r") as f: - sg._response = f["analysis/response_sg"].value - sg._binned_dx_sp = f["analysis/binned_dx_sp"].value - sg._binned_cells_sp = f["analysis/binned_cells_sp"].value - sg._binned_dx_vis = f["analysis/binned_dx_vis"].value - sg._binned_cells_vis = f["analysis/binned_cells_vis"].value - - if "analysis/noise_corr_sg" in f: - sg.noise_correlation = f["analysis/noise_corr_sg"].value - if "analysis/signal_corr_sg" in f: - sg.signal_correlation = f["analysis/signal_corr_sg"].value - if "analysis/rep_similarity_sg" in f: - sg.representational_similarity = f["analysis/rep_similarity_sg"].value - - except Exception as e: - raise MissingStimulusException(e.args) - - return sg diff --git a/allensdk/brain_observatory/stimulus_analysis.py b/allensdk/brain_observatory/stimulus_analysis.py deleted file mode 100644 index 9a4838fb8f..0000000000 --- a/allensdk/brain_observatory/stimulus_analysis.py +++ /dev/null @@ -1,606 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import warnings -import scipy.stats as st -import scipy -import numpy as np -import pandas as pd -import logging -from .findlevel import findlevel -from .brain_observatory_exceptions import BrainObservatoryAnalysisException -from . import observatory_plots as oplots -import matplotlib.pyplot as plt - -class StimulusAnalysis(object): - """ Base class for all response analysis code. Subclasses are responsible - for computing metrics and traces relevant to a particular stimulus. - The base class contains methods for organizing sweep responses row of - a stimulus stable (get_sweep_response). Subclasses implement the - get_response method, computes the mean sweep response to all sweeps for - a each stimulus condition. - - Parameters - ---------- - data_set: BrainObservatoryNwbDataSet instance - - speed_tuning: boolean, deprecated - Whether or not to compute speed tuning histograms - - """ - _log = logging.getLogger('allensdk.brain_observatory.stimulus_analysis') - _PRELOAD = "PRELOAD" - - def __init__(self, data_set): - self.data_set = data_set - self._timestamps = StimulusAnalysis._PRELOAD - self._celltraces = StimulusAnalysis._PRELOAD - self._acquisition_rate = StimulusAnalysis._PRELOAD - self._numbercells = StimulusAnalysis._PRELOAD - self._roi_id = StimulusAnalysis._PRELOAD - self._cell_id = StimulusAnalysis._PRELOAD - self._dfftraces = StimulusAnalysis._PRELOAD - self._dxcm = StimulusAnalysis._PRELOAD - self._dxtime = StimulusAnalysis._PRELOAD - self._binned_dx_sp = StimulusAnalysis._PRELOAD - self._binned_cells_sp = StimulusAnalysis._PRELOAD - self._binned_dx_vis = StimulusAnalysis._PRELOAD - self._binned_cells_vis = StimulusAnalysis._PRELOAD - self._peak_run = StimulusAnalysis._PRELOAD - self._binsize = 800 - - self._stim_table = StimulusAnalysis._PRELOAD - self._response = StimulusAnalysis._PRELOAD - self._sweep_response = StimulusAnalysis._PRELOAD - self._mean_sweep_response = StimulusAnalysis._PRELOAD - self._pval = StimulusAnalysis._PRELOAD - self._peak = StimulusAnalysis._PRELOAD - - # get_speed_tuning emits a warning describing a scipy ks_2samp update. - # we only want to see this warning once - self.__warned_speed_tuning = False - - @property - def stim_table(self): - if self._stim_table is StimulusAnalysis._PRELOAD: - self.populate_stimulus_table() - - return self._stim_table - - @property - def sweep_response(self): - if self._sweep_response is StimulusAnalysis._PRELOAD: - self._sweep_response, self._mean_sweep_response, self._pval = \ - self.get_sweep_response() - - return self._sweep_response - - @property - def mean_sweep_response(self): - if self._mean_sweep_response is StimulusAnalysis._PRELOAD: - self._sweep_response, self._mean_sweep_response, self._pval = \ - self.get_sweep_response() - - return self._mean_sweep_response - - @property - def pval(self): - if self._pval is StimulusAnalysis._PRELOAD: - self._sweep_response, self._mean_sweep_response, self._pval = \ - self.get_sweep_response() - - return self._pval - - @property - def response(self): - if self._response is StimulusAnalysis._PRELOAD: - self._response = self.get_response() - - return self._response - - @property - def peak(self): - if self._peak is StimulusAnalysis._PRELOAD: - self._peak = self.get_peak() - - return self._peak - - def get_fluorescence(self): - # get fluorescence - self._timestamps, self._celltraces = \ - self.data_set.get_corrected_fluorescence_traces() - self._acquisition_rate = 1 / (self.timestamps[1] - self.timestamps[0]) - self._numbercells = len(self.celltraces) # number of cells in dataset - - @property - def timestamps(self): - if self._timestamps is StimulusAnalysis._PRELOAD: - self.get_fluorescence() - - return self._timestamps - - @property - def celltraces(self): - if self._celltraces is StimulusAnalysis._PRELOAD: - self.get_fluorescence() - - return self._celltraces - - @property - def acquisition_rate(self): - if self._acquisition_rate is StimulusAnalysis._PRELOAD: - self.get_fluorescence() - - return self._acquisition_rate - - @property - def numbercells(self): - if self._numbercells is StimulusAnalysis._PRELOAD: - self.get_fluorescence() - - return self._numbercells - - @property - def roi_id(self): - if self._roi_id is StimulusAnalysis._PRELOAD: - self._roi_id = self.data_set.get_roi_ids() - - return self._roi_id - - @property - def cell_id(self): - if self._cell_id is StimulusAnalysis._PRELOAD: - self._cell_id = self.data_set.get_cell_specimen_ids() - - return self._cell_id - - @property - def dfftraces(self): - if self._dfftraces is StimulusAnalysis._PRELOAD: - _, self._dfftraces = self.data_set.get_dff_traces() - - return self._dfftraces - - @property - def dxcm(self): - if self._dxcm is StimulusAnalysis._PRELOAD: - self._dxcm, self._dxtime = self.data_set.get_running_speed() - - return self._dxcm - - @property - def dxtime(self): - if self._dxtime is StimulusAnalysis._PRELOAD: - self._dxcm, self._dxtime = self.data_set.get_running_speed() - - return self._dxtime - - @property - def binned_dx_sp(self): - if self._binned_dx_sp is StimulusAnalysis._PRELOAD: - (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, - self._binned_cells_vis, self._peak_run) = \ - self.get_speed_tuning(binsize=self._binsize) - - return self._binned_dx_sp - - @property - def binned_cells_sp(self): - if self._binned_cells_sp is StimulusAnalysis._PRELOAD: - (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, - self._binned_cells_vis, self._peak_run) = \ - self.get_speed_tuning(binsize=self._binsize) - - return self._binned_cells_sp - - @property - def binned_dx_vis(self): - if self._binned_dx_vis is StimulusAnalysis._PRELOAD: - (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, - self._binned_cells_vis, self._peak_run) = \ - self.get_speed_tuning(binsize=self._binsize) - - return self._binned_dx_vis - - @property - def binned_cells_vis(self): - if self._binned_cells_vis is StimulusAnalysis._PRELOAD: - (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, - self._binned_cells_vis, self._peak_run) = \ - self.get_speed_tuning(binsize=self._binsize) - - return self._binned_cells_vis - - @property - def peak_run(self): - if self._peak_run is StimulusAnalysis._PRELOAD: - (self._binned_dx_sp, self._binned_cells_sp, self._binned_dx_vis, - self._binned_cells_vis, self._peak_run) = \ - self.get_speed_tuning(binsize=self._binsize) - - return self._peak_run - - def populate_stimulus_table(self): - """ Implemented by subclasses. """ - raise BrainObservatoryAnalysisException("populate_stimulus_table not implemented") - - def get_response(self): - """ Implemented by subclasses. """ - raise BrainObservatoryAnalysisException("get_response not implemented") - - def get_peak(self): - """ Implemented by subclasses. """ - raise BrainObservatoryAnalysisException("get_peak not implemented") - - def get_speed_tuning(self, binsize): - """ Calculates speed tuning, spontaneous versus visually driven. The return is a 5-tuple - of speed and dF/F histograms. - - binned_dx_sp: (bins,2) np.ndarray of running speeds binned during spontaneous activity stimulus. - The first bin contains all speeds below 1 cm/s. Dimension 0 is mean running speed in the bin. - Dimension 1 is the standard error of the mean. - - binned_cells_sp: (bins,2) np.ndarray of fluorescence during spontaneous activity stimulus. - First bin contains all data for speeds below 1 cm/s. Dimension 0 is mean fluorescence in the bin. - Dimension 1 is the standard error of the mean. - - binned_dx_vis: (bins,2) np.ndarray of running speeds outside of spontaneous activity stimulus. - The first bin contains all speeds below 1 cm/s. Dimension 0 is mean running speed in the bin. - Dimension 1 is the standard error of the mean. - - binned_cells_vis: np.ndarray of fluorescence outside of spontaneous activity stimulu. - First bin contains all data for speeds below 1 cm/s. Dimension 0 is mean fluorescence in the bin. - Dimension 1 is the standard error of the mean. - - peak_run: pd.DataFrame of speed-related properties of a cell. - - Returns - ------- - tuple: binned_dx_sp, binned_cells_sp, binned_dx_vis, binned_cells_vis, peak_run - """ - - if not self.__warned_speed_tuning: - self.__warned_speed_tuning = True - warnings.warn( - f"scipy 1.3 (your version: {scipy.__version__}) improved two-sample Kolmogorov-Smirnoff test p values for small and medium-sized samples. " - "Precalculated speed tuning p values may not agree with outputs obtained under recent scipy versions!" - ) - - StimulusAnalysis._log.info( - 'Calculating speed tuning, spontaneous vs visually driven') - - celltraces_trimmed = np.delete(self.dfftraces, range( - len(self.dxcm), np.size(self.dfftraces, 1)), axis=1) - - # pull out spontaneous epoch(s) - spontaneous = self.data_set.get_stimulus_table('spontaneous') - - peak_run = pd.DataFrame(index=range(self.numbercells), columns=( - 'speed_max_sp', 'speed_min_sp', 'ptest_sp', 'mod_sp', 'speed_max_vis', 'speed_min_vis', 'ptest_vis', 'mod_vis')) - - dx_sp = self.dxcm[spontaneous.start.iloc[-1]:spontaneous.end.iloc[-1]] - celltraces_sp = celltraces_trimmed[ - :, spontaneous.start.iloc[-1]:spontaneous.end.iloc[-1]] - dx_vis = np.delete(self.dxcm, np.arange( - spontaneous.start.iloc[-1], spontaneous.end.iloc[-1])) - celltraces_vis = np.delete(celltraces_trimmed, np.arange( - spontaneous.start.iloc[-1], spontaneous.end.iloc[-1]), axis=1) - if len(spontaneous) > 1: - dx_sp = np.append( - dx_sp, self.dxcm[spontaneous.start.iloc[-2]:spontaneous.end.iloc[-2]], axis=0) - celltraces_sp = np.append(celltraces_sp, celltraces_trimmed[ - :, spontaneous.start.iloc[-2]:spontaneous.end.iloc[-2]], axis=1) - dx_vis = np.delete(dx_vis, np.arange( - spontaneous.start.iloc[-2], spontaneous.end.iloc[-2])) - celltraces_vis = np.delete(celltraces_vis, np.arange( - spontaneous.start.iloc[-2], spontaneous.end.iloc[-2]), axis=1) - celltraces_vis = celltraces_vis[:, ~np.isnan(dx_vis)] - dx_vis = dx_vis[~np.isnan(dx_vis)] - - nbins = 1 + len(np.where(dx_sp >= 1)[0]) // binsize - dx_sorted = dx_sp[np.argsort(dx_sp)] - celltraces_sorted_sp = celltraces_sp[:, np.argsort(dx_sp)] - binned_cells_sp = np.zeros((self.numbercells, nbins, 2)) - binned_dx_sp = np.zeros((nbins, 2)) - for i in range(nbins): - if np.all(np.isnan(dx_sorted)): - raise BrainObservatoryAnalysisException( - "dx is filled with NaNs") - - offset = findlevel(dx_sorted, 1, 'up') - - if offset is None: - StimulusAnalysis._log.info( - "dx never crosses 1, all speed data going into single bin") - offset = len(dx_sorted) - - if i == 0: - binned_dx_sp[i, 0] = np.mean(dx_sorted[:offset]) - binned_dx_sp[i, 1] = np.std( - dx_sorted[:offset]) / np.sqrt(offset) - binned_cells_sp[:, i, 0] = np.mean( - celltraces_sorted_sp[:, :offset], axis=1) - binned_cells_sp[:, i, 1] = np.std( - celltraces_sorted_sp[:, :offset], axis=1) / np.sqrt(offset) - else: - start = offset + (i - 1) * binsize - binned_dx_sp[i, 0] = np.mean(dx_sorted[start:start + binsize]) - binned_dx_sp[i, 1] = np.std( - dx_sorted[start:start + binsize]) / np.sqrt(binsize) - binned_cells_sp[:, i, 0] = np.mean( - celltraces_sorted_sp[:, start:start + binsize], axis=1) - binned_cells_sp[:, i, 1] = np.std( - celltraces_sorted_sp[:, start:start + binsize], axis=1) / np.sqrt(binsize) - - binned_cells_shuffled_sp = np.empty((self.numbercells, nbins, 2, 200)) - for shuf in range(200): - celltraces_shuffled = celltraces_sp[ - :, np.random.permutation(np.size(celltraces_sp, 1))] - celltraces_shuffled_sorted = celltraces_shuffled[ - :, np.argsort(dx_sp)] - for i in range(nbins): - offset = findlevel(dx_sorted, 1, 'up') - - if offset is None: - StimulusAnalysis._log.info( - "dx never crosses 1, all speed data going into single bin") - offset = celltraces_shuffled_sorted.shape[1] - - if i == 0: - binned_cells_shuffled_sp[:, i, 0, shuf] = np.mean( - celltraces_shuffled_sorted[:, :offset], axis=1) - binned_cells_shuffled_sp[:, i, 1, shuf] = np.std( - celltraces_shuffled_sorted[:, :offset], axis=1) - else: - start = offset + (i - 1) * binsize - binned_cells_shuffled_sp[:, i, 0, shuf] = np.mean( - celltraces_shuffled_sorted[:, start:start + binsize], axis=1) - binned_cells_shuffled_sp[:, i, 1, shuf] = np.std( - celltraces_shuffled_sorted[:, start:start + binsize], axis=1) - - nbins = 1 + len(np.where(dx_vis >= 1)[0]) // binsize - dx_sorted = dx_vis[np.argsort(dx_vis)] - celltraces_sorted_vis = celltraces_vis[:, np.argsort(dx_vis)] - binned_cells_vis = np.zeros((self.numbercells, nbins, 2)) - binned_dx_vis = np.zeros((nbins, 2)) - for i in range(nbins): - offset = findlevel(dx_sorted, 1, 'up') - - if offset is None: - StimulusAnalysis._log.info( - "dx never crosses 1, all speed data going into single bin") - offset = len(dx_sorted) - - if i == 0: - binned_dx_vis[i, 0] = np.mean(dx_sorted[:offset]) - binned_dx_vis[i, 1] = np.std( - dx_sorted[:offset]) / np.sqrt(offset) - binned_cells_vis[:, i, 0] = np.mean( - celltraces_sorted_vis[:, :offset], axis=1) - binned_cells_vis[:, i, 1] = np.std( - celltraces_sorted_vis[:, :offset], axis=1) / np.sqrt(offset) - else: - start = offset + (i - 1) * binsize - binned_dx_vis[i, 0] = np.mean(dx_sorted[start:start + binsize]) - binned_dx_vis[i, 1] = np.std( - dx_sorted[start:start + binsize]) / np.sqrt(binsize) - binned_cells_vis[:, i, 0] = np.mean( - celltraces_sorted_vis[:, start:start + binsize], axis=1) - binned_cells_vis[:, i, 1] = np.std( - celltraces_sorted_vis[:, start:start + binsize], axis=1) / np.sqrt(binsize) - - binned_cells_shuffled_vis = np.empty((self.numbercells, nbins, 2, 200)) - for shuf in range(200): - celltraces_shuffled = celltraces_vis[ - :, np.random.permutation(np.size(celltraces_vis, 1))] - celltraces_shuffled_sorted = celltraces_shuffled[ - :, np.argsort(dx_vis)] - for i in range(nbins): - offset = findlevel(dx_sorted, 1, 'up') - - if offset is None: - StimulusAnalysis._log.info( - "dx never crosses 1, all speed data going into single bin") - offset = len(dx_sorted) - - if i == 0: - binned_cells_shuffled_vis[:, i, 0, shuf] = np.mean( - celltraces_shuffled_sorted[:, :offset], axis=1) - binned_cells_shuffled_vis[:, i, 1, shuf] = np.std( - celltraces_shuffled_sorted[:, :offset], axis=1) - else: - start = offset + (i - 1) * binsize - binned_cells_shuffled_vis[:, i, 0, shuf] = np.mean( - celltraces_shuffled_sorted[:, start:start + binsize], axis=1) - binned_cells_shuffled_vis[:, i, 1, shuf] = np.std( - celltraces_shuffled_sorted[:, start:start + binsize], axis=1) - - shuffled_variance_sp = binned_cells_shuffled_sp[ - :, :, 0, :].std(axis=1)**2 - variance_threshold_sp = np.percentile( - shuffled_variance_sp, 99.9, axis=1) - response_variance_sp = binned_cells_sp[:, :, 0].std(axis=1)**2 - - shuffled_variance_vis = binned_cells_shuffled_vis[ - :, :, 0, :].std(axis=1)**2 - variance_threshold_vis = np.percentile( - shuffled_variance_vis, 99.9, axis=1) - response_variance_vis = binned_cells_vis[:, :, 0].std(axis=1)**2 - - for nc in range(self.numbercells): - if response_variance_vis[nc] > variance_threshold_vis[nc]: - peak_run.mod_vis[nc] = True - if response_variance_vis[nc] <= variance_threshold_vis[nc]: - peak_run.mod_vis[nc] = False - if response_variance_sp[nc] > variance_threshold_sp[nc]: - peak_run.mod_sp[nc] = True - if response_variance_sp[nc] <= variance_threshold_sp[nc]: - peak_run.mod_sp[nc] = False - temp = binned_cells_sp[nc, :, 0] - start_max = temp.argmax() - peak_run.speed_max_sp[nc] = binned_dx_sp[start_max, 0] - start_min = temp.argmin() - peak_run.speed_min_sp[nc] = binned_dx_sp[start_min, 0] - if peak_run.speed_max_sp[nc] > peak_run.speed_min_sp[nc]: - test_values = celltraces_sorted_sp[ - nc, start_max * binsize:(start_max + 1) * binsize] - other_values = np.delete(celltraces_sorted_sp[nc, :], range( - start_max * binsize, (start_max + 1) * binsize)) - (_, peak_run.ptest_sp[nc]) = nonraising_ks_2samp( - test_values, other_values) - else: - test_values = celltraces_sorted_sp[ - nc, start_min * binsize:(start_min + 1) * binsize] - other_values = np.delete(celltraces_sorted_sp[nc, :], range( - start_min * binsize, (start_min + 1) * binsize)) - (_, peak_run.ptest_sp[nc]) = nonraising_ks_2samp( - test_values, other_values) - temp = binned_cells_vis[nc, :, 0] - start_max = temp.argmax() - peak_run.speed_max_vis[nc] = binned_dx_vis[start_max, 0] - start_min = temp.argmin() - peak_run.speed_min_vis[nc] = binned_dx_vis[start_min, 0] - if peak_run.speed_max_vis[nc] > peak_run.speed_min_vis[nc]: - test_values = celltraces_sorted_vis[ - nc, start_max * binsize:(start_max + 1) * binsize] - other_values = np.delete(celltraces_sorted_vis[nc, :], range( - start_max * binsize, (start_max + 1) * binsize)) - else: - test_values = celltraces_sorted_vis[ - nc, start_min * binsize:(start_min + 1) * binsize] - other_values = np.delete(celltraces_sorted_vis[nc, :], range( - start_min * binsize, (start_min + 1) * binsize)) - (_, peak_run.ptest_vis[nc]) = nonraising_ks_2samp( - test_values, other_values) - - return binned_dx_sp, binned_cells_sp, binned_dx_vis, binned_cells_vis, peak_run - - def get_sweep_response(self): - """ Calculates the response to each sweep in the stimulus table for each cell and the mean response. - The return is a 3-tuple of: - - * sweep_response: pd.DataFrame of response dF/F traces organized by cell (column) and sweep (row) - - * mean_sweep_response: mean values of the traces returned in sweep_response - - * pval: p value from 1-way ANOVA comparing response during sweep to response prior to sweep - - Returns - ------- - 3-tuple: sweep_response, mean_sweep_response, pval - """ - def do_mean(x): - # +1]) - return np.mean(x[self.interlength:self.interlength + self.sweeplength + self.extralength]) - - def do_p_value(x): - (_, p) = st.f_oneway(x[:self.interlength], x[ - self.interlength:self.interlength + self.sweeplength + self.extralength]) - return p - - StimulusAnalysis._log.info('Calculating responses for each sweep') - sweep_response = pd.DataFrame(index=self.stim_table.index.values, - columns=list(map(str, range(self.numbercells + 1)))) - - sweep_response.rename( - columns={str(self.numbercells): 'dx'}, inplace=True) - - for index, row in self.stim_table.iterrows(): - start = int(row['start'] - self.interlength) - end = int(row['start'] + self.sweeplength + self.interlength) - - for nc in range(self.numbercells): - temp = self.celltraces[int(nc), start:end] - sweep_response[str(nc)][index] = 100 * \ - ((temp / np.mean(temp[:self.interlength])) - 1) - sweep_response['dx'][index] = self.dxcm[start:end] - - mean_sweep_response = sweep_response.applymap(do_mean) - - pval = sweep_response.applymap(do_p_value) - return sweep_response, mean_sweep_response, pval - - def plot_representational_similarity(self, repsim, stimulus=False): - if stimulus: - pass - - ax = plt.gca() - ax.imshow(repsim, interpolation='nearest', cmap='plasma') - - def plot_running_speed_histogram(self, xlim=None, nbins=None): - if xlim is None: - xlim = [-10,100] - if nbins is None: - nbins = 40 - - ax = plt.gca() - ax.hist(self.dxcm, bins=nbins, range=xlim, color=oplots.STIM_COLOR) - ax.set_xlim(xlim) - plt.xlabel("running speed (cm/s)") - plt.ylabel("time points") - - def plot_speed_tuning(self, cell_specimen_id=None, - cell_index=None, - evoked_color=oplots.EVOKED_COLOR, - spontaneous_color=oplots.SPONTANEOUS_COLOR): - cell_index = self.row_from_cell_id(cell_specimen_id, cell_index) - - oplots.plot_combined_speed(self.binned_cells_vis[cell_index,:,:]*100, self.binned_dx_vis[:,:], - self.binned_cells_sp[cell_index,:,:]*100, self.binned_dx_sp[:,:], - evoked_color, spontaneous_color) - - ax = plt.gca() - plt.xlabel("running speed (cm/s)") - plt.ylabel("percent dF/F") - - def row_from_cell_id(self, csid=None, idx=None): - - if csid is not None and not np.isnan(csid): - return self.data_set.get_cell_specimen_ids().tolist().index(csid) - elif idx is not None: - return idx - else: - raise Exception("Could not find row for csid(%s) idx(%s)" % (str(csid), str(idx))) - - -def nonraising_ks_2samp(data1, data2, **kwargs): - """ scipy.stats.ks_2samp now raises a ValueError if one of the input arrays - is of length 0. Previously it signaled this case by returning nans. This - function restores the prior behavior. - """ - - if min(len(data1), len(data2)) == 0: - return (np.nan, np.nan) - return st.ks_2samp(data1, data2, **kwargs) \ No newline at end of file diff --git a/allensdk/brain_observatory/stimulus_info.py b/allensdk/brain_observatory/stimulus_info.py deleted file mode 100755 index 595510c56f..0000000000 --- a/allensdk/brain_observatory/stimulus_info.py +++ /dev/null @@ -1,873 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import six -import numpy as np -import scipy.ndimage.interpolation as spndi -from PIL import Image -from allensdk.api.warehouse_cache.cache import memoize -import itertools - -# some handles for stimulus types -DRIFTING_GRATINGS = 'drifting_gratings' -DRIFTING_GRATINGS_SHORT = 'dg' -DRIFTING_GRATINGS_COLOR = '#a6cee3' - -STATIC_GRATINGS = 'static_gratings' -STATIC_GRATINGS_SHORT = 'sg' -STATIC_GRATINGS_COLOR = '#1f78b4' - -NATURAL_MOVIE_ONE = 'natural_movie_one' -NATURAL_MOVIE_ONE_SHORT = 'nm1' -NATURAL_MOVIE_ONE_COLOR = '#b2df8a' - -NATURAL_MOVIE_TWO = 'natural_movie_two' -NATURAL_MOVIE_TWO_SHORT = 'nm2' -NATURAL_MOVIE_TWO_COLOR = '#33a02c' - -NATURAL_MOVIE_THREE = 'natural_movie_three' -NATURAL_MOVIE_THREE_SHORT = 'nm3' -NATURAL_MOVIE_THREE_COLOR = '#fb9a99' - -NATURAL_SCENES = 'natural_scenes' -NATURAL_SCENES_SHORT = 'ns' -NATURAL_SCENES_COLOR = '#e31a1c' - -# note that this stimulus is equivalent to LOCALLY_SPARSE_NOISE_4DEG in session C2 files -LOCALLY_SPARSE_NOISE = 'locally_sparse_noise' -LOCALLY_SPARSE_NOISE_SHORT = 'lsn' -LOCALLY_SPARSE_NOISE_COLOR = '#fdbf6f' - -LOCALLY_SPARSE_NOISE_4DEG = 'locally_sparse_noise_4deg' -LOCALLY_SPARSE_NOISE_4DEG_SHORT = 'lsn4' -LOCALLY_SPARSE_NOISE_4DEG_COLOR = '#fdbf6f' - -LOCALLY_SPARSE_NOISE_8DEG = 'locally_sparse_noise_8deg' -LOCALLY_SPARSE_NOISE_8DEG_SHORT = 'lsn8' -LOCALLY_SPARSE_NOISE_8DEG_COLOR = '#ff7f00' - -SPONTANEOUS_ACTIVITY = 'spontaneous' -SPONTANEOUS_ACTIVITY_SHORT = 'sp' -SPONTANEOUS_ACTIVITY_COLOR = '#cab2d6' - -# handles for stimulus names -THREE_SESSION_A = 'three_session_A' -THREE_SESSION_B = 'three_session_B' -THREE_SESSION_C = 'three_session_C' -THREE_SESSION_C2 = 'three_session_C2' - -SESSION_LIST = [THREE_SESSION_A, THREE_SESSION_B, THREE_SESSION_C, THREE_SESSION_C2] - -SESSION_STIMULUS_MAP = { - THREE_SESSION_A: [DRIFTING_GRATINGS, NATURAL_MOVIE_ONE, NATURAL_MOVIE_THREE, SPONTANEOUS_ACTIVITY], - THREE_SESSION_B: [STATIC_GRATINGS, NATURAL_SCENES, NATURAL_MOVIE_ONE, SPONTANEOUS_ACTIVITY], - THREE_SESSION_C: [LOCALLY_SPARSE_NOISE, NATURAL_MOVIE_ONE, NATURAL_MOVIE_TWO, SPONTANEOUS_ACTIVITY], - THREE_SESSION_C2: [LOCALLY_SPARSE_NOISE_4DEG, LOCALLY_SPARSE_NOISE_8DEG, NATURAL_MOVIE_ONE, NATURAL_MOVIE_TWO, SPONTANEOUS_ACTIVITY] -} - -LOCALLY_SPARSE_NOISE_STIMULUS_TYPES = [LOCALLY_SPARSE_NOISE, LOCALLY_SPARSE_NOISE_4DEG, LOCALLY_SPARSE_NOISE_8DEG] -NATURAL_MOVIE_STIMULUS_TYPES = [NATURAL_MOVIE_ONE, NATURAL_MOVIE_TWO, NATURAL_MOVIE_THREE] - -LOCALLY_SPARSE_NOISE_DIMENSIONS = { - LOCALLY_SPARSE_NOISE: [ 16, 28 ], - LOCALLY_SPARSE_NOISE_4DEG: [ 16, 28 ], - LOCALLY_SPARSE_NOISE_8DEG: [ 8, 14 ], - } - -LOCALLY_SPARSE_NOISE_PIXELS = { - LOCALLY_SPARSE_NOISE: 45, - LOCALLY_SPARSE_NOISE_4DEG: 45, - LOCALLY_SPARSE_NOISE_8DEG: 90, - } - -NATURAL_SCENES_PIXELS = (918, 1174) -NATURAL_MOVIE_PIXELS = (1080, 1920) -NATURAL_MOVIE_DIMENSIONS = (304, 608) - -MONITOR_DIMENSIONS = (1200, 1920) -MONITOR_DISTANCE = 15 - -STIMULUS_GRAY = 127 -STIMULUS_BITDEPTH = 8 - -# Note: the "8deg" stimulus is actually 9.3 visual degrees on a side -LOCALLY_SPARSE_NOISE_PIXEL_SIZE = { - LOCALLY_SPARSE_NOISE: 4.65, - LOCALLY_SPARSE_NOISE_4DEG: 4.65, - LOCALLY_SPARSE_NOISE_8DEG: 9.3 -} - -RADIANS_TO_DEGREES = 57.2958 - -def sessions_with_stimulus(stimulus): - """ Return the names of the sessions that contain a given stimulus. """ - - sessions = set() - for session, session_stimuli in six.iteritems(SESSION_STIMULUS_MAP): - if stimulus in session_stimuli: - sessions.add(session) - - return sorted(list(sessions)) - - -def stimuli_in_session(session, allow_unknown=True): - """ Return a list what stimuli are available in a given session. - - Parameters - ---------- - session: string - Must be one of: [stimulus_info.THREE_SESSION_A, stimulus_info.THREE_SESSION_B, stimulus_info.THREE_SESSION_C, stimulus_info.THREE_SESSION_C2] - """ - try: - return SESSION_STIMULUS_MAP[session] - except KeyError as e: - if allow_unknown: - return [] - else: - raise - - -def all_stimuli(): - """ Return a list of all stimuli in the data set """ - return set([v for k, vl in six.iteritems(SESSION_STIMULUS_MAP) for v in vl]) - -class BinaryIntervalSearchTree(object): - - @staticmethod - def from_df(input_df): - search_list = input_df.to_dict('records') - - - - new_list = [] - for x in search_list: - if x['start'] == x['end']: - new_list.append((x['start'], x['end'], x)) - else: - # -.01 prevents endpoint-overlapping intervals; assigns ties to intervals that start at requested index - new_list.append((x['start'], x['end'] - .01, x)) - return BinaryIntervalSearchTree(new_list) - - - def __init__(self, search_list): - """Create a binary tree to search for a point within a list of intervals. Assumes that the intervals are - non-overlapping. If two intervals share an endpoint, the left-side wins the tie. - - :param search_list: list of interval tuples; in the tuple, first element is interval start, then interval - end (inclusive), then the return value for the lookup - - Example: - bist = BinaryIntervalSearchTree([(0,.5,'A'), (1,2,'B')]) - print(bist.search(1.5)) - """ - - # Double-check that the list is sorted - search_list = sorted(search_list, key=lambda x:x[0]) - - # Check that the intervals are non-overlapping (except potentially at the end point) - for x, y in zip(search_list[:-1], search_list[1:]): - assert x[1] <= y[0] - - - self.data = {} - self.add(search_list) - - def add(self, input_list, tmp=None): - if tmp is None: - tmp = [] - - if len(input_list) == 1: - self.data[tuple(tmp)] = input_list[0] - else: - self.add(input_list[:int(len(input_list)/2)], tmp=tmp+[0]) - self.add(input_list[int(len(input_list)/2):], tmp=tmp+[1]) - self.data[tuple(tmp)] = input_list[int(len(input_list)/2)-1] - - def search(self, fi, tmp=None): - if tmp is None: - tmp = [] - - if (self.data[tuple(tmp)][0] <= fi) and (fi <= self.data[tuple(tmp)][1]): - return_val = self.data[tuple(tmp)] - elif fi < self.data[tuple(tmp)][1]: - return_val = self.search(fi, tmp=tmp + [0]) - else: - return_val = self.search(fi, tmp=tmp + [1]) - - assert (return_val[0] <= fi) and (fi <= return_val[1]) - return return_val - -class StimulusSearch(object): - - def __init__(self, nwb_dataset): - - self.nwb_data = nwb_dataset - self.epoch_df = nwb_dataset.get_stimulus_epoch_table() - self.master_df = nwb_dataset.get_stimulus_table('master') - self.epoch_bst = BinaryIntervalSearchTree.from_df(self.epoch_df) - self.master_bst = BinaryIntervalSearchTree.from_df(self.master_df) - - @memoize - def search(self, fi): - - try: - - # Look in fine-grain tree: - search_result = self.master_bst.search(fi) - return search_result - except KeyError: - - # Current frame not found in a fine-grain interval; - # see if it is unregistered to a coarse-grain epoch: - try: - - # THis will thow KeyError if not in coarse-grain epoch - self.epoch_bst.search(fi) - - # Frame is in a coarse-grain epoch, but not a fine grain interval; - # look backwards to find most recent find nearest matching interval - if fi < self.epoch_df.iloc[0]['start']: - return None - else: - return self.search(fi-1) - - except KeyError: - - # Frame is unregistered at the coarse level; return None - return None - -def rotate(X, Y, theta): - x = np.array([X, Y]) - M = np.array([[np.cos(theta),-np.sin(theta)],[np.sin(theta), np.cos(theta)]]) - if len(x.shape) in [1,2]: - assert x.shape[0] == 2 - return M.dot(x) - elif len(x.shape) == 3: - M2 = M[:, :, np.newaxis, np.newaxis] - x2 = x[np.newaxis, :, :] - return (M2*x2).sum(axis=1) - else: - raise NotImplementedError - -def get_spatial_grating(height=None, aspect_ratio=None, ori=None, pix_per_cycle=None, phase=None, p2p_amp=2, baseline=0): - - aspect_ratio = float(aspect_ratio) - _height_prime = 100 - - sf = 1./(float(pix_per_cycle)/(height/float(_height_prime))) - - # Final height set by zoom below: - y, x = (_height_prime,_height_prime*aspect_ratio) - - theta = ori * np.pi / 180.0 # convert to radians - - ph = phase * np.pi * 2.0 - - X, Y = np.meshgrid(np.arange(x), np.arange(y)) - X = X - x / 2 - Y = Y - y / 2 - Xp, Yp = rotate(X, Y, theta) - - img = np.cos(2.0 * np.pi * Xp * sf + ph) - - return (p2p_amp/2.)*spndi.zoom(img, height/float(_height_prime)) + baseline - - -# def grating_to_screen(self, phase, spatial_frequency, orientation, **kwargs): - -def get_spatio_temporal_grating(t, temporal_frequency=None, **kwargs): - - kwargs['phase'] = kwargs.pop('phase', 0) + (float(t)*temporal_frequency)%1 - - return get_spatial_grating(**kwargs) - -def map_template_coordinate_to_monitor_coordinate(template_coord, monitor_shape, template_shape): - - rx, cx = template_coord - n_pixels_r, n_pixels_c = monitor_shape - tr, tc = template_shape - - rx_new = float((n_pixels_r - tr) / 2) + rx - cx_new = float((n_pixels_c - tc) / 2) + cx - - return rx_new, cx_new - -def map_monitor_coordinate_to_template_coordinate(monitor_coord, monitor_shape, template_shape): - - rx, cx = monitor_coord - n_pixels_r, n_pixels_c = monitor_shape - tr, tc = template_shape - - rx_new = rx - float((n_pixels_r - tr) / 2) - cx_new = cx - float((n_pixels_c - tc) / 2) - - return rx_new, cx_new - -def lsn_coordinate_to_monitor_coordinate(lsn_coordinate, monitor_shape, stimulus_type): - - template_shape = LOCALLY_SPARSE_NOISE_DIMENSIONS[stimulus_type] - pixels_per_patch = LOCALLY_SPARSE_NOISE_PIXELS[stimulus_type] - - rx, cx = lsn_coordinate - tr, tc = template_shape - - return map_template_coordinate_to_monitor_coordinate((rx*pixels_per_patch, cx*pixels_per_patch), - monitor_shape, - (tr*pixels_per_patch, tc*pixels_per_patch)) - -def monitor_coordinate_to_lsn_coordinate(monitor_coordinate, monitor_shape, stimulus_type): - - pixels_per_patch = LOCALLY_SPARSE_NOISE_PIXELS[stimulus_type] - tr, tc = LOCALLY_SPARSE_NOISE_DIMENSIONS[stimulus_type] - - rx, cx = map_monitor_coordinate_to_template_coordinate(monitor_coordinate, monitor_shape, (tr*pixels_per_patch, tc*pixels_per_patch)) - - return (rx/pixels_per_patch, cx/pixels_per_patch) - -def natural_scene_coordinate_to_monitor_coordinate(natural_scene_coordinate, monitor_shape): - - return map_template_coordinate_to_monitor_coordinate(natural_scene_coordinate, monitor_shape, NATURAL_SCENES_PIXELS) - -def natural_movie_coordinate_to_monitor_coordinate(natural_movie_coordinate, monitor_shape): - - local_y = 1.*NATURAL_MOVIE_PIXELS[0]*natural_movie_coordinate[0]/NATURAL_MOVIE_DIMENSIONS[0] - local_x = 1. * NATURAL_MOVIE_PIXELS[1] * natural_movie_coordinate[1] / NATURAL_MOVIE_DIMENSIONS[1] - - return map_template_coordinate_to_monitor_coordinate((local_y, local_x), monitor_shape, NATURAL_MOVIE_PIXELS) - -def map_stimulus_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape, stimulus_type): - - if stimulus_type in LOCALLY_SPARSE_NOISE_STIMULUS_TYPES: - return lsn_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape, stimulus_type) - elif stimulus_type in NATURAL_MOVIE_STIMULUS_TYPES: - return natural_movie_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape) - elif stimulus_type == NATURAL_SCENES: - return natural_scene_coordinate_to_monitor_coordinate(template_coordinate, monitor_shape) - elif stimulus_type in [DRIFTING_GRATINGS, STATIC_GRATINGS, SPONTANEOUS_ACTIVITY]: - return template_coordinate - else: - raise NotImplementedError # pragma: no cover - -def monitor_coordinate_to_natural_movie_coordinate(monitor_coordinate, monitor_shape): - - local_y, local_x = map_monitor_coordinate_to_template_coordinate(monitor_coordinate, monitor_shape, NATURAL_MOVIE_PIXELS) - - return float(NATURAL_MOVIE_DIMENSIONS[0])*local_y/NATURAL_MOVIE_PIXELS[0], float(NATURAL_MOVIE_DIMENSIONS[1])*local_x/NATURAL_MOVIE_PIXELS[1] - -def map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, monitor_shape, stimulus_type): - - if stimulus_type in LOCALLY_SPARSE_NOISE_STIMULUS_TYPES: - return monitor_coordinate_to_lsn_coordinate(monitor_coordinate, monitor_shape, stimulus_type) - elif stimulus_type == NATURAL_SCENES: - return map_monitor_coordinate_to_template_coordinate(monitor_coordinate, monitor_shape, NATURAL_SCENES_PIXELS) - elif stimulus_type in NATURAL_MOVIE_STIMULUS_TYPES: - return monitor_coordinate_to_natural_movie_coordinate(monitor_coordinate, monitor_shape) - elif stimulus_type in [DRIFTING_GRATINGS, STATIC_GRATINGS, SPONTANEOUS_ACTIVITY]: - return monitor_coordinate - else: - raise NotImplementedError # pragma: no cover - -def map_stimulus(source_stimulus_coordinate, source_stimulus_type, target_stimulus_type, monitor_shape): - mc = map_stimulus_coordinate_to_monitor_coordinate(source_stimulus_coordinate, monitor_shape, source_stimulus_type) - return map_monitor_coordinate_to_stimulus_coordinate(mc, monitor_shape, target_stimulus_type) - -def translate_image_and_fill(img, translation=(0,0)): - # first coordinate is horizontal, second is vertical - - roll = (int(translation[0]), -int(translation[1])) - - im2 = np.roll(img, roll, (1,0)) - - if roll[1] >= 0: - im2[:roll[1],:] = STIMULUS_GRAY - else: - im2[roll[1]:,:] = STIMULUS_GRAY - - if roll[0] >= 0: - im2[:,:roll[0]] = STIMULUS_GRAY - else: - im2[:,roll[0]:] = STIMULUS_GRAY - - return im2 - -class Monitor(object): - - def __init__(self, n_pixels_r, n_pixels_c, panel_size, spatial_unit): - - self.spatial_unit = spatial_unit - if spatial_unit == 'cm': - self.spatial_conversion_factor = 1. - else: - raise NotImplementedError # pragma: no cover - - self._panel_size = panel_size - self.n_pixels_r = n_pixels_r - self.n_pixels_c = n_pixels_c - self._mask = None - - @property - def mask(self): - if self._mask is None: - self._mask = self.get_mask() - return self._mask - - @property - def panel_size(self): - return self._panel_size*self.spatial_conversion_factor - - @property - def aspect_ratio(self): - return float(self.n_pixels_c)/self.n_pixels_r - - @property - def height(self): - return self.spatial_conversion_factor*np.sqrt(self.panel_size**2/(1+self.aspect_ratio**2)) - - @property - def width(self): - return self.height*self.aspect_ratio - - def set_spatial_unit(self, new_unit): - if new_unit == self.spatial_unit: - pass - elif new_unit == 'inch' and self.spatial_unit == 'cm': - self.spatial_conversion_factor *= .393701 - elif new_unit == 'cm' and self.spatial_unit == 'inch': - self.spatial_conversion_factor *= 1./.393701 - else: - raise NotImplementedError # pragma: no cover - self.spatial_unit = new_unit - - @property - def pixel_size(self): - return float(self.width)/self.n_pixels_c - - def pixels_to_visual_degrees(self, n, distance_from_monitor, small_angle_approximation=True): - - - if small_angle_approximation == True: - return n*self.pixel_size/distance_from_monitor*RADIANS_TO_DEGREES # radians to degrees - else: - return 2*np.arctan(n*1./2*self.pixel_size / distance_from_monitor) * RADIANS_TO_DEGREES # radians to degrees - - def visual_degrees_to_pixels(self, vd, distance_from_monitor, small_angle_approximation=True): - - if small_angle_approximation == True: - return vd*(distance_from_monitor/self.pixel_size/RADIANS_TO_DEGREES) - else: - raise NotImplementedError - - - def lsn_image_to_screen(self, img, stimulus_type, origin='lower', background_color=STIMULUS_GRAY, translation=(0,0)): - - # assert img.dtype == np.uint8 - - - full_image = np.full((self.n_pixels_r, self.n_pixels_c), background_color, dtype=np.uint8) - - pixels_per_patch = float(LOCALLY_SPARSE_NOISE_PIXELS[stimulus_type]) - target_size = tuple( int(pixels_per_patch * dimsize) for dimsize in img.shape[::-1] ) - img_full_res = np.array(Image.fromarray(img).resize(target_size, 0)) # 0 -> nearest neighbor interpolator - - mr, mc = lsn_coordinate_to_monitor_coordinate((0, 0), (self.n_pixels_r, self.n_pixels_c), stimulus_type) - Mr, Mc = lsn_coordinate_to_monitor_coordinate(img.shape, (self.n_pixels_r, self.n_pixels_c), stimulus_type) - full_image[int(mr):int(Mr), int(mc):int(Mc)] = img_full_res - - full_image = translate_image_and_fill(full_image, translation=translation) - - if origin == 'lower': - return full_image - elif origin == 'upper': - return np.flipud(full_image) - else: - raise Exception - - return full_image - - def natural_scene_image_to_screen(self, img, origin='lower', translation=(0,0)): - - # assert img.dtype == np.float32 - # img = img.astype(np.uint8) - - full_image = np.full((self.n_pixels_r, self.n_pixels_c), 127, dtype=np.uint8) - mr, mc = natural_scene_coordinate_to_monitor_coordinate((0, 0), (self.n_pixels_r, self.n_pixels_c)) - Mr, Mc = natural_scene_coordinate_to_monitor_coordinate((img.shape[0], img.shape[1]), (self.n_pixels_r, self.n_pixels_c)) - full_image[int(mr):int(Mr), int(mc):int(Mc)] = img - - full_image = translate_image_and_fill(full_image, translation=translation) - - - if origin == 'lower': - return np.flipud(full_image) - elif origin == 'upper': - return full_image - else: - raise Exception - - def natural_movie_image_to_screen(self, img, origin='lower', translation=(0,0)): - - img = np.array(Image.fromarray(img).resize(NATURAL_MOVIE_PIXELS[::-1], 2)).astype(np.uint8) # 2 -> bilinear interpolator - - assert img.dtype == np.uint8 - - full_image = np.full((self.n_pixels_r, self.n_pixels_c), 127, dtype=np.uint8) - mr, mc = map_template_coordinate_to_monitor_coordinate((0, 0), (self.n_pixels_r, self.n_pixels_c), NATURAL_MOVIE_PIXELS) - Mr, Mc = map_template_coordinate_to_monitor_coordinate((img.shape[0], img.shape[1]), (self.n_pixels_r, self.n_pixels_c), NATURAL_MOVIE_PIXELS) - - full_image[int(mr):int(Mr), int(mc):int(Mc)] = img - - full_image = translate_image_and_fill(full_image, translation=translation) - - if origin == 'lower': - return np.flipud(full_image) - elif origin == 'upper': - return full_image - else: - raise Exception - - def spatial_frequency_to_pix_per_cycle(self, spatial_frequency, distance_from_monitor): - - # How many cycles do I want to see post warp: - number_of_cycles = spatial_frequency*2*np.degrees(np.arctan(self.width/2./distance_from_monitor)) - - # How many pixels to I have pre-warp to place my cycles on: - _, m_col = np.where(self.mask != 0) - number_of_pixels = (m_col.max() - m_col.min()) - - return float(number_of_pixels)/number_of_cycles - - - def grating_to_screen(self, phase, spatial_frequency, orientation, distance_from_monitor, p2p_amp=256, baseline=127, translation=(0,0)): - - pix_per_cycle = self.spatial_frequency_to_pix_per_cycle(spatial_frequency, distance_from_monitor) - - full_image = get_spatial_grating(height=self.n_pixels_r, - aspect_ratio=self.aspect_ratio, - ori=orientation, - pix_per_cycle=pix_per_cycle, - phase=phase, - p2p_amp=p2p_amp, - baseline=baseline) - - full_image = translate_image_and_fill(full_image, translation=translation) - - return full_image - - def get_mask(self): - - mask = make_display_mask(display_shape=(self.n_pixels_c, self.n_pixels_r)).T - assert mask.shape[0] == self.n_pixels_r - assert mask.shape[1] == self.n_pixels_c - - return mask - - def show_image(self, img, ax=None, show=True, mask=False, warp=False, origin='lower'): - import matplotlib.pyplot as plt - assert img.shape == (self.n_pixels_r, self.n_pixels_c) or img.shape == (self.n_pixels_r, self.n_pixels_c, 4) - - if ax is None: - fig, ax = plt.subplots(1, 1) - - if warp == True: - img = self.warp_image(img) - - if warp == True: - assert mask == False - - ax.imshow(img, origin=origin, cmap=plt.cm.gray, interpolation='none') - - if mask == True: - mask = make_display_mask(display_shape=(self.n_pixels_c, self.n_pixels_r)).T - alpha_mask = np.zeros((mask.shape[0], mask.shape[1], 4)) - alpha_mask[:, :, 2] = 1 - mask - alpha_mask[:, :, 3] = .4 - ax.imshow(alpha_mask, origin=origin, interpolation='none') - - ax.axes.get_xaxis().set_visible(False) - ax.axes.get_yaxis().set_visible(False) - - if origin == 'upper': - ax.set_ylim((img.shape[0], 0)) - elif origin == 'lower': - ax.set_ylim((0, img.shape[0])) - else: - raise Exception - ax.set_xlim((0, img.shape[1])) - - if show == True: - plt.show() - - def map_stimulus(self, source_stimulus_coordinate, source_stimulus_type, target_stimulus_type): - monitor_shape = (self.n_pixels_r, self.n_pixels_c) - return map_stimulus(source_stimulus_coordinate, source_stimulus_type, target_stimulus_type, monitor_shape) - -class ExperimentGeometry(object): - - def __init__(self, distance, mon_height_cm, mon_width_cm, mon_res, eyepoint): - - self.distance = distance - self.mon_height_cm = mon_height_cm - self.mon_width_cm = mon_width_cm - self.mon_res = mon_res - self.eyepoint = eyepoint - - self._warp_coordinates = None - - @property - def warp_coordinates(self): - if self._warp_coordinates is None: - self._warp_coordinates = self.generate_warp_coordinates() - - return self._warp_coordinates - - def generate_warp_coordinates(self): - - display_shape=self.mon_res - x = np.array(range(display_shape[0])) - display_shape[0] / 2 - y = np.array(range(display_shape[1])) - display_shape[1] / 2 - display_coords = np.array(list(itertools.product(y, x))) - - warp_coorinates = warp_stimulus_coords(display_coords, - distance=self.distance, - mon_height_cm=self.mon_height_cm, - mon_width_cm=self.mon_width_cm, - mon_res=self.mon_res, - eyepoint=self.eyepoint) - - warp_coorinates[:, 0] += display_shape[1] / 2 - warp_coorinates[:, 1] += display_shape[0] / 2 - - return warp_coorinates - -class BrainObservatoryMonitor(Monitor): - ''' - http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf - https://www.cnet.com/products/asus-pa248q/specs/ - ''' - - def __init__(self, experiment_geometry=None): - - height, width = MONITOR_DIMENSIONS - - super(BrainObservatoryMonitor, self).__init__(height, width, 61.214, 'cm') - - if experiment_geometry is None: - self.experiment_geometry = ExperimentGeometry(distance=float(MONITOR_DISTANCE), mon_height_cm=self.height, mon_width_cm=self.width, mon_res=(self.n_pixels_c, self.n_pixels_r), eyepoint=(0.5, 0.5)) - else: - self.experiment_geometry = experiment_geometry - - def lsn_image_to_screen(self, img, **kwargs): - - if img.shape == tuple(LOCALLY_SPARSE_NOISE_DIMENSIONS[LOCALLY_SPARSE_NOISE]): - return super(BrainObservatoryMonitor, self).lsn_image_to_screen(img, LOCALLY_SPARSE_NOISE, **kwargs) - elif img.shape == tuple(LOCALLY_SPARSE_NOISE_DIMENSIONS[LOCALLY_SPARSE_NOISE_4DEG]): - return super(BrainObservatoryMonitor, self).lsn_image_to_screen(img, LOCALLY_SPARSE_NOISE_4DEG, **kwargs) - elif img.shape == tuple(LOCALLY_SPARSE_NOISE_DIMENSIONS[LOCALLY_SPARSE_NOISE_8DEG]): - return super(BrainObservatoryMonitor, self).lsn_image_to_screen(img, LOCALLY_SPARSE_NOISE_8DEG, **kwargs) - else: # pragma: no cover - raise RuntimeError # pragma: no cover - - def warp_image(self, img, **kwargs): - - assert img.shape == (self.n_pixels_r, self.n_pixels_c) - assert self.spatial_unit == 'cm' - - return spndi.map_coordinates(img, self.experiment_geometry.warp_coordinates.T).reshape((self.n_pixels_r, self.n_pixels_c)) - - def grating_to_screen(self, phase, spatial_frequency, orientation, **kwargs): - - return super(BrainObservatoryMonitor, self).grating_to_screen(phase, spatial_frequency, orientation, - self.experiment_geometry.distance, - p2p_amp = 256, baseline = 127, **kwargs) - - def pixels_to_visual_degrees(self, n, **kwargs): - - return super(BrainObservatoryMonitor, self).pixels_to_visual_degrees(n, self.experiment_geometry.distance, **kwargs) - - def visual_degrees_to_pixels(self, vd, **kwargs): - - return super(BrainObservatoryMonitor, self).visual_degrees_to_pixels(vd, self.experiment_geometry.distance, **kwargs) - -def warp_stimulus_coords(vertices, - distance=15.0, - mon_height_cm=32.5, - mon_width_cm=51.0, - mon_res=(1920, 1200), - eyepoint=(0.5, 0.5)): - ''' - For a list of screen vertices, provides a corresponding list of texture coordinates. - - Parameters - ---------- - vertices: numpy.ndarray - [[x0,y0], [x1,y1], ...] A set of vertices to convert to texture positions. - distance: float - distance from the monitor in cm. - mon_height_cm: float - monitor height in cm - mon_width_cm: float - monitor width in cm - mon_res: tuple - monitor resolution (x,y) - eyepoint: tuple - - Returns - ------- - np.ndarray - x,y coordinates shaped like the input that describe what pixel coordinates - are displayed an the input coordinates after warping the stimulus. - - ''' - - mon_width_cm = float(mon_width_cm) - mon_height_cm = float(mon_height_cm) - distance = float(distance) - mon_res_x, mon_res_y = float(mon_res[0]), float(mon_res[1]) - - vertices = vertices.astype(np.float) - - # from pixels (-1920/2 -> 1920/2) to stimulus space (-0.5->0.5) - vertices[:, 0] = vertices[:, 0] / mon_res_x - vertices[:, 1] = vertices[:, 1] / mon_res_y - - x = (vertices[:, 0] + 0.5) * mon_width_cm - y = (vertices[:, 1] + 0.5) * mon_height_cm - - xEye = eyepoint[0] * mon_width_cm - yEye = eyepoint[1] * mon_height_cm - - x = x - xEye - y = y - yEye - - r = np.sqrt(np.square(x) + np.square(y) + np.square(distance)) - - azimuth = np.arctan(x / distance) - altitude = np.arcsin(y / r) - - # calculate the texture coordinates - tx = distance * (1 + x / r) - distance - ty = distance * (1 + y / r) - distance - - # prevent div0 - azimuth[azimuth == 0] = np.finfo(np.float32).eps - altitude[altitude == 0] = np.finfo(np.float32).eps - - # the texture coordinates (which are now lying on the sphere) - # need to be remapped back onto the plane of the display. - # This effectively stretches the coordinates away from the eyepoint. - - centralAngle = np.arccos(np.cos(altitude) * np.cos(np.abs(azimuth))) - # distance from eyepoint to texture vertex - arcLength = centralAngle * distance - # remap the texture coordinate - theta = np.arctan2(ty, tx) - tx = arcLength * np.cos(theta) - ty = arcLength * np.sin(theta) - - u_coords = tx / mon_width_cm - v_coords = ty / mon_height_cm - - retCoords = np.column_stack((u_coords, v_coords)) - - # back to pixels - retCoords[:, 0] = retCoords[:, 0] * mon_res_x - retCoords[:, 1] = retCoords[:, 1] * mon_res_y - - return retCoords - - -def make_display_mask(display_shape=(1920, 1200)): - ''' Build a display-shaped mask that indicates which pixels are on screen after warping the stimulus. ''' - x = np.array(range(display_shape[0])) - display_shape[0] / 2 - y = np.array(range(display_shape[1])) - display_shape[1] / 2 - display_coords = np.array(list(itertools.product(x, y))) - - warped_coords = warp_stimulus_coords(display_coords).astype(int) - - off_warped_coords = np.array([warped_coords[:, 0] + display_shape[0] / 2, - warped_coords[:, 1] + display_shape[1] / 2]) - - used_coords = set() - for i in range(off_warped_coords.shape[1]): - used_coords.add((off_warped_coords[0, i], off_warped_coords[1, i])) - - used_coords = (np.array([x for (x, y) in used_coords]).astype(int), - np.array([y for (x, y) in used_coords]).astype(int)) - - mask = np.zeros(display_shape) - - mask[used_coords] = 1 - - return mask - - -def mask_stimulus_template(template_display_coords, template_shape, display_mask=None, threshold=1.0): - ''' Build a mask for a stimulus template of a given shape and display coordinates that indicates - which part of the template is on screen after warping. - - Parameters - ---------- - template_display_coords: list - list of (x,y) display coordinates - - template_shape: tuple - (width,height) of the display template - - display_mask: np.ndarray - boolean 2D mask indicating which display coordinates are on screen after warping. - - threshold: float - Fraction of pixels associated with a template display coordinate that should remain - on screen to count as belonging to the mask. - - Returns - ------- - tuple: (template mask, pixel fraction) - ''' - if display_mask is None: - display_mask = make_display_mask() - - frac = np.zeros(template_shape) - mask = np.zeros(template_shape, dtype=bool) - for y in range(template_shape[1]): - for x in range(template_shape[0]): - tdcm = np.where((template_display_coords[0, :, :] == x) & ( - template_display_coords[1, :, :] == y)) - v = display_mask[tdcm] - f = np.sum(v) / len(v) - frac[x, y] = f - mask[x, y] = f >= threshold - - return mask, frac diff --git a/allensdk/brain_observatory/sync_dataset.py b/allensdk/brain_observatory/sync_dataset.py deleted file mode 100644 index 9f1b9d259e..0000000000 --- a/allensdk/brain_observatory/sync_dataset.py +++ /dev/null @@ -1,853 +0,0 @@ -""" -dataset.py - -Dataset object for loading and unpacking an HDF5 dataset generated by - sync.py - -@author: derricw - -Allen Institute for Brain Science - -Dependencies ------------- -numpy http://www.numpy.org/ -h5py http://www.h5py.org/ - -""" -import collections -from typing import Union, Sequence, Optional - -import h5py as h5 -import numpy as np - -import warnings -import logging -logger = logging.getLogger(__name__) - -dset_version = 1.04 - - -def unpack_uint32(uint32_array, endian='L'): - """ - Unpacks an array of 32-bit unsigned integers into bits. - - Default is least significant bit first. - - *Not currently used by sync dataset because get_bit is better and does - basically the same thing. I'm just leaving it in because it could - potentially account for endianness and possibly have other uses in - the future. - - """ - if not uint32_array.dtype == np.uint32: - raise TypeError("Must be uint32 ndarray.") - buff = np.getbuffer(uint32_array) - uint8_array = np.frombuffer(buff, dtype=np.uint8) - uint8_array = np.fliplr(uint8_array.reshape(-1, 4)) - bits = np.unpackbits(uint8_array).reshape(-1, 32) - if endian.upper() == 'B': - bits = np.fliplr(bits) - return bits - - -def get_bit(uint_array, bit): - """ - Returns a bool array for a specific bit in a uint ndarray. - - Parameters - ---------- - uint_array : (numpy.ndarray) - The array to extract bits from. - bit : (int) - The bit to extract. - - """ - return np.bitwise_and(uint_array, 2 ** bit).astype(bool).astype(np.uint8) - - -class Dataset(object): - """ - A sync dataset. Contains methods for loading - and parsing the binary data. - - Parameters - ---------- - path : str - Path to HDF5 file. - - Examples - -------- - >>> dset = Dataset('my_h5_file.h5') - >>> logger.info(dset.meta_data) - >>> dset.stats() - >>> dset.close() - - >>> with Dataset('my_h5_file.h5') as d: - ... logger.info(dset.meta_data) - ... dset.stats() - - The sync file documentation from MPE can be found at - sharepoint > Instrumentation > Shared Documents > Sync_line_labels_discussion_2020-01-27-.xlsx # NOQA E501 - Direct link: - https://alleninstitute.sharepoint.com/:x:/s/Instrumentation/ES2bi1xJ3E9NupX-zQeXTlYBS2mVVySycfbCQhsD_jPMUw?e=Z9jCwH - - - """ - FRAME_KEYS = ('frames', 'stim_vsync') - PHOTODIODE_KEYS = ('photodiode', 'stim_photodiode') - OPTOGENETIC_STIMULATION_KEYS = ("LED_sync", "opto_trial") - EYE_TRACKING_KEYS = ("eye_frame_received", # Expected eye tracking - # line label after 3/27/2020 - # clocks eye tracking frame pulses (port 0, line 9) - "cam2_exposure", - # previous line label for eye tracking - # (prior to ~ Oct. 2018) - "eyetracking", - "eye_tracking") # An undocumented, but possible eye tracking line label # NOQA E114 - BEHAVIOR_TRACKING_KEYS = ("beh_frame_received", # Expected behavior line label after 3/27/2020 # NOQA E127 - # clocks behavior tracking frame # NOQA E127 - # pulses (port 0, line 8) - "cam1_exposure", - "behavior_monitoring") - - DEPRECATED_KEYS = set() - - def __init__(self, path): - self.dfile = self.load(path) - self._check_line_labels() - - def _check_line_labels(self): - if hasattr(self, "line_labels"): - deprecated_keys = set(self.line_labels) & self.DEPRECATED_KEYS - if deprecated_keys: - warnings.warn((f"The loaded sync file contains the " - f"following deprecated line label keys: " - f"{deprecated_keys}. Consider updating the " - f"sync file line labels."), stacklevel=2) - else: - warnings.warn(("The loaded sync file has no line labels and may " - "not be valid."), stacklevel=2) - - def _process_times(self): - """ - Preprocesses the time array to account for rollovers. - This is only relevant for event-based sampling. - - """ - times = self.get_all_events()[:, 0:1].astype(np.int64) - - intervals = np.ediff1d(times, to_begin=0) - rollovers = np.where(intervals < 0)[0] - - for i in rollovers: - times[i:] += 4294967296 - - return times - - def load(self, path): - """ - Loads an hdf5 sync dataset. - - Parameters - ---------- - path : str - Path to hdf5 file. - - """ - self.dfile = h5.File( - path, 'r') # MG edit 3/15 removed 'r' because some sync files were unable to load # NOQA E501 - self.meta_data = eval(self.dfile['meta'][()]) - self.line_labels = self.meta_data['line_labels'] - self.times = self._process_times() - return self.dfile - - @property - def sample_freq(self): - try: - return float(self.meta_data['ni_daq']['sample_freq']) - except KeyError: - return float(self.meta_data['ni_daq']['counter_output_freq']) - - def get_bit(self, bit): - """ - Returns the values for a specific bit. - - Parameters - ---------- - bit : int - Bit to return. - """ - return get_bit(self.get_all_bits(), bit) - - def get_line(self, line): - """ - Returns the values for a specific line. - - Parameters - ---------- - line : str - Line to return. - - """ - bit = self._line_to_bit(line) - return self.get_bit(bit) - - def get_bit_changes(self, bit): - """ - Returns the first derivative of a specific bit. - Data points are 1 on rising edges and 255 on falling edges. - - Parameters - ---------- - bit : int - Bit for which to return changes. - - """ - bit_array = self.get_bit(bit) - return np.ediff1d(bit_array, to_begin=0) - - def get_line_changes(self, line): - """ - Returns the first derivative of a specific line. - Data points are 1 on rising edges and 255 on falling edges. - - Parameters - ---------- - line : (str) - Line name for which to return changes. - - """ - bit = self._line_to_bit(line) - return self.get_bit_changes(bit) - - def get_all_bits(self): - """ - Returns the data for all bits. - - """ - return self.dfile['data'][()][:, -1] - - def get_all_times(self, units='samples'): - """ - Returns all counter values. - - Parameters - ---------- - units : str - Return times in 'samples' or 'seconds' - - """ - if self.meta_data['ni_daq']['counter_bits'] == 32: - times = self.get_all_events()[:, 0] - else: - times = self.times - units = units.lower() - if units == 'samples': - return times - elif units in ['seconds', 'sec', 'secs']: - freq = self.sample_freq - return times / freq - else: - raise ValueError("Only 'samples' or 'seconds' are valid units.") - - def get_all_events(self): - """ - Returns all counter values and their cooresponding IO state. - """ - return self.dfile['data'][()] - - def get_events_by_bit(self, bit, units='samples'): - """ - Returns all counter values for transitions (both rising and falling) - for a specific bit. - - Parameters - ---------- - bit : int - Bit for which to return events. - - """ - changes = self.get_bit_changes(bit) - return self.get_all_times(units)[np.where(changes != 0)] - - def get_events_by_line(self, line, units='samples'): - """ - Returns all counter values for transitions (both rising and falling) - for a specific line. - - Parameters - ---------- - line : str - Line for which to return events. - - """ - line = self._line_to_bit(line) - return self.get_events_by_bit(line, units) - - def _line_to_bit(self, line): - """ - Returns the bit for a specified line. Either line name and number is - accepted. - - Parameters - ---------- - line : str - Line name for which to return corresponding bit. - - """ - if type(line) is int: - return line - elif type(line) is str: - return self.line_labels.index(line) - else: - raise TypeError("Incorrect line type. Try a str or int.") - - def _bit_to_line(self, bit): - """ - Returns the line name for a specified bit. - - Parameters - ---------- - bit : int - Bit for which to return the corresponding line name. - """ - return self.line_labels[bit] - - def get_rising_edges(self, line, units='samples'): - """ - Returns the counter values for the rizing edges for a specific bit or - line. - - Parameters - ---------- - line : str - Line for which to return edges. - - """ - bit = self._line_to_bit(line) - changes = self.get_bit_changes(bit) - return self.get_all_times(units)[np.where(changes == 1)] - - def get_edges( - self, - kind: str, - keys: Union[str, Sequence[str]], - units: str = "seconds", - permissive: bool = False - ) -> Optional[np.ndarray]: - """ Utility function for extracting edge times from a line - - Parameters - ---------- - kind : One of "rising", "falling", or "all". Should this method return - timestamps for rising, falling or both edges on the appropriate - line - keys : These will be checked in sequence. Timestamps will be returned - for the first which is present in the line labels - units : one of "seconds", "samples", or "indices". The returned - "time"stamps will be given in these units. - raise_missing : If True and no matching line is found, a KeyError will - be raised - - Returns - ------- - An array of edge times. If raise_missing is False and none of the keys - were found, returns None. - - Raises - ------ - KeyError : none of the provided keys were found among this dataset's - line labels - - """ - if kind == 'falling': - fn = self.get_falling_edges - elif kind == 'rising': - fn = self.get_rising_edges - elif kind == 'all': - return np.sort(np.concatenate([ - self.get_edges('rising', keys, units), - self.get_edges('falling', keys, units) - ])) - - if isinstance(keys, str): - keys = [keys] - - for key in keys: - try: - return fn(key, units) - except ValueError: - continue - - if not permissive: - raise KeyError( - f"none of {keys} were found in this dataset's line labels") - - def get_falling_edges(self, line, units='samples'): - """ - Returns the counter values for the falling edges for a specific bit - or line. - - Parameters - ---------- - line : str - Line for which to return edges. - - """ - bit = self._line_to_bit(line) - changes = self.get_bit_changes(bit) - return self.get_all_times(units)[np.where(changes == 255)] - - def get_nearest(self, - source, - target, - source_edge="rising", - target_edge="rising", - direction="previous", - units='indices', - ): - """ - For all values of the source line, finds the nearest edge from the - target line. - - By default, returns the indices of the target edges. - - Args: - source (str, int): desired source line - target (str, int): desired target line - source_edge [Optional(str)]: "rising" or "falling" source edges - target_edge [Optional(str): "rising" or "falling" target edges - direction (str): "previous" or "next". Whether to prefer the - previous edge or the following edge. - units (str): "indices" - - """ - source_edges = getattr(self, - "get_{}_edges".format(source_edge.lower()))(source.lower(), units="samples") # NOQA E501 - target_edges = getattr(self, - "get_{}_edges".format(target_edge.lower()))(target.lower(), units="samples") # NOQA E501 - indices = np.searchsorted(target_edges, source_edges, side="right") - if direction.lower() == "previous": - indices[np.where(indices != 0)] -= 1 - elif direction.lower() == "next": - indices[np.where(indices == len(target_edges))] = -1 - if units in ["indices", 'index']: - return indices - elif units == "samples": - return target_edges[indices] - elif units in ['sec', 'seconds', 'second']: - return target_edges[indices] / self.sample_freq - else: - raise KeyError( - "Invalid units. Try 'seconds', 'samples' or 'indices'") - - def get_analog_channel(self, - channel, - start_time=0.0, - stop_time=None, - downsample=1): - """ - Returns the data from the specified analog channel between the - timepoints. - - Args: - channel (int, str): desired channel index or label - start_time (Optional[float]): start time in seconds - stop_time (Optional[float]): stop time in seconds - downsample (Optional[int]): downsample factor - - Returns: - ndarray: slice of data for specified channel - - Raises: - KeyError: no analog data present - - """ - if isinstance(channel, str): - channel_index = self.analog_meta_data['analog_labels'].index( - channel) - channel = self.analog_meta_data['analog_channels'].index( - channel_index) - - if "analog_data" in self.dfile.keys(): - dset = self.dfile['analog_data'] - analog_meta = self.get_analog_meta() - sample_rate = analog_meta['analog_sample_rate'] - start = int(start_time * sample_rate) - if stop_time: - stop = int(stop_time * sample_rate) - return dset[start:stop:downsample, channel] - else: - return dset[start::downsample, channel] - else: - raise KeyError("No analog data was saved.") - - def get_analog_meta(self): - """ - Returns the metadata for the analog data. - """ - if "analog_meta" in self.dfile.keys(): - return eval(self.dfile['analog_meta'].value) - else: - raise KeyError("No analog data was saved.") - - @property - def analog_meta_data(self): - return self.get_analog_meta() - - def line_stats(self, line, print_results=True): - """ - Quick-and-dirty analysis of a bit. - - ##TODO: Split this up into smaller functions. - - """ - # convert to bit - bit = self._line_to_bit(line) - - # get the bit's data - bit_data = self.get_bit(bit) - total_data_points = len(bit_data) - - # get the events - events = self.get_events_by_bit(bit) - total_events = len(events) - - # get the rising edges - rising = self.get_rising_edges(bit) - total_rising = len(rising) - - # get falling edges - falling = self.get_falling_edges(bit) - total_falling = len(falling) - - if total_events <= 0: - if print_results: - logger.info("*" * 70) - logger.info("No events on line: %s" % line) - logger.info("*" * 70) - return None - elif total_events <= 10: - if print_results: - logger.info("*" * 70) - logger.info("Sparse events on line: %s" % line) - logger.info("Rising: %s" % total_rising) - logger.info("Falling: %s" % total_falling) - logger.info("*" * 70) - return { - 'line': line, - 'bit': bit, - 'total_rising': total_rising, - 'total_falling': total_falling, - 'avg_freq': None, - 'duty_cycle': None, - } - else: - - # period - period = self.period(line) - - avg_period = period['avg'] - max_period = period['max'] - min_period = period['min'] - period_sd = period['sd'] - - # freq - avg_freq = self.frequency(line) - - # duty cycle - duty_cycle = self.duty_cycle(line) - - if print_results: - logger.info("*" * 70) - - logger.info("Quick stats for line: %s" % line) - logger.info("Bit: %i" % bit) - logger.info("Data points: %i" % total_data_points) - logger.info("Total transitions: %i" % total_events) - logger.info("Rising edges: %i" % total_rising) - logger.info("Falling edges: %i" % total_falling) - logger.info("Average period: %s" % avg_period) - logger.info("Minimum period: %s" % min_period) - logger.info("Max period: %s" % max_period) - logger.info("Period SD: %s" % period_sd) - logger.info("Average freq: %s" % avg_freq) - logger.info("Duty cycle: %s" % duty_cycle) - - logger.info("*" * 70) - - return { - 'line': line, - 'bit': bit, - 'total_data_points': total_data_points, - 'total_events': total_events, - 'total_rising': total_rising, - 'total_falling': total_falling, - 'avg_period': avg_period, - 'min_period': min_period, - 'max_period': max_period, - 'period_sd': period_sd, - 'avg_freq': avg_freq, - 'duty_cycle': duty_cycle, - } - - def period(self, line, edge="rising"): - """ - Returns a dictionary with avg, min, max, and st of period for a line. - """ - bit = self._line_to_bit(line) - - if edge.lower() == "rising": - edges = self.get_rising_edges(bit) - elif edge.lower() == "falling": - edges = self.get_falling_edges(bit) - - if len(edges) > 2: - - timebase_freq = self.meta_data['ni_daq']['counter_output_freq'] - avg_period = np.mean(np.ediff1d(edges[1:])) / timebase_freq - max_period = np.max(np.ediff1d(edges[1:])) / timebase_freq - min_period = np.min(np.ediff1d(edges[1:])) / timebase_freq - period_sd = np.std(avg_period) - - else: - raise IndexError("Not enough edges for period: %i" % len(edges)) - - return { - 'avg': avg_period, - 'max': max_period, - 'min': min_period, - 'sd': period_sd, - } - - def frequency(self, line, edge="rising"): - """ - Returns the average frequency of a line. - """ - - period = self.period(line, edge) - return 1.0 / period['avg'] - - def duty_cycle(self, line): - """ - Doesn't work right now. Freezes python for some reason. - - Returns the duty cycle of a line. - - """ - return "fix me" - bit = self._line_to_bit(line) - - rising = self.get_rising_edges(bit) - falling = self.get_falling_edges(bit) - - total_rising = len(rising) - total_falling = len(falling) - - if total_rising > total_falling: - rising = rising[:total_falling] - elif total_rising < total_falling: - falling = falling[:total_rising] - else: - pass - - if rising[0] < falling[0]: - # line starts low - high = falling - rising - else: - # line starts high - high = np.concatenate(falling, self.get_all_events()[-1, 0]) - \ - np.concatenate(0, rising) - - total_high_time = np.sum(high) - all_events = self.get_events_by_bit(bit) - total_time = all_events[-1] - all_events[0] - return 1.0 * total_high_time / total_time - - def stats(self): - """ - Quick-and-dirty analysis of all bits. Prints a few things about each - bit where events are found. - """ - bits = [] - for i in range(32): - bits.append(self.line_stats(i, print_results=False)) - active_bits = [x for x in bits if x is not None] - logger.info("Active bits: ", len(active_bits)) - for bit in active_bits: - logger.info("*" * 70) - logger.info("Bit: %i" % bit['bit']) - logger.info("Label: %s" % self.line_labels[bit['bit']]) - logger.info("Rising edges: %i" % bit['total_rising']) - logger.info("Falling edges: %i" % bit["total_falling"]) - logger.info("Average freq: %s" % bit['avg_freq']) - logger.info("Duty cycle: %s" % bit['duty_cycle']) - logger.info("*" * 70) - return active_bits - - def plot_all(self, - start_time, - stop_time, - auto_show=True, - ): - """ - Plot all active bits. - - Yikes. Come up with a better way to show this. - - """ - import matplotlib.pyplot as plt - for bit in range(32): - if len(self.get_events_by_bit(bit)) > 0: - self.plot_bit(bit, - start_time, - stop_time, - auto_show=False, ) - if auto_show: - plt.show() - - def plot_bits(self, - bits, - start_time=0.0, - end_time=None, - auto_show=True, - ): - """ - Plots a list of bits. - """ - import matplotlib.pyplot as plt - - subplots = len(bits) - f, axes = plt.subplots(subplots, sharex=True, sharey=True) - if not isinstance(axes, collections.Iterable): - axes = [axes] - - for bit, ax in zip(bits, axes): - self.plot_bit(bit, - start_time, - end_time, - auto_show=False, - axes=ax) - # f.set_size_inches(18, 10, forward=True) - f.subplots_adjust(hspace=0) - - if auto_show: - plt.show() - - return f, axes - - def plot_bit(self, - bit, - start_time=0.0, - end_time=None, - auto_show=True, - axes=None, - name="", - ): - """ - Plots a specific bit at a specific time period. - """ - import matplotlib.pyplot as plt - - times = self.get_all_times(units='sec') - if not end_time: - end_time = 2 ** 32 - - window = (times < end_time) & (times > start_time) - - if axes: - ax = axes - else: - ax = plt - - if not name: - name = self._bit_to_line(bit) - if not name: - name = str(bit) - - bit = self.get_bit(bit) - ax.step(times[window], bit[window], where='post') - if hasattr(ax, "set_ylim"): - ax.set_ylim(-0.1, 1.1) - else: - axes_obj = plt.gca() - axes_obj.set_ylim(-0.1, 1.1) - # ax.set_ylabel('Logic State') - # ax.yaxis.set_ticks_position('none') - plt.setp(ax.get_yticklabels(), visible=False) - ax.set_xlabel('time (seconds)') - ax.legend([name]) - - if auto_show: - plt.show() - - return plt.gcf() - - def plot_line(self, - line, - start_time=0.0, - end_time=None, - auto_show=True, - ): - """ - Plots a specific line at a specific time period. - """ - import matplotlib.pyplot as plt - bit = self._line_to_bit(line) - self.plot_bit(bit, start_time, end_time, auto_show=False) - - # plt.legend([line]) - if auto_show: - plt.show() - - def plot_lines(self, - lines, - start_time=0.0, - end_time=None, - auto_show=True, - ): - """ - Plots specific lines at a specific time period. - """ - import matplotlib.pyplot as plt - bits = [] - for line in lines: - bits.append(self._line_to_bit(line)) - f, axes = self.plot_bits(bits, - start_time, - end_time, - auto_show=False, ) - - plt.subplots_adjust(left=0.025, right=0.975, bottom=0.05, top=0.95) - if auto_show: - plt.show() - - return f, axes - - def close(self): - """ - Closes the dataset. - """ - self.dfile.close() - - def __enter__(self): - """ - So we can use context manager (with...as) like any other open file. - - Examples - -------- - >>> with Dataset('my_data.h5') as d: - ... d.stats() - - """ - return self - - def __exit__(self, type, value, traceback): - """ - Exit statement for context manager. - """ - self.close() - - -if __name__ == '__main__': - pass diff --git a/allensdk/brain_observatory/sync_utilities/__init__.py b/allensdk/brain_observatory/sync_utilities/__init__.py deleted file mode 100644 index 8403d1c9fb..0000000000 --- a/allensdk/brain_observatory/sync_utilities/__init__.py +++ /dev/null @@ -1,65 +0,0 @@ -from pathlib import Path -from typing import Tuple - -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.sync_dataset import Dataset - - -def trim_discontiguous_times(times, threshold=100): - times = np.array(times) - intervals = np.diff(times) - - med_interval = np.median(intervals) - interval_threshold = med_interval * threshold - - gap_indices = np.where(intervals > interval_threshold)[0] - - # A special case for when the first element is a discontiguity - if np.abs(intervals[0]) > interval_threshold: - gap_indices = [0] - - if len(gap_indices) == 0: - return times - - return times[:gap_indices[0] + 1] - - -def get_synchronized_frame_times(session_sync_file: Path, - sync_line_label_keys: Tuple[str, ...], - trim_after_spike: bool = True) -> pd.Series: - """Get experimental frame times from an experiment session sync file. - - Parameters - ---------- - session_sync_file : Path - Path to an ephys session sync file. - The sync file contains rising/falling edges from a daq system which - indicates when certain events occur (so they can be related to - each other). - sync_line_label_keys : Tuple[str, ...] - Line label keys to get times for. See class attributes of - allensdk.brain_observatory.sync_dataset.Dataset for a listing of - possible keys. - trim_after_spike : bool = True - If True, will call trim_discontiguous_times on the frame times - before returning them, which will detect any spikes in the data - and remove all elements for the list which come after the spike. - - Returns - ------- - pd.Series - An array of times when frames for the eye tracking camera were acquired. - """ - sync_dataset = Dataset(str(session_sync_file)) - - frame_times = sync_dataset.get_edges( - "rising", sync_line_label_keys, units="seconds" - ) - - # Occasionally an extra set of frame times are acquired after the rest of - # the signals. We detect and remove these. - frame_times = trim_discontiguous_times(frame_times) if trim_after_spike else frame_times - - return pd.Series(frame_times) diff --git a/allensdk/brain_observatory/visualization/__init__.py b/allensdk/brain_observatory/visualization/__init__.py deleted file mode 100644 index 53bda7c47e..0000000000 --- a/allensdk/brain_observatory/visualization/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -import matplotlib.pyplot as plt - -def plot_running_speed( - timestamps, values, - start_index=0, stop_index=None, step=1, - ylabel='running speed (cm/s)', - xlabel='time (s)', - title=None -): # pragma: no cover - ''' Make a simple plot of a running speed trace - - Parameters - ---------- - timestamps : numpy.ndarray - Times at which running speed samples were collected - values : numpy.ndarray - Running speed values (by default: linear cm / s with negative values indicating backwards movement) - - ''' - - stop_index = len(timestamps) if stop_index is None else stop_index - if title is None: - title = f'running speed from {timestamps[start_index]:2.2f} to {timestamps[stop_index-1]:2.2f} seconds' - - fig, ax = plt.subplots(figsize=(8, 8)) - plt.plot( - timestamps[start_index:stop_index:step], - values[start_index:stop_index:step], - ) - - ax.set_ylabel(ylabel, fontsize=16) - ax.set_xlabel(xlabel, fontsize=16) - ax.set_title(title, fontsize=20) - plt.axis('tight') - - return fig \ No newline at end of file diff --git a/allensdk/config/__init__.py b/allensdk/config/__init__.py deleted file mode 100644 index 66d0b42cfd..0000000000 --- a/allensdk/config/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -import sys - -_console_handler = logging.StreamHandler(sys.stdout) - -def enable_console_log(level=None): - '''configure allensdk logging to output to the console. - - Parameters - ---------- - level : int - logging level 0-50 (logging.INFO, logging.DEBUG, etc.) - - Notes - ----- - See: `Logging Cookbook <https://docs.python.org/2/howto/logging-cookbook.html>`_ - ''' - - sdk_logger = logging.getLogger('allensdk') - - if level is None: - sdk_logger.setLevel(logging.DEBUG) - else: - sdk_logger.setLevel(level) - - sdk_logger.addHandler(_console_handler) \ No newline at end of file diff --git a/allensdk/config/app/__init__.py b/allensdk/config/app/__init__.py deleted file mode 100644 index 6177de1ae7..0000000000 --- a/allensdk/config/app/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -''' -allensdk.config.app is a package that assists in -configuring application software, as opposed to -domain-specific configuration. -''' diff --git a/allensdk/config/app/application_config.py b/allensdk/config/app/application_config.py deleted file mode 100644 index 0f6781e889..0000000000 --- a/allensdk/config/app/application_config.py +++ /dev/null @@ -1,367 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2014-2015. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.core.json_utilities import JsonComments -import argparse -import os -import io -import logging -import logging.config as lc -from pkg_resources import resource_filename # @UnresolvedImport - -try: - from configparser import ConfigParser # @UnresolvedImport -except: - from ConfigParser import ConfigParser # @UnresolvedImport - - -class ApplicationConfig(object): - ''' Convenience class that handles of application configuration - from environment variables, .conf files and the command line - using Python standard libraries and formats. - ''' - - _log = logging.getLogger(__name__) - _DEFAULT_LOG_CONFIG = os.getenv( - 'LOG_CFG', resource_filename(__name__, 'logging.conf')) - - def __init__(self, - defaults, - name="app", - halp="Run application.", - default_log_config=None): - - self.application_name = name - self.help = halp - self.debug_enabled = False - - if default_log_config is None: - default_log_config = ApplicationConfig._DEFAULT_LOG_CONFIG - lc.fileConfig(_DEFAULT_LOG_CONFIG) - - ApplicationConfig._log.info( - "default log config: %s" % (default_log_config)) - - self.defaults = { - 'config_file_path': { - 'default': "%s.conf" % (self.application_name), - 'help': 'configuration file path' - }, - 'log_config_path': { - 'default': default_log_config, - 'help': 'logging configuration path' - } - } - - self.defaults.update(defaults) - - logging.info("defaults: %s" % (self.defaults)) - - self.argparser = self.create_argparser() - - for key, value in self.defaults.items(): - setattr(self, key, value['default']) - - def load(self, command_line_args, disable_existing_loggers=True): - ''' Load application configuration options, first from the environment, - then from the configuration file, then from the command line. - - Each stage of loading can override the previous stage. - - Parameters - ---------- - command_line_args : dict - Parameters passed to the application. - disable_existing_loggers : boolean - Reset the logging system or not. - - Returns - ------- - fileConfig - Configuration object with all levels applied - ''' - # read and apply options from the environment - self.apply_configuration_from_environment() - - # command line so we can find the config file. - parsed_args = self.parse_command_line_args(command_line_args) - - try: - # read and apply the configuration file options - config_file_path = parsed_args.config_file_path - - if config_file_path: - self.config_file_path = config_file_path - - self.apply_configuration_from_file(self.config_file_path) - - # apply the remaining command line options - self.apply_configuration_from_command_line(parsed_args) - except Exception as e: - ApplicationConfig._log.error("Could not load configuration file: %s\n%s" % - (parsed_args.config_file_path, - e)) - raise - - if parsed_args.log_config_path: - try: - lc.fileConfig(self.log_config_path, - disable_existing_loggers=disable_existing_loggers) - except: - logging.error("Could not load log configuration file: %s" % - (parsed_args.log_config_path)) - else: - # TODO: configure default logging - pass - - def create_argparser(self): - '''Initialization for the command-line parsing stage. - - An application specific prefix is applied to argument names. - - Parameters - ---------- - prog : string - Application specific prefix for argument names. - description : string - A brief 'help' description of the application. - - Returns - ------- - argParse.ArgumentParser - The initialized argument parser object. - - Notes - ----- - Defaults are set at the first environment reading. - Command line args only override them when present - ''' - parser = argparse.ArgumentParser(prog=self.application_name, - description=self.help) - for key, value in self.defaults.items(): - if key == 'config_file_path': - parser.add_argument( - "%s" % (key), default=None, help=value['help']) - else: - parser.add_argument("--%s" % - (key), default=None, help=value['help']) - - return parser - - def parse_command_line_args(self, args): - '''Simply call the internal argparser object. - - Parameters - ---------- - args : array - Parameters passed to the application. - - Returns - ------- - Namespace - Parsed paramenters. - ''' - return self.argparser.parse_args(args) - - def apply_configuration_from_command_line(self, parsed_args): - '''Read application configuration variables from the command line. - - Unassigned variables are left unchanged if previously assigned, - set to their default values, - or None if no default is specified at init time. - Assigned variables will overwrite the previous value. - - see: https://docs.python.org/2/howto/argparse.html - - Parameters - ---------- - parsed_args : dict - the arguments as parsed from the command line. - - ''' - logging.info('command_line args: %s' % (parsed_args)) - - for key in self.defaults: - parsed_value = getattr(parsed_args, key) - if parsed_value and getattr(self, key) is None: - setattr(self, key, parsed_value) - - def apply_configuration_from_environment(self): - '''Read application configuration variables from the environment. - - The variable names are upper case and have a - prefix defined by the application. - - See: https://docs.python.org/2/library/os.html - ''' - for key in self.defaults: - environment_variable = "%s_%s" % ( - self.application_name.upper(), key.upper()) - environment_value = os.environ.get(environment_variable) - if environment_value: - setattr(self, key, environment_value) - - def from_json_file(self, json_path): - '''Read an application configuration from a JSON format file. - - Parameters - ---------- - json_path : string - Path to the JSON file. - - Returns - ------- - string - An application configuration in INI format - - ''' - description = JsonComments.read_file(json_path) - - return self.to_config_string(description) - - def from_json_string(self, json_string): - '''Read a configuration from a JSON format string. - - Parameters - ---------- - json_string : string - A JSON-formatted string containing an application configuration. - - Returns - ------- - string - An application configuration in INI format - ''' - description = JsonComments.read_string(json_string) - - return self.to_config_string(description) - - def to_config_string(self, description): - '''Create a configuration string from a dict. - - Parameters - ---------- - description : dict - Configuration options for an application. - - Returns - ------- - string - Equivalent configuration as an INI format string - - Notes - ----- - The Python configparser library natively supports this functionality in Python 3. - ''' - if 'biophys' not in description: - bps_config_string = '[biophys]\n\n' - return bps_config_string - - bps_config = description['biophys'][0] - - cfg_array = ['[biophys]'] - - if 'log_config_path' in bps_config: - cfg_array.append(str('log_config_path: %s' % - bps_config['log_config_path'])) - - if 'debug' in bps_config: - cfg_array.append(str('debug: %s' % bps_config['debug'])) - - if 'model_file' in bps_config: - cfg_array.append(str('model_file: %s' % - ','.join(bps_config['model_file']))) - - cfg_array.append("\n") - - bps_cfg_string = "\n".join(cfg_array) - ApplicationConfig._log.info(bps_cfg_string) - - return bps_cfg_string - - def apply_configuration_from_file(self, config_file_path): - ''' Read application configuration variables from a .conf file. - - Unassigned variables are set to their default values - or None if no default is specified at init time. - The variables are found in a section named by the application. - - Parameters - ---------- - config_file_path : string - path to to an INI (.conf) or JSON format application config file. - - Returns - ------- - - see: https://docs.python.org/2/library/configparser.html - ''' - none_defaults = {} - - # defaults are set in environment - # they are only overriden by the config file if present - for key in self.defaults: - none_defaults[key] = None - - logging.info("none_defaults: %s" % (none_defaults)) - - config = None - - try: - config = ConfigParser(defaults=none_defaults, - allow_no_value=True) - except: - logging.warn( - "This python installation does not support configuration defaults.") - config = ConfigParser() - - if config_file_path.endswith('.json'): - cfg_string = self.from_json_file(config_file_path) - try: - config.readfp(io.BytesIO(cfg_string)) - except (NameError, TypeError): - config.read_string(cfg_string) # Python 3 - else: - config.read(config_file_path) - - for key in self.defaults: - try: - file_value = config.get(self.application_name, key) - if file_value: - logging.info("setting %s to %s" % (key, file_value)) - setattr(self, key, file_value) - except: - logging.info("Configuration option not specified: %s" % - (key)) diff --git a/allensdk/config/app/logging.conf b/allensdk/config/app/logging.conf deleted file mode 100644 index 065236fb3a..0000000000 --- a/allensdk/config/app/logging.conf +++ /dev/null @@ -1,35 +0,0 @@ -[loggers] -keys=root,allensdk - -[handlers] -keys=consoleHandler,logFileHandler - -[formatters] -keys=simpleFormatter - -[logger_root] -level=ERROR -#handlers=consoleHandler,logFileHandler -handlers=consoleHandler - -[logger_allensdk] -level=ERROR -#handlers=consoleHandler,logFileHandler -handlers=consoleHandler -qualname=allensdk -propagate=0 - -[handler_consoleHandler] -class=StreamHandler -level=DEBUG -formatter=simpleFormatter -args=(sys.stdout,) - -[handler_logFileHandler] -class=FileHandler -formatter=simpleFormatter -args=('debug.log', 'w') - -[formatter_simpleFormatter] -format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s -datefmt=%m-%d %H:%M \ No newline at end of file diff --git a/allensdk/config/manifest.py b/allensdk/config/manifest.py deleted file mode 100644 index bbb8b2b6be..0000000000 --- a/allensdk/config/manifest.py +++ /dev/null @@ -1,416 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2014-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import sys -import re -import logging -import errno -import pandas as pd -from pathlib import Path - - -class ManifestVersionError(Exception): - - @property - def outdated(self): - try: - return self.found_version < self.version - except TypeError: - return - - def __init__(self, message, version, found_version): - super(ManifestVersionError, self).__init__(message) - self.found_version = found_version - self.version = version - - -class Manifest(object): - """Manages the location of external files - referenced in an Allen SDK configuration """ - - DIR = 'dir' - FILE = 'file' - DIRNAME = 'dir_name' - VERSION = 'manifest_version' - - log = logging.getLogger(__name__) - - def __init__(self, config=None, relative_base_dir='.', version=None): - self.path_info = {} - self.relative_base_dir = relative_base_dir - - if config is not None: - self.load_config(config, version=version) - - def load_config(self, config, version=None): - ''' Load paths into the manifest from an Allen SDK config section. - - Parameters - ---------- - config : Config - Manifest section of an Allen SDK config. - ''' - found_version = None - for path_info in config: - path_type = path_info['type'] - path_format = None - if 'format' in path_info: - path_format = path_info['format'] - - if path_type == 'file': - try: - parent_key = path_info['parent_key'] - except: - parent_key = None - - self.add_file(path_info['key'], - path_info['spec'], - parent_key, - path_format) - elif path_type == 'dir': - try: - parent_key = path_info['parent_key'] - except: - parent_key = None - - spec = path_info['spec'] - absolute = False - if spec[0] == '/': - absolute = True - self.add_path(path_info['key'], - path_info['spec'], - path_type, - absolute, - path_format, - parent_key) - - elif path_type == self.VERSION: - found_version = path_info['value'] - else: - Manifest.log.warning("Unknown path type in manifest: %s" % - (path_type)) - - - if found_version != version: - raise ManifestVersionError("", version, found_version) - self.version = version - - def add_path(self, key, path, path_type=DIR, - absolute=True, path_format=None, parent_key=None): - '''Insert a new entry. - - Parameters - ---------- - key : string - Identifier for referencing the entry. - path : string - Specification for a path using %s, %d style substitution. - path_type : string enumeration - 'dir' (default) or 'file' - absolute : boolean - Is the spec relative to the process current directory. - path_format : string, optional - Indicate a known file type for further parsing. - parent_key : string - Refer to another entry. - ''' - if parent_key: - path_args = [] - - try: - parent_path = self.path_info[parent_key]['spec'] - path_args.append(parent_path) - except: - Manifest.log.error( - "cannot resolve directory key %s" % (parent_key)) - raise - path_args.extend(path.split('/')) - path = os.path.join(*path_args) - - # TODO: relative paths need to be considered better - if absolute is True: - path = os.path.abspath(path) - else: - path = os.path.abspath(os.path.join(self.relative_base_dir, path)) - - if path_type == Manifest.DIRNAME: - path = os.path.dirname(path) - - self.path_info[key] = {'type': path_type, - 'spec': path} - - if path_type == Manifest.FILE and path_format is not None: - self.path_info[key]['format'] = path_format - - def add_paths(self, path_info): - ''' add information about paths stored in the manifest. - - Parameters - path_info : dict - Information about the new paths - ''' - for path_key, path_data in path_info.items(): - path_format = None - - if 'format' in path_data: - path_format = path_data['format'] - - Manifest.log.info("Adding path. type: %s, format: %s, spec: %s" % - (path_data['type'], - path_data['spec'], - path_format)) - entry = {'type': path_data['type'], - 'spec': path_data['spec'] - } - if path_format is not None: - entry['format'] = path_format - - self.path_info[path_key] = entry - - def add_file(self, - file_key, - file_name, - dir_key=None, - path_format=None): - '''Insert a new file entry. - - Parameters - ---------- - file_key : string - Reference to the entry. - file_name : string - Subtitutions of the %s, %d style allowed. - dir_key : string - Reference to the parent directory entry. - path_format : string, optional - File type for further parsing. - ''' - path_args = [] - - if dir_key: - try: - dir_path = self.path_info[dir_key]['spec'] - path_args.append(dir_path) - except: - Manifest.log.error( - "cannot resolve directory key %s" % (dir_key)) - raise - elif not file_name.startswith('/'): - path_args.append(os.curdir) - else: - path_args.append(os.path.sep) - - path_args.extend(file_name.split('/')) - file_path = os.path.join(*path_args) - - self.path_info[file_key] = {'type': Manifest.FILE, - 'spec': file_path} - - if path_format: - self.path_info[file_key]['format'] = path_format - - def get_path(self, path_key, *args): - '''Retrieve an entry with substitutions. - - Parameters - ---------- - path_key : string - Refer to the entry to retrieve. - args : any types, optional - arguments to be substituted into the path spec for %s, %d, etc. - - Returns - ------- - string - Path with parent structure and substitutions applied. - ''' - path_spec = self.path_info[path_key]['spec'] - - if args is not None and len(args) != 0: - path = path_spec % args - else: - path = path_spec - - return path - - def get_format(self, path_key): - '''Retrieve the type of a path entry. - - Parameters - ---------- - path_key : string - reference to the entry - - Returns - ------- - string - File type. - ''' - path_entry = self.path_info[path_key] - path_format = None - - if 'format' in path_entry: - path_format = path_entry['format'] - - return path_format - - @classmethod - def safe_make_parent_dirs(cls, file_name): - ''' Create a parent directories for file. - - Parameters - ---------- - file_name : string - - Returns - ------- - leftmost : string - most rootward directory created - - ''' - - dirname = os.path.dirname(file_name) - - # do nothing if there are no parent directories - if not dirname: - return - - return Manifest.safe_mkdir(dirname) - - @classmethod - def safe_mkdir(cls, directory): - '''Create path if not already there. - - Parameters - ---------- - directory : string - create it if it doesn't exist - - Returns - ------- - leftmost : string - most rootward directory created - - ''' - - parts = Path(directory).parts - sub_paths = [Path(parts[0])] - for part in parts[1:]: - sub_paths.append(sub_paths[-1] / part) - - leftmost = None - for sub_path in sub_paths: - if not sub_path.exists(): - leftmost = str(sub_path) - - try: - os.makedirs(directory) - except OSError as e: - if ((sys.platform == "darwin") and (e.errno == errno.EISDIR) and \ - (e.filename == "/")): - # undocumented behavior of mkdir on OSX where for / it raises - # EISDIR and not EEXIST - # https://bugs.python.org/issue24231 (old but still holds true) - pass - elif sys.platform == "win32" and e.errno == errno.EACCES: - root_path = os.path.abspath(os.sep) - if e.filename == root_path or \ - e.filename == root_path.replace("\\", "/"): - # When attempting to os.makedirs the root drive letter on - # Windows, EACCES is raised, not EEXIST - pass - else: - raise - elif e.errno == errno.EEXIST: - pass - else: - raise - - return leftmost - - - def create_dir(self, path_key): - '''Make a directory for an entry. - - Parameters - ---------- - path_key : string - Reference to the entry. - ''' - dir_path = self.get_path(path_key) - Manifest.safe_mkdir(dir_path) - - def check_dir(self, path_key, do_exit=False): - '''Verify a directories existence or optionally exit. - - Parameters - ---------- - path_key : string - Reference to the entry. - do_exit : boolean - What to do if the directory is not present. - ''' - dir_path = self.get_path(path_key) - - if not os.path.exists(dir_path): - Manifest.log.fatal('Directory %s does not exist; exiting.' % - (dir_path)) - if do_exit is True: - quit() - - def resolve_paths(self, description_dict, suffix='_key'): - '''Walk input items and expand those that refer to a manifest entry. - - Parameters - ---------- - description_dict : dict - Any entries with key names ending in suffix will be expanded. - suffix : string - Indicates the entries to be expanded. - ''' - key_pattern = re.compile('(.*)%s$' % (suffix)) - - for description_key, manifest_key in description_dict.items(): - m = key_pattern.match(description_key) - if m: - real_key = m.group(1) # i.e. job_dir_key -> job_dir - filename = self.get_path(manifest_key) - description_dict[real_key] = filename - del description_dict[description_key] - - def as_dataframe(self): - return pd.DataFrame.from_dict(self.path_info, - orient='index') diff --git a/allensdk/config/manifest_builder.py b/allensdk/config/manifest_builder.py deleted file mode 100644 index 328f07b063..0000000000 --- a/allensdk/config/manifest_builder.py +++ /dev/null @@ -1,110 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import allensdk.core.json_utilities as ju -import logging -from allensdk.config.manifest import Manifest -import pandas as pd -import six - - -class ManifestBuilder(object): - df_columns = ['key', 'parent_key', 'spec', 'type', 'format'] - - def __init__(self): - self._log = logging.getLogger(__name__) - self.path_info = [] - self.sections = {} - - def set_version(self, value): - self.path_info.append({'type': Manifest.VERSION, 'value': value}) - - def add_path(self, key, spec, - typename='dir', - parent_key=None, - format=None): - entry = { - 'key': key, - 'type': typename, - 'spec': spec} - - if format is not None: - entry['format'] = format - - if parent_key is not None: - entry['parent_key'] = parent_key - - self.path_info.append(entry) - - def add_section(self, name, contents): - self.sections[name] = contents - - def write_json_file(self, path, overwrite=False): - mode = 'wb' - - if overwrite is True: - mode = 'wb+' - - json_string = self.write_json_string() - - with open(path, mode) as f: - try: - f.write(json_string) # Python 2.7 - except TypeError: - f.write(bytes(json_string, 'utf-8')) # Python 3 - - def get_config(self): - wrapper = {"manifest": self.path_info} - for section in self.sections.values(): - wrapper.update(section) - - return wrapper - - def get_manifest(self): - return Manifest(self.path_info) - - def write_json_string(self): - config = self.get_config() - return ju.write_string(config) - - def as_dataframe(self): - return pd.DataFrame(self.path_info, - columns=ManifestBuilder.df_columns) - - def from_dataframe(self, df): - self.path_info = {} - - for _, k, p, s, t, f in six.iteritems(df.loc[:, ManifestBuilder.df_columns]): - self.add_path(k, s, typename=t, parent=p, format=f) diff --git a/allensdk/config/model/__init__.py b/allensdk/config/model/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/config/model/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/config/model/description.py b/allensdk/config/model/description.py deleted file mode 100644 index 3de0d2fe3f..0000000000 --- a/allensdk/config/model/description.py +++ /dev/null @@ -1,132 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2014-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging - -from allensdk.config.manifest import Manifest - - -class Description(object): - _log = logging.getLogger(__name__) - - def __init__(self): - self.data = {} - self.reserved_data = [] - self.manifest = Manifest() - - def update_data(self, data, section=None): - '''Merge configuration data possibly from multiple files. - - Parameters - ---------- - data : dict - Configuration structure to add. - section : string, optional - What configuration section to read it into if the file does not specify. - ''' - if section is None: - for (section, entries) in data.items(): - if section not in self.data: - self.data[section] = entries - else: - self.data[section].extend(entries) - else: - if section not in self.data: - self.data[section] = [] - - self.data[section].append(data) - - def is_empty(self): - '''Check if anything is in the object. - - Returns - ------- - boolean - true if self.data is missing or empty - ''' - if self.data: - return False - - return True - - def unpack(self, data, section=None): - '''Read the manifest and other stand-alone configuration structure, - or insert a configuration object into a section of an existing configuration. - - Parameters - ---------- - data : dict - A configuration object including top level sections, - or an configuration object to be placed within a section. - section : string, optional. - If this is present, place data within an existing section array. - ''' - if section is None: - self.unpack_manifest(data) - self.update_data(data) - else: - self.update_data(data, section) - - def unpack_manifest(self, data): - '''Pull the manifest configuration section into a separate place. - - Parameters - ---------- - data : dict - A configuration structure that still has a manifest section. - ''' - data_manifest = data.pop("manifest", {}) - reserved_data = {"manifest": data_manifest} - self.reserved_data.append(reserved_data) - self.manifest.load_config(data_manifest) - - def fix_unary_sections(self, section_names=None): - ''' Wrap section contents that don't have the proper - array surrounding them in an array. - - Parameters - ---------- - section_names : list of strings, optional - Keys of sections that might not be in array form. - ''' - if section_names is None: - section_names = [] - - for section in section_names: - if section in self.data: - if type(self.data[section]) is dict: - self.data[section] = [self.data[section]] - Description._log.warn( - "wrapped description section %s in an array." % (section)) diff --git a/allensdk/config/model/description_parser.py b/allensdk/config/model/description_parser.py deleted file mode 100644 index 2a2ae864dd..0000000000 --- a/allensdk/config/model/description_parser.py +++ /dev/null @@ -1,106 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2014-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -from allensdk.config.model.description import Description - - -class DescriptionParser(object): - log = logging.getLogger(__name__) - - def __init__(self): - pass - - def read(self, file_path, description=None, section=None, **kwargs): - '''Parse data needed for a simulation. - - Parameters - ---------- - description : dict - Configuration from parsing previous files. - section : string, optional - What configuration section to read it into if the file does not specify. - ''' - if description is None: - description = Description() - - self.reader = self.parser_for_extension(file_path) - self.reader.read(file_path, description, section, **kwargs) - - return description - - def read_string(self, data_string, description=None, section=None, header=None): - '''Parse data needed for a simulation from a string.''' - raise Exception("Not implemented, use a sub class") - - def write(self, filename, description): - """Save the configuration. - - Parameters - ---------- - filename : string - Name of the file to write. - """ - writer = self.parser_for_extension(filename) - - writer.write(filename, description) - - def parser_for_extension(self, filename): - '''Choose a subclass that can read the format. - - Parameters - ---------- - filename : string - For the extension. - - Returns - ------- - DescriptionParser - Appropriate subclass. - ''' - # Circular imports - from allensdk.config.model.formats.json_description_parser import JsonDescriptionParser - from allensdk.config.model.formats.pycfg_description_parser import PycfgDescriptionParser - - parser = None - - if filename.endswith('.json'): - parser = JsonDescriptionParser() - elif filename.endswith('.pycfg'): - parser = PycfgDescriptionParser() - else: - raise Exception('could not determine file format') - - return parser diff --git a/allensdk/config/model/formats/__init__.py b/allensdk/config/model/formats/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/config/model/formats/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/config/model/formats/hdf5_util.py b/allensdk/config/model/formats/hdf5_util.py deleted file mode 100644 index 2842b04be0..0000000000 --- a/allensdk/config/model/formats/hdf5_util.py +++ /dev/null @@ -1,67 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import h5py -import numpy as np -from scipy.sparse import csr_matrix -import logging - - -class Hdf5Util(object): - - def __init__(self): - self.log = logging.getLogger(__name__) - - def read(self, file_path): - try: - with h5py.File(file_path, 'r') as csr: - return csr_matrix((csr['data'][...], - csr['indices'][...], - csr['indptr'][...])) - except Exception: - self.log.error( - "Couldn't read AllenSDK HDF5 CSR configuration: %s" % file_path) - raise - - def write(self, file_path, m): - try: - with h5py.File(file_path, 'w') as csr: - csr.create_dataset('data', data=m.data, dtype=np.uint8) - csr.create_dataset('indices', data=m.indices, dtype=np.uint32) - csr.create_dataset('indptr', data=m.indptr, dtype=np.uint32) - except Exception: - self.log.warn( - "Couldn't write AllenSDK HDF5 CSR configuration: %s" % file_path) - raise diff --git a/allensdk/config/model/formats/json_description_parser.py b/allensdk/config/model/formats/json_description_parser.py deleted file mode 100644 index cda7448143..0000000000 --- a/allensdk/config/model/formats/json_description_parser.py +++ /dev/null @@ -1,142 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -from json import dump, dumps -from allensdk.config.model.description_parser import DescriptionParser -from allensdk.config.model.description import Description -from allensdk.core.json_utilities import JsonComments - - -class JsonDescriptionParser(DescriptionParser): - log = logging.getLogger(__name__) - - def __init__(self): - super(JsonDescriptionParser, self).__init__() - - def read(self, file_path, description=None, section=None, **kwargs): - '''Parse a complete or partial configuration. - - Parameters - ---------- - json_string : string - Input to parse. - description : Description, optional - Where to put the parsed configuration. If None a new one is created. - section : string, optional - Where to put the parsed configuration within the description. - - Returns - ------- - Description - The input description with parsed configuration added. - - Section is only specified for "bare" objects that are to be added to a section array. - ''' - if description is None: - description = Description() - - data = JsonComments.read_file(file_path) - description.unpack(data, section) - - return description - - def read_string(self, json_string, description=None, section=None, **kwargs): - '''Parse a complete or partial configuration. - - Parameters - ---------- - json_string : string - Input to parse. - description : Description, optional - Where to put the parsed configuration. If None a new one is created. - section : string, optional - Where to put the parsed configuration within the description. - - Returns - ------- - Description - The input description with parsed configuration added. - - Section is only specified for "bare" objects that are to be added to a section array. - ''' - if description is None: - description = Description() - - data = JsonComments.read_string(json_string) - - description.unpack(data, section) - - return description - - def write(self, filename, description): - '''Write the description to a JSON file. - - Parameters - ---------- - description : Description - Object to write. - ''' - try: - with open(filename, 'w') as f: - dump(description.data, f, indent=2) - - except Exception: - self.log.warn( - "Couldn't write allensdk json description: %s" % filename) - raise - - return - - def write_string(self, description): - '''Write the description to a JSON string. - - Parameters - ---------- - description : Description - Object to write. - - Returns - ------- - string - JSON serialization of the input. - ''' - try: - json_string = dumps(description.data, - indent=2) - return json_string - except Exception: - self.log.warn("Couldn't write allensdk json description: %s") - raise diff --git a/allensdk/config/model/formats/pycfg_description_parser.py b/allensdk/config/model/formats/pycfg_description_parser.py deleted file mode 100644 index e84c96cd32..0000000000 --- a/allensdk/config/model/formats/pycfg_description_parser.py +++ /dev/null @@ -1,125 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -from pprint import pprint, pformat -from allensdk.config.model.description import Description -from allensdk.config.model.description_parser import DescriptionParser - - -class PycfgDescriptionParser(DescriptionParser): - log = logging.getLogger(__name__) - - def __init__(self): - super(PycfgDescriptionParser, self).__init__() - - def read(self, pycfg_file_path, description=None, section=None, **kwargs): - '''Read a serialized description from a Python (.pycfg) file. - - Parameters - ---------- - filename : string - Name of the .pycfg file. - - Returns - ------- - Description - Configuration object. - ''' - header = kwargs.get('prefix', '') - - with open(pycfg_file_path, 'r') as f: - return self.read_string(f.read(), description, section, header=header) - - def read_string(self, python_string, description=None, section=None, **kwargs): - '''Read a serialized description from a Python (.pycfg) string. - - Parameters - ---------- - python_string : string - Python string with a serialized description. - - Returns - ------- - Description - Configuration object. - ''' - - if description is None: - description = Description() - - header = kwargs.get('header', '') - - python_string = "%s\n\nallensdk_description = %s" % ( - header, python_string) - - ns = {} - code = compile(python_string, 'string', 'exec') - exec(code, ns) - data = ns['allensdk_description'] - description.unpack(data, section) - - return description - - def write(self, filename, description): - '''Write the description to a Python (.pycfg) file. - - Parameters - ---------- - filename : string - Name of the file to write. - ''' - try: - with open(filename, 'w') as f: - pprint(description.data, f, indent=2) - - except Exception: - self.log.warn( - "Couldn't write allensdk python description: %s" % filename) - raise - - return - - def write_string(self, description): - '''Write the description to a pretty-printed Python string. - - Parameters - ---------- - description : Description - Configuration object to write. - ''' - pycfg_string = pformat(description.data, indent=2) - - return pycfg_string diff --git a/allensdk/core/__init__.py b/allensdk/core/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/core/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/core/auth_config.py b/allensdk/core/auth_config.py deleted file mode 100644 index 845090065d..0000000000 --- a/allensdk/core/auth_config.py +++ /dev/null @@ -1,31 +0,0 @@ -CREDENTIAL_KEYS = [ - # key, default value - ("LIMS_DBNAME", None), - ("LIMS_USER", None), - ("LIMS_HOST", None), - ("LIMS_PORT", 5432), - ("LIMS_PASSWORD", None), - ("MTRAIN_DBNAME", None), - ("MTRAIN_USER", None), - ("MTRAIN_HOST", None), - ("MTRAIN_PORT", 5432), - ("MTRAIN_PASSWORD", None) -] - -# For PostgresQueryMixin -LIMS_DB_CREDENTIAL_MAP = { - "dbname": "LIMS_DBNAME", - "user": "LIMS_USER", - "host": "LIMS_HOST", - "password": "LIMS_PASSWORD", - "port": "LIMS_PORT" -} - -# For PostgresQueryMixin -MTRAIN_DB_CREDENTIAL_MAP = { - "dbname": "MTRAIN_DBNAME", - "user": "MTRAIN_USER", - "host": "MTRAIN_HOST", - "password": "MTRAIN_PASSWORD", - "port": "MTRAIN_PORT" -} \ No newline at end of file diff --git a/allensdk/core/authentication.py b/allensdk/core/authentication.py deleted file mode 100644 index 48867c2eab..0000000000 --- a/allensdk/core/authentication.py +++ /dev/null @@ -1,112 +0,0 @@ -import os -from typing import Optional, Dict, Any -import logging -from functools import wraps -from abc import ABC, abstractmethod -from collections import namedtuple -from allensdk.core.auth_config import CREDENTIAL_KEYS - - -logger = logging.getLogger(__name__) - -DbCredentials = namedtuple("DbCredentials", - ["dbname", "user", "host", "port", "password"]) - - -class CredentialProvider(ABC): - METHOD = "custom" - @abstractmethod - def provide(self, credential): - pass - - -class EnvCredentialProvider(CredentialProvider): - """ - Provides credentials from environment variables for variables listed - in CREDENTIAL_KEYS. - """ - METHOD = "env" - - def __init__(self, environ: Optional[Dict[str, Any]] = None): - """ - Parameters - ---------- - environ: dictionary or os.environ - A dictionary that provides the values for keys in - CREDENTIAL_KEYS. If not provided, defaults to os.environ to - provide environment variables. - """ - if environ is None: - environ = os.environ - self.credentials = dict((k[0], environ.get(k[0], k[1])) - for k in CREDENTIAL_KEYS) - - def provide(self, credential): - return self.credentials.get(credential) - - -CREDENTIAL_PROVIDER = EnvCredentialProvider() - - -def set_credential_provider(provider): - logger.info(f"Setting provider to method '{provider.METHOD}.") - global CREDENTIAL_PROVIDER - CREDENTIAL_PROVIDER = provider - - -def get_credential_provider(): - return CREDENTIAL_PROVIDER - - -def credential_injector(credential_map: Dict[str, Any], - provider: Optional[CredentialProvider] = None): - """ - Decorator used to inject credentials from another source if not - explicitly provided in the function call. This function will only supply - values for keyword arguments. All keys defined in `credential_map` must - correspond to keyword arguments in the function signature. - - PARAMETERS - ---------- - credential_map: Dict[Str: Any] - Dictionary where the keys are the keyword of a credential kwarg - passed to the decorated function, and the values are the name - of the credential in the credential provider (see CREDENTIAL_KEYS). - - Example of credential_map for PostgresQueryMixin connecting to - LIMS database: - { - "dbname": "LIMS_DBNAME", - "user": "LIMS_USER", - "host": "LIMS_HOST", - "password": "LIMS_PASSWORD", - "port": "LIMS_PORT" - } - provider: Optional[CredentialProvider] - Subclass of CredentialProvider to provide credentials to the - wrapped function. If left unspecified, will default to - EnvCredentialProvider, which provides credentials from environment - variables. - """ - if provider is None: - provider = get_credential_provider() - - def injector_decorator(func): - @wraps(func) - def wrapper(*args, **kwargs): - for kw, credential in credential_map.items(): - if kw not in kwargs.keys(): - logger.info(f"No explicit value provided for {kw}. " - "Searching credential provider.") - secret = provider.provide(credential) - if secret is not None: - logger.info("Found value in credential provider, " - f"from '{provider.METHOD}' method.") - kwargs.update({kw: provider.provide(credential)}) - else: - logger.warning( - f"Value for {kw} was neither explicitly provided " - "nor found in credential provider.") - return func(*args, **kwargs) - return wrapper - return injector_decorator diff --git a/allensdk/core/brain_observatory_cache.py b/allensdk/core/brain_observatory_cache.py deleted file mode 100644 index bdc6b67b93..0000000000 --- a/allensdk/core/brain_observatory_cache.py +++ /dev/null @@ -1,665 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import six -import numpy as np -import pandas as pd - -from pathlib import Path - -from allensdk.api.warehouse_cache.cache import Cache, get_default_manifest_file -from allensdk.api.queries.brain_observatory_api import BrainObservatoryApi -from allensdk.config.manifest_builder import ManifestBuilder -from .brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet -import allensdk.brain_observatory.stimulus_info as stim_info - -from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise -from allensdk.brain_observatory.natural_scenes import NaturalScenes -from allensdk.brain_observatory.natural_movie import NaturalMovie -from allensdk.brain_observatory.static_gratings import StaticGratings -from allensdk.brain_observatory.drifting_gratings import DriftingGratings - -from allensdk.brain_observatory.nwb import (read_eye_gaze_mappings, - create_eye_gaze_mapping_dataframe) - -# NOTE: This is a really ugly hack to get around the fact that warehouse does -# not have Ophys session ids associated with experiment ids. -from .ophys_experiment_session_id_mapping import ophys_experiment_session_id_map - -ANALYSIS_CLASS_DICT = {stim_info.LOCALLY_SPARSE_NOISE: LocallySparseNoise, - stim_info.LOCALLY_SPARSE_NOISE_4DEG: LocallySparseNoise, - stim_info.LOCALLY_SPARSE_NOISE_8DEG: LocallySparseNoise, - stim_info.NATURAL_MOVIE_ONE:NaturalMovie, - stim_info.NATURAL_MOVIE_TWO:NaturalMovie, - stim_info.NATURAL_MOVIE_THREE:NaturalMovie, - stim_info.NATURAL_SCENES:NaturalScenes, - stim_info.STATIC_GRATINGS:StaticGratings, - stim_info.DRIFTING_GRATINGS:DriftingGratings} - -class BrainObservatoryCache(Cache): - """ - Cache class for storing and accessing data from the Brain Observatory. - By default, this class will cache any downloaded metadata or files in - well known locations defined in a manifest file. This behavior can be - disabled. - - Attributes - ---------- - - api: BrainObservatoryApi instance - The object used for making API queries related to the Brain - Observatory. - - Parameters - ---------- - - cache: boolean - Whether the class should save results of API queries to locations specified - in the manifest file. Queries for files (as opposed to metadata) must have a - file location. If caching is disabled, those locations must be specified - in the function call (e.g. get_ophys_experiment_data(file_name='file.nwb')). - - manifest_file: string - File name of the manifest to be read. Default is "brain_observatory_manifest.json". - """ - - EXPERIMENT_CONTAINERS_KEY = 'EXPERIMENT_CONTAINERS' - EXPERIMENTS_KEY = 'EXPERIMENTS' - CELL_SPECIMENS_KEY = 'CELL_SPECIMENS' - EXPERIMENT_DATA_KEY = 'EXPERIMENT_DATA' - ANALYSIS_DATA_KEY = 'ANALYSIS_DATA' - EVENTS_DATA_KEY = 'EVENTS_DATA' - STIMULUS_MAPPINGS_KEY = 'STIMULUS_MAPPINGS' - EYE_GAZE_DATA_KEY = 'EYE_GAZE_DATA' - MANIFEST_VERSION = '1.3' - - def __init__(self, cache=True, manifest_file=None, base_uri=None, api=None): - - if manifest_file is None: - manifest_file = get_default_manifest_file('brain_observatory') - - super(BrainObservatoryCache, self).__init__( - manifest=manifest_file, cache=cache, version=self.MANIFEST_VERSION) - - if api is None: - self.api = BrainObservatoryApi(base_uri=base_uri) - else: - self.api = api - - def get_all_targeted_structures(self): - """ Return a list of all targeted structures in the data set. """ - containers = self.get_experiment_containers(simple=False) - targeted_structures = set( - [c['targeted_structure']['acronym'] for c in containers]) - return sorted(list(targeted_structures)) - - def get_all_cre_lines(self): - """ Return a list of all cre driver lines in the data set. """ - containers = self.get_experiment_containers(simple=True) - cre_lines = set([c['cre_line'] for c in containers]) - return sorted(list(cre_lines)) - - def get_all_reporter_lines(self): - """ Return a list of all reporter lines in the data set. """ - containers = self.get_experiment_containers(simple=True) - reporter_lines = set([c['reporter_line'] for c in containers]) - return sorted(list(reporter_lines)) - - def get_all_imaging_depths(self): - """ Return a list of all imaging depths in the data set. """ - containers = self.get_experiment_containers(simple=True) - imaging_depths = set([c['imaging_depth'] for c in containers]) - return sorted(list(imaging_depths)) - - def get_all_session_types(self): - """ Return a list of all stimulus sessions in the data set. """ - exps = self.get_ophys_experiments(simple=False) - names = set([exp['stimulus_name'] for exp in exps]) - return sorted(list(names)) - - def get_all_stimuli(self): - """ Return a list of all stimuli in the data set. """ - return sorted(list(stim_info.all_stimuli())) - - def get_experiment_containers(self, file_name=None, - ids=None, - targeted_structures=None, - imaging_depths=None, - cre_lines=None, - reporter_lines=None, - transgenic_lines=None, - include_failed=False, - simple=True): - """ Get a list of experiment containers matching certain criteria. - - Parameters - ---------- - file_name: string - File name to save/read the experiment containers. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - ids: list - List of experiment container ids. - - targeted_structures: list - List of structure acronyms. Must be in the list returned by - BrainObservatoryCache.get_all_targeted_structures(). - - imaging_depths: list - List of imaging depths. Must be in the list returned by - BrainObservatoryCache.get_all_imaging_depths(). - - cre_lines: list - List of cre lines. Must be in the list returned by - BrainObservatoryCache.get_all_cre_lines(). - - reporter_lines: list - List of reporter lines. Must be in the list returned by - BrainObservatoryCache.get_all_reporter_lines(). - - transgenic_lines: list - List of transgenic lines. Must be in the list returned by - BrainObservatoryCache.get_all_cre_lines() or. - BrainObservatoryCache.get_all_reporter_lines(). - - include_failed: boolean - Whether or not to include failed experiment containers. - - simple: boolean - Whether or not to simplify the dictionary properties returned by this method - to a more concise subset. - - Returns - ------- - list of dictionaries - """ - _assert_not_string(targeted_structures, "targeted_structures") - _assert_not_string(cre_lines, "cre_lines") - _assert_not_string(reporter_lines, "reporter_lines") - _assert_not_string(transgenic_lines, "transgenic_lines") - - file_name = self.get_cache_path( - file_name, self.EXPERIMENT_CONTAINERS_KEY) - - containers = self.api.get_experiment_containers(path=file_name, - strategy='lazy', - **Cache.cache_json()) - - containers = self.api.filter_experiment_containers(containers, ids=ids, - targeted_structures=targeted_structures, - imaging_depths=imaging_depths, - cre_lines=cre_lines, - reporter_lines=reporter_lines, - transgenic_lines=transgenic_lines, - include_failed=include_failed, - simple=simple) - - return containers - - def get_ophys_experiment_stimuli(self, experiment_id): - """ For a single experiment, return the list of stimuli present in that experiment. """ - exps = self.get_ophys_experiments(ids=[experiment_id]) - - if len(exps) == 0: - return None - - return stim_info.stimuli_in_session(exps[0]['session_type']) - - def get_ophys_experiments(self, file_name=None, - ids=None, - experiment_container_ids=None, - targeted_structures=None, - imaging_depths=None, - cre_lines=None, - reporter_lines=None, - transgenic_lines=None, - stimuli=None, - session_types=None, - cell_specimen_ids=None, - include_failed=False, - require_eye_tracking=False, - simple=True): - """ Get a list of ophys experiments matching certain criteria. - - Parameters - ---------- - file_name: string - File name to save/read the ophys experiments. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - ids: list - List of ophys experiment ids. - - experiment_container_ids: list - List of experiment container ids. - - targeted_structures: list - List of structure acronyms. Must be in the list returned by - BrainObservatoryCache.get_all_targeted_structures(). - - imaging_depths: list - List of imaging depths. Must be in the list returned by - BrainObservatoryCache.get_all_imaging_depths(). - - cre_lines: list - List of cre lines. Must be in the list returned by - BrainObservatoryCache.get_all_cre_lines(). - - reporter_lines: list - List of reporter lines. Must be in the list returned by - BrainObservatoryCache.get_all_reporter_lines(). - - transgenic_lines: list - List of transgenic lines. Must be in the list returned by - BrainObservatoryCache.get_all_cre_lines() or. - BrainObservatoryCache.get_all_reporter_lines(). - - stimuli: list - List of stimulus names. Must be in the list returned by - BrainObservatoryCache.get_all_stimuli(). - - session_types: list - List of stimulus session type names. Must be in the list returned by - BrainObservatoryCache.get_all_session_types(). - - cell_specimen_ids: list - Only include experiments that contain cells with these ids. - - include_failed: boolean - Whether or not to include experiments from failed experiment containers. - - simple: boolean - Whether or not to simplify the dictionary properties returned by this method - to a more concise subset. - - require_eye_tracking: boolean - If True, only return experiments that have eye tracking results. Default: False. - - Returns - ------- - list of dictionaries - """ - _assert_not_string(targeted_structures, "targeted_structures") - _assert_not_string(cre_lines, "cre_lines") - _assert_not_string(reporter_lines, "reporter_lines") - _assert_not_string(transgenic_lines, "transgenic_lines") - _assert_not_string(stimuli, "stimuli") - _assert_not_string(session_types, "session_types") - - file_name = self.get_cache_path(file_name, self.EXPERIMENTS_KEY) - - exps = self.api.get_ophys_experiments(path=file_name, - strategy='lazy', - **Cache.cache_json()) - - # NOTE: Ugly hack to update the 'fail_eye_tracking' field - # which is using True/False values for the previous eye mapping - # implementation. This will also need to be fixed in warehouse. - # ----- Start of ugly hack ----- - response = self.api.template_query('brain_observatory_queries', - 'all_eye_mapping_files') - - session_ids_with_eye_tracking: set = {entry['attachable_id'] - for entry in response - if entry['attachable_type'] == "OphysSession"} - - for indx, exp in enumerate(exps): - try: - ophys_session_id = ophys_experiment_session_id_map[exp['id']] - if ophys_session_id in session_ids_with_eye_tracking: - exps[indx]['fail_eye_tracking'] = False - else: - exps[indx]['fail_eye_tracking'] = True - except KeyError: - exps[indx]['fail_eye_tracking'] = True - # ----- End of ugly hack ----- - - if cell_specimen_ids is not None: - cells = self.get_cell_specimens(ids=cell_specimen_ids) - cell_container_ids = set([cell['experiment_container_id'] for cell in cells]) - if experiment_container_ids is not None: - experiment_container_ids = list(set(experiment_container_ids) - cell_container_ids) - else: - experiment_container_ids = list(cell_container_ids) - - exps = self.api.filter_ophys_experiments(exps, - ids=ids, - experiment_container_ids=experiment_container_ids, - targeted_structures=targeted_structures, - imaging_depths=imaging_depths, - cre_lines=cre_lines, - reporter_lines=reporter_lines, - transgenic_lines=transgenic_lines, - stimuli=stimuli, - session_types=session_types, - include_failed=include_failed, - require_eye_tracking=require_eye_tracking, - simple=simple) - - return exps - - def _get_stimulus_mappings(self, file_name=None): - """ Returns a mapping of which metrics are related to which stimuli. Internal use only. """ - - file_name = self.get_cache_path(file_name, self.STIMULUS_MAPPINGS_KEY) - - mappings = self.api.get_stimulus_mappings(path=file_name, - strategy='lazy', - **Cache.cache_json()) - - return mappings - - def get_cell_specimens(self, - file_name=None, - ids=None, - experiment_container_ids=None, - include_failed=False, - simple=True, - filters=None): - """ Return cell specimens that have certain properies. - - Parameters - ---------- - file_name: string - File name to save/read the cell specimens. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - ids: list - List of cell specimen ids. - - experiment_container_ids: list - List of experiment container ids. - - include_failed: bool - Whether to include cells from failed experiment containers - - simple: boolean - Whether or not to simplify the dictionary properties returned by this method - to a more concise subset. - - filters: list of dicts - List of filter dictionaries. The Allen Brain Observatory web site can - generate filters in this format to reproduce a filtered set of cells - found there. To see what these look like, visit - http://observatory.brain-map.org/visualcoding, perform a cell search - and apply some filters (e.g. find cells in a particular area), then - click the "view these cells in the AllenSDK" link on the bottom-left - of the search results page. This will take you to a page that contains - a code sample you can use to apply those same filters via this argument. - For more detail on the filter syntax, see BrainObservatoryApi.dataframe_query. - - - Returns - ------- - list of dictionaries - """ - - file_name = self.get_cache_path(file_name, self.CELL_SPECIMENS_KEY) - - cell_specimens = self.api.get_cell_metrics(path=file_name, - strategy='lazy', - pre= lambda x: [y for y in x], - **Cache.cache_json()) - - cell_specimens = self.api.filter_cell_specimens(cell_specimens, - ids=ids, - experiment_container_ids=experiment_container_ids, - include_failed=include_failed, - filters=filters) - - # drop the thumbnail columns - if simple: - mappings = self._get_stimulus_mappings() - thumbnails = [m['item'] for m in mappings if m[ - 'item_type'] == 'T' and m['level'] == 'R'] - for cs in cell_specimens: - for t in thumbnails: - del cs[t] - - return cell_specimens - - - def get_nwb_filepath(self, ophys_experiment_id=None): - cache_nwb_filepath = self.get_cache_path(None, self.EXPERIMENT_DATA_KEY, ophys_experiment_id) - if os.path.exists(cache_nwb_filepath): - return cache_nwb_filepath - else: - return None - - - def get_ophys_experiment_data(self, ophys_experiment_id, file_name=None): - """ Download the NWB file for an ophys_experiment (if it hasn't already been - downloaded) and return a data accessor object. - - Parameters - ---------- - file_name: string - File name to save/read the data set. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - ophys_experiment_id: integer - id of the ophys_experiment to retrieve - - Returns - ------- - BrainObservatoryNwbDataSet - """ - file_name = self.get_cache_path( - file_name, self.EXPERIMENT_DATA_KEY, ophys_experiment_id) - - self.api.save_ophys_experiment_data(ophys_experiment_id, file_name, strategy='lazy') - - return BrainObservatoryNwbDataSet(file_name) - - def get_ophys_experiment_analysis(self, ophys_experiment_id, stimulus_type, file_name=None): - """ Download the h5 analysis file for a stimulus set, for a particular ophys_experiment - (if it hasn't already been downloaded) and return a data accessor object. - - Parameters - ---------- - file_name: string - File name to save/read the data set. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - ophys_experiment_id: int - id of the ophys_experiment to retrieve - - stimulus_name: str - stimulus type; should be an element of self.list_stimuli() - - Returns - ------- - BrainObservatoryNwbDataSet - """ - data_set = self.get_ophys_experiment_data(ophys_experiment_id, file_name=None) - session_type = data_set.get_session_type() - - if not stimulus_type in stim_info.SESSION_STIMULUS_MAP[session_type]: - raise RuntimeError('Stimulus %s not available session type: %s' % (stimulus_type, stim_info.SESSION_STIMULUS_MAP[stimulus_type])) - - # Use manifest to figure out where to cache the file: - file_name = self.get_cache_path(file_name, self.ANALYSIS_DATA_KEY, ophys_experiment_id, session_type) - - # Cache the analsis file from an RMA query: - self.api.save_ophys_experiment_analysis_data(ophys_experiment_id, file_name, strategy='lazy') - - # Get the analysis class from ANALYSIS_CLASS_DICT, and build from the static method: - if stimulus_type in stim_info.LOCALLY_SPARSE_NOISE_STIMULUS_TYPES+stim_info.NATURAL_MOVIE_STIMULUS_TYPES: - return ANALYSIS_CLASS_DICT[stimulus_type].from_analysis_file(data_set, file_name, stimulus_type) - else: - return ANALYSIS_CLASS_DICT[stimulus_type].from_analysis_file(data_set, file_name) - - def get_ophys_experiment_events(self, ophys_experiment_id, file_name=None): - """ Download the npz events file for an ophys_experiment if it hasn't - already been downloaded and return the events array. - - Parameters - ---------- - file_name: string - File name to save/read the data set. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - ophys_experiment_id: int - id of the ophys_experiment to retrieve events for - Returns - ------- - events: numpy.ndarray - [N_cells,N_times] array of events. - """ - file_name = self.get_cache_path( - file_name, self.EVENTS_DATA_KEY, ophys_experiment_id) - - self.api.save_ophys_experiment_event_data(ophys_experiment_id, file_name, strategy='lazy') - - return np.load(file_name, allow_pickle=False)["ev"] - - def get_ophys_pupil_data(self, - ophys_experiment_id: int, - file_name: str = None, - suppress_pupil_data: bool = True) -> pd.DataFrame: - """Download the h5 eye gaze mapping file for an ophys_experiment if - it hasn't already been downloaded and return it as a pandas.DataFrame. - - Parameters - ---------- - file_name: string - File name to save/read the data set. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - ophys_experiment_id: int - id of the ophys_experiment to retrieve pupil data for. - - suppress_pupil_data: bool - Whether or not to suppress pupil data from dataset. - Default is True. - - Returns - ------- - pd.DataFrame - If 'suppress_eye_gaze_data' is set to 'False': - Contains raw/filtered columns for gaze mapping: - *_eye_area - *_pupil_area - *_screen_coordinates_x_cm - *_screen_coordinates_y_cm - *_screen_coordinates_spherical_x_deg - *_screen_coorindates_spherical_y_deg - Otherwise: - An empty pandas DataFrame - """ - - if suppress_pupil_data: - print("This pupil data is obtained using a new eye " - "tracking algorithm and is in the process of being validated. " - "If you would like to view the data anyways, " - "please set the 'suppress_pupil_data' parameter to 'False'.") - return pd.DataFrame() - - # NOTE: This is a really ugly hack to get around the fact that warehouse does - # not have Ophys session ids associated with experiment ids. This should be - # removed when warehouse session ids have associations with experiment ids. - # ----- Start of ugly hack ----- - try: - ophys_session_id = ophys_experiment_session_id_map[ophys_experiment_id] - except KeyError: - raise RuntimeError(f"Experiment id '{ophys_experiment_id}' has no associated session!") - # ----- End of ugly hack ----- - - file_name = self.get_cache_path(file_name, - self.EYE_GAZE_DATA_KEY, - ophys_session_id) - - if not file_name: - raise RuntimeError("Could not obtain a file_name for pupil data " - f"with experiment id: {ophys_experiment_id} " - f"(session id: {ophys_session_id})") - - # NOTE: `save_ophys_experiment_eye_gaze_data` will also need to be - # updated to remove ophy_session_id param when ugly hack is removed. - self.api.save_ophys_experiment_eye_gaze_data(ophys_experiment_id, - ophys_session_id, - file_name, - strategy='lazy') - - gaze_mapping_data = read_eye_gaze_mappings(Path(file_name)) - - return create_eye_gaze_mapping_dataframe(gaze_mapping_data) - - def build_manifest(self, file_name): - """ - Construct a manifest for this Cache class and save it in a file. - - Parameters - ---------- - - file_name: string - File location to save the manifest. - - """ - - mb = ManifestBuilder() - mb.set_version(self.MANIFEST_VERSION) - mb.add_path('BASEDIR', '.') - mb.add_path(self.EXPERIMENT_CONTAINERS_KEY, - 'experiment_containers.json', typename='file', parent_key='BASEDIR') - mb.add_path(self.EXPERIMENTS_KEY, 'ophys_experiments.json', - typename='file', parent_key='BASEDIR') - mb.add_path(self.EXPERIMENT_DATA_KEY, 'ophys_experiment_data/%d.nwb', - typename='file', parent_key='BASEDIR') - mb.add_path(self.ANALYSIS_DATA_KEY, 'ophys_experiment_analysis/%d_%s_analysis.h5', - typename='file', parent_key='BASEDIR') - mb.add_path(self.EVENTS_DATA_KEY, 'ophys_experiment_events/%d_events.npz', - typename='file', parent_key='BASEDIR') - mb.add_path(self.CELL_SPECIMENS_KEY, 'cell_specimens.json', - typename='file', parent_key='BASEDIR') - mb.add_path(self.STIMULUS_MAPPINGS_KEY, 'stimulus_mappings.json', - typename='file', parent_key='BASEDIR') - mb.add_path(self.EYE_GAZE_DATA_KEY, 'ophys_eye_gaze_mapping/%d_eyetracking_dlc_to_screen_mapping.h5', - typename='file', parent_key='BASEDIR') - - mb.write_json_file(file_name) - - -def _assert_not_string(arg, name): - if isinstance(arg, six.string_types): - raise TypeError( - "Argument '%s' with value '%s' is a string type, but should be a list." % (name, arg)) diff --git a/allensdk/core/brain_observatory_nwb_data_set.py b/allensdk/core/brain_observatory_nwb_data_set.py deleted file mode 100755 index 69729cfc85..0000000000 --- a/allensdk/core/brain_observatory_nwb_data_set.py +++ /dev/null @@ -1,1128 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import functools -import dateutil -import re -import os -import six -import itertools -import logging -from pkg_resources import parse_version - -import h5py -import pandas as pd -import numpy as np - -import allensdk.brain_observatory.roi_masks as roi -from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise -import allensdk.brain_observatory.stimulus_info as si - -from allensdk.brain_observatory.brain_observatory_exceptions import (MissingStimulusException, - NoEyeTrackingException) -from allensdk.api.warehouse_cache.cache import memoize -from allensdk.core import h5_utilities - -from allensdk.brain_observatory.stimulus_info import mask_stimulus_template as si_mask_stimulus_template -from allensdk.brain_observatory.brain_observatory_exceptions import EpochSeparationException - -_STIMULUS_PRESENTATION_PATH = 'stimulus/presentation' -_STIMULUS_PRESENTATION_PATTERNS = ('{}', '{}_stimulus',) - - -def get_epoch_mask_list(st, threshold, max_cuts=2): - '''Convenience function to cut a stim table into multiple epochs - - :param st: input stimtable - :param threshold: threshold on the max duration of a subepoch - :param max_cuts: maximum number of allowed epochs to cut into - :return: epoch_mask_list, a list of indices that define the start and end of sub-epochs - ''' - - if threshold is None: - raise NotImplementedError('threshold not set for this type of session') - - delta = (st.start.values[1:] - st.end.values[:-1]) - cut_inds = np.where(delta > threshold)[0] + 1 - - epoch_mask_list = [] - - if len(cut_inds) > max_cuts: - - # See: https://gist.github.com/nicain/bce66cd073e422f07cf337b476c63be7 - # https://github.com/AllenInstitute/AllenSDK/issues/66 - raise EpochSeparationException('more than 2 epochs cut', delta=delta) - - for ii in range(len(cut_inds)+1): - - if ii == 0: - first_ind = st.iloc[0].start - else: - first_ind = st.iloc[cut_inds[ii-1]].start - - if ii == len(cut_inds): - last_ind_inclusive = st.iloc[-1].end - else: - last_ind_inclusive = st.iloc[cut_inds[ii]-1].end - - epoch_mask_list.append((first_ind,last_ind_inclusive)) - - return epoch_mask_list - - -class BrainObservatoryNwbDataSet(object): - PIPELINE_DATASET = 'brain_observatory_pipeline' - SUPPORTED_PIPELINE_VERSION = "3.0" - - FILE_METADATA_MAPPING = { - 'age': 'general/subject/age', - 'sex': 'general/subject/sex', - 'imaging_depth': 'general/optophysiology/imaging_plane_1/imaging depth', - 'targeted_structure': 'general/optophysiology/imaging_plane_1/location', - 'ophys_experiment_id': 'general/session_id', - 'experiment_container_id': 'general/experiment_container_id', - 'device_string': 'general/devices/2-photon microscope', - 'excitation_lambda': 'general/optophysiology/imaging_plane_1/excitation_lambda', - 'indicator': 'general/optophysiology/imaging_plane_1/indicator', - 'fov': 'general/fov', - 'genotype': 'general/subject/genotype', - 'session_start_time': 'session_start_time', - 'session_type': 'general/session_type', - 'specimen_name': 'general/specimen_name', - 'generated_by': 'general/generated_by' - } - - STIMULUS_TABLE_TYPES = { - 'abstract_feature_series': [si.DRIFTING_GRATINGS, si.STATIC_GRATINGS], - 'indexed_time_series': [si.NATURAL_SCENES, si.LOCALLY_SPARSE_NOISE, - si.LOCALLY_SPARSE_NOISE_4DEG, si.LOCALLY_SPARSE_NOISE_8DEG], - 'repeated_indexed_time_series':[si.NATURAL_MOVIE_ONE, si.NATURAL_MOVIE_TWO, si.NATURAL_MOVIE_THREE] - - } - - # this array was moved before file versioning was in place - MOTION_CORRECTION_DATASETS = [ "MotionCorrection/2p_image_series/xy_translations", - "MotionCorrection/2p_image_series/xy_translation" ] - - def __init__(self, nwb_file): - - self.nwb_file = nwb_file - self.pipeline_version = None - - if os.path.exists(self.nwb_file): - meta = self.get_metadata() - if meta and 'pipeline_version' in meta: - pipeline_version_str = meta['pipeline_version'] - self.pipeline_version = parse_version(pipeline_version_str) - - if self.pipeline_version > parse_version(self.SUPPORTED_PIPELINE_VERSION): - logging.warning("File %s has a pipeline version newer than the version supported by this class (%s vs %s)." - " Please update your AllenSDK." % (nwb_file, pipeline_version_str, self.SUPPORTED_PIPELINE_VERSION)) - - self._stimulus_search = None - - def get_stimulus_epoch_table(self): - '''Returns a pandas dataframe that summarizes the stimulus epoch duration for each acquisition time index in - the experiment - - Parameters - ---------- - None - - Returns - ------- - timestamps: 2D numpy array - Timestamp for each fluorescence sample - - traces: 2D numpy array - Fluorescence traces for each cell - ''' - - - # These are thresholds used by get_epoch_mask_list to set a maximum limit on the delta aqusistion frames to - # count as different trials (rows in the stim table). This helps account for dropped frames, so that they dont - # cause the cutting of an entire experiment into too many stimulus epochs. If these thresholds are too low, - # the assert statment in get_epoch_mask_list will halt execution. In that case, make a bug report!. - threshold_dict = {si.THREE_SESSION_A:32+7, - si.THREE_SESSION_B:15, - si.THREE_SESSION_C:7, - si.THREE_SESSION_C2:7} - - stimulus_table_dict = {} - for stimulus in self.list_stimuli(): - - stimulus_table_dict[stimulus] = self.get_stimulus_table(stimulus) - - if stimulus == si.SPONTANEOUS_ACTIVITY: - stimulus_table_dict[stimulus]['frame'] = 0 - - interval_list = [] - interval_stimulus_dict = {} - for stimulus in self.list_stimuli(): - stimulus_interval_list = get_epoch_mask_list(stimulus_table_dict[stimulus], threshold=threshold_dict.get(self.get_session_type(), None)) - for stimulus_interval in stimulus_interval_list: - interval_stimulus_dict[stimulus_interval] = stimulus - interval_list += stimulus_interval_list - interval_list.sort(key=lambda x: x[0]) - - stimulus_signature_list = ['gap'] - duration_signature_list = [int(interval_list[0][0])] - interval_signature_list = [(0,int(interval_list[0][0]))] - for ii, interval in enumerate(interval_list): - stimulus_signature_list.append(interval_stimulus_dict[interval]) - duration_signature_list.append(int(interval[1] - interval[0])) - interval_signature_list.append((int(interval[0]), int(interval[1]))) - - if ii != len(interval_list)-1: - stimulus_signature_list.append('gap') - duration_signature_list.append((int(interval_list[ii+1][0] - interval_list[ii][1]))) - interval_signature_list.append((int(interval_list[ii][1]), int(interval_list[ii+1][0]))) - - stimulus_signature_list.append('gap') - interval_signature_list.append((int(interval_list[-1][1]), len(self.get_fluorescence_timestamps()))) - duration_signature_list.append(interval_signature_list[-1][1]-interval_signature_list[-1][0]) - - interval_df = pd.DataFrame({'stimulus':stimulus_signature_list, - 'duration':duration_signature_list, - 'interval':interval_signature_list}) - - # Gaps are uninformative; remove them: - interval_df = interval_df[interval_df.stimulus != 'gap'] - interval_df['start'] = [x[0] for x in interval_df['interval'].values] - interval_df['end'] = [x[1] for x in interval_df['interval'].values] - - interval_df.reset_index(inplace=True, drop=True) - interval_df.drop(['interval', 'duration'], axis=1, inplace=True) - return interval_df - - - def get_fluorescence_traces(self, cell_specimen_ids=None): - ''' Returns an array of fluorescence traces for all ROI and - the timestamps for each datapoint - - Parameters - ---------- - cell_specimen_ids: list or array (optional) - List of cell IDs to return traces for. If this is None (default) - then all are returned - - Returns - ------- - timestamps: 2D numpy array - Timestamp for each fluorescence sample - - traces: 2D numpy array - Fluorescence traces for each cell - ''' - timestamps = self.get_fluorescence_timestamps() - with h5py.File(self.nwb_file, 'r') as f: - ds = f['processing'][self.PIPELINE_DATASET][ - 'Fluorescence']['imaging_plane_1']['data'] - - if cell_specimen_ids is None: - cell_traces = ds[()] - else: - inds = self.get_cell_specimen_indices(cell_specimen_ids) - cell_traces = ds[inds, :] - - return timestamps, cell_traces - - def get_fluorescence_timestamps(self): - ''' Returns an array of timestamps in seconds for the fluorescence traces ''' - - with h5py.File(self.nwb_file, 'r') as f: - timestamps = f['processing'][self.PIPELINE_DATASET][ - 'Fluorescence']['imaging_plane_1']['timestamps'][()] - return timestamps - - def get_neuropil_traces(self, cell_specimen_ids=None): - ''' Returns an array of neuropil fluorescence traces for all ROIs - and the timestamps for each datapoint - - Parameters - ---------- - cell_specimen_ids: list or array (optional) - List of cell IDs to return traces for. If this is None (default) - then all are returned - - Returns - ------- - timestamps: 2D numpy array - Timestamp for each fluorescence sample - - traces: 2D numpy array - Neuropil fluorescence traces for each cell - ''' - - timestamps = self.get_fluorescence_timestamps() - - with h5py.File(self.nwb_file, 'r') as f: - if self.pipeline_version >= parse_version("2.0"): - ds = f['processing'][self.PIPELINE_DATASET][ - 'Fluorescence']['imaging_plane_1_neuropil_response']['data'] - else: - ds = f['processing'][self.PIPELINE_DATASET][ - 'Fluorescence']['imaging_plane_1']['neuropil_traces'] - - if cell_specimen_ids is None: - np_traces = ds[()] - else: - inds = self.get_cell_specimen_indices(cell_specimen_ids) - np_traces = ds[inds, :] - - return timestamps, np_traces - - - def get_neuropil_r(self, cell_specimen_ids=None): - ''' Returns a scalar value of r for neuropil correction of flourescence traces - - Parameters - ---------- - cell_specimen_ids: list or array (optional) - List of cell IDs to return traces for. If this is None (default) - then results for all are returned - - Returns - ------- - r: 1D numpy array, len(r)=len(cell_specimen_ids) - Scalar for neuropil subtraction for each cell - ''' - - with h5py.File(self.nwb_file, 'r') as f: - if self.pipeline_version >= parse_version("2.0"): - r_ds = f['processing'][self.PIPELINE_DATASET][ - 'Fluorescence']['imaging_plane_1_neuropil_response']['r'] - else: - r_ds = f['processing'][self.PIPELINE_DATASET][ - 'Fluorescence']['imaging_plane_1']['r'] - - if cell_specimen_ids is None: - r = r_ds[()] - else: - inds = self.get_cell_specimen_indices(cell_specimen_ids) - r = r_ds[inds] - - return r - - def get_demixed_traces(self, cell_specimen_ids=None): - ''' Returns an array of demixed fluorescence traces for all ROIs - and the timestamps for each datapoint - - Parameters - ---------- - cell_specimen_ids: list or array (optional) - List of cell IDs to return traces for. If this is None (default) - then all are returned - - Returns - ------- - timestamps: 2D numpy array - Timestamp for each fluorescence sample - - traces: 2D numpy array - Demixed fluorescence traces for each cell - ''' - - timestamps = self.get_fluorescence_timestamps() - - with h5py.File(self.nwb_file, 'r') as f: - ds = f['processing'][self.PIPELINE_DATASET][ - 'Fluorescence']['imaging_plane_1_demixed_signal']['data'] - if cell_specimen_ids is None: - traces = ds[()] - else: - inds = self.get_cell_specimen_indices(cell_specimen_ids) - traces = ds[inds, :] - - return timestamps, traces - - def get_corrected_fluorescence_traces(self, cell_specimen_ids=None): - ''' Returns an array of demixed and neuropil-corrected fluorescence traces - for all ROIs and the timestamps for each datapoint - - Parameters - ---------- - cell_specimen_ids: list or array (optional) - List of cell IDs to return traces for. If this is None (default) - then all are returned - - Returns - ------- - timestamps: 2D numpy array - Timestamp for each fluorescence sample - - traces: 2D numpy array - Corrected fluorescence traces for each cell - ''' - - # starting in version 2.0, neuropil correction follows trace demixing - if self.pipeline_version >= parse_version("2.0"): - timestamps, cell_traces = self.get_demixed_traces(cell_specimen_ids) - else: - timestamps, cell_traces = self.get_fluorescence_traces(cell_specimen_ids) - - r = self.get_neuropil_r(cell_specimen_ids) - - _, neuropil_traces = self.get_neuropil_traces(cell_specimen_ids) - - fc = cell_traces - neuropil_traces * r[:, np.newaxis] - - return timestamps, fc - - def get_cell_specimen_indices(self, cell_specimen_ids): - ''' Given a list of cell specimen ids, return their index based on their order in this file. - - Parameters - ---------- - cell_specimen_ids: list of cell specimen ids - - ''' - - all_cell_specimen_ids = list(self.get_cell_specimen_ids()) - - try: - inds = [list(all_cell_specimen_ids).index(i) - for i in cell_specimen_ids] - except ValueError as e: - raise ValueError("Cell specimen not found (%s)" % str(e)) - - return inds - - def get_dff_traces(self, cell_specimen_ids=None): - ''' Returns an array of dF/F traces for all ROIs and - the timestamps for each datapoint - - Parameters - ---------- - cell_specimen_ids: list or array (optional) - List of cell IDs to return data for. If this is None (default) - then all are returned - - Returns - ------- - timestamps: 2D numpy array - Timestamp for each fluorescence sample - - dF/F: 2D numpy array - dF/F values for each cell - ''' - with h5py.File(self.nwb_file, 'r') as f: - dff_ds = f['processing'][self.PIPELINE_DATASET][ - 'DfOverF']['imaging_plane_1'] - - timestamps = dff_ds['timestamps'][()] - - if cell_specimen_ids is None: - cell_traces = dff_ds['data'][()] - else: - inds = self.get_cell_specimen_indices(cell_specimen_ids) - cell_traces = dff_ds['data'][inds, :] - - return timestamps, cell_traces - - def get_roi_ids(self): - ''' Returns an array of IDs for all ROIs in the file - - Returns - ------- - ROI IDs: list - ''' - with h5py.File(self.nwb_file, 'r') as f: - roi_id = f['processing'][self.PIPELINE_DATASET][ - 'ImageSegmentation']['roi_ids'][()] - return roi_id - - def get_cell_specimen_ids(self): - ''' Returns an array of cell IDs for all cells in the file - - Returns - ------- - cell specimen IDs: list - ''' - with h5py.File(self.nwb_file, 'r') as f: - cell_id = f['processing'][self.PIPELINE_DATASET][ - 'ImageSegmentation']['cell_specimen_ids'][()] - return cell_id - - def get_session_type(self): - ''' Returns the type of experimental session, presently one of the - following: three_session_A, three_session_B, three_session_C - - Returns - ------- - session type: string - ''' - with h5py.File(self.nwb_file, 'r') as f: - session_type = f['general/session_type'][()] - return session_type.decode('utf-8') - - def get_max_projection(self): - '''Returns the maximum projection image for the 2P movie. - - Returns - ------- - max projection: np.ndarray - ''' - - with h5py.File(self.nwb_file, 'r') as f: - max_projection = f['processing'][self.PIPELINE_DATASET]['ImageSegmentation'][ - 'imaging_plane_1']['reference_images']['maximum_intensity_projection_image']['data'][()] - return max_projection - - def list_stimuli(self): - ''' Return a list of the stimuli presented in the experiment. - - Returns - ------- - stimuli: list of strings - ''' - - with h5py.File(self.nwb_file, 'r') as f: - keys = list(f["stimulus/presentation/"].keys()) - return [ k.replace('_stimulus', '') for k in keys ] - - - def _get_master_stimulus_table(self): - ''' Builds a table for all stimuli by concatenating (vertically) the - sub-tables describing presentation of each stimulus - ''' - - epoch_table = self.get_stimulus_epoch_table() - - stimulus_table_dict = {} - for stimulus in self.list_stimuli(): - stimulus_table_dict[stimulus] = self.get_stimulus_table(stimulus) - - table_list = [] - for stimulus in self.list_stimuli(): - curr_stimtable = stimulus_table_dict[stimulus] - - for _, row in epoch_table[epoch_table['stimulus'] == stimulus].iterrows(): - - epoch_start_ind, epoch_end_ind = row['start'], row['end'] - curr_subtable = curr_stimtable[(epoch_start_ind <= curr_stimtable['start']) & - (curr_stimtable['end'] <= epoch_end_ind)].copy() - curr_subtable['stimulus'] = stimulus - table_list.append(curr_subtable) - - new_table = pd.concat(table_list, sort=True) - new_table.reset_index(drop=True, inplace=True) - - return new_table - - - def get_stimulus_table(self, stimulus_name): - ''' Return a stimulus table given a stimulus name - - Notes - ----- - For more information, see: - http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf - - ''' - - if stimulus_name == 'master': - return self._get_master_stimulus_table() - - with h5py.File(self.nwb_file, 'r') as nwb_file: - - stimulus_group = _find_stimulus_presentation_group(nwb_file, stimulus_name) - - if stimulus_name in self.STIMULUS_TABLE_TYPES['abstract_feature_series']: - datasets = h5_utilities.load_datasets_by_relnames( - ['data', 'features', 'frame_duration'], nwb_file, stimulus_group) - return _make_abstract_feature_series_stimulus_table( - datasets['data'], h5_utilities.decode_bytes(datasets['features']), datasets['frame_duration']) - - if stimulus_name in self.STIMULUS_TABLE_TYPES['indexed_time_series']: - datasets = h5_utilities.load_datasets_by_relnames(['data', 'frame_duration'], nwb_file, stimulus_group) - return _make_indexed_time_series_stimulus_table(datasets['data'], datasets['frame_duration']) - - if stimulus_name in self.STIMULUS_TABLE_TYPES['repeated_indexed_time_series']: - datasets = h5_utilities.load_datasets_by_relnames(['data', 'frame_duration'], nwb_file, stimulus_group) - return _make_repeated_indexed_time_series_stimulus_table(datasets['data'], datasets['frame_duration']) - - if stimulus_name == 'spontaneous': - datasets = h5_utilities.load_datasets_by_relnames(['data', 'frame_duration'], nwb_file, stimulus_group) - return _make_spontaneous_activity_stimulus_table(datasets['data'], datasets['frame_duration']) - - raise IOError("Could not find a stimulus table named '%s'" % stimulus_name) - - - @memoize - def get_stimulus_template(self, stimulus_name): - ''' Return an array of the stimulus template for the specified stimulus. - - Parameters - ---------- - stimulus_name: string - Must be one of the strings returned by list_stimuli(). - - Returns - ------- - stimulus table: pd.DataFrame - ''' - stim_name = stimulus_name + "_image_stack" - with h5py.File(self.nwb_file, 'r') as f: - image_stack = f['stimulus']['templates'][stim_name]['data'][()] - return image_stack - - def get_locally_sparse_noise_stimulus_template(self, - stimulus, - mask_off_screen=True): - ''' Return an array of the stimulus template for the specified stimulus. - - Parameters - ---------- - stimulus: string - Which locally sparse noise stimulus to retrieve. Must be one of: - stimulus_info.LOCALLY_SPARSE_NOISE - stimulus_info.LOCALLY_SPARSE_NOISE_4DEG - stimulus_info.LOCALLY_SPARSE_NOISE_8DEG - - mask_off_screen: boolean - Set off-screen regions of the stimulus to LocallySparseNoise.LSN_OFF_SCREEN. - - Returns - ------- - tuple: (template, off-screen mask) - ''' - - if stimulus not in si.LOCALLY_SPARSE_NOISE_DIMENSIONS: - raise KeyError("%s is not a known locally sparse noise stimulus" % stimulus) - - template = self.get_stimulus_template(stimulus) - - # build mapping from template coordinates to display coordinates - template_shape = si.LOCALLY_SPARSE_NOISE_DIMENSIONS[stimulus] - template_shape = [ template_shape[1], template_shape[0] ] - - template_display_shape = (1260, 720) - display_shape = (1920, 1200) - - scale = [ - float(template_shape[0]) / float(template_display_shape[0]), - float(template_shape[1]) / float(template_display_shape[1]) - ] - offset = [ - -(display_shape[0] - template_display_shape[0]) * 0.5, - -(display_shape[1] - template_display_shape[1]) * 0.5 - ] - - x, y = np.meshgrid(np.arange(display_shape[0]), np.arange( - display_shape[1]), indexing='ij') - template_display_coords = np.array([(x + offset[0]) * scale[0] - 0.5, - (y + offset[1]) * scale[1] - 0.5], - dtype=float) - template_display_coords = np.rint(template_display_coords).astype(int) - - # build mask - template_mask, template_frac = si_mask_stimulus_template( - template_display_coords, template_shape) - - if mask_off_screen: - template[:, ~template_mask.T] = LocallySparseNoise.LSN_OFF_SCREEN - - return template, template_mask.T - - def get_roi_mask_array(self, cell_specimen_ids=None): - ''' Return a numpy array containing all of the ROI masks for requested cells. - If cell_specimen_ids is omitted, return all masks. - - Parameters - ---------- - cell_specimen_ids: list - List of cell specimen ids. Default None. - - Returns - ------- - np.ndarray: NxWxH array, where N is number of cells - ''' - - roi_masks = self.get_roi_mask(cell_specimen_ids) - - if len(roi_masks) == 0: - raise IOError("no masks found for given cell specimen ids") - - roi_arr = roi.create_roi_mask_array(roi_masks) - - return roi_arr - - def get_roi_mask(self, cell_specimen_ids=None): - ''' Returns an array of all the ROI masks - - Parameters - ---------- - cell specimen IDs: list or array (optional) - List of cell IDs to return traces for. If this is None (default) - then all are returned - - Returns - ------- - List of ROI_Mask objects - ''' - - with h5py.File(self.nwb_file, 'r') as f: - mask_loc = f['processing'][self.PIPELINE_DATASET][ - 'ImageSegmentation']['imaging_plane_1'] - roi_list = f['processing'][self.PIPELINE_DATASET][ - 'ImageSegmentation']['imaging_plane_1']['roi_list'][()] - - inds = None - if cell_specimen_ids is None: - inds = range(self.number_of_cells) - else: - inds = self.get_cell_specimen_indices(cell_specimen_ids) - - roi_array = [] - for i in inds: - v = roi_list[i] - roi_mask = mask_loc[v]["img_mask"][()] - m = roi.create_roi_mask(roi_mask.shape[1], roi_mask.shape[0], - [0, 0, 0, 0], roi_mask=roi_mask, label=v) - roi_array.append(m) - - return roi_array - - @property - def number_of_cells(self): - '''Number of cells in the experiment''' - - # Replace here is there is a better way to get this info: - return len(self.get_cell_specimen_ids()) - - - def get_metadata(self): - ''' Returns a dictionary of meta data associated with each - experiment, including Cre line, specimen number, - visual area imaged, imaging depth - - Returns - ------- - metadata: dictionary - ''' - - meta = {} - - with h5py.File(self.nwb_file, 'r') as f: - for memory_key, disk_key in BrainObservatoryNwbDataSet.FILE_METADATA_MAPPING.items(): - try: - v = f[disk_key][()] - - # convert numpy strings to python strings - if v.dtype.type is np.string_: - if len(v.shape) == 0: - v = v.decode('UTF-8') - elif len(v.shape) == 1: - v = [ s.decode('UTF-8') for s in v ] - else: - raise Exception("Unrecognized metadata formatting for field %s" % disk_key) - - meta[memory_key] = v - except KeyError as e: - logging.warning("could not find key %s", disk_key) - - # extract cre line from genotype string - genotype = meta.get('genotype') - meta['cre_line'] = meta['genotype'].split(';')[0] if genotype else None - - imaging_depth = meta.pop('imaging_depth', None) - meta['imaging_depth_um'] = int(imaging_depth.split()[0]) if imaging_depth else None - - ophys_experiment_id = meta.get('ophys_experiment_id') - meta['ophys_experiment_id'] = int(ophys_experiment_id) if ophys_experiment_id else None - - experiment_container_id = meta.get('experiment_container_id') - meta['experiment_container_id'] = int(experiment_container_id) if experiment_container_id else None - - # convert start time to a date object - session_start_time = meta.get('session_start_time') - if isinstance( session_start_time, six.string_types ): - meta['session_start_time'] = dateutil.parser.parse(session_start_time) - - age = meta.pop('age', None) - if age: - # parse the age in days - m = re.match("(.*?) days", age) - if m: - meta['age_days'] = int(m.groups()[0]) - else: - raise IOError("Could not parse age.") - - - # parse the device string (ugly, sorry) - device_string = meta.pop('device_string', None) - if device_string: - m = re.match("(.*?)\.\s(.*?)\sPlease*", device_string) - if m: - device, device_name = m.groups() - meta['device'] = device - meta['device_name'] = device_name - else: - raise IOError("Could not parse device string.") - - # file version - generated_by = meta.pop('generated_by', None) - version = generated_by[-1] if generated_by else "0.9" - meta["pipeline_version"] = version - - return meta - - def get_running_speed(self): - ''' Returns the mouse running speed in cm/s - ''' - with h5py.File(self.nwb_file, 'r') as f: - dx_ds = f['processing'][self.PIPELINE_DATASET][ - 'BehavioralTimeSeries']['running_speed'] - dxcm = dx_ds['data'][()] - dxtime = dx_ds['timestamps'][()] - - timestamps = self.get_fluorescence_timestamps() - - # v0.9 stored this as an Nx1 array instead of a flat 1-d array - if len(dxcm.shape) == 2: - dxcm = dxcm[:, 0] - - dxcm, dxtime = align_running_speed(dxcm, dxtime, timestamps) - - return dxcm, dxtime - - def get_pupil_location(self, as_spherical=True): - '''Returns the x, y pupil location. - - Parameters - ---------- - as_spherical : bool - Whether to return the location as spherical (default) or - not. If true, the result is altitude and azimuth in - degrees, otherwise it is x, y in centimeters. (0,0) is - the center of the monitor. - - Returns - ------- - (timestamps, location) - Timestamps is an (Nx1) array of timestamps in seconds. - Location is an (Nx2) array of spatial location. - ''' - if as_spherical: - location_key = "pupil_location_spherical" - else: - location_key = "pupil_location" - try: - with h5py.File(self.nwb_file, 'r') as f: - eye_tracking = f['processing'][self.PIPELINE_DATASET][ - 'EyeTracking'][location_key] - pupil_location = eye_tracking['data'][()] - pupil_times = eye_tracking['timestamps'][()] - except KeyError: - raise NoEyeTrackingException("No eye tracking for this experiment.") - - return pupil_times, pupil_location - - def get_pupil_size(self): - '''Returns the pupil area in pixels. - - Returns - ------- - (timestamps, areas) - Timestamps is an (Nx1) array of timestamps in seconds. - Areas is an (Nx1) array of pupil areas in pixels. - ''' - try: - with h5py.File(self.nwb_file, 'r') as f: - pupil_tracking = f['processing'][self.PIPELINE_DATASET][ - 'PupilTracking']['pupil_size'] - pupil_size = pupil_tracking['data'][()] - pupil_times = pupil_tracking['timestamps'][()] - except KeyError: - raise NoEyeTrackingException("No pupil tracking for this experiment.") - - return pupil_times, pupil_size - - def get_motion_correction(self): - ''' Returns a Panda DataFrame containing the x- and y- translation of each image used for image alignment - ''' - - motion_correction = None - with h5py.File(self.nwb_file, 'r') as f: - pipeline_ds = f['processing'][self.PIPELINE_DATASET] - - # pipeline 0.9 stores this in xy_translations - # pipeline 1.0 stores this in xy_translation - for mc_ds_name in self.MOTION_CORRECTION_DATASETS: - try: - mc_ds = pipeline_ds[mc_ds_name] - - motion_log = mc_ds['data'][()] - motion_time = mc_ds['timestamps'][()] - motion_names = mc_ds['feature_description'][()] - - motion_correction = pd.DataFrame(motion_log, columns=motion_names) - motion_correction['timestamp'] = motion_time - - # break out if we found it - break - except KeyError as e: - pass - - if motion_correction is None: - raise KeyError("Could not find motion correction data.") - - # Python3 compatibility: - rename_dict = {} - for c in motion_correction.columns: - if not isinstance(c, str): - rename_dict[c] = c.decode("utf-8") - motion_correction.rename(columns=rename_dict, inplace=True) - - return motion_correction - - def save_analysis_dataframes(self, *tables): - store = pd.HDFStore(self.nwb_file, mode='a') - for k, v in tables: - store.put('analysis/%s' % (k), v) - store.close() - - def save_analysis_arrays(self, *datasets): - with h5py.File(self.nwb_file, 'a') as f: - for k, v in datasets: - if k in f['analysis']: - del f['analysis'][k] - f.create_dataset('analysis/%s' % k, data=v) - - @property - def stimulus_search(self): - - if self._stimulus_search is None: - self._stimulus_search = si.StimulusSearch(self) - return self._stimulus_search - - def get_stimulus(self, frame_ind): - - search_result = self.stimulus_search.search(frame_ind) - - if search_result is None or search_result[2]['stimulus'] == si.SPONTANEOUS_ACTIVITY: - return None, None - - else: - - curr_stimulus = search_result[2]['stimulus'] - if curr_stimulus in si.LOCALLY_SPARSE_NOISE_STIMULUS_TYPES + si.NATURAL_MOVIE_STIMULUS_TYPES + [si.NATURAL_SCENES]: - curr_frame = search_result[2]['frame'] - return search_result, self.get_stimulus_template(curr_stimulus)[int(curr_frame), :, :] - elif curr_stimulus == si.STATIC_GRATINGS or curr_stimulus == si.DRIFTING_GRATINGS: - return search_result, None - - -def _find_stimulus_presentation_group(nwb_file, - stimulus_name, - base_path=_STIMULUS_PRESENTATION_PATH, - group_patterns=_STIMULUS_PRESENTATION_PATTERNS): - ''' Searches an NWB file for a stimulus presentation group. - - Parameters - ---------- - nwb_file : h5py.File - File to search - stimulus_name : str - Identifier for this stimulus. Corresponds to the relative name of its h5 - group. - base_path : str, optional - Begin the search from here. Defaults to 'stimulus/presentation' - group_patterns : array-like of str, optional - Patterns for the relative name of the stimulus' h5 group. Defaults to - the name, and the name suffixed by '_stimulus' - - Returns - ------- - h5py.Group, h5py.Dataset : - h5 object found - - ''' - - group_candidates = [ pattern.format(stimulus_name) for pattern in group_patterns ] - matcher = functools.partial(h5_utilities.h5_object_matcher_relname_in, group_candidates) - matches = h5_utilities.locate_h5_objects(matcher, nwb_file, base_path) - - if len(matches) == 0: - raise MissingStimulusException( - 'Unable to locate stimulus: {}. ' - 'Looked for this stimulus under the names: {} '.format(stimulus_name, group_candidates) - ) - - if len(matches) > 1: - raise MissingStimulusException( - 'Unable to locate stimulus: {}. ' - 'Found multiple matching stimuli: {}'.format(stimulus_name, [match.name for match in matches]) - ) - - return matches[0] - - -def align_running_speed(dxcm, dxtime, timestamps): - ''' If running speed timestamps differ from fluorescence - timestamps, adjust by inserting NaNs to running speed. - - Returns - ------- - tuple: dxcm, dxtime - ''' - if dxtime[0] != timestamps[0]: - adjust = np.where(timestamps == dxtime[0])[0][0] - dxtime = np.insert(dxtime, 0, timestamps[:adjust]) - dxcm = np.insert(dxcm, 0, np.repeat(np.NaN, adjust)) - adjust = len(timestamps) - len(dxtime) - if adjust > 0: - dxtime = np.append(dxtime, timestamps[(-1 * adjust):]) - dxcm = np.append(dxcm, np.repeat(np.NaN, adjust)) - - return dxcm, dxtime - - -def _make_abstract_feature_series_stimulus_table(stim_data, features, frame_dur): - ''' Return the a stimulus table for an abstract feature series. - - Parameters - ---------- - stim_data : array-like - Stimulus feature values at each interval - features : array-like of str - Stimulus feature labels - frame_dur : array-like - Start and end times of presentation intervals - - Returns - ------- - stimulus table : pd.DataFrame - Describes the intervals of presentation of the stimulus - - Notes - ----- - For more information, see: - http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf - - ''' - - stimulus_table = pd.DataFrame(stim_data, columns=features) - stimulus_table.loc[:, 'start'] = frame_dur[:, 0].astype(int) - stimulus_table.loc[:, 'end'] = frame_dur[:, 1].astype(int) - - stimulus_table = stimulus_table.sort_values(['start', 'end']) - return stimulus_table - - -def _make_indexed_time_series_stimulus_table(inds, frame_dur): - ''' Return the a stimulus table for an indexed time series. - - Parameters - ---------- - inds : - frame_durations : np.ndarray - start and stop times (s) of frames - - Returns - ------- - stimulus table : pd.DataFrame - Describes the intervals of presentation of the stimulus - - Notes - ----- - For more information, see: - http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf - - ''' - - stimulus_table = pd.DataFrame(inds, columns=['frame']) - stimulus_table.loc[:, 'start'] = frame_dur[:, 0].astype(int) - stimulus_table.loc[:, 'end'] = frame_dur[:, 1].astype(int) - - stimulus_table = stimulus_table.sort_values(['start', 'end']) - return stimulus_table - - -def _make_repeated_indexed_time_series_stimulus_table(inds, frame_dur): - - stimulus_table = _make_indexed_time_series_stimulus_table(inds, frame_dur) - a = stimulus_table.groupby(by='frame') - - # If this ever occurs, the repeat counter cant be trusted! - assert np.floor(len(stimulus_table))/len(a) == int(len(stimulus_table))/len(a) - - stimulus_table['repeat'] = np.repeat(range(len(stimulus_table)//len(a)), len(a)) - - return stimulus_table - - -def _make_spontaneous_activity_stimulus_table(events, frame_durations): - ''' Builds a table describing the start and end times of the spontaneous viewing - intervals. - - Parameters - ---------- - events : np.ndarray - events data - frame_durations : np.ndarray - start and stop times (s) of frames - - Returns - ------- - pd.DataFrame : - Each row describes an interval of spontaneous viewing. Columns are start and end times. - - Notes - ----- - For more information, see: - http://help.brain-map.org/display/observatory/Documentation?preview=/10616846/10813485/VisualCoding_VisualStimuli.pdf - - ''' - - start_inds = np.where(events == 1) - stop_inds = np.where(events == -1) - - if len(start_inds) != len(stop_inds): - raise Exception( - "inconsistent start and time times in spontaneous activity stimulus table") - - stim_data = np.column_stack([ - frame_durations[start_inds, 0].T, - frame_durations[stop_inds, 0].T] - ).astype(int) - - stimulus_table = pd.DataFrame(stim_data, columns=['start', 'end']) - stimulus_table = stimulus_table.sort_values(['start', 'end']) - - return stimulus_table - - diff --git a/allensdk/core/cache_method_utilities.py b/allensdk/core/cache_method_utilities.py deleted file mode 100644 index a487852fd4..0000000000 --- a/allensdk/core/cache_method_utilities.py +++ /dev/null @@ -1,18 +0,0 @@ -import inspect - - -class CachedInstanceMethodMixin(object): - def cache_clear(self): - """ - Calls `cache_clear` method on all bound methods in this instance - (where valid). - Intended to clear calls cached with the `memoize` decorator. - Note that this will also clear functions decorated with `lru_cache` and - `lfu_cache` in this class (or any other function with `cache_clear` - attribute). - """ - for _, method in inspect.getmembers(self, inspect.ismethod): - try: - method.cache_clear() - except (AttributeError, TypeError): - pass diff --git a/allensdk/core/cell_types_cache.py b/allensdk/core/cell_types_cache.py deleted file mode 100644 index 7062771564..0000000000 --- a/allensdk/core/cell_types_cache.py +++ /dev/null @@ -1,419 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -from six import string_types - -from allensdk.config.manifest_builder import ManifestBuilder -from allensdk.api.warehouse_cache.cache import Cache, get_default_manifest_file -from allensdk.api.queries.cell_types_api import CellTypesApi - -from . import json_utilities as json_utilities -from .nwb_data_set import NwbDataSet -from . import swc - -import logging -import warnings -import pandas as pd - - -class CellTypesCache(Cache): - """ - Cache class for storing and accessing data from the Cell Types Database. - By default, this class will cache any downloaded metadata or files in - well known locations defined in a manifest file. This behavior can be - disabled. - - Attributes - ---------- - - api: CellTypesApi instance - The object used for making API queries related to the Cell Types Database - - Parameters - ---------- - - cache: boolean - Whether the class should save results of API queries to locations specified - in the manifest file. Queries for files (as opposed to metadata) must have a - file location. If caching is disabled, those locations must be specified - in the function call (e.g. get_ephys_data(file_name='file.nwb')). - - manifest_file: string - File name of the manifest to be read. Default is "cell_types_manifest.json". - """ - - # manifest keys - CELLS_KEY = 'CELLS' - EPHYS_FEATURES_KEY = 'EPHYS_FEATURES' - MORPHOLOGY_FEATURES_KEY = 'MORPHOLOGY_FEATURES' - EPHYS_DATA_KEY = 'EPHYS_DATA' - EPHYS_SWEEPS_KEY = 'EPHYS_SWEEPS' - RECONSTRUCTION_KEY = 'RECONSTRUCTION' - MARKER_KEY = 'MARKER' - MANIFEST_VERSION = "1.1" - - def __init__(self, cache=True, manifest_file=None, base_uri=None): - - if manifest_file is None: - manifest_file = get_default_manifest_file('cell_types') - - super(CellTypesCache, self).__init__( - manifest=manifest_file, cache=cache, version=self.MANIFEST_VERSION) - self.api = CellTypesApi(base_uri=base_uri) - - def get_cells(self, file_name=None, - require_morphology=False, - require_reconstruction=False, - reporter_status=None, - species=None, - simple=True): - """ - Download metadata for all cells in the database and optionally return a - subset filtered by whether or not they have a morphology or reconstruction. - - Parameters - ---------- - - file_name: string - File name to save/read the cell metadata as JSON. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - require_morphology: boolean - Filter out cells that have no morphological images. - - require_reconstruction: boolean - Filter out cells that have no morphological reconstructions. - - reporter_status: list - Filter for cells that have one or more cell reporter statuses. - - species: list - Filter for cells that belong to one or more species. If None, return all. - Must be one of [ CellTypesApi.MOUSE, CellTypesApi.HUMAN ]. - """ - - file_name = self.get_cache_path(file_name, self.CELLS_KEY) - - cells = self.api.list_cells_api(path=file_name, - strategy='lazy', - **Cache.cache_json()) - - if isinstance(reporter_status, string_types): - reporter_status = [reporter_status] - - # filter the cells on the way out - cells = self.api.filter_cells_api(cells, - require_morphology, - require_reconstruction, - reporter_status, - species, - simple) - - - return cells - - - - - def get_ephys_sweeps(self, specimen_id, file_name=None): - """ - Download sweep metadata for a single cell specimen. - - Parameters - ---------- - - specimen_id: int - ID of a cell. - """ - - file_name = self.get_cache_path( - file_name, self.EPHYS_SWEEPS_KEY, specimen_id) - - sweeps = self.api.get_ephys_sweeps(specimen_id, - strategy='lazy', - path=file_name, - **Cache.cache_json()) - - return sweeps - - def get_ephys_features(self, dataframe=False, file_name=None): - """ - Download electrophysiology features for all cells in the database. - - Parameters - ---------- - - file_name: string - File name to save/read the ephys features metadata as CSV. - If file_name is None, the file_name will be pulled out of the - manifest. If caching is disabled, no file will be saved. - Default is None. - - dataframe: boolean - Return the output as a Pandas DataFrame. If False, return - a list of dictionaries. - """ - file_name = self.get_cache_path(file_name, self.EPHYS_FEATURES_KEY) - - if self.cache: - if dataframe: - warnings.warn("dataframe argument is deprecated.") - args = Cache.cache_csv_dataframe() - else: - args = Cache.cache_csv_json() - args['strategy'] = 'lazy' - else: - args = Cache.nocache_json() - - features_df = self.api.get_ephys_features(path=file_name, - **args) - - return features_df - - - def get_morphology_features(self, dataframe=False, file_name=None): - """ - Download morphology features for all cells with reconstructions in the database. - - Parameters - ---------- - - file_name: string - File name to save/read the ephys features metadata as CSV. - If file_name is None, the file_name will be pulled out of the - manifest. If caching is disabled, no file will be saved. - Default is None. - - dataframe: boolean - Return the output as a Pandas DataFrame. If False, return - a list of dictionaries. - """ - - file_name = self.get_cache_path( - file_name, self.MORPHOLOGY_FEATURES_KEY) - - if self.cache: - if dataframe: - warnings.warn("dataframe argument is deprecated.") - args = Cache.cache_csv_dataframe() - else: - args = Cache.cache_csv_json() - else: - args = Cache.nocache_json() - - args['strategy'] = 'lazy' - args['path'] = file_name - - return self.api.get_morphology_features(**args) - - - def get_all_features(self, dataframe=False, require_reconstruction=True): - """ - Download morphology and electrophysiology features for all cells and merge them - into a single table. - - Parameters - ---------- - - dataframe: boolean - Return the output as a Pandas DataFrame. If False, return - a list of dictionaries. - - require_reconstruction: boolean - Only return ephys and morphology features for cells that have - reconstructions. Default True. - """ - - ephys_features = pd.DataFrame(self.get_ephys_features()) - morphology_features = pd.DataFrame(self.get_morphology_features()) - - how = 'inner' if require_reconstruction else 'outer' - - all_features = ephys_features.merge(morphology_features, - how=how, - on='specimen_id') - - if dataframe: - warnings.warn("dataframe argument is deprecated.") - return all_features - else: - return all_features.to_dict('records') - - def get_ephys_data(self, specimen_id, file_name=None): - """ - Download electrophysiology traces for a single cell in the database. - - Parameters - ---------- - - specimen_id: int - The ID of a cell specimen to download. - - file_name: string - File name to save/read the ephys features metadata as CSV. - If file_name is None, the file_name will be pulled out of the - manifest. If caching is disabled, no file will be saved. - Default is None. - - Returns - ------- - NwbDataSet - A class instance with helper methods for retrieving stimulus - and response traces out of an NWB file. - """ - - file_name = self.get_cache_path( - file_name, self.EPHYS_DATA_KEY, specimen_id) - - self.api.save_ephys_data(specimen_id, file_name, strategy='lazy') - - return NwbDataSet(file_name) - - def get_reconstruction(self, specimen_id, file_name=None): - """ - Download and open a reconstruction for a single cell in the database. - - Parameters - ---------- - - specimen_id: int - The ID of a cell specimen to download. - - file_name: string - File name to save/read the reconstruction SWC. - If file_name is None, the file_name will be pulled out of the - manifest. If caching is disabled, no file will be saved. - Default is None. - - Returns - ------- - Morphology - A class instance with methods for accessing morphology compartments. - """ - - file_name = self.get_cache_path( - file_name, self.RECONSTRUCTION_KEY, specimen_id) - - if file_name is None: - raise Exception( - "Please enable caching (CellTypes.cache = True) or specify a save_file_name.") - - if not os.path.exists(file_name): - self.api.save_reconstruction(specimen_id, file_name) - - return swc.read_swc(file_name) - - def get_reconstruction_markers(self, specimen_id, file_name=None): - """ - Download and open a reconstruction marker file for a single cell in the database. - - Parameters - ---------- - - specimen_id: int - The ID of a cell specimen to download. - - file_name: string - File name to save/read the reconstruction marker. - If file_name is None, the file_name will be pulled out of the - manifest. If caching is disabled, no file will be saved. - Default is None. - - Returns - ------- - Morphology - A class instance with methods for accessing morphology compartments. - """ - - file_name = self.get_cache_path( - file_name, self.MARKER_KEY, specimen_id) - - if file_name is None: - raise Exception( - "Please enable caching (CellTypes.cache = True) or specify a save_file_name.") - - if not os.path.exists(file_name): - try: - self.api.save_reconstruction_markers(specimen_id, file_name) - except LookupError as e: - logging.warning(e.args) - return [] - - return swc.read_marker_file(file_name) - - def build_manifest(self, file_name): - """ - Construct a manifest for this Cache class and save it in a file. - - Parameters - ---------- - - file_name: string - File location to save the manifest. - - """ - - mb = ManifestBuilder() - mb.set_version(self.MANIFEST_VERSION) - mb.add_path('BASEDIR', '.') - mb.add_path(self.CELLS_KEY, 'cells.json', - typename='file', parent_key='BASEDIR') - mb.add_path(self.EPHYS_DATA_KEY, 'specimen_%d/ephys.nwb', - typename='file', parent_key='BASEDIR') - mb.add_path(self.EPHYS_FEATURES_KEY, 'ephys_features.csv', - typename='file', parent_key='BASEDIR') - mb.add_path(self.MORPHOLOGY_FEATURES_KEY, 'morphology_features.csv', - typename='file', parent_key='BASEDIR') - mb.add_path(self.RECONSTRUCTION_KEY, 'specimen_%d/reconstruction.swc', - typename='file', parent_key='BASEDIR') - mb.add_path(self.MARKER_KEY, 'specimen_%d/reconstruction.marker', - typename='file', parent_key='BASEDIR') - mb.add_path(self.EPHYS_SWEEPS_KEY, 'specimen_%d/ephys_sweeps.json', - typename='file', parent_key='BASEDIR') - - mb.write_json_file(file_name) - - -class ReporterStatus: - """ - Valid strings for filtering by cell reporter status. - """ - - POSITIVE = 'positive' - NEGATIVE = 'negative' - NA = None - INDETERMINATE = None diff --git a/allensdk/core/dat_utilities.py b/allensdk/core/dat_utilities.py deleted file mode 100644 index 36f8d4d8fe..0000000000 --- a/allensdk/core/dat_utilities.py +++ /dev/null @@ -1,58 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy - - -class DatUtilities(object): - - @classmethod - def save_voltage(cls, output_path, v, t): - '''Save a single voltage output result into a simple text format. - - The output file is one t v pair per line. - - Parameters - ---------- - output_path : string - file name for output - v : numpy array - voltage - t : numpy array - time - ''' - data = numpy.transpose(numpy.vstack((t, v))) - with open(output_path, "w") as f: - numpy.savetxt(f, data) diff --git a/allensdk/core/exceptions.py b/allensdk/core/exceptions.py deleted file mode 100644 index 94dc8f028c..0000000000 --- a/allensdk/core/exceptions.py +++ /dev/null @@ -1,26 +0,0 @@ -class DataFrameKeyError(LookupError): - """More verbose method for accessing invalid rows or columns - in a dataframe. Should be used when a keyerror is thrown on a dataframe. - """ - def __init__(self, msg, caught_exception=None): - if caught_exception: - error_string = "{}\nCaught Exception: {}".format(msg, caught_exception) - else: - error_string = msg - super().__init__(error_string) - - -class DataFrameIndexError(LookupError): - """More verbose method for accessing invalid rows or columns - in a dataframe. Should be used when an index error is thrown on a dataframe. - """ - def __init__(self, msg, caught_exception=None): - if caught_exception: - error_string = "{}\nCaught Exception: {}".format(msg, caught_exception) - else: - error_string = msg - super().__init__(error_string) - - -class MissingDataError(ValueError): - pass diff --git a/allensdk/core/h5_utilities.py b/allensdk/core/h5_utilities.py deleted file mode 100644 index 5e82d59c3f..0000000000 --- a/allensdk/core/h5_utilities.py +++ /dev/null @@ -1,128 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import functools -import six - -import h5py - - -def decode_bytes(bytes_dataset, encoding='UTF-8'): - ''' Convert the elements of a dataset of bytes to str - ''' - - return [ item.decode(encoding) for item in bytes_dataset[:].flat ] - - -def load_datasets_by_relnames(relnames, h5_file, start_node): - ''' A convenience function for finding and loading into memory one or more - datasets from an h5 file - ''' - - matcher_cbs = { - relname: functools.partial(h5_object_matcher_relname_in, [relname]) - for relname in relnames - } - - matches = keyed_locate_h5_objects(matcher_cbs, h5_file, start_node=start_node) - return { key: value[:] for key, value in six.iteritems(matches) } - - -def h5_object_matcher_relname_in(relnames, h5_object_name, h5_object): - ''' Asks if an h5 object's relative name (the final section of its absolute name) - is contained within a provided array - - Parameters - ---------- - relnames : array-like - Relative names against which to match - h5_object_name : str - Full name (path from origin) of h5 object - h5_object : h5py.Group, h5py.Dataset - Check this object's relative name - - Returns - ------- - bool : - whether the match succeeded - h5_object : h5py.group, h5py.Dataset - the argued object - - ''' - - return h5_object_name.split('/')[-1] in relnames, h5_object - - -def keyed_locate_h5_objects(matcher_cbs, h5_file, start_node=None): - ''' Traverse an h5 file and build up a dictionary mapping supplied keys to - located objects - ''' - - matches = {} - def matcher(obj_name, obj): - for key, matcher_cb in six.iteritems(matcher_cbs): - match, _ = matcher_cb(obj_name, obj) - if match: - matches[key] = obj - - traverse_h5_file(matcher, h5_file, start_node) - return matches - - -def locate_h5_objects(matcher_cb, h5_file, start_node=None): - ''' Traverse an h5 file and return objects matching supplied criteria - ''' - - matches = [] - def matcher(h5_object_name, h5_object): - match, _ = matcher_cb(h5_object_name, h5_object) - if match: - matches.append(h5_object) - - traverse_h5_file(matcher, h5_file, start_node) - return matches - - -def traverse_h5_file(callback, h5_file, start_node=None): - ''' Traverse an h5 file and apply a callback to each node - ''' - - if start_node is None: - start_node = h5_file['/'] - elif isinstance(start_node, str): - start_node = h5_file[start_node] - - start_node.visititems(callback) \ No newline at end of file diff --git a/allensdk/core/json_utilities.py b/allensdk/core/json_utilities.py deleted file mode 100644 index 8c195c6e34..0000000000 --- a/allensdk/core/json_utilities.py +++ /dev/null @@ -1,262 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -import simplejson as json -import math -import re -import logging - -ju_logger = logging.getLogger(__name__) - -try: - import urllib.request as urllib_request -except ImportError: - import urllib2 as urllib_request -try: - from urllib.parse import urlparse -except ImportError: - import urlparse - - -def read(file_name): - """ Shortcut reading JSON from a file. """ - with open(file_name, 'rb') as f: - json_string = f.read().decode('utf-8') - if len(json_string)==0: # If empty file - json_string='{}' # Create a string that will give an empty JSON object instead of an error - json_obj = json.loads(json_string) - - return json_obj - - -def write(file_name, obj): - """ Shortcut for writing JSON to a file. This also takes care of serializing numpy and data types. """ - with open(file_name, 'wb') as f: - try: - f.write(write_string(obj)) # Python 2.7 - except TypeError: - f.write(bytes(write_string(obj), 'utf-8')) # Python 3 - - -def write_string(obj): - """ Shortcut for writing JSON to a string. This also takes care of serializing numpy and data types. """ - return json.dumps(obj, - indent=2, - ignore_nan=True, - default=json_handler, - iterable_as_array=True) - - -def read_url(url, method='POST'): - if method == 'GET': - return read_url_get(url) - elif method == 'POST': - return read_url_post(url) - else: - raise Exception('Unknown request method: (%s)' % method) - - -def read_url_get(url): - '''Transform a JSON contained in a file into an equivalent - nested python dict. - - Parameters - ---------- - url : string - where to get the json. - - Returns - ------- - dict - Python version of the input - - Note: if the input is a bare array or literal, for example, - the output will be of the corresponding type. - ''' - response = urllib_request.urlopen(url) - json_string = response.read().decode('utf-8') - - return json.loads(json_string) - - -def read_url_post(url): - '''Transform a JSON contained in a file into an equivalent - nested python dict. - - Parameters - ---------- - url : string - where to get the json. - - Returns - ------- - dict - Python version of the input - - Note: if the input is a bare array or literal, for example, - the output will be of the corresponding type. - ''' - urlp = urlparse.urlparse(url) - main_url = urlparse.urlunsplit( - (urlp.scheme, urlp.netloc, urlp.path, '', '')) - data = json.dumps(dict(urlparse.parse_qsl(urlp.query))) - - handler = urllib_request.HTTPHandler() - opener = urllib_request.build_opener(handler) - - request = urllib_request.Request(main_url, data) - request.add_header("Content-Type", 'application/json') - request.get_method = lambda: 'POST' - - try: - response = opener.open(request) - except Exception as e: - response = e - - if response.code == 200: - json_string = response.read() - else: - json_string = response.read() - - return json.loads(json_string) - - -def json_handler(obj): - """ Used by write_json convert a few non-standard types to things that the json package can handle. """ - if hasattr(obj, 'to_dict'): - return obj.to_dict() - elif isinstance(obj, np.ndarray): - return obj.tolist() - elif isinstance(obj, np.floating): - return float(obj) - elif isinstance(obj, np.integer): - return int(obj) - elif (isinstance(obj, np.bool) or - isinstance(obj, np.bool_)): - return bool(obj) - elif hasattr(obj, 'isoformat'): - return obj.isoformat() - else: - raise TypeError( - 'Object of type %s with value of %s is not JSON serializable' % - (type(obj), repr(obj))) - - -class JsonComments(object): - _oneline_comment = re.compile(r"\/\/.*$", - re.MULTILINE) - _multiline_comment_start = re.compile(r"\/\*", - re.MULTILINE | - re.DOTALL) - _multiline_comment_end = re.compile(r"\*\/", - re.MULTILINE | - re.DOTALL) - _blank_line = re.compile(r"\n?^\s*$", re.MULTILINE) - _carriage_return = re.compile(r"\r$", re.MULTILINE) - - @classmethod - def read_string(cls, json_string): - json_string_no_comments = cls.remove_comments(json_string) - return json.loads(json_string_no_comments) - - @classmethod - def read_file(cls, file_name): - try: - with open(file_name) as f: - json_string = f.read() - json_object = cls.read_string(json_string) - - return json_object - except ValueError: - ju_logger.error( - "Could not load json object from file: %s" % (file_name)) - raise - - @classmethod - def remove_comments(cls, json_string): - '''Strip single and multiline javascript-style comments. - - Parameters - ---------- - json : string - Json string with javascript-style comments. - - Returns - ------- - string - Copy of the input with comments removed. - - Note: A JSON decoder MAY accept and ignore comments. - ''' - json_string = JsonComments._oneline_comment.sub('', json_string) - json_string = JsonComments._carriage_return.sub('', json_string) - json_string = JsonComments.remove_multiline_comments(json_string) - json_string = JsonComments._blank_line.sub('', json_string) - - return json_string - - @classmethod - def remove_multiline_comments(cls, json_string): - '''Rebuild input without substrings matching /*...*/. - - Parameters - ---------- - json_string : string - may or may not contain multiline comments. - - Returns - ------- - string - Copy of the input without the comments. - ''' - new_json = [] - start_iter = JsonComments._multiline_comment_start.finditer( - json_string) - json_slice_start = 0 - - for comment_start in start_iter: - json_slice_end = comment_start.start() - new_json.append(json_string[json_slice_start:json_slice_end]) - search_start = comment_start.end() - comment_end = JsonComments._multiline_comment_end.search(json_string[ - search_start:]) - if comment_end is None: - break - else: - json_slice_start = search_start + comment_end.end() - new_json.append(json_string[json_slice_start:]) - - return ''.join(new_json) diff --git a/allensdk/core/lazy_property/__init__.py b/allensdk/core/lazy_property/__init__.py deleted file mode 100644 index 2f90da4bc0..0000000000 --- a/allensdk/core/lazy_property/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .lazy_property import LazyProperty -from .lazy_property_mixin import LazyPropertyMixin - diff --git a/allensdk/core/lazy_property/lazy_property.py b/allensdk/core/lazy_property/lazy_property.py deleted file mode 100644 index a001bbfe88..0000000000 --- a/allensdk/core/lazy_property/lazy_property.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import Callable, Iterable - -class LazyProperty(object): - - def __init__(self, api_method: Callable, wrappers: Iterable = tuple(), - settable: bool = False, *args, **kwargs): - - self.api_method = api_method - self.wrappers = wrappers - self.settable = settable - self.args = args - self.kwargs = kwargs - self.value = None - - def __get__(self, obj, objtype=None): - if obj is None: - return self - - if self.value is None: - self.value = self.calculate() - return self.value - - def __set__(self, obj, value): - if self.settable: - self.value = value - else: - raise AttributeError("Can't set a read-only attribute") - - def calculate(self): - result = self.api_method(*self.args, **self.kwargs) - for wrapper in self.wrappers: - result = wrapper(result) - return result diff --git a/allensdk/core/lazy_property/lazy_property_mixin.py b/allensdk/core/lazy_property/lazy_property_mixin.py deleted file mode 100644 index d21f2eb9d2..0000000000 --- a/allensdk/core/lazy_property/lazy_property_mixin.py +++ /dev/null @@ -1,29 +0,0 @@ -from .lazy_property import LazyProperty - - -class LazyPropertyMixin(object): - - @property - def LazyProperty(self): - return LazyProperty - - def __getattribute__(self, name): - - lazy_class = super(LazyPropertyMixin, self).__getattribute__('LazyProperty') - curr_attr = super(LazyPropertyMixin, self).__getattribute__(name) - if isinstance(curr_attr, lazy_class): - return curr_attr.__get__(curr_attr) - else: - return super(LazyPropertyMixin, self).__getattribute__(name) - - - def __setattr__(self, name, value): - if not hasattr(self, name): - super(LazyPropertyMixin, self).__setattr__(name, value) - else: - curr_attr = super(LazyPropertyMixin, self).__getattribute__(name) - lazy_class = super(LazyPropertyMixin, self).__getattribute__('LazyProperty') - if isinstance(curr_attr, lazy_class): - curr_attr.__set__(curr_attr, value) - else: - super(LazyPropertyMixin, self).__setattr__(name, value) \ No newline at end of file diff --git a/allensdk/core/mouse_connectivity_cache.py b/allensdk/core/mouse_connectivity_cache.py deleted file mode 100644 index 041db77241..0000000000 --- a/allensdk/core/mouse_connectivity_cache.py +++ /dev/null @@ -1,794 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.config.manifest_builder import ManifestBuilder -from allensdk.api.warehouse_cache.cache import Cache, get_default_manifest_file -from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi -from allensdk.deprecated import deprecated - -from . import json_utilities -from .reference_space_cache import ReferenceSpaceCache - -import nrrd -import re -import os -import SimpleITK as sitk -import pandas as pd -import numpy as np -from allensdk.config.manifest import Manifest -import warnings -import operator as op -import functools -from six.moves import reduce - - -class MouseConnectivityCache(ReferenceSpaceCache): - """ - Cache class for storing and accessing data related to the adult mouse - Connectivity Atlas. By default, this class will cache any downloaded - metadata or files in well known locations defined in a manifest file. - This behavior can be disabled. - - Attributes - ---------- - - resolution: int - Resolution of grid data to be downloaded when accessing projection volume, - the annotation volume, and the annotation volume. Must be one of (10, 25, - 50, 100). Default is 25. - - api: MouseConnectivityApi instance - Used internally to make API queries. - - Parameters - ---------- - - resolution: int - Resolution of grid data to be downloaded when accessing projection volume, - the annotation volume, and the annotation volume. Must be one of (10, 25, - 50, 100). Default is 25. - - ccf_version: string - Desired version of the Common Coordinate Framework. This affects the annotation - volume (get_annotation_volume) and structure masks (get_structure_mask). - Must be one of (MouseConnectivityApi.CCF_2015, MouseConnectivityApi.CCF_2016). - Default: MouseConnectivityApi.CCF_2016 - - cache: boolean - Whether the class should save results of API queries to locations specified - in the manifest file. Queries for files (as opposed to metadata) must have a - file location. If caching is disabled, those locations must be specified - in the function call (e.g. get_projection_density(file_name='file.nrrd')). - - manifest_file: string - File name of the manifest to be read. Default is "mouse_connectivity_manifest.json". - - """ - - PROJECTION_DENSITY_KEY = 'PROJECTION_DENSITY' - INJECTION_DENSITY_KEY = 'INJECTION_DENSITY' - INJECTION_FRACTION_KEY = 'INJECTION_FRACTION' - DATA_MASK_KEY = 'DATA_MASK' - STRUCTURE_UNIONIZES_KEY = 'STRUCTURE_UNIONIZES' - EXPERIMENTS_KEY = 'EXPERIMENTS' - DEFORMATION_FIELD_HEADER_KEY = 'DEFORMATION_FIELD_HEADER' - DEFORMATION_FIELD_VOXEL_KEY = 'DEFORMATION_FIELD_VOXELS' - ALIGNMENT3D_KEY = 'ALIGNMENT3D' - - MANIFEST_VERSION = 1.3 - - SUMMARY_STRUCTURE_SET_ID = 167587189 - DEFAULT_STRUCTURE_SET_IDS = tuple([SUMMARY_STRUCTURE_SET_ID]) - - DFMFLD_RESOLUTIONS = (25,) - - @property - def default_structure_ids(self): - - if not hasattr(self, '_default_structure_ids'): - tree = self.get_structure_tree() - default_structures = tree.get_structures_by_set_id(MouseConnectivityCache.DEFAULT_STRUCTURE_SET_IDS) - self._default_structure_ids = [st['id'] for st in default_structures] - - return self._default_structure_ids - - def __init__(self, - resolution=None, - cache=True, - manifest_file=None, - ccf_version=None, - base_uri=None, - version=None): - - if manifest_file is None: - manifest_file = get_default_manifest_file('mouse_connectivity') - - if version is None: - version = self.MANIFEST_VERSION - - if resolution is None: - resolution = MouseConnectivityApi.VOXEL_RESOLUTION_25_MICRONS - - if ccf_version is None: - ccf_version = MouseConnectivityApi.CCF_VERSION_DEFAULT - - super(MouseConnectivityCache, self).__init__( - resolution, reference_space_key=ccf_version, cache=cache, - manifest=manifest_file, version=version) - - self.api = MouseConnectivityApi(base_uri=base_uri) - - - def get_projection_density(self, experiment_id, file_name=None): - """ - Read a projection density volume for a single experiment. Download it - first if it doesn't exist. Projection density is the proportion of - of projecting pixels in a grid voxel in [0,1]. - - Parameters - ---------- - - experiment_id: int - ID of the experiment to download/read. This corresponds to - section_data_set_id in the API. - - file_name: string - File name to store the template volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - """ - - file_name = self.get_cache_path(file_name, - self.PROJECTION_DENSITY_KEY, - experiment_id, - self.resolution) - - self.api.download_projection_density( - file_name, experiment_id, self.resolution, strategy='lazy') - - return nrrd.read(file_name) - - def get_injection_density(self, experiment_id, file_name=None): - """ - Read an injection density volume for a single experiment. Download it - first if it doesn't exist. Injection density is the proportion of - projecting pixels in a grid voxel only including pixels that are - part of the injection site in [0,1]. - - Parameters - ---------- - - experiment_id: int - ID of the experiment to download/read. This corresponds to - section_data_set_id in the API. - - file_name: string - File name to store the template volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - """ - - file_name = self.get_cache_path(file_name, - self.INJECTION_DENSITY_KEY, - experiment_id, - self.resolution) - self.api.download_injection_density( - file_name, experiment_id, self.resolution, strategy='lazy') - - return nrrd.read(file_name) - - def get_injection_fraction(self, experiment_id, file_name=None): - """ - Read an injection fraction volume for a single experiment. Download it - first if it doesn't exist. Injection fraction is the proportion of - pixels in the injection site in a grid voxel in [0,1]. - - Parameters - ---------- - - experiment_id: int - ID of the experiment to download/read. This corresponds to - section_data_set_id in the API. - - file_name: string - File name to store the template volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - """ - - file_name = self.get_cache_path(file_name, - self.INJECTION_FRACTION_KEY, - experiment_id, - self.resolution) - self.api.download_injection_fraction( - file_name, experiment_id, self.resolution, strategy='lazy') - - return nrrd.read(file_name) - - def get_data_mask(self, experiment_id, file_name=None): - """ - Read a data mask volume for a single experiment. Download it - first if it doesn't exist. Data mask is a binary mask of - voxels that have valid data. Only use valid data in analysis! - - Parameters - ---------- - - experiment_id: int - ID of the experiment to download/read. This corresponds to - section_data_set_id in the API. - - file_name: string - File name to store the template volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - """ - - file_name = self.get_cache_path(file_name, - self.DATA_MASK_KEY, - experiment_id, - self.resolution) - self.api.download_data_mask( - file_name, experiment_id, self.resolution, strategy='lazy') - - return nrrd.read(file_name) - - - def get_experiments(self, dataframe=False, file_name=None, cre=None, injection_structure_ids=None): - """ - Read a list of experiments that match certain criteria. If caching is enabled, - this will save the whole (unfiltered) list of experiments to a file. - - Parameters - ---------- - - dataframe: boolean - Return the list of experiments as a Pandas DataFrame. If False, - return a list of dictionaries. Default False. - - file_name: string - File name to save/read the structures table. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - cre: boolean or list - If True, return only cre-positive experiments. If False, return only - cre-negative experiments. If None, return all experients. If list, return - all experiments with cre line names in the supplied list. Default None. - - injection_structure_ids: list - Only return experiments that were injected in the structures provided here. - If None, return all experiments. Default None. - - """ - - file_name = self.get_cache_path(file_name, self.EXPERIMENTS_KEY) - - experiments = self.api.get_experiments_api(path=file_name, - strategy='lazy', - **Cache.cache_json()) - - for e in experiments: - # renaming id - e['id'] = e['data_set_id'] - del e['data_set_id'] - - # simplify trangsenic line - tl = e.get('transgenic_line', None) - if tl: - e['transgenic_line'] = tl['name'] - - # parse the injection structures - injs = [ int(i) for i in e['injection_structures'].split('/') ] - e['injection_structures'] = injs - e['primary_injection_structure'] = injs[0] - - # remove storage dir - del e['storage_directory'] - - - # filter the read/downloaded list of experiments - experiments = self.filter_experiments( - experiments, cre, injection_structure_ids) - - if dataframe: - experiments = pd.DataFrame(experiments) - experiments.set_index(['id'], inplace=True, drop=False) - - return experiments - - def filter_experiments(self, experiments, cre=None, injection_structure_ids=None): - """ - Take a list of experiments and filter them by cre status and injection structure. - - Parameters - ---------- - - cre: boolean or list - If True, return only cre-positive experiments. If False, return only - cre-negative experiments. If None, return all experients. If list, return - all experiments with cre line names in the supplied list. Default None. - - injection_structure_ids: list - Only return experiments that were injected in the structures provided here. - If None, return all experiments. Default None. - """ - - if cre is True: - experiments = [e for e in experiments if e['transgenic_line']] - elif cre is False: - experiments = [e for e in experiments if not e['transgenic_line']] - elif cre is not None: - cre = [ c.lower() for c in cre ] - experiments = [e for e in experiments if e['transgenic_line'] is not None and e['transgenic_line'].lower() in cre] - - if injection_structure_ids is not None: - structure_ids = MouseConnectivityCache.validate_structure_ids(injection_structure_ids) - descendant_ids = set(reduce(op.add, self.get_structure_tree().descendant_ids(injection_structure_ids))) - - experiments = [e for e in experiments if e['structure_id'] in descendant_ids] - - return experiments - - def get_experiment_structure_unionizes(self, experiment_id, - file_name=None, - is_injection=None, - structure_ids=None, - include_descendants=False, - hemisphere_ids=None): - """ - Retrieve the structure unionize data for a specific experiment. Filter by - structure, injection status, and hemisphere. - - Parameters - ---------- - - experiment_id: int - ID of the experiment of interest. Corresponds to section_data_set_id in the API. - - file_name: string - File name to save/read the experiments list. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - is_injection: boolean - If True, only return unionize records that disregard non-injection pixels. - If False, only return unionize records that disregard injection pixels. - If None, return all records. Default None. - - structure_ids: list - Only return unionize records for a specific set of structures. - If None, return all records. Default None. - - include_descendants: boolean - Include all descendant records for specified structures. Default False. - - hemisphere_ids: list - Only return unionize records that disregard pixels outside of a hemisphere. - or set of hemispheres. Left = 1, Right = 2, Both = 3. If None, include all - records [1, 2, 3]. Default None. - - """ - - file_name = self.get_cache_path(file_name, - self.STRUCTURE_UNIONIZES_KEY, - experiment_id) - - filter_fn = functools.partial(self.filter_structure_unionizes, - is_injection=is_injection, - structure_ids=structure_ids, - include_descendants=include_descendants, - hemisphere_ids=hemisphere_ids) - - col_rn = lambda x: pd.DataFrame(x).rename(columns={ - 'section_data_set_id': 'experiment_id'}) - - return self.api.get_structure_unionizes([experiment_id], - path=file_name, - strategy='lazy', - pre=col_rn, - post=filter_fn, - writer=lambda p, x : pd.DataFrame(x).to_csv(p), - reader=lambda x: pd.read_csv(x, index_col=0, parse_dates=True)) - - def rank_structures(self, experiment_ids, is_injection, structure_ids=None, hemisphere_ids=None, - rank_on='normalized_projection_volume', n=5, threshold=10**-2): - '''Produces one or more (per experiment) ranked lists of brain structures, using a specified data field. - - Parameters - ---------- - experiment_ids : list of int - Obtain injection_structures for these experiments. - is_injection : boolean - Use data from only injection (or non-injection) unionizes. - structure_ids : list of int, optional - Consider only these structures. It is a good idea to make sure that these structures are not spatially - overlapping; otherwise your results will contain redundant information. Defaults to the summary - structures - a brain-wide list of nonoverlapping mid-level structures. - hemisphere_ids : list of int, optional - Consider only these hemispheres (1: left, 2: right, 3: both). Like with structures, - you might get redundant results if you select overlapping options. Defaults to [1, 2]. - rank_on : str, optional - Rank unionize data using this field (descending). Defaults to normalized_projection_volume. - n : int, optional - Return only the top n structures. - threshold : float, optional - Consider only records whose data value - specified by the rank_on parameter - exceeds this value. - - Returns - ------- - list : - Each element (1 for each input experiment) is a list of dictionaries. The dictionaries describe the top - injection structures in descending order. They are specified by their structure and hemisphere id fields and - additionally report the value specified by the rank_on parameter. - - ''' - - output_keys = ['experiment_id', rank_on, 'hemisphere_id', 'structure_id'] - - if hemisphere_ids is None: - hemisphere_ids = [1, 2] - if structure_ids is None: - structure_ids = self.default_structure_ids - - unionizes = self.get_structure_unionizes(experiment_ids, - is_injection=is_injection, - structure_ids=structure_ids, - hemisphere_ids=hemisphere_ids, - include_descendants=False) - unionizes = unionizes[unionizes[rank_on] > threshold] - - results = [] - for eid in experiment_ids: - - this_experiment_unionizes = unionizes[unionizes['experiment_id'] == eid] - this_experiment_unionizes = this_experiment_unionizes.sort_values(by=rank_on, ascending=False) - this_experiment_unionizes = this_experiment_unionizes.loc[:, output_keys] - - records = this_experiment_unionizes.to_dict('record') - if len(records) > n: - records = records[:n] - results.append(records) - - return results - - def filter_structure_unionizes(self, unionizes, - is_injection=None, - structure_ids=None, - include_descendants=False, - hemisphere_ids=None): - """ - Take a list of unionzes and return a subset of records filtered by injection status, structure, and - hemisphere. - - Parameters - ---------- - is_injection: boolean - If True, only return unionize records that disregard non-injection pixels. - If False, only return unionize records that disregard injection pixels. - If None, return all records. Default None. - - structure_ids: list - Only return unionize records for a set of structures. - If None, return all records. Default None. - - include_descendants: boolean - Include all descendant records for specified structures. Default False. - - hemisphere_ids: list - Only return unionize records that disregard pixels outside of a hemisphere. - or set of hemispheres. Left = 1, Right = 2, Both = 3. If None, include all - records [1, 2, 3]. Default None. - """ - if is_injection is not None: - unionizes = unionizes[unionizes.is_injection == is_injection] - - if structure_ids is not None: - structure_ids = MouseConnectivityCache.validate_structure_ids(structure_ids) - - if include_descendants: - structure_ids = reduce(op.add, self.get_structure_tree().descendant_ids(structure_ids)) - else: - structure_ids = set(structure_ids) - - - unionizes = unionizes[ - unionizes['structure_id'].isin(structure_ids)] - - if hemisphere_ids is not None: - unionizes = unionizes[ - unionizes['hemisphere_id'].isin(hemisphere_ids)] - - return unionizes - - def get_structure_unionizes(self, experiment_ids, - is_injection=None, - structure_ids=None, - include_descendants=False, - hemisphere_ids=None): - """ - Get structure unionizes for a set of experiment IDs. Filter the results by injection status, - structure, and hemisphere. - - Parameters - ---------- - experiment_ids: list - List of experiment IDs. Corresponds to section_data_set_id in the API. - - is_injection: boolean - If True, only return unionize records that disregard non-injection pixels. - If False, only return unionize records that disregard injection pixels. - If None, return all records. Default None. - - structure_ids: list - Only return unionize records for a specific set of structures. - If None, return all records. Default None. - - include_descendants: boolean - Include all descendant records for specified structures. Default False. - - hemisphere_ids: list - Only return unionize records that disregard pixels outside of a hemisphere. - or set of hemispheres. Left = 1, Right = 2, Both = 3. If None, include all - records [1, 2, 3]. Default None. - """ - - unionizes = [self.get_experiment_structure_unionizes(eid, - is_injection=is_injection, - structure_ids=structure_ids, - include_descendants=include_descendants, - hemisphere_ids=hemisphere_ids) - for eid in experiment_ids] - - return pd.concat(unionizes, ignore_index=True, sort=True) - - def get_projection_matrix(self, experiment_ids, - projection_structure_ids=None, - hemisphere_ids=None, - parameter='projection_volume', - dataframe=False): - - if projection_structure_ids is None: - projection_structure_ids = self.default_structure_ids - - unionizes = self.get_structure_unionizes(experiment_ids, - is_injection=False, - structure_ids=projection_structure_ids, - include_descendants=False, - hemisphere_ids=hemisphere_ids) - - hemisphere_ids = set(unionizes['hemisphere_id'].values.tolist()) - - nrows = len(experiment_ids) - ncolumns = len(projection_structure_ids) * len(hemisphere_ids) - - matrix = np.empty((nrows, ncolumns)) - matrix[:] = np.NAN - - row_lookup = {} - for idx, e in enumerate(experiment_ids): - row_lookup[e] = idx - - column_lookup = {} - columns = [] - - cidx = 0 - hlabel = {1: '-L', 2: '-R', 3: ''} - - acronym_map = self.get_structure_tree().value_map(lambda x: x['id'], - lambda x: x['acronym']) - - for hid in hemisphere_ids: - for sid in projection_structure_ids: - column_lookup[(hid, sid)] = cidx - label = acronym_map[sid] + hlabel[hid] - columns.append( - {'hemisphere_id': hid, 'structure_id': sid, 'label': label}) - cidx += 1 - - for _, row in unionizes.iterrows(): - ridx = row_lookup[row['experiment_id']] - k = (row['hemisphere_id'], row['structure_id']) - cidx = column_lookup[k] - matrix[ridx, cidx] = row[parameter] - - if dataframe: - warnings.warn("dataframe argument is deprecated.") - all_experiments = self.get_experiments(dataframe=True) - - rows_df = all_experiments.loc[experiment_ids] - - cols_df = pd.DataFrame(columns) - - return {'matrix': matrix, 'rows': rows_df, 'columns': cols_df} - else: - return {'matrix': matrix, 'rows': experiment_ids, 'columns': columns} - - - def get_deformation_field(self, section_data_set_id, header_path=None, voxel_path=None): - ''' Extract the local alignment parameters for this dataset. This a 3D vector image (3 components) describing - a deformable local mapping from CCF voxels to this section data set's affine-aligned image stack. - - Parameters - ---------- - section_data_set_id : int - Download the deformation field for this data set - header_path : str, optional - If supplied, the deformation field header will be downloaded to this path. - voxel_path : str, optiona - If supplied, the deformation field voxels will be downloaded to this path. - - Returns - ------- - numpy.ndarray : - 3D X 3 component vector array (origin 0, 0, 0; 25-micron isometric resolution) defining a - deformable transformation from CCF-space to affine-transformed image space. - - ''' - - if self.resolution not in self.DFMFLD_RESOLUTIONS: - warnings.warn( - 'deformation fields are only available at {} isometric resolutions, but this is a '\ - '{}-micron cache'.format(self.DFMFLD_RESOLUTIONS, self.resolution) - ) - - header_path = self.get_cache_path(header_path, self.DEFORMATION_FIELD_HEADER_KEY, section_data_set_id) - voxel_path = self.get_cache_path(voxel_path, self.DEFORMATION_FIELD_VOXEL_KEY, section_data_set_id) - - if not (os.path.exists(header_path) and os.path.exists(voxel_path)): - Manifest.safe_make_parent_dirs(header_path) - Manifest.safe_make_parent_dirs(voxel_path) - self.api.download_deformation_field( - section_data_set_id, - header_path=header_path, - voxel_path=voxel_path - ) - - return sitk.GetArrayFromImage(sitk.ReadImage(str(header_path))) # TODO the str call here is only necessary in 2.7 - - - def get_affine_parameters(self, section_data_set_id, direction='trv', file_name=None): - ''' Extract the parameters of the 3D affine tranformation mapping this section data set's image-space stack to - CCF-space (or vice-versa). - - Parameters - ---------- - section_data_set_id : int - download the parameters for this data set. - direction : str, optional - Valid options are: - trv : "transform from reference to volume". Maps CCF points to image space points. If you are - resampling data into CCF, this is the direction you want. - tvr : "transform from volume to reference". Maps image space points to CCF points. - file_name : str - If provided, store the downloaded file here. - - Returns - ------- - alignment : numpy.ndarray - 4 X 3 matrix. In order to transform a point [X_1, X_2, X_3] run - np.dot([X_1, X_2, X_3, 1], alignment). In - to build a SimpleITK affine transform run: - transform = sitk.AffineTransform(3) - transform.SetParameters(alignment.flatten()) - - ''' - - if not direction in ('trv', 'tvr'): - raise ArgumentError('invalid direction: {}. direction must be one of tvr, trv'.format(direction)) - - file_name = self.get_cache_path(file_name, self.ALIGNMENT3D_KEY) - - raw_alignment = self.api.download_alignment3d( - strategy='lazy', - path=file_name, - section_data_set_id=section_data_set_id, - **Cache.cache_json()) - - alignment_re = re.compile('{}_(?P<index>\d+)'.format(direction)) - alignment = np.zeros((4, 3), dtype=float) - - for entry, value in raw_alignment.items(): - match = alignment_re.match(entry) - if match is not None: - alignment.flat[int(match.group('index'))] = value - - return alignment - - - def add_manifest_paths(self, manifest_builder): - """ - Construct a manifest for this Cache class and save it in a file. - - Parameters - ---------- - - file_name: string - File location to save the manifest. - - """ - - manifest_builder = super(MouseConnectivityCache, self).add_manifest_paths(manifest_builder) - - manifest_builder.add_path(self.EXPERIMENTS_KEY, - 'experiments.json', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.STRUCTURE_UNIONIZES_KEY, - 'experiment_%d/structure_unionizes.csv', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.INJECTION_DENSITY_KEY, - 'experiment_%d/injection_density_%d.nrrd', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.INJECTION_FRACTION_KEY, - 'experiment_%d/injection_fraction_%d.nrrd', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.DATA_MASK_KEY, - 'experiment_%d/data_mask_%d.nrrd', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.PROJECTION_DENSITY_KEY, - 'experiment_%d/projection_density_%d.nrrd', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.DEFORMATION_FIELD_HEADER_KEY, - 'experiment_%d/dfmfld.mhd', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.DEFORMATION_FIELD_VOXEL_KEY, - 'experiment_%d/dfmfld.raw', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.ALIGNMENT3D_KEY, - 'experiment_%d/alignment3d.json', - parent_key='BASEDIR', - typename='file') - - return manifest_builder diff --git a/allensdk/core/nwb_data_set.py b/allensdk/core/nwb_data_set.py deleted file mode 100644 index 66d2edb302..0000000000 --- a/allensdk/core/nwb_data_set.py +++ /dev/null @@ -1,391 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import h5py -import numpy as np - - -class NwbDataSet(object): - """ A very simple interface for exracting electrophysiology data - from an NWB file. - """ - SPIKE_TIMES = "spike_times" - DEPRECATED_SPIKE_TIMES = "aibs_spike_times" - - def __init__(self, file_name, spike_time_key=None): - """ Initialize the NwbDataSet instance with a file name - - Parameters - ---------- - file_name: string - NWB file name - """ - self.file_name = file_name - if spike_time_key is None: - self.spike_time_key = NwbDataSet.SPIKE_TIMES - else: - self.spike_time_key = spike_time_key - - def get_sweep(self, sweep_number): - """ Retrieve the stimulus, response, index_range, and sampling rate - for a particular sweep. This method hides the NWB file's distinction - between a "Sweep" and an "Experiment". An experiment is a subset of - of a sweep that excludes the initial test pulse. It also excludes - any erroneous response data at the end of the sweep (usually for - ramp sweeps, where recording was terminated mid-stimulus). - - Some sweeps do not have an experiment, so full data arrays are - returned. Sweeps that have an experiment return full data arrays - (include the test pulse) with any erroneous data trimmed from the - back of the sweep. - - Parameters - ---------- - sweep_number: int - - Returns - ------- - dict - A dictionary with 'stimulus', 'response', 'index_range', and - 'sampling_rate' elements. The index range is a 2-tuple where - the first element indicates the end of the test pulse and the - second index is the end of valid response data. - """ - with h5py.File(self.file_name, 'r') as f: - - swp = f['epochs']['Sweep_%d' % sweep_number] - - # fetch data from file and convert to correct SI unit - # this operation depends on file version. early versions of - # the file have incorrect conversion information embedded - # in the nwb file and data was stored in the appropriate - # SI unit. For those files, return uncorrected data. - # For newer files (1.1 and later), apply conversion value. - major, minor = self.get_pipeline_version() - if (major == 1 and minor > 0) or major > 1: - # stimulus - stimulus_dataset = swp['stimulus']['timeseries']['data'] - conversion = float(stimulus_dataset.attrs["conversion"]) - stimulus = stimulus_dataset.value * conversion - # acquisition - response_dataset = swp['response']['timeseries']['data'] - conversion = float(response_dataset.attrs["conversion"]) - response = response_dataset.value * conversion - else: # old file version - stimulus_dataset = swp['stimulus']['timeseries']['data'] - stimulus = stimulus_dataset.value - response = swp['response']['timeseries']['data'].value - - if 'unit' in stimulus_dataset.attrs: - unit = stimulus_dataset.attrs["unit"].decode('UTF-8') - - unit_str = None - if unit.startswith('A'): - unit_str = "Amps" - elif unit.startswith('V'): - unit_str = "Volts" - assert unit_str is not None, Exception( - "Stimulus time series unit not recognized") - else: - unit = None - unit_str = 'Unknown' - - swp_idx_start = swp['stimulus']['idx_start'].value - swp_length = swp['stimulus']['count'].value - - swp_idx_stop = swp_idx_start + swp_length - 1 - sweep_index_range = (swp_idx_start, swp_idx_stop) - - # if the sweep has an experiment, extract the experiment's index - # range - try: - exp = f['epochs']['Experiment_%d' % sweep_number] - exp_idx_start = exp['stimulus']['idx_start'].value - exp_length = exp['stimulus']['count'].value - exp_idx_stop = exp_idx_start + exp_length - 1 - experiment_index_range = (exp_idx_start, exp_idx_stop) - except KeyError: - # this sweep has no experiment. return the index range of the - # entire sweep. - experiment_index_range = sweep_index_range - - assert sweep_index_range[0] == 0, Exception( - "index range of the full sweep does not start at 0.") - - return { - 'stimulus': stimulus, - 'response': response, - 'stimulus_unit' : unit_str, - 'index_range': experiment_index_range, - 'sampling_rate': 1.0 * swp['stimulus']['timeseries']['starting_time'].attrs['rate'] - } - - def set_sweep(self, sweep_number, stimulus, response): - """ Overwrite the stimulus or response of an NWB file. - If the supplied arrays are shorter than stored arrays, - they are padded with zeros to match the original data - size. - - Parameters - ---------- - sweep_number: int - - stimulus: np.array - Overwrite the stimulus with this array. If None, stimulus is unchanged. - - response: np.array - Overwrite the response with this array. If None, response is unchanged. - """ - - with h5py.File(self.file_name, 'r+') as f: - swp = f['epochs']['Sweep_%d' % sweep_number] - - # this is the length of the entire sweep data, including test pulse and - # whatever might be in front of it - # TODO: remove deprecated 'idx_stop' - if 'idx_stop' in swp['stimulus']: - sweep_length = swp['stimulus']['idx_stop'].value + 1 - else: - sweep_length = swp['stimulus']['count'].value - - if stimulus is not None: - # if the data is shorter than the sweep, pad it with zeros - missing_data = sweep_length - len(stimulus) - if missing_data > 0: - stimulus = np.append(stimulus, np.zeros(missing_data)) - - swp['stimulus']['timeseries']['data'][...] = stimulus - - if response is not None: - # if the data is shorter than the sweep, pad it with zeros - missing_data = sweep_length - len(response) - if missing_data > 0: - response = np.append(response, np.zeros(missing_data)) - - swp['response']['timeseries']['data'][...] = response - - def get_pipeline_version(self): - """ Returns the AI pipeline version number, stored in the - metadata field 'generated_by'. If that field is - missing, version 0.0 is returned. - - Returns - ------- - int tuple: (major, minor) - """ - try: - with h5py.File(self.file_name, 'r') as f: - if 'generated_by' in f["general"]: - info = f["general/generated_by"] - # generated_by stores array of keys and values - # keys are even numbered, corresponding values are in - # odd indices - for i in range(len(info)): - val = info[i] - if info[i] == 'version': - version = info[i+1] - break - toks = version.split('.') - if len(toks) >= 2: - major = int(toks[0]) - minor = int(toks[1]) - except: - minor = 0 - major = 0 - return major, minor - - def get_spike_times(self, sweep_number, key=None): - """ Return any spike times stored in the NWB file for a sweep. - - Parameters - ---------- - sweep_number: int - index to access - key : string - label where the spike times are stored (default NwbDataSet.SPIKE_TIMES) - - Returns - ------- - list - list of spike times in seconds relative to the start of the sweep - """ - - if key is None: - key = self.spike_time_key - - with h5py.File(self.file_name, 'r') as f: - sweep_name = "Sweep_%d" % sweep_number - datasets = ["analysis/%s/Sweep_%d" % (key, sweep_number), - "analysis/%s/Sweep_%d" % (self.DEPRECATED_SPIKE_TIMES, sweep_number)] - - for ds in datasets: - if ds in f: - return f[ds].value - return [] - - def set_spike_times(self, sweep_number, spike_times, key=None): - """ Set or overwrite the spikes times for a sweep. - - Parameters - ---------- - sweep_number : int - index to access - key : string - where the times are stored (default NwbDataSet.SPIKE_TIME) - - spike_times: np.array - array of spike times in seconds - """ - - if key is None: - key = self.spike_time_key - - with h5py.File(self.file_name, 'r+') as f: - # make sure expected directory structure is in place - if "analysis" not in f.keys(): - f.create_group("analysis") - - analysis_dir = f["analysis"] - if NwbDataSet.SPIKE_TIMES not in analysis_dir.keys(): - # analysis_dir.create_group(NwbDataSet.SPIKE_TIMES) - g = analysis_dir.create_group(NwbDataSet.SPIKE_TIMES) - # mixup in specification for validator resulted everything - # in 'analysis' requiring a custom label, even though - # it's already known to be custom. don't argue, just - # support the metadata redundancy - g.attrs["neurodata_type"] = "Custom" - - spike_dir = analysis_dir[NwbDataSet.SPIKE_TIMES] - - # see if desired dataset already exists - sweep_name = "Sweep_%d" % sweep_number - if sweep_name in spike_dir.keys(): - # rewriting data -- delete old dataset - del spike_dir[sweep_name] - - spike_dir.create_dataset( - sweep_name, data=spike_times, dtype='f8', maxshape=(None,)) - - def get_sweep_numbers(self): - """ Get all of the sweep numbers in the file, including test sweeps. """ - - with h5py.File(self.file_name, 'r') as f: - sweeps = [int(e.split('_')[1]) - for e in f['epochs'].keys() if e.startswith('Sweep_')] - return sweeps - - def get_experiment_sweep_numbers(self): - """ Get all of the sweep numbers for experiment epochs in the file, not including test sweeps. """ - - with h5py.File(self.file_name, 'r') as f: - sweeps = [int(e.split('_')[1]) - for e in f['epochs'].keys() if e.startswith('Experiment_')] - return sweeps - - def fill_sweep_responses(self, fill_value=0.0, sweep_numbers=None, extend_experiment=False): - """ Fill sweep response arrays with a single value. - - Parameters - ---------- - fill_value: float - Value used to fill sweep response array - - sweep_numbers: list - List of integer sweep numbers to be filled (default all sweeps) - - extend_experiment: bool - If True, extend experiment epoch length to the end of the sweep (undo any truncation) - - """ - - with h5py.File(self.file_name, 'a') as f: - if sweep_numbers is None: - sweep_numbers = self.get_sweep_numbers() - - for sweep_number in sweep_numbers: - epoch = "Sweep_%d" % sweep_number - if epoch in f['epochs']: - f['epochs'][epoch]['response'][ - 'timeseries']['data'][...] = fill_value - - if extend_experiment: - epoch = "Experiment_%d" % sweep_number - if epoch in f['epochs']: - idx_start = f['epochs'][epoch]['stimulus']['idx_start'].value - count = f['epochs'][epoch]['stimulus']['timeseries']['data'].shape[0] - - del f['epochs'][epoch]['stimulus']['count'] - f['epochs'][epoch]['stimulus']['count'] = count - idx_start - - - def get_sweep_metadata(self, sweep_number): - """ Retrieve the sweep level metadata associated with each sweep. - Includes information on stimulus parameters like its name and amplitude - as well as recording quality metadata, like access resistance and - seal quality. - - Parameters - ---------- - sweep_number: int - - Returns - ------- - dict - A dictionary with 'aibs_stimulus_amplitude_pa', 'aibs_stimulus_name', - 'gain', 'initial_access_resistance', 'seal' elements. These specific - fields are ones encoded in the original AIBS in vitro .nwb files. - """ - with h5py.File(self.file_name, 'r') as f: - - sweep_metadata = {} - - # the sweep level metadata is stored in - # stimulus/presentation/Sweep_XX in the .nwb file - - # indicates which metadata fields to return - metadata_fields = ['aibs_stimulus_amplitude_pa', 'aibs_stimulus_name', - 'gain', 'initial_access_resistance', 'seal'] - try: - stim_details = f['stimulus']['presentation'][ - 'Sweep_%d' % sweep_number] - for field in metadata_fields: - # check if sweep contains the specific metadata field - if field in stim_details.keys(): - sweep_metadata[field] = stim_details[field].value - - except KeyError: - sweep_metadata = {} - - return sweep_metadata diff --git a/allensdk/core/obj_utilities.py b/allensdk/core/obj_utilities.py deleted file mode 100644 index de603c745a..0000000000 --- a/allensdk/core/obj_utilities.py +++ /dev/null @@ -1,101 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - - -import numpy as np - - -def read_obj(path): - with open(path, 'r') as obj_file: - lines = obj_file.read().split('\n') - output = parse_obj(lines) - return output - - -def parse_obj(lines): - '''Parse a wavefront obj file into a triplet of vertices, normals, and faces. - This parser is specific to obj files generated from our annotation volumes - - Parameters - ---------- - lines : list of str - Lines of input obj file - - Returns - ------- - vertices : np.ndarray - Dimensions are (nSamples, nCoordinates=3). Locations in the reference space - of vertices - vertex_normals : np.ndarray - Dimensions are (nSample, nElements=3). Vectors normal to vertices. - face_vertices : np.ndarray - Dimensions are (sample, nVertices=3). References are given in indices - (0-indexed here, but 1-indexed in the file) of vertices that make up each face. - face_normals : np.ndarray - Dimensions are (sample, nNormals=3). References are given in indices - (0-indexed here, but 1-indexed in the file) of vertex normals that make up each face. - - Notes - ----- - This parser is specialized to the obj files that the Allen Institute for Brain Science - generates from our own structure annotations. - ''' - - vertices = [] - vertex_normals = [] - face_vertices = [] - face_normals = [] - - for line in lines: - - if line[:2] == 'v ': - vertices.append( line.split()[1:] ) - - elif line[:3] == 'vn ': - vertex_normals.append( line.split()[1:] ) - - elif line[:2] == 'f ': - line = line.replace('//', ' ').split()[1:] - - face_vertices.append( line[::2] ) - face_normals.append( line[1::2] ) - - vertices = np.array(vertices).astype(float) - vertex_normals = np.array(vertex_normals).astype(float) - face_vertices = np.array(face_vertices).astype(int) - 1 - face_normals = np.array(face_normals).astype(int) - 1 - - return vertices, vertex_normals, face_vertices, face_normals diff --git a/allensdk/core/ontology.py b/allensdk/core/ontology.py deleted file mode 100644 index 44166e66ad..0000000000 --- a/allensdk/core/ontology.py +++ /dev/null @@ -1,227 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from collections import defaultdict -from six import string_types -import numpy as np -import pandas as pd - -from allensdk.deprecated import class_deprecated - - -@class_deprecated('Use StructureTree instead.') -class Ontology(object): - ''' - - .. note:: Deprecated from 0.12.5 - `Ontology` has been replaced by `StructureTree`. - - ''' - - def __init__(self, df): - self.df = df - - child_ids = defaultdict(set) - descendant_ids = defaultdict(set) - - for _, s in df.iterrows(): - sid = s.name - parent_id = s['parent_structure_id'] - if np.isfinite(parent_id): - parent_id = int(parent_id) - child_ids[parent_id].add(sid) - - parent_id_list = map(int, s['structure_id_path'].split('/')[1:-1]) - - for parent_id in parent_id_list: - descendant_ids[parent_id].add(sid) - - self.child_ids = dict(child_ids) - self.descendant_ids = dict(descendant_ids) - - def __getitem__(self, structures): - """ - Return a subset of structures by id or acronym. Duplicate values are ignored. - - Parameters - ---------- - - structures: tuple - Elements can be pandas.Series objects, which are expected to be structure ids. - Elements can be strings, which are expected to be acronyms. - All other elements must be cast-able to int, which are treated as structure ids. - - Returns - ------- - - pandas.DataFrame - A subset of rows from the complete ontology that match filtering criteria. - """ - - # __getitem__ always has a single argument. If called with a single argument - # (e.g. ontology[315]), that item is passed straight through. If called with - # multiple arguments (e.g. ontology[315,997]), that gets passed through as a - # tuple. This normalizes the arguments so that everything is iterable. - if not isinstance(structures, tuple) and not isinstance(structures, list) and not isinstance(structures, set): - structures = structures, - - # this is the final set of structure ids used to filter - structure_ids = set() - - string_strs = [] - for s in structures: - if isinstance(s, pd.Series): - # if it's a pandas series, assume it's a series of structure - # ids - structure_ids.update(s.tolist()) - elif isinstance(s, string_types): - # if it's a string, assume it's an acronym - string_strs.append(s) - else: - # if it's anything else, cast it to an integer and treat it - # like a structure id - structure_ids.add(int(s)) - - # convert the string arguments to rows - if len(string_strs): - - # pull out the rows that match these acronyms - string_strs = self.df[self.df['acronym'].isin(string_strs)] - - # if there are no other structure ids, just return this dataframe - if len(structure_ids) == 0: - return string_strs - - # otherwise pull out the ids and add them to the set - structure_ids.update(string_strs.id.tolist()) - - return self.df.loc[structure_ids].dropna(axis=0, how='all') - - def get_descendant_ids(self, structure_ids): - """ - Find the set of the ids of structures that are descendants of one or more structures. - The returned set will include the input structure ids. - - Parameters - ---------- - structure_ids: iterable - Any iterable type that contains structure ids that can be cast to integers. - - Returns - ------- - set - Set of descendant structure ids. - """ - - if len(structure_ids) == 0: - return self.descendant_ids - else: - descendants = set() - for structure_id in structure_ids: - descendants.update(self.descendant_ids.get( - int(structure_id), set())) - return descendants - - def get_child_ids(self, structure_ids): - """ - Find the set of ids that are immediate children of one or more structures. - - Parameters - ---------- - structure_ids: iterable - Any iterable type that contains structure ids that can be cast to integers. - - Returns - ------- - set - Set of child structure ids - """ - - if len(structure_ids) == 0: - return self.child_ids - else: - children = set() - for structure_id in structure_ids: - children.update(self.child_ids.get(int(structure_id), set())) - return children - - def get_descendants(self, structure_ids): - """ - Find the set of structures that are descendants of one or more structures. - The returned set will include the input structures. - - Parameters - ---------- - structure_ids: iterable - Any iterable type that contains structure ids that can be cast to integers. - - Returns - ------- - pandas.DataFrame - Set of descendant structures. - """ - - descendant_ids = self.get_descendant_ids(structure_ids) - return self[descendant_ids] - - def get_children(self, structure_ids): - """ - Find the set of structures that are immediate children of one or more structures. - - Parameters - ---------- - structure_ids: iterable - Any iterable type that contains structure ids that can be cast to integers. - - Returns - ------- - pandas.DataFrame - Set of child structures - """ - - child_ids = self.get_child_ids(structure_ids) - return self[child_ids] - - def structure_descends_from(self, child_id, parent_id): - """ - Return whether one structure id is a descendant of another structure id. - """ - child = self[child_id] - - if child is not None: - parent_str = '/%d/' % parent_id - return child['structure_id_path'].values[0].find(parent_str) >= 0 - - return False diff --git a/allensdk/core/ophys_experiment_session_id_mapping.py b/allensdk/core/ophys_experiment_session_id_mapping.py deleted file mode 100644 index eee314ac5f..0000000000 --- a/allensdk/core/ophys_experiment_session_id_mapping.py +++ /dev/null @@ -1,1377 +0,0 @@ -# NOTE: This is a really ugly hack to get around the fact that warehouse does -# not have Ophys session ids associated with experiment ids. This should be -# removed when warehouse session ids have associations with experiment ids. - -# This mapping relates an ophys experiment id (key) with an ophys session id -# (value). For this release it happens that each session has one and only one -# experiment, but this may not be true in the future. -ophys_experiment_session_id_map = { - 617388117: 617204394, - 675062364: 674701693, - 638056634: 637886705, - 675477919: 675094980, - 676024958: 675526428, - 679702884: 679630717, - 679697901: 679374438, - 676502528: 676090240, - 679700458: 679423455, - 676503588: 676090006, - 680156911: 679992938, - 676025604: 675530244, - 679346829: 676520038, - 679353932: 676622572, - 676503737: 676445425, - 679697469: 676520049, - 680600666: 680180435, - 681047011: 680613920, - 676024666: 675095570, - 676026346: 675969347, - 681673022: 681405024, - 680150733: 679738051, - 676503918: 676194210, - 688580172: 687895916, - 680601013: 680321401, - 682051855: 681784630, - 680601319: 680488009, - 683252051: 682746120, - 682049099: 681698162, - 682732631: 682070345, - 688678798: 688289405, - 681674286: 681568102, - 682054669: 681908344, - 685816064: 685739480, - 685816006: 685507313, - 685816036: 685611030, - 682734792: 682158049, - 663479824: 663132753, - 685494041: 684973296, - 664899910: 664441993, - 682734376: 682131535, - 686909240: 686579753, - 686910010: 686796722, - 686919436: 686705607, - 685497280: 685064378, - 687498308: 687355505, - 690046237: 689803170, - 683257169: 683061635, - 686910134: 686467044, - 691763694: 691729174, - 686442556: 686100509, - 654920038: 654584089, - 691197571: 690512569, - 686449285: 686189020, - 686441799: 686294609, - 688579650: 687817723, - 688678784: 688008140, - 663868345: 663702484, - 690004696: 689482753, - 688678766: 688138215, - 686449092: 685694164, - 689402473: 689185054, - 689398304: 689210547, - 675478137: 675400558, - 671163047: 670911240, - 690021259: 689626516, - 692345003: 692137592, - 691199371: 690271656, - 689388034: 688817152, - 692345336: 692165696, - 689402014: 689297706, - 657082055: 657057268, - 691201201: 690464182, - 657391037: 657287148, - 690045763: 689774144, - 656381309: 654998375, - 691208363: 690790606, - 627823344: 626132632, - 636924826: 636788964, - 657650471: 657475643, - 672206735: 671661966, - 657470856: 657408209, - 690072103: 689692832, - 672674054: 672239388, - 658024115: 657927354, - 697339797: 696742680, - 637159507: 636960308, - 657776356: 657657321, - 698260532: 698197227, - 669233895: 668543586, - 654532828: 654098242, - 658831566: 658047449, - 671162646: 670833334, - 653331744: 653199400, - 658842672: 658092103, - 658854537: 658562371, - 658854486: 658097678, - 696717748: 696172756, - 700659215: 700390618, - 617405912: 617345779, - 653551965: 653517763, - 656939127: 656821080, - 699846423: 699702574, - 653924226: 653835533, - 653923501: 653642620, - 653922961: 653566034, - 657009581: 656943369, - 673914981: 673499844, - 653173685: 653139805, - 660065952: 660058791, - 657389972: 657246849, - 657078119: 656861251, - 657081119: 656978292, - 654533788: 654318350, - 657891871: 657812298, - 662033243: 661191717, - 644026238: 643699310, - 657224241: 657194671, - 657648863: 657408334, - 657390171: 657246622, - 657223595: 657093798, - 657775947: 657657370, - 663868423: 663608579, - 657079190: 657029203, - 658020264: 657923451, - 702934681: 702219057, - 657469734: 657431418, - 698762886: 698274116, - 657892020: 657811716, - 699154913: 698784138, - 704821286: 704320269, - 657648983: 657476254, - 659491419: 659191654, - 657892406: 657861558, - 658020352: 657923339, - 657649356: 657478403, - 657804824: 657660322, - 657785850: 657686834, - 703308071: 703018188, - 664914611: 664144209, - 658518486: 658094350, - 660064796: 659784363, - 653332425: 653179688, - 657649512: 657476325, - 657786322: 657679166, - 657914280: 657811501, - 657807185: 657716937, - 658816608: 658033553, - 658522835: 658103151, - 659743436: 659499661, - 669237515: 668827167, - 657649672: 657516474, - 672207947: 671933746, - 658020830: 657928466, - 660065134: 659785578, - 661328410: 661049756, - 669858844: 669286969, - 653174445: 653138855, - 658532657: 658347440, - 660510504: 660077197, - 658532840: 658421620, - 659746625: 659535566, - 664899825: 664879356, - 673144434: 672689463, - 647885322: 647781884, - 659743451: 659499892, - 668526823: 668451681, - 659749630: 659499666, - 660969879: 660527264, - 660510593: 660076860, - 658533763: 658066631, - 658854887: 658607692, - 670721500: 670413637, - 696156783: 695633751, - 689385404: 688836200, - 659495103: 659419705, - 659767482: 659499457, - 660065538: 659979750, - 661437140: 661379121, - 662351068: 661440854, - 658536111: 658310929, - 660513003: 660076781, - 661328570: 661003602, - 671162628: 670833432, - 660069314: 660042693, - 661744804: 661389521, - 698768912: 698595517, - 705944402: 704884627, - 660066712: 659784113, - 662107986: 661500738, - 672211004: 671700040, - 661753184: 661440775, - 663475712: 662996746, - 662974315: 662739484, - 648186871: 648090296, - 666550608: 666290707, - 699155265: 699130505, - 662982346: 662911174, - 662219852: 661924620, - 701046700: 700599087, - 710778377: 707632363, - 643592303: 643479143, - 662348706: 661299645, - 670395725: 669875907, - 662958642: 662401139, - 662348804: 661300356, - 662960692: 662400771, - 663479950: 663319986, - 663866413: 663504894, - 661771052: 661479289, - 664404274: 664159661, - 664394265: 663882610, - 663478400: 662996580, - 702934964: 702659500, - 669239852: 668978437, - 703308147: 703287519, - 703731597: 703325264, - 663876406: 663504968, - 663482878: 663441068, - 699155540: 699002540, - 663488086: 663353237, - 662989044: 662839646, - 663485329: 662996173, - 665305913: 664921380, - 663870102: 663761670, - 663876890: 663710404, - 666274740: 666209296, - 666589601: 666290856, - 664414452: 663882542, - 666563739: 666054314, - 704822876: 704755579, - 704826374: 704658882, - 663873076: 663763444, - 665307545: 665097336, - 662356172: 661587992, - 670721589: 670413425, - 653175011: 653141064, - 666274171: 665658214, - 674275274: 674000535, - 662361096: 662103640, - 665722301: 665631165, - 666274157: 665879171, - 662358233: 661700450, - 653331120: 653180071, - 668528146: 668445110, - 672213828: 672083282, - 669859475: 669765251, - 672220620: 671662011, - 670395999: 669915840, - 662358771: 661390989, - 665726259: 665438247, - 666274565: 666068830, - 670721867: 670495740, - 662359728: 661781665, - 672674656: 672239307, - 673475020: 673460835, - 703731696: 703705589, - 701047896: 700632617, - 665726618: 665575559, - 667011230: 666605387, - 706566686: 705520030, - 670396194: 670339150, - 667014179: 666830443, - 671618887: 671182004, - 671164927: 671072873, - 672214923: 671929354, - 707005501: 706710232, - 704298735: 704276081, - 707444935: 707357875, - 670722225: 670640115, - 653174169: 653170100, - 657469564: 657409239, - 705412356: 705292555, - 670398566: 669874870, - 671614170: 671184188, - 670399058: 670160719, - 671164733: 670912778, - 673475038: 673190784, - 672675715: 672539085, - 674275260: 674000253, - 673145838: 672897867, - 674678616: 674290950, - 672675348: 672310177, - 707917316: 707625051, - 670728674: 670413188, - 707444949: 707398104, - 707006626: 706953936, - 709948912: 709658719, - 707007273: 706948211, - 707921521: 707831887, - 673475737: 673425861, - 672223115: 671688792, - 644657636: 644429760, - 707923645: 707801916, - 710469199: 710043801, - 710024283: 709968467, - 710937195: 710587414, - 711590232: 710959347, - 710937910: 710610196, - 712178483: 711607135, - 710500829: 709693915, - 712178511: 712159883, - 710502981: 709821704, - 712919665: 712196292, - 657915168: 657861555, - 712919679: 712195429, - 716951662: 716711407, - 667004159: 666608632, - 712924011: 712812121, - 710504563: 710041594, - 710938138: 710785757, - 711590640: 711309246, - 714778358: 714638626, - 712923993: 712421917, - 713568018: 712942243, - 670733777: 670494572, - 710505947: 710043812, - 710938330: 710771367, - 711590945: 711508400, - 715923832: 715244445, - 716646781: 716425126, - 716956096: 716842120, - 673171110: 672689458, - 658020691: 657926482, - 653552163: 653545674, - 717214654: 717075402, - 717913184: 717756282, - 658021293: 657983994, - 657080632: 657032099, - 657391625: 657363188, - 653555156: 653199506, - 653932505: 653566962, - 657086258: 657064839, - 657650110: 657519102, - 657087057: 657068498, - 657012597: 656946113, - 658816715: 658561617, - 658024291: 657984062, - 657016267: 656996467, - 658020989: 657928452, - 659772816: 659679595, - 659771301: 659629558, - 662351164: 661781268, - 667348568: 667063603, - 674276329: 674000246, - 673171528: 672799969, - 662351346: 661501237, - 661773710: 661587055, - 607268593: 610508230, - 667772496: 667397892, - 667692764: 667450511, - 673173248: 672971212, - 649399061: 649382252, - 601812180: 610506225, - 674679940: 674290280, - 667364442: 667063402, - 667721307: 667483193, - 675067662: 674804863, - 667775371: 666706768, - 675070721: 674699998, - 649401936: 649387010, - 644660705: 644560631, - 644908995: 644719707, - 644909311: 644722604, - 667372460: 667268529, - 644909644: 644791172, - 667376208: 667321151, - 645035917: 644952030, - 644949350: 644933365, - 644947716: 644914198, - 645413759: 645378465, - 644386884: 644091315, - 648377368: 648193408, - 603551724: 610506913, - 637122339: 636934719, - 650079244: 650054743, - 644910997: 644814766, - 644949526: 644941813, - 645256361: 645091131, - 637669270: 637251092, - 593624660: 610504369, - 637671554: 637380703, - 645690246: 645423674, - 645699801: 645489038, - 645689073: 645510372, - 603592541: 610506955, - 647595671: 647182872, - 637670417: 637368205, - 647605431: 647492007, - 650510192: 650436490, - 646291324: 646023280, - 562043540: 610498935, - 646959487: 646826134, - 647595665: 647103976, - 647593956: 647027881, - 653052938: 653007982, - 652094901: 651786682, - 646959390: 646726175, - 647155122: 647102481, - 638754323: 638344172, - 639117180: 638873842, - 647603932: 647183600, - 647148822: 646968436, - 649938395: 649732951, - 651770380: 651674583, - 594090967: 610504515, - 649398482: 649338696, - 648644110: 648431917, - 651769499: 651528194, - 645040965: 644952044, - 649324898: 649261264, - 645474010: 645423680, - 650389887: 650118592, - 653053207: 653007143, - 652842495: 652744094, - 645086975: 645054487, - 651366510: 650908289, - 649409874: 649381281, - 646016415: 645820809, - 652337551: 652175017, - 652336350: 652105608, - 646685143: 646301726, - 650509372: 650257052, - 653054766: 653032190, - 649938123: 649502102, - 652092676: 652051206, - 651770186: 651528344, - 652092002: 651891910, - 646686778: 646352978, - 651770794: 651743229, - 652091264: 651786726, - 652094917: 652062915, - 652338101: 652171115, - 653056052: 652889732, - 653122667: 653071832, - 647143225: 646968423, - 652738799: 652546769, - 653058060: 652939233, - 652338622: 652224358, - 652340572: 652298443, - 652991352: 652963523, - 653123586: 653077024, - 652989442: 652889710, - 653123929: 653076286, - 652990651: 652959034, - 603763073: 610507141, - 653122445: 653071918, - 603889825: 610507204, - 603863146: 610507169, - 603978471: 610507238, - 652989705: 652890000, - 647598519: 647484569, - 603926442: 610507225, - 639252499: 639222514, - 603905059: 610507211, - 589755795: 610503639, - 591254266: 610503851, - 604110093: 610507259, - 603552279: 610506920, - 652730939: 652376956, - 648389302: 648296653, - 653053920: 653024056, - 587339481: 610503359, - 652842572: 652743500, - 604145810: 610507303, - 595806300: 610504859, - 596509886: 610505001, - 649938038: 649416423, - 588191926: 610503417, - 652737678: 652579438, - 597169069: 610505271, - 604529230: 610507345, - 604601380: 610507359, - 587344053: 610503366, - 588535615: 610503480, - 599420257: 610505713, - 589441079: 610503584, - 601705404: 610506145, - 591397995: 610503896, - 642664460: 642293912, - 601789309: 610506166, - 642026233: 640251509, - 601841437: 610506253, - 602053643: 610506417, - 652988777: 652886679, - 648379675: 648285038, - 593270603: 610504215, - 602589533: 610506571, - 603224878: 610506731, - 593373156: 610504236, - 604866832: 610507495, - 604328043: 610507324, - 604576637: 610507352, - 596824582: 610505123, - 604870277: 610507502, - 605035620: 610507530, - 605465843: 610507575, - 652092892: 651871743, - 593506468: 610504327, - 606340116: 610507892, - 609110140: 610508304, - 609894681: 610508790, - 653125130: 653079091, - 613586002: 613151642, - 613599811: 613152534, - 605222325: 610507568, - 604889972: 610507516, - 605800963: 610507703, - 606031380: 610507773, - 605883133: 610507738, - 606221961: 610507857, - 650390042: 650119648, - 606353987: 610507913, - 606802468: 610507979, - 606960609: 610508068, - 606873744: 610508047, - 607058394: 610508161, - 607040613: 610508119, - 606828333: 610508005, - 607063420: 610508168, - 612044635: 611910132, - 611658482: 611432002, - 612077499: 611921086, - 612536911: 612139146, - 612534310: 612152394, - 612549085: 612386302, - 612543999: 612370197, - 612555380: 612234719, - 612566550: 612405328, - 613062525: 612618629, - 623338499: 617550541, - 617429820: 617267679, - 605087965: 610507544, - 605683787: 610507665, - 605606109: 610507620, - 606151117: 610507815, - 605688822: 610507672, - 606227591: 610507864, - 611644893: 611502119, - 612546493: 612329560, - 613968705: 613870209, - 613062561: 612854518, - 613982017: 613885531, - 613974486: 613931451, - 614556106: 614392439, - 614571626: 614482934, - 614561354: 614402832, - 617035984: 616837536, - 627823723: 625962396, - 637123467: 636996363, - 643645390: 643484235, - 644051974: 643681042, - 605913519: 610507745, - 605674734: 610507658, - 605859367: 610507724, - 613974468: 613923239, - 613599793: 613427366, - 613586022: 613152593, - 617047316: 616833413, - 617069979: 616821145, - 617381605: 617180871, - 617395439: 617196048, - 617047359: 616874653, - 614846599: 614759699, - 616770941: 616620521, - 616779893: 616727921, - 616774177: 616645705, - 617395455: 617284806, - 617079480: 616821227, - 623339891: 623071722, - 623587006: 623354186, - 626028096: 623749104, - 626027888: 623758973, - 626027944: 623796157, - 627824108: 626057647, - 627823792: 626218502, - 627824037: 625920072, - 627823695: 626123869, - 627823636: 626156806, - 629789161: 627882816, - 636889229: 636785083, - 636889304: 636835307, - 636930038: 636851045, - 637113156: 636944806, - 637154333: 636934145, - 637115675: 636982135, - 637126541: 636975549, - 637668816: 637250357, - 637667993: 636983351, - 637669284: 637291356, - 644911034: 644720543, - 649317434: 649273447, - 645687787: 645422825, - 645695159: 645488613, - 645692522: 645487069, - 645691416: 645654084, - 646017558: 645855239, - 645700487: 645626001, - 646016204: 645734195, - 649399137: 649380523, - 650510708: 650481446, - 650885952: 650734598, - 637672042: 637447841, - 598582651: 610505491, - 637998955: 637923516, - 638262535: 638254877, - 650512363: 650256765, - 652096183: 651931315, - 652345569: 652192853, - 652339241: 652277074, - 598564173: 610505484, - 637990755: 637802352, - 637994504: 637941904, - 638262084: 637874895, - 638262558: 638124911, - 638262098: 638125644, - 638862121: 638769431, - 638267173: 638208119, - 638864066: 638773454, - 638754561: 638358021, - 598137246: 610505421, - 598330857: 610505456, - 598635821: 610505561, - 596769570: 610505095, - 601260046: 610505824, - 599320182: 610505682, - 599586915: 610505744, - 639117196: 639010999, - 639251932: 639131793, - 639252109: 639131163, - 638871662: 638773555, - 639117826: 638887327, - 639253043: 639146644, - 639437387: 639266130, - 639756225: 639461341, - 639254728: 639228762, - 639929075: 639665794, - 639931541: 639792164, - 639940936: 639789165, - 639932847: 639873825, - 639437957: 639396284, - 642032356: 640281387, - 642275961: 642187321, - 642275947: 642244262, - 674679019: 674550092, - 683253712: 683089406, - 669861524: 669478172, - 601273921: 610505838, - 601374506: 610505953, - 642651898: 642389261, - 642884591: 642704670, - 642883713: 642737766, - 643066628: 642921966, - 642877968: 642822182, - 643216853: 643081302, - 643586314: 643228473, - 642656700: 642499066, - 643062797: 642973400, - 601362437: 610505925, - 601368107: 610505932, - 601385772: 610505967, - 601500256: 610506044, - 652737867: 652366516, - 652991570: 652963752, - 652990427: 652957377, - 653130708: 653075038, - 653126877: 653074133, - 601328878: 610505887, - 601274353: 610505845, - 601805379: 610506204, - 601507932: 610506068, - 601790881: 610506197, - 601887677: 610506291, - 601886540: 610506284, - 601904502: 610506319, - 601910964: 610506340, - 602170460: 610506459, - 602164790: 610506452, - 603425659: 610506822, - 603195918: 610506710, - 602857315: 610506637, - 603454352: 610506857, - 603516552: 610506899, - 603519646: 610506906, - 601903169: 610506312, - 601871318: 610506277, - 601982862: 610506403, - 602206167: 610506480, - 602263642: 610506501, - 602397924: 610506508, - 603187982: 610506675, - 602574260: 610506557, - 603185265: 610506654, - 603188560: 610506689, - 603452151: 610506843, - 613062511: 612620668, - 609239161: 610508395, - 613083872: 612887668, - 613091721: 612699762, - 614851823: 614779392, - 592348507: 610504059, - 592407200: 610504094, - 592494159: 610504122, - 593240301: 610504201, - 592427707: 610504108, - 592657427: 610504156, - 592409256: 610504101, - 592655327: 610504149, - 593243892: 610504208, - 593508594: 610504341, - 593438037: 610504299, - 593416136: 610504271, - 593389688: 610504250, - 593552712: 610504348, - 593887846: 610504442, - 593646972: 610504404, - 593695648: 610504421, - 593902390: 610504456, - 594314285: 610504543, - 594127683: 610504536, - 595183197: 610504599, - 594320795: 610504557, - 595263154: 610504630, - 595229536: 610504609, - 595273803: 610504640, - 595337950: 610504689, - 595452192: 610504710, - 595621868: 610504762, - 595719414: 610504800, - 595620998: 610504748, - 595718342: 610504793, - 595808594: 610504873, - 595829914: 610504880, - 595904738: 610504908, - 595899822: 610504901, - 596525298: 610505015, - 596584192: 610505043, - 596779487: 610505102, - 596557969: 610505022, - 639443233: 638889067, - 597014165: 610505201, - 597028938: 610505229, - 638753616: 638282315, - 638756637: 638298035, - 596826262: 610505130, - 597304174: 610505313, - 497060401: 610491401, - 500860585: 610491436, - 500964514: 610491478, - 501021421: 610491499, - 501271265: 610491555, - 501337989: 610491576, - 501474098: 610491590, - 501498760: 610491618, - 501559087: 610491632, - 501567237: 610491646, - 501574836: 610491660, - 501704220: 610491667, - 501717543: 610491674, - 501729039: 610491688, - 501773889: 610491695, - 501788003: 610491709, - 501794235: 610491716, - 501800164: 610491723, - 501836392: 610491730, - 501839084: 610491737, - 501847516: 610491751, - 501876401: 610491765, - 501879034: 610491772, - 501886692: 610491779, - 501889084: 610491786, - 501929146: 610491793, - 501929610: 610491800, - 501933264: 610491807, - 501940850: 610491828, - 502066273: 610491842, - 502115959: 610491849, - 502199136: 610491870, - 502205092: 610491877, - 502254330: 610491884, - 502352946: 610491898, - 502368172: 610491912, - 502376461: 610491919, - 502382906: 610491926, - 502383036: 610491933, - 502483554: 610491940, - 502526200: 610491947, - 502608215: 610491954, - 502634578: 610491961, - 502665019: 610491968, - 502666254: 610491975, - 502667200: 610491982, - 502741583: 610491996, - 502793808: 610492003, - 502810282: 610492010, - 502962794: 610492031, - 502974807: 610492038, - 503019786: 610492052, - 503109347: 610492066, - 503324629: 610492087, - 503412730: 610492101, - 503526711: 610492108, - 503538804: 610492115, - 503772253: 610492122, - 503820068: 610492129, - 503823672: 610492136, - 503864409: 610492150, - 503866276: 610492157, - 504101079: 610492164, - 504108263: 610492178, - 504115289: 610492185, - 504508104: 610492206, - 504568756: 610492227, - 504593468: 610492234, - 504625475: 610492248, - 504642019: 610492269, - 504809131: 610492297, - 504853580: 610492304, - 505017668: 610492318, - 505314372: 610492360, - 505407318: 610492367, - 505693621: 610492381, - 505695962: 610492402, - 505696248: 610492409, - 505801925: 610492416, - 505811062: 610492430, - 505845219: 610492437, - 506030579: 610492444, - 506144725: 610492458, - 506156402: 610492465, - 506248008: 610492472, - 506278598: 610492479, - 506353473: 610492493, - 506356888: 610492500, - 506441755: 610492507, - 506456537: 610492514, - 506520696: 610492521, - 506520703: 610492528, - 506540916: 610492542, - 506694419: 610492563, - 506773185: 610492577, - 506773892: 610492584, - 506809539: 610492598, - 506823562: 610492605, - 506954308: 610492626, - 507129766: 610492647, - 507304910: 610492654, - 507464107: 610492682, - 507552264: 610492689, - 507691036: 610492703, - 507691380: 610492724, - 507691566: 610492738, - 507691735: 610492745, - 507691834: 610492752, - 507990552: 610492787, - 508220632: 610492801, - 508262069: 610492808, - 508356957: 610492864, - 508378520: 610492878, - 508546728: 610492913, - 508563988: 610492927, - 508596945: 610492941, - 508753256: 610492969, - 509580400: 610493081, - 509644421: 610493116, - 509729072: 610493123, - 509799475: 610493137, - 509841198: 610493151, - 509904120: 610493179, - 509958730: 610493193, - 509962140: 610493207, - 510021399: 610493214, - 510093797: 610493228, - 510166410: 610493242, - 510174759: 610493249, - 510214538: 610493256, - 510345479: 610493291, - 510390912: 610493298, - 510417261: 610493312, - 510514430: 610493319, - 510514474: 610493326, - 510517131: 610493340, - 510517609: 610493354, - 510524416: 610493368, - 510532780: 610493389, - 510535700: 610493403, - 510536059: 610493410, - 510536157: 610493417, - 510656082: 610493424, - 510698988: 610493438, - 510699005: 610493445, - 510705057: 610493452, - 510706209: 610493459, - 510712856: 610493466, - 510814438: 610493473, - 510859641: 610493480, - 510917254: 610493487, - 510933273: 610493494, - 510938357: 610493501, - 511194579: 610493508, - 511242327: 610493522, - 511305590: 610493548, - 511434920: 610493555, - 511440894: 610493569, - 511458599: 610493583, - 511458874: 610493590, - 511534603: 610493597, - 511573879: 610493604, - 511595995: 610493618, - 511856569: 610493639, - 511976254: 610493674, - 511976329: 610493681, - 511977695: 610493688, - 512124564: 610493709, - 512145745: 610493716, - 512149367: 610493723, - 512164988: 610493737, - 512176430: 610493744, - 512270518: 610493765, - 512311673: 610493779, - 512326618: 610493793, - 524691284: 610494332, - 524848692: 610494358, - 525368285: 610494442, - 526504941: 610494589, - 526768996: 610494624, - 526928092: 610494666, - 527048992: 610494694, - 527583578: 610494757, - 528402271: 610494904, - 528480613: 610494911, - 528574532: 610494939, - 528693630: 610494960, - 528792732: 610495009, - 528972913: 610495044, - 529487172: 610495114, - 529688779: 610495128, - 529693740: 610495135, - 529763302: 610495142, - 530047022: 610495184, - 530181996: 610495226, - 530318805: 610495282, - 530645663: 610495324, - 530739576: 610495373, - 530773844: 610495387, - 531008833: 610495443, - 531124922: 610495471, - 531134090: 610495485, - 531342486: 610495520, - 531348161: 610495534, - 537153918: 610495737, - 538803517: 610495793, - 539000397: 610495856, - 539290504: 610495884, - 539291372: 610495891, - 539487468: 610495905, - 539497234: 610495919, - 539515366: 610495933, - 539540432: 610495961, - 539643002: 610495975, - 540168837: 610496087, - 540609585: 610496115, - 540684467: 610496122, - 540729056: 610496136, - 540993890: 610496150, - 541010698: 610496157, - 541048140: 610496164, - 541206592: 610496171, - 541290571: 610496178, - 543677427: 610496332, - 544507627: 610496381, - 545446482: 610496430, - 545578997: 610496465, - 546341286: 610496542, - 546377461: 610496556, - 546641574: 610496591, - 546698458: 610496605, - 546716391: 610496612, - 546963704: 610496619, - 547315014: 610496640, - 547388708: 610496682, - 547560448: 610496724, - 547573479: 610496738, - 548227481: 610496752, - 548379748: 610496780, - 549483412: 610496864, - 549855420: 610496885, - 550127307: 610496899, - 550197614: 610496927, - 550374428: 610496955, - 550455111: 610496969, - 550490398: 610496976, - 550851591: 610496997, - 551412605: 610497074, - 551657972: 610497081, - 551834174: 610497123, - 551888519: 610497130, - 552195520: 610497137, - 552318211: 610497172, - 552324309: 610497179, - 552410386: 610497193, - 552427971: 610497221, - 552569752: 610497249, - 552760671: 610497277, - 553000583: 610497312, - 553012563: 610497319, - 553233689: 610497375, - 553568031: 610497403, - 554014020: 610497438, - 554021353: 610497445, - 554037270: 610497466, - 554219904: 610497480, - 554254184: 610497508, - 554284637: 610497515, - 555018432: 610497595, - 555040116: 610497609, - 555042467: 610497616, - 555237087: 610497637, - 555257822: 610497644, - 555327035: 610497651, - 555356387: 610497672, - 555749369: 610497693, - 555801657: 610497700, - 555813683: 610497707, - 556321897: 610497721, - 556338149: 610497735, - 556344224: 610497742, - 556344441: 610497749, - 556353209: 610497756, - 556665481: 610497791, - 556700770: 610497798, - 556919719: 610497819, - 556936293: 610497833, - 556936622: 610497840, - 556936856: 610497847, - 556999461: 610497854, - 557182484: 610497868, - 557225279: 610497896, - 557227804: 610497903, - 557304694: 610497917, - 557345665: 610497938, - 557393040: 610497945, - 557395543: 610497952, - 557414237: 610497959, - 557420967: 610497966, - 557520764: 610497973, - 557589954: 610497980, - 557615965: 610497987, - 557626633: 610497994, - 557848210: 610498015, - 557956194: 610498022, - 557984485: 610498043, - 558387203: 610498064, - 558389981: 610498071, - 558476282: 610498120, - 558560971: 610498134, - 558581038: 610498141, - 558670888: 610498183, - 559082739: 610498204, - 559087706: 610498211, - 559192380: 610498225, - 559382012: 610498246, - 559394526: 610498253, - 559645339: 610498267, - 559869893: 610498288, - 560027980: 610498330, - 560578599: 610498435, - 560596067: 610498456, - 560689712: 610498470, - 560745435: 610498505, - 560782656: 610498540, - 560802931: 610498561, - 560806119: 610498568, - 560809202: 610498575, - 560866155: 610498596, - 560876151: 610498610, - 560898462: 610498631, - 560916904: 610498638, - 560920977: 610498645, - 560926639: 610498652, - 561312435: 610498697, - 561331220: 610498725, - 561405713: 610498760, - 561472633: 610498781, - 561528269: 610498830, - 561531215: 610498844, - 561994407: 610498907, - 562003583: 610498921, - 562052595: 610498949, - 562095852: 610498963, - 562172003: 610498984, - 562122508: 610498970, - 562220433: 610498998, - 562222842: 610499012, - 562296530: 610499026, - 562382668: 610499061, - 562536153: 610499096, - 562660121: 610499131, - 562711440: 610499145, - 563027941: 610499201, - 563176332: 610499222, - 563226901: 610499250, - 563335004: 610499271, - 563500510: 610499334, - 563582972: 610499355, - 563710064: 610499390, - 564395580: 610499432, - 564425777: 610499467, - 564607188: 610499481, - 565039912: 610499523, - 565104109: 610499537, - 565216523: 610499575, - 565293865: 610499589, - 565462806: 610499624, - 565583560: 610499631, - 565698388: 610499645, - 566096665: 610499673, - 566307038: 610499687, - 566458505: 610499715, - 566523247: 610499736, - 566645518: 610499757, - 566716486: 610499806, - 566719810: 610499813, - 566752133: 610499827, - 567446262: 610499876, - 567709426: 610499904, - 567734055: 610499925, - 567878987: 610499960, - 568753147: 610500051, - 568775666: 610500058, - 568796683: 610500072, - 569251677: 610500142, - 569252439: 610500149, - 569299884: 610500184, - 569374806: 610500205, - 569396924: 610500219, - 569407590: 610500233, - 569431665: 610500247, - 569457162: 610500261, - 569457271: 610500268, - 569478789: 610500282, - 569494121: 610500296, - 569611979: 610500331, - 569635505: 610500338, - 569645690: 610500345, - 569718097: 610500359, - 569722788: 610500373, - 569739027: 610500380, - 569790130: 610500401, - 569792817: 610500408, - 569810774: 610500415, - 569818138: 610500436, - 569896493: 610500450, - 569933532: 610500464, - 569967584: 610500478, - 569981240: 610500506, - 570006683: 610500520, - 570008444: 610500527, - 570059563: 610500562, - 570080979: 610500569, - 570236381: 610500597, - 570236726: 610500618, - 570278597: 610500660, - 570305847: 610500674, - 570428252: 610500688, - 570472763: 610500702, - 570888896: 610500737, - 570889097: 610500744, - 570909395: 610500765, - 570994452: 610500793, - 571006300: 610500807, - 571006351: 610500814, - 571099190: 610500849, - 571103671: 610500856, - 571137446: 610500877, - 571177441: 610500898, - 571177752: 610500912, - 571255084: 610500940, - 571418966: 610500985, - 571494829: 610501020, - 571541565: 610501041, - 571642389: 610501062, - 571684733: 610501069, - 571912779: 610501139, - 572376868: 610501167, - 572409326: 610501188, - 572489757: 610501202, - 572499364: 610501216, - 572505201: 610501223, - 572606382: 610501265, - 572722662: 610501286, - 572805162: 610501307, - 573083539: 610501349, - 573110620: 610501363, - 573261515: 610501377, - 573720508: 610501461, - 573844211: 610501482, - 573850303: 610501489, - 573864650: 610501503, - 573865128: 610501517, - 573990411: 610501524, - 574180032: 610501552, - 574415929: 610501597, - 574529965: 610501604, - 574685634: 610501646, - 574751273: 610501653, - 574823092: 610501660, - 574824922: 610501667, - 574921369: 610501681, - 574989957: 610501709, - 574990702: 610501716, - 575135986: 610501723, - 575232864: 610501751, - 575302108: 610501765, - 575708990: 610501786, - 575766607: 610501814, - 575795843: 610501870, - 575890352: 610501884, - 575939366: 610501933, - 575970700: 610501940, - 576001843: 610501961, - 576095926: 610502003, - 576208495: 610502024, - 576261945: 610502038, - 576273468: 610502045, - 576373003: 610502052, - 576411246: 610502059, - 576757012: 610502080, - 577219368: 610502108, - 577225417: 610502115, - 577313742: 610502122, - 577379202: 610502136, - 577663639: 610502143, - 577665023: 610502150, - 577720111: 610502157, - 577820172: 610502185, - 577859418: 610502192, - 577885923: 610502199, - 578220711: 610502206, - 578260272: 610502220, - 578431761: 610502241, - 578485778: 610502255, - 578553996: 610502269, - 578674360: 610502290, - 578917373: 610502311, - 579966129: 610502353, - 579968437: 610502360, - 580013262: 610502374, - 580043440: 610502381, - 580051759: 610502388, - 580095647: 610502395, - 580095655: 610502402, - 580124131: 610502409, - 580163817: 610502416, - 580253793: 610502423, - 580570243: 610502430, - 580608427: 610502437, - 580631157: 610502444, - 580878455: 610502465, - 580895806: 610502486, - 581026088: 610502500, - 581108813: 610502521, - 581120502: 610502528, - 581150104: 610502542, - 581153070: 610502549, - 581356515: 610502591, - 581393200: 610502605, - 581597734: 610502612, - 581651157: 610502619, - 581676766: 610502626, - 505198966: 610492346, - 598905882: 610505585, - 599125537: 610505637, - 599909878: 610505796, - 601259499: 610505810, - 601300528: 610505873, - 601338233: 610505901, - 601386559: 610505974, - 601423209: 610506002, - 613074493: 612832788, - 601547955: 610506131, - 603576132: 610506941, - 602866800: 610506644, - 603226974: 610506745, - 603452291: 610506850, - 603604371: 610506976, - 603853341: 610507155, - 623339221: 623108204, - 609517556: 610508582, - 610369753: 610508837, - 611638995: 611472608, - 612546472: 612435889, - 614535829: 614036673, - 616785862: 616615496, - 623342906: 623146119, - 623347352: 623259385, - 623594229: 623395786, - 636891528: 636828311, - 627823328: 623890837, - 640198011: 640109275, - 642278925: 642045223, - 639948535: 639791989, - 582622495: 610502654, - 582649269: 610502668, - 582649934: 610502675, - 582838758: 610502689, - 582867147: 610502696, - 582918858: 610502710, - 583130100: 610502745, - 583136567: 610502752, - 583137106: 610502759, - 583149151: 610502773, - 583279803: 610502794, - 583296652: 610502801, - 583301416: 610502808, - 583495670: 610502822, - 583631286: 610502850, - 583708711: 610502857, - 584196534: 610502888, - 584235345: 610502913, - 584477294: 610502934, - 584501013: 610502941, - 584533518: 610502955, - 584544569: 610502962, - 584635095: 610502990, - 584635321: 610502997, - 584778283: 610503014, - 584829667: 610503028, - 584930390: 610503063, - 584944065: 610503070, - 584983136: 610503077, - 584983527: 610503084, - 585035184: 610503098, - 585078375: 610503112, - 585900296: 610503161, - 585953317: 610503206, - 585991944: 610503227, - 586065853: 610503262, - 586241882: 610503279, - 586351981: 610503286, - 586452281: 610503307, - 587059960: 610503331, - 587071892: 610503345, - 588655112: 610503497, - 589098031: 610503525, - 588497080: 610503445, - 588483711: 610503438, - 588656922: 610503511, - 589253444: 610503546, - 590047029: 610503674, - 590168385: 610503695, - 589637407: 610503598, - 590109296: 610503688, - 589423553: 610503577, - 590513448: 610503730, - 590565013: 610503751, - 591300156: 610503858, - 591414748: 610503910, - 591460070: 610503924, - 591392166: 610503882, - 591563201: 610503997, - 591548033: 610503983, - 591430494: 610503917, - 591537010: 610503969, - 591640135: 610504038, - 591823992: 610504052, - 591780793: 610504045, - 500855614: 610491429 -} diff --git a/allensdk/core/reference_space.py b/allensdk/core/reference_space.py deleted file mode 100644 index e56a82e378..0000000000 --- a/allensdk/core/reference_space.py +++ /dev/null @@ -1,418 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from __future__ import division, print_function, absolute_import -from collections import defaultdict -import operator as op -import functools -import os -import csv - -from scipy.ndimage.interpolation import zoom -import numpy as np -import nrrd -import pandas as pd - -from allensdk.core.structure_tree import StructureTree - - -class ReferenceSpace(object): - - @property - def direct_voxel_map(self): - if not hasattr(self, '_direct_voxel_map'): - self.direct_voxel_counts() - return self._direct_voxel_map - - @direct_voxel_map.setter - def direct_voxel_map(self, data): - self._direct_voxel_map = data - - @property - def total_voxel_map(self): - if not hasattr(self, '_total_voxel_map'): - self.total_voxel_counts() - return self._total_voxel_map - - @total_voxel_map.setter - def total_voxel_map(self, data): - self._total_voxel_map = data - - def __init__(self, structure_tree, annotation, resolution): - '''Handles brain structures in a 3d reference space - - Parameters - ---------- - structure_tree : StructureTree - Defines the heirarchy and properties of the brain structures. - annotation : numpy ndarray - 3d volume whose elements are structure ids. - resolution : length-3 tuple of numeric - Resolution of annotation voxels along each dimension. - - ''' - - self.structure_tree = structure_tree - self.resolution = resolution - - self.annotation = np.ascontiguousarray(annotation) - - def direct_voxel_counts(self): - '''Determines the number of voxels directly assigned to one or more - structures. - - Returns - ------- - dict : - Keys are structure ids, values are the number of voxels directly - assigned to those structures. - - ''' - - uniques = np.unique(self.annotation, return_counts=True) - found = {k: v for k, v in zip(*uniques) if k != 0} - - self._direct_voxel_map = {k: (found[k] if k in found else 0) for k - in self.structure_tree.node_ids()} - - def total_voxel_counts(self): - '''Determines the number of voxels assigned to a structure or its - descendants - - Returns - ------- - dict : - Keys are structure ids, values are the number of voxels assigned - to structures' descendants. - - ''' - - self._total_voxel_map = {} - for stid in self.structure_tree.node_ids(): - - desc_ids = self.structure_tree.descendant_ids([stid])[0] - self._total_voxel_map[stid] = sum([self.direct_voxel_map[dscid] - for dscid in desc_ids]) - - def remove_unassigned(self, update_self=True): - '''Obtains a structure tree consisting only of structures that have - at least one voxel in the annotation. - - Parameters - ---------- - update_self : bool, optional - If True, the contained structure tree will be replaced, - - Returns - ------- - list of dict : - elements are filtered structures - - ''' - - structures = self.structure_tree.filter_nodes( - lambda x: self.total_voxel_map[x['id']] > 0) - - if update_self: - self.structure_tree = StructureTree(structures) - - return structures - - def make_structure_mask(self, structure_ids, direct_only=False): - '''Return an indicator array for one or more structures - - Parameters - ---------- - structure_ids : list of int - Make a mask that indicates the union of these structures' voxels - direct_only : bool, optional - If True, only include voxels directly assigned to a structure in - the mask. Otherwise include voxels assigned to descendants. - - Returns - ------- - numpy ndarray : - Same shape as annotation. 1 inside mask, 0 outside. - - ''' - - if direct_only: - mask = np.zeros(self.annotation.shape, dtype=np.uint8, order='C') - for stid in structure_ids: - - if self.direct_voxel_map[stid] == 0: - continue - - mask[self.annotation == stid] = True - - return mask - - else: - structure_ids = self.structure_tree.descendant_ids(structure_ids) - structure_ids = set(functools.reduce(op.add, structure_ids)) - return self.make_structure_mask(structure_ids, direct_only=True) - - def many_structure_masks(self, structure_ids, output_cb=None, - direct_only=False): - '''Build one or more structure masks and do something with them - - Parameters - ---------- - structure_ids : list of int - Specify structures to be masked - output_cb : function, optional - Must have the following signature: output_cb(structure_id, fn). - On each requested id, fn will be curried to make a mask for that - id. Defaults to returning the structure id and mask. - direct_only : bool, optional - If True, only include voxels directly assigned to a structure in - the mask. Otherwise include voxels assigned to descendants. - - Yields - ------- - Return values of output_cb called on each structure_id, structure_mask - pair. - - Notes - ----- - output_cb is called on every yield, so any side-effects (such as - writing to a file) will be carried out regardless of what you do with - the return values. You do actually have to iterate through the output, - though. - - ''' - - if output_cb is None: - output_cb = ReferenceSpace.return_mask_cb - - for stid in structure_ids: - yield output_cb(stid, functools.partial(self.make_structure_mask, - [stid], direct_only)) - - - def check_coverage(self, structure_ids, domain_mask): - '''Determines whether a spatial domain is completely covered by - structures in a set. - - Parameters - ---------- - structure_ids : list of int - Specifies the set of structures to check. - domain_mask : numpy ndarray - Same shape as annotation. 1 inside the mask, 0 out. Specifies - spatial domain. - - Returns - ------- - numpy ndarray : - 1 where voxels are missing from the candidate, 0 where the - candidate exceeds the domain - - ''' - - candidate_mask = self.make_structure_mask(structure_ids) - return domain_mask - candidate_mask - - def validate_structures(self, structure_ids, domain_mask): - '''Determines whether a set of structures produces an exact and - nonoverlapping tiling of a spatial domain - - Parameters - ---------- - structure_ids : list of int - Specifies the set of structures to check. - domain_mask : numpy ndarray - Same shape as annotation. 1 inside the mask, 0 out. Specifies - spatial domain. - - Returns - ------- - set : - Ids of structures that are the ancestors of other structures in - the supplied set. - numpy ndarray : - Indicator for missing voxels. - - ''' - - return [self.structure_tree.has_overlaps(structure_ids), - self.check_coverage(structure_ids, domain_mask)] - - - def downsample(self, target_resolution): - '''Obtain a smaller reference space by downsampling - - Parameters - ---------- - target_resolution : tuple of numeric - Resolution in microns of the output space. - interpolator : string - Method used to interpolate the volume. Currently only 'nearest' - is supported - - Returns - ------- - ReferenceSpace : - A new ReferenceSpace with the same structure tree and a - downsampled annotation. - - ''' - - factors = [ float(ii / jj) for ii, jj in zip(self.resolution, - target_resolution)] - - target = zoom(self.annotation, factors, order=0) - - return ReferenceSpace(self.structure_tree, target, target_resolution) - - - def get_slice_image(self, axis, position, cmap=None): - '''Produce a AxBx3 RGB image from a slice in the annotation - - Parameters - ---------- - axis : int - Along which to slice the annotation volume. 0 is coronal, 1 is - horizontal, and 2 is sagittal. - position : int - In microns. Take the slice from this far along the specified axis. - cmap : dict, optional - Keys are structure ids, values are rgb triplets. Defaults to - structure rgb_triplets. - - Returns - ------- - np.ndarray : - RGB image array. - - Notes - ----- - If you assign a custom colormap, make sure that you take care of the - background in addition to the structures. - - ''' - - if cmap is None: - cmap = self.structure_tree.get_colormap() - cmap[0] = [0, 0, 0] - - position = int(np.around(position / self.resolution[axis])) - image = np.squeeze(self.annotation.take([position], axis=axis)) - - return np.reshape([cmap[point] for point in image.flat], - list(image.shape) + [3]).astype(np.uint8) - - - def export_itksnap_labels(self, id_type=np.uint16, label_description_kwargs=None): - '''Produces itksnap labels, remapping large ids if needed. - - Parameters - ---------- - id_type : np.integer, optional - Used to determine the type of the output annotation and whether ids need to be remapped to smaller values. - label_description_kwargs : dict, optional - Keyword arguments passed to StructureTree.export_label_description - - Returns - ------- - np.ndarray : - Annotation volume, remapped if needed - pd.DataFrame - label_description dataframe - - ''' - - if label_description_kwargs is None: - label_description_kwargs = {} - - label_description = self.structure_tree.export_label_description(**label_description_kwargs) - - if np.any(label_description['IDX'].values > np.iinfo(id_type).max): - label_description = label_description.sort_values(by='LABEL') - label_description = label_description.reset_index(drop=True) - new_annotation = np.zeros(self.annotation.shape, dtype=id_type) - id_map = {} - - for ii, idx in enumerate(label_description['IDX'].values): - id_map[idx] = ii + 1 - new_annotation[self.annotation == idx] = ii + 1 - - label_description['IDX'] = label_description.apply(lambda row: id_map[row['IDX']], axis=1) - return new_annotation, label_description - - return self.annotation, label_description - - - def write_itksnap_labels(self, annotation_path, label_path, **kwargs): - '''Generate a label file (nrrd) and a label_description file (csv) for use with ITKSnap - - Parameters - ---------- - annotation_path : str - write generated label file here - label_path : str - write generated label_description file here - **kwargs : - will be passed to self.export_itksnap_labels - - ''' - - annotation, labels = self.export_itksnap_labels(**kwargs) - nrrd.write(annotation_path, annotation, header={'spacings': self.resolution}) - labels.to_csv(label_path, sep=' ', index=False, header=False, quoting=csv.QUOTE_NONNUMERIC) - - - @staticmethod - def return_mask_cb(structure_id, fn): - '''A basic callback for many_structure_masks - ''' - - return structure_id, fn() - - - @staticmethod - def check_and_write(base_dir, structure_id, fn): - '''A many_structure_masks callback that writes the mask to a nrrd file - if the file does not already exist. - ''' - - mask_path = os.path.join(base_dir, - 'structure_{0}.nrrd'.format(structure_id)) - - if not os.path.exists(mask_path): - nrrd.write(mask_path, fn()) - - return structure_id - diff --git a/allensdk/core/reference_space_cache.py b/allensdk/core/reference_space_cache.py deleted file mode 100644 index 256e02b213..0000000000 --- a/allensdk/core/reference_space_cache.py +++ /dev/null @@ -1,330 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.config.manifest_builder import ManifestBuilder -from allensdk.api.warehouse_cache.cache import Cache -from allensdk.api.queries.reference_space_api import ReferenceSpaceApi -from allensdk.api.queries.ontologies_api import OntologiesApi -from allensdk.deprecated import deprecated - -from .ontology import Ontology -from .structure_tree import StructureTree -from .reference_space import ReferenceSpace - - -class ReferenceSpaceCache(Cache): - - REFERENCE_SPACE_VERSION_KEY = 'REFERENCE_SPACE_VERSION' - ANNOTATION_KEY = 'ANNOTATION' - TEMPLATE_KEY = 'TEMPLATE' - STRUCTURES_KEY = 'STRUCTURES' - STRUCTURE_TREE_KEY = 'STRUCTURE_TREE' - STRUCTURE_MASK_KEY = 'STRUCTURE_MASK' - STRUCTURE_MESH_KEY = 'STRUCTURE_MESH' - - MANIFEST_VERSION = 1.2 - - def __init__(self, - resolution, - reference_space_key, - **kwargs): - - if not 'version' in kwargs: - kwargs['version'] = self.MANIFEST_VERSION - - if not 'base_uri' in kwargs: - kwargs['base_uri'] = None - - super(ReferenceSpaceCache, self).__init__(**kwargs) - - self.resolution = resolution - self.reference_space_key = reference_space_key - - self.api = ReferenceSpaceApi(base_uri=kwargs['base_uri']) - - - def get_annotation_volume(self, file_name=None): - """ - Read the annotation volume. Download it first if it doesn't exist. - - Parameters - ---------- - - file_name: string - File name to store the annotation volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - """ - - file_name = self.get_cache_path( - file_name, self.ANNOTATION_KEY, self.reference_space_key, self.resolution) - - annotation, info = self.api.download_annotation_volume( - self.reference_space_key, - self.resolution, - file_name, - strategy='lazy') - - return annotation, info - - - def get_template_volume(self, file_name=None): - """ - Read the template volume. Download it first if it doesn't exist. - - Parameters - ---------- - - file_name: string - File name to store the template volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - """ - - file_name = self.get_cache_path( - file_name, self.TEMPLATE_KEY, self.resolution) - - template, info = self.api.download_template_volume(self.resolution, - file_name, - strategy='lazy') - - return template, info - - - def get_structure_tree(self, file_name=None, structure_graph_id=1): - """ - Read the list of adult mouse structures and return an StructureTree - instance. - - Parameters - ---------- - - file_name: string - File name to save/read the structures table. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - structure_graph_id: int - Build a tree using structure only from the identified structure graph. - """ - - file_name = self.get_cache_path(file_name, self.STRUCTURE_TREE_KEY) - - return OntologiesApi(self.api.api_url).get_structures_with_sets( - strategy='lazy', - path=file_name, - pre=StructureTree.clean_structures, - post=lambda x: StructureTree(StructureTree.clean_structures(x)), - structure_graph_ids=structure_graph_id, - **Cache.cache_json()) - - - def get_reference_space(self, structure_file_name=None, - annotation_file_name=None): - """ - Build a ReferenceSpace from this cache's annotation volume and - structure tree. The ReferenceSpace does operations that relate brain - structures to spatial domains. - - Parameters - ---------- - - structure_file_name: string - File name to save/read the structures table. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - - annotation_file_name: string - File name to store the annotation volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - """ - - return ReferenceSpace(self.get_structure_tree(structure_file_name), - self.get_annotation_volume(annotation_file_name)[0], - [self.resolution] * 3) - - def get_structure_mask(self, structure_id, file_name=None, annotation_file_name=None): - """ - Read a 3D numpy array shaped like the annotation volume that has non-zero values where - voxels belong to a particular structure. This will take care of identifying substructures. - - Notes - ----- - This method downloads structure masks from the Allen Institute. To make your own locally, see - ReferenceSpace.many_structure_masks. - - Parameters - ---------- - - structure_id: int - ID of a structure. - - file_name: string - File name to store the structure mask. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - annotation_file_name: string - File name to store the annotation volume. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - """ - structure_id = ReferenceSpaceCache.validate_structure_id(structure_id) - - file_name = self.get_cache_path( - file_name, self.STRUCTURE_MASK_KEY, self.reference_space_key, - self.resolution, structure_id) - - return self.api.download_structure_mask(structure_id, - self.reference_space_key, - self.resolution, - file_name, - strategy='lazy') - - - def get_structure_mesh(self, structure_id, file_name=None): - """Obtain a 3D mesh specifying the surface of an annotated structure. - - Parameters - ----------- - structure_id: int - ID of a structure. - file_name: string - File name to store the structure mesh. If it already exists, - it will be read from this file. If file_name is None, the - file_name will be pulled out of the manifest. Default is None. - - Returns - ------- - vertices : np.ndarray - Dimensions are (nSamples, nCoordinates=3). Locations in the reference space - of vertices - vertex_normals : np.ndarray - Dimensions are (nSample, nElements=3). Vectors normal to vertices. - face_vertices : np.ndarray - Dimensions are (sample, nVertices=3). References are given in indices - (0-indexed here, but 1-indexed in the file) of vertices that make up each face. - face_normals : np.ndarray - Dimensions are (sample, nNormals=3). References are given in indices - (0-indexed here, but 1-indexed in the file) of vertex normals that make up each face. - - Notes - ----- - These meshes are meant for 3D visualization and as such have been smoothed. - If you are interested in performing quantative analyses, we recommend that you - use the structure masks instead. - - """ - structure_id = ReferenceSpaceCache.validate_structure_id(structure_id) - - file_name = self.get_cache_path( - file_name, self.STRUCTURE_MESH_KEY, self.reference_space_key, structure_id) - - return self.api.download_structure_mesh(structure_id, - self.reference_space_key, - file_name, - strategy='lazy') - - - def add_manifest_paths(self, manifest_builder): - """ - Construct a manifest for this Cache class and save it in a file. - - Parameters - ---------- - - file_name: string - File location to save the manifest. - - """ - - manifest_builder = super(ReferenceSpaceCache, self).add_manifest_paths(manifest_builder) - - manifest_builder.add_path(self.STRUCTURE_TREE_KEY, - 'structures.json', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.REFERENCE_SPACE_VERSION_KEY, - '%s', - parent_key='BASEDIR', - typename='dir') - - manifest_builder.add_path(self.ANNOTATION_KEY, - 'annotation_%d.nrrd', - parent_key=self.REFERENCE_SPACE_VERSION_KEY, - typename='file') - - manifest_builder.add_path(self.TEMPLATE_KEY, - 'average_template_%d.nrrd', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.STRUCTURE_MASK_KEY, - 'structure_masks/resolution_%d/structure_%d.nrrd', - parent_key=self.REFERENCE_SPACE_VERSION_KEY, - typename='file') - - manifest_builder.add_path(self.STRUCTURE_MESH_KEY, - 'structure_meshes/structure_%d.obj', - parent_key=self.REFERENCE_SPACE_VERSION_KEY, - typename='file') - - return manifest_builder - - - - - @classmethod - def validate_structure_id(cls, structure_id): - - try: - structure_id = int(structure_id) - except ValueError as e: - raise ValueError("Invalid structure_id (%s): could not convert to integer." % str(structure_id)) - - return structure_id - - - @classmethod - def validate_structure_ids(cls, structure_ids): - - for ii, sid in enumerate(structure_ids): - structure_ids[ii] = cls.validate_structure_id(sid) - - return structure_ids diff --git a/allensdk/core/simple_tree.py b/allensdk/core/simple_tree.py deleted file mode 100644 index a1cd94576d..0000000000 --- a/allensdk/core/simple_tree.py +++ /dev/null @@ -1,398 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import functools -import operator as op -from collections import defaultdict -from six import iteritems - -from allensdk.deprecated import deprecated - - -class SimpleTree( object ): - def __init__(self, nodes, - node_id_cb, - parent_id_cb): - '''A tree structure - - Parameters - ---------- - nodes : list of dict - Each dict is a node in the tree. The keys of the dict name the - properties of the node and should be consistent across nodes. - node_id_cb : function | node dict -> node id - Calling node_id_cb on a node dictionary ought to produce a unique - identifier for that node (we call this the node's id). The type - of the node id is up to you, but ought to be consistent across - nodes and must be hashable. - parent_id_cb : function | node_dict => parent node's id - As node_id_cb, but returns the id of the node's parent. - - Notes - ----- - It is easy to pass a pandas DataFrame as the nodes. Just use the - to_dict method of the dataframe like so: - list_of_dict = your_dataframe.to_dict('record') - your_tree = SimpleTree(list_of_dict, ...) - Converting a list of dictionaries to a pandas DataFrame is also very - easy. The DataFrame constructor does it for you: - your_dataframe = pandas.DataFrame(list_of_dict) - - ''' - - self._nodes = { node_id_cb(n):n for n in nodes } - self._parent_ids = { nid:parent_id_cb(n) for nid,n in iteritems(self._nodes) } - self._child_ids = { nid:[] for nid in self._nodes } - - for nid in self._parent_ids: - pid = self._parent_ids[nid] - if pid is not None: - self._child_ids[pid].append(nid) - - self.node_id_cb = node_id_cb - self.parent_id_cb = parent_id_cb - - - def filter_nodes(self, criterion): - '''Obtain a list of nodes filtered by some criterion - - Parameters - ---------- - criterion : function | node dict => bool - Only nodes for which criterion returns true will be returned. - - Returns - ------- - list of dict : - Items are node dictionaries that passed the filter. - - ''' - - return list(filter(criterion, self._nodes.values())) - - - def value_map(self, from_fn, to_fn): - '''Obtain a look-up table relating a pair of node properties across - nodes - - Parameters - ---------- - from_fn : function | node dict => hashable value - The keys of the output dictionary will be obtained by calling - from_fn on each node. Should be unique. - to_fn : function | node_dict => value - The values of the output function will be obtained by calling - to_fn on each node. - - Returns - ------- - dict : - Maps the node property defined by from_fn to the node property - defined by to_fn across nodes. - - ''' - - vm = {} - for node in self._nodes.values(): - key = from_fn(node) - value = to_fn(node) - - if key in vm: - raise RuntimeError('from_fn is not unique across nodes. ' - 'Collision between {0} and {1}.'.format(value, vm[key])) - vm[key] = value - - return vm - - - def nodes_by_property(self, key, values, to_fn=None): - '''Get nodes by a specified property - - Parameters - ---------- - key : hashable or function - The property used for lookup. Should be unique. If a function, will - be invoked on each node. - values : list - Select matching elements from the lookup. - to_fn : function, optional - Defines the outputs, on a per-node basis. Defaults to returning - the whole node. - - Returns - ------- - list : - outputs, 1 for each input value. - - ''' - - if to_fn is None: - to_fn = lambda x: x - - if not callable( key ): - from_fn = lambda x: x[key] - else: - from_fn = key - - value_map = self.value_map( from_fn, to_fn ) - return [ value_map[vv] for vv in values ] - - - def node_ids(self): - '''Obtain the node ids of each node in the tree - - Returns - ------- - list : - elements are node ids - - ''' - - return list(self._nodes) - - - @deprecated("Use SimpleTree.parent_ids instead.") - def parent_id(self, node_ids): - return self.parent_ids(node_ids) - - - def parent_ids(self, node_ids): - '''Obtain the ids of one or more nodes' parents - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose parents you wish to find. - - Returns - ------- - list of hashable : - Items are ids of input nodes' parents in order. - - ''' - - return [ self._parent_ids[nid] for nid in node_ids ] - - - def child_ids(self, node_ids): - '''Obtain the ids of one or more nodes' children - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose children you wish to find. - - Returns - ------- - list of list of hashable : - Items are lists of input nodes' children's ids. - - ''' - - return [ self._child_ids[nid] for nid in node_ids ] - - - def ancestor_ids(self, node_ids): - '''Obtain the ids of one or more nodes' ancestors - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose ancestors you wish to find. - - Returns - ------- - list of list of hashable : - Items are lists of input nodes' ancestors' ids. - - Notes - ----- - Given the tree: - A -> B -> C - `-> D - - The ancestors of C are [C, B, A]. The ancestors of A are [A]. The - ancestors of D are [D, A] - - ''' - - out = [] - for nid in node_ids: - - current = [nid] - while current[-1] is not None: - current.extend(self.parent_ids([current[-1]])) - out.append(current[:-1]) - - return out - - - def descendant_ids(self, node_ids): - '''Obtain the ids of one or more nodes' descendants - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose descendants you wish to find. - - Returns - ------- - list of list of hashable : - Items are lists of input nodes' descendants' ids. - - Notes - ----- - Given the tree: - A -> B -> C - `-> D - - The descendants of A are [B, C, D]. The descendants of C are []. - - ''' - - out = [] - for ii, nid in enumerate(node_ids): - - current = [nid] - children = self.child_ids([nid])[0] - - if children: - current.extend(functools.reduce(op.add, map(list, - self.descendant_ids(children)))) - - out.append(current) - return out - - - @deprecated("Use SimpleTree.nodes instead") - def node(self, node_ids=None): - return self.nodes(node_ids) - - - def nodes(self, node_ids=None): - '''Get one or more nodes' full dictionaries from their ids. - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes to be returned. Default is all. - - Returns - ------- - list of dict : - Items are nodes corresponding to argued ids. - ''' - - if node_ids is None: - node_ids = self.node_ids() - - return [ self._nodes[nid] if nid in self._nodes else None for nid in node_ids] - - - @deprecated("Use SimpleTree.parents instead") - def parent(self, node_ids): - return self.parents(node_ids) - - - def parents(self, node_ids): - '''Get one or mode nodes' parent nodes - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose parents will be found. - - Returns - ------- - list of dict : - Items are parents of nodes corresponding to argued ids. - - ''' - - return self.nodes([self._parent_ids[nid] for nid in node_ids]) - - - def children(self, node_ids): - '''Get one or mode nodes' child nodes - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose children will be found. - - Returns - ------- - list of list of dict : - Items are lists of child nodes corresponding to argued ids. - - ''' - - return list(map(self.nodes, self.child_ids(node_ids))) - - - def descendants(self, node_ids): - '''Get one or mode nodes' descendant nodes - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose descendants will be found. - - Returns - ------- - list of list of dict : - Items are lists of descendant nodes corresponding to argued ids. - - ''' - - return list(map(self.nodes, self.descendant_ids(node_ids))) - - - def ancestors(self, node_ids): - '''Get one or mode nodes' ancestor nodes - - Parameters - ---------- - node_ids : list of hashable - Items are ids of nodes whose ancestors will be found. - - Returns - ------- - list of list of dict : - Items are lists of ancestor nodes corresponding to argued ids. - - ''' - - return list(map(self.nodes, self.ancestor_ids(node_ids))) diff --git a/allensdk/core/sitk_utilities.py b/allensdk/core/sitk_utilities.py deleted file mode 100644 index 7b6df1e094..0000000000 --- a/allensdk/core/sitk_utilities.py +++ /dev/null @@ -1,175 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2018. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import warnings - -import SimpleITK as sitk -import numpy as np - - -def get_sitk_image_information(image): - ''' Extract information about a SimpleITK image - - Parameters - ---------- - image : sitk.Image - Extract information about this image. - - Returns - ------- - dict : - Extracted information. Includes spacing, origin, size, direction, and - number of components per pixel - - ''' - - return {'spacing': image.GetSpacing(), - 'origin': image.GetOrigin(), - 'size': image.GetSize(), - 'direction': image.GetDirection(), - 'ncomponents': image.GetNumberOfComponentsPerPixel()} - - -def set_sitk_image_information(image, information): - ''' Set information on a SimpleITK image - - Parameters - ---------- - image : sitk.Image - Set information on this image. - information : dict - Stores information to be set. Supports spacing, origin, direction. Also - checks (but cannot set) size and number of components per pixel - - ''' - - if 'spacing' in information: - image.SetSpacing(information.pop('spacing')) - if 'origin' in information: - image.SetOrigin(information.pop('origin')) - if 'direction' in information: - image.SetDirection(information.pop('direction')) - - if 'size' in information: - assert(np.array_equal( information.pop('size'), image.GetSize() )) - if 'ncomponents' in information: - assert( information.pop('ncomponents') == image.GetNumberOfComponentsPerPixel() ) - - if not len(information) == 0: - warnings.warn('unwritten keys: {}'.format(','.join(information.keys()))) - - -def fix_array_dimensions(array, ncomponents=1): - ''' Convenience function that reorders ndarray dimensions for io with SimpleITK - - Parameters - ---------- - array : np.ndarray - The array to be reordered - ncomponents : int, optional - Number of components per pixel, default 1. - - Returns - ------- - np.ndarray : - Reordered array - - ''' - - act_size = list(array.shape) - ndims = len(act_size) - multicomponent = ncomponents > 1 - - from_order = list(range( ndims - multicomponent )) - to_order = list(range( ndims - multicomponent ))[::-1] - - if multicomponent: - from_order += [-1] - to_order += [-1] - - return np.ascontiguousarray(np.moveaxis(array, from_order, to_order)) - - -def read_ndarray_with_sitk(path): - ''' Read a numpy array from a file using SimpleITK - - Parameters - ---------- - path : str - Read from this path - - Returns - ------- - image : np.ndarray - Obtained array - information : dict - Additional information about the array - - ''' - - image = sitk.ReadImage(str(path)) - information = get_sitk_image_information(image) - image = sitk.GetArrayFromImage(image) - - image = fix_array_dimensions(image, information['ncomponents']) - return image, information - - -def write_ndarray_with_sitk(array, path, **information): - ''' Write a numpy array to a file using SimpleITK - - Parameters - ---------- - array : np.ndarray - Array to be written. - path : str - Write to here - **information : dict - Contains additional information to be stored in the image file. - See set_sitk_image_information for more information. - - ''' - - if not 'ncomponents' in information: - information['ncomponents'] = 1 - ncomponents = information.pop('ncomponents') - - array = fix_array_dimensions(array, ncomponents) - - array = sitk.GetImageFromArray(array, ncomponents > 1) - set_sitk_image_information(array, information) - - sitk.WriteImage(array, str(path)) diff --git a/allensdk/core/structure_tree.py b/allensdk/core/structure_tree.py deleted file mode 100644 index 789a0c7c3d..0000000000 --- a/allensdk/core/structure_tree.py +++ /dev/null @@ -1,458 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from __future__ import division, print_function, absolute_import -import re -import operator as op -from six import iteritems, string_types -import functools - -import numpy as np -import pandas as pd - -from .simple_tree import SimpleTree - - -class StructureTree( SimpleTree ): - - def __init__(self, nodes): - '''A tree whose nodes are brain structures and whose edges indicate - physical containment. - - Parameters - ---------- - nodes : list of dict - Each specifies a structure. Fields are: - - 'acronym' : str - Abbreviated name for the structure. - 'rgb_triplet' : str - Canonical RGB uint8 color assigned to this structure - 'graph_id' : int - Specifies the structure graph containing this structure. - 'graph_order' : int - Canonical position in the flattened structure graph. - 'id': int - Unique structure specifier. - 'name' : str - Full name of structure. - 'structure_id_path' : list of int - This structure's ancestors (inclusive) from the root of the - tree. - 'structure_set_ids' : list of int - Unique identifiers of structure sets to which this structure - belongs. - - ''' - - super(StructureTree, self).__init__(nodes, - lambda s: int(s['id']), - lambda s: s['structure_id_path'][-2] \ - if len(s['structure_id_path']) > 1 \ - and s['structure_id_path'] is not None \ - and np.isfinite(s['structure_id_path'][-2]) \ - else None) - - - def get_structures_by_id(self, structure_ids): - '''Obtain a list of brain structures from their structure ids - - Parameters - ---------- - structure_ids : list of int - Get structures corresponding to these ids. - - Returns - ------- - list of dict : - Each item describes a structure. - - ''' - - return self.nodes(structure_ids) - - - def get_structures_by_name(self, names): - '''Obtain a list of brain structures from their names, - - Parameters - ---------- - names : list of str - Get structures corresponding to these names. - - Returns - ------- - list of dict : - Each item describes a structure. - - ''' - - return self.nodes_by_property('name', names) - - - def get_structures_by_acronym(self, acronyms): - '''Obtain a list of brain structures from their acronyms - - Parameters - ---------- - names : list of str - Get structures corresponding to these acronyms. - - Returns - ------- - list of dict : - Each item describes a structure. - - ''' - - return self.nodes_by_property('acronym', acronyms) - - - def get_structures_by_set_id(self, structure_set_ids): - '''Obtain a list of brain structures from by the sets that contain - them. - - Parameters - ---------- - structure_set_ids : list of int - Get structures belonging to these structure sets. - - Returns - ------- - list of dict : - Each item describes a structure. - - ''' - - overlap = lambda x: (set(structure_set_ids) & set(x['structure_set_ids'])) - return self.filter_nodes(overlap) - - - def get_colormap(self): - '''Get a dictionary mapping structure ids to colors across all nodes. - - Returns - ------- - dict : - Keys are structure ids. Values are RGB lists of integers. - - ''' - - return self.value_map(lambda x: x['id'], - lambda y: y['rgb_triplet']) - - - - def get_name_map(self): - '''Get a dictionary mapping structure ids to names across all nodes. - - Returns - ------- - dict : - Keys are structure ids. Values are structure name strings. - - ''' - - return self.value_map(lambda x: x['id'], - lambda y: y['name']) - - - def get_id_acronym_map(self): - '''Get a dictionary mapping structure acronyms to ids across all nodes. - - Returns - ------- - dict : - Keys are structure acronyms. Values are structure ids. - - ''' - - return self.value_map(lambda x: x['acronym'], - lambda y: y['id']) - - - def get_ancestor_id_map(self): - '''Get a dictionary mapping structure ids to ancestor ids across all - nodes. - - Returns - ------- - dict : - Keys are structure ids. Values are lists of ancestor ids. - - ''' - - return self.value_map(lambda x: x['id'], - lambda y: self.ancestor_ids([y['id']])[0]) - - - def structure_descends_from(self, child_id, parent_id): - '''Tests whether one structure descends from another. - - Parameters - ---------- - child_id : int - Id of the putative child structure. - parent_id : int - Id of the putative parent structure. - - Returns - ------- - bool : - True if the structure specified by child_id is a descendant of - the one specified by parent_id. Otherwise False. - - ''' - - return parent_id in self.ancestor_ids([child_id])[0] - - - def get_structure_sets(self): - '''Lists all unique structure sets that are assigned to at least one - structure in the tree. - - Returns - ------- - list of int : - Elements are ids of structure sets. - - ''' - - return set(functools.reduce(op.add, map(lambda x: x['structure_set_ids'], - self.nodes()))) - - - def has_overlaps(self, structure_ids): - '''Determine if a list of structures contains structures along with - their ancestors - - Parameters - ---------- - structure_ids : list of int - Check this set of structures for overlaps - - Returns - ------- - set : - Ids of structures that are the ancestors of other structures in - the supplied set. - - ''' - - ancestor_ids = functools.reduce(op.add, - map(lambda x: x[1:], - self.ancestor_ids(structure_ids))) - return (set(ancestor_ids) & set(structure_ids)) - - - def export_label_description(self, alphas=None, exclude_label_vis=None, exclude_mesh_vis=None, label_key='acronym'): - '''Produces an itksnap label_description table from this structure tree - - Parameters - ---------- - alphas : dict, optional - Maps structure ids to alpha levels. Optional - will only use provided ids. - exclude_label_vis : list, optional - The structures denoted by these ids will not be visible in ITKSnap. - exclude_mesh_vis : list, optional - The structures denoted by these ids will not have visible meshes in ITKSnap. - label_key: str, optional - Use this column for display labels. - - Returns - ------- - pd.DataFrame : - Contains data needed for loading as an ITKSnap label description file. - - ''' - - if alphas is None: - alphas = {} - if exclude_label_vis is None: - exclude_label_vis = set([]) - if exclude_mesh_vis is None: - exclude_mesh_vis = set([]) - - df = pd.DataFrame([ - { - 'IDX': node['id'], - '-R-': node['rgb_triplet'][0], - '-G-': node['rgb_triplet'][1], - '-B-': node['rgb_triplet'][2], - '-A-': alphas.get(node['id'], 1.0), - 'VIS': 1 if node['id'] not in exclude_label_vis else 0, - 'MSH': 1 if node['id'] not in exclude_mesh_vis else 0, - 'LABEL': node[label_key] - } - for node in self.nodes() - ]).loc[:, ('IDX', '-R-', '-G-', '-B-', '-A-', 'VIS', 'MSH', 'LABEL')] - - return df - - - @staticmethod - def clean_structures(structures, whitelist=None, data_transforms=None, renames=None): - '''Convert structures_with_sets query results into a form that can be - used to construct a StructureTree - - Parameters - ---------- - structures : list of dict - Each element describes a structure. Should have a structure id path - field (str values) and a structure_sets field (list of dict). - whitelist : list of str, optional - Only these fields will be included in the final structure record. Default is - the output of StructureTree.whitelist. - data_transforms : dict, optional - Keys are str field names. Values are functions which will be applied to the - data associated with those fields. Default is to map colors from hex to rgb and - convert the structure id path to a list of int. - renames : dict, optional - Controls the field names that appear in the output structure records. Default is - to map 'color_hex_triplet' to 'rgb_triplet'. - - Returns - ------- - list of dict : - structures, after conversion of structure_id_path and structure_sets - - ''' - - if whitelist is None: - whitelist = StructureTree.whitelist() - - if data_transforms is None: - data_transforms = StructureTree.data_transforms() - - if renames is None: - renames = StructureTree.renames() - whitelist.extend(renames.values()) - - for ii, st in enumerate(structures): - - StructureTree.collect_sets(st) - record = {} - - for name in whitelist: - - if name not in st: - continue - data = st[name] - - if name in data_transforms: - data = data_transforms[name](data) - - if name in renames: - name = renames[name] - - record[name] = data - - structures[ii] = record - - return structures - - @staticmethod - def data_transforms(): - return {'color_hex_triplet': StructureTree.hex_to_rgb, - 'structure_id_path': StructureTree.path_to_list} - - - @staticmethod - def renames(): - return {'color_hex_triplet': 'rgb_triplet'} - - @staticmethod - def whitelist(): - return ['acronym', 'color_hex_triplet', 'graph_id', 'graph_order', 'id', - 'name', 'structure_id_path', 'structure_set_ids'] - - - @staticmethod - def hex_to_rgb(hex_color): - '''Convert a hexadecimal color string to a uint8 triplet - - Parameters - ---------- - hex_color : string - Must be 6 characters long, unless it is 7 long and the first - character is #. If hex_color is a triplet of int, it will be - returned unchanged. - - Returns - ------- - list of int : - 3 characters long - 1 per two characters in the input string. - - ''' - - if not isinstance(hex_color, string_types): - return list(hex_color) - - if hex_color[0] == '#': - hex_color = hex_color[1:] - - return [int(hex_color[a * 2: a*2 + 2], 16) for a in range(3)] - - - @staticmethod - def path_to_list(path): - '''Structure id paths are sometimes formatted as "/"-seperated strings. - This method converts them to a list of integers, if needed. - ''' - - if not isinstance(path, string_types): - return list(path) - - return [int(stid) for stid in path.split('/') if stid != ''] - - - @staticmethod - def collect_sets(structure): - '''Structure sets may be specified by full records or id. This method - collects all of the structure set records/ids in a structure record and - replaces them with a single list of id records. - ''' - - if not 'structure_sets' in structure: - structure['structure_sets'] = [] - if not 'structure_set_ids' in structure: - structure['structure_set_ids'] = [] - - structure['structure_set_ids'].extend([sts['id'] for sts - in structure['structure_sets']]) - structure['structure_set_ids'] = list(set(structure['structure_set_ids'])) - - del structure['structure_sets'] - diff --git a/allensdk/core/swc.py b/allensdk/core/swc.py deleted file mode 100644 index 5c572c3451..0000000000 --- a/allensdk/core/swc.py +++ /dev/null @@ -1,1031 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import csv -import copy -import math -import six - -# Morphology nodes have the following fields. SWC fields are numeric. -NODE_ID = 'id' -NODE_TYPE = 'type' -NODE_X = 'x' -NODE_Y = 'y' -NODE_Z = 'z' -NODE_R = 'radius' -NODE_PN = 'parent' -SWC_COLUMNS = [NODE_ID, NODE_TYPE, NODE_X, NODE_Y, NODE_Z, NODE_R, NODE_PN] - -NODE_TREE_ID = 'tree_id' -NODE_CHILDREN = 'children' - -# shorthand for dictionary entries, to shorten sometimes long code lines -_N = NODE_ID -_TYP = NODE_TYPE -_X = NODE_X -_Y = NODE_Y -_Z = NODE_Z -_R = NODE_R -_P = NODE_PN -_C = NODE_CHILDREN -_TID = NODE_TREE_ID - - -######################################################################## -def read_swc(file_name, columns="NOT_USED", numeric_columns="NOT_USED"): - """ - Read in an SWC file and return a Morphology object. - - Parameters - ---------- - file_name: string - SWC file name. - - Returns - ------- - Morphology - A Morphology instance. - """ - compartments = [] - line_num = 1 - try: - with open(file_name, "r") as f: - for line in f: - # remove comments - if line.lstrip().startswith('#'): - continue - # read values. expected SWC format is: - # ID, type, x, y, z, rad, parent - # x, y, z and rad are floats. the others are ints - toks = line.split(' ') - vals = Compartment({ - NODE_ID: int(toks[0]), - NODE_TYPE: int(toks[1]), - NODE_X: float(toks[2]), - NODE_Y: float(toks[3]), - NODE_Z: float(toks[4]), - NODE_R: float(toks[5]), - NODE_PN: int(toks[6].rstrip()) - }) - # store this compartment - compartments.append(vals) - # increment line number (used for error reporting only) - line_num += 1 - except ValueError: - err = "File not recognized as valid SWC file.\n" - err += "Problem parsing line %d\n" % line_num - if line is not None: - err += "Content: '%s'\n" % line - raise IOError(err) - - return Morphology(compartment_list=compartments) - - -######################################################################## -######################################################################## -class Compartment(dict): - """ - A dictionary class storing information about a single morphology node - """ - - def __init__(self, *args, **kwargs): - super(Compartment, self).__init__(*args, **kwargs) - if (NODE_ID not in self or - NODE_TYPE not in self or - NODE_X not in self or - NODE_Y not in self or - NODE_Z not in self or - NODE_R not in self or - NODE_PN not in self): - raise ValueError( - "Compartment was not initialized with requisite fields") - # Each unconnected graph has its own ID. This is the ID - # of graph that the node resides in - self[NODE_TREE_ID] = -1 - - # IDs of child nodes - self[NODE_CHILDREN] = [] - - def print_node(self): - """ print out compartment information with field names """ - print("%d %d %.4f %.4f %.4f %.4f %d %s %d" % (self[_N], self[_TYP], self[ - _X], self[_Y], self[_Z], self[_R], self[_P], str(self[_C]), self[_TID])) - - -class Morphology(object): - """ - Keep track of the list of compartments in a morphology and provide - a few helper methods (soma, tree information, pruning, etc). - """ - - SOMA = 1 - AXON = 2 - DENDRITE = 3 - BASAL_DENDRITE = 3 - APICAL_DENDRITE = 4 - - NODE_TYPES = [SOMA, AXON, DENDRITE, BASAL_DENDRITE, APICAL_DENDRITE] - - def __init__(self, compartment_list=None, compartment_index=None): - """ - Try to initialize from a list of compartments first, then from - a dictionary indexed by compartment id if that fails, and finally just - leave everything empty. - - Parameters - ---------- - compartment_list: list - list of compartment dictionaries - - compartment_index: dict - dictionary of compartments indexed by id - """ - self._compartment_list = [] - self._compartment_index = {} - - ############################################## - # define tree list here for clarity, even though it's reset below - # when nodes are assigned - self._tree_list = [] - - ############################################## - # construct the compartment list and index - # first try to do so using the compartment list, then try using - # the compartment index and if that fails then complain - if compartment_list: - self.compartment_list = compartment_list - elif compartment_index: - self.compartment_index = compartment_index - ############################################## - # verify morphology is consistent with morphology rules (e.g., - # no dendrite branching from an axon) - num_errors = self._check_consistency() - if num_errors > 0: - raise ValueError("Morphology appears to be inconsistent") - ############################################## - # root node (this must be part of the soma) - self._soma = None - for i in range(len(self.compartment_list)): - seg = self.compartment_list[i] - if seg[NODE_TYPE] == Morphology.SOMA and seg[NODE_PN] < 0: - if self._soma is not None: - raise ValueError("Multiple somas detected in SWC file") - self._soma = seg - - #################################################################### - #################################################################### - # class properties, and helper functions for them - - @property - def compartment_list(self): - """ Return the compartment list. This is a property to ensure that the - compartment list and compartment index are in sync. """ - return self._compartment_list - - @compartment_list.setter - def compartment_list(self, compartment_list): - """ Update the compartment list. Update the compartment index. """ - self._set_compartments(compartment_list) - - @property - def compartment_index(self): - """ Return the compartment index. This is a property to ensure that the - compartment list and compartment index are in sync. """ - return self._compartment_index - - @compartment_index.setter - def compartment_index(self, compartment_index): - """ Update the compartment index. Update the compartment list. """ - self._set_compartments(compartment_index.values()) - - @property - def num_trees(self): - """ Return the number of trees in the morphology. A tree is - defined as everything following from a single root compartment. """ - return len(self._tree_list) - - # TODO add filter for number of nodes of a particular type - @property - def num_nodes(self): - """ Return the number of compartments in the morphology. """ - return len(self.compartment_list) - - # internal function - def _set_compartments(self, compartment_list): - """ - take a list of SWC-like objects and turn those into morphology - nodes need to be able to initialize from a list supplied by an SWC - file while also being able to initialize from the compartment list - of an existing Morphology object. As nodes in a morphology object - contain reference to nodes in that object, make a shallow copy - of input nodes and overwrite known references (ie, the - 'children' array) - """ - self._compartment_list = [] - for obj in compartment_list: - seg = copy.copy(obj) - seg[NODE_TREE_ID] = -1 - seg[NODE_CHILDREN] = [] - self._compartment_list.append(seg) - # list data now set. remove holes in sequence and re-index - self._reconstruct() - - @property - def soma(self): - """ Returns root node of soma, if present""" - return self._soma - - @property - def root(self): - """ [deprecated] Returns root node of soma, if present. Use 'soma' instead of 'root'""" - return self._soma - - #################################################################### - #################################################################### - # tree and node access - - def tree(self, n): - """ - Returns a list of all Morphology Nodes within the specified - tree. A tree is defined as a fully connected graph of nodes. - Each tree has exactly one root. - - Parameters - ---------- - n: integer - ID of desired tree - - Returns - ------- - A list of all morphology objects in the specified tree, or None - if the tree doesn't exist - """ - if n < 0 or n >= len(self._tree_list): - return None - return self._tree_list[n] - - def node(self, n): - """ - Returns the morphology node having the specified ID. - - Parameters - ---------- - n: integer - ID of desired node - - Returns - ------- - A morphology object having the specified ID, or None if such a - node doesn't exist - """ - # undocumented feature -- if a node is supplied instead of a - # node ID, the node is returned and no error is triggered - return self._resolve_node_type(n) - - def parent_of(self, seg): - """ Returns parent of the specified node. - - Parameters - ---------- - seg: integer or Morphology Object - The ID of the child node, or the child node itself - - Returns - ------- - A morphology object, or None if no parent exists or if the - specified node ID doesn't exist - """ - # if ID passed in, make sure it's converted to a compartment - # don't trap for exception here -- if supplied segment is - # incorrect, make sure the user knows about it - seg = self._resolve_node_type(seg) - # return parent of specified node - if seg is not None and seg[NODE_PN] >= 0: - return self._compartment_list[seg[NODE_PN]] - return None - - def children_of(self, seg): - """ Returns a list of the children of the specified node - - Parameters - ---------- - seg: integer or Morphology Object - The ID of the parent node, or the parent node itself - - Returns - ------- - A list of the child morphology objects. If the ID of the parent - node is invalid, None is returned. - """ - seg = self._resolve_node_type(seg) - return [self._compartment_list[c] for c in seg[NODE_CHILDREN]] - - ################################################################### - ################################################################### - # Information querying and data manipulation - - # internal function. takes an integer and returns the node having - # that ID. IF a node is passed in instead, it is returned - def _resolve_node_type(self, seg): - # if compartment passed then we don't need to convert anything - # if compartment not passed, try converting value to int - # and using that as an index - if not isinstance(seg, Compartment): - try: - seg = int(seg) - if seg < 0 or seg >= len(self._compartment_list): - return None - seg = self._compartment_list[seg] - except ValueError: - raise TypeError( - "Object not recognized as morphology node or index") - return seg - - def change_parent(self, child, parent): - """ Change the parent of a node. The child node is adjusted to - point to the new parent, the child is taken off of the previous - parent's child list, and it is added to the new parent's child list. - - Parameters - ---------- - child: integer or Morphology Object - The ID of the child node, or the child node itself - - parent: integer or Morphology Object - The ID of the parent node, or the parent node itself - - Returns - ------- - Nothing - """ - child_seg = self._resolve_node_type(child) - parent_seg = self._resolve_node_type(parent) - # if child has former parent, remove it from parent's child list - if child_seg[NODE_PN] >= 0: - old_par = self.node(child_seg[NODE_PN]) - old_par[NODE_CHILDREN].remove(child_seg[NODE_ID]) - parent_seg[NODE_CHILDREN].append(child_seg[NODE_ID]) - child_seg[NODE_PN] = parent_seg[NODE_ID] - - # returns a list of nodes located within dist of x,y,z - def find(self, x, y, z, dist, node_type=None): - """ Returns a list of Morphology Objects located within 'dist' - of coordinate (x,y,z). If node_type is specified, the search - will be constrained to return only nodes of that type. - - Parameters - ---------- - x, y, z: float - The x,y,z coordinates from which to search around - - dist: float - The search radius - - node_type: enum (optional) - One of the following constants: SOMA, AXON, DENDRITE, - BASAL_DENDRITE or APICAL_DENDRITE - - Returns - ------- - A list of all Morphology Objects matching the search criteria - """ - found = [] - for seg in self.compartment_list: - dx = seg[NODE_X] - x - dy = seg[NODE_Y] - y - dz = seg[NODE_Z] - z - if math.sqrt(dx * dx + dy * dy + dz * dz) <= dist: - if node_type is None or seg[NODE_TYPE] == node_type: - found.append(seg) - return found - - def compartment_list_by_type(self, compartment_type): - """ Return an list of all compartments having the specified - compartment type. - - Parameters - ---------- - compartment_type: int - Desired compartment type - - Returns - ------- - A list of of Morphology Objects - """ - return [x for x in self._compartment_list if x[NODE_TYPE] == compartment_type] - - def compartment_index_by_type(self, compartment_type): - """ Return an dictionary of compartments indexed by id that all have - a particular compartment type. - - Parameters - ---------- - compartment_type: int - Desired compartment type - - Returns - ------- - A dictionary of Morphology Objects, indexed by ID - """ - return {c[NODE_ID]: c for c in self._compartment_list if c[NODE_TYPE] == compartment_type} - - def save(self, file_name): - """ Write this morphology out to an SWC file - - Parameters - ---------- - file_name: string - desired name of your SWC file - """ - f = open(file_name, "w") - f.write("#n,type,x,y,z,radius,parent\n") - for seg in self.compartment_list: - f.write("%d %d " % (seg[NODE_ID], seg[NODE_TYPE])) - f.write("%0.4f " % seg[NODE_X]) - f.write("%0.4f " % seg[NODE_Y]) - f.write("%0.4f " % seg[NODE_Z]) - f.write("%0.4f " % seg[NODE_R]) - f.write("%d\n" % seg[NODE_PN]) - f.close() - - # keep for backward compatibility, but don't publish in docs - def write(self, file_name): - self.save(file_name) - - def sparsify(self, modulo, compress_ids=False): - """ Return a new Morphology object that has a given number of non-leaf, - non-root nodes removed. IDs can be reassigned so as to be continuous. - - Parameters - ---------- - modulo: int - keep 1 out of every modulo nodes. - - compress_ids: boolean - Reassign ids so that ids are continuous (no missing id numbers). - - Returns - ------- - Morphology - A new morphology instance - """ - compartments = self.compartment_index - root = self.root - keep = {} - # figure out which compartments to toss - ct = 0 - for i, c in six.iteritems(compartments): - pid = c[NODE_PN] - cid = c[NODE_ID] - ctype = c[NODE_TYPE] - # keep the root, soma, junctions, and the first child of the root - # (for visualization) - if pid < 0 or len(c[NODE_CHILDREN]) != 1 or pid == root[NODE_ID] or ctype == Morphology.SOMA: - keep[cid] = True - else: - keep[cid] = (ct % modulo) == 0 - ct += 1 - - # hook children up to their new parents - for i, c in six.iteritems(compartments): - comp_id = c[NODE_ID] - if keep[comp_id] is False: - parent_id = c[NODE_PN] - while keep[parent_id] is False: - parent_id = compartments[parent_id][NODE_PN] - for child_id in c[NODE_CHILDREN]: - compartments[child_id][NODE_PN] = parent_id - - # filter out the orphans - sparsified_compartments = {k: v for k, - v in six.iteritems(compartments) if keep[k]} - if compress_ids: - ids = sorted(sparsified_compartments.keys(), key=lambda x: int(x)) - id_hash = {fid: str(i + 1) for i, fid in enumerate(ids)} - id_hash[-1] = -1 - # build the final compartment index - out_compartments = {} - for cid, compartment in six.iteritems(sparsified_compartments): - compartment[NODE_ID] = id_hash[cid] - compartment[NODE_PN] = id_hash[compartment[NODE_PN]] - out_compartments[compartment[NODE_ID]] = compartment - return Morphology(compartment_index=out_compartments) - else: - return Morphology(compartment_index=sparsified_compartments) - - #################################################################### - #################################################################### - def _reconstruct(self): - """ - internal function that restructures data and establishes - appropriate internal linking. data is re-order, removing 'holes' - in sequence so that each object ID corresponds to its position - in compartment list. trees are (re)calculated - parent-child indices are recalculated as is compartment table - construct a map between new and old IDs - """ - remap = {} - # everything defaults to root. this way if a parent was deleted - # the child will become a new root - for i in range(len(self.compartment_list)): - remap[i] = -1 - # map old old node numbers to new ones. reset n to the new ID - # and put node in new list - new_id = 0 - tmp_list = [] - for seg in self.compartment_list: - if seg is not None: - remap[seg[NODE_ID]] = new_id - seg[NODE_ID] = new_id - tmp_list.append(seg) - new_id += 1 - # use map to reset parent values. copy objs to new list - for seg in tmp_list: - if seg[NODE_PN] >= 0: - seg[NODE_PN] = remap[seg[NODE_PN]] - # replace compartment list with newly created node list - self._compartment_list = tmp_list - # reconstruct parent/child relationship links - # forget old relations - for seg in self.compartment_list: - seg[NODE_CHILDREN] = [] - # add each object to its parents child list - for seg in self.compartment_list: - par_num = seg[NODE_PN] - if par_num >= 0: - self.compartment_list[par_num][ - NODE_CHILDREN].append(seg[NODE_ID]) - # update tree lists - self._separate_trees() - ############################ - # Rebuild internal index and links between parents and children - self._compartment_index = { - c[NODE_ID]: c for c in self.compartment_list} - # compartment list is complete and sequential so don't need index - # to resolve relationships - # for each node, reset children array - # for each node, add self to parent's child list - for seg in self._compartment_list: - seg[NODE_CHILDREN] = [] - for seg in self._compartment_list: - if seg[NODE_PN] >= 0: - self._compartment_list[seg[NODE_PN]][ - NODE_CHILDREN].append(seg[NODE_ID]) - # verify that each node ID is the same as its position in the - # compartment list - for i in range(len(self.compartment_list)): - if i != self.node(i)[NODE_ID]: - raise RuntimeError( - "Internal error detected -- compartment list not properly formed") - - def append(self, node_list): - """ Add additional nodes to this Morphology. Those nodes must - originate from another morphology object. - - Parameters - ---------- - node_list: list of Morphology nodes - """ - # construct a map between new and old IDs of added nodes - remap = {} - for i in range(len(node_list)): - remap[i] = -1 - # map old old node numbers to new ones. reset n to the new ID - # append new nodes to existing node list - old_count = len(self.compartment_list) - new_id = old_count - for seg in node_list: - if seg is not None: - remap[seg[NODE_ID]] = new_id - seg[NODE_ID] = new_id - self._compartment_list.append(seg) - new_id += 1 - # use map to reset parent values. copy objs to new list - for i in range(old_count, len(self.compartment_list)): - seg = self.compartment_list[i] - if seg[NODE_PN] >= 0: - seg[NODE_PN] = remap[seg[NODE_PN]] - self._reconstruct() - - def stumpify_axon(self, count=10): - """ Remove all axon compartments except the first 'count' - nodes, as counted from the connected axon root. - - Parameters - ---------- - count: Integer - The length of the axon 'stump', in number of compartments - """ - # find connected axon root - axon_root = None - for seg in self.compartment_list: - if seg[NODE_TYPE] == Morphology.AXON: - par_id = seg[NODE_PN] - if par_id >= 0: - par = self.compartment_list[par_id] - if par[NODE_TYPE] != Morphology.AXON: - axon_root = seg - break - if axon_root is None: - return - # flag the first 'count' nodes from the axon root - ax = axon_root - for i in range(count): - # ignore bifurcations -- go 'count' deep on one line only - ax["flag"] = i - children = ax[NODE_CHILDREN] - if len(children) > 0: - ax = children[0] - # strip out all axons that aren't flagged - for i in range(len(self.compartment_list)): - seg = self.compartment_list[i] - if seg[NODE_TYPE] == Morphology.AXON: - if "flag" not in seg: - self.compartment_list[i] = None - self._reconstruct() - - # strip out everything but the soma and the specified SWC type - def strip_all_other_types(self, node_type, keep_soma=True): - """ Strips everything from the morphology except for the - specified type. - Parent and child relationships are updated accordingly, creating - new roots when necessary. - - Parameters - ---------- - node_type: enum - The compartment type to keep in the morphology. - Use one of the following constants: SOMA, AXON, DENDRITE, - BASAL_DENDRITE, or APICAL_DENDRITE - - keep_soma: Boolean (optional) - True (default) if soma nodes should remain in the - morpyhology, and False if the soma should also be stripped - """ - flagged_for_removal = {} - # scan nodes and see which ones should be removed. keep a record - # of them - for seg in self.compartment_list: - if seg[NODE_TYPE] == node_type: - remove = False - elif seg[NODE_TYPE] == 1 and keep_soma: - remove = False - else: - remove = True - if remove: - flagged_for_removal[seg[NODE_ID]] = True - # remove selected nodes andreset parent links - for i in range(len(self.compartment_list)): - seg = self.compartment_list[i] - if seg[NODE_ID] in flagged_for_removal: - # eliminate node - self.compartment_list[i] = None - elif seg[NODE_PN] in flagged_for_removal: - # parent was eliminated. make this a new root - seg[NODE_PN] = -1 - self._reconstruct() - - # strip out the specified SWC type - def strip_type(self, node_type): - """ Strips all compartments of the specified type from the - morphology. - Parent and child relationships are updated accordingly, creating - new roots when necessary. - - Parameters - ---------- - node_type: enum - The compartment type to strip from the morphology. - Use one of the following constants: SOMA, AXON, DENDRITE, - BASAL_DENDRITE, or APICAL_DENDRITE - """ - flagged_for_removal = {} - for seg in self.compartment_list: - if seg[NODE_TYPE] == node_type: - remove = True - else: - remove = False - if remove: - flagged_for_removal[seg[NODE_ID]] = True - for i in range(len(self.compartment_list)): - seg = self.compartment_list[i] - if seg[NODE_ID] in flagged_for_removal: - # eliminate node - self.compartment_list[i] = None - elif seg[NODE_PN] in flagged_for_removal: - # parent was eliminated. make this a new root - seg[NODE_PN] = -1 - self._reconstruct() - - # strip out the specified SWC type - def convert_type(self, old_type, new_type): - """ Converts all compartments from one type to another. - Nodes of the original type are not affected so this - procedure can also be used as a merge procedure. - - Parameters - ---------- - old_type: enum - The compartment type to be changed. - Use one of the following constants: SOMA, AXON, DENDRITE, - BASAL_DENDRITE, or APICAL_DENDRITE - - new_type: enum - The target compartment type. - Use one of the following constants: SOMA, AXON, DENDRITE, - BASAL_DENDRITE, or APICAL_DENDRITE - """ - for seg in self.compartment_list: - if seg[NODE_TYPE] == old_type: - seg[NODE_TYPE] = new_type - - def apply_affine(self, aff, scale=None): - """ Apply an affine transform to all compartments in this - morphology. Node radius is adjusted as well. - - Format of the affine matrix is: - - [x0 y0 z0] [tx] - [x1 y1 z1] [ty] - [x2 y2 z2] [tz] - - where the left 3x3 the matrix defines the affine rotation - and scaling, and the right column is the translation - vector. - - The matrix must be collapsed and stored in a list as follows: - - [x0 y0, z0, x1, y1, z1, x2, y2, z2, tx, ty, tz] - - Parameters - ---------- - aff: 3x4 array of floats (python 2D list, or numpy 2D array) - the transformation matrix - """ - # In addition to transforming the locations of the morphology - # nodes, the radius of each node must be adjusted. - # There are 2 ways to measure scale from a transform. Assuming - # an isotropic transform, the scale is the cube root of the - # matrix determinant. The other ways is to measure scale - # independently along each axis. - # For now, the node radius is only updated based on the average - # scale along all 3 axes (eg, isotropic assumption), so calculate - # scale using the determinant - # - if scale is None: - # calculate the determinant - det0 = aff[0] * (aff[4] * aff[8] - aff[5] * aff[7]) - det1 = aff[1] * (aff[3] * aff[8] - aff[5] * aff[6]) - det2 = aff[2] * (aff[3] * aff[7] - aff[4] * aff[6]) - det = det0 + det1 + det2 - # determinant is change of volume that occurred during transform - # assume equal scaling along all axes. take 3rd root to get - # scale factor - det_scale = math.pow(abs(det), 1.0 / 3.0) - # measure scale along each axis - # keep this code here in case - #scale_x = abs(aff[0] + aff[3] + aff[6]) - #scale_y = abs(aff[1] + aff[4] + aff[7]) - #scale_z = abs(aff[2] + aff[5] + aff[8]) - #avg_scale = (scale_x + scale_y + scale_z) / 3.0; - # - # use determinant for scaling for now as it's most simple - scale = det_scale - for seg in self.compartment_list: - x = seg[NODE_X] * aff[0] + seg[NODE_Y] * \ - aff[1] + seg[NODE_Z] * aff[2] + aff[9] - y = seg[NODE_X] * aff[3] + seg[NODE_Y] * \ - aff[4] + seg[NODE_Z] * aff[5] + aff[10] - z = seg[NODE_X] * aff[6] + seg[NODE_Y] * \ - aff[7] + seg[NODE_Z] * aff[8] + aff[11] - seg[NODE_X] = x - seg[NODE_Y] = y - seg[NODE_Z] = z - seg[NODE_R] *= scale - - def _separate_trees(self): - """ - construct list of independent trees (each tree has a root of -1) - """ - trees = [] - # reset each node's tree ID to indicate that it's not assigned - for seg in self.compartment_list: - seg[NODE_TREE_ID] = -1 - # construct trees for each node - # if a node is adjacent an existing tree, merge to it - # if a node is adjacent multiple trees, merge all - for seg in self.compartment_list: - # see what trees this node is adjacent to - local_trees = [] - if seg[NODE_PN] >= 0 and self.compartment_list[seg[NODE_PN]][NODE_TREE_ID] >= 0: - local_trees.append(self.compartment_list[ - seg[NODE_PN]][NODE_TREE_ID]) - for child_id in seg[NODE_CHILDREN]: - child = self.compartment_list[child_id] - if child[NODE_TREE_ID] >= 0: - local_trees.append(child[NODE_TREE_ID]) - # figure out which tree to put node into - # if there are muliple possibilities, merge all of them - if len(local_trees) == 0: - tree_num = len(trees) # create new tree - elif len(local_trees) == 1: - tree_num = local_trees[0] # use existing tree - elif len(local_trees) > 1: - # this node is an intersection of multiple trees - # merge all trees into the first one found - tree_num = local_trees[0] - for j in range(1, len(local_trees)): - dead_tree = local_trees[j] - trees[dead_tree] = [] - for node in self.compartment_list: - if node[NODE_TREE_ID] == dead_tree: - node[NODE_TREE_ID] = tree_num - # merge node into tree - # ensure there's space - while len(trees) <= tree_num: - trees.append([]) - trees[tree_num].append(seg) - seg[NODE_TREE_ID] = tree_num - # consolidate tree lists into class's tree list object - self._tree_list = [] - for tree in trees: - if len(tree) > 0: - self._tree_list.append(tree) - # make soma's tree be the first tree, if soma present - # this should be the case if the file is properly ordered, but - # don't assume that - soma_tree = -1 - for seg in self.compartment_list: - if seg[NODE_TYPE] == 1: - soma_tree = seg[NODE_TREE_ID] - break - if soma_tree > 0: - # swap soma tree for first tree in list - tmp = self._tree_list[soma_tree] - self._tree_list[soma_tree] = self._tree_list[0] - self._tree_list[0] = tmp - # reset node tree_id to correct tree number - self._reset_tree_ids() - - def _reset_tree_ids(self): - """ - reset each node's tree_id value to the correct tree number - """ - for i in range(len(self._tree_list)): - for j in range(len(self._tree_list[i])): - self._tree_list[i][j][NODE_TREE_ID] = i - - def _check_consistency(self): - """ - internal function -- don't publish in the docs - TODO? print warning if unrecognized types are present - Return value: number of errors detected in file - """ - errs = 0 - # Make sure that the parents are of proper ID range - n = self.num_nodes - for seg in self.compartment_list: - if seg[NODE_PN] >= 0: - if seg[NODE_PN] >= n: - print("Parent for node %d is invalid (%d)" % - (seg[NODE_ID], seg[NODE_PN])) - errs += 1 - # make sure that each tree has exactly one root - for i in range(self.num_trees): - tree = self.tree(i) - root = -1 - for j in range(len(tree)): - if tree[j][NODE_PN] == -1: - if root >= 0: - print("Too many roots in tree %d" % i) - errs += 1 - root = j - if root == -1: - print("No root present in tree %d" % i) - errs += 1 - # make sure each axon has at most one root - # find type boundaries. at each axon boundary, walk back up - # tree to root and make sure another axon segment not - # encountered - adoptees = self._find_type_boundary() - for child in adoptees: - if child[NODE_TYPE] == Morphology.AXON: - par_id = child[NODE_PN] - while par_id >= 0: - par = self.compartment_list[par_id] - if par[NODE_TYPE] == Morphology.AXON: - print("Branch has multiple axon roots") - print(child) - print(par) - errs += 1 - break - par_id = par[NODE_PN] - if errs > 0: - print("Failed consistency check: %d errors encountered" % errs) - return errs - - def _find_type_boundary(self): - """ - return a list of segments who have parents that are a different type - """ - adoptees = [] - for node in self.compartment_list: - par = self.parent_of(node) - if par is None: - continue - if node[NODE_TYPE] != par[NODE_TYPE]: - adoptees.append(node) - return adoptees - - # remove tree from swc's "forest" - def delete_tree(self, n): - """ Delete tree, and all of its compartments, from the morphology. - - Parameters - ---------- - n: Integer - The tree number to delete - """ - if n < 0: - return - if n >= self.num_trees: - print("Error -- attempted to delete non-existing tree (%d)" % n) - raise ValueError - tree = self.tree(n) - for i in range(len(tree)): - self.compartment_list[tree[i][NODE_ID]] = None - del self._tree_list[n] - self._reconstruct() - # reset node tree_id to correct tree number - self._reset_tree_ids() - - def _print_all_nodes(self): - """ - debugging function. prints all nodes - """ - for node in self.compartment_list: - print(node) - -######################################################################## -class Marker(dict): - """ Simple dictionary class for handling reconstruction marker objects. """ - - SPACING = [.1144, .1144, .28] - - CUT_DENDRITE = 10 - NO_RECONSTRUCTION = 20 - - def __init__(self, *args, **kwargs): - super(Marker, self).__init__(*args, **kwargs) - - # marker file x,y,z coordinates are offset by a single image-space - # pixel - self['x'] -= self.SPACING[0] - self['y'] -= self.SPACING[1] - self['z'] -= self.SPACING[2] - - -def read_marker_file(file_name): - """ read in a marker file and return a list of dictionaries """ - - with open(file_name, 'r') as f: - rows = csv.DictReader((r for r in f if not r.startswith('#')), - fieldnames=['x', 'y', 'z', 'radius', 'shape', 'name', 'comment', - 'color_r', 'color_g', 'color_b']) - - return [Marker({'x': float(r['x']), - 'y': float(r['y']), - 'z': float(r['z']), - 'name': int(r['name'])}) for r in rows] diff --git a/allensdk/core/typing.py b/allensdk/core/typing.py deleted file mode 100644 index 2a747557df..0000000000 --- a/allensdk/core/typing.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -try: - # for Python 3.8 and greater - from typing import Protocol -except ImportError: - # for Python 3.7 and before - from typing import _Protocol as Protocol - -from abc import abstractmethod - - -class SupportsStr(Protocol): - """Classes that support the __str__ method""" - @abstractmethod - def __str__(self) -> str: - pass diff --git a/allensdk/deprecated.py b/allensdk/deprecated.py deleted file mode 100644 index 883c3217f5..0000000000 --- a/allensdk/deprecated.py +++ /dev/null @@ -1,103 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import copy -import warnings -import functools -from numpy import VisibleDeprecationWarning - - -def deprecated(message=None): - - if message is None: - message = '' - - def output_decorator(fn): - - @functools.wraps(fn) - def wrapper(*args, **kwargs): - - warnings.warn("Function {0} is deprecated. {1}".format( - fn.__name__, message), - category=VisibleDeprecationWarning, stacklevel=2) - - return fn(*args, **kwargs) - - return wrapper - - return output_decorator - - -def class_deprecated(message=None): - - if message is None: - message = '' - - def output_class_decorator(cls): - - fn_copy = copy.deepcopy(cls.__init__) - - @functools.wraps(cls.__init__) - def wrapper(*args, **kwargs): - warnings.warn("Class {0} is deprecated. {1}".format( - cls.__name__, message), - category=VisibleDeprecationWarning, stacklevel=2) - fn_copy(*args, **kwargs) - - cls.__init__ = wrapper - return cls - - return output_class_decorator - - -def legacy(message=None): - - if message is None: - message = '' - - def output_decorator(fn): - - @functools.wraps(fn) - def wrapper(*args, **kwargs): - - warnings.warn("Function {0} is provided for backward-compatibilty with a legacy API, and may be removed in the future. {1}".format( - fn.__name__, message), - category=VisibleDeprecationWarning, stacklevel=2) - - return fn(*args, **kwargs) - - return wrapper - - return output_decorator \ No newline at end of file diff --git a/allensdk/ephys/__init__.py b/allensdk/ephys/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/ephys/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/ephys/ephys_extractor.py b/allensdk/ephys/ephys_extractor.py deleted file mode 100644 index 15794f78bc..0000000000 --- a/allensdk/ephys/ephys_extractor.py +++ /dev/null @@ -1,1108 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -from pandas import DataFrame -import warnings -import logging -from collections import Counter - -from . import ephys_features as ft -import six - -# Constants for stimulus-specific analysis -RAMPS_START = 1.02 -LONG_SQUARES_START = 1.02 -LONG_SQUARES_END = 2.02 -SHORT_SQUARES_WINDOW_START = 1.02 -SHORT_SQUARES_WINDOW_END = 1.021 -SHORT_SQUARE_TRIPLE_WINDOW_START = 2.02 -SHORT_SQUARE_TRIPLE_WINDOW_END = 2.021 - -class EphysSweepFeatureExtractor: - """Feature calculation for a sweep (voltage and/or current time series).""" - - def __init__(self, t=None, v=None, i=None, start=None, end=None, filter=10., - dv_cutoff=20., max_interval=0.005, min_height=2., min_peak=-30., - thresh_frac=0.05, baseline_interval=0.1, baseline_detect_thresh=0.3, - id=None): - """Initialize SweepFeatures object. - - Parameters - ---------- - t : ndarray of times (seconds) - v : ndarray of voltages (mV) - i : ndarray of currents (pA) - start : start of time window for feature analysis (optional) - end : end of time window for feature analysis (optional) - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dv_cutoff : minimum dV/dt to qualify as a spike in V/s (optional, default 20) - max_interval : maximum acceptable time between start of spike and time of peak in sec (optional, default 0.005) - min_height : minimum acceptable height from threshold to peak in mV (optional, default 2) - min_peak : minimum acceptable absolute peak level in mV (optional, default -30) - thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) - baseline_interval: interval length for baseline voltage calculation (before start if start is defined, default 0.1) - baseline_detect_thresh : dV/dt threshold for evaluating flatness of baseline region (optional, default 0.3) - """ - self.id = id - self.t = t - self.v = v - self.i = i - self.start = start - self.end = end - self.filter = filter - self.dv_cutoff = dv_cutoff - self.max_interval = max_interval - self.min_height = min_height - self.min_peak = min_peak - self.thresh_frac = thresh_frac - self.baseline_interval = baseline_interval - self.baseline_detect_thresh = baseline_detect_thresh - self.stimulus_amplitude_calculator = None - - self._sweep_features = {} - self._affected_by_clipping = [] - - def process_spikes(self): - """Perform spike-related feature analysis""" - self._process_individual_spikes() - self._process_spike_related_features() - - def _process_individual_spikes(self): - v = self.v - t = self.t - dvdt = ft.calculate_dvdt(v, t, self.filter) - - # Basic features of spikes - putative_spikes = ft.detect_putative_spikes(v, t, self.start, self.end, - self.filter, self.dv_cutoff) - peaks = ft.find_peak_indexes(v, t, putative_spikes, self.end) - putative_spikes, peaks = ft.filter_putative_spikes(v, t, putative_spikes, peaks, - self.min_height, self.min_peak, - dvdt=dvdt, filter=self.filter) - - if not putative_spikes.size: - # Save time if no spikes detected - self._spikes_df = DataFrame() - return - - upstrokes = ft.find_upstroke_indexes(v, t, putative_spikes, peaks, self.filter, dvdt) - thresholds = ft.refine_threshold_indexes(v, t, upstrokes, self.thresh_frac, - self.filter, dvdt) - thresholds, peaks, upstrokes, clipped = ft.check_thresholds_and_peaks(v, t, thresholds, peaks, - upstrokes, self.end, self.max_interval, - dvdt=dvdt, filter=self.filter) - if not thresholds.size: - # Save time if no spikes detected - self._spikes_df = DataFrame() - return - - # Spike list and thresholds have been refined - now find other features - upstrokes = ft.find_upstroke_indexes(v, t, thresholds, peaks, self.filter, dvdt) - troughs = ft.find_trough_indexes(v, t, thresholds, peaks, clipped, self.end) - downstrokes = ft.find_downstroke_indexes(v, t, peaks, troughs, clipped, self.filter, dvdt) - trough_details, clipped = ft.analyze_trough_details(v, t, thresholds, peaks, clipped, self.end, - self.filter, dvdt=dvdt) - widths = ft.find_widths(v, t, thresholds, peaks, trough_details[1], clipped) - - base_clipped_list = [] - - # Points where we care about t, v, and i if available - vit_data_indexes = { - "threshold": thresholds, - "peak": peaks, - "trough": troughs, - } - base_clipped_list += ["trough"] - - # Points where we care about t and dv/dt - dvdt_data_indexes = { - "upstroke": upstrokes, - "downstroke": downstrokes - } - base_clipped_list += ["downstroke"] - - # Trough details - isi_types = trough_details[0] - trough_detail_indexes = dict(zip(["fast_trough", "adp", "slow_trough"], trough_details[1:])) - base_clipped_list += ["fast_trough", "adp", "slow_trough"] - - # Redundant, but ensures that DataFrame has right number of rows - # Any better way to do it? - spikes_df = DataFrame(data=thresholds, columns=["threshold_index"]) - spikes_df["clipped"] = clipped - - for k, all_vals in six.iteritems(vit_data_indexes): - valid_ind = ~np.isnan(all_vals) - vals = all_vals[valid_ind].astype(int) - spikes_df[k + "_index"] = np.nan - spikes_df[k + "_t"] = np.nan - spikes_df[k + "_v"] = np.nan - - if len(vals) > 0: - spikes_df.ix[valid_ind, k + "_index"] = vals - spikes_df.ix[valid_ind, k + "_t"] = t[vals] - spikes_df.ix[valid_ind, k + "_v"] = v[vals] - - if self.i is not None: - spikes_df[k + "_i"] = np.nan - if len(vals) > 0: - spikes_df.ix[valid_ind, k + "_i"] = self.i[vals] - - if k in base_clipped_list: - self._affected_by_clipping += [ - k + "_index", - k + "_t", - k + "_v", - k + "_i", - ] - - for k, all_vals in six.iteritems(dvdt_data_indexes): - valid_ind = ~np.isnan(all_vals) - vals = all_vals[valid_ind].astype(int) - spikes_df[k + "_index"] = np.nan - spikes_df[k] = np.nan - if len(vals) > 0: - spikes_df.ix[valid_ind, k + "_index"] = vals - spikes_df.ix[valid_ind, k + "_t"] = t[vals] - spikes_df.ix[valid_ind, k + "_v"] = v[vals] - spikes_df.ix[valid_ind, k] = dvdt[vals] - - if k in base_clipped_list: - self._affected_by_clipping += [ - k + "_index", - k + "_t", - k + "_v", - k, - ] - - spikes_df["isi_type"] = isi_types - self._affected_by_clipping += ["isi_type"] - - for k, all_vals in six.iteritems(trough_detail_indexes): - valid_ind = ~np.isnan(all_vals) - vals = all_vals[valid_ind].astype(int) - spikes_df[k + "_index"] = np.nan - spikes_df[k + "_t"] = np.nan - spikes_df[k + "_v"] = np.nan - if len(vals) > 0: - spikes_df.ix[valid_ind, k + "_index"] = vals - spikes_df.ix[valid_ind, k + "_t"] = t[vals] - spikes_df.ix[valid_ind, k + "_v"] = v[vals] - - if self.i is not None: - spikes_df[k + "_i"] = np.nan - if len(vals) > 0: - spikes_df.ix[valid_ind, k + "_i"] = self.i[vals] - - if k in base_clipped_list: - self._affected_by_clipping += [ - k + "_index", - k + "_t", - k + "_v", - k + "_i", - ] - - spikes_df["width"] = widths - self._affected_by_clipping += ["width"] - - spikes_df["upstroke_downstroke_ratio"] = spikes_df["upstroke"] / -spikes_df["downstroke"] - self._affected_by_clipping += ["upstroke_downstroke_ratio"] - - self._spikes_df = spikes_df - - def _process_spike_related_features(self): - t = self.t - - if len(self._spikes_df) == 0: - self._sweep_features["avg_rate"] = 0 - return - - thresholds = self._spikes_df["threshold_index"].values.astype(int) - isis = ft.get_isis(t, thresholds) - with warnings.catch_warnings(): - # ignore mean of empty slice warnings here - warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy") - - sweep_level_features = { - "adapt": ft.adaptation_index(isis), - "latency": ft.latency(t, thresholds, self.start), - "isi_cv": (isis.std() / isis.mean()) if len(isis) >= 1 else np.nan, - "mean_isi": isis.mean() if len(isis) > 0 else np.nan, - "median_isi": np.median(isis), - "first_isi": isis[0] if len(isis) >= 1 else np.nan, - "avg_rate": ft.average_rate(t, thresholds, self.start, self.end), - } - - for k, v in six.iteritems(sweep_level_features): - self._sweep_features[k] = v - - def _process_pauses(self, cost_weight=1.0): - # Pauses are unusually long ISIs with a "detour reset" among delay resets - thresholds = self._spikes_df["threshold_index"].values.astype(int) - isis = ft.get_isis(self.t, thresholds) - isi_types = self._spikes_df["isi_type"][:-1].values - - return ft.detect_pauses(isis, isi_types, cost_weight) - - def pause_metrics(self): - """Estimate average number of pauses and average fraction of time spent in a pause - - Attempts to detect pauses with a variety of conditions and averages results together. - - Pauses that are consistently detected contribute more to estimates. - - Returns - ------- - avg_n_pauses : average number of pauses detected across conditions - avg_pause_frac : average fraction of interval (between start and end) spent in a pause - max_reliability : max fraction of times most reliable pause was detected given weights tested - n_max_rel_pauses : number of pauses detected with `max_reliability` - """ - - thresholds = self._spikes_df["threshold_index"].values.astype(int) - isis = ft.get_isis(self.t, thresholds) - - weight = 1.0 - pause_list = self._process_pauses(weight) - - if len(pause_list) == 0: - return 0, 0. - - n_pauses = len(pause_list) - pause_frac = isis[pause_list].sum() - pause_frac /= self.end - self.start - - return n_pauses, pause_frac - - def _process_bursts(self, tol=0.5, pause_cost=1.0): - thresholds = self._spikes_df["threshold_index"].values.astype(int) - isis = ft.get_isis(self.t, thresholds) - - isi_types = self._spikes_df["isi_type"][:-1].values - - fast_tr_v = self._spikes_df["fast_trough_v"].values - fast_tr_t = self._spikes_df["fast_trough_t"].values - slow_tr_v = self._spikes_df["slow_trough_v"].values - slow_tr_t = self._spikes_df["slow_trough_t"].values - thr_v = self._spikes_df["threshold_v"].values - - bursts = ft.detect_bursts(isis, isi_types, fast_tr_v, fast_tr_t, slow_tr_v, slow_tr_t, - thr_v, tol, pause_cost) - - return np.array(bursts) - - def burst_metrics(self): - """Find bursts and return max "burstiness" index (normalized max rate in burst vs out). - - Returns - ------- - max_burstiness_index : max "burstiness" index across detected bursts - num_bursts : number of bursts detected - """ - - burst_info = self._process_bursts() - - if burst_info.shape[0] > 0: - return burst_info[:, 0].max(), burst_info.shape[0] - else: - return 0., 0 - - def delay_metrics(self): - """Calculates ratio of latency to dominant time constant of rise before spike - - Returns - ------- - delay_ratio : ratio of latency to tau (higher means more delay) - tau : dominant time constant of rise before spike - """ - - if len(self._spikes_df) == 0: - logging.info("No spikes available for delay calculation") - return 0., 0. - start = self.start - spike_time = self._spikes_df["threshold_t"].values[0] - - tau = ft.fit_prespike_time_constant(self.v, self.t, start, spike_time) - latency = spike_time - start - - delay_ratio = latency / tau - return delay_ratio, tau - - def _get_baseline_voltage(self): - v = self.v - t = self.t - filter_frequency = 1. # in kHz - - # Look at baseline interval before start if start is defined - if self.start is not None: - return ft.average_voltage(v, t, self.start - self.baseline_interval, self.start) - - # Otherwise try to find an interval where things are pretty flat - dv = ft.calculate_dvdt(v, t, filter_frequency) - non_flat_points = np.flatnonzero(np.abs(dv >= self.baseline_detect_thresh)) - flat_intervals = t[non_flat_points[1:]] - t[non_flat_points[:-1]] - long_flat_intervals = np.flatnonzero(flat_intervals >= self.baseline_interval) - if long_flat_intervals.size > 0: - interval_index = long_flat_intervals[0] + 1 - baseline_end_time = t[non_flat_points[interval_index]] - return ft.average_voltage(v, t, baseline_end_time - self.baseline_interval, - baseline_end_time) - else: - logging.info("Could not find sufficiently flat interval for automatic baseline voltage", RuntimeWarning) - return np.nan - - def voltage_deflection(self, deflect_type=None): - """Measure deflection (min or max, between start and end if specified). - - Parameters - ---------- - deflect_type : measure minimal ('min') or maximal ('max') voltage deflection - If not specified, it will check to see if the current (i) is positive or negative - between start and end, then choose 'max' or 'min', respectively - If the current is not defined, it will default to 'min'. - - Returns - ------- - deflect_v : peak - deflect_index : index of peak deflection - """ - - deflect_dispatch = { - "min": np.argmin, - "max": np.argmax, - } - - start = self.start - if not start: - start = 0 - start_index = ft.find_time_index(self.t, start) - - end = self.end - if not end: - end = self.t[-1] - end_index = ft.find_time_index(self.t, end) - - - if deflect_type is None: - if self.i is not None: - halfway_index = ft.find_time_index(self.t, (end - start) / 2. + start) - if self.i[halfway_index] >= 0: - deflect_type = "max" - else: - deflect_type = "min" - else: - deflect_type = "min" - - deflect_func = deflect_dispatch[deflect_type] - - v_window = self.v[start_index:end_index] - deflect_index = deflect_func(v_window) + start_index - - return self.v[deflect_index], deflect_index - - def stimulus_amplitude(self): - """ """ - if self.stimulus_amplitude_calculator is not None: - return self.stimulus_amplitude_calculator(self) - else: - return np.nan - - def estimate_time_constant(self): - """Calculate the membrane time constant by fitting the voltage response with a - single exponential. - - Returns - ------- - tau : membrane time constant in seconds - """ - - # Assumes this is being done on a hyperpolarizing step - v_peak, peak_index = self.voltage_deflection("min") - v_baseline = self.sweep_feature("v_baseline") - - if self.start: - start_index = ft.find_time_index(self.t, self.start) - else: - start_index = 0 - - frac = 0.1 - search_result = np.flatnonzero(self.v[start_index:] <= frac * (v_peak - v_baseline) + v_baseline) - if not search_result.size: - raise ft.FeatureError("could not find interval for time constant estimate") - fit_start = self.t[search_result[0] + start_index] - fit_end = self.t[peak_index] - - a, inv_tau, y0 = ft.fit_membrane_time_constant(self.v, self.t, fit_start, fit_end) - - return 1. / inv_tau - - def estimate_sag(self, peak_width=0.005): - """Calculate the sag in a hyperpolarizing voltage response. - - Parameters - ---------- - peak_width : window width to get more robust peak estimate in sec (default 0.005) - - Returns - ------- - sag : fraction that membrane potential relaxes back to baseline - """ - - t = self.t - v = self.v - - start = self.start - if not start: - start = 0 - - end = self.end - if not end: - end = self.t[-1] - - v_peak, peak_index = self.voltage_deflection("min") - v_peak_avg = ft.average_voltage(v, t, start=t[peak_index] - peak_width / 2., - end=t[peak_index] + peak_width / 2.) - v_baseline = self.sweep_feature("v_baseline") - v_steady = ft.average_voltage(v, t, start=end - self.baseline_interval, end=end) - sag = (v_peak_avg - v_steady) / (v_peak_avg - v_baseline) - return sag - - def spikes(self): - """Get all features for each spike as a list of records.""" - return self._spikes_df.to_dict('records') - - def spike_feature(self, key, include_clipped=False, force_exclude_clipped=False): - """Get specified feature for every spike. - - Parameters - ---------- - key : feature name - include_clipped: return values for every identified spike, even when clipping means they will be incorrect/undefined - - Returns - ------- - spike_feature_values : ndarray of features for each spike - """ - - if not hasattr(self, "_spikes_df"): - raise AttributeError("EphysSweepFeatureExtractor instance attribute with spike information does not exist yet - have spikes been processed?") - - if len(self._spikes_df) == 0: - return np.array([]) - - if key not in self._spikes_df.columns: - raise KeyError("requested feature '{:s}' not available".format(key)) - - values = self._spikes_df[key].values - - if include_clipped and force_exclude_clipped: - raise ValueError("include_clipped and force_exclude_clipped cannot both be true") - - if not include_clipped and self.is_spike_feature_affected_by_clipping(key): - values = values[~self._spikes_df["clipped"].values] - elif force_exclude_clipped: - values = values[~self._spikes_df["clipped"].values] - - return values - - def is_spike_feature_affected_by_clipping(self, key): - return key in self._affected_by_clipping - - def spike_feature_keys(self): - """Get list of every available spike feature.""" - return self._spikes_df.columns.values.tolist() - - def sweep_feature(self, key, allow_missing=False): - """Get sweep-level feature (`key`). - - Parameters - ---------- - key : name of sweep-level feature - allow_missing : return np.nan if key is missing for sweep (default False) - - Returns - ------- - sweep_feature : sweep-level feature value - """ - - on_request_dispatch = { - "v_baseline": self._get_baseline_voltage, - "tau": self.estimate_time_constant, - "sag": self.estimate_sag, - "peak_deflect": self.voltage_deflection, - "stim_amp": self.stimulus_amplitude, - } - - if allow_missing and key not in self._sweep_features and key not in on_request_dispatch: - return np.nan - elif key not in self._sweep_features and key not in on_request_dispatch: - raise KeyError("requested feature '{:s}' not available".format(key)) - - if key not in self._sweep_features and key in on_request_dispatch: - fn = on_request_dispatch[key] - if fn is not None: - self._sweep_features[key] = fn() - else: - raise KeyError("requested feature '{:s}' not defined".format(key)) - - return self._sweep_features[key] - - def process_new_spike_feature(self, feature_name, feature_func, affected_by_clipping=False): - """Add new spike-level feature calculation function - - The function should take this sweep extractor as its argument. Its results - can be accessed by calling the method spike_feature(<feature_name>). - """ - - if feature_name in self._spikes_df.columns: - raise KeyError("Feature {:s} already exists for sweep".format(feature_name)) - - self._spikes_df[feature_name] = feature_func(self) - - if affected_by_clipping: - self._affected_by_clipping.append(feature_name) - - def process_new_sweep_feature(self, feature_name, feature_func): - """Add new sweep-level feature calculation function - - The function should take this sweep extractor as its argument. Its results - can be accessed by calling the method sweep_feature(<feature_name>). - """ - - if feature_name in self._sweep_features: - raise KeyError("Feature {:s} already exists for sweep".format(feature_name)) - - self._sweep_features[feature_name] = feature_func(self) - - def set_stimulus_amplitude_calculator(self, function): - self.stimulus_amplitude_calculator = function - - def sweep_feature_keys(self): - """Get list of every available sweep-level feature.""" - return self._sweep_features.keys() - - def as_dict(self): - """Create dict of features and spikes.""" - output_dict = self._sweep_features.copy() - output_dict["spikes"] = self.spikes() - if self.id is not None: - output_dict["id"] = self.id - return output_dict - - -class EphysSweepSetFeatureExtractor: - def __init__(self, t_set=None, v_set=None, i_set=None, start=None, end=None, - filter=10., dv_cutoff=20., max_interval=0.005, min_height=2., - min_peak=-30., thresh_frac=0.05, baseline_interval=0.1, - baseline_detect_thresh=0.3, id_set=None): - """Initialize EphysSweepSetFeatureExtractor object. - - Parameters - ---------- - t_set : list of ndarray of times in seconds - v_set : list of ndarray of voltages in mV - i_set : list of ndarray of currents in pA - start : start of time window for feature analysis (optional, can be list) - end : end of time window for feature analysis (optional, can be list) - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dv_cutoff : minimum dV/dt to qualify as a spike in V/s (optional, default 20) - max_interval : maximum acceptable time between start of spike and time of peak in sec (optional, default 0.005) - min_height : minimum acceptable height from threshold to peak in mV (optional, default 2) - min_peak : minimum acceptable absolute peak level in mV (optional, default -30) - thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) - baseline_interval: interval length for baseline voltage calculation (before start if start is defined, default 0.1) - baseline_detect_thresh : dV/dt threshold for evaluating flatness of baseline region (optional, default 0.3) - """ - - if t_set is not None and v_set is not None: - self._set_sweeps(t_set, v_set, i_set, start, end, filter, dv_cutoff, max_interval, - min_height, min_peak, thresh_frac, baseline_interval, - baseline_detect_thresh, id_set) - else: - self._sweeps = None - - @classmethod - def from_sweeps(cls, sweep_list): - """Initialize EphysSweepSetFeatureExtractor object with a list of pre-existing - sweep feature extractor objects. - """ - - obj = cls() - obj._sweeps = sweep_list - return obj - - def _set_sweeps(self, t_set, v_set, i_set, start, end, filter, dv_cutoff, max_interval, - min_height, min_peak, thresh_frac, baseline_interval, - baseline_detect_thresh, id_set): - if type(t_set) != list: - raise ValueError("t_set must be a list") - - if type(v_set) != list: - raise ValueError("v_set must be a list") - - if i_set is not None and type(i_set) != list: - raise ValueError("i_set must be a list") - - if len(t_set) != len(v_set): - raise ValueError("t_set and v_set must have the same number of items") - - if i_set and len(t_set) != len(i_set): - raise ValueError("t_set and i_set must have the same number of items") - - if id_set is None: - id_set = range(len(t_set)) - if len(id_set) != len(t_set): - raise ValueError("t_set and id_set must have the same number of items") - - sweeps = [] - if i_set is None: - i_set = [None] * len(t_set) - - if type(start) is not list: - start = [start] * len(t_set) - end = [end] * len(t_set) - - sweeps = [ EphysSweepFeatureExtractor(t, v, i, start, end, - filter=filter, dv_cutoff=dv_cutoff, - max_interval=max_interval, - min_height=min_height, min_peak=min_peak, - thresh_frac=thresh_frac, - baseline_interval=baseline_interval, - baseline_detect_thresh=baseline_detect_thresh, - id=sid) \ - for t, v, i, start, end, sid in zip(t_set, v_set, i_set, start, end, id_set) ] - - self._sweeps = sweeps - - def sweeps(self): - """Get list of EphysSweepFeatureExtractor objects.""" - return self._sweeps - - def process_spikes(self): - """Analyze spike features for all sweeps.""" - for sweep in self._sweeps: - sweep.process_spikes() - - def sweep_features(self, key, allow_missing=False): - """Get nparray of sweep-level feature (`key`) for all sweeps - - Parameters - ---------- - key : name of sweep-level feature - allow_missing : return np.nan if key is missing for sweep (default False) - - Returns - ------- - sweep_feature : nparray of sweep-level feature values - """ - - return np.array([swp.sweep_feature(key, allow_missing) for swp in self._sweeps]) - - def spike_feature_averages(self, key): - """Get nparray of average spike-level feature (`key`) for all sweeps""" - return np.array([swp.spike_feature(key).mean() for swp in self._sweeps]) - - -class EphysCellFeatureExtractor: - # Class constants for specific processing - SUBTHRESH_MAX_AMP = 0 - SAG_TARGET = -100. - - def __init__(self, ramps_ext, short_squares_ext, long_squares_ext, subthresh_min_amp=-100): - """Initialize EphysCellFeatureExtractor object from EphysSweepSetExtractors for - ramp, short square, and long square sweeps. - - Parameters - ---------- - dataset : NwbDataSet - ramps_ext : EphysSweepSetFeatureExtractor prepared with ramp sweeps - short_squares_ext : EphysSweepSetFeatureExtractor prepared with short square sweeps - long_squares_ext : EphysSweepSetFeatureExtractor prepared with long square sweeps - """ - - self._ramps_ext = ramps_ext - self._short_squares_ext = short_squares_ext - self._long_squares_ext = long_squares_ext - - self._subthresh_min_amp = subthresh_min_amp - - self._features = { - "ramps": {}, - "short_squares": {}, - "long_squares": {}, - } - - self._spiking_long_squares_ext = None - self._subthreshold_long_squares_ext = None - self._subthreshold_membrane_property_ext = None - - - def process(self, keys=None): - """Processes features. Can take a specific key (or set of keys) to do a subset of processing.""" - - dispatch = { - "ramps": self._analyze_ramps, - "short_squares": self._analyze_short_squares, - "long_squares": self._analyze_long_squares, - "long_squares_spiking": self._analyze_long_squares_spiking, - } - - if keys is None: - keys = list(dispatch.keys()) - - if type(keys) is not list: - keys = list(keys) - - for k in [j for j in keys if j in dispatch]: - dispatch[k]() - - def _analyze_ramps(self): - ext = self._ramps_ext - ext.process_spikes() - - self._all_ramps_ext = ext - - # pull out the spiking sweeps - spiking_sweeps = [ sweep for sweep in self._ramps_ext.sweeps() if sweep.sweep_feature("avg_rate") > 0 ] - ext = EphysSweepSetFeatureExtractor.from_sweeps(spiking_sweeps) - self._ramps_ext = ext - - self._features["ramps"]["spiking_sweeps"] = ext.sweeps() - - def ramps_features(self, all=False): - if all: - return self._all_ramps_ext - else: - return self._ramps_ext - - def _analyze_short_squares(self): - ext = self._short_squares_ext - ext.process_spikes() - - # Need to count how many had spikes at each amplitude; find most; ties go to lower amplitude - spiking_sweeps = [sweep for sweep in ext.sweeps() if sweep.sweep_feature("avg_rate") > 0] - - if len(spiking_sweeps) == 0: - raise ft.FeatureError("No spiking short square sweeps, cannot compute cell features.") - - most_common = Counter(map(_short_step_stim_amp, spiking_sweeps)).most_common() - common_amp, common_count = most_common[0] - for c in most_common[1:]: - if c[1] < common_count: - break - if c[0] < common_amp: - common_amp = c[0] - - self._features["short_squares"]["stimulus_amplitude"] = common_amp - ext = EphysSweepSetFeatureExtractor.from_sweeps([sweep for sweep in spiking_sweeps if _short_step_stim_amp(sweep) == common_amp]) - self._short_squares_ext = ext - - self._features["short_squares"]["common_amp_sweeps"] = ext.sweeps() - for s in self._features["short_squares"]["common_amp_sweeps"]: - s.set_stimulus_amplitude_calculator(_short_step_stim_amp) - - def short_squares_features(self): - return self._short_squares_ext - - def _analyze_long_squares(self): - self._analyze_long_squares_spiking() - self._analyze_long_squares_subthreshold() - - def _analyze_long_squares_spiking(self, force_reprocess=False): - if not force_reprocess and self._spiking_long_squares_ext: - return - - ext = self._long_squares_ext - ext.process_spikes() - self._features["long_squares"]["sweeps"] = ext.sweeps() - for s in self._features["long_squares"]["sweeps"]: - s.set_stimulus_amplitude_calculator(_step_stim_amp) - - spiking_indexes = np.flatnonzero(ext.sweep_features("avg_rate")) - - if len(spiking_indexes) == 0: - raise ft.FeatureError("No spiking long square sweeps, cannot compute cell features.") - - amps = ext.sweep_features("stim_amp")#self.long_squares_stim_amps() - min_index = np.argmin(amps[spiking_indexes]) - rheobase_index = spiking_indexes[min_index] - rheobase_i = _step_stim_amp(ext.sweeps()[rheobase_index]) - - self._features["long_squares"]["rheobase_extractor_index"] = rheobase_index - self._features["long_squares"]["rheobase_i"] = rheobase_i - self._features["long_squares"]["rheobase_sweep"] = ext.sweeps()[rheobase_index] - spiking_sweeps = [sweep for sweep in ext.sweeps() if sweep.sweep_feature("avg_rate") > 0] - self._spiking_long_squares_ext = EphysSweepSetFeatureExtractor.from_sweeps(spiking_sweeps) - self._features["long_squares"]["spiking_sweeps"] = self._spiking_long_squares_ext.sweeps() - - self._features["long_squares"]["fi_fit_slope"] = fit_fi_slope(self._spiking_long_squares_ext) - - - def _analyze_long_squares_subthreshold(self): - ext = self._long_squares_ext - subthresh_sweeps = [sweep for sweep in ext.sweeps() if sweep.sweep_feature("avg_rate") == 0] - subthresh_ext = EphysSweepSetFeatureExtractor.from_sweeps(subthresh_sweeps) - self._subthreshold_long_squares_ext = subthresh_ext - - if len(subthresh_ext.sweeps()) == 0: - raise ft.FeatureError("No subthreshold long square sweeps, cannot evaluate cell features.") - - peaks = subthresh_ext.sweep_features("peak_deflect") - sags = subthresh_ext.sweep_features("sag") - sag_eval_levels = np.array([sweep.voltage_deflection()[0] for sweep in subthresh_ext.sweeps()]) - target_level = self.SAG_TARGET - closest_index = np.argmin(np.abs(sag_eval_levels - target_level)) - self._features["long_squares"]["sag"] = sags[closest_index] - self._features["long_squares"]["vm_for_sag"] = sag_eval_levels[closest_index] - self._features["long_squares"]["subthreshold_sweeps"] = subthresh_ext.sweeps() - for s in self._features["long_squares"]["subthreshold_sweeps"]: - s.set_stimulus_amplitude_calculator(_step_stim_amp) - - logging.debug("subthresh_sweeps: %d", len(subthresh_sweeps)) - calc_subthresh_sweeps = [sweep for sweep in subthresh_sweeps if - sweep.sweep_feature("stim_amp") < self.SUBTHRESH_MAX_AMP and - sweep.sweep_feature("stim_amp") > self._subthresh_min_amp] - - logging.debug("calc_subthresh_sweeps: %d", len(calc_subthresh_sweeps)) - calc_subthresh_ext = EphysSweepSetFeatureExtractor.from_sweeps(calc_subthresh_sweeps) - self._subthreshold_membrane_property_ext = calc_subthresh_ext - self._features["long_squares"]["subthreshold_membrane_property_sweeps"] = calc_subthresh_ext.sweeps() - self._features["long_squares"]["input_resistance"] = input_resistance(calc_subthresh_ext) - self._features["long_squares"]["tau"] = membrane_time_constant(calc_subthresh_ext) - self._features["long_squares"]["v_baseline"] = np.nanmean(ext.sweep_features("v_baseline")) - - def long_squares_features(self, option=None): - option_table = { - "spiking": self._spiking_long_squares_ext, - "subthreshold": self._subthreshold_long_squares_ext, - "subthreshold_membrane_property": self._subthreshold_membrane_property_ext, - } - if option: - return option_table[option] - - return self._long_squares_ext - - def long_squares_stim_amps(self, option=None): - option_table = { - "spiking": self._spiking_long_squares_ext, - "subthreshold": self._subthreshold_long_squares_ext, - "subthreshold_membrane_property": self._subthreshold_membrane_property_ext, - } - if option: - ext = option_table[option] - else: - ext = self._long_squares_ext - - return np.array(map(_step_stim_amp, ext.sweeps())) - - def cell_features(self): - return self._features - - def as_dict(self): - """Create dict of cell features.""" - - # get shallow copies of the sub-type dictionaries - out = { - "long_squares": self._features["long_squares"].copy(), - "short_squares": self._features["short_squares"].copy(), - "ramps": self._features["ramps"].copy(), - } - - # convert feature extractor lists to sweep dictionarsweep extract lists - ls_sweeps = [ s.as_dict() for s in out["long_squares"]["sweeps"] ] - ls_spike_sweeps = [ s.as_dict() for s in out["long_squares"]["spiking_sweeps"] ] - rheo_sweep = out["long_squares"]["rheobase_sweep"].as_dict() - ls_sub_sweeps = [ s.as_dict() for s in out["long_squares"]["subthreshold_sweeps"] ] - ls_sub_mem_sweeps = [ s.as_dict() for s in out["long_squares"]["subthreshold_membrane_property_sweeps"] ] - ss_sweeps = [ s.as_dict() for s in out["short_squares"]["common_amp_sweeps"] ] - ramp_sweeps = [ s.as_dict() for s in out["ramps"]["spiking_sweeps"] ] - - out["long_squares"]["sweeps"] = ls_sweeps - out["long_squares"]["spiking_sweeps"] = ls_spike_sweeps - out["long_squares"]["subthreshold_sweeps"] = ls_sub_sweeps - out["long_squares"]["subthreshold_membrane_property_sweeps"] = ls_sub_mem_sweeps - out["long_squares"]["rheobase_sweep"] = rheo_sweep - out["short_squares"]["common_amp_sweeps"] = ss_sweeps - out["ramps"]["spiking_sweeps"] = ramp_sweeps - - return out - - -def input_resistance(ext): - """Estimate input resistance in MOhms, assuming all sweeps in passed extractor - are hyperpolarizing responses.""" - - sweeps = ext.sweeps() - if not sweeps: - raise ft.FeatureError("no sweeps available for input resistance calculation") - - v_vals = [] - i_vals = [] - for sweep in sweeps: - if sweep.i is None: - raise ft.FeatureError("cannot calculate input resistance: i not defined for a sweep") - - v_peak, min_index = sweep.voltage_deflection('min') - v_vals.append(v_peak) - i_vals.append(sweep.i[min_index]) - - v = np.array(v_vals) - i = np.array(i_vals) - - if len(v) == 1: - # If there's just one sweep, we'll have to use its own baseline to estimate - # the input resistance - v = np.append(v, sweeps[0].sweep_feature("v_baseline")) - i = np.append(i, 0.) - - A = np.vstack([i, np.ones_like(i)]).T - m, c = np.linalg.lstsq(A, v)[0] - - return m * 1e3 - - -def membrane_time_constant(ext): - """Average the membrane time constant values estimated from each sweep in passed extractor.""" - - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy") - avg_tau = np.nanmean(ext.sweep_features("tau")) - return avg_tau - - -def fit_fi_slope(ext): - """Fit the rate and stimulus amplitude to a line and return the slope of the fit.""" - if len(ext.sweeps()) < 2: - raise ft.FeatureError("Cannot fit f-I curve slope with less than two suprathreshold sweeps") - - x = np.array(list(map(_step_stim_amp, ext.sweeps()))) - y = ext.sweep_features("avg_rate") - - A = np.vstack([x, np.ones_like(x)]).T - - m, c = np.linalg.lstsq(A, y)[0] - return m - - -def reset_long_squares_start(when): - global LONG_SQUARES_START, LONG_SQUARES_END - delta = LONG_SQUARES_END - LONG_SQUARES_START - LONG_SQUARES_START = when - LONG_SQUARES_END = when + delta - - -def cell_extractor_for_nwb(dataset, ramps, short_squares, long_squares, subthresh_min_amp=-100): - """Initialize EphysCellFeatureExtractor object from NWB data set - - Parameters - ---------- - dataset : NwbDataSet - ramps : list of sweep numbers of ramp sweeps - short_squares : list of sweep numbers of short square sweeps - long_squares : list of sweep numbers of long square sweeps - """ - - if len(short_squares) == 0: - raise ft.FeatureError("no short square sweep numbers provided") - if len(ramps) == 0: - raise ft.FeatureError("no ramp sweep numbers provided") - if len(long_squares) == 0: - raise ft.FeatureError("no long_square sweep numbers provided") - - ramps_ext = extractor_for_nwb_sweeps(dataset, ramps, fixed_start=RAMPS_START) - - temp_short_sq_ext = extractor_for_nwb_sweeps(dataset, short_squares) - t_set = [s.t for s in temp_short_sq_ext.sweeps()] - v_set = [s.v for s in temp_short_sq_ext.sweeps()] - cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters(v_set, t_set, - SHORT_SQUARES_WINDOW_START, - SHORT_SQUARES_WINDOW_END) - - thresh_frac = max(thresh_frac, 0.1) - - short_squares_ext = extractor_for_nwb_sweeps(dataset, short_squares, - dv_cutoff=cutoff, thresh_frac=thresh_frac) - long_squares_ext = extractor_for_nwb_sweeps(dataset, long_squares, - fixed_start=LONG_SQUARES_START, - fixed_end=LONG_SQUARES_END) - - return EphysCellFeatureExtractor(ramps_ext, short_squares_ext, long_squares_ext, subthresh_min_amp) - - -def extractor_for_nwb_sweeps(dataset, sweep_numbers, - fixed_start=None, fixed_end=None, - dv_cutoff=20., thresh_frac=0.05): - v_set = [] - t_set = [] - i_set = [] - - start = [] - end = [] - - for sweep_number in sweep_numbers: - data = dataset.get_sweep(sweep_number) - v = data['response'] * 1e3 # mV - i = data['stimulus'] * 1e12 # pA - hz = data['sampling_rate'] - dt = 1. / hz - t = np.arange(0, len(v)) * dt # sec - - s, e = dt * np.array(data['index_range']) - v_set.append(v) - i_set.append(i) - t_set.append(t) - start.append(s) - end.append(e) - - if fixed_start and not fixed_end: - start = [fixed_start] * len(end) - elif fixed_start and fixed_end: - start = fixed_start - end = fixed_end - - return EphysSweepSetFeatureExtractor(t_set, v_set, i_set, start=start, end=end, - dv_cutoff=dv_cutoff, thresh_frac=thresh_frac, - id_set=sweep_numbers) - - -def _step_stim_amp(sweep): - t_index = ft.find_time_index(sweep.t, sweep.start) - return sweep.i[t_index + 1] - - -def _short_step_stim_amp(sweep): - t_index = ft.find_time_index(sweep.t, sweep.start) - return sweep.i[t_index + 1:].max() diff --git a/allensdk/ephys/ephys_features.py b/allensdk/ephys/ephys_features.py deleted file mode 100644 index de1984578f..0000000000 --- a/allensdk/ephys/ephys_features.py +++ /dev/null @@ -1,1191 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import warnings -import logging -import numpy as np -import scipy.signal as signal -from scipy.optimize import curve_fit -from functools import partial - -def detect_putative_spikes(v, t, start=None, end=None, filter=10., dv_cutoff=20.): - """Perform initial detection of spikes and return their indexes. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - start : start of time window for spike detection (optional) - end : end of time window for spike detection (optional) - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dv_cutoff : minimum dV/dt to qualify as a spike in V/s (optional, default 20) - dvdt : pre-calculated time-derivative of voltage (optional) - - Returns - ------- - putative_spikes : numpy array of preliminary spike indexes - """ - - if not isinstance(v, np.ndarray): - raise TypeError("v is not an np.ndarray") - - if not isinstance(t, np.ndarray): - raise TypeError("t is not an np.ndarray") - - if v.shape != t.shape: - raise FeatureError("Voltage and time series do not have the same dimensions") - - if start is None: - start = t[0] - - if end is None: - end = t[-1] - - start_index = find_time_index(t, start) - end_index = find_time_index(t, end) - v_window = v[start_index:end_index + 1] - t_window = t[start_index:end_index + 1] - - dvdt = calculate_dvdt(v_window, t_window, filter) - - # Find positive-going crossings of dV/dt cutoff level - putative_spikes = np.flatnonzero(np.diff(np.greater_equal(dvdt, dv_cutoff).astype(int)) == 1) - - if len(putative_spikes) <= 1: - # Set back to original index space (not just window) - return np.array(putative_spikes) + start_index - - # Only keep spike times if dV/dt has dropped all the way to zero between putative spikes - putative_spikes = [putative_spikes[0]] + [s for i, s in enumerate(putative_spikes[1:]) - if np.any(dvdt[putative_spikes[i]:s] < 0)] - - # Set back to original index space (not just window) - return np.array(putative_spikes) + start_index - - -def find_peak_indexes(v, t, spike_indexes, end=None): - """Find indexes of spike peaks. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - spike_indexes : numpy array of preliminary spike indexes - end : end of time window for spike detection (optional) - """ - - if not end: - end = t[-1] - end_index = find_time_index(t, end) - - spks_and_end = np.append(spike_indexes, end_index) - peak_indexes = [np.argmax(v[spk:next]) + spk for spk, next in - zip(spks_and_end[:-1], spks_and_end[1:])] - - return np.array(peak_indexes) - - -def filter_putative_spikes(v, t, spike_indexes, peak_indexes, min_height=2., - min_peak=-30., filter=10., dvdt=None): - """Filter out events that are unlikely to be spikes based on: - * Voltage failing to go down between peak and the next spike's threshold - * Height (threshold to peak) - * Absolute peak level - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - spike_indexes : numpy array of preliminary spike indexes - peak_indexes : numpy array of indexes of spike peaks - min_height : minimum acceptable height from threshold to peak in mV (optional, default 2) - min_peak : minimum acceptable absolute peak level in mV (optional, default -30) - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dvdt : pre-calculated time-derivative of voltage (optional) - - Returns - ------- - spike_indexes : numpy array of threshold indexes - peak_indexes : numpy array of peak indexes - """ - - if not spike_indexes.size or not peak_indexes.size: - return np.array([]), np.array([]) - - if dvdt is None: - dvdt = calculate_dvdt(v, t, filter) - - diff_mask = [np.any(dvdt[peak_ind:spike_ind] < 0) - for peak_ind, spike_ind - in zip(peak_indexes[:-1], spike_indexes[1:])] - peak_indexes = peak_indexes[np.array(diff_mask + [True])] - spike_indexes = spike_indexes[np.array([True] + diff_mask)] - - peak_level_mask = v[peak_indexes] >= min_peak - spike_indexes = spike_indexes[peak_level_mask] - peak_indexes = peak_indexes[peak_level_mask] - - height_mask = (v[peak_indexes] - v[spike_indexes]) >= min_height - spike_indexes = spike_indexes[height_mask] - peak_indexes = peak_indexes[height_mask] - - return spike_indexes, peak_indexes - - -def find_upstroke_indexes(v, t, spike_indexes, peak_indexes, filter=10., dvdt=None): - """Find indexes of maximum upstroke of spike. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - spike_indexes : numpy array of preliminary spike indexes - peak_indexes : numpy array of indexes of spike peaks - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dvdt : pre-calculated time-derivative of voltage (optional) - - Returns - ------- - upstroke_indexes : numpy array of upstroke indexes - - """ - - if dvdt is None: - dvdt = calculate_dvdt(v, t, filter) - - upstroke_indexes = [np.argmax(dvdt[spike:peak]) + spike for spike, peak in - zip(spike_indexes, peak_indexes)] - - return np.array(upstroke_indexes) - - -def refine_threshold_indexes(v, t, upstroke_indexes, thresh_frac=0.05, filter=10., dvdt=None): - """Refine threshold detection of previously-found spikes. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - upstroke_indexes : numpy array of indexes of spike upstrokes (for threshold target calculation) - thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dvdt : pre-calculated time-derivative of voltage (optional) - - Returns - ------- - threshold_indexes : numpy array of threshold indexes - """ - - if not upstroke_indexes.size: - return np.array([]) - - if dvdt is None: - dvdt = calculate_dvdt(v, t, filter) - - avg_upstroke = dvdt[upstroke_indexes].mean() - target = avg_upstroke * thresh_frac - - upstrokes_and_start = np.append(np.array([0]), upstroke_indexes) - threshold_indexes = [] - for upstk, upstk_prev in zip(upstrokes_and_start[1:], upstrokes_and_start[:-1]): - potential_indexes = np.flatnonzero(dvdt[upstk:upstk_prev:-1] <= target) - if not potential_indexes.size: - # couldn't find a matching value for threshold, - # so just going to the start of the search interval - threshold_indexes.append(upstk_prev) - else: - threshold_indexes.append(upstk - potential_indexes[0]) - - return np.array(threshold_indexes) - - -def check_thresholds_and_peaks(v, t, spike_indexes, peak_indexes, upstroke_indexes, end=None, - max_interval=0.005, thresh_frac=0.05, filter=10., dvdt=None, - tol=1.0): - """Validate thresholds and peaks for set of spikes - - Check that peaks and thresholds for consecutive spikes do not overlap - Spikes with overlapping thresholds and peaks will be merged. - - Check that peaks and thresholds for a given spike are not too far apart. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - spike_indexes : numpy array of spike indexes - peak_indexes : numpy array of indexes of spike peaks - upstroke_indexes : numpy array of indexes of spike upstrokes - max_interval : maximum allowed time between start of spike and time of peak in sec (default 0.005) - thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dvdt : pre-calculated time-derivative of voltage (optional) - tol : tolerance for returning to threshold in mV (optional, default 1) - - Returns - ------- - spike_indexes : numpy array of modified spike indexes - peak_indexes : numpy array of modified spike peak indexes - upstroke_indexes : numpy array of modified spike upstroke indexes - clipped : numpy array of clipped status of spikes - """ - - if not end: - end = t[-1] - - overlaps = np.flatnonzero(spike_indexes[1:] <= peak_indexes[:-1] + 1) - if overlaps.size: - spike_mask = np.ones_like(spike_indexes, dtype=bool) - spike_mask[overlaps + 1] = False - spike_indexes = spike_indexes[spike_mask] - - peak_mask = np.ones_like(peak_indexes, dtype=bool) - peak_mask[overlaps] = False - peak_indexes = peak_indexes[peak_mask] - - upstroke_mask = np.ones_like(upstroke_indexes, dtype=bool) - upstroke_mask[overlaps] = False - upstroke_indexes = upstroke_indexes[upstroke_mask] - - # Validate that peaks don't occur too long after the threshold - # If they do, try to re-find threshold from the peak - too_long_spikes = [] - for i, (spk, peak) in enumerate(zip(spike_indexes, peak_indexes)): - if t[peak] - t[spk] >= max_interval: - logging.info("Need to recalculate threshold-peak pair that exceeds maximum allowed interval ({:f} s)".format(max_interval)) - too_long_spikes.append(i) - - if too_long_spikes: - if dvdt is None: - dvdt = calculate_dvdt(v, t, filter) - avg_upstroke = dvdt[upstroke_indexes].mean() - target = avg_upstroke * thresh_frac - drop_spikes = [] - for i in too_long_spikes: - # First guessing that threshold is wrong and peak is right - peak = peak_indexes[i] - t_0 = find_time_index(t, t[peak] - max_interval) - below_target = np.flatnonzero(dvdt[upstroke_indexes[i]:t_0:-1] <= target) - if not below_target.size: - # Now try to see if threshold was right but peak was wrong - - # Find the peak in a window twice the size of our allowed window - spike = spike_indexes[i] - t_0 = find_time_index(t, t[spike] + 2 * max_interval) - new_peak = np.argmax(v[spike:t_0]) + spike - - # If that peak is okay (not outside the allowed window, not past the next spike) - # then keep it - if t[new_peak] - t[spike] < max_interval and \ - (i == len(spike_indexes) - 1 or t[new_peak] < t[spike_indexes[i + 1]]): - peak_indexes[i] = new_peak - else: - # Otherwise, log and get rid of the spike - logging.info("Could not redetermine threshold-peak pair - dropping that pair") - drop_spikes.append(i) -# raise FeatureError("Could not redetermine threshold") - else: - spike_indexes[i] = upstroke_indexes[i] - below_target[0] - - - if drop_spikes: - spike_indexes = np.delete(spike_indexes, drop_spikes) - peak_indexes = np.delete(peak_indexes, drop_spikes) - upstroke_indexes = np.delete(upstroke_indexes, drop_spikes) - - # Check that last spike was not cut off too early by end of stimulus - # by checking that the membrane potential returned to at least the threshold - # voltage - otherwise, drop it - clipped = np.zeros_like(spike_indexes, dtype=bool) - end_index = find_time_index(t, end) - if len(spike_indexes) > 0 and not np.any(v[peak_indexes[-1]:end_index + 1] <= v[spike_indexes[-1]] + tol): - logging.debug("Failed to return to threshold voltage + tolerance (%.2f) after last spike (min %.2f) - marking last spike as clipped", v[spike_indexes[-1]] + tol, v[peak_indexes[-1]:end_index + 1].min()) - clipped[-1] = True - - return spike_indexes, peak_indexes, upstroke_indexes, clipped - - -def find_trough_indexes(v, t, spike_indexes, peak_indexes, clipped=None, end=None): - """ - Find indexes of minimum voltage (trough) between spikes. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - spike_indexes : numpy array of spike indexes - peak_indexes : numpy array of spike peak indexes - end : end of time window (optional) - - Returns - ------- - trough_indexes : numpy array of threshold indexes - """ - - if not spike_indexes.size or not peak_indexes.size: - return np.array([]) - - if clipped is None: - clipped = np.zeros_like(spike_indexes, dtype=bool) - - if end is None: - end = t[-1] - end_index = find_time_index(t, end) - - trough_indexes = np.zeros_like(spike_indexes, dtype=float) - trough_indexes[:-1] = [v[peak:spk].argmin() + peak for peak, spk - in zip(peak_indexes[:-1], spike_indexes[1:])] - - if clipped[-1]: - # If last spike is cut off by the end of the window, trough is undefined - trough_indexes[-1] = np.nan - else: - trough_indexes[-1] = v[peak_indexes[-1]:end_index].argmin() + peak_indexes[-1] - - # nwg - trying to remove this next part for now - can't figure out if this will be needed with new "clipped" method - - # If peak is the same point as the trough, drop that point -# trough_indexes = trough_indexes[np.where(peak_indexes[:len(trough_indexes)] != trough_indexes)] - - return trough_indexes - - -def find_downstroke_indexes(v, t, peak_indexes, trough_indexes, clipped=None, filter=10., dvdt=None): - """Find indexes of minimum voltage (troughs) between spikes. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - peak_indexes : numpy array of spike peak indexes - trough_indexes : numpy array of threshold indexes - clipped: boolean array - False if spike not clipped by edge of window - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default 10) - dvdt : pre-calculated time-derivative of voltage (optional) - - Returns - ------- - downstroke_indexes : numpy array of downstroke indexes - """ - - if not trough_indexes.size: - return np.array([]) - - if dvdt is None: - dvdt = calculate_dvdt(v, t, filter) - - if clipped is None: - clipped = np.zeros_like(peak_indexes, dtype=bool) - - if len(peak_indexes) < len(trough_indexes): - raise FeatureError("Cannot have more troughs than peaks") -# Taking this out...with clipped info, should always have the same number of points -# peak_indexes = peak_indexes[:len(trough_indexes)] - - valid_peak_indexes = peak_indexes[~clipped].astype(int) - valid_trough_indexes = trough_indexes[~clipped].astype(int) - - downstroke_indexes = np.zeros_like(peak_indexes) * np.nan - downstroke_index_values = [np.argmin(dvdt[peak:trough]) + peak for peak, trough - in zip(valid_peak_indexes, valid_trough_indexes)] - downstroke_indexes[~clipped] = downstroke_index_values - - return downstroke_indexes - - -def find_widths(v, t, spike_indexes, peak_indexes, trough_indexes, clipped=None): - """Find widths at half-height for spikes. - - Widths are only returned when heights are defined - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - spike_indexes : numpy array of spike indexes - peak_indexes : numpy array of spike peak indexes - trough_indexes : numpy array of trough indexes - - Returns - ------- - widths : numpy array of spike widths in sec - """ - - if not spike_indexes.size or not peak_indexes.size: - return np.array([]) - - if len(spike_indexes) < len(trough_indexes): - raise FeatureError("Cannot have more troughs than spikes") - - if clipped is None: - clipped = np.zeros_like(spike_indexes, dtype=bool) - - use_indexes = ~np.isnan(trough_indexes) - use_indexes[clipped] = False - - heights = np.zeros_like(trough_indexes) * np.nan - heights[use_indexes] = v[peak_indexes[use_indexes]] - v[trough_indexes[use_indexes].astype(int)] - - width_levels = np.zeros_like(trough_indexes) * np.nan - width_levels[use_indexes] = heights[use_indexes] / 2. + v[trough_indexes[use_indexes].astype(int)] - - thresh_to_peak_levels = np.zeros_like(trough_indexes) * np.nan - thresh_to_peak_levels[use_indexes] = (v[peak_indexes[use_indexes]] - v[spike_indexes[use_indexes]]) / 2. + v[spike_indexes[use_indexes]] - - # Some spikes in burst may have deep trough but short height, so can't use same - # definition for width - width_levels[width_levels < v[spike_indexes]] = \ - thresh_to_peak_levels[width_levels < v[spike_indexes]] - - width_starts = np.zeros_like(trough_indexes) * np.nan - width_starts[use_indexes] = np.array([pk - np.flatnonzero(v[pk:spk:-1] <= wl)[0] if - np.flatnonzero(v[pk:spk:-1] <= wl).size > 0 else np.nan for pk, spk, wl - in zip(peak_indexes[use_indexes], spike_indexes[use_indexes], width_levels[use_indexes])]) - width_ends = np.zeros_like(trough_indexes) * np.nan - - width_ends[use_indexes] = np.array([pk + np.flatnonzero(v[pk:tr] <= wl)[0] if - np.flatnonzero(v[pk:tr] <= wl).size > 0 else np.nan for pk, tr, wl - in zip(peak_indexes[use_indexes], trough_indexes[use_indexes].astype(int), width_levels[use_indexes])]) - - missing_widths = np.isnan(width_starts) | np.isnan(width_ends) - widths = np.zeros_like(width_starts, dtype=np.float64) - widths[~missing_widths] = t[width_ends[~missing_widths].astype(int)] - \ - t[width_starts[~missing_widths].astype(int)] - if any(missing_widths): - widths[missing_widths] = np.nan - - return widths - - -def analyze_trough_details(v, t, spike_indexes, peak_indexes, clipped=None, end=None, filter=10., - heavy_filter=1., term_frac=0.01, adp_thresh=0.5, tol=0.5, - flat_interval=0.002, adp_max_delta_t=0.005, adp_max_delta_v=10., dvdt=None): - """Analyze trough to determine if an ADP exists and whether the reset is a 'detour' or 'direct' - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - spike_indexes : numpy array of spike indexes - peak_indexes : numpy array of spike peak indexes - end : end of time window (optional) - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (default 1) - heavy_filter : lower cutoff frequency for 4-pole low-pass Bessel filter in kHz (default 1) - thresh_frac : fraction of average upstroke for threshold calculation (optional, default 0.05) - adp_thresh: minimum dV/dt in V/s to exceed to be considered to have an ADP (optional, default 1.5) - tol : tolerance for evaluating whether Vm drops appreciably further after end of spike (default 1.0 mV) - flat_interval: if the trace is flat for this duration, stop looking for an ADP (default 0.002 s) - adp_max_delta_t: max possible ADP delta t (default 0.005 s) - adp_max_delta_v: max possible ADP delta v (default 10 mV) - dvdt : pre-calculated time-derivative of voltage (optional) - - Returns - ------- - isi_types : numpy array of isi reset types (direct or detour) - fast_trough_indexes : numpy array of indexes at the start of the trough (i.e. end of the spike) - adp_indexes : numpy array of adp indexes (np.nan if there was no ADP in that ISI - slow_trough_indexes : numpy array of indexes at the minimum of the slow phase of the trough - (if there wasn't just a fast phase) - """ - - if end is None: - end = t[-1] - end_index = find_time_index(t, end) - - if clipped is None: - clipped = np.zeros_like(peak_indexes) - - # Can't evaluate for spikes that are clipped by the window - orig_len = len(peak_indexes) - valid_spike_indexes = spike_indexes[~clipped] - valid_peak_indexes = peak_indexes[~clipped] - - if dvdt is None: - dvdt = calculate_dvdt(v, t, filter) - - dvdt_hvy = calculate_dvdt(v, t, heavy_filter) - - # Writing as for loop - see if I can vectorize any later - fast_trough_indexes = [] - adp_indexes = [] - slow_trough_indexes = [] - isi_types = [] - - update_clipped = [] - for peak, next_spk in zip(valid_peak_indexes, np.append(valid_spike_indexes[1:], end_index)): - downstroke = dvdt[peak:next_spk].argmin() + peak - target = term_frac * dvdt[downstroke] - - terminated_points = np.flatnonzero(dvdt[downstroke:next_spk] >= target) - if terminated_points.size: - terminated = terminated_points[0] + downstroke - update_clipped.append(False) - else: - logging.debug("Could not identify fast trough - marking spike as clipped") - isi_types.append(np.nan) - fast_trough_indexes.append(np.nan) - adp_indexes.append(np.nan) - slow_trough_indexes.append(np.nan) - update_clipped.append(True) - continue - - # Could there be an ADP? - adp_index = np.nan - dv_over_thresh = np.flatnonzero(dvdt_hvy[terminated:next_spk] >= adp_thresh) - if dv_over_thresh.size: - cross = dv_over_thresh[0] + terminated - - # only want to look for ADP before things get pretty flat - # otherwise, could just pick up random transients long after the spike - if t[cross] - t[terminated] < flat_interval: - # Going back up fast, but could just be going into another spike - # so need to check for a reversal (zero-crossing) in dV/dt - zero_return_vals = np.flatnonzero(dvdt_hvy[cross:next_spk] <= 0) - if zero_return_vals.size: - putative_adp_index = zero_return_vals[0] + cross - min_index = v[putative_adp_index:next_spk].argmin() + putative_adp_index - if (v[putative_adp_index] - v[min_index] >= tol and - v[putative_adp_index] - v[terminated] <= adp_max_delta_v and - t[putative_adp_index] - t[terminated] <= adp_max_delta_t): - adp_index = putative_adp_index - slow_phase_min_index = min_index - isi_type = "detour" - - if np.isnan(adp_index): - v_term = v[terminated] - min_index = v[terminated:next_spk].argmin() + terminated - if v_term - v[min_index] >= tol: - # dropped further after end of spike -> detour reset - isi_type = "detour" - slow_phase_min_index = min_index - else: - isi_type = "direct" - - isi_types.append(isi_type) - fast_trough_indexes.append(terminated) - adp_indexes.append(adp_index) - if isi_type == "detour": - slow_trough_indexes.append(slow_phase_min_index) - else: - slow_trough_indexes.append(np.nan) - - # If we had to kick some spikes out before, need to add nans at the end - output = [] - output.append(np.array(isi_types)) - for d in (fast_trough_indexes, adp_indexes, slow_trough_indexes): - output.append(np.array(d, dtype=float)) - - if orig_len > len(isi_types): - extra = np.zeros(orig_len - len(isi_types)) * np.nan - output = tuple((np.append(o, extra) for o in output)) - - # The ADP and slow trough for the last spike in a train are not reliably - # calculated, and usually extreme when wrong, so we will NaN them out. - # - # Note that this will result in a 0 value when delta V or delta T is - # calculated, which may not be strictly accurate to the trace, but the - # magnitude of the difference will be less than in many of the erroneous - # cases seen otherwise - - output[2][-1] = np.nan # ADP - output[3][-1] = np.nan # slow trough - - clipped[~clipped] = update_clipped - return output, clipped - - -def find_time_index(t, t_0): - """Find the index value of a given time (t_0) in a time series (t).""" - - t_gte = np.flatnonzero(t >= t_0) - if not t_gte.size: - raise FeatureError("Could not find given time in time vector") - - return t_gte[0] - - -def calculate_dvdt(v, t, filter=None): - """Low-pass filters (if requested) and differentiates voltage by time. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - filter : cutoff frequency for 4-pole low-pass Bessel filter in kHz (optional, default None) - - Returns - ------- - dvdt : numpy array of time-derivative of voltage (V/s = mV/ms) - """ - - if has_fixed_dt(t) and filter: - delta_t = t[1] - t[0] - sample_freq = 1. / delta_t - filt_coeff = (filter * 1e3) / (sample_freq / 2.) # filter kHz -> Hz, then get fraction of Nyquist frequency - if filt_coeff < 0 or filt_coeff >= 1: - raise ValueError("bessel coeff ({:f}) is outside of valid range [0,1); cannot filter sampling frequency {:.1f} kHz with cutoff frequency {:.1f} kHz.".format(filt_coeff, sample_freq / 1e3, filter)) - b, a = signal.bessel(4, filt_coeff, "low") - v_filt = signal.filtfilt(b, a, v, axis=0) - dv = np.diff(v_filt) - else: - dv = np.diff(v) - - dt = np.diff(t) - dvdt = 1e-3 * dv / dt # in V/s = mV/ms - - # Remove nan values (in case any dt values == 0) - dvdt = dvdt[~np.isnan(dvdt)] - - return dvdt - - -def get_isis(t, spikes): - """Find interspike intervals in sec between spikes (as indexes).""" - - if len(spikes) <= 1: - return np.array([]) - - return t[spikes[1:]] - t[spikes[:-1]] - - -def average_voltage(v, t, start=None, end=None): - """Calculate average voltage between start and end. - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - start : start of time window for spike detection (optional, default None) - end : end of time window for spike detection (optional, default None) - - Returns - ------- - v_avg : average voltage - """ - - if start is None: - start = t[0] - - if end is None: - end = t[-1] - - start_index = find_time_index(t, start) - end_index = find_time_index(t, end) - - return v[start_index:end_index].mean() - - -def adaptation_index(isis): - """Calculate adaptation index of `isis`.""" - if len(isis) == 0: - return np.nan - - return norm_diff(isis) - - -def latency(t, spikes, start): - """Calculate time to the first spike.""" - - if len(spikes) == 0: - return np.nan - - if start is None: - start = t[0] - - return t[spikes[0]] - start - - -def average_rate(t, spikes, start, end): - """Calculate average firing rate during interval between `start` and `end`. - - Parameters - ---------- - t : numpy array of times in seconds - spikes : numpy array of spike indexes - start : start of time window for spike detection - end : end of time window for spike detection - - Returns - ------- - avg_rate : average firing rate in spikes/sec - """ - - if start is None: - start = t[0] - - if end is None: - end = t[-1] - - spikes_in_interval = [spk for spk in spikes if t[spk] >= start and t[spk] <= end] - avg_rate = len(spikes_in_interval) / (end - start) - return avg_rate - - -def norm_diff(a): - """Calculate average of (a[i] - a[i+1]) / (a[i] + a[i+1]).""" - - if len(a) <= 1: - return np.nan - - a = a.astype(float) - if np.allclose((a[1:] + a[:-1]), 0.): - return 0. - norm_diffs = (a[1:] - a[:-1]) / (a[1:] + a[:-1]) - norm_diffs[(a[1:] == 0) & (a[:-1] == 0)] = 0. - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy") - avg = np.nanmean(norm_diffs) - return avg - - -def norm_sq_diff(a): - """Calculate average of (a[i] - a[i+1])^2 / (a[i] + a[i+1])^2.""" - if len(a) <= 1: - return np.nan - - a = a.astype(float) - norm_sq_diffs = np.square((a[1:] - a[:-1])) / np.square((a[1:] + a[:-1])) - return norm_sq_diffs.mean() - - -def has_fixed_dt(t): - """Check that all time intervals are identical.""" - dt = np.diff(t) - return np.allclose(dt, np.ones_like(dt) * dt[0]) - - -def fit_membrane_time_constant(v, t, start, end, min_rsme=1e-4): - """Fit an exponential to estimate membrane time constant between start and end - - Parameters - ---------- - v : numpy array of voltages in mV - t : numpy array of times in seconds - start : start of time window for exponential fit - end : end of time window for exponential fit - min_rsme: minimal acceptable root mean square error (default 1e-4) - - Returns - ------- - a, inv_tau, y0 : Coeffients of equation y0 + a * exp(-inv_tau * x) - - returns np.nan for values if fit fails - """ - - start_index = find_time_index(t, start) - end_index = find_time_index(t, end) - - guess = (v[start_index] - v[end_index], 50., v[end_index]) - t_window = (t[start_index:end_index] - t[start_index]).astype(np.float64) - v_window = v[start_index:end_index].astype(np.float64) - try: - popt, pcov = curve_fit(_exp_curve, t_window, v_window, p0=guess) - except RuntimeError: - logging.info("Curve fit for membrane time constant failed") - return np.nan, np.nan, np.nan - - pred = _exp_curve(t_window, *popt) - rsme = np.sqrt(np.mean(pred - v_window)) - if rsme > min_rsme: - logging.debug("Curve fit for membrane time constant did not meet RSME standard") - return np.nan, np.nan, np.nan - - return popt - - -def detect_pauses(isis, isi_types, cost_weight=1.0): - """Determine which ISIs are "pauses" in ongoing firing. - - Pauses are unusually long ISIs with a "detour reset" among "direct resets". - - Parameters - ---------- - isis : numpy array of interspike intervals - isi_types : numpy array of interspike interval types ('direct' or 'detour') - cost_weight : weight for cost function for calling an ISI a pause - Higher cost weights lead to fewer ISIs identified as pauses. The cost function - also depends on the difference between the duration of the "pause" ISIs and the - average duration and standard deviation of "non-pause" ISIs. - - Returns - ------- - pauses : numpy array of indices corresponding to pauses in `isis` - """ - - if len(isis) != len(isi_types): - raise FeatureError("Wrong number of ISIs") - - if not np.any(isi_types == "direct"): - # Need some direct-type firing to have pauses - return np.array([]) - - detour_candidates = [i for i, isi_type in enumerate(isi_types) if isi_type == "detour"] - median_direct = np.median(isis[isi_types == "direct"]) - direct_candidates = [i for i, isi_type in enumerate(isi_types) if isi_type == "direct" and isis[i] > 3 * median_direct] - candidates = detour_candidates + direct_candidates - - if not candidates: - return np.array([]) - - pause_list = np.array([], dtype=int) - all_cv = isis.std() / isis.mean() - best_net = 0 - for i in candidates: - temp_pause_list = np.append(pause_list, i) - non_pause_isis = np.delete(isis, temp_pause_list) - pause_isis = isis[temp_pause_list] - if len(non_pause_isis) < 2: - break - cv = non_pause_isis.std() / non_pause_isis.mean() - benefit = all_cv - cv - cost = np.sum(non_pause_isis.std() / np.abs(non_pause_isis.mean() - pause_isis)) - cost *= cost_weight - net = benefit - cost - if net > 0 and net < best_net: - break - if net > best_net: - best_net = net - pause_list = np.append(pause_list, i) - - if best_net <= 0: - pause_list = np.array([]) - - return np.sort(pause_list) - - -def detect_bursts(isis, isi_types, fast_tr_v, fast_tr_t, slow_tr_v, slow_tr_t, - thr_v, tol=0.5, pause_cost=1.0): - """Detect bursts in spike train. - - Parameters - ---------- - isis : numpy array of n interspike intervals - isi_types : numpy array of n interspike interval types - fast_tr_v : numpy array of fast trough voltages for the n + 1 spikes of the train - fast_tr_t : numpy array of fast trough times for the n + 1 spikes of the train - slow_tr_v : numpy array of slow trough voltages for the n + 1 spikes of the train - slow_tr_t : numpy array of slow trough times for the n + 1 spikes of the train - thr_v : numpy array of threshold voltages for the n + 1 spikes of the train - tol : tolerance for the difference in slow trough voltages and thresholds (default 0.5 mV) - Used to identify "delay" interspike intervals that occur within a burst - - Returns - ------- - bursts : list of bursts - Each item in list is a tuple of the form (burst_index, start, end) where `burst_index` - is a comparison index between the highest instantaneous rate within the burst vs - the highest instantaneous rate outside the burst. `start` is the index of the first - ISI of the burst, and `end` is the ISI index immediately following the burst. - """ - - if len(isis) != len(isi_types): - raise FeatureError("Wrong number of ISIs") - - if len(isis) < 2: # can't determine burstiness for a single ISI - return np.array([]) - - fast_tr_v = fast_tr_v[:-1] - fast_tr_t = fast_tr_t[:-1] - slow_tr_v = slow_tr_v[:-1] - slow_tr_t = slow_tr_t[:-1] - - isi_types = np.array(isi_types) # don't want to change the actual isi types data - - # Burst transitions can't be at "pause"-like ISIs - pauses = detect_pauses(isis, isi_types, cost_weight=pause_cost).astype(int) - isi_types[pauses] = "pauselike" - - if not (np.any(isi_types == "direct") and np.any(isi_types == "detour")): - # no candidates that could be bursts - return np.array([]) - - # Want to catch special case of detour in the middle of a large burst where - # the slow trough value is higher than the previous spike's threshold - isi_types[(thr_v[:-1] < (slow_tr_v + tol)) & (isi_types == "detour")] = "midburst" - - # Find transitions from direct -> detour and vice versa for burst boundaries - into_burst = np.array([i + 1 for i, (prev, cur) in - enumerate(zip(isi_types[:-1], isi_types[1:])) if - cur == "direct" and prev == "detour"], - dtype=int) - if isi_types[0] == "direct": - into_burst = np.append(np.array([0]), into_burst) - - drop_into = [] - out_of_burst = [] - for j, (into, next) in enumerate(zip(into_burst, np.append(into_burst[1:], len(isis)))): - for i, isi in enumerate(isi_types[into + 1:next]): - if isi == "detour": - out_of_burst.append(i + into + 1) - break - elif isi == "pauselike": - drop_into.append(j) - break - mask = np.ones_like(into_burst, dtype=bool) - mask[drop_into] = False - into_burst = into_burst[mask] - - out_of_burst = np.array(out_of_burst) - if len(out_of_burst) == len(into_burst) - 1: - out_of_burst = np.append(out_of_burst, len(isi_types)) - - if not (into_burst.size or out_of_burst.size): - return np.array([]) - - if len(into_burst) != len(out_of_burst): - raise FeatureError("Inconsistent burst boundary identification") - - inout_pairs = zip(into_burst, out_of_burst) - delta_t = slow_tr_t - fast_tr_t - - scores = _score_burst_set(inout_pairs, isis, delta_t) - best_score = np.mean(scores) - worst = np.argmin(scores) - test_bursts = list(inout_pairs) - del test_bursts[worst] - while len(test_bursts) > 0: - scores = _score_burst_set(test_bursts, isis, delta_t) - if np.mean(scores) > best_score: - best_score = np.mean(scores) - inout_pairs = list(test_bursts) - worst = np.argmin(scores) - del test_bursts[worst] - else: - break - - if best_score < 0: - return np.array([]) - - bursts = [] - for i, (into, outof) in enumerate(inout_pairs): - if i == len(inout_pairs) - 1: # last burst to evaluate - if outof <= len(isis) - 1: # are there spikes left after the burst? - metric = _burstiness_index(isis[into:outof], isis[outof:]) - elif i == 0: # was this the first one (and there weren't spikes after)? - metric = _burstiness_index(isis[into:outof], isis[:into]) - else: - prev_burst = inout_pairs[i - 1] - metric = _burstiness_index(isis[into:outof], isis[prev_burst[1]:into]) - else: - next_burst = inout_pairs[i + 1] - metric = _burstiness_index(isis[into:outof], isis[outof:next_burst[0]]) - bursts.append((metric, into, outof)) - - return bursts - - -def fit_prespike_time_constant(v, t, start, spike_time, dv_limit=-0.001, tau_limit=0.3): - """Finds the dominant time constant of the pre-spike rise in voltage - - Parameters - ---------- - v : numpy array of voltage time series in mV - t : numpy array of times in seconds - start : start of voltage rise (seconds) - spike_time : time of first spike (seconds) - dv_limit : dV/dt cutoff (default -0.001) - Shortens fit window if rate of voltage drop exceeds this limit - tau_limit : upper bound for slow time constant (seconds, default 0.3) - If the slower time constant of a double-exponential fit is twice that of the faster - and exceeds this limit, the faster one will be considered the dominant one - - Returns - ------- - tau : dominant time constant (seconds) - """ - - start_index = find_time_index(t, start) - end_index = find_time_index(t, spike_time) - if end_index <= start_index: - raise FeatureError("Start for pre-spike time constant fit cannot be after the spike time.") - - v_slice = v[start_index:end_index] - t_slice = t[start_index:end_index] - - # Solve linear version with single exponential first to guess at the time constant - y0 = v_slice.max() + 5e-6 # set y0 slightly above v_slice maximum - y = -v_slice + y0 - y = np.log(y) - - dy = calculate_dvdt(y, t_slice, filter=1.0) - - # End the fit interval if the voltage starts dropping - new_end_indexes = np.flatnonzero(dy <= dv_limit) - cross_limit = 0.0005 # sec - if not new_end_indexes.size or t_slice[new_end_indexes[0]] - t_slice[0] < cross_limit: - # either never crosses or crosses too early - new_end_index = len(v_slice) - else: - new_end_index = new_end_indexes[0] - - K, A_log = np.polyfit(t_slice[:new_end_index] - t_slice[0], y[:new_end_index], 1) - A = np.exp(A_log) - - dbl_exp_y0 = partial(_dbl_exp_fit, y0) - try: - popt, pcov = curve_fit(dbl_exp_y0, t_slice - t_slice[0], v_slice, p0=(-A / 2.0, -1.0 / K, -A / 2.0, -1.0 / K)) - except RuntimeError: - # Fall back to single fit - tau = -1.0 / K - return tau - - # Find dominant time constant - if popt[1] < popt[3]: - faster_weight, faster_tau, slower_weight, slower_tau = popt - else: - slower_weight, slower_tau, faster_weight, faster_tau = popt - - # These are all empirical values - if np.abs(faster_weight) > np.abs(slower_weight): - tau = faster_tau - elif (slower_tau - faster_tau) / slower_tau <= 0.1: # close enough; just use slower - tau = slower_tau - elif slower_tau > tau_limit and slower_weight / faster_weight < 2.0: - tau = faster_tau - else: - tau = slower_tau - - return tau - - -def estimate_adjusted_detection_parameters(v_set, t_set, interval_start, interval_end, filter=10): - """ - Estimate adjusted values for spike detection by analyzing a period when the voltage - changes quickly but passively (due to strong current stimulation), which can result - in spurious spike detection results. - - Parameters - ---------- - v_set : list of numpy arrays of voltage time series in mV - t_set : list of numpy arrays of times in seconds - interval_start : start of analysis interval (sec) - interval_end : end of analysis interval (sec) - - Returns - ------- - new_dv_cutoff : adjusted dv/dt cutoff (V/s) - new_thresh_frac : adjusted fraction of avg upstroke to find threshold - """ - - if type(v_set) is not list: - v_set = list(v_set) - - if type(t_set) is not list: - t_set = list(t_set) - - if len(v_set) != len(t_set): - raise FeatureError("t_set and v_set must be lists of equal size") - - if len(v_set) == 0: - raise FeatureError("t_set and v_set are empty") - - start_index = find_time_index(t_set[0], interval_start) - end_index = find_time_index(t_set[0], interval_end) - - maxes = [] - ends = [] - dv_set = [] - for v, t in zip(v_set, t_set): - dv = calculate_dvdt(v, t, filter) - dv_set.append(dv) - maxes.append(dv[start_index:end_index].max()) - ends.append(dv[end_index]) - - maxes = np.array(maxes) - ends = np.array(ends) - - cutoff_adj_factor = 1.1 - thresh_frac_adj_factor = 1.2 - - new_dv_cutoff = np.median(maxes) * cutoff_adj_factor - min_thresh = np.median(ends) * thresh_frac_adj_factor - - all_upstrokes = np.array([]) - for v, t, dv in zip(v_set, t_set, dv_set): - putative_spikes = detect_putative_spikes(v, t, dv_cutoff=new_dv_cutoff, filter=filter) - peaks = find_peak_indexes(v, t, putative_spikes) - putative_spikes, peaks = filter_putative_spikes(v, t, putative_spikes, peaks, dvdt=dv, filter=filter) - upstrokes = find_upstroke_indexes(v, t, putative_spikes, peaks, dvdt=dv) - if upstrokes.size: - all_upstrokes = np.append(all_upstrokes, dv[upstrokes]) - new_thresh_frac = min_thresh / all_upstrokes.mean() - - return new_dv_cutoff, new_thresh_frac - - -def _score_burst_set(bursts, isis, delta_t, c_n=0.1, c_tx=0.01): - in_burst = np.zeros_like(isis, dtype=bool) - for b in bursts: - in_burst[b[0]:b[1]] = True - - # If all ISIs are part of a burst, give it a bad score - if len(isis[~in_burst]) == 0: - return [-1e12] * len(bursts) - - delta_frac = delta_t / isis - - scores = [] - for b in bursts: - score = _burstiness_index(isis[b[0]:b[1]], isis[~in_burst]) # base score - if b[1] < len(delta_t): - score -= c_tx * (1. / (delta_frac[b[1]])) # cost for starting a burst - if b[0] > 0: - score -= c_tx * (1. / delta_frac[b[0] - 1]) # cost for ending a burst - score -= c_n * (b[1] - b[0] - 1) # cost for extending a burst - scores.append(score) - - return scores - - -def _burstiness_index(in_burst_isis, out_burst_isis): - burst_rate = 1. / in_burst_isis.min() - out_rate = 1. / out_burst_isis.min() - return (burst_rate - out_rate) / (burst_rate + out_rate) - - -def _exp_curve(x, a, inv_tau, y0): - return y0 + a * np.exp(-inv_tau * x) - - -def _dbl_exp_fit(y0, x, A1, tau1, A2, tau2): - penalty = 0 - if tau1 < 0 or tau2 < 0: - penalty = 1e6 - return y0 + A1 * np.exp(-x / tau1) + A2 * np.exp(-x / tau2) + penalty - - -class FeatureError(Exception): - """Generic Python-exception-derived object raised by feature detection functions.""" - pass diff --git a/allensdk/ephys/extract_cell_features.py b/allensdk/ephys/extract_cell_features.py deleted file mode 100755 index 5fcdd4acce..0000000000 --- a/allensdk/ephys/extract_cell_features.py +++ /dev/null @@ -1,230 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -import logging -import six -from . import ephys_extractor as efex -from . import ephys_features as ft - -HERO_MIN_AMP_OFFSET = 39.0 -HERO_MAX_AMP_OFFSET = 61.0 - -SHORT_SQUARE_TYPES = ["Short Square", - "Short Square - Triple", - "Short Square - Hold -60mv", - "Short Square - Hold -70mv", - "Short Square - Hold -80mv"] - -SHORT_SQUARE_THRESH_FRAC_FLOOR = 0.1 - -MEAN_FEATURES = [ "upstroke_downstroke_ratio", "peak_v", "peak_t", "trough_v", "trough_t", - "fast_trough_v", "fast_trough_t", "slow_trough_v", "slow_trough_t", - "threshold_v", "threshold_i", "threshold_t", "peak_v", "peak_t" ] - - -def extract_sweep_features(data_set, sweeps_by_type): - # extract sweep-level features - sweep_features = {} - - for stimulus_type, sweep_numbers in six.iteritems(sweeps_by_type): - logging.debug("%s:%s" % (stimulus_type, ','.join(map(str, sweep_numbers)))) - - if stimulus_type == "Short Square - Triple": - tmp_ext = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers) - t_set = [s.t for s in tmp_ext.sweeps()] - v_set = [s.v for s in tmp_ext.sweeps()] - - # IT-14530 - # triple-sweeps to use different window - win_start = efex.SHORT_SQUARE_TRIPLE_WINDOW_START - win_end = efex.SHORT_SQUARE_TRIPLE_WINDOW_END - cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters( - v_set, t_set, win_start, win_end) - thresh_frac = max(SHORT_SQUARE_THRESH_FRAC_FLOOR, thresh_frac) - - fex = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers, - dv_cutoff=cutoff, thresh_frac=thresh_frac) - elif stimulus_type in SHORT_SQUARE_TYPES: - tmp_ext = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers) - t_set = [s.t for s in tmp_ext.sweeps()] - v_set = [s.v for s in tmp_ext.sweeps()] - - win_start = efex.SHORT_SQUARES_WINDOW_START - win_end = efex.SHORT_SQUARES_WINDOW_END - cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters( - v_set, t_set, win_start, win_end) - thresh_frac = max(SHORT_SQUARE_THRESH_FRAC_FLOOR, thresh_frac) - - fex = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers, - dv_cutoff=cutoff, thresh_frac=thresh_frac) - else: - fex = efex.extractor_for_nwb_sweeps(data_set, sweep_numbers) - - fex.process_spikes() - - sweep_features.update({ f.id:f.as_dict() for f in fex.sweeps() }) - - return sweep_features - -# if subthreshold minimum amplitude is known (e.g., for human cells) then -# specify it. otherwise the default value will be used -def extract_cell_features(data_set, - ramp_sweep_numbers, - short_square_sweep_numbers, - long_square_sweep_numbers, - subthresh_min_amp = None): - - if subthresh_min_amp is None: - fex = efex.cell_extractor_for_nwb(data_set, - ramp_sweep_numbers, - short_square_sweep_numbers, - long_square_sweep_numbers) - else: - fex = efex.cell_extractor_for_nwb(data_set, - ramp_sweep_numbers, - short_square_sweep_numbers, - long_square_sweep_numbers, - subthresh_min_amp) - - fex.process() - - cell_features = fex.as_dict() - - # find hero sweep - rheo_amp = cell_features['long_squares']['rheobase_i'] - hero_min, hero_max = rheo_amp + HERO_MIN_AMP_OFFSET, rheo_amp + HERO_MAX_AMP_OFFSET - hero_amp = float("inf") - hero_sweep = None - for sweep in fex.long_squares_features("spiking").sweeps(): - nspikes = len(sweep.spikes()) - amp = sweep.sweep_feature("stim_amp") - - if nspikes > 0 and amp > hero_min and amp < hero_max and amp < hero_amp: - hero_amp = amp - hero_sweep = sweep - - if hero_sweep: - adapt = hero_sweep.sweep_feature("adapt") - latency = hero_sweep.sweep_feature("latency") - mean_isi = hero_sweep.sweep_feature("mean_isi") - else: - raise ft.FeatureError("Could not find hero sweep.") - - # find the mean features of the first spike for the ramps and short squares - ramps_ms0 = mean_features_spike_zero(fex.ramps_features().sweeps()) - ss_ms0 = mean_features_spike_zero(fex.short_squares_features().sweeps()) - - # compute baseline from all long square sweeps - v_baseline = np.mean(fex.long_squares_features().sweep_features('v_baseline')) - - cell_features['long_squares']['v_baseline'] = v_baseline - cell_features['long_squares']['hero_sweep'] = hero_sweep.as_dict() if hero_sweep else None - cell_features["ramps"]["mean_spike_0"] = ramps_ms0 - cell_features["short_squares"]["mean_spike_0"] = ss_ms0 - - return cell_features - -def mean_features_spike_zero(sweeps): - """ Compute mean feature values for the first spike in list of extractors """ - - output = {} - for mf in MEAN_FEATURES: - mfd = [ sweep.spikes()[0][mf] for sweep in sweeps if sweep.sweep_feature("avg_rate") > 0 ] - output[mf] = np.mean(mfd) - return output - -def get_stim_characteristics(i, t, no_test_pulse=False): - ''' - Identify the start time, duration, amplitude, start index, and - end index of a general stimulus. - This assumes that there is a test pulse followed by the stimulus square. - ''' - - di = np.diff(i) - diff_idx = np.flatnonzero(di != 0) - - if len(diff_idx) == 0: - return (None, None, 0.0, None, None) - - # skip the first up/down - idx = 0 if no_test_pulse else 1 - - # shift by one to compensate for diff() - start_idx = diff_idx[idx] + 1 - end_idx = diff_idx[-1] + 1 - - stim_start = float(t[start_idx]) - stim_dur = float(t[end_idx] - t[start_idx]) - stim_amp = float(i[start_idx]) - - return (stim_start, stim_dur, stim_amp, start_idx, end_idx) - -def get_ramp_stim_characteristics(i, t): - ''' Identify the start time and start index of a ramp sweep. ''' - - # Assumes that there is a test pulse followed by the stimulus ramp - di = np.diff(i) - up_idx = np.flatnonzero(di > 0) - - start_idx = up_idx[1] + 1 # shift by one to compensate for diff() - return (t[start_idx], start_idx) - -def get_square_stim_characteristics(i, t, no_test_pulse=False): - ''' - Identify the start time, duration, amplitude, start index, and - end index of a square stimulus. - This assumes that there is a test pulse followed by the stimulus square. - ''' - - di = np.diff(i) - up_idx = np.flatnonzero(di > 0) - down_idx = np.flatnonzero(di < 0) - - idx = 0 if no_test_pulse else 1 - - # second square is the stimulus - if up_idx[idx] < down_idx[idx]: # positive square - start_idx = up_idx[idx] + 1 # shift by one to compensate for diff() - end_idx = down_idx[idx] + 1 - else: # negative square - start_idx = down_idx[idx] + 1 - end_idx = up_idx[idx] + 1 - - stim_start = float(t[start_idx]) - stim_dur = float(t[end_idx] - t[start_idx]) - stim_amp = float(i[start_idx]) - - return (stim_start, stim_dur, stim_amp, start_idx, end_idx) diff --git a/allensdk/ephys/feature_extractor.py b/allensdk/ephys/feature_extractor.py deleted file mode 100644 index 48f96304ce..0000000000 --- a/allensdk/ephys/feature_extractor.py +++ /dev/null @@ -1,694 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import sys -import math -import numpy as np -import scipy.signal as signal -import logging - -# Design notes: -# to generate an average feature file, all sweeps must have all features -# to generate a fitness score of a sweep to a feature file,, the sweep -# must have all features in the file. If one is absent, a penalty -# of TODO ??? will be assessed - -# set of features -class EphysFeatures( object ): - def __init__(self, name): - # feature mean and standard deviations - self.mean = {} - self.stdev = {} - - # human-readable names for features - self.glossary = {} - - # table indicating how to score feature - # 'hit' feature exists: - # 'ignore' do nothing - # 'stdev' score is # stdevs from target mean - # 'miss' feature absent: - # 'constant' score = scoring['constant'] - # 'mean_mult' score = mean * scoring['mean_mult'] - # - self.scoring = {} - - self.name = name - - ################################################################ - # ignore scores - ignore_score = { "hit": "ignore" } - self.glossary["n_spikes"] = "Number of spikes" - self.scoring["n_spikes"] = ignore_score - - ################################################################ - # ignore misses - ignore_miss = { "hit":"stdev", "miss":"const", "const":0 } - self.glossary["adapt"] = "Adaptation index" - self.scoring["adapt"] = ignore_miss - self.glossary["latency"] = "Time to first spike (ms)" - self.scoring["latency"] = ignore_miss - - ################################################################ - # base miss off mean - mean_score = { "hit":"stdev", "miss":"mean_mult", "mean_mult":2 } - self.glossary["ISICV"] = "ISI-CV" - self.scoring["ISICV"] = mean_score - - ################################################################ - # normal scoring - normal_score = { "hit":"stdev", "miss":"const", "const":20 } - self.glossary["isi_avg"] = "Average ISI (ms)" - self.scoring["isi_avg"] = ignore_score - self.glossary["doublet"] = "Doublet ISI (ms)" - self.scoring["doublet"] = normal_score - self.glossary["f_fast_ahp"] = "Fast AHP (mV)" - self.scoring["f_fast_ahp"] = normal_score - self.glossary["f_slow_ahp"] = "Slow AHP (mV)" - self.scoring["f_slow_ahp"] = normal_score - self.glossary["f_slow_ahp_time"] = "Slow AHP time" - self.scoring["f_slow_ahp_time"] = normal_score - self.glossary["base_v"] = "Baseline voltage (mV)" - self.scoring["base_v"] = normal_score - #self.glossary["base_v2"] = "Baseline voltage 2 (mV)" - #self.scoring["base_v2"] = normal_score - #self.glossary["base_v3"] = "Baseline voltage 3 (mV)" - #self.scoring["base_v3"] = normal_score - ################################################################ - # per spike scoring - perspike_score = { "hit":"perspike", "miss":"const", "const":20, "skip_last_n":0 } - self.glossary["f_peak"] = "Spike height (mV)" - self.scoring["f_peak"] = perspike_score.copy() - self.glossary["f_trough"] = "Spike depth (mV)" - self.scoring["f_trough"] = perspike_score.copy() - self.scoring["f_trough"]["skip_last_n"] = 1 - # self.glossary["f_w"] = "Spike width at -30 mV (ms)" - # self.scoring["f_w"] = perspike_score.copy() - self.glossary["upstroke"] = "Peak upstroke (mV/ms)" - self.scoring["upstroke"] = perspike_score.copy() - self.glossary["upstroke_v"] = "Vm of peak upstroke (mV)" - self.scoring["upstroke_v"] = perspike_score.copy() - self.glossary["downstroke"] = "Peak downstroke (mV/ms)" - self.scoring["downstroke"] = perspike_score.copy() - self.glossary["downstroke_v"] = "Vm of peak downstroke (mV)" - self.scoring["downstroke_v"] = perspike_score.copy() - self.glossary["threshold"] = "Threshold voltage (mV)" - self.scoring["threshold"] = perspike_score.copy() - self.glossary["width"] = "Spike width at half-max (ms)" - self.scoring["width"] = perspike_score.copy() - self.scoring["width"]["skip_last_n"] = 1 - self.glossary["thresh_ramp"] = "Change in dv/dt over first 5 mV past threshold (mV/ms)" - self.scoring["thresh_ramp"] = perspike_score.copy() - - - ################################################################ - # heavily penalize when there are no spikes - spike_score = { "hit":"stdev", "miss":"const", "const":250 } - self.glossary["rate"] = "Firing rate (Hz)" - self.scoring["rate"] = spike_score - - def print_out(self): - print("Features from " + self.name) - for k in self.mean.keys(): - if k in self.glossary: - st = "%30s = " % self.glossary[k] - if self.mean[k] is not None: - st += "%g" % self.mean[k] - else: - st += "--------" - if k in self.stdev and self.stdev[k] is not None: - st += " +/- %g" % self.stdev[k] - print(st) - - # initialize summary feature set from file - def clone(self, param_dict): - for k in param_dict.keys(): - self.mean[k] = param_dict[k]["mean"] - self.stdev[k] = param_dict[k]["stdev"] - -class EphysFeatureExtractor( object ): - def __init__(self): - # list of feature set instances - self.feature_list = [] - # names of each element in feature list - self.feature_source = [] - # feature set object representing combination of all instances - self.summary = None - - # adds new feature set instance to feature_list - def process_instance(self, name, v, curr, t, onset, dur, stim_name): - feature = EphysFeatures(name) - - ################################################################ - # set stop time -- run until end of stimulus or end of sweep - # comment-out the one of the two approaches - # detect spikes only during stimulus - start = onset - stop = onset + dur - # detect spikes for all of sweep - #start = 0 - #stop = t[-1] - ################################################################ - # pull out spike times - - # calculate the derivative only within target window - # otherwise get spurious detection at ends of stimuli - # filter with 10kHz cutoff if constant 200kHz sample rate (ie experimental trace) - start_idx = np.where(t >= start)[0][0] - stop_idx = np.where(t >= stop)[0][0] - v_target = v[start_idx:stop_idx] - if np.abs(t[1] - t[0] - 5e-6) < 1e-7 and np.var(np.diff(t)) < 1e-6: - b, a = signal.bessel(4, 0.1, "low") - smooth_v = signal.filtfilt(b, a, v_target, axis=0) - dv = np.diff(smooth_v) - else: - dv = np.diff(v_target) - dvdt = dv / (np.diff(t[start_idx:stop_idx]) * 1e3) # in mV/ms - - dv_cutoff = 20 - thresh_pct = 0.05 - spikes = [] - temp_spk_idxs = np.where(np.diff(np.greater_equal(dvdt, dv_cutoff).astype(int)) == 1)[0] # find positive-going crossings of 100 mV/ms - spk_idxs = [] - for i, temp in enumerate(temp_spk_idxs): - if i == 0: - spk_idxs.append(temp) - elif np.any(dvdt[temp_spk_idxs[i - 1]:temp] < 0): - # check if the dvdt has gone back down below zero between presumed spike times - # sometimes the dvdt bobbles around detection threshold and produces spurious guesses at spike times - spk_idxs.append(temp) - spk_idxs += start_idx # set back to the "index space" of the original trace - - # recalculate full dv/dt for feature analysis (vs spike detection) - if np.abs(t[1] - t[0] - 5e-6) < 1e-7 and np.var(np.diff(t)) < 1e-6: - b, a = signal.bessel(4, 0.1, "low") - smooth_v = signal.filtfilt(b, a, v, axis=0) - dv = np.diff(smooth_v) - else: - dv = np.diff(v) - dvdt = dv / (np.diff(t) * 1e3) # in mV/ms - - # First time through, accumulate upstrokes to calculate average threshold target - for spk_n, spk_idx in enumerate(spk_idxs): - # Etay defines spike as time of threshold crossing - spk = {} - - if spk_n < len(spk_idxs) - 1: - next_idx = spk_idxs[spk_n + 1] - else: - next_idx = stop_idx - - if spk_n > 0: - prev_idx = spk_idxs[spk_n - 1] - else: - prev_idx = start_idx - - # Find the peak - peak_idx = np.argmax(v[spk_idx:next_idx]) + spk_idx - - spk["peak_idx"] = peak_idx - spk["f_peak"] = v[peak_idx] - spk["f_peak_i"] = curr[peak_idx] - spk["f_peak_t"] = t[peak_idx] - - # Check if end of stimulus interval cuts off spike - if so, don't process spike - if spk_n == len(spk_idxs) - 1 and peak_idx == next_idx-1: - continue - if spk_idx == peak_idx: - continue # this was bugfix, but why? ramp? - - # Determine maximum upstroke of spike - upstroke_idx = np.argmax(dvdt[spk_idx:peak_idx]) + spk_idx - - spk["upstroke"] = dvdt[upstroke_idx] - if np.isnan(spk["upstroke"]): # sometimes dvdt will be NaN because of multiple cvode points at same time step - close_idx = upstroke_idx + 1 - while (np.isnan(dvdt[close_idx])): - close_idx += 1 - spk["upstroke_idx"] = close_idx - spk["upstroke"] = dvdt[close_idx] - spk["upstroke_v"] = v[close_idx] - spk["upstroke_i"] = curr[close_idx] - spk["upstroke_t"] = t[close_idx] - else: - spk["upstroke_idx"] = upstroke_idx - spk["upstroke_v"] = v[upstroke_idx] - spk["upstroke_i"] = curr[upstroke_idx] - spk["upstroke_t"] = t[upstroke_idx] - - # Preliminarily define threshold where dvdt = 5% * max upstroke - thresh_pct = 0.05 - find_thresh_idxs = np.where(dvdt[prev_idx:upstroke_idx] <= thresh_pct * spk["upstroke"])[0] - if len(find_thresh_idxs) < 1: # Can't find a good threshold value - probably a bad simulation case - # Fall back to the upstroke value - threshold_idx = upstroke_idx - else: - threshold_idx = find_thresh_idxs[-1] + prev_idx - spk["threshold_idx"] = threshold_idx - spk["threshold"] = v[threshold_idx] - spk["threshold_v"] = v[threshold_idx] - spk["threshold_i"] = curr[threshold_idx] - spk["threshold_t"] = t[threshold_idx] - spk["rise_time"] = spk["f_peak_t"] - spk["threshold_t"] - - PERIOD = t[1] - t[0] - width_volts = (v[peak_idx] + v[threshold_idx]) / 2 - recording_width = False - for i in range(threshold_idx, min(len(v), threshold_idx + int(0.001 / PERIOD))): - if not recording_width and v[i] >= width_volts: - recording_width = True - idx0 = i - elif recording_width and v[i] < width_volts: - spk["half_height_width"] = t[i] - t[idx0] - break - # </KEITH> - - # Check for things that are probably not spikes: - # if there is more than 2 ms between the detection event and the peak, don't count it - if t[peak_idx] - t[threshold_idx] > 0.002: - continue - # if the "spike" is less than 2 mV, don't count it - if v[peak_idx] - v[threshold_idx] < 2.0: - continue - # if the absolute value of the peak is less than -30 mV, don't count it - if v[peak_idx] < -30.0: - continue - spikes.append(spk) - - # Refine threshold target based on average of all spikes - if len(spikes) > 0: - threshold_target = np.array([spk["upstroke"] for spk in spikes]).mean() * thresh_pct - - for spk_n, spk in enumerate(spikes): - if spk_n < len(spikes) - 1: - next_idx = spikes[spk_n + 1]["threshold_idx"] - else: - next_idx = stop_idx - - if spk_n > 0: - prev_idx = spikes[spk_n - 1]["peak_idx"] - else: - prev_idx = start_idx - - # Restore variables from before - # peak_idx = spk['peak_idx'] - peak_idx = np.argmax(v[spk['threshold_idx']:next_idx]) + spk['threshold_idx'] - - spk["peak_idx"] = peak_idx - spk["f_peak"] = v[peak_idx] - spk["f_peak_i"] = curr[peak_idx] - spk["f_peak_t"] = t[peak_idx] - - # Determine maximum upstroke of spike - # upstroke_idx = spk['upstroke_idx'] - upstroke_idx = np.argmax(dvdt[spk['threshold_idx']:peak_idx]) + spk['threshold_idx'] - - spk["upstroke"] = dvdt[upstroke_idx] - if np.isnan(spk["upstroke"]): # sometimes dvdt will be NaN because of multiple cvode points at same time step - close_idx = upstroke_idx + 1 - while (np.isnan(dvdt[close_idx])): - close_idx += 1 - spk["upstroke_idx"] = close_idx - spk["upstroke"] = dvdt[close_idx] - spk["upstroke_v"] = v[close_idx] - spk["upstroke_i"] = curr[close_idx] - spk["upstroke_t"] = t[close_idx] - else: - spk["upstroke_idx"] = upstroke_idx - spk["upstroke_v"] = v[upstroke_idx] - spk["upstroke_i"] = curr[upstroke_idx] - spk["upstroke_t"] = t[upstroke_idx] - - # Find threshold based on average target - find_thresh_idxs = np.where(dvdt[prev_idx:upstroke_idx] <= threshold_target)[0] - if len(find_thresh_idxs) < 1: # Can't find a good threshold value - probably a bad simulation case - # Fall back to the upstroke value - threshold_idx = upstroke_idx - else: - threshold_idx = find_thresh_idxs[-1] + prev_idx - spk["threshold_idx"] = threshold_idx - spk["threshold"] = v[threshold_idx] - spk["threshold_v"] = v[threshold_idx] - spk["threshold_i"] = curr[threshold_idx] - spk["threshold_t"] = t[threshold_idx] - - # Define the spike time as threshold time - spk["t_idx"] = threshold_idx - spk["t"] = t[threshold_idx] - - # Save the -30 mV crossing time for backward compatibility with Etay code - overn30_idxs = np.where(v[threshold_idx:peak_idx] >= -30)[0] - if len(overn30_idxs) > 0: - spk["t_idx_n30"] = overn30_idxs[0] + threshold_idx - else: # fall back to threshold definition if spike doesn't cross -30 mV - spk["t_idx_n30"] = threshold_idx - spk["t_n30"] = t[spk["t_idx_n30"]] - - # Figure out initial "slope" of phase plot post-threshold - plus_5_vec = np.where(v[threshold_idx:upstroke_idx] >= spk["threshold"] + 5)[0] - if len(plus_5_vec) > 0: - thresh_plus_5_idx = plus_5_vec[0] + threshold_idx - spk["thresh_ramp"] = dvdt[thresh_plus_5_idx] - dvdt[threshold_idx] - else: - spk["thresh_ramp"] = dvdt[upstroke_idx] - dvdt[threshold_idx] - - # go forward to determine peak downstroke of spike - downstroke_idx = np.argmin(dvdt[peak_idx:next_idx]) + peak_idx - spk["downstroke_idx"] = downstroke_idx - spk["downstroke_v"] = v[downstroke_idx] - spk["downstroke_i"] = curr[downstroke_idx] - spk["downstroke_t"] = t[downstroke_idx] - spk["downstroke"] = dvdt[downstroke_idx] - if np.isnan(spk["downstroke"]): # sometimes dvdt will be NaN because of multiple cvode points at same time step - close_idx = downstroke_idx + 1 - while (np.isnan(dvdt[close_idx])): - close_idx += 1 - spk["downstroke"] = dvdt[close_idx] - - features = {} - feature.mean["base_v"] = v[np.where((t > onset - 0.1) & (t < onset - 0.001))].mean() # baseline voltage, 100ms before stim - feature.mean["spikes"] = spikes - isi_cv = self.isicv(spikes) - if isi_cv is not None: - feature.mean["ISICV"] = isi_cv - n_spikes = len(spikes) - feature.mean["n_spikes"] = n_spikes - feature.mean["rate"] = 1.0 * n_spikes / (stop - start); - feature.mean["adapt"] = self.adaptation_index(spikes, stop) - if len(spikes) > 1: - feature.mean["doublet"] = 1000 * (spikes[1]["t"] - spikes[0]["t"]) - if len(spikes) > 0: - for i, spk in enumerate(spikes): - idx_next = spikes[i + 1]["t_idx"] if i < len(spikes) - 1 else stop_idx - self.calculate_trough(spk, v, curr, t, idx_next) - half_max_v = (spk["f_peak"] - spk["f_trough"]) / 2.0 + spk["f_trough"] - over_half_max_v_idxs = np.where(v[spk["t_idx"]:spk["trough_idx"]] > half_max_v)[0] - if len(over_half_max_v_idxs) > 0: - spk["width"] = 1000. * (t[over_half_max_v_idxs[-1] + spk["t_idx"]] - t[over_half_max_v_idxs[0] + spk["t_idx"]]) - feature.mean["latency"] = 1000. * (spikes[0]["t"] - onset) - feature.mean["latency_n30"] = 1000. * (spikes[0]["t_n30"] - onset) - # extract properties for each spike - isicnt = 0 - isitot = 0 - for i in range(0, len(spikes)-1): - spk = spikes[i] - idx_next = spikes[i+1]["t_idx"] - isitot += spikes[i+1]["t"] - spikes[i]["t"] - isicnt += 1 - if isicnt > 0: - feature.mean["isi_avg"] = 1000 * isitot / isicnt - else: - feature.mean["isi_avg"] = None - # average feature data from individual spikes - # build superset dictionary of possible features - superset = {} - for i in range(len(spikes)): - for k in spikes[i].keys(): - if k not in superset: - superset[k] = k - - for k in superset.keys(): - cnt = 0 - mean = 0 - for i in range(len(spikes)): - if k not in spikes[i]: - continue - mean += float(spikes[i][k]) - cnt += 1.0 - # this shouldn't be possible, but it may be in future version - # so might as well trap for it - if cnt == 0: - continue - mean /= cnt - stdev = 0 - for i in range(len(spikes)): - if k not in spikes[i]: - continue - dif = mean - float(spikes[i][k]) - stdev += dif * dif - stdev = math.sqrt(stdev / cnt) - feature.mean[k] = mean - feature.stdev[k] = stdev - # - self.feature_list.append(feature) - self.feature_source.append(name) - - def isicv(self, spikes): - if len(spikes) < 3: - return None - isi_mean = 0 - lst = [] - for i in range(len(spikes) - 1): - isi = spikes[i+1]["t"] - spikes[i]["t"] - #print("\t%g" % isi) - isi_mean += isi - lst.append(isi) - isi_mean /= 1.0 * len(lst) - #print(isi_mean) - var = 0 - for i in range(len(lst)): - dif = isi_mean - lst[i] - var += dif * dif - var /= len(lst) - #var /= len(lst) - 1 - #print(math.sqrt(var)) - if isi_mean > 0: - return math.sqrt(var) / isi_mean - return None - - def adaptation_index(self, spikes, stim_end): - if len(spikes) < 4: - return None - adi = 0 - cnt = 0 - isi = [] - for i in range(len(spikes)-1): - isi.append(spikes[i+1]["t"] - spikes[i]["t"]) - # act as though time between last spike and stim end is another ISI per Etay's code - # l = stim_end - spikes[-1]["t"] - # if l > 0 and l > isi[-1]: - # isi.append(l) - for i in range(len(isi)-1): - adi += 1.0 * (isi[i+1] - isi[i]) / (isi[i+1] + isi[i]) - cnt += 1 - adi /= cnt - return adi - - ##---------------------------------------------------------------------- - - # trough (AHP) is presently defined as the minimum voltage level - # observed between successive spikes in a burst - # there's too much data to cleanly return it on the stack - # instead, spike table is passed in instead - def calculate_trough(self, spike, v, curr, t, next_idx): - # dt = t[1] - t[0] - peak_idx = spike["peak_idx"] - - if peak_idx >= next_idx: - logging.warning("next index (%d) before peak index (%d) calculating trough" % ( next_idx, peak_idx )) - trough_idx = next_idx - else: - trough_idx = np.argmin(v[peak_idx:next_idx]) + peak_idx - - spike["trough_idx"] = trough_idx - spike["f_trough"] = v[trough_idx] - spike["trough_v"] = v[trough_idx] - spike["trough_t"] = t[trough_idx] - spike["trough_i"] = curr[trough_idx] - - # calculate etay's 'fast' and 'slow' ahp here - if t[peak_idx] + 0.005 >= t[-1]: - five_ms_idx = len(t) - 1 - else: - five_ms_idx = np.where(t >= 0.005 + t[peak_idx])[0][0] # 5ms after peak - - # fast AHP is minimum value occurring w/in 5ms - if five_ms_idx >= next_idx: - five_ms_idx = next_idx - - if peak_idx == five_ms_idx: - fast_idx = next_idx - else: - fast_idx = np.argmin(v[peak_idx:five_ms_idx]) + peak_idx - - spike["f_fast_ahp"] = v[fast_idx] - spike["f_fast_ahp_v"] = v[fast_idx] - spike["f_fast_ahp_i"] = curr[fast_idx] - spike["f_fast_ahp_t"] = t[fast_idx] - - if five_ms_idx == next_idx: - slow_idx = fast_idx - else: - slow_idx = np.argmin(v[five_ms_idx:next_idx]) + five_ms_idx - - spike["f_slow_ahp"] = v[slow_idx] - spike["f_slow_ahp_time"] = (t[slow_idx] - t[peak_idx]) / (t[next_idx] - t[peak_idx]) - spike["f_slow_ahp_t"] = t[slow_idx] - - # initialize summary feature set from file - def push_summary(self, new_summary): - self.summary = new_summary - - # calculate nearness score for feature set X relative to summary - # the nearness score is the sum of squares the features are from - # their target values, in units of standard deviations - # when a feature is absent, the algorithm to determine the - # penalty is stored in the feature itself, and this value - # is calculated then added to the sum - def score_feature_set(self, set_num): - cand = self.feature_list[set_num] - scores = [] - for k in sorted(self.summary.mean.keys()): - if k in self.summary.glossary: - response = self.summary.scoring[k]["hit"] - if response == "ignore": - continue - elif response == "stdev": - mean = self.summary.mean[k] - stdev = self.summary.stdev[k] - assert stdev > 0 - if k in cand.mean and cand.mean[k] is not None: - val = cand.mean[k] - inc = abs(mean - val) / stdev - scores.append(inc) -# print("Hit %s, %g+/-%g (%g) = %g" % (k, mean, stdev, val, inc)) - else: - resp = cand.scoring[k]["miss"] - if resp == "const": - miss = float(cand.scoring[k][resp]) - elif resp == "mean_mult": - miss = mean * float(cand.scoring[k][resp]) - else: - assert False - miss = float(miss) - scores.append(miss) -# print("Missed %s, penalty = %g" % (k, miss)) - elif response == "perspike": - mean = self.summary.mean[k] - stdev = self.summary.stdev[k] - assert stdev > 0 - if k in cand.mean and cand.mean[k] is not None: - val = 0 - n_spikes = len(cand.mean["spikes"]) - skip_last_n = self.summary.scoring[k]["skip_last_n"] - for spike in cand.mean["spikes"][:n_spikes-skip_last_n]: - val += abs(spike[k] - mean) - val /= n_spikes - skip_last_n - inc = val / stdev - scores.append(inc) - else: - resp = cand.scoring[k]["miss"] - if resp == "const": - miss = float(cand.scoring[k][resp]) - elif resp == "mean_mult": - miss = mean * float(cand.scoring[k][resp]) - else: - assert False - miss = float(miss) - scores.append(miss) -# print("Missed %s, penalty = %g" % (k, miss)) - else: - assert False - if abs(sum(scores)) > 1e10: - print(k) - print(self.summary.scoring) - print(self.summary.mean) - print(self.summary.stdev) - print(cand.summary.scoring) - print(cand.summary.mean) - print(cand.summary.stdev) - assert False - return scores - - # create summary of feature instances - # 'summary' is an empty feature object. this must be the same - # class as the other feature objects that are being summarized - def summarize(self, summary): - if len(self.feature_list) == 0: - print("Error -- no features were extracted. Summary impossible") - sys.exit() - # make dummy dict to verify that all feature instances have - # identical features - # only copy features that are in the glossary. some are for - # internal use (eg, t_idx -- time index) and aren't important - # here - superset = {} - for i in range(len(self.feature_list)): - fx = self.feature_list[i] - for k in fx.mean.keys(): - if k in fx.glossary: - superset[k] = k - err = 0 - for k in superset.keys(): - for i in range(len(self.feature_list)): - fx = self.feature_list[i].mean - if k not in fx: - print("Error - feature '%s' not in all data sets" % k) - err += 1 - if err > 0: - return None - # all features must be of the same type - # to ensure this, make programmer specify the type being summarized - self.summary = summary - # now set summary means to zero - for k in fx.keys(): - self.summary.mean[k] = 0 - # now calculate the average of all features - for i in range(len(self.feature_list)): - fx = self.feature_list[i] - for k in fx.mean.keys(): - if k in fx.glossary and fx.mean[k] is not None: - self.summary.mean[k] += fx.mean[k] - self.summary.stdev[k] = 0.0 - # divide out n to get actual mean - for k in fx.mean.keys(): - self.summary.mean[k] /= 1.0 * len(self.feature_list) - # calculate standard deviation - for i in range(len(self.feature_list)): - fx = self.feature_list[i] - for k in fx.mean.keys(): - if k in fx.glossary and fx.mean[k] is not None: - mean = self.summary.mean[k] - dif = mean - fx.mean[k] - self.summary.stdev[k] += dif * dif - # divide out n and take sqrt to get actual stdev - fx = self.feature_list[0] - for k in fx.mean.keys(): - if k in fx.glossary and fx.mean[k] is not None: - val = self.summary.stdev[k] - val /= 1.0 * len(self.feature_list) - self.summary.stdev[k] = math.sqrt(val) - return self - diff --git a/allensdk/internal/README.md b/allensdk/internal/README.md deleted file mode 100644 index 5ce1d96e03..0000000000 --- a/allensdk/internal/README.md +++ /dev/null @@ -1,45 +0,0 @@ -Internal -======== - -This subpackage contains code that depends on Allen Institute for Brain Science-specific resources, such as tools for accessing our internal databases. The code here should only be expected to run if you are at the Allen Institute! - -The dependencies specific to this subpackage are listed in internal_requirements.txt. There are some of additional dependencies with complicated installation requirements that we don't list in internal_requirements.txt. These are: -- neuron : we build this from source by: - ``` - ./configure --without-iv --prefix={install location} --with-nrnpython={path to your python} - make - make install - ``` -- mpi4py : we conda install this like `conda install mpi4py` -- opencv : we conda install this like `conda install -c conda-forge opencv` - -Accessing Databases -=================== -If you want to access the on-prem databases using the AllenSDK without providing credentials every time, -you'll need to export the following environment variables. We recommend adding the following -to your ~/.bash_profile on Linux or macOS machines (empty quotes are strings you need to fill in): - -If you do not know the credentials and need access, contact [Rob Young](RobY@alleninstitute.org) or [Wayne Wakeman](waynew@alleninstitute.org). - -``` -export LIMS_DBNAME="lims2" -export LIMS_USER="" -export LIMS_HOST="" -export LIMS_PORT=5432 -export LIMS_PASSWORD="" -export MTRAIN_DBNAME="mtrain" -export MTRAIN_USER="" -export MTRAIN_HOST="" -export MTRAIN_PORT=5432 -export MTRAIN_PASSWORD="" -``` - -After completing your bash profile, run the following command: - -``` -source ~/.bash_profile -``` - -or close and reopen your terminal. - -For windows users, please see [these instructions](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-powershell-1.0/ff730964(v=technet.10)?redirectedfrom=MSDN) for setting environment variables using powershell. \ No newline at end of file diff --git a/allensdk/internal/__init__.py b/allensdk/internal/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/api/__init__.py b/allensdk/internal/api/__init__.py deleted file mode 100644 index ae7af12baa..0000000000 --- a/allensdk/internal/api/__init__.py +++ /dev/null @@ -1,126 +0,0 @@ -from typing import Optional - -import psycopg2 -import psycopg2.extras -import pandas as pd - -from allensdk import one, OneResultExpectedError -from allensdk.core.authentication import DbCredentials, credential_injector - - -class OneOrMoreResultExpectedError(RuntimeError): - pass - - -def psycopg2_select(query, database, host, port, username, password): - - connection = psycopg2.connect( - host=host, port=port, dbname=database, - user=username, password=password, - cursor_factory=psycopg2.extras.RealDictCursor - ) - cursor = connection.cursor() - - try: - cursor.execute(query) - response = cursor.fetchall() - finally: - cursor.close() - connection.close() - - return pd.DataFrame(response) - - -class PostgresQueryMixin(object): - def __init__(self, *, dbname, user, host, password, port): - - self.dbname = dbname - self.user = user - self.host = host - self.password = password - self.port = port - - def get_cursor(self): - return self.get_connection().cursor() - - def get_connection(self): - return psycopg2.connect(dbname=self.dbname, user=self.user, - host=self.host, password=self.password, - port=self.port) - - def fetchone(self, query, strict=True): - response = one(list(self.select(query).to_dict().values())) - if strict is True and (len(response) != 1 or response[0] is None): - raise OneResultExpectedError - return response[0] - - def fetchall(self, query, strict=True): - response = self.select(query) - return [one(x) for x in response.values.flat] - - def select(self, query): - return psycopg2_select( - query, - database=self.dbname, - host=self.host, - port=self.port, - username=self.user, - password=self.password - ) - - def select_one(self, query): - data = self.select(query).to_dict('record') - if len(data) == 1: - return data[0] - return {} - - -def db_connection_creator(credentials: Optional[DbCredentials] = None, - fallback_credentials: Optional[dict] = None, - ) -> PostgresQueryMixin: - """Create a db connection using credentials. If credentials are not - provided then use fallback credentials (which attempt to read from - shell environment variables). - - Note: Must provide one of either 'credentials' or 'fallback_credentials'. - If both are provided, 'credentials' will take precedence. - - Parameters - ---------- - credentials : Optional[DbCredentials], optional - User specified credentials, by default None - fallback_credentials : dict - Fallback credentials to use for creating the DB connection in the - case that no 'credentials' are provided, by default None. - - Fallback credentials will attempt to get db connection info from - shell environment variables. - - Some examples of environment variables that fallback credentials - will try to read from can be found in allensdk.core.auth_config. - - Returns - ------- - PostgresQueryMixin - A DB connection instance which can execute queries to the DB - specified by credentials or fallback_credentials. - - Raises - ------ - RuntimeError - If neither 'credentials' nor 'fallback_credentials' were provided. - """ - if credentials: - db_conn = PostgresQueryMixin( - dbname=credentials.dbname, user=credentials.user, - host=credentials.host, port=credentials.port, - password=credentials.password) - elif fallback_credentials: - db_conn = (credential_injector(fallback_credentials) - (PostgresQueryMixin)()) - else: - raise RuntimeError( - "Must provide either credentials or fallback credentials in " - "order to create a db connection!") - - return db_conn diff --git a/allensdk/internal/api/api_prerelease.py b/allensdk/internal/api/api_prerelease.py deleted file mode 100644 index 8f971e4934..0000000000 --- a/allensdk/internal/api/api_prerelease.py +++ /dev/null @@ -1,24 +0,0 @@ -import shutil - -from allensdk.api.api import Api - - -class ApiPrerelease(Api): - '''Extends allensdk.api.api to copy files 'locally' from shared storage. - ''' - - def retrieve_file_from_storage(self, storage_path, save_file_path): - '''Copy data from path to file_name. - - Parameters - ---------- - storage_path : string - path to file in shared directory (copy source) - save_file_name : string - path to file destination (copy target) - ''' - self._file_download_log.info("Downloading PATH: %s", storage_path) - self._file_download_log.debug("To PATH: %s", save_file_path) - - # TODO: exception handling - shutil.copyfile(storage_path, save_file_path) diff --git a/allensdk/internal/api/lims_api.py b/allensdk/internal/api/lims_api.py deleted file mode 100644 index ec4ac00444..0000000000 --- a/allensdk/internal/api/lims_api.py +++ /dev/null @@ -1,45 +0,0 @@ -import pandas as pd -from typing import Optional - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.internal.core.lims_utilities import safe_system_path -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.core.authentication import credential_injector, DbCredentials - - -class LimsApi(): - - def __init__(self, lims_credentials: Optional[DbCredentials] = None): - if lims_credentials: - self.lims_db = PostgresQueryMixin( - dbname=lims_credentials.dbname, user=lims_credentials.user, - host=lims_credentials.host, password=lims_credentials.password, - port=lims_credentials.port) - else: - # Currying is equivalent to decorator syntactic sugar - self.lims_db = (credential_injector(LIMS_DB_CREDENTIAL_MAP) - (PostgresQueryMixin)()) - - def get_experiment_id(self): - return self.experiment_id - - def get_behavior_tracking_video_filepath_df(self): - query = ''' - SELECT wkf.storage_directory || wkf.filename AS raw_behavior_tracking_video_filepath, attachable_type - FROM well_known_files wkf WHERE wkf.well_known_file_type_id IN (SELECT id FROM well_known_file_types WHERE name = 'RawBehaviorTrackingVideo') - ''' - return pd.read_sql(query, self.lims_db.get_connection()) - - def get_eye_tracking_video_filepath_df(self): - query = ''' - SELECT wkf.storage_directory || wkf.filename AS raw_behavior_tracking_video_filepath, attachable_type - FROM well_known_files wkf WHERE wkf.well_known_file_type_id IN (SELECT id FROM well_known_file_types WHERE name = 'RawEyeTrackingVideo') - ''' - return pd.read_sql(query, self.lims_db.get_connection()) - - -if __name__ == "__main__": - - api = LimsApi() - for ii in range(5): - print(api.get_eye_tracking_video_filepath_df().loc[ii].raw_behavior_tracking_video_filepath) diff --git a/allensdk/internal/api/mtrain_api.py b/allensdk/internal/api/mtrain_api.py deleted file mode 100644 index 1c096ac867..0000000000 --- a/allensdk/internal/api/mtrain_api.py +++ /dev/null @@ -1,188 +0,0 @@ -import pandas as pd -import requests -import os -import sys -import itertools -import json -import uuid - -from . import PostgresQueryMixin, db_connection_creator -from allensdk.brain_observatory.behavior.trials_processing import EDF_COLUMNS -from allensdk.core.auth_config import MTRAIN_DB_CREDENTIAL_MAP, \ - LIMS_DB_CREDENTIAL_MAP -from allensdk.core.authentication import credential_injector -from allensdk.brain_observatory.behavior.data_objects \ - import BehaviorSessionId -from allensdk.brain_observatory.behavior.data_objects.metadata.\ - behavior_metadata.behavior_metadata import BehaviorMetadata - - -class MtrainApi: - - def __init__(self, api_base='http://mtrain:5000'): - self.api_base = api_base - - def get_page(self, table_name, get_obj=None, filters=[], **kwargs): - - if get_obj is None: - get_obj = requests - - data = {'total_pages': '--'} - for ii in itertools.count(1): - sys.stdout.flush() - - uri = '/'.join([self.api_base, - "api/v1/%s?page=%i&q={\"filters\":%s}" % ( - table_name, ii, json.dumps(filters))]) - tmp = get_obj.get(uri, **kwargs) - try: - data = tmp.json() - except TypeError: - data = tmp.json - if 'message' not in data: - df = pd.DataFrame(data["objects"]) - sys.stdout.flush() - yield df - - if 'total_pages' not in data or data['total_pages'] == ii: - return - - def get_df(self, table_name, get_obj=None, **kwargs): - return pd.concat([df for df in - self.get_page(table_name, get_obj=get_obj, - **kwargs)], axis=0) - - def get_subjects(self): - return self.get_df('subjects').LabTracks_ID.values - - def get_session(self, behavior_session_uuid=None, - behavior_session_id=None): - assert not all(v is None for v in [ - behavior_session_uuid, - behavior_session_id]), 'must enter either a ' \ - 'behavior_session_uuid or a ' \ - 'behavior_session_id' - if behavior_session_id is not None: - def _get_behavior_metadata(): - lims_db = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP - ) - behavior_session_id_ = BehaviorSessionId( - behavior_session_id=behavior_session_id) - bm = BehaviorMetadata.from_lims( - behavior_session_id=behavior_session_id_, lims_db=lims_db) - return bm - bm = _get_behavior_metadata() - - if behavior_session_uuid is not None: - # if both a behavior session uuid and a lims id are entered, - # ensure that they match - assert behavior_session_uuid == \ - str(bm.behavior_session_uuid), \ - 'behavior_session {} does not match ' \ - 'behavior_session_id {}'.format( - behavior_session_uuid, bm.behavior_session_uuid) - else: - # get a behavior session uuid if a lims ID was entered - behavior_session_uuid = str(bm.behavior_session_uuid) - - filters = [{"name": "id", "op": "eq", "val": behavior_session_uuid}] - behavior_df = self.get_df('behavior_sessions', filters=filters).rename( - columns={'id': 'behavior_session_uuid'}) - state_df = self.get_df('states').rename(columns={'id': 'state_id'}) - regimen_df = self.get_df('regimens').rename( - columns={'id': 'regimen_id', 'name': 'regimen_name'}).drop( - ['states', 'active'], axis=1) - stage_df = self.get_df('stages').rename( - columns={'id': 'stage_id'}).drop(['states'], axis=1) - - behavior_df = pd.merge(behavior_df, state_df, how='left', - on='state_id') - behavior_df = pd.merge(behavior_df, stage_df, how='left', - on='stage_id') - behavior_df = pd.merge(behavior_df, regimen_df, how='left', - on='regimen_id') - behavior_df.drop(['state_id', 'stage_id', 'regimen_id'], inplace=True, - axis=1) - if len(behavior_df) == 0: - raise RuntimeError("Session not found %s:" % behavior_session_uuid) - assert len(behavior_df) == 1 - session_dict = behavior_df.iloc[0].to_dict() - - filters = [{"name": "behavior_session_uuid", "op": "eq", - "val": behavior_session_uuid}] - trials_df = self.get_df('trials', filters=filters).sort_values( - 'index').drop(['id', 'behavior_session'], axis=1).set_index( - 'index', drop=False) - trials_df['behavior_session_uuid'] = trials_df[ - 'behavior_session_uuid'].map(uuid.UUID) - del trials_df.index.name - session_dict['trials'] = trials_df[EDF_COLUMNS] - - return session_dict - - def get_behavior_training_df(self, LabTracks_ID=None): - if LabTracks_ID is not None: - filters = [ - {"name": "LabTracks_ID", "op": "eq", "val": LabTracks_ID}] - else: - filters = [] - behavior_df = self.get_df('behavior_sessions', filters=filters).rename( - columns={'id': 'behavior_session_uuid'}) - - state_df = self.get_df('states').rename(columns={'id': 'state_id'}) - regimen_df = self.get_df('regimens').rename( - columns={'id': 'regimen_id', 'name': 'regimen_name'}).drop( - ['states', 'active'], axis=1) - stage_df = self.get_df('stages').rename( - columns={'id': 'stage_id', 'name': 'stage_name'}).drop(['states'], - axis=1) - - behavior_df = pd.merge(behavior_df, state_df, how='left', - on='state_id') - behavior_df = pd.merge(behavior_df, stage_df, how='left', - on='stage_id') - behavior_df = pd.merge(behavior_df, regimen_df, how='left', - on='regimen_id') - return behavior_df - - def get_current_stage(self, LabTracks_ID): - sess = requests.Session() - - state_response = sess.get(os.path.join(self.api_base, 'get_script/'), - data=json.dumps({ - 'LabTracks_ID': LabTracks_ID})) # - # .json()#['objects']).keys() - return state_response.json()['data']['parameters']['stage'] - - -class MtrainSqlApi: - - def __init__(self, dbname=None, user=None, host=None, password=None, - port=None): - if any(map(lambda x: x is None, [dbname, user, host, password, port])): - # Currying is equivalent to decorator syntactic sugar - self.mtrain_db = ( - credential_injector(MTRAIN_DB_CREDENTIAL_MAP) - (PostgresQueryMixin)()) - else: - self.mtrain_db = PostgresQueryMixin( - dbname=dbname, user=user, host=host, password=password, - port=port) - - def get_subjects(self): - query = 'SELECT "LabTracks_ID" FROM subjects' - return self.mtrain_db.fetchall(query) - - def get_behavior_training_df(self, LabTracks_ID): - connection = self.mtrain_db.get_connection() - dataframe = pd.read_sql( - '''SELECT stages.name as stage_name, regimens.name as - regimen_name, bs.date, bs.id as behavior_session_id - FROM behavior_sessions bs - LEFT JOIN states ON states.id = bs.state_id - LEFT JOIN regimens ON regimens.id = states.regimen_id - LEFT JOIN stages ON stages.id = states.stage_id - WHERE "LabTracks_ID"={} - '''.format(LabTracks_ID), connection) - return dataframe.sort_values(by='date') diff --git a/allensdk/internal/api/queries/__init__.py b/allensdk/internal/api/queries/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/api/queries/biophysical_module_api.py b/allensdk/internal/api/queries/biophysical_module_api.py deleted file mode 100644 index 80c24ecf33..0000000000 --- a/allensdk/internal/api/queries/biophysical_module_api.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright 2016 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - -from allensdk.api.queries.rma_template import RmaTemplate - -class BiophysicalModuleApi(RmaTemplate): - '''''' - - rma_templates = \ - {"biophysical_lims_queries": [ - {'name': 'neuronal_model_runs_by_ids', - 'description': 'see name', - 'model': 'NeuronalModelRun', - 'criteria': '[id$in{{ neuronal_model_run_ids }}]', - 'include': 'well_known_files(well_known_file_type),' - 'neuronal_model(well_known_files(well_known_file_type),' - 'specimen(project,specimen_tags,' - 'ephys_roi_result' - '(ephys_qc_criteria,' - 'well_known_files(well_known_file_type)),' - 'neuron_reconstructions' - '(well_known_files(well_known_file_type)),' - 'ephys_sweeps' - '(ephys_sweep_tags,' - 'ephys_stimulus(ephys_stimulus_type))),' - 'neuronal_model_template' - '(neuronal_model_template_type,' - 'well_known_files(well_known_file_type)))', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['neuronal_model_run_ids'] - }, - {'name': 'neuronal_models_by_ids', - 'description': 'see name', - 'model': 'NeuronalModel', - 'criteria': '[id$in{{ neuronal_model_ids }}]', - 'include': 'well_known_files(well_known_file_type),' - 'specimen(project,specimen_tags,' - 'ephys_roi_result' - '(ephys_qc_criteria,' - 'well_known_files(well_known_file_type)),' - 'neuron_reconstructions' - '(well_known_files(well_known_file_type)),' - 'ephys_sweeps' - '(ephys_sweep_tags,' - 'ephys_stimulus(ephys_stimulus_type))),' - 'neuronal_model_template' - '(neuronal_model_template_type,' - 'well_known_files(well_known_file_type))', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['neuronal_model_ids'] - } - ]} - - - def __init__(self, base_uri=None): - super(BiophysicalModuleApi, self).__init__(base_uri, - query_manifest=BiophysicalModuleApi.rma_templates) - - - def get_neuronal_model_runs(self, neuronal_model_run_ids=None): - '''List Neuronal Model Rusn available through LIMS - with associated info needed to run in NEURON. - - Parameters - ---------- - neuronal_model_run_ids : integer or list of integers, optional - only select specific neuronal_model_runs. - - Returns - ------- - dict : neuronal model run metadata - ''' - data = self.template_query('biophysical_lims_queries', - 'neuronal_model_runs_by_ids', - neuronal_model_run_ids=neuronal_model_run_ids) - - return data - - - def get_neuronal_models(self, neuronal_model_ids=None): - '''List Neuronal Models available through LIMS - with associated info needed to run in NEURON. - - Parameters - ---------- - neuronal_model_ids : integer or list of integers, optional - only select specific neuronal_models. - - Returns - ------- - dict : neuronal model metadata - ''' - data = self.template_query('biophysical_lims_queries', - 'neuronal_models_by_ids', - neuronal_model_ids=neuronal_model_ids) - - return data \ No newline at end of file diff --git a/allensdk/internal/api/queries/biophysical_module_reader.py b/allensdk/internal/api/queries/biophysical_module_reader.py deleted file mode 100644 index 6adb856186..0000000000 --- a/allensdk/internal/api/queries/biophysical_module_reader.py +++ /dev/null @@ -1,419 +0,0 @@ -# Copyright 2016-2017 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - - -import json -import os -import logging -import allensdk.internal.core.lims_utilities as lims_utilities -from allensdk.config.manifest_builder import ManifestBuilder -from allensdk.config.manifest import Manifest - - -class BiophysicalModuleReader(object): - STIMULUS_CONTENT_TYPE = None - MORPHOLOGY_TYPE_ID = 303941301 - MOD_FILE_TYPE_ID = 292178729 - - def __init__(self): - self._log = logging.getLogger(__name__) - self.lims_path = None - self.lims_data = None - self.lims_update_data = None - - def read_lims_message(self, message, lims_path): - self.lims_path = lims_path - self.lims_data = message[0] - self.lims_update_data = dict(self.lims_data) - - def read_lims_file(self, lims_path): - self.lims_path = lims_path - self.read_json(lims_path) - self.lims_update_data = dict(self.lims_data) - - def read_json(self, path): - with open(path, 'rb') as f: - self.read_json_string(f.read()) - - def read_json_string(self, json_string): - self.lims_data = json.loads(json_string) - self.lims_update_data = dict(self.lims_data) - - def stimulus_file_entries(self): - ''' read the well known file path from the lims result - corresponding to the stimulus file - :return: well_known_file entries - :rtype: array of dicts - ''' - neuronal_model = self.lims_data['neuronal_model'] - specimen = neuronal_model['specimen'] - roi_result = specimen['ephys_roi_result'] - well_known_files = roi_result['well_known_files'] - - stimulus_file_entries = [] - - for well_known_file in well_known_files: - try: - file_type_id = well_known_file['well_known_file_type_id'] - - if file_type_id == lims_utilities.NWB_FILE_TYPE_ID: - stimulus_file_entries.append(well_known_file) - except: - self._log.warn('skipping well known file record with no well known file type.') - - return stimulus_file_entries - - def stimulus_path(self): - ''' Get the path to the stimulus file from the lims result. - :return: path to stimulus file - :rtype: string - ''' - file_entries = self.stimulus_file_entries() - - if len(file_entries) > 1: - self._log.warning('More than one stimulus file found.') - - file_entry = file_entries[0] - - stimulus_path = os.path.join(file_entry['storage_directory'], - file_entry['filename']) - - return stimulus_path - - def lims_working_directory(self): - ''' While this is the same directory as the neuronal_model_run - directory, it can be mocked out for testing if the - other directory is read only. - ''' - return self.neuronal_model_run_dir() - - def neuronal_model_run_dir(self): - ''' read the directory path where - output goes from the lims optimization config json - - Parameters - ---------- - - Returns - ------- - string: - directory path - ''' - return self.lims_data['storage_directory'] - - def fit_parameters_file_entries(self): - ''' read the fit_parameter file path from the lims result - corresponding to the stimulus file - :return: well_known_file entries - :rtype: array of dicts - ''' - neuronal_model = self.lims_data['neuronal_model'] - well_known_files = neuronal_model['well_known_files'] - - fit_parameter_file_entries = [] - - for well_known_file in well_known_files: - file_type_id = well_known_file['well_known_file_type_id'] - - if file_type_id == lims_utilities.MODEL_PARAMETERS_FILE_TYPE_ID: - fit_parameter_file_entries.append(well_known_file) - - return fit_parameter_file_entries - - def fit_parameters_path(self): - ''' Get the path to the fit parameters file from the lims result. - :return: path to file - :rtype: string - ''' - file_entries = self.fit_parameters_file_entries() - - if len(file_entries) > 1: - self._log.warning('More than one fit parameter file found.') - - file_entry = file_entries[0] - - fit_parameter_path = os.path.join(file_entry['storage_directory'], - file_entry['filename']) - - return fit_parameter_path - - def model_type(self): - ''' TODO: comment - ''' - return self.lims_data['neuronal_model']['neuronal_model_template']['name'] - - def morphology_file_entries(self): - ''' read the well known file paths - from the lims result corresponding to the morphology - - Returns - ------- - arrary of dicts: - well known file entries - ''' - neuronal_model = self.lims_data['neuronal_model'] - specimen = neuronal_model['specimen'] - reconstructions = specimen['neuron_reconstructions'] - - morphology_file_entries = [] - - for reconstruction in reconstructions: - superseded = reconstruction['superseded'] - manual = reconstruction['manual'] - - if manual == True and superseded == False: - well_known_files = reconstruction['well_known_files'] - - for well_known_file in well_known_files: - file_type_id = well_known_file['well_known_file_type_id'] - - if file_type_id == BiophysicalModuleReader.MORPHOLOGY_TYPE_ID: - morphology_file_entries.append(well_known_file) - - return morphology_file_entries - - def morphology_path(self): - ''' Get the path to the morphology file from the lims result. - :return: path to morphology file - :rtype: string - ''' - file_entries = self.morphology_file_entries() - - if len(file_entries) > 1: - self._log.warning('More than one morphology file found.') - - file_entry = file_entries[0] - - morphology_path = os.path.join(file_entry['storage_directory'], - file_entry['filename']) - - return morphology_path - - def sweep_entries(self): - ''' read the sweep entries - from the lims result corresponding to the stimulus - :return: stimulus sweep entries - :rtype: array of dicts - ''' - neuronal_model = self.lims_data['neuronal_model'] - specimen = neuronal_model['specimen'] - sweeps = specimen['ephys_sweeps'] - - return sweeps - - def sweep_numbers_by_type(self): - sweeps = self.sweep_entries() - - d = {s['ephys_stimulus']['ephys_stimulus_type']['name']: [] for s in sweeps} - - for n, s in enumerate(sweeps): - t = s['ephys_stimulus']['ephys_stimulus_type']['name'] - d[t].append(s['sweep_number']) - - return d - - def sweep_numbers(self): - ''' Get the stimulus sweep numbers from the lims result - :return: list of sweep numbers - :rtype: array of ints - ''' - sweep_entries = self.sweep_entries() - - if not sweep_entries or len(sweep_entries) < 1: - self._log.warning('No sweeps found.') - - sweeps = [sweep_entry['sweep_number'] \ - for sweep_entry in sweep_entries \ - if sweep_entry['workflow_state'] == 'auto_passed' or \ - sweep_entry['workflow_state'] == 'manual_passed' ] - - return list(set(sweeps)) - - def mod_file_entries(self): - ''' read the NERUON .mod file entries - from the lims result corresponding to the NeuronModel - :return: well known file entries - :rtype: array of dicts - ''' - neuronal_model = self.lims_data['neuronal_model'] - model_template = neuronal_model['neuronal_model_template'] - well_known_files = model_template['well_known_files'] - - mod_file_entries = [] - - for well_known_file in well_known_files: - file_type_id = well_known_file['well_known_file_type_id'] - - if file_type_id == BiophysicalModuleReader.MOD_FILE_TYPE_ID: - mod_file_entries.append(well_known_file) - - return mod_file_entries - - def mod_file_paths(self): - ''' Get the paths to the mod files from the lims result. - :return: paths to mod files - :rtype: array of strings - ''' - file_entries = self.mod_file_entries() - - if not file_entries or len(file_entries) < 1: - self._log.warning('No mod files found.') - - mod_file_paths = [] - - for file_entry in file_entries: - mod_path = os.path.join(file_entry['storage_directory'], - file_entry['filename']) - self._log.info(mod_path) - mod_file_paths.append(mod_path) - - return mod_file_paths - - def update_well_known_file(self, - path, - well_known_file_type_id=None): - if well_known_file_type_id == None: - well_known_file_type_id = \ - lims_utilities.NWB_UNCOMPRESSED_FILE_TYPE_ID - well_known_files = self.lims_data['well_known_files'] - (dirname, filename) = os.path.split(os.path.abspath(path)) - - def get_nwb_file_id(f): - if ('well_known_file_type_id' in f and - f['well_known_file_type_id'] == well_known_file_type_id and - os.path.normpath(f['storage_directory']) == - os.path.normpath(dirname) and - f['filename'] == filename): - return f['id'] - else: - return None - - def not_nwb_file(f): - if ('well_known_file_type_id' in f and - f['well_known_file_type_id'] == well_known_file_type_id): - return False - else: - return True - - try: - existing_file_id = \ - next(wkf_id for wkf_id - in (get_nwb_file_id(f2) - for f2 in well_known_files) - if wkf_id) - - # existing parameter file found - self.lims_update_data['well_known_files'] = \ - [f for f in well_known_files if not_nwb_file(f)] - - self.lims_update_data['well_known_files'] += [{ - 'id': existing_file_id, - 'content_type': None, - 'filename': filename, - 'storage_directory': dirname, - 'well_known_file_type_id': well_known_file_type_id - }] - except StopIteration: - # no matching nwb files found, remove possible unmatching - self.lims_update_data['well_known_files'] = \ - [f for f in well_known_files if not_nwb_file(f)] - - (dirname, filename) = os.path.split(os.path.abspath(path)) - self.lims_update_data['well_known_files'] += [{ - 'content_type': None, - 'filename': filename, - 'storage_directory': dirname, - 'well_known_file_type_id': well_known_file_type_id - }] - - def set_workflow_state(self, state): - self.lims_update_data['workflow_state'] = state - - def write_file(self, path): - with open(path, 'wb') as f: - f.write(json.dumps(self.lims_update_data, indent=2)) - - def to_manifest(self, manifest_path=None): - b = ManifestBuilder() - b.add_path('BASEDIR', os.path.realpath(os.curdir)) - - b.add_path('WORKDIR', - os.path.realpath(os.curdir)) - - b.add_path('MORPHOLOGY', - self.morphology_path(), - typename='file') - b.add_path('CODE_DIR', 'templates') - b.add_path('MODFILE_DIR', 'modfiles') - - for modfile in self.mod_file_entries(): - b.add_path('MOD_FILE_%s' % (os.path.splitext(modfile['filename'])[0]), - os.path.join(modfile['storage_directory'], - modfile['filename']), - typename='file', - format='MODFILE') - - b.add_path('neuronal_model_run_data', - self.lims_path, - typename='file') - - b.add_path('stimulus_path', - self.stimulus_path(), - typename='file', - format='NWB') - - b.add_path('manifest', - os.path.join(os.path.realpath(os.curdir), - manifest_path), - typename='file') - - neuronal_model_run_id = self.lims_data['id'] - - nwb_file_name, extension = \ - os.path.splitext(os.path.basename(self.stimulus_path())) - b.add_path('output_path', - '%d_virtual_experiment%s' % (neuronal_model_run_id, - extension), - typename='file', - parent_key='WORKDIR', - format='NWB') - - b.add_path('fit_parameters', - self.fit_parameters_path()) - - b.add_section('biophys', - {"biophys": [{"model_file": [ manifest_path, - self.fit_parameters_path() ], - "model_type": self.model_type()}]}) - - b.add_section('stimulus_conf', - {"runs": [{"neuronal_model_run_id": - neuronal_model_run_id, - "sweeps": self.sweep_numbers(), - "sweeps_by_type": self.sweep_numbers_by_type() - }]}) - - b.add_section('hoc_conf', - {"neuron" : [{"hoc": ["stdgui.hoc", - "import3d.hoc", - "cell.hoc" ] - }]}) - - m = Manifest(config=b.path_info) - - if manifest_path != None: - b.write_json_file(manifest_path, overwrite=True) - - return m diff --git a/allensdk/internal/api/queries/grid_data_api_prerelease.py b/allensdk/internal/api/queries/grid_data_api_prerelease.py deleted file mode 100644 index 14cacad5f5..0000000000 --- a/allensdk/internal/api/queries/grid_data_api_prerelease.py +++ /dev/null @@ -1,115 +0,0 @@ -import os -import six - -from allensdk.config.manifest import Manifest -from allensdk.api.warehouse_cache.cache import Cache, cacheable -from allensdk.api.queries.grid_data_api import GridDataApi -from allensdk.core import json_utilities - -from ..api_prerelease import ApiPrerelease -from ...core import lims_utilities as lu - - -_STORAGE_DIRECTORY_QUERY = ''' -select iser.id, - iser.storage_directory -from image_series as iser -where iser.storage_directory is not null -''' - - -@cacheable() -def _get_grid_storage_directories(grid_data_directory): - query_result = lu.query(_STORAGE_DIRECTORY_QUERY) - - storage_directories = dict() - for row in query_result: - path = lu.safe_system_path(row[b'storage_directory']) - - # NOTE: hacky, but grid directory contains files without having - # injection_density_*.nrrd, projection_density_*.nrrd, ... - grid_example = os.path.join(path, grid_data_directory, 'data_mask_100.nrrd') - - if os.path.exists(grid_example): - storage_directories[str(row[b'id'])] = path - - return storage_directories - -class GridDataApiPrerelease(GridDataApi): - '''Client for retrieving prereleased mouse connectivity data from lims. - - Parameters - ---------- - base_uri : string, optional - Does not affect pulling from lims. - file_name : string, optional - File name to save/read storage_directories dict. Passed to - GridDataApiPrerelease constructor. - ''' - GRID_DATA_DIRECTORY = 'grid' - - @classmethod - def from_file_name(cls, file_name, cache=True, **kwargs): - '''Alternative constructor using cache path file_name. - - Parameters - ---------- - file_name : string - Path where storage_directories will be saved. - **kwargs - Keyword arguments to be supplied to __init__ - - Returns - ------- - cls : instance of GridDataApiPrerelease - ''' - if os.path.exists(file_name): - storage_directories = json_utilities.read(file_name) - else: - storage_directories = _get_grid_storage_directories(cls.GRID_DATA_DIRECTORY) - - if cache: - Manifest.safe_make_parent_dirs(file_name) - json_utilities.write(file_name, storage_directories) - - return cls(storage_directories, **kwargs) - - def __init__(self, storage_directories, resolution=None, base_uri=None): - super(GridDataApiPrerelease, self).__init__(resolution=resolution, - base_uri=base_uri) - self.storage_directories = storage_directories - self.api = ApiPrerelease() - - def download_projection_grid_data(self, path, experiment_id, file_name): - '''Copy data from path to file_name. - - Parameters - ---------- - path : string - path to file in shared directory (copy source) - experiment_id : int - image series id. - file_name : string - path to file destination (copy target) - ''' - try: - storage_path = self.storage_directories[str(experiment_id)] - except KeyError as e: - error = ''' - experiment %s is not in the storage_directories dictionary - this can be a result of one or more of: - * an invalid experiment id - * a valid experiment id whose grid data has not yet been computed - try either removing the storage_directories_prerelease.json manifest - from you manifest directory, or passing an updated storage_directories - dict to the GridDataApiPrerelase constructor. - ''' % experiment_id - - self._file_download_log.error(error) - self.cleanup_truncated_file(path) - raise six.raise_from(ValueError(error), e) - - storage_path = os.path.join( - storage_path, self.GRID_DATA_DIRECTORY, file_name) - - self.api.retrieve_file_from_storage(storage_path, path) diff --git a/allensdk/internal/api/queries/mouse_connectivity_api_prerelease.py b/allensdk/internal/api/queries/mouse_connectivity_api_prerelease.py deleted file mode 100644 index 86e18be2dc..0000000000 --- a/allensdk/internal/api/queries/mouse_connectivity_api_prerelease.py +++ /dev/null @@ -1,186 +0,0 @@ -from allensdk.api.warehouse_cache.cache import Cache, cacheable -from allensdk.api.queries.grid_data_api import GridDataApi -from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi - -from .grid_data_api_prerelease import GridDataApiPrerelease -from ...core import lims_utilities as lu - - -_STRUCTURE_TREE_ROOT_ID = 997 -_STRUCTURE_TREE_ROOT_NAME = "root" -_STRUCTURE_TREE_ROOT_ACRONYM = "root" - -_EXPERIMENT_QUERY = ''' -with specimens_concat_workflows as ( - select sp.id, - string_agg(w.name, '|') as workflows - from specimens as sp - join specimens_workflows as spw on spw.specimen_id = sp.id - join workflows as w on w.id = spw.workflow_id - group by sp.id - ), - injections_concat_structures as ( - select inj.id as injection_id, - string_agg(st.name,'|' order by st.graph_order) - as injection_structures_name, - string_agg(st.acronym,'|' order by st.graph_order) - as injection_structures_acronym, - string_agg(cast(st.id as varchar),'|' order by st.graph_order) - as injection_structures_id - from injections as inj - join injections_structures as ist on ist.injection_id = inj.id - join flat_structures_v st on st.id = ist.structure_id - group by inj.id - ) -select distinct - iser.id, - iser.workflow_state, - sp.name as specimen_name, - gdr.name as gender, - a.name as age, - p.name as project_code, - spcw.workflows, - g.name as transgenic_line, --some image series have 2 lines - pst.id as structure_id, - pst.name as structure_name, - pst.acronym as structure_acronym, - ics.injection_structures_name, - ics.injection_structures_acronym, - ics.injection_structures_id -from image_series as iser -join projects as p on p.id = iser.project_id -join specimens as sp on sp.id = iser.specimen_id -join donors as d on d.id = sp.donor_id -join injections inj on inj.specimen_id = sp.id -left join flat_structures_v pst on pst.id = inj.primary_injection_structure_id -left join ages as a on a.id = d.age_id -left join genders as gdr on gdr.id = d.gender_id -left join donors_genotypes as dg on dg.donor_id = sp.donor_id -left join genotypes as g on dg.genotype_id = g.id --- concat joins -- -left join specimens_concat_workflows as spcw on spcw.id = iser.specimen_id -left join injections_concat_structures as ics on ics.injection_id = inj.id --- only image series we can pull and ensure mice (should all be mice already) -- -where iser.storage_directory is not null and d.organism_id = 2 -''' - -def _experiment_dict(row): - # use empty strings instead of null - null_fill = lambda s: s if s is not None else "" - - exp = dict() - - exp['id'] = row[b'id'] - - exp['age'] = null_fill(row[b'age']) - exp['gender'] = null_fill(row[b'gender']) - exp['project_code'] = null_fill(row[b'project_code']) - exp['specimen_name'] = null_fill(row[b'specimen_name']) - exp['transgenic_line'] = null_fill(row[b'transgenic_line']) - exp['workflow_state'] = null_fill(row[b'workflow_state']) - - # list : [''] or ['workflow1', 'workflow2', ... ] - exp['workflows'] = null_fill(row[b'workflows']) - exp['workflows'] = exp['workflows'].split('|') - - if row[b'structure_id'] is not None: - exp['structure_id'] = row[b'structure_id'] - exp['structure_name'] = row[b'structure_name'] - exp['structure_abbrev'] = row[b'structure_acronym'] - else: - # use root structure for compatibility with structure tree - exp['structure_id'] = _STRUCTURE_TREE_ROOT_ID - exp['structure_name'] = _STRUCTURE_TREE_ROOT_NAME - exp['structure_abbrev'] = _STRUCTURE_TREE_ROOT_ACRONYM - - if row[b'injection_structures_id'] is not None: - ids = row[b'injection_structures_id'].split('|') - names = row[b'injection_structures_name'].split('|') - acronyms = row[b'injection_structures_acronym'].split('|') - else: - # have at least prim. inj. struct. in structures - ids = (exp['structure_id'], ) - names = (exp['structure_name'], ) - acronyms = (exp['structure_abbrev'], ) - - keys = 'id', 'name', 'abbreviation' - values = zip(ids, names, acronyms) - - structures = map(lambda s: dict(zip(keys, s)), values) - exp['injection_structures'] = list(structures) - - return exp - - -class MouseConnectivityApiPrerelease(MouseConnectivityApi): - '''Client for retrieving prereleased mouse connectivity data from lims. - - Parameters - ---------- - base_uri : string, optional - Does not affect pulling from lims. - file_name : string, optional - File name to save/read storage_directories dict. Passed to - GridDataApiPrerelease constructor. - ''' - - def __init__(self, - storage_directories_file_name, - cache_storage_directories=True, - base_uri=None): - super(MouseConnectivityApiPrerelease, self).__init__(base_uri=base_uri) - self.grid_data_api = GridDataApiPrerelease.from_file_name( - storage_directories_file_name, cache=cache_storage_directories) - - @cacheable() - def get_experiments(self): - query_result = lu.query(_EXPERIMENT_QUERY) - - experiments = [] - for row in query_result: - if str(row[b'id']) in self.grid_data_api.storage_directories: - - exp_dict = _experiment_dict(row) - experiments.append(exp_dict) - - return experiments - - #@cacheable() - def get_structure_unionizes(self): - raise NotImplementedError() - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_injection_density(self, path, experiment_id, resolution): - file_name = "%s_%s.nrrd" % (GridDataApi.INJECTION_DENSITY, resolution) - - self.grid_data_api.download_projection_grid_data( - path, experiment_id, file_name) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_projection_density(self, path, experiment_id, resolution): - file_name = "%s_%s.nrrd" % (GridDataApi.PROJECTION_DENSITY, resolution) - - self.grid_data_api.download_projection_grid_data( - path, experiment_id, file_name) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_injection_fraction(self, path, experiment_id, resolution): - file_name = "%s_%s.nrrd" % (GridDataApi.INJECTION_FRACTION, resolution) - - self.grid_data_api.download_projection_grid_data( - path, experiment_id, file_name) - - @cacheable(strategy='create', - pathfinder=Cache.pathfinder(file_name_position=1, - path_keyword='path')) - def download_data_mask(self, path, experiment_id, resolution): - file_name = "%s_%s.nrrd" % (GridDataApi.DATA_MASK, resolution) - - self.grid_data_api.download_projection_grid_data( - path, experiment_id, file_name) diff --git a/allensdk/internal/api/queries/optimize_config_reader.py b/allensdk/internal/api/queries/optimize_config_reader.py deleted file mode 100644 index 359f7ceab3..0000000000 --- a/allensdk/internal/api/queries/optimize_config_reader.py +++ /dev/null @@ -1,409 +0,0 @@ -# Copyright 2016 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - - -import os -import logging -import allensdk.internal.core.lims_utilities as lims_utilities -from allensdk.config.manifest_builder import ManifestBuilder -from allensdk.config.manifest import Manifest -import json -import traceback - - -class OptimizeConfigReader(object): - _log = logging.getLogger('allensdk.internal.api.queries.lims.optimize_config_reader') - - STIMULUS_CONTENT_TYPE = None - MORPHOLOGY_TYPE_ID = 303941301 - MOD_FILE_TYPE_ID = 292178729 - NEURONAL_MODEL_PARAMETERS = 329230374 # fit.json file. - - def __init__(self): - self.lims_path = None - self.lims_data = None - self.lims_update_data = None - - def read_lims_message(self, message, lims_path): - self.lims_path = lims_path - self.lims_data = message[0] - self.lims_update_data = dict(self.lims_data) - - def read_lims_file(self, lims_path): - self.lims_path = lims_path - self.read_json(lims_path) - self.lims_update_data = dict(self.lims_data) - - def read_json(self, path): - self.lims_path = os.path.realpath(path) - - with open(self.lims_path) as f: - json_string = f.read() - self.read_json_string(json_string) - - return self.lims_data - - def read_json_string(self, json_string): - self.lims_data = json.loads(json_string) - self.lims_update_data = dict(self.lims_data) - - def write_file(self, path): - with open(path, 'wb') as f: - f.write(json.dumps(self.lims_update_data, indent=2)) - - def stimulus_file_entries(self): - ''' read the well known file path from the lims result - corresponding to the stimulus file - :return: well_known_file entries - :rtype: array of dicts - ''' - neuronal_model = self.lims_data - specimen = neuronal_model['specimen'] - roi_result = specimen['ephys_roi_result'] - well_known_files = roi_result['well_known_files'] - - stimulus_file_entries = [] - - for well_known_file in well_known_files: - try: - file_type_id = well_known_file['well_known_file_type_id'] - - if file_type_id == lims_utilities.NWB_FILE_TYPE_ID: - stimulus_file_entries.append(well_known_file) - except: - OptimizeConfigReader._log.warn('skipping well known file record with no well known file type.') - - return stimulus_file_entries - - def lims_working_directory(self): - ''' While this is the same directory as the optimize - directory, it can be mocked out for testing if the - optimize directory is write only. - ''' - return self.neuronal_model_optimize_dir() - - def output_directory(self): - return os.path.join(self.lims_working_directory(), 'work') - - def stimulus_path(self): - ''' Get the path to the stimulus file from the lims result. - :return: path to stimulus file - :rtype: string - ''' - file_entries = self.stimulus_file_entries() - - if len(file_entries) > 1: - OptimizeConfigReader._log.warning('More than one stimulus file found.') - - file_entry = file_entries[0] - - stimulus_path = os.path.join(file_entry['storage_directory'], - file_entry['filename']) - - return stimulus_path - - def neuronal_model_optimize_dir(self): - ''' read the directory path where - output goes from the lims optimization config json - - Parameters - ---------- - - Returns - ------- - string: - directory path - ''' - return self.lims_data['storage_directory'] - - def morphology_file_entries(self): - ''' read the well known file paths - from the lims result corresponding to the morphology - - Returns - ------- - arrary of dicts: - well known file entries - ''' - neuronal_model = self.lims_data - specimen = neuronal_model['specimen'] - reconstructions = specimen['neuron_reconstructions'] - - morphology_file_entries = [] - - for reconstruction in reconstructions: - superseded = reconstruction['superseded'] - manual = reconstruction['manual'] - - if manual == True and superseded == False: - well_known_files = reconstruction['well_known_files'] - - for well_known_file in well_known_files: - file_type_id = well_known_file['well_known_file_type_id'] - - if file_type_id == OptimizeConfigReader.MORPHOLOGY_TYPE_ID: - morphology_file_entries.append(well_known_file) - - return morphology_file_entries - - def morphology_path(self): - ''' Get the path to the morphology file from the lims result. - :return: path to morphology file - :rtype: string - ''' - file_entries = self.morphology_file_entries() - - if len(file_entries) > 1: - OptimizeConfigReader._log.warning('More than one morphology file found.') - - file_entry = file_entries[0] - - morphology_path = os.path.join(file_entry['storage_directory'], - file_entry['filename']) - - return morphology_path - - def sweep_entries(self): - ''' read the sweep entries - from the lims result corresponding to the stimulus - :return: stimulus sweep entries - :rtype: array of dicts - ''' - neuronal_model = self.lims_data - specimen = neuronal_model['specimen'] - sweeps = specimen['ephys_sweeps'] - - return sweeps - - def sweep_numbers(self): - ''' Get the stimulus sweep numbers from the lims result - :return: list of sweep numbers - :rtype: array of ints - ''' - sweep_entries = self.sweep_entries() - - if not sweep_entries or len(sweep_entries) < 1: - OptimizeConfigReader._log.warning('No sweeps found.') - - sweeps = [sweep_entry['sweep_number'] \ - for sweep_entry in sweep_entries \ - if sweep_entry['workflow_state'] == 'auto_passed' or \ - sweep_entry['workflow_state'] == 'manual_passed' ] - - return list(set(sweeps)) - - def mod_file_entries(self): - ''' read the NERUON .mod file entries - from the lims result corresponding to the NeuronModel - :return: well known file entries - :rtype: array of dicts - ''' - neuronal_model = self.lims_data - model_template = neuronal_model['neuronal_model_template'] - well_known_files = model_template['well_known_files'] - - mod_file_entries = [] - - for well_known_file in well_known_files: - file_type_id = well_known_file['well_known_file_type_id'] - - if file_type_id == OptimizeConfigReader.MOD_FILE_TYPE_ID: - mod_file_entries.append(well_known_file) - - return mod_file_entries - - def mod_file_paths(self): - ''' Get the paths to the mod files from the lims result. - :return: paths to mod files - :rtype: array of strings - ''' - file_entries = self.mod_file_entries() - - if not file_entries or len(file_entries) < 1: - OptimizeConfigReader._log.warning('No mod files found.') - - mod_file_paths = [] - - for file_entry in file_entries: - mod_path = os.path.join(file_entry['storage_directory'], - file_entry['filename']) - OptimizeConfigReader._log.info(mod_path) - mod_file_paths.append(mod_path) - - return mod_file_paths - - def update_well_known_file(self, - path, - well_known_file_type_id=None): - if well_known_file_type_id == None: - well_known_file_type_id = lims_utilities.MODEL_PARAMETERS_FILE_TYPE_ID - well_known_files = self.lims_data['well_known_files'] - - def get_model_parameter_file_id(f): - if ('well_known_file_type_id' in f and - f['well_known_file_type_id'] == well_known_file_type_id): - return f['id'] - else: - return None - - def not_fit_param(f): - if ('well_known_file_type_id' in f and - f['well_known_file_type_id'] == well_known_file_type_id): - return False - else: - return True - - try: - existing_file_id = \ - next(wkf_id for wkf_id in - (get_model_parameter_file_id(f2) - for f2 in well_known_files) if wkf_id) - - # existing parameter file found - self.lims_update_data['well_known_files'] = [f for f in well_known_files if not_fit_param(f)] - - (dirname, filename) = os.path.split(os.path.abspath(path)) - self.lims_update_data['well_known_files'] += [{ - 'id': existing_file_id, - 'filename': filename, - 'storage_directory': dirname, - 'well_known_file_type_id': well_known_file_type_id - }] - except StopIteration: - # no parameter files found - (dirname, filename) = os.path.split(os.path.abspath(path)) - self.lims_update_data['well_known_files'] += [{ - 'content_type': 'application/json', - 'filename': filename, - 'storage_directory': dirname, - 'well_known_file_type_id': well_known_file_type_id - }] - - def build_manifest(self, manifest_path=None): - b = ManifestBuilder() - - b.add_path('BASEDIR', os.path.realpath(os.curdir)) - - b.add_path('WORKDIR', - self.output_directory()) - - b.add_path('MORPHOLOGY', - self.morphology_path(), - typename='file') - - b.add_path('MODFILE_DIR', 'modfiles') - - for modfile in self.mod_file_entries(): - b.add_path('MOD_FILE_%s' % (os.path.splitext(modfile['filename'])[0]), - os.path.join(modfile['storage_directory'], - modfile['filename']), - typename='file', - format='MODFILE') - - b.add_path('stimulus_path', - self.stimulus_path(), - typename='file', - format='NWB') - - b.add_path('manifest', - os.path.join(os.path.realpath(os.curdir), - manifest_path), - typename='file') - - b.add_path('output', - os.path.basename(self.stimulus_path()), - typename='file', - parent_key='WORKDIR', - format='NWB') - - b.add_path('neuronal_model_data', - self.lims_path, - typename='file') - - b.add_path('upfile', - 'upbase.dat', - typename='file', - parent_key='WORKDIR') - b.add_path('downfile', - 'downbase.dat', - typename='file', - parent_key='WORKDIR') - b.add_path('passive_fit_data', - 'passive_fit_data.json', - typename='file', - parent_key='WORKDIR') - b.add_path('stage_1_jobs', - 'stage_1_jobs.json', - typename='file', - parent_key='WORKDIR') - b.add_path('fit_1_file', - 'fit_1_data.json', - typename='file', - parent_key='WORKDIR') - b.add_path('fit_2_file', - 'fit_2_data.json', - typename='file', - parent_key='WORKDIR') - b.add_path('fit_3_file', - 'fit_3_data.json', - typename='file', - parent_key='WORKDIR') - b.add_path('fit_type_path', - typename='file', - spec='%s', - parent_key='WORKDIR') - b.add_path('target_path', - typename='file', - spec='target.json', - parent_key='WORKDIR') - b.add_path('fit_config_json', - typename='file', - spec='%s/config.json', - parent_key='WORKDIR') - b.add_path('final_hof_fit', - typename='file', - spec='%s/s%d/final_hof_fit.txt', - parent_key='WORKDIR') - b.add_path('final_hof', - typename='file', - spec='%s/s%d/final_hof.txt', - parent_key='WORKDIR') - b.add_path('output_fit_file', - typename='file', - spec='fit_%s_%s.json') - - b.add_section('biophys', {"biophys": [ - {"model_file": [ manifest_path ] }]}) - - b.add_section('stimulus_conf', - {"runs": [{"sweeps": self.sweep_numbers(), - "specimen_id": self.lims_data['specimen_id'] - }]}) - - b.add_section('hoc_conf', - {"neuron" : [{"hoc": [ "stdgui.hoc", "import3d.hoc", "cell.hoc" ] - }]}) - - return b - - def to_manifest(self, manifest_path=None): - b = self.build_manifest(manifest_path) - - m = Manifest(config=b.path_info) - - if manifest_path != None: - b.write_json_file(manifest_path, overwrite=True) - - return m diff --git a/allensdk/internal/api/queries/pre_release.py b/allensdk/internal/api/queries/pre_release.py deleted file mode 100644 index 07d3fe13e3..0000000000 --- a/allensdk/internal/api/queries/pre_release.py +++ /dev/null @@ -1,170 +0,0 @@ -from allensdk.api.queries.brain_observatory_api import BrainObservatoryApi -from allensdk.api.warehouse_cache.cache import cacheable -from allensdk.core.brain_observatory_cache import BrainObservatoryCache -import allensdk.internal.core.lims_utilities as lu -import os -import collections -import pandas as pd -import sys - -sql_query_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pre_release_sql') - -with open(os.path.join(sql_query_dir, 'experiment_pre_release_query.sql'), 'r') as f: - experiment_pre_release_query = f.read() - -with open(os.path.join(sql_query_dir, 'container_pre_release_query.sql'), 'r') as f: - container_pre_release_query = f.read() - -with open(os.path.join(sql_query_dir, 'cell_specimens_pre_release_query.sql'), 'r') as f: - cell_specimens_pre_release_query = f.read() - -class BrainObservatoryApiPreRelease(BrainObservatoryApi): - - @cacheable() - def get_experiment_containers(self): - - query_result = lu.query(container_pre_release_query) - container_list = [] - for q in query_result: - - # # For development: print key/val pairs generated from LIMS query: - # for key, val in sorted(q.items(), key=lambda x: x[0]): - # print(key, val) - # raise - - c = collections.defaultdict(collections.defaultdict) - - c['id'] = q['ec_id'] - c['targeted_structure']['acronym'] = q['acronym'] - c['specimen']['donor'] = collections.defaultdict(collections.defaultdict) - c['specimen']['donor']['external_donor_name'] = q['external_donor_name'] - c['specimen']['donor']['transgenic_lines'] = [collections.defaultdict(collections.defaultdict), collections.defaultdict(collections.defaultdict)] - c['specimen']['donor']['transgenic_lines'][0]['transgenic_line_type_name'] = 'driver' - c['specimen']['donor']['transgenic_lines'][0]['name'] = q['driver'] - c['specimen']['donor']['transgenic_lines'][1]['transgenic_line_type_name'] = 'reporter' - c['specimen']['donor']['transgenic_lines'][1]['name'] = q['reporter'] - c['specimen']['name'] = q['specimen'] - c['imaging_depth'] = q['depth'] - c['failed'] = q['oa_state'] == 'failed' - - - if q['donor_tags'] == u'Epileptiform Events': - c['specimen']['donor']['conditions'] = [collections.defaultdict(collections.defaultdict)] - c['specimen']['donor']['conditions'][0]['name'] = u'Epileptiform Events' - elif q['donor_tags'] == u'': - pass - else: - raise - - container_list.append(c) - return container_list - - - @cacheable() - def get_ophys_experiments(self): - - query_result = lu.query(experiment_pre_release_query) - experiment_list = [] - for q in query_result: - c = collections.defaultdict(collections.defaultdict) - - # # For development: print key/val pairs generated from LIMS query: - # for key, val in sorted(q.items(), key=lambda x: x[0]): - # print(key, val) - # raise - - c['id'] = q['o_id'] - c['imaging_depth'] = q['depth'] - c['targeted_structure']['acronym'] = q['acronym'] - c['specimen']['donor'] = collections.defaultdict(collections.defaultdict) - c['specimen']['donor']['external_donor_name'] = q['acronym'] - c['specimen']['donor']['transgenic_lines'] = [collections.defaultdict(collections.defaultdict), collections.defaultdict(collections.defaultdict)] - c['specimen']['donor']['transgenic_lines'][0]['transgenic_line_type_name'] = 'driver' - c['specimen']['donor']['transgenic_lines'][0]['name'] = q['driver'] - c['specimen']['donor']['transgenic_lines'][1]['transgenic_line_type_name'] = 'reporter' - c['specimen']['donor']['transgenic_lines'][1]['name'] = q['reporter'] - c['date_of_acquisition'] = q['date_of_acquisition'] - c['specimen']['donor']['date_of_birth'] = q['date_of_birth'] - c['experiment_container_id'] = q['ec_id'] - c['stimulus_name'] = q['stimulus_name'] - c['specimen']['donor']['external_donor_name'] = q['external_donor_name'] - c['specimen']['name'] = q['specimen'] - c['fail_eye_tracking'] = q['fail_eye_tracking'] - - experiment_list.append(c) - return experiment_list - - @cacheable() - def get_cell_metrics(self): - query_result = lu.query(cell_specimens_pre_release_query) - - mappings = self.get_stimulus_mappings() - thumbnails = [m['item'] for m in mappings if m['item_type'] == 'T' and m['level'] == 'R'] - - cell_list = [] - for q in query_result: - c = collections.defaultdict(collections.defaultdict) - - c['all_stim'] = q['a_valid'] and q['b_valid'] and q['c_valid'] - for key in ['cell_specimen_id', 'area', 'donor_full_genotype', 'experiment_container_id', 'imaging_depth', 'specimen_id', 'tld1_id', - 'tld1_name', 'tld2_id', 'tld2_name', 'tlr1_id', 'tlr1_name']: - c[key] = q[key] - - if q['failed_experiment_container'] == 't': - c['failed_experiment_container'] = True - elif q['failed_experiment_container'] == 'f': - c['failed_experiment_container'] = False - else: - raise RuntimeError('Unexpected value: {} not in ("t", "f")'.format(q['failed_experiment_container'])) - - - # Session A metrics: - for key in ['dsi_dg', 'g_dsi_dg', 'g_osi_dg', 'osi_dg', 'p_dg', 'p_run_mod_dg', 'peak_dff_dg', 'pref_dir_dg', 'pref_tf_dg', 'reliability_dg', - 'reliability_nm3', 'run_mod_dg', 'tfdi_dg', 'tfdi_dg']: - if q['crara_data'] is None: - c[key] = None - else: - c[key] = q['crara_data']['roi_cell_metrics'].get(key,None) - - # Session B metrics: - for key in ['g_osi_sg', 'image_sel_ns', 'osi_sg', 'p_ns', 'p_run_mod_ns', 'p_run_mod_sg', 'p_sg', 'peak_dff_ns', 'peak_dff_sg', 'pref_image_ns', - 'pref_ori_sg', 'pref_phase_sg', 'pref_sf_sg', 'pref_image_ns', 'pref_ori_sg', 'reliability_ns', 'reliability_sg', - 'run_mod_ns','run_mod_sg','sfdi_sg', 'time_to_peak_ns', 'time_to_peak_sg']: - - if q['crarb_data'] is None: - c[key] = None - else: - c[key] = q['crarb_data']['roi_cell_metrics'].get(key,None) - - # Session C metrics: - for key in ['reliability_nm2', 'rf_area_off_lsn', 'rf_area_on_lsn', 'rf_center_off_x_lsn', 'rf_center_off_y_lsn', - 'rf_center_on_x_lsn', 'rf_center_on_y_lsn', 'rf_chi2_lsn', 'rf_distance_lsn', 'rf_overlap_index_lsn', - ]: - if q['crarc_data'] is None: - c[key] = None - else: - c[key] = q['crarc_data']['roi_cell_metrics'].get(key,None) - - for suffix in ['a', 'b', 'c']: - if not q['crar%s_data' % suffix] is None: - c['reliability_nm1_%s' % suffix] = q['crar%s_data' % suffix]['roi_cell_metrics'].get('reliability_nm1',None) - else: - c['reliability_nm1_%s' % suffix] = None - - # Fake in thumbnail images: - for t in thumbnails: - c[t] = None - - # # For development: print key/val pairs generated from LIMS query: - # for key, val in sorted(q.items(), key=lambda x: x[0]): - # if key == 'crarb_data': - # print('crarb_data[roi_cell_metrics]') - # for key2, val2 in sorted(val['roi_cell_metrics'].items(), key=lambda x: x[0]): - # print(' ', key2, val2) - # else: - # print(key, val) - # raise - - cell_list.append(c) - - return cell_list diff --git a/allensdk/internal/api/queries/pre_release_sql/cell_specimens_pre_release_query.sql b/allensdk/internal/api/queries/pre_release_sql/cell_specimens_pre_release_query.sql deleted file mode 100644 index 763e7a395a..0000000000 --- a/allensdk/internal/api/queries/pre_release_sql/cell_specimens_pre_release_query.sql +++ /dev/null @@ -1,48 +0,0 @@ -WITH exa AS ( - SELECT cr.id AS cell_roi_id, cr.cell_specimen_id, cr.ophys_experiment_id, o.experiment_container_id, cr.valid_roi, crar.archived, crar.data - FROM ophys_cell_segmentation_runs ocsr JOIN cell_rois cr ON cr.ophys_cell_segmentation_run_id=ocsr.id LEFT JOIN CELL_ROI_analysis_runs crar ON crar.cell_roi_id = cr.id - JOIN ophys_experiments o ON o.id=cr.ophys_experiment_id AND o.workflow_state = 'passed' - JOIN ophys_sessions os ON os.id=o.ophys_session_id - WHERE os.stimulus_name = 'three_session_A' AND (crar.archived IS NULL OR crar.archived = 'f') AND ocsr.current = 't' - ), - exb AS ( - SELECT cr.id AS cell_roi_id, cr.cell_specimen_id, cr.ophys_experiment_id, o.experiment_container_id, cr.valid_roi, crar.archived, crar.data - FROM ophys_cell_segmentation_runs ocsr JOIN cell_rois cr ON cr.ophys_cell_segmentation_run_id=ocsr.id LEFT JOIN CELL_ROI_analysis_runs crar ON crar.cell_roi_id = cr.id - JOIN ophys_experiments o ON o.id=cr.ophys_experiment_id AND o.workflow_state = 'passed' - JOIN ophys_sessions os ON os.id=o.ophys_session_id - WHERE os.stimulus_name = 'three_session_B' AND (crar.archived IS NULL OR crar.archived = 'f') AND ocsr.current = 't' - ), - exc AS ( - SELECT cr.id AS cell_roi_id, cr.cell_specimen_id, cr.ophys_experiment_id, o.experiment_container_id, cr.valid_roi, crar.archived, crar.data - FROM ophys_cell_segmentation_runs ocsr JOIN cell_rois cr ON cr.ophys_cell_segmentation_run_id=ocsr.id LEFT JOIN CELL_ROI_analysis_runs crar ON crar.cell_roi_id = cr.id - JOIN ophys_experiments o ON o.id=cr.ophys_experiment_id AND o.workflow_state = 'passed' - JOIN ophys_sessions os ON os.id=o.ophys_session_id - WHERE os.stimulus_name IN ('three_session_C','three_session_C2') AND (crar.archived IS NULL OR crar.archived = 'f') AND ocsr.current = 't' - ) -SELECT distinct sp.parent_id AS specimen_id, sp.id AS cell_specimen_id, exa.cell_roi_id, exb.cell_roi_id, exc.cell_roi_id, ec.id AS experiment_container_id -,exa.valid_roi AS a_valid,exb.valid_roi AS b_valid,exc.valid_roi AS c_valid -,exa.archived AS crara_archived, exa.data AS crara_data, exa.data->'roi_cell_metrics'->'p_dg' AS p_dg, exa.data->'roi_cell_metrics'->'reliability_nm1' AS reliability_nm1_a -,exb.archived AS crarb_archived, exb.data AS crarb_data, exb.data->'roi_cell_metrics'->'p_ns' AS p_ns, exb.data->'roi_cell_metrics'->'reliability_nm1' AS reliability_nm1_b -,exc.archived AS crarc_archived, exc.data AS crarc_data, exc.data->'roi_cell_metrics'->'rf_chi2_lsn' AS rf_chi2_lsn, exc.data->'roi_cell_metrics'->'reliability_nm1' AS reliability_nm1_c ---cr.id AS cell_roi_id, cr.ophys_experiment_id, cr.valid_roi AS cell_roi_valid ,'all_stim placeholder' AS all_stim -,st.acronym AS area ,sp.id AS cell_specimen_id ,d.full_genotype AS donor_full_genotype , -ec.id AS experiment_container_id ,CASE WHEN ec.workflow_state IN ('failed') THEN 't' ELSE 'f' END AS failed_experiment_container ,imaging_depths.depth AS imaging_depth ,sp.id AS specimen_id , -tld1.id AS tld1_id ,tld1.name AS tld1_name ,tld2.id AS tld2_id ,tld2.name AS tld2_name ,tlr1.id AS tlr1_id ,tlr1.name AS tlr1_name - -FROM specimens sp -JOIN exa ON exa.cell_specimen_id=sp.id -JOIN exb ON exb.cell_specimen_id=sp.id -JOIN exc ON exc.cell_specimen_id=sp.id -JOIN experiment_containers ec ON ec.id=exa.experiment_container_id AND ec.id=exb.experiment_container_id AND ec.id=exc.experiment_container_id - -JOIN donors d ON d.id=sp.donor_id -JOIN ophys_experiments o ON o.id=exa.ophys_experiment_id -JOIN ophys_sessions os ON os.id=o.ophys_session_id JOIN imaging_depths ON imaging_depths.id=o.imaging_depth_id -JOIN projects p ON p.id=os.project_id -JOIN structures st ON st.id=os.targeted_structure_id -JOIN donors_genotypes dgd ON dgd.donor_id=d.id JOIN genotypes tld1 ON tld1.id = dgd.genotype_id AND tld1.genotype_type_id = 177835595 AND tld1.name != 'Camk2a-tTA' --driver1 -JOIN donors_genotypes dgc ON dgc.donor_id=d.id JOIN genotypes tld2 ON tld2.id = dgc.genotype_id AND tld2.genotype_type_id = 177835595 AND tld2.name = 'Camk2a-tTA' --driver2 -JOIN donors_genotypes dgr ON dgr.donor_id=d.id JOIN genotypes tlr1 ON tlr1.id = dgr.genotype_id AND tlr1.genotype_type_id = 177835597 --reporter - -WHERE p.code = 'C600' AND ec.workflow_state NOT IN ('failed') -ORDER BY 1,6,2; diff --git a/allensdk/internal/api/queries/pre_release_sql/container_pre_release_query.sql b/allensdk/internal/api/queries/pre_release_sql/container_pre_release_query.sql deleted file mode 100644 index 29e951045a..0000000000 --- a/allensdk/internal/api/queries/pre_release_sql/container_pre_release_query.sql +++ /dev/null @@ -1,67 +0,0 @@ ---container processing query for prereleased data to support platform paper - -SELECT DISTINCT ec.published_at, ec.id AS ec_id, ec.workflow_state, st.acronym, i.depth, g.name as driver, gr.name AS reporter, sp.name AS specimen -,oa.id AS oa_id,ob.id AS ob_id,oc.id AS oc_id -,oa.workflow_state AS oa_state,ob.workflow_state AS ob_state,oc.workflow_state AS oc_state -,wkfa.storage_directory || wkfa.filename AS a_nwb -,wkfb.storage_directory || wkfb.filename AS b_nwb -,wkfc.storage_directory || wkfc.filename AS c_nwb -,awkfa.storage_directory || awkfa.filename AS a_analysis -,awkfb.storage_directory || awkfb.filename AS b_analysis -,awkfc.storage_directory || awkfc.filename AS c_analysis -,d.full_genotype -,array_to_string(array( ---SELECT DISTINCT w.name FROM specimens_workflows sw JOIN workflows w ON w.id=sw.workflow_id WHERE sw.specimen_id=sp.id -SELECT DISTINCT mc.name FROM donor_medical_conditions dmc JOIN medical_conditions mc ON mc.id=dmc.medical_condition_id AND mc.name NOT LIKE '%tissuecyte%' WHERE dmc.donor_id=d.id -ORDER BY mc.name - ), ',' --concatenate any donor tags (e.g. "Epileptiform Events" and "Non Cre-specific Phenotype") - ) donor_tags -,d.external_donor_name -FROM experiment_containers ec -JOIN ophys_experiments oa ON oa.experiment_container_id=ec.id AND oa.workflow_state = 'passed' JOIN ophys_sessions osa ON osa.id=oa.ophys_session_id AND osa.stimulus_name = 'three_session_A' -JOIN ophys_experiments ob ON ob.experiment_container_id=ec.id AND ob.workflow_state = 'passed' JOIN ophys_sessions osb ON osb.id=ob.ophys_session_id AND osb.stimulus_name = 'three_session_B' -JOIN ophys_experiments oc ON oc.experiment_container_id=ec.id AND oc.workflow_state = 'passed' JOIN ophys_sessions osc ON osc.id=oc.ophys_session_id AND osc.stimulus_name IN ('three_session_C','three_session_C2') - -/* --Use this instead if you ever want to look into experiments that may not be passed yet (i.e. what is still coming round the mountain) -JOIN ophys_experiments oa ON oa.experiment_container_id=ec.id AND oa.workflow_state IN ('created','processing','qc','passed') JOIN ophys_sessions osa ON osa.id=oa.ophys_session_id AND osa.stimulus_name = 'three_session_A' -JOIN ophys_experiments ob ON ob.experiment_container_id=ec.id AND ob.workflow_state IN ('created','processing','qc','passed') JOIN ophys_sessions osb ON osb.id=ob.ophys_session_id AND osb.stimulus_name = 'three_session_B' -JOIN ophys_experiments oc ON oc.experiment_container_id=ec.id AND oc.workflow_state IN ('created','processing','qc','passed') JOIN ophys_sessions osc ON osc.id=oc.ophys_session_id AND osc.stimulus_name IN ('three_session_C','three_session_C2') -*/ - ---514173041 OphysExperimentCellRoiMetricsFile -LEFT JOIN well_known_files awkfa ON awkfa.attachable_id=oa.id AND awkfa.well_known_file_type_id = 514173041 -LEFT JOIN well_known_files awkfb ON awkfb.attachable_id=ob.id AND awkfb.well_known_file_type_id = 514173041 -LEFT JOIN well_known_files awkfc ON awkfc.attachable_id=oc.id AND awkfc.well_known_file_type_id = 514173041 ---514173063 NWBOphys -JOIN well_known_files wkfa ON wkfa.attachable_id=oa.id AND wkfa.well_known_file_type_id = 514173063 -JOIN well_known_files wkfb ON wkfb.attachable_id=ob.id AND wkfb.well_known_file_type_id = 514173063 -JOIN well_known_files wkfc ON wkfc.attachable_id=oc.id AND wkfc.well_known_file_type_id = 514173063 -JOIN specimens sp ON sp.id=osa.specimen_id JOIN structures st ON st.id=osa.targeted_structure_id JOIN imaging_depths i ON i.id=osa.imaging_depth_id -JOIN donors d ON d.id=sp.donor_id -JOIN donors_genotypes dg ON dg.donor_id=d.id JOIN genotypes g ON g.id = dg.genotype_id AND g.genotype_type_id = 177835595 AND g.name != 'Camk2a-tTA' --driver -JOIN donors_genotypes dgr ON dgr.donor_id=d.id JOIN genotypes gr ON gr.id=dgr.genotype_id AND gr.genotype_type_id = 177835597 --reporter - ---LEFT JOIN donor_medical_conditions dmc ON dmc.donor_id=d.id LEFT JOIN medical_conditions mc ON mc.id=dmc.medical_condition_id AND mc.name NOT LIKE '%tissuecyte%' -JOIN projects p ON p.id=osa.project_id -WHERE p.code = 'C600' ---o.workflow_state IN ('passed','eyetrack_qc','eyetrack_processing','qc','processing') AND ec.workflow_state NOT IN ('failed','holding') ---AND ec.published_at IS NOT NULL -AND ec.workflow_state NOT IN ('failed') --that leaves in order of least complete to most complete: holding, reviewing, postprocessing, container_qc, published -ORDER BY -21, -6,5,4,7,2,8 - - - -/* potential ophys_experiment states: -aborted,failed,invalid_data -created,processing,qc,passed -*/ - ---June 2017 notes ---Cux2-CreERT2 175,275 ---Scnn1a-Tg3-Cre 275,335,350 ---Rbp4-Cre_KL100 350,375,385,435 ---Rorb-IRES2-Cre 275, ---Nr5a1-Cre 300,325,335,350 ---Emx1-IRES-Cre 175 \ No newline at end of file diff --git a/allensdk/internal/api/queries/pre_release_sql/experiment_pre_release_query.sql b/allensdk/internal/api/queries/pre_release_sql/experiment_pre_release_query.sql deleted file mode 100644 index cdca6ea8e0..0000000000 --- a/allensdk/internal/api/queries/pre_release_sql/experiment_pre_release_query.sql +++ /dev/null @@ -1,49 +0,0 @@ ---experiment processing query for prereleased data to support platform paper -SELECT DISTINCT ec.published_at, ec.id AS ec_id, ec.workflow_state, st.acronym, i.depth, g.name as driver, gr.name AS reporter, sp.name AS specimen -,o.id AS o_id ,o.workflow_state AS o_state, os.stimulus_name -,wkf.storage_directory || wkf.filename AS nwb -,awkf.storage_directory || awkf.filename AS analysis -,d.full_genotype -,array_to_string(array( ---SELECT DISTINCT w.name FROM specimens_workflows sw JOIN workflows w ON w.id=sw.workflow_id WHERE sw.specimen_id=sp.id -SELECT DISTINCT mc.name FROM donor_medical_conditions dmc JOIN medical_conditions mc ON mc.id=dmc.medical_condition_id AND mc.name NOT LIKE '%tissuecyte%' WHERE dmc.donor_id=d.id -ORDER BY mc.name - ), ',' --concatenate any donor tags (e.g. "Epileptiform Events" and "Non Cre-specific Phenotype") - ) donor_tags -,os.date_of_acquisition -,d.date_of_birth -,d.external_donor_name -,case when et.workflow_state = 'eyetrack_fail' then TRUE else FALSE end as fail_eye_tracking -FROM experiment_containers ec -JOIN ophys_experiments o ON o.experiment_container_id=ec.id AND o.workflow_state = 'passed' JOIN ophys_sessions os ON os.id=o.ophys_session_id AND os.stimulus_name IN ('three_session_A','three_session_B','three_session_C','three_session_C2') -LEFT JOIN eye_trackings et on et.id = os.eye_tracking_id ---514173041 OphysExperimentCellRoiMetricsFile -LEFT JOIN well_known_files awkf ON awkf.attachable_id=o.id AND awkf.well_known_file_type_id = 514173041 ---514173063 NWBOphys -JOIN well_known_files wkf ON wkf.attachable_id=o.id AND wkf.well_known_file_type_id = 514173063 -JOIN specimens sp ON sp.id=os.specimen_id JOIN structures st ON st.id=os.targeted_structure_id JOIN imaging_depths i ON i.id=o.imaging_depth_id -JOIN donors d ON d.id=sp.donor_id -JOIN donors_genotypes dg ON dg.donor_id=d.id JOIN genotypes g ON g.id = dg.genotype_id AND g.genotype_type_id = 177835595 AND g.name != 'Camk2a-tTA' --driver -JOIN donors_genotypes dgr ON dgr.donor_id=d.id JOIN genotypes gr ON gr.id=dgr.genotype_id AND gr.genotype_type_id = 177835597 --reporter - ---LEFT JOIN donor_medical_conditions dmc ON dmc.donor_id=d.id LEFT JOIN medical_conditions mc ON mc.id=dmc.medical_condition_id AND mc.name NOT LIKE '%tissuecyte%' -JOIN projects p ON p.id=os.project_id -WHERE p.code = 'C600' ---o.workflow_state IN ('passed','eyetrack_qc','eyetrack_processing','qc','processing') AND ec.workflow_state NOT IN ('failed','holding') ---AND ec.published_at IS NOT NULL -AND ec.workflow_state NOT IN ('failed') --that leaves in order of least complete to most complete: holding, reviewing, postprocessing, container_qc, published -ORDER BY -6,5,4,sp.name, ec.id, os.stimulus_name - -/* potential ophys_experiment states: -aborted,failed,invalid_data -created,processing,qc,passed -*/ - ---June 2017 notes ---Cux2-CreERT2 175,275 ---Scnn1a-Tg3-Cre 275,335,350 ---Rbp4-Cre_KL100 350,375,385,435 ---Rorb-IRES2-Cre 275, ---Nr5a1-Cre 300,325,335,350 ---Emx1-IRES-Cre 175 diff --git a/allensdk/internal/api/queries/pre_release_sql/processing_query.sql b/allensdk/internal/api/queries/pre_release_sql/processing_query.sql deleted file mode 100644 index 0f309175fa..0000000000 --- a/allensdk/internal/api/queries/pre_release_sql/processing_query.sql +++ /dev/null @@ -1,52 +0,0 @@ ---container processing query for prereleased data to support platform paper -SELECT DISTINCT ec.published_at, ec.id AS ec_id, ec.workflow_state, st.acronym, i.depth, g.name as driver, sp.name AS specimen -,oa.id AS oa_id,ob.id AS ob_id,oc.id AS oc_id -,oa.workflow_state AS oa_state,ob.workflow_state AS ob_state,oc.workflow_state AS oc_state -,wkfa.storage_directory || wkfa.filename AS a_nwb -,wkfb.storage_directory || wkfb.filename AS b_nwb -,wkfc.storage_directory || wkfc.filename AS c_nwb -,awkfa.storage_directory || awkfa.filename AS a_analysis -,awkfb.storage_directory || awkfb.filename AS b_analysis -,awkfc.storage_directory || awkfc.filename AS c_analysis -,d.full_genotype -FROM experiment_containers ec -JOIN ophys_experiments oa ON oa.experiment_container_id=ec.id AND oa.workflow_state = 'passed' JOIN ophys_sessions osa ON osa.id=oa.ophys_session_id AND osa.stimulus_name = 'three_session_A' -JOIN ophys_experiments ob ON ob.experiment_container_id=ec.id AND ob.workflow_state = 'passed' JOIN ophys_sessions osb ON osb.id=ob.ophys_session_id AND osb.stimulus_name = 'three_session_B' -JOIN ophys_experiments oc ON oc.experiment_container_id=ec.id AND oc.workflow_state = 'passed' JOIN ophys_sessions osc ON osc.id=oc.ophys_session_id AND osc.stimulus_name IN ('three_session_C','three_session_C2') -/* --Use this instead if you ever want to look into experiments that may not be passed yet (i.e. what is still coming round the mountain) -JOIN ophys_experiments oa ON oa.experiment_container_id=ec.id AND oa.workflow_state IN ('created','processing','qc','passed') JOIN ophys_sessions osa ON osa.id=oa.ophys_session_id AND osa.stimulus_name = 'three_session_A' -JOIN ophys_experiments ob ON ob.experiment_container_id=ec.id AND ob.workflow_state IN ('created','processing','qc','passed') JOIN ophys_sessions osb ON osb.id=ob.ophys_session_id AND osb.stimulus_name = 'three_session_B' -JOIN ophys_experiments oc ON oc.experiment_container_id=ec.id AND oc.workflow_state IN ('created','processing','qc','passed') JOIN ophys_sessions osc ON osc.id=oc.ophys_session_id AND osc.stimulus_name IN ('three_session_C','three_session_C2') -*/ ---514173041 OphysExperimentCellRoiMetricsFile -LEFT JOIN well_known_files awkfa ON awkfa.attachable_id=oa.id AND awkfa.well_known_file_type_id = 514173041 -LEFT JOIN well_known_files awkfb ON awkfb.attachable_id=ob.id AND awkfb.well_known_file_type_id = 514173041 -LEFT JOIN well_known_files awkfc ON awkfc.attachable_id=oc.id AND awkfc.well_known_file_type_id = 514173041 ---514173063 NWBOphys -JOIN well_known_files wkfa ON wkfa.attachable_id=oa.id AND wkfa.well_known_file_type_id = 514173063 -JOIN well_known_files wkfb ON wkfb.attachable_id=ob.id AND wkfb.well_known_file_type_id = 514173063 -JOIN well_known_files wkfc ON wkfc.attachable_id=oc.id AND wkfc.well_known_file_type_id = 514173063 -JOIN specimens sp ON sp.id=osa.specimen_id JOIN structures st ON st.id=osa.targeted_structure_id JOIN imaging_depths i ON i.id=osa.imaging_depth_id -JOIN donors d ON d.id=sp.donor_id JOIN donors_genotypes dg ON dg.donor_id=d.id JOIN genotypes g ON g.id=dg.genotype_id AND g.genotype_type_id = 177835595 AND g.name != 'Camk2a-tTA' -JOIN projects p ON p.id=osa.project_id -WHERE p.code = 'C600' ---o.workflow_state IN ('passed','eyetrack_qc','eyetrack_processing','qc','processing') AND ec.workflow_state NOT IN ('failed','holding') ---AND ec.published_at IS NOT NULL -AND ec.workflow_state NOT IN ('failed') --that leaves in order of least complete to most complete: holding, reviewing, postprocessing, container_qc, published -ORDER BY -6,5,4,7,2,8 - -/* potential ophys_experiment states: -aborted,failed,invalid_data -created,processing,qc,passed -*/ - ---June 2017 notes ---Cux2-CreERT2 175,275 ---Scnn1a-Tg3-Cre 275,335,350 ---Rbp4-Cre_KL100 350,375,385,435 ---Rorb-IRES2-Cre 275, ---Nr5a1-Cre 300,325,335,350 ---Emx1-IRES-Cre 175 - - diff --git a/allensdk/internal/brain_observatory/__init__.py b/allensdk/internal/brain_observatory/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/brain_observatory/annotated_region_metrics.py b/allensdk/internal/brain_observatory/annotated_region_metrics.py deleted file mode 100644 index fc07e1d347..0000000000 --- a/allensdk/internal/brain_observatory/annotated_region_metrics.py +++ /dev/null @@ -1,131 +0,0 @@ -"""Module for calculating annotated region metrics from ISI data""" -import numpy as np -import logging - -# These scaling factors are derived from experimental geometry using -# screen width 52.0 cm, screen height 32.0 cm (16:10 24 inch monitor) -# mouse 10.0 cm from center of monitor -ALTITUDE_SCALE = 0.322 -AZIMUTH_SCALE = 0.383 - - -def eccentricity(az, alt, az_center, alt_center): - """Compute eccentricity - - Parameters - ---------- - az : numpy.ndarray - Azimuth retinotopic map - alt : numpy.ndarray - Altitude retinotopic map - az_center : float - Azimuth value to use as center of eccentricity map - alt_center : float - Altitude value to use as center of eccentricity map - - Returns - ------- - numpy.ndarray - Eccentricity map - """ - daz = az - az_center - dalt = alt - alt_center - ecc = np.arctan(np.sqrt(np.square(np.tan(dalt)) + - np.square(np.tan(daz))/np.square(np.cos(dalt)))) - return ecc - - -def retinotopy_metric(mask, isi_map): - """Compute retinotopic metrics for a responding area - - Parameters - ---------- - mask : numpy.ndarray - Mask representing the area over which to calculate metrics - isi_map : numpy.ndarray - Retinotopic map - - Returns - ------- - (float, float, float, float) tuple - min, max, range, bias of retinotopic map over masked region - """ - ind = np.where( mask > 0 ) - vals = isi_map[ind] - maxv = np.degrees(np.max(vals)) - minv = np.degrees(np.min(vals)) - ret_range = float(maxv - minv) - ret_bias = float(abs(minv + maxv)) - return float(minv), float(maxv), ret_range, ret_bias - - -def create_region_mask(image_shape, x, y, width, height, mask): - """Create mask for region on retinotopic map - - Parameters - ---------- - image_shape : tuple - (height, width) of retinotopic map - x : int - x offset of region mask within retinotopic map - y : int - y offset of region mask within retinotopic map - width : int - width of region mask - height : int - height of region mask - mask : list - region mask as a list of lists - - Returns - ------- - numpy.ndarray - Region mask - """ - bb = np.zeros((height,width), dtype=np.uint8) - bb[np.asarray(mask)] = 1 - region_mask = np.zeros(image_shape, dtype=np.uint8) - region_mask[y:y + height,x:x + width] = bb - return region_mask - - -def get_metrics(altitude_phase, azimuth_phase, x=None, y=None, width=None, - height=None, mask=None, altitude_scale=ALTITUDE_SCALE, - azimuth_scale=AZIMUTH_SCALE): - """Calculate annotated region metrics""" - altitude = altitude_phase * altitude_scale - azimuth = azimuth_phase * azimuth_scale - - eccentricity_ret_zero = np.degrees( - eccentricity(azimuth, altitude, 0.0, 0.0)) - - result = {} - - region_mask = create_region_mask(altitude.shape, x, y, width, height, - mask) - - # compute centroid - centroid = [np.mean(x_value) for x_value in np.where(region_mask)] - result['y_centroid'] = centroid[0] - result['x_centroid'] = centroid[1] - - # compute azimuth/altitude max,min,range and bias - az_min, az_max, az_range, az_bias = retinotopy_metric(region_mask, - azimuth) - alt_min, alt_max, alt_range, alt_bias = retinotopy_metric(region_mask, - altitude) - result['azimuth_min'] = az_min - result['azimuth_max'] = az_max - result['azimuth_range'] = az_range - result['azimuth_bias'] = az_bias - result['altitude_min'] = alt_min - result['altitude_max'] = alt_max - result['altitude_range'] = alt_range - result['altitude_bias'] = alt_bias - - # eccentricity at centroid - cy = int(round(result['y_centroid'])) - cx = int(round(result['x_centroid'])) - result['eccentricity_at_centroid'] = float(eccentricity_ret_zero[cy,cx]) - - return result diff --git a/allensdk/internal/brain_observatory/demix_report.py b/allensdk/internal/brain_observatory/demix_report.py deleted file mode 100644 index 4972c5d1e6..0000000000 --- a/allensdk/internal/brain_observatory/demix_report.py +++ /dev/null @@ -1,250 +0,0 @@ -import logging -import numpy as np -import h5py - -#import matplotlib -#matplotlib.use('agg') -import matplotlib.pyplot as plt -import os - -def background_trace(trace, save_dir, data_set=None): - - fig,ax = plt.subplots(1) - ax.plot(trace) - if data_set is not None: - _add_stim_epochs(trace, ax, data_set) - - save_file = os.path.join(save_dir, 'background_trace.pdf') - fig.savefig(save_file) - logging.info("Background Trace saved to %s", save_file) - - plt.close(fig) - -def correlation_report(dm, save_dir, without_masks=True): - ''' - parameters: - dm: [DeMix object] - without_masks: boolean - ''' - - logging.info("Generating Correlation Report") - if without_masks: - cor, cor_demix = compute_correlations_without_masks(dm) - - no_diagonal_mask = (1.0 - np.eye(cor.shape[0])).astype('bool') - - fig, ax = plt.subplots(1) - ax.plot(dm.mask_overlap[:-1,:-1][no_diagonal_mask],cor[no_diagonal_mask]-cor_demix[no_diagonal_mask],'o') - ax.set_xlim([-1,np.max(dm.mask_overlap[:-1,:-1][no_diagonal_mask])]) - ax.set_title('Delta Correlation vs. mask overlap') - - save_file = os.path.join(save_dir,'cor_vs_overlap.pdf') - fig.savefig(save_file) - logging.info("\tCorrelation overlap saved to %s", save_file) - plt.close(fig) - - fig, ax = plt.subplots(1,3) - delta_cor = cor- cor_demix - ax[0].hist(delta_cor[dm.mask_overlap[:-1,:-1]==0],bins=100) - ax[0].set_title('Delta Correlation') - ax[1].hist(cor[no_diagonal_mask],bins=100) - ax[1].set_title('Pre-demix Correlation') - ax[2].hist(cor_demix[no_diagonal_mask],bins=100) - ax[2].set_title('Post-demix Correlation') - - save_file = os.path.join(save_dir,'cor_hist.pdf') - fig.savefig(save_file) - logging.info("\tCorrelation histograms saved to %s", save_file) - plt.close(fig) - - - else: - raise Exception('without_masks=False not yet implemented') - -def plot_masks(dm, save_dir, movie_file, movie_dataset, window=150, add_background=True): - - logging.info("Plotting masks") - - overlap_pairs = [(x,y) for (x,y) in zip(*np.where(dm.mask_overlap >0)) if x>y and x!=dm.mask_overlap.shape[0]-1] - movie_data = h5py.File(movie_file,'r') - - bg_traces = dm.get_traces_with_background() - - for i,pair in enumerate(overlap_pairs): - fig_pair, ax_pair = plt.subplots(2,2) - - mask = np.zeros(dm.masks[0].shape) - rgb_shape = (dm.masks[0].shape[0],dm.masks[0].shape[1],3) - rgb_mask = np.zeros(rgb_shape,dtype=np.uint8) - #for p in pair: - rgb_mask[:,:,2] = 255*dm.masks[pair[0]] - rgb_mask[:,:,1] = 255*dm.masks[pair[1]] - for p in pair: - mask += dm.masks[p] - non_zeros = np.where(mask) - non_zeros_mask = np.zeros(mask.shape) - ylower = np.min(non_zeros[0]) - yupper = np.max(non_zeros[0]) - xlower = np.min(non_zeros[1]) - xupper = np.max(non_zeros[1]) - - #ax_pair[0,0].imshow(mask[ylower:yupper,xlower:xupper]) - ax_pair[0,0].imshow(rgb_mask[ylower:yupper,xlower:xupper]) - - trace1 = dm.traces[pair[0]] - trace2 = dm.traces[pair[1]] - - if add_background: - trace1_demix = bg_traces[pair[0]] - trace2_demix = bg_traces[pair[1]] - else: - trace1_demix = dm.traces_demix[pair[0]] - trace2_demix = dm.traces_demix[pair[1]] - - center = np.where(trace1==np.max(trace1))[0][0] - - ax_pair[1,0].plot(trace1[(center-window):(center+window)],label=str(pair[0])) - ax_pair[1,0].plot(trace2[(center-window):(center+window)],label=str(pair[1])) - ax_pair[1,0].legend() - - ax_pair[1,1].plot(trace1_demix[center-window:center+window],label=str(pair[0])) - ax_pair[1,1].plot(trace2_demix[center-window:center+window],label=str(pair[1])) - ax_pair[1,1].legend() - - ax_pair[0,1].imshow(movie_data[movie_dataset][center,ylower:yupper,xlower:xupper]) - - save_file = os.path.join(save_dir,'masks_'+str(pair[0])+'_'+str(pair[1])+'.pdf') - fig_pair.savefig(save_file) - plt.close(fig_pair) - logging.info("\tMask saved to %s", save_file) - - #print(overlap_pairs) - #print(np.unique(dm.mask_overlap[no_diagonal_mask][dm.mask_overlap[no_diagonal_mask]>0])) - - -def _get_epoch_windows(stim_table): - - start = np.array(stim_table.start) - end = np.array(stim_table.end) - - windows = zip(start,end) - window_list = [[start[0]]] - for i,w in enumerate(windows[1:]): - if start[i+1] - end[i]>1: - window_list[-1].append(end[i]) - window_list.append([start[i+1]]) - #window_list += [end[i],start[i+1]] - - window_list[-1].append(end[-1]) - - #window_list = [start[0]] - #window_list += [ start[x+1] for x in list(np.where(np.abs(start[1:] - end[:-1]) > 1)[0])] - #window_list += [end[-1]] - - #print(window_list) - - return window_list - -def _add_stim_epochs(trace,ax,data_set): - - stim_colors_dict = {'locally_sparse_noise':'green','drifting_gratings':'yellow','natural_movie_one':'magenta','natural_movie_two':'magenta','natural_movie_three':'red','natural_scenes':'orange','spontaneous':'grey','static_gratings':'blue'} - - from allensdk.brain_observatory.stimulus_info import stimuli_in_session - - stim_types = stimuli_in_session(data_set.get_metadata()['session_type']) - - - for stim in stim_types: - #print(stim) - stim_table = data_set.get_stimulus_table(stim) - window_list = _get_epoch_windows(stim_table) - for w in window_list: - #ax.fill_betweenx(np.arange(trace.shape[0]),w[0],w[1],facecolor=stim_colors_dict[stim],alpha=0.2) - #ax.axvspan(w[0],w[1],np.min(trace),np.max(trace),facecolor=stim_colors_dict[stim],alpha=0.2) - ax.axvspan(w[0],w[1],facecolor=stim_colors_dict[stim],alpha=0.2) - ax.set_ylim([np.min(trace),np.max(trace)]) - - -def compute_non_overlap_masks(dm): - - no_masks = np.zeros(dm.masks.shape).astype(int) - overlap_val = np.zeros(dm.masks.shape[0]) - - for i, m in enumerate(dm.masks): - - overlap_1 = np.sum(dm.masks[:i],axis=0) - overlap_2 = np.sum(dm.masks[i+1:],axis=0) - - overlap = overlap_1 + overlap_2 - - overlap_val[i] = np.sum(overlap) - - no1 = overlap == 0 - #no2 = overlap_2 == 0 - - no_masks[i] = np.logical_and(no1, m) - - dm.no_masks = no_masks - dm.overlap = overlap - - return dm.no_masks - -def compute_non_overlap_traces(dm, movie_path, movie_dataset): - no_traces_shape = (dm.traces.shape[0],dm.traces.shape[1]) - no_traces = np.zeros(no_traces_shape) - - N, T = no_traces.shape - - chunk_size = 1000 - num_chunks = int(np.ceil(T/float(chunk_size))) - - normalized_flat_masks = dm.no_masks.reshape(N,-1).T # shape (pixels, N) - normalized_flat_masks /= np.sum(normalized_flat_masks,axis=0) # shape(pixels, N) - - movie_f = h5py.File(movie_path) - movie = movie_f[movie_dataset] - - logging.debug("Getting traces for %d chunks", num_chunks) - for n in range(num_chunks): - print("Chunk = ", n) - data = movie[n*chunk_size:(n+1)*chunk_size] - data = data.reshape(chunk_size,-1) # This line throws an error - - no_traces[:,n*chunk_size:(n+1)*chunk_size] = np.dot(data,normalized_flat_masks).T - - movie_f.close() - - logging.debug("Done") - dm.no_traces = no_traces - - return dm.no_traces - -def compute_correlations(dm, movie_path, movie_dataset): - - compute_non_overlap_masks(dm) - compute_non_overlap_traces(dm, movie_path, movie_dataset) - - no_mean = np.mean(dm.no_traces) - dm_mean = np.mean(dm.traces_demix) - t_mean = np.mean(dm.traces) - - C_no_dm = np.mean( (dm.no_traces-no_mean)*(dm.traces_demix-dm_mean), axis=1) - C_t_dm = np.mean( (dm.traces-t_mean)*(dm.traces_demix-dm_mean), axis=1) - - return C_no_dm, C_t_dm - -def compute_correlations_without_masks(dm): - N, T = dm.traces.shape - N=N -1 - - traces = (dm.traces.T - np.mean(dm.traces.T,axis=0)) # shape (T,N) - traces_demix = (dm.traces_demix.T - np.mean(dm.traces_demix.T,axis=0)) # shape (T,N) - - traces /= np.std(traces,axis=0) - traces_demix /= np.std(traces_demix,axis=0) - - cor = np.dot(traces.T,traces)/T - cor_demix = np.dot(traces_demix.T,traces_demix)/T - - return cor[:N,:N], cor_demix[:N,:N] - diff --git a/allensdk/internal/brain_observatory/demixer.py b/allensdk/internal/brain_observatory/demixer.py deleted file mode 100644 index cc54c5a6fc..0000000000 --- a/allensdk/internal/brain_observatory/demixer.py +++ /dev/null @@ -1,359 +0,0 @@ -import scipy.sparse as sparse -import scipy.linalg as linalg -import numpy as np -import os -import matplotlib.pyplot as plt -import allensdk.internal.brain_observatory.mask_set as mask_set -import logging -import matplotlib.colors as colors -from allensdk.config.manifest import Manifest -from allensdk.deprecated import deprecated - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "identify_valid_masks instead.") -def identify_valid_masks(mask_array): - ms = mask_set.MaskSet(masks=mask_array.astype(bool)) - valid_masks = np.ones(mask_array.shape[0]).astype(bool) - - # detect duplicates - duplicates = ms.detect_duplicates(overlap_threshold=0.9) - if len(duplicates) > 0: - valid_masks[duplicates.keys()] = False - - # detect unions, only for remaining valid masks - valid_idxs = np.where(valid_masks) - ms = mask_set.MaskSet(masks=mask_array[valid_idxs].astype(bool)) - unions = ms.detect_unions() - - if len(unions) > 0: - un_idxs = unions.keys() - valid_masks[valid_idxs[0][un_idxs]] = False - - return valid_masks - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "demix_time_dep_masks instead.") -def demix_time_dep_masks(raw_traces, stack, masks): - ''' - - :param raw_traces: extracted traces - :param stack: movie (same length as traces) - :param masks: binary roi masks - :return: demixed traces - ''' - N, T = raw_traces.shape - _, x, y = masks.shape - P = x * y - - if len(stack.shape) == 3: - stack = stack.reshape(T, P) - - num_pixels_in_mask = np.sum(masks, axis=(1, 2)) - F = raw_traces.T * num_pixels_in_mask # shape (T,N) - F = F.T - - flat_masks = masks.reshape(N, P) - flat_masks = sparse.csr_matrix(flat_masks) - - drop_frames = [] - demix_traces = np.zeros((N, T)) - - for t in range(T): - - weighted_mask_sum = F[:, t] - drop_test = (weighted_mask_sum == 0) - - if np.sum(drop_test == 0): - norm_mat = sparse.diags(num_pixels_in_mask / weighted_mask_sum, offsets=0) - stack_t = sparse.diags(stack[t], offsets=0) - - flat_weighted_masks = norm_mat.dot(flat_masks.dot(stack_t)) - - overlap = flat_masks.dot(flat_weighted_masks.T).toarray() # cast to dense numpy array for linear solver because solution is dense - try: - demix_traces[:, t] = linalg.solve(overlap, F[:, t]) - except linalg.LinAlgError as e: - logging.warning("singular matrix, using least squares") - x, _, _, _ = linalg.lstsq(overlap, F[:, t]) - demix_traces[:, t] = x - - drop_frames.append(False) - - else: - drop_frames.append(True) - - return demix_traces, drop_frames - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "plot_traces instead.") -def plot_traces(raw_trace, demix_trace, roi_id, roi_ind, save_file): - fig, ax = plt.subplots() - - ax.plot(raw_trace, label='Fluoresence') - ax.plot(demix_trace, label='Demixed') - ax.set_title("ROI ID(%d) index (%d)" % (roi_id, roi_ind)) - ax.legend() - plt.savefig(save_file) - plt.close(fig) - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "find_zero_baselines instead.") -def find_zero_baselines(traces): - means = traces.mean(axis=1) - stds = traces.std(axis=1) - return np.where((means-stds) < 0) - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "plot_negative_baselines instead.") -def plot_negative_baselines(raw_traces, demix_traces, mask_array, roi_ids_mask, plot_dir, ext='png'): - N, T = raw_traces.shape - _, x, y = mask_array.shape - - logging.debug("finding negative baselines") - neg_inds = find_negative_baselines(demix_traces)[0] - - overlap_inds = set() - logging.debug("detected negative baselines: %s", str(neg_inds)) - for roi_ind in neg_inds: - Manifest.safe_mkdir(plot_dir) - - save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative.' + ext) - plot_traces(raw_traces[roi_ind], demix_traces[roi_ind], roi_ids_mask[roi_ind], roi_ind, save_file) - - ''' plot overlapping masks ''' - save_file = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_negative_masks.' + ext) - roi_overlap_inds = plot_overlap_masks_lengthOne(roi_ind, mask_array, save_file) - - overlap_inds.update(roi_overlap_inds) - - zero_inds = find_zero_baselines(demix_traces)[0] - logging.debug("detected zero baselines: %s", str(zero_inds)) - overlap_inds.update(zero_inds) - - return list(overlap_inds) - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "plot_negative_transients instead.") -def plot_negative_transients(raw_traces, demix_traces, valid_roi, mask_array, roi_ids_mask, plot_dir, ext='png'): - - N, T = raw_traces.shape - _, x, y = mask_array.shape - - logging.debug("finding negative transients") - trans_ind_list1 = [find_negative_transients_threshold(trace=demix_traces[n]) for n in range(N)] - rois_with_trans1 = [i for i in range(N) if len(trans_ind_list1[i]) > 0] - rois_with_trans = np.unique(rois_with_trans1) - rois_with_trans = [r for r in rois_with_trans if len(trans_ind_list1[r][0]) > 0] - - logging.debug("plotting negative transients") - - flat_masks = mask_array.reshape(N, x*y) - overlap = flat_masks.dot(flat_masks.T) - overlap ^= np.diag(np.diag(overlap)) - - for roi_ind in rois_with_trans: - - ''' plot biggest negative transient of this roi ''' - trans_ind_list = trans_ind_list1[roi_ind] - - trans_ind_list = trans_ind_list[0] - trans_list = [] - for i in trans_ind_list: - if i > 100 and i < T - 100: - trans_list.append(demix_traces[roi_ind, i - 100:i + 100]) - elif i > 100 and i >= T - 100: - trans_list.append(demix_traces[roi_ind, i - 100:]) - else: - trans_list.append(demix_traces[roi_ind, :i + 100]) - - # trans_list = [demix_traces[roi_ind, i-100:i+100] for i in trans_ind_list if i > 100 and i < Nt] - Ntrans = len(trans_list) - biggest_trans = 0 - for i in range(1, Ntrans): - if np.amin(trans_list[i]) < np.amin(trans_list[biggest_trans]): - biggest_trans = i - - trans_ind = trans_ind_list[biggest_trans] - - # trans_ind_list = np.concatenate((trans_ind_list1[roi_ind][0], trans_ind_list2[roi_ind][0])) - # trans_list_min = np.where(demix_traces[roi_ind, trans_ind_list] == min(demix_traces[roi_ind, trans_ind_list]))[0] - - if np.sum(overlap[roi_ind]) > 0: - - if valid_roi[roi_ind]: - - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_valid.' + ext) - plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) - - ''' plot overlapping masks ''' - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_valid.' + ext) - plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) - # plot_overlap_masks(roi_ind, mask_test, savefile) - else: - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_transient_invalid.' + ext) - plot_transients(roi_ind, trans_ind, mask_array, raw_traces, demix_traces, savefile) - - ''' plot overlapping masks ''' - savefile = os.path.join(plot_dir, str(roi_ids_mask[roi_ind]) + '_masks_invalid.' + ext) - plot_overlap_masks_lengthOne(roi_ind, mask_array, savefile) - # plot_overlap_masks(roi_ind, mask_test, savefile) - # - else: - continue - - return rois_with_trans - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "rolling_window instead.") -def rolling_window(trace, window=500): - ''' - - :param trace: - :param window: - :return: - ''' - - shape = trace.shape[:-1] + (trace.shape[-1] - window + 1, window) - strides = trace.strides + (trace.strides[-1], ) - - return np.lib.stride_tricks.as_strided(trace, shape=shape, strides=strides) - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "find_negative_baselines instead.") -def find_negative_baselines(trace): - means = trace.mean(axis=1) - stds = trace.std(axis=1) - return np.where((means+stds) < 0) - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "find_negative_transients_threshold instead.") -def find_negative_transients_threshold(trace, window=500, length=10, std_devs=3): - trace = np.pad(trace, pad_width=(window-1, 0), mode='constant', constant_values=[np.mean(trace[:window])]) - rolling_mean = np.mean(rolling_window(trace, window), -1) - rolling_std = np.std(rolling_window(trace, window), -1) - - below_thresh = (trace[window-1:] < rolling_mean - std_devs*rolling_std) - below_thresh = np.pad(below_thresh, pad_width=(window-1, 0), mode='constant') - trans_length = np.sum(rolling_window(below_thresh, length), -1) - trans_length = trans_length[window-length:] - - trans_ind = np.where(trans_length == length) - - return trans_ind - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "plot_overlap_masks_lengthOne instead.") -def plot_overlap_masks_lengthOne(roi_ind, masks, savefile=None, weighted=False): - - masks = np.array(masks).astype(float) - N, x, y = masks.shape - if np.sum(masks[-1]) == x*y: - masks = masks[:-1] - N -= 1 - - flat_masks = masks.reshape(N, x*y) - masks_overlap = flat_masks.dot(flat_masks.T) - - ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with - for i in ind_plot: # rois that overlap with each roi k - ind_k = np.where(masks_overlap[i, :] > 0)[0] - ind_plot = np.concatenate((ind_plot, ind_k)) - - ind_plot = np.unique(ind_plot) - ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) - - plt.figure() - color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] - Ncol = len(color_list) - for num, i in enumerate(ind_plot): - mask_plot = masks[i] - if not weighted: - mask_plot = ((num % Ncol)+1)*np.ma.array(masks[i], mask=(masks[i] == 0)) - plt.imshow(mask_plot, clim=(1., Ncol+1), cmap=colors.ListedColormap(color_list), alpha=0.5, interpolation='nearest') - # plt.imshow(mask_plot, clim=(1., len(ind_plot)), alpha=.5) - - elif weighted: - mask_plot = np.ma.array(masks[i], mask=(masks[i] == 0)) - plt.imshow(mask_plot, cmap='gray_r', alpha=.5, interpolation='nearest') - - plt.text(np.mean(np.where(np.sum(mask_plot, axis=0))), np.mean(np.where(np.sum(mask_plot, axis=1))) ,str(i)) - - mask_tot = np.sum(masks[ind_plot, :, :], axis=0) - mask_x = np.sum(mask_tot, axis=0) - mask_y = np.sum(mask_tot, axis=1) - - plt.xlim((np.amin(np.where(mask_x))-5, np.amax(np.where(mask_x))+5)) - plt.ylim((np.amin(np.where(mask_y))-5, np.amax(np.where(mask_y))+5)) - plt.title('Masks') - - if savefile is not None: - plt.savefig(savefile) - plt.close() - - return ind_plot - - -@deprecated("The internal demixer module is deprecated and will be removed. " - "Please use allensdk.brain_observatory.demixer." - "plot_transients instead.") -def plot_transients(roi_ind, t_trans, masks, traces, demix_traces, savefile): - - masks = np.array(masks).astype(float) - N, x, y = masks.shape - _, Nt = traces.shape - - flat_masks = masks.reshape(N, x*y) - masks_overlap = flat_masks.dot(flat_masks.T) - - ind_plot = np.where(masks_overlap[roi_ind, :] > 0)[0] # rois (k) that roi_ind overlaps with - for i in ind_plot: # rois that overlap with each roi k - ind_k = np.where(masks_overlap[i, :] > 0)[0] - ind_plot = np.concatenate((ind_plot, ind_k)) - - ind_plot = np.unique(ind_plot) - ind_plot = np.concatenate(([roi_ind], ind_plot[ind_plot!=roi_ind])) - - if t_trans > 150 and t_trans < Nt - 150: - plot_t = range(t_trans - 150, t_trans + 150) - elif t_trans > 150 and t_trans >= Nt - 150: - plot_t = range(t_trans - 150, Nt) - else: - plot_t = range(0, t_trans + 150) - - fig, ax = plt.subplots(1, 2, figsize=(12, 6), sharex=True, sharey=True) - color_list = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] - Ncol = len(color_list) - - for num, i in enumerate(ind_plot): - ax[0].plot(plot_t, traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) - ax[1].plot(plot_t, demix_traces[i, plot_t], label=str(i), color=color_list[(num % Ncol)]) - - ax[0].set_title('Raw') - ax[0].set_ylabel('Fluorescence') - ax[1].set_title('Demixed') - ax[1].set_xlabel('Time') - ax[0].legend(loc=0) - - plt.savefig(savefile) - plt.close(fig) - diff --git a/allensdk/internal/brain_observatory/eye_calibration.py b/allensdk/internal/brain_observatory/eye_calibration.py deleted file mode 100755 index df9a09767b..0000000000 --- a/allensdk/internal/brain_observatory/eye_calibration.py +++ /dev/null @@ -1,346 +0,0 @@ -import numpy as np -import logging - -MONITOR_POSITION_OLD = np.array([17.0, 0.0, 0.0]) -MONITOR_POSITION_NEW = np.array([11.86, 8.62, 3.16]) -MONITOR_ROTATIONS = np.array([0.0, 0.0, 0.0]) - -CAMERA_POSITION_OLD = np.array([13.0, 0, 0]) -CAMERA_POSITION_NEW = np.array([10.28, 7.47, 2.74]) -CAMERA_ROTATIONS_OLD = np.array([0.0, 0.0, 13.1*np.pi/180]) -CAMERA_ROTATIONS_NEW = np.array([0.0, 0.0, 2.8*np.pi/180]) - -LED_POSITION_ORIGINAL = np.array([26.51, -3.93, 0.1]) -LED_POSITION_OLD = np.array([25.89, -6.12, 3.21]) -LED_POSITION_NEW = np.array([24.6, 9.23, 5.26]) - -EYE_RADIUS = 0.1682 # in cm -CM_PER_PIXEL = 10.2/10000.0 - -class EyeCalibration(object): - '''Class for performing eye-tracking calibration. - - Provides methods for estimating the position of the pupil in - 3D space and projecting the gaze onto the monitor in both - 3D space and monitor space given the experimental geometry. - - Parameters - ---------- - monitor_position : numpy.ndarray - [x,y,z] position of monitor in cm. - monitor_rotations : numpy.ndarray - [x,y,z] rotations of monitor in radians. - led_position : numpy.ndarray - [x,y,z] position of LED in cm. - camera_position : numpy.ndarray - [x,y,z] position of camera in cm. - camera_rotations : numpy.ndarray - [x,y,z] rotations for camera in radians. X and Y must be 0. - eye_radius : float - Radius of the eye in cm. - cm_per_pixel : float - Pixel size of eye-tracking camera. - ''' - def __init__(self, monitor_position=MONITOR_POSITION_NEW, - monitor_rotations=MONITOR_ROTATIONS, - led_position=LED_POSITION_OLD, - camera_position=CAMERA_POSITION_OLD, - camera_rotations=CAMERA_ROTATIONS_OLD, - eye_radius=EYE_RADIUS, - cm_per_pixel=CM_PER_PIXEL): - '''Constructor.''' - - self.eye_radius = eye_radius - self.cm_per_pixel = cm_per_pixel - - self.monitor_position = monitor_position - self.led_position = led_position - self.camera_position = camera_position - - self.cr = self.cr_position_in_mouse_eye_coordinates(led_position, - eye_radius) - - self.monitor_rotations = monitor_rotations - if camera_rotations[0] != 0 or camera_rotations[1] != 0: - logging.warning("Got nonzero x=%s,y=%s rotations for camera", - camera_rotations[0], camera_rotations[1]) - self.camera_rotation = camera_rotations[2] - - def pupil_position_in_mouse_eye_coordinates(self, pupil_parameters, - cr_parameters): - '''Compute the 3D pupil position in mouse eye coordinates. - - Parameters - ---------- - pupil_parameters : numpy.ndarray - Array of pupil parameters for each eye tracking frame. - cr_paramaeters : numpy.ndarray - Array of corneal reflection parameters for each eye - tracking frame. - - Returns - ------- - numpy.ndarray - Pupil position estimates in eye coordinates. - ''' - # x, y are in screen coordinates, with y increasing towards the top - delta_px = (pupil_parameters.T[0] - cr_parameters.T[0]) * \ - self.cm_per_pixel - delta_py = (cr_parameters.T[1] - pupil_parameters.T[1]) * \ - self.cm_per_pixel # +y is down on image - - R_cam_to_eye = base_object_to_eye_rotation_matrix( - self.camera_position) - # camera frame is passed to us pointed at the eye, but the image - # appears as if the camera were rotated 180 degrees about its y-axis - R_cam = object_rotation_matrix(0, np.pi, self.camera_rotation) - cr_cam = np.dot(R_cam, np.dot(R_cam_to_eye.T, self.cr)) - - px_cam = cr_cam[0] + delta_px - py_cam = cr_cam[1] + delta_py - pz_cam = np.sqrt(self.eye_radius**2 - px_cam**2 - py_cam**2) - - # estimating a position outside the eyeball is impossible, bad data - bad_idx = np.sqrt(px_cam**2 + py_cam**2) > self.eye_radius - px_cam[bad_idx] = np.nan - py_cam[bad_idx] = np.nan - pz_cam[bad_idx] = np.nan - - p_cam = np.vstack([px_cam, py_cam, pz_cam]) - - # rotate estimates - return np.dot(R_cam_to_eye, np.dot(R_cam.T, p_cam)).T - - @staticmethod - def cr_position_in_mouse_eye_coordinates(led_position, eye_radius): - '''Determine the 3D position of the corneal reflection. - - The eye is modeled as a spherical mirror, so the reflection - appears to be half the radius of the eye from the origin along - the eye-LED axis. - - Parameters - ---------- - led_position : numpy.ndarray - [x,y,z] position of the LED in eye coordinates. - eye_radius : float - Radius of the eye in centimeters. - - Returns - ------- - numpy.ndarray - [x,y,z] location of the corneal reflection in eye coordinates. - ''' - return (eye_radius/(2*np.linalg.norm(led_position))) * led_position - - def pupil_position_on_monitor_in_cm(self, pupil_parameters, - cr_parameters): - '''Compute the pupil position on the monitor in cm. - - Parameters - ---------- - pupil_parameters : numpy.ndarray - Array of pupil parameters for each eye tracking frame. - cr_paramaeters : numpy.ndarray - Array of corneal reflection parameters for each eye - tracking frame. - - Returns - ------- - numpy.ndarray - Pupil position estimates in eye coordinates. - ''' - pupil_positions = self.pupil_position_in_mouse_eye_coordinates( - pupil_parameters, cr_parameters) - - monitor_normal = object_norm_eye_coordinates( - self.monitor_position, self.monitor_rotations[0], - self.monitor_rotations[1], self.monitor_rotations[2]) - - projected_positions = project_to_plane(monitor_normal, - self.monitor_position, - pupil_positions) - - monitor_positions = projected_positions - self.monitor_position - - R_monitor_to_eye = base_object_to_eye_rotation_matrix( - self.monitor_position) - R_monitor = object_rotation_matrix(self.monitor_rotations[0], - self.monitor_rotations[1], - self.monitor_rotations[2]) - - result = np.dot(R_monitor.T, - np.dot(R_monitor_to_eye.T, monitor_positions.T)) - return result[:2].T - - def pupil_position_on_monitor_in_degrees(self, pupil_parameters, - cr_parameters): - '''Get pupil position on monitor measured in visual degrees. - - Parameters - ---------- - pupil_parameters : numpy.ndarray - Array of pupil parameters for each eye tracking frame. - cr_paramaeters : numpy.ndarray - Array of corneal reflection parameters for each eye - tracking frame. - - Returns - ------- - numpy.ndarray - Pupil position estimate in visual degrees. - ''' - - mag = np.sqrt(np.sum(self.monitor_position**2)) - - pupil_pos = self.pupil_position_on_monitor_in_cm(pupil_parameters, - cr_parameters) - - x = pupil_pos.T[0] - y = pupil_pos.T[1] - - meridian = np.arctan(x/mag)*180/np.pi - elevation = np.arctan(y/np.sqrt(mag**2 + x**2))*180/np.pi - - angles = np.vstack([meridian, elevation]).T - - return angles - - def compute_area(self, pupil_parameters): - '''Compute the area of the pupil. - - Assume the pupil is a circle, and that as it moves off-axis - with the camera the observed ellipse major axis remains the - diameter of the circle. - - Parameters - ---------- - pupil_parameters : numpy.ndarray - [nx5] array of pupil parameters. - - Returns - ------- - numpy.ndarray - [nx1] array of pupil areas in estimated pixels. - ''' - r = np.maximum(pupil_parameters.T[3], pupil_parameters.T[4]) - return np.pi*r*r - - -def project_to_plane(plane_normal, plane_point, points): - '''Project from the origin through points onto a plane. - - Parameters - ---------- - plane_normal : numpy.ndarray - [x, y, z] normal unit vector to the plane. - plane_point : numpy.ndarray - [x, y, z] point on the plane. - points : numpy.ndarray - [nx3] points in space through which to project. - - Returns - ------- - numpy.ndarray - [nx3] points projected on the plane. - ''' - factor = np.sum(plane_normal*plane_point) / \ - np.sum(plane_normal*points, axis=1) - return (factor*points.T).T - - -def object_norm_eye_coordinates(object_position, x_rotation, - y_rotation, z_rotation): - '''Get the normal vector for the object plane in eye coordinates. - - Parameters - ---------- - object_position : numpy.ndarray - [x, y, z] location of the object in eye coordinates. - x_rotation : float - Rotation about the x-axis in radians. - y_rotation : float - Rotation about the y-axis in radians. - z_rotation : float - Rotation about the z-axis in radians. - - Returns - ------- - numpy.ndarray - Endpoint of the object plane vector in eye coordinates. - ''' - R_object_to_eye = base_object_to_eye_rotation_matrix(object_position) - R_object_frame = object_rotation_matrix(x_rotation, y_rotation, - z_rotation) - return np.dot(R_object_to_eye, np.dot(R_object_frame, [0, 0, 1])) - - -def base_object_to_eye_rotation_matrix(object_position): - '''Rotation matrix to rotate base object frame to eye coordinates. - - By convention, any other object's coordinate frame before rotations - is set with positive Z pointing from the object's position back - to the origin of the eye coordinate system, with X parallel to the - eye X-Y plane. - - Parameters - ---------- - object_position : np.ndarray - [x, y, z] position of object in eye coordinates. - - Returns - ------- - numpy.ndarray - [3x3] rotation matrix. - ''' - eye_norm = -object_position/np.linalg.norm(object_position) - - # rotate about eye-z to align eye-x to object-x - theta_z = -(np.pi/2 + np.arctan2(eye_norm[1], eye_norm[0])) - Rz = np.array([[np.cos(theta_z), -np.sin(theta_z), 0], - [np.sin(theta_z), np.cos(theta_z), 0], - [0, 0, 1]]) - eye_norm_about_z = np.dot(Rz, eye_norm) - - # rotate about x' to align eye-z to object-z - theta_x = np.pi/2 - np.arctan2(eye_norm_about_z[2], eye_norm_about_z[1]) - Rx = np.array([[1, 0, 0], - [0, np.cos(theta_x), -np.sin(theta_x)], - [0, np.sin(theta_x), np.cos(theta_x)]]) - - R = np.dot(Rx, Rz).T - return R - - -def object_rotation_matrix(x_rotation, y_rotation, z_rotation): - '''Rotation matrix in object coordinate frame. - - The rotation matrix for rotating the object coordinate frame from - the initial position. This is done by rotating around x, then - around y', then around z''. - - Parameters - ---------- - x_rotation : float - Rotation about x axis in radians. - y_rotation : float - Rotation about y axis in radians. - z_rotation : float - Rotation about z axis in radians. - - Returns - ------- - numpy.ndarray - [3x3] rotation matrix. - ''' - Rx = np.array([[1, 0, 0], - [0, np.cos(x_rotation), -np.sin(x_rotation)], - [0, np.sin(x_rotation), np.cos(x_rotation)]]) - Ry = np.array([[np.cos(y_rotation), 0, np.sin(y_rotation)], - [0, 1, 0], - [-np.sin(y_rotation), 0, np.cos(y_rotation)]]) - Rz = np.array([[np.cos(z_rotation), -np.sin(z_rotation), 0], - [np.sin(z_rotation), np.cos(z_rotation), 0], - [0, 0, 1]]) - result = np.dot(Rz, np.dot(Ry, Rx)) - return result diff --git a/allensdk/internal/brain_observatory/fit_ellipse.py b/allensdk/internal/brain_observatory/fit_ellipse.py deleted file mode 100644 index 2e5b67ea51..0000000000 --- a/allensdk/internal/brain_observatory/fit_ellipse.py +++ /dev/null @@ -1,238 +0,0 @@ -import numpy as np -import logging - -class FitEllipse (object): - - def __init__(self,min_points,max_iter,threshold,num_close): - - # points = np.array(candidate_points) - # y,x = points.T - - C = np.zeros([6,6]) - C[0,2]= 2.0 - C[2,0]= 2.0 - C[1,1]= -1.0 - - #self.x = x - #self.y = y - self.C = C - - self.min_points = min_points - self.max_iter = max_iter - self.threshold = threshold - self.num_close = num_close - - self.best_params = None - self.best_params_set = False - self.besterror = np.inf - - def ransac_fit(self,candidate_points): - - #points = np.array(candidate_points) - - for i in range(self.max_iter): - - inlier_points, outlier_points = self.choose_inliers(candidate_points) - params, error = self.fit_ellipse(inlier_points) - - if len(outlier_points)>0: - cost = self.outlier_cost(outlier_points,params) - also_in = 0 - for j,c in enumerate(cost): - point = outlier_points[j] - if cost[j]<self.threshold: - inlier_points += [point] - also_in += 1 - - if also_in > self.num_close: - params, error = self.fit_ellipse(inlier_points) - if (error < self.besterror): - self.best_params = params - self.best_params_set = True - self.besterror = error - - if self.best_params_set: - return ellipse_center(self.best_params), ellipse_angle_of_rotation(self.best_params)*180./np.pi, ellipse_axis_length(self.best_params) - else: - return None - - def choose_inliers(self, candidate_points): - - #cannot take a larger sample than population - if(len(candidate_points) > self.min_points): - inlier_index = np.random.choice(np.arange(len(candidate_points)),self.min_points,replace=False) - else: - #TODO check this - inlier_index = np.arange(self.min_points) - - inlier_points = [] - outlier_points = [] - - for i in range(len(candidate_points)): - if i in inlier_index: - inlier_points += [candidate_points[i]] - else: - outlier_points += [candidate_points[i]] - - return inlier_points, outlier_points - - def outlier_cost(self,outlier_points,params): - - y,x = np.array(outlier_points).T - - D = np.vstack([x*x, x*y, y*y, x, y, np.ones(len(y))]) - #S = np.dot(D, D.T) - - cost = (np.dot(params,D))**2 - - return cost - - def fit_ellipse(self,inlier_points): - try: - inlier_points = np.array(inlier_points) - points = np.array(inlier_points) - y,x = points.T - - D = np.vstack([x*x, x*y, y*y, x, y, np.ones(len(y))]) - S = np.dot(D, D.T) - - M = np.dot(np.linalg.inv(S),self.C) - U,s,V=np.linalg.svd(M) - - params = U.T[0] - error = np.dot(params, np.dot(S,params))/len(inlier_points) - except: - #TODO - check if this is correct - params = None #WBW error handling - error = 0.00000001 #WBW error handling - - return params, error - - -def ellipse_center(a): - b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] - num = b*b-a*c - x0=(c*d-b*f)/num - y0=(a*f-b*d)/num - return np.array([x0,y0]) - -def ellipse_angle_of_rotation( a ): - b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] - return 0.5*np.arctan(2*b/(a-c)) - -def ellipse_angle_of_rotation2( a ): - b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] - if b == 0: - if a > c: - return 0 - else: - return np.pi/2 - else: - if a > c: - return np.arctan(2*b/(a-c))/2 - else: - return np.pi/2 + np.arctan(2*b/(a-c))/2 - - -def ellipse_axis_length( a ): - b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0] - up = 2*(a*f*f+c*d*d+g*b*b-2*b*d*f-a*c*g) - down1=(b*b-a*c)*( (c-a)*np.sqrt(1+4*b*b/((a-c)*(a-c)))-(c+a)) - down2=(b*b-a*c)*( (a-c)*np.sqrt(1+4*b*b/((a-c)*(a-c)))-(c+a)) - - #TODO check this - cannot divide by 0 so just use a small number instead - if(down1 == 0): - down1 = .0000000001 - - if(down2 == 0): - down2 = .0000000001 - - res1=np.sqrt(up/down1) - res2=np.sqrt(up/down2) - return np.array([res1, res2]) - -def fit_ellipse(candidate_points): - - # method from http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html - points = np.array(candidate_points) - y,x = points.T - D = np.vstack([x*x, x*y, y*y, x, y, np.ones(len(y))]) - S = np.dot(D, D.T) - - C = np.zeros([6,6]) - C[0,2]= 2.0 - C[2,0]= 2.0 - C[1,1]= -1.0 - - M = np.dot(np.linalg.inv(S),C) - - U,s,V=np.linalg.svd(M) - - params = U.T[0] - - return ellipse_center(params), ellipse_angle_of_rotation(params)*180./np.pi, ellipse_axis_length(params) - -def rotate_vector(y,x,theta): - - xp = x*np.cos(theta) - y*np.sin(theta) - yp = x*np.sin(theta) + y*np.cos(theta) - - return yp,xp - -def test_fit(): - - import matplotlib - matplotlib.use('Agg') - import matplotlib.pyplot as plt - - x = np.linspace(-3.0,3.0,1000) - yp = np.sqrt(4.0 - (4.0/9.0)*(x**2)) - ym = -yp - - yp += 0.1*np.random.normal(size=len(yp)) - ym += 0.1*np.random.normal(size=len(yp)) - - yp, x1 = rotate_vector(yp,x,np.pi/8) - ym, x2 = rotate_vector(ym,x,np.pi/8) - - y_outlier = np.random.random(size=100)*4.0 - 2.0 - x_outlier = np.random.random(size=100)*6.0 - 3.0 - - - outlier_points = np.vstack([y_outlier, x_outlier]).T - - candidate_points = np.vstack([np.hstack([yp,ym]), np.hstack([x,x])]).T - - candidate_points = np.vstack([outlier_points, candidate_points]) - - yt, xt = candidate_points.T - print(xt) - - #center, angle, (axis1,axis2) = fit_ellipse(candidate_points) - - fe=FitEllipse(40,100,0.0001,40) - result = fe.ransac_fit(candidate_points) - if result!=None: - center, angle, (axis1,axis2) = fe.ransac_fit(candidate_points) - - print("center = ", center) - print("angle = ", angle) - print("axis1 = ", axis1) - print("axis2 = ", axis2) - - fig,ax=plt.subplots(1) - ax.plot(x,yp,'bo') - ax.plot(x,ym,'bo') - ax.plot(x_outlier, y_outlier, 'rx') - - from matplotlib.patches import Ellipse - el = Ellipse(center,width=2.0*axis1,height=2.0*axis2,angle=angle,fill=False,linewidth=3,color='r') - - ax.add_artist(el) - - - plt.show() - -if __name__=='__main__': - - test_fit() diff --git a/allensdk/internal/brain_observatory/frame_stream.py b/allensdk/internal/brain_observatory/frame_stream.py deleted file mode 100644 index 4723a75cd3..0000000000 --- a/allensdk/internal/brain_observatory/frame_stream.py +++ /dev/null @@ -1,334 +0,0 @@ -import subprocess as sp -import numpy as np -import logging -import sys, os -from collections import deque -import scipy.misc -import traceback -import signal - -class FrameInputStream( object ): - def __init__(self, movie_path, num_frames=None, block_size=1, cache_frames=False, process_frame_cb=None): - self.movie_path = movie_path - self.num_frames = num_frames - self.block_size = block_size - self.cache_frames = cache_frames - self.process_frame_cb = process_frame_cb if process_frame_cb else lambda f: f[:,:,0].copy() - - self.frames_read = 0 - self.frame_cache = [] - - def open(self): - self.frames_read = 0 - - def close(self): - logging.debug("Read total frames %d", self.frames_read) - - if self.num_frames is not None and self.frames_read != self.num_frames: - raise IOError("read incorrect number of frames: %d vs %d", self.frames_read, self.num_frames) - - def _error(self): - pass - - def _process_frame(self, frame): - return self.process_frame_cb(frame) - - def _read_iter(self): - pass - - def __enter__(self): - return self - - def __iter__(self): - # if we're caching frames and the cache exists, return it - if self.cache_frames and self.frame_cache: - n = self.num_frames if self.num_frames is not None else len(self.frame_cache) - for i in range(n): - yield self.frame_cache[i] - else: - self.open() - - self.frame_cache = [] - - for frame in self._read_iter(): - self.frame_cache.append(self._process_frame(frame)) - self.frames_read += 1 - - if (self.frames_read % 100) == 0: - logging.debug("Read frames %d", self.frames_read) - - if self.block_size is None: - continue - if self.block_size == 1: - yield self.frame_cache[-1] - elif (self.frames_read % self.block_size) == 0: - for i in range(-self.block_size,0): - yield self.frame_cache[i] - - if not self.cache_frames: - self.frame_cache = [] - - self.close() - - for frame in self.frame_cache: - yield frame - - if not self.cache_frames: - self.frame_cache = [] - - - def __exit__(self, exc_type, exc_value, tb): - if exc_value: - traceback.print_tb(tb) - self._error() - raise exc_value - - def create_images(self, output_directory, image_type): - for i, frame in enumerate(self): - file_name = os.path.join(output_directory, "input_frame-%06d." % i + image_type) - scipy.misc.imsave(file_name, frame) - - -class FfmpegInputStream( FrameInputStream ): - def __init__(self, movie_path, frame_shape, ffmpeg_bin='ffmpeg', num_frames=None, block_size=1, cache_frames=False, process_frame_cb=None): - super(FfmpegInputStream, self).__init__(movie_path=movie_path, num_frames=num_frames, block_size=block_size, cache_frames=cache_frames, process_frame_cb=process_frame_cb) - - self.ffmpeg_bin = ffmpeg_bin - self.frame_shape = frame_shape - - self.pipe = None - - def open(self): - super(FfmpegInputStream, self).open() - - if self.pipe: - raise IOError("pipe is open already") - - command = [ self.ffmpeg_bin, - '-i', self.movie_path, - '-f', 'image2pipe', - '-pix_fmt', 'rgb24', - '-vcodec', 'rawvideo'] - - if self.num_frames is not None: - command += ['-vframes', str(self.num_frames)] - - command += ['-'] - - frame_size = np.prod(self.frame_shape) - self.pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=0) - logging.debug("opened pipe") - - def close(self): - if self.pipe is None: - raise IOError("pipe is not open") - - if self.pipe.poll() is None: - logging.debug("pipe is still open. terminating.") - self.pipe.terminate() - - super(FfmpegInputStream, self).close() - - - rc = self.pipe.wait() - logging.debug("closed input pipe") - - if rc: - raise Exception("input pipe returned with error code %d" % rc) - - self.pipe = None - - def _process_frame(self, frame): - frame = np.fromstring(frame, dtype=np.uint8) - frame.resize(self.frame_shape) - return self.process_frame_cb(frame) - - def _read_iter(self): - if self.pipe is None: - raise IOError("pipe is not open") - - frame_size = np.prod(self.frame_shape) - - while self.pipe.poll() is None or self.pipe.stdout: - self.pipe.stdout.flush() - input_frame = self.pipe.stdout.read(frame_size) - - bytes_read = len(input_frame) - - if bytes_read == 0: - break - - if bytes_read != frame_size: - raise IOError("pipe read wrong number of bytes (%d vs %d)" % (frame_size, bytes_read)) - - yield input_frame - - def _error(self): - if self.pipe: - self.pipe.kill() - self.pipe = None - - def create_images(self, output_directory, image_type): - cmd = self.ffmpeg_bin + ' -i ' + self.movie_path + ' ' + output_directory + '/input_frame-%06d.' + image_type - - logging.debug("Calling ffmpeg with the command:") - logging.debug("\t"+cmd) - retcode = sp.call(cmd, shell=True) - if retcode != 0: - logging.debug(retcode) - raise Exception('Something went wrong with image creation') - - - -class CvInputStream( object): - def __init__(self, movie_path, num_frames=None, block_size=1, cache_frames=False): - super(FfmpegInputStream, self).__init__(movie_path=movie_path, num_frames=num_frames, block_size=block_size, cache_frames=cache_frames) - self.cap = None - - def open(self): - super(FfmpegInputStream, self).open() - - if self.cap: - raise IOError("capture is open already") - - self.frames_read = 0 - - import cv2 - self.cap = cv2.VideoCapture(self.movie_path) - logging.debug("opened capture") - - def close(self): - if self.cap is None: - return - - self.cap.release() - self.cap = None - - super(FfmpegInputStream, self).close() - - def _read_iter(self): - if self.cap is None: - raise IOError("capture is not open") - - while self.cap.isOpened(): - ret, frame = self.cap.read() - yield frame - - if self.frames_read == self.num_frames: - break - - def _error(self): - self.cap.release() - self.cap = None - -class FrameOutputStream( object ): - def __init__(self, block_size=1): - self.frames_processed = 0 - self.block_frames = [] - self.block_size = block_size - - def open(self, movie_path): - self.frames_processed = 0 - self.block_frames = [] - self.movie_path = movie_path - - def _write_frames(self, frames): - raise NotImplementedError() - - def write(self, frame): - self.block_frames.append(frame) - - if len(self.block_frames) == self.block_size: - self._write_frames(self.block_frames) - self.frames_processed += len(self.block_frames) - self.block_frames = [] - - def close(self): - if self.block_frames: - self._write_frames(self.block_frames) - self.frames_processed += len(self.block_frames) - self.block_frames = [] - - logging.debug("wrote %d frames", self.frames_processed) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - if exc_value: - raise exc_value - self.close() - -class ImageOutputStream( FrameOutputStream ): - def _write_frames(frames): - for i, frame in enumerate(frames): - file_name = self.movie_path % i - scipy.misc.imsave(file_name, frame) - - -class FfmpegOutputStream( FrameOutputStream ): - def __init__(self, frame_shape, ffmpeg_bin='ffmpeg', block_size=1): - super(FfmpegOutputStream, self).__init__(block_size) - - self.ffmpeg_bin = ffmpeg_bin - self.frame_shape = frame_shape - self.pipe = None - self.stopped = False - - def open(self, movie_path): - super(FfmpegOutputStream, self).open(movie_path) - - if self.pipe: - logging.warning("pipe is already open!") - return - - command = [ self.ffmpeg_bin, - '-y', - '-f', 'rawvideo', - '-vcodec', 'rawvideo', - '-s', '%dx%d' % (self.frame_shape[1], self.frame_shape[0]), - '-pix_fmt', 'rgb24', - '-r', '30', - '-i', '-', - '-an', - '-vcodec', 'libx264', - self.movie_path] - - self.pipe = sp.Popen(command, stdin=sp.PIPE) - os.kill(self.pipe.pid, signal.SIGSTOP) - self.stopped = True - logging.debug("opened output pipe") - - - def _write_frames(self, frames): - if self.pipe is None: - self.open(self.movie_path) - if self.stopped: - os.kill(self.pipe.pid, signal.SIGCONT) - self.stopped = False - - for frame in frames: - sys.stdout.flush() - self.pipe.stdin.write( frame.tostring() ) - - def close(self): - super(FfmpegOutputStream, self).close() - if self.pipe is None: - raise IOError("pipe is closed") - - self.pipe.stdin.close() - rc = self.pipe.wait() - - if rc: - raise Exception("output pipe returned with error code %d" % rc) - - logging.debug("closed output pipe") - self.pipe = None - - def __exit__(self, exc_type, exc_value, tb): - if exc_value: - self.pipe.kill() - raise exc_value - self.close() - - diff --git a/allensdk/internal/brain_observatory/itracker.py b/allensdk/internal/brain_observatory/itracker.py deleted file mode 100644 index 10f476257c..0000000000 --- a/allensdk/internal/brain_observatory/itracker.py +++ /dev/null @@ -1,810 +0,0 @@ -import numpy as np -import sys -import os -import subprocess as sp -from PIL import Image, ImageDraw -from scipy.misc import imsave -from scipy.signal import medfilt2d -import ast -import json - -from fit_ellipse import fit_ellipse, FitEllipse -from itracker_utils import generate_rays, initial_pupil_point, initial_cr_point, sobel_grad -import logging - -import matplotlib.pyplot as plt - -# import cv2 - -color_list = ['b','g','r','c','m','y','k'] - -class iTracker (object): - def __init__(self, output_folder, - im_shape, num_frames, - input_stream, - threshold_factor=1.3, auto=True, - cutoff_pixels=10, - bbox_pupil=None, - bbox_cr=None): - - self.im_shape = im_shape - self.num_frames = num_frames - self.movie_shape = (num_frames, im_shape[0], im_shape[1]) - self.input_stream = input_stream - - self.threshold_factor = threshold_factor - self.auto = auto - self.folder = output_folder - self.cutoff_pixels = cutoff_pixels - self.bbox_pupil = bbox_pupil - self.bbox_cr = bbox_cr - - self._mean_frame = None - - if not os.path.exists(self.folder): - os.mkdir(self.folder) - - self.run_params_file = os.path.join(self.folder, 'run_params.json') - self.run_params = { 'threshold_factor': threshold_factor, - 'auto': auto, - 'cutoff_pixels': cutoff_pixels, - 'movie_shape': self.movie_shape, - 'im_shape': im_shape, - 'bbox_pupil': bbox_pupil, - 'bbox_cr': bbox_cr } - with open(self.run_params_file, 'w') as f: - f.write(json.dumps(self.run_params)) - - self.movie_path_storage_file = os.path.join(self.folder, 'movie_path.txt') - if os.path.exists(self.movie_path_storage_file): - with open(self.movie_path_storage_file, 'r') as f: - self.movie_path = f.read() - else: - self.movie_path = None - - self.input_image_folder = os.path.join(self.folder, 'input_images') - if not os.path.exists(self.input_image_folder): - os.mkdir(self.input_image_folder) - - self.results_folder = os.path.join(self.folder,'results') - - if not os.path.exists(self.results_folder): - os.mkdir(self.results_folder) - - # self.rays_folder = os.path.join(self.results_folder,'rays') - # if not os.path.exists(self.rays_folder): - # os.mkdir(self.rays_folder) - - self.qc_folder = os.path.join(self.results_folder,'qc') - if not os.path.exists(self.qc_folder): - os.mkdir(self.qc_folder) - - self.frames_folder = os.path.join(self.results_folder,'output_frames') - if not os.path.exists(self.frames_folder): - os.mkdir(self.frames_folder) - - self.pupil_file = os.path.join(self.results_folder, 'pupil_params.npy') - self.cr_file = os.path.join(self.results_folder, 'cr_params.npy') - self.mean_frame_file = os.path.join(self.results_folder, 'mean_frame.npy') - self.annotated_movie_file = os.path.join(self.results_folder, 'annotated_movie.mp4') - - # add variables to determine whether to provide diagnostic, QC and other output - # method to regnerate image frames, with or without results? - - - # fix this so it sets an absolute path - def set_movie(self, file_path): - logging.debug("Setting movie_path to: %s", file_path) - self.movie_path = file_path - with open(self.movie_path_storage_file, 'w') as f: - f.write(self.movie_path) - - def set_bbox_pupil(self, bbox): - self.bbox_pupil = bbox - self.run_params['bbox_pupil']=self.bbox_pupil - with open(self.run_params_file, 'w') as f: - f.write(json.dumps(self.run_params)) - - def set_bbox_cr(self, bbox): - self.bbox_cr = bbox - self.run_params['bbox_cr']=self.bbox_cr - with open(self.run_params_file, 'w') as f: - f.write(json.dumps(self.run_params)) - - def create_input_images(self, image_type='png'): - self.input_stream.create_images(self.input_image_folder, image_type) - - @property - def mean_frame(self): - if self._mean_frame is None: - self._mean_frame = self.compute_mean_frame() - return self._mean_frame - - @mean_frame.setter - def mean_frame(self, mean_frame): - self._mean_frame = mean_frame - - def estimate_bbox_from_mean_frame(self, margin=75, image_type='png'): - try: - import keras - except ImportError: - logging.debug("keras failed to import. Returning None for bbox_pupil and bbox_cr") - return None, None - - from keras.applications import InceptionV3 - - logging.debug("Estimating bbox parameters from 'mean_frame'") - # compute the representation for mean_frame - model = InceptionV3(include_top=False, weights='imagenet') - # print(self.mean_frame.dtype, self.mean_frame.shape) - mp_temp = self.mean_frame.astype(np.float32) - mp_temp -= 128 - mp_temp /= 128 - rep = model.predict(mp_temp.reshape((1,)+mp_temp.shape)) # shape (1,13,18,2048) - rep[rep<0]=0 - rep = np.mean(rep, axis=(0,1,2)) # shape (2048,) - - # load regression weights - module_folder = os.path.dirname(os.path.abspath(__file__)) - W_pupil = np.load(os.path.join(module_folder,'resources','pupil_weights.npy')) # shape (2048, 5) - W_cr = np.load(os.path.join(module_folder,'resources','cr_weights.npy')) # shape (2048, 5) - - estimated_pupil_point = np.dot(rep, W_pupil) # shape (5,) - estimated_cr_point = np.dot(rep, W_cr) # shape (5,) - - x_pupil, y_pupil = estimated_pupil_point[:2]*np.array([640,480]) - x_pupil = int(x_pupil) - y_pupil = int(y_pupil) - logging.debug("estimated pupil point is ({0},{1})".format(x_pupil,y_pupil)) - print("estimated pupil point is ({0},{1})".format(x_pupil,y_pupil)) - # bbox is xmin, xmax, ymin, ymax - # x, y = 320, 240 - bbox_pupil = [x_pupil-margin, x_pupil+margin, y_pupil-margin, y_pupil+margin] - - x_cr, y_cr = estimated_cr_point[:2] - x_cr = int(x_cr) - y_cr = int(y_cr) - logging.debug("estimated cr point is ({0},{1})".format(x_cr,y_cr)) - print("estimated cr point is ({0},{1})".format(x_cr,y_cr)) - - # bbox is xmin, xmax, ymin, ymax - bbox_cr = [x_cr-margin, x_cr+margin, y_cr-margin, y_cr+margin] - # bbox_cr = None - - # plot bbox on mean_frame for QC check - mean_frame_annotated = np.dstack([self.mean_frame, self.mean_frame, self.mean_frame]) - mean_frame_annotated = self.annotate_frame_with_bbox(mean_frame_annotated,pupil_bbox=bbox_pupil,cr_bbox=bbox_cr) - mean_frame_annotated = self.annotate_frame_with_point(mean_frame_annotated,pupil=(x_pupil, y_pupil),cr=(x_cr, y_cr)) - - dpi = 100.0 - fig, ax = plt.subplots(figsize=(mean_frame.shape[1]/dpi, mean_frame.shape[0]/dpi)) - fig.subplots_adjust(left=0,right=1,bottom=0,top=1) - - ax.imshow(mean_frame_annotated, aspect='normal') - ax.axis('off') - fig.savefig(os.path.join(self.qc_folder, 'mean_frame_annotated.'+image_type), dpi=dpi) - - self.bbox_pupil = bbox_pupil - self.bbox_cr = bbox_cr - - return bbox_pupil, bbox_cr - - def compute_mean_frame(self, image_file_type='png'): - logging.debug("computing mean frame") - - mean_frame = np.zeros(self.im_shape) - - frames_read = 0 - for input_frame in self.input_stream: - mean_frame += input_frame - frames_read += 1 - - mean_frame /= frames_read - mean_frame = mean_frame.astype(np.uint8) - - np.save(self.mean_frame_file, mean_frame) - - dpi = 100.0 - fig, ax = plt.subplots(figsize=(mean_frame.shape[1]/dpi, mean_frame.shape[0]/dpi)) - fig.subplots_adjust(left=0,right=1,bottom=0,top=1) - ax.imshow(mean_frame, aspect='normal', cmap='gray') - ax.axis('off') - fig.savefig(os.path.join(self.qc_folder, 'mean_frame.' + image_file_type), dpi=dpi) - plt.close() - - if self.bbox_cr and self.bbox_pupil: - mean_frame_annotated = np.dstack([mean_frame,mean_frame,mean_frame]) - mean_frame_annotated = self.annotate_frame_with_bbox(mean_frame_annotated,pupil_bbox=self.bbox_pupil,cr_bbox=self.bbox_cr) - - fig, ax = plt.subplots(figsize=(mean_frame.shape[1]/dpi, mean_frame.shape[0]/dpi)) - fig.subplots_adjust(left=0,right=1,bottom=0,top=1) - ax.imshow(mean_frame_annotated, aspect='normal') - ax.axis('off') - fig.savefig(os.path.join(self.qc_folder, 'mean_frame_bbox.' + image_file_type), dpi=dpi) - plt.close() - - return mean_frame - - - - def detect_eye_closed(self): - - try: - import keras - except ImportError: - logging.debug("keras failed to import. Can't detect eye closure") - return None - - from keras.applications import InceptionV3 - - logging.debug("Detecting eye closed frames") - # compute the representation for mean_frame - model = InceptionV3(include_top=False, weights='imagenet') - # print(self.mean_frame.dtype, self.mean_frame.shape) - - # get pre-trained svm - from sklearn.externals import joblib - module_folder = os.path.dirname(os.path.abspath(__file__)) - svm = joblib.load(os.path.join(module_folder, 'resources','svm_trained.pkl')) - - def compute_rep(frame): - mp_temp = frame.astype(np.float32) - mp_temp -= 128 - mp_temp /= 128 - rep = model.predict(mp_temp.reshape((1,)+mp_temp.shape)) # shape (1,13,18,2048) - rep[rep<0]=0 - rep = np.mean(rep, axis=(0,1,2)) # shape (2048,) - - return rep - - is_closed = np.zeros(self.num_frames) - - for input_frame in self.input_stream: - rep = compute_rep(input_frame) - is_closed[i] = svm.predict(rep.reshape(-1,len(rep)))[0] - - self.is_closed = is_closed - save_path = os.path.join(self.results_folder, 'is_closed.npy') - - logging.debug("Saving is_closed to:") - logging.debug("\t%s", save_path) - # - np.save(save_path, self.is_closed) - - return is_closed - - def process_movie(self, movie_output_stream=None, - output_frames=False, - output_annotation_frames=False, - image_file_type = 'jpg' ): - - # these aren't really used yet. - # self.pupil_loc = (0,0) - # self.cr_loc = (0,0) - - self.pupil_params = np.zeros([self.num_frames, 5]) - self.cr_params = np.zeros([self.num_frames, 5]) - - if movie_output_stream: - movie_output_stream.open(self.annotated_movie_file) - else: - movie_output_stream = None - - if output_frames: - frame_output_stream = ImageOutputStream() - frame_output_stream.open(os.path.join(self.input_image_folder, 'input_frame-%06d.'+image_file_type)) - else: - frame_output_stream = None - - if output_annotation_frames: - annotation_frame_output_stream = ImageOutputStream() - annotation_frame_output_stream.open(os.path.join(self.frames_folder, 'output_frame-%06d.'+image_file_type)) - else: - annotation_frame_output_stream = None - - for i, input_frame in enumerate(self.input_stream): - # get pupil and corneal reflection parameters, this line is the actual eye tracking algorithm - pupil, cr = self.process_image(input_frame, bbox_pupil=self.bbox_pupil, bbox_cr=self.bbox_cr) - - pupil_params = (pupil[0][0],pupil[0][1],pupil[1],pupil[2][0],pupil[2][1]) - cr_params = (cr[0][0],cr[0][1],cr[1],cr[2][0],cr[2][1]) - - if frame_output_stream: - frame_output_stream.write(input_frame) - - if movie_output_stream or annotation_frame_output_stream: - annotated_frame = self.annotate_frame(np.dstack([input_frame,input_frame,input_frame]), - pupil_params, - cr_params) - - if movie_output_stream: - movie_output_stream.write( annotated_frame ) - - if annotation_frame_output_stream: - annotation_frame_output_stream.write( annotated_frame ) - - # save results in arrays - self.pupil_params[i] = (pupil[0][0],pupil[0][1],pupil[1],pupil[2][0],pupil[2][1]) - self.cr_params[i] = (cr[0][0],cr[0][1],cr[1],cr[2][0],cr[2][1]) - - if i % 100 == 0: - logging.debug("tracked frame %d", i) - - logging.debug("Saving pupil and cr parameters to:") - logging.debug("\t%s", self.pupil_file) - logging.debug("\t%s", self.cr_file) - # - np.save(self.pupil_file, self.pupil_params) - np.save(self.cr_file, self.cr_params) - - if movie_output_stream: - movie_output_stream.close() - - if frame_output_stream: - frame_output_stream.close() - - if annotation_frame_output_stream: - annotation_frame_output_stream.close() - - # return mean_frame - - def clear_input_images(self): - logging.debug("Deleting input image folder") - shutil.rmtree(os.path.join(self.folder, 'input_images')) - - def process_image(self, im, bbox_pupil=None, bbox_cr=None): - # let's try median filtering the image first - im = medfilt2d(im, kernel_size=3) - - # find pupil and corneal reflection if auto==True - if self.auto: - self.pupil_loc = initial_pupil_point(im, bbox=bbox_pupil) - self.cr_loc = initial_cr_point(im, bbox=bbox_cr) - - - # find rays projecting from seed point - pupil_rays, pupil_ray_values = generate_rays(im,self.pupil_loc) - - # save values for analysis - self.pupil_rays = pupil_rays - self.pupil_ray_values = pupil_ray_values - - # code for finding pupil ellipse, start with candidate points from rays - pupil_candidate_points = self.get_candidate_points(self.pupil_rays,self.pupil_ray_values,self.threshold_factor,above_threshold=True) - - # fit pupil ellipse with all candidate points - #pupil_params = fit_ellipse(pupil_candidate_points) - - # fit pupil ellipse with ransac algorithm - fe=FitEllipse(10,10,0.0001,4) - result = fe.ransac_fit(pupil_candidate_points) - - # if np.any(np.isnan(result)): #should use np.any(np.isnan(result)) - # pupil_params = result #fe.ransac_fit(pupil_candidate_points) - # else: - # pupil_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) # np.nan*np.ones(5) - - - if result!=None: #should use np.any(np.isnan(result)) - pupil_params = result #fe.ransac_fit(pupil_candidate_points) - else: - logging.debug("No good fit found") - pupil_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) # np.nan*np.ones(5) - - - # code for finding corneal reflection, start with finding rays from center of cr - cr_rays, cr_ray_values = generate_rays(im,self.cr_loc) - - self.cr_rays = cr_rays - self.cr_ray_values = cr_ray_values - - cr_candidate_points = self.get_candidate_points(self.cr_rays,self.cr_ray_values,0.75,above_threshold=False) - - try: - #cr_params = fit_ellipse(cr_candidate_points) - fe=FitEllipse(10,10,0.0001,4) - result = fe.ransac_fit(cr_candidate_points) - - if result!=None: - cr_params = result #fe.ransac_fit(cr_candidate_points) - else: - logging.debug("No good fit found") - cr_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) - except Exception as e: - logging.error("Error during fit: %s", e.message) - cr_params = ((np.nan,np.nan),np.nan,(np.nan,np.nan)) - - # update instance variables - if not np.isnan(pupil_params[0][0]): #should use np.any(np.isnan(result)) - self.pupil_loc = (int(pupil_params[0][1]),int(pupil_params[0][0])) - - self.pupil_candidate_points = pupil_candidate_points - self.cr_candidate_points = cr_candidate_points - - return pupil_params, cr_params - - def get_candidate_points(self,rays,ray_values,threshold_f,above_threshold=True): - - candidate_points = [] - # find candidate points for ellipse from threshold crossing of the image over the rays - for i, ray in enumerate(rays): - - sample_ray = ray_values[i][:self.cutoff_pixels] - threshold = threshold_f*np.mean(sample_ray) - - for t,g in enumerate(ray_values[i][self.cutoff_pixels:]): - if above_threshold: - if g > threshold: - new_point = ray.T[t+self.cutoff_pixels] - candidate_points += [new_point] - break - else: - if g < threshold: - new_point = ray.T[t+self.cutoff_pixels] - candidate_points += [new_point] - break - - return candidate_points - - def set_seed_points(self, initial_pupil_x, initial_pupil_y, initial_cr_x, initial_cr_y): - self.initial_pupil_x = initial_pupil_x - self.initial_pupil_y = initial_pupil_y - self.initial_cr_x = initial_cr_x - self.initial_cr_y = initial_cr_y - - def process_all_images(self): - """ deprecated """ - - # these aren't really used yet. - self.pupil_loc = (0,0) - self.cr_loc = (0,0) - - frame_list = os.listdir(self.input_image_folder) - num_frames = len(frame_list) - - self.pupil_params = np.zeros([num_frames, 5]) - self.cr_params = np.zeros([num_frames, 5]) - - for i,frame in enumerate(frame_list): - logging.debug("Processing frame %d", i) - if frame[-4:]!='.jpg' and frame[-4:]!='.png': continue # just in case some OS specific files snuck in (like in OS X) - frame_path = os.path.join(self.input_image_folder,frame) - - # open Image, convert to gray scale and then to numpy array - im = Image.open(frame_path) - im = im.convert('L') - im = np.array(im) - - - # get pupil and corneal reflection parameters, this line is the actual eye tracking algorithm - pupil, cr = self.process_image(im) - - # save results in arrays - self.pupil_params[i] = (pupil[0][0],pupil[0][1],pupil[1],pupil[2][0],pupil[2][1]) - self.cr_params[i] = (cr[0][0],cr[0][1],cr[1],cr[2][0],cr[2][1]) - - logging.debug("Saving pupil and cr parameters to:") - logging.debug("\t%s", self.pupil_file) - logging.debug("\t%s", self.cr_file) - - np.save(self.pupil_file, self.pupil_params) - np.save(self.cr_file, self.cr_params) - - - @staticmethod - def rotate(X, Y, center_x, center_y, theta): - - Xp = (X-center_x)*np.cos(theta) - (Y-center_y)*np.sin(theta) + center_x - Yp = (X-center_x)*np.sin(theta) + (Y-center_y)*np.cos(theta) + center_y - - return Xp, Yp - - @staticmethod - def get_ellipse_mask(X, Y, params): - - center_x, center_y, theta, axis1, axis2 = params - - dX = X - center_x - dY = Y - center_y - - theta = theta*np.pi/180. - - Xp = dX*np.cos(theta) + dY*np.sin(theta) - Yp = -dX*np.sin(theta) + dY*np.cos(theta) - - mask1 = (Xp/axis1)**2 + (Yp/axis2)**2 < 1 + 0.1 - mask2 = (Xp/axis1)**2 + (Yp/axis2)**2 > 1 - 0.1 - - mask = np.logical_and(mask1, mask2) - - return mask - - def annotate_frame_old(self, im, pupil=None, cr=None): - - y, x, c = im.shape - - X, Y = np.meshgrid(np.arange(x), np.arange(y)) - - # pupil in red - if pupil is not None: - pupil_mask = self.get_ellipse_mask(X, Y, pupil) - im.T[0].T[pupil_mask] = 255 - im.T[1].T[pupil_mask] = 0 - im.T[2].T[pupil_mask] = 0 - - # cr in blue - if cr is not None: - cr_mask = self.get_ellipse_mask(X, Y, cr) - im.T[0].T[cr_mask] = 0 - im.T[1].T[cr_mask] = 0 - im.T[2].T[cr_mask] = 255 - - return im - - @classmethod - def ellipse_points_from_params(cls, params): - center_x, center_y, theta, axis1, axis2 = params - theta = theta*np.pi/180. # convert to radians - - points_x = np.array([ axis1*np.cos(phi) + center_x for phi in np.linspace(0,2*np.pi, 1000)]) - points_y = np.array([ axis2*np.sin(phi) + center_y for phi in np.linspace(0,2*np.pi, 1000)]) - - points_x, points_y = cls.rotate(points_x, points_y, center_x, center_y, theta) - - return points_x, points_y - - def annotate_frame(self, im, pupil=None, cr=None): - - y, x, c = im.shape - - im_pil = Image.fromarray(im) - - draw = ImageDraw.Draw(im_pil) - - if pupil is not None: - points_x, points_y = self.ellipse_points_from_params(pupil) - draw.point(zip(points_x, points_y), fill=(255,0,0)) - # for i, px in enumerate(points_x): - # im[int(points_y[i]), int(px), 0] = 255 - - if cr is not None: - points_x, points_y = self.ellipse_points_from_params(cr) - draw.point(zip(points_x, points_y), fill=(0,0,255)) - # for i, px in enumerate(points_x): - # im[int(points_y[i]), int(px), 0] = 255 - - # return im - return np.array(im_pil) - - def annotate_frame_with_bbox(self, im, pupil_bbox=None, cr_bbox=None): - - # y, x, c = im.shape - - im_pil = Image.fromarray(im) - - draw = ImageDraw.Draw(im_pil) - - if pupil_bbox is not None: - xmin, xmax, ymin, ymax = pupil_bbox - # print(pupil_bbox) - draw.rectangle([xmin,ymin,xmax,ymax],outline=(255,0,0)) - - # for i, px in enumerate(points_x): - # im[int(points_y[i]), int(px), 0] = 255 - - if cr_bbox is not None: - # print(cr_bbox) - xmin, xmax, ymin, ymax = cr_bbox - draw.rectangle([xmin,ymin,xmax,ymax],outline=(0,0,255)) - # for i, px in enumerate(points_x): - # im[int(points_y[i]), int(px), 0] = 255 - - # return im - return np.array(im_pil) - - def annotate_frame_with_point(self, im, pupil=None, cr=None): - - # y, x, c = im.shape - - # print(im.shape, im.dtype) - - im_pil = Image.fromarray(im) - - draw = ImageDraw.Draw(im_pil) - - if pupil is not None: - # points_x, points_y = ellipse_points_from_params(pupil) - # draw.point(pupil, fill=(255,0,0)) - draw.ellipse([pupil[0]-5,pupil[1]-5,pupil[0]+5,pupil[1]+5],fill=(255,0,0)) - # for i, px in enumerate(points_x): - # im[int(points_y[i]), int(px), 0] = 255 - - if cr is not None: - # points_x, points_y = ellipse_points_from_params(cr) - # draw.point(cr, fill=(0,0,255)) - draw.ellipse([cr[0]-5,cr[1]-5,cr[0]+5,cr[1]+5],fill=(0,0,255)) - # for i, px in enumerate(points_x): - # im[int(points_y[i]), int(px), 0] = 255 - - # return im - return np.array(im_pil) - - @staticmethod - def get_frame_index(frame_name): - - return int(frame_name[12:-4])-1 # change 7 to 12 - - # def annotate_frame(self, frame, im, pupil, cr): - # # this function is not done yet - # frame_index = self.get_frame_index(frame) - # - # new_im = im.copy() - # pupil = self.pupil_params[frame_index] - # cr = self.cr_params[frame_index] - # new_im = self.annotate_frame(new_im, pupil, cr) - # - # im_fig.set_data(new_im) - # - # fig.savefig(os.path.join(self.frames_folder, input_frame), dpi=100) - - def output_annotation(self, frames_to_output=None): - """generate a the series of images with eyetracking results superimposed""" - - fig, ax = plt.subplots(figsize=(4,3)) #, frameon=False) - fig.subplots_adjust(left=0,right=1,bottom=0,top=1) - - ax.axis('off') - # ax.axis('tight') - - self.pupil_params = np.load(self.pupil_file) - self.cr_params = np.load(self.cr_file) - - if frames_to_output is None: - frames_to_output = os.listdir(self.input_image_folder) - - first_frame = frames_to_output[0] - - frame_index = self.get_frame_index(first_frame) - im = Image.open(os.path.join(self.input_image_folder, first_frame)) - im = np.array(im) - - new_im = np.dstack([im,im,im]) - pupil = self.pupil_params[frame_index] - cr = self.cr_params[frame_index] - new_im = self.annotate_frame(new_im, pupil, cr) - - im_fig = ax.imshow(new_im, aspect='normal') #extent=(0,1,1,0) - - fig.savefig(os.path.join(self.frames_folder, first_frame), dpi=100) - - for input_frame in frames_to_output[1:]: - - frame_index = self.get_frame_index(input_frame) - im = Image.open(os.path.join(self.input_image_folder, input_frame)) - im = np.array(im) - - new_im = np.dstack([im,im,im]) - pupil = self.pupil_params[frame_index] - cr = self.cr_params[frame_index] - new_im = self.annotate_frame(new_im, pupil, cr) - - im_fig.set_data(new_im) - - fig.savefig(os.path.join(self.frames_folder, input_frame), dpi=100) - - def output_QC(self, image_type='png'): - """generate a set of summary statistics and plots for QC purposes""" - - logging.debug("saving QC images") - self.pupil_params = np.load(self.pupil_file) - self.cr_params = np.load(self.cr_file) - - logging.debug("saving pupil position") - fig, ax = plt.subplots(1) - ax.plot(self.pupil_params.T[0], label='pupil x') - ax.plot(self.pupil_params.T[1], label='pupil y') - ax.set_xlabel('frame index') - ax.set_title('pupil position') - ax.legend() - fig.savefig(os.path.join(self.qc_folder, 'pupil_position.'+image_type)) - - logging.debug("saving cr position") - fig, ax = plt.subplots(1) - ax.plot(self.cr_params.T[0], label='cr x') - ax.plot(self.cr_params.T[1], label='cr y') - ax.set_xlabel('frame index') - ax.set_title('CR position') - ax.legend() - fig.savefig(os.path.join(self.qc_folder, 'cr_position.'+image_type)) - - logging.debug("saving pupil axes") - fig, ax = plt.subplots(1) - ax.plot(self.pupil_params.T[3], label='pupil axis 1') - ax.plot(self.pupil_params.T[4], label='pupil axis 2') - ax.set_xlabel('frame index') - ax.set_title('Pupil major and minor axis size') - ax.legend() - fig.savefig(os.path.join(self.qc_folder, 'pupil_axes.'+image_type)) - - logging.debug("saving cr major/minor axis") - fig, ax = plt.subplots(1) - ax.plot(self.cr_params.T[3], label='cr axis 1') - ax.plot(self.cr_params.T[4], label='cr axis 2') - ax.set_xlabel('frame index') - ax.set_title('CR major and minor axis size') - ax.legend() - fig.savefig(os.path.join(self.qc_folder, 'cr_axes.'+image_type)) - - logging.debug("saving pupil angle") - fig, ax = plt.subplots(1) - ax.plot(self.pupil_params.T[2], label='pupil angle') - ax.set_xlabel('frame index') - ax.set_title('pupil major axis angle') - ax.legend() - fig.savefig(os.path.join(self.qc_folder, 'pupil_angle.'+image_type)) - - logging.debug("saving cr angle") - fig, ax = plt.subplots(1) - ax.plot(self.cr_params.T[2], label='cr angle') - ax.set_xlabel('frame index') - ax.set_title('corneal reflection major axis angle') - ax.legend() - fig.savefig(os.path.join(self.qc_folder, 'cr_angle.'+image_type)) - - - logging.debug("computing density") - # the remainder of these take a *very* long time - T = self.pupil_params.shape[0] - y, x = self.im_shape - - mean_frame = np.dstack([self.mean_frame,self.mean_frame,self.mean_frame]) - pupil_density = np.zeros((y, x, 3)) - # pupil_all = 255*np.ones(pupil_density.shape, np.uint8) - # pupil_all = np.stack([mean_frame, mean_frame, mean_frame], axis=2) - pupil_all = mean_frame.copy() - - cr_density = np.zeros((y, x, 3)) - # cr_all = 255*np.ones(cr_density.shape, np.uint8) - # cr_all = np.stack([mean_frame, mean_frame, mean_frame], axis=2) - cr_all = mean_frame.copy() - temp = np.zeros((y,x,3), dtype=np.uint8) - for t in range(T): - if t % 100 == 0: - logging.debug("finished %d frames", t) - ptemp = self.annotate_frame(temp.copy(), self.pupil_params[t]) - pupil_density += ptemp #, self.cr_params[t]) - pupil_all = self.annotate_frame(pupil_all, self.pupil_params[t]) - - crtemp = self.annotate_frame(temp.copy(), cr=self.cr_params[t]) - cr_density += crtemp #, self.cr_params[t]) - cr_all = self.annotate_frame(cr_all, cr=self.cr_params[t]) - - logging.debug("plotting pupil density") - fig, ax = plt.subplots(1) - ax.imshow(np.log(1+pupil_density[:,:,0]), cmap='Greys', interpolation='nearest') - # ax.axis('off') - ax.set_title('Pupil ellipse density') - fig.savefig(os.path.join(self.qc_folder, 'pupil_density.'+image_type)) - - - logging.debug("plotting pupil all") - fig, ax = plt.subplots(1) - ax.imshow(pupil_all, cmap='Greys', interpolation='nearest') - # ax.axis('off') - ax.set_title('All pupil ellipses combined') - fig.savefig(os.path.join(self.qc_folder, 'pupil_all_plot.'+image_type)) - - logging.debug("plotting cr density") - fig, ax = plt.subplots(1) - ax.imshow(np.log(1+cr_density[:,:,2]), cmap='Greys', interpolation='nearest') - # ax.axis('off') - ax.set_title('CR ellipse density') - fig.savefig(os.path.join(self.qc_folder, 'cr_density.'+image_type)) - - logging.debug("plotting cr all") - fig, ax = plt.subplots(1) - ax.imshow(cr_all, cmap='Greys', interpolation='nearest') - ax.set_title('All CR ellipses combined') - # ax.axis('off') - fig.savefig(os.path.join(self.qc_folder, 'cr_all_plot.'+image_type)) - diff --git a/allensdk/internal/brain_observatory/itracker_utils.py b/allensdk/internal/brain_observatory/itracker_utils.py deleted file mode 100644 index e3d5e2770f..0000000000 --- a/allensdk/internal/brain_observatory/itracker_utils.py +++ /dev/null @@ -1,268 +0,0 @@ -import numpy as np -from scipy.signal import correlate2d -from scipy.signal import fftconvolve -from scipy.ndimage.filters import sobel -import logging - -def default_ray(n): - - y = np.zeros(n,dtype=np.int64) - x = np.arange(n,dtype=np.int64) - - return np.vstack([y,x]) - -def rotate_ray(ray,theta): - - y,x = ray.astype(np.float64) - - xp = x*np.cos(theta) + y*np.sin(theta) - yp = -x*np.sin(theta) + y*np.cos(theta) - - return np.vstack([yp.astype(np.int64),xp.astype(np.int64)]) - -def generate_rays(image_array, seed_pixel): - - N = 18 #200 - - #mag, grad_x, grad_y = sobel_grad(image_array.astype('float')) - - shape = image_array.shape - Y,X = np.mgrid[:shape[1],:shape[0]] - - n = int(np.sqrt(shape[0]**2 + shape[1]**2)) - angles = np.arange(N)*2.0*np.pi/N - rays = [] - - tangents = [] - - ray_grads = [] - - good_coords_mask = lambda y,x: np.logical_and(np.logical_and(y>=0,y<shape[0]),np.logical_and(x>=0,x<shape[1])) - - for theta in angles: - new_ray = rotate_ray(default_ray(n),theta) - new_ray = new_ray.T + seed_pixel - new_ray = new_ray.T - - - mask = good_coords_mask(new_ray[0],new_ray[1]) - - ym = new_ray[0][mask] - xm = new_ray[1][mask] - - rays += [np.vstack([ym,xm])] - - t = np.array([np.sin(theta),np.cos(theta)]) - tangents += [t] - - #rg = t[1]*grad_x[ym,xm] + t[0]*grad_y[ym,xm] - #rg[rg<0] = 0.0 - rg = image_array[ym,xm] - #rg = rg[1:].astype(np.float64) - rg[:-1].astype(np.float64) - # rg[rg<0] = 0.0 - ray_grads += [rg] - - - return rays, ray_grads - -def initial_pupil_point(image_array, bbox=None): - """bbox is a tuple of (xmin, xmax, ymin, ymax)""" - - if bbox is not None: - xmin, xmax, ymin, ymax = bbox - crop_im = image_array[ymin:ymax, xmin:xmax] - else: - shape = image_array.shape - crop_distance = 50 - crop_im = image_array[crop_distance:shape[0]-crop_distance, crop_distance:shape[1]-crop_distance] - - m = np.max(crop_im) - - dark_square = m*np.ones([30,30]) - #c = correlate2d(m-crop_im,dark_square,mode='same') - c = fftconvolve(m-crop_im,dark_square[::-1,::-1],mode='same') - y,x = np.where(c==np.max(c)) - - if bbox is not None: - ybar=int(np.mean(y))+ymin - xbar=int(np.mean(x))+xmin - else: - ybar=int(np.mean(y))+crop_distance - xbar=int(np.mean(x))+crop_distance - - return ybar, xbar - -def initial_cr_point(image_array, bbox=None): - """bbox is a tuple of (xmin, xmax, ymin, ymax)""" - - if bbox is not None: - xmin, xmax, ymin, ymax = bbox - crop_im = image_array[ymin:ymax, xmin:xmax] - else: - shape = image_array.shape - crop_distance = 50 - crop_im = image_array[crop_distance:shape[0]-crop_distance, crop_distance:shape[1]-crop_distance] - - m = np.max(crop_im) - mean = np.mean(crop_im) - - Y,X = np.meshgrid(np.arange(-20,20),np.arange(-20,20)) - bright_circle = np.zeros([40,40]) - mask = X**2 + Y**2 < 100. - bright_circle[mask] = m - bright_circle -= np.mean(bright_circle) - - #c = correlate2d(crop_im-mean,bright_circle,mode='same') - c = fftconvolve(crop_im-mean,bright_circle[::-1,::-1],mode='same') - y,x = np.where(c==np.max(c)) - - if bbox is not None: - ybar=int(np.mean(y))+ymin - xbar=int(np.mean(x))+xmin - else: - ybar=int(np.mean(y))+crop_distance - xbar=int(np.mean(x))+crop_distance - - return ybar, xbar - -def sobel_grad(image_array): - - grad_y = sobel(image_array.astype(np.float64),0) - grad_x = sobel(image_array.astype(np.float64),1) - - #print "grad_x dtype = ", grad_x.dtype - - mag = np.sqrt(grad_y**2 + grad_x**2) + 1e-16 - - return mag, grad_x, grad_y - -def medfilt_custom(x, kernel_size=3): - '''This median filter returns 'nan' whenever any value in the kernal width is 'nan' and the median otherwise''' - T = x.shape[0] - delta = kernel_size/2 - - x_med = np.zeros(x.shape) - window = x[0:delta+1] - if np.any(np.isnan(window)): - x_med[0] = np.nan - else: - x_med[0] = np.median(window) - - # print window - for t in range(1,T): - window = x[t-delta:t+delta+1] - # print window - if np.any(np.isnan(window)): - x_med[t] = np.nan - else: - x_med[t] = np.median(window) - - return x_med - -def eccentricity(a1, a2): - - return np.sqrt(1.0 - (np.minimum(a1,a2)**2)/(np.maximum(a1,a2)**2)) - -def median_absolute_deviation(a, consistency_constant=1.4826): - '''Calculate the median absolute deviation of a univariate dataset. - - Parameters - ---------- - a : numpy.ndarray - Sample data. - consistency_constant : float - Constant to make the MAD a consistent estimator of the population - standard deviation (1.4826 for a normal distribution). - - Returns - ------- - float - Median absolute deviation of the data. - ''' - return consistency_constant * np.nanmedian(np.abs(a - np.nanmedian(a))) - -def post_process_cr(cr_params): - """This will replace questionable values of the CR x and y position with 'nan' - - 1) threshold ellipse area by 99th percentile area distribution - 2) median filter using custom median filter - 3) remove deviations from discontinuous jumps - - The 'nan' values likely represent obscured CRs, secondary reflections, merges - with the secondary reflection, or visual distortions due to the whisker or - deformations of the eye""" - - area = np.pi*cr_params.T[3]*cr_params.T[4] - - # compute a threshold on the area of the cr ellipse - dev = median_absolute_deviation(area) - if dev == 0: - logging.warning("Median absolute deviation is 0," - "falling back to standard deviation.") - dev = np.nanstd(area) - threshold = np.nanmedian(area) + 3*dev - - x_center = cr_params.T[0] - y_center = cr_params.T[1] - - # set x,y where area is over threshold to nan - x_center[area>threshold] = np.nan - y_center[area>threshold] = np.nan - - # median filter - x_center_med = medfilt_custom(x_center, kernel_size=3) - y_center_med = medfilt_custom(y_center, kernel_size=3) - - x_mask_finite = np.where(np.isfinite(x_center_med))[0] - y_mask_finite = np.where(np.isfinite(y_center_med))[0] - - # if y increases discontinuously or x decreases discontinuously, - # that is probably a CR secondary reflection - mean_x = np.mean(x_center_med[x_mask_finite]) - mean_y = np.mean(y_center_med[y_mask_finite]) - - std_x = np.std(x_center_med[x_mask_finite]) - std_y = np.std(y_center_med[y_mask_finite]) - - # set these extreme values to nan - #x_center_med[x_center_med < mean_x - 3*std_x] = np.nan - #y_center_med[y_center_med > mean_y + 3*std_y] = np.nan - x_center_med[np.abs(x_center_med - mean_x) > 3*std_x] = np.nan - y_center_med[np.abs(y_center_med - mean_y) > 3*std_y] = np.nan - - either_nan_mask = np.logical_and(np.isnan(x_center_med),np.isnan(y_center_med)) - x_center_med[either_nan_mask] = np.nan - y_center_med[either_nan_mask] = np.nan - - new_cr = np.vstack([x_center_med, y_center_med]).T - - bad_points_mask = either_nan_mask - - return new_cr, bad_points_mask - - -def post_process_pupil(pupil_params): - '''Filter pupil parameters to replace outliers with nan - - Parameters - ---------- - pupil_params : numpy.ndarray - (Nx5) array of pupil parameters [x, y, angle, axis1, axis2]. - - Returns - ------- - numpy.ndarray - Pupil parameters with outliers replaced with nan - ''' - area = np.pi*pupil_params.T[3]*pupil_params.T[4] - threshold = np.percentile(area[np.isfinite(area)], 99) - outlier_index = area > threshold - pupil_params[outlier_index, :] = np.nan - return pupil_params - - -def filter_bad_params(params, frame_width, frame_height): - '''Replace positions outside image with nan''' - params[(params[:,0] > frame_width) | (params[:,0] < 0), :] = np.nan - params[(params[:,1] > frame_height) | (params[:,1] < 0), :] = np.nan - return params diff --git a/allensdk/internal/brain_observatory/mask_set.py b/allensdk/internal/brain_observatory/mask_set.py deleted file mode 100644 index 4dc5f89e4c..0000000000 --- a/allensdk/internal/brain_observatory/mask_set.py +++ /dev/null @@ -1,196 +0,0 @@ -import itertools -import numpy as np -import logging - -class MaskSet( object ): - def __init__(self, masks): - self.masks = masks - self.bbs = make_bbs(self.masks) - self.mask_dist = bb_dist(self.bbs) - - self.cached_sizes = {} - - self.cached_unions = {} - self.cached_union_sizes = {} - - self.cached_intersections = {} - self.cached_intersection_sizes = {} - - @property - def count(self): - return len(self.bbs) - - def distance(self, mask_idxs): - return max(self.mask_dist[i,j] for (i,j) in itertools.combinations(mask_idxs, 2)) - - def close(self, mask_idxs, max_dist): - return not any(self.mask_dist[i,j] > max_dist for (i,j) in itertools.combinations(mask_idxs, 2)) - - def close_sets(self, set_size, max_dist): - mask_sets = itertools.combinations(range(len(self.bbs)), set_size) - return (ms for ms in mask_sets if self.close(ms, max_dist)) - - def _idx_key(self, idxs): - return tuple(sorted(set(idxs))) - - def mask(self, mask_idx): - return self.masks[mask_idx] - - def union(self, mask_idxs): - mask_idxs = self._idx_key(mask_idxs) - - if mask_idxs in self.cached_unions: - return self.cached_unions[mask_idxs] - - if len(mask_idxs) == 0: - return None - - i0 = mask_idxs[0] - union = self.masks[i0].copy() - - if len(mask_idxs) == 1: - return union - - for idx in mask_idxs[1:]: - union |= self.masks[idx] - - self.cached_unions[mask_idxs] = union - - return union - - def overlap_fraction(self, idx0, idx1): - union_size = self.union_size([idx0,idx1]) - overlap_size = self.intersection_size([idx0,idx1]) - return float(overlap_size) / float(union_size) - - def detect_duplicates(self, overlap_threshold): - duplicate_masks = set() - - for idx0,idx1 in self.close_sets(set_size=2, max_dist=0): - overlap_frac = self.overlap_fraction(idx0, idx1) - - if overlap_frac > overlap_threshold: - duplicate_masks.add(tuple(sorted([idx0,idx1]))) - - return duplicate_masks - - def mask_is_union_of_set(self, mask_idx, set_idxs, threshold): - # does this mask overlap with each element of the set individually? - # i.e. overlap of mask and set element covers most of the set element - for set_mask_idx in set_idxs: - overlap_size = self.intersection_size([set_mask_idx, mask_idx]) - set_mask_size = self.size(set_mask_idx) - if overlap_size < threshold * set_mask_size: - return False - - - # does this mask cover more than the union of the individual set elements? - set_union = self.union(set_idxs) - mask = self.mask(mask_idx) - overlap = set_union & mask - overlap_size = overlap.sum() - - return overlap_size > self.size(mask_idx) * threshold - - def detect_unions(self, set_size=2, max_dist=10, threshold=0.7): - union_masks = {} - - mask_combos = list(self.close_sets(set_size, max_dist)) - - for i, set_idxs in enumerate(mask_combos): - for mask_idx in range(self.count): - if mask_idx in set_idxs: - continue - elif not self.close([mask_idx] + list(set_idxs), max_dist): - continue - - if self.mask_is_union_of_set(mask_idx, set_idxs, threshold): - if mask_idx in union_masks: - logging.warning("already detected this mask as a union") - union_masks[mask_idx] = set_idxs - - return union_masks - - def union_size(self, mask_idxs): - mask_idxs = self._idx_key(mask_idxs) - - if mask_idxs in self.cached_union_sizes: - return self.cached_union_sizes[mask_idxs] - - s = self.union(mask_idxs).sum() - self.cached_union_sizes[mask_idxs] = s - - return s - - def intersection(self, mask_idxs): - mask_idxs = self._idx_key(mask_idxs) - - if mask_idxs in self.cached_intersections: - return self.cached_intersections[mask_idxs] - - if len(mask_idxs) == 0: - return None - - # don't cache the empty ones - if not self.close(mask_idxs, 0): - return np.zeros(self.masks[0].shape) - - i0 = mask_idxs[0] - intersection = self.masks[i0].copy() - - if len(mask_idxs) == 1: - return intersection - - for idx in mask_idxs[1:]: - intersection &= self.masks[idx] - - self.cached_intersections[mask_idxs] = intersection - - return intersection - - def intersection_size(self, mask_idxs): - mask_idxs = self._idx_key(mask_idxs) - - if mask_idxs in self.cached_intersection_sizes: - return self.cached_intersection_sizes[mask_idxs] - - s = self.intersection(mask_idxs).sum() - self.cached_intersection_sizes[mask_idxs] = s - - return s - - def size(self, mask_idx): - return self.union_size([mask_idx]) - - -def make_bbs(masks): - bbs = [] - - for i in range(len(masks)): - m = np.where(masks[i]) - bbs.append([[m[0].min(), m[0].max()],[m[1].min(), m[1].max()]]) - - return bbs - -def bb_dist(bbs): - num_bbs = len(bbs) - - dist = np.zeros((num_bbs, num_bbs)) - for i,j in itertools.combinations(range(num_bbs), 2): - bbi = bbs[i] - bbj = bbs[j] - - if bbi[0][0] < bbj[0][1]: - distx = bbj[0][0] - bbi[0][1] - else: - distx = bbi[0][0] - bbj[0][1] - - if bbi[1][0] < bbj[1][1]: - disty = bbj[1][0] - bbi[1][1] - else: - disty = bbi[1][0] - bbj[1][1] - - dist[i,j] = max(distx,disty) - dist[j,i] = dist[i,j] - - return dist diff --git a/allensdk/internal/brain_observatory/ophys_session_decomposition.py b/allensdk/internal/brain_observatory/ophys_session_decomposition.py deleted file mode 100644 index 43d386d130..0000000000 --- a/allensdk/internal/brain_observatory/ophys_session_decomposition.py +++ /dev/null @@ -1,97 +0,0 @@ -import numpy as np -import h5py - - -def open_view_on_binary(file_like, dtype=np.uint8, mode="r", offset=0, - shape=None, order="C", strides=None): - '''Open a view into a memory-mapped binary file. - - Parameters - ---------- - file_like : {string, file object} - File to open. - dtype : numpy.dtype - Numpy dtype to open the memory-mapped array as. - mode : string - Mode to open the file in. - offset : integer - Offset (in bytes) into the file at which to start the memory - map. - shape : {tuple, list} - Shape of the array. - order : {"C", "F"} - C or Fortran ordering. - strides : {tuple, list} - Strides along each axis for reading the array. - - Returns - ------- - numpy.memmap - Strided view into memory-mapped array. - ''' - mapped = np.memmap(file_like, dtype, mode, offset, order=order) - return np.lib.stride_tricks.as_strided(mapped, shape=shape, - strides=strides) - - -def read_strided(filename, dtype, offset, shape, strides): - '''Load a frame without memory-mapping.''' - frame_size = np.dtype(dtype).itemsize - arr = np.empty(shape, dtype=dtype) - frame_size = arr.dtype.itemsize*np.product(shape[1:]) - step = strides[0] - frame_size - with open(filename, "rb") as f: - f.seek(offset) - for i in range(shape[0]): - frame = np.frombuffer(f.read(frame_size), dtype=dtype) - arr[i] = frame.reshape(shape[1:]) - f.seek(step, 1) - return arr - - -def load_frame(raw_filename, json_meta, use_memmap=False): - '''Load a frame of a multi-frame raw file.''' - if use_memmap: - arr = open_view_on_binary(raw_filename, dtype=json_meta["dtype"], - offset=json_meta["byte_offset"], - shape=json_meta["shape"], - strides=json_meta["strides"]) - else: - arr = read_strided(raw_filename, dtype=json_meta["dtype"], - offset=json_meta["byte_offset"], - shape=json_meta["shape"], - strides=json_meta["strides"]) - return arr - - -def export_frame_to_hdf5(raw_filename, data_hdf5_filename, - auxiliary_hdf5_filename, frame_meta, - compression="gzip", compression_opts=9): - '''Export a frame from raw to hdf5. - - Data with the channel_description `data` is stored in the - data_hdf5_filename, while any other data is stored in the - auxiliary_hdf5_filename - ''' - data_created = False - aux_created = False - for json_meta in frame_meta: - # This is dirty, we should expand the metadata handoff to allow - # real specification of ophys data versus auxiliary data - mode = "a" - if json_meta["channel_description"] == "data": - filename = data_hdf5_filename - if not data_created: - data_created = True - mode = "w" - else: - filename = auxiliary_hdf5_filename - if not aux_created: - aux_created = True - mode = "w" - data = load_frame(raw_filename, json_meta) - chunks = (1, json_meta["shape"][1], json_meta["shape"][2]) - with h5py.File(filename, mode) as f: - f.create_dataset(json_meta["channel_description"], data=data, - chunks=chunks, compression=compression, - compression_opts=compression_opts) diff --git a/allensdk/internal/brain_observatory/resources/__init__.py b/allensdk/internal/brain_observatory/resources/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/brain_observatory/resources/cr_weights.npy b/allensdk/internal/brain_observatory/resources/cr_weights.npy deleted file mode 100644 index acfddcf44834739fcbee5c2953f1de2d559f4a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82000 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%0DBv9IF`)0&BJYyu_iU@5lcEIcTCd4my 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%0Ab?5x1?5FS#7nr71weSlS3!gTDcMi;P zzT_xIw?6aSQS<{i@?0kqTlEY+Ot7xy3;47$+D&u<JVf{1o;j<Tsdup&zmNi5b4oW~ z@;D#wb*A<ToPURTzDyY}KXkt1a%uJ|F*Z5tam71D3HZy8j)gzpf^QcDs;h?Me5)n% zcpCa7`^S5YG@J4L+99)j`*Ht)D`P+Afd}O0%+K<I?-1*<-X$wclZw*M&-fH+KasFy zfB7aE@+&pkjthNvmqyeAJ@A&Bl($3XB<ki<d}A3GtLy(voMd3GV)Be0am!&y-EsE? zI^Xd8*l8gH6Nr!g<C-pRR;=WT+pVd;!2O%am8Xi)w}q8S?F26jHHx=R!l(CX)MZ=} zVxxsd!biRT`J>0iT{GNp{bqx^X96)7U;X0v5#%FqC9iHpJrywcuJG&t@c1EoIQS** zC!!La;e$BG{mj)U2G6pWLyKS6Gde!zcEY{jxv-r>r6%BMo5+DUJ?Phx+WpVQ5wAlM zpQpedfl9O8<AZ^NH9gB#{0IH>;7XlE;irC=)Rxm&kBWQ7Y0Om~JlSxjc4<HQh|gW; z^1xHEb2eVnFU2{(OzzwBN;Jpv+m%>Tb-KKG$+VLiL-_uRMyPrw^doIv^@{^t6uGaq z@}xM{?K@3#*<B4<Ztf(f{@*#%hst-i&S8BV+w0%luHk#AD}I+fUI3reA?0iEmwNQu zi7&lHgeFzaYZm{6e^3m)bN(uHqeSPH+c@x6;yV^*ID?iGuI{!7L_O;qIJceuDf;Z? zY1d5O<9&cDXVlKjg8z}$wUGwT7yX&IyP*~Q^VP24_XY5P+QJZ?>zG^Ee_F8xae1`q zaBi|TD_p33YJn)`eD$SA7kmH2xkrvi?F8c7b!_c}2wZ2#8>Uhu$u7O}VP4M;)L&Xq zL);SNKYxnrSzrp@zge~CqKi7dhw<dz=ABaPNJjm__Uo9Bt6JPGl)X!l+B_HcfA2Mg z@6s~7kG?wB{&w%p88~;&X-WJ6T-kW1+ckWKZ(jFW|0?pV`o`RJ*BI7qPM<qm$s`Ca zlu@UlA9Di}NB&e%?9q3xBLq<|aUT~gnCQXx+3Z^r1vS{P^2FU{8<EGcx2c0|Srq4t z!;H*-@8<|}rBBU9e@T=JqjJg_&!gfdBA4*K%8{dKXZygn?l-^u@B<I_@U7fphIKCs ziV5D2bD=O=DRzk*O~~o@^_M~zGLjPYb4CFJ{<-OLJB=Y(JNKNZ(_+JW4bK=Ej#0#S z-TLQs8Nj<ZaWQJfKDMnM7Q{YC&*&N+hAA-L-#T^_xM<6JeEMSpL&ooPM7;Tj(?i0g zM`f_S{uzH28Y!{PU01yd(<#!lD&EWxb>5ukFqRDb8Q)(z`T#mG&~J8EiO|tkawBRF z09Q8}$1HE6&J><+4187y|F(PgtgATRHook;_O}upC|#S8W(PcTW*BV!m5TG|C8s<8 z=~MA{`PEBMZ%3-{cx{qoZA1_BORDhTdqdn~vpov%p4#o7@6&1+&f{3AOm{V!w3;cc z`O!mFzF`V)U4?%7A0)X2c@(Fsw)pJa3g~GLdoWxc@k@|7eRVGDw)125+=s*9zrCmY z&%MX@C0^~=IN6E3rq2sI77stTb*|RWZl?Ry5MNsod_Z#h3*C}ZiY<?He8dAjS8Wyc zvg<{B2HyJUNwR+~T&Y{8r_Pe|pOm^6e+8a-**CKALz!WtTatjkl0QLrx@OUeK@y&x ziO`*F)6TEw8ljW#FI23lLLYzUP*m4!%*T0sU+{|4x+}J@;iDt)eX|5tta(Qfp2OO5 zH=s8|B+LEZT+4GJd2WIvZTuzJX3N#T$VbbOubQaevc8hBBs|}K*017sz*p!Ag&EOY z^fsY#sSZcXQ|ZCgqG|BA1)*E=j(|V1Z*FdBKs|C6?!E6Y$k-q8i!{A50AI6d&x9m+ zIhl6(@V%TNek=9|C~Kn*->W!O5_*HH#$B(K@PmJ}?}vQ{AJppKeX^zzbH!QnV%`bT zY_;renFb+xNbHKS%my)*ebJ*twZt=Ygi+xcZPb(1UWI!c#9>C;4C5XNI_J@U{DZEj z-!iH0B_;5iVVjP;5Q(8U`-abIcOtH@WpiZhwAuRL_v*c!c<!8r@9H-YzeRb=%eg<H zZxpPj<KWLow5d>S2IZ#Euv+XN?x&<0xACLCt9=_b4<SC48Uu%x&Vo<mQ;CUGVC7Wa z1+~7y{dRSjE{nx;*UFua`iOb3&Gxq`_Q>0Dh0ZxR&!JsJHD;gc!TH>`>s_7y{6Sj( zO@0>r;(d9(&SvoRD*D0H0Hta+UnTrxH$$pptyCiO;2)CZ{z|>4I1L`>=ZK5ZB!2gN zqiwvb%cqa~4t_^{ncT9;sQQPeptgKV{0z`)DIA!NIlSMEk!53yXTFb8j$=1`fvi&5 za(wTzVsnhEeJSR$9=Z}Pc<<)X!mLC1e-h%-eED>0|Ls53aPRpX;4dgMK<hHzTQE2J zID~$P-$QuSLrJ>pjKA6?dKTV~IB59l-}ir>p8qkP243aA)nL0D{c7dFu45w8S?kY6 zGRIC0z=s4MJgu3GdBjn>1^9je5%UW^F$eLQCA?KB4)0S(zDobl(}Vd|B)PZ52m00; zQ|W_xZymoPQ!xcy|E3|7J;J1)d;061K6GEg#B}}rbc#MKpj6F(XWSm!U0a7aA&sf3 zKm!x~AXDvK-c0;IAv=5y^W)#m<QLPkp!+<nu@#x<hjf}Ydxt2owuXE2r4@kZWR=8z z3OpHpfNS|V@ZOhSukL4H9(nfXf6`rC^r-=_Qx{QB#D-5L!SNM%S$d1MU;_Gw6I}AX zh?muf_t~%NtdnV-hHMk`=xN~`^?`i!`wm_%UciCp=u3r1@Nv(4li$2jrNcN862unu zXRk8q{qP?8t4&Aqf5J!0>G+TI!SC8f969EpLR;??tpA$~eWH!y!yVqC|G2zx`8M!h z+@+%v`Pf(emDKJlznIYC2$29UeD1`a*t0>O@P2Q{ZtvI7efz`LS1HcG+_(2mS8pNX zV7)^7b`<<fba%t{iEPXzELN<$@C3MCJ95?veSA~Xz=jkRHga?7ym`yu%S!sb)$T!k z2Oem-UJbsFd$8Zg6S!heXB$PaOlH32K9zXjS*5lx{la(nY_Hkk9$)bO6HjpAXGPS* zz^||ByzG%>x14lFpgWnH21fOe*AGc%Kc3e>H_T7)FUH^3dugvN;-)L-w3zQn2M@Wm z7M=O~6#qUmK<{i4&Jp9XEgx&rgq=HA)}@QOCfvv`(1<z^R@It;a}ti=q}(5o4%F$} z0|o#7Uy=cJ*=HgA^q#phQ!oB|ANu|&#T_Ex(RvB<b&80$<LkTbr|@}JIc>jRHpO4G zTO!mNJUOtA_XvZ$+NY$7a0lX?Mz*^k3VhY-xW4-}A02nfTf#~a{<kB-^jByq<|IF2 z;<o<;ZjuirT!Sv}<aSYArb;^<mWq+m;HEhdg&fCb<e}E^SJ+<6We<37-}~?VCeNMS zCh`5$qG&$fl!wsm=CPjmCm*0|wVikCKQm(4JF8C4$M-Y8NiPU!kYt-Qf?TO2;3a?N z(PxL_sJO$*LK}Tsu-_Xqj9CMgyiaKOtD#A|cy5#UCCkkc@@3sk%VT)&sxa2R<_~;) ztbRoh*3+5dueMHuHE(^dc=+G<8svgGxl+l{g+8<H-Ra<I%XHD_<M3}w?;Lwn#dwZZ zRF)q44IMivaM=v_tSotIa55Eqv?IP_?F_{4knkSkZ0ehkF`axJ{+I5%zp)b6nTx#S zQ;31zRT94`tq#0AEEV~c&uljTsOelMgE`SewRAuDCEi+m?#*=c1DuDOm4Hk8x8pU3 zx)_a(s%K6<1pelKnWcI9BlPrQ-nwVm3^A7B`Jn|q2%Pq2X6PR(+NiS8>bx?(uaS4{ zkWwXlm(QBNi&DUYf+_2({^I*lyHES~Hc@A*PtB|-9%VSq>+hDPg7@~Vw$a&;iSvWo zI~R+9uMF=B)UV)Whf-TAem+H=7M#7H@E&owbVqE-)GwUV-koEds|CLQ7~4-qD7jLx z@g<Y+=lq(#=Z94RS9c%$T8-;DzwgMsgr3`OQLM5MquKVS@2q9u2R7`PY3GPKdK5jh zS~!>Cl+AiGc@O8?H4WR`t<>4Ty@zFF{|w;!4dt6!Sm3Gcr}C!bsH6R>xurGWr%1!; zJ_AwOEuc?i+i&=pr~ipueG&)$UMRKeEBY;ZhVz|%<ZbqwCr_TLvZ{nTp?@oM?e$QJ z&u`2-lk0EaTZ#OR2)&#u$A|cv%oNiaq>64UuHl`+`vBI~lSV4wHRY#r7aF1a<dUS% z>JIRdy0E6SAf4M*I_Db=-`;fnLwjBhbm}K3YIz#=8^RU`Br>F?tl><W7;T;Z*S)%K z624DhwvA*Z-utSFm39XnroE7Gq2}Wp;^pWnL4MX~x|L^xj0R0^=eP|P;QgWqp0!Rd z;WI{3*XS?6dTI>fKWPim4qNHIg%039-@Ub;S3(Ehh_pOffI13WSha62aOH4xaqS}D z-$n8EEmPpKKI8kXhtO#`(`e(>zzfGy<>Ik?^cNL(UyVwz`~y3ZH>V9@-ECj9L!ZGn zg?w7z1)tc%S6!m4j`_i~;#c7VOzjNw%+e&}xApTInH8V#|E1`!Oa6DxMoRVXID<#- zKe%)`Rg4WhliR$od=&HK(PA?z#KAtzVr+U4bkjIQO%(hbbbQP90X0@NZL!t5v+%!S z=X)1!Ltd<R)vWMB->OsUs8Q9AKEyfa%{|Pe(w7;@2w@IH59dBlM_oLt{U1eF9+1Nq zMMqj`-?Y&pi9!e=W=cpUA%u{kLQ*M0`1qlfl2lT(QYdX`pV7Wadr8_;RJ8BqclxvX z`sTg+?mg$+``)`#)ZWsB_0T$c{N7uvr{mrjT>(bM-K_be(ICcUe?H(EeoxH4+kJ=y z9*jApIQ$EBPpirh3tmd~@YDC6jo_#2hMD<%6&Poun??q3dO&Mzd#ot>J1DHY`9*>{ zVbizLeipjB{l-H!TdZ%c=cU_;@B`h|mzIgopkD1H?OM)GvHRcp7W5JNs`ppLrfl$r zg<J8FX~a{?{Moix_+|Ir4f6YhsoGNRLwCNwE{EglwhQ3<7OXMezM>ZVQ5xaK)&@IP zJ!(ylpx4zqT;19Nzp|0Gwq`W|_tok&#IU|~MVXhMVL$m%wcvkigecxmo}Jr;fnQ2p zx9&9+LO%#=aug$vy34pZW}-f<8+FOx4liS5QlTP#82b(W`Aa0&o3Z{|udp}0g#Rz@ zOsfBfI5zy;s4_t7YAi0A(7`;|pFK3ckdE`?XGfM3Nto}f;J^8EI@U5{%h?h-G<Ng4 z4sX;GSc1odo#96<2Fb@RVjrvd<=vTwu%Cu8FO@PwvKDOnn58p765ne()>>DQ%t;@Y z@~ZE^GyfOwRi>d|?guW4;bUA>PG75;>wn{s@xnJA>l*!4xK9VVWWiZu4lDSZw$_B{ zuEmt&a&bXpL)7;UEc^3m2iCLc=Be_ET<E9sLY;QY8P<~74S4~|4Bf8cd)O88h&(v< zQl*Hb7Qeo<eiL-#w$F;w^I@0&gnv(-5@W{G>{_gs<M;n$Q!*5>uC)#2213x~%*?xQ zw!k;DP?z}2BeYs}{?)^C`?}We#?GuoAE4b_AHTQE{e62pOBL(n^Cz37FUgdC=!`X6 z34c)*p^VJ14jO0UZ#;;ksTYU$E|is{Sbt@X3dV{uGDa^vblw3EgRB22Oy`m;+vj$5 z7vX=L5)Dn-lO&NnAXaKPOxwjZu9dh9yr`bt#<n;OdhwB$mcbj6;8>UWiJcAm;_=U} z{OcnfayA5iU%HqgzP2}>a{WXyF9Zh<c_H5I*7TJ(f~TS_j~qkaFP38Zf}=U$x9QVk z+iK!S;(2#^0Z~e_Iu9IA`?d`A2-BKXxqOtR$^KNX2~P0VmJOfZM$p9dyHnN|vCb^r zGrKc~aX%pW+1cy3cf9QW(Y6BcUG$^3W%kft8i~FP8=m{^LgAMi&@Y9_vsODg$?|dj z49-Yp>?@|777I_pe)pS$x!+pg_q(qJISk?dd{}3LC&+F=t@5rB@QiJ$)OzzG=#1#F zl&ln-gI`m&<~IDG`bFNy09k6ao|&s(5B72HR6ZE6>L7`vBG<<exIZ6Z@s4c9JhEii zwpjGjQWsYK)RY2GIEzVp=V#NbU7?2@&0&v1wumcn(Cxj7x2!t}=CJYB`m$=wgIM0< z{`C>!mK04t3q2lsyS4BoaMo{V(_)FAWPQ5u{>oC|uyK6eGW!=~%ZA-Yj>U8V-}ZWb zGsn8Cb984JvQrJFeFnBc@INER2cOqK5Ba!hS$1RnLhWoy_Ct5+RvhO^m16FV^>y1l z<Ylmrk-Ah8f43}}z1dR^KRnhadK32RmopxzXeC>ED|g$;;P;vB=T8)8BOlAq%XsVu zoL2GME)1TQ;z}MmC`#3tp72Q)#C+=$R_^8c41eGJ_{-KV@Yli>in_pAqUXk=f@t!; zBsGaeN01+S@!aU}$R(-WH%mShfoJrN><V>+zA#(Cz5HoC-S$gz!^g+aFVi=?dcFYP ziL@(1gLxz|X5;%gNRA;EYgw6QucNA|6ZG3AIf`gYmDe7qMm;Ay;eZNsj_Ggf^GDfW zhb2K7bNi7Yi7O<Y0)HrO)fei)G+}=>Vxa3M>NK~1R765|HYw+<+`5o42~e8%JQ%q6 zQQzaCeKtvmeD5e(Rf~Fpl=C-J%-6PZhc@<we7b*|zNh{mkJ;SJnVS#({U)ubABg(i zZqK-(m8gS^8NMV$s6bAESG`e#@H3&s0tZ7;?{Qzybqe-jp8c8{!0&@Z%IunjD5)Qh zetEyaezEg?pA&1~pN~uuM%aN1YLWg@?f6_vbjaId><sh3UH+99##LNYuiAleR_=~) zx&^;yE#0{>34G^sVA4T#gpBX|w~AM#AABYmqp8V2kMx`U@r;Kqer<k#E|1b()0}z* z_;^sNuDJ3&Nrd0q-Et1|Twx-S?SSt!*pVc=1NzyF-DL+epRu!Cnf_M?^KHI#u=*T$ zYkbxvBprMxmK=DSTM0VibtSc7l1xcUTe-gaA8>6;+uL(k|5ulD8*_nQw;CRQ62fy0 zt;F{qnWPzB@0Sxj&CmhId8I<ZFAc$~!_R|9h{A-(3&F5wc4S7vLdq@g&*JB2F#pNp zrzfqjzH0Zy+eKj)BG0$&GW>-(IAAM-`rKE2#s1!Y)E@{-x0oi3fAtdn`M|;M0MBHt zKZv_`eg)l?bZ+WVL%9<K`23<_oFD2XF+Kje_0SPNZGxnZ2;#idnde$NmQ!+a3m4>9 z1J_)MZcah?XWEf!<GKDWP6Pfd9|ejqTAnmz)JD!8NtDVkK>cdB-Y-L~O5`hzc}z5o zdDB-@UFZ0yYS%?Rf?}V{8-JDu9bs(Y@z^DYCTf1zr_23Ce5PGFjXsP7bvNts<N_vT zMO5zcFBsqXOU7C}SP#7#+o49-sd;aa*+nsiNhwtoJF3L6Pkbmzcrl-0Vs$FTAH%P; zO#0MJptrfXMJ=zu&JwMLl->|c?U7GzbO7#Hs8sE8#&d;b#m816j+RTwi5en*V-1l< z0}Dv?c!eZsZs<hkOS`{ir;seGLWK?2f!E`<9WQP`ZxBH{?w!jeUml%MPfJ05H0x>Y znhL*jc(J!(@)vkL^twYRa9E9_;+obZ%|`}xSsVu**zwFRorOQuc_ce)V0`cNmA%#h zcY@CcEx9d6G4-hxN?fDZ$1uBEwuiwv#(Q01n_%Zc$98iS=$A9idFsIX(U#_4c9~P? zFFM})`CJK2><sxd`w_Zr<J!#6!-@={ZZ#|1!cG+mNNrbLj=Eu@9nJLpfW8<O?vD9} z{p6r8*S5^rB`1CVFmye)pL^*};JdD_T}SmhlGyckap|)n=w`N{P5Z{@@~^;TGn{9= zoHYC~4dctWt@mW~4Rphj*k+k@*r_)zIs*6+OnzD+J3;$Nn(muiO(0%));(1Kjt73c z;qWGwCO#i*OI|NS5l*)ZOW36uAKvs%@ln{>gl&FTU^H+_ZP!8Je402UT4!4Vp7M#? z)1pBz$s+F@4O4+P20T{h+hJE_X2H<$kEmZ&U*S56`bg-{I{BU=y4<S4n8y=*G`?%o zacj(Xe5K0q7vR^;L3+$r;Jro5*_aa&j7#%=O~(M}&Jg2-N}e2=)myoUn1^_>u3T(i z0=zf<#?hiJM70F$n3#Ai#<0G;4((lqIEqo-+5IyI`+pY2OaH+ijOMpxNwYC7_K~JN zi`cQx%X=?%HU;%(w<O(h%;V4HSdl336zeq4HQOT6W<|c9^Ct8Im0h^IaA`Ts>`h47 z7X-g~7c0$wkO%X<Y+2mbNjksU`u$+Q2<jjF2FbgiZ$55XWt@lg9iAPpaRd&rLb6Ni zYe@%<P5Bm1`2NsBqXE`S@LI$_pP%>Pe^w74w<2E5MBVcJzauX`Gtc7eF#NIl*1xPo z=nePh)5?wb`&x&iA6xPH>h8N6r)kQ;$Iy6o4EKci74s#Lx3z?BE&KNpJScD5n~wN+ zH`_aoevP5B>ozD=&qB|iT5yL2+*`7FTUc5y@Lx8EO%ML}CMBsrPLY}RwVBj>jP-ff z8UCmU`i>G6TVy)|oY&gCVeZ`A@BucFM@ty)zR}yI2Y_EL0f$*7wRm36a|0(l|H^>K zqRnf-mlJQ~(%Wf=)@fV4<qL40BlLya39PU9*34oJ#GBMi$t@M|{^cL-`z<*cpP+%L zKJ8kXny}T(nrbDP^rcpINtkE1ti9R>)YpPNes0<?P6?XF{?p_61^vH!Ux8vB%?jo^ zIT{NcWMKaM<~h^>GOQiTl;%^_UpDdS&fTL@Tj0+-ch9w>`}V2hpOL3;OO6h}ezM(S z_oW6S^qC`%CZqOrWB)VRT0krdb++W_<knK$S0Bms4nbZUnU!<<sR;A;TulE<+)p8z zN{&49!r!wsf5)CErir4L>l*^*?99#5PaULv?9ZL*&aa|bf46T|deMt>@<H)L7S=6L z)66Uxcx-kc`K|L3%JivcrRaR{tS*oCQJyl`WBtK}$NOmF=_>o)x}^+pPjoM@KF-r5 zZi+o7h<LO9Z)%k+{4|&|<=b_9KINACz<%I_V?fiE*~OHG{aNk<WmpfjA8p4z!QaKx zq;JjLA9rI-*)EzyoLD{ZI<$nke$s2&wo?xKgY(Tb<f^fcvs$ZN1GquyCZwA8k%XK= z?!A~%vgL8s3!jz-)IEMV-5&4*U!BrY)d$Y7{@dIej?X#&O<q;rPx=*SzRBWZ!+EpC z7Zj@tN!F}JcYyzI)U)$wn_bhu!3PO9fBqpE)AY<+I&W#>T<O?_&)~l<&%MP8bN;;e z?{hYcXF6xvdkA=uyz-J@=rry%@Yra2BhI4#yD-xOoGaou#_>xY=fxw32A3!@$HMiN zHF>OHSR=>J7`5OW)ZdwD`$+JtS!w(|eefHLW7Mp3KEn$9%`<Zyd~xd<%k6$W?CAN_ zV_q)u(PuX75ztrh&ia1rv$R2Lv`P*e{N5%{MJ*YBw-adFwWtnyk)v|{F6h5Uzgxfh zN#fq1h~!%t=+^4phT})GY2rZ4{`DL1y)36i8q(lH?yJ2%3E<N#_dTI$h##ZM6=e=- zIM+uE^2mY5iIQ@ouw>xTOzHGPHp)gzML1jo<G6pvKa+yL*I)O`tppB9?b&rnRT=k0 z&X%YB6{M6?E?%iz0X`bNRP;Hl9{Fdm%k!VWaj(BazRk#^h!eA`uM!l+G2t2W0{Edl z(OkX?d|CMGSdn)cp4*|2A{&hF_YVJq{d@gC64ncN2%KlT9rn~0^YEExR;Lk#^)DL> z3j<EbnV;W^4lUf(SDZh{1LufRbyq9kicz4ah#dG@^p|h`+&$rLwq50#e2n_4+Xi2P z@O|YszwF)f81^8iq))*vjh!9$=5!8q%h<~41F8OicKg?Xx?}cWk;mM548fJ&rk9&g z@883<QeYWylIWHG3*Gbf`@ILK;}cw6@u#eSqnyip9@+q}-bs}g-krkF)2rCF@i5jI z3pVSmox=Ygw7sZZL9&c>TjDGmkpH}me28;RMD_8Z-4a+2*F9Wk6EN<2{;A76SdYOc zD#ml?&B_y=98-mU=1*@s;~-C=mFe@i?bG1Z;GGxVK#%TQPcHb}iu!=ET<20QhN#y% zc++bIV|_r&P<wI_>U9~LyQgZvTd%e4r14yzU)=-4;8BggHTxdIpDJ3bJobYR%npfP zd{F`3+!&J{k%{=>9&%m*T<f~(cT-20QLE8Tec_JpAMn)XyHE)~-o7mX@y5C-ZZ7c! zd0qL^%Q6PvNv2l&lG96kUq<nt^NtbdXVcSd$c8xWZb>p-i#$y5ytBs{5k_r=b;;g6 z9V9a#TOqv>c{k_6zkBD-1DI?H*t-SwO`V?=-*gsJY8H<*F6UsqTUut821nt1(VG*4 z>!3I8>BgJt!LQzKz2#ym$yl*ziJp`|9pjq#fp5QyNfvcQJ^Ly6%IL6;`B8S{u_w5> z8>AU8?Y%pDf>AHu{<NOW9dWL#t)=di2%XPYwEm(ZcyH;|(uGSH=Dpf%h!Orit>XUN z9R62cuJ1MlU1Ysf{$T?2>M;MSaSKjL@K4qE|F$+FkN=qGPD5Xr8C>cW$^)Jf=lR0H zkAg}oKVBRqUADiKKDY(^<dYW~G`BCF(b{pNtqyqQlIQ;)@Q4!la5@?H1<&2L9a2SH zcOQ<ld-EB%D6=4W8SG+|_qf^*yrRA(-B@-ZbI)^Z@v^ydTm5|N#%};0U0!`u-HhiN zH7;JMG)c2o2VJn?SPGos%~+jy7vs6=YOjR+WY@bFmNY}kjimOSEm=ynsD%#XhRRcx z7OEdN6^KxB?Uhf`XTFhkev#LeuVbD?U*8Ok3s6)`@~D2HB&GW|UpP(YH!bJ+DB|Cj zda~tFZB5XB@Q3`b0%6y|3x&JQ6rTxF*2(9i3bsRc>#BN8xt9Y^^)Eiz(vJESxjL!> z<MzG%HYF1GCRR6BojEo}GAk2h<tHmh!Ox58Y9o+03C>D3c_NM^eymFz9VFGHE4Izb z^}ufT1x(-hVqczDu;cMZ>~ERJ?^y#scdRm?D>*587h@7v554vN@Dqt9oEO^h`^R_G zTL{8tg@Yu<xsk11ZjlhfZXLCz)&+i`5fO3x0PuS?|J8kLbN(QGdG-r8MHIdfbWW3C z?0k+#H@pTeF4j=^_X=^;zrE{|I`EIl%IXusIH!4<{(L7GZe{Q4fQSj?yGjS?7nR6o z4iwJBLT?ae7OU)mPpsNA?5*+?rCmB^IoCg?rE*~9H5U3*hcvc+{Z0}ai-Y@Tpb!4K zd`kAj`wfnb+g4bV(v;Y<XP(#aTqaXQ*vE(@qGC<R9(m}R!~$yfIGqyK9XS|>@4I*E ziq_FLG|MU^{CU!x--?~wy9e<=eHC4SK33dbZ|*%S!9HTQY-aR68hPG;<xci2`0b~g z-ZJpZ!Ai5VDltk|(t<to2{-Bj8N+GoVXtuY$-*kE-%!G>=DbxD5h`)LW#&8i>bI_F zt~B(9V^ZC)LK#V<TfXbWePdSmk109yn`7DJKONwaV_H@el|15s9~^UC@31<TW<83+ zi5cLfh7Y-68oDdjtJ`%%k>Rsx;XT@nx=Jy1*>oZNpWXG$!C}~u=_}*h2>wa@Gx6UT z`pb`nPFp8oT)fu=f8-UwKOQV!7@Gk*_bpttAP(^tX?o{N1I?UMS(<tRag+Ldk@j!c z<Nev~qXUQ!IrZPY@vYFUQz{)||48DW!&tg6bei|>JiP_*cdrkZ4{*2OT;FM7-+_MI z<4yT76hSaaCf{QgoWpsVm-ZD^PjXQIeAIBJ2Do4+v1Ygs->YVD^TO$Vn&rRv#IJK- zaDUjXb=mzNsIM*^s9YP4`%S~@ChH_A%6IK<p=Cl;WX&0!``duq{d!RzZ^~&Zng7<) zlkgX2d#3lC-*fL=)vL@;sXyCOJkW%76m0xfez+Jo{Z-8F2>kzDEV1Gdc)(A+_gFR; zqf(`M(BljA$;)@LS=aGg%M-eh5wM@|+tF36^BIC~FITq@2Xk+e9D7_H&XsnRXcevn z4zc$>Q=hBL{_ELVr@0*WEyYs%;!)$gq}MUd!vAR(2A!*Az(W$f&fKY(kH-%;b*x)x zC;vC}tr5(N8<o|;^9ZWe!IQ#y*UtsHD!`+ZORYRs;5Xv-xkk&+G?U^d{c;iF$SZ7` z{Q>65<0f-U9N()ZIh5%*gY~P5X`R6NbAe7fjm84-l+_lth;-m>>WOnV!HX?>Q)4!R zKSJHh?4su}&St&)?R=;4oKoxIMY-5tjZBN2kNGMe?7miodZLf0x8L4Dn%Ml?$VmnM zR{o`E&o%HGONo4-;{iRH&3t+dz0zo7p`g!A2}itn8O@G<8mqn>yxm$rGOqsb&nv@k zLR*p*W_i%(<oR<yqe(iw`IG-bS&ZXM-uIv3p*R=5deBk;>o3?C>}xy*emZ(ps0#JR zhgZ!5wtvLD((1}@U&KCy?t_g*`B-m@hOW6jt7_yt+szV;fu#4oR=Yur+it&O59X2R zd2Z@R?VMkIY?OnpQ@{0e>EUVm`ftltC)9647ys#N-8n?EB=oPxJ%FDs)a<_yg1r0L znDbgr5$b7z+oFea^}ygVzZ1)%aNe?+Z`ZbD;M%&T#M6i)@nmU-*ipLt?8!xLqQ9UI zxmrK<(ln9akn>Lw`uJs2@%OaV6tO}?$$DCXa=fO}7t_T_5leIu(`DO9me&uqPmSf^ zs|8VyWZ99AAMJ6EXdzoN{wz9l4Ex`O#Ai|dJet*5cJsaj)^+@*y5-Xu@cLh$rf2_X zHW#CJ6VJfMUhACHmGRu<Jq2>H#o)KMWp3JtYr@T@srVl)cVPbO36Zb3kIZ)L8ecX^ z2vnDlqS$A+Ah@XT+G6PNL%oIqqLf`i-d{~^#Od^t`cHKX`0bX_a=Ucw6R(UfOX5O( zNO5o#?spq`+|x{ChyIbUzn7Me&y9QE{JjVG_d+9ey(I8drs0=`v=}8Nrl;`8TNrf= z`B9|`_~G!z+ECX{68H0tyhS~TFm+8z+9bpnzs~&VQ3CxJUvXd;m54g}o0z8IdVFq~ zALl>#UH+Px;-PUm@CL`!{37J1$-*hMuV2sI|A>e&&VoO)N`4<lUKYP<%kGWCq|f0` zuZ#A;o^MZfsn$Uc<c^f|D8W8XWAe8JMbXcQd~V<>K<TilrDrk=DeBZ2Cljwml1e9@ zwG`Ik{>;sbLEXq3t(*2YaF3EY7Y;8t6fp!m{M9WdpNxEgd6a4m{nXN4M+^Y>euf(k ztQVlTiA6`+bCDM`#A#$(AU@h>#lN><eVHhOoVV4$p(1a+xP^>F-+212<G)dN`I^?Y z67!8dr}lLS_T#qF+nj<tmbYi9D@cg4<}vrr{|`7sENT8TlnQ;X6&s}kof^L>c~2?E zV^XzKebWTpF(@Q|-h2Y_C2_<{Edl*<>OvV`=qUf!HdW=Yt6|sHbMAsvf5{`guSS)q z2RU7Jm<I2f?7lGI9|jz^G7(FW#CgQU1?Kh=REreXx^NpYhBz~?t}hXO94Q;<vU(i& zU~9i{Yy`MzzoJ))jqy3#N=#nF{I7dk9uzG@zIyA>coF6!zEHgMDRjT%f#|@k{FH@^ z63c2C^ucVkjD{@qYwv9Qtw%|)AKRtq?L9QXgl>*9AEv30!`(}yI-tvr_jvZy(1cE) z`<P`3?B~66+4BMHOBPoRq;pU{eta?_`XlHs>-k*t1aO>^4++Kj6vAL-xY{oP)LGMN zYERbEhWn=~4U+jOmhgu!SESlW!b<s0kwg=4($Pu7v<3CBTGjYBgXG)8tQpb2@Rtyw zq1FN5t#03Yo_CGNlk!LOxCqn*ROii}m7rM5*DkA5fqu5Vdqi3S{$GB6C(kADYkhm& zZ)1F}_ip+vei=sR<bj5Q{(0z6k<s+PI0pWzV6rP6{7@JiyQ30uttL@nj&nz>7ox5Y z599yUA1}M|B9bKHzk3DOzXZNYaC6ko!#U05(!dc3^kvf6$)^N9Kb#ldHy{3F*QwYx z3_GtpMOUaoudyDnZ|Wx~wht%oAC6GKKD)Z>_BG(sskrQf9_*XhM=9y-n@2Hz-Ak5S z5MtKGnl2LDk9@^P(nje%;`>kR>dRNbJ7(7&lwH8M3m^7cy7$n<oC$GB=LUeIdJ@|T z5^;~JyEJ4A;#lH=*7C&)4C}uxmtD!CjK;XmzLpr&DVgv0C3UlD>hqXzg=PitDy4<* z)hJ15ybKev8m3bUvUxA2z#o}}xa~nHSl46l$Y(h3<6PbUXD)u_+f&oUsB(JcmA2*? z;P~KguA_J!(cN?QLmTQeEZx{E;G?WT;Q)JKymui%bGaJgki~vZISF{LQ*3{*?i+Yc zaXe}sfqUhJ+0~xHj9HKO25apO@RY8RG~W;O9iLh8XcTcE!FSsA2=Ixp84Fr3OO3Zb zpfu4xfCzu~%|aaa47+Pyv@Zpp{O9H-yh?5^uQdsfl%SUEigY^P2%X0+%}a-rBJQf* zZ3}&Y^C}nK*XZN_6+fT#q@kO~ew>kb1-)YVr}oErtlJ>3PSO;3FwikhNgleGQgVv? z-9fS*&s2t`W4?lWKZH6Vj;fX$B{=`Y_Xb;vjL!l$Ne!btY)s4ibnCz%_~qomoo4g1 zah}>Fn*V(r;&IE~Ljss@yx`(ymN-+sEGzL&7~+4sQ`x2@*h4>n>xFU!cyJ<+Scmxp zySfTF5KRA`M&%__&=Esxx1Q>$#yq`aFQ|5-4szM;*w1N_sEvBiWQqQDrQ#do3h=oP zz8i(P3vlmKcFV~_z1SBxlk)E)@@a#gt}h(f8Mh<$as2G#*!Q)NKRFNU<?Ge??=<k& z=Lc8d4%n-_W4`6?K3YTY$t{<`F`8A_^xv;=@PWTU|Juvnah^NzM4<F2aPs27xtqX+ zi)l^W*W;kOC^`KI`0<BKUonqwI2W+bAnzjlpuB@;)5BKUrO-W1#29#!Vw3#Jq8#-Q zEw}kKo$!Mtm0_i9*#8~$n1y~f$%{F9_6Y3KdwK9kM=bV{l|~eY;n(q;g+m6Y)28ro zr&kTrArp=lID!8x)#%52c7xYv@18r_*#cZJ;H$Vf2|L=ZkR6^+m7N!IYN!LB1PoVM z6cj=K?d~-d1kP-+%4+iC#C{%Q6NWzhylx$zzrDpcyh4@ypTS=uXI&LG!vEz3Z#S%8 z!w{}&Aw?$?80U#k9%*UNLx&%Dl?Pz`htKP}#ls)Wo_un;fw=VQn+%yJOHtgXq^}MP zBQBP4TJCm5oUr!1;mSi@KKoW+sSNgeqMntYKST7J$;H=2=k%rYgu!0miwujCHw5Dp zFN$b1U&s*8)6{0t7BSrk?i?xp!_eu1dI3d+z`cpFi<Q7%Gr9fy8{lt@WM#|tcCx>t z`sm5tKd6TVZ>$)F-+haixVZic&XMSLZyo`jwAPUeRj^Oec{h!%1$h*4hIK<qgJiua zJ(a!?_G7XR>TN*&rAxUFP9y)-Qxa9r0lvsNKEF1dNfSiOVB<W*hfv`R-}FE5+~|(` zd4iN_pw>0v`O{d>_Qi=ZzTmHJ`$-k(*+iv`vv(11rrrzRMzAwR9mSiaC*jAszpF2u z{)~L<&V?mQx{*H^oXohb$}rhFoBN|yQYUZhy;f3+^IR>;%71qD&@9TV#pl^i)E{kC z1+MU;{!+9vXVna;c5-<||F?1Ex%?e*6BySH-{oHRbGqk8#{-8x)CV$57qi5eM>hUp z^AJyjTMXM&VlCqHvtC69aI5_2r?$Zf=m854Q{b*$wY1CEkU6}r{~*)o58RtxTou)X zc+<|gu$>+C;+eVzFLp|fD`iOA4tifFYVdk*F?cmDy<;oZg*cJdeIC!DhSFb_qb`4D zw`y+ZB>egIc#H}31uyZkNf`dxa?fq2G4!6&sg~Sgamr0Bd~;ed@XzP^N%`?ul5m$a zaMr~7jU<$F3uFHz|MB`ED@7(gDqPlL9mZjo8?s*k{c_EOcGZg`4o!Ry>|8L%7nRA6 zw=bj~{Jzw3@fvjUtox=3uJ6E6Cd=aq;xe8m-1Zgxua3XBCSQ;$XyX1-ZiMl+O$_ae zN+Ov*y+izQ?ZCByKp7X{oi2Byln5JB`}t`?f`<am2S*X|L$I4hrXNRZ4o&3rG_M-R z_ho({7iF<gDR)m?EbN{_zg5w#^Ua|D)!HuTyA&ZVBS?2u=t<P6%$Bs!?;a}I=dh#h z6>93kR*;0cWN-7;9N5{;zT0hjh{SsYs;rN2QGbM+#s=>ouB^4Y_B=`je*2!@E%gO` zR${)ERLKDks;;b^yDykx9V287zL@rixlx&k{sOlq3@#%sR#nRlu**>d!Tb%llul;L zI(|8w06d(Xb!#L(<Gi5jfiGu)2a^J>SA391RR1_2hxfU0E3baN|FSspuW3!*D<LG& z{o&8h7d+p3!|#VBcn%q@@=F`<8E_To4tWkguvz}}g&2O%@UPW6jJiBkkrRCw`<m}= znT{s$P%Q@cUjLOuyhhKIh#$zrc%Av)Z%9TSFuL=&1@sx~)!pnJqjbiWmy>$uQD4;k zK}Ge3A&<Gb<j|HZk~lK7Yj`L0Mw#RCfD>$#+2eZko%=Fq;;+>&skuHL%fv!QM!+{2 zb>o9F$e(pTt^RHzO`ZR-b1G&Z?CIuuV7Gh>_J3#J{ufaT92_5v--I|ay4!DP+fSRn z4x2qZgnY^Kl5?3>2kJa68(pnxN!IBFs@izZBcU9^vtFQ&exWjP%vl?}Db7!<FUZHa zKPj6VneZz$MrAn(J>IJ-&CH$WD{N5KC;PzXT1B1&^pk6JdFWB_R{zD9-?uj7^K5JE za=0nRz}h5i0qkdX_v6$7%rhw_QQrwTX~X+WG#`1GbxzLW;eJwC*JgE49`qICRV4G~ z3i{DyY<av7^JacFX4N$V2W4z;aet*B?@05>WU!9In#cP!b7{sT;`W_0ZNO>SfUYde z&u;k$dSNhfI`OU-hJk<T*Lqf-{X`RLCcL?abAg8!&qzKffgc8#y|m(>f(wt-2h_G; z+((~sum1r*#%sn>FyDUr^lnAiHDjKUu8TAyI%uFDJm)XNYs^b_!tac7)4qzoM}4gP ztIPq^mp&a*`)w`9NH`Gs0;_<}BX{oXuY_(ldVSy|4ZpekF37eUeo1YA+xCH`ldtl` zyd}Z!g*gSW$>}uVcigW*D-HF8w;@kD;RkXWFK=(|qx-W3G>*gqhf5u4mJD#nVdnZp zOYp~m3x6+qE@cSkXKwR_=TXNVN{Oq!1fTRD9iE+zB#G1Cx#MqR9)*HNH)K(-E9Y)U zaUbW4OD)L|<ny^oOQb@fOK@SrqwqHD>$zts3p}S<aLWA1067@=UVwfIKUKefk+K6n z=l*)3a}9X_v0CF(5O~%1=PPX+Va82kSMO_o@Uh=U*?nh$&!d*a`9|O*tv78v!w#I? zaHFj23*C5v$F78%1Lq#{JAcicn+(;~Z+~+d_kuXy8wH{c#k8&3kU2zJt+XljS_uE+ z*tat3+IRH7XUjYj2)s(6dtY5bUK`49;C5vmBgmI=%Ty6M-ud&GMkR16rN{779Q^fF z|DO~^;AC|6qK~gfXo_P)l<foHWci8clWi$;_31E)JBi@g-jd7N&_gZaM|tcgNbBHT z#zu?)!+Lw_>&|4@rGG?hvoUz&Ay@Z<V66MGbrIhzc$o7si$3r>z;6!^*Q{*JB&o85 zn1Qpc@Q1WJo-6S=kC@fVH%L=*Uu(>)mmz;MIQFb+4$tJS9QS2mox6vFr&U#eSKc>k z(ZAN=xBI->o4q7qx9j?e%~=1!uixtLeTBaY@+;1rD-HcLRJ?wglv4=vJ1^G(`^SZ@ zJZ+7?cl_wr4~1UMR}2V*pWkcs`zXvy4JVzwz<Xj0|My^6;Z+&*pDc0oRWV6qZMtL@ zG)5AulpQC+`st|G?ziQ_kuMn%PvqT!L%aNfuUvaaVn2K2w+(noPA|p8t&VQl$C!s~ z!FuJePIf#lr&(;}XPp#&Bi}mNC6WeSF}F&P9vLBJ;$QDR;>Lz^z6F<8?0$uQ0SmUQ z^hLf!WoPd-9E9Ef(gtS+Xt{Ugd^{I1UIU-j2R02Pk?P8RSqL~{*|j^TMT#Q+h~6B! zDn<3rt2m({5C7?O5<0aEyjmUBT9b-(33PF3?S-CVKiN6(OPI=EeWT~p8sL)IiRags z1>-!@y`{o)eYy+}l~dM|&?S58F8JfzX_QGqSTppR;NIL&ec<xx$oc0lU>uBN*Ua4e zRGh0`HyoNJ-^uFVcHPT`^O)<Nt}%ZD-r8IBI|Tk>9IU=#6!$C69BQb*dnU#`w3GE( zW^qo&sxPnr_>=MX=VR#-^j-24yX*@)WL=fMCb)=6pVxBYbQbXHRB6v2ABJRha=!6e z1U~w>)v%74!^Mp|5BX1$XBsPi3@pQX<S(6mcmurJQl{#*4(rljGtk5hUKQTw?qI{g zSdyygzE7a53kHi6*CWoHo3FA+e6Bie<4pgY9yL}fG;1J@4vdHSuK0z0ply>c<$-%G zVQxHS!Pu{OsTLV6k9@k`-~#_LiWoRGG+>K;C*sk%%0IWTUT4>TYyJd0c<&OpM-=;Q z+=g*A({yN)2b()R13hSc^WW(L=o?pq0H;{gy#wg6?cnc?%WgWOzko!zr(w_{@V?iB zp%8^Qn&9Z%ZxRRmHu~%PDjA=1H9ojlQGu%8C!e;%2|BFy)gINk{yi<*Q*Tze(uBgc zY1^Z~(@=MgOP7C;5BmgO@4JY&3io>0vJ<!$_{HeS5yaEs_9b~fqxipXI};>wXf?<F zgz@Zh>`OMeYZ1Wr(ArgPLZLXnowV^x4fsk2FD6hNpre-hJEX0JUX_`w3gE%G!jEn| zwW=NZ(<r{iMu=kdk57z7qu-5p6X(y{$gkp8+}yIR3A!qu$A-v8o~vANRsnb;C?;rG z#mj^qt~f5nRRw(1)mf$weIxg~!^<-PI+<<vKtAFlcj4@xXkkY5J-1c%edITHPc6{M zz&M+q%tZbJPsDGejsF9lsJ-Gl#`lZX&Hf(wasvHK3eS!lmW5wk@m*|Lhv%{CwokAB ziE|T|mrq<1q=tVsC1w@C&(5efFB$y`9zJ#KZhHnvJi9D3uucK%`K4^tD<P&#@s#3; z{}4x^9Buc_GD+6wKhkEI_})g2*nq|n<b^3SzV5T6v*T0i1M2WU1%a~#s^v6s^Gi!( z*k|C<eT%9g_!WERP|RXJrcAfv#ff#un=SdqbH_0ciNb~tQmLrl`<{E80-iC5vf|+u zqTJRRXHMN3Cy8D2y>|swBJb(kWH@&}K5%2e<U8z_agOA?&lP11ey$g9emaBuV!mt> zby(Mw&z=g`^5Dly|8BFvIPLzuK74Eu#eU)8o@qt!qS?F?m7}nSgl@=jr#i%K%(~@a z;Hl7~H)Tq=sWad1EaLX$1n+oh@$Wy2`xl!9?|u7>dXDmeH|ue(+$Cqcp_QQOzr@?P z*2AAe*K;Wy%_Q+2<?}5T&{s`6s_8KJz2MF_(+k-sR=L=Q+y%fx%`SB*?sVwLdg)ue z;MJz|nEj*Z|Fy&EQ=5c1GrOdt<HQQsxh;pyRSUTG>fPq8+;jL>W@S9ug?Q53X`_lR z3(E6S7T%b`dhTXD<N-c2b?d*mLPs#)l3HCQv7hzN{pl$lW>n&3%DPGTDRFsWOwB9U zq4d%3CCRXh^^LY4gYYx1)7I#Zs1w<Fc=z0S6{j6$GyUKz&j($LQyXCyy@*1kzlayz z=t9R<I@EjQwr(K<dnA_^X(pil^6>Er&I;sJtaa?_(20f~#Y%N-l+Bv{&Xi5iDVk|1 zauxC5t(Df^H-LYBlI`Q~W#Ly`y2^WglV%O?wk9=0zf>)ME`JmI-4^9-|NQ_z8A+&& z(!di<iKjK=yo}xx&hn|n$S?a>*gD7IzVo)N73L=3wZuclFSzA!k2F$x{iQZ?diZ@& z-YPbnN8jkR!X*>B&p*<4VJOMUnDmZ%1e|)H&;9kV5GCt(e0|zY)E(}hSLt@DL4L=^ z$rXPOcG<c1yfx|oEvBz^b`sRHNWp=WN-n(TS3KZcX#w6Vd^mc&NIOZG5u8Qg5j5+^ z9o`EU7f@7hRDPh*07*!)Hob2MBN>^0UNbk~2NK(6mFCW~x;XqgZq3CgCzsc?CxORw zjCrD@fV*3Mb(}51I`b}zwcdyMs%;&)^oNh~t57?)vK#$Se5G!f<rUM+k&qVak{;Y2 zGEXy@>qDZmVGDJ2A*IXnU{ps0@%Dz>%xxZcgQ(q?t8)W&{>FD-=k}9@A35j^@G$p2 zPzes4!>GUO<~bO319uCLy|Kf3ypU1f@d<uvMvXh~@1o_3jwDC6OdwB{S3GkP{yy_l zN`S8gc*wpaqYyaj{Gzc(fSu9k2%Z{k#{X#@saW0vKQY^ww$B%MUuCoCfD7s#m5O`s zsPa?J(i30AV-V-t5A1pTEQ+MI@~snAtB1V@`^8@UfId$7XuYO@G-&h-Ij)Fx+l&Ja zWG?a<@xbjIVI+&)&S~=fDu%Ffyv=L5nhBJS^(KRPD5f-JWv?mbF)cWI(e?w@d6oQ) z=<mqC-#a91W22Inl3#T<PGBFSoLo28=fOP6{?sw}bt2ze_h#r90foXGRZ&VY&hhd2 zSEyr>eBU~WG@7MX9ZCzd&c(<6;?uW)U)sW*OC%Y`TASV{L-@a+rY1KYz~9#ywL4{C z{a8<*hW>?r|2$6BT##hqUsg?fxPza{Km2eFrfDK7tD*b{o-23KTPp~9!$$b&_d$7v zB{1XcJ@-CX!f}3+(M6nRwHndd0e^lM&}zO4x>{Z9^4Z&*RQ%IVeD~ks_sP#5cMb#B z$|mf|>)&zC@|n%ZDn;a5n#nQS*cb_4G4J0({iuV<{SKO`#JG$;B(}gVl+0oY+i}FF z#KwqC^30;8_G4$Vfd?INyx+Tki|fAj>8@)5E^yBCdNPgAuUyf%XppA#ix#*q!g!4W z1vaL_j}v>MU%iITiL};{h-U|1Y=2N&D@#33+JDbrt{;VtQdqsscbe74zVdWV19&Y} zvMd?%t1sdIQ6<HQaJmE}u2_mbnva*d7Gq!8Ui^qUFV6i0RMqF&D+90C#y!->Xo;xb zSzcFgAMSko;i*Wxm*AcAY2hEgaBk_W#SaAm=<NO9gKk%ordO=pwk#Zl9uRZv8P9`# zLdN5FmxIp_2FC!uiD-j;b{qcT=h!{vYcPMK?Y(N%S-`W^`Q@hI1-aor!OyXtC+_Y) zdP;;5di_dX^Bm&dSI0V3rW(BF>bBjm6z3I0i|=0tPN<&^54S@d@%G}9y*m<cE=-wy z(4+<LBQJYhwFG?KzrkkK7vp0I>ONe@NwGvs57oNV)5K5Tf*sbmsPFzuzPb>8^VdN4 zp*3_w2^pmu0e$0Vuk()vJ}B;GOD&J0S;_albIpD3lWEwwqGhoE>NeAGJimI|*hFb9 z_=R^FuLuo3*j4wRTL{jPRZA}+kRK3jg1N%6q^3JB$A->9=*(MDQe5D-w9c#DHxZxl zkG{y;0^eCN^XQMi$l@>a#1F0jZW_G~u+1z(J*n3@NF^V*aK*IrH*leU-az*l;y<0^ z;D`55X_jl&(J;CY{hZi0URS{QqE}mI9vuZvAJ<7k-mEJAS}oRo1o)yiEt?4)^EU2N z)V~_=v`F|zZApyp(5A#)zmd;x)6erneoX~LtgwfUd=TdTZ5X_!Cf8TfjCidNe5!wS zn0B!6RXDdD`P}Ml{+UA14}5XTo1K9hL~pjH)OF;S_I6Li(3QTn`)g1W^e<~-M_e!P zC;fv-;bG`3wH8;&1*ogI2~SwO=466rOwDc?VSP;t2fQ<|zB@!@$8(zD4=uG-1~`XN z-km}xj+53;w_jN%1U%*D<-eQ{J;beaA?wLklK4yso?QywG78VzHi*2DYy67mkOaeG zeG^pN1;1m3r#4mHK)!B!*X;E)&C++W`H+UXz_R5xLX2l=IpwAMJSFkD`lT6xA_0hd zGhX?1=Mi_O1VvTa$;PWH{5op0=zA=|R&)z_hfnsCJ4)|S$DG{s(qtU?TC!eAt`+vo z?z8xoh&t0SOR6&-^>$-3FCMJ#u%Xah6U5P(f)g5BL?|XuSa{hU<ng;JUoHy;zvRTq z)Xeq4kSmDN^hVs+U2R^R)<ehtDzNL&z|Zr~{#dJDg}T7SJo3ah?9YT$c-5f}A73SW z^a~#oU-9I}1CkTx=y<+$UoN1D=LCns-1@Vt*meE@uYT12aH*e<>S(&D$y$c{dR>ba z+&F~uv|{_uB+d2l6bLnKV&VTyM{<+VFS>HOwD^C0v$#L7cdgB1;PZAF!88xxO!U>& z#ph9%ikxNtU?)y-E2?<;KJEuk6l8t6jQOhWyKQ$H^H;p?RpGxHJRQOkH<_m2NuHb* z*ol10<@~S9mKeY4e`&8&V8^?w|0~#v?<*DZyv;R_St~HP*8UyxD4FbSr~QFH0uKtS z4PhV3Y{cIH`qAowY~lp&tr<J_JwAo!3Qly6?Lu5cuN;jue+#>B9vz;mV>X;JvN4cj z*uG5oR;+@ZDtF{0{lk6$_jJ}^74TYapr|W&1ncHe*xIB>DJ|8^{WW)fSF=iu;~T~& zr^h*{mIYlkx#^QMbUUMvXtXqeE^FP{c#Cb2WGy#+yJ~AK>PWx-=vV~ceA7rvvn?C; zKbB3Yn{Y7a+m;N6DFSyF9vT075jfRx{$Q(eHt>5a>Oa-LB+*Fe1<FWMt7P5o2){?& zB92owLK?ir-6pt<AGi?taKTdsI4+@}%PB-K!9%Q8avbsUAyZO`^E>um6E?mYN+elq ziRLpt!0iw@Qx`Ed>O${}1#6cAH;FIX<>$S}{j+zj8}Qyc?4#G)G$7wPPD!R3<DP3; zjT+m=4%i_g?^Dt{;K}jMhG~q?L37QGdaMW0f5FMXiF`Bp#Bh8UbfQ~XjMJ?Wnh+Su zkoX1s_}D|@#VU9Y;O36A=_{CECGR~eL|~`-`D|xa`;jcI`^OcZgTL7Bd}}ht{7C)E zzlDpaEmv+8B&v^)l$^~%kH<eqmaN)^^<**p$FRTX*#O=jNO*pmlA;#G)D&dpBF?jg zSoYO9I2XP~dF^S~g)j?metQjh!PtnM_$00I2yLp7HxPZXt-AW?|KiOduUJ!u{_Gtu zMCXeD51xFwF*`-d9B7S8dCGzQBlCL8M6tf}iW|)mVDC0nmxCXH-|-!FQRP4Bd%md? zJWqflU0oI{0)F6mfpVdhamYUxQvcF^f~S6-6Qc*|1xBlWZT<{?kYGLBFh2tI$2V_e z=XC0t;hz^CBaW_azUH3LM-FK@Jh6z!&)wRN&y%sAXK8<@I^YfRcztS90rFke8V}hm zG;QO^_R`_SJcd}ScIm%q;JWewttjV6<c+JOUkO#wMB&w>o-j_P*ebK@!XwyStJZ5d z`tCD}+b<0*#ySS~*D2^B@2Rfz{h&0DX~|B_@vjB$up-x8Jno75+5pD~t1O%!A>;jj zf{zT({Uwsb8J{<cuEvi}ppMhBXQdVV#CfZzx<DEJZ=mIu7~+e2=9Xpb5XqRYulnFK zgZ+4gO>_+6{Le*6`9Iazcb-`CeG~K<k*CtyguZlwsxPmNLjSOwg4vE^y~@=#b``@e z)N<d>PT0Zj@ENgM0jAtOrTiuPFZ2;A>|>t-?%DV`<lV-2-7F1j4cl>#=hcCMH@r+s zU2u>`JpA3v>zd^Hm&h-5pS?>#oU6r#+)8Z1e*TfK&+g5moIMAW)=mPi++xqPEY3$? zt)B$}29?nF@@{c+eY+$YAFiMU7~M|I)?=}V%lh?CFHK;42cy4SfKDLXR)?=S0zS*- zelhO{^zjZNU%}xW#?ARUuRI8OfO@t>5^&Nw%VTn`54hmf(ThvvDT$g?a~EykizfHc zh3=S#o0Cb^!E%x)@!k?PCd3fu)oZyMr)ayg3id}_dN98~1_O^gX|sfyPm?S0ToV-~ zn<dDn%e74{<7deJ&wn-xIiL;{&0^)7V*Jdcuf9LNFI28$M>O!tVQW^M0w2@B6mWj< zSwP7>_K|Y6>cn~+y=er!MucA765_6g`Mz!IS}RPITGo&F-9h|Oes<G-;WTmn3fo4m z-!vh!h{)kYU9|A6Hs?A~O8N7)>q#wGZ?9g5yB(D@@up$#!+Na4gTJgBEZ`9D%UjPq z&=1c)veZ!u`t83>Mc=C`NXo)?-o?+Y$eVA!?EKt={W$O5ml>Q4Uzpy<)$0~eEGZ!l z4t?0UMRJ$;2G~>F<=KKe(5<tldFGqQQMoa_ZhMN^k>8BD;ho~prLwURjo?)#e}hT^ zzISzwt|8vPR-1RSA!!bW__=C2pCZ0HxxTlmVVrl5HLlA=JyGD8#;~(I6`$ODK&Bk= z>zsI7d#=C4dzms(?VrHkoc{Zl;O81#L4$D}G%My@X~$e0$?O3CRPO_vs|l9b^0pYb zBFSpV2mh#BtPlUH$jH6+Sar_>dY}Kl&C=(-;k`y&jAC9h?xQ{E*X~wea9&2A4Z4bT z(R`@a82Qq%{t}Vg3d|!%HZuvh&><W&xdETMcRqNl-4Lm_V4byDF+cD$cw+WbCi>)a z8*DFWBMHwv4_7om=ky!58|F2Wp~3pkBWqEg@d>+kE|5jDes4Z(J*SJL;!2r+z>T|y zQ`|))8J};~nOpLa=edP%oiqZUp1C_>w;Xux6ES<&8upSP@8|_gk!oJQj@vh4UK+ZW z*md!~K$Q<lUF*AOmR<<wRlVDZl!e$X>E=?Y399-oP&`{oNN<zee5c;x<P~;G|;@ zxBA@uyocVN94X5vvwQ8-rlULz%jn5b{ki@BEw8*4b-)Y1K7`qeA`Ut3^YsX_Q%0Xp zs@+lSM*N!4(HZBlZ+=ROcO!IQ%O@H328<`8_t)ypk_@HsxVgq_6n0H5FTRd>d$|R% zg7b0D`t8}w)8IWdfsp05Tj-V7ri9Zo6&Y68RADUFAJk#{RFCtvVZLsI<<+pmJs(GZ zLm{f))NtGP6yVLP1+E9}YG{_Ggy|`#VdUNac80G<pS<H?*X`zsQrQ-&KQs4Zzv8%< z)(Ry&kJ}(b^glP?S8wH`O9R0F%-@H8mC^lr-PM)f@w1nX_Tn|L$6*DNbcZh7ALhKD z6$?D}Km1_Xem+J}rs7hnCH#!ni%*ypjecdv-uzktf8~DKoO}g-UvK3jZZt{i=J9-5 z(+wQnl74+T4L=-T+beOk7Wo)6t$nSZCUWC{t}f=Ier{a)T<-+dL*q(x`+-Q3@VS+l zr2QJ}ELE;Cj^Fot@w~%1Wwi^5yZdi~-{cNOi_h`n$8Bd^HZ(v7T;(}7J_3FZ^1t%u z4;flFDI#~7jUs$jZ>-MFqlvZG-`xyGoEOSE^Cs4igvl<8{X^B{n-`4J1at?HComRS z`;8`UJP?0z;xl+PismR91P|tinsI(7Q<ffPH=X|v>-ILPq6&Emrx{m718}f>|MZOh zKiHAg>0CQZbJxySsDCkrcpE>yZLa?_b<p;v4DcY@XYHvOVZ>21_W_$4+UswMap@T) zhFDg2XjT_~)4%ggeJ0}aP5-YC1;DYCJMJg%^HT3zUL9H3jd8Pbc&7yL_wV^Z8)*2= z`%7Be*DK;Y_Mxqj@6k^@|HXnY4^q%)(Ch8+-86ikthy=cM8uXD?(`L?=dk*2A2yey z8q8%vca~!utMa1C&_{%^KYLgt<~NPL@mnr;&*5KxM|{>IrXz5);jt9r*C)cgZ?2z~ zThyHy{YH#qI40nlFX|k;W_Ny;(Je+Cufs=Se}g|yRtbW~`y&r-I`9?ianon)N(Rmm zJf4<$$4>SCx5Mf6GWf^V6mG4}oh0kP#IfmlUEtv#Z{$<quYp;KXAcdLrJL=eZ9b!J z{kG<^=ayRNA(`h|moSfe{tYLDF>aQ})hq9_Nw06q18!)5Pk1kn51S3)T;$64Z>8`( zg5JBY^1}~U7uh4ZI2g0KfyF%m7`M!nPUPJC4u$F^c$#59Zspd%m*BVV8s!cXK}s&k zRCQV%`8_e#6S>?UeBGN;?^y#L$^VtQOd9<iJ9Y1gu~C{H+pn#}y)Yt>$<0d1B#A}Q zofEEA*w5VkAU9KmAs(o#)4Ik<rBNd_>4jL|<ilGm1F^4g?udxlCCoR}i4MLA9J!Kb z9@{QRvD6i#qPPCVzSdj5A@e%iPd@XQV=;J+Xc*v}>kmBL_sxq-m@y8QenM(U!hhJ# z2^QSN{5C4o7h~PxXSV1qg}+$aCRj|)XVh~t^=B%Pzy03ivq%&6>u;lO3j*JUU26p` zpkLI)2Wqa)&`W-@8GdyFpC3*fT&4uPe^eV-J@-BvBIWy~Ecik9%oiQ2QPS^^ZnEgy z`xdKxw)H5b;yrQ0uL`;_-~QIS?-u~ii3bj5U14<eqK?fHmeAdId((BB!OsR8_&y6W z7-xw{aukhtYgD~Maxkg~Z{GWTYnmqdKBs-uhu_%Qrv90`hnqVgS)bjHzJTZc?!kLA zeD|MDYMR^6`!`;^TcZhf`2OH|Z#d4Gg$i7myEo(0=IvdeL3M|o?U=ld`ov0;yT7@C zkH&lUYKZ<s{B6}%NCn?IJH}>@6V!N}h_d_4Eb4C6kGJ<%VxD#38B2X}zHfJV`<@Bl z&{_eybeMdiGZ}Ps558}s+Ln_8u**iBeQ9I??7X!o*Ba{~QEIjH1uqpZYCc{-Vq72j z{n}mY!Q)3tTsGwbH;=8m=83vi{FQKx#A#Z;<R?#<E_B)M=v`tGKVgsCFE>4g&J)bA zyL<=w;&sGc%e8XU_<_|0w`vq9YT}8S<2crzdSloB#u|Bg+oRGY`2V;sZ|_u#Q`ASM z_mj#z@aLtts+Un%hl4ewEcBDAoxENEctKUT?OwPD<zc;~*6=j!CwGD+w=@HJ_CjT& zxqEFdkC;pHgQw4Ysd?eYOKD^rcR4-{yF@?u7bgwgEnm&{Zv^?E?uPRr%HXM#S-$VB zJ*0Exo5C{=-SFR-z!2ewBo&`<`L9$j&fPwKZ}9?olro?1<3-|>hPReTm3=ez6V`A( ze3*^?VSyr2jqsP0&4I^?;g`d?>5ZX6jC#>$XDSVTD<7{y7r|f71X}i*1HYWCHG>M! zhafXMWZFfTip(1Rbbodf`#>KqY6_*p4@54m3WM(O?+Dy5*C*AsG}10nmhpRgAnWwt zD9v)Q+g6*5^?#GFvFk++_Fu-o3u*qq`~w_pM81>t(srJLTT%aE@<Tp%1|UDZ7-(!B zg!R?Cuu*dg_1RMYT`W1O+Kc0fl_L1#e0#*}D&TIY5v%JvKA#wC>ir1$%ce+HzOn>k z^7_^lDcc6<H<#qWJot<L9og6Q(7P))w^<co-552=`bE>E#FX#X*pW$`i;Q<*D2(6E z;mZXo33(|8UO|QRHoJU(8Q!D0KzpZy{$}{Ck=E;tg7`jny;X0WfJ2nTk?v`nzetdG z`u9VODSWoDf58COXGYUl*#zsqJtxcAsT6sDy}NpYC`H_B-)pTtOHv26+_>&Pg?g#j zx~_WUpFy+Z2j|Y~NB3#poa<ja@@R@*PKrtO+`8_+*SP0+?BUY+DtMk~$<m68VRJb8 z!SMw6Q>QfWM(7Y7`s1I9r#x_yGMy@{et`X>wLzyOVV@y?HL4o;bcg4x7C+9b{HfuO z=0Y80EHWY80{0DajLc3~19vs|xQ?HM|Nh*^lj_38@c;JV?|Fd#TT-?>{Lma;NG;!S z=Q2&OA1b}?2Y+cysF=dN9WjYl-q(zQU%vZZ`o99M1u388bjLipot47PzzdFpFLvWx zsoDzmg2st|=yy;a?lF%288!*^#jR~5(Gw-{<SX(XFOA);OQon)!TVi<4S^$SP754` zp3%e)0gmGTFg}~p!-_}8(I3SjFSB(Xb-!Tcuy;Cm#;9G{`dS)v%L&)r>FIdxoy_ZH z0t`VE)dig@B12P31-x&<e~2>;rUU0m^!M*NkO#b6A{$>H13xD|y&a*aNJjUAYQnB8 z_}~6i?X8I<alB@_EWH(Z-d##&9Cfn(Uauq_<nbGgAD$loJ~Qko0&MU*Gp^5RS-^2- zzu2N04)B17MP(X4Wx(&e#o;sjl-OB+YAO?Txna-1KXK51P68G}z@dA^Pfy73FidjY zKmMPvQ)t0e$MPqL<J6mv12GR~Vycb@d0>n5?56*U=>ALMUrpjsPtN}}+j0*&$$zDJ zZ)hF%FJ7j6lo7}I`@_4o9pz$}ZBiqfHbR%Fm*2A;{0e{YUV80*0QTe3Yi|2P$1>6- zvW*3_-HLxtOe04SU*8&%4gx3h18HybW|}Zt^K6~-80t?u8CmROlqYt3m<v?_?~D`o zwb6LrfbB@!ajaX*qg#3wn6F%erT;@7yszlmp?VSERsN5K{WqW|hjYEPb_1WwpI<SJ z1|G0PbT;$zFlydsxsSxd|H?Bqtt2siWxI2{6$yv~!*!$Rf6NM6H`tRePs!X6*DS6d zLf;0);zL~;Nt6fQODB`?TshXK4)C5%<6@&53#o9;A@>~_$TNia%oRH^&VEm)FLpk# z_m?y`&c8IPCV$PN9m3Q>|I^;=g^1q;x2_u8N=E&vymxiZQ<^xo&3;cEaMJih5Z9gs z)XaU^%uMu;C62{r4hJB9CiOL)(65Q;=F1itN4$#G9(C4RNG&22xV9|EIQo+vWN+jA z<i__E0mW^=eJKeIlNPMwqfnpHaWZtU*gj&eo)G&vRxqIqeX6XYrk{h4)OO`~EFQ%7 zJuPTcl%|Z%q8j=ae5Xe5&oB$cKGl@eWNZ@j{b#+5FQ^Z-g$W7UPLpcp#R8Mu_<rtF z1`A#T55#ZY{rc=9*6UPw(GdKF_4Kdgdh|W#{>u1UA)eQ2Zk<;HT;mK@T5t(GV&?q3 zaVyqIBZ5sjK$x+l!v?R^An#-Sv|l>!4DfM2H`_4q%4f@(t0C~ql%bIROkTz;IY_96 z1$`7Df9mPnJh!^Y8y<!}mPol^WQ4pddjI3_I^@AV1{~G*1M&N5Ba8eB=rC*3KY>3` zFZS57a?LmRN0gSJ#2Cq2Y2ZiB<xBA&<oWciNW1n6Td#9;;Jm_to+P{{kSHHj4eI|( zp5fUVx<mu>*zORt%NusniQ{yCh<U#>wbXtg2i<w$ypwSsEwTCJ(PL4V*QVs5s=Nj~ z*CDq?sU3Ej;9qQy_{|74w!wRyuZwpj6)FH<*eqIPc30ti>DPZ^wy<Zs)mYyX%(s8j zpHS^FdU*P%bjxetpRv)B@x#Esmdh=k#0Qe)B0I*xA{dsB<q>r;K1Nyh6D!`}e~zv@ zo~!qZ-;foBtRz{95?WHpy-9r~p`tXD7LrP(LaI+zB9bCm+1X@8)V&Fjks{e4Bzq+z z`n~=B>Q&v(9nW*l`~5!WInQ~ZuT<*E3vszLYtzI;ZBG%-6L=@~!Wj9Ni8H&3syb-p zNFm$tQVxcimr1$1Vjj+&&Z>NmaaLP3XiyBCNb>iN!MP}`?;<QSH{huIp`GeZc(2H> zH)AgMgP$HQJJ+HF{ioU7n8ZfCW|N;1nCn0J@T2eA<VKuNJy89(^C$d7bHbzv^TBaw zdwb-3DqrbV;~O*JZcy@5PtFq9ljD_&xxQ*mrbARQ@(K!iL7P`9QBEG=EsL`-AH>GK z+$07#sjF|!l>`3&Z~ms!&?~ji2F!donHnkaDJ5Zy6SMMpL}>wdQmJr#HP*ciGCX(s z$RIvaXFsxNln#k+yLYc1I45m%Qhz`AQcpHOY!JL){6Lo{U5+7ixvZ^rEn;j_%uH6J zW{Z%u-J$%e4)MUeT$gLW4JN+10`JGVEqll2jy#pq_50tB8BU6D3fB>QUV(UG=B(_y zbm004VL^4^Iq@cGM^yuTM6zPP-&e%B;tf`Mx85Tk7Pgl|vydb{U4FPo1od0HJY!9< zuKR;$-{u5+`288}o_|Cd;+)r?Zg|4)G!@?ZZGm6cE_xPno{!<3t`<3@$O*p8(UaT; zKT>YzB=%!|DZA}oW6MaEQpSQo*QHe4fN-hnZhpiSCF_2_ETSpNKN<6sy5{oKhcDWJ zF9dc4O&lAhufAB*z49=D?_Xc>B;^&>bNI3j&Yc@QVf*aeFzmoFFWvMr@;<3*UvmpF zp8<#7C>}1xc-&uLbP#?n(5}el2s^iJ2sU;5McO^Or1$5`5aOJV3T~UqfE(fGbe?1U zc8afcR>U}KY!|&0sK^i>mK#j8z9EU5Hj6ihV!!<P#%nS%P2lrkv-%6*^T6pBn+n_M zW0HyQgSU*4sM{?td)G*^xEd=9b`1cBEBK4}F@7vA*B$<~wCx&3b(dZ{$?WIh2<!vy zdK!ssj>YpmbQRqQe6Pk%vsDlO(P<n4c1cTGpo5jyQLjFLM<N1d`x5Y6-7`sR+2QAm z^!jlzM&rBA&>92eF=mVGr7yli9H=m=+MEe{o-d&BfCtwl{#b$hy!?2%WP}Ji>`%k$ za`OX{HPIi$v%VX+CaaWJgZE&B@1O6l#k%m=l_`y3k~pr(=DN5F_q$$j_8N4S`mfnz zZQ%WhYsx*x#F@;q86_=V;7{KtBUdW%UZ(~wnw<e3rY*T&T7&T?v=)_32b0tv-xZT{ zeO|5lZ7YYON#f~~DDOwWA&&N(5fA82@e@8FX57r0prK0nQRvI3`r_>*_|)`ANKhhp zOYx}9XPhrjblkVzmc>EYA!u+h!24M_y_(p9cwu61l_6O|5<4O@#>|&dgh{w?|6b&; zW;lOe4`ZWPGWz8k?7{oeqrSBr?zsM=pt~>pwcCTWZ_Om_+8TRmeLws({8wAKF6Q}D zdZx1l^rz9wrl4ndAMQe-iYdHjP&hUC5dNW9&r$y{7x7@_?ay6J*gqg|QvCt<v;7qO z`{xu*MXzm$%g@7jb{+2gO(QOf7A%m5Kh^ZI6&vC{=69;~xWACGhW&Rh)WPn@$MoMG z08UzI(+RN=@JCMD{jKol@CmC8k%M%%OX3HIP551Yy~~e%7!R)#O??-dVaGis%atY( z55&G$X)MBY==r>|OM@QNAYD2h6=Qup!*9C={7!E1W838`fKLe<l78fp_E9Cj&m8)V z=LkI;uX=_&XH-_0%@?eP@f_uJLtbG1sAHAxVrEx$$B1+ea7bgQ%GUzdsmz`{m<v3x zsT#g=73(MA3fo@(H%aSeUgI2zhF@A8Gctc%1U-53-jdhAD_xa7-P5R-nh?F;W4WBt z@i#Q)5k}qcP>ZmqD~&qZMTuJTaeX<T()W{iuCG8q!+il}A~`ta{#Nk&J%#Hoe_(&o z_hQ>515xMw{6Mug2j=M{X?C=M%=^O8Rkss%;ZZx@{u;Q#t-t={L45av_<^WPun%R& zzaNKr8J~lLj}~sjy!pRiTaD5&>h@1T{-}1~5W6<Lc@+DQqXgfWi7;_Kad~TwcOp+> ze#y8E_Ofd2zE@=!Z(ZRsG4vBB_C2@p8R22rp55vy5`zxo)%+K$@seh-2b*?swnM-0 z@5+8X0sfvmQ%SKgr#eLj4c5b-mnT(c?8bar^>I861wU*!^7oWJ<}LHD#6#3GGp%=) zn?D48wOvXHSr5BocYDX1Rfv8pw>Llj4V-OV{dRgw2i>0hQNv<xJ#@XwdbUfLuXBrH zWFz~q|4b`b3FiwCuCL8*Vjsgp`~4H<bNP10F5%(%$A}YlI)o0l(nM3<n)lM+J?|)G zt{EAsPR(8HIPwFm?3ls<C4BF(+mHLMV19`M4x&-uW$CluocH#UqP_EdOI|=9h3C$G zT~!VKQ?`{l2z|H4n`I>=$*@M_LeA!{qBOQpEuYr{4@8^0gj&CntUaMs7j=6`VnNyV zeX1D0wDn#(Y4aHQfP@=u=JW7f84k<l>eni{$6`1Opm#rIDK-7Ude&55P@)2(G*0w? zb5zH=j>iX5pq6G8{FHIZz_?M8UBU+umso`e5I$T~q0{uZ@?8A|$3`Wst?#ie?Vj?e z2IJ_Vt7kIw7y0j~@+~DpWUWV+Me|O?H#YO!kInIrPZY1)OcrqAbXCy65b`<lGd{Kp znXUTW@9wlij}b$bgU9cp|CGVA2jalBlDNLoUgW*I&z&uOCc$vO+aO}XIf{JXmn#wG zpTPrB-{p9L*S>8k4-#;_&3NKa{}|bE@{Z$BD{%Ke?IQonWzg$AM}KetPcQywr$=I3 zsoa=Q=Omir=~aKOOTcxXg8eJz_};eVxszWsO;Bx_1qSe&y4=x4OSl<hjW|(>Z~uS~ z!#r&lF%M1++sq`vhiMARao+N%`{Zjh8kV8Tlddbv1;7q&FEnyki};q`VaJ0t$agp} zvFeg?Shwd6daX80UY0w2X~j*<cij2V+X5ID$&RI(Er{nvp88zNfL_rQ*3w75ReC1I zWqbP+@|%~tujjNOFLheFs}}oMyOvj(iLHcRJ3mq>?xHg^f5khLFQ!<;Qrj<w;g9## z52(zYGn&jlaf?qL{G%p!YBkO;YaeHGzYG7{lCmH_96GG#`^T-tcz)|cW{D_xwdq=} z=xJd__fr`4?GEOh)#nu@?TCC7Uz%<&^0BL|Ey5ovW4)*{D^3{s&J}$^F+unp<>xuQ zBn<v<Jge~(_}98_(WU|DAH}1WTY}~>!sB@bExGVFmSC-&T_x(ej>_&cszqKo<<5bi z<)}lyWMO?<iE7%I7-)AFc&Zk0<!^ct)+w5TKMg(uo^MgR_N)`{*>YgWr;&`1(9c=F zLIQgAfRF4&;M%&jTCS1r=&u#Qdt6nLA#UYv-;*lKsHEF}_nq4h8?Gwr7W9Rt{ziNG zCPHU3CqGSTPa_|^)j=Qot#T@~WVvRL?;xI=XeoN2Z)oYn={L~5LxNnpxhD~yC7$is zwVVpsG`niQ9`bDyb+_HLQFkr9x8R*T?0#tFQ}b-_y5BZVQkRRG5U`baaUFj@vOYS~ z7vmhO=`J#NzI}KSIlCKndgI)x{FcSc*!m?^GFH&t;$NoC4N;e5qGo({J+9xyBNV;> z{N@z9EdlyO&gkPI%iG|E@co~+3VK85{_Z)&0#1f(5Ngwrh0Y0_Tzlv{9bPXwKd}n> zN0YKv`u};O@hf%xDxt@O!wh%9epq+i-~U%fI-MJkabAY`kshk#t|$iY_xzmJ$NO!N zdQ_4GzwCa?7R(x>??<OPX70iF);(UfGBy$UDfRBXtaRYjiK`OIaoCS^*+^MuF=cw( zHgD~wuUOYG4()BO#`CC4CU(iN=bWpw0G<=no|N%hjuE)MaP`7`yoY^}*QHzN6N569 z@^Z{;cb0)&7jzu!MM00wH#*Iw)pgU{dDEF0ziw^;KGww4itonrlN`P*t%lwe__})6 z0!~K2uU5X;?l*A2^^)8-#8Hxk0Ybvye+}h%>4z6mgn3ianA##H<f7@N89~Gu8`3|X z+6-Nw;q_?XCBEC(T5pj&aN4x~vmtjs$x7c5(5(cV=WQC<<n;=C{p`W=7Jb~`BwoHA zc7R5&2j|vh0?u{aeHMiEUi!7S4(vVc>CmY~9avviUh+K#{2QM1?Nkc~^)|S1<~}Fv z-nF4iW)19RSLoJ#Zy4;myrTHS6nr+|XC1thpVDk?`MAao>npEIr2Xx2Kht?H4Zr1p zr}I+eHci9+-}Wf$Eu~7FCB5!10<LMCey#W@5B23IHt*XC91^(d{9X<?L5R<G+Q*Q* z)2Bt%gXY7Y>+Wi;y$)TK`)^Yr^lq!-`D82HuQh4*NY5YIK3jEa{mcl)_05NnX^gi= z-r4*U7(eN#9WqbBtHwQkIw!{H+*j(ock-cY-5zfcoynw$Kl7h`Seyp?8`P`_l7v4j z8o0%|kl}85RCNpIBod6@y0im#@m}x!-yed#Uvyvd%L)F~>P<VbSCQIj2LzmPbSV+3 z;gJym{t(z@UND{me|o-r=aXFYd0cAuX#Eh~7rr&&Xl5t!>NtPXI~Dognw0oN*xmKV z7Iw<uvyQBYoeQSvCmC^*NyzsS#vE?70_Y2-UBz?aHu&Ge^`CDy2SZ%34~>!pzi?bO z7~K>Pe4n_Yefurm^M*m9YcTw>y5{Y^L5wFy!7X<|hW&3K|1EPR=$!m~i=<}Y&bp%q zOX1J0jZ2O$?LZ!lW4p}j4>X7Hr&jhl;CP+b%?lDwfLB>3>AqZyW7eI2NB<!Hata)E z@1ieA-#jb7lanFNl+2=>6z65UvT+pzk3?Uwk&EhrzubKwG0{m&^Gup3wLwSqUGzGp zpAFtx^54$JeB4*KC6WvNAsy7VQoe+~wCCT4mpTOU-ujK@d*F|zhn)-7fDbQ+@$u>L zp|8vKC8lv><bxOQ9qawTm%Wy2wg{GE+@4H4aEOMTxa|!z1V26a$k*ZUmvq-V9X;NL z-?572qQ!$@=dnThIV`OI=f2v5z9odM=%IVeI2|s3lkZnq8_r#QezndNeq0`}lIQvw z>(tTn*>Ro+VWiHh?%PkR$&SCYyxmE&j=Y=N&VhM&;#0Ft3wA0h)}~>og!pCMy-J}0 zI?nyZI(`x0mC@D;S<P&kb;{NGk!vILOUY&hcJxgg){Zk86sFSN?Tk00#=yG;$L%;V z&h?A7@8E}@mOkP+I)ZpyL+cY~Wi2VLzA-7k8ucvV!8=($vVgnJ=clAn=IS5TKcCx& zkhyN_?Q4^CVC!I2JWo5;o%ueR+=+p{5Bpaq^9g=(MJpx|_Lg@07F*yntvkIhJWU<* zZdH(WAuk*D)Y!C@!2NvJN2|Kl!+s20yZgV=vxmpt9DD<R)}C;eTv3g_rb`dlT!O#l zkRBWPptA|nkI5;nw1C~RGVV$EIkWm&|L+Xwl^xr3Mc$!)X>+Gh<^cTR<!6q}QS@<@ zb)ufuqyJ!k(vF&R%-fpMfi19`D@QkEyF+i(@czDQF35xj{kQVzzZtww@<6B#aM$$- zTB+lHMtbX8d4^yw9BnoZ?3C}f)dqDkv#_^oPQOJk4}lSvMFd{L?(XaO%OlTPv(5kh zR2NB{qn{>QL-(CN_w#RZEpR~ok4cF??5~G!pn@0naZOKrCW-cNU*c!B2zXl9viFG_ zLsKpl8<YCLt1OMWeUjjBt9}bz>;tp4N#ASLg*ZynaY3~Y{F<>2OVh=8%f9(_?k;qg zx{~8zXLd?D(Z}q~crW@KewLt?VP5Q~Vj5HMeA|DA$#CF{O`BbN0vq*YO>VRG5%h7e zxZC070YBX5_3fKH>|V3^40{~(Kz>rmxl&H%&^*<zDs%c={;7w$32-B(_KJ4ycU&j> zE!jehLLCP=c5gW~WZ^OPL<_&?m-HJK{s3M|qpr=k;5uH1zrnyOor9rk)wn5X)y+a- zr9D^|UoI2*t`K~G{j>RI#J~9_X3`eGU3nu@xk^b!;pTpg)?1tmOLag@U#p#DRsQ&+ z<k1P7oPXZ@82qqr(et9Oiz)fW@F(ZvfX_qQ=rIECccQ)bJ~!-{kzs$-G76slxn}kD zDw5%-@^~tQacF&Rch?8@?3<z;G*?%kW5cydlYqaOI4|!+eQwgLRNJ{anR1G2#bd1R zaQGRX*$7;*y>!CRbqMo*Se?_Oiw;!18P;z)P7;SrQ)GwIpxe|}`)c06I?iQT`Y`It z(q!Mb4h)h_f;vGZ?!fVqjQR=vIQWN`YS{?vy2f0~UK)PXdT;n{{0wP)Zo@XoxjOS7 zB0FryV1M2Ar#`H1rHT6uemc>z*dKaQ^>@i~hP#8K(M#kv>bJSv6|NxPl$=MlGov(f zp7%eGF<f_1VUrH}G`QZn!>pZwon0Hd94QH2sNbBPy}E%W9veL|yM^!TcDVCZ{V%Cy zy)L@UbsF!ZS~SUp`6yZE_;vUVaPZjqm$zlWkFKLzXRyELh}_G`bHJCis`pkZ0sp2Y zp9xNXKwU;=#g(_P-|nA7O~1LQ{EoV4?UnG~uF2WY9u@eG(xC7Id6<ujyR`lBr-zbm zb8R>2_Ss@%g*e7tzNMfcHVOTp+`|>TUI0%8uUNH~qYwP`h}3)us`c0(j%f7JLZ9bP zLA|k9ZydN3Uy1LjqiuA0fs?Lxf6rq5Rq~bRlh85|h86cO>#`o~kl6kra3TcX^RzFW z8*wPJDO|4pFMX{4Jp0d^&^_ue1g{#Dz#ar&vxPiHUWK##+NU<e{}U<0ZsTN#X9Ld( zbG#q-zP8aZ;LEwv1KW~5BJX~?!$c4BRIWJTL9tP42dD2^J%s&D+<mQ^4<0-pQuX-^ z{Gaz;tl4#T^b0ETetu+zHd5*gQ7-8P5BRND?xRW8n+;D2HdK+slUo(RwIjfth($(N z*BwhJa94f(4S4hAzZaWbNR~!m$kSucStUK3!di$=sTs!fW*w<*wCeh@OvE>?8s#yv z7-!<~aVhPy(AkbI^Z*<54}DlUUYH46FcZNyw?3fv$9l`nZ|Jv{z4W9s=C62b*1N0H z6k+S~Rw-bJRw1UhZDd=9c%f<2lk?yuo;1s85$L#sdt^cjpo=#MAK0wP!Q{M}E#HED ztmrq~{<5<Y`fWjL!xDVAK6xv&74xyHBf(mJ1!G>-Jt45MjU*U$zM6_Ctb-10aW=zu zRF$uCYQgiRR8qv3;S_*OujA8?kl)C@-KfEhf7j|euuVN5{vEc}YY_8vY~!S()GxC9 zwzlfnA3WDL+2r`Vo9JWyXp_<j=!1%&b!X!d*9tIyeEmmh?kzE?T209F<p?b;+!l}g zQaIh(_6EGu5w-db{H^=?q$S3!FLg)8h1Ga&;NqMBuTuPf&lZjD4A|kKvGEMpk^cL< zW?mtxYOC9@%&m0b+H6d~5$K1SGVhVTY~&|b$P62^As#%E5W`<h9;-O<>1q+?JKT7a zTy-|=N$G}|BKStxLgZi<;;4mN&adzpqaU!jwkaZSM@aCx{&R&syu<zW{werHbn&33 z-(SQ>LtP(rI2mKDooVvh5O<~(WeX$*VcqJp$2)a=hxnp%*B!qiems-?M&U1Q6|Lhg zXAHiRlJYPpg5J$<+peqr3h|i3mt}*)@V_tng!>z44;?bQCLFxr=^!UtiSH4=v+;xO zQ{Y;hIR8cHlA$Gii;Mbbmh_8`si|V<MBB2rO>YtZY)}<ZfS(uz2gjd-{dTGPZrL_V z7RszT?55a{deg^omH*(6krr#@;=zMQmTZ3_2s<_1q{6=RFYT;l-)MOgJWYK#m4|Zz zSvd#nR-}DLK5ok^+d<grShaQbP9a8mv?Y3p3%=`mCzm^w1KqHk`|20ib@X1(wgbom zsEsNXEB_#?!|aS2PQWgRqGg8a&ym;N;ImpBc1S6SEu05?<Nm1?5IjcPAFLUFb{XRm z?$^O~$`9j4>KDhPkVOCE?}0DC`*u^R5;g)%!id4Qzgk$Q6xi0UQ2GTpRc3RvD1|ha z)!KA@HO@y3aBA`^AEPb&ll5L_z#po#Ik`6F&@8`ask_{gkuN7x&TK^78Ez)RKd+WH z6~C5o;Vt|*&9cnlIdH61_h#W|2J^S!iRzyb<gpIcJg*s|EdsxXG-vf;{dHxLk!&3H zQU5aZjz}O0Ia%*32Jj=bsgGfTW8@ld+Y=2L(Bq8T-u1V_fmd7Wxw{JRy@TZzkAd$G zq?z(V?2PG{YU6X&9_*ib?p=|I=b2wE-Z>xo?%4O{g+kB`zOw7isc=yu+JcY8f{_1g z9nJaqpcZ=4fBCFJ0m&K<S=S!}{}=bqJZI2J?s?Y!rFAFxIJwp)j47mvgVTE+@5{q{ zUrp&RWXC%09>(J+elO#@uPY!6`b&RxZ3jcM^u@9ixbW}N`<7TbHUqbnA4Z?4C#CmE z9kn%rZqlku&^uoUdpkG(E4MfBV3hB(C&s13?epbM><*VYnQD3--~Za%`+z3!k(J@f zuK$%L`Z@zswP4Rg?Di=1F{ujlvJO;(-Lgc6`9i&b7yK=|_NHNc&p0iAsz4E$_0NuI zU_afe?h5_6b#9M0$3^Zo)5Pt`R++XL*ahFaI7#55^s7B`dm8EP|L&~~p6jo=s4scE z4R+9d*uHwWf+SXVYQ>Vk4UT}_KFG5>9!cD4%!~b(7u!a@eSqDkRg<l;{v<J|Wmb+p zlh}tIYH^~6lr(0)zPAGJn|}W6T{q~o0jKn)yYORVUV9^;6Ipss6gcB(UGpcdZ&bk- zMwa>cY|%7fQ`$MHl#DoaK+3HR<Mj3h6T4!JE?~VdJEV$v9C&%{%G^43ozCw=i(~LT zn_f>GLL6XXb|fodC9^8Pe>EQ?i+rWz$LjOW;H!~Kf0NUYPg+yFduGlKGA}piwbKEv ztSckD&;hJNPuThGfM@CZ>+*^aFUwq%NJpNLl`1w`GM}=)aJBQ1*%0*icy>fqI_&On zNd#vCa6`{s<^{gj^kvLhKN04l>=x^jsbbKvCRUe&fukDozh69n|6ZzWaZEy<n|N?E zqXzwX4KGKZ)JvpU5{=$E+hE7x@0_UZG|BvuuJVaRU2oBqG<N+z^iuy)zf+N8H0#z8 z(Y&Q;B&A+oLjC@Lx~Q#zb#v>S;?D<P#>~*ZVJo^P+iI|nZUeg<`oa=9W>fCQFOm2D zwr@=F7vg~na>H~tsk`pRuTK_Z(8Hd#kCh$+?=xp5|KIOM9F-j0=ocwyWHVow;aFTC z`+UQ1jK_{e1<EBPaK<S*>k#yYUH!m+$X}o8jopoYLPImAnQAHUkJkKmPxc339W>0i z;YJNjgd9B<R{@@qU|Fxb4f`tF=6)g(dPHDecdQ@$yluwEFa8V0QImbk+`Pw)wAf~{ zGgL!Z^+O5hF4vT?_2IzpOb&6?+7j5oTECaSFmE3(4)U@sWLOd(-@FgaLY>NAq1<oa z^M%R=_jC%dep<J1>_6}iWpUy00S@NB+2>2nhJ#Pqf8HeJ-jO($*k-dj@I}M8@l@?3 z#v!pO%5sKgj+$5Xz6Rb;H4eQ<U=X*bZ*cuyggRrLh2Q^7AdkPo-9&O8)w7Z_HJbx^ zgB4nS^;azF6$BlWJz!rQrh*Gb7eId}@NqbF(;gu{`JvZ=!`JtUr+ux)K4P|nGc&l~ z(6X!#mYjIM-8v1%?`f9}2VQyq;9-a#zL`B=Fdp_hZ;BsCK_1+?Q_LLx+qbJhV7n-_ z{px~6t+zSQw<7-O?!yfvu`QknU)+LoIWj}MJHhj<pY%$wKgr*Ha!UES80<Oc*Q62V z&A!M_Xfycp`ub*{1mKBrt>wceUMlV1@GaJncG$UV+wh`T;0OC-XH{$13zM1D3wsvl z>t%mSP*xgOEh<X}Vc!yb#r?2*n~Op9;jdsf^Lgwv5J$Bp_Ib3-XLP#FKS~DTcjk=F zSaTTicoS#J>`Q5any%XX;}85j`O{b3Li+O3=Sze6z+*b1*dA1kc=`UB|1{@#&QiT< zHO8y(#e(37-!#VpgNgCqxZluSw;78}<R>paF<+B``;B9((+qHZrkO}BBw30+r^$1` zE2o4f+3Ryj;%Cp^ZWG*3al;jnQt*m>;5W9GRyy48;`L{jfg^PrI-{6JsNcBXytnl= zc;xeBOXnxp_aBwDK^<gOo>Nt2T@U)(e$i^Ksi0X^;r!<A7{AqTY*%xEzqJIPTHO(& zoHN8DeC8qU``H<0d+Hl_{QJJp#oz^&XQ{~~<~eRvU47{!scUyS&d9JEbtPrLk162! z+pRd*J3iz6*@OD?JAmiU(ntHasIE6xE-N+w6`vlJTbKI-^`;87y>Z{LAMBde{_SiG z%lX*dR7!yPXs~tz_ryGkrOLM|VJ-Y!C^3KGP!{Y~Q2SE%IL1FJx9(ag@N)Mphj8Eo zm3!Yvg@rukCgE}Ud|WTNLUbF>y+8UOU?uwL);%rrj98BOp|;!JZL+0_NbkHBQ{WNn z`_mIAUVt~B@f?!;N!m`!r!G{)ceXdNPkn|T`7YipH4+ZIclx}(4E%do_jukWeukxW zHT1~0XCx7OGw<IH@Qu?mfsiifgRo0Ct;^xRHqC0DpB7RAmg)9mFKbCc`{Z)far~*` zWssr$5jvuK%v0+h$vlx_`W3jDp`LDsqT_6czY^YeDLR3NgBFJRz)zjZPCrZ=0S|6j zwQeaFRn<KfwWi`H?96uP<LGnXz|K>iDGdC0;mOu=V$R=a8Haj0Qp#c1Gbi|cpi3gZ zP&VqcymCff!d~*dJZfyeATDe19?AJbm%l1m(zFD2&rc~@-NyL(y%K28!+126n{N!1 zLmh_ZdyZr=ChgRtw?%@mQ`;2w$yX7`-x_|podLcN56!$&gz+*z^!E7IDKf3#*mpaF zap>XqUj^O*w}$TdOUZu(Kj=jT&W9c_cMtzp)k@lqDrM>}X+@oC(cx@f*vZB-{|R4h z!|%4Fw^zg8xbst|x;QAsWP{`*SocG}rF!K?@KB2@cSdX%?D*kgoi1E&cYBM2+5$>| zPe(xoI+YN29nh_Wy$D=b-5mFnWZB<dAbv{*d9zcs7JfZsw<XWsP5m7t(Oupf$_Ctc zEuM69GjxYd7u&#Goto8It^Bp$=!ab#J|X4(h!2K$h-YMzRA={W7veV-n#a}efPeVe z`W;+2N!sq_*HUvq-lxN-e@Hr)q$WFfuk0ztclS%}d)NxQ@|QZ$$jhjU7k>%dg1oDG z;j*_v7>`yP<<^_P8KbM=xmW%HcLH*1!=O7-9w?X);05!%%L5M(KT(zs(snW6b;|_H z97WVege$j{E}%AC6`XpEbCQU8)`rT*tI-d__Vua{m=BhRlAsx$-!X6h5bB%xu8Z;2 zW&c4Q<*8eT0r)^>t)-(rc+1&Uw2NK>o*^uPAM!KlCX#DXpYo%>@-fSMQw`_~-c+!% ztpIt#zOMRL(4zvU{w#5<A;UgST}wCu-WlHe;1bSNrLtAnbZjvXj@}&0$Kf9V&MR%| z`6zLb(CaBrVYl3}W@rAw&kApQeVv7UbyGFZ%qH<Ydm{FUFK5Izo%eB!`9-oSI{KwD zf6&C)w4t*5m><@Z5HU)FZxtl;nr7*t&Q!hfz2GA>#t^PKg72d=Zi!-iGCdmwHg(ZN z*6P1R4G*QWHuRO*+`gHHWcEYNiKwqV=y(1%bRC=X%>EqcCgRCI7qL{*ccpDvt3UWj z!|EfyML*_CXyxEE?8ai??AI&Ee;IkjNCkD$rfg1zk#lt?t><c%KPrL_av%56%OMGB zp^?yBJ(gAEsw^=MD$OKb>z3v;_HCVV$PRgj{QqGIpPTTvs;jw))s6TLZ&^*>cCtk> zK%ih7#?NtU^U%Rmk|nA$DccG@T)td8rwjSc)~}E5z3w74OjaNHFc0HU#$VR134Gij zH`pzPd2JQgzxi=B?BkTf(#l@awRO>c&uRG8mqGS5rqF$pb{XFL!AHc6>y}1{lZTow zScdhJY&Tc@aet2bV%2wn&(31Mb6SPWO*_0-^f!{T0DjG?s$I&Lg*qNSi(d!3VV7Cz z!s@`)aN*FD*~j?%AN|`!;9KTHC4XZD9Z+^+^F0Q7QmE+L(*}%(E4};dQ9NJqw~zKd z#79mS*KXi}&UtaVicqRYy`R(Wm<;&&)W$=3qrj_UJe%oie6Pu~<Du?C)WnH9pRc{; zVJNNb<p<9J-zs%?ijfWY&bL*kU8aC{wZh>!^|a~7&v%wxfzFcavaQ7Vv8;|o{^d^a zU)R0I4d?3oedWTkwhocL-!IiEI?RyF(goIb`++ko>1Bz#!+^t1W#uQP5Z4x0cTP^x zS2?~NJU9<}#?`}H(l3uB_I5Jg_~4g?({_8qus%^0P<8FsB<-|CrEkju;E+=pkI-@G z+^U>z`?H}mYsAg*)dl$FF3xA4?{ZL=t33^}Y{C0cZGn0Z;U8LtSEDl8N#rM;cd)(3 z_-tiD5f5<75bKUr0-vi2wi!eRfnRiO4+X*ge0Q_d9*!bT>&p3^G)`(*eCj`>4L!uH zIUump4fo;6QdWmu3k=v2{TPS%)-It8VJhbEbmaSf`1x_wxJOpVH~p7DMLd8Gm2M!e zX?(-)J`ZIYb<y@IWsTeSvO$*|?OC_%CG>0A_Vribp8{vy;%~r?SOXpdR<CHLcz@J^ z;jhTkewj$9$GmA8T6&aZp^otz!<U40I$jq=6Zf@@#(u%otMU=w#1*ItjldrZZ(CLf zeuWM&tof0@4C{!++@DQLXtkd@y{8R^pno)<@E$J1ej$&nO++U47m3aMixdW5ZrA23 z9ioS6y`5Zppx;>8lG05f=;PKK>iqzGRcGpz?(z?QaIQp2m4lL9UHVV89pma<5)-yC zk0yph5}K=XF}_jdV!Oq$-}G(nqKhJo{B7$7{z$~HPs~iEj=>J7dE_ll8u9HOuc18H zFL&50O7IKWJ#_Wrm^<()WMS8c9p*o5;gIo1;B;EQ!JZ`OtD!Ar{4vvX+M)et*Q2ik zp}v1Qa1roe&o}dTKJ^%%qfWQatOY);xpBEto-$s)e}Bg`7y3&6d&B#t6Lx&rLWgWZ z{oK=c2Fqbbb~n1C7yl)75?)Pzd_GJQu3YZi^J7Ss*7A;?8u%Tnw$o&?1b)0s{k44^ z%`$vrrEAv&JYBeAb9NN?>-y0;%@?rKK5qL*(ADOqsps22(}AgfRMZj?-+aljDweOp z``6}K^usR|{yg>Fi17=!t+_k)H!Z4QY_&?V1%1Q^FP&Ok4*eisM`9g_P!?=lxE<r9 zLhcHUpQM|tzdYzbT^H-X3ZoS}UgDe=-tO90uW0JDGMmGM3`N;}R^+Y{qDqe5XvsC6 zkGk#`<=fYk(oC1y!~D&_U1`Hz(W`n9=f3Pp9{o+$I0sg(YlS^Y+s+Gl;Df%a+S|X# z05AJBcl3CG_p8`)wjB6Q+Bdm}n<@d<ZBMDDmBTMhpJ=Un`3Cz+672Y1$wKFd?AfpU zh1|F?T|@3P_&vOoFX@^abjg&I8_q5xxXW^yZ1|w3;yn2!#^|A474yx}Ka{W?wQ{xy zLmZXf&hf2|CX5z1I9#hnz44fY&Cf}4aJR%J-e<5=wZ|Qe8rc~CYpb8$y#u~klAc@z z-P)RJ$oYMc_VsOg#UBP-GTpM1_jm?PjOlan(1pnR{0qFaeFA+p%zp9c2vI>Q-!y9< zBW~I7%)~kXe2{XX(3KtfZ-cklXI=1MXy1Mn9Wg3|$Zx2fTtKlZgAYC1(1~^2w&|iS z?4P)_-lcvS#$`-r+2#j7=rq<!mx)KP$7(~_83jDo_s#|>clZ%=XHQRJ7vh@w;<d*o z>F~EV<l@XQ?j;XeD%gFouX12jHa~czZvNnHW8jAE)9x$OSF)AU^>v~%@R{Knu2IRP zS&D}w@5n&6gevq;OMs`)fcMYTUeelsJUld~1^LYrrW-Y1L1(F_-covvajG^L2^&Y= zRYY+rjh$)b%8}I#`$H4<$J89$V4u4CT}+qb{iJyZBUpIva2cP97%t{^S)_sHE8t)F zB`w3c2<U?HcRF)=k=nVbMiV&1d^j%SHchLY{N7R!*nxT27s^xl|NERumkkA;SGzUc z_>SM7@fgE-<I)kII3?!tr?zXYi8+22SFe8g9QJCy!iLhTfu1!{m)<8pi7q^o)wzEe z!`k{?Wos?+oBBJ<dn0k*y6L@~ciYjI(&AExoCuZRXKz}wWEOre|DtRU{KMLD|3YEl zX$`f$%MSU&v@$&p*!z&?-LCD<zzx=6r@Ufsl1RH3pui6NI6MBxB@4K7U6x(gZ-i#` zUX(7r2s_*MF}G#z+?K5iQoIx1;CJ(<t-s>_qOKz6Pf0KbO!EU$3K8cm<t`4*$GkkS z&)>WY*HwuYtNsK|QtsV}kL$=PlOxfh-%+PqGvQn%n~U#$*8S7q9Z7IVDeWnRZk5>L zy6XoUBRucb(gh}1-}96EwQC=6Ph6@_`YZUHn0I_z+FzXe9?LD7A%gyYCfb45r;sm| zbZ$PLOft_6K3Fcn_|8w?^5_WkUy=k*n;{R=x7Mogs22RFChNOUIQAWTuG;PX8~De) zk(=u`;*ZWHx^6F)Q8h>ACB9h5$*@EoAFSU075NSRRr{1NA4zro%L*~>f46a&933V1 zR+2iUg3z58w`|e40RPrL^{1yS9`7eKc;4|X^rxk3?ac`?=Tp@q!*Z<iFTFH2po@7J z*co}W8urC~OlbV|81Vn)`X-rfk~_^ZcOehnV>VXKFun?LPTUW#;H0^6Hd`Drj(9n1 zaNf=?a!ll8clBfVN9}Jz@6Z~o%TM1Qdk_D$jUa6N@qO<8j~f5|rE{qDyHe)r(Rj1h z7xH{TpP0xv-??=<SDP`7dSUcUzQHZi1YMea=X|Oa?l<)4xvd!ZZDK`omv|cdQ{_sP zA9x^1&GACxC@p=FDc&-G`KLtK*N?oy`{@SPo<twdXS$lFhvX^ZK--n|)O>~-F6B5= z0K0$X`CrSnbey~6_`c&H@P9*N_ULEC5!}k!fuj>-pl_B}e-7+)WS^oj0UcEGdGATC z7~s;`2i;B+G+}O+ayO!sG@oZb{V@>!OT@=aCg8o~9Trc<W+I>CUd}Pshei5OquCC; z=iuUL^*q#p%s0*5cmwvg>Jal{H~gIm3#sygABmfc?aP=?@pX9aDp0_C5JpZ!bUO4% zkDX>6?E6gNn(dL`)%24siIaj<NnuIG<SO7_)zpE^Bk{of>c+M`_fhZUVj#v1e2$y& zJafO1Oj<ar-hX@^!{QbQGTK*5xBmG{#t5|G`nJvKEpv52_j!JqHPY52>z)N{gPof8 z`LG)CK8o?fIsU~M_ttAok%-H5Cw{HO`L)y&o86D4e*!0RCBD6L2Ob5+8Lj~?=pK2$ z-e3keBe%x#0vpA*cJQ<`1-<(D<29W-Kd?S5GV0b?1iO+TR7ddq6G9(1*Ux9VLla-< zy~KPN@Ew0d(K!EF??Bm^lK-E3tgH%ro<FYMypxR*YGS5y@4@eDB_jL_VZT~iUVnHC z+z+5OO1r?12ss7MwUe}G$l}ItfryugP4_n|K7!p%p55v65_q~%r$Pew`Jks_s)?PF z^;@uFbPseWQBz1vH$XR=JF1JoPJ^qjo=8Og)plXEkW4cvKePFhSKcV*X<3SX>vi16 zhcmbz_SGyp@1864W8PlbPd4+Z@~o~WKm7)1;(X@dp$%o|1I{MmzNwld98YbSHbVZq zH}B+Pa|tTYT;f(-;v$OiyS~7v2jfue8e@@Gf%TW0(p>_us}QgBm!e<jR#)E6g1K>^ zUDw6B!7m?IxcxVl23!^kjQiLJKD0ejF~d%cSkK;3C`5i^%V|U7edr&S$tlrS@*ed9 zs}FE>;Ct5wOi7e;Q!XK9nXlg=E;~5SN~aEfbkZPW1yu#yozbb=J%sf*PRk<_1k<{z ztEYVKTm~naXVa?Ju+yLSdzQWjpF6m=9|k@fmz(}F5@d`VzsJdR4Z~lx_8rj0c*Lc9 z{`=hke)%Z+Qx`m)bFbi-3ic^&^p3WThi-Qf+BIGJg(RAeyQR#XpSGc<OuZF&axmAZ z*KjdoD?#3VT{8%~a_kV=8U-C!qk6(KANt|oE<G;bak&1z8LuwdoO?<1CsWLC?XtsH z+P~98(&7^<vgW=wZ_O^LPQ;mP9hxK4q<ZQi;nKbt@ZYI6^V`WJtL}v1QgPUq+Ka+# zDxXl78MUro3;yI>U`%jCqyN~8AO9Ue9^#(6kH*gr$nRF>d-%;q{4#R#zurYmk2Cw* z?UFJK@$jDt_scIhk6>7SWh3$&4l%NxsIMe4tF25NN9n`*(f7vAp`N=V>+(-=;7aXw zN$>nQoYaom`~r4}!&te|pIU!Y_Q(8%c>abpwillPzZogNh6P^{uM|ajCgV9nPKOI~ ze$od2cB@qnKp*M+)wfg%rkRyH<tNplWBOKA9EpMb@_Bw9ujXZhCCk+23m|Vn%!a;P zi1}T>es}E9XT;HF6Onvuz@e{wJ5COg;Sc+-J8NPd>|!+Q_QD@?4t?Lat`zefuB5jS zxWgv0>b&tPCi2<M5B$3^Z^ACYULQVTJyp~uX%Pb)Y!^Ds^&5DnbN6Y`Fg+35bhe^w z8aiD~^|%7wziO;Q;4*k7+M%vf5P28h5A!yD`9+79zpt2`!uxVuIIKE_`D)iVt}BW8 zW0ZYYegfX?<<GyRAVOIu+*`QEW0)j%4+S~6*Wo)&nZ7uDk2znIR`V~!=|fB3P7KkE z@|a25WBfh3H{`G{c#`5T$x(U;UR8bgn-_R+c7^$EFA>VlUGsg+YT&TElj^<TN}LNC zX3@74^GCdMx-|@ZO7gu(caPIsT9O^zYrw0P-}0W=;ki98)9!G=KZM8j4XKX7FaK-} zzAnX>haQ^Bo!dWu@HOgu(5Lr6%s2jGjC1Fy3$LbDQ$&97?el{;-@bT_@p*kbcjA=4 z`F-#ub<=7?SP=3Z+F_gPq5s75vTeTh(8f(AHy(X~|JueF=$YQb_x10&q+pBdeB4b2 z@tpMi1&hO^8MRQi;}7ThEqfk|6n$QYeNz?IeP>6(3u(&#mE(Mv{OQw%4&01wMTL6( zi+-#pvIR9-e4$w!QOEzRz&KkzNI0#kjJQ$Y`)q<RlcOFw95J_lRf;j};r)z#R?Wh! zDa^wM4(eDubVIw;Ie|W2N+&ACQgmnpaZwTXihO6}E65Y3#t)!lC6?UXf$uX+id~C! z`OebMMehg4uuok7RxA2i5$e%VEIIgFotM|SJor=h+Nf!XVbZ!~=`Ecbm|xpxX7@Ui zf#V|+ZxrLfA93qGDFLrqzvt(zDIuk}Ziu_y1aA^u!AkEefb)B+PDeJ9#MA@xUmCnP z-{5fHec-tClrPt(QsB*fc2&=4;E$=5tnC2ez1`6&!{AAVBWfTyl$+9MZDn=N!*xds z`~RR{AEVO2xUZ@JkKg=R`5AT_uFACrb@x`?o)=ds;(Jw=8oanuj{S|LzIO*uznAHJ ztUqrdBfU3y)0=5YhD|K@cccmME04!2t}PPrn?kBvYA*71>ydGk#ePP`V*#=P6vr}= zoi)T<eB>Co;o&>*Zt#Cn!LjhmV3#A$U<cAC4x9`8MR%$9-fDD!pR*=;ZBHfQx(#dr zb9Lmdtxwn7$2@<R{+yK{Kwa>b=WD%%>#8)%yxrokPs!^N|8wN8SQWg5<(Qu_Q2}$; ze`J1nb8l598^u)5FFtefGtD}`NqnXmdbp;3&0lT!>r`5F<!K&DymI&P*UP|D#3O|d zJo^y;>=1Vz0N%SU@K#vBiTzer5+jwmY2~LUm#KaOK6fiwD&KiTW8LNN_q({Rn9)&u zg>f~yar2sHAN?#={M^gA^WP^e6`n`d(@ctUy_5j_$>xICsVv}R%{8e&aUSZJOaps) z3-Coc`ug#+&hQUb`p#F#uN*eqPNb<p=P2$?RN<g(gt7;P*3I#I<0a4JT-52uUl~<v zMt<V3E!#<HoIh<7XC?EG)|)93>t(~Z7ys+{H2Dp>*yZZl&Qj#P3p(4s4MImHd_8d- z{g20YO1&^_ME{fj>?(f2FL&JVy&Z^rM3P%_PdVbZGp7?SO7JkV@$3}S3jJBfpI*rp z1szng@rP6h;)U;Q3Etp|mcdqUpCyz9XWbgo1G>le*~p6Jp)^xh+x*lFcB&y(W*>_2 z%6DJakvd8$e80pc=`eyi4Aw|t{40`a+q*lJgMmJo>F$1jb>g9bu@?fZv`vMs*})QN z)K!>ro(rgfuFr42Y~K#udq>D^5qR%)%OjSB5W}IhgKLwlDE7q|E>e!gzV@_x4-7o} zaouH=)>N#MoY9Kd#?Q}O4-)7P$bz08n~Ge0pcr}mw&Hswz$?>#9rY^Ed(xhN*Xt}` z0;HZl>{G&g5PtoOo@pWu$QV;F#yCBp{nbZczaEPhW@25%B4cvT@P7DTw_xX0vJ~&9 zrsh0~d65!!SKl-X{K)qf83S(Ym17zHft{jhqy+^XaWkZ5Dib^sQLr@XEZ%2G>g>^? zDRN8E7ru*op-Ya;4ja3c(yYx_<x-E=A&$3@_89{|hI9E<9{EU9QT3XJCeTZ>M@fb0 z*17eB@zaYlfG<6>`E&J5IW8ZQXLy;eR<BEi+j%Hrohj#Xk*}El?BM|Am)KvD@3MBT zFHD^3xx;2Ml<BU>Pwu;iQ2)L<ag4$~)NrrvtbE+pnm42MGyKvc*J03$laW>DvsBRo zk5wnl>O_Gz?b&|y--4eDIP}R60iQj_l{LBANz=g~<Ew?>72h9n8*6+?*45(G>!M&^ z#*5buq+>ofJl=bY3sBwtMqK`1f%m>_<satuIlDhd_2L1~3{7dQo}G_4)JWc8*-!Fs zvgf*UbNeba=+AvcpP-*_iWrL)(!|5f!Hg1g|9-peYnTO$N7CR26?MFC`>SZ_QQR+e zZ%Kg(?9XNgwsp*>2v*T`tB5?>^zgpo^6lf$c`I2?$B`!qJl%C>WhC%dx3Od;c%?PS z@^^F{Em<Q_-#51|F_iafu?cio#*%AmN1;PU?)^8k74=u)Iz37I`e_3}m$AFI@Et0V z`<7(@M>9S2-^*cqCi3@f*2ep=zCV80P)GI^SPx6z{|Vek(}}1|Aqg&9+dcK|z_;p6 z+b$rVc<kiSEPf$$Y5M0Gvu6_fzE+*xAq>BjJsY^pzZvJ??q(CdfI4}r+;L~a3Hsm{ zlX<gE&?(^wKN{Bs(X5Hi$VTkvBi@)@CT*eHb0+R+^o@|w%}$-k)L-O<OwX>`nMo2R z?KigZLuYSR9eyA^XXo>5o*(EW9WOVuZ8HNdML#`R+f{`5iWv~#_zt~sTUgGr3H9Vp zJ9n3{Q`v<*agtY&huiyi%TYP-1tYl4JJu5YjRPHCX5;tfosx1kA7~rBq7Q~_W2ler z<o206=hpt}0<Ezm;Ig26|4Q(xqinCCI2YsEv#+9VJLb{1INoPEkYqV5xq0#`{8Dc+ zL1eCvZk6{xPV2v<UuIH4w4w~fI`;9$`-QN7X1CE}(I0d9Zjm2Lx`5|w+dQSDsqm_p zbKGsnw_E71`8tLAp%)Fq%hq;a-TvL!%O3EDu-jYto=N)qr%cl)Y*Qr5xij$4u4>e= zxn%p6e}JAn<nv@2`kt_Mx%4oMJovWkfzb`TpL?&bfMOPO!p<R`rv>1NPY18<Mx4Vc zAaA<Wk;e7cRe9&b&cyw?dp-dV!nwA7G@cuuqz?N>z*DCdH;(otj5L>mA=^>J_sZwF z6|J(-XCQ{^>c;nSyvvTX8AToWq-V_O88Xbyo^av$3BA=@x4tO@Jh`g>UNr3HY{pLS z6~Lj*(GE}0@5z6)$B8{|7<aV|@dAxuB<rqui>m<aPbE0>m;~%2B-Ki!8T}sY+@!Uu z@tw<b6c4*FBumb~-&_oQH}OQW)fM*UF?xCZ#f3}~mvi?wA^5p5Klwf+g(iA0p8iqU z4V{=G@SHyn{B&TM?&II2N6qqxXi?<lsSj*AIWG9l;uW7b!3)H|wkruSnD0e0Z?pKB z*keK`cj^MyN<O+*gr$<i%sJ!Rl`Y60O-tQHJscqwt-WG`pZR-0K&599)>k&DKAB96 zq*-Ol)jZXK`{oy;J}mn)m(L+RPpzP&ot59N3mv6d8<UOmpTd6>VxC)Gtss5FjN{M5 zNmA5#MtKRz$=vKe+85V|I3Vh733p^NNd#~gB)7+cf0whR>;f)MRHrU`$dC2zncdB* z|Iqh#ea7w#2JzEZW8Jtc@OVQWmp;Z%*68{rT7=rA5lJ4Mi$|Kq>c5P_e?|*s6sA5S z?=4}u?i2?_eBx2x6fQx<P0l-Zs1|xNSK2=IC*D8AT*3cs6zru!^U@C*d?@&4U@6XP zTN83<btWH0@QIqLmf?Q(hl8Yq<B?zPsO$B?zq78N9u#{`=O6Rb_WC)8L)k}oM#Hc# z@3*O3GxUb>>ot}m|4@%3{xwBqKBKGhG-9a<7uH+l4)#c<BVLrtTy+?JyS!#_&oSsz zW+J%g*ew0m`sSiv6C4b)u4*IO!yo7)vr%eb4EK|LY7(jozKw1$wf-kT*~?^gda8hD z1#%X=bA`PM?5%t~cb=JiyntiQ5OC|qG>_USy}SLRaQ|K0zshIRQWrco^MrEao;cv- z?oAe{1pFvnSa{xN`WR6&PyYkHiz~7sr|BI@6{YJuEJYpuv8$I)yWqWj_g9+YTuR?1 zrs}VYfwN;f9bZ@_Vn6b!o1>w~JFZ!$`Faoh(p_#z_%%Mp^h)IYh;3Zxb5Zg@E4H3w z{kik~*ia+hYxFXEP|jT4Pwx6dtz@ls=$1d%fWu7hRifnx&TDp8sj0_23$QwZS-^4P z)BG*7Uua+TmXks?y}*$>VfwGLfh*nd368HYUzb+SzcLJ6ne6vs?<?$ASfqD3wE_8? zCGD5e;t}V$ENYxPr$##99amfruA4f4bmec-dR10@`YG_8#<kVn8`4lWGS9ov_AT-U zMfZ=|0C$=AmC?rah$ppYr1hTTcQVv#73l1y4!_lNeO~nAcqQbKZ|XkH?qbc!s5Nej zDSwFh2pHMdItCqN+anis9K67|h`h~*|D(azN7)SWm{PA?%qKjTxEL_|72~Jzuj-2q zc)E#mfKLs1B(?Apj~%Dzs+|r?7iGhqE%evL(M=eS=Yz@3u+u>A)0+&DXV}2UcdtpD zQB$yui3o(9*}msnQX2st$ceQ*i}_#{?ycHii+wyrt9{U)#8K+^+q?#0tg~GcY~2H# zD)jHZarXu4cP4kN_{5GpGSb<TY|OV@(|dPsj**1)c+>$0XPOv@pS)-Y91M?_?VatU ziNAk0sOFB+eR6_ZpU>j^edA)e@0DWT!t0^&Lin3`R!ze2cdYkD-t~GVO_}P7oLuo? z8hP>CXYyxLp--9L+WnPSPsut_3%yB%A8OH1?Iu~7fuoPQpt~+N9?$jvfcUEGMl6{{ zvfRqvycvYPiX7TP8qSg>i$xk9sp2}#xFx=qKY*`;^0Yd<alNdQ!d!is(Y2E=*UYCT z7(OwcUVN9Dv#X14C-UN33*I=wKX!AfT!@lIUxdB~yKW$x9;4mJ9Vv?aYJbR#qp(jj zRJ;7)KJHtsG?ED1kmMaZw`U<0$mTdxGsTB}G8|iV-@|^*SDcq_2*tSUT{j>EJ~4Os ztZ}iAWSy3FJy?$azuDfMx)pkoW%P90+&ZRN+JfxYc%Po9YMT)E^sEZe`genuVorA3 z7Dc0P==zh+Eqe99`+|(tOKr$|$Ul(Y#mj_j+<%2vU<C8q>(RTq9Q(y{+Rv{;e2`wO z*HQ=E39<gO<kJLsW@}k=b0YlwV#c@82#ilL@xE)Q2=znnuNi5<p8sCGwX2tnnO)4k zJX4hoebu`9_lV@dJ|on43xi;<MgKOJ;Q8H4A~$ONqlfYhMUTf!fZueK=Ci{-^VzKF z&RW<Z=UUUUzxb~At@qTw(rP=Lj~|{pkIs-SbXqhYx~+MYQtMOHC0*qHb{2Lt^q_Q% zcYw@Ev*M6-1|RrIRC))Nlgu_b4mkpPNb8kx`yJ>e#?0epFY1SOex09a*Mi@*o_@A1 zoh1J09QNG{e{PM~nz(EMbd%%E_4)Id@k+x0&A}yDC)w|CM)w`f(rJ!!76%S$EIwDT z7k1U~gm3>vPO8e1F*^023;dk=pZ=MA@NUZ|#r?Q%v==|K0{hgh49H6_IT*>-RFOLD zCnXfT{gkqxOO5hgb#2CT3u>jNeSwqO52M7lV%+Q}y(Imd5#LMeR{KZdKHo)!kA)#l zseIqd4*#!7s^!7H<OdJ=@=8BrzQ?r7O$@5Q15?aM<xi3&&^jVDg1DsR<UWR%lR5J^ zO-ebUA3QE5Az}=knXN38GR*+Kt=4`a20S%4CN}YlGRDhhcRMVRr&#N!qXKW@y?F10 zj%U0_Ux0_g>V?pgYTFb2DOtu&<y6Y+7%t?)K8Hk#<&uPHtjW5oz!~l)+0aHj$F$|8 zPw^-@acJM>Z&ASY4(pQr8PE~-s&(}Ya8OfgIJpJ9Z)%+&+O(L-Y0wh;P>;BedsZ+R zn{WuHTfbD3dyzM3NGX?xu2w8dm`!LSMR#r^m|G*rPnO#sF91$nZQ3}7x<#TqEuS|C z{$?9np%dLfO4m1E*D`8C|MFeygkQkkxF)|ZU@EarsmZ(U0sKuZ(CPN)pEUQrM~g|z z0ql1Rc)5a`rU~7SckL@aA|F70yf%XO3%8MZXZw*Z-sNAdV?B&@fEbCE3E*R#W6fV_ z*u8v5MY#g>)aYe>Wy?Rb@0rRrgDLQY+R-mu#gDKrsy@lFCI`I!t4yu|@6Fgw1~oU( zjAP}2@y9I~j}}UO72+7?xzrI}TxZ@Lyl2@L#BmYFn+1Q8RnyhW&y#q6?kJ;g1%B`c z(RxijGm>>Knp<bCAOANWe(QJa)W<Vld*2*HA1SS_T$a>3;Kd@2P4mrB7bg71M+@<c z^pEFhRb8aj2emW2m!^^THx|EiF$?D%Kl>VwbIe#L!o6DmLMKVTEN~L|MXFs0;(1j* zN)xOtp0X-gG-JJE*?|J!+iD}R>wDnmn%ge;8xu_QrR9+q@_-MF<hW1X6Vy8dWj|l@ z8n{(Du;(r(^do2X{f%6Vu2-p*K{Fr4(*M!nwXlh1MZ8tfQTq;D-dg_r6vl;Ek^SdQ z5xHMPyZ_2O;Gg~NL%ho{U%nQ)?{pH7XYdT(6@u?zy?J)8ei7xQJv&fc4t;8_uER6! z4LmLDe>{B<`=o?Yikw$NkB$Wv6x7jb1=TG@FW_&i6AvC~VO}*lr&ky^K>sPf;N%5v zuvAsmmk*NWi&mR7OZVaLhd2&q`I7`C$j6$;!aB_FcKdOx3ti`1Q6#gF={8pi7)z=} z9?Y-qSx+|R*-h`m(Fb_{jKkOYp%av2droa>C0{Rl<@)jwbmNjY7n8lqXhJP9@L^UZ za4$L8RT%LM)9m?{qnp;OWL8%CgHL+ct5e@Xj}VD`ohEnSmktfjD~9kMacghwK-b>O z?0na6Pe3nMPY;`7Tn;*KD!5bze!J?XfOC$Cx=$%BG!JE*a!;E^KL=u9o%Q!4@C(I8 zi%}JP_le6tEjQ1QEU7(p(^lxG@JB6aa|A&#!|^G@^WM_tA&bX<&EUSy(-{)Ez>`$& zM;c?iOvlRw!pr9J@>;qp8n0kp(@k#dlFFi`wGUt3@(A|A=J7+_>I+%bz@43|3V%y( zvRk-2jAs2h^>8{N9C?Wv{oc8AemTU_h2Q=ro$gPZFbn2JowLH5pvgd*;CUX>*ij7o zCP)6tjN?!CW6pRUtFJ`9X9xVg<Hn0e8=*_{Ma~V4&+(tNe#wV%^x@OEe((f0^>}_> zS)BJQ{K~{V<q8YuC8z|5#K52Y^t)XoV3$tU-M-t*W9*_eTyveF^Hh8v_DdF{e~G4z z(;vK->&nuwQSceDZDvvVLP{m=7I%FH^vm;ALZ`lgZ+=L0=wAJb^?<CS{Wp;R%30&z zEj&qg7azDHl01d;W48;|h2VZeqGo09pJAO<i?wa%Pw1C6E&IxG(sD7Oxbgre_|l*6 zJ}VjabmrxfLmx<KsYAh1)p888Q0ac{E_OysD3Lt9Z-i#zeFDWJ@Z7VD_6!X}@2FQ^ zDfS1?)Um1-y{aL@wNHm}^a77B^Ic1`DJNO_TgU08_zt7J0emxmFh9@K4JL#r_w#4v zTZ5tBq|avRs#hQmINWO#(2VneG~Rg5_0{cu>$9_Gn*1R4+uX+=ebJ_lcw9?{Uj!7X z&)-;t^$0e$@Fa}C+erDxlOhyL<7q_mZ{S{4j(FPlJd*gMSLUr-4SNk(fYv|Aqsc8O zx+2DmJ<Z+!)e-&{sCBVEsQ`RmU?Jom0Xr^>%{qel6$#S`e!Prg8(nd}sS-NWeBtpI ze2&=9@v<^ct`7AS;|hI!oivfN-LLCs4=okxvf!L5@&xO|W$h=SBV{(IpI8AsMog(U zp2BmCthd*vPLL{HCzhBc!{4NrEy?tQAH7y_xcVIW<cYxgyUSZqmzhC$%65{>p&tu_ z14htad*!2GNnGd4y`A6PgCq>z9^Ll~afzAemSaKaw_dE%`uW=*=%X!JLSCuBQ@J2b z+8+FnI<r3pzYj6!I^^;{j;=eNtM83pdkdu~^a)8)31u|y)ugGS6!oPcWh5yxJ_@O1 zluD_nBr7R1>t0)>va;i&tfUaK^?UpM^?Bjr-gBPue%|Lf&v_0nvtfa1VG#HP_;XPF z)%P^}k-zA&%di&>?*hp+SYMXucl%!#W*(dlds@8_`Ge#}gEt>4z;B`#bq>K!buEC9 zkh9}|MMJxAZ@9k{Uv@9_)KYvjB%_*SJ3MS9Re-xu`%4)E_zkngjj1f59pl=&CWSD* z#AR;0Z>y0<sI}Cq1uuT+Jy)xA2yv>k%jdudO-3kuxIB!!8S7&Zzqc<*L~glfS_?T_ z&gU7EtViB@mDTzH3C1o{-_SqzH_q9$hWnX;M^wwGNgM}$SZ<zIe;&N#!5U`w0coa6 zPSsPU9=PksJCU5=L$lZZ6L9BX{lbpCb)>Qk_}SC6<mnLU>V3Om@uN}fFHG!N;E(6^ z-g282iudt0$9fC`$0<_5@v9IM|I=>S!wJ-l9CTVWu)LWjmNY((+*?WG+~sSYkV&lT z9Rj~P&t{B|SZ0S-Vtm>mpN|T^$Gq)NWCW)}j+O^PL*Z}6+S=2CqLk+jXT#vXzrf=( zwe3#dMLr{Y>h|JTyq8?C`aSr{!iFd21~^}FEzR{{{WMLuEGDBC<l=mQbb`Il3!HoU z*d-yR0zGkG1D_+G&I?+)Q5-mTZqEH%A2APO={56~LmwNi-rS}Jp5`b@>##d%w!+9s zMWt`RcW$GMO2lc-x(%X!kaxU_cIy)4GnC`@@ZaNMD*PU<UF`>dHj8?@cs2C@bjd-{ zkaUv0MLur66XZ<4pIq>Cly-3IE(_l`MN_L+3EA}((NtaLu8&JoAV=<F7ufw+fBl!e z^=1$Gr?RN#{r11$TZ;pAKZfF7S7R9?;WFUN!Io?PA&zd<JvGoqFlygl?5Q4~AlZT) z0vaN?4{h<;;@CjgA@`lM-c5){JIn5>c1Tf{m4aR->tUyj=?`{V19vU=5)Ze%#(3kr z@5uLH{c}k3XE5&BYww*W91eaKC2k-2!x8xFb^rY0MEI`<Gq@9WKkgbkhI?H(JTKR+ z5z0UvgOvBX{clO4c)5ev%>I&tnpBx3{I{;vNc{O+O26}_Uek3x<S}=c%*_D4bmt$+ zv;zMmPM=fvgP+=nNKE4#K~##ies?4IIkWNRWv8dG=Y@w-HdKLk_l4b@3%loh$W?kd zNQbM3PF*+p2fp`bOGI=m^r2ze8ArojLVlzi1D{e=3Om1EkkJ;|u6pk&?5x^^6J^>A zKZ~uan+C5Vo)|nhjq&h@bZ$5|m+?I=m;T}y{AiL*&kh9c`DliTzJa~6H`VXR&%?ca z_EHtKa~O+)e14Ja?~uc_@Pk3GQTM`$3AzuS8rCes+X!6K*r_<aeSq{$>*{a_!a7Bu zL8@90<L^%W!Ig#e56kJVS_R~P?t_DjrUa#F%;n<j1N&oIT@K{Ko|cZ*`lmuKv4?oW zqk+43cdgaqm0%<moy*Ak1N%<;xImz$2K$F8<0&)s{Tx~2WfOJa$K-H*;S{}@fB5%y z!ztuv_Dw1Hl_TEXcQZN?LK1Yqmi3F2u&!N}6ZKe<lG|<=mN>Kj!5$Ay^=8w=`xCbQ zeX##3dbO1d>{l+$@rR%QRWSW`{ljZ`FR?R4N@4}#o>TePCcOX9!GAH;i;(AW7Ub8O zPig-x?~!|exazWEWXcKg=;Rx<-oxnk*v551A`@{sT~hLFpD5M7&^@*?zK<jhD+p|M zhrRRiM~!yjevbzt6_MMpp4s>LzCHgi=EeVRmm=~8t&igl?al<=FLE!Kskaq$W&}>c z4*Ju6BrKmM=j@BHU$q#16&1EKsTuglrkn^b=&L;F$Fw{6>9Hex%cS`zcF}{}Zyr1h zK`aTKoNJ2vv(1thCC}g*eLz1E<MA9aQ1pUc#vJdIJ%GK`#MP+mOT~WH_=n<qpRkX0 z+Sx@HI36`LHA{Y!EdIi}lD{19Wyfw2Iv9a-%&$t4<Dd`gM;0p&L9VQxMZ<=zH0SOa z&F5nE7}wn`tfM}tdrDs9=v4vS)VXKiiTdOOugl6lvzR=+R~z$Y>P?1TEOKy9LR`9X zLVM>c_+7f^)ZZ+ugM)eul?55+pu_6M=<h<9{JCn@9s~brs1@b`?-*TM7qk}RdrA;n zSD-$TzAYVH1zf7wF?{JRcqu31hG;V6lf1w3*mu<5v#0myrS+4^>7zI0zK#F~e5k4a zz#|p6>zZf4f5V?Dq<{H?eSh7Bu^zk>C3y1TfYyw^-u<{`>00o$TZQgL&uAjC$xc)a z{856t=O_9%xYNxYk>4Tbot^Stei<~uF_wHO(*iyFC0&jfpo#jv@Dn}LbYcs8UiJ<2 z5z#VGzB$87>$Jqh6TnX#`(>;jBMvsJ*re%7Q=Vs-EiJvkxzQuaXAVOjsv|1~?BcOc z;&D2RAG~2ja;nZr31-E)i;;o0=)>{To@0o6YN)eK@?uZm$J1O{fi&z=_pE$g&^OX^ z6a8Gk7<q!I>J<T}KA=BbUSs+D8U3_|v^CVBZ+-9AcI;DVNQ?~p_UH%h{@A$X6rN*a zRA<%!+)%aE_;$37CX)HZ9drn)LgRF^W+6ZJ0~F`#sYYY}+RDUP4C7=woVgtpPqQy< zYZl8Tm}FPphaZ)JOEv*<Zm+{>YWtgQzl_13h<f2Nzc0Xz?A=mnJXBHEeyi|ZW3ab@ zf1~puKa<s4g%hEFYIS6r9?m()#fC065N4jro=9IUgnX0dxW4nu{w~YGTd5FzM?`Rs zTs!PYD1wVefS~4@Wu<TSfn6wG{>;}|h;#H~!>6MwXrk-D0_)RQ|7w5OT$kBFmUx|M zu@=F3wA+=kdP=p}H?r~m_pciGbL8h<LCBdP(uRi2$%}gfDoaV^CoC?+b??fD9e2gw zc#F9IyEkXtP96Knm%{hX>?P}Q%L{N|7skJinTO$dZ-p(&S`f#}1lpz0?~)MZ@%R@$ zKqrdbT~-p(4IB-$^wLeHi7N-b6^s;;Y`L>Pn>H?F*d;Ox%+JYEu~XT07pHj{!u$U2 z7J(+*hjyT7`Gq{lFInkq><QeTWp=k$591Q7|0DRvk|e_RY2?L0{yrz!|Gy`Z<G#`> z?;XCsXiv`aZ)BdPhM(9x;Df;JK#fS?P)lO$e-v=Hy>DHI8|;sIKAd?io}9SOOEsL} zL%)&nhgalskXM|rQuNG*zS^!YQ0+vXz<=M9A~~u;;><S7<ezx{rdZcch(k5EG#gIC z4!k%YZ>>~B|D9!>;%<@*t3%qU+CqgQ9-pw=ECWBw5!`=u4EiU2b_tARVgKq>bKngr z#&G|mdSyr894qzc&Ux2y-(ll0&tmXhR^<23O28dw-T;&GISl7`|6>oO@36~TW81gX z;_n;h7#Vy<Kb#GWs}uB=xX47uLW)U_N!#yO1iLEwqa*(|hh$g2(atkR980Xxb=?I! z$oYLL2>lSL<pb5e8Q?!MHnllE;Cs3~o&_Z4AzW>p^bqz({d<iyBw2gaD{pwFKWxoN zwe*!D)XnW(w`c1I#MkhxUs|w^>Q-JienpUS6z%xprVU&d;32J^^+0awJPk#N*UpT- z95?I(s}Ltog6e(~kvs1k<bFkX_Vu?_`1`eis7%-uyYZ>(GR)5`$-Vv509ke=lFK<} z0(o13Epff@ALiW?p#XQphpInfmdIb7n`?1VSDp&oefGs(^l2dS`d7)tA^+<Xa7XG< zD@pA=m+3HfG5U~6>B;;OWs=IZuG`-mgumH#b2q{ND^{#F{_GF@+tHZR1i!I#>)8F9 zmwK@KDlKDy^@sIxC)x<OLDX=vL=Hkeb?Glc@x7u<UqR^C?tEPx^LT(Hw&f;GT?ekH z*82v#ATF$tc;H$F`Kbm7m^n_9u|uZaX6?vR^|wy1p1EJeQ>3`%-g}bZ{nLz=>{y5S zsWomwJ)9(;@#mRyt`+0q<UHK-<KlMP=g2q6#m~;7br|DN-TkBub#f=Q7uIfrd|l;E zKm7^6bk$5Vv4bB4HH8{=pf9DwQueb*Nh+pQ)$PD$@bg+lM_Uo->#wam_m)hY_gU+C zJRZDDLb?9BEb5CxWIcykF@9E<-r@15h`SB$&Vj(U`+S;q9)FQnmG?P{ebjwPJv;l= zVW+xg{LYK+Vck^YarF!QM7#5{!3OA~zTZq-Z<y?*xj%=W#C!wya}qY@puhN7rvFTx zd5E3eu=x<)L)|ic_MSA}PHfLv0z25SeN<nd5b>($!eyTOSf}h5kk~d2`@XqY-)}a< z1o8cj!aX^J^WtCgKY=GE1tj{;<d4~>7ay2{y@n@jI6EQ2Xc%}82Mdp5ytQf*QYpZN zOxxSa_~g93HguVrB8WS&^{A^$UAuPY%Mtt>c)D5A7V){^%5eDRHso(PDZ-+_`w7Nm z<wDfG=8;`yad^*qUA1|gm`AGMEL-clBw=#JFW6^BA8!ObY)fhWcW)in$YMWgbojKz zy>yaj`+Q9k`%i@aJkzj#;B)fJ{Kc1~sHj6?T8|sBPM&M+t-jzZO}J&W6aT^9Id%8M z*5P}^N1Ye5Gw6^z5l3z-A`Y^%`HUK#Vc(_t!MQ}(p%kB)Mj!H5SvqeTopG*L#Zx|H z<;;2^x$(i0G<-Jo>nevKuXN*(Ob_H={YpnJQ;6wjCG4-T?FCOXSfikpj`$xF>TOnv z@$+6v_Zdf=KD&DGI__^#PdE5A4SsGGeWE)8amGyE+c6S+H!9|U&;!`vsKLOLu?S@u z@4Tec3V!7OM7L7E1obH?VqYtB(MR)2QP^IrKa9gvMJv1M=C=4tjTJL?z-rht2llr@ z)#`fe8`LX=&px;fIJ7`9ecVTmGB#0NEb<Qc6m`1wUVJ0+3qfr?6~WlIm^6}HH4FQf z@mstnM`*fJhjrR}lw>z`R{LH20)7=ee53~NFK8|nJ_TN#voOJ=U5v48nkzVe72eC+ zU4A1C`X&0#EUeCizm(ZsDun&^eB7`yX+A?=|By7=4}6slUKYhwPEs1)xhl5Mhl-6; z%&X<#O<(^LRsKv{dzErkrNN)al6AI<Hh_=*lsa=1>mwWU#64=jodD%oul;Iio4(_c z&Fy`VS8YLv;3e>!w8(L7#2aG1j7e1o&I8;#aNI|O;kDW8?vjZ067j0TM6w(8+1%&0 zw1XE>c_SZsfiE_Z;UZHVw02ng>0=buEsl9!WugyIkDJb8A(938#E$(Zi_hrgKeSf& zlU-NE42>tiXDv>e_X|g%j&=P&lKw5M8>*i-$^F3lKP?P6G)S_dyW@J};ScP!w>RZk zA^&?MnV1jx82)>8P!988RA=vQVll3FD|Oa$!=5eIc5~141&z(Ra;6FX`N86NEAFc& zJi8ZP@!?_0bFv<CEd#IZzPHtIUO4)2G}K<}sK7kJzYbn4#^-abrO*3FW}?>U^u9vK z<&)im%W2SudY{4?_({>Zi~QFGaNp;a&X0rgl<t4uRDW9ncLVjeXjB%U-muQsb_>Q= zQKqoeia<S$==}@gQ?%zf59h8*$mwugrC})K`+I5m!4SkH<D0hMO5oR=w{9oj&tl}Z zS)021LVh*ujkmX^qK<WZgJga!>`eE`N@3VNvnwF%7(-U>I2rEZgSc;V)8Td$o~LMj z-roW1kCt7}mi#w@yt`Ju(B9vqB5{`DNgYN1gAfhr*UxBn#GO4ZYfCYo9yW0gc?z~~ z*MJ{QSBx#Vp33y2E~YP_<2v43@AJ=C7Pywx^T(70dlM~suvC?Y*}1!?&1i56{%?7L zEOtTNUNFaeW?yuA59j#<e#EmE8cv}&=XG#L)w>vcPr-B~Bm(*%4o!7LLXRr0hxb2% z{Cj(M={k*&Wet1oS>OMLJo4Y9cqxpZ+2pGma07LP9}X7zFG4(GO=kqpq1bx{FI^)4 z;5pg`5u1#FkCvga)6mN&6Vr(Gz-Qf~N-qB6WbLaZLE8!V=_2{%tXt6EDvyWGdawg^ zq4w_W6W}kImCq8mDNAR8@1whc4<D4=q<r$B=aYupcibV_uXOyfDZIB|j;{*+J~uDA z7jQ8`96Z#tyf6UoOWZ>`WWI$RFVS9QsK^k}^Zt4F&Sq>%!>!iL+`Bw!f9o^N0gk>3 z6hjXkVsk}%^UVHJg?^OzDj|mRc_hW=25?fn;P9iSc9LCuN^QZecDz5ceXU^)O@wEb zH2&<MEo&CZ-)jILl-MTl*)SBJ8h!Tb{V{*~hni#v>X}-cvV~9&Qr~7B7Y5$M?d5K? zBY|XpzBhW}0dO*K-J%_;J-9cd(6KjEkV-6hlJ_APaZ7cVQ;1+Z>{BJ@tFSY0^{m=| zEXYC5RZ;|fSw%{>U)xd$yOPTlmX-j2iCqyIvkZKw@Y`5eAq)BNS&1vAg&C9gGT!ZL zVBcHEUz9D!_qqoIxI@4@DY^6OVu1@`VQ=?t<7JE&dFXG8m_**Ps68X20{C;;Fy{OW zKS|mb<aYsn95`ZS)k`<m9G)Igg<W_I@V2$Xo<fGdX}-CS{Bypf^iCy)AOc6GyM-7Y z<*@H1HCP`-@&`QA#<<PeZ||C@#(H?3q~}@qmto4TRP>KpmBD&CF;nL!9Ki{!!1%Z~ zd9M?x#ky#!PU1-=#<}ce)aJir_`rU<;P#*J7b7Qf=?konu4j>FU@x5aQ`v`s3v!EQ zS+a4j$GIg9#eMy#hX`rqTtJ-ZluEQUhhMfksGK8_*XK-+dQ!rav6@lY5h2ulUFXpY z*$@4VDoqbd!_PHLPs@LWA7#Efula3~jN*8G&9nhtvFDt-U}BGPt#d8@o{aon&Y5L` z$n&tT9dtKtBiU-N7br~+L0>UToLi7DiL%&UI5!UbNtZEJ2d-KA%V>~o^xe1X*dbPk z(}(iYTM{6b73<#}m}n*0)w{x~mf*alkBj`ok2acJdU~$TE!bVVb*Ji;*EB9{x9?j5 z+>7F?ULh|7{#@*BC5!s(`c@7xQ}>@-m7J9WzqOqGc2n#_;DzVhqdH^Y?>h>5x6Y#^ zj6{e293RB*R}9o2_za%t?B0;`6MjOxY2G&udp+(|<pA6<t1#!D54|&wz2wW1z~8-O zd>_BXK9)>&-6Zt((B*6Mgb-z&Zb<+8KA&QTS-Wj-?m}D$SGcQ$^`+Rx!M&1*muy1r zTU#N?d+LYUhOt5Lx~qvEx4`E{3l<dD<k6I!_M+%y@H);y$xlh&X*;2HZ=(J2d_LpN z4jam8Rya@juFGxkC;y(__gJ4<8Q0pV5lnyNz#}sb>_nh3^x8$lso8>(`#Lc`!Q#ax zz3}INy9f47%Tp(|CjLx6^_?cNjW<P*t+10Yp)BhR)azeZHa}j4A#C*y{duB9IRj2y zZy>*sw(R59_24H3i};OfGa(NynH+BTO<+pqq9zF@lM#JW$5Oz0tNq}c2f%^+Pf4l$ zcwh7m3IFvo^Q~9fr$0?fd=67T=|4duFLF;n><#>Or~FeP*eg+V!F4upGiK26GV&=@ zlkNwR->*oba@fX-KOg%xnmeVPAs>C8qpKT)(C3)X+w!3(`Y`W1t29$j)W+Ktr4E0) z<8=8b1^i)#57^|FLZ2O$qS4>!aPd}+*Vp+eYVVJAI$2+EZt}d&;l6C-*W%f)Y!Rno zZ(Z`;&_RDXT=hf5nip~Gb*RL^O~k>FphW?%!8^iPv&x%ELVW0Nhc<Xof+KtVUf=*D zi!H2=7(ea*_S;pg4|l}B*Z_Q=4ES*lb!3}gvd33CBA&4LXT2PP9ys-pYh;5UZ+pWz zS!J02q0K(d?`Z$)uPW~R;-?70QZ+hw8T_KlTTKJw&n)vQQ2Bv#uN^Xa3L|vnQqM!7 zlql9Swr0ztK4P6$`p;`I;<@Lujk3io@Rb|Vau(yXBj<QY=5gRdY;o`Ail;Pj<L$y< zTKHLm74v82{JG)v?qOe1reyb*qKwb5GxoaZZDpSD%XJHQRiWqTWI}k33UKxp_xu0m zFy-M@tA*Raf9Kz`keI>a6UG56Dym@D-pYy<)0j{B?T5X;XvdAN$%SS!{+7?zIfFz0 z+07Q+hwn)&&SRv&Pb(()N>;bgP5U1N<~#+CbAEQqe|-WR+u1WO<}&KDEvGp%{89NI zx6`FjI<`1=bg|?D{NG5Dt&T71N(;v=WPwBF?_bq*!_Jsi`FM?oWSP*xEfWc2$d|R- z+}-pTdKxYDp1JRY_b5t7XYim%q(ki=d3W8iMu94f!}UM?u~Xl%Zp>2dwE~|EIdHpN z5_X`Wky_|JK$aI?a{clG`dGo)yUD)|a<m<~=m&hRfArenCiwgxNBxVP10+Yb;+f#X z6x6{6Xp6mr|8O0MEIj%ic5IY&CK|XH_1*E#C*0$CYSp^=voT-xm*mB_V`w5JEav-@ zO2m;}8wFnWlElRH--r6RhiZRX<m9J5l3hB{Z?_-uXF_(}F+Ljhup^lD74bKAWY!4r zlaz>?TwY=ZIrXQmv8)RLjvW^HnuK`X?dB*CtHk*=^YG`>Wad2Ws|uNu;1xea=&eaK z`=$CGn@-sO0WASD(LXe?pwQH}0r|m;UMJSvXdwyjV6PavIGQNlSn>8v9Lcu1TJ;Kj z1qh9dk%eCIbXz~Wc3O3qX3BY4OMCG?R_FH0<{0RAV~$^{5cbs`-_^wVqkyD~-li!d zkbg-*n=9gw<J~4Htz?YDFgij7dD}Ux-69u%(7gp&Z{C_BZdF|CH$35i{Y%RH(2pXV zZ+rh)H>V%>Mynb+if~cSS{%8#_apAij=H9D1$k^QH{Ua}zL0GHY1fK%I0vZ{v)?rw z`)`8BV%)2TaSqpX@lKrYXFOy1H$AGue0S(6WdT3gJ-c0^r^ud9Po6}6haXvNxT4*j zNU|H=Tg42)pCt?`3>9IoER`KGA1X<oJEqUSJ0XtcSR@ZC!{3hO5c)O1SN2HgQA5m& zI#);t=9A6w!H3oq;Jub-KWA|zpnmA;T7Rt%&|AE=o+j)}V%UBU`V(>5D_6Ubo!HMh zXTGWp{^(gMw_h;_c^{tBQ^>Ou9bb3PTRWQxUa*1CaKyU6SXDe;9ymHK@mH+~aa_MB zsCL#k{AItV&R7%ans?FHDhU2iR=&q<=oRq&Swz8^hu9AjD-L>uyj1_v1mBDOq|HFZ zz2H{Z^XMh7Dwj~;kfv$=$9p)}cJ-y@YuIUGGRIR~j&Y(MskU4KUI*-Qd!ZOfvl4T| zKSbmGtO5n09IQu^dw5CFe$@M%3Etd*eqDiqd>09fOJ%2y*+R&}n0wX0W#~Qe><!@w zL5ibbXvsA$0RLSsuu$zC{OrqR)eDK(AB^pp^B1`25Nhb^&Pyp@4w5c=I*7cqpMk6{ z;%d?B8u9N<B+*h)=guJiFx-$9Gs4eME5rE|CviS5$2el?F7RE=I%RX^RLH&aL6mJL z{50Zt+0y~~LBXaSsVl(4mKVLZNUxz$FW)5eJO%YCY)7jVi2EU9w{~4<BX??@+T+s? zKf2<O^eqOsr}*-@j(;BfLj1z!nSO$6#D&uL{UaroiDlQkhaT51&hBdgZWF;5WgU-T zzqn9WB1apz?RVhMHLO#01D_;21Lvc+a!0HKf8kW>y|hju+5Lsos5<1FlkrMdrIy|- z{B}nM&UX+pAp%E7oyn*pYd@Z~#``T7z2?5xjrv2=j~C9&p&sPiVEv?#FJc@0&Ch1z z_dYR^e88V>tD4Me*yRPwl$RlMsQA+!AI|Ov&L#h-FJA`SrCg4fYTToVe{=YE&g}aK z^Y92)a8vv8b40&nVgK@y{aoGcxR1+wR%fgR_@AP9bnPkR5A8x#7AzSgJ31<4&t1Ut z3)UZxp6NSi`S;zT$=l$8np;=Y!_LRj)D=$4P_;qVF3tTl<5vO~o@spsPDoJFp)bMz zkNtFBgY`jxmq^r;X<9evj+6cDTAFz(HOs04a*;WECe;b{qCR_Qb_(o+RWUtl<rK*} zzhja3>`~yv;(_Et@V91<fQx!xNoxCC?}(qU`!~5eKHaG&m0g`QCX<14oEE8?!aST0 z+_iPMHw8R4U$0~CF!ECW*=1*-pH}U@$5+!~&)uhQ4MqZ2qQ}ywHl`sTBf!>81Mdts z`S4P=i>?UwUfJ)A^;Wa~Lopi9OT6eYaTPc%Q*ZO-A@r2IMkQfcD;-|zy4CSJ@YBXx zD{=iZ<ewA$hh#FaF7?kHsu)0?sM&AP(rMDE;S{rJ*Az{xJXqlA4S5jx?ahu!=wqTI zY2cxP`oFX9cD2r@OwL&En*Uk~eU4{^{MU*)lr3k>YA$jEm*O*oQy_oQ_&1H+;Jf?V zM@2HgyXyDFudAy7j@K)k{ti3T7Mrtv68!YRD(S}zFX~UcQH2japxAJyX`~dm8u;W~ z+#9^#isx2yGk)gv_3iE>Ka8d3_s^Vv8$BwqXgB;?g1si2-9qD@?4e&*5vR(T?UdXQ zo!<Ljh&>1E4~qraKWCL7KAY$8_hjRq+%kXrU4Lly_Pu0T@Bqo4WBTFe?i8F4S<8Ao zE0&}bj>ff>zeZlZN%6r_;I^IS2D_F0behb9fP?kW$I~Ule6N99)7`el>zdHV!-40j zBK*9jVSW{hmx}sb`_A+*ct&~H^20fZGmYBqDmmao$=#KS{opUus#|BV567+&4du5= zgMHo^c_D>$2O)Y$PdXj=D1FMU@h9Tp)7?vPj~#KNXT{B<uruX0tEQlOtV2W|C|!sA zs5y_;9P0zF$tvBwRY5Z;MQ6==;SXlo#<#EoL%h)N*eHd0Cz~JTIaCQ8KQIutr=5-+ z9pKmPfqt7^Kb}hf?uHu)c{$w2IGR^pTLd1#(w;VXI!2c5$POa=Fn`_p(3La$f~*$* zug2Ifv5YuikSB{eDCW0ww>V=dAN}X{b-YL5Y{dOk;OT@P_hs)|tP390cnRVEnSp@Y z{r#l7PE7vL7sSQ2C4m;Iz%>oajG%SkpVSyP5d%DZWBc`HP#ekPxnMkO0_Qp&@xT5n z4*q;rP`E!3@@8y%%7g~dhjF;;H}=0whPJwE{syj9wXM<I0sAT^_L`Sq-o)F^o;}D1 zu?G_6d%uyJopSR|j-#%$=jiRkUf?eE@_ll}GvMl;rdH)He2$4UE$XEQ6J%1iMPVJ; zUKzUV8ph?F<zBxB@xwqm@o>;whM1RH+Nw5(YBrlxj$evCl_#&B%MEX!iN0IIPr5Ua z51?tu-?0C4J{J<6v#7b2Q&oOPFpj7L%*f38U7AWe*jkM|v*19_ThxEvc>eVBTp8xF zZ|zzyKPiUFu`ipL*<Uz3&LaJC;J<^KqBg)GiJ!lhMF=q_Dw&&<Bn275vO2c=u@Cgw zHZ2(n+)Cwql6?gKFFQV9?KX-!hKy&qqR5wwM%85*zJwi<<wj@WC&cdSp4Kl&A~2J= zdsdX<UoUW}v=#bc4QemqLp-gHd>lKIhwdKnmv_ZHBz9~mK>yv4ZWC7E70B7SOsBrF z4)}6>PvFsZjPK#X@B+kTQS;Tm&=2wM;R}-CY0zVd)9BAX#mIMmWGltNuKOc6s=+_7 zpI>r=@0AF(@=dkOfig*oo&HX*u?Y5h-9qBe*H)5f_E&Mu1ivb4`LYW8c!nR3cuU;< z2Ym*ZTSyrpPjN&>{5Je$a<4fn0z7B&M;`6HBlPhk6Y;yl+zhijt2QAzm8K38$%9AW zzjwwn+7I(n46XcPX{Iz2tr&jUO%goRK|H{q=044~OWJNfT1iqegC+@2)F~o&bC^jj zAET;Yw)n=~A)2tf%r-C&1#c>gG#P`QDX~^}zZR0vxZ0lL-bT9W&bwOqstvdlB>AG^ zHh5M3bKV8O$>?V}X~z)HIDe9awtXY-?xhlE&s9X<a<!lShS{jMS|9v^DgYm9SCSlo zeNc}ForH$yaDG9F^pBA1-c^ZBDZqP4{w@Ek%7D{DD@)G9e%mwO7;BD^J!A8lx@XR> zu_8~{(pV?=8l@kb>C5gg-IenNyrDfLBKs=AWZrtOQ>i`zJ#7@p7kY;8RfI`Q!k!)D z`?wTGu`bhDv{jaeVa`9vXk7)o;+!t)QAz<$wmC#PW?(<8o2a{q`oVw?HpaW^NX9$a zwo0WG=W12+|A-X;SI)h8cIh5?py#;eL-;l8h?vomRFV<jE!!eei1F?F`Od+EWEXv? zU401i$n<&HqlWhyo22Br4bz#zM{KieVHW`lKPCp2Api3!vqZOwCd#;$tH{C5L%tkL z**{E1`A%vaS|EvYy}d#qk=3Y6yw`N^a0B9`sh)*B_=V+{y9aP?ZRm<-yRFk0$*vVx zJ9y?h&LfNJ+H8Y=_s?1(Wec9v-)DGNv6-y+8=g670(=tmI=*ua@L=@b>mvr>y`v9Y zs;0{!hmc9dZ7uZ6WhFVCEh8i$c;$NdTKI2>e!>;qVEBjil~WiO@@a09iUYKv@$J=J zH-}&sKXfjw0-nnKX!5WGFFssgANLD&1&L=%r)e=JL|LYE`YP<o$yYxqmVsSIq(o*W z0x#zjUdX{YN)=}{spZ(mcJO$o(%DNgRzvf`B7TzWqkEbIr{RCplDNbG*abCv$mQiQ z&Dk~hDC%k*){#~lr?<reS0Yp8O{4Moi^H`5{6OP)bD(`6ZL#FW-ntElTj?uRubsmG zYe*9tjH2-ATbe&px5yOiGC5U4S21?+A3BhCv}-BW(!%#zb_!m8Ta5hjN|(_uh@-?h zB~j4<a=hT!nQ<}T1~uS2C2|ga+v(KS1-~Rz_lq1weKD0*>LIQ~88_Y9wl5NP<t!oo zBm!}bOFiG9q7-@R{On)ccu&PS)iXSubiGk=?+TndB?#i4+KqkKf2)tH`+r|Lucs0E zh$qTRE-pr&L&rKl&t*+>urJ1!UHl;x=OejHH@o5aj-Sj$48P$2yY)}TM9^Q_<jyyB zN@M<w>T%6%tgAO3=1~Ifm6!f^@)P8ut+{YhE<Y7uy|6!_`#1dS*AknPA8<d5`tIWY zO3@eUikYVnaN?ocm5v`{WVywXnjN_V$Xg4qml=gznE1o(t&lUPBzUbB^vMy3{(-)Y zma{kO-xdNM8V7mYX~aC|`n(Pt!{@_Ei_rPQ*pKF!KJZ|GT$M3!CSg0|sT-hvdjNJ< zY~9+_ng!esoy9wIk9nZ=pR`GWsj$lM?N|a{kvCSK#D(Yl=1|tha^Wvsb+0@Af-nB( zWPNd%G&aanj6yz%nA+uX^<^RIV+RewD{F9WJF}oO7;=s}(D#O~m^5oz5&JQq3wBh$ zDtZNQsD25*(Rdy{xk66Pob#vl%s+;G=d3t^<z<HvPlj|SyFX@NzSgVP-MxqZ+o#ui zsvG=+WvsqeoKoGkLeuyocx=T$@VDnrU{9|e)S1NtUwGIXC&z$?7WcnKRFIqtn*DtR zjks@B>g`RXkLWii*Xm{Q4ssVznzY5byT{dJqvTwMvumS*!Uyd4r#JkZVi5O>oaY*9 zAP!n8o^{E<dnGPc4JG0}nrm7YcRE5YmRD`|mBSw!2_C&Ql{7&J+4FcS;XKKR-x>4| zkvR8kbJ$wML5=U_d!x!}Vqo3Yv6=q0XZ9?8;0=84S1KMvJ-uB?RN@|c@Yv)Wrsr1* za4KPc=`8s1)^8JvAE3`7-L;$c&Z8bET<1}2oI;-Iq0pxnmtmJDvP)LIg?u>G<97zo zcf@3GdQ3lU`>$AaNDgt3bMwegeJ}W{+0|E8&N%O~kZ}n|9*VI(;pUHXSe0wH_g=@i zDlDt2L(_0R^MiPhH3vMb@#RtDLExcMeRkt4Dx|#Hzv(A8MXbCQ_>#XJ?|X5%qV6v8 z@|`CaUWOf<2!Aq|iT)PSG57QpF)ttL=xI;jPt<{<_bGqmbAIxlxdweo<;1?Z$VH87 zw!S;2i1nNupJ@JV_}A_I4gBW#lz9G4*GLg{Bfoi0jdD|oqL*36)bYGn+5P!hkc+SR zL5Dn?qrP)f{J?eif7HG~eWI3RHVQvipYe<54zE6kL2s)DMl;iynfys~@FezosCV~$ zf@|pQ{aUqeXCaPd`U>y8bOnBMSDcfB^>X`-$0|+mOS^w>S|o%hi6t(d0(ifIKg@OE zE`a{qcX*!=haEaEVOfPi4o`0y`=bAJ{mZ^Pwj|`v+AjOM;uh>qYr^U*-p}=8h3UgV z^c6D}4x7bC4b8ul%_Y!7vl*2Ytu1dLzYUJOBX^KLTNSC`06oblb-C5?Q39E>a$d#4 z|L&^Yf5KHm6CrQAGf#lmQEOGW?m+LI8BdtqB9yZC_Uhi&N#v(<CtJ$P5D)Twv}W?G zTc-l5lldw3GJ*9YI^qoP_u8DYv=N*`DAV_JjRj8=w_1{vPqX<%mpr%${!`7~_bPK9 zBVph~RxF&v_yrpG$I-N-`jTtjC+jh<j_`PQS@hFWk=OPVW%QpEM2<}(pDlHyCc!EO zc{}S_O>a0DUy9v3k#^wU($T$J{*pD;`_Fs#A>K{i-@a=A@^D=CHCYp%fp6A7eJ2XO zC#@<Fj{f6Kb3}PmF)x`5mI?x&Ng~GovXj9V`0>m5#;{-b{rxI?oL4Uk(ksy(!91w5 zE|HoKQCBCZ`)DWdrM{E6jQlyVne7>i{lTwhv&58$Kgh$|UY$lCI70Ef88sj8eR?&s zXD#X!s84qvnheqL4^AcQ=Z5^c?#5r*h<RE>tXMDy@!tv!9faYBoFpsBvyznhG^=#B z`zTFR&fZ;ChV?~KY{1~meqv;jedJHX0kxBSr!>cD?SHd`|3+aw<A3$T$BU?MlW1yw z(1ZCTJ59e&tq0%eVwR)7r0(?ce`CB&H2a#Ghhjr6`YD|}lG*~i?5{pIIdkuj=&M6A zKSoH_N?y-BMtCpj9q*Y_MG_jpdsctS#eSX<@4NfJlK|@d8;@?X*ZS(NZC`qk*By&K zH3l4Y^vW$C35DO)TU<K#ohFJ7?q9T%htU)|zizyd7kTS?la*KD?~doM4)j8Q8YeP* zEZg88iB>11;z*W#`SG|u=yNFD_lMYX@Qqpd2NiD9M5gC(`G#)Dy>(K5D>w5j<HG2_ z{qUC{N4Z}c;t*#7OkLct4zMJD-g53HiFcciD~ivhn$6WDqt_t6F&OS6dKCKby>~lM z8}f)w^1O8t^I%U*L?0HUB(h&6wu?;D#24}D>yN;Hgw0jh-H<ckD5ZKFcuaV<vdnA9 z<ccakqh{FY$Ko)qTh+)TRMZ|2`-DCwJKg^T0+%=$E;?B+Q75Q-jORS?>rAxEg|63l z?+Lj)i%8g~%FA}$aP*(>JvV?p>+Qnn*WSwyppNhz`)vpM5d1jFg#;|}j?{#wD&mUF z;~%>7+h}E3fdK)3?B_`wAAQCJKa;v=-#Ak*YWLB)->nyXVb_)ui=l_+!d2&{ib&k! zUOh4mJUI9Mz<2XhoRcd4`A7!qTB5W{TLXQezUC`<G=s-e)5jV+!q9J|Jta=E0X%lc z(oy6GQLpD#RUkmwnC@M(p<#k1e0He2toT3^&%y>eRde76ZD|^Qh(8ktGGEi^SI=ku z=bb*rCnEF2@B;Xx#*Y`X2XB+?F4eQ9<?yfnc79$p#Klay7_|p;!=8eTo*w&B3wx6} z{#ZI0buHQZPQ8RZi$+9E<o-n;;>&hPfg#9?pKu(`z~33Mj_cp<A>R<VY5hT*lTdwM z@VSSZlB;ZuyY>zGZRVP*m5TUl){!mz4Eji(rrlm(9mRR|WcYdu$)aCmX`B8A?!8dD zGJXpEk{1^1<mKTW$7i>_Ebv~-wAB;W{*t}lS6w~0p#pgJerho1BK$&OUQbgjNpP;2 zer^Uo;2irgxn+pfoTNNdtDqlC$9q3yU{?~hn*-9}$Eg+Tj$Ky)&))c9UE>h#Sot(J z{lo}Kq~=7}DPdfO(K?hC@V=$*v(S8un{!<_v$cwJUjEwbmjv$1p11hF_K7x<dC|Ah zF}Z_A-_y?uf#CfTtJZ$g`bSH4EIRS83+p9mT|LRFcgQa+QSo>cMY78|!Uq}_F~q0W zHy3}LO>O(wvcMDPs)+eMMyZ*|vo}gcaMo90eLk8t&6)>ZxU2Nap&{~a{Rgc_cHkd> zIz2v}gPf&9R}b$;-c~Jr-t%m%E0W{Cp8#L<IQMkaY!>`Q!69WbF$;C_Dzd6aaejgw z*fnJ^v+vByiN0PyC(1h9f5^a}_kD2njs~AoRVo&{@dWtW%y;4;a51)Wz$=N53h^$J zpHtF_bBdy!YpjZKKVsOkF-govLS0^WChu0X^ug_Eg0a*)=i)eX&!zTx{l%*Id%fqg z5pLMwngOnbir`n}1?nLV{dDxyJnn1J;Jfu2I`41~8dLL2U4#6Nx`Pk)<jHZ|FW1>H zvXF~emtm*Bexw2RWHyi#lL_2yeB~`3gnB}5uBm5Or_|q8wCg~xGkPv>-&gFbTuT|V zeE~e0boq}EtwsF(aAxQs;!1z-gB3>YbY$Dd>8Jq2^ZuVayR>3y>e`jhDraiohc|gl zZX%9e56lSekfy@tkNPCHVH_b&V`ak`z|$H@<1ws%t88BSb0KeAuKyvuQGhYw+P_o$ z738#YyqIKOLLXBGA+J859ws65C;H(KEaz##vm>;Ipn>(vJdDG!S2bX3BJ99*`(L5} zbxFrcOC0d~3csCm*zNS_z~s@FWeN;IT(sd3H)w+2&(f(W5BKB66`NPG(5HL#r3}Bn z=m)SZHY*GJbb4cHc2ltb4{E#_8^FW7++IoR!2UjcpL4)Ngetd;5VbPHeD$kEBIUEu zkDb|VGtoe@Z|p7SsaXX77+onww2&s^FV>na$9RvK&dU>oe(M`Ne*d6><E;-&MZ2&b zZ;LwW)k+?9;xo_7$NHsW`$gBN5a@sNy4?A&8}`$AcjrNW_4>6*+T+-=SoQkWH{??% zrN4*r!;a587I!9BfH#Ji9eE=MTw^cUR~1FGPrZ_u)cFQEzta3NQ$OSw@?XH;HX7$j zj)fE<u67HE&uf*XIQLZ|1xI1`VPgu4T6j;gkH_JIDd6j7E;r(VV}w-o>66L~>%{EX z7Y$3GUqS!fdOu*l+b4EC_<`|1*OeUCfq%SjiWX&2>|1k{3kxe@SJJ_jZ(*Oz!HaI% zm52wS!4vNMkjs*WxX<6|irt;t-|RqKjb3&sz91j?>*BgV@hR|wS7@Clcn;<LEV}tS zZIfzK%cnYw@fbfa&_>+VcAdBKX$RK(L1i}K;IXkE{z|rCzrH(GSYj#S1vOi3%=#nZ zu7^qHOy7(-Z{C`hAP+(mx@#SxX+h`VB-NQZjVqe9o7JJ$icOQF|E1AHl=2N_H#P7G z;gjJL6k|8%$-wv<P4x2>`nRh{0R1Ms+$EO4J_G9>O+7F`es{RFNq05Vof=a)6*hw- zoj+gMcf$V8?3_wKTy))f^@O7qLpX95a~IEJn7^y%yLN#G#BYsXG>CcMRGz*d0o-FN zbbOlPhCM&EDP1l`MLimG&f7l?xh}}g`SKO<k9VN%7yfT3Ev>r=_D8XEUTz{7f?up9 z=rZOfBiF4#C&Pa~t>CW0&qadC3o0-k#<4B>9zI!($7{oaU{CVHcEfeZH=S&H<6Ve2 z?3oq29Cl>0lizL5JWBU)jq?2mBZwOx4ene79!wr$5|_NEiJF}0U{T0d!y>BxGWL<~ z$Sf~iR*bmk-YE1w4tWyi>;;QUzz?ExOj9$lt`WFc7pu(hKKcDAFA@G`xL$j`CG;ZL zv+>KUR^(ArpMOfwKwd9AZ?hsdbw)U0g`bcz&L!-8zB&QlQ`m6fp)l-FW^J4OYIW!} z{b&4RO~x|Y_@Q;EGU^*Rg~QgspYm${u6TazH@r2Om8uH6(t3OCu@)00B#|RNANcoa zAg8{I!1`Nv9ecbB>uzU}DhcGT+~WJnk83azf6J%>ZSd6!dBSxLo+oiHdXgLdZrLm~ zy6G?YiT;pOXeuew_|JWAKJd!7&X_M8ypyv}B<k~B#Kj}By{7Pgh3#4T$;y=OF^!AW zd4j0hA8PEr487IQUb?pr@#D;K@!+$o8Dc3{P`{uN!|cyowKNxeXz#nm&ymAem$1A} z`2rtS<Z(_WE=T+xh`qd8kx{+-%7{#WeIzd{GID)S5^~f1YCo%B-%}@e#K5lt_B4xU zOEQ*y7kQouU|+yDXF<#Idi1rpqbcnG`LTj~MWbh9{d-+lvssBsmOl0=reF>HCH_d( za@d!Iw$PQ=EjR}(*;mD{4LLqKT6uXHl`6xhEBqaDVZXeR<Np}*aL;tWy&%LLzw9j| zkpCvFq(KLDrhz}|@>2y3hFEQ0WR;BPFefirS)Ipu)1!Y*uLDj*C4PK-{u_PlZoONf zBK$Y%pz5&;u&bx?$_26w&|mB4mGf6p;3qF0l*0}u&S<%H;=M#v%U;tXu&;}21^Yge z#A=qRx7A$u+eEQtjW|PD{BY?phCOae5??C=es61kIQU!@&0e`T_oT!s#2Is=-Y;qt zTH{5zT$HDX-{ym}TA|-HieV}1f8w0x)Ycn~7<Uez@+o~5WyyDpxl;cRIIBp@?sy4% zR()QGzA%KY$NVt?@Fphc$ofxz$bgltTeVchu)iEL;PeG{%I=E`8cl<o6NtOKuq&C& zBbM58s7yBzr8_<FJJI`{!!B5d)p7d`aRC=n`;GkO04I%!jz!AKOpoR84svn{_)OKY zpZ_5aw`eN0tR4X0bZwRK!vAxo{A}`&2gwuDbbdI7_uZ6=wVbg}?#9`QW%&7Qz4&YF zAC3On(>%C{VGQ{AKYkkq9vpICR!~B+Wq3BH3Bev2mxhEAtT%9BM}Jx~No_t*)nfoT zSo+HB?|1_|jaFAw`3Ad+C^<|2Lq6$t_C{`brs9<CrF%1ZFGA&!?W5bk$2s$sbwF=X zUYx!Mi_w>O`IqixN{r3RD0#z~`hI8mby{(-1JUs#I(7J7dz-fPAK<CNmHD;Gij=3& z@4SL^#2NNjYahQ4{EO+GIyl3hb2Rqq@W5W0a$}OEnDOE1sBO)_nWz_&OTvKjA=@(q z`-`ytJ-O1;9lWzW>-1&E%}kX19Ig{5H!{TRd=KaC(4U30`QkX(QL@Dwcidl0*o~@M zp^hR%?B<qh=D#4<-s|_PUXz5~#^Hfiz%|Rjn22m8hLAYDN#xfGhQqa=FQ}dy{hI|O zBZm6152oGLdl~Z~b}HT3u88sIjxFp(+_alG`ClC`@N0L#NDcgvop|82{}bdlWVt*H zv|v{XmhL6`3@#$79-lJ~d9kWmeh$&-GuYCTS_2+!SonA@#wl|{qgP*ziW<CX?*0&d z>8K-oR0#5CeGEQ7Q_p2QE++O1_8a>_WBAZ=Dqs_-l6_zfg>yff*xO;J?75#OFM~gG z?9Sgiig7aq#-6$ZB-N+BLcnVZ@p-xVHTP!l?A#6!VZ>`u-d+47uq!6v$noMHvj2kq zwp0h;v(V)=`A2~J71ajA`AxuujiZlwmO&p8lWtFxn1GMhynoZGu%iV^>CdJS$8U_@ zaECqnKly!oogU(}_?|g9SGU<`UzYwsl3`aUCKftj-W){-)sjDu-yyy_hqusUO0dDA z5i;3i+UHpr;xF~N>2Eq4dG`<x#hLp*m=ycdV&GlGEqi-=e#Vvc{B6`<7QPqKI{!r$ z<kDIFv%VgAms!bTX^`J>(rthGVurOs=U_k)@UWv#!f7?^MO)x=MMw+!1^(-ksQwQ; zc>S8rqpO&{cX3nUSvwHN4#fw`V;;7P8`nyrPnf}<?UR|Xx3S^nW{2ibrGW?Z_xnPA zKP>Z3JSirlR9`tOyaN6ib04|79QG2vadTCPBE#y+3$kfI{;pRk%VX;#_{eqlmE0|e zUk!~nYu2KFmg>@=bGnR~b?T_cOy4ceAKP=E5kD-yw(pHfK%V@_h-@8j&5;o2Ix#^y z>DxR~`wsgt+8DK%3p{)D0ACU}c#&oQvr-YPXDYfrnfT3T`X6O%zNM!Ixw}QaU5q%) zI;-KB+6sGB9ZQ)xr_Fv{x@|8v>U_-`^edo;kfmqrQd3C6qTu=LJ%|g;U#p9YU~gut zA5UliFWDLP9}fdhSw*ihYorl>%$vN`f%AqxRdfCVuZZn=9@l{1rmel760qLVEoU^A z0WVl-iUl)uG~JV%bhjb?X3o|towb;9^ek<vSqDE6R4TI2sU``DKb3uNVTVJv6}LBO z<2?m>ESx7Mew%UB4g!ZLe_rW-g~<PE*;m`a??R5fv_<_GA*dQ(%%eetyKpM@2&e$( zRyaHEgFIrN%FSMb__<W2ZCSv2itSmHlM@ShPdiueZb(7iyq+`rZ~@lo(fY!BdT0Vi zR{gdhj^;?!7=g#Kzh~)IX;#55?;N$f^8)ceA|Uy68~llT_r~)S^i=L*d<5|;x2SUK zZ2Uf1WKr+P7t~K5J;Rp>Ke3$p;3bZ6_Ola~ZBe9lChnHWI1E3PakrB_*ogc^utitr z5Xt^#6)3_Dy=mmA2VI#YC%b<e*Dn|(aX!0^{qQTzSnqfHo&>zto1WBA)dap|T)XEv zfjBw1g}xGv_XgD}JH(U3{JW15G$HR3eOqr}pOnzowv4n?pu+Co-f?I>@IF_3s%I7A zg4J7x6VtGpB4P3(Da#PsVx#0mNQ#N%`LEOj{(K^Hc;h+5wR>VGn-2d29&$BkN|WfD z#}}cs$AH<{D^kr>3OtqJ68Fjw1s}U>{Hco%acEF8X6C-tdI7D072s{H{{N*lE`*(_ zCCMy(138}gHpaR|6QM8O&tGnaIDPe_L9q!_f+m{^M-6c<qk7Y?t9Xu6gSxUE;*~^e zmi{Z?5V4LJA1tJ+&eeOmXv5DRdT9N606evOw%LCK>!7G3U3X^co+_m5R@<mEqe}Vb zRrr8^ys4o_D)4v9$Fn3WFn>lg+xhJX_$8q*&PXt$Uxe1m8Dbq&^Vgb{2E2WoKWBqA zz8@}aeVerk_}A>Eyq=rtChH7i6To}eTHZDrzu`GcMs^fIegUgqh(6~*oN>P}P$ouA zn%TF$nYkCV;zHr4%uw*9u{t&LY??4x{^ODp-lOeJIQ*T9^A%qnbu5S7x0IbW%Eq`t zvZmroXq*dE45R<S&&>2a+Lq3zJb#-7Y%papgtpL)iw21MN40s(H-q1^nx4(~0x!w* z(DvmhGHkBO@zqBO?Bff({Y4`FSxPKO7)Zls>=)H!*rBe$;rF;_>eJaJM!#fc)@cUr zdzA8kD|b7I*I%HQ$7jYC{KRL{;&#b#)R}*%OErZ3)u;HM952N=5I?Rjc7K5TakThW z;E=?%3;E^qC=TucA3iyOIB?`}pXgVTVCU#=_dxs)>2I5Sf&3pUb+Mec5K}kebk?f| z_Q>2{yF?TEr<VN)2)>NGZ0Dh|PrxUcn|CDr(63^f>-x{j>%bp(x8%?4?>i<)NbY$C zeO;PXdaDC`znEh>IR}3C(PpFmc@pt$#qH`u*#CVKwJ(rM?*oIL%*8k#?!|q?dN~s< zMTUIK+>H9{sSzHW4<puvb+4)$LR>A4alQ=uh}xX@@|X<Pp&jDKIKZn>_C28+%~=2L zXgX+72Hw7|vTY0WZk)Vyqq-!eYWwl?p+4XX@$~$bq*$6TZXesWt^<8$$+qS$J^bF~ z^t~^QbdD$c{hGAZ$anbo8b$TdL_L44-M<E!@U=~lGnmHtnC|1<u>|F7y6>5n7WDft zW;d}igC=$^)s&Kt!hTS|jsRg3;DpzDnY6W(qx<2}Bo|GJopy1=eCGTYBSXA=U5<Nf zr))a);b+9h=-NwDq;I_4lWds{@PpQbCV^_mueEtsR66`^zi`C`Wrlbir0rt4lyX`a z^e=0-B+fHAlB)8+`Fh*P(^slcznJ+_`5ADCbLcj=3+iY>1JC!*<P)M~LdRcV{M&P_ z7d!sKbI-3ZM!yOo*3^8gXcZMjByGyyDKnGTtGsj&dgC0KDBjtGd`*DKn>!dUyZp<% zZDLd=M_br49r!>5xp>znLC&9ao<3rrM<&qB9D0mO(v(6!XZD?he<8ErkCtbp_ss`R zYgCl_K7&5mKhJ(TTMu@1>E}KLS&Ai<GW>SEH1>av&Rf}l_{B1Rd|l-|#&_dw!zRQj z=9`u4c6o}u!PkLjTpaH`{GD6=3F3&zH^DRD2}Fgu+`2B{xpADny%IwOeA(^3ULN*s z(3J4863@Am_=+3&%~pB0^_LWIOmuEp;V4-le@ZE_A9%xB*!NxmIAHnY^q1H83^&v2 z+Ng#3MrAKPC(Jkw<y5^|3j20k))e0ZUPU~#XxR(@jPg8Z_yK&1C?@G&y<{}e#ga7w zu32VJ+S?Z*53%6iQ8VB|GI!~VS{3M{_VT3J9EQ>Qof@J7KEmGQP+pdf@m>Czxw{za z-~0Oi{J@{1ZgJKwU(19@m--yMhWuj1<A}mc*uALdRev+^lFUM(T$E!FtX;`IzveQz z@q@EQ#|)6qY5UN10nZKj{V*dH`nBx7I(HOtja_lD_}esn*tlq%iJP&DGt?$0tlJ%h zTU}_xNoMu37oTJqBI>j5fs~~TQ?O>!zK!sEjqf8@gld433i;M$qsSBfz93)&e_&3F zr~MLOCU+glJR1Tz2dv1B^R1={$NXE8Bl*yu-?+b;BI@p*3oIs=FpO^KYa`7C*zbP- zvLv?zfA>G5XaTz+^t1To5a*Z*F)nE#hLziAt2a|$N9f&pekc;}T^3Ma0UpUZB4jJ9 z1w3B$>$UVErqn@!(EEcp)_?ZK9uwf+s4BBHAH2e*sXX%?^hTUAl9`fYG`bDV7Fw!9 zPSTb}hUIuqr}AJ=F3owLGJGKS1V!vTroVH)I>WozXzuu_brd0SW8;aPpKy-LbaTl= z*op4^g;ze{z0AK>Z&49yj*ExU->#W>a=ht+E9S|5%B?ihznQS-l6(UHpqw`Aw1`ve z%rX_W1L8XSthx9^6zsITB2FO_{5U~uem6h#d#!WLs|AdmS?-=6+ePubxlc=_5YGv} z>FYE5?E&Hc+N~+*P5#G=i>n#ds@xO1zCnIbZ5rG6!k#V9j=hwH-UyXd^DjWZj;#Ye zrYuVTu+-gpVmY3FRePHTo~Ien86yB5$Np=lu}}iIyJ=JDZ3)Jb>*kp74F9tn6$)RE z_#36OcJ^V+!=^-BwskA`?PI>o9Cb?OhJ2n<JN(0PRa@g8tjkX{<(-#rgx%}rUfqKA z77_cHyac>o!yk4m7V{wboQ*fYUZ}J5wLr*`aC5w{58n&9PV4epP-O=n&)J@$Oc9Q= zlw3IN_}<dW*!&KR?@<;zZv{ngc3V87a6d(!imxs|>?h!N3fT+25{Ks%%74W7ByQ+9 z!w;B+nRN|<RK?K|`={-|KhC^hzqNQTasI~H16a@WZ%yCqfpsS_C6vTSGZM-%_josA z{Sd+}x@BGgN!0FezHK)OoF03s`5Ws43x#0L5d&(j>t(;UsgV1doobuR5D!ibNtw^= zPqE7vES%xP;Tw;yQeiQamSCI3{6Dbc>UN)*{v7Pwc`Ap%Q<?H_cDs-tauxmCv0f89 z@1a%8%XFaMkZ^&SKBmbk8&);_M*Z4G(QR(};LlYxg8Q^7w$ehi%YndWX1~?6EbyN5 z^nDf^cAfk=;PE8^<ZWk3x15n-{#x(dbH832>s@|<&pNP!s13RPwjZ$$-urHElpgeP zB`M9bgp~Q7m44d@`Z(P6??wWiD`<VlxCZ033@R*-7sK~<xV}6LzW4l)?Y39*VLztt z?cLhJ*JDl!J^Ky)N`F4Z4S%n>^z>83QYJnl<KIgT{Gez2_?JFBk8r$pAk!53TcWkw zegtw~k=x9vrjz9^DJ)f00q-PNm^4Ga6$0<yF%{qy&b_j`z#BByXXx!+NbP^Lf6nhH z;3muN{6076m0HM9bAf{vS-;B`=|W!F{p<7K$9C#EQbVf1@z*ajXYNHKY>dA(0XL%F zOl*G51%Jz2|D#ce8GW-dBVndbJCm}}csd!lmYN^C0`@-{!&6|u0`3HNzkja8aN=c$ z#ZV7GoM~t@obg*~&WRFB=r_5k^pKAx{3c9v+v9l*D`+tIu_@va=c)kLUhsS3YPM(v z;uv8RP`7*-<2b0>nm<8S6pxfFI}bc0EPQo;R$;&AsMM^t_`AlhYb$Gk<CdB))^C<! z*t_=}F<b*Y-CX$g*HP%VH}1=Wne#ZT8|RvTVLeGKEDbw@I_b%|IdPBwz@B_ti@Sk) z6*{Ni-N5%(=xv~`Azntg+w^}OqX|AK**iN$Fs~%XrnOl2^dIsTifYAtQlEd>rikY; ztDfiv(M-V{g;kPxFRQS2xkoAFoH9KSKjWABC-j|b;YVTe){^jFo0g~Ve0ecmdB%1Q z;+AD$y=5H!PQ)*{xuFHmR|vbrQ3gMr4%y}vhTrqr+C@a*bN=53>OJgLw*G=2;%m%8 zKO-A0rlvAl<-b>mgX8;7Z@&xw&h0T=yJraV+LWmhKtONN!~GW)QtTxj>n=>sqKI`; z#-H^DNrKRnBJE!T-&9`4^v~c+V)J7?1iEu}PW6L`gVb%el?Q-V6-DO<lwenhCfxz6 zfXD0}{VO-7$;8#6`EPz0GVFy;eV>j4XPaNFD7k|18$L0-Xpi*}CvN5F>P?hm^TPnk zUNx*YJOAab9>Tu<^+P9j!_O+J9$dACe_2YYJbt1~QHwUVHF6M-7`am$50+s3a?SJh zLq2SS8m`en$gk$xn#ZCHOFJg2H6Hk!=;xK$1-oZ)h5v~84m({X7xcf1u0N>BI*bq5 zl-9w<g+T;5QMMJ+c13`h?_LCP;%PX*F=!lK2vZX`^RxqH_@h`{(eTG<S^DNUQA<S| zDyH%_5)jb9@nbj}i`H1z7zikg#@T0o?Y4dI-S>H(&+~bH-1oZ&bH*5IO>*mQ+@Dql zFS)~e4t(Z3ZX<zv>fYy$TlXQ)mBEp{;Uw<;{Tr4xmyU`TCQQDT06VJA75{Mozc(D? zv_UWGlF{FoeE382MYBaj+dY$=RX#TMottzjpbvSPIV5U6_>XHZ%J>z2U2wNig1IyH z+8^0>3n3@P4q|eV|BZR~S8Cwzc22I&0iLAGFSjoUCC^XXkiAsILfrW<+ZKs_nZ3K@ zpay>OQ|9n1UCZIGq3joL#nG<%ZU1puz&G~?Q&jCR&YRc$la=3%=M$Sc8o<ZY!^eVF zCSCt_*~uMj=#Oiz`D_W|K9#aZSMT@ZK+ACs_(fmy{h{g@Qb&zy=O2Zh^x0wFB;*5B zXj*49-dB`L!}Fb3zxxBxZ~$%NI0I6NSbU!08P@{`6lX%+j=WDj!5Tb^yp<=vRyD<^ zD=wD$f-`|Pa@P1LejIq_HN`fApBe9)S+Z!v!M~QJC?ZI5rFExBh`1P4_C-*S5B}Tm z;BP6OhY9ZkFZ_Ak^hd^*jhO4Me6w&J_@M0w|6UCCQ=rf%IUk}wZ>r1F0)M2YxcIDq zro^Lp^m6b^eRSs;E&MSj!|5h~1F0cQG4uxZ-9E3T#3e~pHwKj_zK44IYUHL!#1#fz z>M)=V5H}0HaSLE~WytYQpGs&!iKLeYKPUH&oU8r?>$DsUaK?S9T$y@1){VJRmk!2~ zlY~t(a}&JD&@XgXp2GQ#L)+3f&!8@wr#l^*jQa|&Hb0Ul(@9f?>YhH-s|CB}x~;uU z3=9B#VEh`dCZ(|MIdFC?R?&^bYQ(i={bJaS7cXAR^Ygv6@qnrac#m1+%)@>dGWmX; zM<QLlkyS7q0DC8&d?)$_;#Wv~um^l3w7I)3i@+D*Upjsl)8vZTy4K8o$QLMXaX~LM zl_Iis!Jk@gw>e-Zp3+lJ#*ws?kbkQS#Cal{_jcSA^5L)2`Wqle#+CDm*+r1=6Xn!~ z#bm_MwY5P;@DbhrE+?@A=Wl#6RXO-WoOL?g<k#QzekT4uiX2)t$@aqE7(?<~IoBXx z(c#KnM&Kg<&z(>GylwgUN#Cp_Rcy)X(ICF52#e5%_&k=7x#lVp{jik-gco*q8CM-N z19z8PD#Q33+`~BhOuGPm*L}RLH%Gx66%Ff{*RhVy-V%O<M@JMMpjU5Qin^Z9BFY%R z&7A?h9Cm)v+hXqoUdGn%o0GnfRH>~O(mSB%w#56-PT>3L9V-}#cGPi~HotCw{wm}f e_ONCo)QRnct;)|Q=8blLf1G>9^xem%rvCv$HMV;I diff --git a/allensdk/internal/brain_observatory/resources/pupil_weights.npy b/allensdk/internal/brain_observatory/resources/pupil_weights.npy deleted file mode 100644 index ee12e31d44ffd2ebc4cdc9f91b4e4648402cdc48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32848 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 GX#WE~eiv*2 diff --git a/allensdk/internal/brain_observatory/resources/roi_filter_training_criteria.json b/allensdk/internal/brain_observatory/resources/roi_filter_training_criteria.json deleted file mode 100644 index ec25d617b6..0000000000 --- a/allensdk/internal/brain_observatory/resources/roi_filter_training_criteria.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "union": ["eXcluded == 1"], - "boundary": ["eXcluded == 2"], - "bad_shape": [ - "shape0 < 0.1", - "shape0 < 0.2 and meanInt0 < 30", - "shape0 < 0.18 and area < 124", - "shape0 < 0.2 and area < 260 and OvlpCount > 0 and depth <= 300", - "shape0 < 0.2 and OvlpCount > 0 and depth > 300" - ], - "small_size": [ - "area < 120 and meanInt0 < 25 and depth <= 300", - "area < 125 and meanInt0 < 25 and depth > 300", - "area < 110 and depth <= 300", - "area < 150 and depth > 300" - ], - "low_signal": [ - "meanInt1 < 10", - "meanInt1 < 19 and (meanGrayToSigma <= 1.0 or (meanGrayToSigma <= 1.1 and meanInt0 <= 30))", - "meanInt1 < 15 and (meanGrayToSigma <= 1.1 or (meanGrayToSigma <= 1.2 and meanInt0 <= 40))" - ], - "apical_dendrite": [ - "(meanInt1 < 25 or meanInt0 <= 40) and maxMeanRatio > 2.4", - "(meanInt1 < 35 or meanInt0 <= 50) and maxMeanRatio > 3.7", - "area < 116 and maxMeanRatio > 2.4", - "area < 120 and maxMeanRatio > 2.5 and depth <= 300", - "area < 130 and maxMeanRatio > 3.0 and depth <= 300", - "area < 125 and maxMeanRatio > 2.5 and depth > 300", - "area < 135 and maxMeanRatio > 3.0 and depth > 300", - "area < 120 and maxMeanRatio > 2.2 and shape0 < 0.25", - "area < 130 and maxMeanRatio > 2.4 and shape0 < 0.26 and depth <= 300", - "area < 135 and maxMeanRatio > 2.4 and shape0 < 0.26 and depth > 300 ", - "area < 140 and maxMeanRatio > 2.7 and shape0 < 0.35", - "area < 150 and maxMeanRatio > 2.9 and shape0 < 0.30", - "area < 200 and maxMeanRatio > 3.1 and shape0 < 0.20", - "area < 300 and maxMeanRatio > 3.5 and shape0 < 0.15" - ] -} \ No newline at end of file diff --git a/allensdk/internal/brain_observatory/resources/svm_trained.pkl b/allensdk/internal/brain_observatory/resources/svm_trained.pkl deleted file mode 100644 index 5819c6d6906ca5af2d1fae055c98ff7175d61b42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644 zcmaKoUvJYe6vfj&qs483!5A<G<3Am+2nON_X+lMsL?91C7alDqaThbk$+ews1yuqG zK|c-O37(Mn5a6a$pAdeq<SYNqJ?DI?$L2tCrj>6-nIB7L3^(MJP;U0-?SP=S`59{y ztoNZQb7QapJ%c6FJfW#j`y8848{pFJ&X*5AcE7KDg!Zur#S;r{eq^~;Od9`v9!U}T zs?3TpEkx{=lkmlJt=agUW<|j@!IoRup5Vzo5GG}QNVAL;NT$#>WmKtSC$1ETO4tk~ z*oF2`NUm7Mu?MRz47HlM7>QpTNc!-RuZl6ADkEr(xQ=qe@pRz9vQW-h%nM6R%%ls1 zXM!3ulafhXo<eUZEM5G;v(7`tj;L@Do_qbP0WDQMD6Y&M`EjnfpOw;zxwDxpbD_>3 zJ5KDl-~?BpE}r0pzzb^M@Zug`>IV&|J;Svy3}60nr@8{q;^hdMBhT}2{VQJC!>iCL zTuf=lxB+#!jn|-4t)ug1u0taqX}kel%~X<S)L3RY-VC8(bBVWhch;W%{JlQdf~7d; zLyEW4S>Jaic(<RDY1&D<>Awoxt_tkC0?DEeiklUDZ-V##3qP*l2M+F5F6ki``>DmP Hu#Eh_rsv`O diff --git a/allensdk/internal/brain_observatory/resources/svm_trained.pkl_01.npy b/allensdk/internal/brain_observatory/resources/svm_trained.pkl_01.npy deleted file mode 100644 index f0a37b9080ad9def223a99b76522b97d6132b875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmbR27wQ`j$;jZwP_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= aXCxM+0{I$7I+{8PwF*dpivb0Eum=DF>lR!9 diff --git a/allensdk/internal/brain_observatory/resources/svm_trained.pkl_02.npy b/allensdk/internal/brain_observatory/resources/svm_trained.pkl_02.npy deleted file mode 100644 index b5e4d43576d984b40cf4026abe29bd88d66a69d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16464 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 C6o`QU diff --git a/allensdk/internal/brain_observatory/resources/svm_trained.pkl_03.npy b/allensdk/internal/brain_observatory/resources/svm_trained.pkl_03.npy deleted file mode 100644 index 8b2ac77ef8121fdf67f67e74f691dd83f62cf3b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 zcmbR27wQ`j$;jZwP_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= dXCxM+0{I$-I+{8PwF*dp%V?Rub;9D({QzZW7{vep diff --git a/allensdk/internal/brain_observatory/roi_filter.py b/allensdk/internal/brain_observatory/roi_filter.py deleted file mode 100644 index 4ea0cd0e7c..0000000000 --- a/allensdk/internal/brain_observatory/roi_filter.py +++ /dev/null @@ -1,327 +0,0 @@ -import itertools -from six.moves import cPickle -import logging -from allensdk.internal.brain_observatory import roi_filter_utils -import allensdk.internal.brain_observatory.mask_set as mask_set -from allensdk.brain_observatory.roi_masks import create_roi_mask_array - -try: - from sklearn.model_selection import cross_val_score -except ImportError: - from sklearn.cross_validation import cross_val_score -from sklearn import __version__ as sklearn_version -import numpy as np -import pandas as pd - - -class ROIClassifier(object): - '''Wrapper for machine learning classifier. - - Provides an underlying classifier model implementing `fit`, - `score`, and `predict`. Tracks additional information for - constructing the feature array from input datastreams, as well - as training data used and cross validation scores generated. - - Parameters - ---------- - model_data : dictionary - Dictionary of classifier properties - `sklearn_version`: Version of sklearn used for training. - `model`: Underlying classifier. - `training_features`: Feature set used to train model. - `training_labels`: Label set used to train model. - `trimmed_features`: Features to remove from input data. - `structure_ids`: Structure ID set used for training. - `drivers`: Driver set used for training. - `reporters`: Reporter set used for training. - `other_appended_labels`: Labels appended outside model. - `cross_validation_scores`: Cross validation if generated. - ''' - def __init__(self, model_data=None): - '''Constructor.''' - if model_data is None: - model_data = {} - self.sklearn_version = sklearn_version - model_sklearn = model_data.get("sklearn_version", None) - if sklearn_version != model_sklearn: - logging.warning("Using sklearn %s, model trained using %s", - sklearn_version, model_sklearn) - self.model = model_data.get("model", None) - self.training_features = model_data.get("training_features", - pd.DataFrame()) - self.training_labels = model_data.get("training_labels", - pd.DataFrame()) - self.trimmed_features = model_data.get("trimmed_features", []) - self.structure_ids = model_data.get("structure_ids", []) - self.drivers = model_data.get("drivers", []) - self.reporters = model_data.get("reporters", []) - self.other_appended_labels = model_data.get("other_appended_labels", - []) - # this is a harsh score for multilabel because it requires ALL - # labels predicted - self.cross_validation_scores = model_data.get( - "cross_validation_scores", None) - self.unexpected_features = [] - - @property - def model_data(self): - '''The classifier properties as a dictionary.''' - data = {"model": self.model, - "training_features": self.training_features, - "training_labels": self.training_labels, - "trimmed_features": self.trimmed_features, - "structure_ids": self.structure_ids, - "drivers": self.drivers, - "reporters": self.reporters, - "other_appended_labels": self.other_appended_labels, - "sklearn_version": self.sklearn_version, - "cross_validation_scores": self.cross_validation_scores} - return data - - @property - def label_names(self): - '''Return label names for the classifier.''' - return self.training_labels.columns - - def create_feature_array(self, object_data, depth, structure_id, drivers, - reporters): - '''Creates feature array from input data. - - See Also - -------- - create_feature_array : Create a feature array given model and inputs - ''' - features = create_feature_array(self.model_data, object_data, depth, - structure_id, drivers, reporters) - - def get_labels(self, object_data, depth, structure_id, drivers, - reporters): - '''Generate labels from input data. - - See Also - -------- - ROIClassifier.create_feature_array - ''' - features = create_feature_array(self.model_data, object_data, depth, - structure_id, drivers, reporters) - self.unexpected_features = get_unexpected_features( - self.model_data, object_data, structure_id, drivers, reporters) - return self.predict(features) - - def fit(self, features, labels): - '''Fit model to data. - - Parameters - ---------- - features : pandas.DataFrame - Training feature set. - labels : pandas.DataFrame - Training labels. - ''' - self.training_features = features - self.training_labels = labels - self.model.fit(features, labels) - - def score(self, features, labels): - '''Calculate classifier score on data.''' - return self.model.score(features, labels) - - def predict(self, features): - '''Generate classification labels given features.''' - return self.model.predict(features) - - def cross_validate(self, features, labels, n_folds=5, n_jobs=1): - '''Generate cross-validation scores for the classifier. - - Parameters - ---------- - features : pandas.DataFrame - Set of features for classification. - labels : pandas.DataFrame - Set of ground truth labels for training and evaluation. - n_folds : int - Number of folds for K-Fold cross-validation. - n_jobjs : int - Number of CPUs to use. - - Returns - ------- - numpy.ndarray - `n_folds` cross-validation scores. - ''' - self.cross_validation_scores = cross_val_score( - self.model, features, labels, cv=n_folds, n_jobs=n_jobs) - return self.cross_validation_scores - - def save(self, filename): - '''Save the classifier to file by pickling.''' - with open(filename, "wb") as f: - cPickle.dump(self.model_data, f) - - @staticmethod - def from_file(filename): - '''Load an ROIClassifier from file.''' - with open(filename, "rb") as f: - return ROIClassifier(cPickle.load(f)) - - -def mean_gray_to_sigma(meanInt0, snpoffsetstdv): - '''Calculate intensity variation used in prior code. - - Parameters - ---------- - meanInt0 : pandas.Series - Array of intensity averages. - snpoffsetstdv : pandas.Series - Array of soma-neuropil standard deviations. - - Returns - ------- - pandas.Series - meanInt0/snpoffsetstdv, preventing Inf (returns as 0). - ''' - mean_gray_to_sigma = meanInt0 / snpoffsetstdv.astype(float) - mean_gray_to_sigma[snpoffsetstdv == 0.0] = 0 - return mean_gray_to_sigma - - -def create_feature_array(model_data, object_data, depth, structure_id, - drivers, reporters): - '''Create feature array from input data. - - This creates the feature array with column ordering matching what - the classifier was trained on. - - Parameters - ---------- - model_data : dictionary - Dictionary containing information about the machine learning - model and training set. - object_data : pandas.DataFrame - Object list data. - depth : float - Imaging depth of the experiment. - structure_id : string - Targeted structure id. - drivers : list - List of drivers for the mouse. - reporters : list - List of reporters for the mouse. - ''' - training_features = model_data["training_features"].columns - if np.isnan(depth): - depth = 0 - meanGrayToSigma = mean_gray_to_sigma( - object_data["meanInt0"], object_data["snpoffsetstdv"]) - features = pd.DataFrame() - for column in training_features: - if column == "depth": - features[column] = depth - # special case that isn't in object list - elif column == "meanGrayToSigma": - features[column] = meanGrayToSigma - elif column in model_data["structure_ids"]: - features[column] = int(structure_id == column) - elif column in model_data["drivers"]: - features[column] = int(column in drivers) - elif column in model_data["reporters"]: - features[column] = int(column in reporters) - elif column in object_data.columns: - features[column] = object_data[column] - else: - logging.error("Feature %s missing from input data", column) - raise KeyError( - "Feature {} missing from input data".format(column)) - return features - - -def get_unexpected_features(model_data, object_data, structure_id, drivers, - reporters): - '''Get list of incoming features that weren't in traning data. - - Parameters - ---------- - model_data : dictionary - Dictionary containing information about the machine learning - model and training set. - object_data : pandas.DataFrame - Object list data. - structure_id : string - Targeted structure id. - drivers : list - List of drivers for the mouse. - reporters : list - List of reporters for the mouse. - ''' - training_features = model_data["training_features"].columns - trimmed_features = model_data["trimmed_features"] - inputs = list(itertools.chain(object_data.columns, [structure_id], - drivers, reporters)) - unexpected_features = [] - for feature in inputs: - if (feature not in training_features) and \ - (feature not in trimmed_features): - unexpected_features.append(feature) - return unexpected_features - - -def label_unions_and_duplicates(rois, overlap_threshold): - '''Detect unions and duplicates and label ROIs.''' - masks = create_roi_mask_array(rois) - valid_masks = np.ones(masks.shape[0]).astype(bool) - ms = mask_set.MaskSet(masks=masks) - - # detect and label duplicates - duplicates = ms.detect_duplicates(overlap_threshold) - for duplicate in duplicates: - index = duplicate[0] - if "duplicate" not in rois[index].labels: - rois[index].labels.append("duplicate") - valid_masks[index] = False - - # detect and label unions only for remaining valid masks - valid_idxs = np.where(valid_masks) - ms = mask_set.MaskSet(masks=masks[valid_idxs].astype(bool)) - unions = ms.detect_unions() - - if unions: - union_idxs = list(unions.keys()) - idxs = valid_idxs[0][union_idxs] - for idx in idxs: - if "union" not in rois[idx].labels: - rois[idx].labels.append("union") - return rois - - -def apply_labels(rois, label_array, label_names): - '''Apply labels to rois. - - Parameters - ---------- - rois : list - List of RoiMask objects sorted to `label_array` order. - label_array : numpy.ndarray - Label array output from classifier. - label_names : list - Names to apply to columns of `label_array`. - - Returns - ------- - list - List of ROIs with labels appended. - ''' - label_df = pd.DataFrame(data=label_array, columns=label_names) - label_lists = label_df.apply(_column_match).apply( - _compress_to_list, args=(label_df.columns,), axis=1) - for i, roi in enumerate(rois): - roi.labels.extend(label_lists[i]) - return rois - - -def _column_match(column): - return column == 1 - - -def _compress_to_list(row, names): - '''Get names that have value 1 in row.''' - return list(names[row.values]) diff --git a/allensdk/internal/brain_observatory/roi_filter_utils.py b/allensdk/internal/brain_observatory/roi_filter_utils.py deleted file mode 100644 index 0cb0fb5dec..0000000000 --- a/allensdk/internal/brain_observatory/roi_filter_utils.py +++ /dev/null @@ -1,302 +0,0 @@ -import os -import json -import logging -import scipy.ndimage.measurements as measurements -from scipy.spatial import cKDTree -from allensdk.brain_observatory.roi_masks import create_roi_mask -import pandas as pd -import numpy as np - -CRITERIA_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "resources", - "roi_filter_training_criteria.json") -_CRITERIA = None - - -def CRITERIA(): - global _CRITERIA - if _CRITERIA is None: - with open(CRITERIA_FILE, "r") as f: - _CRITERIA = json.load(f) - return _CRITERIA - - -class TrainingLabelClassifier(object): - '''Very basic threshold_based classifier. - - Has a decision function that is just the number of distinct - criteria met by the classifier. Criteria are defined as a list - of strings used with pandas.DataFrame.eval. - - Parameters - ---------- - criteria : list - List of evaluation strings. - ''' - def __init__(self, criteria): - '''Constructor.''' - if criteria is None: - self.criteria = [] - else: - self.criteria = criteria - - def decision_function(self, X): - '''Get the distance from the decision boundary. - - Parameters - ---------- - X : array-like - Features for each ROI. - - Returns - ------- - T : array-like - Distance for each sample from the decision boundary. - ''' - T = np.zeros((X.shape[0],), dtype=int) - for crit in self.criteria: - T[X.eval(crit).as_matrix()] += 1 - return T - - -class TrainingMultiLabelClassifier(object): - '''Multilabel classifier using groups of TrainingLabelClassifiers. - - This was used to generate labeling for training the original SVM - for classification. - - Parameters - ---------- - criteria : dictionary - Label names and criteria for each label. - ''' - def __init__(self, criteria=None): - '''Constructor.''' - if criteria is None: - criteria = CRITERIA() - i = 0 - self.labels = sorted(criteria.keys()) - self._codes = {} - self._classifiers = {} - for label in self.labels: - label_criteria = criteria[label] - self._codes[label] = 2**i - self._classifiers[2**i] = TrainingLabelClassifier(label_criteria) - i += 1 - - def _labels_as_columns(self, label_codes): - '''Convert label series to boolean columns for each label. - - Parameters - ---------- - label_codes : pandas.Series - Label codes. - - Returns - ------- - pandas.DataFrame - Dataframe where each column is a label, and values are - True for labeled or False otherwise. - ''' - output = pd.DataFrame() - for name in self.labels: - number = self._codes[name] - output[name] = (label_codes & number) > 0 - return output - - def _map_code_to_list(self, label_code): - output = [] - for name in self.labels: - number = self._codes[name] - if (label_code & number) > 0: - output.append(name) - return output - - def get_eXcluded(self, X): - '''Get the calculated value of the eXcluded column. - - This is useful for comparison with the original classifier - implementation. - - Parameters - ---------- - X : pandas.DataFrame - Object features from the object list file. - - Returns - ------- - numpy.ndarray - Calculated eXcluded score from the classifier. - ''' - eXcluded = np.zeros((X.shape[0],), dtype=X["eXcluded"].dtype) - for classifier in self._classifiers.values(): - eXcluded += classifier.decision_function(X) - # match the object list values - eXcluded[eXcluded > 0] += 10 - eXcluded[X["eXcluded"] == 1] = 1 - eXcluded[X["eXcluded"] == 2] = 2 - return eXcluded.as_matrix() - - def label_data(self, X, as_columns=True): - '''Generate labels for each row in X. - - Parameters - ---------- - X : pandas.DataFrame - Object features from the object list file. - - Returns - ------- - numpy.ndarray - Array of label codes representing the combination of labels - found for each row. - ''' - labels = np.zeros((X.shape[0],), dtype=int) - for label, classifier in self._classifiers.items(): - labels[classifier.decision_function(X) > 0] += label - if as_columns: - return self._labels_as_columns(labels) - else: - return pd.Series(labels).apply(self._map_code_to_list) - - -def calculate_max_border(motion_df, max_shift): - '''Calculate motion boundary from frame offsets. - - When the motion correction algorithm fails to find sufficient - matches, it generates very large frame offsets. The use of - `max_shift` avoids filtering too many cells due to the large - offsets, with the tradeoff that those frames will be noise. - - Parameters - ---------- - motion_df : pandas.DataFrame - Dataframe containing the x, y offsets from motion correction. - max_shift : float - Maximum shift to allow when considering motion correction. Any - larger shifts are considered outliers. - - Returns - ------- - list - [right_shift, left_shift, down_shift, up_shift] - ''' - # strip outliers - x_no_outliers = motion_df["x"][(motion_df["x"] >= -max_shift) - & (motion_df["x"] <= max_shift)] - y_no_outliers = motion_df["y"][(motion_df["y"] >= -max_shift) - & (motion_df["y"] <= max_shift)] - - right_shift = np.max(-1*x_no_outliers.min(), 0) - left_shift = np.max(x_no_outliers.max(), 0) - down_shift = np.max(-1*y_no_outliers.min(), 0) - up_shift = np.max(y_no_outliers.max(), 0) - - border = [right_shift, left_shift, down_shift, up_shift] - - if np.any(np.isnan(np.array(border))): - raise ValueError("Motion correction failed.") - - return border - - -def order_rois_by_object_list(object_data, rois): - '''Reorder rois by matching bounding boxes to object list. - - Parameters - ---------- - object_data : pandas.DataFrame - Object list data. - rois : list - List of RoiMasks. - - Returns - ------- - list - The list of rois reordered to index the same as object_data. - ''' - object_points = object_data[["minx", - "miny", - "maxx", - "maxy", - "area"]].copy() - object_points["maxx"] += 1 - object_points["maxy"] += 1 - roi_points = [] - for roi in rois: - roi_points.append([roi.x, roi.y, roi.x+roi.width, roi.y+roi.height, - roi.mask.sum()]) - reorder_index = get_indices_by_distance(object_points, - np.array(roi_points)) - multi_mapped = set() - if len(set(reorder_index)) != reorder_index.shape[0]: - unique, counts = np.unique(reorder_index, return_counts=True) - multi_mapped = set(unique[counts > 1]) - not_mapped = set(np.setdiff1d(np.arange(reorder_index.shape[0]), - reorder_index)) - logging.warning("ROIs don't uniquely map to object_list") - for idx in (multi_mapped | not_mapped): - logging.warning( - "%s has ambiguous mapping to object list" % rois[idx].label) - out_rois = [] - for i in reorder_index: - roi = rois[i] - if i in multi_mapped: - roi.labels.append("duplicate") - out_rois.append(roi) - return out_rois - - -def get_rois(segmentation_stack, border=None): - '''Extract a list of rois from the segmentation data array. - - Parameters - ---------- - segmentation_stack : numpy.ndarray - The array from the maxInt_masks file showing the object masks. - border : list - [right_shift, left_shift, down_shift, up_shift] bounding box - determined from motion correction. - - Returns - ------- - list - List of RoiMask objects. - ''' - rois = [] - if border is None: - border = [0, 0, 0, 0] - height = segmentation_stack.shape[1] - width = segmentation_stack.shape[2] - for i in range(segmentation_stack.shape[0]): - page = segmentation_stack[i, :, :] - label_mask, num_labels = measurements.label( - page, structure=[[1, 1, 1], [1, 1, 1], [1, 1, 1]]) - for label in range(1, num_labels + 1): - img_mask = label_mask == label - mask = create_roi_mask(width, height, border, - roi_mask=img_mask, - label="ROI {}:{}".format(i, label), - mask_group=i) - mask.labels = [] - if mask.overlaps_motion_border: - mask.labels.append("motion_border") - rois.append(mask) - return rois - - -def get_indices_by_distance(object_list_points, mask_points): - '''Find indices of nearest neighbor matches. - - Require a distance of 0 (perfect match) and a unique match between - masks and object_list entries. - ''' - if np.array(mask_points).ndim != 2: - raise ValueError("number of dimensions is incorrect. Expected 2 " - f"got {np.array(mask_points).ndim}") - tree = cKDTree(mask_points) - distance, indices = tree.query(object_list_points) - if distance.max() > 0: - logging.error("An ROI did not match object list exactly.") - raise AssertionError("Max match distance greater than 0") - return indices diff --git a/allensdk/internal/brain_observatory/run_itracker.py b/allensdk/internal/brain_observatory/run_itracker.py deleted file mode 100644 index 2892c814eb..0000000000 --- a/allensdk/internal/brain_observatory/run_itracker.py +++ /dev/null @@ -1,189 +0,0 @@ -import argparse -import allensdk.internal.core.lims_utilities as lu -import glob -import time -import shutil -import logging -from allensdk.config.manifest import Manifest -from allensdk.internal.brain_observatory.itracker import iTracker -from allensdk.internal.brain_observatory.frame_stream import FfmpegInputStream, FfmpegOutputStream -import h5py -import ast -import sys -import numpy as np - -DEFAULT_THRESHOLD_FACTOR = 1.6 - -if sys.platform=='linux2': - FFMPEG_BIN = "/shared/utils.x86_64/ffmpeg/bin/ffmpeg" -elif sys.platform=='darwin': - FFMPEG_BIN = "/usr/local/bin/ffmpeg" - -def compute_bounding_box(points): - if not points: - return None - points = np.array(points) - return [ points[:,0].min(), points[:,0].max(), - points[:,1].min(), points[:,1].max() ] - -def get_polygon(experiment_id, group_name): - query = """ -select ago.* from avg_graphic_objects ago -join avg_graphic_objects pago on pago.id = ago.parent_id -join avg_group_labels agl on pago.group_label_id = agl.id -join sub_images si on si.id = pago.sub_image_id -join specimens sp on sp.id = si.specimen_id -join ophys_sessions os on os.specimen_id = sp.id -where agl.name = '%s' -and os.id = %d -""" % (group_name, experiment_id) - - try: - path = np.array([ int(v) for v in lu.query(query)[0]['path'].split(',') ]) - except KeyError as e: - return [] - except IndexError as e: - return [] - - points = path.reshape((len(path)/2, 2)) - - return points - -def get_experiment_info(experiment_id): - logging.info("Downloading paths/metadata for experiment ID: %d", experiment_id) - query = "select storage_directory, id from ophys_sessions where id = "+str(experiment_id) - - storage_directory = lu.query(query)[0]['storage_directory'] - logging.info("\tStorage directory: %s", storage_directory) - - movie_file = glob.glob(storage_directory+'*video-1.avi')[0] - metadata_file = glob.glob(storage_directory+'*video-1.h5')[0] - - cr_points = get_polygon(experiment_id, 'Corneal Reflection Bounding Box') - pupil_points = get_polygon(experiment_id, 'Pupil Bounding Box') - - logging.info("\tmovie file: %s", movie_file) - logging.info("\tmetadata file: %s", metadata_file) - - return dict(movie_file=movie_file, - metadata_file=metadata_file, - corneal_reflection_points=cr_points, - pupil_points=pupil_points) - -def get_movie_shape_from_metadata(metadata_file): - with h5py.File(metadata_file, "r") as f: - metadata_str = f["video_metadata"].value - metadata = ast.literal_eval(metadata_str) - - # assuming 3 channels - # movie_shape = (metadata['frames'], metadata['height'], metadata['width'], 3) - # in the metadata file from lims, the 'width' and 'height' variables are swapped, - # hopefully this is the same for every single experiment. - movie_shape = (metadata['frames'], metadata['width'], metadata['height'], 3) - logging.info("movie_shape from metadata_file = %s", str(movie_shape)) - - return movie_shape - -def run_itracker(movie_file, output_directory, - output_frames=False, - output_annotation_frames=False, - output_annotated_movie=True, - output_annotated_movie_block_size=1, - estimate_bbox=False, - num_frames=None, - output_QC=True, - image_type='png', - cache_input_frames=False, - input_block_size=1, - metadata_file=None, - movie_shape=None, - **kwargs): - - if output_directory is not None: - Manifest.safe_mkdir(output_directory) - - assert(metadata_file is not None and movie_shape is not None, "Must provide either metadata_file or movie_shape") - - if metadata_file: - movie_shape = get_movie_shape_from_metadata(metadata_file) - - frame_shape = movie_shape[1:] - - if num_frames is None: - num_frames = movie_shape[0] - - - input_stream = FfmpegInputStream(movie_file, frame_shape, - ffmpeg_bin=FFMPEG_BIN, - num_frames=num_frames, - cache_frames=cache_input_frames, - block_size=input_block_size) - - movie_output_stream = FfmpegOutputStream(frame_shape, - block_size=output_annotated_movie_block_size, - ffmpeg_bin=FFMPEG_BIN) if output_annotated_movie else None - - itracker = iTracker(output_directory, input_stream=input_stream, - im_shape=(movie_shape[1], movie_shape[2]), - num_frames=num_frames, - **kwargs) - - # open this early to avoid duplicating massive memory - movie_output_stream.open(itracker.annotated_movie_file) - - itracker.set_movie(movie_file) - - itracker.mean_frame = itracker.compute_mean_frame() - - if estimate_bbox: - bbox_pupil, bbox_cr = itracker.estimate_bbox_from_mean_frame() - - - itracker.process_movie(movie_output_stream=movie_output_stream, - output_frames=output_frames, - output_annotation_frames=output_annotation_frames) - - if output_QC: - itracker.output_QC(image_type=image_type) - - return itracker - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--experiment_id', default=None, type=int) - parser.add_argument('--movie_file', default=None) - parser.add_argument('--metadata_file', default=None) - parser.add_argument('--output_directory', default='.') - parser.add_argument('--estimate_bbox', action='store_true') - parser.add_argument('--num_frames', default=None, type=int) - parser.add_argument('--threshold_factor', default=DEFAULT_THRESHOLD_FACTOR) - parser.add_argument('--log_level', default=logging.DEBUG) - args = parser.parse_args() - - logging.getLogger().setLevel(args.log_level) - - data = dict( - threshold_factor=args.threshold_factor, - output_directory=args.output_directory, - num_frames=args.num_frames, - estimate_bbox=args.estimate_bbox - ) - - if args.experiment_id: - info = get_experiment_info(args.experiment_id) - - data['movie_file'] = info['movie_file'] - data['metadata_file'] = info['metadata_file'] - - if info.get('pupil_points', None): - data['bbox_pupil'] = compute_bounding_box(info['pupil_points']) - if info.get('corneal_reflection_points', None): - data['bbox_cr'] = compute_bounding_box(info['corneal_reflection_points']) - else: - data['movie_file'] = args.movie_file - data['metadata_file'] = args.metdata_file - - run_itracker(**data) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/brain_observatory/time_sync.py b/allensdk/internal/brain_observatory/time_sync.py deleted file mode 100644 index e191525f2f..0000000000 --- a/allensdk/internal/brain_observatory/time_sync.py +++ /dev/null @@ -1,443 +0,0 @@ -from collections import deque -from typing import Optional, Callable, Any - -import numpy as np -import h5py -from allensdk.brain_observatory.sync_dataset import Dataset -import pandas as pd -import logging -try: - import cv2 -except ImportError: - cv2 = None - -TRANSITION_FRAME_INTERVAL = 60 -REG_PHOTODIODE_INTERVAL = 1.0 # seconds -REG_PHOTODIODE_STD = 0.05 # seconds -PHOTODIODE_ANOMALY_THRESHOLD = 0.5 # seconds -LONG_STIM_THRESHOLD = 0.2 # seconds -MAX_MONITOR_DELAY = 0.07 # seconds - - -def get_keys(sync_dset: Dataset) -> dict: - """ - Gets the correct keys for the sync file by searching the sync file - line labels. Removes key from the dictionary if it is not in the - sync dataset line labels. - Args: - sync_dset: The sync dataset to search for keys within - - Returns: - key_dict: dictionary of key value pairs for finding data in the - sync file - """ - - # key_dict contains key value pairs where key is expected label category - # and value is the possible data for each category existing in sync dataset - # line labels - key_dict = { - "photodiode": ["stim_photodiode", "photodiode"], - "2p": ["2p_vsync"], - "stimulus": ["stim_vsync", "vsync_stim"], - "eye_camera": ["cam2_exposure", "eye_tracking", - "eye_frame_received"], - "behavior_camera": ["cam1_exposure", "behavior_monitoring", - "beh_frame_received"], - "acquiring": ["2p_acquiring", "acq_trigger"], - "lick_sensor": ["lick_1", "lick_sensor"] - } - label_set = set(sync_dset.line_labels) - remove_keys = [] - for key, value in key_dict.items(): - # for each key in the above `key_dict`, this loop - # checks to see if there is a corresponing value in - # the set of line labels present in the sync file (`label_set`) - # If not, the key is added to the `remove_keys` list - value_set = set(value) - diff = value_set.intersection(label_set) - if len(diff) == 1: - key_dict[key] = diff.pop() - else: - remove_keys.append(key) - - # the contents of the `remove_keys` list is printed to the console - # as a user warning - if len(remove_keys) > 0: - logging.warning("Could not find valid lines for the following data " - "sources") - for key in remove_keys: - logging.warning(f"{key} (valid line label(s) = {key_dict[key]}") - key_dict.pop(key) - return key_dict - - -def calculate_monitor_delay(sync_dset, stim_times, photodiode_key, - transition_frame_interval=TRANSITION_FRAME_INTERVAL, # noqa: E501 - max_monitor_delay=MAX_MONITOR_DELAY): - """Calculate monitor delay.""" - transitions = stim_times[::transition_frame_interval] - photodiode_events = get_real_photodiode_events(sync_dset, photodiode_key) - transition_events = photodiode_events[0:len(transitions)] - - delays = transition_events - transitions - delay = np.mean(delays) - logging.info(f"Calculated monitor delay: {delay}. \n " - f"Max monitor delay: {np.max(delays)}. \n " - f"Min monitor delay: {np.min(delays)}.\n " - f"Std monitor delay: {np.std(delays)}.") - - if delay < 0 or delay > max_monitor_delay: - raise ValueError(f"Delay ({delay}s) falls outside expected value " - f"range (0-{MAX_MONITOR_DELAY}s).") - return delay - - -def _find_last_n(arr: np.ndarray, n: int, - cond: Callable[[Any], bool]) -> Optional[int]: - """ - Find the final index where the prior `n` values in an array meet - the condition `cond` (inclusive). - Parameters - ========== - arr: numpy.1darray - n: int - cond: Callable that returns True if condition is met, False - otherwise. Should be able to be applied to the array elements - without any additional arguments. - """ - reversed_ix = _find_n(arr[::-1], n, cond) - if reversed_ix is not None: - reversed_ix = len(arr) - reversed_ix - 1 - return reversed_ix - - -def _find_n(arr: np.ndarray, n: int, - cond: Callable[[Any], bool]) -> Optional[int]: - """ - Find the index where the next `n` values in an array meet the - condition `cond` (inclusive). - Parameters - ========== - arr: numpy.1darray - n: int - cond: Callable that returns True if condition is met, False - otherwise. Should be able to be applied to the array elements - without any additional arguments. - """ - if len(arr) < n: - return None - queue = deque(np.apply_along_axis(cond, 0, arr[:n]), maxlen=n) - i = 0 - while queue.count(True) < n: - try: - i += 1 - queue.append(cond(arr[i+n-1])) - except IndexError: - return None - return i - - -def get_photodiode_events(sync_dset, photodiode_key): - """Returns the photodiode events with the start/stop indicators and - the window init flash stripped off. These transitions occur roughly - ~1.0s apart, since the sync square changes state every N frames - (where N = 60, and frame rate is 60 Hz). Because there are no - markers for when the first transition of this type started, we - estimate based on the event intervals. For the first valid event, - find the first two events that both meet the following criteria: - The next event occurs ~1.0s later - First the last valid event, find the first two events that both meet - the following criteria: - The last valid event occured ~1.0s before - """ - all_events = sync_dset.get_events_by_line(photodiode_key, units="seconds") - all_events_diff = np.ediff1d(all_events, to_begin=0, to_end=0) - all_events_diff_prev = all_events_diff[:-1] - all_events_diff_next = all_events_diff[1:] - min_interval = REG_PHOTODIODE_INTERVAL - REG_PHOTODIODE_STD - max_interval = REG_PHOTODIODE_INTERVAL + REG_PHOTODIODE_STD - if not len(all_events): - raise ValueError("No photodiode events found. Please check " - "the input data for errors. ") - first_valid_index = _find_n( - all_events_diff_next, 2, - lambda x: (x >= min_interval) & (x <= max_interval)) - last_valid_index = _find_last_n( - all_events_diff_prev, 2, - lambda x: (x >= min_interval) & (x <= max_interval)) - if first_valid_index is None: - raise ValueError("Can't find valid start event") - if last_valid_index is None: - raise ValueError("Can't find valid end event") - pd_events = all_events[first_valid_index:last_valid_index+1] - return pd_events - - -def get_real_photodiode_events(sync_dset, photodiode_key, - anomaly_threshold=PHOTODIODE_ANOMALY_THRESHOLD): - """Gets the photodiode events with the anomalies removed.""" - events = get_photodiode_events(sync_dset, photodiode_key) - anomalies = np.where(np.diff(events) < anomaly_threshold) - return np.delete(events, anomalies) - - -def get_alignment_array(ref, other, int_method=np.floor): - """Generate an alignment array """ - return int_method(np.interp(other, ref, np.arange(len(ref)), left=np.nan, - right=np.nan)) - - -def get_video_length(filename): - if cv2 is not None: - try: - capture = cv2.VideoCapture(filename) - return int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) - except AttributeError: - logging.warning("Could not get length for %s, opencv out of date", - filename) - else: - logging.warning("Could not get length for %s", filename) - - -def get_ophys_data_length(filename): - with h5py.File(filename, "r") as f: - return f["data"].shape[1] - - -def get_stim_data_length(filename: str) -> int: - """Get stimulus data length from .pkl file. - - Parameters - ---------- - filename : str - Path of stimulus data .pkl file. - - Returns - ------- - int - Stimulus data length. - """ - stim_data = pd.read_pickle(filename) - - # A subset of stimulus .pkl files do not have the "vsynccount" field. - # MPE *won't* be backfilling the "vsynccount" field for these .pkl files. - # So the least worst option is to recalculate the vsync_count. - try: - vsync_count = stim_data["vsynccount"] - except KeyError: - vsync_count = len(stim_data["items"]["behavior"]["intervalsms"]) + 1 - - return vsync_count - - -def corrected_video_timestamps(video_name, timestamps, data_length): - delta = 0 - if data_length is not None: - delta = len(timestamps) - data_length - if delta != 0: - logging.info("%s data of length %s has timestamps of length " - "%s", video_name, data_length, len(timestamps)) - else: - logging.info("No data length provided for %s", video_name) - - return timestamps, delta - - -class OphysTimeAligner(object): - def __init__(self, sync_file, scanner=None, dff_file=None, - stimulus_pkl=None, eye_video=None, behavior_video=None, - long_stim_threshold=LONG_STIM_THRESHOLD): - self.scanner = scanner if scanner is not None else "SCIVIVO" - self._dataset = Dataset(sync_file) - self._keys = get_keys(self._dataset) - self.long_stim_threshold = long_stim_threshold - - self._monitor_delay = None - self._clipped_stim_ts_delta = None - self._clipped_stim_timestamp_values = None - - if dff_file is not None: - self.ophys_data_length = get_ophys_data_length(dff_file) - else: - self.ophys_data_length = None - if stimulus_pkl is not None: - self.stim_data_length = get_stim_data_length(stimulus_pkl) - else: - self.stim_data_length = None - if eye_video is not None: - self.eye_data_length = get_video_length(eye_video) - else: - self.eye_data_length = None - if behavior_video is not None: - self.behavior_data_length = get_video_length(behavior_video) - else: - self.behavior_data_length = None - - @property - def dataset(self): - return self._dataset - - @property - def ophys_timestamps(self): - """Get the timestamps for the ophys data.""" - ophys_key = self._keys["2p"] - if self.scanner == "SCIVIVO": - # Scientifica data looks different than Nikon. - # http://confluence.corp.alleninstitute.org/display/IT/Ophys+Time+Sync - times = self.dataset.get_rising_edges(ophys_key, units="seconds") - elif self.scanner == "NIKONA1RMP": - # Nikon has a signal that indicates when it started writing to disk - acquiring_key = self._keys["acquiring"] - acquisition_start = self._dataset.get_rising_edges( - acquiring_key, units="seconds")[0] - ophys_times = self._dataset.get_falling_edges( - ophys_key, units="seconds") - times = ophys_times[ophys_times >= acquisition_start] - else: - raise ValueError("Invalid scanner: {}".format(self.scanner)) - - return times - - @property - def corrected_ophys_timestamps(self): - times = self.ophys_timestamps - - delta = 0 - if self.ophys_data_length is not None: - if len(times) < self.ophys_data_length: - raise ValueError( - "Got too few timestamps ({}) for ophys data length " - "({})".format(len(times), self.ophys_data_length)) - elif len(times) > self.ophys_data_length: - logging.info("Ophys data of length %s has timestamps of " - "length %s, truncating timestamps", - self.ophys_data_length, len(times)) - delta = len(times) - self.ophys_data_length - times = times[:-delta] - else: - logging.info("No data length provided for ophys stream") - - return times, delta - - @property - def stim_timestamps(self): - stim_key = self._keys["stimulus"] - - return self.dataset.get_falling_edges(stim_key, units="seconds") - - def _get_clipped_stim_timestamps(self): - timestamps = self.stim_timestamps - - delta = 0 - if self.stim_data_length is not None and \ - self.stim_data_length < len(timestamps): - stim_key = self._keys["stimulus"] - rising = self.dataset.get_rising_edges(stim_key, units="seconds") - - # Some versions of camstim caused a spike when the DAQ is first - # initialized. Remove it. - if rising[1] - rising[0] > self.long_stim_threshold: - logging.info("Initial DAQ spike detected from stimulus, " - "removing it") - timestamps = timestamps[1:] - - delta = len(timestamps) - self.stim_data_length - if delta != 0: - logging.info("Stim data of length %s has timestamps of " - "length %s", - self.stim_data_length, len(timestamps)) - elif self.stim_data_length is None: - logging.info("No data length provided for stim stream") - - return timestamps, delta - - @property - def clipped_stim_timestamps(self): - """ - Return the stimulus timestamps with the erroneous initial spike - removed (if relevant) - - Returns - ------- - timestamps: np.ndarray - An array of stimulus timestamps in seconds with th emonitor delay - added - - delta: int - Difference between the length of timestamps - and the number of frames reported in the stimulus - pickle file, i.e. - len(timestamps) - len(pkl_file['items']['behavior']['intervalsms'] - """ - if self._clipped_stim_ts_delta is None: - (self._clipped_stim_timestamp_values, - self._clipped_stim_ts_delta) = self._get_clipped_stim_timestamps() - - return (self._clipped_stim_timestamp_values, - self._clipped_stim_ts_delta) - - def _get_monitor_delay(self): - timestamps, delta = self.clipped_stim_timestamps - photodiode_key = self._keys["photodiode"] - delay = calculate_monitor_delay(self.dataset, - timestamps, - photodiode_key) - return delay - - @property - def monitor_delay(self): - """ - The monitor delay (in seconds) associated with the session - """ - if self._monitor_delay is None: - self._monitor_delay = self._get_monitor_delay() - return self._monitor_delay - - @property - def corrected_stim_timestamps(self): - """ - The stimulus timestamps corrected for monitor delay - - Returns - ------- - timestamps: np.ndarray - An array of stimulus timestamps in seconds with th emonitor delay - added - - delta: int - Difference between the length of timestamps and - the number of frames reported in the stimulus - pickle file, i.e. - len(timestamps) - len(pkl_file['items']['behavior']['intervalsms'] - - delay: float - The monitor delay in seconds - """ - timestamps, delta = self.clipped_stim_timestamps - delay = self.monitor_delay - - return timestamps + delay, delta, delay - - @property - def behavior_video_timestamps(self): - key = self._keys["behavior_camera"] - - return self.dataset.get_falling_edges(key, units="seconds") - - @property - def corrected_behavior_video_timestamps(self): - return corrected_video_timestamps("Behavior video", - self.behavior_video_timestamps, - self.behavior_data_length) - - @property - def eye_video_timestamps(self): - key = self._keys["eye_camera"] - - return self.dataset.get_falling_edges(key, units="seconds") - - @property - def corrected_eye_video_timestamps(self): - return corrected_video_timestamps("Eye video", - self.eye_video_timestamps, - self.eye_data_length) diff --git a/allensdk/internal/core/__init__.py b/allensdk/internal/core/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/core/lims_pipeline_module.py b/allensdk/internal/core/lims_pipeline_module.py deleted file mode 100644 index 2acb98fd0b..0000000000 --- a/allensdk/internal/core/lims_pipeline_module.py +++ /dev/null @@ -1,125 +0,0 @@ -import logging -import argparse -import subprocess -import os -import errno - -import allensdk.core.json_utilities as ju -from allensdk.config.manifest import Manifest - -SHARED_PYTHON = "/shared/utils.x86_64/python-2.7/bin/python" -SHARED_SDK = "/shared/bioapps/infoapps/lims2_modules/lib/allensdk" -RUN_PYTHON = "/shared/bioapps/infoapps/lims2_modules/lib/python/run_python.sh" - -class PipelineModule( object ): - def __init__(self, description="", parser=None): - if parser is None: - self.parser = default_argument_parser(description) - else: - self.parser = parser - - self._args = None - - @property - def args(self): - if self._args is None: - self._args = self.parser.parse_args() - logging.basicConfig(level=self.args.log_level, format="%(asctime)s:%(levelname)s:%(message)s") - - return self._args - - def input_data(self): - try: - return ju.read(self.args.input_json) - except Exception as e: - logging.error("could not read input json: %s", self.args.input_json) - raise e - - def write_output_data(self, data): - try: - ju.write(self.args.output_json, data) - except Exception as e: - logging.error("could not write output json: %s", self.args.output_json) - raise e - - -def default_argument_parser(description=""): - parser = argparse.ArgumentParser(description) - parser.add_argument('input_json') - parser.add_argument('output_json') - parser.add_argument('--log-level', default=logging.DEBUG) - - return parser - - -def run_module(module, input_data, storage_directory, - optional_args=None, - python=SHARED_PYTHON, - sdk_path=SHARED_SDK, - local=False, - pbs=None): - - PBS_TEMPLATE=""" - export PYTHONPATH=%(sdk_path)s:$PYTHONPATH - PYTHON=%(python)s - SCRIPT="%(module)s" - $PYTHON $SCRIPT %(optional_args)s %(input_json)s %(output_json)s - """ - - if optional_args is None: - optional_args = [] - - input_json = os.path.join(storage_directory, "input.json") - output_json = os.path.join(storage_directory, "output.json") - pbs_file = os.path.join(storage_directory, "run.pbs") - - Manifest.safe_mkdir(storage_directory) - - pbs_headers = [ ('-j oe'), - ('-o %s' % os.path.join(storage_directory, "run.log")) ] - pbs = pbs if pbs is not None else {} - - queue = pbs.get('queue', 'braintv') - pbs_headers.append('-q %s' % queue) - - walltime = pbs.get('walltime', '3:00:00') - pbs_headers.append('-l walltime=%s' % walltime) - - vmem = pbs.get('vmem', 16) - pbs_headers.append('-l vmem=%dgb' % vmem) - - if 'job_name' in pbs: - pbs_headers.append('-N %s' % pbs['job_name']) - - if 'ncpus' in pbs: - pbs_headers.append('-l ncpus=%d' % pbs['ncpus']) - - pbs_headers = [ '#PBS %s' % s for s in pbs_headers ] - - with open(pbs_file,"w") as f: - f.write('\n'.join(pbs_headers) + PBS_TEMPLATE % { - "python": python, - "sdk_path": sdk_path, - "module": module, - "input_json": input_json, - "output_json": output_json, - "optional_args": " ".join(optional_args) - }) - - - - ju.write(input_json, input_data) - - if local: - subprocess.call(['sh', pbs_file]) - else: - subprocess.call(['qsub', pbs_file]) - - - - - - - - - diff --git a/allensdk/internal/core/lims_utilities.py b/allensdk/internal/core/lims_utilities.py deleted file mode 100644 index fbdb43aff5..0000000000 --- a/allensdk/internal/core/lims_utilities.py +++ /dev/null @@ -1,194 +0,0 @@ -import os, platform, re, logging -from allensdk.core.json_utilities import read_url_get - -HDF5_FILE_TYPE_ID = 306905526 -NWB_FILE_TYPE_ID = 475137571 -NWB_UNCOMPRESSED_FILE_TYPE_ID = 478840678 -NWB_DOWNLOAD_FILE_TYPE_ID = 481007198 -METHOD_CONFIG_FILE_TYPE_ID = 324440685 -MODEL_PARAMETERS_FILE_TYPE_ID = 329230374 -BIOPHYS_MODEL_PARAMETERS_FILE_TYPE_ID = 329230374 - - -def get_well_known_files_by_type(wkfs, wkf_type_id): - out = [ os.path.join( wkf['storage_directory'], wkf['filename'] ) - for wkf in wkfs - if wkf.get('well_known_file_type_id',None) == wkf_type_id ] - - if len(out) == 0: - raise IOError("Could not find well known files with type %d." % wkf_type_id) - - return out - - -def get_well_known_file_by_type(wkfs, wkf_type_id): - out = get_well_known_files_by_type(wkfs, wkf_type_id) - - nout = len(out) - if nout != 1: - raise IOError("Expected single well known file with type %d. Got %d." % (wkf_type_id, nout)) - - return out[0] - - -def get_well_known_files_by_name(wkfs, filename): - out = [ os.path.join( wkf['storage_directory'], wkf['filename'] ) - for wkf in wkfs - if wkf['filename'] == filename ] - - if len(out) == 0: - raise IOError("Could not find well known files with name %s." % filename) - - return out - -def get_well_known_file_by_name(wkfs, filename): - out = get_well_known_files_by_name(wkfs, filename) - - nout = len(out) - if nout != 1: - raise IOError("Expected single well known file with name %s. Got %d." % (filename, nout)) - - return out[0] - -def append_well_known_file(wkfs, path, wkf_type_id=None, content_type=None): - record = { - 'filename': os.path.basename(path), - 'storage_directory': os.path.dirname(path) - } - - if wkf_type_id is not None: - record['well_known_file_type_id'] = wkf_type_id - - if content_type is not None: - record['content_type'] = content_type - - for wkf in wkfs: - if wkf['filename'] == record['filename']: - logging.debug("found existing well known file record for %s, updating", path) - wkf.update(record) - return - - logging.debug("could not find existing well known file record for %s, appending", path) - wkfs.append(record) - -def _connect(user="limsreader", host="limsdb2", database="lims2", password="limsro", port=5432): - import pg8000 - - conn = pg8000.connect(user=user, host=host, database=database, password=password, port=port) - return conn, conn.cursor() - -def _select(cursor, query): - cursor.execute(query) - columns = [ d[0].decode("utf-8") for d in cursor.description ] - return [ dict(zip(columns, c)) for c in cursor.fetchall() ] - -def select(cursor, query): - raise DeprecationWarning("lims_utilities.select is deprecated. Please use lims_utilities.query instead.") - -def connect(user="limsreader", host="limsdb2", database="lims2", password="limsro", port=5432): - raise DeprecationWarning("lims_utilities.connect is deprecated. Please use lims_utilities.query instead.") - -def query(query, user="limsreader", host="limsdb2", database="lims2", password="limsro", port=5432): - conn, cursor = _connect(user, host, database, password, port) - - # Guard against non-ascii characters in query - query = ''.join([i if ord(i) < 128 else ' ' for i in query]) - - try: - results = _select(cursor, query) - finally: - cursor.close() - conn.close() - return results - -def safe_system_path(file_name): - if platform.system() == "Windows": - return linux_to_windows(file_name) - else: - return convert_from_titan_linux(os.path.normpath(file_name)) - -def convert_from_titan_linux(file_name): - # Lookup table mapping project to program - project_to_program= { - "neuralcoding": "braintv", - '0378': "celltypes", - 'conn': "celltypes", - 'ctyconn': "celltypes", - 'humancelltypes': "celltypes", - 'mousecelltypes': "celltypes", - 'shotconn': "celltypes", - 'synapticphys': "celltypes", - 'whbi': "celltypes", - 'wijem': "celltypes" - } - # Tough intermediary state where we have old paths - # being translated to new paths - m = re.match('/projects/([^/]+)/vol1/(.*)', file_name) - if m: - newpath = os.path.normpath(os.path.join( - '/allen', - 'programs', - project_to_program.get(m.group(1),'undefined'), - 'production', - m.group(1), - m.group(2) - )) - return newpath - return file_name - -def linux_to_windows(file_name): - # Lookup table mapping project to program - project_to_program= { - "neuralcoding": "braintv", - '0378': "celltypes", - 'conn': "celltypes", - 'ctyconn': "celltypes", - 'humancelltypes': "celltypes", - 'mousecelltypes': "celltypes", - 'shotconn': "celltypes", - 'synapticphys': "celltypes", - 'whbi': "celltypes", - 'wijem': "celltypes" - } - - # Simple case for new world order - m = re.match('/allen', file_name) - if m: - return "\\" + file_name.replace('/','\\') - - # /data/ paths are being retained (for now) - # this will need to be extended to map directories to - # /allen/{programs,aibs}/workgroups/foo - m = re.match('/data/([^/]+)/(.*)', file_name) - if m: - return os.path.normpath(os.path.join('\\\\aibsdata', m.group(1), m.group(2))) - - # Tough intermediary state where we have old paths - # being translated to new paths - m = re.match('/projects/([^/]+)/vol1/(.*)', file_name) - if m: - newpath = os.path.normpath(os.path.join( - '\\\\allen', - 'programs', - project_to_program.get(m.group(1),'undefined'), - 'production', - m.group(1), - m.group(2) - )) - return newpath - - # No matches found. Clean up and return path given to us - return os.path.normpath(file_name) - - -def get_input_json(object_id, object_class, strategy_class, host="lims2", - **kwargs): - query_string = ("http://{}/InputJsons?strategy_class={}" - "&object_class={}&object_id={}").format(host, - strategy_class, - object_class, - object_id) - for key, value in kwargs.items(): - query_string += "&{}={}".format(key, value) - - return read_url_get(query_string) diff --git a/allensdk/internal/core/mouse_connectivity_cache_prerelease.py b/allensdk/internal/core/mouse_connectivity_cache_prerelease.py deleted file mode 100644 index d3c229ceda..0000000000 --- a/allensdk/internal/core/mouse_connectivity_cache_prerelease.py +++ /dev/null @@ -1,208 +0,0 @@ -import os -import pandas as pd - -from allensdk.config.manifest import Manifest -from allensdk.core import json_utilities -from allensdk.core.mouse_connectivity_cache import MouseConnectivityCache - -from ..api.queries.mouse_connectivity_api_prerelease \ - import MouseConnectivityApiPrerelease - - -class MouseConnectivityCachePrerelease(MouseConnectivityCache): - """Extends MouseConnectivityCache to use prereleased data from lims. - - Attributes - ---------- - resolution: int - Resolution of grid data to be downloaded when accessing projection volume, - the annotation volume, and the annotation volume. Must be one of (10, 25, - 50, 100). Default is 25. - - api: MouseConnectivityApiPrerelease instance - Used internally to make API queries. - - Parameters - ---------- - resolution: int - Resolution of grid data to be downloaded when accessing projection volume, - the annotation volume, and the annotation volume. Must be one of (10, 25, - 50, 100). Default is 25. - - ccf_version: string - Desired version of the Common Coordinate Framework. This affects the annotation - volume (get_annotation_volume) and structure masks (get_structure_mask). - Must be one of (MouseConnectivityApi.CCF_2015, MouseConnectivityApi.CCF_2016). - Default: MouseConnectivityApi.CCF_2016 - - cache: boolean - Whether the class should save results of API queries to locations specified - in the manifest file. Queries for files (as opposed to metadata) must have a - file location. If caching is disabled, those locations must be specified - in the function call (e.g. get_projection_density(file_name='file.nrrd')). - - manifest_file: string - File name of the manifest to be read. Default is "mouse_connectivity_manifest.json". - - """ - - EXPERIMENTS_PRERELEASE_KEY = 'EXPERIMENTS_PRERELEASE' - STORAGE_DIRECTORIES_PRERELEASE_KEY = 'STORAGE_DIRECTORIES_PRERELEASE' - - # allows user to pass 'male', 'female' instead of only 'm', 'f' - _GENDER_DICT=dict(male='m', female='f') - - def __init__(self, - resolution=None, - cache=True, - manifest_file='mouse_connectivity_manifest_prerelease.json', - ccf_version=None, - version=None, - cache_storage_directories=True, - storage_directories_file_name=None): - - super(MouseConnectivityCachePrerelease, self).__init__( - resolution=resolution, cache=cache, manifest_file=manifest_file, - ccf_version=ccf_version, version=version) - - file_name = self.get_cache_path(storage_directories_file_name, - self.STORAGE_DIRECTORIES_PRERELEASE_KEY) - self.api = MouseConnectivityApiPrerelease( - file_name, cache_storage_directories=cache_storage_directories) - - def get_experiments(self, - dataframe=False, - file_name=None, - cre=None, - injection_structure_ids=None, - age=None, - gender=None, - workflow_state=None, - workflows=None, - project_code=None): - """Read a list of experiments. - - If caching is enabled, this will save the whole (unfiltered) list of - experiments to a file. - - Parameters - ---------- - dataframe: boolean - Return the list of experiments as a Pandas DataFrame. If False, - return a list of dictionaries. Default False. - - file_name: string - File name to save/read the structures table. If file_name is None, - the file_name will be pulled out of the manifest. If caching - is disabled, no file will be saved. Default is None. - """ - file_name = self.get_cache_path(file_name, - self.EXPERIMENTS_PRERELEASE_KEY) - - if os.path.exists(file_name): - experiments = json_utilities.read(file_name) - else: - experiments = self.api.get_experiments() - - if self.cache: - Manifest.safe_make_parent_dirs(file_name) - json_utilities.write(file_name, experiments) - - # filter the read/downloaded list of experiments - experiments = self.filter_experiments(experiments, - cre, - injection_structure_ids, - age, - gender, - workflow_state, - workflows, - project_code) - - if dataframe: - experiments = pd.DataFrame(experiments) - experiments.set_index(['id'], inplace=True, drop=False) - - return experiments - - def filter_experiments(self, - experiments, - cre=None, - injection_structure_ids=None, - age=None, - gender=None, - workflow_state=None, - workflows=None, - project_code=None): - """ - Take a list of experiments and filter them by cre status and injection structure. - - Parameters - ---------- - - cre: boolean or list - If True, return only cre-positive experiments. If False, return only - cre-negative experiments. If None, return all experients. If list, return - all experiments with cre line names in the supplied list. Default None. - - injection_structure_ids: list - Only return experiments that were injected in the structures provided here. - If None, return all experiments. Default None. - - age : list - Only return experiments with specimens with ages provided here. - If None, returna all experiments. Default None. - """ - experiments = super(MouseConnectivityCachePrerelease, self).filter_experiments( - experiments, cre=cre, injection_structure_ids=injection_structure_ids) - - # all kwargs == None base case - conditions = [lambda d: True] - - if age is not None: - age = [a.lower() for a in age] - conditions.append(lambda d: d['age'].lower() in age) - - if gender is not None: - # TODO: pass a string instead of an iterable? - gender = [self._GENDER_DICT.get(g.lower(), g.lower()) for g in gender] - conditions.append(lambda d: d['gender'].lower() in gender) - - if workflow_state is not None: - #workflow_state = map(str.lower, workflow_state) - workflow_state = [ws.lower() for ws in workflow_state] - conditions.append(lambda d: d['workflow_state'].lower() in workflow_state) - - if workflows is not None: - workflows = [w.lower() for w in workflows] - conditions.append(lambda d: any([w.lower() in workflows - for w in d['workflows']])) - - if project_code is not None: - project_code = [pc.lower() for pc in project_code] - conditions.append(lambda d: d['project_code'].lower() in project_code) - - return [e for e in experiments if all(f(e) for f in conditions)] - - def add_manifest_paths(self, manifest_builder): - """ - Construct a manifest for this Cache class and save it in a file. - - Parameters - ---------- - file_name: string - File location to save the manifest. - """ - manifest_builder = super(MouseConnectivityCachePrerelease, self)\ - .add_manifest_paths(manifest_builder) - - manifest_builder.add_path(self.EXPERIMENTS_PRERELEASE_KEY, - 'experiments_prerelease.json', - parent_key='BASEDIR', - typename='file') - - manifest_builder.add_path(self.STORAGE_DIRECTORIES_PRERELEASE_KEY, - 'storage_directories_prerelease.json', - parent_key='BASEDIR', - typename='file') - - return manifest_builder diff --git a/allensdk/internal/core/simpletree.py b/allensdk/internal/core/simpletree.py deleted file mode 100644 index b5018c5f00..0000000000 --- a/allensdk/internal/core/simpletree.py +++ /dev/null @@ -1,82 +0,0 @@ -from six import iteritems - - -class SimpleTree( object ): - def __init__(self, nodes, - node_id_cb, - parent_id_cb): - - self.node_list = nodes - - self._nodes = { node_id_cb(n):n for n in nodes } - self._parent_ids = { nid:parent_id_cb(n) for nid,n in iteritems(self._nodes) } - self._child_ids = { nid:[] for nid in self._nodes } - - for nid in self._parent_ids: - pid = self._parent_ids[nid] - if pid: - self._child_ids[pid].append(nid) - - def node_ids(self): - return self._nodes.keys() - - def parent_id(self, nid): - try: - return self._parent_ids[nid] - except KeyError: - raise KeyError("Could not find parent for node %s" % str(nid)) - - def child_ids(self, nid): - try: - for cid in self._child_ids[nid]: - yield cid - except KeyError: - raise KeyError("Could not find children for node %s" % str(nid)) - - def ancestor_ids(self, nid): - try: - pid = nid - while pid: - yield pid - pid = self.parent_id(pid) - except: - raise KeyError("Could not find ancestors for node %s" % str(nid)) - - def descendant_ids(self, nid): - ids = [nid] - try: - while ids: - nid = ids.pop() - yield nid - ids += self.child_ids(nid) - except KeyError: - raise KeyError("Could not find descendants for node %s" % str(nid)) - - def node(self, nid): - return self._nodes[nid] - - def nodes(self, nids=None): - if nids is None: - nids = self.node_ids() - - for nid in nids: - yield self.node(nid) - - def parent(self, nid): - return self.node(self.parent_id(nid)) - - def children(self, nid): - for node in self.nodes(self.child_ids(nid)): - yield node - - def descendants(self, nid): - for node in self.nodes(self.descendant_ids(nid)): - yield node - - def ancestors(self, nid): - for node in self.nodes(self.ancestor_ids(nid)): - yield node - - - - diff --git a/allensdk/internal/core/swc.py b/allensdk/internal/core/swc.py deleted file mode 100644 index 1f80cc221b..0000000000 --- a/allensdk/internal/core/swc.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright 2015-2016 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - -import csv -import copy -import math -from allensdk.internal.morphology.morphology import * -from allensdk.internal.morphology.node import Node - -######################################################################## -def read_swc(file_name): - """ - Read in an SWC file and return a Morphology object. - - Parameters - ---------- - file_name: string - SWC file name. - - Returns - ------- - Morphology - A Morphology instance. - """ - nodes = [] - line_num = 1 - try: - with open(file_name, "r") as f: - for line in f: - # remove comments - if line.lstrip().startswith('#'): - continue - # read values. expected SWC format is: - # ID, type, x, y, z, rad, parent - # x, y, z and rad are floats. the others are ints - toks = line.split() - vals = Node( - n = int(toks[0]), - t = int(toks[1]), - x = float(toks[2]), - y = float(toks[3]), - z = float(toks[4]), - r = float(toks[5]), - pn = int(toks[6].rstrip()) - ) - # store this node - nodes.append(vals) - # increment line number (used for error reporting only) - line_num += 1 - except ValueError: - err = "File not recognized as valid SWC file.\n" - err += "Problem parsing line %d\n" % line_num - if line is not None: - err += "Content: '%s'\n" % line - raise IOError(err) - - return Morphology(node_list=nodes) - - -######################################################################## -class Marker( dict ): - """ Simple dictionary class for handling reconstruction marker objects. """ - - SPACING = [ .1144, .1144, .28 ] - - CUT_DENDRITE = 10 - NO_RECONSTRUCTION = 20 - - def __init__(self, *args, **kwargs): - super(Marker, self).__init__(*args, **kwargs) - - # marker file x,y,z coordinates are offset by a single image-space pixel - self['x'] -= self.SPACING[0] - self['y'] -= self.SPACING[1] - self['z'] -= self.SPACING[2] - - - -def read_marker_file(file_name): - """ read in a marker file and return a list of dictionaries """ - - with open(file_name, 'r') as f: - rows = csv.DictReader((r for r in f if not r.startswith('#')), - fieldnames=['x','y','z','radius','shape','name','comment', - 'color_r','color_g','color_b']) - - return [ Marker({ 'x': float(r['x']), - 'y': float(r['y']), - 'z': float(r['z']), - 'name': int(r['name']) }) for r in rows ] - diff --git a/allensdk/internal/ephys/__init__.py b/allensdk/internal/ephys/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/ephys/core_feature_extract.py b/allensdk/internal/ephys/core_feature_extract.py deleted file mode 100644 index 19084713a1..0000000000 --- a/allensdk/internal/ephys/core_feature_extract.py +++ /dev/null @@ -1,325 +0,0 @@ -import sys, os, shutil -import logging -from collections import defaultdict -import numpy as np -import json -from six import iteritems - -from allensdk.config.manifest import Manifest -from allensdk.core.json_utilities import json_handler - -from allensdk.core.nwb_data_set import NwbDataSet -from allensdk.ephys.extract_cell_features import extract_cell_features, extract_sweep_features -from allensdk.ephys.ephys_features import FeatureError -from allensdk.ephys.ephys_extractor import reset_long_squares_start -import allensdk.internal.ephys.plot_qc_figures as plot_qc_figures - - -TEST_PULSE_DURATION_SEC = 0.4 - -LONG_SQUARE_COARSE = 'C1LSCOARSE' -LONG_SQUARE_FINE = 'C1LSFINEST' -SHORT_SQUARE = 'C1SSFINEST' -RAMP = 'C1RP25PR1S' -PASSED_SWEEP_STATES = [ 'manual_passed', 'auto_passed' ] -ICLAMP_UNITS = [ 'Amps', 'pA' ] - -def filter_sweeps(sweeps, types=None, passed_only=True, iclamp_only=True): - if passed_only: - sweeps = [ s for s in sweeps if s.get('workflow_state', None) in PASSED_SWEEP_STATES ] - - if iclamp_only: - sweeps = [ s for s in sweeps if s['stimulus_units'] in ICLAMP_UNITS ] - - if types: - sweeps = [ s for s in sweeps for t in types - if s['ephys_stimulus']['description'].startswith(t) ] - - return sorted(sweeps, key=lambda x: x['sweep_number']) - -def filtered_sweep_numbers(sweeps, types=None, passed_only=True, iclamp_only=True): - return [ s['sweep_number'] for s in filter_sweeps(sweeps, types, passed_only, iclamp_only) ] - -def find_stim_start(stim, idx0=0): - """ - Find the index of the first nonzero positive or negative jump in an array. - - Parameters - ---------- - stim: np.ndarray - Array to be searched - - idx0: int - Start searching with this index (default: 0). - - Returns - ------- - int - """ - - di = np.diff(stim) - idxs = np.flatnonzero(di) - idxs = idxs[idxs >= idx0] - - if len(idxs) == 0: - return -1 - - return idxs[0]+1 - -def find_sweep_stim_start(data_set, sweep_number): - sweep = data_set.get_sweep(sweep_number) - sr = sweep['sampling_rate'] - stim_start = find_stim_start(sweep['stimulus'], TEST_PULSE_DURATION_SEC * sr) / sr - logging.info("Long square stims start at time %f", stim_start) - return stim_start - -def find_coarse_long_square_amp_delta(sweeps, decimals=0): - """ Find the delta between amplitudes of coarse long square sweeps. Includes failed sweeps. """ - sweeps = filter_sweeps(sweeps, types=[ LONG_SQUARE_COARSE ], passed_only = False) - - amps = sorted([s['stimulus_amplitude'] for s in sweeps]) - amps_diff = np.round(np.diff(amps), decimals=decimals) - - amps_diff = amps_diff[amps_diff > 0] # repeats are okay - deltas = sorted(np.unique(amps_diff)) # unique nonzero deltas - - if len(deltas) == 0: - return 0 - - delta = deltas[0] - - if len(deltas) != 1: - logging.warning("Found multiple coarse long square amplitude step differences: %s. Using: %f" % (str(deltas), delta)) - - return delta - -def update_output_sweep_features(cell_features, sweep_features, sweep_index): - # add peak deflection for subthreshold long squares - for sweep_number, sweep in iteritems(sweep_index): - pd = sweep_features.get(sweep_number,{}).get('peak_deflect', None) - if pd is not None: - sweep['peak_deflection'] = pd[0] - - # update num_spikes - for sweep_num in sweep_features: - num_spikes = len(sweep_features[sweep_num]['spikes']) - if num_spikes == 0: - num_spikes = None - sweep_index[sweep_num]['num_spikes'] = num_spikes - - -def nan_get(obj, key): - """ Return a value from a dictionary. If it does not exist, return None. If it is NaN, return None """ - v = obj.get(key, None) - - if v is None: - return None - else: - return None if np.isnan(v) else v - -def generate_output_cell_features(cell_features, sweep_features, sweep_index): - ephys_features = {} - - # find hero and rheo sweeps in sweep table - rheo_sweep_num = cell_features["long_squares"]["rheobase_sweep"]["id"] - rheo_sweep_id = sweep_index.get(rheo_sweep_num, {}).get('id', None) - - if rheo_sweep_id is None: - raise Exception("Could not find id of rheobase sweep number %d." % rheo_sweep_num) - - hero_sweep = cell_features["long_squares"]["hero_sweep"] - if hero_sweep is None: - raise Exception("Could not find hero sweep") - - hero_sweep_num = hero_sweep["id"] - hero_sweep_id = sweep_index.get(hero_sweep_num, {}).get('id', None) - - if hero_sweep_id is None: - raise Exception("Could not find id of hero sweep number %d." % hero_sweep_num) - - # create a table of values - # this is a dictionary of ephys_features - base = cell_features["long_squares"] - ephys_features["rheobase_sweep_id"] = rheo_sweep_id - ephys_features["rheobase_sweep_num"] = rheo_sweep_num - ephys_features["thumbnail_sweep_id"] = hero_sweep_id - ephys_features["thumbnail_sweep_num"] = hero_sweep_num - ephys_features["vrest"] = nan_get(base, "v_baseline") - ephys_features["ri"] = nan_get(base, "input_resistance") - - # change the base to hero sweep - base = cell_features["long_squares"]["hero_sweep"] - ephys_features["adaptation"] = nan_get(base, "adapt") - ephys_features["latency"] = nan_get(base, "latency") - - # convert to ms - mean_isi = nan_get(base, "mean_isi") - ephys_features["avg_isi"] = (mean_isi * 1e3) if mean_isi is not None else None - - # now grab the rheo spike - base = cell_features["long_squares"]["rheobase_sweep"]["spikes"][0] - ephys_features["upstroke_downstroke_ratio_long_square"] = nan_get(base, "upstroke_downstroke_ratio") - ephys_features["peak_v_long_square"] = nan_get(base, "peak_v") - ephys_features["peak_t_long_square"] = nan_get(base, "peak_t") - ephys_features["trough_v_long_square"] = nan_get(base, "trough_v") - ephys_features["trough_t_long_square"] = nan_get(base, "trough_t") - ephys_features["fast_trough_v_long_square"] = nan_get(base, "fast_trough_v") - ephys_features["fast_trough_t_long_square"] = nan_get(base, "fast_trough_t") - ephys_features["slow_trough_v_long_square"] = nan_get(base, "slow_trough_v") - ephys_features["slow_trough_t_long_square"] = nan_get(base, "slow_trough_t") - ephys_features["threshold_v_long_square"] = nan_get(base, "threshold_v") - ephys_features["threshold_i_long_square"] = nan_get(base, "threshold_i") - ephys_features["threshold_t_long_square"] = nan_get(base, "threshold_t") - ephys_features["peak_v_long_square"] = nan_get(base, "peak_v") - ephys_features["peak_t_long_square"] = nan_get(base, "peak_t") - - base = cell_features["long_squares"] - ephys_features["sag"] = nan_get(base, "sag") - # convert to ms - tau = nan_get(base, "tau") - ephys_features["tau"] = (tau * 1e3) if tau is not None else None - ephys_features["vm_for_sag"] = nan_get(base, "vm_for_sag") - ephys_features["has_burst"] = None#base.get("has_burst", None) - ephys_features["has_pause"] = None#base.get("has_pause", None) - ephys_features["has_delay"] = None#base.get("has_delay", None) - ephys_features["f_i_curve_slope"] = nan_get(base, "fi_fit_slope") - - # change the base to ramp - base = cell_features["ramps"]["mean_spike_0"] # mean feature of first spike for all of these - ephys_features["upstroke_downstroke_ratio_ramp"] = nan_get(base, "upstroke_downstroke_ratio") - ephys_features["peak_v_ramp"] = nan_get(base, "peak_v") - ephys_features["peak_t_ramp"] = nan_get(base, "peak_t") - ephys_features["trough_v_ramp"] = nan_get(base, "trough_v") - ephys_features["trough_t_ramp"] = nan_get(base, "trough_t") - ephys_features["fast_trough_v_ramp"] = nan_get(base, "fast_trough_v") - ephys_features["fast_trough_t_ramp"] = nan_get(base, "fast_trough_t") - ephys_features["slow_trough_v_ramp"] = nan_get(base, "slow_trough_v") - ephys_features["slow_trough_t_ramp"] = nan_get(base, "slow_trough_t") - - ephys_features["threshold_v_ramp"] = nan_get(base, "threshold_v") - ephys_features["threshold_i_ramp"] = nan_get(base, "threshold_i") - ephys_features["threshold_t_ramp"] = nan_get(base, "threshold_t") - - # change the base to short_square - base = cell_features["short_squares"]["mean_spike_0"] # mean feature of first spike for all of these - ephys_features["upstroke_downstroke_ratio_short_square"] = nan_get(base, "upstroke_downstroke_ratio") - ephys_features["peak_v_short_square"] = nan_get(base, "peak_v") - ephys_features["peak_t_short_square"] = nan_get(base, "peak_t") - - ephys_features["trough_v_short_square"] = nan_get(base, "trough_v") - ephys_features["trough_t_short_square"] = nan_get(base, "trough_t") - - ephys_features["fast_trough_v_short_square"] = nan_get(base, "fast_trough_v") - ephys_features["fast_trough_t_short_square"] = nan_get(base, "fast_trough_t") - - ephys_features["slow_trough_v_short_square"] = nan_get(base, "slow_trough_v") - ephys_features["slow_trough_t_short_square"] = nan_get(base, "slow_trough_t") - - ephys_features["threshold_v_short_square"] = nan_get(base, "threshold_v") - #ephys_features["threshold_i_short_square"] = nan_get(base, "threshold_i") - ephys_features["threshold_t_short_square"] = nan_get(base, "threshold_t") - - ephys_features["threshold_i_short_square"] = nan_get(cell_features["short_squares"], "stimulus_amplitude") - - return ephys_features - -def extract_data(data, nwb_file): - ########################################################## - #### alings with ephys_sweep_qc_tool extract_features #### - cell_specimen = data['specimens'][0] - sweep_list = cell_specimen['ephys_sweeps'] - sweep_index = { s['sweep_number']:s for s in sweep_list } - - data_set = NwbDataSet(nwb_file) - - - # extract sweep-level features - logging.debug("Computing sweep features") - iclamp_sweep_list = filter_sweeps(sweep_list, iclamp_only=True, passed_only=False) - iclamp_sweeps = defaultdict(list) - for s in iclamp_sweep_list: - try: - stimulus_type_name = s['ephys_stimulus']['ephys_stimulus_type']['name'] - except KeyError as e: - raise Exception("Sweep %d has no ephys stimulus record in features JSON file: %s" % (s['sweep_number'], json.dumps(s, indent=3, default=json_handler))) - - if stimulus_type_name == "Unknown": - raise Exception(("Sweep %d (%s) has 'Unknown' stimulus type." + - "Please update the EpysStimuli and EphysRawStimulusNames associations in LIMS.") % (s['sweep_number'], s['ephys_stimulus']['description'])) - - iclamp_sweeps[stimulus_type_name].append(s['sweep_number']) - - passed_iclamp_sweep_list = filter_sweeps(sweep_list, iclamp_only=True, passed_only=True) - num_passed_sweeps = len(passed_iclamp_sweep_list) - logging.info("%d of %d sweeps passed QC", - num_passed_sweeps, - len(iclamp_sweep_list)) - - if num_passed_sweeps == 0: - raise FeatureError("There are no QC-passed sweeps available to analyze") - - # compute sweep features - logging.info("Computing sweep features") - sweep_features = extract_sweep_features(data_set, iclamp_sweeps) - cell_specimen['sweep_ephys_features'] = sweep_features - - # extract cell-level features - logging.info("Computing cell features") - long_square_sweep_numbers = filtered_sweep_numbers(sweep_list, [ LONG_SQUARE_COARSE, LONG_SQUARE_FINE ]) - short_square_sweep_numbers = filtered_sweep_numbers(sweep_list, [ SHORT_SQUARE ]) - ramp_sweep_numbers = filtered_sweep_numbers(sweep_list, [ RAMP ]) - - logging.debug("long square sweeps: %s", str(long_square_sweep_numbers)) - logging.debug("short square sweeps: %s", str(short_square_sweep_numbers)) - logging.debug("ramp sweeps: %s", str(ramp_sweep_numbers)) - - # PBS-262 -- have variable subthreshold minimum for human cells - subthresh_min_amp = None # None means default (mouse) behavior - long_square_amp_delta = find_coarse_long_square_amp_delta(sweep_list) - - if long_square_amp_delta != 20.0: - subthresh_min_amp = -200 - - logging.info("Long squares using %fpA step size. Using subthreshold minimum amplitude of %s.", - long_square_amp_delta, - str(subthresh_min_amp) if subthresh_min_amp is not None else "[default]") - - stim_start = find_sweep_stim_start(data_set, long_square_sweep_numbers[0]) - if stim_start > 0: - logging.info("resetting long square start time to: %f", stim_start) - reset_long_squares_start(stim_start) - - cell_features = extract_cell_features(data_set, - ramp_sweep_numbers, - short_square_sweep_numbers, - long_square_sweep_numbers, - subthresh_min_amp) - # shuffle peak deflection for the subthreshold long squares - for s in cell_features["long_squares"]["subthreshold_sweeps"]: - sweep_features[s['id']]['peak_deflect'] = s['peak_deflect'] - - cell_specimen['cell_ephys_features'] = cell_features - - update_output_sweep_features(cell_features, sweep_features, sweep_index) - ephys_features = generate_output_cell_features(cell_features, sweep_features, sweep_index) - - try: - out_ephys_features = cell_specimen.get('ephys_features',[])[0] - out_ephys_features.update(ephys_features) - except IndexError: - cell_specimen['ephys_features'] = [ ephys_features ] - - #### breaks with ephys_sweep_qc_tool extract_features #### - ########################################################## - return sweep_list, sweep_features - -def save_qc_figures(qc_fig_dir, nwb_file, output_data, plot_cell_figures): - if os.path.exists(qc_fig_dir): - logging.warning("removing existing qc figures directory: %s", qc_fig_dir) - shutil.rmtree(qc_fig_dir) - - Manifest.safe_mkdir(qc_fig_dir) - - logging.debug("saving qc plot figures") - plot_qc_figures.make_sweep_page(nwb_file, output_data, qc_fig_dir) - plot_qc_figures.make_cell_page(nwb_file, output_data, qc_fig_dir, plot_cell_figures) diff --git a/allensdk/internal/ephys/plot_qc_figures.py b/allensdk/internal/ephys/plot_qc_figures.py deleted file mode 100644 index 0a4ccebf15..0000000000 --- a/allensdk/internal/ephys/plot_qc_figures.py +++ /dev/null @@ -1,805 +0,0 @@ -import matplotlib - -matplotlib.use('agg') - -import logging - -import allensdk.internal.core.lims_utilities as lims_utilities -import allensdk.core.json_utilities as json_utilities - -from allensdk.core.nwb_data_set import NwbDataSet -import allensdk.ephys.ephys_features as ft -from allensdk.ephys.extract_cell_features import get_square_stim_characteristics, get_ramp_stim_characteristics, get_stim_characteristics - -import sys -import argparse -import os -import json -import h5py -import numpy as np -from six import iteritems - -from scipy.optimize import curve_fit -import scipy.signal as sg -import scipy.misc - -import datetime -import matplotlib.pyplot as plt -#import seaborn as sns - -AXIS_Y_RANGE = [ -110, 60 ] - -def get_time_string(): - return datetime.datetime.now().strftime("%I:%M%p %B %d, %Y") - -def get_spikes(sweep_features, sweep_number): - return get_features(sweep_features, sweep_number)["spikes"] - -def get_features(sweep_features, sweep_number): - try: - return sweep_features[int(sweep_number)] - except KeyError: - return sweep_features[str(sweep_number)] - -def load_experiment(file_name, sweep_number): - ds = NwbDataSet(file_name) - sweep = ds.get_sweep(sweep_number) - - r = sweep['index_range'] - v = sweep['response'] * 1e3 - i = sweep['stimulus'] * 1e12 - dt = 1.0 / sweep['sampling_rate'] - t = np.arange(0, len(v)) * dt - - return (v, i, t, r, dt) - -def plot_single_ap_values(nwb_file, sweep_numbers, lims_features, sweep_features, cell_features, type_name): - figs = [ plt.figure() for f in range(3+len(sweep_numbers)) ] - - v, i, t, r, dt = load_experiment(nwb_file, sweep_numbers[0]) - if type_name == "short_square" or type_name == "long_square": - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - elif type_name == "ramp": - stim_start, start_idx = get_ramp_stim_characteristics(i, t) - - gen_features = ["threshold", "peak", "trough", "fast_trough", "slow_trough"] - voltage_features = ["threshold_v", "peak_v", "trough_v", "fast_trough_v", "slow_trough_v"] - time_features = ["threshold_t", "peak_t", "trough_t", "fast_trough_t", "slow_trough_t"] - - for sn in sweep_numbers: - spikes = get_spikes(sweep_features, sn) - - if (len(spikes) < 1): - logging.warning("no spikes in sweep %d" % sn) - continue - - if type_name != "long_square": - voltages = [spikes[0][f] for f in voltage_features] - times = [spikes[0][f] for f in time_features] - else: - rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] - rheo_spike = get_spikes(sweep_features, rheo_sn)[0] - voltages = [ rheo_spike[f] for f in voltage_features] - times = [ rheo_spike[f] for f in time_features] - - plt.figure(figs[0].number) - plt.scatter(range(len(voltages)), voltages, color='gray') - plt.tight_layout() - - - plt.figure(figs[1].number) - plt.scatter(range(len(times)), times, color='gray') - plt.tight_layout() - - plt.figure(figs[2].number) - plt.scatter([0], [spikes[0]['upstroke'] / (-spikes[0]['downstroke'])], color='gray') - plt.tight_layout() - - - plt.figure(figs[0].number) - - yvals = [float(lims_features[k + "_v_" + type_name]) for k in gen_features if lims_features[k + "_v_" + type_name] is not None] - xvals = range(len(yvals)) - - plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) - plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) - plt.title(type_name + ": voltages") - - plt.figure(figs[1].number) - yvals = [float(lims_features[k + "_t_" + type_name]) for k in gen_features if lims_features[k + "_t_" + type_name] is not None] - xvals = range(len(yvals)) - plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) - plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) - plt.title(type_name + ": times") - - plt.figure(figs[2].number) - if lims_features["upstroke_downstroke_ratio_" + type_name] is not None: - plt.scatter([0], [float(lims_features["upstroke_downstroke_ratio_" + type_name])], color='blue', marker='_', s=40, zorder=100) - plt.xticks([]) - plt.title(type_name + ": up/down") - - for index, sn in enumerate(sweep_numbers): - plt.figure(figs[3 + index].number) - - v, i, t, r, dt = load_experiment(nwb_file, sn) - plt.plot(t, v, color='black') - plt.title(str(sn)) - - spikes = get_spikes(sweep_features, sn) - - nspikes = len(spikes) - - if type_name != "long_square" and nspikes: - if nspikes == 0: - logging.warning("no spikes in sweep %d" % sn) - continue - - voltages = [spikes[0][f] for f in voltage_features] - times = [spikes[0][f] for f in time_features] - else: - rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] - rheo_spike = get_spikes(sweep_features, rheo_sn)[0] - voltages = [ rheo_spike[f] for f in voltage_features ] - times = [ rheo_spike[f] for f in time_features ] - - plt.scatter(times, voltages, color='red', zorder=20) - - - delta_v = 5.0 - if nspikes: - plt.plot([spikes[0]['upstroke_t'] - 1e-3 * (delta_v / spikes[0]['upstroke']), - spikes[0]['upstroke_t'] + 1e-3 * (delta_v / spikes[0]['upstroke'])], - [spikes[0]['upstroke_v'] - delta_v, spikes[0]['upstroke_v'] + delta_v], color='red') - - if 'downstroke_t' in spikes[0]: - plt.plot([spikes[0]['downstroke_t'] - 1e-3 * (delta_v / spikes[0]['downstroke']), - spikes[0]['downstroke_t'] + 1e-3 * (delta_v / spikes[0]['downstroke'])], - [spikes[0]['downstroke_v'] - delta_v, spikes[0]['downstroke_v'] + delta_v], color='red') - else: - logging.warning("spike has no downstroke time, clipped") - - if type_name == "ramp": - if nspikes: - plt.xlim(spikes[0]["threshold_t"] - 0.002, spikes[0]["fast_trough_t"] + 0.01) - elif type_name == "short_square": - plt.xlim(stim_start - 0.002, stim_start + stim_dur + 0.01) - elif type_name == "long_square": - plt.xlim(times[0]- 0.002, times[-2] + 0.002) - - plt.tight_layout() - - - return figs - -def plot_sweep_figures(nwb_file, ephys_roi_result, image_dir, sizes): - sweeps = ephys_roi_result["specimens"][0]["ephys_sweeps"] - vclamp_sweep_numbers = sorted([ s['sweep_number'] for s in sweeps if s['stimulus_units'] == 'Amps' or s['stimulus_units'] == 'pA' ]) - - image_file_sets = {} - - tp_set = [] - exp_set = [] - - prev_sweep_number = None - - tp_len = 0.035 - tp_steps = int(tp_len * 200000) - - b, a = sg.bessel(4, 0.1, "low") - - for i, sweep_number in enumerate(vclamp_sweep_numbers): - logging.info("plotting sweep %d" % sweep_number) - if i == 0: - v_init, i_init, t_init, r_init, dt_init = load_experiment(nwb_file, sweep_number) - - tp_fig = plt.figure() - axTP = plt.gca() - axTP.set_yticklabels([]) - axTP.set_xticklabels([]) - axTP.set_xlabel(str(sweep_number)) - axTP.set_ylabel('') - xTP = t_init[0:tp_steps] - yTP = v_init[0:tp_steps] - axTP.plot(xTP, yTP, linewidth=1) - axTP.set_xlim(0, tp_len) -# sns.despine() - - exp_fig = plt.figure() - axDP = plt.gca() - axDP.set_yticklabels([]) - axDP.set_xticklabels([]) - axDP.set_xlabel(str(sweep_number)) - axDP.set_ylabel('') - v_exp = v_init[r_init[0]:] - t_exp = t_init[r_init[0]:] - yDP = sg.filtfilt(b, a, v_exp, axis=0) - xDP = t_exp - baseline = yDP[5000:9000] - baselineMean = np.mean(baseline) - baselineV = (np.ones(len(xDP))) * baselineMean - axDP.plot(xDP, yDP, linewidth=1) - axDP.plot(xDP, baselineV, linewidth=1) - axDP.set_xlim(t_exp[0], t_exp[-1]) -# sns.despine() - - v_prev, i_prev, t_prev, r_prev = v_init, i_init, t_init, r_init - - else: - v, i, t, r, dt = load_experiment(nwb_file, sweep_number) - - tp_fig = plt.figure() - axTP = plt.gca() - axTP.set_yticklabels([]) - axTP.set_xticklabels([]) - axTP.set_xlabel(str(sweep_number)) - axTP.set_ylabel('') - yTP = v[:tp_steps] - xTP = t[:tp_steps] - TPBL = np.mean(yTP[0:100]) - yTPN = yTP - TPBL - yTPp = v_prev[:tp_steps] - TPpBL = np.mean(yTPp[0:100]) - yTPpN = yTPp - TPpBL - yTPi = v_init[:tp_steps] - TPiBL = np.mean(yTPi[0:100]) - yTPiN = yTPi - TPiBL - axTP.plot(xTP, yTPiN, linewidth=1) - axTP.plot(xTP, yTPpN, linewidth=1) - axTP.plot(xTP, yTPN, linewidth=1) - axTP.set_xlim(0, tp_len) -# sns.despine() - - exp_fig = plt.figure() - axDP = plt.gca() - axDP.set_yticklabels([]) - axDP.set_xticklabels([]) - axDP.set_xlabel(str(sweep_number)) - axDP.set_ylabel('') - v_exp = v[r[0]:] - t_exp = t[r[0]:] - yDP = sg.filtfilt(b, a, v_exp, axis=0) - xDP = t_exp - baseline = yDP[5000:9000] - baselineMean = np.mean(baseline) - baselineV = (np.ones(len(xDP))) * baselineMean - axDP.plot(xDP, yDP, linewidth=1) - axDP.plot(xDP, baselineV, linewidth=1) - axDP.set_xlim(t_exp[0], t_exp[-1]) -# sns.despine() - - v_prev, i_prev, t_prev, r_prev = v, i, t, r - - prev_sweep_number = sweep_number - - save_figure(tp_fig, 'test_pulse_%d' % sweep_number, 'test_pulses', image_dir, sizes, image_file_sets) - save_figure(exp_fig, 'experiment_%d' % sweep_number, 'experiments', image_dir, sizes, image_file_sets) - - return image_file_sets - -def save_figure(fig, image_name, image_set_name, image_dir, sizes, image_sets, scalew=1, scaleh=1, ext='jpg'): - plt.figure(fig.number) - - if image_set_name not in image_sets: - image_sets[image_set_name] = { size_name: [] for size_name in sizes } - - for size_name, size in iteritems(sizes): - fig.set_size_inches(size*scalew, size*scaleh) - - image_file = os.path.join(image_dir, "%s_%s.%s" % (image_name, size_name, ext)) - - plt.savefig(image_file, bbox_inches="tight") - - image_sets[image_set_name][size_name].append(image_file) - - plt.close() - - -def plot_images(ephys_roi_result, image_dir, sizes, image_sets): - wkfs = [ f for f in ephys_roi_result['well_known_files'] if f['filename'].endswith('tif') ] - - paths = [ os.path.join(f['storage_directory'], f['filename']) for f in wkfs ] - - paths = [ lims_utilities.safe_system_path(p) for p in paths ] - - image_set_name = "images" - image_sets[image_set_name] = { size_name: [] for size_name in sizes } - - for i, path in enumerate(paths): - image_data = plt.imread(path) - image_data = np.array(image_data, dtype=np.float32) - - vmin = image_data.min() - vmax = image_data.max() - - image_data = np.array((image_data - vmin) / (vmax - vmin) * 255.0, dtype=np.uint8) - - for size_name, size in iteritems(sizes): - if size: - s = image_data.shape - skip = int(s[0] / size) - sdata = image_data[::skip, ::skip] - else: - sdata = image_data - - - filename = os.path.join(image_dir, "image_%d_%s.jpg" % (i, size_name)) - scipy.misc.imsave(filename, sdata) - - image_sets['images'][size_name].append(filename) - - -def plot_subthreshold_long_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): - lsq_sweeps = cell_features["long_squares"]["sweeps"] - sub_sweeps = cell_features["long_squares"]["subthreshold_sweeps"] - tau_sweeps = cell_features["long_squares"]["subthreshold_membrane_property_sweeps"] - - # 0a - Plot VI curve and linear fit, along with vrest - x = np.array([ s['stim_amp'] for s in sub_sweeps ]) - y = np.array([ s['peak_deflect'][0] for s in sub_sweeps ]) - i = np.array([ s['stim_amp'] for s in tau_sweeps ]) - - fig = plt.figure() - plt.scatter(x, y, color='black') - plt.plot([x.min(), x.max()], [lims_features["vrest"], lims_features["vrest"]], color="blue", linewidth=2) - plt.plot(i, i * 1e-3 * lims_features["ri"] + lims_features["vrest"], color="red", linewidth=2) - plt.xlabel("pA") - plt.ylabel("mV") - plt.title("ri = {:.1f}, vrest = {:.1f}".format(lims_features["ri"], lims_features["vrest"])) - plt.tight_layout() - - save_figure(fig, 'VI_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) - - # 0b - Plot tau curve and average - fig = plt.figure() - x = np.array([ s['stim_amp'] for s in tau_sweeps ]) - y = np.array([ s['tau'] for s in tau_sweeps ]) - plt.scatter(x, y, color='black') - i = np.array([ s['stim_amp'] for s in tau_sweeps ]) - plt.plot([i.min(), i.max()], [cell_features["long_squares"]["tau"], cell_features["long_squares"]["tau"]], color="red", linewidth=2) - plt.xlabel("pA") - ylim = plt.ylim() - plt.ylim(0, ylim[1]) - plt.ylabel("tau (s)") - plt.tight_layout() - - - save_figure(fig, 'tau_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) - - subthresh_dict = {s['id']:s for s in tau_sweeps} - - # 0c - Plot the subthreshold squares - tau_sweeps = [ s['id'] for s in tau_sweeps ] - tau_figs = [ plt.figure() for i in range(len(tau_sweeps)) ] - - for index, s in enumerate(tau_sweeps): - v, i, t, r, dt = load_experiment(nwb_file, s) - - plt.figure(tau_figs[index].number) - - plt.plot(t, v, color="black") - - if index == 0: - min_y, max_y = plt.ylim() - else: - ylims = plt.ylim() - if min_y > ylims[0]: - min_y = ylims[0] - if max_y < ylims[1]: - max_y = ylims[1] - - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) - peak_idx = subthresh_dict[s]['peak_deflect'][1] - peak_t = peak_idx*dt - plt.scatter([peak_t], [subthresh_dict[s]['peak_deflect'][0]], color='red', zorder=10) - popt = ft.fit_membrane_time_constant(v, t, stim_start, peak_t) - plt.title(str(s)) - plt.plot(t[start_idx:peak_idx], exp_curve(t[start_idx:peak_idx] - t[start_idx], *popt), color='blue') - - - for index, s in enumerate(tau_sweeps): - plt.figure(tau_figs[index].number) - plt.ylim(min_y, max_y) - plt.tight_layout() - - for index, tau_fig in enumerate(tau_figs): - save_figure(tau_figs[index], 'tau_%d' % index, 'subthreshold_long_squares', image_dir, sizes, cell_image_files) - -def plot_short_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): - repeat_amp = cell_features["short_squares"].get("stimulus_amplitude", None) - - if repeat_amp is not None: - short_square_sweep_nums = [ s['id'] for s in cell_features["short_squares"]["common_amp_sweeps"] ] - - figs = plot_single_ap_values(nwb_file, short_square_sweep_nums, - lims_features, sweep_features, cell_features, - "short_square") - - for index, fig in enumerate(figs): - save_figure(fig, 'short_squares_%d' % index, 'short_squares', image_dir, sizes, cell_image_files) - - fig = plot_instantaneous_threshold_thumbnail(nwb_file, short_square_sweep_nums, - cell_features, lims_features, sweep_features) - - save_figure(fig, 'instantaneous_threshold_thumbnail', 'short_squares', image_dir, sizes, cell_image_files) - - - else: - logging.warning("No short square figures to plot.") - - -def plot_instantaneous_threshold_thumbnail(nwb_file, sweep_numbers, cell_features, lims_features, sweep_features, color='red'): - min_sweep_number = None - for sn in sorted(sweep_numbers): - spikes = get_spikes(sweep_features, sn) - - if len(spikes) > 0: - min_sweep_number = sn if min_sweep_number is None else min(min_sweep_number, sn) - - fig = plt.figure(frameon=False) - ax = plt.Axes(fig, [0., 0., 1., 1.]) - ax.set_axis_off() - fig.add_axes(ax) - ax.set_yticklabels([]) - ax.set_xticklabels([]) - ax.set_xlabel('') - ax.set_ylabel('') - - v, i, t, r, dt = load_experiment(nwb_file, sn) - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - - tstart = stim_start - 0.002 - tend = stim_start + stim_dur + 0.005 - tscale = 0.005 - - plt.plot(t, v, linewidth=1, color=color) - - plt.ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) - plt.xlim(tstart, tend) - - return fig - - -def plot_ramp_figures(nwb_file, cell_specimen, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): - sweeps = cell_specimen['ephys_sweeps'] - ramps_sweeps = [ s["sweep_number"] for s in sweeps if s["workflow_state"].endswith("passed") and s["ephys_stimulus"]["description"][:10] == "C1RP25PR1S"] - - figs = [] - if len(ramps_sweeps) > 0: - figs = plot_single_ap_values(nwb_file, ramps_sweeps, lims_features, sweep_features, cell_features, "ramp") - - for index, fig in enumerate(figs): - save_figure(fig, 'ramps_%d' % index, 'ramps', image_dir, sizes, cell_image_files) - -def plot_rheo_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): - rheo_sweeps = [ lims_features["rheobase_sweep_num"] ] - figs = plot_single_ap_values(nwb_file, rheo_sweeps, lims_features, sweep_features, cell_features, "long_square") - - for index, fig in enumerate(figs): - save_figure(fig, 'rheo_%d' % index, 'rheo', image_dir, sizes, cell_image_files) - -def plot_hero_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): - fig = plt.figure() - v, i, t, r, dt = load_experiment(nwb_file, int(lims_features["thumbnail_sweep_num"])) - plt.plot(t, v, color='black') - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) - plt.ylim(-110, 50) - spike_times = [spk['threshold_t'] for spk in get_spikes(sweep_features, lims_features["thumbnail_sweep_num"])] - isis = np.diff(np.array(spike_times)) - plt.title("thumbnail {:d}, amp = {:.1f}".format(lims_features["thumbnail_sweep_num"], stim_amp)) - plt.tight_layout() - - save_figure(fig, 'thumbnail_0', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) - - fig = plt.figure() - plt.plot(range(len(isis)), isis) - plt.ylabel("ISI (ms)") - if lims_features.get("adaptation", None) is not None: - plt.title("adapt = {:.3g}".format(lims_features["adaptation"])) - else: - plt.title("adapt = not defined") - - for k in ["has_delay", "has_burst", "has_pause"]: - if lims_features.get(k, None) is None: - lims_features[k] = False - - plt.tight_layout() - save_figure(fig, 'thumbnail_1', 'thumbnail', image_dir, sizes, cell_image_files) - - yvals = [ - float(lims_features["has_delay"]), - float(lims_features["has_burst"]), - float(lims_features["has_pause"]), - ] - xvals = range(len(yvals)) - - fig = plt.figure() - plt.scatter(xvals, yvals, color='red') - plt.xticks(xvals, ['Delay', 'Burst', 'Pause']) - plt.title("flags") - plt.tight_layout() - - save_figure(fig, 'thumbnail_2', 'thumbnail', image_dir, sizes, cell_image_files) - - summary_fig = plot_long_square_summary(nwb_file, cell_features, lims_features, sweep_features) - save_figure(summary_fig, 'ephys_summary', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) - - -def plot_long_square_summary(nwb_file, cell_features, lims_features, sweep_features): - long_square_sweeps = cell_features['long_squares']['sweeps'] - long_square_sweep_numbers = [ int(s['id']) for s in long_square_sweeps ] - - thumbnail_summary_fig = plot_sweep_set_summary(nwb_file, int(lims_features['thumbnail_sweep_num']), long_square_sweep_numbers) - plt.figure(thumbnail_summary_fig.number) - - return thumbnail_summary_fig - - -def plot_fi_curve_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): - fig = plt.figure() - fi_sorted = sorted(cell_features["long_squares"]["spiking_sweeps"], key=lambda s:s['stim_amp']) - x = [d['stim_amp'] for d in fi_sorted] - y = [d['avg_rate'] for d in fi_sorted] - last_zero_idx = np.nonzero(y)[0][0] - 1 - plt.scatter(x, y, color='black') - plt.plot(x[last_zero_idx:], cell_features["long_squares"]["fi_fit_slope"] * (np.array(x[last_zero_idx:]) - x[last_zero_idx]), color='red') - plt.xlabel("pA") - plt.ylabel("spikes/sec") - plt.title("slope = {:.3g}".format(lims_features["f_i_curve_slope"])) - rheo_hero_sweeps = [int(lims_features["rheobase_sweep_num"]), int(lims_features["thumbnail_sweep_num"])] - rheo_hero_x = [] - for s in rheo_hero_sweeps: - v, i, t, r, dt = load_experiment(nwb_file, s) - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - rheo_hero_x.append(stim_amp) - rheo_hero_y = [ len(get_spikes(sweep_features, s)) for s in rheo_hero_sweeps ] - plt.scatter(rheo_hero_x, rheo_hero_y, zorder=20) - plt.tight_layout() - - save_figure(fig, 'fi_curve', 'fi_curve', image_dir, sizes, cell_image_files, scalew=2) - -def plot_sag_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files): - fig = plt.figure() - for d in cell_features["long_squares"]["subthreshold_sweeps"]: - if d['peak_deflect'][0] == lims_features["vm_for_sag"]: - v, i, t, r, dt = load_experiment(nwb_file, int(d['id'])) - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - plt.plot(t, v, color='black') - plt.scatter(d['peak_deflect'][1], d['peak_deflect'][0], color='red', zorder=10) - #plt.plot([stim_start + stim_dur - 0.1, stim_start + stim_dur], [d['steady'], d['steady']], color='red', zorder=10) - plt.xlim(stim_start - 0.25, stim_start + stim_dur + 0.25) - plt.title("sag = {:.3g}".format(lims_features['sag'])) - plt.tight_layout() - - save_figure(fig, 'sag', 'sag', image_dir, sizes, cell_image_files, scalew=2) - -def mask_nulls(data): - data[0, np.equal(data[0,:], None) | np.equal(data[0,:],0)] = np.nan - -def plot_sweep_value_figures(cell_specimen, image_dir, sizes, cell_image_files): - sweeps = sorted(cell_specimen['ephys_sweeps'], key=lambda s: s['sweep_number'] ) - - # plot bridge balance - data = np.array([ [ s['bridge_balance_mohm'], s['sweep_number'] ] for s in sweeps ]).T - mask_nulls(data) - - fig = plt.figure() - plt.title('bridge balance') - plt.plot(data[1,:], data[0,:], marker='.') - - save_figure(fig, 'bridge_balance', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) - - # plot pre_vm_mv, no blowout sweep - data = np.array([ [ s['pre_vm_mv'], s['sweep_number'] ] - for s in sweeps - if not s['ephys_stimulus']['description'].startswith('EXTPBLWOUT')]).T - mask_nulls(data) - - fig = plt.figure() - plt.title('pre vm') - plt.plot(data[1,:], data[0,:], marker='.') - - save_figure(fig, 'pre_vm_mv', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) - - # plot bias current - data = np.array([ [ s['leak_pa'], s['sweep_number'] ] for s in sweeps ]).T - mask_nulls(data) - - fig = plt.figure() - plt.title('leak') - plt.plot(data[1,:], data[0,:], marker='.') - - save_figure(fig, 'leak', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) - -def plot_cell_figures(nwb_file, ephys_roi_result, image_dir, sizes): - - cell_image_files = {} - - plt.style.use('ggplot') - - cell_specimen = ephys_roi_result["specimens"][0] - cell_features = cell_specimen["cell_ephys_features"] - lims_features = cell_specimen["ephys_features"][0] - sweep_features = cell_specimen["sweep_ephys_features"] - - logging.info("saving sweep feature figures") - plot_sweep_value_figures(cell_specimen, image_dir, sizes, cell_image_files) - - logging.info("saving tau and vi figs") - plot_subthreshold_long_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving short square figs") - plot_short_square_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving ramps") - plot_ramp_figures(nwb_file, cell_specimen, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving rheo figs") - plot_rheo_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving thumbnail figs") - plot_hero_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving fi curve figs") - plot_fi_curve_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving sag figs") - plot_sag_figures(nwb_file, cell_features, lims_features, sweep_features, image_dir, sizes, cell_image_files) - - return cell_image_files - -def plot_sweep_set_summary(nwb_file, highlight_sweep_number, sweep_numbers, - highlight_color='#0779BE', background_color='#dddddd'): - - fig = plt.figure(frameon=False) - ax = plt.Axes(fig, [0., 0., 1., 1.]) - ax.set_axis_off() - fig.add_axes(ax) - ax.set_yticklabels([]) - ax.set_xticklabels([]) - ax.set_xlabel('') - ax.set_ylabel('') - - for sn in sweep_numbers: - v, i, t, r, dt = load_experiment(nwb_file, sn) - ax.plot(t, v, linewidth=0.5, color=background_color) - - v, i, t, r, dt = load_experiment(nwb_file, highlight_sweep_number) - plt.plot(t, v, linewidth=1, color=highlight_color) - - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - - tstart = stim_start - 0.05 - tend = stim_start + stim_dur + 0.25 - - ax.set_ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) - ax.set_xlim(tstart, tend) - - return fig - -def make_sweep_html(sweep_files, file_name): - html = "<html><body>" - html += "<a href='index.html'>Cell QC Figures</a>" - - html += "<p>page created at: %s</p>" % get_time_string() - - html += "<div style='position:absolute;width:50%;left:0;top:40'>" - if 'test_pulses' in sweep_files: - for small_img, large_img in zip(sweep_files['test_pulses']['small'], - sweep_files['test_pulses']['large']): - html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), - os.path.basename(small_img) ) - html += "</div>" - - html += "<div style='position:absolute;width:50%;right:0;top:40'>" - if 'experiments' in sweep_files: - for small_img, large_img in zip(sweep_files['experiments']['small'], - sweep_files['experiments']['large']): - html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), - os.path.basename(small_img) ) - html += "</div>" - - html += "</body></html>" - - with open(file_name, 'w') as f: - f.write(html) - -def make_cell_html(image_files, ephys_roi_result, file_name, relative_sweep_link): - - html = "<html><body>" - - specimen = ephys_roi_result['specimens'][0] - - html += "<h3>Specimen %d: %s</h3>" % ( specimen['id'], specimen['name'] ) - html += "<p>page created at: %s</p>" % get_time_string() - - if relative_sweep_link: - html += "<p><a href='sweep.html' target='_blank'> Sweep QC Figures </a></p>" - else: - sweep_qc_link = '/'.join([ephys_roi_result['storage_directory'], 'qc_figures', 'sweep.html']) - sweep_qc_link = lims_utilities.safe_system_path(sweep_qc_link) - html += "<p><a href='%s' target='_blank'> Sweep QC Figures </a></p>" % sweep_qc_link - - fields_to_show = [ 'electrode_0_pa', 'seal_gohm', 'initial_access_resistance_mohm', 'input_resistance_mohm' ] - - html += "<table>" - for field in fields_to_show: - html += "<tr><td>%s</td><td>%s</td></tr>" % (field, ephys_roi_result.get(field,None)) - html += "</table>" - - for image_file_set_name in image_files: - html += "<h3>%s</h3>" % image_file_set_name - - image_set_files = image_files[image_file_set_name] - - for small_img, large_img in zip(image_set_files['small'], image_set_files['large']): - html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), - os.path.basename(small_img) ) - html += ("</body></html>") - - with open(file_name, 'w') as f: - f.write(html) - -def make_sweep_page(nwb_file, ephys_roi_result, working_dir): - sizes = { 'small': 2.0, 'large': 6.0 } - - sweep_files = plot_sweep_figures(nwb_file, ephys_roi_result, working_dir, sizes) - make_sweep_html(sweep_files, - os.path.join(working_dir, 'sweep.html')) - -def make_cell_page(nwb_file, ephys_roi_result, working_dir, save_cell_plots=True): - - if save_cell_plots: - sizes = { 'small': 2.0, 'large': 6.0 } - cell_files = plot_cell_figures(nwb_file, ephys_roi_result, working_dir, sizes) - else: - cell_files = {} - - logging.info("saving images") - sizes = { 'small': 200, 'large': None } - plot_images(ephys_roi_result, working_dir, sizes, cell_files) - - sweep_page = os.path.join(working_dir, 'sweep.html') - relative_sweep_link = os.path.exists(sweep_page) - - if not relative_sweep_link: - logging.info("sweep page doesn't exist, point to production sweep page") - - make_cell_html(cell_files, ephys_roi_result, - os.path.join(working_dir, 'index.html'), - relative_sweep_link) - -def exp_curve(x, a, inv_tau, y0): - ''' Function used for tau curve fitting ''' - return y0 + a * np.exp(-inv_tau * x) - - -def main(): - parser = argparse.ArgumentParser(description='analyze specimens for cell-wide features') - parser.add_argument('nwb_file') - parser.add_argument('feature_json') - parser.add_argument('--output_directory', default='.') - parser.add_argument('--no-sweep-page', action='store_false', dest='sweep_page') - parser.add_argument('--no-cell-page', action='store_false', dest='cell_page') - parser.add_argument('--log_level') - - - args = parser.parse_args() - - if args.log_level: - logging.getLogger().setLevel(args.log_level) - - ephys_roi_result = json_utilities.read(args.feature_json) - - if args.sweep_page: - logging.debug("making sweep page") - make_sweep_page(args.nwb_file, ephys_roi_result, args.output_directory) - - if args.cell_page: - logging.debug("making cell page") - make_cell_page(args.nwb_file, ephys_roi_result, args.output_directory, True) - - - -if __name__ == '__main__': main() diff --git a/allensdk/internal/ephys/plot_qc_figures3.py b/allensdk/internal/ephys/plot_qc_figures3.py deleted file mode 100644 index 1bb174d747..0000000000 --- a/allensdk/internal/ephys/plot_qc_figures3.py +++ /dev/null @@ -1,839 +0,0 @@ -import matplotlib - -matplotlib.use('agg') - -import logging - -import allensdk.internal.core.lims_utilities as lims_utilities -import allensdk.core.json_utilities as json_utilities - -from allensdk.core.nwb_data_set import NwbDataSet -import allensdk.ephys.ephys_features as ft -from allensdk.ephys.extract_cell_features import get_square_stim_characteristics, get_ramp_stim_characteristics, get_stim_characteristics - -import sys -import argparse -import os -import json -import h5py -import numpy as np -from six import iteritems - -from scipy.optimize import curve_fit -import scipy.signal as sg -import scipy.misc - -import datetime -import matplotlib.pyplot as plt -#import seaborn as sns - -AXIS_Y_RANGE = [ -110, 60 ] - -def get_time_string(): - return datetime.datetime.now().strftime("%I:%M%p %B %d, %Y") - -def get_spikes(sweep_features, sweep_number): - return get_features(sweep_features, sweep_number)["spikes"] - -def get_features(sweep_features, sweep_number): - try: - return sweep_features[int(sweep_number)] - except KeyError: - return sweep_features[str(sweep_number)] - -def load_experiment(file_name, sweep_number): - ds = NwbDataSet(file_name) - sweep = ds.get_sweep(sweep_number) - - r = sweep['index_range'] - v = sweep['response'] * 1e3 - i = sweep['stimulus'] * 1e12 - dt = 1.0 / sweep['sampling_rate'] - t = np.arange(0, len(v)) * dt - - return (v, i, t, r, dt) - -def plot_single_ap_values(nwb_file, sweep_numbers, rheo_features, sweep_features, cell_features, type_name): - figs = [ plt.figure() for f in range(3+len(sweep_numbers)) ] - - v, i, t, r, dt = load_experiment(nwb_file, sweep_numbers[0]) - if type_name == "short_square" or type_name == "long_square": - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - elif type_name == "ramp": - stim_start, start_idx = get_ramp_stim_characteristics(i, t) - - gen_features = ["threshold", "peak", "trough", "fast_trough", "slow_trough"] - voltage_features = ["threshold_v", "peak_v", "trough_v", "fast_trough_v", "slow_trough_v"] - time_features = ["threshold_t", "peak_t", "trough_t", "fast_trough_t", "slow_trough_t"] - - for sn in sweep_numbers: - spikes = get_spikes(sweep_features, sn) - - if (len(spikes) < 1): - logging.warning("no spikes in sweep %d" % sn) - continue - - if type_name != "long_square": - voltages = [spikes[0][f] for f in voltage_features] - times = [spikes[0][f] for f in time_features] - else: - rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] - rheo_spike = get_spikes(sweep_features, rheo_sn)[0] - voltages = [ rheo_spike[f] for f in voltage_features] - times = [ rheo_spike[f] for f in time_features] - - plt.figure(figs[0].number) - plt.scatter(range(len(voltages)), voltages, color='gray') - plt.tight_layout() - - - plt.figure(figs[1].number) - plt.scatter(range(len(times)), times, color='gray') - plt.tight_layout() - - plt.figure(figs[2].number) - plt.scatter([0], [spikes[0]['upstroke'] / (-spikes[0]['downstroke'])], color='gray') - plt.tight_layout() - - - plt.figure(figs[0].number) - - yvals = [float(rheo_features[k + "_v_" + type_name]) for k in gen_features if rheo_features[k + "_v_" + type_name] is not None] - xvals = range(len(yvals)) - - plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) - plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) - plt.title(type_name + ": voltages") - - plt.figure(figs[1].number) - yvals = [float(rheo_features[k + "_t_" + type_name]) for k in gen_features if rheo_features[k + "_t_" + type_name] is not None] - xvals = range(len(yvals)) - plt.scatter(xvals, yvals, color='blue', marker='_', s=40, zorder=100) - plt.xticks(xvals, ['thr', 'pk', 'tr', 'ftr', 'str']) - plt.title(type_name + ": times") - - plt.figure(figs[2].number) - if rheo_features["upstroke_downstroke_ratio_" + type_name] is not None: - plt.scatter([0], [float(rheo_features["upstroke_downstroke_ratio_" + type_name])], color='blue', marker='_', s=40, zorder=100) - plt.xticks([]) - plt.title(type_name + ": up/down") - - for index, sn in enumerate(sweep_numbers): - plt.figure(figs[3 + index].number) - - v, i, t, r, dt = load_experiment(nwb_file, sn) - plt.plot(t, v, color='black') - plt.title(str(sn)) - - spikes = get_spikes(sweep_features, sn) - - nspikes = len(spikes) - - if type_name != "long_square" and nspikes: - if nspikes == 0: - logging.warning("no spikes in sweep %d" % sn) - continue - - voltages = [spikes[0][f] for f in voltage_features] - times = [spikes[0][f] for f in time_features] - else: - rheo_sn = cell_features["long_squares"]["rheobase_sweep"]["id"] - rheo_spike = get_spikes(sweep_features, rheo_sn)[0] - voltages = [ rheo_spike[f] for f in voltage_features ] - times = [ rheo_spike[f] for f in time_features ] - - plt.scatter(times, voltages, color='red', zorder=20) - - - delta_v = 5.0 - if nspikes: - plt.plot([spikes[0]['upstroke_t'] - 1e-3 * (delta_v / spikes[0]['upstroke']), - spikes[0]['upstroke_t'] + 1e-3 * (delta_v / spikes[0]['upstroke'])], - [spikes[0]['upstroke_v'] - delta_v, spikes[0]['upstroke_v'] + delta_v], color='red') - - plt.plot([spikes[0]['downstroke_t'] - 1e-3 * (delta_v / spikes[0]['downstroke']), - spikes[0]['downstroke_t'] + 1e-3 * (delta_v / spikes[0]['downstroke'])], - [spikes[0]['downstroke_v'] - delta_v, spikes[0]['downstroke_v'] + delta_v], color='red') - - if type_name == "ramp": - if nspikes: - plt.xlim(spikes[0]["threshold_t"] - 0.002, spikes[0]["fast_trough_t"] + 0.01) - elif type_name == "short_square": - plt.xlim(stim_start - 0.002, stim_start + stim_dur + 0.01) - elif type_name == "long_square": - plt.xlim(times[0]- 0.002, times[-2] + 0.002) - - plt.tight_layout() - - - return figs - -#def plot_sweep_figures(nwb_file, ephys_roi_result, image_dir, sizes): -def plot_sweep_figures(nwb_file, sweep_data, image_dir, sizes): -# try: -# sweeps = ephys_roi_result["specimens"][0]["ephys_sweeps"] -# except: -# sweeps = ephys_roi_result["specimens"]["ephys_sweeps"] - vclamp_sweep_numbers = sorted([ s['sweep_number'] for s in sweep_data if s['stimulus_units'] == 'Amps' ]) - - image_file_sets = {} - - tp_set = [] - exp_set = [] - - prev_sweep_number = None - - tp_len = 0.035 - tp_steps = int(tp_len * 200000) - - b, a = sg.bessel(4, 0.1, "low") - - for i, sweep_number in enumerate(vclamp_sweep_numbers): - logging.info("plotting sweep %d" % sweep_number) - if i == 0: - v_init, i_init, t_init, r_init, dt_init = load_experiment(nwb_file, sweep_number) - - tp_fig = plt.figure() - axTP = plt.gca() - axTP.set_yticklabels([]) - axTP.set_xticklabels([]) - axTP.set_xlabel(str(sweep_number)) - axTP.set_ylabel('') - xTP = t_init[0:tp_steps] - yTP = v_init[0:tp_steps] - axTP.plot(xTP, yTP, linewidth=1) - axTP.set_xlim(0, tp_len) -# sns.despine() - - exp_fig = plt.figure() - axDP = plt.gca() - axDP.set_yticklabels([]) - axDP.set_xticklabels([]) - axDP.set_xlabel(str(sweep_number)) - axDP.set_ylabel('') - v_exp = v_init[r_init[0]:] - t_exp = t_init[r_init[0]:] - yDP = sg.filtfilt(b, a, v_exp, axis=0) - xDP = t_exp - baseline = yDP[5000:9000] - baselineMean = np.mean(baseline) - baselineV = (np.ones(len(xDP))) * baselineMean - axDP.plot(xDP, yDP, linewidth=1) - axDP.plot(xDP, baselineV, linewidth=1) - axDP.set_xlim(t_exp[0], t_exp[-1]) -# sns.despine() - - v_prev, i_prev, t_prev, r_prev = v_init, i_init, t_init, r_init - - else: - v, i, t, r, dt = load_experiment(nwb_file, sweep_number) - - tp_fig = plt.figure() - axTP = plt.gca() - axTP.set_yticklabels([]) - axTP.set_xticklabels([]) - axTP.set_xlabel(str(sweep_number)) - axTP.set_ylabel('') - yTP = v[:tp_steps] - xTP = t[:tp_steps] - TPBL = np.mean(yTP[0:100]) - yTPN = yTP - TPBL - yTPp = v_prev[:tp_steps] - TPpBL = np.mean(yTPp[0:100]) - yTPpN = yTPp - TPpBL - yTPi = v_init[:tp_steps] - TPiBL = np.mean(yTPi[0:100]) - yTPiN = yTPi - TPiBL - axTP.plot(xTP, yTPiN, linewidth=1) - axTP.plot(xTP, yTPpN, linewidth=1) - axTP.plot(xTP, yTPN, linewidth=1) - axTP.set_xlim(0, tp_len) -# sns.despine() - - exp_fig = plt.figure() - axDP = plt.gca() - axDP.set_yticklabels([]) - axDP.set_xticklabels([]) - axDP.set_xlabel(str(sweep_number)) - axDP.set_ylabel('') - v_exp = v[r[0]:] - t_exp = t[r[0]:] - yDP = sg.filtfilt(b, a, v_exp, axis=0) - xDP = t_exp - baseline = yDP[5000:9000] - baselineMean = np.mean(baseline) - baselineV = (np.ones(len(xDP))) * baselineMean - axDP.plot(xDP, yDP, linewidth=1) - axDP.plot(xDP, baselineV, linewidth=1) - axDP.set_xlim(t_exp[0], t_exp[-1]) -# sns.despine() - - v_prev, i_prev, t_prev, r_prev = v, i, t, r - - prev_sweep_number = sweep_number - - save_figure(tp_fig, 'test_pulse_%d' % sweep_number, 'test_pulses', image_dir, sizes, image_file_sets) - save_figure(exp_fig, 'experiment_%d' % sweep_number, 'experiments', image_dir, sizes, image_file_sets) - - return image_file_sets - -def save_figure(fig, image_name, image_set_name, image_dir, sizes, image_sets, scalew=1, scaleh=1, ext='jpg'): - plt.figure(fig.number) - - if image_set_name not in image_sets: - image_sets[image_set_name] = { size_name: [] for size_name in sizes } - - for size_name, size in iteritems(sizes): - fig.set_size_inches(size*scalew, size*scaleh) - - image_file = os.path.join(image_dir, "%s_%s.%s" % (image_name, size_name, ext)) - - plt.savefig(image_file, bbox_inches="tight") - - image_sets[image_set_name][size_name].append(image_file) - - plt.close() - - -def plot_images(well_known_files, image_dir, sizes, image_sets): - wkfs = [ f for f in well_known_files if f['filename'].endswith('tif') ] - - paths = [ os.path.join(f['storage_directory'], f['filename']) for f in wkfs ] - - paths = [ lims_utilities.safe_system_path(p) for p in paths ] - - image_set_name = "images" - image_sets[image_set_name] = { size_name: [] for size_name in sizes } - - for i, path in enumerate(paths): - image_data = plt.imread(path) - image_data = np.array(image_data, dtype=np.float32) - - vmin = image_data.min() - vmax = image_data.max() - - image_data = np.array((image_data - vmin) / (vmax - vmin) * 255.0, dtype=np.uint8) - - for size_name, size in iteritems(sizes): - if size: - s = image_data.shape - skip = int(s[0] / size) - sdata = image_data[::skip, ::skip] - else: - sdata = image_data - - - filename = os.path.join(image_dir, "image_%d_%s.jpg" % (i, size_name)) - scipy.misc.imsave(filename, sdata) - - image_sets['images'][size_name].append(filename) - - -def plot_subthreshold_long_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): - lsq_sweeps = cell_features["long_squares"]["sweeps"] - sub_sweeps = cell_features["long_squares"]["subthreshold_sweeps"] - tau_sweeps = cell_features["long_squares"]["subthreshold_membrane_property_sweeps"] - - # 0a - Plot VI curve and linear fit, along with vrest - x = np.array([ s['stim_amp'] for s in sub_sweeps ]) - y = np.array([ s['peak_deflect'][0] for s in sub_sweeps ]) - i = np.array([ s['stim_amp'] for s in tau_sweeps ]) - - fig = plt.figure() - plt.scatter(x, y, color='black') - plt.plot([x.min(), x.max()], [rheo_features["vrest"], rheo_features["vrest"]], color="blue", linewidth=2) - plt.plot(i, i * 1e-3 * rheo_features["ri"] + rheo_features["vrest"], color="red", linewidth=2) - plt.xlabel("pA") - plt.ylabel("mV") - plt.title("ri = {:.1f}, vrest = {:.1f}".format(rheo_features["ri"], rheo_features["vrest"])) - plt.tight_layout() - - save_figure(fig, 'VI_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) - - # 0b - Plot tau curve and average - fig = plt.figure() - x = np.array([ s['stim_amp'] for s in tau_sweeps ]) - y = np.array([ s['tau'] for s in tau_sweeps ]) - plt.scatter(x, y, color='black') - i = np.array([ s['stim_amp'] for s in tau_sweeps ]) - plt.plot([i.min(), i.max()], [cell_features["long_squares"]["tau"], cell_features["long_squares"]["tau"]], color="red", linewidth=2) - plt.xlabel("pA") - ylim = plt.ylim() - plt.ylim(0, ylim[1]) - plt.ylabel("tau (s)") - plt.tight_layout() - - - save_figure(fig, 'tau_curve', 'subthreshold_long_squares', image_dir, sizes, cell_image_files) - - subthresh_dict = {s['id']:s for s in tau_sweeps} - - # 0c - Plot the subthreshold squares - tau_sweeps = [ s['id'] for s in tau_sweeps ] - tau_figs = [ plt.figure() for i in range(len(tau_sweeps)) ] - - for index, s in enumerate(tau_sweeps): - v, i, t, r, dt = load_experiment(nwb_file, s) - - plt.figure(tau_figs[index].number) - - plt.plot(t, v, color="black") - - if index == 0: - min_y, max_y = plt.ylim() - else: - ylims = plt.ylim() - if min_y > ylims[0]: - min_y = ylims[0] - if max_y < ylims[1]: - max_y = ylims[1] - - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) - peak_idx = subthresh_dict[s]['peak_deflect'][1] - peak_t = peak_idx*dt - plt.scatter([peak_t], [subthresh_dict[s]['peak_deflect'][0]], color='red', zorder=10) - popt = ft.fit_membrane_time_constant(v, t, stim_start, peak_t) - plt.title(str(s)) - plt.plot(t[start_idx:peak_idx], exp_curve(t[start_idx:peak_idx] - t[start_idx], *popt), color='blue') - - - for index, s in enumerate(tau_sweeps): - plt.figure(tau_figs[index].number) - plt.ylim(min_y, max_y) - plt.tight_layout() - - for index, tau_fig in enumerate(tau_figs): - save_figure(tau_figs[index], 'tau_%d' % index, 'subthreshold_long_squares', image_dir, sizes, cell_image_files) - -def plot_short_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): - repeat_amp = cell_features["short_squares"].get("stimulus_amplitude", None) - - if repeat_amp is not None: - short_square_sweep_nums = [ s['id'] for s in cell_features["short_squares"]["common_amp_sweeps"] ] - - figs = plot_single_ap_values(nwb_file, short_square_sweep_nums, - rheo_features, sweep_features, cell_features, - "short_square") - - for index, fig in enumerate(figs): - save_figure(fig, 'short_squares_%d' % index, 'short_squares', image_dir, sizes, cell_image_files) - - fig = plot_instantaneous_threshold_thumbnail(nwb_file, short_square_sweep_nums, - cell_features, rheo_features, sweep_features) - - save_figure(fig, 'instantaneous_threshold_thumbnail', 'short_squares', image_dir, sizes, cell_image_files) - - - else: - logging.warning("No short square figures to plot.") - - -def plot_instantaneous_threshold_thumbnail(nwb_file, sweep_numbers, cell_features, rheo_features, sweep_features, color='red'): - min_sweep_number = None - for sn in sorted(sweep_numbers): - spikes = get_spikes(sweep_features, sn) - - if len(spikes) > 0: - min_sweep_number = sn if min_sweep_number is None else min(min_sweep_number, sn) - - fig = plt.figure(frameon=False) - ax = plt.Axes(fig, [0., 0., 1., 1.]) - ax.set_axis_off() - fig.add_axes(ax) - ax.set_yticklabels([]) - ax.set_xticklabels([]) - ax.set_xlabel('') - ax.set_ylabel('') - - v, i, t, r, dt = load_experiment(nwb_file, sn) - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - - tstart = stim_start - 0.002 - tend = stim_start + stim_dur + 0.005 - tscale = 0.005 - - plt.plot(t, v, linewidth=1, color=color) - - plt.ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) - plt.xlim(tstart, tend) - - return fig - - -def plot_ramp_figures(nwb_file, sweep_info, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): - sweeps = sweep_info - ramps_sweeps = [ s["sweep_number"] for s in sweeps if s["workflow_state"].endswith("passed") and s["ephys_stimulus"]["description"][:10] == "C1RP25PR1S"] - - figs = [] - if len(ramps_sweeps) > 0: - figs = plot_single_ap_values(nwb_file, ramps_sweeps, rheo_features, sweep_features, cell_features, "ramp") - - for index, fig in enumerate(figs): - save_figure(fig, 'ramps_%d' % index, 'ramps', image_dir, sizes, cell_image_files) - -def plot_rheo_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): - rheo_sweeps = [ rheo_features["rheobase_sweep_num"] ] - figs = plot_single_ap_values(nwb_file, rheo_sweeps, rheo_features, sweep_features, cell_features, "long_square") - - for index, fig in enumerate(figs): - save_figure(fig, 'rheo_%d' % index, 'rheo', image_dir, sizes, cell_image_files) - -def plot_hero_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): - fig = plt.figure() - v, i, t, r, dt = load_experiment(nwb_file, int(rheo_features["thumbnail_sweep_num"])) - plt.plot(t, v, color='black') - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - plt.xlim(stim_start - 0.05, stim_start + stim_dur + 0.05) - plt.ylim(-110, 50) - spike_times = [spk['threshold_t'] for spk in get_spikes(sweep_features, rheo_features["thumbnail_sweep_num"])] - isis = np.diff(np.array(spike_times)) - plt.title("thumbnail {:d}, amp = {:.1f}".format(rheo_features["thumbnail_sweep_num"], stim_amp)) - plt.tight_layout() - - save_figure(fig, 'thumbnail_0', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) - - fig = plt.figure() - plt.plot(range(len(isis)), isis) - plt.ylabel("ISI (ms)") - if rheo_features.get("adaptation", None) is not None: - plt.title("adapt = {:.3g}".format(rheo_features["adaptation"])) - else: - plt.title("adapt = not defined") - - for k in ["has_delay", "has_burst", "has_pause"]: - if rheo_features.get(k, None) is None: - rheo_features[k] = False - - plt.tight_layout() - save_figure(fig, 'thumbnail_1', 'thumbnail', image_dir, sizes, cell_image_files) - - yvals = [ - float(rheo_features["has_delay"]), - float(rheo_features["has_burst"]), - float(rheo_features["has_pause"]), - ] - xvals = range(len(yvals)) - - fig = plt.figure() - plt.scatter(xvals, yvals, color='red') - plt.xticks(xvals, ['Delay', 'Burst', 'Pause']) - plt.title("flags") - plt.tight_layout() - - save_figure(fig, 'thumbnail_2', 'thumbnail', image_dir, sizes, cell_image_files) - - summary_fig = plot_long_square_summary(nwb_file, cell_features, rheo_features, sweep_features) - save_figure(summary_fig, 'ephys_summary', 'thumbnail', image_dir, sizes, cell_image_files, scalew=2) - - -def plot_long_square_summary(nwb_file, cell_features, rheo_features, sweep_features): - long_square_sweeps = cell_features['long_squares']['sweeps'] - long_square_sweep_numbers = [ int(s['id']) for s in long_square_sweeps ] - - thumbnail_summary_fig = plot_sweep_set_summary(nwb_file, int(rheo_features['thumbnail_sweep_num']), long_square_sweep_numbers) - plt.figure(thumbnail_summary_fig.number) - - return thumbnail_summary_fig - - -def plot_fi_curve_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): - fig = plt.figure() - fi_sorted = sorted(cell_features["long_squares"]["spiking_sweeps"], key=lambda s:s['stim_amp']) - x = [d['stim_amp'] for d in fi_sorted] - y = [d['avg_rate'] for d in fi_sorted] - last_zero_idx = np.nonzero(y)[0][0] - 1 - plt.scatter(x, y, color='black') - plt.plot(x[last_zero_idx:], cell_features["long_squares"]["fi_fit_slope"] * (np.array(x[last_zero_idx:]) - x[last_zero_idx]), color='red') - plt.xlabel("pA") - plt.ylabel("spikes/sec") - plt.title("slope = {:.3g}".format(rheo_features["f_i_curve_slope"])) - rheo_hero_sweeps = [int(rheo_features["rheobase_sweep_num"]), int(rheo_features["thumbnail_sweep_num"])] - rheo_hero_x = [] - for s in rheo_hero_sweeps: - v, i, t, r, dt = load_experiment(nwb_file, s) - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - rheo_hero_x.append(stim_amp) - rheo_hero_y = [ len(get_spikes(sweep_features, s)) for s in rheo_hero_sweeps ] - plt.scatter(rheo_hero_x, rheo_hero_y, zorder=20) - plt.tight_layout() - - save_figure(fig, 'fi_curve', 'fi_curve', image_dir, sizes, cell_image_files, scalew=2) - -def plot_sag_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files): - fig = plt.figure() - for d in cell_features["long_squares"]["subthreshold_sweeps"]: - if d['peak_deflect'][0] == rheo_features["vm_for_sag"]: - v, i, t, r, dt = load_experiment(nwb_file, int(d['id'])) - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - plt.plot(t, v, color='black') - plt.scatter(d['peak_deflect'][1], d['peak_deflect'][0], color='red', zorder=10) - #plt.plot([stim_start + stim_dur - 0.1, stim_start + stim_dur], [d['steady'], d['steady']], color='red', zorder=10) - plt.xlim(stim_start - 0.25, stim_start + stim_dur + 0.25) - plt.title("sag = {:.3g}".format(rheo_features['sag'])) - plt.tight_layout() - - save_figure(fig, 'sag', 'sag', image_dir, sizes, cell_image_files, scalew=2) - -def mask_nulls(data): - data[0, np.equal(data[0,:], None) | np.equal(data[0,:],0)] = np.nan - -def plot_sweep_value_figures(sweep_info, image_dir, sizes, cell_image_files): - sweeps = sorted(sweep_info, key=lambda s: s['sweep_number'] ) - - # plot bridge balance - data = np.array([ [ s['bridge_balance_mohm'], s['sweep_number'] ] for s in sweeps ]).T - mask_nulls(data) - - fig = plt.figure() - plt.title('bridge balance') - plt.plot(data[1,:], data[0,:], marker='.') - - save_figure(fig, 'bridge_balance', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) - - # plot pre_vm_mv, no blowout sweep - data = np.array([ [ s['pre_vm_mv'], s['sweep_number'] ] - for s in sweeps - if not s['ephys_stimulus']['description'].startswith('EXTPBLWOUT')]).T - mask_nulls(data) - - fig = plt.figure() - plt.title('pre vm') - plt.plot(data[1,:], data[0,:], marker='.') - - save_figure(fig, 'pre_vm_mv', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) - - # plot bias current - data = np.array([ [ s['leak_pa'], s['sweep_number'] ] for s in sweeps ]).T - mask_nulls(data) - - fig = plt.figure() - plt.title('leak') - plt.plot(data[1,:], data[0,:], marker='.') - - save_figure(fig, 'leak', 'sweep_values', image_dir, sizes, cell_image_files, scalew=2) - -#def plot_cell_figures(nwb_file, ephys_roi_result, image_dir, sizes): -def plot_cell_figures(nwb_file, - cell_features, - sweep_features, - rheo_features, - image_dir, - sweep_info, - sizes): - - cell_image_files = {} - - plt.style.use('ggplot') - - logging.info("saving sweep feature figures") - plot_sweep_value_figures(sweep_info, image_dir, sizes, cell_image_files) - - logging.info("saving tau and vi figs") - plot_subthreshold_long_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving short square figs") - plot_short_square_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving ramps") - plot_ramp_figures(nwb_file, sweep_info, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving rheo figs") - plot_rheo_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving thumbnail figs") - plot_hero_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving fi curve figs") - plot_fi_curve_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) - - logging.info("saving sag figs") - plot_sag_figures(nwb_file, cell_features, rheo_features, sweep_features, image_dir, sizes, cell_image_files) - - return cell_image_files - -def plot_sweep_set_summary(nwb_file, highlight_sweep_number, sweep_numbers, - highlight_color='#0779BE', background_color='#dddddd'): - - fig = plt.figure(frameon=False) - ax = plt.Axes(fig, [0., 0., 1., 1.]) - ax.set_axis_off() - fig.add_axes(ax) - ax.set_yticklabels([]) - ax.set_xticklabels([]) - ax.set_xlabel('') - ax.set_ylabel('') - - for sn in sweep_numbers: - v, i, t, r, dt = load_experiment(nwb_file, sn) - ax.plot(t, v, linewidth=0.5, color=background_color) - - v, i, t, r, dt = load_experiment(nwb_file, highlight_sweep_number) - plt.plot(t, v, linewidth=1, color=highlight_color) - - stim_start, stim_dur, stim_amp, start_idx, end_idx = get_square_stim_characteristics(i, t) - - tstart = stim_start - 0.05 - tend = stim_start + stim_dur + 0.25 - - ax.set_ylim(AXIS_Y_RANGE[0], AXIS_Y_RANGE[1]) - ax.set_xlim(tstart, tend) - - return fig - -def make_sweep_html(sweep_files, file_name): - html = "<html><body>" - html += "<a href='index.html'>Cell QC Figures</a>" - - html += "<p>page created at: %s</p>" % get_time_string() - - html += "<div style='position:absolute;width:50%;left:0;top:40'>" - if 'test_pulses' in sweep_files: - for small_img, large_img in zip(sweep_files['test_pulses']['small'], - sweep_files['test_pulses']['large']): - html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), - os.path.basename(small_img) ) - html += "</div>" - - html += "<div style='position:absolute;width:50%;right:0;top:40'>" - if 'experiments' in sweep_files: - for small_img, large_img in zip(sweep_files['experiments']['small'], - sweep_files['experiments']['large']): - html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), - os.path.basename(small_img) ) - html += "</div>" - - html += "</body></html>" - - with open(file_name, 'w') as f: - f.write(html) - -def make_cell_html(image_files, file_name, relative_sweep_link, specimen_info, fields): - - html = "<html><body>" - - html += "<h3>Specimen %d: %s</h3>" % ( specimen_info["id"], specimen_info["name"] ) - html += "<p>page created at: %s</p>" % get_time_string() - - if relative_sweep_link: - html += "<p><a href='sweep.html' target='_blank'> Sweep QC Figures </a></p>" - else: - sweep_qc_link = '/'.join([specimen_info['storage_directory'], 'qc_figures', 'sweep.html']) - sweep_qc_link = lims_utilities.safe_system_path(sweep_qc_link) - html += "<p><a href='%s' target='_blank'> Sweep QC Figures </a></p>" % sweep_qc_link - - fields_to_show = [ 'electrode_0_pa', 'seal_gohm', 'initial_access_resistance_mohm', 'input_resistance_mohm' ] - - html += "<table>" - for k,v in iteritems(fields): - html += "<tr><td>%s</td><td>%s</td></tr>" % (k, v) - html += "</table>" - - for image_file_set_name in image_files: - html += "<h3>%s</h3>" % image_file_set_name - - image_set_files = image_files[image_file_set_name] - - for small_img, large_img in zip(image_set_files['small'], image_set_files['large']): - html += "<a href='%s' target='_blank'><img src='%s'></img></a>" % ( os.path.basename(large_img), - os.path.basename(small_img) ) - html += ("</body></html>") - - with open(file_name, 'w') as f: - f.write(html) - -def make_sweep_page(nwb_file, working_dir, sweep_data): - sizes = { 'small': 2.0, 'large': 6.0 } - - sweep_files = plot_sweep_figures( - nwb_file=nwb_file, - sweep_data=sweep_data, - image_dir=working_dir, - sizes=sizes) - - make_sweep_html(sweep_files, - os.path.join(working_dir, 'sweep.html')) - -#def make_cell_page(nwb_file, ephys_roi_result, working_dir, save_cell_plots=True): -def make_cell_page(nwb_file, cell_features, rheo_features, sweep_features, sweep_info, well_known_files, specimen_info, working_dir, fields_to_show, save_cell_plots=True): - """ nwb_file: name of nwb file (string) - - cell_features: - - rheo_features: dict containing extracted features from rheobase sweep - - sweep_features: - - sweep_info: - - well_known_files: LIMS-output information containing graphics - file names - - working_dir: - - save_cell_plots: - - """ - - if save_cell_plots: - sizes = { 'small': 2.0, 'large': 6.0 } - cell_files = plot_cell_figures( - nwb_file = nwb_file, - cell_features = cell_features, - rheo_features = rheo_features, - sweep_features = sweep_features, - sweep_info = sweep_info, - image_dir = working_dir, - sizes = sizes) - else: - cell_files = {} - - logging.info("saving images") - sizes = { 'small': 200, 'large': None } - plot_images(well_known_files, working_dir, sizes, cell_files) - - sweep_page = os.path.join(working_dir, 'sweep.html') - relative_sweep_link = os.path.exists(sweep_page) - - if not relative_sweep_link: - logging.info("sweep page doesn't exist, point to production sweep page") - - make_cell_html(cell_files, - os.path.join(working_dir, 'index.html'), - relative_sweep_link, - specimen_info, - fields_to_show) - -def exp_curve(x, a, inv_tau, y0): - ''' Function used for tau curve fitting ''' - return y0 + a * np.exp(-inv_tau * x) - - -#def main(): -# parser = argparse.ArgumentParser(description='analyze specimens for cell-wide features') -# parser.add_argument('nwb_file') -# parser.add_argument('feature_json') -# parser.add_argument('--output_directory', default='.') -# parser.add_argument('--no-sweep-page', action='store_false', dest='sweep_page') -# parser.add_argument('--no-cell-page', action='store_false', dest='cell_page') -# parser.add_argument('--log_level') -# -# -# args = parser.parse_args() -# -# if args.log_level: -# logging.getLogger().setLevel(args.log_level) -# -# ephys_roi_result = json_utilities.read(args.feature_json) -# -# if args.sweep_page: -# logging.debug("making sweep page") -# make_sweep_page(args.nwb_file, ephys_roi_result, args.output_directory) -# -# if args.cell_page: -# logging.debug("making cell page") -# make_cell_page(args.nwb_file, ephys_roi_result, args.output_directory, True) -# -# -# -#if __name__ == '__main__': main() diff --git a/allensdk/internal/model/AIC.py b/allensdk/internal/model/AIC.py deleted file mode 100644 index 70698b9a83..0000000000 --- a/allensdk/internal/model/AIC.py +++ /dev/null @@ -1,33 +0,0 @@ -import numpy as np - -""" -TODO: license -TODO: comment style -""" - -def AIC(RSS, k, n): - """ - Computes the Akaike Information Criterion. - - RSS-residual sum of squares of the fitting errors. - k - number of fitted parameters. - n - number of observations. - """ - AIC = 2 * k + n * np.log( RSS/n) - return AIC - -def AICc(RSS, k, n): - """ - Corrected AIC. formula from Wikipedia. - """ - retval = AIC(RSS, k, n) - if n-k-1 != 0: - retval += 2.0 *k* (k+1)/ (n-k-1) - return retval - -def BIC(RSS, k, n): - """ - Bayesian information criterion or Schwartz information criterion. - Formula from wikipedia. - """ - return n * np.log(RSS/n) + k * np.log(n) diff --git a/allensdk/internal/model/GLM.py b/allensdk/internal/model/GLM.py deleted file mode 100644 index 046ca0e702..0000000000 --- a/allensdk/internal/model/GLM.py +++ /dev/null @@ -1,148 +0,0 @@ -import numpy as np -import numpy.fft as npft - -# TODO: license -# TODO: normalize function call names -# TODO: document functions - -def create_basis_IPSP(neye,ncos,kpeaks,ks,DTsim,t0,I_stim,nkt,flag_exp,npcut): - - kbasprs = {} - kbasprs['neye'] = neye #No of 'identity' basis vectors near time of spike - kbasprs['ncos'] = ncos #No of raised-cosines to use - kbasprs['kpeaks'] = kpeaks #Position of first and last bump - kbasprs['b'] = 0.1 #Offset for non-linear scaling - kbasprs['ks'] = ks - - gg0 = makeFitStruct_GLM(DTsim,kbasprs,nkt,flag_exp) - - #Create spike-stim with which to convolve post spike filter - spike_stim = np.zeros(np.shape(I_stim)) - for kk in range(len(t0)): - spind = int(t0[kk]) - #print int(t0[kk]), spind-190000 - spike_stim[spind]=1.0 - - ##Convolve temporal basis functions with spike-stim - c = np.zeros((len(spike_stim),ncos)) - for jj in range(ncos): - basisfilt = gg0['ktbas'][:,jj] - bconv = np.convolve(spike_stim,np.flipud(basisfilt),'full') - c[:,jj] = bconv[range(len(spike_stim))] - - basis_IPSP = c; - - return basis_IPSP, gg0 - -def makeFitStruct_GLM(dtsim,kbasprs,nkt,flag_exp): - - gg = {} - gg['k'] = [] - gg['dc'] = 0 - gg['kt'] = np.zeros((nkt,1)) - gg['ktbas'] = [] - gg['kbasprs'] = kbasprs - gg['dt'] = dtsim - - nkt = nkt - if flag_exp==0: - ktbas = makeBasis_StimKernel(kbasprs,nkt) - else: - ktbas = makeBasis_StimKernel_exp(kbasprs,nkt) - - gg['ktbas'] = ktbas - gg['k'] = gg['ktbas']*gg['kt'] - - return gg - -def makeBasis_StimKernel(kbasprs,nkt): - - neye = kbasprs['neye'] - ncos = kbasprs['ncos'] - kpeaks = kbasprs['kpeaks'] - kdt = 1 - b = kbasprs['b'] - - yrnge = nlin(kpeaks + b*np.ones(np.shape(kpeaks))) - #db = np.diff(yrnge)/(ncos-1) - db = (yrnge[-1]-yrnge[0])/(ncos-1) - ctrs = yrnge - mxt = invnl(yrnge[ncos-1]+2*db)-b - print(mxt) - kt0 = np.arange(0,mxt,kdt) - nt = len(kt0) - e1 = np.tile(nlin(kt0+b*np.ones(np.shape(kt0))),(ncos,1)) - e2 = np.transpose(e1) - e3 = np.tile(ctrs,(nt,1)) - kbasis0 = [] - for kk in range(ncos): - kbasis0.append(ff(e2[:,kk],e3[:,kk],db)) - - - #Concatenate identity vectors - nkt0 = np.size(kt0,0) - a1 = np.concatenate((np.eye(neye), np.zeros((nkt0,neye))),axis=0) - a2 = np.concatenate((np.zeros((neye,ncos)),np.array(kbasis0).T),axis=0) - kbasis = np.concatenate((a1,a2),axis=1) - kbasis = np.flipud(kbasis) - nkt0 = np.size(kbasis,0) - - if nkt0 < nkt: - kbasis = np.concatenate((np.zeros((nkt-nkt0,ncos+neye)),kbasis),axis=0) - elif nkt0 > nkt: - kbasis = kbasis[-1-nkt:-1,:] - - kbasis = normalizecols(kbasis) - - return kbasis - - -def makeBasis_StimKernel_exp(kbasprs,nkt): - ks = kbasprs['ks'] - b = kbasprs['b'] - x0 = np.arange(0,nkt) - kbasis = np.zeros((nkt,len(ks))) - for ii in range(len(ks)): - kbasis[:,ii] = invnl(-ks[ii]*x0) #(1.0/ks[ii])* - - kbasis = np.flipud(kbasis) - return kbasis - -def nlin(x): - eps = 1e-20 - return np.log(x+eps) - -def invnl(x): - eps = 1e-20 - return np.exp(x)-eps - -def ff(x,c,dc): - rowsize = np.size(x,0) - m = [] - for i in range(rowsize): - xi = x[i] - ci = c[i] - val=(np.cos(np.max([-pi,np.min([pi,(xi-ci)*pi/dc/2])]))+1)/2 - m.append(val) - - return np.array(m) - -def normalizecols(A): - - B = A/np.tile(np.sqrt(sum(A**2,0)),(np.size(A,0),1)) - - return B - -def sameconv(A,B): - - am = np.size(A) - bm = np.size(B) - nn = am+bm-1 - - q = npft.fft(A,nn)*npft.fft(np.flipud(B),nn) - p = q - G = npft.ifft(p) - G = G[range(am)] - - return G - diff --git a/allensdk/internal/model/__init__.py b/allensdk/internal/model/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/model/biophysical/__init__.py b/allensdk/internal/model/biophysical/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/model/biophysical/biophysical_archiver.py b/allensdk/internal/model/biophysical/biophysical_archiver.py deleted file mode 100644 index cbdeb090d8..0000000000 --- a/allensdk/internal/model/biophysical/biophysical_archiver.py +++ /dev/null @@ -1,89 +0,0 @@ -from allensdk.api.queries.biophysical_api import \ - BiophysicalApi -from allensdk.api.queries.cell_types_api import CellTypesApi -from allensdk.api.queries.rma_api import RmaApi -import os, sys, shutil - - -#bp = BiophysicalApi('http://api.brain-map.org') -#bp.cache_stimulus = True # change to False to not download the large stimulus NWB file -# neuronal_model_id = 472451419 # get this from the web site as above -# bp.cache_data(neuronal_model_id, working_directory='neuronal_model') - -# According to this there are 49 biophysical models. -# http://api.brain-map.org/api/v2/data/query.json?q=model::NeuronalModel,rma::include,neuronal_model_template[name$eq%27Biophysical%20-%20perisomatic%27],rma::options[num_rows$eqall] - -# Note, am I supposed to be only archiving Biophysical models or also GLIFs? - -class BiophysicalArchiver(object): - def __init__(self, archive_dir=None): - self.bp = BiophysicalApi('http://api.brain-map.org') - self.bp.cache_stimulus = True # change to False to not download the large stimulus NWB file - self.cta = CellTypesApi() - self.rma = RmaApi() - self.neuronal_model_download_endpoint = 'http://celltypes.brain-map.org/neuronal_model/download/' - self.template_names = {} - self.nwb_list = [] - - if archive_dir == None: - archive_dir = '.' - self.archive_dir = archive_dir - - def get_template_names(self): - template_response = self.rma.model_query('NeuronalModelTemplate') - self.template_names = { t['id']: str(t['name']).replace(' ', '_') for t in template_response} - - def get_cells(self): - return self.cta.list_cells(True, True) - - def get_neuronal_models(self, specimen_ids): - return self.rma.model_query('NeuronalModel', - criteria='specimen[id$in%s]' % ','.join(str(i) for i in specimen_ids), - include='specimen', - num_rows='all') - - def get_stimulus_file(self, neuronal_model_id): - result = self.rma.model_query('NeuronalModel', - criteria='[id$eq%d]' % (neuronal_model_id), - include="specimen(ephys_result(well_known_files(well_known_file_type[name$il'NWB*'])))", - tabular=['path']) - - stimulus_filename = result[0]['path'] - - return stimulus_filename - - - stimulus_filename = os.path.basename(result[0]['path']) - - return stimulus_filename - - def archive_cell(self, ephys_result_id, specimen_id, template, neuronal_model_id): - url = self.neuronal_model_download_endpoint + "/%d" % (neuronal_model_id) - file_name = os.path.join(self.archive_dir, 'ephys_result_%d_specimen_%d_%s_neuronal_model_%d.zip' % (ephys_result_id, - specimen_id, - template, - neuronal_model_id)) - self.rma.retrieve_file_over_http(url, file_name) - nwb_file = self.get_stimulus_file(neuronal_model_id) - shutil.copy(nwb_file, self.archive_dir) - self.nwb_list.append("%s\t%s" % (os.path.basename(nwb_file), - file_name)) - -if __name__ == '__main__': - archive_dir = sys.argv[-1] # /data/informatics/mousecelltypes/model_cache_may_2015 - ba = BiophysicalArchiver(archive_dir) - ba.get_template_names() - cells = ba.get_cells() - - specimen_ids = (cell['id'] for cell in cells) - neuronal_models = ba.get_neuronal_models(specimen_ids) - for nm in neuronal_models: - ephys_result_id = nm['specimen']['ephys_result_id'] - template_id = nm['neuronal_model_template_id'] - if template_id in ba.template_names: - template = ba.template_names[template_id] - else: - template = 'unknown' - ba.archive_cell(ephys_result_id, nm['specimen_id'], template, nm['id']) - with open(os.path.join(ba.archive_dir, 'STIMULUS.csv'), 'w') as f: - f.write("\n".join(ba.nwb_list)) \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/check_fi_shift.py b/allensdk/internal/model/biophysical/check_fi_shift.py deleted file mode 100755 index 3b4b4d5f90..0000000000 --- a/allensdk/internal/model/biophysical/check_fi_shift.py +++ /dev/null @@ -1,83 +0,0 @@ -import numpy as np -from collections import Counter -from allensdk.ephys.feature_extractor import EphysFeatureExtractor -import allensdk.internal.model.biophysical.ephys_utils as ephys_utils - -def calculate_fi_curves(data_set, sweeps): - - sweep_type = "C1LSCOARSE" - _, sweep_numbers, statuses = ephys_utils.get_sweeps_of_type(sweep_type, sweeps) - features = EphysFeatureExtractor() - - coarse_fi_curve = [] - sweep_status = dict(zip(sweep_numbers, statuses)) - - for s in sweep_numbers: - if sweep_status[s] in [ 'auto_failed', 'manual_failed' ]: - continue - - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) - if np.all(v[-100:] == 0): - continue - stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) - features.process_instance(s, v, i, t, stim_start, stim_dur, "") - coarse_fi_curve.append((stim_amp, features.feature_list[-1].mean["n_spikes"] / stim_dur)) - - sweep_type = "C2SQRHELNG" - core2_fi_curve = [] - core2_half_fi_curve = [] - _, sweep_numbers, statuses = ephys_utils.get_sweeps_of_type(sweep_type, sweeps) - sweep_status = dict(zip(sweep_numbers, statuses)) - core2_amps = {} - amp_list = [] - for s in sweep_numbers: - if sweep_status[s] in [ 'auto_failed', 'manual_failed' ]: - continue - - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) - if np.all(v[-100:] == 0): - continue - stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) - if stim_start is np.nan: - sweep_status[s] = "manual_failed" - continue - core2_amps[s] = stim_amp - amp_list.append(stim_amp) - - core2_amp_counter = Counter(amp_list) - common_amps = core2_amp_counter.most_common(3) - - features = EphysFeatureExtractor() - for amp, count in common_amps: - for k in core2_amps: - if core2_amps[k] == amp and sweep_status[k][-6:] == "passed": - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, k) - stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) - features.process_instance(s, v, i, t, stim_start, stim_dur, "") - core2_fi_curve.append((amp, features.feature_list[-1].mean["n_spikes"] / stim_dur)) - first_half_spike_count = len([spk for spk in features.feature_list[-1].mean["spikes"] if spk["t"] < stim_start + stim_dur / 2.0]) - core2_half_fi_curve.append((amp, first_half_spike_count / (stim_dur / 2.0))) - - return { "coarse": coarse_fi_curve, "core2": core2_fi_curve, "core2_half": core2_half_fi_curve } - -def estimate_fi_shift(data_set, sweeps): - curve_data = calculate_fi_curves(data_set, sweeps) - - # Linear fit to original fI curve - coarse_fi_sorted = sorted(curve_data["coarse"], key=lambda d: d[0]) - x = np.array([d[0] for d in coarse_fi_sorted], dtype=np.float64) - y = np.array([d[1] for d in coarse_fi_sorted], dtype=np.float64) - - if len(np.flatnonzero(y)) == 0: # original curve is all zero, so can't figure out shift - return np.nan, 0 - - last_zero_index = np.flatnonzero(y)[0] - 1 - A = np.vstack([x[last_zero_index:], np.ones(len(x[last_zero_index:]))]).T - m, c = np.linalg.lstsq(A, y[last_zero_index:])[0] - - # Relative error of later traces to best-fit line - if len(curve_data["core2_half"]) < 1: - return np.nan, 0 - # FIX TO RECTIFY PREDICTED FI CURVE - x_shift = [amp - (freq - c) / m for amp, freq in curve_data["core2_half"]] - return np.mean(x_shift), len(x_shift) diff --git a/allensdk/internal/model/biophysical/deap_utils.py b/allensdk/internal/model/biophysical/deap_utils.py deleted file mode 100644 index 1f8f3c9100..0000000000 --- a/allensdk/internal/model/biophysical/deap_utils.py +++ /dev/null @@ -1,226 +0,0 @@ -from allensdk.model.biophys_sim.neuron.hoc_utils import HocUtils -from allensdk.ephys.ephys_extractor import EphysSweepFeatureExtractor -import logging - -import numpy as np - -class Utils(HocUtils): - _log = logging.getLogger(__name__) - - def __init__(self, description): - super(Utils, self).__init__(description) - self.stim = None - self.stim_curr = None - self.sampling_rate = None - self.cell = self.h.cell() - - def generate_morphology(self, morph_filename): - h = self.h - cell = self.cell - - swc = self.h.Import3d_SWC_read() - swc.quiet = 1 - swc.input(str(morph_filename)) - imprt = self.h.Import3d_GUI(swc, 0) - imprt.instantiate(cell) - - for seg in cell.soma[0]: - seg.area() - - for sec in cell.all: - sec.nseg = 1 + 2 * int(sec.L / 40) - - cell.simplify_axon() - for sec in cell.axonal: - sec.L = 30 - sec.diam = 1 - sec.nseg = 1 + 2 * int(sec.L / 40) - cell.axon[0].connect(cell.soma[0], 0.5, 0) - cell.axon[1].connect(cell.axon[0], 1, 0) - h.define_shape() - - def load_cell_parameters(self): - cell = self.cell - passive = self.description.data['passive'][0] - conditions = self.description.data['conditions'][0] - channels = self.description.data['channels'] - addl_params = self.description.data['addl_params'] - - # Set passive properties - for sec in cell.all: - sec.Ra = passive['ra'] - sec.cm = passive['cm'][sec.name().split(".")[1][:4]] - sec.insert('pas') - for seg in sec: - seg.pas.e = passive["e_pas"] - self.h.v_init = passive["e_pas"] - - # Insert channels and set parameters - for c in channels: - if c["mechanism"] != "": - sections = [s for s in cell.all if s.name().split(".")[1][:4] == c["section"]] - for sec in sections: - sec.insert(c["mechanism"]) - - for ap in addl_params: - if ap["mechanism"] != "": - sections = [s for s in cell.all if s.name().split(".")[1][:4] == ap["section"]] - for sec in sections: - sec.insert(ap["mechanism"]) - - # Set reversal potentials - for erev in conditions['erev']: - sections = [s for s in cell.all if s.name().split(".")[1][:4] == erev["section"]] - for sec in sections: - sec.ena = erev["ena"] - sec.ek = erev["ek"] - - def set_normalized_parameters(self, params): - channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] - for i, p in enumerate(params): - c = channels_and_others[i] - value = p * (c["max"] - c["min"]) + c["min"] - sections = [s for s in self.cell.all if s.name().split(".")[1][:4] == c["section"]] - for sec in sections: - param_name = c["parameter"] - if c["mechanism"] != "": - param_name += "_" + c["mechanism"] - setattr(sec, param_name, value) - - def set_actual_parameters(self, params): - channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] - for i, p in enumerate(params): - c = channels_and_others[i] - sections = [s for s in self.cell.all if s.name().split(".")[1][:4] == c["section"]] - for sec in sections: - param_name = c["parameter"] - if c["mechanism"] != "": - param_name += "_" + c["mechanism"] - setattr(sec, param_name, p) - - def normalize_actual_parameters(self, params): - params_array = np.array(params) - channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] - max_vals = np.array([c["max"] for c in channels_and_others]) - min_vals = np.array([c["min"] for c in channels_and_others]) - - normalized_params = (params_array - min_vals) / (max_vals - min_vals) - return normalized_params.tolist() - - def actual_parameters_from_normalized(self, params): - actual_params = [] - channels_and_others = self.description.data['channels'] + self.description.data['addl_params'] - for i, p in enumerate(params): - c = channels_and_others[i] - value = p * (c["max"] - c["min"]) + c["min"] - actual_params.append(value) - return actual_params - - def insert_iclamp(self): - self.stim = self.h.IClamp(self.cell.soma[0](0.5)) - - def set_iclamp_params(self, amp, delay, dur): - self.stim.amp = amp - self.stim.delay = delay - self.stim.dur = dur - - def calculate_feature_errors(self, t_ms, v, i): - # Special case checks and penalty values - minimum_num_spikes = 2 - missing_penalty_value = 20.0 - max_fail_penalty = 250.0 - min_fail_penalty = 75.0 - overkill_reduction = 0.75 - variance_factor = 0.1 - - fail_trace = False - - delay = self.stim.delay * 1e-3 - duration = self.stim.dur * 1e-3 - t = t_ms * 1e-3 - feature_names = self.description.data['features'] - - # penalize for failing to return to rest - start_index = np.flatnonzero(t >= delay)[0] - if np.abs(v[-1] - v[:start_index].mean()) > 2.0: - fail_trace = True - else: - swp = EphysSweepFeatureExtractor(t, v, i, start=0, end=delay, filter=None) - swp.process_spikes() - if swp.sweep_feature("avg_rate") > 0: - fail_trace = True - - target_features = self.description.data['target_features'] - target_features_dict = {f["name"]: {"mean": f["mean"], "stdev": f["stdev"]} for f in target_features} - - if not fail_trace: - swp = EphysSweepFeatureExtractor(t, v, i, start=delay, end=(delay + duration), filter=None) - swp.process_spikes() - if len(swp.spikes()) < minimum_num_spikes: # Enough spikes? - fail_trace = True - else: - avg_per_spike_peak_error = np.mean([abs(spk["peak_v"] - target_features_dict["peak_v"]["mean"]) for spk in swp.spikes()]) - avg_overall_error = abs(target_features_dict["peak_v"]["mean"] - swp.spike_feature("peak_v").mean()) - if avg_per_spike_peak_error > 3.0 * avg_overall_error: # Weird bi-modality of spikes; 3.0 is arbitrary - fail_trace = True - - if fail_trace: - variance_start = np.flatnonzero(t >= delay - 0.1)[0] - variance_end = np.flatnonzero(t >= (delay + duration) / 2.0)[0] - trace_variance = v[variance_start:variance_end].var() - error_value = max(max_fail_penalty - trace_variance * variance_factor, min_fail_penalty) - errs = np.ones(len(feature_names)) * error_value - else: - errs = [] - - # Calculate additional features not done by swp.process_spikes() - baseline_v = swp.sweep_feature("v_baseline") - other_features = {} - threshold_t = swp.spike_feature("threshold_t") - fast_trough_t = swp.spike_feature("fast_trough_t") - slow_trough_t = swp.spike_feature("slow_trough_t") - - delta_t = slow_trough_t - fast_trough_t - delta_t[np.isnan(delta_t)] = 0. - other_features["slow_trough_delta_time"] = np.mean(delta_t[:-1] / np.diff(threshold_t)) - - fast_trough_v = swp.spike_feature("fast_trough_v") - slow_trough_v = swp.spike_feature("slow_trough_v") - delta_v = fast_trough_v - slow_trough_v - delta_v[np.isnan(delta_v)] = 0. - other_features["slow_trough_delta_v"] = delta_v.mean() - - for f in feature_names: - target_mean = target_features_dict[f]['mean'] - target_stdev = target_features_dict[f]['stdev'] - - if target_stdev == 0: - print("Feature with 0 stdev: ", f) - - if f in swp.spike_feature_keys(): - model_mean = swp.spike_feature(f).mean() - elif f in swp.sweep_feature_keys(): - model_mean = swp.sweep_feature(f) - elif f in other_features: - model_mean = other_features[f] - else: - model_mean = np.nan - - if np.isnan(model_mean): - errs.append(missing_penalty_value) - else: - errs.append(np.abs((model_mean - target_mean) / target_stdev)) - - errs = np.array(errs) - return errs - - def record_values(self): - v_vec = self.h.Vector() - t_vec = self.h.Vector() - i_vec = self.h.Vector() - - v_vec.record(self.cell.soma[0](0.5)._ref_v) - i_vec.record(self.stim._ref_amp) - t_vec.record(self.h._ref_t) - - return v_vec, i_vec, t_vec diff --git a/allensdk/internal/model/biophysical/ephys_utils.py b/allensdk/internal/model/biophysical/ephys_utils.py deleted file mode 100644 index 1f02307d76..0000000000 --- a/allensdk/internal/model/biophysical/ephys_utils.py +++ /dev/null @@ -1,39 +0,0 @@ -import numpy as np - -def get_sweep_v_i_t_from_set(data_set, sweep_number): - sweep_data = data_set.get_sweep(sweep_number) - i = sweep_data["stimulus"] # in A - v = sweep_data["response"] # in V - i *= 1e12 # to pA - v *= 1e3 # to mV - sampling_rate = sweep_data["sampling_rate"] # in Hz - t = np.arange(0, len(v)) * (1.0 / sampling_rate) - return v, i, t - -def get_sweeps_of_type(sweep_type, sweeps): - sweeps = [ s for s in sweeps if s['ephys_stimulus']['description'].startswith( sweep_type )] - sweep_numbers = [ s['sweep_number'] for s in sweeps ] - statuses = [ s['workflow_state'] for s in sweeps ] - - return sweeps, sweep_numbers, statuses - -def get_step_stim_characteristics(i, t): - # Assumes that there is a test pulse followed by the stimulus step - di = np.diff(i) - up_idx = np.flatnonzero(di > 0) - down_idx = np.flatnonzero(di < 0) - - # second step is the stimulus - if len(up_idx) < 2 or len(down_idx) < 2: - return (np.nan, np.nan, np.nan, np.nan, np.nan) - - if up_idx[1] < down_idx[1]: # positive step - start_idx = up_idx[1] + 1 # shift by one to compensate for diff() - end_idx = down_idx[1] + 1 - else: # negative step - start_idx = down_idx[1] + 1 - end_idx = up_idx[1] + 1 - stim_start = float(t[start_idx]) - stim_dur = float(t[end_idx] - t[start_idx]) - stim_amp = float(i[start_idx]) - return (stim_start, stim_dur, stim_amp, start_idx, end_idx) diff --git a/allensdk/internal/model/biophysical/fit_stage_1.py b/allensdk/internal/model/biophysical/fit_stage_1.py deleted file mode 100644 index 2b169c0bfd..0000000000 --- a/allensdk/internal/model/biophysical/fit_stage_1.py +++ /dev/null @@ -1,397 +0,0 @@ -import os -import sys -import allensdk.internal.model.biophysical.ephys_utils as ephys_utils -from . import check_fi_shift -import pandas as pd -import numpy as np -from collections import Counter -import subprocess - -from allensdk.ephys.ephys_extractor \ - import EphysSweepFeatureExtractor, EphysSweepSetFeatureExtractor -import allensdk.core.json_utilities as ju -from allensdk.core.nwb_data_set import NwbDataSet -import allensdk.internal.model.biophysical.optimize as optimize -import logging - -SEEDS = [1234, 1001, 4321, 1024, 2048] -FIT_BASE_DIR = os.path.join(os.path.dirname(__file__), "fits") -APICAL_DENDRITE_TYPE = 4 -MPIEXEC = 'mpiexec' -DEFAULT_NUM_PROCESSES = 240 - -_fit_stage_1_log = logging.getLogger('allensdk.model.biophysical.fit_stage_1') - -def find_core1_trace(data_set, all_sweeps): - sweep_type = "C1LSCOARSE" - _, sweeps, statuses = ephys_utils.get_sweeps_of_type(sweep_type, all_sweeps) - sweep_status = dict(zip(sweeps, statuses)) - - sweep_info = {} - for s in sweeps: - if sweep_status[s][-6:] == "failed": - continue - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) - if np.all(v[-100:] == 0): # Check for early termination of sweep - continue - stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) - swp = EphysSweepFeatureExtractor(t, v, i, start=stim_start, end=(stim_start + stim_dur)) - swp.process_spikes() - isi_cv = swp.sweep_feature("isi_cv", allow_missing=True) - sweep_info[s] = {"amp": stim_amp, - "n_spikes": len(swp.spikes()), - "quality": is_trace_good_quality(v, i, t), - "isi_cv": isi_cv} - - rheobase_amp = 1e12 - for s in sweep_info: - if sweep_info[s]["amp"] < rheobase_amp and sweep_info[s]["n_spikes"] > 0: - rheobase_amp = sweep_info[s]["amp"] - sweep_to_use_amp = 1e12 - sweep_to_use_isi_cv = 1e121 - sweep_to_use = -1 - for s in sweep_info: - if sweep_info[s]["quality"] and sweep_info[s]["amp"] >= 39.0 + rheobase_amp and sweep_info[s]["isi_cv"] < 1.2 * sweep_to_use_isi_cv: - use_new_sweep = False - if sweep_to_use_isi_cv > 0.3 and ((sweep_to_use_isi_cv - sweep_info[s]["isi_cv"]) / sweep_to_use_isi_cv) >= 0.2: - use_new_sweep = True - elif sweep_info[s]["amp"] < sweep_to_use_amp: - use_new_sweep = True - if use_new_sweep: - _fit_stage_1_log.info("now using sweep" + str(s)) - sweep_to_use = s - sweep_to_use_amp = sweep_info[s]["amp"] - sweep_to_use_isi_cv = sweep_info[s]["isi_cv"] - - if sweep_to_use == -1: - _fit_stage_1_log.warn("Could not find appropriate core 1 sweep!") - return [] - else: - return [sweep_to_use] - -def find_core2_trace(data_set, all_sweeps): - sweep_type = "C2SQRHELNG" - _, sweeps, statuses = ephys_utils.get_sweeps_of_type(sweep_type, all_sweeps) - sweep_status = dict(zip(sweeps, statuses)) - amp_list = [] - core2_amps = {} - for s in sweeps: - if sweep_status[s][-6:] == "failed": - continue - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) - if np.all(v[-100:] == 0): - continue - stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) - if stim_start is np.nan: - sweep_status[s] = "manual_failed" - continue - core2_amps[s] = stim_amp - amp_list.append(stim_amp) - core2_amp_counter = Counter(amp_list) - common_amps = core2_amp_counter.most_common(3) - best_amp = 0 - best_n_good = -1 - for amp, _ in common_amps: - n_good = 0 - for k in core2_amps: - if core2_amps[k] == amp and sweep_status[k][-6:] == "passed": - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, k) - if is_trace_good_quality(v, i, t): - n_good += 1 - if n_good > best_n_good: - best_n_good = n_good - best_amp = amp - elif n_good == best_n_good and amp < best_amp: - best_amp = amp - if best_n_good <= 1: - return [] - else: - sweeps_to_fit = [] - for k in core2_amps: - if core2_amps[k] == best_amp and sweep_status[k][-6:] == "passed": - sweeps_to_fit.append(k) - return sweeps_to_fit - -def is_trace_good_quality(v, i, t): - stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) - swp = EphysSweepFeatureExtractor(t, v, i, start=stim_start, end=(stim_start + stim_dur)) - swp.process_spikes() - - spikes = swp.spikes() - rate = swp.sweep_feature("avg_rate") - - if rate < 5.0: - return False - - time_to_end = stim_start + stim_dur - spikes[-1]["threshold_t"] - avg_end_isi = (((spikes[-1]["threshold_t"] - spikes[-2]["threshold_t"]) + - (spikes[-2]["threshold_t"] - spikes[-3]["threshold_t"])) / 2.0) - - if time_to_end > 2 * avg_end_isi: - return False - - isis = np.diff([spk["threshold_t"] for spk in spikes]) - if check_for_pause(isis): - return False - - return True - - -def check_for_pause(isis): - if len(isis) <= 2: - return False - - for i, isi in enumerate(isis[1:-1]): - if isi > 3 * isis[i + 1 - 1] and isi > 3 * isis[i + 1 + 1]: - return True - return False - - -def collect_target_features(ft): - min_std_dict = { - 'avg_rate': 0.5, - 'adapt': 0.001, - 'peak_v': 2.0, - 'trough_v': 2.0, - 'fast_trough_v': 2.0, - 'slow_trough_delta_v': 2.0, - 'slow_trough_delta_time': 0.05, - 'latency': 5.0, - 'isi_cv': 0.1, - 'mean_isi': 0.5, - 'first_isi': 1.0, - 'time_to_end': 50.0, - 'v_baseline': 2.0, - 'width': 0.0001, - 'upstroke': 50.0, - 'downstroke': 50.0, - 'upstroke_v': 2.0, - 'downstroke_v': 2.0, - 'threshold_v': 2.0, - 'peak_to_fast_tr_time': 0.0005, - 'phase_slope': 5.0, - } - - target_features = [] - for k in ft: - t = {"name": k, "mean": ft[k]["mean"], "stdev": ft[k]["stdev"]} - if k in min_std_dict and min_std_dict[k] > ft[k]["stdev"]: - t["stdev"] = min_std_dict[k] - target_features.append(t) - return target_features - - -def prepare_stage_1(description, passive_fit_data): - output_directory = description.manifest.get_path('WORKDIR') - neuronal_model_data = ju.read(description.manifest.get_path('neuronal_model_data')) - specimen_data = neuronal_model_data['specimen'] - specimen_id = neuronal_model_data['specimen_id'] - is_spiny = not any(t['name'] == u'dendrite type - aspiny' for t in specimen_data['specimen_tags']) - all_sweeps = specimen_data['ephys_sweeps'] - data_set = NwbDataSet(description.manifest.get_path('stimulus_path')) - swc_path = description.manifest.get_path('MORPHOLOGY') - - if not os.path.exists(output_directory): - os.makedirs(output_directory) - - ra = passive_fit_data['ra'] - cm1 = passive_fit_data['cm1'] - cm2 = passive_fit_data['cm2'] - - # Check for fi curve shift to decide to use core1 or core2 - fi_shift, n_core2 = check_fi_shift.estimate_fi_shift(data_set, all_sweeps) - fi_shift_threshold = 30.0 - sweeps_to_fit = [] - if abs(fi_shift) > fi_shift_threshold: - _fit_stage_1_log.info("FI curve shifted; using Core 1") - sweeps_to_fit = find_core1_trace(data_set, all_sweeps) - else: - sweeps_to_fit = find_core2_trace(data_set, all_sweeps) - - if sweeps_to_fit == []: - _fit_stage_1_log.info("Not enough good Core 2 traces; using Core 1") - sweeps_to_fit = find_core1_trace(data_set, all_sweeps) - - _fit_stage_1_log.debug("will use sweeps: " + str(sweeps_to_fit)) - - jxn = -14.0 - - t_set = [] - v_set = [] - i_set = [] - for s in sweeps_to_fit: - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s) - v += jxn - stim_start, stim_dur, stim_amp, start_idx, end_idx = ephys_utils.get_step_stim_characteristics(i, t) - t_set.append(t) - v_set.append(v) - i_set.append(i) - ext = EphysSweepSetFeatureExtractor(t_set, v_set, i_set, start=stim_start, end=(stim_start + stim_dur)) - ext.process_spikes() - - ft = {} - blacklist = ["isi_type"] - for k in ext.sweeps()[0].spike_feature_keys(): - if k in blacklist: - continue - pair = {} - pair["mean"] = float(ext.spike_feature_averages(k).mean()) - pair["stdev"] = float(ext.spike_feature_averages(k).std()) - ft[k] = pair - - # "Delta" features - sweep_avg_slow_trough_delta_time = [] - sweep_avg_slow_trough_delta_v = [] - sweep_avg_peak_trough_delta_time = [] - for swp in ext.sweeps(): - threshold_t = swp.spike_feature("threshold_t") - fast_trough_t = swp.spike_feature("fast_trough_t") - slow_trough_t = swp.spike_feature("slow_trough_t") - - delta_t = slow_trough_t - fast_trough_t - delta_t[np.isnan(delta_t)] = 0. - sweep_avg_slow_trough_delta_time.append(np.mean(delta_t[:-1] / np.diff(threshold_t))) - - fast_trough_v = swp.spike_feature("fast_trough_v") - slow_trough_v = swp.spike_feature("slow_trough_v") - delta_v = fast_trough_v - slow_trough_v - delta_v[np.isnan(delta_v)] = 0. - sweep_avg_slow_trough_delta_v.append(delta_v.mean()) - - ft["slow_trough_delta_time"] = {"mean": float(np.mean(sweep_avg_slow_trough_delta_time)), - "stdev": float(np.std(sweep_avg_slow_trough_delta_time))} - ft["slow_trough_delta_v"] = {"mean": float(np.mean(sweep_avg_slow_trough_delta_v)), - "stdev": float(np.std(sweep_avg_slow_trough_delta_v))} - - baseline_v = float(ext.sweep_features("v_baseline").mean()) - passive_fit_data["e_pas"] = baseline_v - for k in ext.sweeps()[0].sweep_feature_keys(): - pair = {} - pair["mean"] = float(ext.sweep_features(k).mean()) - pair["stdev"] = float(ext.sweep_features(k).std()) - ft[k] = pair - - # Determine highest step to check for depolarization block - noise_1_sweeps, _, _ = ephys_utils.get_sweeps_of_type("C1NSSEED_1", all_sweeps) - noise_2_sweeps, _, _ = ephys_utils.get_sweeps_of_type("C1NSSEED_2", all_sweeps) - step_sweeps, _, _ = ephys_utils.get_sweeps_of_type("C1LSCOARSE", all_sweeps) - all_sweeps = noise_1_sweeps + noise_2_sweeps + step_sweeps - max_i = 0 - for s in all_sweeps: - try: - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, s['sweep_number']) - except: - pass - if np.max(i) > max_i: - max_i = np.max(i) - max_i += 10 # add 10 pA - max_i *= 1e-3 # convert to nA - - # ----------- Generate output and submit jobs --------------- - - # Set up directories - # Decide which fit(s) we are doing - if (is_spiny and ft["width"]["mean"] < 0.8) or (not is_spiny and ft["width"]["mean"] > 0.8): - fit_types = ["f6", "f12"] - elif is_spiny: - fit_types = ["f6"] - else: - fit_types = ["f12"] - - for fit_type in fit_types: - fit_type_dir = os.path.join(output_directory, fit_type) - if not os.path.exists(fit_type_dir): - os.makedirs(fit_type_dir) - for seed in SEEDS: - seed_dir = "{:s}/s{:d}".format(fit_type_dir, seed) - if not os.path.exists(seed_dir): - os.makedirs(seed_dir) - - # Collect and save data for target.json file - target_dict = {} - target_dict["passive"] = [{ - "ra": ra, - "cm": { "soma": cm1, "axon": cm1, "dend": cm2 }, - "e_pas": baseline_v - }] - - swc_data = pd.read_table(swc_path, sep='\s', comment='#', header=None) - has_apic = False - if APICAL_DENDRITE_TYPE in pd.unique(swc_data[1]): - has_apic = True - _fit_stage_1_log.info("Has apical dendrite") - else: - _fit_stage_1_log.info("Does not have apical dendrite") - - if has_apic: - target_dict["passive"][0]["cm"]["apic"] = cm2 - - target_dict["fitting"] = [{ - "junction_potential": jxn, - "sweeps": sweeps_to_fit, - "passive_fit_info": passive_fit_data, - "max_stim_test_na": max_i, - }] - - target_dict["stimulus"] = [{ - "amplitude": 1e-3 * stim_amp, - "delay": 1000.0, - "duration": 1e3 * stim_dur - }] - - target_dict["manifest"] = [] - target_dict["manifest"].append({"type": "file", "spec": swc_path, "key": "MORPHOLOGY"}) - - target_dict["target_features"] = collect_target_features(ft) - - target_file = os.path.join(output_directory, 'target.json') - ju.write(target_file, target_dict) - - # Create config.json for each fit type - config_base_data = ju.read(os.path.join(FIT_BASE_DIR, - 'config_base.json')) - - - jobs = [] - for fit_type in fit_types: - config = config_base_data.copy() - fit_type_dir = os.path.join(output_directory, fit_type) - config_path = os.path.join(fit_type_dir, "config.json") - - config["biophys"][0]["model_file"] = [ target_file, config_path] - if has_apic: - fit_style_file = os.path.join(FIT_BASE_DIR, 'fit_styles', '%s_fit_style.json' % (fit_type)) - else: - fit_style_file = os.path.join(FIT_BASE_DIR, "fit_styles", "%s_noapic_fit_style.json" % (fit_type)) - - config["biophys"][0]["model_file"].append(fit_style_file) - config["manifest"].append({"type": "dir", "spec": fit_type_dir, "key": "FITDIR"}) - ju.write(config_path, config) - - for seed in SEEDS: - logfile = os.path.join(output_directory, fit_type, 's%d' % seed, 'stage_1.log') - jobs.append({ - 'config_path': os.path.abspath(config_path), - 'fit_type': fit_type, - 'log': os.path.abspath(logfile), - 'seed': seed, - 'num_processes': DEFAULT_NUM_PROCESSES - }) - return jobs - - -def run_stage_1(jobs): - for job in jobs: - args = [MPIEXEC, - '-np', - str(job['num_processes']), - sys.executable, - '-m', - optimize.__name__, - str(job['seed']), - job['config_path'], - str(optimize.DEFAULT_NGEN), - str(optimize.DEFAULT_MU)] - _fit_stage_1_log.debug(args) - with open(job['log'], "w") as outfile: - subprocess.call(args, stdout=outfile) \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fit_stage_2.py b/allensdk/internal/model/biophysical/fit_stage_2.py deleted file mode 100755 index 380ae9e9f0..0000000000 --- a/allensdk/internal/model/biophysical/fit_stage_2.py +++ /dev/null @@ -1,115 +0,0 @@ -import argparse -import os -import sys -import subprocess -import logging -import numpy as np -import allensdk.core.json_utilities as json_utilities -from .fit_stage_1 import SEEDS, FIT_BASE_DIR, MPIEXEC -import allensdk.internal.model.biophysical.optimize as optimize - -FIT_TYPES = {"f6": "f9", "f12": "f13"} -DEFAULT_NUM_PROCESSES = 240 - -_fit_stage_2_log = logging.getLogger('allensdk.model.biophysical.fit_stage_2') - -def prepare_stage_2(output_directory): - config_base_data = json_utilities.read(os.path.join(FIT_BASE_DIR, 'config_base.json')) - - jobs = [] - - for fit_type in FIT_TYPES: - best_error = 1e12 - best_seed = 0 - - fit_type_dir = os.path.join(output_directory, fit_type) - - if not os.path.exists(fit_type_dir): - _fit_stage_2_log.debug("fit type directory does not exist for cell: %s" % fit_type_dir) - continue - - for seed in SEEDS: - hof_fit_file = os.path.join(fit_type_dir, "s%d" % seed, "final_hof_fit.txt") - if not os.path.exists(hof_fit_file): - _fit_stage_2_log.debug("hof fit file does not exist for seed: %d" % (seed)) - continue - - hof_fit = np.loadtxt(hof_fit_file) - best_for_seed = np.min(hof_fit) - if best_for_seed < best_error: - best_seed = seed - best_error = best_for_seed - - _fit_stage_2_log.debug("Best error for fit type %s is %f for seed %d" % (fit_type, best_error, best_seed)) - - start_pop_file = os.path.join(fit_type_dir, "s%d" % best_seed, "final_hof.txt") - new_fit_type_dir = os.path.join(output_directory, FIT_TYPES[fit_type]) - - for seed in SEEDS: - seed_dir = os.path.join(new_fit_type_dir, "s%d" % seed) - if not os.path.exists(seed_dir): - os.makedirs(seed_dir) - - target_file = os.path.join(output_directory, "target.json") - target_data = json_utilities.read(target_file) - has_apic = "apic" in target_data["passive"][0]["cm"] - - config = config_base_data.copy() - config_path = os.path.join(new_fit_type_dir, "config.json") - config["biophys"][0]["model_file"] = [ target_file, config_path] - - if has_apic: - fit_style_file = os.path.join(FIT_BASE_DIR, "fit_styles", FIT_TYPES[fit_type] + "_fit_style.json") - else: - fit_style_file = os.path.join(FIT_BASE_DIR, "fit_styles", FIT_TYPES[fit_type] + "_noapic_fit_style.json") - config["biophys"][0]["model_file"].append( fit_style_file ) - - config["manifest"].append({"type": "dir", "spec": new_fit_type_dir, "key": "FITDIR"}) - config["manifest"].append({"type": "file", "spec": start_pop_file, "key": "STARTPOP"}) - - json_utilities.write(config_path, config) - - for seed in SEEDS: - logfile = os.path.join(new_fit_type_dir, 's%d' % seed, 'stage_2.log') - - jobs.append({ - 'config_path': os.path.abspath(config_path), - 'fit_type': fit_type, - 'log': os.path.abspath(logfile), - 'seed': seed, - 'num_processes': DEFAULT_NUM_PROCESSES - }) - - return jobs - - -def run_stage_2(jobs): - for job in jobs: - args = [MPIEXEC, - '-np', str(job['num_processes']), - sys.executable, - '-m', - optimize.__name__, - str(job['seed']), - job['config_path'], - str(optimize.DEFAULT_NGEN), - str(optimize.DEFAULT_MU)] - _fit_stage_2_log.debug(args) - with open(job['log'], "w") as outfile: - subprocess.call(args, stdout=outfile) - - -def main(): - parser = argparse.ArgumentParser(description='Set up DEAP-style fit for second stage') - parser.add_argument('--output_dir', required=True) - parser.add_argument('specimen_id', type=int) - args = parser.parse_args() - - output_directory = os.path.join(args.output_dir, 'specimen_%d' % args.specimen_id) - - jobs = prepare_stage_2(output_directory) - run_stage_2(jobs) - -if __name__ == "__main__": - main() - diff --git a/allensdk/internal/model/biophysical/fits/__init__.py b/allensdk/internal/model/biophysical/fits/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/model/biophysical/fits/config_base.json b/allensdk/internal/model/biophysical/fits/config_base.json deleted file mode 100644 index 095655e3f0..0000000000 --- a/allensdk/internal/model/biophysical/fits/config_base.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "biophys": [{ - "log_config_path": "logging.conf", - "model_file": [] - }], - "neuron": [{ - "hoc": [ - "stdgui.hoc", - "import3d.hoc", - "cell.hoc" - ] - }], - "manifest": [ - { - "type": "dir", - "spec": ".", - "key": "BASEDIR" - }, - { - "type": "dir", - "spec": "modfiles", - "key": "MODFILE_DIR" - } - ] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/__init__.py b/allensdk/internal/model/biophysical/fits/fit_styles/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f12_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f12_fit_style.json deleted file mode 100644 index 0397c4ddeb..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f12_fit_style.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "fit_name": "f12", - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width" - ], - "channels": [ - { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, - { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, - { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3 }, - { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } - ], - "addl_params": [ - { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, - { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, - { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "apic", "mechanism": "", "min": 1e-7, "max": 1e-3 } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json deleted file mode 100644 index 0483b09fe1..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "fit_name": "f12", - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width" - ], - "channels": [ - { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, - { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, - { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3}, - { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } - ], - "addl_params": [ - { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, - { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, - { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f13_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f13_fit_style.json deleted file mode 100644 index 0b6b75f32f..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f13_fit_style.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "fit_name": "f13", - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width", - "adapt", - "latency", - "isi_cv", - "mean_isi", - "first_isi" - ], - "channels": [ - { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, - { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, - { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3 }, - { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } - ], - "addl_params": [ - { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, - { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, - { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "apic", "mechanism": "", "min": 1e-7, "max": 1e-3 } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json deleted file mode 100644 index 77c9017c84..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "fit_name": "f13", - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width", - "adapt", - "latency", - "isi_cv", - "mean_isi", - "first_isi" - ], - "channels": [ - { "mechanism": "Ih", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "NaV", "section": "soma", "parameter": "gbar", "min": 0, "max": 15 }, - { "mechanism": "Kd", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv2like", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Kv3_1", "section": "soma", "parameter": "gbar", "min": 0, "max": 3.0 }, - { "mechanism": "K_T", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Im_v2", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-1 }, - { "mechanism": "SK", "section": "soma", "parameter": "gbar", "min": 0, "max": 1.0 }, - { "mechanism": "Ca_HVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-3 }, - { "mechanism": "Ca_LVA", "section": "soma", "parameter": "gbar", "min": 0, "max": 1e-2 } - ], - "addl_params": [ - { "parameter": "gamma", "section": "soma", "mechanism": "CaDynamics", "min": 1e-7, "max": 0.05 }, - { "parameter": "decay", "section": "soma", "mechanism": "CaDynamics", "min":20, "max": 1000 }, - { "parameter": "g_pas", "section": "soma", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "axon", "mechanism": "", "min": 1e-7, "max": 1e-3 }, - { "parameter": "g_pas", "section": "dend", "mechanism": "", "min": 1e-7, "max": 1e-3 } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f6_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f6_fit_style.json deleted file mode 100644 index e9c7497fa4..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f6_fit_style.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "fit_name": "f6", - "channels": [ - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Im", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ih", - "min": 0 - }, - { - "max": 15, - "section": "soma", - "parameter": "gbar", - "mechanism": "NaTs", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Nap", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_P", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_T", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "SK", - "min": 0 - }, - { - "max": 3.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "Kv3_1", - "min": 0 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_HVA", - "min": 0 - }, - { - "max": 0.01, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_LVA", - "min": 0 - } - ], - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width" - ], - "addl_params": [ - { - "max": 0.05, - "section": "soma", - "parameter": "gamma", - "mechanism": "CaDynamics", - "min": 0 - }, - { - "max": 1000, - "section": "soma", - "parameter": "decay", - "mechanism": "CaDynamics", - "min": 20 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "axon", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "dend", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "apic", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json deleted file mode 100644 index abb8064bdb..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "fit_name": "f6", - "channels": [ - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Im", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ih", - "min": 0 - }, - { - "max": 15, - "section": "soma", - "parameter": "gbar", - "mechanism": "NaTs", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Nap", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_P", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_T", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "SK", - "min": 0 - }, - { - "max": 3.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "Kv3_1", - "min": 0 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_HVA", - "min": 0 - }, - { - "max": 0.01, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_LVA", - "min": 0 - } - ], - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width" - ], - "addl_params": [ - { - "max": 0.05, - "section": "soma", - "parameter": "gamma", - "mechanism": "CaDynamics", - "min": 0 - }, - { - "max": 1000, - "section": "soma", - "parameter": "decay", - "mechanism": "CaDynamics", - "min": 20 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "axon", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "dend", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f9_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f9_fit_style.json deleted file mode 100644 index 3e28b72c8a..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f9_fit_style.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "fit_name": "f9", - "channels": [ - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Im", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ih", - "min": 0 - }, - { - "max": 15, - "section": "soma", - "parameter": "gbar", - "mechanism": "NaTs", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Nap", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_P", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_T", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "SK", - "min": 0 - }, - { - "max": 3.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "Kv3_1", - "min": 0 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_HVA", - "min": 0 - }, - { - "max": 0.01, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_LVA", - "min": 0 - } - ], - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width", - "adapt", - "latency", - "isi_cv", - "mean_isi", - "first_isi" - ], - "addl_params": [ - { - "max": 0.05, - "section": "soma", - "parameter": "gamma", - "mechanism": "CaDynamics", - "min": 0 - }, - { - "max": 1000, - "section": "soma", - "parameter": "decay", - "mechanism": "CaDynamics", - "min": 20 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "axon", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "dend", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "apic", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json deleted file mode 100644 index 41b60df685..0000000000 --- a/allensdk/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "fit_name": "f9", - "channels": [ - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Im", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ih", - "min": 0 - }, - { - "max": 15, - "section": "soma", - "parameter": "gbar", - "mechanism": "NaTs", - "min": 0 - }, - { - "max": 0.1, - "section": "soma", - "parameter": "gbar", - "mechanism": "Nap", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_P", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "K_T", - "min": 0 - }, - { - "max": 1.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "SK", - "min": 0 - }, - { - "max": 3.0, - "section": "soma", - "parameter": "gbar", - "mechanism": "Kv3_1", - "min": 0 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_HVA", - "min": 0 - }, - { - "max": 0.01, - "section": "soma", - "parameter": "gbar", - "mechanism": "Ca_LVA", - "min": 0 - } - ], - "features": [ - "avg_rate", - "peak_v", - "fast_trough_v", - "slow_trough_delta_v", - "slow_trough_delta_time", - "v_baseline", - "width", - "adapt", - "latency", - "isi_cv", - "mean_isi", - "first_isi" - ], - "addl_params": [ - { - "max": 0.05, - "section": "soma", - "parameter": "gamma", - "mechanism": "CaDynamics", - "min": 0 - }, - { - "max": 1000, - "section": "soma", - "parameter": "decay", - "mechanism": "CaDynamics", - "min": 20 - }, - { - "max": 0.001, - "section": "soma", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "axon", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - }, - { - "max": 0.001, - "section": "dend", - "parameter": "g_pas", - "mechanism": "", - "min": 1e-07 - } - ], - "conditions": [{ - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -80 - }] -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/make_deap_fit_json.py b/allensdk/internal/model/biophysical/make_deap_fit_json.py deleted file mode 100755 index ca013a1e40..0000000000 --- a/allensdk/internal/model/biophysical/make_deap_fit_json.py +++ /dev/null @@ -1,208 +0,0 @@ -import os.path -import numpy as np -import json, logging -from allensdk.core.nwb_data_set import NwbDataSet -import allensdk.core.json_utilities as ju -from allensdk.model.biophys_sim.config import Config -from allensdk.internal.model.biophysical import ephys_utils -from allensdk.internal.model.biophysical.deap_utils import Utils - -class Report: - _log = logging.getLogger('allensdk.model.biophysical.make_deap_fit_json') - - def __init__(self, - top_level_description, - fit_type): - self.utils = None - self.top_level_description = top_level_description - self.description = None - self.manifest = None - self.specimen_id = str(self.top_level_description.data['runs'][0]['specimen_id']) - self.fit_type = fit_type - self.target_path = self.top_level_description.manifest.get_path('target_path') - self.target = ju.read(self.target_path) - - self.seeds = [1234, 1001, 4321, 1024, 2048] - self.org_selections = [0, 100, 500, 1000] # Picks thek best, 100th best, etc. organisms as examples - self.trace_colors = ["#1b9e77", "#d95f02", "#7570b3", "#e7298a"] - - self.config_path = self.top_level_description.manifest.get_path('fit_config_json', - self.fit_type) - self.fit_config = Config().load(self.config_path) - - fit_style_path = self.fit_config.data["biophys"][0]["model_file"][-1] - - self.fit_style_info = ju.read(fit_style_path) - - self.used_features = self.fit_style_info["features"] - self.all_params = self.fit_style_info["channels"] + self.fit_style_info["addl_params"] - - nwb_path = self.top_level_description.manifest.get_path('stimulus_path') - self.data_set = NwbDataSet(nwb_path) - - self.neuronal_model_data = ju.read(self.top_level_description.manifest.get_path('neuronal_model_data')) - self.specimen_data = self.neuronal_model_data['specimen'] - self.all_sweeps = self.specimen_data['ephys_sweeps'] - - - - def best_fit_value(self): - return self.all_hof_fit_errors[self.sorted_indexes[self.org_selections[0]]] - - - def generate_fit_file(self): - self.gather_from_seeds() - self.setup_model() - self.check_org_selections_for_noise_block() - self.make_fit_json_file() - - - def make_fit_json_file(self): - json_data = {} - - # passive - json_data["passive"] = [{}] - json_data["passive"][0]["ra"] = self.target["passive"][0]["ra"] - json_data["passive"][0]["e_pas"] = self.target["passive"][0]["e_pas"] - json_data["passive"][0]["cm"] = [] - for k in self.target["passive"][0]["cm"]: - json_data["passive"][0]["cm"].append({"section": k, "cm": self.target["passive"][0]["cm"][k]}) - - # fitting - json_data["fitting"] = [{}] - json_data["fitting"][0]["sweeps"] = self.target["fitting"][0]["sweeps"] - json_data["fitting"][0]["junction_potential"] = self.target["fitting"][0]["junction_potential"] - - # conditions - json_data["conditions"] = self.fit_style_info["conditions"] - json_data["conditions"][0]["v_init"] = self.target["passive"][0]["e_pas"] - - # genome - json_data["genome"] = [] - genome_vals = self.all_hof_fits[self.sorted_indexes[self.org_selections[0]], :] - for i, p in enumerate(self.all_params): - if len(p["mechanism"]) > 0: - param_name = p["parameter"] + "_" + p["mechanism"] - else: - param_name = p["parameter"] - json_data["genome"].append({"value": genome_vals[i], - "section": p["section"], - "name": param_name, - "mechanism": p["mechanism"] - }) - - # write out file - with open(self.top_level_description.manifest.get_path('output_fit_file', - self.specimen_id, - self.fit_type), "w") as f: - json.dump(json_data, f, indent=2) - - - def setup_model(self): - morphology_path = os.path.realpath(self.top_level_description.manifest.get_path('MORPHOLOGY')) - cwd = os.path.realpath(os.curdir) - self.utils = Utils(self.fit_config) - h = self.utils.h - self.utils.generate_morphology(morphology_path) - self.utils.load_cell_parameters() - self.utils.insert_iclamp() - self.stim_params = self.fit_config.data["stimulus"][0] - self.utils.set_iclamp_params(self.stim_params["amplitude"], - self.stim_params["delay"], - self.stim_params["duration"]) - h.tstop = self.stim_params["delay"] * 2.0 + self.stim_params["duration"] - h.cvode_active(1) - h.cvode.atolscale("cai", 1e-4) - h.cvode.maxstep(10) - - - def gather_from_seeds(self): - first_created = False - for s in self.seeds: - final_hof_fit_path = \ - self.top_level_description.manifest.get_path('final_hof_fit', - self.fit_type, - s) - final_hof_path = \ - self.top_level_description.manifest.get_path('final_hof', - self.fit_type, - s) - if not os.path.exists(final_hof_fit_path): - Report._log.warn("Could not find output file %s for seed %d" % (final_hof_fit_path, s)) - continue - - hof_fit_errors = np.loadtxt(final_hof_fit_path) - hof_fits = np.loadtxt(final_hof_path) - if not first_created: - all_hof_fit_errors = hof_fit_errors.copy() - all_hof_fits = hof_fits.copy() - first_created = True - else: - all_hof_fit_errors = np.hstack([all_hof_fit_errors, hof_fit_errors]) - all_hof_fits = np.vstack([all_hof_fits, hof_fits]) - self.all_hof_fits = all_hof_fits - self.all_hof_fit_errors = all_hof_fit_errors - self.sorted_indexes = np.argsort(self.all_hof_fit_errors) - - - def check_org_selections_for_noise_block(self): - h = self.utils.h - v_vec, i_vec, t_vec = self.utils.record_values() - - depol_block_threshold = -50.0 # mV - block_min_duration = 50.0 # ms - - h.cvode_active(0) - noise_i_stim = [] - for sweep_type in ["C1NSSEED_1", "C1NSSEED_2"]: - sweeps, sweep_numbers, statuses = ephys_utils.get_sweeps_of_type(sweep_type, self.all_sweeps) - _, expt_i, expt_t = ephys_utils.get_sweep_v_i_t_from_set(self.data_set, sweep_numbers[0]) - noise_i_stim.append(expt_i) - dt = (expt_t[1] - expt_t[0]) * 1e3 - h.dt = dt - h.tstop = expt_t[-1] * 1e3 - self.utils.stim.dur = 1e12 - - for ii, org_ind in enumerate(self.sorted_indexes): - Report._log.debug("Testing org %s%s" % (ii, org_ind)) - self.utils.set_actual_parameters(self.all_hof_fits[org_ind, :]) - depol_okay = True - use_ii = -1 - for expt_i in noise_i_stim: - Report._log.debug("Running some noise") - i_stim_vec = h.Vector(expt_i * 1e-3) - i_stim_vec.play(self.utils.stim._ref_amp, dt) - h.finitialize() - h.run() - i_stim_vec.play_remove() - - v = v_vec.as_numpy() - t = t_vec.as_numpy() - i = i_vec.as_numpy() - stim_start_idx = 0 - stim_end_idx = len(t) - 1 - bool_v = np.array(v > depol_block_threshold, dtype=int) - up_indexes = np.flatnonzero(np.diff(bool_v) == 1) - down_indexes = np.flatnonzero(np.diff(bool_v) == -1) - if len(up_indexes) > len(down_indexes): - down_indexes = np.append(down_indexes, [stim_end_idx]) - - if len(up_indexes) != 0: - max_depol_duration = np.max([t[down_indexes[k]] - t[up_idx] for k, up_idx in enumerate(up_indexes)]) - if max_depol_duration > block_min_duration: - Report._log.debug("Encountered depolarization block") - depol_okay = False - break - if depol_okay: - Report._log.debug("Did not detect depolarization block on noise traces") - use_ii = ii - break - h.cvode_active(1) - self.utils.set_iclamp_params(self.stim_params["amplitude"], self.stim_params["delay"], - self.stim_params["duration"]) - self.utils.h.tstop = self.stim_params["delay"] * 2.0 + self.stim_params["duration"] - - if use_ii == -1: - Report._log.debug("Could not find an organism without depolarization block on noise.") - else: - self.org_selections = [o + use_ii for o in self.org_selections] diff --git a/allensdk/internal/model/biophysical/neuron_parallel.py b/allensdk/internal/model/biophysical/neuron_parallel.py deleted file mode 100644 index b3fd0c9312..0000000000 --- a/allensdk/internal/model/biophysical/neuron_parallel.py +++ /dev/null @@ -1,46 +0,0 @@ -from neuron import h -import logging - -_neuron_parallel_log = logging.getLogger('allensdk.model.biophysical.neuron_parallel') - -_pc = h.ParallelContext() - -def map(func, *iterables): - start_time = pc_time() - userids = [] - userid = 200 # arbitrary, but needs to be a positive integer - for args in zip(*iterables): - args2 = (list(a) for a in args) - _pc.submit(userid, func, *args2) - userids.append(userid) - userid += 1 - results = dict(working()) - end_time = pc_time() - _neuron_parallel_log.debug("Map took %s" % (str(end_time - start_time))) - return [results[userid] for userid in userids] - -def working(): - while _pc.working(): - userid = int(_pc.userid()) - ret = _pc.pyret() - yield userid, ret - -def runworker(): - _pc.runworker() - -def done(): - _pc.done() - -def pc_time(): - return _pc.time() - -def reset_neuron_library(): - ''' - See Also: https://www.neuron.yale.edu/phpBB/viewtopic.php?f=2&t=2367 - ''' - _pc.gid_clear() - - for sec in h.allsec(): - h("%s{delete_section()}" % (sec.name()) ) - - \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/optimize.py b/allensdk/internal/model/biophysical/optimize.py deleted file mode 100755 index 8044206cfe..0000000000 --- a/allensdk/internal/model/biophysical/optimize.py +++ /dev/null @@ -1,251 +0,0 @@ -from mpi4py import MPI # needed for NEURON parallel execution -import os -from allensdk.internal.model.biophysical.deap_utils import Utils -from . import neuron_parallel -import logging -import logging.config as lc -import argparse -import random -import numpy as np -from deap import algorithms, base, creator, tools -from allensdk.model.biophys_sim.config import Config -from pkg_resources import resource_filename #@UnresolvedImport - - -BOUND_LOWER, BOUND_UPPER = 0.0, 1.0 -DEFAULT_NGEN = 500 -DEFAULT_MU = 1200 - - -_optimize_log = logging.getLogger('allensdk.model.biophysical.optimize') - - -utils = None -h = None -do_block_check = None -t_vec = None -v_ved = None -i_vec = None -stim_params = None -max_stim_amp = None -config = None -seed = None - - -def eval_param_set(params): - utils.set_normalized_parameters(params) - h.finitialize() - h.run() - feature_errors = utils.calculate_feature_errors(t_vec.as_numpy(), v_vec.as_numpy(), i_vec.as_numpy()) - min_fail_penalty = 75.0 - if do_block_check and np.sum(feature_errors) < min_fail_penalty * len(feature_errors): - if check_for_block(): - feature_errors = min_fail_penalty * np.ones_like(feature_errors) - # Reset the stimulus back - utils.set_iclamp_params(stim_params["amplitude"], stim_params["delay"], - stim_params["duration"]) - - return [np.sum(feature_errors)] - - -def check_for_block(): - utils.set_iclamp_params(max_stim_amp, stim_params["delay"], - stim_params["duration"]) - h.finitialize() - h.run() - - v = v_vec.as_numpy() - t = t_vec.as_numpy() - stim_start_idx = np.flatnonzero(t >= utils.stim.delay)[0] - stim_end_idx = np.flatnonzero(t >= utils.stim.delay + utils.stim.dur)[0] - depol_block_threshold = -50.0 # mV - block_min_duration = 50.0 # ms - long_hyperpol_threshold = -75.0 # mV - - bool_v = np.array(v > depol_block_threshold, dtype=int) - up_indexes = np.flatnonzero(np.diff(bool_v) == 1) - down_indexes = np.flatnonzero(np.diff(bool_v) == -1) - if len(up_indexes) > len(down_indexes): - down_indexes = np.append(down_indexes, [stim_end_idx]) - - if len(up_indexes) == 0: - # if it never gets high enough, that's not a good sign (meaning no spikes) - return True - else: - max_depol_duration = np.max([t[down_indexes[k]] - t[up_idx] for k, up_idx in enumerate(up_indexes)]) - if max_depol_duration > block_min_duration: - return True - - bool_v = np.array(v > long_hyperpol_threshold, dtype=int) - up_indexes = np.flatnonzero(np.diff(bool_v) == 1) - down_indexes = np.flatnonzero(np.diff(bool_v) == -1) - down_indexes = down_indexes[(down_indexes > stim_start_idx) & (down_indexes < stim_end_idx)] - if len(down_indexes) != 0: - up_indexes = up_indexes[(up_indexes > stim_start_idx) & (up_indexes < stim_end_idx) & (up_indexes > down_indexes[0])] - if len(up_indexes) < len(down_indexes): - up_indexes = np.append(up_indexes, [stim_end_idx]) - max_hyperpol_duration = np.max([t[up_indexes[k]] - t[down_idx] for k, down_idx in enumerate(down_indexes)]) - if max_hyperpol_duration > block_min_duration: - return True - return False - - -def uniform(lower, upper, size=None): - if size is None: - return [random.uniform(a, b) for a, b in zip(lower, upper)] - else: - return [random.uniform(a, b) for a, b in zip([lower] * size, [upper] * size)] - - -def best_sum(d): - return np.sum(d, axis=1).min() - - -def initPopulation(pcls, ind_init, popfile): - popdata = np.loadtxt(popfile) - return pcls(ind_init(utils.normalize_actual_parameters(line)) for line in popdata.tolist()) - - -def main(): - global utils, h, v_vec, i_vec, t_vec, do_block_check, max_stim_amp, stim_params, config, seed - parser = argparse.ArgumentParser(description='Start a DEAP testing run.') - parser.add_argument('seed', type=int) - parser.add_argument('config_path') - parser.add_argument('ngen', type=int) - parser.add_argument('mu', type=int) - args = parser.parse_args() - seed = args.seed - - # Set up NEURON - config = Config().load(args.config_path) - - if 'LOG_CFG' in os.environ: - log_config = os.environ['LOG_CFG'] - else: - log_config = resource_filename('allensdk.model.biophysical', - 'logging.conf') - os.environ['LOG_CFG'] = log_config - lc.fileConfig(log_config) - - stim_params = config.data["stimulus"][0] - - block_check_fit_types = ["f9", "f13"] - do_block_check = False - if config.data["fit_name"] in block_check_fit_types: - max_stim_amp = config.data["fitting"][0]["max_stim_test_na"] - if max_stim_amp > stim_params["amplitude"]: - _optimize_log.debug("Will check for blocks") - do_block_check = True - - utils = Utils(config) - h = utils.h - - manifest = config.manifest - morphology_path = manifest.get_path('MORPHOLOGY') - utils.generate_morphology(morphology_path.encode('ascii', 'ignore')) - utils.load_cell_parameters() - utils.insert_iclamp() - utils.set_iclamp_params(stim_params["amplitude"], stim_params["delay"], - stim_params["duration"]) - - h.tstop = stim_params["delay"] * 2.0 + stim_params["duration"] - h.cvode_active(1) - h.cvode.atolscale("cai", 1e-4) - h.cvode.maxstep(10) - - v_vec, i_vec, t_vec = utils.record_values() - - try: # Wrapping this all to catch exceptions during NEURON parallel execution - neuron_parallel.runworker() - - # Set up genetic algorithm - - _optimize_log.debug("Setting up genetic algorithm") - random.seed(seed) - - ngen = args.ngen - mu = args.mu - cxpb = 0.1 - mtpb = 0.35 - eta = 10.0 - - ndim = len(config.data["channels"]) + len(config.data["addl_params"]) - - creator.create("FitnessMin", base.Fitness, weights=(-1.0, )) - creator.create("Individual", list, fitness=creator.FitnessMin) - - toolbox = base.Toolbox() - - toolbox.register("attr_float", uniform, BOUND_LOWER, BOUND_UPPER, ndim) - toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.attr_float) - toolbox.register("population", tools.initRepeat, list, toolbox.individual) - - toolbox.register("evaluate", eval_param_set) - toolbox.register("mate", tools.cxSimulatedBinaryBounded, low=BOUND_LOWER, up=BOUND_UPPER, - eta=eta) - toolbox.register("mutate", tools.mutPolynomialBounded, low=BOUND_LOWER, up=BOUND_UPPER, - eta=eta, indpb=mtpb) - toolbox.register("variate", algorithms.varAnd) - toolbox.register("select", tools.selBest) - toolbox.register("map", neuron_parallel.map) - - stats = tools.Statistics(lambda ind: ind.fitness.values) - stats.register("min", np.min, axis=0) - stats.register("max", np.max, axis=0) - stats.register("best", best_sum) - - logbook = tools.Logbook() - logbook.header = "gen", "nevals", "min", "max", "best" - - if "STARTPOP" in manifest.path_info: - _optimize_log.debug("Using a pre-defined starting population") - start_pop_path = config.manifest.get_path("STARTPOP") - toolbox.register("population_start", initPopulation, list, creator.Individual) - pop = toolbox.population_start(start_pop_path) - else: - pop = toolbox.population(n=mu) - - invalid_ind = [ind for ind in pop if not ind.fitness.valid] - fitnesses = toolbox.map(toolbox.evaluate, invalid_ind) - - for ind, fit in zip(invalid_ind, fitnesses): - ind.fitness.values = fit - - hof = tools.HallOfFame(mu) - hof.update(pop) - - record = stats.compile(pop) - logbook.record(gen=0, nevals=len(invalid_ind), **record) - _optimize_log.debug(logbook.stream) - - for gen in range(1, ngen + 1): - offspring = toolbox.variate(pop, toolbox, cxpb, 1.0) - - invalid_ind = [ind for ind in offspring if not ind.fitness.valid] - fitnesses = toolbox.map(toolbox.evaluate, invalid_ind) - for ind, fit in zip(invalid_ind, fitnesses): - ind.fitness.values = fit - - hof.update(offspring) - - pop[:] = toolbox.select(pop + offspring, mu) - - record = stats.compile(pop) - logbook.record(gen=gen, nevals=len(invalid_ind), **record) - _optimize_log.debug(logbook.stream) - - fit_dir = config.manifest.get_path("FITDIR") - seed_dir = fit_dir + "/s{:d}/".format(seed) - np.savetxt(seed_dir + "final_pop.txt", np.array(map(utils.actual_parameters_from_normalized, pop))) - np.savetxt(seed_dir + "final_pop_fit.txt", np.array([ind.fitness.values for ind in pop])) - np.savetxt(seed_dir + "final_hof.txt", np.array(map(utils.actual_parameters_from_normalized, hof))) - np.savetxt(seed_dir + "final_hof_fit.txt", np.array([ind.fitness.values for ind in hof])) - neuron_parallel.done() - h.quit() - except RuntimeError: - _optimize_log.critical("Exception encountered during parallel NEURON execution") - MPI.COMM_WORLD.Abort() # Shut down all the processes - - -if __name__ == "__main__": - main() diff --git a/allensdk/internal/model/biophysical/passive_fitting/__init__.py b/allensdk/internal/model/biophysical/passive_fitting/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit.py deleted file mode 100755 index 97458b2b24..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit.py +++ /dev/null @@ -1,130 +0,0 @@ -import numpy as np -import argparse -import os -import allensdk.internal.model.biophysical.passive_fitting.neuron_utils as neuron_utils -import allensdk.core.json_utilities as json_utilities -from allensdk.model.biophys_sim.config import Config - -# Load the morphology - -BASEDIR = os.path.dirname(__file__)#"/data/mat/nathang/deap_optimize/passive_fitting" - - -@neuron_utils.read_neuron_fit_stdout -def neuron_passive_fit(up_data, down_data, swc_path, limit): - h = neuron_utils.get_h() - h.load_file("stdgui.hoc") - h.load_file("import3d.hoc") - neuron_utils.load_morphology(swc_path) - - for sec in h.allsec(): - sec.insert('pas') - for seg in sec: - seg.pas.e = 0 - - h.load_file(os.path.join(BASEDIR, "passive", "fixnseg.hoc")) - h.load_file(os.path.join(BASEDIR, "passive", "iclamp.ses")) - h.load_file(os.path.join(BASEDIR, "passive", "params.hoc")) - h.load_file(os.path.join(BASEDIR, "passive", "mrf.ses")) - - h.v_init = 0 - h.tstop = 100 - h.dt = 0.005 - - fit_start = 4.0025 - - v_rec = h.Vector() - t_rec = h.Vector() - v_rec.record(h.soma[0](0.5)._ref_v) - t_rec.record(h._ref_t) - - mrf = h.MulRunFitter[0] - gen0 = mrf.p.pf.generatorlist.object(0) - gen0.toggle() - fit0 = gen0.gen.fitnesslist.object(0) - - up_t = h.Vector(up_data[:, 0]) - up_v = h.Vector(up_data[:, 1]) - fit0.set_data(up_t, up_v) - fit0.boundary.x[0] = fit_start - fit0.boundary.x[1] = limit - fit0.set_w() - - gen1 = mrf.p.pf.generatorlist.object(1) - gen1.toggle() - fit1 = gen1.gen.fitnesslist.object(0) - - down_t = h.Vector(down_data[:, 0]) - down_v = h.Vector(down_data[:, 1]) - fit1.set_data(down_t, down_v) - fit1.boundary.x[0] = fit_start - fit1.boundary.x[1] = limit - fit1.set_w() - - minerr = 1e12 - for _ in range(3): - # Need to re-initialize the internal MRF variables, not top-level proxies - # for randomize() to work - mrf.p.pf.parmlist.object(0).val = 100 - mrf.p.pf.parmlist.object(1).val = 1 - mrf.p.pf.parmlist.object(2).val = 10000 - mrf.p.pf.putall() - mrf.randomize() - mrf.prun() - if mrf.opt.minerr < minerr: - fit_Ri = h.Ri - fit_Cm = h.Cm - fit_Rm = h.Rm - minerr = mrf.opt.minerr - - h.region_areas() - - return { - 'Ri': fit_Ri, - 'Cm': fit_Cm, - 'Rm': fit_Rm, - 'err': minerr - } - -def arg_parser(): - parser = argparse.ArgumentParser(description='analyze cap check sweep') - parser.add_argument('--up_file') - parser.add_argument('--down_file') - parser.add_argument('--swc_path') - parser.add_argument('--specimen_id', type=int, required=True) - parser.add_argument('--limit', type=float, required=True) - parser.add_argument('--output_file', required=True) - return parser - - -def process_inputs(parser): - args = parser.parse_args() - swc_path = args.swc_path - up_data = np.loadtxt(args.up_file) - down_data = np.loadtxt(args.down_file) - - return args, up_data, down_data, swc_path - - -def main(): - import sys - - manifest_path = sys.argv[-1] - limit = float(sys.argv[-2]) - os.chdir(os.path.dirname(manifest_path)) - app_config = Config() - description = app_config.load(manifest_path) - - upfile = description.manifest.get_path('upfile') - up_data = np.loadtxt(upfile) - downfile = description.manifest.get_path('downfile') - down_data = np.loadtxt(downfile) - swc_path = description.manifest.get_path('MORPHOLOGY') - - data = neuron_passive_fit(up_data, down_data, swc_path, limit) - output_file = description.manifest.get_path('fit_1_file') - - json_utilities.write(output_file, data) - -if __name__ == "__main__": - main() diff --git a/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py deleted file mode 100755 index 1dd6fec338..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py +++ /dev/null @@ -1,104 +0,0 @@ -import numpy as np -import os -import allensdk.internal.model.biophysical.passive_fitting.neuron_utils as neuron_utils - -import allensdk.core.json_utilities as json_utilities -from allensdk.model.biophys_sim.config import Config - -# Load the morphology - -BASEDIR = os.path.dirname(__file__) - -@neuron_utils.read_neuron_fit_stdout -def neuron_passive_fit2(up_data, down_data, swc_path, limit): - h = neuron_utils.get_h() - h.load_file("stdgui.hoc") - h.load_file("import3d.hoc") - neuron_utils.load_morphology(swc_path) - - for sec in h.allsec(): - sec.insert('pas') - for seg in sec: - seg.pas.e = 0 - - h.load_file(os.path.join(BASEDIR, "passive", "fixnseg.hoc")) - h.load_file(os.path.join(BASEDIR, "passive", "iclamp.ses")) - h.load_file(os.path.join(BASEDIR, "passive", "params.hoc")) - h.load_file(os.path.join(BASEDIR, "passive", "mrf2.ses")) - - h.v_init = 0 - h.tstop = 100 - - fit_start = 4.0025 - - v_rec = h.Vector() - t_rec = h.Vector() - v_rec.record(h.soma[0](0.5)._ref_v) - t_rec.record(h._ref_t) - - mrf = h.MulRunFitter[0] - gen0 = mrf.p.pf.generatorlist.object(0) - gen0.toggle() - fit0 = gen0.gen.fitnesslist.object(0) - - up_t = h.Vector(up_data[:, 0]) - up_v = h.Vector(up_data[:, 1]) - fit0.set_data(up_t, up_v) - fit0.boundary.x[0] = fit_start - fit0.boundary.x[1] = limit - fit0.set_w() - - gen1 = mrf.p.pf.generatorlist.object(1) - gen1.toggle() - fit1 = gen1.gen.fitnesslist.object(0) - - down_t = h.Vector(down_data[:, 0]) - down_v = h.Vector(down_data[:, 1]) - fit1.set_data(down_t, down_v) - fit1.boundary.x[0] = fit_start - fit1.boundary.x[1] = limit - fit1.set_w() - - minerr = 1e12 - for _ in range(3): - # Need to re-initialize the internal MRF variables, not top-level proxies - # for randomize() to work - mrf.p.pf.parmlist.object(0).val = 1 - mrf.p.pf.parmlist.object(1).val = 10000 - mrf.randomize() - mrf.prun() - if mrf.opt.minerr < minerr: - fit_Ri = h.Ri - fit_Cm = h.Cm - fit_Rm = h.Rm - minerr = mrf.opt.minerr - - h.region_areas() - return { - 'Ri': fit_Ri, - 'Cm': fit_Cm, - 'Rm': fit_Rm, - 'err': minerr - } - -def main(): - import sys - - manifest_path = sys.argv[-1] - limit = float(sys.argv[-2]) - os.chdir(os.path.dirname(manifest_path)) - app_config = Config() - description = app_config.load(manifest_path) - - upfile = description.manifest.get_path('upfile') - up_data = np.loadtxt(upfile) - downfile = description.manifest.get_path('downfile') - down_data = np.loadtxt(downfile) - swc_path = description.manifest.get_path('MORPHOLOGY') - output_file = description.manifest.get_path('fit_2_file') - - data = neuron_passive_fit2(up_data, down_data, swc_path, limit) - - json_utilities.write(output_file, data) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py deleted file mode 100755 index 628b5f73bc..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python - -import allensdk.internal.model.biophysical.passive_fitting.neuron_utils as neuron_utils -import numpy as np -import os -import allensdk.core.json_utilities as json_utilities -from allensdk.model.biophys_sim.config import Config - -# Load the morphology - -BASEDIR = os.path.dirname(__file__) - -@neuron_utils.read_neuron_fit_stdout -def neuron_passive_fit_elec(up_data, - down_data, - swc_path, - limit, - bridge, - elec_cap): - h = neuron_utils.get_h() - h.load_file("stdgui.hoc") - h.load_file("import3d.hoc") - neuron_utils.load_morphology(swc_path) - - for sec in h.allsec(): - sec.insert('pas') - for seg in sec: - seg.pas.e = 0 - - h.load_file(os.path.join(BASEDIR, "passive", "fixnseg.hoc")) - h.load_file(os.path.join(BASEDIR, "passive", "params.hoc")) - h.load_file(os.path.join(BASEDIR, "passive", "circuit.ses")) - h.load_file(os.path.join(BASEDIR, "passive", "mrf3.ses")) - - h.v_init = 0 - h.tstop = 100 - h.dt = 0.005 - - fit_start = 4.0025 - - circuit = h.LinearCircuit[0] - circuit.R2 = bridge / 2.0 - circuit.R3 = bridge / 2.0 - circuit.C4 = elec_cap * 1e-3 - - v_rec = h.Vector() - t_rec = h.Vector() - v_rec.record(h.soma[0](0.5)._ref_v) - t_rec.record(h._ref_t) - - mrf = h.MulRunFitter[0] - gen0 = mrf.p.pf.generatorlist.object(0) - gen0.toggle() - fit0 = gen0.gen.fitnesslist.object(0) - - up_t = h.Vector(up_data[:, 0]) - up_v = h.Vector(up_data[:, 1]) - fit0.set_data(up_t, up_v) - fit0.boundary.x[0] = fit_start - fit0.boundary.x[1] = limit - fit0.set_w() - - gen1 = mrf.p.pf.generatorlist.object(1) - gen1.toggle() - fit1 = gen1.gen.fitnesslist.object(0) - - down_t = h.Vector(down_data[:, 0]) - down_v = h.Vector(down_data[:, 1]) - fit1.set_data(down_t, down_v) - fit1.boundary.x[0] = fit_start - fit1.boundary.x[1] = limit - fit1.set_w() - - minerr = 1e12 - for _ in range(3): - # Need to re-initialize the internal MRF variables, not top-level proxies - # for randomize() to work - mrf.p.pf.parmlist.object(0).val = 100 - mrf.p.pf.parmlist.object(1).val = 1 - mrf.p.pf.parmlist.object(2).val = 10000 - mrf.p.pf.putall() - mrf.randomize() - mrf.prun() - if mrf.opt.minerr < minerr: - fit_Ri = h.Ri - fit_Cm = h.Cm - fit_Rm = h.Rm - minerr = mrf.opt.minerr - - h.region_areas() - return { - 'Ri': fit_Ri, - 'Cm': fit_Cm, - 'Rm': fit_Rm, - 'err': minerr - } - -def main(): - import sys - - manifest_path = sys.argv[-1] - elec_cap = float(sys.argv[-2]) - bridge = float(sys.argv[-3]) - limit = float(sys.argv[-4]) - os.chdir(os.path.dirname(manifest_path)) - app_config = Config() - description = app_config.load(manifest_path) - - upfile = description.manifest.get_path('upfile') - up_data = np.loadtxt(upfile) - downfile = description.manifest.get_path('downfile') - down_data = np.loadtxt(downfile) - swc_path = description.manifest.get_path('MORPHOLOGY') - - data = neuron_passive_fit_elec(up_data, down_data, swc_path, limit, bridge, elec_cap) - - output_file = description.manifest.get_path('fit_3_file') - json_utilities.write(output_file, data) - - -if __name__ == '__main__': main() diff --git a/allensdk/internal/model/biophysical/passive_fitting/neuron_utils.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_utils.py deleted file mode 100644 index f3ce9d76c1..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/neuron_utils.py +++ /dev/null @@ -1,57 +0,0 @@ -# in place of global from neuron import h - -def get_h(): - if get_h.h == None: - from neuron import h - get_h.h = h - return get_h.h - -get_h.h = None - -import sys, os -from .output_grabber import OutputGrabber - -def load_morphology(filename): - h = get_h() - swc = h.Import3d_SWC_read() - swc.input(str(filename)) - imprt = h.Import3d_GUI(swc, 0) - h("objref this") - imprt.instantiate(h.this) - - -def parse_neuron_output(output_str): - printed_fields = {} - - for line in output_str.split('\n'): - if line.startswith('nquad'): - continue - toks = line.split() - if len(toks) == 2: - v = toks[1].strip() - try: - v = float(v) - except: - pass - - printed_fields[toks[0].strip()] = v - - return printed_fields - - -def read_neuron_fit_stdout(func): - def call(*args, **kwargs): - - g = OutputGrabber() - g.start() - data = func(*args, **kwargs) - g.stop() - - printed_fields = parse_neuron_output(g.capturedtext) - data.update(printed_fields) - - return data - - return call - - diff --git a/allensdk/internal/model/biophysical/passive_fitting/output_grabber.py b/allensdk/internal/model/biophysical/passive_fitting/output_grabber.py deleted file mode 100644 index 1e806964af..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/output_grabber.py +++ /dev/null @@ -1,70 +0,0 @@ -import os, sys, threading, time - -class OutputGrabber(object): - """ - Class used to grab standard output or another stream. - """ - escape_char = "\b" - - def __init__(self, stream=None, threaded=False): - self.origstream = stream - self.threaded = threaded - if self.origstream is None: - self.origstream = sys.stdout - self.origstreamfd = self.origstream.fileno() - self.capturedtext = "" - # Create a pipe so the stream can be captured: - self.pipe_out, self.pipe_in = os.pipe() - - - def start(self): - """ - Start capturing the stream data. - """ - self.capturedtext = "" - # Save a copy of the stream: - self.streamfd = os.dup(self.origstreamfd) - # Replace the Original stream with our write pipe - os.dup2(self.pipe_in, self.origstreamfd) - if self.threaded: - # Start thread that will read the stream: - self.workerThread = threading.Thread(target=self.readOutput) - self.workerThread.start() - # Make sure that the thread is running and os.read is executed: - time.sleep(0.01) - - - def stop(self): - """ - Stop capturing the stream data and save the text in `capturedtext`. - """ - # Flush the stream to make sure all our data goes in before - # the escape character. - self.origstream.flush() - # Print the escape character to make the readOutput method stop: - self.origstream.write(self.escape_char) - self.origstream.flush() - if self.threaded: - # wait until the thread finishes so we are sure that - # we have until the last character: - self.workerThread.join() - else: - self.readOutput() - # Close the pipe: - os.close(self.pipe_out) - # Restore the original stream: - os.dup2(self.streamfd, self.origstreamfd) - - - def readOutput(self): - """ - Read the stream data (one byte at a time) - and save the text in `capturedtext`. - """ - while True: - data = os.read(self.pipe_out, 1) # Read One Byte Only - if self.escape_char in data: - break - if not data: - break - self.capturedtext += data diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/__init__.py b/allensdk/internal/model/biophysical/passive_fitting/passive/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/circuit.ses b/allensdk/internal/model/biophysical/passive_fitting/passive/circuit.ses deleted file mode 100644 index d02cab5e1e..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/circuit.ses +++ /dev/null @@ -1,61 +0,0 @@ -objectvar save_window_, rvp_ -objectvar scene_vector_[8] -objectvar ocbox_, ocbox_list_, scene_, scene_list_ -{ocbox_list_ = new List() scene_list_ = new List()} - -//Begin LinearCircuit[0] -{ -load_file("lincir.hoc", "LinearCircuit") -} -{ -ocbox_ = new LinearCircuit(1) -} -{object_push(ocbox_)} -{version(2)} -{mkelm(8, 80, 70, 2, 0)} -{mklabel(0, "soma(0.5)", 0, 0)} -{sel.extra_info.set("soma", 0.5) sel.extra_info.name(sel)} -{mkelm(1, 100, 90, 2, 0)} -10 -{mklabel(0, "R2", 15, 15)} -{mkelm(1, 140, 90, 2, 0)} -10 -{mklabel(0, "R3", 15, 15)} -{mklabel(2, "Ve", 15, 15)} -{mkelm(2, 120, 70, 2, 1.5708)} -0.001 -{mklabel(0, "C4", 15, 15)} -{mkelm(6, 120, 30, 2, 0)} -{mkelm(5, 185, 90, 2.5, 3.14159)} -{mklabel(0, "I6", 15, 15)} -{sel.extra_info.restore()} -3 -2 0 -0.5 0.2 -1e+09 0 -{mkelm(6, 210, 70, 2, 0)} -{parasitic_ = 0 noconsist_ = 0} -{g.exec_menu("Simulate") tool(2)} -{sel = nil} -{object_pop()} -{ -{ -save_window_=ocbox_.g -save_window_.size(0,300,0,200) -scene_vector_[4] = save_window_ -ocbox_.g = save_window_ -save_window_.save_name("ocbox_.g") -save_window_.label(80, 70, "soma(0.5)", 1, 1, 0.5, 0.5, 1) -save_window_.label(115, 105, "R2", 1, 1, 0.5, 0.5, 1) -save_window_.label(155, 105, "R3", 1, 1, 0.5, 0.5, 1) -save_window_.label(175, 105, "Ve", 1, 1, 0.5, 0.5, 1) -save_window_.label(135, 85, "C4", 1, 1, 0.5, 0.5, 1) -save_window_.label(200, 105, "I6", 1, 1, 0.5, 0.5, 1) -} -ocbox_.map("LinearCircuit[0]", 190, 596, 519.36, 284.16) -} -objref ocbox_ -//End LinearCircuit[0] - -objectvar scene_vector_[1] -{doNotify()} diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/fixnseg.hoc b/allensdk/internal/model/biophysical/passive_fitting/passive/fixnseg.hoc deleted file mode 100644 index 4bd911dd6f..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/fixnseg.hoc +++ /dev/null @@ -1,43 +0,0 @@ -/* Sets nseg in each section to an odd value - so that its segments are no longer than - d_lambda x the AC length constant - at frequency freq in that section. - - Be sure to specify your own Ra and cm before calling geom_nseg() - - To understand why this works, - and the advantages of using an odd value for nseg, - see Hines, M.L. and Carnevale, N.T. - NEURON: a tool for neuroscientists. - The Neuroscientist 7:123-135, 2001. -*/ - -// these are reasonable values for most models -freq = 100 // Hz, frequency at which AC length constant will be computed -d_lambda = 0.1 - -func lambda_f() { local i, x1, x2, d1, d2, lam - if (n3d() < 2) { - return 1e5*sqrt(diam/(4*PI*$1*Ra*cm)) - } -// above was too inaccurate with large variation in 3d diameter -// so now we use all 3-d points to get a better approximate lambda - x1 = arc3d(0) - d1 = diam3d(0) - lam = 0 - for i=1, n3d()-1 { - x2 = arc3d(i) - d2 = diam3d(i) - lam += (x2 - x1)/sqrt(d1 + d2) - x1 = x2 d1 = d2 - } - // length of the section in units of lambda - lam *= sqrt(2) * 1e-5*sqrt(4*PI*$1*Ra*cm) - - return L/lam -} - -proc geom_nseg() { - soma area(0.5) // make sure diam reflects 3d points - forall { nseg = int((L/(d_lambda*lambda_f(freq))+0.9)/2)*2 + 1 } -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/iclamp.ses b/allensdk/internal/model/biophysical/passive_fitting/passive/iclamp.ses deleted file mode 100644 index 1a2a7dfc26..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/iclamp.ses +++ /dev/null @@ -1,33 +0,0 @@ -objectvar save_window_, rvp_ -objectvar scene_vector_[3] -objectvar ocbox_, ocbox_list_, scene_, scene_list_ -{ocbox_list_ = new List() scene_list_ = new List()} - -//Begin PointProcessManager -{ -load_file("pointman.hoc") -} -{ -soma ocbox_ = new PointProcessManager(0) -} -{object_push(ocbox_)} -{ -mt.select("IClamp") i = mt.selected() -ms[i] = new MechanismStandard("IClamp") -ms[i].set("del", 2, 0) -ms[i].set("dur", 0.5, 0) -ms[i].set("amp", 0.2, 0) -mt.select("IClamp") i = mt.selected() maction(i) -hoc_ac_ = 0.5 -sec.sec move() d1.flip_to(0) -} -{object_pop() doNotify()} -{ -ocbox_ = ocbox_.v1 -ocbox_.map("PointProcessManager", 66, 307, 208.32, 326.4) -} -objref ocbox_ -//End PointProcessManager - -objectvar scene_vector_[1] -{doNotify()} diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses deleted file mode 100644 index 9f0d0f0fb8..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses +++ /dev/null @@ -1,36 +0,0 @@ -objectvar save_window_, rvp_ -objectvar scene_vector_[7] -objectvar ocbox_, ocbox_list_, scene_, scene_list_ -{ocbox_list_ = new List() scene_list_ = new List()} - -//Begin MulRunFitter[0] -{ -load_file("mulfit.hoc", "MulRunFitter") -} -{ -ocbox_ = new MulRunFitter(1) -} -{object_push(ocbox_)} -{ -version(6) -ranfac = 2 -fspec = new File("mrf.ses.ft1") -fdat = new File("mrf.ses.fd1") -read_data() -build() -} -opt.set_optimizer("MulfitPraxWrap") -{object_push(opt.optimizer)} -{ -nstep = 0 -} -{object_pop()} -{object_pop()} -{ -ocbox_.map("MulRunFitter[0]", 729, 164, 360.96, 199.68) -} -objref ocbox_ -//End MulRunFitter[0] - -objectvar scene_vector_[1] -{doNotify()} diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.fd1 b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.fd1 deleted file mode 100644 index 87faaf872e..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.fd1 +++ /dev/null @@ -1,162026 +0,0 @@ -RegionFitness xdat ydat boundary weight (lines=81008) 1 -|| -40500 -0 -0.005 -0.01 -0.015 -0.02 -0.025 -0.03 -0.035 -0.04 -0.045 -0.05 -0.055 -0.06 -0.065 -0.07 -0.075 -0.08 -0.085 -0.09 -0.095 -0.1 -0.105 -0.11 -0.115 -0.12 -0.125 -0.13 -0.135 -0.14 -0.145 -0.15 -0.155 -0.16 -0.165 -0.17 -0.175 -0.18 -0.185 -0.19 -0.195 -0.2 -0.205 -0.21 -0.215 -0.22 -0.225 -0.23 -0.235 -0.24 -0.245 -0.25 -0.255 -0.26 -0.265 -0.27 -0.275 -0.28 -0.285 -0.29 -0.295 -0.3 -0.305 -0.31 -0.315 -0.32 -0.325 -0.33 -0.335 -0.34 -0.345 -0.35 -0.355 -0.36 -0.365 -0.37 -0.375 -0.38 -0.385 -0.39 -0.395 -0.4 -0.405 -0.41 -0.415 -0.42 -0.425 -0.43 -0.435 -0.44 -0.445 -0.45 -0.455 -0.46 -0.465 -0.47 -0.475 -0.48 -0.485 -0.49 -0.495 -0.5 -0.505 -0.51 -0.515 -0.52 -0.525 -0.53 -0.535 -0.54 -0.545 -0.55 -0.555 -0.56 -0.565 -0.57 -0.575 -0.58 -0.585 -0.59 -0.595 -0.6 -0.605 -0.61 -0.615 -0.62 -0.625 -0.63 -0.635 -0.64 -0.645 -0.65 -0.655 -0.66 -0.665 -0.67 -0.675 -0.68 -0.685 -0.69 -0.695 -0.7 -0.705 -0.71 -0.715 -0.72 -0.725 -0.73 -0.735 -0.74 -0.745 -0.75 -0.755 -0.76 -0.765 -0.77 -0.775 -0.78 -0.785 -0.79 -0.795 -0.8 -0.805 -0.81 -0.815 -0.82 -0.825 -0.83 -0.835 -0.84 -0.845 -0.85 -0.855 -0.86 -0.865 -0.87 -0.875 -0.88 -0.885 -0.89 -0.895 -0.9 -0.905 -0.91 -0.915 -0.92 -0.925 -0.93 -0.935 -0.94 -0.945 -0.95 -0.955 -0.96 -0.965 -0.97 -0.975 -0.98 -0.985 -0.99 -0.995 -1 -1.005 -1.01 -1.015 -1.02 -1.025 -1.03 -1.035 -1.04 -1.045 -1.05 -1.055 -1.06 -1.065 -1.07 -1.075 -1.08 -1.085 -1.09 -1.095 -1.1 -1.105 -1.11 -1.115 -1.12 -1.125 -1.13 -1.135 -1.14 -1.145 -1.15 -1.155 -1.16 -1.165 -1.17 -1.175 -1.18 -1.185 -1.19 -1.195 -1.2 -1.205 -1.21 -1.215 -1.22 -1.225 -1.23 -1.235 -1.24 -1.245 -1.25 -1.255 -1.26 -1.265 -1.27 -1.275 -1.28 -1.285 -1.29 -1.295 -1.3 -1.305 -1.31 -1.315 -1.32 -1.325 -1.33 -1.335 -1.34 -1.345 -1.35 -1.355 -1.36 -1.365 -1.37 -1.375 -1.38 -1.385 -1.39 -1.395 -1.4 -1.405 -1.41 -1.415 -1.42 -1.425 -1.43 -1.435 -1.44 -1.445 -1.45 -1.455 -1.46 -1.465 -1.47 -1.475 -1.48 -1.485 -1.49 -1.495 -1.5 -1.505 -1.51 -1.515 -1.52 -1.525 -1.53 -1.535 -1.54 -1.545 -1.55 -1.555 -1.56 -1.565 -1.57 -1.575 -1.58 -1.585 -1.59 -1.595 -1.6 -1.605 -1.61 -1.615 -1.62 -1.625 -1.63 -1.635 -1.64 -1.645 -1.65 -1.655 -1.66 -1.665 -1.67 -1.675 -1.68 -1.685 -1.69 -1.695 -1.7 -1.705 -1.71 -1.715 -1.72 -1.725 -1.73 -1.735 -1.74 -1.745 -1.75 -1.755 -1.76 -1.765 -1.77 -1.775 -1.78 -1.785 -1.79 -1.795 -1.8 -1.805 -1.81 -1.815 -1.82 -1.825 -1.83 -1.835 -1.84 -1.845 -1.85 -1.855 -1.86 -1.865 -1.87 -1.875 -1.88 -1.885 -1.89 -1.895 -1.9 -1.905 -1.91 -1.915 -1.92 -1.925 -1.93 -1.935 -1.94 -1.945 -1.95 -1.955 -1.96 -1.965 -1.97 -1.975 -1.98 -1.985 -1.99 -1.995 -2 -2.005 -2.01 -2.015 -2.02 -2.025 -2.03 -2.035 -2.04 -2.045 -2.05 -2.055 -2.06 -2.065 -2.07 -2.075 -2.08 -2.085 -2.09 -2.095 -2.1 -2.105 -2.11 -2.115 -2.12 -2.125 -2.13 -2.135 -2.14 -2.145 -2.15 -2.155 -2.16 -2.165 -2.17 -2.175 -2.18 -2.185 -2.19 -2.195 -2.2 -2.205 -2.21 -2.215 -2.22 -2.225 -2.23 -2.235 -2.24 -2.245 -2.25 -2.255 -2.26 -2.265 -2.27 -2.275 -2.28 -2.285 -2.29 -2.295 -2.3 -2.305 -2.31 -2.315 -2.32 -2.325 -2.33 -2.335 -2.34 -2.345 -2.35 -2.355 -2.36 -2.365 -2.37 -2.375 -2.38 -2.385 -2.39 -2.395 -2.4 -2.405 -2.41 -2.415 -2.42 -2.425 -2.43 -2.435 -2.44 -2.445 -2.45 -2.455 -2.46 -2.465 -2.47 -2.475 -2.48 -2.485 -2.49 -2.495 -2.5 -2.505 -2.51 -2.515 -2.52 -2.525 -2.53 -2.535 -2.54 -2.545 -2.55 -2.555 -2.56 -2.565 -2.57 -2.575 -2.58 -2.585 -2.59 -2.595 -2.6 -2.605 -2.61 -2.615 -2.62 -2.625 -2.63 -2.635 -2.64 -2.645 -2.65 -2.655 -2.66 -2.665 -2.67 -2.675 -2.68 -2.685 -2.69 -2.695 -2.7 -2.705 -2.71 -2.715 -2.72 -2.725 -2.73 -2.735 -2.74 -2.745 -2.75 -2.755 -2.76 -2.765 -2.77 -2.775 -2.78 -2.785 -2.79 -2.795 -2.8 -2.805 -2.81 -2.815 -2.82 -2.825 -2.83 -2.835 -2.84 -2.845 -2.85 -2.855 -2.86 -2.865 -2.87 -2.875 -2.88 -2.885 -2.89 -2.895 -2.9 -2.905 -2.91 -2.915 -2.92 -2.925 -2.93 -2.935 -2.94 -2.945 -2.95 -2.955 -2.96 -2.965 -2.97 -2.975 -2.98 -2.985 -2.99 -2.995 -3 -3.005 -3.01 -3.015 -3.02 -3.025 -3.03 -3.035 -3.04 -3.045 -3.05 -3.055 -3.06 -3.065 -3.07 -3.075 -3.08 -3.085 -3.09 -3.095 -3.1 -3.105 -3.11 -3.115 -3.12 -3.125 -3.13 -3.135 -3.14 -3.145 -3.15 -3.155 -3.16 -3.165 -3.17 -3.175 -3.18 -3.185 -3.19 -3.195 -3.2 -3.205 -3.21 -3.215 -3.22 -3.225 -3.23 -3.235 -3.24 -3.245 -3.25 -3.255 -3.26 -3.265 -3.27 -3.275 -3.28 -3.285 -3.29 -3.295 -3.3 -3.305 -3.31 -3.315 -3.32 -3.325 -3.33 -3.335 -3.34 -3.345 -3.35 -3.355 -3.36 -3.365 -3.37 -3.375 -3.38 -3.385 -3.39 -3.395 -3.4 -3.405 -3.41 -3.415 -3.42 -3.425 -3.43 -3.435 -3.44 -3.445 -3.45 -3.455 -3.46 -3.465 -3.47 -3.475 -3.48 -3.485 -3.49 -3.495 -3.5 -3.505 -3.51 -3.515 -3.52 -3.525 -3.53 -3.535 -3.54 -3.545 -3.55 -3.555 -3.56 -3.565 -3.57 -3.575 -3.58 -3.585 -3.59 -3.595 -3.6 -3.605 -3.61 -3.615 -3.62 -3.625 -3.63 -3.635 -3.64 -3.645 -3.65 -3.655 -3.66 -3.665 -3.67 -3.675 -3.68 -3.685 -3.69 -3.695 -3.7 -3.705 -3.71 -3.715 -3.72 -3.725 -3.73 -3.735 -3.74 -3.745 -3.75 -3.755 -3.76 -3.765 -3.77 -3.775 -3.78 -3.785 -3.79 -3.795 -3.8 -3.805 -3.81 -3.815 -3.82 -3.825 -3.83 -3.835 -3.84 -3.845 -3.85 -3.855 -3.86 -3.865 -3.87 -3.875 -3.88 -3.885 -3.89 -3.895 -3.9 -3.905 -3.91 -3.915 -3.92 -3.925 -3.93 -3.935 -3.94 -3.945 -3.95 -3.955 -3.96 -3.965 -3.97 -3.975 -3.98 -3.985 -3.99 -3.995 -4 -4.005 -4.01 -4.015 -4.02 -4.025 -4.03 -4.035 -4.04 -4.045 -4.05 -4.055 -4.06 -4.065 -4.07 -4.075 -4.08 -4.085 -4.09 -4.095 -4.1 -4.105 -4.11 -4.115 -4.12 -4.125 -4.13 -4.135 -4.14 -4.145 -4.15 -4.155 -4.16 -4.165 -4.17 -4.175 -4.18 -4.185 -4.19 -4.195 -4.2 -4.205 -4.21 -4.215 -4.22 -4.225 -4.23 -4.235 -4.24 -4.245 -4.25 -4.255 -4.26 -4.265 -4.27 -4.275 -4.28 -4.285 -4.29 -4.295 -4.3 -4.305 -4.31 -4.315 -4.32 -4.325 -4.33 -4.335 -4.34 -4.345 -4.35 -4.355 -4.36 -4.365 -4.37 -4.375 -4.38 -4.385 -4.39 -4.395 -4.4 -4.405 -4.41 -4.415 -4.42 -4.425 -4.43 -4.435 -4.44 -4.445 -4.45 -4.455 -4.46 -4.465 -4.47 -4.475 -4.48 -4.485 -4.49 -4.495 -4.5 -4.505 -4.51 -4.515 -4.52 -4.525 -4.53 -4.535 -4.54 -4.545 -4.55 -4.555 -4.56 -4.565 -4.57 -4.575 -4.58 -4.585 -4.59 -4.595 -4.6 -4.605 -4.61 -4.615 -4.62 -4.625 -4.63 -4.635 -4.64 -4.645 -4.65 -4.655 -4.66 -4.665 -4.67 -4.675 -4.68 -4.685 -4.69 -4.695 -4.7 -4.705 -4.71 -4.715 -4.72 -4.725 -4.73 -4.735 -4.74 -4.745 -4.75 -4.755 -4.76 -4.765 -4.77 -4.775 -4.78 -4.785 -4.79 -4.795 -4.8 -4.805 -4.81 -4.815 -4.82 -4.825 -4.83 -4.835 -4.84 -4.845 -4.85 -4.855 -4.86 -4.865 -4.87 -4.875 -4.88 -4.885 -4.89 -4.895 -4.9 -4.905 -4.91 -4.915 -4.92 -4.925 -4.93 -4.935 -4.94 -4.945 -4.95 -4.955 -4.96 -4.965 -4.97 -4.975 -4.98 -4.985 -4.99 -4.995 -5 -5.005 -5.01 -5.015 -5.02 -5.025 -5.03 -5.035 -5.04 -5.045 -5.05 -5.055 -5.06 -5.065 -5.07 -5.075 -5.08 -5.085 -5.09 -5.095 -5.1 -5.105 -5.11 -5.115 -5.12 -5.125 -5.13 -5.135 -5.14 -5.145 -5.15 -5.155 -5.16 -5.165 -5.17 -5.175 -5.18 -5.185 -5.19 -5.195 -5.2 -5.205 -5.21 -5.215 -5.22 -5.225 -5.23 -5.235 -5.24 -5.245 -5.25 -5.255 -5.26 -5.265 -5.27 -5.275 -5.28 -5.285 -5.29 -5.295 -5.3 -5.305 -5.31 -5.315 -5.32 -5.325 -5.33 -5.335 -5.34 -5.345 -5.35 -5.355 -5.36 -5.365 -5.37 -5.375 -5.38 -5.385 -5.39 -5.395 -5.4 -5.405 -5.41 -5.415 -5.42 -5.425 -5.43 -5.435 -5.44 -5.445 -5.45 -5.455 -5.46 -5.465 -5.47 -5.475 -5.48 -5.485 -5.49 -5.495 -5.5 -5.505 -5.51 -5.515 -5.52 -5.525 -5.53 -5.535 -5.54 -5.545 -5.55 -5.555 -5.56 -5.565 -5.57 -5.575 -5.58 -5.585 -5.59 -5.595 -5.6 -5.605 -5.61 -5.615 -5.62 -5.625 -5.63 -5.635 -5.64 -5.645 -5.65 -5.655 -5.66 -5.665 -5.67 -5.675 -5.68 -5.685 -5.69 -5.695 -5.7 -5.705 -5.71 -5.715 -5.72 -5.725 -5.73 -5.735 -5.74 -5.745 -5.75 -5.755 -5.76 -5.765 -5.77 -5.775 -5.78 -5.785 -5.79 -5.795 -5.8 -5.805 -5.81 -5.815 -5.82 -5.825 -5.83 -5.835 -5.84 -5.845 -5.85 -5.855 -5.86 -5.865 -5.87 -5.875 -5.88 -5.885 -5.89 -5.895 -5.9 -5.905 -5.91 -5.915 -5.92 -5.925 -5.93 -5.935 -5.94 -5.945 -5.95 -5.955 -5.96 -5.965 -5.97 -5.975 -5.98 -5.985 -5.99 -5.995 -6 -6.005 -6.01 -6.015 -6.02 -6.025 -6.03 -6.035 -6.04 -6.045 -6.05 -6.055 -6.06 -6.065 -6.07 -6.075 -6.08 -6.085 -6.09 -6.095 -6.1 -6.105 -6.11 -6.115 -6.12 -6.125 -6.13 -6.135 -6.14 -6.145 -6.15 -6.155 -6.16 -6.165 -6.17 -6.175 -6.18 -6.185 -6.19 -6.195 -6.2 -6.205 -6.21 -6.215 -6.22 -6.225 -6.23 -6.235 -6.24 -6.245 -6.25 -6.255 -6.26 -6.265 -6.27 -6.275 -6.28 -6.285 -6.29 -6.295 -6.3 -6.305 -6.31 -6.315 -6.32 -6.325 -6.33 -6.335 -6.34 -6.345 -6.35 -6.355 -6.36 -6.365 -6.37 -6.375 -6.38 -6.385 -6.39 -6.395 -6.4 -6.405 -6.41 -6.415 -6.42 -6.425 -6.43 -6.435 -6.44 -6.445 -6.45 -6.455 -6.46 -6.465 -6.47 -6.475 -6.48 -6.485 -6.49 -6.495 -6.5 -6.505 -6.51 -6.515 -6.52 -6.525 -6.53 -6.535 -6.54 -6.545 -6.55 -6.555 -6.56 -6.565 -6.57 -6.575 -6.58 -6.585 -6.59 -6.595 -6.6 -6.605 -6.61 -6.615 -6.62 -6.625 -6.63 -6.635 -6.64 -6.645 -6.65 -6.655 -6.66 -6.665 -6.67 -6.675 -6.68 -6.685 -6.69 -6.695 -6.7 -6.705 -6.71 -6.715 -6.72 -6.725 -6.73 -6.735 -6.74 -6.745 -6.75 -6.755 -6.76 -6.765 -6.77 -6.775 -6.78 -6.785 -6.79 -6.795 -6.8 -6.805 -6.81 -6.815 -6.82 -6.825 -6.83 -6.835 -6.84 -6.845 -6.85 -6.855 -6.86 -6.865 -6.87 -6.875 -6.88 -6.885 -6.89 -6.895 -6.9 -6.905 -6.91 -6.915 -6.92 -6.925 -6.93 -6.935 -6.94 -6.945 -6.95 -6.955 -6.96 -6.965 -6.97 -6.975 -6.98 -6.985 -6.99 -6.995 -7 -7.005 -7.01 -7.015 -7.02 -7.025 -7.03 -7.035 -7.04 -7.045 -7.05 -7.055 -7.06 -7.065 -7.07 -7.075 -7.08 -7.085 -7.09 -7.095 -7.1 -7.105 -7.11 -7.115 -7.12 -7.125 -7.13 -7.135 -7.14 -7.145 -7.15 -7.155 -7.16 -7.165 -7.17 -7.175 -7.18 -7.185 -7.19 -7.195 -7.2 -7.205 -7.21 -7.215 -7.22 -7.225 -7.23 -7.235 -7.24 -7.245 -7.25 -7.255 -7.26 -7.265 -7.27 -7.275 -7.28 -7.285 -7.29 -7.295 -7.3 -7.305 -7.31 -7.315 -7.32 -7.325 -7.33 -7.335 -7.34 -7.345 -7.35 -7.355 -7.36 -7.365 -7.37 -7.375 -7.38 -7.385 -7.39 -7.395 -7.4 -7.405 -7.41 -7.415 -7.42 -7.425 -7.43 -7.435 -7.44 -7.445 -7.45 -7.455 -7.46 -7.465 -7.47 -7.475 -7.48 -7.485 -7.49 -7.495 -7.5 -7.505 -7.51 -7.515 -7.52 -7.525 -7.53 -7.535 -7.54 -7.545 -7.55 -7.555 -7.56 -7.565 -7.57 -7.575 -7.58 -7.585 -7.59 -7.595 -7.6 -7.605 -7.61 -7.615 -7.62 -7.625 -7.63 -7.635 -7.64 -7.645 -7.65 -7.655 -7.66 -7.665 -7.67 -7.675 -7.68 -7.685 -7.69 -7.695 -7.7 -7.705 -7.71 -7.715 -7.72 -7.725 -7.73 -7.735 -7.74 -7.745 -7.75 -7.755 -7.76 -7.765 -7.77 -7.775 -7.78 -7.785 -7.79 -7.795 -7.8 -7.805 -7.81 -7.815 -7.82 -7.825 -7.83 -7.835 -7.84 -7.845 -7.85 -7.855 -7.86 -7.865 -7.87 -7.875 -7.88 -7.885 -7.89 -7.895 -7.9 -7.905 -7.91 -7.915 -7.92 -7.925 -7.93 -7.935 -7.94 -7.945 -7.95 -7.955 -7.96 -7.965 -7.97 -7.975 -7.98 -7.985 -7.99 -7.995 -8 -8.005 -8.01 -8.015 -8.02 -8.025 -8.03 -8.035 -8.04 -8.045 -8.05 -8.055 -8.06 -8.065 -8.07 -8.075 -8.08 -8.085 -8.09 -8.095 -8.1 -8.105 -8.11 -8.115 -8.12 -8.125 -8.13 -8.135 -8.14 -8.145 -8.15 -8.155 -8.16 -8.165 -8.17 -8.175 -8.18 -8.185 -8.19 -8.195 -8.2 -8.205 -8.21 -8.215 -8.22 -8.225 -8.23 -8.235 -8.24 -8.245 -8.25 -8.255 -8.26 -8.265 -8.27 -8.275 -8.28 -8.285 -8.29 -8.295 -8.3 -8.305 -8.31 -8.315 -8.32 -8.325 -8.33 -8.335 -8.34 -8.345 -8.35 -8.355 -8.36 -8.365 -8.37 -8.375 -8.38 -8.385 -8.39 -8.395 -8.4 -8.405 -8.41 -8.415 -8.42 -8.425 -8.43 -8.435 -8.44 -8.445 -8.45 -8.455 -8.46 -8.465 -8.47 -8.475 -8.48 -8.485 -8.49 -8.495 -8.5 -8.505 -8.51 -8.515 -8.52 -8.525 -8.53 -8.535 -8.54 -8.545 -8.55 -8.555 -8.56 -8.565 -8.57 -8.575 -8.58 -8.585 -8.59 -8.595 -8.6 -8.605 -8.61 -8.615 -8.62 -8.625 -8.63 -8.635 -8.64 -8.645 -8.65 -8.655 -8.66 -8.665 -8.67 -8.675 -8.68 -8.685 -8.69 -8.695 -8.7 -8.705 -8.71 -8.715 -8.72 -8.725 -8.73 -8.735 -8.74 -8.745 -8.75 -8.755 -8.76 -8.765 -8.77 -8.775 -8.78 -8.785 -8.79 -8.795 -8.8 -8.805 -8.81 -8.815 -8.82 -8.825 -8.83 -8.835 -8.84 -8.845 -8.85 -8.855 -8.86 -8.865 -8.87 -8.875 -8.88 -8.885 -8.89 -8.895 -8.9 -8.905 -8.91 -8.915 -8.92 -8.925 -8.93 -8.935 -8.94 -8.945 -8.95 -8.955 -8.96 -8.965 -8.97 -8.975 -8.98 -8.985 -8.99 -8.995 -9 -9.005 -9.01 -9.015 -9.02 -9.025 -9.03 -9.035 -9.04 -9.045 -9.05 -9.055 -9.06 -9.065 -9.07 -9.075 -9.08 -9.085 -9.09 -9.095 -9.1 -9.105 -9.11 -9.115 -9.12 -9.125 -9.13 -9.135 -9.14 -9.145 -9.15 -9.155 -9.16 -9.165 -9.17 -9.175 -9.18 -9.185 -9.19 -9.195 -9.2 -9.205 -9.21 -9.215 -9.22 -9.225 -9.23 -9.235 -9.24 -9.245 -9.25 -9.255 -9.26 -9.265 -9.27 -9.275 -9.28 -9.285 -9.29 -9.295 -9.3 -9.305 -9.31 -9.315 -9.32 -9.325 -9.33 -9.335 -9.34 -9.345 -9.35 -9.355 -9.36 -9.365 -9.37 -9.375 -9.38 -9.385 -9.39 -9.395 -9.4 -9.405 -9.41 -9.415 -9.42 -9.425 -9.43 -9.435 -9.44 -9.445 -9.45 -9.455 -9.46 -9.465 -9.47 -9.475 -9.48 -9.485 -9.49 -9.495 -9.5 -9.505 -9.51 -9.515 -9.52 -9.525 -9.53 -9.535 -9.54 -9.545 -9.55 -9.555 -9.56 -9.565 -9.57 -9.575 -9.58 -9.585 -9.59 -9.595 -9.6 -9.605 -9.61 -9.615 -9.62 -9.625 -9.63 -9.635 -9.64 -9.645 -9.65 -9.655 -9.66 -9.665 -9.67 -9.675 -9.68 -9.685 -9.69 -9.695 -9.7 -9.705 -9.71 -9.715 -9.72 -9.725 -9.73 -9.735 -9.74 -9.745 -9.75 -9.755 -9.76 -9.765 -9.77 -9.775 -9.78 -9.785 -9.79 -9.795 -9.8 -9.805 -9.81 -9.815 -9.82 -9.825 -9.83 -9.835 -9.84 -9.845 -9.85 -9.855 -9.86 -9.865 -9.87 -9.875 -9.88 -9.885 -9.89 -9.895 -9.9 -9.905 -9.91 -9.915 -9.92 -9.925 -9.93 -9.935 -9.94 -9.945 -9.95 -9.955 -9.96 -9.965 -9.97 -9.975 -9.98 -9.985 -9.99 -9.995 -10 -10.005 -10.01 -10.015 -10.02 -10.025 -10.03 -10.035 -10.04 -10.045 -10.05 -10.055 -10.06 -10.065 -10.07 -10.075 -10.08 -10.085 -10.09 -10.095 -10.1 -10.105 -10.11 -10.115 -10.12 -10.125 -10.13 -10.135 -10.14 -10.145 -10.15 -10.155 -10.16 -10.165 -10.17 -10.175 -10.18 -10.185 -10.19 -10.195 -10.2 -10.205 -10.21 -10.215 -10.22 -10.225 -10.23 -10.235 -10.24 -10.245 -10.25 -10.255 -10.26 -10.265 -10.27 -10.275 -10.28 -10.285 -10.29 -10.295 -10.3 -10.305 -10.31 -10.315 -10.32 -10.325 -10.33 -10.335 -10.34 -10.345 -10.35 -10.355 -10.36 -10.365 -10.37 -10.375 -10.38 -10.385 -10.39 -10.395 -10.4 -10.405 -10.41 -10.415 -10.42 -10.425 -10.43 -10.435 -10.44 -10.445 -10.45 -10.455 -10.46 -10.465 -10.47 -10.475 -10.48 -10.485 -10.49 -10.495 -10.5 -10.505 -10.51 -10.515 -10.52 -10.525 -10.53 -10.535 -10.54 -10.545 -10.55 -10.555 -10.56 -10.565 -10.57 -10.575 -10.58 -10.585 -10.59 -10.595 -10.6 -10.605 -10.61 -10.615 -10.62 -10.625 -10.63 -10.635 -10.64 -10.645 -10.65 -10.655 -10.66 -10.665 -10.67 -10.675 -10.68 -10.685 -10.69 -10.695 -10.7 -10.705 -10.71 -10.715 -10.72 -10.725 -10.73 -10.735 -10.74 -10.745 -10.75 -10.755 -10.76 -10.765 -10.77 -10.775 -10.78 -10.785 -10.79 -10.795 -10.8 -10.805 -10.81 -10.815 -10.82 -10.825 -10.83 -10.835 -10.84 -10.845 -10.85 -10.855 -10.86 -10.865 -10.87 -10.875 -10.88 -10.885 -10.89 -10.895 -10.9 -10.905 -10.91 -10.915 -10.92 -10.925 -10.93 -10.935 -10.94 -10.945 -10.95 -10.955 -10.96 -10.965 -10.97 -10.975 -10.98 -10.985 -10.99 -10.995 -11 -11.005 -11.01 -11.015 -11.02 -11.025 -11.03 -11.035 -11.04 -11.045 -11.05 -11.055 -11.06 -11.065 -11.07 -11.075 -11.08 -11.085 -11.09 -11.095 -11.1 -11.105 -11.11 -11.115 -11.12 -11.125 -11.13 -11.135 -11.14 -11.145 -11.15 -11.155 -11.16 -11.165 -11.17 -11.175 -11.18 -11.185 -11.19 -11.195 -11.2 -11.205 -11.21 -11.215 -11.22 -11.225 -11.23 -11.235 -11.24 -11.245 -11.25 -11.255 -11.26 -11.265 -11.27 -11.275 -11.28 -11.285 -11.29 -11.295 -11.3 -11.305 -11.31 -11.315 -11.32 -11.325 -11.33 -11.335 -11.34 -11.345 -11.35 -11.355 -11.36 -11.365 -11.37 -11.375 -11.38 -11.385 -11.39 -11.395 -11.4 -11.405 -11.41 -11.415 -11.42 -11.425 -11.43 -11.435 -11.44 -11.445 -11.45 -11.455 -11.46 -11.465 -11.47 -11.475 -11.48 -11.485 -11.49 -11.495 -11.5 -11.505 -11.51 -11.515 -11.52 -11.525 -11.53 -11.535 -11.54 -11.545 -11.55 -11.555 -11.56 -11.565 -11.57 -11.575 -11.58 -11.585 -11.59 -11.595 -11.6 -11.605 -11.61 -11.615 -11.62 -11.625 -11.63 -11.635 -11.64 -11.645 -11.65 -11.655 -11.66 -11.665 -11.67 -11.675 -11.68 -11.685 -11.69 -11.695 -11.7 -11.705 -11.71 -11.715 -11.72 -11.725 -11.73 -11.735 -11.74 -11.745 -11.75 -11.755 -11.76 -11.765 -11.77 -11.775 -11.78 -11.785 -11.79 -11.795 -11.8 -11.805 -11.81 -11.815 -11.82 -11.825 -11.83 -11.835 -11.84 -11.845 -11.85 -11.855 -11.86 -11.865 -11.87 -11.875 -11.88 -11.885 -11.89 -11.895 -11.9 -11.905 -11.91 -11.915 -11.92 -11.925 -11.93 -11.935 -11.94 -11.945 -11.95 -11.955 -11.96 -11.965 -11.97 -11.975 -11.98 -11.985 -11.99 -11.995 -12 -12.005 -12.01 -12.015 -12.02 -12.025 -12.03 -12.035 -12.04 -12.045 -12.05 -12.055 -12.06 -12.065 -12.07 -12.075 -12.08 -12.085 -12.09 -12.095 -12.1 -12.105 -12.11 -12.115 -12.12 -12.125 -12.13 -12.135 -12.14 -12.145 -12.15 -12.155 -12.16 -12.165 -12.17 -12.175 -12.18 -12.185 -12.19 -12.195 -12.2 -12.205 -12.21 -12.215 -12.22 -12.225 -12.23 -12.235 -12.24 -12.245 -12.25 -12.255 -12.26 -12.265 -12.27 -12.275 -12.28 -12.285 -12.29 -12.295 -12.3 -12.305 -12.31 -12.315 -12.32 -12.325 -12.33 -12.335 -12.34 -12.345 -12.35 -12.355 -12.36 -12.365 -12.37 -12.375 -12.38 -12.385 -12.39 -12.395 -12.4 -12.405 -12.41 -12.415 -12.42 -12.425 -12.43 -12.435 -12.44 -12.445 -12.45 -12.455 -12.46 -12.465 -12.47 -12.475 -12.48 -12.485 -12.49 -12.495 -12.5 -12.505 -12.51 -12.515 -12.52 -12.525 -12.53 -12.535 -12.54 -12.545 -12.55 -12.555 -12.56 -12.565 -12.57 -12.575 -12.58 -12.585 -12.59 -12.595 -12.6 -12.605 -12.61 -12.615 -12.62 -12.625 -12.63 -12.635 -12.64 -12.645 -12.65 -12.655 -12.66 -12.665 -12.67 -12.675 -12.68 -12.685 -12.69 -12.695 -12.7 -12.705 -12.71 -12.715 -12.72 -12.725 -12.73 -12.735 -12.74 -12.745 -12.75 -12.755 -12.76 -12.765 -12.77 -12.775 -12.78 -12.785 -12.79 -12.795 -12.8 -12.805 -12.81 -12.815 -12.82 -12.825 -12.83 -12.835 -12.84 -12.845 -12.85 -12.855 -12.86 -12.865 -12.87 -12.875 -12.88 -12.885 -12.89 -12.895 -12.9 -12.905 -12.91 -12.915 -12.92 -12.925 -12.93 -12.935 -12.94 -12.945 -12.95 -12.955 -12.96 -12.965 -12.97 -12.975 -12.98 -12.985 -12.99 -12.995 -13 -13.005 -13.01 -13.015 -13.02 -13.025 -13.03 -13.035 -13.04 -13.045 -13.05 -13.055 -13.06 -13.065 -13.07 -13.075 -13.08 -13.085 -13.09 -13.095 -13.1 -13.105 -13.11 -13.115 -13.12 -13.125 -13.13 -13.135 -13.14 -13.145 -13.15 -13.155 -13.16 -13.165 -13.17 -13.175 -13.18 -13.185 -13.19 -13.195 -13.2 -13.205 -13.21 -13.215 -13.22 -13.225 -13.23 -13.235 -13.24 -13.245 -13.25 -13.255 -13.26 -13.265 -13.27 -13.275 -13.28 -13.285 -13.29 -13.295 -13.3 -13.305 -13.31 -13.315 -13.32 -13.325 -13.33 -13.335 -13.34 -13.345 -13.35 -13.355 -13.36 -13.365 -13.37 -13.375 -13.38 -13.385 -13.39 -13.395 -13.4 -13.405 -13.41 -13.415 -13.42 -13.425 -13.43 -13.435 -13.44 -13.445 -13.45 -13.455 -13.46 -13.465 -13.47 -13.475 -13.48 -13.485 -13.49 -13.495 -13.5 -13.505 -13.51 -13.515 -13.52 -13.525 -13.53 -13.535 -13.54 -13.545 -13.55 -13.555 -13.56 -13.565 -13.57 -13.575 -13.58 -13.585 -13.59 -13.595 -13.6 -13.605 -13.61 -13.615 -13.62 -13.625 -13.63 -13.635 -13.64 -13.645 -13.65 -13.655 -13.66 -13.665 -13.67 -13.675 -13.68 -13.685 -13.69 -13.695 -13.7 -13.705 -13.71 -13.715 -13.72 -13.725 -13.73 -13.735 -13.74 -13.745 -13.75 -13.755 -13.76 -13.765 -13.77 -13.775 -13.78 -13.785 -13.79 -13.795 -13.8 -13.805 -13.81 -13.815 -13.82 -13.825 -13.83 -13.835 -13.84 -13.845 -13.85 -13.855 -13.86 -13.865 -13.87 -13.875 -13.88 -13.885 -13.89 -13.895 -13.9 -13.905 -13.91 -13.915 -13.92 -13.925 -13.93 -13.935 -13.94 -13.945 -13.95 -13.955 -13.96 -13.965 -13.97 -13.975 -13.98 -13.985 -13.99 -13.995 -14 -14.005 -14.01 -14.015 -14.02 -14.025 -14.03 -14.035 -14.04 -14.045 -14.05 -14.055 -14.06 -14.065 -14.07 -14.075 -14.08 -14.085 -14.09 -14.095 -14.1 -14.105 -14.11 -14.115 -14.12 -14.125 -14.13 -14.135 -14.14 -14.145 -14.15 -14.155 -14.16 -14.165 -14.17 -14.175 -14.18 -14.185 -14.19 -14.195 -14.2 -14.205 -14.21 -14.215 -14.22 -14.225 -14.23 -14.235 -14.24 -14.245 -14.25 -14.255 -14.26 -14.265 -14.27 -14.275 -14.28 -14.285 -14.29 -14.295 -14.3 -14.305 -14.31 -14.315 -14.32 -14.325 -14.33 -14.335 -14.34 -14.345 -14.35 -14.355 -14.36 -14.365 -14.37 -14.375 -14.38 -14.385 -14.39 -14.395 -14.4 -14.405 -14.41 -14.415 -14.42 -14.425 -14.43 -14.435 -14.44 -14.445 -14.45 -14.455 -14.46 -14.465 -14.47 -14.475 -14.48 -14.485 -14.49 -14.495 -14.5 -14.505 -14.51 -14.515 -14.52 -14.525 -14.53 -14.535 -14.54 -14.545 -14.55 -14.555 -14.56 -14.565 -14.57 -14.575 -14.58 -14.585 -14.59 -14.595 -14.6 -14.605 -14.61 -14.615 -14.62 -14.625 -14.63 -14.635 -14.64 -14.645 -14.65 -14.655 -14.66 -14.665 -14.67 -14.675 -14.68 -14.685 -14.69 -14.695 -14.7 -14.705 -14.71 -14.715 -14.72 -14.725 -14.73 -14.735 -14.74 -14.745 -14.75 -14.755 -14.76 -14.765 -14.77 -14.775 -14.78 -14.785 -14.79 -14.795 -14.8 -14.805 -14.81 -14.815 -14.82 -14.825 -14.83 -14.835 -14.84 -14.845 -14.85 -14.855 -14.86 -14.865 -14.87 -14.875 -14.88 -14.885 -14.89 -14.895 -14.9 -14.905 -14.91 -14.915 -14.92 -14.925 -14.93 -14.935 -14.94 -14.945 -14.95 -14.955 -14.96 -14.965 -14.97 -14.975 -14.98 -14.985 -14.99 -14.995 -15 -15.005 -15.01 -15.015 -15.02 -15.025 -15.03 -15.035 -15.04 -15.045 -15.05 -15.055 -15.06 -15.065 -15.07 -15.075 -15.08 -15.085 -15.09 -15.095 -15.1 -15.105 -15.11 -15.115 -15.12 -15.125 -15.13 -15.135 -15.14 -15.145 -15.15 -15.155 -15.16 -15.165 -15.17 -15.175 -15.18 -15.185 -15.19 -15.195 -15.2 -15.205 -15.21 -15.215 -15.22 -15.225 -15.23 -15.235 -15.24 -15.245 -15.25 -15.255 -15.26 -15.265 -15.27 -15.275 -15.28 -15.285 -15.29 -15.295 -15.3 -15.305 -15.31 -15.315 -15.32 -15.325 -15.33 -15.335 -15.34 -15.345 -15.35 -15.355 -15.36 -15.365 -15.37 -15.375 -15.38 -15.385 -15.39 -15.395 -15.4 -15.405 -15.41 -15.415 -15.42 -15.425 -15.43 -15.435 -15.44 -15.445 -15.45 -15.455 -15.46 -15.465 -15.47 -15.475 -15.48 -15.485 -15.49 -15.495 -15.5 -15.505 -15.51 -15.515 -15.52 -15.525 -15.53 -15.535 -15.54 -15.545 -15.55 -15.555 -15.56 -15.565 -15.57 -15.575 -15.58 -15.585 -15.59 -15.595 -15.6 -15.605 -15.61 -15.615 -15.62 -15.625 -15.63 -15.635 -15.64 -15.645 -15.65 -15.655 -15.66 -15.665 -15.67 -15.675 -15.68 -15.685 -15.69 -15.695 -15.7 -15.705 -15.71 -15.715 -15.72 -15.725 -15.73 -15.735 -15.74 -15.745 -15.75 -15.755 -15.76 -15.765 -15.77 -15.775 -15.78 -15.785 -15.79 -15.795 -15.8 -15.805 -15.81 -15.815 -15.82 -15.825 -15.83 -15.835 -15.84 -15.845 -15.85 -15.855 -15.86 -15.865 -15.87 -15.875 -15.88 -15.885 -15.89 -15.895 -15.9 -15.905 -15.91 -15.915 -15.92 -15.925 -15.93 -15.935 -15.94 -15.945 -15.95 -15.955 -15.96 -15.965 -15.97 -15.975 -15.98 -15.985 -15.99 -15.995 -16 -16.005 -16.01 -16.015 -16.02 -16.025 -16.03 -16.035 -16.04 -16.045 -16.05 -16.055 -16.06 -16.065 -16.07 -16.075 -16.08 -16.085 -16.09 -16.095 -16.1 -16.105 -16.11 -16.115 -16.12 -16.125 -16.13 -16.135 -16.14 -16.145 -16.15 -16.155 -16.16 -16.165 -16.17 -16.175 -16.18 -16.185 -16.19 -16.195 -16.2 -16.205 -16.21 -16.215 -16.22 -16.225 -16.23 -16.235 -16.24 -16.245 -16.25 -16.255 -16.26 -16.265 -16.27 -16.275 -16.28 -16.285 -16.29 -16.295 -16.3 -16.305 -16.31 -16.315 -16.32 -16.325 -16.33 -16.335 -16.34 -16.345 -16.35 -16.355 -16.36 -16.365 -16.37 -16.375 -16.38 -16.385 -16.39 -16.395 -16.4 -16.405 -16.41 -16.415 -16.42 -16.425 -16.43 -16.435 -16.44 -16.445 -16.45 -16.455 -16.46 -16.465 -16.47 -16.475 -16.48 -16.485 -16.49 -16.495 -16.5 -16.505 -16.51 -16.515 -16.52 -16.525 -16.53 -16.535 -16.54 -16.545 -16.55 -16.555 -16.56 -16.565 -16.57 -16.575 -16.58 -16.585 -16.59 -16.595 -16.6 -16.605 -16.61 -16.615 -16.62 -16.625 -16.63 -16.635 -16.64 -16.645 -16.65 -16.655 -16.66 -16.665 -16.67 -16.675 -16.68 -16.685 -16.69 -16.695 -16.7 -16.705 -16.71 -16.715 -16.72 -16.725 -16.73 -16.735 -16.74 -16.745 -16.75 -16.755 -16.76 -16.765 -16.77 -16.775 -16.78 -16.785 -16.79 -16.795 -16.8 -16.805 -16.81 -16.815 -16.82 -16.825 -16.83 -16.835 -16.84 -16.845 -16.85 -16.855 -16.86 -16.865 -16.87 -16.875 -16.88 -16.885 -16.89 -16.895 -16.9 -16.905 -16.91 -16.915 -16.92 -16.925 -16.93 -16.935 -16.94 -16.945 -16.95 -16.955 -16.96 -16.965 -16.97 -16.975 -16.98 -16.985 -16.99 -16.995 -17 -17.005 -17.01 -17.015 -17.02 -17.025 -17.03 -17.035 -17.04 -17.045 -17.05 -17.055 -17.06 -17.065 -17.07 -17.075 -17.08 -17.085 -17.09 -17.095 -17.1 -17.105 -17.11 -17.115 -17.12 -17.125 -17.13 -17.135 -17.14 -17.145 -17.15 -17.155 -17.16 -17.165 -17.17 -17.175 -17.18 -17.185 -17.19 -17.195 -17.2 -17.205 -17.21 -17.215 -17.22 -17.225 -17.23 -17.235 -17.24 -17.245 -17.25 -17.255 -17.26 -17.265 -17.27 -17.275 -17.28 -17.285 -17.29 -17.295 -17.3 -17.305 -17.31 -17.315 -17.32 -17.325 -17.33 -17.335 -17.34 -17.345 -17.35 -17.355 -17.36 -17.365 -17.37 -17.375 -17.38 -17.385 -17.39 -17.395 -17.4 -17.405 -17.41 -17.415 -17.42 -17.425 -17.43 -17.435 -17.44 -17.445 -17.45 -17.455 -17.46 -17.465 -17.47 -17.475 -17.48 -17.485 -17.49 -17.495 -17.5 -17.505 -17.51 -17.515 -17.52 -17.525 -17.53 -17.535 -17.54 -17.545 -17.55 -17.555 -17.56 -17.565 -17.57 -17.575 -17.58 -17.585 -17.59 -17.595 -17.6 -17.605 -17.61 -17.615 -17.62 -17.625 -17.63 -17.635 -17.64 -17.645 -17.65 -17.655 -17.66 -17.665 -17.67 -17.675 -17.68 -17.685 -17.69 -17.695 -17.7 -17.705 -17.71 -17.715 -17.72 -17.725 -17.73 -17.735 -17.74 -17.745 -17.75 -17.755 -17.76 -17.765 -17.77 -17.775 -17.78 -17.785 -17.79 -17.795 -17.8 -17.805 -17.81 -17.815 -17.82 -17.825 -17.83 -17.835 -17.84 -17.845 -17.85 -17.855 -17.86 -17.865 -17.87 -17.875 -17.88 -17.885 -17.89 -17.895 -17.9 -17.905 -17.91 -17.915 -17.92 -17.925 -17.93 -17.935 -17.94 -17.945 -17.95 -17.955 -17.96 -17.965 -17.97 -17.975 -17.98 -17.985 -17.99 -17.995 -18 -18.005 -18.01 -18.015 -18.02 -18.025 -18.03 -18.035 -18.04 -18.045 -18.05 -18.055 -18.06 -18.065 -18.07 -18.075 -18.08 -18.085 -18.09 -18.095 -18.1 -18.105 -18.11 -18.115 -18.12 -18.125 -18.13 -18.135 -18.14 -18.145 -18.15 -18.155 -18.16 -18.165 -18.17 -18.175 -18.18 -18.185 -18.19 -18.195 -18.2 -18.205 -18.21 -18.215 -18.22 -18.225 -18.23 -18.235 -18.24 -18.245 -18.25 -18.255 -18.26 -18.265 -18.27 -18.275 -18.28 -18.285 -18.29 -18.295 -18.3 -18.305 -18.31 -18.315 -18.32 -18.325 -18.33 -18.335 -18.34 -18.345 -18.35 -18.355 -18.36 -18.365 -18.37 -18.375 -18.38 -18.385 -18.39 -18.395 -18.4 -18.405 -18.41 -18.415 -18.42 -18.425 -18.43 -18.435 -18.44 -18.445 -18.45 -18.455 -18.46 -18.465 -18.47 -18.475 -18.48 -18.485 -18.49 -18.495 -18.5 -18.505 -18.51 -18.515 -18.52 -18.525 -18.53 -18.535 -18.54 -18.545 -18.55 -18.555 -18.56 -18.565 -18.57 -18.575 -18.58 -18.585 -18.59 -18.595 -18.6 -18.605 -18.61 -18.615 -18.62 -18.625 -18.63 -18.635 -18.64 -18.645 -18.65 -18.655 -18.66 -18.665 -18.67 -18.675 -18.68 -18.685 -18.69 -18.695 -18.7 -18.705 -18.71 -18.715 -18.72 -18.725 -18.73 -18.735 -18.74 -18.745 -18.75 -18.755 -18.76 -18.765 -18.77 -18.775 -18.78 -18.785 -18.79 -18.795 -18.8 -18.805 -18.81 -18.815 -18.82 -18.825 -18.83 -18.835 -18.84 -18.845 -18.85 -18.855 -18.86 -18.865 -18.87 -18.875 -18.88 -18.885 -18.89 -18.895 -18.9 -18.905 -18.91 -18.915 -18.92 -18.925 -18.93 -18.935 -18.94 -18.945 -18.95 -18.955 -18.96 -18.965 -18.97 -18.975 -18.98 -18.985 -18.99 -18.995 -19 -19.005 -19.01 -19.015 -19.02 -19.025 -19.03 -19.035 -19.04 -19.045 -19.05 -19.055 -19.06 -19.065 -19.07 -19.075 -19.08 -19.085 -19.09 -19.095 -19.1 -19.105 -19.11 -19.115 -19.12 -19.125 -19.13 -19.135 -19.14 -19.145 -19.15 -19.155 -19.16 -19.165 -19.17 -19.175 -19.18 -19.185 -19.19 -19.195 -19.2 -19.205 -19.21 -19.215 -19.22 -19.225 -19.23 -19.235 -19.24 -19.245 -19.25 -19.255 -19.26 -19.265 -19.27 -19.275 -19.28 -19.285 -19.29 -19.295 -19.3 -19.305 -19.31 -19.315 -19.32 -19.325 -19.33 -19.335 -19.34 -19.345 -19.35 -19.355 -19.36 -19.365 -19.37 -19.375 -19.38 -19.385 -19.39 -19.395 -19.4 -19.405 -19.41 -19.415 -19.42 -19.425 -19.43 -19.435 -19.44 -19.445 -19.45 -19.455 -19.46 -19.465 -19.47 -19.475 -19.48 -19.485 -19.49 -19.495 -19.5 -19.505 -19.51 -19.515 -19.52 -19.525 -19.53 -19.535 -19.54 -19.545 -19.55 -19.555 -19.56 -19.565 -19.57 -19.575 -19.58 -19.585 -19.59 -19.595 -19.6 -19.605 -19.61 -19.615 -19.62 -19.625 -19.63 -19.635 -19.64 -19.645 -19.65 -19.655 -19.66 -19.665 -19.67 -19.675 -19.68 -19.685 -19.69 -19.695 -19.7 -19.705 -19.71 -19.715 -19.72 -19.725 -19.73 -19.735 -19.74 -19.745 -19.75 -19.755 -19.76 -19.765 -19.77 -19.775 -19.78 -19.785 -19.79 -19.795 -19.8 -19.805 -19.81 -19.815 -19.82 -19.825 -19.83 -19.835 -19.84 -19.845 -19.85 -19.855 -19.86 -19.865 -19.87 -19.875 -19.88 -19.885 -19.89 -19.895 -19.9 -19.905 -19.91 -19.915 -19.92 -19.925 -19.93 -19.935 -19.94 -19.945 -19.95 -19.955 -19.96 -19.965 -19.97 -19.975 -19.98 -19.985 -19.99 -19.995 -20 -20.005 -20.01 -20.015 -20.02 -20.025 -20.03 -20.035 -20.04 -20.045 -20.05 -20.055 -20.06 -20.065 -20.07 -20.075 -20.08 -20.085 -20.09 -20.095 -20.1 -20.105 -20.11 -20.115 -20.12 -20.125 -20.13 -20.135 -20.14 -20.145 -20.15 -20.155 -20.16 -20.165 -20.17 -20.175 -20.18 -20.185 -20.19 -20.195 -20.2 -20.205 -20.21 -20.215 -20.22 -20.225 -20.23 -20.235 -20.24 -20.245 -20.25 -20.255 -20.26 -20.265 -20.27 -20.275 -20.28 -20.285 -20.29 -20.295 -20.3 -20.305 -20.31 -20.315 -20.32 -20.325 -20.33 -20.335 -20.34 -20.345 -20.35 -20.355 -20.36 -20.365 -20.37 -20.375 -20.38 -20.385 -20.39 -20.395 -20.4 -20.405 -20.41 -20.415 -20.42 -20.425 -20.43 -20.435 -20.44 -20.445 -20.45 -20.455 -20.46 -20.465 -20.47 -20.475 -20.48 -20.485 -20.49 -20.495 -20.5 -20.505 -20.51 -20.515 -20.52 -20.525 -20.53 -20.535 -20.54 -20.545 -20.55 -20.555 -20.56 -20.565 -20.57 -20.575 -20.58 -20.585 -20.59 -20.595 -20.6 -20.605 -20.61 -20.615 -20.62 -20.625 -20.63 -20.635 -20.64 -20.645 -20.65 -20.655 -20.66 -20.665 -20.67 -20.675 -20.68 -20.685 -20.69 -20.695 -20.7 -20.705 -20.71 -20.715 -20.72 -20.725 -20.73 -20.735 -20.74 -20.745 -20.75 -20.755 -20.76 -20.765 -20.77 -20.775 -20.78 -20.785 -20.79 -20.795 -20.8 -20.805 -20.81 -20.815 -20.82 -20.825 -20.83 -20.835 -20.84 -20.845 -20.85 -20.855 -20.86 -20.865 -20.87 -20.875 -20.88 -20.885 -20.89 -20.895 -20.9 -20.905 -20.91 -20.915 -20.92 -20.925 -20.93 -20.935 -20.94 -20.945 -20.95 -20.955 -20.96 -20.965 -20.97 -20.975 -20.98 -20.985 -20.99 -20.995 -21 -21.005 -21.01 -21.015 -21.02 -21.025 -21.03 -21.035 -21.04 -21.045 -21.05 -21.055 -21.06 -21.065 -21.07 -21.075 -21.08 -21.085 -21.09 -21.095 -21.1 -21.105 -21.11 -21.115 -21.12 -21.125 -21.13 -21.135 -21.14 -21.145 -21.15 -21.155 -21.16 -21.165 -21.17 -21.175 -21.18 -21.185 -21.19 -21.195 -21.2 -21.205 -21.21 -21.215 -21.22 -21.225 -21.23 -21.235 -21.24 -21.245 -21.25 -21.255 -21.26 -21.265 -21.27 -21.275 -21.28 -21.285 -21.29 -21.295 -21.3 -21.305 -21.31 -21.315 -21.32 -21.325 -21.33 -21.335 -21.34 -21.345 -21.35 -21.355 -21.36 -21.365 -21.37 -21.375 -21.38 -21.385 -21.39 -21.395 -21.4 -21.405 -21.41 -21.415 -21.42 -21.425 -21.43 -21.435 -21.44 -21.445 -21.45 -21.455 -21.46 -21.465 -21.47 -21.475 -21.48 -21.485 -21.49 -21.495 -21.5 -21.505 -21.51 -21.515 -21.52 -21.525 -21.53 -21.535 -21.54 -21.545 -21.55 -21.555 -21.56 -21.565 -21.57 -21.575 -21.58 -21.585 -21.59 -21.595 -21.6 -21.605 -21.61 -21.615 -21.62 -21.625 -21.63 -21.635 -21.64 -21.645 -21.65 -21.655 -21.66 -21.665 -21.67 -21.675 -21.68 -21.685 -21.69 -21.695 -21.7 -21.705 -21.71 -21.715 -21.72 -21.725 -21.73 -21.735 -21.74 -21.745 -21.75 -21.755 -21.76 -21.765 -21.77 -21.775 -21.78 -21.785 -21.79 -21.795 -21.8 -21.805 -21.81 -21.815 -21.82 -21.825 -21.83 -21.835 -21.84 -21.845 -21.85 -21.855 -21.86 -21.865 -21.87 -21.875 -21.88 -21.885 -21.89 -21.895 -21.9 -21.905 -21.91 -21.915 -21.92 -21.925 -21.93 -21.935 -21.94 -21.945 -21.95 -21.955 -21.96 -21.965 -21.97 -21.975 -21.98 -21.985 -21.99 -21.995 -22 -22.005 -22.01 -22.015 -22.02 -22.025 -22.03 -22.035 -22.04 -22.045 -22.05 -22.055 -22.06 -22.065 -22.07 -22.075 -22.08 -22.085 -22.09 -22.095 -22.1 -22.105 -22.11 -22.115 -22.12 -22.125 -22.13 -22.135 -22.14 -22.145 -22.15 -22.155 -22.16 -22.165 -22.17 -22.175 -22.18 -22.185 -22.19 -22.195 -22.2 -22.205 -22.21 -22.215 -22.22 -22.225 -22.23 -22.235 -22.24 -22.245 -22.25 -22.255 -22.26 -22.265 -22.27 -22.275 -22.28 -22.285 -22.29 -22.295 -22.3 -22.305 -22.31 -22.315 -22.32 -22.325 -22.33 -22.335 -22.34 -22.345 -22.35 -22.355 -22.36 -22.365 -22.37 -22.375 -22.38 -22.385 -22.39 -22.395 -22.4 -22.405 -22.41 -22.415 -22.42 -22.425 -22.43 -22.435 -22.44 -22.445 -22.45 -22.455 -22.46 -22.465 -22.47 -22.475 -22.48 -22.485 -22.49 -22.495 -22.5 -22.505 -22.51 -22.515 -22.52 -22.525 -22.53 -22.535 -22.54 -22.545 -22.55 -22.555 -22.56 -22.565 -22.57 -22.575 -22.58 -22.585 -22.59 -22.595 -22.6 -22.605 -22.61 -22.615 -22.62 -22.625 -22.63 -22.635 -22.64 -22.645 -22.65 -22.655 -22.66 -22.665 -22.67 -22.675 -22.68 -22.685 -22.69 -22.695 -22.7 -22.705 -22.71 -22.715 -22.72 -22.725 -22.73 -22.735 -22.74 -22.745 -22.75 -22.755 -22.76 -22.765 -22.77 -22.775 -22.78 -22.785 -22.79 -22.795 -22.8 -22.805 -22.81 -22.815 -22.82 -22.825 -22.83 -22.835 -22.84 -22.845 -22.85 -22.855 -22.86 -22.865 -22.87 -22.875 -22.88 -22.885 -22.89 -22.895 -22.9 -22.905 -22.91 -22.915 -22.92 -22.925 -22.93 -22.935 -22.94 -22.945 -22.95 -22.955 -22.96 -22.965 -22.97 -22.975 -22.98 -22.985 -22.99 -22.995 -23 -23.005 -23.01 -23.015 -23.02 -23.025 -23.03 -23.035 -23.04 -23.045 -23.05 -23.055 -23.06 -23.065 -23.07 -23.075 -23.08 -23.085 -23.09 -23.095 -23.1 -23.105 -23.11 -23.115 -23.12 -23.125 -23.13 -23.135 -23.14 -23.145 -23.15 -23.155 -23.16 -23.165 -23.17 -23.175 -23.18 -23.185 -23.19 -23.195 -23.2 -23.205 -23.21 -23.215 -23.22 -23.225 -23.23 -23.235 -23.24 -23.245 -23.25 -23.255 -23.26 -23.265 -23.27 -23.275 -23.28 -23.285 -23.29 -23.295 -23.3 -23.305 -23.31 -23.315 -23.32 -23.325 -23.33 -23.335 -23.34 -23.345 -23.35 -23.355 -23.36 -23.365 -23.37 -23.375 -23.38 -23.385 -23.39 -23.395 -23.4 -23.405 -23.41 -23.415 -23.42 -23.425 -23.43 -23.435 -23.44 -23.445 -23.45 -23.455 -23.46 -23.465 -23.47 -23.475 -23.48 -23.485 -23.49 -23.495 -23.5 -23.505 -23.51 -23.515 -23.52 -23.525 -23.53 -23.535 -23.54 -23.545 -23.55 -23.555 -23.56 -23.565 -23.57 -23.575 -23.58 -23.585 -23.59 -23.595 -23.6 -23.605 -23.61 -23.615 -23.62 -23.625 -23.63 -23.635 -23.64 -23.645 -23.65 -23.655 -23.66 -23.665 -23.67 -23.675 -23.68 -23.685 -23.69 -23.695 -23.7 -23.705 -23.71 -23.715 -23.72 -23.725 -23.73 -23.735 -23.74 -23.745 -23.75 -23.755 -23.76 -23.765 -23.77 -23.775 -23.78 -23.785 -23.79 -23.795 -23.8 -23.805 -23.81 -23.815 -23.82 -23.825 -23.83 -23.835 -23.84 -23.845 -23.85 -23.855 -23.86 -23.865 -23.87 -23.875 -23.88 -23.885 -23.89 -23.895 -23.9 -23.905 -23.91 -23.915 -23.92 -23.925 -23.93 -23.935 -23.94 -23.945 -23.95 -23.955 -23.96 -23.965 -23.97 -23.975 -23.98 -23.985 -23.99 -23.995 -24 -24.005 -24.01 -24.015 -24.02 -24.025 -24.03 -24.035 -24.04 -24.045 -24.05 -24.055 -24.06 -24.065 -24.07 -24.075 -24.08 -24.085 -24.09 -24.095 -24.1 -24.105 -24.11 -24.115 -24.12 -24.125 -24.13 -24.135 -24.14 -24.145 -24.15 -24.155 -24.16 -24.165 -24.17 -24.175 -24.18 -24.185 -24.19 -24.195 -24.2 -24.205 -24.21 -24.215 -24.22 -24.225 -24.23 -24.235 -24.24 -24.245 -24.25 -24.255 -24.26 -24.265 -24.27 -24.275 -24.28 -24.285 -24.29 -24.295 -24.3 -24.305 -24.31 -24.315 -24.32 -24.325 -24.33 -24.335 -24.34 -24.345 -24.35 -24.355 -24.36 -24.365 -24.37 -24.375 -24.38 -24.385 -24.39 -24.395 -24.4 -24.405 -24.41 -24.415 -24.42 -24.425 -24.43 -24.435 -24.44 -24.445 -24.45 -24.455 -24.46 -24.465 -24.47 -24.475 -24.48 -24.485 -24.49 -24.495 -24.5 -24.505 -24.51 -24.515 -24.52 -24.525 -24.53 -24.535 -24.54 -24.545 -24.55 -24.555 -24.56 -24.565 -24.57 -24.575 -24.58 -24.585 -24.59 -24.595 -24.6 -24.605 -24.61 -24.615 -24.62 -24.625 -24.63 -24.635 -24.64 -24.645 -24.65 -24.655 -24.66 -24.665 -24.67 -24.675 -24.68 -24.685 -24.69 -24.695 -24.7 -24.705 -24.71 -24.715 -24.72 -24.725 -24.73 -24.735 -24.74 -24.745 -24.75 -24.755 -24.76 -24.765 -24.77 -24.775 -24.78 -24.785 -24.79 -24.795 -24.8 -24.805 -24.81 -24.815 -24.82 -24.825 -24.83 -24.835 -24.84 -24.845 -24.85 -24.855 -24.86 -24.865 -24.87 -24.875 -24.88 -24.885 -24.89 -24.895 -24.9 -24.905 -24.91 -24.915 -24.92 -24.925 -24.93 -24.935 -24.94 -24.945 -24.95 -24.955 -24.96 -24.965 -24.97 -24.975 -24.98 -24.985 -24.99 -24.995 -25 -25.005 -25.01 -25.015 -25.02 -25.025 -25.03 -25.035 -25.04 -25.045 -25.05 -25.055 -25.06 -25.065 -25.07 -25.075 -25.08 -25.085 -25.09 -25.095 -25.1 -25.105 -25.11 -25.115 -25.12 -25.125 -25.13 -25.135 -25.14 -25.145 -25.15 -25.155 -25.16 -25.165 -25.17 -25.175 -25.18 -25.185 -25.19 -25.195 -25.2 -25.205 -25.21 -25.215 -25.22 -25.225 -25.23 -25.235 -25.24 -25.245 -25.25 -25.255 -25.26 -25.265 -25.27 -25.275 -25.28 -25.285 -25.29 -25.295 -25.3 -25.305 -25.31 -25.315 -25.32 -25.325 -25.33 -25.335 -25.34 -25.345 -25.35 -25.355 -25.36 -25.365 -25.37 -25.375 -25.38 -25.385 -25.39 -25.395 -25.4 -25.405 -25.41 -25.415 -25.42 -25.425 -25.43 -25.435 -25.44 -25.445 -25.45 -25.455 -25.46 -25.465 -25.47 -25.475 -25.48 -25.485 -25.49 -25.495 -25.5 -25.505 -25.51 -25.515 -25.52 -25.525 -25.53 -25.535 -25.54 -25.545 -25.55 -25.555 -25.56 -25.565 -25.57 -25.575 -25.58 -25.585 -25.59 -25.595 -25.6 -25.605 -25.61 -25.615 -25.62 -25.625 -25.63 -25.635 -25.64 -25.645 -25.65 -25.655 -25.66 -25.665 -25.67 -25.675 -25.68 -25.685 -25.69 -25.695 -25.7 -25.705 -25.71 -25.715 -25.72 -25.725 -25.73 -25.735 -25.74 -25.745 -25.75 -25.755 -25.76 -25.765 -25.77 -25.775 -25.78 -25.785 -25.79 -25.795 -25.8 -25.805 -25.81 -25.815 -25.82 -25.825 -25.83 -25.835 -25.84 -25.845 -25.85 -25.855 -25.86 -25.865 -25.87 -25.875 -25.88 -25.885 -25.89 -25.895 -25.9 -25.905 -25.91 -25.915 -25.92 -25.925 -25.93 -25.935 -25.94 -25.945 -25.95 -25.955 -25.96 -25.965 -25.97 -25.975 -25.98 -25.985 -25.99 -25.995 -26 -26.005 -26.01 -26.015 -26.02 -26.025 -26.03 -26.035 -26.04 -26.045 -26.05 -26.055 -26.06 -26.065 -26.07 -26.075 -26.08 -26.085 -26.09 -26.095 -26.1 -26.105 -26.11 -26.115 -26.12 -26.125 -26.13 -26.135 -26.14 -26.145 -26.15 -26.155 -26.16 -26.165 -26.17 -26.175 -26.18 -26.185 -26.19 -26.195 -26.2 -26.205 -26.21 -26.215 -26.22 -26.225 -26.23 -26.235 -26.24 -26.245 -26.25 -26.255 -26.26 -26.265 -26.27 -26.275 -26.28 -26.285 -26.29 -26.295 -26.3 -26.305 -26.31 -26.315 -26.32 -26.325 -26.33 -26.335 -26.34 -26.345 -26.35 -26.355 -26.36 -26.365 -26.37 -26.375 -26.38 -26.385 -26.39 -26.395 -26.4 -26.405 -26.41 -26.415 -26.42 -26.425 -26.43 -26.435 -26.44 -26.445 -26.45 -26.455 -26.46 -26.465 -26.47 -26.475 -26.48 -26.485 -26.49 -26.495 -26.5 -26.505 -26.51 -26.515 -26.52 -26.525 -26.53 -26.535 -26.54 -26.545 -26.55 -26.555 -26.56 -26.565 -26.57 -26.575 -26.58 -26.585 -26.59 -26.595 -26.6 -26.605 -26.61 -26.615 -26.62 -26.625 -26.63 -26.635 -26.64 -26.645 -26.65 -26.655 -26.66 -26.665 -26.67 -26.675 -26.68 -26.685 -26.69 -26.695 -26.7 -26.705 -26.71 -26.715 -26.72 -26.725 -26.73 -26.735 -26.74 -26.745 -26.75 -26.755 -26.76 -26.765 -26.77 -26.775 -26.78 -26.785 -26.79 -26.795 -26.8 -26.805 -26.81 -26.815 -26.82 -26.825 -26.83 -26.835 -26.84 -26.845 -26.85 -26.855 -26.86 -26.865 -26.87 -26.875 -26.88 -26.885 -26.89 -26.895 -26.9 -26.905 -26.91 -26.915 -26.92 -26.925 -26.93 -26.935 -26.94 -26.945 -26.95 -26.955 -26.96 -26.965 -26.97 -26.975 -26.98 -26.985 -26.99 -26.995 -27 -27.005 -27.01 -27.015 -27.02 -27.025 -27.03 -27.035 -27.04 -27.045 -27.05 -27.055 -27.06 -27.065 -27.07 -27.075 -27.08 -27.085 -27.09 -27.095 -27.1 -27.105 -27.11 -27.115 -27.12 -27.125 -27.13 -27.135 -27.14 -27.145 -27.15 -27.155 -27.16 -27.165 -27.17 -27.175 -27.18 -27.185 -27.19 -27.195 -27.2 -27.205 -27.21 -27.215 -27.22 -27.225 -27.23 -27.235 -27.24 -27.245 -27.25 -27.255 -27.26 -27.265 -27.27 -27.275 -27.28 -27.285 -27.29 -27.295 -27.3 -27.305 -27.31 -27.315 -27.32 -27.325 -27.33 -27.335 -27.34 -27.345 -27.35 -27.355 -27.36 -27.365 -27.37 -27.375 -27.38 -27.385 -27.39 -27.395 -27.4 -27.405 -27.41 -27.415 -27.42 -27.425 -27.43 -27.435 -27.44 -27.445 -27.45 -27.455 -27.46 -27.465 -27.47 -27.475 -27.48 -27.485 -27.49 -27.495 -27.5 -27.505 -27.51 -27.515 -27.52 -27.525 -27.53 -27.535 -27.54 -27.545 -27.55 -27.555 -27.56 -27.565 -27.57 -27.575 -27.58 -27.585 -27.59 -27.595 -27.6 -27.605 -27.61 -27.615 -27.62 -27.625 -27.63 -27.635 -27.64 -27.645 -27.65 -27.655 -27.66 -27.665 -27.67 -27.675 -27.68 -27.685 -27.69 -27.695 -27.7 -27.705 -27.71 -27.715 -27.72 -27.725 -27.73 -27.735 -27.74 -27.745 -27.75 -27.755 -27.76 -27.765 -27.77 -27.775 -27.78 -27.785 -27.79 -27.795 -27.8 -27.805 -27.81 -27.815 -27.82 -27.825 -27.83 -27.835 -27.84 -27.845 -27.85 -27.855 -27.86 -27.865 -27.87 -27.875 -27.88 -27.885 -27.89 -27.895 -27.9 -27.905 -27.91 -27.915 -27.92 -27.925 -27.93 -27.935 -27.94 -27.945 -27.95 -27.955 -27.96 -27.965 -27.97 -27.975 -27.98 -27.985 -27.99 -27.995 -28 -28.005 -28.01 -28.015 -28.02 -28.025 -28.03 -28.035 -28.04 -28.045 -28.05 -28.055 -28.06 -28.065 -28.07 -28.075 -28.08 -28.085 -28.09 -28.095 -28.1 -28.105 -28.11 -28.115 -28.12 -28.125 -28.13 -28.135 -28.14 -28.145 -28.15 -28.155 -28.16 -28.165 -28.17 -28.175 -28.18 -28.185 -28.19 -28.195 -28.2 -28.205 -28.21 -28.215 -28.22 -28.225 -28.23 -28.235 -28.24 -28.245 -28.25 -28.255 -28.26 -28.265 -28.27 -28.275 -28.28 -28.285 -28.29 -28.295 -28.3 -28.305 -28.31 -28.315 -28.32 -28.325 -28.33 -28.335 -28.34 -28.345 -28.35 -28.355 -28.36 -28.365 -28.37 -28.375 -28.38 -28.385 -28.39 -28.395 -28.4 -28.405 -28.41 -28.415 -28.42 -28.425 -28.43 -28.435 -28.44 -28.445 -28.45 -28.455 -28.46 -28.465 -28.47 -28.475 -28.48 -28.485 -28.49 -28.495 -28.5 -28.505 -28.51 -28.515 -28.52 -28.525 -28.53 -28.535 -28.54 -28.545 -28.55 -28.555 -28.56 -28.565 -28.57 -28.575 -28.58 -28.585 -28.59 -28.595 -28.6 -28.605 -28.61 -28.615 -28.62 -28.625 -28.63 -28.635 -28.64 -28.645 -28.65 -28.655 -28.66 -28.665 -28.67 -28.675 -28.68 -28.685 -28.69 -28.695 -28.7 -28.705 -28.71 -28.715 -28.72 -28.725 -28.73 -28.735 -28.74 -28.745 -28.75 -28.755 -28.76 -28.765 -28.77 -28.775 -28.78 -28.785 -28.79 -28.795 -28.8 -28.805 -28.81 -28.815 -28.82 -28.825 -28.83 -28.835 -28.84 -28.845 -28.85 -28.855 -28.86 -28.865 -28.87 -28.875 -28.88 -28.885 -28.89 -28.895 -28.9 -28.905 -28.91 -28.915 -28.92 -28.925 -28.93 -28.935 -28.94 -28.945 -28.95 -28.955 -28.96 -28.965 -28.97 -28.975 -28.98 -28.985 -28.99 -28.995 -29 -29.005 -29.01 -29.015 -29.02 -29.025 -29.03 -29.035 -29.04 -29.045 -29.05 -29.055 -29.06 -29.065 -29.07 -29.075 -29.08 -29.085 -29.09 -29.095 -29.1 -29.105 -29.11 -29.115 -29.12 -29.125 -29.13 -29.135 -29.14 -29.145 -29.15 -29.155 -29.16 -29.165 -29.17 -29.175 -29.18 -29.185 -29.19 -29.195 -29.2 -29.205 -29.21 -29.215 -29.22 -29.225 -29.23 -29.235 -29.24 -29.245 -29.25 -29.255 -29.26 -29.265 -29.27 -29.275 -29.28 -29.285 -29.29 -29.295 -29.3 -29.305 -29.31 -29.315 -29.32 -29.325 -29.33 -29.335 -29.34 -29.345 -29.35 -29.355 -29.36 -29.365 -29.37 -29.375 -29.38 -29.385 -29.39 -29.395 -29.4 -29.405 -29.41 -29.415 -29.42 -29.425 -29.43 -29.435 -29.44 -29.445 -29.45 -29.455 -29.46 -29.465 -29.47 -29.475 -29.48 -29.485 -29.49 -29.495 -29.5 -29.505 -29.51 -29.515 -29.52 -29.525 -29.53 -29.535 -29.54 -29.545 -29.55 -29.555 -29.56 -29.565 -29.57 -29.575 -29.58 -29.585 -29.59 -29.595 -29.6 -29.605 -29.61 -29.615 -29.62 -29.625 -29.63 -29.635 -29.64 -29.645 -29.65 -29.655 -29.66 -29.665 -29.67 -29.675 -29.68 -29.685 -29.69 -29.695 -29.7 -29.705 -29.71 -29.715 -29.72 -29.725 -29.73 -29.735 -29.74 -29.745 -29.75 -29.755 -29.76 -29.765 -29.77 -29.775 -29.78 -29.785 -29.79 -29.795 -29.8 -29.805 -29.81 -29.815 -29.82 -29.825 -29.83 -29.835 -29.84 -29.845 -29.85 -29.855 -29.86 -29.865 -29.87 -29.875 -29.88 -29.885 -29.89 -29.895 -29.9 -29.905 -29.91 -29.915 -29.92 -29.925 -29.93 -29.935 -29.94 -29.945 -29.95 -29.955 -29.96 -29.965 -29.97 -29.975 -29.98 -29.985 -29.99 -29.995 -30 -30.005 -30.01 -30.015 -30.02 -30.025 -30.03 -30.035 -30.04 -30.045 -30.05 -30.055 -30.06 -30.065 -30.07 -30.075 -30.08 -30.085 -30.09 -30.095 -30.1 -30.105 -30.11 -30.115 -30.12 -30.125 -30.13 -30.135 -30.14 -30.145 -30.15 -30.155 -30.16 -30.165 -30.17 -30.175 -30.18 -30.185 -30.19 -30.195 -30.2 -30.205 -30.21 -30.215 -30.22 -30.225 -30.23 -30.235 -30.24 -30.245 -30.25 -30.255 -30.26 -30.265 -30.27 -30.275 -30.28 -30.285 -30.29 -30.295 -30.3 -30.305 -30.31 -30.315 -30.32 -30.325 -30.33 -30.335 -30.34 -30.345 -30.35 -30.355 -30.36 -30.365 -30.37 -30.375 -30.38 -30.385 -30.39 -30.395 -30.4 -30.405 -30.41 -30.415 -30.42 -30.425 -30.43 -30.435 -30.44 -30.445 -30.45 -30.455 -30.46 -30.465 -30.47 -30.475 -30.48 -30.485 -30.49 -30.495 -30.5 -30.505 -30.51 -30.515 -30.52 -30.525 -30.53 -30.535 -30.54 -30.545 -30.55 -30.555 -30.56 -30.565 -30.57 -30.575 -30.58 -30.585 -30.59 -30.595 -30.6 -30.605 -30.61 -30.615 -30.62 -30.625 -30.63 -30.635 -30.64 -30.645 -30.65 -30.655 -30.66 -30.665 -30.67 -30.675 -30.68 -30.685 -30.69 -30.695 -30.7 -30.705 -30.71 -30.715 -30.72 -30.725 -30.73 -30.735 -30.74 -30.745 -30.75 -30.755 -30.76 -30.765 -30.77 -30.775 -30.78 -30.785 -30.79 -30.795 -30.8 -30.805 -30.81 -30.815 -30.82 -30.825 -30.83 -30.835 -30.84 -30.845 -30.85 -30.855 -30.86 -30.865 -30.87 -30.875 -30.88 -30.885 -30.89 -30.895 -30.9 -30.905 -30.91 -30.915 -30.92 -30.925 -30.93 -30.935 -30.94 -30.945 -30.95 -30.955 -30.96 -30.965 -30.97 -30.975 -30.98 -30.985 -30.99 -30.995 -31 -31.005 -31.01 -31.015 -31.02 -31.025 -31.03 -31.035 -31.04 -31.045 -31.05 -31.055 -31.06 -31.065 -31.07 -31.075 -31.08 -31.085 -31.09 -31.095 -31.1 -31.105 -31.11 -31.115 -31.12 -31.125 -31.13 -31.135 -31.14 -31.145 -31.15 -31.155 -31.16 -31.165 -31.17 -31.175 -31.18 -31.185 -31.19 -31.195 -31.2 -31.205 -31.21 -31.215 -31.22 -31.225 -31.23 -31.235 -31.24 -31.245 -31.25 -31.255 -31.26 -31.265 -31.27 -31.275 -31.28 -31.285 -31.29 -31.295 -31.3 -31.305 -31.31 -31.315 -31.32 -31.325 -31.33 -31.335 -31.34 -31.345 -31.35 -31.355 -31.36 -31.365 -31.37 -31.375 -31.38 -31.385 -31.39 -31.395 -31.4 -31.405 -31.41 -31.415 -31.42 -31.425 -31.43 -31.435 -31.44 -31.445 -31.45 -31.455 -31.46 -31.465 -31.47 -31.475 -31.48 -31.485 -31.49 -31.495 -31.5 -31.505 -31.51 -31.515 -31.52 -31.525 -31.53 -31.535 -31.54 -31.545 -31.55 -31.555 -31.56 -31.565 -31.57 -31.575 -31.58 -31.585 -31.59 -31.595 -31.6 -31.605 -31.61 -31.615 -31.62 -31.625 -31.63 -31.635 -31.64 -31.645 -31.65 -31.655 -31.66 -31.665 -31.67 -31.675 -31.68 -31.685 -31.69 -31.695 -31.7 -31.705 -31.71 -31.715 -31.72 -31.725 -31.73 -31.735 -31.74 -31.745 -31.75 -31.755 -31.76 -31.765 -31.77 -31.775 -31.78 -31.785 -31.79 -31.795 -31.8 -31.805 -31.81 -31.815 -31.82 -31.825 -31.83 -31.835 -31.84 -31.845 -31.85 -31.855 -31.86 -31.865 -31.87 -31.875 -31.88 -31.885 -31.89 -31.895 -31.9 -31.905 -31.91 -31.915 -31.92 -31.925 -31.93 -31.935 -31.94 -31.945 -31.95 -31.955 -31.96 -31.965 -31.97 -31.975 -31.98 -31.985 -31.99 -31.995 -32 -32.005 -32.01 -32.015 -32.02 -32.025 -32.03 -32.035 -32.04 -32.045 -32.05 -32.055 -32.06 -32.065 -32.07 -32.075 -32.08 -32.085 -32.09 -32.095 -32.1 -32.105 -32.11 -32.115 -32.12 -32.125 -32.13 -32.135 -32.14 -32.145 -32.15 -32.155 -32.16 -32.165 -32.17 -32.175 -32.18 -32.185 -32.19 -32.195 -32.2 -32.205 -32.21 -32.215 -32.22 -32.225 -32.23 -32.235 -32.24 -32.245 -32.25 -32.255 -32.26 -32.265 -32.27 -32.275 -32.28 -32.285 -32.29 -32.295 -32.3 -32.305 -32.31 -32.315 -32.32 -32.325 -32.33 -32.335 -32.34 -32.345 -32.35 -32.355 -32.36 -32.365 -32.37 -32.375 -32.38 -32.385 -32.39 -32.395 -32.4 -32.405 -32.41 -32.415 -32.42 -32.425 -32.43 -32.435 -32.44 -32.445 -32.45 -32.455 -32.46 -32.465 -32.47 -32.475 -32.48 -32.485 -32.49 -32.495 -32.5 -32.505 -32.51 -32.515 -32.52 -32.525 -32.53 -32.535 -32.54 -32.545 -32.55 -32.555 -32.56 -32.565 -32.57 -32.575 -32.58 -32.585 -32.59 -32.595 -32.6 -32.605 -32.61 -32.615 -32.62 -32.625 -32.63 -32.635 -32.64 -32.645 -32.65 -32.655 -32.66 -32.665 -32.67 -32.675 -32.68 -32.685 -32.69 -32.695 -32.7 -32.705 -32.71 -32.715 -32.72 -32.725 -32.73 -32.735 -32.74 -32.745 -32.75 -32.755 -32.76 -32.765 -32.77 -32.775 -32.78 -32.785 -32.79 -32.795 -32.8 -32.805 -32.81 -32.815 -32.82 -32.825 -32.83 -32.835 -32.84 -32.845 -32.85 -32.855 -32.86 -32.865 -32.87 -32.875 -32.88 -32.885 -32.89 -32.895 -32.9 -32.905 -32.91 -32.915 -32.92 -32.925 -32.93 -32.935 -32.94 -32.945 -32.95 -32.955 -32.96 -32.965 -32.97 -32.975 -32.98 -32.985 -32.99 -32.995 -33 -33.005 -33.01 -33.015 -33.02 -33.025 -33.03 -33.035 -33.04 -33.045 -33.05 -33.055 -33.06 -33.065 -33.07 -33.075 -33.08 -33.085 -33.09 -33.095 -33.1 -33.105 -33.11 -33.115 -33.12 -33.125 -33.13 -33.135 -33.14 -33.145 -33.15 -33.155 -33.16 -33.165 -33.17 -33.175 -33.18 -33.185 -33.19 -33.195 -33.2 -33.205 -33.21 -33.215 -33.22 -33.225 -33.23 -33.235 -33.24 -33.245 -33.25 -33.255 -33.26 -33.265 -33.27 -33.275 -33.28 -33.285 -33.29 -33.295 -33.3 -33.305 -33.31 -33.315 -33.32 -33.325 -33.33 -33.335 -33.34 -33.345 -33.35 -33.355 -33.36 -33.365 -33.37 -33.375 -33.38 -33.385 -33.39 -33.395 -33.4 -33.405 -33.41 -33.415 -33.42 -33.425 -33.43 -33.435 -33.44 -33.445 -33.45 -33.455 -33.46 -33.465 -33.47 -33.475 -33.48 -33.485 -33.49 -33.495 -33.5 -33.505 -33.51 -33.515 -33.52 -33.525 -33.53 -33.535 -33.54 -33.545 -33.55 -33.555 -33.56 -33.565 -33.57 -33.575 -33.58 -33.585 -33.59 -33.595 -33.6 -33.605 -33.61 -33.615 -33.62 -33.625 -33.63 -33.635 -33.64 -33.645 -33.65 -33.655 -33.66 -33.665 -33.67 -33.675 -33.68 -33.685 -33.69 -33.695 -33.7 -33.705 -33.71 -33.715 -33.72 -33.725 -33.73 -33.735 -33.74 -33.745 -33.75 -33.755 -33.76 -33.765 -33.77 -33.775 -33.78 -33.785 -33.79 -33.795 -33.8 -33.805 -33.81 -33.815 -33.82 -33.825 -33.83 -33.835 -33.84 -33.845 -33.85 -33.855 -33.86 -33.865 -33.87 -33.875 -33.88 -33.885 -33.89 -33.895 -33.9 -33.905 -33.91 -33.915 -33.92 -33.925 -33.93 -33.935 -33.94 -33.945 -33.95 -33.955 -33.96 -33.965 -33.97 -33.975 -33.98 -33.985 -33.99 -33.995 -34 -34.005 -34.01 -34.015 -34.02 -34.025 -34.03 -34.035 -34.04 -34.045 -34.05 -34.055 -34.06 -34.065 -34.07 -34.075 -34.08 -34.085 -34.09 -34.095 -34.1 -34.105 -34.11 -34.115 -34.12 -34.125 -34.13 -34.135 -34.14 -34.145 -34.15 -34.155 -34.16 -34.165 -34.17 -34.175 -34.18 -34.185 -34.19 -34.195 -34.2 -34.205 -34.21 -34.215 -34.22 -34.225 -34.23 -34.235 -34.24 -34.245 -34.25 -34.255 -34.26 -34.265 -34.27 -34.275 -34.28 -34.285 -34.29 -34.295 -34.3 -34.305 -34.31 -34.315 -34.32 -34.325 -34.33 -34.335 -34.34 -34.345 -34.35 -34.355 -34.36 -34.365 -34.37 -34.375 -34.38 -34.385 -34.39 -34.395 -34.4 -34.405 -34.41 -34.415 -34.42 -34.425 -34.43 -34.435 -34.44 -34.445 -34.45 -34.455 -34.46 -34.465 -34.47 -34.475 -34.48 -34.485 -34.49 -34.495 -34.5 -34.505 -34.51 -34.515 -34.52 -34.525 -34.53 -34.535 -34.54 -34.545 -34.55 -34.555 -34.56 -34.565 -34.57 -34.575 -34.58 -34.585 -34.59 -34.595 -34.6 -34.605 -34.61 -34.615 -34.62 -34.625 -34.63 -34.635 -34.64 -34.645 -34.65 -34.655 -34.66 -34.665 -34.67 -34.675 -34.68 -34.685 -34.69 -34.695 -34.7 -34.705 -34.71 -34.715 -34.72 -34.725 -34.73 -34.735 -34.74 -34.745 -34.75 -34.755 -34.76 -34.765 -34.77 -34.775 -34.78 -34.785 -34.79 -34.795 -34.8 -34.805 -34.81 -34.815 -34.82 -34.825 -34.83 -34.835 -34.84 -34.845 -34.85 -34.855 -34.86 -34.865 -34.87 -34.875 -34.88 -34.885 -34.89 -34.895 -34.9 -34.905 -34.91 -34.915 -34.92 -34.925 -34.93 -34.935 -34.94 -34.945 -34.95 -34.955 -34.96 -34.965 -34.97 -34.975 -34.98 -34.985 -34.99 -34.995 -35 -35.005 -35.01 -35.015 -35.02 -35.025 -35.03 -35.035 -35.04 -35.045 -35.05 -35.055 -35.06 -35.065 -35.07 -35.075 -35.08 -35.085 -35.09 -35.095 -35.1 -35.105 -35.11 -35.115 -35.12 -35.125 -35.13 -35.135 -35.14 -35.145 -35.15 -35.155 -35.16 -35.165 -35.17 -35.175 -35.18 -35.185 -35.19 -35.195 -35.2 -35.205 -35.21 -35.215 -35.22 -35.225 -35.23 -35.235 -35.24 -35.245 -35.25 -35.255 -35.26 -35.265 -35.27 -35.275 -35.28 -35.285 -35.29 -35.295 -35.3 -35.305 -35.31 -35.315 -35.32 -35.325 -35.33 -35.335 -35.34 -35.345 -35.35 -35.355 -35.36 -35.365 -35.37 -35.375 -35.38 -35.385 -35.39 -35.395 -35.4 -35.405 -35.41 -35.415 -35.42 -35.425 -35.43 -35.435 -35.44 -35.445 -35.45 -35.455 -35.46 -35.465 -35.47 -35.475 -35.48 -35.485 -35.49 -35.495 -35.5 -35.505 -35.51 -35.515 -35.52 -35.525 -35.53 -35.535 -35.54 -35.545 -35.55 -35.555 -35.56 -35.565 -35.57 -35.575 -35.58 -35.585 -35.59 -35.595 -35.6 -35.605 -35.61 -35.615 -35.62 -35.625 -35.63 -35.635 -35.64 -35.645 -35.65 -35.655 -35.66 -35.665 -35.67 -35.675 -35.68 -35.685 -35.69 -35.695 -35.7 -35.705 -35.71 -35.715 -35.72 -35.725 -35.73 -35.735 -35.74 -35.745 -35.75 -35.755 -35.76 -35.765 -35.77 -35.775 -35.78 -35.785 -35.79 -35.795 -35.8 -35.805 -35.81 -35.815 -35.82 -35.825 -35.83 -35.835 -35.84 -35.845 -35.85 -35.855 -35.86 -35.865 -35.87 -35.875 -35.88 -35.885 -35.89 -35.895 -35.9 -35.905 -35.91 -35.915 -35.92 -35.925 -35.93 -35.935 -35.94 -35.945 -35.95 -35.955 -35.96 -35.965 -35.97 -35.975 -35.98 -35.985 -35.99 -35.995 -36 -36.005 -36.01 -36.015 -36.02 -36.025 -36.03 -36.035 -36.04 -36.045 -36.05 -36.055 -36.06 -36.065 -36.07 -36.075 -36.08 -36.085 -36.09 -36.095 -36.1 -36.105 -36.11 -36.115 -36.12 -36.125 -36.13 -36.135 -36.14 -36.145 -36.15 -36.155 -36.16 -36.165 -36.17 -36.175 -36.18 -36.185 -36.19 -36.195 -36.2 -36.205 -36.21 -36.215 -36.22 -36.225 -36.23 -36.235 -36.24 -36.245 -36.25 -36.255 -36.26 -36.265 -36.27 -36.275 -36.28 -36.285 -36.29 -36.295 -36.3 -36.305 -36.31 -36.315 -36.32 -36.325 -36.33 -36.335 -36.34 -36.345 -36.35 -36.355 -36.36 -36.365 -36.37 -36.375 -36.38 -36.385 -36.39 -36.395 -36.4 -36.405 -36.41 -36.415 -36.42 -36.425 -36.43 -36.435 -36.44 -36.445 -36.45 -36.455 -36.46 -36.465 -36.47 -36.475 -36.48 -36.485 -36.49 -36.495 -36.5 -36.505 -36.51 -36.515 -36.52 -36.525 -36.53 -36.535 -36.54 -36.545 -36.55 -36.555 -36.56 -36.565 -36.57 -36.575 -36.58 -36.585 -36.59 -36.595 -36.6 -36.605 -36.61 -36.615 -36.62 -36.625 -36.63 -36.635 -36.64 -36.645 -36.65 -36.655 -36.66 -36.665 -36.67 -36.675 -36.68 -36.685 -36.69 -36.695 -36.7 -36.705 -36.71 -36.715 -36.72 -36.725 -36.73 -36.735 -36.74 -36.745 -36.75 -36.755 -36.76 -36.765 -36.77 -36.775 -36.78 -36.785 -36.79 -36.795 -36.8 -36.805 -36.81 -36.815 -36.82 -36.825 -36.83 -36.835 -36.84 -36.845 -36.85 -36.855 -36.86 -36.865 -36.87 -36.875 -36.88 -36.885 -36.89 -36.895 -36.9 -36.905 -36.91 -36.915 -36.92 -36.925 -36.93 -36.935 -36.94 -36.945 -36.95 -36.955 -36.96 -36.965 -36.97 -36.975 -36.98 -36.985 -36.99 -36.995 -37 -37.005 -37.01 -37.015 -37.02 -37.025 -37.03 -37.035 -37.04 -37.045 -37.05 -37.055 -37.06 -37.065 -37.07 -37.075 -37.08 -37.085 -37.09 -37.095 -37.1 -37.105 -37.11 -37.115 -37.12 -37.125 -37.13 -37.135 -37.14 -37.145 -37.15 -37.155 -37.16 -37.165 -37.17 -37.175 -37.18 -37.185 -37.19 -37.195 -37.2 -37.205 -37.21 -37.215 -37.22 -37.225 -37.23 -37.235 -37.24 -37.245 -37.25 -37.255 -37.26 -37.265 -37.27 -37.275 -37.28 -37.285 -37.29 -37.295 -37.3 -37.305 -37.31 -37.315 -37.32 -37.325 -37.33 -37.335 -37.34 -37.345 -37.35 -37.355 -37.36 -37.365 -37.37 -37.375 -37.38 -37.385 -37.39 -37.395 -37.4 -37.405 -37.41 -37.415 -37.42 -37.425 -37.43 -37.435 -37.44 -37.445 -37.45 -37.455 -37.46 -37.465 -37.47 -37.475 -37.48 -37.485 -37.49 -37.495 -37.5 -37.505 -37.51 -37.515 -37.52 -37.525 -37.53 -37.535 -37.54 -37.545 -37.55 -37.555 -37.56 -37.565 -37.57 -37.575 -37.58 -37.585 -37.59 -37.595 -37.6 -37.605 -37.61 -37.615 -37.62 -37.625 -37.63 -37.635 -37.64 -37.645 -37.65 -37.655 -37.66 -37.665 -37.67 -37.675 -37.68 -37.685 -37.69 -37.695 -37.7 -37.705 -37.71 -37.715 -37.72 -37.725 -37.73 -37.735 -37.74 -37.745 -37.75 -37.755 -37.76 -37.765 -37.77 -37.775 -37.78 -37.785 -37.79 -37.795 -37.8 -37.805 -37.81 -37.815 -37.82 -37.825 -37.83 -37.835 -37.84 -37.845 -37.85 -37.855 -37.86 -37.865 -37.87 -37.875 -37.88 -37.885 -37.89 -37.895 -37.9 -37.905 -37.91 -37.915 -37.92 -37.925 -37.93 -37.935 -37.94 -37.945 -37.95 -37.955 -37.96 -37.965 -37.97 -37.975 -37.98 -37.985 -37.99 -37.995 -38 -38.005 -38.01 -38.015 -38.02 -38.025 -38.03 -38.035 -38.04 -38.045 -38.05 -38.055 -38.06 -38.065 -38.07 -38.075 -38.08 -38.085 -38.09 -38.095 -38.1 -38.105 -38.11 -38.115 -38.12 -38.125 -38.13 -38.135 -38.14 -38.145 -38.15 -38.155 -38.16 -38.165 -38.17 -38.175 -38.18 -38.185 -38.19 -38.195 -38.2 -38.205 -38.21 -38.215 -38.22 -38.225 -38.23 -38.235 -38.24 -38.245 -38.25 -38.255 -38.26 -38.265 -38.27 -38.275 -38.28 -38.285 -38.29 -38.295 -38.3 -38.305 -38.31 -38.315 -38.32 -38.325 -38.33 -38.335 -38.34 -38.345 -38.35 -38.355 -38.36 -38.365 -38.37 -38.375 -38.38 -38.385 -38.39 -38.395 -38.4 -38.405 -38.41 -38.415 -38.42 -38.425 -38.43 -38.435 -38.44 -38.445 -38.45 -38.455 -38.46 -38.465 -38.47 -38.475 -38.48 -38.485 -38.49 -38.495 -38.5 -38.505 -38.51 -38.515 -38.52 -38.525 -38.53 -38.535 -38.54 -38.545 -38.55 -38.555 -38.56 -38.565 -38.57 -38.575 -38.58 -38.585 -38.59 -38.595 -38.6 -38.605 -38.61 -38.615 -38.62 -38.625 -38.63 -38.635 -38.64 -38.645 -38.65 -38.655 -38.66 -38.665 -38.67 -38.675 -38.68 -38.685 -38.69 -38.695 -38.7 -38.705 -38.71 -38.715 -38.72 -38.725 -38.73 -38.735 -38.74 -38.745 -38.75 -38.755 -38.76 -38.765 -38.77 -38.775 -38.78 -38.785 -38.79 -38.795 -38.8 -38.805 -38.81 -38.815 -38.82 -38.825 -38.83 -38.835 -38.84 -38.845 -38.85 -38.855 -38.86 -38.865 -38.87 -38.875 -38.88 -38.885 -38.89 -38.895 -38.9 -38.905 -38.91 -38.915 -38.92 -38.925 -38.93 -38.935 -38.94 -38.945 -38.95 -38.955 -38.96 -38.965 -38.97 -38.975 -38.98 -38.985 -38.99 -38.995 -39 -39.005 -39.01 -39.015 -39.02 -39.025 -39.03 -39.035 -39.04 -39.045 -39.05 -39.055 -39.06 -39.065 -39.07 -39.075 -39.08 -39.085 -39.09 -39.095 -39.1 -39.105 -39.11 -39.115 -39.12 -39.125 -39.13 -39.135 -39.14 -39.145 -39.15 -39.155 -39.16 -39.165 -39.17 -39.175 -39.18 -39.185 -39.19 -39.195 -39.2 -39.205 -39.21 -39.215 -39.22 -39.225 -39.23 -39.235 -39.24 -39.245 -39.25 -39.255 -39.26 -39.265 -39.27 -39.275 -39.28 -39.285 -39.29 -39.295 -39.3 -39.305 -39.31 -39.315 -39.32 -39.325 -39.33 -39.335 -39.34 -39.345 -39.35 -39.355 -39.36 -39.365 -39.37 -39.375 -39.38 -39.385 -39.39 -39.395 -39.4 -39.405 -39.41 -39.415 -39.42 -39.425 -39.43 -39.435 -39.44 -39.445 -39.45 -39.455 -39.46 -39.465 -39.47 -39.475 -39.48 -39.485 -39.49 -39.495 -39.5 -39.505 -39.51 -39.515 -39.52 -39.525 -39.53 -39.535 -39.54 -39.545 -39.55 -39.555 -39.56 -39.565 -39.57 -39.575 -39.58 -39.585 -39.59 -39.595 -39.6 -39.605 -39.61 -39.615 -39.62 -39.625 -39.63 -39.635 -39.64 -39.645 -39.65 -39.655 -39.66 -39.665 -39.67 -39.675 -39.68 -39.685 -39.69 -39.695 -39.7 -39.705 -39.71 -39.715 -39.72 -39.725 -39.73 -39.735 -39.74 -39.745 -39.75 -39.755 -39.76 -39.765 -39.77 -39.775 -39.78 -39.785 -39.79 -39.795 -39.8 -39.805 -39.81 -39.815 -39.82 -39.825 -39.83 -39.835 -39.84 -39.845 -39.85 -39.855 -39.86 -39.865 -39.87 -39.875 -39.88 -39.885 -39.89 -39.895 -39.9 -39.905 -39.91 -39.915 -39.92 -39.925 -39.93 -39.935 -39.94 -39.945 -39.95 -39.955 -39.96 -39.965 -39.97 -39.975 -39.98 -39.985 -39.99 -39.995 -40 -40.005 -40.01 -40.015 -40.02 -40.025 -40.03 -40.035 -40.04 -40.045 -40.05 -40.055 -40.06 -40.065 -40.07 -40.075 -40.08 -40.085 -40.09 -40.095 -40.1 -40.105 -40.11 -40.115 -40.12 -40.125 -40.13 -40.135 -40.14 -40.145 -40.15 -40.155 -40.16 -40.165 -40.17 -40.175 -40.18 -40.185 -40.19 -40.195 -40.2 -40.205 -40.21 -40.215 -40.22 -40.225 -40.23 -40.235 -40.24 -40.245 -40.25 -40.255 -40.26 -40.265 -40.27 -40.275 -40.28 -40.285 -40.29 -40.295 -40.3 -40.305 -40.31 -40.315 -40.32 -40.325 -40.33 -40.335 -40.34 -40.345 -40.35 -40.355 -40.36 -40.365 -40.37 -40.375 -40.38 -40.385 -40.39 -40.395 -40.4 -40.405 -40.41 -40.415 -40.42 -40.425 -40.43 -40.435 -40.44 -40.445 -40.45 -40.455 -40.46 -40.465 -40.47 -40.475 -40.48 -40.485 -40.49 -40.495 -40.5 -40.505 -40.51 -40.515 -40.52 -40.525 -40.53 -40.535 -40.54 -40.545 -40.55 -40.555 -40.56 -40.565 -40.57 -40.575 -40.58 -40.585 -40.59 -40.595 -40.6 -40.605 -40.61 -40.615 -40.62 -40.625 -40.63 -40.635 -40.64 -40.645 -40.65 -40.655 -40.66 -40.665 -40.67 -40.675 -40.68 -40.685 -40.69 -40.695 -40.7 -40.705 -40.71 -40.715 -40.72 -40.725 -40.73 -40.735 -40.74 -40.745 -40.75 -40.755 -40.76 -40.765 -40.77 -40.775 -40.78 -40.785 -40.79 -40.795 -40.8 -40.805 -40.81 -40.815 -40.82 -40.825 -40.83 -40.835 -40.84 -40.845 -40.85 -40.855 -40.86 -40.865 -40.87 -40.875 -40.88 -40.885 -40.89 -40.895 -40.9 -40.905 -40.91 -40.915 -40.92 -40.925 -40.93 -40.935 -40.94 -40.945 -40.95 -40.955 -40.96 -40.965 -40.97 -40.975 -40.98 -40.985 -40.99 -40.995 -41 -41.005 -41.01 -41.015 -41.02 -41.025 -41.03 -41.035 -41.04 -41.045 -41.05 -41.055 -41.06 -41.065 -41.07 -41.075 -41.08 -41.085 -41.09 -41.095 -41.1 -41.105 -41.11 -41.115 -41.12 -41.125 -41.13 -41.135 -41.14 -41.145 -41.15 -41.155 -41.16 -41.165 -41.17 -41.175 -41.18 -41.185 -41.19 -41.195 -41.2 -41.205 -41.21 -41.215 -41.22 -41.225 -41.23 -41.235 -41.24 -41.245 -41.25 -41.255 -41.26 -41.265 -41.27 -41.275 -41.28 -41.285 -41.29 -41.295 -41.3 -41.305 -41.31 -41.315 -41.32 -41.325 -41.33 -41.335 -41.34 -41.345 -41.35 -41.355 -41.36 -41.365 -41.37 -41.375 -41.38 -41.385 -41.39 -41.395 -41.4 -41.405 -41.41 -41.415 -41.42 -41.425 -41.43 -41.435 -41.44 -41.445 -41.45 -41.455 -41.46 -41.465 -41.47 -41.475 -41.48 -41.485 -41.49 -41.495 -41.5 -41.505 -41.51 -41.515 -41.52 -41.525 -41.53 -41.535 -41.54 -41.545 -41.55 -41.555 -41.56 -41.565 -41.57 -41.575 -41.58 -41.585 -41.59 -41.595 -41.6 -41.605 -41.61 -41.615 -41.62 -41.625 -41.63 -41.635 -41.64 -41.645 -41.65 -41.655 -41.66 -41.665 -41.67 -41.675 -41.68 -41.685 -41.69 -41.695 -41.7 -41.705 -41.71 -41.715 -41.72 -41.725 -41.73 -41.735 -41.74 -41.745 -41.75 -41.755 -41.76 -41.765 -41.77 -41.775 -41.78 -41.785 -41.79 -41.795 -41.8 -41.805 -41.81 -41.815 -41.82 -41.825 -41.83 -41.835 -41.84 -41.845 -41.85 -41.855 -41.86 -41.865 -41.87 -41.875 -41.88 -41.885 -41.89 -41.895 -41.9 -41.905 -41.91 -41.915 -41.92 -41.925 -41.93 -41.935 -41.94 -41.945 -41.95 -41.955 -41.96 -41.965 -41.97 -41.975 -41.98 -41.985 -41.99 -41.995 -42 -42.005 -42.01 -42.015 -42.02 -42.025 -42.03 -42.035 -42.04 -42.045 -42.05 -42.055 -42.06 -42.065 -42.07 -42.075 -42.08 -42.085 -42.09 -42.095 -42.1 -42.105 -42.11 -42.115 -42.12 -42.125 -42.13 -42.135 -42.14 -42.145 -42.15 -42.155 -42.16 -42.165 -42.17 -42.175 -42.18 -42.185 -42.19 -42.195 -42.2 -42.205 -42.21 -42.215 -42.22 -42.225 -42.23 -42.235 -42.24 -42.245 -42.25 -42.255 -42.26 -42.265 -42.27 -42.275 -42.28 -42.285 -42.29 -42.295 -42.3 -42.305 -42.31 -42.315 -42.32 -42.325 -42.33 -42.335 -42.34 -42.345 -42.35 -42.355 -42.36 -42.365 -42.37 -42.375 -42.38 -42.385 -42.39 -42.395 -42.4 -42.405 -42.41 -42.415 -42.42 -42.425 -42.43 -42.435 -42.44 -42.445 -42.45 -42.455 -42.46 -42.465 -42.47 -42.475 -42.48 -42.485 -42.49 -42.495 -42.5 -42.505 -42.51 -42.515 -42.52 -42.525 -42.53 -42.535 -42.54 -42.545 -42.55 -42.555 -42.56 -42.565 -42.57 -42.575 -42.58 -42.585 -42.59 -42.595 -42.6 -42.605 -42.61 -42.615 -42.62 -42.625 -42.63 -42.635 -42.64 -42.645 -42.65 -42.655 -42.66 -42.665 -42.67 -42.675 -42.68 -42.685 -42.69 -42.695 -42.7 -42.705 -42.71 -42.715 -42.72 -42.725 -42.73 -42.735 -42.74 -42.745 -42.75 -42.755 -42.76 -42.765 -42.77 -42.775 -42.78 -42.785 -42.79 -42.795 -42.8 -42.805 -42.81 -42.815 -42.82 -42.825 -42.83 -42.835 -42.84 -42.845 -42.85 -42.855 -42.86 -42.865 -42.87 -42.875 -42.88 -42.885 -42.89 -42.895 -42.9 -42.905 -42.91 -42.915 -42.92 -42.925 -42.93 -42.935 -42.94 -42.945 -42.95 -42.955 -42.96 -42.965 -42.97 -42.975 -42.98 -42.985 -42.99 -42.995 -43 -43.005 -43.01 -43.015 -43.02 -43.025 -43.03 -43.035 -43.04 -43.045 -43.05 -43.055 -43.06 -43.065 -43.07 -43.075 -43.08 -43.085 -43.09 -43.095 -43.1 -43.105 -43.11 -43.115 -43.12 -43.125 -43.13 -43.135 -43.14 -43.145 -43.15 -43.155 -43.16 -43.165 -43.17 -43.175 -43.18 -43.185 -43.19 -43.195 -43.2 -43.205 -43.21 -43.215 -43.22 -43.225 -43.23 -43.235 -43.24 -43.245 -43.25 -43.255 -43.26 -43.265 -43.27 -43.275 -43.28 -43.285 -43.29 -43.295 -43.3 -43.305 -43.31 -43.315 -43.32 -43.325 -43.33 -43.335 -43.34 -43.345 -43.35 -43.355 -43.36 -43.365 -43.37 -43.375 -43.38 -43.385 -43.39 -43.395 -43.4 -43.405 -43.41 -43.415 -43.42 -43.425 -43.43 -43.435 -43.44 -43.445 -43.45 -43.455 -43.46 -43.465 -43.47 -43.475 -43.48 -43.485 -43.49 -43.495 -43.5 -43.505 -43.51 -43.515 -43.52 -43.525 -43.53 -43.535 -43.54 -43.545 -43.55 -43.555 -43.56 -43.565 -43.57 -43.575 -43.58 -43.585 -43.59 -43.595 -43.6 -43.605 -43.61 -43.615 -43.62 -43.625 -43.63 -43.635 -43.64 -43.645 -43.65 -43.655 -43.66 -43.665 -43.67 -43.675 -43.68 -43.685 -43.69 -43.695 -43.7 -43.705 -43.71 -43.715 -43.72 -43.725 -43.73 -43.735 -43.74 -43.745 -43.75 -43.755 -43.76 -43.765 -43.77 -43.775 -43.78 -43.785 -43.79 -43.795 -43.8 -43.805 -43.81 -43.815 -43.82 -43.825 -43.83 -43.835 -43.84 -43.845 -43.85 -43.855 -43.86 -43.865 -43.87 -43.875 -43.88 -43.885 -43.89 -43.895 -43.9 -43.905 -43.91 -43.915 -43.92 -43.925 -43.93 -43.935 -43.94 -43.945 -43.95 -43.955 -43.96 -43.965 -43.97 -43.975 -43.98 -43.985 -43.99 -43.995 -44 -44.005 -44.01 -44.015 -44.02 -44.025 -44.03 -44.035 -44.04 -44.045 -44.05 -44.055 -44.06 -44.065 -44.07 -44.075 -44.08 -44.085 -44.09 -44.095 -44.1 -44.105 -44.11 -44.115 -44.12 -44.125 -44.13 -44.135 -44.14 -44.145 -44.15 -44.155 -44.16 -44.165 -44.17 -44.175 -44.18 -44.185 -44.19 -44.195 -44.2 -44.205 -44.21 -44.215 -44.22 -44.225 -44.23 -44.235 -44.24 -44.245 -44.25 -44.255 -44.26 -44.265 -44.27 -44.275 -44.28 -44.285 -44.29 -44.295 -44.3 -44.305 -44.31 -44.315 -44.32 -44.325 -44.33 -44.335 -44.34 -44.345 -44.35 -44.355 -44.36 -44.365 -44.37 -44.375 -44.38 -44.385 -44.39 -44.395 -44.4 -44.405 -44.41 -44.415 -44.42 -44.425 -44.43 -44.435 -44.44 -44.445 -44.45 -44.455 -44.46 -44.465 -44.47 -44.475 -44.48 -44.485 -44.49 -44.495 -44.5 -44.505 -44.51 -44.515 -44.52 -44.525 -44.53 -44.535 -44.54 -44.545 -44.55 -44.555 -44.56 -44.565 -44.57 -44.575 -44.58 -44.585 -44.59 -44.595 -44.6 -44.605 -44.61 -44.615 -44.62 -44.625 -44.63 -44.635 -44.64 -44.645 -44.65 -44.655 -44.66 -44.665 -44.67 -44.675 -44.68 -44.685 -44.69 -44.695 -44.7 -44.705 -44.71 -44.715 -44.72 -44.725 -44.73 -44.735 -44.74 -44.745 -44.75 -44.755 -44.76 -44.765 -44.77 -44.775 -44.78 -44.785 -44.79 -44.795 -44.8 -44.805 -44.81 -44.815 -44.82 -44.825 -44.83 -44.835 -44.84 -44.845 -44.85 -44.855 -44.86 -44.865 -44.87 -44.875 -44.88 -44.885 -44.89 -44.895 -44.9 -44.905 -44.91 -44.915 -44.92 -44.925 -44.93 -44.935 -44.94 -44.945 -44.95 -44.955 -44.96 -44.965 -44.97 -44.975 -44.98 -44.985 -44.99 -44.995 -45 -45.005 -45.01 -45.015 -45.02 -45.025 -45.03 -45.035 -45.04 -45.045 -45.05 -45.055 -45.06 -45.065 -45.07 -45.075 -45.08 -45.085 -45.09 -45.095 -45.1 -45.105 -45.11 -45.115 -45.12 -45.125 -45.13 -45.135 -45.14 -45.145 -45.15 -45.155 -45.16 -45.165 -45.17 -45.175 -45.18 -45.185 -45.19 -45.195 -45.2 -45.205 -45.21 -45.215 -45.22 -45.225 -45.23 -45.235 -45.24 -45.245 -45.25 -45.255 -45.26 -45.265 -45.27 -45.275 -45.28 -45.285 -45.29 -45.295 -45.3 -45.305 -45.31 -45.315 -45.32 -45.325 -45.33 -45.335 -45.34 -45.345 -45.35 -45.355 -45.36 -45.365 -45.37 -45.375 -45.38 -45.385 -45.39 -45.395 -45.4 -45.405 -45.41 -45.415 -45.42 -45.425 -45.43 -45.435 -45.44 -45.445 -45.45 -45.455 -45.46 -45.465 -45.47 -45.475 -45.48 -45.485 -45.49 -45.495 -45.5 -45.505 -45.51 -45.515 -45.52 -45.525 -45.53 -45.535 -45.54 -45.545 -45.55 -45.555 -45.56 -45.565 -45.57 -45.575 -45.58 -45.585 -45.59 -45.595 -45.6 -45.605 -45.61 -45.615 -45.62 -45.625 -45.63 -45.635 -45.64 -45.645 -45.65 -45.655 -45.66 -45.665 -45.67 -45.675 -45.68 -45.685 -45.69 -45.695 -45.7 -45.705 -45.71 -45.715 -45.72 -45.725 -45.73 -45.735 -45.74 -45.745 -45.75 -45.755 -45.76 -45.765 -45.77 -45.775 -45.78 -45.785 -45.79 -45.795 -45.8 -45.805 -45.81 -45.815 -45.82 -45.825 -45.83 -45.835 -45.84 -45.845 -45.85 -45.855 -45.86 -45.865 -45.87 -45.875 -45.88 -45.885 -45.89 -45.895 -45.9 -45.905 -45.91 -45.915 -45.92 -45.925 -45.93 -45.935 -45.94 -45.945 -45.95 -45.955 -45.96 -45.965 -45.97 -45.975 -45.98 -45.985 -45.99 -45.995 -46 -46.005 -46.01 -46.015 -46.02 -46.025 -46.03 -46.035 -46.04 -46.045 -46.05 -46.055 -46.06 -46.065 -46.07 -46.075 -46.08 -46.085 -46.09 -46.095 -46.1 -46.105 -46.11 -46.115 -46.12 -46.125 -46.13 -46.135 -46.14 -46.145 -46.15 -46.155 -46.16 -46.165 -46.17 -46.175 -46.18 -46.185 -46.19 -46.195 -46.2 -46.205 -46.21 -46.215 -46.22 -46.225 -46.23 -46.235 -46.24 -46.245 -46.25 -46.255 -46.26 -46.265 -46.27 -46.275 -46.28 -46.285 -46.29 -46.295 -46.3 -46.305 -46.31 -46.315 -46.32 -46.325 -46.33 -46.335 -46.34 -46.345 -46.35 -46.355 -46.36 -46.365 -46.37 -46.375 -46.38 -46.385 -46.39 -46.395 -46.4 -46.405 -46.41 -46.415 -46.42 -46.425 -46.43 -46.435 -46.44 -46.445 -46.45 -46.455 -46.46 -46.465 -46.47 -46.475 -46.48 -46.485 -46.49 -46.495 -46.5 -46.505 -46.51 -46.515 -46.52 -46.525 -46.53 -46.535 -46.54 -46.545 -46.55 -46.555 -46.56 -46.565 -46.57 -46.575 -46.58 -46.585 -46.59 -46.595 -46.6 -46.605 -46.61 -46.615 -46.62 -46.625 -46.63 -46.635 -46.64 -46.645 -46.65 -46.655 -46.66 -46.665 -46.67 -46.675 -46.68 -46.685 -46.69 -46.695 -46.7 -46.705 -46.71 -46.715 -46.72 -46.725 -46.73 -46.735 -46.74 -46.745 -46.75 -46.755 -46.76 -46.765 -46.77 -46.775 -46.78 -46.785 -46.79 -46.795 -46.8 -46.805 -46.81 -46.815 -46.82 -46.825 -46.83 -46.835 -46.84 -46.845 -46.85 -46.855 -46.86 -46.865 -46.87 -46.875 -46.88 -46.885 -46.89 -46.895 -46.9 -46.905 -46.91 -46.915 -46.92 -46.925 -46.93 -46.935 -46.94 -46.945 -46.95 -46.955 -46.96 -46.965 -46.97 -46.975 -46.98 -46.985 -46.99 -46.995 -47 -47.005 -47.01 -47.015 -47.02 -47.025 -47.03 -47.035 -47.04 -47.045 -47.05 -47.055 -47.06 -47.065 -47.07 -47.075 -47.08 -47.085 -47.09 -47.095 -47.1 -47.105 -47.11 -47.115 -47.12 -47.125 -47.13 -47.135 -47.14 -47.145 -47.15 -47.155 -47.16 -47.165 -47.17 -47.175 -47.18 -47.185 -47.19 -47.195 -47.2 -47.205 -47.21 -47.215 -47.22 -47.225 -47.23 -47.235 -47.24 -47.245 -47.25 -47.255 -47.26 -47.265 -47.27 -47.275 -47.28 -47.285 -47.29 -47.295 -47.3 -47.305 -47.31 -47.315 -47.32 -47.325 -47.33 -47.335 -47.34 -47.345 -47.35 -47.355 -47.36 -47.365 -47.37 -47.375 -47.38 -47.385 -47.39 -47.395 -47.4 -47.405 -47.41 -47.415 -47.42 -47.425 -47.43 -47.435 -47.44 -47.445 -47.45 -47.455 -47.46 -47.465 -47.47 -47.475 -47.48 -47.485 -47.49 -47.495 -47.5 -47.505 -47.51 -47.515 -47.52 -47.525 -47.53 -47.535 -47.54 -47.545 -47.55 -47.555 -47.56 -47.565 -47.57 -47.575 -47.58 -47.585 -47.59 -47.595 -47.6 -47.605 -47.61 -47.615 -47.62 -47.625 -47.63 -47.635 -47.64 -47.645 -47.65 -47.655 -47.66 -47.665 -47.67 -47.675 -47.68 -47.685 -47.69 -47.695 -47.7 -47.705 -47.71 -47.715 -47.72 -47.725 -47.73 -47.735 -47.74 -47.745 -47.75 -47.755 -47.76 -47.765 -47.77 -47.775 -47.78 -47.785 -47.79 -47.795 -47.8 -47.805 -47.81 -47.815 -47.82 -47.825 -47.83 -47.835 -47.84 -47.845 -47.85 -47.855 -47.86 -47.865 -47.87 -47.875 -47.88 -47.885 -47.89 -47.895 -47.9 -47.905 -47.91 -47.915 -47.92 -47.925 -47.93 -47.935 -47.94 -47.945 -47.95 -47.955 -47.96 -47.965 -47.97 -47.975 -47.98 -47.985 -47.99 -47.995 -48 -48.005 -48.01 -48.015 -48.02 -48.025 -48.03 -48.035 -48.04 -48.045 -48.05 -48.055 -48.06 -48.065 -48.07 -48.075 -48.08 -48.085 -48.09 -48.095 -48.1 -48.105 -48.11 -48.115 -48.12 -48.125 -48.13 -48.135 -48.14 -48.145 -48.15 -48.155 -48.16 -48.165 -48.17 -48.175 -48.18 -48.185 -48.19 -48.195 -48.2 -48.205 -48.21 -48.215 -48.22 -48.225 -48.23 -48.235 -48.24 -48.245 -48.25 -48.255 -48.26 -48.265 -48.27 -48.275 -48.28 -48.285 -48.29 -48.295 -48.3 -48.305 -48.31 -48.315 -48.32 -48.325 -48.33 -48.335 -48.34 -48.345 -48.35 -48.355 -48.36 -48.365 -48.37 -48.375 -48.38 -48.385 -48.39 -48.395 -48.4 -48.405 -48.41 -48.415 -48.42 -48.425 -48.43 -48.435 -48.44 -48.445 -48.45 -48.455 -48.46 -48.465 -48.47 -48.475 -48.48 -48.485 -48.49 -48.495 -48.5 -48.505 -48.51 -48.515 -48.52 -48.525 -48.53 -48.535 -48.54 -48.545 -48.55 -48.555 -48.56 -48.565 -48.57 -48.575 -48.58 -48.585 -48.59 -48.595 -48.6 -48.605 -48.61 -48.615 -48.62 -48.625 -48.63 -48.635 -48.64 -48.645 -48.65 -48.655 -48.66 -48.665 -48.67 -48.675 -48.68 -48.685 -48.69 -48.695 -48.7 -48.705 -48.71 -48.715 -48.72 -48.725 -48.73 -48.735 -48.74 -48.745 -48.75 -48.755 -48.76 -48.765 -48.77 -48.775 -48.78 -48.785 -48.79 -48.795 -48.8 -48.805 -48.81 -48.815 -48.82 -48.825 -48.83 -48.835 -48.84 -48.845 -48.85 -48.855 -48.86 -48.865 -48.87 -48.875 -48.88 -48.885 -48.89 -48.895 -48.9 -48.905 -48.91 -48.915 -48.92 -48.925 -48.93 -48.935 -48.94 -48.945 -48.95 -48.955 -48.96 -48.965 -48.97 -48.975 -48.98 -48.985 -48.99 -48.995 -49 -49.005 -49.01 -49.015 -49.02 -49.025 -49.03 -49.035 -49.04 -49.045 -49.05 -49.055 -49.06 -49.065 -49.07 -49.075 -49.08 -49.085 -49.09 -49.095 -49.1 -49.105 -49.11 -49.115 -49.12 -49.125 -49.13 -49.135 -49.14 -49.145 -49.15 -49.155 -49.16 -49.165 -49.17 -49.175 -49.18 -49.185 -49.19 -49.195 -49.2 -49.205 -49.21 -49.215 -49.22 -49.225 -49.23 -49.235 -49.24 -49.245 -49.25 -49.255 -49.26 -49.265 -49.27 -49.275 -49.28 -49.285 -49.29 -49.295 -49.3 -49.305 -49.31 -49.315 -49.32 -49.325 -49.33 -49.335 -49.34 -49.345 -49.35 -49.355 -49.36 -49.365 -49.37 -49.375 -49.38 -49.385 -49.39 -49.395 -49.4 -49.405 -49.41 -49.415 -49.42 -49.425 -49.43 -49.435 -49.44 -49.445 -49.45 -49.455 -49.46 -49.465 -49.47 -49.475 -49.48 -49.485 -49.49 -49.495 -49.5 -49.505 -49.51 -49.515 -49.52 -49.525 -49.53 -49.535 -49.54 -49.545 -49.55 -49.555 -49.56 -49.565 -49.57 -49.575 -49.58 -49.585 -49.59 -49.595 -49.6 -49.605 -49.61 -49.615 -49.62 -49.625 -49.63 -49.635 -49.64 -49.645 -49.65 -49.655 -49.66 -49.665 -49.67 -49.675 -49.68 -49.685 -49.69 -49.695 -49.7 -49.705 -49.71 -49.715 -49.72 -49.725 -49.73 -49.735 -49.74 -49.745 -49.75 -49.755 -49.76 -49.765 -49.77 -49.775 -49.78 -49.785 -49.79 -49.795 -49.8 -49.805 -49.81 -49.815 -49.82 -49.825 -49.83 -49.835 -49.84 -49.845 -49.85 -49.855 -49.86 -49.865 -49.87 -49.875 -49.88 -49.885 -49.89 -49.895 -49.9 -49.905 -49.91 -49.915 -49.92 -49.925 -49.93 -49.935 -49.94 -49.945 -49.95 -49.955 -49.96 -49.965 -49.97 -49.975 -49.98 -49.985 -49.99 -49.995 -50 -50.005 -50.01 -50.015 -50.02 -50.025 -50.03 -50.035 -50.04 -50.045 -50.05 -50.055 -50.06 -50.065 -50.07 -50.075 -50.08 -50.085 -50.09 -50.095 -50.1 -50.105 -50.11 -50.115 -50.12 -50.125 -50.13 -50.135 -50.14 -50.145 -50.15 -50.155 -50.16 -50.165 -50.17 -50.175 -50.18 -50.185 -50.19 -50.195 -50.2 -50.205 -50.21 -50.215 -50.22 -50.225 -50.23 -50.235 -50.24 -50.245 -50.25 -50.255 -50.26 -50.265 -50.27 -50.275 -50.28 -50.285 -50.29 -50.295 -50.3 -50.305 -50.31 -50.315 -50.32 -50.325 -50.33 -50.335 -50.34 -50.345 -50.35 -50.355 -50.36 -50.365 -50.37 -50.375 -50.38 -50.385 -50.39 -50.395 -50.4 -50.405 -50.41 -50.415 -50.42 -50.425 -50.43 -50.435 -50.44 -50.445 -50.45 -50.455 -50.46 -50.465 -50.47 -50.475 -50.48 -50.485 -50.49 -50.495 -50.5 -50.505 -50.51 -50.515 -50.52 -50.525 -50.53 -50.535 -50.54 -50.545 -50.55 -50.555 -50.56 -50.565 -50.57 -50.575 -50.58 -50.585 -50.59 -50.595 -50.6 -50.605 -50.61 -50.615 -50.62 -50.625 -50.63 -50.635 -50.64 -50.645 -50.65 -50.655 -50.66 -50.665 -50.67 -50.675 -50.68 -50.685 -50.69 -50.695 -50.7 -50.705 -50.71 -50.715 -50.72 -50.725 -50.73 -50.735 -50.74 -50.745 -50.75 -50.755 -50.76 -50.765 -50.77 -50.775 -50.78 -50.785 -50.79 -50.795 -50.8 -50.805 -50.81 -50.815 -50.82 -50.825 -50.83 -50.835 -50.84 -50.845 -50.85 -50.855 -50.86 -50.865 -50.87 -50.875 -50.88 -50.885 -50.89 -50.895 -50.9 -50.905 -50.91 -50.915 -50.92 -50.925 -50.93 -50.935 -50.94 -50.945 -50.95 -50.955 -50.96 -50.965 -50.97 -50.975 -50.98 -50.985 -50.99 -50.995 -51 -51.005 -51.01 -51.015 -51.02 -51.025 -51.03 -51.035 -51.04 -51.045 -51.05 -51.055 -51.06 -51.065 -51.07 -51.075 -51.08 -51.085 -51.09 -51.095 -51.1 -51.105 -51.11 -51.115 -51.12 -51.125 -51.13 -51.135 -51.14 -51.145 -51.15 -51.155 -51.16 -51.165 -51.17 -51.175 -51.18 -51.185 -51.19 -51.195 -51.2 -51.205 -51.21 -51.215 -51.22 -51.225 -51.23 -51.235 -51.24 -51.245 -51.25 -51.255 -51.26 -51.265 -51.27 -51.275 -51.28 -51.285 -51.29 -51.295 -51.3 -51.305 -51.31 -51.315 -51.32 -51.325 -51.33 -51.335 -51.34 -51.345 -51.35 -51.355 -51.36 -51.365 -51.37 -51.375 -51.38 -51.385 -51.39 -51.395 -51.4 -51.405 -51.41 -51.415 -51.42 -51.425 -51.43 -51.435 -51.44 -51.445 -51.45 -51.455 -51.46 -51.465 -51.47 -51.475 -51.48 -51.485 -51.49 -51.495 -51.5 -51.505 -51.51 -51.515 -51.52 -51.525 -51.53 -51.535 -51.54 -51.545 -51.55 -51.555 -51.56 -51.565 -51.57 -51.575 -51.58 -51.585 -51.59 -51.595 -51.6 -51.605 -51.61 -51.615 -51.62 -51.625 -51.63 -51.635 -51.64 -51.645 -51.65 -51.655 -51.66 -51.665 -51.67 -51.675 -51.68 -51.685 -51.69 -51.695 -51.7 -51.705 -51.71 -51.715 -51.72 -51.725 -51.73 -51.735 -51.74 -51.745 -51.75 -51.755 -51.76 -51.765 -51.77 -51.775 -51.78 -51.785 -51.79 -51.795 -51.8 -51.805 -51.81 -51.815 -51.82 -51.825 -51.83 -51.835 -51.84 -51.845 -51.85 -51.855 -51.86 -51.865 -51.87 -51.875 -51.88 -51.885 -51.89 -51.895 -51.9 -51.905 -51.91 -51.915 -51.92 -51.925 -51.93 -51.935 -51.94 -51.945 -51.95 -51.955 -51.96 -51.965 -51.97 -51.975 -51.98 -51.985 -51.99 -51.995 -52 -52.005 -52.01 -52.015 -52.02 -52.025 -52.03 -52.035 -52.04 -52.045 -52.05 -52.055 -52.06 -52.065 -52.07 -52.075 -52.08 -52.085 -52.09 -52.095 -52.1 -52.105 -52.11 -52.115 -52.12 -52.125 -52.13 -52.135 -52.14 -52.145 -52.15 -52.155 -52.16 -52.165 -52.17 -52.175 -52.18 -52.185 -52.19 -52.195 -52.2 -52.205 -52.21 -52.215 -52.22 -52.225 -52.23 -52.235 -52.24 -52.245 -52.25 -52.255 -52.26 -52.265 -52.27 -52.275 -52.28 -52.285 -52.29 -52.295 -52.3 -52.305 -52.31 -52.315 -52.32 -52.325 -52.33 -52.335 -52.34 -52.345 -52.35 -52.355 -52.36 -52.365 -52.37 -52.375 -52.38 -52.385 -52.39 -52.395 -52.4 -52.405 -52.41 -52.415 -52.42 -52.425 -52.43 -52.435 -52.44 -52.445 -52.45 -52.455 -52.46 -52.465 -52.47 -52.475 -52.48 -52.485 -52.49 -52.495 -52.5 -52.505 -52.51 -52.515 -52.52 -52.525 -52.53 -52.535 -52.54 -52.545 -52.55 -52.555 -52.56 -52.565 -52.57 -52.575 -52.58 -52.585 -52.59 -52.595 -52.6 -52.605 -52.61 -52.615 -52.62 -52.625 -52.63 -52.635 -52.64 -52.645 -52.65 -52.655 -52.66 -52.665 -52.67 -52.675 -52.68 -52.685 -52.69 -52.695 -52.7 -52.705 -52.71 -52.715 -52.72 -52.725 -52.73 -52.735 -52.74 -52.745 -52.75 -52.755 -52.76 -52.765 -52.77 -52.775 -52.78 -52.785 -52.79 -52.795 -52.8 -52.805 -52.81 -52.815 -52.82 -52.825 -52.83 -52.835 -52.84 -52.845 -52.85 -52.855 -52.86 -52.865 -52.87 -52.875 -52.88 -52.885 -52.89 -52.895 -52.9 -52.905 -52.91 -52.915 -52.92 -52.925 -52.93 -52.935 -52.94 -52.945 -52.95 -52.955 -52.96 -52.965 -52.97 -52.975 -52.98 -52.985 -52.99 -52.995 -53 -53.005 -53.01 -53.015 -53.02 -53.025 -53.03 -53.035 -53.04 -53.045 -53.05 -53.055 -53.06 -53.065 -53.07 -53.075 -53.08 -53.085 -53.09 -53.095 -53.1 -53.105 -53.11 -53.115 -53.12 -53.125 -53.13 -53.135 -53.14 -53.145 -53.15 -53.155 -53.16 -53.165 -53.17 -53.175 -53.18 -53.185 -53.19 -53.195 -53.2 -53.205 -53.21 -53.215 -53.22 -53.225 -53.23 -53.235 -53.24 -53.245 -53.25 -53.255 -53.26 -53.265 -53.27 -53.275 -53.28 -53.285 -53.29 -53.295 -53.3 -53.305 -53.31 -53.315 -53.32 -53.325 -53.33 -53.335 -53.34 -53.345 -53.35 -53.355 -53.36 -53.365 -53.37 -53.375 -53.38 -53.385 -53.39 -53.395 -53.4 -53.405 -53.41 -53.415 -53.42 -53.425 -53.43 -53.435 -53.44 -53.445 -53.45 -53.455 -53.46 -53.465 -53.47 -53.475 -53.48 -53.485 -53.49 -53.495 -53.5 -53.505 -53.51 -53.515 -53.52 -53.525 -53.53 -53.535 -53.54 -53.545 -53.55 -53.555 -53.56 -53.565 -53.57 -53.575 -53.58 -53.585 -53.59 -53.595 -53.6 -53.605 -53.61 -53.615 -53.62 -53.625 -53.63 -53.635 -53.64 -53.645 -53.65 -53.655 -53.66 -53.665 -53.67 -53.675 -53.68 -53.685 -53.69 -53.695 -53.7 -53.705 -53.71 -53.715 -53.72 -53.725 -53.73 -53.735 -53.74 -53.745 -53.75 -53.755 -53.76 -53.765 -53.77 -53.775 -53.78 -53.785 -53.79 -53.795 -53.8 -53.805 -53.81 -53.815 -53.82 -53.825 -53.83 -53.835 -53.84 -53.845 -53.85 -53.855 -53.86 -53.865 -53.87 -53.875 -53.88 -53.885 -53.89 -53.895 -53.9 -53.905 -53.91 -53.915 -53.92 -53.925 -53.93 -53.935 -53.94 -53.945 -53.95 -53.955 -53.96 -53.965 -53.97 -53.975 -53.98 -53.985 -53.99 -53.995 -54 -54.005 -54.01 -54.015 -54.02 -54.025 -54.03 -54.035 -54.04 -54.045 -54.05 -54.055 -54.06 -54.065 -54.07 -54.075 -54.08 -54.085 -54.09 -54.095 -54.1 -54.105 -54.11 -54.115 -54.12 -54.125 -54.13 -54.135 -54.14 -54.145 -54.15 -54.155 -54.16 -54.165 -54.17 -54.175 -54.18 -54.185 -54.19 -54.195 -54.2 -54.205 -54.21 -54.215 -54.22 -54.225 -54.23 -54.235 -54.24 -54.245 -54.25 -54.255 -54.26 -54.265 -54.27 -54.275 -54.28 -54.285 -54.29 -54.295 -54.3 -54.305 -54.31 -54.315 -54.32 -54.325 -54.33 -54.335 -54.34 -54.345 -54.35 -54.355 -54.36 -54.365 -54.37 -54.375 -54.38 -54.385 -54.39 -54.395 -54.4 -54.405 -54.41 -54.415 -54.42 -54.425 -54.43 -54.435 -54.44 -54.445 -54.45 -54.455 -54.46 -54.465 -54.47 -54.475 -54.48 -54.485 -54.49 -54.495 -54.5 -54.505 -54.51 -54.515 -54.52 -54.525 -54.53 -54.535 -54.54 -54.545 -54.55 -54.555 -54.56 -54.565 -54.57 -54.575 -54.58 -54.585 -54.59 -54.595 -54.6 -54.605 -54.61 -54.615 -54.62 -54.625 -54.63 -54.635 -54.64 -54.645 -54.65 -54.655 -54.66 -54.665 -54.67 -54.675 -54.68 -54.685 -54.69 -54.695 -54.7 -54.705 -54.71 -54.715 -54.72 -54.725 -54.73 -54.735 -54.74 -54.745 -54.75 -54.755 -54.76 -54.765 -54.77 -54.775 -54.78 -54.785 -54.79 -54.795 -54.8 -54.805 -54.81 -54.815 -54.82 -54.825 -54.83 -54.835 -54.84 -54.845 -54.85 -54.855 -54.86 -54.865 -54.87 -54.875 -54.88 -54.885 -54.89 -54.895 -54.9 -54.905 -54.91 -54.915 -54.92 -54.925 -54.93 -54.935 -54.94 -54.945 -54.95 -54.955 -54.96 -54.965 -54.97 -54.975 -54.98 -54.985 -54.99 -54.995 -55 -55.005 -55.01 -55.015 -55.02 -55.025 -55.03 -55.035 -55.04 -55.045 -55.05 -55.055 -55.06 -55.065 -55.07 -55.075 -55.08 -55.085 -55.09 -55.095 -55.1 -55.105 -55.11 -55.115 -55.12 -55.125 -55.13 -55.135 -55.14 -55.145 -55.15 -55.155 -55.16 -55.165 -55.17 -55.175 -55.18 -55.185 -55.19 -55.195 -55.2 -55.205 -55.21 -55.215 -55.22 -55.225 -55.23 -55.235 -55.24 -55.245 -55.25 -55.255 -55.26 -55.265 -55.27 -55.275 -55.28 -55.285 -55.29 -55.295 -55.3 -55.305 -55.31 -55.315 -55.32 -55.325 -55.33 -55.335 -55.34 -55.345 -55.35 -55.355 -55.36 -55.365 -55.37 -55.375 -55.38 -55.385 -55.39 -55.395 -55.4 -55.405 -55.41 -55.415 -55.42 -55.425 -55.43 -55.435 -55.44 -55.445 -55.45 -55.455 -55.46 -55.465 -55.47 -55.475 -55.48 -55.485 -55.49 -55.495 -55.5 -55.505 -55.51 -55.515 -55.52 -55.525 -55.53 -55.535 -55.54 -55.545 -55.55 -55.555 -55.56 -55.565 -55.57 -55.575 -55.58 -55.585 -55.59 -55.595 -55.6 -55.605 -55.61 -55.615 -55.62 -55.625 -55.63 -55.635 -55.64 -55.645 -55.65 -55.655 -55.66 -55.665 -55.67 -55.675 -55.68 -55.685 -55.69 -55.695 -55.7 -55.705 -55.71 -55.715 -55.72 -55.725 -55.73 -55.735 -55.74 -55.745 -55.75 -55.755 -55.76 -55.765 -55.77 -55.775 -55.78 -55.785 -55.79 -55.795 -55.8 -55.805 -55.81 -55.815 -55.82 -55.825 -55.83 -55.835 -55.84 -55.845 -55.85 -55.855 -55.86 -55.865 -55.87 -55.875 -55.88 -55.885 -55.89 -55.895 -55.9 -55.905 -55.91 -55.915 -55.92 -55.925 -55.93 -55.935 -55.94 -55.945 -55.95 -55.955 -55.96 -55.965 -55.97 -55.975 -55.98 -55.985 -55.99 -55.995 -56 -56.005 -56.01 -56.015 -56.02 -56.025 -56.03 -56.035 -56.04 -56.045 -56.05 -56.055 -56.06 -56.065 -56.07 -56.075 -56.08 -56.085 -56.09 -56.095 -56.1 -56.105 -56.11 -56.115 -56.12 -56.125 -56.13 -56.135 -56.14 -56.145 -56.15 -56.155 -56.16 -56.165 -56.17 -56.175 -56.18 -56.185 -56.19 -56.195 -56.2 -56.205 -56.21 -56.215 -56.22 -56.225 -56.23 -56.235 -56.24 -56.245 -56.25 -56.255 -56.26 -56.265 -56.27 -56.275 -56.28 -56.285 -56.29 -56.295 -56.3 -56.305 -56.31 -56.315 -56.32 -56.325 -56.33 -56.335 -56.34 -56.345 -56.35 -56.355 -56.36 -56.365 -56.37 -56.375 -56.38 -56.385 -56.39 -56.395 -56.4 -56.405 -56.41 -56.415 -56.42 -56.425 -56.43 -56.435 -56.44 -56.445 -56.45 -56.455 -56.46 -56.465 -56.47 -56.475 -56.48 -56.485 -56.49 -56.495 -56.5 -56.505 -56.51 -56.515 -56.52 -56.525 -56.53 -56.535 -56.54 -56.545 -56.55 -56.555 -56.56 -56.565 -56.57 -56.575 -56.58 -56.585 -56.59 -56.595 -56.6 -56.605 -56.61 -56.615 -56.62 -56.625 -56.63 -56.635 -56.64 -56.645 -56.65 -56.655 -56.66 -56.665 -56.67 -56.675 -56.68 -56.685 -56.69 -56.695 -56.7 -56.705 -56.71 -56.715 -56.72 -56.725 -56.73 -56.735 -56.74 -56.745 -56.75 -56.755 -56.76 -56.765 -56.77 -56.775 -56.78 -56.785 -56.79 -56.795 -56.8 -56.805 -56.81 -56.815 -56.82 -56.825 -56.83 -56.835 -56.84 -56.845 -56.85 -56.855 -56.86 -56.865 -56.87 -56.875 -56.88 -56.885 -56.89 -56.895 -56.9 -56.905 -56.91 -56.915 -56.92 -56.925 -56.93 -56.935 -56.94 -56.945 -56.95 -56.955 -56.96 -56.965 -56.97 -56.975 -56.98 -56.985 -56.99 -56.995 -57 -57.005 -57.01 -57.015 -57.02 -57.025 -57.03 -57.035 -57.04 -57.045 -57.05 -57.055 -57.06 -57.065 -57.07 -57.075 -57.08 -57.085 -57.09 -57.095 -57.1 -57.105 -57.11 -57.115 -57.12 -57.125 -57.13 -57.135 -57.14 -57.145 -57.15 -57.155 -57.16 -57.165 -57.17 -57.175 -57.18 -57.185 -57.19 -57.195 -57.2 -57.205 -57.21 -57.215 -57.22 -57.225 -57.23 -57.235 -57.24 -57.245 -57.25 -57.255 -57.26 -57.265 -57.27 -57.275 -57.28 -57.285 -57.29 -57.295 -57.3 -57.305 -57.31 -57.315 -57.32 -57.325 -57.33 -57.335 -57.34 -57.345 -57.35 -57.355 -57.36 -57.365 -57.37 -57.375 -57.38 -57.385 -57.39 -57.395 -57.4 -57.405 -57.41 -57.415 -57.42 -57.425 -57.43 -57.435 -57.44 -57.445 -57.45 -57.455 -57.46 -57.465 -57.47 -57.475 -57.48 -57.485 -57.49 -57.495 -57.5 -57.505 -57.51 -57.515 -57.52 -57.525 -57.53 -57.535 -57.54 -57.545 -57.55 -57.555 -57.56 -57.565 -57.57 -57.575 -57.58 -57.585 -57.59 -57.595 -57.6 -57.605 -57.61 -57.615 -57.62 -57.625 -57.63 -57.635 -57.64 -57.645 -57.65 -57.655 -57.66 -57.665 -57.67 -57.675 -57.68 -57.685 -57.69 -57.695 -57.7 -57.705 -57.71 -57.715 -57.72 -57.725 -57.73 -57.735 -57.74 -57.745 -57.75 -57.755 -57.76 -57.765 -57.77 -57.775 -57.78 -57.785 -57.79 -57.795 -57.8 -57.805 -57.81 -57.815 -57.82 -57.825 -57.83 -57.835 -57.84 -57.845 -57.85 -57.855 -57.86 -57.865 -57.87 -57.875 -57.88 -57.885 -57.89 -57.895 -57.9 -57.905 -57.91 -57.915 -57.92 -57.925 -57.93 -57.935 -57.94 -57.945 -57.95 -57.955 -57.96 -57.965 -57.97 -57.975 -57.98 -57.985 -57.99 -57.995 -58 -58.005 -58.01 -58.015 -58.02 -58.025 -58.03 -58.035 -58.04 -58.045 -58.05 -58.055 -58.06 -58.065 -58.07 -58.075 -58.08 -58.085 -58.09 -58.095 -58.1 -58.105 -58.11 -58.115 -58.12 -58.125 -58.13 -58.135 -58.14 -58.145 -58.15 -58.155 -58.16 -58.165 -58.17 -58.175 -58.18 -58.185 -58.19 -58.195 -58.2 -58.205 -58.21 -58.215 -58.22 -58.225 -58.23 -58.235 -58.24 -58.245 -58.25 -58.255 -58.26 -58.265 -58.27 -58.275 -58.28 -58.285 -58.29 -58.295 -58.3 -58.305 -58.31 -58.315 -58.32 -58.325 -58.33 -58.335 -58.34 -58.345 -58.35 -58.355 -58.36 -58.365 -58.37 -58.375 -58.38 -58.385 -58.39 -58.395 -58.4 -58.405 -58.41 -58.415 -58.42 -58.425 -58.43 -58.435 -58.44 -58.445 -58.45 -58.455 -58.46 -58.465 -58.47 -58.475 -58.48 -58.485 -58.49 -58.495 -58.5 -58.505 -58.51 -58.515 -58.52 -58.525 -58.53 -58.535 -58.54 -58.545 -58.55 -58.555 -58.56 -58.565 -58.57 -58.575 -58.58 -58.585 -58.59 -58.595 -58.6 -58.605 -58.61 -58.615 -58.62 -58.625 -58.63 -58.635 -58.64 -58.645 -58.65 -58.655 -58.66 -58.665 -58.67 -58.675 -58.68 -58.685 -58.69 -58.695 -58.7 -58.705 -58.71 -58.715 -58.72 -58.725 -58.73 -58.735 -58.74 -58.745 -58.75 -58.755 -58.76 -58.765 -58.77 -58.775 -58.78 -58.785 -58.79 -58.795 -58.8 -58.805 -58.81 -58.815 -58.82 -58.825 -58.83 -58.835 -58.84 -58.845 -58.85 -58.855 -58.86 -58.865 -58.87 -58.875 -58.88 -58.885 -58.89 -58.895 -58.9 -58.905 -58.91 -58.915 -58.92 -58.925 -58.93 -58.935 -58.94 -58.945 -58.95 -58.955 -58.96 -58.965 -58.97 -58.975 -58.98 -58.985 -58.99 -58.995 -59 -59.005 -59.01 -59.015 -59.02 -59.025 -59.03 -59.035 -59.04 -59.045 -59.05 -59.055 -59.06 -59.065 -59.07 -59.075 -59.08 -59.085 -59.09 -59.095 -59.1 -59.105 -59.11 -59.115 -59.12 -59.125 -59.13 -59.135 -59.14 -59.145 -59.15 -59.155 -59.16 -59.165 -59.17 -59.175 -59.18 -59.185 -59.19 -59.195 -59.2 -59.205 -59.21 -59.215 -59.22 -59.225 -59.23 -59.235 -59.24 -59.245 -59.25 -59.255 -59.26 -59.265 -59.27 -59.275 -59.28 -59.285 -59.29 -59.295 -59.3 -59.305 -59.31 -59.315 -59.32 -59.325 -59.33 -59.335 -59.34 -59.345 -59.35 -59.355 -59.36 -59.365 -59.37 -59.375 -59.38 -59.385 -59.39 -59.395 -59.4 -59.405 -59.41 -59.415 -59.42 -59.425 -59.43 -59.435 -59.44 -59.445 -59.45 -59.455 -59.46 -59.465 -59.47 -59.475 -59.48 -59.485 -59.49 -59.495 -59.5 -59.505 -59.51 -59.515 -59.52 -59.525 -59.53 -59.535 -59.54 -59.545 -59.55 -59.555 -59.56 -59.565 -59.57 -59.575 -59.58 -59.585 -59.59 -59.595 -59.6 -59.605 -59.61 -59.615 -59.62 -59.625 -59.63 -59.635 -59.64 -59.645 -59.65 -59.655 -59.66 -59.665 -59.67 -59.675 -59.68 -59.685 -59.69 -59.695 -59.7 -59.705 -59.71 -59.715 -59.72 -59.725 -59.73 -59.735 -59.74 -59.745 -59.75 -59.755 -59.76 -59.765 -59.77 -59.775 -59.78 -59.785 -59.79 -59.795 -59.8 -59.805 -59.81 -59.815 -59.82 -59.825 -59.83 -59.835 -59.84 -59.845 -59.85 -59.855 -59.86 -59.865 -59.87 -59.875 -59.88 -59.885 -59.89 -59.895 -59.9 -59.905 -59.91 -59.915 -59.92 -59.925 -59.93 -59.935 -59.94 -59.945 -59.95 -59.955 -59.96 -59.965 -59.97 -59.975 -59.98 -59.985 -59.99 -59.995 -60 -60.005 -60.01 -60.015 -60.02 -60.025 -60.03 -60.035 -60.04 -60.045 -60.05 -60.055 -60.06 -60.065 -60.07 -60.075 -60.08 -60.085 -60.09 -60.095 -60.1 -60.105 -60.11 -60.115 -60.12 -60.125 -60.13 -60.135 -60.14 -60.145 -60.15 -60.155 -60.16 -60.165 -60.17 -60.175 -60.18 -60.185 -60.19 -60.195 -60.2 -60.205 -60.21 -60.215 -60.22 -60.225 -60.23 -60.235 -60.24 -60.245 -60.25 -60.255 -60.26 -60.265 -60.27 -60.275 -60.28 -60.285 -60.29 -60.295 -60.3 -60.305 -60.31 -60.315 -60.32 -60.325 -60.33 -60.335 -60.34 -60.345 -60.35 -60.355 -60.36 -60.365 -60.37 -60.375 -60.38 -60.385 -60.39 -60.395 -60.4 -60.405 -60.41 -60.415 -60.42 -60.425 -60.43 -60.435 -60.44 -60.445 -60.45 -60.455 -60.46 -60.465 -60.47 -60.475 -60.48 -60.485 -60.49 -60.495 -60.5 -60.505 -60.51 -60.515 -60.52 -60.525 -60.53 -60.535 -60.54 -60.545 -60.55 -60.555 -60.56 -60.565 -60.57 -60.575 -60.58 -60.585 -60.59 -60.595 -60.6 -60.605 -60.61 -60.615 -60.62 -60.625 -60.63 -60.635 -60.64 -60.645 -60.65 -60.655 -60.66 -60.665 -60.67 -60.675 -60.68 -60.685 -60.69 -60.695 -60.7 -60.705 -60.71 -60.715 -60.72 -60.725 -60.73 -60.735 -60.74 -60.745 -60.75 -60.755 -60.76 -60.765 -60.77 -60.775 -60.78 -60.785 -60.79 -60.795 -60.8 -60.805 -60.81 -60.815 -60.82 -60.825 -60.83 -60.835 -60.84 -60.845 -60.85 -60.855 -60.86 -60.865 -60.87 -60.875 -60.88 -60.885 -60.89 -60.895 -60.9 -60.905 -60.91 -60.915 -60.92 -60.925 -60.93 -60.935 -60.94 -60.945 -60.95 -60.955 -60.96 -60.965 -60.97 -60.975 -60.98 -60.985 -60.99 -60.995 -61 -61.005 -61.01 -61.015 -61.02 -61.025 -61.03 -61.035 -61.04 -61.045 -61.05 -61.055 -61.06 -61.065 -61.07 -61.075 -61.08 -61.085 -61.09 -61.095 -61.1 -61.105 -61.11 -61.115 -61.12 -61.125 -61.13 -61.135 -61.14 -61.145 -61.15 -61.155 -61.16 -61.165 -61.17 -61.175 -61.18 -61.185 -61.19 -61.195 -61.2 -61.205 -61.21 -61.215 -61.22 -61.225 -61.23 -61.235 -61.24 -61.245 -61.25 -61.255 -61.26 -61.265 -61.27 -61.275 -61.28 -61.285 -61.29 -61.295 -61.3 -61.305 -61.31 -61.315 -61.32 -61.325 -61.33 -61.335 -61.34 -61.345 -61.35 -61.355 -61.36 -61.365 -61.37 -61.375 -61.38 -61.385 -61.39 -61.395 -61.4 -61.405 -61.41 -61.415 -61.42 -61.425 -61.43 -61.435 -61.44 -61.445 -61.45 -61.455 -61.46 -61.465 -61.47 -61.475 -61.48 -61.485 -61.49 -61.495 -61.5 -61.505 -61.51 -61.515 -61.52 -61.525 -61.53 -61.535 -61.54 -61.545 -61.55 -61.555 -61.56 -61.565 -61.57 -61.575 -61.58 -61.585 -61.59 -61.595 -61.6 -61.605 -61.61 -61.615 -61.62 -61.625 -61.63 -61.635 -61.64 -61.645 -61.65 -61.655 -61.66 -61.665 -61.67 -61.675 -61.68 -61.685 -61.69 -61.695 -61.7 -61.705 -61.71 -61.715 -61.72 -61.725 -61.73 -61.735 -61.74 -61.745 -61.75 -61.755 -61.76 -61.765 -61.77 -61.775 -61.78 -61.785 -61.79 -61.795 -61.8 -61.805 -61.81 -61.815 -61.82 -61.825 -61.83 -61.835 -61.84 -61.845 -61.85 -61.855 -61.86 -61.865 -61.87 -61.875 -61.88 -61.885 -61.89 -61.895 -61.9 -61.905 -61.91 -61.915 -61.92 -61.925 -61.93 -61.935 -61.94 -61.945 -61.95 -61.955 -61.96 -61.965 -61.97 -61.975 -61.98 -61.985 -61.99 -61.995 -62 -62.005 -62.01 -62.015 -62.02 -62.025 -62.03 -62.035 -62.04 -62.045 -62.05 -62.055 -62.06 -62.065 -62.07 -62.075 -62.08 -62.085 -62.09 -62.095 -62.1 -62.105 -62.11 -62.115 -62.12 -62.125 -62.13 -62.135 -62.14 -62.145 -62.15 -62.155 -62.16 -62.165 -62.17 -62.175 -62.18 -62.185 -62.19 -62.195 -62.2 -62.205 -62.21 -62.215 -62.22 -62.225 -62.23 -62.235 -62.24 -62.245 -62.25 -62.255 -62.26 -62.265 -62.27 -62.275 -62.28 -62.285 -62.29 -62.295 -62.3 -62.305 -62.31 -62.315 -62.32 -62.325 -62.33 -62.335 -62.34 -62.345 -62.35 -62.355 -62.36 -62.365 -62.37 -62.375 -62.38 -62.385 -62.39 -62.395 -62.4 -62.405 -62.41 -62.415 -62.42 -62.425 -62.43 -62.435 -62.44 -62.445 -62.45 -62.455 -62.46 -62.465 -62.47 -62.475 -62.48 -62.485 -62.49 -62.495 -62.5 -62.505 -62.51 -62.515 -62.52 -62.525 -62.53 -62.535 -62.54 -62.545 -62.55 -62.555 -62.56 -62.565 -62.57 -62.575 -62.58 -62.585 -62.59 -62.595 -62.6 -62.605 -62.61 -62.615 -62.62 -62.625 -62.63 -62.635 -62.64 -62.645 -62.65 -62.655 -62.66 -62.665 -62.67 -62.675 -62.68 -62.685 -62.69 -62.695 -62.7 -62.705 -62.71 -62.715 -62.72 -62.725 -62.73 -62.735 -62.74 -62.745 -62.75 -62.755 -62.76 -62.765 -62.77 -62.775 -62.78 -62.785 -62.79 -62.795 -62.8 -62.805 -62.81 -62.815 -62.82 -62.825 -62.83 -62.835 -62.84 -62.845 -62.85 -62.855 -62.86 -62.865 -62.87 -62.875 -62.88 -62.885 -62.89 -62.895 -62.9 -62.905 -62.91 -62.915 -62.92 -62.925 -62.93 -62.935 -62.94 -62.945 -62.95 -62.955 -62.96 -62.965 -62.97 -62.975 -62.98 -62.985 -62.99 -62.995 -63 -63.005 -63.01 -63.015 -63.02 -63.025 -63.03 -63.035 -63.04 -63.045 -63.05 -63.055 -63.06 -63.065 -63.07 -63.075 -63.08 -63.085 -63.09 -63.095 -63.1 -63.105 -63.11 -63.115 -63.12 -63.125 -63.13 -63.135 -63.14 -63.145 -63.15 -63.155 -63.16 -63.165 -63.17 -63.175 -63.18 -63.185 -63.19 -63.195 -63.2 -63.205 -63.21 -63.215 -63.22 -63.225 -63.23 -63.235 -63.24 -63.245 -63.25 -63.255 -63.26 -63.265 -63.27 -63.275 -63.28 -63.285 -63.29 -63.295 -63.3 -63.305 -63.31 -63.315 -63.32 -63.325 -63.33 -63.335 -63.34 -63.345 -63.35 -63.355 -63.36 -63.365 -63.37 -63.375 -63.38 -63.385 -63.39 -63.395 -63.4 -63.405 -63.41 -63.415 -63.42 -63.425 -63.43 -63.435 -63.44 -63.445 -63.45 -63.455 -63.46 -63.465 -63.47 -63.475 -63.48 -63.485 -63.49 -63.495 -63.5 -63.505 -63.51 -63.515 -63.52 -63.525 -63.53 -63.535 -63.54 -63.545 -63.55 -63.555 -63.56 -63.565 -63.57 -63.575 -63.58 -63.585 -63.59 -63.595 -63.6 -63.605 -63.61 -63.615 -63.62 -63.625 -63.63 -63.635 -63.64 -63.645 -63.65 -63.655 -63.66 -63.665 -63.67 -63.675 -63.68 -63.685 -63.69 -63.695 -63.7 -63.705 -63.71 -63.715 -63.72 -63.725 -63.73 -63.735 -63.74 -63.745 -63.75 -63.755 -63.76 -63.765 -63.77 -63.775 -63.78 -63.785 -63.79 -63.795 -63.8 -63.805 -63.81 -63.815 -63.82 -63.825 -63.83 -63.835 -63.84 -63.845 -63.85 -63.855 -63.86 -63.865 -63.87 -63.875 -63.88 -63.885 -63.89 -63.895 -63.9 -63.905 -63.91 -63.915 -63.92 -63.925 -63.93 -63.935 -63.94 -63.945 -63.95 -63.955 -63.96 -63.965 -63.97 -63.975 -63.98 -63.985 -63.99 -63.995 -64 -64.005 -64.01 -64.015 -64.02 -64.025 -64.03 -64.035 -64.04 -64.045 -64.05 -64.055 -64.06 -64.065 -64.07 -64.075 -64.08 -64.085 -64.09 -64.095 -64.1 -64.105 -64.11 -64.115 -64.12 -64.125 -64.13 -64.135 -64.14 -64.145 -64.15 -64.155 -64.16 -64.165 -64.17 -64.175 -64.18 -64.185 -64.19 -64.195 -64.2 -64.205 -64.21 -64.215 -64.22 -64.225 -64.23 -64.235 -64.24 -64.245 -64.25 -64.255 -64.26 -64.265 -64.27 -64.275 -64.28 -64.285 -64.29 -64.295 -64.3 -64.305 -64.31 -64.315 -64.32 -64.325 -64.33 -64.335 -64.34 -64.345 -64.35 -64.355 -64.36 -64.365 -64.37 -64.375 -64.38 -64.385 -64.39 -64.395 -64.4 -64.405 -64.41 -64.415 -64.42 -64.425 -64.43 -64.435 -64.44 -64.445 -64.45 -64.455 -64.46 -64.465 -64.47 -64.475 -64.48 -64.485 -64.49 -64.495 -64.5 -64.505 -64.51 -64.515 -64.52 -64.525 -64.53 -64.535 -64.54 -64.545 -64.55 -64.555 -64.56 -64.565 -64.57 -64.575 -64.58 -64.585 -64.59 -64.595 -64.6 -64.605 -64.61 -64.615 -64.62 -64.625 -64.63 -64.635 -64.64 -64.645 -64.65 -64.655 -64.66 -64.665 -64.67 -64.675 -64.68 -64.685 -64.69 -64.695 -64.7 -64.705 -64.71 -64.715 -64.72 -64.725 -64.73 -64.735 -64.74 -64.745 -64.75 -64.755 -64.76 -64.765 -64.77 -64.775 -64.78 -64.785 -64.79 -64.795 -64.8 -64.805 -64.81 -64.815 -64.82 -64.825 -64.83 -64.835 -64.84 -64.845 -64.85 -64.855 -64.86 -64.865 -64.87 -64.875 -64.88 -64.885 -64.89 -64.895 -64.9 -64.905 -64.91 -64.915 -64.92 -64.925 -64.93 -64.935 -64.94 -64.945 -64.95 -64.955 -64.96 -64.965 -64.97 -64.975 -64.98 -64.985 -64.99 -64.995 -65 -65.005 -65.01 -65.015 -65.02 -65.025 -65.03 -65.035 -65.04 -65.045 -65.05 -65.055 -65.06 -65.065 -65.07 -65.075 -65.08 -65.085 -65.09 -65.095 -65.1 -65.105 -65.11 -65.115 -65.12 -65.125 -65.13 -65.135 -65.14 -65.145 -65.15 -65.155 -65.16 -65.165 -65.17 -65.175 -65.18 -65.185 -65.19 -65.195 -65.2 -65.205 -65.21 -65.215 -65.22 -65.225 -65.23 -65.235 -65.24 -65.245 -65.25 -65.255 -65.26 -65.265 -65.27 -65.275 -65.28 -65.285 -65.29 -65.295 -65.3 -65.305 -65.31 -65.315 -65.32 -65.325 -65.33 -65.335 -65.34 -65.345 -65.35 -65.355 -65.36 -65.365 -65.37 -65.375 -65.38 -65.385 -65.39 -65.395 -65.4 -65.405 -65.41 -65.415 -65.42 -65.425 -65.43 -65.435 -65.44 -65.445 -65.45 -65.455 -65.46 -65.465 -65.47 -65.475 -65.48 -65.485 -65.49 -65.495 -65.5 -65.505 -65.51 -65.515 -65.52 -65.525 -65.53 -65.535 -65.54 -65.545 -65.55 -65.555 -65.56 -65.565 -65.57 -65.575 -65.58 -65.585 -65.59 -65.595 -65.6 -65.605 -65.61 -65.615 -65.62 -65.625 -65.63 -65.635 -65.64 -65.645 -65.65 -65.655 -65.66 -65.665 -65.67 -65.675 -65.68 -65.685 -65.69 -65.695 -65.7 -65.705 -65.71 -65.715 -65.72 -65.725 -65.73 -65.735 -65.74 -65.745 -65.75 -65.755 -65.76 -65.765 -65.77 -65.775 -65.78 -65.785 -65.79 -65.795 -65.8 -65.805 -65.81 -65.815 -65.82 -65.825 -65.83 -65.835 -65.84 -65.845 -65.85 -65.855 -65.86 -65.865 -65.87 -65.875 -65.88 -65.885 -65.89 -65.895 -65.9 -65.905 -65.91 -65.915 -65.92 -65.925 -65.93 -65.935 -65.94 -65.945 -65.95 -65.955 -65.96 -65.965 -65.97 -65.975 -65.98 -65.985 -65.99 -65.995 -66 -66.005 -66.01 -66.015 -66.02 -66.025 -66.03 -66.035 -66.04 -66.045 -66.05 -66.055 -66.06 -66.065 -66.07 -66.075 -66.08 -66.085 -66.09 -66.095 -66.1 -66.105 -66.11 -66.115 -66.12 -66.125 -66.13 -66.135 -66.14 -66.145 -66.15 -66.155 -66.16 -66.165 -66.17 -66.175 -66.18 -66.185 -66.19 -66.195 -66.2 -66.205 -66.21 -66.215 -66.22 -66.225 -66.23 -66.235 -66.24 -66.245 -66.25 -66.255 -66.26 -66.265 -66.27 -66.275 -66.28 -66.285 -66.29 -66.295 -66.3 -66.305 -66.31 -66.315 -66.32 -66.325 -66.33 -66.335 -66.34 -66.345 -66.35 -66.355 -66.36 -66.365 -66.37 -66.375 -66.38 -66.385 -66.39 -66.395 -66.4 -66.405 -66.41 -66.415 -66.42 -66.425 -66.43 -66.435 -66.44 -66.445 -66.45 -66.455 -66.46 -66.465 -66.47 -66.475 -66.48 -66.485 -66.49 -66.495 -66.5 -66.505 -66.51 -66.515 -66.52 -66.525 -66.53 -66.535 -66.54 -66.545 -66.55 -66.555 -66.56 -66.565 -66.57 -66.575 -66.58 -66.585 -66.59 -66.595 -66.6 -66.605 -66.61 -66.615 -66.62 -66.625 -66.63 -66.635 -66.64 -66.645 -66.65 -66.655 -66.66 -66.665 -66.67 -66.675 -66.68 -66.685 -66.69 -66.695 -66.7 -66.705 -66.71 -66.715 -66.72 -66.725 -66.73 -66.735 -66.74 -66.745 -66.75 -66.755 -66.76 -66.765 -66.77 -66.775 -66.78 -66.785 -66.79 -66.795 -66.8 -66.805 -66.81 -66.815 -66.82 -66.825 -66.83 -66.835 -66.84 -66.845 -66.85 -66.855 -66.86 -66.865 -66.87 -66.875 -66.88 -66.885 -66.89 -66.895 -66.9 -66.905 -66.91 -66.915 -66.92 -66.925 -66.93 -66.935 -66.94 -66.945 -66.95 -66.955 -66.96 -66.965 -66.97 -66.975 -66.98 -66.985 -66.99 -66.995 -67 -67.005 -67.01 -67.015 -67.02 -67.025 -67.03 -67.035 -67.04 -67.045 -67.05 -67.055 -67.06 -67.065 -67.07 -67.075 -67.08 -67.085 -67.09 -67.095 -67.1 -67.105 -67.11 -67.115 -67.12 -67.125 -67.13 -67.135 -67.14 -67.145 -67.15 -67.155 -67.16 -67.165 -67.17 -67.175 -67.18 -67.185 -67.19 -67.195 -67.2 -67.205 -67.21 -67.215 -67.22 -67.225 -67.23 -67.235 -67.24 -67.245 -67.25 -67.255 -67.26 -67.265 -67.27 -67.275 -67.28 -67.285 -67.29 -67.295 -67.3 -67.305 -67.31 -67.315 -67.32 -67.325 -67.33 -67.335 -67.34 -67.345 -67.35 -67.355 -67.36 -67.365 -67.37 -67.375 -67.38 -67.385 -67.39 -67.395 -67.4 -67.405 -67.41 -67.415 -67.42 -67.425 -67.43 -67.435 -67.44 -67.445 -67.45 -67.455 -67.46 -67.465 -67.47 -67.475 -67.48 -67.485 -67.49 -67.495 -67.5 -67.505 -67.51 -67.515 -67.52 -67.525 -67.53 -67.535 -67.54 -67.545 -67.55 -67.555 -67.56 -67.565 -67.57 -67.575 -67.58 -67.585 -67.59 -67.595 -67.6 -67.605 -67.61 -67.615 -67.62 -67.625 -67.63 -67.635 -67.64 -67.645 -67.65 -67.655 -67.66 -67.665 -67.67 -67.675 -67.68 -67.685 -67.69 -67.695 -67.7 -67.705 -67.71 -67.715 -67.72 -67.725 -67.73 -67.735 -67.74 -67.745 -67.75 -67.755 -67.76 -67.765 -67.77 -67.775 -67.78 -67.785 -67.79 -67.795 -67.8 -67.805 -67.81 -67.815 -67.82 -67.825 -67.83 -67.835 -67.84 -67.845 -67.85 -67.855 -67.86 -67.865 -67.87 -67.875 -67.88 -67.885 -67.89 -67.895 -67.9 -67.905 -67.91 -67.915 -67.92 -67.925 -67.93 -67.935 -67.94 -67.945 -67.95 -67.955 -67.96 -67.965 -67.97 -67.975 -67.98 -67.985 -67.99 -67.995 -68 -68.005 -68.01 -68.015 -68.02 -68.025 -68.03 -68.035 -68.04 -68.045 -68.05 -68.055 -68.06 -68.065 -68.07 -68.075 -68.08 -68.085 -68.09 -68.095 -68.1 -68.105 -68.11 -68.115 -68.12 -68.125 -68.13 -68.135 -68.14 -68.145 -68.15 -68.155 -68.16 -68.165 -68.17 -68.175 -68.18 -68.185 -68.19 -68.195 -68.2 -68.205 -68.21 -68.215 -68.22 -68.225 -68.23 -68.235 -68.24 -68.245 -68.25 -68.255 -68.26 -68.265 -68.27 -68.275 -68.28 -68.285 -68.29 -68.295 -68.3 -68.305 -68.31 -68.315 -68.32 -68.325 -68.33 -68.335 -68.34 -68.345 -68.35 -68.355 -68.36 -68.365 -68.37 -68.375 -68.38 -68.385 -68.39 -68.395 -68.4 -68.405 -68.41 -68.415 -68.42 -68.425 -68.43 -68.435 -68.44 -68.445 -68.45 -68.455 -68.46 -68.465 -68.47 -68.475 -68.48 -68.485 -68.49 -68.495 -68.5 -68.505 -68.51 -68.515 -68.52 -68.525 -68.53 -68.535 -68.54 -68.545 -68.55 -68.555 -68.56 -68.565 -68.57 -68.575 -68.58 -68.585 -68.59 -68.595 -68.6 -68.605 -68.61 -68.615 -68.62 -68.625 -68.63 -68.635 -68.64 -68.645 -68.65 -68.655 -68.66 -68.665 -68.67 -68.675 -68.68 -68.685 -68.69 -68.695 -68.7 -68.705 -68.71 -68.715 -68.72 -68.725 -68.73 -68.735 -68.74 -68.745 -68.75 -68.755 -68.76 -68.765 -68.77 -68.775 -68.78 -68.785 -68.79 -68.795 -68.8 -68.805 -68.81 -68.815 -68.82 -68.825 -68.83 -68.835 -68.84 -68.845 -68.85 -68.855 -68.86 -68.865 -68.87 -68.875 -68.88 -68.885 -68.89 -68.895 -68.9 -68.905 -68.91 -68.915 -68.92 -68.925 -68.93 -68.935 -68.94 -68.945 -68.95 -68.955 -68.96 -68.965 -68.97 -68.975 -68.98 -68.985 -68.99 -68.995 -69 -69.005 -69.01 -69.015 -69.02 -69.025 -69.03 -69.035 -69.04 -69.045 -69.05 -69.055 -69.06 -69.065 -69.07 -69.075 -69.08 -69.085 -69.09 -69.095 -69.1 -69.105 -69.11 -69.115 -69.12 -69.125 -69.13 -69.135 -69.14 -69.145 -69.15 -69.155 -69.16 -69.165 -69.17 -69.175 -69.18 -69.185 -69.19 -69.195 -69.2 -69.205 -69.21 -69.215 -69.22 -69.225 -69.23 -69.235 -69.24 -69.245 -69.25 -69.255 -69.26 -69.265 -69.27 -69.275 -69.28 -69.285 -69.29 -69.295 -69.3 -69.305 -69.31 -69.315 -69.32 -69.325 -69.33 -69.335 -69.34 -69.345 -69.35 -69.355 -69.36 -69.365 -69.37 -69.375 -69.38 -69.385 -69.39 -69.395 -69.4 -69.405 -69.41 -69.415 -69.42 -69.425 -69.43 -69.435 -69.44 -69.445 -69.45 -69.455 -69.46 -69.465 -69.47 -69.475 -69.48 -69.485 -69.49 -69.495 -69.5 -69.505 -69.51 -69.515 -69.52 -69.525 -69.53 -69.535 -69.54 -69.545 -69.55 -69.555 -69.56 -69.565 -69.57 -69.575 -69.58 -69.585 -69.59 -69.595 -69.6 -69.605 -69.61 -69.615 -69.62 -69.625 -69.63 -69.635 -69.64 -69.645 -69.65 -69.655 -69.66 -69.665 -69.67 -69.675 -69.68 -69.685 -69.69 -69.695 -69.7 -69.705 -69.71 -69.715 -69.72 -69.725 -69.73 -69.735 -69.74 -69.745 -69.75 -69.755 -69.76 -69.765 -69.77 -69.775 -69.78 -69.785 -69.79 -69.795 -69.8 -69.805 -69.81 -69.815 -69.82 -69.825 -69.83 -69.835 -69.84 -69.845 -69.85 -69.855 -69.86 -69.865 -69.87 -69.875 -69.88 -69.885 -69.89 -69.895 -69.9 -69.905 -69.91 -69.915 -69.92 -69.925 -69.93 -69.935 -69.94 -69.945 -69.95 -69.955 -69.96 -69.965 -69.97 -69.975 -69.98 -69.985 -69.99 -69.995 -70 -70.005 -70.01 -70.015 -70.02 -70.025 -70.03 -70.035 -70.04 -70.045 -70.05 -70.055 -70.06 -70.065 -70.07 -70.075 -70.08 -70.085 -70.09 -70.095 -70.1 -70.105 -70.11 -70.115 -70.12 -70.125 -70.13 -70.135 -70.14 -70.145 -70.15 -70.155 -70.16 -70.165 -70.17 -70.175 -70.18 -70.185 -70.19 -70.195 -70.2 -70.205 -70.21 -70.215 -70.22 -70.225 -70.23 -70.235 -70.24 -70.245 -70.25 -70.255 -70.26 -70.265 -70.27 -70.275 -70.28 -70.285 -70.29 -70.295 -70.3 -70.305 -70.31 -70.315 -70.32 -70.325 -70.33 -70.335 -70.34 -70.345 -70.35 -70.355 -70.36 -70.365 -70.37 -70.375 -70.38 -70.385 -70.39 -70.395 -70.4 -70.405 -70.41 -70.415 -70.42 -70.425 -70.43 -70.435 -70.44 -70.445 -70.45 -70.455 -70.46 -70.465 -70.47 -70.475 -70.48 -70.485 -70.49 -70.495 -70.5 -70.505 -70.51 -70.515 -70.52 -70.525 -70.53 -70.535 -70.54 -70.545 -70.55 -70.555 -70.56 -70.565 -70.57 -70.575 -70.58 -70.585 -70.59 -70.595 -70.6 -70.605 -70.61 -70.615 -70.62 -70.625 -70.63 -70.635 -70.64 -70.645 -70.65 -70.655 -70.66 -70.665 -70.67 -70.675 -70.68 -70.685 -70.69 -70.695 -70.7 -70.705 -70.71 -70.715 -70.72 -70.725 -70.73 -70.735 -70.74 -70.745 -70.75 -70.755 -70.76 -70.765 -70.77 -70.775 -70.78 -70.785 -70.79 -70.795 -70.8 -70.805 -70.81 -70.815 -70.82 -70.825 -70.83 -70.835 -70.84 -70.845 -70.85 -70.855 -70.86 -70.865 -70.87 -70.875 -70.88 -70.885 -70.89 -70.895 -70.9 -70.905 -70.91 -70.915 -70.92 -70.925 -70.93 -70.935 -70.94 -70.945 -70.95 -70.955 -70.96 -70.965 -70.97 -70.975 -70.98 -70.985 -70.99 -70.995 -71 -71.005 -71.01 -71.015 -71.02 -71.025 -71.03 -71.035 -71.04 -71.045 -71.05 -71.055 -71.06 -71.065 -71.07 -71.075 -71.08 -71.085 -71.09 -71.095 -71.1 -71.105 -71.11 -71.115 -71.12 -71.125 -71.13 -71.135 -71.14 -71.145 -71.15 -71.155 -71.16 -71.165 -71.17 -71.175 -71.18 -71.185 -71.19 -71.195 -71.2 -71.205 -71.21 -71.215 -71.22 -71.225 -71.23 -71.235 -71.24 -71.245 -71.25 -71.255 -71.26 -71.265 -71.27 -71.275 -71.28 -71.285 -71.29 -71.295 -71.3 -71.305 -71.31 -71.315 -71.32 -71.325 -71.33 -71.335 -71.34 -71.345 -71.35 -71.355 -71.36 -71.365 -71.37 -71.375 -71.38 -71.385 -71.39 -71.395 -71.4 -71.405 -71.41 -71.415 -71.42 -71.425 -71.43 -71.435 -71.44 -71.445 -71.45 -71.455 -71.46 -71.465 -71.47 -71.475 -71.48 -71.485 -71.49 -71.495 -71.5 -71.505 -71.51 -71.515 -71.52 -71.525 -71.53 -71.535 -71.54 -71.545 -71.55 -71.555 -71.56 -71.565 -71.57 -71.575 -71.58 -71.585 -71.59 -71.595 -71.6 -71.605 -71.61 -71.615 -71.62 -71.625 -71.63 -71.635 -71.64 -71.645 -71.65 -71.655 -71.66 -71.665 -71.67 -71.675 -71.68 -71.685 -71.69 -71.695 -71.7 -71.705 -71.71 -71.715 -71.72 -71.725 -71.73 -71.735 -71.74 -71.745 -71.75 -71.755 -71.76 -71.765 -71.77 -71.775 -71.78 -71.785 -71.79 -71.795 -71.8 -71.805 -71.81 -71.815 -71.82 -71.825 -71.83 -71.835 -71.84 -71.845 -71.85 -71.855 -71.86 -71.865 -71.87 -71.875 -71.88 -71.885 -71.89 -71.895 -71.9 -71.905 -71.91 -71.915 -71.92 -71.925 -71.93 -71.935 -71.94 -71.945 -71.95 -71.955 -71.96 -71.965 -71.97 -71.975 -71.98 -71.985 -71.99 -71.995 -72 -72.005 -72.01 -72.015 -72.02 -72.025 -72.03 -72.035 -72.04 -72.045 -72.05 -72.055 -72.06 -72.065 -72.07 -72.075 -72.08 -72.085 -72.09 -72.095 -72.1 -72.105 -72.11 -72.115 -72.12 -72.125 -72.13 -72.135 -72.14 -72.145 -72.15 -72.155 -72.16 -72.165 -72.17 -72.175 -72.18 -72.185 -72.19 -72.195 -72.2 -72.205 -72.21 -72.215 -72.22 -72.225 -72.23 -72.235 -72.24 -72.245 -72.25 -72.255 -72.26 -72.265 -72.27 -72.275 -72.28 -72.285 -72.29 -72.295 -72.3 -72.305 -72.31 -72.315 -72.32 -72.325 -72.33 -72.335 -72.34 -72.345 -72.35 -72.355 -72.36 -72.365 -72.37 -72.375 -72.38 -72.385 -72.39 -72.395 -72.4 -72.405 -72.41 -72.415 -72.42 -72.425 -72.43 -72.435 -72.44 -72.445 -72.45 -72.455 -72.46 -72.465 -72.47 -72.475 -72.48 -72.485 -72.49 -72.495 -72.5 -72.505 -72.51 -72.515 -72.52 -72.525 -72.53 -72.535 -72.54 -72.545 -72.55 -72.555 -72.56 -72.565 -72.57 -72.575 -72.58 -72.585 -72.59 -72.595 -72.6 -72.605 -72.61 -72.615 -72.62 -72.625 -72.63 -72.635 -72.64 -72.645 -72.65 -72.655 -72.66 -72.665 -72.67 -72.675 -72.68 -72.685 -72.69 -72.695 -72.7 -72.705 -72.71 -72.715 -72.72 -72.725 -72.73 -72.735 -72.74 -72.745 -72.75 -72.755 -72.76 -72.765 -72.77 -72.775 -72.78 -72.785 -72.79 -72.795 -72.8 -72.805 -72.81 -72.815 -72.82 -72.825 -72.83 -72.835 -72.84 -72.845 -72.85 -72.855 -72.86 -72.865 -72.87 -72.875 -72.88 -72.885 -72.89 -72.895 -72.9 -72.905 -72.91 -72.915 -72.92 -72.925 -72.93 -72.935 -72.94 -72.945 -72.95 -72.955 -72.96 -72.965 -72.97 -72.975 -72.98 -72.985 -72.99 -72.995 -73 -73.005 -73.01 -73.015 -73.02 -73.025 -73.03 -73.035 -73.04 -73.045 -73.05 -73.055 -73.06 -73.065 -73.07 -73.075 -73.08 -73.085 -73.09 -73.095 -73.1 -73.105 -73.11 -73.115 -73.12 -73.125 -73.13 -73.135 -73.14 -73.145 -73.15 -73.155 -73.16 -73.165 -73.17 -73.175 -73.18 -73.185 -73.19 -73.195 -73.2 -73.205 -73.21 -73.215 -73.22 -73.225 -73.23 -73.235 -73.24 -73.245 -73.25 -73.255 -73.26 -73.265 -73.27 -73.275 -73.28 -73.285 -73.29 -73.295 -73.3 -73.305 -73.31 -73.315 -73.32 -73.325 -73.33 -73.335 -73.34 -73.345 -73.35 -73.355 -73.36 -73.365 -73.37 -73.375 -73.38 -73.385 -73.39 -73.395 -73.4 -73.405 -73.41 -73.415 -73.42 -73.425 -73.43 -73.435 -73.44 -73.445 -73.45 -73.455 -73.46 -73.465 -73.47 -73.475 -73.48 -73.485 -73.49 -73.495 -73.5 -73.505 -73.51 -73.515 -73.52 -73.525 -73.53 -73.535 -73.54 -73.545 -73.55 -73.555 -73.56 -73.565 -73.57 -73.575 -73.58 -73.585 -73.59 -73.595 -73.6 -73.605 -73.61 -73.615 -73.62 -73.625 -73.63 -73.635 -73.64 -73.645 -73.65 -73.655 -73.66 -73.665 -73.67 -73.675 -73.68 -73.685 -73.69 -73.695 -73.7 -73.705 -73.71 -73.715 -73.72 -73.725 -73.73 -73.735 -73.74 -73.745 -73.75 -73.755 -73.76 -73.765 -73.77 -73.775 -73.78 -73.785 -73.79 -73.795 -73.8 -73.805 -73.81 -73.815 -73.82 -73.825 -73.83 -73.835 -73.84 -73.845 -73.85 -73.855 -73.86 -73.865 -73.87 -73.875 -73.88 -73.885 -73.89 -73.895 -73.9 -73.905 -73.91 -73.915 -73.92 -73.925 -73.93 -73.935 -73.94 -73.945 -73.95 -73.955 -73.96 -73.965 -73.97 -73.975 -73.98 -73.985 -73.99 -73.995 -74 -74.005 -74.01 -74.015 -74.02 -74.025 -74.03 -74.035 -74.04 -74.045 -74.05 -74.055 -74.06 -74.065 -74.07 -74.075 -74.08 -74.085 -74.09 -74.095 -74.1 -74.105 -74.11 -74.115 -74.12 -74.125 -74.13 -74.135 -74.14 -74.145 -74.15 -74.155 -74.16 -74.165 -74.17 -74.175 -74.18 -74.185 -74.19 -74.195 -74.2 -74.205 -74.21 -74.215 -74.22 -74.225 -74.23 -74.235 -74.24 -74.245 -74.25 -74.255 -74.26 -74.265 -74.27 -74.275 -74.28 -74.285 -74.29 -74.295 -74.3 -74.305 -74.31 -74.315 -74.32 -74.325 -74.33 -74.335 -74.34 -74.345 -74.35 -74.355 -74.36 -74.365 -74.37 -74.375 -74.38 -74.385 -74.39 -74.395 -74.4 -74.405 -74.41 -74.415 -74.42 -74.425 -74.43 -74.435 -74.44 -74.445 -74.45 -74.455 -74.46 -74.465 -74.47 -74.475 -74.48 -74.485 -74.49 -74.495 -74.5 -74.505 -74.51 -74.515 -74.52 -74.525 -74.53 -74.535 -74.54 -74.545 -74.55 -74.555 -74.56 -74.565 -74.57 -74.575 -74.58 -74.585 -74.59 -74.595 -74.6 -74.605 -74.61 -74.615 -74.62 -74.625 -74.63 -74.635 -74.64 -74.645 -74.65 -74.655 -74.66 -74.665 -74.67 -74.675 -74.68 -74.685 -74.69 -74.695 -74.7 -74.705 -74.71 -74.715 -74.72 -74.725 -74.73 -74.735 -74.74 -74.745 -74.75 -74.755 -74.76 -74.765 -74.77 -74.775 -74.78 -74.785 -74.79 -74.795 -74.8 -74.805 -74.81 -74.815 -74.82 -74.825 -74.83 -74.835 -74.84 -74.845 -74.85 -74.855 -74.86 -74.865 -74.87 -74.875 -74.88 -74.885 -74.89 -74.895 -74.9 -74.905 -74.91 -74.915 -74.92 -74.925 -74.93 -74.935 -74.94 -74.945 -74.95 -74.955 -74.96 -74.965 -74.97 -74.975 -74.98 -74.985 -74.99 -74.995 -75 -75.005 -75.01 -75.015 -75.02 -75.025 -75.03 -75.035 -75.04 -75.045 -75.05 -75.055 -75.06 -75.065 -75.07 -75.075 -75.08 -75.085 -75.09 -75.095 -75.1 -75.105 -75.11 -75.115 -75.12 -75.125 -75.13 -75.135 -75.14 -75.145 -75.15 -75.155 -75.16 -75.165 -75.17 -75.175 -75.18 -75.185 -75.19 -75.195 -75.2 -75.205 -75.21 -75.215 -75.22 -75.225 -75.23 -75.235 -75.24 -75.245 -75.25 -75.255 -75.26 -75.265 -75.27 -75.275 -75.28 -75.285 -75.29 -75.295 -75.3 -75.305 -75.31 -75.315 -75.32 -75.325 -75.33 -75.335 -75.34 -75.345 -75.35 -75.355 -75.36 -75.365 -75.37 -75.375 -75.38 -75.385 -75.39 -75.395 -75.4 -75.405 -75.41 -75.415 -75.42 -75.425 -75.43 -75.435 -75.44 -75.445 -75.45 -75.455 -75.46 -75.465 -75.47 -75.475 -75.48 -75.485 -75.49 -75.495 -75.5 -75.505 -75.51 -75.515 -75.52 -75.525 -75.53 -75.535 -75.54 -75.545 -75.55 -75.555 -75.56 -75.565 -75.57 -75.575 -75.58 -75.585 -75.59 -75.595 -75.6 -75.605 -75.61 -75.615 -75.62 -75.625 -75.63 -75.635 -75.64 -75.645 -75.65 -75.655 -75.66 -75.665 -75.67 -75.675 -75.68 -75.685 -75.69 -75.695 -75.7 -75.705 -75.71 -75.715 -75.72 -75.725 -75.73 -75.735 -75.74 -75.745 -75.75 -75.755 -75.76 -75.765 -75.77 -75.775 -75.78 -75.785 -75.79 -75.795 -75.8 -75.805 -75.81 -75.815 -75.82 -75.825 -75.83 -75.835 -75.84 -75.845 -75.85 -75.855 -75.86 -75.865 -75.87 -75.875 -75.88 -75.885 -75.89 -75.895 -75.9 -75.905 -75.91 -75.915 -75.92 -75.925 -75.93 -75.935 -75.94 -75.945 -75.95 -75.955 -75.96 -75.965 -75.97 -75.975 -75.98 -75.985 -75.99 -75.995 -76 -76.005 -76.01 -76.015 -76.02 -76.025 -76.03 -76.035 -76.04 -76.045 -76.05 -76.055 -76.06 -76.065 -76.07 -76.075 -76.08 -76.085 -76.09 -76.095 -76.1 -76.105 -76.11 -76.115 -76.12 -76.125 -76.13 -76.135 -76.14 -76.145 -76.15 -76.155 -76.16 -76.165 -76.17 -76.175 -76.18 -76.185 -76.19 -76.195 -76.2 -76.205 -76.21 -76.215 -76.22 -76.225 -76.23 -76.235 -76.24 -76.245 -76.25 -76.255 -76.26 -76.265 -76.27 -76.275 -76.28 -76.285 -76.29 -76.295 -76.3 -76.305 -76.31 -76.315 -76.32 -76.325 -76.33 -76.335 -76.34 -76.345 -76.35 -76.355 -76.36 -76.365 -76.37 -76.375 -76.38 -76.385 -76.39 -76.395 -76.4 -76.405 -76.41 -76.415 -76.42 -76.425 -76.43 -76.435 -76.44 -76.445 -76.45 -76.455 -76.46 -76.465 -76.47 -76.475 -76.48 -76.485 -76.49 -76.495 -76.5 -76.505 -76.51 -76.515 -76.52 -76.525 -76.53 -76.535 -76.54 -76.545 -76.55 -76.555 -76.56 -76.565 -76.57 -76.575 -76.58 -76.585 -76.59 -76.595 -76.6 -76.605 -76.61 -76.615 -76.62 -76.625 -76.63 -76.635 -76.64 -76.645 -76.65 -76.655 -76.66 -76.665 -76.67 -76.675 -76.68 -76.685 -76.69 -76.695 -76.7 -76.705 -76.71 -76.715 -76.72 -76.725 -76.73 -76.735 -76.74 -76.745 -76.75 -76.755 -76.76 -76.765 -76.77 -76.775 -76.78 -76.785 -76.79 -76.795 -76.8 -76.805 -76.81 -76.815 -76.82 -76.825 -76.83 -76.835 -76.84 -76.845 -76.85 -76.855 -76.86 -76.865 -76.87 -76.875 -76.88 -76.885 -76.89 -76.895 -76.9 -76.905 -76.91 -76.915 -76.92 -76.925 -76.93 -76.935 -76.94 -76.945 -76.95 -76.955 -76.96 -76.965 -76.97 -76.975 -76.98 -76.985 -76.99 -76.995 -77 -77.005 -77.01 -77.015 -77.02 -77.025 -77.03 -77.035 -77.04 -77.045 -77.05 -77.055 -77.06 -77.065 -77.07 -77.075 -77.08 -77.085 -77.09 -77.095 -77.1 -77.105 -77.11 -77.115 -77.12 -77.125 -77.13 -77.135 -77.14 -77.145 -77.15 -77.155 -77.16 -77.165 -77.17 -77.175 -77.18 -77.185 -77.19 -77.195 -77.2 -77.205 -77.21 -77.215 -77.22 -77.225 -77.23 -77.235 -77.24 -77.245 -77.25 -77.255 -77.26 -77.265 -77.27 -77.275 -77.28 -77.285 -77.29 -77.295 -77.3 -77.305 -77.31 -77.315 -77.32 -77.325 -77.33 -77.335 -77.34 -77.345 -77.35 -77.355 -77.36 -77.365 -77.37 -77.375 -77.38 -77.385 -77.39 -77.395 -77.4 -77.405 -77.41 -77.415 -77.42 -77.425 -77.43 -77.435 -77.44 -77.445 -77.45 -77.455 -77.46 -77.465 -77.47 -77.475 -77.48 -77.485 -77.49 -77.495 -77.5 -77.505 -77.51 -77.515 -77.52 -77.525 -77.53 -77.535 -77.54 -77.545 -77.55 -77.555 -77.56 -77.565 -77.57 -77.575 -77.58 -77.585 -77.59 -77.595 -77.6 -77.605 -77.61 -77.615 -77.62 -77.625 -77.63 -77.635 -77.64 -77.645 -77.65 -77.655 -77.66 -77.665 -77.67 -77.675 -77.68 -77.685 -77.69 -77.695 -77.7 -77.705 -77.71 -77.715 -77.72 -77.725 -77.73 -77.735 -77.74 -77.745 -77.75 -77.755 -77.76 -77.765 -77.77 -77.775 -77.78 -77.785 -77.79 -77.795 -77.8 -77.805 -77.81 -77.815 -77.82 -77.825 -77.83 -77.835 -77.84 -77.845 -77.85 -77.855 -77.86 -77.865 -77.87 -77.875 -77.88 -77.885 -77.89 -77.895 -77.9 -77.905 -77.91 -77.915 -77.92 -77.925 -77.93 -77.935 -77.94 -77.945 -77.95 -77.955 -77.96 -77.965 -77.97 -77.975 -77.98 -77.985 -77.99 -77.995 -78 -78.005 -78.01 -78.015 -78.02 -78.025 -78.03 -78.035 -78.04 -78.045 -78.05 -78.055 -78.06 -78.065 -78.07 -78.075 -78.08 -78.085 -78.09 -78.095 -78.1 -78.105 -78.11 -78.115 -78.12 -78.125 -78.13 -78.135 -78.14 -78.145 -78.15 -78.155 -78.16 -78.165 -78.17 -78.175 -78.18 -78.185 -78.19 -78.195 -78.2 -78.205 -78.21 -78.215 -78.22 -78.225 -78.23 -78.235 -78.24 -78.245 -78.25 -78.255 -78.26 -78.265 -78.27 -78.275 -78.28 -78.285 -78.29 -78.295 -78.3 -78.305 -78.31 -78.315 -78.32 -78.325 -78.33 -78.335 -78.34 -78.345 -78.35 -78.355 -78.36 -78.365 -78.37 -78.375 -78.38 -78.385 -78.39 -78.395 -78.4 -78.405 -78.41 -78.415 -78.42 -78.425 -78.43 -78.435 -78.44 -78.445 -78.45 -78.455 -78.46 -78.465 -78.47 -78.475 -78.48 -78.485 -78.49 -78.495 -78.5 -78.505 -78.51 -78.515 -78.52 -78.525 -78.53 -78.535 -78.54 -78.545 -78.55 -78.555 -78.56 -78.565 -78.57 -78.575 -78.58 -78.585 -78.59 -78.595 -78.6 -78.605 -78.61 -78.615 -78.62 -78.625 -78.63 -78.635 -78.64 -78.645 -78.65 -78.655 -78.66 -78.665 -78.67 -78.675 -78.68 -78.685 -78.69 -78.695 -78.7 -78.705 -78.71 -78.715 -78.72 -78.725 -78.73 -78.735 -78.74 -78.745 -78.75 -78.755 -78.76 -78.765 -78.77 -78.775 -78.78 -78.785 -78.79 -78.795 -78.8 -78.805 -78.81 -78.815 -78.82 -78.825 -78.83 -78.835 -78.84 -78.845 -78.85 -78.855 -78.86 -78.865 -78.87 -78.875 -78.88 -78.885 -78.89 -78.895 -78.9 -78.905 -78.91 -78.915 -78.92 -78.925 -78.93 -78.935 -78.94 -78.945 -78.95 -78.955 -78.96 -78.965 -78.97 -78.975 -78.98 -78.985 -78.99 -78.995 -79 -79.005 -79.01 -79.015 -79.02 -79.025 -79.03 -79.035 -79.04 -79.045 -79.05 -79.055 -79.06 -79.065 -79.07 -79.075 -79.08 -79.085 -79.09 -79.095 -79.1 -79.105 -79.11 -79.115 -79.12 -79.125 -79.13 -79.135 -79.14 -79.145 -79.15 -79.155 -79.16 -79.165 -79.17 -79.175 -79.18 -79.185 -79.19 -79.195 -79.2 -79.205 -79.21 -79.215 -79.22 -79.225 -79.23 -79.235 -79.24 -79.245 -79.25 -79.255 -79.26 -79.265 -79.27 -79.275 -79.28 -79.285 -79.29 -79.295 -79.3 -79.305 -79.31 -79.315 -79.32 -79.325 -79.33 -79.335 -79.34 -79.345 -79.35 -79.355 -79.36 -79.365 -79.37 -79.375 -79.38 -79.385 -79.39 -79.395 -79.4 -79.405 -79.41 -79.415 -79.42 -79.425 -79.43 -79.435 -79.44 -79.445 -79.45 -79.455 -79.46 -79.465 -79.47 -79.475 -79.48 -79.485 -79.49 -79.495 -79.5 -79.505 -79.51 -79.515 -79.52 -79.525 -79.53 -79.535 -79.54 -79.545 -79.55 -79.555 -79.56 -79.565 -79.57 -79.575 -79.58 -79.585 -79.59 -79.595 -79.6 -79.605 -79.61 -79.615 -79.62 -79.625 -79.63 -79.635 -79.64 -79.645 -79.65 -79.655 -79.66 -79.665 -79.67 -79.675 -79.68 -79.685 -79.69 -79.695 -79.7 -79.705 -79.71 -79.715 -79.72 -79.725 -79.73 -79.735 -79.74 -79.745 -79.75 -79.755 -79.76 -79.765 -79.77 -79.775 -79.78 -79.785 -79.79 -79.795 -79.8 -79.805 -79.81 -79.815 -79.82 -79.825 -79.83 -79.835 -79.84 -79.845 -79.85 -79.855 -79.86 -79.865 -79.87 -79.875 -79.88 -79.885 -79.89 -79.895 -79.9 -79.905 -79.91 -79.915 -79.92 -79.925 -79.93 -79.935 -79.94 -79.945 -79.95 -79.955 -79.96 -79.965 -79.97 -79.975 -79.98 -79.985 -79.99 -79.995 -80 -80.005 -80.01 -80.015 -80.02 -80.025 -80.03 -80.035 -80.04 -80.045 -80.05 -80.055 -80.06 -80.065 -80.07 -80.075 -80.08 -80.085 -80.09 -80.095 -80.1 -80.105 -80.11 -80.115 -80.12 -80.125 -80.13 -80.135 -80.14 -80.145 -80.15 -80.155 -80.16 -80.165 -80.17 -80.175 -80.18 -80.185 -80.19 -80.195 -80.2 -80.205 -80.21 -80.215 -80.22 -80.225 -80.23 -80.235 -80.24 -80.245 -80.25 -80.255 -80.26 -80.265 -80.27 -80.275 -80.28 -80.285 -80.29 -80.295 -80.3 -80.305 -80.31 -80.315 -80.32 -80.325 -80.33 -80.335 -80.34 -80.345 -80.35 -80.355 -80.36 -80.365 -80.37 -80.375 -80.38 -80.385 -80.39 -80.395 -80.4 -80.405 -80.41 -80.415 -80.42 -80.425 -80.43 -80.435 -80.44 -80.445 -80.45 -80.455 -80.46 -80.465 -80.47 -80.475 -80.48 -80.485 -80.49 -80.495 -80.5 -80.505 -80.51 -80.515 -80.52 -80.525 -80.53 -80.535 -80.54 -80.545 -80.55 -80.555 -80.56 -80.565 -80.57 -80.575 -80.58 -80.585 -80.59 -80.595 -80.6 -80.605 -80.61 -80.615 -80.62 -80.625 -80.63 -80.635 -80.64 -80.645 -80.65 -80.655 -80.66 -80.665 -80.67 -80.675 -80.68 -80.685 -80.69 -80.695 -80.7 -80.705 -80.71 -80.715 -80.72 -80.725 -80.73 -80.735 -80.74 -80.745 -80.75 -80.755 -80.76 -80.765 -80.77 -80.775 -80.78 -80.785 -80.79 -80.795 -80.8 -80.805 -80.81 -80.815 -80.82 -80.825 -80.83 -80.835 -80.84 -80.845 -80.85 -80.855 -80.86 -80.865 -80.87 -80.875 -80.88 -80.885 -80.89 -80.895 -80.9 -80.905 -80.91 -80.915 -80.92 -80.925 -80.93 -80.935 -80.94 -80.945 -80.95 -80.955 -80.96 -80.965 -80.97 -80.975 -80.98 -80.985 -80.99 -80.995 -81 -81.005 -81.01 -81.015 -81.02 -81.025 -81.03 -81.035 -81.04 -81.045 -81.05 -81.055 -81.06 -81.065 -81.07 -81.075 -81.08 -81.085 -81.09 -81.095 -81.1 -81.105 -81.11 -81.115 -81.12 -81.125 -81.13 -81.135 -81.14 -81.145 -81.15 -81.155 -81.16 -81.165 -81.17 -81.175 -81.18 -81.185 -81.19 -81.195 -81.2 -81.205 -81.21 -81.215 -81.22 -81.225 -81.23 -81.235 -81.24 -81.245 -81.25 -81.255 -81.26 -81.265 -81.27 -81.275 -81.28 -81.285 -81.29 -81.295 -81.3 -81.305 -81.31 -81.315 -81.32 -81.325 -81.33 -81.335 -81.34 -81.345 -81.35 -81.355 -81.36 -81.365 -81.37 -81.375 -81.38 -81.385 -81.39 -81.395 -81.4 -81.405 -81.41 -81.415 -81.42 -81.425 -81.43 -81.435 -81.44 -81.445 -81.45 -81.455 -81.46 -81.465 -81.47 -81.475 -81.48 -81.485 -81.49 -81.495 -81.5 -81.505 -81.51 -81.515 -81.52 -81.525 -81.53 -81.535 -81.54 -81.545 -81.55 -81.555 -81.56 -81.565 -81.57 -81.575 -81.58 -81.585 -81.59 -81.595 -81.6 -81.605 -81.61 -81.615 -81.62 -81.625 -81.63 -81.635 -81.64 -81.645 -81.65 -81.655 -81.66 -81.665 -81.67 -81.675 -81.68 -81.685 -81.69 -81.695 -81.7 -81.705 -81.71 -81.715 -81.72 -81.725 -81.73 -81.735 -81.74 -81.745 -81.75 -81.755 -81.76 -81.765 -81.77 -81.775 -81.78 -81.785 -81.79 -81.795 -81.8 -81.805 -81.81 -81.815 -81.82 -81.825 -81.83 -81.835 -81.84 -81.845 -81.85 -81.855 -81.86 -81.865 -81.87 -81.875 -81.88 -81.885 -81.89 -81.895 -81.9 -81.905 -81.91 -81.915 -81.92 -81.925 -81.93 -81.935 -81.94 -81.945 -81.95 -81.955 -81.96 -81.965 -81.97 -81.975 -81.98 -81.985 -81.99 -81.995 -82 -82.005 -82.01 -82.015 -82.02 -82.025 -82.03 -82.035 -82.04 -82.045 -82.05 -82.055 -82.06 -82.065 -82.07 -82.075 -82.08 -82.085 -82.09 -82.095 -82.1 -82.105 -82.11 -82.115 -82.12 -82.125 -82.13 -82.135 -82.14 -82.145 -82.15 -82.155 -82.16 -82.165 -82.17 -82.175 -82.18 -82.185 -82.19 -82.195 -82.2 -82.205 -82.21 -82.215 -82.22 -82.225 -82.23 -82.235 -82.24 -82.245 -82.25 -82.255 -82.26 -82.265 -82.27 -82.275 -82.28 -82.285 -82.29 -82.295 -82.3 -82.305 -82.31 -82.315 -82.32 -82.325 -82.33 -82.335 -82.34 -82.345 -82.35 -82.355 -82.36 -82.365 -82.37 -82.375 -82.38 -82.385 -82.39 -82.395 -82.4 -82.405 -82.41 -82.415 -82.42 -82.425 -82.43 -82.435 -82.44 -82.445 -82.45 -82.455 -82.46 -82.465 -82.47 -82.475 -82.48 -82.485 -82.49 -82.495 -82.5 -82.505 -82.51 -82.515 -82.52 -82.525 -82.53 -82.535 -82.54 -82.545 -82.55 -82.555 -82.56 -82.565 -82.57 -82.575 -82.58 -82.585 -82.59 -82.595 -82.6 -82.605 -82.61 -82.615 -82.62 -82.625 -82.63 -82.635 -82.64 -82.645 -82.65 -82.655 -82.66 -82.665 -82.67 -82.675 -82.68 -82.685 -82.69 -82.695 -82.7 -82.705 -82.71 -82.715 -82.72 -82.725 -82.73 -82.735 -82.74 -82.745 -82.75 -82.755 -82.76 -82.765 -82.77 -82.775 -82.78 -82.785 -82.79 -82.795 -82.8 -82.805 -82.81 -82.815 -82.82 -82.825 -82.83 -82.835 -82.84 -82.845 -82.85 -82.855 -82.86 -82.865 -82.87 -82.875 -82.88 -82.885 -82.89 -82.895 -82.9 -82.905 -82.91 -82.915 -82.92 -82.925 -82.93 -82.935 -82.94 -82.945 -82.95 -82.955 -82.96 -82.965 -82.97 -82.975 -82.98 -82.985 -82.99 -82.995 -83 -83.005 -83.01 -83.015 -83.02 -83.025 -83.03 -83.035 -83.04 -83.045 -83.05 -83.055 -83.06 -83.065 -83.07 -83.075 -83.08 -83.085 -83.09 -83.095 -83.1 -83.105 -83.11 -83.115 -83.12 -83.125 -83.13 -83.135 -83.14 -83.145 -83.15 -83.155 -83.16 -83.165 -83.17 -83.175 -83.18 -83.185 -83.19 -83.195 -83.2 -83.205 -83.21 -83.215 -83.22 -83.225 -83.23 -83.235 -83.24 -83.245 -83.25 -83.255 -83.26 -83.265 -83.27 -83.275 -83.28 -83.285 -83.29 -83.295 -83.3 -83.305 -83.31 -83.315 -83.32 -83.325 -83.33 -83.335 -83.34 -83.345 -83.35 -83.355 -83.36 -83.365 -83.37 -83.375 -83.38 -83.385 -83.39 -83.395 -83.4 -83.405 -83.41 -83.415 -83.42 -83.425 -83.43 -83.435 -83.44 -83.445 -83.45 -83.455 -83.46 -83.465 -83.47 -83.475 -83.48 -83.485 -83.49 -83.495 -83.5 -83.505 -83.51 -83.515 -83.52 -83.525 -83.53 -83.535 -83.54 -83.545 -83.55 -83.555 -83.56 -83.565 -83.57 -83.575 -83.58 -83.585 -83.59 -83.595 -83.6 -83.605 -83.61 -83.615 -83.62 -83.625 -83.63 -83.635 -83.64 -83.645 -83.65 -83.655 -83.66 -83.665 -83.67 -83.675 -83.68 -83.685 -83.69 -83.695 -83.7 -83.705 -83.71 -83.715 -83.72 -83.725 -83.73 -83.735 -83.74 -83.745 -83.75 -83.755 -83.76 -83.765 -83.77 -83.775 -83.78 -83.785 -83.79 -83.795 -83.8 -83.805 -83.81 -83.815 -83.82 -83.825 -83.83 -83.835 -83.84 -83.845 -83.85 -83.855 -83.86 -83.865 -83.87 -83.875 -83.88 -83.885 -83.89 -83.895 -83.9 -83.905 -83.91 -83.915 -83.92 -83.925 -83.93 -83.935 -83.94 -83.945 -83.95 -83.955 -83.96 -83.965 -83.97 -83.975 -83.98 -83.985 -83.99 -83.995 -84 -84.005 -84.01 -84.015 -84.02 -84.025 -84.03 -84.035 -84.04 -84.045 -84.05 -84.055 -84.06 -84.065 -84.07 -84.075 -84.08 -84.085 -84.09 -84.095 -84.1 -84.105 -84.11 -84.115 -84.12 -84.125 -84.13 -84.135 -84.14 -84.145 -84.15 -84.155 -84.16 -84.165 -84.17 -84.175 -84.18 -84.185 -84.19 -84.195 -84.2 -84.205 -84.21 -84.215 -84.22 -84.225 -84.23 -84.235 -84.24 -84.245 -84.25 -84.255 -84.26 -84.265 -84.27 -84.275 -84.28 -84.285 -84.29 -84.295 -84.3 -84.305 -84.31 -84.315 -84.32 -84.325 -84.33 -84.335 -84.34 -84.345 -84.35 -84.355 -84.36 -84.365 -84.37 -84.375 -84.38 -84.385 -84.39 -84.395 -84.4 -84.405 -84.41 -84.415 -84.42 -84.425 -84.43 -84.435 -84.44 -84.445 -84.45 -84.455 -84.46 -84.465 -84.47 -84.475 -84.48 -84.485 -84.49 -84.495 -84.5 -84.505 -84.51 -84.515 -84.52 -84.525 -84.53 -84.535 -84.54 -84.545 -84.55 -84.555 -84.56 -84.565 -84.57 -84.575 -84.58 -84.585 -84.59 -84.595 -84.6 -84.605 -84.61 -84.615 -84.62 -84.625 -84.63 -84.635 -84.64 -84.645 -84.65 -84.655 -84.66 -84.665 -84.67 -84.675 -84.68 -84.685 -84.69 -84.695 -84.7 -84.705 -84.71 -84.715 -84.72 -84.725 -84.73 -84.735 -84.74 -84.745 -84.75 -84.755 -84.76 -84.765 -84.77 -84.775 -84.78 -84.785 -84.79 -84.795 -84.8 -84.805 -84.81 -84.815 -84.82 -84.825 -84.83 -84.835 -84.84 -84.845 -84.85 -84.855 -84.86 -84.865 -84.87 -84.875 -84.88 -84.885 -84.89 -84.895 -84.9 -84.905 -84.91 -84.915 -84.92 -84.925 -84.93 -84.935 -84.94 -84.945 -84.95 -84.955 -84.96 -84.965 -84.97 -84.975 -84.98 -84.985 -84.99 -84.995 -85 -85.005 -85.01 -85.015 -85.02 -85.025 -85.03 -85.035 -85.04 -85.045 -85.05 -85.055 -85.06 -85.065 -85.07 -85.075 -85.08 -85.085 -85.09 -85.095 -85.1 -85.105 -85.11 -85.115 -85.12 -85.125 -85.13 -85.135 -85.14 -85.145 -85.15 -85.155 -85.16 -85.165 -85.17 -85.175 -85.18 -85.185 -85.19 -85.195 -85.2 -85.205 -85.21 -85.215 -85.22 -85.225 -85.23 -85.235 -85.24 -85.245 -85.25 -85.255 -85.26 -85.265 -85.27 -85.275 -85.28 -85.285 -85.29 -85.295 -85.3 -85.305 -85.31 -85.315 -85.32 -85.325 -85.33 -85.335 -85.34 -85.345 -85.35 -85.355 -85.36 -85.365 -85.37 -85.375 -85.38 -85.385 -85.39 -85.395 -85.4 -85.405 -85.41 -85.415 -85.42 -85.425 -85.43 -85.435 -85.44 -85.445 -85.45 -85.455 -85.46 -85.465 -85.47 -85.475 -85.48 -85.485 -85.49 -85.495 -85.5 -85.505 -85.51 -85.515 -85.52 -85.525 -85.53 -85.535 -85.54 -85.545 -85.55 -85.555 -85.56 -85.565 -85.57 -85.575 -85.58 -85.585 -85.59 -85.595 -85.6 -85.605 -85.61 -85.615 -85.62 -85.625 -85.63 -85.635 -85.64 -85.645 -85.65 -85.655 -85.66 -85.665 -85.67 -85.675 -85.68 -85.685 -85.69 -85.695 -85.7 -85.705 -85.71 -85.715 -85.72 -85.725 -85.73 -85.735 -85.74 -85.745 -85.75 -85.755 -85.76 -85.765 -85.77 -85.775 -85.78 -85.785 -85.79 -85.795 -85.8 -85.805 -85.81 -85.815 -85.82 -85.825 -85.83 -85.835 -85.84 -85.845 -85.85 -85.855 -85.86 -85.865 -85.87 -85.875 -85.88 -85.885 -85.89 -85.895 -85.9 -85.905 -85.91 -85.915 -85.92 -85.925 -85.93 -85.935 -85.94 -85.945 -85.95 -85.955 -85.96 -85.965 -85.97 -85.975 -85.98 -85.985 -85.99 -85.995 -86 -86.005 -86.01 -86.015 -86.02 -86.025 -86.03 -86.035 -86.04 -86.045 -86.05 -86.055 -86.06 -86.065 -86.07 -86.075 -86.08 -86.085 -86.09 -86.095 -86.1 -86.105 -86.11 -86.115 -86.12 -86.125 -86.13 -86.135 -86.14 -86.145 -86.15 -86.155 -86.16 -86.165 -86.17 -86.175 -86.18 -86.185 -86.19 -86.195 -86.2 -86.205 -86.21 -86.215 -86.22 -86.225 -86.23 -86.235 -86.24 -86.245 -86.25 -86.255 -86.26 -86.265 -86.27 -86.275 -86.28 -86.285 -86.29 -86.295 -86.3 -86.305 -86.31 -86.315 -86.32 -86.325 -86.33 -86.335 -86.34 -86.345 -86.35 -86.355 -86.36 -86.365 -86.37 -86.375 -86.38 -86.385 -86.39 -86.395 -86.4 -86.405 -86.41 -86.415 -86.42 -86.425 -86.43 -86.435 -86.44 -86.445 -86.45 -86.455 -86.46 -86.465 -86.47 -86.475 -86.48 -86.485 -86.49 -86.495 -86.5 -86.505 -86.51 -86.515 -86.52 -86.525 -86.53 -86.535 -86.54 -86.545 -86.55 -86.555 -86.56 -86.565 -86.57 -86.575 -86.58 -86.585 -86.59 -86.595 -86.6 -86.605 -86.61 -86.615 -86.62 -86.625 -86.63 -86.635 -86.64 -86.645 -86.65 -86.655 -86.66 -86.665 -86.67 -86.675 -86.68 -86.685 -86.69 -86.695 -86.7 -86.705 -86.71 -86.715 -86.72 -86.725 -86.73 -86.735 -86.74 -86.745 -86.75 -86.755 -86.76 -86.765 -86.77 -86.775 -86.78 -86.785 -86.79 -86.795 -86.8 -86.805 -86.81 -86.815 -86.82 -86.825 -86.83 -86.835 -86.84 -86.845 -86.85 -86.855 -86.86 -86.865 -86.87 -86.875 -86.88 -86.885 -86.89 -86.895 -86.9 -86.905 -86.91 -86.915 -86.92 -86.925 -86.93 -86.935 -86.94 -86.945 -86.95 -86.955 -86.96 -86.965 -86.97 -86.975 -86.98 -86.985 -86.99 -86.995 -87 -87.005 -87.01 -87.015 -87.02 -87.025 -87.03 -87.035 -87.04 -87.045 -87.05 -87.055 -87.06 -87.065 -87.07 -87.075 -87.08 -87.085 -87.09 -87.095 -87.1 -87.105 -87.11 -87.115 -87.12 -87.125 -87.13 -87.135 -87.14 -87.145 -87.15 -87.155 -87.16 -87.165 -87.17 -87.175 -87.18 -87.185 -87.19 -87.195 -87.2 -87.205 -87.21 -87.215 -87.22 -87.225 -87.23 -87.235 -87.24 -87.245 -87.25 -87.255 -87.26 -87.265 -87.27 -87.275 -87.28 -87.285 -87.29 -87.295 -87.3 -87.305 -87.31 -87.315 -87.32 -87.325 -87.33 -87.335 -87.34 -87.345 -87.35 -87.355 -87.36 -87.365 -87.37 -87.375 -87.38 -87.385 -87.39 -87.395 -87.4 -87.405 -87.41 -87.415 -87.42 -87.425 -87.43 -87.435 -87.44 -87.445 -87.45 -87.455 -87.46 -87.465 -87.47 -87.475 -87.48 -87.485 -87.49 -87.495 -87.5 -87.505 -87.51 -87.515 -87.52 -87.525 -87.53 -87.535 -87.54 -87.545 -87.55 -87.555 -87.56 -87.565 -87.57 -87.575 -87.58 -87.585 -87.59 -87.595 -87.6 -87.605 -87.61 -87.615 -87.62 -87.625 -87.63 -87.635 -87.64 -87.645 -87.65 -87.655 -87.66 -87.665 -87.67 -87.675 -87.68 -87.685 -87.69 -87.695 -87.7 -87.705 -87.71 -87.715 -87.72 -87.725 -87.73 -87.735 -87.74 -87.745 -87.75 -87.755 -87.76 -87.765 -87.77 -87.775 -87.78 -87.785 -87.79 -87.795 -87.8 -87.805 -87.81 -87.815 -87.82 -87.825 -87.83 -87.835 -87.84 -87.845 -87.85 -87.855 -87.86 -87.865 -87.87 -87.875 -87.88 -87.885 -87.89 -87.895 -87.9 -87.905 -87.91 -87.915 -87.92 -87.925 -87.93 -87.935 -87.94 -87.945 -87.95 -87.955 -87.96 -87.965 -87.97 -87.975 -87.98 -87.985 -87.99 -87.995 -88 -88.005 -88.01 -88.015 -88.02 -88.025 -88.03 -88.035 -88.04 -88.045 -88.05 -88.055 -88.06 -88.065 -88.07 -88.075 -88.08 -88.085 -88.09 -88.095 -88.1 -88.105 -88.11 -88.115 -88.12 -88.125 -88.13 -88.135 -88.14 -88.145 -88.15 -88.155 -88.16 -88.165 -88.17 -88.175 -88.18 -88.185 -88.19 -88.195 -88.2 -88.205 -88.21 -88.215 -88.22 -88.225 -88.23 -88.235 -88.24 -88.245 -88.25 -88.255 -88.26 -88.265 -88.27 -88.275 -88.28 -88.285 -88.29 -88.295 -88.3 -88.305 -88.31 -88.315 -88.32 -88.325 -88.33 -88.335 -88.34 -88.345 -88.35 -88.355 -88.36 -88.365 -88.37 -88.375 -88.38 -88.385 -88.39 -88.395 -88.4 -88.405 -88.41 -88.415 -88.42 -88.425 -88.43 -88.435 -88.44 -88.445 -88.45 -88.455 -88.46 -88.465 -88.47 -88.475 -88.48 -88.485 -88.49 -88.495 -88.5 -88.505 -88.51 -88.515 -88.52 -88.525 -88.53 -88.535 -88.54 -88.545 -88.55 -88.555 -88.56 -88.565 -88.57 -88.575 -88.58 -88.585 -88.59 -88.595 -88.6 -88.605 -88.61 -88.615 -88.62 -88.625 -88.63 -88.635 -88.64 -88.645 -88.65 -88.655 -88.66 -88.665 -88.67 -88.675 -88.68 -88.685 -88.69 -88.695 -88.7 -88.705 -88.71 -88.715 -88.72 -88.725 -88.73 -88.735 -88.74 -88.745 -88.75 -88.755 -88.76 -88.765 -88.77 -88.775 -88.78 -88.785 -88.79 -88.795 -88.8 -88.805 -88.81 -88.815 -88.82 -88.825 -88.83 -88.835 -88.84 -88.845 -88.85 -88.855 -88.86 -88.865 -88.87 -88.875 -88.88 -88.885 -88.89 -88.895 -88.9 -88.905 -88.91 -88.915 -88.92 -88.925 -88.93 -88.935 -88.94 -88.945 -88.95 -88.955 -88.96 -88.965 -88.97 -88.975 -88.98 -88.985 -88.99 -88.995 -89 -89.005 -89.01 -89.015 -89.02 -89.025 -89.03 -89.035 -89.04 -89.045 -89.05 -89.055 -89.06 -89.065 -89.07 -89.075 -89.08 -89.085 -89.09 -89.095 -89.1 -89.105 -89.11 -89.115 -89.12 -89.125 -89.13 -89.135 -89.14 -89.145 -89.15 -89.155 -89.16 -89.165 -89.17 -89.175 -89.18 -89.185 -89.19 -89.195 -89.2 -89.205 -89.21 -89.215 -89.22 -89.225 -89.23 -89.235 -89.24 -89.245 -89.25 -89.255 -89.26 -89.265 -89.27 -89.275 -89.28 -89.285 -89.29 -89.295 -89.3 -89.305 -89.31 -89.315 -89.32 -89.325 -89.33 -89.335 -89.34 -89.345 -89.35 -89.355 -89.36 -89.365 -89.37 -89.375 -89.38 -89.385 -89.39 -89.395 -89.4 -89.405 -89.41 -89.415 -89.42 -89.425 -89.43 -89.435 -89.44 -89.445 -89.45 -89.455 -89.46 -89.465 -89.47 -89.475 -89.48 -89.485 -89.49 -89.495 -89.5 -89.505 -89.51 -89.515 -89.52 -89.525 -89.53 -89.535 -89.54 -89.545 -89.55 -89.555 -89.56 -89.565 -89.57 -89.575 -89.58 -89.585 -89.59 -89.595 -89.6 -89.605 -89.61 -89.615 -89.62 -89.625 -89.63 -89.635 -89.64 -89.645 -89.65 -89.655 -89.66 -89.665 -89.67 -89.675 -89.68 -89.685 -89.69 -89.695 -89.7 -89.705 -89.71 -89.715 -89.72 -89.725 -89.73 -89.735 -89.74 -89.745 -89.75 -89.755 -89.76 -89.765 -89.77 -89.775 -89.78 -89.785 -89.79 -89.795 -89.8 -89.805 -89.81 -89.815 -89.82 -89.825 -89.83 -89.835 -89.84 -89.845 -89.85 -89.855 -89.86 -89.865 -89.87 -89.875 -89.88 -89.885 -89.89 -89.895 -89.9 -89.905 -89.91 -89.915 -89.92 -89.925 -89.93 -89.935 -89.94 -89.945 -89.95 -89.955 -89.96 -89.965 -89.97 -89.975 -89.98 -89.985 -89.99 -89.995 -90 -90.005 -90.01 -90.015 -90.02 -90.025 -90.03 -90.035 -90.04 -90.045 -90.05 -90.055 -90.06 -90.065 -90.07 -90.075 -90.08 -90.085 -90.09 -90.095 -90.1 -90.105 -90.11 -90.115 -90.12 -90.125 -90.13 -90.135 -90.14 -90.145 -90.15 -90.155 -90.16 -90.165 -90.17 -90.175 -90.18 -90.185 -90.19 -90.195 -90.2 -90.205 -90.21 -90.215 -90.22 -90.225 -90.23 -90.235 -90.24 -90.245 -90.25 -90.255 -90.26 -90.265 -90.27 -90.275 -90.28 -90.285 -90.29 -90.295 -90.3 -90.305 -90.31 -90.315 -90.32 -90.325 -90.33 -90.335 -90.34 -90.345 -90.35 -90.355 -90.36 -90.365 -90.37 -90.375 -90.38 -90.385 -90.39 -90.395 -90.4 -90.405 -90.41 -90.415 -90.42 -90.425 -90.43 -90.435 -90.44 -90.445 -90.45 -90.455 -90.46 -90.465 -90.47 -90.475 -90.48 -90.485 -90.49 -90.495 -90.5 -90.505 -90.51 -90.515 -90.52 -90.525 -90.53 -90.535 -90.54 -90.545 -90.55 -90.555 -90.56 -90.565 -90.57 -90.575 -90.58 -90.585 -90.59 -90.595 -90.6 -90.605 -90.61 -90.615 -90.62 -90.625 -90.63 -90.635 -90.64 -90.645 -90.65 -90.655 -90.66 -90.665 -90.67 -90.675 -90.68 -90.685 -90.69 -90.695 -90.7 -90.705 -90.71 -90.715 -90.72 -90.725 -90.73 -90.735 -90.74 -90.745 -90.75 -90.755 -90.76 -90.765 -90.77 -90.775 -90.78 -90.785 -90.79 -90.795 -90.8 -90.805 -90.81 -90.815 -90.82 -90.825 -90.83 -90.835 -90.84 -90.845 -90.85 -90.855 -90.86 -90.865 -90.87 -90.875 -90.88 -90.885 -90.89 -90.895 -90.9 -90.905 -90.91 -90.915 -90.92 -90.925 -90.93 -90.935 -90.94 -90.945 -90.95 -90.955 -90.96 -90.965 -90.97 -90.975 -90.98 -90.985 -90.99 -90.995 -91 -91.005 -91.01 -91.015 -91.02 -91.025 -91.03 -91.035 -91.04 -91.045 -91.05 -91.055 -91.06 -91.065 -91.07 -91.075 -91.08 -91.085 -91.09 -91.095 -91.1 -91.105 -91.11 -91.115 -91.12 -91.125 -91.13 -91.135 -91.14 -91.145 -91.15 -91.155 -91.16 -91.165 -91.17 -91.175 -91.18 -91.185 -91.19 -91.195 -91.2 -91.205 -91.21 -91.215 -91.22 -91.225 -91.23 -91.235 -91.24 -91.245 -91.25 -91.255 -91.26 -91.265 -91.27 -91.275 -91.28 -91.285 -91.29 -91.295 -91.3 -91.305 -91.31 -91.315 -91.32 -91.325 -91.33 -91.335 -91.34 -91.345 -91.35 -91.355 -91.36 -91.365 -91.37 -91.375 -91.38 -91.385 -91.39 -91.395 -91.4 -91.405 -91.41 -91.415 -91.42 -91.425 -91.43 -91.435 -91.44 -91.445 -91.45 -91.455 -91.46 -91.465 -91.47 -91.475 -91.48 -91.485 -91.49 -91.495 -91.5 -91.505 -91.51 -91.515 -91.52 -91.525 -91.53 -91.535 -91.54 -91.545 -91.55 -91.555 -91.56 -91.565 -91.57 -91.575 -91.58 -91.585 -91.59 -91.595 -91.6 -91.605 -91.61 -91.615 -91.62 -91.625 -91.63 -91.635 -91.64 -91.645 -91.65 -91.655 -91.66 -91.665 -91.67 -91.675 -91.68 -91.685 -91.69 -91.695 -91.7 -91.705 -91.71 -91.715 -91.72 -91.725 -91.73 -91.735 -91.74 -91.745 -91.75 -91.755 -91.76 -91.765 -91.77 -91.775 -91.78 -91.785 -91.79 -91.795 -91.8 -91.805 -91.81 -91.815 -91.82 -91.825 -91.83 -91.835 -91.84 -91.845 -91.85 -91.855 -91.86 -91.865 -91.87 -91.875 -91.88 -91.885 -91.89 -91.895 -91.9 -91.905 -91.91 -91.915 -91.92 -91.925 -91.93 -91.935 -91.94 -91.945 -91.95 -91.955 -91.96 -91.965 -91.97 -91.975 -91.98 -91.985 -91.99 -91.995 -92 -92.005 -92.01 -92.015 -92.02 -92.025 -92.03 -92.035 -92.04 -92.045 -92.05 -92.055 -92.06 -92.065 -92.07 -92.075 -92.08 -92.085 -92.09 -92.095 -92.1 -92.105 -92.11 -92.115 -92.12 -92.125 -92.13 -92.135 -92.14 -92.145 -92.15 -92.155 -92.16 -92.165 -92.17 -92.175 -92.18 -92.185 -92.19 -92.195 -92.2 -92.205 -92.21 -92.215 -92.22 -92.225 -92.23 -92.235 -92.24 -92.245 -92.25 -92.255 -92.26 -92.265 -92.27 -92.275 -92.28 -92.285 -92.29 -92.295 -92.3 -92.305 -92.31 -92.315 -92.32 -92.325 -92.33 -92.335 -92.34 -92.345 -92.35 -92.355 -92.36 -92.365 -92.37 -92.375 -92.38 -92.385 -92.39 -92.395 -92.4 -92.405 -92.41 -92.415 -92.42 -92.425 -92.43 -92.435 -92.44 -92.445 -92.45 -92.455 -92.46 -92.465 -92.47 -92.475 -92.48 -92.485 -92.49 -92.495 -92.5 -92.505 -92.51 -92.515 -92.52 -92.525 -92.53 -92.535 -92.54 -92.545 -92.55 -92.555 -92.56 -92.565 -92.57 -92.575 -92.58 -92.585 -92.59 -92.595 -92.6 -92.605 -92.61 -92.615 -92.62 -92.625 -92.63 -92.635 -92.64 -92.645 -92.65 -92.655 -92.66 -92.665 -92.67 -92.675 -92.68 -92.685 -92.69 -92.695 -92.7 -92.705 -92.71 -92.715 -92.72 -92.725 -92.73 -92.735 -92.74 -92.745 -92.75 -92.755 -92.76 -92.765 -92.77 -92.775 -92.78 -92.785 -92.79 -92.795 -92.8 -92.805 -92.81 -92.815 -92.82 -92.825 -92.83 -92.835 -92.84 -92.845 -92.85 -92.855 -92.86 -92.865 -92.87 -92.875 -92.88 -92.885 -92.89 -92.895 -92.9 -92.905 -92.91 -92.915 -92.92 -92.925 -92.93 -92.935 -92.94 -92.945 -92.95 -92.955 -92.96 -92.965 -92.97 -92.975 -92.98 -92.985 -92.99 -92.995 -93 -93.005 -93.01 -93.015 -93.02 -93.025 -93.03 -93.035 -93.04 -93.045 -93.05 -93.055 -93.06 -93.065 -93.07 -93.075 -93.08 -93.085 -93.09 -93.095 -93.1 -93.105 -93.11 -93.115 -93.12 -93.125 -93.13 -93.135 -93.14 -93.145 -93.15 -93.155 -93.16 -93.165 -93.17 -93.175 -93.18 -93.185 -93.19 -93.195 -93.2 -93.205 -93.21 -93.215 -93.22 -93.225 -93.23 -93.235 -93.24 -93.245 -93.25 -93.255 -93.26 -93.265 -93.27 -93.275 -93.28 -93.285 -93.29 -93.295 -93.3 -93.305 -93.31 -93.315 -93.32 -93.325 -93.33 -93.335 -93.34 -93.345 -93.35 -93.355 -93.36 -93.365 -93.37 -93.375 -93.38 -93.385 -93.39 -93.395 -93.4 -93.405 -93.41 -93.415 -93.42 -93.425 -93.43 -93.435 -93.44 -93.445 -93.45 -93.455 -93.46 -93.465 -93.47 -93.475 -93.48 -93.485 -93.49 -93.495 -93.5 -93.505 -93.51 -93.515 -93.52 -93.525 -93.53 -93.535 -93.54 -93.545 -93.55 -93.555 -93.56 -93.565 -93.57 -93.575 -93.58 -93.585 -93.59 -93.595 -93.6 -93.605 -93.61 -93.615 -93.62 -93.625 -93.63 -93.635 -93.64 -93.645 -93.65 -93.655 -93.66 -93.665 -93.67 -93.675 -93.68 -93.685 -93.69 -93.695 -93.7 -93.705 -93.71 -93.715 -93.72 -93.725 -93.73 -93.735 -93.74 -93.745 -93.75 -93.755 -93.76 -93.765 -93.77 -93.775 -93.78 -93.785 -93.79 -93.795 -93.8 -93.805 -93.81 -93.815 -93.82 -93.825 -93.83 -93.835 -93.84 -93.845 -93.85 -93.855 -93.86 -93.865 -93.87 -93.875 -93.88 -93.885 -93.89 -93.895 -93.9 -93.905 -93.91 -93.915 -93.92 -93.925 -93.93 -93.935 -93.94 -93.945 -93.95 -93.955 -93.96 -93.965 -93.97 -93.975 -93.98 -93.985 -93.99 -93.995 -94 -94.005 -94.01 -94.015 -94.02 -94.025 -94.03 -94.035 -94.04 -94.045 -94.05 -94.055 -94.06 -94.065 -94.07 -94.075 -94.08 -94.085 -94.09 -94.095 -94.1 -94.105 -94.11 -94.115 -94.12 -94.125 -94.13 -94.135 -94.14 -94.145 -94.15 -94.155 -94.16 -94.165 -94.17 -94.175 -94.18 -94.185 -94.19 -94.195 -94.2 -94.205 -94.21 -94.215 -94.22 -94.225 -94.23 -94.235 -94.24 -94.245 -94.25 -94.255 -94.26 -94.265 -94.27 -94.275 -94.28 -94.285 -94.29 -94.295 -94.3 -94.305 -94.31 -94.315 -94.32 -94.325 -94.33 -94.335 -94.34 -94.345 -94.35 -94.355 -94.36 -94.365 -94.37 -94.375 -94.38 -94.385 -94.39 -94.395 -94.4 -94.405 -94.41 -94.415 -94.42 -94.425 -94.43 -94.435 -94.44 -94.445 -94.45 -94.455 -94.46 -94.465 -94.47 -94.475 -94.48 -94.485 -94.49 -94.495 -94.5 -94.505 -94.51 -94.515 -94.52 -94.525 -94.53 -94.535 -94.54 -94.545 -94.55 -94.555 -94.56 -94.565 -94.57 -94.575 -94.58 -94.585 -94.59 -94.595 -94.6 -94.605 -94.61 -94.615 -94.62 -94.625 -94.63 -94.635 -94.64 -94.645 -94.65 -94.655 -94.66 -94.665 -94.67 -94.675 -94.68 -94.685 -94.69 -94.695 -94.7 -94.705 -94.71 -94.715 -94.72 -94.725 -94.73 -94.735 -94.74 -94.745 -94.75 -94.755 -94.76 -94.765 -94.77 -94.775 -94.78 -94.785 -94.79 -94.795 -94.8 -94.805 -94.81 -94.815 -94.82 -94.825 -94.83 -94.835 -94.84 -94.845 -94.85 -94.855 -94.86 -94.865 -94.87 -94.875 -94.88 -94.885 -94.89 -94.895 -94.9 -94.905 -94.91 -94.915 -94.92 -94.925 -94.93 -94.935 -94.94 -94.945 -94.95 -94.955 -94.96 -94.965 -94.97 -94.975 -94.98 -94.985 -94.99 -94.995 -95 -95.005 -95.01 -95.015 -95.02 -95.025 -95.03 -95.035 -95.04 -95.045 -95.05 -95.055 -95.06 -95.065 -95.07 -95.075 -95.08 -95.085 -95.09 -95.095 -95.1 -95.105 -95.11 -95.115 -95.12 -95.125 -95.13 -95.135 -95.14 -95.145 -95.15 -95.155 -95.16 -95.165 -95.17 -95.175 -95.18 -95.185 -95.19 -95.195 -95.2 -95.205 -95.21 -95.215 -95.22 -95.225 -95.23 -95.235 -95.24 -95.245 -95.25 -95.255 -95.26 -95.265 -95.27 -95.275 -95.28 -95.285 -95.29 -95.295 -95.3 -95.305 -95.31 -95.315 -95.32 -95.325 -95.33 -95.335 -95.34 -95.345 -95.35 -95.355 -95.36 -95.365 -95.37 -95.375 -95.38 -95.385 -95.39 -95.395 -95.4 -95.405 -95.41 -95.415 -95.42 -95.425 -95.43 -95.435 -95.44 -95.445 -95.45 -95.455 -95.46 -95.465 -95.47 -95.475 -95.48 -95.485 -95.49 -95.495 -95.5 -95.505 -95.51 -95.515 -95.52 -95.525 -95.53 -95.535 -95.54 -95.545 -95.55 -95.555 -95.56 -95.565 -95.57 -95.575 -95.58 -95.585 -95.59 -95.595 -95.6 -95.605 -95.61 -95.615 -95.62 -95.625 -95.63 -95.635 -95.64 -95.645 -95.65 -95.655 -95.66 -95.665 -95.67 -95.675 -95.68 -95.685 -95.69 -95.695 -95.7 -95.705 -95.71 -95.715 -95.72 -95.725 -95.73 -95.735 -95.74 -95.745 -95.75 -95.755 -95.76 -95.765 -95.77 -95.775 -95.78 -95.785 -95.79 -95.795 -95.8 -95.805 -95.81 -95.815 -95.82 -95.825 -95.83 -95.835 -95.84 -95.845 -95.85 -95.855 -95.86 -95.865 -95.87 -95.875 -95.88 -95.885 -95.89 -95.895 -95.9 -95.905 -95.91 -95.915 -95.92 -95.925 -95.93 -95.935 -95.94 -95.945 -95.95 -95.955 -95.96 -95.965 -95.97 -95.975 -95.98 -95.985 -95.99 -95.995 -96 -96.005 -96.01 -96.015 -96.02 -96.025 -96.03 -96.035 -96.04 -96.045 -96.05 -96.055 -96.06 -96.065 -96.07 -96.075 -96.08 -96.085 -96.09 -96.095 -96.1 -96.105 -96.11 -96.115 -96.12 -96.125 -96.13 -96.135 -96.14 -96.145 -96.15 -96.155 -96.16 -96.165 -96.17 -96.175 -96.18 -96.185 -96.19 -96.195 -96.2 -96.205 -96.21 -96.215 -96.22 -96.225 -96.23 -96.235 -96.24 -96.245 -96.25 -96.255 -96.26 -96.265 -96.27 -96.275 -96.28 -96.285 -96.29 -96.295 -96.3 -96.305 -96.31 -96.315 -96.32 -96.325 -96.33 -96.335 -96.34 -96.345 -96.35 -96.355 -96.36 -96.365 -96.37 -96.375 -96.38 -96.385 -96.39 -96.395 -96.4 -96.405 -96.41 -96.415 -96.42 -96.425 -96.43 -96.435 -96.44 -96.445 -96.45 -96.455 -96.46 -96.465 -96.47 -96.475 -96.48 -96.485 -96.49 -96.495 -96.5 -96.505 -96.51 -96.515 -96.52 -96.525 -96.53 -96.535 -96.54 -96.545 -96.55 -96.555 -96.56 -96.565 -96.57 -96.575 -96.58 -96.585 -96.59 -96.595 -96.6 -96.605 -96.61 -96.615 -96.62 -96.625 -96.63 -96.635 -96.64 -96.645 -96.65 -96.655 -96.66 -96.665 -96.67 -96.675 -96.68 -96.685 -96.69 -96.695 -96.7 -96.705 -96.71 -96.715 -96.72 -96.725 -96.73 -96.735 -96.74 -96.745 -96.75 -96.755 -96.76 -96.765 -96.77 -96.775 -96.78 -96.785 -96.79 -96.795 -96.8 -96.805 -96.81 -96.815 -96.82 -96.825 -96.83 -96.835 -96.84 -96.845 -96.85 -96.855 -96.86 -96.865 -96.87 -96.875 -96.88 -96.885 -96.89 -96.895 -96.9 -96.905 -96.91 -96.915 -96.92 -96.925 -96.93 -96.935 -96.94 -96.945 -96.95 -96.955 -96.96 -96.965 -96.97 -96.975 -96.98 -96.985 -96.99 -96.995 -97 -97.005 -97.01 -97.015 -97.02 -97.025 -97.03 -97.035 -97.04 -97.045 -97.05 -97.055 -97.06 -97.065 -97.07 -97.075 -97.08 -97.085 -97.09 -97.095 -97.1 -97.105 -97.11 -97.115 -97.12 -97.125 -97.13 -97.135 -97.14 -97.145 -97.15 -97.155 -97.16 -97.165 -97.17 -97.175 -97.18 -97.185 -97.19 -97.195 -97.2 -97.205 -97.21 -97.215 -97.22 -97.225 -97.23 -97.235 -97.24 -97.245 -97.25 -97.255 -97.26 -97.265 -97.27 -97.275 -97.28 -97.285 -97.29 -97.295 -97.3 -97.305 -97.31 -97.315 -97.32 -97.325 -97.33 -97.335 -97.34 -97.345 -97.35 -97.355 -97.36 -97.365 -97.37 -97.375 -97.38 -97.385 -97.39 -97.395 -97.4 -97.405 -97.41 -97.415 -97.42 -97.425 -97.43 -97.435 -97.44 -97.445 -97.45 -97.455 -97.46 -97.465 -97.47 -97.475 -97.48 -97.485 -97.49 -97.495 -97.5 -97.505 -97.51 -97.515 -97.52 -97.525 -97.53 -97.535 -97.54 -97.545 -97.55 -97.555 -97.56 -97.565 -97.57 -97.575 -97.58 -97.585 -97.59 -97.595 -97.6 -97.605 -97.61 -97.615 -97.62 -97.625 -97.63 -97.635 -97.64 -97.645 -97.65 -97.655 -97.66 -97.665 -97.67 -97.675 -97.68 -97.685 -97.69 -97.695 -97.7 -97.705 -97.71 -97.715 -97.72 -97.725 -97.73 -97.735 -97.74 -97.745 -97.75 -97.755 -97.76 -97.765 -97.77 -97.775 -97.78 -97.785 -97.79 -97.795 -97.8 -97.805 -97.81 -97.815 -97.82 -97.825 -97.83 -97.835 -97.84 -97.845 -97.85 -97.855 -97.86 -97.865 -97.87 -97.875 -97.88 -97.885 -97.89 -97.895 -97.9 -97.905 -97.91 -97.915 -97.92 -97.925 -97.93 -97.935 -97.94 -97.945 -97.95 -97.955 -97.96 -97.965 -97.97 -97.975 -97.98 -97.985 -97.99 -97.995 -98 -98.005 -98.01 -98.015 -98.02 -98.025 -98.03 -98.035 -98.04 -98.045 -98.05 -98.055 -98.06 -98.065 -98.07 -98.075 -98.08 -98.085 -98.09 -98.095 -98.1 -98.105 -98.11 -98.115 -98.12 -98.125 -98.13 -98.135 -98.14 -98.145 -98.15 -98.155 -98.16 -98.165 -98.17 -98.175 -98.18 -98.185 -98.19 -98.195 -98.2 -98.205 -98.21 -98.215 -98.22 -98.225 -98.23 -98.235 -98.24 -98.245 -98.25 -98.255 -98.26 -98.265 -98.27 -98.275 -98.28 -98.285 -98.29 -98.295 -98.3 -98.305 -98.31 -98.315 -98.32 -98.325 -98.33 -98.335 -98.34 -98.345 -98.35 -98.355 -98.36 -98.365 -98.37 -98.375 -98.38 -98.385 -98.39 -98.395 -98.4 -98.405 -98.41 -98.415 -98.42 -98.425 -98.43 -98.435 -98.44 -98.445 -98.45 -98.455 -98.46 -98.465 -98.47 -98.475 -98.48 -98.485 -98.49 -98.495 -98.5 -98.505 -98.51 -98.515 -98.52 -98.525 -98.53 -98.535 -98.54 -98.545 -98.55 -98.555 -98.56 -98.565 -98.57 -98.575 -98.58 -98.585 -98.59 -98.595 -98.6 -98.605 -98.61 -98.615 -98.62 -98.625 -98.63 -98.635 -98.64 -98.645 -98.65 -98.655 -98.66 -98.665 -98.67 -98.675 -98.68 -98.685 -98.69 -98.695 -98.7 -98.705 -98.71 -98.715 -98.72 -98.725 -98.73 -98.735 -98.74 -98.745 -98.75 -98.755 -98.76 -98.765 -98.77 -98.775 -98.78 -98.785 -98.79 -98.795 -98.8 -98.805 -98.81 -98.815 -98.82 -98.825 -98.83 -98.835 -98.84 -98.845 -98.85 -98.855 -98.86 -98.865 -98.87 -98.875 -98.88 -98.885 -98.89 -98.895 -98.9 -98.905 -98.91 -98.915 -98.92 -98.925 -98.93 -98.935 -98.94 -98.945 -98.95 -98.955 -98.96 -98.965 -98.97 -98.975 -98.98 -98.985 -98.99 -98.995 -99 -99.005 -99.01 -99.015 -99.02 -99.025 -99.03 -99.035 -99.04 -99.045 -99.05 -99.055 -99.06 -99.065 -99.07 -99.075 -99.08 -99.085 -99.09 -99.095 -99.1 -99.105 -99.11 -99.115 -99.12 -99.125 -99.13 -99.135 -99.14 -99.145 -99.15 -99.155 -99.16 -99.165 -99.17 -99.175 -99.18 -99.185 -99.19 -99.195 -99.2 -99.205 -99.21 -99.215 -99.22 -99.225 -99.23 -99.235 -99.24 -99.245 -99.25 -99.255 -99.26 -99.265 -99.27 -99.275 -99.28 -99.285 -99.29 -99.295 -99.3 -99.305 -99.31 -99.315 -99.32 -99.325 -99.33 -99.335 -99.34 -99.345 -99.35 -99.355 -99.36 -99.365 -99.37 -99.375 -99.38 -99.385 -99.39 -99.395 -99.4 -99.405 -99.41 -99.415 -99.42 -99.425 -99.43 -99.435 -99.44 -99.445 -99.45 -99.455 -99.46 -99.465 -99.47 -99.475 -99.48 -99.485 -99.49 -99.495 -99.5 -99.505 -99.51 -99.515 -99.52 -99.525 -99.53 -99.535 -99.54 -99.545 -99.55 -99.555 -99.56 -99.565 -99.57 -99.575 -99.58 -99.585 -99.59 -99.595 -99.6 -99.605 -99.61 -99.615 -99.62 -99.625 -99.63 -99.635 -99.64 -99.645 -99.65 -99.655 -99.66 -99.665 -99.67 -99.675 -99.68 -99.685 -99.69 -99.695 -99.7 -99.705 -99.71 -99.715 -99.72 -99.725 -99.73 -99.735 -99.74 -99.745 -99.75 -99.755 -99.76 -99.765 -99.77 -99.775 -99.78 -99.785 -99.79 -99.795 -99.8 -99.805 -99.81 -99.815 -99.82 -99.825 -99.83 -99.835 -99.84 -99.845 -99.85 -99.855 -99.86 -99.865 -99.87 -99.875 -99.88 -99.885 -99.89 -99.895 -99.9 -99.905 -99.91 -99.915 -99.92 -99.925 -99.93 -99.935 -99.94 -99.945 -99.95 -99.955 -99.96 -99.965 -99.97 -99.975 -99.98 -99.985 -99.99 -99.995 -100 -100.005 -100.01 -100.015 -100.02 -100.025 -100.03 -100.035 -100.04 -100.045 -100.05 -100.055 -100.06 -100.065 -100.07 -100.075 -100.08 -100.085 -100.09 -100.095 -100.1 -100.105 -100.11 -100.115 -100.12 -100.125 -100.13 -100.135 -100.14 -100.145 -100.15 -100.155 -100.16 -100.165 -100.17 -100.175 -100.18 -100.185 -100.19 -100.195 -100.2 -100.205 -100.21 -100.215 -100.22 -100.225 -100.23 -100.235 -100.24 -100.245 -100.25 -100.255 -100.26 -100.265 -100.27 -100.275 -100.28 -100.285 -100.29 -100.295 -100.3 -100.305 -100.31 -100.315 -100.32 -100.325 -100.33 -100.335 -100.34 -100.345 -100.35 -100.355 -100.36 -100.365 -100.37 -100.375 -100.38 -100.385 -100.39 -100.395 -100.4 -100.405 -100.41 -100.415 -100.42 -100.425 -100.43 -100.435 -100.44 -100.445 -100.45 -100.455 -100.46 -100.465 -100.47 -100.475 -100.48 -100.485 -100.49 -100.495 -100.5 -100.505 -100.51 -100.515 -100.52 -100.525 -100.53 -100.535 -100.54 -100.545 -100.55 -100.555 -100.56 -100.565 -100.57 -100.575 -100.58 -100.585 -100.59 -100.595 -100.6 -100.605 -100.61 -100.615 -100.62 -100.625 -100.63 -100.635 -100.64 -100.645 -100.65 -100.655 -100.66 -100.665 -100.67 -100.675 -100.68 -100.685 -100.69 -100.695 -100.7 -100.705 -100.71 -100.715 -100.72 -100.725 -100.73 -100.735 -100.74 -100.745 -100.75 -100.755 -100.76 -100.765 -100.77 -100.775 -100.78 -100.785 -100.79 -100.795 -100.8 -100.805 -100.81 -100.815 -100.82 -100.825 -100.83 -100.835 -100.84 -100.845 -100.85 -100.855 -100.86 -100.865 -100.87 -100.875 -100.88 -100.885 -100.89 -100.895 -100.9 -100.905 -100.91 -100.915 -100.92 -100.925 -100.93 -100.935 -100.94 -100.945 -100.95 -100.955 -100.96 -100.965 -100.97 -100.975 -100.98 -100.985 -100.99 -100.995 -101 -101.005 -101.01 -101.015 -101.02 -101.025 -101.03 -101.035 -101.04 -101.045 -101.05 -101.055 -101.06 -101.065 -101.07 -101.075 -101.08 -101.085 -101.09 -101.095 -101.1 -101.105 -101.11 -101.115 -101.12 -101.125 -101.13 -101.135 -101.14 -101.145 -101.15 -101.155 -101.16 -101.165 -101.17 -101.175 -101.18 -101.185 -101.19 -101.195 -101.2 -101.205 -101.21 -101.215 -101.22 -101.225 -101.23 -101.235 -101.24 -101.245 -101.25 -101.255 -101.26 -101.265 -101.27 -101.275 -101.28 -101.285 -101.29 -101.295 -101.3 -101.305 -101.31 -101.315 -101.32 -101.325 -101.33 -101.335 -101.34 -101.345 -101.35 -101.355 -101.36 -101.365 -101.37 -101.375 -101.38 -101.385 -101.39 -101.395 -101.4 -101.405 -101.41 -101.415 -101.42 -101.425 -101.43 -101.435 -101.44 -101.445 -101.45 -101.455 -101.46 -101.465 -101.47 -101.475 -101.48 -101.485 -101.49 -101.495 -101.5 -101.505 -101.51 -101.515 -101.52 -101.525 -101.53 -101.535 -101.54 -101.545 -101.55 -101.555 -101.56 -101.565 -101.57 -101.575 -101.58 -101.585 -101.59 -101.595 -101.6 -101.605 -101.61 -101.615 -101.62 -101.625 -101.63 -101.635 -101.64 -101.645 -101.65 -101.655 -101.66 -101.665 -101.67 -101.675 -101.68 -101.685 -101.69 -101.695 -101.7 -101.705 -101.71 -101.715 -101.72 -101.725 -101.73 -101.735 -101.74 -101.745 -101.75 -101.755 -101.76 -101.765 -101.77 -101.775 -101.78 -101.785 -101.79 -101.795 -101.8 -101.805 -101.81 -101.815 -101.82 -101.825 -101.83 -101.835 -101.84 -101.845 -101.85 -101.855 -101.86 -101.865 -101.87 -101.875 -101.88 -101.885 -101.89 -101.895 -101.9 -101.905 -101.91 -101.915 -101.92 -101.925 -101.93 -101.935 -101.94 -101.945 -101.95 -101.955 -101.96 -101.965 -101.97 -101.975 -101.98 -101.985 -101.99 -101.995 -102 -102.005 -102.01 -102.015 -102.02 -102.025 -102.03 -102.035 -102.04 -102.045 -102.05 -102.055 -102.06 -102.065 -102.07 -102.075 -102.08 -102.085 -102.09 -102.095 -102.1 -102.105 -102.11 -102.115 -102.12 -102.125 -102.13 -102.135 -102.14 -102.145 -102.15 -102.155 -102.16 -102.165 -102.17 -102.175 -102.18 -102.185 -102.19 -102.195 -102.2 -102.205 -102.21 -102.215 -102.22 -102.225 -102.23 -102.235 -102.24 -102.245 -102.25 -102.255 -102.26 -102.265 -102.27 -102.275 -102.28 -102.285 -102.29 -102.295 -102.3 -102.305 -102.31 -102.315 -102.32 -102.325 -102.33 -102.335 -102.34 -102.345 -102.35 -102.355 -102.36 -102.365 -102.37 -102.375 -102.38 -102.385 -102.39 -102.395 -102.4 -102.405 -102.41 -102.415 -102.42 -102.425 -102.43 -102.435 -102.44 -102.445 -102.45 -102.455 -102.46 -102.465 -102.47 -102.475 -102.48 -102.485 -102.49 -102.495 -102.5 -102.505 -102.51 -102.515 -102.52 -102.525 -102.53 -102.535 -102.54 -102.545 -102.55 -102.555 -102.56 -102.565 -102.57 -102.575 -102.58 -102.585 -102.59 -102.595 -102.6 -102.605 -102.61 -102.615 -102.62 -102.625 -102.63 -102.635 -102.64 -102.645 -102.65 -102.655 -102.66 -102.665 -102.67 -102.675 -102.68 -102.685 -102.69 -102.695 -102.7 -102.705 -102.71 -102.715 -102.72 -102.725 -102.73 -102.735 -102.74 -102.745 -102.75 -102.755 -102.76 -102.765 -102.77 -102.775 -102.78 -102.785 -102.79 -102.795 -102.8 -102.805 -102.81 -102.815 -102.82 -102.825 -102.83 -102.835 -102.84 -102.845 -102.85 -102.855 -102.86 -102.865 -102.87 -102.875 -102.88 -102.885 -102.89 -102.895 -102.9 -102.905 -102.91 -102.915 -102.92 -102.925 -102.93 -102.935 -102.94 -102.945 -102.95 -102.955 -102.96 -102.965 -102.97 -102.975 -102.98 -102.985 -102.99 -102.995 -103 -103.005 -103.01 -103.015 -103.02 -103.025 -103.03 -103.035 -103.04 -103.045 -103.05 -103.055 -103.06 -103.065 -103.07 -103.075 -103.08 -103.085 -103.09 -103.095 -103.1 -103.105 -103.11 -103.115 -103.12 -103.125 -103.13 -103.135 -103.14 -103.145 -103.15 -103.155 -103.16 -103.165 -103.17 -103.175 -103.18 -103.185 -103.19 -103.195 -103.2 -103.205 -103.21 -103.215 -103.22 -103.225 -103.23 -103.235 -103.24 -103.245 -103.25 -103.255 -103.26 -103.265 -103.27 -103.275 -103.28 -103.285 -103.29 -103.295 -103.3 -103.305 -103.31 -103.315 -103.32 -103.325 -103.33 -103.335 -103.34 -103.345 -103.35 -103.355 -103.36 -103.365 -103.37 -103.375 -103.38 -103.385 -103.39 -103.395 -103.4 -103.405 -103.41 -103.415 -103.42 -103.425 -103.43 -103.435 -103.44 -103.445 -103.45 -103.455 -103.46 -103.465 -103.47 -103.475 -103.48 -103.485 -103.49 -103.495 -103.5 -103.505 -103.51 -103.515 -103.52 -103.525 -103.53 -103.535 -103.54 -103.545 -103.55 -103.555 -103.56 -103.565 -103.57 -103.575 -103.58 -103.585 -103.59 -103.595 -103.6 -103.605 -103.61 -103.615 -103.62 -103.625 -103.63 -103.635 -103.64 -103.645 -103.65 -103.655 -103.66 -103.665 -103.67 -103.675 -103.68 -103.685 -103.69 -103.695 -103.7 -103.705 -103.71 -103.715 -103.72 -103.725 -103.73 -103.735 -103.74 -103.745 -103.75 -103.755 -103.76 -103.765 -103.77 -103.775 -103.78 -103.785 -103.79 -103.795 -103.8 -103.805 -103.81 -103.815 -103.82 -103.825 -103.83 -103.835 -103.84 -103.845 -103.85 -103.855 -103.86 -103.865 -103.87 -103.875 -103.88 -103.885 -103.89 -103.895 -103.9 -103.905 -103.91 -103.915 -103.92 -103.925 -103.93 -103.935 -103.94 -103.945 -103.95 -103.955 -103.96 -103.965 -103.97 -103.975 -103.98 -103.985 -103.99 -103.995 -104 -104.005 -104.01 -104.015 -104.02 -104.025 -104.03 -104.035 -104.04 -104.045 -104.05 -104.055 -104.06 -104.065 -104.07 -104.075 -104.08 -104.085 -104.09 -104.095 -104.1 -104.105 -104.11 -104.115 -104.12 -104.125 -104.13 -104.135 -104.14 -104.145 -104.15 -104.155 -104.16 -104.165 -104.17 -104.175 -104.18 -104.185 -104.19 -104.195 -104.2 -104.205 -104.21 -104.215 -104.22 -104.225 -104.23 -104.235 -104.24 -104.245 -104.25 -104.255 -104.26 -104.265 -104.27 -104.275 -104.28 -104.285 -104.29 -104.295 -104.3 -104.305 -104.31 -104.315 -104.32 -104.325 -104.33 -104.335 -104.34 -104.345 -104.35 -104.355 -104.36 -104.365 -104.37 -104.375 -104.38 -104.385 -104.39 -104.395 -104.4 -104.405 -104.41 -104.415 -104.42 -104.425 -104.43 -104.435 -104.44 -104.445 -104.45 -104.455 -104.46 -104.465 -104.47 -104.475 -104.48 -104.485 -104.49 -104.495 -104.5 -104.505 -104.51 -104.515 -104.52 -104.525 -104.53 -104.535 -104.54 -104.545 -104.55 -104.555 -104.56 -104.565 -104.57 -104.575 -104.58 -104.585 -104.59 -104.595 -104.6 -104.605 -104.61 -104.615 -104.62 -104.625 -104.63 -104.635 -104.64 -104.645 -104.65 -104.655 -104.66 -104.665 -104.67 -104.675 -104.68 -104.685 -104.69 -104.695 -104.7 -104.705 -104.71 -104.715 -104.72 -104.725 -104.73 -104.735 -104.74 -104.745 -104.75 -104.755 -104.76 -104.765 -104.77 -104.775 -104.78 -104.785 -104.79 -104.795 -104.8 -104.805 -104.81 -104.815 -104.82 -104.825 -104.83 -104.835 -104.84 -104.845 -104.85 -104.855 -104.86 -104.865 -104.87 -104.875 -104.88 -104.885 -104.89 -104.895 -104.9 -104.905 -104.91 -104.915 -104.92 -104.925 -104.93 -104.935 -104.94 -104.945 -104.95 -104.955 -104.96 -104.965 -104.97 -104.975 -104.98 -104.985 -104.99 -104.995 -105 -105.005 -105.01 -105.015 -105.02 -105.025 -105.03 -105.035 -105.04 -105.045 -105.05 -105.055 -105.06 -105.065 -105.07 -105.075 -105.08 -105.085 -105.09 -105.095 -105.1 -105.105 -105.11 -105.115 -105.12 -105.125 -105.13 -105.135 -105.14 -105.145 -105.15 -105.155 -105.16 -105.165 -105.17 -105.175 -105.18 -105.185 -105.19 -105.195 -105.2 -105.205 -105.21 -105.215 -105.22 -105.225 -105.23 -105.235 -105.24 -105.245 -105.25 -105.255 -105.26 -105.265 -105.27 -105.275 -105.28 -105.285 -105.29 -105.295 -105.3 -105.305 -105.31 -105.315 -105.32 -105.325 -105.33 -105.335 -105.34 -105.345 -105.35 -105.355 -105.36 -105.365 -105.37 -105.375 -105.38 -105.385 -105.39 -105.395 -105.4 -105.405 -105.41 -105.415 -105.42 -105.425 -105.43 -105.435 -105.44 -105.445 -105.45 -105.455 -105.46 -105.465 -105.47 -105.475 -105.48 -105.485 -105.49 -105.495 -105.5 -105.505 -105.51 -105.515 -105.52 -105.525 -105.53 -105.535 -105.54 -105.545 -105.55 -105.555 -105.56 -105.565 -105.57 -105.575 -105.58 -105.585 -105.59 -105.595 -105.6 -105.605 -105.61 -105.615 -105.62 -105.625 -105.63 -105.635 -105.64 -105.645 -105.65 -105.655 -105.66 -105.665 -105.67 -105.675 -105.68 -105.685 -105.69 -105.695 -105.7 -105.705 -105.71 -105.715 -105.72 -105.725 -105.73 -105.735 -105.74 -105.745 -105.75 -105.755 -105.76 -105.765 -105.77 -105.775 -105.78 -105.785 -105.79 -105.795 -105.8 -105.805 -105.81 -105.815 -105.82 -105.825 -105.83 -105.835 -105.84 -105.845 -105.85 -105.855 -105.86 -105.865 -105.87 -105.875 -105.88 -105.885 -105.89 -105.895 -105.9 -105.905 -105.91 -105.915 -105.92 -105.925 -105.93 -105.935 -105.94 -105.945 -105.95 -105.955 -105.96 -105.965 -105.97 -105.975 -105.98 -105.985 -105.99 -105.995 -106 -106.005 -106.01 -106.015 -106.02 -106.025 -106.03 -106.035 -106.04 -106.045 -106.05 -106.055 -106.06 -106.065 -106.07 -106.075 -106.08 -106.085 -106.09 -106.095 -106.1 -106.105 -106.11 -106.115 -106.12 -106.125 -106.13 -106.135 -106.14 -106.145 -106.15 -106.155 -106.16 -106.165 -106.17 -106.175 -106.18 -106.185 -106.19 -106.195 -106.2 -106.205 -106.21 -106.215 -106.22 -106.225 -106.23 -106.235 -106.24 -106.245 -106.25 -106.255 -106.26 -106.265 -106.27 -106.275 -106.28 -106.285 -106.29 -106.295 -106.3 -106.305 -106.31 -106.315 -106.32 -106.325 -106.33 -106.335 -106.34 -106.345 -106.35 -106.355 -106.36 -106.365 -106.37 -106.375 -106.38 -106.385 -106.39 -106.395 -106.4 -106.405 -106.41 -106.415 -106.42 -106.425 -106.43 -106.435 -106.44 -106.445 -106.45 -106.455 -106.46 -106.465 -106.47 -106.475 -106.48 -106.485 -106.49 -106.495 -106.5 -106.505 -106.51 -106.515 -106.52 -106.525 -106.53 -106.535 -106.54 -106.545 -106.55 -106.555 -106.56 -106.565 -106.57 -106.575 -106.58 -106.585 -106.59 -106.595 -106.6 -106.605 -106.61 -106.615 -106.62 -106.625 -106.63 -106.635 -106.64 -106.645 -106.65 -106.655 -106.66 -106.665 -106.67 -106.675 -106.68 -106.685 -106.69 -106.695 -106.7 -106.705 -106.71 -106.715 -106.72 -106.725 -106.73 -106.735 -106.74 -106.745 -106.75 -106.755 -106.76 -106.765 -106.77 -106.775 -106.78 -106.785 -106.79 -106.795 -106.8 -106.805 -106.81 -106.815 -106.82 -106.825 -106.83 -106.835 -106.84 -106.845 -106.85 -106.855 -106.86 -106.865 -106.87 -106.875 -106.88 -106.885 -106.89 -106.895 -106.9 -106.905 -106.91 -106.915 -106.92 -106.925 -106.93 -106.935 -106.94 -106.945 -106.95 -106.955 -106.96 -106.965 -106.97 -106.975 -106.98 -106.985 -106.99 -106.995 -107 -107.005 -107.01 -107.015 -107.02 -107.025 -107.03 -107.035 -107.04 -107.045 -107.05 -107.055 -107.06 -107.065 -107.07 -107.075 -107.08 -107.085 -107.09 -107.095 -107.1 -107.105 -107.11 -107.115 -107.12 -107.125 -107.13 -107.135 -107.14 -107.145 -107.15 -107.155 -107.16 -107.165 -107.17 -107.175 -107.18 -107.185 -107.19 -107.195 -107.2 -107.205 -107.21 -107.215 -107.22 -107.225 -107.23 -107.235 -107.24 -107.245 -107.25 -107.255 -107.26 -107.265 -107.27 -107.275 -107.28 -107.285 -107.29 -107.295 -107.3 -107.305 -107.31 -107.315 -107.32 -107.325 -107.33 -107.335 -107.34 -107.345 -107.35 -107.355 -107.36 -107.365 -107.37 -107.375 -107.38 -107.385 -107.39 -107.395 -107.4 -107.405 -107.41 -107.415 -107.42 -107.425 -107.43 -107.435 -107.44 -107.445 -107.45 -107.455 -107.46 -107.465 -107.47 -107.475 -107.48 -107.485 -107.49 -107.495 -107.5 -107.505 -107.51 -107.515 -107.52 -107.525 -107.53 -107.535 -107.54 -107.545 -107.55 -107.555 -107.56 -107.565 -107.57 -107.575 -107.58 -107.585 -107.59 -107.595 -107.6 -107.605 -107.61 -107.615 -107.62 -107.625 -107.63 -107.635 -107.64 -107.645 -107.65 -107.655 -107.66 -107.665 -107.67 -107.675 -107.68 -107.685 -107.69 -107.695 -107.7 -107.705 -107.71 -107.715 -107.72 -107.725 -107.73 -107.735 -107.74 -107.745 -107.75 -107.755 -107.76 -107.765 -107.77 -107.775 -107.78 -107.785 -107.79 -107.795 -107.8 -107.805 -107.81 -107.815 -107.82 -107.825 -107.83 -107.835 -107.84 -107.845 -107.85 -107.855 -107.86 -107.865 -107.87 -107.875 -107.88 -107.885 -107.89 -107.895 -107.9 -107.905 -107.91 -107.915 -107.92 -107.925 -107.93 -107.935 -107.94 -107.945 -107.95 -107.955 -107.96 -107.965 -107.97 -107.975 -107.98 -107.985 -107.99 -107.995 -108 -108.005 -108.01 -108.015 -108.02 -108.025 -108.03 -108.035 -108.04 -108.045 -108.05 -108.055 -108.06 -108.065 -108.07 -108.075 -108.08 -108.085 -108.09 -108.095 -108.1 -108.105 -108.11 -108.115 -108.12 -108.125 -108.13 -108.135 -108.14 -108.145 -108.15 -108.155 -108.16 -108.165 -108.17 -108.175 -108.18 -108.185 -108.19 -108.195 -108.2 -108.205 -108.21 -108.215 -108.22 -108.225 -108.23 -108.235 -108.24 -108.245 -108.25 -108.255 -108.26 -108.265 -108.27 -108.275 -108.28 -108.285 -108.29 -108.295 -108.3 -108.305 -108.31 -108.315 -108.32 -108.325 -108.33 -108.335 -108.34 -108.345 -108.35 -108.355 -108.36 -108.365 -108.37 -108.375 -108.38 -108.385 -108.39 -108.395 -108.4 -108.405 -108.41 -108.415 -108.42 -108.425 -108.43 -108.435 -108.44 -108.445 -108.45 -108.455 -108.46 -108.465 -108.47 -108.475 -108.48 -108.485 -108.49 -108.495 -108.5 -108.505 -108.51 -108.515 -108.52 -108.525 -108.53 -108.535 -108.54 -108.545 -108.55 -108.555 -108.56 -108.565 -108.57 -108.575 -108.58 -108.585 -108.59 -108.595 -108.6 -108.605 -108.61 -108.615 -108.62 -108.625 -108.63 -108.635 -108.64 -108.645 -108.65 -108.655 -108.66 -108.665 -108.67 -108.675 -108.68 -108.685 -108.69 -108.695 -108.7 -108.705 -108.71 -108.715 -108.72 -108.725 -108.73 -108.735 -108.74 -108.745 -108.75 -108.755 -108.76 -108.765 -108.77 -108.775 -108.78 -108.785 -108.79 -108.795 -108.8 -108.805 -108.81 -108.815 -108.82 -108.825 -108.83 -108.835 -108.84 -108.845 -108.85 -108.855 -108.86 -108.865 -108.87 -108.875 -108.88 -108.885 -108.89 -108.895 -108.9 -108.905 -108.91 -108.915 -108.92 -108.925 -108.93 -108.935 -108.94 -108.945 -108.95 -108.955 -108.96 -108.965 -108.97 -108.975 -108.98 -108.985 -108.99 -108.995 -109 -109.005 -109.01 -109.015 -109.02 -109.025 -109.03 -109.035 -109.04 -109.045 -109.05 -109.055 -109.06 -109.065 -109.07 -109.075 -109.08 -109.085 -109.09 -109.095 -109.1 -109.105 -109.11 -109.115 -109.12 -109.125 -109.13 -109.135 -109.14 -109.145 -109.15 -109.155 -109.16 -109.165 -109.17 -109.175 -109.18 -109.185 -109.19 -109.195 -109.2 -109.205 -109.21 -109.215 -109.22 -109.225 -109.23 -109.235 -109.24 -109.245 -109.25 -109.255 -109.26 -109.265 -109.27 -109.275 -109.28 -109.285 -109.29 -109.295 -109.3 -109.305 -109.31 -109.315 -109.32 -109.325 -109.33 -109.335 -109.34 -109.345 -109.35 -109.355 -109.36 -109.365 -109.37 -109.375 -109.38 -109.385 -109.39 -109.395 -109.4 -109.405 -109.41 -109.415 -109.42 -109.425 -109.43 -109.435 -109.44 -109.445 -109.45 -109.455 -109.46 -109.465 -109.47 -109.475 -109.48 -109.485 -109.49 -109.495 -109.5 -109.505 -109.51 -109.515 -109.52 -109.525 -109.53 -109.535 -109.54 -109.545 -109.55 -109.555 -109.56 -109.565 -109.57 -109.575 -109.58 -109.585 -109.59 -109.595 -109.6 -109.605 -109.61 -109.615 -109.62 -109.625 -109.63 -109.635 -109.64 -109.645 -109.65 -109.655 -109.66 -109.665 -109.67 -109.675 -109.68 -109.685 -109.69 -109.695 -109.7 -109.705 -109.71 -109.715 -109.72 -109.725 -109.73 -109.735 -109.74 -109.745 -109.75 -109.755 -109.76 -109.765 -109.77 -109.775 -109.78 -109.785 -109.79 -109.795 -109.8 -109.805 -109.81 -109.815 -109.82 -109.825 -109.83 -109.835 -109.84 -109.845 -109.85 -109.855 -109.86 -109.865 -109.87 -109.875 -109.88 -109.885 -109.89 -109.895 -109.9 -109.905 -109.91 -109.915 -109.92 -109.925 -109.93 -109.935 -109.94 -109.945 -109.95 -109.955 -109.96 -109.965 -109.97 -109.975 -109.98 -109.985 -109.99 -109.995 -110 -110.005 -110.01 -110.015 -110.02 -110.025 -110.03 -110.035 -110.04 -110.045 -110.05 -110.055 -110.06 -110.065 -110.07 -110.075 -110.08 -110.085 -110.09 -110.095 -110.1 -110.105 -110.11 -110.115 -110.12 -110.125 -110.13 -110.135 -110.14 -110.145 -110.15 -110.155 -110.16 -110.165 -110.17 -110.175 -110.18 -110.185 -110.19 -110.195 -110.2 -110.205 -110.21 -110.215 -110.22 -110.225 -110.23 -110.235 -110.24 -110.245 -110.25 -110.255 -110.26 -110.265 -110.27 -110.275 -110.28 -110.285 -110.29 -110.295 -110.3 -110.305 -110.31 -110.315 -110.32 -110.325 -110.33 -110.335 -110.34 -110.345 -110.35 -110.355 -110.36 -110.365 -110.37 -110.375 -110.38 -110.385 -110.39 -110.395 -110.4 -110.405 -110.41 -110.415 -110.42 -110.425 -110.43 -110.435 -110.44 -110.445 -110.45 -110.455 -110.46 -110.465 -110.47 -110.475 -110.48 -110.485 -110.49 -110.495 -110.5 -110.505 -110.51 -110.515 -110.52 -110.525 -110.53 -110.535 -110.54 -110.545 -110.55 -110.555 -110.56 -110.565 -110.57 -110.575 -110.58 -110.585 -110.59 -110.595 -110.6 -110.605 -110.61 -110.615 -110.62 -110.625 -110.63 -110.635 -110.64 -110.645 -110.65 -110.655 -110.66 -110.665 -110.67 -110.675 -110.68 -110.685 -110.69 -110.695 -110.7 -110.705 -110.71 -110.715 -110.72 -110.725 -110.73 -110.735 -110.74 -110.745 -110.75 -110.755 -110.76 -110.765 -110.77 -110.775 -110.78 -110.785 -110.79 -110.795 -110.8 -110.805 -110.81 -110.815 -110.82 -110.825 -110.83 -110.835 -110.84 -110.845 -110.85 -110.855 -110.86 -110.865 -110.87 -110.875 -110.88 -110.885 -110.89 -110.895 -110.9 -110.905 -110.91 -110.915 -110.92 -110.925 -110.93 -110.935 -110.94 -110.945 -110.95 -110.955 -110.96 -110.965 -110.97 -110.975 -110.98 -110.985 -110.99 -110.995 -111 -111.005 -111.01 -111.015 -111.02 -111.025 -111.03 -111.035 -111.04 -111.045 -111.05 -111.055 -111.06 -111.065 -111.07 -111.075 -111.08 -111.085 -111.09 -111.095 -111.1 -111.105 -111.11 -111.115 -111.12 -111.125 -111.13 -111.135 -111.14 -111.145 -111.15 -111.155 -111.16 -111.165 -111.17 -111.175 -111.18 -111.185 -111.19 -111.195 -111.2 -111.205 -111.21 -111.215 -111.22 -111.225 -111.23 -111.235 -111.24 -111.245 -111.25 -111.255 -111.26 -111.265 -111.27 -111.275 -111.28 -111.285 -111.29 -111.295 -111.3 -111.305 -111.31 -111.315 -111.32 -111.325 -111.33 -111.335 -111.34 -111.345 -111.35 -111.355 -111.36 -111.365 -111.37 -111.375 -111.38 -111.385 -111.39 -111.395 -111.4 -111.405 -111.41 -111.415 -111.42 -111.425 -111.43 -111.435 -111.44 -111.445 -111.45 -111.455 -111.46 -111.465 -111.47 -111.475 -111.48 -111.485 -111.49 -111.495 -111.5 -111.505 -111.51 -111.515 -111.52 -111.525 -111.53 -111.535 -111.54 -111.545 -111.55 -111.555 -111.56 -111.565 -111.57 -111.575 -111.58 -111.585 -111.59 -111.595 -111.6 -111.605 -111.61 -111.615 -111.62 -111.625 -111.63 -111.635 -111.64 -111.645 -111.65 -111.655 -111.66 -111.665 -111.67 -111.675 -111.68 -111.685 -111.69 -111.695 -111.7 -111.705 -111.71 -111.715 -111.72 -111.725 -111.73 -111.735 -111.74 -111.745 -111.75 -111.755 -111.76 -111.765 -111.77 -111.775 -111.78 -111.785 -111.79 -111.795 -111.8 -111.805 -111.81 -111.815 -111.82 -111.825 -111.83 -111.835 -111.84 -111.845 -111.85 -111.855 -111.86 -111.865 -111.87 -111.875 -111.88 -111.885 -111.89 -111.895 -111.9 -111.905 -111.91 -111.915 -111.92 -111.925 -111.93 -111.935 -111.94 -111.945 -111.95 -111.955 -111.96 -111.965 -111.97 -111.975 -111.98 -111.985 -111.99 -111.995 -112 -112.005 -112.01 -112.015 -112.02 -112.025 -112.03 -112.035 -112.04 -112.045 -112.05 -112.055 -112.06 -112.065 -112.07 -112.075 -112.08 -112.085 -112.09 -112.095 -112.1 -112.105 -112.11 -112.115 -112.12 -112.125 -112.13 -112.135 -112.14 -112.145 -112.15 -112.155 -112.16 -112.165 -112.17 -112.175 -112.18 -112.185 -112.19 -112.195 -112.2 -112.205 -112.21 -112.215 -112.22 -112.225 -112.23 -112.235 -112.24 -112.245 -112.25 -112.255 -112.26 -112.265 -112.27 -112.275 -112.28 -112.285 -112.29 -112.295 -112.3 -112.305 -112.31 -112.315 -112.32 -112.325 -112.33 -112.335 -112.34 -112.345 -112.35 -112.355 -112.36 -112.365 -112.37 -112.375 -112.38 -112.385 -112.39 -112.395 -112.4 -112.405 -112.41 -112.415 -112.42 -112.425 -112.43 -112.435 -112.44 -112.445 -112.45 -112.455 -112.46 -112.465 -112.47 -112.475 -112.48 -112.485 -112.49 -112.495 -112.5 -112.505 -112.51 -112.515 -112.52 -112.525 -112.53 -112.535 -112.54 -112.545 -112.55 -112.555 -112.56 -112.565 -112.57 -112.575 -112.58 -112.585 -112.59 -112.595 -112.6 -112.605 -112.61 -112.615 -112.62 -112.625 -112.63 -112.635 -112.64 -112.645 -112.65 -112.655 -112.66 -112.665 -112.67 -112.675 -112.68 -112.685 -112.69 -112.695 -112.7 -112.705 -112.71 -112.715 -112.72 -112.725 -112.73 -112.735 -112.74 -112.745 -112.75 -112.755 -112.76 -112.765 -112.77 -112.775 -112.78 -112.785 -112.79 -112.795 -112.8 -112.805 -112.81 -112.815 -112.82 -112.825 -112.83 -112.835 -112.84 -112.845 -112.85 -112.855 -112.86 -112.865 -112.87 -112.875 -112.88 -112.885 -112.89 -112.895 -112.9 -112.905 -112.91 -112.915 -112.92 -112.925 -112.93 -112.935 -112.94 -112.945 -112.95 -112.955 -112.96 -112.965 -112.97 -112.975 -112.98 -112.985 -112.99 -112.995 -113 -113.005 -113.01 -113.015 -113.02 -113.025 -113.03 -113.035 -113.04 -113.045 -113.05 -113.055 -113.06 -113.065 -113.07 -113.075 -113.08 -113.085 -113.09 -113.095 -113.1 -113.105 -113.11 -113.115 -113.12 -113.125 -113.13 -113.135 -113.14 -113.145 -113.15 -113.155 -113.16 -113.165 -113.17 -113.175 -113.18 -113.185 -113.19 -113.195 -113.2 -113.205 -113.21 -113.215 -113.22 -113.225 -113.23 -113.235 -113.24 -113.245 -113.25 -113.255 -113.26 -113.265 -113.27 -113.275 -113.28 -113.285 -113.29 -113.295 -113.3 -113.305 -113.31 -113.315 -113.32 -113.325 -113.33 -113.335 -113.34 -113.345 -113.35 -113.355 -113.36 -113.365 -113.37 -113.375 -113.38 -113.385 -113.39 -113.395 -113.4 -113.405 -113.41 -113.415 -113.42 -113.425 -113.43 -113.435 -113.44 -113.445 -113.45 -113.455 -113.46 -113.465 -113.47 -113.475 -113.48 -113.485 -113.49 -113.495 -113.5 -113.505 -113.51 -113.515 -113.52 -113.525 -113.53 -113.535 -113.54 -113.545 -113.55 -113.555 -113.56 -113.565 -113.57 -113.575 -113.58 -113.585 -113.59 -113.595 -113.6 -113.605 -113.61 -113.615 -113.62 -113.625 -113.63 -113.635 -113.64 -113.645 -113.65 -113.655 -113.66 -113.665 -113.67 -113.675 -113.68 -113.685 -113.69 -113.695 -113.7 -113.705 -113.71 -113.715 -113.72 -113.725 -113.73 -113.735 -113.74 -113.745 -113.75 -113.755 -113.76 -113.765 -113.77 -113.775 -113.78 -113.785 -113.79 -113.795 -113.8 -113.805 -113.81 -113.815 -113.82 -113.825 -113.83 -113.835 -113.84 -113.845 -113.85 -113.855 -113.86 -113.865 -113.87 -113.875 -113.88 -113.885 -113.89 -113.895 -113.9 -113.905 -113.91 -113.915 -113.92 -113.925 -113.93 -113.935 -113.94 -113.945 -113.95 -113.955 -113.96 -113.965 -113.97 -113.975 -113.98 -113.985 -113.99 -113.995 -114 -114.005 -114.01 -114.015 -114.02 -114.025 -114.03 -114.035 -114.04 -114.045 -114.05 -114.055 -114.06 -114.065 -114.07 -114.075 -114.08 -114.085 -114.09 -114.095 -114.1 -114.105 -114.11 -114.115 -114.12 -114.125 -114.13 -114.135 -114.14 -114.145 -114.15 -114.155 -114.16 -114.165 -114.17 -114.175 -114.18 -114.185 -114.19 -114.195 -114.2 -114.205 -114.21 -114.215 -114.22 -114.225 -114.23 -114.235 -114.24 -114.245 -114.25 -114.255 -114.26 -114.265 -114.27 -114.275 -114.28 -114.285 -114.29 -114.295 -114.3 -114.305 -114.31 -114.315 -114.32 -114.325 -114.33 -114.335 -114.34 -114.345 -114.35 -114.355 -114.36 -114.365 -114.37 -114.375 -114.38 -114.385 -114.39 -114.395 -114.4 -114.405 -114.41 -114.415 -114.42 -114.425 -114.43 -114.435 -114.44 -114.445 -114.45 -114.455 -114.46 -114.465 -114.47 -114.475 -114.48 -114.485 -114.49 -114.495 -114.5 -114.505 -114.51 -114.515 -114.52 -114.525 -114.53 -114.535 -114.54 -114.545 -114.55 -114.555 -114.56 -114.565 -114.57 -114.575 -114.58 -114.585 -114.59 -114.595 -114.6 -114.605 -114.61 -114.615 -114.62 -114.625 -114.63 -114.635 -114.64 -114.645 -114.65 -114.655 -114.66 -114.665 -114.67 -114.675 -114.68 -114.685 -114.69 -114.695 -114.7 -114.705 -114.71 -114.715 -114.72 -114.725 -114.73 -114.735 -114.74 -114.745 -114.75 -114.755 -114.76 -114.765 -114.77 -114.775 -114.78 -114.785 -114.79 -114.795 -114.8 -114.805 -114.81 -114.815 -114.82 -114.825 -114.83 -114.835 -114.84 -114.845 -114.85 -114.855 -114.86 -114.865 -114.87 -114.875 -114.88 -114.885 -114.89 -114.895 -114.9 -114.905 -114.91 -114.915 -114.92 -114.925 -114.93 -114.935 -114.94 -114.945 -114.95 -114.955 -114.96 -114.965 -114.97 -114.975 -114.98 -114.985 -114.99 -114.995 -115 -115.005 -115.01 -115.015 -115.02 -115.025 -115.03 -115.035 -115.04 -115.045 -115.05 -115.055 -115.06 -115.065 -115.07 -115.075 -115.08 -115.085 -115.09 -115.095 -115.1 -115.105 -115.11 -115.115 -115.12 -115.125 -115.13 -115.135 -115.14 -115.145 -115.15 -115.155 -115.16 -115.165 -115.17 -115.175 -115.18 -115.185 -115.19 -115.195 -115.2 -115.205 -115.21 -115.215 -115.22 -115.225 -115.23 -115.235 -115.24 -115.245 -115.25 -115.255 -115.26 -115.265 -115.27 -115.275 -115.28 -115.285 -115.29 -115.295 -115.3 -115.305 -115.31 -115.315 -115.32 -115.325 -115.33 -115.335 -115.34 -115.345 -115.35 -115.355 -115.36 -115.365 -115.37 -115.375 -115.38 -115.385 -115.39 -115.395 -115.4 -115.405 -115.41 -115.415 -115.42 -115.425 -115.43 -115.435 -115.44 -115.445 -115.45 -115.455 -115.46 -115.465 -115.47 -115.475 -115.48 -115.485 -115.49 -115.495 -115.5 -115.505 -115.51 -115.515 -115.52 -115.525 -115.53 -115.535 -115.54 -115.545 -115.55 -115.555 -115.56 -115.565 -115.57 -115.575 -115.58 -115.585 -115.59 -115.595 -115.6 -115.605 -115.61 -115.615 -115.62 -115.625 -115.63 -115.635 -115.64 -115.645 -115.65 -115.655 -115.66 -115.665 -115.67 -115.675 -115.68 -115.685 -115.69 -115.695 -115.7 -115.705 -115.71 -115.715 -115.72 -115.725 -115.73 -115.735 -115.74 -115.745 -115.75 -115.755 -115.76 -115.765 -115.77 -115.775 -115.78 -115.785 -115.79 -115.795 -115.8 -115.805 -115.81 -115.815 -115.82 -115.825 -115.83 -115.835 -115.84 -115.845 -115.85 -115.855 -115.86 -115.865 -115.87 -115.875 -115.88 -115.885 -115.89 -115.895 -115.9 -115.905 -115.91 -115.915 -115.92 -115.925 -115.93 -115.935 -115.94 -115.945 -115.95 -115.955 -115.96 -115.965 -115.97 -115.975 -115.98 -115.985 -115.99 -115.995 -116 -116.005 -116.01 -116.015 -116.02 -116.025 -116.03 -116.035 -116.04 -116.045 -116.05 -116.055 -116.06 -116.065 -116.07 -116.075 -116.08 -116.085 -116.09 -116.095 -116.1 -116.105 -116.11 -116.115 -116.12 -116.125 -116.13 -116.135 -116.14 -116.145 -116.15 -116.155 -116.16 -116.165 -116.17 -116.175 -116.18 -116.185 -116.19 -116.195 -116.2 -116.205 -116.21 -116.215 -116.22 -116.225 -116.23 -116.235 -116.24 -116.245 -116.25 -116.255 -116.26 -116.265 -116.27 -116.275 -116.28 -116.285 -116.29 -116.295 -116.3 -116.305 -116.31 -116.315 -116.32 -116.325 -116.33 -116.335 -116.34 -116.345 -116.35 -116.355 -116.36 -116.365 -116.37 -116.375 -116.38 -116.385 -116.39 -116.395 -116.4 -116.405 -116.41 -116.415 -116.42 -116.425 -116.43 -116.435 -116.44 -116.445 -116.45 -116.455 -116.46 -116.465 -116.47 -116.475 -116.48 -116.485 -116.49 -116.495 -116.5 -116.505 -116.51 -116.515 -116.52 -116.525 -116.53 -116.535 -116.54 -116.545 -116.55 -116.555 -116.56 -116.565 -116.57 -116.575 -116.58 -116.585 -116.59 -116.595 -116.6 -116.605 -116.61 -116.615 -116.62 -116.625 -116.63 -116.635 -116.64 -116.645 -116.65 -116.655 -116.66 -116.665 -116.67 -116.675 -116.68 -116.685 -116.69 -116.695 -116.7 -116.705 -116.71 -116.715 -116.72 -116.725 -116.73 -116.735 -116.74 -116.745 -116.75 -116.755 -116.76 -116.765 -116.77 -116.775 -116.78 -116.785 -116.79 -116.795 -116.8 -116.805 -116.81 -116.815 -116.82 -116.825 -116.83 -116.835 -116.84 -116.845 -116.85 -116.855 -116.86 -116.865 -116.87 -116.875 -116.88 -116.885 -116.89 -116.895 -116.9 -116.905 -116.91 -116.915 -116.92 -116.925 -116.93 -116.935 -116.94 -116.945 -116.95 -116.955 -116.96 -116.965 -116.97 -116.975 -116.98 -116.985 -116.99 -116.995 -117 -117.005 -117.01 -117.015 -117.02 -117.025 -117.03 -117.035 -117.04 -117.045 -117.05 -117.055 -117.06 -117.065 -117.07 -117.075 -117.08 -117.085 -117.09 -117.095 -117.1 -117.105 -117.11 -117.115 -117.12 -117.125 -117.13 -117.135 -117.14 -117.145 -117.15 -117.155 -117.16 -117.165 -117.17 -117.175 -117.18 -117.185 -117.19 -117.195 -117.2 -117.205 -117.21 -117.215 -117.22 -117.225 -117.23 -117.235 -117.24 -117.245 -117.25 -117.255 -117.26 -117.265 -117.27 -117.275 -117.28 -117.285 -117.29 -117.295 -117.3 -117.305 -117.31 -117.315 -117.32 -117.325 -117.33 -117.335 -117.34 -117.345 -117.35 -117.355 -117.36 -117.365 -117.37 -117.375 -117.38 -117.385 -117.39 -117.395 -117.4 -117.405 -117.41 -117.415 -117.42 -117.425 -117.43 -117.435 -117.44 -117.445 -117.45 -117.455 -117.46 -117.465 -117.47 -117.475 -117.48 -117.485 -117.49 -117.495 -117.5 -117.505 -117.51 -117.515 -117.52 -117.525 -117.53 -117.535 -117.54 -117.545 -117.55 -117.555 -117.56 -117.565 -117.57 -117.575 -117.58 -117.585 -117.59 -117.595 -117.6 -117.605 -117.61 -117.615 -117.62 -117.625 -117.63 -117.635 -117.64 -117.645 -117.65 -117.655 -117.66 -117.665 -117.67 -117.675 -117.68 -117.685 -117.69 -117.695 -117.7 -117.705 -117.71 -117.715 -117.72 -117.725 -117.73 -117.735 -117.74 -117.745 -117.75 -117.755 -117.76 -117.765 -117.77 -117.775 -117.78 -117.785 -117.79 -117.795 -117.8 -117.805 -117.81 -117.815 -117.82 -117.825 -117.83 -117.835 -117.84 -117.845 -117.85 -117.855 -117.86 -117.865 -117.87 -117.875 -117.88 -117.885 -117.89 -117.895 -117.9 -117.905 -117.91 -117.915 -117.92 -117.925 -117.93 -117.935 -117.94 -117.945 -117.95 -117.955 -117.96 -117.965 -117.97 -117.975 -117.98 -117.985 -117.99 -117.995 -118 -118.005 -118.01 -118.015 -118.02 -118.025 -118.03 -118.035 -118.04 -118.045 -118.05 -118.055 -118.06 -118.065 -118.07 -118.075 -118.08 -118.085 -118.09 -118.095 -118.1 -118.105 -118.11 -118.115 -118.12 -118.125 -118.13 -118.135 -118.14 -118.145 -118.15 -118.155 -118.16 -118.165 -118.17 -118.175 -118.18 -118.185 -118.19 -118.195 -118.2 -118.205 -118.21 -118.215 -118.22 -118.225 -118.23 -118.235 -118.24 -118.245 -118.25 -118.255 -118.26 -118.265 -118.27 -118.275 -118.28 -118.285 -118.29 -118.295 -118.3 -118.305 -118.31 -118.315 -118.32 -118.325 -118.33 -118.335 -118.34 -118.345 -118.35 -118.355 -118.36 -118.365 -118.37 -118.375 -118.38 -118.385 -118.39 -118.395 -118.4 -118.405 -118.41 -118.415 -118.42 -118.425 -118.43 -118.435 -118.44 -118.445 -118.45 -118.455 -118.46 -118.465 -118.47 -118.475 -118.48 -118.485 -118.49 -118.495 -118.5 -118.505 -118.51 -118.515 -118.52 -118.525 -118.53 -118.535 -118.54 -118.545 -118.55 -118.555 -118.56 -118.565 -118.57 -118.575 -118.58 -118.585 -118.59 -118.595 -118.6 -118.605 -118.61 -118.615 -118.62 -118.625 -118.63 -118.635 -118.64 -118.645 -118.65 -118.655 -118.66 -118.665 -118.67 -118.675 -118.68 -118.685 -118.69 -118.695 -118.7 -118.705 -118.71 -118.715 -118.72 -118.725 -118.73 -118.735 -118.74 -118.745 -118.75 -118.755 -118.76 -118.765 -118.77 -118.775 -118.78 -118.785 -118.79 -118.795 -118.8 -118.805 -118.81 -118.815 -118.82 -118.825 -118.83 -118.835 -118.84 -118.845 -118.85 -118.855 -118.86 -118.865 -118.87 -118.875 -118.88 -118.885 -118.89 -118.895 -118.9 -118.905 -118.91 -118.915 -118.92 -118.925 -118.93 -118.935 -118.94 -118.945 -118.95 -118.955 -118.96 -118.965 -118.97 -118.975 -118.98 -118.985 -118.99 -118.995 -119 -119.005 -119.01 -119.015 -119.02 -119.025 -119.03 -119.035 -119.04 -119.045 -119.05 -119.055 -119.06 -119.065 -119.07 -119.075 -119.08 -119.085 -119.09 -119.095 -119.1 -119.105 -119.11 -119.115 -119.12 -119.125 -119.13 -119.135 -119.14 -119.145 -119.15 -119.155 -119.16 -119.165 -119.17 -119.175 -119.18 -119.185 -119.19 -119.195 -119.2 -119.205 -119.21 -119.215 -119.22 -119.225 -119.23 -119.235 -119.24 -119.245 -119.25 -119.255 -119.26 -119.265 -119.27 -119.275 -119.28 -119.285 -119.29 -119.295 -119.3 -119.305 -119.31 -119.315 -119.32 -119.325 -119.33 -119.335 -119.34 -119.345 -119.35 -119.355 -119.36 -119.365 -119.37 -119.375 -119.38 -119.385 -119.39 -119.395 -119.4 -119.405 -119.41 -119.415 -119.42 -119.425 -119.43 -119.435 -119.44 -119.445 -119.45 -119.455 -119.46 -119.465 -119.47 -119.475 -119.48 -119.485 -119.49 -119.495 -119.5 -119.505 -119.51 -119.515 -119.52 -119.525 -119.53 -119.535 -119.54 -119.545 -119.55 -119.555 -119.56 -119.565 -119.57 -119.575 -119.58 -119.585 -119.59 -119.595 -119.6 -119.605 -119.61 -119.615 -119.62 -119.625 -119.63 -119.635 -119.64 -119.645 -119.65 -119.655 -119.66 -119.665 -119.67 -119.675 -119.68 -119.685 -119.69 -119.695 -119.7 -119.705 -119.71 -119.715 -119.72 -119.725 -119.73 -119.735 -119.74 -119.745 -119.75 -119.755 -119.76 -119.765 -119.77 -119.775 -119.78 -119.785 -119.79 -119.795 -119.8 -119.805 -119.81 -119.815 -119.82 -119.825 -119.83 -119.835 -119.84 -119.845 -119.85 -119.855 -119.86 -119.865 -119.87 -119.875 -119.88 -119.885 -119.89 -119.895 -119.9 -119.905 -119.91 -119.915 -119.92 -119.925 -119.93 -119.935 -119.94 -119.945 -119.95 -119.955 -119.96 -119.965 -119.97 -119.975 -119.98 -119.985 -119.99 -119.995 -120 -120.005 -120.01 -120.015 -120.02 -120.025 -120.03 -120.035 -120.04 -120.045 -120.05 -120.055 -120.06 -120.065 -120.07 -120.075 -120.08 -120.085 -120.09 -120.095 -120.1 -120.105 -120.11 -120.115 -120.12 -120.125 -120.13 -120.135 -120.14 -120.145 -120.15 -120.155 -120.16 -120.165 -120.17 -120.175 -120.18 -120.185 -120.19 -120.195 -120.2 -120.205 -120.21 -120.215 -120.22 -120.225 -120.23 -120.235 -120.24 -120.245 -120.25 -120.255 -120.26 -120.265 -120.27 -120.275 -120.28 -120.285 -120.29 -120.295 -120.3 -120.305 -120.31 -120.315 -120.32 -120.325 -120.33 -120.335 -120.34 -120.345 -120.35 -120.355 -120.36 -120.365 -120.37 -120.375 -120.38 -120.385 -120.39 -120.395 -120.4 -120.405 -120.41 -120.415 -120.42 -120.425 -120.43 -120.435 -120.44 -120.445 -120.45 -120.455 -120.46 -120.465 -120.47 -120.475 -120.48 -120.485 -120.49 -120.495 -120.5 -120.505 -120.51 -120.515 -120.52 -120.525 -120.53 -120.535 -120.54 -120.545 -120.55 -120.555 -120.56 -120.565 -120.57 -120.575 -120.58 -120.585 -120.59 -120.595 -120.6 -120.605 -120.61 -120.615 -120.62 -120.625 -120.63 -120.635 -120.64 -120.645 -120.65 -120.655 -120.66 -120.665 -120.67 -120.675 -120.68 -120.685 -120.69 -120.695 -120.7 -120.705 -120.71 -120.715 -120.72 -120.725 -120.73 -120.735 -120.74 -120.745 -120.75 -120.755 -120.76 -120.765 -120.77 -120.775 -120.78 -120.785 -120.79 -120.795 -120.8 -120.805 -120.81 -120.815 -120.82 -120.825 -120.83 -120.835 -120.84 -120.845 -120.85 -120.855 -120.86 -120.865 -120.87 -120.875 -120.88 -120.885 -120.89 -120.895 -120.9 -120.905 -120.91 -120.915 -120.92 -120.925 -120.93 -120.935 -120.94 -120.945 -120.95 -120.955 -120.96 -120.965 -120.97 -120.975 -120.98 -120.985 -120.99 -120.995 -121 -121.005 -121.01 -121.015 -121.02 -121.025 -121.03 -121.035 -121.04 -121.045 -121.05 -121.055 -121.06 -121.065 -121.07 -121.075 -121.08 -121.085 -121.09 -121.095 -121.1 -121.105 -121.11 -121.115 -121.12 -121.125 -121.13 -121.135 -121.14 -121.145 -121.15 -121.155 -121.16 -121.165 -121.17 -121.175 -121.18 -121.185 -121.19 -121.195 -121.2 -121.205 -121.21 -121.215 -121.22 -121.225 -121.23 -121.235 -121.24 -121.245 -121.25 -121.255 -121.26 -121.265 -121.27 -121.275 -121.28 -121.285 -121.29 -121.295 -121.3 -121.305 -121.31 -121.315 -121.32 -121.325 -121.33 -121.335 -121.34 -121.345 -121.35 -121.355 -121.36 -121.365 -121.37 -121.375 -121.38 -121.385 -121.39 -121.395 -121.4 -121.405 -121.41 -121.415 -121.42 -121.425 -121.43 -121.435 -121.44 -121.445 -121.45 -121.455 -121.46 -121.465 -121.47 -121.475 -121.48 -121.485 -121.49 -121.495 -121.5 -121.505 -121.51 -121.515 -121.52 -121.525 -121.53 -121.535 -121.54 -121.545 -121.55 -121.555 -121.56 -121.565 -121.57 -121.575 -121.58 -121.585 -121.59 -121.595 -121.6 -121.605 -121.61 -121.615 -121.62 -121.625 -121.63 -121.635 -121.64 -121.645 -121.65 -121.655 -121.66 -121.665 -121.67 -121.675 -121.68 -121.685 -121.69 -121.695 -121.7 -121.705 -121.71 -121.715 -121.72 -121.725 -121.73 -121.735 -121.74 -121.745 -121.75 -121.755 -121.76 -121.765 -121.77 -121.775 -121.78 -121.785 -121.79 -121.795 -121.8 -121.805 -121.81 -121.815 -121.82 -121.825 -121.83 -121.835 -121.84 -121.845 -121.85 -121.855 -121.86 -121.865 -121.87 -121.875 -121.88 -121.885 -121.89 -121.895 -121.9 -121.905 -121.91 -121.915 -121.92 -121.925 -121.93 -121.935 -121.94 -121.945 -121.95 -121.955 -121.96 -121.965 -121.97 -121.975 -121.98 -121.985 -121.99 -121.995 -122 -122.005 -122.01 -122.015 -122.02 -122.025 -122.03 -122.035 -122.04 -122.045 -122.05 -122.055 -122.06 -122.065 -122.07 -122.075 -122.08 -122.085 -122.09 -122.095 -122.1 -122.105 -122.11 -122.115 -122.12 -122.125 -122.13 -122.135 -122.14 -122.145 -122.15 -122.155 -122.16 -122.165 -122.17 -122.175 -122.18 -122.185 -122.19 -122.195 -122.2 -122.205 -122.21 -122.215 -122.22 -122.225 -122.23 -122.235 -122.24 -122.245 -122.25 -122.255 -122.26 -122.265 -122.27 -122.275 -122.28 -122.285 -122.29 -122.295 -122.3 -122.305 -122.31 -122.315 -122.32 -122.325 -122.33 -122.335 -122.34 -122.345 -122.35 -122.355 -122.36 -122.365 -122.37 -122.375 -122.38 -122.385 -122.39 -122.395 -122.4 -122.405 -122.41 -122.415 -122.42 -122.425 -122.43 -122.435 -122.44 -122.445 -122.45 -122.455 -122.46 -122.465 -122.47 -122.475 -122.48 -122.485 -122.49 -122.495 -122.5 -122.505 -122.51 -122.515 -122.52 -122.525 -122.53 -122.535 -122.54 -122.545 -122.55 -122.555 -122.56 -122.565 -122.57 -122.575 -122.58 -122.585 -122.59 -122.595 -122.6 -122.605 -122.61 -122.615 -122.62 -122.625 -122.63 -122.635 -122.64 -122.645 -122.65 -122.655 -122.66 -122.665 -122.67 -122.675 -122.68 -122.685 -122.69 -122.695 -122.7 -122.705 -122.71 -122.715 -122.72 -122.725 -122.73 -122.735 -122.74 -122.745 -122.75 -122.755 -122.76 -122.765 -122.77 -122.775 -122.78 -122.785 -122.79 -122.795 -122.8 -122.805 -122.81 -122.815 -122.82 -122.825 -122.83 -122.835 -122.84 -122.845 -122.85 -122.855 -122.86 -122.865 -122.87 -122.875 -122.88 -122.885 -122.89 -122.895 -122.9 -122.905 -122.91 -122.915 -122.92 -122.925 -122.93 -122.935 -122.94 -122.945 -122.95 -122.955 -122.96 -122.965 -122.97 -122.975 -122.98 -122.985 -122.99 -122.995 -123 -123.005 -123.01 -123.015 -123.02 -123.025 -123.03 -123.035 -123.04 -123.045 -123.05 -123.055 -123.06 -123.065 -123.07 -123.075 -123.08 -123.085 -123.09 -123.095 -123.1 -123.105 -123.11 -123.115 -123.12 -123.125 -123.13 -123.135 -123.14 -123.145 -123.15 -123.155 -123.16 -123.165 -123.17 -123.175 -123.18 -123.185 -123.19 -123.195 -123.2 -123.205 -123.21 -123.215 -123.22 -123.225 -123.23 -123.235 -123.24 -123.245 -123.25 -123.255 -123.26 -123.265 -123.27 -123.275 -123.28 -123.285 -123.29 -123.295 -123.3 -123.305 -123.31 -123.315 -123.32 -123.325 -123.33 -123.335 -123.34 -123.345 -123.35 -123.355 -123.36 -123.365 -123.37 -123.375 -123.38 -123.385 -123.39 -123.395 -123.4 -123.405 -123.41 -123.415 -123.42 -123.425 -123.43 -123.435 -123.44 -123.445 -123.45 -123.455 -123.46 -123.465 -123.47 -123.475 -123.48 -123.485 -123.49 -123.495 -123.5 -123.505 -123.51 -123.515 -123.52 -123.525 -123.53 -123.535 -123.54 -123.545 -123.55 -123.555 -123.56 -123.565 -123.57 -123.575 -123.58 -123.585 -123.59 -123.595 -123.6 -123.605 -123.61 -123.615 -123.62 -123.625 -123.63 -123.635 -123.64 -123.645 -123.65 -123.655 -123.66 -123.665 -123.67 -123.675 -123.68 -123.685 -123.69 -123.695 -123.7 -123.705 -123.71 -123.715 -123.72 -123.725 -123.73 -123.735 -123.74 -123.745 -123.75 -123.755 -123.76 -123.765 -123.77 -123.775 -123.78 -123.785 -123.79 -123.795 -123.8 -123.805 -123.81 -123.815 -123.82 -123.825 -123.83 -123.835 -123.84 -123.845 -123.85 -123.855 -123.86 -123.865 -123.87 -123.875 -123.88 -123.885 -123.89 -123.895 -123.9 -123.905 -123.91 -123.915 -123.92 -123.925 -123.93 -123.935 -123.94 -123.945 -123.95 -123.955 -123.96 -123.965 -123.97 -123.975 -123.98 -123.985 -123.99 -123.995 -124 -124.005 -124.01 -124.015 -124.02 -124.025 -124.03 -124.035 -124.04 -124.045 -124.05 -124.055 -124.06 -124.065 -124.07 -124.075 -124.08 -124.085 -124.09 -124.095 -124.1 -124.105 -124.11 -124.115 -124.12 -124.125 -124.13 -124.135 -124.14 -124.145 -124.15 -124.155 -124.16 -124.165 -124.17 -124.175 -124.18 -124.185 -124.19 -124.195 -124.2 -124.205 -124.21 -124.215 -124.22 -124.225 -124.23 -124.235 -124.24 -124.245 -124.25 -124.255 -124.26 -124.265 -124.27 -124.275 -124.28 -124.285 -124.29 -124.295 -124.3 -124.305 -124.31 -124.315 -124.32 -124.325 -124.33 -124.335 -124.34 -124.345 -124.35 -124.355 -124.36 -124.365 -124.37 -124.375 -124.38 -124.385 -124.39 -124.395 -124.4 -124.405 -124.41 -124.415 -124.42 -124.425 -124.43 -124.435 -124.44 -124.445 -124.45 -124.455 -124.46 -124.465 -124.47 -124.475 -124.48 -124.485 -124.49 -124.495 -124.5 -124.505 -124.51 -124.515 -124.52 -124.525 -124.53 -124.535 -124.54 -124.545 -124.55 -124.555 -124.56 -124.565 -124.57 -124.575 -124.58 -124.585 -124.59 -124.595 -124.6 -124.605 -124.61 -124.615 -124.62 -124.625 -124.63 -124.635 -124.64 -124.645 -124.65 -124.655 -124.66 -124.665 -124.67 -124.675 -124.68 -124.685 -124.69 -124.695 -124.7 -124.705 -124.71 -124.715 -124.72 -124.725 -124.73 -124.735 -124.74 -124.745 -124.75 -124.755 -124.76 -124.765 -124.77 -124.775 -124.78 -124.785 -124.79 -124.795 -124.8 -124.805 -124.81 -124.815 -124.82 -124.825 -124.83 -124.835 -124.84 -124.845 -124.85 -124.855 -124.86 -124.865 -124.87 -124.875 -124.88 -124.885 -124.89 -124.895 -124.9 -124.905 -124.91 -124.915 -124.92 -124.925 -124.93 -124.935 -124.94 -124.945 -124.95 -124.955 -124.96 -124.965 -124.97 -124.975 -124.98 -124.985 -124.99 -124.995 -125 -125.005 -125.01 -125.015 -125.02 -125.025 -125.03 -125.035 -125.04 -125.045 -125.05 -125.055 -125.06 -125.065 -125.07 -125.075 -125.08 -125.085 -125.09 -125.095 -125.1 -125.105 -125.11 -125.115 -125.12 -125.125 -125.13 -125.135 -125.14 -125.145 -125.15 -125.155 -125.16 -125.165 -125.17 -125.175 -125.18 -125.185 -125.19 -125.195 -125.2 -125.205 -125.21 -125.215 -125.22 -125.225 -125.23 -125.235 -125.24 -125.245 -125.25 -125.255 -125.26 -125.265 -125.27 -125.275 -125.28 -125.285 -125.29 -125.295 -125.3 -125.305 -125.31 -125.315 -125.32 -125.325 -125.33 -125.335 -125.34 -125.345 -125.35 -125.355 -125.36 -125.365 -125.37 -125.375 -125.38 -125.385 -125.39 -125.395 -125.4 -125.405 -125.41 -125.415 -125.42 -125.425 -125.43 -125.435 -125.44 -125.445 -125.45 -125.455 -125.46 -125.465 -125.47 -125.475 -125.48 -125.485 -125.49 -125.495 -125.5 -125.505 -125.51 -125.515 -125.52 -125.525 -125.53 -125.535 -125.54 -125.545 -125.55 -125.555 -125.56 -125.565 -125.57 -125.575 -125.58 -125.585 -125.59 -125.595 -125.6 -125.605 -125.61 -125.615 -125.62 -125.625 -125.63 -125.635 -125.64 -125.645 -125.65 -125.655 -125.66 -125.665 -125.67 -125.675 -125.68 -125.685 -125.69 -125.695 -125.7 -125.705 -125.71 -125.715 -125.72 -125.725 -125.73 -125.735 -125.74 -125.745 -125.75 -125.755 -125.76 -125.765 -125.77 -125.775 -125.78 -125.785 -125.79 -125.795 -125.8 -125.805 -125.81 -125.815 -125.82 -125.825 -125.83 -125.835 -125.84 -125.845 -125.85 -125.855 -125.86 -125.865 -125.87 -125.875 -125.88 -125.885 -125.89 -125.895 -125.9 -125.905 -125.91 -125.915 -125.92 -125.925 -125.93 -125.935 -125.94 -125.945 -125.95 -125.955 -125.96 -125.965 -125.97 -125.975 -125.98 -125.985 -125.99 -125.995 -126 -126.005 -126.01 -126.015 -126.02 -126.025 -126.03 -126.035 -126.04 -126.045 -126.05 -126.055 -126.06 -126.065 -126.07 -126.075 -126.08 -126.085 -126.09 -126.095 -126.1 -126.105 -126.11 -126.115 -126.12 -126.125 -126.13 -126.135 -126.14 -126.145 -126.15 -126.155 -126.16 -126.165 -126.17 -126.175 -126.18 -126.185 -126.19 -126.195 -126.2 -126.205 -126.21 -126.215 -126.22 -126.225 -126.23 -126.235 -126.24 -126.245 -126.25 -126.255 -126.26 -126.265 -126.27 -126.275 -126.28 -126.285 -126.29 -126.295 -126.3 -126.305 -126.31 -126.315 -126.32 -126.325 -126.33 -126.335 -126.34 -126.345 -126.35 -126.355 -126.36 -126.365 -126.37 -126.375 -126.38 -126.385 -126.39 -126.395 -126.4 -126.405 -126.41 -126.415 -126.42 -126.425 -126.43 -126.435 -126.44 -126.445 -126.45 -126.455 -126.46 -126.465 -126.47 -126.475 -126.48 -126.485 -126.49 -126.495 -126.5 -126.505 -126.51 -126.515 -126.52 -126.525 -126.53 -126.535 -126.54 -126.545 -126.55 -126.555 -126.56 -126.565 -126.57 -126.575 -126.58 -126.585 -126.59 -126.595 -126.6 -126.605 -126.61 -126.615 -126.62 -126.625 -126.63 -126.635 -126.64 -126.645 -126.65 -126.655 -126.66 -126.665 -126.67 -126.675 -126.68 -126.685 -126.69 -126.695 -126.7 -126.705 -126.71 -126.715 -126.72 -126.725 -126.73 -126.735 -126.74 -126.745 -126.75 -126.755 -126.76 -126.765 -126.77 -126.775 -126.78 -126.785 -126.79 -126.795 -126.8 -126.805 -126.81 -126.815 -126.82 -126.825 -126.83 -126.835 -126.84 -126.845 -126.85 -126.855 -126.86 -126.865 -126.87 -126.875 -126.88 -126.885 -126.89 -126.895 -126.9 -126.905 -126.91 -126.915 -126.92 -126.925 -126.93 -126.935 -126.94 -126.945 -126.95 -126.955 -126.96 -126.965 -126.97 -126.975 -126.98 -126.985 -126.99 -126.995 -127 -127.005 -127.01 -127.015 -127.02 -127.025 -127.03 -127.035 -127.04 -127.045 -127.05 -127.055 -127.06 -127.065 -127.07 -127.075 -127.08 -127.085 -127.09 -127.095 -127.1 -127.105 -127.11 -127.115 -127.12 -127.125 -127.13 -127.135 -127.14 -127.145 -127.15 -127.155 -127.16 -127.165 -127.17 -127.175 -127.18 -127.185 -127.19 -127.195 -127.2 -127.205 -127.21 -127.215 -127.22 -127.225 -127.23 -127.235 -127.24 -127.245 -127.25 -127.255 -127.26 -127.265 -127.27 -127.275 -127.28 -127.285 -127.29 -127.295 -127.3 -127.305 -127.31 -127.315 -127.32 -127.325 -127.33 -127.335 -127.34 -127.345 -127.35 -127.355 -127.36 -127.365 -127.37 -127.375 -127.38 -127.385 -127.39 -127.395 -127.4 -127.405 -127.41 -127.415 -127.42 -127.425 -127.43 -127.435 -127.44 -127.445 -127.45 -127.455 -127.46 -127.465 -127.47 -127.475 -127.48 -127.485 -127.49 -127.495 -127.5 -127.505 -127.51 -127.515 -127.52 -127.525 -127.53 -127.535 -127.54 -127.545 -127.55 -127.555 -127.56 -127.565 -127.57 -127.575 -127.58 -127.585 -127.59 -127.595 -127.6 -127.605 -127.61 -127.615 -127.62 -127.625 -127.63 -127.635 -127.64 -127.645 -127.65 -127.655 -127.66 -127.665 -127.67 -127.675 -127.68 -127.685 -127.69 -127.695 -127.7 -127.705 -127.71 -127.715 -127.72 -127.725 -127.73 -127.735 -127.74 -127.745 -127.75 -127.755 -127.76 -127.765 -127.77 -127.775 -127.78 -127.785 -127.79 -127.795 -127.8 -127.805 -127.81 -127.815 -127.82 -127.825 -127.83 -127.835 -127.84 -127.845 -127.85 -127.855 -127.86 -127.865 -127.87 -127.875 -127.88 -127.885 -127.89 -127.895 -127.9 -127.905 -127.91 -127.915 -127.92 -127.925 -127.93 -127.935 -127.94 -127.945 -127.95 -127.955 -127.96 -127.965 -127.97 -127.975 -127.98 -127.985 -127.99 -127.995 -128 -128.005 -128.01 -128.015 -128.02 -128.025 -128.03 -128.035 -128.04 -128.045 -128.05 -128.055 -128.06 -128.065 -128.07 -128.075 -128.08 -128.085 -128.09 -128.095 -128.1 -128.105 -128.11 -128.115 -128.12 -128.125 -128.13 -128.135 -128.14 -128.145 -128.15 -128.155 -128.16 -128.165 -128.17 -128.175 -128.18 -128.185 -128.19 -128.195 -128.2 -128.205 -128.21 -128.215 -128.22 -128.225 -128.23 -128.235 -128.24 -128.245 -128.25 -128.255 -128.26 -128.265 -128.27 -128.275 -128.28 -128.285 -128.29 -128.295 -128.3 -128.305 -128.31 -128.315 -128.32 -128.325 -128.33 -128.335 -128.34 -128.345 -128.35 -128.355 -128.36 -128.365 -128.37 -128.375 -128.38 -128.385 -128.39 -128.395 -128.4 -128.405 -128.41 -128.415 -128.42 -128.425 -128.43 -128.435 -128.44 -128.445 -128.45 -128.455 -128.46 -128.465 -128.47 -128.475 -128.48 -128.485 -128.49 -128.495 -128.5 -128.505 -128.51 -128.515 -128.52 -128.525 -128.53 -128.535 -128.54 -128.545 -128.55 -128.555 -128.56 -128.565 -128.57 -128.575 -128.58 -128.585 -128.59 -128.595 -128.6 -128.605 -128.61 -128.615 -128.62 -128.625 -128.63 -128.635 -128.64 -128.645 -128.65 -128.655 -128.66 -128.665 -128.67 -128.675 -128.68 -128.685 -128.69 -128.695 -128.7 -128.705 -128.71 -128.715 -128.72 -128.725 -128.73 -128.735 -128.74 -128.745 -128.75 -128.755 -128.76 -128.765 -128.77 -128.775 -128.78 -128.785 -128.79 -128.795 -128.8 -128.805 -128.81 -128.815 -128.82 -128.825 -128.83 -128.835 -128.84 -128.845 -128.85 -128.855 -128.86 -128.865 -128.87 -128.875 -128.88 -128.885 -128.89 -128.895 -128.9 -128.905 -128.91 -128.915 -128.92 -128.925 -128.93 -128.935 -128.94 -128.945 -128.95 -128.955 -128.96 -128.965 -128.97 -128.975 -128.98 -128.985 -128.99 -128.995 -129 -129.005 -129.01 -129.015 -129.02 -129.025 -129.03 -129.035 -129.04 -129.045 -129.05 -129.055 -129.06 -129.065 -129.07 -129.075 -129.08 -129.085 -129.09 -129.095 -129.1 -129.105 -129.11 -129.115 -129.12 -129.125 -129.13 -129.135 -129.14 -129.145 -129.15 -129.155 -129.16 -129.165 -129.17 -129.175 -129.18 -129.185 -129.19 -129.195 -129.2 -129.205 -129.21 -129.215 -129.22 -129.225 -129.23 -129.235 -129.24 -129.245 -129.25 -129.255 -129.26 -129.265 -129.27 -129.275 -129.28 -129.285 -129.29 -129.295 -129.3 -129.305 -129.31 -129.315 -129.32 -129.325 -129.33 -129.335 -129.34 -129.345 -129.35 -129.355 -129.36 -129.365 -129.37 -129.375 -129.38 -129.385 -129.39 -129.395 -129.4 -129.405 -129.41 -129.415 -129.42 -129.425 -129.43 -129.435 -129.44 -129.445 -129.45 -129.455 -129.46 -129.465 -129.47 -129.475 -129.48 -129.485 -129.49 -129.495 -129.5 -129.505 -129.51 -129.515 -129.52 -129.525 -129.53 -129.535 -129.54 -129.545 -129.55 -129.555 -129.56 -129.565 -129.57 -129.575 -129.58 -129.585 -129.59 -129.595 -129.6 -129.605 -129.61 -129.615 -129.62 -129.625 -129.63 -129.635 -129.64 -129.645 -129.65 -129.655 -129.66 -129.665 -129.67 -129.675 -129.68 -129.685 -129.69 -129.695 -129.7 -129.705 -129.71 -129.715 -129.72 -129.725 -129.73 -129.735 -129.74 -129.745 -129.75 -129.755 -129.76 -129.765 -129.77 -129.775 -129.78 -129.785 -129.79 -129.795 -129.8 -129.805 -129.81 -129.815 -129.82 -129.825 -129.83 -129.835 -129.84 -129.845 -129.85 -129.855 -129.86 -129.865 -129.87 -129.875 -129.88 -129.885 -129.89 -129.895 -129.9 -129.905 -129.91 -129.915 -129.92 -129.925 -129.93 -129.935 -129.94 -129.945 -129.95 -129.955 -129.96 -129.965 -129.97 -129.975 -129.98 -129.985 -129.99 -129.995 -130 -130.005 -130.01 -130.015 -130.02 -130.025 -130.03 -130.035 -130.04 -130.045 -130.05 -130.055 -130.06 -130.065 -130.07 -130.075 -130.08 -130.085 -130.09 -130.095 -130.1 -130.105 -130.11 -130.115 -130.12 -130.125 -130.13 -130.135 -130.14 -130.145 -130.15 -130.155 -130.16 -130.165 -130.17 -130.175 -130.18 -130.185 -130.19 -130.195 -130.2 -130.205 -130.21 -130.215 -130.22 -130.225 -130.23 -130.235 -130.24 -130.245 -130.25 -130.255 -130.26 -130.265 -130.27 -130.275 -130.28 -130.285 -130.29 -130.295 -130.3 -130.305 -130.31 -130.315 -130.32 -130.325 -130.33 -130.335 -130.34 -130.345 -130.35 -130.355 -130.36 -130.365 -130.37 -130.375 -130.38 -130.385 -130.39 -130.395 -130.4 -130.405 -130.41 -130.415 -130.42 -130.425 -130.43 -130.435 -130.44 -130.445 -130.45 -130.455 -130.46 -130.465 -130.47 -130.475 -130.48 -130.485 -130.49 -130.495 -130.5 -130.505 -130.51 -130.515 -130.52 -130.525 -130.53 -130.535 -130.54 -130.545 -130.55 -130.555 -130.56 -130.565 -130.57 -130.575 -130.58 -130.585 -130.59 -130.595 -130.6 -130.605 -130.61 -130.615 -130.62 -130.625 -130.63 -130.635 -130.64 -130.645 -130.65 -130.655 -130.66 -130.665 -130.67 -130.675 -130.68 -130.685 -130.69 -130.695 -130.7 -130.705 -130.71 -130.715 -130.72 -130.725 -130.73 -130.735 -130.74 -130.745 -130.75 -130.755 -130.76 -130.765 -130.77 -130.775 -130.78 -130.785 -130.79 -130.795 -130.8 -130.805 -130.81 -130.815 -130.82 -130.825 -130.83 -130.835 -130.84 -130.845 -130.85 -130.855 -130.86 -130.865 -130.87 -130.875 -130.88 -130.885 -130.89 -130.895 -130.9 -130.905 -130.91 -130.915 -130.92 -130.925 -130.93 -130.935 -130.94 -130.945 -130.95 -130.955 -130.96 -130.965 -130.97 -130.975 -130.98 -130.985 -130.99 -130.995 -131 -131.005 -131.01 -131.015 -131.02 -131.025 -131.03 -131.035 -131.04 -131.045 -131.05 -131.055 -131.06 -131.065 -131.07 -131.075 -131.08 -131.085 -131.09 -131.095 -131.1 -131.105 -131.11 -131.115 -131.12 -131.125 -131.13 -131.135 -131.14 -131.145 -131.15 -131.155 -131.16 -131.165 -131.17 -131.175 -131.18 -131.185 -131.19 -131.195 -131.2 -131.205 -131.21 -131.215 -131.22 -131.225 -131.23 -131.235 -131.24 -131.245 -131.25 -131.255 -131.26 -131.265 -131.27 -131.275 -131.28 -131.285 -131.29 -131.295 -131.3 -131.305 -131.31 -131.315 -131.32 -131.325 -131.33 -131.335 -131.34 -131.345 -131.35 -131.355 -131.36 -131.365 -131.37 -131.375 -131.38 -131.385 -131.39 -131.395 -131.4 -131.405 -131.41 -131.415 -131.42 -131.425 -131.43 -131.435 -131.44 -131.445 -131.45 -131.455 -131.46 -131.465 -131.47 -131.475 -131.48 -131.485 -131.49 -131.495 -131.5 -131.505 -131.51 -131.515 -131.52 -131.525 -131.53 -131.535 -131.54 -131.545 -131.55 -131.555 -131.56 -131.565 -131.57 -131.575 -131.58 -131.585 -131.59 -131.595 -131.6 -131.605 -131.61 -131.615 -131.62 -131.625 -131.63 -131.635 -131.64 -131.645 -131.65 -131.655 -131.66 -131.665 -131.67 -131.675 -131.68 -131.685 -131.69 -131.695 -131.7 -131.705 -131.71 -131.715 -131.72 -131.725 -131.73 -131.735 -131.74 -131.745 -131.75 -131.755 -131.76 -131.765 -131.77 -131.775 -131.78 -131.785 -131.79 -131.795 -131.8 -131.805 -131.81 -131.815 -131.82 -131.825 -131.83 -131.835 -131.84 -131.845 -131.85 -131.855 -131.86 -131.865 -131.87 -131.875 -131.88 -131.885 -131.89 -131.895 -131.9 -131.905 -131.91 -131.915 -131.92 -131.925 -131.93 -131.935 -131.94 -131.945 -131.95 -131.955 -131.96 -131.965 -131.97 -131.975 -131.98 -131.985 -131.99 -131.995 -132 -132.005 -132.01 -132.015 -132.02 -132.025 -132.03 -132.035 -132.04 -132.045 -132.05 -132.055 -132.06 -132.065 -132.07 -132.075 -132.08 -132.085 -132.09 -132.095 -132.1 -132.105 -132.11 -132.115 -132.12 -132.125 -132.13 -132.135 -132.14 -132.145 -132.15 -132.155 -132.16 -132.165 -132.17 -132.175 -132.18 -132.185 -132.19 -132.195 -132.2 -132.205 -132.21 -132.215 -132.22 -132.225 -132.23 -132.235 -132.24 -132.245 -132.25 -132.255 -132.26 -132.265 -132.27 -132.275 -132.28 -132.285 -132.29 -132.295 -132.3 -132.305 -132.31 -132.315 -132.32 -132.325 -132.33 -132.335 -132.34 -132.345 -132.35 -132.355 -132.36 -132.365 -132.37 -132.375 -132.38 -132.385 -132.39 -132.395 -132.4 -132.405 -132.41 -132.415 -132.42 -132.425 -132.43 -132.435 -132.44 -132.445 -132.45 -132.455 -132.46 -132.465 -132.47 -132.475 -132.48 -132.485 -132.49 -132.495 -132.5 -132.505 -132.51 -132.515 -132.52 -132.525 -132.53 -132.535 -132.54 -132.545 -132.55 -132.555 -132.56 -132.565 -132.57 -132.575 -132.58 -132.585 -132.59 -132.595 -132.6 -132.605 -132.61 -132.615 -132.62 -132.625 -132.63 -132.635 -132.64 -132.645 -132.65 -132.655 -132.66 -132.665 -132.67 -132.675 -132.68 -132.685 -132.69 -132.695 -132.7 -132.705 -132.71 -132.715 -132.72 -132.725 -132.73 -132.735 -132.74 -132.745 -132.75 -132.755 -132.76 -132.765 -132.77 -132.775 -132.78 -132.785 -132.79 -132.795 -132.8 -132.805 -132.81 -132.815 -132.82 -132.825 -132.83 -132.835 -132.84 -132.845 -132.85 -132.855 -132.86 -132.865 -132.87 -132.875 -132.88 -132.885 -132.89 -132.895 -132.9 -132.905 -132.91 -132.915 -132.92 -132.925 -132.93 -132.935 -132.94 -132.945 -132.95 -132.955 -132.96 -132.965 -132.97 -132.975 -132.98 -132.985 -132.99 -132.995 -133 -133.005 -133.01 -133.015 -133.02 -133.025 -133.03 -133.035 -133.04 -133.045 -133.05 -133.055 -133.06 -133.065 -133.07 -133.075 -133.08 -133.085 -133.09 -133.095 -133.1 -133.105 -133.11 -133.115 -133.12 -133.125 -133.13 -133.135 -133.14 -133.145 -133.15 -133.155 -133.16 -133.165 -133.17 -133.175 -133.18 -133.185 -133.19 -133.195 -133.2 -133.205 -133.21 -133.215 -133.22 -133.225 -133.23 -133.235 -133.24 -133.245 -133.25 -133.255 -133.26 -133.265 -133.27 -133.275 -133.28 -133.285 -133.29 -133.295 -133.3 -133.305 -133.31 -133.315 -133.32 -133.325 -133.33 -133.335 -133.34 -133.345 -133.35 -133.355 -133.36 -133.365 -133.37 -133.375 -133.38 -133.385 -133.39 -133.395 -133.4 -133.405 -133.41 -133.415 -133.42 -133.425 -133.43 -133.435 -133.44 -133.445 -133.45 -133.455 -133.46 -133.465 -133.47 -133.475 -133.48 -133.485 -133.49 -133.495 -133.5 -133.505 -133.51 -133.515 -133.52 -133.525 -133.53 -133.535 -133.54 -133.545 -133.55 -133.555 -133.56 -133.565 -133.57 -133.575 -133.58 -133.585 -133.59 -133.595 -133.6 -133.605 -133.61 -133.615 -133.62 -133.625 -133.63 -133.635 -133.64 -133.645 -133.65 -133.655 -133.66 -133.665 -133.67 -133.675 -133.68 -133.685 -133.69 -133.695 -133.7 -133.705 -133.71 -133.715 -133.72 -133.725 -133.73 -133.735 -133.74 -133.745 -133.75 -133.755 -133.76 -133.765 -133.77 -133.775 -133.78 -133.785 -133.79 -133.795 -133.8 -133.805 -133.81 -133.815 -133.82 -133.825 -133.83 -133.835 -133.84 -133.845 -133.85 -133.855 -133.86 -133.865 -133.87 -133.875 -133.88 -133.885 -133.89 -133.895 -133.9 -133.905 -133.91 -133.915 -133.92 -133.925 -133.93 -133.935 -133.94 -133.945 -133.95 -133.955 -133.96 -133.965 -133.97 -133.975 -133.98 -133.985 -133.99 -133.995 -134 -134.005 -134.01 -134.015 -134.02 -134.025 -134.03 -134.035 -134.04 -134.045 -134.05 -134.055 -134.06 -134.065 -134.07 -134.075 -134.08 -134.085 -134.09 -134.095 -134.1 -134.105 -134.11 -134.115 -134.12 -134.125 -134.13 -134.135 -134.14 -134.145 -134.15 -134.155 -134.16 -134.165 -134.17 -134.175 -134.18 -134.185 -134.19 -134.195 -134.2 -134.205 -134.21 -134.215 -134.22 -134.225 -134.23 -134.235 -134.24 -134.245 -134.25 -134.255 -134.26 -134.265 -134.27 -134.275 -134.28 -134.285 -134.29 -134.295 -134.3 -134.305 -134.31 -134.315 -134.32 -134.325 -134.33 -134.335 -134.34 -134.345 -134.35 -134.355 -134.36 -134.365 -134.37 -134.375 -134.38 -134.385 -134.39 -134.395 -134.4 -134.405 -134.41 -134.415 -134.42 -134.425 -134.43 -134.435 -134.44 -134.445 -134.45 -134.455 -134.46 -134.465 -134.47 -134.475 -134.48 -134.485 -134.49 -134.495 -134.5 -134.505 -134.51 -134.515 -134.52 -134.525 -134.53 -134.535 -134.54 -134.545 -134.55 -134.555 -134.56 -134.565 -134.57 -134.575 -134.58 -134.585 -134.59 -134.595 -134.6 -134.605 -134.61 -134.615 -134.62 -134.625 -134.63 -134.635 -134.64 -134.645 -134.65 -134.655 -134.66 -134.665 -134.67 -134.675 -134.68 -134.685 -134.69 -134.695 -134.7 -134.705 -134.71 -134.715 -134.72 -134.725 -134.73 -134.735 -134.74 -134.745 -134.75 -134.755 -134.76 -134.765 -134.77 -134.775 -134.78 -134.785 -134.79 -134.795 -134.8 -134.805 -134.81 -134.815 -134.82 -134.825 -134.83 -134.835 -134.84 -134.845 -134.85 -134.855 -134.86 -134.865 -134.87 -134.875 -134.88 -134.885 -134.89 -134.895 -134.9 -134.905 -134.91 -134.915 -134.92 -134.925 -134.93 -134.935 -134.94 -134.945 -134.95 -134.955 -134.96 -134.965 -134.97 -134.975 -134.98 -134.985 -134.99 -134.995 -135 -135.005 -135.01 -135.015 -135.02 -135.025 -135.03 -135.035 -135.04 -135.045 -135.05 -135.055 -135.06 -135.065 -135.07 -135.075 -135.08 -135.085 -135.09 -135.095 -135.1 -135.105 -135.11 -135.115 -135.12 -135.125 -135.13 -135.135 -135.14 -135.145 -135.15 -135.155 -135.16 -135.165 -135.17 -135.175 -135.18 -135.185 -135.19 -135.195 -135.2 -135.205 -135.21 -135.215 -135.22 -135.225 -135.23 -135.235 -135.24 -135.245 -135.25 -135.255 -135.26 -135.265 -135.27 -135.275 -135.28 -135.285 -135.29 -135.295 -135.3 -135.305 -135.31 -135.315 -135.32 -135.325 -135.33 -135.335 -135.34 -135.345 -135.35 -135.355 -135.36 -135.365 -135.37 -135.375 -135.38 -135.385 -135.39 -135.395 -135.4 -135.405 -135.41 -135.415 -135.42 -135.425 -135.43 -135.435 -135.44 -135.445 -135.45 -135.455 -135.46 -135.465 -135.47 -135.475 -135.48 -135.485 -135.49 -135.495 -135.5 -135.505 -135.51 -135.515 -135.52 -135.525 -135.53 -135.535 -135.54 -135.545 -135.55 -135.555 -135.56 -135.565 -135.57 -135.575 -135.58 -135.585 -135.59 -135.595 -135.6 -135.605 -135.61 -135.615 -135.62 -135.625 -135.63 -135.635 -135.64 -135.645 -135.65 -135.655 -135.66 -135.665 -135.67 -135.675 -135.68 -135.685 -135.69 -135.695 -135.7 -135.705 -135.71 -135.715 -135.72 -135.725 -135.73 -135.735 -135.74 -135.745 -135.75 -135.755 -135.76 -135.765 -135.77 -135.775 -135.78 -135.785 -135.79 -135.795 -135.8 -135.805 -135.81 -135.815 -135.82 -135.825 -135.83 -135.835 -135.84 -135.845 -135.85 -135.855 -135.86 -135.865 -135.87 -135.875 -135.88 -135.885 -135.89 -135.895 -135.9 -135.905 -135.91 -135.915 -135.92 -135.925 -135.93 -135.935 -135.94 -135.945 -135.95 -135.955 -135.96 -135.965 -135.97 -135.975 -135.98 -135.985 -135.99 -135.995 -136 -136.005 -136.01 -136.015 -136.02 -136.025 -136.03 -136.035 -136.04 -136.045 -136.05 -136.055 -136.06 -136.065 -136.07 -136.075 -136.08 -136.085 -136.09 -136.095 -136.1 -136.105 -136.11 -136.115 -136.12 -136.125 -136.13 -136.135 -136.14 -136.145 -136.15 -136.155 -136.16 -136.165 -136.17 -136.175 -136.18 -136.185 -136.19 -136.195 -136.2 -136.205 -136.21 -136.215 -136.22 -136.225 -136.23 -136.235 -136.24 -136.245 -136.25 -136.255 -136.26 -136.265 -136.27 -136.275 -136.28 -136.285 -136.29 -136.295 -136.3 -136.305 -136.31 -136.315 -136.32 -136.325 -136.33 -136.335 -136.34 -136.345 -136.35 -136.355 -136.36 -136.365 -136.37 -136.375 -136.38 -136.385 -136.39 -136.395 -136.4 -136.405 -136.41 -136.415 -136.42 -136.425 -136.43 -136.435 -136.44 -136.445 -136.45 -136.455 -136.46 -136.465 -136.47 -136.475 -136.48 -136.485 -136.49 -136.495 -136.5 -136.505 -136.51 -136.515 -136.52 -136.525 -136.53 -136.535 -136.54 -136.545 -136.55 -136.555 -136.56 -136.565 -136.57 -136.575 -136.58 -136.585 -136.59 -136.595 -136.6 -136.605 -136.61 -136.615 -136.62 -136.625 -136.63 -136.635 -136.64 -136.645 -136.65 -136.655 -136.66 -136.665 -136.67 -136.675 -136.68 -136.685 -136.69 -136.695 -136.7 -136.705 -136.71 -136.715 -136.72 -136.725 -136.73 -136.735 -136.74 -136.745 -136.75 -136.755 -136.76 -136.765 -136.77 -136.775 -136.78 -136.785 -136.79 -136.795 -136.8 -136.805 -136.81 -136.815 -136.82 -136.825 -136.83 -136.835 -136.84 -136.845 -136.85 -136.855 -136.86 -136.865 -136.87 -136.875 -136.88 -136.885 -136.89 -136.895 -136.9 -136.905 -136.91 -136.915 -136.92 -136.925 -136.93 -136.935 -136.94 -136.945 -136.95 -136.955 -136.96 -136.965 -136.97 -136.975 -136.98 -136.985 -136.99 -136.995 -137 -137.005 -137.01 -137.015 -137.02 -137.025 -137.03 -137.035 -137.04 -137.045 -137.05 -137.055 -137.06 -137.065 -137.07 -137.075 -137.08 -137.085 -137.09 -137.095 -137.1 -137.105 -137.11 -137.115 -137.12 -137.125 -137.13 -137.135 -137.14 -137.145 -137.15 -137.155 -137.16 -137.165 -137.17 -137.175 -137.18 -137.185 -137.19 -137.195 -137.2 -137.205 -137.21 -137.215 -137.22 -137.225 -137.23 -137.235 -137.24 -137.245 -137.25 -137.255 -137.26 -137.265 -137.27 -137.275 -137.28 -137.285 -137.29 -137.295 -137.3 -137.305 -137.31 -137.315 -137.32 -137.325 -137.33 -137.335 -137.34 -137.345 -137.35 -137.355 -137.36 -137.365 -137.37 -137.375 -137.38 -137.385 -137.39 -137.395 -137.4 -137.405 -137.41 -137.415 -137.42 -137.425 -137.43 -137.435 -137.44 -137.445 -137.45 -137.455 -137.46 -137.465 -137.47 -137.475 -137.48 -137.485 -137.49 -137.495 -137.5 -137.505 -137.51 -137.515 -137.52 -137.525 -137.53 -137.535 -137.54 -137.545 -137.55 -137.555 -137.56 -137.565 -137.57 -137.575 -137.58 -137.585 -137.59 -137.595 -137.6 -137.605 -137.61 -137.615 -137.62 -137.625 -137.63 -137.635 -137.64 -137.645 -137.65 -137.655 -137.66 -137.665 -137.67 -137.675 -137.68 -137.685 -137.69 -137.695 -137.7 -137.705 -137.71 -137.715 -137.72 -137.725 -137.73 -137.735 -137.74 -137.745 -137.75 -137.755 -137.76 -137.765 -137.77 -137.775 -137.78 -137.785 -137.79 -137.795 -137.8 -137.805 -137.81 -137.815 -137.82 -137.825 -137.83 -137.835 -137.84 -137.845 -137.85 -137.855 -137.86 -137.865 -137.87 -137.875 -137.88 -137.885 -137.89 -137.895 -137.9 -137.905 -137.91 -137.915 -137.92 -137.925 -137.93 -137.935 -137.94 -137.945 -137.95 -137.955 -137.96 -137.965 -137.97 -137.975 -137.98 -137.985 -137.99 -137.995 -138 -138.005 -138.01 -138.015 -138.02 -138.025 -138.03 -138.035 -138.04 -138.045 -138.05 -138.055 -138.06 -138.065 -138.07 -138.075 -138.08 -138.085 -138.09 -138.095 -138.1 -138.105 -138.11 -138.115 -138.12 -138.125 -138.13 -138.135 -138.14 -138.145 -138.15 -138.155 -138.16 -138.165 -138.17 -138.175 -138.18 -138.185 -138.19 -138.195 -138.2 -138.205 -138.21 -138.215 -138.22 -138.225 -138.23 -138.235 -138.24 -138.245 -138.25 -138.255 -138.26 -138.265 -138.27 -138.275 -138.28 -138.285 -138.29 -138.295 -138.3 -138.305 -138.31 -138.315 -138.32 -138.325 -138.33 -138.335 -138.34 -138.345 -138.35 -138.355 -138.36 -138.365 -138.37 -138.375 -138.38 -138.385 -138.39 -138.395 -138.4 -138.405 -138.41 -138.415 -138.42 -138.425 -138.43 -138.435 -138.44 -138.445 -138.45 -138.455 -138.46 -138.465 -138.47 -138.475 -138.48 -138.485 -138.49 -138.495 -138.5 -138.505 -138.51 -138.515 -138.52 -138.525 -138.53 -138.535 -138.54 -138.545 -138.55 -138.555 -138.56 -138.565 -138.57 -138.575 -138.58 -138.585 -138.59 -138.595 -138.6 -138.605 -138.61 -138.615 -138.62 -138.625 -138.63 -138.635 -138.64 -138.645 -138.65 -138.655 -138.66 -138.665 -138.67 -138.675 -138.68 -138.685 -138.69 -138.695 -138.7 -138.705 -138.71 -138.715 -138.72 -138.725 -138.73 -138.735 -138.74 -138.745 -138.75 -138.755 -138.76 -138.765 -138.77 -138.775 -138.78 -138.785 -138.79 -138.795 -138.8 -138.805 -138.81 -138.815 -138.82 -138.825 -138.83 -138.835 -138.84 -138.845 -138.85 -138.855 -138.86 -138.865 -138.87 -138.875 -138.88 -138.885 -138.89 -138.895 -138.9 -138.905 -138.91 -138.915 -138.92 -138.925 -138.93 -138.935 -138.94 -138.945 -138.95 -138.955 -138.96 -138.965 -138.97 -138.975 -138.98 -138.985 -138.99 -138.995 -139 -139.005 -139.01 -139.015 -139.02 -139.025 -139.03 -139.035 -139.04 -139.045 -139.05 -139.055 -139.06 -139.065 -139.07 -139.075 -139.08 -139.085 -139.09 -139.095 -139.1 -139.105 -139.11 -139.115 -139.12 -139.125 -139.13 -139.135 -139.14 -139.145 -139.15 -139.155 -139.16 -139.165 -139.17 -139.175 -139.18 -139.185 -139.19 -139.195 -139.2 -139.205 -139.21 -139.215 -139.22 -139.225 -139.23 -139.235 -139.24 -139.245 -139.25 -139.255 -139.26 -139.265 -139.27 -139.275 -139.28 -139.285 -139.29 -139.295 -139.3 -139.305 -139.31 -139.315 -139.32 -139.325 -139.33 -139.335 -139.34 -139.345 -139.35 -139.355 -139.36 -139.365 -139.37 -139.375 -139.38 -139.385 -139.39 -139.395 -139.4 -139.405 -139.41 -139.415 -139.42 -139.425 -139.43 -139.435 -139.44 -139.445 -139.45 -139.455 -139.46 -139.465 -139.47 -139.475 -139.48 -139.485 -139.49 -139.495 -139.5 -139.505 -139.51 -139.515 -139.52 -139.525 -139.53 -139.535 -139.54 -139.545 -139.55 -139.555 -139.56 -139.565 -139.57 -139.575 -139.58 -139.585 -139.59 -139.595 -139.6 -139.605 -139.61 -139.615 -139.62 -139.625 -139.63 -139.635 -139.64 -139.645 -139.65 -139.655 -139.66 -139.665 -139.67 -139.675 -139.68 -139.685 -139.69 -139.695 -139.7 -139.705 -139.71 -139.715 -139.72 -139.725 -139.73 -139.735 -139.74 -139.745 -139.75 -139.755 -139.76 -139.765 -139.77 -139.775 -139.78 -139.785 -139.79 -139.795 -139.8 -139.805 -139.81 -139.815 -139.82 -139.825 -139.83 -139.835 -139.84 -139.845 -139.85 -139.855 -139.86 -139.865 -139.87 -139.875 -139.88 -139.885 -139.89 -139.895 -139.9 -139.905 -139.91 -139.915 -139.92 -139.925 -139.93 -139.935 -139.94 -139.945 -139.95 -139.955 -139.96 -139.965 -139.97 -139.975 -139.98 -139.985 -139.99 -139.995 -140 -140.005 -140.01 -140.015 -140.02 -140.025 -140.03 -140.035 -140.04 -140.045 -140.05 -140.055 -140.06 -140.065 -140.07 -140.075 -140.08 -140.085 -140.09 -140.095 -140.1 -140.105 -140.11 -140.115 -140.12 -140.125 -140.13 -140.135 -140.14 -140.145 -140.15 -140.155 -140.16 -140.165 -140.17 -140.175 -140.18 -140.185 -140.19 -140.195 -140.2 -140.205 -140.21 -140.215 -140.22 -140.225 -140.23 -140.235 -140.24 -140.245 -140.25 -140.255 -140.26 -140.265 -140.27 -140.275 -140.28 -140.285 -140.29 -140.295 -140.3 -140.305 -140.31 -140.315 -140.32 -140.325 -140.33 -140.335 -140.34 -140.345 -140.35 -140.355 -140.36 -140.365 -140.37 -140.375 -140.38 -140.385 -140.39 -140.395 -140.4 -140.405 -140.41 -140.415 -140.42 -140.425 -140.43 -140.435 -140.44 -140.445 -140.45 -140.455 -140.46 -140.465 -140.47 -140.475 -140.48 -140.485 -140.49 -140.495 -140.5 -140.505 -140.51 -140.515 -140.52 -140.525 -140.53 -140.535 -140.54 -140.545 -140.55 -140.555 -140.56 -140.565 -140.57 -140.575 -140.58 -140.585 -140.59 -140.595 -140.6 -140.605 -140.61 -140.615 -140.62 -140.625 -140.63 -140.635 -140.64 -140.645 -140.65 -140.655 -140.66 -140.665 -140.67 -140.675 -140.68 -140.685 -140.69 -140.695 -140.7 -140.705 -140.71 -140.715 -140.72 -140.725 -140.73 -140.735 -140.74 -140.745 -140.75 -140.755 -140.76 -140.765 -140.77 -140.775 -140.78 -140.785 -140.79 -140.795 -140.8 -140.805 -140.81 -140.815 -140.82 -140.825 -140.83 -140.835 -140.84 -140.845 -140.85 -140.855 -140.86 -140.865 -140.87 -140.875 -140.88 -140.885 -140.89 -140.895 -140.9 -140.905 -140.91 -140.915 -140.92 -140.925 -140.93 -140.935 -140.94 -140.945 -140.95 -140.955 -140.96 -140.965 -140.97 -140.975 -140.98 -140.985 -140.99 -140.995 -141 -141.005 -141.01 -141.015 -141.02 -141.025 -141.03 -141.035 -141.04 -141.045 -141.05 -141.055 -141.06 -141.065 -141.07 -141.075 -141.08 -141.085 -141.09 -141.095 -141.1 -141.105 -141.11 -141.115 -141.12 -141.125 -141.13 -141.135 -141.14 -141.145 -141.15 -141.155 -141.16 -141.165 -141.17 -141.175 -141.18 -141.185 -141.19 -141.195 -141.2 -141.205 -141.21 -141.215 -141.22 -141.225 -141.23 -141.235 -141.24 -141.245 -141.25 -141.255 -141.26 -141.265 -141.27 -141.275 -141.28 -141.285 -141.29 -141.295 -141.3 -141.305 -141.31 -141.315 -141.32 -141.325 -141.33 -141.335 -141.34 -141.345 -141.35 -141.355 -141.36 -141.365 -141.37 -141.375 -141.38 -141.385 -141.39 -141.395 -141.4 -141.405 -141.41 -141.415 -141.42 -141.425 -141.43 -141.435 -141.44 -141.445 -141.45 -141.455 -141.46 -141.465 -141.47 -141.475 -141.48 -141.485 -141.49 -141.495 -141.5 -141.505 -141.51 -141.515 -141.52 -141.525 -141.53 -141.535 -141.54 -141.545 -141.55 -141.555 -141.56 -141.565 -141.57 -141.575 -141.58 -141.585 -141.59 -141.595 -141.6 -141.605 -141.61 -141.615 -141.62 -141.625 -141.63 -141.635 -141.64 -141.645 -141.65 -141.655 -141.66 -141.665 -141.67 -141.675 -141.68 -141.685 -141.69 -141.695 -141.7 -141.705 -141.71 -141.715 -141.72 -141.725 -141.73 -141.735 -141.74 -141.745 -141.75 -141.755 -141.76 -141.765 -141.77 -141.775 -141.78 -141.785 -141.79 -141.795 -141.8 -141.805 -141.81 -141.815 -141.82 -141.825 -141.83 -141.835 -141.84 -141.845 -141.85 -141.855 -141.86 -141.865 -141.87 -141.875 -141.88 -141.885 -141.89 -141.895 -141.9 -141.905 -141.91 -141.915 -141.92 -141.925 -141.93 -141.935 -141.94 -141.945 -141.95 -141.955 -141.96 -141.965 -141.97 -141.975 -141.98 -141.985 -141.99 -141.995 -142 -142.005 -142.01 -142.015 -142.02 -142.025 -142.03 -142.035 -142.04 -142.045 -142.05 -142.055 -142.06 -142.065 -142.07 -142.075 -142.08 -142.085 -142.09 -142.095 -142.1 -142.105 -142.11 -142.115 -142.12 -142.125 -142.13 -142.135 -142.14 -142.145 -142.15 -142.155 -142.16 -142.165 -142.17 -142.175 -142.18 -142.185 -142.19 -142.195 -142.2 -142.205 -142.21 -142.215 -142.22 -142.225 -142.23 -142.235 -142.24 -142.245 -142.25 -142.255 -142.26 -142.265 -142.27 -142.275 -142.28 -142.285 -142.29 -142.295 -142.3 -142.305 -142.31 -142.315 -142.32 -142.325 -142.33 -142.335 -142.34 -142.345 -142.35 -142.355 -142.36 -142.365 -142.37 -142.375 -142.38 -142.385 -142.39 -142.395 -142.4 -142.405 -142.41 -142.415 -142.42 -142.425 -142.43 -142.435 -142.44 -142.445 -142.45 -142.455 -142.46 -142.465 -142.47 -142.475 -142.48 -142.485 -142.49 -142.495 -142.5 -142.505 -142.51 -142.515 -142.52 -142.525 -142.53 -142.535 -142.54 -142.545 -142.55 -142.555 -142.56 -142.565 -142.57 -142.575 -142.58 -142.585 -142.59 -142.595 -142.6 -142.605 -142.61 -142.615 -142.62 -142.625 -142.63 -142.635 -142.64 -142.645 -142.65 -142.655 -142.66 -142.665 -142.67 -142.675 -142.68 -142.685 -142.69 -142.695 -142.7 -142.705 -142.71 -142.715 -142.72 -142.725 -142.73 -142.735 -142.74 -142.745 -142.75 -142.755 -142.76 -142.765 -142.77 -142.775 -142.78 -142.785 -142.79 -142.795 -142.8 -142.805 -142.81 -142.815 -142.82 -142.825 -142.83 -142.835 -142.84 -142.845 -142.85 -142.855 -142.86 -142.865 -142.87 -142.875 -142.88 -142.885 -142.89 -142.895 -142.9 -142.905 -142.91 -142.915 -142.92 -142.925 -142.93 -142.935 -142.94 -142.945 -142.95 -142.955 -142.96 -142.965 -142.97 -142.975 -142.98 -142.985 -142.99 -142.995 -143 -143.005 -143.01 -143.015 -143.02 -143.025 -143.03 -143.035 -143.04 -143.045 -143.05 -143.055 -143.06 -143.065 -143.07 -143.075 -143.08 -143.085 -143.09 -143.095 -143.1 -143.105 -143.11 -143.115 -143.12 -143.125 -143.13 -143.135 -143.14 -143.145 -143.15 -143.155 -143.16 -143.165 -143.17 -143.175 -143.18 -143.185 -143.19 -143.195 -143.2 -143.205 -143.21 -143.215 -143.22 -143.225 -143.23 -143.235 -143.24 -143.245 -143.25 -143.255 -143.26 -143.265 -143.27 -143.275 -143.28 -143.285 -143.29 -143.295 -143.3 -143.305 -143.31 -143.315 -143.32 -143.325 -143.33 -143.335 -143.34 -143.345 -143.35 -143.355 -143.36 -143.365 -143.37 -143.375 -143.38 -143.385 -143.39 -143.395 -143.4 -143.405 -143.41 -143.415 -143.42 -143.425 -143.43 -143.435 -143.44 -143.445 -143.45 -143.455 -143.46 -143.465 -143.47 -143.475 -143.48 -143.485 -143.49 -143.495 -143.5 -143.505 -143.51 -143.515 -143.52 -143.525 -143.53 -143.535 -143.54 -143.545 -143.55 -143.555 -143.56 -143.565 -143.57 -143.575 -143.58 -143.585 -143.59 -143.595 -143.6 -143.605 -143.61 -143.615 -143.62 -143.625 -143.63 -143.635 -143.64 -143.645 -143.65 -143.655 -143.66 -143.665 -143.67 -143.675 -143.68 -143.685 -143.69 -143.695 -143.7 -143.705 -143.71 -143.715 -143.72 -143.725 -143.73 -143.735 -143.74 -143.745 -143.75 -143.755 -143.76 -143.765 -143.77 -143.775 -143.78 -143.785 -143.79 -143.795 -143.8 -143.805 -143.81 -143.815 -143.82 -143.825 -143.83 -143.835 -143.84 -143.845 -143.85 -143.855 -143.86 -143.865 -143.87 -143.875 -143.88 -143.885 -143.89 -143.895 -143.9 -143.905 -143.91 -143.915 -143.92 -143.925 -143.93 -143.935 -143.94 -143.945 -143.95 -143.955 -143.96 -143.965 -143.97 -143.975 -143.98 -143.985 -143.99 -143.995 -144 -144.005 -144.01 -144.015 -144.02 -144.025 -144.03 -144.035 -144.04 -144.045 -144.05 -144.055 -144.06 -144.065 -144.07 -144.075 -144.08 -144.085 -144.09 -144.095 -144.1 -144.105 -144.11 -144.115 -144.12 -144.125 -144.13 -144.135 -144.14 -144.145 -144.15 -144.155 -144.16 -144.165 -144.17 -144.175 -144.18 -144.185 -144.19 -144.195 -144.2 -144.205 -144.21 -144.215 -144.22 -144.225 -144.23 -144.235 -144.24 -144.245 -144.25 -144.255 -144.26 -144.265 -144.27 -144.275 -144.28 -144.285 -144.29 -144.295 -144.3 -144.305 -144.31 -144.315 -144.32 -144.325 -144.33 -144.335 -144.34 -144.345 -144.35 -144.355 -144.36 -144.365 -144.37 -144.375 -144.38 -144.385 -144.39 -144.395 -144.4 -144.405 -144.41 -144.415 -144.42 -144.425 -144.43 -144.435 -144.44 -144.445 -144.45 -144.455 -144.46 -144.465 -144.47 -144.475 -144.48 -144.485 -144.49 -144.495 -144.5 -144.505 -144.51 -144.515 -144.52 -144.525 -144.53 -144.535 -144.54 -144.545 -144.55 -144.555 -144.56 -144.565 -144.57 -144.575 -144.58 -144.585 -144.59 -144.595 -144.6 -144.605 -144.61 -144.615 -144.62 -144.625 -144.63 -144.635 -144.64 -144.645 -144.65 -144.655 -144.66 -144.665 -144.67 -144.675 -144.68 -144.685 -144.69 -144.695 -144.7 -144.705 -144.71 -144.715 -144.72 -144.725 -144.73 -144.735 -144.74 -144.745 -144.75 -144.755 -144.76 -144.765 -144.77 -144.775 -144.78 -144.785 -144.79 -144.795 -144.8 -144.805 -144.81 -144.815 -144.82 -144.825 -144.83 -144.835 -144.84 -144.845 -144.85 -144.855 -144.86 -144.865 -144.87 -144.875 -144.88 -144.885 -144.89 -144.895 -144.9 -144.905 -144.91 -144.915 -144.92 -144.925 -144.93 -144.935 -144.94 -144.945 -144.95 -144.955 -144.96 -144.965 -144.97 -144.975 -144.98 -144.985 -144.99 -144.995 -145 -145.005 -145.01 -145.015 -145.02 -145.025 -145.03 -145.035 -145.04 -145.045 -145.05 -145.055 -145.06 -145.065 -145.07 -145.075 -145.08 -145.085 -145.09 -145.095 -145.1 -145.105 -145.11 -145.115 -145.12 -145.125 -145.13 -145.135 -145.14 -145.145 -145.15 -145.155 -145.16 -145.165 -145.17 -145.175 -145.18 -145.185 -145.19 -145.195 -145.2 -145.205 -145.21 -145.215 -145.22 -145.225 -145.23 -145.235 -145.24 -145.245 -145.25 -145.255 -145.26 -145.265 -145.27 -145.275 -145.28 -145.285 -145.29 -145.295 -145.3 -145.305 -145.31 -145.315 -145.32 -145.325 -145.33 -145.335 -145.34 -145.345 -145.35 -145.355 -145.36 -145.365 -145.37 -145.375 -145.38 -145.385 -145.39 -145.395 -145.4 -145.405 -145.41 -145.415 -145.42 -145.425 -145.43 -145.435 -145.44 -145.445 -145.45 -145.455 -145.46 -145.465 -145.47 -145.475 -145.48 -145.485 -145.49 -145.495 -145.5 -145.505 -145.51 -145.515 -145.52 -145.525 -145.53 -145.535 -145.54 -145.545 -145.55 -145.555 -145.56 -145.565 -145.57 -145.575 -145.58 -145.585 -145.59 -145.595 -145.6 -145.605 -145.61 -145.615 -145.62 -145.625 -145.63 -145.635 -145.64 -145.645 -145.65 -145.655 -145.66 -145.665 -145.67 -145.675 -145.68 -145.685 -145.69 -145.695 -145.7 -145.705 -145.71 -145.715 -145.72 -145.725 -145.73 -145.735 -145.74 -145.745 -145.75 -145.755 -145.76 -145.765 -145.77 -145.775 -145.78 -145.785 -145.79 -145.795 -145.8 -145.805 -145.81 -145.815 -145.82 -145.825 -145.83 -145.835 -145.84 -145.845 -145.85 -145.855 -145.86 -145.865 -145.87 -145.875 -145.88 -145.885 -145.89 -145.895 -145.9 -145.905 -145.91 -145.915 -145.92 -145.925 -145.93 -145.935 -145.94 -145.945 -145.95 -145.955 -145.96 -145.965 -145.97 -145.975 -145.98 -145.985 -145.99 -145.995 -146 -146.005 -146.01 -146.015 -146.02 -146.025 -146.03 -146.035 -146.04 -146.045 -146.05 -146.055 -146.06 -146.065 -146.07 -146.075 -146.08 -146.085 -146.09 -146.095 -146.1 -146.105 -146.11 -146.115 -146.12 -146.125 -146.13 -146.135 -146.14 -146.145 -146.15 -146.155 -146.16 -146.165 -146.17 -146.175 -146.18 -146.185 -146.19 -146.195 -146.2 -146.205 -146.21 -146.215 -146.22 -146.225 -146.23 -146.235 -146.24 -146.245 -146.25 -146.255 -146.26 -146.265 -146.27 -146.275 -146.28 -146.285 -146.29 -146.295 -146.3 -146.305 -146.31 -146.315 -146.32 -146.325 -146.33 -146.335 -146.34 -146.345 -146.35 -146.355 -146.36 -146.365 -146.37 -146.375 -146.38 -146.385 -146.39 -146.395 -146.4 -146.405 -146.41 -146.415 -146.42 -146.425 -146.43 -146.435 -146.44 -146.445 -146.45 -146.455 -146.46 -146.465 -146.47 -146.475 -146.48 -146.485 -146.49 -146.495 -146.5 -146.505 -146.51 -146.515 -146.52 -146.525 -146.53 -146.535 -146.54 -146.545 -146.55 -146.555 -146.56 -146.565 -146.57 -146.575 -146.58 -146.585 -146.59 -146.595 -146.6 -146.605 -146.61 -146.615 -146.62 -146.625 -146.63 -146.635 -146.64 -146.645 -146.65 -146.655 -146.66 -146.665 -146.67 -146.675 -146.68 -146.685 -146.69 -146.695 -146.7 -146.705 -146.71 -146.715 -146.72 -146.725 -146.73 -146.735 -146.74 -146.745 -146.75 -146.755 -146.76 -146.765 -146.77 -146.775 -146.78 -146.785 -146.79 -146.795 -146.8 -146.805 -146.81 -146.815 -146.82 -146.825 -146.83 -146.835 -146.84 -146.845 -146.85 -146.855 -146.86 -146.865 -146.87 -146.875 -146.88 -146.885 -146.89 -146.895 -146.9 -146.905 -146.91 -146.915 -146.92 -146.925 -146.93 -146.935 -146.94 -146.945 -146.95 -146.955 -146.96 -146.965 -146.97 -146.975 -146.98 -146.985 -146.99 -146.995 -147 -147.005 -147.01 -147.015 -147.02 -147.025 -147.03 -147.035 -147.04 -147.045 -147.05 -147.055 -147.06 -147.065 -147.07 -147.075 -147.08 -147.085 -147.09 -147.095 -147.1 -147.105 -147.11 -147.115 -147.12 -147.125 -147.13 -147.135 -147.14 -147.145 -147.15 -147.155 -147.16 -147.165 -147.17 -147.175 -147.18 -147.185 -147.19 -147.195 -147.2 -147.205 -147.21 -147.215 -147.22 -147.225 -147.23 -147.235 -147.24 -147.245 -147.25 -147.255 -147.26 -147.265 -147.27 -147.275 -147.28 -147.285 -147.29 -147.295 -147.3 -147.305 -147.31 -147.315 -147.32 -147.325 -147.33 -147.335 -147.34 -147.345 -147.35 -147.355 -147.36 -147.365 -147.37 -147.375 -147.38 -147.385 -147.39 -147.395 -147.4 -147.405 -147.41 -147.415 -147.42 -147.425 -147.43 -147.435 -147.44 -147.445 -147.45 -147.455 -147.46 -147.465 -147.47 -147.475 -147.48 -147.485 -147.49 -147.495 -147.5 -147.505 -147.51 -147.515 -147.52 -147.525 -147.53 -147.535 -147.54 -147.545 -147.55 -147.555 -147.56 -147.565 -147.57 -147.575 -147.58 -147.585 -147.59 -147.595 -147.6 -147.605 -147.61 -147.615 -147.62 -147.625 -147.63 -147.635 -147.64 -147.645 -147.65 -147.655 -147.66 -147.665 -147.67 -147.675 -147.68 -147.685 -147.69 -147.695 -147.7 -147.705 -147.71 -147.715 -147.72 -147.725 -147.73 -147.735 -147.74 -147.745 -147.75 -147.755 -147.76 -147.765 -147.77 -147.775 -147.78 -147.785 -147.79 -147.795 -147.8 -147.805 -147.81 -147.815 -147.82 -147.825 -147.83 -147.835 -147.84 -147.845 -147.85 -147.855 -147.86 -147.865 -147.87 -147.875 -147.88 -147.885 -147.89 -147.895 -147.9 -147.905 -147.91 -147.915 -147.92 -147.925 -147.93 -147.935 -147.94 -147.945 -147.95 -147.955 -147.96 -147.965 -147.97 -147.975 -147.98 -147.985 -147.99 -147.995 -148 -148.005 -148.01 -148.015 -148.02 -148.025 -148.03 -148.035 -148.04 -148.045 -148.05 -148.055 -148.06 -148.065 -148.07 -148.075 -148.08 -148.085 -148.09 -148.095 -148.1 -148.105 -148.11 -148.115 -148.12 -148.125 -148.13 -148.135 -148.14 -148.145 -148.15 -148.155 -148.16 -148.165 -148.17 -148.175 -148.18 -148.185 -148.19 -148.195 -148.2 -148.205 -148.21 -148.215 -148.22 -148.225 -148.23 -148.235 -148.24 -148.245 -148.25 -148.255 -148.26 -148.265 -148.27 -148.275 -148.28 -148.285 -148.29 -148.295 -148.3 -148.305 -148.31 -148.315 -148.32 -148.325 -148.33 -148.335 -148.34 -148.345 -148.35 -148.355 -148.36 -148.365 -148.37 -148.375 -148.38 -148.385 -148.39 -148.395 -148.4 -148.405 -148.41 -148.415 -148.42 -148.425 -148.43 -148.435 -148.44 -148.445 -148.45 -148.455 -148.46 -148.465 -148.47 -148.475 -148.48 -148.485 -148.49 -148.495 -148.5 -148.505 -148.51 -148.515 -148.52 -148.525 -148.53 -148.535 -148.54 -148.545 -148.55 -148.555 -148.56 -148.565 -148.57 -148.575 -148.58 -148.585 -148.59 -148.595 -148.6 -148.605 -148.61 -148.615 -148.62 -148.625 -148.63 -148.635 -148.64 -148.645 -148.65 -148.655 -148.66 -148.665 -148.67 -148.675 -148.68 -148.685 -148.69 -148.695 -148.7 -148.705 -148.71 -148.715 -148.72 -148.725 -148.73 -148.735 -148.74 -148.745 -148.75 -148.755 -148.76 -148.765 -148.77 -148.775 -148.78 -148.785 -148.79 -148.795 -148.8 -148.805 -148.81 -148.815 -148.82 -148.825 -148.83 -148.835 -148.84 -148.845 -148.85 -148.855 -148.86 -148.865 -148.87 -148.875 -148.88 -148.885 -148.89 -148.895 -148.9 -148.905 -148.91 -148.915 -148.92 -148.925 -148.93 -148.935 -148.94 -148.945 -148.95 -148.955 -148.96 -148.965 -148.97 -148.975 -148.98 -148.985 -148.99 -148.995 -149 -149.005 -149.01 -149.015 -149.02 -149.025 -149.03 -149.035 -149.04 -149.045 -149.05 -149.055 -149.06 -149.065 -149.07 -149.075 -149.08 -149.085 -149.09 -149.095 -149.1 -149.105 -149.11 -149.115 -149.12 -149.125 -149.13 -149.135 -149.14 -149.145 -149.15 -149.155 -149.16 -149.165 -149.17 -149.175 -149.18 -149.185 -149.19 -149.195 -149.2 -149.205 -149.21 -149.215 -149.22 -149.225 -149.23 -149.235 -149.24 -149.245 -149.25 -149.255 -149.26 -149.265 -149.27 -149.275 -149.28 -149.285 -149.29 -149.295 -149.3 -149.305 -149.31 -149.315 -149.32 -149.325 -149.33 -149.335 -149.34 -149.345 -149.35 -149.355 -149.36 -149.365 -149.37 -149.375 -149.38 -149.385 -149.39 -149.395 -149.4 -149.405 -149.41 -149.415 -149.42 -149.425 -149.43 -149.435 -149.44 -149.445 -149.45 -149.455 -149.46 -149.465 -149.47 -149.475 -149.48 -149.485 -149.49 -149.495 -149.5 -149.505 -149.51 -149.515 -149.52 -149.525 -149.53 -149.535 -149.54 -149.545 -149.55 -149.555 -149.56 -149.565 -149.57 -149.575 -149.58 -149.585 -149.59 -149.595 -149.6 -149.605 -149.61 -149.615 -149.62 -149.625 -149.63 -149.635 -149.64 -149.645 -149.65 -149.655 -149.66 -149.665 -149.67 -149.675 -149.68 -149.685 -149.69 -149.695 -149.7 -149.705 -149.71 -149.715 -149.72 -149.725 -149.73 -149.735 -149.74 -149.745 -149.75 -149.755 -149.76 -149.765 -149.77 -149.775 -149.78 -149.785 -149.79 -149.795 -149.8 -149.805 -149.81 -149.815 -149.82 -149.825 -149.83 -149.835 -149.84 -149.845 -149.85 -149.855 -149.86 -149.865 -149.87 -149.875 -149.88 -149.885 -149.89 -149.895 -149.9 -149.905 -149.91 -149.915 -149.92 -149.925 -149.93 -149.935 -149.94 -149.945 -149.95 -149.955 -149.96 -149.965 -149.97 -149.975 -149.98 -149.985 -149.99 -149.995 -150 -150.005 -150.01 -150.015 -150.02 -150.025 -150.03 -150.035 -150.04 -150.045 -150.05 -150.055 -150.06 -150.065 -150.07 -150.075 -150.08 -150.085 -150.09 -150.095 -150.1 -150.105 -150.11 -150.115 -150.12 -150.125 -150.13 -150.135 -150.14 -150.145 -150.15 -150.155 -150.16 -150.165 -150.17 -150.175 -150.18 -150.185 -150.19 -150.195 -150.2 -150.205 -150.21 -150.215 -150.22 -150.225 -150.23 -150.235 -150.24 -150.245 -150.25 -150.255 -150.26 -150.265 -150.27 -150.275 -150.28 -150.285 -150.29 -150.295 -150.3 -150.305 -150.31 -150.315 -150.32 -150.325 -150.33 -150.335 -150.34 -150.345 -150.35 -150.355 -150.36 -150.365 -150.37 -150.375 -150.38 -150.385 -150.39 -150.395 -150.4 -150.405 -150.41 -150.415 -150.42 -150.425 -150.43 -150.435 -150.44 -150.445 -150.45 -150.455 -150.46 -150.465 -150.47 -150.475 -150.48 -150.485 -150.49 -150.495 -150.5 -150.505 -150.51 -150.515 -150.52 -150.525 -150.53 -150.535 -150.54 -150.545 -150.55 -150.555 -150.56 -150.565 -150.57 -150.575 -150.58 -150.585 -150.59 -150.595 -150.6 -150.605 -150.61 -150.615 -150.62 -150.625 -150.63 -150.635 -150.64 -150.645 -150.65 -150.655 -150.66 -150.665 -150.67 -150.675 -150.68 -150.685 -150.69 -150.695 -150.7 -150.705 -150.71 -150.715 -150.72 -150.725 -150.73 -150.735 -150.74 -150.745 -150.75 -150.755 -150.76 -150.765 -150.77 -150.775 -150.78 -150.785 -150.79 -150.795 -150.8 -150.805 -150.81 -150.815 -150.82 -150.825 -150.83 -150.835 -150.84 -150.845 -150.85 -150.855 -150.86 -150.865 -150.87 -150.875 -150.88 -150.885 -150.89 -150.895 -150.9 -150.905 -150.91 -150.915 -150.92 -150.925 -150.93 -150.935 -150.94 -150.945 -150.95 -150.955 -150.96 -150.965 -150.97 -150.975 -150.98 -150.985 -150.99 -150.995 -151 -151.005 -151.01 -151.015 -151.02 -151.025 -151.03 -151.035 -151.04 -151.045 -151.05 -151.055 -151.06 -151.065 -151.07 -151.075 -151.08 -151.085 -151.09 -151.095 -151.1 -151.105 -151.11 -151.115 -151.12 -151.125 -151.13 -151.135 -151.14 -151.145 -151.15 -151.155 -151.16 -151.165 -151.17 -151.175 -151.18 -151.185 -151.19 -151.195 -151.2 -151.205 -151.21 -151.215 -151.22 -151.225 -151.23 -151.235 -151.24 -151.245 -151.25 -151.255 -151.26 -151.265 -151.27 -151.275 -151.28 -151.285 -151.29 -151.295 -151.3 -151.305 -151.31 -151.315 -151.32 -151.325 -151.33 -151.335 -151.34 -151.345 -151.35 -151.355 -151.36 -151.365 -151.37 -151.375 -151.38 -151.385 -151.39 -151.395 -151.4 -151.405 -151.41 -151.415 -151.42 -151.425 -151.43 -151.435 -151.44 -151.445 -151.45 -151.455 -151.46 -151.465 -151.47 -151.475 -151.48 -151.485 -151.49 -151.495 -151.5 -151.505 -151.51 -151.515 -151.52 -151.525 -151.53 -151.535 -151.54 -151.545 -151.55 -151.555 -151.56 -151.565 -151.57 -151.575 -151.58 -151.585 -151.59 -151.595 -151.6 -151.605 -151.61 -151.615 -151.62 -151.625 -151.63 -151.635 -151.64 -151.645 -151.65 -151.655 -151.66 -151.665 -151.67 -151.675 -151.68 -151.685 -151.69 -151.695 -151.7 -151.705 -151.71 -151.715 -151.72 -151.725 -151.73 -151.735 -151.74 -151.745 -151.75 -151.755 -151.76 -151.765 -151.77 -151.775 -151.78 -151.785 -151.79 -151.795 -151.8 -151.805 -151.81 -151.815 -151.82 -151.825 -151.83 -151.835 -151.84 -151.845 -151.85 -151.855 -151.86 -151.865 -151.87 -151.875 -151.88 -151.885 -151.89 -151.895 -151.9 -151.905 -151.91 -151.915 -151.92 -151.925 -151.93 -151.935 -151.94 -151.945 -151.95 -151.955 -151.96 -151.965 -151.97 -151.975 -151.98 -151.985 -151.99 -151.995 -152 -152.005 -152.01 -152.015 -152.02 -152.025 -152.03 -152.035 -152.04 -152.045 -152.05 -152.055 -152.06 -152.065 -152.07 -152.075 -152.08 -152.085 -152.09 -152.095 -152.1 -152.105 -152.11 -152.115 -152.12 -152.125 -152.13 -152.135 -152.14 -152.145 -152.15 -152.155 -152.16 -152.165 -152.17 -152.175 -152.18 -152.185 -152.19 -152.195 -152.2 -152.205 -152.21 -152.215 -152.22 -152.225 -152.23 -152.235 -152.24 -152.245 -152.25 -152.255 -152.26 -152.265 -152.27 -152.275 -152.28 -152.285 -152.29 -152.295 -152.3 -152.305 -152.31 -152.315 -152.32 -152.325 -152.33 -152.335 -152.34 -152.345 -152.35 -152.355 -152.36 -152.365 -152.37 -152.375 -152.38 -152.385 -152.39 -152.395 -152.4 -152.405 -152.41 -152.415 -152.42 -152.425 -152.43 -152.435 -152.44 -152.445 -152.45 -152.455 -152.46 -152.465 -152.47 -152.475 -152.48 -152.485 -152.49 -152.495 -152.5 -152.505 -152.51 -152.515 -152.52 -152.525 -152.53 -152.535 -152.54 -152.545 -152.55 -152.555 -152.56 -152.565 -152.57 -152.575 -152.58 -152.585 -152.59 -152.595 -152.6 -152.605 -152.61 -152.615 -152.62 -152.625 -152.63 -152.635 -152.64 -152.645 -152.65 -152.655 -152.66 -152.665 -152.67 -152.675 -152.68 -152.685 -152.69 -152.695 -152.7 -152.705 -152.71 -152.715 -152.72 -152.725 -152.73 -152.735 -152.74 -152.745 -152.75 -152.755 -152.76 -152.765 -152.77 -152.775 -152.78 -152.785 -152.79 -152.795 -152.8 -152.805 -152.81 -152.815 -152.82 -152.825 -152.83 -152.835 -152.84 -152.845 -152.85 -152.855 -152.86 -152.865 -152.87 -152.875 -152.88 -152.885 -152.89 -152.895 -152.9 -152.905 -152.91 -152.915 -152.92 -152.925 -152.93 -152.935 -152.94 -152.945 -152.95 -152.955 -152.96 -152.965 -152.97 -152.975 -152.98 -152.985 -152.99 -152.995 -153 -153.005 -153.01 -153.015 -153.02 -153.025 -153.03 -153.035 -153.04 -153.045 -153.05 -153.055 -153.06 -153.065 -153.07 -153.075 -153.08 -153.085 -153.09 -153.095 -153.1 -153.105 -153.11 -153.115 -153.12 -153.125 -153.13 -153.135 -153.14 -153.145 -153.15 -153.155 -153.16 -153.165 -153.17 -153.175 -153.18 -153.185 -153.19 -153.195 -153.2 -153.205 -153.21 -153.215 -153.22 -153.225 -153.23 -153.235 -153.24 -153.245 -153.25 -153.255 -153.26 -153.265 -153.27 -153.275 -153.28 -153.285 -153.29 -153.295 -153.3 -153.305 -153.31 -153.315 -153.32 -153.325 -153.33 -153.335 -153.34 -153.345 -153.35 -153.355 -153.36 -153.365 -153.37 -153.375 -153.38 -153.385 -153.39 -153.395 -153.4 -153.405 -153.41 -153.415 -153.42 -153.425 -153.43 -153.435 -153.44 -153.445 -153.45 -153.455 -153.46 -153.465 -153.47 -153.475 -153.48 -153.485 -153.49 -153.495 -153.5 -153.505 -153.51 -153.515 -153.52 -153.525 -153.53 -153.535 -153.54 -153.545 -153.55 -153.555 -153.56 -153.565 -153.57 -153.575 -153.58 -153.585 -153.59 -153.595 -153.6 -153.605 -153.61 -153.615 -153.62 -153.625 -153.63 -153.635 -153.64 -153.645 -153.65 -153.655 -153.66 -153.665 -153.67 -153.675 -153.68 -153.685 -153.69 -153.695 -153.7 -153.705 -153.71 -153.715 -153.72 -153.725 -153.73 -153.735 -153.74 -153.745 -153.75 -153.755 -153.76 -153.765 -153.77 -153.775 -153.78 -153.785 -153.79 -153.795 -153.8 -153.805 -153.81 -153.815 -153.82 -153.825 -153.83 -153.835 -153.84 -153.845 -153.85 -153.855 -153.86 -153.865 -153.87 -153.875 -153.88 -153.885 -153.89 -153.895 -153.9 -153.905 -153.91 -153.915 -153.92 -153.925 -153.93 -153.935 -153.94 -153.945 -153.95 -153.955 -153.96 -153.965 -153.97 -153.975 -153.98 -153.985 -153.99 -153.995 -154 -154.005 -154.01 -154.015 -154.02 -154.025 -154.03 -154.035 -154.04 -154.045 -154.05 -154.055 -154.06 -154.065 -154.07 -154.075 -154.08 -154.085 -154.09 -154.095 -154.1 -154.105 -154.11 -154.115 -154.12 -154.125 -154.13 -154.135 -154.14 -154.145 -154.15 -154.155 -154.16 -154.165 -154.17 -154.175 -154.18 -154.185 -154.19 -154.195 -154.2 -154.205 -154.21 -154.215 -154.22 -154.225 -154.23 -154.235 -154.24 -154.245 -154.25 -154.255 -154.26 -154.265 -154.27 -154.275 -154.28 -154.285 -154.29 -154.295 -154.3 -154.305 -154.31 -154.315 -154.32 -154.325 -154.33 -154.335 -154.34 -154.345 -154.35 -154.355 -154.36 -154.365 -154.37 -154.375 -154.38 -154.385 -154.39 -154.395 -154.4 -154.405 -154.41 -154.415 -154.42 -154.425 -154.43 -154.435 -154.44 -154.445 -154.45 -154.455 -154.46 -154.465 -154.47 -154.475 -154.48 -154.485 -154.49 -154.495 -154.5 -154.505 -154.51 -154.515 -154.52 -154.525 -154.53 -154.535 -154.54 -154.545 -154.55 -154.555 -154.56 -154.565 -154.57 -154.575 -154.58 -154.585 -154.59 -154.595 -154.6 -154.605 -154.61 -154.615 -154.62 -154.625 -154.63 -154.635 -154.64 -154.645 -154.65 -154.655 -154.66 -154.665 -154.67 -154.675 -154.68 -154.685 -154.69 -154.695 -154.7 -154.705 -154.71 -154.715 -154.72 -154.725 -154.73 -154.735 -154.74 -154.745 -154.75 -154.755 -154.76 -154.765 -154.77 -154.775 -154.78 -154.785 -154.79 -154.795 -154.8 -154.805 -154.81 -154.815 -154.82 -154.825 -154.83 -154.835 -154.84 -154.845 -154.85 -154.855 -154.86 -154.865 -154.87 -154.875 -154.88 -154.885 -154.89 -154.895 -154.9 -154.905 -154.91 -154.915 -154.92 -154.925 -154.93 -154.935 -154.94 -154.945 -154.95 -154.955 -154.96 -154.965 -154.97 -154.975 -154.98 -154.985 -154.99 -154.995 -155 -155.005 -155.01 -155.015 -155.02 -155.025 -155.03 -155.035 -155.04 -155.045 -155.05 -155.055 -155.06 -155.065 -155.07 -155.075 -155.08 -155.085 -155.09 -155.095 -155.1 -155.105 -155.11 -155.115 -155.12 -155.125 -155.13 -155.135 -155.14 -155.145 -155.15 -155.155 -155.16 -155.165 -155.17 -155.175 -155.18 -155.185 -155.19 -155.195 -155.2 -155.205 -155.21 -155.215 -155.22 -155.225 -155.23 -155.235 -155.24 -155.245 -155.25 -155.255 -155.26 -155.265 -155.27 -155.275 -155.28 -155.285 -155.29 -155.295 -155.3 -155.305 -155.31 -155.315 -155.32 -155.325 -155.33 -155.335 -155.34 -155.345 -155.35 -155.355 -155.36 -155.365 -155.37 -155.375 -155.38 -155.385 -155.39 -155.395 -155.4 -155.405 -155.41 -155.415 -155.42 -155.425 -155.43 -155.435 -155.44 -155.445 -155.45 -155.455 -155.46 -155.465 -155.47 -155.475 -155.48 -155.485 -155.49 -155.495 -155.5 -155.505 -155.51 -155.515 -155.52 -155.525 -155.53 -155.535 -155.54 -155.545 -155.55 -155.555 -155.56 -155.565 -155.57 -155.575 -155.58 -155.585 -155.59 -155.595 -155.6 -155.605 -155.61 -155.615 -155.62 -155.625 -155.63 -155.635 -155.64 -155.645 -155.65 -155.655 -155.66 -155.665 -155.67 -155.675 -155.68 -155.685 -155.69 -155.695 -155.7 -155.705 -155.71 -155.715 -155.72 -155.725 -155.73 -155.735 -155.74 -155.745 -155.75 -155.755 -155.76 -155.765 -155.77 -155.775 -155.78 -155.785 -155.79 -155.795 -155.8 -155.805 -155.81 -155.815 -155.82 -155.825 -155.83 -155.835 -155.84 -155.845 -155.85 -155.855 -155.86 -155.865 -155.87 -155.875 -155.88 -155.885 -155.89 -155.895 -155.9 -155.905 -155.91 -155.915 -155.92 -155.925 -155.93 -155.935 -155.94 -155.945 -155.95 -155.955 -155.96 -155.965 -155.97 -155.975 -155.98 -155.985 -155.99 -155.995 -156 -156.005 -156.01 -156.015 -156.02 -156.025 -156.03 -156.035 -156.04 -156.045 -156.05 -156.055 -156.06 -156.065 -156.07 -156.075 -156.08 -156.085 -156.09 -156.095 -156.1 -156.105 -156.11 -156.115 -156.12 -156.125 -156.13 -156.135 -156.14 -156.145 -156.15 -156.155 -156.16 -156.165 -156.17 -156.175 -156.18 -156.185 -156.19 -156.195 -156.2 -156.205 -156.21 -156.215 -156.22 -156.225 -156.23 -156.235 -156.24 -156.245 -156.25 -156.255 -156.26 -156.265 -156.27 -156.275 -156.28 -156.285 -156.29 -156.295 -156.3 -156.305 -156.31 -156.315 -156.32 -156.325 -156.33 -156.335 -156.34 -156.345 -156.35 -156.355 -156.36 -156.365 -156.37 -156.375 -156.38 -156.385 -156.39 -156.395 -156.4 -156.405 -156.41 -156.415 -156.42 -156.425 -156.43 -156.435 -156.44 -156.445 -156.45 -156.455 -156.46 -156.465 -156.47 -156.475 -156.48 -156.485 -156.49 -156.495 -156.5 -156.505 -156.51 -156.515 -156.52 -156.525 -156.53 -156.535 -156.54 -156.545 -156.55 -156.555 -156.56 -156.565 -156.57 -156.575 -156.58 -156.585 -156.59 -156.595 -156.6 -156.605 -156.61 -156.615 -156.62 -156.625 -156.63 -156.635 -156.64 -156.645 -156.65 -156.655 -156.66 -156.665 -156.67 -156.675 -156.68 -156.685 -156.69 -156.695 -156.7 -156.705 -156.71 -156.715 -156.72 -156.725 -156.73 -156.735 -156.74 -156.745 -156.75 -156.755 -156.76 -156.765 -156.77 -156.775 -156.78 -156.785 -156.79 -156.795 -156.8 -156.805 -156.81 -156.815 -156.82 -156.825 -156.83 -156.835 -156.84 -156.845 -156.85 -156.855 -156.86 -156.865 -156.87 -156.875 -156.88 -156.885 -156.89 -156.895 -156.9 -156.905 -156.91 -156.915 -156.92 -156.925 -156.93 -156.935 -156.94 -156.945 -156.95 -156.955 -156.96 -156.965 -156.97 -156.975 -156.98 -156.985 -156.99 -156.995 -157 -157.005 -157.01 -157.015 -157.02 -157.025 -157.03 -157.035 -157.04 -157.045 -157.05 -157.055 -157.06 -157.065 -157.07 -157.075 -157.08 -157.085 -157.09 -157.095 -157.1 -157.105 -157.11 -157.115 -157.12 -157.125 -157.13 -157.135 -157.14 -157.145 -157.15 -157.155 -157.16 -157.165 -157.17 -157.175 -157.18 -157.185 -157.19 -157.195 -157.2 -157.205 -157.21 -157.215 -157.22 -157.225 -157.23 -157.235 -157.24 -157.245 -157.25 -157.255 -157.26 -157.265 -157.27 -157.275 -157.28 -157.285 -157.29 -157.295 -157.3 -157.305 -157.31 -157.315 -157.32 -157.325 -157.33 -157.335 -157.34 -157.345 -157.35 -157.355 -157.36 -157.365 -157.37 -157.375 -157.38 -157.385 -157.39 -157.395 -157.4 -157.405 -157.41 -157.415 -157.42 -157.425 -157.43 -157.435 -157.44 -157.445 -157.45 -157.455 -157.46 -157.465 -157.47 -157.475 -157.48 -157.485 -157.49 -157.495 -157.5 -157.505 -157.51 -157.515 -157.52 -157.525 -157.53 -157.535 -157.54 -157.545 -157.55 -157.555 -157.56 -157.565 -157.57 -157.575 -157.58 -157.585 -157.59 -157.595 -157.6 -157.605 -157.61 -157.615 -157.62 -157.625 -157.63 -157.635 -157.64 -157.645 -157.65 -157.655 -157.66 -157.665 -157.67 -157.675 -157.68 -157.685 -157.69 -157.695 -157.7 -157.705 -157.71 -157.715 -157.72 -157.725 -157.73 -157.735 -157.74 -157.745 -157.75 -157.755 -157.76 -157.765 -157.77 -157.775 -157.78 -157.785 -157.79 -157.795 -157.8 -157.805 -157.81 -157.815 -157.82 -157.825 -157.83 -157.835 -157.84 -157.845 -157.85 -157.855 -157.86 -157.865 -157.87 -157.875 -157.88 -157.885 -157.89 -157.895 -157.9 -157.905 -157.91 -157.915 -157.92 -157.925 -157.93 -157.935 -157.94 -157.945 -157.95 -157.955 -157.96 -157.965 -157.97 -157.975 -157.98 -157.985 -157.99 -157.995 -158 -158.005 -158.01 -158.015 -158.02 -158.025 -158.03 -158.035 -158.04 -158.045 -158.05 -158.055 -158.06 -158.065 -158.07 -158.075 -158.08 -158.085 -158.09 -158.095 -158.1 -158.105 -158.11 -158.115 -158.12 -158.125 -158.13 -158.135 -158.14 -158.145 -158.15 -158.155 -158.16 -158.165 -158.17 -158.175 -158.18 -158.185 -158.19 -158.195 -158.2 -158.205 -158.21 -158.215 -158.22 -158.225 -158.23 -158.235 -158.24 -158.245 -158.25 -158.255 -158.26 -158.265 -158.27 -158.275 -158.28 -158.285 -158.29 -158.295 -158.3 -158.305 -158.31 -158.315 -158.32 -158.325 -158.33 -158.335 -158.34 -158.345 -158.35 -158.355 -158.36 -158.365 -158.37 -158.375 -158.38 -158.385 -158.39 -158.395 -158.4 -158.405 -158.41 -158.415 -158.42 -158.425 -158.43 -158.435 -158.44 -158.445 -158.45 -158.455 -158.46 -158.465 -158.47 -158.475 -158.48 -158.485 -158.49 -158.495 -158.5 -158.505 -158.51 -158.515 -158.52 -158.525 -158.53 -158.535 -158.54 -158.545 -158.55 -158.555 -158.56 -158.565 -158.57 -158.575 -158.58 -158.585 -158.59 -158.595 -158.6 -158.605 -158.61 -158.615 -158.62 -158.625 -158.63 -158.635 -158.64 -158.645 -158.65 -158.655 -158.66 -158.665 -158.67 -158.675 -158.68 -158.685 -158.69 -158.695 -158.7 -158.705 -158.71 -158.715 -158.72 -158.725 -158.73 -158.735 -158.74 -158.745 -158.75 -158.755 -158.76 -158.765 -158.77 -158.775 -158.78 -158.785 -158.79 -158.795 -158.8 -158.805 -158.81 -158.815 -158.82 -158.825 -158.83 -158.835 -158.84 -158.845 -158.85 -158.855 -158.86 -158.865 -158.87 -158.875 -158.88 -158.885 -158.89 -158.895 -158.9 -158.905 -158.91 -158.915 -158.92 -158.925 -158.93 -158.935 -158.94 -158.945 -158.95 -158.955 -158.96 -158.965 -158.97 -158.975 -158.98 -158.985 -158.99 -158.995 -159 -159.005 -159.01 -159.015 -159.02 -159.025 -159.03 -159.035 -159.04 -159.045 -159.05 -159.055 -159.06 -159.065 -159.07 -159.075 -159.08 -159.085 -159.09 -159.095 -159.1 -159.105 -159.11 -159.115 -159.12 -159.125 -159.13 -159.135 -159.14 -159.145 -159.15 -159.155 -159.16 -159.165 -159.17 -159.175 -159.18 -159.185 -159.19 -159.195 -159.2 -159.205 -159.21 -159.215 -159.22 -159.225 -159.23 -159.235 -159.24 -159.245 -159.25 -159.255 -159.26 -159.265 -159.27 -159.275 -159.28 -159.285 -159.29 -159.295 -159.3 -159.305 -159.31 -159.315 -159.32 -159.325 -159.33 -159.335 -159.34 -159.345 -159.35 -159.355 -159.36 -159.365 -159.37 -159.375 -159.38 -159.385 -159.39 -159.395 -159.4 -159.405 -159.41 -159.415 -159.42 -159.425 -159.43 -159.435 -159.44 -159.445 -159.45 -159.455 -159.46 -159.465 -159.47 -159.475 -159.48 -159.485 -159.49 -159.495 -159.5 -159.505 -159.51 -159.515 -159.52 -159.525 -159.53 -159.535 -159.54 -159.545 -159.55 -159.555 -159.56 -159.565 -159.57 -159.575 -159.58 -159.585 -159.59 -159.595 -159.6 -159.605 -159.61 -159.615 -159.62 -159.625 -159.63 -159.635 -159.64 -159.645 -159.65 -159.655 -159.66 -159.665 -159.67 -159.675 -159.68 -159.685 -159.69 -159.695 -159.7 -159.705 -159.71 -159.715 -159.72 -159.725 -159.73 -159.735 -159.74 -159.745 -159.75 -159.755 -159.76 -159.765 -159.77 -159.775 -159.78 -159.785 -159.79 -159.795 -159.8 -159.805 -159.81 -159.815 -159.82 -159.825 -159.83 -159.835 -159.84 -159.845 -159.85 -159.855 -159.86 -159.865 -159.87 -159.875 -159.88 -159.885 -159.89 -159.895 -159.9 -159.905 -159.91 -159.915 -159.92 -159.925 -159.93 -159.935 -159.94 -159.945 -159.95 -159.955 -159.96 -159.965 -159.97 -159.975 -159.98 -159.985 -159.99 -159.995 -160 -160.005 -160.01 -160.015 -160.02 -160.025 -160.03 -160.035 -160.04 -160.045 -160.05 -160.055 -160.06 -160.065 -160.07 -160.075 -160.08 -160.085 -160.09 -160.095 -160.1 -160.105 -160.11 -160.115 -160.12 -160.125 -160.13 -160.135 -160.14 -160.145 -160.15 -160.155 -160.16 -160.165 -160.17 -160.175 -160.18 -160.185 -160.19 -160.195 -160.2 -160.205 -160.21 -160.215 -160.22 -160.225 -160.23 -160.235 -160.24 -160.245 -160.25 -160.255 -160.26 -160.265 -160.27 -160.275 -160.28 -160.285 -160.29 -160.295 -160.3 -160.305 -160.31 -160.315 -160.32 -160.325 -160.33 -160.335 -160.34 -160.345 -160.35 -160.355 -160.36 -160.365 -160.37 -160.375 -160.38 -160.385 -160.39 -160.395 -160.4 -160.405 -160.41 -160.415 -160.42 -160.425 -160.43 -160.435 -160.44 -160.445 -160.45 -160.455 -160.46 -160.465 -160.47 -160.475 -160.48 -160.485 -160.49 -160.495 -160.5 -160.505 -160.51 -160.515 -160.52 -160.525 -160.53 -160.535 -160.54 -160.545 -160.55 -160.555 -160.56 -160.565 -160.57 -160.575 -160.58 -160.585 -160.59 -160.595 -160.6 -160.605 -160.61 -160.615 -160.62 -160.625 -160.63 -160.635 -160.64 -160.645 -160.65 -160.655 -160.66 -160.665 -160.67 -160.675 -160.68 -160.685 -160.69 -160.695 -160.7 -160.705 -160.71 -160.715 -160.72 -160.725 -160.73 -160.735 -160.74 -160.745 -160.75 -160.755 -160.76 -160.765 -160.77 -160.775 -160.78 -160.785 -160.79 -160.795 -160.8 -160.805 -160.81 -160.815 -160.82 -160.825 -160.83 -160.835 -160.84 -160.845 -160.85 -160.855 -160.86 -160.865 -160.87 -160.875 -160.88 -160.885 -160.89 -160.895 -160.9 -160.905 -160.91 -160.915 -160.92 -160.925 -160.93 -160.935 -160.94 -160.945 -160.95 -160.955 -160.96 -160.965 -160.97 -160.975 -160.98 -160.985 -160.99 -160.995 -161 -161.005 -161.01 -161.015 -161.02 -161.025 -161.03 -161.035 -161.04 -161.045 -161.05 -161.055 -161.06 -161.065 -161.07 -161.075 -161.08 -161.085 -161.09 -161.095 -161.1 -161.105 -161.11 -161.115 -161.12 -161.125 -161.13 -161.135 -161.14 -161.145 -161.15 -161.155 -161.16 -161.165 -161.17 -161.175 -161.18 -161.185 -161.19 -161.195 -161.2 -161.205 -161.21 -161.215 -161.22 -161.225 -161.23 -161.235 -161.24 -161.245 -161.25 -161.255 -161.26 -161.265 -161.27 -161.275 -161.28 -161.285 -161.29 -161.295 -161.3 -161.305 -161.31 -161.315 -161.32 -161.325 -161.33 -161.335 -161.34 -161.345 -161.35 -161.355 -161.36 -161.365 -161.37 -161.375 -161.38 -161.385 -161.39 -161.395 -161.4 -161.405 -161.41 -161.415 -161.42 -161.425 -161.43 -161.435 -161.44 -161.445 -161.45 -161.455 -161.46 -161.465 -161.47 -161.475 -161.48 -161.485 -161.49 -161.495 -161.5 -161.505 -161.51 -161.515 -161.52 -161.525 -161.53 -161.535 -161.54 -161.545 -161.55 -161.555 -161.56 -161.565 -161.57 -161.575 -161.58 -161.585 -161.59 -161.595 -161.6 -161.605 -161.61 -161.615 -161.62 -161.625 -161.63 -161.635 -161.64 -161.645 -161.65 -161.655 -161.66 -161.665 -161.67 -161.675 -161.68 -161.685 -161.69 -161.695 -161.7 -161.705 -161.71 -161.715 -161.72 -161.725 -161.73 -161.735 -161.74 -161.745 -161.75 -161.755 -161.76 -161.765 -161.77 -161.775 -161.78 -161.785 -161.79 -161.795 -161.8 -161.805 -161.81 -161.815 -161.82 -161.825 -161.83 -161.835 -161.84 -161.845 -161.85 -161.855 -161.86 -161.865 -161.87 -161.875 -161.88 -161.885 -161.89 -161.895 -161.9 -161.905 -161.91 -161.915 -161.92 -161.925 -161.93 -161.935 -161.94 -161.945 -161.95 -161.955 -161.96 -161.965 -161.97 -161.975 -161.98 -161.985 -161.99 -161.995 -162 -162.005 -162.01 -162.015 -162.02 -162.025 -162.03 -162.035 -162.04 -162.045 -162.05 -162.055 -162.06 -162.065 -162.07 -162.075 -162.08 -162.085 -162.09 -162.095 -162.1 -162.105 -162.11 -162.115 -162.12 -162.125 -162.13 -162.135 -162.14 -162.145 -162.15 -162.155 -162.16 -162.165 -162.17 -162.175 -162.18 -162.185 -162.19 -162.195 -162.2 -162.205 -162.21 -162.215 -162.22 -162.225 -162.23 -162.235 -162.24 -162.245 -162.25 -162.255 -162.26 -162.265 -162.27 -162.275 -162.28 -162.285 -162.29 -162.295 -162.3 -162.305 -162.31 -162.315 -162.32 -162.325 -162.33 -162.335 -162.34 -162.345 -162.35 -162.355 -162.36 -162.365 -162.37 -162.375 -162.38 -162.385 -162.39 -162.395 -162.4 -162.405 -162.41 -162.415 -162.42 -162.425 -162.43 -162.435 -162.44 -162.445 -162.45 -162.455 -162.46 -162.465 -162.47 -162.475 -162.48 -162.485 -162.49 -162.495 -162.5 -162.505 -162.51 -162.515 -162.52 -162.525 -162.53 -162.535 -162.54 -162.545 -162.55 -162.555 -162.56 -162.565 -162.57 -162.575 -162.58 -162.585 -162.59 -162.595 -162.6 -162.605 -162.61 -162.615 -162.62 -162.625 -162.63 -162.635 -162.64 -162.645 -162.65 -162.655 -162.66 -162.665 -162.67 -162.675 -162.68 -162.685 -162.69 -162.695 -162.7 -162.705 -162.71 -162.715 -162.72 -162.725 -162.73 -162.735 -162.74 -162.745 -162.75 -162.755 -162.76 -162.765 -162.77 -162.775 -162.78 -162.785 -162.79 -162.795 -162.8 -162.805 -162.81 -162.815 -162.82 -162.825 -162.83 -162.835 -162.84 -162.845 -162.85 -162.855 -162.86 -162.865 -162.87 -162.875 -162.88 -162.885 -162.89 -162.895 -162.9 -162.905 -162.91 -162.915 -162.92 -162.925 -162.93 -162.935 -162.94 -162.945 -162.95 -162.955 -162.96 -162.965 -162.97 -162.975 -162.98 -162.985 -162.99 -162.995 -163 -163.005 -163.01 -163.015 -163.02 -163.025 -163.03 -163.035 -163.04 -163.045 -163.05 -163.055 -163.06 -163.065 -163.07 -163.075 -163.08 -163.085 -163.09 -163.095 -163.1 -163.105 -163.11 -163.115 -163.12 -163.125 -163.13 -163.135 -163.14 -163.145 -163.15 -163.155 -163.16 -163.165 -163.17 -163.175 -163.18 -163.185 -163.19 -163.195 -163.2 -163.205 -163.21 -163.215 -163.22 -163.225 -163.23 -163.235 -163.24 -163.245 -163.25 -163.255 -163.26 -163.265 -163.27 -163.275 -163.28 -163.285 -163.29 -163.295 -163.3 -163.305 -163.31 -163.315 -163.32 -163.325 -163.33 -163.335 -163.34 -163.345 -163.35 -163.355 -163.36 -163.365 -163.37 -163.375 -163.38 -163.385 -163.39 -163.395 -163.4 -163.405 -163.41 -163.415 -163.42 -163.425 -163.43 -163.435 -163.44 -163.445 -163.45 -163.455 -163.46 -163.465 -163.47 -163.475 -163.48 -163.485 -163.49 -163.495 -163.5 -163.505 -163.51 -163.515 -163.52 -163.525 -163.53 -163.535 -163.54 -163.545 -163.55 -163.555 -163.56 -163.565 -163.57 -163.575 -163.58 -163.585 -163.59 -163.595 -163.6 -163.605 -163.61 -163.615 -163.62 -163.625 -163.63 -163.635 -163.64 -163.645 -163.65 -163.655 -163.66 -163.665 -163.67 -163.675 -163.68 -163.685 -163.69 -163.695 -163.7 -163.705 -163.71 -163.715 -163.72 -163.725 -163.73 -163.735 -163.74 -163.745 -163.75 -163.755 -163.76 -163.765 -163.77 -163.775 -163.78 -163.785 -163.79 -163.795 -163.8 -163.805 -163.81 -163.815 -163.82 -163.825 -163.83 -163.835 -163.84 -163.845 -163.85 -163.855 -163.86 -163.865 -163.87 -163.875 -163.88 -163.885 -163.89 -163.895 -163.9 -163.905 -163.91 -163.915 -163.92 -163.925 -163.93 -163.935 -163.94 -163.945 -163.95 -163.955 -163.96 -163.965 -163.97 -163.975 -163.98 -163.985 -163.99 -163.995 -164 -164.005 -164.01 -164.015 -164.02 -164.025 -164.03 -164.035 -164.04 -164.045 -164.05 -164.055 -164.06 -164.065 -164.07 -164.075 -164.08 -164.085 -164.09 -164.095 -164.1 -164.105 -164.11 -164.115 -164.12 -164.125 -164.13 -164.135 -164.14 -164.145 -164.15 -164.155 -164.16 -164.165 -164.17 -164.175 -164.18 -164.185 -164.19 -164.195 -164.2 -164.205 -164.21 -164.215 -164.22 -164.225 -164.23 -164.235 -164.24 -164.245 -164.25 -164.255 -164.26 -164.265 -164.27 -164.275 -164.28 -164.285 -164.29 -164.295 -164.3 -164.305 -164.31 -164.315 -164.32 -164.325 -164.33 -164.335 -164.34 -164.345 -164.35 -164.355 -164.36 -164.365 -164.37 -164.375 -164.38 -164.385 -164.39 -164.395 -164.4 -164.405 -164.41 -164.415 -164.42 -164.425 -164.43 -164.435 -164.44 -164.445 -164.45 -164.455 -164.46 -164.465 -164.47 -164.475 -164.48 -164.485 -164.49 -164.495 -164.5 -164.505 -164.51 -164.515 -164.52 -164.525 -164.53 -164.535 -164.54 -164.545 -164.55 -164.555 -164.56 -164.565 -164.57 -164.575 -164.58 -164.585 -164.59 -164.595 -164.6 -164.605 -164.61 -164.615 -164.62 -164.625 -164.63 -164.635 -164.64 -164.645 -164.65 -164.655 -164.66 -164.665 -164.67 -164.675 -164.68 -164.685 -164.69 -164.695 -164.7 -164.705 -164.71 -164.715 -164.72 -164.725 -164.73 -164.735 -164.74 -164.745 -164.75 -164.755 -164.76 -164.765 -164.77 -164.775 -164.78 -164.785 -164.79 -164.795 -164.8 -164.805 -164.81 -164.815 -164.82 -164.825 -164.83 -164.835 -164.84 -164.845 -164.85 -164.855 -164.86 -164.865 -164.87 -164.875 -164.88 -164.885 -164.89 -164.895 -164.9 -164.905 -164.91 -164.915 -164.92 -164.925 -164.93 -164.935 -164.94 -164.945 -164.95 -164.955 -164.96 -164.965 -164.97 -164.975 -164.98 -164.985 -164.99 -164.995 -165 -165.005 -165.01 -165.015 -165.02 -165.025 -165.03 -165.035 -165.04 -165.045 -165.05 -165.055 -165.06 -165.065 -165.07 -165.075 -165.08 -165.085 -165.09 -165.095 -165.1 -165.105 -165.11 -165.115 -165.12 -165.125 -165.13 -165.135 -165.14 -165.145 -165.15 -165.155 -165.16 -165.165 -165.17 -165.175 -165.18 -165.185 -165.19 -165.195 -165.2 -165.205 -165.21 -165.215 -165.22 -165.225 -165.23 -165.235 -165.24 -165.245 -165.25 -165.255 -165.26 -165.265 -165.27 -165.275 -165.28 -165.285 -165.29 -165.295 -165.3 -165.305 -165.31 -165.315 -165.32 -165.325 -165.33 -165.335 -165.34 -165.345 -165.35 -165.355 -165.36 -165.365 -165.37 -165.375 -165.38 -165.385 -165.39 -165.395 -165.4 -165.405 -165.41 -165.415 -165.42 -165.425 -165.43 -165.435 -165.44 -165.445 -165.45 -165.455 -165.46 -165.465 -165.47 -165.475 -165.48 -165.485 -165.49 -165.495 -165.5 -165.505 -165.51 -165.515 -165.52 -165.525 -165.53 -165.535 -165.54 -165.545 -165.55 -165.555 -165.56 -165.565 -165.57 -165.575 -165.58 -165.585 -165.59 -165.595 -165.6 -165.605 -165.61 -165.615 -165.62 -165.625 -165.63 -165.635 -165.64 -165.645 -165.65 -165.655 -165.66 -165.665 -165.67 -165.675 -165.68 -165.685 -165.69 -165.695 -165.7 -165.705 -165.71 -165.715 -165.72 -165.725 -165.73 -165.735 -165.74 -165.745 -165.75 -165.755 -165.76 -165.765 -165.77 -165.775 -165.78 -165.785 -165.79 -165.795 -165.8 -165.805 -165.81 -165.815 -165.82 -165.825 -165.83 -165.835 -165.84 -165.845 -165.85 -165.855 -165.86 -165.865 -165.87 -165.875 -165.88 -165.885 -165.89 -165.895 -165.9 -165.905 -165.91 -165.915 -165.92 -165.925 -165.93 -165.935 -165.94 -165.945 -165.95 -165.955 -165.96 -165.965 -165.97 -165.975 -165.98 -165.985 -165.99 -165.995 -166 -166.005 -166.01 -166.015 -166.02 -166.025 -166.03 -166.035 -166.04 -166.045 -166.05 -166.055 -166.06 -166.065 -166.07 -166.075 -166.08 -166.085 -166.09 -166.095 -166.1 -166.105 -166.11 -166.115 -166.12 -166.125 -166.13 -166.135 -166.14 -166.145 -166.15 -166.155 -166.16 -166.165 -166.17 -166.175 -166.18 -166.185 -166.19 -166.195 -166.2 -166.205 -166.21 -166.215 -166.22 -166.225 -166.23 -166.235 -166.24 -166.245 -166.25 -166.255 -166.26 -166.265 -166.27 -166.275 -166.28 -166.285 -166.29 -166.295 -166.3 -166.305 -166.31 -166.315 -166.32 -166.325 -166.33 -166.335 -166.34 -166.345 -166.35 -166.355 -166.36 -166.365 -166.37 -166.375 -166.38 -166.385 -166.39 -166.395 -166.4 -166.405 -166.41 -166.415 -166.42 -166.425 -166.43 -166.435 -166.44 -166.445 -166.45 -166.455 -166.46 -166.465 -166.47 -166.475 -166.48 -166.485 -166.49 -166.495 -166.5 -166.505 -166.51 -166.515 -166.52 -166.525 -166.53 -166.535 -166.54 -166.545 -166.55 -166.555 -166.56 -166.565 -166.57 -166.575 -166.58 -166.585 -166.59 -166.595 -166.6 -166.605 -166.61 -166.615 -166.62 -166.625 -166.63 -166.635 -166.64 -166.645 -166.65 -166.655 -166.66 -166.665 -166.67 -166.675 -166.68 -166.685 -166.69 -166.695 -166.7 -166.705 -166.71 -166.715 -166.72 -166.725 -166.73 -166.735 -166.74 -166.745 -166.75 -166.755 -166.76 -166.765 -166.77 -166.775 -166.78 -166.785 -166.79 -166.795 -166.8 -166.805 -166.81 -166.815 -166.82 -166.825 -166.83 -166.835 -166.84 -166.845 -166.85 -166.855 -166.86 -166.865 -166.87 -166.875 -166.88 -166.885 -166.89 -166.895 -166.9 -166.905 -166.91 -166.915 -166.92 -166.925 -166.93 -166.935 -166.94 -166.945 -166.95 -166.955 -166.96 -166.965 -166.97 -166.975 -166.98 -166.985 -166.99 -166.995 -167 -167.005 -167.01 -167.015 -167.02 -167.025 -167.03 -167.035 -167.04 -167.045 -167.05 -167.055 -167.06 -167.065 -167.07 -167.075 -167.08 -167.085 -167.09 -167.095 -167.1 -167.105 -167.11 -167.115 -167.12 -167.125 -167.13 -167.135 -167.14 -167.145 -167.15 -167.155 -167.16 -167.165 -167.17 -167.175 -167.18 -167.185 -167.19 -167.195 -167.2 -167.205 -167.21 -167.215 -167.22 -167.225 -167.23 -167.235 -167.24 -167.245 -167.25 -167.255 -167.26 -167.265 -167.27 -167.275 -167.28 -167.285 -167.29 -167.295 -167.3 -167.305 -167.31 -167.315 -167.32 -167.325 -167.33 -167.335 -167.34 -167.345 -167.35 -167.355 -167.36 -167.365 -167.37 -167.375 -167.38 -167.385 -167.39 -167.395 -167.4 -167.405 -167.41 -167.415 -167.42 -167.425 -167.43 -167.435 -167.44 -167.445 -167.45 -167.455 -167.46 -167.465 -167.47 -167.475 -167.48 -167.485 -167.49 -167.495 -167.5 -167.505 -167.51 -167.515 -167.52 -167.525 -167.53 -167.535 -167.54 -167.545 -167.55 -167.555 -167.56 -167.565 -167.57 -167.575 -167.58 -167.585 -167.59 -167.595 -167.6 -167.605 -167.61 -167.615 -167.62 -167.625 -167.63 -167.635 -167.64 -167.645 -167.65 -167.655 -167.66 -167.665 -167.67 -167.675 -167.68 -167.685 -167.69 -167.695 -167.7 -167.705 -167.71 -167.715 -167.72 -167.725 -167.73 -167.735 -167.74 -167.745 -167.75 -167.755 -167.76 -167.765 -167.77 -167.775 -167.78 -167.785 -167.79 -167.795 -167.8 -167.805 -167.81 -167.815 -167.82 -167.825 -167.83 -167.835 -167.84 -167.845 -167.85 -167.855 -167.86 -167.865 -167.87 -167.875 -167.88 -167.885 -167.89 -167.895 -167.9 -167.905 -167.91 -167.915 -167.92 -167.925 -167.93 -167.935 -167.94 -167.945 -167.95 -167.955 -167.96 -167.965 -167.97 -167.975 -167.98 -167.985 -167.99 -167.995 -168 -168.005 -168.01 -168.015 -168.02 -168.025 -168.03 -168.035 -168.04 -168.045 -168.05 -168.055 -168.06 -168.065 -168.07 -168.075 -168.08 -168.085 -168.09 -168.095 -168.1 -168.105 -168.11 -168.115 -168.12 -168.125 -168.13 -168.135 -168.14 -168.145 -168.15 -168.155 -168.16 -168.165 -168.17 -168.175 -168.18 -168.185 -168.19 -168.195 -168.2 -168.205 -168.21 -168.215 -168.22 -168.225 -168.23 -168.235 -168.24 -168.245 -168.25 -168.255 -168.26 -168.265 -168.27 -168.275 -168.28 -168.285 -168.29 -168.295 -168.3 -168.305 -168.31 -168.315 -168.32 -168.325 -168.33 -168.335 -168.34 -168.345 -168.35 -168.355 -168.36 -168.365 -168.37 -168.375 -168.38 -168.385 -168.39 -168.395 -168.4 -168.405 -168.41 -168.415 -168.42 -168.425 -168.43 -168.435 -168.44 -168.445 -168.45 -168.455 -168.46 -168.465 -168.47 -168.475 -168.48 -168.485 -168.49 -168.495 -168.5 -168.505 -168.51 -168.515 -168.52 -168.525 -168.53 -168.535 -168.54 -168.545 -168.55 -168.555 -168.56 -168.565 -168.57 -168.575 -168.58 -168.585 -168.59 -168.595 -168.6 -168.605 -168.61 -168.615 -168.62 -168.625 -168.63 -168.635 -168.64 -168.645 -168.65 -168.655 -168.66 -168.665 -168.67 -168.675 -168.68 -168.685 -168.69 -168.695 -168.7 -168.705 -168.71 -168.715 -168.72 -168.725 -168.73 -168.735 -168.74 -168.745 -168.75 -168.755 -168.76 -168.765 -168.77 -168.775 -168.78 -168.785 -168.79 -168.795 -168.8 -168.805 -168.81 -168.815 -168.82 -168.825 -168.83 -168.835 -168.84 -168.845 -168.85 -168.855 -168.86 -168.865 -168.87 -168.875 -168.88 -168.885 -168.89 -168.895 -168.9 -168.905 -168.91 -168.915 -168.92 -168.925 -168.93 -168.935 -168.94 -168.945 -168.95 -168.955 -168.96 -168.965 -168.97 -168.975 -168.98 -168.985 -168.99 -168.995 -169 -169.005 -169.01 -169.015 -169.02 -169.025 -169.03 -169.035 -169.04 -169.045 -169.05 -169.055 -169.06 -169.065 -169.07 -169.075 -169.08 -169.085 -169.09 -169.095 -169.1 -169.105 -169.11 -169.115 -169.12 -169.125 -169.13 -169.135 -169.14 -169.145 -169.15 -169.155 -169.16 -169.165 -169.17 -169.175 -169.18 -169.185 -169.19 -169.195 -169.2 -169.205 -169.21 -169.215 -169.22 -169.225 -169.23 -169.235 -169.24 -169.245 -169.25 -169.255 -169.26 -169.265 -169.27 -169.275 -169.28 -169.285 -169.29 -169.295 -169.3 -169.305 -169.31 -169.315 -169.32 -169.325 -169.33 -169.335 -169.34 -169.345 -169.35 -169.355 -169.36 -169.365 -169.37 -169.375 -169.38 -169.385 -169.39 -169.395 -169.4 -169.405 -169.41 -169.415 -169.42 -169.425 -169.43 -169.435 -169.44 -169.445 -169.45 -169.455 -169.46 -169.465 -169.47 -169.475 -169.48 -169.485 -169.49 -169.495 -169.5 -169.505 -169.51 -169.515 -169.52 -169.525 -169.53 -169.535 -169.54 -169.545 -169.55 -169.555 -169.56 -169.565 -169.57 -169.575 -169.58 -169.585 -169.59 -169.595 -169.6 -169.605 -169.61 -169.615 -169.62 -169.625 -169.63 -169.635 -169.64 -169.645 -169.65 -169.655 -169.66 -169.665 -169.67 -169.675 -169.68 -169.685 -169.69 -169.695 -169.7 -169.705 -169.71 -169.715 -169.72 -169.725 -169.73 -169.735 -169.74 -169.745 -169.75 -169.755 -169.76 -169.765 -169.77 -169.775 -169.78 -169.785 -169.79 -169.795 -169.8 -169.805 -169.81 -169.815 -169.82 -169.825 -169.83 -169.835 -169.84 -169.845 -169.85 -169.855 -169.86 -169.865 -169.87 -169.875 -169.88 -169.885 -169.89 -169.895 -169.9 -169.905 -169.91 -169.915 -169.92 -169.925 -169.93 -169.935 -169.94 -169.945 -169.95 -169.955 -169.96 -169.965 -169.97 -169.975 -169.98 -169.985 -169.99 -169.995 -170 -170.005 -170.01 -170.015 -170.02 -170.025 -170.03 -170.035 -170.04 -170.045 -170.05 -170.055 -170.06 -170.065 -170.07 -170.075 -170.08 -170.085 -170.09 -170.095 -170.1 -170.105 -170.11 -170.115 -170.12 -170.125 -170.13 -170.135 -170.14 -170.145 -170.15 -170.155 -170.16 -170.165 -170.17 -170.175 -170.18 -170.185 -170.19 -170.195 -170.2 -170.205 -170.21 -170.215 -170.22 -170.225 -170.23 -170.235 -170.24 -170.245 -170.25 -170.255 -170.26 -170.265 -170.27 -170.275 -170.28 -170.285 -170.29 -170.295 -170.3 -170.305 -170.31 -170.315 -170.32 -170.325 -170.33 -170.335 -170.34 -170.345 -170.35 -170.355 -170.36 -170.365 -170.37 -170.375 -170.38 -170.385 -170.39 -170.395 -170.4 -170.405 -170.41 -170.415 -170.42 -170.425 -170.43 -170.435 -170.44 -170.445 -170.45 -170.455 -170.46 -170.465 -170.47 -170.475 -170.48 -170.485 -170.49 -170.495 -170.5 -170.505 -170.51 -170.515 -170.52 -170.525 -170.53 -170.535 -170.54 -170.545 -170.55 -170.555 -170.56 -170.565 -170.57 -170.575 -170.58 -170.585 -170.59 -170.595 -170.6 -170.605 -170.61 -170.615 -170.62 -170.625 -170.63 -170.635 -170.64 -170.645 -170.65 -170.655 -170.66 -170.665 -170.67 -170.675 -170.68 -170.685 -170.69 -170.695 -170.7 -170.705 -170.71 -170.715 -170.72 -170.725 -170.73 -170.735 -170.74 -170.745 -170.75 -170.755 -170.76 -170.765 -170.77 -170.775 -170.78 -170.785 -170.79 -170.795 -170.8 -170.805 -170.81 -170.815 -170.82 -170.825 -170.83 -170.835 -170.84 -170.845 -170.85 -170.855 -170.86 -170.865 -170.87 -170.875 -170.88 -170.885 -170.89 -170.895 -170.9 -170.905 -170.91 -170.915 -170.92 -170.925 -170.93 -170.935 -170.94 -170.945 -170.95 -170.955 -170.96 -170.965 -170.97 -170.975 -170.98 -170.985 -170.99 -170.995 -171 -171.005 -171.01 -171.015 -171.02 -171.025 -171.03 -171.035 -171.04 -171.045 -171.05 -171.055 -171.06 -171.065 -171.07 -171.075 -171.08 -171.085 -171.09 -171.095 -171.1 -171.105 -171.11 -171.115 -171.12 -171.125 -171.13 -171.135 -171.14 -171.145 -171.15 -171.155 -171.16 -171.165 -171.17 -171.175 -171.18 -171.185 -171.19 -171.195 -171.2 -171.205 -171.21 -171.215 -171.22 -171.225 -171.23 -171.235 -171.24 -171.245 -171.25 -171.255 -171.26 -171.265 -171.27 -171.275 -171.28 -171.285 -171.29 -171.295 -171.3 -171.305 -171.31 -171.315 -171.32 -171.325 -171.33 -171.335 -171.34 -171.345 -171.35 -171.355 -171.36 -171.365 -171.37 -171.375 -171.38 -171.385 -171.39 -171.395 -171.4 -171.405 -171.41 -171.415 -171.42 -171.425 -171.43 -171.435 -171.44 -171.445 -171.45 -171.455 -171.46 -171.465 -171.47 -171.475 -171.48 -171.485 -171.49 -171.495 -171.5 -171.505 -171.51 -171.515 -171.52 -171.525 -171.53 -171.535 -171.54 -171.545 -171.55 -171.555 -171.56 -171.565 -171.57 -171.575 -171.58 -171.585 -171.59 -171.595 -171.6 -171.605 -171.61 -171.615 -171.62 -171.625 -171.63 -171.635 -171.64 -171.645 -171.65 -171.655 -171.66 -171.665 -171.67 -171.675 -171.68 -171.685 -171.69 -171.695 -171.7 -171.705 -171.71 -171.715 -171.72 -171.725 -171.73 -171.735 -171.74 -171.745 -171.75 -171.755 -171.76 -171.765 -171.77 -171.775 -171.78 -171.785 -171.79 -171.795 -171.8 -171.805 -171.81 -171.815 -171.82 -171.825 -171.83 -171.835 -171.84 -171.845 -171.85 -171.855 -171.86 -171.865 -171.87 -171.875 -171.88 -171.885 -171.89 -171.895 -171.9 -171.905 -171.91 -171.915 -171.92 -171.925 -171.93 -171.935 -171.94 -171.945 -171.95 -171.955 -171.96 -171.965 -171.97 -171.975 -171.98 -171.985 -171.99 -171.995 -172 -172.005 -172.01 -172.015 -172.02 -172.025 -172.03 -172.035 -172.04 -172.045 -172.05 -172.055 -172.06 -172.065 -172.07 -172.075 -172.08 -172.085 -172.09 -172.095 -172.1 -172.105 -172.11 -172.115 -172.12 -172.125 -172.13 -172.135 -172.14 -172.145 -172.15 -172.155 -172.16 -172.165 -172.17 -172.175 -172.18 -172.185 -172.19 -172.195 -172.2 -172.205 -172.21 -172.215 -172.22 -172.225 -172.23 -172.235 -172.24 -172.245 -172.25 -172.255 -172.26 -172.265 -172.27 -172.275 -172.28 -172.285 -172.29 -172.295 -172.3 -172.305 -172.31 -172.315 -172.32 -172.325 -172.33 -172.335 -172.34 -172.345 -172.35 -172.355 -172.36 -172.365 -172.37 -172.375 -172.38 -172.385 -172.39 -172.395 -172.4 -172.405 -172.41 -172.415 -172.42 -172.425 -172.43 -172.435 -172.44 -172.445 -172.45 -172.455 -172.46 -172.465 -172.47 -172.475 -172.48 -172.485 -172.49 -172.495 -172.5 -172.505 -172.51 -172.515 -172.52 -172.525 -172.53 -172.535 -172.54 -172.545 -172.55 -172.555 -172.56 -172.565 -172.57 -172.575 -172.58 -172.585 -172.59 -172.595 -172.6 -172.605 -172.61 -172.615 -172.62 -172.625 -172.63 -172.635 -172.64 -172.645 -172.65 -172.655 -172.66 -172.665 -172.67 -172.675 -172.68 -172.685 -172.69 -172.695 -172.7 -172.705 -172.71 -172.715 -172.72 -172.725 -172.73 -172.735 -172.74 -172.745 -172.75 -172.755 -172.76 -172.765 -172.77 -172.775 -172.78 -172.785 -172.79 -172.795 -172.8 -172.805 -172.81 -172.815 -172.82 -172.825 -172.83 -172.835 -172.84 -172.845 -172.85 -172.855 -172.86 -172.865 -172.87 -172.875 -172.88 -172.885 -172.89 -172.895 -172.9 -172.905 -172.91 -172.915 -172.92 -172.925 -172.93 -172.935 -172.94 -172.945 -172.95 -172.955 -172.96 -172.965 -172.97 -172.975 -172.98 -172.985 -172.99 -172.995 -173 -173.005 -173.01 -173.015 -173.02 -173.025 -173.03 -173.035 -173.04 -173.045 -173.05 -173.055 -173.06 -173.065 -173.07 -173.075 -173.08 -173.085 -173.09 -173.095 -173.1 -173.105 -173.11 -173.115 -173.12 -173.125 -173.13 -173.135 -173.14 -173.145 -173.15 -173.155 -173.16 -173.165 -173.17 -173.175 -173.18 -173.185 -173.19 -173.195 -173.2 -173.205 -173.21 -173.215 -173.22 -173.225 -173.23 -173.235 -173.24 -173.245 -173.25 -173.255 -173.26 -173.265 -173.27 -173.275 -173.28 -173.285 -173.29 -173.295 -173.3 -173.305 -173.31 -173.315 -173.32 -173.325 -173.33 -173.335 -173.34 -173.345 -173.35 -173.355 -173.36 -173.365 -173.37 -173.375 -173.38 -173.385 -173.39 -173.395 -173.4 -173.405 -173.41 -173.415 -173.42 -173.425 -173.43 -173.435 -173.44 -173.445 -173.45 -173.455 -173.46 -173.465 -173.47 -173.475 -173.48 -173.485 -173.49 -173.495 -173.5 -173.505 -173.51 -173.515 -173.52 -173.525 -173.53 -173.535 -173.54 -173.545 -173.55 -173.555 -173.56 -173.565 -173.57 -173.575 -173.58 -173.585 -173.59 -173.595 -173.6 -173.605 -173.61 -173.615 -173.62 -173.625 -173.63 -173.635 -173.64 -173.645 -173.65 -173.655 -173.66 -173.665 -173.67 -173.675 -173.68 -173.685 -173.69 -173.695 -173.7 -173.705 -173.71 -173.715 -173.72 -173.725 -173.73 -173.735 -173.74 -173.745 -173.75 -173.755 -173.76 -173.765 -173.77 -173.775 -173.78 -173.785 -173.79 -173.795 -173.8 -173.805 -173.81 -173.815 -173.82 -173.825 -173.83 -173.835 -173.84 -173.845 -173.85 -173.855 -173.86 -173.865 -173.87 -173.875 -173.88 -173.885 -173.89 -173.895 -173.9 -173.905 -173.91 -173.915 -173.92 -173.925 -173.93 -173.935 -173.94 -173.945 -173.95 -173.955 -173.96 -173.965 -173.97 -173.975 -173.98 -173.985 -173.99 -173.995 -174 -174.005 -174.01 -174.015 -174.02 -174.025 -174.03 -174.035 -174.04 -174.045 -174.05 -174.055 -174.06 -174.065 -174.07 -174.075 -174.08 -174.085 -174.09 -174.095 -174.1 -174.105 -174.11 -174.115 -174.12 -174.125 -174.13 -174.135 -174.14 -174.145 -174.15 -174.155 -174.16 -174.165 -174.17 -174.175 -174.18 -174.185 -174.19 -174.195 -174.2 -174.205 -174.21 -174.215 -174.22 -174.225 -174.23 -174.235 -174.24 -174.245 -174.25 -174.255 -174.26 -174.265 -174.27 -174.275 -174.28 -174.285 -174.29 -174.295 -174.3 -174.305 -174.31 -174.315 -174.32 -174.325 -174.33 -174.335 -174.34 -174.345 -174.35 -174.355 -174.36 -174.365 -174.37 -174.375 -174.38 -174.385 -174.39 -174.395 -174.4 -174.405 -174.41 -174.415 -174.42 -174.425 -174.43 -174.435 -174.44 -174.445 -174.45 -174.455 -174.46 -174.465 -174.47 -174.475 -174.48 -174.485 -174.49 -174.495 -174.5 -174.505 -174.51 -174.515 -174.52 -174.525 -174.53 -174.535 -174.54 -174.545 -174.55 -174.555 -174.56 -174.565 -174.57 -174.575 -174.58 -174.585 -174.59 -174.595 -174.6 -174.605 -174.61 -174.615 -174.62 -174.625 -174.63 -174.635 -174.64 -174.645 -174.65 -174.655 -174.66 -174.665 -174.67 -174.675 -174.68 -174.685 -174.69 -174.695 -174.7 -174.705 -174.71 -174.715 -174.72 -174.725 -174.73 -174.735 -174.74 -174.745 -174.75 -174.755 -174.76 -174.765 -174.77 -174.775 -174.78 -174.785 -174.79 -174.795 -174.8 -174.805 -174.81 -174.815 -174.82 -174.825 -174.83 -174.835 -174.84 -174.845 -174.85 -174.855 -174.86 -174.865 -174.87 -174.875 -174.88 -174.885 -174.89 -174.895 -174.9 -174.905 -174.91 -174.915 -174.92 -174.925 -174.93 -174.935 -174.94 -174.945 -174.95 -174.955 -174.96 -174.965 -174.97 -174.975 -174.98 -174.985 -174.99 -174.995 -175 -175.005 -175.01 -175.015 -175.02 -175.025 -175.03 -175.035 -175.04 -175.045 -175.05 -175.055 -175.06 -175.065 -175.07 -175.075 -175.08 -175.085 -175.09 -175.095 -175.1 -175.105 -175.11 -175.115 -175.12 -175.125 -175.13 -175.135 -175.14 -175.145 -175.15 -175.155 -175.16 -175.165 -175.17 -175.175 -175.18 -175.185 -175.19 -175.195 -175.2 -175.205 -175.21 -175.215 -175.22 -175.225 -175.23 -175.235 -175.24 -175.245 -175.25 -175.255 -175.26 -175.265 -175.27 -175.275 -175.28 -175.285 -175.29 -175.295 -175.3 -175.305 -175.31 -175.315 -175.32 -175.325 -175.33 -175.335 -175.34 -175.345 -175.35 -175.355 -175.36 -175.365 -175.37 -175.375 -175.38 -175.385 -175.39 -175.395 -175.4 -175.405 -175.41 -175.415 -175.42 -175.425 -175.43 -175.435 -175.44 -175.445 -175.45 -175.455 -175.46 -175.465 -175.47 -175.475 -175.48 -175.485 -175.49 -175.495 -175.5 -175.505 -175.51 -175.515 -175.52 -175.525 -175.53 -175.535 -175.54 -175.545 -175.55 -175.555 -175.56 -175.565 -175.57 -175.575 -175.58 -175.585 -175.59 -175.595 -175.6 -175.605 -175.61 -175.615 -175.62 -175.625 -175.63 -175.635 -175.64 -175.645 -175.65 -175.655 -175.66 -175.665 -175.67 -175.675 -175.68 -175.685 -175.69 -175.695 -175.7 -175.705 -175.71 -175.715 -175.72 -175.725 -175.73 -175.735 -175.74 -175.745 -175.75 -175.755 -175.76 -175.765 -175.77 -175.775 -175.78 -175.785 -175.79 -175.795 -175.8 -175.805 -175.81 -175.815 -175.82 -175.825 -175.83 -175.835 -175.84 -175.845 -175.85 -175.855 -175.86 -175.865 -175.87 -175.875 -175.88 -175.885 -175.89 -175.895 -175.9 -175.905 -175.91 -175.915 -175.92 -175.925 -175.93 -175.935 -175.94 -175.945 -175.95 -175.955 -175.96 -175.965 -175.97 -175.975 -175.98 -175.985 -175.99 -175.995 -176 -176.005 -176.01 -176.015 -176.02 -176.025 -176.03 -176.035 -176.04 -176.045 -176.05 -176.055 -176.06 -176.065 -176.07 -176.075 -176.08 -176.085 -176.09 -176.095 -176.1 -176.105 -176.11 -176.115 -176.12 -176.125 -176.13 -176.135 -176.14 -176.145 -176.15 -176.155 -176.16 -176.165 -176.17 -176.175 -176.18 -176.185 -176.19 -176.195 -176.2 -176.205 -176.21 -176.215 -176.22 -176.225 -176.23 -176.235 -176.24 -176.245 -176.25 -176.255 -176.26 -176.265 -176.27 -176.275 -176.28 -176.285 -176.29 -176.295 -176.3 -176.305 -176.31 -176.315 -176.32 -176.325 -176.33 -176.335 -176.34 -176.345 -176.35 -176.355 -176.36 -176.365 -176.37 -176.375 -176.38 -176.385 -176.39 -176.395 -176.4 -176.405 -176.41 -176.415 -176.42 -176.425 -176.43 -176.435 -176.44 -176.445 -176.45 -176.455 -176.46 -176.465 -176.47 -176.475 -176.48 -176.485 -176.49 -176.495 -176.5 -176.505 -176.51 -176.515 -176.52 -176.525 -176.53 -176.535 -176.54 -176.545 -176.55 -176.555 -176.56 -176.565 -176.57 -176.575 -176.58 -176.585 -176.59 -176.595 -176.6 -176.605 -176.61 -176.615 -176.62 -176.625 -176.63 -176.635 -176.64 -176.645 -176.65 -176.655 -176.66 -176.665 -176.67 -176.675 -176.68 -176.685 -176.69 -176.695 -176.7 -176.705 -176.71 -176.715 -176.72 -176.725 -176.73 -176.735 -176.74 -176.745 -176.75 -176.755 -176.76 -176.765 -176.77 -176.775 -176.78 -176.785 -176.79 -176.795 -176.8 -176.805 -176.81 -176.815 -176.82 -176.825 -176.83 -176.835 -176.84 -176.845 -176.85 -176.855 -176.86 -176.865 -176.87 -176.875 -176.88 -176.885 -176.89 -176.895 -176.9 -176.905 -176.91 -176.915 -176.92 -176.925 -176.93 -176.935 -176.94 -176.945 -176.95 -176.955 -176.96 -176.965 -176.97 -176.975 -176.98 -176.985 -176.99 -176.995 -177 -177.005 -177.01 -177.015 -177.02 -177.025 -177.03 -177.035 -177.04 -177.045 -177.05 -177.055 -177.06 -177.065 -177.07 -177.075 -177.08 -177.085 -177.09 -177.095 -177.1 -177.105 -177.11 -177.115 -177.12 -177.125 -177.13 -177.135 -177.14 -177.145 -177.15 -177.155 -177.16 -177.165 -177.17 -177.175 -177.18 -177.185 -177.19 -177.195 -177.2 -177.205 -177.21 -177.215 -177.22 -177.225 -177.23 -177.235 -177.24 -177.245 -177.25 -177.255 -177.26 -177.265 -177.27 -177.275 -177.28 -177.285 -177.29 -177.295 -177.3 -177.305 -177.31 -177.315 -177.32 -177.325 -177.33 -177.335 -177.34 -177.345 -177.35 -177.355 -177.36 -177.365 -177.37 -177.375 -177.38 -177.385 -177.39 -177.395 -177.4 -177.405 -177.41 -177.415 -177.42 -177.425 -177.43 -177.435 -177.44 -177.445 -177.45 -177.455 -177.46 -177.465 -177.47 -177.475 -177.48 -177.485 -177.49 -177.495 -177.5 -177.505 -177.51 -177.515 -177.52 -177.525 -177.53 -177.535 -177.54 -177.545 -177.55 -177.555 -177.56 -177.565 -177.57 -177.575 -177.58 -177.585 -177.59 -177.595 -177.6 -177.605 -177.61 -177.615 -177.62 -177.625 -177.63 -177.635 -177.64 -177.645 -177.65 -177.655 -177.66 -177.665 -177.67 -177.675 -177.68 -177.685 -177.69 -177.695 -177.7 -177.705 -177.71 -177.715 -177.72 -177.725 -177.73 -177.735 -177.74 -177.745 -177.75 -177.755 -177.76 -177.765 -177.77 -177.775 -177.78 -177.785 -177.79 -177.795 -177.8 -177.805 -177.81 -177.815 -177.82 -177.825 -177.83 -177.835 -177.84 -177.845 -177.85 -177.855 -177.86 -177.865 -177.87 -177.875 -177.88 -177.885 -177.89 -177.895 -177.9 -177.905 -177.91 -177.915 -177.92 -177.925 -177.93 -177.935 -177.94 -177.945 -177.95 -177.955 -177.96 -177.965 -177.97 -177.975 -177.98 -177.985 -177.99 -177.995 -178 -178.005 -178.01 -178.015 -178.02 -178.025 -178.03 -178.035 -178.04 -178.045 -178.05 -178.055 -178.06 -178.065 -178.07 -178.075 -178.08 -178.085 -178.09 -178.095 -178.1 -178.105 -178.11 -178.115 -178.12 -178.125 -178.13 -178.135 -178.14 -178.145 -178.15 -178.155 -178.16 -178.165 -178.17 -178.175 -178.18 -178.185 -178.19 -178.195 -178.2 -178.205 -178.21 -178.215 -178.22 -178.225 -178.23 -178.235 -178.24 -178.245 -178.25 -178.255 -178.26 -178.265 -178.27 -178.275 -178.28 -178.285 -178.29 -178.295 -178.3 -178.305 -178.31 -178.315 -178.32 -178.325 -178.33 -178.335 -178.34 -178.345 -178.35 -178.355 -178.36 -178.365 -178.37 -178.375 -178.38 -178.385 -178.39 -178.395 -178.4 -178.405 -178.41 -178.415 -178.42 -178.425 -178.43 -178.435 -178.44 -178.445 -178.45 -178.455 -178.46 -178.465 -178.47 -178.475 -178.48 -178.485 -178.49 -178.495 -178.5 -178.505 -178.51 -178.515 -178.52 -178.525 -178.53 -178.535 -178.54 -178.545 -178.55 -178.555 -178.56 -178.565 -178.57 -178.575 -178.58 -178.585 -178.59 -178.595 -178.6 -178.605 -178.61 -178.615 -178.62 -178.625 -178.63 -178.635 -178.64 -178.645 -178.65 -178.655 -178.66 -178.665 -178.67 -178.675 -178.68 -178.685 -178.69 -178.695 -178.7 -178.705 -178.71 -178.715 -178.72 -178.725 -178.73 -178.735 -178.74 -178.745 -178.75 -178.755 -178.76 -178.765 -178.77 -178.775 -178.78 -178.785 -178.79 -178.795 -178.8 -178.805 -178.81 -178.815 -178.82 -178.825 -178.83 -178.835 -178.84 -178.845 -178.85 -178.855 -178.86 -178.865 -178.87 -178.875 -178.88 -178.885 -178.89 -178.895 -178.9 -178.905 -178.91 -178.915 -178.92 -178.925 -178.93 -178.935 -178.94 -178.945 -178.95 -178.955 -178.96 -178.965 -178.97 -178.975 -178.98 -178.985 -178.99 -178.995 -179 -179.005 -179.01 -179.015 -179.02 -179.025 -179.03 -179.035 -179.04 -179.045 -179.05 -179.055 -179.06 -179.065 -179.07 -179.075 -179.08 -179.085 -179.09 -179.095 -179.1 -179.105 -179.11 -179.115 -179.12 -179.125 -179.13 -179.135 -179.14 -179.145 -179.15 -179.155 -179.16 -179.165 -179.17 -179.175 -179.18 -179.185 -179.19 -179.195 -179.2 -179.205 -179.21 -179.215 -179.22 -179.225 -179.23 -179.235 -179.24 -179.245 -179.25 -179.255 -179.26 -179.265 -179.27 -179.275 -179.28 -179.285 -179.29 -179.295 -179.3 -179.305 -179.31 -179.315 -179.32 -179.325 -179.33 -179.335 -179.34 -179.345 -179.35 -179.355 -179.36 -179.365 -179.37 -179.375 -179.38 -179.385 -179.39 -179.395 -179.4 -179.405 -179.41 -179.415 -179.42 -179.425 -179.43 -179.435 -179.44 -179.445 -179.45 -179.455 -179.46 -179.465 -179.47 -179.475 -179.48 -179.485 -179.49 -179.495 -179.5 -179.505 -179.51 -179.515 -179.52 -179.525 -179.53 -179.535 -179.54 -179.545 -179.55 -179.555 -179.56 -179.565 -179.57 -179.575 -179.58 -179.585 -179.59 -179.595 -179.6 -179.605 -179.61 -179.615 -179.62 -179.625 -179.63 -179.635 -179.64 -179.645 -179.65 -179.655 -179.66 -179.665 -179.67 -179.675 -179.68 -179.685 -179.69 -179.695 -179.7 -179.705 -179.71 -179.715 -179.72 -179.725 -179.73 -179.735 -179.74 -179.745 -179.75 -179.755 -179.76 -179.765 -179.77 -179.775 -179.78 -179.785 -179.79 -179.795 -179.8 -179.805 -179.81 -179.815 -179.82 -179.825 -179.83 -179.835 -179.84 -179.845 -179.85 -179.855 -179.86 -179.865 -179.87 -179.875 -179.88 -179.885 -179.89 -179.895 -179.9 -179.905 -179.91 -179.915 -179.92 -179.925 -179.93 -179.935 -179.94 -179.945 -179.95 -179.955 -179.96 -179.965 -179.97 -179.975 -179.98 -179.985 -179.99 -179.995 -180 -180.005 -180.01 -180.015 -180.02 -180.025 -180.03 -180.035 -180.04 -180.045 -180.05 -180.055 -180.06 -180.065 -180.07 -180.075 -180.08 -180.085 -180.09 -180.095 -180.1 -180.105 -180.11 -180.115 -180.12 -180.125 -180.13 -180.135 -180.14 -180.145 -180.15 -180.155 -180.16 -180.165 -180.17 -180.175 -180.18 -180.185 -180.19 -180.195 -180.2 -180.205 -180.21 -180.215 -180.22 -180.225 -180.23 -180.235 -180.24 -180.245 -180.25 -180.255 -180.26 -180.265 -180.27 -180.275 -180.28 -180.285 -180.29 -180.295 -180.3 -180.305 -180.31 -180.315 -180.32 -180.325 -180.33 -180.335 -180.34 -180.345 -180.35 -180.355 -180.36 -180.365 -180.37 -180.375 -180.38 -180.385 -180.39 -180.395 -180.4 -180.405 -180.41 -180.415 -180.42 -180.425 -180.43 -180.435 -180.44 -180.445 -180.45 -180.455 -180.46 -180.465 -180.47 -180.475 -180.48 -180.485 -180.49 -180.495 -180.5 -180.505 -180.51 -180.515 -180.52 -180.525 -180.53 -180.535 -180.54 -180.545 -180.55 -180.555 -180.56 -180.565 -180.57 -180.575 -180.58 -180.585 -180.59 -180.595 -180.6 -180.605 -180.61 -180.615 -180.62 -180.625 -180.63 -180.635 -180.64 -180.645 -180.65 -180.655 -180.66 -180.665 -180.67 -180.675 -180.68 -180.685 -180.69 -180.695 -180.7 -180.705 -180.71 -180.715 -180.72 -180.725 -180.73 -180.735 -180.74 -180.745 -180.75 -180.755 -180.76 -180.765 -180.77 -180.775 -180.78 -180.785 -180.79 -180.795 -180.8 -180.805 -180.81 -180.815 -180.82 -180.825 -180.83 -180.835 -180.84 -180.845 -180.85 -180.855 -180.86 -180.865 -180.87 -180.875 -180.88 -180.885 -180.89 -180.895 -180.9 -180.905 -180.91 -180.915 -180.92 -180.925 -180.93 -180.935 -180.94 -180.945 -180.95 -180.955 -180.96 -180.965 -180.97 -180.975 -180.98 -180.985 -180.99 -180.995 -181 -181.005 -181.01 -181.015 -181.02 -181.025 -181.03 -181.035 -181.04 -181.045 -181.05 -181.055 -181.06 -181.065 -181.07 -181.075 -181.08 -181.085 -181.09 -181.095 -181.1 -181.105 -181.11 -181.115 -181.12 -181.125 -181.13 -181.135 -181.14 -181.145 -181.15 -181.155 -181.16 -181.165 -181.17 -181.175 -181.18 -181.185 -181.19 -181.195 -181.2 -181.205 -181.21 -181.215 -181.22 -181.225 -181.23 -181.235 -181.24 -181.245 -181.25 -181.255 -181.26 -181.265 -181.27 -181.275 -181.28 -181.285 -181.29 -181.295 -181.3 -181.305 -181.31 -181.315 -181.32 -181.325 -181.33 -181.335 -181.34 -181.345 -181.35 -181.355 -181.36 -181.365 -181.37 -181.375 -181.38 -181.385 -181.39 -181.395 -181.4 -181.405 -181.41 -181.415 -181.42 -181.425 -181.43 -181.435 -181.44 -181.445 -181.45 -181.455 -181.46 -181.465 -181.47 -181.475 -181.48 -181.485 -181.49 -181.495 -181.5 -181.505 -181.51 -181.515 -181.52 -181.525 -181.53 -181.535 -181.54 -181.545 -181.55 -181.555 -181.56 -181.565 -181.57 -181.575 -181.58 -181.585 -181.59 -181.595 -181.6 -181.605 -181.61 -181.615 -181.62 -181.625 -181.63 -181.635 -181.64 -181.645 -181.65 -181.655 -181.66 -181.665 -181.67 -181.675 -181.68 -181.685 -181.69 -181.695 -181.7 -181.705 -181.71 -181.715 -181.72 -181.725 -181.73 -181.735 -181.74 -181.745 -181.75 -181.755 -181.76 -181.765 -181.77 -181.775 -181.78 -181.785 -181.79 -181.795 -181.8 -181.805 -181.81 -181.815 -181.82 -181.825 -181.83 -181.835 -181.84 -181.845 -181.85 -181.855 -181.86 -181.865 -181.87 -181.875 -181.88 -181.885 -181.89 -181.895 -181.9 -181.905 -181.91 -181.915 -181.92 -181.925 -181.93 -181.935 -181.94 -181.945 -181.95 -181.955 -181.96 -181.965 -181.97 -181.975 -181.98 -181.985 -181.99 -181.995 -182 -182.005 -182.01 -182.015 -182.02 -182.025 -182.03 -182.035 -182.04 -182.045 -182.05 -182.055 -182.06 -182.065 -182.07 -182.075 -182.08 -182.085 -182.09 -182.095 -182.1 -182.105 -182.11 -182.115 -182.12 -182.125 -182.13 -182.135 -182.14 -182.145 -182.15 -182.155 -182.16 -182.165 -182.17 -182.175 -182.18 -182.185 -182.19 -182.195 -182.2 -182.205 -182.21 -182.215 -182.22 -182.225 -182.23 -182.235 -182.24 -182.245 -182.25 -182.255 -182.26 -182.265 -182.27 -182.275 -182.28 -182.285 -182.29 -182.295 -182.3 -182.305 -182.31 -182.315 -182.32 -182.325 -182.33 -182.335 -182.34 -182.345 -182.35 -182.355 -182.36 -182.365 -182.37 -182.375 -182.38 -182.385 -182.39 -182.395 -182.4 -182.405 -182.41 -182.415 -182.42 -182.425 -182.43 -182.435 -182.44 -182.445 -182.45 -182.455 -182.46 -182.465 -182.47 -182.475 -182.48 -182.485 -182.49 -182.495 -182.5 -182.505 -182.51 -182.515 -182.52 -182.525 -182.53 -182.535 -182.54 -182.545 -182.55 -182.555 -182.56 -182.565 -182.57 -182.575 -182.58 -182.585 -182.59 -182.595 -182.6 -182.605 -182.61 -182.615 -182.62 -182.625 -182.63 -182.635 -182.64 -182.645 -182.65 -182.655 -182.66 -182.665 -182.67 -182.675 -182.68 -182.685 -182.69 -182.695 -182.7 -182.705 -182.71 -182.715 -182.72 -182.725 -182.73 -182.735 -182.74 -182.745 -182.75 -182.755 -182.76 -182.765 -182.77 -182.775 -182.78 -182.785 -182.79 -182.795 -182.8 -182.805 -182.81 -182.815 -182.82 -182.825 -182.83 -182.835 -182.84 -182.845 -182.85 -182.855 -182.86 -182.865 -182.87 -182.875 -182.88 -182.885 -182.89 -182.895 -182.9 -182.905 -182.91 -182.915 -182.92 -182.925 -182.93 -182.935 -182.94 -182.945 -182.95 -182.955 -182.96 -182.965 -182.97 -182.975 -182.98 -182.985 -182.99 -182.995 -183 -183.005 -183.01 -183.015 -183.02 -183.025 -183.03 -183.035 -183.04 -183.045 -183.05 -183.055 -183.06 -183.065 -183.07 -183.075 -183.08 -183.085 -183.09 -183.095 -183.1 -183.105 -183.11 -183.115 -183.12 -183.125 -183.13 -183.135 -183.14 -183.145 -183.15 -183.155 -183.16 -183.165 -183.17 -183.175 -183.18 -183.185 -183.19 -183.195 -183.2 -183.205 -183.21 -183.215 -183.22 -183.225 -183.23 -183.235 -183.24 -183.245 -183.25 -183.255 -183.26 -183.265 -183.27 -183.275 -183.28 -183.285 -183.29 -183.295 -183.3 -183.305 -183.31 -183.315 -183.32 -183.325 -183.33 -183.335 -183.34 -183.345 -183.35 -183.355 -183.36 -183.365 -183.37 -183.375 -183.38 -183.385 -183.39 -183.395 -183.4 -183.405 -183.41 -183.415 -183.42 -183.425 -183.43 -183.435 -183.44 -183.445 -183.45 -183.455 -183.46 -183.465 -183.47 -183.475 -183.48 -183.485 -183.49 -183.495 -183.5 -183.505 -183.51 -183.515 -183.52 -183.525 -183.53 -183.535 -183.54 -183.545 -183.55 -183.555 -183.56 -183.565 -183.57 -183.575 -183.58 -183.585 -183.59 -183.595 -183.6 -183.605 -183.61 -183.615 -183.62 -183.625 -183.63 -183.635 -183.64 -183.645 -183.65 -183.655 -183.66 -183.665 -183.67 -183.675 -183.68 -183.685 -183.69 -183.695 -183.7 -183.705 -183.71 -183.715 -183.72 -183.725 -183.73 -183.735 -183.74 -183.745 -183.75 -183.755 -183.76 -183.765 -183.77 -183.775 -183.78 -183.785 -183.79 -183.795 -183.8 -183.805 -183.81 -183.815 -183.82 -183.825 -183.83 -183.835 -183.84 -183.845 -183.85 -183.855 -183.86 -183.865 -183.87 -183.875 -183.88 -183.885 -183.89 -183.895 -183.9 -183.905 -183.91 -183.915 -183.92 -183.925 -183.93 -183.935 -183.94 -183.945 -183.95 -183.955 -183.96 -183.965 -183.97 -183.975 -183.98 -183.985 -183.99 -183.995 -184 -184.005 -184.01 -184.015 -184.02 -184.025 -184.03 -184.035 -184.04 -184.045 -184.05 -184.055 -184.06 -184.065 -184.07 -184.075 -184.08 -184.085 -184.09 -184.095 -184.1 -184.105 -184.11 -184.115 -184.12 -184.125 -184.13 -184.135 -184.14 -184.145 -184.15 -184.155 -184.16 -184.165 -184.17 -184.175 -184.18 -184.185 -184.19 -184.195 -184.2 -184.205 -184.21 -184.215 -184.22 -184.225 -184.23 -184.235 -184.24 -184.245 -184.25 -184.255 -184.26 -184.265 -184.27 -184.275 -184.28 -184.285 -184.29 -184.295 -184.3 -184.305 -184.31 -184.315 -184.32 -184.325 -184.33 -184.335 -184.34 -184.345 -184.35 -184.355 -184.36 -184.365 -184.37 -184.375 -184.38 -184.385 -184.39 -184.395 -184.4 -184.405 -184.41 -184.415 -184.42 -184.425 -184.43 -184.435 -184.44 -184.445 -184.45 -184.455 -184.46 -184.465 -184.47 -184.475 -184.48 -184.485 -184.49 -184.495 -184.5 -184.505 -184.51 -184.515 -184.52 -184.525 -184.53 -184.535 -184.54 -184.545 -184.55 -184.555 -184.56 -184.565 -184.57 -184.575 -184.58 -184.585 -184.59 -184.595 -184.6 -184.605 -184.61 -184.615 -184.62 -184.625 -184.63 -184.635 -184.64 -184.645 -184.65 -184.655 -184.66 -184.665 -184.67 -184.675 -184.68 -184.685 -184.69 -184.695 -184.7 -184.705 -184.71 -184.715 -184.72 -184.725 -184.73 -184.735 -184.74 -184.745 -184.75 -184.755 -184.76 -184.765 -184.77 -184.775 -184.78 -184.785 -184.79 -184.795 -184.8 -184.805 -184.81 -184.815 -184.82 -184.825 -184.83 -184.835 -184.84 -184.845 -184.85 -184.855 -184.86 -184.865 -184.87 -184.875 -184.88 -184.885 -184.89 -184.895 -184.9 -184.905 -184.91 -184.915 -184.92 -184.925 -184.93 -184.935 -184.94 -184.945 -184.95 -184.955 -184.96 -184.965 -184.97 -184.975 -184.98 -184.985 -184.99 -184.995 -185 -185.005 -185.01 -185.015 -185.02 -185.025 -185.03 -185.035 -185.04 -185.045 -185.05 -185.055 -185.06 -185.065 -185.07 -185.075 -185.08 -185.085 -185.09 -185.095 -185.1 -185.105 -185.11 -185.115 -185.12 -185.125 -185.13 -185.135 -185.14 -185.145 -185.15 -185.155 -185.16 -185.165 -185.17 -185.175 -185.18 -185.185 -185.19 -185.195 -185.2 -185.205 -185.21 -185.215 -185.22 -185.225 -185.23 -185.235 -185.24 -185.245 -185.25 -185.255 -185.26 -185.265 -185.27 -185.275 -185.28 -185.285 -185.29 -185.295 -185.3 -185.305 -185.31 -185.315 -185.32 -185.325 -185.33 -185.335 -185.34 -185.345 -185.35 -185.355 -185.36 -185.365 -185.37 -185.375 -185.38 -185.385 -185.39 -185.395 -185.4 -185.405 -185.41 -185.415 -185.42 -185.425 -185.43 -185.435 -185.44 -185.445 -185.45 -185.455 -185.46 -185.465 -185.47 -185.475 -185.48 -185.485 -185.49 -185.495 -185.5 -185.505 -185.51 -185.515 -185.52 -185.525 -185.53 -185.535 -185.54 -185.545 -185.55 -185.555 -185.56 -185.565 -185.57 -185.575 -185.58 -185.585 -185.59 -185.595 -185.6 -185.605 -185.61 -185.615 -185.62 -185.625 -185.63 -185.635 -185.64 -185.645 -185.65 -185.655 -185.66 -185.665 -185.67 -185.675 -185.68 -185.685 -185.69 -185.695 -185.7 -185.705 -185.71 -185.715 -185.72 -185.725 -185.73 -185.735 -185.74 -185.745 -185.75 -185.755 -185.76 -185.765 -185.77 -185.775 -185.78 -185.785 -185.79 -185.795 -185.8 -185.805 -185.81 -185.815 -185.82 -185.825 -185.83 -185.835 -185.84 -185.845 -185.85 -185.855 -185.86 -185.865 -185.87 -185.875 -185.88 -185.885 -185.89 -185.895 -185.9 -185.905 -185.91 -185.915 -185.92 -185.925 -185.93 -185.935 -185.94 -185.945 -185.95 -185.955 -185.96 -185.965 -185.97 -185.975 -185.98 -185.985 -185.99 -185.995 -186 -186.005 -186.01 -186.015 -186.02 -186.025 -186.03 -186.035 -186.04 -186.045 -186.05 -186.055 -186.06 -186.065 -186.07 -186.075 -186.08 -186.085 -186.09 -186.095 -186.1 -186.105 -186.11 -186.115 -186.12 -186.125 -186.13 -186.135 -186.14 -186.145 -186.15 -186.155 -186.16 -186.165 -186.17 -186.175 -186.18 -186.185 -186.19 -186.195 -186.2 -186.205 -186.21 -186.215 -186.22 -186.225 -186.23 -186.235 -186.24 -186.245 -186.25 -186.255 -186.26 -186.265 -186.27 -186.275 -186.28 -186.285 -186.29 -186.295 -186.3 -186.305 -186.31 -186.315 -186.32 -186.325 -186.33 -186.335 -186.34 -186.345 -186.35 -186.355 -186.36 -186.365 -186.37 -186.375 -186.38 -186.385 -186.39 -186.395 -186.4 -186.405 -186.41 -186.415 -186.42 -186.425 -186.43 -186.435 -186.44 -186.445 -186.45 -186.455 -186.46 -186.465 -186.47 -186.475 -186.48 -186.485 -186.49 -186.495 -186.5 -186.505 -186.51 -186.515 -186.52 -186.525 -186.53 -186.535 -186.54 -186.545 -186.55 -186.555 -186.56 -186.565 -186.57 -186.575 -186.58 -186.585 -186.59 -186.595 -186.6 -186.605 -186.61 -186.615 -186.62 -186.625 -186.63 -186.635 -186.64 -186.645 -186.65 -186.655 -186.66 -186.665 -186.67 -186.675 -186.68 -186.685 -186.69 -186.695 -186.7 -186.705 -186.71 -186.715 -186.72 -186.725 -186.73 -186.735 -186.74 -186.745 -186.75 -186.755 -186.76 -186.765 -186.77 -186.775 -186.78 -186.785 -186.79 -186.795 -186.8 -186.805 -186.81 -186.815 -186.82 -186.825 -186.83 -186.835 -186.84 -186.845 -186.85 -186.855 -186.86 -186.865 -186.87 -186.875 -186.88 -186.885 -186.89 -186.895 -186.9 -186.905 -186.91 -186.915 -186.92 -186.925 -186.93 -186.935 -186.94 -186.945 -186.95 -186.955 -186.96 -186.965 -186.97 -186.975 -186.98 -186.985 -186.99 -186.995 -187 -187.005 -187.01 -187.015 -187.02 -187.025 -187.03 -187.035 -187.04 -187.045 -187.05 -187.055 -187.06 -187.065 -187.07 -187.075 -187.08 -187.085 -187.09 -187.095 -187.1 -187.105 -187.11 -187.115 -187.12 -187.125 -187.13 -187.135 -187.14 -187.145 -187.15 -187.155 -187.16 -187.165 -187.17 -187.175 -187.18 -187.185 -187.19 -187.195 -187.2 -187.205 -187.21 -187.215 -187.22 -187.225 -187.23 -187.235 -187.24 -187.245 -187.25 -187.255 -187.26 -187.265 -187.27 -187.275 -187.28 -187.285 -187.29 -187.295 -187.3 -187.305 -187.31 -187.315 -187.32 -187.325 -187.33 -187.335 -187.34 -187.345 -187.35 -187.355 -187.36 -187.365 -187.37 -187.375 -187.38 -187.385 -187.39 -187.395 -187.4 -187.405 -187.41 -187.415 -187.42 -187.425 -187.43 -187.435 -187.44 -187.445 -187.45 -187.455 -187.46 -187.465 -187.47 -187.475 -187.48 -187.485 -187.49 -187.495 -187.5 -187.505 -187.51 -187.515 -187.52 -187.525 -187.53 -187.535 -187.54 -187.545 -187.55 -187.555 -187.56 -187.565 -187.57 -187.575 -187.58 -187.585 -187.59 -187.595 -187.6 -187.605 -187.61 -187.615 -187.62 -187.625 -187.63 -187.635 -187.64 -187.645 -187.65 -187.655 -187.66 -187.665 -187.67 -187.675 -187.68 -187.685 -187.69 -187.695 -187.7 -187.705 -187.71 -187.715 -187.72 -187.725 -187.73 -187.735 -187.74 -187.745 -187.75 -187.755 -187.76 -187.765 -187.77 -187.775 -187.78 -187.785 -187.79 -187.795 -187.8 -187.805 -187.81 -187.815 -187.82 -187.825 -187.83 -187.835 -187.84 -187.845 -187.85 -187.855 -187.86 -187.865 -187.87 -187.875 -187.88 -187.885 -187.89 -187.895 -187.9 -187.905 -187.91 -187.915 -187.92 -187.925 -187.93 -187.935 -187.94 -187.945 -187.95 -187.955 -187.96 -187.965 -187.97 -187.975 -187.98 -187.985 -187.99 -187.995 -188 -188.005 -188.01 -188.015 -188.02 -188.025 -188.03 -188.035 -188.04 -188.045 -188.05 -188.055 -188.06 -188.065 -188.07 -188.075 -188.08 -188.085 -188.09 -188.095 -188.1 -188.105 -188.11 -188.115 -188.12 -188.125 -188.13 -188.135 -188.14 -188.145 -188.15 -188.155 -188.16 -188.165 -188.17 -188.175 -188.18 -188.185 -188.19 -188.195 -188.2 -188.205 -188.21 -188.215 -188.22 -188.225 -188.23 -188.235 -188.24 -188.245 -188.25 -188.255 -188.26 -188.265 -188.27 -188.275 -188.28 -188.285 -188.29 -188.295 -188.3 -188.305 -188.31 -188.315 -188.32 -188.325 -188.33 -188.335 -188.34 -188.345 -188.35 -188.355 -188.36 -188.365 -188.37 -188.375 -188.38 -188.385 -188.39 -188.395 -188.4 -188.405 -188.41 -188.415 -188.42 -188.425 -188.43 -188.435 -188.44 -188.445 -188.45 -188.455 -188.46 -188.465 -188.47 -188.475 -188.48 -188.485 -188.49 -188.495 -188.5 -188.505 -188.51 -188.515 -188.52 -188.525 -188.53 -188.535 -188.54 -188.545 -188.55 -188.555 -188.56 -188.565 -188.57 -188.575 -188.58 -188.585 -188.59 -188.595 -188.6 -188.605 -188.61 -188.615 -188.62 -188.625 -188.63 -188.635 -188.64 -188.645 -188.65 -188.655 -188.66 -188.665 -188.67 -188.675 -188.68 -188.685 -188.69 -188.695 -188.7 -188.705 -188.71 -188.715 -188.72 -188.725 -188.73 -188.735 -188.74 -188.745 -188.75 -188.755 -188.76 -188.765 -188.77 -188.775 -188.78 -188.785 -188.79 -188.795 -188.8 -188.805 -188.81 -188.815 -188.82 -188.825 -188.83 -188.835 -188.84 -188.845 -188.85 -188.855 -188.86 -188.865 -188.87 -188.875 -188.88 -188.885 -188.89 -188.895 -188.9 -188.905 -188.91 -188.915 -188.92 -188.925 -188.93 -188.935 -188.94 -188.945 -188.95 -188.955 -188.96 -188.965 -188.97 -188.975 -188.98 -188.985 -188.99 -188.995 -189 -189.005 -189.01 -189.015 -189.02 -189.025 -189.03 -189.035 -189.04 -189.045 -189.05 -189.055 -189.06 -189.065 -189.07 -189.075 -189.08 -189.085 -189.09 -189.095 -189.1 -189.105 -189.11 -189.115 -189.12 -189.125 -189.13 -189.135 -189.14 -189.145 -189.15 -189.155 -189.16 -189.165 -189.17 -189.175 -189.18 -189.185 -189.19 -189.195 -189.2 -189.205 -189.21 -189.215 -189.22 -189.225 -189.23 -189.235 -189.24 -189.245 -189.25 -189.255 -189.26 -189.265 -189.27 -189.275 -189.28 -189.285 -189.29 -189.295 -189.3 -189.305 -189.31 -189.315 -189.32 -189.325 -189.33 -189.335 -189.34 -189.345 -189.35 -189.355 -189.36 -189.365 -189.37 -189.375 -189.38 -189.385 -189.39 -189.395 -189.4 -189.405 -189.41 -189.415 -189.42 -189.425 -189.43 -189.435 -189.44 -189.445 -189.45 -189.455 -189.46 -189.465 -189.47 -189.475 -189.48 -189.485 -189.49 -189.495 -189.5 -189.505 -189.51 -189.515 -189.52 -189.525 -189.53 -189.535 -189.54 -189.545 -189.55 -189.555 -189.56 -189.565 -189.57 -189.575 -189.58 -189.585 -189.59 -189.595 -189.6 -189.605 -189.61 -189.615 -189.62 -189.625 -189.63 -189.635 -189.64 -189.645 -189.65 -189.655 -189.66 -189.665 -189.67 -189.675 -189.68 -189.685 -189.69 -189.695 -189.7 -189.705 -189.71 -189.715 -189.72 -189.725 -189.73 -189.735 -189.74 -189.745 -189.75 -189.755 -189.76 -189.765 -189.77 -189.775 -189.78 -189.785 -189.79 -189.795 -189.8 -189.805 -189.81 -189.815 -189.82 -189.825 -189.83 -189.835 -189.84 -189.845 -189.85 -189.855 -189.86 -189.865 -189.87 -189.875 -189.88 -189.885 -189.89 -189.895 -189.9 -189.905 -189.91 -189.915 -189.92 -189.925 -189.93 -189.935 -189.94 -189.945 -189.95 -189.955 -189.96 -189.965 -189.97 -189.975 -189.98 -189.985 -189.99 -189.995 -190 -190.005 -190.01 -190.015 -190.02 -190.025 -190.03 -190.035 -190.04 -190.045 -190.05 -190.055 -190.06 -190.065 -190.07 -190.075 -190.08 -190.085 -190.09 -190.095 -190.1 -190.105 -190.11 -190.115 -190.12 -190.125 -190.13 -190.135 -190.14 -190.145 -190.15 -190.155 -190.16 -190.165 -190.17 -190.175 -190.18 -190.185 -190.19 -190.195 -190.2 -190.205 -190.21 -190.215 -190.22 -190.225 -190.23 -190.235 -190.24 -190.245 -190.25 -190.255 -190.26 -190.265 -190.27 -190.275 -190.28 -190.285 -190.29 -190.295 -190.3 -190.305 -190.31 -190.315 -190.32 -190.325 -190.33 -190.335 -190.34 -190.345 -190.35 -190.355 -190.36 -190.365 -190.37 -190.375 -190.38 -190.385 -190.39 -190.395 -190.4 -190.405 -190.41 -190.415 -190.42 -190.425 -190.43 -190.435 -190.44 -190.445 -190.45 -190.455 -190.46 -190.465 -190.47 -190.475 -190.48 -190.485 -190.49 -190.495 -190.5 -190.505 -190.51 -190.515 -190.52 -190.525 -190.53 -190.535 -190.54 -190.545 -190.55 -190.555 -190.56 -190.565 -190.57 -190.575 -190.58 -190.585 -190.59 -190.595 -190.6 -190.605 -190.61 -190.615 -190.62 -190.625 -190.63 -190.635 -190.64 -190.645 -190.65 -190.655 -190.66 -190.665 -190.67 -190.675 -190.68 -190.685 -190.69 -190.695 -190.7 -190.705 -190.71 -190.715 -190.72 -190.725 -190.73 -190.735 -190.74 -190.745 -190.75 -190.755 -190.76 -190.765 -190.77 -190.775 -190.78 -190.785 -190.79 -190.795 -190.8 -190.805 -190.81 -190.815 -190.82 -190.825 -190.83 -190.835 -190.84 -190.845 -190.85 -190.855 -190.86 -190.865 -190.87 -190.875 -190.88 -190.885 -190.89 -190.895 -190.9 -190.905 -190.91 -190.915 -190.92 -190.925 -190.93 -190.935 -190.94 -190.945 -190.95 -190.955 -190.96 -190.965 -190.97 -190.975 -190.98 -190.985 -190.99 -190.995 -191 -191.005 -191.01 -191.015 -191.02 -191.025 -191.03 -191.035 -191.04 -191.045 -191.05 -191.055 -191.06 -191.065 -191.07 -191.075 -191.08 -191.085 -191.09 -191.095 -191.1 -191.105 -191.11 -191.115 -191.12 -191.125 -191.13 -191.135 -191.14 -191.145 -191.15 -191.155 -191.16 -191.165 -191.17 -191.175 -191.18 -191.185 -191.19 -191.195 -191.2 -191.205 -191.21 -191.215 -191.22 -191.225 -191.23 -191.235 -191.24 -191.245 -191.25 -191.255 -191.26 -191.265 -191.27 -191.275 -191.28 -191.285 -191.29 -191.295 -191.3 -191.305 -191.31 -191.315 -191.32 -191.325 -191.33 -191.335 -191.34 -191.345 -191.35 -191.355 -191.36 -191.365 -191.37 -191.375 -191.38 -191.385 -191.39 -191.395 -191.4 -191.405 -191.41 -191.415 -191.42 -191.425 -191.43 -191.435 -191.44 -191.445 -191.45 -191.455 -191.46 -191.465 -191.47 -191.475 -191.48 -191.485 -191.49 -191.495 -191.5 -191.505 -191.51 -191.515 -191.52 -191.525 -191.53 -191.535 -191.54 -191.545 -191.55 -191.555 -191.56 -191.565 -191.57 -191.575 -191.58 -191.585 -191.59 -191.595 -191.6 -191.605 -191.61 -191.615 -191.62 -191.625 -191.63 -191.635 -191.64 -191.645 -191.65 -191.655 -191.66 -191.665 -191.67 -191.675 -191.68 -191.685 -191.69 -191.695 -191.7 -191.705 -191.71 -191.715 -191.72 -191.725 -191.73 -191.735 -191.74 -191.745 -191.75 -191.755 -191.76 -191.765 -191.77 -191.775 -191.78 -191.785 -191.79 -191.795 -191.8 -191.805 -191.81 -191.815 -191.82 -191.825 -191.83 -191.835 -191.84 -191.845 -191.85 -191.855 -191.86 -191.865 -191.87 -191.875 -191.88 -191.885 -191.89 -191.895 -191.9 -191.905 -191.91 -191.915 -191.92 -191.925 -191.93 -191.935 -191.94 -191.945 -191.95 -191.955 -191.96 -191.965 -191.97 -191.975 -191.98 -191.985 -191.99 -191.995 -192 -192.005 -192.01 -192.015 -192.02 -192.025 -192.03 -192.035 -192.04 -192.045 -192.05 -192.055 -192.06 -192.065 -192.07 -192.075 -192.08 -192.085 -192.09 -192.095 -192.1 -192.105 -192.11 -192.115 -192.12 -192.125 -192.13 -192.135 -192.14 -192.145 -192.15 -192.155 -192.16 -192.165 -192.17 -192.175 -192.18 -192.185 -192.19 -192.195 -192.2 -192.205 -192.21 -192.215 -192.22 -192.225 -192.23 -192.235 -192.24 -192.245 -192.25 -192.255 -192.26 -192.265 -192.27 -192.275 -192.28 -192.285 -192.29 -192.295 -192.3 -192.305 -192.31 -192.315 -192.32 -192.325 -192.33 -192.335 -192.34 -192.345 -192.35 -192.355 -192.36 -192.365 -192.37 -192.375 -192.38 -192.385 -192.39 -192.395 -192.4 -192.405 -192.41 -192.415 -192.42 -192.425 -192.43 -192.435 -192.44 -192.445 -192.45 -192.455 -192.46 -192.465 -192.47 -192.475 -192.48 -192.485 -192.49 -192.495 -192.5 -192.505 -192.51 -192.515 -192.52 -192.525 -192.53 -192.535 -192.54 -192.545 -192.55 -192.555 -192.56 -192.565 -192.57 -192.575 -192.58 -192.585 -192.59 -192.595 -192.6 -192.605 -192.61 -192.615 -192.62 -192.625 -192.63 -192.635 -192.64 -192.645 -192.65 -192.655 -192.66 -192.665 -192.67 -192.675 -192.68 -192.685 -192.69 -192.695 -192.7 -192.705 -192.71 -192.715 -192.72 -192.725 -192.73 -192.735 -192.74 -192.745 -192.75 -192.755 -192.76 -192.765 -192.77 -192.775 -192.78 -192.785 -192.79 -192.795 -192.8 -192.805 -192.81 -192.815 -192.82 -192.825 -192.83 -192.835 -192.84 -192.845 -192.85 -192.855 -192.86 -192.865 -192.87 -192.875 -192.88 -192.885 -192.89 -192.895 -192.9 -192.905 -192.91 -192.915 -192.92 -192.925 -192.93 -192.935 -192.94 -192.945 -192.95 -192.955 -192.96 -192.965 -192.97 -192.975 -192.98 -192.985 -192.99 -192.995 -193 -193.005 -193.01 -193.015 -193.02 -193.025 -193.03 -193.035 -193.04 -193.045 -193.05 -193.055 -193.06 -193.065 -193.07 -193.075 -193.08 -193.085 -193.09 -193.095 -193.1 -193.105 -193.11 -193.115 -193.12 -193.125 -193.13 -193.135 -193.14 -193.145 -193.15 -193.155 -193.16 -193.165 -193.17 -193.175 -193.18 -193.185 -193.19 -193.195 -193.2 -193.205 -193.21 -193.215 -193.22 -193.225 -193.23 -193.235 -193.24 -193.245 -193.25 -193.255 -193.26 -193.265 -193.27 -193.275 -193.28 -193.285 -193.29 -193.295 -193.3 -193.305 -193.31 -193.315 -193.32 -193.325 -193.33 -193.335 -193.34 -193.345 -193.35 -193.355 -193.36 -193.365 -193.37 -193.375 -193.38 -193.385 -193.39 -193.395 -193.4 -193.405 -193.41 -193.415 -193.42 -193.425 -193.43 -193.435 -193.44 -193.445 -193.45 -193.455 -193.46 -193.465 -193.47 -193.475 -193.48 -193.485 -193.49 -193.495 -193.5 -193.505 -193.51 -193.515 -193.52 -193.525 -193.53 -193.535 -193.54 -193.545 -193.55 -193.555 -193.56 -193.565 -193.57 -193.575 -193.58 -193.585 -193.59 -193.595 -193.6 -193.605 -193.61 -193.615 -193.62 -193.625 -193.63 -193.635 -193.64 -193.645 -193.65 -193.655 -193.66 -193.665 -193.67 -193.675 -193.68 -193.685 -193.69 -193.695 -193.7 -193.705 -193.71 -193.715 -193.72 -193.725 -193.73 -193.735 -193.74 -193.745 -193.75 -193.755 -193.76 -193.765 -193.77 -193.775 -193.78 -193.785 -193.79 -193.795 -193.8 -193.805 -193.81 -193.815 -193.82 -193.825 -193.83 -193.835 -193.84 -193.845 -193.85 -193.855 -193.86 -193.865 -193.87 -193.875 -193.88 -193.885 -193.89 -193.895 -193.9 -193.905 -193.91 -193.915 -193.92 -193.925 -193.93 -193.935 -193.94 -193.945 -193.95 -193.955 -193.96 -193.965 -193.97 -193.975 -193.98 -193.985 -193.99 -193.995 -194 -194.005 -194.01 -194.015 -194.02 -194.025 -194.03 -194.035 -194.04 -194.045 -194.05 -194.055 -194.06 -194.065 -194.07 -194.075 -194.08 -194.085 -194.09 -194.095 -194.1 -194.105 -194.11 -194.115 -194.12 -194.125 -194.13 -194.135 -194.14 -194.145 -194.15 -194.155 -194.16 -194.165 -194.17 -194.175 -194.18 -194.185 -194.19 -194.195 -194.2 -194.205 -194.21 -194.215 -194.22 -194.225 -194.23 -194.235 -194.24 -194.245 -194.25 -194.255 -194.26 -194.265 -194.27 -194.275 -194.28 -194.285 -194.29 -194.295 -194.3 -194.305 -194.31 -194.315 -194.32 -194.325 -194.33 -194.335 -194.34 -194.345 -194.35 -194.355 -194.36 -194.365 -194.37 -194.375 -194.38 -194.385 -194.39 -194.395 -194.4 -194.405 -194.41 -194.415 -194.42 -194.425 -194.43 -194.435 -194.44 -194.445 -194.45 -194.455 -194.46 -194.465 -194.47 -194.475 -194.48 -194.485 -194.49 -194.495 -194.5 -194.505 -194.51 -194.515 -194.52 -194.525 -194.53 -194.535 -194.54 -194.545 -194.55 -194.555 -194.56 -194.565 -194.57 -194.575 -194.58 -194.585 -194.59 -194.595 -194.6 -194.605 -194.61 -194.615 -194.62 -194.625 -194.63 -194.635 -194.64 -194.645 -194.65 -194.655 -194.66 -194.665 -194.67 -194.675 -194.68 -194.685 -194.69 -194.695 -194.7 -194.705 -194.71 -194.715 -194.72 -194.725 -194.73 -194.735 -194.74 -194.745 -194.75 -194.755 -194.76 -194.765 -194.77 -194.775 -194.78 -194.785 -194.79 -194.795 -194.8 -194.805 -194.81 -194.815 -194.82 -194.825 -194.83 -194.835 -194.84 -194.845 -194.85 -194.855 -194.86 -194.865 -194.87 -194.875 -194.88 -194.885 -194.89 -194.895 -194.9 -194.905 -194.91 -194.915 -194.92 -194.925 -194.93 -194.935 -194.94 -194.945 -194.95 -194.955 -194.96 -194.965 -194.97 -194.975 -194.98 -194.985 -194.99 -194.995 -195 -195.005 -195.01 -195.015 -195.02 -195.025 -195.03 -195.035 -195.04 -195.045 -195.05 -195.055 -195.06 -195.065 -195.07 -195.075 -195.08 -195.085 -195.09 -195.095 -195.1 -195.105 -195.11 -195.115 -195.12 -195.125 -195.13 -195.135 -195.14 -195.145 -195.15 -195.155 -195.16 -195.165 -195.17 -195.175 -195.18 -195.185 -195.19 -195.195 -195.2 -195.205 -195.21 -195.215 -195.22 -195.225 -195.23 -195.235 -195.24 -195.245 -195.25 -195.255 -195.26 -195.265 -195.27 -195.275 -195.28 -195.285 -195.29 -195.295 -195.3 -195.305 -195.31 -195.315 -195.32 -195.325 -195.33 -195.335 -195.34 -195.345 -195.35 -195.355 -195.36 -195.365 -195.37 -195.375 -195.38 -195.385 -195.39 -195.395 -195.4 -195.405 -195.41 -195.415 -195.42 -195.425 -195.43 -195.435 -195.44 -195.445 -195.45 -195.455 -195.46 -195.465 -195.47 -195.475 -195.48 -195.485 -195.49 -195.495 -195.5 -195.505 -195.51 -195.515 -195.52 -195.525 -195.53 -195.535 -195.54 -195.545 -195.55 -195.555 -195.56 -195.565 -195.57 -195.575 -195.58 -195.585 -195.59 -195.595 -195.6 -195.605 -195.61 -195.615 -195.62 -195.625 -195.63 -195.635 -195.64 -195.645 -195.65 -195.655 -195.66 -195.665 -195.67 -195.675 -195.68 -195.685 -195.69 -195.695 -195.7 -195.705 -195.71 -195.715 -195.72 -195.725 -195.73 -195.735 -195.74 -195.745 -195.75 -195.755 -195.76 -195.765 -195.77 -195.775 -195.78 -195.785 -195.79 -195.795 -195.8 -195.805 -195.81 -195.815 -195.82 -195.825 -195.83 -195.835 -195.84 -195.845 -195.85 -195.855 -195.86 -195.865 -195.87 -195.875 -195.88 -195.885 -195.89 -195.895 -195.9 -195.905 -195.91 -195.915 -195.92 -195.925 -195.93 -195.935 -195.94 -195.945 -195.95 -195.955 -195.96 -195.965 -195.97 -195.975 -195.98 -195.985 -195.99 -195.995 -196 -196.005 -196.01 -196.015 -196.02 -196.025 -196.03 -196.035 -196.04 -196.045 -196.05 -196.055 -196.06 -196.065 -196.07 -196.075 -196.08 -196.085 -196.09 -196.095 -196.1 -196.105 -196.11 -196.115 -196.12 -196.125 -196.13 -196.135 -196.14 -196.145 -196.15 -196.155 -196.16 -196.165 -196.17 -196.175 -196.18 -196.185 -196.19 -196.195 -196.2 -196.205 -196.21 -196.215 -196.22 -196.225 -196.23 -196.235 -196.24 -196.245 -196.25 -196.255 -196.26 -196.265 -196.27 -196.275 -196.28 -196.285 -196.29 -196.295 -196.3 -196.305 -196.31 -196.315 -196.32 -196.325 -196.33 -196.335 -196.34 -196.345 -196.35 -196.355 -196.36 -196.365 -196.37 -196.375 -196.38 -196.385 -196.39 -196.395 -196.4 -196.405 -196.41 -196.415 -196.42 -196.425 -196.43 -196.435 -196.44 -196.445 -196.45 -196.455 -196.46 -196.465 -196.47 -196.475 -196.48 -196.485 -196.49 -196.495 -196.5 -196.505 -196.51 -196.515 -196.52 -196.525 -196.53 -196.535 -196.54 -196.545 -196.55 -196.555 -196.56 -196.565 -196.57 -196.575 -196.58 -196.585 -196.59 -196.595 -196.6 -196.605 -196.61 -196.615 -196.62 -196.625 -196.63 -196.635 -196.64 -196.645 -196.65 -196.655 -196.66 -196.665 -196.67 -196.675 -196.68 -196.685 -196.69 -196.695 -196.7 -196.705 -196.71 -196.715 -196.72 -196.725 -196.73 -196.735 -196.74 -196.745 -196.75 -196.755 -196.76 -196.765 -196.77 -196.775 -196.78 -196.785 -196.79 -196.795 -196.8 -196.805 -196.81 -196.815 -196.82 -196.825 -196.83 -196.835 -196.84 -196.845 -196.85 -196.855 -196.86 -196.865 -196.87 -196.875 -196.88 -196.885 -196.89 -196.895 -196.9 -196.905 -196.91 -196.915 -196.92 -196.925 -196.93 -196.935 -196.94 -196.945 -196.95 -196.955 -196.96 -196.965 -196.97 -196.975 -196.98 -196.985 -196.99 -196.995 -197 -197.005 -197.01 -197.015 -197.02 -197.025 -197.03 -197.035 -197.04 -197.045 -197.05 -197.055 -197.06 -197.065 -197.07 -197.075 -197.08 -197.085 -197.09 -197.095 -197.1 -197.105 -197.11 -197.115 -197.12 -197.125 -197.13 -197.135 -197.14 -197.145 -197.15 -197.155 -197.16 -197.165 -197.17 -197.175 -197.18 -197.185 -197.19 -197.195 -197.2 -197.205 -197.21 -197.215 -197.22 -197.225 -197.23 -197.235 -197.24 -197.245 -197.25 -197.255 -197.26 -197.265 -197.27 -197.275 -197.28 -197.285 -197.29 -197.295 -197.3 -197.305 -197.31 -197.315 -197.32 -197.325 -197.33 -197.335 -197.34 -197.345 -197.35 -197.355 -197.36 -197.365 -197.37 -197.375 -197.38 -197.385 -197.39 -197.395 -197.4 -197.405 -197.41 -197.415 -197.42 -197.425 -197.43 -197.435 -197.44 -197.445 -197.45 -197.455 -197.46 -197.465 -197.47 -197.475 -197.48 -197.485 -197.49 -197.495 -197.5 -197.505 -197.51 -197.515 -197.52 -197.525 -197.53 -197.535 -197.54 -197.545 -197.55 -197.555 -197.56 -197.565 -197.57 -197.575 -197.58 -197.585 -197.59 -197.595 -197.6 -197.605 -197.61 -197.615 -197.62 -197.625 -197.63 -197.635 -197.64 -197.645 -197.65 -197.655 -197.66 -197.665 -197.67 -197.675 -197.68 -197.685 -197.69 -197.695 -197.7 -197.705 -197.71 -197.715 -197.72 -197.725 -197.73 -197.735 -197.74 -197.745 -197.75 -197.755 -197.76 -197.765 -197.77 -197.775 -197.78 -197.785 -197.79 -197.795 -197.8 -197.805 -197.81 -197.815 -197.82 -197.825 -197.83 -197.835 -197.84 -197.845 -197.85 -197.855 -197.86 -197.865 -197.87 -197.875 -197.88 -197.885 -197.89 -197.895 -197.9 -197.905 -197.91 -197.915 -197.92 -197.925 -197.93 -197.935 -197.94 -197.945 -197.95 -197.955 -197.96 -197.965 -197.97 -197.975 -197.98 -197.985 -197.99 -197.995 -198 -198.005 -198.01 -198.015 -198.02 -198.025 -198.03 -198.035 -198.04 -198.045 -198.05 -198.055 -198.06 -198.065 -198.07 -198.075 -198.08 -198.085 -198.09 -198.095 -198.1 -198.105 -198.11 -198.115 -198.12 -198.125 -198.13 -198.135 -198.14 -198.145 -198.15 -198.155 -198.16 -198.165 -198.17 -198.175 -198.18 -198.185 -198.19 -198.195 -198.2 -198.205 -198.21 -198.215 -198.22 -198.225 -198.23 -198.235 -198.24 -198.245 -198.25 -198.255 -198.26 -198.265 -198.27 -198.275 -198.28 -198.285 -198.29 -198.295 -198.3 -198.305 -198.31 -198.315 -198.32 -198.325 -198.33 -198.335 -198.34 -198.345 -198.35 -198.355 -198.36 -198.365 -198.37 -198.375 -198.38 -198.385 -198.39 -198.395 -198.4 -198.405 -198.41 -198.415 -198.42 -198.425 -198.43 -198.435 -198.44 -198.445 -198.45 -198.455 -198.46 -198.465 -198.47 -198.475 -198.48 -198.485 -198.49 -198.495 -198.5 -198.505 -198.51 -198.515 -198.52 -198.525 -198.53 -198.535 -198.54 -198.545 -198.55 -198.555 -198.56 -198.565 -198.57 -198.575 -198.58 -198.585 -198.59 -198.595 -198.6 -198.605 -198.61 -198.615 -198.62 -198.625 -198.63 -198.635 -198.64 -198.645 -198.65 -198.655 -198.66 -198.665 -198.67 -198.675 -198.68 -198.685 -198.69 -198.695 -198.7 -198.705 -198.71 -198.715 -198.72 -198.725 -198.73 -198.735 -198.74 -198.745 -198.75 -198.755 -198.76 -198.765 -198.77 -198.775 -198.78 -198.785 -198.79 -198.795 -198.8 -198.805 -198.81 -198.815 -198.82 -198.825 -198.83 -198.835 -198.84 -198.845 -198.85 -198.855 -198.86 -198.865 -198.87 -198.875 -198.88 -198.885 -198.89 -198.895 -198.9 -198.905 -198.91 -198.915 -198.92 -198.925 -198.93 -198.935 -198.94 -198.945 -198.95 -198.955 -198.96 -198.965 -198.97 -198.975 -198.98 -198.985 -198.99 -198.995 -199 -199.005 -199.01 -199.015 -199.02 -199.025 -199.03 -199.035 -199.04 -199.045 -199.05 -199.055 -199.06 -199.065 -199.07 -199.075 -199.08 -199.085 -199.09 -199.095 -199.1 -199.105 -199.11 -199.115 -199.12 -199.125 -199.13 -199.135 -199.14 -199.145 -199.15 -199.155 -199.16 -199.165 -199.17 -199.175 -199.18 -199.185 -199.19 -199.195 -199.2 -199.205 -199.21 -199.215 -199.22 -199.225 -199.23 -199.235 -199.24 -199.245 -199.25 -199.255 -199.26 -199.265 -199.27 -199.275 -199.28 -199.285 -199.29 -199.295 -199.3 -199.305 -199.31 -199.315 -199.32 -199.325 -199.33 -199.335 -199.34 -199.345 -199.35 -199.355 -199.36 -199.365 -199.37 -199.375 -199.38 -199.385 -199.39 -199.395 -199.4 -199.405 -199.41 -199.415 -199.42 -199.425 -199.43 -199.435 -199.44 -199.445 -199.45 -199.455 -199.46 -199.465 -199.47 -199.475 -199.48 -199.485 -199.49 -199.495 -199.5 -199.505 -199.51 -199.515 -199.52 -199.525 -199.53 -199.535 -199.54 -199.545 -199.55 -199.555 -199.56 -199.565 -199.57 -199.575 -199.58 -199.585 -199.59 -199.595 -199.6 -199.605 -199.61 -199.615 -199.62 -199.625 -199.63 -199.635 -199.64 -199.645 -199.65 -199.655 -199.66 -199.665 -199.67 -199.675 -199.68 -199.685 -199.69 -199.695 -199.7 -199.705 -199.71 -199.715 -199.72 -199.725 -199.73 -199.735 -199.74 -199.745 -199.75 -199.755 -199.76 -199.765 -199.77 -199.775 -199.78 -199.785 -199.79 -199.795 -199.8 -199.805 -199.81 -199.815 -199.82 -199.825 -199.83 -199.835 -199.84 -199.845 -199.85 -199.855 -199.86 -199.865 -199.87 -199.875 -199.88 -199.885 -199.89 -199.895 -199.9 -199.905 -199.91 -199.915 -199.92 -199.925 -199.93 -199.935 -199.94 -199.945 -199.95 -199.955 -199.96 -199.965 -199.97 -199.975 -199.98 -199.985 -199.99 -199.995 -200 -200.005 -200.01 -200.015 -200.02 -200.025 -200.03 -200.035 -200.04 -200.045 -200.05 -200.055 -200.06 -200.065 -200.07 -200.075 -200.08 -200.085 -200.09 -200.095 -200.1 -200.105 -200.11 -200.115 -200.12 -200.125 -200.13 -200.135 -200.14 -200.145 -200.15 -200.155 -200.16 -200.165 -200.17 -200.175 -200.18 -200.185 -200.19 -200.195 -200.2 -200.205 -200.21 -200.215 -200.22 -200.225 -200.23 -200.235 -200.24 -200.245 -200.25 -200.255 -200.26 -200.265 -200.27 -200.275 -200.28 -200.285 -200.29 -200.295 -200.3 -200.305 -200.31 -200.315 -200.32 -200.325 -200.33 -200.335 -200.34 -200.345 -200.35 -200.355 -200.36 -200.365 -200.37 -200.375 -200.38 -200.385 -200.39 -200.395 -200.4 -200.405 -200.41 -200.415 -200.42 -200.425 -200.43 -200.435 -200.44 -200.445 -200.45 -200.455 -200.46 -200.465 -200.47 -200.475 -200.48 -200.485 -200.49 -200.495 -200.5 -200.505 -200.51 -200.515 -200.52 -200.525 -200.53 -200.535 -200.54 -200.545 -200.55 -200.555 -200.56 -200.565 -200.57 -200.575 -200.58 -200.585 -200.59 -200.595 -200.6 -200.605 -200.61 -200.615 -200.62 -200.625 -200.63 -200.635 -200.64 -200.645 -200.65 -200.655 -200.66 -200.665 -200.67 -200.675 -200.68 -200.685 -200.69 -200.695 -200.7 -200.705 -200.71 -200.715 -200.72 -200.725 -200.73 -200.735 -200.74 -200.745 -200.75 -200.755 -200.76 -200.765 -200.77 -200.775 -200.78 -200.785 -200.79 -200.795 -200.8 -200.805 -200.81 -200.815 -200.82 -200.825 -200.83 -200.835 -200.84 -200.845 -200.85 -200.855 -200.86 -200.865 -200.87 -200.875 -200.88 -200.885 -200.89 -200.895 -200.9 -200.905 -200.91 -200.915 -200.92 -200.925 -200.93 -200.935 -200.94 -200.945 -200.95 -200.955 -200.96 -200.965 -200.97 -200.975 -200.98 -200.985 -200.99 -200.995 -201 -201.005 -201.01 -201.015 -201.02 -201.025 -201.03 -201.035 -201.04 -201.045 -201.05 -201.055 -201.06 -201.065 -201.07 -201.075 -201.08 -201.085 -201.09 -201.095 -201.1 -201.105 -201.11 -201.115 -201.12 -201.125 -201.13 -201.135 -201.14 -201.145 -201.15 -201.155 -201.16 -201.165 -201.17 -201.175 -201.18 -201.185 -201.19 -201.195 -201.2 -201.205 -201.21 -201.215 -201.22 -201.225 -201.23 -201.235 -201.24 -201.245 -201.25 -201.255 -201.26 -201.265 -201.27 -201.275 -201.28 -201.285 -201.29 -201.295 -201.3 -201.305 -201.31 -201.315 -201.32 -201.325 -201.33 -201.335 -201.34 -201.345 -201.35 -201.355 -201.36 -201.365 -201.37 -201.375 -201.38 -201.385 -201.39 -201.395 -201.4 -201.405 -201.41 -201.415 -201.42 -201.425 -201.43 -201.435 -201.44 -201.445 -201.45 -201.455 -201.46 -201.465 -201.47 -201.475 -201.48 -201.485 -201.49 -201.495 -201.5 -201.505 -201.51 -201.515 -201.52 -201.525 -201.53 -201.535 -201.54 -201.545 -201.55 -201.555 -201.56 -201.565 -201.57 -201.575 -201.58 -201.585 -201.59 -201.595 -201.6 -201.605 -201.61 -201.615 -201.62 -201.625 -201.63 -201.635 -201.64 -201.645 -201.65 -201.655 -201.66 -201.665 -201.67 -201.675 -201.68 -201.685 -201.69 -201.695 -201.7 -201.705 -201.71 -201.715 -201.72 -201.725 -201.73 -201.735 -201.74 -201.745 -201.75 -201.755 -201.76 -201.765 -201.77 -201.775 -201.78 -201.785 -201.79 -201.795 -201.8 -201.805 -201.81 -201.815 -201.82 -201.825 -201.83 -201.835 -201.84 -201.845 -201.85 -201.855 -201.86 -201.865 -201.87 -201.875 -201.88 -201.885 -201.89 -201.895 -201.9 -201.905 -201.91 -201.915 -201.92 -201.925 -201.93 -201.935 -201.94 -201.945 -201.95 -201.955 -201.96 -201.965 -201.97 -201.975 -201.98 -201.985 -201.99 -201.995 -202 -202.005 -202.01 -202.015 -202.02 -202.025 -202.03 -202.035 -202.04 -202.045 -202.05 -202.055 -202.06 -202.065 -202.07 -202.075 -202.08 -202.085 -202.09 -202.095 -202.1 -202.105 -202.11 -202.115 -202.12 -202.125 -202.13 -202.135 -202.14 -202.145 -202.15 -202.155 -202.16 -202.165 -202.17 -202.175 -202.18 -202.185 -202.19 -202.195 -202.2 -202.205 -202.21 -202.215 -202.22 -202.225 -202.23 -202.235 -202.24 -202.245 -202.25 -202.255 -202.26 -202.265 -202.27 -202.275 -202.28 -202.285 -202.29 -202.295 -202.3 -202.305 -202.31 -202.315 -202.32 -202.325 -202.33 -202.335 -202.34 -202.345 -202.35 -202.355 -202.36 -202.365 -202.37 -202.375 -202.38 -202.385 -202.39 -202.395 -202.4 -202.405 -202.41 -202.415 -202.42 -202.425 -202.43 -202.435 -202.44 -202.445 -202.45 -202.455 -202.46 -202.465 -202.47 -202.475 -202.48 -202.485 -202.49 -202.495 - --75.9641 --75.975 --75.9656 --75.9844 --75.9672 --75.9641 --75.9656 --75.9609 --75.9609 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9547 --75.9672 --75.9641 --75.9734 --75.9625 --75.9734 --75.9703 --75.975 --75.9922 --75.9672 --75.9625 --75.9812 --75.9703 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.975 --75.9766 --75.9906 --75.975 --75.9719 --75.9859 --75.9594 --75.9719 --75.9547 --75.9719 --75.9703 --75.9703 --75.9594 --75.9688 --75.9641 --75.9594 --75.9844 --75.9547 --75.9688 --75.975 --75.9719 --75.9609 --75.9703 --75.9688 --75.9578 --75.9641 --75.9594 --75.9578 --75.975 --75.9656 --75.9688 --75.9625 --75.9531 --75.9563 --75.9641 --75.9594 --75.9641 --75.9609 --75.9578 --75.9719 --75.9547 --75.9563 --75.9703 --75.9672 --75.9578 --75.9734 --75.9734 --75.9594 --75.9656 --75.9578 --75.9516 --75.9578 --75.9563 --75.9563 --75.9609 --75.9516 --75.9688 --75.9422 --75.9516 --75.9688 --75.9656 --75.9641 --75.9547 --75.9531 --75.9734 --75.9578 --75.9469 --75.9625 --75.9594 --75.9375 --75.9594 --75.9641 --75.9625 --75.9531 --75.9422 --75.95 --75.95 --75.9578 --75.9547 --75.9609 --75.9484 --75.9484 --75.9547 --75.9469 --75.9641 --75.9563 --75.9328 --75.9547 --75.95 --75.9578 --75.9563 --75.9531 --75.9563 --75.9359 --75.9594 --75.95 --75.9609 --75.9531 --75.9594 --75.9547 --75.9656 --75.9594 --75.9578 --75.9516 --75.9516 --75.9484 --75.9516 --75.9563 --75.9547 --75.9531 --75.9453 --75.9531 --75.9688 --75.9516 --75.9594 --75.9516 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9609 --75.9703 --75.9734 --75.9609 --75.9672 --75.9531 --75.9625 --75.9625 --75.9563 --75.9734 --75.9656 --75.9641 --75.9578 --75.9656 --75.9563 --75.9656 --75.9672 --75.9625 --75.9688 --75.9594 --75.9641 --75.9688 --75.9656 --75.9625 --75.9812 --75.9594 --75.9672 --75.9656 --75.9547 --75.9563 --75.9594 --75.9703 --75.9641 --75.9688 --75.9531 --75.95 --75.9594 --75.9469 --75.9547 --75.9563 --75.9609 --75.9672 --75.9563 --75.9578 --75.9547 --75.9609 --75.9469 --75.9594 --75.9594 --75.9484 --75.9625 --75.9641 --75.9547 --75.9531 --75.9484 --75.9547 --75.9484 --75.9422 --75.9594 --75.9516 --75.9609 --75.9672 --75.9672 --75.9609 --75.9516 --75.9594 --75.9781 --75.9563 --75.9688 --75.9703 --75.9625 --75.9563 --75.9437 --75.9578 --75.9547 --75.9609 --75.9688 --75.9609 --75.9594 --75.9609 --75.9547 --75.9719 --75.9656 --75.9578 --75.9688 --75.975 --75.9594 --75.9609 --75.9609 --75.9563 --75.9656 --75.9563 --75.9563 --75.9719 --75.9578 --75.9609 --75.9625 --75.9578 --75.9563 --75.9578 --75.9563 --75.95 --75.9594 --75.9594 --75.9594 --75.975 --75.9641 --75.9703 --75.9578 --75.9594 --75.9734 --75.9656 --75.9516 --75.9766 --75.9656 --75.9656 --75.9594 --75.9688 --75.9656 --75.9609 --75.9766 --75.9656 --75.9734 --75.9516 --75.9609 --75.9547 --75.9453 --75.9672 --75.9625 --75.9594 --75.9609 --75.9656 --75.9609 --75.9656 --75.9656 --75.9578 --75.9625 --75.9453 --75.9531 --75.9719 --75.9734 --75.9656 --75.9516 --75.9609 --75.9688 --75.9594 --75.9719 --75.9641 --75.9641 --75.9531 --75.95 --75.9437 --75.9437 --75.9594 --75.9516 --75.9359 --75.9609 --75.9469 --75.9453 --75.9391 --75.9437 --75.9531 --75.9531 --75.9563 --75.9547 --75.9547 --75.9719 --75.9672 --75.9641 --75.9609 --75.9766 --75.9484 --75.9563 --75.9594 --75.9547 --75.9578 --75.9609 --75.9516 --75.9547 --75.9594 --75.9578 --75.9656 --75.9516 --75.9531 --75.9422 --75.9516 --75.9453 --75.95 --75.9625 --75.95 --75.9531 --75.9641 --75.9703 --75.9594 --75.9531 --75.9563 --75.9594 --75.9516 --75.9719 --75.9672 --75.9531 --75.9703 --75.9547 --75.9641 --75.9688 --75.9547 --75.9547 --75.9625 --75.9641 --75.9656 --75.9609 --75.95 --75.9547 --75.9531 --75.9531 --75.9547 --75.9609 --75.9641 --75.9594 --75.9594 --75.9547 --75.9469 --75.9625 --75.9734 --75.9609 --75.9516 --75.975 --75.9672 --75.9594 --75.9609 --75.9609 --75.95 --75.9609 --75.9766 --75.9609 --75.9563 --75.95 --75.9625 --75.9641 --75.9656 --75.9516 --75.9594 --75.9594 --75.9563 --75.9641 --75.9672 --75.9609 --75.9703 --75.9516 --75.9531 --75.9625 --75.9578 --75.9672 --75.9859 --76.0484 --76.0938 --76.1594 --76.2 --76.2063 --76.1203 --76.0156 --75.8641 --75.7141 --75.5953 --75.4844 --75.3938 --75.3313 --75.2594 --75.2 --75.1547 --75.1109 --75.0766 --75.0281 --74.9938 --74.95 --74.9047 --74.8578 --74.8063 --74.7594 --74.7281 --74.6875 --74.6484 --74.5953 --74.5641 --74.5203 --74.4719 --74.4313 --74.3906 --74.3703 --74.3281 --74.2922 --74.2453 --74.2188 --74.1844 --74.1438 --74.1094 --74.0719 --74.0391 --74.0125 --73.9734 --73.9328 --73.8906 --73.8625 --73.8422 --73.8125 --73.7656 --73.7328 --73.7125 --73.675 --73.6375 --73.6125 --73.5797 --73.5469 --73.5156 --73.4938 --73.4516 --73.4187 --73.4078 --73.3781 --73.3438 --73.3125 --73.2937 --73.2719 --73.2406 --73.2156 --73.1891 --73.1672 --73.1359 --73.0969 --73.0719 --73.0531 --73.0266 --73 --72.9828 --72.95 --72.9297 --72.9125 --72.9 --72.875 --72.85 --72.825 --72.7984 --72.7734 --72.7438 --72.7359 --72.725 --72.675 --72.6578 --72.6469 --72.625 --72.5984 --72.575 --72.55 --72.5016 --72.4406 --72.3766 --72.2906 --72.2281 --72.2188 --72.2578 --72.3469 --72.475 --72.5844 --72.6844 --72.7719 --72.8422 --72.9031 --72.9484 --72.9734 --73.0156 --73.0234 --73.0531 --73.0797 --73.1109 --73.1281 --73.1703 --73.1891 --73.2109 --73.2312 --73.2547 --73.2781 --73.3031 --73.3297 --73.3531 --73.3656 --73.4 --73.4187 --73.4375 --73.4625 --73.4812 --73.5031 --73.5344 --73.5297 --73.55 --73.5781 --73.5969 --73.6047 --73.6328 --73.6594 --73.6609 --73.6984 --73.7063 --73.7203 --73.7438 --73.7516 --73.7734 --73.7906 --73.8266 --73.8313 --73.8484 --73.8578 --73.8734 --73.8781 --73.9047 --73.9156 --73.9266 --73.9453 --73.9656 --73.9734 --74 --74.0078 --74.0078 --74.0312 --74.0453 --74.0531 --74.0687 --74.075 --74.0844 --74.1078 --74.1031 --74.1172 --74.1312 --74.1438 --74.1484 --74.1734 --74.1766 --74.1953 --74.2 --74.2016 --74.2281 --74.2391 --74.2547 --74.2594 --74.2672 --74.2766 --74.2875 --74.2969 --74.2969 --74.3109 --74.3203 --74.3156 --74.3406 --74.3391 --74.3391 --74.35 --74.3594 --74.3656 --74.375 --74.3797 --74.3953 --74.3969 --74.4141 --74.4047 --74.4281 --74.4172 --74.4359 --74.4344 --74.4469 --74.4547 --74.4469 --74.4625 --74.475 --74.475 --74.4922 --74.4906 --74.5016 --74.4969 --74.5188 --74.525 --74.5188 --74.5391 --74.5375 --74.5422 --74.5375 --74.5453 --74.5547 --74.5531 --74.5703 --74.5719 --74.5828 --74.5828 --74.5875 --74.5922 --74.6016 --74.6078 --74.6031 --74.6 --74.6156 --74.6312 --74.6359 --74.6422 --74.65 --74.6328 --74.6516 --74.6609 --74.6609 --74.6734 --74.6594 --74.6734 --74.6703 --74.675 --74.6687 --74.6797 --74.6828 --74.6937 --74.6766 --74.7016 --74.7047 --74.6969 --74.7031 --74.7031 --74.7078 --74.7109 --74.7266 --74.7234 --74.7406 --74.7234 --74.725 --74.7422 --74.7312 --74.7391 --74.7359 --74.7516 --74.7453 --74.7547 --74.7672 --74.7578 --74.7656 --74.7641 --74.7719 --74.7688 --74.7703 --74.7875 --74.7812 --74.7953 --74.7797 --74.7812 --74.7844 --74.775 --74.8031 --74.8047 --74.8172 --74.8078 --74.8016 --74.8016 --74.825 --74.8156 --74.8109 --74.825 --74.8219 --74.8187 --74.8187 --74.8406 --74.8281 --74.8328 --74.8422 --74.8453 --74.8266 --74.8375 --74.8438 --74.8391 --74.8422 --74.8391 --74.8422 --74.8547 --74.8531 --74.8484 --74.8625 --74.8781 --74.8672 --74.8547 --74.8812 --74.8719 --74.8609 --74.8625 --74.8828 --74.8688 --74.8938 --74.8812 --74.8891 --74.9031 --74.8922 --74.8953 --74.9078 --74.9016 --74.9031 --74.8922 --74.9047 --74.9078 --74.8938 --74.9094 --74.9109 --74.9094 --74.9125 --74.9203 --74.9125 --74.9125 --74.9219 --74.9203 --74.9187 --74.9062 --74.9094 --74.9047 --74.9141 --74.9281 --74.9313 --74.9172 --74.9156 --74.9297 --74.9328 --74.9313 --74.9391 --74.9375 --74.9406 --74.9313 --74.9469 --74.9453 --74.9422 --74.9641 --74.9609 --74.9484 --74.9531 --74.9453 --74.9578 --74.9484 --74.9469 --74.9437 --74.9563 --74.9656 --74.9609 --74.9609 --74.9453 --74.9703 --74.9672 --74.9609 --74.975 --74.9797 --74.9719 --74.9703 --74.9656 --74.9906 --74.9812 --74.975 --74.9797 --74.9922 --74.975 --74.9859 --74.9922 --74.9859 --74.9953 --75.0031 --74.9922 --74.9844 --75.0047 --74.9781 --74.9906 --75.0016 --74.9906 --75.0047 --75 --74.9953 --74.9969 --74.9984 --75.0094 --75.0062 --75.0047 --75.0047 --75 --75.0141 --75.0297 --75.0078 --75.0125 --75.0141 --75.0156 --75.0125 --75.0219 --75.0219 --75.0141 --75.0109 --75.0031 --75.0125 --75.0203 --75.0328 --75.0234 --75.0344 --75.0266 --75.0172 --75.0297 --75.0297 --75.0219 --75.0344 --75.0312 --75.0344 --75.025 --75.0359 --75.0344 --75.0281 --75.0234 --75.0344 --75.0312 --75.0297 --75.0359 --75.0203 --75.0422 --75.0219 --75.0266 --75.025 --75.0375 --75.0469 --75.0469 --75.0328 --75.0484 --75.0469 --75.0578 --75.0344 --75.0406 --75.0375 --75.0391 --75.0453 --75.0406 --75.0531 --75.0484 --75.05 --75.0391 --75.0516 --75.0484 --75.05 --75.0437 --75.0484 --75.0344 --75.0594 --75.0359 --75.0453 --75.0531 --75.0469 --75.0547 --75.0344 --75.0469 --75.0391 --75.0484 --75.0437 --75.0531 --75.0516 --75.0547 --75.0578 --75.0594 --75.0563 --75.0375 --75.0531 --75.05 --75.0672 --75.0547 --75.0578 --75.0563 --75.0609 --75.0484 --75.0719 --75.0484 --75.075 --75.0609 --75.0516 --75.0563 --75.0625 --75.0625 --75.0594 --75.0578 --75.0719 --75.0594 --75.0687 --75.0656 --75.0547 --75.0578 --75.0672 --75.0766 --75.0703 --75.0594 --75.0609 --75.0687 --75.0625 --75.0844 --75.0719 --75.0734 --75.0703 --75.0719 --75.0828 --75.0687 --75.0875 --75.0703 --75.0656 --75.0922 --75.0844 --75.0859 --75.0703 --75.0828 --75.0781 --75.0813 --75.0641 --75.0797 --75.0703 --75.0875 --75.0875 --75.0703 --75.0828 --75.0922 --75.0766 --75.0766 --75.0781 --75.0891 --75.1016 --75.0781 --75.0781 --75.0859 --75.0906 --75.0813 --75.0938 --75.0844 --75.0953 --75.1016 --75.0906 --75.1094 --75.1 --75.1031 --75.0984 --75.1031 --75.0719 --75.0969 --75.0906 --75.1031 --75.1047 --75.0938 --75.1078 --75.1047 --75.1172 --75.1047 --75.1078 --75.0891 --75.1 --75.0953 --75.0938 --75.1031 --75.0875 --75.1 --75.1 --75.1031 --75.1125 --75.1031 --75.1062 --75.0938 --75.0969 --75.1125 --75.1047 --75.1188 --75.1125 --75.1062 --75.1125 --75.1125 --75.1156 --75.1109 --75.1109 --75.1078 --75.125 --75.1078 --75.1 --75.1156 --75.1062 --75.1156 --75.1141 --75.1156 --75.1109 --75.1109 --75.1234 --75.1203 --75.1125 --75.1266 --75.1031 --75.0969 --75.1219 --75.1094 --75.1172 --75.1203 --75.1172 --75.1266 --75.1219 --75.1125 --75.1203 --75.1234 --75.1172 --75.1141 --75.1188 --75.1125 --75.1172 --75.1219 --75.1188 --75.1266 --75.1172 --75.1219 --75.1297 --75.1297 --75.1172 --75.1297 --75.125 --75.1297 --75.1297 --75.1188 --75.1297 --75.125 --75.1297 --75.1266 --75.1219 --75.1156 --75.1266 --75.1297 --75.1172 --75.1266 --75.1094 --75.1156 --75.1312 --75.125 --75.1188 --75.1281 --75.1266 --75.1234 --75.1297 --75.1344 --75.1312 --75.1312 --75.1297 --75.1188 --75.1359 --75.1297 --75.1281 --75.1328 --75.1391 --75.1375 --75.1297 --75.125 --75.1281 --75.1312 --75.125 --75.1156 --75.1312 --75.1375 --75.1359 --75.1359 --75.1312 --75.1328 --75.1422 --75.1219 --75.1266 --75.1312 --75.1391 --75.1359 --75.1297 --75.1344 --75.1375 --75.1469 --75.125 --75.1375 --75.125 --75.1344 --75.1375 --75.1328 --75.1328 --75.1391 --75.1375 --75.1328 --75.1328 --75.1328 --75.1422 --75.1406 --75.1484 --75.1438 --75.1531 --75.1422 --75.1484 --75.1328 --75.1406 --75.1391 --75.15 --75.1406 --75.1484 --75.1391 --75.1469 --75.1531 --75.1484 --75.15 --75.1391 --75.1438 --75.1406 --75.1594 --75.1469 --75.1469 --75.1453 --75.1531 --75.1469 --75.1516 --75.1453 --75.1531 --75.1312 --75.1375 --75.1453 --75.1438 --75.1422 --75.1578 --75.1594 --75.1469 --75.1578 --75.1516 --75.1438 --75.1453 --75.15 --75.1656 --75.1453 --75.1484 --75.1594 --75.1594 --75.1703 --75.1719 --75.1594 --75.1562 --75.1516 --75.1687 --75.1609 --75.1609 --75.1625 --75.1594 --75.1547 --75.1547 --75.1781 --75.1687 --75.175 --75.1672 --75.1719 --75.175 --75.1781 --75.1781 --75.1719 --75.1797 --75.1656 --75.1656 --75.1828 --75.1656 --75.1766 --75.1734 --75.1719 --75.1687 --75.1531 --75.1813 --75.1703 --75.1594 --75.1703 --75.1766 --75.1703 --75.1578 --75.1766 --75.1656 --75.1703 --75.1703 --75.1797 --75.1656 --75.1531 --75.1562 --75.1734 --75.1672 --75.1781 --75.1781 --75.1953 --75.1719 --75.1734 --75.1891 --75.175 --75.1766 --75.1813 --75.1766 --75.1844 --75.1641 --75.1734 --75.1766 --75.1781 --75.1781 --75.1828 --75.1859 --75.1875 --75.1813 --75.1797 --75.1813 --75.1766 --75.1937 --75.1672 --75.175 --75.1781 --75.1703 --75.1844 --75.1813 --75.1875 --75.175 --75.1766 --75.1875 --75.1891 --75.1906 --75.1813 --75.175 --75.1906 --75.1875 --75.1719 --75.175 --75.1703 --75.1766 --75.1797 --75.1797 --75.1719 --75.1734 --75.1859 --75.1891 --75.175 --75.1703 --75.1859 --75.1859 --75.1828 --75.1672 --75.1859 --75.1766 --75.1922 --75.175 --75.1797 --75.1828 --75.1781 --75.1625 --75.1703 --75.1844 --75.1844 --75.1797 --75.1719 --75.1672 --75.1719 --75.1766 --75.1906 --75.175 --75.1828 --75.1922 --75.1781 --75.1797 --75.1828 --75.1969 --75.2016 --75.1891 --75.1984 --75.1781 --75.1906 --75.1734 --75.1844 --75.1844 --75.175 --75.1891 --75.1719 --75.1875 --75.1859 --75.1859 --75.1828 --75.1891 --75.1844 --75.1859 --75.1703 --75.1828 --75.1891 --75.2016 --75.175 --75.1937 --75.1859 --75.1969 --75.1891 --75.1906 --75.1953 --75.1953 --75.1906 --75.1844 --75.2 --75.1953 --75.1766 --75.1875 --75.1953 --75.1906 --75.1906 --75.2047 --75.2047 --75.2 --75.2063 --75.2063 --75.1953 --75.1969 --75.2047 --75.1984 --75.2 --75.2031 --75.2 --75.2 --75.1953 --75.2047 --75.2094 --75.2109 --75.1969 --75.2188 --75.2016 --75.2016 --75.1937 --75.1937 --75.2016 --75.2156 --75.2031 --75.2016 --75.2 --75.2 --75.2188 --75.1984 --75.2031 --75.2094 --75.1969 --75.2047 --75.2063 --75.2125 --75.2016 --75.2078 --75.2125 --75.2016 --75.2 --75.2063 --75.1984 --75.2016 --75.2016 --75.1984 --75.1937 --75.2031 --75.2016 --75.2094 --75.2063 --75.2 --75.2 --75.2219 --75.2047 --75.2078 --75.1984 --75.2094 --75.2125 --75.2047 --75.2141 --75.2094 --75.2109 --75.2063 --75.2063 --75.2016 --75.2063 --75.2172 --75.2156 --75.2016 --75.2078 --75.1937 --75.2031 --75.2031 --75.2016 --75.2188 --75.2016 --75.2 --75.2016 --75.2141 --75.2109 --75.2063 --75.2203 --75.2125 --75.2 --75.2234 --75.225 --75.2141 --75.2047 --75.2266 --75.2203 --75.2312 --75.225 --75.2109 --75.2063 --75.2391 --75.2203 --75.2188 --75.2109 --75.2063 --75.2125 --75.2219 --75.2188 --75.2219 --75.2219 --75.2172 --75.2156 --75.2156 --75.2109 --75.2156 --75.2109 --75.2219 --75.2203 --75.225 --75.2172 --75.2219 --75.2125 --75.2281 --75.2234 --75.2141 --75.225 --75.2156 --75.2281 --75.2219 --75.2109 --75.2156 --75.2141 --75.2156 --75.2078 --75.2359 --75.225 --75.2219 --75.2312 --75.2219 --75.2156 --75.2281 --75.2219 --75.2266 --75.2203 --75.2297 --75.2391 --75.2266 --75.2375 --75.2188 --75.2297 --75.2266 --75.2359 --75.225 --75.2172 --75.2328 --75.2125 --75.2234 --75.2312 --75.2125 --75.2391 --75.2266 --75.2234 --75.225 --75.2328 --75.2312 --75.2406 --75.2375 --75.2438 --75.2344 --75.2328 --75.2234 --75.2281 --75.2203 --75.2328 --75.2266 --75.2281 --75.2234 --75.225 --75.225 --75.2359 --75.2328 --75.2359 --75.2312 --75.2359 --75.2375 --75.2359 --75.2406 --75.2422 --75.2422 --75.2484 --75.2406 --75.2359 --75.25 --75.2281 --75.2203 --75.2391 --75.2312 --75.2312 --75.2234 --75.2344 --75.2375 --75.2359 --75.2297 --75.2312 --75.2469 --75.2359 --75.2406 --75.225 --75.2359 --75.2391 --75.2281 --75.2234 --75.2359 --75.2203 --75.2266 --75.2266 --75.2234 --75.2406 --75.2281 --75.225 --75.2281 --75.2344 --75.2234 --75.225 --75.2266 --75.2375 --75.225 --75.2406 --75.2219 --75.2312 --75.2375 --75.2266 --75.2312 --75.225 --75.2344 --75.2469 --75.2266 --75.2438 --75.2359 --75.2422 --75.2516 --75.2484 --75.2266 --75.2344 --75.2391 --75.2453 --75.2344 --75.2547 --75.2375 --75.2438 --75.2406 --75.2484 --75.2281 --75.2422 --75.2297 --75.2609 --75.2453 --75.2266 --75.2406 --75.2375 --75.2297 --75.2391 --75.2453 --75.2438 --75.2438 --75.2344 --75.2406 --75.25 --75.2438 --75.2391 --75.2328 --75.2375 --75.2422 --75.2406 --75.2453 --75.2375 --75.2484 --75.2453 --75.2438 --75.25 --75.2391 --75.25 --75.2422 --75.2469 --75.2562 --75.2422 --75.25 --75.2516 --75.2359 --75.2641 --75.2547 --75.2656 --75.2453 --75.2547 --75.2453 --75.2578 --75.2531 --75.2438 --75.2469 --75.2562 --75.2531 --75.2344 --75.2594 --75.2625 --75.2469 --75.2562 --75.2391 --75.2516 --75.2547 --75.2531 --75.2422 --75.2531 --75.2594 --75.2422 --75.2422 --75.2484 --75.2531 --75.2562 --75.2406 --75.2312 --75.2438 --75.25 --75.2578 --75.2453 --75.2281 --75.25 --75.2562 --75.2594 --75.2609 --75.2625 --75.2438 --75.2578 --75.2609 --75.2641 --75.2672 --75.2609 --75.2547 --75.2578 --75.2672 --75.2703 --75.2625 --75.2578 --75.2547 --75.2703 --75.2688 --75.2594 --75.2703 --75.2781 --75.2656 --75.2734 --75.2844 --75.2734 --75.275 --75.2797 --75.2828 --75.2656 --75.2844 --75.2812 --75.2859 --75.2766 --75.2688 --75.275 --75.275 --75.2797 --75.2641 --75.275 --75.2688 --75.2672 --75.2703 --75.2609 --75.2766 --75.2797 --75.2531 --75.2703 --75.2594 --75.2672 --75.2609 --75.2703 --75.2703 --75.2625 --75.2641 --75.2516 --75.2625 --75.2656 --75.25 --75.2734 --75.2656 --75.2469 --75.2688 --75.2734 --75.2797 --75.2688 --75.2562 --75.2859 --75.2688 --75.275 --75.2688 --75.2609 --75.2625 --75.2641 --75.2625 --75.2641 --75.2641 --75.2688 --75.2547 --75.2578 --75.275 --75.2672 --75.2859 --75.275 --75.2828 --75.2641 --75.2812 --75.2703 --75.2656 --75.2734 --75.2797 --75.2797 --75.2828 --75.2672 --75.2656 --75.2812 --75.2719 --75.2797 --75.2797 --75.2625 --75.275 --75.2688 --75.2719 --75.2625 --75.2812 --75.2766 --75.2688 --75.2734 --75.2812 --75.275 --75.2766 --75.2844 --75.2781 --75.2781 --75.2828 --75.2812 --75.2797 --75.2875 --75.2547 --75.2734 --75.2656 --75.2844 --75.2812 --75.2812 --75.2766 --75.2703 --75.275 --75.2719 --75.2844 --75.2828 --75.2797 --75.2922 --75.2859 --75.3 --75.2875 --75.2844 --75.2844 --75.3031 --75.2766 --75.2844 --75.2688 --75.2828 --75.2781 --75.2797 --75.2766 --75.2828 --75.2937 --75.2812 --75.275 --75.275 --75.2969 --75.2797 --75.2719 --75.2766 --75.2828 --75.2828 --75.2875 --75.2797 --75.2797 --75.2906 --75.2797 --75.2812 --75.2859 --75.3047 --75.2984 --75.2984 --75.2766 --75.2859 --75.2859 --75.2781 --75.2891 --75.2875 --75.2906 --75.2828 --75.2906 --75.2828 --75.2797 --75.2844 --75.2828 --75.3047 --75.2812 --75.2844 --75.2766 --75.2937 --75.2781 --75.2844 --75.2766 --75.2891 --75.3 --75.2844 --75.2859 --75.2922 --75.3 --75.2891 --75.3 --75.2906 --75.2797 --75.2953 --75.2953 --75.2875 --75.2891 --75.2937 --75.2906 --75.2922 --75.2812 --75.2812 --75.2969 --75.2766 --75.2875 --75.2828 --75.2937 --75.2969 --75.2656 --75.2969 --75.2937 --75.2688 --75.2859 --75.2875 --75.2891 --75.2734 --75.2781 --75.2891 --75.2984 --75.2953 --75.2906 --75.2953 --75.2937 --75.3031 --75.3063 --75.3047 --75.3 --75.2937 --75.2937 --75.2984 --75.3031 --75.2891 --75.3031 --75.3047 --75.3031 --75.3047 --75.2937 --75.3016 --75.3031 --75.3016 --75.2922 --75.3047 --75.3016 --75.2906 --75.3016 --75.3109 --75.2969 --75.3125 --75.3078 --75.2969 --75.3 --75.2891 --75.3094 --75.3 --75.3016 --75.2875 --75.3125 --75.2953 --75.3078 --75.3016 --75.2891 --75.3 --75.3031 --75.2969 --75.3031 --75.3063 --75.2906 --75.2922 --75.2953 --75.2922 --75.3063 --75.2969 --75.3 --75.2906 --75.2984 --75.2969 --75.3109 --75.2937 --75.2937 --75.3063 --75.2937 --75.3 --75.2984 --75.3 --75.2953 --75.3016 --75.3 --75.3047 --75.3031 --75.2922 --75.2906 --75.2906 --75.3172 --75.2891 --75.2891 --75.2953 --75.2953 --75.2984 --75.2937 --75.2969 --75.2859 --75.3031 --75.2953 --75.2922 --75.2937 --75.3016 --75.2984 --75.2969 --75.2922 --75.3141 --75.3109 --75.3109 --75.2922 --75.3203 --75.3094 --75.3266 --75.3 --75.3016 --75.3125 --75.3078 --75.3109 --75.3016 --75.3094 --75.3141 --75.3094 --75.3078 --75.3047 --75.3203 --75.3063 --75.3063 --75.3187 --75.3125 --75.3187 --75.3203 --75.3187 --75.3187 --75.3125 --75.3203 --75.3063 --75.3172 --75.3125 --75.3063 --75.325 --75.3266 --75.3078 --75.3187 --75.3172 --75.3187 --75.3125 --75.3266 --75.3078 --75.3094 --75.325 --75.325 --75.3156 --75.3234 --75.3094 --75.3219 --75.3219 --75.3172 --75.3187 --75.3203 --75.3203 --75.3125 --75.3172 --75.3219 --75.3125 --75.3141 --75.3234 --75.3297 --75.3266 --75.3156 --75.3172 --75.3125 --75.3187 --75.3172 --75.3266 --75.3203 --75.3125 --75.3266 --75.3172 --75.3234 --75.3187 --75.3219 --75.3266 --75.3156 --75.3313 --75.325 --75.325 --75.3266 --75.3375 --75.3172 --75.3313 --75.3375 --75.3359 --75.3297 --75.3422 --75.3344 --75.3344 --75.3297 --75.3359 --75.3187 --75.3344 --75.3344 --75.3281 --75.3313 --75.3281 --75.3297 --75.3281 --75.3297 --75.3422 --75.3234 --75.3219 --75.3297 --75.3328 --75.3313 --75.3281 --75.3281 --75.3438 --75.325 --75.3359 --75.3391 --75.3391 --75.3266 --75.3391 --75.3375 --75.3422 --75.3453 --75.3359 --75.3375 --75.3391 --75.3344 --75.3422 --75.3391 --75.3484 --75.3406 --75.3469 --75.3453 --75.3234 --75.3328 --75.3328 --75.3391 --75.3453 --75.3313 --75.325 --75.3453 --75.3281 --75.3469 --75.3453 --75.3531 --75.35 --75.3406 --75.3359 --75.3359 --75.3438 --75.3281 --75.35 --75.3578 --75.3469 --75.3531 --75.3453 --75.3453 --75.35 --75.3391 --75.3453 --75.3484 --75.3313 --75.3516 --75.3422 --75.35 --75.3422 --75.3625 --75.3453 --75.3422 --75.3531 --75.3469 --75.3453 --75.3438 --75.3422 --75.3359 --75.3469 --75.3672 --75.3469 --75.3422 --75.3547 --75.3422 --75.35 --75.3531 --75.3641 --75.3391 --75.3469 --75.3453 --75.3422 --75.3422 --75.3469 --75.3391 --75.3484 --75.3531 --75.3438 --75.3438 --75.3562 --75.3609 --75.3453 --75.3578 --75.3578 --75.3484 --75.3594 --75.3516 --75.3578 --75.3594 --75.3391 --75.3531 --75.35 --75.3516 --75.3422 --75.3359 --75.3406 --75.3531 --75.3391 --75.3516 --75.3453 --75.3484 --75.3578 --75.3562 --75.3594 --75.3438 --75.3547 --75.3469 --75.3562 --75.3484 --75.3375 --75.3484 --75.3484 --75.3594 --75.3625 --75.3625 --75.3453 --75.3516 --75.3625 --75.3516 --75.3562 --75.3453 --75.3469 --75.35 --75.3469 --75.3469 --75.3406 --75.3531 --75.3656 --75.3453 --75.3516 --75.3609 --75.3469 --75.3641 --75.3531 --75.3453 --75.3469 --75.3531 --75.3484 --75.3547 --75.3406 --75.3469 --75.35 --75.3547 --75.35 --75.35 --75.3406 --75.3516 --75.3531 --75.3375 --75.3453 --75.3438 --75.3438 --75.3484 --75.35 --75.3547 --75.35 --75.3422 --75.3578 --75.3578 --75.3406 --75.3484 --75.3531 --75.3547 --75.3484 --75.3469 --75.3438 --75.3438 --75.3547 --75.3547 --75.3672 --75.3547 --75.3453 --75.3703 --75.3719 --75.3578 --75.3688 --75.3531 --75.3625 --75.3734 --75.3594 --75.35 --75.3609 --75.375 --75.3641 --75.3688 --75.3703 --75.375 --75.3672 --75.3609 --75.3688 --75.3656 --75.3984 --75.3656 --75.3641 --75.3875 --75.3672 --75.3688 --75.3594 --75.3812 --75.3672 --75.3766 --75.3625 --75.3641 --75.3672 --75.3625 --75.3641 --75.3656 --75.3672 --75.3641 --75.3734 --75.3531 --75.3562 --75.3562 --75.3734 --75.3641 --75.3562 --75.3656 --75.375 --75.3484 --75.3641 --75.3625 --75.3719 --75.3641 --75.3625 --75.3828 --75.3641 --75.3641 --75.3734 --75.3828 --75.3688 --75.375 --75.375 --75.3703 --75.3703 --75.3547 --75.3703 --75.3656 --75.3703 --75.3734 --75.3719 --75.3703 --75.3641 --75.3688 --75.3656 --75.3734 --75.3766 --75.3594 --75.3703 --75.3688 --75.3656 --75.3734 --75.3672 --75.3828 --75.3688 --75.3672 --75.3812 --75.375 --75.3812 --75.3672 --75.3703 --75.3875 --75.3797 --75.3688 --75.375 --75.3781 --75.3875 --75.3859 --75.3734 --75.375 --75.3781 --75.3766 --75.3609 --75.3828 --75.3672 --75.3891 --75.3781 --75.3797 --75.3875 --75.3703 --75.3859 --75.3828 --75.3781 --75.3781 --75.3969 --75.3766 --75.3828 --75.3875 --75.3859 --75.3938 --75.3828 --75.3828 --75.3797 --75.3906 --75.3922 --75.3781 --75.375 --75.3875 --75.3922 --75.3766 --75.3906 --75.3906 --75.3781 --75.3859 --75.3734 --75.3781 --75.3781 --75.3969 --75.3781 --75.3859 --75.3781 --75.3859 --75.3781 --75.3906 --75.3844 --75.3781 --75.3875 --75.3797 --75.3812 --75.3703 --75.3688 --75.3922 --75.3828 --75.3734 --75.3719 --75.3812 --75.3641 --75.3797 --75.3812 --75.3906 --75.3797 --75.3875 --75.3719 --75.3797 --75.3844 --75.3844 --75.3844 --75.3734 --75.3703 --75.4 --75.4031 --75.3672 --75.3875 --75.3719 --75.3594 --75.3859 --75.375 --75.3875 --75.3734 --75.3812 --75.3938 --75.3844 --75.3688 --75.3719 --75.3703 --75.3812 --75.375 --75.3625 --75.3797 --75.3766 --75.3781 --75.3734 --75.375 --75.3766 --75.3875 --75.3906 --75.3844 --75.3797 --75.3844 --75.3875 --75.3703 --75.3922 --75.3859 --75.3828 --75.375 --75.3844 --75.3906 --75.3906 --75.3828 --75.3844 --75.3766 --75.3891 --75.375 --75.3781 --75.3859 --75.3953 --75.3656 --75.3781 --75.375 --75.3938 --75.3891 --75.3891 --75.3781 --75.3781 --75.3922 --75.3766 --75.3812 --75.3828 --75.3938 --75.3828 --75.3953 --75.3922 --75.3969 --75.3828 --75.3969 --75.4 --75.3859 --75.3922 --75.3969 --75.4016 --75.3969 --75.3953 --75.3969 --75.4078 --75.3922 --75.3969 --75.4031 --75.4047 --75.3984 --75.3922 --75.3969 --75.3844 --75.3844 --75.4031 --75.4016 --75.4078 --75.3844 --75.4047 --75.3906 --75.3953 --75.4 --75.4 --75.3875 --75.3938 --75.3875 --75.3922 --75.3781 --75.3844 --75.3953 --75.3812 --75.3953 --75.3969 --75.3797 --75.3969 --75.3984 --75.3953 --75.3922 --75.3891 --75.3922 --75.3859 --75.3828 --75.3906 --75.4062 --75.3844 --75.3969 --75.3781 --75.3797 --75.3734 --75.3922 --75.3875 --75.3844 --75.3938 --75.3938 --75.3781 --75.4047 --75.3984 --75.3938 --75.3984 --75.4016 --75.4016 --75.3859 --75.3891 --75.3844 --75.3969 --75.3922 --75.3938 --75.3797 --75.3984 --75.3938 --75.3906 --75.3938 --75.3953 --75.3953 --75.3891 --75.3891 --75.3891 --75.3891 --75.4047 --75.3922 --75.3953 --75.3922 --75.3875 --75.3859 --75.3906 --75.3922 --75.3984 --75.3891 --75.3797 --75.3922 --75.3797 --75.375 --75.3891 --75.3797 --75.3828 --75.3828 --75.3906 --75.3875 --75.3922 --75.4016 --75.3938 --75.3891 --75.3891 --75.3906 --75.3969 --75.3922 --75.3922 --75.3969 --75.3781 --75.3938 --75.4047 --75.3984 --75.3812 --75.3828 --75.4016 --75.3922 --75.3891 --75.3906 --75.3922 --75.4 --75.3891 --75.3828 --75.4 --75.3953 --75.3891 --75.3969 --75.3938 --75.3984 --75.3984 --75.3938 --75.3953 --75.3953 --75.3938 --75.3953 --75.3938 --75.3922 --75.3984 --75.4 --75.4062 --75.4078 --75.4078 --75.3984 --75.4172 --75.4062 --75.4 --75.4 --75.4078 --75.4094 --75.4047 --75.4031 --75.3953 --75.4047 --75.3891 --75.4078 --75.4 --75.4062 --75.4109 --75.4031 --75.4094 --75.4 --75.4062 --75.4078 --75.4172 --75.4187 --75.3891 --75.4109 --75.4062 --75.4062 --75.4125 --75.4141 --75.4062 --75.4125 --75.4062 --75.4062 --75.4047 --75.4094 --75.4078 --75.4078 --75.4078 --75.4016 --75.4062 --75.4062 --75.4141 --75.4031 --75.4047 --75.3922 --75.4062 --75.4047 --75.4094 --75.4156 --75.4109 --75.4234 --75.4125 --75.4125 --75.4094 --75.4078 --75.4062 --75.4047 --75.3969 --75.4078 --75.4109 --75.4031 --75.4062 --75.4125 --75.3984 --75.4016 --75.4016 --75.4016 --75.4062 --75.3969 --75.3875 --75.4047 --75.4 --75.4 --75.3969 --75.3875 --75.3984 --75.3969 --75.4125 --75.4094 --75.4031 --75.4047 --75.4047 --75.4016 --75.3922 --75.4062 --75.4187 --75.4078 --75.4156 --75.4172 --75.4062 --75.4156 --75.4016 --75.4031 --75.4094 --75.4094 --75.4094 --75.4078 --75.4094 --75.4078 --75.4 --75.4094 --75.4047 --75.4016 --75.4109 --75.4109 --75.4109 --75.4141 --75.3984 --75.4125 --75.4047 --75.4031 --75.4031 --75.4016 --75.4078 --75.4078 --75.4094 --75.4187 --75.4094 --75.4094 --75.4031 --75.4141 --75.4031 --75.4156 --75.4062 --75.4078 --75.4109 --75.4125 --75.3984 --75.4047 --75.4156 --75.4219 --75.4078 --75.4109 --75.4062 --75.4156 --75.4094 --75.4125 --75.4187 --75.4219 --75.4187 --75.4219 --75.4109 --75.4203 --75.4156 --75.4203 --75.4156 --75.4203 --75.4219 --75.425 --75.4203 --75.4094 --75.4234 --75.4219 --75.4203 --75.4203 --75.4203 --75.4234 --75.4203 --75.4219 --75.4297 --75.425 --75.4391 --75.4094 --75.4344 --75.4219 --75.4187 --75.4187 --75.4219 --75.4187 --75.4109 --75.4062 --75.4125 --75.4219 --75.4187 --75.4203 --75.4156 --75.425 --75.4266 --75.4187 --75.4172 --75.4313 --75.4219 --75.4141 --75.4375 --75.425 --75.4313 --75.4234 --75.4219 --75.4313 --75.4234 --75.4156 --75.4172 --75.4094 --75.4219 --75.4219 --75.4078 --75.4203 --75.4219 --75.4172 --75.4125 --75.4219 --75.4203 --75.4047 --75.4344 --75.4297 --75.425 --75.4219 --75.4266 --75.4313 --75.4219 --75.4297 --75.4078 --75.4391 --75.4281 --75.4344 --75.4172 --75.4172 --75.4297 --75.4203 --75.4266 --75.4187 --75.425 --75.4187 --75.4234 --75.4234 --75.4203 --75.425 --75.4203 --75.4141 --75.4297 --75.4297 --75.4344 --75.4234 --75.4328 --75.4344 --75.4234 --75.4281 --75.4297 --75.4297 --75.425 --75.4172 --75.425 --75.4203 --75.4187 --75.4187 --75.4313 --75.4219 --75.4187 --75.4234 --75.4281 --75.4281 --75.4281 --75.4313 --75.4266 --75.4422 --75.4234 --75.425 --75.4375 --75.4313 --75.4281 --75.4234 --75.4297 --75.4281 --75.4313 --75.4219 --75.4344 --75.4313 --75.4313 --75.425 --75.4359 --75.4297 --75.4297 --75.4313 --75.4234 --75.4266 --75.425 --75.4187 --75.4078 --75.4141 --75.4187 --75.4281 --75.4172 --75.4328 --75.4375 --75.4234 --75.4328 --75.4219 --75.4266 --75.4297 --75.4203 --75.4234 --75.4328 --75.4219 --75.4281 --75.4391 --75.4297 --75.4328 --75.4359 --75.4422 --75.4266 --75.4234 --75.4234 --75.4453 --75.425 --75.4141 --75.4313 --75.4156 --75.4344 --75.4313 --75.4266 --75.4453 --75.4375 --75.4328 --75.4313 --75.4406 --75.4437 --75.4328 --75.4359 --75.4313 --75.4281 --75.425 --75.425 --75.4203 --75.4359 --75.4234 --75.4156 --75.4297 --75.4328 --75.4203 --75.4375 --75.4469 --75.4453 --75.4422 --75.4469 --75.4313 --75.4422 --75.4469 --75.4281 --75.4391 --75.4344 --75.4281 --75.4219 --75.4313 --75.4234 --75.4375 --75.4375 --75.4234 --75.4297 --75.4422 --75.4375 --75.4281 --75.4313 --75.4359 --75.4375 --75.4406 --75.4125 --75.4172 --75.4156 --75.4313 --75.4313 --75.4219 --75.4344 --75.425 --75.4375 --75.4313 --75.4391 --75.4172 --75.4344 --75.4328 --75.4297 --75.4313 --75.4328 --75.4203 --75.425 --75.425 --75.4141 --75.4219 --75.425 --75.4141 --75.4187 --75.4203 --75.4406 --75.4422 --75.4125 --75.4297 --75.4297 --75.4266 --75.4344 --75.425 --75.4234 --75.4234 --75.4328 --75.4344 --75.4297 --75.4219 --75.4234 --75.4156 --75.4187 --75.4344 --75.4297 --75.4281 --75.45 --75.4391 --75.4437 --75.4422 --75.4422 --75.4406 --75.4437 --75.4359 --75.4391 --75.4281 --75.4547 --75.4406 --75.4391 --75.4422 --75.4391 --75.4484 --75.45 --75.4313 --75.4297 --75.4297 --75.4328 --75.4344 --75.4422 --75.4437 --75.4469 --75.4437 --75.4359 --75.4422 --75.4484 --75.4359 --75.4437 --75.4359 --75.4406 --75.4375 --75.4406 --75.4406 --75.4406 --75.4297 --75.4484 --75.4453 --75.4281 --75.4422 --75.4406 --75.4328 --75.4313 --75.4297 --75.4422 --75.4437 --75.4391 --75.4313 --75.4406 --75.4375 --75.4375 --75.4391 --75.4266 --75.4516 --75.4281 --75.4391 --75.4344 --75.4375 --75.4266 --75.4359 --75.4437 --75.4391 --75.4422 --75.4437 --75.4563 --75.4437 --75.4437 --75.4313 --75.4328 --75.4266 --75.4406 --75.4375 --75.4375 --75.4344 --75.4266 --75.4422 --75.4328 --75.4391 --75.4437 --75.4453 --75.4391 --75.4531 --75.4406 --75.4437 --75.4406 --75.4469 --75.4437 --75.4516 --75.4484 --75.4469 --75.4469 --75.4594 --75.45 --75.4391 --75.4437 --75.4469 --75.4453 --75.4406 --75.4531 --75.4359 --75.4391 --75.4516 --75.45 --75.4469 --75.4297 --75.4484 --75.4406 --75.4359 --75.4437 --75.4422 --75.4391 --75.4531 --75.45 --75.4469 --75.4437 --75.4406 --75.4391 --75.4437 --75.4453 --75.4375 --75.4391 --75.4391 --75.4313 --75.4547 --75.4531 --75.4578 --75.4391 --75.4391 --75.4453 --75.4563 --75.4406 --75.4625 --75.4531 --75.4359 --75.4547 --75.4547 --75.4375 --75.4531 --75.4547 --75.45 --75.4391 --75.4437 --75.4484 --75.45 --75.4453 --75.4531 --75.4469 --75.4297 --75.4469 --75.4453 --75.4406 --75.4578 --75.4547 --75.4594 --75.4406 --75.4734 --75.4531 --75.4594 --75.4453 --75.4453 --75.4453 --75.4437 --75.4484 --75.4531 --75.4422 --75.45 --75.4266 --75.4437 --75.4531 --75.4359 --75.4547 --75.4531 --75.4406 --75.4547 --75.4578 --75.45 --75.4625 --75.4594 --75.4641 --75.4578 --75.4656 --75.4641 --75.4563 --75.4594 --75.4703 --75.4437 --75.4563 --75.4609 --75.4734 --75.4609 --75.4469 --75.4594 --75.4531 --75.4547 --75.4531 --75.4625 --75.4719 --75.4563 --75.45 --75.4641 --75.4516 --75.45 --75.4656 --75.4437 --75.4516 --75.4578 --75.4563 --75.4594 --75.4531 --75.4531 --75.4641 --75.45 --75.4656 --75.4609 --75.4688 --75.475 --75.4563 --75.4672 --75.4641 --75.4656 --75.4703 --75.4609 --75.4656 --75.4844 --75.4609 --75.4688 --75.4578 --75.4703 --75.4563 --75.4547 --75.4641 --75.4625 --75.4406 --75.4594 --75.4594 --75.4688 --75.4609 --75.4563 --75.45 --75.4594 --75.4656 --75.4563 --75.4609 --75.4609 --75.4766 --75.4641 --75.4656 --75.4563 --75.4688 --75.4703 --75.4516 --75.4609 --75.4734 --75.4578 --75.4703 --75.4516 --75.4688 --75.4625 --75.4766 --75.4719 --75.4688 --75.4875 --75.4828 --75.4797 --75.4703 --75.4766 --75.4672 --75.4703 --75.475 --75.4719 --75.4766 --75.4641 --75.4781 --75.4734 --75.4797 --75.4625 --75.4781 --75.4641 --75.475 --75.4563 --75.4656 --75.4531 --75.4734 --75.4719 --75.4719 --75.45 --75.4688 --75.4797 --75.4625 --75.4734 --75.4609 --75.4594 --75.4594 --75.4672 --75.4719 --75.4609 --75.4453 --75.4609 --75.4672 --75.4688 --75.475 --75.4641 --75.4563 --75.4672 --75.4547 --75.4672 --75.4531 --75.4609 --75.4578 --75.475 --75.4688 --75.4688 --75.4688 --75.4641 --75.4578 --75.475 --75.4609 --75.4641 --75.4625 --75.4797 --75.4578 --75.4547 --75.4641 --75.4563 --75.4703 --75.4625 --75.4484 --75.4672 --75.4734 --75.4688 --75.475 --75.4688 --75.475 --75.4797 --75.4906 --75.4734 --75.4719 --75.4859 --75.4812 --75.4688 --75.4734 --75.4812 --75.4672 --75.4844 --75.4688 --75.4672 --75.4781 --75.4719 --75.4672 --75.4484 --75.4719 --75.475 --75.4672 --75.4703 --75.4688 --75.4828 --75.4703 --75.475 --75.4703 --75.4719 --75.4797 --75.4672 --75.4781 --75.4625 --75.4766 --75.4734 --75.4734 --75.4609 --75.4703 --75.4563 --75.4734 --75.475 --75.475 --75.4766 --75.475 --75.4672 --75.4797 --75.4922 --75.4719 --75.4781 --75.475 --75.4688 --75.4734 --75.4641 --75.4812 --75.4719 --75.4656 --75.475 --75.4641 --75.4875 --75.4609 --75.475 --75.4703 --75.4859 --75.4609 --75.4812 --75.4734 --75.4688 --75.4781 --75.4781 --75.4688 --75.4656 --75.4766 --75.4859 --75.4734 --75.4766 --75.4734 --75.4828 --75.4812 --75.4797 --75.475 --75.4812 --75.4844 --75.4844 --75.4828 --75.4703 --75.475 --75.4781 --75.4828 --75.4781 --75.4734 --75.475 --75.4859 --75.4672 --75.4891 --75.4688 --75.4859 --75.475 --75.4812 --75.4734 --75.4859 --75.4734 --75.4797 --75.4625 --75.4781 --75.4797 --75.4781 --75.4766 --75.4797 --75.4766 --75.4797 --75.4844 --75.4906 --75.4953 --75.4875 --75.4781 --75.4672 --75.4719 --75.4719 --75.4828 --75.4703 --75.4766 --75.4828 --75.4812 --75.4922 --75.4891 --75.4859 --75.4812 --75.4812 --75.4984 --75.4891 --75.4828 --75.4641 --75.4781 --75.4734 --75.4703 --75.4703 --75.4781 --75.4766 --75.4859 --75.4688 --75.4766 --75.4578 --75.4672 --75.4844 --75.4703 --75.4844 --75.475 --75.4812 --75.4703 --75.4766 --75.4719 --75.4844 --75.4734 --75.4922 --75.4766 --75.4828 --75.4797 --75.475 --75.4781 --75.4875 --75.4859 --75.4844 --75.4828 --75.4922 --75.475 --75.4844 --75.5094 --75.4906 --75.4922 --75.4938 --75.4812 --75.4812 --75.4891 --75.475 --75.4891 --75.4781 --75.4891 --75.4875 --75.4844 --75.4969 --75.4953 --75.4781 --75.4969 --75.4922 --75.5016 --75.4938 --75.4859 --75.4938 --75.4875 --75.4953 --75.4875 --75.5016 --75.4859 --75.4922 --75.5094 --75.4922 --75.4984 --75.5031 --75.4875 --75.5016 --75.4984 --75.4969 --75.4969 --75.5078 --75.5 --75.4953 --75.4906 --75.4906 --75.4922 --75.4875 --75.4953 --75.4844 --75.4984 --75.4969 --75.4766 --75.4875 --75.4828 --75.5016 --75.5047 --75.4922 --75.4922 --75.5062 --75.5078 --75.4938 --75.4984 --75.5047 --75.5016 --75.4938 --75.4938 --75.5062 --75.4938 --75.4812 --75.4891 --75.4875 --75.5 --75.4953 --75.4844 --75.4844 --75.4969 --75.4938 --75.4953 --75.4859 --75.5125 --75.4953 --75.4922 --75.5047 --75.5016 --75.4859 --75.4906 --75.5 --75.4938 --75.5 --75.5109 --75.4969 --75.5031 --75.4953 --75.5078 --75.5078 --75.5094 --75.5016 --75.5109 --75.4969 --75.5094 --75.5031 --75.5125 --75.5219 --75.5062 --75.5 --75.5094 --75.5 --75.5203 --75.5188 --75.5125 --75.5125 --75.5172 --75.5141 --75.5297 --75.5234 --75.5219 --75.5172 --75.5047 --75.5172 --75.5109 --75.5156 --75.5188 --75.525 --75.5172 --75.5203 --75.5125 --75.5125 --75.5125 --75.5062 --75.5188 --75.5094 --75.5062 --75.5109 --75.5266 --75.5281 --75.4969 --75.5094 --75.5062 --75.5125 --75.5125 --75.5234 --75.4984 --75.5062 --75.5047 --75.5 --75.5078 --75.5141 --75.5125 --75.5203 --75.5203 --75.5141 --75.5062 --75.5109 --75.5125 --75.5094 --75.5125 --75.5219 --75.5141 --75.5047 --75.5312 --75.5172 --75.5125 --75.5125 --75.5359 --75.5234 --75.5109 --75.5172 --75.5078 --75.5234 --75.525 --75.5062 --75.5016 --75.5156 --75.5172 --75.5203 --75.5156 --75.4969 --75.5219 --75.5172 --75.5078 --75.5234 --75.5031 --75.5109 --75.5 --75.5062 --75.525 --75.5094 --75.5234 --75.5266 --75.5047 --75.5094 --75.5141 --75.5188 --75.5109 --75.5188 --75.5125 --75.5266 --75.5078 --75.5203 --75.5125 --75.5172 --75.5188 --75.5234 --75.5094 --75.5188 --75.5062 --75.5234 --75.5203 --75.5125 --75.5141 --75.5141 --75.5203 --75.5062 --75.5219 --75.5203 --75.5016 --75.5109 --75.5109 --75.5109 --75.4922 --75.5141 --75.5062 --75.4938 --75.5 --75.5078 --75.4953 --75.4938 --75.5031 --75.5078 --75.5203 --75.4969 --75.4922 --75.5078 --75.5016 --75.5078 --75.5078 --75.5062 --75.5125 --75.5125 --75.5031 --75.5047 --75.5062 --75.5016 --75.5125 --75.5031 --75.5047 --75.5125 --75.5156 --75.5094 --75.5078 --75.5328 --75.5109 --75.5156 --75.5047 --75.5094 --75.5125 --75.5062 --75.5062 --75.5109 --75.5156 --75.4891 --75.5062 --75.5047 --75.5109 --75.5156 --75.5047 --75.5219 --75.5 --75.5141 --75.5281 --75.5062 --75.5078 --75.4984 --75.5219 --75.5047 --75.5062 --75.5203 --75.5203 --75.5188 --75.5094 --75.5125 --75.5188 --75.5125 --75.5141 --75.5125 --75.5203 --75.5234 --75.5219 --75.5312 --75.5109 --75.5234 --75.5266 --75.5172 --75.5266 --75.5188 --75.5312 --75.5219 --75.5172 --75.5172 --75.5234 --75.5156 --75.5078 --75.5062 --75.5297 --75.5109 --75.5047 --75.5016 --75.5047 --75.525 --75.4969 --75.5141 --75.5172 --75.5188 --75.5156 --75.5219 --75.5281 --75.5188 --75.5266 --75.5266 --75.5297 --75.5328 --75.5312 --75.5359 --75.5188 --75.5359 --75.5312 --75.5281 --75.5359 --75.5312 --75.5109 --75.5203 --75.5328 --75.5125 --75.5156 --75.5203 --75.5078 --75.5094 --75.525 --75.5172 --75.5156 --75.5016 --75.5062 --75.5156 --75.5219 --75.5125 --75.5125 --75.5062 --75.5125 --75.5109 --75.5297 --75.5016 --75.5156 --75.5266 --75.5281 --75.5375 --75.5219 --75.5141 --75.5266 --75.5172 --75.5188 --75.525 --75.5203 --75.5094 --75.5141 --75.5281 --75.5266 --75.5359 --75.5297 --75.5141 --75.5328 --75.5266 --75.5266 --75.5188 --75.5141 --75.5156 --75.5281 --75.5297 --75.5219 --75.5219 --75.5172 --75.5406 --75.5125 --75.5281 --75.5188 --75.5297 --75.5312 --75.5297 --75.525 --75.5203 --75.5328 --75.525 --75.5188 --75.5203 --75.5266 --75.5234 --75.5219 --75.5219 --75.525 --75.5266 --75.5344 --75.5172 --75.5203 --75.5344 --75.5203 --75.5203 --75.5188 --75.5297 --75.5328 --75.5219 --75.5391 --75.5297 --75.525 --75.5312 --75.5328 --75.5266 --75.5188 --75.5344 --75.5281 --75.5281 --75.5484 --75.5359 --75.5312 --75.5406 --75.5437 --75.5328 --75.5297 --75.5344 --75.525 --75.5234 --75.5422 --75.5344 --75.5344 --75.525 --75.5469 --75.5484 --75.5422 --75.5312 --75.5344 --75.5484 --75.5391 --75.5312 --75.525 --75.5469 --75.5359 --75.5516 --75.5484 --75.5422 --75.5437 --75.5312 --75.5359 --75.5266 --75.5312 --75.5359 --75.5422 --75.5266 --75.5531 --75.5422 --75.5344 --75.5422 --75.5297 --75.5391 --75.5297 --75.5469 --75.5344 --75.5422 --75.5312 --75.5203 --75.5484 --75.5484 --75.5437 --75.5375 --75.5453 --75.5391 --75.5281 --75.5281 --75.5484 --75.5563 --75.5375 --75.5359 --75.5437 --75.5359 --75.5203 --75.5406 --75.5422 --75.5328 --75.5578 --75.5297 --75.5391 --75.5359 --75.5359 --75.5281 --75.5469 --75.5453 --75.5391 --75.5328 --75.525 --75.5563 --75.5406 --75.5422 --75.5344 --75.5422 --75.5359 --75.5437 --75.5531 --75.5594 --75.5516 --75.5359 --75.5453 --75.5547 --75.5516 --75.55 --75.5312 --75.5422 --75.5359 --75.5484 --75.5516 --75.5437 --75.5437 --75.5469 --75.55 --75.5547 --75.5437 --75.5516 --75.5375 --75.5484 --75.5422 --75.5547 --75.5375 --75.5484 --75.5563 --75.5516 --75.5469 --75.5531 --75.5375 --75.5422 --75.5469 --75.5547 --75.5344 --75.5484 --75.5437 --75.5359 --75.5328 --75.5469 --75.55 --75.5406 --75.5516 --75.5469 --75.5437 --75.5437 --75.5437 --75.5531 --75.5328 --75.5547 --75.5516 --75.5516 --75.5516 --75.5453 --75.5484 --75.5391 --75.5531 --75.5469 --75.5594 --75.5453 --75.5578 --75.5594 --75.5578 --75.5469 --75.5563 --75.5453 --75.525 --75.5437 --75.5422 --75.5344 --75.5547 --75.5547 --75.5547 --75.5391 --75.5453 --75.5437 --75.5453 --75.5453 --75.5484 --75.5516 --75.5437 --75.5422 --75.5469 --75.55 --75.5516 --75.5453 --75.5437 --75.5516 --75.5516 --75.5422 --75.5547 --75.5406 --75.5453 --75.5484 --75.5516 --75.5391 --75.5531 --75.5422 --75.5531 --75.5531 --75.5391 --75.5469 --75.5563 --75.5406 --75.5563 --75.5563 --75.5406 --75.5594 --75.5469 --75.5453 --75.5516 --75.5516 --75.5531 --75.5422 --75.5359 --75.5453 --75.5547 --75.5594 --75.5516 --75.5344 --75.5516 --75.5531 --75.5453 --75.5672 --75.5422 --75.5594 --75.5578 --75.5563 --75.5672 --75.5625 --75.5594 --75.55 --75.5516 --75.5641 --75.55 --75.5609 --75.5734 --75.5625 --75.5531 --75.5469 --75.5516 --75.5641 --75.5547 --75.5609 --75.5563 --75.5641 --75.5594 --75.5531 --75.5609 --75.5469 --75.5547 --75.5406 --75.5563 --75.5375 --75.55 --75.5469 --75.5469 --75.5453 --75.5437 --75.5547 --75.5516 --75.5547 --75.5641 --75.5563 --75.55 --75.5422 --75.55 --75.5422 --75.5578 --75.55 --75.55 --75.5609 --75.5469 --75.5734 --75.5453 --75.5547 --75.5516 --75.5516 --75.5531 --75.5625 --75.5594 --75.5594 --75.5547 --75.55 --75.5547 --75.5625 --75.5594 --75.5625 --75.55 --75.5563 --75.5531 --75.5422 --75.5422 --75.5547 --75.5578 --75.5625 --75.5563 --75.5594 --75.5641 --75.5484 --75.5516 --75.5594 --75.5594 --75.5531 --75.5594 --75.5531 --75.5547 --75.5687 --75.5687 --75.575 --75.5531 --75.5547 --75.5547 --75.5531 --75.5578 --75.5469 --75.5531 --75.5516 --75.5547 --75.5547 --75.5578 --75.5594 --75.5578 --75.5656 --75.55 --75.5578 --75.5531 --75.5672 --75.5594 --75.5687 --75.5578 --75.5594 --75.5609 --75.5594 --75.5547 --75.5531 --75.5734 --75.5734 --75.5437 --75.5609 --75.5547 --75.5687 --75.5563 --75.5578 --75.5703 --75.5578 --75.5563 --75.5641 --75.5516 --75.5516 --75.5578 --75.5656 --75.5578 --75.5563 --75.5594 --75.5672 --75.5734 --75.5781 --75.575 --75.5563 --75.5594 --75.5609 --75.5625 --75.575 --75.5672 --75.5594 --75.5656 --75.5719 --75.5563 --75.5797 --75.5625 --75.5609 --75.5641 --75.5594 --75.5625 --75.5594 --75.5609 --75.5578 --75.5609 --75.5469 --75.5594 --75.5547 --75.5531 --75.5625 --75.575 --75.5687 --75.5859 --75.5687 --75.5766 --75.5719 --75.5906 --75.5766 --75.5719 --75.5672 --75.5563 --75.575 --75.5687 --75.5641 --75.5672 --75.5641 --75.5594 --75.5703 --75.5609 --75.5625 --75.575 --75.5625 --75.5609 --75.5594 --75.5625 --75.5531 --75.5563 --75.55 --75.5641 --75.5594 --75.5687 --75.5609 --75.5734 --75.5594 --75.5687 --75.5656 --75.5703 --75.5687 --75.5781 --75.5641 --75.5641 --75.5656 --75.5719 --75.55 --75.5703 --75.5578 --75.5656 --75.5656 --75.5641 --75.575 --75.5547 --75.5797 --75.5797 --75.5797 --75.5844 --75.5734 --75.5703 --75.5578 --75.5703 --75.575 --75.575 --75.5797 --75.5797 --75.5813 --75.5719 --75.5578 --75.5734 --75.575 --75.5672 --75.5687 --75.5719 --75.5687 --75.5719 --75.5641 --75.5687 --75.5813 --75.5625 --75.575 --75.5609 --75.5656 --75.5906 --75.5656 --75.5672 --75.5672 --75.5625 --75.5641 --75.5609 --75.5531 --75.5594 --75.5469 --75.5578 --75.55 --75.5609 --75.5609 --75.5703 --75.5563 --75.5578 --75.5531 --75.5609 --75.5719 --75.5641 --75.5781 --75.5625 --75.5609 --75.5766 --75.5703 --75.5594 --75.5625 --75.575 --75.5547 --75.5687 --75.5641 --75.575 --75.5703 --75.5813 --75.5641 --75.5656 --75.5656 --75.5859 --75.5797 --75.575 --75.5703 --75.5875 --75.5844 --75.5687 --75.575 --75.5547 --75.5703 --75.5625 --75.5594 --75.5672 --75.5563 --75.5656 --75.5672 --75.5703 --75.575 --75.5687 --75.5641 --75.5859 --75.5766 --75.5734 --75.5766 --75.5766 --75.5656 --75.5641 --75.5844 --75.5859 --75.5766 --75.5781 --75.5859 --75.5672 --75.575 --75.5875 --75.5703 --75.5891 --75.5734 --75.5734 --75.5797 --75.5703 --75.5813 --75.5813 --75.5813 --75.5781 --75.5828 --75.575 --75.5859 --75.5797 --75.5844 --75.5687 --75.5797 --75.5734 --75.5797 --75.5734 --75.5656 --75.5719 --75.5641 --75.5687 --75.5656 --75.5656 --75.5813 --75.575 --75.5641 --75.5719 --75.5719 --75.5734 --75.5656 --75.5672 --75.5734 --75.575 --75.575 --75.5859 --75.5891 --75.5891 --75.5734 --75.5953 --75.5953 --75.5828 --75.5922 --75.5719 --75.5813 --75.5828 --75.5781 --75.5844 --75.5766 --75.5859 --75.5828 --75.5594 --75.575 --75.5859 --75.5687 --75.575 --75.5859 --75.5859 --75.5766 --75.5828 --75.5781 --75.5813 --75.5703 --75.575 --75.5938 --75.5719 --75.5781 --75.5828 --75.5766 --75.5781 --75.5891 --75.5797 --75.5797 --75.5813 --75.5781 --75.5734 --75.5766 --75.5766 --75.5813 --75.5813 --75.5703 --75.5844 --75.5797 --75.5797 --75.5953 --75.5813 --75.5844 --75.5828 --75.5766 --75.5734 --75.5875 --75.5703 --75.575 --75.5734 --75.575 --75.5672 --75.5734 --75.5844 --75.5797 --75.5813 --75.5844 --75.5859 --75.5891 --75.5781 --75.5828 --75.5844 --75.5781 --75.5797 --75.575 --75.5703 --75.575 --75.5641 --75.5687 --75.5766 --75.5828 --75.5875 --75.575 --75.5734 --75.5734 --75.5797 --75.5687 --75.5859 --75.5859 --75.5719 --75.5813 --75.5687 --75.5734 --75.5719 --75.5609 --75.5766 --75.5719 --75.5703 --75.5828 --75.5766 --75.5719 --75.5875 --75.5797 --75.5781 --75.5797 --75.5844 --75.6016 --75.5875 --75.5828 --75.5891 --75.5734 --75.5781 --75.5687 --75.5813 --75.5797 --75.575 --75.5719 --75.5797 --75.5797 --75.5875 --75.5953 --75.5672 --75.5891 --75.5766 --75.5687 --75.5813 --75.5844 --75.5719 --75.5797 --75.5859 --75.5844 --75.5906 --75.5906 --75.5828 --75.5875 --75.5891 --75.5859 --75.5969 --75.5766 --75.5656 --75.5813 --75.5719 --75.5734 --75.5734 --75.5859 --75.5891 --75.5719 --75.5734 --75.5938 --75.5828 --75.5875 --75.5828 --75.5813 --75.5969 --75.5891 --75.5672 --75.5781 --75.5828 --75.575 --75.5781 --75.5844 --75.5938 --75.5906 --75.5781 --75.5844 --75.5813 --75.5719 --75.5844 --75.5703 --75.5687 --75.5687 --75.5766 --75.575 --75.5656 --75.5875 --75.5844 --75.5719 --75.5578 --75.5734 --75.575 --75.5813 --75.5719 --75.5641 --75.5828 --75.5719 --75.5859 --75.575 --75.575 --75.5813 --75.575 --75.5781 --75.5781 --75.5781 --75.5719 --75.5656 --75.5687 --75.575 --75.5844 --75.5766 --75.5813 --75.5828 --75.5781 --75.5875 --75.5875 --75.575 --75.5922 --75.5875 --75.5828 --75.5859 --75.5687 --75.5828 --75.5906 --75.5828 --75.5813 --75.5766 --75.5781 --75.5891 --75.575 --75.5656 --75.5766 --75.5766 --75.5813 --75.5797 --75.5844 --75.5797 --75.5797 --75.5656 --75.5609 --75.5672 --75.5844 --75.5828 --75.5734 --75.5672 --75.5703 --75.5594 --75.5844 --75.5797 --75.5844 --75.5859 --75.5781 --75.575 --75.5703 --75.5781 --75.5813 --75.5687 --75.5875 --75.5781 --75.575 --75.5781 --75.5781 --75.5828 --75.5781 --75.5797 --75.5797 --75.5906 --75.5719 --75.5797 --75.5906 --75.5938 --75.5797 --75.5922 --75.575 --75.6016 --75.5891 --75.5859 --75.5875 --75.5938 --75.5984 --75.5891 --75.5859 --75.5813 --75.5828 --75.575 --75.5797 --75.5828 --75.5797 --75.5813 --75.5875 --75.5859 --75.5781 --75.5781 --75.5844 --75.5891 --75.5734 --75.5969 --75.5922 --75.5938 --75.5859 --75.5859 --75.5969 --75.5781 --75.5844 --75.5906 --75.575 --75.5734 --75.5797 --75.5922 --75.5953 --75.5797 --75.5953 --75.5969 --75.5813 --75.5984 --75.6078 --75.6047 --75.5906 --75.5844 --75.6 --75.5875 --75.5813 --75.5891 --75.5875 --75.5844 --75.5922 --75.6 --75.6016 --75.5875 --75.5984 --75.5797 --75.5969 --75.5984 --75.6016 --75.6047 --75.5953 --75.5953 --75.5859 --75.5953 --75.5969 --75.5828 --75.5906 --75.5938 --75.5828 --75.5891 --75.5844 --75.5938 --75.5844 --75.5984 --75.5875 --75.5906 --75.5953 --75.6062 --75.5906 --75.5969 --75.5969 --75.5844 --75.5891 --75.5766 --75.5813 --75.5969 --75.5797 --75.5797 --75.5813 --75.5813 --75.5891 --75.5828 --75.5766 --75.5766 --75.5875 --75.575 --75.5875 --75.5781 --75.5922 --75.6016 --75.5938 --75.5734 --75.5813 --75.5859 --75.5766 --75.5891 --75.5734 --75.5781 --75.5766 --75.5844 --75.5938 --75.5828 --75.5906 --75.5953 --75.5969 --75.5859 --75.575 --75.5891 --75.5922 --75.5891 --75.5813 --75.5953 --75.5906 --75.5938 --75.6 --75.6 --75.5938 --75.5984 --75.5984 --75.5953 --75.5984 --75.6047 --75.5906 --75.5922 --75.5922 --75.6031 --75.5891 --75.5953 --75.5875 --75.5859 --75.6031 --75.5938 --75.6016 --75.5984 --75.6016 --75.6109 --75.5984 --75.6078 --75.5984 --75.6047 --75.6031 --75.5984 --75.5891 --75.5953 --75.5859 --75.5938 --75.6016 --75.5844 --75.6078 --75.5953 --75.6016 --75.6062 --75.5828 --75.5922 --75.5969 --75.5828 --75.5813 --75.5969 --75.5906 --75.5938 --75.5922 --75.5891 --75.5906 --75.5875 --75.5828 --75.5906 --75.575 --75.6 --75.5781 --75.5891 --75.5703 --75.6016 --75.5969 --75.5906 --75.5797 --75.6125 --75.6094 --75.5859 --75.5922 --75.5922 --75.6062 --75.5984 --75.6016 --75.6016 --75.6062 --75.5953 --75.5969 --75.6016 --75.5969 --75.5969 --75.5875 --75.6016 --75.6062 --75.6 --75.6031 --75.6078 --75.6078 --75.6016 --75.5875 --75.5969 --75.5938 --75.6 --75.5922 --75.5969 --75.6078 --75.5969 --75.6016 --75.5859 --75.5922 --75.6016 --75.6031 --75.5953 --75.5922 --75.6062 --75.6031 --75.6016 --75.6109 --75.5969 --75.5922 --75.6016 --75.6109 --75.5984 --75.5875 --75.6109 --75.6141 --75.6172 --75.6047 --75.6203 --75.6109 --75.625 --75.6078 --75.5984 --75.6141 --75.6156 --75.6047 --75.6016 --75.6094 --75.6141 --75.6109 --75.6156 --75.6188 --75.6141 --75.6125 --75.6156 --75.6109 --75.6141 --75.6078 --75.6172 --75.5938 --75.6 --75.5984 --75.5969 --75.6047 --75.5984 --75.6109 --75.6078 --75.6047 --75.6016 --75.6016 --75.6094 --75.6078 --75.6188 --75.6078 --75.6094 --75.6109 --75.6078 --75.6188 --75.6141 --75.6156 --75.6078 --75.6062 --75.6141 --75.625 --75.6094 --75.6094 --75.6172 --75.6094 --75.6141 --75.6047 --75.6141 --75.6062 --75.6062 --75.6109 --75.6125 --75.6188 --75.6078 --75.6 --75.6109 --75.6047 --75.6 --75.6156 --75.6203 --75.6203 --75.6109 --75.6203 --75.6172 --75.6281 --75.6094 --75.6094 --75.6156 --75.6078 --75.6234 --75.6188 --75.625 --75.6047 --75.6141 --75.6078 --75.6141 --75.625 --75.6234 --75.625 --75.6062 --75.6172 --75.6125 --75.6172 --75.6266 --75.6078 --75.6234 --75.6172 --75.6234 --75.6234 --75.6203 --75.6203 --75.6094 --75.6172 --75.6125 --75.6078 --75.6188 --75.5969 --75.6156 --75.6078 --75.6 --75.6047 --75.6031 --75.6172 --75.5953 --75.6062 --75.6172 --75.6188 --75.6109 --75.6203 --75.6188 --75.6203 --75.6125 --75.6141 --75.6328 --75.6203 --75.6219 --75.6266 --75.6156 --75.6266 --75.6156 --75.6141 --75.6125 --75.6172 --75.6156 --75.6203 --75.6219 --75.6156 --75.6156 --75.6312 --75.6141 --75.6047 --75.6203 --75.6109 --75.6219 --75.6344 --75.6203 --75.6109 --75.6188 --75.6156 --75.6109 --75.6172 --75.6125 --75.6203 --75.6109 --75.6172 --75.6219 --75.6109 --75.6328 --75.6188 --75.6203 --75.6328 --75.6156 --75.6172 --75.6125 --75.6141 --75.625 --75.6172 --75.6188 --75.6156 --75.6203 --75.6328 --75.6125 --75.6266 --75.6266 --75.6203 --75.6047 --75.6172 --75.6141 --75.6219 --75.6047 --75.6188 --75.6141 --75.6188 --75.625 --75.6172 --75.6234 --75.6203 --75.6109 --75.6125 --75.6188 --75.6141 --75.6203 --75.6328 --75.6234 --75.6047 --75.6125 --75.6094 --75.6219 --75.6203 --75.6266 --75.6203 --75.6125 --75.6203 --75.6047 --75.6109 --75.6125 --75.6141 --75.6078 --75.6266 --75.6156 --75.6125 --75.6203 --75.6109 --75.6219 --75.6109 --75.6156 --75.625 --75.6031 --75.6203 --75.6125 --75.6078 --75.6109 --75.6141 --75.6078 --75.6203 --75.6281 --75.6141 --75.6422 --75.5984 --75.6125 --75.6141 --75.6172 --75.6062 --75.6219 --75.6016 --75.6281 --75.6219 --75.6156 --75.6188 --75.6141 --75.6234 --75.6328 --75.6156 --75.6203 --75.6203 --75.6328 --75.6078 --75.6125 --75.6156 --75.6203 --75.6172 --75.6125 --75.6203 --75.6141 --75.6219 --75.6219 --75.6266 --75.6172 --75.6297 --75.6031 --75.6219 --75.6172 --75.6281 --75.6156 --75.6312 --75.6312 --75.6234 --75.6266 --75.6297 --75.6188 --75.6125 --75.6219 --75.6234 --75.6016 --75.6078 --75.6219 --75.6109 --75.6172 --75.625 --75.6109 --75.6312 --75.6188 --75.625 --75.6266 --75.6266 --75.6219 --75.625 --75.625 --75.6234 --75.6266 --75.625 --75.625 --75.6266 --75.6297 --75.6234 --75.6328 --75.6266 --75.6172 --75.6375 --75.6266 --75.6266 --75.6188 --75.6359 --75.6188 --75.6297 --75.6203 --75.6312 --75.625 --75.6109 --75.6141 --75.6109 --75.6297 --75.6266 --75.6281 --75.6328 --75.6203 --75.6328 --75.6219 --75.6359 --75.6297 --75.6281 --75.6375 --75.6344 --75.6328 --75.6438 --75.6266 --75.6328 --75.6328 --75.6344 --75.6484 --75.6406 --75.6406 --75.6469 --75.6406 --75.6359 --75.6297 --75.6344 --75.6188 --75.6297 --75.6203 --75.6281 --75.6203 --75.6328 --75.6406 --75.6312 --75.625 --75.6188 --75.6375 --75.6156 --75.6312 --75.6188 --75.6297 --75.6172 --75.6422 --75.6344 --75.6562 --75.6281 --75.6453 --75.6297 --75.6344 --75.6297 --75.6359 --75.6266 --75.6328 --75.6359 --75.65 --75.6328 --75.6375 --75.6531 --75.6375 --75.6359 --75.6406 --75.6438 --75.6375 --75.6312 --75.6391 --75.6359 --75.6453 --75.6438 --75.6453 --75.6438 --75.6484 --75.65 --75.6562 --75.6359 --75.6375 --75.6297 --75.6422 --75.6344 --75.6516 --75.6391 --75.6391 --75.6453 --75.6422 --75.65 --75.6281 --75.6344 --75.6469 --75.6359 --75.6375 --75.6406 --75.6438 --75.6375 --75.6422 --75.6391 --75.6406 --75.6297 --75.6516 --75.6266 --75.6516 --75.6484 --75.6375 --75.6453 --75.6297 --75.6375 --75.6359 --75.6328 --75.6281 --75.6266 --75.6406 --75.6344 --75.6266 --75.6281 --75.6422 --75.6234 --75.6375 --75.6391 --75.6203 --75.6422 --75.6406 --75.6375 --75.6438 --75.6438 --75.6391 --75.6406 --75.6484 --75.6359 --75.6375 --75.6328 --75.6469 --75.6375 --75.6453 --75.6562 --75.6656 --75.6422 --75.6641 --75.6516 --75.6594 --75.6641 --75.6594 --75.6516 --75.6391 --75.6516 --75.6594 --75.6578 --75.6703 --75.6516 --75.6516 --75.6516 --75.6484 --75.6547 --75.6469 --75.6406 --75.6516 --75.6578 --75.6578 --75.65 --75.6516 --75.6562 --75.6375 --75.6391 --75.6391 --75.6516 --75.6469 --75.6516 --75.6422 --75.6578 --75.6516 --75.6547 --75.6391 --75.6578 --75.6453 --75.6594 --75.65 --75.6562 --75.6484 --75.65 --75.6547 --75.6609 --75.6516 --75.6484 --75.6469 --75.6453 --75.6359 --75.6391 --75.6641 --75.6625 --75.6531 --75.6578 --75.6531 --75.6516 --75.6438 --75.6453 --75.6438 --75.6406 --75.6484 --75.6484 --75.6438 --75.6547 --75.65 --75.6453 --75.6547 --75.6359 --75.6453 --75.6438 --75.65 --75.6516 --75.6578 --75.6562 --75.6469 --75.6547 --75.6453 --75.6641 --75.6438 --75.6625 --75.6469 --75.6594 --75.6438 --75.6484 --75.6469 --75.6531 --75.6438 --75.65 --75.6609 --75.65 --75.6453 --75.6484 --75.6516 --75.6422 --75.6438 --75.6406 --75.6453 --75.6453 --75.6453 --75.6453 --75.6281 --75.6578 --75.6391 --75.6531 --75.6516 --75.6484 --75.6469 --75.6469 --75.6469 --75.6375 --75.6516 --75.6406 --75.65 --75.6516 --75.6469 --75.6312 --75.65 --75.6297 --75.6547 --75.6516 --75.6422 --75.6375 --75.6406 --75.6391 --75.6375 --75.6469 --75.6406 --75.6391 --75.6453 --75.6391 --75.6359 --75.6359 --75.6406 --75.6453 --75.6359 --75.6531 --75.6359 --75.6438 --75.6406 --75.6484 --75.6375 --75.6438 --75.6531 --75.6484 --75.65 --75.6422 --75.6406 --75.6375 --75.6469 --75.65 --75.65 --75.6516 --75.6422 --75.6453 --75.6641 --75.6609 --75.6406 --75.6359 --75.6438 --75.6641 --75.65 --75.65 --75.6578 --75.6562 --75.6516 --75.6484 --75.6484 --75.6484 --75.6516 --75.6547 --75.6406 --75.6594 --75.6469 --75.6406 --75.6547 --75.6547 --75.6484 --75.6656 --75.6672 --75.6516 --75.6578 --75.6375 --75.6562 --75.6516 --75.6641 --75.65 --75.6703 --75.6547 --75.6594 --75.65 --75.6516 --75.6484 --75.65 --75.6516 --75.6422 --75.6625 --75.65 --75.6422 --75.6531 --75.6391 --75.6531 --75.6438 --75.6625 --75.6422 --75.6469 --75.6687 --75.6641 --75.6562 --75.6531 --75.6609 --75.6562 --75.6594 --75.6609 --75.6578 --75.6562 --75.6469 --75.6453 --75.6531 --75.6641 --75.6562 --75.6547 --75.6594 --75.6547 --75.6516 --75.6641 --75.6578 --75.6641 --75.6641 --75.6578 --75.6578 --75.6625 --75.6469 --75.6453 --75.6594 --75.6594 --75.6625 --75.6516 --75.6484 --75.6594 --75.6594 --75.6594 --75.65 --75.6625 --75.6703 --75.6531 --75.6594 --75.6422 --75.6609 --75.6609 --75.65 --75.6484 --75.6609 --75.6703 --75.6641 --75.6594 --75.6703 --75.6531 --75.6531 --75.6453 --75.6562 --75.6594 --75.65 --75.6625 --75.6578 --75.6422 --75.6516 --75.65 --75.6625 --75.6578 --75.6609 --75.6531 --75.6516 --75.6719 --75.6531 --75.6469 --75.6719 --75.6609 --75.6578 --75.6703 --75.6719 --75.6453 --75.6719 --75.6656 --75.6781 --75.6781 --75.6734 --75.6813 --75.6687 --75.6719 --75.6672 --75.6672 --75.6578 --75.6672 --75.6547 --75.6641 --75.6719 --75.6547 --75.6625 --75.6672 --75.6641 --75.6734 --75.6625 --75.6719 --75.6672 --75.6719 --75.6703 --75.6656 --75.6625 --75.6594 --75.675 --75.6734 --75.6547 --75.6484 --75.6625 --75.6594 --75.6687 --75.6828 --75.6766 --75.675 --75.6656 --75.6859 --75.675 --75.6687 --75.6813 --75.6641 --75.6656 --75.6797 --75.6656 --75.6641 --75.6844 --75.6703 --75.6719 --75.675 --75.6625 --75.6703 --75.6766 --75.6641 --75.6687 --75.6781 --75.6797 --75.6609 --75.675 --75.6672 --75.6766 --75.6844 --75.6687 --75.6766 --75.6656 --75.6781 --75.6734 --75.6609 --75.6641 --75.6734 --75.6797 --75.6703 --75.6766 --75.6703 --75.6719 --75.6844 --75.6781 --75.6813 --75.6672 --75.6766 --75.675 --75.6969 --75.6797 --75.6906 --75.6766 --75.6813 --75.6984 --75.6969 --75.6844 --75.6859 --75.6969 --75.6922 --75.6922 --75.6859 --75.6797 --75.6797 --75.6781 --75.6703 --75.6687 --75.6875 --75.6813 --75.7 --75.6813 --75.6828 --75.6859 --75.6656 --75.6828 --75.675 --75.6844 --75.6813 --75.6781 --75.6797 --75.6766 --75.6734 --75.6781 --75.6813 --75.6687 --75.6766 --75.6813 --75.6594 --75.6625 --75.6672 --75.6719 --75.6875 --75.6672 --75.6703 --75.675 --75.6844 --75.6766 --75.6719 --75.6797 --75.6719 --75.6687 --75.6781 --75.6766 --75.6766 --75.6813 --75.6766 --75.6781 --75.6672 --75.6828 --75.6766 --75.6781 --75.6828 --75.6687 --75.6844 --75.6813 --75.6828 --75.6891 --75.6859 --75.6687 --75.6969 --75.6797 --75.6766 --75.6969 --75.6797 --75.675 --75.6844 --75.6828 --75.6766 --75.6703 --75.6937 --75.675 --75.6828 --75.6828 --75.675 --75.6937 --75.6813 --75.6828 --75.6797 --75.6781 --75.6813 --75.6859 --75.6844 --75.6828 --75.6641 --75.675 --75.6609 --75.6813 --75.6734 --75.675 --75.6781 --75.6766 --75.6625 --75.6656 --75.6828 --75.6656 --75.6672 --75.6906 --75.6766 --75.6813 --75.6781 --75.6781 --75.6734 --75.6641 --75.6641 --75.6828 --75.6875 --75.6703 --75.6641 --75.6797 --75.6719 --75.6703 --75.6672 --75.6719 --75.6672 --75.6766 --75.6734 --75.6766 --75.6766 --75.6609 --75.6813 --75.6594 --75.6703 --75.6828 --75.6734 --75.6922 --75.6891 --75.6766 --75.6797 --75.6891 --75.6797 --75.6625 --75.675 --75.6703 --75.6766 --75.6766 --75.6578 --75.6672 --75.6797 --75.6656 --75.6781 --75.6828 --75.6594 --75.6797 --75.6797 --75.6625 --75.6781 --75.6672 --75.6781 --75.6703 --75.6687 --75.6781 --75.6813 --75.6875 --75.6703 --75.6609 --75.6734 --75.6875 --75.675 --75.6906 --75.6969 --75.6969 --75.6797 --75.675 --75.6953 --75.6844 --75.6734 --75.6828 --75.6719 --75.6687 --75.6859 --75.6781 --75.6813 --75.6922 --75.6844 --75.6797 --75.6781 --75.6891 --75.6828 --75.6828 --75.6797 --75.6703 --75.6859 --75.6719 --75.675 --75.6781 --75.6844 --75.6797 --75.6703 --75.6703 --75.6797 --75.6859 --75.6828 --75.6906 --75.6984 --75.6781 --75.6891 --75.6969 --75.6859 --75.6937 --75.6844 --75.6719 --75.6719 --75.6875 --75.6937 --75.6672 --75.6703 --75.6781 --75.6703 --75.6766 --75.6844 --75.6797 --75.6844 --75.6813 --75.6844 --75.6828 --75.6734 --75.6766 --75.6906 --75.6703 --75.6703 --75.6813 --75.6891 --75.6703 --75.6844 --75.6828 --75.6844 --75.6844 --75.6813 --75.6719 --75.6859 --75.6797 --75.6813 --75.6859 --75.6859 --75.6875 --75.6641 --75.6906 --75.6828 --75.6844 --75.6687 --75.6797 --75.6813 --75.6813 --75.6844 --75.6734 --75.675 --75.6719 --75.6859 --75.6859 --75.6984 --75.6828 --75.6672 --75.6906 --75.6766 --75.6875 --75.6969 --75.6984 --75.6969 --75.7031 --75.6906 --75.6969 --75.6906 --75.6844 --75.7 --75.6875 --75.7078 --75.7125 --75.6969 --75.7016 --75.7016 --75.675 --75.6906 --75.6891 --75.6781 --75.6937 --75.6797 --75.6937 --75.6781 --75.675 --75.675 --75.7016 --75.6922 --75.6859 --75.6969 --75.6766 --75.6906 --75.6891 --75.6906 --75.6891 --75.6891 --75.6875 --75.6937 --75.7031 --75.7016 --75.6906 --75.7031 --75.6813 --75.6906 --75.6906 --75.6906 --75.6766 --75.6875 --75.6859 --75.6828 --75.6922 --75.6984 --75.6766 --75.6781 --75.6875 --75.7 --75.6922 --75.6922 --75.7031 --75.6875 --75.7063 --75.6891 --75.6875 --75.6828 --75.6906 --75.6844 --75.6859 --75.6906 --75.6875 --75.6797 --75.6781 --75.6797 --75.6734 --75.6844 --75.6828 --75.6922 --75.6813 --75.6891 --75.6891 --75.6844 --75.6859 --75.6781 --75.6813 --75.6828 --75.6906 --75.6797 --75.6891 --75.6937 --75.6953 --75.6719 --75.6891 --75.6797 --75.6813 --75.6844 --75.675 --75.6797 --75.6797 --75.6953 --75.6953 --75.6828 --75.6781 --75.7 --75.6937 --75.6891 --75.6969 --75.6922 --75.7 --75.6875 --75.6937 --75.6844 --75.6875 --75.6953 --75.6922 --75.6828 --75.6953 --75.6969 --75.6828 --75.7 --75.7 --75.7109 --75.7156 --75.6937 --75.6922 --75.6937 --75.6906 --75.6875 --75.6922 --75.6922 --75.6813 --75.6937 --75.6891 --75.6969 --75.6953 --75.6906 --75.7 --75.6906 --75.6984 --75.6828 --75.7031 --75.7 --75.6937 --75.6875 --75.7031 --75.6969 --75.7031 --75.6984 --75.6969 --75.7 --75.7078 --75.7094 --75.6984 --75.6922 --75.7031 --75.7078 --75.7109 --75.7047 --75.7031 --75.6984 --75.7125 --75.7016 --75.7031 --75.7031 --75.7 --75.7063 --75.7109 --75.7063 --75.7109 --75.7094 --75.7047 --75.7 --75.7188 --75.7078 --75.7141 --75.7063 --75.7047 --75.7094 --75.7047 --75.7016 --75.7172 --75.7063 --75.7047 --75.6953 --75.7078 --75.7172 --75.6953 --75.7 --75.7063 --75.7016 --75.7125 --75.6984 --75.6937 --75.7188 --75.7063 --75.7094 --75.7078 --75.7063 --75.7094 --75.7016 --75.7031 --75.7172 --75.7063 --75.6828 --75.7016 --75.7031 --75.6984 --75.7172 --75.6969 --75.7 --75.7047 --75.6906 --75.6906 --75.6969 --75.6937 --75.6906 --75.7016 --75.6891 --75.7047 --75.7016 --75.7063 --75.7047 --75.7063 --75.6984 --75.6969 --75.6984 --75.7 --75.7016 --75.7078 --75.6891 --75.7031 --75.6922 --75.7188 --75.7109 --75.7016 --75.6891 --75.6984 --75.7047 --75.7 --75.6984 --75.6953 --75.7156 --75.7063 --75.7078 --75.7063 --75.7031 --75.7078 --75.6984 --75.6969 --75.6984 --75.7016 --75.6937 --75.7031 --75.7047 --75.7 --75.7047 --75.7094 --75.6922 --75.7016 --75.7109 --75.6891 --75.7 --75.6953 --75.7 --75.6922 --75.7 --75.6922 --75.7016 --75.7047 --75.7063 --75.7063 --75.7031 --75.7031 --75.7016 --75.6969 --75.7047 --75.7109 --75.7109 --75.6984 --75.7047 --75.7016 --75.7094 --75.7063 --75.6922 --75.6969 --75.7063 --75.7172 --75.6984 --75.7047 --75.7141 --75.7063 --75.7031 --75.7016 --75.7156 --75.7219 --75.7219 --75.6969 --75.7156 --75.7016 --75.725 --75.7063 --75.7109 --75.7125 --75.7156 --75.7078 --75.7078 --75.7063 --75.7031 --75.7 --75.6984 --75.7078 --75.7141 --75.7047 --75.6953 --75.7016 --75.6969 --75.7016 --75.6984 --75.7031 --75.7031 --75.6953 --75.6969 --75.7031 --75.6969 --75.6984 --75.6953 --75.6953 --75.6875 --75.7063 --75.6953 --75.6906 --75.6875 --75.6891 --75.7031 --75.6875 --75.7016 --75.6984 --75.6937 --75.6844 --75.7 --75.7 --75.6891 --75.6984 --75.6969 --75.7063 --75.7078 --75.7016 --75.6922 --75.7109 --75.7063 --75.7094 --75.7078 --75.7141 --75.6984 --75.7188 --75.7125 --75.7203 --75.7094 --75.7125 --75.7094 --75.7031 --75.7172 --75.6906 --75.7031 --75.7063 --75.7 --75.7094 --75.7109 --75.6969 --75.7109 --75.7063 --75.7125 --75.7188 --75.7172 --75.7141 --75.7063 --75.7 --75.6969 --75.6953 --75.7078 --75.7125 --75.7 --75.7 --75.7109 --75.6984 --75.7188 --75.7141 --75.7047 --75.7016 --75.7078 --75.7016 --75.7047 --75.6922 --75.6984 --75.6875 --75.6969 --75.7094 --75.7094 --75.6969 --75.7078 --75.6937 --75.6937 --75.7109 --75.6969 --75.7172 --75.7141 --75.7188 --75.7172 --75.7203 --75.7109 --75.7063 --75.6875 --75.7063 --75.7125 --75.6984 --75.7031 --75.7156 --75.7047 --75.7016 --75.6984 --75.7078 --75.7141 --75.7125 --75.7094 --75.7125 --75.7094 --75.7109 --75.7109 --75.7031 --75.7109 --75.7063 --75.7109 --75.7063 --75.6984 --75.6969 --75.7 --75.7188 --75.7078 --75.7078 --75.6969 --75.7047 --75.7219 --75.7172 --75.7125 --75.7078 --75.7188 --75.7047 --75.7078 --75.7203 --75.7203 --75.6906 --75.7031 --75.6797 --75.7031 --75.6937 --75.7031 --75.7188 --75.7109 --75.6953 --75.7266 --75.6984 --75.6984 --75.7031 --75.7234 --75.7063 --75.7078 --75.6953 --75.7016 --75.7 --75.7109 --75.7047 --75.7266 --75.6969 --75.7125 --75.7031 --75.6984 --75.7 --75.7063 --75.7078 --75.7109 --75.7063 --75.7063 --75.7016 --75.6953 --75.7125 --75.6922 --75.6984 --75.6969 --75.6953 --75.6984 --75.6844 --75.7125 --75.7047 --75.7094 --75.7047 --75.7156 --75.7219 --75.6969 --75.7125 --75.7188 --75.6984 --75.7109 --75.7063 --75.7063 --75.6844 --75.7016 --75.6859 --75.6969 --75.7047 --75.6969 --75.7125 --75.7141 --75.7141 --75.7109 --75.7063 --75.7047 --75.7172 --75.7078 --75.7156 --75.7031 --75.7031 --75.7125 --75.7109 --75.7125 --75.7016 --75.7094 --75.725 --75.7125 --75.7094 --75.7125 --75.7172 --75.7109 --75.7109 --75.7234 --75.7156 --75.7172 --75.725 --75.7219 --75.7141 --75.725 --75.7203 --75.7031 --75.725 --75.7328 --75.7094 --75.7172 --75.7141 --75.7266 --75.725 --75.7156 --75.7266 --75.7188 --75.7125 --75.7063 --75.7094 --75.7141 --75.7219 --75.7203 --75.7094 --75.725 --75.7156 --75.7344 --75.7125 --75.7203 --75.7109 --75.7078 --75.6984 --75.6922 --75.7047 --75.7078 --75.7016 --75.7078 --75.7141 --75.7109 --75.6969 --75.7047 --75.7031 --75.6906 --75.7094 --75.6922 --75.6953 --75.7109 --75.7094 --75.7109 --75.7109 --75.7078 --75.7141 --75.7188 --75.7047 --75.7297 --75.7172 --75.7156 --75.7172 --75.7 --75.7125 --75.7078 --75.7172 --75.7203 --75.7156 --75.7266 --75.7188 --75.7203 --75.7234 --75.725 --75.7234 --75.7141 --75.7063 --75.7172 --75.7172 --75.7203 --75.7141 --75.7125 --75.7328 --75.7188 --75.7297 --75.7328 --75.7094 --75.7031 --75.7063 --75.7063 --75.7141 --75.7172 --75.6953 --75.7125 --75.7094 --75.7109 --75.7344 --75.7047 --75.7141 --75.7078 --75.7078 --75.7266 --75.7172 --75.7188 --75.7031 --75.7156 --75.7188 --75.7234 --75.7219 --75.7328 --75.7188 --75.7156 --75.7219 --75.7063 --75.7141 --75.7047 --75.7172 --75.7172 --75.7172 --75.7141 --75.7047 --75.7156 --75.7109 --75.7203 --75.6891 --75.7203 --75.7172 --75.7063 --75.7078 --75.7125 --75.7234 --75.7203 --75.7078 --75.6984 --75.7266 --75.7219 --75.7109 --75.7047 --75.7125 --75.7125 --75.7109 --75.7203 --75.7016 --75.7156 --75.7172 --75.7125 --75.7266 --75.7234 --75.7297 --75.7156 --75.7141 --75.7078 --75.7172 --75.7047 --75.7094 --75.7094 --75.7094 --75.7125 --75.7063 --75.7094 --75.7078 --75.7047 --75.6984 --75.7094 --75.725 --75.7234 --75.7094 --75.6984 --75.7141 --75.7063 --75.6984 --75.7031 --75.7078 --75.6969 --75.7141 --75.6984 --75.7125 --75.7156 --75.7094 --75.7031 --75.6969 --75.7094 --75.7156 --75.7219 --75.7063 --75.7078 --75.7266 --75.7125 --75.7125 --75.7188 --75.7203 --75.7109 --75.725 --75.7156 --75.7234 --75.7203 --75.7094 --75.7172 --75.7328 --75.7297 --75.7094 --75.7141 --75.7281 --75.7203 --75.7172 --75.7219 --75.725 --75.7094 --75.7156 --75.7094 --75.7188 --75.725 --75.7141 --75.7047 --75.7172 --75.7234 --75.7156 --75.7188 --75.7312 --75.7203 --75.7281 --75.7156 --75.7266 --75.7234 --75.725 --75.7219 --75.7312 --75.7188 --75.7078 --75.7281 --75.7156 --75.7172 --75.7125 --75.7281 --75.7281 --75.7234 --75.7219 --75.7094 --75.7109 --75.7125 --75.7281 --75.7172 --75.725 --75.7188 --75.7391 --75.7188 --75.7328 --75.7359 --75.7188 --75.7234 --75.7078 --75.725 --75.7234 --75.7188 --75.7234 --75.7281 --75.7359 --75.7281 --75.7234 --75.7391 --75.7438 --75.7312 --75.7219 --75.7297 --75.7312 --75.7359 --75.7219 --75.7375 --75.7219 --75.7266 --75.7266 --75.7297 --75.7281 --75.725 --75.7266 --75.7234 --75.7234 --75.7125 --75.7203 --75.7297 --75.7125 --75.7297 --75.7297 --75.7188 --75.7219 --75.7312 --75.7188 --75.7281 --75.7234 --75.7438 --75.7234 --75.7344 --75.7203 --75.7188 --75.7 --75.7234 --75.7344 --75.7297 --75.7406 --75.7344 --75.7344 --75.7344 --75.7375 --75.7094 --75.725 --75.7281 --75.7328 --75.7219 --75.7297 --75.7125 --75.7125 --75.7281 --75.7234 --75.7172 --75.7156 --75.7172 --75.7234 --75.6984 --75.725 --75.725 --75.7234 --75.7312 --75.7172 --75.7203 --75.7328 --75.7234 --75.7234 --75.7359 --75.7344 --75.7312 --75.7375 --75.7203 --75.725 --75.7156 --75.7203 --75.7109 --75.7203 --75.7188 --75.7297 --75.7234 --75.7281 --75.7281 --75.7188 --75.7312 --75.7281 --75.7297 --75.7312 --75.7359 --75.7203 --75.7328 --75.7375 --75.7266 --75.7281 --75.7328 --75.7219 --75.7234 --75.7266 --75.7391 --75.7359 --75.7312 --75.725 --75.725 --75.7438 --75.7359 --75.7359 --75.7328 --75.7188 --75.7312 --75.7219 --75.7281 --75.7266 --75.7359 --75.725 --75.7469 --75.7188 --75.725 --75.7328 --75.7297 --75.7312 --75.7266 --75.7266 --75.7203 --75.7328 --75.725 --75.7281 --75.7297 --75.7391 --75.7312 --75.7266 --75.7359 --75.7281 --75.725 --75.7391 --75.7391 --75.7297 --75.7219 --75.7172 --75.7172 --75.7141 --75.7172 --75.7156 --75.725 --75.7203 --75.7219 --75.7328 --75.725 --75.7219 --75.7109 --75.7328 --75.7219 --75.7312 --75.7203 --75.7312 --75.7453 --75.7297 --75.7172 --75.7266 --75.7328 --75.7281 --75.7375 --75.7203 --75.7375 --75.7078 --75.7219 --75.7281 --75.7172 --75.7266 --75.7172 --75.7188 --75.7203 --75.725 --75.7188 --75.7234 --75.7297 --75.7312 --75.7344 --75.7234 --75.7266 --75.7172 --75.725 --75.725 --75.7172 --75.7281 --75.7312 --75.7297 --75.7109 --75.7156 --75.7266 --75.7188 --75.7141 --75.7156 --75.7109 --75.7094 --75.7219 --75.7188 --75.7109 --75.7312 --75.7422 --75.7422 --75.7297 --75.7375 --75.7312 --75.7297 --75.7234 --75.7266 --75.7266 --75.7234 --75.7484 --75.7297 --75.7234 --75.7344 --75.7328 --75.7359 --75.7438 --75.7297 --75.7297 --75.7219 --75.7281 --75.7219 --75.7375 --75.7281 --75.7266 --75.7188 --75.7312 --75.7375 --75.7172 --75.7141 --75.7172 --75.7266 --75.7312 --75.7281 --75.7141 --75.7312 --75.7141 --75.7312 --75.7391 --75.7281 --75.7266 --75.7188 --75.7297 --75.7422 --75.7188 --75.7422 --75.7172 --75.7281 --75.7375 --75.7234 --75.7359 --75.7281 --75.7453 --75.7516 --75.7391 --75.7297 --75.7281 --75.7406 --75.75 --75.7406 --75.7312 --75.7469 --75.7359 --75.7297 --75.7438 --75.7312 --75.7469 --75.7438 --75.7469 --75.7391 --75.7406 --75.7266 --75.7344 --75.7328 --75.7406 --75.7344 --75.7266 --75.7344 --75.7391 --75.7359 --75.7438 --75.7406 --75.7203 --75.7234 --75.7344 --75.725 --75.7422 --75.7219 --75.7312 --75.7297 --75.7344 --75.7266 --75.7266 --75.7188 --75.7188 --75.7234 --75.7297 --75.7281 --75.7219 --75.7484 --75.7375 --75.7375 --75.7438 --75.7406 --75.7344 --75.7328 --75.7375 --75.7391 --75.7359 --75.7266 --75.7312 --75.7297 --75.7422 --75.7156 --75.7203 --75.7328 --75.7391 --75.7281 --75.7406 --75.7234 --75.7406 --75.7312 --75.7266 --75.725 --75.7312 --75.7188 --75.7484 --75.7359 --75.7328 --75.7453 --75.7359 --75.7234 --75.7234 --75.7328 --75.7391 --75.7297 --75.7359 --75.7422 --75.7297 --75.7375 --75.7375 --75.7469 --75.7266 --75.7359 --75.7391 --75.7453 --75.7422 --75.7297 --75.7469 --75.7391 --75.7328 --75.7312 --75.7281 --75.7188 --75.7328 --75.7312 --75.7406 --75.7328 --75.725 --75.7281 --75.7219 --75.7297 --75.7156 --75.7281 --75.7281 --75.7297 --75.7375 --75.7188 --75.7344 --75.7109 --75.7219 --75.7344 --75.7312 --75.7234 --75.7234 --75.7266 --75.7188 --75.7438 --75.7406 --75.7391 --75.7453 --75.7438 --75.7312 --75.7375 --75.7219 --75.7203 --75.7375 --75.7281 --75.7219 --75.7297 --75.7266 --75.7375 --75.7281 --75.7203 --75.7297 --75.7453 --75.7359 --75.7375 --75.7469 --75.7422 --75.7328 --75.7281 --75.7297 --75.7359 --75.7328 --75.7438 --75.7312 --75.7281 --75.7438 --75.7594 --75.7344 --75.7484 --75.7328 --75.7359 --75.7406 --75.7547 --75.7516 --75.7391 --75.7484 --75.7578 --75.7453 --75.7375 --75.7469 --75.7516 --75.7312 --75.7422 --75.7438 --75.7422 --75.7406 --75.7469 --75.7438 --75.7359 --75.7312 --75.7266 --75.7422 --75.7469 --75.7578 --75.75 --75.7359 --75.7219 --75.7406 --75.7328 --75.7375 --75.7453 --75.7375 --75.7469 --75.7266 --75.7297 --75.7328 --75.7484 --75.7281 --75.7391 --75.7234 --75.7422 --75.7281 --75.7344 --75.7484 --75.7391 --75.7453 --75.7375 --75.7469 --75.7469 --75.7359 --75.7406 --75.7547 --75.7391 --75.7422 --75.7344 --75.7453 --75.7328 --75.7453 --75.7438 --75.7594 --75.7531 --75.7422 --75.7578 --75.7344 --75.7422 --75.725 --75.7438 --75.7406 --75.7422 --75.7469 --75.7578 --75.7328 --75.7438 --75.7422 --75.7234 --75.7531 --75.7453 --75.7406 --75.7359 --75.7391 --75.7438 --75.7344 --75.75 --75.7484 --75.7359 --75.75 --75.7484 --75.7516 --75.7359 --75.7328 --75.7312 --75.7391 --75.7391 --75.7359 --75.7375 --75.7453 --75.7422 --75.7375 --75.7391 --75.7422 --75.7344 --75.7391 --75.7359 --75.7422 --75.7344 --75.7234 --75.7406 --75.7281 --75.7359 --75.7469 --75.7359 --75.7375 --75.7484 --75.7375 --75.7281 --75.7344 --75.7328 --75.7328 --75.7359 --75.7312 --75.7297 --75.7438 --75.7359 --75.7391 --75.7344 --75.7344 --75.7422 --75.7422 --75.7438 --75.7391 --75.7266 --75.7594 --75.7391 --75.7391 --75.7547 --75.7531 --75.7406 --75.7484 --75.7484 --75.7547 --75.7422 --75.7328 --75.7344 --75.7422 --75.7391 --75.725 --75.7391 --75.7469 --75.7438 --75.7453 --75.7359 --75.7422 --75.7375 --75.7375 --75.7484 --75.7453 --75.7297 --75.7531 --75.725 --75.7438 --75.7344 --75.7312 --75.7438 --75.7391 --75.7438 --75.7375 --75.7422 --75.75 --75.7391 --75.7328 --75.7453 --75.7438 --75.7375 --75.7312 --75.7297 --75.7234 --75.7422 --75.7391 --75.7469 --75.7391 --75.7312 --75.7281 --75.7469 --75.7453 --75.7359 --75.7406 --75.7422 --75.7469 --75.7406 --75.7469 --75.7516 --75.7453 --75.7484 --75.7391 --75.7203 --75.7438 --75.7469 --75.7328 --75.7438 --75.7359 --75.7328 --75.7375 --75.7344 --75.7359 --75.7328 --75.7453 --75.7547 --75.7516 --75.7375 --75.7344 --75.7359 --75.7562 --75.7328 --75.7406 --75.7531 --75.7312 --75.7438 --75.7422 --75.7156 --75.7375 --75.7359 --75.7328 --75.725 --75.7469 --75.7469 --75.7234 --75.7391 --75.7391 --75.7375 --75.7391 --75.7328 --75.7344 --75.7375 --75.7375 --75.7328 --75.7406 --75.7375 --75.7359 --75.7375 --75.7516 --75.7438 --75.7516 --75.7484 --75.7422 --75.7438 --75.7438 --75.7406 --75.7359 --75.7422 --75.7391 --75.7328 --75.7344 --75.7328 --75.7312 --75.725 --75.7359 --75.7344 --75.7469 --75.7312 --75.7375 --75.7344 --75.7391 --75.7312 --75.7469 --75.7344 --75.7469 --75.7422 --75.7328 --75.7422 --75.7469 --75.7297 --75.7547 --75.7328 --75.75 --75.7297 --75.7531 --75.7438 --75.7406 --75.7344 --75.7359 --75.7562 --75.7312 --75.7422 --75.7516 --75.7406 --75.7312 --75.7406 --75.725 --75.7312 --75.7312 --75.7312 --75.7328 --75.7375 --75.7297 --75.7219 --75.7312 --75.7266 --75.725 --75.7312 --75.75 --75.7375 --75.7375 --75.7375 --75.7406 --75.7469 --75.7359 --75.7391 --75.7391 --75.7422 --75.7359 --75.7359 --75.7391 --75.7469 --75.7391 --75.7469 --75.7344 --75.7453 --75.7547 --75.7453 --75.7391 --75.7344 --75.7391 --75.7312 --75.7281 --75.7453 --75.7453 --75.7438 --75.725 --75.7438 --75.7484 --75.7516 --75.7391 --75.7438 --75.7406 --75.7391 --75.7484 --75.7484 --75.7422 --75.7484 --75.7391 --75.7453 --75.7344 --75.7422 --75.7422 --75.7328 --75.7469 --75.7328 --75.75 --75.7312 --75.7469 --75.7422 --75.7469 --75.7391 --75.7531 --75.7391 --75.7281 --75.7359 --75.7422 --75.7453 --75.7375 --75.7328 --75.7375 --75.7469 --75.7359 --75.7359 --75.75 --75.7312 --75.7469 --75.7469 --75.7484 --75.7562 --75.7328 --75.7297 --75.7453 --75.7547 --75.7469 --75.7391 --75.7422 --75.7344 --75.7297 --75.7438 --75.7391 --75.7172 --75.7375 --75.7391 --75.7312 --75.7281 --75.7312 --75.7328 --75.725 --75.7422 --75.75 --75.7328 --75.7547 --75.7438 --75.7484 --75.7453 --75.7453 --75.7297 --75.7422 --75.7391 --75.7328 --75.7203 --75.7391 --75.7328 --75.7453 --75.7344 --75.7406 --75.7453 --75.7469 --75.7359 --75.7484 --75.7469 --75.7484 --75.7328 --75.7438 --75.7406 --75.75 --75.7266 --75.7375 --75.7359 --75.7422 --75.7391 --75.7406 --75.7375 --75.7391 --75.7297 --75.7328 --75.7234 --75.7406 --75.7438 --75.7531 --75.7469 --75.7531 --75.7312 --75.725 --75.7516 --75.7312 --75.7328 --75.7406 --75.7375 --75.7594 --75.7359 --75.7484 --75.7453 --75.7438 --75.75 --75.7531 --75.75 --75.7391 --75.7328 --75.75 --75.7422 --75.7375 --75.7422 --75.7422 --75.7391 --75.7484 --75.7469 --75.7422 --75.7469 --75.7422 --75.7453 --75.7344 --75.7484 --75.7438 --75.7391 --75.75 --75.7562 --75.7531 --75.7641 --75.7547 --75.7531 --75.7438 --75.7406 --75.7531 --75.7391 --75.7406 --75.7422 --75.7422 --75.7531 --75.7391 --75.7531 --75.7422 --75.7359 --75.7469 --75.7531 --75.7469 --75.7594 --75.75 --75.7344 --75.7438 --75.7453 --75.7359 --75.7469 --75.7422 --75.7359 --75.7359 --75.7672 --75.75 --75.7453 --75.7516 --75.7516 --75.7641 --75.7516 --75.7406 --75.7438 --75.7594 --75.7438 --75.7562 --75.7609 --75.7531 --75.7531 --75.7672 --75.7547 --75.7641 --75.7531 --75.7562 --75.7531 --75.7531 --75.7516 --75.7375 --75.7625 --75.7562 --75.7625 --75.7625 --75.7469 --75.7562 --75.75 --75.7562 --75.7484 --75.7625 --75.7484 --75.75 --75.7469 --75.7688 --75.7625 --75.7578 --75.7453 --75.7531 --75.7484 --75.7422 --75.7469 --75.7562 --75.7547 --75.7453 --75.75 --75.7469 --75.7453 --75.7422 --75.7547 --75.7484 --75.7469 --75.7656 --75.7578 --75.7531 --75.7531 --75.7391 --75.7547 --75.7484 --75.7547 --75.7578 --75.75 --75.7578 --75.7531 --75.75 --75.7453 --75.7453 --75.7375 --75.7422 --75.75 --75.7484 --75.7547 --75.7438 --75.7641 --75.75 --75.7703 --75.7438 --75.7406 --75.7328 --75.75 --75.7406 --75.7562 --75.7484 --75.7578 --75.7547 --75.7469 --75.7484 --75.7484 --75.7531 --75.7391 --75.7609 --75.7484 --75.7531 --75.7641 --75.7625 --75.7422 --75.7438 --75.7453 --75.7547 --75.7484 --75.7438 --75.7516 --75.7516 --75.7297 --75.75 --75.7531 --75.7562 --75.7547 --75.7641 --75.7531 --75.7578 --75.7453 --75.7516 --75.7562 --75.7422 --75.7406 --75.7453 --75.7547 --75.7375 --75.75 --75.7406 --75.7469 --75.75 --75.7453 --75.7562 --75.75 --75.7453 --75.7344 --75.7469 --75.7562 --75.7469 --75.7438 --75.7453 --75.7625 --75.7531 --75.7484 --75.7484 --75.7469 --75.7469 --75.7484 --75.7531 --75.7359 --75.7422 --75.7469 --75.75 --75.7719 --75.7641 --75.7688 --75.7641 --75.7703 --75.7594 --75.7422 --75.7594 --75.7594 --75.7562 --75.7562 --75.7547 --75.7391 --75.7656 --75.7484 --75.7422 --75.7625 --75.7547 --75.7562 --75.7484 --75.7594 --75.7422 --75.7578 --75.7531 --75.7578 --75.7594 --75.7703 --75.7578 --75.7672 --75.7766 --75.7547 --75.7594 --75.7484 --75.7469 --75.7422 --75.7562 --75.7484 --75.7453 --75.7625 --75.7719 --75.7562 --75.7453 --75.7578 --75.7656 --75.7641 --75.7484 --75.7688 --75.7625 --75.7578 --75.7594 --75.75 --75.7438 --75.7656 --75.7594 --75.7469 --75.7547 --75.7516 --75.7734 --75.7672 --75.7531 --75.7422 --75.7578 --75.7484 --75.7328 --75.75 --75.7469 --75.7375 --75.7297 --75.7359 --75.7406 --75.7422 --75.7438 --75.7453 --75.7453 --75.7484 --75.7531 --75.75 --75.7562 --75.7641 --75.7484 --75.7562 --75.7469 --75.7672 --75.7562 --75.7469 --75.7453 --75.7484 --75.75 --75.7609 --75.7453 --75.7406 --75.7547 --75.7531 --75.7578 --75.7484 --75.7562 --75.7516 --75.7578 --75.7469 --75.7562 --75.7594 --75.7672 --75.7547 --75.7672 --75.7562 --75.7828 --75.7594 --75.7719 --75.7609 --75.7531 --75.7578 --75.7531 --75.7562 --75.7609 --75.7641 --75.7547 --75.7625 --75.7625 --75.7547 --75.7594 --75.7641 --75.7594 --75.7594 --75.7562 --75.7578 --75.75 --75.7547 --75.7609 --75.7547 --75.7625 --75.7594 --75.7609 --75.7516 --75.75 --75.7484 --75.7625 --75.7703 --75.7609 --75.75 --75.7516 --75.7531 --75.7562 --75.7609 --75.7609 --75.7562 --75.7469 --75.7609 --75.7656 --75.7672 --75.7734 --75.7641 --75.7625 --75.7672 --75.7578 --75.7656 --75.7594 --75.7531 --75.7688 --75.7594 --75.7609 --75.7594 --75.7672 --75.7656 --75.7609 --75.7594 --75.7625 --75.7688 --75.7562 --75.7641 --75.7609 --75.7547 --75.7562 --75.7766 --75.7578 --75.7547 --75.7672 --75.7703 --75.7656 --75.7469 --75.7516 --75.7594 --75.7688 --75.7641 --75.7594 --75.7625 --75.7609 --75.7672 --75.7688 --75.7719 --75.7688 --75.7719 --75.7797 --75.7781 --75.7719 --75.7594 --75.7719 --75.7766 --75.7688 --75.775 --75.7906 --75.7797 --75.7766 --75.7812 --75.7719 --75.7828 --75.7828 --75.7688 --75.7688 --75.7766 --75.7703 --75.7812 --75.7672 --75.7594 --75.7688 --75.7766 --75.7734 --75.7672 --75.7594 --75.7797 --75.7828 --75.7719 --75.7937 --75.7797 --75.7922 --75.7766 --75.7688 --75.7703 --75.7891 --75.7734 --75.7641 --75.7719 --75.7812 --75.7797 --75.7719 --75.7719 --75.775 --75.7719 --75.7766 --75.7734 --75.775 --75.7719 --75.7844 --75.775 --75.7547 --75.775 --75.7734 --75.7703 --75.7766 --75.7766 --75.7797 --75.7703 --75.7625 --75.775 --75.7734 --75.7734 --75.7688 --75.7766 --75.7578 --75.7797 --75.7844 --75.7609 --75.7875 --75.7719 --75.775 --75.7781 --75.7547 --75.7625 --75.7781 --75.775 --75.7719 --75.7734 --75.7844 --75.7781 --75.7547 --75.7672 --75.7734 --75.7766 --75.7719 --75.7594 --75.7703 --75.7656 --75.7656 --75.7734 --75.7562 --75.7625 --75.7672 --75.7484 --75.7703 --75.7594 --75.7641 --75.7719 --75.7641 --75.7672 --75.7703 --75.7875 --75.775 --75.7641 --75.7656 --75.7594 --75.775 --75.7641 --75.7781 --75.7594 --75.7578 --75.7672 --75.7594 --75.7703 --75.7531 --75.7531 --75.7641 --75.75 --75.7688 --75.7641 --75.7453 --75.7609 --75.7547 --75.7562 --75.7516 --75.7594 --75.7625 --75.7594 --75.7547 --75.7594 --75.7672 --75.7516 --75.7703 --75.7516 --75.7531 --75.7438 --75.7547 --75.7719 --75.7641 --75.75 --75.7594 --75.75 --75.7562 --75.7594 --75.7625 --75.7625 --75.75 --75.7672 --75.7656 --75.7594 --75.7578 --75.7578 --75.7641 --75.7641 --75.7609 --75.7578 --75.7641 --75.7875 --75.7641 --75.7672 --75.7609 --75.7734 --75.7688 --75.7625 --75.7672 --75.7594 --75.7641 --75.7562 --75.7656 --75.7734 --75.7641 --75.7703 --75.7672 --75.7641 --75.7703 --75.7562 --75.7562 --75.7547 --75.775 --75.7469 --75.7641 --75.7672 --75.7734 --75.7672 --75.7531 --75.7594 --75.7672 --75.7703 --75.75 --75.7641 --75.7641 --75.7641 --75.7828 --75.7562 --75.7672 --75.7672 --75.7625 --75.7859 --75.7766 --75.7688 --75.7812 --75.775 --75.7656 --75.7812 --75.7781 --75.7625 --75.7781 --75.7891 --75.7797 --75.7641 --75.7844 --75.7672 --75.7891 --75.7797 --75.7734 --75.775 --75.7594 --75.7562 --75.7781 --75.7734 --75.7688 --75.7766 --75.775 --75.7625 --75.7656 --75.7719 --75.7641 --75.7703 --75.7719 --75.7609 --75.775 --75.7797 --75.775 --75.7781 --75.7797 --75.7734 --75.7703 --75.7719 --75.7734 --75.7656 --75.7547 --75.7859 --75.775 --75.7641 --75.7609 --75.775 --75.7578 --75.7719 --75.7719 --75.7594 --75.7719 --75.7609 --75.7734 --75.7781 --75.7609 --75.7625 --75.7641 --75.7641 --75.7656 --75.7703 --75.7688 --75.7734 --75.7703 --75.7609 --75.775 --75.7688 --75.7703 --75.7875 --75.7781 --75.7719 --75.7734 --75.7766 --75.7734 --75.7641 --75.7703 --75.7703 --75.7656 --75.7797 --75.7734 --75.7688 --75.7688 --75.7609 --75.7641 --75.7719 --75.7688 --75.7594 --75.7734 --75.7703 --75.7766 --75.7688 --75.775 --75.7703 --75.7688 --75.7781 --75.7562 --75.7562 --75.7641 --75.7594 --75.7781 --75.7797 --75.7656 --75.7672 --75.7672 --75.7719 --75.7547 --75.7562 --75.7703 --75.7734 --75.7688 --75.7797 --75.7703 --75.7719 --75.7672 --75.7516 --75.7734 --75.7641 --75.7703 --75.7672 --75.7766 --75.7766 --75.7812 --75.7828 --75.775 --75.775 --75.7812 --75.7844 --75.7688 --75.775 --75.7812 --75.7734 --75.7766 --75.7734 --75.7688 --75.7688 --75.7719 --75.7734 --75.7578 --75.7672 --75.7781 --75.775 --75.7672 --75.7672 --75.7672 --75.7703 --75.7734 --75.7766 --75.7672 --75.7844 --75.7734 --75.7734 --75.7812 --75.7672 --75.7844 --75.7781 --75.7609 --75.7812 --75.7734 --75.7781 --75.7688 --75.7703 --75.7672 --75.7656 --75.7781 --75.7812 --75.7688 --75.7688 --75.7672 --75.7766 --75.7656 --75.7734 --75.7641 --75.7594 --75.7625 --75.7531 --75.7906 --75.7625 --75.7703 --75.775 --75.7578 --75.775 --75.7656 --75.7562 --75.7719 --75.7766 --75.7641 --75.7719 --75.7766 --75.7797 --75.7625 --75.7719 --75.7719 --75.7688 --75.7781 --75.775 --75.7656 --75.7781 --75.7797 --75.7797 --75.7859 --75.7891 --75.7844 --75.7734 --75.7828 --75.7719 --75.7797 --75.7672 --75.7703 --75.7828 --75.7703 --75.7594 --75.7688 --75.7766 --75.7891 --75.775 --75.7703 --75.775 --75.7688 --75.775 --75.7906 --75.7812 --75.775 --75.7688 --75.7719 --75.7672 --75.7688 --75.7766 --75.7797 --75.775 --75.7703 --75.7672 --75.7797 --75.7766 --75.7734 --75.7859 --75.775 --75.7766 --75.7766 --75.7859 --75.7812 --75.7844 --75.7859 --75.7859 --75.775 --75.7922 --75.7797 --75.7719 --75.7953 --75.7797 --75.7734 --75.7734 --75.7781 --75.7766 --75.7734 --75.7734 --75.7641 --75.7734 --75.7734 --75.7656 --75.7766 --75.7719 --75.7703 --75.7625 --75.7594 --75.7688 --75.7828 --75.7703 --75.7875 --75.7812 --75.7719 --75.7812 --75.775 --75.775 --75.7656 --75.7766 --75.7766 --75.7609 --75.7812 --75.7922 --75.7891 --75.7891 --75.7906 --75.7859 --75.7859 --75.775 --75.7953 --75.7875 --75.7672 --75.7828 --75.7688 --75.7875 --75.7828 --75.8016 --75.8047 --75.7703 --75.7984 --75.7969 --75.775 --75.7875 --75.7922 --75.7812 --75.7734 --75.7891 --75.7891 --75.7828 --75.7844 --75.7984 --75.7875 --75.7906 --75.7937 --75.7875 --75.7969 --75.7937 --75.7953 --75.7922 --75.7781 --75.8016 --75.7859 --75.7984 --75.7906 --75.7781 --75.7922 --75.7953 --75.7969 --75.7922 --75.7844 --75.7859 --75.7875 --75.7937 --75.7937 --75.7891 --75.7891 --75.7953 --75.7969 --75.7922 --75.7859 --75.7797 --75.7891 --75.7953 --75.7828 --75.7734 --75.7844 --75.775 --75.8 --75.7844 --75.7906 --75.7922 --75.7734 --75.7906 --75.7828 --75.7891 --75.7937 --75.7922 --75.7969 --75.7906 --75.7953 --75.7812 --75.7906 --75.7875 --75.7937 --75.7844 --75.7984 --75.775 --75.775 --75.775 --75.775 --75.7734 --75.8 --75.7781 --75.7828 --75.7797 --75.7844 --75.7875 --75.7875 --75.7922 --75.7812 --75.7844 --75.775 --75.7781 --75.7844 --75.7875 --75.7906 --75.7906 --75.7844 --75.7781 --75.7844 --75.7688 --75.7875 --75.7797 --75.7797 --75.775 --75.7688 --75.775 --75.7922 --75.7703 --75.7734 --75.7703 --75.7812 --75.7781 --75.7906 --75.7812 --75.7891 --75.7859 --75.7719 --75.7766 --75.7703 --75.7859 --75.7844 --75.7781 --75.7906 --75.7766 --75.7891 --75.7734 --75.7922 --75.7797 --75.7906 --75.7859 --75.7703 --75.7906 --75.7812 --75.7766 --75.7797 --75.7844 --75.7734 --75.7734 --75.7766 --75.7828 --75.7766 --75.7766 --75.7891 --75.7859 --75.775 --75.7672 --75.7812 --75.775 --75.7828 --75.7844 --75.7672 --75.7766 --75.775 --75.7641 --75.7781 --75.7609 --75.7875 --75.7703 --75.7734 --75.7766 --75.7719 --75.7734 --75.7672 --75.7828 --75.7828 --75.7719 --75.7891 --75.7891 --75.7781 --75.7766 --75.7625 --75.7781 --75.7703 --75.7812 --75.7719 --75.7656 --75.7688 --75.775 --75.7812 --75.7781 --75.7953 --75.7781 --75.7672 --75.7844 --75.7844 --75.7766 --75.7906 --75.7844 --75.7766 --75.7922 --75.7922 --75.7844 --75.7781 --75.7812 --75.7812 --75.7781 --75.7859 --75.7875 --75.7828 --75.7906 --75.7906 --75.7953 --75.7922 --75.7891 --75.7828 --75.7828 --75.7891 --75.7797 --75.7922 --75.7844 --75.7953 --75.7969 --75.7953 --75.7875 --75.8031 --75.7984 --75.7984 --75.7875 --75.8 --75.7812 --75.7859 --75.7906 --75.7891 --75.7766 --75.7984 --75.7937 --75.7953 --75.7906 --75.7906 --75.7891 --75.7797 --75.7906 --75.7875 --75.7891 --75.7875 --75.7766 --75.7781 --75.7891 --75.7906 --75.7828 --75.7828 --75.7953 --75.7922 --75.7875 --75.7875 --75.7891 --75.7859 --75.7859 --75.7906 --75.7969 --75.7969 --75.7906 --75.7922 --75.7953 --75.7922 --75.7797 --75.7844 --75.7969 --75.8 --75.7906 --75.7891 --75.7891 --75.775 --75.7812 --75.7859 --75.7859 --75.8 --75.7719 --75.7953 --75.7844 --75.7797 --75.7797 --75.7891 --75.775 --75.7953 --75.7781 --75.7937 --75.7875 --75.7937 --75.7969 --75.7844 --75.7922 --75.8 --75.7984 --75.7906 --75.7937 --75.8047 --75.7828 --75.7766 --75.7781 --75.7906 --75.7812 --75.7937 --75.7906 --75.7906 --75.7906 --75.7719 --75.7781 --75.7875 --75.7922 --75.7859 --75.7812 --75.7906 --75.7797 --75.7875 --75.7828 --75.7719 --75.7922 --75.7922 --75.7906 --75.7859 --75.7875 --75.7937 --75.7828 --75.7906 --75.7859 --75.8031 --75.7937 --75.8016 --75.7953 --75.7922 --75.7797 --75.7828 --75.7953 --75.7906 --75.7953 --75.8 --75.7828 --75.7953 --75.7922 --75.7937 --75.7906 --75.7906 --75.8016 --75.7937 --75.7844 --75.7844 --75.7984 --75.7906 --75.7875 --75.7906 --75.7953 --75.7875 --75.7781 --75.7766 --75.7922 --75.7828 --75.7953 --75.7937 --75.7875 --75.7797 --75.7828 --75.7828 --75.7906 --75.7875 --75.7891 --75.7812 --75.7906 --75.7891 --75.7734 --75.7875 --75.7875 --75.8 --75.7953 --75.7969 --75.8141 --75.8016 --75.7953 --75.8141 --75.7812 --75.7937 --75.7859 --75.7922 --75.7875 --75.7891 --75.8078 --75.7922 --75.7953 --75.8063 --75.8047 --75.7969 --75.7937 --75.7922 --75.7937 --75.7875 --75.8047 --75.7844 --75.8 --75.8016 --75.7937 --75.7891 --75.8031 --75.8031 --75.7859 --75.7891 --75.7781 --75.8016 --75.7859 --75.7812 --75.7922 --75.7937 --75.7875 --75.8031 --75.8 --75.8016 --75.8031 --75.7953 --75.7922 --75.7984 --75.7844 --75.7859 --75.7844 --75.8 --75.8031 --75.8047 --75.8094 --75.7969 --75.7953 --75.7922 --75.8094 --75.7937 --75.8172 --75.8016 --75.7953 --75.7906 --75.7828 --75.8 --75.7859 --75.7953 --75.7984 --75.7922 --75.7828 --75.7875 --75.7875 --75.7922 --75.8125 --75.8031 --75.7984 --75.8094 --75.8063 --75.7922 --75.7969 --75.7906 --75.8016 --75.7937 --75.8016 --75.8031 --75.8031 --75.7891 --75.8078 --75.7953 --75.7922 --75.7953 --75.8047 --75.7969 --75.7953 --75.7875 --75.7906 --75.7891 --75.7984 --75.7937 --75.7844 --75.8031 --75.7891 --75.8063 --75.7875 --75.7828 --75.7828 --75.7953 --75.7812 --75.7937 --75.8063 --75.7844 --75.7937 --75.7953 --75.7812 --75.7906 --75.7844 --75.7969 --75.7906 --75.7937 --75.7937 --75.7953 --75.7937 --75.7859 --75.7844 --75.7984 --75.7953 --75.8063 --75.7953 --75.8031 --75.8016 --75.8016 --75.7953 --75.7937 --75.7891 --75.7906 --75.7953 --75.7922 --75.7891 --75.7859 --75.8 --75.7828 --75.7906 --75.8094 --75.7937 --75.7953 --75.7953 --75.8047 --75.7891 --75.7953 --75.7844 --75.7906 --75.7969 --75.7953 --75.7875 --75.7844 --75.7797 --75.7781 --75.8031 --75.7875 --75.7859 --75.7922 --75.7797 --75.7875 --75.7875 --75.7844 --75.7937 --75.7969 --75.7828 --75.7906 --75.7875 --75.7953 --75.7922 --75.7922 --75.8063 --75.8047 --75.7891 --75.7953 --75.7922 --75.7906 --75.7937 --75.7937 --75.7937 --75.7937 --75.8078 --75.7922 --75.7891 --75.7922 --75.7859 --75.7891 --75.7891 --75.7969 --75.8016 --75.7937 --75.8078 --75.7984 --75.7922 --75.7969 --75.7875 --75.7859 --75.7984 --75.8063 --75.7969 --75.7984 --75.8 --75.7922 --75.7906 --75.7859 --75.7906 --75.7969 --75.7812 --75.7984 --75.8 --75.7812 --75.7969 --75.7937 --75.7828 --75.7844 --75.7875 --75.7922 --75.7875 --75.7984 --75.7953 --75.7984 --75.7969 --75.7969 --75.7922 --75.8078 --75.7828 --75.7937 --75.7984 --75.7891 --75.7937 --75.8125 --75.8047 --75.7906 --75.8125 --75.8 --75.8031 --75.8078 --75.7969 --75.8125 --75.8063 --75.8094 --75.8109 --75.8078 --75.8016 --75.7937 --75.8094 --75.8063 --75.8031 --75.8187 --75.8109 --75.8031 --75.8172 --75.8 --75.8109 --75.7984 --75.8094 --75.7953 --75.7875 --75.7969 --75.8016 --75.7984 --75.8031 --75.7953 --75.8016 --75.7984 --75.7891 --75.7828 --75.7922 --75.7969 --75.7891 --75.8 --75.7859 --75.8031 --75.7984 --75.7984 --75.7844 --75.8031 --75.7937 --75.8094 --75.7859 --75.8016 --75.7875 --75.8 --75.7906 --75.8 --75.7828 --75.7969 --75.7984 --75.7891 --75.7984 --75.7969 --75.7906 --75.7984 --75.8031 --75.8063 --75.8203 --75.8063 --75.7953 --75.7969 --75.8031 --75.8031 --75.8016 --75.8078 --75.8016 --75.8 --75.8047 --75.7969 --75.7922 --75.7906 --75.7969 --75.7859 --75.8078 --75.8047 --75.8047 --75.7906 --75.8063 --75.8063 --75.8125 --75.8047 --75.8141 --75.8031 --75.8109 --75.8094 --75.7953 --75.8078 --75.7953 --75.7969 --75.8047 --75.8 --75.7859 --75.8 --75.8203 --75.8063 --75.8156 --75.8094 --75.8094 --75.8203 --75.8156 --75.8094 --75.8187 --75.8266 --75.8266 --75.8109 --75.8063 --75.8109 --75.8172 --75.8141 --75.8187 --75.8031 --75.8219 --75.8047 --75.8172 --75.7891 --75.8125 --75.8063 --75.8078 --75.7875 --75.7984 --75.8094 --75.8266 --75.8047 --75.8078 --75.8047 --75.7906 --75.8109 --75.8109 --75.8047 --75.8156 --75.8109 --75.8266 --75.8234 --75.8328 --75.8297 --75.825 --75.8078 --75.8187 --75.8219 --75.8172 --75.8156 --75.8141 --75.8156 --75.8156 --75.8203 --75.8172 --75.8187 --75.8219 --75.8203 --75.8125 --75.8094 --75.8094 --75.8172 --75.8094 --75.8172 --75.8125 --75.8094 --75.8094 --75.8047 --75.8109 --75.8094 --75.7953 --75.8063 --75.7969 --75.8016 --75.8094 --75.8172 --75.8063 --75.8094 --75.7984 --75.8031 --75.8109 --75.8031 --75.8125 --75.8094 --75.8172 --75.8141 --75.8094 --75.8094 --75.8172 --75.8109 --75.8172 --75.8 --75.8 --75.8063 --75.8109 --75.8141 --75.8187 --75.8234 --75.8141 --75.8187 --75.825 --75.8156 --75.8203 --75.8203 --75.8094 --75.8219 --75.8078 --75.8187 --75.8172 --75.8047 --75.7984 --75.8047 --75.8063 --75.8156 --75.8063 --75.8141 --75.8109 --75.8203 --75.8219 --75.8187 --75.8141 --75.7969 --75.8125 --75.8063 --75.8125 --75.8172 --75.8187 --75.8297 --75.8297 --75.8172 --75.8281 --75.8125 --75.8313 --75.8141 --75.825 --75.8187 --75.8219 --75.825 --75.8187 --75.8203 --75.8313 --75.8172 --75.8156 --75.8219 --75.8078 --75.8328 --75.8234 --75.8344 --75.8203 --75.8281 --75.8234 --75.8234 --75.8172 --75.825 --75.8219 --75.8109 --75.8094 --75.8047 --75.8234 --75.8172 --75.8203 --75.8094 --75.8047 --75.8125 --75.8125 --75.8141 --75.8078 --75.8156 --75.8078 --75.8172 --75.8047 --75.8109 --75.8125 --75.8031 --75.8125 --75.8031 --75.8094 --75.8063 --75.8 --75.8094 --75.8078 --75.8109 --75.8047 --75.8063 --75.8172 --75.8078 --75.7969 --75.8203 --75.8141 --75.8109 --75.8203 --75.8219 --75.8172 --75.8016 --75.8078 --75.8156 --75.8047 --75.8219 --75.8109 --75.8094 --75.8187 --75.8125 --75.8297 --75.8172 --75.8172 --75.8063 --75.8156 --75.8047 --75.8125 --75.8172 --75.8281 --75.7984 --75.8125 --75.8109 --75.7969 --75.8078 --75.8219 --75.8203 --75.8078 --75.8047 --75.8109 --75.8047 --75.8156 --75.8172 --75.8187 --75.8109 --75.8203 --75.8203 --75.8109 --75.8078 --75.8219 --75.8109 --75.8141 --75.8187 --75.8187 --75.8203 --75.8047 --75.8203 --75.8172 --75.8234 --75.8266 --75.8094 --75.8141 --75.8031 --75.8172 --75.825 --75.8078 --75.8109 --75.8328 --75.8109 --75.8234 --75.8094 --75.8281 --75.8016 --75.8078 --75.8109 --75.8109 --75.8078 --75.8094 --75.8187 --75.8141 --75.8375 --75.8109 --75.8234 --75.8297 --75.8187 --75.8203 --75.8047 --75.8109 --75.8094 --75.8109 --75.7953 --75.8125 --75.8219 --75.8094 --75.8141 --75.8125 --75.8297 --75.8359 --75.8172 --75.8234 --75.8281 --75.825 --75.8281 --75.825 --75.8187 --75.825 --75.8281 --75.8234 --75.8094 --75.8156 --75.8172 --75.8281 --75.8203 --75.8266 --75.8172 --75.8281 --75.8141 --75.8156 --75.8109 --75.8109 --75.8359 --75.8156 --75.8219 --75.8141 --75.8219 --75.8234 --75.8078 --75.8187 --75.8016 --75.8156 --75.8125 --75.8063 --75.8172 --75.8172 --75.8078 --75.8063 --75.8109 --75.8141 --75.8203 --75.8047 --75.8031 --75.8203 --75.8125 --75.8109 --75.8078 --75.8109 --75.8297 --75.8187 --75.8125 --75.8281 --75.8109 --75.8219 --75.8047 --75.8094 --75.8187 --75.8078 --75.8234 --75.7937 --75.8187 --75.8063 --75.8063 --75.8234 --75.8109 --75.8141 --75.8172 --75.8078 --75.8109 --75.8172 --75.8234 --75.8094 --75.8141 --75.8094 --75.8078 --75.8187 --75.8203 --75.8125 --75.8078 --75.8094 --75.8172 --75.8172 --75.8234 --75.8094 --75.8156 --75.8219 --75.8172 --75.8063 --75.8203 --75.8219 --75.8016 --75.8078 --75.8047 --75.8203 --75.8172 --75.8063 --75.8063 --75.7969 --75.8156 --75.8172 --75.8063 --75.825 --75.8313 --75.8125 --75.8281 --75.8078 --75.8234 --75.8203 --75.8297 --75.8219 --75.8281 --75.8063 --75.8109 --75.8187 --75.8125 --75.8203 --75.8141 --75.8125 --75.8172 --75.7969 --75.8156 --75.8047 --75.8 --75.8063 --75.8016 --75.8016 --75.7953 --75.8125 --75.8094 --75.8078 --75.8219 --75.8234 --75.7937 --75.8203 --75.8141 --75.8187 --75.8156 --75.8125 --75.8125 --75.8 --75.825 --75.8016 --75.8141 --75.8297 --75.8063 --75.8203 --75.8156 --75.825 --75.825 --75.8187 --75.8219 --75.825 --75.8234 --75.8063 --75.8172 --75.8234 --75.8172 --75.8187 --75.8031 --75.8297 --75.8203 --75.8344 --75.8094 --75.8266 --75.8234 --75.8016 --75.8219 --75.8078 --75.8313 --75.8187 --75.8313 --75.8109 --75.8141 --75.8219 --75.8219 --75.8281 --75.8266 --75.8063 --75.8078 --75.8219 --75.8219 --75.8266 --75.8063 --75.8266 --75.8219 --75.8281 --75.8172 --75.8187 --75.8219 --75.8234 --75.8406 --75.8344 --75.8297 --75.8125 --75.8234 --75.8375 --75.8328 --75.8281 --75.8375 --75.8297 --75.8281 --75.8281 --75.8359 --75.8375 --75.8266 --75.8234 --75.8203 --75.8187 --75.8156 --75.8234 --75.8078 --75.8125 --75.8172 --75.8125 --75.8094 --75.8063 --75.8203 --75.8234 --75.8094 --75.8203 --75.8063 --75.8031 --75.8141 --75.8187 --75.8063 --75.8125 --75.8094 --75.8141 --75.8203 --75.8109 --75.8141 --75.8109 --75.7984 --75.8109 --75.8047 --75.8094 --75.8234 --75.8047 --75.8078 --75.8156 --75.8219 --75.8141 --75.8156 --75.8141 --75.8063 --75.8078 --75.8109 --75.8125 --75.8187 --75.8078 --75.8125 --75.8047 --75.8203 --75.8125 --75.8125 --75.8172 --75.8109 --75.8016 --75.8016 --75.8094 --75.8063 --75.8094 --75.8063 --75.7953 --75.8016 --75.8016 --75.8094 --75.8031 --75.8016 --75.8047 --75.8125 --75.8109 --75.8094 --75.8172 --75.8203 --75.8203 --75.8125 --75.8063 --75.8125 --75.8219 --75.8172 --75.8078 --75.8219 --75.8063 --75.8109 --75.8109 --75.8187 --75.8172 --75.8281 --75.8031 --75.8234 --75.8156 --75.8219 --75.8125 --75.825 --75.8203 --75.8156 --75.8031 --75.8156 --75.8125 --75.8125 --75.8109 --75.8187 --75.8125 --75.8094 --75.8141 --75.8187 --75.8078 --75.8141 --75.8187 --75.8187 --75.8187 --75.8156 --75.8063 --75.8266 --75.8187 --75.8109 --75.8156 --75.8266 --75.8203 --75.8141 --75.8125 --75.8109 --75.8203 --75.8078 --75.8297 --75.8141 --75.8266 --75.8172 --75.8156 --75.8094 --75.8078 --75.8109 --75.8219 --75.8266 --75.8219 --75.825 --75.8172 --75.8156 --75.8203 --75.8156 --75.8141 --75.8109 --75.8063 --75.8016 --75.8203 --75.8219 --75.8047 --75.8187 --75.8203 --75.8203 --75.8141 --75.8078 --75.8094 --75.8078 --75.8187 --75.8141 --75.8109 --75.8172 --75.8078 --75.8016 --75.7969 --75.8187 --75.7922 --75.8109 --75.8078 --75.8078 --75.8156 --75.8141 --75.8 --75.8016 --75.8125 --75.8016 --75.8063 --75.8141 --75.8203 --75.8078 --75.8031 --75.8031 --75.8 --75.8016 --75.8094 --75.8172 --75.7984 --75.8078 --75.8203 --75.8187 --75.8078 --75.8141 --75.8156 --75.8156 --75.8172 --75.8094 --75.8109 --75.8031 --75.8094 --75.8125 --75.8172 --75.8109 --75.8109 --75.8016 --75.8063 --75.8 --75.8109 --75.8156 --75.8047 --75.8078 --75.8047 --75.8063 --75.7969 --75.8266 --75.8203 --75.8172 --75.8141 --75.8172 --75.8109 --75.8234 --75.8156 --75.8172 --75.8109 --75.825 --75.8078 --75.8266 --75.8219 --75.8203 --75.8078 --75.8141 --75.8203 --75.8297 --75.8266 --75.8219 --75.825 --75.8141 --75.8063 --75.8266 --75.8187 --75.8125 --75.8094 --75.7937 --75.8156 --75.8047 --75.8063 --75.8125 --75.8125 --75.8141 --75.8109 --75.8406 --75.8313 --75.8094 --75.8172 --75.8203 --75.8219 --75.8203 --75.8172 --75.8078 --75.8094 --75.8172 --75.8125 --75.8219 --75.8094 --75.8031 --75.8172 --75.8078 --75.8219 --75.8187 --75.8109 --75.8172 --75.8047 --75.8109 --75.8141 --75.8187 --75.8219 --75.8156 --75.8031 --75.8141 --75.8156 --75.8156 --75.8047 --75.7906 --75.8125 --75.8094 --75.8016 --75.8156 --75.8172 --75.8219 --75.8078 --75.8172 --75.8109 --75.8047 --75.8 --75.8063 --75.8047 --75.8109 --75.8063 --75.8141 --75.8141 --75.8 --75.8156 --75.8141 --75.8219 --75.8125 --75.8094 --75.8266 --75.8156 --75.8172 --75.8094 --75.8094 --75.8047 --75.8125 --75.8172 --75.8078 --75.8047 --75.8156 --75.8094 --75.8172 --75.8094 --75.8141 --75.8203 --75.8172 --75.8172 --75.8109 --75.8422 --75.8078 --75.8047 --75.8016 --75.8172 --75.8047 --75.8172 --75.8187 --75.8156 --75.825 --75.8203 --75.8344 --75.8047 --75.8344 --75.8297 --75.8187 --75.8047 --75.8187 --75.8031 --75.8313 --75.8281 --75.8141 --75.825 --75.8328 --75.8187 --75.8234 --75.8328 --75.825 --75.8406 --75.8281 --75.8297 --75.8375 --75.825 --75.825 --75.8156 --75.8219 --75.8391 --75.8328 --75.8219 --75.8203 --75.8281 --75.8203 --75.8234 --75.8203 --75.8234 --75.8203 --75.8313 --75.8328 --75.8187 --75.8219 --75.8422 --75.8203 --75.8219 --75.8281 --75.8219 --75.8344 --75.8219 --75.8313 --75.8328 --75.8328 --75.8313 --75.8266 --75.8344 --75.8172 --75.8172 --75.8375 --75.8234 --75.8156 --75.8203 --75.8281 --75.8391 --75.8172 --75.8047 --75.8187 --75.8219 --75.8281 --75.8219 --75.8219 --75.8266 --75.8156 --75.8125 --75.8172 --75.8344 --75.8203 --75.8156 --75.8281 --75.8344 --75.8344 --75.8234 --75.8281 --75.8125 --75.8281 --75.825 --75.8266 --75.8156 --75.8125 --75.8344 --75.8156 --75.8219 --75.825 --75.8187 --75.8281 --75.8234 --75.8219 --75.8234 --75.8172 --75.8047 --75.8187 --75.8219 --75.8187 --75.8078 --75.8234 --75.8266 --75.8187 --75.8125 --75.8078 --75.8266 --75.8187 --75.8328 --75.8234 --75.8172 --75.8266 --75.8359 --75.8266 --75.8438 --75.8438 --75.8281 --75.8219 --75.8063 --75.8203 --75.8094 --75.8094 --75.8125 --75.8063 --75.8156 --75.8266 --75.8109 --75.8219 --75.8078 --75.8313 --75.8109 --75.8359 --75.8266 --75.8156 --75.8203 --75.8313 --75.8297 --75.8375 --75.8266 --75.8359 --75.8375 --75.825 --75.8281 --75.8203 --75.8172 --75.8359 --75.8203 --75.8203 --75.8156 --75.8344 --75.8266 --75.8281 --75.8375 --75.8344 --75.8375 --75.8406 --75.8313 --75.8234 --75.8187 --75.8344 --75.8344 --75.8281 --75.8172 --75.8297 --75.8187 --75.8266 --75.8281 --75.8297 --75.8328 --75.8219 --75.8172 --75.8187 --75.8281 --75.8156 --75.8203 --75.8094 --75.8234 --75.825 --75.8313 --75.825 --75.8141 --75.825 --75.8266 --75.825 --75.8438 --75.8203 --75.825 --75.8328 --75.8187 --75.8234 --75.8234 --75.8344 --75.8313 --75.8391 --75.8266 --75.8234 --75.825 --75.8219 --75.8328 --75.825 --75.8297 --75.825 --75.8328 --75.8203 --75.8234 --75.8375 --75.8172 --75.8344 --75.8281 --75.8297 --75.8297 --75.8125 --75.8313 --75.8203 --75.8187 --75.8187 --75.8219 --75.8266 --75.8219 --75.8187 --75.8203 --75.8125 --75.8187 --75.8047 --75.8281 --75.8203 --75.8078 --75.8219 --75.8141 --75.8187 --75.8203 --75.8094 --75.8281 --75.8172 --75.8125 --75.8219 --75.8203 --75.825 --75.825 --75.8234 --75.8234 --75.8156 --75.8203 --75.825 --75.825 --75.8406 --75.8094 --75.8375 --75.8266 --75.8156 --75.8187 --75.8094 --75.8109 --75.8328 --75.8359 --75.8359 --75.8453 --75.8344 --75.8297 --75.8281 --75.8281 --75.8328 --75.8297 --75.8359 --75.8375 --75.8375 --75.8313 --75.8156 --75.8344 --75.8281 --75.8203 --75.8328 --75.8156 --75.8125 --75.8328 --75.8203 --75.8281 --75.8266 --75.8219 --75.8313 --75.8125 --75.8375 --75.8219 --75.8141 --75.8219 --75.8203 --75.8063 --75.8094 --75.8156 --75.825 --75.8187 --75.8125 --75.825 --75.8172 --75.8187 --75.8281 --75.8266 --75.8187 --75.8453 --75.8234 --75.8187 --75.8141 --75.8172 --75.8187 --75.8297 --75.8125 --75.825 --75.8187 --75.825 --75.8109 --75.8313 --75.8234 --75.8219 --75.8172 --75.8063 --75.8094 --75.825 --75.8297 --75.8156 --75.8109 --75.825 --75.8109 --75.8141 --75.8109 --75.8266 --75.8281 --75.8094 --75.8094 --75.8109 --75.8203 --75.8172 --75.8187 --75.8125 --75.8187 --75.8344 --75.8094 --75.825 --75.8203 --75.8125 --75.8234 --75.825 --75.8234 --75.8313 --75.8359 --75.8281 --75.8234 --75.8172 --75.8234 --75.8172 --75.8141 --75.825 --75.8219 --75.8187 --75.8313 --75.8203 --75.8234 --75.8203 --75.8109 --75.8172 --75.8016 --75.8266 --75.8125 --75.8172 --75.8172 --75.8219 --75.8344 --75.8219 --75.8094 --75.8219 --75.8141 --75.8219 --75.8187 --75.8281 --75.8359 --75.8156 --75.8109 --75.8141 --75.8187 --75.8078 --75.8281 --75.8203 --75.8156 --75.8047 --75.8266 --75.8172 --75.7984 --75.8109 --75.8156 --75.8078 --75.8141 --75.7953 --75.8297 --75.8047 --75.8 --75.8141 --75.8219 --75.8078 --75.8219 --75.8156 --75.8016 --75.7984 --75.8187 --75.8078 --75.8344 --75.8219 --75.8078 --75.8344 --75.8187 --75.8172 --75.8094 --75.8125 --75.8187 --75.8031 --75.8031 --75.825 --75.8094 --75.8234 --75.8156 --75.8266 --75.8187 --75.8063 --75.8187 --75.8156 --75.8187 --75.8156 --75.8187 --75.8172 --75.8234 --75.8094 --75.8203 --75.8172 --75.8359 --75.8187 --75.8172 --75.825 --75.8297 --75.8297 --75.8234 --75.8234 --75.8141 --75.8281 --75.8234 --75.8266 --75.8141 --75.8109 --75.8266 --75.8219 --75.8187 --75.8187 --75.8234 --75.8297 --75.8234 --75.825 --75.8344 --75.8344 --75.825 --75.825 --75.8344 --75.8234 --75.8234 --75.8391 --75.825 --75.8156 --75.8344 --75.8266 --75.8016 --75.8313 --75.8187 --75.8297 --75.8266 --75.8156 --75.8234 --75.8125 --75.8187 --75.8219 --75.8172 --75.8063 --75.8141 --75.8156 --75.8078 --75.8172 --75.8141 --75.8109 --75.8172 --75.8203 --75.8156 --75.8109 --75.8203 --75.8234 --75.8141 --75.8234 --75.8125 --75.8234 --75.8141 --75.8266 --75.8125 --75.8203 --75.8187 --75.8281 --75.8125 --75.8 --75.8047 --75.8156 --75.8141 --75.8281 --75.8125 --75.8219 --75.8219 --75.8172 --75.8141 --75.8203 --75.8172 --75.8156 --75.8187 --75.8141 --75.8016 --75.8031 --75.7922 --75.8156 --75.8125 --75.8219 --75.8281 --75.8125 --75.8156 --75.8172 --75.8266 --75.8094 --75.8234 --75.8063 --75.825 --75.8141 --75.8125 --75.8297 --75.8187 --75.8281 --75.8219 --75.8078 --75.8187 --75.825 --75.8016 --75.8219 --75.8203 --75.8266 --75.8203 --75.8141 --75.8219 --75.8063 --75.8172 --75.8031 --75.8109 --75.8063 --75.7969 --75.8141 --75.8187 --75.8219 --75.8234 --75.8187 --75.8016 --75.8125 --75.8109 --75.8094 --75.8219 --75.825 --75.8141 --75.8234 --75.8141 --75.8172 --75.8219 --75.8344 --75.8203 --75.7953 --75.8187 --75.8172 --75.7875 --75.7922 --75.7906 --75.8078 --75.825 --75.8094 --75.8 --75.8141 --75.8094 --75.8203 --75.8109 --75.8078 --75.8156 --75.7953 --75.8125 --75.7953 --75.8031 --75.8187 --75.7984 --75.8266 --75.8156 --75.8094 --75.8078 --75.8344 --75.8141 --75.8078 --75.8125 --75.8172 --75.8172 --75.8125 --75.8125 --75.8063 --75.8156 --75.8141 --75.8078 --75.8297 --75.8047 --75.8063 --75.8125 --75.8219 --75.8063 --75.8297 --75.8141 --75.8219 --75.8156 --75.8187 --75.825 --75.8219 --75.8109 --75.8234 --75.8156 --75.825 --75.8109 --75.8109 --75.8313 --75.8156 --75.8078 --75.8266 --75.8172 --75.8125 --75.8234 --75.8375 --75.8234 --75.8172 --75.8391 --75.8328 --75.8172 --75.8266 --75.8266 --75.8203 --75.8109 --75.825 --75.8219 --75.8266 --75.8313 --75.8172 --75.8219 --75.8297 --75.8313 --75.8219 --75.8219 --75.8156 --75.8187 --75.8172 --75.8219 --75.8172 --75.8141 --75.8094 --75.8375 --75.825 --75.825 --75.8313 --75.8375 --75.8344 --75.8156 --75.8344 --75.8359 --75.8297 --75.8297 --75.8234 --75.825 --75.8266 --75.8281 --75.8172 --75.825 --75.8234 --75.8172 --75.8219 --75.8094 --75.8187 --75.825 --75.8141 --75.8141 --75.8125 --75.8234 --75.8078 --75.8172 --75.8125 --75.8219 --75.8234 --75.8203 --75.8297 --75.8234 --75.8234 --75.825 --75.8156 --75.8 --75.8156 --75.8109 --75.8266 --75.8141 --75.8156 --75.8125 --75.825 --75.8047 --75.8219 --75.8047 --75.8078 --75.825 --75.8156 --75.8281 --75.8313 --75.8219 --75.8375 --75.8187 --75.8109 --75.8313 --75.8219 --75.8313 --75.8187 --75.8203 --75.8203 --75.825 --75.8109 --75.8109 --75.8172 --75.8156 --75.8047 --75.8172 --75.8156 --75.8078 --75.8141 --75.8203 --75.8141 --75.8156 --75.8234 --75.8016 --75.8109 --75.8109 --75.8281 --75.7984 --75.8063 --75.8172 --75.8125 --75.8187 --75.8187 --75.8109 --75.8125 --75.8047 --75.8031 --75.8156 --75.8141 --75.8063 --75.8234 --75.8313 --75.8172 --75.8187 --75.8203 --75.8016 --75.8172 --75.8125 --75.8203 --75.8219 --75.8203 --75.8109 --75.8063 --75.8203 --75.8141 --75.8156 --75.8047 --75.8125 --75.8281 --75.8141 --75.8125 --75.8234 --75.8219 --75.8203 --75.8125 --75.8156 --75.8156 --75.8203 --75.8094 --75.8203 --75.8156 --75.8156 --75.8109 --75.825 --75.8125 --75.8219 --75.8172 --75.8125 --75.8094 --75.8234 --75.8063 --75.8234 --75.8234 --75.8031 --75.8172 --75.8125 --75.8141 --75.8187 --75.8156 --75.8187 --75.8094 --75.8094 --75.8187 --75.8203 --75.8094 --75.8078 --75.8094 --75.8187 --75.8234 --75.8234 --75.8203 --75.8328 --75.8156 --75.8313 --75.8266 --75.8219 --75.8313 --75.8109 --75.8187 --75.8125 --75.8125 --75.8203 --75.8234 --75.8078 --75.8187 --75.8094 --75.8187 --75.8141 --75.8156 --75.8187 --75.8063 --75.8141 --75.8234 --75.8297 --75.8141 --75.8203 --75.8187 --75.8313 --75.8187 --75.8141 --75.8266 --75.8297 --75.8234 --75.8281 --75.8172 --75.8172 --75.8203 --75.8297 --75.8109 --75.8203 --75.8172 --75.8203 --75.8328 --75.8344 --75.8219 --75.8297 --75.8297 --75.8219 --75.8344 --75.8187 --75.8156 --75.825 --75.8281 --75.8141 --75.8328 --75.8219 --75.8219 --75.8219 --75.8203 --75.8172 --75.8203 --75.8094 --75.8234 --75.8297 --75.8172 --75.8172 --75.825 --75.8203 --75.8172 --75.8172 --75.8156 --75.825 --75.8156 --75.8141 --75.8172 --75.8234 --75.8094 --75.8187 --75.8109 --75.8203 --75.8156 --75.8172 --75.8313 --75.8281 --75.8281 --75.8141 --75.8141 --75.8391 --75.8172 --75.8203 --75.8281 --75.8203 --75.8172 --75.8219 --75.825 --75.8344 --75.8328 --75.8219 --75.8328 --75.8219 --75.825 --75.8359 --75.8391 --75.8297 --75.8266 --75.8297 --75.8391 --75.8234 --75.8547 --75.8234 --75.8234 --75.8281 --75.8313 --75.8234 --75.8438 --75.8234 --75.8391 --75.8234 --75.8203 --75.8391 --75.8297 --75.8281 --75.8297 --75.8375 --75.8219 --75.8422 --75.8328 --75.8313 --75.8281 --75.8375 --75.8297 --75.8406 --75.8547 --75.8328 --75.8406 --75.8422 --75.8375 --75.8375 --75.8406 --75.8531 --75.8484 --75.8516 --75.8391 --75.8297 --75.8328 --75.85 --75.8391 --75.8422 --75.8453 --75.8438 --75.8562 --75.8375 --75.8313 --75.8328 --75.8281 --75.825 --75.8391 --75.8281 --75.8313 --75.8234 --75.8219 --75.825 --75.8172 --75.8234 --75.8281 --75.825 --75.8344 --75.8344 --75.8266 --75.8344 --75.8297 --75.8422 --75.8297 --75.8297 --75.8359 --75.8234 --75.8203 --75.8313 --75.8266 --75.8219 --75.8359 --75.825 --75.8344 --75.825 --75.8313 --75.8297 --75.825 --75.8297 --75.8297 --75.8219 --75.8219 --75.8234 --75.8313 --75.8531 --75.8234 --75.8266 --75.8109 --75.8203 --75.8359 --75.8203 --75.8234 --75.8281 --75.8313 --75.8266 --75.825 --75.8281 --75.8438 --75.8391 --75.8469 --75.8266 --75.8313 --75.8281 --75.8234 --75.8313 --75.85 --75.8422 --75.8125 --75.8219 --75.8203 --75.8094 --75.8297 --75.8453 --75.8391 --75.8187 --75.8344 --75.8531 --75.8297 --75.8344 --75.8234 --75.8203 --75.8297 --75.8266 --75.8281 --75.8313 --75.8313 --75.8422 --75.8234 --75.8297 --75.8297 --75.8328 --75.8219 --75.8219 --75.8219 --75.8187 --75.8266 --75.8281 --75.8156 --75.8234 --75.8141 --75.825 --75.8094 --75.8203 --75.8328 --75.8125 --75.8234 --75.8156 --75.825 --75.8234 --75.8109 --75.8187 --75.8156 --75.8172 --75.8125 --75.8047 --75.8203 --75.8219 --75.825 --75.8156 --75.825 --75.8266 --75.8141 --75.8141 --75.825 --75.8234 --75.8313 --75.8219 --75.8187 --75.8234 --75.8203 --75.8266 --75.825 --75.8313 --75.8266 --75.8234 --75.8219 --75.8172 --75.8109 --75.8203 --75.8187 --75.8328 --75.825 --75.8438 --75.8281 --75.8313 --75.8422 --75.8297 --75.8359 --75.8281 --75.8266 --75.8125 --75.8266 --75.8141 --75.8094 --75.8187 --75.8234 --75.8187 --75.8203 --75.8281 --75.8344 --75.8234 --75.8141 --75.8125 --75.8281 --75.8219 --75.825 --75.8219 --75.8219 --75.8187 --75.8187 --75.8156 --75.8187 --75.8187 --75.8313 --75.8266 --75.8234 --75.8266 --75.8281 --75.8313 --75.8094 --75.8344 --75.8172 --75.8281 --75.8313 --75.8219 --75.8391 --75.8359 --75.8156 --75.8266 --75.8328 --75.8391 --75.825 --75.8234 --75.8344 --75.8375 --75.8375 --75.8297 --75.8234 --75.8156 --75.8187 --75.8328 --75.8313 --75.8234 --75.8266 --75.8266 --75.8187 --75.8359 --75.8359 --75.8531 --75.8328 --75.8234 --75.8266 --75.8313 --75.8313 --75.8266 --75.8281 --75.8313 --75.8281 --75.8281 --75.825 --75.8266 --75.825 --75.8141 --75.8344 --75.8281 --75.8203 --75.8297 --75.8187 --75.8297 --75.8313 --75.8375 --75.8375 --75.8203 --75.8375 --75.8219 --75.8234 --75.8203 --75.8328 --75.8266 --75.8344 --75.8203 --75.8 --75.8234 --75.8141 --75.8125 --75.8281 --75.8141 --75.8125 --75.8266 --75.8203 --75.8375 --75.8391 --75.8281 --75.8187 --75.8281 --75.8234 --75.8281 --75.8281 --75.8359 --75.8234 --75.8234 --75.8219 --75.8266 --75.8375 --75.8281 --75.8344 --75.8328 --75.8313 --75.8359 --75.8219 --75.8219 --75.825 --75.825 --75.825 --75.8156 --75.8375 --75.8297 --75.8359 --75.825 --75.8281 --75.8203 --75.8313 --75.8344 --75.8234 --75.8375 --75.8219 --75.8344 --75.8203 --75.8297 --75.8234 --75.8266 --75.8234 --75.8219 --75.8234 --75.8328 --75.8109 --75.8266 --75.8172 --75.8187 --75.8156 --75.8359 --75.8281 --75.8359 --75.8234 --75.8328 --75.8266 --75.825 --75.8359 --75.8203 --75.8266 --75.825 --75.8234 --75.8266 --75.8297 --75.8266 --75.8281 --75.8234 --75.8234 --75.825 --75.8391 --75.8359 --75.8297 --75.8391 --75.8375 --75.8234 --75.8344 --75.8438 --75.8234 --75.8281 --75.8422 --75.8234 --75.8313 --75.8328 --75.8328 --75.8344 --75.85 --75.8219 --75.8344 --75.8344 --75.8344 --75.8375 --75.8375 --75.8328 --75.8391 --75.8313 --75.8203 --75.8219 --75.8328 --75.8281 --75.8297 --75.8266 --75.8297 --75.8422 --75.8313 --75.8266 --75.825 --75.8297 --75.8453 --75.8422 --75.8375 --75.8359 --75.825 --75.8438 --75.8328 --75.8422 --75.8359 --75.8375 --75.8313 --75.825 --75.8344 --75.8187 --75.8297 --75.825 --75.8359 --75.8281 --75.8375 --75.8266 --75.8328 --75.8359 --75.8313 --75.8375 --75.8359 --75.8297 --75.8328 --75.8453 --75.8297 --75.8359 --75.8297 --75.8375 --75.8391 --75.8375 --75.8328 --75.8406 --75.8313 --75.8453 --75.8281 --75.8297 --75.8375 --75.8344 --75.8234 --75.8344 --75.8234 --75.8266 --75.8375 --75.8266 --75.8391 --75.8297 --75.8438 --75.8234 --75.8328 --75.8391 --75.8375 --75.8328 --75.8234 --75.8516 --75.8375 --75.8391 --75.8438 --75.8469 --75.8422 --75.8375 --75.8562 --75.8391 --75.825 --75.8422 --75.8328 --75.8406 --75.8359 --75.8484 --75.8406 --75.8391 --75.8328 --75.8391 --75.8438 --75.825 --75.8359 --75.8359 --75.8359 --75.8406 --75.8422 --75.8266 --75.8453 --75.8422 --75.8375 --75.8516 --75.8516 --75.8406 --75.8516 --75.8344 --75.8406 --75.8359 --75.8266 --75.8344 --75.8453 --75.825 --75.8375 --75.8406 --75.8344 --75.8375 --75.8266 --75.8344 --75.8297 --75.8391 --75.8281 --75.8391 --75.8438 --75.8328 --75.8422 --75.8359 --75.8344 --75.8391 --75.8219 --75.8328 --75.8359 --75.8328 --75.8172 --75.8391 --75.8453 --75.8313 --75.8344 --75.8234 --75.85 --75.8297 --75.8375 --75.8406 --75.8531 --75.8359 --75.8375 --75.8391 --75.8359 --75.8219 --75.8219 --75.8281 --75.8422 --75.8219 --75.8328 --75.8313 --75.8281 --75.8359 --75.8391 --75.8391 --75.8344 --75.8359 --75.825 --75.8391 --75.8375 --75.8344 --75.8375 --75.8313 --75.8422 --75.8344 --75.8313 --75.8344 --75.8297 --75.8328 --75.8375 --75.8156 --75.8328 --75.8344 --75.8391 --75.8422 --75.8187 --75.8375 --75.8406 --75.8187 --75.8281 --75.8375 --75.8344 --75.8281 --75.825 --75.8234 --75.825 --75.8391 --75.8219 --75.8328 --75.8297 --75.8281 --75.8281 --75.8281 --75.8359 --75.8328 --75.8453 --75.8438 --75.8484 --75.85 --75.8484 --75.8453 --75.8344 --75.8359 --75.85 --75.8359 --75.8516 --75.8453 --75.8469 --75.8438 --75.8344 --75.8562 --75.8484 --75.8406 --75.8422 --75.8375 --75.8516 --75.8438 --75.8406 --75.8438 --75.825 --75.8438 --75.8234 --75.8375 --75.8328 --75.8484 --75.8375 --75.8344 --75.8422 --75.8375 --75.8484 --75.8328 --75.8453 --75.8266 --75.8391 --75.8438 --75.8328 --75.8578 --75.8328 --75.8328 --75.825 --75.8234 --75.8187 --75.8422 --75.8328 --75.8375 --75.8266 --75.8328 --75.8281 --75.8438 --75.8219 --75.8328 --75.8297 --75.8516 --75.8422 --75.8328 --75.8391 --75.8438 --75.8297 --75.8453 --75.8375 --75.8391 --75.8422 --75.8406 --75.8531 --75.8422 --75.8281 --75.8313 --75.8453 --75.8391 --75.8281 --75.8234 --75.8391 --75.8406 --75.8375 --75.8375 --75.8266 --75.8438 --75.8344 --75.825 --75.8484 --75.8313 --75.8203 --75.8297 --75.8297 --75.8469 --75.8453 --75.8391 --75.8313 --75.8484 --75.8453 --75.8359 --75.8406 --75.8313 --75.8344 --75.8453 --75.8469 --75.8313 --75.8266 --75.8359 --75.8344 --75.8359 --75.8438 --75.8328 --75.8375 --75.8344 --75.8438 --75.8344 --75.8266 --75.8375 --75.8187 --75.8453 --75.8297 --75.8375 --75.8094 --75.8328 --75.8328 --75.825 --75.8109 --75.8109 --75.8313 --75.8187 --75.8328 --75.8328 --75.8328 --75.8297 --75.8313 --75.8359 --75.8219 --75.825 --75.8281 --75.8313 --75.8281 --75.8375 --75.8234 --75.8344 --75.8281 --75.8406 --75.8297 --75.8281 --75.8281 --75.8344 --75.8328 --75.8141 --75.825 --75.8234 --75.8234 --75.8313 --75.8297 --75.8547 --75.8406 --75.8422 --75.8359 --75.8234 --75.8422 --75.8313 --75.8344 --75.8359 --75.8391 --75.8344 --75.8344 --75.8281 --75.8438 --75.8328 --75.85 --75.8531 --75.8344 --75.8328 --75.8344 --75.8375 --75.8391 --75.8187 --75.8187 --75.8422 --75.8359 --75.8234 --75.8344 --75.8359 --75.8328 --75.8344 --75.8234 --75.8359 --75.8234 --75.8406 --75.8297 --75.8234 --75.8344 --75.8344 --75.8344 --75.8266 --75.8453 --75.8359 --75.8281 --75.8375 --75.8453 --75.8438 --75.8281 --75.8328 --75.825 --75.8344 --75.825 --75.8359 --75.8344 --75.8359 --75.8484 --75.8391 --75.8375 --75.8453 --75.8344 --75.8281 --75.8281 --75.8359 --75.8328 --75.8422 --75.8375 --75.8344 --75.8391 --75.8344 --75.8266 --75.8328 --75.8375 --75.825 --75.825 --75.8313 --75.8297 --75.8281 --75.8391 --75.8203 --75.8234 --75.8297 --75.8281 --75.8438 --75.8344 --75.8344 --75.8406 --75.8375 --75.8391 --75.8359 --75.8344 --75.8281 --75.8406 --75.8281 --75.8359 --75.8406 --75.8375 --75.8297 --75.8578 --75.8391 --75.8438 --75.8562 --75.8438 --75.8484 --75.8375 --75.8344 --75.8406 --75.8406 --75.8391 --75.8391 --75.8484 --75.8422 --75.8484 --75.8313 --75.8344 --75.85 --75.8375 --75.8344 --75.8531 --75.8484 --75.8531 --75.8516 --75.8422 --75.8547 --75.8438 --75.8406 --75.8531 --75.8438 --75.8391 --75.8266 --75.8375 --75.85 --75.8297 --75.8422 --75.8453 --75.8438 --75.8234 --75.8281 --75.8391 --75.8375 --75.8359 --75.8297 --75.8313 --75.8375 --75.8281 --75.8344 --75.8344 --75.8531 --75.8391 --75.8391 --75.8344 --75.8422 --75.8484 --75.8406 --75.8516 --75.8313 --75.8328 --75.8328 --75.8453 --75.8375 --75.8438 --75.8578 --75.8406 --75.8313 --75.8359 --75.8344 --75.8406 --75.8328 --75.85 --75.8422 --75.8344 --75.8625 --75.8453 --75.85 --75.8391 --75.8375 --75.8438 --75.8625 --75.8469 --75.8406 --75.8391 --75.8438 --75.8406 --75.8516 --75.8359 --75.85 --75.8391 --75.8438 --75.8359 --75.8516 --75.8531 --75.8297 --75.8453 --75.8391 --75.8391 --75.8422 --75.8453 --75.8391 --75.8344 --75.8391 --75.8328 --75.8359 --75.8328 --75.8391 --75.8344 --75.8438 --75.8422 --75.8328 --75.8422 --75.8297 --75.8469 --75.825 --75.8438 --75.8328 --75.8406 --75.8453 --75.8344 --75.8328 --75.8328 --75.8375 --75.8344 --75.8266 --75.8344 --75.8484 --75.85 --75.8375 --75.8297 --75.8391 --75.8344 --75.8422 --75.8375 --75.8469 --75.8469 --75.8438 --75.8344 --75.8516 --75.8438 --75.8375 --75.8375 --75.8484 --75.8516 --75.8531 --75.8484 --75.8391 --75.8406 --75.8375 --75.8484 --75.8469 --75.8438 --75.8516 --75.8469 --75.8453 --75.8453 --75.8391 --75.8375 --75.8344 --75.8469 --75.8469 --75.8375 --75.8406 --75.8547 --75.8375 --75.85 --75.8391 --75.8328 --75.8531 --75.8547 --75.8391 --75.8453 --75.8422 --75.8438 --75.8547 --75.8578 --75.8484 --75.8438 --75.8359 --75.8594 --75.8469 --75.8641 --75.8625 --75.8641 --75.8594 --75.8609 --75.8625 --75.8703 --75.8656 --75.8672 --75.8609 --75.8672 --75.8656 --75.85 --75.8578 --75.8562 --75.85 --75.8531 --75.8625 --75.8656 --75.8516 --75.85 --75.8391 --75.8547 --75.8562 --75.8594 --75.8578 --75.8594 --75.8703 --75.8547 --75.85 --75.8641 --75.8656 --75.8594 --75.8547 --75.8438 --75.85 --75.8578 --75.8484 --75.8594 --75.85 --75.8484 --75.8531 --75.8469 --75.8453 --75.8375 --75.8672 --75.8422 --75.8484 --75.8469 --75.8484 --75.8531 --75.8562 --75.8531 --75.8438 --75.8375 --75.8453 --75.8391 --75.8547 --75.8578 --75.8516 --75.8516 --75.8453 --75.8531 --75.8516 --75.8578 --75.8547 --75.8547 --75.8594 --75.8609 --75.8484 --75.8578 --75.8438 --75.8578 --75.8641 --75.8594 --75.8562 --75.8547 --75.8547 --75.8594 --75.8531 --75.8484 --75.8547 --75.8609 --75.8484 --75.8531 --75.8516 --75.8672 --75.8625 --75.8562 --75.8547 --75.8672 --75.8719 --75.8688 --75.8688 --75.8641 --75.8609 --75.8531 --75.8672 --75.8562 --75.8578 --75.8656 --75.8547 --75.8578 --75.8609 --75.85 --75.85 --75.8562 --75.8609 --75.8547 --75.8625 --75.8453 --75.8562 --75.8594 --75.8609 --75.8484 --75.8641 --75.8562 --75.8484 --75.8516 --75.8531 --75.8453 --75.8562 --75.8562 --75.8516 --75.8672 --75.85 --75.8594 --75.8469 --75.8438 --75.8469 --75.8438 --75.8562 --75.8625 --75.8625 --75.8562 --75.8547 --75.8562 --75.8484 --75.8703 --75.8406 --75.8578 --75.8594 --75.8453 --75.8609 --75.8516 --75.8594 --75.8656 --75.8516 --75.8547 --75.8562 --75.8656 --75.8547 --75.8562 --75.8547 --75.8531 --75.8484 --75.85 --75.8672 --75.8562 --75.8578 --75.8469 --75.8484 --75.8547 --75.8719 --75.8609 --75.8562 --75.8625 --75.8641 --75.8703 --75.8656 --75.8562 --75.8672 --75.8531 --75.8516 --75.8562 --75.875 --75.8594 --75.8594 --75.8688 --75.8609 --75.8656 --75.8531 --75.8547 --75.8531 --75.8609 --75.8531 --75.8609 --75.8703 --75.8656 --75.8656 --75.8688 --75.8625 --75.8578 --75.8766 --75.8516 --75.8641 --75.8516 --75.8625 --75.8688 --75.85 --75.8594 --75.8766 --75.8578 --75.8609 --75.8484 --75.8641 --75.8672 --75.8562 --75.8609 --75.8688 --75.8609 --75.8688 --75.8688 --75.8594 --75.8656 --75.8594 --75.8703 --75.8516 --75.8719 --75.8656 --75.8547 --75.8547 --75.8578 --75.8422 --75.8547 --75.8672 --75.8703 --75.8656 --75.8766 --75.8672 --75.8672 --75.8594 --75.8578 --75.8594 --75.8594 --75.8672 --75.8578 --75.8609 --75.8672 --75.8547 --75.8578 --75.8688 --75.8703 --75.8672 --75.8719 --75.8703 --75.8594 --75.8562 --75.8719 --75.8719 --75.8609 --75.8656 --75.8625 --75.8625 --75.8734 --75.8609 --75.8578 --75.8484 --75.8578 --75.8594 --75.85 --75.8516 --75.8625 --75.8594 --75.8609 --75.8578 --75.8562 --75.8516 --75.8547 --75.8484 --75.8641 --75.8547 --75.8688 --75.8578 --75.8719 --75.8688 --75.8719 --75.8672 --75.8609 --75.8625 --75.8641 --75.8672 --75.8578 --75.8703 --75.8609 --75.8688 --75.8719 --75.8766 --75.8703 --75.8719 --75.875 --75.8547 --75.8734 --75.8672 --75.8672 --75.8672 --75.8625 --75.8641 --75.8578 --75.875 --75.8391 --75.8594 --75.8547 --75.8609 --75.8516 --75.8641 --75.8703 --75.8578 --75.8625 --75.8578 --75.8672 --75.8656 --75.8562 --75.8531 --75.8516 --75.8578 --75.8516 --75.8562 --75.8547 --75.8625 --75.8578 --75.8766 --75.8625 --75.8672 --75.8531 --75.8609 --75.8609 --75.8562 --75.8641 --75.8547 --75.8547 --75.8719 --75.8531 --75.8562 --75.8531 --75.8609 --75.8547 --75.8578 --75.8609 --75.8562 --75.8578 --75.8578 --75.8766 --75.8562 --75.8484 --75.8797 --75.8547 --75.8609 --75.8641 --75.8625 --75.8734 --75.8422 --75.8734 --75.8688 --75.8781 --75.8547 --75.8609 --75.8609 --75.8641 --75.8859 --75.8656 --75.8594 --75.8672 --75.8625 --75.85 --75.8641 --75.8609 --75.8672 --75.8594 --75.8688 --75.8578 --75.8641 --75.8578 --75.8547 --75.8625 --75.8703 --75.8516 --75.8656 --75.8594 --75.8688 --75.8703 --75.8719 --75.8734 --75.8656 --75.8656 --75.8531 --75.8641 --75.8734 --75.8828 --75.8781 --75.8719 --75.8688 --75.8562 --75.8688 --75.8625 --75.8641 --75.8625 --75.8781 --75.8828 --75.8719 --75.8703 --75.875 --75.8672 --75.8703 --75.8781 --75.8703 --75.8625 --75.8672 --75.8703 --75.8766 --75.8672 --75.8781 --75.8641 --75.8875 --75.8594 --75.8672 --75.8703 --75.8656 --75.8641 --75.8719 --75.8656 --75.8703 --75.8719 --75.8734 --75.85 --75.8672 --75.8734 --75.8578 --75.8641 --75.8656 --75.8688 --75.8656 --75.8641 --75.8688 --75.8703 --75.8609 --75.8562 --75.8703 --75.8859 --75.8703 --75.8703 --75.8812 --75.875 --75.8719 --75.8766 --75.8703 --75.8703 --75.8781 --75.8672 --75.875 --75.875 --75.8797 --75.8875 --75.8766 --75.8781 --75.8938 --75.875 --75.8781 --75.8781 --75.875 --75.8672 --75.8797 --75.875 --75.8859 --75.8797 --75.8734 --75.875 --75.8672 --75.8812 --75.8688 --75.8688 --75.8766 --75.8688 --75.875 --75.8781 --75.8828 --75.8812 --75.8703 --75.875 --75.8719 --75.8625 --75.8812 --75.8656 --75.8547 --75.8672 --75.875 --75.8734 --75.8766 --75.8719 --75.8828 --75.8641 --75.8719 --75.8766 --75.8797 --75.8688 --75.8766 --75.8688 --75.8812 --75.8781 --75.875 --75.8844 --75.8734 --75.8844 --75.8766 --75.8703 --75.8797 --75.8734 --75.8781 --75.8797 --75.8734 --75.8828 --75.8812 --75.8656 --75.8828 --75.8781 --75.8766 --75.8734 --75.8844 --75.8703 --75.875 --75.8797 --75.8875 --75.8859 --75.8922 --75.8781 --75.8828 --75.8719 --75.8703 --75.8828 --75.8906 --75.8781 --75.8906 --75.8781 --75.8766 --75.8766 --75.8797 --75.8906 --75.8797 --75.8797 --75.8734 --75.8688 --75.8797 --75.8703 --75.8828 --75.8781 --75.8797 --75.8672 --75.8641 --75.8609 --75.8609 --75.8766 --75.8703 --75.8766 --75.8781 --75.8766 --75.8578 --75.85 --75.8641 --75.8562 --75.8594 --75.8719 --75.8562 --75.8703 --75.8719 --75.8703 --75.8578 --75.8656 --75.8703 --75.8688 --75.8688 --75.8891 --75.8688 --75.8766 --75.8578 --75.8875 --75.8891 --75.8781 --75.8688 --75.8781 --75.8812 --75.8812 --75.8766 --75.8828 --75.8797 --75.8672 --75.8719 --75.8891 --75.8797 --75.8672 --75.8781 --75.8828 --75.8859 --75.8859 --75.8875 --75.875 --75.8828 --75.8859 --75.8797 --75.8844 --75.8781 --75.8781 --75.8891 --75.8891 --75.8984 --75.8781 --75.8781 --75.8891 --75.8859 --75.8891 --75.8859 --75.8891 --75.8781 --75.875 --75.8672 --75.8797 --75.8875 --75.8766 --75.8766 --75.8719 --75.8797 --75.8719 --75.8766 --75.8688 --75.8797 --75.8547 --75.8891 --75.8906 --75.8828 --75.8812 --75.8891 --75.8859 --75.8812 --75.8781 --75.8766 --75.8688 --75.8797 --75.8844 --75.8828 --75.8828 --75.8859 --75.8781 --75.8969 --75.8875 --75.8797 --75.8859 --75.8734 --75.875 --75.875 --75.8812 --75.8812 --75.8891 --75.8719 --75.8828 --75.8812 --75.8844 --75.8922 --75.8875 --75.8906 --75.8844 --75.8781 --75.8859 --75.8891 --75.8719 --75.8875 --75.8859 --75.8859 --75.8875 --75.8922 --75.8844 --75.8797 --75.8828 --75.8781 --75.8766 --75.8828 --75.8703 --75.8797 --75.8625 --75.8781 --75.8703 --75.8656 --75.8703 --75.875 --75.8656 --75.8688 --75.8766 --75.8844 --75.8828 --75.8719 --75.8891 --75.8688 --75.8859 --75.8844 --75.8812 --75.8719 --75.8844 --75.8875 --75.8828 --75.8859 --75.8812 --75.8859 --75.8906 --75.8984 --75.8891 --75.8906 --75.8812 --75.8812 --75.8906 --75.9 --75.8891 --75.8734 --75.8812 --75.9109 --75.8984 --75.9016 --75.9016 --75.9172 --75.8875 --75.8828 --75.8969 --75.8891 --75.9016 --75.8969 --75.9 --75.8906 --75.8828 --75.8812 --75.8953 --75.8984 --75.8891 --75.8922 --75.8984 --75.8875 --75.8984 --75.8812 --75.9047 --75.8828 --75.8812 --75.9172 --75.8922 --75.8938 --75.8938 --75.8828 --75.8875 --75.8875 --75.8797 --75.8875 --75.8828 --75.8797 --75.8766 --75.8828 --75.8875 --75.8828 --75.8797 --75.8828 --75.8859 --75.8859 --75.8781 --75.8766 --75.8844 --75.8969 --75.8859 --75.8859 --75.9016 --75.8984 --75.875 --75.8797 --75.8781 --75.8703 --75.8875 --75.8734 --75.8844 --75.8844 --75.8688 --75.8875 --75.8703 --75.8812 --75.8828 --75.8859 --75.8875 --75.8859 --75.8797 --75.8766 --75.8797 --75.8875 --75.8781 --75.8844 --75.8875 --75.8766 --75.875 --75.8766 --75.8781 --75.8797 --75.8859 --75.8719 --75.8766 --75.8844 --75.8656 --75.8875 --75.8609 --75.8672 --75.8922 --75.875 --75.8781 --75.9 --75.8688 --75.8875 --75.8906 --75.8766 --75.8922 --75.8891 --75.9016 --75.875 --75.8844 --75.8844 --75.8906 --75.8875 --75.8844 --75.8859 --75.8828 --75.8797 --75.8719 --75.8703 --75.8906 --75.875 --75.8953 --75.8906 --75.8812 --75.8781 --75.8969 --75.8828 --75.8797 --75.8875 --75.8812 --75.8812 --75.8719 --75.8953 --75.8906 --75.8938 --75.8875 --75.8844 --75.8766 --75.8797 --75.8719 --75.8938 --75.8797 --75.8875 --75.8953 --75.8891 --75.8781 --75.8828 --75.8797 --75.9016 --75.8875 --75.9062 --75.8953 --75.9047 --75.8938 --75.9141 --75.8859 --75.8875 --75.8812 --75.8875 --75.8828 --75.8906 --75.8906 --75.8938 --75.8906 --75.9016 --75.875 --75.8797 --75.8906 --75.9047 --75.8844 --75.8875 --75.8984 --75.8828 --75.8938 --75.8953 --75.8859 --75.9016 --75.8859 --75.8984 --75.8891 --75.8875 --75.8922 --75.8922 --75.8844 --75.8875 --75.8844 --75.9016 --75.8875 --75.8859 --75.8891 --75.8969 --75.8844 --75.8844 --75.8938 --75.8859 --75.8859 --75.8922 --75.8812 --75.8938 --75.8938 --75.8812 --75.8828 --75.9031 --75.8875 --75.8922 --75.8984 --75.875 --75.8812 --75.8891 --75.8797 --75.8828 --75.8766 --75.8859 --75.8953 --75.8875 --75.8844 --75.8844 --75.8844 --75.8906 --75.8938 --75.8812 --75.9 --75.9047 --75.8906 --75.8922 --75.8969 --75.8875 --75.875 --75.8734 --75.9062 --75.8984 --75.8922 --75.8875 --75.8953 --75.8875 --75.8859 --75.8891 --75.8906 --75.8906 --75.8922 --75.8797 --75.8828 --75.8859 --75.8797 --75.8984 --75.8812 --75.8938 --75.8703 --75.8844 --75.9109 --75.8906 --75.8922 --75.8875 --75.8906 --75.8922 --75.8938 --75.8938 --75.8844 --75.8906 --75.8766 --75.8812 --75.8891 --75.8891 --75.8688 --75.8812 --75.8828 --75.8734 --75.8891 --75.8938 --75.8844 --75.9016 --75.8828 --75.8766 --75.875 --75.8719 --75.8766 --75.8953 --75.8875 --75.8844 --75.8859 --75.8953 --75.8922 --75.8781 --75.8922 --75.8969 --75.8828 --75.8844 --75.8844 --75.8828 --75.8797 --75.8984 --75.8828 --75.8844 --75.8766 --75.8844 --75.8891 --75.8812 --75.8812 --75.8875 --75.8984 --75.8734 --75.8859 --75.8766 --75.8844 --75.8781 --75.8859 --75.8891 --75.8922 --75.9 --75.8969 --75.8891 --75.9062 --75.8859 --75.8938 --75.8828 --75.8875 --75.8922 --75.8891 --75.8828 --75.9047 --75.8922 --75.8859 --75.8875 --75.9016 --75.9 --75.9016 --75.8906 --75.8938 --75.8922 --75.8906 --75.8938 --75.9016 --75.8875 --75.9016 --75.8953 --75.8938 --75.8922 --75.9062 --75.8906 --75.8984 --75.9031 --75.8844 --75.9031 --75.8891 --75.8906 --75.8828 --75.8891 --75.8906 --75.875 --75.8859 --75.8844 --75.8828 --75.8906 --75.8906 --75.8891 --75.8812 --75.8766 --75.8766 --75.8844 --75.8922 --75.8734 --75.8812 --75.8906 --75.8828 --75.8844 --75.8953 --75.8984 --75.8859 --75.9047 --75.8844 --75.8844 --75.8969 --75.8797 --75.8875 --75.8859 --75.8891 --75.8828 --75.8953 --75.8875 --75.8922 --75.8953 --75.9016 --75.9141 --75.8875 --75.8922 --75.8875 --75.8891 --75.9125 --75.8969 --75.8922 --75.8969 --75.8875 --75.8891 --75.8891 --75.8906 --75.8891 --75.8938 --75.8938 --75.8797 --75.8906 --75.8812 --75.8781 --75.8875 --75.8844 --75.8906 --75.8891 --75.875 --75.8938 --75.8922 --75.8969 --75.8875 --75.8922 --75.8859 --75.8938 --75.9062 --75.8953 --75.8891 --75.8797 --75.8844 --75.8906 --75.8922 --75.8781 --75.8812 --75.9016 --75.8844 --75.8719 --75.8984 --75.8953 --75.8688 --75.8828 --75.8938 --75.8797 --75.8844 --75.875 --75.8984 --75.8859 --75.8984 --75.9031 --75.9109 --75.8859 --75.8891 --75.8969 --75.8984 --75.8859 --75.8844 --75.8891 --75.8859 --75.8922 --75.8984 --75.8938 --75.8922 --75.9062 --75.9016 --75.8859 --75.9031 --75.9031 --75.9062 --75.8953 --75.8984 --75.9047 --75.9141 --75.9109 --75.9016 --75.8953 --75.8969 --75.9109 --75.9125 --75.8969 --75.8938 --75.9078 --75.8891 --75.9016 --75.8953 --75.8969 --75.9062 --75.8938 --75.9062 --75.9016 --75.9109 --75.9 --75.8922 --75.9078 --75.9062 --75.8891 --75.8969 --75.8953 --75.8906 --75.8938 --75.9047 --75.9219 --75.9031 --75.9062 --75.9062 --75.9031 --75.9062 --75.9062 --75.9141 --75.9156 --75.8984 --75.9031 --75.9109 --75.9078 --75.9 --75.9109 --75.9031 --75.9062 --75.9078 --75.8984 --75.8938 --75.9125 --75.8984 --75.9125 --75.8938 --75.9094 --75.8984 --75.8953 --75.9125 --75.8969 --75.8969 --75.9 --75.8953 --75.9016 --75.9141 --75.9031 --75.9062 --75.9047 --75.9016 --75.9109 --75.8922 --75.9062 --75.9 --75.9125 --75.9078 --75.9 --75.8922 --75.9078 --75.9031 --75.9016 --75.8922 --75.9047 --75.8875 --75.8953 --75.925 --75.9141 --75.9062 --75.8984 --75.8938 --75.9016 --75.9031 --75.9156 --75.9125 --75.925 --75.9094 --75.9234 --75.9156 --75.9219 --75.9 --75.9172 --75.9109 --75.9203 --75.9203 --75.8969 --75.9094 --75.9078 --75.9109 --75.9359 --75.9109 --75.9078 --75.9047 --75.8984 --75.9062 --75.9031 --75.9109 --75.8906 --75.9062 --75.9047 --75.9156 --75.9047 --75.9078 --75.8969 --75.9141 --75.9109 --75.9094 --75.9 --75.9203 --75.9172 --75.9031 --75.9094 --75.8969 --75.9141 --75.9078 --75.9109 --75.9109 --75.9125 --75.9109 --75.9078 --75.9062 --75.9078 --75.9109 --75.9125 --75.9125 --75.9094 --75.9078 --75.9078 --75.8953 --75.8938 --75.8953 --75.9016 --75.8922 --75.9047 --75.8984 --75.9062 --75.9016 --75.9047 --75.8891 --75.9094 --75.9 --75.9047 --75.8969 --75.8922 --75.8906 --75.9062 --75.9156 --75.8922 --75.8953 --75.8969 --75.8797 --75.8875 --75.9062 --75.8828 --75.9062 --75.8766 --75.9016 --75.8938 --75.8875 --75.8922 --75.8891 --75.8906 --75.9047 --75.8859 --75.8922 --75.8906 --75.8953 --75.8953 --75.8922 --75.8922 --75.8938 --75.8938 --75.8984 --75.9141 --75.8891 --75.9016 --75.8906 --75.9109 --75.8922 --75.9031 --75.8938 --75.8984 --75.8953 --75.8812 --75.8938 --75.8953 --75.9016 --75.8875 --75.8938 --75.8922 --75.8938 --75.9047 --75.9047 --75.8953 --75.8984 --75.9 --75.9016 --75.9078 --75.9141 --75.8969 --75.8984 --75.9 --75.8969 --75.9016 --75.9016 --75.9047 --75.9 --75.8969 --75.9094 --75.8969 --75.9109 --75.9047 --75.9047 --75.8984 --75.8938 --75.9 --75.9062 --75.9078 --75.9062 --75.9062 --75.9031 --75.8969 --75.8938 --75.9094 --75.9016 --75.9047 --75.8906 --75.9047 --75.9078 --75.8906 --75.9016 --75.9109 --75.8938 --75.9109 --75.9016 --75.9078 --75.9031 --75.9078 --75.9078 --75.9109 --75.9109 --75.9141 --75.9078 --75.9094 --75.9 --75.9047 --75.9109 --75.925 --75.9109 --75.9109 --75.8969 --75.9 --75.9016 --75.9156 --75.8859 --75.9141 --75.9109 --75.9094 --75.9109 --75.9187 --75.9078 --75.8984 --75.9203 --75.9234 --75.9031 --75.9125 --75.9172 --75.9172 --75.9016 --75.9125 --75.9172 --75.9141 --75.9062 --75.9109 --75.9156 --75.9156 --75.9094 --75.9109 --75.9078 --75.9125 --75.8953 --75.9109 --75.9062 --75.9109 --75.9266 --75.9156 --75.9094 --75.9156 --75.8953 --75.9172 --75.9203 --75.925 --75.9281 --75.9266 --75.9187 --75.9156 --75.9187 --75.9141 --75.9172 --75.9109 --75.9156 --75.9094 --75.9234 --75.9 --75.9078 --75.9141 --75.9031 --75.9203 --75.9234 --75.9187 --75.9078 --75.8953 --75.9125 --75.9031 --75.9062 --75.9016 --75.9062 --75.9094 --75.8891 --75.8938 --75.9125 --75.9078 --75.9031 --75.9125 --75.9062 --75.8953 --75.8984 --75.8938 --75.9062 --75.9047 --75.9016 --75.9031 --75.9125 --75.9031 --75.9062 --75.9016 --75.9 --75.9172 --75.9 --75.9094 --75.9125 --75.9094 --75.8922 --75.9141 --75.9297 --75.9313 --75.9078 --75.9031 --75.9078 --75.9187 --75.9125 --75.8984 --75.9172 --75.9031 --75.9 --75.8969 --75.9141 --75.9187 --75.9031 --75.8984 --75.9094 --75.9125 --75.9094 --75.9219 --75.9 --75.9234 --75.9078 --75.9062 --75.9016 --75.8938 --75.9031 --75.9187 --75.9047 --75.9094 --75.9109 --75.9062 --75.9047 --75.9109 --75.9109 --75.8969 --75.8953 --75.9125 --75.9141 --75.9047 --75.8984 --75.9094 --75.9109 --75.9062 --75.9062 --75.9031 --75.9094 --75.9109 --75.9078 --75.9094 --75.9094 --75.9094 --75.8953 --75.9062 --75.9109 --75.9016 --75.9156 --75.9078 --75.9109 --75.9172 --75.9141 --75.9187 --75.9141 --75.9266 --75.9047 --75.9125 --75.9281 --75.9156 --75.9062 --75.9281 --75.9094 --75.9141 --75.9109 --75.9313 --75.9109 --75.9094 --75.9141 --75.9187 --75.9109 --75.9094 --75.9219 --75.9187 --75.9187 --75.9281 --75.9141 --75.9156 --75.9156 --75.9 --75.9125 --75.9156 --75.9109 --75.9125 --75.9172 --75.9109 --75.9109 --75.9047 --75.9297 --75.9297 --75.9156 --75.9219 --75.9203 --75.9328 --75.9187 --75.9172 --75.9219 --75.9172 --75.9313 --75.9141 --75.9109 --75.9281 --75.9109 --75.9344 --75.9187 --75.9219 --75.9156 --75.9172 --75.9094 --75.9187 --75.9109 --75.9094 --75.9094 --75.9203 --75.9187 --75.9187 --75.925 --75.9281 --75.9203 --75.9109 --75.9203 --75.9109 --75.9156 --75.9156 --75.9062 --75.9219 --75.9297 --75.9203 --75.9203 --75.9125 --75.9094 --75.9266 --75.9187 --75.9203 --75.9203 --75.9156 --75.9281 --75.9109 --75.9219 --75.9234 --75.9125 --75.9156 --75.9203 --75.9078 --75.9125 --75.9187 --75.9125 --75.925 --75.9109 --75.9016 --75.9156 --75.9187 --75.9187 --75.9172 --75.9203 --75.9125 --75.9266 --75.9141 --75.9187 --75.9125 --75.9219 --75.925 --75.9219 --75.9062 --75.9047 --75.9156 --75.9219 --75.9219 --75.9203 --75.9094 --75.9125 --75.9078 --75.9187 --75.925 --75.9172 --75.9187 --75.9125 --75.9109 --75.9109 --75.9062 --75.9156 --75.9062 --75.9219 --75.9047 --75.9094 --75.9156 --75.9297 --75.9062 --75.9172 --75.925 --75.9078 --75.9234 --75.9187 --75.9109 --75.9187 --75.925 --75.9203 --75.9078 --75.9234 --75.9125 --75.9281 --75.9234 --75.9234 --75.9219 --75.9172 --75.9187 --75.9172 --75.9078 --75.9203 --75.9266 --75.9078 --75.9187 --75.9109 --75.9141 --75.9094 --75.9266 --75.9266 --75.9187 --75.9187 --75.9172 --75.9297 --75.9109 --75.9094 --75.9297 --75.9281 --75.9234 --75.9281 --75.9141 --75.9203 --75.9219 --75.925 --75.9187 --75.9094 --75.9141 --75.925 --75.9141 --75.9187 --75.9141 --75.9187 --75.9 --75.9156 --75.9156 --75.9062 --75.9219 --75.9297 --75.9187 --75.9266 --75.9187 --75.9219 --75.9203 --75.9234 --75.9187 --75.9078 --75.9156 --75.9078 --75.9328 --75.9172 --75.9078 --75.9125 --75.9141 --75.9219 --75.925 --75.9109 --75.9187 --75.9219 --75.9125 --75.9141 --75.9141 --75.9187 --75.9203 --75.9313 --75.9078 --75.9234 --75.9203 --75.9203 --75.9172 --75.9281 --75.9359 --75.9109 --75.9297 --75.9406 --75.9234 --75.9172 --75.925 --75.925 --75.9328 --75.9172 --75.9344 --75.9141 --75.9344 --75.9328 --75.925 --75.9156 --75.925 --75.9234 --75.9141 --75.9234 --75.9203 --75.9203 --75.9203 --75.9109 --75.9141 --75.9094 --75.9125 --75.9156 --75.9062 --75.8984 --75.9109 --75.9172 --75.9047 --75.925 --75.925 --75.9266 --75.925 --75.9266 --75.9266 --75.9313 --75.9297 --75.9172 --75.9219 --75.9172 --75.9219 --75.925 --75.9219 --75.9109 --75.925 --75.9234 --75.9234 --75.9281 --75.9141 --75.9266 --75.9203 --75.9187 --75.9281 --75.9109 --75.9234 --75.9172 --75.9172 --75.9172 --75.925 --75.9297 --75.9266 --75.9266 --75.9109 --75.9094 --75.9281 --75.9297 --75.9328 --75.9344 --75.9203 --75.9156 --75.9234 --75.9156 --75.925 --75.9375 --75.9187 --75.9187 --75.9266 --75.9313 --75.9234 --75.9109 --75.9313 --75.9266 --75.9313 --75.9219 --75.9156 --75.9219 --75.9109 --75.9328 --75.9313 --75.9187 --75.9078 --75.9297 --75.9219 --75.9203 --75.9187 --75.9422 --75.9281 --75.9297 --75.925 --75.9125 --75.9156 --75.9281 --75.9234 --75.9094 --75.925 --75.9266 --75.9266 --75.9297 --75.9156 --75.925 --75.9297 --75.9313 --75.9313 --75.9141 --75.9187 --75.9344 --75.9172 --75.925 --75.9219 --75.925 --75.9266 --75.9234 --75.9172 --75.9156 --75.9125 --75.9219 --75.9266 --75.9266 --75.9375 --75.925 --75.925 --75.9281 --75.9219 --75.9219 --75.9234 --75.925 --75.9234 --75.9234 --75.9281 --75.9297 --75.9328 --75.9141 --75.9187 --75.9172 --75.9156 --75.9109 --75.925 --75.9187 --75.9266 --75.9109 --75.9156 --75.9172 --75.9281 --75.9187 --75.9109 --75.9203 --75.9156 --75.9172 --75.9094 --75.9141 --75.9172 --75.9078 --75.9062 --75.9234 --75.9062 --75.9172 --75.9297 --75.9156 --75.9016 --75.9187 --75.9297 --75.9125 --75.9156 --75.925 --75.9266 --75.9234 --75.9313 --75.9187 --75.9328 --75.925 --75.9219 --75.9078 --75.9156 --75.9141 --75.9187 --75.9141 --75.9141 --75.9016 --75.9156 --75.9234 --75.9109 --75.9109 --75.9187 --75.9172 --75.9109 --75.9187 --75.9187 --75.9016 --75.9094 --75.9187 --75.9172 --75.9109 --75.9125 --75.9062 --75.9203 --75.9062 --75.8953 --75.9203 --75.9062 --75.9 --75.9125 --75.9156 --75.9 --75.8984 --75.9125 --75.9156 --75.9078 --75.9141 --75.9062 --75.9172 --75.9062 --75.9187 --75.9109 --75.925 --75.9109 --75.925 --75.9156 --75.9109 --75.9078 --75.9187 --75.9297 --75.9172 --75.9109 --75.9234 --75.9344 --75.9062 --75.9094 --75.9016 --75.9125 --75.8922 --75.9172 --75.9172 --75.9125 --75.9016 --75.9234 --75.9094 --75.9141 --75.9266 --75.9172 --75.9047 --75.9141 --75.9094 --75.9203 --75.9375 --75.9078 --75.9156 --75.9187 --75.9156 --75.9109 --75.9156 --75.9281 --75.9078 --75.925 --75.9094 --75.9016 --75.9172 --75.9156 --75.9016 --75.925 --75.9062 --75.9125 --75.9187 --75.9203 --75.9203 --75.9187 --75.9094 --75.8984 --75.9125 --75.9094 --75.9109 --75.9187 --75.9094 --75.9234 --75.9203 --75.925 --75.9187 --75.9266 --75.9203 --75.9219 --75.9187 --75.9156 --75.9047 --75.9125 --75.9031 --75.9125 --75.9313 --75.9031 --75.9203 --75.9078 --75.9313 --75.9078 --75.9094 --75.9062 --75.9297 --75.9016 --75.925 --75.9219 --75.9156 --75.9125 --75.9031 --75.9141 --75.9234 --75.9062 --75.9031 --75.9141 --75.8938 --75.9078 --75.8969 --75.9109 --75.9078 --75.9047 --75.9016 --75.9016 --75.9094 --75.9109 --75.8984 --75.9031 --75.9125 --75.9094 --75.9094 --75.9016 --75.9172 --75.9094 --75.9062 --75.9156 --75.9094 --75.9109 --75.9203 --75.9203 --75.9109 --75.9031 --75.9109 --75.9062 --75.9266 --75.9031 --75.9125 --75.9 --75.9156 --75.9 --75.9187 --75.9078 --75.9078 --75.9047 --75.9109 --75.8984 --75.9187 --75.9125 --75.8969 --75.9156 --75.9062 --75.9172 --75.9047 --75.9156 --75.9203 --75.9125 --75.9156 --75.9141 --75.9203 --75.9078 --75.9047 --75.9109 --75.9062 --75.9187 --75.9109 --75.9 --75.9109 --75.9109 --75.9078 --75.9172 --75.9203 --75.9109 --75.9219 --75.9047 --75.9187 --75.9125 --75.9031 --75.9125 --75.9281 --75.9219 --75.9062 --75.925 --75.9266 --75.9203 --75.9297 --75.9187 --75.9219 --75.9047 --75.9125 --75.9078 --75.9062 --75.8984 --75.9172 --75.9125 --75.9062 --75.9047 --75.9031 --75.9172 --75.9094 --75.9172 --75.9125 --75.9047 --75.9047 --75.9062 --75.9062 --75.9109 --75.9094 --75.8938 --75.9094 --75.9219 --75.9031 --75.9125 --75.9125 --75.9141 --75.9141 --75.9109 --75.8953 --75.9047 --75.9062 --75.9125 --75.9031 --75.9078 --75.9125 --75.8953 --75.9094 --75.9094 --75.9062 --75.9078 --75.9062 --75.9313 --75.9141 --75.9094 --75.9156 --75.9109 --75.9109 --75.9 --75.9156 --75.9094 --75.9047 --75.9187 --75.9234 --75.8984 --75.9047 --75.9219 --75.9062 --75.9109 --75.9234 --75.9125 --75.9203 --75.9187 --75.9234 --75.9172 --75.9219 --75.9094 --75.9125 --75.9062 --75.925 --75.9031 --75.9156 --75.9016 --75.9031 --75.8953 --75.9062 --75.9094 --75.9109 --75.9016 --75.9016 --75.9031 --75.9016 --75.9156 --75.9078 --75.9125 --75.9031 --75.8922 --75.9141 --75.9047 --75.9094 --75.8969 --75.9094 --75.9125 --75.9172 --75.9 --75.9125 --75.9 --75.9062 --75.9297 --75.8922 --75.9141 --75.9047 --75.9062 --75.9203 --75.9156 --75.9031 --75.9109 --75.9156 --75.9047 --75.9125 --75.9125 --75.9266 --75.9187 --75.9078 --75.9094 --75.9141 --75.9094 --75.9125 --75.9109 --75.9031 --75.9047 --75.9172 --75.9219 --75.9016 --75.9094 --75.9047 --75.9141 --75.9062 --75.9109 --75.9016 --75.9 --75.9047 --75.9047 --75.9297 --75.9125 --75.9203 --75.9078 --75.9187 --75.9141 --75.9 --75.9109 --75.9187 --75.9078 --75.9094 --75.925 --75.9172 --75.9203 --75.9234 --75.9031 --75.9219 --75.9125 --75.9125 --75.9156 --75.8891 --75.9047 --75.9094 --75.9031 --75.9062 --75.9203 --75.9031 --75.9219 --75.9141 --75.9125 --75.9156 --75.9078 --75.9297 --75.9078 --75.9078 --75.9156 --75.9219 --75.9203 --75.9203 --75.9203 --75.9156 --75.9062 --75.9109 --75.9203 --75.9078 --75.9109 --75.9031 --75.9094 --75.9078 --75.9187 --75.9078 --75.9078 --75.9047 --75.9031 --75.9047 --75.9219 --75.9078 --75.9156 --75.9141 --75.9187 --75.9047 --75.9141 --75.9094 --75.9219 --75.9281 --75.9203 --75.9313 --75.9297 --75.9187 --75.9297 --75.9266 --75.9109 --75.9234 --75.9281 --75.9156 --75.9141 --75.9156 --75.9094 --75.9234 --75.9219 --75.9313 --75.9422 --75.9109 --75.9109 --75.9172 --75.9062 --75.9297 --75.925 --75.9219 --75.9234 --75.925 --75.9203 --75.9203 --75.9203 --75.9187 --75.9203 --75.9203 --75.9297 --75.9156 --75.9187 --75.925 --75.925 --75.9187 --75.9266 --75.9359 --75.9203 --75.9141 --75.9047 --75.9219 --75.9078 --75.925 --75.9266 --75.9266 --75.9156 --75.9141 --75.9266 --75.9219 --75.9266 --75.9125 --75.9266 --75.9125 --75.9203 --75.9062 --75.9156 --75.9313 --75.9313 --75.9187 --75.9281 --75.9313 --75.9203 --75.9203 --75.9281 --75.9203 --75.9187 --75.9328 --75.9266 --75.925 --75.9187 --75.9156 --75.9234 --75.9172 --75.9172 --75.9187 --75.9281 --75.9203 --75.9156 --75.9219 --75.9172 --75.9156 --75.9172 --75.9234 --75.9062 --75.9141 --75.9187 --75.9094 --75.9125 --75.9141 --75.9156 --75.9156 --75.9125 --75.9203 --75.9094 --75.9156 --75.925 --75.9109 --75.9156 --75.9109 --75.9313 --75.9141 --75.9109 --75.9031 --75.9156 --75.9078 --75.9219 --75.9187 --75.9234 --75.9094 --75.9219 --75.9094 --75.9172 --75.8984 --75.9062 --75.9313 --75.9391 --75.9297 --75.9266 --75.9031 --75.9141 --75.9172 --75.9203 --75.9047 --75.9062 --75.8969 --75.9156 --75.9141 --75.9234 --75.9203 --75.9297 --75.925 --75.9313 --75.9375 --75.9219 --75.925 --75.9219 --75.9047 --75.9187 --75.9141 --75.9234 --75.9375 --75.9172 --75.9281 --75.9297 --75.9297 --75.9328 --75.9297 --75.925 --75.9141 --75.9172 --75.9031 --75.9031 --75.9203 --75.9031 --75.9156 --75.9156 --75.9141 --75.9219 --75.9297 --75.9219 --75.9281 --75.925 --75.9203 --75.9266 --75.9172 --75.9156 --75.9094 --75.9375 --75.9266 --75.9297 --75.925 --75.9094 --75.9203 --75.9094 --75.9156 --75.9141 --75.9047 --75.9234 --75.9109 --75.9187 --75.9156 --75.9281 --75.9125 --75.9109 --75.9281 --75.9266 --75.9172 --75.9141 --75.9109 --75.9203 --75.9125 --75.9187 --75.9156 --75.9266 --75.9187 --75.9125 --75.9187 --75.9297 --75.9219 --75.9187 --75.9047 --75.9344 --75.9234 --75.9344 --75.9187 --75.9297 --75.9141 --75.9141 --75.9203 --75.9313 --75.925 --75.9141 --75.9172 --75.9234 --75.9078 --75.9281 --75.9187 --75.9281 --75.9219 --75.9109 --75.9156 --75.9062 --75.9016 --75.9219 --75.9203 --75.925 --75.9156 --75.9156 --75.925 --75.925 --75.9141 --75.9125 --75.9125 --75.9156 --75.9094 --75.9047 --75.9078 --75.9234 --75.9031 --75.9266 --75.9141 --75.9094 --75.9219 --75.9297 --75.9297 --75.9203 --75.9187 --75.9219 --75.9172 --75.9078 --75.9125 --75.9234 --75.9141 --75.9141 --75.9203 --75.9234 --75.9141 --75.9156 --75.9156 --75.9281 --75.9141 --75.9203 --75.925 --75.9 --75.9219 --75.9281 --75.9172 --75.9109 --75.9125 --75.9219 --75.9031 --75.9141 --75.9391 --75.9031 --75.9172 --75.9078 --75.9109 --75.9187 --75.9 --75.9203 --75.9219 --75.9016 --75.9156 --75.9094 --75.9109 --75.9203 --75.9187 --75.9187 --75.9172 --75.9172 --75.9172 --75.9156 --75.9109 --75.9234 --75.9203 --75.9109 --75.9062 --75.9219 --75.9125 --75.9141 --75.9172 --75.8984 --75.9187 --75.9172 --75.9203 --75.9141 --75.9156 --75.9156 --75.9156 --75.9078 --75.9172 --75.9141 --75.8922 --75.9141 --75.9219 --75.9172 --75.9172 --75.9141 --75.9016 --75.9109 --75.9125 --75.9172 --75.9172 --75.9156 --75.9078 --75.9187 --75.9109 --75.9078 --75.9219 --75.9187 --75.9234 --75.9203 --75.9234 --75.9203 --75.9141 --75.9359 --75.9125 --75.9156 --75.9187 --75.9141 --75.9016 --75.9172 --75.9203 --75.925 --75.9313 --75.925 --75.9062 --75.9219 --75.9266 --75.9266 --75.9125 --75.9219 --75.925 --75.9156 --75.9125 --75.9234 --75.9125 --75.9219 --75.9266 --75.9203 --75.9234 --75.9125 --75.9187 --75.9266 --75.9156 --75.9281 --75.9125 --75.925 --75.9219 --75.9359 --75.9266 --75.9297 --75.9172 --75.9359 --75.9219 --75.9219 --75.9141 --75.9172 --75.9203 --75.9344 --75.925 --75.9141 --75.9109 --75.9078 --75.9203 --75.9172 --75.9266 --75.9219 --75.9328 --75.9156 --75.9187 --75.925 --75.925 --75.9141 --75.9297 --75.9156 --75.9203 --75.9234 --75.9313 --75.9344 --75.9187 --75.9172 --75.9219 --75.9078 --75.9187 --75.9172 --75.9281 --75.9297 --75.9203 --75.9281 --75.925 --75.9313 --75.9141 --75.9062 --75.9375 --75.9203 --75.9109 --75.9313 --75.9281 --75.9328 --75.925 --75.9156 --75.9297 --75.925 --75.9266 --75.9391 --75.9297 --75.9328 --75.9281 --75.9172 --75.9359 --75.9313 --75.9437 --75.9281 --75.9219 --75.9281 --75.9156 --75.925 --75.9281 --75.9313 --75.9078 --75.9016 --75.9219 --75.9266 --75.9297 --75.9187 --75.9234 --75.9078 --75.9172 --75.9219 --75.9156 --75.9156 --75.9172 --75.9203 --75.9172 --75.9109 --75.9125 --75.925 --75.9141 --75.9125 --75.9109 --75.9297 --75.9078 --75.9094 --75.9047 --75.9125 --75.9141 --75.9234 --75.9203 --75.9156 --75.9047 --75.9031 --75.9109 --75.9062 --75.9281 --75.9266 --75.9031 --75.9047 --75.9125 --75.9062 --75.9094 --75.9234 --75.9219 --75.9328 --75.9078 --75.9156 --75.9109 --75.9203 --75.9156 --75.9141 --75.9234 --75.9031 --75.9172 --75.9094 --75.9 --75.9125 --75.9234 --75.9125 --75.9156 --75.9172 --75.9156 --75.9234 --75.9031 --75.9078 --75.9172 --75.9156 --75.9219 --75.9156 --75.9141 --75.9062 --75.9078 --75.9141 --75.9 --75.9187 --75.9156 --75.9328 --75.9109 --75.9156 --75.9234 --75.9016 --75.9187 --75.9187 --75.9125 --75.9172 --75.9078 --75.9125 --75.9187 --75.9156 --75.9187 --75.925 --75.9313 --75.9187 --75.9109 --75.9141 --75.9313 --75.9187 --75.9219 --75.9234 --75.9203 --75.9297 --75.9313 --75.9187 --75.9219 --75.9187 --75.9172 --75.9094 --75.9187 --75.9234 --75.9172 --75.9109 --75.9172 --75.9078 --75.9219 --75.9203 --75.9187 --75.925 --75.9141 --75.9156 --75.9187 --75.9172 --75.9266 --75.9297 --75.9219 --75.9219 --75.9297 --75.9297 --75.9141 --75.9203 --75.9094 --75.925 --75.9047 --75.9156 --75.9219 --75.9281 --75.9219 --75.925 --75.9406 --75.9187 --75.9234 --75.9172 --75.9141 --75.9234 --75.9328 --75.9281 --75.9187 --75.9234 --75.9109 --75.9187 --75.9234 --75.9156 --75.9187 --75.9125 --75.9297 --75.9203 --75.9344 --75.9297 --75.9187 --75.925 --75.9328 --75.9313 --75.9359 --75.9297 --75.9187 --75.9219 --75.9359 --75.9359 --75.9281 --75.9344 --75.9266 --75.9344 --75.9359 --75.9344 --75.9266 --75.9234 --75.9297 --75.9328 --75.9313 --75.9266 --75.9469 --75.9422 --75.9313 --75.9375 --75.9313 --75.9437 --75.9406 --75.9375 --75.9297 --75.9422 --75.9359 --75.9484 --75.95 --75.9469 --75.9453 --75.9328 --75.9406 --75.9359 --75.9391 --75.9422 --75.9391 --75.9297 --75.9437 --75.9297 --75.9328 --75.9359 --75.95 --75.9281 --75.9422 --75.9359 --75.9281 --75.9313 --75.9406 --75.9531 --75.9313 --75.9313 --75.95 --75.9391 --75.9469 --75.9328 --75.9344 --75.9375 --75.9313 --75.9516 --75.9375 --75.9313 --75.9344 --75.9313 --75.9359 --75.9266 --75.9281 --75.925 --75.9172 --75.9313 --75.9344 --75.9344 --75.9219 --75.9313 --75.9297 --75.9266 --75.9313 --75.9281 --75.9297 --75.9359 --75.9219 --75.9375 --75.9375 --75.9422 --75.9375 --75.9359 --75.9375 --75.9297 --75.9297 --75.9266 --75.9313 --75.9313 --75.9219 --75.9344 --75.9281 --75.9375 --75.9375 --75.9203 --75.9297 --75.9391 --75.9281 --75.9453 --75.9344 --75.9297 --75.9219 --75.9172 --75.9422 --75.9125 --75.9281 --75.9281 --75.9266 --75.9359 --75.9219 --75.9187 --75.9328 --75.9266 --75.9297 --75.9313 --75.9531 --75.9344 --75.9281 --75.9328 --75.9313 --75.9328 --75.9453 --75.9234 --75.9406 --75.9266 --75.9297 --75.9344 --75.9141 --75.9281 --75.9219 --75.9187 --75.9234 --75.9172 --75.9219 --75.9203 --75.9375 --75.925 --75.925 --75.9313 --75.9219 --75.9141 --75.9219 --75.9313 --75.9328 --75.9375 --75.9234 --75.9281 --75.925 --75.925 --75.9297 --75.9219 --75.9313 --75.9313 --75.9328 --75.9297 --75.9391 --75.9219 --75.9187 --75.9375 --75.9391 --75.9406 --75.925 --75.9297 --75.9328 --75.925 --75.9375 --75.9313 --75.9422 --75.925 --75.9266 --75.9203 --75.9219 --75.9297 --75.9109 --75.9359 --75.9281 --75.9359 --75.9297 --75.9266 --75.9313 --75.925 --75.9266 --75.9297 --75.9203 --75.9266 --75.9313 --75.9344 --75.925 --75.925 --75.9156 --75.9219 --75.9313 --75.9297 --75.9156 --75.9219 --75.9359 --75.9359 --75.9234 --75.9328 --75.9172 --75.9297 --75.9359 --75.9234 --75.9172 --75.9109 --75.9109 --75.9297 --75.9313 --75.9297 --75.9359 --75.9234 --75.9328 --75.925 --75.9125 --75.9219 --75.9203 --75.9313 --75.925 --75.9187 --75.9281 --75.9281 --75.9266 --75.9172 --75.9141 --75.9328 --75.9344 --75.925 --75.9328 --75.925 --75.9313 --75.925 --75.9297 --75.925 --75.9203 --75.9203 --75.9219 --75.9313 --75.9172 --75.9266 --75.9234 --75.925 --75.9141 --75.9281 --75.9281 --75.9266 --75.9313 --75.9375 --75.9266 --75.9219 --75.9406 --75.9313 --75.9328 --75.95 --75.9437 --75.9344 --75.9391 --75.9344 --75.9437 --75.9437 --75.9375 --75.9437 --75.9281 --75.9516 --75.9469 --75.9266 --75.9391 --75.9281 --75.9359 --75.925 --75.9266 --75.9437 --75.9203 --75.9391 --75.9422 --75.925 --75.9313 --75.9406 --75.9391 --75.9266 --75.9281 --75.9266 --75.9219 --75.9203 --75.9281 --75.9172 --75.9219 --75.9375 --75.9344 --75.9109 --75.9172 --75.9281 --75.9203 --75.9141 --75.9344 --75.9266 --75.9219 --75.9141 --75.9313 --75.9219 --75.9156 --75.9234 --75.9313 --75.9172 --75.9406 --75.9375 --75.925 --75.9187 --75.9297 --75.9281 --75.9328 --75.9375 --75.9266 --75.9266 --75.9313 --75.9297 --75.9125 --75.9141 --75.9219 --75.9156 --75.9359 --75.9219 --75.9219 --75.9172 --75.925 --75.9469 --75.9375 --75.9313 --75.9375 --75.9406 --75.9266 --75.9234 --75.9281 --75.9219 --75.9375 --75.9094 --75.9141 --75.9281 --75.9328 --75.9359 --75.9234 --75.9281 --75.9453 --75.9219 --75.9313 --75.9344 --75.9234 --75.9187 --75.9187 --75.9375 --75.9297 --75.9375 --75.9344 --75.9234 --75.9281 --75.9344 --75.9266 --75.9234 --75.9281 --75.9359 --75.9281 --75.9187 --75.925 --75.9375 --75.9344 --75.9266 --75.9266 --75.9281 --75.9266 --75.9281 --75.9156 --75.9219 --75.9266 --75.9297 --75.9406 --75.9219 --75.9359 --75.9266 --75.9469 --75.9359 --75.9422 --75.9375 --75.9219 --75.9234 --75.9391 --75.9406 --75.9328 --75.9297 --75.9375 --75.9375 --75.9328 --75.925 --75.9375 --75.9281 --75.9266 --75.9422 --75.9234 --75.9234 --75.9266 --75.9453 --75.925 --75.9156 --75.9172 --75.9219 --75.9203 --75.9281 --75.9281 --75.9016 --75.9125 --75.9141 --75.9031 --75.9234 --75.9062 --75.9187 --75.9156 --75.9125 --75.925 --75.9109 --75.9219 --75.9234 --75.9187 --75.9047 --75.925 --75.9187 --75.925 --75.9344 --75.9094 --75.9125 --75.9219 --75.9266 --75.9172 --75.9125 --75.9234 --75.9406 --75.9219 --75.9359 --75.925 --75.9219 --75.9313 --75.9281 --75.9266 --75.9203 --75.9219 --75.9297 --75.9203 --75.9281 --75.925 --75.9266 --75.9313 --75.9437 --75.9266 --75.9359 --75.9328 --75.9375 --75.925 --75.9375 --75.9266 --75.9297 --75.9437 --75.9187 --75.9219 --75.9281 --75.9297 --75.9266 --75.9219 --75.9359 --75.9391 --75.9453 --75.9281 --75.9266 --75.9375 --75.9281 --75.9281 --75.9266 --75.9359 --75.9344 --75.9375 --75.9344 --75.9156 --75.9297 --75.9313 --75.9328 --75.9172 --75.9281 --75.9344 --75.925 --75.9203 --75.9266 --75.9313 --75.9297 --75.9313 --75.9203 --75.9266 --75.9281 --75.9234 --75.9297 --75.9172 --75.9391 --75.9313 --75.9281 --75.925 --75.9391 --75.9313 --75.9297 --75.9219 --75.9391 --75.9344 --75.9141 --75.9187 --75.9234 --75.9281 --75.9328 --75.9359 --75.9344 --75.9141 --75.925 --75.9219 --75.9297 --75.925 --75.9234 --75.9187 --75.9313 --75.9313 --75.9234 --75.9203 --75.9187 --75.9266 --75.9297 --75.9203 --75.9219 --75.9141 --75.9141 --75.9344 --75.9141 --75.9187 --75.9297 --75.9219 --75.9156 --75.9203 --75.9125 --75.9313 --75.9281 --75.9297 --75.9266 --75.9266 --75.9187 --75.9266 --75.925 --75.9391 --75.925 --75.9344 --75.9328 --75.9313 --75.9266 --75.9234 --75.9219 --75.9156 --75.9219 --75.9125 --75.9219 --75.9172 --75.9281 --75.9219 --75.9203 --75.9234 --75.9109 --75.9375 --75.9094 --75.9297 --75.9125 --75.925 --75.9187 --75.9234 --75.9109 --75.9109 --75.9281 --75.9172 --75.9391 --75.9156 --75.9281 --75.9172 --75.9187 --75.9219 --75.925 --75.9219 --75.9141 --75.9234 --75.9187 --75.9219 --75.9172 --75.9234 --75.9328 --75.925 --75.9219 --75.9219 --75.9297 --75.9156 --75.9031 --75.9203 --75.9141 --75.925 --75.9094 --75.9109 --75.9031 --75.9016 --75.9203 --75.9141 --75.9156 --75.925 --75.925 --75.9187 --75.9125 --75.9094 --75.925 --75.9156 --75.9219 --75.9219 --75.9219 --75.9297 --75.9234 --75.9125 --75.9266 --75.9156 --75.9109 --75.9125 --75.9156 --75.9203 --75.9203 --75.9094 --75.9203 --75.9078 --75.9281 --75.9219 --75.9203 --75.9203 --75.9203 --75.9234 --75.9172 --75.9172 --75.9156 --75.9234 --75.9109 --75.9234 --75.9172 --75.9031 --75.9062 --75.9062 --75.9156 --75.9187 --75.9031 --75.9078 --75.9156 --75.9141 --75.9219 --75.9234 --75.9281 --75.9297 --75.9094 --75.9219 --75.9062 --75.9156 --75.9313 --75.9078 --75.9203 --75.9094 --75.9187 --75.9281 --75.8984 --75.9141 --75.9109 --75.9094 --75.9187 --75.9141 --75.9219 --75.9156 --75.8984 --75.9078 --75.9141 --75.9047 --75.9094 --75.9094 --75.9203 --75.9016 --75.9047 --75.9187 --75.9016 --75.9062 --75.9141 --75.9172 --75.9078 --75.9094 --75.9062 --75.9234 --75.9172 --75.9031 --75.9187 --75.9344 --75.9187 --75.9281 --75.9156 --75.9187 --75.9203 --75.9203 --75.9172 --75.9109 --75.9187 --75.9172 --75.9203 --75.9156 --75.925 --75.9203 --75.9281 --75.9156 --75.9156 --75.9219 --75.9187 --75.9313 --75.9234 --75.9141 --75.9094 --75.925 --75.9203 --75.9156 --75.9203 --75.9172 --75.9031 --75.9187 --75.9203 --75.9203 --75.9219 --75.9187 --75.9281 --75.9172 --75.9141 --75.9187 --75.9187 --75.9297 --75.9281 --75.9391 --75.9328 --75.9156 --75.9172 --75.9125 --75.9219 --75.9281 --75.9203 --75.9156 --75.9172 --75.9281 --75.9219 --75.9156 --75.9266 --75.9016 --75.9219 --75.9281 --75.9172 --75.9203 --75.9266 --75.9234 --75.9359 --75.9297 --75.9297 --75.9313 --75.9313 --75.9359 --75.9328 --75.9234 --75.925 --75.9266 --75.9234 --75.9187 --75.9172 --75.9187 --75.9203 --75.9125 --75.9156 --75.9187 --75.9078 --75.9172 --75.9156 --75.925 --75.9219 --75.9094 --75.9203 --75.9187 --75.9172 --75.9187 --75.9187 --75.9234 --75.9219 --75.9203 --75.9109 --75.9141 --75.9094 --75.9078 --75.9234 --75.9187 --75.9062 --75.9266 --75.9172 --75.9266 --75.9156 --75.9281 --75.9109 --75.9062 --75.9062 --75.9219 --75.9172 --75.925 --75.9281 --75.9203 --75.9281 --75.9266 --75.9313 --75.9281 --75.9313 --75.9156 --75.9234 --75.9109 --75.9078 --75.9156 --75.9219 --75.9203 --75.9109 --75.9297 --75.9078 --75.9313 --75.9328 --75.9187 --75.9281 --75.925 --75.9266 --75.9281 --75.9156 --75.9187 --75.9219 --75.9266 --75.9203 --75.9234 --75.9281 --75.9203 --75.9313 --75.9234 --75.9172 --75.9359 --75.9266 --75.9203 --75.9219 --75.9141 --75.9219 --75.9203 --75.9203 --75.9281 --75.9156 --75.9156 --75.9281 --75.9141 --75.9094 --75.9391 --75.9141 --75.9281 --75.9281 --75.9125 --75.9266 --75.9203 --75.9156 --75.9313 --75.9094 --75.9062 --75.9187 --75.9203 --75.9078 --75.9234 --75.9031 --75.9375 --75.9219 --75.9219 --75.9156 --75.9344 --75.9187 --75.9172 --75.9141 --75.9359 --75.9047 --75.9187 --75.9187 --75.9203 --75.9344 --75.9281 --75.9219 --75.9203 --75.9187 --75.9219 --75.9344 --75.9219 --75.9266 --75.9281 --75.9172 --75.9047 --75.9141 --75.9109 --75.9062 --75.9187 --75.9219 --75.9172 --75.9016 --75.9016 --75.9187 --75.9156 --75.9141 --75.9156 --75.9172 --75.9187 --75.9172 --75.9125 --75.9141 --75.9187 --75.9062 --75.9141 --75.9203 --75.9141 --75.9109 --75.9219 --75.9187 --75.9172 --75.9156 --75.9125 --75.9219 --75.9234 --75.9297 --75.9031 --75.9203 --75.9234 --75.9234 --75.9016 --75.9078 --75.9172 --75.9203 --75.9234 --75.9047 --75.9203 --75.9062 --75.9109 --75.9172 --75.9109 --75.9156 --75.9172 --75.9 --75.9 --75.9109 --75.9125 --75.9187 --75.9297 --75.9109 --75.9203 --75.9141 --75.9141 --75.9328 --75.9203 --75.9156 --75.9219 --75.9125 --75.9156 --75.9187 --75.9156 --75.9125 --75.9141 --75.9219 --75.9156 --75.9359 --75.9078 --75.9313 --75.9109 --75.9078 --75.9203 --75.9313 --75.9266 --75.9313 --75.9062 --75.9109 --75.9266 --75.9125 --75.9234 --75.9187 --75.9156 --75.9281 --75.9266 --75.9109 --75.925 --75.9125 --75.9313 --75.9172 --75.9062 --75.9141 --75.925 --75.9219 --75.925 --75.9156 --75.9375 --75.9266 --75.9203 --75.9125 --75.9109 --75.9078 --75.9062 --75.9156 --75.9203 --75.9187 --75.9125 --75.9125 --75.9172 --75.9047 --75.9141 --75.9141 --75.9172 --75.9078 --75.9109 --75.9109 --75.9078 --75.9141 --75.9172 --75.9297 --75.9219 --75.9109 --75.9234 --75.9187 --75.9297 --75.9266 --75.9234 --75.9219 --75.9141 --75.9172 --75.9344 --75.9328 --75.9297 --75.9297 --75.9203 --75.9172 --75.9172 --75.9313 --75.9313 --75.9234 --75.925 --75.9141 --75.9141 --75.9187 --75.9297 --75.9156 --75.9313 --75.9344 --75.9219 --75.925 --75.9219 --75.9047 --75.9125 --75.9203 --75.9141 --75.925 --75.9406 --75.9297 --75.9313 --75.9219 --75.9172 --75.9375 --75.9187 --75.9187 --75.9031 --75.9172 --75.9391 --75.9297 --75.9297 --75.9078 --75.9187 --75.9203 --75.9344 --75.9203 --75.9281 --75.925 --75.9156 --75.9187 --75.9219 --75.9047 --75.9297 --75.9219 --75.9328 --75.9234 --75.9141 --75.9281 --75.9125 --75.9344 --75.925 --75.9266 --75.9187 --75.9172 --75.9328 --75.9094 --75.9156 --75.9281 --75.9219 --75.9297 --75.9203 --75.9234 --75.9203 --75.9359 --75.9125 --75.9172 --75.8938 --75.9203 --75.9109 --75.9281 --75.9078 --75.9062 --75.9172 --75.9203 --75.9187 --75.9281 --75.9172 --75.9234 --75.9234 --75.9187 --75.9187 --75.9266 --75.9422 --75.9125 --75.9297 --75.9172 --75.9203 --75.9344 --75.9187 --75.9203 --75.9125 --75.9203 --75.9172 --75.9172 --75.9109 --75.9187 --75.9125 --75.9156 --75.9328 --75.9109 --75.9109 --75.9 --75.9156 --75.9047 --75.9109 --75.9062 --75.9078 --75.9172 --75.9047 --75.9 --75.9125 --75.9016 --75.9172 --75.9062 --75.8984 --75.9094 --75.9047 --75.9 --75.9125 --75.9125 --75.8984 --75.9016 --75.9125 --75.9125 --75.9031 --75.9047 --75.9016 --75.9141 --75.9281 --75.9078 --75.9125 --75.9156 --75.9125 --75.9031 --75.9094 --75.925 --75.9172 --75.9078 --75.9062 --75.8984 --75.9219 --75.9109 --75.9125 --75.9125 --75.9031 --75.9187 --75.9141 --75.9141 --75.9203 --75.9156 --75.9187 --75.9219 --75.9109 --75.9016 --75.9078 --75.9156 --75.9281 --75.9125 --75.9219 --75.9219 --75.9234 --75.9187 --75.925 --75.9187 --75.9203 --75.9125 --75.9125 --75.9094 --75.9109 --75.9156 --75.925 --75.9219 --75.9187 --75.9203 --75.9141 --75.9156 --75.9125 --75.9203 --75.925 --75.9187 --75.9172 --75.9297 --75.9172 --75.9203 --75.9078 --75.9094 --75.9203 --75.9297 --75.9234 --75.9141 --75.9094 --75.9172 --75.9141 --75.9062 --75.9141 --75.9078 --75.9078 --75.9203 --75.9094 --75.9047 --75.9172 --75.9187 --75.9172 --75.9266 --75.9078 --75.9031 --75.9203 --75.9203 --75.9187 --75.9156 --75.9156 --75.9141 --75.9141 --75.925 --75.9422 --75.9219 --75.9172 --75.9313 --75.9234 --75.9187 --75.9109 --75.9234 --75.9281 --75.9141 --75.9266 --75.9234 --75.9125 --75.9172 --75.9109 --75.9219 --75.9047 --75.9062 --75.9219 --75.9078 --75.9156 --75.9125 --75.9156 --75.925 --75.9156 --75.9078 --75.9172 --75.8984 --75.9078 --75.9062 --75.8969 --75.9078 --75.8969 --75.9141 --75.9016 --75.9078 --75.9172 --75.9062 --75.9062 --75.9062 --75.9109 --75.9156 --75.9156 --75.9156 --75.8969 --75.9297 --75.9094 --75.9125 --75.9125 --75.9047 --75.9078 --75.9172 --75.9141 --75.9109 --75.9172 --75.9078 --75.9031 --75.9047 --75.9094 --75.9141 --75.9109 --75.8938 --75.9016 --75.9187 --75.9094 --75.925 --75.9156 --75.8922 --75.9141 --75.9156 --75.9156 --75.9078 --75.9109 --75.9141 --75.9094 --75.9141 --75.9047 --75.9016 --75.9109 --75.9094 --75.8922 --75.9 --75.9078 --75.8906 --75.9031 --75.9094 --75.9047 --75.9047 --75.9078 --75.8906 --75.9047 --75.9016 --75.9078 --75.8984 --75.8984 --75.9078 --75.9094 --75.9078 --75.9 --75.9094 --75.8844 --75.8938 --75.8922 --75.9031 --75.8984 --75.9094 --75.9078 --75.9172 --75.9266 --75.8891 --75.9062 --75.8969 --75.8969 --75.9016 --75.9016 --75.9 --75.8984 --75.8906 --75.8875 --75.8922 --75.8906 --75.9109 --75.8875 --75.8984 --75.8922 --75.8922 --75.8922 --75.8953 --75.9062 --75.8828 --75.9 --75.8906 --75.8984 --75.8938 --75.9031 --75.8938 --75.8953 --75.9047 --75.9062 --75.8891 --75.9062 --75.9016 --75.8906 --75.9047 --75.8969 --75.9 --75.9109 --75.9047 --75.9031 --75.9016 --75.9125 --75.9047 --75.9187 --75.9047 --75.9031 --75.8953 --75.8984 --75.9 --75.9062 --75.8953 --75.8906 --75.9 --75.8844 --75.8891 --75.8922 --75.8938 --75.8766 --75.8859 --75.9016 --75.8922 --75.8969 --75.8922 --75.9016 --75.8703 --75.8938 --75.9062 --75.8984 --75.8922 --75.8938 --75.9109 --75.8953 --75.8891 --75.9047 --75.8906 --75.9 --75.8812 --75.8953 --75.9078 --75.8828 --75.9 --75.9047 --75.9125 --75.8938 --75.9125 --75.9109 --75.8969 --75.8922 --75.9031 --75.9109 --75.8984 --75.9047 --75.9016 --75.9141 --75.8906 --75.9078 --75.9094 --75.8953 --75.8969 --75.9172 --75.9109 --75.9078 --75.9094 --75.9047 --75.9172 --75.9062 --75.9094 --75.9031 --75.8969 --75.9 --75.8984 --75.9078 --75.8969 --75.9109 --75.8969 --75.8922 --75.9016 --75.9047 --75.9078 --75.8969 --75.8984 --75.9 --75.9078 --75.9016 --75.9062 --75.9031 --75.9031 --75.9109 --75.9016 --75.9094 --75.8984 --75.9016 --75.8812 --75.8969 --75.9016 --75.9016 --75.8938 --75.8969 --75.8906 --75.8844 --75.8984 --75.9125 --75.9078 --75.8969 --75.8891 --75.9016 --75.8875 --75.8922 --75.9016 --75.9047 --75.9 --75.8938 --75.8922 --75.875 --75.8875 --75.8922 --75.8891 --75.8969 --75.8938 --75.8891 --75.8984 --75.9078 --75.9 --75.8922 --75.8922 --75.8891 --75.8953 --75.8922 --75.8969 --75.8922 --75.8766 --75.9047 --75.9047 --75.9078 --75.8984 --75.9016 --75.9094 --75.9094 --75.9062 --75.9094 --75.8797 --75.9078 --75.9141 --75.9 --75.8969 --75.9047 --75.8875 --75.8844 --75.9047 --75.8953 --75.8969 --75.8906 --75.8953 --75.9062 --75.9062 --75.8969 --75.9047 --75.9125 --75.9141 --75.9047 --75.9109 --75.9094 --75.9078 --75.9094 --75.9156 --75.9203 --75.9031 --75.9109 --75.9125 --75.9094 --75.9 --75.9125 --75.9156 --75.8969 --75.8984 --75.8938 --75.9 --75.9 --75.9078 --75.9156 --75.9016 --75.9141 --75.9203 --75.9062 --75.8969 --75.9047 --75.9094 --75.9156 --75.9156 --75.9094 --75.8922 --75.9016 --75.9 --75.9047 --75.8938 --75.9031 --75.8984 --75.9078 --75.9016 --75.8891 --75.9062 --75.9172 --75.8922 --75.8969 --75.8938 --75.8938 --75.8953 --75.9 --75.9094 --75.9094 --75.8969 --75.8984 --75.8953 --75.9 --75.9047 --75.9047 --75.8938 --75.8891 --75.9047 --75.8984 --75.9016 --75.8969 --75.9031 --75.9094 --75.9031 --75.9078 --75.8984 --75.8984 --75.9016 --75.9125 --75.9 --75.8875 --75.8891 --75.9109 --75.8844 --75.9094 --75.8953 --75.8953 --75.9062 --75.9 --75.9078 --75.9016 --75.9109 --75.9078 --75.9156 --75.9078 --75.9156 --75.9109 --75.9156 --75.9094 --75.9125 --75.9031 --75.9172 --75.9187 --75.9109 --75.9125 --75.9109 --75.9 --75.9047 --75.9078 --75.9094 --75.9047 --75.9078 --75.8953 --75.9187 --75.9016 --75.9062 --75.8938 --75.9047 --75.9219 --75.9016 --75.9203 --75.9141 --75.8953 --75.9062 --75.9172 --75.9141 --75.9109 --75.9234 --75.9047 --75.9141 --75.9156 --75.9016 --75.9203 --75.9125 --75.9109 --75.9219 --75.9219 --75.9187 --75.9047 --75.9078 --75.9078 --75.9031 --75.9094 --75.9078 --75.9109 --75.9156 --75.9125 --75.9109 --75.9109 --75.9094 --75.9109 --75.925 --75.9094 --75.9141 --75.9078 --75.9297 --75.9234 --75.9156 --75.9156 --75.9094 --75.9062 --75.9062 --75.9156 --75.9156 --75.9062 --75.9031 --75.9078 --75.9125 --75.9141 --75.9 --75.9094 --75.9187 --75.9187 --75.9094 --75.8984 --75.8984 --75.9078 --75.9031 --75.9047 --75.8953 --75.8891 --75.9016 --75.9047 --75.9 --75.8969 --75.8906 --75.9062 --75.9062 --75.8984 --75.9094 --75.9031 --75.9031 --75.9078 --75.9 --75.8953 --75.8984 --75.8969 --75.9062 --75.9 --75.8938 --75.8844 --75.8984 --75.8938 --75.8922 --75.8859 --75.8969 --75.9141 --75.8953 --75.9 --75.8953 --75.8938 --75.8953 --75.8938 --75.9078 --75.8953 --75.9094 --75.9047 --75.8953 --75.9094 --75.9031 --75.9031 --75.9078 --75.9156 --75.9094 --75.9 --75.9219 --75.9094 --75.9234 --75.9203 --75.9031 --75.8938 --75.9031 --75.8938 --75.8984 --75.9125 --75.9031 --75.9062 --75.9047 --75.8969 --75.8938 --75.9141 --75.9125 --75.9016 --75.9062 --75.8969 --75.9109 --75.8938 --75.9141 --75.9125 --75.9187 --75.9016 --75.9016 --75.9094 --75.9062 --75.8938 --75.9 --75.9031 --75.9156 --75.9125 --75.9094 --75.9047 --75.9047 --75.9156 --75.9031 --75.9172 --75.9094 --75.9094 --75.9062 --75.9203 --75.9109 --75.9094 --75.9 --75.9109 --75.9062 --75.9187 --75.8922 --75.9125 --75.9109 --75.9094 --75.9 --75.8938 --75.9016 --75.9062 --75.9172 --75.9016 --75.9203 --75.9109 --75.9062 --75.9047 --75.9109 --75.9094 --75.9016 --75.8844 --75.8906 --75.9078 --75.8906 --75.9062 --75.9031 --75.9109 --75.9 --75.9109 --75.9125 --75.9 --75.8922 --75.9016 --75.8984 --75.9016 --75.8969 --75.9078 --75.9031 --75.9281 --75.9078 --75.9172 --75.8922 --75.8984 --75.9062 --75.8953 --75.9062 --75.8984 --75.9094 --75.9062 --75.8922 --75.9047 --75.9031 --75.9078 --75.9031 --75.9062 --75.8906 --75.9016 --75.9031 --75.9016 --75.9016 --75.9031 --75.9 --75.8906 --75.9125 --75.9094 --75.9047 --75.9172 --75.9062 --75.8938 --75.9047 --75.9047 --75.8812 --75.8984 --75.9062 --75.9109 --75.9016 --75.8922 --75.9078 --75.8969 --75.9062 --75.9016 --75.8969 --75.8953 --75.9 --75.8984 --75.9016 --75.8984 --75.8891 --75.9047 --75.8969 --75.8922 --75.9047 --75.8953 --75.9094 --75.8969 --75.9219 --75.9125 --75.9016 --75.9109 --75.9172 --75.9078 --75.9141 --75.9094 --75.9094 --75.8969 --75.9047 --75.9094 --75.9109 --75.9031 --75.9 --75.9016 --75.9062 --75.8984 --75.8984 --75.8953 --75.8984 --75.8891 --75.9109 --75.9016 --75.9047 --75.9 --75.9062 --75.8938 --75.9062 --75.9016 --75.8906 --75.9062 --75.9 --75.8984 --75.9031 --75.8922 --75.8844 --75.9016 --75.9031 --75.8953 --75.9 --75.9141 --75.8984 --75.9078 --75.8953 --75.8969 --75.9047 --75.8953 --75.8953 --75.8953 --75.9125 --75.8891 --75.8969 --75.8922 --75.9 --75.8922 --75.8984 --75.8828 --75.8891 --75.8938 --75.8953 --75.9156 --75.8969 --75.8984 --75.9047 --75.8922 --75.8938 --75.9094 --75.9078 --75.8922 --75.8875 --75.9 --75.9016 --75.9016 --75.8969 --75.9094 --75.8969 --75.9078 --75.9078 --75.8953 --75.9 --75.9031 --75.9 --75.8969 --75.9047 --75.9141 --75.9031 --75.8906 --75.9141 --75.8938 --75.9016 --75.8938 --75.8969 --75.8953 --75.8953 --75.8922 --75.9062 --75.8938 --75.9094 --75.9047 --75.9047 --75.9047 --75.9 --75.9109 --75.9125 --75.9125 --75.9 --75.9047 --75.9031 --75.9109 --75.9031 --75.9109 --75.9062 --75.9156 --75.9156 --75.9281 --75.9062 --75.9 --75.9141 --75.9141 --75.9156 --75.9078 --75.9172 --75.925 --75.9281 --75.9141 --75.925 --75.9172 --75.9172 --75.9172 --75.9031 --75.9172 --75.9047 --75.9141 --75.9109 --75.9156 --75.9141 --75.9109 --75.9141 --75.9219 --75.9 --75.8969 --75.9156 --75.9047 --75.9094 --75.9141 --75.9062 --75.9047 --75.9016 --75.8984 --75.9141 --75.9016 --75.9203 --75.9156 --75.9109 --75.9094 --75.9094 --75.9109 --75.9031 --75.9031 --75.9078 --75.9016 --75.9125 --75.9141 --75.8984 --75.9031 --75.8984 --75.9016 --75.9156 --75.9031 --75.9062 --75.9203 --75.9 --75.9297 --75.9094 --75.9234 --75.9078 --75.9125 --75.9203 --75.9125 --75.9094 --75.9187 --75.9125 --75.9219 --75.9156 --75.9187 --75.9094 --75.9203 --75.9094 --75.9141 --75.9141 --75.9078 --75.9 --75.8953 --75.9062 --75.8969 --75.8906 --75.9016 --75.9094 --75.8953 --75.8875 --75.8984 --75.9141 --75.8953 --75.9031 --75.9125 --75.9047 --75.9016 --75.8953 --75.9047 --75.9094 --75.9141 --75.8984 --75.9141 --75.9 --75.9031 --75.9047 --75.9031 --75.9125 --75.9125 --75.8922 --75.9141 --75.9047 --75.9109 --75.9016 --75.9141 --75.9031 --75.9109 --75.8953 --75.9047 --75.9125 --75.9062 --75.8938 --75.9031 --75.9031 --75.9047 --75.8938 --75.9078 --75.9047 --75.9047 --75.9125 --75.9156 --75.9078 --75.9047 --75.8969 --75.9047 --75.9 --75.8984 --75.9125 --75.9109 --75.9125 --75.9094 --75.9125 --75.9156 --75.9125 --75.9219 --75.9156 --75.9125 --75.9203 --75.9062 --75.9016 --75.9031 --75.9016 --75.9062 --75.9047 --75.9016 --75.9047 --75.8938 --75.8953 --75.9062 --75.9125 --75.9109 --75.9125 --75.8984 --75.9 --75.9141 --75.9141 --75.9203 --75.9109 --75.9016 --75.9047 --75.9078 --75.9062 --75.8984 --75.9094 --75.8984 --75.9094 --75.9156 --75.8953 --75.8953 --75.9172 --75.9125 --75.9172 --75.9234 --75.9016 --75.9141 --75.9125 --75.9094 --75.9234 --75.9062 --75.9156 --75.9125 --75.8875 --75.8984 --75.8938 --75.9109 --75.8969 --75.9109 --75.9016 --75.8938 --75.8984 --75.8938 --75.9062 --75.8953 --75.8828 --75.9047 --75.8969 --75.9 --75.9141 --75.9078 --75.9047 --75.8891 --75.9109 --75.9047 --75.9016 --75.9 --75.8938 --75.9156 --75.9 --75.9094 --75.9031 --75.8875 --75.8922 --75.8984 --75.9031 --75.9047 --75.9125 --75.9031 --75.9016 --75.8906 --75.9109 --75.8812 --75.8953 --75.8922 --75.9047 --75.9031 --75.8812 --75.8984 --75.8969 --75.8844 --75.8969 --75.8938 --75.9047 --75.8969 --75.9 --75.9031 --75.9094 --75.9062 --75.9 --75.8953 --75.9047 --75.9 --75.8953 --75.8938 --75.9031 --75.9062 --75.9109 --75.8984 --75.8984 --75.9047 --75.9031 --75.8938 --75.9062 --75.8953 --75.9047 --75.9 --75.8938 --75.8906 --75.9109 --75.9047 --75.9016 --75.9125 --75.9 --75.9125 --75.9094 --75.8969 --75.9031 --75.9016 --75.9078 --75.9078 --75.8969 --75.8953 --75.8859 --75.8938 --75.9062 --75.9047 --75.9016 --75.8859 --75.9062 --75.8953 --75.9078 --75.9094 --75.8938 --75.9016 --75.9203 --75.8891 --75.8984 --75.8953 --75.8938 --75.9047 --75.9047 --75.9 --75.8922 --75.8969 --75.9047 --75.8938 --75.9094 --75.8938 --75.9031 --75.8844 --75.8984 --75.8844 --75.8922 --75.8969 --75.9016 --75.9031 --75.8953 --75.8922 --75.9109 --75.8938 --75.9 --75.8953 --75.9047 --75.8938 --75.8922 --75.8844 --75.9 --75.8891 --75.8953 --75.8891 --75.8922 --75.9047 --75.8953 --75.9 --75.9031 --75.9078 --75.9156 --75.8922 --75.8984 --75.9016 --75.8938 --75.9 --75.8938 --75.9062 --75.8906 --75.8969 --75.8984 --75.8922 --75.8969 --75.9016 --75.9078 --75.8938 --75.8938 --75.9094 --75.9 --75.8875 --75.9016 --75.8938 --75.9016 --75.8969 --75.9078 --75.9031 --75.8984 --75.9047 --75.9 --75.9078 --75.9 --75.8984 --75.9031 --75.9203 --75.9047 --75.9062 --75.8953 --75.9047 --75.9187 --75.9187 --75.9062 --75.9047 --75.9078 --75.9 --75.8922 --75.9016 --75.9016 --75.9016 --75.9 --75.9016 --75.8984 --75.9 --75.9125 --75.8906 --75.9 --75.8953 --75.8875 --75.9141 --75.8969 --75.9109 --75.8938 --75.9 --75.9016 --75.9016 --75.8875 --75.9016 --75.9 --75.9 --75.8984 --75.9 --75.8953 --75.9016 --75.9016 --75.9078 --75.9 --75.9094 --75.9094 --75.9062 --75.8953 --75.9062 --75.8969 --75.8859 --75.9109 --75.8984 --75.9031 --75.9031 --75.8938 --75.8781 --75.8938 --75.9078 --75.8906 --75.8969 --75.8938 --75.8875 --75.8984 --75.8969 --75.8891 --75.9016 --75.9047 --75.9094 --75.8891 --75.9125 --75.9062 --75.9094 --75.9125 --75.9031 --75.9141 --75.9016 --75.9094 --75.9094 --75.9094 --75.9 --75.8922 --75.9141 --75.9 --75.8906 --75.8984 --75.9062 --75.9062 --75.9125 --75.9 --75.9047 --75.9016 --75.9109 --75.8891 --75.8953 --75.8922 --75.9094 --75.8969 --75.9094 --75.9156 --75.9109 --75.9 --75.9031 --75.9078 --75.9125 --75.9094 --75.9125 --75.9078 --75.9125 --75.9078 --75.9062 --75.9125 --75.9016 --75.8938 --75.9016 --75.9219 --75.9062 --75.9094 --75.9187 --75.8953 --75.9 --75.9062 --75.9016 --75.9094 --75.8969 --75.9156 --75.9016 --75.9031 --75.9031 --75.9062 --75.9047 --75.9062 --75.9109 --75.8984 --75.9062 --75.9047 --75.8969 --75.8922 --75.9016 --75.9125 --75.8953 --75.8953 --75.8969 --75.9109 --75.8984 --75.9062 --75.9031 --75.9047 --75.9031 --75.8969 --75.9094 --75.9031 --75.9109 --75.8938 --75.8984 --75.9156 --75.9078 --75.9078 --75.8859 --75.8859 --75.8891 --75.9 --75.9016 --75.9 --75.8984 --75.8812 --75.8906 --75.9016 --75.9 --75.8922 --75.9031 --75.9078 --75.9 --75.9047 --75.9031 --75.9 --75.9062 --75.9125 --75.9 --75.8969 --75.8953 --75.8859 --75.9016 --75.8859 --75.8922 --75.8938 --75.8984 --75.8953 --75.8969 --75.8953 --75.8906 --75.8953 --75.8984 --75.9 --75.8938 --75.8969 --75.8859 --75.9078 --75.9187 --75.9062 --75.9156 --75.9016 --75.8984 --75.9047 --75.9062 --75.8953 --75.8969 --75.9031 --75.9047 --75.9078 --75.9031 --75.9047 --75.9109 --75.9047 --75.8969 --75.8984 --75.9031 --75.9031 --75.9016 --75.9016 --75.8922 --75.9016 --75.9047 --75.9047 --75.9109 --75.9047 --75.9078 --75.9 --75.9094 --75.9141 --75.9234 --75.9109 --75.9094 --75.9047 --75.9078 --75.9047 --75.9078 --75.9031 --75.9094 --75.8969 --75.9141 --75.9172 --75.9141 --75.9016 --75.8812 --75.8969 --75.9016 --75.8906 --75.9047 --75.8922 --75.9078 --75.8844 --75.9031 --75.9016 --75.9 --75.9016 --75.8953 --75.9078 --75.8984 --75.8891 --75.9109 --75.8984 --75.9078 --75.8859 --75.9031 --75.8875 --75.8875 --75.8844 --75.8906 --75.8906 --75.8906 --75.8906 --75.8891 --75.8938 --75.8953 --75.8859 --75.8953 --75.8859 --75.8969 --75.9 --75.8938 --75.8875 --75.9047 --75.8891 --75.8969 --75.9062 --75.9016 --75.9031 --75.9047 --75.9031 --75.9172 --75.8844 --75.9047 --75.8891 --75.8984 --75.8938 --75.8828 --75.8844 --75.8828 --75.8906 --75.8969 --75.8859 --75.8797 --75.8969 --75.8906 --75.8906 --75.9 --75.8969 --75.8844 --75.8812 --75.8891 --75.8891 --75.8875 --75.8969 --75.8891 --75.8969 --75.9062 --75.9016 --75.8953 --75.9 --75.8953 --75.9 --75.9094 --75.8953 --75.8938 --75.9016 --75.9 --75.9 --75.8938 --75.8875 --75.9047 --75.9031 --75.9062 --75.9078 --75.8969 --75.9109 --75.8984 --75.8953 --75.9 --75.9031 --75.9109 --75.8844 --75.8906 --75.8984 --75.8875 --75.8953 --75.8984 --75.9 --75.8953 --75.9094 --75.8938 --75.9031 --75.8938 --75.9047 --75.9 --75.8922 --75.9172 --75.9016 --75.9016 --75.9 --75.9094 --75.9109 --75.9062 --75.9016 --75.8953 --75.9062 --75.9094 --75.9266 --75.9109 --75.8953 --75.9047 --75.9062 --75.8875 --75.9 --75.9078 --75.9125 --75.8969 --75.8969 --75.9062 --75.9094 --75.8891 --75.8938 --75.8938 --75.9094 --75.8844 --75.8906 --75.8953 --75.9 --75.9078 --75.9016 --75.9016 --75.9109 --75.8922 --75.9109 --75.9031 --75.9078 --75.9016 --75.9078 --75.8984 --75.9078 --75.9016 --75.9078 --75.8938 --75.9078 --75.8984 --75.8938 --75.8938 --75.8922 --75.9 --75.8875 --75.9 --75.8922 --75.8859 --75.9109 --75.9047 --75.8984 --75.8953 --75.8984 --75.8844 --75.8938 --75.8953 --75.8938 --75.8844 --75.9094 --75.8859 --75.9125 --75.8906 --75.8906 --75.8969 --75.9016 --75.8953 --75.8906 --75.9047 --75.8938 --75.8953 --75.9125 --75.8938 --75.9031 --75.8938 --75.9016 --75.9094 --75.9031 --75.9031 --75.9031 --75.9062 --75.9156 --75.9125 --75.9 --75.9062 --75.8984 --75.9047 --75.9094 --75.9234 --75.9031 --75.9016 --75.9141 --75.9062 --75.8906 --75.8969 --75.8938 --75.9062 --75.8969 --75.9047 --75.8906 --75.9078 --75.9094 --75.8984 --75.9125 --75.9266 --75.9109 --75.8969 --75.8938 --75.9234 --75.9016 --75.9047 --75.8953 --75.9141 --75.9062 --75.9 --75.8969 --75.8984 --75.8875 --75.8906 --75.8891 --75.8906 --75.8906 --75.8891 --75.8906 --75.8844 --75.9 --75.9172 --75.8922 --75.8953 --75.9031 --75.9094 --75.9047 --75.9016 --75.8922 --75.9031 --75.8969 --75.9 --75.8969 --75.9062 --75.9016 --75.9031 --75.8844 --75.9031 --75.8953 --75.8906 --75.8906 --75.8922 --75.8906 --75.9 --75.8938 --75.8891 --75.8938 --75.9 --75.9031 --75.9047 --75.8984 --75.8969 --75.9031 --75.9031 --75.8938 --75.9016 --75.9031 --75.8984 --75.9125 --75.9109 --75.9031 --75.8984 --75.8984 --75.9016 --75.9047 --75.9 --75.9 --75.8938 --75.8984 --75.8953 --75.8953 --75.9203 --75.8969 --75.8953 --75.9016 --75.9078 --75.9109 --75.8984 --75.8875 --75.9109 --75.9047 --75.8891 --75.9094 --75.9031 --75.8922 --75.8953 --75.8984 --75.9156 --75.8953 --75.8953 --75.8922 --75.8984 --75.8969 --75.8891 --75.8922 --75.8922 --75.8922 --75.8781 --75.8969 --75.8891 --75.9078 --75.8938 --75.9031 --75.9078 --75.8984 --75.9016 --75.9016 --75.9047 --75.9 --75.9187 --75.8984 --75.8969 --75.8969 --75.9 --75.9031 --75.8891 --75.8906 --75.8984 --75.8984 --75.8922 --75.8969 --75.8953 --75.9078 --75.9016 --75.8875 --75.8828 --75.8984 --75.8906 --75.8906 --75.8906 --75.8875 --75.8938 --75.8906 --75.8781 --75.8922 --75.8891 --75.9031 --75.8828 --75.8844 --75.8969 --75.9078 --75.8984 --75.9 --75.8922 --75.9031 --75.9 --75.9 --75.9109 --75.8922 --75.8969 --75.9109 --75.9 --75.9141 --75.9016 --75.9094 --75.9094 --75.9094 --75.9141 --75.9047 --75.9109 --75.9 --75.9141 --75.8891 --75.9062 --75.9078 --75.9016 --75.9047 --75.9062 --75.9187 --75.9141 --75.9094 --75.9156 --75.9 --75.9078 --75.9125 --75.9031 --75.9203 --75.9187 --75.9141 --75.9125 --75.9047 --75.9031 --75.8969 --75.9062 --75.9094 --75.9094 --75.9062 --75.9031 --75.9047 --75.9 --75.9078 --75.9062 --75.9062 --75.9 --75.9047 --75.9047 --75.9078 --75.9047 --75.9094 --75.9062 --75.8906 --75.8953 --75.9094 --75.8938 --75.8938 --75.8922 --75.8906 --75.9 --75.8859 --75.8875 --75.8797 --75.8922 --75.8906 --75.8875 --75.8859 --75.9016 --75.9047 --75.8891 --75.8969 --75.8938 --75.8906 --75.8938 --75.875 --75.9 --75.8766 --75.8828 --75.8875 --75.9 --75.8938 --75.8844 --75.8922 --75.8969 --75.8938 --75.8891 --75.8969 --75.8922 --75.8969 --75.8891 --75.8859 --75.9016 --75.9 --75.8969 --75.9078 --75.9 --75.9031 --75.9062 --75.9047 --75.8938 --75.8875 --75.8891 --75.9094 --75.9031 --75.9031 --75.8938 --75.8938 --75.9 --75.8922 --75.8984 --75.8969 --75.9031 --75.9156 --75.9016 --75.8906 --75.9016 --75.9078 --75.8938 --75.8969 --75.9141 --75.9031 --75.8922 --75.8922 --75.9094 --75.9016 --75.9062 --75.9016 --75.9078 --75.8984 --75.9062 --75.9094 --75.9078 --75.9 --75.9156 --75.9016 --75.8984 --75.9156 --75.9047 --75.9062 --75.9094 --75.9062 --75.9016 --75.9078 --75.8969 --75.9156 --75.9 --75.9062 --75.9047 --75.9203 --75.9047 --75.9156 --75.9109 --75.9141 --75.9141 --75.9156 --75.9187 --75.9234 --75.9203 --75.9203 --75.9297 --75.9109 --75.9375 --75.9031 --75.9031 --75.9187 --75.9219 --75.9078 --75.9125 --75.9125 --75.9187 --75.9219 --75.9094 --75.9203 --75.9016 --75.9094 --75.9047 --75.9047 --75.9 --75.9172 --75.9016 --75.8953 --75.9062 --75.8984 --75.8938 --75.8969 --75.9031 --75.9016 --75.8984 --75.8922 --75.9 --75.8984 --75.8953 --75.9047 --75.8984 --75.8969 --75.9016 --75.9094 --75.9031 --75.9062 --75.9047 --75.9031 --75.9016 --75.9062 --75.9016 --75.9 --75.9094 --75.9031 --75.8984 --75.9016 --75.9047 --75.8953 --75.8969 --75.9047 --75.8984 --75.8906 --75.8984 --75.8859 --75.8859 --75.8969 --75.8891 --75.8766 --75.8797 --75.8828 --75.8969 --75.8984 --75.8766 --75.8906 --75.8875 --75.9016 --75.8922 --75.8938 --75.8969 --75.8844 --75.9016 --75.9016 --75.8953 --75.8875 --75.9109 --75.9016 --75.8953 --75.8906 --75.9078 --75.9031 --75.8953 --75.9062 --75.8859 --75.9078 --75.8938 --75.9078 --75.9 --75.8953 --75.9062 --75.8953 --75.8984 --75.9047 --75.9016 --75.8891 --75.9 --75.8906 --75.8906 --75.8922 --75.8938 --75.8922 --75.8891 --75.8766 --75.8906 --75.8922 --75.9016 --75.8922 --75.8922 --75.8969 --75.8906 --75.8859 --75.8938 --75.8828 --75.8891 --75.8875 --75.8906 --75.8812 --75.9031 --75.8953 --75.8812 --75.9016 --75.8812 --75.8812 --75.8844 --75.8953 --75.9016 --75.8906 --75.9062 --75.9 --75.8953 --75.9062 --75.8984 --75.8922 --75.9031 --75.8922 --75.8766 --75.8906 --75.8875 --75.8922 --75.9047 --75.8844 --75.8938 --75.9 --75.8891 --75.9 --75.8781 --75.9016 --75.8906 --75.8969 --75.8938 --75.8906 --75.8922 --75.9 --75.8953 --75.8922 --75.8938 --75.9078 --75.8938 --75.9031 --75.8984 --75.9078 --75.8969 --75.8859 --75.8781 --75.8922 --75.8859 --75.8797 --75.8812 --75.8938 --75.8953 --75.9031 --75.8781 --75.8969 --75.8844 --75.9031 --75.8812 --75.8891 --75.8984 --75.8891 --75.8844 --75.8891 --75.8766 --75.8891 --75.8844 --75.8781 --75.8859 --75.8734 --75.8844 --75.8859 --75.8812 --75.8812 --75.8781 --75.8766 --75.8766 --75.8797 --75.8781 --75.8766 --75.8797 --75.8844 --75.8781 --75.8828 --75.8875 --75.8766 --75.8859 --75.8859 --75.875 --75.8781 --75.8812 --75.8734 --75.8703 --75.8828 --75.8734 --75.8828 --75.8906 --75.8844 --75.8609 --75.875 --75.8734 --75.8734 --75.8688 --75.8781 --75.8781 --75.8703 --75.8719 --75.8844 --75.8766 --75.8828 --75.8812 --75.8656 --75.8766 --75.8766 --75.8922 --75.875 --75.8953 --75.8766 --75.8906 --75.8812 --75.8891 --75.8766 --75.8703 --75.875 --75.8828 --75.8891 --75.8734 --75.8766 --75.8891 --75.8797 --75.8797 --75.8828 --75.8969 --75.8828 --75.8672 --75.8906 --75.8984 --75.8703 --75.8812 --75.8922 --75.875 --75.8766 --75.8703 --75.8844 --75.8984 --75.8797 --75.8797 --75.8797 --75.8812 --75.8906 --75.8875 --75.8828 --75.8906 --75.8906 --75.8906 --75.8906 --75.8859 --75.8844 --75.9016 --75.8844 --75.8922 --75.8953 --75.8844 --75.875 --75.8734 --75.9016 --75.8938 --75.8922 --75.8891 --75.8891 --75.9016 --75.8953 --75.9 --75.9 --75.8938 --75.8734 --75.9031 --75.9047 --75.8953 --75.8844 --75.8984 --75.9031 --75.9016 --75.9016 --75.9047 --75.8922 --75.9031 --75.9016 --75.8984 --75.9109 --75.8906 --75.8859 --75.8984 --75.8766 --75.8891 --75.8922 --75.8891 --75.8844 --75.8906 --75.8938 --75.9 --75.8953 --75.8859 --75.8969 --75.8891 --75.8984 --75.8953 --75.9078 --75.8906 --75.9047 --75.8797 --75.8844 --75.9016 --75.9047 --75.8984 --75.8938 --75.8922 --75.8828 --75.8984 --75.8984 --75.8938 --75.8906 --75.8984 --75.8938 --75.8891 --75.8922 --75.8797 --75.8828 --75.8969 --75.8969 --75.8953 --75.8891 --75.9 --75.8891 --75.8953 --75.8844 --75.8906 --75.8906 --75.8922 --75.8906 --75.8938 --75.9062 --75.8969 --75.9016 --75.9016 --75.9031 --75.9062 --75.9 --75.8922 --75.8984 --75.8969 --75.8984 --75.9109 --75.9062 --75.9 --75.9141 --75.8984 --75.9062 --75.9031 --75.8891 --75.9125 --75.8891 --75.9031 --75.9016 --75.9047 --75.9 --75.8969 --75.8969 --75.8922 --75.8844 --75.8906 --75.9047 --75.8875 --75.8953 --75.8859 --75.8984 --75.8859 --75.8828 --75.8922 --75.8969 --75.9031 --75.8984 --75.8812 --75.8781 --75.8906 --75.8906 --75.8953 --75.8859 --75.8969 --75.8922 --75.8891 --75.8875 --75.9047 --75.8906 --75.8953 --75.8906 --75.8953 --75.8922 --75.8953 --75.8859 --75.8859 --75.9016 --75.8953 --75.8953 --75.8906 --75.9016 --75.8828 --75.8922 --75.8812 --75.8953 --75.8984 --75.8969 --75.8922 --75.8953 --75.8891 --75.8891 --75.8922 --75.8797 --75.8906 --75.8891 --75.8828 --75.8844 --75.8922 --75.8891 --75.8875 --75.8906 --75.9016 --75.8812 --75.8891 --75.8797 --75.9016 --75.8875 --75.8859 --75.8875 --75.8906 --75.8906 --75.8734 --75.8953 --75.8859 --75.8906 --75.8844 --75.9 --75.8828 --75.8859 --75.8891 --75.8844 --75.8875 --75.8922 --75.875 --75.9016 --75.8859 --75.8859 --75.8922 --75.8828 --75.8844 --75.8859 --75.8797 --75.8859 --75.8781 --75.8953 --75.8906 --75.875 --75.8891 --75.8875 --75.8906 --75.8844 --75.8859 --75.8859 --75.8781 --75.8812 --75.8734 --75.8812 --75.8828 --75.9031 --75.9047 --75.8922 --75.8922 --75.8891 --75.8953 --75.9047 --75.8953 --75.8906 --75.8953 --75.8844 --75.8969 --75.9 --75.8906 --75.8844 --75.8969 --75.8969 --75.8953 --75.9031 --75.9 --75.8969 --75.8969 --75.8875 --75.9047 --75.8891 --75.9047 --75.9031 --75.8938 --75.8969 --75.9016 --75.8984 --75.8953 --75.8875 --75.8812 --75.9062 --75.8859 --75.8844 --75.8875 --75.9 --75.8875 --75.8781 --75.8781 --75.8891 --75.8891 --75.8797 --75.8688 --75.8797 --75.8875 --75.8734 --75.8859 --75.8844 --75.8766 --75.8812 --75.8781 --75.8812 --75.8812 --75.8672 --75.8891 --75.875 --75.8812 --75.8766 --75.8734 --75.8844 --75.8828 --75.8781 --75.8844 --75.8938 --75.8797 --75.8781 --75.8891 --75.8906 --75.8891 --75.8844 --75.8781 --75.8812 --75.8891 --75.9047 --75.8844 --75.9078 --75.8734 --75.8906 --75.8906 --75.8859 --75.8906 --75.8656 --75.8812 --75.9031 --75.8922 --75.8859 --75.8922 --75.8875 --75.8828 --75.9 --75.8922 --75.9 --75.8859 --75.8969 --75.8828 --75.8953 --75.8844 --75.9062 --75.8922 --75.8953 --75.8984 --75.8969 --75.8984 --75.8922 --75.8984 --75.8844 --75.8875 --75.9 --75.8781 --75.8953 --75.9 --75.8922 --75.8844 --75.8891 --75.8844 --75.9062 --75.9109 --75.8891 --75.9031 --75.9016 --75.9047 --75.8969 --75.9 --75.8938 --75.8969 --75.9062 --75.8812 --75.9016 --75.8969 --75.8891 --75.9016 --75.9016 --75.8938 --75.9062 --75.8953 --75.8984 --75.8828 --75.9047 --75.8953 --75.9031 --75.8906 --75.9 --75.9031 --75.8922 --75.8906 --75.9047 --75.8969 --75.9 --75.8922 --75.8828 --75.8984 --75.8922 --75.8875 --75.9016 --75.9 --75.9031 --75.8891 --75.8891 --75.8984 --75.8859 --75.8891 --75.8812 --75.8781 --75.8953 --75.8781 --75.8875 --75.8828 --75.8938 --75.8844 --75.9094 --75.8844 --75.8875 --75.9 --75.8953 --75.8906 --75.8969 --75.8906 --75.8891 --75.9047 --75.9031 --75.8922 --75.8859 --75.9047 --75.8953 --75.8859 --75.8875 --75.8844 --75.8891 --75.8781 --75.8984 --75.8938 --75.8938 --75.8844 --75.8922 --75.8844 --75.8859 --75.9078 --75.9031 --75.8812 --75.8953 --75.8984 --75.8891 --75.875 --75.9062 --75.9062 --75.8953 --75.8953 --75.9047 --75.8969 --75.9 --75.8984 --75.9062 --75.9 --75.8953 --75.8938 --75.8969 --75.8938 --75.9016 --75.8984 --75.8969 --75.8969 --75.8953 --75.8906 --75.9031 --75.8984 --75.9016 --75.8969 --75.8859 --75.8922 --75.8938 --75.8875 --75.8828 --75.9047 --75.8859 --75.8984 --75.9078 --75.8969 --75.9109 --75.9 --75.8938 --75.8906 --75.8969 --75.8938 --75.9078 --75.8922 --75.8938 --75.9 --75.9078 --75.9109 --75.8891 --75.9094 --75.8922 --75.9156 --75.8828 --75.9062 --75.8906 --75.8984 --75.9031 --75.8891 --75.8969 --75.8953 --75.9062 --75.9047 --75.8938 --75.8875 --75.9078 --75.8953 --75.8922 --75.9031 --75.8984 --75.9031 --75.9047 --75.9125 --75.9031 --75.8906 --75.8938 --75.8953 --75.8953 --75.9047 --75.9016 --75.9016 --75.9125 --75.8938 --75.9125 --75.8984 --75.9125 --75.9156 --75.8938 --75.9031 --75.8984 --75.8844 --75.9 --75.9047 --75.8859 --75.8953 --75.8891 --75.8984 --75.9125 --75.8844 --75.9047 --75.8984 --75.9031 --75.9 --75.8844 --75.8984 --75.8875 --75.9 --75.8953 --75.9062 --75.8938 --75.9 --75.8953 --75.9 --75.8938 --75.8969 --75.8875 --75.8922 --75.8828 --75.8953 --75.9094 --75.9031 --75.9016 --75.8797 --75.8953 --75.8969 --75.9047 --75.8938 --75.8922 --75.9078 --75.8984 --75.9109 --75.8938 --75.8984 --75.9047 --75.8844 --75.9016 --75.8922 --75.9094 --75.8797 --75.8984 --75.9062 --75.9031 --75.8922 --75.8969 --75.8984 --75.8984 --75.8969 --75.8938 --75.9016 --75.9031 --75.8859 --75.8906 --75.8938 --75.8906 --75.8969 --75.8906 --75.9 --75.8875 --75.8891 --75.8859 --75.8969 --75.8891 --75.8938 --75.8875 --75.9047 --75.9016 --75.8969 --75.8953 --75.8969 --75.9062 --75.8891 --75.8938 --75.8922 --75.8984 --75.9031 --75.9031 --75.8797 --75.8938 --75.8891 --75.9 --75.9 --75.8953 --75.8938 --75.8891 --75.8906 --75.8859 --75.8828 --75.8891 --75.8875 --75.8953 --75.8969 --75.8766 --75.8828 --75.8984 --75.9094 --75.8734 --75.8875 --75.8875 --75.8844 --75.8797 --75.8719 --75.8812 --75.8812 --75.8891 --75.8953 --75.8953 --75.8844 --75.8922 --75.8844 --75.8891 --75.8922 --75.8953 --75.8906 --75.8781 --75.8875 --75.8844 --75.8766 --75.8828 --75.8953 --75.8797 --75.8859 --75.8906 --75.8859 --75.8984 --75.8938 --75.8875 --75.8875 --75.8906 --75.9094 --75.8844 --75.9 --75.8828 --75.8984 --75.8891 --75.8844 --75.8812 --75.8922 --75.9031 --75.8797 --75.8844 --75.8844 --75.8969 --75.8734 --75.8844 --75.8938 --75.8844 --75.9 --75.8891 --75.8953 --75.8828 --75.8938 --75.8781 --75.8797 --75.9016 --75.8781 --75.8828 --75.8828 --75.9031 --75.8984 --75.9062 --75.8875 --75.8875 --75.8875 --75.8953 --75.8906 --75.8812 --75.8672 --75.8891 --75.8875 --75.8859 --75.875 --75.8828 --75.8844 --75.8891 --75.8844 --75.8844 --75.8891 --75.8828 --75.875 --75.8672 --75.8797 --75.8875 --75.8875 --75.8922 --75.8656 --75.8844 --75.8906 --75.875 --75.8859 --75.8797 --75.8828 --75.8656 --75.8875 --75.8781 --75.875 --75.8734 --75.8844 --75.8734 --75.8828 --75.8719 --75.8766 --75.8703 --75.8703 --75.8703 --75.8719 --75.875 --75.875 --75.8875 --75.8766 --75.8844 --75.8828 --75.8812 --75.8703 --75.8844 --75.8625 --75.8922 --75.8844 --75.8719 --75.8766 --75.8891 --75.8922 --75.8766 --75.8922 --75.8828 --75.8812 --75.8781 --75.8938 --75.8828 --75.8844 --75.8844 --75.8953 --75.8844 --75.8859 --75.8875 --75.8875 --75.8906 --75.8781 --75.8766 --75.8719 --75.8875 --75.8797 --75.8812 --75.8844 --75.8781 --75.8938 --75.8859 --75.8812 --75.8688 --75.8844 --75.8734 --75.8844 --75.8781 --75.875 --75.8812 --75.8766 --75.8797 --75.8859 --75.8844 --75.875 --75.8781 --75.8797 --75.8625 --75.8797 --75.8797 --75.8812 --75.8828 --75.8828 --75.8812 --75.8859 --75.8844 --75.8891 --75.8844 --75.8797 --75.8703 --75.8797 --75.8859 --75.8953 --75.8859 --75.8656 --75.8844 --75.8906 --75.8797 --75.8719 --75.8781 --75.8781 --75.8844 --75.8859 --75.8906 --75.8766 --75.8859 --75.8719 --75.8797 --75.8688 --75.8734 --75.8797 --75.8781 --75.8906 --75.8938 --75.8844 --75.8828 --75.8734 --75.8812 --75.8578 --75.8828 --75.8703 --75.8797 --75.8797 --75.8797 --75.8906 --75.8891 --75.8797 --75.8797 --75.8641 --75.8781 --75.8781 --75.8719 --75.8766 --75.8766 --75.8812 --75.8875 --75.8797 --75.8859 --75.8875 --75.8875 --75.8812 --75.8766 --75.8938 --75.9016 --75.8906 --75.8859 --75.8875 --75.8812 --75.8906 --75.8859 --75.8844 --75.8781 --75.8875 --75.8906 --75.8812 --75.8969 --75.8719 --75.8875 --75.8828 --75.8906 --75.8828 --75.8875 --75.8984 --75.8719 --75.8797 --75.8766 --75.8797 --75.8859 --75.8859 --75.8859 --75.8688 --75.8953 --75.8969 --75.8828 --75.8828 --75.8828 --75.875 --75.8781 --75.8875 --75.8781 --75.8703 --75.8953 --75.8844 --75.8859 --75.8906 --75.8922 --75.8953 --75.8953 --75.8953 --75.8703 --75.8859 --75.8812 --75.8828 --75.8812 --75.8828 --75.8797 --75.8734 --75.8859 --75.8891 --75.8875 --75.8891 --75.8844 --75.8703 --75.8844 --75.8844 --75.8812 --75.8766 --75.8719 --75.8766 --75.875 --75.8625 --75.8766 --75.8812 --75.8656 --75.8766 --75.8766 --75.8781 --75.875 --75.8641 --75.8688 --75.8641 --75.8797 --75.8859 --75.8719 --75.8828 --75.875 --75.8719 --75.875 --75.8797 --75.8812 --75.8828 --75.8688 --75.8766 --75.8734 --75.8844 --75.8703 --75.8844 --75.8734 --75.8859 --75.8734 --75.8688 --75.8797 --75.8859 --75.8828 --75.8875 --75.8906 --75.8859 --75.8891 --75.8844 --75.8922 --75.8828 --75.875 --75.8812 --75.8719 --75.8844 --75.8891 --75.8891 --75.8875 --75.8812 --75.8906 --75.8984 --75.8781 --75.8766 --75.8703 --75.8922 --75.8906 --75.8781 --75.8812 --75.8859 --75.8859 --75.8969 --75.9031 --75.8844 --75.8719 --75.8812 --75.8891 --75.8922 --75.8969 --75.8922 --75.8844 --75.8953 --75.875 --75.8766 --75.8797 --75.8891 --75.8797 --75.9016 --75.8953 --75.8859 --75.8922 --75.8906 --75.8938 --75.9016 --75.8859 --75.8891 --75.9031 --75.9062 --75.9 --75.8984 --75.8969 --75.8703 --75.8797 --75.9016 --75.9016 --75.8906 --75.8984 --75.8844 --75.875 --75.8938 --75.8859 --75.8906 --75.8875 --75.8891 --75.8734 --75.8797 --75.8766 --75.8734 --75.8797 --75.8828 --75.8828 --75.8828 --75.8828 --75.8906 --75.8703 --75.8844 --75.8875 --75.8703 --75.8812 --75.8891 --75.8891 --75.8766 --75.8922 --75.8719 --75.8891 --75.8812 --75.8844 --75.8719 --75.8828 --75.8906 --75.8859 --75.8922 --75.8906 --75.8891 --75.8938 --75.8844 --75.8969 --75.8906 --75.8969 --75.8766 --75.8859 --75.8906 --75.8812 --75.8922 --75.8828 --75.8875 --75.8734 --75.8844 --75.8797 --75.8969 --75.9 --75.9031 --75.8828 --75.9062 --75.8938 --75.8953 --75.9156 --75.8875 --75.8938 --75.9062 --75.8859 --75.8953 --75.9 --75.8844 --75.8891 --75.9125 --75.8953 --75.8922 --75.9094 --75.8875 --75.8922 --75.8984 --75.9047 --75.8891 --75.8906 --75.8875 --75.8906 --75.8969 --75.8766 --75.8953 --75.8969 --75.8953 --75.8828 --75.9047 --75.8859 --75.8953 --75.8938 --75.8969 --75.8984 --75.8781 --75.8953 --75.8922 --75.8969 --75.8891 --75.8922 --75.9016 --75.8828 --75.9047 --75.9047 --75.8906 --75.8969 --75.8828 --75.8875 --75.8766 --75.8859 --75.8969 --75.8797 --75.8844 --75.8859 --75.8891 --75.9047 --75.9016 --75.9 --75.8891 --75.8969 --75.8766 --75.8891 --75.9062 --75.8844 --75.8828 --75.9062 --75.8922 --75.8906 --75.9047 --75.9078 --75.8922 --75.9062 --75.8875 --75.8953 --75.8875 --75.8859 --75.8828 --75.9047 --75.8953 --75.8891 --75.8844 --75.8891 --75.8891 --75.8922 --75.9109 --75.8797 --75.8984 --75.8953 --75.9016 --75.8922 --75.8844 --75.9016 --75.8859 --75.9031 --75.8984 --75.9016 --75.8984 --75.8875 --75.9031 --75.8875 --75.8953 --75.8906 --75.9 --75.8922 --75.8875 --75.9 --75.8953 --75.8953 --75.8812 --75.8844 --75.8859 --75.8922 --75.8812 --75.8812 --75.8938 --75.8922 --75.8844 --75.8859 --75.9 --75.9 --75.8875 --75.9016 --75.8875 --75.8969 --75.8969 --75.8875 --75.8938 --75.8969 --75.8906 --75.8828 --75.8875 --75.8922 --75.8844 --75.8938 --75.8906 --75.8984 --75.8938 --75.8828 --75.8859 --75.8922 --75.8859 --75.9047 --75.8906 --75.9 --75.9172 --75.9 --75.9 --75.8906 --75.8906 --75.8953 --75.8844 --75.9031 --75.8859 --75.8969 --75.8828 --75.8922 --75.8906 --75.9094 --75.8891 --75.9016 --75.8906 --75.9078 --75.8953 --75.9 --75.8969 --75.8812 --75.8969 --75.8938 --75.9062 --75.8969 --75.9031 --75.8984 --75.9062 --75.8906 --75.8984 --75.9047 --75.8969 --75.9 --75.8922 --75.8938 --75.8891 --75.8953 --75.8844 --75.9 --75.8875 --75.8844 --75.8875 --75.8938 --75.8859 --75.8812 --75.8812 --75.8797 --75.8719 --75.8891 --75.8969 --75.8812 --75.8922 --75.8906 --75.8875 --75.8875 --75.9031 --75.9031 --75.8828 --75.9016 --75.8984 --75.8672 --75.8844 --75.8938 --75.8891 --75.9 --75.8953 --75.9031 --75.9031 --75.8828 --75.8969 --75.8969 --75.8906 --75.9016 --75.9016 --75.8969 --75.8828 --75.8812 --75.8953 --75.8875 --75.8969 --75.8859 --75.8922 --75.8859 --75.8828 --75.8922 --75.875 --75.8906 --75.8703 --75.8953 --75.8812 --75.8797 --75.8781 --75.8812 --75.8891 --75.8891 --75.8844 --75.8859 --75.8828 --75.8828 --75.8891 --75.8859 --75.8797 --75.875 --75.8812 --75.8891 --75.8844 --75.8969 --75.8828 --75.8953 --75.875 --75.9047 --75.8875 --75.8906 --75.8969 --75.8734 --75.8844 --75.8875 --75.8938 --75.8891 --75.8938 --75.8891 --75.8828 --75.8969 --75.8875 --75.8969 --75.8906 --75.8922 --75.8875 --75.8906 --75.8891 --75.8828 --75.8906 --75.8781 --75.9047 --75.8891 --75.8781 --75.8953 --75.8781 --75.9 --75.8844 --75.8812 --75.8859 --75.8984 --75.8828 --75.8875 --75.8891 --75.8891 --75.8938 --75.8906 --75.8875 --75.9031 --75.8859 --75.8922 --75.9031 --75.8922 --75.8969 --75.9016 --75.8984 --75.8906 --75.8922 --75.8812 --75.8875 --75.8891 --75.8953 --75.875 --75.8969 --75.8953 --75.8906 --75.8844 --75.8766 --75.8938 --75.8906 --75.8922 --75.8844 --75.8891 --75.8953 --75.8891 --75.8891 --75.8875 --75.8859 --75.8859 --75.8969 --75.8766 --75.8766 --75.8812 --75.8922 --75.8938 --75.9016 --75.8891 --75.8953 --75.8953 --75.8891 --75.8859 --75.8891 --75.8891 --75.8922 --75.8953 --75.8812 --75.8797 --75.8922 --75.8812 --75.8812 --75.875 --75.8812 --75.8875 --75.8719 --75.8734 --75.8812 --75.8891 --75.8906 --75.8688 --75.8906 --75.8906 --75.8953 --75.8859 --75.8906 --75.8875 --75.8766 --75.8828 --75.8781 --75.8875 --75.8969 --75.8766 --75.8875 --75.8844 --75.8844 --75.8938 --75.8844 --75.8828 --75.8922 --75.8844 --75.8812 --75.8859 --75.8828 --75.8812 --75.8953 --75.8828 --75.8938 --75.8844 --75.8859 --75.8844 --75.8828 --75.8922 --75.8812 --75.8922 --75.8812 --75.8875 --75.8906 --75.8812 --75.8828 --75.8766 --75.8812 --75.8812 --75.8719 --75.8672 --75.8766 --75.8688 --75.8797 --75.875 --75.8797 --75.8766 --75.8938 --75.8797 --75.8828 --75.8609 --75.8828 --75.8703 --75.8688 --75.8812 --75.8812 --75.8812 --75.8766 --75.8844 --75.8969 --75.8828 --75.8891 --75.8844 --75.8844 --75.8984 --75.8984 --75.8781 --75.8875 --75.8828 --75.8891 --75.8688 --75.875 --75.8781 --75.8672 --75.8703 --75.8766 --75.875 --75.8703 --75.8953 --75.8766 --75.8688 --75.8656 --75.8844 --75.8734 --75.8781 --75.8766 --75.8812 --75.8844 --75.8859 --75.8719 --75.8859 --75.875 --75.8766 --75.8672 --75.8797 --75.8828 --75.8781 --75.8781 --75.8734 --75.8859 --75.8703 --75.8672 --75.8844 --75.8891 --75.8641 --75.8828 --75.8828 --75.8812 --75.8781 --75.8719 --75.8703 --75.8922 --75.8828 --75.8781 --75.8781 --75.8703 --75.8797 --75.8688 --75.8828 --75.8766 --75.8953 --75.8781 --75.8812 --75.8844 --75.8875 --75.8828 --75.8875 --75.8812 --75.8844 --75.8766 --75.8766 --75.8797 --75.8703 --75.8703 --75.8688 --75.8812 --75.8703 --75.8688 --75.8703 --75.8781 --75.8703 --75.8734 --75.8766 --75.8781 --75.8734 --75.8828 --75.875 --75.8703 --75.8766 --75.8703 --75.8781 --75.8797 --75.8766 --75.8688 --75.8703 --75.8656 --75.8672 --75.8859 --75.8766 --75.8922 --75.8688 --75.8703 --75.8656 --75.8703 --75.8703 --75.8812 --75.8859 --75.8703 --75.8719 --75.875 --75.8734 --75.8672 --75.8812 --75.8797 --75.8828 --75.8625 --75.8859 --75.8594 --75.8812 --75.8891 --75.8828 --75.8891 --75.8797 --75.8891 --75.8828 --75.8844 --75.8781 --75.8891 --75.8781 --75.8766 --75.8844 --75.8734 --75.8797 --75.8828 --75.8875 --75.8844 --75.8812 --75.8797 --75.8625 --75.8875 --75.8891 --75.8828 --75.8906 --75.8734 --75.8812 --75.9 --75.8844 --75.8922 --75.875 --75.8875 --75.8891 --75.8922 --75.8875 --75.8797 --75.8812 --75.8828 --75.8891 --75.8844 --75.8719 --75.8875 --75.8797 --75.8953 --75.8859 --75.8969 --75.8797 --75.8812 --75.8781 --75.8859 --75.8844 --75.8859 --75.8781 --75.8922 --75.8859 --75.8797 --75.8875 --75.8781 --75.8938 --75.8875 --75.8906 --75.8875 --75.8891 --75.8891 --75.8922 --75.8969 --75.9047 --75.8797 --75.8891 --75.8938 --75.8969 --75.8922 --75.8922 --75.8906 --75.8891 --75.8781 --75.8828 --75.8766 --75.8875 --75.8703 --75.8797 --75.8984 --75.8781 --75.8984 --75.8797 --75.8781 --75.8844 --75.8859 --75.8625 --75.8734 --75.8703 --75.8953 --75.8625 --75.8828 --75.8828 --75.8734 --75.8875 --75.8891 --75.8969 --75.8875 --75.8719 --75.8719 --75.8734 --75.8781 --75.8719 --75.8516 --75.8719 --75.8828 --75.8906 --75.8781 --75.8922 --75.8859 --75.8812 --75.8781 --75.8812 --75.8812 --75.8812 --75.8859 --75.8828 --75.8812 --75.8875 --75.8812 --75.8797 --75.8641 --75.8734 --75.8797 --75.8844 --75.8812 --75.8891 --75.8906 --75.8906 --75.8953 --75.8844 --75.8922 --75.9 --75.8938 --75.8891 --75.8797 --75.8953 --75.8781 --75.8844 --75.8922 --75.8875 --75.8906 --75.8938 --75.8953 --75.8953 --75.9 --75.8922 --75.8938 --75.8797 --75.8812 --75.8953 --75.8906 --75.8828 --75.8797 --75.8844 --75.9 --75.8828 --75.8891 --75.8953 --75.9 --75.8906 --75.8984 --75.8844 --75.8969 --75.8844 --75.8984 --75.8844 --75.8953 --75.8969 --75.8891 --75.9031 --75.8969 --75.8984 --75.9016 --75.8891 --75.8828 --75.8812 --75.8797 --75.8719 --75.8672 --75.8844 --75.8812 --75.8906 --75.875 --75.875 --75.8781 --75.875 --75.8781 --75.8812 --75.875 --75.8594 --75.8719 --75.8781 --75.8766 --75.875 --75.8703 --75.8781 --75.8969 --75.8844 --75.8859 --75.8875 --75.8766 --75.8906 --75.8922 --75.8812 --75.8844 --75.875 --75.8844 --75.8609 --75.8859 --75.8719 --75.8828 --75.8797 --75.8859 --75.8812 --75.8766 --75.8781 --75.8797 --75.875 --75.875 --75.8734 --75.8672 --75.8781 --75.8875 --75.8797 --75.8859 --75.8734 --75.8797 --75.8828 --75.8859 --75.8719 --75.9016 --75.8891 --75.8828 --75.8906 --75.8922 --75.8875 --75.8891 --75.8766 --75.8875 --75.8734 --75.8734 --75.875 --75.8844 --75.8859 --75.8797 --75.8828 --75.8922 --75.8734 --75.8734 --75.8766 --75.8766 --75.8906 --75.8906 --75.8922 --75.8781 --75.875 --75.8797 --75.8844 --75.8828 --75.8906 --75.8828 --75.8797 --75.875 --75.8828 --75.8734 --75.8812 --75.8688 --75.875 --75.8734 --75.8672 --75.8781 --75.8797 --75.8812 --75.8734 --75.8688 --75.8734 --75.8906 --75.8781 --75.8906 --75.8812 --75.8797 --75.8953 --75.8844 --75.8797 --75.8844 --75.8672 --75.8844 --75.8797 --75.8844 --75.8719 --75.8844 --75.8781 --75.8688 --75.8641 --75.8844 --75.8906 --75.8875 --75.875 --75.875 --75.8844 --75.8781 --75.8766 --75.8781 --75.8875 --75.8797 --75.8797 --75.8766 --75.8891 --75.8844 --75.8844 --75.8891 --75.8828 --75.8906 --75.8828 --75.8703 --75.8766 --75.8688 --75.8844 --75.8844 --75.8891 --75.8812 --75.8906 --75.8734 --75.8875 --75.8734 --75.8812 --75.8781 --75.8906 --75.8812 --75.8844 --75.8672 --75.8797 --75.8656 --75.8797 --75.8844 --75.8844 --75.8766 --75.8797 --75.8844 --75.8844 --75.8828 --75.8609 --75.8828 --75.8812 --75.8906 --75.8844 --75.8734 --75.8625 --75.8734 --75.8891 --75.8875 --75.8766 --75.8906 --75.8672 --75.8719 --75.8844 --75.8812 --75.8656 --75.8844 --75.8719 --75.8766 --75.8734 --75.8859 --75.8844 --75.8703 --75.8828 --75.8781 --75.8812 --75.8828 --75.8703 --75.8719 --75.8828 --75.8766 --75.8703 --75.8609 --75.8719 --75.8734 --75.8672 --75.8641 --75.8703 --75.8797 --75.8672 --75.8656 --75.8797 --75.8594 --75.8703 --75.8734 --75.8828 --75.8734 --75.8656 --75.875 --75.8812 --75.8766 --75.8812 --75.8922 --75.8734 --75.8828 --75.8812 --75.8844 --75.8781 --75.8812 --75.8875 --75.8703 --75.8844 --75.8828 --75.8766 --75.875 --75.8719 --75.8781 --75.8875 --75.8781 --75.8844 --75.8781 --75.8875 --75.8812 --75.8812 --75.8797 --75.8797 --75.8797 --75.8812 --75.8688 --75.8812 --75.8844 --75.875 --75.8719 --75.8859 --75.8703 --75.875 --75.8781 --75.8656 --75.8625 --75.8734 --75.8688 --75.8609 --75.8688 --75.8656 --75.8703 --75.8781 --75.8734 --75.8781 --75.8734 --75.8859 --75.8688 --75.8719 --75.875 --75.8812 --75.8781 --75.8812 --75.8734 --75.8781 --75.8797 --75.8656 --75.875 --75.8656 --75.875 --75.8641 --75.8625 --75.8734 --75.875 --75.8672 --75.8719 --75.8672 --75.8812 --75.8531 --75.8719 --75.8656 --75.8781 --75.8625 --75.875 --75.8766 --75.8688 --75.875 --75.8766 --75.8719 --75.8641 --75.8656 --75.8672 --75.8781 --75.8766 --75.875 --75.875 --75.8859 --75.8625 --75.8859 --75.8766 --75.8703 --75.8797 --75.8797 --75.8797 --75.8797 --75.8797 --75.8828 --75.8828 --75.8766 --75.8812 --75.8844 --75.8656 --75.8906 --75.8641 --75.8828 --75.8641 --75.8828 --75.8641 --75.8922 --75.8828 --75.8766 --75.8766 --75.8938 --75.8688 --75.8797 --75.8734 --75.8812 --75.8672 --75.8656 --75.8766 --75.8828 --75.8719 --75.8719 --75.8734 --75.8766 --75.8719 --75.8734 --75.8906 --75.9016 --75.8859 --75.8734 --75.8938 --75.8812 --75.8703 --75.8859 --75.8812 --75.8781 --75.8906 --75.8844 --75.8734 --75.8875 --75.8859 --75.8859 --75.8844 --75.8688 --75.8812 --75.8656 --75.8766 --75.8859 --75.8719 --75.8734 --75.8781 --75.8797 --75.8906 --75.8781 --75.8797 --75.8828 --75.8922 --75.8766 --75.8828 --75.8891 --75.8797 --75.8828 --75.8953 --75.8891 --75.8859 --75.8766 --75.8688 --75.8875 --75.8828 --75.8812 --75.8859 --75.8828 --75.8891 --75.8938 --75.8906 --75.8844 --75.8922 --75.8969 --75.8734 --75.8906 --75.8828 --75.8844 --75.8844 --75.8812 --75.875 --75.8891 --75.8719 --75.8797 --75.8781 --75.8625 --75.8812 --75.8828 --75.8812 --75.8719 --75.8812 --75.8844 --75.8859 --75.875 --75.8781 --75.8828 --75.8906 --75.8797 --75.8797 --75.8859 --75.8812 --75.8828 --75.8812 --75.8797 --75.8797 --75.875 --75.8703 --75.8812 --75.8844 --75.8828 --75.8797 --75.8766 --75.875 --75.875 --75.8734 --75.8719 --75.8656 --75.8844 --75.8609 --75.8578 --75.8797 --75.8719 --75.8828 --75.8766 --75.8719 --75.8797 --75.8688 --75.8797 --75.8844 --75.8875 --75.8734 --75.875 --75.8734 --75.875 --75.8625 --75.875 --75.8562 --75.8594 --75.8797 --75.8766 --75.875 --75.8891 --75.8625 --75.8688 --75.8766 --75.8812 --75.875 --75.875 --75.8828 --75.8656 --75.8734 --75.8781 --75.8594 --75.8688 --75.8766 --75.8812 --75.8719 --75.8734 --75.8797 --75.8656 --75.8672 --75.8672 --75.8703 --75.8672 --75.875 --75.8844 --75.8797 --75.8703 --75.8703 --75.8797 --75.8594 --75.8672 --75.8578 --75.8641 --75.8766 --75.8656 --75.8797 --75.875 --75.8891 --75.8812 --75.8766 --75.8812 --75.8641 --75.8672 --75.8688 --75.8656 --75.8719 --75.8828 --75.8578 --75.875 --75.8828 --75.8812 --75.8797 --75.8703 --75.875 --75.8719 --75.8703 --75.8656 --75.8797 --75.8797 --75.8797 --75.8891 --75.8812 --75.8953 --75.8875 --75.8891 --75.8844 --75.8719 --75.8859 --75.8875 --75.8875 --75.8781 --75.8812 --75.8938 --75.8906 --75.8844 --75.8828 --75.8766 --75.8812 --75.8812 --75.8781 --75.8797 --75.8781 --75.8844 --75.8672 --75.8875 --75.8797 --75.8828 --75.8688 --75.8844 --75.8828 --75.8766 --75.8812 --75.8828 --75.8719 --75.8672 --75.8641 --75.875 --75.8688 --75.8797 --75.8797 --75.8875 --75.8781 --75.8719 --75.8797 --75.8703 --75.8672 --75.875 --75.8734 --75.8672 --75.8703 --75.8766 --75.8672 --75.8766 --75.8703 --75.8797 --75.8734 --75.8719 --75.8734 --75.8797 --75.8656 --75.8719 --75.8703 --75.8641 --75.8828 --75.8828 --75.8797 --75.8734 --75.8812 --75.8734 --75.8734 --75.8734 --75.8734 --75.8734 --75.8734 --75.8719 --75.8703 --75.8797 --75.8719 --75.8875 --75.8688 --75.8781 --75.8703 --75.8781 --75.8766 --75.8641 --75.8688 --75.8703 --75.8781 --75.8812 --75.875 --75.8766 --75.8766 --75.8688 --75.8703 --75.8797 --75.8844 --75.8812 --75.8812 --75.8797 --75.8828 --75.8797 --75.875 --75.8609 --75.8781 --75.8812 --75.8812 --75.8734 --75.8781 --75.8859 --75.8781 --75.8828 --75.8781 --75.8781 --75.8828 --75.8703 --75.8625 --75.8719 --75.8688 --75.8719 --75.8734 --75.8859 --75.8781 --75.8656 --75.875 --75.8688 --75.8703 --75.875 --75.8828 --75.8828 --75.8672 --75.8656 --75.8719 --75.875 --75.8672 --75.875 --75.8797 --75.8859 --75.8828 --75.875 --75.8844 --75.8766 --75.8812 --75.8859 --75.8781 --75.8812 --75.8703 --75.8719 --75.875 --75.8797 --75.8766 --75.8672 --75.8656 --75.8859 --75.8812 --75.8781 --75.8656 --75.875 --75.8859 --75.8672 --75.8781 --75.8859 --75.8766 --75.875 --75.8672 --75.8797 --75.8781 --75.8734 --75.8656 --75.8781 --75.8703 --75.8609 --75.8781 --75.8781 --75.8688 --75.8859 --75.8656 --75.8656 --75.8688 --75.8766 --75.8781 --75.8766 --75.8859 --75.8688 --75.8797 --75.8828 --75.8734 --75.8766 --75.8828 --75.8828 --75.8688 --75.8766 --75.8812 --75.8906 --75.8906 --75.8859 --75.875 --75.8734 --75.875 --75.8625 --75.8734 --75.8562 --75.8719 --75.875 --75.8703 --75.8719 --75.8688 --75.8781 --75.875 --75.8672 --75.8688 --75.8703 --75.8766 --75.8625 --75.8859 --75.875 --75.8812 --75.8828 --75.8828 --75.8859 --75.8859 --75.8719 --75.8812 --75.8766 --75.8781 --75.8812 --75.8703 --75.8766 --75.8828 --75.8812 --75.8812 --75.8859 --75.8703 --75.8734 --75.8844 --75.8766 --75.8859 --75.8828 --75.8734 --75.8766 --75.8625 --75.8688 --75.8781 --75.8906 --75.8719 --75.8828 --75.8734 --75.8797 --75.8703 --75.8828 --75.8688 --75.8688 --75.875 --75.8688 --75.8703 --75.8766 --75.8672 --75.8766 --75.8812 --75.8734 --75.8766 --75.8719 --75.8703 --75.8812 --75.8906 --75.8719 --75.8828 --75.8672 --75.8891 --75.8922 --75.8969 --75.8812 --75.8828 --75.8781 --75.8781 --75.8703 --75.8781 --75.8812 --75.8906 --75.8797 --75.8844 --75.8891 --75.8719 --75.8797 --75.8609 --75.8859 --75.8656 --75.8812 --75.8797 --75.875 --75.875 --75.8703 --75.8703 --75.8797 --75.8812 --75.8812 --75.8875 --75.8781 --75.8859 --75.8828 --75.8844 --75.8812 --75.8797 --75.8734 --75.8859 --75.8891 --75.8797 --75.8844 --75.8609 --75.8781 --75.8688 --75.8969 --75.8797 --75.8781 --75.8781 --75.8734 --75.8766 --75.8844 --75.8781 --75.8891 --75.8797 --75.8922 --75.8719 --75.8828 --75.8766 --75.8766 --75.875 --75.8641 --75.8766 --75.8734 --75.875 --75.8641 --75.8609 --75.8781 --75.8797 --75.8781 --75.8703 --75.8844 --75.8766 --75.8875 --75.8734 --75.8875 --75.8641 --75.875 --75.8578 --75.8734 --75.8734 --75.8766 --75.8656 --75.8766 --75.8766 --75.8719 --75.8781 --75.8891 --75.8656 --75.8844 --75.8734 --75.875 --75.8891 --75.8688 --75.8891 --75.8844 --75.8766 --75.8719 --75.8859 --75.8703 --75.8719 --75.8859 --75.8656 --75.8734 --75.8781 --75.8812 --75.8781 --75.8703 --75.8688 --75.8734 --75.8797 --75.8766 --75.8891 --75.8859 --75.8922 --75.8781 --75.8922 --75.8781 --75.8922 --75.8922 --75.8844 --75.8797 --75.8969 --75.8766 --75.9 --75.8703 --75.8719 --75.8797 --75.8688 --75.8938 --75.8625 --75.8734 --75.875 --75.8625 --75.8734 --75.8703 --75.8797 --75.8766 --75.875 --75.8688 --75.8688 --75.8891 --75.8672 --75.8688 --75.8734 --75.8703 --75.8844 --75.8859 --75.8859 --75.8672 --75.8797 --75.8797 --75.8656 --75.8875 --75.8906 --75.8812 --75.8797 --75.8641 --75.8828 --75.8656 --75.8828 --75.8906 --75.8828 --75.8688 --75.8844 --75.8766 --75.8875 --75.8859 --75.8812 --75.8844 --75.8781 --75.8766 --75.8906 --75.8719 --75.8812 --75.8609 --75.8781 --75.8719 --75.8578 --75.8812 --75.8547 --75.8781 --75.8625 --75.8656 --75.8672 --75.8906 --75.8766 --75.8812 --75.8859 --75.8719 --75.8719 --75.8812 --75.8734 --75.8719 --75.8672 --75.8766 --75.8922 --75.875 --75.8828 --75.8812 --75.8766 --75.8781 --75.8766 --75.8828 --75.8719 --75.875 --75.8703 --75.8797 --75.8922 --75.8781 --75.8875 --75.8891 --75.8953 --75.8766 --75.875 --75.8938 --75.8906 --75.8875 --75.8797 --75.8844 --75.8828 --75.8969 --75.8891 --75.9016 --75.8844 --75.875 --75.8875 --75.8859 --75.8953 --75.8812 --75.8797 --75.8891 --75.8812 --75.8859 --75.8812 --75.8766 --75.8797 --75.8875 --75.875 --75.9 --75.9 --75.8875 --75.8781 --75.8953 --75.8953 --75.8859 --75.8859 --75.875 --75.8859 --75.8797 --75.8875 --75.8734 --75.8719 --75.8719 --75.875 --75.8922 --75.8781 --75.8844 --75.8891 --75.8688 --75.8641 --75.8984 --75.8609 --75.8734 --75.8828 --75.8688 --75.8766 --75.8719 --75.8719 --75.8812 --75.8734 --75.8766 --75.8859 --75.8797 --75.8812 --75.8656 --75.8719 --75.875 --75.8812 --75.8828 --75.8828 --75.8734 --75.8922 --75.8766 --75.8781 --75.8844 --75.8844 --75.8672 --75.8875 --75.8906 --75.8828 --75.8797 --75.8734 --75.8766 --75.8719 --75.8828 --75.8781 --75.8672 --75.8766 --75.875 --75.8609 --75.8672 --75.8734 --75.8672 --75.8656 --75.8688 --75.8766 --75.8703 --75.875 --75.8688 --75.8734 --75.8703 --75.8703 --75.8797 --75.8734 --75.8656 --75.875 --75.8859 --75.8828 --75.8812 --75.8828 --75.8703 --75.8703 --75.8812 --75.8641 --75.8703 --75.8812 --75.8766 --75.8688 --75.8719 --75.8766 --75.8594 --75.8609 --75.8688 --75.8781 --75.8625 --75.8656 --75.8812 --75.875 --75.8609 --75.8844 --75.8641 --75.8797 --75.8734 --75.8828 --75.8734 --75.8797 --75.8594 --75.8609 --75.8734 --75.875 --75.8547 --75.8766 --75.8781 --75.8703 --75.8719 --75.8672 --75.8703 --75.8797 --75.8719 --75.8766 --75.8719 --75.8797 --75.8828 --75.8656 --75.8828 --75.8828 --75.8859 --75.8812 --75.875 --75.8703 --75.8672 --75.8875 --75.8688 --75.8859 --75.8734 --75.8734 --75.8812 --75.8859 --75.8766 --75.8797 --75.8781 --75.8672 --75.8719 --75.8734 --75.8781 --75.8766 --75.8719 --75.8625 --75.8625 --75.8625 --75.8781 --75.875 --75.8828 --75.8562 --75.8703 --75.875 --75.8766 --75.8688 --75.8719 --75.8719 --75.8688 --75.8828 --75.875 --75.8734 --75.8703 --75.8656 --75.8672 --75.8734 --75.8656 --75.8672 --75.8625 --75.8812 --75.8656 --75.8656 --75.8609 --75.8734 --75.8672 --75.8625 --75.8766 --75.8969 --75.8891 --75.8859 --75.8766 --75.8906 --75.8797 --75.875 --75.8766 --75.8875 --75.8828 --75.8797 --75.8734 --75.8641 --75.8875 --75.8875 --75.8828 --75.8781 --75.8875 --75.8844 --75.8859 --75.875 --75.8781 --75.8703 --75.8812 --75.8641 --75.8812 --75.8859 --75.8781 --75.8797 --75.8781 --75.8875 --75.8797 --75.8875 --75.8828 --75.875 --75.875 --75.8906 --75.8734 --75.8688 --75.875 --75.8891 --75.8688 --75.875 --75.8719 --75.8781 --75.8719 --75.8688 --75.8703 --75.8719 --75.8688 --75.8688 --75.8625 --75.875 --75.8656 --75.875 --75.8797 --75.8703 --75.8875 --75.8781 --75.8906 --75.8641 --75.8672 --75.8812 --75.8641 --75.8844 --75.8703 --75.9 --75.8906 --75.8875 --75.8812 --75.8906 --75.8688 --75.8828 --75.8719 --75.875 --75.8641 --75.8859 --75.8922 --75.8828 --75.8859 --75.8844 --75.8797 --75.8781 --75.8688 --75.8719 --75.8828 --75.8625 --75.875 --75.8688 --75.8844 --75.8828 --75.8734 --75.8734 --75.8719 --75.8844 --75.8734 --75.8797 --75.8641 --75.8625 --75.8562 --75.8719 --75.8734 --75.8734 --75.8828 --75.8641 --75.8859 --75.875 --75.8797 --75.8672 --75.8672 --75.8719 --75.8719 --75.8594 --75.875 --75.8797 --75.8797 --75.8641 --75.8641 --75.8688 --75.8734 --75.8719 --75.8656 --75.8766 --75.8703 --75.8781 --75.8656 --75.8797 --75.875 --75.8688 --75.8688 --75.8641 --75.8812 --75.8734 --75.8812 --75.8719 --75.8844 --75.8797 --75.8719 --75.8766 --75.8766 --75.8703 --75.8812 --75.875 --75.8672 --75.8844 --75.8766 --75.8844 --75.8672 --75.8719 --75.8672 --75.8594 --75.8719 --75.875 --75.8703 --75.8734 --75.875 --75.8672 --75.875 --75.8828 --75.8719 --75.8688 --75.8719 --75.8641 --75.8688 --75.8641 --75.8641 --75.8578 --75.8672 --75.8641 --75.8578 --75.8562 --75.8719 --75.8562 --75.8594 --75.8594 --75.8625 --75.8609 --75.8484 --75.8719 --75.8656 --75.8641 --75.8625 --75.8516 --75.8609 --75.875 --75.875 --75.8734 --75.8688 --75.8688 --75.85 --75.8578 --75.8703 --75.8594 --75.8719 --75.8641 --75.8719 --75.8766 --75.8828 --75.8656 --75.8859 --75.8781 --75.8625 --75.8734 --75.8625 --75.8641 --75.8703 --75.8828 --75.8516 --75.8516 --75.8625 --75.8547 --75.8656 --75.875 --75.8672 --75.8578 --75.8656 --75.8672 --75.8625 --75.8734 --75.8766 --75.8734 --75.8625 --75.8719 --75.875 --75.8828 --75.8781 --75.8766 --75.8688 --75.8719 --75.8734 --75.875 --75.8781 --75.8703 --75.875 --75.8656 --75.875 --75.8719 --75.8703 --75.8656 --75.8625 --75.8672 --75.8781 --75.8703 --75.875 --75.8812 --75.8797 --75.8781 --75.8688 --75.8672 --75.8781 --75.8703 --75.875 --75.8812 --75.8828 --75.8781 --75.8828 --75.8781 --75.8891 --75.8766 --75.8859 --75.8859 --75.8906 --75.8719 --75.8875 --75.8844 --75.875 --75.9 --75.8891 --75.8688 --75.8828 --75.8688 --75.8766 --75.8766 --75.8719 --75.8766 --75.8766 --75.8875 --75.8906 --75.875 --75.8859 --75.8891 --75.8859 --75.8766 --75.8828 --75.8703 --75.875 --75.8812 --75.9016 --75.8641 --75.8844 --75.8625 --75.8781 --75.8797 --75.8688 --75.8625 --75.8688 --75.8734 --75.8875 --75.8828 --75.8828 --75.8703 --75.8797 --75.875 --75.8781 --75.8734 --75.8703 --75.8781 --75.875 --75.8641 --75.8703 --75.8766 --75.8984 --75.8906 --75.8859 --75.8797 --75.8891 --75.8828 --75.8797 --75.8844 --75.8734 --75.8844 --75.8922 --75.8906 --75.8922 --75.8906 --75.8812 --75.9 --75.8703 --75.8875 --75.8891 --75.9 --75.8812 --75.8891 --75.8812 --75.8812 --75.9 --75.8906 --75.8938 --75.8844 --75.8828 --75.8797 --75.8781 --75.8781 --75.8781 --75.8906 --75.8859 --75.8781 --75.8922 --75.8859 --75.8859 --75.8797 --75.8812 --75.8781 --75.8734 --75.8875 --75.8859 --75.8781 --75.8812 --75.8922 --75.8859 --75.8828 --75.8906 --75.8656 --75.8781 --75.8703 --75.8688 --75.8906 --75.875 --75.8875 --75.8766 --75.8844 --75.8594 --75.875 --75.8859 --75.8844 --75.8828 --75.8859 --75.8875 --75.8828 --75.8922 --75.8812 --75.8797 --75.8844 --75.8703 --75.8734 --75.8922 --75.8781 --75.8828 --75.8859 --75.8953 --75.8781 --75.8812 --75.8781 --75.8719 --75.8812 --75.8703 --75.8609 --75.8797 --75.8828 --75.8688 --75.8766 --75.8766 --75.8781 --75.8875 --75.8734 --75.8766 --75.875 --75.8812 --75.8891 --75.8781 --75.8812 --75.8719 --75.8766 --75.8797 --75.8844 --75.8812 --75.8703 --75.8734 --75.8656 --75.8688 --75.8797 --75.8703 --75.8719 --75.8828 --75.8797 --75.8703 --75.8734 --75.8719 --75.8734 --75.8672 --75.8578 --75.8688 --75.8797 --75.8516 --75.8672 --75.8656 --75.8703 --75.875 --75.8641 --75.8703 --75.8797 --75.8531 --75.8766 --75.8797 --75.8734 --75.8719 --75.8672 --75.8781 --75.8641 --75.8703 --75.8688 --75.8844 --75.8938 --75.8844 --75.8766 --75.8688 --75.8734 --75.8766 --75.8688 --75.8703 --75.8844 --75.8797 --75.8812 --75.8734 --75.8797 --75.8812 --75.8797 --75.8938 --75.8828 --75.8859 --75.875 --75.8859 --75.8797 --75.875 --75.8828 --75.8906 --75.8781 --75.8828 --75.8891 --75.8844 --75.8891 --75.8828 --75.8578 --75.8844 --75.875 --75.875 --75.8844 --75.8734 --75.8734 --75.8766 --75.8719 --75.8797 --75.8812 --75.8719 --75.8703 --75.8844 --75.8656 --75.8781 --75.8781 --75.8719 --75.8672 --75.8781 --75.8828 --75.8859 --75.8656 --75.8781 --75.8891 --75.8672 --75.8719 --75.8812 --75.8719 --75.8703 --75.8844 --75.8719 --75.8766 --75.8844 --75.8734 --75.8781 --75.8781 --75.8734 --75.8766 --75.8859 --75.8812 --75.8688 --75.8766 --75.8781 --75.8734 --75.8875 --75.8891 --75.8984 --75.8875 --75.8828 --75.8797 --75.8625 --75.8719 --75.8641 --75.8812 --75.8906 --75.8781 --75.8875 --75.8703 --75.8906 --75.8891 --75.8906 --75.875 --75.8859 --75.8734 --75.8781 --75.8797 --75.8891 --75.8797 --75.8906 --75.8859 --75.8859 --75.8922 --75.8859 --75.8766 --75.8938 --75.8906 --75.8766 --75.8859 --75.8719 --75.8969 --75.8906 --75.8969 --75.8938 --75.8891 --75.8984 --75.8891 --75.8859 --75.8953 --75.8875 --75.8859 --75.8859 --75.8922 --75.8859 --75.8984 --75.8891 --75.8938 --75.9016 --75.9031 --75.8875 --75.8891 --75.8938 --75.9016 --75.8891 --75.8906 --75.8844 --75.8938 --75.8812 --75.8859 --75.8859 --75.8812 --75.8781 --75.8812 --75.8797 --75.8984 --75.8812 --75.8797 --75.8828 --75.8953 --75.8859 --75.8781 --75.8812 --75.8844 --75.8844 --75.8859 --75.8875 --75.8906 --75.8938 --75.8844 --75.8797 --75.8828 --75.8906 --75.8797 --75.8891 --75.8906 --75.8828 --75.8703 --75.8844 --75.8891 --75.8875 --75.8781 --75.8922 --75.8766 --75.8766 --75.8672 --75.8766 --75.8672 --75.875 --75.8953 --75.8703 --75.8906 --75.8734 --75.8781 --75.8719 --75.8797 --75.8828 --75.8844 --75.8781 --75.8828 --75.8828 --75.8656 --75.8969 --75.8828 --75.8656 --75.8719 --75.8812 --75.8766 --75.8766 --75.8922 --75.8891 --75.8828 --75.8828 --75.8859 --75.8781 --75.9016 --75.8875 --75.8812 --75.8891 --75.8844 --75.8938 --75.8797 --75.8891 --75.8734 --75.875 --75.8938 --75.8797 --75.8859 --75.875 --75.8906 --75.8719 --75.8766 --75.8828 --75.8797 --75.8734 --75.8812 --75.8906 --75.8859 --75.8797 --75.9062 --75.8656 --75.8859 --75.8828 --75.8781 --75.8859 --75.8844 --75.8891 --75.8859 --75.8844 --75.8875 --75.8844 --75.8922 --75.8969 --75.8906 --75.8797 --75.8781 --75.8844 --75.9016 --75.8844 --75.8812 --75.8781 --75.8891 --75.8859 --75.8875 --75.8906 --75.8938 --75.8812 --75.8922 --75.8922 --75.8797 --75.8953 --75.8812 --75.9 --75.8891 --75.8844 --75.9031 --75.8969 --75.9109 --75.8969 --75.8953 --75.8969 --75.8875 --75.8953 --75.9078 --75.8844 --75.8859 --75.8906 --75.8875 --75.9031 --75.8875 --75.8875 --75.8859 --75.9047 --75.8953 --75.8859 --75.8953 --75.8891 --75.8797 --75.8859 --75.8797 --75.8875 --75.8844 --75.8953 --75.8766 --75.8875 --75.8828 --75.9 --75.8812 --75.8828 --75.8984 --75.8875 --75.8891 --75.8844 --75.8844 --75.8969 --75.8844 --75.8875 --75.8906 --75.8906 --75.8828 --75.8922 --75.8922 --75.8812 --75.8953 --75.875 --75.8781 --75.8828 --75.8828 --75.8906 --75.8875 --75.875 --75.8812 --75.8812 --75.8891 --75.8844 --75.8812 --75.8844 --75.8781 --75.8938 --75.8844 --75.8891 --75.8797 --75.8844 --75.8766 --75.8766 --75.8859 --75.8781 --75.8875 --75.8844 --75.8766 --75.8844 --75.8766 --75.8828 --75.8906 --75.8812 --75.8953 --75.8891 --75.9047 --75.8984 --75.9016 --75.8906 --75.8938 --75.8828 --75.8859 --75.8812 --75.8828 --75.8828 --75.8828 --75.8906 --75.8859 --75.8766 --75.875 --75.8766 --75.8781 --75.8859 --75.8891 --75.8891 --75.8797 --75.8906 --75.8969 --75.8703 --75.8859 --75.8844 --75.9031 --75.8812 --75.9078 --75.8953 --75.8797 --75.8812 --75.8938 --75.9078 --75.8891 --75.8922 --75.9031 --75.8828 --75.8953 --75.8891 --75.8672 --75.8906 --75.8828 --75.8844 --75.8891 --75.8891 --75.8844 --75.8875 --75.8922 --75.8891 --75.8688 --75.8797 --75.8953 --75.8875 --75.8828 --75.8766 --75.8797 --75.8859 --75.8906 --75.8938 --75.8938 --75.8922 --75.8938 --75.8938 --75.9047 --75.8922 --75.8953 --75.8922 --75.8844 --75.8969 --75.8891 --75.8922 --75.8938 --75.9 --75.8766 --75.8953 --75.8953 --75.8891 --75.8969 --75.8875 --75.8906 --75.9 --75.9047 --75.8969 --75.8844 --75.8938 --75.9031 --75.8859 --75.9 --75.8891 --75.9016 --75.8938 --75.8859 --75.8797 --75.8797 --75.8875 --75.8953 --75.8922 --75.8812 --75.8844 --75.8891 --75.8891 --75.8828 --75.8969 --75.8797 --75.8891 --75.8891 --75.8859 --75.8875 --75.8906 --75.8844 --75.8891 --75.8922 --75.8938 --75.8953 --75.8953 --75.8953 --75.8922 --75.8938 --75.9016 --75.8797 --75.8906 --75.8938 --75.8922 --75.8938 --75.8891 --75.8906 --75.8906 --75.8906 --75.8719 --75.8844 --75.8906 --75.8828 --75.8844 --75.8875 --75.8797 --75.875 --75.8875 --75.8922 --75.8828 --75.8891 --75.8969 --75.8812 --75.8922 --75.8969 --75.8844 --75.8828 --75.8812 --75.8844 --75.875 --75.8797 --75.8828 --75.8781 --75.8938 --75.8719 --75.8891 --75.8844 --75.8891 --75.8719 --75.8828 --75.8875 --75.8672 --75.8734 --75.8859 --75.8797 --75.8938 --75.8969 --75.8766 --75.8859 --75.8766 --75.8688 --75.8797 --75.8781 --75.8812 --75.8891 --75.8906 --75.8703 --75.8781 --75.8906 --75.8969 --75.8859 --75.8906 --75.8797 --75.8875 --75.8953 --75.8781 --75.8781 --75.8781 --75.8719 --75.8797 --75.8859 --75.8797 --75.8844 --75.8688 --75.8703 --75.8766 --75.8766 --75.8812 --75.8844 --75.8875 --75.8812 --75.8828 --75.8734 --75.8891 --75.8828 --75.8922 --75.8922 --75.9 --75.8844 --75.8844 --75.8922 --75.8859 --75.8703 --75.8766 --75.8719 --75.875 --75.8781 --75.8797 --75.8781 --75.8781 --75.8828 --75.8875 --75.8797 --75.8719 --75.8781 --75.8812 --75.875 --75.8844 --75.8875 --75.8828 --75.8969 --75.8828 --75.8875 --75.8906 --75.8875 --75.8969 --75.8844 --75.8891 --75.8812 --75.8938 --75.8922 --75.8969 --75.8875 --75.8828 --75.8891 --75.8969 --75.875 --75.8875 --75.8797 --75.8781 --75.8875 --75.8828 --75.8875 --75.8938 --75.8781 --75.875 --75.8828 --75.8859 --75.8828 --75.8891 --75.8766 --75.8859 --75.8891 --75.8844 --75.8922 --75.8969 --75.8797 --75.9031 --75.8812 --75.8812 --75.8797 --75.8781 --75.8844 --75.8734 --75.8922 --75.8844 --75.8859 --75.8875 --75.8969 --75.9016 --75.8797 --75.8891 --75.8969 --75.8938 --75.8938 --75.8875 --75.8891 --75.8938 --75.8766 --75.8969 --75.9078 --75.8906 --75.9016 --75.8922 --75.8828 --75.9031 --75.8922 --75.8859 --75.8875 --75.8953 --75.8891 --75.8875 --75.8906 --75.8891 --75.8938 --75.9 --75.8891 --75.9047 --75.9 --75.8875 --75.8812 --75.9016 --75.8875 --75.8922 --75.9 --75.8938 --75.8969 --75.8891 --75.8875 --75.8922 --75.9016 --75.8812 --75.8891 --75.8938 --75.8828 --75.8891 --75.8891 --75.8812 --75.8781 --75.8953 --75.8875 --75.8688 --75.8953 --75.8875 --75.8719 --75.8734 --75.8828 --75.8781 --75.8719 --75.8828 --75.8766 --75.8781 --75.8781 --75.8781 --75.8781 --75.8688 --75.8781 --75.8859 --75.8828 --75.8891 --75.9 --75.8766 --75.8906 --75.8906 --75.8797 --75.8734 --75.8781 --75.8844 --75.8766 --75.8781 --75.8812 --75.8641 --75.8844 --75.8703 --75.8672 --75.8766 --75.8828 --75.8641 --75.8859 --75.8672 --75.8859 --75.8625 --75.8812 --75.8766 --75.8812 --75.8922 --75.8859 --75.8688 --75.8891 --75.8828 --75.8891 --75.8906 --75.8734 --75.8859 --75.8844 --75.8828 --75.8766 --75.8891 --75.8703 --75.8875 --75.8875 --75.8734 --75.8828 --75.8922 --75.8797 --75.8797 --75.8875 --75.8891 --75.8844 --75.8969 --75.8922 --75.8828 --75.8734 --75.8844 --75.8891 --75.8891 --75.8969 --75.8938 --75.8828 --75.8906 --75.9031 --75.8891 --75.8859 --75.8906 --75.8938 --75.8891 --75.8781 --75.8922 --75.8766 --75.8797 --75.8891 --75.8734 --75.8844 --75.8906 --75.8766 --75.8797 --75.8812 --75.8844 --75.8906 --75.8938 --75.8844 --75.8828 --75.8734 --75.8844 --75.8812 --75.8719 --75.8891 --75.8828 --75.8766 --75.8594 --75.8969 --75.8734 --75.8766 --75.8969 --75.8828 --75.8812 --75.8656 --75.8812 --75.8984 --75.8859 --75.8812 --75.875 --75.875 --75.8891 --75.8891 --75.8797 --75.8891 --75.8781 --75.8891 --75.8734 --75.8906 --75.8875 --75.8938 --75.8953 --75.8781 --75.8875 --75.8859 --75.8938 --75.8875 --75.8969 --75.8953 --75.8828 --75.9031 --75.8875 --75.8875 --75.8766 --75.8922 --75.8781 --75.8906 --75.8922 --75.8812 --75.8938 --75.8953 --75.9016 --75.9031 --75.9031 --75.8797 --75.8828 --75.9016 --75.9047 --75.8922 --75.8844 --75.8781 --75.875 --75.8844 --75.8969 --75.8938 --75.8953 --75.8938 --75.8891 --75.8828 --75.8922 --75.8828 --75.8906 --75.9 --75.8828 --75.8797 --75.8844 --75.8891 --75.8875 --75.8844 --75.8797 --75.8922 --75.8953 --75.9 --75.9 --75.8891 --75.9 --75.9047 --75.8938 --75.8969 --75.8969 --75.9 --75.8828 --75.8922 --75.8781 --75.8812 --75.8828 --75.8938 --75.8891 --75.8938 --75.8859 --75.8891 --75.8969 --75.8922 --75.8859 --75.8875 --75.8891 --75.8797 --75.8875 --75.8859 --75.8922 --75.8969 --75.8828 --75.8953 --75.8859 --75.8922 --75.8922 --75.8906 --75.8891 --75.8922 --75.9016 --75.8844 --75.8984 --75.9078 --75.9078 --75.8938 --75.8953 --75.9 --75.8969 --75.8922 --75.8906 --75.9016 --75.9 --75.8969 --75.8906 --75.9031 --75.9031 --75.8984 --75.9016 --75.8891 --75.8938 --75.8906 --75.9016 --75.9016 --75.9062 --75.8938 --75.8953 --75.8984 --75.8859 --75.9 --75.9016 --75.8938 --75.8922 --75.8922 --75.8891 --75.8875 --75.8984 --75.8938 --75.8953 --75.9047 --75.8969 --75.8859 --75.9 --75.8953 --75.9 --75.9109 --75.8891 --75.8938 --75.9047 --75.8953 --75.9016 --75.8906 --75.8969 --75.8906 --75.8953 --75.8969 --75.8781 --75.8938 --75.8922 --75.8969 --75.8875 --75.8859 --75.8906 --75.8859 --75.8859 --75.8766 --75.8906 --75.8828 --75.8906 --75.8922 --75.8984 --75.8781 --75.9 --75.8891 --75.8875 --75.8969 --75.8891 --75.8828 --75.8812 --75.8844 --75.8891 --75.8938 --75.8797 --75.8828 --75.9031 --75.8859 --75.8984 --75.8953 --75.8797 --75.875 --75.8797 --75.8844 --75.8906 --75.8812 --75.8891 --75.8844 --75.8891 --75.8797 --75.9 --75.8938 --75.8938 --75.8953 --75.8891 --75.8812 --75.8844 --75.8953 --75.875 --75.8844 --75.8906 --75.8828 --75.8875 --75.8797 --75.8844 --75.8875 --75.8875 --75.8953 --75.8922 --75.8781 --75.8891 --75.8938 --75.8734 --75.8891 --75.8875 --75.9 --75.8922 --75.9047 --75.8859 --75.8891 --75.8844 --75.8891 --75.9062 --75.8984 --75.8906 --75.9016 --75.8938 --75.8859 --75.8938 --75.8797 --75.8812 --75.9078 --75.8797 --75.9 --75.8953 --75.8891 --75.9 --75.8844 --75.8875 --75.9125 --75.9094 --75.8953 --75.8812 --75.8844 --75.9016 --75.9 --75.8938 --75.9 --75.8984 --75.9125 --75.8906 --75.8984 --75.9031 --75.8859 --75.8891 --75.8828 --75.8797 --75.8797 --75.8891 --75.8984 --75.8984 --75.9016 --75.9047 --75.8969 --75.8875 --75.8969 --75.9 --75.8891 --75.8969 --75.8781 --75.8859 --75.8797 --75.9 --75.8906 --75.8906 --75.8984 --75.8766 --75.9062 --75.8953 --75.8766 --75.8859 --75.8844 --75.9 --75.9 --75.8906 --75.875 --75.8953 --75.8703 --75.8891 --75.8891 --75.9 --75.875 --75.875 --75.8875 --75.8844 --75.8969 --75.8844 --75.8875 --75.8844 --75.8891 --75.8797 --75.8812 --75.8719 --75.8766 --75.8797 --75.8812 --75.8891 --75.8797 --75.9031 --75.8766 --75.8844 --75.8906 --75.8828 --75.8984 --75.8828 --75.8891 --75.8844 --75.8828 --75.8812 --75.8812 --75.8906 --75.8969 --75.9 --75.8766 --75.8812 --75.8781 --75.8859 --75.8891 --75.8844 --75.8844 --75.8797 --75.8875 --75.8766 --75.8906 --75.8906 --75.8938 --75.8797 --75.8891 --75.8969 --75.8812 --75.8828 --75.8844 --75.8828 --75.8828 --75.8922 --75.8953 --75.8859 --75.8875 --75.8828 --75.8906 --75.8875 --75.8828 --75.8766 --75.8922 --75.8828 --75.875 --75.8922 --75.8938 --75.8828 --75.8922 --75.8922 --75.8781 --75.8969 --75.9047 --75.8922 --75.9047 --75.8953 --75.8859 --75.8953 --75.8969 --75.8984 --75.8828 --75.8766 --75.8719 --75.8891 --75.9016 --75.8938 --75.8906 --75.8859 --75.8859 --75.8969 --75.9 --75.8859 --75.8953 --75.8922 --75.875 --75.8906 --75.8891 --75.8953 --75.8906 --75.8781 --75.8734 --75.8828 --75.8797 --75.8797 --75.8938 --75.8766 --75.8766 --75.8812 --75.8781 --75.8922 --75.8906 --75.875 --75.8938 --75.8828 --75.8844 --75.8875 --75.875 --75.8969 --75.8781 --75.8891 --75.8906 --75.8938 --75.8781 --75.8875 --75.8953 --75.8984 --75.8891 --75.8953 --75.8953 --75.8844 --75.8938 --75.8938 --75.8844 --75.8906 --75.8906 --75.8781 --75.8828 --75.8906 --75.8828 --75.8922 --75.8859 --75.8938 --75.8844 --75.8875 --75.8812 --75.8719 --75.8922 --75.8891 --75.8953 --75.8891 --75.8969 --75.8766 --75.8828 --75.8781 --75.8781 --75.8797 --75.8953 --75.8828 --75.8859 --75.8922 --75.8656 --75.8672 --75.8859 --75.8922 --75.8781 --75.8766 --75.8859 --75.8859 --75.8906 --75.8844 --75.8844 --75.8781 --75.8891 --75.8812 --75.8766 --75.8688 --75.8719 --75.8812 --75.8719 --75.8766 --75.8875 --75.8953 --75.8906 --75.8766 --75.8922 --75.8922 --75.8906 --75.8906 --75.8906 --75.8984 --75.8906 --75.8984 --75.9062 --75.9047 --75.8922 --75.8906 --75.8844 --75.8891 --75.9 --75.8969 --75.8906 --75.8891 --75.8812 --75.8812 --75.8891 --75.8672 --75.8844 --75.8797 --75.8781 --75.8938 --75.8828 --75.8844 --75.8891 --75.8922 --75.8766 --75.8797 --75.8812 --75.8828 --75.8922 --75.8859 --75.9016 --75.8969 --75.8922 --75.8906 --75.8828 --75.8969 --75.8875 --75.8891 --75.8734 --75.9031 --75.8984 --75.8906 --75.8984 --75.8922 --75.8844 --75.8891 --75.8875 --75.8922 --75.8859 --75.8922 --75.8734 --75.8797 --75.8828 --75.8688 --75.8844 --75.8766 --75.8891 --75.8859 --75.8688 --75.875 --75.8922 --75.8797 --75.8797 --75.8906 --75.8719 --75.8812 --75.8875 --75.8734 --75.8812 --75.8953 --75.8906 --75.8859 --75.8797 --75.9031 --75.8984 --75.8922 --75.8828 --75.8703 --75.8969 --75.8891 --75.8906 --75.8953 --75.8812 --75.8922 --75.9031 --75.8938 --75.9078 --75.8844 --75.8766 --75.8844 --75.8828 --75.8969 --75.8953 --75.8844 --75.8859 --75.8984 --75.9062 --75.8766 --75.9 --75.9016 --75.8797 --75.8922 --75.8828 --75.8891 --75.8703 --75.8891 --75.8891 --75.8938 --75.8969 --75.8906 --75.8891 --75.8953 --75.8891 --75.8922 --75.8969 --75.8953 --75.8953 --75.9031 --75.8984 --75.8953 --75.8984 --75.9 --75.8891 --75.8875 --75.8875 --75.8922 --75.8859 --75.8766 --75.8922 --75.8859 --75.8984 --75.8906 --75.8875 --75.8875 --75.8922 --75.8875 --75.8828 --75.8875 --75.8875 --75.8938 --75.8953 --75.8797 --75.8906 --75.9 --75.8906 --75.8953 --75.8984 --75.8859 --75.8906 --75.9078 --75.8922 --75.8906 --75.8922 --75.8797 --75.8953 --75.8812 --75.8859 --75.8938 --75.8953 --75.9062 --75.8953 --75.9 --75.8844 --75.8875 --75.9062 --75.9031 --75.8812 --75.8953 --75.9 --75.8891 --75.8984 --75.8969 --75.8891 --75.8969 --75.8875 --75.8891 --75.8969 --75.8906 --75.8953 --75.8938 --75.8953 --75.8812 --75.9031 --75.8875 --75.8844 --75.8938 --75.8906 --75.9047 --75.8906 --75.8812 --75.8922 --75.8891 --75.8938 --75.8938 --75.8984 --75.8906 --75.8922 --75.8969 --75.9 --75.8906 --75.9 --75.8969 --75.9016 --75.8969 --75.8844 --75.8969 --75.8922 --75.8953 --75.8891 --75.9078 --75.8938 --75.8922 --75.9031 --75.9047 --75.8984 --75.9047 --75.9062 --75.8953 --75.9047 --75.9031 --75.8938 --75.9031 --75.8859 --75.8891 --75.8891 --75.8859 --75.8984 --75.9016 --75.9062 --75.9047 --75.8969 --75.8812 --75.8953 --75.8984 --75.8844 --75.8922 --75.8875 --75.9 --75.8922 --75.8891 --75.8953 --75.8984 --75.9031 --75.8984 --75.9 --75.8953 --75.8859 --75.9062 --75.8922 --75.8922 --75.8953 --75.9016 --75.9031 --75.8938 --75.8891 --75.9047 --75.8844 --75.8969 --75.8969 --75.9062 --75.9047 --75.9047 --75.8984 --75.9031 --75.8891 --75.9062 --75.9047 --75.9 --75.8875 --75.8938 --75.9016 --75.8984 --75.8969 --75.8891 --75.9 --75.8859 --75.8906 --75.8922 --75.8891 --75.8922 --75.8922 --75.8812 --75.8906 --75.8828 --75.8859 --75.8953 --75.8984 --75.8984 --75.8938 --75.8938 --75.8875 --75.9016 --75.8891 --75.8844 --75.8969 --75.9031 --75.9047 --75.8906 --75.8984 --75.8922 --75.8969 --75.8891 --75.9031 --75.8984 --75.8812 --75.8875 --75.8984 --75.8875 --75.8906 --75.8875 --75.8938 --75.8891 --75.8891 --75.8906 --75.8859 --75.8859 --75.9062 --75.8906 --75.8828 --75.8891 --75.8953 --75.8922 --75.9016 --75.8891 --75.8969 --75.8906 --75.8922 --75.875 --75.8938 --75.8938 --75.8875 --75.8859 --75.8969 --75.9 --75.8891 --75.8984 --75.8891 --75.8938 --75.8891 --75.8891 --75.8953 --75.8859 --75.8859 --75.8828 --75.8969 --75.8812 --75.9 --75.8891 --75.8766 --75.8859 --75.8906 --75.9016 --75.8906 --75.8844 --75.8906 --75.8844 --75.8953 --75.8844 --75.8859 --75.8953 --75.8953 --75.8922 --75.8984 --75.8875 --75.8938 --75.8922 --75.8766 --75.8891 --75.8938 --75.8781 --75.8859 --75.8828 --75.8938 --75.8859 --75.8891 --75.8938 --75.9031 --75.8859 --75.8812 --75.8844 --75.8875 --75.8859 --75.8812 --75.8812 --75.8766 --75.8875 --75.8781 --75.8938 --75.8938 --75.8844 --75.8875 --75.8984 --75.8984 --75.8922 --75.8875 --75.8812 --75.8797 --75.8859 --75.8859 --75.8844 --75.8828 --75.8922 --75.8891 --75.8906 --75.8938 --75.8891 --75.8828 --75.8844 --75.8859 --75.8828 --75.8766 --75.8984 --75.8875 --75.8828 --75.8969 --75.8953 --75.8922 --75.8969 --75.8969 --75.8906 --75.8875 --75.8734 --75.8797 --75.8891 --75.8906 --75.8797 --75.8906 --75.8844 --75.8828 --75.8781 --75.9 --75.8797 --75.8828 --75.8781 --75.8844 --75.8781 --75.8859 --75.8766 --75.8875 --75.8781 --75.8797 --75.8766 --75.8922 --75.8969 --75.8828 --75.8719 --75.8938 --75.8812 --75.8891 --75.8922 --75.8766 --75.8953 --75.8844 --75.8984 --75.8953 --75.8953 --75.8953 --75.8906 --75.9016 --75.8797 --75.8812 --75.8906 --75.8969 --75.8812 --75.8891 --75.8938 --75.8922 --75.8922 --75.8953 --75.9047 --75.8922 --75.8922 --75.8719 --75.8875 --75.8922 --75.8891 --75.8875 --75.9016 --75.8953 --75.8938 --75.8891 --75.9141 --75.9 --75.9031 --75.8984 --75.9141 --75.8938 --75.8938 --75.9016 --75.9 --75.8953 --75.9016 --75.8891 --75.8875 --75.9047 --75.8906 --75.9062 --75.8969 --75.8891 --75.9 --75.8891 --75.8953 --75.8891 --75.8703 --75.8906 --75.8922 --75.8812 --75.8875 --75.8875 --75.8953 --75.8984 --75.8906 --75.8891 --75.8938 --75.8859 --75.8953 --75.9016 --75.9016 --75.8922 --75.8984 --75.8891 --75.9 --75.9 --75.8953 --75.8922 --75.8969 --75.8984 --75.8859 --75.8922 --75.8984 --75.8984 --75.8797 --75.8812 --75.9 --75.8938 --75.8953 --75.8859 --75.8844 --75.8906 --75.8906 --75.8797 --75.8844 --75.8953 --75.8844 --75.8875 --75.8891 --75.8891 --75.8906 --75.8953 --75.8875 --75.9062 --75.9047 --75.9016 --75.8938 --75.9 --75.8969 --75.8906 --75.8938 --75.8812 --75.9 --75.8875 --75.8969 --75.8891 --75.8875 --75.8922 --75.9 --75.8922 --75.8938 --75.8828 --75.8953 --75.8953 --75.8875 --75.9 --75.9062 --75.9016 --75.9078 --75.9 --75.8891 --75.9 --75.8953 --75.9078 --75.8969 --75.9031 --75.9016 --75.9 --75.8859 --75.8844 --75.9031 --75.9 --75.8938 --75.8922 --75.9109 --75.8938 --75.8844 --75.9141 --75.8984 --75.8953 --75.9 --75.9031 --75.8984 --75.8984 --75.9047 --75.9016 --75.9078 --75.9047 --75.9062 --75.9078 --75.9172 --75.9047 --75.9078 --75.8812 --75.8922 --75.9047 --75.9078 --75.8984 --75.8922 --75.9031 --75.9109 --75.9031 --75.9047 --75.9016 --75.8953 --75.9062 --75.8969 --75.8969 --75.8953 --75.9 --75.8984 --75.8969 --75.9141 --75.9125 --75.9031 --75.925 --75.9 --75.8984 --75.9047 --75.9031 --75.9016 --75.9078 --75.9062 --75.9125 --75.9094 --75.9094 --75.9047 --75.9016 --75.9187 --75.9109 --75.9094 --75.8984 --75.9016 --75.9094 --75.9 --75.9094 --75.9016 --75.8953 --75.8953 --75.8891 --75.8922 --75.8969 --75.9125 --75.8969 --75.9094 --75.9031 --75.9141 --75.9016 --75.8984 --75.8953 --75.9031 --75.8922 --75.9 --75.8891 --75.9062 --75.8844 --75.8875 --75.8969 --75.8875 --75.8875 --75.8984 --75.8891 --75.8969 --75.8969 --75.9031 --75.8875 --75.8859 --75.8891 --75.8984 --75.9016 --75.8906 --75.8859 --75.8859 --75.8938 --75.8859 --75.8969 --75.8938 --75.8906 --75.8969 --75.8969 --75.8781 --75.9016 --75.9078 --75.8859 --75.9 --75.8969 --75.8891 --75.8891 --75.8922 --75.8891 --75.8859 --75.8969 --75.8938 --75.8906 --75.9 --75.9016 --75.8953 --75.9 --75.8984 --75.8922 --75.8953 --75.8906 --75.9 --75.8859 --75.8922 --75.8953 --75.8938 --75.9016 --75.8938 --75.8828 --75.8969 --75.9062 --75.8969 --75.8938 --75.8938 --75.8844 --75.9094 --75.8984 --75.8953 --75.8984 --75.9 --75.9031 --75.9062 --75.8812 --75.8906 --75.8969 --75.9094 --75.8906 --75.8922 --75.8969 --75.9031 --75.9016 --75.9031 --75.8953 --75.8859 --75.9 --75.8953 --75.8969 --75.8906 --75.9078 --75.9 --75.9031 --75.8953 --75.8922 --75.9016 --75.9109 --75.9031 --75.9 --75.9062 --75.8953 --75.8953 --75.9078 --75.8969 --75.8953 --75.8969 --75.8812 --75.8922 --75.8875 --75.8938 --75.8953 --75.8969 --75.8938 --75.8906 --75.9125 --75.8969 --75.8844 --75.8859 --75.8906 --75.9062 --75.8984 --75.9047 --75.8938 --75.8969 --75.8953 --75.8938 --75.8938 --75.9 --75.875 --75.9016 --75.8938 --75.8828 --75.8844 --75.8891 --75.8906 --75.8953 --75.8859 --75.8984 --75.8797 --75.8969 --75.8875 --75.8875 --75.8797 --75.8859 --75.8906 --75.8828 --75.8828 --75.8781 --75.9016 --75.8797 --75.8891 --75.8797 --75.8922 --75.8828 --75.8891 --75.8969 --75.8828 --75.8938 --75.8734 --75.8891 --75.8844 --75.875 --75.8906 --75.875 --75.8859 --75.8859 --75.8828 --75.8812 --75.9 --75.8844 --75.8906 --75.8969 --75.875 --75.8844 --75.8969 --75.8781 --75.9094 --75.8969 --75.8922 --75.8844 --75.8969 --75.9 --75.9062 --75.8969 --75.8891 --75.9047 --75.8891 --75.8828 --75.9109 --75.8938 --75.8891 --75.8969 --75.8938 --75.8812 --75.8875 --75.8812 --75.8938 --75.8828 --75.9016 --75.8844 --75.8984 --75.8922 --75.8844 --75.8938 --75.8938 --75.8938 --75.8844 --75.8922 --75.8844 --75.9016 --75.8953 --75.8906 --75.8953 --75.8953 --75.8984 --75.8812 --75.8969 --75.8906 --75.8844 --75.8844 --75.8812 --75.8797 --75.8984 --75.8938 --75.8984 --75.8984 --75.9266 --75.9 --75.8906 --75.9062 --75.8953 --75.9062 --75.9047 --75.8812 --75.8875 --75.8969 --75.8844 --75.8906 --75.8969 --75.9031 --75.8906 --75.8891 --75.8812 --75.8969 --75.8969 --75.8859 --75.8797 --75.8828 --75.8953 --75.9047 --75.9141 --75.8969 --75.8906 --75.8844 --75.9 --75.9031 --75.9 --75.8953 --75.9 --75.8844 --75.8953 --75.9031 --75.9062 --75.8781 --75.8844 --75.9031 --75.8953 --75.9062 --75.8969 --75.8953 --75.9062 --75.9047 --75.9031 --75.8953 --75.9047 --75.8938 --75.9 --75.8922 --75.8969 --75.8844 --75.8938 --75.8922 --75.8844 --75.8828 --75.8859 --75.8906 --75.8875 --75.8953 --75.9016 --75.9172 --75.8906 --75.8969 --75.8844 --75.8969 --75.8891 --75.8891 --75.8922 --75.9 --75.9016 --75.9109 --75.8922 --75.8984 --75.9125 --75.9047 --75.9078 --75.8953 --75.9 --75.9047 --75.9047 --75.9 --75.8984 --75.9078 --75.9031 --75.9016 --75.9031 --75.9031 --75.9 --75.9031 --75.9187 --75.8859 --75.8906 --75.9 --75.8906 --75.9125 --75.8859 --75.8969 --75.9109 --75.8938 --75.9078 --75.9 --75.9016 --75.8906 --75.8953 --75.9047 --75.8734 --75.9078 --75.8844 --75.9078 --75.9 --75.9187 --75.9031 --75.9156 --75.9062 --75.8922 --75.9047 --75.9016 --75.9094 --75.9 --75.9031 --75.9062 --75.9109 --75.8922 --75.9031 --75.8984 --75.8922 --75.8891 --75.8906 --75.9047 --75.8891 --75.8953 --75.8922 --75.8953 --75.9016 --75.8969 --75.8938 --75.8984 --75.8922 --75.8984 --75.9078 --75.8906 --75.8953 --75.9031 --75.9016 --75.8875 --75.8938 --75.875 --75.8969 --75.8922 --75.8828 --75.8859 --75.8875 --75.875 --75.8922 --75.8906 --75.8734 --75.8875 --75.8797 --75.8859 --75.8781 --75.8891 --75.8859 --75.875 --75.8891 --75.8906 --75.8906 --75.8859 --75.8875 --75.8984 --75.8859 --75.8875 --75.8859 --75.875 --75.8766 --75.8797 --75.8984 --75.8812 --75.8938 --75.8922 --75.8797 --75.8984 --75.8859 --75.8781 --75.8906 --75.8828 --75.8875 --75.8953 --75.875 --75.8891 --75.8953 --75.9016 --75.8859 --75.9016 --75.8828 --75.8859 --75.8719 --75.8891 --75.8891 --75.8859 --75.8875 --75.8812 --75.8734 --75.8906 --75.8875 --75.8844 --75.9062 --75.8797 --75.8891 --75.8938 --75.8953 --75.9031 --75.8906 --75.9016 --75.8844 --75.8891 --75.9016 --75.8875 --75.9047 --75.8891 --75.8922 --75.8844 --75.8812 --75.8984 --75.8844 --75.8781 --75.8875 --75.8828 --75.8859 --75.8938 --75.8859 --75.8781 --75.8906 --75.9031 --75.8828 --75.8891 --75.8891 --75.8859 --75.8828 --75.8953 --75.9 --75.9031 --75.8891 --75.8766 --75.8938 --75.8875 --75.9016 --75.8906 --75.8781 --75.8891 --75.9016 --75.8953 --75.9 --75.8844 --75.8891 --75.8875 --75.8984 --75.8906 --75.9031 --75.8984 --75.8953 --75.8953 --75.9 --75.8875 --75.9031 --75.8906 --75.8875 --75.8875 --75.8969 --75.8891 --75.8922 --75.9062 --75.8734 --75.9 --75.9125 --75.8969 --75.9141 --75.8875 --75.8938 --75.8938 --75.9031 --75.8969 --75.9 --75.8969 --75.8984 --75.8922 --75.8969 --75.8906 --75.9094 --75.9125 --75.9047 --75.8922 --75.9094 --75.9125 --75.9016 --75.8984 --75.9031 --75.8969 --75.9109 --75.8906 --75.9062 --75.9016 --75.9 --75.9 --75.8969 --75.9 --75.9 --75.8891 --75.8969 --75.8906 --75.8859 --75.8969 --75.9094 --75.8953 --75.8969 --75.8891 --75.8922 --75.8859 --75.8906 --75.9 --75.8938 --75.8953 --75.8984 --75.9047 --75.8906 --75.8812 --75.9031 --75.9 --75.9016 --75.8969 --75.8984 --75.8984 --75.8844 --75.8766 --75.9016 --75.8953 --75.9031 --75.8859 --75.9031 --75.8984 --75.8953 --75.8969 --75.8969 --75.8891 --75.8859 --75.8953 --75.8906 --75.8984 --75.8875 --75.8828 --75.8875 --75.8922 --75.8844 --75.9047 --75.8891 --75.8859 --75.9 --75.8969 --75.8812 --75.8953 --75.8984 --75.8906 --75.9062 --75.8859 --75.8891 --75.9094 --75.8875 --75.8938 --75.8875 --75.8859 --75.8891 --75.8938 --75.8859 --75.8906 --75.8922 --75.8688 --75.8844 --75.8844 --75.8891 --75.8766 --75.8875 --75.8844 --75.8781 --75.8859 --75.8906 --75.9047 --75.8922 --75.8766 --75.8797 --75.8812 --75.8906 --75.8891 --75.9 --75.8812 --75.8953 --75.8828 --75.875 --75.8859 --75.8953 --75.8906 --75.8984 --75.8859 --75.8828 --75.9031 --75.8906 --75.8953 --75.9031 --75.8891 --75.8922 --75.8828 --75.8922 --75.8984 --75.8891 --75.9 --75.8828 --75.8891 --75.8781 --75.8906 --75.9016 --75.8922 --75.8953 --75.9047 --75.9047 --75.8984 --75.8984 --75.9031 --75.9016 --75.9016 --75.8891 --75.8875 --75.9109 --75.8859 --75.8906 --75.8812 --75.8844 --75.9031 --75.8906 --75.8938 --75.9016 --75.8984 --75.8938 --75.8984 --75.9031 --75.8922 --75.9031 --75.8922 --75.8922 --75.9031 --75.8922 --75.9031 --75.9016 --75.9062 --75.8938 --75.9109 --75.9 --75.9 --75.9016 --75.8969 --75.9016 --75.8953 --75.8812 --75.8828 --75.8938 --75.8938 --75.8984 --75.8969 --75.8906 --75.9 --75.9 --75.9031 --75.9031 --75.8984 --75.9 --75.9062 --75.8969 --75.8891 --75.8922 --75.8875 --75.8984 --75.9031 --75.9047 --75.8953 --75.8891 --75.8828 --75.9016 --75.8891 --75.8984 --75.9 --75.8875 --75.8938 --75.8875 --75.8859 --75.8859 --75.8875 --75.9 --75.9 --75.8891 --75.8984 --75.8922 --75.8875 --75.8953 --75.8984 --75.8891 --75.8953 --75.8906 --75.9047 --75.8906 --75.8906 --75.8969 --75.875 --75.8969 --75.8984 --75.8797 --75.8906 --75.8922 --75.9016 --75.8859 --75.8938 --75.8875 --75.8875 --75.8953 --75.9 --75.9031 --75.8906 --75.8922 --75.8859 --75.8875 --75.8797 --75.8969 --75.8938 --75.8938 --75.8891 --75.8984 --75.9062 --75.8859 --75.8812 --75.8984 --75.8828 --75.8969 --75.8875 --75.8906 --75.9031 --75.8953 --75.9016 --75.9016 --75.8969 --75.9125 --75.9031 --75.8938 --75.9109 --75.8906 --75.8938 --75.9109 --75.9062 --75.9 --75.8969 --75.8984 --75.9062 --75.9125 --75.9047 --75.8984 --75.8922 --75.9062 --75.9078 --75.9016 --75.9016 --75.9125 --75.9094 --75.9062 --75.9031 --75.9047 --75.9 --75.8969 --75.8828 --75.8984 --75.8875 --75.9109 --75.8984 --75.8891 --75.9016 --75.8969 --75.9047 --75.8891 --75.9062 --75.9047 --75.9016 --75.8922 --75.9 --75.8969 --75.9062 --75.9078 --75.9016 --75.8953 --75.8922 --75.9047 --75.9141 --75.9 --75.8891 --75.9062 --75.9078 --75.9 --75.9047 --75.9109 --75.9062 --75.9078 --75.8984 --75.9109 --75.9094 --75.8984 --75.8938 --75.9047 --75.9047 --75.9047 --75.8953 --75.9 --75.8969 --75.8922 --75.9016 --75.9016 --75.9031 --75.9 --75.9 --75.8969 --75.8984 --75.9016 --75.8969 --75.9047 --75.8984 --75.8875 --75.9078 --75.8969 --75.9031 --75.9062 --75.9109 --75.8891 --75.9078 --75.9016 --75.9031 --75.8984 --75.8938 --75.9109 --75.8953 --75.9062 --75.9109 --75.9016 --75.8953 --75.9078 --75.9016 --75.8984 --75.9031 --75.9156 --75.9016 --75.9109 --75.9125 --75.8984 --75.9141 --75.9109 --75.9062 --75.9156 --75.9172 --75.9016 --75.9016 --75.9047 --75.9109 --75.8938 --75.8766 --75.9031 --75.8953 --75.8875 --75.9078 --75.8828 --75.9047 --75.8844 --75.9031 --75.8891 --75.8969 --75.8922 --75.8906 --75.8984 --75.9031 --75.9047 --75.8984 --75.8938 --75.9062 --75.9109 --75.9078 --75.9141 --75.9156 --75.9062 --75.9062 --75.9078 --75.9156 --75.9 --75.9109 --75.9062 --75.9 --75.8984 --75.9125 --75.9062 --75.9109 --75.9 --75.9 --75.9109 --75.8922 --75.9 --75.8984 --75.9078 --75.9078 --75.8906 --75.9109 --75.8984 --75.9109 --75.9141 --75.9047 --75.8984 --75.8938 --75.8984 --75.8906 --75.9031 --75.9094 --75.8984 --75.8984 --75.9016 --75.9094 --75.9062 --75.8891 --75.9062 --75.8984 --75.9109 --75.8984 --75.9078 --75.9016 --75.8906 --75.9062 --75.9062 --75.9 --75.9156 --75.8891 --75.8828 --75.9078 --75.8906 --75.8953 --75.8984 --75.9016 --75.9 --75.9047 --75.9125 --75.9109 --75.9016 --75.9 --75.9016 --75.9047 --75.9094 --75.9078 --75.9062 --75.9094 --75.8969 --75.9016 --75.9109 --75.9219 --75.9016 --75.9109 --75.9094 --75.9141 --75.9109 --75.9 --75.9109 --75.9219 --75.8984 --75.8969 --75.8969 --75.8844 --75.8938 --75.8953 --75.9047 --75.9062 --75.9031 --75.8875 --75.8984 --75.9 --75.9031 --75.8969 --75.8984 --75.8734 --75.8859 --75.9031 --75.9062 --75.8922 --75.9 --75.9 --75.8875 --75.8891 --75.8922 --75.8875 --75.8906 --75.9047 --75.8891 --75.8844 --75.9016 --75.8938 --75.8875 --75.8953 --75.8922 --75.8922 --75.8984 --75.9062 --75.8859 --75.8953 --75.8953 --75.8953 --75.8922 --75.8906 --75.8984 --75.8891 --75.8938 --75.8922 --75.8969 --75.8922 --75.8891 --75.9047 --75.8844 --75.8953 --75.9062 --75.8844 --75.9 --75.8938 --75.8906 --75.9078 --75.8828 --75.8938 --75.8938 --75.9016 --75.8906 --75.8938 --75.8844 --75.9016 --75.8969 --75.8859 --75.8953 --75.8953 --75.8938 --75.9125 --75.8922 --75.9062 --75.8922 --75.8984 --75.8812 --75.8938 --75.8891 --75.9109 --75.8844 --75.9047 --75.8906 --75.9016 --75.8891 --75.8922 --75.8859 --75.9 --75.8938 --75.8906 --75.9016 --75.9016 --75.9016 --75.9094 --75.8984 --75.9016 --75.8922 --75.8938 --75.9031 --75.9109 --75.9125 --75.9031 --75.9 --75.9062 --75.9078 --75.9172 --75.9 --75.9047 --75.9078 --75.9047 --75.9047 --75.9141 --75.9062 --75.9031 --75.9109 --75.8922 --75.8906 --75.9078 --75.9047 --75.9219 --75.9109 --75.8953 --75.8984 --75.8969 --75.8953 --75.9047 --75.9016 --75.9 --75.9016 --75.9047 --75.9078 --75.9 --75.9141 --75.9109 --75.8984 --75.9031 --75.9031 --75.9031 --75.9094 --75.8984 --75.9187 --75.9125 --75.9172 --75.9062 --75.9234 --75.9125 --75.9156 --75.9094 --75.9187 --75.9078 --75.9062 --75.9094 --75.9203 --75.9156 --75.9234 --75.9047 --75.9031 --75.9219 --75.9016 --75.9172 --75.9156 --75.9203 --75.9187 --75.9078 --75.9094 --75.9141 --75.9031 --75.9172 --75.9094 --75.9141 --75.9203 --75.9125 --75.9125 --75.9156 --75.9109 --75.9156 --75.9109 --75.9031 --75.9031 --75.9203 --75.9125 --75.9141 --75.8953 --75.8953 --75.9078 --75.8938 --75.8953 --75.9047 --75.9125 --75.9047 --75.8938 --75.8953 --75.9016 --75.9 --75.8922 --75.9062 --75.9047 --75.8938 --75.8969 --75.9125 --75.9062 --75.9141 --75.9094 --75.9156 --75.9016 --75.9156 --75.9203 --75.9062 --75.9078 --75.9094 --75.9016 --75.9125 --75.9031 --75.8953 --75.9 --75.9078 --75.8969 --75.8984 --75.8938 --75.8969 --75.8969 --75.8922 --75.9016 --75.8969 --75.9141 --75.8875 --75.9156 --75.9156 --75.8984 --75.9016 --75.9062 --75.9016 --75.8984 --75.9 --75.9094 --75.8969 --75.9062 --75.9 --75.8891 --75.9156 --75.8953 --75.9016 --75.9141 --75.9062 --75.9062 --75.9031 --75.9109 --75.9125 --75.9109 --75.9 --75.9031 --75.9078 --75.8984 --75.9125 --75.9031 --75.9203 --75.9094 --75.9047 --75.9016 --75.8844 --75.9109 --75.8844 --75.9125 --75.9109 --75.8938 --75.8984 --75.8938 --75.9031 --75.9203 --75.9 --75.9078 --75.9047 --75.9078 --75.8953 --75.9219 --75.9 --75.9156 --75.9047 --75.9 --75.8953 --75.8984 --75.8984 --75.9078 --75.9094 --75.9 --75.8984 --75.8922 --75.8859 --75.8969 --75.8938 --75.9 --75.9203 --75.9078 --75.9 --75.9047 --75.9094 --75.9125 --75.9062 --75.9125 --75.9219 --75.9047 --75.9109 --75.9203 --75.9141 --75.9203 --75.9125 --75.9141 --75.9234 --75.9125 --75.9031 --75.9016 --75.8922 --75.9125 --75.9141 --75.9047 --75.8922 --75.9203 --75.9109 --75.9141 --75.9094 --75.8953 --75.9109 --75.8984 --75.9281 --75.9109 --75.9016 --75.9078 --75.9016 --75.8891 --75.9219 --75.9109 --75.8969 --75.9062 --75.9141 --75.9094 --75.9125 --75.9156 --75.9016 --75.9219 --75.9109 --75.9156 --75.9203 --75.9016 --75.9016 --75.9094 --75.9156 --75.9047 --75.8969 --75.9031 --75.9187 --75.9156 --75.9141 --75.9156 --75.9078 --75.9047 --75.9187 --75.9125 --75.9156 --75.9062 --75.9141 --75.9172 --75.9203 --75.9078 --75.9203 --75.9125 --75.9125 --75.9172 --75.9078 --75.9125 --75.9031 --75.9078 --75.9156 --75.8984 --75.9203 --75.9094 --75.9172 --75.9141 --75.9219 --75.9109 --75.9172 --75.9141 --75.9109 --75.9203 --75.9125 --75.9172 --75.9172 --75.9125 --75.9156 --75.9094 --75.9156 --75.9172 --75.9141 --75.9187 --75.9125 --75.9109 --75.9172 --75.9219 --75.9234 --75.9187 --75.9187 --75.9234 --75.9219 --75.9266 --75.9141 --75.9187 --75.9187 --75.9109 --75.9266 --75.9297 --75.9187 --75.9187 --75.9125 --75.9234 --75.9234 --75.9219 --75.9141 --75.9125 --75.9 --75.9297 --75.9078 --75.9187 --75.9234 --75.9125 --75.9187 --75.9203 --75.9141 --75.9172 --75.9141 --75.9109 --75.8938 --75.9109 --75.9109 --75.9125 --75.8984 --75.9016 --75.9172 --75.9141 --75.9094 --75.9125 --75.9078 --75.9203 --75.9062 --75.9109 --75.9078 --75.9125 --75.9016 --75.9156 --75.9187 --75.9156 --75.9016 --75.9125 --75.9047 --75.9047 --75.9047 --75.9156 --75.9078 --75.9078 --75.9266 --75.9031 --75.9016 --75.9062 --75.9156 --75.9156 --75.9031 --75.9156 --75.9 --75.9062 --75.9016 --75.9156 --75.9094 --75.9031 --75.9156 --75.9187 --75.9109 --75.9094 --75.9109 --75.9109 --75.9109 --75.9328 --75.9031 --75.9187 --75.9047 --75.9047 --75.9047 --75.8891 --75.9 --75.9078 --75.9125 --75.8891 --75.8922 --75.9016 --75.9 --75.8922 --75.8953 --75.8969 --75.9125 --75.9 --75.9094 --75.9094 --75.9062 --75.9078 --75.9187 --75.9047 --75.9094 --75.9109 --75.9125 --75.9141 --75.9016 --75.9047 --75.9109 --75.9031 --75.8984 --75.9203 --75.9031 --75.9203 --75.9141 --75.9031 --75.9062 --75.9297 --75.9094 --75.9297 --75.9016 --75.9078 --75.9062 --75.9156 --75.9062 --75.9156 --75.9141 --75.9141 --75.9078 --75.8984 --75.9047 --75.8953 --75.8984 --75.9 --75.9141 --75.9125 --75.8922 --75.9109 --75.8969 --75.9125 --75.8922 --75.9 --75.9125 --75.9047 --75.9031 --75.9031 --75.9047 --75.9141 --75.9078 --75.9094 --75.9047 --75.9109 --75.9125 --75.9062 --75.9047 --75.9094 --75.9094 --75.9047 --75.8953 --75.9094 --75.9094 --75.9078 --75.9281 --75.9016 --75.9141 --75.9187 --75.9094 --75.9078 --75.9062 --75.8969 --75.9062 --75.9078 --75.9219 --75.9109 --75.9047 --75.9187 --75.9156 --75.8938 --75.9109 --75.9062 --75.9078 --75.9078 --75.8969 --75.8984 --75.9031 --75.9 --75.8969 --75.9047 --75.9094 --75.8906 --75.9016 --75.9078 --75.8984 --75.8953 --75.9 --75.9156 --75.9078 --75.8969 --75.9031 --75.9156 --75.9094 --75.9062 --75.8938 --75.9156 --75.8984 --75.8984 --75.9047 --75.8891 --75.9 --75.8938 --75.8906 --75.9031 --75.8922 --75.9 --75.8922 --75.9078 --75.8969 --75.9109 --75.8875 --75.8922 --75.8984 --75.9047 --75.9047 --75.8922 --75.8969 --75.9094 --75.9156 --75.8938 --75.9078 --75.8953 --75.8891 --75.8906 --75.8797 --75.8906 --75.8844 --75.8859 --75.9031 --75.8859 --75.8906 --75.8906 --75.9078 --75.8969 --75.8984 --75.8906 --75.8953 --75.8781 --75.8984 --75.8906 --75.8969 --75.8969 --75.8875 --75.9047 --75.9156 --75.9016 --75.8953 --75.8953 --75.9078 --75.9062 --75.8969 --75.8969 --75.9016 --75.8953 --75.8984 --75.9 --75.8906 --75.8938 --75.8953 --75.8969 --75.8984 --75.8984 --75.8906 --75.9078 --75.9031 --75.8938 --75.8906 --75.8922 --75.8938 --75.8922 --75.8984 --75.8953 --75.8969 --75.8922 --75.8891 --75.8844 --75.9 --75.8891 --75.8938 --75.8891 --75.8938 --75.9016 --75.9016 --75.8969 --75.9016 --75.8906 --75.8938 --75.8891 --75.9016 --75.9031 --75.9016 --75.8922 --75.8875 --75.9016 --75.8984 --75.8938 --75.8891 --75.9125 --75.8953 --75.8969 --75.8906 --75.8859 --75.8891 --75.8891 --75.8875 --75.8891 --75.8906 --75.8797 --75.8969 --75.8938 --75.8953 --75.8922 --75.8875 --75.8797 --75.8938 --75.9 --75.875 --75.8984 --75.8812 --75.8875 --75.8938 --75.8906 --75.8984 --75.8922 --75.9109 --75.8922 --75.8859 --75.8922 --75.9 --75.9031 --75.8984 --75.9031 --75.8953 --75.9047 --75.9 --75.8969 --75.9016 --75.8938 --75.9016 --75.8906 --75.9125 --75.8938 --75.9078 --75.8953 --75.9031 --75.8969 --75.8984 --75.8953 --75.9 --75.8969 --75.9094 --75.8859 --75.8891 --75.8922 --75.8938 --75.8984 --75.8969 --75.9 --75.8906 --75.9109 --75.8969 --75.9094 --75.8859 --75.8906 --75.8828 --75.9031 --75.8969 --75.8953 --75.9016 --75.9078 --75.9016 --75.9031 --75.8891 --75.9 --75.9125 --75.9078 --75.9016 --75.9 --75.9094 --75.9203 --75.8953 --75.8984 --75.8969 --75.9109 --75.9109 --75.8969 --75.8953 --75.9062 --75.8984 --75.8969 --75.9016 --75.8859 --75.9047 --75.8969 --75.8906 --75.8859 --75.8938 --75.8891 --75.8969 --75.8812 --75.8953 --75.9016 --75.9047 --75.9016 --75.9062 --75.9 --75.8984 --75.8984 --75.9016 --75.8734 --75.8984 --75.8953 --75.9078 --75.8828 --75.8953 --75.9016 --75.8906 --75.9047 --75.8891 --75.9016 --75.9016 --75.8828 --75.9031 --75.9031 --75.9 --75.8828 --75.8969 --75.9 --75.8938 --75.9031 --75.8984 --75.8922 --75.8828 --75.9062 --75.9047 --75.8922 --75.9047 --75.9016 --75.8984 --75.9172 --75.9016 --75.8953 --75.8969 --75.8938 --75.9 --75.8922 --75.8906 --75.8922 --75.8812 --75.8938 --75.8984 --75.8984 --75.8984 --75.8859 --75.8984 --75.8812 --75.9109 --75.9156 --75.9094 --75.8891 --75.9172 --75.9187 --75.9187 --75.9156 --75.9094 --75.8922 --75.9172 --75.9 --75.9156 --75.9172 --75.9062 --75.9078 --75.9031 --75.9203 --75.9062 --75.9078 --75.9094 --75.9031 --75.9156 --75.9016 --75.9031 --75.8969 --75.9031 --75.9 --75.8984 --75.8953 --75.9094 --75.9078 --75.9172 --75.9203 --75.9109 --75.9109 --75.9078 --75.9047 --75.9156 --75.9297 --75.9109 --75.9062 --75.9187 --75.9078 --75.9016 --75.9047 --75.9109 --75.9047 --75.9141 --75.9266 --75.8922 --75.9125 --75.9187 --75.9047 --75.9219 --75.9031 --75.9078 --75.9141 --75.9078 --75.9141 --75.9047 --75.9203 --75.9109 --75.9031 --75.8984 --75.9031 --75.9078 --75.9109 --75.9047 --75.9 --75.9109 --75.9109 --75.9156 --75.925 --75.9078 --75.9094 --75.9016 --75.8891 --75.9109 --75.9156 --75.9109 --75.9203 --75.9031 --75.9078 --75.9031 --75.8969 --75.9141 --75.9031 --75.9156 --75.9125 --75.9187 --75.9047 --75.8984 --75.9078 --75.9062 --75.9031 --75.925 --75.9125 --75.9094 --75.9062 --75.9109 --75.9094 --75.9109 --75.8984 --75.9031 --75.8953 --75.9109 --75.9141 --75.8938 --75.9016 --75.9094 --75.9078 --75.9109 --75.925 --75.9281 --75.8922 --75.9156 --75.9062 --75.9047 --75.9141 --75.9109 --75.9094 --75.8922 --75.9016 --75.9031 --75.9062 --75.9062 --75.9156 --75.9094 --75.9141 --75.9219 --75.9172 --75.9094 --75.9031 --75.9062 --75.9094 --75.9 --75.9062 --75.9125 --75.9109 --75.8938 --75.9109 --75.9047 --75.9078 --75.9141 --75.9 --75.9094 --75.9094 --75.9 --75.9141 --75.8969 --75.9094 --75.9 --75.9 --75.9203 --75.9016 --75.8953 --75.9016 --75.9141 --75.8969 --75.9031 --75.9047 --75.9219 --75.9078 --75.9125 --75.925 --75.9078 --75.9219 --75.9094 --75.9094 --75.925 --75.9109 --75.9187 --75.925 --75.9172 --75.9219 --75.9094 --75.9094 --75.9156 --75.9109 --75.9156 --75.9219 --75.9078 --75.9109 --75.9078 --75.8953 --75.9094 --75.9187 --75.9 --75.9047 --75.9125 --75.9141 --75.9187 --75.9141 --75.9109 --75.9062 --75.9094 --75.9234 --75.9125 --75.9187 --75.9078 --75.9094 --75.9078 --75.9141 --75.9156 --75.9187 --75.9141 --75.9234 --75.9062 --75.9141 --75.9156 --75.9203 --75.9172 --75.9187 --75.925 --75.9266 --75.9266 --75.9141 --75.9187 --75.9281 --75.9313 --75.9078 --75.9203 --75.9187 --75.9406 --75.9125 --75.9141 --75.9187 --75.9219 --75.9062 --75.9266 --75.9266 --75.9172 --75.9062 --75.9187 --75.9203 --75.9328 --75.9172 --75.9375 --75.9219 --75.9141 --75.9203 --75.9125 --75.9141 --75.9203 --75.9328 --75.9172 --75.9281 --75.9187 --75.9187 --75.9328 --75.9156 --75.9219 --75.9109 --75.9219 --75.9141 --75.9187 --75.9172 --75.9172 --75.9172 --75.9156 --75.9125 --75.9203 --75.9062 --75.9109 --75.9031 --75.9047 --75.9172 --75.9078 --75.9172 --75.9031 --75.9234 --75.9313 --75.9156 --75.9031 --75.9125 --75.9219 --75.9078 --75.9313 --75.9203 --75.9187 --75.9172 --75.9203 --75.925 --75.9094 --75.8984 --75.9156 --75.9219 --75.925 --75.9125 --75.9187 --75.9141 --75.9109 --75.9141 --75.9219 --75.9125 --75.9125 --75.9219 --75.9125 --75.925 --75.9281 --75.9328 --75.9094 --75.9266 --75.9234 --75.925 --75.9313 --75.9234 --75.9156 --75.9266 --75.9219 --75.9266 --75.9328 --75.9219 --75.9328 --75.9156 --75.9297 --75.9172 --75.9109 --75.9094 --75.9031 --75.9328 --75.9281 --75.925 --75.9062 --75.925 --75.9172 --75.9016 --75.9125 --75.9094 --75.9234 --75.9203 --75.9203 --75.9078 --75.925 --75.9281 --75.9266 --75.9344 --75.9156 --75.9344 --75.9359 --75.9219 --75.9156 --75.9203 --75.9109 --75.9203 --75.9297 --75.9203 --75.9187 --75.9281 --75.9375 --75.9203 --75.9328 --75.9266 --75.9375 --75.9172 --75.9344 --75.9187 --75.9266 --75.9266 --75.9406 --75.9313 --75.9313 --75.9172 --75.9281 --75.9156 --75.925 --75.9297 --75.9297 --75.9266 --75.9344 --75.9344 --75.9344 --75.9266 --75.9266 --75.9359 --75.9375 --75.9234 --75.9234 --75.9219 --75.9328 --75.9344 --75.9219 --75.9328 --75.9141 --75.9391 --75.9203 --75.9266 --75.9375 --75.9156 --75.9266 --75.9156 --75.9297 --75.925 --75.9141 --75.9219 --75.9359 --75.9266 --75.9203 --75.9125 --75.9266 --75.9375 --75.9234 --75.9203 --75.925 --75.925 --75.9266 --75.9266 --75.9297 --75.925 --75.9187 --75.9156 --75.9234 --75.9328 --75.9172 --75.925 --75.9062 --75.9297 --75.9328 --75.925 --75.9187 --75.9344 --75.9266 --75.9328 --75.9125 --75.9172 --75.9234 --75.9187 --75.925 --75.9266 --75.9297 --75.9141 --75.9172 --75.9344 --75.9219 --75.9328 --75.9219 --75.9125 --75.925 --75.9313 --75.9391 --75.9219 --75.9359 --75.9344 --75.9313 --75.9375 --75.9234 --75.9375 --75.9359 --75.9234 --75.9297 --75.9203 --75.9266 --75.9281 --75.9234 --75.9281 --75.9328 --75.9266 --75.9406 --75.9203 --75.9281 --75.9391 --75.9281 --75.9062 --75.925 --75.9109 --75.9156 --75.9094 --75.9313 --75.9187 --75.9328 --75.9375 --75.9234 --75.9141 --75.9141 --75.9234 --75.9313 --75.9281 --75.9297 --75.9375 --75.9313 --75.9297 --75.9297 --75.9141 --75.9344 --75.9313 --75.9422 --75.9344 --75.9328 --75.9313 --75.9359 --75.9187 --75.9172 --75.9266 --75.9156 --75.9234 --75.9313 --75.9281 --75.9281 --75.925 --75.9125 --75.9172 --75.9156 --75.925 --75.9141 --75.9203 --75.9187 --75.9203 --75.925 --75.9391 --75.9172 --75.9328 --75.9172 --75.9187 --75.925 --75.9266 --75.9203 --75.9313 --75.9281 --75.9281 --75.9344 --75.9281 --75.9172 --75.9266 --75.9234 --75.9234 --75.9203 --75.9172 --75.9297 --75.9281 --75.9203 --75.9328 --75.9344 --75.9187 --75.9359 --75.9234 --75.9156 --75.9266 --75.9156 --75.9313 --75.9344 --75.9203 --75.9266 --75.9172 --75.9313 --75.925 --75.925 --75.9266 --75.9281 --75.9203 --75.9141 --75.9281 --75.9219 --75.9172 --75.9203 --75.9172 --75.9219 --75.9141 --75.9219 --75.9172 --75.9187 --75.9344 --75.9156 --75.9187 --75.9234 --75.9281 --75.9234 --75.9344 --75.9344 --75.9344 --75.9297 --75.9203 --75.9422 --75.9313 --75.9234 --75.9344 --75.9313 --75.9313 --75.9484 --75.925 --75.9266 --75.9109 --75.9281 --75.9313 --75.9344 --75.925 --75.9375 --75.9281 --75.9328 --75.9234 --75.9219 --75.9375 --75.925 --75.9281 --75.9234 --75.9203 --75.9234 --75.9219 --75.9234 --75.9266 --75.9297 --75.9187 --75.9203 --75.9234 --75.9281 --75.9156 --75.9313 --75.9281 --75.9125 --75.9187 --75.925 --75.9297 --75.9219 --75.9359 --75.9297 --75.9187 --75.9187 --75.9266 --75.9313 --75.9219 --75.9359 --75.9266 --75.9297 --75.9172 --75.9375 --75.9328 --75.925 --75.925 --75.9156 --75.9219 --75.9281 --75.9156 --75.925 --75.9203 --75.9141 --75.9234 --75.9125 --75.925 --75.9266 --75.925 --75.925 --75.9219 --75.9266 --75.9266 --75.9156 --75.9281 --75.9297 --75.9391 --75.9313 --75.9062 --75.9266 --75.9109 --75.9125 --75.9141 --75.9281 --75.9219 --75.925 --75.9281 --75.9406 --75.9266 --75.9141 --75.9219 --75.9297 --75.9313 --75.9172 --75.9187 --75.9422 --75.9313 --75.9313 --75.9297 --75.9313 --75.9266 --75.9328 --75.9313 --75.9297 --75.9281 --75.9453 --75.9344 --75.9234 --75.9234 --75.9266 --75.9281 --75.9266 --75.9422 --75.9313 --75.9281 --75.9344 --75.9297 --75.9281 --75.9328 --75.9484 --75.9203 --75.9281 --75.9375 --75.9375 --75.9375 --75.9328 --75.9219 --75.9313 --75.9266 --75.9391 --75.9313 --75.9313 --75.9313 --75.9406 --75.9297 --75.9297 --75.9328 --75.9313 --75.9406 --75.9359 --75.9313 --75.9391 --75.9375 --75.9297 --75.9234 --75.9297 --75.9266 --75.925 --75.9281 --75.9266 --75.9391 --75.9297 --75.9313 --75.925 --75.925 --75.9266 --75.9313 --75.9234 --75.925 --75.9156 --75.9219 --75.9313 --75.9078 --75.9187 --75.9313 --75.9281 --75.9187 --75.9359 --75.9109 --75.9094 --75.9203 --75.9344 --75.9141 --75.9125 --75.9062 --75.925 --75.9203 --75.9156 --75.9172 --75.9203 --75.9156 --75.9109 --75.9219 --75.9187 --75.925 --75.9344 --75.925 --75.9125 --75.9313 --75.9344 --75.9219 --75.9359 --75.9266 --75.9187 --75.9156 --75.9297 --75.9187 --75.9297 --75.9156 --75.9375 --75.9344 --75.925 --75.9344 --75.9344 --75.9234 --75.9281 --75.9187 --75.925 --75.9406 --75.9328 --75.9141 --75.9328 --75.9266 --75.9203 --75.9281 --75.9328 --75.925 --75.9422 --75.925 --75.9437 --75.9281 --75.9344 --75.9297 --75.925 --75.9266 --75.9344 --75.9313 --75.9156 --75.9172 --75.9422 --75.9281 --75.9281 --75.9344 --75.9453 --75.9344 --75.9453 --75.9203 --75.9375 --75.9328 --75.9375 --75.9281 --75.9281 --75.9187 --75.9281 --75.9437 --75.9234 --75.9281 --75.9344 --75.9313 --75.9281 --75.9234 --75.9281 --75.925 --75.9281 --75.9187 --75.9453 --75.9187 --75.9156 --75.9187 --75.9187 --75.9187 --75.9266 --75.9078 --75.9141 --75.9234 --75.9313 --75.9266 --75.9359 --75.9219 --75.9172 --75.9203 --75.9172 --75.9172 --75.9156 --75.9172 --75.9219 --75.9031 --75.9203 --75.9156 --75.9266 --75.9187 --75.9141 --75.9094 --75.925 --75.9266 --75.9234 --75.9187 --75.925 --75.9125 --75.9187 --75.9281 --75.9125 --75.9266 --75.9109 --75.9203 --75.9203 --75.9219 --75.9359 --75.9344 --75.9234 --75.9156 --75.9266 --75.9078 --75.9172 --75.9313 --75.9203 --75.9203 --75.9313 --75.9125 --75.9047 --75.9172 --75.9156 --75.9141 --75.9141 --75.9078 --75.9109 --75.9094 --75.9187 --75.9125 --75.9141 --75.9062 --75.9172 --75.9156 --75.9187 --75.9141 --75.9141 --75.9141 --75.9266 --75.9141 --75.9281 --75.925 --75.9109 --75.9234 --75.925 --75.9156 --75.9141 --75.9234 --75.925 --75.9359 --75.9203 --75.9031 --75.9219 --75.9234 --75.9266 --75.9062 --75.9234 --75.9078 --75.9062 --75.9031 --75.8953 --75.8938 --75.9203 --75.9109 --75.8984 --75.9156 --75.9141 --75.8953 --75.9125 --75.9297 --75.9078 --75.9031 --75.9078 --75.9156 --75.9031 --75.9078 --75.9078 --75.9078 --75.9109 --75.9187 --75.9141 --75.9187 --75.9234 --75.9156 --75.9203 --75.9125 --75.9109 --75.9 --75.9125 --75.9094 --75.9125 --75.9156 --75.9219 --75.9094 --75.9313 --75.9109 --75.9406 --75.9187 --75.925 --75.9297 --75.9234 --75.9156 --75.9078 --75.9078 --75.9141 --75.9156 --75.9094 --75.9156 --75.9062 --75.9203 --75.9187 --75.9109 --75.9109 --75.9031 --75.9125 --75.9187 --75.9234 --75.9141 --75.9016 --75.9266 --75.9234 --75.9172 --75.9141 --75.9141 --75.9219 --75.9062 --75.9156 --75.9156 --75.9094 --75.9141 --75.9141 --75.925 --75.9094 --75.9219 --75.9219 --75.9234 --75.9141 --75.9078 --75.9219 --75.9156 --75.9172 --75.9187 --75.9156 --75.925 --75.9141 --75.9266 --75.9219 --75.925 --75.9281 --75.925 --75.9313 --75.9391 --75.9328 --75.9313 --75.9234 --75.925 --75.9281 --75.9281 --75.9344 --75.9297 --75.9219 --75.9391 --75.9203 --75.9187 --75.9344 --75.9141 --75.9313 --75.9297 --75.9297 --75.9328 --75.9234 --75.9219 --75.9266 --75.9078 --75.925 --75.9234 --75.9187 --75.9266 --75.925 --75.9359 --75.9281 --75.9203 --75.9187 --75.9203 --75.9156 --75.9203 --75.9109 --75.9062 --75.9266 --75.9125 --75.9172 --75.9266 --75.9 --75.9172 --75.9297 --75.9094 --75.9031 --75.9109 --75.9172 --75.9141 --75.9125 --75.9109 --75.9 --75.9109 --75.9031 --75.9109 --75.9047 --75.9094 --75.9078 --75.9219 --75.9172 --75.9062 --75.9266 --75.9156 --75.9203 --75.9156 --75.9141 --75.9281 --75.9234 --75.9187 --75.9203 --75.9219 --75.9016 --75.9141 --75.925 --75.9094 --75.9344 --75.9156 --75.9172 --75.9187 --75.9203 --75.9078 --75.9187 --75.9266 --75.9203 --75.9094 --75.9266 --75.9344 --75.9172 --75.9156 --75.9219 --75.9266 --75.9219 --75.925 --75.9234 --75.9141 --75.9219 --75.9281 --75.9297 --75.9297 --75.9359 --75.9297 --75.9313 --75.9297 --75.9266 --75.9344 --75.9219 --75.925 --75.9281 --75.9141 --75.9375 --75.9344 --75.9187 --75.9156 --75.9187 --75.925 --75.9203 --75.9219 --75.9172 --75.9172 --75.9281 --75.9266 --75.9172 --75.9266 --75.9141 --75.9281 --75.9234 --75.9344 --75.9172 --75.9297 --75.9172 --75.9297 --75.9172 --75.9234 --75.9234 --75.9203 --75.9266 --75.9125 --75.9125 --75.9281 --75.9156 --75.9172 --75.9156 --75.9266 --75.9125 --75.9266 --75.9266 --75.9125 --75.925 --75.9281 --75.9266 --75.9203 --75.9203 --75.9125 --75.925 --75.9016 --75.9172 --75.9266 --75.925 --75.9297 --75.9344 --75.9219 --75.925 --75.9109 --75.9078 --75.9313 --75.9172 --75.9125 --75.9078 --75.9156 --75.9203 --75.9062 --75.9172 --75.9172 --75.9141 --75.9156 --75.9109 --75.9125 --75.9047 --75.9125 --75.9031 --75.8969 --75.9078 --75.9016 --75.9094 --75.9094 --75.9062 --75.9062 --75.9141 --75.9094 --75.9062 --75.9156 --75.9031 --75.9172 --75.9094 --75.9031 --75.8969 --75.9078 --75.9141 --75.9125 --75.9031 --75.9031 --75.8969 --75.8922 --75.9141 --75.8953 --75.9062 --75.9234 --75.9172 --75.9187 --75.9094 --75.8922 --75.9156 --75.9 --75.9094 --75.9156 --75.9078 --75.9203 --75.9125 --75.9109 --75.9141 --75.9109 --75.9094 --75.9 --75.9125 --75.9187 --75.9172 --75.9172 --75.9281 --75.9078 --75.9062 --75.9125 --75.9094 --75.9094 --75.9203 --75.9156 --75.9203 --75.9219 --75.9172 --75.9297 --75.9297 --75.9187 --75.9219 --75.9078 --75.9 --75.9125 --75.9187 --75.9234 --75.9281 --75.9219 --75.9156 --75.9266 --75.9203 --75.8953 --75.925 --75.9094 --75.9234 --75.9187 --75.9219 --75.9156 --75.9109 --75.9125 --75.9156 --75.9078 --75.9219 --75.9203 --75.9094 --75.9125 --75.9156 --75.9109 --75.9234 --75.9281 --75.9281 --75.925 --75.9156 --75.9328 --75.9219 --75.9281 --75.9156 --75.9203 --75.9281 --75.9234 --75.9156 --75.9187 --75.9031 --75.9172 --75.9109 --75.9125 --75.9297 --75.9172 --75.9156 --75.9203 --75.9156 --75.9187 --75.9219 --75.9234 --75.9141 --75.9375 --75.9156 --75.9125 --75.9172 --75.9203 --75.9297 --75.925 --75.9297 --75.9281 --75.9172 --75.9078 --75.9125 --75.9156 --75.9094 --75.9109 --75.9203 --75.9109 --75.9031 --75.9234 --75.9078 --75.9125 --75.9125 --75.9156 --75.9172 --75.9109 --75.9141 --75.9203 --75.9297 --75.9172 --75.9219 --75.9187 --75.925 --75.9234 --75.9141 --75.9234 --75.9062 --75.9172 --75.9125 --75.9219 --75.9281 --75.9094 --75.9219 --75.9031 --75.9219 --75.9266 --75.9172 --75.9062 --75.9125 --75.9078 --75.9328 --75.9344 --75.9109 --75.9187 --75.925 --75.925 --75.9266 --75.9297 --75.9281 --75.9266 --75.9187 --75.9172 --75.9187 --75.9125 --75.9219 --75.9281 --75.9281 --75.9219 --75.9375 --75.9297 --75.9313 --75.9203 --75.9234 --75.9203 --75.9266 --75.9313 --75.9297 --75.9344 --75.9281 --75.9078 --75.9391 --75.9219 --75.9203 --75.9219 --75.9187 --75.9219 --75.9219 --75.9297 --75.9313 --75.9281 --75.9141 --75.9266 --75.9313 --75.9297 --75.9344 --75.9406 --75.9313 --75.925 --75.9344 --75.9406 --75.9406 --75.9203 --75.9219 --75.9187 --75.9172 --75.9281 --75.9156 --75.9016 --75.9094 --75.9125 --75.9125 --75.9094 --75.9 --75.9125 --75.9047 --75.9094 --75.9094 --75.9 --75.9156 --75.9203 --75.9062 --75.9016 --75.9109 --75.9156 --75.8969 --75.9078 --75.9016 --75.8953 --75.9156 --75.9109 --75.9031 --75.9047 --75.9094 --75.9172 --75.9094 --75.9 --75.9031 --75.8984 --75.9094 --75.9109 --75.9094 --75.9156 --75.9141 --75.9156 --75.925 --75.9094 --75.9109 --75.9125 --75.9141 --75.9094 --75.9234 --75.9281 --75.9203 --75.9187 --75.9172 --75.9094 --75.9219 --75.9141 --75.9203 --75.9109 --75.9141 --75.9078 --75.9187 --75.9062 --75.9078 --75.9062 --75.9156 --75.9016 --75.9094 --75.9125 --75.8906 --75.9047 --75.9109 --75.925 --75.9109 --75.9187 --75.9 --75.9156 --75.9047 --75.9234 --75.9172 --75.9172 --75.9203 --75.9219 --75.9187 --75.9187 --75.9156 --75.9094 --75.9141 --75.9344 --75.9156 --75.9125 --75.9156 --75.9203 --75.9125 --75.9109 --75.9141 --75.9109 --75.9078 --75.9141 --75.9125 --75.9156 --75.9062 --75.925 --75.9203 --75.9234 --75.9109 --75.9172 --75.9141 --75.9156 --75.9156 --75.9094 --75.9031 --75.9172 --75.9078 --75.9172 --75.9125 --75.9281 --75.9219 --75.9234 --75.9187 --75.9187 --75.9125 --75.9203 --75.9313 --75.9156 --75.9219 --75.925 --75.9141 --75.9156 --75.9219 --75.9047 --75.9 --75.9094 --75.9062 --75.9125 --75.9078 --75.9 --75.9031 --75.9109 --75.9125 --75.9047 --75.9187 --75.9125 --75.9094 --75.9187 --75.9172 --75.9 --75.9141 --75.9234 --75.9125 --75.9344 --75.9266 --75.9219 --75.925 --75.9266 --75.9141 --75.9094 --75.9266 --75.9031 --75.925 --75.9094 --75.9094 --75.9313 --75.9172 --75.9266 --75.9344 --75.9344 --75.925 --75.9297 --75.9266 --75.9172 --75.9187 --75.9187 --75.9187 --75.9281 --75.9359 --75.9062 --75.925 --75.9172 --75.9266 --75.9266 --75.9125 --75.9125 --75.9203 --75.9141 --75.9156 --75.9125 --75.9047 --75.9234 --75.9219 --75.9313 --75.925 --75.9172 --75.9219 --75.9219 --75.9281 --75.9141 --75.9156 --75.9297 --75.9297 --75.925 --75.9281 --75.9219 --75.9328 --75.9266 --75.9359 --75.9344 --75.925 --75.9109 --75.9234 --75.9125 --75.9187 --75.9266 --75.9266 --75.9172 --75.925 --75.9359 --75.9219 --75.9297 --75.9281 --75.9281 --75.9172 --75.9125 --75.9297 --75.9313 --75.9203 --75.9266 --75.9328 --75.9266 --75.9172 --75.9297 --75.9359 --75.9375 --75.9187 --75.9281 --75.9281 --75.9219 --75.9344 --75.925 --75.925 --75.9234 --75.8984 --75.925 --75.9172 --75.925 --75.9344 --75.9219 --75.9187 --75.9281 --75.9187 --75.9172 --75.9156 --75.9172 --75.9156 --75.9359 --75.9172 --75.9359 --75.9406 --75.9297 --75.9203 --75.9375 --75.9187 --75.9219 --75.9219 --75.9203 --75.9141 --75.9109 --75.9062 --75.9219 --75.9016 --75.9172 --75.9141 --75.9125 --75.9313 --75.9141 --75.9094 --75.9156 --75.9078 --75.9109 --75.9172 --75.9125 --75.9109 --75.9156 --75.9187 --75.9156 --75.9141 --75.9281 --75.9172 --75.9328 --75.925 --75.9141 --75.9234 --75.9156 --75.9219 --75.9141 --75.9125 --75.9078 --75.9297 --75.925 --75.9047 --75.9062 --75.9203 --75.9219 --75.9109 --75.9266 --75.9094 --75.9172 --75.9297 --75.9172 --75.9125 --75.9266 --75.9047 --75.8953 --75.9313 --75.9203 --75.9187 --75.9047 --75.9141 --75.9328 --75.9125 --75.9047 --75.9141 --75.9281 --75.9187 --75.9156 --75.9047 --75.9187 --75.9281 --75.9156 --75.9187 --75.9219 --75.8953 --75.9094 --75.9203 --75.9125 --75.9 --75.9203 --75.9281 --75.9109 --75.9219 --75.925 --75.925 --75.925 --75.9281 --75.9109 --75.9297 --75.9031 --75.9109 --75.9344 --75.9203 --75.9297 --75.9203 --75.9219 --75.9281 --75.9313 --75.9203 --75.9234 --75.9297 --75.9187 --75.9203 --75.925 --75.9266 --75.9281 --75.9187 --75.9297 --75.925 --75.9203 --75.9172 --75.9156 --75.925 --75.925 --75.9187 --75.9219 --75.9203 --75.9266 --75.925 --75.9266 --75.9203 --75.9203 --75.9172 --75.9203 --75.9156 --75.9109 --75.9078 --75.9313 --75.9203 --75.9234 --75.9109 --75.9203 --75.9234 --75.9266 --75.9203 --75.9234 --75.9219 --75.9328 --75.925 --75.9266 --75.9141 --75.9187 --75.9344 --75.9266 --75.9313 --75.9344 --75.9281 --75.9297 --75.9234 --75.9359 --75.9281 --75.9281 --75.9156 --75.9094 --75.9172 --75.9219 --75.9281 --75.9187 --75.9203 --75.9391 --75.9281 --75.9156 --75.9125 --75.9375 --75.9125 --75.9266 --75.9344 --75.9344 --75.9328 --75.9297 --75.9375 --75.9281 --75.925 --75.9453 --75.9406 --75.9328 --75.9406 --75.9172 --75.925 --75.9344 --75.9344 --75.9359 --75.9125 --75.9219 --75.9125 --75.9219 --75.9141 --75.9344 --75.9156 --75.9234 --75.9203 --75.9187 --75.9187 --75.9156 --75.9266 --75.9172 --75.9156 --75.9141 --75.9234 --75.9266 --75.9297 --75.925 --75.9234 --75.9281 --75.9172 --75.9156 --75.9109 --75.9 --75.9297 --75.9125 --75.9078 --75.9313 --75.9172 --75.9187 --75.9172 --75.9422 --75.9297 --75.9203 --75.9266 --75.9281 --75.9375 --75.9313 --75.9297 --75.9313 --75.9234 --75.9187 --75.9297 --75.9359 --75.9344 --75.925 --75.9297 --75.9297 --75.9281 --75.925 --75.9313 --75.925 --75.9172 --75.9219 --75.9125 --75.9141 --75.9234 --75.9297 --75.9266 --75.925 --75.9172 --75.9156 --75.9109 --75.9281 --75.925 --75.9172 --75.9 --75.9187 --75.9234 --75.9219 --75.9281 --75.9109 --75.9109 --75.9141 --75.9203 --75.9109 --75.925 --75.9328 --75.9187 --75.9375 --75.9141 --75.9328 --75.9094 --75.9344 --75.9266 --75.9281 --75.9203 --75.9313 --75.9359 --75.9281 --75.925 --75.9422 --75.9328 --75.9328 --75.9359 --75.9344 --75.9156 --75.9203 --75.925 --75.9219 --75.9094 --75.9266 --75.9187 --75.9234 --75.925 --75.9125 --75.9187 --75.9094 --75.9172 --75.9281 --75.9156 --75.9297 --75.9172 --75.9172 --75.9125 --75.9328 --75.925 --75.9172 --75.925 --75.9203 --75.9125 --75.9203 --75.9031 --75.9281 --75.9141 --75.9094 --75.9219 --75.9234 --75.9141 --75.9187 --75.9187 --75.9234 --75.9141 --75.9187 --75.9172 --75.9313 --75.9203 --75.9109 --75.9328 --75.9313 --75.925 --75.9328 --75.9172 --75.9125 --75.9266 --75.9313 --75.9187 --75.9156 --75.9234 --75.9125 --75.9156 --75.9078 --75.9141 --75.9156 --75.925 --75.9125 --75.9203 --75.9062 --75.9266 --75.925 --75.9219 --75.9359 --75.9297 --75.9297 --75.9297 --75.9172 --75.9203 --75.925 --75.925 --75.9328 --75.925 --75.9391 --75.9359 --75.9234 --75.9313 --75.9359 --75.9313 --75.9313 --75.9281 --75.9203 --75.9313 --75.9281 --75.9266 --75.9328 --75.9297 --75.9219 --75.9313 --75.9297 --75.9375 --75.9313 --75.9359 --75.9234 --75.9328 --75.9344 --75.9391 --75.9453 --75.9297 --75.9359 --75.9328 --75.9313 --75.9406 --75.9469 --75.9313 --75.9266 --75.9234 --75.95 --75.9219 --75.9359 --75.9359 --75.9344 --75.9437 --75.9406 --75.9375 --75.9297 --75.9328 --75.9297 --75.925 --75.9203 --75.9203 --75.9219 --75.9203 --75.925 --75.9141 --75.9234 --75.9219 --75.9281 --75.9281 --75.9172 --75.9328 --75.925 --75.9141 --75.9203 --75.9203 --75.9266 --75.925 --75.9313 --75.925 --75.925 --75.9234 --75.925 --75.9187 --75.9281 --75.9313 --75.9266 --75.9344 --75.9328 --75.9344 --75.9266 --75.9437 --75.9172 --75.9328 --75.9203 --75.9313 --75.9406 --75.9375 --75.9266 --75.9266 --75.9344 --75.9156 --75.9344 --75.9297 --75.9516 --75.9328 --75.9297 --75.9422 --75.9266 --75.9109 --75.925 --75.9359 --75.9391 --75.9375 --75.925 --75.925 --75.9156 --75.9266 --75.9187 --75.9187 --75.9359 --75.9344 --75.9359 --75.9203 --75.9172 --75.9391 --75.925 --75.9266 --75.9313 --75.9375 --75.925 --75.9422 --75.9313 --75.9375 --75.9328 --75.9359 --75.9281 --75.9219 --75.9406 --75.9297 --75.9344 --75.9391 --75.9281 --75.9187 --75.9437 --75.9344 --75.9406 --75.9266 --75.9344 --75.9313 --75.9313 --75.9328 --75.9328 --75.9328 --75.9344 --75.9375 --75.9406 --75.9344 --75.9281 --75.9344 --75.9313 --75.9313 --75.9156 --75.9313 --75.925 --75.9391 --75.9328 --75.9328 --75.9359 --75.9406 --75.9484 --75.9359 --75.9313 --75.9234 --75.9313 --75.9297 --75.925 --75.9172 --75.9266 --75.925 --75.9266 --75.9172 --75.9266 --75.9219 --75.9172 --75.9297 --75.9375 --75.9313 --75.9234 --75.9203 --75.9125 --75.9391 --75.9219 --75.9172 --75.9281 --75.9297 --75.9328 --75.9437 --75.9344 --75.9234 --75.9156 --75.9297 --75.9375 --75.9359 --75.9313 --75.9281 --75.9422 --75.9219 --75.925 --75.9281 --75.9344 --75.9219 --75.9422 --75.9297 --75.9172 --75.9359 --75.9187 --75.9391 --75.9266 --75.9266 --75.925 --75.9203 --75.9453 --75.9406 --75.9313 --75.9297 --75.9437 --75.9422 --75.9344 --75.9203 --75.9406 --75.9328 --75.9375 --75.9422 --75.9469 --75.9313 --75.9359 --75.9437 --75.9484 --75.9266 --75.9406 --75.9359 --75.9344 --75.9453 --75.9391 --75.9469 --75.9469 --75.9547 --75.9688 --75.9531 --75.9625 --75.9531 --75.9516 --75.9406 --75.9437 --75.9453 --75.9484 --75.9391 --75.9328 --75.9422 --75.9328 --75.9313 --75.9328 --75.9313 --75.95 --75.9375 --75.9406 --75.9297 --75.9297 --75.9406 --75.9219 --75.9391 --75.9422 --75.9313 --75.9406 --75.9531 --75.9313 --75.9391 --75.9453 --75.9391 --75.925 --75.9516 --75.9437 --75.9328 --75.9219 --75.9344 --75.9297 --75.9266 --75.9281 --75.9234 --75.9219 --75.925 --75.9313 --75.9297 --75.925 --75.9328 --75.9297 --75.9266 --75.9187 --75.9172 --75.925 --75.9234 --75.9187 --75.9328 --75.9344 --75.9187 --75.9344 --75.9187 --75.9375 --75.9281 --75.9437 --75.9359 --75.9297 --75.9469 --75.9375 --75.9328 --75.9359 --75.9422 --75.9266 --75.9344 --75.9469 --75.9453 --75.9266 --75.9406 --75.9359 --75.9359 --75.9359 --75.9344 --75.9375 --75.9422 --75.925 --75.9328 --75.9391 --75.9391 --75.9375 --75.9391 --75.9422 --75.9328 --75.9297 --75.9328 --75.9328 --75.9344 --75.9437 --75.9313 --75.9453 --75.9344 --75.9375 --75.9328 --75.9375 --75.9406 --75.9313 --75.9391 --75.9484 --75.9391 --75.9469 --75.9313 --75.9531 --75.9469 --75.9469 --75.9422 --75.9391 --75.9406 --75.9281 --75.9437 --75.9375 --75.9328 --75.9359 --75.9266 --75.9391 --75.9375 --75.9422 --75.9281 --75.9422 --75.9344 --75.9437 --75.9406 --75.9375 --75.9391 --75.925 --75.9328 --75.9328 --75.9422 --75.9344 --75.9297 --75.925 --75.9437 --75.9359 --75.9266 --75.9328 --75.9453 --75.9375 --75.9469 --75.9344 --75.9469 --75.9422 --75.9297 --75.9406 --75.9344 --75.9406 --75.9516 --75.9437 --75.9453 --75.9516 --75.9484 --75.9406 --75.9469 --75.9297 --75.9453 --75.9313 --75.9391 --75.9344 --75.9266 --75.9437 --75.9328 --75.925 --75.9359 --75.9187 --75.9266 --75.9234 --75.9234 --75.9156 --75.9062 --75.9344 --75.9391 --75.9219 --75.9313 --75.9281 --75.9234 --75.9328 --75.9156 --75.9297 --75.9109 --75.9281 --75.9141 --75.925 --75.9234 --75.9156 --75.9219 --75.9359 --75.9375 --75.9313 --75.9125 --75.9297 --75.9219 --75.9109 --75.9172 --75.925 --75.9047 --75.9297 --75.9281 --75.9359 --75.9266 --75.9156 --75.9344 --75.9328 --75.925 --75.9297 --75.9297 --75.9328 --75.9328 --75.9359 --75.9234 --75.9266 --75.9359 --75.9266 --75.9266 --75.9234 --75.9219 --75.9313 --75.9203 --75.9344 --75.9234 --75.9203 --75.925 --75.9187 --75.9187 --75.9094 --75.9187 --75.9172 --75.9203 --75.9219 --75.9156 --75.9281 --75.925 --75.9234 --75.9125 --75.9156 --75.9141 --75.9109 --75.9313 --75.9234 --75.9203 --75.9375 --75.9281 --75.9297 --75.9391 --75.9266 --75.9219 --75.9328 --75.9375 --75.9219 --75.9391 --75.9313 --75.9406 --75.9172 --75.925 --75.9141 --75.9234 --75.9187 --75.9203 --75.9203 --75.925 --75.8891 --75.9 --75.9125 --75.9219 --75.9172 --75.9109 --75.9141 --75.9234 --75.9062 --75.9203 --75.9219 --75.9094 --75.9187 --75.9172 --75.9281 --75.9125 --75.9156 --75.9359 --75.9234 --75.9344 --75.9266 --75.9141 --75.9297 --75.9172 --75.9344 --75.9297 --75.925 --75.9266 --75.9234 --75.9344 --75.9266 --75.9281 --75.9375 --75.9266 --75.9219 --75.9328 --75.9219 --75.9313 --75.9172 --75.9266 --75.9344 --75.9328 --75.9141 --75.9344 --75.9281 --75.9328 --75.925 --75.9234 --75.925 --75.9328 --75.9281 --75.9359 --75.9219 --75.9328 --75.9359 --75.9313 --75.9266 --75.9141 --75.9297 --75.9328 --75.9406 --75.9313 --75.9328 --75.9297 --75.9313 --75.9484 --75.9422 --75.9469 --75.9422 --75.9281 --75.9313 --75.925 --75.9281 --75.9266 --75.9406 --75.9281 --75.9219 --75.9328 --75.9453 --75.9219 --75.925 --75.9297 --75.9313 --75.9344 --75.9281 --75.9109 --75.925 --75.9203 --75.9328 --75.9234 --75.9172 --75.9156 --75.9109 --75.9359 --75.9219 --75.9297 --75.9281 --75.9281 --75.9328 --75.9172 --75.9203 --75.9187 --75.925 --75.9281 --75.9328 --75.9047 --75.9391 --75.9406 --75.9125 --75.925 --75.9328 --75.9313 --75.925 --75.9203 --75.9359 --75.9344 --75.9375 --75.9344 --75.9187 --75.9156 --75.9281 --75.9375 --75.9391 --75.9344 --75.925 --75.9328 --75.9234 --75.9484 --75.9266 --75.9437 --75.9219 --75.9281 --75.9344 --75.9406 --75.9375 --75.9281 --75.9422 --75.9359 --75.9328 --75.9234 --75.9328 --75.9313 --75.9281 --75.9359 --75.9359 --75.9406 --75.9313 --75.9469 --75.9406 --75.925 --75.9266 --75.9266 --75.9469 --75.9328 --75.9203 --75.9297 --75.9266 --75.9469 --75.9328 --75.925 --75.9234 --75.9359 --75.9234 --75.9313 --75.9187 --75.9359 --75.9391 --75.9313 --75.9281 --75.9266 --75.9266 --75.9281 --75.9219 --75.9313 --75.9172 --75.9266 --75.9219 --75.9313 --75.9203 --75.9219 --75.9234 --75.9172 --75.9141 --75.9187 --75.9281 --75.9109 --75.9203 --75.9172 --75.9266 --75.9344 --75.9313 --75.9109 --75.9266 --75.9141 --75.9109 --75.9172 --75.9375 --75.9141 --75.9328 --75.9187 --75.9281 --75.9328 --75.9125 --75.9187 --75.9078 --75.9203 --75.9125 --75.9062 --75.9219 --75.925 --75.9203 --75.9156 --75.9172 --75.9281 --75.9078 --75.925 --75.9172 --75.9219 --75.9187 --75.9266 --75.9422 --75.925 --75.9266 --75.9266 --75.9266 --75.9281 --75.9313 --75.9156 --75.9297 --75.9297 --75.9187 --75.9375 --75.9313 --75.9234 --75.9391 --75.9313 --75.9187 --75.9328 --75.9234 --75.925 --75.9203 --75.9313 --75.9297 --75.9281 --75.9328 --75.9359 --75.9375 --75.9391 --75.9281 --75.9234 --75.9281 --75.9422 --75.9469 --75.9281 --75.9375 --75.9359 --75.9422 --75.9313 --75.9281 --75.9344 --75.9187 --75.9391 --75.9344 --75.925 --75.9344 --75.9375 --75.9406 --75.9406 --75.9313 --75.9422 --75.9391 --75.9328 --75.9531 --75.925 --75.9328 --75.9344 --75.9203 --75.9328 --75.9391 --75.9297 --75.9391 --75.9328 --75.9344 --75.9344 --75.9203 --75.9313 --75.9328 --75.9344 --75.9422 --75.9344 --75.9344 --75.9453 --75.9406 --75.9359 --75.9328 --75.9422 --75.9594 --75.9391 --75.9297 --75.9406 --75.9406 --75.9266 --75.9297 --75.925 --75.95 --75.9313 --75.9469 --75.9344 --75.925 --75.9328 --75.9453 --75.95 --75.9547 --75.9484 --75.9328 --75.9453 --75.9422 --75.9453 --75.9297 --75.9344 --75.9344 --75.9297 --75.9437 --75.9297 --75.9266 --75.9391 --75.9391 --75.9375 --75.925 --75.9234 --75.9391 --75.9328 --75.9266 --75.9297 --75.9313 --75.9406 --75.9266 --75.9234 --75.9344 --75.9375 --75.9375 --75.9297 --75.9297 --75.9328 --75.9328 --75.9297 --75.9219 --75.925 --75.9234 --75.9297 --75.9234 --75.9281 --75.9234 --75.9219 --75.9172 --75.9422 --75.9156 --75.9328 --75.9266 --75.9437 --75.9109 --75.9281 --75.9406 --75.9328 --75.9313 --75.9328 --75.9219 --75.9281 --75.9234 --75.9203 --75.9125 --75.9266 --75.925 --75.9141 --75.9375 --75.9234 --75.9187 --75.9094 --75.9359 --75.9234 --75.9156 --75.9172 --75.925 --75.9281 --75.9234 --75.9125 --75.9156 --75.9234 --75.9328 --75.9234 --75.9328 --75.9297 --75.9187 --75.9094 --75.9187 --75.9094 --75.9203 --75.9234 --75.9344 --75.9172 --75.9344 --75.9016 --75.9078 --75.9078 --75.9109 --75.9234 --75.9234 --75.9266 --75.9219 --75.9234 --75.9297 --75.9234 --75.9234 --75.9328 --75.9234 --75.9266 --75.9172 --75.9359 --75.9187 --75.9141 --75.9359 --75.9313 --75.9187 --75.9437 --75.9328 --75.9266 --75.9406 --75.925 --75.9219 --75.9297 --75.9422 --75.925 --75.9406 --75.9328 --75.9266 --75.9359 --75.9344 --75.9375 --75.9297 --75.9281 --75.925 --75.9297 --75.9359 --75.9172 --75.9391 --75.9406 --75.9187 --75.9344 --75.9219 --75.9234 --75.9313 --75.9203 --75.9141 --75.9297 --75.9391 --75.9219 --75.9141 --75.9297 --75.9156 --75.9391 --75.9344 --75.9437 --75.9344 --75.9203 --75.9359 --75.9266 --75.9203 --75.9141 --75.9422 --75.9234 --75.9328 --75.9125 --75.9141 --75.9328 --75.9234 --75.9203 --75.9203 --75.925 --75.9156 --75.9359 --75.9141 --75.9094 --75.9078 --75.9203 --75.9141 --75.9094 --75.9141 --75.9141 --75.9266 --75.9281 --75.9219 --75.9094 --75.9047 --75.925 --75.9141 --75.9078 --75.9266 --75.9187 --75.9203 --75.9359 --75.9297 --75.9328 --75.9078 --75.9437 --75.9359 --75.9453 --75.9187 --75.9297 --75.9281 --75.9203 --75.9187 --75.9234 --75.9297 --75.9125 --75.9234 --75.9234 --75.9156 --75.9391 --75.9172 --75.9391 --75.9297 --75.9344 --75.9297 --75.9313 --75.9422 --75.9344 --75.9219 --75.9313 --75.9437 --75.9187 --75.9359 --75.925 --75.9266 --75.9313 --75.9313 --75.9141 --75.9281 --75.9297 --75.9234 --75.925 --75.9297 --75.9266 --75.925 --75.9078 --75.9344 --75.9375 --75.9172 --75.9391 --75.9359 --75.9234 --75.9328 --75.9313 --75.9297 --75.9437 --75.9187 --75.9219 --75.9344 --75.9437 --75.9266 --75.9281 --75.95 --75.9359 --75.9375 --75.9187 --75.9453 --75.925 --75.9266 --75.9297 --75.9422 --75.9391 --75.9344 --75.9359 --75.9313 --75.9328 --75.9344 --75.9203 --75.9359 --75.9281 --75.9266 --75.9328 --75.9344 --75.9328 --75.9234 --75.9328 --75.9234 --75.9437 --75.9313 --75.9344 --75.9297 --75.925 --75.9313 --75.9328 --75.9297 --75.9266 --75.9109 --75.9141 --75.9234 --75.9219 --75.925 --75.9187 --75.9234 --75.9406 --75.9344 --75.9281 --75.9313 --75.9422 --75.9203 --75.9344 --75.95 --75.9234 --75.9453 --75.9406 --75.9328 --75.9328 --75.9391 --75.9234 --75.9203 --75.925 --75.9531 --75.9328 --75.9359 --75.9234 --75.9281 --75.9297 --75.9266 --75.9359 --75.9344 --75.9281 --75.9328 --75.9328 --75.9234 --75.9297 --75.9313 --75.9375 --75.9359 --75.9422 --75.9469 --75.9313 --75.9313 --75.9375 --75.9266 --75.9359 --75.9375 --75.9375 --75.9391 --75.9328 --75.9359 --75.9422 --75.9406 --75.9266 --75.9422 --75.9344 --75.9328 --75.9297 --75.9375 --75.9375 --75.9328 --75.9297 --75.9422 --75.925 --75.9422 --75.9328 --75.9156 --75.925 --75.9359 --75.9344 --75.9375 --75.9313 --75.9422 --75.9313 --75.925 --75.9297 --75.9359 --75.9313 --75.9125 --75.9297 --75.9281 --75.9469 --75.9406 --75.9484 --75.9406 --75.9281 --75.9313 --75.9281 --75.9219 --75.9359 --75.9328 --75.9219 --75.9344 --75.925 --75.9375 --75.9437 --75.9281 --75.9266 --75.9375 --75.9344 --75.925 --75.9406 --75.9266 --75.9328 --75.9406 --75.9297 --75.9391 --75.9406 --75.9469 --75.9406 --75.9297 --75.9437 --75.9375 --75.9422 --75.9391 --75.9422 --75.9297 --75.9344 --75.9422 --75.9547 --75.9484 --75.9359 --75.9344 --75.9359 --75.9328 --75.9359 --75.9297 --75.9313 --75.9297 --75.9297 --75.9172 --75.9266 --75.9344 --75.9266 --75.9266 --75.9406 --75.9391 --75.9422 --75.95 --75.9281 --75.9313 --75.9375 --75.9437 --75.9297 --75.9359 --75.9437 --75.9344 --75.9328 --75.9406 --75.9422 --75.9328 --75.9344 --75.9453 --75.9328 --75.9328 --75.9375 --75.9359 --75.9359 --75.9422 --75.9547 --75.925 --75.9359 --75.9422 --75.9375 --75.9375 --75.9203 --75.9391 --75.9437 --75.9391 --75.9313 --75.925 --75.9328 --75.9266 --75.9344 --75.9313 --75.9328 --75.9266 --75.9375 --75.9406 --75.9359 --75.9359 --75.9328 --75.9469 --75.9266 --75.9297 --75.9328 --75.9281 --75.9266 --75.9453 --75.9469 --75.9391 --75.9422 --75.9219 --75.9359 --75.9375 --75.9437 --75.9344 --75.9297 --75.9344 --75.9469 --75.9297 --75.9422 --75.9281 --75.9422 --75.9406 --75.9313 --75.9359 --75.9219 --75.9219 --75.9297 --75.9187 --75.9391 --75.9328 --75.9391 --75.9437 --75.9297 --75.9375 --75.9313 --75.9375 --75.9437 --75.9406 --75.9406 --75.9344 --75.9375 --75.95 --75.9359 --75.9313 --75.9406 --75.9313 --75.9359 --75.9375 --75.9281 --75.9344 --75.9469 --75.9437 --75.9422 --75.9406 --75.9406 --75.9344 --75.9469 --75.9422 --75.9422 --75.9375 --75.9453 --75.9344 --75.9547 --75.9375 --75.9469 --75.9344 --75.9359 --75.9344 --75.9563 --75.9391 --75.9422 --75.9531 --75.9484 --75.95 --75.9563 --75.9281 --75.9375 --75.9469 --75.9375 --75.9406 --75.9297 --75.9578 --75.9375 --75.9484 --75.9531 --75.9594 --75.9391 --75.9422 --75.95 --75.9437 --75.9422 --75.9547 --75.9469 --75.95 --75.9375 --75.9375 --75.9469 --75.9578 --75.95 --75.9547 --75.9531 --75.9453 --75.9406 --75.9484 --75.9453 --75.9406 --75.95 --75.9469 --75.9453 --75.9469 --75.95 --75.9656 --75.9422 --75.9453 --75.9422 --75.9406 --75.9469 --75.9313 --75.9313 --75.9547 --75.9469 --75.9359 --75.9328 --75.9516 --75.9531 --75.9469 --75.9484 --75.9531 --75.9437 --75.9437 --75.9422 --75.9219 --75.9484 --75.95 --75.9344 --75.9297 --75.9391 --75.9375 --75.9391 --75.9422 --75.9453 --75.9469 --75.9453 --75.9359 --75.9563 --75.9422 --75.9437 --75.9484 --75.9453 --75.9422 --75.9531 --75.9484 --75.9406 --75.9328 --75.9547 --75.9422 --75.9406 --75.9359 --75.9328 --75.9391 --75.9422 --75.9437 --75.9547 --75.9516 --75.9422 --75.9453 --75.9437 --75.9422 --75.95 --75.9531 --75.9453 --75.9406 --75.9422 --75.9297 --75.9484 --75.9328 --75.9422 --75.9375 --75.9437 --75.9359 --75.9563 --75.9359 --75.95 --75.9437 --75.9375 --75.9391 --75.9281 --75.9281 --75.9453 --75.9344 --75.9406 --75.9484 --75.9234 --75.9328 --75.9344 --75.9469 --75.9375 --75.9266 --75.9297 --75.9359 --75.9328 --75.95 --75.9578 --75.95 --75.9422 --75.9453 --75.9422 --75.9406 --75.9641 --75.9437 --75.9484 --75.9344 --75.9375 --75.9406 --75.9469 --75.9313 --75.9406 --75.9391 --75.9375 --75.9422 --75.9453 --75.9313 --75.9469 --75.9422 --75.9359 --75.9344 --75.9266 --75.9375 --75.9406 --75.9359 --75.9313 --75.9391 --75.9313 --75.9328 --75.9281 --75.9406 --75.9344 --75.9344 --75.9375 --75.9359 --75.9406 --75.9344 --75.9344 --75.9313 --75.9313 --75.9297 --75.9359 --75.9359 --75.9328 --75.9453 --75.9453 --75.9391 --75.9422 --75.9422 --75.9359 --75.9375 --75.9437 --75.9313 --75.9187 --75.9328 --75.9422 --75.9359 --75.9375 --75.9531 --75.9437 --75.9406 --75.9437 --75.9484 --75.9422 --75.9453 --75.9375 --75.9406 --75.9359 --75.9313 --75.9391 --75.9453 --75.9484 --75.9609 --75.9391 --75.9469 --75.9375 --75.9453 --75.9313 --75.9531 --75.9359 --75.9344 --75.9406 --75.9328 --75.9391 --75.9469 --75.9453 --75.95 --75.9484 --75.9359 --75.9547 --75.9391 --75.9422 --75.9422 --75.9453 --75.9234 --75.9437 --75.9313 --75.9422 --75.9453 --75.9422 --75.9469 --75.9375 --75.95 --75.9422 --75.9281 --75.9516 --75.9422 --75.9406 --75.925 --75.95 --75.9453 --75.9469 --75.9453 --75.9297 --75.9391 --75.9406 --75.9328 --75.9297 --75.9313 --75.9297 --75.9359 --75.9313 --75.9375 --75.9187 --75.9359 --75.9391 --75.9391 --75.9469 --75.9313 --75.9406 --75.9359 --75.9422 --75.9172 --75.9406 --75.9422 --75.9297 --75.9391 --75.9406 --75.9328 --75.9437 --75.9453 --75.9453 --75.9531 --75.9359 --75.9297 --75.9437 --75.9391 --75.9219 --75.9328 --75.9281 --75.9297 --75.9484 --75.9266 --75.9453 --75.9266 --75.9437 --75.9313 --75.9484 --75.9422 --75.9359 --75.9406 --75.9422 --75.9359 --75.9359 --75.9406 --75.9328 --75.9328 --75.9313 --75.9328 --75.9422 --75.9313 --75.9406 --75.9328 --75.9391 --75.9344 --75.9313 --75.9422 --75.9281 --75.9313 --75.9359 --75.9359 --75.9344 --75.9344 --75.9406 --75.9375 --75.9375 --75.9453 --75.9328 --75.9281 --75.9359 --75.9391 --75.9422 --75.9469 --75.9344 --75.9437 --75.9234 --75.9313 --75.9375 --75.9297 --75.925 --75.9266 --75.9266 --75.9422 --75.9391 --75.9422 --75.9422 --75.9359 --75.9344 --75.9453 --75.9547 --75.9391 --75.9422 --75.9344 --75.9313 --75.9375 --75.9281 --75.9313 --75.9328 --75.9437 --75.9328 --75.9437 --75.925 --75.9328 --75.9313 --75.95 --75.9437 --75.9391 --75.9328 --75.9281 --75.9547 --75.9375 --75.9266 --75.9375 --75.9313 --75.9391 --75.9328 --75.9391 --75.9344 --75.9375 --75.9234 --75.9297 --75.9359 --75.9281 --75.9266 --75.9266 --75.9313 --75.9328 --75.9281 --75.9344 --75.9313 --75.95 --75.9328 --75.9547 --75.9375 --75.9406 --75.9437 --75.9422 --75.9391 --75.9328 --75.9531 --75.9406 --75.95 --75.9375 --75.9578 --75.9406 --75.9469 --75.9391 --75.9516 --75.9437 --75.9469 --75.9516 --75.9328 --75.9313 --75.9484 --75.9391 --75.9437 --75.9344 --75.9344 --75.9469 --75.9391 --75.9516 --75.9484 --75.9547 --75.9375 --75.95 --75.9313 --75.9328 --75.95 --75.9375 --75.9344 --75.9547 --75.9313 --75.9359 --75.9344 --75.9422 --75.9422 --75.9313 --75.9313 --75.95 --75.9469 --75.9234 --75.9391 --75.9406 --75.9297 --75.9375 --75.9391 --75.9422 --75.9422 --75.9422 --75.9484 --75.9406 --75.9328 --75.9359 --75.9328 --75.9281 --75.9375 --75.9391 --75.9437 --75.9453 --75.9453 --75.9344 --75.9313 --75.9547 --75.9406 --75.9406 --75.9437 --75.9281 --75.9359 --75.9469 --75.9266 --75.9359 --75.9359 --75.9297 --75.9328 --75.9406 --75.9375 --75.95 --75.9359 --75.9469 --75.9313 --75.9359 --75.9484 --75.9422 --75.9313 --75.9437 --75.95 --75.9281 --75.9437 --75.9437 --75.9391 --75.9375 --75.9516 --75.9344 --75.9313 --75.9437 --75.9406 --75.9406 --75.9437 --75.9391 --75.9375 --75.9422 --75.9359 --75.9469 --75.9391 --75.9531 --75.9422 --75.925 --75.9375 --75.9297 --75.9359 --75.9328 --75.9234 --75.9406 --75.9375 --75.9406 --75.9391 --75.9406 --75.9313 --75.9406 --75.9453 --75.9437 --75.9391 --75.95 --75.9406 --75.9422 --75.9297 --75.9391 --75.9281 --75.9281 --75.9234 --75.9359 --75.9328 --75.9422 --75.9375 --75.9313 --75.9219 --75.95 --75.9344 --75.9484 --75.9437 --75.9313 --75.9344 --75.9375 --75.9453 --75.9516 --75.9375 --75.9391 --75.9344 --75.9406 --75.9375 --75.9422 --75.9391 --75.9344 --75.9375 --75.9406 --75.95 --75.9328 --75.9437 --75.9484 --75.9391 --75.9469 --75.9516 --75.9406 --75.9484 --75.9453 --75.9406 --75.9453 --75.9484 --75.9594 --75.9594 --75.9531 --75.9406 --75.9578 --75.9406 --75.9406 --75.95 --75.9453 --75.9469 --75.9422 --75.9469 --75.9344 --75.9453 --75.9453 --75.9437 --75.9453 --75.9547 --75.9328 --75.9422 --75.9375 --75.9437 --75.9359 --75.9391 --75.9391 --75.9469 --75.9422 --75.9344 --75.95 --75.9437 --75.9422 --75.9406 --75.9453 --75.9469 --75.9437 --75.9469 --75.9406 --75.9344 --75.9375 --75.9375 --75.9359 --75.9422 --75.9375 --75.9422 --75.9328 --75.9219 --75.9328 --75.9187 --75.9266 --75.9297 --75.9266 --75.9297 --75.9391 --75.9344 --75.9219 --75.9281 --75.9313 --75.9375 --75.9375 --75.9391 --75.9328 --75.9328 --75.9375 --75.9437 --75.925 --75.9281 --75.9391 --75.9297 --75.9359 --75.9203 --75.9344 --75.9328 --75.9344 --75.9437 --75.9422 --75.9313 --75.9281 --75.9453 --75.9453 --75.9453 --75.925 --75.9359 --75.9422 --75.9172 --75.925 --75.9328 --75.9469 --75.9391 --75.9359 --75.9359 --75.9406 --75.9297 --75.9437 --75.9219 --75.9313 --75.9234 --75.9297 --75.9234 --75.9219 --75.9281 --75.9313 --75.9297 --75.9297 --75.9234 --75.9266 --75.9375 --75.9391 --75.9375 --75.9375 --75.9422 --75.95 --75.9594 --75.9484 --75.9344 --75.9391 --75.95 --75.9359 --75.9484 --75.9484 --75.95 --75.9453 --75.9344 --75.9422 --75.9391 --75.9469 --75.9531 --75.9453 --75.9359 --75.9375 --75.9375 --75.9406 --75.9406 --75.9531 --75.9484 --75.9437 --75.9437 --75.9266 --75.9437 --75.9422 --75.9484 --75.9281 --75.9391 --75.9547 --75.9516 --75.9391 --75.9391 --75.9406 --75.9453 --75.9359 --75.9375 --75.9453 --75.9297 --75.9406 --75.95 --75.9563 --75.9484 --75.9391 --75.9406 --75.95 --75.9578 --75.9453 --75.9484 --75.9641 --75.9469 --75.9516 --75.9609 --75.9469 --75.9391 --75.9406 --75.9453 --75.9516 --75.95 --75.9594 --75.9625 --75.9484 --75.9469 --75.9266 --75.9531 --75.9422 --75.9391 --75.9531 --75.9453 --75.9469 --75.9297 --75.9469 --75.9422 --75.9297 --75.9344 --75.9281 --75.9313 --75.925 --75.9344 --75.9328 --75.9328 --75.9484 --75.9344 --75.9406 --75.9469 --75.9422 --75.9531 --75.9375 --75.9484 --75.95 --75.9375 --75.9391 --75.9516 --75.9281 --75.9344 --75.9422 --75.9422 --75.9234 --75.9578 --75.9406 --75.9391 --75.9484 --75.9344 --75.9422 --75.9453 --75.9531 --75.9422 --75.95 --75.9625 --75.9422 --75.9437 --75.95 --75.9437 --75.9328 --75.9391 --75.9375 --75.9234 --75.9359 --75.9313 --75.9453 --75.9375 --75.9391 --75.9359 --75.9359 --75.9484 --75.9359 --75.9266 --75.9422 --75.9344 --75.9437 --75.9344 --75.9391 --75.9531 --75.9516 --75.9453 --75.9328 --75.9406 --75.9391 --75.9453 --75.9422 --75.9422 --75.9453 --75.9437 --75.9484 --75.9453 --75.9516 --75.9406 --75.95 --75.9469 --75.9516 --75.9453 --75.9313 --75.9453 --75.9422 --75.9437 --75.9516 --75.95 --75.9484 --75.9422 --75.9484 --75.9609 --75.9422 --75.9437 --75.9437 --75.9406 --75.9437 --75.9422 --75.9422 --75.9359 --75.9391 --75.9359 --75.9578 --75.9453 --75.9313 --75.9297 --75.9391 --75.9406 --75.9297 --75.9391 --75.9313 --75.925 --75.9344 --75.9469 --75.9344 --75.9437 --75.9375 --75.9453 --75.9313 --75.9219 --75.9422 --75.9484 --75.9359 --75.9344 --75.9437 --75.9391 --75.9469 --75.9531 --75.9453 --75.9437 --75.9578 --75.9609 --75.9406 --75.9328 --75.9422 --75.9422 --75.9422 --75.9453 --75.9406 --75.95 --75.95 --75.9469 --75.9437 --75.95 --75.9547 --75.95 --75.9437 --75.9547 --75.9453 --75.9469 --75.9422 --75.9484 --75.9578 --75.9453 --75.9344 --75.9313 --75.9406 --75.9437 --75.9328 --75.9422 --75.9406 --75.9375 --75.9297 --75.9406 --75.9406 --75.9344 --75.9422 --75.9453 --75.9484 --75.9484 --75.9422 --75.9375 --75.9281 --75.9516 --75.9453 --75.9344 --75.9375 --75.95 --75.9375 --75.9437 --75.9437 --75.9453 --75.9578 --75.9453 --75.9484 --75.9453 --75.9359 --75.9375 --75.9328 --75.9469 --75.9453 --75.9563 --75.9391 --75.9484 --75.9469 --75.9516 --75.9344 --75.95 --75.9563 --75.9531 --75.9359 --75.9437 --75.9531 --75.9453 --75.9609 --75.95 --75.9547 --75.9484 --75.9563 --75.9484 --75.9484 --75.95 --75.9531 --75.95 --75.9344 --75.9484 --75.9422 --75.9531 --75.9484 --75.9531 --75.9563 --75.9484 --75.9484 --75.9547 --75.9531 --75.9578 --75.9516 --75.9609 --75.9437 --75.9469 --75.9422 --75.9531 --75.9484 --75.9437 --75.9672 --75.9437 --75.9625 --75.9547 --75.9484 --75.9531 --75.9422 --75.9547 --75.9531 --75.9594 --75.9516 --75.9516 --75.9641 --75.9531 --75.9531 --75.9406 --75.9469 --75.9547 --75.9484 --75.9563 --75.9375 --75.9516 --75.9328 --75.9453 --75.9437 --75.9453 --75.9484 --75.9359 --75.9375 --75.9437 --75.9516 --75.9297 --75.9437 --75.9453 --75.9359 --75.9469 --75.9391 --75.95 --75.9344 --75.9531 --75.9422 --75.9328 --75.9484 --75.9453 --75.9359 --75.9453 --75.9437 --75.9453 --75.9375 --75.9437 --75.9391 --75.9578 --75.9453 --75.9516 --75.9547 --75.9375 --75.9422 --75.9375 --75.9469 --75.9484 --75.9609 --75.9547 --75.9578 --75.9609 --75.9563 --75.9641 --75.9453 --75.9578 --75.9547 --75.9437 --75.9359 --75.9484 --75.9437 --75.9422 --75.9344 --75.9375 --75.9344 --75.9391 --75.9531 --75.9344 --75.9406 --75.9578 --75.9437 --75.9531 --75.9578 --75.9453 --75.9656 --75.9563 --75.9469 --75.9547 --75.9563 --75.9516 --75.95 --75.9453 --75.9594 --75.9672 --75.9484 --75.9609 --75.9547 --75.9563 --75.9531 --75.9578 --75.9469 --75.9469 --75.9578 --75.9484 --75.9563 --75.9375 --75.9609 --75.9578 --75.95 --75.9531 --75.9656 --75.9656 --75.9594 --75.9437 --75.9469 --75.9547 --75.9469 --75.9531 --75.9609 --75.9609 --75.9547 --75.9547 --75.9578 --75.9516 --75.9469 --75.9609 --75.9437 --75.9578 --75.9563 --75.95 --75.9594 --75.9453 --75.9578 --75.95 --75.9547 --75.9625 --75.9516 --75.9516 --75.9578 --75.9547 --75.9531 --75.9594 --75.9563 --75.9609 --75.9469 --75.9422 --75.9547 --75.9453 --75.9547 --75.9531 --75.9453 --75.9625 --75.9516 --75.9516 --75.9547 --75.9484 --75.9547 --75.95 --75.9469 --75.9437 --75.9297 --75.95 --75.9469 --75.9469 --75.9531 --75.9656 --75.9641 --75.9437 --75.9391 --75.9484 --75.9484 --75.9281 --75.9422 --75.95 --75.9406 --75.9437 --75.9422 --75.9437 --75.925 --75.9453 --75.9328 --75.9375 --75.9297 --75.9328 --75.9344 --75.9422 --75.9375 --75.9437 --75.9469 --75.9391 --75.9391 --75.9422 --75.9313 --75.9531 --75.9406 --75.9469 --75.9391 --75.925 --75.9391 --75.95 --75.9281 --75.9469 --75.9328 --75.9453 --75.9313 --75.9359 --75.9391 --75.9359 --75.9391 --75.9422 --75.9313 --75.9484 --75.9344 --75.9297 --75.9469 --75.9375 --75.9359 --75.9266 --75.9484 --75.9375 --75.9422 --75.9328 --75.9375 --75.9437 --75.9469 --75.9313 --75.9187 --75.9437 --75.9484 --75.95 --75.9297 --75.9375 --75.9547 --75.9453 --75.9469 --75.9359 --75.9406 --75.9547 --75.9359 --75.9359 --75.9531 --75.9437 --75.9578 --75.9437 --75.9391 --75.9484 --75.9453 --75.9453 --75.9484 --75.9484 --75.9359 --75.9391 --75.9344 --75.9375 --75.9344 --75.9359 --75.9359 --75.9453 --75.9313 --75.9422 --75.9344 --75.9406 --75.9516 --75.9516 --75.9359 --75.9328 --75.9547 --75.9453 --75.9156 --75.9453 --75.95 --75.9313 --75.9469 --75.9406 --75.9281 --75.9313 --75.9406 --75.9531 --75.9484 --75.9469 --75.9406 --75.9422 --75.9375 --75.9422 --75.9359 --75.9328 --75.9328 --75.9391 --75.9344 --75.9437 --75.9313 --75.9203 --75.9313 --75.9297 --75.9297 --75.9328 --75.9391 --75.9375 --75.9359 --75.9359 --75.9313 --75.9297 --75.9359 --75.9375 --75.9375 --75.9344 --75.9344 --75.9328 --75.9422 --75.9391 --75.9437 --75.9469 --75.9453 --75.9484 --75.9516 --75.9375 --75.9391 --75.9375 --75.9328 --75.9422 --75.95 --75.9344 --75.9469 --75.9375 --75.9391 --75.9516 --75.9359 --75.95 --75.9437 --75.9328 --75.9375 --75.9422 --75.9313 --75.9344 --75.9313 --75.9313 --75.9391 --75.9391 --75.9437 --75.9563 --75.9484 --75.9516 --75.9453 --75.9563 --75.9391 --75.9625 --75.9484 --75.9516 --75.95 --75.9375 --75.9453 --75.9578 --75.9531 --75.9594 --75.9547 --75.9484 --75.9422 --75.95 --75.95 --75.9516 --75.9563 --75.9547 --75.9484 --75.9469 --75.9609 --75.9437 --75.9469 --75.9516 --75.9375 --75.9609 --75.9406 --75.9453 --75.9469 --75.9531 --75.9437 --75.9375 --75.9469 --75.9516 --75.9453 --75.9375 --75.9531 --75.9531 --75.9437 --75.9563 --75.9484 --75.9594 --75.9391 --75.9484 --75.9516 --75.9359 --75.9344 --75.9547 --75.9469 --75.9375 --75.9437 --75.9375 --75.9406 --75.95 --75.9437 --75.9437 --75.9422 --75.9406 --75.9453 --75.9484 --75.9437 --75.9344 --75.9297 --75.9297 --75.9297 --75.9234 --75.9281 --75.9453 --75.9328 --75.9328 --75.9359 --75.9328 --75.9328 --75.9453 --75.9391 --75.9234 --75.9375 --75.9563 --75.9328 --75.9375 --75.9359 --75.9469 --75.9422 --75.9375 --75.9328 --75.9406 --75.9437 --75.9281 --75.9375 --75.9406 --75.9313 --75.9281 --75.925 --75.9313 --75.9375 --75.95 --75.9422 --75.9531 --75.9469 --75.9531 --75.9344 --75.9516 --75.9437 --75.9266 --75.9375 --75.9391 --75.9516 --75.9344 --75.9391 --75.9469 --75.9406 --75.9406 --75.9484 --75.9313 --75.9422 --75.9391 --75.9484 --75.9359 --75.9609 --75.9406 --75.9516 --75.9469 --75.9453 --75.9422 --75.9359 --75.9453 --75.9484 --75.9437 --75.9391 --75.95 --75.95 --75.9469 --75.9422 --75.9437 --75.9313 --75.9437 --75.9484 --75.9359 --75.9313 --75.9391 --75.9422 --75.9422 --75.9266 --75.9344 --75.9328 --75.9313 --75.9453 --75.9406 --75.9406 --75.9266 --75.9375 --75.9359 --75.9344 --75.9313 --75.9375 --75.9328 --75.9391 --75.9344 --75.9484 --75.9437 --75.9406 --75.9453 --75.9391 --75.9328 --75.9437 --75.9422 --75.9391 --75.9422 --75.9281 --75.9516 --75.9359 --75.9344 --75.9406 --75.9437 --75.9437 --75.9437 --75.9359 --75.9437 --75.9391 --75.9422 --75.9422 --75.9516 --75.9531 --75.9437 --75.95 --75.9453 --75.9375 --75.9391 --75.9406 --75.9516 --75.9406 --75.9437 --75.9484 --75.9469 --75.9594 --75.9484 --75.9516 --75.9328 --75.9453 --75.9297 --75.9391 --75.9437 --75.9406 --75.9313 --75.9359 --75.9359 --75.9344 --75.9281 --75.9437 --75.9531 --75.9391 --75.9531 --75.9422 --75.9469 --75.9344 --75.9406 --75.9469 --75.9594 --75.9344 --75.9281 --75.9484 --75.9516 --75.9406 --75.9422 --75.9359 --75.9422 --75.9375 --75.9297 --75.9437 --75.9328 --75.9266 --75.9453 --75.9313 --75.9375 --75.9453 --75.9266 --75.9297 --75.9281 --75.9406 --75.9406 --75.9266 --75.9453 --75.9437 --75.9422 --75.9422 --75.95 --75.9406 --75.9469 --75.9344 --75.9344 --75.9344 --75.9297 --75.9297 --75.9313 --75.9344 --75.9437 --75.9469 --75.9281 --75.9359 --75.9344 --75.9359 --75.9422 --75.9422 --75.9344 --75.9391 --75.9516 --75.95 --75.9359 --75.9437 --75.9344 --75.9328 --75.9391 --75.9375 --75.9469 --75.9391 --75.9313 --75.9484 --75.9578 --75.9453 --75.9406 --75.9609 --75.9484 --75.9453 --75.9594 --75.9531 --75.9375 --75.9484 --75.95 --75.9531 --75.9563 --75.9531 --75.9516 --75.9344 --75.9516 --75.9422 --75.9453 --75.9437 --75.9437 --75.9422 --75.9516 --75.9469 --75.9328 --75.9469 --75.9437 --75.9391 --75.9453 --75.9391 --75.9391 --75.9406 --75.9391 --75.9469 --75.9328 --75.9391 --75.9406 --75.9422 --75.9313 --75.9422 --75.9453 --75.9375 --75.9359 --75.9453 --75.9437 --75.9297 --75.9313 --75.9391 --75.9422 --75.9375 --75.9359 --75.9563 --75.9406 --75.9422 --75.9406 --75.9359 --75.9484 --75.9391 --75.9422 --75.925 --75.9469 --75.9281 --75.9469 --75.9453 --75.9422 --75.9516 --75.9328 --75.9531 --75.9359 --75.9422 --75.9391 --75.9547 --75.9469 --75.9313 --75.9547 --75.9453 --75.9422 --75.9469 --75.9547 --75.9297 --75.9484 --75.9469 --75.9437 --75.95 --75.95 --75.9531 --75.9453 --75.95 --75.9391 --75.9484 --75.9531 --75.9609 --75.9469 --75.9422 --75.9516 --75.9578 --75.9469 --75.9516 --75.9375 --75.9328 --75.9344 --75.9563 --75.9437 --75.9437 --75.9453 --75.9391 --75.9484 --75.9437 --75.9422 --75.95 --75.9516 --75.9531 --75.9328 --75.9594 --75.9437 --75.9453 --75.9484 --75.9422 --75.9406 --75.9453 --75.9375 --75.9328 --75.9484 --75.9469 --75.9391 --75.9391 --75.95 --75.9437 --75.9422 --75.95 --75.9516 --75.9516 --75.9516 --75.9422 --75.9469 --75.9578 --75.9375 --75.9406 --75.9516 --75.9469 --75.9469 --75.9375 --75.9516 --75.9516 --75.9406 --75.9437 --75.9344 --75.9375 --75.9453 --75.9297 --75.9609 --75.95 --75.9437 --75.9406 --75.9594 --75.9453 --75.9484 --75.9406 --75.9453 --75.9375 --75.9453 --75.9484 --75.95 --75.9437 --75.95 --75.9391 --75.9484 --75.9547 --75.9281 --75.9609 --75.9391 --75.9359 --75.9469 --75.9344 --75.9297 --75.9453 --75.9391 --75.9469 --75.9547 --75.9391 --75.9531 --75.9453 --75.9328 --75.9406 --75.9437 --75.9344 --75.9391 --75.9406 --75.9563 --75.9359 --75.9422 --75.9422 --75.95 --75.9516 --75.9469 --75.9484 --75.9406 --75.9531 --75.9578 --75.9453 --75.9531 --75.9484 --75.9469 --75.9297 --75.9531 --75.9391 --75.95 --75.9437 --75.9375 --75.9375 --75.9453 --75.95 --75.9422 --75.9516 --75.9469 --75.9375 --75.95 --75.95 --75.9453 --75.9469 --75.95 --75.9516 --75.9406 --75.9328 --75.9547 --75.9375 --75.9406 --75.9563 --75.9391 --75.9453 --75.9516 --75.9656 --75.9437 --75.9484 --75.9609 --75.9547 --75.9547 --75.9437 --75.9625 --75.9594 --75.9422 --75.9297 --75.9578 --75.9703 --75.9359 --75.9344 --75.9516 --75.9437 --75.9422 --75.9547 --75.9422 --75.9578 --75.9359 --75.9422 --75.9406 --75.9484 --75.9203 --75.9406 --75.9453 --75.9453 --75.9375 --75.9437 --75.9594 --75.9719 --75.95 --75.9547 --75.9531 --75.9578 --75.9359 --75.9469 --75.9437 --75.95 --75.9375 --75.9578 --75.9297 --75.9422 --75.9359 --75.9516 --75.95 --75.9422 --75.9344 --75.9297 --75.9375 --75.9406 --75.9344 --75.9422 --75.9328 --75.9375 --75.9328 --75.9266 --75.9391 --75.9516 --75.95 --75.9453 --75.9375 --75.9437 --75.9406 --75.9531 --75.9453 --75.9406 --75.9484 --75.9453 --75.9469 --75.9437 --75.95 --75.9531 --75.9531 --75.9594 --75.9453 --75.9437 --75.9563 --75.9469 --75.9563 --75.9469 --75.9563 --75.9469 --75.9516 --75.9406 --75.9422 --75.9484 --75.9328 --75.9484 --75.9406 --75.9469 --75.9375 --75.9437 --75.9469 --75.9469 --75.9516 --75.9406 --75.9391 --75.9531 --75.9516 --75.9422 --75.9594 --75.9641 --75.9625 --75.9391 --75.95 --75.9484 --75.95 --75.9609 --75.9641 --75.9484 --75.9516 --75.9547 --75.9484 --75.9516 --75.9375 --75.9391 --75.9422 --75.9391 --75.9547 --75.9422 --75.9297 --75.9422 --75.9531 --75.9469 --75.9437 --75.9703 --75.9578 --75.9422 --75.9484 --75.9406 --75.9422 --75.9516 --75.9406 --75.9516 --75.9484 --75.9516 --75.9469 --75.9406 --75.95 --75.9422 --75.9563 --75.9422 --75.9578 --75.9344 --75.9406 --75.9391 --75.9531 --75.9391 --75.9547 --75.9578 --75.95 --75.9484 --75.9594 --75.9406 --75.9422 --75.9344 --75.9516 --75.9484 --75.9391 --75.9437 --75.9469 --75.9328 --75.9453 --75.9453 --75.9469 --75.9453 --75.9422 --75.9375 --75.9578 --75.9469 --75.9328 --75.9297 --75.9375 --75.9516 --75.9469 --75.9469 --75.9516 --75.9391 --75.9469 --75.9531 --75.9375 --75.9437 --75.9328 --75.9516 --75.9313 --75.9453 --75.9422 --75.9453 --75.9469 --75.9453 --75.9594 --75.9469 --75.95 --75.9469 --75.9484 --75.9516 --75.9359 --75.9469 --75.9422 --75.9484 --75.9422 --75.9469 --75.9594 --75.95 --75.9391 --75.9328 --75.9469 --75.9437 --75.9313 --75.9531 --75.9547 --75.9563 --75.9437 --75.9484 --75.95 --75.95 --75.9313 --75.9406 --75.9437 --75.9453 --75.9328 --75.9328 --75.9437 --75.9391 --75.9422 --75.9375 --75.9359 --75.9359 --75.9328 --75.9563 --75.9437 --75.9422 --75.9437 --75.9469 --75.95 --75.9469 --75.9391 --75.9375 --75.9375 --75.9344 --75.9422 --75.9437 --75.9437 --75.9484 --75.9453 --75.9375 --75.9516 --75.9328 --75.95 --75.9328 --75.9484 --75.9469 --75.9516 --75.9453 --75.9484 --75.9484 --75.9531 --75.9563 --75.9406 --75.9563 --75.9516 --75.9531 --75.9437 --75.9469 --75.9531 --75.95 --75.9516 --75.9531 --75.9578 --75.9437 --75.9469 --75.9453 --75.95 --75.9516 --75.95 --75.9531 --75.9484 --75.9469 --75.9578 --75.9641 --75.95 --75.9344 --75.9422 --75.9516 --75.9422 --75.9484 --75.9609 --75.9547 --75.9422 --75.95 --75.9516 --75.9453 --75.9578 --75.9609 --75.9578 --75.9563 --75.9484 --75.9531 --75.9547 --75.9594 --75.9578 --75.9594 --75.9563 --75.9547 --75.9625 --75.9641 --75.9609 --75.9656 --75.9531 --75.9641 --75.9547 --75.9422 --75.9516 --75.9563 --75.9453 --75.9453 --75.9547 --75.9484 --75.9625 --75.9547 --75.9609 --75.9422 --75.9437 --75.9578 --75.9547 --75.95 --75.9516 --75.9641 --75.9453 --75.9531 --75.9469 --75.9531 --75.9422 --75.9453 --75.9391 --75.9594 --75.9359 --75.9437 --75.9594 --75.9297 --75.9547 --75.9484 --75.9609 --75.9547 --75.9766 --75.9531 --75.9453 --75.9734 --75.9594 --75.9531 --75.9547 --75.9375 --75.9594 --75.9641 --75.9531 --75.9641 --75.9531 --75.9625 --75.9516 --75.9391 --75.9531 --75.9547 --75.9656 --75.9469 --75.9516 --75.9437 --75.9469 --75.9484 --75.9563 --75.95 --75.9469 --75.9609 --75.9547 --75.9422 --75.9625 --75.9516 --75.9609 --75.95 --75.9484 --75.9578 --75.9531 --75.9453 --75.9531 --75.9625 --75.9406 --75.9516 --75.9516 --75.95 --75.9469 --75.9531 --75.9578 --75.9641 --75.95 --75.9578 --75.9484 --75.9641 --75.9516 --75.9516 --75.9766 --75.9469 --75.9453 --75.9484 --75.9484 --75.9531 --75.9594 --75.9641 --75.95 --75.9484 --75.9484 --75.9547 --75.95 --75.9719 --75.9453 --75.9484 --75.9422 --75.9516 --75.9656 --75.9516 --75.9594 --75.9625 --75.9594 --75.9625 --75.9594 --75.9578 --75.9563 --75.9734 --75.9563 --75.9656 --75.9641 --75.9516 --75.9703 --75.9531 --75.9547 --75.9594 --75.9594 --75.9656 --75.9609 --75.9625 --75.9672 --75.9719 --75.9641 --75.9484 --75.9688 --75.9594 --75.95 --75.9609 --75.95 --75.9422 --75.9547 --75.9563 --75.9625 --75.9547 --75.9484 --75.9531 --75.9563 --75.9531 --75.9563 --75.95 --75.9547 --75.9625 --75.9609 --75.9563 --75.9609 --75.9625 --75.9531 --75.9531 --75.9688 --75.9641 --75.9594 --75.9625 --75.9563 --75.9672 --75.975 --75.9656 --75.9641 --75.9578 --75.9547 --75.9609 --75.9469 --75.975 --75.9469 --75.9563 --75.9641 --75.9563 --75.9703 --75.9625 --75.9625 --75.9703 --75.9656 --75.9563 --75.9703 --75.9547 --75.9719 --75.9641 --75.9719 --75.9516 --75.9625 --75.9578 --75.9688 --75.9469 --75.9547 --75.9391 --75.9734 --75.9484 --75.9531 --75.9484 --75.9531 --75.9531 --75.9547 --75.9484 --75.9609 --75.95 --75.9594 --75.975 --75.9594 --75.9625 --75.9391 --75.9516 --75.95 --75.9563 --75.9656 --75.9578 --75.9578 --75.9594 --75.9625 --75.9594 --75.9469 --75.9484 --75.9531 --75.9625 --75.9656 --75.9516 --75.9578 --75.9578 --75.9594 --75.9453 --75.9516 --75.9453 --75.9641 --75.9391 --75.9484 --75.9453 --75.9422 --75.9609 --75.9563 --75.9688 --75.9609 --75.9328 --75.9437 --75.9594 --75.9453 --75.9531 --75.9688 --75.9516 --75.9469 --75.9594 --75.9625 --75.9516 --75.9547 --75.9469 --75.9563 --75.9375 --75.9422 --75.9516 --75.9453 --75.9516 --75.9531 --75.95 --75.9313 --75.9406 --75.9422 --75.9391 --75.9516 --75.9547 --75.9453 --75.9547 --75.9422 --75.95 --75.9531 --75.9375 --75.9375 --75.9453 --75.9594 --75.9437 --75.95 --75.9453 --75.9437 --75.9484 --75.9391 --75.9422 --75.9484 --75.9484 --75.9375 --75.9453 --75.9547 --75.9328 --75.9359 --75.9484 --75.9531 --75.9437 --75.95 --75.9563 --75.9516 --75.9609 --75.9516 --75.9516 --75.9328 --75.9641 --75.9469 --75.9437 --75.9391 --75.95 --75.9484 --75.9625 --75.9437 --75.95 --75.9531 --75.9453 --75.9547 --75.9547 --75.9313 --75.9469 --75.9469 --75.9531 --75.9437 --75.9406 --75.9437 --75.9469 --75.9437 --75.9313 --75.9625 --75.9422 --75.9484 --75.9391 --75.9516 --75.9375 --75.9391 --75.9437 --75.9344 --75.95 --75.9422 --75.9469 --75.9516 --75.9391 --75.95 --75.9437 --75.9453 --75.9547 --75.95 --75.9516 --75.9609 --75.9391 --75.9516 --75.9344 --75.9547 --75.9688 --75.9531 --75.9609 --75.9641 --75.9484 --75.9516 --75.9547 --75.9484 --75.9594 --75.9484 --75.9391 --75.9469 --75.95 --75.9391 --75.9594 --75.9484 --75.9516 --75.9422 --75.9594 --75.9625 --75.9531 --75.9516 --75.9547 --75.9453 --75.95 --75.9391 --75.9563 --75.9547 --75.9484 --75.9453 --75.9516 --75.9625 --75.9547 --75.9547 --75.9469 --75.9391 --75.9625 --75.9547 --75.9437 --75.9547 --75.9391 --75.9609 --75.9594 --75.9516 --75.95 --75.9594 --75.9406 --75.9578 --75.9516 --75.9422 --75.9547 --75.95 --75.9641 --75.9531 --75.9594 --75.9563 --75.95 --75.9516 --75.9516 --75.9484 --75.9547 --75.9422 --75.9547 --75.9594 --75.9484 --75.9641 --75.9422 --75.9594 --75.95 --75.9531 --75.9547 --75.95 --75.9656 --75.9469 --75.9469 --75.9625 --75.9625 --75.9625 --75.9672 --75.9563 --75.9609 --75.9516 --75.9625 --75.9609 --75.9609 --75.9719 --75.9641 --75.9563 --75.95 --75.9547 --75.9672 --75.9547 --75.9641 --75.9594 --75.9516 --75.9609 --75.9594 --75.9469 --75.9594 --75.9609 --75.9563 --75.9641 --75.9578 --75.9719 --75.9594 --75.9594 --75.9672 --75.9609 --75.9563 --75.9641 --75.9672 --75.9516 --75.9578 --75.9547 --75.9563 --75.9734 --75.9609 --75.9672 --75.9516 --75.9563 --75.9688 --75.9563 --75.9578 --75.9594 --75.9578 --75.9594 --75.9734 --75.9484 --75.9625 --75.95 --75.9688 --75.9484 --75.9641 --75.9594 --75.9672 --75.9594 --75.9797 --75.9734 --75.9828 --75.9578 --75.9656 --75.9594 --75.9641 --75.9609 --75.9594 --75.9625 --75.9437 --75.9641 --75.9609 --75.9609 --75.9703 --75.975 --75.9656 --75.9703 --75.9688 --75.9781 --75.9656 --75.9547 --75.9688 --75.9578 --75.9656 --75.975 --75.9672 --75.9469 --75.9688 --75.9781 --75.9812 --75.9609 --75.9766 --75.9625 --75.9688 --75.9844 --75.9922 --75.9734 --75.9719 --75.9688 --75.9906 --75.9812 --75.9703 --75.975 --75.9672 --75.9844 --75.9734 --75.9703 --75.9688 --75.9719 --75.9719 --75.9734 --75.9734 --75.9594 --75.9609 --75.9672 --75.9656 --75.9563 --75.9688 --75.9688 --75.9563 --75.9531 --75.9672 --75.9672 --75.9703 --75.9641 --75.9703 --75.9578 --75.9734 --75.9641 --75.9656 --75.9609 --75.9734 --75.9594 --75.9656 --75.975 --75.9625 --75.9578 --75.9672 --75.9797 --75.9688 --75.9656 --75.9547 --75.9656 --75.9469 --75.9547 --75.9547 --75.9594 --75.9516 --75.9625 --75.9625 --75.9563 --75.9656 --75.9578 --75.9766 --75.9734 --75.975 --75.9609 --75.9641 --75.9703 --75.9672 --75.9609 --75.9797 --75.9703 --75.9766 --75.9797 --75.9812 --75.9781 --75.9703 --75.9906 --75.9656 --75.9688 --75.9703 --75.9734 --75.9766 --75.9797 --75.9688 --75.975 --75.975 --75.9641 --75.9781 --75.9797 --75.9812 --75.9672 --75.9641 --75.975 --75.9672 --75.9781 --75.9781 --75.9781 --75.9797 --75.9781 --75.9797 --75.9719 --75.9703 --75.975 --75.9703 --75.9781 --75.9656 --75.9688 --75.9656 --75.9797 --75.9703 --75.975 --75.9719 --75.9688 --75.9578 --75.9703 --75.9563 --75.9437 --75.9563 --75.9688 --75.9594 --75.9578 --75.9672 --75.9547 --75.9578 --75.9578 --75.9578 --75.9578 --75.9578 --75.9531 --75.9578 --75.9672 --75.9609 --75.9484 --75.9484 --75.9547 --75.9578 --75.9703 --75.9703 --75.9531 --75.9688 --75.9563 --75.95 --75.9609 --75.9703 --75.9703 --75.9516 --75.9688 --75.9703 --75.9703 --75.9578 --75.9766 --75.9609 --75.9703 --75.9594 --75.9734 --75.9797 --75.9641 --75.9781 --75.9812 --75.975 --75.9625 --75.9828 --75.9672 --75.9797 --75.9641 --75.9609 --75.9734 --75.9781 --75.9672 --75.9625 --75.9672 --75.9703 --75.9578 --75.9641 --75.9672 --75.9547 --75.9594 --75.9594 --75.9547 --75.9531 --75.9609 --75.9609 --75.9484 --75.9437 --75.9625 --75.9547 --75.9563 --75.9656 --75.9656 --75.9453 --75.9609 --75.9516 --75.9531 --75.9516 --75.9484 --75.95 --75.9625 --75.9437 --75.9453 --75.9672 --75.975 --75.9594 --75.9656 --75.9641 --75.9531 --75.9609 --75.9516 --75.9516 --75.9656 --75.9484 --75.9719 --75.9594 --75.9437 --75.95 --75.9453 --75.9406 --75.9375 --75.9391 --75.95 --75.95 --75.9594 --75.9516 --75.9328 --75.9484 --75.9594 --75.9625 --75.9563 --75.9531 --75.9469 --75.95 --75.9469 --75.9547 --75.9484 --75.9563 --75.9625 --75.9547 --75.9641 --75.975 --75.975 --75.9703 --75.9563 --75.9625 --75.9563 --75.9625 --75.9656 --75.9594 --75.9563 --75.9516 --75.9594 --75.9516 --75.9672 --75.9578 --75.9563 --75.9625 --75.9594 --75.9578 --75.9531 --75.9484 --75.9516 --75.9656 --75.9484 --75.9547 --75.9563 --75.9609 --75.9781 --75.9609 --75.9672 --75.9656 --75.9672 --75.9641 --75.9563 --75.9547 --75.9609 --75.9484 --75.9609 --75.9672 --75.9578 --75.9719 --75.9766 --75.9812 --75.9578 --75.9688 --75.9766 --75.9594 --75.9547 --75.9641 --75.9688 --75.9656 --75.9563 --75.9641 --75.9766 --75.975 --75.9625 --75.9625 --75.9766 --75.9563 --75.9609 --75.9594 --75.9734 --75.9734 --75.9812 --75.9578 --75.9688 --75.9594 --75.9703 --75.9703 --75.9641 --75.9719 --75.9797 --75.9719 --75.9781 --75.9656 --75.9516 --75.9656 --75.9594 --75.9719 --75.9609 --75.9609 --75.975 --75.9703 --75.9625 --75.9609 --75.9703 --75.975 --75.9656 --75.9875 --75.9672 --75.975 --75.9766 --75.9594 --75.9609 --75.975 --75.975 --75.9609 --75.9547 --75.9719 --75.9547 --75.9672 --75.9594 --75.9578 --75.9594 --75.9797 --75.9656 --75.9812 --75.9703 --75.9672 --75.9656 --75.9609 --75.9688 --75.9609 --75.9563 --75.9719 --75.9766 --75.9641 --75.9672 --75.9641 --75.9766 --75.9625 --75.9812 --75.9672 --75.975 --75.9781 --75.9703 --75.9703 --75.9641 --75.9766 --75.9625 --75.9625 --75.9594 --75.9719 --75.9688 --75.9672 --75.9531 --75.9703 --75.9594 --75.9594 --75.9688 --75.9672 --75.9734 --75.9688 --75.9656 --75.9781 --75.9703 --75.9641 --75.9656 --75.9609 --75.9625 --75.975 --75.9781 --75.975 --75.9812 --75.9672 --75.9672 --75.9672 --75.9625 --75.9797 --75.9719 --75.9672 --75.975 --75.9734 --75.9719 --75.9719 --75.9672 --75.9766 --75.9734 --75.9781 --75.9734 --75.9734 --75.9766 --75.9781 --75.9781 --75.9672 --75.9734 --75.9797 --75.9781 --75.9719 --75.9719 --75.975 --75.9766 --75.9625 --75.9734 --75.9719 --75.9641 --75.9609 --75.9578 --75.9594 --75.9703 --75.9844 --75.9719 --75.9719 --75.9734 --75.9719 --75.9734 --75.975 --75.9688 --75.9781 --75.9594 --75.9641 --75.9703 --75.9688 --75.9641 --75.9766 --75.9828 --75.9719 --75.9719 --75.9734 --75.9719 --75.9828 --75.9812 --75.9781 --75.975 --75.9641 --75.9797 --75.9688 --75.9781 --75.9828 --75.9906 --75.9859 --75.9719 --75.9734 --75.9828 --75.9875 --75.9938 --75.9734 --75.9875 --75.9766 --75.9766 --75.9719 --75.9859 --75.9672 --75.9797 --75.9844 --75.9781 --75.9906 --75.9875 --75.9859 --75.9797 --75.9859 --75.9547 --75.9719 --75.9641 --75.9656 --75.9812 --75.975 --75.9812 --75.9828 --75.9828 --75.9766 --75.9734 --75.9859 --75.9641 --75.9609 --75.9641 --75.9641 --75.9703 --75.9812 --75.9641 --75.9578 --75.9812 --75.9781 --75.9609 --75.9656 --75.9688 --75.9719 --75.9625 --75.9563 --75.9688 --75.9734 --75.975 --75.9781 --75.9656 --75.9672 --75.9641 --75.9734 --75.9703 --75.9781 --75.9688 --75.9641 --75.9641 --75.9609 --75.9672 --75.9641 --75.9656 --75.9625 --75.9672 --75.9578 --75.9625 --75.9734 --75.9656 --75.9563 --75.9625 --75.9563 --75.9703 --75.9531 --75.9594 --75.9734 --75.9672 --75.9859 --75.9688 --75.9594 --75.9563 --75.9609 --75.9547 --75.9625 --75.9781 --75.9578 --75.9844 --75.9766 --75.9719 --75.9688 --75.9719 --75.9844 --75.9781 --75.9734 --75.9594 --75.9719 --75.9781 --75.9703 --75.9703 --75.9656 --75.9656 --75.975 --75.9672 --75.9641 --75.9703 --75.975 --75.9688 --75.975 --75.9688 --75.9578 --75.9594 --75.9688 --75.9812 --75.9797 --75.9828 --75.9875 --75.9703 --75.975 --75.9516 --75.9703 --75.9594 --75.9625 --75.9641 --75.9672 --75.9828 --75.9844 --75.9766 --75.9734 --75.9781 --75.9797 --75.9656 --75.975 --75.9734 --75.9828 --75.9703 --75.9547 --75.9703 --75.9594 --75.9578 --75.9594 --75.9672 --75.9859 --75.9734 --75.9719 --75.9734 --75.9688 --75.9688 --75.9766 --75.9703 --75.975 --75.975 --75.9797 --75.9766 --75.9734 --75.9875 --75.9703 --75.9797 --75.9906 --75.9828 --75.9797 --75.9812 --75.975 --75.9734 --75.9672 --75.975 --75.9688 --75.9547 --75.9719 --75.9859 --75.9828 --75.9672 --75.9688 --75.9859 --75.9734 --75.9828 --75.9844 --75.9672 --75.9797 --75.975 --75.9859 --75.9922 --75.9891 --75.9766 --75.9828 --75.9734 --75.9609 --75.9828 --75.9859 --75.9859 --75.9844 --76 --75.9766 --75.9797 --75.9672 --75.9812 --75.9781 --75.975 --75.975 --75.9703 --75.9812 --75.9891 --75.9875 --75.9797 --75.9906 --75.9828 --75.9844 --75.9844 --75.9938 --75.9766 --75.9797 --75.9859 --75.9906 --75.9797 --75.9875 --75.9797 --75.9703 --75.9844 --75.9859 --75.9875 --75.9875 --75.975 --75.9969 --75.9734 --75.9906 --75.9891 --75.9859 --75.9844 --75.9812 --75.975 --75.9812 --75.9781 --75.9812 --75.9781 --75.9766 --75.9859 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.9828 --75.9703 --75.975 --75.9641 --75.9641 --75.9547 --75.9719 --75.95 --75.9625 --75.975 --75.9563 --75.9672 --75.9594 --75.9672 --75.9594 --75.9672 --75.9734 --75.95 --75.9734 --75.9766 --75.95 --75.9766 --75.9719 --75.9531 --75.9547 --75.9625 --75.9672 --75.9625 --75.9703 --75.9812 --75.9766 --75.9547 --75.9641 --75.9578 --75.9672 --75.9578 --75.9797 --75.9703 --75.9578 --75.9609 --75.9625 --75.9563 --75.9688 --75.9609 --75.9656 --75.9672 --75.9625 --75.9484 --75.9547 --75.9547 --75.9484 --75.9656 --75.9625 --75.9609 --75.9578 --75.9688 --75.9547 --75.9703 --75.9563 --75.9563 --75.9609 --75.9437 --75.9703 --75.9672 --75.9578 --75.9578 --75.9641 --75.9563 --75.9656 --75.95 --75.9547 --75.9688 --75.95 --75.9656 --75.9625 --75.9563 --75.9563 --75.9547 --75.9484 --75.9609 --75.9594 --75.9609 --75.9578 --75.9531 --75.9672 --75.9609 --75.9469 --75.9656 --75.9625 --75.9578 --75.9531 --75.9484 --75.9703 --75.9656 --75.9672 --75.9656 --75.9656 --75.9437 --75.9594 --75.95 --75.9516 --75.9641 --75.9641 --75.9656 --75.9703 --75.975 --75.9672 --75.9594 --75.9703 --75.9578 --75.9844 --75.9719 --75.9672 --75.9656 --75.95 --75.9656 --75.9766 --75.9656 --75.9688 --75.9812 --75.9672 --75.9656 --75.9734 --75.9672 --75.9516 --75.9656 --75.9641 --75.9625 --75.9688 --75.9719 --75.9578 --75.9656 --75.975 --75.9688 --75.9688 --75.9672 --75.9781 --75.9516 --75.9547 --75.9625 --75.975 --75.9547 --75.9656 --75.9594 --75.9672 --75.9766 --75.9719 --75.9766 --75.9641 --75.9703 --75.9688 --75.9547 --75.9672 --75.9609 --75.9656 --75.9625 --75.975 --75.9703 --75.9625 --75.9641 --75.9609 --75.9703 --75.9688 --75.9672 --75.9672 --75.975 --75.9828 --75.9688 --75.9641 --75.9578 --75.9719 --75.9734 --75.9656 --75.9703 --75.9609 --75.9734 --75.9578 --75.9703 --75.9688 --75.9734 --75.9625 --75.9688 --75.9734 --75.9703 --75.9719 --75.9594 --75.9609 --75.9609 --75.9641 --75.9625 --75.9703 --75.9563 --75.9594 --75.9531 --75.9734 --75.9547 --75.9688 --75.9734 --75.9766 --75.9641 --75.9672 --75.9797 --75.9703 --75.9688 --75.9531 --75.9578 --75.9609 --75.9594 --75.9437 --75.9578 --75.9688 --75.9578 --75.9594 --75.9641 --75.9656 --75.9578 --75.9453 --75.9641 --75.9578 --75.9484 --75.9625 --75.9578 --75.9484 --75.9594 --75.9484 --75.9578 --75.9547 --75.95 --75.9531 --75.9391 --75.9563 --75.9609 --75.9594 --75.9656 --75.9672 --75.9594 --75.9625 --75.9641 --75.9703 --75.9609 --75.9688 --75.9547 --75.9547 --75.9547 --75.9469 --75.9578 --75.9625 --75.9531 --75.9484 --75.95 --75.9688 --75.9547 --75.9484 --75.9547 --75.9641 --75.9422 --75.9422 --75.9594 --75.9656 --75.9563 --75.9453 --75.9516 --75.9641 --75.9656 --75.9547 --75.9547 --75.9516 --75.9641 --75.9609 --75.9516 --75.9563 --75.95 --75.9453 --75.9484 --75.9484 --75.9359 --75.9406 --75.9578 --75.9359 --75.9516 --75.9516 --75.9547 --75.9531 --75.9641 --75.9531 --75.9578 --75.9563 --75.95 --75.9547 --75.9641 --75.9391 --75.95 --75.9547 --75.9469 --75.9516 --75.9484 --75.9328 --75.9563 --75.9391 --75.9516 --75.9437 --75.9313 --75.9516 --75.9578 --75.9516 --75.9578 --75.9531 --75.9641 --75.9516 --75.9641 --75.9578 --75.9703 --75.9641 --75.9625 --75.9641 --75.9656 --75.9594 --75.9578 --75.9594 --75.95 --75.9703 --75.9547 --75.9656 --75.9563 --75.9625 --75.9672 --75.9531 --75.9469 --75.9688 --75.9594 --75.9594 --75.9469 --75.9609 --75.9516 --75.95 --75.9437 --75.9609 --75.9672 --75.9484 --75.9531 --75.9563 --75.9469 --75.9516 --75.95 --75.9656 --75.9484 --75.9688 --75.9531 --75.9672 --75.9516 --75.9531 --75.9656 --75.9578 --75.9625 --75.9609 --75.95 --75.9563 --75.9547 --75.9484 --75.9594 --75.9531 --75.9594 --75.9531 --75.9469 --75.9594 --75.9578 --75.9469 --75.9531 --75.9563 --75.9547 --75.9516 --75.9516 --75.9516 --75.9453 --75.9469 --75.9563 --75.9625 --75.9484 --75.9641 --75.9563 --75.9484 --75.9516 --75.9484 --75.9547 --75.9672 --75.95 --75.9453 --75.9453 --75.9625 --75.9641 --75.9609 --75.9547 --75.9625 --75.9594 --75.9688 --75.9547 --75.9703 --75.9578 --75.9672 --75.9484 --75.9453 --75.9609 --75.9453 --75.9563 --75.9578 --75.95 --75.95 --75.9531 --75.9547 --75.9531 --75.9563 --75.9516 --75.9625 --75.9484 --75.95 --75.9641 --75.9406 --75.9391 --75.9484 --75.9484 --75.9344 --75.9437 --75.9391 --75.9406 --75.95 --75.9531 --75.9484 --75.9422 --75.9391 --75.9516 --75.9484 --75.95 --75.9625 --75.9531 --75.9422 --75.9609 --75.9375 --75.9344 --75.9266 --75.9625 --75.9375 --75.9484 --75.9578 --75.9391 --75.95 --75.9484 --75.95 --75.9531 --75.9688 --75.9469 --75.9484 --75.9437 --75.9516 --75.9437 --75.9609 --75.9484 --75.9484 --75.9609 --75.9406 --75.9563 --75.9469 --75.9453 --75.9406 --75.9625 --75.9531 --75.9547 --75.9391 --75.9422 --75.9578 --75.9484 --75.9547 --75.9516 --75.9547 --75.9531 --75.9547 --75.9609 --75.9484 --75.9516 --75.9594 --75.9469 --75.9453 --75.9516 --75.9578 --75.9391 --75.9547 --75.9578 --75.9484 --75.9484 --75.95 --75.9547 --75.9547 --75.9484 --75.9422 --75.9563 --75.9547 --75.9375 --75.9469 --75.9547 --75.9563 --75.9563 --75.9469 --75.95 --75.9609 --75.9594 --75.9437 --75.9453 --75.9609 --75.9328 --75.9406 --75.9266 --75.9516 --75.9484 --75.9453 --75.9437 --75.9453 --75.9359 --75.9297 --75.9328 --75.925 --75.9359 --75.9422 --75.9359 --75.9484 --75.9531 --75.9484 --75.9297 --75.9531 --75.9359 --75.95 --75.9437 --75.9484 --75.9453 --75.9406 --75.9422 --75.9437 --75.9484 --75.9437 --75.9375 --75.9391 --75.95 --75.9453 --75.9516 --75.95 --75.9531 --75.9516 --75.9547 --75.9563 --75.9484 --75.9641 --75.9469 --75.9484 --75.9422 --75.9484 --75.9516 --75.9625 --75.95 --75.9437 --75.9469 --75.9578 --75.9516 --75.9563 --75.9594 --75.9578 --75.9578 --75.9266 --75.9469 --75.9563 --75.9469 --75.9625 --75.9547 --75.9578 --75.9516 --75.9578 --75.9406 --75.9516 --75.9594 --75.9641 --75.9578 --75.9656 --75.9734 --75.9625 --75.9656 --75.9547 --75.9563 --75.9578 --75.9656 --75.9531 --75.9547 --75.9516 --75.9531 --75.9406 --75.95 --75.95 --75.9437 --75.9484 --75.9516 --75.9563 --75.9391 --75.9422 --75.9453 --75.9469 --75.9594 --75.9422 --75.9484 --75.9609 --75.9531 --75.9547 --75.9563 --75.9547 --75.9547 --75.9484 --75.9609 --75.9594 --75.9547 --75.9609 --75.9609 --75.9516 --75.9437 --75.9453 --75.9437 --75.9453 --75.9422 --75.9484 --75.9469 --75.9594 --75.9406 --75.9609 --75.9484 --75.9437 --75.95 --75.9625 --75.9594 --75.9531 --75.9531 --75.9578 --75.9641 --75.9469 --75.9563 --75.9594 --75.9656 --75.9609 --75.9453 --75.9422 --75.9422 --75.9469 --75.9578 --75.95 --75.9578 --75.9625 --75.9578 --75.9547 --75.9719 --75.9594 --75.9578 --75.9656 --75.9609 --75.9641 --75.9547 --75.9484 --75.9594 --75.9625 --75.9641 --75.9484 --75.9437 --75.9422 --75.9563 --75.9469 --75.9453 --75.9563 --75.9578 --75.9469 --75.95 --75.9391 --75.9453 --75.9563 --75.9563 --75.9672 --75.9578 --75.9359 --75.9594 --75.9516 --75.9469 --75.9406 --75.9594 --75.9531 --75.95 --75.9453 --75.9656 --75.9672 --75.9484 --75.9484 --75.95 --75.9578 --75.9375 --75.9422 --75.9516 --75.9484 --75.95 --75.9453 --75.9578 --75.9484 --75.9484 --75.9484 --75.9484 --75.9469 --75.9359 --75.9391 --75.9344 --75.9406 --75.9453 --75.9563 --75.95 --75.9406 --75.9547 --75.95 --75.9469 --75.9313 --75.9484 --75.9453 --75.9313 --75.9344 --75.9422 --75.9578 --75.9422 --75.9531 --75.9516 --75.9531 --75.9547 --75.9625 --75.9531 --75.9469 --75.9453 --75.9531 --75.9547 --75.9516 --75.9594 --75.9563 --75.9391 --75.9453 --75.9563 --75.9578 --75.9375 --75.9531 --75.9469 --75.9453 --75.9453 --75.9531 --75.9531 --75.9328 --75.9359 --75.9437 --75.9344 --75.9563 --75.9359 --75.9422 --75.9469 --75.9422 --75.9313 --75.9375 --75.9313 --75.9344 --75.9422 --75.9391 --75.9359 --75.9391 --75.9406 --75.9453 --75.9313 --75.9391 --75.9469 --75.9437 --75.9297 --75.9406 --75.9437 --75.9469 --75.9375 --75.9484 --75.9563 --75.9391 --75.9453 --75.925 --75.9344 --75.9406 --75.9391 --75.9547 --75.9359 --75.9516 --75.9484 --75.9531 --75.9641 --75.9484 --75.9609 --75.9422 --75.9469 --75.9375 --75.9453 --75.9484 --75.95 --75.9641 --75.9359 --75.9422 --75.9453 --75.9516 --75.9297 --75.9531 --75.9469 --75.9609 --75.9391 --75.9484 --75.9344 --75.9563 --75.9547 --75.9594 --75.9484 --75.9547 --75.9422 --75.9453 --75.9734 --75.9625 --75.9563 --75.9547 --75.9578 --75.9656 --75.9609 --75.9422 --75.9531 --75.9609 --75.9563 --75.9484 --75.9516 --75.95 --75.9656 --75.9484 --75.9437 --75.9625 --75.9422 --75.9531 --75.9406 --75.9563 --75.9422 --75.9437 --75.9453 --75.9453 --75.9453 --75.9422 --75.9359 --75.9469 --75.9359 --75.9406 --75.9453 --75.9359 --75.9469 --75.9609 --75.9344 --75.9359 --75.9516 --75.9437 --75.9344 --75.9531 --75.9328 --75.9437 --75.9406 --75.95 --75.9469 --75.9547 --75.9469 --75.9375 --75.9594 --75.95 --75.9469 --75.95 --75.9484 --75.9516 --75.95 --75.9422 --75.9437 --75.9469 --75.9484 --75.9469 --75.9531 --75.9578 --75.9688 --75.95 --75.9516 --75.9422 --75.9484 --75.9547 --75.9313 --75.9422 --75.9484 --75.9266 --75.9281 --75.9547 --75.9563 --75.9328 --75.9375 --75.9422 --75.9328 --75.9313 --75.9484 --75.9437 --75.9375 --75.9375 --75.9391 --75.9359 --75.9391 --75.9328 --75.9469 --75.9344 --75.9344 --75.9484 --75.9328 --75.9344 --75.9437 --75.9313 --75.9453 --75.9391 --75.9406 --75.9547 --75.9375 --75.9437 --75.9469 --75.9328 --75.9266 --75.9359 --75.9437 --75.9328 --75.9359 --75.9391 --75.9375 --75.9484 --75.9375 --75.9391 --75.9453 --75.9422 --75.9375 --75.9375 --75.9266 --75.9422 --75.9422 --75.9422 --75.9563 --75.9359 --75.9313 --75.9344 --75.9391 --75.925 --75.9344 --75.9344 --75.9297 --75.9375 --75.9453 --75.9516 --75.9375 --75.9391 --75.9406 --75.9203 --75.9344 --75.9422 --75.9406 --75.9375 --75.9391 --75.9375 --75.9344 --75.9266 --75.9281 --75.9344 --75.9422 --75.9359 --75.9406 --75.9484 --75.9359 --75.9516 --75.9437 --75.9469 --75.95 --75.9547 --75.95 --75.9469 --75.9422 --75.95 --75.9484 --75.9531 --75.9531 --75.9469 --75.9531 --75.95 --75.9453 --75.9531 --75.9484 --75.9469 --75.9516 --75.9672 --75.9281 --75.9453 --75.9563 --75.9422 --75.9609 --75.9453 --75.9516 --75.9422 --75.9625 --75.9406 --75.9437 --75.9344 --75.9375 --75.9375 --75.9359 --75.9453 --75.9437 --75.9391 --75.9437 --75.9375 --75.9328 --75.9453 --75.9437 --75.9516 --75.9453 --75.9453 --75.9344 --75.9344 --75.9406 --75.95 --75.9547 --75.9469 --75.9563 --75.9578 --75.9484 --75.9578 --75.9484 --75.9516 --75.9328 --75.9578 --75.9375 --75.9531 --75.9578 --75.9437 --75.9531 --75.9625 --75.9484 --75.925 --75.9391 --75.9484 --75.9578 --75.9547 --75.9422 --75.9422 --75.95 --75.9469 --75.9453 --75.9437 --75.9422 --75.9531 --75.9453 --75.9547 --75.9516 --75.9359 --75.9391 --75.9406 --75.9406 --75.9406 --75.9453 --75.9375 --75.9563 --75.9391 --75.9516 --75.9437 --75.9484 --75.9547 --75.9313 --75.9531 --75.9563 --75.9375 --75.9375 --75.925 --75.9172 --75.9453 --75.9422 --75.9437 --75.9422 --75.9437 --75.9344 --75.9328 --75.9437 --75.9422 --75.9359 --75.9406 --75.9375 --75.9375 --75.9406 --75.9375 --75.9594 --75.9484 --75.9516 --75.9359 --75.9391 --75.9484 --75.9313 --75.9344 --75.9359 --75.9281 --75.9391 --75.9359 --75.9328 --75.9328 --75.9406 --75.9484 --75.9359 --75.9344 --75.9297 --75.9297 --75.9328 --75.9313 --75.9422 --75.9234 --75.9219 --75.9281 --75.9234 --75.9328 --75.925 --75.9234 --75.9266 --75.9359 --75.9359 --75.9281 --75.9422 --75.9328 --75.9531 --75.9313 --75.9344 --75.9422 --75.9219 --75.9297 --75.9437 --75.9437 --75.9375 --75.9375 --75.9328 --75.9391 --75.9281 --75.9328 --75.9344 --75.9328 --75.9422 --75.9297 --75.9453 --75.9328 --75.9313 --75.9453 --75.9391 --75.9422 --75.9391 --75.9391 --75.9359 --75.9516 --75.9453 --75.9406 --75.9547 --75.9406 --75.9406 --75.9313 --75.9453 --75.9453 --75.9516 --75.9375 --75.95 --75.9578 --75.9547 --75.9625 --75.9531 --75.9422 --75.9563 --75.9406 --75.9453 --75.95 --75.9516 --75.9531 --75.9469 --75.9469 --75.9453 --75.9516 --75.9547 --75.9437 --75.9437 --75.9406 --75.9422 --75.9234 --75.9391 --75.9391 --75.9516 --75.9422 --75.9484 --75.95 --75.9266 --75.95 --75.9484 --75.9437 --75.95 --75.9578 --75.9453 --75.9563 --75.95 --75.9453 --75.9484 --75.9469 --75.9453 --75.9313 --75.9391 --75.9453 --75.9359 --75.9422 --75.925 --75.9453 --75.9375 --75.9344 --75.9344 --75.95 --75.9328 --75.9422 --75.9375 --75.9266 --75.9406 --75.9406 --75.9516 --75.9406 --75.9531 --75.9453 --75.9375 --75.9281 --75.9453 --75.9437 --75.9187 --75.9406 --75.9266 --75.9219 --75.9187 --75.9328 --75.9422 --75.9328 --75.9422 --75.9359 --75.9422 --75.9266 --75.9406 --75.925 --75.95 --75.9422 --75.95 --75.9391 --75.9266 --75.9328 --75.9297 --75.9344 --75.9359 --75.9422 --75.9313 --75.9422 --75.9484 --75.9281 --75.9422 --75.9203 --75.9344 --75.9359 --75.9547 --75.9313 --75.9484 --75.9469 --75.9469 --75.9437 --75.9453 --75.9328 --75.9391 --75.9516 --75.9469 --75.9406 --75.9375 --75.9328 --75.9328 --75.9375 --75.9406 --75.9328 --75.9469 --75.9344 --75.95 --75.9375 --75.9406 --75.9391 --75.9453 --75.9484 --75.9266 --75.9453 --75.9375 --75.9484 --75.9391 --75.9422 --75.9437 --75.9484 --75.9516 --75.9484 --75.9313 --75.9391 --75.9391 --75.925 --75.9344 --75.9406 --75.9469 --75.9328 --75.9484 --75.9422 --75.9453 --75.9594 --75.9484 --75.9484 --75.9578 --75.9422 --75.9625 --75.9641 --75.9469 --75.9547 --75.9406 --75.9578 --75.9484 --75.9516 --75.9422 --75.9391 --75.9484 --75.9375 --75.9484 --75.9484 --75.9406 --75.9531 --75.9375 --75.9406 --75.95 --75.9656 --75.9313 --75.9484 --75.9484 --75.9422 --75.9391 --75.9547 --75.9437 --75.9406 --75.9437 --75.9594 --75.9484 --75.9391 --75.9641 --75.9531 --75.9437 --75.9391 --75.9531 --75.9391 --75.9578 --75.9375 --75.9359 --75.9516 --75.9266 --75.9453 --75.9359 --75.9375 --75.9359 --75.9344 --75.9375 --75.9484 --75.9359 --75.9297 --75.9344 --75.9172 --75.9359 --75.9359 --75.9234 --75.9375 --75.9313 --75.9172 --75.9234 --75.9187 --75.925 --75.9344 --75.9281 --75.9281 --75.9187 --75.9266 --75.9359 --75.925 --75.9266 --75.9484 --75.9297 --75.9344 --75.9453 --75.9406 --75.9359 --75.9344 --75.9313 --75.9219 --75.9344 --75.9281 --75.9313 --75.9297 --75.9313 --75.9313 --75.9094 --75.9437 --75.9281 --75.9281 --75.9281 --75.9344 --75.925 --75.9328 --75.9313 --75.9297 --75.9281 --75.9187 --75.9391 --75.9281 --75.9406 --75.9375 --75.9328 --75.9344 --75.9437 --75.925 --75.9437 --75.9297 --75.9406 --75.9281 --75.9422 --75.9469 --75.9406 --75.9266 --75.9281 --75.9281 --75.9297 --75.9266 --75.9328 --75.9375 --75.9344 --75.9313 --75.9453 --75.9359 --75.9313 --75.9391 --75.9484 --75.9375 --75.9313 --75.9203 --75.9375 --75.9313 --75.9375 --75.9469 --75.9344 --75.9375 --75.9297 --75.9422 --75.9422 --75.9563 --75.9375 --75.9266 --75.9391 --75.9359 --75.9375 --75.9422 --75.9453 --75.9437 --75.9328 --75.9422 --75.9391 --75.9406 --75.9484 --75.9359 --75.9437 --75.9281 --75.9437 --75.9563 --75.9281 --75.95 --75.9406 --75.9406 --75.9437 --75.9297 --75.9453 --75.9344 --75.9359 --75.9328 --75.9328 --75.9359 --75.9406 --75.9328 --75.9359 --75.9344 --75.9359 --75.9359 --75.9344 --75.9297 --75.9359 --75.9297 --75.9344 --75.9203 --75.9359 --75.9203 --75.9203 --75.9234 --75.9234 --75.9266 --75.9484 --75.9313 --75.9391 --75.9406 --75.9437 --75.9406 --75.9281 --75.9359 --75.9406 --75.9531 --75.9484 --75.9406 --75.9422 --75.9391 --75.925 --75.9437 --75.9406 --75.9453 --75.9313 --75.9422 --75.9422 --75.9313 --75.9484 --75.9281 --75.9266 --75.9359 --75.9391 --75.9375 --75.9375 --75.9125 --75.9313 --75.925 --75.9219 --75.9187 --75.9297 --75.9156 --75.9422 --75.925 --75.9281 --75.9172 --75.9328 --75.925 --75.9156 --75.9172 --75.9281 --75.9281 --75.9203 --75.9266 --75.9172 --75.9328 --75.925 --75.9344 --75.9187 --75.9281 --75.9125 --75.9187 --75.9453 --75.9172 --75.9219 --75.9141 --75.9094 --75.9141 --75.9313 --75.9313 --75.9328 --75.9234 --75.9203 --75.9234 --75.9203 --75.9187 --75.9297 --75.9203 --75.9297 --75.9187 --75.9172 --75.9234 --75.9219 --75.9156 --75.9187 --75.9203 --75.925 --75.9109 --75.9219 --75.9125 --75.9375 --75.9266 --75.9203 --75.925 --75.9172 --75.9187 --75.9219 --75.9344 --75.925 --75.9313 --75.9266 --75.925 --75.925 --75.9266 --75.9203 --75.925 --75.9203 --75.9203 --75.9219 --75.9437 --75.9328 --75.925 --75.9187 --75.9281 --75.9234 --75.9266 --75.9281 --75.9266 --75.9328 --75.9375 --75.9406 --75.9328 --75.9328 --75.9203 --75.9375 --75.9344 --75.9266 --75.9391 --75.9297 --75.9297 --75.9328 --75.9469 --75.9344 --75.9313 --75.9234 --75.9281 --75.9453 --75.9281 --75.925 --75.9297 --75.9281 --75.9187 --75.9328 --75.925 --75.9281 --75.9328 --75.9516 --75.9391 --75.9469 --75.9391 --75.9359 --75.9391 --75.9344 --75.9406 --75.9297 --75.9359 --75.9203 --75.9219 --75.9359 --75.9266 --75.9219 --75.9281 --75.9391 --75.9234 --75.9359 --75.9437 --75.9328 --75.9313 --75.9281 --75.9281 --75.9328 --75.9297 --75.9234 --75.9359 --75.925 --75.925 --75.9344 --75.9344 --75.9391 --75.9219 --75.9313 --75.925 --75.9359 --75.9359 --75.9313 --75.9344 --75.9266 --75.9313 --75.9281 --75.9234 --75.9219 --75.925 --75.9375 --75.9281 --75.9266 --75.9344 --75.9484 --75.9234 --75.9328 --75.9297 --75.9328 --75.9375 --75.9328 --75.9266 --75.9313 --75.9328 --75.925 --75.9328 --75.9281 --75.925 --75.9094 --75.9422 --75.9234 --75.9234 --75.9281 --75.9406 --75.9328 --75.925 --75.9141 --75.9391 --75.9297 --75.9203 --75.9391 --75.9219 --75.9344 --75.9328 --75.9266 --75.9297 --75.9344 --75.9328 --75.9469 --75.925 --75.9234 --75.9297 --75.95 --75.9484 --75.9453 --75.9375 --75.9453 --75.9484 --75.9422 --75.9391 --75.9328 --75.9375 --75.9344 --75.9344 --75.9359 --75.9422 --75.9328 --75.9281 --75.9203 --75.925 --75.9313 --75.9359 --75.9437 --75.9297 --75.9437 --75.9266 --75.9406 --75.9469 --75.9391 --75.9359 --75.9172 --75.9375 --75.9406 --75.9406 --75.9328 --75.9344 --75.9297 --75.9344 --75.9375 --75.9391 --75.9391 --75.9453 --75.9375 --75.9203 --75.9406 --75.9406 --75.9281 --75.925 --75.9328 --75.9297 --75.9281 --75.9359 --75.9437 --75.9313 --75.9375 --75.9391 --75.9516 --75.9281 --75.9375 --75.9391 --75.9469 --75.9313 --75.9391 --75.9469 --75.9516 --75.9469 --75.9406 --75.9328 --75.9375 --75.9453 --75.9344 --75.9578 --75.9484 --75.9422 --75.9344 --75.9328 --75.9297 --75.9219 --75.9547 --75.9313 --75.9437 --75.9203 --75.9391 --75.9297 --75.9297 --75.9437 --75.95 --75.9375 --75.9281 --75.9344 --75.9328 --75.9266 --75.9203 --75.9297 --75.9297 --75.9297 --75.9266 --75.925 --75.9281 --75.9344 --75.9234 --75.9313 --75.9391 --75.9313 --75.9375 --75.95 --75.9437 --75.9359 --75.9391 --75.9234 --75.9344 --75.9313 --75.9484 --75.9344 --75.9406 --75.9187 --75.9328 --75.9297 --75.9375 --75.9437 --75.9344 --75.9266 --75.9281 --75.9437 --75.9359 --75.9313 --75.9313 --75.9266 --75.9219 --75.9391 --75.9281 --75.9297 --75.9219 --75.9266 --75.9406 --75.925 --75.9297 --75.9406 --75.9391 --75.9172 --75.9391 --75.9359 --75.9344 --75.9234 --75.925 --75.9313 --75.9172 --75.9219 --75.9266 --75.925 --75.9344 --75.9172 --75.9203 --75.9187 --75.9281 --75.9219 --75.925 --75.9156 --75.9297 --75.9313 --75.9234 --75.9234 --75.9125 --75.9297 --75.9281 --75.9187 --75.9266 --75.9281 --75.9406 --75.9406 --75.9375 --75.9219 --75.9328 --75.9313 --75.9219 --75.9172 --75.9297 --75.9203 --75.9219 --75.9172 --75.9156 --75.9172 --75.9062 --75.9203 --75.9109 --75.9016 --75.9094 --75.9031 --75.9219 --75.9141 --75.9219 --75.9281 --75.9187 --75.9078 --75.9156 --75.9219 --75.9281 --75.9328 --75.9156 --75.9187 --75.9375 --75.9078 --75.9172 --75.9297 --75.9406 --75.9203 --75.9234 --75.9234 --75.9156 --75.9078 --75.9062 --75.9047 --75.9219 --75.9234 --75.9062 --75.9141 --75.9219 --75.9172 --75.9234 --75.9031 --75.9219 --75.9281 --75.9156 --75.9156 --75.9125 --75.9125 --75.9125 --75.9078 --75.9203 --75.9016 --75.9109 --75.9187 --75.9141 --75.9031 --75.9109 --75.9234 --75.9391 --75.9156 --75.9125 --75.9219 --75.9219 --75.9062 --75.9266 --75.9125 --75.9172 --75.925 --75.9031 --75.9203 --75.9141 --75.9297 --75.9094 --75.9187 --75.9203 --75.9187 --75.9172 --75.925 --75.9109 --75.9297 --75.9172 --75.9031 --75.9125 --75.925 --75.9359 --75.9203 --75.9156 --75.9219 --75.9172 --75.9437 --75.9203 --75.9266 --75.9125 --75.9172 --75.9141 --75.9359 --75.9234 --75.9266 --75.9016 --75.9141 --75.9156 --75.9109 --75.9156 --75.9172 --75.9141 --75.9203 --75.9141 --75.9203 --75.9172 --75.9156 --75.9219 --75.9219 --75.9187 --75.9187 --75.9187 --75.9234 --75.9266 --75.9234 --75.9125 --75.9281 --75.9078 --75.9062 --75.9219 --75.9125 --75.9156 --75.9125 --75.9109 --75.9219 --75.9156 --75.9172 --75.9094 --75.9172 --75.9109 --75.9156 --75.9125 --75.9172 --75.9141 --75.9094 --75.9187 --75.9062 --75.9266 --75.9234 --75.9234 --75.9172 --75.9187 --75.9266 --75.9375 --75.9281 --75.9219 --75.9219 --75.9344 --75.9297 --75.9234 --75.925 --75.9172 --75.9219 --75.9219 --75.9187 --75.9094 --75.9328 --75.9203 --75.9234 --75.9203 --75.9203 --75.9109 --75.9141 --75.9078 --75.9109 --75.9187 --75.9062 --75.9109 --75.9203 --75.9078 --75.925 --75.9234 --75.9281 --75.9313 --75.9281 --75.9219 --75.9266 --75.9172 --75.9297 --75.9156 --75.9281 --75.9297 --75.9234 --75.9359 --75.9344 --75.9219 --75.9109 --75.925 --75.9203 --75.9328 --75.9203 --75.9328 --75.9234 --75.9281 --75.9266 --75.9375 --75.9219 --75.9328 --75.9328 --75.9313 --75.9437 --75.9281 --75.9359 --75.9406 --75.9266 --75.9156 --75.925 --75.9313 --75.9187 --75.9109 --75.9297 --75.9219 --75.9203 --75.9203 --75.9141 --75.925 --75.9203 --75.9203 --75.9234 --75.9203 --75.9375 --75.925 --75.9344 --75.9203 --75.9234 --75.9297 --75.9266 --75.9203 --75.9187 --75.9234 --75.9234 --75.9234 --75.9234 --75.9078 --75.9422 --75.9 --75.9359 --75.925 --75.9172 --75.9266 --75.9219 --75.925 --75.9141 --75.9297 --75.9156 --75.9266 --75.9156 --75.9328 --75.9297 --75.9219 --75.9219 --75.9313 --75.9156 --75.9125 --75.925 --75.9391 --75.9344 --75.9297 --75.9187 --75.9109 --75.9266 --75.9219 --75.9281 --75.9203 --75.9297 --75.9141 --75.9109 --75.9219 --75.9156 --75.9219 --75.9156 --75.9234 --75.9219 --75.9234 --75.9187 --75.9109 --75.9031 --75.9266 --75.9172 --75.9172 --75.9234 --75.9187 --75.9219 --75.9078 --75.925 --75.9187 --75.9234 --75.9281 --75.9125 --75.925 --75.9156 --75.9266 --75.9187 --75.9297 --75.9234 --75.9281 --75.9328 --75.9281 --75.9297 --75.9281 --75.9203 --75.9203 --75.9266 --75.9234 --75.9391 --75.9219 --75.9313 --75.9375 --75.9203 --75.9359 --75.9422 --75.9125 --75.9328 --75.9297 --75.925 --75.9266 --75.9203 --75.9266 --75.9187 --75.9266 --75.9281 --75.9187 --75.9281 --75.9266 --75.9141 --75.9375 --75.9187 --75.9297 --75.9203 --75.9313 --75.9281 --75.9187 --75.9344 --75.9359 --75.9359 --75.9219 --75.9281 --75.9141 --75.9391 --75.9281 --75.9156 --75.9344 --75.9219 --75.9453 --75.9344 --75.9313 --75.9328 --75.925 --75.9359 --75.9141 --75.9203 --75.9203 --75.9141 --75.9141 --75.9281 --75.925 --75.9141 --75.9344 --75.9359 --75.9219 --75.9344 --75.9313 --75.9406 --75.9328 --75.9234 --75.9281 --75.9219 --75.9266 --75.9359 --75.9359 --75.9313 --75.9219 --75.9297 --75.9391 --75.9234 --75.9406 --75.9453 --75.9531 --75.925 --75.9437 --75.9437 --75.9219 --75.9328 --75.9234 --75.9266 --75.9234 --75.9375 --75.925 --75.9172 --75.9203 --75.9266 --75.9281 --75.9313 --75.9359 --75.9266 --75.9234 --75.9328 --75.9281 --75.9109 --75.9328 --75.925 --75.9219 --75.9219 --75.925 --75.9359 --75.9281 --75.9234 --75.9219 --75.9203 --75.9469 --75.9234 --75.9313 --75.9344 --75.925 --75.9328 --75.9359 --75.9234 --75.9328 --75.9141 --75.9266 --75.9156 --75.9375 --75.9187 --75.9219 --75.9187 --75.9219 --75.9187 --75.9219 --75.9203 --75.9375 --75.9344 --75.9313 --75.9219 --75.9313 --75.9281 --75.9234 --75.9187 --75.9281 --75.9297 --75.9172 --75.9266 --75.9219 --75.9359 --75.9281 --75.9281 --75.9328 --75.9281 --75.9234 --75.9375 --75.9406 --75.9313 --75.9281 --75.9234 --75.9328 --75.9234 --75.9219 --75.9219 --75.9187 --75.9281 --75.925 --75.9344 --75.9203 --75.925 --75.9141 --75.9172 --75.9328 --75.9156 --75.9187 --75.9156 --75.9203 --75.9219 --75.9281 --75.9281 --75.9313 --75.9141 --75.9266 --75.9328 --75.925 --75.9359 --75.9234 --75.9203 --75.9344 --75.9266 --75.9219 --75.9328 --75.9219 --75.925 --75.9328 --75.9297 --75.9328 --75.925 --75.9281 --75.925 --75.925 --75.9234 --75.9203 --75.9297 --75.9281 --75.9375 --75.9078 --75.9172 --75.9391 --75.9187 --75.9313 --75.9391 --75.9172 --75.9328 --75.9359 --75.9344 --75.9437 --75.9375 --75.9359 --75.9422 --75.9359 --75.9172 --75.9328 --75.9297 --75.9328 --75.9234 --75.9203 --75.9203 --75.9187 --75.925 --75.9187 --75.9203 --75.9297 --75.9141 --75.9266 --75.9203 --75.8969 --75.9156 --75.9078 --75.9141 --75.9156 --75.9203 --75.9172 --75.9094 --75.925 --75.9187 --75.9203 --75.9156 --75.9203 --75.9281 --75.9234 --75.9203 --75.9187 --75.9187 --75.9172 --75.9219 --75.9172 --75.9313 --75.925 --75.9156 --75.9234 --75.9391 --75.9359 --75.9141 --75.9359 --75.9203 --75.9078 --75.9234 --75.9047 --75.9172 --75.9172 --75.9219 --75.9266 --75.925 --75.9172 --75.925 --75.9297 --75.9156 --75.9109 --75.9172 --75.9297 --75.9172 --75.9156 --75.9172 --75.9125 --75.925 --75.9125 --75.9313 --75.9203 --75.9172 --75.9047 --75.9109 --75.9187 --75.9062 --75.9094 --75.9344 --75.9187 --75.9187 --75.9141 --75.9172 --75.9203 --75.9266 --75.9156 --75.9172 --75.9219 --75.9062 --75.9062 --75.9016 --75.9078 --75.9203 --75.9172 --75.9172 --75.9062 --75.9203 --75.9266 --75.9281 --75.9187 --75.9109 --75.9234 --75.9156 --75.9172 --75.9219 --75.9234 --75.9141 --75.9141 --75.9172 --75.9016 --75.9141 --75.9062 --75.9 --75.9 --75.9094 --75.9094 --75.9094 --75.9031 --75.9078 --75.9203 --75.9062 --75.9172 --75.9047 --75.8984 --75.9125 --75.9078 --75.8969 --75.9109 --75.9047 --75.9094 --75.9031 --75.9094 --75.9062 --75.9047 --75.9062 --75.9141 --75.9031 --75.9031 --75.9156 --75.9 --75.8953 --75.9047 --75.8828 --75.9078 --75.9016 --75.9172 --75.9031 --75.9125 --75.9172 --75.9047 --75.9062 --75.9125 --75.9156 --75.9156 --75.9187 --75.9187 --75.8938 --75.9125 --75.9203 --75.9078 --75.9109 --75.9266 --75.9062 --75.9125 --75.9031 --75.9141 --75.9141 --75.8969 --75.9094 --75.9141 --75.9062 --75.9062 --75.9109 --75.9156 --75.9094 --75.9078 --75.9031 --75.9 --75.9016 --75.9047 --75.9016 --75.9031 --75.9187 --75.8859 --75.8922 --75.9109 --75.9172 --75.9078 --75.9125 --75.8969 --75.9016 --75.9125 --75.8984 --75.8984 --75.8969 --75.8891 --75.9078 --75.9016 --75.9062 --75.8891 --75.9141 --75.9031 --75.9094 --75.9047 --75.8938 --75.9031 --75.9125 --75.8922 --75.9094 --75.9016 --75.8891 --75.9125 --75.8938 --75.9094 --75.9078 --75.9031 --75.8938 --75.9094 --75.9094 --75.9 --75.9031 --75.9047 --75.9 --75.8969 --75.9062 --75.8984 --75.8922 --75.8859 --75.9062 --75.8891 --75.9141 --75.9156 --75.9031 --75.9125 --75.9094 --75.9016 --75.8953 --75.9078 --75.8984 --75.8938 --75.9109 --75.8938 --75.8906 --75.9172 --75.8969 --75.9141 --75.9 --75.8984 --75.8953 --75.9016 --75.8953 --75.8922 --75.9 --75.9047 --75.9078 --75.8984 --75.9078 --75.9219 --75.9016 --75.9094 --75.9109 --75.9187 --75.9031 --75.9172 --75.9109 --75.9141 --75.9047 --75.8938 --75.9078 --75.9203 --75.9094 --75.9187 --75.9094 --75.9047 --75.9234 --75.9109 --75.9297 --75.9172 --75.9125 --75.9125 --75.8969 --75.9016 --75.9047 --75.8906 --75.9 --75.9078 --75.9047 --75.8891 --75.9062 --75.9187 --75.9141 --75.9062 --75.9078 --75.9109 --75.9047 --75.9187 --75.9141 --75.9 --75.9062 --75.9172 --75.9109 --75.9078 --75.8953 --75.9125 --75.9109 --75.9 --75.9203 --75.9016 --75.9016 --75.9016 --75.9031 --75.9109 --75.9141 --75.9141 --75.8969 --75.9031 --75.9203 --75.8984 --75.8922 --75.8969 --75.9062 --75.8875 --75.9094 --75.9016 --75.8953 --75.9078 --75.9078 --75.8984 --75.9016 --75.9109 --75.9 --75.9 --75.8906 --75.9094 --75.8984 --75.8922 --75.9031 --75.9031 --75.9016 --75.9094 --75.8891 --75.9 --75.9031 --75.9141 --75.9016 --75.9078 --75.8922 --75.9031 --75.8859 --75.8984 --75.8922 --75.8891 --75.8922 --75.8922 --75.9031 --75.8969 --75.8984 --75.9031 --75.8953 --75.9078 --75.9 --75.9078 --75.8875 --75.9094 --75.8922 --75.8938 --75.9 --75.8953 --75.9016 --75.9047 --75.8984 --75.9047 --75.8984 --75.8891 --75.9125 --75.9094 --75.9094 --75.8984 --75.9062 --75.9047 --75.8906 --75.8984 --75.9031 --75.8953 --75.9078 --75.9 --75.9109 --75.9 --75.9094 --75.8906 --75.9109 --75.9094 --75.8922 --75.8984 --75.8922 --75.8984 --75.8953 --75.9047 --75.9047 --75.9016 --75.8969 --75.9172 --75.8984 --75.9094 --75.9 --75.9016 --75.9016 --75.9109 --75.8984 --75.9109 --75.9094 --75.9125 --75.9078 --75.8984 --75.9172 --75.9234 --75.9109 --75.9172 --75.9016 --75.9109 --75.9094 --75.9109 --75.9109 --75.9187 --75.9125 --75.9141 --75.9187 --75.9062 --75.9203 --75.9109 --75.9219 --75.8984 --75.9031 --75.9141 --75.8984 --75.9031 --75.9047 --75.9109 --75.9047 --75.9078 --75.8891 --75.9031 --75.9187 --75.9219 --75.9219 --75.9094 --75.8984 --75.9156 --75.9094 --75.9078 --75.9203 --75.9187 --75.9078 --75.9109 --75.9 --75.9 --75.9109 --75.9031 --75.9062 --75.9078 --75.9156 --75.9016 --75.9109 --75.9078 --75.8953 --75.9047 --75.8922 --75.9062 --75.9016 --75.9016 --75.9016 --75.9016 --75.9047 --75.9031 --75.8953 --75.9031 --75.8891 --75.9078 --75.9062 --75.8906 --75.9141 --75.9 --75.8984 --75.8875 --75.8969 --75.9016 --75.8844 --75.9125 --75.9125 --75.9234 --75.9078 --75.9109 --75.9094 --75.8984 --75.9187 --75.8953 --75.9062 --75.9078 --75.9094 --75.9 --75.8922 --75.9016 --75.9031 --75.9031 --75.9047 --75.9047 --75.9094 --75.9187 --75.9109 --75.9078 --75.925 --75.9125 --75.9141 --75.9187 --75.9109 --75.9125 --75.9281 --75.9219 --75.9172 --75.9172 --75.9297 --75.9047 --75.9203 --75.9109 --75.9109 --75.8969 --75.9187 --75.9141 --75.9156 --75.9094 --75.9234 --75.9172 --75.9219 --75.9297 --75.9187 --75.9172 --75.925 --75.9172 --75.9062 --75.9094 --75.9078 --75.9062 --75.925 --75.9156 --75.9234 --75.925 --75.9203 --75.9187 --75.9062 --75.9078 --75.925 --75.9078 --75.9125 --75.9031 --75.9203 --75.9094 --75.9141 --75.9187 --75.9094 --75.9047 --75.9094 --75.9187 --75.9047 --75.9062 --75.9031 --75.9125 --75.9078 --75.9078 --75.9172 --75.9187 --75.9187 --75.925 --75.9141 --75.9078 --75.9125 --75.9359 --75.9187 --75.9313 --75.925 --75.9141 --75.9266 --75.9328 --75.9156 --75.9156 --75.9266 --75.925 --75.9156 --75.9109 --75.9047 --75.9047 --75.9234 --75.8969 --75.9187 --75.9125 --75.9156 --75.9156 --75.9172 --75.9203 --75.9187 --75.925 --75.8953 --75.9125 --75.9156 --75.9187 --75.9078 --75.9141 --75.9219 --75.9219 --75.9187 --75.9172 --75.9125 --75.9234 --75.9141 --75.9156 --75.9109 --75.9125 --75.9187 --75.9172 --75.9078 --75.9266 --75.9266 --75.9094 --75.9109 --75.9219 --75.9094 --75.9281 --75.9266 --75.9125 --75.9141 --75.9266 --75.9187 --75.9156 --75.9062 --75.9125 --75.9172 --75.9047 --75.9094 --75.9031 --75.9047 --75.9234 --75.9078 --75.9156 --75.9125 --75.9109 --75.9109 --75.9203 --75.9172 --75.9297 --75.9078 --75.9266 --75.9094 --75.9078 --75.9141 --75.9156 --75.9047 --75.9219 --75.9125 --75.9187 --75.9172 --75.9172 --75.9031 --75.9078 --75.9078 --75.9 --75.9094 --75.8984 --75.9094 --75.9219 --75.9187 --75.9125 --75.9156 --75.9078 --75.9109 --75.9 --75.9047 --75.8922 --75.9047 --75.9109 --75.8969 --75.8969 --75.9125 --75.8953 --75.8938 --75.9 --75.9078 --75.9109 --75.9047 --75.9047 --75.9078 --75.9125 --75.9125 --75.9047 --75.9094 --75.9031 --75.8969 --75.9031 --75.9078 --75.9078 --75.9125 --75.9016 --75.8984 --75.9 --75.8984 --75.925 --75.9047 --75.9 --75.8875 --75.8891 --75.9141 --75.8922 --75.8969 --75.8953 --75.9047 --75.8938 --75.8984 --75.8953 --75.9094 --75.8969 --75.8953 --75.9 --75.9031 --75.9 --75.9016 --75.9031 --75.8875 --75.9141 --75.8938 --75.8953 --75.9094 --75.9 --75.9031 --75.9203 --75.9016 --75.8953 --75.9031 --75.9219 --75.9047 --75.9031 --75.9016 --75.8984 --75.8938 --75.9109 --75.9031 --75.9 --75.9078 --75.9109 --75.9031 --75.8984 --75.9109 --75.9078 --75.9109 --75.9062 --75.8969 --75.9062 --75.8938 --75.9109 --75.8953 --75.9 --75.8953 --75.9016 --75.9062 --75.9 --75.9047 --75.9047 --75.8922 --75.9172 --75.9125 --75.9031 --75.9 --75.8953 --75.9125 --75.9172 --75.9203 --75.9125 --75.9078 --75.9156 --75.9203 --75.8953 --75.9125 --75.9031 --75.9156 --75.9062 --75.8953 --75.8953 --75.9031 --75.9125 --75.9141 --75.9031 --75.9062 --75.9047 --75.8969 --75.8938 --75.9016 --75.9062 --75.9 --75.9094 --75.9125 --75.9016 --75.8969 --75.9062 --75.9078 --75.9016 --75.9016 --75.9031 --75.8938 --75.9172 --75.9109 --75.8781 --75.9 --75.8859 --75.9078 --75.9125 --75.9156 --75.9016 --75.8906 --75.9078 --75.8984 --75.9 --75.9016 --75.9062 --75.9016 --75.8953 --75.9094 --75.9047 --75.9094 --75.9047 --75.8984 --75.8906 --75.9 --75.9125 --75.9047 --75.9047 --75.8969 --75.9031 --75.8969 --75.8984 --75.9016 --75.9031 --75.9031 --75.9062 --75.9141 --75.9078 --75.9062 --75.9016 --75.9 --75.9094 --75.8984 --75.9109 --75.9094 --75.9141 --75.925 --75.9062 --75.9062 --75.8953 --75.9078 --75.8969 --75.9156 --75.9078 --75.8938 --75.9172 --75.9031 --75.9 --75.9031 --75.9031 --75.9047 --75.8969 --75.9109 --75.9047 --75.9047 --75.8938 --75.9078 --75.8984 --75.9141 --75.8969 --75.9031 --75.9062 --75.9078 --75.9125 --75.9062 --75.9109 --75.9016 --75.9031 --75.9047 --75.9062 --75.9047 --75.9203 --75.9 --75.9062 --75.9031 --75.9062 --75.8984 --75.9047 --75.9031 --75.8938 --75.9062 --75.8984 --75.9219 --75.9031 --75.9062 --75.9047 --75.9 --75.9062 --75.9187 --75.9016 --75.9313 --75.9141 --75.9125 --75.9078 --75.9031 --75.9047 --75.9047 --75.9109 --75.9172 --75.9141 --75.9125 --75.925 --75.9172 --75.9187 --75.9328 --75.9234 --75.9203 --75.9125 --75.9172 --75.9109 --75.9203 --75.9094 --75.9234 --75.9094 --75.9047 --75.9125 --75.9109 --75.9016 --75.9094 --75.8984 --75.9062 --75.8938 --75.9078 --75.9047 --75.9234 --75.8938 --75.9047 --75.9172 --75.8984 --75.9094 --75.9109 --75.9156 --75.9141 --75.925 --75.9125 --75.9125 --75.9156 --75.9125 --75.9109 --75.9094 --75.9062 --75.9172 --75.925 --75.9094 --75.9156 --75.9219 --75.9016 --75.9219 --75.925 --75.9062 --75.9047 --75.9156 --75.9062 --75.9078 --75.9109 --75.8953 --75.9031 --75.9094 --75.8969 --75.9047 --75.9031 --75.9031 --75.9062 --75.8922 --75.8953 --75.9062 --75.9 --75.9 --75.8969 --75.8812 --75.8938 --75.8953 --75.9 --75.8891 --75.9016 --75.8953 --75.8938 --75.8906 --75.8938 --75.9 --75.9 --75.8969 --75.8984 --75.8625 --75.8969 --75.8953 --75.8844 --75.875 --75.8812 --75.8859 --75.8969 --75.9 --75.8844 --75.8906 --75.9109 --75.8844 --75.8938 --75.8875 --75.8938 --75.8969 --75.8891 --75.8938 --75.9 --75.8938 --75.8812 --75.8922 --75.9031 --75.8938 --75.8969 --75.8859 --75.8922 --75.8875 --75.8906 --75.8922 --75.8891 --75.8875 --75.8719 --75.8766 --75.8953 --75.8953 --75.8891 --75.8797 --75.8969 --75.8781 --75.8766 --75.8828 --75.8812 --75.8797 --75.8938 --75.8859 --75.8922 --75.8922 --75.8812 --75.8703 --75.8938 --75.875 --75.8844 --75.8922 --75.8703 --75.8984 --75.8812 --75.8781 --75.8891 --75.8906 --75.8828 --75.8812 --75.8828 --75.8875 --75.8688 --75.8938 --75.8938 --75.8812 --75.8828 --75.8812 --75.8938 --75.8859 --75.8891 --75.9 --75.8719 --75.9 --75.8859 --75.8922 --75.8953 --75.8922 --75.8938 --75.8922 --75.8984 --75.9016 --75.8984 --75.9078 --75.9062 --75.8969 --75.8906 --75.8984 --75.8953 --75.8906 --75.8938 --75.9016 --75.9031 --75.9 --75.8984 --75.8844 --75.9 --75.9016 --75.8859 --75.8953 --75.8828 --75.8984 --75.9 --75.8953 --75.8906 --75.8859 --75.8922 --75.8953 --75.9031 --75.8844 --75.8875 --75.8875 --75.8906 --75.8922 --75.8922 --75.8969 --75.8906 --75.8938 --75.8938 --75.8906 --75.8984 --75.8938 --75.9047 --75.9047 --75.9047 --75.8984 --75.9 --75.8953 --75.9031 --75.9047 --75.8875 --75.9125 --75.8953 --75.9109 --75.9062 --75.9 --75.9094 --75.9 --75.8859 --75.8938 --75.9047 --75.8969 --75.9016 --75.9016 --75.9031 --75.8891 --75.9078 --75.8922 --75.8938 --75.9031 --75.9109 --75.8938 --75.8984 --75.9031 --75.8938 --75.9016 --75.9 --75.9078 --75.8953 --75.8906 --75.9141 --75.9047 --75.8969 --75.9078 --75.8984 --75.9062 --75.8969 --75.8922 --75.8938 --75.9031 --75.8906 --75.8906 --75.8953 --75.8906 --75.8984 --75.8938 --75.8969 --75.9016 --75.8969 --75.8984 --75.9 --75.9125 --75.9 --75.8969 --75.9 --75.9062 --75.9016 --75.8828 --75.8969 --75.8953 --75.9016 --75.9031 --75.8984 --75.9031 --75.9031 --75.9016 --75.9031 --75.9047 --75.9047 --75.9047 --75.9 --75.9016 --75.8938 --75.9094 --75.8969 --75.9187 --75.9156 --75.9078 --75.8984 --75.9016 --75.8938 --75.9062 --75.9 --75.8953 --75.8938 --75.8984 --75.9078 --75.9 --75.9031 --75.8922 --75.8969 --75.9031 --75.9172 --75.9094 --75.8938 --75.9031 --75.9 --75.8906 --75.9016 --75.8906 --75.9094 --75.8984 --75.8953 --75.9172 --75.9016 --75.9 --75.8984 --75.9016 --75.9109 --75.9 --75.8984 --75.9 --75.9031 --75.9047 --75.9 --75.9016 --75.9125 --75.9016 --75.9125 --75.9016 --75.9172 --75.8891 --75.9078 --75.8922 --75.9047 --75.8922 --75.8984 --75.9047 --75.9 --75.9 --75.9062 --75.9062 --75.9031 --75.9062 --75.9047 --75.8906 --75.8969 --75.8938 --75.8859 --75.8844 --75.8938 --75.9016 --75.8828 --75.9078 --75.9016 --75.8969 --75.9016 --75.8906 --75.8844 --75.9078 --75.8812 --75.8906 --75.8938 --75.8844 --75.8922 --75.8984 --75.8766 --75.8828 --75.8922 --75.8844 --75.8859 --75.8875 --75.8891 --75.8844 --75.9016 --75.8969 --75.8828 --75.8906 --75.8969 --75.8906 --75.8891 --75.8812 --75.8906 --75.8859 --75.8844 --75.8766 --75.8984 --75.8984 --75.9016 --75.8891 --75.8891 --75.8969 --75.8922 --75.8984 --75.8891 --75.8875 --75.8828 --75.8875 --75.8859 --75.8844 --75.9031 --75.8969 --75.8859 --75.9094 --75.8859 --75.8906 --75.8812 --75.8906 --75.8828 --75.9016 --75.8906 --75.8844 --75.8922 --75.8922 --75.8922 --75.8953 --75.9 --75.9 --75.8984 --75.8984 --75.8984 --75.8938 --75.8906 --75.9 --75.9 --75.8859 --75.9 --75.8891 --75.8922 --75.8875 --75.8859 --75.8938 --75.8938 --75.8922 --75.8969 --75.8859 --75.8938 --75.8922 --75.9031 --75.8828 --75.8969 --75.8859 --75.8891 --75.8828 --75.8812 --75.8828 --75.8859 --75.8641 --75.8906 --75.8766 --75.8766 --75.8953 --75.8969 --75.8906 --75.8828 --75.8828 --75.8953 --75.8812 --75.8828 --75.8875 --75.8812 --75.8859 --75.8719 --75.8828 --75.8797 --75.8844 --75.8844 --75.8969 --75.8781 --75.8828 --75.8766 --75.8797 --75.8688 --75.8734 --75.8875 --75.8734 --75.8828 --75.8984 --75.875 --75.8781 --75.8859 --75.8734 --75.8812 --75.8828 --75.8875 --75.8828 --75.8812 --75.8891 --75.8891 --75.8781 --75.9 --75.875 --75.8922 --75.9016 --75.8875 --75.8984 --75.8922 --75.8938 --75.8906 --75.8922 --75.9016 --75.8812 --75.8859 --75.9016 --75.8891 --75.8844 --75.8953 --75.8812 --75.8859 --75.8828 --75.8766 --75.8828 --75.8859 --75.8891 --75.8969 --75.8859 --75.8766 --75.8812 --75.8969 --75.8828 --75.8875 --75.8953 --75.8797 --75.8891 --75.9047 --75.8812 --75.8953 --75.8828 --75.8844 --75.8969 --75.8734 --75.8828 --75.8922 --75.8906 --75.8844 --75.8906 --75.8797 --75.875 --75.8719 --75.8922 --75.8922 --75.9062 --75.8812 --75.8906 --75.8906 --75.8812 --75.8812 --75.8953 --75.8703 --75.8812 --75.8875 --75.8922 --75.8875 --75.8891 --75.8781 --75.8938 --75.8922 --75.8828 --75.8812 --75.8766 --75.8828 --75.8828 --75.8844 --75.8844 --75.8875 --75.8766 --75.8844 --75.8812 --75.8891 --75.8781 --75.8906 --75.8859 --75.8797 --75.8891 --75.8938 --75.8906 --75.8828 --75.8953 --75.8812 --75.8812 --75.8812 --75.8906 --75.8969 --75.8922 --75.8781 --75.8781 --75.8891 --75.8891 --75.8828 --75.8938 --75.8969 --75.8938 --75.8953 --75.8984 --75.8969 --75.8875 --75.8969 --75.8891 --75.8828 --75.8953 --75.9 --75.8938 --75.8891 --75.8812 --75.9141 --75.9141 --75.9078 --75.9031 --75.8969 --75.9062 --75.9031 --75.9016 --75.8906 --75.9141 --75.8953 --75.9047 --75.8922 --75.8953 --75.8828 --75.8891 --75.8938 --75.8891 --75.8953 --75.8922 --75.8875 --75.8969 --75.9031 --75.8859 --75.8984 --75.9 --75.8875 --75.8891 --75.9031 --75.8875 --75.9141 --75.8984 --75.8953 --75.8891 --75.8938 --75.8984 --75.8953 --75.8938 --75.8906 --75.9 --75.8906 --75.8922 --75.9156 --75.8906 --75.9078 --75.9 --75.9078 --75.9016 --75.8875 --75.8953 --75.9062 --75.9078 --75.9062 --75.9 --75.9047 --75.8938 --75.9031 --75.8906 --75.9016 --75.9078 --75.9078 --75.9094 --75.9031 --75.9094 --75.9156 --75.9062 --75.9047 --75.9062 --75.9016 --75.9125 --75.925 --75.9031 --75.9187 --75.9078 --75.9016 --75.9062 --75.8953 --75.9094 --75.8984 --75.8953 --75.9109 --75.9094 --75.9047 --75.8906 --75.9031 --75.9047 --75.8984 --75.9031 --75.8953 --75.9 --75.9016 --75.9078 --75.8969 --75.9047 --75.9 --75.8984 --75.9031 --75.9109 --75.9031 --75.8984 --75.9125 --75.8938 --75.8906 --75.8938 --75.9094 --75.9062 --75.9016 --75.9016 --75.9109 --75.8938 --75.8984 --75.8844 --75.8969 --75.8969 --75.8953 --75.8938 --75.8922 --75.9047 --75.9094 --75.9062 --75.8922 --75.9047 --75.8906 --75.9031 --75.9016 --75.9125 --75.9062 --75.8984 --75.9078 --75.9 --75.9016 --75.8984 --75.9031 --75.9016 --75.8969 --75.9016 --75.9062 --75.8984 --75.9 --75.9156 --75.9 --75.8969 --75.8953 --75.9109 --75.9016 --75.9141 --75.9031 --75.9031 --75.9062 --75.9078 --75.8969 --75.9078 --75.8984 --75.9031 --75.9031 --75.9031 --75.8984 --75.8984 --75.9016 --75.9062 --75.9109 --75.9016 --75.9 --75.9109 --75.9016 --75.9078 --75.9094 --75.9047 --75.9109 --75.9141 --75.8969 --75.9219 --75.9094 --75.9062 --75.9031 --75.9094 --75.925 --75.9203 --75.9344 --75.9297 --75.9109 --75.9047 --75.9094 --75.9125 --75.9078 --75.9172 --75.9297 --75.9313 --75.9125 --75.9203 --75.9016 --75.9219 --75.9094 --75.9109 --75.9203 --75.9219 --75.9094 --75.9281 --75.9234 --75.9141 --75.9203 --75.8953 --75.9094 --75.9156 --75.9078 --75.9125 --75.9313 --75.925 --75.9203 --75.9141 --75.9187 --75.9266 --75.925 --75.9328 --75.9219 --75.9109 --75.9281 --75.9219 --75.9016 --75.9187 --75.9172 --75.9141 --75.9234 --75.9156 --75.9219 --75.9156 --75.9172 --75.9203 --75.9016 --75.9266 --75.9234 --75.9203 --75.9219 --75.9328 --75.9266 --75.9156 --75.9156 --75.9109 --75.9156 --75.9078 --75.9 --75.9203 --75.9062 --75.9109 --75.9078 --75.9016 --75.9156 --75.9094 --75.9156 --75.9203 --75.9187 --75.9 --75.9078 --75.9047 --75.9203 --75.9109 --75.9141 --75.9125 --75.9109 --75.9078 --75.9203 --75.9234 --75.9047 --75.9125 --75.9125 --75.9078 --75.9141 --75.9141 --75.9219 --75.925 --75.9125 --75.925 --75.9297 --75.9109 --75.9234 --75.9156 --75.9203 --75.9078 --75.9187 --75.9094 --75.9156 --75.9187 --75.9187 --75.9156 --75.9141 --75.9297 --75.9094 --75.9062 --75.9047 --75.925 --75.9172 --75.9109 --75.8969 --75.9078 --75.9156 --75.9094 --75.9141 --75.9094 --75.9047 --75.9187 --75.9016 --75.9016 --75.925 --75.9156 --75.9 --75.9078 --75.9234 --75.9203 --75.9094 --75.9203 --75.9094 --75.9187 --75.9156 --75.9187 --75.9141 --75.9156 --75.9078 --75.8969 --75.9062 --75.9109 --75.9078 --75.9031 --75.9031 --75.9094 --75.9016 --75.9203 --75.9094 --75.9 --75.9172 --75.9047 --75.9141 --75.9078 --75.9125 --75.9156 --75.9094 --75.9078 --75.9203 --75.9031 --75.9156 --75.9094 --75.9234 --75.925 --75.9062 --75.9125 --75.9187 --75.9125 --75.9187 --75.9109 --75.9203 --75.9094 --75.9187 --75.9047 --75.9156 --75.9078 --75.9062 --75.9016 --75.9094 --75.9031 --75.9031 --75.9031 --75.9062 --75.9187 --75.9 --75.9187 --75.9156 --75.9 --75.9203 --75.9078 --75.9125 --75.9094 --75.9 --75.9141 --75.9094 --75.9 --75.9187 --75.9047 --75.9156 --75.8984 --75.9078 --75.9078 --75.9094 --75.9125 --75.8969 --75.9047 --75.8875 --75.9062 --75.8969 --75.9047 --75.9094 --75.9031 --75.9062 --75.8922 --75.9047 --75.8875 --75.9078 --75.9078 --75.9 --75.9109 --75.8969 --75.9047 --75.9031 --75.8984 --75.9078 --75.8984 --75.9062 --75.9047 --75.9203 --75.9016 --75.9031 --75.9047 --75.9141 --75.9156 --75.9031 --75.9062 --75.8906 --75.9078 --75.9047 --75.8984 --75.9062 --75.9156 --75.9 --75.9016 --75.9031 --75.9047 --75.9 --75.8969 --75.8922 --75.9047 --75.9 --75.9031 --75.9172 --75.9094 --75.9109 --75.9031 --75.9172 --75.9031 --75.8984 --75.8969 --75.9125 --75.8891 --75.8969 --75.9125 --75.8891 --75.9062 --75.8984 --75.8953 --75.8938 --75.9016 --75.8953 --75.8953 --75.9031 --75.9016 --75.8812 --75.8984 --75.8984 --75.9 --75.8969 --75.9094 --75.8953 --75.8922 --75.9125 --75.8984 --75.8969 --75.8969 --75.8922 --75.8891 --75.9031 --75.8938 --75.9047 --75.9125 --75.9031 --75.9078 --75.8938 --75.9047 --75.9016 --75.8922 --75.9031 --75.8766 --75.8922 --75.8922 --75.8953 --75.8984 --75.8953 --75.8891 --75.9031 --75.8938 --75.9062 --75.8969 --75.8922 --75.9 --75.8953 --75.8938 --75.8875 --75.8797 --75.8688 --75.9078 --75.8906 --75.8891 --75.8984 --75.8906 --75.8766 --75.8688 --75.8828 --75.8922 --75.8844 --75.8906 --75.8984 --75.8891 --75.8797 --75.8969 --75.8953 --75.8906 --75.8938 --75.9062 --75.8906 --75.8922 --75.8859 --75.8797 --75.8875 --75.8797 --75.8828 --75.8891 --75.8812 --75.8844 --75.8875 --75.8891 --75.8922 --75.8953 --75.8734 --75.8906 --75.8938 --75.9 --75.8875 --75.8922 --75.9016 --75.8891 --75.8859 --75.8891 --75.9 --75.8938 --75.9031 --75.8844 --75.8812 --75.8844 --75.9016 --75.8922 --75.9094 --75.8953 --75.8938 --75.9062 --75.9125 --75.9031 --75.8984 --75.8953 --75.8812 --75.8797 --75.8938 --75.8797 --75.8828 --75.8969 --75.8844 --75.8859 --75.8969 --75.8984 --75.8969 --75.8984 --75.8922 --75.8906 --75.8875 --75.8984 --75.8859 --75.8828 --75.8906 --75.8891 --75.8953 --75.8844 --75.8906 --75.8875 --75.8688 --75.8797 --75.8812 --75.8844 --75.8828 --75.8906 --75.8922 --75.8875 --75.875 --75.8766 --75.8922 --75.9031 --75.8812 --75.8812 --75.8875 --75.8891 --75.8922 --75.8891 --75.8938 --75.8766 --75.8922 --75.875 --75.8875 --75.8969 --75.8781 --75.8844 --75.8766 --75.8781 --75.8828 --75.8938 --75.8875 --75.8969 --75.8875 --75.8859 --75.8984 --75.8797 --75.8891 --75.8844 --75.8984 --75.9 --75.8984 --75.8891 --75.8984 --75.9 --75.8953 --75.8984 --75.8938 --75.9 --75.9031 --75.8844 --75.8859 --75.8859 --75.9062 --75.9 --75.8953 --75.8953 --75.8875 --75.8922 --75.8875 --75.8781 --75.8859 --75.8859 --75.8828 --75.8906 --75.8938 --75.8938 --75.8891 --75.8938 --75.8781 --75.8844 --75.8781 --75.8922 --75.8859 --75.8906 --75.8891 --75.8781 --75.8859 --75.8844 --75.875 --75.8938 --75.8984 --75.8859 --75.9031 --75.8938 --75.8859 --75.8938 --75.8844 --75.8828 --75.8797 --75.8797 --75.8812 --75.8891 --75.8953 --75.8938 --75.8781 --75.8703 --75.8781 --75.8688 --75.8875 --75.8703 --75.8781 --75.8797 --75.8703 --75.8688 --75.8625 --75.8656 --75.8641 --75.8781 --75.8594 --75.8625 --75.8688 --75.8672 --75.8719 --75.8688 --75.8625 --75.8703 --75.8656 --75.8734 --75.8703 --75.8625 --75.8641 --75.8859 --75.8797 --75.8781 --75.8734 --75.8812 --75.8797 --75.8781 --75.8781 --75.8891 --75.8891 --75.8891 --75.8844 --75.8828 --75.8906 --75.8812 --75.8844 --75.8703 --75.8922 --75.8797 --75.8828 --75.9 --75.8828 --75.9 --75.8828 --75.8812 --75.8859 --75.875 --75.8766 --75.875 --75.8906 --75.8734 --75.8766 --75.8828 --75.9031 --75.875 --75.8891 --75.8703 --75.8844 --75.8828 --75.8828 --75.8844 --75.8844 --75.8875 --75.8812 --75.8672 --75.8734 --75.8578 --75.8875 --75.8812 --75.8797 --75.8766 --75.8766 --75.8719 --75.8688 --75.8656 --75.8734 --75.8641 --75.8688 --75.8672 --75.8703 --75.8875 --75.8578 --75.8656 --75.8797 --75.8797 --75.8688 --75.8828 --75.8797 --75.8844 --75.8734 --75.8766 --75.8844 --75.8859 --75.875 --75.8781 --75.875 --75.8719 --75.8688 --75.8688 --75.8719 --75.8672 --75.8688 --75.8672 --75.8781 --75.8922 --75.8688 --75.8906 --75.8844 --75.8812 --75.8734 --75.8812 --75.8781 --75.8688 --75.8906 --75.8812 --75.8828 --75.8781 --75.8734 --75.875 --75.8781 --75.8797 --75.875 --75.8719 --75.8766 --75.8656 --75.8891 --75.8859 --75.8875 --75.8672 --75.8812 --75.8781 --75.8688 --75.875 --75.8797 --75.8797 --75.8812 --75.8906 --75.8781 --75.8766 --75.8719 --75.8703 --75.8656 --75.8719 --75.8875 --75.8656 --75.8828 --75.8688 --75.8812 --75.8688 --75.8844 --75.8766 --75.8625 --75.8766 --75.8766 --75.8828 --75.8953 --75.875 --75.8781 --75.8859 --75.8828 --75.8719 --75.8703 --75.8891 --75.8703 --75.8578 --75.8656 --75.8656 --75.875 --75.8766 --75.8719 --75.8766 --75.8812 --75.8625 --75.8703 --75.8875 --75.8734 --75.8734 --75.8672 --75.8672 --75.8844 --75.875 --75.8688 --75.8891 --75.8922 --75.8797 --75.8656 --75.8844 --75.8906 --75.8891 --75.8703 --75.8828 --75.8734 --75.8703 --75.8812 --75.8828 --75.8688 --75.8656 --75.8734 --75.8734 --75.8797 --75.8734 --75.8812 --75.8812 --75.8734 --75.8766 --75.8844 --75.8734 --75.8766 --75.8672 --75.8812 --75.8719 --75.8828 --75.8672 --75.8766 --75.875 --75.8688 --75.8703 --75.8703 --75.8828 --75.8703 --75.8734 --75.8703 --75.8734 --75.8641 --75.8703 --75.8906 --75.8703 --75.8781 --75.8734 --75.8938 --75.8891 --75.8812 --75.8828 --75.8875 --75.8812 --75.8875 --75.8953 --75.8812 --75.8703 --75.8797 --75.8859 --75.8875 --75.8875 --75.8781 --75.875 --75.8719 --75.8766 --75.8984 --75.8719 --75.8844 --75.8828 --75.8906 --75.8875 --75.8766 --75.8719 --75.8797 --75.8938 --75.8875 --75.8938 --75.8891 --75.8859 --75.8891 --75.8859 --75.8906 --75.8797 --75.8969 --75.8797 --75.8844 --75.8844 --75.8859 --75.8797 --75.8844 --75.8797 --75.8938 --75.8906 --75.8953 --75.8797 --75.8812 --75.8859 --75.8922 --75.8875 --75.8828 --75.8891 --75.8812 --75.8594 --75.8797 --75.875 --75.8781 --75.8703 --75.8766 --75.875 --75.8719 --75.8812 --75.8859 --75.8719 --75.8812 --75.8891 --75.8828 --75.8797 --75.8781 --75.8844 --75.875 --75.8672 --75.8922 --75.8797 --75.8859 --75.8703 --75.8844 --75.8906 --75.8812 --75.8875 --75.8766 --75.8859 --75.8828 --75.8766 --75.8906 --75.8906 --75.8703 --75.8922 --75.8844 --75.8859 --75.8766 --75.8781 --75.8766 --75.8766 --75.8969 --75.8812 --75.8891 --75.8922 --75.9 --75.8891 --75.8906 --75.8922 --75.8906 --75.8938 --75.8859 --75.8891 --75.8938 --75.8812 --75.8859 --75.8875 --75.8844 --75.8875 --75.8953 --75.8906 --75.8922 --75.9031 --75.9047 --75.8875 --75.9047 --75.9 --75.8953 --75.8984 --75.8875 --75.8844 --75.8953 --75.8922 --75.8875 --75.8906 --75.8875 --75.8812 --75.8891 --75.9016 --75.8969 --75.9062 --75.9016 --75.8859 --75.8859 --75.9016 --75.875 --75.8859 --75.8781 --75.9 --75.8766 --75.8734 --75.8969 --75.8859 --75.8844 --75.8734 --75.8938 --75.8953 --75.8984 --75.9016 --75.9 --75.8797 --75.8875 --75.9031 --75.8891 --75.8828 --75.8922 --75.8891 --75.8938 --75.8859 --75.8672 --75.8891 --75.8875 --75.8844 --75.8922 --75.8906 --75.8797 --75.8812 --75.8906 --75.8953 --75.8875 --75.8844 --75.8766 --75.8984 --75.8812 --75.8906 --75.8953 --75.8891 --75.8875 --75.8875 --75.8828 --75.8828 --75.8828 --75.8672 --75.8828 --75.8875 --75.8828 --75.8812 --75.8766 --75.875 --75.8844 --75.8875 --75.875 --75.8859 --75.8859 --75.8672 --75.8969 --75.8859 --75.8812 --75.8828 --75.8781 --75.8672 --75.8828 --75.8719 --75.875 --75.8828 --75.8688 --75.8797 --75.8797 --75.8781 --75.8734 --75.8703 --75.8781 --75.8844 --75.8688 --75.8891 --75.8859 --75.8828 --75.875 --75.8844 --75.8922 --75.8797 --75.8812 --75.8875 --75.8844 --75.8969 --75.8859 --75.8812 --75.8906 --75.8906 --75.8766 --75.8797 --75.8828 --75.8797 --75.875 --75.8844 --75.8719 --75.8797 --75.8766 --75.8875 --75.8688 --75.8828 --75.8766 --75.8766 --75.8797 --75.8703 --75.8828 --75.8625 --75.8625 --75.8812 --75.8719 --75.8844 --75.8766 --75.8656 --75.8812 --75.8672 --75.8734 --75.8719 --75.8844 --75.8734 --75.875 --75.8594 --75.8875 --75.8766 --75.8766 --75.8766 --75.8844 --75.8781 --75.8844 --75.8891 --75.9031 --75.8859 --75.8828 --75.8859 --75.8859 --75.8688 --75.8781 --75.8766 --75.8766 --75.8844 --75.8812 --75.8891 --75.8797 --75.8891 --75.875 --75.8766 --75.8703 --75.8703 --75.8688 --75.8719 --75.8688 --75.8781 --75.8688 --75.8828 --75.8625 --75.8656 --75.8797 --75.8781 --75.8656 --75.8844 --75.8766 --75.8859 --75.8812 --75.8812 --75.8781 --75.8859 --75.8875 --75.8891 --75.8891 --75.8875 --75.8875 --75.8797 --75.8859 --75.8906 --75.8906 --75.8922 --75.9 --75.8969 --75.8969 --75.8906 --75.8938 --75.8828 --75.8953 --75.8891 --75.8984 --75.8828 --75.8859 --75.8938 --75.8828 --75.8703 --75.8891 --75.8906 --75.9047 --75.9 --75.9078 --75.8859 --75.8953 --75.8922 --75.8953 --75.8844 --75.8922 --75.9016 --75.8891 --75.8891 --75.8969 --75.8734 --75.8859 --75.8891 --75.8859 --75.8953 --75.8812 --75.8875 --75.8828 --75.8953 --75.8734 --75.8938 --75.8859 --75.8922 --75.8859 --75.9 --75.9016 --75.9109 --75.8828 --75.8766 --75.8969 --75.8953 --75.8844 --75.9016 --75.8953 --75.8922 --75.8812 --75.9047 --75.8906 --75.9031 --75.8969 --75.8844 --75.8875 --75.8984 --75.8828 --75.8875 --75.8812 --75.8828 --75.8812 --75.8719 --75.8812 --75.8922 --75.8844 --75.8875 --75.8953 --75.8938 --75.9 --75.8688 --75.8969 --75.8797 --75.8906 --75.8938 --75.8906 --75.8953 --75.8859 --75.8922 --75.8828 --75.8969 --75.8891 --75.9 --75.8875 --75.8797 --75.8938 --75.8938 --75.8875 --75.8969 --75.8859 --75.8984 --75.875 --75.8844 --75.8953 --75.8703 --75.8906 --75.8781 --75.9031 --75.8891 --75.8891 --75.8891 --75.8859 --75.8844 --75.8828 --75.8734 --75.8812 --75.8781 --75.9016 --75.8828 --75.8906 --75.8859 --75.8906 --75.8984 --75.8891 --75.8969 --75.8953 --75.8875 --75.8953 --75.9031 --75.8953 --75.8906 --75.8969 --75.8828 --75.8969 --75.9047 --75.9031 --75.8984 --75.8938 --75.9 --75.8984 --75.8891 --75.8938 --75.8844 --75.8922 --75.8766 --75.8875 --75.8875 --75.8906 --75.8875 --75.8828 --75.8922 --75.8938 --75.8891 --75.8844 --75.8891 --75.8859 --75.8984 --75.8812 --75.8812 --75.8812 --75.8844 --75.8875 --75.8828 --75.8953 --75.8922 --75.8969 --75.8891 --75.9016 --75.8969 --75.8953 --75.9016 --75.8891 --75.8812 --75.8891 --75.9062 --75.8969 --75.8953 --75.8906 --75.8891 --75.8797 --75.8969 --75.9062 --75.8969 --75.8953 --75.8969 --75.8797 --75.8875 --75.8875 --75.8938 --75.8938 --75.8953 --75.8969 --75.8891 --75.8938 --75.8953 --75.8766 --75.8828 --75.8891 --75.8797 --75.8734 --75.8891 --75.9016 --75.8859 --75.8984 --75.8922 --75.8703 --75.8891 --75.8844 --75.8859 --75.8891 --75.8828 --75.8812 --75.8766 --75.8844 --75.8859 --75.8875 --75.8922 --75.8781 --75.8891 --75.8859 --75.8906 --75.8859 --75.8844 --75.8828 --75.8906 --75.8781 --75.8828 --75.8891 --75.8734 --75.8781 --75.8828 --75.8891 --75.8922 --75.8688 --75.8828 --75.8906 --75.8781 --75.875 --75.8844 --75.8922 --75.8766 --75.875 --75.8734 --75.8719 --75.8703 --75.8828 --75.8828 --75.8719 --75.8781 --75.8906 --75.8734 --75.8953 --75.8953 --75.8797 --75.8922 --75.8781 --75.8891 --75.8828 --75.8859 --75.8703 --75.875 --75.8984 --75.8906 --75.8766 --75.8938 --75.8906 --75.8875 --75.8859 --75.8797 --75.8812 --75.8906 --75.8828 --75.8922 --75.8922 --75.8875 --75.8922 --75.9 --75.8875 --75.8984 --75.8906 --75.9109 --75.9016 --75.8938 --75.8938 --75.8938 --75.8766 --75.8906 --75.8766 --75.8984 --75.8938 --75.8922 --75.8891 --75.8828 --75.9016 --75.9031 --75.8859 --75.8875 --75.8891 --75.8797 --75.8891 --75.8891 --75.8797 --75.8891 --75.8797 --75.8922 --75.8906 --75.9 --75.8891 --75.8953 --75.8875 --75.8891 --75.8906 --75.8906 --75.8953 --75.8969 --75.8875 --75.8891 --75.8797 --75.8797 --75.8875 --75.8781 --75.8781 --75.8938 --75.875 --75.8844 --75.8844 --75.8844 --75.8891 --75.8844 --75.8672 --75.8766 --75.8688 --75.8797 --75.8688 --75.875 --75.8734 --75.8672 --75.8594 --75.8734 --75.8703 --75.8859 --75.8766 --75.8812 --75.8719 --75.8797 --75.8828 --75.8828 --75.8781 --75.8609 --75.8766 --75.8859 --75.8766 --75.8719 --75.875 --75.8828 --75.8625 --75.8688 --75.8844 --75.8781 --75.8766 --75.8766 --75.8672 --75.8844 --75.8812 --75.8859 --75.8938 --75.8828 --75.8844 --75.8922 --75.875 --75.8812 --75.8891 --75.8891 --75.8719 --75.8844 --75.8906 --75.8844 --75.8812 --75.8734 --75.8797 --75.8844 --75.8781 --75.8891 --75.8844 --75.8812 --75.8906 --75.8891 --75.8859 --75.875 --75.8859 --75.8859 --75.8875 --75.9031 --75.8875 --75.8828 --75.8688 --75.8812 --75.8703 --75.8703 --75.8656 --75.8734 --75.8781 --75.8625 --75.875 --75.8719 --75.8703 --75.8719 --75.8812 --75.8719 --75.8688 --75.8688 --75.8672 --75.8844 --75.8766 --75.8875 --75.8844 --75.8812 --75.8781 --75.8938 --75.8844 --75.8812 --75.8844 --75.8797 --75.875 --75.8812 --75.8922 --75.8766 --75.8891 --75.8953 --75.8922 --75.8828 --75.875 --75.8703 --75.8719 --75.8781 --75.8812 --75.8812 --75.8703 --75.8891 --75.875 --75.8703 --75.8781 --75.875 --75.8734 --75.8766 --75.8844 --75.8781 --75.8781 --75.8766 --75.8781 --75.8766 --75.8844 --75.8766 --75.875 --75.8844 --75.8906 --75.8672 --75.8875 --75.8953 --75.8891 --75.8875 --75.8891 --75.8875 --75.8875 --75.8781 --75.8906 --75.8844 --75.8891 --75.8656 --75.8906 --75.8797 --75.8781 --75.8859 --75.8797 --75.8812 --75.8922 --75.8625 --75.875 --75.8828 --75.8719 --75.875 --75.8812 --75.8781 --75.8797 --75.8938 --75.8734 --75.8703 --75.8875 --75.8766 --75.8734 --75.8828 --75.8719 --75.875 --75.8844 --75.8797 --75.8828 --75.8781 --75.8672 --75.8688 --75.8781 --75.8828 --75.8781 --75.8812 --75.8812 --75.8844 --75.875 --75.8734 --75.8828 --75.8828 --75.8781 --75.8938 --75.8859 --75.8938 --75.8828 --75.8781 --75.8766 --75.8734 --75.8875 --75.8828 --75.8828 --75.8766 --75.8812 --75.8672 --75.8875 --75.875 --75.8719 --75.8844 --75.8844 --75.8875 --75.8719 --75.8797 --75.875 --75.8797 --75.8828 --75.875 --75.8859 --75.8719 --75.8891 --75.8953 --75.8781 --75.8656 --75.8766 --75.8844 --75.8828 --75.875 --75.8688 --75.875 --75.8859 --75.8625 --75.8781 --75.8812 --75.8641 --75.8656 --75.8953 --75.8844 --75.8828 --75.875 --75.8797 --75.8734 --75.8797 --75.8766 --75.8844 --75.8859 --75.8781 --75.8688 --75.8859 --75.8828 --75.8938 --75.8828 --75.8797 --75.8969 --75.8781 --75.8953 --75.8781 --75.8859 --75.8891 --75.8875 --75.8875 --75.9031 --75.8859 --75.8984 --75.8875 --75.8828 --75.8844 --75.8812 --75.8984 --75.8891 --75.8828 --75.8812 --75.8891 --75.8797 --75.8703 --75.8953 --75.8828 --75.8875 --75.8875 --75.8734 --75.8828 --75.8953 --75.8812 --75.8922 --75.8844 --75.8891 --75.8922 --75.8859 --75.8859 --75.8781 --75.8875 --75.8938 --75.8844 --75.8891 --75.8812 --75.8969 --75.8828 --75.8812 --75.8906 --75.9094 --75.8891 --75.8828 --75.8938 --75.8859 --75.9016 --75.8953 --75.8844 --75.9047 --75.8766 --75.8969 --75.8766 --75.8797 --75.8891 --75.8844 --75.8969 --75.8844 --75.8734 --75.8984 --75.8812 --75.8859 --75.8766 --75.8938 --75.8922 --75.8797 --75.8875 --75.8875 --75.8906 --75.8922 --75.8875 --75.8844 --75.8891 --75.8688 --75.8672 --75.8938 --75.9016 --75.8906 --75.8984 --75.9 --75.8906 --75.8906 --75.9 --75.8984 --75.8766 --75.8875 --75.8891 --75.8844 --75.9 --75.8984 --75.8969 --75.8922 --75.8875 --75.9031 --75.8844 --75.8797 --75.8812 --75.8984 --75.8953 --75.8969 --75.9031 --75.8875 --75.8906 --75.9 --75.8922 --75.8938 --75.8844 --75.8969 --75.9 --75.8938 --75.8922 --75.8859 --75.8891 --75.8969 --75.8984 --75.8844 --75.8891 --75.8969 --75.9 --75.8859 --75.8938 --75.9047 --75.8891 --75.8891 --75.8844 --75.8891 --75.8953 --75.8859 --75.8922 --75.8844 --75.8812 --75.8906 --75.8844 --75.8938 --75.8938 --75.8922 --75.8984 --75.8922 --75.8812 --75.9 --75.8922 --75.9016 --75.9047 --75.9094 --75.8922 --75.9062 --75.8891 --75.9062 --75.8969 --75.8938 --75.8969 --75.8828 --75.8984 --75.8984 --75.8797 --75.8906 --75.8922 --75.8859 --75.8812 --75.8953 --75.8891 --75.8984 --75.8969 --75.8953 --75.8859 --75.8766 --75.8875 --75.8875 --75.8906 --75.8875 --75.8875 --75.8938 --75.8812 --75.9141 --75.8953 --75.8938 --75.9016 --75.9031 --75.9016 --75.9141 --75.9094 --75.9062 --75.9094 --75.9062 --75.8969 --75.9094 --75.9219 --75.9078 --75.8969 --75.9062 --75.9109 --75.9047 --75.8938 --75.8953 --75.9016 --75.8938 --75.8969 --75.9 --75.9031 --75.9094 --75.8969 --75.9094 --75.8938 --75.9125 --75.9016 --75.8984 --75.8938 --75.8938 --75.8859 --75.8922 --75.9016 --75.9 --75.8906 --75.8859 --75.8906 --75.9094 --75.9 --75.9016 --75.9016 --75.8984 --75.8969 --75.9219 --75.8859 --75.9094 --75.9047 --75.9094 --75.8984 --75.8844 --75.8984 --75.9031 --75.8984 --75.8969 --75.8984 --75.8906 --75.9031 --75.8969 --75.9047 --75.8953 --75.8906 --75.8953 --75.8766 --75.9031 --75.8906 --75.9047 --75.9094 --75.8844 --75.8969 --75.9062 --75.8875 --75.9141 --75.9031 --75.9031 --75.9141 --75.9 --75.9062 --75.8859 --75.9047 --75.9016 --75.9047 --75.8906 --75.8828 --75.8922 --75.9047 --75.8828 --75.8984 --75.8891 --75.9031 --75.9047 --75.9062 --75.8875 --75.9047 --75.9 --75.8984 --75.9078 --75.8969 --75.9 --75.8969 --75.8938 --75.8938 --75.9109 --75.9109 --75.8984 --75.9 --75.9062 --75.9016 --75.9016 --75.8875 --75.9047 --75.8969 --75.9031 --75.8797 --75.9062 --75.9062 --75.8953 --75.8984 --75.9047 --75.8984 --75.8844 --75.9031 --75.9031 --75.8984 --75.9 --75.9078 --75.8969 --75.8984 --75.8891 --75.9031 --75.9016 --75.8984 --75.9047 --75.9 --75.9 --75.8984 --75.8953 --75.8922 --75.8984 --75.9141 --75.8922 --75.9 --75.8938 --75.8938 --75.9031 --75.8953 --75.9047 --75.8891 --75.9125 --75.9125 --75.9062 --75.8938 --75.9094 --75.8984 --75.8969 --75.8844 --75.8922 --75.9016 --75.9062 --75.9078 --75.8969 --75.9031 --75.9062 --75.8922 --75.8906 --75.8984 --75.9078 --75.9062 --75.9016 --75.9094 --75.9125 --75.8938 --75.8969 --75.8953 --75.9062 --75.9094 --75.9047 --75.9109 --75.9062 --75.8844 --75.9031 --75.9 --75.8891 --75.8906 --75.8938 --75.9078 --75.8969 --75.8953 --75.8938 --75.8875 --75.9031 --75.8984 --75.8953 --75.9016 --75.9031 --75.9 --75.9031 --75.8875 --75.8938 --75.9 --75.9141 --75.8844 --75.8984 --75.9031 --75.9062 --75.9062 --75.9078 --75.8844 --75.9062 --75.9062 --75.9 --75.8969 --75.8891 --75.8938 --75.8922 --75.8891 --75.8891 --75.8938 --75.8891 --75.8922 --75.9016 --75.8922 --75.9078 --75.8906 --75.9016 --75.8969 --75.9156 --75.9047 --75.8922 --75.9031 --75.9078 --75.9125 --75.8938 --75.8906 --75.9047 --75.8984 --75.9031 --75.8969 --75.8844 --75.9031 --75.8906 --75.9062 --75.8812 --75.8875 --75.9031 --75.8922 --75.8953 --75.9078 --75.8875 --75.8969 --75.9141 --75.9047 --75.9109 --75.9062 --75.9047 --75.9078 --75.9047 --75.9016 --75.9016 --75.9 --75.9078 --75.9031 --75.9062 --75.9 --75.9016 --75.9047 --75.9203 --75.9 --75.9 --75.9219 --75.9156 --75.9328 --75.9078 --75.9062 --75.9172 --75.9313 --75.9141 --75.9281 --75.9219 --75.9234 --75.9094 --75.9172 --75.9094 --75.9109 --75.9141 --75.9297 --75.9266 --75.9078 --75.9078 --75.9094 --75.8984 --75.9156 --75.9141 --75.8906 --75.9 --75.9047 --75.9016 --75.9078 --75.9141 --75.9047 --75.9156 --75.9141 --75.9156 --75.9016 --75.9109 --75.9141 --75.8984 --75.9062 --75.9016 --75.8875 --75.9016 --75.8906 --75.9047 --75.8969 --75.9031 --75.9031 --75.9047 --75.8859 --75.8953 --75.9078 --75.9109 --75.8969 --75.9031 --75.8984 --75.8938 --75.9016 --75.8859 --75.8953 --75.8938 --75.8922 --75.9047 --75.9125 --75.9016 --75.9094 --75.8969 --75.9234 --75.8969 --75.9031 --75.9094 --75.8984 --75.9016 --75.9094 --75.9078 --75.8969 --75.9 --75.9047 --75.8922 --75.9031 --75.9078 --75.9234 --75.9031 --75.9219 --75.9141 --75.9141 --75.8969 --75.9016 --75.8984 --75.9125 --75.9 --75.8984 --75.9016 --75.9125 --75.9 --75.9047 --75.8953 --75.9062 --75.9234 --75.9141 --75.9047 --75.8938 --75.9156 --75.9187 --75.8953 --75.9094 --75.9078 --75.9047 --75.9047 --75.9109 --75.9016 --75.9141 --75.9 --75.9094 --75.9062 --75.9125 --75.9141 --75.9031 --75.9156 --75.9219 --75.8953 --75.8984 --75.9141 --75.9031 --75.8953 --75.9094 --75.9 --75.8969 --75.9047 --75.8984 --75.8906 --75.9062 --75.9094 --75.8875 --75.8922 --75.9078 --75.9172 --75.9109 --75.9109 --75.8953 --75.8906 --75.9031 --75.9078 --75.9062 --75.8938 --75.8953 --75.9016 --75.9156 --75.9109 --75.9156 --75.9094 --75.9172 --75.9172 --75.9016 --75.9047 --75.9078 --75.9031 --75.9094 --75.9016 --75.8953 --75.8875 --75.9016 --75.9047 --75.8938 --75.8953 --75.8938 --75.9 --75.9031 --75.9094 --75.9047 --75.9016 --75.9187 --75.9156 --75.9125 --75.9125 --75.9125 --75.9047 --75.9109 --75.8984 --75.9187 --75.925 --75.8969 --75.9172 --75.9078 --75.9141 --75.9094 --75.9172 --75.9156 --75.9125 --75.9 --75.9062 --75.9094 --75.9109 --75.9078 --75.9 --75.8906 --75.9156 --75.9031 --75.9094 --75.9156 --75.9156 --75.9141 --75.9219 --75.9141 --75.9078 --75.9062 --75.9094 --75.9 --75.9156 --75.9187 --75.9078 --75.9187 --75.9062 --75.9016 --75.8938 --75.8922 --75.8906 --75.9078 --75.9016 --75.9141 --75.9125 --75.8984 --75.9031 --75.9031 --75.9016 --75.9109 --75.8906 --75.9094 --75.9047 --75.8938 --75.9 --75.8906 --75.8891 --75.8969 --75.8797 --75.9016 --75.8984 --75.9062 --75.9 --75.9047 --75.9125 --75.9141 --75.8891 --75.9109 --75.9172 --75.9016 --75.9172 --75.9047 --75.9125 --75.9109 --75.9172 --75.9203 --75.9125 --75.9016 --75.8938 --75.9125 --75.9016 --75.9109 --75.9 --75.8906 --75.9 --75.9047 --75.9094 --75.925 --75.9219 --75.9141 --75.9234 --75.9094 --75.9234 --75.9016 --75.8953 --75.9078 --75.8969 --75.8969 --75.9313 --75.9094 --75.9109 --75.9141 --75.9078 --75.8969 --75.9156 --75.9078 --75.9125 --75.9062 --75.9031 --75.9203 --75.9078 --75.9187 --75.8938 --75.9047 --75.9016 --75.9031 --75.9125 --75.8984 --75.9094 --75.9094 --75.9047 --75.8953 --75.8984 --75.9047 --75.9094 --75.9047 --75.9125 --75.9078 --75.9016 --75.9047 --75.9031 --75.9047 --75.9109 --75.9078 --75.9047 --75.8969 --75.8922 --75.9078 --75.9062 --75.9109 --75.9062 --75.9047 --75.9125 --75.9156 --75.9062 --75.8953 --75.9047 --75.9047 --75.9172 --75.9187 --75.9078 --75.9078 --75.8984 --75.9094 --75.9047 --75.9109 --75.9141 --75.9094 --75.9109 --75.9141 --75.9141 --75.9156 --75.9141 --75.9031 --75.9219 --75.9219 --75.9344 --75.9234 --75.9156 --75.9281 --75.9266 --75.8953 --75.9172 --75.9141 --75.9359 --75.9219 --75.9328 --75.9234 --75.9203 --75.9187 --75.9187 --75.9156 --75.9031 --75.9219 --75.9203 --75.9 --75.9 --75.9172 --75.9219 --75.9266 --75.9109 --75.9281 --75.925 --75.9141 --75.925 --75.9172 --75.9187 --75.9219 --75.925 --75.9172 --75.925 --75.9313 --75.9328 --75.9109 --75.9266 --75.9313 --75.9156 --75.9203 --75.9047 --75.9313 --75.9187 --75.9172 --75.9297 --75.9125 --75.9359 --75.9078 --75.9187 --75.9187 --75.9375 --75.9203 --75.9281 --75.9187 --75.9094 --75.9109 --75.9094 --75.9094 --75.9156 --75.9266 --75.9109 --75.9187 --75.9281 --75.9109 --75.9172 --75.9156 --75.9172 --75.9062 --75.925 --75.9109 --75.9187 --75.9203 --75.9172 --75.9203 --75.9234 --75.9266 --75.9172 --75.9281 --75.9109 --75.9109 --75.9125 --75.9203 --75.9187 --75.9094 --75.8969 --75.9156 --75.9109 --75.9141 --75.9062 --75.9047 --75.9109 --75.8953 --75.9125 --75.9141 --75.9125 --75.9 --75.9141 --75.9187 --75.9031 --75.9062 --75.9078 --75.9094 --75.9141 --75.9125 --75.8984 --75.9094 --75.9109 --75.8969 --75.9187 --75.9141 --75.9141 --75.9172 --75.9187 --75.9094 --75.9078 --75.9172 --75.9094 --75.9062 --75.9141 --75.9031 --75.9219 --75.9219 --75.9109 --75.9187 --75.9266 --75.9187 --75.9156 --75.9219 --75.9062 --75.9156 --75.9156 --75.9266 --75.9156 --75.9172 --75.9187 --75.9203 --75.9172 --75.9266 --75.9187 --75.9141 --75.9313 --75.9234 --75.925 --75.9234 --75.9219 --75.9234 --75.9281 --75.9156 --75.9187 --75.9141 --75.9031 --75.9219 --75.9172 --75.9219 --75.9234 --75.9281 --75.9234 --75.9297 --75.925 --75.9266 --75.9234 --75.9266 --75.925 --75.9203 --75.9219 --75.9344 --75.9281 --75.9219 --75.925 --75.9187 --75.9266 --75.9281 --75.9313 --75.9406 --75.9234 --75.9297 --75.9313 --75.9422 --75.9359 --75.9203 --75.9406 --75.9281 --75.9391 --75.9391 --75.9313 --75.9359 --75.9422 --75.9297 --75.9281 --75.9281 --75.9375 --75.9344 --75.9375 --75.9469 --75.9359 --75.9484 --75.9359 --75.9375 --75.9281 --75.925 --75.9422 --75.9344 --75.9281 --75.9391 --75.9453 --75.9187 --75.9297 --75.9234 --75.9219 --75.9328 --75.9109 --75.9219 --75.9203 --75.9297 --75.9141 --75.9266 --75.9234 --75.9109 --75.9141 --75.9266 --75.9391 --75.9187 --75.9266 --75.9187 --75.9187 --75.9203 --75.9313 --75.9313 --75.9156 --75.9156 --75.9281 --75.9234 --75.9203 --75.9109 --75.9266 --75.9187 --75.9313 --75.925 --75.9141 --75.9344 --75.925 --75.9187 --75.9266 --75.9234 --75.9391 --75.9297 --75.9297 --75.9172 --75.9219 --75.9328 --75.9375 --75.9219 --75.9281 --75.9109 --75.9203 --75.9266 --75.9297 --75.9078 --75.925 --75.925 --75.9234 --75.9172 --75.9172 --75.9313 --75.9281 --75.9422 --75.9281 --75.9375 --75.9313 --75.9219 --75.9313 --75.9375 --75.9125 --75.9328 --75.9344 --75.9297 --75.9328 --75.9313 --75.9375 --75.9359 --75.9328 --75.9234 --75.9344 --75.9437 --75.9313 --75.9328 --75.9281 --75.9359 --75.9297 --75.925 --75.9297 --75.9359 --75.9344 --75.9391 --75.9359 --75.9156 --75.9281 --75.925 --75.9313 --75.9234 --75.9344 --75.925 --75.9297 --75.9313 --75.9344 --75.9313 --75.9344 --75.9313 --75.9266 --75.9266 --75.9266 --75.9297 --75.9297 --75.9234 --75.9359 --75.9281 --75.9234 --75.9375 --75.925 --75.9219 --75.9234 --75.9234 --75.9203 --75.9187 --75.9219 --75.925 --75.925 --75.9109 --75.9234 --75.9281 --75.9359 --75.9266 --75.9281 --75.9344 --75.9219 --75.9313 --75.9187 --75.9203 --75.9266 --75.9297 --75.9187 --75.9219 --75.9266 --75.9266 --75.9281 --75.9391 --75.925 --75.9266 --75.9172 --75.9281 --75.9156 --75.9328 --75.9156 --75.9297 --75.9375 --75.925 --75.9422 --75.9453 --75.9313 --75.925 --75.9266 --75.9344 --75.9297 --75.9125 --75.9313 --75.9328 --75.9391 --75.9141 --75.925 --75.9187 --75.9203 --75.9313 --75.9313 --75.9344 --75.9234 --75.9109 --75.9203 --75.9172 --75.9234 --75.9203 --75.925 --75.9297 --75.9328 --75.9297 --75.9297 --75.9422 --75.9328 --75.9313 --75.9297 --75.9297 --75.9281 --75.9094 --75.9375 --75.9375 --75.9422 --75.9297 --75.9328 --75.9344 --75.9375 --75.925 --75.9266 --75.9297 --75.9359 --75.9266 --75.95 --75.9375 --75.9172 --75.9219 --75.9313 --75.9234 --75.9375 --75.925 --75.9281 --75.9156 --75.9344 --75.9437 --75.9359 --75.9437 --75.9359 --75.9422 --75.9359 --75.9516 --75.9406 --75.9328 --75.9391 --75.925 --75.9328 --75.9359 --75.9344 --75.9516 --75.9344 --75.9406 --75.9375 --75.9406 --75.9328 --75.9234 --75.9391 --75.9344 --75.9313 --75.9344 --75.9375 --75.9422 --75.9344 --75.95 --75.9266 --75.9406 --75.9328 --75.9453 --75.9375 --75.9281 --75.9453 --75.9391 --75.9437 --75.9266 --75.9359 --75.9391 --75.9297 --75.9281 --75.925 --75.9391 --75.9375 --75.9344 --75.9328 --75.9203 --75.9313 --75.9359 --75.9328 --75.9641 --75.9375 --75.9281 --75.9391 --75.9375 --75.9313 --75.9297 --75.9391 --75.9359 --75.9359 --75.9391 --75.9172 --75.9437 --75.9344 --75.9516 --75.9328 --75.9359 --75.9406 --75.9297 --75.9328 --75.9328 --75.9281 --75.9266 --75.9406 --75.9359 --75.9219 --75.9297 --75.9344 --75.9187 --75.9359 --75.9141 --75.925 --75.925 --75.9266 --75.9297 --75.9313 --75.9094 --75.9344 --75.9328 --75.9375 --75.9234 --75.9234 --75.9297 --75.925 --75.9359 --75.925 --75.9391 --75.9266 --75.925 --75.9281 --75.9359 --75.9344 --75.9328 --75.9156 --75.9344 --75.9234 --75.9203 --75.9219 --75.9359 --75.9328 --75.9281 --75.925 --75.9172 --75.9406 --75.9391 --75.9281 --75.9344 --75.9328 --75.9391 --75.9359 --75.9234 --75.9313 --75.925 --75.9203 --75.9453 --75.9187 --75.9359 --75.9344 --75.9266 --75.9328 --75.9328 --75.9172 --75.9344 --75.9391 --75.9297 --75.9266 --75.9297 --75.9313 --75.9469 --75.9484 --75.925 --75.9266 --75.9375 --75.9391 --75.9344 --75.9359 --75.9375 --75.9297 --75.9281 --75.95 --75.9437 --75.9375 --75.95 --75.9469 --75.9422 --75.9406 --75.9406 --75.9437 --75.9344 --75.9359 --75.9328 --75.9359 --75.9391 --75.9281 --75.9375 --75.9437 --75.9344 --75.925 --75.9297 --75.9422 --75.9391 --75.9484 --75.9219 --75.9406 --75.9453 --75.9375 --75.9344 --75.9391 --75.9453 --75.9422 --75.9437 --75.9516 --75.9406 --75.9391 --75.9469 --75.9313 --75.9469 --75.9453 --75.9516 --75.9625 --75.9453 --75.9422 --75.9437 --75.9359 --75.9453 --75.9578 --75.9359 --75.9437 --75.9359 --75.9406 --75.9422 --75.9344 --75.9437 --75.9344 --75.9453 --75.9406 --75.9437 --75.9391 --75.9375 --75.9406 --75.9469 --75.9359 --75.95 --75.9406 --75.9516 --75.9437 --75.9578 --75.9531 --75.9469 --75.9406 --75.9437 --75.9531 --75.9422 --75.9422 --75.9328 --75.9437 --75.9344 --75.9656 --75.9375 --75.9484 --75.9484 --75.9359 --75.9313 --75.9594 --75.9484 --75.9375 --75.9391 --75.9453 --75.9469 --75.9563 --75.9406 --75.9547 --75.9344 --75.9391 --75.9469 --75.9531 --75.9516 --75.9406 --75.9453 --75.9563 --75.9422 --75.9469 --75.9437 --75.9594 --75.9594 --75.9641 --75.9484 --75.9531 --75.9563 --75.95 --75.9547 --75.9453 --75.9625 --75.9484 --75.9547 --75.9594 --75.9422 --75.9375 --75.9531 --75.9469 --75.9469 --75.95 --75.9547 --75.9469 --75.9437 --75.9422 --75.95 --75.9406 --75.9578 --75.9406 --75.9406 --75.9516 --75.9344 --75.9422 --75.9547 --75.95 --75.9406 --75.9391 --75.9375 --75.9469 --75.9453 --75.9422 --75.9297 --75.9344 --75.9437 --75.9469 --75.9391 --75.9516 --75.9422 --75.9453 --75.9437 --75.9406 --75.9437 --75.9578 --75.9375 --75.9453 --75.9453 --75.9422 --75.95 --75.9547 --75.9422 --75.9328 --75.9641 --75.9672 --75.95 --75.9563 --75.9469 --75.9578 --75.9516 --75.9469 --75.9328 --75.9453 --75.9406 --75.95 --75.9563 --75.9578 --75.9484 --75.9547 --75.9578 --75.9563 --75.9469 --75.95 --75.9422 --75.9359 --75.9594 --75.9484 --75.9453 --75.95 --75.9609 --75.9422 --75.9578 --75.9516 --75.9594 --75.9516 --75.9531 --75.9469 --75.9422 --75.9453 --75.95 --75.9437 --75.9391 --75.9453 --75.9484 --75.9375 --75.9469 --75.9437 --75.95 --75.9469 --75.9453 --75.95 --75.9406 --75.9484 --75.9563 --75.9578 --75.9406 --75.9437 --75.95 --75.9484 --75.9516 --75.9422 --75.9531 --75.9437 --75.9484 --75.9578 --75.9672 --75.95 --75.9531 --75.9656 --75.9453 --75.9641 --75.9453 --75.9531 --75.9484 --75.9516 --75.9484 --75.9531 --75.9563 --75.9469 --75.9484 --75.9625 --75.9437 --75.9609 --75.9516 --75.9609 --75.9484 --75.9625 --75.9563 --75.9625 --75.9437 --75.9516 --75.9656 --75.9437 --75.9641 --75.9578 --75.9563 --75.9547 --75.9344 --75.9453 --75.9578 --75.9453 --75.9516 --75.9391 --75.9453 --75.9484 --75.9437 --75.9344 --75.9375 --75.9437 --75.9422 --75.9469 --75.9422 --75.9516 --75.9328 --75.9437 --75.9375 --75.9266 --75.9422 --75.9422 --75.9406 --75.9516 --75.9406 --75.9453 --75.9484 --75.9328 --75.9422 --75.9531 --75.9437 --75.9406 --75.9281 --75.9281 --75.9313 --75.9375 --75.9281 --75.9391 --75.9437 --75.9422 --75.9328 --75.9469 --75.9344 --75.9453 --75.95 --75.9484 --75.9281 --75.9547 --75.9328 --75.9437 --75.9563 --75.9484 --75.9328 --75.9578 --75.9344 --75.9297 --75.9313 --75.9484 --75.95 --75.9469 --75.9484 --75.9437 --75.9266 --75.9406 --75.9453 --75.9422 --75.9516 --75.9328 --75.9437 --75.9469 --75.9344 --75.9437 --75.9437 --75.9375 --75.9391 --75.9406 --75.9547 --75.9453 --75.9563 --75.9578 --75.9484 --75.9437 --75.9359 --75.9422 --75.9391 --75.9578 --75.9516 --75.95 --75.9531 --75.9563 --75.9563 --75.9578 --75.9594 --75.9609 --75.9594 --75.9516 --75.9563 --75.9578 --75.9609 --75.9672 --75.9547 --75.9563 --75.9625 --75.9656 --75.95 --75.9563 --75.9656 --75.9469 --75.9484 --75.9547 --75.9453 --75.95 --75.95 --75.9609 --75.9531 --75.9484 --75.9344 --75.9328 --75.95 --75.9484 --75.9531 --75.9391 --75.9516 --75.9344 --75.9531 --75.9469 --75.9484 --75.9469 --75.9469 --75.9578 --75.9547 --75.9547 --75.9437 --75.9469 --75.95 --75.95 --75.9578 --75.9437 --75.9531 --75.9563 --75.9453 --75.9453 --75.9453 --75.9422 --75.95 --75.9531 --75.9609 --75.9531 --75.9328 --75.9328 --75.9547 --75.9406 --75.9531 --75.9516 --75.9547 --75.9391 --75.9609 --75.95 --75.9531 --75.9406 --75.9297 --75.9313 --75.9406 --75.9484 --75.9469 --75.9625 --75.9406 --75.9578 --75.9563 --75.9641 --75.9484 --75.9625 --75.9641 --75.9594 --75.9672 --75.95 --75.9563 --75.9484 --75.9563 --75.95 --75.9531 --75.9563 --75.9391 --75.95 --75.9516 --75.9563 --75.9516 --75.9484 --75.95 --75.9688 --75.9656 --75.9578 --75.95 --75.9375 --75.9609 --75.9516 --75.9547 --75.9406 --75.9344 --75.9609 --75.9547 --75.9563 --75.9406 --75.9594 --75.9656 --75.9391 --75.9609 --75.9578 --75.9469 --75.9609 --75.9578 --75.9422 --75.9563 --75.9672 --75.9547 --75.9625 --75.9594 --75.9516 --75.9688 --75.9594 --75.9563 --75.9594 --75.9594 --75.9672 --75.9625 --75.9563 --75.9594 --75.9656 --75.9578 --75.9656 --75.9688 --75.9734 --75.9563 --75.9609 --75.9625 --75.9641 --75.9641 --75.9594 --75.9609 --75.9547 --75.9656 --75.9563 --75.9656 --75.9688 --75.9609 --75.9563 --75.9641 --75.9734 --75.9609 --75.9609 --75.9703 --75.9547 --75.9594 --75.9594 --75.9781 --75.9625 --75.9578 --75.9563 --75.9594 --75.9531 --75.9516 --75.9594 --75.95 --75.9469 --75.9563 --75.9531 --75.9594 --75.9547 --75.9422 --75.9453 --75.9531 --75.95 --75.9531 --75.9563 --75.9547 --75.9672 --75.9703 --75.9547 --75.9594 --75.9516 --75.9547 --75.9578 --75.9578 --75.9609 --75.9703 --75.9531 --75.9594 --75.9563 --75.9609 --75.9563 --75.9688 --75.9422 --75.9531 --75.9594 --75.9641 --75.9563 --75.9656 --75.9469 --75.9688 --75.9672 --75.9563 --75.9625 --75.9609 --75.9594 --75.9578 --75.9672 --75.9656 --75.9656 --75.95 --75.9656 --75.9688 --75.9656 --75.9766 --75.9719 --75.9688 --75.9812 --75.9719 --75.9719 --75.9703 --75.9672 --75.9641 --75.9719 --75.9781 --75.9766 --75.9672 --75.9656 --75.9656 --75.9609 --75.9688 --75.9625 --75.9688 --75.9625 --75.9656 --75.9781 --75.9766 --75.9781 --75.9703 --75.975 --75.9734 --75.9719 --75.9609 --75.9766 --75.9609 --75.9812 --75.9828 --75.9828 --75.9812 --75.9672 --75.9719 --75.9797 --75.975 --75.9797 --75.9719 --75.9719 --75.9812 --75.9625 --75.9766 --75.9812 --75.9797 --75.9719 --75.9766 --75.975 --75.9703 --75.9797 --75.9688 --75.9703 --75.9766 --75.9859 --75.975 --75.9812 --75.9641 --75.9797 --75.9781 --75.9609 --75.9812 --75.9891 --75.9719 --75.975 --75.9688 --75.9641 --75.9656 --75.9766 --75.9797 --75.9891 --75.9781 --75.9672 --75.9703 --75.9703 --75.9766 --75.9625 --75.9734 --75.9688 --75.9812 --75.975 --75.9734 --75.9688 --75.9766 --75.9812 --75.9703 --75.9703 --75.9797 --75.9797 --75.9828 --75.9781 --75.9703 --75.9781 --75.975 --75.9719 --75.9719 --75.9625 --75.9875 --75.9719 --75.9734 --75.9734 --75.9688 --75.9688 --75.9656 --75.9781 --75.9672 --75.9703 --75.9766 --75.9719 --75.9656 --75.9797 --75.9688 --75.9672 --75.9641 --75.9781 --75.9844 --75.9641 --75.9719 --75.9844 --75.9781 --75.9703 --75.9703 --75.9797 --75.9656 --75.9641 --75.9734 --75.9578 --75.9734 --75.9563 --75.9688 --75.9516 --75.9609 --75.9563 --75.9594 --75.9594 --75.9578 --75.9547 --75.9594 --75.9672 --75.9703 --75.9703 --75.9609 --75.9609 --75.9641 --75.975 --75.9609 --75.9609 --75.9531 --75.9578 --75.9516 --75.9531 --75.9703 --75.9641 --75.9656 --75.9703 --75.9469 --75.9641 --75.9563 --75.9688 --75.9625 --75.9578 --75.9641 --75.9656 --75.9641 --75.9672 --75.9578 --75.9547 --75.9688 --75.9672 --75.9609 --75.9625 --75.9625 --75.9609 --75.9594 --75.9516 --75.9594 --75.9703 --75.9594 --75.9656 --75.9719 --75.9625 --75.9578 --75.9563 --75.9625 --75.9766 --75.9734 --75.9563 --75.9766 --75.9656 --75.9641 --75.9891 --75.9563 --75.9812 --75.9656 --75.9781 --75.975 --75.9781 --75.9688 --75.9672 --75.9641 --75.9609 --75.9734 --75.9719 --75.9516 --75.9734 --75.9531 --75.9719 --75.9641 --75.9563 --75.9625 --75.9547 --75.9578 --75.9688 --75.9766 --75.9641 --75.9812 --75.9609 --75.9766 --75.9766 --75.9609 --75.9719 --75.9688 --75.9641 --75.975 --75.9672 --75.9609 --75.9656 --75.9594 --75.9734 --75.9766 --75.9531 --75.9641 --75.9703 --75.9625 --75.9688 --75.9563 --75.9656 --75.9594 --75.9484 --75.9641 --75.9563 --75.9469 --75.9547 --75.9703 --75.9641 --75.9609 --75.9563 --75.9688 --75.9563 --75.9547 --75.9594 --75.9484 --75.9578 --75.9594 --75.9437 --75.9625 --75.9719 --75.9672 --75.9437 --75.9719 --75.9609 --75.9625 --75.9797 --75.9547 --75.9563 --75.9484 --75.9609 --75.9484 --75.9641 --75.9625 --75.9656 --75.9688 --75.9688 --75.9609 --75.9563 --75.9625 --75.9641 --75.9672 --75.9719 --75.9672 --75.9656 --75.9531 --75.9563 --75.9609 --75.9656 --75.9563 --75.9625 --75.9656 --75.9578 --75.9469 --75.9781 --75.9594 --75.9578 --75.9672 --75.9641 --75.9641 --75.9703 --75.9578 --75.9609 --75.9672 --75.9641 --75.9594 --75.9656 --75.9656 --75.9641 --75.9578 --75.9719 --75.95 --75.9641 --75.9531 --75.9656 --75.9578 --75.9563 --75.95 --75.9563 --75.9594 --75.9578 --75.9594 --75.9609 --75.9484 --75.9625 --75.9391 --75.9578 --75.9672 --75.9563 --75.9453 --75.9516 --75.9531 --75.9594 --75.9484 --75.9516 --75.9531 --75.9531 --75.9672 --75.9516 --75.9625 --75.9547 - -2 -4.0025 -100.002 - -0 -1 - -0 -RegionFitness xdat ydat boundary weight (lines=81008) 1 -|| -40500 -0 -0.005 -0.01 -0.015 -0.02 -0.025 -0.03 -0.035 -0.04 -0.045 -0.05 -0.055 -0.06 -0.065 -0.07 -0.075 -0.08 -0.085 -0.09 -0.095 -0.1 -0.105 -0.11 -0.115 -0.12 -0.125 -0.13 -0.135 -0.14 -0.145 -0.15 -0.155 -0.16 -0.165 -0.17 -0.175 -0.18 -0.185 -0.19 -0.195 -0.2 -0.205 -0.21 -0.215 -0.22 -0.225 -0.23 -0.235 -0.24 -0.245 -0.25 -0.255 -0.26 -0.265 -0.27 -0.275 -0.28 -0.285 -0.29 -0.295 -0.3 -0.305 -0.31 -0.315 -0.32 -0.325 -0.33 -0.335 -0.34 -0.345 -0.35 -0.355 -0.36 -0.365 -0.37 -0.375 -0.38 -0.385 -0.39 -0.395 -0.4 -0.405 -0.41 -0.415 -0.42 -0.425 -0.43 -0.435 -0.44 -0.445 -0.45 -0.455 -0.46 -0.465 -0.47 -0.475 -0.48 -0.485 -0.49 -0.495 -0.5 -0.505 -0.51 -0.515 -0.52 -0.525 -0.53 -0.535 -0.54 -0.545 -0.55 -0.555 -0.56 -0.565 -0.57 -0.575 -0.58 -0.585 -0.59 -0.595 -0.6 -0.605 -0.61 -0.615 -0.62 -0.625 -0.63 -0.635 -0.64 -0.645 -0.65 -0.655 -0.66 -0.665 -0.67 -0.675 -0.68 -0.685 -0.69 -0.695 -0.7 -0.705 -0.71 -0.715 -0.72 -0.725 -0.73 -0.735 -0.74 -0.745 -0.75 -0.755 -0.76 -0.765 -0.77 -0.775 -0.78 -0.785 -0.79 -0.795 -0.8 -0.805 -0.81 -0.815 -0.82 -0.825 -0.83 -0.835 -0.84 -0.845 -0.85 -0.855 -0.86 -0.865 -0.87 -0.875 -0.88 -0.885 -0.89 -0.895 -0.9 -0.905 -0.91 -0.915 -0.92 -0.925 -0.93 -0.935 -0.94 -0.945 -0.95 -0.955 -0.96 -0.965 -0.97 -0.975 -0.98 -0.985 -0.99 -0.995 -1 -1.005 -1.01 -1.015 -1.02 -1.025 -1.03 -1.035 -1.04 -1.045 -1.05 -1.055 -1.06 -1.065 -1.07 -1.075 -1.08 -1.085 -1.09 -1.095 -1.1 -1.105 -1.11 -1.115 -1.12 -1.125 -1.13 -1.135 -1.14 -1.145 -1.15 -1.155 -1.16 -1.165 -1.17 -1.175 -1.18 -1.185 -1.19 -1.195 -1.2 -1.205 -1.21 -1.215 -1.22 -1.225 -1.23 -1.235 -1.24 -1.245 -1.25 -1.255 -1.26 -1.265 -1.27 -1.275 -1.28 -1.285 -1.29 -1.295 -1.3 -1.305 -1.31 -1.315 -1.32 -1.325 -1.33 -1.335 -1.34 -1.345 -1.35 -1.355 -1.36 -1.365 -1.37 -1.375 -1.38 -1.385 -1.39 -1.395 -1.4 -1.405 -1.41 -1.415 -1.42 -1.425 -1.43 -1.435 -1.44 -1.445 -1.45 -1.455 -1.46 -1.465 -1.47 -1.475 -1.48 -1.485 -1.49 -1.495 -1.5 -1.505 -1.51 -1.515 -1.52 -1.525 -1.53 -1.535 -1.54 -1.545 -1.55 -1.555 -1.56 -1.565 -1.57 -1.575 -1.58 -1.585 -1.59 -1.595 -1.6 -1.605 -1.61 -1.615 -1.62 -1.625 -1.63 -1.635 -1.64 -1.645 -1.65 -1.655 -1.66 -1.665 -1.67 -1.675 -1.68 -1.685 -1.69 -1.695 -1.7 -1.705 -1.71 -1.715 -1.72 -1.725 -1.73 -1.735 -1.74 -1.745 -1.75 -1.755 -1.76 -1.765 -1.77 -1.775 -1.78 -1.785 -1.79 -1.795 -1.8 -1.805 -1.81 -1.815 -1.82 -1.825 -1.83 -1.835 -1.84 -1.845 -1.85 -1.855 -1.86 -1.865 -1.87 -1.875 -1.88 -1.885 -1.89 -1.895 -1.9 -1.905 -1.91 -1.915 -1.92 -1.925 -1.93 -1.935 -1.94 -1.945 -1.95 -1.955 -1.96 -1.965 -1.97 -1.975 -1.98 -1.985 -1.99 -1.995 -2 -2.005 -2.01 -2.015 -2.02 -2.025 -2.03 -2.035 -2.04 -2.045 -2.05 -2.055 -2.06 -2.065 -2.07 -2.075 -2.08 -2.085 -2.09 -2.095 -2.1 -2.105 -2.11 -2.115 -2.12 -2.125 -2.13 -2.135 -2.14 -2.145 -2.15 -2.155 -2.16 -2.165 -2.17 -2.175 -2.18 -2.185 -2.19 -2.195 -2.2 -2.205 -2.21 -2.215 -2.22 -2.225 -2.23 -2.235 -2.24 -2.245 -2.25 -2.255 -2.26 -2.265 -2.27 -2.275 -2.28 -2.285 -2.29 -2.295 -2.3 -2.305 -2.31 -2.315 -2.32 -2.325 -2.33 -2.335 -2.34 -2.345 -2.35 -2.355 -2.36 -2.365 -2.37 -2.375 -2.38 -2.385 -2.39 -2.395 -2.4 -2.405 -2.41 -2.415 -2.42 -2.425 -2.43 -2.435 -2.44 -2.445 -2.45 -2.455 -2.46 -2.465 -2.47 -2.475 -2.48 -2.485 -2.49 -2.495 -2.5 -2.505 -2.51 -2.515 -2.52 -2.525 -2.53 -2.535 -2.54 -2.545 -2.55 -2.555 -2.56 -2.565 -2.57 -2.575 -2.58 -2.585 -2.59 -2.595 -2.6 -2.605 -2.61 -2.615 -2.62 -2.625 -2.63 -2.635 -2.64 -2.645 -2.65 -2.655 -2.66 -2.665 -2.67 -2.675 -2.68 -2.685 -2.69 -2.695 -2.7 -2.705 -2.71 -2.715 -2.72 -2.725 -2.73 -2.735 -2.74 -2.745 -2.75 -2.755 -2.76 -2.765 -2.77 -2.775 -2.78 -2.785 -2.79 -2.795 -2.8 -2.805 -2.81 -2.815 -2.82 -2.825 -2.83 -2.835 -2.84 -2.845 -2.85 -2.855 -2.86 -2.865 -2.87 -2.875 -2.88 -2.885 -2.89 -2.895 -2.9 -2.905 -2.91 -2.915 -2.92 -2.925 -2.93 -2.935 -2.94 -2.945 -2.95 -2.955 -2.96 -2.965 -2.97 -2.975 -2.98 -2.985 -2.99 -2.995 -3 -3.005 -3.01 -3.015 -3.02 -3.025 -3.03 -3.035 -3.04 -3.045 -3.05 -3.055 -3.06 -3.065 -3.07 -3.075 -3.08 -3.085 -3.09 -3.095 -3.1 -3.105 -3.11 -3.115 -3.12 -3.125 -3.13 -3.135 -3.14 -3.145 -3.15 -3.155 -3.16 -3.165 -3.17 -3.175 -3.18 -3.185 -3.19 -3.195 -3.2 -3.205 -3.21 -3.215 -3.22 -3.225 -3.23 -3.235 -3.24 -3.245 -3.25 -3.255 -3.26 -3.265 -3.27 -3.275 -3.28 -3.285 -3.29 -3.295 -3.3 -3.305 -3.31 -3.315 -3.32 -3.325 -3.33 -3.335 -3.34 -3.345 -3.35 -3.355 -3.36 -3.365 -3.37 -3.375 -3.38 -3.385 -3.39 -3.395 -3.4 -3.405 -3.41 -3.415 -3.42 -3.425 -3.43 -3.435 -3.44 -3.445 -3.45 -3.455 -3.46 -3.465 -3.47 -3.475 -3.48 -3.485 -3.49 -3.495 -3.5 -3.505 -3.51 -3.515 -3.52 -3.525 -3.53 -3.535 -3.54 -3.545 -3.55 -3.555 -3.56 -3.565 -3.57 -3.575 -3.58 -3.585 -3.59 -3.595 -3.6 -3.605 -3.61 -3.615 -3.62 -3.625 -3.63 -3.635 -3.64 -3.645 -3.65 -3.655 -3.66 -3.665 -3.67 -3.675 -3.68 -3.685 -3.69 -3.695 -3.7 -3.705 -3.71 -3.715 -3.72 -3.725 -3.73 -3.735 -3.74 -3.745 -3.75 -3.755 -3.76 -3.765 -3.77 -3.775 -3.78 -3.785 -3.79 -3.795 -3.8 -3.805 -3.81 -3.815 -3.82 -3.825 -3.83 -3.835 -3.84 -3.845 -3.85 -3.855 -3.86 -3.865 -3.87 -3.875 -3.88 -3.885 -3.89 -3.895 -3.9 -3.905 -3.91 -3.915 -3.92 -3.925 -3.93 -3.935 -3.94 -3.945 -3.95 -3.955 -3.96 -3.965 -3.97 -3.975 -3.98 -3.985 -3.99 -3.995 -4 -4.005 -4.01 -4.015 -4.02 -4.025 -4.03 -4.035 -4.04 -4.045 -4.05 -4.055 -4.06 -4.065 -4.07 -4.075 -4.08 -4.085 -4.09 -4.095 -4.1 -4.105 -4.11 -4.115 -4.12 -4.125 -4.13 -4.135 -4.14 -4.145 -4.15 -4.155 -4.16 -4.165 -4.17 -4.175 -4.18 -4.185 -4.19 -4.195 -4.2 -4.205 -4.21 -4.215 -4.22 -4.225 -4.23 -4.235 -4.24 -4.245 -4.25 -4.255 -4.26 -4.265 -4.27 -4.275 -4.28 -4.285 -4.29 -4.295 -4.3 -4.305 -4.31 -4.315 -4.32 -4.325 -4.33 -4.335 -4.34 -4.345 -4.35 -4.355 -4.36 -4.365 -4.37 -4.375 -4.38 -4.385 -4.39 -4.395 -4.4 -4.405 -4.41 -4.415 -4.42 -4.425 -4.43 -4.435 -4.44 -4.445 -4.45 -4.455 -4.46 -4.465 -4.47 -4.475 -4.48 -4.485 -4.49 -4.495 -4.5 -4.505 -4.51 -4.515 -4.52 -4.525 -4.53 -4.535 -4.54 -4.545 -4.55 -4.555 -4.56 -4.565 -4.57 -4.575 -4.58 -4.585 -4.59 -4.595 -4.6 -4.605 -4.61 -4.615 -4.62 -4.625 -4.63 -4.635 -4.64 -4.645 -4.65 -4.655 -4.66 -4.665 -4.67 -4.675 -4.68 -4.685 -4.69 -4.695 -4.7 -4.705 -4.71 -4.715 -4.72 -4.725 -4.73 -4.735 -4.74 -4.745 -4.75 -4.755 -4.76 -4.765 -4.77 -4.775 -4.78 -4.785 -4.79 -4.795 -4.8 -4.805 -4.81 -4.815 -4.82 -4.825 -4.83 -4.835 -4.84 -4.845 -4.85 -4.855 -4.86 -4.865 -4.87 -4.875 -4.88 -4.885 -4.89 -4.895 -4.9 -4.905 -4.91 -4.915 -4.92 -4.925 -4.93 -4.935 -4.94 -4.945 -4.95 -4.955 -4.96 -4.965 -4.97 -4.975 -4.98 -4.985 -4.99 -4.995 -5 -5.005 -5.01 -5.015 -5.02 -5.025 -5.03 -5.035 -5.04 -5.045 -5.05 -5.055 -5.06 -5.065 -5.07 -5.075 -5.08 -5.085 -5.09 -5.095 -5.1 -5.105 -5.11 -5.115 -5.12 -5.125 -5.13 -5.135 -5.14 -5.145 -5.15 -5.155 -5.16 -5.165 -5.17 -5.175 -5.18 -5.185 -5.19 -5.195 -5.2 -5.205 -5.21 -5.215 -5.22 -5.225 -5.23 -5.235 -5.24 -5.245 -5.25 -5.255 -5.26 -5.265 -5.27 -5.275 -5.28 -5.285 -5.29 -5.295 -5.3 -5.305 -5.31 -5.315 -5.32 -5.325 -5.33 -5.335 -5.34 -5.345 -5.35 -5.355 -5.36 -5.365 -5.37 -5.375 -5.38 -5.385 -5.39 -5.395 -5.4 -5.405 -5.41 -5.415 -5.42 -5.425 -5.43 -5.435 -5.44 -5.445 -5.45 -5.455 -5.46 -5.465 -5.47 -5.475 -5.48 -5.485 -5.49 -5.495 -5.5 -5.505 -5.51 -5.515 -5.52 -5.525 -5.53 -5.535 -5.54 -5.545 -5.55 -5.555 -5.56 -5.565 -5.57 -5.575 -5.58 -5.585 -5.59 -5.595 -5.6 -5.605 -5.61 -5.615 -5.62 -5.625 -5.63 -5.635 -5.64 -5.645 -5.65 -5.655 -5.66 -5.665 -5.67 -5.675 -5.68 -5.685 -5.69 -5.695 -5.7 -5.705 -5.71 -5.715 -5.72 -5.725 -5.73 -5.735 -5.74 -5.745 -5.75 -5.755 -5.76 -5.765 -5.77 -5.775 -5.78 -5.785 -5.79 -5.795 -5.8 -5.805 -5.81 -5.815 -5.82 -5.825 -5.83 -5.835 -5.84 -5.845 -5.85 -5.855 -5.86 -5.865 -5.87 -5.875 -5.88 -5.885 -5.89 -5.895 -5.9 -5.905 -5.91 -5.915 -5.92 -5.925 -5.93 -5.935 -5.94 -5.945 -5.95 -5.955 -5.96 -5.965 -5.97 -5.975 -5.98 -5.985 -5.99 -5.995 -6 -6.005 -6.01 -6.015 -6.02 -6.025 -6.03 -6.035 -6.04 -6.045 -6.05 -6.055 -6.06 -6.065 -6.07 -6.075 -6.08 -6.085 -6.09 -6.095 -6.1 -6.105 -6.11 -6.115 -6.12 -6.125 -6.13 -6.135 -6.14 -6.145 -6.15 -6.155 -6.16 -6.165 -6.17 -6.175 -6.18 -6.185 -6.19 -6.195 -6.2 -6.205 -6.21 -6.215 -6.22 -6.225 -6.23 -6.235 -6.24 -6.245 -6.25 -6.255 -6.26 -6.265 -6.27 -6.275 -6.28 -6.285 -6.29 -6.295 -6.3 -6.305 -6.31 -6.315 -6.32 -6.325 -6.33 -6.335 -6.34 -6.345 -6.35 -6.355 -6.36 -6.365 -6.37 -6.375 -6.38 -6.385 -6.39 -6.395 -6.4 -6.405 -6.41 -6.415 -6.42 -6.425 -6.43 -6.435 -6.44 -6.445 -6.45 -6.455 -6.46 -6.465 -6.47 -6.475 -6.48 -6.485 -6.49 -6.495 -6.5 -6.505 -6.51 -6.515 -6.52 -6.525 -6.53 -6.535 -6.54 -6.545 -6.55 -6.555 -6.56 -6.565 -6.57 -6.575 -6.58 -6.585 -6.59 -6.595 -6.6 -6.605 -6.61 -6.615 -6.62 -6.625 -6.63 -6.635 -6.64 -6.645 -6.65 -6.655 -6.66 -6.665 -6.67 -6.675 -6.68 -6.685 -6.69 -6.695 -6.7 -6.705 -6.71 -6.715 -6.72 -6.725 -6.73 -6.735 -6.74 -6.745 -6.75 -6.755 -6.76 -6.765 -6.77 -6.775 -6.78 -6.785 -6.79 -6.795 -6.8 -6.805 -6.81 -6.815 -6.82 -6.825 -6.83 -6.835 -6.84 -6.845 -6.85 -6.855 -6.86 -6.865 -6.87 -6.875 -6.88 -6.885 -6.89 -6.895 -6.9 -6.905 -6.91 -6.915 -6.92 -6.925 -6.93 -6.935 -6.94 -6.945 -6.95 -6.955 -6.96 -6.965 -6.97 -6.975 -6.98 -6.985 -6.99 -6.995 -7 -7.005 -7.01 -7.015 -7.02 -7.025 -7.03 -7.035 -7.04 -7.045 -7.05 -7.055 -7.06 -7.065 -7.07 -7.075 -7.08 -7.085 -7.09 -7.095 -7.1 -7.105 -7.11 -7.115 -7.12 -7.125 -7.13 -7.135 -7.14 -7.145 -7.15 -7.155 -7.16 -7.165 -7.17 -7.175 -7.18 -7.185 -7.19 -7.195 -7.2 -7.205 -7.21 -7.215 -7.22 -7.225 -7.23 -7.235 -7.24 -7.245 -7.25 -7.255 -7.26 -7.265 -7.27 -7.275 -7.28 -7.285 -7.29 -7.295 -7.3 -7.305 -7.31 -7.315 -7.32 -7.325 -7.33 -7.335 -7.34 -7.345 -7.35 -7.355 -7.36 -7.365 -7.37 -7.375 -7.38 -7.385 -7.39 -7.395 -7.4 -7.405 -7.41 -7.415 -7.42 -7.425 -7.43 -7.435 -7.44 -7.445 -7.45 -7.455 -7.46 -7.465 -7.47 -7.475 -7.48 -7.485 -7.49 -7.495 -7.5 -7.505 -7.51 -7.515 -7.52 -7.525 -7.53 -7.535 -7.54 -7.545 -7.55 -7.555 -7.56 -7.565 -7.57 -7.575 -7.58 -7.585 -7.59 -7.595 -7.6 -7.605 -7.61 -7.615 -7.62 -7.625 -7.63 -7.635 -7.64 -7.645 -7.65 -7.655 -7.66 -7.665 -7.67 -7.675 -7.68 -7.685 -7.69 -7.695 -7.7 -7.705 -7.71 -7.715 -7.72 -7.725 -7.73 -7.735 -7.74 -7.745 -7.75 -7.755 -7.76 -7.765 -7.77 -7.775 -7.78 -7.785 -7.79 -7.795 -7.8 -7.805 -7.81 -7.815 -7.82 -7.825 -7.83 -7.835 -7.84 -7.845 -7.85 -7.855 -7.86 -7.865 -7.87 -7.875 -7.88 -7.885 -7.89 -7.895 -7.9 -7.905 -7.91 -7.915 -7.92 -7.925 -7.93 -7.935 -7.94 -7.945 -7.95 -7.955 -7.96 -7.965 -7.97 -7.975 -7.98 -7.985 -7.99 -7.995 -8 -8.005 -8.01 -8.015 -8.02 -8.025 -8.03 -8.035 -8.04 -8.045 -8.05 -8.055 -8.06 -8.065 -8.07 -8.075 -8.08 -8.085 -8.09 -8.095 -8.1 -8.105 -8.11 -8.115 -8.12 -8.125 -8.13 -8.135 -8.14 -8.145 -8.15 -8.155 -8.16 -8.165 -8.17 -8.175 -8.18 -8.185 -8.19 -8.195 -8.2 -8.205 -8.21 -8.215 -8.22 -8.225 -8.23 -8.235 -8.24 -8.245 -8.25 -8.255 -8.26 -8.265 -8.27 -8.275 -8.28 -8.285 -8.29 -8.295 -8.3 -8.305 -8.31 -8.315 -8.32 -8.325 -8.33 -8.335 -8.34 -8.345 -8.35 -8.355 -8.36 -8.365 -8.37 -8.375 -8.38 -8.385 -8.39 -8.395 -8.4 -8.405 -8.41 -8.415 -8.42 -8.425 -8.43 -8.435 -8.44 -8.445 -8.45 -8.455 -8.46 -8.465 -8.47 -8.475 -8.48 -8.485 -8.49 -8.495 -8.5 -8.505 -8.51 -8.515 -8.52 -8.525 -8.53 -8.535 -8.54 -8.545 -8.55 -8.555 -8.56 -8.565 -8.57 -8.575 -8.58 -8.585 -8.59 -8.595 -8.6 -8.605 -8.61 -8.615 -8.62 -8.625 -8.63 -8.635 -8.64 -8.645 -8.65 -8.655 -8.66 -8.665 -8.67 -8.675 -8.68 -8.685 -8.69 -8.695 -8.7 -8.705 -8.71 -8.715 -8.72 -8.725 -8.73 -8.735 -8.74 -8.745 -8.75 -8.755 -8.76 -8.765 -8.77 -8.775 -8.78 -8.785 -8.79 -8.795 -8.8 -8.805 -8.81 -8.815 -8.82 -8.825 -8.83 -8.835 -8.84 -8.845 -8.85 -8.855 -8.86 -8.865 -8.87 -8.875 -8.88 -8.885 -8.89 -8.895 -8.9 -8.905 -8.91 -8.915 -8.92 -8.925 -8.93 -8.935 -8.94 -8.945 -8.95 -8.955 -8.96 -8.965 -8.97 -8.975 -8.98 -8.985 -8.99 -8.995 -9 -9.005 -9.01 -9.015 -9.02 -9.025 -9.03 -9.035 -9.04 -9.045 -9.05 -9.055 -9.06 -9.065 -9.07 -9.075 -9.08 -9.085 -9.09 -9.095 -9.1 -9.105 -9.11 -9.115 -9.12 -9.125 -9.13 -9.135 -9.14 -9.145 -9.15 -9.155 -9.16 -9.165 -9.17 -9.175 -9.18 -9.185 -9.19 -9.195 -9.2 -9.205 -9.21 -9.215 -9.22 -9.225 -9.23 -9.235 -9.24 -9.245 -9.25 -9.255 -9.26 -9.265 -9.27 -9.275 -9.28 -9.285 -9.29 -9.295 -9.3 -9.305 -9.31 -9.315 -9.32 -9.325 -9.33 -9.335 -9.34 -9.345 -9.35 -9.355 -9.36 -9.365 -9.37 -9.375 -9.38 -9.385 -9.39 -9.395 -9.4 -9.405 -9.41 -9.415 -9.42 -9.425 -9.43 -9.435 -9.44 -9.445 -9.45 -9.455 -9.46 -9.465 -9.47 -9.475 -9.48 -9.485 -9.49 -9.495 -9.5 -9.505 -9.51 -9.515 -9.52 -9.525 -9.53 -9.535 -9.54 -9.545 -9.55 -9.555 -9.56 -9.565 -9.57 -9.575 -9.58 -9.585 -9.59 -9.595 -9.6 -9.605 -9.61 -9.615 -9.62 -9.625 -9.63 -9.635 -9.64 -9.645 -9.65 -9.655 -9.66 -9.665 -9.67 -9.675 -9.68 -9.685 -9.69 -9.695 -9.7 -9.705 -9.71 -9.715 -9.72 -9.725 -9.73 -9.735 -9.74 -9.745 -9.75 -9.755 -9.76 -9.765 -9.77 -9.775 -9.78 -9.785 -9.79 -9.795 -9.8 -9.805 -9.81 -9.815 -9.82 -9.825 -9.83 -9.835 -9.84 -9.845 -9.85 -9.855 -9.86 -9.865 -9.87 -9.875 -9.88 -9.885 -9.89 -9.895 -9.9 -9.905 -9.91 -9.915 -9.92 -9.925 -9.93 -9.935 -9.94 -9.945 -9.95 -9.955 -9.96 -9.965 -9.97 -9.975 -9.98 -9.985 -9.99 -9.995 -10 -10.005 -10.01 -10.015 -10.02 -10.025 -10.03 -10.035 -10.04 -10.045 -10.05 -10.055 -10.06 -10.065 -10.07 -10.075 -10.08 -10.085 -10.09 -10.095 -10.1 -10.105 -10.11 -10.115 -10.12 -10.125 -10.13 -10.135 -10.14 -10.145 -10.15 -10.155 -10.16 -10.165 -10.17 -10.175 -10.18 -10.185 -10.19 -10.195 -10.2 -10.205 -10.21 -10.215 -10.22 -10.225 -10.23 -10.235 -10.24 -10.245 -10.25 -10.255 -10.26 -10.265 -10.27 -10.275 -10.28 -10.285 -10.29 -10.295 -10.3 -10.305 -10.31 -10.315 -10.32 -10.325 -10.33 -10.335 -10.34 -10.345 -10.35 -10.355 -10.36 -10.365 -10.37 -10.375 -10.38 -10.385 -10.39 -10.395 -10.4 -10.405 -10.41 -10.415 -10.42 -10.425 -10.43 -10.435 -10.44 -10.445 -10.45 -10.455 -10.46 -10.465 -10.47 -10.475 -10.48 -10.485 -10.49 -10.495 -10.5 -10.505 -10.51 -10.515 -10.52 -10.525 -10.53 -10.535 -10.54 -10.545 -10.55 -10.555 -10.56 -10.565 -10.57 -10.575 -10.58 -10.585 -10.59 -10.595 -10.6 -10.605 -10.61 -10.615 -10.62 -10.625 -10.63 -10.635 -10.64 -10.645 -10.65 -10.655 -10.66 -10.665 -10.67 -10.675 -10.68 -10.685 -10.69 -10.695 -10.7 -10.705 -10.71 -10.715 -10.72 -10.725 -10.73 -10.735 -10.74 -10.745 -10.75 -10.755 -10.76 -10.765 -10.77 -10.775 -10.78 -10.785 -10.79 -10.795 -10.8 -10.805 -10.81 -10.815 -10.82 -10.825 -10.83 -10.835 -10.84 -10.845 -10.85 -10.855 -10.86 -10.865 -10.87 -10.875 -10.88 -10.885 -10.89 -10.895 -10.9 -10.905 -10.91 -10.915 -10.92 -10.925 -10.93 -10.935 -10.94 -10.945 -10.95 -10.955 -10.96 -10.965 -10.97 -10.975 -10.98 -10.985 -10.99 -10.995 -11 -11.005 -11.01 -11.015 -11.02 -11.025 -11.03 -11.035 -11.04 -11.045 -11.05 -11.055 -11.06 -11.065 -11.07 -11.075 -11.08 -11.085 -11.09 -11.095 -11.1 -11.105 -11.11 -11.115 -11.12 -11.125 -11.13 -11.135 -11.14 -11.145 -11.15 -11.155 -11.16 -11.165 -11.17 -11.175 -11.18 -11.185 -11.19 -11.195 -11.2 -11.205 -11.21 -11.215 -11.22 -11.225 -11.23 -11.235 -11.24 -11.245 -11.25 -11.255 -11.26 -11.265 -11.27 -11.275 -11.28 -11.285 -11.29 -11.295 -11.3 -11.305 -11.31 -11.315 -11.32 -11.325 -11.33 -11.335 -11.34 -11.345 -11.35 -11.355 -11.36 -11.365 -11.37 -11.375 -11.38 -11.385 -11.39 -11.395 -11.4 -11.405 -11.41 -11.415 -11.42 -11.425 -11.43 -11.435 -11.44 -11.445 -11.45 -11.455 -11.46 -11.465 -11.47 -11.475 -11.48 -11.485 -11.49 -11.495 -11.5 -11.505 -11.51 -11.515 -11.52 -11.525 -11.53 -11.535 -11.54 -11.545 -11.55 -11.555 -11.56 -11.565 -11.57 -11.575 -11.58 -11.585 -11.59 -11.595 -11.6 -11.605 -11.61 -11.615 -11.62 -11.625 -11.63 -11.635 -11.64 -11.645 -11.65 -11.655 -11.66 -11.665 -11.67 -11.675 -11.68 -11.685 -11.69 -11.695 -11.7 -11.705 -11.71 -11.715 -11.72 -11.725 -11.73 -11.735 -11.74 -11.745 -11.75 -11.755 -11.76 -11.765 -11.77 -11.775 -11.78 -11.785 -11.79 -11.795 -11.8 -11.805 -11.81 -11.815 -11.82 -11.825 -11.83 -11.835 -11.84 -11.845 -11.85 -11.855 -11.86 -11.865 -11.87 -11.875 -11.88 -11.885 -11.89 -11.895 -11.9 -11.905 -11.91 -11.915 -11.92 -11.925 -11.93 -11.935 -11.94 -11.945 -11.95 -11.955 -11.96 -11.965 -11.97 -11.975 -11.98 -11.985 -11.99 -11.995 -12 -12.005 -12.01 -12.015 -12.02 -12.025 -12.03 -12.035 -12.04 -12.045 -12.05 -12.055 -12.06 -12.065 -12.07 -12.075 -12.08 -12.085 -12.09 -12.095 -12.1 -12.105 -12.11 -12.115 -12.12 -12.125 -12.13 -12.135 -12.14 -12.145 -12.15 -12.155 -12.16 -12.165 -12.17 -12.175 -12.18 -12.185 -12.19 -12.195 -12.2 -12.205 -12.21 -12.215 -12.22 -12.225 -12.23 -12.235 -12.24 -12.245 -12.25 -12.255 -12.26 -12.265 -12.27 -12.275 -12.28 -12.285 -12.29 -12.295 -12.3 -12.305 -12.31 -12.315 -12.32 -12.325 -12.33 -12.335 -12.34 -12.345 -12.35 -12.355 -12.36 -12.365 -12.37 -12.375 -12.38 -12.385 -12.39 -12.395 -12.4 -12.405 -12.41 -12.415 -12.42 -12.425 -12.43 -12.435 -12.44 -12.445 -12.45 -12.455 -12.46 -12.465 -12.47 -12.475 -12.48 -12.485 -12.49 -12.495 -12.5 -12.505 -12.51 -12.515 -12.52 -12.525 -12.53 -12.535 -12.54 -12.545 -12.55 -12.555 -12.56 -12.565 -12.57 -12.575 -12.58 -12.585 -12.59 -12.595 -12.6 -12.605 -12.61 -12.615 -12.62 -12.625 -12.63 -12.635 -12.64 -12.645 -12.65 -12.655 -12.66 -12.665 -12.67 -12.675 -12.68 -12.685 -12.69 -12.695 -12.7 -12.705 -12.71 -12.715 -12.72 -12.725 -12.73 -12.735 -12.74 -12.745 -12.75 -12.755 -12.76 -12.765 -12.77 -12.775 -12.78 -12.785 -12.79 -12.795 -12.8 -12.805 -12.81 -12.815 -12.82 -12.825 -12.83 -12.835 -12.84 -12.845 -12.85 -12.855 -12.86 -12.865 -12.87 -12.875 -12.88 -12.885 -12.89 -12.895 -12.9 -12.905 -12.91 -12.915 -12.92 -12.925 -12.93 -12.935 -12.94 -12.945 -12.95 -12.955 -12.96 -12.965 -12.97 -12.975 -12.98 -12.985 -12.99 -12.995 -13 -13.005 -13.01 -13.015 -13.02 -13.025 -13.03 -13.035 -13.04 -13.045 -13.05 -13.055 -13.06 -13.065 -13.07 -13.075 -13.08 -13.085 -13.09 -13.095 -13.1 -13.105 -13.11 -13.115 -13.12 -13.125 -13.13 -13.135 -13.14 -13.145 -13.15 -13.155 -13.16 -13.165 -13.17 -13.175 -13.18 -13.185 -13.19 -13.195 -13.2 -13.205 -13.21 -13.215 -13.22 -13.225 -13.23 -13.235 -13.24 -13.245 -13.25 -13.255 -13.26 -13.265 -13.27 -13.275 -13.28 -13.285 -13.29 -13.295 -13.3 -13.305 -13.31 -13.315 -13.32 -13.325 -13.33 -13.335 -13.34 -13.345 -13.35 -13.355 -13.36 -13.365 -13.37 -13.375 -13.38 -13.385 -13.39 -13.395 -13.4 -13.405 -13.41 -13.415 -13.42 -13.425 -13.43 -13.435 -13.44 -13.445 -13.45 -13.455 -13.46 -13.465 -13.47 -13.475 -13.48 -13.485 -13.49 -13.495 -13.5 -13.505 -13.51 -13.515 -13.52 -13.525 -13.53 -13.535 -13.54 -13.545 -13.55 -13.555 -13.56 -13.565 -13.57 -13.575 -13.58 -13.585 -13.59 -13.595 -13.6 -13.605 -13.61 -13.615 -13.62 -13.625 -13.63 -13.635 -13.64 -13.645 -13.65 -13.655 -13.66 -13.665 -13.67 -13.675 -13.68 -13.685 -13.69 -13.695 -13.7 -13.705 -13.71 -13.715 -13.72 -13.725 -13.73 -13.735 -13.74 -13.745 -13.75 -13.755 -13.76 -13.765 -13.77 -13.775 -13.78 -13.785 -13.79 -13.795 -13.8 -13.805 -13.81 -13.815 -13.82 -13.825 -13.83 -13.835 -13.84 -13.845 -13.85 -13.855 -13.86 -13.865 -13.87 -13.875 -13.88 -13.885 -13.89 -13.895 -13.9 -13.905 -13.91 -13.915 -13.92 -13.925 -13.93 -13.935 -13.94 -13.945 -13.95 -13.955 -13.96 -13.965 -13.97 -13.975 -13.98 -13.985 -13.99 -13.995 -14 -14.005 -14.01 -14.015 -14.02 -14.025 -14.03 -14.035 -14.04 -14.045 -14.05 -14.055 -14.06 -14.065 -14.07 -14.075 -14.08 -14.085 -14.09 -14.095 -14.1 -14.105 -14.11 -14.115 -14.12 -14.125 -14.13 -14.135 -14.14 -14.145 -14.15 -14.155 -14.16 -14.165 -14.17 -14.175 -14.18 -14.185 -14.19 -14.195 -14.2 -14.205 -14.21 -14.215 -14.22 -14.225 -14.23 -14.235 -14.24 -14.245 -14.25 -14.255 -14.26 -14.265 -14.27 -14.275 -14.28 -14.285 -14.29 -14.295 -14.3 -14.305 -14.31 -14.315 -14.32 -14.325 -14.33 -14.335 -14.34 -14.345 -14.35 -14.355 -14.36 -14.365 -14.37 -14.375 -14.38 -14.385 -14.39 -14.395 -14.4 -14.405 -14.41 -14.415 -14.42 -14.425 -14.43 -14.435 -14.44 -14.445 -14.45 -14.455 -14.46 -14.465 -14.47 -14.475 -14.48 -14.485 -14.49 -14.495 -14.5 -14.505 -14.51 -14.515 -14.52 -14.525 -14.53 -14.535 -14.54 -14.545 -14.55 -14.555 -14.56 -14.565 -14.57 -14.575 -14.58 -14.585 -14.59 -14.595 -14.6 -14.605 -14.61 -14.615 -14.62 -14.625 -14.63 -14.635 -14.64 -14.645 -14.65 -14.655 -14.66 -14.665 -14.67 -14.675 -14.68 -14.685 -14.69 -14.695 -14.7 -14.705 -14.71 -14.715 -14.72 -14.725 -14.73 -14.735 -14.74 -14.745 -14.75 -14.755 -14.76 -14.765 -14.77 -14.775 -14.78 -14.785 -14.79 -14.795 -14.8 -14.805 -14.81 -14.815 -14.82 -14.825 -14.83 -14.835 -14.84 -14.845 -14.85 -14.855 -14.86 -14.865 -14.87 -14.875 -14.88 -14.885 -14.89 -14.895 -14.9 -14.905 -14.91 -14.915 -14.92 -14.925 -14.93 -14.935 -14.94 -14.945 -14.95 -14.955 -14.96 -14.965 -14.97 -14.975 -14.98 -14.985 -14.99 -14.995 -15 -15.005 -15.01 -15.015 -15.02 -15.025 -15.03 -15.035 -15.04 -15.045 -15.05 -15.055 -15.06 -15.065 -15.07 -15.075 -15.08 -15.085 -15.09 -15.095 -15.1 -15.105 -15.11 -15.115 -15.12 -15.125 -15.13 -15.135 -15.14 -15.145 -15.15 -15.155 -15.16 -15.165 -15.17 -15.175 -15.18 -15.185 -15.19 -15.195 -15.2 -15.205 -15.21 -15.215 -15.22 -15.225 -15.23 -15.235 -15.24 -15.245 -15.25 -15.255 -15.26 -15.265 -15.27 -15.275 -15.28 -15.285 -15.29 -15.295 -15.3 -15.305 -15.31 -15.315 -15.32 -15.325 -15.33 -15.335 -15.34 -15.345 -15.35 -15.355 -15.36 -15.365 -15.37 -15.375 -15.38 -15.385 -15.39 -15.395 -15.4 -15.405 -15.41 -15.415 -15.42 -15.425 -15.43 -15.435 -15.44 -15.445 -15.45 -15.455 -15.46 -15.465 -15.47 -15.475 -15.48 -15.485 -15.49 -15.495 -15.5 -15.505 -15.51 -15.515 -15.52 -15.525 -15.53 -15.535 -15.54 -15.545 -15.55 -15.555 -15.56 -15.565 -15.57 -15.575 -15.58 -15.585 -15.59 -15.595 -15.6 -15.605 -15.61 -15.615 -15.62 -15.625 -15.63 -15.635 -15.64 -15.645 -15.65 -15.655 -15.66 -15.665 -15.67 -15.675 -15.68 -15.685 -15.69 -15.695 -15.7 -15.705 -15.71 -15.715 -15.72 -15.725 -15.73 -15.735 -15.74 -15.745 -15.75 -15.755 -15.76 -15.765 -15.77 -15.775 -15.78 -15.785 -15.79 -15.795 -15.8 -15.805 -15.81 -15.815 -15.82 -15.825 -15.83 -15.835 -15.84 -15.845 -15.85 -15.855 -15.86 -15.865 -15.87 -15.875 -15.88 -15.885 -15.89 -15.895 -15.9 -15.905 -15.91 -15.915 -15.92 -15.925 -15.93 -15.935 -15.94 -15.945 -15.95 -15.955 -15.96 -15.965 -15.97 -15.975 -15.98 -15.985 -15.99 -15.995 -16 -16.005 -16.01 -16.015 -16.02 -16.025 -16.03 -16.035 -16.04 -16.045 -16.05 -16.055 -16.06 -16.065 -16.07 -16.075 -16.08 -16.085 -16.09 -16.095 -16.1 -16.105 -16.11 -16.115 -16.12 -16.125 -16.13 -16.135 -16.14 -16.145 -16.15 -16.155 -16.16 -16.165 -16.17 -16.175 -16.18 -16.185 -16.19 -16.195 -16.2 -16.205 -16.21 -16.215 -16.22 -16.225 -16.23 -16.235 -16.24 -16.245 -16.25 -16.255 -16.26 -16.265 -16.27 -16.275 -16.28 -16.285 -16.29 -16.295 -16.3 -16.305 -16.31 -16.315 -16.32 -16.325 -16.33 -16.335 -16.34 -16.345 -16.35 -16.355 -16.36 -16.365 -16.37 -16.375 -16.38 -16.385 -16.39 -16.395 -16.4 -16.405 -16.41 -16.415 -16.42 -16.425 -16.43 -16.435 -16.44 -16.445 -16.45 -16.455 -16.46 -16.465 -16.47 -16.475 -16.48 -16.485 -16.49 -16.495 -16.5 -16.505 -16.51 -16.515 -16.52 -16.525 -16.53 -16.535 -16.54 -16.545 -16.55 -16.555 -16.56 -16.565 -16.57 -16.575 -16.58 -16.585 -16.59 -16.595 -16.6 -16.605 -16.61 -16.615 -16.62 -16.625 -16.63 -16.635 -16.64 -16.645 -16.65 -16.655 -16.66 -16.665 -16.67 -16.675 -16.68 -16.685 -16.69 -16.695 -16.7 -16.705 -16.71 -16.715 -16.72 -16.725 -16.73 -16.735 -16.74 -16.745 -16.75 -16.755 -16.76 -16.765 -16.77 -16.775 -16.78 -16.785 -16.79 -16.795 -16.8 -16.805 -16.81 -16.815 -16.82 -16.825 -16.83 -16.835 -16.84 -16.845 -16.85 -16.855 -16.86 -16.865 -16.87 -16.875 -16.88 -16.885 -16.89 -16.895 -16.9 -16.905 -16.91 -16.915 -16.92 -16.925 -16.93 -16.935 -16.94 -16.945 -16.95 -16.955 -16.96 -16.965 -16.97 -16.975 -16.98 -16.985 -16.99 -16.995 -17 -17.005 -17.01 -17.015 -17.02 -17.025 -17.03 -17.035 -17.04 -17.045 -17.05 -17.055 -17.06 -17.065 -17.07 -17.075 -17.08 -17.085 -17.09 -17.095 -17.1 -17.105 -17.11 -17.115 -17.12 -17.125 -17.13 -17.135 -17.14 -17.145 -17.15 -17.155 -17.16 -17.165 -17.17 -17.175 -17.18 -17.185 -17.19 -17.195 -17.2 -17.205 -17.21 -17.215 -17.22 -17.225 -17.23 -17.235 -17.24 -17.245 -17.25 -17.255 -17.26 -17.265 -17.27 -17.275 -17.28 -17.285 -17.29 -17.295 -17.3 -17.305 -17.31 -17.315 -17.32 -17.325 -17.33 -17.335 -17.34 -17.345 -17.35 -17.355 -17.36 -17.365 -17.37 -17.375 -17.38 -17.385 -17.39 -17.395 -17.4 -17.405 -17.41 -17.415 -17.42 -17.425 -17.43 -17.435 -17.44 -17.445 -17.45 -17.455 -17.46 -17.465 -17.47 -17.475 -17.48 -17.485 -17.49 -17.495 -17.5 -17.505 -17.51 -17.515 -17.52 -17.525 -17.53 -17.535 -17.54 -17.545 -17.55 -17.555 -17.56 -17.565 -17.57 -17.575 -17.58 -17.585 -17.59 -17.595 -17.6 -17.605 -17.61 -17.615 -17.62 -17.625 -17.63 -17.635 -17.64 -17.645 -17.65 -17.655 -17.66 -17.665 -17.67 -17.675 -17.68 -17.685 -17.69 -17.695 -17.7 -17.705 -17.71 -17.715 -17.72 -17.725 -17.73 -17.735 -17.74 -17.745 -17.75 -17.755 -17.76 -17.765 -17.77 -17.775 -17.78 -17.785 -17.79 -17.795 -17.8 -17.805 -17.81 -17.815 -17.82 -17.825 -17.83 -17.835 -17.84 -17.845 -17.85 -17.855 -17.86 -17.865 -17.87 -17.875 -17.88 -17.885 -17.89 -17.895 -17.9 -17.905 -17.91 -17.915 -17.92 -17.925 -17.93 -17.935 -17.94 -17.945 -17.95 -17.955 -17.96 -17.965 -17.97 -17.975 -17.98 -17.985 -17.99 -17.995 -18 -18.005 -18.01 -18.015 -18.02 -18.025 -18.03 -18.035 -18.04 -18.045 -18.05 -18.055 -18.06 -18.065 -18.07 -18.075 -18.08 -18.085 -18.09 -18.095 -18.1 -18.105 -18.11 -18.115 -18.12 -18.125 -18.13 -18.135 -18.14 -18.145 -18.15 -18.155 -18.16 -18.165 -18.17 -18.175 -18.18 -18.185 -18.19 -18.195 -18.2 -18.205 -18.21 -18.215 -18.22 -18.225 -18.23 -18.235 -18.24 -18.245 -18.25 -18.255 -18.26 -18.265 -18.27 -18.275 -18.28 -18.285 -18.29 -18.295 -18.3 -18.305 -18.31 -18.315 -18.32 -18.325 -18.33 -18.335 -18.34 -18.345 -18.35 -18.355 -18.36 -18.365 -18.37 -18.375 -18.38 -18.385 -18.39 -18.395 -18.4 -18.405 -18.41 -18.415 -18.42 -18.425 -18.43 -18.435 -18.44 -18.445 -18.45 -18.455 -18.46 -18.465 -18.47 -18.475 -18.48 -18.485 -18.49 -18.495 -18.5 -18.505 -18.51 -18.515 -18.52 -18.525 -18.53 -18.535 -18.54 -18.545 -18.55 -18.555 -18.56 -18.565 -18.57 -18.575 -18.58 -18.585 -18.59 -18.595 -18.6 -18.605 -18.61 -18.615 -18.62 -18.625 -18.63 -18.635 -18.64 -18.645 -18.65 -18.655 -18.66 -18.665 -18.67 -18.675 -18.68 -18.685 -18.69 -18.695 -18.7 -18.705 -18.71 -18.715 -18.72 -18.725 -18.73 -18.735 -18.74 -18.745 -18.75 -18.755 -18.76 -18.765 -18.77 -18.775 -18.78 -18.785 -18.79 -18.795 -18.8 -18.805 -18.81 -18.815 -18.82 -18.825 -18.83 -18.835 -18.84 -18.845 -18.85 -18.855 -18.86 -18.865 -18.87 -18.875 -18.88 -18.885 -18.89 -18.895 -18.9 -18.905 -18.91 -18.915 -18.92 -18.925 -18.93 -18.935 -18.94 -18.945 -18.95 -18.955 -18.96 -18.965 -18.97 -18.975 -18.98 -18.985 -18.99 -18.995 -19 -19.005 -19.01 -19.015 -19.02 -19.025 -19.03 -19.035 -19.04 -19.045 -19.05 -19.055 -19.06 -19.065 -19.07 -19.075 -19.08 -19.085 -19.09 -19.095 -19.1 -19.105 -19.11 -19.115 -19.12 -19.125 -19.13 -19.135 -19.14 -19.145 -19.15 -19.155 -19.16 -19.165 -19.17 -19.175 -19.18 -19.185 -19.19 -19.195 -19.2 -19.205 -19.21 -19.215 -19.22 -19.225 -19.23 -19.235 -19.24 -19.245 -19.25 -19.255 -19.26 -19.265 -19.27 -19.275 -19.28 -19.285 -19.29 -19.295 -19.3 -19.305 -19.31 -19.315 -19.32 -19.325 -19.33 -19.335 -19.34 -19.345 -19.35 -19.355 -19.36 -19.365 -19.37 -19.375 -19.38 -19.385 -19.39 -19.395 -19.4 -19.405 -19.41 -19.415 -19.42 -19.425 -19.43 -19.435 -19.44 -19.445 -19.45 -19.455 -19.46 -19.465 -19.47 -19.475 -19.48 -19.485 -19.49 -19.495 -19.5 -19.505 -19.51 -19.515 -19.52 -19.525 -19.53 -19.535 -19.54 -19.545 -19.55 -19.555 -19.56 -19.565 -19.57 -19.575 -19.58 -19.585 -19.59 -19.595 -19.6 -19.605 -19.61 -19.615 -19.62 -19.625 -19.63 -19.635 -19.64 -19.645 -19.65 -19.655 -19.66 -19.665 -19.67 -19.675 -19.68 -19.685 -19.69 -19.695 -19.7 -19.705 -19.71 -19.715 -19.72 -19.725 -19.73 -19.735 -19.74 -19.745 -19.75 -19.755 -19.76 -19.765 -19.77 -19.775 -19.78 -19.785 -19.79 -19.795 -19.8 -19.805 -19.81 -19.815 -19.82 -19.825 -19.83 -19.835 -19.84 -19.845 -19.85 -19.855 -19.86 -19.865 -19.87 -19.875 -19.88 -19.885 -19.89 -19.895 -19.9 -19.905 -19.91 -19.915 -19.92 -19.925 -19.93 -19.935 -19.94 -19.945 -19.95 -19.955 -19.96 -19.965 -19.97 -19.975 -19.98 -19.985 -19.99 -19.995 -20 -20.005 -20.01 -20.015 -20.02 -20.025 -20.03 -20.035 -20.04 -20.045 -20.05 -20.055 -20.06 -20.065 -20.07 -20.075 -20.08 -20.085 -20.09 -20.095 -20.1 -20.105 -20.11 -20.115 -20.12 -20.125 -20.13 -20.135 -20.14 -20.145 -20.15 -20.155 -20.16 -20.165 -20.17 -20.175 -20.18 -20.185 -20.19 -20.195 -20.2 -20.205 -20.21 -20.215 -20.22 -20.225 -20.23 -20.235 -20.24 -20.245 -20.25 -20.255 -20.26 -20.265 -20.27 -20.275 -20.28 -20.285 -20.29 -20.295 -20.3 -20.305 -20.31 -20.315 -20.32 -20.325 -20.33 -20.335 -20.34 -20.345 -20.35 -20.355 -20.36 -20.365 -20.37 -20.375 -20.38 -20.385 -20.39 -20.395 -20.4 -20.405 -20.41 -20.415 -20.42 -20.425 -20.43 -20.435 -20.44 -20.445 -20.45 -20.455 -20.46 -20.465 -20.47 -20.475 -20.48 -20.485 -20.49 -20.495 -20.5 -20.505 -20.51 -20.515 -20.52 -20.525 -20.53 -20.535 -20.54 -20.545 -20.55 -20.555 -20.56 -20.565 -20.57 -20.575 -20.58 -20.585 -20.59 -20.595 -20.6 -20.605 -20.61 -20.615 -20.62 -20.625 -20.63 -20.635 -20.64 -20.645 -20.65 -20.655 -20.66 -20.665 -20.67 -20.675 -20.68 -20.685 -20.69 -20.695 -20.7 -20.705 -20.71 -20.715 -20.72 -20.725 -20.73 -20.735 -20.74 -20.745 -20.75 -20.755 -20.76 -20.765 -20.77 -20.775 -20.78 -20.785 -20.79 -20.795 -20.8 -20.805 -20.81 -20.815 -20.82 -20.825 -20.83 -20.835 -20.84 -20.845 -20.85 -20.855 -20.86 -20.865 -20.87 -20.875 -20.88 -20.885 -20.89 -20.895 -20.9 -20.905 -20.91 -20.915 -20.92 -20.925 -20.93 -20.935 -20.94 -20.945 -20.95 -20.955 -20.96 -20.965 -20.97 -20.975 -20.98 -20.985 -20.99 -20.995 -21 -21.005 -21.01 -21.015 -21.02 -21.025 -21.03 -21.035 -21.04 -21.045 -21.05 -21.055 -21.06 -21.065 -21.07 -21.075 -21.08 -21.085 -21.09 -21.095 -21.1 -21.105 -21.11 -21.115 -21.12 -21.125 -21.13 -21.135 -21.14 -21.145 -21.15 -21.155 -21.16 -21.165 -21.17 -21.175 -21.18 -21.185 -21.19 -21.195 -21.2 -21.205 -21.21 -21.215 -21.22 -21.225 -21.23 -21.235 -21.24 -21.245 -21.25 -21.255 -21.26 -21.265 -21.27 -21.275 -21.28 -21.285 -21.29 -21.295 -21.3 -21.305 -21.31 -21.315 -21.32 -21.325 -21.33 -21.335 -21.34 -21.345 -21.35 -21.355 -21.36 -21.365 -21.37 -21.375 -21.38 -21.385 -21.39 -21.395 -21.4 -21.405 -21.41 -21.415 -21.42 -21.425 -21.43 -21.435 -21.44 -21.445 -21.45 -21.455 -21.46 -21.465 -21.47 -21.475 -21.48 -21.485 -21.49 -21.495 -21.5 -21.505 -21.51 -21.515 -21.52 -21.525 -21.53 -21.535 -21.54 -21.545 -21.55 -21.555 -21.56 -21.565 -21.57 -21.575 -21.58 -21.585 -21.59 -21.595 -21.6 -21.605 -21.61 -21.615 -21.62 -21.625 -21.63 -21.635 -21.64 -21.645 -21.65 -21.655 -21.66 -21.665 -21.67 -21.675 -21.68 -21.685 -21.69 -21.695 -21.7 -21.705 -21.71 -21.715 -21.72 -21.725 -21.73 -21.735 -21.74 -21.745 -21.75 -21.755 -21.76 -21.765 -21.77 -21.775 -21.78 -21.785 -21.79 -21.795 -21.8 -21.805 -21.81 -21.815 -21.82 -21.825 -21.83 -21.835 -21.84 -21.845 -21.85 -21.855 -21.86 -21.865 -21.87 -21.875 -21.88 -21.885 -21.89 -21.895 -21.9 -21.905 -21.91 -21.915 -21.92 -21.925 -21.93 -21.935 -21.94 -21.945 -21.95 -21.955 -21.96 -21.965 -21.97 -21.975 -21.98 -21.985 -21.99 -21.995 -22 -22.005 -22.01 -22.015 -22.02 -22.025 -22.03 -22.035 -22.04 -22.045 -22.05 -22.055 -22.06 -22.065 -22.07 -22.075 -22.08 -22.085 -22.09 -22.095 -22.1 -22.105 -22.11 -22.115 -22.12 -22.125 -22.13 -22.135 -22.14 -22.145 -22.15 -22.155 -22.16 -22.165 -22.17 -22.175 -22.18 -22.185 -22.19 -22.195 -22.2 -22.205 -22.21 -22.215 -22.22 -22.225 -22.23 -22.235 -22.24 -22.245 -22.25 -22.255 -22.26 -22.265 -22.27 -22.275 -22.28 -22.285 -22.29 -22.295 -22.3 -22.305 -22.31 -22.315 -22.32 -22.325 -22.33 -22.335 -22.34 -22.345 -22.35 -22.355 -22.36 -22.365 -22.37 -22.375 -22.38 -22.385 -22.39 -22.395 -22.4 -22.405 -22.41 -22.415 -22.42 -22.425 -22.43 -22.435 -22.44 -22.445 -22.45 -22.455 -22.46 -22.465 -22.47 -22.475 -22.48 -22.485 -22.49 -22.495 -22.5 -22.505 -22.51 -22.515 -22.52 -22.525 -22.53 -22.535 -22.54 -22.545 -22.55 -22.555 -22.56 -22.565 -22.57 -22.575 -22.58 -22.585 -22.59 -22.595 -22.6 -22.605 -22.61 -22.615 -22.62 -22.625 -22.63 -22.635 -22.64 -22.645 -22.65 -22.655 -22.66 -22.665 -22.67 -22.675 -22.68 -22.685 -22.69 -22.695 -22.7 -22.705 -22.71 -22.715 -22.72 -22.725 -22.73 -22.735 -22.74 -22.745 -22.75 -22.755 -22.76 -22.765 -22.77 -22.775 -22.78 -22.785 -22.79 -22.795 -22.8 -22.805 -22.81 -22.815 -22.82 -22.825 -22.83 -22.835 -22.84 -22.845 -22.85 -22.855 -22.86 -22.865 -22.87 -22.875 -22.88 -22.885 -22.89 -22.895 -22.9 -22.905 -22.91 -22.915 -22.92 -22.925 -22.93 -22.935 -22.94 -22.945 -22.95 -22.955 -22.96 -22.965 -22.97 -22.975 -22.98 -22.985 -22.99 -22.995 -23 -23.005 -23.01 -23.015 -23.02 -23.025 -23.03 -23.035 -23.04 -23.045 -23.05 -23.055 -23.06 -23.065 -23.07 -23.075 -23.08 -23.085 -23.09 -23.095 -23.1 -23.105 -23.11 -23.115 -23.12 -23.125 -23.13 -23.135 -23.14 -23.145 -23.15 -23.155 -23.16 -23.165 -23.17 -23.175 -23.18 -23.185 -23.19 -23.195 -23.2 -23.205 -23.21 -23.215 -23.22 -23.225 -23.23 -23.235 -23.24 -23.245 -23.25 -23.255 -23.26 -23.265 -23.27 -23.275 -23.28 -23.285 -23.29 -23.295 -23.3 -23.305 -23.31 -23.315 -23.32 -23.325 -23.33 -23.335 -23.34 -23.345 -23.35 -23.355 -23.36 -23.365 -23.37 -23.375 -23.38 -23.385 -23.39 -23.395 -23.4 -23.405 -23.41 -23.415 -23.42 -23.425 -23.43 -23.435 -23.44 -23.445 -23.45 -23.455 -23.46 -23.465 -23.47 -23.475 -23.48 -23.485 -23.49 -23.495 -23.5 -23.505 -23.51 -23.515 -23.52 -23.525 -23.53 -23.535 -23.54 -23.545 -23.55 -23.555 -23.56 -23.565 -23.57 -23.575 -23.58 -23.585 -23.59 -23.595 -23.6 -23.605 -23.61 -23.615 -23.62 -23.625 -23.63 -23.635 -23.64 -23.645 -23.65 -23.655 -23.66 -23.665 -23.67 -23.675 -23.68 -23.685 -23.69 -23.695 -23.7 -23.705 -23.71 -23.715 -23.72 -23.725 -23.73 -23.735 -23.74 -23.745 -23.75 -23.755 -23.76 -23.765 -23.77 -23.775 -23.78 -23.785 -23.79 -23.795 -23.8 -23.805 -23.81 -23.815 -23.82 -23.825 -23.83 -23.835 -23.84 -23.845 -23.85 -23.855 -23.86 -23.865 -23.87 -23.875 -23.88 -23.885 -23.89 -23.895 -23.9 -23.905 -23.91 -23.915 -23.92 -23.925 -23.93 -23.935 -23.94 -23.945 -23.95 -23.955 -23.96 -23.965 -23.97 -23.975 -23.98 -23.985 -23.99 -23.995 -24 -24.005 -24.01 -24.015 -24.02 -24.025 -24.03 -24.035 -24.04 -24.045 -24.05 -24.055 -24.06 -24.065 -24.07 -24.075 -24.08 -24.085 -24.09 -24.095 -24.1 -24.105 -24.11 -24.115 -24.12 -24.125 -24.13 -24.135 -24.14 -24.145 -24.15 -24.155 -24.16 -24.165 -24.17 -24.175 -24.18 -24.185 -24.19 -24.195 -24.2 -24.205 -24.21 -24.215 -24.22 -24.225 -24.23 -24.235 -24.24 -24.245 -24.25 -24.255 -24.26 -24.265 -24.27 -24.275 -24.28 -24.285 -24.29 -24.295 -24.3 -24.305 -24.31 -24.315 -24.32 -24.325 -24.33 -24.335 -24.34 -24.345 -24.35 -24.355 -24.36 -24.365 -24.37 -24.375 -24.38 -24.385 -24.39 -24.395 -24.4 -24.405 -24.41 -24.415 -24.42 -24.425 -24.43 -24.435 -24.44 -24.445 -24.45 -24.455 -24.46 -24.465 -24.47 -24.475 -24.48 -24.485 -24.49 -24.495 -24.5 -24.505 -24.51 -24.515 -24.52 -24.525 -24.53 -24.535 -24.54 -24.545 -24.55 -24.555 -24.56 -24.565 -24.57 -24.575 -24.58 -24.585 -24.59 -24.595 -24.6 -24.605 -24.61 -24.615 -24.62 -24.625 -24.63 -24.635 -24.64 -24.645 -24.65 -24.655 -24.66 -24.665 -24.67 -24.675 -24.68 -24.685 -24.69 -24.695 -24.7 -24.705 -24.71 -24.715 -24.72 -24.725 -24.73 -24.735 -24.74 -24.745 -24.75 -24.755 -24.76 -24.765 -24.77 -24.775 -24.78 -24.785 -24.79 -24.795 -24.8 -24.805 -24.81 -24.815 -24.82 -24.825 -24.83 -24.835 -24.84 -24.845 -24.85 -24.855 -24.86 -24.865 -24.87 -24.875 -24.88 -24.885 -24.89 -24.895 -24.9 -24.905 -24.91 -24.915 -24.92 -24.925 -24.93 -24.935 -24.94 -24.945 -24.95 -24.955 -24.96 -24.965 -24.97 -24.975 -24.98 -24.985 -24.99 -24.995 -25 -25.005 -25.01 -25.015 -25.02 -25.025 -25.03 -25.035 -25.04 -25.045 -25.05 -25.055 -25.06 -25.065 -25.07 -25.075 -25.08 -25.085 -25.09 -25.095 -25.1 -25.105 -25.11 -25.115 -25.12 -25.125 -25.13 -25.135 -25.14 -25.145 -25.15 -25.155 -25.16 -25.165 -25.17 -25.175 -25.18 -25.185 -25.19 -25.195 -25.2 -25.205 -25.21 -25.215 -25.22 -25.225 -25.23 -25.235 -25.24 -25.245 -25.25 -25.255 -25.26 -25.265 -25.27 -25.275 -25.28 -25.285 -25.29 -25.295 -25.3 -25.305 -25.31 -25.315 -25.32 -25.325 -25.33 -25.335 -25.34 -25.345 -25.35 -25.355 -25.36 -25.365 -25.37 -25.375 -25.38 -25.385 -25.39 -25.395 -25.4 -25.405 -25.41 -25.415 -25.42 -25.425 -25.43 -25.435 -25.44 -25.445 -25.45 -25.455 -25.46 -25.465 -25.47 -25.475 -25.48 -25.485 -25.49 -25.495 -25.5 -25.505 -25.51 -25.515 -25.52 -25.525 -25.53 -25.535 -25.54 -25.545 -25.55 -25.555 -25.56 -25.565 -25.57 -25.575 -25.58 -25.585 -25.59 -25.595 -25.6 -25.605 -25.61 -25.615 -25.62 -25.625 -25.63 -25.635 -25.64 -25.645 -25.65 -25.655 -25.66 -25.665 -25.67 -25.675 -25.68 -25.685 -25.69 -25.695 -25.7 -25.705 -25.71 -25.715 -25.72 -25.725 -25.73 -25.735 -25.74 -25.745 -25.75 -25.755 -25.76 -25.765 -25.77 -25.775 -25.78 -25.785 -25.79 -25.795 -25.8 -25.805 -25.81 -25.815 -25.82 -25.825 -25.83 -25.835 -25.84 -25.845 -25.85 -25.855 -25.86 -25.865 -25.87 -25.875 -25.88 -25.885 -25.89 -25.895 -25.9 -25.905 -25.91 -25.915 -25.92 -25.925 -25.93 -25.935 -25.94 -25.945 -25.95 -25.955 -25.96 -25.965 -25.97 -25.975 -25.98 -25.985 -25.99 -25.995 -26 -26.005 -26.01 -26.015 -26.02 -26.025 -26.03 -26.035 -26.04 -26.045 -26.05 -26.055 -26.06 -26.065 -26.07 -26.075 -26.08 -26.085 -26.09 -26.095 -26.1 -26.105 -26.11 -26.115 -26.12 -26.125 -26.13 -26.135 -26.14 -26.145 -26.15 -26.155 -26.16 -26.165 -26.17 -26.175 -26.18 -26.185 -26.19 -26.195 -26.2 -26.205 -26.21 -26.215 -26.22 -26.225 -26.23 -26.235 -26.24 -26.245 -26.25 -26.255 -26.26 -26.265 -26.27 -26.275 -26.28 -26.285 -26.29 -26.295 -26.3 -26.305 -26.31 -26.315 -26.32 -26.325 -26.33 -26.335 -26.34 -26.345 -26.35 -26.355 -26.36 -26.365 -26.37 -26.375 -26.38 -26.385 -26.39 -26.395 -26.4 -26.405 -26.41 -26.415 -26.42 -26.425 -26.43 -26.435 -26.44 -26.445 -26.45 -26.455 -26.46 -26.465 -26.47 -26.475 -26.48 -26.485 -26.49 -26.495 -26.5 -26.505 -26.51 -26.515 -26.52 -26.525 -26.53 -26.535 -26.54 -26.545 -26.55 -26.555 -26.56 -26.565 -26.57 -26.575 -26.58 -26.585 -26.59 -26.595 -26.6 -26.605 -26.61 -26.615 -26.62 -26.625 -26.63 -26.635 -26.64 -26.645 -26.65 -26.655 -26.66 -26.665 -26.67 -26.675 -26.68 -26.685 -26.69 -26.695 -26.7 -26.705 -26.71 -26.715 -26.72 -26.725 -26.73 -26.735 -26.74 -26.745 -26.75 -26.755 -26.76 -26.765 -26.77 -26.775 -26.78 -26.785 -26.79 -26.795 -26.8 -26.805 -26.81 -26.815 -26.82 -26.825 -26.83 -26.835 -26.84 -26.845 -26.85 -26.855 -26.86 -26.865 -26.87 -26.875 -26.88 -26.885 -26.89 -26.895 -26.9 -26.905 -26.91 -26.915 -26.92 -26.925 -26.93 -26.935 -26.94 -26.945 -26.95 -26.955 -26.96 -26.965 -26.97 -26.975 -26.98 -26.985 -26.99 -26.995 -27 -27.005 -27.01 -27.015 -27.02 -27.025 -27.03 -27.035 -27.04 -27.045 -27.05 -27.055 -27.06 -27.065 -27.07 -27.075 -27.08 -27.085 -27.09 -27.095 -27.1 -27.105 -27.11 -27.115 -27.12 -27.125 -27.13 -27.135 -27.14 -27.145 -27.15 -27.155 -27.16 -27.165 -27.17 -27.175 -27.18 -27.185 -27.19 -27.195 -27.2 -27.205 -27.21 -27.215 -27.22 -27.225 -27.23 -27.235 -27.24 -27.245 -27.25 -27.255 -27.26 -27.265 -27.27 -27.275 -27.28 -27.285 -27.29 -27.295 -27.3 -27.305 -27.31 -27.315 -27.32 -27.325 -27.33 -27.335 -27.34 -27.345 -27.35 -27.355 -27.36 -27.365 -27.37 -27.375 -27.38 -27.385 -27.39 -27.395 -27.4 -27.405 -27.41 -27.415 -27.42 -27.425 -27.43 -27.435 -27.44 -27.445 -27.45 -27.455 -27.46 -27.465 -27.47 -27.475 -27.48 -27.485 -27.49 -27.495 -27.5 -27.505 -27.51 -27.515 -27.52 -27.525 -27.53 -27.535 -27.54 -27.545 -27.55 -27.555 -27.56 -27.565 -27.57 -27.575 -27.58 -27.585 -27.59 -27.595 -27.6 -27.605 -27.61 -27.615 -27.62 -27.625 -27.63 -27.635 -27.64 -27.645 -27.65 -27.655 -27.66 -27.665 -27.67 -27.675 -27.68 -27.685 -27.69 -27.695 -27.7 -27.705 -27.71 -27.715 -27.72 -27.725 -27.73 -27.735 -27.74 -27.745 -27.75 -27.755 -27.76 -27.765 -27.77 -27.775 -27.78 -27.785 -27.79 -27.795 -27.8 -27.805 -27.81 -27.815 -27.82 -27.825 -27.83 -27.835 -27.84 -27.845 -27.85 -27.855 -27.86 -27.865 -27.87 -27.875 -27.88 -27.885 -27.89 -27.895 -27.9 -27.905 -27.91 -27.915 -27.92 -27.925 -27.93 -27.935 -27.94 -27.945 -27.95 -27.955 -27.96 -27.965 -27.97 -27.975 -27.98 -27.985 -27.99 -27.995 -28 -28.005 -28.01 -28.015 -28.02 -28.025 -28.03 -28.035 -28.04 -28.045 -28.05 -28.055 -28.06 -28.065 -28.07 -28.075 -28.08 -28.085 -28.09 -28.095 -28.1 -28.105 -28.11 -28.115 -28.12 -28.125 -28.13 -28.135 -28.14 -28.145 -28.15 -28.155 -28.16 -28.165 -28.17 -28.175 -28.18 -28.185 -28.19 -28.195 -28.2 -28.205 -28.21 -28.215 -28.22 -28.225 -28.23 -28.235 -28.24 -28.245 -28.25 -28.255 -28.26 -28.265 -28.27 -28.275 -28.28 -28.285 -28.29 -28.295 -28.3 -28.305 -28.31 -28.315 -28.32 -28.325 -28.33 -28.335 -28.34 -28.345 -28.35 -28.355 -28.36 -28.365 -28.37 -28.375 -28.38 -28.385 -28.39 -28.395 -28.4 -28.405 -28.41 -28.415 -28.42 -28.425 -28.43 -28.435 -28.44 -28.445 -28.45 -28.455 -28.46 -28.465 -28.47 -28.475 -28.48 -28.485 -28.49 -28.495 -28.5 -28.505 -28.51 -28.515 -28.52 -28.525 -28.53 -28.535 -28.54 -28.545 -28.55 -28.555 -28.56 -28.565 -28.57 -28.575 -28.58 -28.585 -28.59 -28.595 -28.6 -28.605 -28.61 -28.615 -28.62 -28.625 -28.63 -28.635 -28.64 -28.645 -28.65 -28.655 -28.66 -28.665 -28.67 -28.675 -28.68 -28.685 -28.69 -28.695 -28.7 -28.705 -28.71 -28.715 -28.72 -28.725 -28.73 -28.735 -28.74 -28.745 -28.75 -28.755 -28.76 -28.765 -28.77 -28.775 -28.78 -28.785 -28.79 -28.795 -28.8 -28.805 -28.81 -28.815 -28.82 -28.825 -28.83 -28.835 -28.84 -28.845 -28.85 -28.855 -28.86 -28.865 -28.87 -28.875 -28.88 -28.885 -28.89 -28.895 -28.9 -28.905 -28.91 -28.915 -28.92 -28.925 -28.93 -28.935 -28.94 -28.945 -28.95 -28.955 -28.96 -28.965 -28.97 -28.975 -28.98 -28.985 -28.99 -28.995 -29 -29.005 -29.01 -29.015 -29.02 -29.025 -29.03 -29.035 -29.04 -29.045 -29.05 -29.055 -29.06 -29.065 -29.07 -29.075 -29.08 -29.085 -29.09 -29.095 -29.1 -29.105 -29.11 -29.115 -29.12 -29.125 -29.13 -29.135 -29.14 -29.145 -29.15 -29.155 -29.16 -29.165 -29.17 -29.175 -29.18 -29.185 -29.19 -29.195 -29.2 -29.205 -29.21 -29.215 -29.22 -29.225 -29.23 -29.235 -29.24 -29.245 -29.25 -29.255 -29.26 -29.265 -29.27 -29.275 -29.28 -29.285 -29.29 -29.295 -29.3 -29.305 -29.31 -29.315 -29.32 -29.325 -29.33 -29.335 -29.34 -29.345 -29.35 -29.355 -29.36 -29.365 -29.37 -29.375 -29.38 -29.385 -29.39 -29.395 -29.4 -29.405 -29.41 -29.415 -29.42 -29.425 -29.43 -29.435 -29.44 -29.445 -29.45 -29.455 -29.46 -29.465 -29.47 -29.475 -29.48 -29.485 -29.49 -29.495 -29.5 -29.505 -29.51 -29.515 -29.52 -29.525 -29.53 -29.535 -29.54 -29.545 -29.55 -29.555 -29.56 -29.565 -29.57 -29.575 -29.58 -29.585 -29.59 -29.595 -29.6 -29.605 -29.61 -29.615 -29.62 -29.625 -29.63 -29.635 -29.64 -29.645 -29.65 -29.655 -29.66 -29.665 -29.67 -29.675 -29.68 -29.685 -29.69 -29.695 -29.7 -29.705 -29.71 -29.715 -29.72 -29.725 -29.73 -29.735 -29.74 -29.745 -29.75 -29.755 -29.76 -29.765 -29.77 -29.775 -29.78 -29.785 -29.79 -29.795 -29.8 -29.805 -29.81 -29.815 -29.82 -29.825 -29.83 -29.835 -29.84 -29.845 -29.85 -29.855 -29.86 -29.865 -29.87 -29.875 -29.88 -29.885 -29.89 -29.895 -29.9 -29.905 -29.91 -29.915 -29.92 -29.925 -29.93 -29.935 -29.94 -29.945 -29.95 -29.955 -29.96 -29.965 -29.97 -29.975 -29.98 -29.985 -29.99 -29.995 -30 -30.005 -30.01 -30.015 -30.02 -30.025 -30.03 -30.035 -30.04 -30.045 -30.05 -30.055 -30.06 -30.065 -30.07 -30.075 -30.08 -30.085 -30.09 -30.095 -30.1 -30.105 -30.11 -30.115 -30.12 -30.125 -30.13 -30.135 -30.14 -30.145 -30.15 -30.155 -30.16 -30.165 -30.17 -30.175 -30.18 -30.185 -30.19 -30.195 -30.2 -30.205 -30.21 -30.215 -30.22 -30.225 -30.23 -30.235 -30.24 -30.245 -30.25 -30.255 -30.26 -30.265 -30.27 -30.275 -30.28 -30.285 -30.29 -30.295 -30.3 -30.305 -30.31 -30.315 -30.32 -30.325 -30.33 -30.335 -30.34 -30.345 -30.35 -30.355 -30.36 -30.365 -30.37 -30.375 -30.38 -30.385 -30.39 -30.395 -30.4 -30.405 -30.41 -30.415 -30.42 -30.425 -30.43 -30.435 -30.44 -30.445 -30.45 -30.455 -30.46 -30.465 -30.47 -30.475 -30.48 -30.485 -30.49 -30.495 -30.5 -30.505 -30.51 -30.515 -30.52 -30.525 -30.53 -30.535 -30.54 -30.545 -30.55 -30.555 -30.56 -30.565 -30.57 -30.575 -30.58 -30.585 -30.59 -30.595 -30.6 -30.605 -30.61 -30.615 -30.62 -30.625 -30.63 -30.635 -30.64 -30.645 -30.65 -30.655 -30.66 -30.665 -30.67 -30.675 -30.68 -30.685 -30.69 -30.695 -30.7 -30.705 -30.71 -30.715 -30.72 -30.725 -30.73 -30.735 -30.74 -30.745 -30.75 -30.755 -30.76 -30.765 -30.77 -30.775 -30.78 -30.785 -30.79 -30.795 -30.8 -30.805 -30.81 -30.815 -30.82 -30.825 -30.83 -30.835 -30.84 -30.845 -30.85 -30.855 -30.86 -30.865 -30.87 -30.875 -30.88 -30.885 -30.89 -30.895 -30.9 -30.905 -30.91 -30.915 -30.92 -30.925 -30.93 -30.935 -30.94 -30.945 -30.95 -30.955 -30.96 -30.965 -30.97 -30.975 -30.98 -30.985 -30.99 -30.995 -31 -31.005 -31.01 -31.015 -31.02 -31.025 -31.03 -31.035 -31.04 -31.045 -31.05 -31.055 -31.06 -31.065 -31.07 -31.075 -31.08 -31.085 -31.09 -31.095 -31.1 -31.105 -31.11 -31.115 -31.12 -31.125 -31.13 -31.135 -31.14 -31.145 -31.15 -31.155 -31.16 -31.165 -31.17 -31.175 -31.18 -31.185 -31.19 -31.195 -31.2 -31.205 -31.21 -31.215 -31.22 -31.225 -31.23 -31.235 -31.24 -31.245 -31.25 -31.255 -31.26 -31.265 -31.27 -31.275 -31.28 -31.285 -31.29 -31.295 -31.3 -31.305 -31.31 -31.315 -31.32 -31.325 -31.33 -31.335 -31.34 -31.345 -31.35 -31.355 -31.36 -31.365 -31.37 -31.375 -31.38 -31.385 -31.39 -31.395 -31.4 -31.405 -31.41 -31.415 -31.42 -31.425 -31.43 -31.435 -31.44 -31.445 -31.45 -31.455 -31.46 -31.465 -31.47 -31.475 -31.48 -31.485 -31.49 -31.495 -31.5 -31.505 -31.51 -31.515 -31.52 -31.525 -31.53 -31.535 -31.54 -31.545 -31.55 -31.555 -31.56 -31.565 -31.57 -31.575 -31.58 -31.585 -31.59 -31.595 -31.6 -31.605 -31.61 -31.615 -31.62 -31.625 -31.63 -31.635 -31.64 -31.645 -31.65 -31.655 -31.66 -31.665 -31.67 -31.675 -31.68 -31.685 -31.69 -31.695 -31.7 -31.705 -31.71 -31.715 -31.72 -31.725 -31.73 -31.735 -31.74 -31.745 -31.75 -31.755 -31.76 -31.765 -31.77 -31.775 -31.78 -31.785 -31.79 -31.795 -31.8 -31.805 -31.81 -31.815 -31.82 -31.825 -31.83 -31.835 -31.84 -31.845 -31.85 -31.855 -31.86 -31.865 -31.87 -31.875 -31.88 -31.885 -31.89 -31.895 -31.9 -31.905 -31.91 -31.915 -31.92 -31.925 -31.93 -31.935 -31.94 -31.945 -31.95 -31.955 -31.96 -31.965 -31.97 -31.975 -31.98 -31.985 -31.99 -31.995 -32 -32.005 -32.01 -32.015 -32.02 -32.025 -32.03 -32.035 -32.04 -32.045 -32.05 -32.055 -32.06 -32.065 -32.07 -32.075 -32.08 -32.085 -32.09 -32.095 -32.1 -32.105 -32.11 -32.115 -32.12 -32.125 -32.13 -32.135 -32.14 -32.145 -32.15 -32.155 -32.16 -32.165 -32.17 -32.175 -32.18 -32.185 -32.19 -32.195 -32.2 -32.205 -32.21 -32.215 -32.22 -32.225 -32.23 -32.235 -32.24 -32.245 -32.25 -32.255 -32.26 -32.265 -32.27 -32.275 -32.28 -32.285 -32.29 -32.295 -32.3 -32.305 -32.31 -32.315 -32.32 -32.325 -32.33 -32.335 -32.34 -32.345 -32.35 -32.355 -32.36 -32.365 -32.37 -32.375 -32.38 -32.385 -32.39 -32.395 -32.4 -32.405 -32.41 -32.415 -32.42 -32.425 -32.43 -32.435 -32.44 -32.445 -32.45 -32.455 -32.46 -32.465 -32.47 -32.475 -32.48 -32.485 -32.49 -32.495 -32.5 -32.505 -32.51 -32.515 -32.52 -32.525 -32.53 -32.535 -32.54 -32.545 -32.55 -32.555 -32.56 -32.565 -32.57 -32.575 -32.58 -32.585 -32.59 -32.595 -32.6 -32.605 -32.61 -32.615 -32.62 -32.625 -32.63 -32.635 -32.64 -32.645 -32.65 -32.655 -32.66 -32.665 -32.67 -32.675 -32.68 -32.685 -32.69 -32.695 -32.7 -32.705 -32.71 -32.715 -32.72 -32.725 -32.73 -32.735 -32.74 -32.745 -32.75 -32.755 -32.76 -32.765 -32.77 -32.775 -32.78 -32.785 -32.79 -32.795 -32.8 -32.805 -32.81 -32.815 -32.82 -32.825 -32.83 -32.835 -32.84 -32.845 -32.85 -32.855 -32.86 -32.865 -32.87 -32.875 -32.88 -32.885 -32.89 -32.895 -32.9 -32.905 -32.91 -32.915 -32.92 -32.925 -32.93 -32.935 -32.94 -32.945 -32.95 -32.955 -32.96 -32.965 -32.97 -32.975 -32.98 -32.985 -32.99 -32.995 -33 -33.005 -33.01 -33.015 -33.02 -33.025 -33.03 -33.035 -33.04 -33.045 -33.05 -33.055 -33.06 -33.065 -33.07 -33.075 -33.08 -33.085 -33.09 -33.095 -33.1 -33.105 -33.11 -33.115 -33.12 -33.125 -33.13 -33.135 -33.14 -33.145 -33.15 -33.155 -33.16 -33.165 -33.17 -33.175 -33.18 -33.185 -33.19 -33.195 -33.2 -33.205 -33.21 -33.215 -33.22 -33.225 -33.23 -33.235 -33.24 -33.245 -33.25 -33.255 -33.26 -33.265 -33.27 -33.275 -33.28 -33.285 -33.29 -33.295 -33.3 -33.305 -33.31 -33.315 -33.32 -33.325 -33.33 -33.335 -33.34 -33.345 -33.35 -33.355 -33.36 -33.365 -33.37 -33.375 -33.38 -33.385 -33.39 -33.395 -33.4 -33.405 -33.41 -33.415 -33.42 -33.425 -33.43 -33.435 -33.44 -33.445 -33.45 -33.455 -33.46 -33.465 -33.47 -33.475 -33.48 -33.485 -33.49 -33.495 -33.5 -33.505 -33.51 -33.515 -33.52 -33.525 -33.53 -33.535 -33.54 -33.545 -33.55 -33.555 -33.56 -33.565 -33.57 -33.575 -33.58 -33.585 -33.59 -33.595 -33.6 -33.605 -33.61 -33.615 -33.62 -33.625 -33.63 -33.635 -33.64 -33.645 -33.65 -33.655 -33.66 -33.665 -33.67 -33.675 -33.68 -33.685 -33.69 -33.695 -33.7 -33.705 -33.71 -33.715 -33.72 -33.725 -33.73 -33.735 -33.74 -33.745 -33.75 -33.755 -33.76 -33.765 -33.77 -33.775 -33.78 -33.785 -33.79 -33.795 -33.8 -33.805 -33.81 -33.815 -33.82 -33.825 -33.83 -33.835 -33.84 -33.845 -33.85 -33.855 -33.86 -33.865 -33.87 -33.875 -33.88 -33.885 -33.89 -33.895 -33.9 -33.905 -33.91 -33.915 -33.92 -33.925 -33.93 -33.935 -33.94 -33.945 -33.95 -33.955 -33.96 -33.965 -33.97 -33.975 -33.98 -33.985 -33.99 -33.995 -34 -34.005 -34.01 -34.015 -34.02 -34.025 -34.03 -34.035 -34.04 -34.045 -34.05 -34.055 -34.06 -34.065 -34.07 -34.075 -34.08 -34.085 -34.09 -34.095 -34.1 -34.105 -34.11 -34.115 -34.12 -34.125 -34.13 -34.135 -34.14 -34.145 -34.15 -34.155 -34.16 -34.165 -34.17 -34.175 -34.18 -34.185 -34.19 -34.195 -34.2 -34.205 -34.21 -34.215 -34.22 -34.225 -34.23 -34.235 -34.24 -34.245 -34.25 -34.255 -34.26 -34.265 -34.27 -34.275 -34.28 -34.285 -34.29 -34.295 -34.3 -34.305 -34.31 -34.315 -34.32 -34.325 -34.33 -34.335 -34.34 -34.345 -34.35 -34.355 -34.36 -34.365 -34.37 -34.375 -34.38 -34.385 -34.39 -34.395 -34.4 -34.405 -34.41 -34.415 -34.42 -34.425 -34.43 -34.435 -34.44 -34.445 -34.45 -34.455 -34.46 -34.465 -34.47 -34.475 -34.48 -34.485 -34.49 -34.495 -34.5 -34.505 -34.51 -34.515 -34.52 -34.525 -34.53 -34.535 -34.54 -34.545 -34.55 -34.555 -34.56 -34.565 -34.57 -34.575 -34.58 -34.585 -34.59 -34.595 -34.6 -34.605 -34.61 -34.615 -34.62 -34.625 -34.63 -34.635 -34.64 -34.645 -34.65 -34.655 -34.66 -34.665 -34.67 -34.675 -34.68 -34.685 -34.69 -34.695 -34.7 -34.705 -34.71 -34.715 -34.72 -34.725 -34.73 -34.735 -34.74 -34.745 -34.75 -34.755 -34.76 -34.765 -34.77 -34.775 -34.78 -34.785 -34.79 -34.795 -34.8 -34.805 -34.81 -34.815 -34.82 -34.825 -34.83 -34.835 -34.84 -34.845 -34.85 -34.855 -34.86 -34.865 -34.87 -34.875 -34.88 -34.885 -34.89 -34.895 -34.9 -34.905 -34.91 -34.915 -34.92 -34.925 -34.93 -34.935 -34.94 -34.945 -34.95 -34.955 -34.96 -34.965 -34.97 -34.975 -34.98 -34.985 -34.99 -34.995 -35 -35.005 -35.01 -35.015 -35.02 -35.025 -35.03 -35.035 -35.04 -35.045 -35.05 -35.055 -35.06 -35.065 -35.07 -35.075 -35.08 -35.085 -35.09 -35.095 -35.1 -35.105 -35.11 -35.115 -35.12 -35.125 -35.13 -35.135 -35.14 -35.145 -35.15 -35.155 -35.16 -35.165 -35.17 -35.175 -35.18 -35.185 -35.19 -35.195 -35.2 -35.205 -35.21 -35.215 -35.22 -35.225 -35.23 -35.235 -35.24 -35.245 -35.25 -35.255 -35.26 -35.265 -35.27 -35.275 -35.28 -35.285 -35.29 -35.295 -35.3 -35.305 -35.31 -35.315 -35.32 -35.325 -35.33 -35.335 -35.34 -35.345 -35.35 -35.355 -35.36 -35.365 -35.37 -35.375 -35.38 -35.385 -35.39 -35.395 -35.4 -35.405 -35.41 -35.415 -35.42 -35.425 -35.43 -35.435 -35.44 -35.445 -35.45 -35.455 -35.46 -35.465 -35.47 -35.475 -35.48 -35.485 -35.49 -35.495 -35.5 -35.505 -35.51 -35.515 -35.52 -35.525 -35.53 -35.535 -35.54 -35.545 -35.55 -35.555 -35.56 -35.565 -35.57 -35.575 -35.58 -35.585 -35.59 -35.595 -35.6 -35.605 -35.61 -35.615 -35.62 -35.625 -35.63 -35.635 -35.64 -35.645 -35.65 -35.655 -35.66 -35.665 -35.67 -35.675 -35.68 -35.685 -35.69 -35.695 -35.7 -35.705 -35.71 -35.715 -35.72 -35.725 -35.73 -35.735 -35.74 -35.745 -35.75 -35.755 -35.76 -35.765 -35.77 -35.775 -35.78 -35.785 -35.79 -35.795 -35.8 -35.805 -35.81 -35.815 -35.82 -35.825 -35.83 -35.835 -35.84 -35.845 -35.85 -35.855 -35.86 -35.865 -35.87 -35.875 -35.88 -35.885 -35.89 -35.895 -35.9 -35.905 -35.91 -35.915 -35.92 -35.925 -35.93 -35.935 -35.94 -35.945 -35.95 -35.955 -35.96 -35.965 -35.97 -35.975 -35.98 -35.985 -35.99 -35.995 -36 -36.005 -36.01 -36.015 -36.02 -36.025 -36.03 -36.035 -36.04 -36.045 -36.05 -36.055 -36.06 -36.065 -36.07 -36.075 -36.08 -36.085 -36.09 -36.095 -36.1 -36.105 -36.11 -36.115 -36.12 -36.125 -36.13 -36.135 -36.14 -36.145 -36.15 -36.155 -36.16 -36.165 -36.17 -36.175 -36.18 -36.185 -36.19 -36.195 -36.2 -36.205 -36.21 -36.215 -36.22 -36.225 -36.23 -36.235 -36.24 -36.245 -36.25 -36.255 -36.26 -36.265 -36.27 -36.275 -36.28 -36.285 -36.29 -36.295 -36.3 -36.305 -36.31 -36.315 -36.32 -36.325 -36.33 -36.335 -36.34 -36.345 -36.35 -36.355 -36.36 -36.365 -36.37 -36.375 -36.38 -36.385 -36.39 -36.395 -36.4 -36.405 -36.41 -36.415 -36.42 -36.425 -36.43 -36.435 -36.44 -36.445 -36.45 -36.455 -36.46 -36.465 -36.47 -36.475 -36.48 -36.485 -36.49 -36.495 -36.5 -36.505 -36.51 -36.515 -36.52 -36.525 -36.53 -36.535 -36.54 -36.545 -36.55 -36.555 -36.56 -36.565 -36.57 -36.575 -36.58 -36.585 -36.59 -36.595 -36.6 -36.605 -36.61 -36.615 -36.62 -36.625 -36.63 -36.635 -36.64 -36.645 -36.65 -36.655 -36.66 -36.665 -36.67 -36.675 -36.68 -36.685 -36.69 -36.695 -36.7 -36.705 -36.71 -36.715 -36.72 -36.725 -36.73 -36.735 -36.74 -36.745 -36.75 -36.755 -36.76 -36.765 -36.77 -36.775 -36.78 -36.785 -36.79 -36.795 -36.8 -36.805 -36.81 -36.815 -36.82 -36.825 -36.83 -36.835 -36.84 -36.845 -36.85 -36.855 -36.86 -36.865 -36.87 -36.875 -36.88 -36.885 -36.89 -36.895 -36.9 -36.905 -36.91 -36.915 -36.92 -36.925 -36.93 -36.935 -36.94 -36.945 -36.95 -36.955 -36.96 -36.965 -36.97 -36.975 -36.98 -36.985 -36.99 -36.995 -37 -37.005 -37.01 -37.015 -37.02 -37.025 -37.03 -37.035 -37.04 -37.045 -37.05 -37.055 -37.06 -37.065 -37.07 -37.075 -37.08 -37.085 -37.09 -37.095 -37.1 -37.105 -37.11 -37.115 -37.12 -37.125 -37.13 -37.135 -37.14 -37.145 -37.15 -37.155 -37.16 -37.165 -37.17 -37.175 -37.18 -37.185 -37.19 -37.195 -37.2 -37.205 -37.21 -37.215 -37.22 -37.225 -37.23 -37.235 -37.24 -37.245 -37.25 -37.255 -37.26 -37.265 -37.27 -37.275 -37.28 -37.285 -37.29 -37.295 -37.3 -37.305 -37.31 -37.315 -37.32 -37.325 -37.33 -37.335 -37.34 -37.345 -37.35 -37.355 -37.36 -37.365 -37.37 -37.375 -37.38 -37.385 -37.39 -37.395 -37.4 -37.405 -37.41 -37.415 -37.42 -37.425 -37.43 -37.435 -37.44 -37.445 -37.45 -37.455 -37.46 -37.465 -37.47 -37.475 -37.48 -37.485 -37.49 -37.495 -37.5 -37.505 -37.51 -37.515 -37.52 -37.525 -37.53 -37.535 -37.54 -37.545 -37.55 -37.555 -37.56 -37.565 -37.57 -37.575 -37.58 -37.585 -37.59 -37.595 -37.6 -37.605 -37.61 -37.615 -37.62 -37.625 -37.63 -37.635 -37.64 -37.645 -37.65 -37.655 -37.66 -37.665 -37.67 -37.675 -37.68 -37.685 -37.69 -37.695 -37.7 -37.705 -37.71 -37.715 -37.72 -37.725 -37.73 -37.735 -37.74 -37.745 -37.75 -37.755 -37.76 -37.765 -37.77 -37.775 -37.78 -37.785 -37.79 -37.795 -37.8 -37.805 -37.81 -37.815 -37.82 -37.825 -37.83 -37.835 -37.84 -37.845 -37.85 -37.855 -37.86 -37.865 -37.87 -37.875 -37.88 -37.885 -37.89 -37.895 -37.9 -37.905 -37.91 -37.915 -37.92 -37.925 -37.93 -37.935 -37.94 -37.945 -37.95 -37.955 -37.96 -37.965 -37.97 -37.975 -37.98 -37.985 -37.99 -37.995 -38 -38.005 -38.01 -38.015 -38.02 -38.025 -38.03 -38.035 -38.04 -38.045 -38.05 -38.055 -38.06 -38.065 -38.07 -38.075 -38.08 -38.085 -38.09 -38.095 -38.1 -38.105 -38.11 -38.115 -38.12 -38.125 -38.13 -38.135 -38.14 -38.145 -38.15 -38.155 -38.16 -38.165 -38.17 -38.175 -38.18 -38.185 -38.19 -38.195 -38.2 -38.205 -38.21 -38.215 -38.22 -38.225 -38.23 -38.235 -38.24 -38.245 -38.25 -38.255 -38.26 -38.265 -38.27 -38.275 -38.28 -38.285 -38.29 -38.295 -38.3 -38.305 -38.31 -38.315 -38.32 -38.325 -38.33 -38.335 -38.34 -38.345 -38.35 -38.355 -38.36 -38.365 -38.37 -38.375 -38.38 -38.385 -38.39 -38.395 -38.4 -38.405 -38.41 -38.415 -38.42 -38.425 -38.43 -38.435 -38.44 -38.445 -38.45 -38.455 -38.46 -38.465 -38.47 -38.475 -38.48 -38.485 -38.49 -38.495 -38.5 -38.505 -38.51 -38.515 -38.52 -38.525 -38.53 -38.535 -38.54 -38.545 -38.55 -38.555 -38.56 -38.565 -38.57 -38.575 -38.58 -38.585 -38.59 -38.595 -38.6 -38.605 -38.61 -38.615 -38.62 -38.625 -38.63 -38.635 -38.64 -38.645 -38.65 -38.655 -38.66 -38.665 -38.67 -38.675 -38.68 -38.685 -38.69 -38.695 -38.7 -38.705 -38.71 -38.715 -38.72 -38.725 -38.73 -38.735 -38.74 -38.745 -38.75 -38.755 -38.76 -38.765 -38.77 -38.775 -38.78 -38.785 -38.79 -38.795 -38.8 -38.805 -38.81 -38.815 -38.82 -38.825 -38.83 -38.835 -38.84 -38.845 -38.85 -38.855 -38.86 -38.865 -38.87 -38.875 -38.88 -38.885 -38.89 -38.895 -38.9 -38.905 -38.91 -38.915 -38.92 -38.925 -38.93 -38.935 -38.94 -38.945 -38.95 -38.955 -38.96 -38.965 -38.97 -38.975 -38.98 -38.985 -38.99 -38.995 -39 -39.005 -39.01 -39.015 -39.02 -39.025 -39.03 -39.035 -39.04 -39.045 -39.05 -39.055 -39.06 -39.065 -39.07 -39.075 -39.08 -39.085 -39.09 -39.095 -39.1 -39.105 -39.11 -39.115 -39.12 -39.125 -39.13 -39.135 -39.14 -39.145 -39.15 -39.155 -39.16 -39.165 -39.17 -39.175 -39.18 -39.185 -39.19 -39.195 -39.2 -39.205 -39.21 -39.215 -39.22 -39.225 -39.23 -39.235 -39.24 -39.245 -39.25 -39.255 -39.26 -39.265 -39.27 -39.275 -39.28 -39.285 -39.29 -39.295 -39.3 -39.305 -39.31 -39.315 -39.32 -39.325 -39.33 -39.335 -39.34 -39.345 -39.35 -39.355 -39.36 -39.365 -39.37 -39.375 -39.38 -39.385 -39.39 -39.395 -39.4 -39.405 -39.41 -39.415 -39.42 -39.425 -39.43 -39.435 -39.44 -39.445 -39.45 -39.455 -39.46 -39.465 -39.47 -39.475 -39.48 -39.485 -39.49 -39.495 -39.5 -39.505 -39.51 -39.515 -39.52 -39.525 -39.53 -39.535 -39.54 -39.545 -39.55 -39.555 -39.56 -39.565 -39.57 -39.575 -39.58 -39.585 -39.59 -39.595 -39.6 -39.605 -39.61 -39.615 -39.62 -39.625 -39.63 -39.635 -39.64 -39.645 -39.65 -39.655 -39.66 -39.665 -39.67 -39.675 -39.68 -39.685 -39.69 -39.695 -39.7 -39.705 -39.71 -39.715 -39.72 -39.725 -39.73 -39.735 -39.74 -39.745 -39.75 -39.755 -39.76 -39.765 -39.77 -39.775 -39.78 -39.785 -39.79 -39.795 -39.8 -39.805 -39.81 -39.815 -39.82 -39.825 -39.83 -39.835 -39.84 -39.845 -39.85 -39.855 -39.86 -39.865 -39.87 -39.875 -39.88 -39.885 -39.89 -39.895 -39.9 -39.905 -39.91 -39.915 -39.92 -39.925 -39.93 -39.935 -39.94 -39.945 -39.95 -39.955 -39.96 -39.965 -39.97 -39.975 -39.98 -39.985 -39.99 -39.995 -40 -40.005 -40.01 -40.015 -40.02 -40.025 -40.03 -40.035 -40.04 -40.045 -40.05 -40.055 -40.06 -40.065 -40.07 -40.075 -40.08 -40.085 -40.09 -40.095 -40.1 -40.105 -40.11 -40.115 -40.12 -40.125 -40.13 -40.135 -40.14 -40.145 -40.15 -40.155 -40.16 -40.165 -40.17 -40.175 -40.18 -40.185 -40.19 -40.195 -40.2 -40.205 -40.21 -40.215 -40.22 -40.225 -40.23 -40.235 -40.24 -40.245 -40.25 -40.255 -40.26 -40.265 -40.27 -40.275 -40.28 -40.285 -40.29 -40.295 -40.3 -40.305 -40.31 -40.315 -40.32 -40.325 -40.33 -40.335 -40.34 -40.345 -40.35 -40.355 -40.36 -40.365 -40.37 -40.375 -40.38 -40.385 -40.39 -40.395 -40.4 -40.405 -40.41 -40.415 -40.42 -40.425 -40.43 -40.435 -40.44 -40.445 -40.45 -40.455 -40.46 -40.465 -40.47 -40.475 -40.48 -40.485 -40.49 -40.495 -40.5 -40.505 -40.51 -40.515 -40.52 -40.525 -40.53 -40.535 -40.54 -40.545 -40.55 -40.555 -40.56 -40.565 -40.57 -40.575 -40.58 -40.585 -40.59 -40.595 -40.6 -40.605 -40.61 -40.615 -40.62 -40.625 -40.63 -40.635 -40.64 -40.645 -40.65 -40.655 -40.66 -40.665 -40.67 -40.675 -40.68 -40.685 -40.69 -40.695 -40.7 -40.705 -40.71 -40.715 -40.72 -40.725 -40.73 -40.735 -40.74 -40.745 -40.75 -40.755 -40.76 -40.765 -40.77 -40.775 -40.78 -40.785 -40.79 -40.795 -40.8 -40.805 -40.81 -40.815 -40.82 -40.825 -40.83 -40.835 -40.84 -40.845 -40.85 -40.855 -40.86 -40.865 -40.87 -40.875 -40.88 -40.885 -40.89 -40.895 -40.9 -40.905 -40.91 -40.915 -40.92 -40.925 -40.93 -40.935 -40.94 -40.945 -40.95 -40.955 -40.96 -40.965 -40.97 -40.975 -40.98 -40.985 -40.99 -40.995 -41 -41.005 -41.01 -41.015 -41.02 -41.025 -41.03 -41.035 -41.04 -41.045 -41.05 -41.055 -41.06 -41.065 -41.07 -41.075 -41.08 -41.085 -41.09 -41.095 -41.1 -41.105 -41.11 -41.115 -41.12 -41.125 -41.13 -41.135 -41.14 -41.145 -41.15 -41.155 -41.16 -41.165 -41.17 -41.175 -41.18 -41.185 -41.19 -41.195 -41.2 -41.205 -41.21 -41.215 -41.22 -41.225 -41.23 -41.235 -41.24 -41.245 -41.25 -41.255 -41.26 -41.265 -41.27 -41.275 -41.28 -41.285 -41.29 -41.295 -41.3 -41.305 -41.31 -41.315 -41.32 -41.325 -41.33 -41.335 -41.34 -41.345 -41.35 -41.355 -41.36 -41.365 -41.37 -41.375 -41.38 -41.385 -41.39 -41.395 -41.4 -41.405 -41.41 -41.415 -41.42 -41.425 -41.43 -41.435 -41.44 -41.445 -41.45 -41.455 -41.46 -41.465 -41.47 -41.475 -41.48 -41.485 -41.49 -41.495 -41.5 -41.505 -41.51 -41.515 -41.52 -41.525 -41.53 -41.535 -41.54 -41.545 -41.55 -41.555 -41.56 -41.565 -41.57 -41.575 -41.58 -41.585 -41.59 -41.595 -41.6 -41.605 -41.61 -41.615 -41.62 -41.625 -41.63 -41.635 -41.64 -41.645 -41.65 -41.655 -41.66 -41.665 -41.67 -41.675 -41.68 -41.685 -41.69 -41.695 -41.7 -41.705 -41.71 -41.715 -41.72 -41.725 -41.73 -41.735 -41.74 -41.745 -41.75 -41.755 -41.76 -41.765 -41.77 -41.775 -41.78 -41.785 -41.79 -41.795 -41.8 -41.805 -41.81 -41.815 -41.82 -41.825 -41.83 -41.835 -41.84 -41.845 -41.85 -41.855 -41.86 -41.865 -41.87 -41.875 -41.88 -41.885 -41.89 -41.895 -41.9 -41.905 -41.91 -41.915 -41.92 -41.925 -41.93 -41.935 -41.94 -41.945 -41.95 -41.955 -41.96 -41.965 -41.97 -41.975 -41.98 -41.985 -41.99 -41.995 -42 -42.005 -42.01 -42.015 -42.02 -42.025 -42.03 -42.035 -42.04 -42.045 -42.05 -42.055 -42.06 -42.065 -42.07 -42.075 -42.08 -42.085 -42.09 -42.095 -42.1 -42.105 -42.11 -42.115 -42.12 -42.125 -42.13 -42.135 -42.14 -42.145 -42.15 -42.155 -42.16 -42.165 -42.17 -42.175 -42.18 -42.185 -42.19 -42.195 -42.2 -42.205 -42.21 -42.215 -42.22 -42.225 -42.23 -42.235 -42.24 -42.245 -42.25 -42.255 -42.26 -42.265 -42.27 -42.275 -42.28 -42.285 -42.29 -42.295 -42.3 -42.305 -42.31 -42.315 -42.32 -42.325 -42.33 -42.335 -42.34 -42.345 -42.35 -42.355 -42.36 -42.365 -42.37 -42.375 -42.38 -42.385 -42.39 -42.395 -42.4 -42.405 -42.41 -42.415 -42.42 -42.425 -42.43 -42.435 -42.44 -42.445 -42.45 -42.455 -42.46 -42.465 -42.47 -42.475 -42.48 -42.485 -42.49 -42.495 -42.5 -42.505 -42.51 -42.515 -42.52 -42.525 -42.53 -42.535 -42.54 -42.545 -42.55 -42.555 -42.56 -42.565 -42.57 -42.575 -42.58 -42.585 -42.59 -42.595 -42.6 -42.605 -42.61 -42.615 -42.62 -42.625 -42.63 -42.635 -42.64 -42.645 -42.65 -42.655 -42.66 -42.665 -42.67 -42.675 -42.68 -42.685 -42.69 -42.695 -42.7 -42.705 -42.71 -42.715 -42.72 -42.725 -42.73 -42.735 -42.74 -42.745 -42.75 -42.755 -42.76 -42.765 -42.77 -42.775 -42.78 -42.785 -42.79 -42.795 -42.8 -42.805 -42.81 -42.815 -42.82 -42.825 -42.83 -42.835 -42.84 -42.845 -42.85 -42.855 -42.86 -42.865 -42.87 -42.875 -42.88 -42.885 -42.89 -42.895 -42.9 -42.905 -42.91 -42.915 -42.92 -42.925 -42.93 -42.935 -42.94 -42.945 -42.95 -42.955 -42.96 -42.965 -42.97 -42.975 -42.98 -42.985 -42.99 -42.995 -43 -43.005 -43.01 -43.015 -43.02 -43.025 -43.03 -43.035 -43.04 -43.045 -43.05 -43.055 -43.06 -43.065 -43.07 -43.075 -43.08 -43.085 -43.09 -43.095 -43.1 -43.105 -43.11 -43.115 -43.12 -43.125 -43.13 -43.135 -43.14 -43.145 -43.15 -43.155 -43.16 -43.165 -43.17 -43.175 -43.18 -43.185 -43.19 -43.195 -43.2 -43.205 -43.21 -43.215 -43.22 -43.225 -43.23 -43.235 -43.24 -43.245 -43.25 -43.255 -43.26 -43.265 -43.27 -43.275 -43.28 -43.285 -43.29 -43.295 -43.3 -43.305 -43.31 -43.315 -43.32 -43.325 -43.33 -43.335 -43.34 -43.345 -43.35 -43.355 -43.36 -43.365 -43.37 -43.375 -43.38 -43.385 -43.39 -43.395 -43.4 -43.405 -43.41 -43.415 -43.42 -43.425 -43.43 -43.435 -43.44 -43.445 -43.45 -43.455 -43.46 -43.465 -43.47 -43.475 -43.48 -43.485 -43.49 -43.495 -43.5 -43.505 -43.51 -43.515 -43.52 -43.525 -43.53 -43.535 -43.54 -43.545 -43.55 -43.555 -43.56 -43.565 -43.57 -43.575 -43.58 -43.585 -43.59 -43.595 -43.6 -43.605 -43.61 -43.615 -43.62 -43.625 -43.63 -43.635 -43.64 -43.645 -43.65 -43.655 -43.66 -43.665 -43.67 -43.675 -43.68 -43.685 -43.69 -43.695 -43.7 -43.705 -43.71 -43.715 -43.72 -43.725 -43.73 -43.735 -43.74 -43.745 -43.75 -43.755 -43.76 -43.765 -43.77 -43.775 -43.78 -43.785 -43.79 -43.795 -43.8 -43.805 -43.81 -43.815 -43.82 -43.825 -43.83 -43.835 -43.84 -43.845 -43.85 -43.855 -43.86 -43.865 -43.87 -43.875 -43.88 -43.885 -43.89 -43.895 -43.9 -43.905 -43.91 -43.915 -43.92 -43.925 -43.93 -43.935 -43.94 -43.945 -43.95 -43.955 -43.96 -43.965 -43.97 -43.975 -43.98 -43.985 -43.99 -43.995 -44 -44.005 -44.01 -44.015 -44.02 -44.025 -44.03 -44.035 -44.04 -44.045 -44.05 -44.055 -44.06 -44.065 -44.07 -44.075 -44.08 -44.085 -44.09 -44.095 -44.1 -44.105 -44.11 -44.115 -44.12 -44.125 -44.13 -44.135 -44.14 -44.145 -44.15 -44.155 -44.16 -44.165 -44.17 -44.175 -44.18 -44.185 -44.19 -44.195 -44.2 -44.205 -44.21 -44.215 -44.22 -44.225 -44.23 -44.235 -44.24 -44.245 -44.25 -44.255 -44.26 -44.265 -44.27 -44.275 -44.28 -44.285 -44.29 -44.295 -44.3 -44.305 -44.31 -44.315 -44.32 -44.325 -44.33 -44.335 -44.34 -44.345 -44.35 -44.355 -44.36 -44.365 -44.37 -44.375 -44.38 -44.385 -44.39 -44.395 -44.4 -44.405 -44.41 -44.415 -44.42 -44.425 -44.43 -44.435 -44.44 -44.445 -44.45 -44.455 -44.46 -44.465 -44.47 -44.475 -44.48 -44.485 -44.49 -44.495 -44.5 -44.505 -44.51 -44.515 -44.52 -44.525 -44.53 -44.535 -44.54 -44.545 -44.55 -44.555 -44.56 -44.565 -44.57 -44.575 -44.58 -44.585 -44.59 -44.595 -44.6 -44.605 -44.61 -44.615 -44.62 -44.625 -44.63 -44.635 -44.64 -44.645 -44.65 -44.655 -44.66 -44.665 -44.67 -44.675 -44.68 -44.685 -44.69 -44.695 -44.7 -44.705 -44.71 -44.715 -44.72 -44.725 -44.73 -44.735 -44.74 -44.745 -44.75 -44.755 -44.76 -44.765 -44.77 -44.775 -44.78 -44.785 -44.79 -44.795 -44.8 -44.805 -44.81 -44.815 -44.82 -44.825 -44.83 -44.835 -44.84 -44.845 -44.85 -44.855 -44.86 -44.865 -44.87 -44.875 -44.88 -44.885 -44.89 -44.895 -44.9 -44.905 -44.91 -44.915 -44.92 -44.925 -44.93 -44.935 -44.94 -44.945 -44.95 -44.955 -44.96 -44.965 -44.97 -44.975 -44.98 -44.985 -44.99 -44.995 -45 -45.005 -45.01 -45.015 -45.02 -45.025 -45.03 -45.035 -45.04 -45.045 -45.05 -45.055 -45.06 -45.065 -45.07 -45.075 -45.08 -45.085 -45.09 -45.095 -45.1 -45.105 -45.11 -45.115 -45.12 -45.125 -45.13 -45.135 -45.14 -45.145 -45.15 -45.155 -45.16 -45.165 -45.17 -45.175 -45.18 -45.185 -45.19 -45.195 -45.2 -45.205 -45.21 -45.215 -45.22 -45.225 -45.23 -45.235 -45.24 -45.245 -45.25 -45.255 -45.26 -45.265 -45.27 -45.275 -45.28 -45.285 -45.29 -45.295 -45.3 -45.305 -45.31 -45.315 -45.32 -45.325 -45.33 -45.335 -45.34 -45.345 -45.35 -45.355 -45.36 -45.365 -45.37 -45.375 -45.38 -45.385 -45.39 -45.395 -45.4 -45.405 -45.41 -45.415 -45.42 -45.425 -45.43 -45.435 -45.44 -45.445 -45.45 -45.455 -45.46 -45.465 -45.47 -45.475 -45.48 -45.485 -45.49 -45.495 -45.5 -45.505 -45.51 -45.515 -45.52 -45.525 -45.53 -45.535 -45.54 -45.545 -45.55 -45.555 -45.56 -45.565 -45.57 -45.575 -45.58 -45.585 -45.59 -45.595 -45.6 -45.605 -45.61 -45.615 -45.62 -45.625 -45.63 -45.635 -45.64 -45.645 -45.65 -45.655 -45.66 -45.665 -45.67 -45.675 -45.68 -45.685 -45.69 -45.695 -45.7 -45.705 -45.71 -45.715 -45.72 -45.725 -45.73 -45.735 -45.74 -45.745 -45.75 -45.755 -45.76 -45.765 -45.77 -45.775 -45.78 -45.785 -45.79 -45.795 -45.8 -45.805 -45.81 -45.815 -45.82 -45.825 -45.83 -45.835 -45.84 -45.845 -45.85 -45.855 -45.86 -45.865 -45.87 -45.875 -45.88 -45.885 -45.89 -45.895 -45.9 -45.905 -45.91 -45.915 -45.92 -45.925 -45.93 -45.935 -45.94 -45.945 -45.95 -45.955 -45.96 -45.965 -45.97 -45.975 -45.98 -45.985 -45.99 -45.995 -46 -46.005 -46.01 -46.015 -46.02 -46.025 -46.03 -46.035 -46.04 -46.045 -46.05 -46.055 -46.06 -46.065 -46.07 -46.075 -46.08 -46.085 -46.09 -46.095 -46.1 -46.105 -46.11 -46.115 -46.12 -46.125 -46.13 -46.135 -46.14 -46.145 -46.15 -46.155 -46.16 -46.165 -46.17 -46.175 -46.18 -46.185 -46.19 -46.195 -46.2 -46.205 -46.21 -46.215 -46.22 -46.225 -46.23 -46.235 -46.24 -46.245 -46.25 -46.255 -46.26 -46.265 -46.27 -46.275 -46.28 -46.285 -46.29 -46.295 -46.3 -46.305 -46.31 -46.315 -46.32 -46.325 -46.33 -46.335 -46.34 -46.345 -46.35 -46.355 -46.36 -46.365 -46.37 -46.375 -46.38 -46.385 -46.39 -46.395 -46.4 -46.405 -46.41 -46.415 -46.42 -46.425 -46.43 -46.435 -46.44 -46.445 -46.45 -46.455 -46.46 -46.465 -46.47 -46.475 -46.48 -46.485 -46.49 -46.495 -46.5 -46.505 -46.51 -46.515 -46.52 -46.525 -46.53 -46.535 -46.54 -46.545 -46.55 -46.555 -46.56 -46.565 -46.57 -46.575 -46.58 -46.585 -46.59 -46.595 -46.6 -46.605 -46.61 -46.615 -46.62 -46.625 -46.63 -46.635 -46.64 -46.645 -46.65 -46.655 -46.66 -46.665 -46.67 -46.675 -46.68 -46.685 -46.69 -46.695 -46.7 -46.705 -46.71 -46.715 -46.72 -46.725 -46.73 -46.735 -46.74 -46.745 -46.75 -46.755 -46.76 -46.765 -46.77 -46.775 -46.78 -46.785 -46.79 -46.795 -46.8 -46.805 -46.81 -46.815 -46.82 -46.825 -46.83 -46.835 -46.84 -46.845 -46.85 -46.855 -46.86 -46.865 -46.87 -46.875 -46.88 -46.885 -46.89 -46.895 -46.9 -46.905 -46.91 -46.915 -46.92 -46.925 -46.93 -46.935 -46.94 -46.945 -46.95 -46.955 -46.96 -46.965 -46.97 -46.975 -46.98 -46.985 -46.99 -46.995 -47 -47.005 -47.01 -47.015 -47.02 -47.025 -47.03 -47.035 -47.04 -47.045 -47.05 -47.055 -47.06 -47.065 -47.07 -47.075 -47.08 -47.085 -47.09 -47.095 -47.1 -47.105 -47.11 -47.115 -47.12 -47.125 -47.13 -47.135 -47.14 -47.145 -47.15 -47.155 -47.16 -47.165 -47.17 -47.175 -47.18 -47.185 -47.19 -47.195 -47.2 -47.205 -47.21 -47.215 -47.22 -47.225 -47.23 -47.235 -47.24 -47.245 -47.25 -47.255 -47.26 -47.265 -47.27 -47.275 -47.28 -47.285 -47.29 -47.295 -47.3 -47.305 -47.31 -47.315 -47.32 -47.325 -47.33 -47.335 -47.34 -47.345 -47.35 -47.355 -47.36 -47.365 -47.37 -47.375 -47.38 -47.385 -47.39 -47.395 -47.4 -47.405 -47.41 -47.415 -47.42 -47.425 -47.43 -47.435 -47.44 -47.445 -47.45 -47.455 -47.46 -47.465 -47.47 -47.475 -47.48 -47.485 -47.49 -47.495 -47.5 -47.505 -47.51 -47.515 -47.52 -47.525 -47.53 -47.535 -47.54 -47.545 -47.55 -47.555 -47.56 -47.565 -47.57 -47.575 -47.58 -47.585 -47.59 -47.595 -47.6 -47.605 -47.61 -47.615 -47.62 -47.625 -47.63 -47.635 -47.64 -47.645 -47.65 -47.655 -47.66 -47.665 -47.67 -47.675 -47.68 -47.685 -47.69 -47.695 -47.7 -47.705 -47.71 -47.715 -47.72 -47.725 -47.73 -47.735 -47.74 -47.745 -47.75 -47.755 -47.76 -47.765 -47.77 -47.775 -47.78 -47.785 -47.79 -47.795 -47.8 -47.805 -47.81 -47.815 -47.82 -47.825 -47.83 -47.835 -47.84 -47.845 -47.85 -47.855 -47.86 -47.865 -47.87 -47.875 -47.88 -47.885 -47.89 -47.895 -47.9 -47.905 -47.91 -47.915 -47.92 -47.925 -47.93 -47.935 -47.94 -47.945 -47.95 -47.955 -47.96 -47.965 -47.97 -47.975 -47.98 -47.985 -47.99 -47.995 -48 -48.005 -48.01 -48.015 -48.02 -48.025 -48.03 -48.035 -48.04 -48.045 -48.05 -48.055 -48.06 -48.065 -48.07 -48.075 -48.08 -48.085 -48.09 -48.095 -48.1 -48.105 -48.11 -48.115 -48.12 -48.125 -48.13 -48.135 -48.14 -48.145 -48.15 -48.155 -48.16 -48.165 -48.17 -48.175 -48.18 -48.185 -48.19 -48.195 -48.2 -48.205 -48.21 -48.215 -48.22 -48.225 -48.23 -48.235 -48.24 -48.245 -48.25 -48.255 -48.26 -48.265 -48.27 -48.275 -48.28 -48.285 -48.29 -48.295 -48.3 -48.305 -48.31 -48.315 -48.32 -48.325 -48.33 -48.335 -48.34 -48.345 -48.35 -48.355 -48.36 -48.365 -48.37 -48.375 -48.38 -48.385 -48.39 -48.395 -48.4 -48.405 -48.41 -48.415 -48.42 -48.425 -48.43 -48.435 -48.44 -48.445 -48.45 -48.455 -48.46 -48.465 -48.47 -48.475 -48.48 -48.485 -48.49 -48.495 -48.5 -48.505 -48.51 -48.515 -48.52 -48.525 -48.53 -48.535 -48.54 -48.545 -48.55 -48.555 -48.56 -48.565 -48.57 -48.575 -48.58 -48.585 -48.59 -48.595 -48.6 -48.605 -48.61 -48.615 -48.62 -48.625 -48.63 -48.635 -48.64 -48.645 -48.65 -48.655 -48.66 -48.665 -48.67 -48.675 -48.68 -48.685 -48.69 -48.695 -48.7 -48.705 -48.71 -48.715 -48.72 -48.725 -48.73 -48.735 -48.74 -48.745 -48.75 -48.755 -48.76 -48.765 -48.77 -48.775 -48.78 -48.785 -48.79 -48.795 -48.8 -48.805 -48.81 -48.815 -48.82 -48.825 -48.83 -48.835 -48.84 -48.845 -48.85 -48.855 -48.86 -48.865 -48.87 -48.875 -48.88 -48.885 -48.89 -48.895 -48.9 -48.905 -48.91 -48.915 -48.92 -48.925 -48.93 -48.935 -48.94 -48.945 -48.95 -48.955 -48.96 -48.965 -48.97 -48.975 -48.98 -48.985 -48.99 -48.995 -49 -49.005 -49.01 -49.015 -49.02 -49.025 -49.03 -49.035 -49.04 -49.045 -49.05 -49.055 -49.06 -49.065 -49.07 -49.075 -49.08 -49.085 -49.09 -49.095 -49.1 -49.105 -49.11 -49.115 -49.12 -49.125 -49.13 -49.135 -49.14 -49.145 -49.15 -49.155 -49.16 -49.165 -49.17 -49.175 -49.18 -49.185 -49.19 -49.195 -49.2 -49.205 -49.21 -49.215 -49.22 -49.225 -49.23 -49.235 -49.24 -49.245 -49.25 -49.255 -49.26 -49.265 -49.27 -49.275 -49.28 -49.285 -49.29 -49.295 -49.3 -49.305 -49.31 -49.315 -49.32 -49.325 -49.33 -49.335 -49.34 -49.345 -49.35 -49.355 -49.36 -49.365 -49.37 -49.375 -49.38 -49.385 -49.39 -49.395 -49.4 -49.405 -49.41 -49.415 -49.42 -49.425 -49.43 -49.435 -49.44 -49.445 -49.45 -49.455 -49.46 -49.465 -49.47 -49.475 -49.48 -49.485 -49.49 -49.495 -49.5 -49.505 -49.51 -49.515 -49.52 -49.525 -49.53 -49.535 -49.54 -49.545 -49.55 -49.555 -49.56 -49.565 -49.57 -49.575 -49.58 -49.585 -49.59 -49.595 -49.6 -49.605 -49.61 -49.615 -49.62 -49.625 -49.63 -49.635 -49.64 -49.645 -49.65 -49.655 -49.66 -49.665 -49.67 -49.675 -49.68 -49.685 -49.69 -49.695 -49.7 -49.705 -49.71 -49.715 -49.72 -49.725 -49.73 -49.735 -49.74 -49.745 -49.75 -49.755 -49.76 -49.765 -49.77 -49.775 -49.78 -49.785 -49.79 -49.795 -49.8 -49.805 -49.81 -49.815 -49.82 -49.825 -49.83 -49.835 -49.84 -49.845 -49.85 -49.855 -49.86 -49.865 -49.87 -49.875 -49.88 -49.885 -49.89 -49.895 -49.9 -49.905 -49.91 -49.915 -49.92 -49.925 -49.93 -49.935 -49.94 -49.945 -49.95 -49.955 -49.96 -49.965 -49.97 -49.975 -49.98 -49.985 -49.99 -49.995 -50 -50.005 -50.01 -50.015 -50.02 -50.025 -50.03 -50.035 -50.04 -50.045 -50.05 -50.055 -50.06 -50.065 -50.07 -50.075 -50.08 -50.085 -50.09 -50.095 -50.1 -50.105 -50.11 -50.115 -50.12 -50.125 -50.13 -50.135 -50.14 -50.145 -50.15 -50.155 -50.16 -50.165 -50.17 -50.175 -50.18 -50.185 -50.19 -50.195 -50.2 -50.205 -50.21 -50.215 -50.22 -50.225 -50.23 -50.235 -50.24 -50.245 -50.25 -50.255 -50.26 -50.265 -50.27 -50.275 -50.28 -50.285 -50.29 -50.295 -50.3 -50.305 -50.31 -50.315 -50.32 -50.325 -50.33 -50.335 -50.34 -50.345 -50.35 -50.355 -50.36 -50.365 -50.37 -50.375 -50.38 -50.385 -50.39 -50.395 -50.4 -50.405 -50.41 -50.415 -50.42 -50.425 -50.43 -50.435 -50.44 -50.445 -50.45 -50.455 -50.46 -50.465 -50.47 -50.475 -50.48 -50.485 -50.49 -50.495 -50.5 -50.505 -50.51 -50.515 -50.52 -50.525 -50.53 -50.535 -50.54 -50.545 -50.55 -50.555 -50.56 -50.565 -50.57 -50.575 -50.58 -50.585 -50.59 -50.595 -50.6 -50.605 -50.61 -50.615 -50.62 -50.625 -50.63 -50.635 -50.64 -50.645 -50.65 -50.655 -50.66 -50.665 -50.67 -50.675 -50.68 -50.685 -50.69 -50.695 -50.7 -50.705 -50.71 -50.715 -50.72 -50.725 -50.73 -50.735 -50.74 -50.745 -50.75 -50.755 -50.76 -50.765 -50.77 -50.775 -50.78 -50.785 -50.79 -50.795 -50.8 -50.805 -50.81 -50.815 -50.82 -50.825 -50.83 -50.835 -50.84 -50.845 -50.85 -50.855 -50.86 -50.865 -50.87 -50.875 -50.88 -50.885 -50.89 -50.895 -50.9 -50.905 -50.91 -50.915 -50.92 -50.925 -50.93 -50.935 -50.94 -50.945 -50.95 -50.955 -50.96 -50.965 -50.97 -50.975 -50.98 -50.985 -50.99 -50.995 -51 -51.005 -51.01 -51.015 -51.02 -51.025 -51.03 -51.035 -51.04 -51.045 -51.05 -51.055 -51.06 -51.065 -51.07 -51.075 -51.08 -51.085 -51.09 -51.095 -51.1 -51.105 -51.11 -51.115 -51.12 -51.125 -51.13 -51.135 -51.14 -51.145 -51.15 -51.155 -51.16 -51.165 -51.17 -51.175 -51.18 -51.185 -51.19 -51.195 -51.2 -51.205 -51.21 -51.215 -51.22 -51.225 -51.23 -51.235 -51.24 -51.245 -51.25 -51.255 -51.26 -51.265 -51.27 -51.275 -51.28 -51.285 -51.29 -51.295 -51.3 -51.305 -51.31 -51.315 -51.32 -51.325 -51.33 -51.335 -51.34 -51.345 -51.35 -51.355 -51.36 -51.365 -51.37 -51.375 -51.38 -51.385 -51.39 -51.395 -51.4 -51.405 -51.41 -51.415 -51.42 -51.425 -51.43 -51.435 -51.44 -51.445 -51.45 -51.455 -51.46 -51.465 -51.47 -51.475 -51.48 -51.485 -51.49 -51.495 -51.5 -51.505 -51.51 -51.515 -51.52 -51.525 -51.53 -51.535 -51.54 -51.545 -51.55 -51.555 -51.56 -51.565 -51.57 -51.575 -51.58 -51.585 -51.59 -51.595 -51.6 -51.605 -51.61 -51.615 -51.62 -51.625 -51.63 -51.635 -51.64 -51.645 -51.65 -51.655 -51.66 -51.665 -51.67 -51.675 -51.68 -51.685 -51.69 -51.695 -51.7 -51.705 -51.71 -51.715 -51.72 -51.725 -51.73 -51.735 -51.74 -51.745 -51.75 -51.755 -51.76 -51.765 -51.77 -51.775 -51.78 -51.785 -51.79 -51.795 -51.8 -51.805 -51.81 -51.815 -51.82 -51.825 -51.83 -51.835 -51.84 -51.845 -51.85 -51.855 -51.86 -51.865 -51.87 -51.875 -51.88 -51.885 -51.89 -51.895 -51.9 -51.905 -51.91 -51.915 -51.92 -51.925 -51.93 -51.935 -51.94 -51.945 -51.95 -51.955 -51.96 -51.965 -51.97 -51.975 -51.98 -51.985 -51.99 -51.995 -52 -52.005 -52.01 -52.015 -52.02 -52.025 -52.03 -52.035 -52.04 -52.045 -52.05 -52.055 -52.06 -52.065 -52.07 -52.075 -52.08 -52.085 -52.09 -52.095 -52.1 -52.105 -52.11 -52.115 -52.12 -52.125 -52.13 -52.135 -52.14 -52.145 -52.15 -52.155 -52.16 -52.165 -52.17 -52.175 -52.18 -52.185 -52.19 -52.195 -52.2 -52.205 -52.21 -52.215 -52.22 -52.225 -52.23 -52.235 -52.24 -52.245 -52.25 -52.255 -52.26 -52.265 -52.27 -52.275 -52.28 -52.285 -52.29 -52.295 -52.3 -52.305 -52.31 -52.315 -52.32 -52.325 -52.33 -52.335 -52.34 -52.345 -52.35 -52.355 -52.36 -52.365 -52.37 -52.375 -52.38 -52.385 -52.39 -52.395 -52.4 -52.405 -52.41 -52.415 -52.42 -52.425 -52.43 -52.435 -52.44 -52.445 -52.45 -52.455 -52.46 -52.465 -52.47 -52.475 -52.48 -52.485 -52.49 -52.495 -52.5 -52.505 -52.51 -52.515 -52.52 -52.525 -52.53 -52.535 -52.54 -52.545 -52.55 -52.555 -52.56 -52.565 -52.57 -52.575 -52.58 -52.585 -52.59 -52.595 -52.6 -52.605 -52.61 -52.615 -52.62 -52.625 -52.63 -52.635 -52.64 -52.645 -52.65 -52.655 -52.66 -52.665 -52.67 -52.675 -52.68 -52.685 -52.69 -52.695 -52.7 -52.705 -52.71 -52.715 -52.72 -52.725 -52.73 -52.735 -52.74 -52.745 -52.75 -52.755 -52.76 -52.765 -52.77 -52.775 -52.78 -52.785 -52.79 -52.795 -52.8 -52.805 -52.81 -52.815 -52.82 -52.825 -52.83 -52.835 -52.84 -52.845 -52.85 -52.855 -52.86 -52.865 -52.87 -52.875 -52.88 -52.885 -52.89 -52.895 -52.9 -52.905 -52.91 -52.915 -52.92 -52.925 -52.93 -52.935 -52.94 -52.945 -52.95 -52.955 -52.96 -52.965 -52.97 -52.975 -52.98 -52.985 -52.99 -52.995 -53 -53.005 -53.01 -53.015 -53.02 -53.025 -53.03 -53.035 -53.04 -53.045 -53.05 -53.055 -53.06 -53.065 -53.07 -53.075 -53.08 -53.085 -53.09 -53.095 -53.1 -53.105 -53.11 -53.115 -53.12 -53.125 -53.13 -53.135 -53.14 -53.145 -53.15 -53.155 -53.16 -53.165 -53.17 -53.175 -53.18 -53.185 -53.19 -53.195 -53.2 -53.205 -53.21 -53.215 -53.22 -53.225 -53.23 -53.235 -53.24 -53.245 -53.25 -53.255 -53.26 -53.265 -53.27 -53.275 -53.28 -53.285 -53.29 -53.295 -53.3 -53.305 -53.31 -53.315 -53.32 -53.325 -53.33 -53.335 -53.34 -53.345 -53.35 -53.355 -53.36 -53.365 -53.37 -53.375 -53.38 -53.385 -53.39 -53.395 -53.4 -53.405 -53.41 -53.415 -53.42 -53.425 -53.43 -53.435 -53.44 -53.445 -53.45 -53.455 -53.46 -53.465 -53.47 -53.475 -53.48 -53.485 -53.49 -53.495 -53.5 -53.505 -53.51 -53.515 -53.52 -53.525 -53.53 -53.535 -53.54 -53.545 -53.55 -53.555 -53.56 -53.565 -53.57 -53.575 -53.58 -53.585 -53.59 -53.595 -53.6 -53.605 -53.61 -53.615 -53.62 -53.625 -53.63 -53.635 -53.64 -53.645 -53.65 -53.655 -53.66 -53.665 -53.67 -53.675 -53.68 -53.685 -53.69 -53.695 -53.7 -53.705 -53.71 -53.715 -53.72 -53.725 -53.73 -53.735 -53.74 -53.745 -53.75 -53.755 -53.76 -53.765 -53.77 -53.775 -53.78 -53.785 -53.79 -53.795 -53.8 -53.805 -53.81 -53.815 -53.82 -53.825 -53.83 -53.835 -53.84 -53.845 -53.85 -53.855 -53.86 -53.865 -53.87 -53.875 -53.88 -53.885 -53.89 -53.895 -53.9 -53.905 -53.91 -53.915 -53.92 -53.925 -53.93 -53.935 -53.94 -53.945 -53.95 -53.955 -53.96 -53.965 -53.97 -53.975 -53.98 -53.985 -53.99 -53.995 -54 -54.005 -54.01 -54.015 -54.02 -54.025 -54.03 -54.035 -54.04 -54.045 -54.05 -54.055 -54.06 -54.065 -54.07 -54.075 -54.08 -54.085 -54.09 -54.095 -54.1 -54.105 -54.11 -54.115 -54.12 -54.125 -54.13 -54.135 -54.14 -54.145 -54.15 -54.155 -54.16 -54.165 -54.17 -54.175 -54.18 -54.185 -54.19 -54.195 -54.2 -54.205 -54.21 -54.215 -54.22 -54.225 -54.23 -54.235 -54.24 -54.245 -54.25 -54.255 -54.26 -54.265 -54.27 -54.275 -54.28 -54.285 -54.29 -54.295 -54.3 -54.305 -54.31 -54.315 -54.32 -54.325 -54.33 -54.335 -54.34 -54.345 -54.35 -54.355 -54.36 -54.365 -54.37 -54.375 -54.38 -54.385 -54.39 -54.395 -54.4 -54.405 -54.41 -54.415 -54.42 -54.425 -54.43 -54.435 -54.44 -54.445 -54.45 -54.455 -54.46 -54.465 -54.47 -54.475 -54.48 -54.485 -54.49 -54.495 -54.5 -54.505 -54.51 -54.515 -54.52 -54.525 -54.53 -54.535 -54.54 -54.545 -54.55 -54.555 -54.56 -54.565 -54.57 -54.575 -54.58 -54.585 -54.59 -54.595 -54.6 -54.605 -54.61 -54.615 -54.62 -54.625 -54.63 -54.635 -54.64 -54.645 -54.65 -54.655 -54.66 -54.665 -54.67 -54.675 -54.68 -54.685 -54.69 -54.695 -54.7 -54.705 -54.71 -54.715 -54.72 -54.725 -54.73 -54.735 -54.74 -54.745 -54.75 -54.755 -54.76 -54.765 -54.77 -54.775 -54.78 -54.785 -54.79 -54.795 -54.8 -54.805 -54.81 -54.815 -54.82 -54.825 -54.83 -54.835 -54.84 -54.845 -54.85 -54.855 -54.86 -54.865 -54.87 -54.875 -54.88 -54.885 -54.89 -54.895 -54.9 -54.905 -54.91 -54.915 -54.92 -54.925 -54.93 -54.935 -54.94 -54.945 -54.95 -54.955 -54.96 -54.965 -54.97 -54.975 -54.98 -54.985 -54.99 -54.995 -55 -55.005 -55.01 -55.015 -55.02 -55.025 -55.03 -55.035 -55.04 -55.045 -55.05 -55.055 -55.06 -55.065 -55.07 -55.075 -55.08 -55.085 -55.09 -55.095 -55.1 -55.105 -55.11 -55.115 -55.12 -55.125 -55.13 -55.135 -55.14 -55.145 -55.15 -55.155 -55.16 -55.165 -55.17 -55.175 -55.18 -55.185 -55.19 -55.195 -55.2 -55.205 -55.21 -55.215 -55.22 -55.225 -55.23 -55.235 -55.24 -55.245 -55.25 -55.255 -55.26 -55.265 -55.27 -55.275 -55.28 -55.285 -55.29 -55.295 -55.3 -55.305 -55.31 -55.315 -55.32 -55.325 -55.33 -55.335 -55.34 -55.345 -55.35 -55.355 -55.36 -55.365 -55.37 -55.375 -55.38 -55.385 -55.39 -55.395 -55.4 -55.405 -55.41 -55.415 -55.42 -55.425 -55.43 -55.435 -55.44 -55.445 -55.45 -55.455 -55.46 -55.465 -55.47 -55.475 -55.48 -55.485 -55.49 -55.495 -55.5 -55.505 -55.51 -55.515 -55.52 -55.525 -55.53 -55.535 -55.54 -55.545 -55.55 -55.555 -55.56 -55.565 -55.57 -55.575 -55.58 -55.585 -55.59 -55.595 -55.6 -55.605 -55.61 -55.615 -55.62 -55.625 -55.63 -55.635 -55.64 -55.645 -55.65 -55.655 -55.66 -55.665 -55.67 -55.675 -55.68 -55.685 -55.69 -55.695 -55.7 -55.705 -55.71 -55.715 -55.72 -55.725 -55.73 -55.735 -55.74 -55.745 -55.75 -55.755 -55.76 -55.765 -55.77 -55.775 -55.78 -55.785 -55.79 -55.795 -55.8 -55.805 -55.81 -55.815 -55.82 -55.825 -55.83 -55.835 -55.84 -55.845 -55.85 -55.855 -55.86 -55.865 -55.87 -55.875 -55.88 -55.885 -55.89 -55.895 -55.9 -55.905 -55.91 -55.915 -55.92 -55.925 -55.93 -55.935 -55.94 -55.945 -55.95 -55.955 -55.96 -55.965 -55.97 -55.975 -55.98 -55.985 -55.99 -55.995 -56 -56.005 -56.01 -56.015 -56.02 -56.025 -56.03 -56.035 -56.04 -56.045 -56.05 -56.055 -56.06 -56.065 -56.07 -56.075 -56.08 -56.085 -56.09 -56.095 -56.1 -56.105 -56.11 -56.115 -56.12 -56.125 -56.13 -56.135 -56.14 -56.145 -56.15 -56.155 -56.16 -56.165 -56.17 -56.175 -56.18 -56.185 -56.19 -56.195 -56.2 -56.205 -56.21 -56.215 -56.22 -56.225 -56.23 -56.235 -56.24 -56.245 -56.25 -56.255 -56.26 -56.265 -56.27 -56.275 -56.28 -56.285 -56.29 -56.295 -56.3 -56.305 -56.31 -56.315 -56.32 -56.325 -56.33 -56.335 -56.34 -56.345 -56.35 -56.355 -56.36 -56.365 -56.37 -56.375 -56.38 -56.385 -56.39 -56.395 -56.4 -56.405 -56.41 -56.415 -56.42 -56.425 -56.43 -56.435 -56.44 -56.445 -56.45 -56.455 -56.46 -56.465 -56.47 -56.475 -56.48 -56.485 -56.49 -56.495 -56.5 -56.505 -56.51 -56.515 -56.52 -56.525 -56.53 -56.535 -56.54 -56.545 -56.55 -56.555 -56.56 -56.565 -56.57 -56.575 -56.58 -56.585 -56.59 -56.595 -56.6 -56.605 -56.61 -56.615 -56.62 -56.625 -56.63 -56.635 -56.64 -56.645 -56.65 -56.655 -56.66 -56.665 -56.67 -56.675 -56.68 -56.685 -56.69 -56.695 -56.7 -56.705 -56.71 -56.715 -56.72 -56.725 -56.73 -56.735 -56.74 -56.745 -56.75 -56.755 -56.76 -56.765 -56.77 -56.775 -56.78 -56.785 -56.79 -56.795 -56.8 -56.805 -56.81 -56.815 -56.82 -56.825 -56.83 -56.835 -56.84 -56.845 -56.85 -56.855 -56.86 -56.865 -56.87 -56.875 -56.88 -56.885 -56.89 -56.895 -56.9 -56.905 -56.91 -56.915 -56.92 -56.925 -56.93 -56.935 -56.94 -56.945 -56.95 -56.955 -56.96 -56.965 -56.97 -56.975 -56.98 -56.985 -56.99 -56.995 -57 -57.005 -57.01 -57.015 -57.02 -57.025 -57.03 -57.035 -57.04 -57.045 -57.05 -57.055 -57.06 -57.065 -57.07 -57.075 -57.08 -57.085 -57.09 -57.095 -57.1 -57.105 -57.11 -57.115 -57.12 -57.125 -57.13 -57.135 -57.14 -57.145 -57.15 -57.155 -57.16 -57.165 -57.17 -57.175 -57.18 -57.185 -57.19 -57.195 -57.2 -57.205 -57.21 -57.215 -57.22 -57.225 -57.23 -57.235 -57.24 -57.245 -57.25 -57.255 -57.26 -57.265 -57.27 -57.275 -57.28 -57.285 -57.29 -57.295 -57.3 -57.305 -57.31 -57.315 -57.32 -57.325 -57.33 -57.335 -57.34 -57.345 -57.35 -57.355 -57.36 -57.365 -57.37 -57.375 -57.38 -57.385 -57.39 -57.395 -57.4 -57.405 -57.41 -57.415 -57.42 -57.425 -57.43 -57.435 -57.44 -57.445 -57.45 -57.455 -57.46 -57.465 -57.47 -57.475 -57.48 -57.485 -57.49 -57.495 -57.5 -57.505 -57.51 -57.515 -57.52 -57.525 -57.53 -57.535 -57.54 -57.545 -57.55 -57.555 -57.56 -57.565 -57.57 -57.575 -57.58 -57.585 -57.59 -57.595 -57.6 -57.605 -57.61 -57.615 -57.62 -57.625 -57.63 -57.635 -57.64 -57.645 -57.65 -57.655 -57.66 -57.665 -57.67 -57.675 -57.68 -57.685 -57.69 -57.695 -57.7 -57.705 -57.71 -57.715 -57.72 -57.725 -57.73 -57.735 -57.74 -57.745 -57.75 -57.755 -57.76 -57.765 -57.77 -57.775 -57.78 -57.785 -57.79 -57.795 -57.8 -57.805 -57.81 -57.815 -57.82 -57.825 -57.83 -57.835 -57.84 -57.845 -57.85 -57.855 -57.86 -57.865 -57.87 -57.875 -57.88 -57.885 -57.89 -57.895 -57.9 -57.905 -57.91 -57.915 -57.92 -57.925 -57.93 -57.935 -57.94 -57.945 -57.95 -57.955 -57.96 -57.965 -57.97 -57.975 -57.98 -57.985 -57.99 -57.995 -58 -58.005 -58.01 -58.015 -58.02 -58.025 -58.03 -58.035 -58.04 -58.045 -58.05 -58.055 -58.06 -58.065 -58.07 -58.075 -58.08 -58.085 -58.09 -58.095 -58.1 -58.105 -58.11 -58.115 -58.12 -58.125 -58.13 -58.135 -58.14 -58.145 -58.15 -58.155 -58.16 -58.165 -58.17 -58.175 -58.18 -58.185 -58.19 -58.195 -58.2 -58.205 -58.21 -58.215 -58.22 -58.225 -58.23 -58.235 -58.24 -58.245 -58.25 -58.255 -58.26 -58.265 -58.27 -58.275 -58.28 -58.285 -58.29 -58.295 -58.3 -58.305 -58.31 -58.315 -58.32 -58.325 -58.33 -58.335 -58.34 -58.345 -58.35 -58.355 -58.36 -58.365 -58.37 -58.375 -58.38 -58.385 -58.39 -58.395 -58.4 -58.405 -58.41 -58.415 -58.42 -58.425 -58.43 -58.435 -58.44 -58.445 -58.45 -58.455 -58.46 -58.465 -58.47 -58.475 -58.48 -58.485 -58.49 -58.495 -58.5 -58.505 -58.51 -58.515 -58.52 -58.525 -58.53 -58.535 -58.54 -58.545 -58.55 -58.555 -58.56 -58.565 -58.57 -58.575 -58.58 -58.585 -58.59 -58.595 -58.6 -58.605 -58.61 -58.615 -58.62 -58.625 -58.63 -58.635 -58.64 -58.645 -58.65 -58.655 -58.66 -58.665 -58.67 -58.675 -58.68 -58.685 -58.69 -58.695 -58.7 -58.705 -58.71 -58.715 -58.72 -58.725 -58.73 -58.735 -58.74 -58.745 -58.75 -58.755 -58.76 -58.765 -58.77 -58.775 -58.78 -58.785 -58.79 -58.795 -58.8 -58.805 -58.81 -58.815 -58.82 -58.825 -58.83 -58.835 -58.84 -58.845 -58.85 -58.855 -58.86 -58.865 -58.87 -58.875 -58.88 -58.885 -58.89 -58.895 -58.9 -58.905 -58.91 -58.915 -58.92 -58.925 -58.93 -58.935 -58.94 -58.945 -58.95 -58.955 -58.96 -58.965 -58.97 -58.975 -58.98 -58.985 -58.99 -58.995 -59 -59.005 -59.01 -59.015 -59.02 -59.025 -59.03 -59.035 -59.04 -59.045 -59.05 -59.055 -59.06 -59.065 -59.07 -59.075 -59.08 -59.085 -59.09 -59.095 -59.1 -59.105 -59.11 -59.115 -59.12 -59.125 -59.13 -59.135 -59.14 -59.145 -59.15 -59.155 -59.16 -59.165 -59.17 -59.175 -59.18 -59.185 -59.19 -59.195 -59.2 -59.205 -59.21 -59.215 -59.22 -59.225 -59.23 -59.235 -59.24 -59.245 -59.25 -59.255 -59.26 -59.265 -59.27 -59.275 -59.28 -59.285 -59.29 -59.295 -59.3 -59.305 -59.31 -59.315 -59.32 -59.325 -59.33 -59.335 -59.34 -59.345 -59.35 -59.355 -59.36 -59.365 -59.37 -59.375 -59.38 -59.385 -59.39 -59.395 -59.4 -59.405 -59.41 -59.415 -59.42 -59.425 -59.43 -59.435 -59.44 -59.445 -59.45 -59.455 -59.46 -59.465 -59.47 -59.475 -59.48 -59.485 -59.49 -59.495 -59.5 -59.505 -59.51 -59.515 -59.52 -59.525 -59.53 -59.535 -59.54 -59.545 -59.55 -59.555 -59.56 -59.565 -59.57 -59.575 -59.58 -59.585 -59.59 -59.595 -59.6 -59.605 -59.61 -59.615 -59.62 -59.625 -59.63 -59.635 -59.64 -59.645 -59.65 -59.655 -59.66 -59.665 -59.67 -59.675 -59.68 -59.685 -59.69 -59.695 -59.7 -59.705 -59.71 -59.715 -59.72 -59.725 -59.73 -59.735 -59.74 -59.745 -59.75 -59.755 -59.76 -59.765 -59.77 -59.775 -59.78 -59.785 -59.79 -59.795 -59.8 -59.805 -59.81 -59.815 -59.82 -59.825 -59.83 -59.835 -59.84 -59.845 -59.85 -59.855 -59.86 -59.865 -59.87 -59.875 -59.88 -59.885 -59.89 -59.895 -59.9 -59.905 -59.91 -59.915 -59.92 -59.925 -59.93 -59.935 -59.94 -59.945 -59.95 -59.955 -59.96 -59.965 -59.97 -59.975 -59.98 -59.985 -59.99 -59.995 -60 -60.005 -60.01 -60.015 -60.02 -60.025 -60.03 -60.035 -60.04 -60.045 -60.05 -60.055 -60.06 -60.065 -60.07 -60.075 -60.08 -60.085 -60.09 -60.095 -60.1 -60.105 -60.11 -60.115 -60.12 -60.125 -60.13 -60.135 -60.14 -60.145 -60.15 -60.155 -60.16 -60.165 -60.17 -60.175 -60.18 -60.185 -60.19 -60.195 -60.2 -60.205 -60.21 -60.215 -60.22 -60.225 -60.23 -60.235 -60.24 -60.245 -60.25 -60.255 -60.26 -60.265 -60.27 -60.275 -60.28 -60.285 -60.29 -60.295 -60.3 -60.305 -60.31 -60.315 -60.32 -60.325 -60.33 -60.335 -60.34 -60.345 -60.35 -60.355 -60.36 -60.365 -60.37 -60.375 -60.38 -60.385 -60.39 -60.395 -60.4 -60.405 -60.41 -60.415 -60.42 -60.425 -60.43 -60.435 -60.44 -60.445 -60.45 -60.455 -60.46 -60.465 -60.47 -60.475 -60.48 -60.485 -60.49 -60.495 -60.5 -60.505 -60.51 -60.515 -60.52 -60.525 -60.53 -60.535 -60.54 -60.545 -60.55 -60.555 -60.56 -60.565 -60.57 -60.575 -60.58 -60.585 -60.59 -60.595 -60.6 -60.605 -60.61 -60.615 -60.62 -60.625 -60.63 -60.635 -60.64 -60.645 -60.65 -60.655 -60.66 -60.665 -60.67 -60.675 -60.68 -60.685 -60.69 -60.695 -60.7 -60.705 -60.71 -60.715 -60.72 -60.725 -60.73 -60.735 -60.74 -60.745 -60.75 -60.755 -60.76 -60.765 -60.77 -60.775 -60.78 -60.785 -60.79 -60.795 -60.8 -60.805 -60.81 -60.815 -60.82 -60.825 -60.83 -60.835 -60.84 -60.845 -60.85 -60.855 -60.86 -60.865 -60.87 -60.875 -60.88 -60.885 -60.89 -60.895 -60.9 -60.905 -60.91 -60.915 -60.92 -60.925 -60.93 -60.935 -60.94 -60.945 -60.95 -60.955 -60.96 -60.965 -60.97 -60.975 -60.98 -60.985 -60.99 -60.995 -61 -61.005 -61.01 -61.015 -61.02 -61.025 -61.03 -61.035 -61.04 -61.045 -61.05 -61.055 -61.06 -61.065 -61.07 -61.075 -61.08 -61.085 -61.09 -61.095 -61.1 -61.105 -61.11 -61.115 -61.12 -61.125 -61.13 -61.135 -61.14 -61.145 -61.15 -61.155 -61.16 -61.165 -61.17 -61.175 -61.18 -61.185 -61.19 -61.195 -61.2 -61.205 -61.21 -61.215 -61.22 -61.225 -61.23 -61.235 -61.24 -61.245 -61.25 -61.255 -61.26 -61.265 -61.27 -61.275 -61.28 -61.285 -61.29 -61.295 -61.3 -61.305 -61.31 -61.315 -61.32 -61.325 -61.33 -61.335 -61.34 -61.345 -61.35 -61.355 -61.36 -61.365 -61.37 -61.375 -61.38 -61.385 -61.39 -61.395 -61.4 -61.405 -61.41 -61.415 -61.42 -61.425 -61.43 -61.435 -61.44 -61.445 -61.45 -61.455 -61.46 -61.465 -61.47 -61.475 -61.48 -61.485 -61.49 -61.495 -61.5 -61.505 -61.51 -61.515 -61.52 -61.525 -61.53 -61.535 -61.54 -61.545 -61.55 -61.555 -61.56 -61.565 -61.57 -61.575 -61.58 -61.585 -61.59 -61.595 -61.6 -61.605 -61.61 -61.615 -61.62 -61.625 -61.63 -61.635 -61.64 -61.645 -61.65 -61.655 -61.66 -61.665 -61.67 -61.675 -61.68 -61.685 -61.69 -61.695 -61.7 -61.705 -61.71 -61.715 -61.72 -61.725 -61.73 -61.735 -61.74 -61.745 -61.75 -61.755 -61.76 -61.765 -61.77 -61.775 -61.78 -61.785 -61.79 -61.795 -61.8 -61.805 -61.81 -61.815 -61.82 -61.825 -61.83 -61.835 -61.84 -61.845 -61.85 -61.855 -61.86 -61.865 -61.87 -61.875 -61.88 -61.885 -61.89 -61.895 -61.9 -61.905 -61.91 -61.915 -61.92 -61.925 -61.93 -61.935 -61.94 -61.945 -61.95 -61.955 -61.96 -61.965 -61.97 -61.975 -61.98 -61.985 -61.99 -61.995 -62 -62.005 -62.01 -62.015 -62.02 -62.025 -62.03 -62.035 -62.04 -62.045 -62.05 -62.055 -62.06 -62.065 -62.07 -62.075 -62.08 -62.085 -62.09 -62.095 -62.1 -62.105 -62.11 -62.115 -62.12 -62.125 -62.13 -62.135 -62.14 -62.145 -62.15 -62.155 -62.16 -62.165 -62.17 -62.175 -62.18 -62.185 -62.19 -62.195 -62.2 -62.205 -62.21 -62.215 -62.22 -62.225 -62.23 -62.235 -62.24 -62.245 -62.25 -62.255 -62.26 -62.265 -62.27 -62.275 -62.28 -62.285 -62.29 -62.295 -62.3 -62.305 -62.31 -62.315 -62.32 -62.325 -62.33 -62.335 -62.34 -62.345 -62.35 -62.355 -62.36 -62.365 -62.37 -62.375 -62.38 -62.385 -62.39 -62.395 -62.4 -62.405 -62.41 -62.415 -62.42 -62.425 -62.43 -62.435 -62.44 -62.445 -62.45 -62.455 -62.46 -62.465 -62.47 -62.475 -62.48 -62.485 -62.49 -62.495 -62.5 -62.505 -62.51 -62.515 -62.52 -62.525 -62.53 -62.535 -62.54 -62.545 -62.55 -62.555 -62.56 -62.565 -62.57 -62.575 -62.58 -62.585 -62.59 -62.595 -62.6 -62.605 -62.61 -62.615 -62.62 -62.625 -62.63 -62.635 -62.64 -62.645 -62.65 -62.655 -62.66 -62.665 -62.67 -62.675 -62.68 -62.685 -62.69 -62.695 -62.7 -62.705 -62.71 -62.715 -62.72 -62.725 -62.73 -62.735 -62.74 -62.745 -62.75 -62.755 -62.76 -62.765 -62.77 -62.775 -62.78 -62.785 -62.79 -62.795 -62.8 -62.805 -62.81 -62.815 -62.82 -62.825 -62.83 -62.835 -62.84 -62.845 -62.85 -62.855 -62.86 -62.865 -62.87 -62.875 -62.88 -62.885 -62.89 -62.895 -62.9 -62.905 -62.91 -62.915 -62.92 -62.925 -62.93 -62.935 -62.94 -62.945 -62.95 -62.955 -62.96 -62.965 -62.97 -62.975 -62.98 -62.985 -62.99 -62.995 -63 -63.005 -63.01 -63.015 -63.02 -63.025 -63.03 -63.035 -63.04 -63.045 -63.05 -63.055 -63.06 -63.065 -63.07 -63.075 -63.08 -63.085 -63.09 -63.095 -63.1 -63.105 -63.11 -63.115 -63.12 -63.125 -63.13 -63.135 -63.14 -63.145 -63.15 -63.155 -63.16 -63.165 -63.17 -63.175 -63.18 -63.185 -63.19 -63.195 -63.2 -63.205 -63.21 -63.215 -63.22 -63.225 -63.23 -63.235 -63.24 -63.245 -63.25 -63.255 -63.26 -63.265 -63.27 -63.275 -63.28 -63.285 -63.29 -63.295 -63.3 -63.305 -63.31 -63.315 -63.32 -63.325 -63.33 -63.335 -63.34 -63.345 -63.35 -63.355 -63.36 -63.365 -63.37 -63.375 -63.38 -63.385 -63.39 -63.395 -63.4 -63.405 -63.41 -63.415 -63.42 -63.425 -63.43 -63.435 -63.44 -63.445 -63.45 -63.455 -63.46 -63.465 -63.47 -63.475 -63.48 -63.485 -63.49 -63.495 -63.5 -63.505 -63.51 -63.515 -63.52 -63.525 -63.53 -63.535 -63.54 -63.545 -63.55 -63.555 -63.56 -63.565 -63.57 -63.575 -63.58 -63.585 -63.59 -63.595 -63.6 -63.605 -63.61 -63.615 -63.62 -63.625 -63.63 -63.635 -63.64 -63.645 -63.65 -63.655 -63.66 -63.665 -63.67 -63.675 -63.68 -63.685 -63.69 -63.695 -63.7 -63.705 -63.71 -63.715 -63.72 -63.725 -63.73 -63.735 -63.74 -63.745 -63.75 -63.755 -63.76 -63.765 -63.77 -63.775 -63.78 -63.785 -63.79 -63.795 -63.8 -63.805 -63.81 -63.815 -63.82 -63.825 -63.83 -63.835 -63.84 -63.845 -63.85 -63.855 -63.86 -63.865 -63.87 -63.875 -63.88 -63.885 -63.89 -63.895 -63.9 -63.905 -63.91 -63.915 -63.92 -63.925 -63.93 -63.935 -63.94 -63.945 -63.95 -63.955 -63.96 -63.965 -63.97 -63.975 -63.98 -63.985 -63.99 -63.995 -64 -64.005 -64.01 -64.015 -64.02 -64.025 -64.03 -64.035 -64.04 -64.045 -64.05 -64.055 -64.06 -64.065 -64.07 -64.075 -64.08 -64.085 -64.09 -64.095 -64.1 -64.105 -64.11 -64.115 -64.12 -64.125 -64.13 -64.135 -64.14 -64.145 -64.15 -64.155 -64.16 -64.165 -64.17 -64.175 -64.18 -64.185 -64.19 -64.195 -64.2 -64.205 -64.21 -64.215 -64.22 -64.225 -64.23 -64.235 -64.24 -64.245 -64.25 -64.255 -64.26 -64.265 -64.27 -64.275 -64.28 -64.285 -64.29 -64.295 -64.3 -64.305 -64.31 -64.315 -64.32 -64.325 -64.33 -64.335 -64.34 -64.345 -64.35 -64.355 -64.36 -64.365 -64.37 -64.375 -64.38 -64.385 -64.39 -64.395 -64.4 -64.405 -64.41 -64.415 -64.42 -64.425 -64.43 -64.435 -64.44 -64.445 -64.45 -64.455 -64.46 -64.465 -64.47 -64.475 -64.48 -64.485 -64.49 -64.495 -64.5 -64.505 -64.51 -64.515 -64.52 -64.525 -64.53 -64.535 -64.54 -64.545 -64.55 -64.555 -64.56 -64.565 -64.57 -64.575 -64.58 -64.585 -64.59 -64.595 -64.6 -64.605 -64.61 -64.615 -64.62 -64.625 -64.63 -64.635 -64.64 -64.645 -64.65 -64.655 -64.66 -64.665 -64.67 -64.675 -64.68 -64.685 -64.69 -64.695 -64.7 -64.705 -64.71 -64.715 -64.72 -64.725 -64.73 -64.735 -64.74 -64.745 -64.75 -64.755 -64.76 -64.765 -64.77 -64.775 -64.78 -64.785 -64.79 -64.795 -64.8 -64.805 -64.81 -64.815 -64.82 -64.825 -64.83 -64.835 -64.84 -64.845 -64.85 -64.855 -64.86 -64.865 -64.87 -64.875 -64.88 -64.885 -64.89 -64.895 -64.9 -64.905 -64.91 -64.915 -64.92 -64.925 -64.93 -64.935 -64.94 -64.945 -64.95 -64.955 -64.96 -64.965 -64.97 -64.975 -64.98 -64.985 -64.99 -64.995 -65 -65.005 -65.01 -65.015 -65.02 -65.025 -65.03 -65.035 -65.04 -65.045 -65.05 -65.055 -65.06 -65.065 -65.07 -65.075 -65.08 -65.085 -65.09 -65.095 -65.1 -65.105 -65.11 -65.115 -65.12 -65.125 -65.13 -65.135 -65.14 -65.145 -65.15 -65.155 -65.16 -65.165 -65.17 -65.175 -65.18 -65.185 -65.19 -65.195 -65.2 -65.205 -65.21 -65.215 -65.22 -65.225 -65.23 -65.235 -65.24 -65.245 -65.25 -65.255 -65.26 -65.265 -65.27 -65.275 -65.28 -65.285 -65.29 -65.295 -65.3 -65.305 -65.31 -65.315 -65.32 -65.325 -65.33 -65.335 -65.34 -65.345 -65.35 -65.355 -65.36 -65.365 -65.37 -65.375 -65.38 -65.385 -65.39 -65.395 -65.4 -65.405 -65.41 -65.415 -65.42 -65.425 -65.43 -65.435 -65.44 -65.445 -65.45 -65.455 -65.46 -65.465 -65.47 -65.475 -65.48 -65.485 -65.49 -65.495 -65.5 -65.505 -65.51 -65.515 -65.52 -65.525 -65.53 -65.535 -65.54 -65.545 -65.55 -65.555 -65.56 -65.565 -65.57 -65.575 -65.58 -65.585 -65.59 -65.595 -65.6 -65.605 -65.61 -65.615 -65.62 -65.625 -65.63 -65.635 -65.64 -65.645 -65.65 -65.655 -65.66 -65.665 -65.67 -65.675 -65.68 -65.685 -65.69 -65.695 -65.7 -65.705 -65.71 -65.715 -65.72 -65.725 -65.73 -65.735 -65.74 -65.745 -65.75 -65.755 -65.76 -65.765 -65.77 -65.775 -65.78 -65.785 -65.79 -65.795 -65.8 -65.805 -65.81 -65.815 -65.82 -65.825 -65.83 -65.835 -65.84 -65.845 -65.85 -65.855 -65.86 -65.865 -65.87 -65.875 -65.88 -65.885 -65.89 -65.895 -65.9 -65.905 -65.91 -65.915 -65.92 -65.925 -65.93 -65.935 -65.94 -65.945 -65.95 -65.955 -65.96 -65.965 -65.97 -65.975 -65.98 -65.985 -65.99 -65.995 -66 -66.005 -66.01 -66.015 -66.02 -66.025 -66.03 -66.035 -66.04 -66.045 -66.05 -66.055 -66.06 -66.065 -66.07 -66.075 -66.08 -66.085 -66.09 -66.095 -66.1 -66.105 -66.11 -66.115 -66.12 -66.125 -66.13 -66.135 -66.14 -66.145 -66.15 -66.155 -66.16 -66.165 -66.17 -66.175 -66.18 -66.185 -66.19 -66.195 -66.2 -66.205 -66.21 -66.215 -66.22 -66.225 -66.23 -66.235 -66.24 -66.245 -66.25 -66.255 -66.26 -66.265 -66.27 -66.275 -66.28 -66.285 -66.29 -66.295 -66.3 -66.305 -66.31 -66.315 -66.32 -66.325 -66.33 -66.335 -66.34 -66.345 -66.35 -66.355 -66.36 -66.365 -66.37 -66.375 -66.38 -66.385 -66.39 -66.395 -66.4 -66.405 -66.41 -66.415 -66.42 -66.425 -66.43 -66.435 -66.44 -66.445 -66.45 -66.455 -66.46 -66.465 -66.47 -66.475 -66.48 -66.485 -66.49 -66.495 -66.5 -66.505 -66.51 -66.515 -66.52 -66.525 -66.53 -66.535 -66.54 -66.545 -66.55 -66.555 -66.56 -66.565 -66.57 -66.575 -66.58 -66.585 -66.59 -66.595 -66.6 -66.605 -66.61 -66.615 -66.62 -66.625 -66.63 -66.635 -66.64 -66.645 -66.65 -66.655 -66.66 -66.665 -66.67 -66.675 -66.68 -66.685 -66.69 -66.695 -66.7 -66.705 -66.71 -66.715 -66.72 -66.725 -66.73 -66.735 -66.74 -66.745 -66.75 -66.755 -66.76 -66.765 -66.77 -66.775 -66.78 -66.785 -66.79 -66.795 -66.8 -66.805 -66.81 -66.815 -66.82 -66.825 -66.83 -66.835 -66.84 -66.845 -66.85 -66.855 -66.86 -66.865 -66.87 -66.875 -66.88 -66.885 -66.89 -66.895 -66.9 -66.905 -66.91 -66.915 -66.92 -66.925 -66.93 -66.935 -66.94 -66.945 -66.95 -66.955 -66.96 -66.965 -66.97 -66.975 -66.98 -66.985 -66.99 -66.995 -67 -67.005 -67.01 -67.015 -67.02 -67.025 -67.03 -67.035 -67.04 -67.045 -67.05 -67.055 -67.06 -67.065 -67.07 -67.075 -67.08 -67.085 -67.09 -67.095 -67.1 -67.105 -67.11 -67.115 -67.12 -67.125 -67.13 -67.135 -67.14 -67.145 -67.15 -67.155 -67.16 -67.165 -67.17 -67.175 -67.18 -67.185 -67.19 -67.195 -67.2 -67.205 -67.21 -67.215 -67.22 -67.225 -67.23 -67.235 -67.24 -67.245 -67.25 -67.255 -67.26 -67.265 -67.27 -67.275 -67.28 -67.285 -67.29 -67.295 -67.3 -67.305 -67.31 -67.315 -67.32 -67.325 -67.33 -67.335 -67.34 -67.345 -67.35 -67.355 -67.36 -67.365 -67.37 -67.375 -67.38 -67.385 -67.39 -67.395 -67.4 -67.405 -67.41 -67.415 -67.42 -67.425 -67.43 -67.435 -67.44 -67.445 -67.45 -67.455 -67.46 -67.465 -67.47 -67.475 -67.48 -67.485 -67.49 -67.495 -67.5 -67.505 -67.51 -67.515 -67.52 -67.525 -67.53 -67.535 -67.54 -67.545 -67.55 -67.555 -67.56 -67.565 -67.57 -67.575 -67.58 -67.585 -67.59 -67.595 -67.6 -67.605 -67.61 -67.615 -67.62 -67.625 -67.63 -67.635 -67.64 -67.645 -67.65 -67.655 -67.66 -67.665 -67.67 -67.675 -67.68 -67.685 -67.69 -67.695 -67.7 -67.705 -67.71 -67.715 -67.72 -67.725 -67.73 -67.735 -67.74 -67.745 -67.75 -67.755 -67.76 -67.765 -67.77 -67.775 -67.78 -67.785 -67.79 -67.795 -67.8 -67.805 -67.81 -67.815 -67.82 -67.825 -67.83 -67.835 -67.84 -67.845 -67.85 -67.855 -67.86 -67.865 -67.87 -67.875 -67.88 -67.885 -67.89 -67.895 -67.9 -67.905 -67.91 -67.915 -67.92 -67.925 -67.93 -67.935 -67.94 -67.945 -67.95 -67.955 -67.96 -67.965 -67.97 -67.975 -67.98 -67.985 -67.99 -67.995 -68 -68.005 -68.01 -68.015 -68.02 -68.025 -68.03 -68.035 -68.04 -68.045 -68.05 -68.055 -68.06 -68.065 -68.07 -68.075 -68.08 -68.085 -68.09 -68.095 -68.1 -68.105 -68.11 -68.115 -68.12 -68.125 -68.13 -68.135 -68.14 -68.145 -68.15 -68.155 -68.16 -68.165 -68.17 -68.175 -68.18 -68.185 -68.19 -68.195 -68.2 -68.205 -68.21 -68.215 -68.22 -68.225 -68.23 -68.235 -68.24 -68.245 -68.25 -68.255 -68.26 -68.265 -68.27 -68.275 -68.28 -68.285 -68.29 -68.295 -68.3 -68.305 -68.31 -68.315 -68.32 -68.325 -68.33 -68.335 -68.34 -68.345 -68.35 -68.355 -68.36 -68.365 -68.37 -68.375 -68.38 -68.385 -68.39 -68.395 -68.4 -68.405 -68.41 -68.415 -68.42 -68.425 -68.43 -68.435 -68.44 -68.445 -68.45 -68.455 -68.46 -68.465 -68.47 -68.475 -68.48 -68.485 -68.49 -68.495 -68.5 -68.505 -68.51 -68.515 -68.52 -68.525 -68.53 -68.535 -68.54 -68.545 -68.55 -68.555 -68.56 -68.565 -68.57 -68.575 -68.58 -68.585 -68.59 -68.595 -68.6 -68.605 -68.61 -68.615 -68.62 -68.625 -68.63 -68.635 -68.64 -68.645 -68.65 -68.655 -68.66 -68.665 -68.67 -68.675 -68.68 -68.685 -68.69 -68.695 -68.7 -68.705 -68.71 -68.715 -68.72 -68.725 -68.73 -68.735 -68.74 -68.745 -68.75 -68.755 -68.76 -68.765 -68.77 -68.775 -68.78 -68.785 -68.79 -68.795 -68.8 -68.805 -68.81 -68.815 -68.82 -68.825 -68.83 -68.835 -68.84 -68.845 -68.85 -68.855 -68.86 -68.865 -68.87 -68.875 -68.88 -68.885 -68.89 -68.895 -68.9 -68.905 -68.91 -68.915 -68.92 -68.925 -68.93 -68.935 -68.94 -68.945 -68.95 -68.955 -68.96 -68.965 -68.97 -68.975 -68.98 -68.985 -68.99 -68.995 -69 -69.005 -69.01 -69.015 -69.02 -69.025 -69.03 -69.035 -69.04 -69.045 -69.05 -69.055 -69.06 -69.065 -69.07 -69.075 -69.08 -69.085 -69.09 -69.095 -69.1 -69.105 -69.11 -69.115 -69.12 -69.125 -69.13 -69.135 -69.14 -69.145 -69.15 -69.155 -69.16 -69.165 -69.17 -69.175 -69.18 -69.185 -69.19 -69.195 -69.2 -69.205 -69.21 -69.215 -69.22 -69.225 -69.23 -69.235 -69.24 -69.245 -69.25 -69.255 -69.26 -69.265 -69.27 -69.275 -69.28 -69.285 -69.29 -69.295 -69.3 -69.305 -69.31 -69.315 -69.32 -69.325 -69.33 -69.335 -69.34 -69.345 -69.35 -69.355 -69.36 -69.365 -69.37 -69.375 -69.38 -69.385 -69.39 -69.395 -69.4 -69.405 -69.41 -69.415 -69.42 -69.425 -69.43 -69.435 -69.44 -69.445 -69.45 -69.455 -69.46 -69.465 -69.47 -69.475 -69.48 -69.485 -69.49 -69.495 -69.5 -69.505 -69.51 -69.515 -69.52 -69.525 -69.53 -69.535 -69.54 -69.545 -69.55 -69.555 -69.56 -69.565 -69.57 -69.575 -69.58 -69.585 -69.59 -69.595 -69.6 -69.605 -69.61 -69.615 -69.62 -69.625 -69.63 -69.635 -69.64 -69.645 -69.65 -69.655 -69.66 -69.665 -69.67 -69.675 -69.68 -69.685 -69.69 -69.695 -69.7 -69.705 -69.71 -69.715 -69.72 -69.725 -69.73 -69.735 -69.74 -69.745 -69.75 -69.755 -69.76 -69.765 -69.77 -69.775 -69.78 -69.785 -69.79 -69.795 -69.8 -69.805 -69.81 -69.815 -69.82 -69.825 -69.83 -69.835 -69.84 -69.845 -69.85 -69.855 -69.86 -69.865 -69.87 -69.875 -69.88 -69.885 -69.89 -69.895 -69.9 -69.905 -69.91 -69.915 -69.92 -69.925 -69.93 -69.935 -69.94 -69.945 -69.95 -69.955 -69.96 -69.965 -69.97 -69.975 -69.98 -69.985 -69.99 -69.995 -70 -70.005 -70.01 -70.015 -70.02 -70.025 -70.03 -70.035 -70.04 -70.045 -70.05 -70.055 -70.06 -70.065 -70.07 -70.075 -70.08 -70.085 -70.09 -70.095 -70.1 -70.105 -70.11 -70.115 -70.12 -70.125 -70.13 -70.135 -70.14 -70.145 -70.15 -70.155 -70.16 -70.165 -70.17 -70.175 -70.18 -70.185 -70.19 -70.195 -70.2 -70.205 -70.21 -70.215 -70.22 -70.225 -70.23 -70.235 -70.24 -70.245 -70.25 -70.255 -70.26 -70.265 -70.27 -70.275 -70.28 -70.285 -70.29 -70.295 -70.3 -70.305 -70.31 -70.315 -70.32 -70.325 -70.33 -70.335 -70.34 -70.345 -70.35 -70.355 -70.36 -70.365 -70.37 -70.375 -70.38 -70.385 -70.39 -70.395 -70.4 -70.405 -70.41 -70.415 -70.42 -70.425 -70.43 -70.435 -70.44 -70.445 -70.45 -70.455 -70.46 -70.465 -70.47 -70.475 -70.48 -70.485 -70.49 -70.495 -70.5 -70.505 -70.51 -70.515 -70.52 -70.525 -70.53 -70.535 -70.54 -70.545 -70.55 -70.555 -70.56 -70.565 -70.57 -70.575 -70.58 -70.585 -70.59 -70.595 -70.6 -70.605 -70.61 -70.615 -70.62 -70.625 -70.63 -70.635 -70.64 -70.645 -70.65 -70.655 -70.66 -70.665 -70.67 -70.675 -70.68 -70.685 -70.69 -70.695 -70.7 -70.705 -70.71 -70.715 -70.72 -70.725 -70.73 -70.735 -70.74 -70.745 -70.75 -70.755 -70.76 -70.765 -70.77 -70.775 -70.78 -70.785 -70.79 -70.795 -70.8 -70.805 -70.81 -70.815 -70.82 -70.825 -70.83 -70.835 -70.84 -70.845 -70.85 -70.855 -70.86 -70.865 -70.87 -70.875 -70.88 -70.885 -70.89 -70.895 -70.9 -70.905 -70.91 -70.915 -70.92 -70.925 -70.93 -70.935 -70.94 -70.945 -70.95 -70.955 -70.96 -70.965 -70.97 -70.975 -70.98 -70.985 -70.99 -70.995 -71 -71.005 -71.01 -71.015 -71.02 -71.025 -71.03 -71.035 -71.04 -71.045 -71.05 -71.055 -71.06 -71.065 -71.07 -71.075 -71.08 -71.085 -71.09 -71.095 -71.1 -71.105 -71.11 -71.115 -71.12 -71.125 -71.13 -71.135 -71.14 -71.145 -71.15 -71.155 -71.16 -71.165 -71.17 -71.175 -71.18 -71.185 -71.19 -71.195 -71.2 -71.205 -71.21 -71.215 -71.22 -71.225 -71.23 -71.235 -71.24 -71.245 -71.25 -71.255 -71.26 -71.265 -71.27 -71.275 -71.28 -71.285 -71.29 -71.295 -71.3 -71.305 -71.31 -71.315 -71.32 -71.325 -71.33 -71.335 -71.34 -71.345 -71.35 -71.355 -71.36 -71.365 -71.37 -71.375 -71.38 -71.385 -71.39 -71.395 -71.4 -71.405 -71.41 -71.415 -71.42 -71.425 -71.43 -71.435 -71.44 -71.445 -71.45 -71.455 -71.46 -71.465 -71.47 -71.475 -71.48 -71.485 -71.49 -71.495 -71.5 -71.505 -71.51 -71.515 -71.52 -71.525 -71.53 -71.535 -71.54 -71.545 -71.55 -71.555 -71.56 -71.565 -71.57 -71.575 -71.58 -71.585 -71.59 -71.595 -71.6 -71.605 -71.61 -71.615 -71.62 -71.625 -71.63 -71.635 -71.64 -71.645 -71.65 -71.655 -71.66 -71.665 -71.67 -71.675 -71.68 -71.685 -71.69 -71.695 -71.7 -71.705 -71.71 -71.715 -71.72 -71.725 -71.73 -71.735 -71.74 -71.745 -71.75 -71.755 -71.76 -71.765 -71.77 -71.775 -71.78 -71.785 -71.79 -71.795 -71.8 -71.805 -71.81 -71.815 -71.82 -71.825 -71.83 -71.835 -71.84 -71.845 -71.85 -71.855 -71.86 -71.865 -71.87 -71.875 -71.88 -71.885 -71.89 -71.895 -71.9 -71.905 -71.91 -71.915 -71.92 -71.925 -71.93 -71.935 -71.94 -71.945 -71.95 -71.955 -71.96 -71.965 -71.97 -71.975 -71.98 -71.985 -71.99 -71.995 -72 -72.005 -72.01 -72.015 -72.02 -72.025 -72.03 -72.035 -72.04 -72.045 -72.05 -72.055 -72.06 -72.065 -72.07 -72.075 -72.08 -72.085 -72.09 -72.095 -72.1 -72.105 -72.11 -72.115 -72.12 -72.125 -72.13 -72.135 -72.14 -72.145 -72.15 -72.155 -72.16 -72.165 -72.17 -72.175 -72.18 -72.185 -72.19 -72.195 -72.2 -72.205 -72.21 -72.215 -72.22 -72.225 -72.23 -72.235 -72.24 -72.245 -72.25 -72.255 -72.26 -72.265 -72.27 -72.275 -72.28 -72.285 -72.29 -72.295 -72.3 -72.305 -72.31 -72.315 -72.32 -72.325 -72.33 -72.335 -72.34 -72.345 -72.35 -72.355 -72.36 -72.365 -72.37 -72.375 -72.38 -72.385 -72.39 -72.395 -72.4 -72.405 -72.41 -72.415 -72.42 -72.425 -72.43 -72.435 -72.44 -72.445 -72.45 -72.455 -72.46 -72.465 -72.47 -72.475 -72.48 -72.485 -72.49 -72.495 -72.5 -72.505 -72.51 -72.515 -72.52 -72.525 -72.53 -72.535 -72.54 -72.545 -72.55 -72.555 -72.56 -72.565 -72.57 -72.575 -72.58 -72.585 -72.59 -72.595 -72.6 -72.605 -72.61 -72.615 -72.62 -72.625 -72.63 -72.635 -72.64 -72.645 -72.65 -72.655 -72.66 -72.665 -72.67 -72.675 -72.68 -72.685 -72.69 -72.695 -72.7 -72.705 -72.71 -72.715 -72.72 -72.725 -72.73 -72.735 -72.74 -72.745 -72.75 -72.755 -72.76 -72.765 -72.77 -72.775 -72.78 -72.785 -72.79 -72.795 -72.8 -72.805 -72.81 -72.815 -72.82 -72.825 -72.83 -72.835 -72.84 -72.845 -72.85 -72.855 -72.86 -72.865 -72.87 -72.875 -72.88 -72.885 -72.89 -72.895 -72.9 -72.905 -72.91 -72.915 -72.92 -72.925 -72.93 -72.935 -72.94 -72.945 -72.95 -72.955 -72.96 -72.965 -72.97 -72.975 -72.98 -72.985 -72.99 -72.995 -73 -73.005 -73.01 -73.015 -73.02 -73.025 -73.03 -73.035 -73.04 -73.045 -73.05 -73.055 -73.06 -73.065 -73.07 -73.075 -73.08 -73.085 -73.09 -73.095 -73.1 -73.105 -73.11 -73.115 -73.12 -73.125 -73.13 -73.135 -73.14 -73.145 -73.15 -73.155 -73.16 -73.165 -73.17 -73.175 -73.18 -73.185 -73.19 -73.195 -73.2 -73.205 -73.21 -73.215 -73.22 -73.225 -73.23 -73.235 -73.24 -73.245 -73.25 -73.255 -73.26 -73.265 -73.27 -73.275 -73.28 -73.285 -73.29 -73.295 -73.3 -73.305 -73.31 -73.315 -73.32 -73.325 -73.33 -73.335 -73.34 -73.345 -73.35 -73.355 -73.36 -73.365 -73.37 -73.375 -73.38 -73.385 -73.39 -73.395 -73.4 -73.405 -73.41 -73.415 -73.42 -73.425 -73.43 -73.435 -73.44 -73.445 -73.45 -73.455 -73.46 -73.465 -73.47 -73.475 -73.48 -73.485 -73.49 -73.495 -73.5 -73.505 -73.51 -73.515 -73.52 -73.525 -73.53 -73.535 -73.54 -73.545 -73.55 -73.555 -73.56 -73.565 -73.57 -73.575 -73.58 -73.585 -73.59 -73.595 -73.6 -73.605 -73.61 -73.615 -73.62 -73.625 -73.63 -73.635 -73.64 -73.645 -73.65 -73.655 -73.66 -73.665 -73.67 -73.675 -73.68 -73.685 -73.69 -73.695 -73.7 -73.705 -73.71 -73.715 -73.72 -73.725 -73.73 -73.735 -73.74 -73.745 -73.75 -73.755 -73.76 -73.765 -73.77 -73.775 -73.78 -73.785 -73.79 -73.795 -73.8 -73.805 -73.81 -73.815 -73.82 -73.825 -73.83 -73.835 -73.84 -73.845 -73.85 -73.855 -73.86 -73.865 -73.87 -73.875 -73.88 -73.885 -73.89 -73.895 -73.9 -73.905 -73.91 -73.915 -73.92 -73.925 -73.93 -73.935 -73.94 -73.945 -73.95 -73.955 -73.96 -73.965 -73.97 -73.975 -73.98 -73.985 -73.99 -73.995 -74 -74.005 -74.01 -74.015 -74.02 -74.025 -74.03 -74.035 -74.04 -74.045 -74.05 -74.055 -74.06 -74.065 -74.07 -74.075 -74.08 -74.085 -74.09 -74.095 -74.1 -74.105 -74.11 -74.115 -74.12 -74.125 -74.13 -74.135 -74.14 -74.145 -74.15 -74.155 -74.16 -74.165 -74.17 -74.175 -74.18 -74.185 -74.19 -74.195 -74.2 -74.205 -74.21 -74.215 -74.22 -74.225 -74.23 -74.235 -74.24 -74.245 -74.25 -74.255 -74.26 -74.265 -74.27 -74.275 -74.28 -74.285 -74.29 -74.295 -74.3 -74.305 -74.31 -74.315 -74.32 -74.325 -74.33 -74.335 -74.34 -74.345 -74.35 -74.355 -74.36 -74.365 -74.37 -74.375 -74.38 -74.385 -74.39 -74.395 -74.4 -74.405 -74.41 -74.415 -74.42 -74.425 -74.43 -74.435 -74.44 -74.445 -74.45 -74.455 -74.46 -74.465 -74.47 -74.475 -74.48 -74.485 -74.49 -74.495 -74.5 -74.505 -74.51 -74.515 -74.52 -74.525 -74.53 -74.535 -74.54 -74.545 -74.55 -74.555 -74.56 -74.565 -74.57 -74.575 -74.58 -74.585 -74.59 -74.595 -74.6 -74.605 -74.61 -74.615 -74.62 -74.625 -74.63 -74.635 -74.64 -74.645 -74.65 -74.655 -74.66 -74.665 -74.67 -74.675 -74.68 -74.685 -74.69 -74.695 -74.7 -74.705 -74.71 -74.715 -74.72 -74.725 -74.73 -74.735 -74.74 -74.745 -74.75 -74.755 -74.76 -74.765 -74.77 -74.775 -74.78 -74.785 -74.79 -74.795 -74.8 -74.805 -74.81 -74.815 -74.82 -74.825 -74.83 -74.835 -74.84 -74.845 -74.85 -74.855 -74.86 -74.865 -74.87 -74.875 -74.88 -74.885 -74.89 -74.895 -74.9 -74.905 -74.91 -74.915 -74.92 -74.925 -74.93 -74.935 -74.94 -74.945 -74.95 -74.955 -74.96 -74.965 -74.97 -74.975 -74.98 -74.985 -74.99 -74.995 -75 -75.005 -75.01 -75.015 -75.02 -75.025 -75.03 -75.035 -75.04 -75.045 -75.05 -75.055 -75.06 -75.065 -75.07 -75.075 -75.08 -75.085 -75.09 -75.095 -75.1 -75.105 -75.11 -75.115 -75.12 -75.125 -75.13 -75.135 -75.14 -75.145 -75.15 -75.155 -75.16 -75.165 -75.17 -75.175 -75.18 -75.185 -75.19 -75.195 -75.2 -75.205 -75.21 -75.215 -75.22 -75.225 -75.23 -75.235 -75.24 -75.245 -75.25 -75.255 -75.26 -75.265 -75.27 -75.275 -75.28 -75.285 -75.29 -75.295 -75.3 -75.305 -75.31 -75.315 -75.32 -75.325 -75.33 -75.335 -75.34 -75.345 -75.35 -75.355 -75.36 -75.365 -75.37 -75.375 -75.38 -75.385 -75.39 -75.395 -75.4 -75.405 -75.41 -75.415 -75.42 -75.425 -75.43 -75.435 -75.44 -75.445 -75.45 -75.455 -75.46 -75.465 -75.47 -75.475 -75.48 -75.485 -75.49 -75.495 -75.5 -75.505 -75.51 -75.515 -75.52 -75.525 -75.53 -75.535 -75.54 -75.545 -75.55 -75.555 -75.56 -75.565 -75.57 -75.575 -75.58 -75.585 -75.59 -75.595 -75.6 -75.605 -75.61 -75.615 -75.62 -75.625 -75.63 -75.635 -75.64 -75.645 -75.65 -75.655 -75.66 -75.665 -75.67 -75.675 -75.68 -75.685 -75.69 -75.695 -75.7 -75.705 -75.71 -75.715 -75.72 -75.725 -75.73 -75.735 -75.74 -75.745 -75.75 -75.755 -75.76 -75.765 -75.77 -75.775 -75.78 -75.785 -75.79 -75.795 -75.8 -75.805 -75.81 -75.815 -75.82 -75.825 -75.83 -75.835 -75.84 -75.845 -75.85 -75.855 -75.86 -75.865 -75.87 -75.875 -75.88 -75.885 -75.89 -75.895 -75.9 -75.905 -75.91 -75.915 -75.92 -75.925 -75.93 -75.935 -75.94 -75.945 -75.95 -75.955 -75.96 -75.965 -75.97 -75.975 -75.98 -75.985 -75.99 -75.995 -76 -76.005 -76.01 -76.015 -76.02 -76.025 -76.03 -76.035 -76.04 -76.045 -76.05 -76.055 -76.06 -76.065 -76.07 -76.075 -76.08 -76.085 -76.09 -76.095 -76.1 -76.105 -76.11 -76.115 -76.12 -76.125 -76.13 -76.135 -76.14 -76.145 -76.15 -76.155 -76.16 -76.165 -76.17 -76.175 -76.18 -76.185 -76.19 -76.195 -76.2 -76.205 -76.21 -76.215 -76.22 -76.225 -76.23 -76.235 -76.24 -76.245 -76.25 -76.255 -76.26 -76.265 -76.27 -76.275 -76.28 -76.285 -76.29 -76.295 -76.3 -76.305 -76.31 -76.315 -76.32 -76.325 -76.33 -76.335 -76.34 -76.345 -76.35 -76.355 -76.36 -76.365 -76.37 -76.375 -76.38 -76.385 -76.39 -76.395 -76.4 -76.405 -76.41 -76.415 -76.42 -76.425 -76.43 -76.435 -76.44 -76.445 -76.45 -76.455 -76.46 -76.465 -76.47 -76.475 -76.48 -76.485 -76.49 -76.495 -76.5 -76.505 -76.51 -76.515 -76.52 -76.525 -76.53 -76.535 -76.54 -76.545 -76.55 -76.555 -76.56 -76.565 -76.57 -76.575 -76.58 -76.585 -76.59 -76.595 -76.6 -76.605 -76.61 -76.615 -76.62 -76.625 -76.63 -76.635 -76.64 -76.645 -76.65 -76.655 -76.66 -76.665 -76.67 -76.675 -76.68 -76.685 -76.69 -76.695 -76.7 -76.705 -76.71 -76.715 -76.72 -76.725 -76.73 -76.735 -76.74 -76.745 -76.75 -76.755 -76.76 -76.765 -76.77 -76.775 -76.78 -76.785 -76.79 -76.795 -76.8 -76.805 -76.81 -76.815 -76.82 -76.825 -76.83 -76.835 -76.84 -76.845 -76.85 -76.855 -76.86 -76.865 -76.87 -76.875 -76.88 -76.885 -76.89 -76.895 -76.9 -76.905 -76.91 -76.915 -76.92 -76.925 -76.93 -76.935 -76.94 -76.945 -76.95 -76.955 -76.96 -76.965 -76.97 -76.975 -76.98 -76.985 -76.99 -76.995 -77 -77.005 -77.01 -77.015 -77.02 -77.025 -77.03 -77.035 -77.04 -77.045 -77.05 -77.055 -77.06 -77.065 -77.07 -77.075 -77.08 -77.085 -77.09 -77.095 -77.1 -77.105 -77.11 -77.115 -77.12 -77.125 -77.13 -77.135 -77.14 -77.145 -77.15 -77.155 -77.16 -77.165 -77.17 -77.175 -77.18 -77.185 -77.19 -77.195 -77.2 -77.205 -77.21 -77.215 -77.22 -77.225 -77.23 -77.235 -77.24 -77.245 -77.25 -77.255 -77.26 -77.265 -77.27 -77.275 -77.28 -77.285 -77.29 -77.295 -77.3 -77.305 -77.31 -77.315 -77.32 -77.325 -77.33 -77.335 -77.34 -77.345 -77.35 -77.355 -77.36 -77.365 -77.37 -77.375 -77.38 -77.385 -77.39 -77.395 -77.4 -77.405 -77.41 -77.415 -77.42 -77.425 -77.43 -77.435 -77.44 -77.445 -77.45 -77.455 -77.46 -77.465 -77.47 -77.475 -77.48 -77.485 -77.49 -77.495 -77.5 -77.505 -77.51 -77.515 -77.52 -77.525 -77.53 -77.535 -77.54 -77.545 -77.55 -77.555 -77.56 -77.565 -77.57 -77.575 -77.58 -77.585 -77.59 -77.595 -77.6 -77.605 -77.61 -77.615 -77.62 -77.625 -77.63 -77.635 -77.64 -77.645 -77.65 -77.655 -77.66 -77.665 -77.67 -77.675 -77.68 -77.685 -77.69 -77.695 -77.7 -77.705 -77.71 -77.715 -77.72 -77.725 -77.73 -77.735 -77.74 -77.745 -77.75 -77.755 -77.76 -77.765 -77.77 -77.775 -77.78 -77.785 -77.79 -77.795 -77.8 -77.805 -77.81 -77.815 -77.82 -77.825 -77.83 -77.835 -77.84 -77.845 -77.85 -77.855 -77.86 -77.865 -77.87 -77.875 -77.88 -77.885 -77.89 -77.895 -77.9 -77.905 -77.91 -77.915 -77.92 -77.925 -77.93 -77.935 -77.94 -77.945 -77.95 -77.955 -77.96 -77.965 -77.97 -77.975 -77.98 -77.985 -77.99 -77.995 -78 -78.005 -78.01 -78.015 -78.02 -78.025 -78.03 -78.035 -78.04 -78.045 -78.05 -78.055 -78.06 -78.065 -78.07 -78.075 -78.08 -78.085 -78.09 -78.095 -78.1 -78.105 -78.11 -78.115 -78.12 -78.125 -78.13 -78.135 -78.14 -78.145 -78.15 -78.155 -78.16 -78.165 -78.17 -78.175 -78.18 -78.185 -78.19 -78.195 -78.2 -78.205 -78.21 -78.215 -78.22 -78.225 -78.23 -78.235 -78.24 -78.245 -78.25 -78.255 -78.26 -78.265 -78.27 -78.275 -78.28 -78.285 -78.29 -78.295 -78.3 -78.305 -78.31 -78.315 -78.32 -78.325 -78.33 -78.335 -78.34 -78.345 -78.35 -78.355 -78.36 -78.365 -78.37 -78.375 -78.38 -78.385 -78.39 -78.395 -78.4 -78.405 -78.41 -78.415 -78.42 -78.425 -78.43 -78.435 -78.44 -78.445 -78.45 -78.455 -78.46 -78.465 -78.47 -78.475 -78.48 -78.485 -78.49 -78.495 -78.5 -78.505 -78.51 -78.515 -78.52 -78.525 -78.53 -78.535 -78.54 -78.545 -78.55 -78.555 -78.56 -78.565 -78.57 -78.575 -78.58 -78.585 -78.59 -78.595 -78.6 -78.605 -78.61 -78.615 -78.62 -78.625 -78.63 -78.635 -78.64 -78.645 -78.65 -78.655 -78.66 -78.665 -78.67 -78.675 -78.68 -78.685 -78.69 -78.695 -78.7 -78.705 -78.71 -78.715 -78.72 -78.725 -78.73 -78.735 -78.74 -78.745 -78.75 -78.755 -78.76 -78.765 -78.77 -78.775 -78.78 -78.785 -78.79 -78.795 -78.8 -78.805 -78.81 -78.815 -78.82 -78.825 -78.83 -78.835 -78.84 -78.845 -78.85 -78.855 -78.86 -78.865 -78.87 -78.875 -78.88 -78.885 -78.89 -78.895 -78.9 -78.905 -78.91 -78.915 -78.92 -78.925 -78.93 -78.935 -78.94 -78.945 -78.95 -78.955 -78.96 -78.965 -78.97 -78.975 -78.98 -78.985 -78.99 -78.995 -79 -79.005 -79.01 -79.015 -79.02 -79.025 -79.03 -79.035 -79.04 -79.045 -79.05 -79.055 -79.06 -79.065 -79.07 -79.075 -79.08 -79.085 -79.09 -79.095 -79.1 -79.105 -79.11 -79.115 -79.12 -79.125 -79.13 -79.135 -79.14 -79.145 -79.15 -79.155 -79.16 -79.165 -79.17 -79.175 -79.18 -79.185 -79.19 -79.195 -79.2 -79.205 -79.21 -79.215 -79.22 -79.225 -79.23 -79.235 -79.24 -79.245 -79.25 -79.255 -79.26 -79.265 -79.27 -79.275 -79.28 -79.285 -79.29 -79.295 -79.3 -79.305 -79.31 -79.315 -79.32 -79.325 -79.33 -79.335 -79.34 -79.345 -79.35 -79.355 -79.36 -79.365 -79.37 -79.375 -79.38 -79.385 -79.39 -79.395 -79.4 -79.405 -79.41 -79.415 -79.42 -79.425 -79.43 -79.435 -79.44 -79.445 -79.45 -79.455 -79.46 -79.465 -79.47 -79.475 -79.48 -79.485 -79.49 -79.495 -79.5 -79.505 -79.51 -79.515 -79.52 -79.525 -79.53 -79.535 -79.54 -79.545 -79.55 -79.555 -79.56 -79.565 -79.57 -79.575 -79.58 -79.585 -79.59 -79.595 -79.6 -79.605 -79.61 -79.615 -79.62 -79.625 -79.63 -79.635 -79.64 -79.645 -79.65 -79.655 -79.66 -79.665 -79.67 -79.675 -79.68 -79.685 -79.69 -79.695 -79.7 -79.705 -79.71 -79.715 -79.72 -79.725 -79.73 -79.735 -79.74 -79.745 -79.75 -79.755 -79.76 -79.765 -79.77 -79.775 -79.78 -79.785 -79.79 -79.795 -79.8 -79.805 -79.81 -79.815 -79.82 -79.825 -79.83 -79.835 -79.84 -79.845 -79.85 -79.855 -79.86 -79.865 -79.87 -79.875 -79.88 -79.885 -79.89 -79.895 -79.9 -79.905 -79.91 -79.915 -79.92 -79.925 -79.93 -79.935 -79.94 -79.945 -79.95 -79.955 -79.96 -79.965 -79.97 -79.975 -79.98 -79.985 -79.99 -79.995 -80 -80.005 -80.01 -80.015 -80.02 -80.025 -80.03 -80.035 -80.04 -80.045 -80.05 -80.055 -80.06 -80.065 -80.07 -80.075 -80.08 -80.085 -80.09 -80.095 -80.1 -80.105 -80.11 -80.115 -80.12 -80.125 -80.13 -80.135 -80.14 -80.145 -80.15 -80.155 -80.16 -80.165 -80.17 -80.175 -80.18 -80.185 -80.19 -80.195 -80.2 -80.205 -80.21 -80.215 -80.22 -80.225 -80.23 -80.235 -80.24 -80.245 -80.25 -80.255 -80.26 -80.265 -80.27 -80.275 -80.28 -80.285 -80.29 -80.295 -80.3 -80.305 -80.31 -80.315 -80.32 -80.325 -80.33 -80.335 -80.34 -80.345 -80.35 -80.355 -80.36 -80.365 -80.37 -80.375 -80.38 -80.385 -80.39 -80.395 -80.4 -80.405 -80.41 -80.415 -80.42 -80.425 -80.43 -80.435 -80.44 -80.445 -80.45 -80.455 -80.46 -80.465 -80.47 -80.475 -80.48 -80.485 -80.49 -80.495 -80.5 -80.505 -80.51 -80.515 -80.52 -80.525 -80.53 -80.535 -80.54 -80.545 -80.55 -80.555 -80.56 -80.565 -80.57 -80.575 -80.58 -80.585 -80.59 -80.595 -80.6 -80.605 -80.61 -80.615 -80.62 -80.625 -80.63 -80.635 -80.64 -80.645 -80.65 -80.655 -80.66 -80.665 -80.67 -80.675 -80.68 -80.685 -80.69 -80.695 -80.7 -80.705 -80.71 -80.715 -80.72 -80.725 -80.73 -80.735 -80.74 -80.745 -80.75 -80.755 -80.76 -80.765 -80.77 -80.775 -80.78 -80.785 -80.79 -80.795 -80.8 -80.805 -80.81 -80.815 -80.82 -80.825 -80.83 -80.835 -80.84 -80.845 -80.85 -80.855 -80.86 -80.865 -80.87 -80.875 -80.88 -80.885 -80.89 -80.895 -80.9 -80.905 -80.91 -80.915 -80.92 -80.925 -80.93 -80.935 -80.94 -80.945 -80.95 -80.955 -80.96 -80.965 -80.97 -80.975 -80.98 -80.985 -80.99 -80.995 -81 -81.005 -81.01 -81.015 -81.02 -81.025 -81.03 -81.035 -81.04 -81.045 -81.05 -81.055 -81.06 -81.065 -81.07 -81.075 -81.08 -81.085 -81.09 -81.095 -81.1 -81.105 -81.11 -81.115 -81.12 -81.125 -81.13 -81.135 -81.14 -81.145 -81.15 -81.155 -81.16 -81.165 -81.17 -81.175 -81.18 -81.185 -81.19 -81.195 -81.2 -81.205 -81.21 -81.215 -81.22 -81.225 -81.23 -81.235 -81.24 -81.245 -81.25 -81.255 -81.26 -81.265 -81.27 -81.275 -81.28 -81.285 -81.29 -81.295 -81.3 -81.305 -81.31 -81.315 -81.32 -81.325 -81.33 -81.335 -81.34 -81.345 -81.35 -81.355 -81.36 -81.365 -81.37 -81.375 -81.38 -81.385 -81.39 -81.395 -81.4 -81.405 -81.41 -81.415 -81.42 -81.425 -81.43 -81.435 -81.44 -81.445 -81.45 -81.455 -81.46 -81.465 -81.47 -81.475 -81.48 -81.485 -81.49 -81.495 -81.5 -81.505 -81.51 -81.515 -81.52 -81.525 -81.53 -81.535 -81.54 -81.545 -81.55 -81.555 -81.56 -81.565 -81.57 -81.575 -81.58 -81.585 -81.59 -81.595 -81.6 -81.605 -81.61 -81.615 -81.62 -81.625 -81.63 -81.635 -81.64 -81.645 -81.65 -81.655 -81.66 -81.665 -81.67 -81.675 -81.68 -81.685 -81.69 -81.695 -81.7 -81.705 -81.71 -81.715 -81.72 -81.725 -81.73 -81.735 -81.74 -81.745 -81.75 -81.755 -81.76 -81.765 -81.77 -81.775 -81.78 -81.785 -81.79 -81.795 -81.8 -81.805 -81.81 -81.815 -81.82 -81.825 -81.83 -81.835 -81.84 -81.845 -81.85 -81.855 -81.86 -81.865 -81.87 -81.875 -81.88 -81.885 -81.89 -81.895 -81.9 -81.905 -81.91 -81.915 -81.92 -81.925 -81.93 -81.935 -81.94 -81.945 -81.95 -81.955 -81.96 -81.965 -81.97 -81.975 -81.98 -81.985 -81.99 -81.995 -82 -82.005 -82.01 -82.015 -82.02 -82.025 -82.03 -82.035 -82.04 -82.045 -82.05 -82.055 -82.06 -82.065 -82.07 -82.075 -82.08 -82.085 -82.09 -82.095 -82.1 -82.105 -82.11 -82.115 -82.12 -82.125 -82.13 -82.135 -82.14 -82.145 -82.15 -82.155 -82.16 -82.165 -82.17 -82.175 -82.18 -82.185 -82.19 -82.195 -82.2 -82.205 -82.21 -82.215 -82.22 -82.225 -82.23 -82.235 -82.24 -82.245 -82.25 -82.255 -82.26 -82.265 -82.27 -82.275 -82.28 -82.285 -82.29 -82.295 -82.3 -82.305 -82.31 -82.315 -82.32 -82.325 -82.33 -82.335 -82.34 -82.345 -82.35 -82.355 -82.36 -82.365 -82.37 -82.375 -82.38 -82.385 -82.39 -82.395 -82.4 -82.405 -82.41 -82.415 -82.42 -82.425 -82.43 -82.435 -82.44 -82.445 -82.45 -82.455 -82.46 -82.465 -82.47 -82.475 -82.48 -82.485 -82.49 -82.495 -82.5 -82.505 -82.51 -82.515 -82.52 -82.525 -82.53 -82.535 -82.54 -82.545 -82.55 -82.555 -82.56 -82.565 -82.57 -82.575 -82.58 -82.585 -82.59 -82.595 -82.6 -82.605 -82.61 -82.615 -82.62 -82.625 -82.63 -82.635 -82.64 -82.645 -82.65 -82.655 -82.66 -82.665 -82.67 -82.675 -82.68 -82.685 -82.69 -82.695 -82.7 -82.705 -82.71 -82.715 -82.72 -82.725 -82.73 -82.735 -82.74 -82.745 -82.75 -82.755 -82.76 -82.765 -82.77 -82.775 -82.78 -82.785 -82.79 -82.795 -82.8 -82.805 -82.81 -82.815 -82.82 -82.825 -82.83 -82.835 -82.84 -82.845 -82.85 -82.855 -82.86 -82.865 -82.87 -82.875 -82.88 -82.885 -82.89 -82.895 -82.9 -82.905 -82.91 -82.915 -82.92 -82.925 -82.93 -82.935 -82.94 -82.945 -82.95 -82.955 -82.96 -82.965 -82.97 -82.975 -82.98 -82.985 -82.99 -82.995 -83 -83.005 -83.01 -83.015 -83.02 -83.025 -83.03 -83.035 -83.04 -83.045 -83.05 -83.055 -83.06 -83.065 -83.07 -83.075 -83.08 -83.085 -83.09 -83.095 -83.1 -83.105 -83.11 -83.115 -83.12 -83.125 -83.13 -83.135 -83.14 -83.145 -83.15 -83.155 -83.16 -83.165 -83.17 -83.175 -83.18 -83.185 -83.19 -83.195 -83.2 -83.205 -83.21 -83.215 -83.22 -83.225 -83.23 -83.235 -83.24 -83.245 -83.25 -83.255 -83.26 -83.265 -83.27 -83.275 -83.28 -83.285 -83.29 -83.295 -83.3 -83.305 -83.31 -83.315 -83.32 -83.325 -83.33 -83.335 -83.34 -83.345 -83.35 -83.355 -83.36 -83.365 -83.37 -83.375 -83.38 -83.385 -83.39 -83.395 -83.4 -83.405 -83.41 -83.415 -83.42 -83.425 -83.43 -83.435 -83.44 -83.445 -83.45 -83.455 -83.46 -83.465 -83.47 -83.475 -83.48 -83.485 -83.49 -83.495 -83.5 -83.505 -83.51 -83.515 -83.52 -83.525 -83.53 -83.535 -83.54 -83.545 -83.55 -83.555 -83.56 -83.565 -83.57 -83.575 -83.58 -83.585 -83.59 -83.595 -83.6 -83.605 -83.61 -83.615 -83.62 -83.625 -83.63 -83.635 -83.64 -83.645 -83.65 -83.655 -83.66 -83.665 -83.67 -83.675 -83.68 -83.685 -83.69 -83.695 -83.7 -83.705 -83.71 -83.715 -83.72 -83.725 -83.73 -83.735 -83.74 -83.745 -83.75 -83.755 -83.76 -83.765 -83.77 -83.775 -83.78 -83.785 -83.79 -83.795 -83.8 -83.805 -83.81 -83.815 -83.82 -83.825 -83.83 -83.835 -83.84 -83.845 -83.85 -83.855 -83.86 -83.865 -83.87 -83.875 -83.88 -83.885 -83.89 -83.895 -83.9 -83.905 -83.91 -83.915 -83.92 -83.925 -83.93 -83.935 -83.94 -83.945 -83.95 -83.955 -83.96 -83.965 -83.97 -83.975 -83.98 -83.985 -83.99 -83.995 -84 -84.005 -84.01 -84.015 -84.02 -84.025 -84.03 -84.035 -84.04 -84.045 -84.05 -84.055 -84.06 -84.065 -84.07 -84.075 -84.08 -84.085 -84.09 -84.095 -84.1 -84.105 -84.11 -84.115 -84.12 -84.125 -84.13 -84.135 -84.14 -84.145 -84.15 -84.155 -84.16 -84.165 -84.17 -84.175 -84.18 -84.185 -84.19 -84.195 -84.2 -84.205 -84.21 -84.215 -84.22 -84.225 -84.23 -84.235 -84.24 -84.245 -84.25 -84.255 -84.26 -84.265 -84.27 -84.275 -84.28 -84.285 -84.29 -84.295 -84.3 -84.305 -84.31 -84.315 -84.32 -84.325 -84.33 -84.335 -84.34 -84.345 -84.35 -84.355 -84.36 -84.365 -84.37 -84.375 -84.38 -84.385 -84.39 -84.395 -84.4 -84.405 -84.41 -84.415 -84.42 -84.425 -84.43 -84.435 -84.44 -84.445 -84.45 -84.455 -84.46 -84.465 -84.47 -84.475 -84.48 -84.485 -84.49 -84.495 -84.5 -84.505 -84.51 -84.515 -84.52 -84.525 -84.53 -84.535 -84.54 -84.545 -84.55 -84.555 -84.56 -84.565 -84.57 -84.575 -84.58 -84.585 -84.59 -84.595 -84.6 -84.605 -84.61 -84.615 -84.62 -84.625 -84.63 -84.635 -84.64 -84.645 -84.65 -84.655 -84.66 -84.665 -84.67 -84.675 -84.68 -84.685 -84.69 -84.695 -84.7 -84.705 -84.71 -84.715 -84.72 -84.725 -84.73 -84.735 -84.74 -84.745 -84.75 -84.755 -84.76 -84.765 -84.77 -84.775 -84.78 -84.785 -84.79 -84.795 -84.8 -84.805 -84.81 -84.815 -84.82 -84.825 -84.83 -84.835 -84.84 -84.845 -84.85 -84.855 -84.86 -84.865 -84.87 -84.875 -84.88 -84.885 -84.89 -84.895 -84.9 -84.905 -84.91 -84.915 -84.92 -84.925 -84.93 -84.935 -84.94 -84.945 -84.95 -84.955 -84.96 -84.965 -84.97 -84.975 -84.98 -84.985 -84.99 -84.995 -85 -85.005 -85.01 -85.015 -85.02 -85.025 -85.03 -85.035 -85.04 -85.045 -85.05 -85.055 -85.06 -85.065 -85.07 -85.075 -85.08 -85.085 -85.09 -85.095 -85.1 -85.105 -85.11 -85.115 -85.12 -85.125 -85.13 -85.135 -85.14 -85.145 -85.15 -85.155 -85.16 -85.165 -85.17 -85.175 -85.18 -85.185 -85.19 -85.195 -85.2 -85.205 -85.21 -85.215 -85.22 -85.225 -85.23 -85.235 -85.24 -85.245 -85.25 -85.255 -85.26 -85.265 -85.27 -85.275 -85.28 -85.285 -85.29 -85.295 -85.3 -85.305 -85.31 -85.315 -85.32 -85.325 -85.33 -85.335 -85.34 -85.345 -85.35 -85.355 -85.36 -85.365 -85.37 -85.375 -85.38 -85.385 -85.39 -85.395 -85.4 -85.405 -85.41 -85.415 -85.42 -85.425 -85.43 -85.435 -85.44 -85.445 -85.45 -85.455 -85.46 -85.465 -85.47 -85.475 -85.48 -85.485 -85.49 -85.495 -85.5 -85.505 -85.51 -85.515 -85.52 -85.525 -85.53 -85.535 -85.54 -85.545 -85.55 -85.555 -85.56 -85.565 -85.57 -85.575 -85.58 -85.585 -85.59 -85.595 -85.6 -85.605 -85.61 -85.615 -85.62 -85.625 -85.63 -85.635 -85.64 -85.645 -85.65 -85.655 -85.66 -85.665 -85.67 -85.675 -85.68 -85.685 -85.69 -85.695 -85.7 -85.705 -85.71 -85.715 -85.72 -85.725 -85.73 -85.735 -85.74 -85.745 -85.75 -85.755 -85.76 -85.765 -85.77 -85.775 -85.78 -85.785 -85.79 -85.795 -85.8 -85.805 -85.81 -85.815 -85.82 -85.825 -85.83 -85.835 -85.84 -85.845 -85.85 -85.855 -85.86 -85.865 -85.87 -85.875 -85.88 -85.885 -85.89 -85.895 -85.9 -85.905 -85.91 -85.915 -85.92 -85.925 -85.93 -85.935 -85.94 -85.945 -85.95 -85.955 -85.96 -85.965 -85.97 -85.975 -85.98 -85.985 -85.99 -85.995 -86 -86.005 -86.01 -86.015 -86.02 -86.025 -86.03 -86.035 -86.04 -86.045 -86.05 -86.055 -86.06 -86.065 -86.07 -86.075 -86.08 -86.085 -86.09 -86.095 -86.1 -86.105 -86.11 -86.115 -86.12 -86.125 -86.13 -86.135 -86.14 -86.145 -86.15 -86.155 -86.16 -86.165 -86.17 -86.175 -86.18 -86.185 -86.19 -86.195 -86.2 -86.205 -86.21 -86.215 -86.22 -86.225 -86.23 -86.235 -86.24 -86.245 -86.25 -86.255 -86.26 -86.265 -86.27 -86.275 -86.28 -86.285 -86.29 -86.295 -86.3 -86.305 -86.31 -86.315 -86.32 -86.325 -86.33 -86.335 -86.34 -86.345 -86.35 -86.355 -86.36 -86.365 -86.37 -86.375 -86.38 -86.385 -86.39 -86.395 -86.4 -86.405 -86.41 -86.415 -86.42 -86.425 -86.43 -86.435 -86.44 -86.445 -86.45 -86.455 -86.46 -86.465 -86.47 -86.475 -86.48 -86.485 -86.49 -86.495 -86.5 -86.505 -86.51 -86.515 -86.52 -86.525 -86.53 -86.535 -86.54 -86.545 -86.55 -86.555 -86.56 -86.565 -86.57 -86.575 -86.58 -86.585 -86.59 -86.595 -86.6 -86.605 -86.61 -86.615 -86.62 -86.625 -86.63 -86.635 -86.64 -86.645 -86.65 -86.655 -86.66 -86.665 -86.67 -86.675 -86.68 -86.685 -86.69 -86.695 -86.7 -86.705 -86.71 -86.715 -86.72 -86.725 -86.73 -86.735 -86.74 -86.745 -86.75 -86.755 -86.76 -86.765 -86.77 -86.775 -86.78 -86.785 -86.79 -86.795 -86.8 -86.805 -86.81 -86.815 -86.82 -86.825 -86.83 -86.835 -86.84 -86.845 -86.85 -86.855 -86.86 -86.865 -86.87 -86.875 -86.88 -86.885 -86.89 -86.895 -86.9 -86.905 -86.91 -86.915 -86.92 -86.925 -86.93 -86.935 -86.94 -86.945 -86.95 -86.955 -86.96 -86.965 -86.97 -86.975 -86.98 -86.985 -86.99 -86.995 -87 -87.005 -87.01 -87.015 -87.02 -87.025 -87.03 -87.035 -87.04 -87.045 -87.05 -87.055 -87.06 -87.065 -87.07 -87.075 -87.08 -87.085 -87.09 -87.095 -87.1 -87.105 -87.11 -87.115 -87.12 -87.125 -87.13 -87.135 -87.14 -87.145 -87.15 -87.155 -87.16 -87.165 -87.17 -87.175 -87.18 -87.185 -87.19 -87.195 -87.2 -87.205 -87.21 -87.215 -87.22 -87.225 -87.23 -87.235 -87.24 -87.245 -87.25 -87.255 -87.26 -87.265 -87.27 -87.275 -87.28 -87.285 -87.29 -87.295 -87.3 -87.305 -87.31 -87.315 -87.32 -87.325 -87.33 -87.335 -87.34 -87.345 -87.35 -87.355 -87.36 -87.365 -87.37 -87.375 -87.38 -87.385 -87.39 -87.395 -87.4 -87.405 -87.41 -87.415 -87.42 -87.425 -87.43 -87.435 -87.44 -87.445 -87.45 -87.455 -87.46 -87.465 -87.47 -87.475 -87.48 -87.485 -87.49 -87.495 -87.5 -87.505 -87.51 -87.515 -87.52 -87.525 -87.53 -87.535 -87.54 -87.545 -87.55 -87.555 -87.56 -87.565 -87.57 -87.575 -87.58 -87.585 -87.59 -87.595 -87.6 -87.605 -87.61 -87.615 -87.62 -87.625 -87.63 -87.635 -87.64 -87.645 -87.65 -87.655 -87.66 -87.665 -87.67 -87.675 -87.68 -87.685 -87.69 -87.695 -87.7 -87.705 -87.71 -87.715 -87.72 -87.725 -87.73 -87.735 -87.74 -87.745 -87.75 -87.755 -87.76 -87.765 -87.77 -87.775 -87.78 -87.785 -87.79 -87.795 -87.8 -87.805 -87.81 -87.815 -87.82 -87.825 -87.83 -87.835 -87.84 -87.845 -87.85 -87.855 -87.86 -87.865 -87.87 -87.875 -87.88 -87.885 -87.89 -87.895 -87.9 -87.905 -87.91 -87.915 -87.92 -87.925 -87.93 -87.935 -87.94 -87.945 -87.95 -87.955 -87.96 -87.965 -87.97 -87.975 -87.98 -87.985 -87.99 -87.995 -88 -88.005 -88.01 -88.015 -88.02 -88.025 -88.03 -88.035 -88.04 -88.045 -88.05 -88.055 -88.06 -88.065 -88.07 -88.075 -88.08 -88.085 -88.09 -88.095 -88.1 -88.105 -88.11 -88.115 -88.12 -88.125 -88.13 -88.135 -88.14 -88.145 -88.15 -88.155 -88.16 -88.165 -88.17 -88.175 -88.18 -88.185 -88.19 -88.195 -88.2 -88.205 -88.21 -88.215 -88.22 -88.225 -88.23 -88.235 -88.24 -88.245 -88.25 -88.255 -88.26 -88.265 -88.27 -88.275 -88.28 -88.285 -88.29 -88.295 -88.3 -88.305 -88.31 -88.315 -88.32 -88.325 -88.33 -88.335 -88.34 -88.345 -88.35 -88.355 -88.36 -88.365 -88.37 -88.375 -88.38 -88.385 -88.39 -88.395 -88.4 -88.405 -88.41 -88.415 -88.42 -88.425 -88.43 -88.435 -88.44 -88.445 -88.45 -88.455 -88.46 -88.465 -88.47 -88.475 -88.48 -88.485 -88.49 -88.495 -88.5 -88.505 -88.51 -88.515 -88.52 -88.525 -88.53 -88.535 -88.54 -88.545 -88.55 -88.555 -88.56 -88.565 -88.57 -88.575 -88.58 -88.585 -88.59 -88.595 -88.6 -88.605 -88.61 -88.615 -88.62 -88.625 -88.63 -88.635 -88.64 -88.645 -88.65 -88.655 -88.66 -88.665 -88.67 -88.675 -88.68 -88.685 -88.69 -88.695 -88.7 -88.705 -88.71 -88.715 -88.72 -88.725 -88.73 -88.735 -88.74 -88.745 -88.75 -88.755 -88.76 -88.765 -88.77 -88.775 -88.78 -88.785 -88.79 -88.795 -88.8 -88.805 -88.81 -88.815 -88.82 -88.825 -88.83 -88.835 -88.84 -88.845 -88.85 -88.855 -88.86 -88.865 -88.87 -88.875 -88.88 -88.885 -88.89 -88.895 -88.9 -88.905 -88.91 -88.915 -88.92 -88.925 -88.93 -88.935 -88.94 -88.945 -88.95 -88.955 -88.96 -88.965 -88.97 -88.975 -88.98 -88.985 -88.99 -88.995 -89 -89.005 -89.01 -89.015 -89.02 -89.025 -89.03 -89.035 -89.04 -89.045 -89.05 -89.055 -89.06 -89.065 -89.07 -89.075 -89.08 -89.085 -89.09 -89.095 -89.1 -89.105 -89.11 -89.115 -89.12 -89.125 -89.13 -89.135 -89.14 -89.145 -89.15 -89.155 -89.16 -89.165 -89.17 -89.175 -89.18 -89.185 -89.19 -89.195 -89.2 -89.205 -89.21 -89.215 -89.22 -89.225 -89.23 -89.235 -89.24 -89.245 -89.25 -89.255 -89.26 -89.265 -89.27 -89.275 -89.28 -89.285 -89.29 -89.295 -89.3 -89.305 -89.31 -89.315 -89.32 -89.325 -89.33 -89.335 -89.34 -89.345 -89.35 -89.355 -89.36 -89.365 -89.37 -89.375 -89.38 -89.385 -89.39 -89.395 -89.4 -89.405 -89.41 -89.415 -89.42 -89.425 -89.43 -89.435 -89.44 -89.445 -89.45 -89.455 -89.46 -89.465 -89.47 -89.475 -89.48 -89.485 -89.49 -89.495 -89.5 -89.505 -89.51 -89.515 -89.52 -89.525 -89.53 -89.535 -89.54 -89.545 -89.55 -89.555 -89.56 -89.565 -89.57 -89.575 -89.58 -89.585 -89.59 -89.595 -89.6 -89.605 -89.61 -89.615 -89.62 -89.625 -89.63 -89.635 -89.64 -89.645 -89.65 -89.655 -89.66 -89.665 -89.67 -89.675 -89.68 -89.685 -89.69 -89.695 -89.7 -89.705 -89.71 -89.715 -89.72 -89.725 -89.73 -89.735 -89.74 -89.745 -89.75 -89.755 -89.76 -89.765 -89.77 -89.775 -89.78 -89.785 -89.79 -89.795 -89.8 -89.805 -89.81 -89.815 -89.82 -89.825 -89.83 -89.835 -89.84 -89.845 -89.85 -89.855 -89.86 -89.865 -89.87 -89.875 -89.88 -89.885 -89.89 -89.895 -89.9 -89.905 -89.91 -89.915 -89.92 -89.925 -89.93 -89.935 -89.94 -89.945 -89.95 -89.955 -89.96 -89.965 -89.97 -89.975 -89.98 -89.985 -89.99 -89.995 -90 -90.005 -90.01 -90.015 -90.02 -90.025 -90.03 -90.035 -90.04 -90.045 -90.05 -90.055 -90.06 -90.065 -90.07 -90.075 -90.08 -90.085 -90.09 -90.095 -90.1 -90.105 -90.11 -90.115 -90.12 -90.125 -90.13 -90.135 -90.14 -90.145 -90.15 -90.155 -90.16 -90.165 -90.17 -90.175 -90.18 -90.185 -90.19 -90.195 -90.2 -90.205 -90.21 -90.215 -90.22 -90.225 -90.23 -90.235 -90.24 -90.245 -90.25 -90.255 -90.26 -90.265 -90.27 -90.275 -90.28 -90.285 -90.29 -90.295 -90.3 -90.305 -90.31 -90.315 -90.32 -90.325 -90.33 -90.335 -90.34 -90.345 -90.35 -90.355 -90.36 -90.365 -90.37 -90.375 -90.38 -90.385 -90.39 -90.395 -90.4 -90.405 -90.41 -90.415 -90.42 -90.425 -90.43 -90.435 -90.44 -90.445 -90.45 -90.455 -90.46 -90.465 -90.47 -90.475 -90.48 -90.485 -90.49 -90.495 -90.5 -90.505 -90.51 -90.515 -90.52 -90.525 -90.53 -90.535 -90.54 -90.545 -90.55 -90.555 -90.56 -90.565 -90.57 -90.575 -90.58 -90.585 -90.59 -90.595 -90.6 -90.605 -90.61 -90.615 -90.62 -90.625 -90.63 -90.635 -90.64 -90.645 -90.65 -90.655 -90.66 -90.665 -90.67 -90.675 -90.68 -90.685 -90.69 -90.695 -90.7 -90.705 -90.71 -90.715 -90.72 -90.725 -90.73 -90.735 -90.74 -90.745 -90.75 -90.755 -90.76 -90.765 -90.77 -90.775 -90.78 -90.785 -90.79 -90.795 -90.8 -90.805 -90.81 -90.815 -90.82 -90.825 -90.83 -90.835 -90.84 -90.845 -90.85 -90.855 -90.86 -90.865 -90.87 -90.875 -90.88 -90.885 -90.89 -90.895 -90.9 -90.905 -90.91 -90.915 -90.92 -90.925 -90.93 -90.935 -90.94 -90.945 -90.95 -90.955 -90.96 -90.965 -90.97 -90.975 -90.98 -90.985 -90.99 -90.995 -91 -91.005 -91.01 -91.015 -91.02 -91.025 -91.03 -91.035 -91.04 -91.045 -91.05 -91.055 -91.06 -91.065 -91.07 -91.075 -91.08 -91.085 -91.09 -91.095 -91.1 -91.105 -91.11 -91.115 -91.12 -91.125 -91.13 -91.135 -91.14 -91.145 -91.15 -91.155 -91.16 -91.165 -91.17 -91.175 -91.18 -91.185 -91.19 -91.195 -91.2 -91.205 -91.21 -91.215 -91.22 -91.225 -91.23 -91.235 -91.24 -91.245 -91.25 -91.255 -91.26 -91.265 -91.27 -91.275 -91.28 -91.285 -91.29 -91.295 -91.3 -91.305 -91.31 -91.315 -91.32 -91.325 -91.33 -91.335 -91.34 -91.345 -91.35 -91.355 -91.36 -91.365 -91.37 -91.375 -91.38 -91.385 -91.39 -91.395 -91.4 -91.405 -91.41 -91.415 -91.42 -91.425 -91.43 -91.435 -91.44 -91.445 -91.45 -91.455 -91.46 -91.465 -91.47 -91.475 -91.48 -91.485 -91.49 -91.495 -91.5 -91.505 -91.51 -91.515 -91.52 -91.525 -91.53 -91.535 -91.54 -91.545 -91.55 -91.555 -91.56 -91.565 -91.57 -91.575 -91.58 -91.585 -91.59 -91.595 -91.6 -91.605 -91.61 -91.615 -91.62 -91.625 -91.63 -91.635 -91.64 -91.645 -91.65 -91.655 -91.66 -91.665 -91.67 -91.675 -91.68 -91.685 -91.69 -91.695 -91.7 -91.705 -91.71 -91.715 -91.72 -91.725 -91.73 -91.735 -91.74 -91.745 -91.75 -91.755 -91.76 -91.765 -91.77 -91.775 -91.78 -91.785 -91.79 -91.795 -91.8 -91.805 -91.81 -91.815 -91.82 -91.825 -91.83 -91.835 -91.84 -91.845 -91.85 -91.855 -91.86 -91.865 -91.87 -91.875 -91.88 -91.885 -91.89 -91.895 -91.9 -91.905 -91.91 -91.915 -91.92 -91.925 -91.93 -91.935 -91.94 -91.945 -91.95 -91.955 -91.96 -91.965 -91.97 -91.975 -91.98 -91.985 -91.99 -91.995 -92 -92.005 -92.01 -92.015 -92.02 -92.025 -92.03 -92.035 -92.04 -92.045 -92.05 -92.055 -92.06 -92.065 -92.07 -92.075 -92.08 -92.085 -92.09 -92.095 -92.1 -92.105 -92.11 -92.115 -92.12 -92.125 -92.13 -92.135 -92.14 -92.145 -92.15 -92.155 -92.16 -92.165 -92.17 -92.175 -92.18 -92.185 -92.19 -92.195 -92.2 -92.205 -92.21 -92.215 -92.22 -92.225 -92.23 -92.235 -92.24 -92.245 -92.25 -92.255 -92.26 -92.265 -92.27 -92.275 -92.28 -92.285 -92.29 -92.295 -92.3 -92.305 -92.31 -92.315 -92.32 -92.325 -92.33 -92.335 -92.34 -92.345 -92.35 -92.355 -92.36 -92.365 -92.37 -92.375 -92.38 -92.385 -92.39 -92.395 -92.4 -92.405 -92.41 -92.415 -92.42 -92.425 -92.43 -92.435 -92.44 -92.445 -92.45 -92.455 -92.46 -92.465 -92.47 -92.475 -92.48 -92.485 -92.49 -92.495 -92.5 -92.505 -92.51 -92.515 -92.52 -92.525 -92.53 -92.535 -92.54 -92.545 -92.55 -92.555 -92.56 -92.565 -92.57 -92.575 -92.58 -92.585 -92.59 -92.595 -92.6 -92.605 -92.61 -92.615 -92.62 -92.625 -92.63 -92.635 -92.64 -92.645 -92.65 -92.655 -92.66 -92.665 -92.67 -92.675 -92.68 -92.685 -92.69 -92.695 -92.7 -92.705 -92.71 -92.715 -92.72 -92.725 -92.73 -92.735 -92.74 -92.745 -92.75 -92.755 -92.76 -92.765 -92.77 -92.775 -92.78 -92.785 -92.79 -92.795 -92.8 -92.805 -92.81 -92.815 -92.82 -92.825 -92.83 -92.835 -92.84 -92.845 -92.85 -92.855 -92.86 -92.865 -92.87 -92.875 -92.88 -92.885 -92.89 -92.895 -92.9 -92.905 -92.91 -92.915 -92.92 -92.925 -92.93 -92.935 -92.94 -92.945 -92.95 -92.955 -92.96 -92.965 -92.97 -92.975 -92.98 -92.985 -92.99 -92.995 -93 -93.005 -93.01 -93.015 -93.02 -93.025 -93.03 -93.035 -93.04 -93.045 -93.05 -93.055 -93.06 -93.065 -93.07 -93.075 -93.08 -93.085 -93.09 -93.095 -93.1 -93.105 -93.11 -93.115 -93.12 -93.125 -93.13 -93.135 -93.14 -93.145 -93.15 -93.155 -93.16 -93.165 -93.17 -93.175 -93.18 -93.185 -93.19 -93.195 -93.2 -93.205 -93.21 -93.215 -93.22 -93.225 -93.23 -93.235 -93.24 -93.245 -93.25 -93.255 -93.26 -93.265 -93.27 -93.275 -93.28 -93.285 -93.29 -93.295 -93.3 -93.305 -93.31 -93.315 -93.32 -93.325 -93.33 -93.335 -93.34 -93.345 -93.35 -93.355 -93.36 -93.365 -93.37 -93.375 -93.38 -93.385 -93.39 -93.395 -93.4 -93.405 -93.41 -93.415 -93.42 -93.425 -93.43 -93.435 -93.44 -93.445 -93.45 -93.455 -93.46 -93.465 -93.47 -93.475 -93.48 -93.485 -93.49 -93.495 -93.5 -93.505 -93.51 -93.515 -93.52 -93.525 -93.53 -93.535 -93.54 -93.545 -93.55 -93.555 -93.56 -93.565 -93.57 -93.575 -93.58 -93.585 -93.59 -93.595 -93.6 -93.605 -93.61 -93.615 -93.62 -93.625 -93.63 -93.635 -93.64 -93.645 -93.65 -93.655 -93.66 -93.665 -93.67 -93.675 -93.68 -93.685 -93.69 -93.695 -93.7 -93.705 -93.71 -93.715 -93.72 -93.725 -93.73 -93.735 -93.74 -93.745 -93.75 -93.755 -93.76 -93.765 -93.77 -93.775 -93.78 -93.785 -93.79 -93.795 -93.8 -93.805 -93.81 -93.815 -93.82 -93.825 -93.83 -93.835 -93.84 -93.845 -93.85 -93.855 -93.86 -93.865 -93.87 -93.875 -93.88 -93.885 -93.89 -93.895 -93.9 -93.905 -93.91 -93.915 -93.92 -93.925 -93.93 -93.935 -93.94 -93.945 -93.95 -93.955 -93.96 -93.965 -93.97 -93.975 -93.98 -93.985 -93.99 -93.995 -94 -94.005 -94.01 -94.015 -94.02 -94.025 -94.03 -94.035 -94.04 -94.045 -94.05 -94.055 -94.06 -94.065 -94.07 -94.075 -94.08 -94.085 -94.09 -94.095 -94.1 -94.105 -94.11 -94.115 -94.12 -94.125 -94.13 -94.135 -94.14 -94.145 -94.15 -94.155 -94.16 -94.165 -94.17 -94.175 -94.18 -94.185 -94.19 -94.195 -94.2 -94.205 -94.21 -94.215 -94.22 -94.225 -94.23 -94.235 -94.24 -94.245 -94.25 -94.255 -94.26 -94.265 -94.27 -94.275 -94.28 -94.285 -94.29 -94.295 -94.3 -94.305 -94.31 -94.315 -94.32 -94.325 -94.33 -94.335 -94.34 -94.345 -94.35 -94.355 -94.36 -94.365 -94.37 -94.375 -94.38 -94.385 -94.39 -94.395 -94.4 -94.405 -94.41 -94.415 -94.42 -94.425 -94.43 -94.435 -94.44 -94.445 -94.45 -94.455 -94.46 -94.465 -94.47 -94.475 -94.48 -94.485 -94.49 -94.495 -94.5 -94.505 -94.51 -94.515 -94.52 -94.525 -94.53 -94.535 -94.54 -94.545 -94.55 -94.555 -94.56 -94.565 -94.57 -94.575 -94.58 -94.585 -94.59 -94.595 -94.6 -94.605 -94.61 -94.615 -94.62 -94.625 -94.63 -94.635 -94.64 -94.645 -94.65 -94.655 -94.66 -94.665 -94.67 -94.675 -94.68 -94.685 -94.69 -94.695 -94.7 -94.705 -94.71 -94.715 -94.72 -94.725 -94.73 -94.735 -94.74 -94.745 -94.75 -94.755 -94.76 -94.765 -94.77 -94.775 -94.78 -94.785 -94.79 -94.795 -94.8 -94.805 -94.81 -94.815 -94.82 -94.825 -94.83 -94.835 -94.84 -94.845 -94.85 -94.855 -94.86 -94.865 -94.87 -94.875 -94.88 -94.885 -94.89 -94.895 -94.9 -94.905 -94.91 -94.915 -94.92 -94.925 -94.93 -94.935 -94.94 -94.945 -94.95 -94.955 -94.96 -94.965 -94.97 -94.975 -94.98 -94.985 -94.99 -94.995 -95 -95.005 -95.01 -95.015 -95.02 -95.025 -95.03 -95.035 -95.04 -95.045 -95.05 -95.055 -95.06 -95.065 -95.07 -95.075 -95.08 -95.085 -95.09 -95.095 -95.1 -95.105 -95.11 -95.115 -95.12 -95.125 -95.13 -95.135 -95.14 -95.145 -95.15 -95.155 -95.16 -95.165 -95.17 -95.175 -95.18 -95.185 -95.19 -95.195 -95.2 -95.205 -95.21 -95.215 -95.22 -95.225 -95.23 -95.235 -95.24 -95.245 -95.25 -95.255 -95.26 -95.265 -95.27 -95.275 -95.28 -95.285 -95.29 -95.295 -95.3 -95.305 -95.31 -95.315 -95.32 -95.325 -95.33 -95.335 -95.34 -95.345 -95.35 -95.355 -95.36 -95.365 -95.37 -95.375 -95.38 -95.385 -95.39 -95.395 -95.4 -95.405 -95.41 -95.415 -95.42 -95.425 -95.43 -95.435 -95.44 -95.445 -95.45 -95.455 -95.46 -95.465 -95.47 -95.475 -95.48 -95.485 -95.49 -95.495 -95.5 -95.505 -95.51 -95.515 -95.52 -95.525 -95.53 -95.535 -95.54 -95.545 -95.55 -95.555 -95.56 -95.565 -95.57 -95.575 -95.58 -95.585 -95.59 -95.595 -95.6 -95.605 -95.61 -95.615 -95.62 -95.625 -95.63 -95.635 -95.64 -95.645 -95.65 -95.655 -95.66 -95.665 -95.67 -95.675 -95.68 -95.685 -95.69 -95.695 -95.7 -95.705 -95.71 -95.715 -95.72 -95.725 -95.73 -95.735 -95.74 -95.745 -95.75 -95.755 -95.76 -95.765 -95.77 -95.775 -95.78 -95.785 -95.79 -95.795 -95.8 -95.805 -95.81 -95.815 -95.82 -95.825 -95.83 -95.835 -95.84 -95.845 -95.85 -95.855 -95.86 -95.865 -95.87 -95.875 -95.88 -95.885 -95.89 -95.895 -95.9 -95.905 -95.91 -95.915 -95.92 -95.925 -95.93 -95.935 -95.94 -95.945 -95.95 -95.955 -95.96 -95.965 -95.97 -95.975 -95.98 -95.985 -95.99 -95.995 -96 -96.005 -96.01 -96.015 -96.02 -96.025 -96.03 -96.035 -96.04 -96.045 -96.05 -96.055 -96.06 -96.065 -96.07 -96.075 -96.08 -96.085 -96.09 -96.095 -96.1 -96.105 -96.11 -96.115 -96.12 -96.125 -96.13 -96.135 -96.14 -96.145 -96.15 -96.155 -96.16 -96.165 -96.17 -96.175 -96.18 -96.185 -96.19 -96.195 -96.2 -96.205 -96.21 -96.215 -96.22 -96.225 -96.23 -96.235 -96.24 -96.245 -96.25 -96.255 -96.26 -96.265 -96.27 -96.275 -96.28 -96.285 -96.29 -96.295 -96.3 -96.305 -96.31 -96.315 -96.32 -96.325 -96.33 -96.335 -96.34 -96.345 -96.35 -96.355 -96.36 -96.365 -96.37 -96.375 -96.38 -96.385 -96.39 -96.395 -96.4 -96.405 -96.41 -96.415 -96.42 -96.425 -96.43 -96.435 -96.44 -96.445 -96.45 -96.455 -96.46 -96.465 -96.47 -96.475 -96.48 -96.485 -96.49 -96.495 -96.5 -96.505 -96.51 -96.515 -96.52 -96.525 -96.53 -96.535 -96.54 -96.545 -96.55 -96.555 -96.56 -96.565 -96.57 -96.575 -96.58 -96.585 -96.59 -96.595 -96.6 -96.605 -96.61 -96.615 -96.62 -96.625 -96.63 -96.635 -96.64 -96.645 -96.65 -96.655 -96.66 -96.665 -96.67 -96.675 -96.68 -96.685 -96.69 -96.695 -96.7 -96.705 -96.71 -96.715 -96.72 -96.725 -96.73 -96.735 -96.74 -96.745 -96.75 -96.755 -96.76 -96.765 -96.77 -96.775 -96.78 -96.785 -96.79 -96.795 -96.8 -96.805 -96.81 -96.815 -96.82 -96.825 -96.83 -96.835 -96.84 -96.845 -96.85 -96.855 -96.86 -96.865 -96.87 -96.875 -96.88 -96.885 -96.89 -96.895 -96.9 -96.905 -96.91 -96.915 -96.92 -96.925 -96.93 -96.935 -96.94 -96.945 -96.95 -96.955 -96.96 -96.965 -96.97 -96.975 -96.98 -96.985 -96.99 -96.995 -97 -97.005 -97.01 -97.015 -97.02 -97.025 -97.03 -97.035 -97.04 -97.045 -97.05 -97.055 -97.06 -97.065 -97.07 -97.075 -97.08 -97.085 -97.09 -97.095 -97.1 -97.105 -97.11 -97.115 -97.12 -97.125 -97.13 -97.135 -97.14 -97.145 -97.15 -97.155 -97.16 -97.165 -97.17 -97.175 -97.18 -97.185 -97.19 -97.195 -97.2 -97.205 -97.21 -97.215 -97.22 -97.225 -97.23 -97.235 -97.24 -97.245 -97.25 -97.255 -97.26 -97.265 -97.27 -97.275 -97.28 -97.285 -97.29 -97.295 -97.3 -97.305 -97.31 -97.315 -97.32 -97.325 -97.33 -97.335 -97.34 -97.345 -97.35 -97.355 -97.36 -97.365 -97.37 -97.375 -97.38 -97.385 -97.39 -97.395 -97.4 -97.405 -97.41 -97.415 -97.42 -97.425 -97.43 -97.435 -97.44 -97.445 -97.45 -97.455 -97.46 -97.465 -97.47 -97.475 -97.48 -97.485 -97.49 -97.495 -97.5 -97.505 -97.51 -97.515 -97.52 -97.525 -97.53 -97.535 -97.54 -97.545 -97.55 -97.555 -97.56 -97.565 -97.57 -97.575 -97.58 -97.585 -97.59 -97.595 -97.6 -97.605 -97.61 -97.615 -97.62 -97.625 -97.63 -97.635 -97.64 -97.645 -97.65 -97.655 -97.66 -97.665 -97.67 -97.675 -97.68 -97.685 -97.69 -97.695 -97.7 -97.705 -97.71 -97.715 -97.72 -97.725 -97.73 -97.735 -97.74 -97.745 -97.75 -97.755 -97.76 -97.765 -97.77 -97.775 -97.78 -97.785 -97.79 -97.795 -97.8 -97.805 -97.81 -97.815 -97.82 -97.825 -97.83 -97.835 -97.84 -97.845 -97.85 -97.855 -97.86 -97.865 -97.87 -97.875 -97.88 -97.885 -97.89 -97.895 -97.9 -97.905 -97.91 -97.915 -97.92 -97.925 -97.93 -97.935 -97.94 -97.945 -97.95 -97.955 -97.96 -97.965 -97.97 -97.975 -97.98 -97.985 -97.99 -97.995 -98 -98.005 -98.01 -98.015 -98.02 -98.025 -98.03 -98.035 -98.04 -98.045 -98.05 -98.055 -98.06 -98.065 -98.07 -98.075 -98.08 -98.085 -98.09 -98.095 -98.1 -98.105 -98.11 -98.115 -98.12 -98.125 -98.13 -98.135 -98.14 -98.145 -98.15 -98.155 -98.16 -98.165 -98.17 -98.175 -98.18 -98.185 -98.19 -98.195 -98.2 -98.205 -98.21 -98.215 -98.22 -98.225 -98.23 -98.235 -98.24 -98.245 -98.25 -98.255 -98.26 -98.265 -98.27 -98.275 -98.28 -98.285 -98.29 -98.295 -98.3 -98.305 -98.31 -98.315 -98.32 -98.325 -98.33 -98.335 -98.34 -98.345 -98.35 -98.355 -98.36 -98.365 -98.37 -98.375 -98.38 -98.385 -98.39 -98.395 -98.4 -98.405 -98.41 -98.415 -98.42 -98.425 -98.43 -98.435 -98.44 -98.445 -98.45 -98.455 -98.46 -98.465 -98.47 -98.475 -98.48 -98.485 -98.49 -98.495 -98.5 -98.505 -98.51 -98.515 -98.52 -98.525 -98.53 -98.535 -98.54 -98.545 -98.55 -98.555 -98.56 -98.565 -98.57 -98.575 -98.58 -98.585 -98.59 -98.595 -98.6 -98.605 -98.61 -98.615 -98.62 -98.625 -98.63 -98.635 -98.64 -98.645 -98.65 -98.655 -98.66 -98.665 -98.67 -98.675 -98.68 -98.685 -98.69 -98.695 -98.7 -98.705 -98.71 -98.715 -98.72 -98.725 -98.73 -98.735 -98.74 -98.745 -98.75 -98.755 -98.76 -98.765 -98.77 -98.775 -98.78 -98.785 -98.79 -98.795 -98.8 -98.805 -98.81 -98.815 -98.82 -98.825 -98.83 -98.835 -98.84 -98.845 -98.85 -98.855 -98.86 -98.865 -98.87 -98.875 -98.88 -98.885 -98.89 -98.895 -98.9 -98.905 -98.91 -98.915 -98.92 -98.925 -98.93 -98.935 -98.94 -98.945 -98.95 -98.955 -98.96 -98.965 -98.97 -98.975 -98.98 -98.985 -98.99 -98.995 -99 -99.005 -99.01 -99.015 -99.02 -99.025 -99.03 -99.035 -99.04 -99.045 -99.05 -99.055 -99.06 -99.065 -99.07 -99.075 -99.08 -99.085 -99.09 -99.095 -99.1 -99.105 -99.11 -99.115 -99.12 -99.125 -99.13 -99.135 -99.14 -99.145 -99.15 -99.155 -99.16 -99.165 -99.17 -99.175 -99.18 -99.185 -99.19 -99.195 -99.2 -99.205 -99.21 -99.215 -99.22 -99.225 -99.23 -99.235 -99.24 -99.245 -99.25 -99.255 -99.26 -99.265 -99.27 -99.275 -99.28 -99.285 -99.29 -99.295 -99.3 -99.305 -99.31 -99.315 -99.32 -99.325 -99.33 -99.335 -99.34 -99.345 -99.35 -99.355 -99.36 -99.365 -99.37 -99.375 -99.38 -99.385 -99.39 -99.395 -99.4 -99.405 -99.41 -99.415 -99.42 -99.425 -99.43 -99.435 -99.44 -99.445 -99.45 -99.455 -99.46 -99.465 -99.47 -99.475 -99.48 -99.485 -99.49 -99.495 -99.5 -99.505 -99.51 -99.515 -99.52 -99.525 -99.53 -99.535 -99.54 -99.545 -99.55 -99.555 -99.56 -99.565 -99.57 -99.575 -99.58 -99.585 -99.59 -99.595 -99.6 -99.605 -99.61 -99.615 -99.62 -99.625 -99.63 -99.635 -99.64 -99.645 -99.65 -99.655 -99.66 -99.665 -99.67 -99.675 -99.68 -99.685 -99.69 -99.695 -99.7 -99.705 -99.71 -99.715 -99.72 -99.725 -99.73 -99.735 -99.74 -99.745 -99.75 -99.755 -99.76 -99.765 -99.77 -99.775 -99.78 -99.785 -99.79 -99.795 -99.8 -99.805 -99.81 -99.815 -99.82 -99.825 -99.83 -99.835 -99.84 -99.845 -99.85 -99.855 -99.86 -99.865 -99.87 -99.875 -99.88 -99.885 -99.89 -99.895 -99.9 -99.905 -99.91 -99.915 -99.92 -99.925 -99.93 -99.935 -99.94 -99.945 -99.95 -99.955 -99.96 -99.965 -99.97 -99.975 -99.98 -99.985 -99.99 -99.995 -100 -100.005 -100.01 -100.015 -100.02 -100.025 -100.03 -100.035 -100.04 -100.045 -100.05 -100.055 -100.06 -100.065 -100.07 -100.075 -100.08 -100.085 -100.09 -100.095 -100.1 -100.105 -100.11 -100.115 -100.12 -100.125 -100.13 -100.135 -100.14 -100.145 -100.15 -100.155 -100.16 -100.165 -100.17 -100.175 -100.18 -100.185 -100.19 -100.195 -100.2 -100.205 -100.21 -100.215 -100.22 -100.225 -100.23 -100.235 -100.24 -100.245 -100.25 -100.255 -100.26 -100.265 -100.27 -100.275 -100.28 -100.285 -100.29 -100.295 -100.3 -100.305 -100.31 -100.315 -100.32 -100.325 -100.33 -100.335 -100.34 -100.345 -100.35 -100.355 -100.36 -100.365 -100.37 -100.375 -100.38 -100.385 -100.39 -100.395 -100.4 -100.405 -100.41 -100.415 -100.42 -100.425 -100.43 -100.435 -100.44 -100.445 -100.45 -100.455 -100.46 -100.465 -100.47 -100.475 -100.48 -100.485 -100.49 -100.495 -100.5 -100.505 -100.51 -100.515 -100.52 -100.525 -100.53 -100.535 -100.54 -100.545 -100.55 -100.555 -100.56 -100.565 -100.57 -100.575 -100.58 -100.585 -100.59 -100.595 -100.6 -100.605 -100.61 -100.615 -100.62 -100.625 -100.63 -100.635 -100.64 -100.645 -100.65 -100.655 -100.66 -100.665 -100.67 -100.675 -100.68 -100.685 -100.69 -100.695 -100.7 -100.705 -100.71 -100.715 -100.72 -100.725 -100.73 -100.735 -100.74 -100.745 -100.75 -100.755 -100.76 -100.765 -100.77 -100.775 -100.78 -100.785 -100.79 -100.795 -100.8 -100.805 -100.81 -100.815 -100.82 -100.825 -100.83 -100.835 -100.84 -100.845 -100.85 -100.855 -100.86 -100.865 -100.87 -100.875 -100.88 -100.885 -100.89 -100.895 -100.9 -100.905 -100.91 -100.915 -100.92 -100.925 -100.93 -100.935 -100.94 -100.945 -100.95 -100.955 -100.96 -100.965 -100.97 -100.975 -100.98 -100.985 -100.99 -100.995 -101 -101.005 -101.01 -101.015 -101.02 -101.025 -101.03 -101.035 -101.04 -101.045 -101.05 -101.055 -101.06 -101.065 -101.07 -101.075 -101.08 -101.085 -101.09 -101.095 -101.1 -101.105 -101.11 -101.115 -101.12 -101.125 -101.13 -101.135 -101.14 -101.145 -101.15 -101.155 -101.16 -101.165 -101.17 -101.175 -101.18 -101.185 -101.19 -101.195 -101.2 -101.205 -101.21 -101.215 -101.22 -101.225 -101.23 -101.235 -101.24 -101.245 -101.25 -101.255 -101.26 -101.265 -101.27 -101.275 -101.28 -101.285 -101.29 -101.295 -101.3 -101.305 -101.31 -101.315 -101.32 -101.325 -101.33 -101.335 -101.34 -101.345 -101.35 -101.355 -101.36 -101.365 -101.37 -101.375 -101.38 -101.385 -101.39 -101.395 -101.4 -101.405 -101.41 -101.415 -101.42 -101.425 -101.43 -101.435 -101.44 -101.445 -101.45 -101.455 -101.46 -101.465 -101.47 -101.475 -101.48 -101.485 -101.49 -101.495 -101.5 -101.505 -101.51 -101.515 -101.52 -101.525 -101.53 -101.535 -101.54 -101.545 -101.55 -101.555 -101.56 -101.565 -101.57 -101.575 -101.58 -101.585 -101.59 -101.595 -101.6 -101.605 -101.61 -101.615 -101.62 -101.625 -101.63 -101.635 -101.64 -101.645 -101.65 -101.655 -101.66 -101.665 -101.67 -101.675 -101.68 -101.685 -101.69 -101.695 -101.7 -101.705 -101.71 -101.715 -101.72 -101.725 -101.73 -101.735 -101.74 -101.745 -101.75 -101.755 -101.76 -101.765 -101.77 -101.775 -101.78 -101.785 -101.79 -101.795 -101.8 -101.805 -101.81 -101.815 -101.82 -101.825 -101.83 -101.835 -101.84 -101.845 -101.85 -101.855 -101.86 -101.865 -101.87 -101.875 -101.88 -101.885 -101.89 -101.895 -101.9 -101.905 -101.91 -101.915 -101.92 -101.925 -101.93 -101.935 -101.94 -101.945 -101.95 -101.955 -101.96 -101.965 -101.97 -101.975 -101.98 -101.985 -101.99 -101.995 -102 -102.005 -102.01 -102.015 -102.02 -102.025 -102.03 -102.035 -102.04 -102.045 -102.05 -102.055 -102.06 -102.065 -102.07 -102.075 -102.08 -102.085 -102.09 -102.095 -102.1 -102.105 -102.11 -102.115 -102.12 -102.125 -102.13 -102.135 -102.14 -102.145 -102.15 -102.155 -102.16 -102.165 -102.17 -102.175 -102.18 -102.185 -102.19 -102.195 -102.2 -102.205 -102.21 -102.215 -102.22 -102.225 -102.23 -102.235 -102.24 -102.245 -102.25 -102.255 -102.26 -102.265 -102.27 -102.275 -102.28 -102.285 -102.29 -102.295 -102.3 -102.305 -102.31 -102.315 -102.32 -102.325 -102.33 -102.335 -102.34 -102.345 -102.35 -102.355 -102.36 -102.365 -102.37 -102.375 -102.38 -102.385 -102.39 -102.395 -102.4 -102.405 -102.41 -102.415 -102.42 -102.425 -102.43 -102.435 -102.44 -102.445 -102.45 -102.455 -102.46 -102.465 -102.47 -102.475 -102.48 -102.485 -102.49 -102.495 -102.5 -102.505 -102.51 -102.515 -102.52 -102.525 -102.53 -102.535 -102.54 -102.545 -102.55 -102.555 -102.56 -102.565 -102.57 -102.575 -102.58 -102.585 -102.59 -102.595 -102.6 -102.605 -102.61 -102.615 -102.62 -102.625 -102.63 -102.635 -102.64 -102.645 -102.65 -102.655 -102.66 -102.665 -102.67 -102.675 -102.68 -102.685 -102.69 -102.695 -102.7 -102.705 -102.71 -102.715 -102.72 -102.725 -102.73 -102.735 -102.74 -102.745 -102.75 -102.755 -102.76 -102.765 -102.77 -102.775 -102.78 -102.785 -102.79 -102.795 -102.8 -102.805 -102.81 -102.815 -102.82 -102.825 -102.83 -102.835 -102.84 -102.845 -102.85 -102.855 -102.86 -102.865 -102.87 -102.875 -102.88 -102.885 -102.89 -102.895 -102.9 -102.905 -102.91 -102.915 -102.92 -102.925 -102.93 -102.935 -102.94 -102.945 -102.95 -102.955 -102.96 -102.965 -102.97 -102.975 -102.98 -102.985 -102.99 -102.995 -103 -103.005 -103.01 -103.015 -103.02 -103.025 -103.03 -103.035 -103.04 -103.045 -103.05 -103.055 -103.06 -103.065 -103.07 -103.075 -103.08 -103.085 -103.09 -103.095 -103.1 -103.105 -103.11 -103.115 -103.12 -103.125 -103.13 -103.135 -103.14 -103.145 -103.15 -103.155 -103.16 -103.165 -103.17 -103.175 -103.18 -103.185 -103.19 -103.195 -103.2 -103.205 -103.21 -103.215 -103.22 -103.225 -103.23 -103.235 -103.24 -103.245 -103.25 -103.255 -103.26 -103.265 -103.27 -103.275 -103.28 -103.285 -103.29 -103.295 -103.3 -103.305 -103.31 -103.315 -103.32 -103.325 -103.33 -103.335 -103.34 -103.345 -103.35 -103.355 -103.36 -103.365 -103.37 -103.375 -103.38 -103.385 -103.39 -103.395 -103.4 -103.405 -103.41 -103.415 -103.42 -103.425 -103.43 -103.435 -103.44 -103.445 -103.45 -103.455 -103.46 -103.465 -103.47 -103.475 -103.48 -103.485 -103.49 -103.495 -103.5 -103.505 -103.51 -103.515 -103.52 -103.525 -103.53 -103.535 -103.54 -103.545 -103.55 -103.555 -103.56 -103.565 -103.57 -103.575 -103.58 -103.585 -103.59 -103.595 -103.6 -103.605 -103.61 -103.615 -103.62 -103.625 -103.63 -103.635 -103.64 -103.645 -103.65 -103.655 -103.66 -103.665 -103.67 -103.675 -103.68 -103.685 -103.69 -103.695 -103.7 -103.705 -103.71 -103.715 -103.72 -103.725 -103.73 -103.735 -103.74 -103.745 -103.75 -103.755 -103.76 -103.765 -103.77 -103.775 -103.78 -103.785 -103.79 -103.795 -103.8 -103.805 -103.81 -103.815 -103.82 -103.825 -103.83 -103.835 -103.84 -103.845 -103.85 -103.855 -103.86 -103.865 -103.87 -103.875 -103.88 -103.885 -103.89 -103.895 -103.9 -103.905 -103.91 -103.915 -103.92 -103.925 -103.93 -103.935 -103.94 -103.945 -103.95 -103.955 -103.96 -103.965 -103.97 -103.975 -103.98 -103.985 -103.99 -103.995 -104 -104.005 -104.01 -104.015 -104.02 -104.025 -104.03 -104.035 -104.04 -104.045 -104.05 -104.055 -104.06 -104.065 -104.07 -104.075 -104.08 -104.085 -104.09 -104.095 -104.1 -104.105 -104.11 -104.115 -104.12 -104.125 -104.13 -104.135 -104.14 -104.145 -104.15 -104.155 -104.16 -104.165 -104.17 -104.175 -104.18 -104.185 -104.19 -104.195 -104.2 -104.205 -104.21 -104.215 -104.22 -104.225 -104.23 -104.235 -104.24 -104.245 -104.25 -104.255 -104.26 -104.265 -104.27 -104.275 -104.28 -104.285 -104.29 -104.295 -104.3 -104.305 -104.31 -104.315 -104.32 -104.325 -104.33 -104.335 -104.34 -104.345 -104.35 -104.355 -104.36 -104.365 -104.37 -104.375 -104.38 -104.385 -104.39 -104.395 -104.4 -104.405 -104.41 -104.415 -104.42 -104.425 -104.43 -104.435 -104.44 -104.445 -104.45 -104.455 -104.46 -104.465 -104.47 -104.475 -104.48 -104.485 -104.49 -104.495 -104.5 -104.505 -104.51 -104.515 -104.52 -104.525 -104.53 -104.535 -104.54 -104.545 -104.55 -104.555 -104.56 -104.565 -104.57 -104.575 -104.58 -104.585 -104.59 -104.595 -104.6 -104.605 -104.61 -104.615 -104.62 -104.625 -104.63 -104.635 -104.64 -104.645 -104.65 -104.655 -104.66 -104.665 -104.67 -104.675 -104.68 -104.685 -104.69 -104.695 -104.7 -104.705 -104.71 -104.715 -104.72 -104.725 -104.73 -104.735 -104.74 -104.745 -104.75 -104.755 -104.76 -104.765 -104.77 -104.775 -104.78 -104.785 -104.79 -104.795 -104.8 -104.805 -104.81 -104.815 -104.82 -104.825 -104.83 -104.835 -104.84 -104.845 -104.85 -104.855 -104.86 -104.865 -104.87 -104.875 -104.88 -104.885 -104.89 -104.895 -104.9 -104.905 -104.91 -104.915 -104.92 -104.925 -104.93 -104.935 -104.94 -104.945 -104.95 -104.955 -104.96 -104.965 -104.97 -104.975 -104.98 -104.985 -104.99 -104.995 -105 -105.005 -105.01 -105.015 -105.02 -105.025 -105.03 -105.035 -105.04 -105.045 -105.05 -105.055 -105.06 -105.065 -105.07 -105.075 -105.08 -105.085 -105.09 -105.095 -105.1 -105.105 -105.11 -105.115 -105.12 -105.125 -105.13 -105.135 -105.14 -105.145 -105.15 -105.155 -105.16 -105.165 -105.17 -105.175 -105.18 -105.185 -105.19 -105.195 -105.2 -105.205 -105.21 -105.215 -105.22 -105.225 -105.23 -105.235 -105.24 -105.245 -105.25 -105.255 -105.26 -105.265 -105.27 -105.275 -105.28 -105.285 -105.29 -105.295 -105.3 -105.305 -105.31 -105.315 -105.32 -105.325 -105.33 -105.335 -105.34 -105.345 -105.35 -105.355 -105.36 -105.365 -105.37 -105.375 -105.38 -105.385 -105.39 -105.395 -105.4 -105.405 -105.41 -105.415 -105.42 -105.425 -105.43 -105.435 -105.44 -105.445 -105.45 -105.455 -105.46 -105.465 -105.47 -105.475 -105.48 -105.485 -105.49 -105.495 -105.5 -105.505 -105.51 -105.515 -105.52 -105.525 -105.53 -105.535 -105.54 -105.545 -105.55 -105.555 -105.56 -105.565 -105.57 -105.575 -105.58 -105.585 -105.59 -105.595 -105.6 -105.605 -105.61 -105.615 -105.62 -105.625 -105.63 -105.635 -105.64 -105.645 -105.65 -105.655 -105.66 -105.665 -105.67 -105.675 -105.68 -105.685 -105.69 -105.695 -105.7 -105.705 -105.71 -105.715 -105.72 -105.725 -105.73 -105.735 -105.74 -105.745 -105.75 -105.755 -105.76 -105.765 -105.77 -105.775 -105.78 -105.785 -105.79 -105.795 -105.8 -105.805 -105.81 -105.815 -105.82 -105.825 -105.83 -105.835 -105.84 -105.845 -105.85 -105.855 -105.86 -105.865 -105.87 -105.875 -105.88 -105.885 -105.89 -105.895 -105.9 -105.905 -105.91 -105.915 -105.92 -105.925 -105.93 -105.935 -105.94 -105.945 -105.95 -105.955 -105.96 -105.965 -105.97 -105.975 -105.98 -105.985 -105.99 -105.995 -106 -106.005 -106.01 -106.015 -106.02 -106.025 -106.03 -106.035 -106.04 -106.045 -106.05 -106.055 -106.06 -106.065 -106.07 -106.075 -106.08 -106.085 -106.09 -106.095 -106.1 -106.105 -106.11 -106.115 -106.12 -106.125 -106.13 -106.135 -106.14 -106.145 -106.15 -106.155 -106.16 -106.165 -106.17 -106.175 -106.18 -106.185 -106.19 -106.195 -106.2 -106.205 -106.21 -106.215 -106.22 -106.225 -106.23 -106.235 -106.24 -106.245 -106.25 -106.255 -106.26 -106.265 -106.27 -106.275 -106.28 -106.285 -106.29 -106.295 -106.3 -106.305 -106.31 -106.315 -106.32 -106.325 -106.33 -106.335 -106.34 -106.345 -106.35 -106.355 -106.36 -106.365 -106.37 -106.375 -106.38 -106.385 -106.39 -106.395 -106.4 -106.405 -106.41 -106.415 -106.42 -106.425 -106.43 -106.435 -106.44 -106.445 -106.45 -106.455 -106.46 -106.465 -106.47 -106.475 -106.48 -106.485 -106.49 -106.495 -106.5 -106.505 -106.51 -106.515 -106.52 -106.525 -106.53 -106.535 -106.54 -106.545 -106.55 -106.555 -106.56 -106.565 -106.57 -106.575 -106.58 -106.585 -106.59 -106.595 -106.6 -106.605 -106.61 -106.615 -106.62 -106.625 -106.63 -106.635 -106.64 -106.645 -106.65 -106.655 -106.66 -106.665 -106.67 -106.675 -106.68 -106.685 -106.69 -106.695 -106.7 -106.705 -106.71 -106.715 -106.72 -106.725 -106.73 -106.735 -106.74 -106.745 -106.75 -106.755 -106.76 -106.765 -106.77 -106.775 -106.78 -106.785 -106.79 -106.795 -106.8 -106.805 -106.81 -106.815 -106.82 -106.825 -106.83 -106.835 -106.84 -106.845 -106.85 -106.855 -106.86 -106.865 -106.87 -106.875 -106.88 -106.885 -106.89 -106.895 -106.9 -106.905 -106.91 -106.915 -106.92 -106.925 -106.93 -106.935 -106.94 -106.945 -106.95 -106.955 -106.96 -106.965 -106.97 -106.975 -106.98 -106.985 -106.99 -106.995 -107 -107.005 -107.01 -107.015 -107.02 -107.025 -107.03 -107.035 -107.04 -107.045 -107.05 -107.055 -107.06 -107.065 -107.07 -107.075 -107.08 -107.085 -107.09 -107.095 -107.1 -107.105 -107.11 -107.115 -107.12 -107.125 -107.13 -107.135 -107.14 -107.145 -107.15 -107.155 -107.16 -107.165 -107.17 -107.175 -107.18 -107.185 -107.19 -107.195 -107.2 -107.205 -107.21 -107.215 -107.22 -107.225 -107.23 -107.235 -107.24 -107.245 -107.25 -107.255 -107.26 -107.265 -107.27 -107.275 -107.28 -107.285 -107.29 -107.295 -107.3 -107.305 -107.31 -107.315 -107.32 -107.325 -107.33 -107.335 -107.34 -107.345 -107.35 -107.355 -107.36 -107.365 -107.37 -107.375 -107.38 -107.385 -107.39 -107.395 -107.4 -107.405 -107.41 -107.415 -107.42 -107.425 -107.43 -107.435 -107.44 -107.445 -107.45 -107.455 -107.46 -107.465 -107.47 -107.475 -107.48 -107.485 -107.49 -107.495 -107.5 -107.505 -107.51 -107.515 -107.52 -107.525 -107.53 -107.535 -107.54 -107.545 -107.55 -107.555 -107.56 -107.565 -107.57 -107.575 -107.58 -107.585 -107.59 -107.595 -107.6 -107.605 -107.61 -107.615 -107.62 -107.625 -107.63 -107.635 -107.64 -107.645 -107.65 -107.655 -107.66 -107.665 -107.67 -107.675 -107.68 -107.685 -107.69 -107.695 -107.7 -107.705 -107.71 -107.715 -107.72 -107.725 -107.73 -107.735 -107.74 -107.745 -107.75 -107.755 -107.76 -107.765 -107.77 -107.775 -107.78 -107.785 -107.79 -107.795 -107.8 -107.805 -107.81 -107.815 -107.82 -107.825 -107.83 -107.835 -107.84 -107.845 -107.85 -107.855 -107.86 -107.865 -107.87 -107.875 -107.88 -107.885 -107.89 -107.895 -107.9 -107.905 -107.91 -107.915 -107.92 -107.925 -107.93 -107.935 -107.94 -107.945 -107.95 -107.955 -107.96 -107.965 -107.97 -107.975 -107.98 -107.985 -107.99 -107.995 -108 -108.005 -108.01 -108.015 -108.02 -108.025 -108.03 -108.035 -108.04 -108.045 -108.05 -108.055 -108.06 -108.065 -108.07 -108.075 -108.08 -108.085 -108.09 -108.095 -108.1 -108.105 -108.11 -108.115 -108.12 -108.125 -108.13 -108.135 -108.14 -108.145 -108.15 -108.155 -108.16 -108.165 -108.17 -108.175 -108.18 -108.185 -108.19 -108.195 -108.2 -108.205 -108.21 -108.215 -108.22 -108.225 -108.23 -108.235 -108.24 -108.245 -108.25 -108.255 -108.26 -108.265 -108.27 -108.275 -108.28 -108.285 -108.29 -108.295 -108.3 -108.305 -108.31 -108.315 -108.32 -108.325 -108.33 -108.335 -108.34 -108.345 -108.35 -108.355 -108.36 -108.365 -108.37 -108.375 -108.38 -108.385 -108.39 -108.395 -108.4 -108.405 -108.41 -108.415 -108.42 -108.425 -108.43 -108.435 -108.44 -108.445 -108.45 -108.455 -108.46 -108.465 -108.47 -108.475 -108.48 -108.485 -108.49 -108.495 -108.5 -108.505 -108.51 -108.515 -108.52 -108.525 -108.53 -108.535 -108.54 -108.545 -108.55 -108.555 -108.56 -108.565 -108.57 -108.575 -108.58 -108.585 -108.59 -108.595 -108.6 -108.605 -108.61 -108.615 -108.62 -108.625 -108.63 -108.635 -108.64 -108.645 -108.65 -108.655 -108.66 -108.665 -108.67 -108.675 -108.68 -108.685 -108.69 -108.695 -108.7 -108.705 -108.71 -108.715 -108.72 -108.725 -108.73 -108.735 -108.74 -108.745 -108.75 -108.755 -108.76 -108.765 -108.77 -108.775 -108.78 -108.785 -108.79 -108.795 -108.8 -108.805 -108.81 -108.815 -108.82 -108.825 -108.83 -108.835 -108.84 -108.845 -108.85 -108.855 -108.86 -108.865 -108.87 -108.875 -108.88 -108.885 -108.89 -108.895 -108.9 -108.905 -108.91 -108.915 -108.92 -108.925 -108.93 -108.935 -108.94 -108.945 -108.95 -108.955 -108.96 -108.965 -108.97 -108.975 -108.98 -108.985 -108.99 -108.995 -109 -109.005 -109.01 -109.015 -109.02 -109.025 -109.03 -109.035 -109.04 -109.045 -109.05 -109.055 -109.06 -109.065 -109.07 -109.075 -109.08 -109.085 -109.09 -109.095 -109.1 -109.105 -109.11 -109.115 -109.12 -109.125 -109.13 -109.135 -109.14 -109.145 -109.15 -109.155 -109.16 -109.165 -109.17 -109.175 -109.18 -109.185 -109.19 -109.195 -109.2 -109.205 -109.21 -109.215 -109.22 -109.225 -109.23 -109.235 -109.24 -109.245 -109.25 -109.255 -109.26 -109.265 -109.27 -109.275 -109.28 -109.285 -109.29 -109.295 -109.3 -109.305 -109.31 -109.315 -109.32 -109.325 -109.33 -109.335 -109.34 -109.345 -109.35 -109.355 -109.36 -109.365 -109.37 -109.375 -109.38 -109.385 -109.39 -109.395 -109.4 -109.405 -109.41 -109.415 -109.42 -109.425 -109.43 -109.435 -109.44 -109.445 -109.45 -109.455 -109.46 -109.465 -109.47 -109.475 -109.48 -109.485 -109.49 -109.495 -109.5 -109.505 -109.51 -109.515 -109.52 -109.525 -109.53 -109.535 -109.54 -109.545 -109.55 -109.555 -109.56 -109.565 -109.57 -109.575 -109.58 -109.585 -109.59 -109.595 -109.6 -109.605 -109.61 -109.615 -109.62 -109.625 -109.63 -109.635 -109.64 -109.645 -109.65 -109.655 -109.66 -109.665 -109.67 -109.675 -109.68 -109.685 -109.69 -109.695 -109.7 -109.705 -109.71 -109.715 -109.72 -109.725 -109.73 -109.735 -109.74 -109.745 -109.75 -109.755 -109.76 -109.765 -109.77 -109.775 -109.78 -109.785 -109.79 -109.795 -109.8 -109.805 -109.81 -109.815 -109.82 -109.825 -109.83 -109.835 -109.84 -109.845 -109.85 -109.855 -109.86 -109.865 -109.87 -109.875 -109.88 -109.885 -109.89 -109.895 -109.9 -109.905 -109.91 -109.915 -109.92 -109.925 -109.93 -109.935 -109.94 -109.945 -109.95 -109.955 -109.96 -109.965 -109.97 -109.975 -109.98 -109.985 -109.99 -109.995 -110 -110.005 -110.01 -110.015 -110.02 -110.025 -110.03 -110.035 -110.04 -110.045 -110.05 -110.055 -110.06 -110.065 -110.07 -110.075 -110.08 -110.085 -110.09 -110.095 -110.1 -110.105 -110.11 -110.115 -110.12 -110.125 -110.13 -110.135 -110.14 -110.145 -110.15 -110.155 -110.16 -110.165 -110.17 -110.175 -110.18 -110.185 -110.19 -110.195 -110.2 -110.205 -110.21 -110.215 -110.22 -110.225 -110.23 -110.235 -110.24 -110.245 -110.25 -110.255 -110.26 -110.265 -110.27 -110.275 -110.28 -110.285 -110.29 -110.295 -110.3 -110.305 -110.31 -110.315 -110.32 -110.325 -110.33 -110.335 -110.34 -110.345 -110.35 -110.355 -110.36 -110.365 -110.37 -110.375 -110.38 -110.385 -110.39 -110.395 -110.4 -110.405 -110.41 -110.415 -110.42 -110.425 -110.43 -110.435 -110.44 -110.445 -110.45 -110.455 -110.46 -110.465 -110.47 -110.475 -110.48 -110.485 -110.49 -110.495 -110.5 -110.505 -110.51 -110.515 -110.52 -110.525 -110.53 -110.535 -110.54 -110.545 -110.55 -110.555 -110.56 -110.565 -110.57 -110.575 -110.58 -110.585 -110.59 -110.595 -110.6 -110.605 -110.61 -110.615 -110.62 -110.625 -110.63 -110.635 -110.64 -110.645 -110.65 -110.655 -110.66 -110.665 -110.67 -110.675 -110.68 -110.685 -110.69 -110.695 -110.7 -110.705 -110.71 -110.715 -110.72 -110.725 -110.73 -110.735 -110.74 -110.745 -110.75 -110.755 -110.76 -110.765 -110.77 -110.775 -110.78 -110.785 -110.79 -110.795 -110.8 -110.805 -110.81 -110.815 -110.82 -110.825 -110.83 -110.835 -110.84 -110.845 -110.85 -110.855 -110.86 -110.865 -110.87 -110.875 -110.88 -110.885 -110.89 -110.895 -110.9 -110.905 -110.91 -110.915 -110.92 -110.925 -110.93 -110.935 -110.94 -110.945 -110.95 -110.955 -110.96 -110.965 -110.97 -110.975 -110.98 -110.985 -110.99 -110.995 -111 -111.005 -111.01 -111.015 -111.02 -111.025 -111.03 -111.035 -111.04 -111.045 -111.05 -111.055 -111.06 -111.065 -111.07 -111.075 -111.08 -111.085 -111.09 -111.095 -111.1 -111.105 -111.11 -111.115 -111.12 -111.125 -111.13 -111.135 -111.14 -111.145 -111.15 -111.155 -111.16 -111.165 -111.17 -111.175 -111.18 -111.185 -111.19 -111.195 -111.2 -111.205 -111.21 -111.215 -111.22 -111.225 -111.23 -111.235 -111.24 -111.245 -111.25 -111.255 -111.26 -111.265 -111.27 -111.275 -111.28 -111.285 -111.29 -111.295 -111.3 -111.305 -111.31 -111.315 -111.32 -111.325 -111.33 -111.335 -111.34 -111.345 -111.35 -111.355 -111.36 -111.365 -111.37 -111.375 -111.38 -111.385 -111.39 -111.395 -111.4 -111.405 -111.41 -111.415 -111.42 -111.425 -111.43 -111.435 -111.44 -111.445 -111.45 -111.455 -111.46 -111.465 -111.47 -111.475 -111.48 -111.485 -111.49 -111.495 -111.5 -111.505 -111.51 -111.515 -111.52 -111.525 -111.53 -111.535 -111.54 -111.545 -111.55 -111.555 -111.56 -111.565 -111.57 -111.575 -111.58 -111.585 -111.59 -111.595 -111.6 -111.605 -111.61 -111.615 -111.62 -111.625 -111.63 -111.635 -111.64 -111.645 -111.65 -111.655 -111.66 -111.665 -111.67 -111.675 -111.68 -111.685 -111.69 -111.695 -111.7 -111.705 -111.71 -111.715 -111.72 -111.725 -111.73 -111.735 -111.74 -111.745 -111.75 -111.755 -111.76 -111.765 -111.77 -111.775 -111.78 -111.785 -111.79 -111.795 -111.8 -111.805 -111.81 -111.815 -111.82 -111.825 -111.83 -111.835 -111.84 -111.845 -111.85 -111.855 -111.86 -111.865 -111.87 -111.875 -111.88 -111.885 -111.89 -111.895 -111.9 -111.905 -111.91 -111.915 -111.92 -111.925 -111.93 -111.935 -111.94 -111.945 -111.95 -111.955 -111.96 -111.965 -111.97 -111.975 -111.98 -111.985 -111.99 -111.995 -112 -112.005 -112.01 -112.015 -112.02 -112.025 -112.03 -112.035 -112.04 -112.045 -112.05 -112.055 -112.06 -112.065 -112.07 -112.075 -112.08 -112.085 -112.09 -112.095 -112.1 -112.105 -112.11 -112.115 -112.12 -112.125 -112.13 -112.135 -112.14 -112.145 -112.15 -112.155 -112.16 -112.165 -112.17 -112.175 -112.18 -112.185 -112.19 -112.195 -112.2 -112.205 -112.21 -112.215 -112.22 -112.225 -112.23 -112.235 -112.24 -112.245 -112.25 -112.255 -112.26 -112.265 -112.27 -112.275 -112.28 -112.285 -112.29 -112.295 -112.3 -112.305 -112.31 -112.315 -112.32 -112.325 -112.33 -112.335 -112.34 -112.345 -112.35 -112.355 -112.36 -112.365 -112.37 -112.375 -112.38 -112.385 -112.39 -112.395 -112.4 -112.405 -112.41 -112.415 -112.42 -112.425 -112.43 -112.435 -112.44 -112.445 -112.45 -112.455 -112.46 -112.465 -112.47 -112.475 -112.48 -112.485 -112.49 -112.495 -112.5 -112.505 -112.51 -112.515 -112.52 -112.525 -112.53 -112.535 -112.54 -112.545 -112.55 -112.555 -112.56 -112.565 -112.57 -112.575 -112.58 -112.585 -112.59 -112.595 -112.6 -112.605 -112.61 -112.615 -112.62 -112.625 -112.63 -112.635 -112.64 -112.645 -112.65 -112.655 -112.66 -112.665 -112.67 -112.675 -112.68 -112.685 -112.69 -112.695 -112.7 -112.705 -112.71 -112.715 -112.72 -112.725 -112.73 -112.735 -112.74 -112.745 -112.75 -112.755 -112.76 -112.765 -112.77 -112.775 -112.78 -112.785 -112.79 -112.795 -112.8 -112.805 -112.81 -112.815 -112.82 -112.825 -112.83 -112.835 -112.84 -112.845 -112.85 -112.855 -112.86 -112.865 -112.87 -112.875 -112.88 -112.885 -112.89 -112.895 -112.9 -112.905 -112.91 -112.915 -112.92 -112.925 -112.93 -112.935 -112.94 -112.945 -112.95 -112.955 -112.96 -112.965 -112.97 -112.975 -112.98 -112.985 -112.99 -112.995 -113 -113.005 -113.01 -113.015 -113.02 -113.025 -113.03 -113.035 -113.04 -113.045 -113.05 -113.055 -113.06 -113.065 -113.07 -113.075 -113.08 -113.085 -113.09 -113.095 -113.1 -113.105 -113.11 -113.115 -113.12 -113.125 -113.13 -113.135 -113.14 -113.145 -113.15 -113.155 -113.16 -113.165 -113.17 -113.175 -113.18 -113.185 -113.19 -113.195 -113.2 -113.205 -113.21 -113.215 -113.22 -113.225 -113.23 -113.235 -113.24 -113.245 -113.25 -113.255 -113.26 -113.265 -113.27 -113.275 -113.28 -113.285 -113.29 -113.295 -113.3 -113.305 -113.31 -113.315 -113.32 -113.325 -113.33 -113.335 -113.34 -113.345 -113.35 -113.355 -113.36 -113.365 -113.37 -113.375 -113.38 -113.385 -113.39 -113.395 -113.4 -113.405 -113.41 -113.415 -113.42 -113.425 -113.43 -113.435 -113.44 -113.445 -113.45 -113.455 -113.46 -113.465 -113.47 -113.475 -113.48 -113.485 -113.49 -113.495 -113.5 -113.505 -113.51 -113.515 -113.52 -113.525 -113.53 -113.535 -113.54 -113.545 -113.55 -113.555 -113.56 -113.565 -113.57 -113.575 -113.58 -113.585 -113.59 -113.595 -113.6 -113.605 -113.61 -113.615 -113.62 -113.625 -113.63 -113.635 -113.64 -113.645 -113.65 -113.655 -113.66 -113.665 -113.67 -113.675 -113.68 -113.685 -113.69 -113.695 -113.7 -113.705 -113.71 -113.715 -113.72 -113.725 -113.73 -113.735 -113.74 -113.745 -113.75 -113.755 -113.76 -113.765 -113.77 -113.775 -113.78 -113.785 -113.79 -113.795 -113.8 -113.805 -113.81 -113.815 -113.82 -113.825 -113.83 -113.835 -113.84 -113.845 -113.85 -113.855 -113.86 -113.865 -113.87 -113.875 -113.88 -113.885 -113.89 -113.895 -113.9 -113.905 -113.91 -113.915 -113.92 -113.925 -113.93 -113.935 -113.94 -113.945 -113.95 -113.955 -113.96 -113.965 -113.97 -113.975 -113.98 -113.985 -113.99 -113.995 -114 -114.005 -114.01 -114.015 -114.02 -114.025 -114.03 -114.035 -114.04 -114.045 -114.05 -114.055 -114.06 -114.065 -114.07 -114.075 -114.08 -114.085 -114.09 -114.095 -114.1 -114.105 -114.11 -114.115 -114.12 -114.125 -114.13 -114.135 -114.14 -114.145 -114.15 -114.155 -114.16 -114.165 -114.17 -114.175 -114.18 -114.185 -114.19 -114.195 -114.2 -114.205 -114.21 -114.215 -114.22 -114.225 -114.23 -114.235 -114.24 -114.245 -114.25 -114.255 -114.26 -114.265 -114.27 -114.275 -114.28 -114.285 -114.29 -114.295 -114.3 -114.305 -114.31 -114.315 -114.32 -114.325 -114.33 -114.335 -114.34 -114.345 -114.35 -114.355 -114.36 -114.365 -114.37 -114.375 -114.38 -114.385 -114.39 -114.395 -114.4 -114.405 -114.41 -114.415 -114.42 -114.425 -114.43 -114.435 -114.44 -114.445 -114.45 -114.455 -114.46 -114.465 -114.47 -114.475 -114.48 -114.485 -114.49 -114.495 -114.5 -114.505 -114.51 -114.515 -114.52 -114.525 -114.53 -114.535 -114.54 -114.545 -114.55 -114.555 -114.56 -114.565 -114.57 -114.575 -114.58 -114.585 -114.59 -114.595 -114.6 -114.605 -114.61 -114.615 -114.62 -114.625 -114.63 -114.635 -114.64 -114.645 -114.65 -114.655 -114.66 -114.665 -114.67 -114.675 -114.68 -114.685 -114.69 -114.695 -114.7 -114.705 -114.71 -114.715 -114.72 -114.725 -114.73 -114.735 -114.74 -114.745 -114.75 -114.755 -114.76 -114.765 -114.77 -114.775 -114.78 -114.785 -114.79 -114.795 -114.8 -114.805 -114.81 -114.815 -114.82 -114.825 -114.83 -114.835 -114.84 -114.845 -114.85 -114.855 -114.86 -114.865 -114.87 -114.875 -114.88 -114.885 -114.89 -114.895 -114.9 -114.905 -114.91 -114.915 -114.92 -114.925 -114.93 -114.935 -114.94 -114.945 -114.95 -114.955 -114.96 -114.965 -114.97 -114.975 -114.98 -114.985 -114.99 -114.995 -115 -115.005 -115.01 -115.015 -115.02 -115.025 -115.03 -115.035 -115.04 -115.045 -115.05 -115.055 -115.06 -115.065 -115.07 -115.075 -115.08 -115.085 -115.09 -115.095 -115.1 -115.105 -115.11 -115.115 -115.12 -115.125 -115.13 -115.135 -115.14 -115.145 -115.15 -115.155 -115.16 -115.165 -115.17 -115.175 -115.18 -115.185 -115.19 -115.195 -115.2 -115.205 -115.21 -115.215 -115.22 -115.225 -115.23 -115.235 -115.24 -115.245 -115.25 -115.255 -115.26 -115.265 -115.27 -115.275 -115.28 -115.285 -115.29 -115.295 -115.3 -115.305 -115.31 -115.315 -115.32 -115.325 -115.33 -115.335 -115.34 -115.345 -115.35 -115.355 -115.36 -115.365 -115.37 -115.375 -115.38 -115.385 -115.39 -115.395 -115.4 -115.405 -115.41 -115.415 -115.42 -115.425 -115.43 -115.435 -115.44 -115.445 -115.45 -115.455 -115.46 -115.465 -115.47 -115.475 -115.48 -115.485 -115.49 -115.495 -115.5 -115.505 -115.51 -115.515 -115.52 -115.525 -115.53 -115.535 -115.54 -115.545 -115.55 -115.555 -115.56 -115.565 -115.57 -115.575 -115.58 -115.585 -115.59 -115.595 -115.6 -115.605 -115.61 -115.615 -115.62 -115.625 -115.63 -115.635 -115.64 -115.645 -115.65 -115.655 -115.66 -115.665 -115.67 -115.675 -115.68 -115.685 -115.69 -115.695 -115.7 -115.705 -115.71 -115.715 -115.72 -115.725 -115.73 -115.735 -115.74 -115.745 -115.75 -115.755 -115.76 -115.765 -115.77 -115.775 -115.78 -115.785 -115.79 -115.795 -115.8 -115.805 -115.81 -115.815 -115.82 -115.825 -115.83 -115.835 -115.84 -115.845 -115.85 -115.855 -115.86 -115.865 -115.87 -115.875 -115.88 -115.885 -115.89 -115.895 -115.9 -115.905 -115.91 -115.915 -115.92 -115.925 -115.93 -115.935 -115.94 -115.945 -115.95 -115.955 -115.96 -115.965 -115.97 -115.975 -115.98 -115.985 -115.99 -115.995 -116 -116.005 -116.01 -116.015 -116.02 -116.025 -116.03 -116.035 -116.04 -116.045 -116.05 -116.055 -116.06 -116.065 -116.07 -116.075 -116.08 -116.085 -116.09 -116.095 -116.1 -116.105 -116.11 -116.115 -116.12 -116.125 -116.13 -116.135 -116.14 -116.145 -116.15 -116.155 -116.16 -116.165 -116.17 -116.175 -116.18 -116.185 -116.19 -116.195 -116.2 -116.205 -116.21 -116.215 -116.22 -116.225 -116.23 -116.235 -116.24 -116.245 -116.25 -116.255 -116.26 -116.265 -116.27 -116.275 -116.28 -116.285 -116.29 -116.295 -116.3 -116.305 -116.31 -116.315 -116.32 -116.325 -116.33 -116.335 -116.34 -116.345 -116.35 -116.355 -116.36 -116.365 -116.37 -116.375 -116.38 -116.385 -116.39 -116.395 -116.4 -116.405 -116.41 -116.415 -116.42 -116.425 -116.43 -116.435 -116.44 -116.445 -116.45 -116.455 -116.46 -116.465 -116.47 -116.475 -116.48 -116.485 -116.49 -116.495 -116.5 -116.505 -116.51 -116.515 -116.52 -116.525 -116.53 -116.535 -116.54 -116.545 -116.55 -116.555 -116.56 -116.565 -116.57 -116.575 -116.58 -116.585 -116.59 -116.595 -116.6 -116.605 -116.61 -116.615 -116.62 -116.625 -116.63 -116.635 -116.64 -116.645 -116.65 -116.655 -116.66 -116.665 -116.67 -116.675 -116.68 -116.685 -116.69 -116.695 -116.7 -116.705 -116.71 -116.715 -116.72 -116.725 -116.73 -116.735 -116.74 -116.745 -116.75 -116.755 -116.76 -116.765 -116.77 -116.775 -116.78 -116.785 -116.79 -116.795 -116.8 -116.805 -116.81 -116.815 -116.82 -116.825 -116.83 -116.835 -116.84 -116.845 -116.85 -116.855 -116.86 -116.865 -116.87 -116.875 -116.88 -116.885 -116.89 -116.895 -116.9 -116.905 -116.91 -116.915 -116.92 -116.925 -116.93 -116.935 -116.94 -116.945 -116.95 -116.955 -116.96 -116.965 -116.97 -116.975 -116.98 -116.985 -116.99 -116.995 -117 -117.005 -117.01 -117.015 -117.02 -117.025 -117.03 -117.035 -117.04 -117.045 -117.05 -117.055 -117.06 -117.065 -117.07 -117.075 -117.08 -117.085 -117.09 -117.095 -117.1 -117.105 -117.11 -117.115 -117.12 -117.125 -117.13 -117.135 -117.14 -117.145 -117.15 -117.155 -117.16 -117.165 -117.17 -117.175 -117.18 -117.185 -117.19 -117.195 -117.2 -117.205 -117.21 -117.215 -117.22 -117.225 -117.23 -117.235 -117.24 -117.245 -117.25 -117.255 -117.26 -117.265 -117.27 -117.275 -117.28 -117.285 -117.29 -117.295 -117.3 -117.305 -117.31 -117.315 -117.32 -117.325 -117.33 -117.335 -117.34 -117.345 -117.35 -117.355 -117.36 -117.365 -117.37 -117.375 -117.38 -117.385 -117.39 -117.395 -117.4 -117.405 -117.41 -117.415 -117.42 -117.425 -117.43 -117.435 -117.44 -117.445 -117.45 -117.455 -117.46 -117.465 -117.47 -117.475 -117.48 -117.485 -117.49 -117.495 -117.5 -117.505 -117.51 -117.515 -117.52 -117.525 -117.53 -117.535 -117.54 -117.545 -117.55 -117.555 -117.56 -117.565 -117.57 -117.575 -117.58 -117.585 -117.59 -117.595 -117.6 -117.605 -117.61 -117.615 -117.62 -117.625 -117.63 -117.635 -117.64 -117.645 -117.65 -117.655 -117.66 -117.665 -117.67 -117.675 -117.68 -117.685 -117.69 -117.695 -117.7 -117.705 -117.71 -117.715 -117.72 -117.725 -117.73 -117.735 -117.74 -117.745 -117.75 -117.755 -117.76 -117.765 -117.77 -117.775 -117.78 -117.785 -117.79 -117.795 -117.8 -117.805 -117.81 -117.815 -117.82 -117.825 -117.83 -117.835 -117.84 -117.845 -117.85 -117.855 -117.86 -117.865 -117.87 -117.875 -117.88 -117.885 -117.89 -117.895 -117.9 -117.905 -117.91 -117.915 -117.92 -117.925 -117.93 -117.935 -117.94 -117.945 -117.95 -117.955 -117.96 -117.965 -117.97 -117.975 -117.98 -117.985 -117.99 -117.995 -118 -118.005 -118.01 -118.015 -118.02 -118.025 -118.03 -118.035 -118.04 -118.045 -118.05 -118.055 -118.06 -118.065 -118.07 -118.075 -118.08 -118.085 -118.09 -118.095 -118.1 -118.105 -118.11 -118.115 -118.12 -118.125 -118.13 -118.135 -118.14 -118.145 -118.15 -118.155 -118.16 -118.165 -118.17 -118.175 -118.18 -118.185 -118.19 -118.195 -118.2 -118.205 -118.21 -118.215 -118.22 -118.225 -118.23 -118.235 -118.24 -118.245 -118.25 -118.255 -118.26 -118.265 -118.27 -118.275 -118.28 -118.285 -118.29 -118.295 -118.3 -118.305 -118.31 -118.315 -118.32 -118.325 -118.33 -118.335 -118.34 -118.345 -118.35 -118.355 -118.36 -118.365 -118.37 -118.375 -118.38 -118.385 -118.39 -118.395 -118.4 -118.405 -118.41 -118.415 -118.42 -118.425 -118.43 -118.435 -118.44 -118.445 -118.45 -118.455 -118.46 -118.465 -118.47 -118.475 -118.48 -118.485 -118.49 -118.495 -118.5 -118.505 -118.51 -118.515 -118.52 -118.525 -118.53 -118.535 -118.54 -118.545 -118.55 -118.555 -118.56 -118.565 -118.57 -118.575 -118.58 -118.585 -118.59 -118.595 -118.6 -118.605 -118.61 -118.615 -118.62 -118.625 -118.63 -118.635 -118.64 -118.645 -118.65 -118.655 -118.66 -118.665 -118.67 -118.675 -118.68 -118.685 -118.69 -118.695 -118.7 -118.705 -118.71 -118.715 -118.72 -118.725 -118.73 -118.735 -118.74 -118.745 -118.75 -118.755 -118.76 -118.765 -118.77 -118.775 -118.78 -118.785 -118.79 -118.795 -118.8 -118.805 -118.81 -118.815 -118.82 -118.825 -118.83 -118.835 -118.84 -118.845 -118.85 -118.855 -118.86 -118.865 -118.87 -118.875 -118.88 -118.885 -118.89 -118.895 -118.9 -118.905 -118.91 -118.915 -118.92 -118.925 -118.93 -118.935 -118.94 -118.945 -118.95 -118.955 -118.96 -118.965 -118.97 -118.975 -118.98 -118.985 -118.99 -118.995 -119 -119.005 -119.01 -119.015 -119.02 -119.025 -119.03 -119.035 -119.04 -119.045 -119.05 -119.055 -119.06 -119.065 -119.07 -119.075 -119.08 -119.085 -119.09 -119.095 -119.1 -119.105 -119.11 -119.115 -119.12 -119.125 -119.13 -119.135 -119.14 -119.145 -119.15 -119.155 -119.16 -119.165 -119.17 -119.175 -119.18 -119.185 -119.19 -119.195 -119.2 -119.205 -119.21 -119.215 -119.22 -119.225 -119.23 -119.235 -119.24 -119.245 -119.25 -119.255 -119.26 -119.265 -119.27 -119.275 -119.28 -119.285 -119.29 -119.295 -119.3 -119.305 -119.31 -119.315 -119.32 -119.325 -119.33 -119.335 -119.34 -119.345 -119.35 -119.355 -119.36 -119.365 -119.37 -119.375 -119.38 -119.385 -119.39 -119.395 -119.4 -119.405 -119.41 -119.415 -119.42 -119.425 -119.43 -119.435 -119.44 -119.445 -119.45 -119.455 -119.46 -119.465 -119.47 -119.475 -119.48 -119.485 -119.49 -119.495 -119.5 -119.505 -119.51 -119.515 -119.52 -119.525 -119.53 -119.535 -119.54 -119.545 -119.55 -119.555 -119.56 -119.565 -119.57 -119.575 -119.58 -119.585 -119.59 -119.595 -119.6 -119.605 -119.61 -119.615 -119.62 -119.625 -119.63 -119.635 -119.64 -119.645 -119.65 -119.655 -119.66 -119.665 -119.67 -119.675 -119.68 -119.685 -119.69 -119.695 -119.7 -119.705 -119.71 -119.715 -119.72 -119.725 -119.73 -119.735 -119.74 -119.745 -119.75 -119.755 -119.76 -119.765 -119.77 -119.775 -119.78 -119.785 -119.79 -119.795 -119.8 -119.805 -119.81 -119.815 -119.82 -119.825 -119.83 -119.835 -119.84 -119.845 -119.85 -119.855 -119.86 -119.865 -119.87 -119.875 -119.88 -119.885 -119.89 -119.895 -119.9 -119.905 -119.91 -119.915 -119.92 -119.925 -119.93 -119.935 -119.94 -119.945 -119.95 -119.955 -119.96 -119.965 -119.97 -119.975 -119.98 -119.985 -119.99 -119.995 -120 -120.005 -120.01 -120.015 -120.02 -120.025 -120.03 -120.035 -120.04 -120.045 -120.05 -120.055 -120.06 -120.065 -120.07 -120.075 -120.08 -120.085 -120.09 -120.095 -120.1 -120.105 -120.11 -120.115 -120.12 -120.125 -120.13 -120.135 -120.14 -120.145 -120.15 -120.155 -120.16 -120.165 -120.17 -120.175 -120.18 -120.185 -120.19 -120.195 -120.2 -120.205 -120.21 -120.215 -120.22 -120.225 -120.23 -120.235 -120.24 -120.245 -120.25 -120.255 -120.26 -120.265 -120.27 -120.275 -120.28 -120.285 -120.29 -120.295 -120.3 -120.305 -120.31 -120.315 -120.32 -120.325 -120.33 -120.335 -120.34 -120.345 -120.35 -120.355 -120.36 -120.365 -120.37 -120.375 -120.38 -120.385 -120.39 -120.395 -120.4 -120.405 -120.41 -120.415 -120.42 -120.425 -120.43 -120.435 -120.44 -120.445 -120.45 -120.455 -120.46 -120.465 -120.47 -120.475 -120.48 -120.485 -120.49 -120.495 -120.5 -120.505 -120.51 -120.515 -120.52 -120.525 -120.53 -120.535 -120.54 -120.545 -120.55 -120.555 -120.56 -120.565 -120.57 -120.575 -120.58 -120.585 -120.59 -120.595 -120.6 -120.605 -120.61 -120.615 -120.62 -120.625 -120.63 -120.635 -120.64 -120.645 -120.65 -120.655 -120.66 -120.665 -120.67 -120.675 -120.68 -120.685 -120.69 -120.695 -120.7 -120.705 -120.71 -120.715 -120.72 -120.725 -120.73 -120.735 -120.74 -120.745 -120.75 -120.755 -120.76 -120.765 -120.77 -120.775 -120.78 -120.785 -120.79 -120.795 -120.8 -120.805 -120.81 -120.815 -120.82 -120.825 -120.83 -120.835 -120.84 -120.845 -120.85 -120.855 -120.86 -120.865 -120.87 -120.875 -120.88 -120.885 -120.89 -120.895 -120.9 -120.905 -120.91 -120.915 -120.92 -120.925 -120.93 -120.935 -120.94 -120.945 -120.95 -120.955 -120.96 -120.965 -120.97 -120.975 -120.98 -120.985 -120.99 -120.995 -121 -121.005 -121.01 -121.015 -121.02 -121.025 -121.03 -121.035 -121.04 -121.045 -121.05 -121.055 -121.06 -121.065 -121.07 -121.075 -121.08 -121.085 -121.09 -121.095 -121.1 -121.105 -121.11 -121.115 -121.12 -121.125 -121.13 -121.135 -121.14 -121.145 -121.15 -121.155 -121.16 -121.165 -121.17 -121.175 -121.18 -121.185 -121.19 -121.195 -121.2 -121.205 -121.21 -121.215 -121.22 -121.225 -121.23 -121.235 -121.24 -121.245 -121.25 -121.255 -121.26 -121.265 -121.27 -121.275 -121.28 -121.285 -121.29 -121.295 -121.3 -121.305 -121.31 -121.315 -121.32 -121.325 -121.33 -121.335 -121.34 -121.345 -121.35 -121.355 -121.36 -121.365 -121.37 -121.375 -121.38 -121.385 -121.39 -121.395 -121.4 -121.405 -121.41 -121.415 -121.42 -121.425 -121.43 -121.435 -121.44 -121.445 -121.45 -121.455 -121.46 -121.465 -121.47 -121.475 -121.48 -121.485 -121.49 -121.495 -121.5 -121.505 -121.51 -121.515 -121.52 -121.525 -121.53 -121.535 -121.54 -121.545 -121.55 -121.555 -121.56 -121.565 -121.57 -121.575 -121.58 -121.585 -121.59 -121.595 -121.6 -121.605 -121.61 -121.615 -121.62 -121.625 -121.63 -121.635 -121.64 -121.645 -121.65 -121.655 -121.66 -121.665 -121.67 -121.675 -121.68 -121.685 -121.69 -121.695 -121.7 -121.705 -121.71 -121.715 -121.72 -121.725 -121.73 -121.735 -121.74 -121.745 -121.75 -121.755 -121.76 -121.765 -121.77 -121.775 -121.78 -121.785 -121.79 -121.795 -121.8 -121.805 -121.81 -121.815 -121.82 -121.825 -121.83 -121.835 -121.84 -121.845 -121.85 -121.855 -121.86 -121.865 -121.87 -121.875 -121.88 -121.885 -121.89 -121.895 -121.9 -121.905 -121.91 -121.915 -121.92 -121.925 -121.93 -121.935 -121.94 -121.945 -121.95 -121.955 -121.96 -121.965 -121.97 -121.975 -121.98 -121.985 -121.99 -121.995 -122 -122.005 -122.01 -122.015 -122.02 -122.025 -122.03 -122.035 -122.04 -122.045 -122.05 -122.055 -122.06 -122.065 -122.07 -122.075 -122.08 -122.085 -122.09 -122.095 -122.1 -122.105 -122.11 -122.115 -122.12 -122.125 -122.13 -122.135 -122.14 -122.145 -122.15 -122.155 -122.16 -122.165 -122.17 -122.175 -122.18 -122.185 -122.19 -122.195 -122.2 -122.205 -122.21 -122.215 -122.22 -122.225 -122.23 -122.235 -122.24 -122.245 -122.25 -122.255 -122.26 -122.265 -122.27 -122.275 -122.28 -122.285 -122.29 -122.295 -122.3 -122.305 -122.31 -122.315 -122.32 -122.325 -122.33 -122.335 -122.34 -122.345 -122.35 -122.355 -122.36 -122.365 -122.37 -122.375 -122.38 -122.385 -122.39 -122.395 -122.4 -122.405 -122.41 -122.415 -122.42 -122.425 -122.43 -122.435 -122.44 -122.445 -122.45 -122.455 -122.46 -122.465 -122.47 -122.475 -122.48 -122.485 -122.49 -122.495 -122.5 -122.505 -122.51 -122.515 -122.52 -122.525 -122.53 -122.535 -122.54 -122.545 -122.55 -122.555 -122.56 -122.565 -122.57 -122.575 -122.58 -122.585 -122.59 -122.595 -122.6 -122.605 -122.61 -122.615 -122.62 -122.625 -122.63 -122.635 -122.64 -122.645 -122.65 -122.655 -122.66 -122.665 -122.67 -122.675 -122.68 -122.685 -122.69 -122.695 -122.7 -122.705 -122.71 -122.715 -122.72 -122.725 -122.73 -122.735 -122.74 -122.745 -122.75 -122.755 -122.76 -122.765 -122.77 -122.775 -122.78 -122.785 -122.79 -122.795 -122.8 -122.805 -122.81 -122.815 -122.82 -122.825 -122.83 -122.835 -122.84 -122.845 -122.85 -122.855 -122.86 -122.865 -122.87 -122.875 -122.88 -122.885 -122.89 -122.895 -122.9 -122.905 -122.91 -122.915 -122.92 -122.925 -122.93 -122.935 -122.94 -122.945 -122.95 -122.955 -122.96 -122.965 -122.97 -122.975 -122.98 -122.985 -122.99 -122.995 -123 -123.005 -123.01 -123.015 -123.02 -123.025 -123.03 -123.035 -123.04 -123.045 -123.05 -123.055 -123.06 -123.065 -123.07 -123.075 -123.08 -123.085 -123.09 -123.095 -123.1 -123.105 -123.11 -123.115 -123.12 -123.125 -123.13 -123.135 -123.14 -123.145 -123.15 -123.155 -123.16 -123.165 -123.17 -123.175 -123.18 -123.185 -123.19 -123.195 -123.2 -123.205 -123.21 -123.215 -123.22 -123.225 -123.23 -123.235 -123.24 -123.245 -123.25 -123.255 -123.26 -123.265 -123.27 -123.275 -123.28 -123.285 -123.29 -123.295 -123.3 -123.305 -123.31 -123.315 -123.32 -123.325 -123.33 -123.335 -123.34 -123.345 -123.35 -123.355 -123.36 -123.365 -123.37 -123.375 -123.38 -123.385 -123.39 -123.395 -123.4 -123.405 -123.41 -123.415 -123.42 -123.425 -123.43 -123.435 -123.44 -123.445 -123.45 -123.455 -123.46 -123.465 -123.47 -123.475 -123.48 -123.485 -123.49 -123.495 -123.5 -123.505 -123.51 -123.515 -123.52 -123.525 -123.53 -123.535 -123.54 -123.545 -123.55 -123.555 -123.56 -123.565 -123.57 -123.575 -123.58 -123.585 -123.59 -123.595 -123.6 -123.605 -123.61 -123.615 -123.62 -123.625 -123.63 -123.635 -123.64 -123.645 -123.65 -123.655 -123.66 -123.665 -123.67 -123.675 -123.68 -123.685 -123.69 -123.695 -123.7 -123.705 -123.71 -123.715 -123.72 -123.725 -123.73 -123.735 -123.74 -123.745 -123.75 -123.755 -123.76 -123.765 -123.77 -123.775 -123.78 -123.785 -123.79 -123.795 -123.8 -123.805 -123.81 -123.815 -123.82 -123.825 -123.83 -123.835 -123.84 -123.845 -123.85 -123.855 -123.86 -123.865 -123.87 -123.875 -123.88 -123.885 -123.89 -123.895 -123.9 -123.905 -123.91 -123.915 -123.92 -123.925 -123.93 -123.935 -123.94 -123.945 -123.95 -123.955 -123.96 -123.965 -123.97 -123.975 -123.98 -123.985 -123.99 -123.995 -124 -124.005 -124.01 -124.015 -124.02 -124.025 -124.03 -124.035 -124.04 -124.045 -124.05 -124.055 -124.06 -124.065 -124.07 -124.075 -124.08 -124.085 -124.09 -124.095 -124.1 -124.105 -124.11 -124.115 -124.12 -124.125 -124.13 -124.135 -124.14 -124.145 -124.15 -124.155 -124.16 -124.165 -124.17 -124.175 -124.18 -124.185 -124.19 -124.195 -124.2 -124.205 -124.21 -124.215 -124.22 -124.225 -124.23 -124.235 -124.24 -124.245 -124.25 -124.255 -124.26 -124.265 -124.27 -124.275 -124.28 -124.285 -124.29 -124.295 -124.3 -124.305 -124.31 -124.315 -124.32 -124.325 -124.33 -124.335 -124.34 -124.345 -124.35 -124.355 -124.36 -124.365 -124.37 -124.375 -124.38 -124.385 -124.39 -124.395 -124.4 -124.405 -124.41 -124.415 -124.42 -124.425 -124.43 -124.435 -124.44 -124.445 -124.45 -124.455 -124.46 -124.465 -124.47 -124.475 -124.48 -124.485 -124.49 -124.495 -124.5 -124.505 -124.51 -124.515 -124.52 -124.525 -124.53 -124.535 -124.54 -124.545 -124.55 -124.555 -124.56 -124.565 -124.57 -124.575 -124.58 -124.585 -124.59 -124.595 -124.6 -124.605 -124.61 -124.615 -124.62 -124.625 -124.63 -124.635 -124.64 -124.645 -124.65 -124.655 -124.66 -124.665 -124.67 -124.675 -124.68 -124.685 -124.69 -124.695 -124.7 -124.705 -124.71 -124.715 -124.72 -124.725 -124.73 -124.735 -124.74 -124.745 -124.75 -124.755 -124.76 -124.765 -124.77 -124.775 -124.78 -124.785 -124.79 -124.795 -124.8 -124.805 -124.81 -124.815 -124.82 -124.825 -124.83 -124.835 -124.84 -124.845 -124.85 -124.855 -124.86 -124.865 -124.87 -124.875 -124.88 -124.885 -124.89 -124.895 -124.9 -124.905 -124.91 -124.915 -124.92 -124.925 -124.93 -124.935 -124.94 -124.945 -124.95 -124.955 -124.96 -124.965 -124.97 -124.975 -124.98 -124.985 -124.99 -124.995 -125 -125.005 -125.01 -125.015 -125.02 -125.025 -125.03 -125.035 -125.04 -125.045 -125.05 -125.055 -125.06 -125.065 -125.07 -125.075 -125.08 -125.085 -125.09 -125.095 -125.1 -125.105 -125.11 -125.115 -125.12 -125.125 -125.13 -125.135 -125.14 -125.145 -125.15 -125.155 -125.16 -125.165 -125.17 -125.175 -125.18 -125.185 -125.19 -125.195 -125.2 -125.205 -125.21 -125.215 -125.22 -125.225 -125.23 -125.235 -125.24 -125.245 -125.25 -125.255 -125.26 -125.265 -125.27 -125.275 -125.28 -125.285 -125.29 -125.295 -125.3 -125.305 -125.31 -125.315 -125.32 -125.325 -125.33 -125.335 -125.34 -125.345 -125.35 -125.355 -125.36 -125.365 -125.37 -125.375 -125.38 -125.385 -125.39 -125.395 -125.4 -125.405 -125.41 -125.415 -125.42 -125.425 -125.43 -125.435 -125.44 -125.445 -125.45 -125.455 -125.46 -125.465 -125.47 -125.475 -125.48 -125.485 -125.49 -125.495 -125.5 -125.505 -125.51 -125.515 -125.52 -125.525 -125.53 -125.535 -125.54 -125.545 -125.55 -125.555 -125.56 -125.565 -125.57 -125.575 -125.58 -125.585 -125.59 -125.595 -125.6 -125.605 -125.61 -125.615 -125.62 -125.625 -125.63 -125.635 -125.64 -125.645 -125.65 -125.655 -125.66 -125.665 -125.67 -125.675 -125.68 -125.685 -125.69 -125.695 -125.7 -125.705 -125.71 -125.715 -125.72 -125.725 -125.73 -125.735 -125.74 -125.745 -125.75 -125.755 -125.76 -125.765 -125.77 -125.775 -125.78 -125.785 -125.79 -125.795 -125.8 -125.805 -125.81 -125.815 -125.82 -125.825 -125.83 -125.835 -125.84 -125.845 -125.85 -125.855 -125.86 -125.865 -125.87 -125.875 -125.88 -125.885 -125.89 -125.895 -125.9 -125.905 -125.91 -125.915 -125.92 -125.925 -125.93 -125.935 -125.94 -125.945 -125.95 -125.955 -125.96 -125.965 -125.97 -125.975 -125.98 -125.985 -125.99 -125.995 -126 -126.005 -126.01 -126.015 -126.02 -126.025 -126.03 -126.035 -126.04 -126.045 -126.05 -126.055 -126.06 -126.065 -126.07 -126.075 -126.08 -126.085 -126.09 -126.095 -126.1 -126.105 -126.11 -126.115 -126.12 -126.125 -126.13 -126.135 -126.14 -126.145 -126.15 -126.155 -126.16 -126.165 -126.17 -126.175 -126.18 -126.185 -126.19 -126.195 -126.2 -126.205 -126.21 -126.215 -126.22 -126.225 -126.23 -126.235 -126.24 -126.245 -126.25 -126.255 -126.26 -126.265 -126.27 -126.275 -126.28 -126.285 -126.29 -126.295 -126.3 -126.305 -126.31 -126.315 -126.32 -126.325 -126.33 -126.335 -126.34 -126.345 -126.35 -126.355 -126.36 -126.365 -126.37 -126.375 -126.38 -126.385 -126.39 -126.395 -126.4 -126.405 -126.41 -126.415 -126.42 -126.425 -126.43 -126.435 -126.44 -126.445 -126.45 -126.455 -126.46 -126.465 -126.47 -126.475 -126.48 -126.485 -126.49 -126.495 -126.5 -126.505 -126.51 -126.515 -126.52 -126.525 -126.53 -126.535 -126.54 -126.545 -126.55 -126.555 -126.56 -126.565 -126.57 -126.575 -126.58 -126.585 -126.59 -126.595 -126.6 -126.605 -126.61 -126.615 -126.62 -126.625 -126.63 -126.635 -126.64 -126.645 -126.65 -126.655 -126.66 -126.665 -126.67 -126.675 -126.68 -126.685 -126.69 -126.695 -126.7 -126.705 -126.71 -126.715 -126.72 -126.725 -126.73 -126.735 -126.74 -126.745 -126.75 -126.755 -126.76 -126.765 -126.77 -126.775 -126.78 -126.785 -126.79 -126.795 -126.8 -126.805 -126.81 -126.815 -126.82 -126.825 -126.83 -126.835 -126.84 -126.845 -126.85 -126.855 -126.86 -126.865 -126.87 -126.875 -126.88 -126.885 -126.89 -126.895 -126.9 -126.905 -126.91 -126.915 -126.92 -126.925 -126.93 -126.935 -126.94 -126.945 -126.95 -126.955 -126.96 -126.965 -126.97 -126.975 -126.98 -126.985 -126.99 -126.995 -127 -127.005 -127.01 -127.015 -127.02 -127.025 -127.03 -127.035 -127.04 -127.045 -127.05 -127.055 -127.06 -127.065 -127.07 -127.075 -127.08 -127.085 -127.09 -127.095 -127.1 -127.105 -127.11 -127.115 -127.12 -127.125 -127.13 -127.135 -127.14 -127.145 -127.15 -127.155 -127.16 -127.165 -127.17 -127.175 -127.18 -127.185 -127.19 -127.195 -127.2 -127.205 -127.21 -127.215 -127.22 -127.225 -127.23 -127.235 -127.24 -127.245 -127.25 -127.255 -127.26 -127.265 -127.27 -127.275 -127.28 -127.285 -127.29 -127.295 -127.3 -127.305 -127.31 -127.315 -127.32 -127.325 -127.33 -127.335 -127.34 -127.345 -127.35 -127.355 -127.36 -127.365 -127.37 -127.375 -127.38 -127.385 -127.39 -127.395 -127.4 -127.405 -127.41 -127.415 -127.42 -127.425 -127.43 -127.435 -127.44 -127.445 -127.45 -127.455 -127.46 -127.465 -127.47 -127.475 -127.48 -127.485 -127.49 -127.495 -127.5 -127.505 -127.51 -127.515 -127.52 -127.525 -127.53 -127.535 -127.54 -127.545 -127.55 -127.555 -127.56 -127.565 -127.57 -127.575 -127.58 -127.585 -127.59 -127.595 -127.6 -127.605 -127.61 -127.615 -127.62 -127.625 -127.63 -127.635 -127.64 -127.645 -127.65 -127.655 -127.66 -127.665 -127.67 -127.675 -127.68 -127.685 -127.69 -127.695 -127.7 -127.705 -127.71 -127.715 -127.72 -127.725 -127.73 -127.735 -127.74 -127.745 -127.75 -127.755 -127.76 -127.765 -127.77 -127.775 -127.78 -127.785 -127.79 -127.795 -127.8 -127.805 -127.81 -127.815 -127.82 -127.825 -127.83 -127.835 -127.84 -127.845 -127.85 -127.855 -127.86 -127.865 -127.87 -127.875 -127.88 -127.885 -127.89 -127.895 -127.9 -127.905 -127.91 -127.915 -127.92 -127.925 -127.93 -127.935 -127.94 -127.945 -127.95 -127.955 -127.96 -127.965 -127.97 -127.975 -127.98 -127.985 -127.99 -127.995 -128 -128.005 -128.01 -128.015 -128.02 -128.025 -128.03 -128.035 -128.04 -128.045 -128.05 -128.055 -128.06 -128.065 -128.07 -128.075 -128.08 -128.085 -128.09 -128.095 -128.1 -128.105 -128.11 -128.115 -128.12 -128.125 -128.13 -128.135 -128.14 -128.145 -128.15 -128.155 -128.16 -128.165 -128.17 -128.175 -128.18 -128.185 -128.19 -128.195 -128.2 -128.205 -128.21 -128.215 -128.22 -128.225 -128.23 -128.235 -128.24 -128.245 -128.25 -128.255 -128.26 -128.265 -128.27 -128.275 -128.28 -128.285 -128.29 -128.295 -128.3 -128.305 -128.31 -128.315 -128.32 -128.325 -128.33 -128.335 -128.34 -128.345 -128.35 -128.355 -128.36 -128.365 -128.37 -128.375 -128.38 -128.385 -128.39 -128.395 -128.4 -128.405 -128.41 -128.415 -128.42 -128.425 -128.43 -128.435 -128.44 -128.445 -128.45 -128.455 -128.46 -128.465 -128.47 -128.475 -128.48 -128.485 -128.49 -128.495 -128.5 -128.505 -128.51 -128.515 -128.52 -128.525 -128.53 -128.535 -128.54 -128.545 -128.55 -128.555 -128.56 -128.565 -128.57 -128.575 -128.58 -128.585 -128.59 -128.595 -128.6 -128.605 -128.61 -128.615 -128.62 -128.625 -128.63 -128.635 -128.64 -128.645 -128.65 -128.655 -128.66 -128.665 -128.67 -128.675 -128.68 -128.685 -128.69 -128.695 -128.7 -128.705 -128.71 -128.715 -128.72 -128.725 -128.73 -128.735 -128.74 -128.745 -128.75 -128.755 -128.76 -128.765 -128.77 -128.775 -128.78 -128.785 -128.79 -128.795 -128.8 -128.805 -128.81 -128.815 -128.82 -128.825 -128.83 -128.835 -128.84 -128.845 -128.85 -128.855 -128.86 -128.865 -128.87 -128.875 -128.88 -128.885 -128.89 -128.895 -128.9 -128.905 -128.91 -128.915 -128.92 -128.925 -128.93 -128.935 -128.94 -128.945 -128.95 -128.955 -128.96 -128.965 -128.97 -128.975 -128.98 -128.985 -128.99 -128.995 -129 -129.005 -129.01 -129.015 -129.02 -129.025 -129.03 -129.035 -129.04 -129.045 -129.05 -129.055 -129.06 -129.065 -129.07 -129.075 -129.08 -129.085 -129.09 -129.095 -129.1 -129.105 -129.11 -129.115 -129.12 -129.125 -129.13 -129.135 -129.14 -129.145 -129.15 -129.155 -129.16 -129.165 -129.17 -129.175 -129.18 -129.185 -129.19 -129.195 -129.2 -129.205 -129.21 -129.215 -129.22 -129.225 -129.23 -129.235 -129.24 -129.245 -129.25 -129.255 -129.26 -129.265 -129.27 -129.275 -129.28 -129.285 -129.29 -129.295 -129.3 -129.305 -129.31 -129.315 -129.32 -129.325 -129.33 -129.335 -129.34 -129.345 -129.35 -129.355 -129.36 -129.365 -129.37 -129.375 -129.38 -129.385 -129.39 -129.395 -129.4 -129.405 -129.41 -129.415 -129.42 -129.425 -129.43 -129.435 -129.44 -129.445 -129.45 -129.455 -129.46 -129.465 -129.47 -129.475 -129.48 -129.485 -129.49 -129.495 -129.5 -129.505 -129.51 -129.515 -129.52 -129.525 -129.53 -129.535 -129.54 -129.545 -129.55 -129.555 -129.56 -129.565 -129.57 -129.575 -129.58 -129.585 -129.59 -129.595 -129.6 -129.605 -129.61 -129.615 -129.62 -129.625 -129.63 -129.635 -129.64 -129.645 -129.65 -129.655 -129.66 -129.665 -129.67 -129.675 -129.68 -129.685 -129.69 -129.695 -129.7 -129.705 -129.71 -129.715 -129.72 -129.725 -129.73 -129.735 -129.74 -129.745 -129.75 -129.755 -129.76 -129.765 -129.77 -129.775 -129.78 -129.785 -129.79 -129.795 -129.8 -129.805 -129.81 -129.815 -129.82 -129.825 -129.83 -129.835 -129.84 -129.845 -129.85 -129.855 -129.86 -129.865 -129.87 -129.875 -129.88 -129.885 -129.89 -129.895 -129.9 -129.905 -129.91 -129.915 -129.92 -129.925 -129.93 -129.935 -129.94 -129.945 -129.95 -129.955 -129.96 -129.965 -129.97 -129.975 -129.98 -129.985 -129.99 -129.995 -130 -130.005 -130.01 -130.015 -130.02 -130.025 -130.03 -130.035 -130.04 -130.045 -130.05 -130.055 -130.06 -130.065 -130.07 -130.075 -130.08 -130.085 -130.09 -130.095 -130.1 -130.105 -130.11 -130.115 -130.12 -130.125 -130.13 -130.135 -130.14 -130.145 -130.15 -130.155 -130.16 -130.165 -130.17 -130.175 -130.18 -130.185 -130.19 -130.195 -130.2 -130.205 -130.21 -130.215 -130.22 -130.225 -130.23 -130.235 -130.24 -130.245 -130.25 -130.255 -130.26 -130.265 -130.27 -130.275 -130.28 -130.285 -130.29 -130.295 -130.3 -130.305 -130.31 -130.315 -130.32 -130.325 -130.33 -130.335 -130.34 -130.345 -130.35 -130.355 -130.36 -130.365 -130.37 -130.375 -130.38 -130.385 -130.39 -130.395 -130.4 -130.405 -130.41 -130.415 -130.42 -130.425 -130.43 -130.435 -130.44 -130.445 -130.45 -130.455 -130.46 -130.465 -130.47 -130.475 -130.48 -130.485 -130.49 -130.495 -130.5 -130.505 -130.51 -130.515 -130.52 -130.525 -130.53 -130.535 -130.54 -130.545 -130.55 -130.555 -130.56 -130.565 -130.57 -130.575 -130.58 -130.585 -130.59 -130.595 -130.6 -130.605 -130.61 -130.615 -130.62 -130.625 -130.63 -130.635 -130.64 -130.645 -130.65 -130.655 -130.66 -130.665 -130.67 -130.675 -130.68 -130.685 -130.69 -130.695 -130.7 -130.705 -130.71 -130.715 -130.72 -130.725 -130.73 -130.735 -130.74 -130.745 -130.75 -130.755 -130.76 -130.765 -130.77 -130.775 -130.78 -130.785 -130.79 -130.795 -130.8 -130.805 -130.81 -130.815 -130.82 -130.825 -130.83 -130.835 -130.84 -130.845 -130.85 -130.855 -130.86 -130.865 -130.87 -130.875 -130.88 -130.885 -130.89 -130.895 -130.9 -130.905 -130.91 -130.915 -130.92 -130.925 -130.93 -130.935 -130.94 -130.945 -130.95 -130.955 -130.96 -130.965 -130.97 -130.975 -130.98 -130.985 -130.99 -130.995 -131 -131.005 -131.01 -131.015 -131.02 -131.025 -131.03 -131.035 -131.04 -131.045 -131.05 -131.055 -131.06 -131.065 -131.07 -131.075 -131.08 -131.085 -131.09 -131.095 -131.1 -131.105 -131.11 -131.115 -131.12 -131.125 -131.13 -131.135 -131.14 -131.145 -131.15 -131.155 -131.16 -131.165 -131.17 -131.175 -131.18 -131.185 -131.19 -131.195 -131.2 -131.205 -131.21 -131.215 -131.22 -131.225 -131.23 -131.235 -131.24 -131.245 -131.25 -131.255 -131.26 -131.265 -131.27 -131.275 -131.28 -131.285 -131.29 -131.295 -131.3 -131.305 -131.31 -131.315 -131.32 -131.325 -131.33 -131.335 -131.34 -131.345 -131.35 -131.355 -131.36 -131.365 -131.37 -131.375 -131.38 -131.385 -131.39 -131.395 -131.4 -131.405 -131.41 -131.415 -131.42 -131.425 -131.43 -131.435 -131.44 -131.445 -131.45 -131.455 -131.46 -131.465 -131.47 -131.475 -131.48 -131.485 -131.49 -131.495 -131.5 -131.505 -131.51 -131.515 -131.52 -131.525 -131.53 -131.535 -131.54 -131.545 -131.55 -131.555 -131.56 -131.565 -131.57 -131.575 -131.58 -131.585 -131.59 -131.595 -131.6 -131.605 -131.61 -131.615 -131.62 -131.625 -131.63 -131.635 -131.64 -131.645 -131.65 -131.655 -131.66 -131.665 -131.67 -131.675 -131.68 -131.685 -131.69 -131.695 -131.7 -131.705 -131.71 -131.715 -131.72 -131.725 -131.73 -131.735 -131.74 -131.745 -131.75 -131.755 -131.76 -131.765 -131.77 -131.775 -131.78 -131.785 -131.79 -131.795 -131.8 -131.805 -131.81 -131.815 -131.82 -131.825 -131.83 -131.835 -131.84 -131.845 -131.85 -131.855 -131.86 -131.865 -131.87 -131.875 -131.88 -131.885 -131.89 -131.895 -131.9 -131.905 -131.91 -131.915 -131.92 -131.925 -131.93 -131.935 -131.94 -131.945 -131.95 -131.955 -131.96 -131.965 -131.97 -131.975 -131.98 -131.985 -131.99 -131.995 -132 -132.005 -132.01 -132.015 -132.02 -132.025 -132.03 -132.035 -132.04 -132.045 -132.05 -132.055 -132.06 -132.065 -132.07 -132.075 -132.08 -132.085 -132.09 -132.095 -132.1 -132.105 -132.11 -132.115 -132.12 -132.125 -132.13 -132.135 -132.14 -132.145 -132.15 -132.155 -132.16 -132.165 -132.17 -132.175 -132.18 -132.185 -132.19 -132.195 -132.2 -132.205 -132.21 -132.215 -132.22 -132.225 -132.23 -132.235 -132.24 -132.245 -132.25 -132.255 -132.26 -132.265 -132.27 -132.275 -132.28 -132.285 -132.29 -132.295 -132.3 -132.305 -132.31 -132.315 -132.32 -132.325 -132.33 -132.335 -132.34 -132.345 -132.35 -132.355 -132.36 -132.365 -132.37 -132.375 -132.38 -132.385 -132.39 -132.395 -132.4 -132.405 -132.41 -132.415 -132.42 -132.425 -132.43 -132.435 -132.44 -132.445 -132.45 -132.455 -132.46 -132.465 -132.47 -132.475 -132.48 -132.485 -132.49 -132.495 -132.5 -132.505 -132.51 -132.515 -132.52 -132.525 -132.53 -132.535 -132.54 -132.545 -132.55 -132.555 -132.56 -132.565 -132.57 -132.575 -132.58 -132.585 -132.59 -132.595 -132.6 -132.605 -132.61 -132.615 -132.62 -132.625 -132.63 -132.635 -132.64 -132.645 -132.65 -132.655 -132.66 -132.665 -132.67 -132.675 -132.68 -132.685 -132.69 -132.695 -132.7 -132.705 -132.71 -132.715 -132.72 -132.725 -132.73 -132.735 -132.74 -132.745 -132.75 -132.755 -132.76 -132.765 -132.77 -132.775 -132.78 -132.785 -132.79 -132.795 -132.8 -132.805 -132.81 -132.815 -132.82 -132.825 -132.83 -132.835 -132.84 -132.845 -132.85 -132.855 -132.86 -132.865 -132.87 -132.875 -132.88 -132.885 -132.89 -132.895 -132.9 -132.905 -132.91 -132.915 -132.92 -132.925 -132.93 -132.935 -132.94 -132.945 -132.95 -132.955 -132.96 -132.965 -132.97 -132.975 -132.98 -132.985 -132.99 -132.995 -133 -133.005 -133.01 -133.015 -133.02 -133.025 -133.03 -133.035 -133.04 -133.045 -133.05 -133.055 -133.06 -133.065 -133.07 -133.075 -133.08 -133.085 -133.09 -133.095 -133.1 -133.105 -133.11 -133.115 -133.12 -133.125 -133.13 -133.135 -133.14 -133.145 -133.15 -133.155 -133.16 -133.165 -133.17 -133.175 -133.18 -133.185 -133.19 -133.195 -133.2 -133.205 -133.21 -133.215 -133.22 -133.225 -133.23 -133.235 -133.24 -133.245 -133.25 -133.255 -133.26 -133.265 -133.27 -133.275 -133.28 -133.285 -133.29 -133.295 -133.3 -133.305 -133.31 -133.315 -133.32 -133.325 -133.33 -133.335 -133.34 -133.345 -133.35 -133.355 -133.36 -133.365 -133.37 -133.375 -133.38 -133.385 -133.39 -133.395 -133.4 -133.405 -133.41 -133.415 -133.42 -133.425 -133.43 -133.435 -133.44 -133.445 -133.45 -133.455 -133.46 -133.465 -133.47 -133.475 -133.48 -133.485 -133.49 -133.495 -133.5 -133.505 -133.51 -133.515 -133.52 -133.525 -133.53 -133.535 -133.54 -133.545 -133.55 -133.555 -133.56 -133.565 -133.57 -133.575 -133.58 -133.585 -133.59 -133.595 -133.6 -133.605 -133.61 -133.615 -133.62 -133.625 -133.63 -133.635 -133.64 -133.645 -133.65 -133.655 -133.66 -133.665 -133.67 -133.675 -133.68 -133.685 -133.69 -133.695 -133.7 -133.705 -133.71 -133.715 -133.72 -133.725 -133.73 -133.735 -133.74 -133.745 -133.75 -133.755 -133.76 -133.765 -133.77 -133.775 -133.78 -133.785 -133.79 -133.795 -133.8 -133.805 -133.81 -133.815 -133.82 -133.825 -133.83 -133.835 -133.84 -133.845 -133.85 -133.855 -133.86 -133.865 -133.87 -133.875 -133.88 -133.885 -133.89 -133.895 -133.9 -133.905 -133.91 -133.915 -133.92 -133.925 -133.93 -133.935 -133.94 -133.945 -133.95 -133.955 -133.96 -133.965 -133.97 -133.975 -133.98 -133.985 -133.99 -133.995 -134 -134.005 -134.01 -134.015 -134.02 -134.025 -134.03 -134.035 -134.04 -134.045 -134.05 -134.055 -134.06 -134.065 -134.07 -134.075 -134.08 -134.085 -134.09 -134.095 -134.1 -134.105 -134.11 -134.115 -134.12 -134.125 -134.13 -134.135 -134.14 -134.145 -134.15 -134.155 -134.16 -134.165 -134.17 -134.175 -134.18 -134.185 -134.19 -134.195 -134.2 -134.205 -134.21 -134.215 -134.22 -134.225 -134.23 -134.235 -134.24 -134.245 -134.25 -134.255 -134.26 -134.265 -134.27 -134.275 -134.28 -134.285 -134.29 -134.295 -134.3 -134.305 -134.31 -134.315 -134.32 -134.325 -134.33 -134.335 -134.34 -134.345 -134.35 -134.355 -134.36 -134.365 -134.37 -134.375 -134.38 -134.385 -134.39 -134.395 -134.4 -134.405 -134.41 -134.415 -134.42 -134.425 -134.43 -134.435 -134.44 -134.445 -134.45 -134.455 -134.46 -134.465 -134.47 -134.475 -134.48 -134.485 -134.49 -134.495 -134.5 -134.505 -134.51 -134.515 -134.52 -134.525 -134.53 -134.535 -134.54 -134.545 -134.55 -134.555 -134.56 -134.565 -134.57 -134.575 -134.58 -134.585 -134.59 -134.595 -134.6 -134.605 -134.61 -134.615 -134.62 -134.625 -134.63 -134.635 -134.64 -134.645 -134.65 -134.655 -134.66 -134.665 -134.67 -134.675 -134.68 -134.685 -134.69 -134.695 -134.7 -134.705 -134.71 -134.715 -134.72 -134.725 -134.73 -134.735 -134.74 -134.745 -134.75 -134.755 -134.76 -134.765 -134.77 -134.775 -134.78 -134.785 -134.79 -134.795 -134.8 -134.805 -134.81 -134.815 -134.82 -134.825 -134.83 -134.835 -134.84 -134.845 -134.85 -134.855 -134.86 -134.865 -134.87 -134.875 -134.88 -134.885 -134.89 -134.895 -134.9 -134.905 -134.91 -134.915 -134.92 -134.925 -134.93 -134.935 -134.94 -134.945 -134.95 -134.955 -134.96 -134.965 -134.97 -134.975 -134.98 -134.985 -134.99 -134.995 -135 -135.005 -135.01 -135.015 -135.02 -135.025 -135.03 -135.035 -135.04 -135.045 -135.05 -135.055 -135.06 -135.065 -135.07 -135.075 -135.08 -135.085 -135.09 -135.095 -135.1 -135.105 -135.11 -135.115 -135.12 -135.125 -135.13 -135.135 -135.14 -135.145 -135.15 -135.155 -135.16 -135.165 -135.17 -135.175 -135.18 -135.185 -135.19 -135.195 -135.2 -135.205 -135.21 -135.215 -135.22 -135.225 -135.23 -135.235 -135.24 -135.245 -135.25 -135.255 -135.26 -135.265 -135.27 -135.275 -135.28 -135.285 -135.29 -135.295 -135.3 -135.305 -135.31 -135.315 -135.32 -135.325 -135.33 -135.335 -135.34 -135.345 -135.35 -135.355 -135.36 -135.365 -135.37 -135.375 -135.38 -135.385 -135.39 -135.395 -135.4 -135.405 -135.41 -135.415 -135.42 -135.425 -135.43 -135.435 -135.44 -135.445 -135.45 -135.455 -135.46 -135.465 -135.47 -135.475 -135.48 -135.485 -135.49 -135.495 -135.5 -135.505 -135.51 -135.515 -135.52 -135.525 -135.53 -135.535 -135.54 -135.545 -135.55 -135.555 -135.56 -135.565 -135.57 -135.575 -135.58 -135.585 -135.59 -135.595 -135.6 -135.605 -135.61 -135.615 -135.62 -135.625 -135.63 -135.635 -135.64 -135.645 -135.65 -135.655 -135.66 -135.665 -135.67 -135.675 -135.68 -135.685 -135.69 -135.695 -135.7 -135.705 -135.71 -135.715 -135.72 -135.725 -135.73 -135.735 -135.74 -135.745 -135.75 -135.755 -135.76 -135.765 -135.77 -135.775 -135.78 -135.785 -135.79 -135.795 -135.8 -135.805 -135.81 -135.815 -135.82 -135.825 -135.83 -135.835 -135.84 -135.845 -135.85 -135.855 -135.86 -135.865 -135.87 -135.875 -135.88 -135.885 -135.89 -135.895 -135.9 -135.905 -135.91 -135.915 -135.92 -135.925 -135.93 -135.935 -135.94 -135.945 -135.95 -135.955 -135.96 -135.965 -135.97 -135.975 -135.98 -135.985 -135.99 -135.995 -136 -136.005 -136.01 -136.015 -136.02 -136.025 -136.03 -136.035 -136.04 -136.045 -136.05 -136.055 -136.06 -136.065 -136.07 -136.075 -136.08 -136.085 -136.09 -136.095 -136.1 -136.105 -136.11 -136.115 -136.12 -136.125 -136.13 -136.135 -136.14 -136.145 -136.15 -136.155 -136.16 -136.165 -136.17 -136.175 -136.18 -136.185 -136.19 -136.195 -136.2 -136.205 -136.21 -136.215 -136.22 -136.225 -136.23 -136.235 -136.24 -136.245 -136.25 -136.255 -136.26 -136.265 -136.27 -136.275 -136.28 -136.285 -136.29 -136.295 -136.3 -136.305 -136.31 -136.315 -136.32 -136.325 -136.33 -136.335 -136.34 -136.345 -136.35 -136.355 -136.36 -136.365 -136.37 -136.375 -136.38 -136.385 -136.39 -136.395 -136.4 -136.405 -136.41 -136.415 -136.42 -136.425 -136.43 -136.435 -136.44 -136.445 -136.45 -136.455 -136.46 -136.465 -136.47 -136.475 -136.48 -136.485 -136.49 -136.495 -136.5 -136.505 -136.51 -136.515 -136.52 -136.525 -136.53 -136.535 -136.54 -136.545 -136.55 -136.555 -136.56 -136.565 -136.57 -136.575 -136.58 -136.585 -136.59 -136.595 -136.6 -136.605 -136.61 -136.615 -136.62 -136.625 -136.63 -136.635 -136.64 -136.645 -136.65 -136.655 -136.66 -136.665 -136.67 -136.675 -136.68 -136.685 -136.69 -136.695 -136.7 -136.705 -136.71 -136.715 -136.72 -136.725 -136.73 -136.735 -136.74 -136.745 -136.75 -136.755 -136.76 -136.765 -136.77 -136.775 -136.78 -136.785 -136.79 -136.795 -136.8 -136.805 -136.81 -136.815 -136.82 -136.825 -136.83 -136.835 -136.84 -136.845 -136.85 -136.855 -136.86 -136.865 -136.87 -136.875 -136.88 -136.885 -136.89 -136.895 -136.9 -136.905 -136.91 -136.915 -136.92 -136.925 -136.93 -136.935 -136.94 -136.945 -136.95 -136.955 -136.96 -136.965 -136.97 -136.975 -136.98 -136.985 -136.99 -136.995 -137 -137.005 -137.01 -137.015 -137.02 -137.025 -137.03 -137.035 -137.04 -137.045 -137.05 -137.055 -137.06 -137.065 -137.07 -137.075 -137.08 -137.085 -137.09 -137.095 -137.1 -137.105 -137.11 -137.115 -137.12 -137.125 -137.13 -137.135 -137.14 -137.145 -137.15 -137.155 -137.16 -137.165 -137.17 -137.175 -137.18 -137.185 -137.19 -137.195 -137.2 -137.205 -137.21 -137.215 -137.22 -137.225 -137.23 -137.235 -137.24 -137.245 -137.25 -137.255 -137.26 -137.265 -137.27 -137.275 -137.28 -137.285 -137.29 -137.295 -137.3 -137.305 -137.31 -137.315 -137.32 -137.325 -137.33 -137.335 -137.34 -137.345 -137.35 -137.355 -137.36 -137.365 -137.37 -137.375 -137.38 -137.385 -137.39 -137.395 -137.4 -137.405 -137.41 -137.415 -137.42 -137.425 -137.43 -137.435 -137.44 -137.445 -137.45 -137.455 -137.46 -137.465 -137.47 -137.475 -137.48 -137.485 -137.49 -137.495 -137.5 -137.505 -137.51 -137.515 -137.52 -137.525 -137.53 -137.535 -137.54 -137.545 -137.55 -137.555 -137.56 -137.565 -137.57 -137.575 -137.58 -137.585 -137.59 -137.595 -137.6 -137.605 -137.61 -137.615 -137.62 -137.625 -137.63 -137.635 -137.64 -137.645 -137.65 -137.655 -137.66 -137.665 -137.67 -137.675 -137.68 -137.685 -137.69 -137.695 -137.7 -137.705 -137.71 -137.715 -137.72 -137.725 -137.73 -137.735 -137.74 -137.745 -137.75 -137.755 -137.76 -137.765 -137.77 -137.775 -137.78 -137.785 -137.79 -137.795 -137.8 -137.805 -137.81 -137.815 -137.82 -137.825 -137.83 -137.835 -137.84 -137.845 -137.85 -137.855 -137.86 -137.865 -137.87 -137.875 -137.88 -137.885 -137.89 -137.895 -137.9 -137.905 -137.91 -137.915 -137.92 -137.925 -137.93 -137.935 -137.94 -137.945 -137.95 -137.955 -137.96 -137.965 -137.97 -137.975 -137.98 -137.985 -137.99 -137.995 -138 -138.005 -138.01 -138.015 -138.02 -138.025 -138.03 -138.035 -138.04 -138.045 -138.05 -138.055 -138.06 -138.065 -138.07 -138.075 -138.08 -138.085 -138.09 -138.095 -138.1 -138.105 -138.11 -138.115 -138.12 -138.125 -138.13 -138.135 -138.14 -138.145 -138.15 -138.155 -138.16 -138.165 -138.17 -138.175 -138.18 -138.185 -138.19 -138.195 -138.2 -138.205 -138.21 -138.215 -138.22 -138.225 -138.23 -138.235 -138.24 -138.245 -138.25 -138.255 -138.26 -138.265 -138.27 -138.275 -138.28 -138.285 -138.29 -138.295 -138.3 -138.305 -138.31 -138.315 -138.32 -138.325 -138.33 -138.335 -138.34 -138.345 -138.35 -138.355 -138.36 -138.365 -138.37 -138.375 -138.38 -138.385 -138.39 -138.395 -138.4 -138.405 -138.41 -138.415 -138.42 -138.425 -138.43 -138.435 -138.44 -138.445 -138.45 -138.455 -138.46 -138.465 -138.47 -138.475 -138.48 -138.485 -138.49 -138.495 -138.5 -138.505 -138.51 -138.515 -138.52 -138.525 -138.53 -138.535 -138.54 -138.545 -138.55 -138.555 -138.56 -138.565 -138.57 -138.575 -138.58 -138.585 -138.59 -138.595 -138.6 -138.605 -138.61 -138.615 -138.62 -138.625 -138.63 -138.635 -138.64 -138.645 -138.65 -138.655 -138.66 -138.665 -138.67 -138.675 -138.68 -138.685 -138.69 -138.695 -138.7 -138.705 -138.71 -138.715 -138.72 -138.725 -138.73 -138.735 -138.74 -138.745 -138.75 -138.755 -138.76 -138.765 -138.77 -138.775 -138.78 -138.785 -138.79 -138.795 -138.8 -138.805 -138.81 -138.815 -138.82 -138.825 -138.83 -138.835 -138.84 -138.845 -138.85 -138.855 -138.86 -138.865 -138.87 -138.875 -138.88 -138.885 -138.89 -138.895 -138.9 -138.905 -138.91 -138.915 -138.92 -138.925 -138.93 -138.935 -138.94 -138.945 -138.95 -138.955 -138.96 -138.965 -138.97 -138.975 -138.98 -138.985 -138.99 -138.995 -139 -139.005 -139.01 -139.015 -139.02 -139.025 -139.03 -139.035 -139.04 -139.045 -139.05 -139.055 -139.06 -139.065 -139.07 -139.075 -139.08 -139.085 -139.09 -139.095 -139.1 -139.105 -139.11 -139.115 -139.12 -139.125 -139.13 -139.135 -139.14 -139.145 -139.15 -139.155 -139.16 -139.165 -139.17 -139.175 -139.18 -139.185 -139.19 -139.195 -139.2 -139.205 -139.21 -139.215 -139.22 -139.225 -139.23 -139.235 -139.24 -139.245 -139.25 -139.255 -139.26 -139.265 -139.27 -139.275 -139.28 -139.285 -139.29 -139.295 -139.3 -139.305 -139.31 -139.315 -139.32 -139.325 -139.33 -139.335 -139.34 -139.345 -139.35 -139.355 -139.36 -139.365 -139.37 -139.375 -139.38 -139.385 -139.39 -139.395 -139.4 -139.405 -139.41 -139.415 -139.42 -139.425 -139.43 -139.435 -139.44 -139.445 -139.45 -139.455 -139.46 -139.465 -139.47 -139.475 -139.48 -139.485 -139.49 -139.495 -139.5 -139.505 -139.51 -139.515 -139.52 -139.525 -139.53 -139.535 -139.54 -139.545 -139.55 -139.555 -139.56 -139.565 -139.57 -139.575 -139.58 -139.585 -139.59 -139.595 -139.6 -139.605 -139.61 -139.615 -139.62 -139.625 -139.63 -139.635 -139.64 -139.645 -139.65 -139.655 -139.66 -139.665 -139.67 -139.675 -139.68 -139.685 -139.69 -139.695 -139.7 -139.705 -139.71 -139.715 -139.72 -139.725 -139.73 -139.735 -139.74 -139.745 -139.75 -139.755 -139.76 -139.765 -139.77 -139.775 -139.78 -139.785 -139.79 -139.795 -139.8 -139.805 -139.81 -139.815 -139.82 -139.825 -139.83 -139.835 -139.84 -139.845 -139.85 -139.855 -139.86 -139.865 -139.87 -139.875 -139.88 -139.885 -139.89 -139.895 -139.9 -139.905 -139.91 -139.915 -139.92 -139.925 -139.93 -139.935 -139.94 -139.945 -139.95 -139.955 -139.96 -139.965 -139.97 -139.975 -139.98 -139.985 -139.99 -139.995 -140 -140.005 -140.01 -140.015 -140.02 -140.025 -140.03 -140.035 -140.04 -140.045 -140.05 -140.055 -140.06 -140.065 -140.07 -140.075 -140.08 -140.085 -140.09 -140.095 -140.1 -140.105 -140.11 -140.115 -140.12 -140.125 -140.13 -140.135 -140.14 -140.145 -140.15 -140.155 -140.16 -140.165 -140.17 -140.175 -140.18 -140.185 -140.19 -140.195 -140.2 -140.205 -140.21 -140.215 -140.22 -140.225 -140.23 -140.235 -140.24 -140.245 -140.25 -140.255 -140.26 -140.265 -140.27 -140.275 -140.28 -140.285 -140.29 -140.295 -140.3 -140.305 -140.31 -140.315 -140.32 -140.325 -140.33 -140.335 -140.34 -140.345 -140.35 -140.355 -140.36 -140.365 -140.37 -140.375 -140.38 -140.385 -140.39 -140.395 -140.4 -140.405 -140.41 -140.415 -140.42 -140.425 -140.43 -140.435 -140.44 -140.445 -140.45 -140.455 -140.46 -140.465 -140.47 -140.475 -140.48 -140.485 -140.49 -140.495 -140.5 -140.505 -140.51 -140.515 -140.52 -140.525 -140.53 -140.535 -140.54 -140.545 -140.55 -140.555 -140.56 -140.565 -140.57 -140.575 -140.58 -140.585 -140.59 -140.595 -140.6 -140.605 -140.61 -140.615 -140.62 -140.625 -140.63 -140.635 -140.64 -140.645 -140.65 -140.655 -140.66 -140.665 -140.67 -140.675 -140.68 -140.685 -140.69 -140.695 -140.7 -140.705 -140.71 -140.715 -140.72 -140.725 -140.73 -140.735 -140.74 -140.745 -140.75 -140.755 -140.76 -140.765 -140.77 -140.775 -140.78 -140.785 -140.79 -140.795 -140.8 -140.805 -140.81 -140.815 -140.82 -140.825 -140.83 -140.835 -140.84 -140.845 -140.85 -140.855 -140.86 -140.865 -140.87 -140.875 -140.88 -140.885 -140.89 -140.895 -140.9 -140.905 -140.91 -140.915 -140.92 -140.925 -140.93 -140.935 -140.94 -140.945 -140.95 -140.955 -140.96 -140.965 -140.97 -140.975 -140.98 -140.985 -140.99 -140.995 -141 -141.005 -141.01 -141.015 -141.02 -141.025 -141.03 -141.035 -141.04 -141.045 -141.05 -141.055 -141.06 -141.065 -141.07 -141.075 -141.08 -141.085 -141.09 -141.095 -141.1 -141.105 -141.11 -141.115 -141.12 -141.125 -141.13 -141.135 -141.14 -141.145 -141.15 -141.155 -141.16 -141.165 -141.17 -141.175 -141.18 -141.185 -141.19 -141.195 -141.2 -141.205 -141.21 -141.215 -141.22 -141.225 -141.23 -141.235 -141.24 -141.245 -141.25 -141.255 -141.26 -141.265 -141.27 -141.275 -141.28 -141.285 -141.29 -141.295 -141.3 -141.305 -141.31 -141.315 -141.32 -141.325 -141.33 -141.335 -141.34 -141.345 -141.35 -141.355 -141.36 -141.365 -141.37 -141.375 -141.38 -141.385 -141.39 -141.395 -141.4 -141.405 -141.41 -141.415 -141.42 -141.425 -141.43 -141.435 -141.44 -141.445 -141.45 -141.455 -141.46 -141.465 -141.47 -141.475 -141.48 -141.485 -141.49 -141.495 -141.5 -141.505 -141.51 -141.515 -141.52 -141.525 -141.53 -141.535 -141.54 -141.545 -141.55 -141.555 -141.56 -141.565 -141.57 -141.575 -141.58 -141.585 -141.59 -141.595 -141.6 -141.605 -141.61 -141.615 -141.62 -141.625 -141.63 -141.635 -141.64 -141.645 -141.65 -141.655 -141.66 -141.665 -141.67 -141.675 -141.68 -141.685 -141.69 -141.695 -141.7 -141.705 -141.71 -141.715 -141.72 -141.725 -141.73 -141.735 -141.74 -141.745 -141.75 -141.755 -141.76 -141.765 -141.77 -141.775 -141.78 -141.785 -141.79 -141.795 -141.8 -141.805 -141.81 -141.815 -141.82 -141.825 -141.83 -141.835 -141.84 -141.845 -141.85 -141.855 -141.86 -141.865 -141.87 -141.875 -141.88 -141.885 -141.89 -141.895 -141.9 -141.905 -141.91 -141.915 -141.92 -141.925 -141.93 -141.935 -141.94 -141.945 -141.95 -141.955 -141.96 -141.965 -141.97 -141.975 -141.98 -141.985 -141.99 -141.995 -142 -142.005 -142.01 -142.015 -142.02 -142.025 -142.03 -142.035 -142.04 -142.045 -142.05 -142.055 -142.06 -142.065 -142.07 -142.075 -142.08 -142.085 -142.09 -142.095 -142.1 -142.105 -142.11 -142.115 -142.12 -142.125 -142.13 -142.135 -142.14 -142.145 -142.15 -142.155 -142.16 -142.165 -142.17 -142.175 -142.18 -142.185 -142.19 -142.195 -142.2 -142.205 -142.21 -142.215 -142.22 -142.225 -142.23 -142.235 -142.24 -142.245 -142.25 -142.255 -142.26 -142.265 -142.27 -142.275 -142.28 -142.285 -142.29 -142.295 -142.3 -142.305 -142.31 -142.315 -142.32 -142.325 -142.33 -142.335 -142.34 -142.345 -142.35 -142.355 -142.36 -142.365 -142.37 -142.375 -142.38 -142.385 -142.39 -142.395 -142.4 -142.405 -142.41 -142.415 -142.42 -142.425 -142.43 -142.435 -142.44 -142.445 -142.45 -142.455 -142.46 -142.465 -142.47 -142.475 -142.48 -142.485 -142.49 -142.495 -142.5 -142.505 -142.51 -142.515 -142.52 -142.525 -142.53 -142.535 -142.54 -142.545 -142.55 -142.555 -142.56 -142.565 -142.57 -142.575 -142.58 -142.585 -142.59 -142.595 -142.6 -142.605 -142.61 -142.615 -142.62 -142.625 -142.63 -142.635 -142.64 -142.645 -142.65 -142.655 -142.66 -142.665 -142.67 -142.675 -142.68 -142.685 -142.69 -142.695 -142.7 -142.705 -142.71 -142.715 -142.72 -142.725 -142.73 -142.735 -142.74 -142.745 -142.75 -142.755 -142.76 -142.765 -142.77 -142.775 -142.78 -142.785 -142.79 -142.795 -142.8 -142.805 -142.81 -142.815 -142.82 -142.825 -142.83 -142.835 -142.84 -142.845 -142.85 -142.855 -142.86 -142.865 -142.87 -142.875 -142.88 -142.885 -142.89 -142.895 -142.9 -142.905 -142.91 -142.915 -142.92 -142.925 -142.93 -142.935 -142.94 -142.945 -142.95 -142.955 -142.96 -142.965 -142.97 -142.975 -142.98 -142.985 -142.99 -142.995 -143 -143.005 -143.01 -143.015 -143.02 -143.025 -143.03 -143.035 -143.04 -143.045 -143.05 -143.055 -143.06 -143.065 -143.07 -143.075 -143.08 -143.085 -143.09 -143.095 -143.1 -143.105 -143.11 -143.115 -143.12 -143.125 -143.13 -143.135 -143.14 -143.145 -143.15 -143.155 -143.16 -143.165 -143.17 -143.175 -143.18 -143.185 -143.19 -143.195 -143.2 -143.205 -143.21 -143.215 -143.22 -143.225 -143.23 -143.235 -143.24 -143.245 -143.25 -143.255 -143.26 -143.265 -143.27 -143.275 -143.28 -143.285 -143.29 -143.295 -143.3 -143.305 -143.31 -143.315 -143.32 -143.325 -143.33 -143.335 -143.34 -143.345 -143.35 -143.355 -143.36 -143.365 -143.37 -143.375 -143.38 -143.385 -143.39 -143.395 -143.4 -143.405 -143.41 -143.415 -143.42 -143.425 -143.43 -143.435 -143.44 -143.445 -143.45 -143.455 -143.46 -143.465 -143.47 -143.475 -143.48 -143.485 -143.49 -143.495 -143.5 -143.505 -143.51 -143.515 -143.52 -143.525 -143.53 -143.535 -143.54 -143.545 -143.55 -143.555 -143.56 -143.565 -143.57 -143.575 -143.58 -143.585 -143.59 -143.595 -143.6 -143.605 -143.61 -143.615 -143.62 -143.625 -143.63 -143.635 -143.64 -143.645 -143.65 -143.655 -143.66 -143.665 -143.67 -143.675 -143.68 -143.685 -143.69 -143.695 -143.7 -143.705 -143.71 -143.715 -143.72 -143.725 -143.73 -143.735 -143.74 -143.745 -143.75 -143.755 -143.76 -143.765 -143.77 -143.775 -143.78 -143.785 -143.79 -143.795 -143.8 -143.805 -143.81 -143.815 -143.82 -143.825 -143.83 -143.835 -143.84 -143.845 -143.85 -143.855 -143.86 -143.865 -143.87 -143.875 -143.88 -143.885 -143.89 -143.895 -143.9 -143.905 -143.91 -143.915 -143.92 -143.925 -143.93 -143.935 -143.94 -143.945 -143.95 -143.955 -143.96 -143.965 -143.97 -143.975 -143.98 -143.985 -143.99 -143.995 -144 -144.005 -144.01 -144.015 -144.02 -144.025 -144.03 -144.035 -144.04 -144.045 -144.05 -144.055 -144.06 -144.065 -144.07 -144.075 -144.08 -144.085 -144.09 -144.095 -144.1 -144.105 -144.11 -144.115 -144.12 -144.125 -144.13 -144.135 -144.14 -144.145 -144.15 -144.155 -144.16 -144.165 -144.17 -144.175 -144.18 -144.185 -144.19 -144.195 -144.2 -144.205 -144.21 -144.215 -144.22 -144.225 -144.23 -144.235 -144.24 -144.245 -144.25 -144.255 -144.26 -144.265 -144.27 -144.275 -144.28 -144.285 -144.29 -144.295 -144.3 -144.305 -144.31 -144.315 -144.32 -144.325 -144.33 -144.335 -144.34 -144.345 -144.35 -144.355 -144.36 -144.365 -144.37 -144.375 -144.38 -144.385 -144.39 -144.395 -144.4 -144.405 -144.41 -144.415 -144.42 -144.425 -144.43 -144.435 -144.44 -144.445 -144.45 -144.455 -144.46 -144.465 -144.47 -144.475 -144.48 -144.485 -144.49 -144.495 -144.5 -144.505 -144.51 -144.515 -144.52 -144.525 -144.53 -144.535 -144.54 -144.545 -144.55 -144.555 -144.56 -144.565 -144.57 -144.575 -144.58 -144.585 -144.59 -144.595 -144.6 -144.605 -144.61 -144.615 -144.62 -144.625 -144.63 -144.635 -144.64 -144.645 -144.65 -144.655 -144.66 -144.665 -144.67 -144.675 -144.68 -144.685 -144.69 -144.695 -144.7 -144.705 -144.71 -144.715 -144.72 -144.725 -144.73 -144.735 -144.74 -144.745 -144.75 -144.755 -144.76 -144.765 -144.77 -144.775 -144.78 -144.785 -144.79 -144.795 -144.8 -144.805 -144.81 -144.815 -144.82 -144.825 -144.83 -144.835 -144.84 -144.845 -144.85 -144.855 -144.86 -144.865 -144.87 -144.875 -144.88 -144.885 -144.89 -144.895 -144.9 -144.905 -144.91 -144.915 -144.92 -144.925 -144.93 -144.935 -144.94 -144.945 -144.95 -144.955 -144.96 -144.965 -144.97 -144.975 -144.98 -144.985 -144.99 -144.995 -145 -145.005 -145.01 -145.015 -145.02 -145.025 -145.03 -145.035 -145.04 -145.045 -145.05 -145.055 -145.06 -145.065 -145.07 -145.075 -145.08 -145.085 -145.09 -145.095 -145.1 -145.105 -145.11 -145.115 -145.12 -145.125 -145.13 -145.135 -145.14 -145.145 -145.15 -145.155 -145.16 -145.165 -145.17 -145.175 -145.18 -145.185 -145.19 -145.195 -145.2 -145.205 -145.21 -145.215 -145.22 -145.225 -145.23 -145.235 -145.24 -145.245 -145.25 -145.255 -145.26 -145.265 -145.27 -145.275 -145.28 -145.285 -145.29 -145.295 -145.3 -145.305 -145.31 -145.315 -145.32 -145.325 -145.33 -145.335 -145.34 -145.345 -145.35 -145.355 -145.36 -145.365 -145.37 -145.375 -145.38 -145.385 -145.39 -145.395 -145.4 -145.405 -145.41 -145.415 -145.42 -145.425 -145.43 -145.435 -145.44 -145.445 -145.45 -145.455 -145.46 -145.465 -145.47 -145.475 -145.48 -145.485 -145.49 -145.495 -145.5 -145.505 -145.51 -145.515 -145.52 -145.525 -145.53 -145.535 -145.54 -145.545 -145.55 -145.555 -145.56 -145.565 -145.57 -145.575 -145.58 -145.585 -145.59 -145.595 -145.6 -145.605 -145.61 -145.615 -145.62 -145.625 -145.63 -145.635 -145.64 -145.645 -145.65 -145.655 -145.66 -145.665 -145.67 -145.675 -145.68 -145.685 -145.69 -145.695 -145.7 -145.705 -145.71 -145.715 -145.72 -145.725 -145.73 -145.735 -145.74 -145.745 -145.75 -145.755 -145.76 -145.765 -145.77 -145.775 -145.78 -145.785 -145.79 -145.795 -145.8 -145.805 -145.81 -145.815 -145.82 -145.825 -145.83 -145.835 -145.84 -145.845 -145.85 -145.855 -145.86 -145.865 -145.87 -145.875 -145.88 -145.885 -145.89 -145.895 -145.9 -145.905 -145.91 -145.915 -145.92 -145.925 -145.93 -145.935 -145.94 -145.945 -145.95 -145.955 -145.96 -145.965 -145.97 -145.975 -145.98 -145.985 -145.99 -145.995 -146 -146.005 -146.01 -146.015 -146.02 -146.025 -146.03 -146.035 -146.04 -146.045 -146.05 -146.055 -146.06 -146.065 -146.07 -146.075 -146.08 -146.085 -146.09 -146.095 -146.1 -146.105 -146.11 -146.115 -146.12 -146.125 -146.13 -146.135 -146.14 -146.145 -146.15 -146.155 -146.16 -146.165 -146.17 -146.175 -146.18 -146.185 -146.19 -146.195 -146.2 -146.205 -146.21 -146.215 -146.22 -146.225 -146.23 -146.235 -146.24 -146.245 -146.25 -146.255 -146.26 -146.265 -146.27 -146.275 -146.28 -146.285 -146.29 -146.295 -146.3 -146.305 -146.31 -146.315 -146.32 -146.325 -146.33 -146.335 -146.34 -146.345 -146.35 -146.355 -146.36 -146.365 -146.37 -146.375 -146.38 -146.385 -146.39 -146.395 -146.4 -146.405 -146.41 -146.415 -146.42 -146.425 -146.43 -146.435 -146.44 -146.445 -146.45 -146.455 -146.46 -146.465 -146.47 -146.475 -146.48 -146.485 -146.49 -146.495 -146.5 -146.505 -146.51 -146.515 -146.52 -146.525 -146.53 -146.535 -146.54 -146.545 -146.55 -146.555 -146.56 -146.565 -146.57 -146.575 -146.58 -146.585 -146.59 -146.595 -146.6 -146.605 -146.61 -146.615 -146.62 -146.625 -146.63 -146.635 -146.64 -146.645 -146.65 -146.655 -146.66 -146.665 -146.67 -146.675 -146.68 -146.685 -146.69 -146.695 -146.7 -146.705 -146.71 -146.715 -146.72 -146.725 -146.73 -146.735 -146.74 -146.745 -146.75 -146.755 -146.76 -146.765 -146.77 -146.775 -146.78 -146.785 -146.79 -146.795 -146.8 -146.805 -146.81 -146.815 -146.82 -146.825 -146.83 -146.835 -146.84 -146.845 -146.85 -146.855 -146.86 -146.865 -146.87 -146.875 -146.88 -146.885 -146.89 -146.895 -146.9 -146.905 -146.91 -146.915 -146.92 -146.925 -146.93 -146.935 -146.94 -146.945 -146.95 -146.955 -146.96 -146.965 -146.97 -146.975 -146.98 -146.985 -146.99 -146.995 -147 -147.005 -147.01 -147.015 -147.02 -147.025 -147.03 -147.035 -147.04 -147.045 -147.05 -147.055 -147.06 -147.065 -147.07 -147.075 -147.08 -147.085 -147.09 -147.095 -147.1 -147.105 -147.11 -147.115 -147.12 -147.125 -147.13 -147.135 -147.14 -147.145 -147.15 -147.155 -147.16 -147.165 -147.17 -147.175 -147.18 -147.185 -147.19 -147.195 -147.2 -147.205 -147.21 -147.215 -147.22 -147.225 -147.23 -147.235 -147.24 -147.245 -147.25 -147.255 -147.26 -147.265 -147.27 -147.275 -147.28 -147.285 -147.29 -147.295 -147.3 -147.305 -147.31 -147.315 -147.32 -147.325 -147.33 -147.335 -147.34 -147.345 -147.35 -147.355 -147.36 -147.365 -147.37 -147.375 -147.38 -147.385 -147.39 -147.395 -147.4 -147.405 -147.41 -147.415 -147.42 -147.425 -147.43 -147.435 -147.44 -147.445 -147.45 -147.455 -147.46 -147.465 -147.47 -147.475 -147.48 -147.485 -147.49 -147.495 -147.5 -147.505 -147.51 -147.515 -147.52 -147.525 -147.53 -147.535 -147.54 -147.545 -147.55 -147.555 -147.56 -147.565 -147.57 -147.575 -147.58 -147.585 -147.59 -147.595 -147.6 -147.605 -147.61 -147.615 -147.62 -147.625 -147.63 -147.635 -147.64 -147.645 -147.65 -147.655 -147.66 -147.665 -147.67 -147.675 -147.68 -147.685 -147.69 -147.695 -147.7 -147.705 -147.71 -147.715 -147.72 -147.725 -147.73 -147.735 -147.74 -147.745 -147.75 -147.755 -147.76 -147.765 -147.77 -147.775 -147.78 -147.785 -147.79 -147.795 -147.8 -147.805 -147.81 -147.815 -147.82 -147.825 -147.83 -147.835 -147.84 -147.845 -147.85 -147.855 -147.86 -147.865 -147.87 -147.875 -147.88 -147.885 -147.89 -147.895 -147.9 -147.905 -147.91 -147.915 -147.92 -147.925 -147.93 -147.935 -147.94 -147.945 -147.95 -147.955 -147.96 -147.965 -147.97 -147.975 -147.98 -147.985 -147.99 -147.995 -148 -148.005 -148.01 -148.015 -148.02 -148.025 -148.03 -148.035 -148.04 -148.045 -148.05 -148.055 -148.06 -148.065 -148.07 -148.075 -148.08 -148.085 -148.09 -148.095 -148.1 -148.105 -148.11 -148.115 -148.12 -148.125 -148.13 -148.135 -148.14 -148.145 -148.15 -148.155 -148.16 -148.165 -148.17 -148.175 -148.18 -148.185 -148.19 -148.195 -148.2 -148.205 -148.21 -148.215 -148.22 -148.225 -148.23 -148.235 -148.24 -148.245 -148.25 -148.255 -148.26 -148.265 -148.27 -148.275 -148.28 -148.285 -148.29 -148.295 -148.3 -148.305 -148.31 -148.315 -148.32 -148.325 -148.33 -148.335 -148.34 -148.345 -148.35 -148.355 -148.36 -148.365 -148.37 -148.375 -148.38 -148.385 -148.39 -148.395 -148.4 -148.405 -148.41 -148.415 -148.42 -148.425 -148.43 -148.435 -148.44 -148.445 -148.45 -148.455 -148.46 -148.465 -148.47 -148.475 -148.48 -148.485 -148.49 -148.495 -148.5 -148.505 -148.51 -148.515 -148.52 -148.525 -148.53 -148.535 -148.54 -148.545 -148.55 -148.555 -148.56 -148.565 -148.57 -148.575 -148.58 -148.585 -148.59 -148.595 -148.6 -148.605 -148.61 -148.615 -148.62 -148.625 -148.63 -148.635 -148.64 -148.645 -148.65 -148.655 -148.66 -148.665 -148.67 -148.675 -148.68 -148.685 -148.69 -148.695 -148.7 -148.705 -148.71 -148.715 -148.72 -148.725 -148.73 -148.735 -148.74 -148.745 -148.75 -148.755 -148.76 -148.765 -148.77 -148.775 -148.78 -148.785 -148.79 -148.795 -148.8 -148.805 -148.81 -148.815 -148.82 -148.825 -148.83 -148.835 -148.84 -148.845 -148.85 -148.855 -148.86 -148.865 -148.87 -148.875 -148.88 -148.885 -148.89 -148.895 -148.9 -148.905 -148.91 -148.915 -148.92 -148.925 -148.93 -148.935 -148.94 -148.945 -148.95 -148.955 -148.96 -148.965 -148.97 -148.975 -148.98 -148.985 -148.99 -148.995 -149 -149.005 -149.01 -149.015 -149.02 -149.025 -149.03 -149.035 -149.04 -149.045 -149.05 -149.055 -149.06 -149.065 -149.07 -149.075 -149.08 -149.085 -149.09 -149.095 -149.1 -149.105 -149.11 -149.115 -149.12 -149.125 -149.13 -149.135 -149.14 -149.145 -149.15 -149.155 -149.16 -149.165 -149.17 -149.175 -149.18 -149.185 -149.19 -149.195 -149.2 -149.205 -149.21 -149.215 -149.22 -149.225 -149.23 -149.235 -149.24 -149.245 -149.25 -149.255 -149.26 -149.265 -149.27 -149.275 -149.28 -149.285 -149.29 -149.295 -149.3 -149.305 -149.31 -149.315 -149.32 -149.325 -149.33 -149.335 -149.34 -149.345 -149.35 -149.355 -149.36 -149.365 -149.37 -149.375 -149.38 -149.385 -149.39 -149.395 -149.4 -149.405 -149.41 -149.415 -149.42 -149.425 -149.43 -149.435 -149.44 -149.445 -149.45 -149.455 -149.46 -149.465 -149.47 -149.475 -149.48 -149.485 -149.49 -149.495 -149.5 -149.505 -149.51 -149.515 -149.52 -149.525 -149.53 -149.535 -149.54 -149.545 -149.55 -149.555 -149.56 -149.565 -149.57 -149.575 -149.58 -149.585 -149.59 -149.595 -149.6 -149.605 -149.61 -149.615 -149.62 -149.625 -149.63 -149.635 -149.64 -149.645 -149.65 -149.655 -149.66 -149.665 -149.67 -149.675 -149.68 -149.685 -149.69 -149.695 -149.7 -149.705 -149.71 -149.715 -149.72 -149.725 -149.73 -149.735 -149.74 -149.745 -149.75 -149.755 -149.76 -149.765 -149.77 -149.775 -149.78 -149.785 -149.79 -149.795 -149.8 -149.805 -149.81 -149.815 -149.82 -149.825 -149.83 -149.835 -149.84 -149.845 -149.85 -149.855 -149.86 -149.865 -149.87 -149.875 -149.88 -149.885 -149.89 -149.895 -149.9 -149.905 -149.91 -149.915 -149.92 -149.925 -149.93 -149.935 -149.94 -149.945 -149.95 -149.955 -149.96 -149.965 -149.97 -149.975 -149.98 -149.985 -149.99 -149.995 -150 -150.005 -150.01 -150.015 -150.02 -150.025 -150.03 -150.035 -150.04 -150.045 -150.05 -150.055 -150.06 -150.065 -150.07 -150.075 -150.08 -150.085 -150.09 -150.095 -150.1 -150.105 -150.11 -150.115 -150.12 -150.125 -150.13 -150.135 -150.14 -150.145 -150.15 -150.155 -150.16 -150.165 -150.17 -150.175 -150.18 -150.185 -150.19 -150.195 -150.2 -150.205 -150.21 -150.215 -150.22 -150.225 -150.23 -150.235 -150.24 -150.245 -150.25 -150.255 -150.26 -150.265 -150.27 -150.275 -150.28 -150.285 -150.29 -150.295 -150.3 -150.305 -150.31 -150.315 -150.32 -150.325 -150.33 -150.335 -150.34 -150.345 -150.35 -150.355 -150.36 -150.365 -150.37 -150.375 -150.38 -150.385 -150.39 -150.395 -150.4 -150.405 -150.41 -150.415 -150.42 -150.425 -150.43 -150.435 -150.44 -150.445 -150.45 -150.455 -150.46 -150.465 -150.47 -150.475 -150.48 -150.485 -150.49 -150.495 -150.5 -150.505 -150.51 -150.515 -150.52 -150.525 -150.53 -150.535 -150.54 -150.545 -150.55 -150.555 -150.56 -150.565 -150.57 -150.575 -150.58 -150.585 -150.59 -150.595 -150.6 -150.605 -150.61 -150.615 -150.62 -150.625 -150.63 -150.635 -150.64 -150.645 -150.65 -150.655 -150.66 -150.665 -150.67 -150.675 -150.68 -150.685 -150.69 -150.695 -150.7 -150.705 -150.71 -150.715 -150.72 -150.725 -150.73 -150.735 -150.74 -150.745 -150.75 -150.755 -150.76 -150.765 -150.77 -150.775 -150.78 -150.785 -150.79 -150.795 -150.8 -150.805 -150.81 -150.815 -150.82 -150.825 -150.83 -150.835 -150.84 -150.845 -150.85 -150.855 -150.86 -150.865 -150.87 -150.875 -150.88 -150.885 -150.89 -150.895 -150.9 -150.905 -150.91 -150.915 -150.92 -150.925 -150.93 -150.935 -150.94 -150.945 -150.95 -150.955 -150.96 -150.965 -150.97 -150.975 -150.98 -150.985 -150.99 -150.995 -151 -151.005 -151.01 -151.015 -151.02 -151.025 -151.03 -151.035 -151.04 -151.045 -151.05 -151.055 -151.06 -151.065 -151.07 -151.075 -151.08 -151.085 -151.09 -151.095 -151.1 -151.105 -151.11 -151.115 -151.12 -151.125 -151.13 -151.135 -151.14 -151.145 -151.15 -151.155 -151.16 -151.165 -151.17 -151.175 -151.18 -151.185 -151.19 -151.195 -151.2 -151.205 -151.21 -151.215 -151.22 -151.225 -151.23 -151.235 -151.24 -151.245 -151.25 -151.255 -151.26 -151.265 -151.27 -151.275 -151.28 -151.285 -151.29 -151.295 -151.3 -151.305 -151.31 -151.315 -151.32 -151.325 -151.33 -151.335 -151.34 -151.345 -151.35 -151.355 -151.36 -151.365 -151.37 -151.375 -151.38 -151.385 -151.39 -151.395 -151.4 -151.405 -151.41 -151.415 -151.42 -151.425 -151.43 -151.435 -151.44 -151.445 -151.45 -151.455 -151.46 -151.465 -151.47 -151.475 -151.48 -151.485 -151.49 -151.495 -151.5 -151.505 -151.51 -151.515 -151.52 -151.525 -151.53 -151.535 -151.54 -151.545 -151.55 -151.555 -151.56 -151.565 -151.57 -151.575 -151.58 -151.585 -151.59 -151.595 -151.6 -151.605 -151.61 -151.615 -151.62 -151.625 -151.63 -151.635 -151.64 -151.645 -151.65 -151.655 -151.66 -151.665 -151.67 -151.675 -151.68 -151.685 -151.69 -151.695 -151.7 -151.705 -151.71 -151.715 -151.72 -151.725 -151.73 -151.735 -151.74 -151.745 -151.75 -151.755 -151.76 -151.765 -151.77 -151.775 -151.78 -151.785 -151.79 -151.795 -151.8 -151.805 -151.81 -151.815 -151.82 -151.825 -151.83 -151.835 -151.84 -151.845 -151.85 -151.855 -151.86 -151.865 -151.87 -151.875 -151.88 -151.885 -151.89 -151.895 -151.9 -151.905 -151.91 -151.915 -151.92 -151.925 -151.93 -151.935 -151.94 -151.945 -151.95 -151.955 -151.96 -151.965 -151.97 -151.975 -151.98 -151.985 -151.99 -151.995 -152 -152.005 -152.01 -152.015 -152.02 -152.025 -152.03 -152.035 -152.04 -152.045 -152.05 -152.055 -152.06 -152.065 -152.07 -152.075 -152.08 -152.085 -152.09 -152.095 -152.1 -152.105 -152.11 -152.115 -152.12 -152.125 -152.13 -152.135 -152.14 -152.145 -152.15 -152.155 -152.16 -152.165 -152.17 -152.175 -152.18 -152.185 -152.19 -152.195 -152.2 -152.205 -152.21 -152.215 -152.22 -152.225 -152.23 -152.235 -152.24 -152.245 -152.25 -152.255 -152.26 -152.265 -152.27 -152.275 -152.28 -152.285 -152.29 -152.295 -152.3 -152.305 -152.31 -152.315 -152.32 -152.325 -152.33 -152.335 -152.34 -152.345 -152.35 -152.355 -152.36 -152.365 -152.37 -152.375 -152.38 -152.385 -152.39 -152.395 -152.4 -152.405 -152.41 -152.415 -152.42 -152.425 -152.43 -152.435 -152.44 -152.445 -152.45 -152.455 -152.46 -152.465 -152.47 -152.475 -152.48 -152.485 -152.49 -152.495 -152.5 -152.505 -152.51 -152.515 -152.52 -152.525 -152.53 -152.535 -152.54 -152.545 -152.55 -152.555 -152.56 -152.565 -152.57 -152.575 -152.58 -152.585 -152.59 -152.595 -152.6 -152.605 -152.61 -152.615 -152.62 -152.625 -152.63 -152.635 -152.64 -152.645 -152.65 -152.655 -152.66 -152.665 -152.67 -152.675 -152.68 -152.685 -152.69 -152.695 -152.7 -152.705 -152.71 -152.715 -152.72 -152.725 -152.73 -152.735 -152.74 -152.745 -152.75 -152.755 -152.76 -152.765 -152.77 -152.775 -152.78 -152.785 -152.79 -152.795 -152.8 -152.805 -152.81 -152.815 -152.82 -152.825 -152.83 -152.835 -152.84 -152.845 -152.85 -152.855 -152.86 -152.865 -152.87 -152.875 -152.88 -152.885 -152.89 -152.895 -152.9 -152.905 -152.91 -152.915 -152.92 -152.925 -152.93 -152.935 -152.94 -152.945 -152.95 -152.955 -152.96 -152.965 -152.97 -152.975 -152.98 -152.985 -152.99 -152.995 -153 -153.005 -153.01 -153.015 -153.02 -153.025 -153.03 -153.035 -153.04 -153.045 -153.05 -153.055 -153.06 -153.065 -153.07 -153.075 -153.08 -153.085 -153.09 -153.095 -153.1 -153.105 -153.11 -153.115 -153.12 -153.125 -153.13 -153.135 -153.14 -153.145 -153.15 -153.155 -153.16 -153.165 -153.17 -153.175 -153.18 -153.185 -153.19 -153.195 -153.2 -153.205 -153.21 -153.215 -153.22 -153.225 -153.23 -153.235 -153.24 -153.245 -153.25 -153.255 -153.26 -153.265 -153.27 -153.275 -153.28 -153.285 -153.29 -153.295 -153.3 -153.305 -153.31 -153.315 -153.32 -153.325 -153.33 -153.335 -153.34 -153.345 -153.35 -153.355 -153.36 -153.365 -153.37 -153.375 -153.38 -153.385 -153.39 -153.395 -153.4 -153.405 -153.41 -153.415 -153.42 -153.425 -153.43 -153.435 -153.44 -153.445 -153.45 -153.455 -153.46 -153.465 -153.47 -153.475 -153.48 -153.485 -153.49 -153.495 -153.5 -153.505 -153.51 -153.515 -153.52 -153.525 -153.53 -153.535 -153.54 -153.545 -153.55 -153.555 -153.56 -153.565 -153.57 -153.575 -153.58 -153.585 -153.59 -153.595 -153.6 -153.605 -153.61 -153.615 -153.62 -153.625 -153.63 -153.635 -153.64 -153.645 -153.65 -153.655 -153.66 -153.665 -153.67 -153.675 -153.68 -153.685 -153.69 -153.695 -153.7 -153.705 -153.71 -153.715 -153.72 -153.725 -153.73 -153.735 -153.74 -153.745 -153.75 -153.755 -153.76 -153.765 -153.77 -153.775 -153.78 -153.785 -153.79 -153.795 -153.8 -153.805 -153.81 -153.815 -153.82 -153.825 -153.83 -153.835 -153.84 -153.845 -153.85 -153.855 -153.86 -153.865 -153.87 -153.875 -153.88 -153.885 -153.89 -153.895 -153.9 -153.905 -153.91 -153.915 -153.92 -153.925 -153.93 -153.935 -153.94 -153.945 -153.95 -153.955 -153.96 -153.965 -153.97 -153.975 -153.98 -153.985 -153.99 -153.995 -154 -154.005 -154.01 -154.015 -154.02 -154.025 -154.03 -154.035 -154.04 -154.045 -154.05 -154.055 -154.06 -154.065 -154.07 -154.075 -154.08 -154.085 -154.09 -154.095 -154.1 -154.105 -154.11 -154.115 -154.12 -154.125 -154.13 -154.135 -154.14 -154.145 -154.15 -154.155 -154.16 -154.165 -154.17 -154.175 -154.18 -154.185 -154.19 -154.195 -154.2 -154.205 -154.21 -154.215 -154.22 -154.225 -154.23 -154.235 -154.24 -154.245 -154.25 -154.255 -154.26 -154.265 -154.27 -154.275 -154.28 -154.285 -154.29 -154.295 -154.3 -154.305 -154.31 -154.315 -154.32 -154.325 -154.33 -154.335 -154.34 -154.345 -154.35 -154.355 -154.36 -154.365 -154.37 -154.375 -154.38 -154.385 -154.39 -154.395 -154.4 -154.405 -154.41 -154.415 -154.42 -154.425 -154.43 -154.435 -154.44 -154.445 -154.45 -154.455 -154.46 -154.465 -154.47 -154.475 -154.48 -154.485 -154.49 -154.495 -154.5 -154.505 -154.51 -154.515 -154.52 -154.525 -154.53 -154.535 -154.54 -154.545 -154.55 -154.555 -154.56 -154.565 -154.57 -154.575 -154.58 -154.585 -154.59 -154.595 -154.6 -154.605 -154.61 -154.615 -154.62 -154.625 -154.63 -154.635 -154.64 -154.645 -154.65 -154.655 -154.66 -154.665 -154.67 -154.675 -154.68 -154.685 -154.69 -154.695 -154.7 -154.705 -154.71 -154.715 -154.72 -154.725 -154.73 -154.735 -154.74 -154.745 -154.75 -154.755 -154.76 -154.765 -154.77 -154.775 -154.78 -154.785 -154.79 -154.795 -154.8 -154.805 -154.81 -154.815 -154.82 -154.825 -154.83 -154.835 -154.84 -154.845 -154.85 -154.855 -154.86 -154.865 -154.87 -154.875 -154.88 -154.885 -154.89 -154.895 -154.9 -154.905 -154.91 -154.915 -154.92 -154.925 -154.93 -154.935 -154.94 -154.945 -154.95 -154.955 -154.96 -154.965 -154.97 -154.975 -154.98 -154.985 -154.99 -154.995 -155 -155.005 -155.01 -155.015 -155.02 -155.025 -155.03 -155.035 -155.04 -155.045 -155.05 -155.055 -155.06 -155.065 -155.07 -155.075 -155.08 -155.085 -155.09 -155.095 -155.1 -155.105 -155.11 -155.115 -155.12 -155.125 -155.13 -155.135 -155.14 -155.145 -155.15 -155.155 -155.16 -155.165 -155.17 -155.175 -155.18 -155.185 -155.19 -155.195 -155.2 -155.205 -155.21 -155.215 -155.22 -155.225 -155.23 -155.235 -155.24 -155.245 -155.25 -155.255 -155.26 -155.265 -155.27 -155.275 -155.28 -155.285 -155.29 -155.295 -155.3 -155.305 -155.31 -155.315 -155.32 -155.325 -155.33 -155.335 -155.34 -155.345 -155.35 -155.355 -155.36 -155.365 -155.37 -155.375 -155.38 -155.385 -155.39 -155.395 -155.4 -155.405 -155.41 -155.415 -155.42 -155.425 -155.43 -155.435 -155.44 -155.445 -155.45 -155.455 -155.46 -155.465 -155.47 -155.475 -155.48 -155.485 -155.49 -155.495 -155.5 -155.505 -155.51 -155.515 -155.52 -155.525 -155.53 -155.535 -155.54 -155.545 -155.55 -155.555 -155.56 -155.565 -155.57 -155.575 -155.58 -155.585 -155.59 -155.595 -155.6 -155.605 -155.61 -155.615 -155.62 -155.625 -155.63 -155.635 -155.64 -155.645 -155.65 -155.655 -155.66 -155.665 -155.67 -155.675 -155.68 -155.685 -155.69 -155.695 -155.7 -155.705 -155.71 -155.715 -155.72 -155.725 -155.73 -155.735 -155.74 -155.745 -155.75 -155.755 -155.76 -155.765 -155.77 -155.775 -155.78 -155.785 -155.79 -155.795 -155.8 -155.805 -155.81 -155.815 -155.82 -155.825 -155.83 -155.835 -155.84 -155.845 -155.85 -155.855 -155.86 -155.865 -155.87 -155.875 -155.88 -155.885 -155.89 -155.895 -155.9 -155.905 -155.91 -155.915 -155.92 -155.925 -155.93 -155.935 -155.94 -155.945 -155.95 -155.955 -155.96 -155.965 -155.97 -155.975 -155.98 -155.985 -155.99 -155.995 -156 -156.005 -156.01 -156.015 -156.02 -156.025 -156.03 -156.035 -156.04 -156.045 -156.05 -156.055 -156.06 -156.065 -156.07 -156.075 -156.08 -156.085 -156.09 -156.095 -156.1 -156.105 -156.11 -156.115 -156.12 -156.125 -156.13 -156.135 -156.14 -156.145 -156.15 -156.155 -156.16 -156.165 -156.17 -156.175 -156.18 -156.185 -156.19 -156.195 -156.2 -156.205 -156.21 -156.215 -156.22 -156.225 -156.23 -156.235 -156.24 -156.245 -156.25 -156.255 -156.26 -156.265 -156.27 -156.275 -156.28 -156.285 -156.29 -156.295 -156.3 -156.305 -156.31 -156.315 -156.32 -156.325 -156.33 -156.335 -156.34 -156.345 -156.35 -156.355 -156.36 -156.365 -156.37 -156.375 -156.38 -156.385 -156.39 -156.395 -156.4 -156.405 -156.41 -156.415 -156.42 -156.425 -156.43 -156.435 -156.44 -156.445 -156.45 -156.455 -156.46 -156.465 -156.47 -156.475 -156.48 -156.485 -156.49 -156.495 -156.5 -156.505 -156.51 -156.515 -156.52 -156.525 -156.53 -156.535 -156.54 -156.545 -156.55 -156.555 -156.56 -156.565 -156.57 -156.575 -156.58 -156.585 -156.59 -156.595 -156.6 -156.605 -156.61 -156.615 -156.62 -156.625 -156.63 -156.635 -156.64 -156.645 -156.65 -156.655 -156.66 -156.665 -156.67 -156.675 -156.68 -156.685 -156.69 -156.695 -156.7 -156.705 -156.71 -156.715 -156.72 -156.725 -156.73 -156.735 -156.74 -156.745 -156.75 -156.755 -156.76 -156.765 -156.77 -156.775 -156.78 -156.785 -156.79 -156.795 -156.8 -156.805 -156.81 -156.815 -156.82 -156.825 -156.83 -156.835 -156.84 -156.845 -156.85 -156.855 -156.86 -156.865 -156.87 -156.875 -156.88 -156.885 -156.89 -156.895 -156.9 -156.905 -156.91 -156.915 -156.92 -156.925 -156.93 -156.935 -156.94 -156.945 -156.95 -156.955 -156.96 -156.965 -156.97 -156.975 -156.98 -156.985 -156.99 -156.995 -157 -157.005 -157.01 -157.015 -157.02 -157.025 -157.03 -157.035 -157.04 -157.045 -157.05 -157.055 -157.06 -157.065 -157.07 -157.075 -157.08 -157.085 -157.09 -157.095 -157.1 -157.105 -157.11 -157.115 -157.12 -157.125 -157.13 -157.135 -157.14 -157.145 -157.15 -157.155 -157.16 -157.165 -157.17 -157.175 -157.18 -157.185 -157.19 -157.195 -157.2 -157.205 -157.21 -157.215 -157.22 -157.225 -157.23 -157.235 -157.24 -157.245 -157.25 -157.255 -157.26 -157.265 -157.27 -157.275 -157.28 -157.285 -157.29 -157.295 -157.3 -157.305 -157.31 -157.315 -157.32 -157.325 -157.33 -157.335 -157.34 -157.345 -157.35 -157.355 -157.36 -157.365 -157.37 -157.375 -157.38 -157.385 -157.39 -157.395 -157.4 -157.405 -157.41 -157.415 -157.42 -157.425 -157.43 -157.435 -157.44 -157.445 -157.45 -157.455 -157.46 -157.465 -157.47 -157.475 -157.48 -157.485 -157.49 -157.495 -157.5 -157.505 -157.51 -157.515 -157.52 -157.525 -157.53 -157.535 -157.54 -157.545 -157.55 -157.555 -157.56 -157.565 -157.57 -157.575 -157.58 -157.585 -157.59 -157.595 -157.6 -157.605 -157.61 -157.615 -157.62 -157.625 -157.63 -157.635 -157.64 -157.645 -157.65 -157.655 -157.66 -157.665 -157.67 -157.675 -157.68 -157.685 -157.69 -157.695 -157.7 -157.705 -157.71 -157.715 -157.72 -157.725 -157.73 -157.735 -157.74 -157.745 -157.75 -157.755 -157.76 -157.765 -157.77 -157.775 -157.78 -157.785 -157.79 -157.795 -157.8 -157.805 -157.81 -157.815 -157.82 -157.825 -157.83 -157.835 -157.84 -157.845 -157.85 -157.855 -157.86 -157.865 -157.87 -157.875 -157.88 -157.885 -157.89 -157.895 -157.9 -157.905 -157.91 -157.915 -157.92 -157.925 -157.93 -157.935 -157.94 -157.945 -157.95 -157.955 -157.96 -157.965 -157.97 -157.975 -157.98 -157.985 -157.99 -157.995 -158 -158.005 -158.01 -158.015 -158.02 -158.025 -158.03 -158.035 -158.04 -158.045 -158.05 -158.055 -158.06 -158.065 -158.07 -158.075 -158.08 -158.085 -158.09 -158.095 -158.1 -158.105 -158.11 -158.115 -158.12 -158.125 -158.13 -158.135 -158.14 -158.145 -158.15 -158.155 -158.16 -158.165 -158.17 -158.175 -158.18 -158.185 -158.19 -158.195 -158.2 -158.205 -158.21 -158.215 -158.22 -158.225 -158.23 -158.235 -158.24 -158.245 -158.25 -158.255 -158.26 -158.265 -158.27 -158.275 -158.28 -158.285 -158.29 -158.295 -158.3 -158.305 -158.31 -158.315 -158.32 -158.325 -158.33 -158.335 -158.34 -158.345 -158.35 -158.355 -158.36 -158.365 -158.37 -158.375 -158.38 -158.385 -158.39 -158.395 -158.4 -158.405 -158.41 -158.415 -158.42 -158.425 -158.43 -158.435 -158.44 -158.445 -158.45 -158.455 -158.46 -158.465 -158.47 -158.475 -158.48 -158.485 -158.49 -158.495 -158.5 -158.505 -158.51 -158.515 -158.52 -158.525 -158.53 -158.535 -158.54 -158.545 -158.55 -158.555 -158.56 -158.565 -158.57 -158.575 -158.58 -158.585 -158.59 -158.595 -158.6 -158.605 -158.61 -158.615 -158.62 -158.625 -158.63 -158.635 -158.64 -158.645 -158.65 -158.655 -158.66 -158.665 -158.67 -158.675 -158.68 -158.685 -158.69 -158.695 -158.7 -158.705 -158.71 -158.715 -158.72 -158.725 -158.73 -158.735 -158.74 -158.745 -158.75 -158.755 -158.76 -158.765 -158.77 -158.775 -158.78 -158.785 -158.79 -158.795 -158.8 -158.805 -158.81 -158.815 -158.82 -158.825 -158.83 -158.835 -158.84 -158.845 -158.85 -158.855 -158.86 -158.865 -158.87 -158.875 -158.88 -158.885 -158.89 -158.895 -158.9 -158.905 -158.91 -158.915 -158.92 -158.925 -158.93 -158.935 -158.94 -158.945 -158.95 -158.955 -158.96 -158.965 -158.97 -158.975 -158.98 -158.985 -158.99 -158.995 -159 -159.005 -159.01 -159.015 -159.02 -159.025 -159.03 -159.035 -159.04 -159.045 -159.05 -159.055 -159.06 -159.065 -159.07 -159.075 -159.08 -159.085 -159.09 -159.095 -159.1 -159.105 -159.11 -159.115 -159.12 -159.125 -159.13 -159.135 -159.14 -159.145 -159.15 -159.155 -159.16 -159.165 -159.17 -159.175 -159.18 -159.185 -159.19 -159.195 -159.2 -159.205 -159.21 -159.215 -159.22 -159.225 -159.23 -159.235 -159.24 -159.245 -159.25 -159.255 -159.26 -159.265 -159.27 -159.275 -159.28 -159.285 -159.29 -159.295 -159.3 -159.305 -159.31 -159.315 -159.32 -159.325 -159.33 -159.335 -159.34 -159.345 -159.35 -159.355 -159.36 -159.365 -159.37 -159.375 -159.38 -159.385 -159.39 -159.395 -159.4 -159.405 -159.41 -159.415 -159.42 -159.425 -159.43 -159.435 -159.44 -159.445 -159.45 -159.455 -159.46 -159.465 -159.47 -159.475 -159.48 -159.485 -159.49 -159.495 -159.5 -159.505 -159.51 -159.515 -159.52 -159.525 -159.53 -159.535 -159.54 -159.545 -159.55 -159.555 -159.56 -159.565 -159.57 -159.575 -159.58 -159.585 -159.59 -159.595 -159.6 -159.605 -159.61 -159.615 -159.62 -159.625 -159.63 -159.635 -159.64 -159.645 -159.65 -159.655 -159.66 -159.665 -159.67 -159.675 -159.68 -159.685 -159.69 -159.695 -159.7 -159.705 -159.71 -159.715 -159.72 -159.725 -159.73 -159.735 -159.74 -159.745 -159.75 -159.755 -159.76 -159.765 -159.77 -159.775 -159.78 -159.785 -159.79 -159.795 -159.8 -159.805 -159.81 -159.815 -159.82 -159.825 -159.83 -159.835 -159.84 -159.845 -159.85 -159.855 -159.86 -159.865 -159.87 -159.875 -159.88 -159.885 -159.89 -159.895 -159.9 -159.905 -159.91 -159.915 -159.92 -159.925 -159.93 -159.935 -159.94 -159.945 -159.95 -159.955 -159.96 -159.965 -159.97 -159.975 -159.98 -159.985 -159.99 -159.995 -160 -160.005 -160.01 -160.015 -160.02 -160.025 -160.03 -160.035 -160.04 -160.045 -160.05 -160.055 -160.06 -160.065 -160.07 -160.075 -160.08 -160.085 -160.09 -160.095 -160.1 -160.105 -160.11 -160.115 -160.12 -160.125 -160.13 -160.135 -160.14 -160.145 -160.15 -160.155 -160.16 -160.165 -160.17 -160.175 -160.18 -160.185 -160.19 -160.195 -160.2 -160.205 -160.21 -160.215 -160.22 -160.225 -160.23 -160.235 -160.24 -160.245 -160.25 -160.255 -160.26 -160.265 -160.27 -160.275 -160.28 -160.285 -160.29 -160.295 -160.3 -160.305 -160.31 -160.315 -160.32 -160.325 -160.33 -160.335 -160.34 -160.345 -160.35 -160.355 -160.36 -160.365 -160.37 -160.375 -160.38 -160.385 -160.39 -160.395 -160.4 -160.405 -160.41 -160.415 -160.42 -160.425 -160.43 -160.435 -160.44 -160.445 -160.45 -160.455 -160.46 -160.465 -160.47 -160.475 -160.48 -160.485 -160.49 -160.495 -160.5 -160.505 -160.51 -160.515 -160.52 -160.525 -160.53 -160.535 -160.54 -160.545 -160.55 -160.555 -160.56 -160.565 -160.57 -160.575 -160.58 -160.585 -160.59 -160.595 -160.6 -160.605 -160.61 -160.615 -160.62 -160.625 -160.63 -160.635 -160.64 -160.645 -160.65 -160.655 -160.66 -160.665 -160.67 -160.675 -160.68 -160.685 -160.69 -160.695 -160.7 -160.705 -160.71 -160.715 -160.72 -160.725 -160.73 -160.735 -160.74 -160.745 -160.75 -160.755 -160.76 -160.765 -160.77 -160.775 -160.78 -160.785 -160.79 -160.795 -160.8 -160.805 -160.81 -160.815 -160.82 -160.825 -160.83 -160.835 -160.84 -160.845 -160.85 -160.855 -160.86 -160.865 -160.87 -160.875 -160.88 -160.885 -160.89 -160.895 -160.9 -160.905 -160.91 -160.915 -160.92 -160.925 -160.93 -160.935 -160.94 -160.945 -160.95 -160.955 -160.96 -160.965 -160.97 -160.975 -160.98 -160.985 -160.99 -160.995 -161 -161.005 -161.01 -161.015 -161.02 -161.025 -161.03 -161.035 -161.04 -161.045 -161.05 -161.055 -161.06 -161.065 -161.07 -161.075 -161.08 -161.085 -161.09 -161.095 -161.1 -161.105 -161.11 -161.115 -161.12 -161.125 -161.13 -161.135 -161.14 -161.145 -161.15 -161.155 -161.16 -161.165 -161.17 -161.175 -161.18 -161.185 -161.19 -161.195 -161.2 -161.205 -161.21 -161.215 -161.22 -161.225 -161.23 -161.235 -161.24 -161.245 -161.25 -161.255 -161.26 -161.265 -161.27 -161.275 -161.28 -161.285 -161.29 -161.295 -161.3 -161.305 -161.31 -161.315 -161.32 -161.325 -161.33 -161.335 -161.34 -161.345 -161.35 -161.355 -161.36 -161.365 -161.37 -161.375 -161.38 -161.385 -161.39 -161.395 -161.4 -161.405 -161.41 -161.415 -161.42 -161.425 -161.43 -161.435 -161.44 -161.445 -161.45 -161.455 -161.46 -161.465 -161.47 -161.475 -161.48 -161.485 -161.49 -161.495 -161.5 -161.505 -161.51 -161.515 -161.52 -161.525 -161.53 -161.535 -161.54 -161.545 -161.55 -161.555 -161.56 -161.565 -161.57 -161.575 -161.58 -161.585 -161.59 -161.595 -161.6 -161.605 -161.61 -161.615 -161.62 -161.625 -161.63 -161.635 -161.64 -161.645 -161.65 -161.655 -161.66 -161.665 -161.67 -161.675 -161.68 -161.685 -161.69 -161.695 -161.7 -161.705 -161.71 -161.715 -161.72 -161.725 -161.73 -161.735 -161.74 -161.745 -161.75 -161.755 -161.76 -161.765 -161.77 -161.775 -161.78 -161.785 -161.79 -161.795 -161.8 -161.805 -161.81 -161.815 -161.82 -161.825 -161.83 -161.835 -161.84 -161.845 -161.85 -161.855 -161.86 -161.865 -161.87 -161.875 -161.88 -161.885 -161.89 -161.895 -161.9 -161.905 -161.91 -161.915 -161.92 -161.925 -161.93 -161.935 -161.94 -161.945 -161.95 -161.955 -161.96 -161.965 -161.97 -161.975 -161.98 -161.985 -161.99 -161.995 -162 -162.005 -162.01 -162.015 -162.02 -162.025 -162.03 -162.035 -162.04 -162.045 -162.05 -162.055 -162.06 -162.065 -162.07 -162.075 -162.08 -162.085 -162.09 -162.095 -162.1 -162.105 -162.11 -162.115 -162.12 -162.125 -162.13 -162.135 -162.14 -162.145 -162.15 -162.155 -162.16 -162.165 -162.17 -162.175 -162.18 -162.185 -162.19 -162.195 -162.2 -162.205 -162.21 -162.215 -162.22 -162.225 -162.23 -162.235 -162.24 -162.245 -162.25 -162.255 -162.26 -162.265 -162.27 -162.275 -162.28 -162.285 -162.29 -162.295 -162.3 -162.305 -162.31 -162.315 -162.32 -162.325 -162.33 -162.335 -162.34 -162.345 -162.35 -162.355 -162.36 -162.365 -162.37 -162.375 -162.38 -162.385 -162.39 -162.395 -162.4 -162.405 -162.41 -162.415 -162.42 -162.425 -162.43 -162.435 -162.44 -162.445 -162.45 -162.455 -162.46 -162.465 -162.47 -162.475 -162.48 -162.485 -162.49 -162.495 -162.5 -162.505 -162.51 -162.515 -162.52 -162.525 -162.53 -162.535 -162.54 -162.545 -162.55 -162.555 -162.56 -162.565 -162.57 -162.575 -162.58 -162.585 -162.59 -162.595 -162.6 -162.605 -162.61 -162.615 -162.62 -162.625 -162.63 -162.635 -162.64 -162.645 -162.65 -162.655 -162.66 -162.665 -162.67 -162.675 -162.68 -162.685 -162.69 -162.695 -162.7 -162.705 -162.71 -162.715 -162.72 -162.725 -162.73 -162.735 -162.74 -162.745 -162.75 -162.755 -162.76 -162.765 -162.77 -162.775 -162.78 -162.785 -162.79 -162.795 -162.8 -162.805 -162.81 -162.815 -162.82 -162.825 -162.83 -162.835 -162.84 -162.845 -162.85 -162.855 -162.86 -162.865 -162.87 -162.875 -162.88 -162.885 -162.89 -162.895 -162.9 -162.905 -162.91 -162.915 -162.92 -162.925 -162.93 -162.935 -162.94 -162.945 -162.95 -162.955 -162.96 -162.965 -162.97 -162.975 -162.98 -162.985 -162.99 -162.995 -163 -163.005 -163.01 -163.015 -163.02 -163.025 -163.03 -163.035 -163.04 -163.045 -163.05 -163.055 -163.06 -163.065 -163.07 -163.075 -163.08 -163.085 -163.09 -163.095 -163.1 -163.105 -163.11 -163.115 -163.12 -163.125 -163.13 -163.135 -163.14 -163.145 -163.15 -163.155 -163.16 -163.165 -163.17 -163.175 -163.18 -163.185 -163.19 -163.195 -163.2 -163.205 -163.21 -163.215 -163.22 -163.225 -163.23 -163.235 -163.24 -163.245 -163.25 -163.255 -163.26 -163.265 -163.27 -163.275 -163.28 -163.285 -163.29 -163.295 -163.3 -163.305 -163.31 -163.315 -163.32 -163.325 -163.33 -163.335 -163.34 -163.345 -163.35 -163.355 -163.36 -163.365 -163.37 -163.375 -163.38 -163.385 -163.39 -163.395 -163.4 -163.405 -163.41 -163.415 -163.42 -163.425 -163.43 -163.435 -163.44 -163.445 -163.45 -163.455 -163.46 -163.465 -163.47 -163.475 -163.48 -163.485 -163.49 -163.495 -163.5 -163.505 -163.51 -163.515 -163.52 -163.525 -163.53 -163.535 -163.54 -163.545 -163.55 -163.555 -163.56 -163.565 -163.57 -163.575 -163.58 -163.585 -163.59 -163.595 -163.6 -163.605 -163.61 -163.615 -163.62 -163.625 -163.63 -163.635 -163.64 -163.645 -163.65 -163.655 -163.66 -163.665 -163.67 -163.675 -163.68 -163.685 -163.69 -163.695 -163.7 -163.705 -163.71 -163.715 -163.72 -163.725 -163.73 -163.735 -163.74 -163.745 -163.75 -163.755 -163.76 -163.765 -163.77 -163.775 -163.78 -163.785 -163.79 -163.795 -163.8 -163.805 -163.81 -163.815 -163.82 -163.825 -163.83 -163.835 -163.84 -163.845 -163.85 -163.855 -163.86 -163.865 -163.87 -163.875 -163.88 -163.885 -163.89 -163.895 -163.9 -163.905 -163.91 -163.915 -163.92 -163.925 -163.93 -163.935 -163.94 -163.945 -163.95 -163.955 -163.96 -163.965 -163.97 -163.975 -163.98 -163.985 -163.99 -163.995 -164 -164.005 -164.01 -164.015 -164.02 -164.025 -164.03 -164.035 -164.04 -164.045 -164.05 -164.055 -164.06 -164.065 -164.07 -164.075 -164.08 -164.085 -164.09 -164.095 -164.1 -164.105 -164.11 -164.115 -164.12 -164.125 -164.13 -164.135 -164.14 -164.145 -164.15 -164.155 -164.16 -164.165 -164.17 -164.175 -164.18 -164.185 -164.19 -164.195 -164.2 -164.205 -164.21 -164.215 -164.22 -164.225 -164.23 -164.235 -164.24 -164.245 -164.25 -164.255 -164.26 -164.265 -164.27 -164.275 -164.28 -164.285 -164.29 -164.295 -164.3 -164.305 -164.31 -164.315 -164.32 -164.325 -164.33 -164.335 -164.34 -164.345 -164.35 -164.355 -164.36 -164.365 -164.37 -164.375 -164.38 -164.385 -164.39 -164.395 -164.4 -164.405 -164.41 -164.415 -164.42 -164.425 -164.43 -164.435 -164.44 -164.445 -164.45 -164.455 -164.46 -164.465 -164.47 -164.475 -164.48 -164.485 -164.49 -164.495 -164.5 -164.505 -164.51 -164.515 -164.52 -164.525 -164.53 -164.535 -164.54 -164.545 -164.55 -164.555 -164.56 -164.565 -164.57 -164.575 -164.58 -164.585 -164.59 -164.595 -164.6 -164.605 -164.61 -164.615 -164.62 -164.625 -164.63 -164.635 -164.64 -164.645 -164.65 -164.655 -164.66 -164.665 -164.67 -164.675 -164.68 -164.685 -164.69 -164.695 -164.7 -164.705 -164.71 -164.715 -164.72 -164.725 -164.73 -164.735 -164.74 -164.745 -164.75 -164.755 -164.76 -164.765 -164.77 -164.775 -164.78 -164.785 -164.79 -164.795 -164.8 -164.805 -164.81 -164.815 -164.82 -164.825 -164.83 -164.835 -164.84 -164.845 -164.85 -164.855 -164.86 -164.865 -164.87 -164.875 -164.88 -164.885 -164.89 -164.895 -164.9 -164.905 -164.91 -164.915 -164.92 -164.925 -164.93 -164.935 -164.94 -164.945 -164.95 -164.955 -164.96 -164.965 -164.97 -164.975 -164.98 -164.985 -164.99 -164.995 -165 -165.005 -165.01 -165.015 -165.02 -165.025 -165.03 -165.035 -165.04 -165.045 -165.05 -165.055 -165.06 -165.065 -165.07 -165.075 -165.08 -165.085 -165.09 -165.095 -165.1 -165.105 -165.11 -165.115 -165.12 -165.125 -165.13 -165.135 -165.14 -165.145 -165.15 -165.155 -165.16 -165.165 -165.17 -165.175 -165.18 -165.185 -165.19 -165.195 -165.2 -165.205 -165.21 -165.215 -165.22 -165.225 -165.23 -165.235 -165.24 -165.245 -165.25 -165.255 -165.26 -165.265 -165.27 -165.275 -165.28 -165.285 -165.29 -165.295 -165.3 -165.305 -165.31 -165.315 -165.32 -165.325 -165.33 -165.335 -165.34 -165.345 -165.35 -165.355 -165.36 -165.365 -165.37 -165.375 -165.38 -165.385 -165.39 -165.395 -165.4 -165.405 -165.41 -165.415 -165.42 -165.425 -165.43 -165.435 -165.44 -165.445 -165.45 -165.455 -165.46 -165.465 -165.47 -165.475 -165.48 -165.485 -165.49 -165.495 -165.5 -165.505 -165.51 -165.515 -165.52 -165.525 -165.53 -165.535 -165.54 -165.545 -165.55 -165.555 -165.56 -165.565 -165.57 -165.575 -165.58 -165.585 -165.59 -165.595 -165.6 -165.605 -165.61 -165.615 -165.62 -165.625 -165.63 -165.635 -165.64 -165.645 -165.65 -165.655 -165.66 -165.665 -165.67 -165.675 -165.68 -165.685 -165.69 -165.695 -165.7 -165.705 -165.71 -165.715 -165.72 -165.725 -165.73 -165.735 -165.74 -165.745 -165.75 -165.755 -165.76 -165.765 -165.77 -165.775 -165.78 -165.785 -165.79 -165.795 -165.8 -165.805 -165.81 -165.815 -165.82 -165.825 -165.83 -165.835 -165.84 -165.845 -165.85 -165.855 -165.86 -165.865 -165.87 -165.875 -165.88 -165.885 -165.89 -165.895 -165.9 -165.905 -165.91 -165.915 -165.92 -165.925 -165.93 -165.935 -165.94 -165.945 -165.95 -165.955 -165.96 -165.965 -165.97 -165.975 -165.98 -165.985 -165.99 -165.995 -166 -166.005 -166.01 -166.015 -166.02 -166.025 -166.03 -166.035 -166.04 -166.045 -166.05 -166.055 -166.06 -166.065 -166.07 -166.075 -166.08 -166.085 -166.09 -166.095 -166.1 -166.105 -166.11 -166.115 -166.12 -166.125 -166.13 -166.135 -166.14 -166.145 -166.15 -166.155 -166.16 -166.165 -166.17 -166.175 -166.18 -166.185 -166.19 -166.195 -166.2 -166.205 -166.21 -166.215 -166.22 -166.225 -166.23 -166.235 -166.24 -166.245 -166.25 -166.255 -166.26 -166.265 -166.27 -166.275 -166.28 -166.285 -166.29 -166.295 -166.3 -166.305 -166.31 -166.315 -166.32 -166.325 -166.33 -166.335 -166.34 -166.345 -166.35 -166.355 -166.36 -166.365 -166.37 -166.375 -166.38 -166.385 -166.39 -166.395 -166.4 -166.405 -166.41 -166.415 -166.42 -166.425 -166.43 -166.435 -166.44 -166.445 -166.45 -166.455 -166.46 -166.465 -166.47 -166.475 -166.48 -166.485 -166.49 -166.495 -166.5 -166.505 -166.51 -166.515 -166.52 -166.525 -166.53 -166.535 -166.54 -166.545 -166.55 -166.555 -166.56 -166.565 -166.57 -166.575 -166.58 -166.585 -166.59 -166.595 -166.6 -166.605 -166.61 -166.615 -166.62 -166.625 -166.63 -166.635 -166.64 -166.645 -166.65 -166.655 -166.66 -166.665 -166.67 -166.675 -166.68 -166.685 -166.69 -166.695 -166.7 -166.705 -166.71 -166.715 -166.72 -166.725 -166.73 -166.735 -166.74 -166.745 -166.75 -166.755 -166.76 -166.765 -166.77 -166.775 -166.78 -166.785 -166.79 -166.795 -166.8 -166.805 -166.81 -166.815 -166.82 -166.825 -166.83 -166.835 -166.84 -166.845 -166.85 -166.855 -166.86 -166.865 -166.87 -166.875 -166.88 -166.885 -166.89 -166.895 -166.9 -166.905 -166.91 -166.915 -166.92 -166.925 -166.93 -166.935 -166.94 -166.945 -166.95 -166.955 -166.96 -166.965 -166.97 -166.975 -166.98 -166.985 -166.99 -166.995 -167 -167.005 -167.01 -167.015 -167.02 -167.025 -167.03 -167.035 -167.04 -167.045 -167.05 -167.055 -167.06 -167.065 -167.07 -167.075 -167.08 -167.085 -167.09 -167.095 -167.1 -167.105 -167.11 -167.115 -167.12 -167.125 -167.13 -167.135 -167.14 -167.145 -167.15 -167.155 -167.16 -167.165 -167.17 -167.175 -167.18 -167.185 -167.19 -167.195 -167.2 -167.205 -167.21 -167.215 -167.22 -167.225 -167.23 -167.235 -167.24 -167.245 -167.25 -167.255 -167.26 -167.265 -167.27 -167.275 -167.28 -167.285 -167.29 -167.295 -167.3 -167.305 -167.31 -167.315 -167.32 -167.325 -167.33 -167.335 -167.34 -167.345 -167.35 -167.355 -167.36 -167.365 -167.37 -167.375 -167.38 -167.385 -167.39 -167.395 -167.4 -167.405 -167.41 -167.415 -167.42 -167.425 -167.43 -167.435 -167.44 -167.445 -167.45 -167.455 -167.46 -167.465 -167.47 -167.475 -167.48 -167.485 -167.49 -167.495 -167.5 -167.505 -167.51 -167.515 -167.52 -167.525 -167.53 -167.535 -167.54 -167.545 -167.55 -167.555 -167.56 -167.565 -167.57 -167.575 -167.58 -167.585 -167.59 -167.595 -167.6 -167.605 -167.61 -167.615 -167.62 -167.625 -167.63 -167.635 -167.64 -167.645 -167.65 -167.655 -167.66 -167.665 -167.67 -167.675 -167.68 -167.685 -167.69 -167.695 -167.7 -167.705 -167.71 -167.715 -167.72 -167.725 -167.73 -167.735 -167.74 -167.745 -167.75 -167.755 -167.76 -167.765 -167.77 -167.775 -167.78 -167.785 -167.79 -167.795 -167.8 -167.805 -167.81 -167.815 -167.82 -167.825 -167.83 -167.835 -167.84 -167.845 -167.85 -167.855 -167.86 -167.865 -167.87 -167.875 -167.88 -167.885 -167.89 -167.895 -167.9 -167.905 -167.91 -167.915 -167.92 -167.925 -167.93 -167.935 -167.94 -167.945 -167.95 -167.955 -167.96 -167.965 -167.97 -167.975 -167.98 -167.985 -167.99 -167.995 -168 -168.005 -168.01 -168.015 -168.02 -168.025 -168.03 -168.035 -168.04 -168.045 -168.05 -168.055 -168.06 -168.065 -168.07 -168.075 -168.08 -168.085 -168.09 -168.095 -168.1 -168.105 -168.11 -168.115 -168.12 -168.125 -168.13 -168.135 -168.14 -168.145 -168.15 -168.155 -168.16 -168.165 -168.17 -168.175 -168.18 -168.185 -168.19 -168.195 -168.2 -168.205 -168.21 -168.215 -168.22 -168.225 -168.23 -168.235 -168.24 -168.245 -168.25 -168.255 -168.26 -168.265 -168.27 -168.275 -168.28 -168.285 -168.29 -168.295 -168.3 -168.305 -168.31 -168.315 -168.32 -168.325 -168.33 -168.335 -168.34 -168.345 -168.35 -168.355 -168.36 -168.365 -168.37 -168.375 -168.38 -168.385 -168.39 -168.395 -168.4 -168.405 -168.41 -168.415 -168.42 -168.425 -168.43 -168.435 -168.44 -168.445 -168.45 -168.455 -168.46 -168.465 -168.47 -168.475 -168.48 -168.485 -168.49 -168.495 -168.5 -168.505 -168.51 -168.515 -168.52 -168.525 -168.53 -168.535 -168.54 -168.545 -168.55 -168.555 -168.56 -168.565 -168.57 -168.575 -168.58 -168.585 -168.59 -168.595 -168.6 -168.605 -168.61 -168.615 -168.62 -168.625 -168.63 -168.635 -168.64 -168.645 -168.65 -168.655 -168.66 -168.665 -168.67 -168.675 -168.68 -168.685 -168.69 -168.695 -168.7 -168.705 -168.71 -168.715 -168.72 -168.725 -168.73 -168.735 -168.74 -168.745 -168.75 -168.755 -168.76 -168.765 -168.77 -168.775 -168.78 -168.785 -168.79 -168.795 -168.8 -168.805 -168.81 -168.815 -168.82 -168.825 -168.83 -168.835 -168.84 -168.845 -168.85 -168.855 -168.86 -168.865 -168.87 -168.875 -168.88 -168.885 -168.89 -168.895 -168.9 -168.905 -168.91 -168.915 -168.92 -168.925 -168.93 -168.935 -168.94 -168.945 -168.95 -168.955 -168.96 -168.965 -168.97 -168.975 -168.98 -168.985 -168.99 -168.995 -169 -169.005 -169.01 -169.015 -169.02 -169.025 -169.03 -169.035 -169.04 -169.045 -169.05 -169.055 -169.06 -169.065 -169.07 -169.075 -169.08 -169.085 -169.09 -169.095 -169.1 -169.105 -169.11 -169.115 -169.12 -169.125 -169.13 -169.135 -169.14 -169.145 -169.15 -169.155 -169.16 -169.165 -169.17 -169.175 -169.18 -169.185 -169.19 -169.195 -169.2 -169.205 -169.21 -169.215 -169.22 -169.225 -169.23 -169.235 -169.24 -169.245 -169.25 -169.255 -169.26 -169.265 -169.27 -169.275 -169.28 -169.285 -169.29 -169.295 -169.3 -169.305 -169.31 -169.315 -169.32 -169.325 -169.33 -169.335 -169.34 -169.345 -169.35 -169.355 -169.36 -169.365 -169.37 -169.375 -169.38 -169.385 -169.39 -169.395 -169.4 -169.405 -169.41 -169.415 -169.42 -169.425 -169.43 -169.435 -169.44 -169.445 -169.45 -169.455 -169.46 -169.465 -169.47 -169.475 -169.48 -169.485 -169.49 -169.495 -169.5 -169.505 -169.51 -169.515 -169.52 -169.525 -169.53 -169.535 -169.54 -169.545 -169.55 -169.555 -169.56 -169.565 -169.57 -169.575 -169.58 -169.585 -169.59 -169.595 -169.6 -169.605 -169.61 -169.615 -169.62 -169.625 -169.63 -169.635 -169.64 -169.645 -169.65 -169.655 -169.66 -169.665 -169.67 -169.675 -169.68 -169.685 -169.69 -169.695 -169.7 -169.705 -169.71 -169.715 -169.72 -169.725 -169.73 -169.735 -169.74 -169.745 -169.75 -169.755 -169.76 -169.765 -169.77 -169.775 -169.78 -169.785 -169.79 -169.795 -169.8 -169.805 -169.81 -169.815 -169.82 -169.825 -169.83 -169.835 -169.84 -169.845 -169.85 -169.855 -169.86 -169.865 -169.87 -169.875 -169.88 -169.885 -169.89 -169.895 -169.9 -169.905 -169.91 -169.915 -169.92 -169.925 -169.93 -169.935 -169.94 -169.945 -169.95 -169.955 -169.96 -169.965 -169.97 -169.975 -169.98 -169.985 -169.99 -169.995 -170 -170.005 -170.01 -170.015 -170.02 -170.025 -170.03 -170.035 -170.04 -170.045 -170.05 -170.055 -170.06 -170.065 -170.07 -170.075 -170.08 -170.085 -170.09 -170.095 -170.1 -170.105 -170.11 -170.115 -170.12 -170.125 -170.13 -170.135 -170.14 -170.145 -170.15 -170.155 -170.16 -170.165 -170.17 -170.175 -170.18 -170.185 -170.19 -170.195 -170.2 -170.205 -170.21 -170.215 -170.22 -170.225 -170.23 -170.235 -170.24 -170.245 -170.25 -170.255 -170.26 -170.265 -170.27 -170.275 -170.28 -170.285 -170.29 -170.295 -170.3 -170.305 -170.31 -170.315 -170.32 -170.325 -170.33 -170.335 -170.34 -170.345 -170.35 -170.355 -170.36 -170.365 -170.37 -170.375 -170.38 -170.385 -170.39 -170.395 -170.4 -170.405 -170.41 -170.415 -170.42 -170.425 -170.43 -170.435 -170.44 -170.445 -170.45 -170.455 -170.46 -170.465 -170.47 -170.475 -170.48 -170.485 -170.49 -170.495 -170.5 -170.505 -170.51 -170.515 -170.52 -170.525 -170.53 -170.535 -170.54 -170.545 -170.55 -170.555 -170.56 -170.565 -170.57 -170.575 -170.58 -170.585 -170.59 -170.595 -170.6 -170.605 -170.61 -170.615 -170.62 -170.625 -170.63 -170.635 -170.64 -170.645 -170.65 -170.655 -170.66 -170.665 -170.67 -170.675 -170.68 -170.685 -170.69 -170.695 -170.7 -170.705 -170.71 -170.715 -170.72 -170.725 -170.73 -170.735 -170.74 -170.745 -170.75 -170.755 -170.76 -170.765 -170.77 -170.775 -170.78 -170.785 -170.79 -170.795 -170.8 -170.805 -170.81 -170.815 -170.82 -170.825 -170.83 -170.835 -170.84 -170.845 -170.85 -170.855 -170.86 -170.865 -170.87 -170.875 -170.88 -170.885 -170.89 -170.895 -170.9 -170.905 -170.91 -170.915 -170.92 -170.925 -170.93 -170.935 -170.94 -170.945 -170.95 -170.955 -170.96 -170.965 -170.97 -170.975 -170.98 -170.985 -170.99 -170.995 -171 -171.005 -171.01 -171.015 -171.02 -171.025 -171.03 -171.035 -171.04 -171.045 -171.05 -171.055 -171.06 -171.065 -171.07 -171.075 -171.08 -171.085 -171.09 -171.095 -171.1 -171.105 -171.11 -171.115 -171.12 -171.125 -171.13 -171.135 -171.14 -171.145 -171.15 -171.155 -171.16 -171.165 -171.17 -171.175 -171.18 -171.185 -171.19 -171.195 -171.2 -171.205 -171.21 -171.215 -171.22 -171.225 -171.23 -171.235 -171.24 -171.245 -171.25 -171.255 -171.26 -171.265 -171.27 -171.275 -171.28 -171.285 -171.29 -171.295 -171.3 -171.305 -171.31 -171.315 -171.32 -171.325 -171.33 -171.335 -171.34 -171.345 -171.35 -171.355 -171.36 -171.365 -171.37 -171.375 -171.38 -171.385 -171.39 -171.395 -171.4 -171.405 -171.41 -171.415 -171.42 -171.425 -171.43 -171.435 -171.44 -171.445 -171.45 -171.455 -171.46 -171.465 -171.47 -171.475 -171.48 -171.485 -171.49 -171.495 -171.5 -171.505 -171.51 -171.515 -171.52 -171.525 -171.53 -171.535 -171.54 -171.545 -171.55 -171.555 -171.56 -171.565 -171.57 -171.575 -171.58 -171.585 -171.59 -171.595 -171.6 -171.605 -171.61 -171.615 -171.62 -171.625 -171.63 -171.635 -171.64 -171.645 -171.65 -171.655 -171.66 -171.665 -171.67 -171.675 -171.68 -171.685 -171.69 -171.695 -171.7 -171.705 -171.71 -171.715 -171.72 -171.725 -171.73 -171.735 -171.74 -171.745 -171.75 -171.755 -171.76 -171.765 -171.77 -171.775 -171.78 -171.785 -171.79 -171.795 -171.8 -171.805 -171.81 -171.815 -171.82 -171.825 -171.83 -171.835 -171.84 -171.845 -171.85 -171.855 -171.86 -171.865 -171.87 -171.875 -171.88 -171.885 -171.89 -171.895 -171.9 -171.905 -171.91 -171.915 -171.92 -171.925 -171.93 -171.935 -171.94 -171.945 -171.95 -171.955 -171.96 -171.965 -171.97 -171.975 -171.98 -171.985 -171.99 -171.995 -172 -172.005 -172.01 -172.015 -172.02 -172.025 -172.03 -172.035 -172.04 -172.045 -172.05 -172.055 -172.06 -172.065 -172.07 -172.075 -172.08 -172.085 -172.09 -172.095 -172.1 -172.105 -172.11 -172.115 -172.12 -172.125 -172.13 -172.135 -172.14 -172.145 -172.15 -172.155 -172.16 -172.165 -172.17 -172.175 -172.18 -172.185 -172.19 -172.195 -172.2 -172.205 -172.21 -172.215 -172.22 -172.225 -172.23 -172.235 -172.24 -172.245 -172.25 -172.255 -172.26 -172.265 -172.27 -172.275 -172.28 -172.285 -172.29 -172.295 -172.3 -172.305 -172.31 -172.315 -172.32 -172.325 -172.33 -172.335 -172.34 -172.345 -172.35 -172.355 -172.36 -172.365 -172.37 -172.375 -172.38 -172.385 -172.39 -172.395 -172.4 -172.405 -172.41 -172.415 -172.42 -172.425 -172.43 -172.435 -172.44 -172.445 -172.45 -172.455 -172.46 -172.465 -172.47 -172.475 -172.48 -172.485 -172.49 -172.495 -172.5 -172.505 -172.51 -172.515 -172.52 -172.525 -172.53 -172.535 -172.54 -172.545 -172.55 -172.555 -172.56 -172.565 -172.57 -172.575 -172.58 -172.585 -172.59 -172.595 -172.6 -172.605 -172.61 -172.615 -172.62 -172.625 -172.63 -172.635 -172.64 -172.645 -172.65 -172.655 -172.66 -172.665 -172.67 -172.675 -172.68 -172.685 -172.69 -172.695 -172.7 -172.705 -172.71 -172.715 -172.72 -172.725 -172.73 -172.735 -172.74 -172.745 -172.75 -172.755 -172.76 -172.765 -172.77 -172.775 -172.78 -172.785 -172.79 -172.795 -172.8 -172.805 -172.81 -172.815 -172.82 -172.825 -172.83 -172.835 -172.84 -172.845 -172.85 -172.855 -172.86 -172.865 -172.87 -172.875 -172.88 -172.885 -172.89 -172.895 -172.9 -172.905 -172.91 -172.915 -172.92 -172.925 -172.93 -172.935 -172.94 -172.945 -172.95 -172.955 -172.96 -172.965 -172.97 -172.975 -172.98 -172.985 -172.99 -172.995 -173 -173.005 -173.01 -173.015 -173.02 -173.025 -173.03 -173.035 -173.04 -173.045 -173.05 -173.055 -173.06 -173.065 -173.07 -173.075 -173.08 -173.085 -173.09 -173.095 -173.1 -173.105 -173.11 -173.115 -173.12 -173.125 -173.13 -173.135 -173.14 -173.145 -173.15 -173.155 -173.16 -173.165 -173.17 -173.175 -173.18 -173.185 -173.19 -173.195 -173.2 -173.205 -173.21 -173.215 -173.22 -173.225 -173.23 -173.235 -173.24 -173.245 -173.25 -173.255 -173.26 -173.265 -173.27 -173.275 -173.28 -173.285 -173.29 -173.295 -173.3 -173.305 -173.31 -173.315 -173.32 -173.325 -173.33 -173.335 -173.34 -173.345 -173.35 -173.355 -173.36 -173.365 -173.37 -173.375 -173.38 -173.385 -173.39 -173.395 -173.4 -173.405 -173.41 -173.415 -173.42 -173.425 -173.43 -173.435 -173.44 -173.445 -173.45 -173.455 -173.46 -173.465 -173.47 -173.475 -173.48 -173.485 -173.49 -173.495 -173.5 -173.505 -173.51 -173.515 -173.52 -173.525 -173.53 -173.535 -173.54 -173.545 -173.55 -173.555 -173.56 -173.565 -173.57 -173.575 -173.58 -173.585 -173.59 -173.595 -173.6 -173.605 -173.61 -173.615 -173.62 -173.625 -173.63 -173.635 -173.64 -173.645 -173.65 -173.655 -173.66 -173.665 -173.67 -173.675 -173.68 -173.685 -173.69 -173.695 -173.7 -173.705 -173.71 -173.715 -173.72 -173.725 -173.73 -173.735 -173.74 -173.745 -173.75 -173.755 -173.76 -173.765 -173.77 -173.775 -173.78 -173.785 -173.79 -173.795 -173.8 -173.805 -173.81 -173.815 -173.82 -173.825 -173.83 -173.835 -173.84 -173.845 -173.85 -173.855 -173.86 -173.865 -173.87 -173.875 -173.88 -173.885 -173.89 -173.895 -173.9 -173.905 -173.91 -173.915 -173.92 -173.925 -173.93 -173.935 -173.94 -173.945 -173.95 -173.955 -173.96 -173.965 -173.97 -173.975 -173.98 -173.985 -173.99 -173.995 -174 -174.005 -174.01 -174.015 -174.02 -174.025 -174.03 -174.035 -174.04 -174.045 -174.05 -174.055 -174.06 -174.065 -174.07 -174.075 -174.08 -174.085 -174.09 -174.095 -174.1 -174.105 -174.11 -174.115 -174.12 -174.125 -174.13 -174.135 -174.14 -174.145 -174.15 -174.155 -174.16 -174.165 -174.17 -174.175 -174.18 -174.185 -174.19 -174.195 -174.2 -174.205 -174.21 -174.215 -174.22 -174.225 -174.23 -174.235 -174.24 -174.245 -174.25 -174.255 -174.26 -174.265 -174.27 -174.275 -174.28 -174.285 -174.29 -174.295 -174.3 -174.305 -174.31 -174.315 -174.32 -174.325 -174.33 -174.335 -174.34 -174.345 -174.35 -174.355 -174.36 -174.365 -174.37 -174.375 -174.38 -174.385 -174.39 -174.395 -174.4 -174.405 -174.41 -174.415 -174.42 -174.425 -174.43 -174.435 -174.44 -174.445 -174.45 -174.455 -174.46 -174.465 -174.47 -174.475 -174.48 -174.485 -174.49 -174.495 -174.5 -174.505 -174.51 -174.515 -174.52 -174.525 -174.53 -174.535 -174.54 -174.545 -174.55 -174.555 -174.56 -174.565 -174.57 -174.575 -174.58 -174.585 -174.59 -174.595 -174.6 -174.605 -174.61 -174.615 -174.62 -174.625 -174.63 -174.635 -174.64 -174.645 -174.65 -174.655 -174.66 -174.665 -174.67 -174.675 -174.68 -174.685 -174.69 -174.695 -174.7 -174.705 -174.71 -174.715 -174.72 -174.725 -174.73 -174.735 -174.74 -174.745 -174.75 -174.755 -174.76 -174.765 -174.77 -174.775 -174.78 -174.785 -174.79 -174.795 -174.8 -174.805 -174.81 -174.815 -174.82 -174.825 -174.83 -174.835 -174.84 -174.845 -174.85 -174.855 -174.86 -174.865 -174.87 -174.875 -174.88 -174.885 -174.89 -174.895 -174.9 -174.905 -174.91 -174.915 -174.92 -174.925 -174.93 -174.935 -174.94 -174.945 -174.95 -174.955 -174.96 -174.965 -174.97 -174.975 -174.98 -174.985 -174.99 -174.995 -175 -175.005 -175.01 -175.015 -175.02 -175.025 -175.03 -175.035 -175.04 -175.045 -175.05 -175.055 -175.06 -175.065 -175.07 -175.075 -175.08 -175.085 -175.09 -175.095 -175.1 -175.105 -175.11 -175.115 -175.12 -175.125 -175.13 -175.135 -175.14 -175.145 -175.15 -175.155 -175.16 -175.165 -175.17 -175.175 -175.18 -175.185 -175.19 -175.195 -175.2 -175.205 -175.21 -175.215 -175.22 -175.225 -175.23 -175.235 -175.24 -175.245 -175.25 -175.255 -175.26 -175.265 -175.27 -175.275 -175.28 -175.285 -175.29 -175.295 -175.3 -175.305 -175.31 -175.315 -175.32 -175.325 -175.33 -175.335 -175.34 -175.345 -175.35 -175.355 -175.36 -175.365 -175.37 -175.375 -175.38 -175.385 -175.39 -175.395 -175.4 -175.405 -175.41 -175.415 -175.42 -175.425 -175.43 -175.435 -175.44 -175.445 -175.45 -175.455 -175.46 -175.465 -175.47 -175.475 -175.48 -175.485 -175.49 -175.495 -175.5 -175.505 -175.51 -175.515 -175.52 -175.525 -175.53 -175.535 -175.54 -175.545 -175.55 -175.555 -175.56 -175.565 -175.57 -175.575 -175.58 -175.585 -175.59 -175.595 -175.6 -175.605 -175.61 -175.615 -175.62 -175.625 -175.63 -175.635 -175.64 -175.645 -175.65 -175.655 -175.66 -175.665 -175.67 -175.675 -175.68 -175.685 -175.69 -175.695 -175.7 -175.705 -175.71 -175.715 -175.72 -175.725 -175.73 -175.735 -175.74 -175.745 -175.75 -175.755 -175.76 -175.765 -175.77 -175.775 -175.78 -175.785 -175.79 -175.795 -175.8 -175.805 -175.81 -175.815 -175.82 -175.825 -175.83 -175.835 -175.84 -175.845 -175.85 -175.855 -175.86 -175.865 -175.87 -175.875 -175.88 -175.885 -175.89 -175.895 -175.9 -175.905 -175.91 -175.915 -175.92 -175.925 -175.93 -175.935 -175.94 -175.945 -175.95 -175.955 -175.96 -175.965 -175.97 -175.975 -175.98 -175.985 -175.99 -175.995 -176 -176.005 -176.01 -176.015 -176.02 -176.025 -176.03 -176.035 -176.04 -176.045 -176.05 -176.055 -176.06 -176.065 -176.07 -176.075 -176.08 -176.085 -176.09 -176.095 -176.1 -176.105 -176.11 -176.115 -176.12 -176.125 -176.13 -176.135 -176.14 -176.145 -176.15 -176.155 -176.16 -176.165 -176.17 -176.175 -176.18 -176.185 -176.19 -176.195 -176.2 -176.205 -176.21 -176.215 -176.22 -176.225 -176.23 -176.235 -176.24 -176.245 -176.25 -176.255 -176.26 -176.265 -176.27 -176.275 -176.28 -176.285 -176.29 -176.295 -176.3 -176.305 -176.31 -176.315 -176.32 -176.325 -176.33 -176.335 -176.34 -176.345 -176.35 -176.355 -176.36 -176.365 -176.37 -176.375 -176.38 -176.385 -176.39 -176.395 -176.4 -176.405 -176.41 -176.415 -176.42 -176.425 -176.43 -176.435 -176.44 -176.445 -176.45 -176.455 -176.46 -176.465 -176.47 -176.475 -176.48 -176.485 -176.49 -176.495 -176.5 -176.505 -176.51 -176.515 -176.52 -176.525 -176.53 -176.535 -176.54 -176.545 -176.55 -176.555 -176.56 -176.565 -176.57 -176.575 -176.58 -176.585 -176.59 -176.595 -176.6 -176.605 -176.61 -176.615 -176.62 -176.625 -176.63 -176.635 -176.64 -176.645 -176.65 -176.655 -176.66 -176.665 -176.67 -176.675 -176.68 -176.685 -176.69 -176.695 -176.7 -176.705 -176.71 -176.715 -176.72 -176.725 -176.73 -176.735 -176.74 -176.745 -176.75 -176.755 -176.76 -176.765 -176.77 -176.775 -176.78 -176.785 -176.79 -176.795 -176.8 -176.805 -176.81 -176.815 -176.82 -176.825 -176.83 -176.835 -176.84 -176.845 -176.85 -176.855 -176.86 -176.865 -176.87 -176.875 -176.88 -176.885 -176.89 -176.895 -176.9 -176.905 -176.91 -176.915 -176.92 -176.925 -176.93 -176.935 -176.94 -176.945 -176.95 -176.955 -176.96 -176.965 -176.97 -176.975 -176.98 -176.985 -176.99 -176.995 -177 -177.005 -177.01 -177.015 -177.02 -177.025 -177.03 -177.035 -177.04 -177.045 -177.05 -177.055 -177.06 -177.065 -177.07 -177.075 -177.08 -177.085 -177.09 -177.095 -177.1 -177.105 -177.11 -177.115 -177.12 -177.125 -177.13 -177.135 -177.14 -177.145 -177.15 -177.155 -177.16 -177.165 -177.17 -177.175 -177.18 -177.185 -177.19 -177.195 -177.2 -177.205 -177.21 -177.215 -177.22 -177.225 -177.23 -177.235 -177.24 -177.245 -177.25 -177.255 -177.26 -177.265 -177.27 -177.275 -177.28 -177.285 -177.29 -177.295 -177.3 -177.305 -177.31 -177.315 -177.32 -177.325 -177.33 -177.335 -177.34 -177.345 -177.35 -177.355 -177.36 -177.365 -177.37 -177.375 -177.38 -177.385 -177.39 -177.395 -177.4 -177.405 -177.41 -177.415 -177.42 -177.425 -177.43 -177.435 -177.44 -177.445 -177.45 -177.455 -177.46 -177.465 -177.47 -177.475 -177.48 -177.485 -177.49 -177.495 -177.5 -177.505 -177.51 -177.515 -177.52 -177.525 -177.53 -177.535 -177.54 -177.545 -177.55 -177.555 -177.56 -177.565 -177.57 -177.575 -177.58 -177.585 -177.59 -177.595 -177.6 -177.605 -177.61 -177.615 -177.62 -177.625 -177.63 -177.635 -177.64 -177.645 -177.65 -177.655 -177.66 -177.665 -177.67 -177.675 -177.68 -177.685 -177.69 -177.695 -177.7 -177.705 -177.71 -177.715 -177.72 -177.725 -177.73 -177.735 -177.74 -177.745 -177.75 -177.755 -177.76 -177.765 -177.77 -177.775 -177.78 -177.785 -177.79 -177.795 -177.8 -177.805 -177.81 -177.815 -177.82 -177.825 -177.83 -177.835 -177.84 -177.845 -177.85 -177.855 -177.86 -177.865 -177.87 -177.875 -177.88 -177.885 -177.89 -177.895 -177.9 -177.905 -177.91 -177.915 -177.92 -177.925 -177.93 -177.935 -177.94 -177.945 -177.95 -177.955 -177.96 -177.965 -177.97 -177.975 -177.98 -177.985 -177.99 -177.995 -178 -178.005 -178.01 -178.015 -178.02 -178.025 -178.03 -178.035 -178.04 -178.045 -178.05 -178.055 -178.06 -178.065 -178.07 -178.075 -178.08 -178.085 -178.09 -178.095 -178.1 -178.105 -178.11 -178.115 -178.12 -178.125 -178.13 -178.135 -178.14 -178.145 -178.15 -178.155 -178.16 -178.165 -178.17 -178.175 -178.18 -178.185 -178.19 -178.195 -178.2 -178.205 -178.21 -178.215 -178.22 -178.225 -178.23 -178.235 -178.24 -178.245 -178.25 -178.255 -178.26 -178.265 -178.27 -178.275 -178.28 -178.285 -178.29 -178.295 -178.3 -178.305 -178.31 -178.315 -178.32 -178.325 -178.33 -178.335 -178.34 -178.345 -178.35 -178.355 -178.36 -178.365 -178.37 -178.375 -178.38 -178.385 -178.39 -178.395 -178.4 -178.405 -178.41 -178.415 -178.42 -178.425 -178.43 -178.435 -178.44 -178.445 -178.45 -178.455 -178.46 -178.465 -178.47 -178.475 -178.48 -178.485 -178.49 -178.495 -178.5 -178.505 -178.51 -178.515 -178.52 -178.525 -178.53 -178.535 -178.54 -178.545 -178.55 -178.555 -178.56 -178.565 -178.57 -178.575 -178.58 -178.585 -178.59 -178.595 -178.6 -178.605 -178.61 -178.615 -178.62 -178.625 -178.63 -178.635 -178.64 -178.645 -178.65 -178.655 -178.66 -178.665 -178.67 -178.675 -178.68 -178.685 -178.69 -178.695 -178.7 -178.705 -178.71 -178.715 -178.72 -178.725 -178.73 -178.735 -178.74 -178.745 -178.75 -178.755 -178.76 -178.765 -178.77 -178.775 -178.78 -178.785 -178.79 -178.795 -178.8 -178.805 -178.81 -178.815 -178.82 -178.825 -178.83 -178.835 -178.84 -178.845 -178.85 -178.855 -178.86 -178.865 -178.87 -178.875 -178.88 -178.885 -178.89 -178.895 -178.9 -178.905 -178.91 -178.915 -178.92 -178.925 -178.93 -178.935 -178.94 -178.945 -178.95 -178.955 -178.96 -178.965 -178.97 -178.975 -178.98 -178.985 -178.99 -178.995 -179 -179.005 -179.01 -179.015 -179.02 -179.025 -179.03 -179.035 -179.04 -179.045 -179.05 -179.055 -179.06 -179.065 -179.07 -179.075 -179.08 -179.085 -179.09 -179.095 -179.1 -179.105 -179.11 -179.115 -179.12 -179.125 -179.13 -179.135 -179.14 -179.145 -179.15 -179.155 -179.16 -179.165 -179.17 -179.175 -179.18 -179.185 -179.19 -179.195 -179.2 -179.205 -179.21 -179.215 -179.22 -179.225 -179.23 -179.235 -179.24 -179.245 -179.25 -179.255 -179.26 -179.265 -179.27 -179.275 -179.28 -179.285 -179.29 -179.295 -179.3 -179.305 -179.31 -179.315 -179.32 -179.325 -179.33 -179.335 -179.34 -179.345 -179.35 -179.355 -179.36 -179.365 -179.37 -179.375 -179.38 -179.385 -179.39 -179.395 -179.4 -179.405 -179.41 -179.415 -179.42 -179.425 -179.43 -179.435 -179.44 -179.445 -179.45 -179.455 -179.46 -179.465 -179.47 -179.475 -179.48 -179.485 -179.49 -179.495 -179.5 -179.505 -179.51 -179.515 -179.52 -179.525 -179.53 -179.535 -179.54 -179.545 -179.55 -179.555 -179.56 -179.565 -179.57 -179.575 -179.58 -179.585 -179.59 -179.595 -179.6 -179.605 -179.61 -179.615 -179.62 -179.625 -179.63 -179.635 -179.64 -179.645 -179.65 -179.655 -179.66 -179.665 -179.67 -179.675 -179.68 -179.685 -179.69 -179.695 -179.7 -179.705 -179.71 -179.715 -179.72 -179.725 -179.73 -179.735 -179.74 -179.745 -179.75 -179.755 -179.76 -179.765 -179.77 -179.775 -179.78 -179.785 -179.79 -179.795 -179.8 -179.805 -179.81 -179.815 -179.82 -179.825 -179.83 -179.835 -179.84 -179.845 -179.85 -179.855 -179.86 -179.865 -179.87 -179.875 -179.88 -179.885 -179.89 -179.895 -179.9 -179.905 -179.91 -179.915 -179.92 -179.925 -179.93 -179.935 -179.94 -179.945 -179.95 -179.955 -179.96 -179.965 -179.97 -179.975 -179.98 -179.985 -179.99 -179.995 -180 -180.005 -180.01 -180.015 -180.02 -180.025 -180.03 -180.035 -180.04 -180.045 -180.05 -180.055 -180.06 -180.065 -180.07 -180.075 -180.08 -180.085 -180.09 -180.095 -180.1 -180.105 -180.11 -180.115 -180.12 -180.125 -180.13 -180.135 -180.14 -180.145 -180.15 -180.155 -180.16 -180.165 -180.17 -180.175 -180.18 -180.185 -180.19 -180.195 -180.2 -180.205 -180.21 -180.215 -180.22 -180.225 -180.23 -180.235 -180.24 -180.245 -180.25 -180.255 -180.26 -180.265 -180.27 -180.275 -180.28 -180.285 -180.29 -180.295 -180.3 -180.305 -180.31 -180.315 -180.32 -180.325 -180.33 -180.335 -180.34 -180.345 -180.35 -180.355 -180.36 -180.365 -180.37 -180.375 -180.38 -180.385 -180.39 -180.395 -180.4 -180.405 -180.41 -180.415 -180.42 -180.425 -180.43 -180.435 -180.44 -180.445 -180.45 -180.455 -180.46 -180.465 -180.47 -180.475 -180.48 -180.485 -180.49 -180.495 -180.5 -180.505 -180.51 -180.515 -180.52 -180.525 -180.53 -180.535 -180.54 -180.545 -180.55 -180.555 -180.56 -180.565 -180.57 -180.575 -180.58 -180.585 -180.59 -180.595 -180.6 -180.605 -180.61 -180.615 -180.62 -180.625 -180.63 -180.635 -180.64 -180.645 -180.65 -180.655 -180.66 -180.665 -180.67 -180.675 -180.68 -180.685 -180.69 -180.695 -180.7 -180.705 -180.71 -180.715 -180.72 -180.725 -180.73 -180.735 -180.74 -180.745 -180.75 -180.755 -180.76 -180.765 -180.77 -180.775 -180.78 -180.785 -180.79 -180.795 -180.8 -180.805 -180.81 -180.815 -180.82 -180.825 -180.83 -180.835 -180.84 -180.845 -180.85 -180.855 -180.86 -180.865 -180.87 -180.875 -180.88 -180.885 -180.89 -180.895 -180.9 -180.905 -180.91 -180.915 -180.92 -180.925 -180.93 -180.935 -180.94 -180.945 -180.95 -180.955 -180.96 -180.965 -180.97 -180.975 -180.98 -180.985 -180.99 -180.995 -181 -181.005 -181.01 -181.015 -181.02 -181.025 -181.03 -181.035 -181.04 -181.045 -181.05 -181.055 -181.06 -181.065 -181.07 -181.075 -181.08 -181.085 -181.09 -181.095 -181.1 -181.105 -181.11 -181.115 -181.12 -181.125 -181.13 -181.135 -181.14 -181.145 -181.15 -181.155 -181.16 -181.165 -181.17 -181.175 -181.18 -181.185 -181.19 -181.195 -181.2 -181.205 -181.21 -181.215 -181.22 -181.225 -181.23 -181.235 -181.24 -181.245 -181.25 -181.255 -181.26 -181.265 -181.27 -181.275 -181.28 -181.285 -181.29 -181.295 -181.3 -181.305 -181.31 -181.315 -181.32 -181.325 -181.33 -181.335 -181.34 -181.345 -181.35 -181.355 -181.36 -181.365 -181.37 -181.375 -181.38 -181.385 -181.39 -181.395 -181.4 -181.405 -181.41 -181.415 -181.42 -181.425 -181.43 -181.435 -181.44 -181.445 -181.45 -181.455 -181.46 -181.465 -181.47 -181.475 -181.48 -181.485 -181.49 -181.495 -181.5 -181.505 -181.51 -181.515 -181.52 -181.525 -181.53 -181.535 -181.54 -181.545 -181.55 -181.555 -181.56 -181.565 -181.57 -181.575 -181.58 -181.585 -181.59 -181.595 -181.6 -181.605 -181.61 -181.615 -181.62 -181.625 -181.63 -181.635 -181.64 -181.645 -181.65 -181.655 -181.66 -181.665 -181.67 -181.675 -181.68 -181.685 -181.69 -181.695 -181.7 -181.705 -181.71 -181.715 -181.72 -181.725 -181.73 -181.735 -181.74 -181.745 -181.75 -181.755 -181.76 -181.765 -181.77 -181.775 -181.78 -181.785 -181.79 -181.795 -181.8 -181.805 -181.81 -181.815 -181.82 -181.825 -181.83 -181.835 -181.84 -181.845 -181.85 -181.855 -181.86 -181.865 -181.87 -181.875 -181.88 -181.885 -181.89 -181.895 -181.9 -181.905 -181.91 -181.915 -181.92 -181.925 -181.93 -181.935 -181.94 -181.945 -181.95 -181.955 -181.96 -181.965 -181.97 -181.975 -181.98 -181.985 -181.99 -181.995 -182 -182.005 -182.01 -182.015 -182.02 -182.025 -182.03 -182.035 -182.04 -182.045 -182.05 -182.055 -182.06 -182.065 -182.07 -182.075 -182.08 -182.085 -182.09 -182.095 -182.1 -182.105 -182.11 -182.115 -182.12 -182.125 -182.13 -182.135 -182.14 -182.145 -182.15 -182.155 -182.16 -182.165 -182.17 -182.175 -182.18 -182.185 -182.19 -182.195 -182.2 -182.205 -182.21 -182.215 -182.22 -182.225 -182.23 -182.235 -182.24 -182.245 -182.25 -182.255 -182.26 -182.265 -182.27 -182.275 -182.28 -182.285 -182.29 -182.295 -182.3 -182.305 -182.31 -182.315 -182.32 -182.325 -182.33 -182.335 -182.34 -182.345 -182.35 -182.355 -182.36 -182.365 -182.37 -182.375 -182.38 -182.385 -182.39 -182.395 -182.4 -182.405 -182.41 -182.415 -182.42 -182.425 -182.43 -182.435 -182.44 -182.445 -182.45 -182.455 -182.46 -182.465 -182.47 -182.475 -182.48 -182.485 -182.49 -182.495 -182.5 -182.505 -182.51 -182.515 -182.52 -182.525 -182.53 -182.535 -182.54 -182.545 -182.55 -182.555 -182.56 -182.565 -182.57 -182.575 -182.58 -182.585 -182.59 -182.595 -182.6 -182.605 -182.61 -182.615 -182.62 -182.625 -182.63 -182.635 -182.64 -182.645 -182.65 -182.655 -182.66 -182.665 -182.67 -182.675 -182.68 -182.685 -182.69 -182.695 -182.7 -182.705 -182.71 -182.715 -182.72 -182.725 -182.73 -182.735 -182.74 -182.745 -182.75 -182.755 -182.76 -182.765 -182.77 -182.775 -182.78 -182.785 -182.79 -182.795 -182.8 -182.805 -182.81 -182.815 -182.82 -182.825 -182.83 -182.835 -182.84 -182.845 -182.85 -182.855 -182.86 -182.865 -182.87 -182.875 -182.88 -182.885 -182.89 -182.895 -182.9 -182.905 -182.91 -182.915 -182.92 -182.925 -182.93 -182.935 -182.94 -182.945 -182.95 -182.955 -182.96 -182.965 -182.97 -182.975 -182.98 -182.985 -182.99 -182.995 -183 -183.005 -183.01 -183.015 -183.02 -183.025 -183.03 -183.035 -183.04 -183.045 -183.05 -183.055 -183.06 -183.065 -183.07 -183.075 -183.08 -183.085 -183.09 -183.095 -183.1 -183.105 -183.11 -183.115 -183.12 -183.125 -183.13 -183.135 -183.14 -183.145 -183.15 -183.155 -183.16 -183.165 -183.17 -183.175 -183.18 -183.185 -183.19 -183.195 -183.2 -183.205 -183.21 -183.215 -183.22 -183.225 -183.23 -183.235 -183.24 -183.245 -183.25 -183.255 -183.26 -183.265 -183.27 -183.275 -183.28 -183.285 -183.29 -183.295 -183.3 -183.305 -183.31 -183.315 -183.32 -183.325 -183.33 -183.335 -183.34 -183.345 -183.35 -183.355 -183.36 -183.365 -183.37 -183.375 -183.38 -183.385 -183.39 -183.395 -183.4 -183.405 -183.41 -183.415 -183.42 -183.425 -183.43 -183.435 -183.44 -183.445 -183.45 -183.455 -183.46 -183.465 -183.47 -183.475 -183.48 -183.485 -183.49 -183.495 -183.5 -183.505 -183.51 -183.515 -183.52 -183.525 -183.53 -183.535 -183.54 -183.545 -183.55 -183.555 -183.56 -183.565 -183.57 -183.575 -183.58 -183.585 -183.59 -183.595 -183.6 -183.605 -183.61 -183.615 -183.62 -183.625 -183.63 -183.635 -183.64 -183.645 -183.65 -183.655 -183.66 -183.665 -183.67 -183.675 -183.68 -183.685 -183.69 -183.695 -183.7 -183.705 -183.71 -183.715 -183.72 -183.725 -183.73 -183.735 -183.74 -183.745 -183.75 -183.755 -183.76 -183.765 -183.77 -183.775 -183.78 -183.785 -183.79 -183.795 -183.8 -183.805 -183.81 -183.815 -183.82 -183.825 -183.83 -183.835 -183.84 -183.845 -183.85 -183.855 -183.86 -183.865 -183.87 -183.875 -183.88 -183.885 -183.89 -183.895 -183.9 -183.905 -183.91 -183.915 -183.92 -183.925 -183.93 -183.935 -183.94 -183.945 -183.95 -183.955 -183.96 -183.965 -183.97 -183.975 -183.98 -183.985 -183.99 -183.995 -184 -184.005 -184.01 -184.015 -184.02 -184.025 -184.03 -184.035 -184.04 -184.045 -184.05 -184.055 -184.06 -184.065 -184.07 -184.075 -184.08 -184.085 -184.09 -184.095 -184.1 -184.105 -184.11 -184.115 -184.12 -184.125 -184.13 -184.135 -184.14 -184.145 -184.15 -184.155 -184.16 -184.165 -184.17 -184.175 -184.18 -184.185 -184.19 -184.195 -184.2 -184.205 -184.21 -184.215 -184.22 -184.225 -184.23 -184.235 -184.24 -184.245 -184.25 -184.255 -184.26 -184.265 -184.27 -184.275 -184.28 -184.285 -184.29 -184.295 -184.3 -184.305 -184.31 -184.315 -184.32 -184.325 -184.33 -184.335 -184.34 -184.345 -184.35 -184.355 -184.36 -184.365 -184.37 -184.375 -184.38 -184.385 -184.39 -184.395 -184.4 -184.405 -184.41 -184.415 -184.42 -184.425 -184.43 -184.435 -184.44 -184.445 -184.45 -184.455 -184.46 -184.465 -184.47 -184.475 -184.48 -184.485 -184.49 -184.495 -184.5 -184.505 -184.51 -184.515 -184.52 -184.525 -184.53 -184.535 -184.54 -184.545 -184.55 -184.555 -184.56 -184.565 -184.57 -184.575 -184.58 -184.585 -184.59 -184.595 -184.6 -184.605 -184.61 -184.615 -184.62 -184.625 -184.63 -184.635 -184.64 -184.645 -184.65 -184.655 -184.66 -184.665 -184.67 -184.675 -184.68 -184.685 -184.69 -184.695 -184.7 -184.705 -184.71 -184.715 -184.72 -184.725 -184.73 -184.735 -184.74 -184.745 -184.75 -184.755 -184.76 -184.765 -184.77 -184.775 -184.78 -184.785 -184.79 -184.795 -184.8 -184.805 -184.81 -184.815 -184.82 -184.825 -184.83 -184.835 -184.84 -184.845 -184.85 -184.855 -184.86 -184.865 -184.87 -184.875 -184.88 -184.885 -184.89 -184.895 -184.9 -184.905 -184.91 -184.915 -184.92 -184.925 -184.93 -184.935 -184.94 -184.945 -184.95 -184.955 -184.96 -184.965 -184.97 -184.975 -184.98 -184.985 -184.99 -184.995 -185 -185.005 -185.01 -185.015 -185.02 -185.025 -185.03 -185.035 -185.04 -185.045 -185.05 -185.055 -185.06 -185.065 -185.07 -185.075 -185.08 -185.085 -185.09 -185.095 -185.1 -185.105 -185.11 -185.115 -185.12 -185.125 -185.13 -185.135 -185.14 -185.145 -185.15 -185.155 -185.16 -185.165 -185.17 -185.175 -185.18 -185.185 -185.19 -185.195 -185.2 -185.205 -185.21 -185.215 -185.22 -185.225 -185.23 -185.235 -185.24 -185.245 -185.25 -185.255 -185.26 -185.265 -185.27 -185.275 -185.28 -185.285 -185.29 -185.295 -185.3 -185.305 -185.31 -185.315 -185.32 -185.325 -185.33 -185.335 -185.34 -185.345 -185.35 -185.355 -185.36 -185.365 -185.37 -185.375 -185.38 -185.385 -185.39 -185.395 -185.4 -185.405 -185.41 -185.415 -185.42 -185.425 -185.43 -185.435 -185.44 -185.445 -185.45 -185.455 -185.46 -185.465 -185.47 -185.475 -185.48 -185.485 -185.49 -185.495 -185.5 -185.505 -185.51 -185.515 -185.52 -185.525 -185.53 -185.535 -185.54 -185.545 -185.55 -185.555 -185.56 -185.565 -185.57 -185.575 -185.58 -185.585 -185.59 -185.595 -185.6 -185.605 -185.61 -185.615 -185.62 -185.625 -185.63 -185.635 -185.64 -185.645 -185.65 -185.655 -185.66 -185.665 -185.67 -185.675 -185.68 -185.685 -185.69 -185.695 -185.7 -185.705 -185.71 -185.715 -185.72 -185.725 -185.73 -185.735 -185.74 -185.745 -185.75 -185.755 -185.76 -185.765 -185.77 -185.775 -185.78 -185.785 -185.79 -185.795 -185.8 -185.805 -185.81 -185.815 -185.82 -185.825 -185.83 -185.835 -185.84 -185.845 -185.85 -185.855 -185.86 -185.865 -185.87 -185.875 -185.88 -185.885 -185.89 -185.895 -185.9 -185.905 -185.91 -185.915 -185.92 -185.925 -185.93 -185.935 -185.94 -185.945 -185.95 -185.955 -185.96 -185.965 -185.97 -185.975 -185.98 -185.985 -185.99 -185.995 -186 -186.005 -186.01 -186.015 -186.02 -186.025 -186.03 -186.035 -186.04 -186.045 -186.05 -186.055 -186.06 -186.065 -186.07 -186.075 -186.08 -186.085 -186.09 -186.095 -186.1 -186.105 -186.11 -186.115 -186.12 -186.125 -186.13 -186.135 -186.14 -186.145 -186.15 -186.155 -186.16 -186.165 -186.17 -186.175 -186.18 -186.185 -186.19 -186.195 -186.2 -186.205 -186.21 -186.215 -186.22 -186.225 -186.23 -186.235 -186.24 -186.245 -186.25 -186.255 -186.26 -186.265 -186.27 -186.275 -186.28 -186.285 -186.29 -186.295 -186.3 -186.305 -186.31 -186.315 -186.32 -186.325 -186.33 -186.335 -186.34 -186.345 -186.35 -186.355 -186.36 -186.365 -186.37 -186.375 -186.38 -186.385 -186.39 -186.395 -186.4 -186.405 -186.41 -186.415 -186.42 -186.425 -186.43 -186.435 -186.44 -186.445 -186.45 -186.455 -186.46 -186.465 -186.47 -186.475 -186.48 -186.485 -186.49 -186.495 -186.5 -186.505 -186.51 -186.515 -186.52 -186.525 -186.53 -186.535 -186.54 -186.545 -186.55 -186.555 -186.56 -186.565 -186.57 -186.575 -186.58 -186.585 -186.59 -186.595 -186.6 -186.605 -186.61 -186.615 -186.62 -186.625 -186.63 -186.635 -186.64 -186.645 -186.65 -186.655 -186.66 -186.665 -186.67 -186.675 -186.68 -186.685 -186.69 -186.695 -186.7 -186.705 -186.71 -186.715 -186.72 -186.725 -186.73 -186.735 -186.74 -186.745 -186.75 -186.755 -186.76 -186.765 -186.77 -186.775 -186.78 -186.785 -186.79 -186.795 -186.8 -186.805 -186.81 -186.815 -186.82 -186.825 -186.83 -186.835 -186.84 -186.845 -186.85 -186.855 -186.86 -186.865 -186.87 -186.875 -186.88 -186.885 -186.89 -186.895 -186.9 -186.905 -186.91 -186.915 -186.92 -186.925 -186.93 -186.935 -186.94 -186.945 -186.95 -186.955 -186.96 -186.965 -186.97 -186.975 -186.98 -186.985 -186.99 -186.995 -187 -187.005 -187.01 -187.015 -187.02 -187.025 -187.03 -187.035 -187.04 -187.045 -187.05 -187.055 -187.06 -187.065 -187.07 -187.075 -187.08 -187.085 -187.09 -187.095 -187.1 -187.105 -187.11 -187.115 -187.12 -187.125 -187.13 -187.135 -187.14 -187.145 -187.15 -187.155 -187.16 -187.165 -187.17 -187.175 -187.18 -187.185 -187.19 -187.195 -187.2 -187.205 -187.21 -187.215 -187.22 -187.225 -187.23 -187.235 -187.24 -187.245 -187.25 -187.255 -187.26 -187.265 -187.27 -187.275 -187.28 -187.285 -187.29 -187.295 -187.3 -187.305 -187.31 -187.315 -187.32 -187.325 -187.33 -187.335 -187.34 -187.345 -187.35 -187.355 -187.36 -187.365 -187.37 -187.375 -187.38 -187.385 -187.39 -187.395 -187.4 -187.405 -187.41 -187.415 -187.42 -187.425 -187.43 -187.435 -187.44 -187.445 -187.45 -187.455 -187.46 -187.465 -187.47 -187.475 -187.48 -187.485 -187.49 -187.495 -187.5 -187.505 -187.51 -187.515 -187.52 -187.525 -187.53 -187.535 -187.54 -187.545 -187.55 -187.555 -187.56 -187.565 -187.57 -187.575 -187.58 -187.585 -187.59 -187.595 -187.6 -187.605 -187.61 -187.615 -187.62 -187.625 -187.63 -187.635 -187.64 -187.645 -187.65 -187.655 -187.66 -187.665 -187.67 -187.675 -187.68 -187.685 -187.69 -187.695 -187.7 -187.705 -187.71 -187.715 -187.72 -187.725 -187.73 -187.735 -187.74 -187.745 -187.75 -187.755 -187.76 -187.765 -187.77 -187.775 -187.78 -187.785 -187.79 -187.795 -187.8 -187.805 -187.81 -187.815 -187.82 -187.825 -187.83 -187.835 -187.84 -187.845 -187.85 -187.855 -187.86 -187.865 -187.87 -187.875 -187.88 -187.885 -187.89 -187.895 -187.9 -187.905 -187.91 -187.915 -187.92 -187.925 -187.93 -187.935 -187.94 -187.945 -187.95 -187.955 -187.96 -187.965 -187.97 -187.975 -187.98 -187.985 -187.99 -187.995 -188 -188.005 -188.01 -188.015 -188.02 -188.025 -188.03 -188.035 -188.04 -188.045 -188.05 -188.055 -188.06 -188.065 -188.07 -188.075 -188.08 -188.085 -188.09 -188.095 -188.1 -188.105 -188.11 -188.115 -188.12 -188.125 -188.13 -188.135 -188.14 -188.145 -188.15 -188.155 -188.16 -188.165 -188.17 -188.175 -188.18 -188.185 -188.19 -188.195 -188.2 -188.205 -188.21 -188.215 -188.22 -188.225 -188.23 -188.235 -188.24 -188.245 -188.25 -188.255 -188.26 -188.265 -188.27 -188.275 -188.28 -188.285 -188.29 -188.295 -188.3 -188.305 -188.31 -188.315 -188.32 -188.325 -188.33 -188.335 -188.34 -188.345 -188.35 -188.355 -188.36 -188.365 -188.37 -188.375 -188.38 -188.385 -188.39 -188.395 -188.4 -188.405 -188.41 -188.415 -188.42 -188.425 -188.43 -188.435 -188.44 -188.445 -188.45 -188.455 -188.46 -188.465 -188.47 -188.475 -188.48 -188.485 -188.49 -188.495 -188.5 -188.505 -188.51 -188.515 -188.52 -188.525 -188.53 -188.535 -188.54 -188.545 -188.55 -188.555 -188.56 -188.565 -188.57 -188.575 -188.58 -188.585 -188.59 -188.595 -188.6 -188.605 -188.61 -188.615 -188.62 -188.625 -188.63 -188.635 -188.64 -188.645 -188.65 -188.655 -188.66 -188.665 -188.67 -188.675 -188.68 -188.685 -188.69 -188.695 -188.7 -188.705 -188.71 -188.715 -188.72 -188.725 -188.73 -188.735 -188.74 -188.745 -188.75 -188.755 -188.76 -188.765 -188.77 -188.775 -188.78 -188.785 -188.79 -188.795 -188.8 -188.805 -188.81 -188.815 -188.82 -188.825 -188.83 -188.835 -188.84 -188.845 -188.85 -188.855 -188.86 -188.865 -188.87 -188.875 -188.88 -188.885 -188.89 -188.895 -188.9 -188.905 -188.91 -188.915 -188.92 -188.925 -188.93 -188.935 -188.94 -188.945 -188.95 -188.955 -188.96 -188.965 -188.97 -188.975 -188.98 -188.985 -188.99 -188.995 -189 -189.005 -189.01 -189.015 -189.02 -189.025 -189.03 -189.035 -189.04 -189.045 -189.05 -189.055 -189.06 -189.065 -189.07 -189.075 -189.08 -189.085 -189.09 -189.095 -189.1 -189.105 -189.11 -189.115 -189.12 -189.125 -189.13 -189.135 -189.14 -189.145 -189.15 -189.155 -189.16 -189.165 -189.17 -189.175 -189.18 -189.185 -189.19 -189.195 -189.2 -189.205 -189.21 -189.215 -189.22 -189.225 -189.23 -189.235 -189.24 -189.245 -189.25 -189.255 -189.26 -189.265 -189.27 -189.275 -189.28 -189.285 -189.29 -189.295 -189.3 -189.305 -189.31 -189.315 -189.32 -189.325 -189.33 -189.335 -189.34 -189.345 -189.35 -189.355 -189.36 -189.365 -189.37 -189.375 -189.38 -189.385 -189.39 -189.395 -189.4 -189.405 -189.41 -189.415 -189.42 -189.425 -189.43 -189.435 -189.44 -189.445 -189.45 -189.455 -189.46 -189.465 -189.47 -189.475 -189.48 -189.485 -189.49 -189.495 -189.5 -189.505 -189.51 -189.515 -189.52 -189.525 -189.53 -189.535 -189.54 -189.545 -189.55 -189.555 -189.56 -189.565 -189.57 -189.575 -189.58 -189.585 -189.59 -189.595 -189.6 -189.605 -189.61 -189.615 -189.62 -189.625 -189.63 -189.635 -189.64 -189.645 -189.65 -189.655 -189.66 -189.665 -189.67 -189.675 -189.68 -189.685 -189.69 -189.695 -189.7 -189.705 -189.71 -189.715 -189.72 -189.725 -189.73 -189.735 -189.74 -189.745 -189.75 -189.755 -189.76 -189.765 -189.77 -189.775 -189.78 -189.785 -189.79 -189.795 -189.8 -189.805 -189.81 -189.815 -189.82 -189.825 -189.83 -189.835 -189.84 -189.845 -189.85 -189.855 -189.86 -189.865 -189.87 -189.875 -189.88 -189.885 -189.89 -189.895 -189.9 -189.905 -189.91 -189.915 -189.92 -189.925 -189.93 -189.935 -189.94 -189.945 -189.95 -189.955 -189.96 -189.965 -189.97 -189.975 -189.98 -189.985 -189.99 -189.995 -190 -190.005 -190.01 -190.015 -190.02 -190.025 -190.03 -190.035 -190.04 -190.045 -190.05 -190.055 -190.06 -190.065 -190.07 -190.075 -190.08 -190.085 -190.09 -190.095 -190.1 -190.105 -190.11 -190.115 -190.12 -190.125 -190.13 -190.135 -190.14 -190.145 -190.15 -190.155 -190.16 -190.165 -190.17 -190.175 -190.18 -190.185 -190.19 -190.195 -190.2 -190.205 -190.21 -190.215 -190.22 -190.225 -190.23 -190.235 -190.24 -190.245 -190.25 -190.255 -190.26 -190.265 -190.27 -190.275 -190.28 -190.285 -190.29 -190.295 -190.3 -190.305 -190.31 -190.315 -190.32 -190.325 -190.33 -190.335 -190.34 -190.345 -190.35 -190.355 -190.36 -190.365 -190.37 -190.375 -190.38 -190.385 -190.39 -190.395 -190.4 -190.405 -190.41 -190.415 -190.42 -190.425 -190.43 -190.435 -190.44 -190.445 -190.45 -190.455 -190.46 -190.465 -190.47 -190.475 -190.48 -190.485 -190.49 -190.495 -190.5 -190.505 -190.51 -190.515 -190.52 -190.525 -190.53 -190.535 -190.54 -190.545 -190.55 -190.555 -190.56 -190.565 -190.57 -190.575 -190.58 -190.585 -190.59 -190.595 -190.6 -190.605 -190.61 -190.615 -190.62 -190.625 -190.63 -190.635 -190.64 -190.645 -190.65 -190.655 -190.66 -190.665 -190.67 -190.675 -190.68 -190.685 -190.69 -190.695 -190.7 -190.705 -190.71 -190.715 -190.72 -190.725 -190.73 -190.735 -190.74 -190.745 -190.75 -190.755 -190.76 -190.765 -190.77 -190.775 -190.78 -190.785 -190.79 -190.795 -190.8 -190.805 -190.81 -190.815 -190.82 -190.825 -190.83 -190.835 -190.84 -190.845 -190.85 -190.855 -190.86 -190.865 -190.87 -190.875 -190.88 -190.885 -190.89 -190.895 -190.9 -190.905 -190.91 -190.915 -190.92 -190.925 -190.93 -190.935 -190.94 -190.945 -190.95 -190.955 -190.96 -190.965 -190.97 -190.975 -190.98 -190.985 -190.99 -190.995 -191 -191.005 -191.01 -191.015 -191.02 -191.025 -191.03 -191.035 -191.04 -191.045 -191.05 -191.055 -191.06 -191.065 -191.07 -191.075 -191.08 -191.085 -191.09 -191.095 -191.1 -191.105 -191.11 -191.115 -191.12 -191.125 -191.13 -191.135 -191.14 -191.145 -191.15 -191.155 -191.16 -191.165 -191.17 -191.175 -191.18 -191.185 -191.19 -191.195 -191.2 -191.205 -191.21 -191.215 -191.22 -191.225 -191.23 -191.235 -191.24 -191.245 -191.25 -191.255 -191.26 -191.265 -191.27 -191.275 -191.28 -191.285 -191.29 -191.295 -191.3 -191.305 -191.31 -191.315 -191.32 -191.325 -191.33 -191.335 -191.34 -191.345 -191.35 -191.355 -191.36 -191.365 -191.37 -191.375 -191.38 -191.385 -191.39 -191.395 -191.4 -191.405 -191.41 -191.415 -191.42 -191.425 -191.43 -191.435 -191.44 -191.445 -191.45 -191.455 -191.46 -191.465 -191.47 -191.475 -191.48 -191.485 -191.49 -191.495 -191.5 -191.505 -191.51 -191.515 -191.52 -191.525 -191.53 -191.535 -191.54 -191.545 -191.55 -191.555 -191.56 -191.565 -191.57 -191.575 -191.58 -191.585 -191.59 -191.595 -191.6 -191.605 -191.61 -191.615 -191.62 -191.625 -191.63 -191.635 -191.64 -191.645 -191.65 -191.655 -191.66 -191.665 -191.67 -191.675 -191.68 -191.685 -191.69 -191.695 -191.7 -191.705 -191.71 -191.715 -191.72 -191.725 -191.73 -191.735 -191.74 -191.745 -191.75 -191.755 -191.76 -191.765 -191.77 -191.775 -191.78 -191.785 -191.79 -191.795 -191.8 -191.805 -191.81 -191.815 -191.82 -191.825 -191.83 -191.835 -191.84 -191.845 -191.85 -191.855 -191.86 -191.865 -191.87 -191.875 -191.88 -191.885 -191.89 -191.895 -191.9 -191.905 -191.91 -191.915 -191.92 -191.925 -191.93 -191.935 -191.94 -191.945 -191.95 -191.955 -191.96 -191.965 -191.97 -191.975 -191.98 -191.985 -191.99 -191.995 -192 -192.005 -192.01 -192.015 -192.02 -192.025 -192.03 -192.035 -192.04 -192.045 -192.05 -192.055 -192.06 -192.065 -192.07 -192.075 -192.08 -192.085 -192.09 -192.095 -192.1 -192.105 -192.11 -192.115 -192.12 -192.125 -192.13 -192.135 -192.14 -192.145 -192.15 -192.155 -192.16 -192.165 -192.17 -192.175 -192.18 -192.185 -192.19 -192.195 -192.2 -192.205 -192.21 -192.215 -192.22 -192.225 -192.23 -192.235 -192.24 -192.245 -192.25 -192.255 -192.26 -192.265 -192.27 -192.275 -192.28 -192.285 -192.29 -192.295 -192.3 -192.305 -192.31 -192.315 -192.32 -192.325 -192.33 -192.335 -192.34 -192.345 -192.35 -192.355 -192.36 -192.365 -192.37 -192.375 -192.38 -192.385 -192.39 -192.395 -192.4 -192.405 -192.41 -192.415 -192.42 -192.425 -192.43 -192.435 -192.44 -192.445 -192.45 -192.455 -192.46 -192.465 -192.47 -192.475 -192.48 -192.485 -192.49 -192.495 -192.5 -192.505 -192.51 -192.515 -192.52 -192.525 -192.53 -192.535 -192.54 -192.545 -192.55 -192.555 -192.56 -192.565 -192.57 -192.575 -192.58 -192.585 -192.59 -192.595 -192.6 -192.605 -192.61 -192.615 -192.62 -192.625 -192.63 -192.635 -192.64 -192.645 -192.65 -192.655 -192.66 -192.665 -192.67 -192.675 -192.68 -192.685 -192.69 -192.695 -192.7 -192.705 -192.71 -192.715 -192.72 -192.725 -192.73 -192.735 -192.74 -192.745 -192.75 -192.755 -192.76 -192.765 -192.77 -192.775 -192.78 -192.785 -192.79 -192.795 -192.8 -192.805 -192.81 -192.815 -192.82 -192.825 -192.83 -192.835 -192.84 -192.845 -192.85 -192.855 -192.86 -192.865 -192.87 -192.875 -192.88 -192.885 -192.89 -192.895 -192.9 -192.905 -192.91 -192.915 -192.92 -192.925 -192.93 -192.935 -192.94 -192.945 -192.95 -192.955 -192.96 -192.965 -192.97 -192.975 -192.98 -192.985 -192.99 -192.995 -193 -193.005 -193.01 -193.015 -193.02 -193.025 -193.03 -193.035 -193.04 -193.045 -193.05 -193.055 -193.06 -193.065 -193.07 -193.075 -193.08 -193.085 -193.09 -193.095 -193.1 -193.105 -193.11 -193.115 -193.12 -193.125 -193.13 -193.135 -193.14 -193.145 -193.15 -193.155 -193.16 -193.165 -193.17 -193.175 -193.18 -193.185 -193.19 -193.195 -193.2 -193.205 -193.21 -193.215 -193.22 -193.225 -193.23 -193.235 -193.24 -193.245 -193.25 -193.255 -193.26 -193.265 -193.27 -193.275 -193.28 -193.285 -193.29 -193.295 -193.3 -193.305 -193.31 -193.315 -193.32 -193.325 -193.33 -193.335 -193.34 -193.345 -193.35 -193.355 -193.36 -193.365 -193.37 -193.375 -193.38 -193.385 -193.39 -193.395 -193.4 -193.405 -193.41 -193.415 -193.42 -193.425 -193.43 -193.435 -193.44 -193.445 -193.45 -193.455 -193.46 -193.465 -193.47 -193.475 -193.48 -193.485 -193.49 -193.495 -193.5 -193.505 -193.51 -193.515 -193.52 -193.525 -193.53 -193.535 -193.54 -193.545 -193.55 -193.555 -193.56 -193.565 -193.57 -193.575 -193.58 -193.585 -193.59 -193.595 -193.6 -193.605 -193.61 -193.615 -193.62 -193.625 -193.63 -193.635 -193.64 -193.645 -193.65 -193.655 -193.66 -193.665 -193.67 -193.675 -193.68 -193.685 -193.69 -193.695 -193.7 -193.705 -193.71 -193.715 -193.72 -193.725 -193.73 -193.735 -193.74 -193.745 -193.75 -193.755 -193.76 -193.765 -193.77 -193.775 -193.78 -193.785 -193.79 -193.795 -193.8 -193.805 -193.81 -193.815 -193.82 -193.825 -193.83 -193.835 -193.84 -193.845 -193.85 -193.855 -193.86 -193.865 -193.87 -193.875 -193.88 -193.885 -193.89 -193.895 -193.9 -193.905 -193.91 -193.915 -193.92 -193.925 -193.93 -193.935 -193.94 -193.945 -193.95 -193.955 -193.96 -193.965 -193.97 -193.975 -193.98 -193.985 -193.99 -193.995 -194 -194.005 -194.01 -194.015 -194.02 -194.025 -194.03 -194.035 -194.04 -194.045 -194.05 -194.055 -194.06 -194.065 -194.07 -194.075 -194.08 -194.085 -194.09 -194.095 -194.1 -194.105 -194.11 -194.115 -194.12 -194.125 -194.13 -194.135 -194.14 -194.145 -194.15 -194.155 -194.16 -194.165 -194.17 -194.175 -194.18 -194.185 -194.19 -194.195 -194.2 -194.205 -194.21 -194.215 -194.22 -194.225 -194.23 -194.235 -194.24 -194.245 -194.25 -194.255 -194.26 -194.265 -194.27 -194.275 -194.28 -194.285 -194.29 -194.295 -194.3 -194.305 -194.31 -194.315 -194.32 -194.325 -194.33 -194.335 -194.34 -194.345 -194.35 -194.355 -194.36 -194.365 -194.37 -194.375 -194.38 -194.385 -194.39 -194.395 -194.4 -194.405 -194.41 -194.415 -194.42 -194.425 -194.43 -194.435 -194.44 -194.445 -194.45 -194.455 -194.46 -194.465 -194.47 -194.475 -194.48 -194.485 -194.49 -194.495 -194.5 -194.505 -194.51 -194.515 -194.52 -194.525 -194.53 -194.535 -194.54 -194.545 -194.55 -194.555 -194.56 -194.565 -194.57 -194.575 -194.58 -194.585 -194.59 -194.595 -194.6 -194.605 -194.61 -194.615 -194.62 -194.625 -194.63 -194.635 -194.64 -194.645 -194.65 -194.655 -194.66 -194.665 -194.67 -194.675 -194.68 -194.685 -194.69 -194.695 -194.7 -194.705 -194.71 -194.715 -194.72 -194.725 -194.73 -194.735 -194.74 -194.745 -194.75 -194.755 -194.76 -194.765 -194.77 -194.775 -194.78 -194.785 -194.79 -194.795 -194.8 -194.805 -194.81 -194.815 -194.82 -194.825 -194.83 -194.835 -194.84 -194.845 -194.85 -194.855 -194.86 -194.865 -194.87 -194.875 -194.88 -194.885 -194.89 -194.895 -194.9 -194.905 -194.91 -194.915 -194.92 -194.925 -194.93 -194.935 -194.94 -194.945 -194.95 -194.955 -194.96 -194.965 -194.97 -194.975 -194.98 -194.985 -194.99 -194.995 -195 -195.005 -195.01 -195.015 -195.02 -195.025 -195.03 -195.035 -195.04 -195.045 -195.05 -195.055 -195.06 -195.065 -195.07 -195.075 -195.08 -195.085 -195.09 -195.095 -195.1 -195.105 -195.11 -195.115 -195.12 -195.125 -195.13 -195.135 -195.14 -195.145 -195.15 -195.155 -195.16 -195.165 -195.17 -195.175 -195.18 -195.185 -195.19 -195.195 -195.2 -195.205 -195.21 -195.215 -195.22 -195.225 -195.23 -195.235 -195.24 -195.245 -195.25 -195.255 -195.26 -195.265 -195.27 -195.275 -195.28 -195.285 -195.29 -195.295 -195.3 -195.305 -195.31 -195.315 -195.32 -195.325 -195.33 -195.335 -195.34 -195.345 -195.35 -195.355 -195.36 -195.365 -195.37 -195.375 -195.38 -195.385 -195.39 -195.395 -195.4 -195.405 -195.41 -195.415 -195.42 -195.425 -195.43 -195.435 -195.44 -195.445 -195.45 -195.455 -195.46 -195.465 -195.47 -195.475 -195.48 -195.485 -195.49 -195.495 -195.5 -195.505 -195.51 -195.515 -195.52 -195.525 -195.53 -195.535 -195.54 -195.545 -195.55 -195.555 -195.56 -195.565 -195.57 -195.575 -195.58 -195.585 -195.59 -195.595 -195.6 -195.605 -195.61 -195.615 -195.62 -195.625 -195.63 -195.635 -195.64 -195.645 -195.65 -195.655 -195.66 -195.665 -195.67 -195.675 -195.68 -195.685 -195.69 -195.695 -195.7 -195.705 -195.71 -195.715 -195.72 -195.725 -195.73 -195.735 -195.74 -195.745 -195.75 -195.755 -195.76 -195.765 -195.77 -195.775 -195.78 -195.785 -195.79 -195.795 -195.8 -195.805 -195.81 -195.815 -195.82 -195.825 -195.83 -195.835 -195.84 -195.845 -195.85 -195.855 -195.86 -195.865 -195.87 -195.875 -195.88 -195.885 -195.89 -195.895 -195.9 -195.905 -195.91 -195.915 -195.92 -195.925 -195.93 -195.935 -195.94 -195.945 -195.95 -195.955 -195.96 -195.965 -195.97 -195.975 -195.98 -195.985 -195.99 -195.995 -196 -196.005 -196.01 -196.015 -196.02 -196.025 -196.03 -196.035 -196.04 -196.045 -196.05 -196.055 -196.06 -196.065 -196.07 -196.075 -196.08 -196.085 -196.09 -196.095 -196.1 -196.105 -196.11 -196.115 -196.12 -196.125 -196.13 -196.135 -196.14 -196.145 -196.15 -196.155 -196.16 -196.165 -196.17 -196.175 -196.18 -196.185 -196.19 -196.195 -196.2 -196.205 -196.21 -196.215 -196.22 -196.225 -196.23 -196.235 -196.24 -196.245 -196.25 -196.255 -196.26 -196.265 -196.27 -196.275 -196.28 -196.285 -196.29 -196.295 -196.3 -196.305 -196.31 -196.315 -196.32 -196.325 -196.33 -196.335 -196.34 -196.345 -196.35 -196.355 -196.36 -196.365 -196.37 -196.375 -196.38 -196.385 -196.39 -196.395 -196.4 -196.405 -196.41 -196.415 -196.42 -196.425 -196.43 -196.435 -196.44 -196.445 -196.45 -196.455 -196.46 -196.465 -196.47 -196.475 -196.48 -196.485 -196.49 -196.495 -196.5 -196.505 -196.51 -196.515 -196.52 -196.525 -196.53 -196.535 -196.54 -196.545 -196.55 -196.555 -196.56 -196.565 -196.57 -196.575 -196.58 -196.585 -196.59 -196.595 -196.6 -196.605 -196.61 -196.615 -196.62 -196.625 -196.63 -196.635 -196.64 -196.645 -196.65 -196.655 -196.66 -196.665 -196.67 -196.675 -196.68 -196.685 -196.69 -196.695 -196.7 -196.705 -196.71 -196.715 -196.72 -196.725 -196.73 -196.735 -196.74 -196.745 -196.75 -196.755 -196.76 -196.765 -196.77 -196.775 -196.78 -196.785 -196.79 -196.795 -196.8 -196.805 -196.81 -196.815 -196.82 -196.825 -196.83 -196.835 -196.84 -196.845 -196.85 -196.855 -196.86 -196.865 -196.87 -196.875 -196.88 -196.885 -196.89 -196.895 -196.9 -196.905 -196.91 -196.915 -196.92 -196.925 -196.93 -196.935 -196.94 -196.945 -196.95 -196.955 -196.96 -196.965 -196.97 -196.975 -196.98 -196.985 -196.99 -196.995 -197 -197.005 -197.01 -197.015 -197.02 -197.025 -197.03 -197.035 -197.04 -197.045 -197.05 -197.055 -197.06 -197.065 -197.07 -197.075 -197.08 -197.085 -197.09 -197.095 -197.1 -197.105 -197.11 -197.115 -197.12 -197.125 -197.13 -197.135 -197.14 -197.145 -197.15 -197.155 -197.16 -197.165 -197.17 -197.175 -197.18 -197.185 -197.19 -197.195 -197.2 -197.205 -197.21 -197.215 -197.22 -197.225 -197.23 -197.235 -197.24 -197.245 -197.25 -197.255 -197.26 -197.265 -197.27 -197.275 -197.28 -197.285 -197.29 -197.295 -197.3 -197.305 -197.31 -197.315 -197.32 -197.325 -197.33 -197.335 -197.34 -197.345 -197.35 -197.355 -197.36 -197.365 -197.37 -197.375 -197.38 -197.385 -197.39 -197.395 -197.4 -197.405 -197.41 -197.415 -197.42 -197.425 -197.43 -197.435 -197.44 -197.445 -197.45 -197.455 -197.46 -197.465 -197.47 -197.475 -197.48 -197.485 -197.49 -197.495 -197.5 -197.505 -197.51 -197.515 -197.52 -197.525 -197.53 -197.535 -197.54 -197.545 -197.55 -197.555 -197.56 -197.565 -197.57 -197.575 -197.58 -197.585 -197.59 -197.595 -197.6 -197.605 -197.61 -197.615 -197.62 -197.625 -197.63 -197.635 -197.64 -197.645 -197.65 -197.655 -197.66 -197.665 -197.67 -197.675 -197.68 -197.685 -197.69 -197.695 -197.7 -197.705 -197.71 -197.715 -197.72 -197.725 -197.73 -197.735 -197.74 -197.745 -197.75 -197.755 -197.76 -197.765 -197.77 -197.775 -197.78 -197.785 -197.79 -197.795 -197.8 -197.805 -197.81 -197.815 -197.82 -197.825 -197.83 -197.835 -197.84 -197.845 -197.85 -197.855 -197.86 -197.865 -197.87 -197.875 -197.88 -197.885 -197.89 -197.895 -197.9 -197.905 -197.91 -197.915 -197.92 -197.925 -197.93 -197.935 -197.94 -197.945 -197.95 -197.955 -197.96 -197.965 -197.97 -197.975 -197.98 -197.985 -197.99 -197.995 -198 -198.005 -198.01 -198.015 -198.02 -198.025 -198.03 -198.035 -198.04 -198.045 -198.05 -198.055 -198.06 -198.065 -198.07 -198.075 -198.08 -198.085 -198.09 -198.095 -198.1 -198.105 -198.11 -198.115 -198.12 -198.125 -198.13 -198.135 -198.14 -198.145 -198.15 -198.155 -198.16 -198.165 -198.17 -198.175 -198.18 -198.185 -198.19 -198.195 -198.2 -198.205 -198.21 -198.215 -198.22 -198.225 -198.23 -198.235 -198.24 -198.245 -198.25 -198.255 -198.26 -198.265 -198.27 -198.275 -198.28 -198.285 -198.29 -198.295 -198.3 -198.305 -198.31 -198.315 -198.32 -198.325 -198.33 -198.335 -198.34 -198.345 -198.35 -198.355 -198.36 -198.365 -198.37 -198.375 -198.38 -198.385 -198.39 -198.395 -198.4 -198.405 -198.41 -198.415 -198.42 -198.425 -198.43 -198.435 -198.44 -198.445 -198.45 -198.455 -198.46 -198.465 -198.47 -198.475 -198.48 -198.485 -198.49 -198.495 -198.5 -198.505 -198.51 -198.515 -198.52 -198.525 -198.53 -198.535 -198.54 -198.545 -198.55 -198.555 -198.56 -198.565 -198.57 -198.575 -198.58 -198.585 -198.59 -198.595 -198.6 -198.605 -198.61 -198.615 -198.62 -198.625 -198.63 -198.635 -198.64 -198.645 -198.65 -198.655 -198.66 -198.665 -198.67 -198.675 -198.68 -198.685 -198.69 -198.695 -198.7 -198.705 -198.71 -198.715 -198.72 -198.725 -198.73 -198.735 -198.74 -198.745 -198.75 -198.755 -198.76 -198.765 -198.77 -198.775 -198.78 -198.785 -198.79 -198.795 -198.8 -198.805 -198.81 -198.815 -198.82 -198.825 -198.83 -198.835 -198.84 -198.845 -198.85 -198.855 -198.86 -198.865 -198.87 -198.875 -198.88 -198.885 -198.89 -198.895 -198.9 -198.905 -198.91 -198.915 -198.92 -198.925 -198.93 -198.935 -198.94 -198.945 -198.95 -198.955 -198.96 -198.965 -198.97 -198.975 -198.98 -198.985 -198.99 -198.995 -199 -199.005 -199.01 -199.015 -199.02 -199.025 -199.03 -199.035 -199.04 -199.045 -199.05 -199.055 -199.06 -199.065 -199.07 -199.075 -199.08 -199.085 -199.09 -199.095 -199.1 -199.105 -199.11 -199.115 -199.12 -199.125 -199.13 -199.135 -199.14 -199.145 -199.15 -199.155 -199.16 -199.165 -199.17 -199.175 -199.18 -199.185 -199.19 -199.195 -199.2 -199.205 -199.21 -199.215 -199.22 -199.225 -199.23 -199.235 -199.24 -199.245 -199.25 -199.255 -199.26 -199.265 -199.27 -199.275 -199.28 -199.285 -199.29 -199.295 -199.3 -199.305 -199.31 -199.315 -199.32 -199.325 -199.33 -199.335 -199.34 -199.345 -199.35 -199.355 -199.36 -199.365 -199.37 -199.375 -199.38 -199.385 -199.39 -199.395 -199.4 -199.405 -199.41 -199.415 -199.42 -199.425 -199.43 -199.435 -199.44 -199.445 -199.45 -199.455 -199.46 -199.465 -199.47 -199.475 -199.48 -199.485 -199.49 -199.495 -199.5 -199.505 -199.51 -199.515 -199.52 -199.525 -199.53 -199.535 -199.54 -199.545 -199.55 -199.555 -199.56 -199.565 -199.57 -199.575 -199.58 -199.585 -199.59 -199.595 -199.6 -199.605 -199.61 -199.615 -199.62 -199.625 -199.63 -199.635 -199.64 -199.645 -199.65 -199.655 -199.66 -199.665 -199.67 -199.675 -199.68 -199.685 -199.69 -199.695 -199.7 -199.705 -199.71 -199.715 -199.72 -199.725 -199.73 -199.735 -199.74 -199.745 -199.75 -199.755 -199.76 -199.765 -199.77 -199.775 -199.78 -199.785 -199.79 -199.795 -199.8 -199.805 -199.81 -199.815 -199.82 -199.825 -199.83 -199.835 -199.84 -199.845 -199.85 -199.855 -199.86 -199.865 -199.87 -199.875 -199.88 -199.885 -199.89 -199.895 -199.9 -199.905 -199.91 -199.915 -199.92 -199.925 -199.93 -199.935 -199.94 -199.945 -199.95 -199.955 -199.96 -199.965 -199.97 -199.975 -199.98 -199.985 -199.99 -199.995 -200 -200.005 -200.01 -200.015 -200.02 -200.025 -200.03 -200.035 -200.04 -200.045 -200.05 -200.055 -200.06 -200.065 -200.07 -200.075 -200.08 -200.085 -200.09 -200.095 -200.1 -200.105 -200.11 -200.115 -200.12 -200.125 -200.13 -200.135 -200.14 -200.145 -200.15 -200.155 -200.16 -200.165 -200.17 -200.175 -200.18 -200.185 -200.19 -200.195 -200.2 -200.205 -200.21 -200.215 -200.22 -200.225 -200.23 -200.235 -200.24 -200.245 -200.25 -200.255 -200.26 -200.265 -200.27 -200.275 -200.28 -200.285 -200.29 -200.295 -200.3 -200.305 -200.31 -200.315 -200.32 -200.325 -200.33 -200.335 -200.34 -200.345 -200.35 -200.355 -200.36 -200.365 -200.37 -200.375 -200.38 -200.385 -200.39 -200.395 -200.4 -200.405 -200.41 -200.415 -200.42 -200.425 -200.43 -200.435 -200.44 -200.445 -200.45 -200.455 -200.46 -200.465 -200.47 -200.475 -200.48 -200.485 -200.49 -200.495 -200.5 -200.505 -200.51 -200.515 -200.52 -200.525 -200.53 -200.535 -200.54 -200.545 -200.55 -200.555 -200.56 -200.565 -200.57 -200.575 -200.58 -200.585 -200.59 -200.595 -200.6 -200.605 -200.61 -200.615 -200.62 -200.625 -200.63 -200.635 -200.64 -200.645 -200.65 -200.655 -200.66 -200.665 -200.67 -200.675 -200.68 -200.685 -200.69 -200.695 -200.7 -200.705 -200.71 -200.715 -200.72 -200.725 -200.73 -200.735 -200.74 -200.745 -200.75 -200.755 -200.76 -200.765 -200.77 -200.775 -200.78 -200.785 -200.79 -200.795 -200.8 -200.805 -200.81 -200.815 -200.82 -200.825 -200.83 -200.835 -200.84 -200.845 -200.85 -200.855 -200.86 -200.865 -200.87 -200.875 -200.88 -200.885 -200.89 -200.895 -200.9 -200.905 -200.91 -200.915 -200.92 -200.925 -200.93 -200.935 -200.94 -200.945 -200.95 -200.955 -200.96 -200.965 -200.97 -200.975 -200.98 -200.985 -200.99 -200.995 -201 -201.005 -201.01 -201.015 -201.02 -201.025 -201.03 -201.035 -201.04 -201.045 -201.05 -201.055 -201.06 -201.065 -201.07 -201.075 -201.08 -201.085 -201.09 -201.095 -201.1 -201.105 -201.11 -201.115 -201.12 -201.125 -201.13 -201.135 -201.14 -201.145 -201.15 -201.155 -201.16 -201.165 -201.17 -201.175 -201.18 -201.185 -201.19 -201.195 -201.2 -201.205 -201.21 -201.215 -201.22 -201.225 -201.23 -201.235 -201.24 -201.245 -201.25 -201.255 -201.26 -201.265 -201.27 -201.275 -201.28 -201.285 -201.29 -201.295 -201.3 -201.305 -201.31 -201.315 -201.32 -201.325 -201.33 -201.335 -201.34 -201.345 -201.35 -201.355 -201.36 -201.365 -201.37 -201.375 -201.38 -201.385 -201.39 -201.395 -201.4 -201.405 -201.41 -201.415 -201.42 -201.425 -201.43 -201.435 -201.44 -201.445 -201.45 -201.455 -201.46 -201.465 -201.47 -201.475 -201.48 -201.485 -201.49 -201.495 -201.5 -201.505 -201.51 -201.515 -201.52 -201.525 -201.53 -201.535 -201.54 -201.545 -201.55 -201.555 -201.56 -201.565 -201.57 -201.575 -201.58 -201.585 -201.59 -201.595 -201.6 -201.605 -201.61 -201.615 -201.62 -201.625 -201.63 -201.635 -201.64 -201.645 -201.65 -201.655 -201.66 -201.665 -201.67 -201.675 -201.68 -201.685 -201.69 -201.695 -201.7 -201.705 -201.71 -201.715 -201.72 -201.725 -201.73 -201.735 -201.74 -201.745 -201.75 -201.755 -201.76 -201.765 -201.77 -201.775 -201.78 -201.785 -201.79 -201.795 -201.8 -201.805 -201.81 -201.815 -201.82 -201.825 -201.83 -201.835 -201.84 -201.845 -201.85 -201.855 -201.86 -201.865 -201.87 -201.875 -201.88 -201.885 -201.89 -201.895 -201.9 -201.905 -201.91 -201.915 -201.92 -201.925 -201.93 -201.935 -201.94 -201.945 -201.95 -201.955 -201.96 -201.965 -201.97 -201.975 -201.98 -201.985 -201.99 -201.995 -202 -202.005 -202.01 -202.015 -202.02 -202.025 -202.03 -202.035 -202.04 -202.045 -202.05 -202.055 -202.06 -202.065 -202.07 -202.075 -202.08 -202.085 -202.09 -202.095 -202.1 -202.105 -202.11 -202.115 -202.12 -202.125 -202.13 -202.135 -202.14 -202.145 -202.15 -202.155 -202.16 -202.165 -202.17 -202.175 -202.18 -202.185 -202.19 -202.195 -202.2 -202.205 -202.21 -202.215 -202.22 -202.225 -202.23 -202.235 -202.24 -202.245 -202.25 -202.255 -202.26 -202.265 -202.27 -202.275 -202.28 -202.285 -202.29 -202.295 -202.3 -202.305 -202.31 -202.315 -202.32 -202.325 -202.33 -202.335 -202.34 -202.345 -202.35 -202.355 -202.36 -202.365 -202.37 -202.375 -202.38 -202.385 -202.39 -202.395 -202.4 -202.405 -202.41 -202.415 -202.42 -202.425 -202.43 -202.435 -202.44 -202.445 -202.45 -202.455 -202.46 -202.465 -202.47 -202.475 -202.48 -202.485 -202.49 -202.495 - --75.9281 --75.9125 --75.9203 --75.9203 --75.9375 --75.9203 --75.9172 --75.9141 --75.9187 --75.9141 --75.9156 --75.9172 --75.9078 --75.9062 --75.9172 --75.9125 --75.9172 --75.9141 --75.9 --75.9094 --75.9141 --75.9125 --75.9156 --75.9172 --75.9172 --75.9313 --75.9328 --75.9187 --75.9203 --75.9172 --75.9125 --75.9203 --75.9187 --75.9234 --75.9297 --75.9156 --75.9203 --75.9187 --75.9187 --75.9187 --75.9281 --75.9 --75.9109 --75.9156 --75.9187 --75.9156 --75.9234 --75.9109 --75.9313 --75.9313 --75.9141 --75.9203 --75.9203 --75.9203 --75.9203 --75.9328 --75.9266 --75.9266 --75.9141 --75.9234 --75.9313 --75.9297 --75.9375 --75.9359 --75.9266 --75.9453 --75.9313 --75.9359 --75.9313 --75.925 --75.9203 --75.9344 --75.9391 --75.9391 --75.925 --75.9266 --75.9219 --75.9219 --75.9297 --75.9219 --75.9266 --75.9219 --75.9266 --75.9344 --75.9328 --75.9391 --75.9313 --75.9344 --75.9375 --75.9328 --75.9219 --75.9391 --75.9187 --75.9406 --75.9406 --75.9422 --75.9437 --75.9313 --75.9328 --75.9391 --75.9391 --75.9437 --75.9328 --75.9344 --75.9453 --75.925 --75.9344 --75.9422 --75.9359 --75.9328 --75.9391 --75.9359 --75.9328 --75.9453 --75.9344 --75.9328 --75.9344 --75.9469 --75.9344 --75.9406 --75.9203 --75.9391 --75.9359 --75.9219 --75.9391 --75.9469 --75.9313 --75.9344 --75.9219 --75.9203 --75.9219 --75.9359 --75.9344 --75.9469 --75.9359 --75.9234 --75.9313 --75.9266 --75.9344 --75.9219 --75.9328 --75.9297 --75.9406 --75.9359 --75.9328 --75.9281 --75.9391 --75.9406 --75.9297 --75.9266 --75.9391 --75.9391 --75.9406 --75.9391 --75.9313 --75.9406 --75.9344 --75.9313 --75.9328 --75.9203 --75.9437 --75.9313 --75.9328 --75.9328 --75.9281 --75.9281 --75.9266 --75.9328 --75.9266 --75.925 --75.9344 --75.9328 --75.925 --75.9391 --75.9281 --75.9266 --75.9234 --75.9406 --75.9437 --75.925 --75.9344 --75.9422 --75.9375 --75.9297 --75.9297 --75.9375 --75.9234 --75.9203 --75.9344 --75.9156 --75.9359 --75.9172 --75.9266 --75.9109 --75.9172 --75.9125 --75.9203 --75.9172 --75.9156 --75.9125 --75.9172 --75.9281 --75.9297 --75.9281 --75.9141 --75.9187 --75.9203 --75.9297 --75.9187 --75.9187 --75.9094 --75.9125 --75.9047 --75.9141 --75.9266 --75.9234 --75.9203 --75.9266 --75.9094 --75.9219 --75.9094 --75.9266 --75.9219 --75.9156 --75.9234 --75.9219 --75.925 --75.925 --75.9187 --75.9141 --75.9234 --75.9234 --75.9141 --75.9187 --75.9141 --75.9203 --75.9156 --75.9125 --75.9219 --75.9297 --75.9156 --75.9234 --75.9313 --75.925 --75.9172 --75.9141 --75.9234 --75.9359 --75.9328 --75.9187 --75.9375 --75.9234 --75.9281 --75.95 --75.9187 --75.9437 --75.9297 --75.9437 --75.9375 --75.9422 --75.9281 --75.9297 --75.9281 --75.925 --75.9328 --75.9359 --75.9172 --75.9406 --75.9172 --75.9359 --75.925 --75.9219 --75.925 --75.9156 --75.9187 --75.9313 --75.9328 --75.9266 --75.9422 --75.925 --75.9391 --75.9359 --75.9266 --75.9359 --75.9266 --75.925 --75.9375 --75.9313 --75.9266 --75.9281 --75.9219 --75.9344 --75.9406 --75.9219 --75.9281 --75.9344 --75.9297 --75.9313 --75.9219 --75.9266 --75.925 --75.9094 --75.9297 --75.9219 --75.9094 --75.9172 --75.9297 --75.9313 --75.925 --75.9203 --75.9328 --75.9203 --75.9156 --75.9203 --75.9094 --75.9203 --75.9203 --75.9094 --75.925 --75.9344 --75.9234 --75.9078 --75.9328 --75.9203 --75.9266 --75.9406 --75.9156 --75.9141 --75.9109 --75.9266 --75.9109 --75.925 --75.9281 --75.9281 --75.9344 --75.9313 --75.9297 --75.9187 --75.9266 --75.925 --75.9281 --75.9344 --75.9328 --75.9266 --75.9187 --75.9219 --75.9266 --75.9281 --75.9203 --75.9234 --75.9234 --75.9234 --75.9109 --75.9359 --75.9234 --75.9187 --75.925 --75.9281 --75.9219 --75.9328 --75.9203 --75.925 --75.9281 --75.9281 --75.9234 --75.9281 --75.9266 --75.925 --75.9187 --75.9359 --75.9094 --75.9234 --75.9141 --75.9281 --75.9187 --75.9203 --75.9125 --75.9156 --75.925 --75.9187 --75.9234 --75.925 --75.9109 --75.9266 --75.9031 --75.9203 --75.9313 --75.9187 --75.9125 --75.9172 --75.9156 --75.9234 --75.9094 --75.9203 --75.9203 --75.9141 --75.9297 --75.9141 --75.9281 --75.9203 --75.9156 --75.9141 --75.9313 --75.9141 --75.9281 --75.9219 --75.8938 --75.8609 --75.8016 --75.7453 --75.7063 --75.7156 --75.775 --75.8844 --76.0297 --76.1625 --76.2937 --76.3969 --76.4859 --76.5531 --76.6203 --76.6734 --76.7094 --76.7562 --76.8 --76.8562 --76.9 --76.9313 --76.975 --77.0297 --77.0656 --77.1141 --77.1453 --77.1937 --77.2266 --77.2734 --77.3203 --77.3578 --77.375 --77.4359 --77.4625 --77.5078 --77.5406 --77.5875 --77.6234 --77.6531 --77.6984 --77.7234 --77.75 --77.7797 --77.8281 --77.8516 --77.9 --77.9219 --77.9625 --77.9953 --78.0422 --78.075 --78.1094 --78.1328 --78.1703 --78.1969 --78.2281 --78.2422 --78.2797 --78.3016 --78.3641 --78.3625 --78.4016 --78.4375 --78.4672 --78.4938 --78.5297 --78.5609 --78.5859 --78.6141 --78.6359 --78.6609 --78.7016 --78.7109 --78.7391 --78.7562 --78.7906 --78.7891 --78.8531 --78.8547 --78.9062 --78.9156 --78.9297 --78.9688 --78.9766 --79.0047 --79.0234 --79.0531 --79.0813 --79.0906 --79.1234 --79.1562 --79.1547 --79.1937 --79.2016 --79.2234 --79.2547 --79.2766 --79.3016 --79.3281 --79.3781 --79.4391 --79.5344 --79.6062 --79.6594 --79.675 --79.6281 --79.5391 --79.4156 --79.2891 --79.1781 --79.0938 --79.025 --78.9594 --78.9172 --78.8984 --78.8672 --78.8531 --78.8313 --78.8047 --78.7922 --78.7484 --78.7344 --78.7031 --78.6781 --78.6484 --78.6156 --78.5953 --78.575 --78.5484 --78.5297 --78.5172 --78.4938 --78.4906 --78.4453 --78.4219 --78.4094 --78.3844 --78.3625 --78.3469 --78.325 --78.3078 --78.2797 --78.2719 --78.2438 --78.225 --78.2031 --78.1937 --78.1828 --78.1516 --78.125 --78.1234 --78.1 --78.0953 --78.0687 --78.0531 --78.0359 --78.0375 --78.0094 --77.9938 --77.9828 --77.9688 --77.9516 --77.9359 --77.9141 --77.9125 --77.8891 --77.8734 --77.8516 --77.8531 --77.8422 --77.8328 --77.8047 --77.8031 --77.8031 --77.7844 --77.7672 --77.7672 --77.7312 --77.7312 --77.7312 --77.7141 --77.6984 --77.6875 --77.6719 --77.6547 --77.6547 --77.6438 --77.65 --77.625 --77.6172 --77.6031 --77.6109 --77.5828 --77.5813 --77.5734 --77.5531 --77.5625 --77.5406 --77.5297 --77.5188 --77.5062 --77.5016 --77.4938 --77.4859 --77.4781 --77.4875 --77.4703 --77.4609 --77.4469 --77.4437 --77.4328 --77.4328 --77.4313 --77.425 --77.4344 --77.4078 --77.3828 --77.3922 --77.375 --77.3766 --77.3812 --77.3734 --77.3562 --77.3578 --77.3531 --77.3469 --77.3266 --77.3453 --77.3172 --77.3406 --77.3375 --77.3125 --77.3172 --77.3156 --77.2969 --77.2859 --77.2828 --77.2797 --77.2734 --77.275 --77.2688 --77.2547 --77.2625 --77.2547 --77.2562 --77.2438 --77.2562 --77.2438 --77.2281 --77.2172 --77.2156 --77.2172 --77.2266 --77.2156 --77.2109 --77.2047 --77.1937 --77.1969 --77.2078 --77.1859 --77.1875 --77.1813 --77.1797 --77.1703 --77.175 --77.1734 --77.1687 --77.1672 --77.1641 --77.1547 --77.1469 --77.15 --77.1516 --77.15 --77.1328 --77.1297 --77.1328 --77.1359 --77.1281 --77.1125 --77.1297 --77.1078 --77.1203 --77.1047 --77.1062 --77.1156 --77.1109 --77.1 --77.0984 --77.0969 --77.0906 --77.0938 --77.0844 --77.0813 --77.0734 --77.0828 --77.075 --77.0734 --77.0531 --77.0672 --77.0578 --77.0578 --77.0563 --77.0656 --77.05 --77.0469 --77.0516 --77.0437 --77.0547 --77.0406 --77.0266 --77.0437 --77.0359 --77.0312 --77.0281 --77.0234 --77.0328 --77.0156 --77.0219 --77.0234 --77.0219 --77.0062 --77.0203 --77.0031 --77.0094 --76.9984 --76.9984 --76.9875 --76.9859 --76.9953 --76.9781 --76.9734 --76.9812 --76.9859 --76.9797 --76.9891 --76.9812 --76.9625 --76.9734 --76.9734 --76.9766 --76.9594 --76.9672 --76.9594 --76.9594 --76.9656 --76.9563 --76.9734 --76.95 --76.9563 --76.9469 --76.9422 --76.9516 --76.9516 --76.9453 --76.9516 --76.9516 --76.9375 --76.9531 --76.9672 --76.9406 --76.9422 --76.9391 --76.95 --76.9484 --76.9375 --76.9391 --76.9484 --76.9406 --76.95 --76.9328 --76.9375 --76.9391 --76.9328 --76.9219 --76.9359 --76.9297 --76.925 --76.9203 --76.9234 --76.9234 --76.9094 --76.925 --76.9047 --76.9047 --76.9234 --76.9125 --76.9078 --76.9109 --76.9062 --76.9078 --76.9172 --76.9 --76.8906 --76.8953 --76.8984 --76.8969 --76.8844 --76.9 --76.9062 --76.8891 --76.8859 --76.8938 --76.8812 --76.8734 --76.8781 --76.8781 --76.8703 --76.875 --76.8719 --76.8781 --76.8828 --76.8703 --76.8766 --76.8703 --76.8734 --76.8734 --76.8641 --76.8734 --76.8594 --76.8688 --76.8609 --76.8672 --76.8656 --76.8516 --76.8656 --76.8625 --76.8406 --76.8484 --76.8578 --76.8625 --76.8406 --76.8578 --76.8719 --76.85 --76.8516 --76.85 --76.8547 --76.8562 --76.8516 --76.8578 --76.8531 --76.8562 --76.8516 --76.8469 --76.8438 --76.8516 --76.8359 --76.8594 --76.8453 --76.85 --76.85 --76.8484 --76.8516 --76.8328 --76.8375 --76.8422 --76.8453 --76.8359 --76.8406 --76.8344 --76.8406 --76.8422 --76.8469 --76.8438 --76.8391 --76.8281 --76.8453 --76.8422 --76.825 --76.8484 --76.8406 --76.8203 --76.8422 --76.8313 --76.8328 --76.8281 --76.8344 --76.8141 --76.8219 --76.8375 --76.8187 --76.8219 --76.8281 --76.825 --76.8156 --76.8344 --76.8266 --76.8219 --76.825 --76.8344 --76.8281 --76.825 --76.8187 --76.8266 --76.825 --76.8219 --76.8281 --76.8125 --76.8266 --76.8109 --76.8203 --76.8281 --76.8078 --76.8219 --76.8219 --76.8297 --76.8078 --76.8047 --76.7984 --76.8109 --76.8094 --76.8078 --76.8375 --76.825 --76.8125 --76.8172 --76.8172 --76.8156 --76.8156 --76.8031 --76.8047 --76.8031 --76.8031 --76.8031 --76.8016 --76.8172 --76.8109 --76.8125 --76.8109 --76.7984 --76.8047 --76.7984 --76.8156 --76.7922 --76.8094 --76.7969 --76.8172 --76.8016 --76.8203 --76.8031 --76.8109 --76.8078 --76.8078 --76.8047 --76.7953 --76.7875 --76.8016 --76.7766 --76.8094 --76.8047 --76.7891 --76.8031 --76.7922 --76.7953 --76.7906 --76.7937 --76.7859 --76.7891 --76.7766 --76.7844 --76.7937 --76.7844 --76.775 --76.7828 --76.7937 --76.7875 --76.7953 --76.7828 --76.7844 --76.7859 --76.7781 --76.7734 --76.7766 --76.7734 --76.7781 --76.775 --76.7891 --76.7906 --76.7844 --76.7719 --76.7781 --76.7797 --76.7734 --76.7766 --76.7922 --76.7812 --76.7875 --76.7734 --76.7828 --76.7766 --76.7766 --76.7906 --76.7906 --76.7781 --76.7703 --76.7812 --76.7844 --76.775 --76.7703 --76.7703 --76.7703 --76.7875 --76.7766 --76.7859 --76.7844 --76.7906 --76.7844 --76.7734 --76.7844 --76.7906 --76.7812 --76.7578 --76.7656 --76.7766 --76.7734 --76.7656 --76.7719 --76.7703 --76.7594 --76.7766 --76.7781 --76.7812 --76.775 --76.7672 --76.7703 --76.7656 --76.7781 --76.7828 --76.7625 --76.7688 --76.7641 --76.7766 --76.7656 --76.7641 --76.7516 --76.7609 --76.7766 --76.7641 --76.7531 --76.7672 --76.7672 --76.7578 --76.7656 --76.7578 --76.7578 --76.7609 --76.7719 --76.7625 --76.7484 --76.7609 --76.75 --76.7625 --76.7781 --76.7609 --76.7656 --76.7609 --76.7672 --76.7656 --76.7516 --76.7609 --76.7578 --76.7625 --76.7547 --76.7453 --76.7609 --76.7469 --76.7609 --76.7531 --76.7391 --76.7594 --76.7562 --76.7562 --76.7609 --76.7484 --76.7484 --76.7453 --76.7531 --76.7531 --76.75 --76.7469 --76.7375 --76.75 --76.7531 --76.7453 --76.7453 --76.7453 --76.7281 --76.7438 --76.7406 --76.7219 --76.7406 --76.7391 --76.7375 --76.7453 --76.75 --76.7328 --76.7406 --76.7391 --76.7297 --76.7328 --76.7234 --76.725 --76.7469 --76.725 --76.7422 --76.7312 --76.7359 --76.7266 --76.7328 --76.7391 --76.7375 --76.7172 --76.7344 --76.7375 --76.7297 --76.725 --76.7125 --76.7141 --76.7094 --76.7266 --76.725 --76.7328 --76.7156 --76.7172 --76.7141 --76.7125 --76.7109 --76.7281 --76.7188 --76.7219 --76.7172 --76.7203 --76.7281 --76.7312 --76.7188 --76.7266 --76.7344 --76.7328 --76.7219 --76.7234 --76.7172 --76.7281 --76.7141 --76.7297 --76.7219 --76.7266 --76.7141 --76.7203 --76.7312 --76.7391 --76.7219 --76.7188 --76.725 --76.7219 --76.7063 --76.7172 --76.7359 --76.7188 --76.7109 --76.7312 --76.7172 --76.7125 --76.7047 --76.7047 --76.7234 --76.7266 --76.7203 --76.7156 --76.7172 --76.7281 --76.7234 --76.7297 --76.725 --76.7172 --76.7203 --76.7203 --76.7047 --76.725 --76.7219 --76.7125 --76.7156 --76.7078 --76.7156 --76.6984 --76.7094 --76.7078 --76.7078 --76.7219 --76.7141 --76.7078 --76.7094 --76.7094 --76.7094 --76.7125 --76.7109 --76.7219 --76.7141 --76.7141 --76.7047 --76.7141 --76.7063 --76.7078 --76.7063 --76.7125 --76.7188 --76.7078 --76.6984 --76.7078 --76.6984 --76.7109 --76.7094 --76.7078 --76.7016 --76.6984 --76.7047 --76.7203 --76.6953 --76.7016 --76.7094 --76.6937 --76.6953 --76.7016 --76.7063 --76.7031 --76.7016 --76.6953 --76.7031 --76.7219 --76.7047 --76.7109 --76.7125 --76.6953 --76.7016 --76.6969 --76.7031 --76.7 --76.6844 --76.6969 --76.7031 --76.7047 --76.6922 --76.6922 --76.6984 --76.6969 --76.6844 --76.6859 --76.6969 --76.6875 --76.6797 --76.675 --76.6813 --76.6922 --76.6906 --76.6844 --76.6828 --76.6922 --76.6891 --76.6937 --76.6875 --76.6875 --76.6859 --76.6781 --76.6906 --76.6734 --76.6891 --76.6891 --76.6906 --76.6937 --76.6875 --76.6625 --76.6797 --76.6875 --76.6813 --76.6797 --76.6781 --76.6828 --76.6828 --76.6797 --76.6781 --76.6813 --76.6797 --76.6937 --76.675 --76.6844 --76.6906 --76.6813 --76.6828 --76.6813 --76.6859 --76.6813 --76.6875 --76.6766 --76.6844 --76.6828 --76.6594 --76.6719 --76.6687 --76.6703 --76.6687 --76.6734 --76.6844 --76.6813 --76.6766 --76.6781 --76.6891 --76.6844 --76.6672 --76.6687 --76.6734 --76.6766 --76.6719 --76.675 --76.675 --76.6672 --76.675 --76.6797 --76.6797 --76.6734 --76.6891 --76.6766 --76.6719 --76.6703 --76.6813 --76.675 --76.6875 --76.6766 --76.6906 --76.6859 --76.6797 --76.6797 --76.6734 --76.6734 --76.675 --76.6703 --76.6891 --76.6656 --76.6844 --76.6922 --76.6766 --76.6828 --76.675 --76.6734 --76.675 --76.6734 --76.6594 --76.6703 --76.6797 --76.6703 --76.6813 --76.6844 --76.675 --76.6687 --76.6641 --76.6766 --76.6531 --76.6734 --76.6672 --76.6625 --76.6516 --76.6781 --76.6672 --76.6672 --76.6719 --76.6609 --76.6594 --76.6766 --76.6594 --76.6516 --76.65 --76.6594 --76.6625 --76.675 --76.6656 --76.6672 --76.675 --76.6672 --76.675 --76.6703 --76.6656 --76.6719 --76.6641 --76.6531 --76.6562 --76.6531 --76.6516 --76.6562 --76.6703 --76.6594 --76.6516 --76.6609 --76.6734 --76.6531 --76.6594 --76.6656 --76.6578 --76.6609 --76.6547 --76.6578 --76.6672 --76.6578 --76.6531 --76.6562 --76.6547 --76.6562 --76.6609 --76.6578 --76.6594 --76.6625 --76.6453 --76.6562 --76.6656 --76.6719 --76.6641 --76.6516 --76.6672 --76.6531 --76.6562 --76.6547 --76.6625 --76.6656 --76.6594 --76.6734 --76.6547 --76.6578 --76.6547 --76.6531 --76.6578 --76.6578 --76.6469 --76.6469 --76.65 --76.6516 --76.65 --76.6687 --76.6547 --76.6438 --76.6516 --76.65 --76.6547 --76.6516 --76.6547 --76.6438 --76.6469 --76.6406 --76.6578 --76.6531 --76.6469 --76.6484 --76.65 --76.6391 --76.6547 --76.6453 --76.6469 --76.6609 --76.6547 --76.6625 --76.6422 --76.6406 --76.6281 --76.65 --76.6547 --76.6422 --76.65 --76.6453 --76.6484 --76.6328 --76.6406 --76.6406 --76.6578 --76.6453 --76.6562 --76.6359 --76.6484 --76.6531 --76.6391 --76.6438 --76.6484 --76.6344 --76.6469 --76.6422 --76.65 --76.6406 --76.6406 --76.6453 --76.6484 --76.6531 --76.6359 --76.6453 --76.6375 --76.65 --76.6469 --76.6438 --76.6328 --76.6422 --76.65 --76.6344 --76.6406 --76.6312 --76.6312 --76.6516 --76.6391 --76.6484 --76.6453 --76.6359 --76.6531 --76.6406 --76.6312 --76.6453 --76.6328 --76.6406 --76.6438 --76.6344 --76.6391 --76.6281 --76.6266 --76.6312 --76.6375 --76.6375 --76.6406 --76.6406 --76.6484 --76.6469 --76.6438 --76.6469 --76.6266 --76.6453 --76.6375 --76.6422 --76.6469 --76.6406 --76.6438 --76.6516 --76.6328 --76.6266 --76.6344 --76.6234 --76.6328 --76.6438 --76.6359 --76.6344 --76.6453 --76.6344 --76.6344 --76.6281 --76.6469 --76.6266 --76.6203 --76.6422 --76.6469 --76.6391 --76.6406 --76.6312 --76.6375 --76.6391 --76.6281 --76.6188 --76.6328 --76.6406 --76.6266 --76.6297 --76.6188 --76.6328 --76.6375 --76.6281 --76.6453 --76.625 --76.6344 --76.6297 --76.6219 --76.6312 --76.6406 --76.6375 --76.6328 --76.6328 --76.6328 --76.6453 --76.625 --76.6312 --76.6422 --76.6344 --76.6391 --76.6406 --76.6453 --76.6312 --76.6125 --76.625 --76.625 --76.6266 --76.6 --76.625 --76.6219 --76.6375 --76.6281 --76.6203 --76.6328 --76.6109 --76.6297 --76.6281 --76.6297 --76.6016 --76.6359 --76.6344 --76.6266 --76.6406 --76.6203 --76.6203 --76.6172 --76.6047 --76.6234 --76.6234 --76.6234 --76.625 --76.6281 --76.6281 --76.6234 --76.6219 --76.6312 --76.6266 --76.6172 --76.6125 --76.6109 --76.6062 --76.6266 --76.6141 --76.6188 --76.6203 --76.6016 --76.6188 --76.6062 --76.6062 --76.5969 --76.6062 --76.6203 --76.6141 --76.6125 --76.6094 --76.5984 --76.6234 --76.6125 --76.6094 --76.6125 --76.6016 --76.6219 --76.6062 --76.6047 --76.6094 --76.6141 --76.6109 --76.6281 --76.6062 --76.6062 --76.6219 --76.6156 --76.6141 --76.6047 --76.6234 --76.6016 --76.6062 --76.6031 --76.6016 --76.6172 --76.6109 --76.6094 --76.6047 --76.6141 --76.6062 --76.6047 --76.6109 --76.6031 --76.6094 --76.6094 --76.6047 --76.5906 --76.6141 --76.5938 --76.6094 --76.6109 --76.6078 --76.6062 --76.6 --76.6062 --76.6266 --76.6062 --76.6141 --76.6141 --76.6062 --76.6125 --76.6078 --76.6172 --76.6078 --76.6109 --76.6062 --76.6094 --76.6109 --76.6109 --76.6078 --76.6156 --76.6203 --76.6078 --76.6062 --76.6 --76.6109 --76.6016 --76.6094 --76.6078 --76.6047 --76.6125 --76.6156 --76.6141 --76.6062 --76.6062 --76.6078 --76.6031 --76.6203 --76.6062 --76.6109 --76.6047 --76.6062 --76.6172 --76.6125 --76.6 --76.6078 --76.6094 --76.6031 --76.6062 --76.5984 --76.5984 --76.6172 --76.5969 --76.6172 --76.6031 --76.6109 --76.6016 --76.5984 --76.6109 --76.5922 --76.6062 --76.5922 --76.5938 --76.6 --76.5953 --76.6047 --76.5938 --76.5984 --76.6 --76.6031 --76.6078 --76.5922 --76.5906 --76.6016 --76.6125 --76.5953 --76.6062 --76.5922 --76.6062 --76.6031 --76.6078 --76.5906 --76.6188 --76.6031 --76.6016 --76.6172 --76.5938 --76.6 --76.5938 --76.5938 --76.6016 --76.6062 --76.5984 --76.5922 --76.6062 --76.6031 --76.6109 --76.6109 --76.6094 --76.6156 --76.6047 --76.5953 --76.5984 --76.6016 --76.6125 --76.6094 --76.5969 --76.6062 --76.6062 --76.6109 --76.5938 --76.6094 --76.5969 --76.5938 --76.6047 --76.6094 --76.6078 --76.6094 --76.5984 --76.6031 --76.6125 --76.6031 --76.6141 --76.6 --76.5922 --76.6 --76.6109 --76.6016 --76.6078 --76.6016 --76.6 --76.5984 --76.6109 --76.6078 --76.5984 --76.5938 --76.6031 --76.6016 --76.5984 --76.5906 --76.6062 --76.6062 --76.6125 --76.6094 --76.6016 --76.5984 --76.6016 --76.6062 --76.6 --76.6219 --76.5969 --76.6109 --76.6047 --76.6 --76.6047 --76.6078 --76.6 --76.6125 --76.6125 --76.6062 --76.5906 --76.5906 --76.6125 --76.6094 --76.6 --76.5984 --76.5969 --76.5938 --76.5797 --76.5953 --76.5922 --76.6 --76.6016 --76.5953 --76.5875 --76.5969 --76.575 --76.5938 --76.6016 --76.5875 --76.6062 --76.5891 --76.5859 --76.5906 --76.6031 --76.5984 --76.5922 --76.5922 --76.5922 --76.5797 --76.5938 --76.5938 --76.5859 --76.5891 --76.6016 --76.5953 --76.5813 --76.5906 --76.5938 --76.5891 --76.6109 --76.5938 --76.5953 --76.5922 --76.6 --76.5938 --76.6047 --76.6 --76.5938 --76.5922 --76.5844 --76.5969 --76.5891 --76.5969 --76.5922 --76.5922 --76.5813 --76.5891 --76.5906 --76.5813 --76.5828 --76.5969 --76.5859 --76.5984 --76.5953 --76.5875 --76.5969 --76.575 --76.5844 --76.5891 --76.5781 --76.5844 --76.5859 --76.5766 --76.5797 --76.5844 --76.5781 --76.5656 --76.5687 --76.5891 --76.575 --76.5719 --76.5656 --76.5766 --76.5703 --76.5891 --76.5797 --76.5687 --76.5703 --76.5797 --76.5781 --76.5797 --76.5781 --76.5859 --76.5781 --76.5703 --76.5781 --76.5797 --76.5672 --76.5703 --76.5781 --76.5719 --76.5906 --76.5813 --76.5734 --76.5813 --76.5766 --76.5922 --76.5797 --76.5719 --76.5625 --76.5797 --76.5703 --76.5687 --76.5797 --76.5625 --76.5687 --76.5766 --76.5797 --76.55 --76.5766 --76.5766 --76.5563 --76.5641 --76.5703 --76.5781 --76.5844 --76.5656 --76.5703 --76.5687 --76.5719 --76.5703 --76.5734 --76.5594 --76.5594 --76.575 --76.5719 --76.5828 --76.5734 --76.5781 --76.5641 --76.5719 --76.5953 --76.5875 --76.575 --76.5766 --76.5703 --76.5844 --76.5781 --76.5813 --76.5672 --76.5734 --76.5828 --76.5859 --76.5734 --76.5734 --76.5672 --76.5734 --76.5797 --76.5734 --76.5641 --76.575 --76.5891 --76.5641 --76.5734 --76.5687 --76.5563 --76.5719 --76.5781 --76.5781 --76.5859 --76.5687 --76.5813 --76.575 --76.5719 --76.5859 --76.5719 --76.5875 --76.5859 --76.5797 --76.5797 --76.5687 --76.5813 --76.5609 --76.5813 --76.5766 --76.5766 --76.5687 --76.575 --76.5656 --76.5656 --76.5578 --76.5594 --76.5625 --76.5703 --76.5703 --76.5703 --76.5641 --76.5625 --76.5641 --76.5687 --76.5609 --76.5687 --76.5625 --76.5703 --76.5656 --76.5578 --76.5578 --76.5625 --76.5656 --76.575 --76.5734 --76.5766 --76.5813 --76.5547 --76.575 --76.5687 --76.575 --76.5797 --76.5672 --76.5703 --76.5578 --76.575 --76.5813 --76.5719 --76.5563 --76.575 --76.5609 --76.5797 --76.5641 --76.5672 --76.5828 --76.5672 --76.5734 --76.5828 --76.5922 --76.5734 --76.5703 --76.5703 --76.5766 --76.5703 --76.5719 --76.575 --76.5734 --76.5734 --76.5734 --76.5563 --76.5797 --76.5547 --76.5828 --76.5609 --76.5766 --76.5797 --76.5766 --76.5656 --76.5797 --76.5672 --76.5719 --76.5672 --76.5656 --76.5594 --76.5828 --76.5844 --76.5734 --76.5719 --76.5719 --76.5641 --76.5656 --76.5672 --76.5891 --76.5719 --76.5687 --76.5703 --76.5547 --76.5703 --76.5609 --76.5578 --76.5656 --76.5563 --76.5516 --76.5719 --76.5406 --76.5547 --76.5406 --76.5563 --76.5469 --76.5609 --76.55 --76.55 --76.5578 --76.5609 --76.5531 --76.5641 --76.5563 --76.5609 --76.5719 --76.5703 --76.5516 --76.5594 --76.5609 --76.5578 --76.5469 --76.5687 --76.5594 --76.5719 --76.5687 --76.5547 --76.5516 --76.5578 --76.5672 --76.5391 --76.5578 --76.5578 --76.5453 --76.55 --76.5578 --76.5609 --76.5422 --76.5484 --76.5578 --76.5609 --76.5516 --76.5672 --76.5484 --76.5703 --76.5516 --76.5578 --76.5672 --76.5563 --76.5625 --76.5563 --76.5703 --76.5406 --76.5625 --76.5656 --76.5641 --76.5625 --76.5656 --76.5547 --76.5578 --76.5547 --76.5578 --76.5766 --76.5656 --76.5578 --76.5516 --76.5641 --76.5594 --76.5687 --76.5563 --76.55 --76.5531 --76.5578 --76.5437 --76.5516 --76.5469 --76.5422 --76.5437 --76.5531 --76.5484 --76.5516 --76.5469 --76.5453 --76.5531 --76.5531 --76.5453 --76.5516 --76.5531 --76.5437 --76.5484 --76.5484 --76.5406 --76.5516 --76.5297 --76.5406 --76.5531 --76.5344 --76.55 --76.5328 --76.5469 --76.5422 --76.5484 --76.5328 --76.5516 --76.5469 --76.5453 --76.5359 --76.5484 --76.55 --76.55 --76.5437 --76.5437 --76.5547 --76.5453 --76.55 --76.5563 --76.5547 --76.5406 --76.5516 --76.5516 --76.5406 --76.5594 --76.5547 --76.5297 --76.5406 --76.5312 --76.525 --76.5359 --76.55 --76.5391 --76.5406 --76.5328 --76.5406 --76.5344 --76.55 --76.5453 --76.55 --76.5375 --76.5437 --76.5422 --76.5516 --76.5594 --76.5547 --76.55 --76.5375 --76.5453 --76.5484 --76.5453 --76.5437 --76.5406 --76.55 --76.5578 --76.5422 --76.5547 --76.5484 --76.5469 --76.5344 --76.5391 --76.5375 --76.55 --76.5563 --76.5375 --76.5328 --76.5422 --76.5453 --76.5344 --76.5422 --76.5531 --76.5359 --76.5266 --76.5344 --76.5406 --76.5328 --76.5531 --76.5453 --76.5469 --76.55 --76.5391 --76.5453 --76.5328 --76.5422 --76.5312 --76.5375 --76.5406 --76.5437 --76.5375 --76.5344 --76.5375 --76.5391 --76.5453 --76.5391 --76.5328 --76.5328 --76.5359 --76.5391 --76.5188 --76.5328 --76.5469 --76.5328 --76.5203 --76.5344 --76.5422 --76.5266 --76.5359 --76.5266 --76.5281 --76.5297 --76.5234 --76.5328 --76.525 --76.5375 --76.5297 --76.5312 --76.5359 --76.5234 --76.5312 --76.5359 --76.5281 --76.5281 --76.5344 --76.5297 --76.5219 --76.5203 --76.5281 --76.5359 --76.5172 --76.5328 --76.5234 --76.5531 --76.5297 --76.5172 --76.5359 --76.5281 --76.5344 --76.5281 --76.525 --76.5203 --76.5344 --76.525 --76.5437 --76.5359 --76.5406 --76.5328 --76.5281 --76.5344 --76.5125 --76.5234 --76.5188 --76.5188 --76.5297 --76.5281 --76.5125 --76.5266 --76.5141 --76.5141 --76.5188 --76.525 --76.5141 --76.5219 --76.5125 --76.5203 --76.5266 --76.5234 --76.5375 --76.5328 --76.5328 --76.5312 --76.5297 --76.5328 --76.5516 --76.5391 --76.5312 --76.5297 --76.5344 --76.5391 --76.525 --76.5406 --76.5406 --76.5312 --76.5297 --76.5172 --76.5328 --76.55 --76.5297 --76.525 --76.5188 --76.5328 --76.5141 --76.525 --76.5359 --76.5391 --76.525 --76.5297 --76.5266 --76.5234 --76.5109 --76.5219 --76.5188 --76.5125 --76.5156 --76.5312 --76.5375 --76.5219 --76.5219 --76.5188 --76.5266 --76.5234 --76.5203 --76.525 --76.525 --76.5328 --76.5266 --76.5203 --76.5281 --76.5375 --76.5203 --76.5328 --76.525 --76.5281 --76.5172 --76.5359 --76.5312 --76.5172 --76.5359 --76.5266 --76.5141 --76.5266 --76.5219 --76.5297 --76.5203 --76.5328 --76.5266 --76.5375 --76.5281 --76.5297 --76.5312 --76.5141 --76.5281 --76.5219 --76.5203 --76.525 --76.5078 --76.5203 --76.5125 --76.5141 --76.5188 --76.5094 --76.5234 --76.5156 --76.5016 --76.5109 --76.5141 --76.5062 --76.5016 --76.5062 --76.5078 --76.5297 --76.5125 --76.5062 --76.5172 --76.5156 --76.5125 --76.4984 --76.5172 --76.5016 --76.5172 --76.5047 --76.5203 --76.5062 --76.5078 --76.5 --76.5141 --76.5047 --76.5156 --76.5109 --76.5062 --76.5078 --76.5062 --76.5016 --76.5047 --76.5125 --76.5094 --76.5188 --76.5109 --76.5031 --76.5094 --76.5312 --76.5219 --76.5031 --76.5094 --76.5016 --76.5031 --76.5016 --76.5016 --76.5109 --76.5 --76.5125 --76.5109 --76.5234 --76.5156 --76.5 --76.5328 --76.5219 --76.5078 --76.4938 --76.5047 --76.5125 --76.5078 --76.5266 --76.5219 --76.5156 --76.5266 --76.5141 --76.525 --76.5188 --76.5219 --76.5188 --76.5094 --76.5203 --76.5 --76.5172 --76.5047 --76.5156 --76.5016 --76.4984 --76.5172 --76.5078 --76.5062 --76.5062 --76.5109 --76.5172 --76.5078 --76.5031 --76.5078 --76.5031 --76.4859 --76.5172 --76.5062 --76.5109 --76.5078 --76.4984 --76.5094 --76.5062 --76.4969 --76.5141 --76.4969 --76.5047 --76.5109 --76.5016 --76.5094 --76.5188 --76.5188 --76.5031 --76.5141 --76.4953 --76.5062 --76.5047 --76.4984 --76.5016 --76.4969 --76.5 --76.5172 --76.4922 --76.5031 --76.5094 --76.4844 --76.5016 --76.4812 --76.5 --76.5016 --76.5031 --76.4922 --76.5062 --76.5062 --76.4844 --76.4969 --76.5234 --76.4969 --76.5094 --76.5125 --76.5062 --76.5078 --76.5109 --76.5156 --76.5219 --76.5141 --76.5094 --76.5125 --76.5047 --76.5172 --76.4859 --76.5078 --76.4984 --76.5 --76.5172 --76.5156 --76.5125 --76.5094 --76.5141 --76.4953 --76.5109 --76.5078 --76.5203 --76.5062 --76.5 --76.5078 --76.5 --76.5016 --76.5031 --76.4891 --76.5031 --76.4969 --76.5062 --76.5 --76.4906 --76.4953 --76.5016 --76.5016 --76.5094 --76.5125 --76.4953 --76.5094 --76.5016 --76.5141 --76.5 --76.5125 --76.4969 --76.4984 --76.4875 --76.5031 --76.4938 --76.4953 --76.4922 --76.4891 --76.5016 --76.4922 --76.5016 --76.4797 --76.4922 --76.5109 --76.4984 --76.4906 --76.4984 --76.4922 --76.5109 --76.5109 --76.5016 --76.5062 --76.4844 --76.5062 --76.4969 --76.5078 --76.5016 --76.5141 --76.5 --76.4953 --76.4922 --76.4875 --76.4953 --76.4984 --76.4969 --76.4953 --76.4938 --76.4891 --76.4953 --76.4906 --76.4922 --76.5047 --76.4984 --76.4969 --76.4906 --76.5031 --76.5016 --76.5047 --76.5156 --76.5 --76.4891 --76.5016 --76.5094 --76.4906 --76.4953 --76.4984 --76.4875 --76.5109 --76.4984 --76.4953 --76.4859 --76.4844 --76.4875 --76.4875 --76.475 --76.4969 --76.4859 --76.4766 --76.4781 --76.4969 --76.4781 --76.4844 --76.4859 --76.4922 --76.4797 --76.4844 --76.4828 --76.475 --76.4891 --76.4938 --76.4781 --76.475 --76.4812 --76.4828 --76.4859 --76.4859 --76.4969 --76.4891 --76.4922 --76.475 --76.4734 --76.4875 --76.4844 --76.4906 --76.4969 --76.4984 --76.4906 --76.4938 --76.4875 --76.4859 --76.5 --76.4984 --76.4953 --76.4859 --76.4828 --76.5016 --76.4953 --76.4781 --76.4844 --76.4828 --76.5016 --76.4797 --76.4906 --76.4781 --76.4812 --76.4797 --76.4891 --76.4938 --76.4922 --76.4906 --76.4859 --76.4828 --76.4844 --76.4766 --76.4922 --76.4812 --76.4781 --76.4781 --76.5031 --76.4938 --76.4688 --76.4766 --76.4875 --76.4734 --76.4781 --76.4844 --76.475 --76.4891 --76.4734 --76.4859 --76.4797 --76.4688 --76.4797 --76.4797 --76.4969 --76.4844 --76.4719 --76.4859 --76.4891 --76.4906 --76.4766 --76.4766 --76.475 --76.4844 --76.4766 --76.4891 --76.4812 --76.4891 --76.4812 --76.4703 --76.4859 --76.5 --76.4859 --76.4797 --76.4859 --76.4938 --76.475 --76.4875 --76.4859 --76.4922 --76.4578 --76.5 --76.4891 --76.4891 --76.4984 --76.4922 --76.4922 --76.4812 --76.4875 --76.4875 --76.4859 --76.4938 --76.4828 --76.4906 --76.4969 --76.4703 --76.475 --76.4859 --76.4828 --76.4766 --76.4719 --76.4812 --76.4781 --76.4719 --76.4641 --76.4734 --76.4797 --76.4828 --76.4766 --76.475 --76.4797 --76.4734 --76.4672 --76.475 --76.4625 --76.4656 --76.4734 --76.4781 --76.4766 --76.4828 --76.4766 --76.4781 --76.4812 --76.4859 --76.4703 --76.4688 --76.475 --76.4734 --76.4797 --76.4734 --76.4844 --76.4781 --76.4688 --76.4906 --76.4828 --76.4781 --76.4703 --76.4641 --76.4844 --76.4844 --76.4781 --76.475 --76.4766 --76.4781 --76.4875 --76.4672 --76.4781 --76.4688 --76.4844 --76.4781 --76.4656 --76.4625 --76.4641 --76.4719 --76.4578 --76.4609 --76.4781 --76.4641 --76.4688 --76.4641 --76.4828 --76.4734 --76.4781 --76.4547 --76.4672 --76.4719 --76.475 --76.4672 --76.4812 --76.4734 --76.4625 --76.4766 --76.4688 --76.4844 --76.4656 --76.4703 --76.4703 --76.4703 --76.4719 --76.4734 --76.4703 --76.4594 --76.4797 --76.4766 --76.4703 --76.4797 --76.4703 --76.4719 --76.4828 --76.4734 --76.4734 --76.4734 --76.4703 --76.4859 --76.4812 --76.4703 --76.4797 --76.4766 --76.4625 --76.4688 --76.4844 --76.475 --76.4797 --76.475 --76.4891 --76.4797 --76.475 --76.4734 --76.4703 --76.4688 --76.475 --76.4781 --76.4719 --76.4656 --76.4797 --76.4609 --76.4703 --76.4656 --76.4734 --76.4719 --76.4641 --76.4641 --76.4766 --76.4672 --76.4609 --76.4563 --76.4625 --76.4609 --76.4844 --76.4594 --76.4578 --76.4656 --76.4672 --76.4641 --76.4609 --76.4719 --76.4672 --76.4766 --76.4828 --76.4641 --76.4703 --76.4578 --76.4594 --76.4656 --76.4703 --76.4656 --76.4734 --76.4688 --76.4563 --76.4609 --76.4625 --76.4688 --76.4734 --76.4625 --76.4422 --76.4578 --76.475 --76.4719 --76.4703 --76.4563 --76.4547 --76.4625 --76.4703 --76.4578 --76.4703 --76.4563 --76.4594 --76.4578 --76.4734 --76.4656 --76.4625 --76.4625 --76.4578 --76.4531 --76.4563 --76.45 --76.4641 --76.45 --76.4641 --76.45 --76.4594 --76.4734 --76.4734 --76.4656 --76.4703 --76.4563 --76.4703 --76.475 --76.4609 --76.4531 --76.4547 --76.4766 --76.4672 --76.4734 --76.4641 --76.4734 --76.4578 --76.4641 --76.4688 --76.4688 --76.4672 --76.4734 --76.4641 --76.4703 --76.4672 --76.4781 --76.4516 --76.4625 --76.4609 --76.4578 --76.4453 --76.4531 --76.4609 --76.4594 --76.4516 --76.4531 --76.4469 --76.4531 --76.4531 --76.4453 --76.4469 --76.4641 --76.45 --76.4469 --76.4641 --76.45 --76.4516 --76.4484 --76.4453 --76.45 --76.4531 --76.45 --76.4484 --76.4437 --76.4594 --76.4516 --76.4609 --76.4531 --76.4547 --76.4578 --76.4672 --76.4484 --76.4563 --76.4437 --76.4469 --76.4578 --76.4484 --76.4672 --76.4641 --76.4516 --76.4359 --76.4344 --76.4547 --76.4391 --76.4406 --76.4469 --76.4328 --76.4406 --76.4453 --76.4359 --76.4406 --76.4406 --76.4469 --76.4391 --76.4375 --76.4437 --76.4406 --76.4453 --76.4422 --76.4375 --76.45 --76.4266 --76.4375 --76.4469 --76.4328 --76.4375 --76.4422 --76.4344 --76.4281 --76.4469 --76.4266 --76.4359 --76.4344 --76.4297 --76.4313 --76.4359 --76.4141 --76.4359 --76.4219 --76.425 --76.4453 --76.4297 --76.4344 --76.4375 --76.4313 --76.4547 --76.4219 --76.4281 --76.4328 --76.4344 --76.4375 --76.4203 --76.4281 --76.4266 --76.4313 --76.4375 --76.4391 --76.4266 --76.4219 --76.4375 --76.4313 --76.4406 --76.4391 --76.4469 --76.4344 --76.4313 --76.4406 --76.4437 --76.4187 --76.4328 --76.4453 --76.4375 --76.425 --76.4313 --76.4328 --76.4328 --76.4281 --76.4422 --76.4344 --76.4313 --76.4437 --76.4313 --76.4375 --76.4328 --76.4422 --76.4391 --76.4437 --76.4359 --76.4359 --76.4406 --76.4313 --76.4422 --76.4328 --76.4359 --76.4437 --76.4281 --76.4359 --76.4391 --76.4437 --76.4437 --76.4406 --76.4375 --76.4391 --76.4375 --76.4391 --76.4297 --76.425 --76.4187 --76.4297 --76.4328 --76.4313 --76.4391 --76.4219 --76.4281 --76.4313 --76.4391 --76.4516 --76.4453 --76.4375 --76.4359 --76.4391 --76.4406 --76.4313 --76.4313 --76.4469 --76.4281 --76.4406 --76.4453 --76.4437 --76.4469 --76.4391 --76.4484 --76.4375 --76.4406 --76.4328 --76.4344 --76.4375 --76.4469 --76.4406 --76.4375 --76.4406 --76.4391 --76.4391 --76.4437 --76.4406 --76.4453 --76.4422 --76.4469 --76.4375 --76.4422 --76.4453 --76.4484 --76.4391 --76.4516 --76.4391 --76.4375 --76.4422 --76.4469 --76.4469 --76.4375 --76.4359 --76.4281 --76.4359 --76.4469 --76.4453 --76.4516 --76.4484 --76.4437 --76.4391 --76.4469 --76.4406 --76.4344 --76.4594 --76.4547 --76.4484 --76.4187 --76.4469 --76.4422 --76.4375 --76.45 --76.4516 --76.4375 --76.4344 --76.4453 --76.4359 --76.4391 --76.4328 --76.4328 --76.4266 --76.4391 --76.4281 --76.4266 --76.4297 --76.4375 --76.425 --76.4422 --76.4313 --76.4313 --76.4469 --76.4281 --76.4297 --76.4391 --76.4234 --76.4266 --76.4344 --76.4328 --76.4328 --76.4203 --76.4281 --76.4422 --76.4422 --76.4359 --76.425 --76.4203 --76.4172 --76.4281 --76.4328 --76.4281 --76.4375 --76.4203 --76.4328 --76.4234 --76.4234 --76.425 --76.4313 --76.4203 --76.4297 --76.4172 --76.4281 --76.4297 --76.4391 --76.4203 --76.4187 --76.4359 --76.4219 --76.4344 --76.4297 --76.4234 --76.4187 --76.4281 --76.4203 --76.4344 --76.425 --76.4172 --76.4156 --76.4172 --76.4094 --76.4203 --76.4234 --76.4156 --76.4266 --76.4172 --76.4266 --76.4187 --76.4219 --76.4281 --76.4281 --76.4172 --76.4281 --76.4234 --76.4219 --76.4281 --76.4344 --76.4359 --76.4187 --76.4437 --76.4172 --76.4297 --76.4297 --76.4266 --76.4328 --76.4266 --76.4375 --76.4375 --76.4266 --76.4391 --76.4391 --76.4281 --76.4437 --76.4203 --76.4359 --76.4344 --76.4313 --76.4281 --76.4375 --76.4297 --76.4437 --76.4187 --76.4266 --76.4313 --76.4219 --76.4156 --76.4172 --76.425 --76.4281 --76.4234 --76.4203 --76.4313 --76.4313 --76.4281 --76.4031 --76.4234 --76.4156 --76.4313 --76.4234 --76.4187 --76.4344 --76.4141 --76.4141 --76.4125 --76.4266 --76.425 --76.4328 --76.4375 --76.4203 --76.4172 --76.4141 --76.4219 --76.425 --76.4203 --76.4406 --76.4109 --76.425 --76.4281 --76.4156 --76.4297 --76.4141 --76.4125 --76.4156 --76.4141 --76.4172 --76.4156 --76.425 --76.4047 --76.4187 --76.4109 --76.4219 --76.4078 --76.4156 --76.4078 --76.4016 --76.4125 --76.4187 --76.4109 --76.4109 --76.4172 --76.4141 --76.425 --76.425 --76.4203 --76.4234 --76.4297 --76.4187 --76.425 --76.4187 --76.4156 --76.4297 --76.4203 --76.4141 --76.4125 --76.4203 --76.4187 --76.4078 --76.4359 --76.4094 --76.4141 --76.4266 --76.4187 --76.4203 --76.4219 --76.4141 --76.4172 --76.4047 --76.4062 --76.4125 --76.4234 --76.4172 --76.4125 --76.4141 --76.4172 --76.4219 --76.4219 --76.4219 --76.4187 --76.4156 --76.4266 --76.4203 --76.4141 --76.4156 --76.4203 --76.4172 --76.4094 --76.4156 --76.4141 --76.4156 --76.4203 --76.3969 --76.4109 --76.4094 --76.3953 --76.4125 --76.4078 --76.3984 --76.4062 --76.4062 --76.4062 --76.3984 --76.4062 --76.4 --76.4047 --76.4078 --76.4125 --76.4094 --76.4016 --76.4125 --76.3844 --76.4031 --76.4125 --76.4031 --76.4062 --76.4016 --76.4062 --76.3875 --76.4 --76.4047 --76.4187 --76.3906 --76.4125 --76.4047 --76.3953 --76.4062 --76.4078 --76.3984 --76.4141 --76.4109 --76.4031 --76.4172 --76.4172 --76.4094 --76.4062 --76.4 --76.3938 --76.4078 --76.4062 --76.4094 --76.4 --76.3969 --76.3984 --76.4031 --76.4234 --76.4016 --76.4078 --76.4 --76.4016 --76.4016 --76.4078 --76.4141 --76.4094 --76.4 --76.4031 --76.4031 --76.4062 --76.3922 --76.4062 --76.4094 --76.3938 --76.4016 --76.4109 --76.4016 --76.3984 --76.4125 --76.4141 --76.4156 --76.4187 --76.4219 --76.4141 --76.4141 --76.4094 --76.4047 --76.4094 --76.4109 --76.4 --76.3969 --76.3953 --76.3906 --76.4047 --76.4016 --76.4109 --76.4078 --76.3922 --76.4109 --76.4047 --76.4 --76.4047 --76.4109 --76.4047 --76.3875 --76.4109 --76.3953 --76.3984 --76.4047 --76.3938 --76.3938 --76.4 --76.4031 --76.3953 --76.3797 --76.3953 --76.4016 --76.3984 --76.3938 --76.3922 --76.3859 --76.4094 --76.3922 --76.3828 --76.3859 --76.3891 --76.3906 --76.3891 --76.3859 --76.4 --76.3797 --76.3984 --76.4016 --76.4047 --76.3938 --76.3984 --76.3938 --76.3969 --76.3859 --76.3984 --76.3859 --76.4 --76.3891 --76.3969 --76.3922 --76.3969 --76.3984 --76.3859 --76.3953 --76.4047 --76.3891 --76.3922 --76.3891 --76.3938 --76.3922 --76.3969 --76.3875 --76.3953 --76.4078 --76.4016 --76.4062 --76.4 --76.3922 --76.3953 --76.3891 --76.3922 --76.3906 --76.3938 --76.3891 --76.3875 --76.3906 --76.4047 --76.3859 --76.3984 --76.3969 --76.3766 --76.3984 --76.3891 --76.4016 --76.4109 --76.3906 --76.3969 --76.3938 --76.3953 --76.3859 --76.4 --76.3938 --76.3922 --76.3906 --76.3984 --76.4062 --76.3969 --76.3922 --76.3875 --76.3906 --76.3875 --76.3844 --76.3938 --76.3938 --76.4047 --76.4 --76.3844 --76.3766 --76.3906 --76.3984 --76.3891 --76.3969 --76.3984 --76.3953 --76.3812 --76.3969 --76.4016 --76.3891 --76.4 --76.3984 --76.3969 --76.3906 --76.4047 --76.4 --76.4 --76.3969 --76.4 --76.3875 --76.4031 --76.4016 --76.4031 --76.3953 --76.3891 --76.3984 --76.3984 --76.4031 --76.4125 --76.4 --76.3953 --76.3984 --76.4031 --76.3938 --76.3922 --76.4109 --76.4094 --76.4156 --76.3906 --76.3953 --76.3891 --76.3984 --76.3875 --76.3953 --76.3922 --76.4094 --76.3984 --76.4141 --76.4062 --76.3953 --76.4 --76.4109 --76.3875 --76.3969 --76.3922 --76.4031 --76.3969 --76.3812 --76.3906 --76.3953 --76.3953 --76.3953 --76.4094 --76.4031 --76.4047 --76.4062 --76.3984 --76.3953 --76.3984 --76.3969 --76.4 --76.3984 --76.4 --76.4125 --76.4078 --76.3891 --76.3875 --76.4031 --76.4062 --76.3828 --76.3938 --76.3953 --76.3984 --76.4 --76.4109 --76.3984 --76.3938 --76.3844 --76.3922 --76.3922 --76.3828 --76.3797 --76.3844 --76.3844 --76.3766 --76.3906 --76.3938 --76.3906 --76.3969 --76.4062 --76.375 --76.3906 --76.3922 --76.3891 --76.3953 --76.3844 --76.3859 --76.3891 --76.375 --76.3875 --76.4 --76.3891 --76.4 --76.3953 --76.3891 --76.3875 --76.4031 --76.3844 --76.3938 --76.3922 --76.3891 --76.3953 --76.4 --76.3906 --76.3891 --76.3984 --76.3859 --76.3828 --76.3812 --76.3984 --76.3984 --76.3906 --76.3953 --76.3891 --76.3984 --76.3984 --76.3969 --76.3953 --76.3891 --76.3938 --76.3969 --76.4047 --76.3906 --76.3828 --76.4 --76.3953 --76.4047 --76.3969 --76.3953 --76.4 --76.3844 --76.4 --76.3922 --76.3859 --76.3844 --76.3859 --76.3859 --76.3922 --76.3844 --76.3938 --76.3875 --76.3922 --76.3734 --76.3812 --76.3859 --76.3797 --76.3906 --76.3969 --76.3734 --76.3828 --76.4031 --76.375 --76.375 --76.3641 --76.3844 --76.3828 --76.3859 --76.3938 --76.3812 --76.375 --76.3719 --76.3812 --76.3781 --76.3703 --76.3938 --76.3734 --76.3703 --76.3812 --76.3828 --76.3797 --76.3797 --76.3828 --76.3828 --76.375 --76.3781 --76.3781 --76.3875 --76.3594 --76.3781 --76.3781 --76.3578 --76.3578 --76.3766 --76.3656 --76.3875 --76.3766 --76.3859 --76.375 --76.3766 --76.3594 --76.3766 --76.375 --76.3781 --76.3672 --76.3797 --76.3766 --76.3688 --76.3641 --76.3906 --76.3766 --76.3719 --76.3812 --76.3688 --76.3859 --76.3906 --76.3906 --76.3844 --76.3828 --76.3844 --76.3766 --76.3781 --76.3781 --76.3812 --76.3844 --76.3828 --76.3766 --76.3938 --76.3828 --76.3875 --76.3938 --76.3922 --76.3828 --76.3828 --76.3797 --76.3891 --76.3953 --76.3875 --76.3734 --76.3906 --76.3766 --76.3812 --76.3859 --76.3859 --76.3797 --76.3719 --76.3844 --76.375 --76.3781 --76.3891 --76.3703 --76.3734 --76.375 --76.3875 --76.3797 --76.3781 --76.3688 --76.3781 --76.375 --76.3875 --76.3703 --76.3812 --76.3828 --76.3766 --76.3734 --76.3781 --76.3812 --76.3797 --76.3812 --76.3875 --76.3703 --76.3719 --76.375 --76.3828 --76.3719 --76.3656 --76.3484 --76.3516 --76.3625 --76.3891 --76.375 --76.3766 --76.3766 --76.3906 --76.3625 --76.3734 --76.375 --76.3766 --76.3812 --76.3797 --76.3812 --76.3812 --76.3703 --76.3781 --76.375 --76.3844 --76.3688 --76.3766 --76.3766 --76.3719 --76.3734 --76.375 --76.3719 --76.3656 --76.3781 --76.3719 --76.3688 --76.3719 --76.3797 --76.3781 --76.375 --76.375 --76.3719 --76.3688 --76.375 --76.3781 --76.3656 --76.3656 --76.3766 --76.3641 --76.3688 --76.3828 --76.3625 --76.3703 --76.3641 --76.3797 --76.3703 --76.3719 --76.3578 --76.3719 --76.3656 --76.3609 --76.3656 --76.3703 --76.3641 --76.3734 --76.3625 --76.375 --76.3641 --76.3703 --76.3656 --76.3688 --76.3703 --76.3625 --76.3625 --76.3703 --76.3703 --76.3703 --76.3719 --76.3641 --76.3609 --76.3672 --76.3688 --76.3672 --76.3625 --76.375 --76.3688 --76.3766 --76.3672 --76.3641 --76.3688 --76.3781 --76.3828 --76.3547 --76.3625 --76.3672 --76.3672 --76.3609 --76.375 --76.3469 --76.3719 --76.3656 --76.3609 --76.3672 --76.3719 --76.3641 --76.3656 --76.3641 --76.3484 --76.3594 --76.3594 --76.3672 --76.3594 --76.3516 --76.3656 --76.3578 --76.3656 --76.3641 --76.3734 --76.3672 --76.3641 --76.3625 --76.3703 --76.3625 --76.3625 --76.3594 --76.3625 --76.3688 --76.3703 --76.3688 --76.3594 --76.3641 --76.3688 --76.3531 --76.3672 --76.3469 --76.3594 --76.3516 --76.3656 --76.3578 --76.3766 --76.3672 --76.3578 --76.3656 --76.3578 --76.3641 --76.3594 --76.3594 --76.3688 --76.3672 --76.3547 --76.3547 --76.3719 --76.3641 --76.3703 --76.3641 --76.3641 --76.35 --76.3609 --76.3672 --76.3656 --76.3641 --76.3672 --76.3609 --76.3703 --76.3688 --76.3531 --76.3656 --76.3609 --76.3531 --76.3609 --76.3547 --76.3703 --76.3625 --76.3797 --76.3719 --76.3562 --76.3578 --76.3688 --76.3547 --76.3719 --76.3688 --76.3734 --76.3703 --76.3812 --76.3656 --76.3656 --76.3656 --76.375 --76.3641 --76.3562 --76.3547 --76.3578 --76.3688 --76.35 --76.3562 --76.3578 --76.3688 --76.3609 --76.3578 --76.3625 --76.3453 --76.3578 --76.3531 --76.3469 --76.3516 --76.3594 --76.3672 --76.35 --76.3594 --76.3641 --76.3453 --76.3562 --76.3594 --76.3578 --76.3625 --76.3594 --76.3594 --76.3547 --76.3641 --76.3688 --76.3594 --76.3688 --76.3578 --76.3656 --76.3625 --76.3594 --76.3484 --76.3562 --76.3641 --76.3531 --76.3594 --76.3734 --76.3578 --76.3688 --76.3578 --76.3609 --76.3672 --76.3484 --76.3609 --76.3625 --76.3641 --76.35 --76.3625 --76.3625 --76.3625 --76.35 --76.3703 --76.3656 --76.3594 --76.3594 --76.3688 --76.3625 --76.3516 --76.3641 --76.3719 --76.35 --76.3625 --76.3609 --76.3766 --76.3656 --76.3641 --76.3609 --76.3656 --76.3562 --76.3562 --76.3656 --76.3641 --76.3625 --76.3719 --76.3641 --76.3766 --76.3688 --76.3656 --76.3625 --76.3547 --76.3391 --76.3625 --76.3547 --76.3641 --76.3578 --76.35 --76.3422 --76.3547 --76.35 --76.3438 --76.3672 --76.3625 --76.3656 --76.3688 --76.3547 --76.3531 --76.3484 --76.3562 --76.3578 --76.3562 --76.3531 --76.3484 --76.3625 --76.35 --76.3531 --76.3641 --76.3438 --76.3453 --76.3422 --76.3484 --76.3531 --76.3438 --76.3484 --76.35 --76.3672 --76.3562 --76.3578 --76.3562 --76.3562 --76.3641 --76.3516 --76.3547 --76.3625 --76.3469 --76.3531 --76.3625 --76.35 --76.3641 --76.3531 --76.3688 --76.3531 --76.3703 --76.3688 --76.3672 --76.3828 --76.3469 --76.3578 --76.3672 --76.3609 --76.3547 --76.3594 --76.3531 --76.35 --76.3516 --76.3422 --76.3594 --76.3531 --76.3547 --76.3484 --76.3406 --76.3422 --76.3578 --76.3469 --76.3516 --76.3453 --76.3453 --76.3594 --76.3422 --76.3375 --76.3391 --76.3453 --76.3453 --76.35 --76.3438 --76.3406 --76.3484 --76.3469 --76.3359 --76.3422 --76.3516 --76.3562 --76.3547 --76.3391 --76.3516 --76.3453 --76.3453 --76.3594 --76.3594 --76.3578 --76.3344 --76.3562 --76.3531 --76.3547 --76.3594 --76.35 --76.3547 --76.3438 --76.3562 --76.35 --76.3406 --76.3375 --76.3594 --76.3484 --76.3531 --76.3406 --76.35 --76.3453 --76.3578 --76.3438 --76.3422 --76.3453 --76.3375 --76.3422 --76.3422 --76.3422 --76.3516 --76.35 --76.3422 --76.3516 --76.3422 --76.3297 --76.3375 --76.3453 --76.3453 --76.3422 --76.3453 --76.3484 --76.3422 --76.3484 --76.35 --76.3469 --76.3469 --76.35 --76.3438 --76.35 --76.3531 --76.3531 --76.3469 --76.3516 --76.3469 --76.3562 --76.3438 --76.3484 --76.3531 --76.3578 --76.3516 --76.3562 --76.3328 --76.3453 --76.3594 --76.3562 --76.3469 --76.35 --76.3484 --76.3531 --76.35 --76.3484 --76.3453 --76.3469 --76.3578 --76.3438 --76.3359 --76.3375 --76.3438 --76.3562 --76.3625 --76.3438 --76.3391 --76.3375 --76.35 --76.3438 --76.3531 --76.3391 --76.3375 --76.3266 --76.35 --76.3406 --76.35 --76.3328 --76.3344 --76.3375 --76.3359 --76.3391 --76.3344 --76.3453 --76.3422 --76.3406 --76.35 --76.3359 --76.3344 --76.3391 --76.3422 --76.3391 --76.35 --76.35 --76.3422 --76.3297 --76.3266 --76.3391 --76.3453 --76.3484 --76.3406 --76.3406 --76.325 --76.3484 --76.3375 --76.3344 --76.3391 --76.3484 --76.3297 --76.3328 --76.3391 --76.3391 --76.3391 --76.3469 --76.3375 --76.3297 --76.3313 --76.3359 --76.3187 --76.3313 --76.3406 --76.3297 --76.3141 --76.3234 --76.3406 --76.3219 --76.3313 --76.3344 --76.3328 --76.3219 --76.3281 --76.3281 --76.3203 --76.3297 --76.3281 --76.3281 --76.3266 --76.3219 --76.3313 --76.3203 --76.3156 --76.3219 --76.3094 --76.3281 --76.325 --76.3203 --76.3344 --76.3328 --76.325 --76.3281 --76.3297 --76.3281 --76.3297 --76.3219 --76.3172 --76.3172 --76.3203 --76.3125 --76.3203 --76.3156 --76.3219 --76.3313 --76.3187 --76.3172 --76.3187 --76.3203 --76.3328 --76.3438 --76.3234 --76.3297 --76.3266 --76.3156 --76.3219 --76.3172 --76.3297 --76.3219 --76.3125 --76.3313 --76.3172 --76.3187 --76.325 --76.3125 --76.3203 --76.3125 --76.3281 --76.3469 --76.3328 --76.325 --76.3219 --76.3219 --76.3141 --76.3359 --76.3203 --76.3203 --76.3203 --76.3219 --76.3234 --76.325 --76.3344 --76.3281 --76.3344 --76.3328 --76.3344 --76.3328 --76.3203 --76.3313 --76.3422 --76.3297 --76.3391 --76.3438 --76.3406 --76.3469 --76.3375 --76.3344 --76.3328 --76.3344 --76.3453 --76.3266 --76.3328 --76.3234 --76.3469 --76.3469 --76.3438 --76.3344 --76.3344 --76.3359 --76.3344 --76.3281 --76.3297 --76.3203 --76.3344 --76.325 --76.3281 --76.3391 --76.3438 --76.3234 --76.3313 --76.3297 --76.3344 --76.3375 --76.3281 --76.325 --76.3203 --76.3328 --76.3359 --76.3328 --76.3406 --76.325 --76.3297 --76.3344 --76.3297 --76.3359 --76.3281 --76.3422 --76.325 --76.3328 --76.3391 --76.3531 --76.3359 --76.3297 --76.3344 --76.3391 --76.3391 --76.3234 --76.3219 --76.3297 --76.3219 --76.3297 --76.3219 --76.3281 --76.3281 --76.3078 --76.3203 --76.3344 --76.3266 --76.3078 --76.3203 --76.3203 --76.3172 --76.3187 --76.3094 --76.3078 --76.3219 --76.3203 --76.3109 --76.3266 --76.3266 --76.3297 --76.3219 --76.3141 --76.3281 --76.3234 --76.3094 --76.325 --76.3172 --76.3281 --76.325 --76.3344 --76.3344 --76.3344 --76.3266 --76.3297 --76.3297 --76.3234 --76.3156 --76.3172 --76.3187 --76.3187 --76.325 --76.325 --76.3422 --76.3109 --76.3187 --76.3125 --76.3141 --76.3078 --76.3141 --76.3219 --76.3172 --76.3063 --76.3219 --76.3094 --76.3141 --76.3187 --76.3172 --76.3125 --76.3203 --76.3187 --76.3297 --76.3156 --76.325 --76.3266 --76.3172 --76.3031 --76.3281 --76.3266 --76.3234 --76.3078 --76.3094 --76.3172 --76.3094 --76.3078 --76.3187 --76.3281 --76.3109 --76.3 --76.3172 --76.3063 --76.3125 --76.3266 --76.3156 --76.3094 --76.3109 --76.3187 --76.3047 --76.3187 --76.3109 --76.3063 --76.3047 --76.3078 --76.3156 --76.3031 --76.3125 --76.3141 --76.3047 --76.3 --76.3172 --76.3094 --76.3078 --76.3156 --76.3125 --76.3172 --76.3172 --76.3078 --76.3141 --76.3141 --76.3141 --76.3172 --76.3031 --76.3187 --76.325 --76.3063 --76.3063 --76.3 --76.3047 --76.3281 --76.3078 --76.3016 --76.3203 --76.3078 --76.3031 --76.3016 --76.3031 --76.3141 --76.3016 --76.3063 --76.3 --76.3125 --76.2953 --76.2984 --76.3047 --76.3 --76.2969 --76.3156 --76.2953 --76.3141 --76.3063 --76.3031 --76.3187 --76.3094 --76.2969 --76.2969 --76.3094 --76.3047 --76.3 --76.3172 --76.2984 --76.3 --76.3016 --76.3047 --76.3 --76.3047 --76.3016 --76.2953 --76.3 --76.3047 --76.3109 --76.3047 --76.3125 --76.3172 --76.3172 --76.2984 --76.3 --76.3109 --76.3094 --76.3156 --76.2953 --76.2953 --76.2906 --76.3031 --76.2953 --76.2984 --76.2922 --76.3141 --76.3 --76.3047 --76.2984 --76.2891 --76.2969 --76.3078 --76.3125 --76.3047 --76.2859 --76.3141 --76.2953 --76.3078 --76.3172 --76.3094 --76.3156 --76.2984 --76.3078 --76.3109 --76.3 --76.3047 --76.2937 --76.2969 --76.3 --76.3078 --76.3109 --76.3016 --76.3 --76.3016 --76.2969 --76.2859 --76.2969 --76.2937 --76.2922 --76.2969 --76.2969 --76.2984 --76.3016 --76.3172 --76.2969 --76.3016 --76.3047 --76.2766 --76.2859 --76.3016 --76.2891 --76.3 --76.2828 --76.2844 --76.2937 --76.2922 --76.2937 --76.2906 --76.2969 --76.2922 --76.2891 --76.2859 --76.3063 --76.2891 --76.275 --76.2953 --76.3031 --76.2859 --76.2969 --76.2891 --76.2969 --76.2969 --76.2937 --76.2906 --76.3 --76.3 --76.3 --76.2859 --76.2875 --76.2937 --76.2969 --76.2828 --76.2953 --76.2844 --76.2891 --76.2984 --76.2937 --76.3109 --76.2953 --76.2984 --76.2937 --76.3031 --76.2922 --76.3063 --76.3016 --76.3016 --76.2969 --76.3109 --76.2953 --76.3016 --76.2969 --76.3 --76.2797 --76.3047 --76.3078 --76.2953 --76.2953 --76.2969 --76.3078 --76.3109 --76.2984 --76.3125 --76.2984 --76.3047 --76.2875 --76.2984 --76.3031 --76.2891 --76.2984 --76.2922 --76.2906 --76.2906 --76.2812 --76.2953 --76.3031 --76.2984 --76.2906 --76.2937 --76.2953 --76.2969 --76.2781 --76.2875 --76.2875 --76.2937 --76.2953 --76.2797 --76.2828 --76.2875 --76.2859 --76.2859 --76.2828 --76.2875 --76.2766 --76.2953 --76.2875 --76.2922 --76.2891 --76.2812 --76.2766 --76.2859 --76.2953 --76.2766 --76.2937 --76.2891 --76.2828 --76.3 --76.2906 --76.2937 --76.2656 --76.2969 --76.2969 --76.2844 --76.3063 --76.2844 --76.2812 --76.2797 --76.2812 --76.2906 --76.2688 --76.2766 --76.2844 --76.2844 --76.2906 --76.2797 --76.2797 --76.2656 --76.2766 --76.2828 --76.2859 --76.2875 --76.2734 --76.2688 --76.2812 --76.2641 --76.2719 --76.2672 --76.2766 --76.2797 --76.2766 --76.2922 --76.275 --76.2906 --76.2797 --76.2797 --76.2625 --76.2875 --76.2891 --76.2953 --76.2891 --76.2859 --76.2797 --76.2953 --76.2922 --76.2797 --76.2953 --76.275 --76.2969 --76.2844 --76.2812 --76.2906 --76.2891 --76.2844 --76.2875 --76.2937 --76.2859 --76.2781 --76.2984 --76.2984 --76.2797 --76.2781 --76.2828 --76.275 --76.2891 --76.2703 --76.2734 --76.2859 --76.3 --76.2937 --76.3 --76.3016 --76.2844 --76.2812 --76.2984 --76.2953 --76.275 --76.2953 --76.2859 --76.2781 --76.2781 --76.2906 --76.2812 --76.2781 --76.2859 --76.2828 --76.2797 --76.2672 --76.2859 --76.2672 --76.275 --76.2766 --76.2891 --76.2906 --76.2812 --76.2891 --76.2812 --76.2844 --76.275 --76.2734 --76.2703 --76.2875 --76.2781 --76.2797 --76.2859 --76.2844 --76.2766 --76.2859 --76.2891 --76.2875 --76.2875 --76.2766 --76.2875 --76.2891 --76.2812 --76.2688 --76.2891 --76.2906 --76.2937 --76.2797 --76.2703 --76.2734 --76.2844 --76.2781 --76.275 --76.2625 --76.2703 --76.2844 --76.2656 --76.2828 --76.2859 --76.2891 --76.2734 --76.2891 --76.2844 --76.275 --76.2656 --76.2781 --76.2844 --76.2812 --76.2734 --76.2719 --76.2781 --76.2578 --76.2625 --76.2625 --76.2703 --76.2609 --76.2688 --76.2734 --76.2625 --76.2641 --76.2766 --76.2859 --76.2594 --76.2547 --76.2641 --76.2703 --76.2641 --76.2828 --76.2719 --76.2625 --76.2672 --76.275 --76.2703 --76.2719 --76.2688 --76.2703 --76.2609 --76.2656 --76.2719 --76.2703 --76.275 --76.2672 --76.2688 --76.2672 --76.2688 --76.2625 --76.2734 --76.275 --76.2656 --76.2734 --76.2688 --76.2609 --76.2688 --76.2719 --76.2734 --76.2719 --76.2625 --76.2688 --76.2719 --76.2656 --76.2672 --76.2672 --76.275 --76.2562 --76.275 --76.2656 --76.2672 --76.2641 --76.2703 --76.2734 --76.275 --76.2641 --76.275 --76.2547 --76.2703 --76.2578 --76.2516 --76.2641 --76.2672 --76.2656 --76.2688 --76.2641 --76.2594 --76.2672 --76.275 --76.2516 --76.2609 --76.2672 --76.2703 --76.2656 --76.2594 --76.2547 --76.2594 --76.2562 --76.2688 --76.2594 --76.2719 --76.2641 --76.2719 --76.2781 --76.2562 --76.2594 --76.2625 --76.2688 --76.2641 --76.2812 --76.2781 --76.2781 --76.2781 --76.2766 --76.2734 --76.2656 --76.2672 --76.2703 --76.2828 --76.2719 --76.2766 --76.275 --76.2719 --76.2656 --76.2703 --76.2766 --76.275 --76.2828 --76.2766 --76.2875 --76.275 --76.2828 --76.2719 --76.2578 --76.2781 --76.2766 --76.2781 --76.2688 --76.2672 --76.2594 --76.2734 --76.2672 --76.2719 --76.2781 --76.2641 --76.275 --76.2688 --76.2672 --76.2766 --76.2844 --76.2875 --76.2766 --76.2719 --76.2734 --76.2641 --76.2672 --76.2641 --76.2875 --76.2875 --76.2828 --76.2719 --76.2812 --76.275 --76.2844 --76.2797 --76.2766 --76.2719 --76.2922 --76.2828 --76.2672 --76.2844 --76.2766 --76.2797 --76.2766 --76.2781 --76.2797 --76.2672 --76.2688 --76.2609 --76.2625 --76.2781 --76.2609 --76.2734 --76.2656 --76.2703 --76.2656 --76.2641 --76.2703 --76.2641 --76.2688 --76.2578 --76.2547 --76.2656 --76.2688 --76.2625 --76.2625 --76.2594 --76.2641 --76.2688 --76.2641 --76.2578 --76.2594 --76.2641 --76.2656 --76.2672 --76.2641 --76.2578 --76.2641 --76.2672 --76.2812 --76.2641 --76.2516 --76.2703 --76.25 --76.275 --76.2641 --76.2609 --76.2641 --76.2641 --76.2719 --76.2672 --76.2562 --76.2594 --76.2688 --76.2672 --76.2641 --76.2625 --76.275 --76.2688 --76.2484 --76.2688 --76.2609 --76.2656 --76.2719 --76.2719 --76.2641 --76.2703 --76.2656 --76.2641 --76.2625 --76.2703 --76.2719 --76.2703 --76.2703 --76.2609 --76.275 --76.2625 --76.2703 --76.2641 --76.2719 --76.2703 --76.2656 --76.2625 --76.2719 --76.2734 --76.2703 --76.275 --76.2703 --76.2688 --76.2781 --76.2781 --76.2641 --76.2703 --76.2812 --76.2781 --76.2688 --76.2688 --76.275 --76.2734 --76.275 --76.2812 --76.2781 --76.2844 --76.2625 --76.2734 --76.2719 --76.2656 --76.2641 --76.2797 --76.2812 --76.2719 --76.2672 --76.2797 --76.2812 --76.2828 --76.2781 --76.2672 --76.2656 --76.2734 --76.2641 --76.2703 --76.2703 --76.2734 --76.2578 --76.2734 --76.2484 --76.2703 --76.2688 --76.2703 --76.2734 --76.2719 --76.2688 --76.2656 --76.2703 --76.2562 --76.2703 --76.2828 --76.2609 --76.2531 --76.2609 --76.2703 --76.2719 --76.2766 --76.2484 --76.2594 --76.275 --76.2766 --76.2688 --76.2438 --76.2594 --76.2734 --76.2641 --76.2641 --76.2594 --76.2641 --76.2641 --76.2656 --76.2734 --76.2609 --76.2672 --76.2688 --76.2734 --76.2625 --76.2734 --76.2656 --76.2656 --76.2734 --76.2719 --76.2734 --76.2703 --76.2797 --76.2734 --76.2609 --76.2594 --76.2703 --76.2656 --76.2578 --76.2703 --76.2734 --76.2562 --76.2781 --76.2594 --76.2688 --76.2656 --76.2609 --76.2594 --76.2703 --76.2766 --76.2562 --76.2719 --76.2547 --76.2547 --76.2578 --76.2688 --76.2641 --76.2578 --76.2641 --76.2672 --76.2688 --76.2547 --76.2578 --76.2328 --76.2422 --76.2594 --76.2594 --76.2547 --76.25 --76.2641 --76.2625 --76.2719 --76.2719 --76.2594 --76.2641 --76.2562 --76.2625 --76.2641 --76.2547 --76.2609 --76.2562 --76.2547 --76.2562 --76.2531 --76.2469 --76.2688 --76.2516 --76.2578 --76.2625 --76.2516 --76.2625 --76.2531 --76.2578 --76.2641 --76.2688 --76.2672 --76.2625 --76.2719 --76.2672 --76.2688 --76.25 --76.2562 --76.2688 --76.2641 --76.2625 --76.2734 --76.2594 --76.2688 --76.2531 --76.2562 --76.2656 --76.2688 --76.2531 --76.2656 --76.2562 --76.2672 --76.2766 --76.2531 --76.2562 --76.2562 --76.2672 --76.2562 --76.2766 --76.2688 --76.2516 --76.275 --76.2594 --76.2578 --76.2516 --76.2641 --76.2625 --76.2453 --76.2609 --76.2578 --76.2562 --76.2531 --76.2609 --76.2531 --76.25 --76.2531 --76.2531 --76.2547 --76.2688 --76.2516 --76.2578 --76.2578 --76.2594 --76.2594 --76.2344 --76.25 --76.2625 --76.2453 --76.2469 --76.2734 --76.2531 --76.2547 --76.2531 --76.2531 --76.2641 --76.2578 --76.25 --76.2547 --76.2641 --76.2609 --76.2484 --76.2641 --76.25 --76.2406 --76.2516 --76.2312 --76.2438 --76.2484 --76.2516 --76.2547 --76.2594 --76.2531 --76.2609 --76.2531 --76.2578 --76.2453 --76.2547 --76.2484 --76.2578 --76.2406 --76.2469 --76.25 --76.2469 --76.2422 --76.2531 --76.2625 --76.2422 --76.2516 --76.2359 --76.2547 --76.25 --76.2594 --76.2547 --76.2547 --76.2578 --76.2516 --76.25 --76.2531 --76.2516 --76.2438 --76.2578 --76.2453 --76.2438 --76.2531 --76.2562 --76.2438 --76.2484 --76.2422 --76.2609 --76.2422 --76.25 --76.2469 --76.2391 --76.2516 --76.2609 --76.2469 --76.2391 --76.2609 --76.2297 --76.2453 --76.25 --76.2438 --76.2516 --76.2672 --76.2625 --76.2469 --76.2469 --76.2484 --76.25 --76.2656 --76.2547 --76.2516 --76.2562 --76.2594 --76.2484 --76.2484 --76.2422 --76.2562 --76.2531 --76.2422 --76.2594 --76.2594 --76.2406 --76.2484 --76.2641 --76.2453 --76.2344 --76.2594 --76.25 --76.2469 --76.2438 --76.2516 --76.2375 --76.2594 --76.2438 --76.2438 --76.2625 --76.2562 --76.25 --76.2547 --76.2562 --76.2359 --76.25 --76.2422 --76.2453 --76.2344 --76.2375 --76.2375 --76.2453 --76.2422 --76.2344 --76.2375 --76.2375 --76.2344 --76.2469 --76.2312 --76.2391 --76.2375 --76.2281 --76.2344 --76.2359 --76.2406 --76.2375 --76.2359 --76.2469 --76.2375 --76.2422 --76.2422 --76.2531 --76.2391 --76.2328 --76.2375 --76.2422 --76.2375 --76.2438 --76.2297 --76.2438 --76.2406 --76.2391 --76.2375 --76.2469 --76.2359 --76.2219 --76.2422 --76.2422 --76.2422 --76.2312 --76.2172 --76.2453 --76.2406 --76.25 --76.2422 --76.2359 --76.2391 --76.2359 --76.2438 --76.2281 --76.225 --76.2344 --76.2375 --76.2344 --76.2281 --76.2344 --76.2484 --76.25 --76.2375 --76.2406 --76.2344 --76.2312 --76.2406 --76.225 --76.2375 --76.2328 --76.2203 --76.2422 --76.2328 --76.2172 --76.2391 --76.2391 --76.2281 --76.2328 --76.2281 --76.2312 --76.2406 --76.2422 --76.2422 --76.2484 --76.2281 --76.2562 --76.2438 --76.2328 --76.2531 --76.2375 --76.2203 --76.2516 --76.2406 --76.2391 --76.2297 --76.2391 --76.2438 --76.2484 --76.2375 --76.2453 --76.2375 --76.2344 --76.2359 --76.2438 --76.2328 --76.2422 --76.2438 --76.2438 --76.2391 --76.2469 --76.2547 --76.2453 --76.2375 --76.2359 --76.2438 --76.2328 --76.2453 --76.2391 --76.2422 --76.2406 --76.2375 --76.2359 --76.2531 --76.2469 --76.2484 --76.2609 --76.2469 --76.2469 --76.2484 --76.2438 --76.2484 --76.2609 --76.2234 --76.2375 --76.2266 --76.2438 --76.2438 --76.2562 --76.2406 --76.2344 --76.2453 --76.2406 --76.2422 --76.2469 --76.2391 --76.2562 --76.2438 --76.2391 --76.2359 --76.2438 --76.2375 --76.2453 --76.2344 --76.2359 --76.2344 --76.2406 --76.2281 --76.2125 --76.25 --76.2438 --76.2406 --76.2406 --76.2391 --76.2375 --76.2297 --76.2359 --76.2359 --76.2516 --76.25 --76.2359 --76.2406 --76.2438 --76.2422 --76.25 --76.2344 --76.2391 --76.2281 --76.2359 --76.2391 --76.2234 --76.2266 --76.2266 --76.2344 --76.2234 --76.2406 --76.225 --76.225 --76.2312 --76.2312 --76.2359 --76.2281 --76.2375 --76.2188 --76.2438 --76.2344 --76.2375 --76.2312 --76.2344 --76.2172 --76.2406 --76.2422 --76.2422 --76.225 --76.2359 --76.2375 --76.2344 --76.2484 --76.2234 --76.2391 --76.2297 --76.2328 --76.2375 --76.2328 --76.2469 --76.2281 --76.2484 --76.2422 --76.2344 --76.2422 --76.2312 --76.2422 --76.2391 --76.2484 --76.2391 --76.2484 --76.25 --76.2312 --76.2516 --76.2484 --76.2391 --76.2422 --76.2375 --76.2562 --76.2453 --76.2484 --76.2438 --76.2406 --76.2438 --76.2422 --76.2453 --76.2359 --76.25 --76.2391 --76.2359 --76.2359 --76.2234 --76.25 --76.2391 --76.2438 --76.2438 --76.2453 --76.2531 --76.2422 --76.2406 --76.2469 --76.2312 --76.2438 --76.2438 --76.2422 --76.2484 --76.2438 --76.2422 --76.2281 --76.2391 --76.2375 --76.2453 --76.2281 --76.2344 --76.2281 --76.2391 --76.2359 --76.2281 --76.2234 --76.2375 --76.2328 --76.2312 --76.2344 --76.2375 --76.2234 --76.2375 --76.2312 --76.2438 --76.2234 --76.2219 --76.2125 --76.225 --76.2281 --76.2312 --76.2375 --76.225 --76.2344 --76.2125 --76.2375 --76.2359 --76.225 --76.2391 --76.2391 --76.2266 --76.2359 --76.2266 --76.2406 --76.2344 --76.2219 --76.2234 --76.2391 --76.2344 --76.225 --76.2219 --76.2375 --76.225 --76.2297 --76.2297 --76.2312 --76.225 --76.2203 --76.2422 --76.2125 --76.2188 --76.2203 --76.2172 --76.225 --76.2234 --76.2219 --76.2266 --76.2312 --76.2281 --76.2281 --76.2297 --76.2234 --76.2359 --76.2188 --76.2297 --76.2344 --76.2234 --76.2125 --76.2391 --76.2203 --76.2188 --76.2172 --76.2266 --76.2219 --76.2406 --76.2266 --76.2203 --76.2391 --76.2219 --76.2328 --76.2188 --76.2359 --76.2328 --76.2266 --76.2234 --76.2281 --76.2266 --76.2188 --76.2266 --76.2234 --76.2188 --76.2219 --76.2328 --76.2422 --76.2234 --76.2312 --76.2266 --76.2234 --76.2156 --76.2359 --76.2281 --76.2297 --76.2266 --76.2203 --76.2328 --76.2141 --76.2188 --76.225 --76.2219 --76.2234 --76.2312 --76.2141 --76.2297 --76.2328 --76.2172 --76.2109 --76.225 --76.2125 --76.2156 --76.2234 --76.2094 --76.2109 --76.2297 --76.2281 --76.2125 --76.2188 --76.2172 --76.2219 --76.225 --76.2297 --76.2312 --76.2266 --76.225 --76.2297 --76.2219 --76.2328 --76.2328 --76.2266 --76.2188 --76.2219 --76.2266 --76.2219 --76.2312 --76.2328 --76.2188 --76.2281 --76.225 --76.2297 --76.2203 --76.2219 --76.225 --76.2172 --76.2266 --76.2297 --76.2312 --76.2312 --76.2156 --76.2422 --76.2375 --76.2219 --76.2234 --76.2188 --76.2297 --76.2219 --76.2312 --76.2406 --76.2344 --76.2219 --76.2266 --76.2203 --76.2406 --76.2297 --76.2156 --76.2375 --76.225 --76.2328 --76.2312 --76.2203 --76.2094 --76.2375 --76.2172 --76.2156 --76.2109 --76.2188 --76.2328 --76.2203 --76.2203 --76.2203 --76.2281 --76.2234 --76.2312 --76.2281 --76.2234 --76.2281 --76.2297 --76.2375 --76.2203 --76.2203 --76.2219 --76.2109 --76.225 --76.2188 --76.2297 --76.2141 --76.2141 --76.2203 --76.2094 --76.2078 --76.2234 --76.2063 --76.2141 --76.2109 --76.2094 --76.2125 --76.2109 --76.2203 --76.2125 --76.225 --76.2141 --76.2172 --76.225 --76.2234 --76.2156 --76.2172 --76.2172 --76.2203 --76.2031 --76.2188 --76.2219 --76.2281 --76.2281 --76.2094 --76.2172 --76.2266 --76.2141 --76.2063 --76.2281 --76.225 --76.2125 --76.2094 --76.2094 --76.2266 --76.2156 --76.2094 --76.2328 --76.2203 --76.2203 --76.2234 --76.2078 --76.2172 --76.2234 --76.2094 --76.2172 --76.2063 --76.2078 --76.2234 --76.2203 --76.2234 --76.2219 --76.2188 --76.2234 --76.2219 --76.2281 --76.2266 --76.2234 --76.2234 --76.2266 --76.225 --76.2297 --76.2156 --76.2156 --76.225 --76.2109 --76.2297 --76.2203 --76.2312 --76.2141 --76.2141 --76.2219 --76.2125 --76.2078 --76.2297 --76.2141 --76.225 --76.2234 --76.2219 --76.2156 --76.2063 --76.2094 --76.2141 --76.2219 --76.1984 --76.2016 --76.2141 --76.2172 --76.2219 --76.2094 --76.2109 --76.2203 --76.2141 --76.2219 --76.2188 --76.2156 --76.2203 --76.2203 --76.2172 --76.2109 --76.2188 --76.2234 --76.2219 --76.2063 --76.2 --76.2063 --76.2078 --76.2266 --76.2125 --76.2281 --76.2109 --76.225 --76.2172 --76.2141 --76.225 --76.2109 --76.2109 --76.2141 --76.2031 --76.2203 --76.2141 --76.2063 --76.2094 --76.2047 --76.2156 --76.1891 --76.2078 --76.2188 --76.2031 --76.2203 --76.1969 --76.2047 --76.2094 --76.2031 --76.2016 --76.1984 --76.2047 --76.2094 --76.2156 --76.2016 --76.2094 --76.2141 --76.2047 --76.2078 --76.2109 --76.2156 --76.1984 --76.2109 --76.2188 --76.2031 --76.2188 --76.2078 --76.2094 --76.2031 --76.2094 --76.2094 --76.2094 --76.225 --76.2344 --76.2063 --76.2156 --76.2156 --76.2094 --76.2078 --76.2094 --76.2203 --76.2141 --76.2094 --76.2063 --76.2125 --76.2141 --76.2344 --76.1969 --76.2125 --76.1984 --76.2078 --76.1984 --76.1953 --76.2063 --76.2141 --76.2016 --76.2063 --76.2109 --76.2063 --76.2094 --76.2031 --76.2125 --76.1875 --76.2141 --76.2141 --76.2109 --76.2016 --76.2016 --76.2141 --76.2172 --76.2094 --76.2125 --76.2031 --76.2094 --76.2109 --76.2156 --76.2094 --76.2016 --76.2125 --76.2031 --76.1984 --76.2047 --76.2141 --76.2094 --76.2109 --76.2188 --76.2 --76.2094 --76.2156 --76.2141 --76.2078 --76.2031 --76.2031 --76.2156 --76.2156 --76.2109 --76.2141 --76.2016 --76.2156 --76.2078 --76.2078 --76.2 --76.2172 --76.2156 --76.1937 --76.2031 --76.2203 --76.2141 --76.1969 --76.2047 --76.2078 --76.2203 --76.2063 --76.2031 --76.2109 --76.2047 --76.2047 --76.2188 --76.2172 --76.2094 --76.2047 --76.2016 --76.2047 --76.2156 --76.2094 --76.2141 --76.2141 --76.2188 --76.225 --76.2156 --76.2203 --76.2 --76.2281 --76.2188 --76.2266 --76.2203 --76.2016 --76.2063 --76.2109 --76.2188 --76.2141 --76.2047 --76.2047 --76.1984 --76.2156 --76.2047 --76.2094 --76.2063 --76.1922 --76.2063 --76.1922 --76.1984 --76.2172 --76.1953 --76.2 --76.1984 --76.2156 --76.2047 --76.2094 --76.2094 --76.2 --76.1922 --76.2172 --76.2094 --76.2219 --76.2125 --76.2063 --76.2031 --76.2094 --76.2078 --76.2078 --76.2188 --76.1984 --76.2078 --76.2141 --76.2047 --76.2 --76.2109 --76.2 --76.2125 --76.2031 --76.2125 --76.2094 --76.1984 --76.2063 --76.2094 --76.1969 --76.2016 --76.2188 --76.2109 --76.2078 --76.2063 --76.2156 --76.1937 --76.2047 --76.1969 --76.2109 --76.2156 --76.2016 --76.1953 --76.2047 --76.2203 --76.2141 --76.2078 --76.2047 --76.2109 --76.1984 --76.2078 --76.2188 --76.2188 --76.2328 --76.2047 --76.2203 --76.2125 --76.2047 --76.2219 --76.2234 --76.2016 --76.2141 --76.2031 --76.2109 --76.2047 --76.2031 --76.2125 --76.2172 --76.1937 --76.2125 --76.2172 --76.2172 --76.2047 --76.2031 --76.2063 --76.2109 --76.2016 --76.2047 --76.1937 --76.1969 --76.2016 --76.2063 --76.1922 --76.1969 --76.2109 --76.2109 --76.2 --76.1922 --76.2063 --76.1984 --76.2047 --76.2109 --76.2063 --76.225 --76.1922 --76.2141 --76.2141 --76.2156 --76.1953 --76.2031 --76.2125 --76.2078 --76.2016 --76.2219 --76.2156 --76.2078 --76.2078 --76.2063 --76.2094 --76.1922 --76.2016 --76.1969 --76.2063 --76.2109 --76.2141 --76.2 --76.2109 --76.1828 --76.2047 --76.2031 --76.2031 --76.2156 --76.1969 --76.2141 --76.2047 --76.2172 --76.2047 --76.2063 --76.2031 --76.2141 --76.1984 --76.2063 --76.2016 --76.1953 --76.1891 --76.1984 --76.1953 --76.1969 --76.2109 --76.2094 --76.1937 --76.2031 --76.2109 --76.2125 --76.2219 --76.2219 --76.2047 --76.2078 --76.2063 --76.2 --76.2047 --76.2031 --76.2047 --76.1969 --76.2141 --76.2063 --76.1875 --76.1906 --76.2078 --76.1781 --76.1891 --76.1922 --76.1953 --76.1859 --76.1875 --76.1906 --76.2 --76.2125 --76.1969 --76.1922 --76.2109 --76.2109 --76.1984 --76.2 --76.2063 --76.2031 --76.2 --76.2172 --76.2 --76.2078 --76.2109 --76.1969 --76.1922 --76.1937 --76.1922 --76.1906 --76.1906 --76.1984 --76.2031 --76.1891 --76.2094 --76.1859 --76.1922 --76.1922 --76.1953 --76.2016 --76.2 --76.1859 --76.2016 --76.1953 --76.1937 --76.1922 --76.1891 --76.1859 --76.1922 --76.2016 --76.2094 --76.1969 --76.2078 --76.1891 --76.2063 --76.1937 --76.2047 --76.2031 --76.1984 --76.1984 --76.1984 --76.1969 --76.2094 --76.1969 --76.1969 --76.2172 --76.1922 --76.2031 --76.2063 --76.2078 --76.1969 --76.2156 --76.2016 --76.1906 --76.2 --76.1969 --76.2 --76.1953 --76.2016 --76.1922 --76.2016 --76.1937 --76.1875 --76.1875 --76.1953 --76.1906 --76.1953 --76.1969 --76.1969 --76.1969 --76.2016 --76.1969 --76.2078 --76.1984 --76.1922 --76.1937 --76.1969 --76.2047 --76.1906 --76.1906 --76.1937 --76.2016 --76.2031 --76.1984 --76.1984 --76.1906 --76.1984 --76.1953 --76.1984 --76.1937 --76.1891 --76.1953 --76.1953 --76.2078 --76.1906 --76.2016 --76.1922 --76.2172 --76.1922 --76.1969 --76.1984 --76.2063 --76.1953 --76.1984 --76.2063 --76.2016 --76.1937 --76.1906 --76.1953 --76.1937 --76.2047 --76.1906 --76.2016 --76.2109 --76.1953 --76.1969 --76.2016 --76.2016 --76.1969 --76.1906 --76.2047 --76.1969 --76.2109 --76.2141 --76.1922 --76.2047 --76.2016 --76.2078 --76.1953 --76.2047 --76.2109 --76.1984 --76.1937 --76.2031 --76.1891 --76.2031 --76.2078 --76.2031 --76.2047 --76.2156 --76.1953 --76.2078 --76.1953 --76.2 --76.2094 --76.2016 --76.2063 --76.1953 --76.2094 --76.2047 --76.1969 --76.1953 --76.2063 --76.1984 --76.1984 --76.1906 --76.1891 --76.1922 --76.1875 --76.1937 --76.1875 --76.1844 --76.2047 --76.1922 --76.1859 --76.1906 --76.1906 --76.1766 --76.1922 --76.1844 --76.175 --76.1875 --76.2 --76.1937 --76.1844 --76.1953 --76.175 --76.2031 --76.2031 --76.1984 --76.1891 --76.2016 --76.2016 --76.1953 --76.2016 --76.1937 --76.1891 --76.1859 --76.1906 --76.1937 --76.2 --76.1922 --76.1953 --76.1891 --76.1891 --76.1766 --76.1875 --76.2 --76.1797 --76.1875 --76.1875 --76.1906 --76.1859 --76.1797 --76.1844 --76.1891 --76.2031 --76.1953 --76.1953 --76.1859 --76.2031 --76.1875 --76.1922 --76.1984 --76.1937 --76.2016 --76.1922 --76.1859 --76.1969 --76.1953 --76.1953 --76.2063 --76.2094 --76.2141 --76.2094 --76.1922 --76.1984 --76.1969 --76.2063 --76.1969 --76.1891 --76.1984 --76.1953 --76.1906 --76.1937 --76.1875 --76.1922 --76.1922 --76.1937 --76.2 --76.1797 --76.1937 --76.2 --76.1906 --76.2 --76.1875 --76.1906 --76.1984 --76.2 --76.2031 --76.1844 --76.2 --76.1828 --76.1953 --76.2094 --76.1969 --76.2078 --76.1953 --76.1984 --76.2141 --76.2047 --76.1969 --76.1937 --76.2125 --76.2 --76.2031 --76.2063 --76.2063 --76.2 --76.2 --76.1922 --76.2031 --76.1969 --76.2047 --76.2047 --76.1984 --76.1922 --76.1906 --76.1828 --76.1844 --76.2016 --76.1922 --76.2109 --76.2188 --76.1906 --76.1984 --76.1922 --76.2031 --76.1906 --76.2063 --76.2016 --76.2094 --76.2031 --76.1875 --76.2031 --76.1969 --76.1828 --76.2078 --76.1906 --76.1813 --76.1766 --76.1875 --76.2016 --76.1891 --76.1953 --76.1875 --76.2078 --76.1922 --76.1937 --76.1953 --76.1906 --76.1875 --76.1922 --76.1906 --76.1844 --76.1859 --76.1906 --76.1969 --76.1891 --76.1875 --76.1781 --76.1937 --76.2016 --76.1922 --76.1969 --76.1813 --76.2078 --76.1797 --76.1984 --76.1875 --76.1875 --76.2016 --76.1797 --76.1797 --76.1813 --76.1891 --76.1891 --76.175 --76.1922 --76.1766 --76.1734 --76.1906 --76.1844 --76.1734 --76.1844 --76.1875 --76.1984 --76.1906 --76.1922 --76.2 --76.1969 --76.1922 --76.2109 --76.1969 --76.2094 --76.2031 --76.1906 --76.2016 --76.1922 --76.1875 --76.2016 --76.1859 --76.1813 --76.1891 --76.1766 --76.1687 --76.1906 --76.1828 --76.1922 --76.2047 --76.1984 --76.2047 --76.1891 --76.1953 --76.1937 --76.1891 --76.1844 --76.1984 --76.1828 --76.1891 --76.1953 --76.2016 --76.2 --76.1984 --76.2125 --76.2109 --76.2 --76.2094 --76.2 --76.1937 --76.1984 --76.1984 --76.2078 --76.1984 --76.2047 --76.2063 --76.2047 --76.2031 --76.1906 --76.1953 --76.1891 --76.2031 --76.1922 --76.2109 --76.1891 --76.1906 --76.2 --76.2031 --76.1859 --76.1922 --76.1828 --76.2125 --76.2094 --76.1969 --76.2 --76.1969 --76.1859 --76.2 --76.2063 --76.1953 --76.2047 --76.2109 --76.2031 --76.1922 --76.2063 --76.2016 --76.2078 --76.1984 --76.1922 --76.1969 --76.1937 --76.2078 --76.1813 --76.2047 --76.1953 --76.2016 --76.1937 --76.1891 --76.1969 --76.1781 --76.1969 --76.1891 --76.1813 --76.1813 --76.2141 --76.2078 --76.1937 --76.1891 --76.2031 --76.2016 --76.1984 --76.1937 --76.1984 --76.1953 --76.1953 --76.1953 --76.2016 --76.1922 --76.1953 --76.2016 --76.1969 --76.1922 --76.1953 --76.2031 --76.2078 --76.2078 --76.2094 --76.2031 --76.2016 --76.1969 --76.1953 --76.1906 --76.1906 --76.2063 --76.1969 --76.2063 --76.2078 --76.2109 --76.2188 --76.1969 --76.2094 --76.1844 --76.1922 --76.1922 --76.1922 --76.2047 --76.2016 --76.2031 --76.1922 --76.1984 --76.1813 --76.1984 --76.1922 --76.1766 --76.1813 --76.2016 --76.1922 --76.2 --76.1906 --76.2047 --76.1969 --76.1969 --76.2047 --76.2063 --76.2016 --76.2078 --76.1984 --76.2031 --76.1875 --76.2 --76.1984 --76.1906 --76.1984 --76.1953 --76.1875 --76.1969 --76.2 --76.1969 --76.1891 --76.1969 --76.1922 --76.2063 --76.1797 --76.1891 --76.1844 --76.1922 --76.1922 --76.1891 --76.1969 --76.1797 --76.2016 --76.1937 --76.1875 --76.1969 --76.1906 --76.2 --76.1766 --76.1891 --76.1906 --76.2047 --76.1922 --76.1953 --76.1875 --76.1781 --76.1844 --76.2063 --76.1969 --76.1906 --76.2016 --76.1984 --76.2094 --76.2 --76.1984 --76.2078 --76.2063 --76.2141 --76.2047 --76.1844 --76.1906 --76.1859 --76.1969 --76.1844 --76.1937 --76.1813 --76.1937 --76.2 --76.1984 --76.1844 --76.1969 --76.1891 --76.1922 --76.1844 --76.2078 --76.1828 --76.1953 --76.1922 --76.1937 --76.1984 --76.1906 --76.1984 --76.1891 --76.2 --76.2031 --76.1984 --76.2 --76.1969 --76.1766 --76.1906 --76.1797 --76.1984 --76.1797 --76.1922 --76.1937 --76.1859 --76.1859 --76.1844 --76.1859 --76.2016 --76.1906 --76.1859 --76.1969 --76.1891 --76.1891 --76.2016 --76.2031 --76.1875 --76.2016 --76.1859 --76.1906 --76.1984 --76.2016 --76.1859 --76.1937 --76.1922 --76.2078 --76.1813 --76.1906 --76.1906 --76.2 --76.1828 --76.1906 --76.1984 --76.1875 --76.1875 --76.1906 --76.1969 --76.1922 --76.175 --76.1844 --76.1734 --76.1828 --76.1781 --76.1766 --76.1734 --76.1719 --76.1984 --76.2 --76.1969 --76.1797 --76.1891 --76.1922 --76.1875 --76.1891 --76.1875 --76.1859 --76.2031 --76.1766 --76.1875 --76.1969 --76.1766 --76.1875 --76.1953 --76.1937 --76.1875 --76.2031 --76.1937 --76.1891 --76.1922 --76.1797 --76.2 --76.1937 --76.1797 --76.1844 --76.1875 --76.1844 --76.1859 --76.1906 --76.2016 --76.1797 --76.1953 --76.1859 --76.1859 --76.1766 --76.1813 --76.1859 --76.1766 --76.1922 --76.1813 --76.2063 --76.1813 --76.1844 --76.1875 --76.2 --76.1875 --76.2016 --76.2031 --76.1797 --76.2047 --76.2047 --76.2172 --76.1969 --76.1953 --76.1937 --76.1875 --76.2063 --76.1813 --76.1875 --76.2016 --76.1797 --76.1969 --76.1844 --76.1922 --76.1766 --76.1953 --76.1781 --76.1719 --76.1969 --76.1641 --76.1797 --76.175 --76.1703 --76.1906 --76.1844 --76.1922 --76.175 --76.1969 --76.1906 --76.1937 --76.175 --76.1953 --76.1734 --76.1719 --76.1906 --76.1844 --76.1828 --76.1984 --76.1797 --76.1844 --76.1859 --76.175 --76.1891 --76.1781 --76.1875 --76.1937 --76.1875 --76.1875 --76.1875 --76.1906 --76.1937 --76.1906 --76.1875 --76.1875 --76.1984 --76.1969 --76.1953 --76.1859 --76.2078 --76.1953 --76.1797 --76.2031 --76.1875 --76.1906 --76.1922 --76.2016 --76.1875 --76.1797 --76.1984 --76.1891 --76.1859 --76.1953 --76.1906 --76.1922 --76.2 --76.1906 --76.2109 --76.1875 --76.1906 --76.1953 --76.1937 --76.1969 --76.1922 --76.1984 --76.2156 --76.1984 --76.2016 --76.2047 --76.2063 --76.2078 --76.1828 --76.2016 --76.1969 --76.1875 --76.1875 --76.1891 --76.1875 --76.2078 --76.1891 --76.2016 --76.2031 --76.1953 --76.1875 --76.2016 --76.1953 --76.1953 --76.2047 --76.2031 --76.2 --76.2031 --76.1891 --76.1922 --76.2016 --76.2031 --76.1969 --76.1937 --76.1922 --76.2 --76.1813 --76.1859 --76.1906 --76.1937 --76.1937 --76.1813 --76.1766 --76.1937 --76.2063 --76.1922 --76.1937 --76.1859 --76.1891 --76.1891 --76.2047 --76.1906 --76.1984 --76.1922 --76.2094 --76.2 --76.2031 --76.1906 --76.1984 --76.2109 --76.1969 --76.2047 --76.1969 --76.2031 --76.1906 --76.2125 --76.2 --76.1906 --76.2125 --76.2156 --76.2031 --76.2063 --76.2172 --76.1953 --76.2047 --76.2 --76.2016 --76.1984 --76.1922 --76.1937 --76.1828 --76.1875 --76.2063 --76.1922 --76.2016 --76.1922 --76.2031 --76.1953 --76.1969 --76.2078 --76.1953 --76.1922 --76.1875 --76.1891 --76.2016 --76.1813 --76.1984 --76.2031 --76.1875 --76.1891 --76.1984 --76.1922 --76.1859 --76.2031 --76.1984 --76.1906 --76.2016 --76.1922 --76.1844 --76.1937 --76.1844 --76.1859 --76.1813 --76.1875 --76.1953 --76.1937 --76.1953 --76.2016 --76.1937 --76.2125 --76.1844 --76.1922 --76.1953 --76.1859 --76.1891 --76.2 --76.2 --76.2 --76.1953 --76.1922 --76.1828 --76.1906 --76.1984 --76.1844 --76.1797 --76.1859 --76.1766 --76.1797 --76.1891 --76.1891 --76.1937 --76.1844 --76.1859 --76.1875 --76.1859 --76.1937 --76.2 --76.1953 --76.1844 --76.1875 --76.1969 --76.1953 --76.2 --76.2031 --76.1922 --76.1937 --76.1844 --76.2031 --76.1937 --76.1813 --76.1813 --76.1875 --76.1813 --76.1969 --76.1859 --76.1875 --76.1906 --76.1859 --76.1984 --76.1922 --76.1984 --76.1953 --76.1844 --76.1937 --76.1859 --76.2 --76.1766 --76.1844 --76.1797 --76.1844 --76.1844 --76.2016 --76.1969 --76.1922 --76.2031 --76.1859 --76.1937 --76.2063 --76.1906 --76.1781 --76.1937 --76.1937 --76.1984 --76.2016 --76.1906 --76.1969 --76.1844 --76.1984 --76.1859 --76.1875 --76.1875 --76.1953 --76.2078 --76.2016 --76.2 --76.1859 --76.1937 --76.1953 --76.2016 --76.1953 --76.1859 --76.1937 --76.1969 --76.1781 --76.1875 --76.2016 --76.1984 --76.1937 --76.2016 --76.1953 --76.1969 --76.1859 --76.1813 --76.1922 --76.1828 --76.1953 --76.1953 --76.2063 --76.1813 --76.1875 --76.2031 --76.1813 --76.1781 --76.1703 --76.1844 --76.2016 --76.1813 --76.1781 --76.1875 --76.1891 --76.1875 --76.1844 --76.1844 --76.1859 --76.1891 --76.1906 --76.1906 --76.1906 --76.1891 --76.1859 --76.1781 --76.1844 --76.1969 --76.1844 --76.1937 --76.1969 --76.1813 --76.1844 --76.1875 --76.1813 --76.175 --76.1828 --76.1859 --76.1844 --76.2016 --76.1797 --76.1922 --76.1797 --76.1734 --76.1922 --76.1906 --76.2047 --76.1813 --76.1984 --76.1891 --76.1922 --76.1672 --76.1906 --76.1953 --76.1891 --76.1859 --76.1953 --76.1891 --76.1781 --76.1984 --76.1969 --76.1797 --76.1953 --76.1906 --76.1859 --76.1891 --76.1797 --76.1766 --76.1859 --76.1969 --76.1859 --76.1844 --76.1922 --76.1813 --76.1844 --76.1703 --76.1813 --76.1906 --76.1859 --76.1781 --76.1922 --76.1875 --76.1922 --76.175 --76.2016 --76.1891 --76.1922 --76.1969 --76.1813 --76.1844 --76.1828 --76.1906 --76.1828 --76.1719 --76.1766 --76.1781 --76.1828 --76.1844 --76.1922 --76.2094 --76.1906 --76.2 --76.2031 --76.2031 --76.1891 --76.1953 --76.1906 --76.175 --76.1969 --76.1828 --76.1891 --76.175 --76.1828 --76.1969 --76.1953 --76.1953 --76.1734 --76.1875 --76.1813 --76.1844 --76.2 --76.1953 --76.1922 --76.1969 --76.1859 --76.2078 --76.2094 --76.2 --76.2031 --76.1937 --76.2016 --76.2 --76.2047 --76.1969 --76.1844 --76.1953 --76.1891 --76.1813 --76.1766 --76.1922 --76.1922 --76.1859 --76.1891 --76.1828 --76.1781 --76.1844 --76.1937 --76.1953 --76.1969 --76.1922 --76.1766 --76.1766 --76.1906 --76.1859 --76.1906 --76.1813 --76.1891 --76.1984 --76.1875 --76.1875 --76.1859 --76.1906 --76.1797 --76.1906 --76.1844 --76.1891 --76.1844 --76.1766 --76.1813 --76.1828 --76.1859 --76.1969 --76.1781 --76.1828 --76.1906 --76.1859 --76.1859 --76.1797 --76.1859 --76.1781 --76.1734 --76.1828 --76.1781 --76.1875 --76.1781 --76.1906 --76.1828 --76.1828 --76.1875 --76.1813 --76.1906 --76.1906 --76.1781 --76.1844 --76.1906 --76.1766 --76.1875 --76.1813 --76.1766 --76.1766 --76.1859 --76.1828 --76.1781 --76.1672 --76.1828 --76.1859 --76.1844 --76.1906 --76.1797 --76.1781 --76.1844 --76.1922 --76.1891 --76.1828 --76.1797 --76.1719 --76.1844 --76.1813 --76.1875 --76.1734 --76.1813 --76.1875 --76.1766 --76.1859 --76.1813 --76.1656 --76.175 --76.1781 --76.175 --76.1656 --76.1875 --76.1641 --76.1687 --76.1734 --76.1625 --76.1719 --76.1531 --76.1547 --76.1578 --76.1656 --76.1609 --76.1609 --76.1797 --76.1719 --76.175 --76.1703 --76.1672 --76.1703 --76.1859 --76.1703 --76.1781 --76.1813 --76.1797 --76.1891 --76.1719 --76.1766 --76.1781 --76.175 --76.1641 --76.175 --76.1828 --76.1734 --76.1922 --76.1797 --76.1844 --76.1813 --76.1719 --76.1828 --76.1859 --76.1766 --76.1859 --76.1656 --76.175 --76.1828 --76.1672 --76.1687 --76.1719 --76.1844 --76.1609 --76.1672 --76.175 --76.1781 --76.1703 --76.1766 --76.1734 --76.1734 --76.1719 --76.1813 --76.1719 --76.1562 --76.1766 --76.1734 --76.1625 --76.1687 --76.1656 --76.1719 --76.1687 --76.1656 --76.1672 --76.1703 --76.1813 --76.1734 --76.1625 --76.1797 --76.1797 --76.1719 --76.1703 --76.1719 --76.1562 --76.1656 --76.1625 --76.1734 --76.1656 --76.1594 --76.1594 --76.1562 --76.1672 --76.1734 --76.1562 --76.1687 --76.1672 --76.1594 --76.1797 --76.1781 --76.175 --76.1734 --76.1703 --76.1844 --76.1781 --76.1781 --76.1672 --76.1766 --76.1766 --76.1781 --76.1766 --76.1719 --76.1703 --76.1687 --76.1797 --76.1734 --76.1625 --76.1672 --76.1609 --76.1766 --76.1562 --76.1703 --76.1703 --76.1844 --76.1797 --76.1672 --76.1641 --76.1656 --76.175 --76.1734 --76.1672 --76.1781 --76.1797 --76.1813 --76.1828 --76.1781 --76.1781 --76.1828 --76.1828 --76.1953 --76.1797 --76.1766 --76.1766 --76.1672 --76.1766 --76.1875 --76.1719 --76.1703 --76.1797 --76.1844 --76.1891 --76.1828 --76.1766 --76.1875 --76.1891 --76.1906 --76.1844 --76.1891 --76.1891 --76.1781 --76.1781 --76.1859 --76.1719 --76.1828 --76.1719 --76.175 --76.1813 --76.1641 --76.1875 --76.1797 --76.1766 --76.1859 --76.1781 --76.1687 --76.1672 --76.1891 --76.1766 --76.1844 --76.1797 --76.1891 --76.1891 --76.1734 --76.1703 --76.1906 --76.1766 --76.175 --76.1891 --76.1703 --76.1844 --76.1719 --76.1766 --76.1734 --76.1656 --76.1719 --76.1797 --76.1766 --76.1578 --76.1641 --76.1859 --76.1734 --76.1859 --76.1734 --76.1641 --76.1766 --76.1719 --76.1797 --76.1781 --76.1797 --76.1719 --76.1797 --76.1906 --76.1781 --76.1719 --76.1875 --76.1781 --76.1875 --76.1875 --76.175 --76.1797 --76.1797 --76.1891 --76.1859 --76.1891 --76.1719 --76.1781 --76.1781 --76.1844 --76.1703 --76.1844 --76.1828 --76.1734 --76.1859 --76.1797 --76.175 --76.1828 --76.1656 --76.1906 --76.1687 --76.1828 --76.1656 --76.1703 --76.1844 --76.175 --76.1687 --76.1609 --76.1813 --76.1594 --76.1625 --76.1781 --76.1813 --76.1844 --76.1734 --76.1641 --76.1844 --76.1734 --76.1828 --76.1859 --76.1844 --76.1719 --76.1859 --76.1906 --76.1813 --76.1766 --76.1906 --76.1672 --76.1813 --76.175 --76.1766 --76.1813 --76.1766 --76.1813 --76.1813 --76.1813 --76.1781 --76.1687 --76.1719 --76.1797 --76.1734 --76.1766 --76.175 --76.1734 --76.1703 --76.1641 --76.1719 --76.1781 --76.1719 --76.1891 --76.175 --76.1766 --76.1781 --76.1766 --76.1766 --76.1641 --76.1734 --76.1734 --76.1766 --76.1813 --76.1687 --76.1734 --76.1844 --76.1734 --76.1734 --76.1625 --76.1797 --76.1578 --76.175 --76.1813 --76.1734 --76.1766 --76.175 --76.1859 --76.1828 --76.1859 --76.1859 --76.1687 --76.1719 --76.175 --76.1719 --76.1734 --76.1656 --76.175 --76.1719 --76.175 --76.175 --76.1719 --76.1766 --76.175 --76.1734 --76.1781 --76.1719 --76.1828 --76.1609 --76.175 --76.1672 --76.1625 --76.175 --76.1797 --76.1828 --76.1625 --76.1719 --76.1719 --76.175 --76.1703 --76.1734 --76.1656 --76.1844 --76.1734 --76.1703 --76.1547 --76.1703 --76.1703 --76.1844 --76.1687 --76.1719 --76.175 --76.175 --76.1766 --76.1875 --76.1766 --76.1828 --76.1562 --76.1859 --76.1875 --76.1828 --76.1734 --76.1766 --76.1828 --76.1703 --76.1562 --76.1641 --76.1719 --76.1734 --76.1844 --76.1672 --76.1719 --76.1687 --76.1687 --76.1672 --76.1672 --76.1687 --76.1469 --76.175 --76.1797 --76.1672 --76.1687 --76.1703 --76.1766 --76.1703 --76.1703 --76.1797 --76.1687 --76.1734 --76.1719 --76.175 --76.1625 --76.1719 --76.175 --76.1781 --76.1641 --76.1813 --76.1703 --76.1703 --76.1797 --76.1734 --76.1813 --76.1766 --76.1687 --76.1547 --76.1703 --76.1641 --76.1781 --76.1781 --76.1734 --76.1687 --76.1672 --76.1766 --76.1781 --76.1781 --76.175 --76.1766 --76.1609 --76.1641 --76.175 --76.1656 --76.1781 --76.1609 --76.1562 --76.1672 --76.1797 --76.1891 --76.1781 --76.1844 --76.1937 --76.1828 --76.1891 --76.1766 --76.1687 --76.1813 --76.1813 --76.1687 --76.1687 --76.175 --76.175 --76.1703 --76.1687 --76.1656 --76.1813 --76.1609 --76.1734 --76.1625 --76.1734 --76.1687 --76.1781 --76.1766 --76.1656 --76.1703 --76.1875 --76.1656 --76.1781 --76.1719 --76.1703 --76.1734 --76.175 --76.175 --76.1672 --76.1672 --76.1687 --76.175 --76.1781 --76.175 --76.1656 --76.1594 --76.1562 --76.1609 --76.1719 --76.1672 --76.175 --76.1625 --76.1687 --76.1828 --76.1703 --76.175 --76.1719 --76.1797 --76.175 --76.1766 --76.1703 --76.1625 --76.1609 --76.1672 --76.1687 --76.1625 --76.1641 --76.1594 --76.1672 --76.1703 --76.1766 --76.1656 --76.1687 --76.1781 --76.1781 --76.1625 --76.1719 --76.1813 --76.1953 --76.1844 --76.1922 --76.1891 --76.1828 --76.1891 --76.1719 --76.1641 --76.1828 --76.1672 --76.1672 --76.1703 --76.1703 --76.1813 --76.1719 --76.1828 --76.1734 --76.1813 --76.1797 --76.1687 --76.1641 --76.1703 --76.1719 --76.1578 --76.1609 --76.1625 --76.1687 --76.1578 --76.175 --76.1734 --76.175 --76.1578 --76.1641 --76.1687 --76.1719 --76.1641 --76.1562 --76.1687 --76.1672 --76.1672 --76.1703 --76.1641 --76.1672 --76.1797 --76.1578 --76.1734 --76.1516 --76.1891 --76.1625 --76.1672 --76.1547 --76.1562 --76.1813 --76.1781 --76.1766 --76.1672 --76.1891 --76.1703 --76.1562 --76.1687 --76.1672 --76.1562 --76.1609 --76.1687 --76.1609 --76.1672 --76.1609 --76.1562 --76.1656 --76.1703 --76.1703 --76.1672 --76.1656 --76.1641 --76.1703 --76.1578 --76.1687 --76.1781 --76.1766 --76.1844 --76.1797 --76.1641 --76.1875 --76.1781 --76.1734 --76.1609 --76.1687 --76.1625 --76.1844 --76.1656 --76.1719 --76.1672 --76.15 --76.1766 --76.1797 --76.1672 --76.1813 --76.1734 --76.1672 --76.1844 --76.1875 --76.1719 --76.1781 --76.1766 --76.1781 --76.1734 --76.1609 --76.175 --76.1734 --76.1609 --76.1766 --76.1656 --76.175 --76.1719 --76.1734 --76.1875 --76.1844 --76.1672 --76.1734 --76.1844 --76.1656 --76.1719 --76.1703 --76.15 --76.1703 --76.1609 --76.1594 --76.1734 --76.1672 --76.1547 --76.1687 --76.1687 --76.1609 --76.1656 --76.1844 --76.1562 --76.1547 --76.1641 --76.1562 --76.1687 --76.1609 --76.1734 --76.1703 --76.1547 --76.1625 --76.1703 --76.1547 --76.1625 --76.1734 --76.1531 --76.1656 --76.1609 --76.1687 --76.1641 --76.1641 --76.1578 --76.1547 --76.1547 --76.1734 --76.1641 --76.1594 --76.1656 --76.1766 --76.1766 --76.1781 --76.1656 --76.175 --76.1734 --76.1719 --76.1703 --76.1813 --76.1609 --76.1641 --76.1813 --76.1859 --76.1734 --76.1687 --76.1656 --76.1813 --76.1609 --76.1719 --76.1609 --76.1484 --76.1781 --76.1609 --76.175 --76.1609 --76.1766 --76.1734 --76.1656 --76.1734 --76.1766 --76.1781 --76.1734 --76.1766 --76.1625 --76.1672 --76.1734 --76.1719 --76.1734 --76.1766 --76.1781 --76.1828 --76.1766 --76.1719 --76.1719 --76.1719 --76.1687 --76.1625 --76.175 --76.1656 --76.1703 --76.1547 --76.1594 --76.1672 --76.1656 --76.1656 --76.1656 --76.1641 --76.1516 --76.1641 --76.1516 --76.1547 --76.1609 --76.1562 --76.1516 --76.1578 --76.1625 --76.1766 --76.1656 --76.1734 --76.1687 --76.1766 --76.1531 --76.1641 --76.1656 --76.1625 --76.1641 --76.1641 --76.1625 --76.1687 --76.1562 --76.1656 --76.1672 --76.1625 --76.1719 --76.1562 --76.1562 --76.1609 --76.1516 --76.1531 --76.1625 --76.1703 --76.1594 --76.1687 --76.1703 --76.1703 --76.1719 --76.1656 --76.1594 --76.1672 --76.1578 --76.1656 --76.1531 --76.1719 --76.1719 --76.1672 --76.1766 --76.1547 --76.1609 --76.1547 --76.1562 --76.1562 --76.1578 --76.1578 --76.1562 --76.1531 --76.1578 --76.1641 --76.1703 --76.1734 --76.1547 --76.1531 --76.1625 --76.1672 --76.1578 --76.15 --76.15 --76.1562 --76.1594 --76.1516 --76.1766 --76.1594 --76.1734 --76.15 --76.1656 --76.1687 --76.1672 --76.1641 --76.1547 --76.1641 --76.15 --76.1453 --76.1594 --76.175 --76.1687 --76.1562 --76.1641 --76.1609 --76.1547 --76.1656 --76.175 --76.1531 --76.1562 --76.1578 --76.1516 --76.1719 --76.1656 --76.1781 --76.1562 --76.1578 --76.1687 --76.1578 --76.1641 --76.1656 --76.1562 --76.1641 --76.1703 --76.1719 --76.1672 --76.1703 --76.1734 --76.1859 --76.175 --76.1625 --76.1781 --76.1484 --76.1578 --76.1625 --76.1687 --76.175 --76.1484 --76.1703 --76.1656 --76.1562 --76.1781 --76.1547 --76.1484 --76.1734 --76.1609 --76.1578 --76.1687 --76.1719 --76.1656 --76.1625 --76.1641 --76.1625 --76.1656 --76.1578 --76.1687 --76.1625 --76.1672 --76.175 --76.1672 --76.1641 --76.1703 --76.1609 --76.1594 --76.1641 --76.1594 --76.1641 --76.1656 --76.1578 --76.1813 --76.1547 --76.1516 --76.1625 --76.1766 --76.1734 --76.1547 --76.1797 --76.1656 --76.1672 --76.1609 --76.1609 --76.1609 --76.1719 --76.1672 --76.1641 --76.1594 --76.1719 --76.1687 --76.1594 --76.1734 --76.1625 --76.1797 --76.1562 --76.1781 --76.1641 --76.1531 --76.15 --76.1594 --76.1547 --76.1609 --76.1609 --76.1484 --76.1687 --76.1609 --76.1516 --76.1625 --76.1594 --76.1484 --76.1438 --76.1625 --76.1562 --76.1531 --76.1641 --76.1484 --76.1594 --76.1547 --76.1672 --76.1547 --76.1656 --76.1562 --76.1562 --76.1547 --76.1641 --76.1562 --76.1438 --76.1734 --76.1562 --76.1594 --76.1719 --76.1547 --76.1562 --76.1656 --76.15 --76.1484 --76.1609 --76.1656 --76.1641 --76.1594 --76.15 --76.1531 --76.1516 --76.1484 --76.1578 --76.1484 --76.1641 --76.1641 --76.1547 --76.1703 --76.1547 --76.1625 --76.1609 --76.15 --76.1672 --76.1516 --76.1719 --76.1609 --76.1594 --76.1609 --76.1703 --76.15 --76.1609 --76.1531 --76.1625 --76.175 --76.1734 --76.1672 --76.1656 --76.1687 --76.1625 --76.1656 --76.1766 --76.1594 --76.1703 --76.1625 --76.175 --76.1703 --76.1859 --76.1781 --76.1719 --76.1766 --76.1797 --76.1656 --76.1656 --76.1734 --76.1547 --76.1625 --76.1656 --76.1672 --76.1641 --76.175 --76.1687 --76.1766 --76.1687 --76.1734 --76.1578 --76.1516 --76.1609 --76.1594 --76.1641 --76.1578 --76.1531 --76.1656 --76.1578 --76.1656 --76.1641 --76.1625 --76.1578 --76.1562 --76.15 --76.1672 --76.1703 --76.1594 --76.1625 --76.1578 --76.1594 --76.1672 --76.1781 --76.1578 --76.1531 --76.1594 --76.1656 --76.1562 --76.1594 --76.1562 --76.1656 --76.1656 --76.1625 --76.1625 --76.1672 --76.1625 --76.1578 --76.1625 --76.1578 --76.1578 --76.1625 --76.1531 --76.1578 --76.1547 --76.1719 --76.1438 --76.1562 --76.1562 --76.1594 --76.1687 --76.1609 --76.1547 --76.1656 --76.1687 --76.1656 --76.1578 --76.1625 --76.1625 --76.15 --76.1562 --76.1547 --76.1562 --76.1734 --76.1687 --76.1438 --76.1516 --76.1516 --76.1687 --76.1609 --76.1516 --76.1656 --76.1625 --76.1609 --76.1766 --76.1578 --76.1609 --76.1609 --76.1719 --76.1625 --76.1578 --76.1656 --76.1516 --76.1703 --76.1687 --76.1625 --76.1531 --76.1641 --76.1516 --76.1609 --76.1406 --76.1562 --76.1594 --76.1531 --76.1516 --76.1578 --76.1453 --76.1438 --76.1422 --76.1578 --76.1531 --76.1406 --76.15 --76.1625 --76.1547 --76.1547 --76.1516 --76.1562 --76.1484 --76.1547 --76.1516 --76.1594 --76.1641 --76.1422 --76.1547 --76.1578 --76.1531 --76.1438 --76.1406 --76.1453 --76.1422 --76.1453 --76.1328 --76.1344 --76.15 --76.1453 --76.1531 --76.1344 --76.1531 --76.1375 --76.1359 --76.1484 --76.1531 --76.1547 --76.1531 --76.1625 --76.1516 --76.1516 --76.1516 --76.15 --76.1531 --76.1438 --76.125 --76.15 --76.1328 --76.1391 --76.125 --76.15 --76.1422 --76.1609 --76.1469 --76.1469 --76.15 --76.1547 --76.1641 --76.1406 --76.1531 --76.1406 --76.1531 --76.1484 --76.15 --76.1547 --76.1484 --76.1703 --76.1547 --76.1469 --76.1609 --76.1562 --76.1578 --76.1547 --76.1562 --76.1562 --76.1547 --76.1531 --76.1609 --76.1578 --76.1562 --76.1687 --76.1672 --76.1578 --76.1516 --76.1734 --76.1609 --76.1781 --76.1766 --76.1672 --76.1687 --76.1484 --76.1609 --76.1562 --76.1594 --76.1641 --76.1641 --76.1687 --76.1719 --76.1687 --76.1547 --76.1625 --76.1672 --76.1656 --76.1578 --76.1687 --76.1734 --76.1578 --76.1578 --76.1687 --76.1672 --76.1734 --76.1719 --76.1719 --76.1547 --76.1594 --76.1625 --76.1766 --76.1547 --76.1734 --76.1672 --76.1766 --76.1641 --76.1594 --76.1578 --76.1594 --76.1531 --76.1547 --76.1547 --76.1609 --76.1562 --76.1484 --76.1672 --76.1594 --76.1672 --76.1578 --76.1781 --76.1609 --76.1719 --76.15 --76.1578 --76.1516 --76.1547 --76.1641 --76.1687 --76.1484 --76.1625 --76.1703 --76.1484 --76.1484 --76.1734 --76.1594 --76.1734 --76.1578 --76.1547 --76.1656 --76.1734 --76.1609 --76.1672 --76.1469 --76.1672 --76.1609 --76.1516 --76.1547 --76.175 --76.1734 --76.1609 --76.1562 --76.1578 --76.1625 --76.1547 --76.1609 --76.1687 --76.1484 --76.1656 --76.1438 --76.1672 --76.1531 --76.1516 --76.1578 --76.1687 --76.1484 --76.1547 --76.1531 --76.1594 --76.1656 --76.1562 --76.1516 --76.1766 --76.1562 --76.1578 --76.1766 --76.1578 --76.1484 --76.1547 --76.15 --76.1594 --76.1594 --76.1594 --76.1656 --76.15 --76.15 --76.1531 --76.1641 --76.1562 --76.1672 --76.15 --76.1687 --76.1578 --76.1562 --76.175 --76.1797 --76.1547 --76.1703 --76.1625 --76.1687 --76.1562 --76.1469 --76.1516 --76.1641 --76.1594 --76.1687 --76.1531 --76.1609 --76.1484 --76.1438 --76.1469 --76.1531 --76.1578 --76.1641 --76.1609 --76.1516 --76.1391 --76.1562 --76.1406 --76.1531 --76.1625 --76.1656 --76.1516 --76.1484 --76.1531 --76.1547 --76.1484 --76.1453 --76.1672 --76.1609 --76.1484 --76.1656 --76.1672 --76.1438 --76.1562 --76.1656 --76.15 --76.1656 --76.1469 --76.1484 --76.1562 --76.1562 --76.1516 --76.1641 --76.1562 --76.1547 --76.1531 --76.1594 --76.15 --76.1656 --76.1672 --76.1609 --76.1547 --76.1656 --76.1562 --76.1594 --76.1547 --76.1609 --76.1578 --76.1516 --76.1531 --76.1562 --76.1516 --76.1609 --76.1531 --76.1562 --76.1687 --76.1656 --76.1719 --76.1516 --76.1578 --76.1609 --76.1547 --76.1594 --76.1547 --76.1547 --76.1562 --76.1516 --76.1687 --76.1562 --76.1609 --76.1641 --76.1609 --76.1687 --76.15 --76.1625 --76.1578 --76.1547 --76.1562 --76.1719 --76.1547 --76.1516 --76.1703 --76.1547 --76.1656 --76.1516 --76.1531 --76.1578 --76.1531 --76.1609 --76.1609 --76.1547 --76.1641 --76.1578 --76.1703 --76.1656 --76.1516 --76.1516 --76.1469 --76.1422 --76.15 --76.1547 --76.1438 --76.1531 --76.1641 --76.15 --76.1547 --76.1562 --76.1641 --76.1594 --76.1578 --76.1687 --76.1469 --76.1484 --76.175 --76.1516 --76.1344 --76.1453 --76.1531 --76.1562 --76.1547 --76.1609 --76.1469 --76.1594 --76.1531 --76.1594 --76.15 --76.1625 --76.1484 --76.1484 --76.1578 --76.1438 --76.1516 --76.1719 --76.1719 --76.1594 --76.1391 --76.1484 --76.15 --76.1516 --76.1516 --76.1578 --76.1375 --76.1453 --76.15 --76.1562 --76.1531 --76.1516 --76.1547 --76.1609 --76.1547 --76.1516 --76.1531 --76.1672 --76.1484 --76.15 --76.1578 --76.1641 --76.1656 --76.1469 --76.1625 --76.1516 --76.1594 --76.1578 --76.1531 --76.1453 --76.1578 --76.1406 --76.1531 --76.1625 --76.1516 --76.1594 --76.1609 --76.1609 --76.1578 --76.1562 --76.1531 --76.1531 --76.15 --76.1469 --76.175 --76.1562 --76.1609 --76.1422 --76.1641 --76.1469 --76.1484 --76.1531 --76.1594 --76.1672 --76.1531 --76.1562 --76.1625 --76.1641 --76.1453 --76.1578 --76.1484 --76.1516 --76.15 --76.1406 --76.1359 --76.1344 --76.1453 --76.1422 --76.1578 --76.1531 --76.1469 --76.1438 --76.1547 --76.1562 --76.1438 --76.1484 --76.1594 --76.1484 --76.1547 --76.1469 --76.1562 --76.1531 --76.1469 --76.1453 --76.1578 --76.15 --76.1609 --76.1547 --76.1734 --76.1516 --76.1594 --76.1484 --76.1516 --76.1484 --76.1422 --76.1375 --76.1328 --76.1562 --76.1484 --76.1484 --76.1562 --76.1578 --76.1594 --76.1531 --76.1484 --76.1422 --76.1469 --76.1625 --76.15 --76.1453 --76.1422 --76.1625 --76.1531 --76.1578 --76.1719 --76.1594 --76.1516 --76.1594 --76.1562 --76.1391 --76.1594 --76.1469 --76.1391 --76.1594 --76.1469 --76.15 --76.1562 --76.1687 --76.1453 --76.15 --76.1547 --76.1531 --76.1484 --76.1531 --76.1641 --76.1547 --76.1516 --76.1406 --76.1438 --76.1453 --76.1516 --76.1453 --76.1641 --76.1453 --76.1578 --76.1656 --76.1531 --76.1422 --76.1562 --76.1469 --76.1438 --76.1531 --76.1547 --76.1453 --76.1531 --76.1594 --76.1484 --76.1562 --76.1547 --76.1516 --76.1469 --76.15 --76.1547 --76.1469 --76.1531 --76.1484 --76.1469 --76.1375 --76.1531 --76.1469 --76.1484 --76.1438 --76.1438 --76.1484 --76.1391 --76.1328 --76.15 --76.1531 --76.1406 --76.1422 --76.1406 --76.1438 --76.1484 --76.1375 --76.1453 --76.1453 --76.1484 --76.1469 --76.1469 --76.1562 --76.1422 --76.1391 --76.1391 --76.1453 --76.1453 --76.1453 --76.1328 --76.1578 --76.1562 --76.1703 --76.1469 --76.1531 --76.1656 --76.1594 --76.15 --76.1672 --76.1469 --76.1609 --76.1562 --76.1516 --76.1547 --76.1453 --76.1562 --76.1672 --76.15 --76.1469 --76.1578 --76.1531 --76.1641 --76.1625 --76.1531 --76.1641 --76.1562 --76.1547 --76.1547 --76.1625 --76.1484 --76.1578 --76.15 --76.1422 --76.1609 --76.1562 --76.1578 --76.1703 --76.1562 --76.1453 --76.15 --76.1547 --76.1578 --76.1531 --76.1531 --76.1656 --76.1562 --76.1625 --76.1594 --76.1594 --76.1687 --76.1594 --76.1656 --76.1609 --76.1656 --76.1516 --76.1484 --76.1453 --76.1438 --76.1531 --76.1578 --76.1453 --76.1687 --76.1594 --76.1609 --76.1672 --76.1625 --76.1641 --76.1562 --76.1516 --76.1484 --76.1469 --76.1578 --76.1578 --76.15 --76.1562 --76.15 --76.1594 --76.1562 --76.1672 --76.1641 --76.1562 --76.1609 --76.1312 --76.1641 --76.1531 --76.1516 --76.1641 --76.1438 --76.1406 --76.1516 --76.1578 --76.1547 --76.1469 --76.1531 --76.1547 --76.1578 --76.1375 --76.1609 --76.1531 --76.1438 --76.1562 --76.1531 --76.1484 --76.1469 --76.1547 --76.1578 --76.1516 --76.15 --76.15 --76.1547 --76.1484 --76.1516 --76.1547 --76.1516 --76.1484 --76.1547 --76.1578 --76.1609 --76.1422 --76.1516 --76.1625 --76.1531 --76.1531 --76.1469 --76.15 --76.1469 --76.15 --76.1609 --76.1516 --76.1562 --76.1656 --76.1531 --76.15 --76.1672 --76.1562 --76.1547 --76.1594 --76.1687 --76.1719 --76.1672 --76.1578 --76.1578 --76.1609 --76.1531 --76.1547 --76.1609 --76.1609 --76.1562 --76.1641 --76.1594 --76.1672 --76.1719 --76.1562 --76.1641 --76.1547 --76.1547 --76.1547 --76.1641 --76.1625 --76.15 --76.1562 --76.1453 --76.1469 --76.1406 --76.1422 --76.1609 --76.1469 --76.1578 --76.1609 --76.1547 --76.1578 --76.1641 --76.15 --76.1609 --76.15 --76.1672 --76.1547 --76.1484 --76.1578 --76.1484 --76.1562 --76.1406 --76.1484 --76.1578 --76.1469 --76.1516 --76.1438 --76.15 --76.1484 --76.1453 --76.1438 --76.1359 --76.1406 --76.1453 --76.1516 --76.1453 --76.1406 --76.15 --76.1547 --76.1422 --76.1641 --76.15 --76.1438 --76.1359 --76.1609 --76.1422 --76.1422 --76.1453 --76.1422 --76.1422 --76.1344 --76.1531 --76.1359 --76.1391 --76.1641 --76.1375 --76.1453 --76.1375 --76.1578 --76.1641 --76.1438 --76.1359 --76.1578 --76.1469 --76.1484 --76.1469 --76.1516 --76.1453 --76.1516 --76.1438 --76.1531 --76.1438 --76.1453 --76.1625 --76.1641 --76.1438 --76.1516 --76.1625 --76.1656 --76.1453 --76.1594 --76.1703 --76.1594 --76.1625 --76.1672 --76.1813 --76.1766 --76.1609 --76.1703 --76.1531 --76.1578 --76.1469 --76.15 --76.1562 --76.1438 --76.15 --76.15 --76.1562 --76.1609 --76.1484 --76.1516 --76.1484 --76.1469 --76.1641 --76.1578 --76.1422 --76.1656 --76.1438 --76.1531 --76.1438 --76.1531 --76.1469 --76.1547 --76.1562 --76.1406 --76.1562 --76.1453 --76.1406 --76.1344 --76.1453 --76.1531 --76.1562 --76.1484 --76.1406 --76.1344 --76.1375 --76.1484 --76.1469 --76.15 --76.1359 --76.1531 --76.1328 --76.1312 --76.1484 --76.1531 --76.1328 --76.1406 --76.1344 --76.1438 --76.1359 --76.1453 --76.1406 --76.1469 --76.1266 --76.1391 --76.1219 --76.1484 --76.1516 --76.1375 --76.1406 --76.1422 --76.1234 --76.1297 --76.1469 --76.1359 --76.1375 --76.1312 --76.1375 --76.1281 --76.1375 --76.1281 --76.1359 --76.1406 --76.1188 --76.1375 --76.1422 --76.1531 --76.1453 --76.1312 --76.1234 --76.1547 --76.1312 --76.1281 --76.1312 --76.1375 --76.1344 --76.1406 --76.1484 --76.1344 --76.1438 --76.1438 --76.1312 --76.1344 --76.1578 --76.1422 --76.1344 --76.1469 --76.1328 --76.1453 --76.1391 --76.1547 --76.1531 --76.1422 --76.1375 --76.1328 --76.125 --76.1328 --76.1422 --76.1375 --76.1297 --76.1406 --76.1438 --76.1406 --76.1359 --76.1359 --76.1266 --76.1438 --76.1391 --76.1391 --76.1531 --76.1406 --76.1406 --76.1406 --76.1438 --76.1359 --76.1484 --76.1422 --76.1312 --76.1516 --76.1297 --76.125 --76.1312 --76.1422 --76.1312 --76.1406 --76.1328 --76.1375 --76.1438 --76.1359 --76.1328 --76.1391 --76.1391 --76.1328 --76.1438 --76.1375 --76.1594 --76.1391 --76.1562 --76.1453 --76.1484 --76.1453 --76.1406 --76.1375 --76.1469 --76.1609 --76.1484 --76.1375 --76.15 --76.1594 --76.1344 --76.1359 --76.1391 --76.1516 --76.1391 --76.1484 --76.1438 --76.1344 --76.1391 --76.1484 --76.1406 --76.1453 --76.1375 --76.1344 --76.1453 --76.1375 --76.1328 --76.1406 --76.1453 --76.15 --76.1312 --76.1328 --76.1266 --76.1359 --76.125 --76.1312 --76.1328 --76.1453 --76.1312 --76.1297 --76.1312 --76.1375 --76.1422 --76.1125 --76.1391 --76.1391 --76.1422 --76.1359 --76.1312 --76.1312 --76.1344 --76.1406 --76.1297 --76.1391 --76.1266 --76.1438 --76.1453 --76.1391 --76.1344 --76.1266 --76.1375 --76.1516 --76.1484 --76.1312 --76.1406 --76.15 --76.1359 --76.1328 --76.1391 --76.1438 --76.1359 --76.1453 --76.1438 --76.15 --76.1234 --76.1391 --76.1422 --76.1422 --76.1469 --76.1422 --76.1609 --76.1328 --76.1484 --76.1422 --76.1562 --76.1438 --76.1375 --76.15 --76.1516 --76.1391 --76.1547 --76.1406 --76.1469 --76.1328 --76.1359 --76.1516 --76.1344 --76.1422 --76.1406 --76.1328 --76.1672 --76.1469 --76.1516 --76.1406 --76.1359 --76.1516 --76.1328 --76.1297 --76.1312 --76.1422 --76.1578 --76.1453 --76.1484 --76.1453 --76.1453 --76.1422 --76.1453 --76.1406 --76.1312 --76.1344 --76.1375 --76.1203 --76.1406 --76.1391 --76.1438 --76.1406 --76.1516 --76.1422 --76.1422 --76.1297 --76.1391 --76.1391 --76.1484 --76.1453 --76.1344 --76.1375 --76.1516 --76.1375 --76.1453 --76.1422 --76.1406 --76.1266 --76.1484 --76.1266 --76.1453 --76.1516 --76.1344 --76.1406 --76.1422 --76.1484 --76.1406 --76.1391 --76.15 --76.1469 --76.1484 --76.1594 --76.15 --76.1469 --76.1469 --76.1469 --76.1375 --76.1422 --76.15 --76.1422 --76.1469 --76.1516 --76.1484 --76.1406 --76.15 --76.1438 --76.1469 --76.1469 --76.1469 --76.1453 --76.1562 --76.1422 --76.1219 --76.1453 --76.1375 --76.1438 --76.1438 --76.1375 --76.1484 --76.1422 --76.1469 --76.1422 --76.1359 --76.1344 --76.1422 --76.1516 --76.1609 --76.1328 --76.1359 --76.1594 --76.1422 --76.1516 --76.1469 --76.1359 --76.1406 --76.1562 --76.1469 --76.1484 --76.1422 --76.1422 --76.1453 --76.1422 --76.1438 --76.1344 --76.1516 --76.1406 --76.1484 --76.1422 --76.1516 --76.1484 --76.1484 --76.15 --76.1484 --76.1516 --76.1438 --76.1516 --76.1562 --76.1344 --76.1422 --76.1391 --76.1406 --76.1625 --76.1469 --76.1375 --76.1406 --76.1406 --76.1359 --76.15 --76.1469 --76.15 --76.1516 --76.1422 --76.1391 --76.1422 --76.1312 --76.1453 --76.1406 --76.1469 --76.1375 --76.1375 --76.1297 --76.1422 --76.1391 --76.1484 --76.1328 --76.1422 --76.1359 --76.1375 --76.1375 --76.1484 --76.15 --76.1438 --76.1359 --76.1219 --76.1422 --76.1438 --76.1391 --76.1375 --76.1406 --76.1312 --76.1344 --76.1391 --76.1359 --76.1406 --76.1453 --76.1312 --76.1297 --76.1391 --76.1453 --76.1359 --76.1422 --76.1406 --76.1359 --76.1422 --76.1312 --76.1344 --76.1312 --76.1531 --76.1406 --76.1328 --76.1281 --76.1359 --76.1359 --76.125 --76.1438 --76.1359 --76.1469 --76.1359 --76.1391 --76.1328 --76.1438 --76.1469 --76.1344 --76.1391 --76.1328 --76.1344 --76.1438 --76.1281 --76.1547 --76.1375 --76.1453 --76.1453 --76.1375 --76.1391 --76.1453 --76.1344 --76.1484 --76.1328 --76.1281 --76.1453 --76.1422 --76.1438 --76.1422 --76.15 --76.1328 --76.1453 --76.1359 --76.1391 --76.1359 --76.1359 --76.1359 --76.1469 --76.1469 --76.1422 --76.1344 --76.1312 --76.1328 --76.1266 --76.1422 --76.125 --76.1453 --76.1422 --76.1406 --76.1469 --76.1406 --76.1375 --76.1438 --76.1375 --76.1328 --76.1375 --76.1391 --76.1344 --76.1484 --76.1375 --76.1438 --76.1422 --76.1359 --76.1438 --76.1516 --76.1375 --76.1438 --76.1344 --76.1312 --76.1453 --76.1438 --76.1406 --76.1438 --76.1406 --76.1391 --76.1438 --76.1516 --76.1375 --76.1453 --76.1391 --76.1469 --76.15 --76.1406 --76.1375 --76.1281 --76.1391 --76.1391 --76.1344 --76.1359 --76.1375 --76.1406 --76.1391 --76.1328 --76.1328 --76.1359 --76.1375 --76.1484 --76.1438 --76.1469 --76.1469 --76.1469 --76.15 --76.1312 --76.1406 --76.1297 --76.1453 --76.1562 --76.1562 --76.1422 --76.1547 --76.1484 --76.1531 --76.1453 --76.15 --76.1547 --76.1469 --76.1469 --76.1422 --76.1469 --76.1594 --76.1641 --76.1625 --76.1625 --76.1484 --76.1516 --76.1578 --76.1578 --76.1609 --76.1516 --76.1641 --76.1578 --76.1672 --76.1703 --76.1656 --76.1578 --76.1687 --76.1781 --76.1516 --76.1562 --76.1641 --76.1578 --76.1625 --76.1578 --76.1672 --76.1625 --76.1687 --76.1547 --76.1547 --76.1547 --76.1438 --76.1609 --76.1547 --76.1625 --76.1438 --76.1484 --76.1547 --76.1562 --76.1375 --76.1453 --76.1516 --76.1578 --76.1516 --76.1516 --76.1516 --76.1547 --76.1422 --76.1422 --76.1609 --76.1547 --76.1375 --76.1516 --76.1594 --76.1578 --76.1438 --76.1547 --76.1516 --76.1578 --76.1562 --76.1562 --76.1516 --76.1516 --76.1609 --76.1594 --76.1516 --76.1484 --76.1531 --76.1531 --76.1609 --76.1484 --76.1578 --76.1578 --76.1438 --76.1578 --76.1422 --76.1359 --76.15 --76.1438 --76.1344 --76.1375 --76.1359 --76.1281 --76.1375 --76.1391 --76.15 --76.1391 --76.1578 --76.1406 --76.1594 --76.1328 --76.1406 --76.1422 --76.1375 --76.1453 --76.1406 --76.1453 --76.1531 --76.1344 --76.1594 --76.15 --76.1687 --76.1547 --76.1516 --76.1547 --76.1562 --76.1484 --76.1391 --76.1547 --76.1391 --76.1375 --76.15 --76.1484 --76.1641 --76.1562 --76.1438 --76.1594 --76.1484 --76.1453 --76.1484 --76.1438 --76.1562 --76.1516 --76.15 --76.1453 --76.1391 --76.1406 --76.1453 --76.1484 --76.1406 --76.1484 --76.1438 --76.1531 --76.1438 --76.1469 --76.1375 --76.1406 --76.1422 --76.1422 --76.15 --76.1391 --76.1359 --76.1562 --76.1406 --76.15 --76.1438 --76.15 --76.1453 --76.1562 --76.1641 --76.1438 --76.1484 --76.1469 --76.1516 --76.1516 --76.15 --76.1422 --76.1453 --76.1375 --76.1359 --76.1281 --76.1438 --76.1297 --76.1406 --76.15 --76.1469 --76.1344 --76.1359 --76.1406 --76.1328 --76.1344 --76.1297 --76.1344 --76.1375 --76.1172 --76.1422 --76.1328 --76.1312 --76.1297 --76.1344 --76.1375 --76.1422 --76.1188 --76.1359 --76.1312 --76.1297 --76.1328 --76.1375 --76.1312 --76.15 --76.1344 --76.1344 --76.1312 --76.15 --76.1375 --76.1438 --76.1469 --76.1266 --76.1344 --76.1297 --76.1344 --76.1438 --76.1391 --76.1266 --76.1453 --76.1344 --76.1484 --76.1359 --76.1297 --76.15 --76.1484 --76.1344 --76.1391 --76.1453 --76.1406 --76.1438 --76.1516 --76.1391 --76.1531 --76.1484 --76.1484 --76.1469 --76.1375 --76.1344 --76.1359 --76.1562 --76.1406 --76.1406 --76.1328 --76.1375 --76.1359 --76.1359 --76.1391 --76.1203 --76.1375 --76.1203 --76.1422 --76.1156 --76.1297 --76.1266 --76.1453 --76.1484 --76.1406 --76.1453 --76.1328 --76.1531 --76.1359 --76.1406 --76.1484 --76.1406 --76.1391 --76.1344 --76.1406 --76.1281 --76.1359 --76.1469 --76.15 --76.1469 --76.1406 --76.1641 --76.1391 --76.1578 --76.1359 --76.1344 --76.1359 --76.1375 --76.1516 --76.1344 --76.1406 --76.1266 --76.1469 --76.1422 --76.1203 --76.1312 --76.1312 --76.1328 --76.1391 --76.1266 --76.1406 --76.1234 --76.1203 --76.1328 --76.1234 --76.1312 --76.1188 --76.1234 --76.1234 --76.1469 --76.1359 --76.1406 --76.1359 --76.1391 --76.1438 --76.1359 --76.1422 --76.1281 --76.1453 --76.1391 --76.1312 --76.1266 --76.1344 --76.1344 --76.1391 --76.1156 --76.1297 --76.1328 --76.1281 --76.1281 --76.1312 --76.1359 --76.1141 --76.1219 --76.1344 --76.1328 --76.1297 --76.1359 --76.1188 --76.1344 --76.1328 --76.1312 --76.1312 --76.1406 --76.1344 --76.1312 --76.1312 --76.1125 --76.1297 --76.1344 --76.1359 --76.1391 --76.1281 --76.1234 --76.1297 --76.1312 --76.15 --76.1328 --76.1547 --76.1406 --76.1359 --76.1453 --76.1406 --76.1281 --76.15 --76.1359 --76.1516 --76.1469 --76.1375 --76.1453 --76.1453 --76.1469 --76.1359 --76.1344 --76.1281 --76.1375 --76.1391 --76.1188 --76.1328 --76.1406 --76.1344 --76.1484 --76.1359 --76.1156 --76.1281 --76.1281 --76.125 --76.1203 --76.125 --76.1312 --76.1281 --76.1344 --76.1438 --76.1328 --76.1344 --76.1406 --76.1297 --76.1359 --76.1359 --76.1266 --76.1422 --76.1359 --76.1328 --76.1359 --76.1469 --76.1453 --76.1297 --76.1328 --76.1391 --76.1438 --76.1344 --76.1375 --76.1359 --76.1312 --76.1328 --76.1266 --76.1312 --76.1422 --76.1469 --76.1266 --76.1453 --76.1562 --76.1266 --76.1422 --76.1297 --76.1266 --76.1375 --76.125 --76.1344 --76.1359 --76.1234 --76.15 --76.1516 --76.1406 --76.1219 --76.1312 --76.1391 --76.1281 --76.15 --76.1422 --76.1312 --76.1391 --76.1344 --76.1375 --76.1484 --76.1406 --76.1234 --76.1328 --76.1391 --76.1359 --76.1203 --76.1219 --76.1172 --76.1234 --76.1359 --76.1359 --76.1344 --76.1359 --76.1219 --76.1391 --76.1406 --76.1203 --76.1453 --76.1328 --76.1391 --76.1391 --76.1531 --76.1438 --76.1469 --76.1375 --76.1438 --76.1422 --76.1422 --76.1484 --76.1391 --76.1547 --76.1438 --76.1406 --76.1469 --76.125 --76.1516 --76.1547 --76.1375 --76.1469 --76.1406 --76.1422 --76.1484 --76.1266 --76.1328 --76.1281 --76.1359 --76.1453 --76.1422 --76.1375 --76.1484 --76.1453 --76.1344 --76.1312 --76.1375 --76.1469 --76.1375 --76.1375 --76.1453 --76.1297 --76.1359 --76.1375 --76.1406 --76.1531 --76.1375 --76.1547 --76.1578 --76.1516 --76.1422 --76.1375 --76.1484 --76.1516 --76.1234 --76.1406 --76.1375 --76.1344 --76.1438 --76.1281 --76.1297 --76.1578 --76.1375 --76.1312 --76.1453 --76.1422 --76.1516 --76.1391 --76.1484 --76.1375 --76.1453 --76.1344 --76.1328 --76.1297 --76.1422 --76.1375 --76.1531 --76.1406 --76.1453 --76.1422 --76.1312 --76.1344 --76.1359 --76.15 --76.1375 --76.1438 --76.1281 --76.125 --76.1297 --76.1453 --76.1234 --76.1297 --76.1531 --76.1391 --76.1328 --76.15 --76.1547 --76.1469 --76.1375 --76.1484 --76.1391 --76.1375 --76.1391 --76.1375 --76.1328 --76.1406 --76.1422 --76.1422 --76.1422 --76.1422 --76.1453 --76.1406 --76.1406 --76.1359 --76.1406 --76.1234 --76.1422 --76.1391 --76.1328 --76.1453 --76.1438 --76.1438 --76.1391 --76.1453 --76.1469 --76.1281 --76.1328 --76.1344 --76.125 --76.1391 --76.1375 --76.1359 --76.1484 --76.1219 --76.1297 --76.1484 --76.1438 --76.1281 --76.1422 --76.1328 --76.1281 --76.1375 --76.125 --76.1375 --76.1484 --76.1328 --76.1359 --76.1344 --76.1438 --76.1375 --76.1391 --76.1422 --76.1328 --76.125 --76.1359 --76.1312 --76.1469 --76.1344 --76.1297 --76.1406 --76.1469 --76.1438 --76.1375 --76.1375 --76.1438 --76.1391 --76.15 --76.1297 --76.1297 --76.1266 --76.1328 --76.1359 --76.1422 --76.1422 --76.1406 --76.1391 --76.1391 --76.1312 --76.1469 --76.1453 --76.1422 --76.1406 --76.1375 --76.1484 --76.1547 --76.1406 --76.1438 --76.1469 --76.1422 --76.1344 --76.15 --76.1391 --76.1438 --76.1469 --76.1406 --76.1469 --76.1547 --76.1453 --76.1422 --76.1297 --76.1453 --76.1484 --76.1562 --76.1406 --76.1453 --76.15 --76.1469 --76.1438 --76.125 --76.1469 --76.1438 --76.1516 --76.1484 --76.1516 --76.1531 --76.1375 --76.1469 --76.1438 --76.1531 --76.1469 --76.1531 --76.1469 --76.1453 --76.1562 --76.1469 --76.1453 --76.1484 --76.1422 --76.1359 --76.1453 --76.1469 --76.1594 --76.1422 --76.1359 --76.1516 --76.1359 --76.1438 --76.1281 --76.1328 --76.1438 --76.1422 --76.1453 --76.1438 --76.1281 --76.1391 --76.1297 --76.1344 --76.1312 --76.1297 --76.1234 --76.1391 --76.1375 --76.1359 --76.125 --76.1344 --76.1344 --76.1312 --76.1375 --76.1359 --76.1297 --76.1266 --76.125 --76.1359 --76.1422 --76.1312 --76.1375 --76.1391 --76.1391 --76.1359 --76.1312 --76.1312 --76.1359 --76.1281 --76.1344 --76.1391 --76.1391 --76.1328 --76.1297 --76.1312 --76.1359 --76.1312 --76.1344 --76.1281 --76.1391 --76.1328 --76.1172 --76.1141 --76.1172 --76.1281 --76.1281 --76.1203 --76.1125 --76.1203 --76.1219 --76.1141 --76.1359 --76.1125 --76.1312 --76.1109 --76.125 --76.0969 --76.125 --76.1203 --76.1125 --76.1281 --76.1203 --76.1281 --76.1359 --76.1234 --76.125 --76.1094 --76.1109 --76.1141 --76.1266 --76.1234 --76.1297 --76.1328 --76.1219 --76.1328 --76.1203 --76.1109 --76.1469 --76.1297 --76.1219 --76.1281 --76.1312 --76.1297 --76.1203 --76.125 --76.1219 --76.1312 --76.1281 --76.1234 --76.1234 --76.1203 --76.1203 --76.1203 --76.1312 --76.1312 --76.1203 --76.1312 --76.1344 --76.1281 --76.125 --76.1266 --76.1078 --76.1156 --76.1094 --76.1188 --76.1188 --76.1172 --76.1125 --76.125 --76.1125 --76.1297 --76.1344 --76.1312 --76.1281 --76.125 --76.1297 --76.1281 --76.1297 --76.1312 --76.125 --76.1281 --76.1531 --76.1312 --76.1375 --76.1312 --76.1328 --76.1453 --76.1203 --76.1266 --76.1266 --76.1172 --76.1266 --76.1344 --76.1328 --76.1516 --76.1312 --76.1281 --76.1328 --76.1516 --76.1406 --76.1406 --76.1281 --76.1328 --76.1328 --76.1203 --76.1375 --76.1375 --76.1266 --76.1312 --76.1406 --76.1328 --76.1266 --76.1359 --76.1328 --76.1281 --76.1266 --76.1422 --76.1344 --76.1391 --76.1438 --76.1312 --76.1391 --76.1266 --76.1203 --76.1234 --76.1359 --76.1281 --76.1156 --76.1375 --76.1328 --76.1328 --76.1234 --76.1406 --76.1312 --76.1438 --76.1281 --76.1297 --76.1312 --76.1328 --76.1297 --76.1266 --76.1203 --76.1188 --76.1266 --76.1141 --76.1172 --76.1203 --76.1234 --76.1234 --76.1266 --76.1172 --76.1047 --76.1203 --76.1188 --76.1203 --76.1312 --76.1234 --76.1188 --76.1203 --76.1219 --76.1234 --76.1203 --76.1219 --76.1078 --76.1141 --76.125 --76.1297 --76.1156 --76.1234 --76.1234 --76.1234 --76.1188 --76.125 --76.1359 --76.1312 --76.1328 --76.1141 --76.1219 --76.1219 --76.1219 --76.1125 --76.125 --76.1156 --76.1328 --76.1359 --76.1266 --76.1234 --76.1188 --76.1156 --76.1266 --76.1281 --76.1203 --76.1375 --76.1172 --76.1219 --76.1344 --76.1234 --76.1281 --76.1281 --76.1406 --76.1312 --76.1266 --76.1328 --76.1125 --76.1234 --76.1375 --76.1344 --76.1297 --76.1219 --76.125 --76.125 --76.1297 --76.1297 --76.1484 --76.1328 --76.1234 --76.1422 --76.1281 --76.1234 --76.1297 --76.1188 --76.125 --76.125 --76.1234 --76.1203 --76.1375 --76.1141 --76.1156 --76.125 --76.1156 --76.1312 --76.1219 --76.1281 --76.1266 --76.1203 --76.1219 --76.1172 --76.125 --76.1219 --76.1234 --76.1094 --76.1312 --76.125 --76.1094 --76.125 --76.125 --76.1219 --76.1141 --76.1219 --76.125 --76.1109 --76.125 --76.1172 --76.1281 --76.1234 --76.1219 --76.1172 --76.1266 --76.1312 --76.1109 --76.125 --76.1188 --76.1219 --76.1219 --76.1172 --76.1344 --76.1094 --76.1266 --76.1219 --76.1234 --76.1281 --76.1188 --76.1375 --76.1297 --76.1266 --76.1422 --76.1328 --76.1375 --76.1281 --76.1406 --76.1547 --76.1375 --76.1359 --76.1422 --76.1406 --76.1438 --76.1234 --76.1156 --76.1422 --76.1453 --76.1234 --76.1359 --76.1391 --76.1219 --76.1453 --76.1422 --76.1391 --76.1328 --76.1469 --76.1297 --76.1344 --76.1297 --76.1422 --76.1344 --76.1375 --76.1453 --76.1234 --76.1297 --76.1359 --76.1406 --76.1469 --76.1266 --76.1359 --76.1328 --76.125 --76.1234 --76.1406 --76.1344 --76.1359 --76.1281 --76.1328 --76.1391 --76.1312 --76.1281 --76.1219 --76.1266 --76.125 --76.1312 --76.1219 --76.1344 --76.1172 --76.1125 --76.1156 --76.1156 --76.1141 --76.1094 --76.1094 --76.1281 --76.1203 --76.1109 --76.1234 --76.1234 --76.1156 --76.1266 --76.1312 --76.1234 --76.1312 --76.1312 --76.1281 --76.1312 --76.1359 --76.1312 --76.1172 --76.125 --76.1281 --76.125 --76.1281 --76.1344 --76.1234 --76.1266 --76.1344 --76.1359 --76.1297 --76.1328 --76.1266 --76.1203 --76.125 --76.125 --76.1359 --76.1375 --76.1281 --76.15 --76.1312 --76.125 --76.125 --76.1266 --76.1172 --76.1281 --76.1219 --76.1312 --76.1312 --76.1453 --76.1344 --76.1328 --76.1375 --76.1297 --76.1453 --76.125 --76.1375 --76.1328 --76.1312 --76.1188 --76.1297 --76.15 --76.1219 --76.1359 --76.1422 --76.1344 --76.15 --76.1281 --76.1297 --76.1422 --76.1328 --76.1266 --76.1297 --76.1281 --76.1422 --76.1484 --76.1219 --76.1281 --76.1266 --76.1266 --76.1266 --76.1234 --76.1219 --76.1297 --76.1219 --76.1266 --76.1312 --76.125 --76.1156 --76.1266 --76.1203 --76.1297 --76.1109 --76.1422 --76.1156 --76.1156 --76.1141 --76.1156 --76.1109 --76.1266 --76.1203 --76.1219 --76.1203 --76.1375 --76.1312 --76.125 --76.1312 --76.1234 --76.1297 --76.1266 --76.1312 --76.1359 --76.1344 --76.1344 --76.1344 --76.1391 --76.1359 --76.1375 --76.1172 --76.1453 --76.1344 --76.1297 --76.1281 --76.1562 --76.1281 --76.1344 --76.1312 --76.1312 --76.1172 --76.1234 --76.1234 --76.1359 --76.1359 --76.1203 --76.1391 --76.1266 --76.1281 --76.1281 --76.1266 --76.1266 --76.1297 --76.1297 --76.1297 --76.1344 --76.1391 --76.1375 --76.1281 --76.1266 --76.1281 --76.125 --76.1219 --76.1234 --76.1266 --76.1297 --76.1188 --76.125 --76.1266 --76.1266 --76.1281 --76.1297 --76.1172 --76.1109 --76.1172 --76.1203 --76.1125 --76.1266 --76.1234 --76.1078 --76.1297 --76.1188 --76.1297 --76.1312 --76.1234 --76.1203 --76.1203 --76.1078 --76.1094 --76.1297 --76.1375 --76.1297 --76.1234 --76.1203 --76.1297 --76.1422 --76.1312 --76.1172 --76.1156 --76.1156 --76.1156 --76.1172 --76.1156 --76.1156 --76.1141 --76.1297 --76.1281 --76.1188 --76.1219 --76.1188 --76.1219 --76.1297 --76.1266 --76.1266 --76.1125 --76.1125 --76.1078 --76.1297 --76.1203 --76.1297 --76.1219 --76.1172 --76.1266 --76.1156 --76.1328 --76.1281 --76.1328 --76.1266 --76.1375 --76.1312 --76.1234 --76.1281 --76.1234 --76.1281 --76.1391 --76.1328 --76.1344 --76.1359 --76.1375 --76.1172 --76.1359 --76.1281 --76.1344 --76.1234 --76.1344 --76.1312 --76.1281 --76.1281 --76.1422 --76.1359 --76.125 --76.1234 --76.15 --76.1203 --76.1219 --76.1375 --76.1375 --76.1406 --76.1484 --76.1281 --76.1234 --76.1406 --76.1312 --76.1484 --76.1422 --76.1422 --76.1266 --76.1359 --76.1359 --76.1406 --76.1422 --76.1422 --76.1375 --76.1438 --76.1281 --76.1453 --76.1375 --76.1375 --76.1438 --76.1359 --76.1297 --76.1219 --76.1312 --76.1438 --76.1297 --76.1391 --76.1375 --76.1219 --76.1281 --76.1375 --76.1203 --76.1141 --76.1219 --76.125 --76.1141 --76.1266 --76.1188 --76.1422 --76.1219 --76.1156 --76.1188 --76.1234 --76.1172 --76.1203 --76.1047 --76.1172 --76.1312 --76.1344 --76.1266 --76.1344 --76.1281 --76.1297 --76.1297 --76.1266 --76.1344 --76.1203 --76.1188 --76.1125 --76.1172 --76.1141 --76.1109 --76.1094 --76.1125 --76.125 --76.1375 --76.1219 --76.125 --76.1266 --76.1078 --76.1359 --76.1266 --76.1266 --76.1297 --76.1109 --76.1391 --76.125 --76.125 --76.1328 --76.1219 --76.1297 --76.1234 --76.1266 --76.1219 --76.1203 --76.125 --76.1172 --76.1094 --76.1375 --76.1156 --76.1281 --76.1172 --76.1203 --76.1172 --76.1141 --76.1078 --76.1094 --76.1078 --76.1203 --76.1125 --76.1219 --76.1141 --76.1141 --76.1281 --76.1141 --76.1219 --76.1094 --76.1062 --76.1281 --76.1078 --76.1156 --76.1234 --76.1188 --76.1078 --76.1234 --76.1156 --76.1156 --76.1125 --76.1094 --76.1109 --76.1109 --76.1156 --76.1203 --76.1297 --76.1172 --76.1172 --76.1141 --76.1141 --76.1125 --76.1234 --76.125 --76.1109 --76.1047 --76.1141 --76.1094 --76.1094 --76.1141 --76.1172 --76.125 --76.1312 --76.1219 --76.1188 --76.125 --76.1188 --76.1156 --76.1188 --76.1266 --76.1203 --76.1188 --76.1094 --76.1109 --76.1 --76.1156 --76.1203 --76.1078 --76.1078 --76.1125 --76.1109 --76.1062 --76.1172 --76.1031 --76.1062 --76.1203 --76.1219 --76.1031 --76.1203 --76.1109 --76.1031 --76.1094 --76.1188 --76.1125 --76.1109 --76.1094 --76.1156 --76.1078 --76.1016 --76.1141 --76.1016 --76.1219 --76.1203 --76.1125 --76.1016 --76.1219 --76.1109 --76.1219 --76.1156 --76.1234 --76.1203 --76.125 --76.1391 --76.1359 --76.1312 --76.1328 --76.125 --76.1188 --76.1188 --76.1219 --76.1219 --76.1156 --76.125 --76.1188 --76.1344 --76.1328 --76.125 --76.1094 --76.1156 --76.1172 --76.1109 --76.1203 --76.1219 --76.1047 --76.1219 --76.1125 --76.1109 --76.1078 --76.1109 --76.1047 --76.1219 --76.1062 --76.1062 --76.1109 --76.1156 --76.1156 --76.1203 --76.0984 --76.1094 --76.1188 --76.1281 --76.1297 --76.1172 --76.1312 --76.1172 --76.1156 --76.1266 --76.1219 --76.125 --76.1156 --76.1281 --76.1047 --76.1156 --76.1234 --76.1328 --76.1234 --76.1219 --76.1266 --76.1141 --76.1141 --76.1203 --76.1312 --76.1266 --76.1188 --76.125 --76.1328 --76.1188 --76.1266 --76.1172 --76.1188 --76.1234 --76.1219 --76.1078 --76.1172 --76.1234 --76.1203 --76.1203 --76.1125 --76.1094 --76.1141 --76.1297 --76.1188 --76.1297 --76.1219 --76.1141 --76.1109 --76.1188 --76.1156 --76.1203 --76.1062 --76.1062 --76.1125 --76.1188 --76.1141 --76.1094 --76.1125 --76.1219 --76.1406 --76.1328 --76.125 --76.1188 --76.1141 --76.125 --76.125 --76.1 --76.125 --76.1312 --76.1141 --76.1172 --76.1062 --76.1344 --76.1109 --76.1141 --76.1219 --76.1172 --76.1219 --76.1 --76.1141 --76.1109 --76.1188 --76.1172 --76.1172 --76.1328 --76.1156 --76.1172 --76.1188 --76.1219 --76.1109 --76.1172 --76.1266 --76.1188 --76.1234 --76.1188 --76.125 --76.1141 --76.1141 --76.1172 --76.125 --76.0953 --76.1094 --76.1109 --76.1188 --76.1125 --76.125 --76.1125 --76.1219 --76.1141 --76.1312 --76.1203 --76.1125 --76.1234 --76.1125 --76.1219 --76.1188 --76.1234 --76.1047 --76.1234 --76.1297 --76.1281 --76.1266 --76.1156 --76.1141 --76.1219 --76.1141 --76.1297 --76.1234 --76.1203 --76.1234 --76.1016 --76.1156 --76.1234 --76.1109 --76.1172 --76.1188 --76.1078 --76.1078 --76.1156 --76.1203 --76.1172 --76.1297 --76.1219 --76.1281 --76.1234 --76.1375 --76.1094 --76.1281 --76.1266 --76.1219 --76.1141 --76.1031 --76.1266 --76.1219 --76.1062 --76.1234 --76.1141 --76.1109 --76.1016 --76.1109 --76.125 --76.1125 --76.1266 --76.1141 --76.1141 --76.1234 --76.1203 --76.1156 --76.1094 --76.1312 --76.1125 --76.1141 --76.1359 --76.1188 --76.1188 --76.1109 --76.1188 --76.1094 --76.1078 --76.1281 --76.1375 --76.1078 --76.1219 --76.125 --76.1141 --76.1172 --76.1 --76.1203 --76.1156 --76.1281 --76.1219 --76.125 --76.125 --76.125 --76.1266 --76.1172 --76.1078 --76.1141 --76.1156 --76.1203 --76.1172 --76.1109 --76.1094 --76.1094 --76.1234 --76.125 --76.1203 --76.1156 --76.1125 --76.1172 --76.1047 --76.1078 --76.1266 --76.1219 --76.1156 --76.1094 --76.1078 --76.1109 --76.1047 --76.1219 --76.1203 --76.1062 --76.1203 --76.1125 --76.1234 --76.1156 --76.1188 --76.1078 --76.1109 --76.1109 --76.1125 --76.1203 --76.1125 --76.1047 --76.1156 --76.1109 --76.1062 --76.1141 --76.1109 --76.1078 --76.1062 --76.1078 --76.1031 --76.1281 --76.1062 --76.1047 --76.1125 --76.1172 --76.1156 --76.1125 --76.1062 --76.1188 --76.1078 --76.1125 --76.0938 --76.1234 --76.1266 --76.1188 --76.1234 --76.1031 --76.1078 --76.125 --76.1281 --76.1219 --76.1156 --76.1234 --76.1172 --76.1234 --76.1234 --76.1109 --76.1156 --76.1156 --76.125 --76.1234 --76.1031 --76.1203 --76.1203 --76.1266 --76.1156 --76.1359 --76.1172 --76.1188 --76.1203 --76.1141 --76.125 --76.1219 --76.1406 --76.1203 --76.1078 --76.1125 --76.1094 --76.1172 --76.1219 --76.1188 --76.1078 --76.1234 --76.1219 --76.1125 --76.1109 --76.125 --76.1125 --76.1156 --76.0984 --76.1156 --76.1156 --76.1141 --76.1125 --76.125 --76.1031 --76.1062 --76.1172 --76.1078 --76.1078 --76.1172 --76.1172 --76.0969 --76.1078 --76.1266 --76.1141 --76.1266 --76.1 --76.1125 --76.1156 --76.1141 --76.1172 --76.1156 --76.1125 --76.1234 --76.1062 --76.1062 --76.0984 --76.1078 --76.1125 --76.1078 --76.1219 --76.1234 --76.1219 --76.1188 --76.1156 --76.1234 --76.1188 --76.1219 --76.1094 --76.1203 --76.1219 --76.1156 --76.1234 --76.1188 --76.1141 --76.1156 --76.1141 --76.0938 --76.1172 --76.1094 --76.1219 --76.1172 --76.1094 --76.1078 --76.1016 --76.1172 --76.1172 --76.1203 --76.1234 --76.1109 --76.1219 --76.125 --76.1094 --76.1234 --76.1312 --76.1156 --76.1281 --76.1109 --76.1266 --76.1281 --76.1203 --76.1281 --76.1391 --76.1234 --76.1281 --76.1344 --76.1172 --76.1297 --76.1328 --76.1234 --76.1203 --76.1281 --76.1219 --76.1312 --76.1172 --76.1297 --76.1281 --76.1188 --76.1234 --76.125 --76.125 --76.1188 --76.1219 --76.1281 --76.1172 --76.1234 --76.1188 --76.1109 --76.1031 --76.1125 --76.1141 --76.1266 --76.1062 --76.1109 --76.1109 --76.1188 --76.1188 --76.125 --76.1234 --76.1156 --76.1109 --76.1172 --76.1234 --76.1109 --76.1266 --76.1125 --76.1078 --76.125 --76.125 --76.1141 --76.1156 --76.1203 --76.1234 --76.1062 --76.125 --76.1141 --76.1125 --76.1203 --76.1125 --76.1266 --76.1047 --76.1203 --76.1062 --76.1359 --76.1281 --76.1266 --76.1188 --76.1297 --76.1266 --76.1266 --76.1203 --76.1344 --76.125 --76.1203 --76.1359 --76.1172 --76.1203 --76.1078 --76.1188 --76.1297 --76.1297 --76.125 --76.1188 --76.1188 --76.1297 --76.125 --76.1188 --76.1125 --76.1219 --76.1312 --76.1344 --76.1359 --76.1328 --76.1172 --76.1234 --76.1359 --76.1156 --76.1141 --76.1312 --76.1219 --76.1156 --76.1234 --76.1219 --76.1328 --76.125 --76.1297 --76.1156 --76.1344 --76.125 --76.1359 --76.1359 --76.1266 --76.1297 --76.1266 --76.1312 --76.1188 --76.1203 --76.1219 --76.1172 --76.125 --76.1344 --76.1266 --76.1406 --76.1172 --76.1188 --76.1328 --76.1219 --76.1297 --76.1281 --76.1219 --76.1188 --76.1266 --76.1297 --76.1297 --76.1219 --76.1234 --76.1188 --76.1281 --76.1172 --76.1234 --76.1203 --76.1172 --76.1219 --76.1281 --76.1141 --76.1219 --76.1219 --76.1344 --76.1188 --76.1156 --76.1188 --76.1125 --76.1219 --76.1203 --76.1453 --76.1297 --76.1219 --76.1234 --76.1266 --76.1281 --76.1156 --76.1188 --76.1094 --76.1281 --76.1203 --76.1109 --76.1094 --76.1094 --76.1094 --76.1125 --76.1156 --76.1125 --76.1203 --76.1188 --76.1094 --76.1203 --76.1047 --76.1172 --76.1203 --76.1172 --76.1109 --76.1078 --76.1094 --76.1188 --76.1172 --76.1188 --76.1109 --76.1266 --76.125 --76.1109 --76.1141 --76.1234 --76.1156 --76.1203 --76.1312 --76.1219 --76.1172 --76.1 --76.1203 --76.1156 --76.1141 --76.1234 --76.1172 --76.1078 --76.1188 --76.1188 --76.1062 --76.1094 --76.1172 --76.1125 --76.1188 --76.1203 --76.1125 --76.1156 --76.1234 --76.1109 --76.1172 --76.1172 --76.1219 --76.125 --76.1219 --76.1266 --76.1281 --76.1156 --76.125 --76.1188 --76.1188 --76.1297 --76.1 --76.125 --76.1062 --76.1203 --76.1109 --76.1219 --76.1219 --76.1156 --76.1281 --76.1297 --76.1188 --76.125 --76.1047 --76.1172 --76.1234 --76.1188 --76.1328 --76.1172 --76.125 --76.1312 --76.1344 --76.1172 --76.1156 --76.1359 --76.1047 --76.1172 --76.1234 --76.1234 --76.1172 --76.1219 --76.1234 --76.1234 --76.0969 --76.1094 --76.0984 --76.1094 --76.1094 --76.1156 --76.1188 --76.1188 --76.1141 --76.1109 --76.1188 --76.1172 --76.1172 --76.1344 --76.1234 --76.1047 --76.1219 --76.1203 --76.1156 --76.1156 --76.1094 --76.1188 --76.1156 --76.1219 --76.1219 --76.1172 --76.1234 --76.125 --76.1344 --76.1359 --76.1266 --76.1281 --76.1406 --76.1266 --76.125 --76.1281 --76.125 --76.1406 --76.125 --76.1375 --76.1406 --76.1328 --76.1359 --76.1328 --76.125 --76.1188 --76.1391 --76.1344 --76.1219 --76.1188 --76.1203 --76.1219 --76.125 --76.1219 --76.1234 --76.1328 --76.1266 --76.1141 --76.1312 --76.1125 --76.1203 --76.1312 --76.1188 --76.1125 --76.1188 --76.1234 --76.125 --76.1281 --76.1125 --76.1156 --76.1125 --76.1172 --76.1203 --76.1172 --76.1234 --76.1156 --76.1141 --76.125 --76.1188 --76.1203 --76.1219 --76.1172 --76.1 --76.1156 --76.1172 --76.1062 --76.1203 --76.1109 --76.1109 --76.1219 --76.1141 --76.1203 --76.1234 --76.125 --76.1172 --76.1172 --76.1047 --76.1234 --76.1203 --76.1266 --76.1156 --76.1188 --76.1281 --76.1188 --76.1328 --76.1359 --76.1266 --76.1188 --76.125 --76.1141 --76.1188 --76.1234 --76.1297 --76.1172 --76.1312 --76.1203 --76.1156 --76.1188 --76.1219 --76.1141 --76.1172 --76.1125 --76.1125 --76.1297 --76.1125 --76.1078 --76.1203 --76.1172 --76.1266 --76.1141 --76.1219 --76.1172 --76.1156 --76.1094 --76.1234 --76.1078 --76.1078 --76.1172 --76.1203 --76.0969 --76.1156 --76.1109 --76.1156 --76.1156 --76.1094 --76.1156 --76.1188 --76.1156 --76.1219 --76.1203 --76.1141 --76.1156 --76.1188 --76.1203 --76.1172 --76.1219 --76.1203 --76.1281 --76.1141 --76.1328 --76.125 --76.1234 --76.1047 --76.1094 --76.1031 --76.1219 --76.1344 --76.1203 --76.1125 --76.1125 --76.1141 --76.1156 --76.1125 --76.1125 --76.1141 --76.1031 --76.1125 --76.1375 --76.1109 --76.1203 --76.1094 --76.125 --76.1094 --76.1062 --76.1125 --76.1016 --76.1094 --76.1062 --76.1188 --76.1094 --76.1219 --76.1203 --76.1125 --76.1172 --76.1203 --76.1234 --76.1219 --76.1078 --76.1094 --76.1 --76.1062 --76.1 --76.1094 --76.1203 --76.1078 --76.1062 --76.1078 --76.1234 --76.1094 --76.1094 --76.1047 --76.1031 --76.1094 --76.1156 --76.1047 --76.1 --76.1172 --76.1188 --76.1094 --76.0984 --76.1141 --76.1094 --76.1125 --76.1 --76.1 --76.1078 --76.1109 --76.1 --76.1078 --76.1062 --76.1141 --76.1094 --76.1156 --76.1047 --76.1016 --76.0875 --76.0984 --76.0953 --76.1 --76.0984 --76.1047 --76.1156 --76.1078 --76.0969 --76.1125 --76.1125 --76.1125 --76.0922 --76.1125 --76.1172 --76.1047 --76.1016 --76.1031 --76.0969 --76.0922 --76.1047 --76.0969 --76.1078 --76.1109 --76.1 --76.1125 --76.1031 --76.1031 --76.1203 --76.1156 --76.1234 --76.1094 --76.1156 --76.1125 --76.1031 --76.125 --76.1047 --76.1109 --76.1109 --76.1 --76.1047 --76.1125 --76.1109 --76.1109 --76.1219 --76.1094 --76.0984 --76.1203 --76.1125 --76.1141 --76.1016 --76.1047 --76.1188 --76.1125 --76.1203 --76.1234 --76.1156 --76.1203 --76.1172 --76.1281 --76.1125 --76.1141 --76.1016 --76.1125 --76.1062 --76.1062 --76.0984 --76.1188 --76.1062 --76.1125 --76.1062 --76.0969 --76.1203 --76.1125 --76.1109 --76.1188 --76.0984 --76.1031 --76.1125 --76.1297 --76.1094 --76.1078 --76.1031 --76.1156 --76.1031 --76.1234 --76.0984 --76.1109 --76.1156 --76.1281 --76.1297 --76.1281 --76.1172 --76.1172 --76.1188 --76.1297 --76.1281 --76.1219 --76.1125 --76.1109 --76.1188 --76.1078 --76.1094 --76.1078 --76.1172 --76.1094 --76.1 --76.1172 --76.1109 --76.1125 --76.1188 --76.1172 --76.1203 --76.1188 --76.1156 --76.1297 --76.1094 --76.1219 --76.1172 --76.1234 --76.1141 --76.1141 --76.1156 --76.1047 --76.1141 --76.1219 --76.0984 --76.1094 --76.1219 --76.1219 --76.1141 --76.1094 --76.1078 --76.1094 --76.1109 --76.1125 --76.1047 --76.1156 --76.1031 --76.1141 --76.1125 --76.1125 --76.1281 --76.1109 --76.1062 --76.1219 --76.1188 --76.1109 --76.0953 --76.1031 --76.1125 --76.1156 --76.1125 --76.1141 --76.1219 --76.1094 --76.1047 --76.1172 --76.1141 --76.1141 --76.1156 --76.1047 --76.1141 --76.0938 --76.1094 --76.1031 --76.1094 --76.1266 --76.1078 --76.1062 --76.1 --76.1062 --76.1125 --76.1078 --76.0969 --76.1094 --76.0906 --76.1078 --76.1094 --76.0828 --76.0969 --76.0891 --76.0969 --76.1031 --76.1016 --76.1031 --76.0969 --76.1031 --76.1156 --76.1 --76.1 --76.0984 --76.1078 --76.0922 --76.1156 --76.0906 --76.0891 --76.1047 --76.1109 --76.1062 --76.1 --76.1047 --76.1047 --76.0984 --76.1 --76.1062 --76.1078 --76.1031 --76.1047 --76.1172 --76.1234 --76.1125 --76.1219 --76.0969 --76.0984 --76.1031 --76.1109 --76.1078 --76.1078 --76.1094 --76.1062 --76.1 --76.1125 --76.1203 --76.1062 --76.1125 --76.1172 --76.1125 --76.1094 --76.1109 --76.1047 --76.1125 --76.1141 --76.1062 --76.1188 --76.1141 --76.1203 --76.1203 --76.1094 --76.1188 --76.1125 --76.1141 --76.1219 --76.125 --76.1016 --76.1172 --76.125 --76.1125 --76.1062 --76.1234 --76.1203 --76.1062 --76.1156 --76.1047 --76.1 --76.1062 --76.1219 --76.1094 --76.1047 --76.1016 --76.1172 --76.1016 --76.1047 --76.1047 --76.1172 --76.1031 --76.1016 --76.0938 --76.1078 --76.1062 --76.1016 --76.1047 --76.0938 --76.1125 --76.1047 --76.1047 --76.1062 --76.1016 --76.1172 --76.0906 --76.0938 --76.1094 --76.1031 --76.0969 --76.0984 --76.1047 --76.0969 --76.0969 --76.1047 --76.1062 --76.1047 --76.1016 --76.1016 --76.0969 --76.0813 --76.1188 --76.1156 --76.1047 --76.1031 --76.1172 --76.0953 --76.1078 --76.1109 --76.1125 --76.1047 --76.1047 --76.1094 --76.1078 --76.1156 --76.1047 --76.1062 --76.1109 --76.1125 --76.0953 --76.1062 --76.0969 --76.0938 --76.0969 --76.1047 --76.0938 --76.0953 --76.1125 --76.0828 --76.0969 --76.0984 --76.0984 --76.0984 --76.0922 --76.0875 --76.0969 --76.0875 --76.1 --76.0938 --76.0906 --76.0953 --76.0906 --76.0953 --76.0828 --76.0969 --76.0906 --76.0891 --76.0859 --76.0953 --76.0828 --76.0938 --76.0922 --76.1078 --76.0984 --76.0953 --76.0938 --76.1 --76.0984 --76.0953 --76.0922 --76.0953 --76.1031 --76.0875 --76.1031 --76.0984 --76.0922 --76.0906 --76.1047 --76.1031 --76.1094 --76.1016 --76.0984 --76.0938 --76.1062 --76.1109 --76.1 --76.0922 --76.1031 --76.0969 --76.1 --76.1094 --76.1016 --76.1094 --76.0984 --76.1016 --76.1188 --76.1 --76.0922 --76.1141 --76.0813 --76.0859 --76.0953 --76.1 --76.0922 --76.1 --76.1016 --76.1031 --76.0875 --76.0938 --76.0922 --76.1 --76.0969 --76.1062 --76.0906 --76.1016 --76.0984 --76.0875 --76.0938 --76.1047 --76.1 --76.0813 --76.0906 --76.1141 --76.0953 --76.1062 --76.0938 --76.0969 --76.0797 --76.0938 --76.0859 --76.0813 --76.1 --76.0859 --76.0844 --76.0953 --76.0797 --76.0828 --76.0906 --76.0969 --76.0922 --76.0969 --76.0875 --76.0828 --76.0922 --76.0922 --76.0781 --76.0859 --76.0813 --76.0984 --76.0844 --76.1078 --76.0953 --76.0922 --76.0891 --76.0938 --76.0781 --76.0875 --76.0969 --76.0813 --76.1094 --76.0859 --76.0906 --76.0938 --76.1078 --76.0969 --76.0906 --76.1016 --76.0922 --76.0969 --76.0891 --76.0766 --76.1016 --76.0906 --76.0875 --76.0938 --76.0766 --76.0953 --76.0875 --76.0813 --76.0938 --76.0797 --76.0891 --76.0797 --76.0875 --76.1 --76.0922 --76.0938 --76.0984 --76.0906 --76.0938 --76.0813 --76.1062 --76.0891 --76.0922 --76.0922 --76.0953 --76.0797 --76.0766 --76.0828 --76.0828 --76.0719 --76.0828 --76.075 --76.0891 --76.0781 --76.0859 --76.0875 --76.0953 --76.0844 --76.0891 --76.0891 --76.0938 --76.0984 --76.0891 --76.0906 --76.0922 --76.1 --76.0938 --76.0953 --76.0875 --76.0891 --76.1125 --76.1 --76.1 --76.1078 --76.1094 --76.0984 --76.1047 --76.1016 --76.1109 --76.1016 --76.0953 --76.1078 --76.1078 --76.0922 --76.1 --76.1156 --76.0969 --76.1078 --76.1 --76.1141 --76.1031 --76.1188 --76.1203 --76.1234 --76.1141 --76.1156 --76.0984 --76.1172 --76.1047 --76.1078 --76.1141 --76.1141 --76.1031 --76.1078 --76.1125 --76.1188 --76.1031 --76.0984 --76.1016 --76.1141 --76.0938 --76.1094 --76.1016 --76.1125 --76.1172 --76.1188 --76.1094 --76.1094 --76.1016 --76.1 --76.1203 --76.1141 --76.1109 --76.1078 --76.1031 --76.1078 --76.1109 --76.1078 --76.1047 --76.1 --76.1094 --76.1031 --76.0969 --76.0984 --76.0922 --76.1062 --76.1125 --76.0984 --76.0875 --76.1094 --76.0938 --76.0953 --76.0969 --76.1 --76.0859 --76.1016 --76.0922 --76.0969 --76.0969 --76.0969 --76.0953 --76.0844 --76.0891 --76.0984 --76.1016 --76.0906 --76.0734 --76.0922 --76.0813 --76.0922 --76.0844 --76.0922 --76.0953 --76.0953 --76.0891 --76.0984 --76.1047 --76.0844 --76.1094 --76.0922 --76.0922 --76.1 --76.0984 --76.0969 --76.1016 --76.0953 --76.0969 --76.0875 --76.1031 --76.0891 --76.0844 --76.1109 --76.0844 --76.0875 --76.0859 --76.0891 --76.0891 --76.0984 --76.1031 --76.0859 --76.0922 --76.0906 --76.0891 --76.0953 --76.0766 --76.0953 --76.0703 --76.1078 --76.0891 --76.0875 --76.1031 --76.0828 --76.0844 --76.0953 --76.0891 --76.0875 --76.0844 --76.0969 --76.0875 --76.0953 --76.0891 --76.0891 --76.0844 --76.0813 --76.0984 --76.0844 --76.0891 --76.0813 --76.0844 --76.0766 --76.0859 --76.0781 --76.0844 --76.0719 --76.0781 --76.0844 --76.0719 --76.0922 --76.0906 --76.1 --76.0859 --76.0828 --76.0938 --76.1047 --76.0859 --76.0906 --76.1062 --76.1078 --76.1031 --76.1016 --76.0969 --76.0891 --76.1062 --76.0922 --76.1078 --76.0906 --76.1062 --76.0922 --76.1016 --76.1062 --76.1016 --76.0938 --76.1062 --76.0969 --76.0813 --76.0938 --76.0906 --76.0984 --76.1016 --76.0984 --76.0969 --76.0938 --76.1047 --76.0938 --76.1 --76.0938 --76.1031 --76.0922 --76.1188 --76.0969 --76.1109 --76.0891 --76.0953 --76.0938 --76.0859 --76.0922 --76.0969 --76.0891 --76.0813 --76.1 --76.0953 --76.0984 --76.0938 --76.0828 --76.1 --76.0828 --76.0922 --76.0828 --76.0922 --76.0922 --76.0938 --76.1016 --76.0781 --76.0844 --76.1031 --76.0938 --76.0938 --76.0969 --76.0922 --76.0984 --76.1031 --76.0984 --76.0969 --76.0938 --76.0938 --76.0969 --76.0969 --76.0703 --76.0891 --76.0891 --76.0797 --76.0984 --76.0891 --76.0938 --76.0672 --76.0859 --76.0844 --76.0906 --76.1031 --76.0922 --76.1047 --76.0922 --76.1062 --76.1047 --76.0969 --76.1016 --76.1016 --76.0953 --76.0891 --76.1031 --76.0969 --76.0922 --76.0891 --76.0922 --76.0922 --76.0844 --76.1 --76.0984 --76.0891 --76.0828 --76.0953 --76.0828 --76.0875 --76.0766 --76.0859 --76.1 --76.075 --76.0797 --76.0922 --76.1062 --76.0828 --76.0922 --76.1016 --76.0734 --76.1094 --76.0938 --76.0891 --76.0875 --76.0797 --76.0828 --76.0766 --76.0938 --76.0859 --76.1016 --76.1 --76.0891 --76.0906 --76.0969 --76.0984 --76.0891 --76.1016 --76.1109 --76.0844 --76.1047 --76.0844 --76.1031 --76.0953 --76.0938 --76.0891 --76.0844 --76.0953 --76.0953 --76.0813 --76.0844 --76.0859 --76.0797 --76.0953 --76.0813 --76.0766 --76.0859 --76.1 --76.0906 --76.0813 --76.0875 --76.0922 --76.0828 --76.0859 --76.075 --76.0734 --76.0891 --76.0766 --76.0875 --76.0719 --76.1062 --76.0875 --76.0844 --76.0875 --76.0859 --76.1031 --76.0938 --76.0938 --76.0906 --76.0938 --76.0828 --76.0859 --76.0969 --76.0891 --76.0875 --76.0906 --76.0922 --76.0828 --76.0953 --76.0953 --76.0922 --76.0641 --76.0953 --76.0859 --76.0953 --76.0813 --76.0875 --76.0797 --76.0781 --76.0781 --76.0875 --76.0766 --76.1031 --76.0953 --76.0797 --76.0984 --76.0953 --76.0906 --76.1031 --76.0875 --76.0938 --76.0844 --76.0938 --76.0953 --76.0859 --76.0891 --76.0797 --76.0844 --76.0875 --76.0844 --76.0828 --76.0938 --76.075 --76.0875 --76.0813 --76.0984 --76.0875 --76.0969 --76.0875 --76.0875 --76.0938 --76.0984 --76.0969 --76.0859 --76.1016 --76.0922 --76.0891 --76.0984 --76.0922 --76.0766 --76.0891 --76.0797 --76.0797 --76.0891 --76.0891 --76.0859 --76.0859 --76.0813 --76.0906 --76.0953 --76.0797 --76.0813 --76.1 --76.0891 --76.1 --76.1 --76.0953 --76.0953 --76.0875 --76.1062 --76.0953 --76.0891 --76.0906 --76.0938 --76.1031 --76.0813 --76.0984 --76.0938 --76.0859 --76.1062 --76.0969 --76.0969 --76.1031 --76.1172 --76.0969 --76.1078 --76.1047 --76.0875 --76.1 --76.1031 --76.0906 --76.1062 --76.0891 --76.1047 --76.1062 --76.1047 --76.0922 --76.0906 --76.0844 --76.0859 --76.0891 --76.0797 --76.0844 --76.1016 --76.0969 --76.0984 --76.1031 --76.0875 --76.0781 --76.0828 --76.0922 --76.0922 --76.0922 --76.0906 --76.0859 --76.0859 --76.1 --76.0891 --76.0922 --76.0766 --76.0906 --76.0828 --76.1031 --76.0813 --76.0875 --76.1 --76.0922 --76.0938 --76.0859 --76.0875 --76.0906 --76.0953 --76.0906 --76.0969 --76.1078 --76.0938 --76.0922 --76.0938 --76.0844 --76.0813 --76.0906 --76.0953 --76.1 --76.1016 --76.1016 --76.1109 --76.0828 --76.0906 --76.0813 --76.0875 --76.0844 --76.1 --76.0922 --76.0875 --76.1047 --76.1094 --76.1031 --76.0938 --76.0891 --76.0859 --76.0906 --76.0938 --76.0969 --76.0938 --76.0875 --76.0891 --76.0906 --76.0906 --76.0797 --76.0953 --76.0875 --76.0844 --76.0922 --76.0891 --76.0891 --76.1 --76.0891 --76.1094 --76.0953 --76.1047 --76.0891 --76.1016 --76.1031 --76.1062 --76.0938 --76.0828 --76.0844 --76.1078 --76.0969 --76.0984 --76.0953 --76.1 --76.1016 --76.1078 --76.0984 --76.1 --76.0969 --76.1016 --76.0906 --76.0828 --76.0813 --76.0906 --76.0984 --76.0922 --76.0891 --76.0906 --76.0938 --76.0906 --76.0969 --76.0984 --76.0859 --76.1 --76.0953 --76.1 --76.0922 --76.0891 --76.1062 --76.0875 --76.0953 --76.0906 --76.0953 --76.0938 --76.0859 --76.0891 --76.0938 --76.1078 --76.0828 --76.0766 --76.0844 --76.0938 --76.1 --76.0891 --76.0969 --76.1062 --76.1016 --76.1062 --76.0891 --76.1 --76.1047 --76.0875 --76.0906 --76.0906 --76.0984 --76.0906 --76.0938 --76.0938 --76.0828 --76.0922 --76.0953 --76.0875 --76.0797 --76.1016 --76.0859 --76.0906 --76.0813 --76.0844 --76.0844 --76.0859 --76.0969 --76.0984 --76.0953 --76.0969 --76.0906 --76.1062 --76.0813 --76.0984 --76.0938 --76.0906 --76.0922 --76.0813 --76.0922 --76.0953 --76.0875 --76.0938 --76.1016 --76.0938 --76.0844 --76.0844 --76.0969 --76.0781 --76.0875 --76.0969 --76.1016 --76.0922 --76.0906 --76.0969 --76.1 --76.0938 --76.0984 --76.0844 --76.0984 --76.0984 --76.0953 --76.0891 --76.0938 --76.0922 --76.0922 --76.0984 --76.0953 --76.0703 --76.0891 --76.1031 --76.0922 --76.0922 --76.1031 --76.1 --76.1 --76.1031 --76.0891 --76.1031 --76.0953 --76.0875 --76.1031 --76.1047 --76.1031 --76.1016 --76.1 --76.1031 --76.0938 --76.1016 --76.1031 --76.0844 --76.0984 --76.0844 --76.1016 --76.0938 --76.1078 --76.1 --76.1031 --76.1234 --76.0922 --76.0969 --76.0891 --76.0813 --76.1094 --76.0953 --76.1 --76.1062 --76.0891 --76.0969 --76.1078 --76.1031 --76.1047 --76.0953 --76.1031 --76.0969 --76.0938 --76.1031 --76.0938 --76.0938 --76.0859 --76.0953 --76.0938 --76.0859 --76.0969 --76.0969 --76.0984 --76.0953 --76.0922 --76.0844 --76.1156 --76.1016 --76.125 --76.1047 --76.0891 --76.0984 --76.1016 --76.1062 --76.1 --76.1078 --76.0953 --76.1031 --76.0922 --76.0875 --76.1 --76.1016 --76.0906 --76.0922 --76.1156 --76.0797 --76.0984 --76.0969 --76.1016 --76.0875 --76.0828 --76.0984 --76.0875 --76.0984 --76.0984 --76.0984 --76.0828 --76.0969 --76.1047 --76.0875 --76.0953 --76.0953 --76.1062 --76.0906 --76.0906 --76.0875 --76.0891 --76.0984 --76.1047 --76.1078 --76.1016 --76.0938 --76.1 --76.1 --76.1094 --76.0922 --76.1016 --76.0891 --76.0906 --76.0844 --76.1156 --76.1016 --76.1062 --76.0953 --76.0984 --76.1125 --76.0984 --76.1031 --76.0906 --76.1062 --76.0984 --76.1172 --76.1062 --76.0844 --76.1125 --76.0922 --76.1094 --76.0906 --76.0984 --76.0875 --76.0984 --76.0891 --76.0891 --76.1 --76.0813 --76.1109 --76.1094 --76.1062 --76.0875 --76.0859 --76.0828 --76.1062 --76.0891 --76.0984 --76.0984 --76.0984 --76.0891 --76.1016 --76.0766 --76.0953 --76.0938 --76.0891 --76.0906 --76.1094 --76.0859 --76.0891 --76.1078 --76.0969 --76.1 --76.1 --76.0969 --76.1047 --76.0906 --76.0813 --76.0875 --76.0813 --76.1016 --76.0875 --76.1125 --76.1125 --76.1 --76.0906 --76.0984 --76.1047 --76.0984 --76.0969 --76.0891 --76.1062 --76.0906 --76.1016 --76.0906 --76.0953 --76.1 --76.1031 --76.1109 --76.0906 --76.0906 --76.1141 --76.0938 --76.1062 --76.1109 --76.0922 --76.0969 --76.1031 --76.1188 --76.0891 --76.0953 --76.1156 --76.1062 --76.0922 --76.1047 --76.0859 --76.0813 --76.0891 --76.0922 --76.1094 --76.0938 --76.0938 --76.1094 --76.1031 --76.0875 --76.0906 --76.1 --76.0922 --76.0984 --76.0938 --76.0844 --76.0922 --76.0906 --76.0969 --76.0953 --76.1 --76.0984 --76.0938 --76.1047 --76.0969 --76.0891 --76.0922 --76.0813 --76.1 --76.0953 --76.0938 --76.0938 --76.0938 --76.1078 --76.0953 --76.075 --76.0906 --76.0891 --76.0875 --76.1031 --76.0891 --76.1016 --76.0766 --76.0844 --76.0719 --76.0922 --76.1031 --76.0844 --76.0891 --76.0984 --76.0922 --76.0953 --76.0844 --76.0891 --76.0875 --76.0922 --76.0797 --76.0891 --76.0891 --76.1 --76.0984 --76.1016 --76.0938 --76.0938 --76.0984 --76.1031 --76.0969 --76.1 --76.0906 --76.1031 --76.1125 --76.0859 --76.0938 --76.1031 --76.0938 --76.0938 --76.0984 --76.0953 --76.0875 --76.0922 --76.0875 --76.1031 --76.0953 --76.0922 --76.1 --76.1031 --76.0938 --76.0984 --76.0766 --76.1109 --76.0938 --76.0969 --76.0797 --76.0969 --76.0953 --76.0953 --76.1047 --76.0891 --76.0922 --76.0984 --76.0844 --76.0953 --76.0984 --76.0922 --76.0859 --76.1 --76.0969 --76.0969 --76.0922 --76.0922 --76.1109 --76.0969 --76.0938 --76.0984 --76.1062 --76.1078 --76.0875 --76.1047 --76.0969 --76.0938 --76.1172 --76.0906 --76.0859 --76.1078 --76.0906 --76.1016 --76.0922 --76.1094 --76.0906 --76.1047 --76.0906 --76.1016 --76.0969 --76.0984 --76.0938 --76.1031 --76.1125 --76.0953 --76.0984 --76.0922 --76.0969 --76.1172 --76.0922 --76.0875 --76.1078 --76.1 --76.0969 --76.1 --76.0969 --76.0953 --76.1 --76.0906 --76.0969 --76.0969 --76.0687 --76.0969 --76.0859 --76.0859 --76.0938 --76.0953 --76.0906 --76.0891 --76.0969 --76.0969 --76.0938 --76.0797 --76.0875 --76.0875 --76.0859 --76.1047 --76.0813 --76.0906 --76.0922 --76.0844 --76.0984 --76.0953 --76.0891 --76.0906 --76.0906 --76.0859 --76.0844 --76.0922 --76.0922 --76.0984 --76.1 --76.1016 --76.1109 --76.1125 --76.1 --76.0906 --76.0875 --76.0859 --76.0906 --76.0844 --76.0813 --76.0906 --76.0828 --76.0938 --76.0891 --76.0859 --76.0828 --76.0906 --76.0875 --76.0969 --76.0828 --76.0953 --76.0875 --76.0922 --76.0984 --76.1 --76.0781 --76.075 --76.0875 --76.0813 --76.0813 --76.0891 --76.0813 --76.0766 --76.0859 --76.0891 --76.0953 --76.0797 --76.0797 --76.0766 --76.0906 --76.0984 --76.0906 --76.0969 --76.0938 --76.0891 --76.0953 --76.0859 --76.1016 --76.0953 --76.1031 --76.0891 --76.0891 --76.1031 --76.0906 --76.0891 --76.0984 --76.0828 --76.0969 --76.0813 --76.0938 --76.0938 --76.1031 --76.0969 --76.0938 --76.1 --76.0859 --76.0813 --76.0797 --76.0844 --76.0953 --76.0891 --76.0844 --76.075 --76.0938 --76.0953 --76.0953 --76.0828 --76.0797 --76.0938 --76.0891 --76.0906 --76.0891 --76.0766 --76.0969 --76.0859 --76.0797 --76.1016 --76.0906 --76.0781 --76.0875 --76.0938 --76.0813 --76.0766 --76.0766 --76.0891 --76.0844 --76.0891 --76.0797 --76.0969 --76.0859 --76.1062 --76.0906 --76.0906 --76.1 --76.0891 --76.0828 --76.0906 --76.0844 --76.0906 --76.0844 --76.0906 --76.0953 --76.0844 --76.0891 --76.0906 --76.0859 --76.0813 --76.0797 --76.0781 --76.0859 --76.1016 --76.0828 --76.0875 --76.1016 --76.0828 --76.0922 --76.0969 --76.0891 --76.0734 --76.0734 --76.0938 --76.1031 --76.0969 --76.0703 --76.0875 --76.0844 --76.0766 --76.0906 --76.0875 --76.1 --76.0859 --76.0891 --76.0938 --76.0781 --76.0813 --76.0969 --76.0781 --76.1016 --76.0969 --76.0891 --76.0813 --76.0859 --76.0781 --76.0969 --76.1031 --76.075 --76.0828 --76.0859 --76.0813 --76.1016 --76.1016 --76.0813 --76.0859 --76.0781 --76.0844 --76.0969 --76.0859 --76.0859 --76.0922 --76.0813 --76.0891 --76.0891 --76.0875 --76.0766 --76.0844 --76.0906 --76.0859 --76.0891 --76.0844 --76.0844 --76.0859 --76.0828 --76.0859 --76.0844 --76.0953 --76.0797 --76.0797 --76.0844 --76.0844 --76.0781 --76.0625 --76.0781 --76.0687 --76.0938 --76.0766 --76.0813 --76.075 --76.0797 --76.0797 --76.0938 --76.0703 --76.0891 --76.0844 --76.0687 --76.0969 --76.075 --76.0953 --76.0875 --76.0781 --76.0875 --76.0734 --76.0953 --76.0906 --76.0953 --76.0906 --76.0953 --76.0813 --76.0656 --76.0953 --76.0766 --76.0703 --76.0984 --76.0859 --76.0922 --76.0844 --76.0859 --76.0813 --76.0828 --76.0875 --76.0844 --76.0922 --76.0844 --76.0859 --76.0922 --76.0875 --76.0906 --76.0859 --76.0922 --76.0844 --76.0859 --76.0922 --76.0859 --76.0938 --76.0797 --76.0875 --76.0859 --76.0859 --76.0797 --76.0906 --76.0797 --76.0797 --76.0797 --76.0828 --76.0844 --76.0766 --76.0797 --76.0656 --76.0844 --76.0766 --76.0641 --76.0875 --76.0797 --76.0797 --76.0766 --76.0781 --76.0734 --76.0844 --76.075 --76.0891 --76.0703 --76.0828 --76.0703 --76.0719 --76.0984 --76.0734 --76.0766 --76.0703 --76.0734 --76.0672 --76.0734 --76.0656 --76.0766 --76.075 --76.0672 --76.0781 --76.0656 --76.0687 --76.0719 --76.0859 --76.0766 --76.0656 --76.0656 --76.075 --76.0687 --76.0828 --76.0781 --76.0734 --76.0828 --76.0828 --76.075 --76.0781 --76.0891 --76.0828 --76.0719 --76.0797 --76.0734 --76.0719 --76.0813 --76.0656 --76.0844 --76.0844 --76.0891 --76.0609 --76.0734 --76.0813 --76.0719 --76.0781 --76.0703 --76.0813 --76.0875 --76.075 --76.0766 --76.0906 --76.0797 --76.0703 --76.0906 --76.075 --76.0781 --76.0672 --76.0875 --76.0797 --76.0656 --76.0734 --76.0922 --76.0875 --76.0828 --76.0703 --76.0734 --76.0813 --76.0844 --76.0781 --76.0875 --76.0891 --76.0953 --76.0828 --76.0703 --76.0734 --76.0828 --76.0828 --76.0687 --76.0922 --76.0813 --76.0813 --76.0766 --76.0859 --76.0875 --76.0781 --76.075 --76.0672 --76.0828 --76.0641 --76.0797 --76.0703 --76.0797 --76.0703 --76.0813 --76.0734 --76.0734 --76.0781 --76.0828 --76.0844 --76.0844 --76.0734 --76.0766 --76.0844 --76.0594 --76.0781 --76.0719 --76.0609 --76.0641 --76.0641 --76.0641 --76.0703 --76.0687 --76.075 --76.0734 --76.0672 --76.0719 --76.0609 --76.0797 --76.0734 --76.0656 --76.0672 --76.0563 --76.0594 --76.0625 --76.075 --76.0797 --76.0766 --76.0813 --76.0672 --76.0687 --76.075 --76.0797 --76.0687 --76.0766 --76.0656 --76.0656 --76.0578 --76.0641 --76.0734 --76.0719 --76.0672 --76.0813 --76.0656 --76.0641 --76.0656 --76.0625 --76.0609 --76.0734 --76.0813 --76.0672 --76.0625 --76.075 --76.0641 --76.0734 --76.0734 --76.0703 --76.0625 --76.0781 --76.0687 --76.0703 --76.0641 --76.0703 --76.0828 --76.0687 --76.0969 --76.0641 --76.0656 --76.0781 --76.0656 --76.075 --76.0781 --76.0719 --76.0781 --76.0672 --76.0828 --76.075 --76.0703 --76.075 --76.0672 --76.0797 --76.0656 --76.0672 --76.0578 --76.0625 --76.0641 --76.075 --76.0781 --76.0781 --76.0703 --76.0844 --76.0734 --76.0734 --76.0703 --76.0625 --76.0781 --76.0719 --76.0672 --76.0469 --76.0766 --76.0531 --76.0594 --76.0703 --76.0719 --76.0531 --76.0625 --76.0625 --76.0609 --76.0469 --76.05 --76.0703 --76.0672 --76.0687 --76.0656 --76.0453 --76.0641 --76.0609 --76.0594 --76.0703 --76.0719 --76.0687 --76.0609 --76.0609 --76.0703 --76.0641 --76.0672 --76.0734 --76.0672 --76.0734 --76.075 --76.0578 --76.0547 --76.0656 --76.0766 --76.0641 --76.0656 --76.0719 --76.0641 --76.0703 --76.0719 --76.0813 --76.0734 --76.0734 --76.0672 --76.0781 --76.0859 --76.0703 --76.0672 --76.0687 --76.0656 --76.0797 --76.0594 --76.0687 --76.0641 --76.0609 --76.0766 --76.0797 --76.0719 --76.0656 --76.0656 --76.0672 --76.0578 --76.0453 --76.0625 --76.0609 --76.0641 --76.0703 --76.0813 --76.0687 --76.0547 --76.0547 --76.0578 --76.0516 --76.075 --76.0609 --76.0734 --76.0687 --76.0734 --76.0781 --76.0703 --76.0641 --76.0703 --76.0719 --76.0578 --76.0734 --76.0578 --76.0625 --76.0641 --76.0563 --76.0563 --76.0766 --76.0516 --76.05 --76.0609 --76.0641 --76.0516 --76.0656 --76.0641 --76.0625 --76.0687 --76.0594 --76.0594 --76.0672 --76.0594 --76.0625 --76.075 --76.0672 --76.0563 --76.0625 --76.0609 --76.0531 --76.0547 --76.0672 --76.0563 --76.0406 --76.0437 --76.0719 --76.0641 --76.0437 --76.0453 --76.0641 --76.0563 --76.0672 --76.0547 --76.0578 --76.0563 --76.0547 --76.0703 --76.05 --76.0719 --76.0781 --76.0703 --76.075 --76.0578 --76.0609 --76.0656 --76.0391 --76.0594 --76.0578 --76.0578 --76.0563 --76.0625 --76.0563 --76.0625 --76.0609 --76.0563 --76.0672 --76.0531 --76.0625 --76.0547 --76.0641 --76.0609 --76.0719 --76.0547 --76.0484 --76.075 --76.0563 --76.0703 --76.075 --76.0594 --76.0516 --76.0719 --76.0547 --76.0563 --76.0641 --76.0766 --76.0687 --76.0625 --76.05 --76.0531 --76.0547 --76.0594 --76.05 --76.0734 --76.0656 --76.0609 --76.0563 --76.0563 --76.0641 --76.0625 --76.0672 --76.0547 --76.0563 --76.0641 --76.0594 --76.0672 --76.0594 --76.0641 --76.0609 --76.0437 --76.0609 --76.0547 --76.0578 --76.0656 --76.0734 --76.0391 --76.0547 --76.0594 --76.0547 --76.0703 --76.0609 --76.0594 --76.0578 --76.0547 --76.0594 --76.0609 --76.0703 --76.0656 --76.0609 --76.0484 --76.0594 --76.0516 --76.0578 --76.0453 --76.0531 --76.0687 --76.0578 --76.0656 --76.0609 --76.0563 --76.0625 --76.0609 --76.075 --76.0563 --76.0641 --76.0484 --76.0656 --76.0516 --76.0406 --76.0453 --76.0422 --76.05 --76.0437 --76.0516 --76.0422 --76.05 --76.0625 --76.0563 --76.0625 --76.0563 --76.05 --76.0516 --76.0609 --76.0594 --76.0531 --76.0484 --76.0469 --76.0437 --76.0406 --76.0453 --76.0516 --76.0531 --76.0484 --76.0547 --76.0547 --76.0453 --76.0531 --76.0469 --76.0469 --76.0594 --76.0453 --76.0578 --76.0437 --76.0547 --76.0703 --76.0578 --76.0609 --76.0437 --76.0625 --76.05 --76.0453 --76.0578 --76.05 --76.0578 --76.0641 --76.0656 --76.0656 --76.0625 --76.0672 --76.0563 --76.0531 --76.0547 --76.0422 --76.0641 --76.0594 --76.0547 --76.0531 --76.0516 --76.0578 --76.0641 --76.0469 --76.0609 --76.0531 --76.0609 --76.05 --76.0469 --76.05 --76.0484 --76.0453 --76.0469 --76.0531 --76.0609 --76.0578 --76.0516 --76.0484 --76.0641 --76.0516 --76.05 --76.0453 --76.0578 --76.0547 --76.0563 --76.0703 --76.0563 --76.0672 --76.0563 --76.0641 --76.0641 --76.0641 --76.0609 --76.075 --76.0531 --76.0672 --76.0625 --76.0563 --76.0656 --76.0516 --76.0453 --76.0563 --76.0656 --76.0609 --76.0703 --76.0625 --76.0594 --76.0625 --76.0516 --76.0672 --76.0563 --76.0563 --76.075 --76.0672 --76.0578 --76.0625 --76.0547 --76.0578 --76.0625 --76.0625 --76.0516 --76.0625 --76.0672 --76.0609 --76.0594 --76.05 --76.0531 --76.0672 --76.0453 --76.0578 --76.0594 --76.05 --76.0625 --76.0437 --76.0516 --76.0609 --76.0563 --76.0437 --76.0453 --76.0594 --76.0547 --76.0578 --76.0563 --76.0437 --76.0578 --76.0531 --76.0625 --76.0469 --76.0531 --76.0656 --76.0516 --76.0625 --76.0437 --76.0687 --76.0406 --76.0484 --76.0719 --76.0547 --76.0531 --76.0516 --76.0484 --76.0594 --76.05 --76.0547 --76.0484 --76.0687 --76.0531 --76.0656 --76.0594 --76.0609 --76.0516 --76.0719 --76.05 --76.0578 --76.0625 --76.0625 --76.0484 --76.0594 --76.0563 --76.0766 --76.0656 --76.0578 --76.0531 --76.0625 --76.0609 --76.0625 --76.0703 --76.0469 --76.0563 --76.0453 --76.0516 --76.0516 --76.0531 --76.0609 --76.0625 --76.0469 --76.0531 --76.0547 --76.0563 --76.0687 --76.0656 --76.0687 --76.0563 --76.0609 --76.0516 --76.0656 --76.0594 --76.0672 --76.0609 --76.0734 --76.0672 --76.0609 --76.0687 --76.0766 --76.0687 --76.0625 --76.0797 --76.075 --76.0672 --76.0672 --76.0687 --76.0609 --76.0531 --76.0531 --76.0578 --76.0687 --76.0625 --76.0687 --76.0703 --76.0547 --76.0594 --76.0641 --76.0516 --76.0672 --76.0516 --76.0578 --76.0563 --76.0625 --76.0594 --76.0641 --76.0406 --76.0687 --76.0578 --76.0578 --76.0719 --76.0531 --76.0703 --76.0609 --76.0672 --76.0578 --76.0594 --76.0531 --76.0719 --76.0703 --76.0734 --76.0547 --76.0594 --76.0703 --76.0687 --76.0687 --76.0687 --76.0625 --76.0687 --76.0594 --76.0766 --76.0594 --76.0656 --76.0641 --76.0469 --76.0625 --76.0563 --76.0625 --76.0563 --76.0703 --76.0594 --76.0719 --76.0547 --76.0703 --76.0531 --76.0594 --76.0578 --76.0437 --76.0797 --76.0625 --76.0563 --76.05 --76.0563 --76.0656 --76.0578 --76.0687 --76.0578 --76.0437 --76.0656 --76.0547 --76.0609 --76.0625 --76.0625 --76.0578 --76.0734 --76.0531 --76.05 --76.0734 --76.0625 --76.0609 --76.075 --76.0609 --76.0656 --76.0687 --76.0687 --76.0594 --76.0594 --76.0625 --76.0641 --76.0656 --76.0609 --76.0453 --76.0641 --76.0734 --76.0766 --76.075 --76.0828 --76.075 --76.0703 --76.0672 --76.0641 --76.0734 --76.0672 --76.0641 --76.0672 --76.0672 --76.0672 --76.0594 --76.0625 --76.0594 --76.0641 --76.0625 --76.0766 --76.0687 --76.0531 --76.0594 --76.0563 --76.0719 --76.0656 --76.0437 --76.0547 --76.0469 --76.0734 --76.0406 --76.0609 --76.0656 --76.0641 --76.0625 --76.0469 --76.0672 --76.0703 --76.0687 --76.0687 --76.0766 --76.05 --76.0734 --76.0828 --76.0672 --76.0687 --76.0672 --76.0641 --76.0719 --76.0625 --76.0484 --76.0703 --76.0687 --76.0703 --76.0672 --76.075 --76.0516 --76.0672 --76.0703 --76.0609 --76.0578 --76.0672 --76.0594 --76.0687 --76.0687 --76.0703 --76.0859 --76.0687 --76.0734 --76.0609 --76.0719 --76.0828 --76.0625 --76.075 --76.0641 --76.075 --76.0734 --76.0547 --76.0703 --76.0734 --76.0734 --76.0703 --76.0875 --76.0719 --76.0781 --76.0563 --76.0734 --76.0672 --76.0813 --76.0813 --76.0687 --76.0734 --76.0656 --76.0891 --76.075 --76.0563 --76.075 --76.0672 --76.0781 --76.0734 --76.075 --76.075 --76.0609 --76.0703 --76.0813 --76.0578 --76.0687 --76.0641 --76.0813 --76.0703 --76.0609 --76.0719 --76.0547 --76.0609 --76.0594 --76.0719 --76.0625 --76.0547 --76.0578 --76.0656 --76.05 --76.0609 --76.0719 --76.0687 --76.0625 --76.0781 --76.0563 --76.0656 --76.0609 --76.0484 --76.0844 --76.0578 --76.0656 --76.0687 --76.0516 --76.0531 --76.0531 --76.05 --76.0609 --76.0531 --76.0484 --76.0453 --76.0531 --76.0594 --76.0656 --76.0516 --76.0516 --76.0609 --76.0625 --76.0563 --76.0531 --76.0484 --76.0516 --76.0516 --76.0469 --76.0547 --76.0484 --76.0594 --76.0484 --76.0453 --76.0516 --76.0625 --76.0641 --76.0625 --76.0531 --76.05 --76.0594 --76.0609 --76.0547 --76.0516 --76.0578 --76.0531 --76.0687 --76.0531 --76.0594 --76.0563 --76.0625 --76.0594 --76.0609 --76.0625 --76.0531 --76.0437 --76.05 --76.0547 --76.0609 --76.0656 --76.0594 --76.0734 --76.0719 --76.0547 --76.0672 --76.0641 --76.0516 --76.0766 --76.0656 --76.0578 --76.0516 --76.0594 --76.0687 --76.0766 --76.0609 --76.0734 --76.0734 --76.0719 --76.0625 --76.0734 --76.0672 --76.0594 --76.0703 --76.0531 --76.0625 --76.0656 --76.0781 --76.0797 --76.0781 --76.0687 --76.0672 --76.0656 --76.0719 --76.0734 --76.0609 --76.0563 --76.0781 --76.0656 --76.0578 --76.0719 --76.0703 --76.0563 --76.0625 --76.0625 --76.0719 --76.0531 --76.0625 --76.0687 --76.0578 --76.075 --76.0656 --76.0563 --76.0531 --76.0594 --76.0594 --76.0594 --76.0563 --76.0594 --76.0578 --76.0594 --76.0766 --76.0609 --76.0766 --76.0656 --76.0578 --76.0547 --76.0609 --76.0641 --76.05 --76.0797 --76.0766 --76.0703 --76.05 --76.0656 --76.0594 --76.0578 --76.0594 --76.0531 --76.0687 --76.0563 --76.0641 --76.0656 --76.0594 --76.0609 --76.05 --76.0641 --76.0578 --76.0547 --76.0578 --76.0625 --76.0625 --76.0547 --76.05 --76.0484 --76.0547 --76.0547 --76.0547 --76.0594 --76.075 --76.0828 --76.0672 --76.0547 --76.0609 --76.0734 --76.075 --76.0687 --76.0703 --76.0719 --76.0766 --76.0578 --76.0531 --76.0703 --76.0703 --76.0594 --76.0625 --76.0578 --76.0547 --76.0437 --76.0563 --76.0594 --76.075 --76.0531 --76.0641 --76.075 --76.0609 --76.0656 --76.0641 --76.0641 --76.0719 --76.0641 --76.0656 --76.0578 --76.0687 --76.0578 --76.0672 --76.0625 --76.0734 --76.0578 --76.0531 --76.0719 --76.0656 --76.0516 --76.0625 --76.0672 --76.075 --76.0797 --76.0672 --76.0531 --76.0656 --76.0672 --76.0766 --76.0578 --76.0578 --76.0734 --76.0719 --76.0687 --76.0609 --76.0859 --76.0531 --76.0656 --76.0781 --76.0656 --76.0781 --76.0734 --76.0672 --76.0656 --76.0563 --76.0563 --76.0703 --76.0516 --76.0734 --76.0781 --76.0797 --76.0609 --76.0719 --76.0578 --76.0797 --76.0609 --76.0703 --76.0844 --76.0891 --76.0781 --76.0953 --76.0797 --76.0797 --76.0781 --76.0703 --76.0609 --76.0797 --76.0672 --76.0813 --76.0609 --76.0766 --76.0641 --76.0797 --76.0797 --76.0687 --76.0687 --76.075 --76.0844 --76.0828 --76.0656 --76.0844 --76.075 --76.0766 --76.075 --76.0719 --76.0875 --76.0703 --76.0609 --76.0656 --76.0625 --76.0625 --76.0641 --76.0687 --76.0641 --76.0625 --76.0672 --76.0625 --76.0563 --76.0531 --76.0703 --76.0547 --76.05 --76.0609 --76.0594 --76.0703 --76.0578 --76.0594 --76.0547 --76.0547 --76.0766 --76.0656 --76.0625 --76.0687 --76.0594 --76.0609 --76.0531 --76.0609 --76.0641 --76.0703 --76.0625 --76.0531 --76.0594 --76.0703 --76.0609 --76.0469 --76.0641 --76.0672 --76.0484 --76.0625 --76.0594 --76.0516 --76.0594 --76.0594 --76.0547 --76.0656 --76.0531 --76.0609 --76.0578 --76.0563 --76.075 --76.0516 --76.0547 --76.05 --76.0516 --76.0516 --76.0703 --76.0641 --76.0734 --76.0609 --76.0625 --76.075 --76.0625 --76.0563 --76.0625 --76.0594 --76.075 --76.0609 --76.0656 --76.0703 --76.0719 --76.0594 --76.0797 --76.0719 --76.0781 --76.0625 --76.0703 --76.0641 --76.0641 --76.0547 --76.0563 --76.0625 --76.05 --76.0641 --76.0687 --76.0594 --76.0594 --76.05 --76.0719 --76.0656 --76.0375 --76.0687 --76.0797 --76.0609 --76.0656 --76.0563 --76.0687 --76.0641 --76.0625 --76.0641 --76.0594 --76.0641 --76.0594 --76.0641 --76.0547 --76.05 --76.0563 --76.0563 --76.0672 --76.0703 --76.0687 --76.075 --76.0594 --76.0672 --76.0594 --76.0703 --76.0625 --76.0609 --76.0422 --76.0484 --76.0609 --76.0687 --76.0578 --76.0656 --76.0625 --76.0703 --76.0734 --76.0563 --76.0609 --76.0656 --76.0531 --76.0594 --76.0609 --76.0609 --76.0531 --76.0641 --76.0609 --76.0719 --76.0563 --76.0578 --76.0625 --76.0719 --76.0672 --76.0547 --76.0578 --76.0563 --76.0672 --76.0563 --76.0578 --76.075 --76.0641 --76.0672 --76.0687 --76.0594 --76.0563 --76.0625 --76.0656 --76.0563 --76.0594 --76.0719 --76.0594 --76.0734 --76.0547 --76.0594 --76.0531 --76.0625 --76.0703 --76.0531 --76.0578 --76.0594 --76.0641 --76.0547 --76.0609 --76.0594 --76.0656 --76.0625 --76.0703 --76.0531 --76.0516 --76.0531 --76.0516 --76.0563 --76.0547 --76.0453 --76.0781 --76.0531 --76.0703 --76.0516 --76.0609 --76.0531 --76.0406 --76.0594 --76.0531 --76.0531 --76.0641 --76.0547 --76.0516 --76.0547 --76.0641 --76.0641 --76.0484 --76.0656 --76.0672 --76.0672 --76.0672 --76.0766 --76.0531 --76.0609 --76.0703 --76.0672 --76.0719 --76.0844 --76.0766 --76.0687 --76.0844 --76.0828 --76.0781 --76.0766 --76.0828 --76.075 --76.0703 --76.0719 --76.0734 --76.0672 --76.0656 --76.0703 --76.0672 --76.0734 --76.0734 --76.0641 --76.0828 --76.0875 --76.0656 --76.0625 --76.0734 --76.0813 --76.0687 --76.0844 --76.0719 --76.0609 --76.0687 --76.0641 --76.0672 --76.0656 --76.0641 --76.0687 --76.0703 --76.0578 --76.0578 --76.0797 --76.0609 --76.0734 --76.075 --76.0687 --76.0813 --76.0797 --76.0672 --76.0859 --76.0766 --76.0578 --76.0625 --76.0734 --76.0687 --76.0734 --76.0766 --76.0609 --76.0625 --76.0687 --76.0672 --76.0563 --76.0563 --76.0531 --76.0781 --76.0516 --76.0563 --76.0594 --76.0625 --76.0594 --76.0516 --76.0641 --76.0594 --76.0563 --76.0547 --76.0719 --76.0687 --76.0672 --76.0641 --76.0531 --76.0687 --76.0563 --76.0563 --76.0703 --76.0625 --76.0781 --76.0578 --76.0641 --76.0578 --76.0687 --76.0578 --76.0594 --76.0703 --76.0609 --76.0719 --76.0703 --76.0609 --76.0656 --76.0656 --76.0656 --76.0609 --76.0672 --76.0656 --76.0734 --76.0734 --76.0719 --76.0687 --76.0547 --76.0703 --76.075 --76.0656 --76.0719 --76.0703 --76.0531 --76.0703 --76.0672 --76.0656 --76.0563 --76.0656 --76.0656 --76.0641 --76.0687 --76.0578 --76.0641 --76.0734 --76.0625 --76.0594 --76.0656 --76.0547 --76.0594 --76.0531 --76.0563 --76.0672 --76.0594 --76.0516 --76.05 --76.0719 --76.0516 --76.0547 --76.0781 --76.0563 --76.0734 --76.0609 --76.0609 --76.0719 --76.0547 --76.0516 --76.0625 --76.0578 --76.0672 --76.0656 --76.0687 --76.0531 --76.0672 --76.0719 --76.0578 --76.0531 --76.0516 --76.0594 --76.0563 --76.0563 --76.0609 --76.0781 --76.0625 --76.0703 --76.0734 --76.0656 --76.0563 --76.0672 --76.0625 --76.0609 --76.0641 --76.0828 --76.0641 --76.0609 --76.0687 --76.0672 --76.0609 --76.0641 --76.0609 --76.0625 --76.0563 --76.0656 --76.0625 --76.0578 --76.0578 --76.0484 --76.0453 --76.0672 --76.0547 --76.0563 --76.0687 --76.0578 --76.0641 --76.0578 --76.0672 --76.0625 --76.0469 --76.0594 --76.0641 --76.0594 --76.0516 --76.0703 --76.0547 --76.0516 --76.0531 --76.0547 --76.0672 --76.0563 --76.0656 --76.0563 --76.0437 --76.0453 --76.0531 --76.0484 --76.0703 --76.0609 --76.0578 --76.0672 --76.0484 --76.0547 --76.0563 --76.0516 --76.0609 --76.0609 --76.0578 --76.0609 --76.0625 --76.0547 --76.0641 --76.0641 --76.0656 --76.0656 --76.075 --76.075 --76.0734 --76.075 --76.0484 --76.0719 --76.0516 --76.0625 --76.0625 --76.0609 --76.0641 --76.0703 --76.0828 --76.0734 --76.0609 --76.0703 --76.0734 --76.0719 --76.0641 --76.0625 --76.0703 --76.0625 --76.0625 --76.0656 --76.0563 --76.0719 --76.0578 --76.0437 --76.0531 --76.0672 --76.0672 --76.0531 --76.0578 --76.0375 --76.0734 --76.0531 --76.0672 --76.0687 --76.0484 --76.0672 --76.0594 --76.0656 --76.0547 --76.0484 --76.0578 --76.0547 --76.0563 --76.0703 --76.0609 --76.0703 --76.0656 --76.0719 --76.0703 --76.0625 --76.0781 --76.0641 --76.0641 --76.0625 --76.0469 --76.0547 --76.0578 --76.0437 --76.0719 --76.0672 --76.0531 --76.0609 --76.0781 --76.0609 --76.0563 --76.075 --76.0531 --76.0563 --76.0453 --76.0609 --76.0609 --76.0719 --76.0578 --76.0687 --76.0641 --76.0594 --76.0547 --76.0641 --76.0687 --76.0391 --76.0672 --76.0594 --76.0625 --76.0672 --76.0687 --76.0734 --76.0578 --76.0719 --76.0594 --76.05 --76.0656 --76.0687 --76.0547 --76.0563 --76.0594 --76.0609 --76.0656 --76.0516 --76.0594 --76.0641 --76.0484 --76.0703 --76.0719 --76.0672 --76.0625 --76.0641 --76.0609 --76.0563 --76.0687 --76.0531 --76.0531 --76.0625 --76.0437 --76.0578 --76.0563 --76.0609 --76.0563 --76.0422 --76.0469 --76.0531 --76.0594 --76.0594 --76.0703 --76.0609 --76.0594 --76.0656 --76.0578 --76.0672 --76.0656 --76.0563 --76.075 --76.0422 --76.0641 --76.0547 --76.0516 --76.0563 --76.0547 --76.0484 --76.0578 --76.0703 --76.0656 --76.0547 --76.075 --76.0656 --76.0672 --76.0641 --76.0547 --76.0531 --76.0625 --76.0641 --76.0687 --76.0594 --76.0563 --76.0469 --76.0516 --76.0563 --76.0531 --76.0672 --76.0641 --76.0594 --76.0703 --76.0437 --76.0625 --76.05 --76.0359 --76.0547 --76.0578 --76.0656 --76.0766 --76.0578 --76.0469 --76.0703 --76.0563 --76.0594 --76.0547 --76.0563 --76.0578 --76.0563 --76.0625 --76.0656 --76.0594 --76.0516 --76.0625 --76.0453 --76.0469 --76.0531 --76.0594 --76.0531 --76.0547 --76.0656 --76.0609 --76.0531 --76.0609 --76.0609 --76.0656 --76.0516 --76.0609 --76.0641 --76.0531 --76.0609 --76.0578 --76.0578 --76.0625 --76.0719 --76.0531 --76.0625 --76.0641 --76.05 --76.0672 --76.0531 --76.0563 --76.0469 --76.0594 --76.0609 --76.0594 --76.05 --76.05 --76.0609 --76.0563 --76.0516 --76.0437 --76.0422 --76.0484 --76.0563 --76.0656 --76.0547 --76.0516 --76.0547 --76.0719 --76.0594 --76.0531 --76.0547 --76.0547 --76.0563 --76.05 --76.0609 --76.0531 --76.0563 --76.0578 --76.0484 --76.0594 --76.0484 --76.0516 --76.0578 --76.05 --76.0563 --76.0578 --76.0687 --76.0672 --76.0703 --76.0641 --76.0719 --76.0703 --76.0672 --76.0594 --76.0656 --76.0656 --76.0656 --76.0672 --76.0734 --76.0625 --76.0516 --76.0703 --76.0641 --76.0563 --76.0703 --76.0687 --76.0719 --76.0641 --76.0531 --76.0563 --76.0594 --76.0578 --76.0531 --76.0734 --76.0672 --76.0531 --76.0563 --76.0609 --76.0734 --76.0687 --76.0641 --76.0531 --76.0531 --76.0594 --76.05 --76.0531 --76.0422 --76.0563 --76.0625 --76.05 --76.0484 --76.0531 --76.0578 --76.0453 --76.0547 --76.05 --76.0531 --76.0516 --76.0344 --76.0437 --76.0563 --76.05 --76.0563 --76.0563 --76.0547 --76.0531 --76.0531 --76.0641 --76.0563 --76.0609 --76.0672 --76.0563 --76.0625 --76.0609 --76.0531 --76.0578 --76.0609 --76.05 --76.0547 --76.0641 --76.0609 --76.0594 --76.0563 --76.05 --76.0484 --76.0656 --76.0594 --76.0594 --76.0766 --76.0578 --76.0609 --76.0672 --76.0641 --76.0641 --76.0563 --76.0687 --76.0641 --76.0703 --76.0703 --76.0469 --76.0563 --76.0609 --76.0594 --76.0656 --76.0625 --76.0625 --76.0578 --76.0547 --76.0734 --76.0609 --76.0703 --76.0687 --76.0813 --76.0687 --76.0719 --76.0687 --76.0641 --76.0844 --76.0672 --76.0875 --76.0766 --76.0719 --76.0766 --76.0563 --76.0719 --76.0687 --76.0813 --76.075 --76.0687 --76.0938 --76.0828 --76.0797 --76.0703 --76.075 --76.0656 --76.0781 --76.0734 --76.0719 --76.0906 --76.0781 --76.0781 --76.0828 --76.0594 --76.0609 --76.0719 --76.0813 --76.0781 --76.0766 --76.0844 --76.0844 --76.0672 --76.0563 --76.0828 --76.0922 --76.0734 --76.0641 --76.075 --76.0859 --76.0672 --76.075 --76.0734 --76.0484 --76.0891 --76.0859 --76.0844 --76.0734 --76.0906 --76.0828 --76.0719 --76.0813 --76.0766 --76.0703 --76.075 --76.0578 --76.0781 --76.0594 --76.075 --76.0781 --76.0734 --76.0547 --76.0594 --76.0719 --76.0734 --76.0656 --76.0594 --76.0672 --76.0719 --76.0563 --76.0734 --76.0641 --76.0797 --76.0687 --76.0719 --76.0578 --76.0656 --76.0547 --76.0469 --76.0453 --76.0594 --76.0594 --76.0484 --76.0578 --76.0609 --76.0484 --76.0656 --76.0625 --76.05 --76.0625 --76.0578 --76.0531 --76.0594 --76.0531 --76.0687 --76.0516 --76.0625 --76.0687 --76.0687 --76.0766 --76.0703 --76.0703 --76.0625 --76.0687 --76.0625 --76.0563 --76.0656 --76.0641 --76.0656 --76.0547 --76.0547 --76.0625 --76.0734 --76.0563 --76.075 --76.0547 --76.0547 --76.0641 --76.0656 --76.0687 --76.0578 --76.0656 --76.0609 --76.0531 --76.0641 --76.0563 --76.0437 --76.0625 --76.05 --76.0609 --76.0594 --76.0531 --76.0547 --76.0625 --76.0641 --76.0641 --76.0547 --76.0609 --76.0531 --76.0484 --76.0531 --76.0437 --76.0578 --76.0531 --76.0547 --76.0547 --76.0609 --76.0563 --76.0469 --76.0563 --76.0641 --76.0563 --76.0484 --76.0594 --76.0594 --76.0469 --76.0594 --76.05 --76.0484 --76.0578 --76.05 --76.0703 --76.0563 --76.0594 --76.0563 --76.0609 --76.0578 --76.0437 --76.0484 --76.0469 --76.0422 --76.0734 --76.0594 --76.0578 --76.0594 --76.0609 --76.075 --76.0625 --76.0594 --76.0625 --76.0625 --76.0641 --76.0687 --76.0609 --76.0594 --76.0719 --76.0516 --76.0625 --76.0672 --76.0563 --76.0453 --76.0563 --76.0641 --76.0469 --76.0484 --76.0594 --76.0609 --76.0687 --76.0516 --76.0547 --76.0516 --76.0641 --76.0672 --76.0469 --76.0625 --76.0609 --76.0734 --76.0672 --76.0672 --76.0734 --76.0625 --76.0813 --76.0734 --76.0656 --76.0703 --76.0641 --76.0703 --76.0578 --76.0656 --76.0531 --76.0641 --76.0703 --76.0609 --76.0719 --76.0641 --76.0687 --76.0641 --76.0656 --76.0672 --76.0672 --76.0656 --76.0813 --76.0687 --76.075 --76.0656 --76.0578 --76.0687 --76.0578 --76.0719 --76.0625 --76.0781 --76.0625 --76.0641 --76.0734 --76.0625 --76.0672 --76.0719 --76.0516 --76.05 --76.0609 --76.0531 --76.0563 --76.0625 --76.0594 --76.0563 --76.0641 --76.0766 --76.0625 --76.0547 --76.0641 --76.0547 --76.0609 --76.0609 --76.0672 --76.0766 --76.0609 --76.0703 --76.0687 --76.075 --76.0687 --76.0594 --76.0687 --76.0766 --76.0578 --76.0672 --76.0656 --76.0469 --76.0719 --76.0672 --76.0781 --76.0687 --76.0578 --76.0641 --76.0578 --76.0641 --76.0641 --76.0656 --76.0687 --76.0703 --76.0594 --76.0703 --76.0703 --76.0734 --76.075 --76.075 --76.0641 --76.0781 --76.0641 --76.0656 --76.0594 --76.0578 --76.0531 --76.0625 --76.0609 --76.0609 --76.0531 --76.0578 --76.0578 --76.0656 --76.0453 --76.0859 --76.0734 --76.0687 --76.0547 --76.0578 --76.0578 --76.0687 --76.0656 --76.0469 --76.0672 --76.0609 --76.0469 --76.0609 --76.0484 --76.0672 --76.0625 --76.0594 --76.0609 --76.0578 --76.0641 --76.0453 --76.0687 --76.0625 --76.0609 --76.0703 --76.0594 --76.0641 --76.0719 --76.0547 --76.0625 --76.0656 --76.0594 --76.0563 --76.0594 --76.0672 --76.0672 --76.0703 --76.0719 --76.0578 --76.0594 --76.0703 --76.0687 --76.0547 --76.075 --76.0625 --76.0797 --76.0547 --76.0672 --76.0781 --76.0734 --76.0703 --76.0609 --76.0469 --76.0578 --76.0797 --76.0609 --76.0609 --76.0703 --76.0563 --76.0703 --76.0734 --76.0563 --76.0703 --76.0594 --76.0687 --76.0719 --76.0766 --76.0453 --76.0719 --76.0469 --76.0594 --76.0516 --76.0641 --76.0609 --76.0609 --76.0625 --76.0531 --76.0719 --76.0594 --76.0594 --76.0672 --76.0578 --76.0609 --76.0594 --76.0594 --76.0609 --76.0672 --76.0516 --76.0703 --76.0609 --76.0547 --76.0641 --76.0547 --76.075 --76.0625 --76.0687 --76.075 --76.0672 --76.0656 --76.0594 --76.0594 --76.0594 --76.0703 --76.0797 --76.0703 --76.05 --76.0656 --76.0719 --76.0578 --76.0578 --76.0625 --76.0656 --76.0734 --76.0719 --76.0594 --76.0547 --76.0578 --76.0625 --76.0563 --76.0531 --76.0547 --76.0547 --76.0531 --76.0594 --76.0625 --76.0531 --76.05 --76.0516 --76.0578 --76.0578 --76.0563 --76.05 --76.0687 --76.0672 --76.0531 --76.0734 --76.0578 --76.0594 --76.0531 --76.0563 --76.0453 --76.0672 --76.0703 --76.0641 --76.0594 --76.05 --76.0563 --76.0531 --76.0484 --76.0609 --76.0609 --76.0594 --76.0641 --76.0641 --76.0687 --76.0563 --76.0625 --76.0594 --76.0703 --76.05 --76.0547 --76.0516 --76.0656 --76.0594 --76.05 --76.0609 --76.0641 --76.0547 --76.0766 --76.0594 --76.0563 --76.0578 --76.0484 --76.0484 --76.0563 --76.0641 --76.0563 --76.0594 --76.0469 --76.0563 --76.0469 --76.0672 --76.0563 --76.0609 --76.0625 --76.0719 --76.0547 --76.0719 --76.0453 --76.0594 --76.0391 --76.05 --76.0641 --76.0594 --76.0469 --76.0656 --76.0656 --76.0547 --76.0516 --76.0656 --76.0469 --76.0563 --76.0453 --76.0703 --76.0656 --76.0656 --76.0609 --76.0609 --76.0719 --76.0734 --76.0687 --76.075 --76.0578 --76.0813 --76.0703 --76.0766 --76.0625 --76.0609 --76.0656 --76.0734 --76.075 --76.0672 --76.0719 --76.0672 --76.0563 --76.0656 --76.0656 --76.0563 --76.0625 --76.0687 --76.0531 --76.0625 --76.0578 --76.0563 --76.0703 --76.0656 --76.0672 --76.0516 --76.0594 --76.0531 --76.0656 --76.0578 --76.0625 --76.0578 --76.0734 --76.0656 --76.0656 --76.0578 --76.0656 --76.0625 --76.0484 --76.0609 --76.0484 --76.0547 --76.0656 --76.0641 --76.0672 --76.0703 --76.0734 --76.0781 --76.0734 --76.0625 --76.0641 --76.0797 --76.0531 --76.0625 --76.0578 --76.0547 --76.0594 --76.0719 --76.0516 --76.0422 --76.0625 --76.0547 --76.05 --76.0563 --76.0547 --76.0531 --76.0531 --76.0516 --76.0656 --76.0484 --76.0625 --76.0516 --76.0594 --76.0531 --76.0734 --76.0594 --76.0625 --76.0594 --76.0656 --76.0719 --76.0484 --76.0594 --76.0469 --76.0484 --76.0641 --76.0563 --76.0563 --76.05 --76.0516 --76.0672 --76.0594 --76.0719 --76.0469 --76.0625 --76.0594 --76.0641 --76.0719 --76.0703 --76.0703 --76.0672 --76.0563 --76.0656 --76.0813 --76.0703 --76.0578 --76.0813 --76.0563 --76.0797 --76.0656 --76.0625 --76.0672 --76.0625 --76.0687 --76.0531 --76.0563 --76.0703 --76.0734 --76.0734 --76.0609 --76.05 --76.0625 --76.0547 --76.0672 --76.0687 --76.0672 --76.0531 --76.0656 --76.0625 --76.0594 --76.0641 --76.0531 --76.0594 --76.0484 --76.0625 --76.0609 --76.0609 --76.0547 --76.0641 --76.0781 --76.0672 --76.0641 --76.0719 --76.0672 --76.0609 --76.0547 --76.075 --76.0703 --76.0672 --76.0516 --76.0594 --76.0609 --76.0484 --76.0609 --76.0578 --76.075 --76.0609 --76.0672 --76.0687 --76.0594 --76.0594 --76.0687 --76.0578 --76.05 --76.0547 --76.0484 --76.0547 --76.0641 --76.0625 --76.0484 --76.0594 --76.0625 --76.0578 --76.0531 --76.0594 --76.0453 --76.0531 --76.0578 --76.0687 --76.0594 --76.0437 --76.0547 --76.0437 --76.0641 --76.0547 --76.0516 --76.0563 --76.0547 --76.0516 --76.0594 --76.0531 --76.0672 --76.0594 --76.0641 --76.0687 --76.0609 --76.0703 --76.0672 --76.0563 --76.0797 --76.0703 --76.0656 --76.0766 --76.0656 --76.0656 --76.0656 --76.0687 --76.0594 --76.0719 --76.0687 --76.0797 --76.0719 --76.0547 --76.0625 --76.0766 --76.0641 --76.0687 --76.0625 --76.0594 --76.0563 --76.0563 --76.0594 --76.0719 --76.0563 --76.0563 --76.0672 --76.0563 --76.0609 --76.0609 --76.0656 --76.0547 --76.0563 --76.0563 --76.0656 --76.0687 --76.0625 --76.0641 --76.0609 --76.0656 --76.0625 --76.0656 --76.0609 --76.0484 --76.0656 --76.0437 --76.0609 --76.0594 --76.0516 --76.0578 --76.0516 --76.0609 --76.0703 --76.0609 --76.05 --76.0672 --76.0547 --76.0672 --76.0766 --76.075 --76.0687 --76.0734 --76.0734 --76.0734 --76.0672 --76.0578 --76.0797 --76.0594 --76.0594 --76.0578 --76.0641 --76.0766 --76.075 --76.0531 --76.0719 --76.0594 --76.0594 --76.0609 --76.0703 --76.0578 --76.0516 --76.0641 --76.0516 --76.0703 --76.0687 --76.0781 --76.0453 --76.0672 --76.0703 --76.0703 --76.0672 --76.0703 --76.0609 --76.0641 --76.0734 --76.0672 --76.0641 --76.0594 --76.0484 --76.0594 --76.0766 --76.0672 --76.0656 --76.0656 --76.0687 --76.0516 --76.0578 --76.0766 --76.075 --76.0563 --76.05 --76.0578 --76.0641 --76.075 --76.0656 --76.0531 --76.05 --76.0516 --76.0516 --76.0453 --76.05 --76.0641 --76.0531 --76.0531 --76.0547 --76.0719 --76.0469 --76.0578 --76.0531 --76.05 --76.0531 --76.0625 --76.0531 --76.0609 --76.0641 --76.0687 --76.0641 --76.0547 --76.0625 --76.0719 --76.0516 --76.0563 --76.0672 --76.0609 --76.0687 --76.05 --76.0516 --76.0516 --76.0547 --76.0672 --76.0437 --76.0625 --76.05 --76.0563 --76.0469 --76.0609 --76.0469 --76.0578 --76.0406 --76.0453 --76.0531 --76.0531 --76.0453 --76.0531 --76.0437 --76.0531 --76.0516 --76.0453 --76.0672 --76.05 --76.0563 --76.075 --76.0563 --76.0609 --76.0641 --76.0625 --76.0656 --76.0531 --76.0578 --76.0563 --76.0391 --76.0453 --76.0641 --76.0547 --76.0516 --76.0469 --76.0453 --76.0531 --76.0625 --76.0516 --76.0625 --76.0687 --76.0687 --76.0641 --76.0594 --76.0734 --76.0484 --76.0625 --76.0719 --76.0547 --76.0781 --76.0656 --76.0641 --76.0734 --76.0672 --76.0625 --76.0672 --76.0547 --76.0797 --76.0625 --76.0516 --76.0609 --76.0766 --76.0719 --76.0687 --76.0656 --76.05 --76.0656 --76.0641 --76.0656 --76.0687 --76.0594 --76.0641 --76.0844 --76.0641 --76.0625 --76.0703 --76.0422 --76.0656 --76.0594 --76.0563 --76.0719 --76.0734 --76.0797 --76.0703 --76.0516 --76.0672 --76.0578 --76.0563 --76.0828 --76.0516 --76.0375 --76.0641 --76.0641 --76.0609 --76.0609 --76.0516 --76.05 --76.0656 --76.0594 --76.0672 --76.0625 --76.0625 --76.0594 --76.0531 --76.0547 --76.0703 --76.05 --76.0484 --76.0484 --76.0594 --76.0484 --76.0656 --76.05 --76.0578 --76.0406 --76.0656 --76.0484 --76.0641 --76.05 --76.0703 --76.0609 --76.0594 --76.0797 --76.0609 --76.0609 --76.0797 --76.0531 --76.0656 --76.0687 --76.0719 --76.0641 --76.0641 --76.0563 --76.0563 --76.0703 --76.0594 --76.0609 --76.0531 --76.0656 --76.0609 --76.0563 --76.0437 --76.0766 --76.0453 --76.0422 --76.05 --76.0641 --76.0547 --76.0609 --76.0594 --76.0594 --76.0625 --76.0531 --76.0453 --76.0578 --76.0531 --76.0531 --76.0437 --76.0391 --76.0563 --76.0609 --76.0563 --76.0609 --76.0516 --76.0437 --76.0406 --76.0641 --76.0437 --76.0563 --76.0656 --76.0531 --76.0672 --76.0516 --76.0547 --76.0594 --76.0453 --76.0469 --76.0547 --76.0531 --76.0359 --76.0672 --76.0578 --76.0656 --76.0563 --76.05 --76.0578 --76.0609 --76.0672 --76.0672 --76.0563 --76.0687 --76.0609 --76.0609 --76.0641 --76.0531 --76.0656 --76.0547 --76.0656 --76.0547 --76.0516 --76.0563 --76.0672 --76.0547 --76.0813 --76.0563 --76.0625 --76.0563 --76.0578 --76.05 --76.0563 --76.0672 --76.0609 --76.0687 --76.0531 --76.0547 --76.0516 --76.0547 --76.0563 --76.0578 --76.0547 --76.0594 --76.0625 --76.0625 --76.0625 --76.0547 --76.0484 --76.0594 --76.0547 --76.0609 --76.0687 --76.0609 --76.0625 --76.0703 --76.0547 --76.0609 --76.075 --76.0719 --76.0687 --76.0656 --76.0594 --76.0656 --76.0641 --76.0641 --76.0781 --76.0719 --76.0641 --76.0672 --76.0609 --76.0656 --76.0656 --76.0531 --76.0703 --76.0766 --76.0719 --76.0703 --76.0719 --76.0703 --76.0687 --76.0766 --76.0734 --76.0484 --76.0531 --76.05 --76.0734 --76.0625 --76.0719 --76.0594 --76.0719 --76.0719 --76.0703 --76.0578 --76.0656 --76.0531 --76.0625 --76.0687 --76.0625 --76.0641 --76.0734 --76.0578 --76.0656 --76.0656 --76.0609 --76.0703 --76.0687 --76.0625 --76.0625 --76.0609 --76.0641 --76.0766 --76.0641 --76.0641 --76.0594 --76.0641 --76.0656 --76.0625 --76.0594 --76.0703 --76.0656 --76.0625 --76.0641 --76.0594 --76.0531 --76.0609 --76.0594 --76.0594 --76.0687 --76.0703 --76.0703 --76.0781 --76.0687 --76.0766 --76.0609 --76.0703 --76.0609 --76.0625 --76.0641 --76.0578 --76.0703 --76.0563 --76.0578 --76.0609 --76.0719 --76.0672 --76.0578 --76.0672 --76.0703 --76.0719 --76.0687 --76.0641 --76.0609 --76.0625 --76.0672 --76.0672 --76.0594 --76.0609 --76.0531 --76.0484 --76.0531 --76.0641 --76.0484 --76.0531 --76.0422 --76.0406 --76.0563 --76.0531 --76.05 --76.0578 --76.0563 --76.0422 --76.0625 --76.0547 --76.0516 --76.0641 --76.0563 --76.0484 --76.05 --76.0531 --76.0484 --76.0641 --76.0406 --76.075 --76.0609 --76.0469 --76.0687 --76.0547 --76.0656 --76.0516 --76.0656 --76.05 --76.0531 --76.0656 --76.0578 --76.0484 --76.0594 --76.0594 --76.0469 --76.0625 --76.0578 --76.0547 --76.0422 --76.0469 --76.0578 --76.0609 --76.0531 --76.0422 --76.0609 --76.0547 --76.0516 --76.05 --76.0578 --76.0484 --76.0391 --76.0531 --76.0516 --76.0547 --76.0594 --76.0547 --76.0563 --76.0563 --76.0516 --76.0516 --76.0516 --76.0594 --76.0594 --76.0437 --76.0594 --76.0609 --76.0578 --76.0563 --76.0578 --76.0547 --76.0578 --76.0578 --76.0563 --76.05 --76.0609 --76.0547 --76.0531 --76.0531 --76.0469 --76.0234 --76.0328 --76.0422 --76.0375 --76.0406 --76.0406 --76.0469 --76.0437 --76.0531 --76.0422 --76.0563 --76.0469 --76.0422 --76.0437 --76.0531 --76.0547 --76.05 --76.0625 --76.0687 --76.0547 --76.0609 --76.0484 --76.0672 --76.0578 --76.0484 --76.0469 --76.05 --76.0469 --76.0563 --76.0469 --76.05 --76.0469 --76.0437 --76.0422 --76.0578 --76.0594 --76.0453 --76.0687 --76.0531 --76.0516 --76.0594 --76.0469 --76.0469 --76.0531 --76.0609 --76.0625 --76.0516 --76.0625 --76.0484 --76.0687 --76.0516 --76.0719 --76.0734 --76.0781 --76.0594 --76.0516 --76.0656 --76.0625 --76.0578 --76.0641 --76.0578 --76.0641 --76.0563 --76.0563 --76.0641 --76.0687 --76.0594 --76.0578 --76.0687 --76.0672 --76.0672 --76.0703 --76.0484 --76.0609 --76.0547 --76.0578 --76.0563 --76.0609 --76.0687 --76.0703 --76.0609 --76.0625 --76.0578 --76.0703 --76.0641 --76.075 --76.0687 --76.0609 --76.0687 --76.0578 --76.0594 --76.0641 --76.0719 --76.0656 --76.0578 --76.0687 --76.0734 --76.0609 --76.0531 --76.0625 --76.0672 --76.0609 --76.0703 --76.0563 --76.0547 --76.0703 --76.0625 --76.0625 --76.0594 --76.0641 --76.0734 --76.0656 --76.0656 --76.0875 --76.0531 --76.0625 --76.0563 --76.0687 --76.075 --76.0672 --76.0453 --76.0625 --76.0594 --76.0594 --76.0594 --76.0609 --76.0734 --76.0563 --76.0547 --76.0609 --76.0609 --76.0625 --76.05 --76.0484 --76.0656 --76.0609 --76.0641 --76.0563 --76.0531 --76.0594 --76.0609 --76.0625 --76.0609 --76.0656 --76.05 --76.0703 --76.0594 --76.0453 --76.0578 --76.0484 --76.0547 --76.0641 --76.0703 --76.0734 --76.0547 --76.0703 --76.0609 --76.05 --76.0609 --76.0578 --76.0625 --76.0625 --76.0484 --76.0531 --76.0531 --76.0391 --76.0703 --76.0641 --76.0625 --76.0672 --76.0563 --76.0687 --76.0719 --76.0609 --76.0578 --76.0672 --76.0563 --76.0547 --76.0734 --76.0625 --76.0594 --76.0703 --76.0672 --76.0656 --76.0609 --76.0625 --76.0547 --76.0531 --76.0594 --76.0563 --76.0719 --76.0625 --76.0563 --76.0656 --76.0594 --76.0578 --76.0687 --76.0547 --76.0609 --76.0609 --76.0578 --76.0719 --76.0672 --76.0719 --76.0797 --76.0547 --76.0531 --76.0641 --76.0563 --76.0594 --76.0437 --76.0531 --76.0578 --76.0516 --76.0422 --76.0453 --76.0484 --76.0531 --76.0594 --76.0437 --76.0516 --76.0594 --76.0531 --76.0531 --76.0625 --76.0594 --76.0578 --76.0641 --76.0781 --76.0672 --76.0734 --76.0656 --76.0641 --76.0609 --76.0719 --76.0672 --76.0625 --76.0672 --76.0578 --76.0531 --76.0703 --76.0656 --76.0703 --76.0656 --76.0719 --76.0547 --76.0516 --76.0594 --76.0531 --76.075 --76.0516 --76.0641 --76.0687 --76.0594 --76.0609 --76.0672 --76.0563 --76.0687 --76.0531 --76.0656 --76.0687 --76.075 --76.0672 --76.0625 --76.0578 --76.075 --76.0734 --76.0594 --76.0703 --76.0703 --76.0687 --76.0625 --76.0703 --76.0672 --76.0687 --76.0734 --76.0641 --76.0813 --76.0656 --76.0719 --76.0859 --76.0719 --76.0734 --76.0719 --76.0719 --76.0641 --76.0859 --76.0687 --76.0734 --76.0641 --76.0766 --76.0641 --76.0672 --76.0687 --76.0656 --76.0719 --76.0703 --76.0641 --76.0656 --76.0609 --76.0734 --76.0563 --76.0656 --76.0766 --76.0609 --76.0703 --76.0766 --76.075 --76.0734 --76.0703 --76.0859 --76.0641 --76.075 --76.0625 --76.0594 --76.0641 --76.0594 --76.075 --76.0578 --76.0656 --76.0641 --76.0687 --76.0672 --76.0563 --76.0656 --76.0672 --76.0719 --76.0531 --76.0687 --76.0563 --76.0594 --76.0687 --76.0672 --76.0687 --76.0672 --76.0641 --76.0625 --76.0813 --76.0687 --76.0625 --76.0797 --76.0641 --76.0609 --76.0719 --76.0656 --76.0766 --76.0781 --76.075 --76.0813 --76.0813 --76.0781 --76.0734 --76.0703 --76.0719 --76.0672 --76.075 --76.0609 --76.0687 --76.0703 --76.0703 --76.0797 --76.0719 --76.0687 --76.0813 --76.0703 --76.0719 --76.0687 --76.0687 --76.075 --76.0781 --76.0703 --76.075 --76.0687 --76.0625 --76.0875 --76.0687 --76.0734 --76.0781 --76.0813 --76.0687 --76.075 --76.075 --76.0719 --76.0625 --76.0734 --76.0734 --76.0641 --76.0813 --76.0781 --76.0844 --76.0797 --76.0734 --76.0891 --76.0594 --76.0703 --76.0734 --76.0687 --76.0609 --76.0781 --76.0687 --76.0781 --76.075 --76.0547 --76.0844 --76.0687 --76.0484 --76.075 --76.0563 --76.0563 --76.0813 --76.0625 --76.0563 --76.0719 --76.0563 --76.0609 --76.0875 --76.0766 --76.0687 --76.0734 --76.0687 --76.0641 --76.0687 --76.075 --76.0625 --76.075 --76.0687 --76.0656 --76.0625 --76.0672 --76.0813 --76.075 --76.0703 --76.0594 --76.0563 --76.0781 --76.0703 --76.0766 --76.0781 --76.0766 --76.0687 --76.0656 --76.0578 --76.0641 --76.0687 --76.0844 --76.0687 --76.0516 --76.0687 --76.0687 --76.0641 --76.0625 --76.0734 --76.0656 --76.0734 --76.0609 --76.0672 --76.0609 --76.0625 --76.0547 --76.0484 --76.0703 --76.0578 --76.0672 --76.0687 --76.0719 --76.0656 --76.0719 --76.0656 --76.0594 --76.0734 --76.0641 --76.0531 --76.0609 --76.0594 --76.0609 --76.0766 --76.0563 --76.0719 --76.0625 --76.0672 --76.0781 --76.0516 --76.0625 --76.075 --76.0781 --76.0703 --76.0656 --76.0719 --76.0781 --76.0781 --76.0625 --76.0813 --76.0687 --76.0781 --76.0687 --76.0656 --76.0781 --76.0781 --76.075 --76.0797 --76.0891 --76.0797 --76.0828 --76.0875 --76.0641 --76.0641 --76.0734 --76.0813 --76.0719 --76.0781 --76.0781 --76.0656 --76.0656 --76.0703 --76.0797 --76.0625 --76.0687 --76.0734 --76.0813 --76.0531 --76.0734 --76.0672 --76.0734 --76.0703 --76.0687 --76.0719 --76.0734 --76.0813 --76.0687 --76.0797 --76.0734 --76.0719 --76.0828 --76.0906 --76.075 --76.0594 --76.0813 --76.0797 --76.0938 --76.0687 --76.0687 --76.0828 --76.0891 --76.075 --76.0828 --76.0875 --76.0969 --76.1031 --76.0922 --76.075 --76.0719 --76.0844 --76.075 --76.0797 --76.0672 --76.0922 --76.0813 --76.0734 --76.075 --76.075 --76.0813 --76.0766 --76.0719 --76.0797 --76.0703 --76.0734 --76.0734 --76.0703 --76.0703 --76.0703 --76.0797 --76.0641 --76.0719 --76.0797 --76.0797 --76.0797 --76.0875 --76.0906 --76.075 --76.0844 --76.0734 --76.0781 --76.0875 --76.0938 --76.0828 --76.0891 --76.0797 --76.0828 --76.0844 --76.0781 --76.0859 --76.0672 --76.0844 --76.0797 --76.075 --76.075 --76.0672 --76.0766 --76.0609 --76.0766 --76.0687 --76.0719 --76.0813 --76.0859 --76.0781 --76.0703 --76.0719 --76.0656 --76.0687 --76.0719 --76.0703 --76.075 --76.0719 --76.0687 --76.0781 --76.0813 --76.075 --76.0813 --76.0813 --76.0766 --76.0813 --76.0797 --76.0828 --76.0687 --76.0828 --76.0828 --76.0656 --76.0844 --76.0672 --76.0547 --76.0625 --76.0656 --76.0734 --76.0609 --76.0766 --76.0594 --76.0719 --76.0781 --76.0531 --76.0656 --76.0531 --76.0703 --76.0594 --76.0641 --76.0484 --76.0578 --76.0594 --76.0547 --76.0578 --76.0625 --76.0641 --76.0563 --76.0625 --76.0625 --76.075 --76.0531 --76.0625 --76.0453 --76.0578 --76.0641 --76.0672 --76.0766 --76.0625 --76.0687 --76.0547 --76.0547 --76.0672 --76.0672 --76.0641 --76.0687 --76.0641 --76.0656 --76.0687 --76.0766 --76.0594 --76.0625 --76.0719 --76.0719 --76.0609 --76.0656 --76.0687 --76.0687 --76.0781 --76.0719 --76.0703 --76.0625 --76.0828 --76.0594 --76.075 --76.0641 --76.0594 --76.0781 --76.0609 --76.0781 --76.0703 --76.0672 --76.075 --76.0703 --76.0719 --76.0734 --76.0656 --76.0641 --76.0781 --76.0687 --76.0672 --76.075 --76.0703 --76.0766 --76.0594 --76.0703 --76.0703 --76.0766 --76.075 --76.0672 --76.0641 --76.0516 --76.0656 --76.0687 --76.0672 --76.0641 --76.0766 --76.0641 --76.0703 --76.0781 --76.0719 --76.0672 --76.0719 --76.0641 --76.0687 --76.0641 --76.0766 --76.0656 --76.0625 --76.0719 --76.0703 --76.0672 --76.0672 --76.0734 --76.0672 --76.0625 --76.0687 --76.0625 --76.0687 --76.0609 --76.0797 --76.0719 --76.0734 --76.0703 --76.0766 --76.0656 --76.075 --76.0828 --76.0859 --76.0844 --76.0703 --76.075 --76.0734 --76.0594 --76.0766 --76.0625 --76.0844 --76.0781 --76.0781 --76.0719 --76.0797 --76.0938 --76.0828 --76.0609 --76.0906 --76.0687 --76.0906 --76.0828 --76.0641 --76.0781 --76.0781 --76.0766 --76.0797 --76.075 --76.0578 --76.0734 --76.0687 --76.0687 --76.0734 --76.0656 --76.0781 --76.0641 --76.0719 --76.0734 --76.0687 --76.0844 --76.0766 --76.0766 --76.0719 --76.0641 --76.0609 --76.0547 --76.0563 --76.0641 --76.0578 --76.075 --76.0672 --76.0813 --76.0734 --76.0672 --76.0687 --76.0734 --76.0656 --76.075 --76.0734 --76.0687 --76.0719 --76.0625 --76.0625 --76.0797 --76.0656 --76.0563 --76.0734 --76.0703 --76.0719 --76.0719 --76.0703 --76.0734 --76.0656 --76.0719 --76.0641 --76.0813 --76.0625 --76.0781 --76.0703 --76.0797 --76.0734 --76.0766 --76.0672 --76.0641 --76.0828 --76.0719 --76.0703 --76.0875 --76.0797 --76.0766 --76.0703 --76.0813 --76.0766 --76.0687 --76.0672 --76.0719 --76.0797 --76.075 --76.0813 --76.0859 --76.0813 --76.0875 --76.0969 --76.0844 --76.0781 --76.0687 --76.0734 --76.0734 --76.0703 --76.0781 --76.0734 --76.075 --76.0844 --76.0734 --76.0813 --76.0656 --76.0828 --76.0813 --76.0828 --76.0984 --76.0813 --76.0797 --76.0766 --76.0797 --76.075 --76.0781 --76.0594 --76.0687 --76.0875 --76.0734 --76.0781 --76.0734 --76.0687 --76.0734 --76.0875 --76.0797 --76.075 --76.0687 --76.0719 --76.0875 --76.0734 --76.0703 --76.0719 --76.0781 --76.0734 --76.0734 --76.0906 --76.0766 --76.0719 --76.0672 --76.0844 --76.0656 --76.0984 --76.0734 --76.0719 --76.0797 --76.0687 --76.0609 --76.0703 --76.0687 --76.0625 --76.075 --76.0687 --76.075 --76.0703 --76.0609 --76.0719 --76.0797 --76.0641 --76.0781 --76.0703 --76.0766 --76.0563 --76.0656 --76.0578 --76.0687 --76.0656 --76.0594 --76.0563 --76.0703 --76.0703 --76.0734 --76.0672 --76.0703 --76.0781 --76.0703 --76.0797 --76.0672 --76.0703 --76.0687 --76.0656 --76.0719 --76.0641 --76.0687 --76.0719 --76.0797 --76.0766 --76.0734 --76.0609 --76.0844 --76.0672 --76.0672 --76.0656 --76.0766 --76.0687 --76.0797 --76.0734 --76.0766 --76.0813 --76.0719 --76.0672 --76.0687 --76.0781 --76.0656 --76.0828 --76.0875 --76.0813 --76.0797 --76.0766 --76.1 --76.0953 --76.075 --76.0781 --76.0781 --76.0734 --76.0875 --76.0703 --76.0656 --76.0672 --76.0781 --76.0656 --76.0875 --76.0813 --76.0625 --76.0703 --76.0687 --76.0766 --76.0797 --76.0859 --76.0844 --76.0719 --76.0891 --76.0703 --76.0828 --76.0719 --76.0828 --76.0906 --76.0641 --76.0625 --76.0734 --76.0625 --76.0813 --76.0719 --76.0563 --76.0813 --76.0766 --76.0547 --76.0641 --76.0813 --76.0781 --76.0875 --76.0625 --76.0625 --76.0766 --76.075 --76.0703 --76.075 --76.0734 --76.0656 --76.0781 --76.075 --76.0641 --76.075 --76.0781 --76.075 --76.0703 --76.0563 --76.0625 --76.0766 --76.0687 --76.0703 --76.0578 --76.0641 --76.0719 --76.0859 --76.0797 --76.0828 --76.0563 --76.075 --76.0641 --76.0687 --76.075 --76.0875 --76.0578 --76.0687 --76.0656 --76.0734 --76.0719 --76.0625 --76.0797 --76.0563 --76.0734 --76.0641 --76.0703 --76.0609 --76.0531 --76.0594 --76.0703 --76.0563 --76.0891 --76.0687 --76.0672 --76.0687 --76.0719 --76.0813 --76.0703 --76.0672 --76.0578 --76.0734 --76.0641 --76.0687 --76.0703 --76.0625 --76.0656 --76.0781 --76.0656 --76.0578 --76.0703 --76.0531 --76.0609 --76.0687 --76.0531 --76.0656 --76.0578 --76.0578 --76.0781 --76.0687 --76.0781 --76.0609 --76.0719 --76.0656 --76.0734 --76.0641 --76.0734 --76.0828 --76.0656 --76.0687 --76.0734 --76.0594 --76.0641 --76.0531 --76.0656 --76.0625 --76.0734 --76.0609 --76.0656 --76.0516 --76.0703 --76.0578 --76.0734 --76.0656 --76.0578 --76.0594 --76.0578 --76.0625 --76.0594 --76.0687 --76.0797 --76.0641 --76.0656 --76.0781 --76.0656 --76.0625 --76.0625 --76.0609 --76.0719 --76.0609 --76.0672 --76.0609 --76.075 --76.0781 --76.0578 --76.0781 --76.0609 --76.0906 --76.0734 --76.0625 --76.0813 --76.0625 --76.0734 --76.0687 --76.0687 --76.0703 --76.0781 --76.0594 --76.0734 --76.075 --76.0734 --76.0656 --76.0672 --76.0578 --76.0656 --76.0672 --76.0687 --76.0703 --76.0641 --76.0687 --76.0563 --76.0656 --76.0594 --76.0813 --76.0719 --76.0641 --76.0672 --76.0609 --76.0609 --76.0734 --76.0656 --76.075 --76.0844 --76.0609 --76.0719 --76.0719 --76.0687 --76.075 --76.0734 --76.0734 --76.0641 --76.0703 --76.0797 --76.0547 --76.0734 --76.0734 --76.0703 --76.0859 --76.0578 --76.0672 --76.0625 --76.0656 --76.0766 --76.0813 --76.0672 --76.0734 --76.0484 --76.0766 --76.0703 --76.0734 --76.0594 --76.075 --76.0609 --76.0594 --76.0844 --76.0656 --76.0656 --76.0594 --76.0656 --76.0516 --76.0656 --76.0844 --76.0609 --76.0781 --76.0828 --76.0656 --76.0766 --76.0781 --76.0766 --76.0703 --76.0719 --76.0828 --76.0719 --76.075 --76.0813 --76.0828 --76.0687 --76.0687 --76.0813 --76.0578 --76.0844 --76.0672 --76.0625 --76.0719 --76.0594 --76.0687 --76.0797 --76.0734 --76.0703 --76.0734 --76.0875 --76.0687 --76.0828 --76.0687 --76.0828 --76.0672 --76.0656 --76.0547 --76.0687 --76.0734 --76.0609 --76.0719 --76.075 --76.0766 --76.0797 --76.0813 --76.0687 --76.0672 --76.0687 --76.0578 --76.0828 --76.0641 --76.0828 --76.0625 --76.0672 --76.0813 --76.0828 --76.0719 --76.0672 --76.0703 --76.0641 --76.0625 --76.0656 --76.0734 --76.0641 --76.0625 --76.0641 --76.0766 --76.0703 --76.0781 --76.0609 --76.0656 --76.0672 --76.0656 --76.0625 --76.0703 --76.0719 --76.0687 --76.0625 --76.0594 --76.075 --76.0656 --76.0625 --76.0687 --76.0625 --76.0734 --76.0687 --76.0734 --76.0813 --76.0609 --76.0594 --76.0563 --76.0625 --76.0687 --76.0734 --76.0766 --76.0609 --76.0766 --76.0828 --76.0797 --76.0578 --76.0687 --76.0703 --76.0703 --76.0625 --76.0766 --76.0703 --76.0672 --76.0766 --76.0703 --76.0734 --76.0734 --76.0766 --76.0859 --76.0672 --76.0703 --76.0813 --76.0656 --76.0875 --76.075 --76.0609 --76.0734 --76.0828 --76.0875 --76.0781 --76.0828 --76.0781 --76.0828 --76.0813 --76.0813 --76.0844 --76.0828 --76.0703 --76.0875 --76.0922 --76.0766 --76.0859 --76.0719 --76.075 --76.0656 --76.0687 --76.0797 --76.0672 --76.0578 --76.0781 --76.075 --76.0656 --76.0672 --76.0594 --76.0859 --76.0594 --76.0672 --76.0781 --76.0859 --76.0813 --76.0766 --76.0781 --76.0687 --76.0797 --76.0656 --76.0672 --76.0703 --76.0734 --76.0687 --76.0687 --76.0828 --76.0781 --76.0719 --76.0766 --76.0594 --76.0719 --76.0781 --76.0828 --76.0641 --76.0766 --76.0797 --76.0703 --76.0797 --76.0734 --76.0766 --76.0656 --76.0859 --76.0844 --76.0687 --76.0578 --76.075 --76.0719 --76.0734 --76.0687 --76.0719 --76.0766 --76.075 --76.0594 --76.0734 --76.075 --76.0844 --76.0828 --76.0984 --76.0828 --76.0703 --76.0781 --76.0703 --76.0687 --76.0672 --76.0719 --76.0734 --76.0719 --76.0781 --76.0781 --76.0687 --76.0766 --76.0672 --76.0687 --76.0906 --76.0797 --76.075 --76.0656 --76.0875 --76.0594 --76.0625 --76.0609 --76.0813 --76.0797 --76.0609 --76.0766 --76.0609 --76.0672 --76.0797 --76.0828 --76.0719 --76.0781 --76.0687 --76.0672 --76.0734 --76.0687 --76.0656 --76.0766 --76.075 --76.0703 --76.0687 --76.0719 --76.0719 --76.0797 --76.0891 --76.0719 --76.0656 --76.0719 --76.075 --76.0781 --76.0828 --76.0687 --76.0891 --76.0766 --76.0625 --76.0734 --76.0813 --76.0563 --76.0719 --76.0687 --76.0813 --76.0719 --76.0719 --76.0844 --76.0844 --76.0703 --76.0781 --76.0641 --76.0719 --76.0625 --76.0703 --76.0703 --76.075 --76.0734 --76.0687 --76.0766 --76.075 --76.0719 --76.0734 --76.0797 --76.0859 --76.0797 --76.0703 --76.0797 --76.0797 --76.075 --76.0687 --76.0813 --76.0734 --76.0844 --76.0797 --76.0797 --76.0687 --76.0719 --76.0781 --76.0641 --76.0797 --76.0781 --76.0797 --76.0859 --76.0813 --76.0828 --76.0859 --76.0938 --76.0766 --76.0734 --76.0656 --76.0703 --76.0766 --76.0687 --76.0813 --76.0641 --76.0797 --76.0844 --76.0719 --76.075 --76.0781 --76.0672 --76.0813 --76.0797 --76.0641 --76.0859 --76.0766 --76.075 --76.0734 --76.0813 --76.0719 --76.0656 --76.0875 --76.0813 --76.0891 --76.0828 --76.0766 --76.075 --76.0813 --76.0656 --76.075 --76.0891 --76.0844 --76.0969 --76.0859 --76.0766 --76.0797 --76.0891 --76.0859 --76.0922 --76.0781 --76.0875 --76.0781 --76.0859 --76.0844 --76.075 --76.0797 --76.0797 --76.0844 --76.0813 --76.0859 --76.0781 --76.0891 --76.0656 --76.0859 --76.0609 --76.0922 --76.0844 --76.0797 --76.0719 --76.0891 --76.0875 --76.0781 --76.0859 --76.0844 --76.0687 --76.0797 --76.0844 --76.0875 --76.0766 --76.0828 --76.0859 --76.075 --76.0844 --76.0797 --76.0922 --76.0875 --76.0844 --76.0734 --76.0828 --76.0875 --76.0797 --76.0875 --76.075 --76.0813 --76.0797 --76.0781 --76.075 --76.0844 --76.0672 --76.0766 --76.0641 --76.0813 --76.0797 --76.0766 --76.0875 --76.0797 --76.0844 --76.0922 --76.0844 --76.0906 --76.0813 --76.0938 --76.075 --76.0922 --76.0938 --76.0781 --76.0891 --76.0875 --76.0781 --76.0734 --76.0906 --76.0813 --76.0766 --76.0781 --76.0844 --76.075 --76.0828 --76.0797 --76.0891 --76.0766 --76.0734 --76.0813 --76.0875 --76.0891 --76.0766 --76.0797 --76.0844 --76.0719 --76.0859 --76.0766 --76.0734 --76.0766 --76.0719 --76.0641 --76.0797 --76.0875 --76.0875 --76.0844 --76.0797 --76.0781 --76.0891 --76.0625 --76.0656 --76.0781 --76.0859 --76.075 --76.0859 --76.0828 --76.0766 --76.0672 --76.0641 --76.0609 --76.0687 --76.0781 --76.0687 --76.0687 --76.0828 --76.0734 --76.0687 --76.0734 --76.0687 --76.0891 --76.0719 --76.0719 --76.0687 --76.0719 --76.0672 --76.0687 --76.0656 --76.0547 --76.0625 --76.0625 --76.0656 --76.0625 --76.0703 --76.0703 --76.075 --76.0625 --76.0781 --76.0766 --76.0703 --76.0828 --76.0828 --76.0734 --76.0687 --76.0687 --76.0609 --76.0859 --76.0563 --76.0641 --76.075 --76.0656 --76.0766 --76.0609 --76.0609 --76.075 --76.0609 --76.0625 --76.0656 --76.0609 --76.0703 --76.0641 --76.0766 --76.0578 --76.0656 --76.0734 --76.0547 --76.0609 --76.0719 --76.0719 --76.0531 --76.0687 --76.0766 --76.0687 --76.0687 --76.0766 --76.0656 --76.0672 --76.0734 --76.0766 --76.0734 --76.0594 --76.0781 --76.0766 --76.0578 --76.0703 --76.0625 --76.0687 --76.0547 --76.0625 --76.0625 --76.0563 --76.075 --76.0609 --76.0813 --76.0703 --76.0687 --76.0734 --76.0609 --76.0672 --76.0656 --76.0609 --76.0672 --76.0656 --76.0703 --76.075 --76.0797 --76.0672 --76.0641 --76.0625 --76.0734 --76.0719 --76.0656 --76.0516 --76.0703 --76.0781 --76.0703 --76.0641 --76.075 --76.0797 --76.0703 --76.0656 --76.0625 --76.075 --76.0703 --76.0687 --76.0797 --76.0703 --76.0594 --76.0719 --76.0828 --76.0672 --76.0578 --76.0813 --76.0734 --76.0922 --76.0828 --76.075 --76.0797 --76.0625 --76.0687 --76.0734 --76.0672 --76.0781 --76.0781 --76.0594 --76.0687 --76.0656 --76.075 --76.0813 --76.0781 --76.0859 --76.075 --76.0609 --76.075 --76.0859 --76.0719 --76.0719 --76.0797 --76.0797 --76.0844 --76.0766 --76.075 --76.0813 --76.0719 --76.0687 --76.0719 --76.0859 --76.0766 --76.0797 --76.0672 --76.0859 --76.0625 --76.0609 --76.0813 --76.0734 --76.0844 --76.0766 --76.0734 --76.0734 --76.0672 --76.075 --76.0797 --76.0687 --76.0828 --76.0844 --76.0687 --76.0828 --76.0922 --76.0906 --76.0781 --76.0938 --76.0922 --76.075 --76.075 --76.0781 --76.075 --76.0703 --76.0766 --76.0813 --76.0703 --76.0656 --76.0734 --76.075 --76.0672 --76.0891 --76.0687 --76.0844 --76.075 --76.0828 --76.0703 --76.0719 --76.0719 --76.0719 --76.075 --76.0734 --76.0781 --76.0813 --76.0734 --76.0672 --76.0672 --76.0719 --76.0672 --76.0719 --76.0703 --76.0719 --76.0656 --76.0687 --76.075 --76.0734 --76.0703 --76.0766 --76.0734 --76.075 --76.0781 --76.0687 --76.0719 --76.0766 --76.0719 --76.0734 --76.0656 --76.0547 --76.0672 --76.0828 --76.0563 --76.0672 --76.0719 --76.0672 --76.0641 --76.0719 --76.0625 --76.0703 --76.075 --76.0781 --76.0766 --76.0797 --76.0797 --76.0859 --76.0844 --76.0578 --76.0844 --76.0687 --76.0781 --76.0719 --76.0734 --76.0594 --76.075 --76.0672 --76.0797 --76.0687 --76.0703 --76.0547 --76.0797 --76.0687 --76.0656 --76.0797 --76.0734 --76.0766 --76.0719 --76.075 --76.0891 --76.0844 --76.0672 --76.0687 --76.0687 --76.0813 --76.075 --76.0828 --76.0922 --76.0875 --76.0703 --76.0641 --76.075 --76.0766 --76.0656 --76.0703 --76.0719 --76.0703 --76.0656 --76.0719 --76.0703 --76.0672 --76.0703 --76.0703 --76.0687 --76.0719 --76.0672 --76.0672 --76.0687 --76.0781 --76.0609 --76.0578 --76.0766 --76.075 --76.0594 --76.0719 --76.0844 --76.0672 --76.0656 --76.0594 --76.0578 --76.0687 --76.0672 --76.0625 --76.0625 --76.0578 --76.0687 --76.0656 --76.0719 --76.0641 --76.0594 --76.0719 --76.0656 --76.0656 --76.0641 --76.0578 --76.0656 --76.0625 --76.0531 --76.0656 --76.0609 --76.0797 --76.0625 --76.0641 --76.0672 --76.0625 --76.0734 --76.0563 --76.0516 --76.0719 --76.0625 --76.075 --76.0734 --76.0766 --76.0703 --76.0766 --76.0797 --76.0953 --76.0672 --76.0797 --76.0813 --76.0687 --76.0828 --76.0781 --76.0687 --76.0672 --76.0703 --76.0594 --76.0766 --76.0641 --76.0563 --76.0672 --76.0766 --76.0641 --76.0609 --76.0641 --76.0547 --76.0625 --76.0734 --76.0609 --76.0609 --76.0687 --76.0734 --76.0703 --76.0828 --76.0687 --76.0875 --76.0797 --76.075 --76.0641 --76.0734 --76.0656 --76.0641 --76.075 --76.0641 --76.0906 --76.0625 --76.0719 --76.0703 --76.0734 --76.0578 --76.0656 --76.0734 --76.0734 --76.0703 --76.0578 --76.0641 --76.0719 --76.0625 --76.0703 --76.0766 --76.0766 --76.0672 --76.0703 --76.0734 --76.0734 --76.0641 --76.0563 --76.0656 --76.0672 --76.0734 --76.0625 --76.0687 --76.0609 --76.0594 --76.0703 --76.0453 --76.0641 --76.0516 --76.0484 --76.0719 --76.0703 --76.0469 --76.0625 --76.0563 --76.0641 --76.0672 --76.0609 --76.0547 --76.0609 --76.0547 --76.0531 --76.0469 --76.0547 --76.0563 --76.0609 --76.05 --76.0766 --76.0531 --76.0609 --76.0609 --76.0625 --76.0469 --76.0594 --76.0437 --76.0672 --76.0516 --76.0531 --76.0578 --76.0563 --76.0422 --76.0656 --76.0578 --76.0531 --76.0516 --76.0625 --76.075 --76.0594 --76.0625 --76.0672 --76.0672 --76.0469 --76.0594 --76.0609 --76.0359 --76.0656 --76.0547 --76.0437 --76.0469 --76.0672 --76.0547 --76.0578 --76.0516 --76.0563 --76.05 --76.0609 --76.0437 --76.0594 --76.0484 --76.0641 --76.0594 --76.0594 --76.0687 --76.0594 --76.0672 --76.0672 --76.0734 --76.0625 --76.0531 --76.0578 --76.0578 --76.0656 --76.0516 --76.0594 --76.05 --76.0609 --76.0687 --76.0719 --76.0547 --76.0719 --76.0656 --76.0687 --76.0594 --76.0625 --76.0672 --76.0719 --76.0703 --76.0609 --76.0922 --76.0609 --76.0734 --76.0703 --76.0719 --76.0687 --76.0719 --76.0719 --76.0672 --76.0563 --76.0563 --76.0766 --76.0703 --76.0781 --76.0766 --76.0641 --76.0719 --76.0719 --76.0734 --76.0672 --76.0734 --76.0656 --76.0641 --76.0609 --76.0641 --76.075 --76.0656 --76.0734 --76.0687 --76.0734 --76.0656 --76.0687 --76.0609 --76.0687 --76.0641 --76.0625 --76.0625 --76.0797 --76.0687 --76.0656 --76.0625 --76.0766 --76.0797 --76.0563 --76.0734 --76.0547 --76.0625 --76.0687 --76.0484 --76.0625 --76.0641 --76.0578 --76.0594 --76.0687 --76.0625 --76.0766 --76.0734 --76.0656 --76.0563 --76.0578 --76.0641 --76.0672 --76.0656 --76.0625 --76.0625 --76.0641 --76.0625 --76.0625 --76.0625 --76.075 --76.0719 --76.0563 --76.0703 --76.0531 --76.0578 --76.0578 --76.0641 --76.0578 --76.0594 --76.0641 --76.0578 --76.05 --76.0687 --76.0656 --76.0531 --76.0547 --76.0531 --76.0656 --76.0516 --76.0578 --76.0484 --76.0516 --76.0469 --76.05 --76.0641 --76.0578 --76.0594 --76.0578 --76.0578 --76.0531 --76.0594 --76.0656 --76.0563 --76.0609 --76.0484 --76.05 --76.0484 --76.0625 --76.0531 --76.0516 --76.0484 --76.0578 --76.05 --76.0578 --76.0578 --76.0516 --76.05 --76.0594 --76.0547 --76.0563 --76.0563 --76.0594 --76.0609 --76.0469 --76.0563 --76.0641 --76.0516 --76.0516 --76.0516 --76.05 --76.05 --76.0453 --76.0469 --76.0672 --76.0406 --76.0516 --76.0391 --76.0484 --76.0563 --76.0406 --76.0578 --76.05 --76.0484 --76.0453 --76.05 --76.0469 --76.0563 --76.0516 --76.0375 --76.0422 --76.0469 --76.0359 --76.0516 --76.0469 --76.0312 --76.0484 --76.0437 --76.0594 --76.0437 --76.0437 --76.0578 --76.0422 --76.0437 --76.0406 --76.0531 --76.0563 --76.05 --76.0531 --76.0375 --76.0484 --76.0547 --76.0422 --76.0609 --76.0469 --76.0594 --76.0469 --76.0563 --76.0469 --76.0609 --76.0672 --76.0422 --76.0484 --76.05 --76.0437 --76.0359 --76.0344 --76.0344 --76.0375 --76.0437 --76.05 --76.0406 --76.0547 --76.0469 --76.0422 --76.0484 --76.0297 --76.0469 --76.0453 --76.0344 --76.0422 --76.05 --76.0437 --76.0469 --76.0484 --76.0422 --76.0422 --76.0484 --76.0484 --76.0656 --76.0484 --76.0312 --76.0437 --76.0328 --76.0453 --76.0687 --76.0328 --76.0391 --76.0422 --76.0391 --76.0469 --76.0391 --76.0625 --76.05 --76.0359 --76.0563 --76.0516 --76.0531 --76.05 --76.0469 --76.0406 --76.0484 --76.0484 --76.0422 --76.0453 --76.0375 --76.0328 --76.0422 --76.0375 --76.0563 --76.0563 --76.0406 --76.0422 --76.0453 --76.0641 --76.0344 --76.0578 --76.0594 --76.0484 --76.0516 --76.0469 --76.0609 --76.0594 --76.0484 --76.0391 --76.0437 --76.0531 --76.0547 --76.0469 --76.0437 --76.0563 --76.0531 --76.0547 --76.0406 --76.0469 --76.0484 --76.0391 --76.0437 --76.0547 --76.0531 --76.0547 --76.05 --76.0469 --76.0406 --76.0469 --76.0547 --76.0312 --76.0406 --76.0406 --76.0484 --76.0437 --76.0422 --76.0578 --76.0437 --76.0516 --76.0531 --76.0375 --76.0406 --76.0453 --76.0469 --76.0516 --76.0625 --76.0422 --76.0484 --76.0469 --76.0594 --76.0531 --76.0453 --76.0422 --76.0469 --76.0547 --76.0594 --76.0609 --76.0609 --76.0563 --76.0594 --76.0469 --76.0453 --76.0453 --76.0344 --76.0641 --76.0484 --76.0516 --76.05 --76.0469 --76.0547 --76.0594 --76.0453 --76.0641 --76.0453 --76.0703 --76.0453 --76.0312 --76.0406 --76.0563 --76.0563 --76.05 --76.0531 --76.0422 --76.0578 --76.0531 --76.0391 --76.0406 --76.0516 --76.0516 --76.0578 --76.0594 --76.0531 --76.0453 --76.0453 --76.0266 --76.0609 --76.0484 --76.0516 --76.0453 --76.0484 --76.0375 --76.0406 --76.0422 --76.0437 --76.0469 --76.0453 --76.0328 --76.0594 --76.05 --76.0406 --76.0375 --76.05 --76.0312 --76.0437 --76.0531 --76.0563 --76.0359 --76.0422 --76.0469 --76.0391 --76.0422 --76.0375 --76.0484 --76.0391 --76.05 --76.0437 --76.0531 --76.0344 --76.0453 --76.0563 --76.05 --76.0344 --76.0406 --76.0484 --76.0422 --76.0578 --76.0531 --76.0437 --76.0375 --76.0563 --76.0484 --76.0531 --76.0469 --76.0484 --76.0563 --76.0516 --76.0516 --76.0375 --76.0563 --76.0578 --76.0437 --76.05 --76.0484 --76.0375 --76.0359 --76.0297 --76.0453 --76.0531 --76.0391 --76.0516 --76.0437 --76.0328 --76.0484 --76.0578 --76.0359 --76.0391 --76.0406 --76.0312 --76.0297 --76.0359 --76.0328 --76.0312 --76.0281 --76.0359 --76.0422 --76.0469 --76.0469 --76.0344 --76.0328 --76.0297 --76.0312 --76.0234 --76.0219 --76.0281 --76.0312 --76.0344 --76.025 --76.0406 --76.0156 --76.0359 --76.0469 --76.0359 --76.0328 --76.0328 --76.0406 --76.0328 --76.0281 --76.0391 --76.0344 --76.0406 --76.0375 --76.0391 --76.0531 --76.0484 --76.0422 --76.0391 --76.0406 --76.0281 --76.0516 --76.0422 --76.0312 --76.0391 --76.0406 --76.0266 --76.0406 --76.0281 --76.0359 --76.0391 --76.0391 --76.0516 --76.0344 --76.0406 --76.0391 --76.0453 --76.0359 --76.0391 --76.0234 --76.0453 --76.0281 --76.0469 --76.0437 --76.0359 --76.0422 --76.0437 --76.0359 --76.0391 --76.0344 --76.0375 --76.025 --76.0156 --76.0391 --76.0391 --76.0469 --76.0375 --76.0437 --76.0406 --76.0359 --76.0328 --76.0266 --76.0328 --76.0344 --76.0422 --76.0281 --76.0312 --76.0344 --76.0453 --76.0266 --76.0453 --76.0391 --76.0406 --76.0219 --76.0391 --76.0406 --76.0328 --76.0453 --76.05 --76.0391 --76.0391 --76.0312 --76.025 --76.0266 --76.0328 --76.0375 --76.0312 --76.0312 --76.0281 --76.025 --76.0266 --76.025 --76.0266 --76.0375 --76.0453 --76.0406 --76.0281 --76.0406 --76.0328 --76.0328 --76.0297 --76.0234 --76.0328 --76.0297 --76.0234 --76.0344 --76.0391 --76.0266 --76.0391 --76.0188 --76.0266 --76.0344 --76.0359 --76.0328 --76.0328 --76.0281 --76.0375 --76.0297 --76.0281 --76.0297 --76.0297 --76.0312 --76.0453 --76.0359 --76.0359 --76.0391 --76.0328 --76.0188 --76.0219 --76.0375 --76.0281 --76.0312 --76.0234 --76.0312 --76.0391 --76.0281 --76.0359 --76.0328 --76.0234 --76.0344 --76.0188 --76.0219 --76.0359 --76.0328 --76.0312 --76.0375 --76.0359 --76.0234 --76.0422 --76.0266 --76.0344 --76.0266 --76.0328 --76.0406 --76.0234 --76.0203 --76.0297 --76.0266 --76.0359 --76.0219 --76.0281 --76.0375 --76.0281 --76.0391 --76.0344 --76.0453 --76.0219 --76.0344 --76.0328 --76.0375 --76.0391 --76.0297 --76.0406 --76.0266 --76.0469 --76.0359 --76.0344 --76.0219 --76.0375 --76.0406 --76.0328 --76.0406 --76.0312 --76.0375 --76.0312 --76.0328 --76.0422 --76.0547 --76.0437 --76.05 --76.0406 --76.0359 --76.0219 --76.0188 --76.0312 --76.0281 --76.0297 --76.0188 --76.0375 --76.0125 --76.0172 --76.0156 --76.0391 --76.0297 --76.025 --76.0234 --76.0344 --76.0172 --76.0188 --76.0281 --76.0234 --76.0312 --76.0328 --76.0172 --76.0375 --76.0281 --76.0312 --76.0312 --76.0266 --76.0344 --76.0359 --76.0297 --76.0312 --76.0406 --76.0422 --76.0359 --76.0437 --76.0359 --76.0453 --76.0453 --76.0281 --76.0344 --76.0469 --76.0563 --76.0422 --76.0453 --76.0391 --76.0312 --76.0312 --76.0437 --76.0422 --76.0391 --76.0609 --76.0234 --76.0391 --76.0406 --76.0328 --76.0234 --76.025 --76.0359 --76.0266 --76.0219 --76.0469 --76.0547 --76.0203 --76.0453 --76.0391 --76.0281 --76.0312 --76.0297 --76.0312 --76.0391 --76.0453 --76.0344 --76.0375 --76.0359 --76.0469 --76.0437 --76.0359 --76.0359 --76.0281 --76.0219 --76.0094 --76.0312 --76.0359 --76.0266 --76.0344 --76.0437 --76.0406 --76.0328 --76.0328 --76.0375 --76.0328 --76.0391 --76.0203 --76.0297 --76.0297 --76.0359 --76.0281 --76.0391 --76.0422 --76.0312 --76.0344 --76.0281 --76.025 --76.0359 --76.0484 --76.0516 --76.0484 --76.0234 --76.0531 --76.0625 --76.0344 --76.0453 --76.0609 --76.0422 --76.0563 --76.0437 --76.0469 --76.0422 --76.0453 --76.05 --76.05 --76.05 --76.0391 --76.0469 --76.0422 --76.0516 --76.0484 --76.05 --76.0422 --76.0469 --76.0484 --76.0437 --76.0453 --76.0406 --76.0406 --76.0312 --76.0359 --76.0469 --76.0516 --76.0359 --76.0453 --76.0563 --76.0516 --76.0484 --76.0531 --76.0531 --76.0516 --76.05 --76.0531 --76.0328 --76.0531 --76.0422 --76.0578 --76.0453 --76.0422 --76.05 --76.0406 --76.0453 --76.0469 --76.0609 --76.0359 --76.0391 --76.0281 --76.0406 --76.0391 --76.0375 --76.025 --76.0391 --76.0312 --76.0312 --76.0359 --76.0422 --76.0391 --76.0359 --76.0406 --76.0406 --76.0297 --76.0531 --76.0375 --76.0469 --76.0266 --76.0344 --76.0375 --76.0281 --76.0281 --76.0312 --76.0266 --76.0375 --76.0406 --76.0234 --76.0344 --76.0297 --76.0266 --76.0281 --76.0281 --76.0453 --76.0437 --76.0453 --76.0312 --76.0344 --76.0406 --76.0312 --76.0312 --76.0297 --76.0359 --76.0328 --76.0547 --76.0375 --76.0516 --76.0437 --76.0359 --76.0469 --76.0312 --76.0281 --76.0359 --76.0359 --76.0453 --76.0531 --76.0422 --76.05 --76.0328 --76.0453 --76.0437 --76.0266 --76.0453 --76.0328 --76.0297 --76.0453 --76.0297 --76.0422 --76.0375 --76.0312 --76.0516 --76.0297 --76.0359 --76.0437 --76.0422 --76.0406 --76.0375 --76.0406 --76.0422 --76.0344 --76.0406 --76.0516 --76.0422 --76.0484 --76.0422 --76.0406 --76.0359 --76.0453 --76.05 --76.0406 --76.0281 --76.0375 --76.0484 --76.0484 --76.0359 --76.0516 --76.0422 --76.0328 --76.0578 --76.0469 --76.0516 --76.05 --76.0656 --76.0609 --76.0437 --76.0516 --76.0437 --76.0453 --76.0375 --76.0625 --76.0516 --76.0484 --76.0484 --76.0375 --76.0406 --76.0453 --76.0375 --76.0547 --76.0375 --76.0437 --76.0547 --76.0531 --76.0375 --76.0422 --76.0469 --76.0578 --76.0422 --76.0516 --76.0391 --76.0469 --76.0469 --76.0375 --76.0422 --76.0469 --76.0547 --76.0422 --76.0437 --76.0406 --76.0375 --76.0344 --76.0391 --76.0359 --76.0375 --76.0281 --76.0422 --76.0203 --76.0266 --76.0406 --76.0312 --76.0375 --76.0219 --76.0359 --76.0266 --76.0281 --76.0422 --76.0203 --76.0406 --76.0297 --76.0406 --76.0484 --76.0469 --76.0312 --76.0469 --76.0375 --76.0406 --76.0391 --76.0344 --76.0484 --76.0484 --76.0328 --76.0328 --76.0422 --76.0344 --76.0422 --76.0344 --76.0344 --76.0344 --76.0453 --76.0453 --76.0359 --76.0406 --76.0375 --76.0375 --76.0281 --76.0391 --76.0344 --76.0266 --76.0469 --76.0188 --76.0312 --76.0359 --76.0359 --76.0266 --76.0188 --76.0297 --76.0297 --76.0312 --76.0359 --76.0297 --76.0266 --76.025 --76.0328 --76.0375 --76.0422 --76.0219 --76.0188 --76.0203 --76.0359 --76.0172 --76.0109 --76.0141 --76.0234 --76.0281 --76.0312 --76.0203 --76.0188 --76.025 --76.0078 --76.0344 --76.0281 --76.0281 --76.0344 --76.0359 --76.0281 --76.0375 --76.0219 --76.025 --76.0453 --76.0312 --76.0453 --76.0375 --76.0297 --76.0344 --76.0344 --76.0422 --76.0375 --76.025 --76.025 --76.0344 --76.0297 --76.0391 --76.0203 --76.025 --76.0406 --76.0359 --76.0328 --76.0234 --76.0297 --76.0422 --76.0234 --76.0437 --76.0391 --76.0344 --76.0453 --76.0437 --76.0359 --76.0328 --76.0234 --76.0406 --76.0266 --76.0328 --76.0391 --76.0312 --76.0281 --76.0328 --76.0266 --76.0219 --76.0188 --76.0328 --76.0234 --76.0344 --76.0203 --76.0328 --76.0266 --76.0375 --76.0359 --76.0297 --76.0219 --76.0234 --76.0328 --76.0281 --76.0406 --76.0344 --76.025 --76.0344 --76.0219 --76.0297 --76.0266 --76.0172 --76.0219 --76.0312 --76.0437 --76.0203 --76.0312 --76.0375 --76.0266 --76.0312 --76.0266 --76.025 --76.0219 --76.0234 --76.025 --76.0188 --76.0219 --76.0422 --76.0437 --76.0219 --76.0234 --76.0266 --76.025 --76.0062 --76.025 --76.0188 --76.0203 --76.0172 --76.0266 --76.0281 --76.0281 --76.0234 --76.0234 --76.0219 --76.0234 --76.0109 --76.025 --76.0312 --76.0203 --76.0188 --76.0156 --76.0219 --76.0375 --76.0234 --76.0047 --76.0312 --76.0328 --76.0109 --76.0391 --76.0281 --76.0328 --76.0188 --76.0266 --76.0141 --76.0203 --76.0266 --76.025 --76.0188 --76.0219 --76.0188 --76.0188 --76.0172 --76.0188 --76.0172 --76.0188 --76.0156 --76.0312 --75.9906 --76.0125 --76.0125 --76.0312 --76.0125 --76.0172 --76.0172 --76.0141 --76.0188 --76.0109 --76.0359 --76.0125 --76.0062 --76.0125 --76.0234 --76.0344 --76.0234 --76.0188 --76.0172 --76.0203 --76.0219 --76.0281 --76.0234 --76.0297 --76.0234 --76.0266 --76.0109 --76.0109 --76.0125 --76.0047 --76.0047 --76.0109 --76.0219 --76.0031 --76.0219 --76.0031 --76.0141 --76 --76.0125 --76.0125 --76.0172 --75.9969 --76.0031 --76.0109 --76.0188 --76.0094 --76.0125 --76.0078 --76.0141 --76.0094 --76.025 --76.025 --76.0156 --76.025 --76.0219 --76.0141 --76.0234 --76.0078 --76.0203 --76.0125 --76.0344 --76.0219 --76.0109 --76.0156 --76.0234 --76.0234 --76.0062 --76.0156 --76.0156 --76.0234 --76.0094 --76.0219 --76.0203 --76.0219 --76.0062 --76.025 --76.0266 --76.0172 --76.0109 --76.0156 --76.0219 --76.0078 --76.0219 --76.0188 --76.0328 --76.0172 --76.0062 --76.0156 --76.0172 --76.0156 --76.0078 --76.0188 --76.0094 --76.025 --76.0125 --76.0234 --76.0141 --76.0203 --76.0141 --76.0156 --76.0078 --76.0188 --76.0125 --76.025 --76.0109 --76.0109 --76.0141 --76.0156 --76.0188 --76.0172 --76.0328 --76.0281 --76.0203 --76.0297 --76.0297 --76.0266 --76.0109 --76.0219 --76.0312 --76.0234 --76.0219 --76.0188 --76.0219 --76.0344 --76.0156 --76.0266 --76.0328 --76.0281 --76.0078 --76.0203 --76.0188 --76.0203 --76.0109 --76.025 --76.0234 --76.0188 --76.0156 --76.0125 --76.0094 --76.0125 --76.0078 --76.0281 --76.0094 --76.0234 --76.0109 --76.0016 --76.0125 --76.0094 --76.0219 --76.0203 --76.0219 --76.0297 --76.0109 --76.0188 --76.025 --76.0062 --76.0125 --76.0172 --76.0266 --76.0047 --76.0234 --76.0203 --76.0312 --76.0219 --76.0062 --76.0234 --75.9984 --76.0219 --76.0219 --76 --76.0156 --76.0312 --76.0219 --76.0219 --76.0219 --76.0094 --76.0078 --76.0078 --76.0047 --76.0281 --76.0125 --76.0016 --76.0047 --76.0141 --76.0031 --76.0047 --76.0016 --76.0141 --76.0141 --76.0172 --76.0062 --76.0172 --76.0094 --76.0234 --75.9938 --76.0047 --76.0125 --76.0062 --75.9953 --76.0109 --75.9984 --76.0031 --76.0125 --76.0141 --76.0188 --76.0094 --76.0219 --76.0109 --76.0062 --75.9875 --76.0016 --76.0094 --76.025 --76.0141 --76.0156 --76.0188 --76.025 --76.0234 --76.0062 --76.0266 --76.0172 --76.0312 --76.0188 --76.0047 --76.0203 --76.0234 --76.0062 --76.0109 --76 --76.0062 --76.0141 --76.0078 --76.0188 --76.0156 --76.0172 --76.0188 --76.0141 --76.0062 --76.0172 --76.0188 --76.0172 --76.0156 --75.9969 --76.0172 --76.0172 --76.0172 --76.0016 --76.0188 --76.0125 --76.0094 --76.0016 --75.9984 --76.0078 --76.0047 --76.0156 --75.9891 --76.0047 --76.0109 --76.0031 --76.0016 --76.0062 --76.0047 --76.0125 --75.9953 --76.0094 --76.0062 --76.0031 --75.9922 --75.9984 --76.0062 --76.0047 --76.0125 --76 --75.9984 --76.0031 --76.0031 --75.9953 --76.0031 --75.9969 --76.0094 --76.0094 --76 --76.0094 --76.0203 --76.0031 --76.0016 --75.9984 --76.0125 --76.0141 --76.0094 --76.0062 --76.0062 --76.0031 --76.0141 --76.0219 --75.9875 --76.0109 --76.0062 --76.0094 --76.0141 --76.0078 --76.0125 --76.0156 --76.0125 --76.0125 --76.0016 --76.0062 --76.0172 --75.9953 --76.0141 --75.9953 --76.0016 --75.9969 --76.0125 --76.0047 --76.0031 --75.9984 --76.0062 --76.0062 --75.9922 --76.0031 --75.9922 --76 --75.9953 --76.0016 --76.0125 --76.0016 --76 --75.9969 --76.0031 --76.0156 --75.9922 --76.0109 --76.0016 --75.9984 --76.0047 --75.9969 --75.9953 --76.0078 --75.9922 --76.0031 --76.0047 --76.0125 --76.0141 --76.0047 --76.0156 --76.0078 --76 --75.9984 --76.0094 --76.0016 --76.0109 --76.0078 --76.0016 --75.9984 --75.9984 --76.0016 --76.0094 --76.0062 --75.9906 --76.0016 --76.0078 --75.9953 --76.0094 --76.0094 --76.0047 --75.9953 --75.9953 --76.0031 --76.0047 --75.9969 --76.0062 --76.0109 --75.9969 --76.0109 --76.0078 --76.0016 --75.9906 --76.0016 --75.9969 --76.0062 --75.9875 --75.9953 --76.0094 --76.0016 --76.0141 --75.9891 --75.9953 --76.0047 --76.0062 --76.0078 --76.0078 --75.9906 --75.9938 --75.9969 --75.9953 --75.9953 --75.9969 --76.0125 --76.0016 --75.9953 --76 --76.0031 --76.0141 --76.0016 --76.0078 --76.0031 --76.0078 --76.0156 --76.0031 --76.0047 --76.0078 --76.0141 --75.9969 --76.0031 --75.9984 --75.9938 --75.9969 --76 --76.0078 --76 --76 --76.0141 --75.9938 --75.9953 --76.0078 --76.0078 --76.0109 --76 --75.9906 --76.0062 --76.0078 --76.0156 --75.9969 --76.0078 --76.0141 --75.9922 --76.0078 --76.0062 --76.0125 --76.0062 --76.0203 --76.0172 --76.0141 --76.0203 --76.0172 --76.0141 --76.0188 --76.025 --76.0188 --76.0281 --76.0141 --76.0172 --76.0062 --76.0141 --76.0125 --76.0094 --76.0266 --76.0062 --76.0062 --76.0062 --76.0172 --76.0094 --76.0094 --76 --75.9969 --76.0016 --76.0094 --76.0047 --76.0266 --76.0203 --75.9969 --76.0078 --76.0047 --76.0062 --76.0094 --76.0203 --76.0031 --76.0078 --76.0062 --75.9969 --76.0062 --76.0094 --76.0094 --76.0047 --76.0078 --75.9844 --76.0156 --75.9953 --76.0141 --75.9969 --76.0031 --76.0172 --76 --76.0078 --76.0109 --76.0125 --76.0125 --75.9953 --76.0125 --76.0094 --76.0156 --76.0234 --76.0125 --76.0172 --76 --76.0047 --76.0172 --76.0141 --76.0234 --76.0219 --76.0078 --76.0109 --76.0062 --76.0047 --76.0203 --76 --76.0156 --76.0094 --76.0141 --76.0094 --76.0094 --76 --75.9922 --76.0047 --76.0078 --76.0031 --76.0047 --76.0062 --76.0125 --76 --76.0109 --76.0109 --76.0156 --76.0172 --76.0125 --76.0156 --76.0172 --76.0172 --76.0094 --76.0094 --76.0188 --76.0109 --76.0047 --76.0172 --76.0031 --76.0062 --76.0156 --76 --75.9938 --76.0094 --76.0109 --75.9922 --75.9922 --75.9922 --76.0125 --76.0109 --76.0047 --75.9969 --76.0188 --75.9922 --76.0078 --75.9984 --76.0016 --76.0016 --76.0031 --76.0094 --75.9969 --76.0172 --76.0062 --76.0156 --76.0062 --75.9938 --76.0219 --75.9969 --76.0062 --75.9984 --76.0016 --76.0062 --75.9922 --75.9891 --76.0062 --75.9969 --75.9969 --76.0047 --76.0109 --75.9969 --75.9969 --76.0078 --75.9938 --76.0078 --75.9938 --76.0125 --76.0094 --76.0141 --76.0234 --75.9938 --76.0109 --76.0078 --75.9969 --76.0016 --76.0172 --76.0109 --75.9922 --76.0156 --76.0094 --76.0078 --76.0109 --76.0078 --76.0078 --76 --76.0312 --76.0031 --76.0156 --76.0047 --75.9984 --76.0094 --76.0219 --76.0234 --76.0203 --76.0156 --76.0234 --76.0094 --76.0094 --76.0062 --76.0062 --75.9984 --75.9984 --75.9984 --75.9859 --75.9922 --76.0047 --75.9953 --76.0047 --75.9938 --75.9969 --75.9984 --75.9969 --75.9953 --76.0016 --75.9969 --75.9938 --75.9844 --75.9891 --75.9906 --75.9844 --75.9875 --75.9953 --75.9875 --75.9875 --75.9859 --75.9844 --75.9859 --75.9891 --75.9859 --75.9938 --75.9859 --75.9906 --75.9906 --75.9844 --75.9938 --75.975 --75.9938 --76 --76.0094 --75.9938 --75.9938 --76 --75.9906 --76.0031 --75.9844 --75.9953 --75.9891 --75.9812 --75.9906 --75.9766 --75.9812 --75.9891 --75.9938 --76.0016 --75.9938 --75.9844 --76 --75.9875 --75.975 --75.9844 --75.9984 --75.9859 --75.9859 --76 --75.9844 --75.9781 --75.9844 --75.9953 --75.9875 --75.9828 --75.9969 --75.9938 --75.9844 --75.9922 --75.9859 --75.9812 --75.9844 --75.9797 --75.9781 --75.9844 --75.9828 --75.9797 --75.9828 --75.9797 --75.9875 --75.9859 --75.9828 --75.9875 --75.9797 --75.9719 --75.9797 --75.9938 --75.9781 --75.9844 --75.9781 --75.9797 --75.9969 --75.9969 --75.9828 --75.9922 --75.9875 --75.9953 --75.9891 --75.9906 --75.9891 --75.9969 --75.9906 --75.9953 --76.0062 --75.9906 --75.9859 --75.9922 --76.0016 --75.9938 --75.9938 --75.9875 --75.9891 --75.9953 --75.9953 --75.9844 --76.0016 --75.9984 --75.9984 --75.9875 --75.9984 --75.9906 --75.9875 --75.9906 --75.9844 --75.9922 --75.9938 --75.9906 --75.9891 --75.9922 --75.9859 --75.9859 --75.9953 --75.9906 --75.9922 --75.9922 --75.9938 --75.9953 --76.0031 --75.9859 --76 --76 --76.0094 --75.9938 --75.9875 --75.9984 --75.9906 --75.9953 --75.9984 --76.0016 --75.9891 --75.9922 --75.9891 --76.0016 --75.9953 --76.0062 --75.9828 --76.0062 --76.0078 --76.0047 --75.9922 --75.9984 --76.0047 --76.0031 --75.9859 --75.9766 --75.9953 --75.9906 --75.975 --75.9953 --76.0016 --76.0031 --76 --76.0016 --75.9938 --75.9984 --76 --75.9969 --76.0016 --75.9922 --76.0062 --75.9953 --76.0016 --75.9953 --76.0172 --76.0078 --76 --75.9922 --75.9922 --75.9922 --75.9969 --76.0016 --76 --75.9953 --76.0031 --75.9922 --76.0078 --76.0031 --76.0062 --75.9922 --76.0016 --76.0078 --76.0125 --76.0031 --76.0016 --75.9922 --76.0203 --76.0016 --76.0109 --75.9953 --76.0062 --75.9984 --75.9875 --75.9938 --75.9906 --75.9875 --75.9984 --76.0109 --75.9953 --75.9891 --76 --76.0094 --75.9953 --75.9875 --76.0188 --75.9984 --76.0016 --75.9906 --75.9938 --75.9875 --75.9875 --75.9953 --75.9953 --76.0016 --76.0125 --75.9984 --75.9812 --75.9828 --75.9984 --76.0031 --75.9922 --76 --75.9875 --75.9875 --75.9891 --76.0047 --75.9844 --76.0078 --76.0062 --75.9969 --76.0062 --76.0047 --76.0031 --76.0141 --76.0062 --75.9844 --76.0031 --76.0031 --75.9953 --76.0016 --76 --76.0141 --76 --75.9984 --75.9891 --76.0156 --76.0141 --76.0094 --75.9969 --76.0031 --76.0016 --75.9953 --75.9953 --76 --76.0016 --76.0016 --75.9938 --76.0047 --75.9969 --75.9969 --75.9938 --76.0094 --76.0078 --75.9953 --75.9984 --76.0078 --75.9984 --75.9969 --75.9922 --75.9953 --75.9906 --75.9969 --76.0047 --76.0016 --76.0047 --76.0016 --76.0031 --75.9953 --76.0188 --76.0078 --76.0031 --75.9953 --76.0062 --75.9969 --76.0078 --75.9969 --75.9938 --75.9906 --76.0094 --75.9922 --76 --75.9984 --75.9891 --76 --76.0062 --76.0016 --76.0062 --76.0219 --75.9953 --75.9891 --76.0062 --76.0125 --75.9984 --76.0031 --75.9984 --75.9891 --75.9984 --76.0078 --76.0109 --76.0062 --76.0094 --76.0047 --76.0141 --76.0156 --76.0125 --76.0094 --76.0109 --76.0016 --75.9984 --76.0031 --76.0125 --76.0047 --76.0047 --75.9969 --76.0062 --76.0156 --76.0062 --76 --76.0031 --76.0047 --76.0031 --76.0016 --76.0094 --76.0141 --76.0047 --75.9984 --76.0094 --76.0125 --76.0125 --76.0172 --76.0031 --75.9984 --75.9984 --75.9953 --75.9875 --75.9969 --75.9953 --75.9969 --75.9984 --76.0109 --76.0094 --76.0094 --76.0141 --76.0031 --75.9969 --75.9984 --76.0031 --75.9969 --76.0016 --75.9969 --75.9859 --76.0031 --76.0031 --76.0141 --76.0062 --76.0172 --76.0047 --75.9984 --76.0047 --76.0094 --75.9859 --76 --75.9953 --76.0016 --75.9969 --75.9953 --76.0016 --76.0062 --75.975 --75.9922 --76.0047 --76.0016 --75.9953 --75.9953 --76.0016 --76.0172 --76.0047 --75.9969 --76.0062 --76 --76.0062 --76.0156 --76.0109 --76.0078 --75.9953 --76.0047 --76.0094 --76.0109 --76.0031 --76.0031 --76.0016 --76.0078 --76.0078 --76.0078 --75.9953 --76.0047 --76.0062 --76.0031 --76.0062 --75.9875 --75.9984 --75.9828 --75.9891 --76.0031 --75.9984 --75.9922 --76 --76.0109 --76.0062 --76.0062 --76.0031 --75.9984 --76.0141 --76.0078 --76.0062 --76 --76.0094 --76.0047 --76 --75.9891 --76 --75.9859 --76.0141 --76.0156 --76 --76.0125 --75.9828 --75.9891 --76 --75.9922 --76.0031 --76.0078 --76.0062 --75.9922 --76.0062 --76 --75.9922 --75.9953 --75.9953 --75.9938 --75.9922 --75.9859 --75.9828 --75.9984 --75.9922 --75.9812 --75.9906 --76 --75.9938 --75.9875 --76.0031 --75.9906 --75.9891 --75.9906 --75.9859 --75.9875 --75.9875 --75.9953 --75.9969 --76 --75.9875 --75.9922 --75.9922 --76.0031 --76.0078 --76.0156 --75.9875 --76.0016 --76.0031 --76.0031 --75.9969 --75.9984 --75.9953 --76.0094 --75.9859 --75.9969 --75.9984 --75.9984 --75.9984 --75.9781 --75.9938 --75.9875 --76.0125 --76.0016 --76.0031 --76.0031 --76.0141 --76 --76.0062 --76.0062 --76.0016 --76.0016 --76.0234 --75.9953 --76.0031 --76.0016 --76.0062 --76 --76.0141 --76.0125 --76.0094 --76.0203 --76.0031 --76.0109 --76.0109 --76.0094 --76.0109 --76.0094 --76 --76.0078 --76.0203 --76.0047 --76.0172 --76 --76.0031 --76.0062 --76.0094 --75.9984 --75.9969 --76.0125 --76.0141 --75.9953 --76.0125 --76.0172 --76.0047 --76.0094 --76.0031 --76.0094 --75.9938 --75.9906 --76.0094 --75.9938 --76.0031 --76.0094 --76 --75.9906 --76.0047 --76 --76.0078 --76.0078 --75.9938 --76.0031 --75.9969 --76.0172 --75.9953 --75.9891 --76.0016 --76.0047 --76.0078 --75.9953 --76.0219 --76 --76.0188 --75.9844 --76.0094 --75.9906 --76 --75.9906 --76.0031 --75.9922 --76.0031 --76 --75.9891 --75.9938 --76.0078 --76.0188 --76.0031 --75.9984 --75.9969 --76.0047 --76.0078 --75.9969 --76.0047 --75.9938 --76.0094 --76 --76.0125 --76 --75.9922 --75.9969 --75.9859 --75.9938 --75.9906 --75.9938 --76 --75.9891 --75.9984 --75.9969 --75.9938 --75.9984 --76.0031 --75.9969 --76.0062 --75.9906 --76.0016 --76.0141 --75.9859 --75.9875 --75.9906 --76.0031 --76.0047 --75.9969 --76 --75.9969 --75.9953 --75.9969 --75.9969 --76 --76 --76 --75.9953 --76 --76.0016 --75.9938 --75.9984 --75.9922 --76.0047 --75.9891 --76 --76.0031 --75.9953 --76.0047 --75.9922 --75.9984 --75.9922 --75.9938 --75.9875 --75.9938 --75.9969 --76 --75.9875 --76.0047 --75.9844 --75.9953 --75.9953 --76.0062 --75.9938 --75.9953 --76.0031 --75.9953 --76.0016 --76.0031 --76.0047 --76.0125 --76.0234 --76.0031 --76.0172 --76.0031 --76.0125 --76.0047 --75.9953 --76.0094 --76.0094 --76 --75.9969 --76.0109 --76.0094 --76.0062 --76.0047 --76.0031 --75.9953 --76.0109 --76.0031 --76.0031 --75.9938 --76.0031 --75.9969 --76 --75.9891 --75.9891 --76.0016 --75.9953 --75.9922 --75.9953 --76.0031 --75.9906 --76.0031 --75.9938 --76.0062 --76.0047 --75.9969 --76.0125 --75.9891 --76.0031 --75.9969 --76 --76.0047 --76.0016 --76.0109 --76.0094 --76.0078 --76.0031 --75.9984 --76 --75.9969 --76.0016 --75.9953 --76.0031 --76.0062 --75.9906 --76.0047 --75.9891 --76.0203 --76.0172 --75.9875 --76.0141 --75.9969 --75.9953 --75.9984 --76.0109 --76.0047 --75.9969 --76.0078 --75.9875 --76.0016 --75.9891 --76 --75.9875 --75.9953 --76.0016 --75.9969 --75.9906 --76.0062 --76.0062 --76.0016 --76 --75.9938 --75.9969 --75.9984 --76.0016 --75.9859 --75.9891 --75.9969 --75.9969 --75.9781 --76.0016 --75.9984 --75.9953 --75.9984 --75.9922 --76.0031 --75.9875 --75.9938 --76 --75.9953 --75.9828 --75.9953 --76 --76.0016 --75.9922 --75.9938 --76.0109 --75.9922 --75.9938 --75.9844 --75.9828 --75.9875 --75.9797 --75.9922 --75.9984 --75.9812 --76.0016 --75.9953 --76.0047 --75.9922 --75.9969 --75.9812 --75.9922 --75.9969 --75.9938 --75.9906 --76.0078 --75.9906 --75.9859 --76 --75.9844 --75.9891 --75.9953 --75.9984 --75.9922 --75.9906 --75.9906 --75.975 --75.9922 --75.9688 --75.9688 --75.9766 --75.9922 --75.9844 --75.9781 --75.9828 --75.9969 --75.9922 --75.9797 --75.9859 --75.9922 --75.9812 --75.9844 --75.9969 --75.9891 --75.9891 --75.9891 --76 --75.9891 --75.9844 --75.9859 --75.9922 --75.9984 --75.9781 --75.9922 --75.9891 --75.9922 --76.0094 --76 --75.9906 --75.9844 --75.9906 --75.9984 --76.0047 --75.9891 --75.9844 --75.9859 --75.9875 --75.9906 --75.9969 --75.9969 --75.9875 --76.0016 --76.0016 --76 --75.9906 --75.9875 --76.0031 --75.9891 --75.9781 --75.9922 --75.9938 --75.9828 --75.9844 --76.0031 --75.9844 --75.9812 --75.9859 --75.9781 --75.9844 --75.9906 --76 --75.9891 --75.9875 --75.9906 --75.9734 --75.9859 --75.9969 --75.9766 --75.9969 --75.975 --75.9969 --75.9938 --75.9859 --75.9812 --75.9812 --75.9938 --75.9734 --75.9891 --75.9828 --75.9922 --75.975 --75.9969 --75.9922 --76.0031 --76.0062 --75.9938 --75.9844 --76 --75.9781 --75.9719 --75.9812 --75.9844 --75.9938 --75.975 --75.9938 --75.9922 --75.9969 --76.0016 --75.9875 --75.9969 --75.9906 --75.9844 --75.9891 --75.9969 --75.9922 --75.9844 --75.9891 --75.9969 --75.9859 --76.0016 --75.9969 --75.9891 --75.9875 --75.9953 --76.0062 --76.0031 --75.9984 --75.9938 --75.9922 --75.9969 --76.0016 --76 --75.9906 --76.0031 --76.0062 --76.0016 --75.9859 --76.0062 --76.0109 --75.9844 --76.0125 --75.9938 --75.9984 --76.0031 --75.9953 --75.9984 --75.9938 --75.9859 --76 --76.0016 --75.9906 --76 --75.9984 --75.9938 --75.9922 --76.0094 --76.0016 --75.9969 --76 --75.9969 --76.0047 --75.9859 --76.0078 --75.9875 --76.0047 --75.9938 --75.9984 --75.9969 --75.9891 --75.9984 --75.9984 --76.0047 --76.0141 --76.0016 --76.0125 --75.9984 --75.9969 --75.9906 --75.9875 --75.9891 --75.9953 --75.9859 --76 --76.0016 --75.9938 --75.9953 --75.9953 --76.0109 --76.0016 --75.9906 --75.9984 --75.9906 --75.9938 --75.9797 --75.9875 --75.9984 --75.9891 --75.9922 --75.9969 --75.9828 --76.0016 --75.9859 --75.9922 --75.9938 --75.9938 --75.9953 --75.9891 --75.9922 --76.0062 --75.9891 --76 --75.9891 --75.9953 --76.0031 --75.9891 --75.9938 --76.0031 --76.0047 --75.9938 --75.9828 --75.9969 --75.9781 --75.9938 --75.9844 --76 --75.9938 --76.0094 --76 --75.9906 --75.9922 --75.9875 --76 --75.9953 --75.9891 --75.9734 --76.0031 --75.9797 --76.0031 --75.9938 --75.9984 --76.0031 --75.9969 --75.9984 --76.0062 --75.9938 --75.9938 --75.9922 --75.9828 --76.0016 --75.9922 --75.9875 --76.0047 --75.9828 --75.9891 --75.9906 --76.0016 --75.9891 --76.0047 --76 --76.0047 --76.0047 --76 --76.0078 --76.0109 --76.0156 --76.0094 --76.0125 --75.9969 --76.0062 --76.0047 --76.0062 --75.9906 --75.9938 --75.9938 --75.9922 --75.9922 --75.9984 --76.0047 --75.9859 --75.9922 --75.9781 --75.9859 --75.9875 --75.9922 --75.9781 --75.9938 --75.9938 --75.9984 --75.9922 --75.9875 --75.9875 --75.9844 --75.9875 --75.9844 --75.9844 --75.9875 --75.9984 --76 --75.9969 --75.9984 --76.0094 --75.9859 --75.9969 --75.9922 --75.9828 --75.9922 --75.9953 --75.9875 --75.9891 --76 --75.9984 --75.9969 --75.9984 --75.9922 --75.9953 --75.9797 --75.9891 --75.9812 --75.9938 --75.9797 --75.9906 --75.9906 --75.9891 --75.9844 --75.9969 --75.9984 --75.9938 --75.9875 --75.9922 --75.9797 --75.9906 --75.9828 --75.9984 --75.9938 --76 --75.9891 --76.0125 --76.0078 --76.0016 --75.9844 --75.9984 --75.9938 --75.9906 --75.9969 --75.9938 --75.9938 --76 --76 --75.9969 --75.9969 --75.9938 --75.9891 --75.9938 --76.0016 --75.9875 --76.0031 --75.9906 --75.9906 --75.9922 --76.0062 --75.9984 --75.9938 --76.0109 --76.0109 --76.0047 --75.9953 --76 --76.0031 --76.0094 --76.0016 --75.9953 --76.0062 --76.0031 --75.9938 --75.9938 --76.0078 --75.9969 --76.0047 --76.0078 --76.0094 --76.0031 --75.9938 --75.9938 --76.0078 --75.9906 --75.9938 --76.0062 --75.9969 --75.9906 --75.9969 --75.9984 --75.9938 --76.0016 --75.9906 --76.0047 --75.9969 --76.0156 --76 --76.0094 --76.0047 --76.0078 --76.0109 --75.9938 --75.9953 --75.9984 --75.9938 --75.9938 --75.9938 --75.9891 --75.9938 --75.9797 --76 --75.9859 --75.9984 --76.0016 --76 --75.9891 --76.0078 --75.9969 --75.9922 --76.0016 --76.0078 --75.9906 --76.0016 --76.0031 --75.9922 --75.9953 --76 --75.9953 --75.9906 --76.0031 --76.0078 --76.0062 --76.0062 --76.0109 --76.0141 --76.0016 --76.0094 --76.0172 --76.0094 --76.0078 --76 --76.0062 --76.0156 --76.0047 --76.0078 --76.0125 --76.0156 --75.9969 --76.0234 --76.0016 --76.0062 --76.0047 --76.0094 --75.9906 --75.9984 --75.9922 --76.0125 --76.0125 --75.9969 --75.9969 --76.0109 --76 --76.0047 --76.0172 --75.9953 --75.9875 --75.9922 --76.0094 --75.9984 --75.9969 --75.9906 --76.0062 --76.0062 --76.0031 --76.0031 --76.0047 --76.0031 --76.0234 --76.0016 --75.9984 --76.0141 --75.9812 --76.0172 --76.0078 --75.9984 --76.0016 --75.9875 --76.0031 --75.9922 --75.9891 --75.9953 --75.9828 --75.9922 --75.9922 --75.9797 --75.9938 --75.9828 --75.9984 --75.9891 --75.9953 --75.9938 --75.9859 --75.9953 --75.9906 --76.0031 --75.9922 --75.9953 --75.9906 --75.9875 --75.9875 --75.9891 --76 --75.9906 --75.9875 --75.9922 --76.0062 --75.9984 --75.9969 --76.0109 --75.9891 --76.0016 --75.9938 --75.9984 --75.9922 --76.0062 --76.0047 --75.9969 --75.9953 --75.9938 --76 --76.0016 --76.0047 --75.9875 --75.9938 --76.0016 --75.9906 --75.9906 --76.0047 --75.9953 --76.0016 --76.0062 --75.9859 --75.9953 --75.9938 --75.9969 --75.9984 --76.0125 --75.9969 --75.9844 --75.9875 --75.9953 --76.0047 --76.0016 --76.0031 --75.9922 --75.9922 --75.9984 --76 --76 --75.9906 --75.9969 --75.9969 --75.9953 --76.0094 --76.0125 --75.9906 --75.9969 --76 --75.9906 --75.9969 --75.9953 --76.0094 --75.9969 --75.9953 --75.9922 --76.0031 --76.0078 --75.9938 --76 --75.9969 --75.9812 --75.9906 --75.9844 --75.9844 --75.9906 --75.9797 --75.9906 --75.9875 --75.9875 --75.9969 --76.0016 --75.9922 --75.9938 --75.9984 --76.0078 --76 --76.0047 --75.9922 --75.9984 --76.0031 --75.9938 --75.9875 --76 --75.9922 --76 --76.0062 --76.0078 --75.9859 --75.9875 --75.9844 --75.9797 --75.9922 --75.9781 --75.9891 --75.9812 --75.9844 --75.9844 --75.9984 --75.9938 --75.9859 --75.9781 --75.9875 --75.9766 --75.9906 --75.9875 --75.9859 --75.9797 --75.9859 --75.9766 --76.0016 --75.9812 --75.9797 --75.9938 --76 --75.9875 --75.9906 --75.9984 --75.9984 --75.9875 --75.9984 --76.0016 --75.9953 --75.9953 --75.9984 --75.9969 --76.0031 --75.9969 --76.0031 --75.9844 --76.0016 --75.9953 --76.0047 --75.9984 --76.0062 --76.0109 --76.0016 --76.0094 --76.0047 --75.9906 --76.0016 --76.0094 --76.0141 --75.9844 --75.9969 --75.9953 --75.9984 --76.0016 --76 --76.0094 --76 --76.0062 --76.0016 --75.9781 --75.9922 --75.9812 --75.9922 --75.9906 --75.9969 --75.9969 --75.9906 --76.0062 --76 --76.0078 --75.9891 --75.9969 --76 --76.0031 --76.0094 --76.0062 --75.9906 --76.0047 --75.9922 --75.9922 --75.9812 --76.0031 --75.9969 --75.9953 --75.9938 --75.9984 --76.0078 --75.9938 --75.9969 --75.9906 --75.9766 --75.9844 --76.0016 --75.9875 --75.9938 --75.9891 --75.9938 --75.9969 --75.9984 --75.9812 --75.9859 --75.9906 --75.9891 --75.9875 --75.9844 --75.975 --75.9734 --75.9812 --75.9812 --75.9734 --75.9625 --75.9703 --75.9922 --75.9703 --75.9766 --75.9922 --75.9656 --75.9766 --75.9812 --75.9797 --75.9781 --75.9938 --75.9891 --75.975 --75.9828 --75.9906 --75.9906 --75.9875 --75.975 --75.9875 --75.975 --75.9781 --75.9875 --75.9875 --75.9906 --75.9922 --75.9906 --75.9922 --75.9969 --75.9859 --75.9906 --75.9891 --75.9875 --75.9781 --75.9891 --75.9859 --75.9859 --76.0062 --75.9828 --75.9828 --75.9969 --75.9891 --76.0047 --75.9812 --75.9922 --75.9891 --75.9906 --75.9891 --75.9859 --76.0094 --75.9828 --76 --76.0062 --75.9922 --75.9938 --75.9953 --75.9891 --75.9844 --75.9938 --75.9953 --75.9703 --75.9953 --75.9875 --76 --75.975 --75.9984 --75.9938 --76.0109 --75.9859 --75.9938 --75.9969 --76.0031 --76.0031 --76.0016 --76.0016 --75.975 --75.9922 --76.0016 --75.9875 --75.9875 --75.9953 --75.9875 --75.9969 --75.9859 --75.9766 --75.9922 --75.975 --75.9734 --75.9828 --75.9859 --75.9922 --75.9766 --75.9859 --75.9797 --75.975 --75.9812 --75.9766 --75.9719 --75.9766 --75.9844 --75.9781 --75.9766 --75.9922 --75.9828 --75.9969 --75.9844 --75.9953 --75.9828 --75.9812 --75.9922 --75.9859 --75.9797 --75.9781 --75.9906 --75.9828 --75.9734 --75.9891 --75.9688 --75.9797 --75.9766 --75.9781 --75.9969 --75.9797 --75.9797 --75.9938 --75.9953 --75.9812 --76.0031 --75.9922 --75.9875 --75.9906 --75.9922 --75.9859 --75.9953 --75.9875 --75.9922 --76.0016 --75.9922 --75.9984 --75.9844 --75.9953 --75.9938 --75.9844 --75.975 --75.9891 --75.9797 --75.9844 --75.9734 --75.9734 --76.0031 --75.9969 --75.9781 --75.9719 --75.9781 --75.9719 --75.9797 --75.9828 --75.9812 --75.9828 --75.975 --75.9766 --75.9812 --75.9906 --75.9875 --75.9797 --75.9812 --75.9797 --75.9891 --75.9953 --75.975 --75.9828 --75.9781 --75.975 --75.9812 --75.9797 --75.975 --75.9938 --75.9812 --75.9875 --75.9797 --75.9828 --75.9906 --75.9812 --75.9781 --75.9844 --75.9875 --75.9844 --75.9609 --75.9953 --75.9812 --75.9656 --75.9734 --75.975 --75.9875 --75.9797 --75.9828 --75.9625 --75.9875 --75.9797 --75.9938 --75.975 --75.9891 --75.9844 --75.9797 --75.9828 --75.975 --75.9781 --75.9828 --75.9766 --75.9922 --75.975 --75.9828 --75.9859 --75.9781 --75.9875 --75.9844 --75.9797 --75.9812 --75.9734 --75.9875 --75.9797 --75.9953 --75.9719 --75.9953 --75.9953 --75.9609 --75.9734 --75.9781 --75.9719 --75.9844 --75.9734 --75.9797 --75.9797 --75.9688 --75.9828 --75.9781 --75.9641 --75.9828 --75.975 --75.9797 --75.9703 --75.9812 --75.9766 --75.9766 --75.975 --75.975 --75.9734 --75.9781 --75.9781 --75.9844 --75.9844 --75.9656 --75.9719 --75.9766 --75.9703 --75.9703 --75.9781 --75.9797 --75.9672 --75.9812 --75.9844 --75.9812 --75.9703 --75.9828 --75.9766 --75.9828 --75.9797 --75.9922 --75.9781 --75.9906 --75.9734 --75.9797 --75.9844 --75.9812 --75.9766 --75.9891 --75.9828 --75.9875 --75.9766 --75.9812 --75.9859 --75.9688 --75.9922 --75.9844 --75.9844 --75.9891 --75.9719 --75.9797 --75.9609 --75.975 --75.9938 --75.9906 --75.9812 --76 --75.975 --75.9703 --75.9828 --75.9766 --75.975 --75.9703 --75.9688 --75.9734 --75.9781 --75.9719 --75.9703 --75.9719 --75.9594 --75.9516 --75.9688 --75.9563 --75.9844 --75.9656 --75.9734 --75.9641 --75.9812 --75.9844 --75.9844 --75.9766 --75.9812 --75.9812 --75.9812 --75.9656 --75.9672 --75.9719 --75.9734 --75.9844 --75.9906 --75.9797 --75.9719 --75.9859 --75.9781 --75.9797 --75.9781 --75.9828 --75.9781 --75.975 --75.9781 --75.9688 --75.9672 --75.9625 --75.9812 --75.9703 --75.9781 --75.9797 --75.9719 --75.9922 --75.9797 --75.9844 --75.9734 --75.9641 --75.9703 --75.9688 --75.975 --75.9828 --75.9703 --75.9703 --75.9766 --75.9656 --75.9703 --75.9797 --75.9828 --75.9797 --75.9938 --75.975 --75.9688 --75.9734 --75.9719 --75.9734 --75.9719 --75.9781 --75.9797 --75.9703 --75.9672 --75.9734 --75.9812 --75.9781 --75.9781 --75.975 --75.9812 --75.9781 --75.9641 --75.9703 --75.9734 --75.9844 --75.9875 --75.9719 --75.9703 --75.975 --75.9891 --75.9719 --75.9734 --75.9812 --75.9719 --75.9625 --75.9703 --75.9625 --75.9641 --75.9578 --75.9688 --75.9797 --75.9672 --75.9609 --75.9672 --75.9734 --75.9547 --75.9828 --75.9828 --75.9766 --75.9594 --75.9844 --75.9578 --75.9781 --75.9766 --75.9906 --75.9781 --75.9656 --75.9812 --75.975 --75.9734 --75.9703 --75.9672 --75.9703 --75.9609 --75.9625 --75.9672 --75.9688 --75.9609 --75.9625 --75.9734 --75.975 --75.9563 --75.9656 --75.9719 --75.9688 --75.9594 --75.9641 --75.9812 --75.975 --75.9641 --75.9812 --75.9797 --75.9688 --75.9656 --75.9719 --75.9656 --75.9703 --75.9625 --75.9656 --75.9578 --75.9781 --75.9625 --75.9453 --75.9672 --75.9625 --75.9812 --75.9531 --75.9578 --75.9563 --75.9578 --75.9672 --75.9609 --75.9672 --75.9594 --75.9734 --75.9625 --75.9766 --75.9766 --75.9812 --75.9766 --75.9719 --75.975 --75.9781 --75.9781 --75.9781 --75.9734 --75.9688 --75.9734 --75.9797 --75.9828 --75.9797 --75.9703 --75.9594 --75.9766 --75.975 --75.9656 --75.9703 --75.9672 --75.9688 --75.9781 --75.9703 --75.9844 --75.9875 --75.9828 --75.975 --75.9812 --75.9625 --75.9781 --75.9781 --75.9859 --75.9672 --75.9672 --75.9797 --75.9703 --75.975 --75.975 --75.9656 --75.9594 --75.9578 --75.9625 --75.9781 --75.9531 --75.9625 --75.9578 --75.9688 --75.9641 --75.9672 --75.9703 --75.9672 --75.9625 --75.9656 --75.9703 --75.9703 --75.9641 --75.9609 --75.9641 --75.9609 --75.95 --75.9797 --75.9563 --75.9734 --75.9719 --75.9719 --75.9625 --75.9766 --75.9781 --75.9656 --75.9812 --75.9531 --75.9594 --75.9703 --75.9609 --75.9781 --75.9797 --75.9688 --75.975 --75.975 --75.9656 --75.9797 --75.9703 --75.9625 --75.9812 --75.9609 --75.9641 --75.9656 --75.9672 --75.9578 --75.9625 --75.9578 --75.9641 --75.9563 --75.9781 --75.9656 --75.9781 --75.975 --75.9625 --75.9656 --75.9688 --75.9703 --75.9828 --75.9563 --75.9656 --75.9656 --75.9594 --75.9797 --75.9641 --75.9828 --75.9641 --75.9656 --75.9875 --75.9688 --75.9766 --75.9688 --75.9625 --75.9563 --75.9703 --75.9766 --75.9578 --75.9672 --75.9656 --75.9563 --75.9812 --75.9516 --75.9609 --75.95 --75.9563 --75.9609 --75.9766 --75.9766 --75.9625 --75.9547 --75.9609 --75.9703 --75.9703 --75.9688 --75.9672 --75.9797 --75.9719 --75.9625 --75.9563 --75.9609 --75.9703 --75.9719 --75.9609 --75.9781 --75.9625 --75.9797 --75.9828 --75.9812 --75.9734 --75.9594 --75.9609 --75.9609 --75.9578 --75.9578 --75.9641 --75.9656 --75.9672 --75.9672 --75.9625 --75.9625 --75.9609 --75.9781 --75.9609 --75.9563 --75.9656 --75.9578 --75.9781 --75.9734 --75.9609 --75.9641 --75.9609 --75.9516 --75.9703 --75.9734 --75.9766 --75.9719 --75.9703 --75.9688 --75.9625 --75.9688 --75.9703 --75.9719 --75.9766 --75.9531 --75.9766 --75.9531 --75.975 --75.9641 --75.9672 --75.9719 --75.9688 --75.95 --75.9563 --75.9609 --75.9625 --75.9781 --75.9656 --75.9703 --75.9563 --75.9609 --75.9828 --75.9656 --75.9719 --75.9625 --75.9703 --75.9719 --75.9672 --75.9688 --75.9609 --75.9609 --75.9563 --75.9688 --75.9547 --75.9609 --75.9516 --75.9578 --75.9656 --75.9594 --75.9641 --75.9578 --75.9484 --75.9547 --75.9594 --75.9672 --75.9625 --75.9781 --75.9578 --75.9719 --75.975 --75.9578 --75.9844 --75.9656 --75.9688 --75.9766 --75.9797 --75.9719 --75.9625 --75.9703 --75.9703 --75.9688 --75.9719 --75.9641 --75.9609 --75.9797 --75.975 --75.9672 --75.9703 --75.9625 --75.9688 --75.975 --75.9688 --75.975 --75.9766 --75.9797 --75.9594 --75.9766 --75.9656 --75.9609 --75.975 --75.9734 --75.9641 --75.9734 --75.9734 --75.9844 --75.9781 --75.9734 --75.9859 --75.9688 --75.9688 --75.975 --75.9734 --75.975 --75.9594 --75.9641 --75.9578 --75.9609 --75.9703 --75.9672 --75.9672 --75.9734 --75.9641 --75.975 --75.9719 --75.9734 --75.9609 --75.9734 --75.9688 --75.9719 --75.9672 --75.9469 --75.9641 --75.9484 --75.9578 --75.9703 --75.9766 --75.9625 --75.9641 --75.9688 --75.9609 --75.9859 --75.975 --75.9547 --75.9609 --75.9812 --75.9734 --75.9781 --75.9781 --75.9734 --75.9641 --75.9812 --75.9703 --75.9766 --75.9656 --75.975 --75.975 --75.9766 --75.975 --75.9766 --75.9844 --75.9844 --75.9875 --75.9828 --75.9875 --75.9734 --75.9906 --75.9734 --75.9766 --75.9891 --75.9859 --75.9625 --75.9766 --75.9781 --75.9781 --75.9891 --75.9781 --75.9781 --75.9766 --75.9781 --75.9781 --75.9609 --75.9641 --75.9766 --75.9734 --75.9594 --75.9688 --75.9766 --75.9719 --75.9563 --75.9609 --75.9641 --75.9609 --75.9719 --75.9516 --75.9766 --75.9563 --75.9656 --75.9609 --75.9719 --75.975 --75.9641 --75.9578 --75.9734 --75.9734 --75.9703 --75.975 --75.9688 --75.9656 --75.9641 --75.9797 --75.9672 --75.9797 --75.9672 --75.9906 --75.9797 --75.9703 --75.9828 --75.9672 --75.9641 --75.9594 --75.9672 --75.9812 --75.9688 --75.975 --75.9734 --75.9672 --75.9844 --75.9812 --75.9781 --75.9703 --75.9719 --75.9703 --75.9844 --75.9766 --75.9719 --75.9766 --75.9688 --75.9844 --75.9828 --75.9859 --75.9656 --75.9812 --75.9688 --75.9688 --75.9766 --75.9828 --75.9734 --75.9812 --75.9734 --75.9688 --75.9828 --75.9703 --75.9812 --75.975 --75.9875 --75.9719 --75.9812 --75.9656 --75.9844 --75.9656 --75.9703 --75.9719 --75.9656 --75.9766 --75.9797 --75.9797 --75.9734 --75.9844 --75.9641 --75.9656 --75.9641 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9922 --75.975 --75.9797 --75.9734 --75.9812 --75.9734 --75.9797 --75.9844 --75.9719 --75.9844 --75.9797 --75.9703 --75.975 --75.9641 --75.9688 --75.9734 --75.9781 --75.9812 --75.9625 --75.9641 --75.9703 --75.9766 --75.9766 --75.9812 --75.9859 --75.9688 --75.9797 --75.9703 --75.9641 --75.9844 --75.975 --75.9719 --75.9609 --75.9734 --75.9938 --75.9688 --75.9703 --75.9812 --75.9734 --75.9641 --75.9656 --75.975 --75.975 --75.9766 --75.9734 --75.9781 --75.9812 --75.9719 --75.9609 --75.9797 --75.9844 --75.9625 --75.9719 --75.9781 --75.9734 --75.975 --75.9609 --75.9781 --75.9766 --75.9766 --75.975 --75.9703 --75.9797 --75.9812 --75.9703 --75.9766 --75.9688 --75.9734 --75.975 --75.975 --75.9734 --75.9625 --75.9766 --75.9766 --75.9719 --75.9781 --75.9625 --75.9719 --75.9672 --75.9719 --75.9781 --75.9641 --75.9688 --75.9719 --75.9672 --75.9859 --75.975 --75.9797 --75.9672 --75.9609 --75.9828 --75.9766 --75.9766 --75.9781 --75.9719 --75.9859 --75.9703 --75.9703 --75.9641 --75.9766 --75.9812 --75.9719 --75.9781 --75.9656 --75.9703 --75.9625 --75.9766 --75.9672 --75.975 --75.9688 --75.9719 --75.9766 --75.9797 --75.9797 --75.9656 --75.975 --75.9734 --75.9594 --75.9578 --75.9781 --75.9672 --75.9609 --75.9688 --75.9578 --75.9703 --75.9672 --75.9594 --75.9703 --75.9688 --75.9703 --75.9766 --75.9844 --75.9625 --75.9547 --75.975 --75.9641 --75.9828 --75.9781 --75.9656 --75.9688 --75.9797 --75.9828 --75.9688 --75.9563 --75.9641 --75.9734 --75.9719 --75.9812 --75.9766 --75.9672 --75.9688 --75.9703 --75.9625 --75.9703 --75.9609 --75.9703 --75.9703 --75.9688 --75.9719 --75.9703 --75.9656 --75.9594 --75.9594 --75.9563 --75.9656 --75.9656 --75.9719 --75.9688 --75.9641 --75.9594 --75.9578 --75.9703 --75.9766 --75.9719 --75.9703 --75.9641 --75.9641 --75.9563 --75.9609 --75.9609 --75.9672 --75.95 --75.9734 --75.9688 --75.9734 --75.9609 --75.9656 --75.9672 --75.9625 --75.9719 --75.9625 --75.9641 --75.9531 --75.9672 --75.9703 --75.9719 --75.9547 --75.9594 --75.9531 --75.9672 --75.9563 --75.9516 --75.9688 --75.95 --75.9484 --75.9563 --75.9516 --75.9656 --75.95 --75.9594 --75.9812 --75.95 --75.9594 --75.9625 --75.9656 --75.9531 --75.9688 --75.9594 --75.9672 --75.9672 --75.9563 --75.9703 --75.9516 --75.9656 --75.9703 --75.9578 --75.9688 --75.9609 --75.9734 --75.9734 --75.9563 --75.9594 --75.95 --75.9563 --75.9578 --75.9453 --75.9703 --75.9594 --75.9531 --75.9516 --75.9672 --75.9344 --75.9469 --75.9547 --75.95 --75.95 --75.9641 --75.9578 --75.95 --75.9625 --75.9672 --75.9609 --75.9734 --75.9688 --75.9641 --75.9516 --75.9563 --75.9703 --75.9688 --75.9734 --75.9734 --75.9688 --75.9719 --75.9656 --75.9531 --75.9734 --75.9719 --75.9672 --75.9703 --75.9734 --75.9672 --75.9688 --75.9672 --75.9437 --75.9625 --75.9578 --75.9641 --75.9594 --75.9672 --75.9719 --75.9594 --75.9625 --75.95 --75.9484 --75.9625 --75.9625 --75.9609 --75.9719 --75.9609 --75.9641 --75.9719 --75.9641 --75.9563 --75.9672 --75.9672 --75.9719 --75.9672 --75.9641 --75.975 --75.975 --75.9828 --75.9594 --75.9594 --75.9609 --75.9719 --75.9578 --75.9484 --75.9594 --75.9734 --75.9703 --75.9578 --75.9578 --75.9656 --75.9672 --75.9734 --75.9641 --75.975 --75.9703 --75.9688 --75.9797 --75.9781 --75.9656 --75.9734 --75.9609 --75.9703 --75.9766 --75.975 --75.9766 --75.9781 --75.9828 --75.9656 --75.9703 --75.975 --75.9797 --75.975 --75.9688 --75.9688 --75.9563 --75.9859 --75.9594 --75.9688 --75.9578 --75.9594 --75.9594 --75.9656 --75.9812 --75.9719 --75.9547 --75.9719 --75.9688 --75.9703 --75.9703 --75.9594 --75.9594 --75.9672 --75.9484 --75.9688 --75.9437 --75.9594 --75.9625 --75.9672 --75.9547 --75.9672 --75.9563 --75.9563 --75.9656 --75.9719 --75.9688 --75.9531 --75.9656 --75.9609 --75.9688 --75.9531 --75.9672 --75.9578 --75.9563 --75.975 --75.9547 --75.9609 --75.9609 --75.9563 --75.9594 --75.9406 --75.9609 --75.9547 --75.9516 --75.9656 --75.9516 --75.9797 --75.9734 --75.9625 --75.9609 --75.9797 --75.9703 --75.9547 --75.9641 --75.9688 --75.9625 --75.9719 --75.9516 --75.9625 --75.9688 --75.9625 --75.9734 --75.9547 --75.9609 --75.9625 --75.9484 --75.9516 --75.9641 --75.9656 --75.9547 --75.9578 --75.9688 --75.9734 --75.9484 --75.9578 --75.9641 --75.9484 --75.9641 --75.95 --75.9531 --75.9547 --75.9531 --75.9563 --75.9594 --75.9688 --75.9641 --75.9594 --75.9703 --75.9563 --75.9688 --75.9625 --75.9594 --75.9578 --75.9437 --75.9609 --75.9594 --75.9625 --75.9578 --75.9688 --75.9641 --75.9672 --75.975 --75.9563 --75.9609 --75.9672 --75.9453 --75.9469 --75.9703 --75.9563 --75.95 --75.9734 --75.9594 --75.9594 --75.9578 --75.9719 --75.9719 --75.9594 --75.9609 --75.9625 --75.975 --75.9688 --75.9672 --75.9688 --75.9656 --75.9672 --75.9609 --75.9734 --75.9563 --75.9797 --75.9672 --75.9812 --75.9734 --75.9844 --75.975 --75.9844 --75.9812 --75.975 --75.9859 --75.9766 --75.9625 --75.9563 --75.9672 --75.9516 --75.9609 --75.9672 --75.9766 --75.9578 --75.9672 --75.9609 --75.9625 --75.9625 --75.9609 --75.9625 --75.9688 --75.9625 --75.9594 --75.9547 --75.9484 --75.9547 --75.9672 --75.9828 --75.9625 --75.9688 --75.9688 --75.9594 --75.9656 --75.9547 --75.9547 --75.9563 --75.9547 --75.9516 --75.9656 --75.9531 --75.9641 --75.9719 --75.9625 --75.9531 --75.9766 --75.9672 --75.9641 --75.9734 --75.9656 --75.9703 --75.9656 --75.9859 --75.9766 --75.9703 --75.9719 --75.9641 --75.9672 --75.9703 --75.9625 --75.9703 --75.9594 --75.9625 --75.9656 --75.9625 --75.9672 --75.9563 --75.9547 --75.9688 --75.9578 --75.9734 --75.9563 --75.9719 --75.975 --75.975 --75.9734 --75.9766 --75.9688 --75.9609 --75.9703 --75.9641 --75.9609 --75.9734 --75.9656 --75.9688 --75.9828 --75.975 --75.9781 --75.9734 --75.9922 --75.9609 --75.9734 --75.9812 --75.9766 --75.975 --75.9688 --75.9891 --75.9734 --75.9688 --75.9719 --75.9797 --75.9781 --75.975 --75.9719 --75.9641 --75.9719 --75.9672 --75.9609 --75.9719 --75.9625 --75.9656 --75.9531 --75.9625 --75.9516 --75.9781 --75.9641 --75.9812 --75.9656 --75.9688 --75.9672 --75.9719 --75.9672 --75.9688 --75.9609 --75.9641 --75.9734 --75.975 --75.9812 --75.9625 --75.9672 --75.9656 --75.9578 --75.9625 --75.9641 --75.9625 --75.9656 --75.9609 --75.9594 --75.9719 --75.9641 --75.9641 --75.9578 --75.9484 --75.975 --75.9688 --75.9609 --75.9609 --75.9672 --75.9641 --75.9547 --75.9672 --75.9625 --75.9688 --75.9672 --75.9688 --75.9656 --75.9672 --75.9719 --75.9703 --75.9688 --75.9734 --75.9563 --75.9656 --75.9656 --75.9672 --75.9656 --75.9703 --75.9766 --75.9609 --75.9781 --75.9625 --75.9563 --75.975 --75.9781 --75.9609 --75.9578 --75.9766 --75.9688 --75.9719 --75.9469 --75.975 --75.9688 --75.9594 --75.9656 --75.9672 --75.9688 --75.9766 --75.9688 --75.9703 --75.9641 --75.9781 --75.9703 --75.9766 --75.9672 --75.9719 --75.9703 --75.9703 --75.9766 --75.9609 --75.9734 --75.9719 --75.9672 --75.9641 --75.9609 --75.9641 --75.9844 --75.9734 --75.9781 --75.9844 --75.9844 --75.9625 --75.9672 --75.9688 --75.975 --75.9641 --75.9719 --75.9609 --75.9766 --75.9641 --75.9641 --75.9688 --75.9641 --75.9688 --75.9719 --75.9797 --75.975 --75.9484 --75.9766 --75.9594 --75.9547 --75.9656 --75.9719 --75.9906 --75.9672 --75.9828 --75.9719 --75.9625 --75.9672 --75.9734 --75.9703 --75.9656 --75.9797 --75.9625 --75.9625 --75.9563 --75.9594 --75.9766 --75.9781 --75.9672 --75.9812 --75.9719 --75.9812 --75.9656 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9734 --75.9625 --75.9781 --75.9734 --75.9547 --75.9766 --75.9625 --75.9703 --75.9609 --75.9703 --75.9719 --75.9703 --75.9766 --75.9734 --75.9703 --75.9797 --75.9563 --75.9609 --75.9641 --75.9703 --75.9641 --75.9578 --75.9688 --75.9641 --75.9688 --75.9781 --75.975 --75.9641 --75.9812 --75.9703 --75.9719 --75.9719 --75.9734 --75.975 --75.9828 --75.9641 --75.9719 --75.9734 --75.9672 --75.975 --75.9719 --75.9859 --75.9812 --75.975 --75.9797 --75.9828 --75.9875 --75.9828 --75.9766 --75.9734 --75.9766 --75.9656 --75.9703 --75.9766 --75.9703 --75.9844 --75.9812 --75.9812 --75.9797 --75.9703 --75.9797 --75.9688 --75.9859 --75.9781 --75.9844 --75.975 --75.9766 --75.9688 --75.9734 --75.9906 --75.9859 --75.9797 --75.9781 --75.9828 --75.9688 --75.9922 --75.9859 --75.9797 --75.9719 --75.9828 --75.9859 --75.9875 --75.975 --75.9688 --75.9828 --75.9703 --75.9656 --75.9781 --75.9781 --75.9609 --75.9719 --75.9938 --75.9766 --75.9719 --75.9703 --75.9703 --75.9797 --75.9766 --75.9672 --75.9766 --75.975 --75.9609 --75.9812 --75.9688 --75.9672 --75.9563 --75.9812 --75.975 --75.9953 --75.9766 --75.9781 --75.9812 --75.9828 --75.9734 --75.9719 --75.9844 --75.9703 --75.9734 --75.9734 --75.9828 --75.9656 --75.9672 --75.9719 --75.9672 --75.9828 --75.9781 --75.9766 --75.9844 --75.975 --75.9766 --75.9703 --75.9781 --75.9797 --75.9812 --75.9641 --75.975 --75.9672 --75.9734 --75.9656 --75.9719 --75.9703 --75.9703 --75.9688 --75.9828 --75.9969 --75.9719 --75.9781 --75.9781 --75.9734 --75.9781 --75.9844 --75.9812 --75.9875 --75.9781 --75.9781 --75.9766 --75.9641 --75.975 --75.9734 --75.9672 --75.9703 --75.9719 --75.9812 --75.9641 --75.9734 --75.9563 --75.975 --75.9844 --75.9766 --75.9719 --75.9719 --75.9719 --75.9609 --75.9688 --75.9641 --75.9625 --75.9719 --75.9859 --75.9766 --75.9766 --75.9766 --75.9688 --75.9922 --75.9672 --75.9844 --75.9609 --75.9563 --75.9703 --75.9594 --75.9672 --75.9625 --75.975 --75.9656 --75.9734 --75.9609 --75.9672 --75.975 --75.9688 --75.9703 --75.9656 --75.9719 --75.9703 --75.975 --75.9844 --75.9797 --75.9797 --75.9781 --75.9766 --75.9828 --75.9844 --75.9703 --75.9719 --75.9766 --75.9719 --75.9781 --75.9844 --75.9766 --75.9797 --75.9578 --75.9688 --75.9734 --75.9734 --75.9781 --75.9734 --75.9703 --75.9688 --75.9547 --75.9781 --75.9781 --75.9672 --75.9734 --75.975 --75.9781 --75.9766 --75.9734 --75.975 --75.9766 --75.9766 --75.9641 --75.975 --75.9734 --75.9766 --75.9703 --75.9688 --75.9766 --75.9797 --75.9719 --75.9719 --75.975 --75.975 --75.9625 --75.9812 --75.9688 --75.975 --75.9703 --75.9672 --75.9734 --75.9766 --75.975 --75.9812 --75.9859 --75.9781 --75.9828 --75.9766 --75.9844 --75.9828 --75.9828 --75.9828 --75.9781 --75.9922 --75.9859 --75.9906 --75.9859 --75.9766 --75.9734 --75.9859 --75.9828 --75.975 --75.9812 --75.9875 --75.9875 --75.9781 --75.9703 --75.9906 --75.9891 --75.9734 --75.9891 --75.9812 --75.9875 --75.9797 --75.975 --75.975 --75.9906 --75.975 --75.9781 --75.9828 --75.9766 --75.9844 --75.9859 --75.975 --75.9922 --75.9781 --75.9844 --75.9672 --75.9609 --75.9719 --75.9875 --75.9812 --75.9906 --75.9719 --75.9812 --75.9859 --75.9734 --75.9938 --75.9781 --75.9797 --75.9828 --75.9703 --75.9906 --75.9922 --75.9781 --75.975 --75.9703 --75.9719 --75.9797 --75.9781 --75.9844 --75.975 --75.9797 --75.9797 --75.9734 --75.9625 --75.9734 --75.9828 --75.9766 --75.9859 --75.9781 --75.975 --75.9797 --75.9672 --75.975 --75.9609 --75.9766 --75.9641 --75.9844 --75.9797 --75.9766 --75.9859 --75.9891 --75.9734 --75.9734 --75.975 --75.9641 --75.9594 --75.9734 --75.9719 --75.9703 --75.9734 --75.9781 --75.9688 --75.9766 --75.9719 --75.9609 --75.9578 --75.9719 --75.9656 --75.9688 --75.9688 --75.9781 --75.9719 --75.9625 --75.9734 --75.9672 --75.9797 --75.9859 --75.9734 --75.9797 --75.9719 --75.9781 --75.9859 --75.9906 --75.9797 --75.9812 --75.9734 --75.975 --75.9781 --75.9797 --75.9859 --75.9766 --75.9844 --75.9781 --75.9734 --75.9781 --75.9797 --75.9828 --75.9812 --75.9797 --75.9781 --75.9719 --75.975 --75.9922 --75.975 --75.9625 --75.9844 --75.9719 --75.9734 --75.9828 --75.9844 --75.9656 --75.9688 --75.9578 --75.9781 --75.9938 --75.9719 --75.9797 --75.9781 --75.9719 --75.9766 --75.9672 --75.9578 --75.9609 --75.9797 --75.9719 --75.9734 --75.9734 --75.9719 --75.9641 --75.9766 --75.9688 --75.975 --75.9719 --75.9797 --75.9828 --75.9891 --75.9812 --75.9766 --75.975 --75.9906 --75.9922 --75.9953 --75.9734 --75.9828 --75.9828 --75.9797 --75.9766 --75.9828 --75.975 --75.9703 --75.9875 --75.9766 --75.9828 --75.9891 --75.9703 --75.9797 --75.9766 --75.9859 --75.9797 --75.9719 --75.95 --75.9797 --75.9844 --75.9734 --75.9734 --75.9812 --75.9984 --75.9875 --75.9953 --75.9656 --75.9797 --75.9703 --75.9641 --75.9734 --75.9781 --75.9734 --75.9734 --75.9656 --75.975 --75.9797 --75.9703 --75.9734 --75.9563 --75.9734 --75.9688 --75.9656 --75.9781 --75.9641 --75.9609 --75.9672 --75.9719 --75.9844 --75.975 --75.9781 --75.9734 --75.9688 --75.9734 --75.9641 --75.9703 --75.9781 --75.9844 --75.9656 --75.9766 --75.975 --75.975 --75.9781 --75.9828 --75.9703 --75.9719 --75.9812 --75.9953 --75.9672 --75.9625 --75.9672 --75.9828 --75.9719 --75.9828 --75.9781 --75.975 --75.9875 --75.9812 --75.9766 --75.9875 --75.9656 --75.9781 --75.9969 --75.9734 --75.9766 --75.9797 --75.975 --75.9781 --75.9703 --75.975 --75.9609 --75.9828 --75.9812 --75.9797 --75.9797 --75.9594 --75.9781 --75.975 --75.9656 --75.9594 --75.9734 --75.9563 --75.9625 --75.9766 --75.9734 --75.9641 --75.9656 --75.9766 --75.9812 --75.9672 --75.9719 --75.9781 --75.9734 --75.975 --75.975 --75.9719 --75.9703 --75.9703 --75.9859 --75.9797 --75.9688 --75.9938 --75.975 --75.9688 --75.9859 --75.975 --75.9797 --75.9719 --75.9766 --75.9703 --75.9781 --75.9703 --75.9812 --75.9578 --75.9656 --75.9578 --75.9703 --75.9594 --75.9656 --75.9609 --75.9688 --75.9719 --75.9859 --75.9781 --75.9703 --75.9766 --75.9828 --75.9734 --75.9828 --75.9828 --75.9875 --75.9812 --75.9859 --75.9781 --75.9844 --75.9797 --75.9797 --75.9766 --75.975 --75.9719 --75.9875 --75.9719 --75.9781 --75.9797 --75.9953 --75.9906 --75.9891 --75.9766 --75.9891 --75.9984 --75.9859 --75.9703 --75.9891 --75.9797 --75.9844 --75.9922 --75.9891 --75.9781 --75.9828 --75.9672 --75.9797 --75.9766 --75.9578 --75.9703 --75.9641 --75.9719 --75.9609 --75.9656 --75.9703 --75.9766 --75.9594 --75.9734 --75.9812 --75.9719 --75.9797 --75.9688 --75.9656 --75.9703 --75.9703 --75.9672 --75.9703 --75.9719 --75.9625 --75.9734 --75.9766 --75.9797 --75.9672 --75.9922 --75.9906 --75.9797 --75.9781 --75.9734 --75.9844 --75.9828 --75.9656 --75.9828 --75.9812 --75.9672 --75.9781 --75.9859 --75.9859 --75.9688 --75.9797 --75.9828 --75.9656 --75.9688 --75.9906 --75.9781 --75.9719 --75.9734 --75.9812 --75.9625 --75.9812 --75.9719 --75.9844 --75.9766 --75.9828 --75.9812 --75.9812 --75.9781 --75.9641 --75.9906 --75.9781 --75.9719 --75.975 --75.975 --75.9812 --75.9844 --75.9688 --75.9641 --75.9656 --75.9734 --75.9563 --75.9641 --75.9625 --75.9625 --75.975 --75.9625 --75.9797 --75.9672 --75.9688 --75.9812 --75.9672 --75.9734 --75.975 --75.9766 --75.9719 --75.9625 --75.9844 --75.9703 --75.9734 --75.9672 --75.9734 --75.9891 --75.9719 --75.9812 --75.975 --75.9766 --75.9766 --75.9797 --75.9797 --75.9828 --75.9781 --75.9812 --75.9656 --75.9875 --75.9719 --75.9797 --75.9781 --75.9797 --75.9828 --75.9812 --75.9781 --75.9672 --75.975 --75.9719 --75.9828 --75.9781 --75.9828 --75.9734 --75.9656 --75.9672 --75.9766 --75.9844 --75.9812 --75.9875 --75.9891 --75.9766 --75.9781 --75.9828 --75.9781 --75.9672 --75.9828 --75.9797 --75.9922 --75.9938 --75.9875 --75.975 --75.9812 --75.9672 --75.9797 --75.975 --75.9891 --75.9938 --75.9703 --75.9781 --75.9812 --75.9875 --75.9734 --75.9922 --75.9781 --75.9844 --75.9781 --75.9844 --75.9844 --75.9688 --75.9781 --76.0078 --75.9844 --75.9953 --75.9891 --76 --75.9828 --75.9953 --75.9875 --75.9766 --75.9766 --75.9906 --75.9859 --75.9797 --75.9828 --75.975 --75.9828 --75.9969 --75.9859 --75.9734 --75.9953 --75.9844 --75.9906 --75.9844 --75.9766 --75.9875 --75.9797 --75.9828 --75.9844 --75.9812 --75.9922 --75.975 --75.9844 --75.9859 --75.9766 --75.9844 --75.9922 --75.9875 --75.9688 --75.9844 --75.9906 --75.9766 --75.9797 --75.9922 --75.9828 --75.9875 --75.9938 --75.9922 --75.9828 --75.9766 --75.9812 --75.9703 --75.9703 --75.9719 --75.9875 --75.9734 --75.9734 --75.9922 --75.9766 --75.9688 --75.9734 --75.975 --75.9875 --75.9719 --75.9812 --75.9797 --75.9875 --75.9688 --75.9859 --75.9797 --75.9797 --75.9922 --75.9594 --75.9781 --75.9891 --75.975 --75.9797 --75.9719 --75.9734 --75.9859 --75.9844 --75.9656 --75.9812 --75.9781 --75.975 --75.9906 --75.9891 --75.9797 --75.9703 --75.9906 --75.9734 --75.9922 --75.975 --75.9688 --75.9781 --75.9812 --75.9797 --75.9781 --75.9906 --75.9875 --75.9797 --75.9719 --75.9719 --75.975 --75.9781 --75.9828 --75.9719 --75.9875 --75.9797 --75.9828 --75.9766 --75.9672 --75.9875 --75.9812 --75.9859 --75.9781 --75.975 --75.9594 --75.9609 --75.975 --75.9734 --75.9734 --75.9797 --75.9875 --75.9578 --75.9797 --75.9672 --75.9703 --75.9812 --75.9672 --75.9719 --75.975 --75.9844 --75.9781 --75.9719 --75.975 --75.975 --75.9797 --75.9703 --75.9719 --75.9625 --75.9781 --75.9797 --75.9594 --75.9688 --75.9656 --75.975 --75.9547 --75.9781 --75.9688 --75.9719 --75.9656 --75.9656 --75.9719 --75.9828 --75.9688 --75.9906 --75.9781 --75.9828 --75.9734 --75.9828 --75.9781 --75.9844 --75.9938 --75.9875 --75.9781 --75.9828 --75.9812 --75.9688 --75.9766 --75.9781 --75.9891 --75.9844 --75.9766 --75.9766 --75.9641 --75.9703 --75.9781 --75.9875 --75.9859 --75.9719 --75.9766 --75.9734 --75.9766 --75.9844 --75.9688 --75.9594 --75.9781 --75.9781 --75.9844 --75.9797 --76.0047 --75.9734 --75.975 --75.9734 --75.9766 --75.9812 --75.9844 --75.9859 --75.9859 --75.9812 --75.9703 --75.9844 --75.9828 --75.9828 --75.9828 --75.9719 --75.9828 --75.975 --75.9812 --75.9734 --75.9734 --75.9781 --75.975 --75.9672 --75.9797 --75.9828 --75.9844 --75.9734 --75.9797 --75.975 --75.9766 --75.9781 --75.9641 --75.9766 --75.9672 --75.9594 --75.9656 --75.9594 --75.9656 --75.9594 --75.9609 --75.9688 --75.9734 --75.9547 --75.9703 --75.9641 --75.9688 --75.9703 --75.9719 --75.9844 --75.9672 --75.9688 --75.9719 --75.9641 --75.9828 --75.9812 --75.9531 --75.9688 --75.9609 --75.9812 --75.9609 --75.9656 --75.9766 --75.9797 --75.9641 --75.975 --75.9578 --75.975 --75.9594 --75.9719 --75.9812 --75.9766 --75.9766 --75.9828 --75.9766 --75.975 --75.975 --75.9859 --75.9594 --75.9703 --75.9781 --75.9719 --75.9781 --75.975 --75.9766 --75.9844 --75.975 --75.975 --75.9781 --75.975 --75.9719 --75.9875 --75.9766 --75.9781 --75.9781 --75.9828 --75.9938 --75.9906 --75.9781 --75.9828 --75.9781 --75.9906 --75.9906 --75.9828 --76 --75.9922 --75.9938 --75.9859 --75.9891 --76.0078 --75.975 --76 --76.0031 --75.9953 --75.9906 --75.9906 --75.9875 --75.9734 --75.9828 --75.9891 --75.9875 --75.9719 --75.9844 --75.9719 --75.9781 --75.975 --75.9797 --75.9797 --75.9766 --75.9828 --75.9812 --75.9875 --75.9688 --75.9766 --75.9859 --75.9875 --75.9922 --75.9875 --75.9781 --75.9781 --75.9891 --75.9875 --75.9859 --75.9672 --75.9906 --75.9891 --75.9859 --75.9797 --75.9828 --75.9672 --75.9766 --75.9766 --75.9781 --75.9812 --75.9906 --75.9938 --75.9859 --75.9984 --75.9766 --75.9891 --75.9922 --76.0016 --75.9984 --75.9844 --76.0031 --75.9891 --75.9906 --75.9891 --75.9906 --75.9766 --75.9891 --75.9844 --75.9828 --75.9812 --75.9672 --75.9781 --75.9875 --75.9844 --75.9703 --75.9766 --75.9641 --75.9875 --75.9797 --75.9797 --75.9875 --75.9922 --75.9828 --75.9844 --75.9922 --75.9734 --75.9625 --75.975 --75.9891 --75.9812 --75.9875 --75.9797 --75.9766 --75.9938 --75.9844 --75.9812 --75.9812 --75.9625 --75.975 --75.9625 --75.9859 --75.9766 --75.9781 --75.9688 --75.9672 --75.9906 --75.975 --75.9719 --75.9641 --75.9734 --75.9703 --75.9719 --75.9812 --75.9875 --75.9844 --75.9797 --75.9875 --75.9641 --75.9875 --75.9828 --75.9719 --75.975 --75.9703 --75.9797 --75.9812 --75.9875 --75.975 --75.9844 --75.9781 --75.9766 --75.9672 --75.9797 --75.9906 --75.9688 --75.9812 --75.975 --75.9859 --75.9812 --75.9812 --75.9984 --75.9953 --75.9844 --75.9844 --75.9781 --75.975 --75.9797 --75.9844 --75.9719 --75.9734 --75.9906 --75.9969 --75.9703 --75.9703 --75.9859 --75.9859 --75.9797 --75.9703 --75.9766 --75.9844 --75.9812 --75.9812 --75.9672 --75.9891 --75.9734 --75.9828 --75.9797 --75.9781 --75.9969 --75.9734 --75.9875 --75.9828 --75.9859 --75.9984 --75.9828 --75.9766 --75.9922 --75.9828 --75.9797 --75.9812 --75.9906 --75.9984 --75.9859 --76.0031 --75.9844 --75.9734 --75.9859 --75.9844 --75.9922 --75.9875 --76 --75.9922 --75.9766 --75.9812 --76 --75.9812 --75.9797 --75.9922 --75.9828 --75.975 --75.9891 --75.9891 --75.9906 --75.9859 --75.9797 --75.9969 --75.9719 --75.9953 --76.0016 --75.9891 --75.9953 --75.9953 --76 --75.9891 --75.9875 --75.975 --75.9891 --75.9984 --75.9938 --76.0031 --75.9891 --75.9828 --75.9828 --75.9922 --75.9828 --76 --75.9828 --75.9797 --75.9938 --75.9766 --75.9891 --75.9953 --75.9922 --75.9859 --75.9875 --75.9703 --75.9875 --75.9859 --75.9703 --75.9875 --75.9875 --76 --75.9922 --75.9938 --75.9812 --75.9922 --75.9766 --75.9688 --75.9766 --75.975 --75.9922 --75.9859 --75.9984 --75.9797 --75.9938 --75.9922 --75.9953 --75.9859 --75.9922 --75.9859 --75.9891 --75.9844 --75.9859 --75.9922 --75.9859 --75.9812 --75.9859 --75.9938 --75.9719 --75.9906 --75.9859 --75.9766 --75.9938 --76.0016 --75.9812 --75.9906 --75.9828 --75.9844 --75.9766 --75.9938 --75.9938 --75.9953 --75.9891 --75.9781 --75.9797 --75.9922 --75.9891 --75.9875 --75.9844 --75.9828 --75.9875 --75.9859 --75.9781 --75.9656 --75.9766 --75.9734 --75.9844 --75.9891 --75.9781 --75.9812 --75.9766 --75.9766 --75.9609 --75.9781 --75.9906 --75.975 --75.9703 --75.9688 --75.9875 --75.9891 --75.9859 --75.9828 --75.9609 --75.9766 --75.9828 --75.9703 --75.975 --75.9719 --75.9734 --75.9703 --75.9797 --75.9656 --75.9609 --75.9719 --75.9703 --75.9719 --75.975 --75.9734 --75.9734 --75.9688 --75.9578 --75.9734 --75.9594 --75.975 --75.9672 --75.9688 --75.9766 --75.9859 --75.975 --75.9688 --75.9906 --75.9781 --75.9828 --75.9891 --75.9844 --75.9719 --75.9891 --75.9828 --75.9734 --75.9703 --75.9875 --75.9719 --75.9734 --75.9766 --75.9797 --75.9734 --75.9844 --75.9766 --75.9797 --75.9766 --75.9766 --75.9812 --75.9781 --75.9781 --75.9781 --75.9672 --75.9891 --75.9781 --75.975 --75.975 --75.9672 --75.9859 --75.9891 --75.9672 --75.9688 --75.9781 --75.9719 --75.9781 --75.9703 --75.9875 --75.9828 --75.9797 --75.9766 --75.9797 --75.9844 --75.975 --75.9922 --75.9828 --75.9828 --75.975 --75.9812 --75.9719 --75.9672 --75.9859 --75.9922 --75.975 --75.975 --75.9734 --75.9734 --75.9859 --75.9688 --75.9891 --75.9719 --75.9859 --75.9797 --75.9766 --75.9906 --75.9766 --75.9797 --75.9797 --75.9891 --75.9844 --75.9906 --75.975 --75.9812 --75.9797 --75.9734 --75.9734 --75.9734 --75.9828 --75.9812 --75.975 --75.9812 --75.9875 --75.9812 --75.9688 --75.9719 --75.9656 --75.9734 --75.9797 --75.9688 --75.9766 --75.9812 --75.9719 --75.9625 --75.975 --75.9828 --75.9672 --75.9766 --75.9672 --75.9844 --75.9734 --75.9766 --75.9719 --75.9844 --75.9828 --75.975 --75.9812 --75.9766 --75.9719 --75.9703 --75.9594 --75.9891 --75.975 --75.9812 --75.9797 --75.9719 --75.9719 --75.9719 --75.9594 --75.9719 --75.9672 --75.9766 --75.9781 --75.9656 --75.9703 --75.9719 --75.9641 --75.9703 --75.9734 --75.9859 --75.975 --75.9609 --75.9734 --75.975 --75.9734 --75.9766 --75.9828 --75.975 --75.9703 --75.9844 --75.9859 --75.9703 --75.9891 --75.9781 --75.9844 --75.9812 --75.9859 --75.9906 --75.975 --75.9828 --75.9969 --75.9797 --75.9797 --75.975 --75.9609 --75.9828 --75.9891 --75.9859 --75.9766 --75.9781 --75.9766 --75.9703 --75.9734 --75.9859 --76.0031 --75.9766 --75.9953 --75.975 --75.9797 --75.9766 --75.9859 --75.975 --75.975 --75.9891 --75.9781 --75.9734 --75.9828 --75.9797 --75.9797 --75.9719 --75.9703 --75.9766 --75.9797 --75.9844 --75.9844 --75.9875 --75.9703 --75.9844 --75.9656 --75.9828 --75.9688 --75.9812 --75.9703 --75.9766 --75.9672 --75.9812 --75.9703 --75.9656 --75.9859 --75.9703 --75.9734 --75.9656 --75.975 --75.9859 --75.9828 --75.9734 --75.9844 --75.9875 --75.9734 --75.9844 --75.9828 --75.9781 --75.9672 --75.9703 --75.9766 --75.9828 --75.9781 --75.9609 --75.9719 --75.9734 --75.9672 --75.975 --75.975 --75.9734 --75.9688 --75.9719 --75.9641 --75.9781 --75.9781 --75.9703 --75.9594 --75.9578 --75.9672 --75.9797 --75.9734 --75.9797 --75.9781 --75.9609 --75.9797 --75.9688 --75.9766 --75.9703 --75.975 --75.9672 --75.9781 --75.9656 --75.9891 --75.9719 --75.9766 --75.9766 --75.9906 --75.9734 --75.9766 --75.9797 --75.9781 --75.9641 --75.9891 --75.9797 --75.9672 --75.9797 --75.9891 --75.9734 --75.9844 --75.9781 --75.9828 --75.9828 --75.9766 --75.9766 --75.9812 --75.9828 --75.9672 --75.9766 --75.975 --75.9812 --75.9734 --75.9672 --75.975 --75.9688 --75.9844 --75.9812 --75.9734 --75.9859 --75.9781 --75.9703 --75.9844 --75.9672 --75.9672 --75.9797 --75.9703 --75.9688 --75.975 --75.9641 --75.9578 --75.975 --75.9656 --75.9812 --75.9828 --75.9563 --75.9641 --75.9656 --75.9547 --75.9641 --75.9625 --75.9672 --75.9625 --75.9563 --75.9703 --75.9563 --75.9703 --75.9656 --75.9688 --75.9641 --75.9781 --75.9641 --75.9734 --75.9672 --75.9672 --75.9734 --75.9812 --75.9688 --75.9641 --75.9906 --75.9656 --75.9891 --75.9641 --75.9656 --75.9812 --75.9719 --75.9766 --75.9734 --75.975 --75.975 --75.9766 --75.9891 --75.9812 --75.9859 --75.9875 --75.9828 --75.9812 --75.9812 --75.9875 --75.9844 --75.9781 --75.9781 --75.9719 --75.9734 --75.9859 --75.9719 --75.9797 --75.9656 --75.9781 --75.9797 --75.9703 --75.975 --75.9656 --75.9719 --75.9828 --75.9859 --75.975 --75.9719 --75.9703 --75.9719 --75.9797 --75.9672 --75.9656 --75.975 --75.975 --75.9609 --75.9844 --75.9766 --75.9766 --75.975 --75.9859 --75.9563 --75.9672 --75.9672 --75.9719 --75.9578 --75.9766 --75.9594 --75.9656 --75.9609 --75.975 --75.9688 --75.9547 --75.9578 --75.9563 --75.9641 --75.9672 --75.9641 --75.9797 --75.9641 --75.9703 --75.9563 --75.9766 --75.9531 --75.9734 --75.9625 --75.9719 --75.9531 --75.9594 --75.9656 --75.9563 --75.95 --75.9563 --75.9625 --75.9641 --75.975 --75.9578 --75.9656 --75.9766 --75.9719 --75.9656 --75.9672 --75.9656 --75.9688 --75.9594 --75.9641 --75.9656 --75.9688 --75.9766 --75.9547 --75.9656 --75.9641 --75.9656 --75.9594 --75.9734 --75.9563 --75.975 --75.9625 --75.9688 --75.9734 --75.9688 --75.9656 --75.9703 --75.9719 --75.9766 --75.9812 --75.9734 --75.975 --75.9672 --75.9672 --75.9719 --75.9719 --75.9703 --75.9781 --75.9781 --75.9641 --75.9719 --75.9641 --75.9703 --75.9688 --75.9641 --75.9516 --75.9563 --75.9734 --75.9766 --75.9594 --75.9734 --75.9609 --75.9688 --75.9625 --75.9719 --75.9656 --75.9766 --75.9688 --75.9688 --75.975 --75.9766 --75.9781 --75.9781 --75.9672 --75.9828 --75.9734 --75.9688 --75.9719 --75.9734 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9781 --75.9812 --75.9563 --75.9672 --75.9672 --75.9578 --75.9703 --75.9703 --75.9781 --75.9641 --75.9672 --75.9703 --75.9719 --75.9828 --75.9875 --75.9656 --75.9781 --75.975 --75.975 --75.9703 --75.9719 --75.9578 --75.9547 --75.9734 --75.9734 --75.9766 --75.95 --75.9578 --75.9563 --75.9516 --75.9594 --75.9563 --75.9641 --75.9563 --75.9594 --75.9484 --75.9609 --75.9484 --75.9625 --75.95 --75.9563 --75.9609 --75.9516 --75.9688 --75.9531 --75.9453 --75.9609 --75.9609 --75.9469 --75.9594 --75.9422 --75.95 --75.9547 --75.9594 --75.9594 --75.9547 --75.9484 --75.9531 --75.9688 --75.9547 --75.9609 --75.9672 --75.9578 --75.9547 --75.95 --75.9672 --75.9641 --75.9578 --75.9406 --75.9734 --75.9531 --75.9516 --75.9594 --75.9484 --75.9547 --75.9547 --75.9469 --75.9391 --75.9594 --75.9625 --75.9453 --75.9563 --75.9516 --75.9594 --75.9547 --75.9703 --75.9563 --75.9578 --75.9375 --75.9547 --75.9641 --75.9547 --75.95 --75.9563 --75.9563 --75.9609 --75.9656 --75.9734 --75.9437 --75.9688 --75.9563 --75.9563 --75.9625 --75.9469 --75.9625 --75.9437 --75.9516 --75.95 --75.9516 --75.975 --75.9297 --75.9703 --75.9516 --75.9547 --75.9578 --75.9406 --75.9609 --75.9547 --75.9516 --75.9484 --75.9453 --75.9609 --75.9531 --75.9641 --75.9422 --75.9531 --75.9531 --75.9563 --75.9594 --75.9406 --75.9641 --75.9437 --75.9594 --75.9453 --75.9516 --75.9531 --75.9563 --75.95 --75.9437 --75.9469 --75.9484 --75.9641 --75.9641 --75.9516 --75.9484 --75.9563 --75.9531 --75.9594 --75.9437 --75.95 --75.9609 --75.9437 --75.9422 --75.9453 --75.9563 --75.9531 --75.9453 --75.9469 --75.9484 --75.9531 --75.9437 --75.9469 --75.9484 --75.9359 --75.9453 --75.9578 --75.9469 --75.9578 --75.9547 --75.9469 --75.9359 --75.9328 --75.95 --75.9344 --75.9422 --75.9609 --75.9437 --75.9453 --75.9484 --75.9469 --75.9375 --75.9406 --75.9516 --75.9422 --75.9453 --75.9406 --75.9594 --75.9453 --75.9375 --75.9391 --75.9406 --75.9484 --75.9297 --75.9484 --75.9484 --75.9437 --75.9641 --75.9531 --75.9344 --75.9375 --75.9375 --75.95 --75.9516 --75.9594 --75.9516 --75.9391 --75.9453 --75.9484 --75.9469 --75.9328 --75.9437 --75.9484 --75.9469 --75.9422 --75.9437 --75.9375 --75.9297 --75.9453 --75.9484 --75.9484 --75.9234 --75.9313 --75.9391 --75.9344 --75.9453 --75.9547 --75.9453 --75.9484 --75.9328 --75.95 --75.95 --75.9359 --75.9297 --75.9406 --75.9484 --75.9422 --75.9344 --75.9406 --75.9437 --75.9406 --75.9406 --75.95 --75.9484 --75.9453 --75.9422 --75.9328 --75.9437 --75.9406 --75.9391 --75.9297 --75.9359 --75.9391 --75.9313 --75.9344 --75.9359 --75.9281 --75.9344 --75.9453 --75.9313 --75.9344 --75.9359 --75.9406 --75.9266 --75.9203 --75.9266 --75.9203 --75.9437 --75.9375 --75.9375 --75.9266 --75.9266 --75.9281 --75.9422 --75.9234 --75.9391 --75.9359 --75.9437 --75.9266 --75.9266 --75.9422 --75.9375 --75.9437 --75.9375 --75.9406 --75.9359 --75.9422 --75.9516 --75.9344 --75.95 --75.9328 --75.9453 --75.95 --75.9313 --75.9234 --75.9313 --75.9406 --75.9281 --75.9469 --75.9328 --75.9406 --75.9375 --75.9422 --75.9359 --75.9391 --75.9297 --75.9328 --75.9203 --75.9406 --75.9359 --75.9469 --75.9313 --75.9547 --75.9406 --75.9313 --75.9266 --75.9359 --75.9406 --75.9297 --75.9328 --75.9313 --75.9344 --75.9281 --75.9406 --75.9391 --75.9516 --75.9297 --75.9359 --75.9391 --75.9359 --75.9406 --75.9391 --75.9328 --75.9234 --75.9422 --75.9422 --75.9484 --75.9328 --75.9391 --75.9391 --75.9437 --75.9406 --75.9313 --75.9453 --75.9359 --75.9359 --75.9375 --75.9375 --75.9453 --75.9422 --75.9234 --75.9531 --75.9422 --75.925 --75.925 --75.9391 --75.9266 --75.9422 --75.9437 --75.9437 --75.9406 --75.9437 --75.9484 --75.9391 --75.9453 --75.9453 --75.9437 --75.9453 --75.9437 --75.9422 --75.9391 --75.9422 --75.9313 --75.9328 --75.9375 --75.9359 --75.9266 --75.9375 --75.9266 --75.9391 --75.9391 --75.9359 --75.9531 --75.9391 --75.9344 --75.9406 --75.9313 --75.9375 --75.9437 --75.9484 --75.9547 --75.9469 --75.9516 --75.9406 --75.9531 --75.9391 --75.9391 --75.9422 --75.9422 --75.9313 --75.9359 --75.9375 --75.9484 --75.9437 --75.9266 --75.9453 --75.9359 --75.9422 --75.9359 --75.9563 --75.9359 --75.9516 --75.9453 --75.9344 --75.9406 --75.9453 --75.9344 --75.9297 --75.9344 --75.9484 --75.9297 --75.9359 --75.9344 --75.9484 --75.9359 --75.9359 --75.9219 --75.925 --75.9313 --75.9297 --75.9266 --75.9125 --75.9391 --75.9313 --75.9391 --75.9203 --75.9281 --75.9297 --75.9266 --75.9172 --75.9141 --75.9359 --75.9344 --75.9453 --75.9406 --75.9266 --75.9391 --75.925 --75.9266 --75.925 --75.9203 --75.925 --75.9281 --75.9313 --75.9313 --75.9391 --75.9281 --75.9344 --75.9484 --75.925 --75.9313 --75.9141 --75.9375 --75.9359 --75.9281 --75.9297 --75.9406 --75.9375 --75.9328 --75.9172 --75.9484 --75.9297 --75.9297 --75.9391 --75.9375 --75.9234 --75.9313 --75.9313 --75.9297 --75.9313 --75.9172 --75.9313 --75.9234 --75.9344 --75.9437 --75.9375 --75.9406 --75.925 --75.9313 --75.9375 --75.9344 --75.9359 --75.9422 --75.9328 --75.95 --75.9391 --75.9437 --75.9344 --75.9281 --75.9437 --75.9359 --75.9437 --75.9359 --75.9391 --75.9328 --75.9375 --75.9281 --75.9406 --75.9391 --75.925 --75.9297 --75.9344 --75.9328 --75.9281 --75.9344 --75.925 --75.9281 --75.9344 --75.9375 --75.9437 --75.9344 --75.9234 --75.95 --75.9437 --75.9375 --75.925 --75.9328 --75.9453 --75.9328 --75.9563 --75.9391 --75.9437 --75.9437 --75.9344 --75.9453 --75.9391 --75.9547 --75.9359 --75.9328 --75.95 --75.9484 --75.9266 --75.925 --75.9359 --75.9375 --75.9219 --75.9406 --75.9344 --75.9313 --75.9313 --75.9375 --75.9484 --75.9313 --75.9297 --75.9297 --75.9234 --75.9281 --75.9344 --75.9297 --75.9344 --75.9422 --75.9422 --75.9359 --75.9406 --75.9297 --75.9219 --75.925 --75.9391 --75.9391 --75.9391 --75.9203 --75.9203 --75.9266 --75.9187 --75.9391 --75.9219 --75.9266 --75.9437 --75.9281 --75.9281 --75.9406 --75.9328 --75.9266 --75.9297 --75.9297 --75.9266 --75.9297 --75.9406 --75.9266 --75.9359 --75.9391 --75.9266 --75.9437 --75.9328 --75.9266 --75.9281 --75.9328 --75.9375 --75.9313 --75.9406 --75.9266 --75.9391 --75.9281 --75.9281 --75.925 --75.9406 --75.9281 --75.9359 --75.9297 --75.9391 --75.9328 --75.9375 --75.9328 --75.9359 --75.9328 --75.9375 --75.9391 --75.9375 --75.9266 --75.9375 --75.9453 --75.9281 --75.9281 --75.9297 --75.9344 --75.9359 --75.9234 --75.9234 --75.9313 --75.9266 --75.9219 --75.9297 --75.9281 --75.9328 --75.9219 --75.9281 --75.9328 --75.9172 --75.9359 --75.9328 --75.9375 --75.9297 --75.9391 --75.9281 --75.9375 --75.9203 --75.9297 --75.9234 --75.9297 --75.95 --75.9344 --75.9328 --75.9375 --75.9297 --75.9391 --75.9344 --75.925 --75.9281 --75.9344 --75.9297 --75.9422 --75.95 --75.9578 --75.9469 --75.9391 --75.9422 --75.9453 --75.9281 --75.9203 --75.9219 --75.9422 --75.9391 --75.9469 --75.9328 --75.9391 --75.9297 --75.9344 --75.9375 --75.9281 --75.9297 --75.9359 --75.9203 --75.9344 --75.9406 --75.925 --75.9266 --75.9281 --75.9344 --75.9266 --75.9453 --75.9344 --75.9422 --75.9391 --75.9422 --75.925 --75.9281 --75.9281 --75.9297 --75.9391 --75.9469 --75.9203 --75.9313 --75.9344 --75.9219 --75.9281 --75.9406 --75.9297 --75.9344 --75.9313 --75.9344 --75.9187 --75.9234 --75.9391 --75.9328 --75.9328 --75.9266 --75.9406 --75.9422 --75.9156 --75.9313 --75.9297 --75.9281 --75.9172 --75.9187 --75.925 --75.9125 --75.9187 --75.9469 --75.9187 --75.9313 --75.9266 --75.9203 --75.9203 --75.9266 --75.9141 --75.9203 --75.9109 --75.925 --75.9313 --75.9344 --75.9266 --75.9328 --75.9281 --75.9234 --75.9297 --75.9187 --75.9266 --75.9187 --75.9422 --75.925 --75.9281 --75.9281 --75.9266 --75.9359 --75.9187 --75.9234 --75.925 --75.925 --75.9375 --75.9156 --75.9344 --75.9313 --75.9313 --75.9297 --75.9203 --75.9234 --75.9219 --75.9156 --75.9203 --75.925 --75.9094 --75.9094 --75.9203 --75.9187 --75.9109 --75.9062 --75.9094 --75.9141 --75.9156 --75.9203 --75.9234 --75.925 --75.9094 --75.9203 --75.9203 --75.9219 --75.9141 --75.9281 --75.925 --75.9172 --75.9172 --75.9094 --75.9203 --75.9172 --75.9219 --75.9266 --75.9344 --75.9266 --75.9187 --75.9234 --75.9203 --75.9125 --75.9141 --75.9281 --75.9328 --75.9375 --75.9297 --75.9187 --75.9172 --75.9219 --75.9359 --75.9094 --75.925 --75.9266 --75.9172 --75.9172 --75.9297 --75.9328 --75.9234 --75.925 --75.9234 --75.9328 --75.9109 --75.9281 --75.925 --75.9375 --75.9172 --75.9156 --75.9094 --75.9156 --75.9125 --75.9328 --75.925 --75.9203 --75.9234 --75.9234 --75.9281 --75.9203 --75.9172 --75.9203 --75.9187 --75.9313 --75.9266 --75.9359 --75.9328 --75.9141 --75.9219 --75.9187 --75.925 --75.9187 --75.9266 --75.9281 --75.9266 --75.9297 --75.9219 --75.9266 --75.9141 --75.9125 --75.9172 --75.9172 --75.925 --75.9125 --75.9219 --75.9172 --75.9234 --75.9234 --75.9391 --75.9094 --75.9187 --75.925 --75.9187 --75.9156 --75.9219 --75.9141 --75.9187 --75.9156 --75.9266 --75.9281 --75.9437 --75.9234 --75.9234 --75.9437 --75.9328 --75.9281 --75.9281 --75.9297 --75.9297 --75.9266 --75.9359 --75.9141 --75.9281 --75.9187 --75.9344 --75.9391 --75.9328 --75.9266 --75.9234 --75.9313 --75.9328 --75.9313 --75.925 --75.9422 --75.9172 --75.9422 --75.9328 --75.9313 --75.9359 --75.9297 --75.9234 --75.9375 --75.9203 --75.9281 --75.9281 --75.9266 --75.9391 --75.9344 --75.9328 --75.9328 --75.9219 --75.9172 --75.9266 --75.9187 --75.9203 --75.925 --75.9172 --75.9359 --75.9234 --75.9187 --75.9203 --75.9281 --75.925 --75.925 --75.9281 --75.9328 --75.9203 --75.9266 --75.9281 --75.9172 --75.9219 --75.9187 --75.9219 --75.9422 --75.9141 --75.9266 --75.925 --75.9375 --75.9344 --75.9297 --75.9375 --75.9297 --75.9156 --75.925 --75.9281 --75.925 --75.9313 --75.9156 --75.9359 --75.9187 --75.9297 --75.9328 --75.9234 --75.9266 --75.9344 --75.9391 --75.9203 --75.9203 --75.9359 --75.9203 --75.9266 --75.9234 --75.9313 --75.9187 --75.9219 --75.9234 --75.9125 --75.9156 --75.9297 --75.9344 --75.9125 --75.9266 --75.9266 --75.9422 --75.9297 --75.9328 --75.9156 --75.9141 --75.9172 --75.9219 --75.9141 --75.9313 --75.9344 --75.9187 --75.925 --75.9219 --75.9266 --75.9328 --75.9203 --75.9297 --75.9219 --75.9141 --75.9156 --75.9234 --75.9266 --75.9156 --75.9219 --75.9219 --75.9266 --75.9234 --75.9125 --75.9219 --75.9094 --75.9313 --75.9328 --75.9234 --75.9219 --75.9109 --75.9281 --75.9328 --75.9281 --75.9266 --75.9344 --75.9219 --75.9172 --75.9172 --75.9187 --75.9234 --75.9156 --75.9203 --75.9172 --75.9141 --75.9203 --75.9281 --75.9234 --75.9281 --75.9156 --75.9094 --75.9141 --75.9125 --75.9047 --75.9078 --75.9281 --75.9187 --75.9297 --75.9062 --75.9125 --75.9219 --75.9141 --75.9234 --75.9187 --75.9172 --75.9281 --75.9328 --75.9094 --75.9156 --75.9297 --75.9219 --75.9203 --75.9219 --75.9234 --75.9156 --75.9187 --75.9219 --75.9094 --75.9313 --75.9203 --75.9187 --75.925 --75.9172 --75.9281 --75.9219 --75.9156 --75.9297 --75.9281 --75.9187 --75.9156 --75.9125 --75.925 --75.9281 --75.925 --75.9203 --75.9203 --75.9078 --75.925 --75.9156 --75.9219 --75.9156 --75.9031 --75.9313 --75.9406 --75.925 --75.9187 --75.9156 --75.9203 --75.9203 --75.9328 --75.9281 --75.9266 --75.925 --75.9219 --75.9328 --75.9281 --75.9234 --75.9344 --75.9297 --75.9172 --75.9297 --75.9266 --75.9328 --75.925 --75.9234 --75.9234 --75.925 --75.9281 --75.9375 --75.9187 --75.9219 --75.9328 --75.9234 --75.9187 --75.9234 --75.9375 --75.925 --75.9234 --75.9219 --75.9281 --75.9234 --75.9219 --75.9047 --75.9187 --75.9078 --75.9109 --75.9125 --75.9109 --75.9062 --75.925 --75.9125 --75.9203 --75.9047 --75.9172 --75.9156 --75.9078 --75.9031 --75.9141 --75.9078 --75.9156 --75.9187 --75.9281 --75.9187 --75.9109 --75.9187 --75.9141 --75.9266 --75.9094 --75.9219 --75.9203 --75.9156 --75.9125 --75.9156 --75.9187 --75.9125 --75.9062 --75.9094 --75.9141 --75.9125 --75.9078 --75.9156 --75.9125 --75.9 --75.9062 --75.9187 --75.9094 --75.9203 --75.9187 --75.9094 --75.9109 --75.9094 --75.9187 --75.9234 --75.925 --75.9297 --75.9094 --75.9125 --75.9266 --75.9281 --75.9062 --75.9359 --75.9078 --75.9203 --75.9172 --75.925 --75.9125 --75.9297 --75.9203 --75.9172 --75.9266 --75.9219 --75.9234 --75.925 --75.9266 --75.9219 --75.9359 --75.9266 --75.9172 --75.925 --75.9172 --75.9156 --75.9141 --75.9203 --75.9313 --75.9094 --75.9344 --75.9328 --75.9187 --75.9281 --75.9297 --75.9328 --75.9187 --75.925 --75.9109 --75.9219 --75.9219 --75.9266 --75.9109 --75.9391 --75.9234 --75.9172 --75.9344 --75.9141 --75.9187 --75.9172 --75.9234 --75.9297 --75.9141 --75.9187 --75.9078 --75.9203 --75.9141 --75.9109 --75.9187 --75.9297 --75.9203 --75.9187 --75.9344 --75.9297 --75.9313 --75.9219 --75.9219 --75.925 --75.9125 --75.9281 --75.9359 --75.9203 --75.9234 --75.925 --75.9187 --75.9172 --75.9234 --75.9094 --75.8984 --75.9109 --75.9094 --75.9109 --75.9219 --75.9125 --75.9109 --75.9109 --75.9219 --75.925 --75.9234 --75.9094 --75.9172 --75.9219 --75.925 --75.9062 --75.9078 --75.9047 --75.9141 --75.9062 --75.9156 --75.8984 --75.9062 --75.9109 --75.9062 --75.9344 --75.9062 --75.9172 --75.9047 --75.9219 --75.9094 --75.9141 --75.9141 --75.9172 --75.9234 --75.9125 --75.9219 --75.9031 --75.9109 --75.8984 --75.9156 --75.9078 --75.8984 --75.9203 --75.9141 --75.8969 --75.9 --75.9078 --75.8875 --75.9094 --75.9078 --75.9109 --75.9125 --75.9016 --75.9109 --75.8969 --75.9078 --75.9031 --75.8875 --75.9047 --75.9 --75.8953 --75.9 --75.9062 --75.9094 --75.9125 --75.9016 --75.9125 --75.9141 --75.8969 --75.9016 --75.9016 --75.9047 --75.9047 --75.9047 --75.9047 --75.9016 --75.8906 --75.9016 --75.8984 --75.9141 --75.9047 --75.9047 --75.9 --75.9 --75.9094 --75.8922 --75.8984 --75.9047 --75.8906 --75.8984 --75.8953 --75.8938 --75.8984 --75.8906 --75.9016 --75.9062 --75.9016 --75.8984 --75.9047 --75.8938 --75.8875 --75.8906 --75.8891 --75.8875 --75.8969 --75.9016 --75.8891 --75.8953 --75.8953 --75.8953 --75.9078 --75.8938 --75.9031 --75.9062 --75.8891 --75.9062 --75.8906 --75.9172 --75.8922 --75.9078 --75.9078 --75.8938 --75.8969 --75.8922 --75.9094 --75.8969 --75.9031 --75.8969 --75.8984 --75.9016 --75.9062 --75.9031 --75.9031 --75.9078 --75.9 --75.8938 --75.9016 --75.8953 --75.9062 --75.9031 --75.9109 --75.8969 --75.9047 --75.8906 --75.8938 --75.9062 --75.8969 --75.9062 --75.9078 --75.9047 --75.9156 --75.9078 --75.9 --75.9125 --75.9219 --75.9234 --75.9141 --75.9219 --75.9141 --75.8953 --75.9031 --75.9016 --75.8938 --75.9031 --75.8969 --75.9125 --75.9 --75.8906 --75.8906 --75.9 --75.9 --75.9047 --75.9078 --75.9016 --75.8984 --75.9156 --75.9 --75.8828 --75.8969 --75.8969 --75.8969 --75.9 --75.9109 --75.9047 --75.8969 --75.8984 --75.9141 --75.9078 --75.9266 --75.9156 --75.9062 --75.9 --75.8984 --75.9172 --75.9078 --75.9062 --75.9062 --75.9 --75.9062 --75.9094 --75.8953 --75.9016 --75.8922 --75.9078 --75.9203 --75.9172 --75.9078 --75.8922 --75.8938 --75.9172 --75.9109 --75.9016 --75.9078 --75.9078 --75.9016 --75.9187 --75.9 --75.9187 --75.8969 --75.9172 --75.9125 --75.9094 --75.9109 --75.9016 --75.9031 --75.9125 --75.9141 --75.9125 --75.9078 --75.9031 --75.9125 --75.9156 --75.9094 --75.9172 --75.9031 --75.9078 --75.9266 --75.9062 --75.9234 --75.9125 --75.8984 --75.8953 --75.9156 --75.9234 --75.9156 --75.9219 --75.9281 --75.9234 --75.9141 --75.9141 --75.9187 --75.9156 --75.9172 --75.9094 --75.9047 --75.9062 --75.9109 --75.9219 --75.925 --75.9078 --75.9266 --75.9172 --75.9125 --75.9094 --75.9125 --75.9109 --75.9078 --75.9172 --75.8984 --75.9078 --75.8969 --75.9125 --75.9078 --75.8953 --75.9125 --75.9078 --75.9141 --75.9047 --75.9016 --75.9078 --75.8969 --75.9109 --75.9109 --75.9125 --75.9047 --75.9141 --75.9187 --75.9109 --75.925 --75.9125 --75.9094 --75.9047 --75.9203 --75.9156 --75.9078 --75.9078 --75.9062 --75.9016 --75.9031 --75.9016 --75.9125 --75.9141 --75.9031 --75.9031 --75.9047 --75.9078 --75.8938 --75.9125 --75.9047 --75.8875 --75.9 --75.9156 --75.9141 --75.9234 --75.925 --75.9156 --75.9313 --75.9219 --75.9141 --75.9281 --75.9141 --75.9141 --75.9125 --75.925 --75.9391 --75.9219 --75.9125 --75.9203 --75.9297 --75.9172 --75.925 --75.9125 --75.9359 --75.9266 --75.9234 --75.9219 --75.9375 --75.9266 --75.9313 --75.9187 --75.9203 --75.9047 --75.9125 --75.9141 --75.9062 --75.9187 --75.9313 --75.9203 --75.9094 --75.9219 --75.9156 --75.925 --75.925 --75.8984 --75.9062 --75.9297 --75.9187 --75.925 --75.9094 --75.9172 --75.9234 --75.9094 --75.9109 --75.9297 --75.9125 --75.9219 --75.9234 --75.9219 --75.9203 --75.9328 --75.9078 --75.9172 --75.9266 --75.9078 --75.9156 --75.9172 --75.9156 --75.9219 --75.9031 --75.9109 --75.9062 --75.9219 --75.9109 --75.9047 --75.9016 --75.9125 --75.9031 --75.9062 --75.9078 --75.8969 --75.9125 --75.9125 --75.9031 --75.9156 --75.9156 --75.9281 --75.9141 --75.9141 --75.925 --75.925 --75.9156 --75.9156 --75.9141 --75.9187 --75.9219 --75.9203 --75.9219 --75.9234 --75.9234 --75.9219 --75.9141 --75.9219 --75.9141 --75.9266 --75.9062 --75.9187 --75.9047 --75.9094 --75.9109 --75.9234 --75.9031 --75.8844 --75.8984 --75.9047 --75.8906 --75.9 --75.8938 --75.9109 --75.8969 --75.8953 --75.9125 --75.8906 --75.8938 --75.9125 --75.925 --75.8906 --75.9125 --75.9078 --75.9016 --75.9094 --75.9125 --75.9187 --75.9125 --75.9172 --75.9172 --75.9062 --75.9203 --75.9109 --75.9141 --75.9187 --75.9187 --75.9156 --75.9203 --75.9156 --75.9031 --75.9172 --75.9219 --75.9219 --75.9094 --75.9172 --75.9187 --75.9047 --75.9109 --75.9219 --75.9078 --75.9141 --75.9094 --75.9016 --75.9203 --75.925 --75.9125 --75.9156 --75.8953 --75.9 --75.9125 --75.9141 --75.9125 --75.9172 --75.9109 --75.9172 --75.9187 --75.9266 --75.9078 --75.9094 --75.9172 --75.8922 --75.9078 --75.9156 --75.9109 --75.9109 --75.9 --75.9 --75.9 --75.9047 --75.9 --75.9016 --75.9016 --75.8906 --75.9078 --75.9094 --75.8922 --75.9094 --75.9125 --75.9141 --75.9 --75.9094 --75.9094 --75.9031 --75.9062 --75.9047 --75.9 --75.9062 --75.9062 --75.9156 --75.9078 --75.8938 --75.9141 --75.9 --75.9031 --75.8984 --75.8906 --75.9109 --75.9062 --75.9062 --75.9109 --75.9031 --75.8875 --75.9094 --75.8984 --75.9078 --75.8844 --75.9047 --75.9094 --75.9109 --75.9 --75.8953 --75.9047 --75.8906 --75.8891 --75.8938 --75.9062 --75.8922 --75.8938 --75.9 --75.8938 --75.9047 --75.8844 --75.8969 --75.9062 --75.9219 --75.9109 --75.9109 --75.9016 --75.9062 --75.9016 --75.9047 --75.9047 --75.8922 --75.9062 --75.8953 --75.8953 --75.8938 --75.9031 --75.9016 --75.8969 --75.8969 --75.8984 --75.9094 --75.9125 --75.8969 --75.8969 --75.8984 --75.8969 --75.9078 --75.9094 --75.9016 --75.9062 --75.9047 --75.9016 --75.9094 --75.9016 --75.8969 --75.8938 --75.9078 --75.9109 --75.8953 --75.8906 --75.9187 --75.9047 --75.8984 --75.9078 --75.9109 --75.9094 --75.9031 --75.9125 --75.9031 --75.9172 --75.9016 --75.9187 --75.9062 --75.9141 --75.9047 --75.8984 --75.9187 --75.9078 --75.9141 --75.9047 --75.9062 --75.9016 --75.9078 --75.9109 --75.9125 --75.9062 --75.9094 --75.9062 --75.9031 --75.9078 --75.9172 --75.9031 --75.9109 --75.9016 --75.9 --75.9016 --75.8953 --75.9109 --75.8984 --75.8969 --75.8938 --75.8844 --75.8922 --75.8969 --75.8891 --75.8984 --75.9047 --75.9 --75.9 --75.8938 --75.9125 --75.8891 --75.8984 --75.8875 --75.8969 --75.9062 --75.9016 --75.9172 --75.9016 --75.8984 --75.8828 --75.9 --75.8891 --75.8828 --75.8922 --75.8891 --75.9062 --75.9016 --75.8969 --75.9 --75.9031 --75.9047 --75.9141 --75.9125 --75.9125 --75.9078 --75.8906 --75.8984 --75.9047 --75.8938 --75.9156 --75.8969 --75.9062 --75.8984 --75.9062 --75.9062 --75.8875 --75.9141 --75.9047 --75.9094 --75.9078 --75.9125 --75.9156 --75.9047 --75.9062 --75.9062 --75.9141 --75.9156 --75.9094 --75.9094 --75.9109 --75.9156 --75.9172 --75.9062 --75.9203 --75.9109 --75.9094 --75.9094 --75.9187 --75.9125 --75.9125 --75.9016 --75.9109 --75.9219 --75.9125 --75.9094 --75.9141 --75.8906 --75.9 --75.8984 --75.9141 --75.9 --75.9156 --75.9031 --75.9031 --75.9125 --75.9203 --75.9187 --75.9094 --75.9172 --75.9125 --75.9219 --75.9062 --75.9078 --75.9156 --75.9016 --75.9 --75.9016 --75.9062 --75.9062 --75.9031 --75.8984 --75.9203 --75.9109 --75.8938 --75.9047 --75.9094 --75.9031 --75.8984 --75.9047 --75.9109 --75.9062 --75.9047 --75.8969 --75.9 --75.9078 --75.9109 --75.9016 --75.9031 --75.9047 --75.9 --75.9219 --75.9062 --75.8938 --75.9047 --75.9062 --75.9094 --75.9109 --75.9125 --75.9016 --75.9219 --75.9078 --75.9016 --75.9031 --75.9062 --75.9094 --75.8984 --75.9109 --75.9109 --75.8984 --75.9 --75.9172 --75.9047 --75.9016 --75.9187 --75.9078 --75.9187 --75.9047 --75.9156 --75.9078 --75.9156 --75.9078 --75.9094 --75.9203 --75.9078 --75.9141 --75.9141 --75.9078 --75.9125 --75.9062 --75.9078 --75.9203 --75.9078 --75.9094 --75.9062 --75.9078 --75.9047 --75.9234 --75.9156 --75.9172 --75.9094 --75.9109 --75.9234 --75.9109 --75.9141 --75.9047 --75.9109 --75.9094 --75.9141 --75.9094 --75.9062 --75.9047 --75.9 --75.9094 --75.9156 --75.9187 --75.9016 --75.9094 --75.9031 --75.9125 --75.9047 --75.9047 --75.9016 --75.9062 --75.9156 --75.9016 --75.9172 --75.9125 --75.9062 --75.9031 --75.9203 --75.9047 --75.9172 --75.9109 --75.9156 --75.9 --75.8938 --75.9031 --75.9031 --75.9 --75.9031 --75.9047 --75.9047 --75.9047 --75.9234 --75.9047 --75.9016 --75.9094 --75.9031 --75.9016 --75.9141 --75.9109 --75.9016 --75.9078 --75.9062 --75.9219 --75.8922 --75.9203 --75.9031 --75.9078 --75.9094 --75.9078 --75.9062 --75.9187 --75.9109 --75.9109 --75.9062 --75.9266 --75.9141 --75.9187 --75.9172 --75.9156 --75.9234 --75.9219 --75.9203 --75.9203 --75.9156 --75.9141 --75.9172 --75.9203 --75.9187 --75.9141 --75.9234 --75.9141 --75.9109 --75.9109 --75.9125 --75.9031 --75.9094 --75.9094 --75.9062 --75.9109 --75.9062 --75.9078 --75.9141 --75.9156 --75.9156 --75.9047 --75.9187 --75.9078 --75.9078 --75.9172 --75.9141 --75.9172 --75.9172 --75.9141 --75.9 --75.9109 --75.9078 --75.9234 --75.8984 --75.9172 --75.9219 --75.9156 --75.9094 --75.9094 --75.9047 --75.9187 --75.9141 --75.9062 --75.9156 --75.9156 --75.9203 --75.9094 --75.9109 --75.9109 --75.9078 --75.9125 --75.9203 --75.9172 --75.8969 --75.9125 --75.9094 --75.9062 --75.9141 --75.9016 --75.9109 --75.8922 --75.9047 --75.9047 --75.9031 --75.9125 --75.9078 --75.9109 --75.9078 --75.9109 --75.9047 --75.9219 --75.9141 --75.9 --75.9187 --75.9 --75.9141 --75.9062 --75.9062 --75.8969 --75.9047 --75.9078 --75.9047 --75.9156 --75.9203 --75.9078 --75.9062 --75.9219 --75.9078 --75.8969 --75.9062 --75.9031 --75.9109 --75.9141 --75.9172 --75.9125 --75.9109 --75.9109 --75.9062 --75.9141 --75.9047 --75.9203 --75.9203 --75.9109 --75.9203 --75.9172 --75.9078 --75.9078 --75.8984 --75.9187 --75.9094 --75.9094 --75.9109 --75.9141 --75.8969 --75.925 --75.9141 --75.9109 --75.9062 --75.9047 --75.9156 --75.9031 --75.9062 --75.9094 --75.9125 --75.9047 --75.9062 --75.9156 --75.8922 --75.9109 --75.9016 --75.9109 --75.9078 --75.9078 --75.8953 --75.8938 --75.9031 --75.8859 --75.9094 --75.9062 --75.8953 --75.8969 --75.8953 --75.9 --75.9031 --75.9047 --75.9172 --75.9203 --75.9156 --75.9125 --75.9219 --75.925 --75.9047 --75.9187 --75.9203 --75.9078 --75.9109 --75.9062 --75.9109 --75.9156 --75.9078 --75.9078 --75.8969 --75.8969 --75.9078 --75.9094 --75.9016 --75.9125 --75.8953 --75.8938 --75.9 --75.8922 --75.8953 --75.9078 --75.8969 --75.8984 --75.9078 --75.8969 --75.9031 --75.8953 --75.8859 --75.9016 --75.8891 --75.9 --75.9031 --75.9062 --75.9078 --75.9062 --75.9031 --75.9141 --75.8875 --75.8922 --75.9 --75.8969 --75.9062 --75.8984 --75.9078 --75.9047 --75.9125 --75.8953 --75.8953 --75.8891 --75.8922 --75.9062 --75.9 --75.9 --75.9125 --75.9031 --75.8984 --75.9031 --75.9 --75.8891 --75.9062 --75.8984 --75.8859 --75.8969 --75.9016 --75.9 --75.8922 --75.8812 --75.8938 --75.8891 --75.8875 --75.8781 --75.8859 --75.8969 --75.8969 --75.9062 --75.8953 --75.8844 --75.9 --75.9125 --75.8844 --75.8984 --75.8891 --75.8969 --75.8844 --75.8953 --75.9016 --75.8891 --75.8828 --75.875 --75.8688 --75.8953 --75.8906 --75.8859 --75.8875 --75.8906 --75.8812 --75.8875 --75.8781 --75.8859 --75.8812 --75.8844 --75.8875 --75.8922 --75.8859 --75.8859 --75.8875 --75.8797 --75.8812 --75.8828 --75.8844 --75.8672 --75.8844 --75.8922 --75.8891 --75.8828 --75.8984 --75.8922 --75.8984 --75.8859 --75.8891 --75.8781 --75.8844 --75.8953 --75.8953 --75.8969 --75.8969 --75.8875 --75.9016 --75.8984 --75.9016 --75.9016 --75.8969 --75.8969 --75.8953 --75.9 --75.9016 --75.9 --75.8938 --75.8953 --75.8984 --75.9062 --75.8828 --75.9141 --75.8984 --75.9016 --75.8938 --75.8891 --75.8984 --75.9109 --75.8984 --75.9078 --75.9 --75.8969 --75.8906 --75.8969 --75.8969 --75.8875 --75.8828 --75.9016 --75.9094 --75.9016 --75.9109 --75.8984 --75.9047 --75.9062 --75.9047 --75.9031 --75.9125 --75.9031 --75.8984 --75.8969 --75.9031 --75.8984 --75.8891 --75.8906 --75.9031 --75.8969 --75.8984 --75.8969 --75.8938 --75.8984 --75.9 --75.8875 --75.9016 --75.9078 --75.8891 --75.9062 --75.9 --75.8875 --75.8938 --75.8844 --75.8953 --75.8969 --75.8906 --75.8953 --75.8953 --75.8922 --75.8938 --75.8875 --75.8938 --75.8891 --75.8969 --75.8969 --75.8922 --75.8828 --75.9031 --75.8812 --75.8953 --75.8953 --75.8906 --75.8875 --75.8938 --75.9 --75.8812 --75.8969 --75.8969 --75.9062 --75.9 --75.8797 --75.8938 --75.8859 --75.8844 --75.8984 --75.8922 --75.8766 --75.9031 --75.8938 --75.8984 --75.8922 --75.8984 --75.8875 --75.9047 --75.8828 --75.8828 --75.8875 --75.8891 --75.8891 --75.8797 --75.8984 --75.8891 --75.8859 --75.8891 --75.8906 --75.8875 --75.8922 --75.8953 --75.8938 --75.8953 --75.8922 --75.8922 --75.8953 --75.9016 --75.8859 --75.8812 --75.8906 --75.8812 --75.8844 --75.9047 --75.8844 --75.8969 --75.8969 --75.8953 --75.8953 --75.8969 --75.8781 --75.8953 --75.8953 --75.8797 --75.8719 --75.8922 --75.8859 --75.8953 --75.9031 --75.8906 --75.9031 --75.8922 --75.8953 --75.8969 --75.8984 --75.9 --75.9078 --75.8984 --75.8859 --75.9031 --75.8969 --75.9 --75.9031 --75.9047 --75.9016 --75.8938 --75.8953 --75.9031 --75.8969 --75.9031 --75.9016 --75.9 --75.9031 --75.8828 --75.8953 --75.9031 --75.8875 --75.8844 --75.8969 --75.8953 --75.8859 --75.8844 --75.8812 --75.8891 --75.8891 --75.8906 --75.8953 --75.8922 --75.8922 --75.8969 --75.9 --75.8922 --75.8984 --75.8828 --75.8906 --75.9016 --75.8891 --75.8891 --75.8922 --75.8984 --75.8828 --75.8953 --75.8891 --75.8812 --75.8969 --75.8812 --75.8938 --75.8812 --75.8969 --75.8844 --75.8938 --75.8719 --75.8875 --75.8844 --75.9016 --75.8891 --75.8859 --75.8812 --75.8906 --75.8922 --75.8812 --75.8875 --75.8922 --75.8844 --75.9 --75.8844 --75.8953 --75.8828 --75.9 --75.8891 --75.8812 --75.8984 --75.8797 --75.8875 --75.8859 --75.8859 --75.8922 --75.8906 --75.9 --75.8984 --75.8922 --75.8875 --75.8938 --75.8812 --75.8859 --75.8906 --75.8859 --75.8766 --75.8922 --75.8844 --75.8953 --75.8906 --75.8859 --75.8953 --75.8938 --75.8891 --75.8844 --75.8953 --75.8859 --75.8875 --75.875 --75.8859 --75.8844 --75.8703 --75.8734 --75.8891 --75.8828 --75.8859 --75.8828 --75.8781 --75.8906 --75.8844 --75.8844 --75.8797 --75.8938 --75.8766 --75.8953 --75.8922 --75.9 --75.8797 --75.8828 --75.8984 --75.8781 --75.8891 --75.8859 --75.8875 --75.8891 --75.8844 --75.8828 --75.8844 --75.8734 --75.8828 --75.8797 --75.9125 --75.8797 --75.8719 --75.8844 --75.8953 --75.8938 --75.8859 --75.8812 --75.8875 --75.9047 --75.8922 --75.8875 --75.8906 --75.8859 --75.8781 --75.8984 --75.9031 --75.8938 --75.9 --75.8906 --75.8875 --75.8938 --75.8953 --75.8969 --75.8891 --75.8859 --75.8953 --75.875 --75.8891 --75.8891 --75.8922 --75.9 --75.9 --75.8875 --75.8953 --75.8891 --75.8906 --75.8953 --75.8906 --75.8953 --75.9016 --75.9109 --75.9047 --75.8938 --75.8875 --75.8969 --75.8828 --75.8906 --75.8844 --75.8938 --75.8875 --75.8953 --75.8984 --75.8859 --75.8828 --75.8906 --75.9094 --75.9094 --75.9 --75.9062 --75.8922 --75.9062 --75.8828 --75.8953 --75.9 --75.8875 --75.8984 --75.8766 --75.8938 --75.8953 --75.8938 --75.9109 --75.9016 --75.8891 --75.8984 --75.8969 --75.8875 --75.8938 --75.8984 --75.9 --75.8938 --75.8875 --75.9031 --75.8875 --75.8828 --75.9 --75.8938 --75.8875 --75.8844 --75.8922 --75.8984 --75.8938 --75.8922 --75.8938 --75.9062 --75.8938 --75.9062 --75.8969 --75.9062 --75.8953 --75.8922 --75.9062 --75.9031 --75.8938 --75.8969 --75.8938 --75.9062 --75.8938 --75.9031 --75.8969 --75.9031 --75.9078 --75.8938 --75.9125 --75.9 --75.8969 --75.8891 --75.8922 --75.9172 --75.8906 --75.8969 --75.8953 --75.8984 --75.8938 --75.9031 --75.9016 --75.9078 --75.8938 --75.8875 --75.9047 --75.8891 --75.9125 --75.8781 --75.9 --75.8875 --75.8922 --75.9016 --75.8938 --75.9047 --75.8844 --75.8969 --75.9078 --75.8969 --75.8906 --75.9 --75.9062 --75.9016 --75.9141 --75.9016 --75.9031 --75.9109 --75.9078 --75.9125 --75.8859 --75.8984 --75.8953 --75.9172 --75.9109 --75.9172 --75.9047 --75.9062 --75.9016 --75.8969 --75.8984 --75.9141 --75.9078 --75.9 --75.9047 --75.8953 --75.9125 --75.9062 --75.8953 --75.9031 --75.9047 --75.9 --75.8953 --75.9016 --75.9094 --75.8938 --75.8984 --75.9156 --75.9 --75.9094 --75.9094 --75.8953 --75.8969 --75.9047 --75.9047 --75.9016 --75.8969 --75.9 --75.8969 --75.9062 --75.8984 --75.8938 --75.9031 --75.9 --75.8984 --75.8906 --75.8969 --75.9062 --75.9016 --75.9062 --75.9125 --75.9047 --75.9172 --75.9078 --75.8984 --75.8984 --75.9094 --75.9047 --75.9031 --75.9047 --75.9031 --75.8969 --75.9078 --75.9031 --75.8891 --75.9062 --75.9125 --75.8984 --75.9062 --75.9031 --75.9031 --75.9 --75.9078 --75.8969 --75.9078 --75.8922 --75.8938 --75.8969 --75.9078 --75.9094 --75.9016 --75.8859 --75.8984 --75.9062 --75.8969 --75.9016 --75.9031 --75.8891 --75.9016 --75.9062 --75.8953 --75.9 --75.9047 --75.8969 --75.8922 --75.8859 --75.8906 --75.9031 --75.9078 --75.8938 --75.9016 --75.8969 --75.9062 --75.8906 --75.9047 --75.8922 --75.9 --75.9078 --75.8984 --75.8859 --75.8969 --75.8812 --75.8906 --75.8875 --75.8906 --75.8969 --75.8953 --75.8906 --75.8953 --75.9047 --75.9016 --75.8969 --75.9 --75.9141 --75.8938 --75.9031 --75.9031 --75.8984 --75.8969 --75.8766 --75.9016 --75.8766 --75.9109 --75.9 --75.8938 --75.8969 --75.8875 --75.9031 --75.8906 --75.8891 --75.9 --75.9062 --75.9031 --75.9016 --75.9047 --75.8938 --75.8891 --75.8938 --75.8906 --75.8938 --75.8859 --75.8875 --75.9016 --75.8906 --75.8969 --75.9062 --75.8922 --75.8922 --75.8859 --75.8984 --75.8812 --75.9047 --75.8938 --75.9078 --75.8938 --75.8938 --75.8844 --75.9 --75.9016 --75.8969 --75.9078 --75.8844 --75.8891 --75.9062 --75.8984 --75.8875 --75.8828 --75.9031 --75.8781 --75.8781 --75.8875 --75.8906 --75.8906 --75.8734 --75.8891 --75.8891 --75.8875 --75.8875 --75.8781 --75.8828 --75.8891 --75.8875 --75.8906 --75.8781 --75.8859 --75.8891 --75.8875 --75.9 --75.8797 --75.875 --75.8781 --75.8906 --75.8922 --75.9 --75.8984 --75.8828 --75.8859 --75.9031 --75.8859 --75.8859 --75.8984 --75.8828 --75.8922 --75.8922 --75.9 --75.8781 --75.9031 --75.8719 --75.8875 --75.8844 --75.8844 --75.8828 --75.8906 --75.8859 --75.8844 --75.8875 --75.8891 --75.8828 --75.9047 --75.8812 --75.9016 --75.8953 --75.8922 --75.8922 --75.9031 --75.9 --75.8922 --75.8984 --75.9062 --75.9125 --75.9187 --75.9 --75.9031 --75.9031 --75.9125 --75.9047 --75.9016 --75.9094 --75.8922 --75.8875 --75.9078 --75.9062 --75.8891 --75.9031 --75.9062 --75.9016 --75.8938 --75.8906 --75.8938 --75.8969 --75.8906 --75.8906 --75.8891 --75.8953 --75.8891 --75.8984 --75.8984 --75.8844 --75.9 --75.9141 --75.8984 --75.8875 --75.8922 --75.8828 --75.8875 --75.8781 --75.9 --75.8953 --75.8922 --75.9047 --75.8922 --75.9016 --75.8906 --75.9094 --75.8875 --75.9031 --75.9031 --75.9047 --75.8875 --75.8812 --75.8969 --75.8875 --75.8828 --75.9047 --75.8875 --75.8859 --75.9 --75.8922 --75.8984 --75.8969 --75.9016 --75.9094 --75.8969 --75.8922 --75.8953 --75.9031 --75.8781 --75.9031 --75.8969 --75.875 --75.8844 --75.9031 --75.8969 --75.8969 --75.8875 --75.9016 --75.8922 --75.8906 --75.9094 --75.8797 --75.9 --75.8938 --75.8906 --75.8828 --75.8906 --75.8875 --75.8781 --75.8938 --75.8953 --75.8922 --75.9 --75.8781 --75.8984 --75.9031 --75.8969 --75.8984 --75.9016 --75.9031 --75.8859 --75.8891 --75.8922 --75.8969 --75.8969 --75.8812 --75.8938 --75.9 --75.8969 --75.9031 --75.8953 --75.8938 --75.8984 --75.8906 --75.9 --75.8797 --75.9078 --75.8969 --75.9078 --75.9 --75.8875 --75.8984 --75.9047 --75.8969 --75.8906 --75.8969 --75.9016 --75.9031 --75.9125 --75.9 --75.9047 --75.9031 --75.9062 --75.8875 --75.8812 --75.8906 --75.8781 --75.8953 --75.8891 --75.8938 --75.8953 --75.8875 --75.8953 --75.8922 --75.8844 --75.8828 --75.8812 --75.8891 --75.8906 --75.8938 --75.9016 --75.9047 --75.8922 --75.8828 --75.8891 --75.8938 --75.9031 --75.8859 --75.9031 --75.9078 --75.8922 --75.8906 --75.8719 --75.8969 --75.9094 --75.8859 --75.8953 --75.9047 --75.8922 --75.8969 --75.9078 --75.9 --75.9 --75.8922 --75.8969 --75.8891 --75.8984 --75.9 --75.9031 --75.8891 --75.9047 --75.8859 --75.8984 --75.8875 --75.8891 --75.9 --75.8984 --75.8922 --75.9016 --75.8953 --75.8938 --75.9016 --75.8984 --75.9047 --75.9 --75.9125 --75.8922 --75.8953 --75.8891 --75.8891 --75.9031 --75.9094 --75.9109 --75.9 --75.8938 --75.9 --75.9031 --75.9047 --75.8938 --75.8859 --75.8922 --75.9031 --75.8781 --75.8891 --75.8906 --75.8875 --75.8875 --75.8859 --75.8844 --75.8875 --75.8812 --75.8812 --75.8984 --75.8938 --75.8984 --75.9016 --75.8953 --75.8906 --75.8938 --75.8891 --75.8859 --75.8922 --75.9078 --75.8891 --75.8953 --75.8984 --75.8938 --75.9047 --75.8969 --75.8797 --75.8891 --75.8891 --75.8828 --75.8984 --75.8719 --75.8859 --75.8984 --75.8875 --75.8922 --75.8859 --75.9094 --75.9 --75.9 --75.9094 --75.9016 --75.8859 --75.8875 --75.9016 --75.8984 --75.8781 --75.9109 --75.8812 --75.8891 --75.8938 --75.8938 --75.8891 --75.8875 --75.8969 --75.8922 --75.8797 --75.8844 --75.8781 --75.8906 --75.8969 --75.8953 --75.8844 --75.8875 --75.8859 --75.8953 --75.8828 --75.8828 --75.8938 --75.8922 --75.8906 --75.9016 --75.8906 --75.9031 --75.9 --75.8922 --75.8953 --75.8844 --75.8922 --75.8906 --75.9031 --75.8891 --75.9016 --75.9078 --75.8969 --75.8969 --75.8844 --75.8859 --75.8938 --75.8875 --75.8922 --75.8859 --75.8734 --75.8828 --75.8953 --75.9 --75.8828 --75.8938 --75.8969 --75.9047 --75.9 --75.8844 --75.8938 --75.8938 --75.8922 --75.8938 --75.9125 --75.8984 --75.8938 --75.8969 --75.8984 --75.8891 --75.875 --75.8828 --75.8812 --75.8812 --75.8797 --75.8797 --75.8828 --75.8891 --75.8859 --75.8906 --75.8797 --75.8828 --75.8781 --75.8906 --75.8828 --75.8906 --75.8766 --75.8797 --75.8891 --75.8859 --75.8875 --75.8812 --75.8906 --75.8953 --75.8922 --75.8953 --75.8859 --75.9062 --75.8906 --75.8938 --75.8719 --75.8781 --75.8812 --75.8781 --75.8938 --75.8922 --75.8891 --75.8953 --75.8812 --75.8875 --75.8922 --75.8844 --75.8781 --75.8875 --75.8812 --75.8812 --75.8797 --75.8906 --75.8891 --75.8984 --75.8953 --75.8984 --75.8953 --75.8875 --75.8891 --75.8906 --75.9016 --75.9 --75.8859 --75.8906 --75.9047 --75.8938 --75.8875 --75.9016 --75.9016 --75.8844 --75.8844 --75.8953 --75.9 --75.8797 --75.8844 --75.8906 --75.8953 --75.8953 --75.8875 --75.8938 --75.8984 --75.8984 --75.8844 --75.9 --75.8938 --75.8828 --75.9047 --75.8891 --75.8859 --75.8906 --75.9 --75.8938 --75.8906 --75.8891 --75.8938 --75.9 --75.8922 --75.9062 --75.8906 --75.9078 --75.8953 --75.9 --75.9094 --75.9016 --75.8984 --75.9156 --75.9016 --75.9016 --75.9141 --75.8969 --75.9094 --75.9031 --75.9062 --75.8984 --75.8938 --75.8922 --75.9078 --75.8969 --75.9016 --75.8922 --75.8969 --75.8984 --75.9031 --75.8984 --75.8969 --75.9078 --75.9094 --75.9125 --75.9047 --75.9125 --75.9125 --75.9109 --75.9016 --75.8984 --75.9062 --75.9047 --75.9094 --75.8953 --75.8984 --75.9031 --75.9 --75.8906 --75.9094 --75.8953 --75.8969 --75.9141 --75.9 --75.9047 --75.9047 --75.9 --75.9016 --75.8953 --75.8797 --75.9 --75.9109 --75.8969 --75.8938 --75.8891 --75.9078 --75.9125 --75.9125 --75.9 --75.9156 --75.9125 --75.9047 --75.8969 --75.8938 --75.9031 --75.9109 --75.9141 --75.9062 --75.9062 --75.9172 --75.9078 --75.9172 --75.8984 --75.9094 --75.9094 --75.8922 --75.9 --75.9141 --75.9078 --75.8953 --75.8984 --75.9125 --75.9109 --75.9094 --75.9187 --75.9234 --75.9109 --75.9141 --75.9109 --75.925 --75.9297 --75.9062 --75.9047 --75.9031 --75.9078 --75.9141 --75.9062 --75.9016 --75.9 --75.8859 --75.9 --75.8984 --75.9 --75.9094 --75.9094 --75.8875 --75.9125 --75.8969 --75.9047 --75.8922 --75.8969 --75.8922 --75.8938 --75.9047 --75.9 --75.8844 --75.9109 --75.9016 --75.9031 --75.9 --75.8922 --75.9016 --75.8859 --75.8922 --75.8859 --75.8906 --75.8922 --75.8953 --75.9 --75.9016 --75.8953 --75.9016 --75.8984 --75.9031 --75.8969 --75.8969 --75.9 --75.8953 --75.8938 --75.9 --75.8906 --75.8891 --75.9 --75.9078 --75.8953 --75.9031 --75.8875 --75.9016 --75.8875 --75.8984 --75.8922 --75.9125 --75.9016 --75.9062 --75.8969 --75.9094 --75.9078 --75.9047 --75.9156 --75.9016 --75.8891 --75.9031 --75.8938 --75.9047 --75.8984 --75.8969 --75.8906 --75.8938 --75.8906 --75.8891 --75.8953 --75.8984 --75.8984 --75.8938 --75.8953 --75.9078 --75.8906 --75.8969 --75.8953 --75.9047 --75.9141 --75.8844 --75.8969 --75.8906 --75.9047 --75.9125 --75.8984 --75.9047 --75.9141 --75.9016 --75.9156 --75.9094 --75.9062 --75.9203 --75.8938 --75.9203 --75.9234 --75.9016 --75.9266 --75.925 --75.9141 --75.9094 --75.9172 --75.9203 --75.9125 --75.8953 --75.9109 --75.9203 --75.9078 --75.9141 --75.8938 --75.9 --75.8906 --75.9187 --75.9141 --75.9 --75.9047 --75.9109 --75.9203 --75.9141 --75.9062 --75.9094 --75.9141 --75.9 --75.9187 --75.9031 --75.9156 --75.9172 --75.9141 --75.9172 --75.8938 --75.9109 --75.9141 --75.9141 --75.9094 --75.9078 --75.9109 --75.9047 --75.9094 --75.9078 --75.8938 --75.9078 --75.9031 --75.9 --75.9141 --75.8984 --75.9031 --75.9094 --75.9094 --75.9047 --75.8984 --75.9062 --75.8969 --75.9 --75.8922 --75.8984 --75.8969 --75.8859 --75.8891 --75.8969 --75.8938 --75.8953 --75.9047 --75.8891 --75.9016 --75.9094 --75.9047 --75.9047 --75.9047 --75.8938 --75.8984 --75.8969 --75.9094 --75.9016 --75.8938 --75.8891 --75.8984 --75.8859 --75.8984 --75.8953 --75.9016 --75.9016 --75.8953 --75.8859 --75.8844 --75.8906 --75.8938 --75.8922 --75.9156 --75.9 --75.8781 --75.8859 --75.8891 --75.8938 --75.8953 --75.8969 --75.9078 --75.8906 --75.9078 --75.8969 --75.8922 --75.8984 --75.9031 --75.9062 --75.9062 --75.8906 --75.8984 --75.8953 --75.8969 --75.8891 --75.8891 --75.9016 --75.8906 --75.8922 --75.8828 --75.8938 --75.8891 --75.8969 --75.8984 --75.8859 --75.8906 --75.8922 --75.9 --75.8906 --75.8984 --75.8969 --75.8859 --75.8891 --75.8953 --75.9031 --75.8766 --75.8953 --75.8906 --75.8875 --75.8875 --75.8844 --75.8859 --75.8891 --75.8938 --75.8922 --75.8922 --75.8938 --75.8984 --75.9016 --75.9047 --75.8984 --75.9109 --75.8984 --75.9078 --75.9125 --75.8891 --75.8906 --75.9062 --75.9062 --75.8984 --75.9062 --75.8906 --75.8938 --75.8812 --75.9125 --75.9031 --75.8875 --75.8922 --75.8906 --75.8938 --75.8922 --75.8984 --75.9062 --75.9047 --75.8984 --75.8953 --75.9047 --75.9031 --75.9031 --75.9016 --75.9016 --75.9031 --75.8984 --75.8922 --75.8938 --75.9062 --75.8906 --75.9 --75.8938 --75.8922 --75.8938 --75.9078 --75.8906 --75.9 --75.8953 --75.8953 --75.8969 --75.8984 --75.8953 --75.8984 --75.8938 --75.8953 --75.8953 --75.8969 --75.9 --75.9016 --75.9062 --75.8969 --75.8984 --75.9062 --75.9031 --75.9047 --75.8969 --75.9062 --75.8969 --75.9094 --75.9109 --75.9078 --75.9047 --75.9047 --75.9016 --75.8984 --75.9094 --75.9031 --75.9125 --75.8969 --75.9062 --75.9016 --75.9094 --75.9031 --75.9156 --75.9125 --75.9141 --75.9156 --75.9125 --75.9047 --75.9094 --75.9156 --75.9047 --75.9109 --75.8984 --75.9031 --75.9078 --75.9047 --75.9141 --75.9172 --75.9 --75.9078 --75.9062 --75.9078 --75.9062 --75.9047 --75.8984 --75.9 --75.9 --75.9094 --75.9047 --75.9 --75.9219 --75.9031 --75.9031 --75.9 --75.9156 --75.9187 --75.8953 --75.9109 --75.9141 --75.9047 --75.9047 --75.9094 --75.9141 --75.9047 --75.9266 --75.9094 --75.9016 --75.9156 --75.9047 --75.9016 --75.9141 --75.9094 --75.8953 --75.9156 --75.9125 --75.9 --75.9031 --75.8875 --75.9062 --75.8953 --75.9062 --75.9031 --75.8922 --75.8984 --75.8875 --75.8953 --75.9 --75.9 --75.9047 --75.8922 --75.9031 --75.8953 --75.8906 --75.9 --75.9078 --75.9031 --75.9 --75.9141 --75.9062 --75.9016 --75.8891 --75.8812 --75.9062 --75.8969 --75.8922 --75.8969 --75.9031 --75.8953 --75.9047 --75.9047 --75.8828 --75.8781 --75.8984 --75.9016 --75.8953 --75.9172 --75.9125 --75.8984 --75.9172 --75.9219 --75.9094 --75.9141 --75.9141 --75.9062 --75.9062 --75.9094 --75.9031 --75.9062 --75.9109 --75.9094 --75.8969 --75.9156 --75.9062 --75.9094 --75.8984 --75.9094 --75.9109 --75.9031 --75.9047 --75.9094 --75.9047 --75.9094 --75.9094 --75.8844 --75.9031 --75.9 --75.9109 --75.9016 --75.9047 --75.9187 --75.8984 --75.9109 --75.9031 --75.9031 --75.8922 --75.9156 --75.8969 --75.9062 --75.8984 --75.9 --75.9094 --75.8922 --75.8938 --75.8938 --75.8969 --75.8969 --75.8984 --75.8891 --75.8844 --75.8906 --75.8844 --75.8938 --75.9062 --75.9062 --75.8906 --75.8938 --75.8906 --75.8984 --75.8953 --75.9016 --75.8859 --75.8984 --75.9047 --75.9016 --75.9016 --75.8875 --75.9062 --75.9047 --75.9047 --75.8938 --75.8938 --75.8812 --75.9062 --75.8984 --75.8922 --75.9062 --75.8906 --75.8938 --75.8859 --75.9 --75.8953 --75.8828 --75.8953 --75.9062 --75.8844 --75.8891 --75.8922 --75.8828 --75.8891 --75.8812 --75.8953 --75.8891 --75.9031 --75.8875 --75.8828 --75.8953 --75.8922 --75.8938 --75.8984 --75.8828 --75.8828 --75.8969 --75.8984 --75.9031 --75.8859 --75.9 --75.8969 --75.9047 --75.8969 --75.8875 --75.8891 --75.8969 --75.8938 --75.9078 --75.9109 --75.9016 --75.9078 --75.8906 --75.9016 --75.8969 --75.9047 --75.9047 --75.9047 --75.8953 --75.8984 --75.8938 --75.8969 --75.9078 --75.8969 --75.8875 --75.9 --75.8906 --75.8922 --75.8984 --75.8875 --75.9016 --75.8844 --75.8891 --75.8938 --75.8922 --75.9031 --75.8922 --75.8984 --75.8828 --75.8781 --75.8828 --75.9 --75.8953 --75.8938 --75.8984 --75.8906 --75.8969 --75.9094 --75.8891 --75.8969 --75.8906 --75.8922 --75.8859 --75.8969 --75.8969 --75.8891 --75.8828 --75.8812 --75.9016 --75.8938 --75.8906 --75.8922 --75.8875 --75.8797 --75.8953 --75.8906 --75.8953 --75.9016 --75.8922 --75.8938 --75.8859 --75.875 --75.9031 --75.8969 --75.8969 --75.8891 --75.8969 --75.8812 --75.8938 --75.8828 --75.8859 --75.8875 --75.8906 --75.8859 --75.8953 --75.9016 --75.8828 --75.8938 --75.8922 --75.8938 --75.875 --75.8875 --75.8922 --75.8875 --75.8766 --75.875 --75.8969 --75.8797 --75.8938 --75.9 --75.8875 --75.8984 --75.8875 --75.9016 --75.9016 --75.8844 --75.8922 --75.9031 --75.9 --75.8984 --75.8906 --75.8984 --75.8984 --75.8922 --75.8797 --75.9 --75.8984 --75.8859 --75.9078 --75.9094 --75.8891 --75.8922 --75.8906 --75.8969 --75.8922 --75.9016 --75.8969 --75.9016 --75.9125 --75.9062 --75.8953 --75.8969 --75.8906 --75.8984 --75.9047 --75.8844 --75.9125 --75.9 --75.8938 --75.9078 --75.9078 --75.9031 --75.8859 --75.9141 --75.8969 --75.9031 --75.8875 --75.8922 --75.8906 --75.8797 --75.9047 --75.8938 --75.9031 --75.9062 --75.9094 --75.8906 --75.8984 --75.8953 --75.9062 --75.8953 --75.8984 --75.8906 --75.8953 --75.9016 --75.8922 --75.8906 --75.8875 --75.8844 --75.8781 --75.8859 --75.8906 --75.8797 --75.8891 --75.8922 --75.9047 --75.8828 --75.8906 --75.9047 --75.8844 --75.8906 --75.8984 --75.9016 --75.8953 --75.8969 --75.9047 --75.9078 --75.8797 --75.9 --75.8891 --75.8891 --75.8906 --75.8922 --75.8844 --75.8938 --75.8875 --75.8906 --75.8906 --75.8859 --75.8891 --75.8859 --75.8969 --75.8719 --75.8844 --75.9047 --75.8984 --75.9094 --75.8828 --75.8797 --75.8922 --75.8953 --75.8844 --75.8969 --75.8938 --75.8828 --75.8953 --75.8844 --75.8906 --75.9047 --75.9047 --75.8875 --75.9 --75.9078 --75.9078 --75.8875 --75.8906 --75.8938 --75.8828 --75.8953 --75.8875 --75.8922 --75.8922 --75.8953 --75.8906 --75.8859 --75.8969 --75.8859 --75.9156 --75.8922 --75.8969 --75.9125 --75.8875 --75.9031 --75.9109 --75.8953 --75.9062 --75.9125 --75.8938 --75.8969 --75.9047 --75.9031 --75.8969 --75.8859 --75.8891 --75.8938 --75.8953 --75.8984 --75.8922 --75.9031 --75.8969 --75.9016 --75.8984 --75.9062 --75.8891 --75.9062 --75.8922 --75.9062 --75.9047 --75.8953 --75.8828 --75.8859 --75.8875 --75.9016 --75.9016 --75.8891 --75.8953 --75.9 --75.9 --75.8844 --75.9047 --75.9016 --75.8984 --75.9016 --75.9 --75.9156 --75.9141 --75.9031 --75.9203 --75.9016 --75.9141 --75.9141 --75.9156 --75.9125 --75.9187 --75.9109 --75.9062 --75.9078 --75.9078 --75.9062 --75.9 --75.9172 --75.9078 --75.8859 --75.9062 --75.9047 --75.8891 --75.8844 --75.8938 --75.8984 --75.8938 --75.9062 --75.9016 --75.9016 --75.8922 --75.8828 --75.9094 --75.9062 --75.9 --75.8953 --75.9031 --75.9016 --75.9016 --75.8969 --75.9031 --75.9031 --75.8984 --75.8875 --75.9 --75.9062 --75.8953 --75.8938 --75.8938 --75.8953 --75.8969 --75.9094 --75.9 --75.8875 --75.8875 --75.8844 --75.8938 --75.8953 --75.8891 --75.8984 --75.9 --75.9016 --75.8984 --75.9094 --75.8969 --75.9031 --75.8828 --75.9016 --75.8938 --75.9 --75.8828 --75.9031 --75.8984 --75.8922 --75.9 --75.8969 --75.9094 --75.8984 --75.8969 --75.8953 --75.8922 --75.8984 --75.8859 --75.9047 --75.9031 --75.8844 --75.8984 --75.9016 --75.9016 --75.8953 --75.8984 --75.9078 --75.9031 --75.8938 --75.8953 --75.8922 --75.8953 --75.8969 --75.9 --75.9078 --75.8922 --75.9078 --75.8953 --75.9 --75.8922 --75.8922 --75.9062 --75.8859 --75.8906 --75.8953 --75.8719 --75.8969 --75.8969 --75.8969 --75.8969 --75.8938 --75.8953 --75.9016 --75.8859 --75.8922 --75.8906 --75.8875 --75.8922 --75.8891 --75.8828 --75.8875 --75.9 --75.8938 --75.9047 --75.9109 --75.8969 --75.8984 --75.9 --75.8891 --75.8953 --75.9 --75.8984 --75.8844 --75.8984 --75.9 --75.8859 --75.8906 --75.8938 --75.9 --75.8922 --75.8969 --75.8859 --75.8875 --75.8984 --75.8906 --75.8891 --75.8844 --75.8812 --75.8766 --75.8781 --75.8891 --75.8906 --75.8984 --75.8875 --75.8844 --75.8953 --75.8828 --75.8859 --75.8734 --75.8906 --75.8781 --75.8781 --75.8953 --75.8906 --75.8781 --75.8828 --75.8906 --75.8844 --75.8844 --75.8953 --75.8891 --75.8953 --75.8812 --75.8938 --75.8828 --75.8875 --75.8938 --75.8938 --75.8922 --75.8812 --75.8891 --75.8891 --75.8875 --75.8984 --75.8969 --75.8938 --75.8922 --75.8906 --75.9062 --75.8844 --75.8922 --75.8797 --75.8828 --75.8875 --75.8891 --75.8906 --75.8906 --75.8688 --75.8891 --75.8969 --75.8812 --75.8875 --75.8891 --75.9 --75.8844 --75.8922 --75.8938 --75.8906 --75.8969 --75.8953 --75.8969 --75.9047 --75.8828 --75.8922 --75.8922 --75.8938 --75.8891 --75.8953 --75.8812 --75.8891 --75.8906 --75.9031 --75.8953 --75.8922 --75.8875 --75.8875 --75.9 --75.8906 --75.8906 --75.8953 --75.8828 --75.9047 --75.8797 --75.8953 --75.8969 --75.9 --75.8938 --75.8953 --75.8922 --75.8891 --75.8906 --75.9 --75.8891 --75.8859 --75.9 --75.8938 --75.8984 --75.8734 --75.8922 --75.8875 --75.8781 --75.8875 --75.8797 --75.8953 --75.8844 --75.8766 --75.9062 --75.9047 --75.8984 --75.9094 --75.8875 --75.9016 --75.9016 --75.8953 --75.8938 --75.9016 --75.8938 --75.9016 --75.9 --75.9047 --75.8969 --75.8891 --75.8969 --75.8953 --75.8844 --75.8844 --75.8859 --75.9047 --75.8984 --75.8984 --75.8859 --75.8906 --75.9031 --75.8938 --75.9047 --75.8969 --75.9047 --75.8922 --75.9078 --75.9031 --75.8953 --75.8984 --75.8969 --75.9094 --75.8812 --75.8953 --75.9016 --75.9078 --75.9047 --75.8953 --75.9125 --75.9203 --75.9047 --75.8953 --75.8984 --75.9078 --75.9172 --75.9016 --75.9141 --75.8922 --75.9094 --75.9109 --75.9062 --75.8875 --75.9 --75.8969 --75.8969 --75.8984 --75.9 --75.9047 --75.9 --75.8953 --75.8984 --75.8875 --75.9 --75.8938 --75.8969 --75.8953 --75.9031 --75.8953 --75.8953 --75.8953 --75.8906 --75.8938 --75.8875 --75.8953 --75.9031 --75.8875 --75.8953 --75.9016 --75.9016 --75.9 --75.9078 --75.8969 --75.9 --75.9016 --75.9141 --75.9 --75.8875 --75.8828 --75.8938 --75.9 --75.9 --75.9047 --75.8875 --75.8875 --75.9031 --75.9078 --75.8922 --75.9125 --75.8922 --75.9047 --75.8828 --75.8906 --75.8906 --75.8969 --75.8875 --75.8984 --75.8938 --75.8969 --75.9 --75.9109 --75.8875 --75.9 --75.8984 --75.8984 --75.9062 --75.8984 --75.8969 --75.8891 --75.9031 --75.8969 --75.8938 --75.9094 --75.9016 --75.9109 --75.8938 --75.9016 --75.9047 --75.8922 --75.9016 --75.9109 --75.8969 --75.9094 --75.8938 --75.9078 --75.8984 --75.9031 --75.8969 --75.9062 --75.9062 --75.9016 --75.9047 --75.9125 --75.9094 --75.8938 --75.9187 --75.9031 --75.9094 --75.9 --75.9109 --75.9094 --75.9078 --75.9203 --75.9047 --75.9047 --75.9109 --75.9 --75.8906 --75.8922 --75.9062 --75.9047 --75.8984 --75.9062 --75.9 --75.9062 --75.9047 --75.9031 --75.8859 --75.8984 --75.9031 --75.8859 --75.9 --75.9094 --75.9031 --75.8984 --75.8953 --75.9016 --75.9141 --75.9125 --75.9094 --75.9109 --75.9 --75.9141 --75.9062 --75.9094 --75.9047 --75.9 --75.9 --75.9078 --75.9078 --75.9094 --75.9 --75.9031 --75.9016 --75.8984 --75.8844 --75.9047 --75.9125 --75.9047 --75.8891 --75.8969 --75.9156 --75.9094 --75.8891 --75.9062 --75.9031 --75.8969 --75.8844 --75.8953 --75.9047 --75.9078 --75.8906 --75.8906 --75.9094 --75.8922 --75.9078 --75.8953 --75.8891 --75.8812 --75.8969 --75.8859 --75.8859 --75.8969 --75.8812 --75.8953 --75.8938 --75.8797 --75.8984 --75.8922 --75.8922 --75.8875 --75.9062 --75.8828 --75.8984 --75.8844 --75.8906 --75.9016 --75.8938 --75.8922 --75.9 --75.8891 --75.9094 --75.8984 --75.9031 --75.8859 --75.8859 --75.8922 --75.8891 --75.8812 --75.8938 --75.8969 --75.9016 --75.9016 --75.8953 --75.9031 --75.8953 --75.8953 --75.8938 --75.8953 --75.9 --75.8812 --75.8875 --75.9016 --75.9047 --75.9156 --75.8891 --75.9016 --75.8953 --75.8859 --75.8906 --75.8859 --75.8875 --75.9094 --75.9016 --75.8875 --75.8984 --75.8922 --75.8891 --75.8875 --75.8812 --75.8938 --75.8906 --75.8922 --75.8906 --75.8906 --75.8812 --75.8953 --75.8969 --75.8969 --75.8828 --75.9031 --75.9016 --75.9 --75.8953 --75.8969 --75.8969 --75.8938 --75.8922 --75.8938 --75.8953 --75.8875 --75.8984 --75.9016 --75.8953 --75.9062 --75.8906 --75.8875 --75.8922 --75.8812 --75.9016 --75.8938 --75.8969 --75.9031 --75.9047 --75.8984 --75.8953 --75.9062 --75.9109 --75.8953 --75.9031 --75.8984 --75.9 --75.9 --75.9078 --75.9109 --75.9016 --75.9094 --75.8984 --75.9094 --75.8938 --75.8984 --75.9062 --75.9047 --75.9062 --75.9047 --75.9078 --75.9016 --75.9219 --75.9094 --75.9094 --75.9062 --75.9016 --75.9062 --75.9156 --75.8938 --75.9094 --75.8984 --75.9109 --75.8891 --75.9125 --75.9141 --75.9062 --75.9187 --75.9109 --75.9 --75.9094 --75.9016 --75.8969 --75.9047 --75.8812 --75.9078 --75.9016 --75.9094 --75.9031 --75.9047 --75.9109 --75.9234 --75.9141 --75.9078 --75.9109 --75.9062 --75.9156 --75.8984 --75.925 --75.9156 --75.9031 --75.9187 --75.9078 --75.9047 --75.9156 --75.9141 --75.9187 --75.9078 --75.9 --75.9141 --75.9094 --75.9016 --75.9125 --75.8969 --75.9047 --75.9109 --75.9062 --75.8938 --75.9047 --75.8969 --75.9078 --75.9047 --75.9078 --75.9219 --75.9234 --75.9125 --75.9078 --75.9109 --75.9125 --75.9281 --75.9094 --75.9094 --75.9187 --75.9 --75.9016 --75.9031 --75.9141 --75.9094 --75.8969 --75.9078 --75.8969 --75.9047 --75.8969 --75.9016 --75.9047 --75.9156 --75.9172 --75.9031 --75.8922 --75.8875 --75.8922 --75.9078 --75.9016 --75.9 --75.9 --75.9062 --75.9 --75.9125 --75.9109 --75.9016 --75.9125 --75.9078 --75.9109 --75.9109 --75.9031 --75.8953 --75.9062 --75.9125 --75.9047 --75.9172 --75.9172 --75.9141 --75.8906 --75.9125 --75.925 --75.9078 --75.9016 --75.9156 --75.9125 --75.9078 --75.9172 --75.9047 --75.9219 --75.9172 --75.8938 --75.9172 --75.9016 --75.9016 --75.9062 --75.9203 --75.9156 --75.9172 --75.9172 --75.9094 --75.9109 --75.9031 --75.8953 --75.9187 --75.8891 --75.9125 --75.9109 --75.9078 --75.9031 --75.9078 --75.9062 --75.9047 --75.9078 --75.8938 --75.8938 --75.8906 --75.8875 --75.8938 --75.9062 --75.9 --75.9094 --75.9031 --75.8969 --75.9031 --75.9172 --75.9047 --75.8969 --75.9141 --75.9094 --75.9109 --75.9047 --75.9109 --75.9172 --75.9078 --75.9062 --75.9 --75.9016 --75.9031 --75.9172 --75.9 --75.8891 --75.8906 --75.8938 --75.8984 --75.9016 --75.9156 --75.8953 --75.8953 --75.9094 --75.9 --75.9 --75.9094 --75.9141 --75.9094 --75.8922 --75.8984 --75.8938 --75.9078 --75.9031 --75.9109 --75.8922 --75.9031 --75.9031 --75.8906 --75.9109 --75.9047 --75.8969 --75.9031 --75.8969 --75.9016 --75.9172 --75.9031 --75.9094 --75.8969 --75.8984 --75.8953 --75.9219 --75.9094 --75.9062 --75.9094 --75.9031 --75.9 --75.8891 --75.8953 --75.9 --75.9047 --75.8984 --75.8938 --75.9109 --75.8875 --75.8828 --75.9078 --75.8938 --75.8891 --75.8953 --75.8906 --75.9094 --75.9047 --75.9016 --75.9031 --75.8969 --75.8938 --75.9062 --75.9031 --75.9109 --75.9031 --75.9094 --75.9078 --75.9078 --75.8875 --75.9062 --75.9047 --75.9125 --75.8906 --75.9062 --75.9094 --75.9016 --75.8969 --75.9 --75.8922 --75.9031 --75.9172 --75.9 --75.8953 --75.8984 --75.8938 --75.9047 --75.9031 --75.9 --75.9094 --75.9062 --75.8875 --75.9125 --75.8938 --75.9094 --75.9078 --75.9016 --75.8984 --75.8875 --75.8984 --75.8984 --75.9047 --75.8953 --75.9 --75.9109 --75.8969 --75.9109 --75.8969 --75.8891 --75.9094 --75.8797 --75.8891 --75.8844 --75.9016 --75.8953 --75.8953 --75.9047 --75.8875 --75.8812 --75.8938 --75.8766 --75.8781 --75.8859 --75.8688 --75.8781 --75.875 --75.8875 --75.9031 --75.8844 --75.8812 --75.8875 --75.8906 --75.8844 --75.8938 --75.8875 --75.8875 --75.8859 --75.9062 --75.8781 --75.8844 --75.8906 --75.8812 --75.9062 --75.8828 --75.8922 --75.8797 --75.8969 --75.9078 --75.9016 --75.9031 --75.8938 --75.9109 --75.8828 --75.8969 --75.9031 --75.9125 --75.9031 --75.8922 --75.9031 --75.8938 --75.8859 --75.9109 --75.9078 --75.9031 --75.8938 --75.9016 --75.9 --75.9 --75.8734 --75.8906 --75.9062 --75.9031 --75.8797 --75.9094 --75.9016 --75.8844 --75.8875 --75.8938 --75.8875 --75.8969 --75.8938 --75.8906 --75.8906 --75.8922 --75.9031 --75.9047 --75.8938 --75.8969 --75.9 --75.8922 --75.9047 --75.8938 --75.9078 --75.9078 --75.8969 --75.8875 --75.9078 --75.8828 --75.8969 --75.9156 --75.8953 --75.9109 --75.9109 --75.8938 --75.8875 --75.9078 --75.9031 --75.8953 --75.9031 --75.8828 --75.9156 --75.9094 --75.9 --75.9109 --75.8984 --75.8938 --75.9062 --75.9094 --75.8906 --75.9078 --75.9125 --75.9031 --75.9 --75.9109 --75.9125 --75.9109 --75.9062 --75.9016 --75.9 --75.9203 --75.9187 --75.8984 --75.9125 --75.8969 --75.8938 --75.9016 --75.9219 --75.9031 --75.9219 --75.9156 --75.9172 --75.9031 --75.9031 --75.9156 --75.9094 --75.8984 --75.9016 --75.8953 --75.9047 --75.8906 --75.9156 --75.9109 --75.9031 --75.9062 --75.9 --75.9047 --75.9016 --75.9078 --75.9109 --75.8969 --75.9078 --75.9016 --75.9062 --75.9047 --75.8922 --75.8922 --75.9141 --75.9109 --75.8891 --75.8891 --75.8938 --75.9094 --75.9047 --75.8922 --75.8953 --75.9 --75.8984 --75.9031 --75.9234 --75.8969 --75.9031 --75.9078 --75.8922 --75.9 --75.9078 --75.9 --75.8984 --75.8922 --75.9047 --75.8969 --75.8984 --75.8969 --75.9031 --75.9062 --75.9141 --75.8969 --75.8953 --75.9031 --75.9031 --75.9047 --75.8984 --75.9047 --75.8922 --75.9016 --75.9125 --75.9 --75.9016 --75.8922 --75.9016 --75.9031 --75.9 --75.9047 --75.9078 --75.9078 --75.9 --75.9 --75.9203 --75.9 --75.9 --75.9078 --75.9172 --75.8969 --75.9047 --75.8906 --75.9156 --75.9 --75.9016 --75.9078 --75.9047 --75.8922 --75.9016 --75.9109 --75.9047 --75.9062 --75.9094 --75.9 --75.8969 --75.9078 --75.9047 --75.9031 --75.9094 --75.9078 --75.9125 --75.9125 --75.9078 --75.9203 --75.9125 --75.9234 --75.9172 --75.925 --75.9125 --75.9156 --75.9 --75.9219 --75.9156 --75.9156 --75.9156 --75.9203 --75.9328 --75.9219 --75.9031 --75.9172 --75.9203 --75.9219 --75.9016 --75.9141 --75.9078 --75.925 --75.9047 --75.9172 --75.9172 --75.9266 --75.9125 --75.9047 --75.9172 --75.9156 --75.9172 --75.9047 --75.9172 --75.9031 --75.9016 --75.9141 --75.9203 --75.9109 --75.8875 --75.9062 --75.9297 --75.9125 --75.9156 --75.9141 --75.9172 --75.9078 --75.9062 --75.9156 --75.9141 --75.9125 --75.9016 --75.9047 --75.9156 --75.9109 --75.8906 --75.9078 --75.9141 --75.9016 --75.9141 --75.9016 --75.9094 --75.9078 --75.9062 --75.8953 --75.9187 --75.8984 --75.9031 --75.9156 --75.9172 --75.9109 --75.9094 --75.9047 --75.9109 --75.9109 --75.9047 --75.9109 --75.9094 --75.8984 --75.9109 --75.9125 --75.9094 --75.9234 --75.9094 --75.9109 --75.9062 --75.9078 --75.9078 --75.9141 --75.9156 --75.9156 --75.8984 --75.9156 --75.9031 --75.9234 --75.9187 --75.8922 --75.9078 --75.9109 --75.8969 --75.8953 --75.9062 --75.9156 --75.9016 --75.8891 --75.9078 --75.9062 --75.9187 --75.9141 --75.8969 --75.8953 --75.9031 --75.9016 --75.9187 --75.9062 --75.9109 --75.9062 --75.9266 --75.9234 --75.9016 --75.9234 --75.9266 --75.9 --75.9062 --75.9141 --75.925 --75.8984 --75.9266 --75.9156 --75.9219 --75.9172 --75.9203 --75.9141 --75.9078 --75.9062 --75.9109 --75.9109 --75.9141 --75.9125 --75.9234 --75.9219 --75.925 --75.9219 --75.9156 --75.9125 --75.9062 --75.9062 --75.9266 --75.9109 --75.9 --75.9078 --75.9109 --75.9016 --75.9141 --75.9156 --75.9156 --75.8953 --75.8984 --75.8953 --75.8844 --75.8953 --75.8891 --75.9109 --75.9062 --75.8922 --75.9016 --75.9125 --75.9125 --75.9172 --75.9094 --75.925 --75.9109 --75.9094 --75.9141 --75.9016 --75.9047 --75.9031 --75.9016 --75.9203 --75.9094 --75.9141 --75.9094 --75.9156 --75.9203 --75.9062 --75.9016 --75.9078 --75.9047 --75.9125 --75.9172 --75.9141 --75.9031 --75.9078 --75.9172 --75.9156 --75.9094 --75.925 --75.9016 --75.9156 --75.9172 --75.9156 --75.9313 --75.9047 --75.925 --75.9109 --75.9094 --75.9172 --75.9234 --75.9234 --75.9156 --75.9141 --75.9234 --75.9281 --75.9109 --75.9375 --75.9141 --75.9219 --75.9234 --75.9172 --75.9172 --75.9234 --75.9359 --75.925 --75.9313 --75.9391 --75.9187 --75.9172 --75.9266 --75.9219 --75.9031 --75.9281 --75.9219 --75.9109 --75.9109 --75.9187 --75.9297 --75.9219 --75.925 --75.9203 --75.9203 --75.9219 --75.9203 --75.9047 --75.9125 --75.9187 --75.9328 --75.9266 --75.9313 --75.9203 --75.9016 --75.9172 --75.9109 --75.9094 --75.9 --75.9062 --75.9234 --75.9234 --75.9062 --75.9125 --75.9203 --75.9219 --75.9281 --75.9328 --75.9266 --75.9172 --75.9297 --75.9203 --75.9359 --75.9187 --75.9266 --75.9375 --75.9328 --75.9375 --75.9266 --75.925 --75.9141 --75.9219 --75.925 --75.9281 --75.9281 --75.9203 --75.9203 --75.9313 --75.9234 --75.9109 --75.9109 --75.9203 --75.9125 --75.9281 --75.9219 --75.9203 --75.9078 --75.9109 --75.9187 --75.9187 --75.9125 --75.925 --75.9203 --75.9328 --75.9297 --75.9328 --75.9344 --75.9172 --75.9219 --75.9219 --75.9203 --75.9281 --75.9172 --75.9266 --75.9234 --75.925 --75.9172 --75.9187 --75.9234 --75.9234 --75.9297 --75.9109 --75.9375 --75.9234 --75.9281 --75.925 --75.9344 --75.9203 --75.9109 --75.9187 --75.9187 --75.9234 --75.9172 --75.9125 --75.9297 --75.9156 --75.925 --75.9313 --75.9141 --75.95 --75.9219 --75.925 --75.9297 --75.9203 --75.9422 --75.9203 --75.9203 --75.9281 --75.925 --75.925 --75.9437 --75.9406 --75.9313 --75.925 --75.925 --75.9359 --75.9359 --75.9328 --75.9234 --75.9141 --75.9187 --75.9297 --75.9219 --75.9219 --75.9156 --75.9219 --75.9156 --75.9172 --75.9266 --75.9281 --75.9234 --75.9125 --75.9234 --75.9234 --75.9125 --75.9109 --75.9281 --75.9375 --75.925 --75.9281 --75.925 --75.9313 --75.9406 --75.9437 --75.925 --75.9094 --75.9187 --75.9359 --75.9234 --75.9344 --75.9281 --75.9406 --75.9375 --75.9281 --75.925 --75.9203 --75.9062 --75.9344 --75.9313 --75.9266 --75.9266 --75.9172 --75.9125 --75.9375 --75.925 --75.9234 --75.9281 --75.9281 --75.9203 --75.9328 --75.925 --75.9281 --75.9328 --75.9328 --75.9344 --75.9375 --75.9359 --75.9328 --75.9391 --75.9313 --75.9359 --75.9359 --75.9406 --75.9281 --75.9547 --75.9219 --75.9266 --75.9328 --75.9437 --75.9344 --75.9453 --75.9313 --75.9328 --75.9281 --75.9234 --75.9406 --75.9187 --75.9125 --75.9406 --75.9391 --75.9203 --75.9297 --75.9313 --75.9297 --75.9313 --75.9344 --75.9344 --75.9344 --75.9297 --75.9297 --75.9281 --75.9266 --75.9344 --75.9406 --75.9313 --75.9359 --75.9156 --75.9266 --75.9313 --75.9344 --75.9453 --75.9375 --75.9406 --75.9344 --75.9391 --75.9281 --75.9328 --75.9281 --75.9187 --75.9313 --75.9375 --75.9359 --75.9375 --75.9328 --75.9266 --75.9266 --75.9328 --75.9391 --75.9391 --75.925 --75.9359 --75.925 --75.9391 --75.9391 --75.9187 --75.9437 --75.9375 --75.925 --75.9281 --75.9297 --75.9313 --75.9328 --75.9359 --75.9281 --75.9266 --75.9406 --75.9344 --75.9437 --75.9437 --75.9328 --75.9297 --75.9281 --75.9469 --75.9484 --75.9375 --75.9391 --75.9484 --75.9422 --75.9406 --75.9437 --75.9453 --75.9453 --75.95 --75.9437 --75.9391 --75.9453 --75.9406 --75.9266 --75.9422 --75.9422 --75.9406 --75.9453 --75.9406 --75.95 --75.95 --75.9375 --75.9406 --75.9422 --75.9484 --75.9453 --75.9406 --75.9437 --75.9391 --75.9359 --75.9484 --75.9391 --75.9391 --75.9406 --75.9297 --75.9359 --75.9531 --75.9469 --75.9344 --75.9359 --75.9563 --75.9422 --75.9531 --75.9422 --75.9453 --75.9531 --75.95 --75.9422 --75.9469 --75.9313 --75.925 --75.9328 --75.9516 --75.925 --75.925 --75.9531 --75.9391 --75.9375 --75.9281 --75.9344 --75.9281 --75.9453 --75.9391 --75.9453 --75.9219 --75.9328 --75.9344 --75.9328 --75.9313 --75.9266 --75.9078 --75.9359 --75.9234 --75.9234 --75.9297 --75.9406 --75.9328 --75.9391 --75.9266 --75.9266 --75.9359 --75.9359 --75.9437 --75.9187 --75.9328 --75.9453 --75.9203 --75.9375 --75.9422 --75.9344 --75.9328 --75.9297 --75.9281 --75.9313 --75.9375 --75.9328 --75.9391 --75.9422 --75.9219 --75.9359 --75.9281 --75.9156 --75.9234 --75.9266 --75.9234 --75.9328 --75.9313 --75.9266 --75.9266 --75.9172 --75.9375 --75.9313 --75.9375 --75.9313 --75.9266 --75.9453 --75.9328 --75.9313 --75.9281 --75.925 --75.9406 --75.9391 --75.9391 --75.9281 --75.9375 --75.9313 --75.9437 --75.9281 --75.9359 --75.9297 --75.9375 --75.9391 --75.9266 --75.9375 --75.9391 --75.9391 --75.9406 --75.9313 --75.9375 --75.9375 --75.9375 --75.9344 --75.9344 --75.9406 --75.9453 --75.9547 --75.9406 --75.9469 --75.9484 --75.9422 --75.9453 --75.9484 --75.9484 --75.9516 --75.9313 --75.95 --75.9391 --75.9422 --75.9453 --75.9375 --75.9391 --75.9484 --75.95 --75.9437 --75.9531 --75.9453 --75.9359 --75.95 --75.9406 --75.9422 --75.9609 --75.9609 --75.9437 --75.9453 --75.9391 --75.9266 --75.9359 --75.9422 --75.9484 --75.9328 --75.95 --75.9625 --75.9406 --75.95 --75.95 --75.9422 --75.9531 --75.9406 --75.9453 --75.9469 --75.9422 --75.95 --75.9484 --75.9453 --75.9422 --75.9391 --75.9484 --75.9563 --75.9563 --75.9609 --75.9547 --75.9344 --75.9469 --75.9359 --75.9453 --75.9344 --75.9437 --75.9391 --75.9563 --75.9437 --75.9469 --75.9437 --75.9406 --75.9375 --75.9563 --75.9453 --75.9437 --75.9422 --75.9437 --75.9406 --75.9391 --75.9484 --75.9484 --75.9484 --75.9391 --75.9547 --75.9531 --75.95 --75.9422 --75.9453 --75.9437 --75.9453 --75.9469 --75.9484 --75.9453 --75.9437 --75.9297 --75.9375 --75.9391 --75.9516 --75.9422 --75.9375 --75.95 --75.9516 --75.9422 --75.9453 --75.9422 --75.9359 --75.9328 --75.9297 --75.9578 --75.9484 --75.9406 --75.9344 --75.9484 --75.9422 --75.9391 --75.9406 --75.9469 --75.9484 --75.9391 --75.9344 --75.9375 --75.9391 --75.9328 --75.9375 --75.9344 --75.9453 --75.95 --75.9375 --75.9516 --75.9344 --75.9406 --75.925 --75.9313 --75.9219 --75.9313 --75.9391 --75.9266 --75.925 --75.9391 --75.9297 --75.9297 --75.9328 --75.9391 --75.9422 --75.9297 --75.9297 --75.9484 --75.9375 --75.9406 --75.9437 --75.9359 --75.925 --75.9391 --75.9266 --75.9344 --75.9234 --75.9313 --75.9266 --75.9328 --75.9328 --75.9266 --75.9391 --75.925 --75.9391 --75.9266 --75.9406 --75.9375 --75.9328 --75.9359 --75.9406 --75.9266 --75.9391 --75.9391 --75.9359 --75.925 --75.9344 --75.9234 --75.925 --75.9422 --75.9484 --75.9297 --75.9281 --75.9328 --75.9391 --75.9391 --75.9406 --75.9422 --75.9437 --75.9375 --75.9437 --75.9344 --75.95 --75.9406 --75.9484 --75.9203 --75.9453 --75.9359 --75.9359 --75.9234 --75.9234 --75.9328 --75.9281 --75.9375 --75.9266 --75.9344 --75.9297 --75.9453 --75.9375 --75.9313 --75.9391 --75.9281 --75.9375 --75.9375 --75.9297 --75.95 --75.9359 --75.9437 --75.9422 --75.9437 --75.9344 --75.9234 --75.9453 --75.9406 --75.9422 --75.9437 --75.9297 --75.9375 --75.9281 --75.9281 --75.9422 --75.9203 --75.9313 --75.9406 --75.9344 --75.9359 --75.9437 --75.9266 --75.9297 --75.9281 --75.9359 --75.9328 --75.9203 --75.9328 --75.9406 --75.9266 --75.9266 --75.9422 --75.925 --75.9437 --75.9406 --75.9297 --75.9328 --75.9359 --75.9281 --75.9391 --75.9406 --75.9297 --75.9469 --75.9453 --75.9422 --75.9344 --75.9344 --75.9234 --75.9344 --75.9234 --75.9313 --75.9344 --75.9328 --75.9391 --75.9453 --75.9375 --75.9406 --75.9391 --75.9375 --75.9422 --75.9453 --75.9406 --75.95 --75.9547 --75.9422 --75.9531 --75.95 --75.9453 --75.9359 --75.9297 --75.9453 --75.9422 --75.95 --75.9469 --75.9344 --75.9391 --75.9422 --75.9406 --75.9406 --75.9422 --75.9344 --75.9359 --75.9125 --75.9391 --75.9344 --75.9359 --75.9484 --75.9328 --75.9266 --75.9406 --75.9547 --75.9375 --75.9469 --75.9516 --75.9422 --75.9422 --75.9406 --75.9484 --75.9313 --75.9594 --75.9391 --75.9422 --75.9437 --75.9437 --75.9422 --75.95 --75.9406 --75.9391 --75.9437 --75.9422 --75.95 --75.9469 --75.9359 --75.9422 --75.9375 --75.9469 --75.9563 --75.9391 --75.9484 --75.9313 --75.9313 --75.9406 --75.9469 --75.9375 --75.9359 --75.9203 --75.9375 --75.9375 --75.9406 --75.9406 --75.9453 --75.9437 --75.9422 --75.9437 --75.9406 --75.9516 --75.9375 --75.95 --75.9437 --75.9484 --75.9469 --75.9422 --75.9516 --75.9406 --75.9391 --75.9359 --75.95 --75.9422 --75.9375 --75.9453 --75.9328 --75.9359 --75.9359 --75.925 --75.9484 --75.9375 --75.9375 --75.9359 --75.9344 --75.9422 --75.9313 --75.9469 --75.9625 --75.9328 --75.9516 --75.9406 --75.9531 --75.9484 --75.9484 --75.9422 --75.9578 --75.95 --75.9422 --75.9453 --75.95 --75.9344 --75.9484 --75.9359 --75.9406 --75.9344 --75.9375 --75.9281 --75.9563 --75.9516 --75.9406 --75.9484 --75.9406 --75.9422 --75.9437 --75.9484 --75.9484 --75.9406 --75.9453 --75.9484 --75.9453 --75.9469 --75.9469 --75.9422 --75.9437 --75.9344 --75.9594 --75.9281 --75.9391 --75.9531 --75.9406 --75.9422 --75.9422 --75.9453 --75.9359 --75.9406 --75.9563 --75.9203 --75.9406 --75.9437 --75.9266 --75.9344 --75.9406 --75.9453 --75.9344 --75.9297 --75.9469 --75.9531 --75.9484 --75.9484 --75.9391 --75.9547 --75.9453 --75.9359 --75.9516 --75.9437 --75.9297 --75.95 --75.9484 --75.9328 --75.9531 --75.9437 --75.9266 --75.9469 --75.9406 --75.95 --75.9344 --75.9359 --75.9297 --75.9344 --75.9344 --75.9234 --75.9406 --75.9359 --75.9359 --75.9297 --75.9297 --75.9375 --75.9375 --75.9344 --75.9141 --75.9266 --75.9313 --75.9375 --75.9375 --75.9516 --75.9281 --75.9344 --75.9469 --75.9297 --75.9375 --75.9266 --75.9437 --75.9484 --75.9328 --75.9422 --75.9406 --75.9469 --75.9328 --75.9328 --75.9313 --75.9516 --75.95 --75.9437 --75.9437 --75.9531 --75.9531 --75.9453 --75.9594 --75.9422 --75.9281 --75.925 --75.9422 --75.9547 --75.9437 --75.9344 --75.9437 --75.95 --75.9531 --75.9484 --75.9359 --75.9391 --75.9422 --75.9469 --75.9578 --75.9516 --75.9578 --75.9406 --75.9469 --75.9531 --75.9406 --75.9375 --75.9391 --75.9406 --75.9281 --75.9469 --75.9422 --75.9625 --75.9344 --75.9375 --75.9375 --75.9328 --75.9359 --75.9297 --75.9453 --75.9484 --75.95 --75.9422 --75.9375 --75.9406 --75.9422 --75.95 --75.95 --75.9391 --75.9406 --75.9406 --75.9281 --75.9609 --75.9313 --75.9313 --75.9453 --75.9563 --75.9391 --75.9406 --75.9453 --75.9484 --75.9406 --75.9453 --75.9516 --75.95 --75.9391 --75.9391 --75.95 --75.9391 --75.9437 --75.9578 --75.9578 --75.95 --75.9422 --75.9594 --75.95 --75.95 --75.9406 --75.9484 --75.9547 --75.9391 --75.9469 --75.9484 --75.9453 --75.95 --75.9359 --75.9453 --75.9453 --75.9266 --75.9375 --75.9297 --75.9406 --75.9328 --75.9281 --75.9344 --75.9391 --75.9344 --75.9422 --75.9375 --75.9375 --75.9297 --75.9563 --75.9422 --75.9469 --75.9313 --75.9453 --75.9437 --75.9656 --75.9609 --75.95 --75.9578 --75.9391 --75.9484 --75.925 --75.9437 --75.9469 --75.9422 --75.9375 --75.9203 --75.9391 --75.9375 --75.9281 --75.9313 --75.9375 --75.9547 --75.9594 --75.9375 --75.9453 --75.9406 --75.9422 --75.9234 --75.9391 --75.9359 --75.9422 --75.9422 --75.9328 --75.9359 --75.9437 --75.9391 --75.9328 --75.9391 --75.9234 --75.9344 --75.9422 --75.9359 --75.925 --75.9313 --75.9391 --75.925 --75.9313 --75.9375 --75.9422 --75.9453 --75.9422 --75.9406 --75.9516 --75.9484 --75.9359 --75.9484 --75.9375 --75.9281 --75.9437 --75.9219 --75.95 --75.9422 --75.95 --75.9437 --75.9297 --75.9516 --75.9344 --75.9391 --75.9266 --75.9422 --75.9359 --75.9469 --75.9516 --75.9391 --75.95 --75.9359 --75.9469 --75.9469 --75.9516 --75.9359 --75.9344 --75.9469 --75.9406 --75.9391 --75.9422 --75.9375 --75.9406 --75.9547 --75.9406 --75.9359 --75.9531 --75.9328 --75.9391 --75.95 --75.9437 --75.9453 --75.9453 --75.9344 --75.9516 --75.9422 --75.9281 --75.9359 --75.9453 --75.9578 --75.9344 --75.9391 --75.9375 --75.9406 --75.9469 --75.9437 --75.9391 --75.9406 --75.9266 --75.9391 --75.9297 --75.9313 --75.9453 --75.9375 --75.9437 --75.9375 --75.9281 --75.9469 --75.9437 --75.95 --75.9469 --75.9453 --75.9437 --75.9453 --75.9422 --75.9437 --75.9219 --75.9359 --75.9391 --75.9547 --75.9453 --75.9453 --75.9516 --75.9453 --75.9422 --75.9422 --75.9531 --75.9531 --75.9609 --75.9625 --75.9328 --75.9453 --75.9375 --75.9531 --75.9469 --75.9422 --75.9531 --75.9422 --75.9609 --75.9328 --75.9469 --75.9406 --75.9359 --75.95 --75.9547 --75.9453 --75.9359 --75.9297 --75.9422 --75.95 --75.9484 --75.9453 --75.9469 --75.9594 --75.95 --75.9516 --75.9563 --75.9547 --75.9578 --75.9563 --75.9547 --75.95 --75.9656 --75.9531 --75.9516 --75.9563 --75.95 --75.9422 --75.95 --75.9375 --75.9594 --75.9594 --75.9391 --75.95 --75.9484 --75.95 --75.9578 --75.9484 --75.9453 --75.9406 --75.9516 --75.9406 --75.95 --75.95 --75.9453 --75.9547 --75.9469 --75.9594 --75.9516 --75.9563 --75.9547 --75.9516 --75.9469 --75.9469 --75.9547 --75.9484 --75.9516 --75.9469 --75.9547 --75.9328 --75.9328 --75.9406 --75.9484 --75.9578 --75.9531 --75.9547 --75.9594 --75.9469 --75.9437 --75.9359 --75.9437 --75.9391 --75.9359 --75.9328 --75.9313 --75.9375 --75.9375 --75.9359 --75.9437 --75.9234 --75.9484 --75.9422 --75.9297 --75.9375 --75.9219 --75.9469 --75.9375 --75.9391 --75.9469 --75.9391 --75.9266 --75.9344 --75.9406 --75.9281 --75.9391 --75.9453 --75.9406 --75.95 --75.9406 --75.9437 --75.9531 --75.9469 --75.9344 --75.9453 --75.9375 --75.9422 --75.9453 --75.9391 --75.9375 --75.925 --75.9437 --75.9141 --75.9375 --75.9313 --75.9234 --75.9313 --75.9281 --75.9391 --75.9297 --75.9234 --75.9437 --75.9391 --75.9406 --75.9406 --75.9234 --75.9391 --75.9469 --75.9469 --75.9406 --75.9422 --75.9344 --75.9359 --75.95 --75.9437 --75.9437 --75.9516 --75.9484 --75.9375 --75.9484 --75.9469 --75.9422 --75.95 --75.9578 --75.9547 --75.9469 --75.9563 --75.9375 --75.9563 --75.9391 --75.9625 --75.9453 --75.9297 --75.9344 --75.9516 --75.9453 --75.9578 --75.9375 --75.9484 --75.9391 --75.9406 --75.9406 --75.9484 --75.9484 --75.9437 --75.9359 --75.9422 --75.9437 --75.95 --75.9469 --75.9359 --75.9328 --75.9406 --75.9469 --75.9375 --75.9391 --75.9437 --75.9516 --75.9406 --75.9391 --75.9453 --75.95 --75.9531 --75.9484 --75.9391 --75.9484 --75.9578 --75.9328 --75.9406 --75.9359 --75.9313 --75.9531 --75.9453 --75.9516 --75.9297 --75.9375 --75.95 --75.9406 --75.9453 --75.9453 --75.95 --75.9437 --75.9453 --75.95 --75.9453 --75.95 --75.9484 --75.9406 --75.9406 --75.9484 --75.9391 --75.9359 --75.9359 --75.9406 --75.9469 --75.9563 --75.9578 --75.9469 --75.9469 --75.9531 --75.9422 --75.9437 --75.9391 --75.9406 --75.9391 --75.9422 --75.9359 --75.9469 --75.9531 --75.9563 --75.9328 --75.9453 --75.9375 --75.9531 --75.9328 --75.9375 --75.9406 --75.9469 --75.9469 --75.9375 --75.9406 --75.9422 --75.9547 --75.9375 --75.9437 --75.9469 --75.9391 --75.9563 --75.9391 --75.9531 --75.9437 --75.9469 --75.9391 --75.9453 --75.9609 --75.9609 --75.9594 --75.95 --75.9359 --75.9406 --75.9469 --75.9484 --75.9484 --75.9406 --75.9453 --75.9516 --75.9453 --75.9469 --75.9469 --75.9578 --75.9625 --75.9469 --75.9672 --75.9656 --75.9609 --75.9594 --75.9437 --75.9641 --75.9469 --75.9484 --75.9531 --75.9469 --75.9719 --75.9609 --75.9578 --75.95 --75.9609 --75.9531 --75.9437 --75.9563 --75.975 --75.9563 --75.9578 --75.9594 --75.9625 --75.9531 --75.9688 --75.9641 --75.9656 --75.9594 --75.9641 --75.9563 --75.9688 --75.9563 --75.975 --75.9625 --75.9531 --75.9516 --75.9672 --75.9781 --75.9563 --75.9422 --75.9547 --75.9719 --75.9656 --75.95 --75.9547 --75.9656 --75.9641 --75.9563 --75.9656 --75.9641 --75.9563 --75.9531 --75.975 --75.9594 --75.9688 --75.95 --75.9641 --75.9609 --75.9437 --75.9703 --75.95 --75.9641 --75.9547 --75.9469 --75.9406 --75.9641 --75.9563 --75.9516 --75.9578 --75.9531 --75.9531 --75.9406 --75.95 --75.9641 --75.9437 --75.9547 --75.9672 --75.9672 --75.9688 --75.9688 --75.9656 --75.9594 --75.9703 --75.9609 --75.9594 --75.9578 --75.9609 --75.9531 --75.9703 --75.9672 --75.9641 --75.9578 --75.9609 --75.9641 --75.9547 --75.9609 --75.9563 --75.9719 --75.9609 --75.9625 --75.9688 --75.9656 --75.9672 --75.9641 --75.9672 --75.9531 --75.9703 --75.9563 --75.9594 --75.9688 --75.9563 --75.9609 --75.9609 --75.9703 --75.9391 --75.9563 --75.9484 --75.9437 --75.9594 --75.9703 --75.9516 --75.9609 --75.9656 --75.9563 --75.9531 --75.9563 --75.9625 --75.9688 --75.9797 --75.9563 --75.9641 --75.9547 --75.9656 --75.9531 --75.9656 --75.95 --75.9531 --75.9656 --75.9656 --75.9563 --75.9547 --75.9641 --75.9594 --75.9656 --75.9594 --75.9609 --75.9688 --75.9703 --75.9531 --75.9391 --75.9563 --75.9703 --75.9594 --75.9734 --75.9641 --75.9688 --75.9672 --75.9734 --75.9766 --75.9703 --75.9578 --75.9609 --75.9594 --75.9688 --75.9609 --75.9625 --75.9531 --75.9547 --75.9656 --75.9734 --75.9797 --75.9688 --75.9688 --75.9563 --75.9766 --75.9656 --75.9453 --75.9672 --75.9641 --75.9672 --75.9656 --75.9656 --75.9594 --75.9719 --75.9734 --75.9656 --75.9703 --75.9719 --75.9516 --75.9531 --75.9563 --75.9563 --75.9672 --75.9484 --75.9688 --75.9641 --75.9516 --75.9422 --75.9547 --75.9594 --75.95 --75.9609 --75.9359 --75.9531 --75.9453 --75.9547 --75.95 --75.9578 --75.9516 --75.9547 --75.9547 --75.9484 --75.9641 --75.9578 --75.9547 --75.9516 --75.9531 --75.9641 --75.9609 --75.9375 --75.9547 --75.9469 --75.9672 --75.9484 --75.9547 --75.9422 --75.9375 --75.9437 --75.9563 --75.9594 --75.9469 --75.9406 --75.9563 --75.9437 --75.9641 --75.9672 --75.9656 --75.9625 --75.9719 --75.9453 --75.9578 --75.9469 --75.9563 --75.9469 --75.9484 --75.9547 --75.9453 --75.9594 --75.9469 --75.9437 --75.9625 --75.9359 --75.9516 --75.9594 --75.9484 --75.95 --75.9547 --75.95 --75.9641 --75.9594 --75.9516 --75.9469 --75.9484 --75.9547 --75.9469 --75.9563 --75.9625 --75.9391 --75.9547 --75.95 --75.9437 --75.9453 --75.9375 --75.9563 --75.9563 --75.9547 --75.9563 --75.9594 --75.95 --75.9656 --75.9547 --75.9609 --75.9578 --75.9672 --75.9516 --75.9609 --75.9547 --75.9547 --75.9656 --75.9625 --75.9578 --75.9563 --75.9609 --75.9688 --75.9625 --75.9641 --75.9563 --75.9437 --75.9563 --75.9625 --75.9672 --75.9578 --75.9609 --75.9656 --75.9609 --75.9516 --75.9609 --75.9656 --75.9609 --75.9734 --75.9641 --75.9688 --75.9563 --75.9531 --75.9594 --75.9609 --75.9437 --75.9688 --75.9609 --75.9563 --75.9563 --75.9391 --75.9656 --75.9484 --75.9531 --75.9594 --75.9531 --75.9734 --75.9594 --75.9531 --75.9531 --75.9594 --75.9578 --75.9594 --75.9609 --75.9531 --75.9625 --75.9594 --75.9609 --75.9594 --75.9516 --75.9672 --75.9437 --75.9609 --75.95 --75.9484 --75.9594 --75.9672 --75.9625 --75.9516 --75.9594 --75.9594 --75.9359 --75.9625 --75.9547 --75.95 --75.9609 --75.9516 --75.9578 --75.9484 --75.9578 --75.9422 --75.9594 --75.9406 --75.9391 --75.9453 --75.95 --75.9531 --75.9609 --75.9641 --75.9344 --75.9531 --75.9625 --75.9594 --75.9531 --75.9531 --75.9578 --75.9578 --75.9641 --75.9484 --75.9516 --75.9609 --75.9516 --75.9672 --75.9703 --75.9547 --75.9625 --75.9547 --75.9594 --75.9453 --75.9422 --75.9641 --75.9625 --75.9609 --75.9594 --75.9625 --75.975 --75.9609 --75.9688 --75.9531 --75.9656 --75.9453 --75.9719 --75.95 --75.9547 --75.9563 --75.9625 --75.9563 --75.95 --75.9563 --75.9484 --75.9375 --75.9656 --75.9563 --75.9609 --75.9609 --75.9531 --75.9547 --75.9703 --75.9547 --75.9531 --75.9391 --75.9563 --75.9469 --75.9484 --75.9656 --75.9578 --75.9594 --75.9563 --75.9609 --75.9609 --75.9625 --75.9531 --75.9656 --75.9625 --75.9609 --75.9609 --75.9656 --75.95 --75.9641 --75.9547 --75.9547 --75.9688 --75.975 --75.9609 --75.9609 --75.9516 --75.9563 --75.9609 --75.9656 --75.9609 --75.9578 --75.9641 --75.9734 --75.9656 --75.95 --75.9641 --75.9516 --75.9625 --75.9437 --75.9578 --75.9734 --75.9625 --75.9656 --75.9656 --75.9625 --75.9672 --75.9703 --75.9672 --75.975 --75.95 --75.9641 --75.9625 --75.9516 --75.9688 --75.9563 --75.9656 --75.9453 --75.9547 --75.9609 --75.9625 --75.9656 --75.9703 --75.9656 --75.9766 --75.9703 --75.9563 --75.9719 --75.9469 --75.9641 --75.9641 --75.9719 --75.9594 --75.9609 --75.9656 --75.9547 --75.9516 --75.9609 --75.9578 --75.9656 --75.9547 --75.9547 --75.95 --75.9594 --75.9672 --75.9484 --75.9578 --75.9625 --75.9719 --75.9563 --75.9516 --75.9531 --75.9578 --75.9688 --75.9391 --75.9437 --75.9563 --75.9594 --75.9484 --75.9531 --75.9375 --75.9547 --75.9469 --75.9656 --75.9516 --75.9594 --75.9516 --75.9484 --75.95 --75.9422 --75.9516 --75.9578 --75.9516 --75.9719 --75.9625 --75.9609 --75.9656 --75.9672 --75.9609 --75.9641 --75.9563 --75.9672 --75.9484 --75.9688 --75.9484 --75.95 --75.9516 --75.9453 --75.9516 --75.9531 --75.9625 --75.9516 --75.9563 --75.9625 --75.9531 --75.9578 --75.9563 --75.9547 --75.9437 --75.95 --75.95 --75.9609 --75.95 --75.9547 --75.9609 --75.9547 --75.9516 --75.9516 --75.9594 --75.9453 --75.9437 --75.9578 --75.9516 --75.9547 --75.9578 --75.9656 --75.9688 --75.9484 --75.9469 --75.9531 --75.9625 --75.9641 --75.9688 --75.9531 --75.9563 --75.9656 --75.9594 --75.9531 --75.9547 --75.9594 --75.9594 --75.9594 --75.975 --75.9547 --75.9547 --75.9688 --75.9594 --75.9719 --75.9609 --75.9672 --75.9609 --75.9656 --75.9531 --75.9734 --75.9703 --75.9594 --75.9469 --75.9563 --75.9484 --75.9484 --75.9641 --75.9625 --75.95 --75.9672 --75.9469 --75.9516 --75.9531 --75.9578 --75.9563 --75.9578 --75.9594 --75.95 --75.9594 --75.9688 --75.9578 --75.9672 --75.9516 --75.9531 --75.9578 --75.9641 --75.975 --75.9641 --75.9656 --75.9578 --75.9641 --75.9641 --75.9594 --75.9609 --75.9766 --75.9578 --75.9531 --75.9812 --75.9578 --75.975 --75.9703 --75.9703 --75.9609 --75.9625 --75.9609 --75.9547 --75.9781 --75.9688 --75.9688 --75.9703 --75.9734 --75.9719 --75.9781 --75.9609 --75.9688 --75.9688 --75.9547 --75.9609 --75.9563 --75.9703 --75.9672 --75.9547 --75.9828 --75.9594 --75.9625 --75.9672 --75.9531 --75.9531 --75.9734 --75.9578 --75.9594 --75.9563 --75.9609 --75.9656 --75.9453 --75.9641 --75.9719 --75.9578 --75.9719 --75.9641 --75.9641 --75.9688 --75.9641 --75.9703 --75.9703 --75.9625 --75.9656 --75.9938 --75.9609 --75.9609 --75.9766 --75.9719 --75.9688 --75.9641 --75.9859 --75.9734 --75.9719 --75.9719 --75.9719 --75.9594 --75.9781 --75.9812 --75.9766 --75.975 --75.9719 --75.9656 --75.9656 --75.975 --75.975 --75.9719 --75.9797 --75.9734 --75.9672 --75.9672 --75.9812 --75.9812 --75.9891 --75.9844 --75.9719 --75.9656 --75.9891 --75.9719 --75.975 --75.9672 --75.9672 --75.9719 --75.9609 --75.9875 --75.9859 --75.975 --75.9672 --75.9734 --75.9703 --75.9766 --75.9672 --75.9594 --75.9625 --75.9719 --75.9688 --75.9563 --75.9828 --75.9609 --75.9703 --75.9609 --75.9688 --75.9656 --75.9781 --75.9625 --75.9828 --75.9609 --75.9734 --75.9734 --75.9766 --75.9703 --75.9766 --75.9688 --75.9766 --75.9766 --75.9812 --75.9766 --75.9781 --75.9688 --75.9625 --75.9625 --75.9719 --75.9625 --75.9734 --75.9719 --75.9719 --75.975 --75.9734 --75.9672 --75.9594 --75.9563 --75.9625 --75.9828 --75.9563 --75.9609 --75.9672 --75.9563 --75.9688 --75.9656 --75.9797 --75.9672 --75.9641 --75.9766 --75.9484 --75.9656 --75.9688 --75.9828 --75.9672 --75.9719 --75.9656 --75.9891 --75.9688 --75.9656 --75.9719 --75.9594 --75.9656 --75.9703 --75.9578 --75.9719 --75.9688 --75.9641 --75.9672 --75.9656 --75.9563 --75.9719 --75.9625 --75.9656 --75.9625 --75.9656 --75.9656 --75.9641 --75.9859 --75.9672 --75.9703 --75.9781 --75.9719 --75.9688 --75.9781 --75.9734 --75.9734 --75.9812 --75.9688 --75.9516 --75.9672 --75.9672 --75.9688 --75.9766 --75.9578 --75.9703 --75.9594 --75.9625 --75.975 --75.9734 --75.9844 --75.975 --75.975 --75.9703 --75.9844 --75.9672 --75.9672 --75.9625 --75.975 --75.9781 --75.9734 --75.975 --75.9781 --75.9797 --75.9703 --75.9688 --75.9734 --75.9703 --75.9797 --75.9734 --75.9594 --75.9797 --75.9797 --75.9531 --75.975 --75.9766 --75.9734 --75.9609 --75.9703 --75.9703 --75.9609 --75.9844 --75.9609 --75.9625 --75.9641 --75.9563 --75.9641 --75.9656 --75.9594 --75.95 --75.9656 --75.9734 --75.9688 --75.9594 --75.9625 --75.9641 --75.9641 --75.9656 --75.9719 --75.9609 --75.9609 --75.9688 --75.9734 --75.9625 --75.9641 --75.9641 --75.9609 --75.9609 --75.9563 --75.9625 --75.9531 --75.9516 --75.9563 --75.9625 --75.9547 --75.9563 --75.9484 --75.9594 --75.9547 --75.9625 --75.9641 --75.9469 --75.9656 --75.95 --75.9641 --75.9766 --75.9734 --75.9672 --75.975 --75.9547 --75.9563 --75.9547 --75.9609 --75.9625 --75.9672 --75.9578 --75.9484 --75.9547 --75.9625 --75.9578 --75.9625 --75.9688 --75.9625 --75.9609 --75.9672 --75.9609 --75.9688 --75.9625 --75.9594 --75.9703 --75.9734 --75.9609 --75.9719 --75.9578 --75.9703 --75.9703 --75.9625 --75.9641 --75.9703 --75.9625 --75.9641 --75.9656 --75.9703 --75.9703 --75.9641 --75.9672 --75.9609 --75.9578 --75.9641 --75.9594 --75.9703 --75.9625 --75.9672 --75.9766 --75.9578 --75.9609 --75.9594 --75.9656 --75.9828 --75.9531 --75.9641 --75.9563 --75.95 --75.9641 --75.9703 --75.975 --75.9625 --75.9563 --75.9734 --75.975 --75.9672 --75.9703 --75.9594 --75.9609 --75.9563 --75.9594 --75.9578 --75.9578 --75.9594 --75.9594 --75.9563 --75.9547 --75.9703 --75.9656 --75.9547 --75.9688 --75.9641 --75.9688 --75.9563 --75.9703 --75.9641 --75.9594 --75.9594 --75.9672 --75.9703 --75.9688 --75.9563 --75.9563 --75.9516 --75.9625 --75.9422 --75.9516 --75.9547 --75.9609 --75.9578 --75.9578 --75.9656 --75.9734 --75.9703 --75.9719 --75.9719 --75.9625 --75.9469 --75.9594 --75.9516 --75.975 --75.9641 --75.9516 --75.9734 --75.9688 --75.975 --75.9688 --75.9609 --75.9719 --75.9641 --75.9625 --75.9734 --75.9594 --75.9641 --75.9656 --75.9625 --75.9563 --75.9484 --75.9641 --75.9641 --75.9688 --75.9734 --75.975 --75.9609 --75.9656 --75.9656 --75.9547 --75.9516 --75.9578 --75.9641 --75.9688 --75.9672 --75.9656 --75.9734 --75.9688 --75.9656 --75.9672 --75.9578 --75.9656 --75.9484 --75.9609 --75.9578 --75.9641 --75.9656 --75.9672 --75.9469 --75.9672 --75.9563 --75.9609 --75.9656 --75.9625 --75.9641 --75.9703 --75.9578 --75.9734 --75.9656 --75.9766 --75.9656 --75.9672 --75.975 --75.9594 --75.9547 --75.9516 --75.9734 --75.9688 --75.9563 --75.95 --75.9609 --75.9641 --75.9594 --75.9688 --75.9594 --75.9437 --75.9547 --75.9781 --75.9563 --75.9484 --75.9594 --75.9609 --75.9578 --75.9594 --75.9563 --75.9656 --75.9578 --75.9531 --75.9516 --75.9578 --75.9641 --75.9625 --75.9609 --75.9719 --75.9719 --75.9641 --75.9703 --75.9641 --75.9516 --75.9672 --75.9672 --75.9656 --75.9625 --75.9734 --75.9672 --75.9609 --75.9703 --75.9625 --75.9719 --75.9812 --75.9641 --75.9672 --75.9656 --75.9812 --75.9703 --75.9703 --75.9766 --75.9609 --75.9781 --75.9734 --75.975 --75.9688 --75.9766 --75.9672 --75.9766 --75.9703 --75.9734 --75.9625 --75.9688 --75.9625 --75.9672 --75.9703 --75.9563 --75.9656 --75.9563 --75.9672 --75.9781 --75.9703 --75.9625 --75.9734 --75.9625 --75.9594 --75.9672 --75.9563 --75.9688 --75.9766 --75.9672 --75.9781 --75.9781 --75.9781 --75.9797 --75.9688 --75.9688 --75.9719 --75.9766 --75.9734 --75.9641 --75.9656 --75.9656 --75.9797 --75.9594 --75.9688 --75.9625 --75.9766 --75.9688 --75.9734 --75.9656 --75.9688 --75.9688 --75.9766 --75.9672 --75.9797 --75.9703 --75.9797 --75.9547 --75.9719 --75.9672 --75.9812 --75.9688 --75.9797 --75.9703 --75.9703 --75.9891 --75.9812 --75.9484 --75.9578 --75.9734 --75.9688 --75.9547 --75.9688 --75.975 --75.9656 --75.9594 --75.975 --75.9656 --75.9625 --75.9688 --75.9703 --75.9703 --75.9766 --75.9703 --75.9656 --75.9656 --75.9875 --75.9578 --75.9641 --75.9781 --75.9672 --75.9828 --75.9703 --75.9547 --75.9578 --75.9578 --75.9594 --75.9625 --75.9594 --75.9703 --75.9609 --75.9516 --75.9625 --75.9547 --75.9453 --75.9578 --75.9609 --75.9641 --75.9781 --75.9672 --75.9672 --75.9719 --75.9547 --75.9688 --75.9625 --75.9703 --75.9609 --75.9625 --75.9625 --75.9688 --75.9641 --75.9641 --75.9719 --75.9578 --75.9578 --75.9672 --75.9703 --75.9625 --75.9719 --75.9672 --75.9719 --75.9625 --75.9656 --75.9625 --75.9563 --75.9656 --75.9703 --75.9625 --75.9688 --75.9688 --75.9563 --75.9578 --75.9453 --75.9688 --75.9609 --75.9734 --75.9656 --75.9547 --75.9422 --75.9578 --75.9531 --75.9437 --75.9656 --75.9547 --75.9547 --75.9563 --75.9547 --75.9453 --75.9672 --75.9609 --75.9672 --75.9563 --75.975 --75.9578 --75.9719 --75.9656 --75.9594 --75.9672 --75.9563 --75.9719 --75.9625 --75.9656 --75.9656 --75.9516 --75.9625 --75.9641 --75.9563 --75.9703 --75.9609 --75.9547 --75.9563 --75.9563 --75.9656 --75.95 --75.9547 --75.9391 --75.9578 --75.9641 --75.9453 --75.9703 --75.9734 --75.9516 --75.95 --75.9594 --75.9594 --75.9578 --75.9578 --75.9609 --75.9641 --75.9625 --75.9625 --75.9531 --75.9703 --75.9703 --75.9688 --75.9734 --75.9703 --75.9656 --75.975 --75.9703 --75.9641 --75.9719 --75.9578 --75.9531 --75.9656 --75.9594 --75.9641 --75.9609 --75.9641 --75.9719 --75.975 --75.9578 --75.9672 --75.9594 --75.9656 --75.9547 --75.9531 --75.9563 --75.9719 --75.9688 --75.9625 --75.9719 --75.9688 --75.9625 --75.9609 --75.9734 --75.9781 --75.9797 --75.9641 --75.9797 --75.9734 --75.9703 --75.9609 --75.9719 --75.9766 --75.9703 --75.975 --75.9703 --75.9609 --75.9672 --75.9719 --75.9625 --75.9703 --75.9641 --75.9797 --75.9719 --75.9734 --75.9656 --75.9703 --75.9672 --75.9672 --75.9641 --75.9734 --75.9609 --75.9719 --75.9672 --75.9656 --75.9625 --75.9609 --75.975 --75.9656 --75.9625 --75.9625 --75.9672 --75.9656 --75.9609 --75.9797 --75.9609 --75.9672 --75.9609 --75.9609 --75.9703 --75.9594 --75.9859 --75.9625 --75.9781 --75.9688 --75.9688 --75.9688 --75.9578 --75.9625 --75.9578 --75.9688 --75.9609 --75.9531 --75.9641 --75.9531 --75.9625 --75.9672 --75.9563 --75.9656 --75.9609 --75.9578 --75.975 --75.9641 --75.9578 --75.9547 --75.9563 --75.9484 --75.9578 --75.9578 --75.9547 --75.9516 --75.9625 --75.9688 --75.9531 --75.9672 --75.9578 --75.9703 --75.9516 --75.9625 --75.9594 --75.9516 --75.9625 --75.9563 --75.9563 --75.9641 --75.9578 --75.9469 --75.9609 --75.9469 --75.9547 --75.9578 --75.9484 --75.9547 --75.9609 --75.9547 --75.9609 --75.9594 --75.9703 --75.9625 --75.9703 --75.9609 --75.9797 --75.9547 --75.9641 --75.95 --75.9656 --75.9609 --75.9672 --75.9797 --75.9672 --75.9625 --75.9672 --75.9609 --75.9578 --75.9641 --75.9469 --75.9672 --75.9641 --75.9547 --75.9469 --75.9594 --75.975 --75.9703 --75.9547 --75.975 --75.9688 --75.9641 --75.9625 --75.9594 --75.9609 --75.9531 --75.9672 --75.9609 --75.9484 --75.9547 --75.9625 --75.9594 --75.9641 --75.9547 --75.9531 --75.9547 --75.9516 --75.9594 --75.9641 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9656 --75.9625 --75.9563 --75.9609 --75.9672 --75.9578 --75.9625 --75.9703 --75.9766 --75.9703 --75.9547 --75.9594 --75.9688 --75.9641 --75.95 --75.9766 --75.9609 --75.95 --75.9641 --75.9578 --75.9516 --75.9547 --75.9609 --75.9734 --75.9734 --75.95 --75.9609 --75.9656 --75.9672 --75.9703 --75.9703 --75.9609 --75.9641 --75.9844 --75.9594 --75.9797 --75.9734 --75.9766 --75.9734 --75.9656 --75.9719 --75.9844 --75.9656 --75.9891 --75.9859 --75.9781 --75.975 --75.9734 --75.9812 --75.9844 --75.9797 --75.9922 --75.9844 --75.9891 --75.975 --75.975 --75.9797 --75.9812 --75.9688 --75.9703 --75.9656 --75.9812 --75.9703 --75.9719 --75.9781 --75.975 --75.9844 --75.9641 --75.9688 --75.9641 --75.9547 --75.9578 --75.9688 --75.9703 --75.9703 --75.9531 --75.9688 --75.9703 --75.975 --75.9688 --75.9766 --75.9625 --75.9781 --75.9703 --75.9734 --75.9609 --75.9641 --75.9578 --75.975 --75.9719 --75.9578 --75.9719 --75.9797 --75.9656 --75.975 --75.9703 --75.9828 --75.9625 --75.9578 --75.9625 --75.9547 --75.9719 --75.9688 --75.9516 --75.9609 --75.9641 --75.9734 --75.9594 --75.9688 --75.9703 --75.9703 --75.975 --75.9828 --75.9719 --75.9609 --75.9688 --75.9672 --75.975 --75.9609 --75.9641 --75.9703 --75.9625 --75.9531 --75.9703 --75.9641 --75.9656 --75.9609 --75.9766 --75.9484 --75.9672 --75.9625 --75.9781 --75.9781 --75.9641 --75.9656 --75.975 --75.9797 --75.9688 --75.9781 --75.9656 --75.9703 --75.9578 --75.9797 --75.9625 --75.9672 --75.9594 --75.9641 --75.9703 --75.9656 --75.9719 --75.9656 --75.9781 --75.9656 --75.9734 --75.9672 --75.9594 --75.9609 --75.9781 --75.9672 --75.9797 --75.9578 --75.9828 --75.9594 --75.9672 --75.9766 --75.9688 --75.9734 --75.9688 --75.9719 --75.9625 --75.9703 --75.9641 --75.975 --75.9656 --75.9656 --75.9609 --75.9672 --75.9688 --75.9609 --75.9719 --75.9625 --75.9609 --75.9406 --75.9719 --75.9703 --75.9672 --75.9719 --75.9734 --75.9766 --75.9563 --75.9563 --75.9688 --75.9797 --75.9641 --75.9578 --75.9672 --75.9578 --75.9578 --75.9609 --75.9531 --75.9641 --75.9609 --75.9594 --75.9672 --75.9625 --75.9578 --75.9578 --75.9688 --75.9594 --75.9531 --75.9719 --75.9625 --75.9594 --75.9594 --75.9828 --75.9656 --75.9688 --75.9703 --75.9688 --75.9625 --75.9672 --75.9594 --75.9578 --75.9578 --75.9672 --75.9641 --75.9656 --75.9578 --75.9703 --75.9672 --75.9641 --75.9609 --75.95 --75.9656 --75.9594 --75.9594 --75.9656 --75.9594 --75.9719 --75.9656 --75.9703 --75.9641 --75.9781 --75.9625 --75.9797 --75.9703 --75.9641 --75.9734 --75.9781 --75.9625 --75.9672 --75.9734 --75.9734 --75.9625 --75.9688 --75.9688 --75.9703 --75.9625 --75.975 --75.9688 --75.9672 --75.9656 --75.9719 --75.9641 --75.9703 --75.9828 --75.9797 --75.9891 --75.9688 --75.9656 --75.9703 --75.9703 --75.975 --75.9859 --75.9766 --75.9688 --75.9672 --75.9672 --75.9844 --75.9828 --75.9703 --75.9703 --75.9719 --75.9812 --75.9766 --75.9625 --75.9828 --75.9812 --75.9578 --75.9688 --75.9797 --75.9656 --75.9891 --75.9703 --75.9719 --75.9781 --75.9781 --75.9719 --75.975 --75.9688 --75.9641 --75.9656 --75.9672 --75.9766 --75.95 --75.9641 --75.9484 --75.9594 --75.9609 --75.9578 --75.9625 --75.9672 --75.9563 --75.95 --75.9656 --75.9672 --75.9609 --75.9516 --75.9719 --75.9625 --75.9672 --75.9641 --75.9734 --75.9656 --75.9719 --75.9578 --75.9688 --75.9719 --75.9625 --75.975 --75.9656 --75.9594 --75.9688 --75.9594 --75.9672 --75.9734 --75.9688 --75.9766 --75.9578 --75.975 --75.9609 --75.9719 --75.95 --75.9609 --75.9703 --75.975 --75.9656 --75.9578 --75.9688 --75.9625 --75.9641 --75.9672 --75.9453 --75.9609 --75.9531 --75.9609 --75.9578 --75.9625 --75.9641 --75.9688 --75.9578 --75.9609 --75.9531 --75.9563 --75.9734 --75.9672 --75.9578 --75.9625 --75.9641 --75.9641 --75.9844 --75.9828 --75.9781 --75.9688 --75.9766 --75.9797 --75.9766 --75.9625 --75.9672 --75.9734 --75.9734 --75.9672 --75.9781 --75.9656 --75.9703 --75.9672 --75.9688 --75.9563 --75.9609 --75.9656 --75.9688 --75.9656 --75.9578 --75.9641 --75.9563 --75.9531 --75.9531 --75.9547 --75.975 --75.95 --75.95 --75.9578 --75.9672 --75.9609 --75.9578 --75.9516 --75.9563 --75.9656 --75.9563 --75.9719 --75.9516 --75.9531 --75.9469 --75.9594 --75.9563 --75.9594 --75.9531 --75.9391 --75.975 --75.9547 --75.9719 --75.9516 --75.9625 --75.9641 --75.9625 --75.9547 --75.9547 --75.9563 --75.9594 --75.975 --75.9531 --75.9625 --75.9625 --75.9703 --75.9734 --75.9641 --75.9688 --75.9625 --75.9625 --75.9594 --75.9594 --75.9625 --75.9531 --75.9437 --75.9625 --75.9563 --75.9594 --75.9531 --75.9578 --75.9563 --75.9453 --75.9609 --75.9453 --75.9516 --75.9563 --75.9672 --75.9594 --75.9688 --75.9594 --75.9625 --75.9734 --75.9672 --75.9656 --75.9656 --75.9703 --75.9625 --75.9516 --75.9609 --75.9594 --75.9594 --75.9688 --75.9437 --75.9563 --75.9484 --75.9563 --75.9609 --75.9594 --75.9484 --75.9625 --75.9484 --75.9531 --75.9578 --75.9625 --75.9547 --75.9656 --75.9516 --75.9641 --75.9578 --75.9484 --75.9703 --75.9703 --75.9516 --75.9625 --75.9609 --75.9563 --75.9656 --75.9703 --75.9625 --75.9625 --75.9703 --75.9609 --75.9625 --75.9609 --75.9656 --75.9672 --75.9719 --75.9594 --75.9688 --75.9625 --75.9531 --75.9734 --75.975 --75.9547 --75.9703 --75.9672 --75.9672 --75.9656 --75.9547 --75.9516 --75.9578 --75.9531 --75.9516 --75.9469 --75.9656 --75.9578 --75.9641 --75.9563 --75.9703 --75.9625 --75.9688 --75.9672 --75.9656 --75.9484 --75.9672 --75.9563 --75.9656 --75.9703 --75.9656 --75.9625 --75.9625 --75.9625 --75.9547 --75.9547 --75.9578 --75.9547 --75.9484 --75.9688 --75.9547 --75.9453 --75.9578 --75.9703 --75.9609 --75.9828 --75.9578 --75.9625 --75.9703 --75.9547 --75.9484 --75.9672 --75.9563 --75.9594 --75.9609 --75.9422 --75.9656 --75.95 --75.9625 --75.9594 --75.9578 --75.9563 --75.9469 --75.9734 --75.9625 --75.9703 --75.9594 --75.9578 --75.9719 --75.9719 --75.9781 --75.9672 --75.9781 --75.9656 --75.9703 --75.9688 --75.9672 --75.9688 --75.9703 --75.9625 --75.9812 --75.975 --75.9844 --75.9703 --75.9734 --75.9563 --75.9688 --75.9797 --75.9656 --75.9641 --75.9563 --75.9625 --75.9734 --75.9641 --75.9563 --75.9484 --75.9578 --75.9672 --75.9734 --75.9625 --75.9703 --75.9719 --75.9641 --75.9703 --75.9766 --75.9781 --75.9859 --75.975 --75.9797 --75.975 --75.975 --75.9812 --75.9844 --75.9719 --75.9891 --75.9719 --75.9828 --75.9719 --75.9719 --75.9688 --75.9812 --75.9797 --75.9734 --75.9844 --75.9688 --75.9594 --75.9891 --75.9641 --75.9781 --75.9812 --75.9578 --75.9781 --75.9766 --75.9688 --75.9828 --75.9766 --75.9797 --75.9844 --75.9734 --75.9828 --75.9734 --75.9891 --75.9625 --75.9875 --75.9734 --75.9891 --75.9812 --75.9828 --75.9812 --75.9672 --75.9797 --75.9781 --75.9812 --75.975 --75.9828 --75.975 --75.9734 --75.9625 --75.9719 --75.9734 --75.975 --75.9703 --75.9875 --75.9828 --75.9844 --75.9797 --75.9812 --75.9797 --75.9812 --75.9891 --75.9859 --75.9812 --75.9766 --75.9875 --75.9859 --75.9672 --75.9953 --75.9656 --75.9844 --75.9828 --75.9797 --75.9906 --75.9797 --75.9797 --75.9719 --75.9891 --75.9844 --75.9859 --75.9844 --75.9625 --75.9766 --75.9594 --75.9625 --75.9609 --75.9672 --75.9688 --75.9719 --75.9812 --75.9656 --75.9781 --75.9781 --75.9859 --75.9734 --75.9719 --75.975 --75.9719 --75.9656 --75.9719 --75.9891 --75.9719 --75.9625 --75.9688 --75.9797 --75.9719 --75.975 --75.9719 --75.9703 --75.9766 --75.9609 --75.9672 --75.9688 --75.9672 --75.9766 --75.9891 --75.9641 --75.9703 --75.9641 --75.9734 --75.9672 --75.9688 --75.9766 --75.9656 --75.9781 --75.9672 --75.9703 --75.9641 --75.9609 --75.9734 --75.9469 --75.9547 --75.9656 --75.9703 --75.9688 --75.9609 --75.9656 --75.9625 --75.975 --75.9563 --75.9578 --75.9484 --75.9719 --75.9734 --75.9688 --75.9531 --75.9766 --75.975 --75.9594 --75.9594 --75.9625 --75.9641 --75.9547 --75.9688 --75.9531 --75.9563 --75.9609 --75.9688 --75.9609 --75.9625 --75.9656 --75.9656 --75.9578 --75.9547 --75.9734 --75.9656 --75.9578 --75.9641 --75.9656 --75.9625 --75.9688 --75.9625 --75.9469 --75.9516 --75.9531 --75.9563 --75.9563 --75.9641 --75.9703 --75.9688 --75.9594 --75.9594 --75.9641 --75.9703 --75.9609 --75.9672 --75.9563 --75.9609 --75.9688 --75.9656 --75.9656 --75.9609 --75.9688 --75.9734 --75.9672 --75.9578 --75.9734 --75.9656 --75.9563 --75.9609 --75.9578 --75.9641 --75.9672 --75.9734 --75.9672 --75.9734 --75.9641 --75.9797 --75.9594 --75.9688 --75.9875 --75.9656 --75.9719 --75.9766 --75.9578 --75.9859 --75.9719 --75.9734 --75.9578 --75.9734 --75.9641 --75.975 --75.9766 --75.9688 --75.9578 --75.9563 --75.9625 --75.9594 --75.9609 --75.9531 --75.9594 --75.9641 --75.9531 --75.9672 --75.9672 --75.9625 --75.9688 --75.9734 --75.9516 --75.9625 --75.975 --75.9703 --75.9641 --75.9484 --75.9688 --75.9688 --75.9594 --75.9641 --75.9516 --75.9656 --75.9625 --75.9641 --75.9688 --75.9734 --75.9844 --75.9656 --75.9641 --75.9703 --75.9594 --75.9734 --75.9812 --75.9641 --75.9797 --75.9625 --75.9812 --75.9625 --75.9781 --75.9594 --75.9641 --75.9688 --75.9563 --75.9641 --75.9656 --75.9766 --75.9672 --75.9703 --75.9672 --75.9625 --75.9672 --75.975 --75.9688 --75.9828 --75.9703 --75.9828 --75.9594 --75.9812 --75.9766 --75.9812 --75.9828 --75.9656 --75.9578 --75.9688 --75.9656 --75.9688 --75.9734 --75.9812 --75.9734 --75.9672 --75.9734 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9703 --75.9672 --75.9625 --75.9547 --75.9688 --75.9672 --75.975 --75.9703 --75.9656 --75.9828 --75.9703 --75.9719 --75.9719 --75.9641 --75.9766 --75.9672 --75.9719 --75.9719 --75.9656 --75.9672 --75.9578 --75.9703 --75.9828 --75.9703 --75.9672 --75.9781 --75.9656 --75.9703 --75.9656 --75.9641 --75.9781 --75.9688 --75.9828 --75.9719 --75.9688 --75.9734 --75.975 --75.9844 --75.9656 --75.9906 --75.9766 --75.9766 --75.9719 --75.9859 --75.9641 --75.9828 --75.9797 --75.9797 --75.9703 --75.9688 --75.9812 --75.9844 --75.975 --75.9656 --75.9672 --75.9703 --75.9688 --75.9734 --75.9828 --75.9641 --75.9781 --75.9672 --75.9625 --75.9781 --75.9688 --75.9594 --75.9719 --75.9766 --75.9703 --75.9656 --75.975 --75.9719 --75.9609 --75.9641 --75.9812 --75.9719 --75.9672 --75.975 --75.9875 --75.975 --75.9797 --75.9734 --75.9891 --75.9781 --75.9828 --75.9859 --75.9828 --75.9781 --75.9719 --75.9781 --75.9781 --75.9766 --75.9672 --75.9672 --75.9656 --75.9672 --75.9672 --75.9688 --75.9719 --75.9688 --75.9719 --75.9703 --75.9641 --75.9641 --75.9672 --75.975 --75.9641 --75.9734 --75.9797 --75.9672 --75.975 --75.975 --75.9688 --75.9703 --75.9859 --75.9563 --75.9625 --75.9719 --75.9812 --75.9734 --75.9578 --75.9781 --75.9703 --75.9734 --75.9734 --75.9844 --75.9688 --75.9781 --75.9734 --75.9703 --75.9734 --75.9766 --75.9766 --75.975 --75.9844 --75.9734 --75.9719 --75.9688 --75.9734 --75.9797 --75.9672 --75.9625 --75.9625 --75.9625 --75.9672 --75.975 --75.9625 --75.9656 --75.9516 --75.9688 --75.9781 --75.9578 --75.9719 --75.9641 --75.9766 --75.9766 --75.9781 --75.9781 --75.9672 --75.9625 --75.9641 --75.9656 --75.9594 --75.9578 --75.9734 --75.9703 --75.9656 --75.9609 --75.9656 --75.9594 --75.9719 --75.9641 --75.975 --75.9641 --75.9734 --75.9547 --75.9547 --75.9594 --75.9719 --75.9688 --75.9625 --75.9656 --75.9609 --75.975 --75.9672 --75.9563 --75.9578 --75.9625 --75.9719 --75.9688 --75.9547 --75.9641 --75.9797 --75.9734 --75.9688 --75.975 --75.9719 --75.9625 --75.9766 --75.9656 --75.9672 --75.9703 --75.9672 --75.9531 --75.9656 --75.9703 --75.9625 --75.9563 --75.9656 --75.9609 --75.9656 --75.9797 --75.9812 --75.9781 --75.9719 --75.9625 --75.9688 --75.9672 --75.9781 --75.9672 --75.9672 --75.9703 --75.9781 --75.9609 --75.975 --75.9734 --75.9734 --75.9734 --75.9688 --75.9703 --75.9766 --75.9813 --75.9688 --75.9812 --75.9797 --75.9797 --75.975 --75.9859 --75.9719 --75.9734 --75.9719 --75.9906 --75.9641 --75.9781 --75.9734 --75.9656 --75.9719 --75.9688 --75.9734 --75.9766 --75.9906 --75.9875 --75.9594 --75.9625 --75.9688 --75.9719 --75.9766 --75.9609 --75.9641 --75.9656 --75.9812 --75.9641 --75.9641 --75.9656 --75.9703 --75.9641 --75.9781 --75.9719 --75.9688 --75.9578 --75.9672 --75.9656 --75.9516 --75.9609 --75.9625 --75.9672 --75.9578 --75.9781 --75.9719 --75.9594 --75.9703 --75.9766 --75.9766 --75.9578 --75.9734 --75.9766 --75.9547 --75.9781 --75.9656 --75.9641 --75.9688 --75.9781 --75.9672 --75.9656 --75.9625 --75.975 --75.9688 --75.9641 --75.9766 --75.9641 --75.9563 --75.9781 --75.9703 --75.9563 --75.9656 --75.9641 --75.9672 --75.9781 --75.9766 --75.9766 --75.9844 --75.9703 --75.9734 --75.9766 --75.9672 --75.9797 --75.9781 --75.9781 --75.975 --75.9766 --75.9797 --75.9703 --75.9812 --75.9688 --75.975 --75.9703 --75.9672 --75.9766 --75.9781 --75.9875 --75.9844 --75.9844 --75.975 --75.9797 --75.9781 --75.9734 --75.9672 --75.9672 --75.975 --75.9641 --75.9797 --75.975 --75.9672 --75.9578 --75.9734 --75.9797 --75.9828 --75.9672 --75.9672 --75.9766 --75.9797 --75.9922 --75.9781 --75.9812 --75.9844 --75.9906 --75.975 --75.9812 --75.9969 --75.9703 --75.9797 --75.9734 --75.9859 --75.9922 --75.9797 --75.9953 --75.9734 --75.9797 --75.9891 --75.9891 --75.9719 --75.975 --75.9828 --75.9859 --75.9719 --75.9844 --75.9656 --75.9656 --75.9828 --75.9781 --75.9734 --75.9844 --75.9844 --75.9781 --75.9828 --75.9797 --75.9812 --75.975 --75.9797 --75.9766 --75.9828 --75.9672 --75.9734 --75.9734 --75.9719 --75.9766 --75.9688 --75.9766 --75.9672 --75.9766 --75.9812 --75.9828 --75.9766 --75.975 --75.9797 --75.9828 --75.9703 --75.975 --75.9734 --75.9734 --75.9609 --75.9641 --75.9781 --75.9594 --75.9734 --75.9719 --75.9672 --75.9781 --75.9672 --75.9781 --75.9656 --75.9812 --75.9672 --75.9781 --75.9828 --75.9594 --75.9516 --75.9812 --75.9797 --75.9594 --75.9719 --75.9703 --75.9734 --75.9781 --75.9812 --75.9672 --75.9703 --75.9688 --75.9688 --75.9812 --75.9672 --75.9734 --75.9781 --75.9688 --75.9766 --75.9656 --75.9828 --75.9688 --75.975 --75.975 --75.9766 --75.9891 --75.9781 --75.9781 --75.9766 --75.9656 --75.9766 --75.9797 --75.9781 --75.9688 --75.9797 --75.9812 --75.9812 --75.9672 --75.9703 --75.9766 --75.9734 --75.9828 --75.9844 --75.9906 --75.9859 --75.9703 --75.975 --75.9859 --75.9844 --75.9844 --75.9812 --75.9734 --75.9766 --75.9766 --75.9703 --75.9641 --75.9828 --75.9672 --75.9734 --75.9641 --75.9672 --75.9781 --75.9781 --75.9641 --75.9906 --75.9797 --75.975 --75.9812 --75.9734 --75.9625 --75.9734 --75.9906 --75.9734 --75.9828 --75.975 --75.9797 --75.9938 --75.9656 --75.9828 --75.9797 --75.9781 --75.9844 --75.9703 --75.975 --75.9734 --75.9797 --75.9828 --75.975 --75.9703 --75.9641 --75.9734 --75.9781 --75.9734 --75.9641 --75.9656 --75.9828 --75.9797 --75.975 --75.9797 --75.9672 --75.9766 --75.9797 --75.9688 --75.975 --75.9703 --75.975 --75.9781 --75.9703 --75.9812 --75.9688 --75.9906 --75.9703 --75.9844 --75.9766 --75.9703 --75.9828 --75.9656 --75.9844 --75.9812 --75.9766 --75.9703 --75.9672 --75.9734 --75.9672 --75.9781 --75.9734 --75.975 --75.9719 --75.9922 --75.9797 --75.9797 --75.9875 --75.9875 --75.9875 --75.9812 --75.9766 --75.9672 --75.9859 --75.9797 --75.9859 --75.9859 --75.9828 --75.9797 --75.9797 --75.9734 --75.9797 --75.9844 --75.9875 --75.9719 --75.9672 --75.9781 --75.9875 --75.9828 --75.975 --75.9688 --75.9859 --75.9953 --75.9906 --75.9875 --75.9859 --75.975 --75.975 --75.9781 --75.9891 --75.9688 --75.9969 --75.9797 --75.9688 --75.9672 --75.9797 --75.9766 --75.9703 --75.9844 --75.975 --75.9828 --75.9719 --75.9828 --75.9812 --75.9703 --75.9656 --75.9781 --75.9812 --75.9781 --75.9781 --75.9812 --75.9812 --75.9672 --75.9844 --75.9781 --75.9703 --75.9703 --75.9656 --75.975 --75.9625 --75.9656 --75.9625 --75.9797 --75.9703 --75.9703 --75.9719 --75.9656 --75.9609 --75.9703 --75.9703 --75.9641 --75.9672 --75.9766 --75.9609 --75.9688 --75.9766 --75.9703 --75.9875 --75.9797 --75.9719 --75.9688 --75.9641 --75.9672 --75.975 --75.9656 --75.9578 --75.9688 --75.9656 --75.9797 --75.9641 --75.9594 --75.9781 --75.9563 --75.9609 --75.9734 --75.9672 --75.9656 --75.9766 --75.9672 --75.9625 --75.9547 --75.9625 --75.9734 --75.9734 --75.9594 --75.9594 --75.9641 --75.9656 --75.9625 --75.9625 --75.9484 --75.9797 --75.9766 --75.9688 --75.9672 --75.9656 --75.9625 --75.9672 --75.9625 --75.9625 --75.9625 --75.9766 --75.9703 --75.9516 --75.9672 --75.9609 --75.975 --75.9563 --75.9578 --75.9578 --75.9703 --75.9547 --75.9656 --75.9656 --75.9625 --75.95 --75.975 --75.9719 --75.9625 --75.9672 --75.975 --75.9578 --75.95 --75.9578 --75.9594 --75.9578 --75.9625 --75.95 --75.9672 --75.9672 --75.9625 --75.9641 --75.9844 --75.9641 --75.9594 --75.9734 --75.9766 --75.9672 --75.9609 --75.9516 --75.9672 --75.9719 --75.9688 --75.9578 --75.9703 --75.9609 --75.9594 --75.95 --75.9672 --75.9766 --75.9547 --75.9656 --75.9469 --75.9719 --75.9781 --75.9594 --75.9641 --75.9734 --75.9672 --75.9531 --75.9734 --75.9641 --75.9672 --75.9703 --75.9688 --75.9594 --75.9656 --75.9719 --75.9703 --75.9719 --75.9656 --75.9656 --75.9797 --75.9891 --75.9766 --75.9625 --75.9734 --75.9766 --75.9656 --75.9719 --75.9625 --75.9578 --75.9672 --75.9672 --75.9719 --75.975 --75.9656 --75.9891 --75.9812 --75.9734 --75.9625 --75.975 --75.9656 --75.9688 --75.975 --75.9563 --75.9609 --75.9594 --75.9563 --75.9609 --75.9594 --75.9656 --75.9672 --75.9656 --75.9594 --75.9688 --75.9641 --75.9641 --75.975 --75.9766 --75.9672 --75.9656 --75.9672 --75.9766 --75.9625 --75.9672 --75.9703 --75.9672 --75.9734 --75.9656 --75.9891 --75.9656 --75.9609 --75.9688 --75.9656 --75.9625 --75.9672 --75.9594 --75.9688 --75.9703 --75.9828 --75.9719 --75.9547 --75.9609 --75.9672 --75.9672 --75.9828 --75.9547 --75.9812 --75.9766 --75.9672 --75.9703 --75.9844 --75.9719 --75.9719 --75.9641 --75.9563 --75.9625 --75.9531 --75.9703 --75.9672 --75.9672 --75.9703 --75.9594 --75.9578 --75.9609 --75.9688 --75.9672 --75.9703 --75.9656 --75.9578 --75.9656 --75.9703 --75.9672 --75.9672 --75.9641 --75.9672 --75.9656 --75.9719 --75.9594 --75.9625 --75.9641 --75.9797 --75.975 --75.9781 --75.9672 --75.9656 --75.9703 --75.9688 --75.9672 --75.9531 --75.9859 --75.9766 --75.975 --75.9594 --75.9625 --75.9594 --75.9688 --75.9578 --75.9719 --75.9484 --75.9547 --75.9703 --75.9641 --75.9797 --75.9734 --75.9766 --75.9688 --75.9734 --75.9656 --75.9797 --75.9672 --75.9609 --75.9563 --75.9672 --75.9766 --75.9609 --75.9688 --75.9672 --75.9656 --75.9594 --75.9609 --75.9672 --75.9656 --75.9563 --75.9703 --75.9578 --75.9641 --75.9547 --75.9594 --75.9594 --75.9656 --75.9672 --75.9719 --75.9625 --75.9609 --75.9516 --75.9531 --75.9578 --75.9563 --75.9672 --75.9484 --75.9672 --75.9609 --75.9563 --75.9547 --75.9609 --75.9531 --75.9547 --75.9484 --75.9484 --75.9469 --75.9484 --75.9531 --75.9484 --75.95 --75.9422 --75.9453 --75.9437 --75.9609 --75.9547 --75.9609 --75.9516 --75.9563 --75.9641 --75.9578 --75.9578 --75.9641 --75.9656 --75.9625 --75.9578 --75.9516 --75.9688 --75.9516 --75.9594 --75.9531 --75.9656 --75.9516 --75.9594 --75.9625 --75.9578 --75.9656 --75.9547 --75.9594 --75.9547 --75.9531 --75.9641 --75.9703 --75.9531 --75.9578 --75.95 --75.9453 --75.9531 --75.9672 --75.9641 --75.9656 --75.9547 --75.9609 --75.9609 --75.9672 --75.9609 --75.9594 --75.95 --75.9625 --75.9766 --75.9703 --75.9563 --75.9578 --75.95 --75.9578 --75.9531 --75.9719 --75.9656 --75.9547 --75.9656 --75.9625 --75.9516 --75.9578 --75.9594 --75.9719 --75.9703 --75.9594 --75.9609 --75.9609 --75.9625 --75.9578 --75.9563 --75.9547 --75.9625 --75.9625 --75.9703 --75.9609 --75.9641 --75.9625 --75.9656 --75.95 --75.9656 --75.9563 --75.9609 --75.9609 --75.9625 --75.9594 --75.9531 --75.9547 --75.9484 --75.9406 --75.9641 --75.9453 --75.9516 --75.9672 --75.9578 --75.9609 --75.9406 --75.95 --75.9406 --75.95 --75.9594 --75.9422 --75.9422 --75.9609 --75.9453 --75.9547 --75.9453 --75.95 --75.9469 --75.9437 --75.9469 --75.9406 --75.9547 --75.9406 --75.9594 --75.9375 --75.9453 --75.9469 --75.9516 --75.9469 --75.9453 --75.9531 --75.9422 --75.9422 --75.9656 --75.9563 --75.9594 --75.9578 --75.9563 --75.9484 --75.9531 --75.9563 --75.9516 --75.9547 --75.9578 --75.9625 --75.95 --75.9437 --75.9672 --75.9547 --75.95 --75.9531 --75.9563 --75.9547 --75.9531 --75.9578 --75.9563 --75.9453 --75.9578 --75.9719 --75.9516 --75.9656 --75.9531 --75.9516 --75.9531 --75.9828 --75.9656 --75.9641 --75.9891 --75.9656 --75.9516 --75.9656 --75.9484 --75.9672 --75.9609 --75.9641 --75.9563 --75.9609 --75.9672 --75.9547 --75.9531 --75.9656 --75.9516 --75.9484 --75.9609 --75.9547 --75.9563 --75.95 --75.9609 --75.9656 --75.9531 --75.9547 --75.9625 --75.9563 --75.9563 --75.95 --75.9563 --75.9469 --75.9578 --75.9453 --75.9453 --75.9531 --75.9437 --75.9531 --75.9391 --75.9563 --75.9406 --75.9531 --75.9406 --75.9516 --75.9375 --75.9578 --75.9563 --75.9484 --75.9547 --75.9422 --75.9469 --75.9609 --75.95 --75.9516 --75.95 --75.9531 --75.9563 --75.9437 --75.9391 --75.9531 --75.9563 --75.95 --75.95 --75.9656 --75.9563 --75.9437 --75.9547 --75.9641 --75.9594 --75.95 --75.9547 --75.9672 --75.9578 --75.9422 --75.9703 --75.9656 --75.9563 --75.9656 --75.9594 --75.9688 --75.9516 --75.9719 --75.9563 --75.9516 --75.9719 --75.9734 --75.9609 --75.9672 --75.9656 --75.9766 --75.9672 --75.9578 --75.9547 --75.9625 --75.9594 --75.9609 --75.9828 --75.9703 --75.9781 --75.9719 --75.9625 --75.9734 --75.9797 --75.9844 --75.9656 --75.9656 --75.95 --75.9688 --75.9563 --75.9812 --75.9656 --75.9625 --75.9578 --75.9703 --75.9625 --75.9516 --75.9578 --75.9469 --75.9563 --75.9531 --75.9641 --75.9563 --75.9609 --75.9656 --75.9703 --75.9656 --75.9656 --75.9609 --75.9641 --75.9594 --75.9547 --75.9625 --75.9797 --75.9734 --75.9625 --75.9609 --75.9719 --75.9594 --75.9672 --75.9672 --75.975 --75.9703 --75.9719 --75.9734 --75.9703 --75.9797 --75.9656 --75.9563 --75.9641 --75.9656 --75.9719 --75.9609 --75.9641 --75.9625 --75.9516 --75.9641 --75.9688 --75.9625 --75.9703 --75.9437 --75.9563 --75.9453 --75.975 --75.9609 --75.9672 --75.9672 --75.9656 --75.9625 --75.9703 --75.9672 --75.9688 --75.9781 --75.9531 --75.9641 --75.9609 --75.9688 --75.9719 --75.9625 --75.9563 --75.9672 --75.9656 --75.9641 --75.9437 --75.9797 --75.9484 --75.9625 --75.9469 --75.9656 --75.9656 --75.9688 --75.9781 --75.9703 --75.9688 --75.9563 --75.9672 --75.9672 --75.9672 --75.9656 --75.9625 --75.9641 --75.9625 --75.95 --75.9594 --75.9719 --75.9656 --75.9594 --75.9688 --75.9641 --75.9719 --75.9547 --75.9672 --75.9563 --75.9594 --75.9688 --75.9516 --75.9578 --75.9766 --75.9594 --75.9672 --75.9703 --75.9719 --75.9781 --75.9625 --75.9641 --75.9688 --75.9531 --75.95 --75.9625 --75.9437 --75.9703 --75.95 --75.9578 --75.9484 --75.95 --75.9609 --75.9563 --75.9453 --75.9563 --75.9469 --75.9609 --75.9453 --75.9547 --75.9516 --75.9594 --75.9391 --75.9594 --75.9563 --75.9609 --75.9563 --75.9656 --75.9625 --75.9516 --75.9719 --75.9563 --75.9531 --75.9578 --75.9609 --75.9563 --75.9563 --75.9609 --75.9703 --75.9516 --75.9531 --75.9625 --75.9516 --75.9688 --75.9609 --75.9656 --75.9625 --75.9594 --75.9531 --75.9563 --75.9563 --75.9641 --75.9578 --75.9625 --75.9531 --75.9531 --75.95 --75.9594 --75.9625 --75.9578 --75.9609 --75.9547 --75.9672 --75.9437 --75.9625 --75.9531 --75.95 --75.9609 --75.9453 --75.9625 --75.9453 --75.9625 --75.95 --75.9594 --75.9609 --75.9641 --75.9578 --75.9703 --75.9719 --75.9688 --75.9688 --75.9609 --75.9609 --75.9578 --75.9578 --75.9547 --75.9672 --75.9609 --75.9656 --75.9625 --75.9734 --75.9703 --75.9563 --75.9609 --75.9437 --75.9531 --75.95 --75.9391 --75.9422 --75.95 --75.9422 --75.9484 --75.9516 --75.9641 --75.9609 --75.9547 --75.9437 --75.9516 --75.9594 --75.9734 --75.9437 --75.9484 --75.95 --75.9547 --75.9484 --75.9719 --75.9547 --75.9734 --75.9594 --75.9578 --75.9531 --75.9609 --75.9594 --75.9688 --75.9609 --75.9641 --75.9688 --75.9625 --75.9641 --75.9625 --75.9734 --75.9609 --75.9516 --75.9641 --75.9609 --75.9531 --75.9563 --75.9609 --75.9609 --75.9609 --75.9516 --75.9563 --75.9531 --75.9594 --75.9625 --75.9672 --75.9516 --75.9516 --75.9656 --75.9703 --75.9703 --75.975 --75.9703 --75.9578 --75.9719 --75.9688 --75.9625 --75.9516 --75.9563 --75.95 --75.9516 --75.9531 --75.9469 --75.9469 --75.9594 --75.9609 --75.9563 --75.9563 --75.9656 --75.9703 --75.9469 --75.9625 --75.9484 --75.9578 --75.9406 --75.9609 --75.9547 --75.9625 --75.9563 --75.9547 --75.9516 --75.9594 --75.9516 --75.9703 --75.9688 --75.9609 --75.9609 --75.9563 --75.9531 --75.9453 --75.9484 --75.9625 --75.9406 --75.9469 --75.9453 --75.9375 --75.9609 --75.9469 --75.9437 --75.95 --75.9547 --75.9516 --75.9484 --75.95 --75.9516 --75.9547 --75.9563 --75.9781 --75.9547 --75.95 --75.9719 --75.9547 --75.9516 --75.9547 --75.9609 --75.95 --75.9641 --75.9469 --75.95 --75.9609 --75.9594 --75.9469 --75.9641 --75.9469 --75.9578 --75.9609 --75.9563 --75.9422 --75.9594 --75.95 --75.9594 --75.9688 --75.9563 --75.9578 --75.9641 --75.9609 --75.9734 --75.9563 --75.9609 --75.9516 --75.95 --75.9531 --75.9437 --75.9625 --75.9547 --75.9437 --75.9516 --75.9531 --75.9609 --75.9516 --75.9594 --75.9594 --75.9531 --75.9578 --75.9547 --75.9578 --75.9734 --75.9609 --75.9766 --75.9672 --75.9609 --75.9594 --75.9594 --75.95 --75.9578 --75.9672 --75.9578 --75.9594 --75.9563 --75.9672 --75.9641 --75.9563 --75.9703 --75.9625 --75.9563 --75.9563 --75.9719 --75.9625 --75.9625 --75.9656 --75.9625 --75.9641 --75.9516 --75.9641 --75.9563 --75.9469 --75.9656 --75.9547 --75.9578 --75.9594 --75.95 --75.9578 --75.9641 --75.9453 --75.9484 --75.9531 --75.9578 --75.9422 --75.95 --75.9672 --75.9547 --75.9656 --75.9609 --75.9609 --75.9437 --75.9578 --75.9563 --75.9531 --75.9594 --75.9625 --75.9594 --75.9469 --75.9531 --75.9516 --75.9422 --75.9547 --75.9594 --75.9453 --75.95 --75.9563 --75.9625 --75.9516 --75.9578 --75.9531 --75.9437 --75.9594 --75.9641 --75.9531 --75.9516 --75.9484 --75.9641 --75.9547 --75.9578 --75.9594 --75.9672 --75.9641 --75.9609 --75.9531 --75.9688 --75.9547 --75.9656 --75.9625 --75.9719 --75.9688 --75.9531 --75.9547 --75.9484 --75.9656 --75.9531 --75.9672 --75.9531 --75.9719 --75.9531 --75.9469 --75.9437 --75.9578 --75.9484 --75.9406 --75.9453 --75.9531 --75.9578 --75.9531 --75.9484 --75.9406 --75.9578 --75.9594 --75.9422 --75.9516 --75.9469 --75.9531 --75.9453 --75.9531 --75.9531 --75.9656 --75.9594 --75.9703 --75.9625 --75.9563 --75.9609 --75.9734 --75.9531 --75.9672 --75.9578 --75.9594 --75.9531 --75.9406 --75.9625 --75.9688 --75.9625 --75.9656 --75.9656 --75.9516 --75.9625 --75.9641 --75.9609 --75.9563 --75.9578 --75.9609 --75.9531 --75.9563 --75.9516 --75.9703 --75.95 --75.9609 --75.9594 --75.9578 --75.9563 --75.9516 --75.9484 --75.9625 --75.9563 --75.95 --75.9609 --75.9641 --75.9578 --75.9656 --75.9578 --75.9547 --75.9547 --75.9578 --75.9516 --75.9656 --75.95 --75.9688 --75.9688 --75.9594 --75.9625 --75.9609 --75.9625 --75.9484 --75.9516 --75.9563 --75.9563 --75.9656 --75.9484 --75.9516 --75.9641 --75.9688 --75.9563 --75.9594 --75.9609 --75.9641 --75.9609 --75.9625 --75.9703 --75.9641 --75.9844 --75.9625 --75.975 --75.9594 --75.9734 --75.9766 --75.9719 --75.9734 --75.9672 --75.975 --75.9781 --75.9719 --75.9641 --75.9656 --75.9547 --75.9609 --75.9656 --75.9547 --75.9656 --75.9563 --75.9641 --75.9594 --75.9719 --75.9563 --75.9734 --75.9703 --75.9688 --75.9656 --75.9688 --75.9719 --75.9828 --75.9719 --75.95 --75.9688 --75.9656 --75.9547 --75.9703 --75.9609 --75.9656 --75.9578 --75.9453 --75.9656 --75.9469 --75.9422 --75.9547 --75.9625 --75.9563 --75.9609 --75.9563 --75.9734 --75.9563 --75.9594 --75.9625 --75.9641 --75.9641 --75.9703 --75.9703 --75.9484 --75.9578 --75.9656 --75.9609 --75.9609 --75.9484 --75.9656 --75.9531 --75.9531 --75.9672 --75.9609 --75.9547 --75.9547 --75.9469 --75.9453 --75.95 --75.9531 --75.9578 --75.9453 --75.95 --75.9531 --75.9375 --75.9406 --75.9437 --75.9375 --75.95 --75.9437 --75.9531 --75.9484 --75.9375 --75.9391 --75.9453 --75.9313 --75.9641 --75.9547 --75.9672 --75.9609 --75.9641 --75.9469 --75.9469 --75.9469 --75.9516 --75.9422 --75.9391 --75.9563 --75.9516 --75.9359 --75.9469 --75.9516 --75.9406 --75.95 --75.9422 --75.9422 --75.9453 --75.9594 --75.9484 --75.9469 --75.9391 --75.9453 --75.9297 --75.9422 --75.9422 --75.9531 --75.9391 --75.9469 --75.95 --75.9422 --75.9344 --75.9375 --75.9453 --75.9297 --75.9406 --75.9453 --75.9406 --75.9531 --75.9531 --75.9406 --75.9406 --75.9375 --75.9406 --75.9484 --75.9391 --75.9469 --75.95 --75.95 --75.9453 --75.9453 --75.9313 --75.9437 --75.9469 --75.9422 --75.9422 --75.9422 --75.9375 --75.9437 --75.9281 --75.9469 --75.9531 --75.95 --75.9609 --75.9563 --75.9625 --75.9484 --75.9547 --75.9469 --75.9453 --75.9406 --75.95 --75.9469 --75.9422 --75.9563 --75.9578 --75.9437 --75.9563 --75.9406 --75.9547 --75.9469 --75.95 --75.9563 --75.9563 --75.9437 --75.9594 --75.9484 --75.95 --75.9656 --75.95 --75.9563 --75.9563 --75.9547 --75.9563 --75.9406 --75.9563 --75.9641 --75.9375 --75.9453 --75.9641 --75.9688 --75.9547 --75.9484 --75.9578 --75.9547 --75.9375 --75.9563 --75.9422 --75.95 --75.9453 --75.9578 --75.9625 --75.9422 --75.9391 --75.9641 --75.9516 --75.9578 --75.9484 --75.9656 --75.9469 --75.95 --75.95 --75.9625 --75.9547 --75.9688 --75.9578 --75.9641 --75.9578 --75.9563 --75.9406 --75.9563 --75.9531 --75.9484 --75.9672 --75.9531 --75.95 --75.9766 --75.9703 --75.9547 --75.9531 --75.9563 --75.9391 --75.9563 --75.9375 --75.9375 --75.9391 --75.9578 --75.9437 --75.9328 --75.9406 --75.9437 --75.9531 --75.9437 --75.9625 --75.9359 --75.9469 --75.9281 --75.9391 --75.9391 --75.9391 --75.9391 --75.9281 --75.9453 --75.9469 --75.9516 --75.9516 --75.9406 --75.9422 --75.9578 --75.9531 --75.95 --75.9484 --75.9531 --75.9422 --75.9484 --75.9625 --75.9469 --75.9531 --75.9484 --75.95 --75.9531 --75.9625 --75.9563 --75.9469 --75.9578 --75.9609 --75.9594 --75.9578 --75.9453 --75.9547 --75.9594 --75.9531 --75.9547 --75.9594 --75.9703 --75.9578 --75.9563 --75.9594 --75.9563 --75.9547 --75.9578 --75.9531 --75.9469 --75.9484 --75.9484 --75.9453 --75.9625 --75.9594 --75.9531 --75.9578 --75.9547 --75.9406 --75.9609 --75.9531 --75.9688 --75.9547 --75.9484 --75.9406 --75.9609 --75.9625 --75.9547 --75.95 --75.9406 --75.9453 --75.95 --75.9625 --75.9453 --75.95 --75.9531 --75.9516 --75.9688 --75.9641 --75.9625 --75.9641 --75.9563 --75.9547 --75.9703 --75.9688 --75.9641 --75.9656 --75.9547 --75.9766 --75.9734 --75.9656 --75.9812 --75.9641 --75.9594 --75.9734 --75.9594 --75.9641 --75.9656 --75.9547 --75.9594 --75.9531 --75.9688 --75.9625 --75.9719 --75.9641 --75.9547 --75.95 --75.9656 --75.9594 --75.9594 --75.9578 --75.9641 --75.9641 --75.9578 --75.9469 --75.9547 --75.9547 --75.9484 --75.9547 --75.9469 --75.9594 --75.9516 --75.9641 --75.9781 --75.9719 --75.9578 --75.9656 --75.9594 --75.9656 --75.9563 --75.9531 --75.9703 --75.9719 --75.9547 --75.9672 --75.9578 --75.9531 --75.9594 --75.9375 --75.9625 --75.9437 --75.9578 --75.9609 --75.95 --75.9531 --75.95 --75.9531 --75.9344 --75.9531 --75.9469 --75.9547 --75.9578 --75.9422 --75.9563 --75.9563 --75.9547 --75.9563 --75.9531 --75.9484 --75.9688 --75.9516 --75.9563 --75.9531 --75.9688 --75.9609 --75.9484 --75.9531 --75.975 --75.9531 --75.9547 --75.95 --75.9516 --75.9563 --75.9484 --75.9422 --75.9547 --75.9531 --75.9594 --75.9422 --75.9609 --75.9437 --75.9422 --75.9469 --75.9391 --75.95 --75.9422 --75.9516 --75.9625 --75.9422 --75.9453 --75.9516 --75.9625 --75.9422 --75.9437 --75.9594 --75.9563 --75.9641 --75.9563 --75.9422 --75.9547 --75.9437 --75.95 --75.9609 --75.9594 --75.9531 --75.9547 --75.9406 --75.9531 --75.95 --75.9609 --75.9437 --75.9437 --75.9516 --75.9484 --75.9484 --75.9516 --75.9547 --75.9516 --75.9547 --75.9391 --75.9422 --75.9391 --75.9391 --75.9563 --75.9469 --75.9547 --75.9375 --75.9437 --75.95 --75.9313 --75.9547 --75.95 --75.9437 --75.9328 --75.9469 --75.9469 --75.95 --75.9422 --75.9453 --75.9516 --75.9578 --75.9594 --75.9547 --75.9578 --75.9437 --75.9594 --75.9531 --75.9578 --75.9469 --75.9437 --75.9437 --75.9594 --75.9469 --75.9516 --75.9531 --75.9484 --75.9391 --75.9516 --75.9609 --75.9484 --75.9547 --75.9406 --75.9531 --75.9547 --75.9453 --75.9516 --75.9328 --75.9563 --75.9406 --75.9422 --75.9547 --75.9531 --75.9578 --75.9578 --75.9437 --75.9437 --75.95 --75.9563 --75.9469 --75.9437 --75.9391 --75.9547 --75.9594 --75.9656 --75.9453 --75.9437 --75.9484 --75.9516 --75.9453 --75.9484 --75.9516 --75.9359 --75.9484 --75.9422 --75.9359 --75.9484 --75.9453 --75.9375 --75.9297 --75.9422 --75.9313 --75.9406 --75.9437 --75.9391 --75.9375 --75.9375 --75.95 --75.9547 --75.9547 --75.9563 --75.9469 --75.95 --75.9453 --75.9391 --75.9406 --75.9469 --75.9484 --75.9484 --75.9516 --75.9422 --75.9406 --75.9422 --75.9422 --75.9453 --75.9453 --75.9313 --75.9281 --75.9484 --75.9422 --75.9422 --75.9375 --75.9375 --75.9516 --75.9391 --75.9281 --75.9391 --75.9344 --75.9375 --75.9391 --75.9406 --75.9453 --75.9406 --75.9328 --75.9375 --75.9375 --75.9281 --75.9406 --75.9359 --75.9531 --75.95 --75.9547 --75.9406 --75.9406 --75.9422 --75.9297 --75.9453 --75.9313 --75.9344 --75.9422 --75.9469 --75.9391 --75.9484 --75.9391 --75.9359 --75.9437 --75.9344 --75.95 --75.9453 --75.9406 --75.9406 --75.9437 --75.9297 --75.9531 --75.9406 --75.9422 --75.9328 --75.9453 --75.9406 --75.9344 --75.9422 --75.9578 --75.9531 --75.95 --75.9578 --75.9547 --75.9656 --75.9359 --75.9641 --75.9688 --75.9422 --75.9391 --75.9453 --75.9453 --75.9453 --75.9578 --75.9437 --75.9437 --75.9469 --75.9344 --75.9437 --75.9625 --75.9437 --75.9359 --75.95 --75.9406 --75.9453 --75.9594 --75.9437 --75.9516 --75.9516 --75.95 --75.9437 --75.9422 --75.9391 --75.9453 --75.9469 --75.9469 --75.9391 --75.9297 --75.9437 --75.9453 --75.9406 --75.9391 --75.9484 --75.9422 --75.9359 --75.9531 --75.9406 --75.9484 --75.9406 --75.9391 --75.9453 --75.9359 --75.9516 --75.9422 --75.9547 --75.9516 --75.9578 --75.9609 --75.9547 --75.9422 --75.9531 --75.9453 --75.9578 --75.9359 --75.9484 --75.9391 --75.9437 --75.9516 --75.9375 --75.9391 --75.9594 --75.9516 --75.9313 --75.95 --75.9563 --75.9406 --75.9437 --75.9516 --75.9641 --75.9406 --75.9656 --75.9578 --75.9469 --75.9437 --75.9594 --75.9516 --75.9531 --75.9469 --75.9609 --75.9437 --75.9563 --75.9563 --75.9609 --75.9531 --75.9594 --75.9469 --75.9609 --75.9484 --75.9531 --75.9453 --75.9453 --75.9516 --75.9656 --75.9578 --75.9656 --75.9547 --75.9563 --75.95 --75.9375 --75.9563 --75.9375 --75.95 --75.9422 --75.9344 --75.9344 --75.95 --75.9437 --75.9422 --75.9578 --75.9359 --75.9531 --75.9437 --75.9469 --75.9547 --75.9469 --75.9469 --75.9484 --75.9547 --75.9594 --75.95 --75.9531 --75.9516 --75.9344 --75.9531 --75.9375 --75.9547 --75.9469 --75.9437 --75.9359 --75.9453 --75.9469 --75.9437 --75.9359 --75.9281 --75.9344 --75.9469 --75.9484 --75.9344 --75.9391 --75.9359 --75.9391 --75.9391 --75.9547 --75.925 --75.9437 --75.9453 --75.9437 --75.9281 --75.9359 --75.9313 --75.9359 --75.9469 --75.9484 --75.9281 --75.9328 --75.9391 --75.9344 --75.9531 --75.9422 --75.9328 --75.9531 --75.9547 --75.9422 --75.9453 --75.9375 --75.9516 --75.9344 --75.9453 --75.9328 --75.9609 --75.9469 --75.9547 --75.9313 --75.9391 --75.9406 --75.9391 --75.9422 --75.9453 --75.9453 --75.9219 --75.9453 --75.9563 --75.9406 --75.9375 --75.9453 --75.9375 --75.9563 --75.9391 --75.9406 --75.9375 --75.9469 --75.95 --75.9437 --75.9516 --75.9422 --75.9469 --75.9344 --75.9359 --75.9531 --75.9422 --75.9375 --75.9453 --75.9437 --75.9547 --75.9453 --75.9484 --75.9422 --75.9437 --75.9375 --75.9344 --75.9469 --75.9547 --75.9406 --75.9594 --75.9297 --75.9313 --75.9406 --75.9391 --75.9469 --75.9469 --75.9313 --75.9406 --75.9437 --75.9594 --75.9609 --75.9469 --75.9547 --75.9484 --75.9453 --75.9484 --75.9563 --75.9547 --75.9531 --75.9547 --75.9563 --75.9547 --75.9531 --75.9437 --75.9563 --75.9516 --75.9609 --75.9656 --75.9609 --75.9641 --75.9531 --75.9531 --75.9625 --75.9437 --75.9594 --75.9688 --75.95 --75.9688 --75.9453 --75.9484 --75.9625 --75.9422 --75.9437 --75.9516 --75.9516 --75.9453 --75.9469 --75.9437 --75.9469 --75.9609 --75.9531 --75.9547 --75.9547 --75.95 --75.9531 --75.9594 --75.9578 --75.9578 --75.9531 --75.9469 --75.9594 --75.9547 --75.9391 --75.9516 --75.9437 --75.95 --75.9359 --75.9531 --75.9594 --75.9516 --75.9437 --75.9391 --75.9422 --75.9437 --75.9516 --75.9516 --75.95 --75.9688 --75.9578 --75.9531 --75.9703 --75.9641 --75.9609 --75.9578 --75.9594 --75.9469 --75.9563 --75.9625 --75.9469 --75.9469 --75.9641 --75.9422 --75.9625 --75.95 --75.9703 --75.9563 --75.9594 --75.9609 --75.9516 --75.9516 --75.9641 --75.9609 --75.9563 --75.9656 --75.95 --75.9578 --75.9391 --75.9516 --75.9594 --75.9453 --75.95 --75.9547 --75.9406 --75.9703 --75.9625 --75.9453 --75.9609 --75.9578 --75.9609 --75.9531 --75.9625 --75.9547 --75.9531 --75.9625 --75.9531 --75.9625 --75.9484 --75.9781 --75.9531 --75.9625 --75.9688 --75.9656 --75.9563 --75.9531 --75.9703 --75.9547 --75.9563 --75.95 --75.9531 --75.9547 --75.9531 --75.9594 --75.9594 --75.9625 --75.9578 --75.9734 --75.9688 --75.9688 --75.9688 --75.9484 --75.9531 --75.9563 --75.9563 --75.9641 --75.9625 --75.9656 --75.9563 --75.9703 --75.9734 --75.9656 --75.9578 --75.9547 --75.9656 --75.9484 --75.95 --75.9688 --75.9563 --75.9563 --75.9656 --75.9625 --75.9719 --75.9688 --75.95 --75.9609 --75.9594 --75.9625 --75.9516 --75.9734 --75.9516 --75.9641 --75.9641 --75.9484 --75.9781 --75.9672 --75.9672 --75.9719 --75.9656 --75.9563 --75.9703 --75.9484 --75.9594 --75.9563 --75.9578 --75.9594 --75.9812 --75.9609 --75.9719 --75.9641 --75.9672 --75.95 --75.9703 --75.9547 --75.9688 --75.9641 --75.9609 --75.9578 --75.9625 --75.9578 --75.9563 --75.9609 --75.9672 --75.9672 --75.9672 --75.9641 --75.9531 --75.9516 --75.9609 --75.9688 --75.95 --75.9672 --75.9641 --75.9594 --75.9609 --75.9609 --75.9531 --75.9594 --75.9672 --75.9609 --75.9656 --75.9531 --75.9484 --75.9625 --75.95 --75.9578 --75.9625 --75.9781 --75.9547 --75.9578 --75.9641 --75.9547 --75.9516 --75.95 --75.9531 --75.9563 --75.9688 --75.9391 --75.9469 --75.9453 --75.9484 --75.9547 --75.9719 --75.9531 --75.9437 --75.9625 --75.95 --75.9578 --75.9375 --75.9563 --75.9578 --75.9547 --75.9578 --75.9594 --75.9422 --75.9531 --75.9469 --75.9563 --75.9578 --75.9563 --75.9453 --75.9484 --75.9547 --75.9641 --75.9531 --75.9578 --75.9656 --75.9594 --75.9672 --75.9453 --75.9578 --75.95 --75.9656 --75.9641 --75.9531 --75.9625 --75.975 --75.9719 --75.9672 --75.9656 --75.9719 --75.9656 --75.9609 --75.9484 --75.9531 --75.9641 --75.9641 --75.9469 --75.9656 --75.9594 --75.95 --75.9594 --75.9594 --75.9531 --75.9563 --75.9641 --75.9625 --75.9641 --75.9594 --75.9688 --75.9641 --75.9703 --75.9797 --75.9453 --75.9625 --75.9578 --75.9656 --75.9516 --75.9516 --75.9516 --75.9625 --75.9734 --75.9563 --75.9453 --75.9578 --75.9641 --75.9578 --75.95 --75.9578 --75.9594 --75.9578 --75.9609 --75.9672 --75.9547 --75.9641 --75.9625 --75.9594 --75.9547 --75.95 --75.9563 --75.9609 --75.9594 --75.9734 --75.95 --75.9609 --75.9625 --75.9625 --75.9594 --75.9594 --75.9609 --75.9656 --75.9547 --75.9594 --75.9688 --75.9703 --75.9703 --75.9672 --75.9641 --75.9625 --75.9578 --75.9563 --75.9547 --75.9656 --75.9688 --75.9547 --75.9516 --75.9672 --75.975 --75.9656 --75.9547 --75.9578 --75.9547 --75.9563 --75.9641 --75.9609 --75.9625 --75.9531 --75.9594 --75.9781 --75.9578 --75.9609 --75.9531 --75.9594 --75.9719 --75.9594 --75.9609 --75.9641 --75.9531 --75.9688 --75.9594 --75.9594 --75.9578 --75.9531 --75.9672 --75.9563 --75.9578 --75.9703 --75.975 --75.9734 --75.9594 --75.9563 --75.9578 --75.9563 --75.9766 --75.95 --75.9516 --75.9641 --75.9578 --75.9609 --75.9578 --75.9547 --75.9563 --75.9391 --75.9578 --75.9516 --75.9422 --75.9656 --75.9656 --75.9594 --75.9516 --75.9563 --75.9609 --75.9672 --75.9625 --75.9547 --75.9453 --75.9641 --75.9656 --75.9656 --75.9719 --75.9641 --75.9391 --75.9578 --75.9672 --75.9641 --75.9594 --75.9469 --75.9484 --75.9563 --75.9656 --75.9531 --75.9609 --75.9547 --75.9578 --75.9406 --75.95 --75.9609 --75.9656 --75.95 --75.9547 --75.9594 --75.9734 --75.9531 --75.9641 --75.9578 --75.9688 --75.9688 --75.9609 --75.9672 --75.9516 --75.9688 --75.9641 --75.9578 --75.9516 --75.9641 --75.95 --75.95 --75.9688 --75.9625 --75.9484 --75.9594 --75.9563 --75.9656 --75.9609 --75.9563 --75.9625 --75.9672 --75.9469 --75.9547 --75.975 --75.9484 --75.9719 --75.9641 --75.9484 --75.9594 --75.9609 --75.9688 --75.9594 --75.9594 --75.9625 --75.9703 --75.9672 --75.9563 --75.9437 --75.9563 --75.95 --75.9672 --75.9594 --75.9656 --75.9703 --75.9375 --75.9625 --75.9625 --75.9656 --75.9578 --75.9672 --75.9594 --75.9469 --75.9688 --75.9609 --75.9656 --75.9547 --75.9563 --75.9656 --75.9469 --75.9672 --75.9703 --75.9531 --75.9516 --75.95 --75.9641 --75.9578 --75.9563 --75.9734 --75.9563 --75.9594 --75.975 --75.9609 --75.9609 --75.9594 --75.9844 --75.9625 --75.9688 --75.9781 --75.9625 --75.975 --75.9578 --75.9563 --75.9547 --75.9531 --75.9625 --75.9641 --75.9578 --75.9563 --75.9625 --75.9531 --75.9641 --75.9656 --75.9563 --75.9641 --75.9547 --75.9703 --75.9766 --75.9641 --75.9672 --75.9578 --75.9641 --75.9547 --75.9656 --75.9672 --75.9688 --75.9672 --75.9641 --75.9672 --75.9672 --75.9641 --75.9688 --75.9672 --75.9609 --75.9672 --75.9766 --75.9594 --75.9641 --75.9578 --75.9531 --75.9609 --75.9641 --75.9516 --75.9625 --75.9469 --75.9594 --75.9609 --75.9703 --75.9594 --75.9656 --75.9609 --75.9703 --75.9609 --75.9688 --75.9656 --75.975 --75.9703 --75.9641 --75.9734 --75.9641 --75.9672 --75.9563 --75.9609 --75.9656 --75.9625 --75.9531 --75.9594 --75.9578 --75.9625 --75.95 --75.9531 --75.9578 --75.9609 --75.9578 --75.9453 --75.9563 --75.9453 --75.9578 --75.9594 --75.9547 --75.9516 --75.9422 --75.9422 --75.9688 --75.9531 --75.9641 --75.9531 --75.95 --75.9641 --75.9547 --75.9547 --75.9531 --75.9578 --75.9531 --75.9531 --75.9531 --75.9578 --75.9656 --75.9578 --75.9469 --75.9531 --75.9484 --75.9437 --75.9625 --75.9516 --75.9641 --75.9437 --75.9484 --75.95 --75.9625 --75.9422 --75.9563 --75.9594 --75.9547 --75.9594 --75.9641 --75.9469 --75.9531 --75.9641 --75.95 --75.9547 --75.95 --75.9484 --75.9547 --75.9625 --75.9578 --75.9469 --75.9516 --75.9578 --75.9641 --75.95 --75.9531 --75.9484 --75.9516 --75.9563 --75.9391 --75.9469 --75.9563 --75.9484 --75.9437 --75.9516 --75.9484 --75.9359 --75.9469 --75.9313 --75.9547 --75.95 --75.9578 --75.9547 --75.9641 --75.9516 --75.9609 --75.9531 --75.9453 --75.9484 --75.9484 --75.9375 --75.9594 --75.9656 --75.9453 --75.95 --75.9594 --75.9641 --75.9609 --75.9656 --75.9531 --75.9484 --75.9688 --75.9563 --75.9453 --75.9516 --75.9578 --75.9531 --75.9641 --75.9531 --75.9484 --75.9594 --75.9688 --75.9469 --75.9688 --75.9594 --75.9547 --75.9672 --75.9578 --75.9594 --75.9484 --75.9688 --75.9578 --75.9672 --75.9625 --75.9625 --75.9594 --75.95 --75.9484 --75.9625 --75.9641 --75.9594 --75.9484 --75.9703 --75.9641 --75.9594 --75.9734 --75.9719 --75.9766 --75.9688 --75.9609 --75.975 --75.9547 --75.9594 --75.975 --75.9578 --75.9578 --75.9625 --75.975 --75.9672 --75.9578 --75.9672 --75.9766 --75.9594 --75.9625 --75.9672 --75.9781 --75.9734 --75.9781 --75.9703 --75.9734 --75.9578 --75.9703 --75.9688 --75.9688 --75.9688 --75.9703 --75.9641 --75.9734 --75.9812 --75.9703 --75.9594 --75.9641 --75.9656 --75.9641 --75.9641 --75.9766 --75.9609 --75.9688 --75.9625 --75.9469 --75.9641 --75.9641 --75.9688 --75.9734 --75.9703 --75.9656 --75.9625 --75.9594 --75.9688 --75.9734 --75.9812 --75.9609 --75.9766 --75.9609 --75.9656 --75.9641 --75.9828 --75.9688 --75.9734 --75.9531 --75.9875 --75.9719 --75.9828 --75.9594 --75.9688 --75.9703 --75.9828 --75.9906 --75.9734 --75.9719 --75.9641 --75.9781 --75.9641 --75.9797 --75.9703 --75.9828 --75.9703 --75.9766 --75.9781 --75.975 --75.9812 --75.9578 --75.9688 --75.9828 --75.9656 --75.9656 --75.9797 --75.9781 --75.9563 --75.9531 --75.9688 --75.9641 --75.9672 --75.9797 --75.9688 --75.9656 --75.9609 --75.9594 --75.9656 --75.9641 --75.9578 --75.9516 --75.9672 --75.9688 --75.95 --75.9688 --75.9594 --75.9656 --75.9641 --75.9672 --75.9688 --75.9641 --75.9719 --75.9594 --75.9719 --75.9734 --75.9625 --75.9844 --75.9688 --75.9719 --75.9641 --75.9688 --75.9703 --75.9734 --75.9641 --75.9672 --75.975 --75.9703 --75.9453 --75.9578 --75.9719 --75.9641 --75.9734 --75.9828 --75.9734 --75.9766 --75.975 --75.9703 --75.9828 --75.9594 --75.9734 --75.9688 --75.9766 --75.9641 --75.9703 --75.9625 --75.9656 --75.9734 --75.9688 --75.9828 --75.9781 --75.9703 --75.9766 --75.9672 --75.9812 --75.975 --75.9688 --75.9641 --75.9688 --75.9734 --75.9594 --75.9781 --75.9844 --75.9781 --75.9891 --75.975 --75.9719 --75.9578 --75.9812 --75.9688 --75.9703 --75.9688 --75.9734 --75.9578 --75.9703 --75.9766 --75.9641 --75.9656 --75.9625 --75.9531 --75.9578 --75.9594 --75.9672 --75.9703 --75.9594 --75.9703 --75.9719 --75.9609 --75.9734 --75.9781 --75.9859 --75.9797 --75.9812 --75.9688 --75.9703 --75.9781 --75.9578 --75.9828 --75.9828 --75.9781 --75.9734 --75.9938 --75.9641 --75.9641 --75.975 --75.9766 --75.9719 --75.9812 --75.9625 --75.9656 --75.9734 --75.9719 --75.9719 --75.9719 --75.9812 --75.9797 --75.9812 --75.9656 --75.975 --75.9734 --75.9719 --75.9688 --75.9734 --75.9609 --75.9578 --75.9641 --75.975 --75.9609 --75.9781 --75.9781 --75.9875 --75.9781 --75.9703 --75.9516 --75.9656 --75.9656 --75.9578 --75.9688 --75.9734 --75.9766 --75.9656 --75.9594 --75.975 --75.9766 --75.9656 --75.9703 --75.9625 --75.9688 --75.9609 --75.9688 --75.975 --75.9594 --75.9547 --75.9578 --75.9609 --75.9688 --75.9781 --75.9594 --75.9594 --75.9656 --75.9609 --75.9625 --75.9656 --75.9656 --75.9656 --75.9641 --75.975 --75.9672 --75.9672 --75.9656 --75.9656 --75.9625 --75.9625 --75.9812 --75.975 --75.9781 --75.9703 --75.975 --75.9719 --75.9578 --75.9906 --75.9812 --75.975 --75.9594 --75.9797 --75.9672 --75.9672 --75.9625 --75.9672 --75.9859 --75.9672 --75.9828 --75.9563 --75.9734 --75.9719 --75.9609 --75.9703 --75.9688 --75.975 --75.9781 --75.9719 --75.975 --75.9828 --75.9797 --75.9766 --75.9953 --75.9859 --75.9828 --75.9859 --75.9734 --75.9719 --75.9734 --75.9766 --75.9828 --75.9703 --75.9656 --75.9734 --75.9734 --75.9781 --75.975 --75.9797 --75.9766 --75.9656 --75.9641 --75.9844 --75.9688 --75.9688 --75.9703 --75.9688 --75.9609 --75.9766 --75.9766 --75.9719 --75.9797 --75.9688 --75.9594 --75.9812 --75.9766 --75.9828 --75.975 --75.9703 --75.9844 --75.9672 --75.9953 --75.975 --75.9828 --75.9719 --75.9719 --75.9703 --75.9672 --75.975 --75.9781 --75.9844 --75.9828 --75.975 --75.9578 --75.9656 --75.9734 --75.975 --75.9578 --75.9812 --75.9703 --75.9719 --75.9703 --75.9719 --75.9609 --75.9656 --75.9672 --75.9891 --75.9719 --75.9875 --75.9688 --75.9703 --75.9641 --75.9578 --75.9688 --75.9688 --75.9703 --75.9734 --75.9766 --75.9703 --75.975 --75.9734 --75.9688 --75.9797 --75.9594 --75.9641 --75.975 --75.9656 --75.9844 --75.9672 --75.9641 --75.9656 --75.9609 --75.9609 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9547 --75.9672 --75.9641 --75.9734 --75.9625 --75.9734 --75.9703 --75.975 --75.9922 --75.9672 --75.9625 --75.9812 --75.9703 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.975 --75.9766 --75.9906 --75.975 --75.9719 --75.9859 --75.9594 --75.9719 --75.9547 --75.9719 --75.9703 --75.9703 --75.9594 --75.9688 --75.9641 --75.9594 --75.9844 --75.9547 --75.9688 --75.975 --75.9719 --75.9609 --75.9703 --75.9688 --75.9578 --75.9641 --75.9594 --75.9578 --75.975 --75.9656 --75.9688 --75.9625 --75.9531 --75.9563 --75.9641 --75.9594 --75.9641 --75.9609 --75.9578 --75.9719 --75.9547 --75.9563 --75.9703 --75.9672 --75.9578 --75.9734 --75.9734 --75.9594 --75.9656 --75.9578 --75.9516 --75.9578 --75.9563 --75.9563 --75.9609 --75.9516 --75.9688 --75.9422 --75.9516 --75.9688 --75.9656 --75.9641 --75.9547 --75.9531 --75.9734 --75.9578 --75.9469 --75.9625 --75.9594 --75.9375 --75.9594 --75.9641 --75.9625 --75.9531 --75.9422 --75.95 --75.95 --75.9578 --75.9547 --75.9609 --75.9484 --75.9484 --75.9547 --75.9469 --75.9641 --75.9563 --75.9328 --75.9547 --75.95 --75.9578 --75.9563 --75.9531 --75.9563 --75.9359 --75.9594 --75.95 --75.9609 --75.9531 --75.9594 --75.9547 --75.9656 --75.9594 --75.9578 --75.9516 --75.9516 --75.9484 --75.9516 --75.9563 --75.9547 --75.9531 --75.9453 --75.9531 --75.9688 --75.9516 --75.9594 --75.9516 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9609 --75.9703 --75.9734 --75.9609 --75.9672 --75.9531 --75.9625 --75.9625 --75.9563 --75.9734 --75.9656 --75.9641 --75.9578 --75.9656 --75.9563 --75.9656 --75.9672 --75.9625 --75.9688 --75.9594 --75.9641 --75.9688 --75.9656 --75.9625 --75.9812 --75.9594 --75.9672 --75.9656 --75.9547 --75.9563 --75.9594 --75.9703 --75.9641 --75.9688 --75.9531 --75.95 --75.9594 --75.9469 --75.9547 --75.9563 --75.9609 --75.9672 --75.9563 --75.9578 --75.9547 --75.9609 --75.9469 --75.9594 --75.9594 --75.9484 --75.9625 --75.9641 --75.9547 --75.9531 --75.9484 --75.9547 --75.9484 --75.9422 --75.9594 --75.9516 --75.9609 --75.9672 --75.9672 --75.9609 --75.9516 --75.9594 --75.9781 --75.9563 --75.9688 --75.9703 --75.9625 --75.9563 --75.9437 --75.9578 --75.9547 --75.9609 --75.9688 --75.9609 --75.9594 --75.9609 --75.9547 --75.9719 --75.9656 --75.9578 --75.9688 --75.975 --75.9594 --75.9609 --75.9609 --75.9563 --75.9656 --75.9563 --75.9563 --75.9719 --75.9578 --75.9609 --75.9625 --75.9578 --75.9563 --75.9578 --75.9563 --75.95 --75.9594 --75.9594 --75.9594 --75.975 --75.9641 --75.9703 --75.9578 --75.9594 --75.9734 --75.9656 --75.9516 --75.9766 --75.9656 --75.9656 --75.9594 --75.9688 --75.9656 --75.9609 --75.9766 --75.9656 --75.9734 --75.9516 --75.9609 --75.9547 --75.9453 --75.9672 --75.9625 --75.9594 --75.9609 --75.9656 --75.9609 --75.9656 --75.9656 --75.9578 --75.9625 --75.9453 --75.9531 --75.9719 --75.9734 --75.9656 --75.9516 --75.9609 --75.9688 --75.9594 --75.9719 --75.9641 --75.9641 --75.9531 --75.95 --75.9437 --75.9437 --75.9594 --75.9516 --75.9359 --75.9609 --75.9469 --75.9453 --75.9391 --75.9437 --75.9531 --75.9531 --75.9563 --75.9547 --75.9547 --75.9719 --75.9672 --75.9641 --75.9609 --75.9766 --75.9484 --75.9563 --75.9594 --75.9547 --75.9578 --75.9609 --75.9516 --75.9547 --75.9594 --75.9578 --75.9656 --75.9516 --75.9531 --75.9422 --75.9516 --75.9453 --75.95 --75.9625 --75.95 --75.9531 --75.9641 --75.9703 --75.9594 --75.9531 --75.9563 --75.9594 --75.9516 --75.9719 --75.9672 --75.9531 --75.9703 --75.9547 --75.9641 --75.9688 --75.9547 --75.9547 --75.9625 --75.9641 --75.9656 --75.9609 --75.95 --75.9547 --75.9531 --75.9531 --75.9547 --75.9609 --75.9641 --75.9594 --75.9594 --75.9547 --75.9469 --75.9625 --75.9734 --75.9609 --75.9516 --75.975 --75.9672 --75.9594 --75.9609 --75.9609 --75.95 --75.9609 --75.9766 --75.9609 --75.9563 --75.95 --75.9625 --75.9641 --75.9656 --75.9516 --75.9594 --75.9594 --75.9563 --75.9641 --75.9672 --75.9609 - -2 -4.0025 -100.002 - -0 -1 - -0 diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.ft1 b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.ft1 deleted file mode 100644 index e719b1efc1..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf.ses.ft1 +++ /dev/null @@ -1,14 +0,0 @@ -ParmFitness: Unnamed multiple run protocol - FitnessGenerator: iclamp_up - RunStatement: 2, IClamp[0].amp = 0.2 - RegionFitness: soma.v(0.5) - - FitnessGenerator: iclamp_down - RunStatement: 2, IClamp[0].amp = -0.2 - RegionFitness: soma.v(0.5) - - Parameters: - "Ri", 100, 1e+01, 1e+03, 1, 1 - "Cm", 1, 1e-09, 1e+09, 1, 1 - "Rm", 10000, 1e-09, 1e+09, 1, 1 -End ParmFitness diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses deleted file mode 100644 index dfc0ae5919..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses +++ /dev/null @@ -1,36 +0,0 @@ -objectvar save_window_, rvp_ -objectvar scene_vector_[7] -objectvar ocbox_, ocbox_list_, scene_, scene_list_ -{ocbox_list_ = new List() scene_list_ = new List()} - -//Begin MulRunFitter[0] -{ -load_file("mulfit.hoc", "MulRunFitter") -} -{ -ocbox_ = new MulRunFitter(1) -} -{object_push(ocbox_)} -{ -version(6) -ranfac = 2 -fspec = new File("mrf2.ses.ft1") -fdat = new File("mrf2.ses.fd1") -read_data() -build() -} -opt.set_optimizer("MulfitPraxWrap") -{object_push(opt.optimizer)} -{ -nstep = 0 -} -{object_pop()} -{object_pop()} -{ -ocbox_.map("MulRunFitter[0]", 729, 164, 360.96, 199.68) -} -objref ocbox_ -//End MulRunFitter[0] - -objectvar scene_vector_[1] -{doNotify()} diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.fd1 b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.fd1 deleted file mode 100644 index 87faaf872e..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.fd1 +++ /dev/null @@ -1,162026 +0,0 @@ -RegionFitness xdat ydat boundary weight (lines=81008) 1 -|| -40500 -0 -0.005 -0.01 -0.015 -0.02 -0.025 -0.03 -0.035 -0.04 -0.045 -0.05 -0.055 -0.06 -0.065 -0.07 -0.075 -0.08 -0.085 -0.09 -0.095 -0.1 -0.105 -0.11 -0.115 -0.12 -0.125 -0.13 -0.135 -0.14 -0.145 -0.15 -0.155 -0.16 -0.165 -0.17 -0.175 -0.18 -0.185 -0.19 -0.195 -0.2 -0.205 -0.21 -0.215 -0.22 -0.225 -0.23 -0.235 -0.24 -0.245 -0.25 -0.255 -0.26 -0.265 -0.27 -0.275 -0.28 -0.285 -0.29 -0.295 -0.3 -0.305 -0.31 -0.315 -0.32 -0.325 -0.33 -0.335 -0.34 -0.345 -0.35 -0.355 -0.36 -0.365 -0.37 -0.375 -0.38 -0.385 -0.39 -0.395 -0.4 -0.405 -0.41 -0.415 -0.42 -0.425 -0.43 -0.435 -0.44 -0.445 -0.45 -0.455 -0.46 -0.465 -0.47 -0.475 -0.48 -0.485 -0.49 -0.495 -0.5 -0.505 -0.51 -0.515 -0.52 -0.525 -0.53 -0.535 -0.54 -0.545 -0.55 -0.555 -0.56 -0.565 -0.57 -0.575 -0.58 -0.585 -0.59 -0.595 -0.6 -0.605 -0.61 -0.615 -0.62 -0.625 -0.63 -0.635 -0.64 -0.645 -0.65 -0.655 -0.66 -0.665 -0.67 -0.675 -0.68 -0.685 -0.69 -0.695 -0.7 -0.705 -0.71 -0.715 -0.72 -0.725 -0.73 -0.735 -0.74 -0.745 -0.75 -0.755 -0.76 -0.765 -0.77 -0.775 -0.78 -0.785 -0.79 -0.795 -0.8 -0.805 -0.81 -0.815 -0.82 -0.825 -0.83 -0.835 -0.84 -0.845 -0.85 -0.855 -0.86 -0.865 -0.87 -0.875 -0.88 -0.885 -0.89 -0.895 -0.9 -0.905 -0.91 -0.915 -0.92 -0.925 -0.93 -0.935 -0.94 -0.945 -0.95 -0.955 -0.96 -0.965 -0.97 -0.975 -0.98 -0.985 -0.99 -0.995 -1 -1.005 -1.01 -1.015 -1.02 -1.025 -1.03 -1.035 -1.04 -1.045 -1.05 -1.055 -1.06 -1.065 -1.07 -1.075 -1.08 -1.085 -1.09 -1.095 -1.1 -1.105 -1.11 -1.115 -1.12 -1.125 -1.13 -1.135 -1.14 -1.145 -1.15 -1.155 -1.16 -1.165 -1.17 -1.175 -1.18 -1.185 -1.19 -1.195 -1.2 -1.205 -1.21 -1.215 -1.22 -1.225 -1.23 -1.235 -1.24 -1.245 -1.25 -1.255 -1.26 -1.265 -1.27 -1.275 -1.28 -1.285 -1.29 -1.295 -1.3 -1.305 -1.31 -1.315 -1.32 -1.325 -1.33 -1.335 -1.34 -1.345 -1.35 -1.355 -1.36 -1.365 -1.37 -1.375 -1.38 -1.385 -1.39 -1.395 -1.4 -1.405 -1.41 -1.415 -1.42 -1.425 -1.43 -1.435 -1.44 -1.445 -1.45 -1.455 -1.46 -1.465 -1.47 -1.475 -1.48 -1.485 -1.49 -1.495 -1.5 -1.505 -1.51 -1.515 -1.52 -1.525 -1.53 -1.535 -1.54 -1.545 -1.55 -1.555 -1.56 -1.565 -1.57 -1.575 -1.58 -1.585 -1.59 -1.595 -1.6 -1.605 -1.61 -1.615 -1.62 -1.625 -1.63 -1.635 -1.64 -1.645 -1.65 -1.655 -1.66 -1.665 -1.67 -1.675 -1.68 -1.685 -1.69 -1.695 -1.7 -1.705 -1.71 -1.715 -1.72 -1.725 -1.73 -1.735 -1.74 -1.745 -1.75 -1.755 -1.76 -1.765 -1.77 -1.775 -1.78 -1.785 -1.79 -1.795 -1.8 -1.805 -1.81 -1.815 -1.82 -1.825 -1.83 -1.835 -1.84 -1.845 -1.85 -1.855 -1.86 -1.865 -1.87 -1.875 -1.88 -1.885 -1.89 -1.895 -1.9 -1.905 -1.91 -1.915 -1.92 -1.925 -1.93 -1.935 -1.94 -1.945 -1.95 -1.955 -1.96 -1.965 -1.97 -1.975 -1.98 -1.985 -1.99 -1.995 -2 -2.005 -2.01 -2.015 -2.02 -2.025 -2.03 -2.035 -2.04 -2.045 -2.05 -2.055 -2.06 -2.065 -2.07 -2.075 -2.08 -2.085 -2.09 -2.095 -2.1 -2.105 -2.11 -2.115 -2.12 -2.125 -2.13 -2.135 -2.14 -2.145 -2.15 -2.155 -2.16 -2.165 -2.17 -2.175 -2.18 -2.185 -2.19 -2.195 -2.2 -2.205 -2.21 -2.215 -2.22 -2.225 -2.23 -2.235 -2.24 -2.245 -2.25 -2.255 -2.26 -2.265 -2.27 -2.275 -2.28 -2.285 -2.29 -2.295 -2.3 -2.305 -2.31 -2.315 -2.32 -2.325 -2.33 -2.335 -2.34 -2.345 -2.35 -2.355 -2.36 -2.365 -2.37 -2.375 -2.38 -2.385 -2.39 -2.395 -2.4 -2.405 -2.41 -2.415 -2.42 -2.425 -2.43 -2.435 -2.44 -2.445 -2.45 -2.455 -2.46 -2.465 -2.47 -2.475 -2.48 -2.485 -2.49 -2.495 -2.5 -2.505 -2.51 -2.515 -2.52 -2.525 -2.53 -2.535 -2.54 -2.545 -2.55 -2.555 -2.56 -2.565 -2.57 -2.575 -2.58 -2.585 -2.59 -2.595 -2.6 -2.605 -2.61 -2.615 -2.62 -2.625 -2.63 -2.635 -2.64 -2.645 -2.65 -2.655 -2.66 -2.665 -2.67 -2.675 -2.68 -2.685 -2.69 -2.695 -2.7 -2.705 -2.71 -2.715 -2.72 -2.725 -2.73 -2.735 -2.74 -2.745 -2.75 -2.755 -2.76 -2.765 -2.77 -2.775 -2.78 -2.785 -2.79 -2.795 -2.8 -2.805 -2.81 -2.815 -2.82 -2.825 -2.83 -2.835 -2.84 -2.845 -2.85 -2.855 -2.86 -2.865 -2.87 -2.875 -2.88 -2.885 -2.89 -2.895 -2.9 -2.905 -2.91 -2.915 -2.92 -2.925 -2.93 -2.935 -2.94 -2.945 -2.95 -2.955 -2.96 -2.965 -2.97 -2.975 -2.98 -2.985 -2.99 -2.995 -3 -3.005 -3.01 -3.015 -3.02 -3.025 -3.03 -3.035 -3.04 -3.045 -3.05 -3.055 -3.06 -3.065 -3.07 -3.075 -3.08 -3.085 -3.09 -3.095 -3.1 -3.105 -3.11 -3.115 -3.12 -3.125 -3.13 -3.135 -3.14 -3.145 -3.15 -3.155 -3.16 -3.165 -3.17 -3.175 -3.18 -3.185 -3.19 -3.195 -3.2 -3.205 -3.21 -3.215 -3.22 -3.225 -3.23 -3.235 -3.24 -3.245 -3.25 -3.255 -3.26 -3.265 -3.27 -3.275 -3.28 -3.285 -3.29 -3.295 -3.3 -3.305 -3.31 -3.315 -3.32 -3.325 -3.33 -3.335 -3.34 -3.345 -3.35 -3.355 -3.36 -3.365 -3.37 -3.375 -3.38 -3.385 -3.39 -3.395 -3.4 -3.405 -3.41 -3.415 -3.42 -3.425 -3.43 -3.435 -3.44 -3.445 -3.45 -3.455 -3.46 -3.465 -3.47 -3.475 -3.48 -3.485 -3.49 -3.495 -3.5 -3.505 -3.51 -3.515 -3.52 -3.525 -3.53 -3.535 -3.54 -3.545 -3.55 -3.555 -3.56 -3.565 -3.57 -3.575 -3.58 -3.585 -3.59 -3.595 -3.6 -3.605 -3.61 -3.615 -3.62 -3.625 -3.63 -3.635 -3.64 -3.645 -3.65 -3.655 -3.66 -3.665 -3.67 -3.675 -3.68 -3.685 -3.69 -3.695 -3.7 -3.705 -3.71 -3.715 -3.72 -3.725 -3.73 -3.735 -3.74 -3.745 -3.75 -3.755 -3.76 -3.765 -3.77 -3.775 -3.78 -3.785 -3.79 -3.795 -3.8 -3.805 -3.81 -3.815 -3.82 -3.825 -3.83 -3.835 -3.84 -3.845 -3.85 -3.855 -3.86 -3.865 -3.87 -3.875 -3.88 -3.885 -3.89 -3.895 -3.9 -3.905 -3.91 -3.915 -3.92 -3.925 -3.93 -3.935 -3.94 -3.945 -3.95 -3.955 -3.96 -3.965 -3.97 -3.975 -3.98 -3.985 -3.99 -3.995 -4 -4.005 -4.01 -4.015 -4.02 -4.025 -4.03 -4.035 -4.04 -4.045 -4.05 -4.055 -4.06 -4.065 -4.07 -4.075 -4.08 -4.085 -4.09 -4.095 -4.1 -4.105 -4.11 -4.115 -4.12 -4.125 -4.13 -4.135 -4.14 -4.145 -4.15 -4.155 -4.16 -4.165 -4.17 -4.175 -4.18 -4.185 -4.19 -4.195 -4.2 -4.205 -4.21 -4.215 -4.22 -4.225 -4.23 -4.235 -4.24 -4.245 -4.25 -4.255 -4.26 -4.265 -4.27 -4.275 -4.28 -4.285 -4.29 -4.295 -4.3 -4.305 -4.31 -4.315 -4.32 -4.325 -4.33 -4.335 -4.34 -4.345 -4.35 -4.355 -4.36 -4.365 -4.37 -4.375 -4.38 -4.385 -4.39 -4.395 -4.4 -4.405 -4.41 -4.415 -4.42 -4.425 -4.43 -4.435 -4.44 -4.445 -4.45 -4.455 -4.46 -4.465 -4.47 -4.475 -4.48 -4.485 -4.49 -4.495 -4.5 -4.505 -4.51 -4.515 -4.52 -4.525 -4.53 -4.535 -4.54 -4.545 -4.55 -4.555 -4.56 -4.565 -4.57 -4.575 -4.58 -4.585 -4.59 -4.595 -4.6 -4.605 -4.61 -4.615 -4.62 -4.625 -4.63 -4.635 -4.64 -4.645 -4.65 -4.655 -4.66 -4.665 -4.67 -4.675 -4.68 -4.685 -4.69 -4.695 -4.7 -4.705 -4.71 -4.715 -4.72 -4.725 -4.73 -4.735 -4.74 -4.745 -4.75 -4.755 -4.76 -4.765 -4.77 -4.775 -4.78 -4.785 -4.79 -4.795 -4.8 -4.805 -4.81 -4.815 -4.82 -4.825 -4.83 -4.835 -4.84 -4.845 -4.85 -4.855 -4.86 -4.865 -4.87 -4.875 -4.88 -4.885 -4.89 -4.895 -4.9 -4.905 -4.91 -4.915 -4.92 -4.925 -4.93 -4.935 -4.94 -4.945 -4.95 -4.955 -4.96 -4.965 -4.97 -4.975 -4.98 -4.985 -4.99 -4.995 -5 -5.005 -5.01 -5.015 -5.02 -5.025 -5.03 -5.035 -5.04 -5.045 -5.05 -5.055 -5.06 -5.065 -5.07 -5.075 -5.08 -5.085 -5.09 -5.095 -5.1 -5.105 -5.11 -5.115 -5.12 -5.125 -5.13 -5.135 -5.14 -5.145 -5.15 -5.155 -5.16 -5.165 -5.17 -5.175 -5.18 -5.185 -5.19 -5.195 -5.2 -5.205 -5.21 -5.215 -5.22 -5.225 -5.23 -5.235 -5.24 -5.245 -5.25 -5.255 -5.26 -5.265 -5.27 -5.275 -5.28 -5.285 -5.29 -5.295 -5.3 -5.305 -5.31 -5.315 -5.32 -5.325 -5.33 -5.335 -5.34 -5.345 -5.35 -5.355 -5.36 -5.365 -5.37 -5.375 -5.38 -5.385 -5.39 -5.395 -5.4 -5.405 -5.41 -5.415 -5.42 -5.425 -5.43 -5.435 -5.44 -5.445 -5.45 -5.455 -5.46 -5.465 -5.47 -5.475 -5.48 -5.485 -5.49 -5.495 -5.5 -5.505 -5.51 -5.515 -5.52 -5.525 -5.53 -5.535 -5.54 -5.545 -5.55 -5.555 -5.56 -5.565 -5.57 -5.575 -5.58 -5.585 -5.59 -5.595 -5.6 -5.605 -5.61 -5.615 -5.62 -5.625 -5.63 -5.635 -5.64 -5.645 -5.65 -5.655 -5.66 -5.665 -5.67 -5.675 -5.68 -5.685 -5.69 -5.695 -5.7 -5.705 -5.71 -5.715 -5.72 -5.725 -5.73 -5.735 -5.74 -5.745 -5.75 -5.755 -5.76 -5.765 -5.77 -5.775 -5.78 -5.785 -5.79 -5.795 -5.8 -5.805 -5.81 -5.815 -5.82 -5.825 -5.83 -5.835 -5.84 -5.845 -5.85 -5.855 -5.86 -5.865 -5.87 -5.875 -5.88 -5.885 -5.89 -5.895 -5.9 -5.905 -5.91 -5.915 -5.92 -5.925 -5.93 -5.935 -5.94 -5.945 -5.95 -5.955 -5.96 -5.965 -5.97 -5.975 -5.98 -5.985 -5.99 -5.995 -6 -6.005 -6.01 -6.015 -6.02 -6.025 -6.03 -6.035 -6.04 -6.045 -6.05 -6.055 -6.06 -6.065 -6.07 -6.075 -6.08 -6.085 -6.09 -6.095 -6.1 -6.105 -6.11 -6.115 -6.12 -6.125 -6.13 -6.135 -6.14 -6.145 -6.15 -6.155 -6.16 -6.165 -6.17 -6.175 -6.18 -6.185 -6.19 -6.195 -6.2 -6.205 -6.21 -6.215 -6.22 -6.225 -6.23 -6.235 -6.24 -6.245 -6.25 -6.255 -6.26 -6.265 -6.27 -6.275 -6.28 -6.285 -6.29 -6.295 -6.3 -6.305 -6.31 -6.315 -6.32 -6.325 -6.33 -6.335 -6.34 -6.345 -6.35 -6.355 -6.36 -6.365 -6.37 -6.375 -6.38 -6.385 -6.39 -6.395 -6.4 -6.405 -6.41 -6.415 -6.42 -6.425 -6.43 -6.435 -6.44 -6.445 -6.45 -6.455 -6.46 -6.465 -6.47 -6.475 -6.48 -6.485 -6.49 -6.495 -6.5 -6.505 -6.51 -6.515 -6.52 -6.525 -6.53 -6.535 -6.54 -6.545 -6.55 -6.555 -6.56 -6.565 -6.57 -6.575 -6.58 -6.585 -6.59 -6.595 -6.6 -6.605 -6.61 -6.615 -6.62 -6.625 -6.63 -6.635 -6.64 -6.645 -6.65 -6.655 -6.66 -6.665 -6.67 -6.675 -6.68 -6.685 -6.69 -6.695 -6.7 -6.705 -6.71 -6.715 -6.72 -6.725 -6.73 -6.735 -6.74 -6.745 -6.75 -6.755 -6.76 -6.765 -6.77 -6.775 -6.78 -6.785 -6.79 -6.795 -6.8 -6.805 -6.81 -6.815 -6.82 -6.825 -6.83 -6.835 -6.84 -6.845 -6.85 -6.855 -6.86 -6.865 -6.87 -6.875 -6.88 -6.885 -6.89 -6.895 -6.9 -6.905 -6.91 -6.915 -6.92 -6.925 -6.93 -6.935 -6.94 -6.945 -6.95 -6.955 -6.96 -6.965 -6.97 -6.975 -6.98 -6.985 -6.99 -6.995 -7 -7.005 -7.01 -7.015 -7.02 -7.025 -7.03 -7.035 -7.04 -7.045 -7.05 -7.055 -7.06 -7.065 -7.07 -7.075 -7.08 -7.085 -7.09 -7.095 -7.1 -7.105 -7.11 -7.115 -7.12 -7.125 -7.13 -7.135 -7.14 -7.145 -7.15 -7.155 -7.16 -7.165 -7.17 -7.175 -7.18 -7.185 -7.19 -7.195 -7.2 -7.205 -7.21 -7.215 -7.22 -7.225 -7.23 -7.235 -7.24 -7.245 -7.25 -7.255 -7.26 -7.265 -7.27 -7.275 -7.28 -7.285 -7.29 -7.295 -7.3 -7.305 -7.31 -7.315 -7.32 -7.325 -7.33 -7.335 -7.34 -7.345 -7.35 -7.355 -7.36 -7.365 -7.37 -7.375 -7.38 -7.385 -7.39 -7.395 -7.4 -7.405 -7.41 -7.415 -7.42 -7.425 -7.43 -7.435 -7.44 -7.445 -7.45 -7.455 -7.46 -7.465 -7.47 -7.475 -7.48 -7.485 -7.49 -7.495 -7.5 -7.505 -7.51 -7.515 -7.52 -7.525 -7.53 -7.535 -7.54 -7.545 -7.55 -7.555 -7.56 -7.565 -7.57 -7.575 -7.58 -7.585 -7.59 -7.595 -7.6 -7.605 -7.61 -7.615 -7.62 -7.625 -7.63 -7.635 -7.64 -7.645 -7.65 -7.655 -7.66 -7.665 -7.67 -7.675 -7.68 -7.685 -7.69 -7.695 -7.7 -7.705 -7.71 -7.715 -7.72 -7.725 -7.73 -7.735 -7.74 -7.745 -7.75 -7.755 -7.76 -7.765 -7.77 -7.775 -7.78 -7.785 -7.79 -7.795 -7.8 -7.805 -7.81 -7.815 -7.82 -7.825 -7.83 -7.835 -7.84 -7.845 -7.85 -7.855 -7.86 -7.865 -7.87 -7.875 -7.88 -7.885 -7.89 -7.895 -7.9 -7.905 -7.91 -7.915 -7.92 -7.925 -7.93 -7.935 -7.94 -7.945 -7.95 -7.955 -7.96 -7.965 -7.97 -7.975 -7.98 -7.985 -7.99 -7.995 -8 -8.005 -8.01 -8.015 -8.02 -8.025 -8.03 -8.035 -8.04 -8.045 -8.05 -8.055 -8.06 -8.065 -8.07 -8.075 -8.08 -8.085 -8.09 -8.095 -8.1 -8.105 -8.11 -8.115 -8.12 -8.125 -8.13 -8.135 -8.14 -8.145 -8.15 -8.155 -8.16 -8.165 -8.17 -8.175 -8.18 -8.185 -8.19 -8.195 -8.2 -8.205 -8.21 -8.215 -8.22 -8.225 -8.23 -8.235 -8.24 -8.245 -8.25 -8.255 -8.26 -8.265 -8.27 -8.275 -8.28 -8.285 -8.29 -8.295 -8.3 -8.305 -8.31 -8.315 -8.32 -8.325 -8.33 -8.335 -8.34 -8.345 -8.35 -8.355 -8.36 -8.365 -8.37 -8.375 -8.38 -8.385 -8.39 -8.395 -8.4 -8.405 -8.41 -8.415 -8.42 -8.425 -8.43 -8.435 -8.44 -8.445 -8.45 -8.455 -8.46 -8.465 -8.47 -8.475 -8.48 -8.485 -8.49 -8.495 -8.5 -8.505 -8.51 -8.515 -8.52 -8.525 -8.53 -8.535 -8.54 -8.545 -8.55 -8.555 -8.56 -8.565 -8.57 -8.575 -8.58 -8.585 -8.59 -8.595 -8.6 -8.605 -8.61 -8.615 -8.62 -8.625 -8.63 -8.635 -8.64 -8.645 -8.65 -8.655 -8.66 -8.665 -8.67 -8.675 -8.68 -8.685 -8.69 -8.695 -8.7 -8.705 -8.71 -8.715 -8.72 -8.725 -8.73 -8.735 -8.74 -8.745 -8.75 -8.755 -8.76 -8.765 -8.77 -8.775 -8.78 -8.785 -8.79 -8.795 -8.8 -8.805 -8.81 -8.815 -8.82 -8.825 -8.83 -8.835 -8.84 -8.845 -8.85 -8.855 -8.86 -8.865 -8.87 -8.875 -8.88 -8.885 -8.89 -8.895 -8.9 -8.905 -8.91 -8.915 -8.92 -8.925 -8.93 -8.935 -8.94 -8.945 -8.95 -8.955 -8.96 -8.965 -8.97 -8.975 -8.98 -8.985 -8.99 -8.995 -9 -9.005 -9.01 -9.015 -9.02 -9.025 -9.03 -9.035 -9.04 -9.045 -9.05 -9.055 -9.06 -9.065 -9.07 -9.075 -9.08 -9.085 -9.09 -9.095 -9.1 -9.105 -9.11 -9.115 -9.12 -9.125 -9.13 -9.135 -9.14 -9.145 -9.15 -9.155 -9.16 -9.165 -9.17 -9.175 -9.18 -9.185 -9.19 -9.195 -9.2 -9.205 -9.21 -9.215 -9.22 -9.225 -9.23 -9.235 -9.24 -9.245 -9.25 -9.255 -9.26 -9.265 -9.27 -9.275 -9.28 -9.285 -9.29 -9.295 -9.3 -9.305 -9.31 -9.315 -9.32 -9.325 -9.33 -9.335 -9.34 -9.345 -9.35 -9.355 -9.36 -9.365 -9.37 -9.375 -9.38 -9.385 -9.39 -9.395 -9.4 -9.405 -9.41 -9.415 -9.42 -9.425 -9.43 -9.435 -9.44 -9.445 -9.45 -9.455 -9.46 -9.465 -9.47 -9.475 -9.48 -9.485 -9.49 -9.495 -9.5 -9.505 -9.51 -9.515 -9.52 -9.525 -9.53 -9.535 -9.54 -9.545 -9.55 -9.555 -9.56 -9.565 -9.57 -9.575 -9.58 -9.585 -9.59 -9.595 -9.6 -9.605 -9.61 -9.615 -9.62 -9.625 -9.63 -9.635 -9.64 -9.645 -9.65 -9.655 -9.66 -9.665 -9.67 -9.675 -9.68 -9.685 -9.69 -9.695 -9.7 -9.705 -9.71 -9.715 -9.72 -9.725 -9.73 -9.735 -9.74 -9.745 -9.75 -9.755 -9.76 -9.765 -9.77 -9.775 -9.78 -9.785 -9.79 -9.795 -9.8 -9.805 -9.81 -9.815 -9.82 -9.825 -9.83 -9.835 -9.84 -9.845 -9.85 -9.855 -9.86 -9.865 -9.87 -9.875 -9.88 -9.885 -9.89 -9.895 -9.9 -9.905 -9.91 -9.915 -9.92 -9.925 -9.93 -9.935 -9.94 -9.945 -9.95 -9.955 -9.96 -9.965 -9.97 -9.975 -9.98 -9.985 -9.99 -9.995 -10 -10.005 -10.01 -10.015 -10.02 -10.025 -10.03 -10.035 -10.04 -10.045 -10.05 -10.055 -10.06 -10.065 -10.07 -10.075 -10.08 -10.085 -10.09 -10.095 -10.1 -10.105 -10.11 -10.115 -10.12 -10.125 -10.13 -10.135 -10.14 -10.145 -10.15 -10.155 -10.16 -10.165 -10.17 -10.175 -10.18 -10.185 -10.19 -10.195 -10.2 -10.205 -10.21 -10.215 -10.22 -10.225 -10.23 -10.235 -10.24 -10.245 -10.25 -10.255 -10.26 -10.265 -10.27 -10.275 -10.28 -10.285 -10.29 -10.295 -10.3 -10.305 -10.31 -10.315 -10.32 -10.325 -10.33 -10.335 -10.34 -10.345 -10.35 -10.355 -10.36 -10.365 -10.37 -10.375 -10.38 -10.385 -10.39 -10.395 -10.4 -10.405 -10.41 -10.415 -10.42 -10.425 -10.43 -10.435 -10.44 -10.445 -10.45 -10.455 -10.46 -10.465 -10.47 -10.475 -10.48 -10.485 -10.49 -10.495 -10.5 -10.505 -10.51 -10.515 -10.52 -10.525 -10.53 -10.535 -10.54 -10.545 -10.55 -10.555 -10.56 -10.565 -10.57 -10.575 -10.58 -10.585 -10.59 -10.595 -10.6 -10.605 -10.61 -10.615 -10.62 -10.625 -10.63 -10.635 -10.64 -10.645 -10.65 -10.655 -10.66 -10.665 -10.67 -10.675 -10.68 -10.685 -10.69 -10.695 -10.7 -10.705 -10.71 -10.715 -10.72 -10.725 -10.73 -10.735 -10.74 -10.745 -10.75 -10.755 -10.76 -10.765 -10.77 -10.775 -10.78 -10.785 -10.79 -10.795 -10.8 -10.805 -10.81 -10.815 -10.82 -10.825 -10.83 -10.835 -10.84 -10.845 -10.85 -10.855 -10.86 -10.865 -10.87 -10.875 -10.88 -10.885 -10.89 -10.895 -10.9 -10.905 -10.91 -10.915 -10.92 -10.925 -10.93 -10.935 -10.94 -10.945 -10.95 -10.955 -10.96 -10.965 -10.97 -10.975 -10.98 -10.985 -10.99 -10.995 -11 -11.005 -11.01 -11.015 -11.02 -11.025 -11.03 -11.035 -11.04 -11.045 -11.05 -11.055 -11.06 -11.065 -11.07 -11.075 -11.08 -11.085 -11.09 -11.095 -11.1 -11.105 -11.11 -11.115 -11.12 -11.125 -11.13 -11.135 -11.14 -11.145 -11.15 -11.155 -11.16 -11.165 -11.17 -11.175 -11.18 -11.185 -11.19 -11.195 -11.2 -11.205 -11.21 -11.215 -11.22 -11.225 -11.23 -11.235 -11.24 -11.245 -11.25 -11.255 -11.26 -11.265 -11.27 -11.275 -11.28 -11.285 -11.29 -11.295 -11.3 -11.305 -11.31 -11.315 -11.32 -11.325 -11.33 -11.335 -11.34 -11.345 -11.35 -11.355 -11.36 -11.365 -11.37 -11.375 -11.38 -11.385 -11.39 -11.395 -11.4 -11.405 -11.41 -11.415 -11.42 -11.425 -11.43 -11.435 -11.44 -11.445 -11.45 -11.455 -11.46 -11.465 -11.47 -11.475 -11.48 -11.485 -11.49 -11.495 -11.5 -11.505 -11.51 -11.515 -11.52 -11.525 -11.53 -11.535 -11.54 -11.545 -11.55 -11.555 -11.56 -11.565 -11.57 -11.575 -11.58 -11.585 -11.59 -11.595 -11.6 -11.605 -11.61 -11.615 -11.62 -11.625 -11.63 -11.635 -11.64 -11.645 -11.65 -11.655 -11.66 -11.665 -11.67 -11.675 -11.68 -11.685 -11.69 -11.695 -11.7 -11.705 -11.71 -11.715 -11.72 -11.725 -11.73 -11.735 -11.74 -11.745 -11.75 -11.755 -11.76 -11.765 -11.77 -11.775 -11.78 -11.785 -11.79 -11.795 -11.8 -11.805 -11.81 -11.815 -11.82 -11.825 -11.83 -11.835 -11.84 -11.845 -11.85 -11.855 -11.86 -11.865 -11.87 -11.875 -11.88 -11.885 -11.89 -11.895 -11.9 -11.905 -11.91 -11.915 -11.92 -11.925 -11.93 -11.935 -11.94 -11.945 -11.95 -11.955 -11.96 -11.965 -11.97 -11.975 -11.98 -11.985 -11.99 -11.995 -12 -12.005 -12.01 -12.015 -12.02 -12.025 -12.03 -12.035 -12.04 -12.045 -12.05 -12.055 -12.06 -12.065 -12.07 -12.075 -12.08 -12.085 -12.09 -12.095 -12.1 -12.105 -12.11 -12.115 -12.12 -12.125 -12.13 -12.135 -12.14 -12.145 -12.15 -12.155 -12.16 -12.165 -12.17 -12.175 -12.18 -12.185 -12.19 -12.195 -12.2 -12.205 -12.21 -12.215 -12.22 -12.225 -12.23 -12.235 -12.24 -12.245 -12.25 -12.255 -12.26 -12.265 -12.27 -12.275 -12.28 -12.285 -12.29 -12.295 -12.3 -12.305 -12.31 -12.315 -12.32 -12.325 -12.33 -12.335 -12.34 -12.345 -12.35 -12.355 -12.36 -12.365 -12.37 -12.375 -12.38 -12.385 -12.39 -12.395 -12.4 -12.405 -12.41 -12.415 -12.42 -12.425 -12.43 -12.435 -12.44 -12.445 -12.45 -12.455 -12.46 -12.465 -12.47 -12.475 -12.48 -12.485 -12.49 -12.495 -12.5 -12.505 -12.51 -12.515 -12.52 -12.525 -12.53 -12.535 -12.54 -12.545 -12.55 -12.555 -12.56 -12.565 -12.57 -12.575 -12.58 -12.585 -12.59 -12.595 -12.6 -12.605 -12.61 -12.615 -12.62 -12.625 -12.63 -12.635 -12.64 -12.645 -12.65 -12.655 -12.66 -12.665 -12.67 -12.675 -12.68 -12.685 -12.69 -12.695 -12.7 -12.705 -12.71 -12.715 -12.72 -12.725 -12.73 -12.735 -12.74 -12.745 -12.75 -12.755 -12.76 -12.765 -12.77 -12.775 -12.78 -12.785 -12.79 -12.795 -12.8 -12.805 -12.81 -12.815 -12.82 -12.825 -12.83 -12.835 -12.84 -12.845 -12.85 -12.855 -12.86 -12.865 -12.87 -12.875 -12.88 -12.885 -12.89 -12.895 -12.9 -12.905 -12.91 -12.915 -12.92 -12.925 -12.93 -12.935 -12.94 -12.945 -12.95 -12.955 -12.96 -12.965 -12.97 -12.975 -12.98 -12.985 -12.99 -12.995 -13 -13.005 -13.01 -13.015 -13.02 -13.025 -13.03 -13.035 -13.04 -13.045 -13.05 -13.055 -13.06 -13.065 -13.07 -13.075 -13.08 -13.085 -13.09 -13.095 -13.1 -13.105 -13.11 -13.115 -13.12 -13.125 -13.13 -13.135 -13.14 -13.145 -13.15 -13.155 -13.16 -13.165 -13.17 -13.175 -13.18 -13.185 -13.19 -13.195 -13.2 -13.205 -13.21 -13.215 -13.22 -13.225 -13.23 -13.235 -13.24 -13.245 -13.25 -13.255 -13.26 -13.265 -13.27 -13.275 -13.28 -13.285 -13.29 -13.295 -13.3 -13.305 -13.31 -13.315 -13.32 -13.325 -13.33 -13.335 -13.34 -13.345 -13.35 -13.355 -13.36 -13.365 -13.37 -13.375 -13.38 -13.385 -13.39 -13.395 -13.4 -13.405 -13.41 -13.415 -13.42 -13.425 -13.43 -13.435 -13.44 -13.445 -13.45 -13.455 -13.46 -13.465 -13.47 -13.475 -13.48 -13.485 -13.49 -13.495 -13.5 -13.505 -13.51 -13.515 -13.52 -13.525 -13.53 -13.535 -13.54 -13.545 -13.55 -13.555 -13.56 -13.565 -13.57 -13.575 -13.58 -13.585 -13.59 -13.595 -13.6 -13.605 -13.61 -13.615 -13.62 -13.625 -13.63 -13.635 -13.64 -13.645 -13.65 -13.655 -13.66 -13.665 -13.67 -13.675 -13.68 -13.685 -13.69 -13.695 -13.7 -13.705 -13.71 -13.715 -13.72 -13.725 -13.73 -13.735 -13.74 -13.745 -13.75 -13.755 -13.76 -13.765 -13.77 -13.775 -13.78 -13.785 -13.79 -13.795 -13.8 -13.805 -13.81 -13.815 -13.82 -13.825 -13.83 -13.835 -13.84 -13.845 -13.85 -13.855 -13.86 -13.865 -13.87 -13.875 -13.88 -13.885 -13.89 -13.895 -13.9 -13.905 -13.91 -13.915 -13.92 -13.925 -13.93 -13.935 -13.94 -13.945 -13.95 -13.955 -13.96 -13.965 -13.97 -13.975 -13.98 -13.985 -13.99 -13.995 -14 -14.005 -14.01 -14.015 -14.02 -14.025 -14.03 -14.035 -14.04 -14.045 -14.05 -14.055 -14.06 -14.065 -14.07 -14.075 -14.08 -14.085 -14.09 -14.095 -14.1 -14.105 -14.11 -14.115 -14.12 -14.125 -14.13 -14.135 -14.14 -14.145 -14.15 -14.155 -14.16 -14.165 -14.17 -14.175 -14.18 -14.185 -14.19 -14.195 -14.2 -14.205 -14.21 -14.215 -14.22 -14.225 -14.23 -14.235 -14.24 -14.245 -14.25 -14.255 -14.26 -14.265 -14.27 -14.275 -14.28 -14.285 -14.29 -14.295 -14.3 -14.305 -14.31 -14.315 -14.32 -14.325 -14.33 -14.335 -14.34 -14.345 -14.35 -14.355 -14.36 -14.365 -14.37 -14.375 -14.38 -14.385 -14.39 -14.395 -14.4 -14.405 -14.41 -14.415 -14.42 -14.425 -14.43 -14.435 -14.44 -14.445 -14.45 -14.455 -14.46 -14.465 -14.47 -14.475 -14.48 -14.485 -14.49 -14.495 -14.5 -14.505 -14.51 -14.515 -14.52 -14.525 -14.53 -14.535 -14.54 -14.545 -14.55 -14.555 -14.56 -14.565 -14.57 -14.575 -14.58 -14.585 -14.59 -14.595 -14.6 -14.605 -14.61 -14.615 -14.62 -14.625 -14.63 -14.635 -14.64 -14.645 -14.65 -14.655 -14.66 -14.665 -14.67 -14.675 -14.68 -14.685 -14.69 -14.695 -14.7 -14.705 -14.71 -14.715 -14.72 -14.725 -14.73 -14.735 -14.74 -14.745 -14.75 -14.755 -14.76 -14.765 -14.77 -14.775 -14.78 -14.785 -14.79 -14.795 -14.8 -14.805 -14.81 -14.815 -14.82 -14.825 -14.83 -14.835 -14.84 -14.845 -14.85 -14.855 -14.86 -14.865 -14.87 -14.875 -14.88 -14.885 -14.89 -14.895 -14.9 -14.905 -14.91 -14.915 -14.92 -14.925 -14.93 -14.935 -14.94 -14.945 -14.95 -14.955 -14.96 -14.965 -14.97 -14.975 -14.98 -14.985 -14.99 -14.995 -15 -15.005 -15.01 -15.015 -15.02 -15.025 -15.03 -15.035 -15.04 -15.045 -15.05 -15.055 -15.06 -15.065 -15.07 -15.075 -15.08 -15.085 -15.09 -15.095 -15.1 -15.105 -15.11 -15.115 -15.12 -15.125 -15.13 -15.135 -15.14 -15.145 -15.15 -15.155 -15.16 -15.165 -15.17 -15.175 -15.18 -15.185 -15.19 -15.195 -15.2 -15.205 -15.21 -15.215 -15.22 -15.225 -15.23 -15.235 -15.24 -15.245 -15.25 -15.255 -15.26 -15.265 -15.27 -15.275 -15.28 -15.285 -15.29 -15.295 -15.3 -15.305 -15.31 -15.315 -15.32 -15.325 -15.33 -15.335 -15.34 -15.345 -15.35 -15.355 -15.36 -15.365 -15.37 -15.375 -15.38 -15.385 -15.39 -15.395 -15.4 -15.405 -15.41 -15.415 -15.42 -15.425 -15.43 -15.435 -15.44 -15.445 -15.45 -15.455 -15.46 -15.465 -15.47 -15.475 -15.48 -15.485 -15.49 -15.495 -15.5 -15.505 -15.51 -15.515 -15.52 -15.525 -15.53 -15.535 -15.54 -15.545 -15.55 -15.555 -15.56 -15.565 -15.57 -15.575 -15.58 -15.585 -15.59 -15.595 -15.6 -15.605 -15.61 -15.615 -15.62 -15.625 -15.63 -15.635 -15.64 -15.645 -15.65 -15.655 -15.66 -15.665 -15.67 -15.675 -15.68 -15.685 -15.69 -15.695 -15.7 -15.705 -15.71 -15.715 -15.72 -15.725 -15.73 -15.735 -15.74 -15.745 -15.75 -15.755 -15.76 -15.765 -15.77 -15.775 -15.78 -15.785 -15.79 -15.795 -15.8 -15.805 -15.81 -15.815 -15.82 -15.825 -15.83 -15.835 -15.84 -15.845 -15.85 -15.855 -15.86 -15.865 -15.87 -15.875 -15.88 -15.885 -15.89 -15.895 -15.9 -15.905 -15.91 -15.915 -15.92 -15.925 -15.93 -15.935 -15.94 -15.945 -15.95 -15.955 -15.96 -15.965 -15.97 -15.975 -15.98 -15.985 -15.99 -15.995 -16 -16.005 -16.01 -16.015 -16.02 -16.025 -16.03 -16.035 -16.04 -16.045 -16.05 -16.055 -16.06 -16.065 -16.07 -16.075 -16.08 -16.085 -16.09 -16.095 -16.1 -16.105 -16.11 -16.115 -16.12 -16.125 -16.13 -16.135 -16.14 -16.145 -16.15 -16.155 -16.16 -16.165 -16.17 -16.175 -16.18 -16.185 -16.19 -16.195 -16.2 -16.205 -16.21 -16.215 -16.22 -16.225 -16.23 -16.235 -16.24 -16.245 -16.25 -16.255 -16.26 -16.265 -16.27 -16.275 -16.28 -16.285 -16.29 -16.295 -16.3 -16.305 -16.31 -16.315 -16.32 -16.325 -16.33 -16.335 -16.34 -16.345 -16.35 -16.355 -16.36 -16.365 -16.37 -16.375 -16.38 -16.385 -16.39 -16.395 -16.4 -16.405 -16.41 -16.415 -16.42 -16.425 -16.43 -16.435 -16.44 -16.445 -16.45 -16.455 -16.46 -16.465 -16.47 -16.475 -16.48 -16.485 -16.49 -16.495 -16.5 -16.505 -16.51 -16.515 -16.52 -16.525 -16.53 -16.535 -16.54 -16.545 -16.55 -16.555 -16.56 -16.565 -16.57 -16.575 -16.58 -16.585 -16.59 -16.595 -16.6 -16.605 -16.61 -16.615 -16.62 -16.625 -16.63 -16.635 -16.64 -16.645 -16.65 -16.655 -16.66 -16.665 -16.67 -16.675 -16.68 -16.685 -16.69 -16.695 -16.7 -16.705 -16.71 -16.715 -16.72 -16.725 -16.73 -16.735 -16.74 -16.745 -16.75 -16.755 -16.76 -16.765 -16.77 -16.775 -16.78 -16.785 -16.79 -16.795 -16.8 -16.805 -16.81 -16.815 -16.82 -16.825 -16.83 -16.835 -16.84 -16.845 -16.85 -16.855 -16.86 -16.865 -16.87 -16.875 -16.88 -16.885 -16.89 -16.895 -16.9 -16.905 -16.91 -16.915 -16.92 -16.925 -16.93 -16.935 -16.94 -16.945 -16.95 -16.955 -16.96 -16.965 -16.97 -16.975 -16.98 -16.985 -16.99 -16.995 -17 -17.005 -17.01 -17.015 -17.02 -17.025 -17.03 -17.035 -17.04 -17.045 -17.05 -17.055 -17.06 -17.065 -17.07 -17.075 -17.08 -17.085 -17.09 -17.095 -17.1 -17.105 -17.11 -17.115 -17.12 -17.125 -17.13 -17.135 -17.14 -17.145 -17.15 -17.155 -17.16 -17.165 -17.17 -17.175 -17.18 -17.185 -17.19 -17.195 -17.2 -17.205 -17.21 -17.215 -17.22 -17.225 -17.23 -17.235 -17.24 -17.245 -17.25 -17.255 -17.26 -17.265 -17.27 -17.275 -17.28 -17.285 -17.29 -17.295 -17.3 -17.305 -17.31 -17.315 -17.32 -17.325 -17.33 -17.335 -17.34 -17.345 -17.35 -17.355 -17.36 -17.365 -17.37 -17.375 -17.38 -17.385 -17.39 -17.395 -17.4 -17.405 -17.41 -17.415 -17.42 -17.425 -17.43 -17.435 -17.44 -17.445 -17.45 -17.455 -17.46 -17.465 -17.47 -17.475 -17.48 -17.485 -17.49 -17.495 -17.5 -17.505 -17.51 -17.515 -17.52 -17.525 -17.53 -17.535 -17.54 -17.545 -17.55 -17.555 -17.56 -17.565 -17.57 -17.575 -17.58 -17.585 -17.59 -17.595 -17.6 -17.605 -17.61 -17.615 -17.62 -17.625 -17.63 -17.635 -17.64 -17.645 -17.65 -17.655 -17.66 -17.665 -17.67 -17.675 -17.68 -17.685 -17.69 -17.695 -17.7 -17.705 -17.71 -17.715 -17.72 -17.725 -17.73 -17.735 -17.74 -17.745 -17.75 -17.755 -17.76 -17.765 -17.77 -17.775 -17.78 -17.785 -17.79 -17.795 -17.8 -17.805 -17.81 -17.815 -17.82 -17.825 -17.83 -17.835 -17.84 -17.845 -17.85 -17.855 -17.86 -17.865 -17.87 -17.875 -17.88 -17.885 -17.89 -17.895 -17.9 -17.905 -17.91 -17.915 -17.92 -17.925 -17.93 -17.935 -17.94 -17.945 -17.95 -17.955 -17.96 -17.965 -17.97 -17.975 -17.98 -17.985 -17.99 -17.995 -18 -18.005 -18.01 -18.015 -18.02 -18.025 -18.03 -18.035 -18.04 -18.045 -18.05 -18.055 -18.06 -18.065 -18.07 -18.075 -18.08 -18.085 -18.09 -18.095 -18.1 -18.105 -18.11 -18.115 -18.12 -18.125 -18.13 -18.135 -18.14 -18.145 -18.15 -18.155 -18.16 -18.165 -18.17 -18.175 -18.18 -18.185 -18.19 -18.195 -18.2 -18.205 -18.21 -18.215 -18.22 -18.225 -18.23 -18.235 -18.24 -18.245 -18.25 -18.255 -18.26 -18.265 -18.27 -18.275 -18.28 -18.285 -18.29 -18.295 -18.3 -18.305 -18.31 -18.315 -18.32 -18.325 -18.33 -18.335 -18.34 -18.345 -18.35 -18.355 -18.36 -18.365 -18.37 -18.375 -18.38 -18.385 -18.39 -18.395 -18.4 -18.405 -18.41 -18.415 -18.42 -18.425 -18.43 -18.435 -18.44 -18.445 -18.45 -18.455 -18.46 -18.465 -18.47 -18.475 -18.48 -18.485 -18.49 -18.495 -18.5 -18.505 -18.51 -18.515 -18.52 -18.525 -18.53 -18.535 -18.54 -18.545 -18.55 -18.555 -18.56 -18.565 -18.57 -18.575 -18.58 -18.585 -18.59 -18.595 -18.6 -18.605 -18.61 -18.615 -18.62 -18.625 -18.63 -18.635 -18.64 -18.645 -18.65 -18.655 -18.66 -18.665 -18.67 -18.675 -18.68 -18.685 -18.69 -18.695 -18.7 -18.705 -18.71 -18.715 -18.72 -18.725 -18.73 -18.735 -18.74 -18.745 -18.75 -18.755 -18.76 -18.765 -18.77 -18.775 -18.78 -18.785 -18.79 -18.795 -18.8 -18.805 -18.81 -18.815 -18.82 -18.825 -18.83 -18.835 -18.84 -18.845 -18.85 -18.855 -18.86 -18.865 -18.87 -18.875 -18.88 -18.885 -18.89 -18.895 -18.9 -18.905 -18.91 -18.915 -18.92 -18.925 -18.93 -18.935 -18.94 -18.945 -18.95 -18.955 -18.96 -18.965 -18.97 -18.975 -18.98 -18.985 -18.99 -18.995 -19 -19.005 -19.01 -19.015 -19.02 -19.025 -19.03 -19.035 -19.04 -19.045 -19.05 -19.055 -19.06 -19.065 -19.07 -19.075 -19.08 -19.085 -19.09 -19.095 -19.1 -19.105 -19.11 -19.115 -19.12 -19.125 -19.13 -19.135 -19.14 -19.145 -19.15 -19.155 -19.16 -19.165 -19.17 -19.175 -19.18 -19.185 -19.19 -19.195 -19.2 -19.205 -19.21 -19.215 -19.22 -19.225 -19.23 -19.235 -19.24 -19.245 -19.25 -19.255 -19.26 -19.265 -19.27 -19.275 -19.28 -19.285 -19.29 -19.295 -19.3 -19.305 -19.31 -19.315 -19.32 -19.325 -19.33 -19.335 -19.34 -19.345 -19.35 -19.355 -19.36 -19.365 -19.37 -19.375 -19.38 -19.385 -19.39 -19.395 -19.4 -19.405 -19.41 -19.415 -19.42 -19.425 -19.43 -19.435 -19.44 -19.445 -19.45 -19.455 -19.46 -19.465 -19.47 -19.475 -19.48 -19.485 -19.49 -19.495 -19.5 -19.505 -19.51 -19.515 -19.52 -19.525 -19.53 -19.535 -19.54 -19.545 -19.55 -19.555 -19.56 -19.565 -19.57 -19.575 -19.58 -19.585 -19.59 -19.595 -19.6 -19.605 -19.61 -19.615 -19.62 -19.625 -19.63 -19.635 -19.64 -19.645 -19.65 -19.655 -19.66 -19.665 -19.67 -19.675 -19.68 -19.685 -19.69 -19.695 -19.7 -19.705 -19.71 -19.715 -19.72 -19.725 -19.73 -19.735 -19.74 -19.745 -19.75 -19.755 -19.76 -19.765 -19.77 -19.775 -19.78 -19.785 -19.79 -19.795 -19.8 -19.805 -19.81 -19.815 -19.82 -19.825 -19.83 -19.835 -19.84 -19.845 -19.85 -19.855 -19.86 -19.865 -19.87 -19.875 -19.88 -19.885 -19.89 -19.895 -19.9 -19.905 -19.91 -19.915 -19.92 -19.925 -19.93 -19.935 -19.94 -19.945 -19.95 -19.955 -19.96 -19.965 -19.97 -19.975 -19.98 -19.985 -19.99 -19.995 -20 -20.005 -20.01 -20.015 -20.02 -20.025 -20.03 -20.035 -20.04 -20.045 -20.05 -20.055 -20.06 -20.065 -20.07 -20.075 -20.08 -20.085 -20.09 -20.095 -20.1 -20.105 -20.11 -20.115 -20.12 -20.125 -20.13 -20.135 -20.14 -20.145 -20.15 -20.155 -20.16 -20.165 -20.17 -20.175 -20.18 -20.185 -20.19 -20.195 -20.2 -20.205 -20.21 -20.215 -20.22 -20.225 -20.23 -20.235 -20.24 -20.245 -20.25 -20.255 -20.26 -20.265 -20.27 -20.275 -20.28 -20.285 -20.29 -20.295 -20.3 -20.305 -20.31 -20.315 -20.32 -20.325 -20.33 -20.335 -20.34 -20.345 -20.35 -20.355 -20.36 -20.365 -20.37 -20.375 -20.38 -20.385 -20.39 -20.395 -20.4 -20.405 -20.41 -20.415 -20.42 -20.425 -20.43 -20.435 -20.44 -20.445 -20.45 -20.455 -20.46 -20.465 -20.47 -20.475 -20.48 -20.485 -20.49 -20.495 -20.5 -20.505 -20.51 -20.515 -20.52 -20.525 -20.53 -20.535 -20.54 -20.545 -20.55 -20.555 -20.56 -20.565 -20.57 -20.575 -20.58 -20.585 -20.59 -20.595 -20.6 -20.605 -20.61 -20.615 -20.62 -20.625 -20.63 -20.635 -20.64 -20.645 -20.65 -20.655 -20.66 -20.665 -20.67 -20.675 -20.68 -20.685 -20.69 -20.695 -20.7 -20.705 -20.71 -20.715 -20.72 -20.725 -20.73 -20.735 -20.74 -20.745 -20.75 -20.755 -20.76 -20.765 -20.77 -20.775 -20.78 -20.785 -20.79 -20.795 -20.8 -20.805 -20.81 -20.815 -20.82 -20.825 -20.83 -20.835 -20.84 -20.845 -20.85 -20.855 -20.86 -20.865 -20.87 -20.875 -20.88 -20.885 -20.89 -20.895 -20.9 -20.905 -20.91 -20.915 -20.92 -20.925 -20.93 -20.935 -20.94 -20.945 -20.95 -20.955 -20.96 -20.965 -20.97 -20.975 -20.98 -20.985 -20.99 -20.995 -21 -21.005 -21.01 -21.015 -21.02 -21.025 -21.03 -21.035 -21.04 -21.045 -21.05 -21.055 -21.06 -21.065 -21.07 -21.075 -21.08 -21.085 -21.09 -21.095 -21.1 -21.105 -21.11 -21.115 -21.12 -21.125 -21.13 -21.135 -21.14 -21.145 -21.15 -21.155 -21.16 -21.165 -21.17 -21.175 -21.18 -21.185 -21.19 -21.195 -21.2 -21.205 -21.21 -21.215 -21.22 -21.225 -21.23 -21.235 -21.24 -21.245 -21.25 -21.255 -21.26 -21.265 -21.27 -21.275 -21.28 -21.285 -21.29 -21.295 -21.3 -21.305 -21.31 -21.315 -21.32 -21.325 -21.33 -21.335 -21.34 -21.345 -21.35 -21.355 -21.36 -21.365 -21.37 -21.375 -21.38 -21.385 -21.39 -21.395 -21.4 -21.405 -21.41 -21.415 -21.42 -21.425 -21.43 -21.435 -21.44 -21.445 -21.45 -21.455 -21.46 -21.465 -21.47 -21.475 -21.48 -21.485 -21.49 -21.495 -21.5 -21.505 -21.51 -21.515 -21.52 -21.525 -21.53 -21.535 -21.54 -21.545 -21.55 -21.555 -21.56 -21.565 -21.57 -21.575 -21.58 -21.585 -21.59 -21.595 -21.6 -21.605 -21.61 -21.615 -21.62 -21.625 -21.63 -21.635 -21.64 -21.645 -21.65 -21.655 -21.66 -21.665 -21.67 -21.675 -21.68 -21.685 -21.69 -21.695 -21.7 -21.705 -21.71 -21.715 -21.72 -21.725 -21.73 -21.735 -21.74 -21.745 -21.75 -21.755 -21.76 -21.765 -21.77 -21.775 -21.78 -21.785 -21.79 -21.795 -21.8 -21.805 -21.81 -21.815 -21.82 -21.825 -21.83 -21.835 -21.84 -21.845 -21.85 -21.855 -21.86 -21.865 -21.87 -21.875 -21.88 -21.885 -21.89 -21.895 -21.9 -21.905 -21.91 -21.915 -21.92 -21.925 -21.93 -21.935 -21.94 -21.945 -21.95 -21.955 -21.96 -21.965 -21.97 -21.975 -21.98 -21.985 -21.99 -21.995 -22 -22.005 -22.01 -22.015 -22.02 -22.025 -22.03 -22.035 -22.04 -22.045 -22.05 -22.055 -22.06 -22.065 -22.07 -22.075 -22.08 -22.085 -22.09 -22.095 -22.1 -22.105 -22.11 -22.115 -22.12 -22.125 -22.13 -22.135 -22.14 -22.145 -22.15 -22.155 -22.16 -22.165 -22.17 -22.175 -22.18 -22.185 -22.19 -22.195 -22.2 -22.205 -22.21 -22.215 -22.22 -22.225 -22.23 -22.235 -22.24 -22.245 -22.25 -22.255 -22.26 -22.265 -22.27 -22.275 -22.28 -22.285 -22.29 -22.295 -22.3 -22.305 -22.31 -22.315 -22.32 -22.325 -22.33 -22.335 -22.34 -22.345 -22.35 -22.355 -22.36 -22.365 -22.37 -22.375 -22.38 -22.385 -22.39 -22.395 -22.4 -22.405 -22.41 -22.415 -22.42 -22.425 -22.43 -22.435 -22.44 -22.445 -22.45 -22.455 -22.46 -22.465 -22.47 -22.475 -22.48 -22.485 -22.49 -22.495 -22.5 -22.505 -22.51 -22.515 -22.52 -22.525 -22.53 -22.535 -22.54 -22.545 -22.55 -22.555 -22.56 -22.565 -22.57 -22.575 -22.58 -22.585 -22.59 -22.595 -22.6 -22.605 -22.61 -22.615 -22.62 -22.625 -22.63 -22.635 -22.64 -22.645 -22.65 -22.655 -22.66 -22.665 -22.67 -22.675 -22.68 -22.685 -22.69 -22.695 -22.7 -22.705 -22.71 -22.715 -22.72 -22.725 -22.73 -22.735 -22.74 -22.745 -22.75 -22.755 -22.76 -22.765 -22.77 -22.775 -22.78 -22.785 -22.79 -22.795 -22.8 -22.805 -22.81 -22.815 -22.82 -22.825 -22.83 -22.835 -22.84 -22.845 -22.85 -22.855 -22.86 -22.865 -22.87 -22.875 -22.88 -22.885 -22.89 -22.895 -22.9 -22.905 -22.91 -22.915 -22.92 -22.925 -22.93 -22.935 -22.94 -22.945 -22.95 -22.955 -22.96 -22.965 -22.97 -22.975 -22.98 -22.985 -22.99 -22.995 -23 -23.005 -23.01 -23.015 -23.02 -23.025 -23.03 -23.035 -23.04 -23.045 -23.05 -23.055 -23.06 -23.065 -23.07 -23.075 -23.08 -23.085 -23.09 -23.095 -23.1 -23.105 -23.11 -23.115 -23.12 -23.125 -23.13 -23.135 -23.14 -23.145 -23.15 -23.155 -23.16 -23.165 -23.17 -23.175 -23.18 -23.185 -23.19 -23.195 -23.2 -23.205 -23.21 -23.215 -23.22 -23.225 -23.23 -23.235 -23.24 -23.245 -23.25 -23.255 -23.26 -23.265 -23.27 -23.275 -23.28 -23.285 -23.29 -23.295 -23.3 -23.305 -23.31 -23.315 -23.32 -23.325 -23.33 -23.335 -23.34 -23.345 -23.35 -23.355 -23.36 -23.365 -23.37 -23.375 -23.38 -23.385 -23.39 -23.395 -23.4 -23.405 -23.41 -23.415 -23.42 -23.425 -23.43 -23.435 -23.44 -23.445 -23.45 -23.455 -23.46 -23.465 -23.47 -23.475 -23.48 -23.485 -23.49 -23.495 -23.5 -23.505 -23.51 -23.515 -23.52 -23.525 -23.53 -23.535 -23.54 -23.545 -23.55 -23.555 -23.56 -23.565 -23.57 -23.575 -23.58 -23.585 -23.59 -23.595 -23.6 -23.605 -23.61 -23.615 -23.62 -23.625 -23.63 -23.635 -23.64 -23.645 -23.65 -23.655 -23.66 -23.665 -23.67 -23.675 -23.68 -23.685 -23.69 -23.695 -23.7 -23.705 -23.71 -23.715 -23.72 -23.725 -23.73 -23.735 -23.74 -23.745 -23.75 -23.755 -23.76 -23.765 -23.77 -23.775 -23.78 -23.785 -23.79 -23.795 -23.8 -23.805 -23.81 -23.815 -23.82 -23.825 -23.83 -23.835 -23.84 -23.845 -23.85 -23.855 -23.86 -23.865 -23.87 -23.875 -23.88 -23.885 -23.89 -23.895 -23.9 -23.905 -23.91 -23.915 -23.92 -23.925 -23.93 -23.935 -23.94 -23.945 -23.95 -23.955 -23.96 -23.965 -23.97 -23.975 -23.98 -23.985 -23.99 -23.995 -24 -24.005 -24.01 -24.015 -24.02 -24.025 -24.03 -24.035 -24.04 -24.045 -24.05 -24.055 -24.06 -24.065 -24.07 -24.075 -24.08 -24.085 -24.09 -24.095 -24.1 -24.105 -24.11 -24.115 -24.12 -24.125 -24.13 -24.135 -24.14 -24.145 -24.15 -24.155 -24.16 -24.165 -24.17 -24.175 -24.18 -24.185 -24.19 -24.195 -24.2 -24.205 -24.21 -24.215 -24.22 -24.225 -24.23 -24.235 -24.24 -24.245 -24.25 -24.255 -24.26 -24.265 -24.27 -24.275 -24.28 -24.285 -24.29 -24.295 -24.3 -24.305 -24.31 -24.315 -24.32 -24.325 -24.33 -24.335 -24.34 -24.345 -24.35 -24.355 -24.36 -24.365 -24.37 -24.375 -24.38 -24.385 -24.39 -24.395 -24.4 -24.405 -24.41 -24.415 -24.42 -24.425 -24.43 -24.435 -24.44 -24.445 -24.45 -24.455 -24.46 -24.465 -24.47 -24.475 -24.48 -24.485 -24.49 -24.495 -24.5 -24.505 -24.51 -24.515 -24.52 -24.525 -24.53 -24.535 -24.54 -24.545 -24.55 -24.555 -24.56 -24.565 -24.57 -24.575 -24.58 -24.585 -24.59 -24.595 -24.6 -24.605 -24.61 -24.615 -24.62 -24.625 -24.63 -24.635 -24.64 -24.645 -24.65 -24.655 -24.66 -24.665 -24.67 -24.675 -24.68 -24.685 -24.69 -24.695 -24.7 -24.705 -24.71 -24.715 -24.72 -24.725 -24.73 -24.735 -24.74 -24.745 -24.75 -24.755 -24.76 -24.765 -24.77 -24.775 -24.78 -24.785 -24.79 -24.795 -24.8 -24.805 -24.81 -24.815 -24.82 -24.825 -24.83 -24.835 -24.84 -24.845 -24.85 -24.855 -24.86 -24.865 -24.87 -24.875 -24.88 -24.885 -24.89 -24.895 -24.9 -24.905 -24.91 -24.915 -24.92 -24.925 -24.93 -24.935 -24.94 -24.945 -24.95 -24.955 -24.96 -24.965 -24.97 -24.975 -24.98 -24.985 -24.99 -24.995 -25 -25.005 -25.01 -25.015 -25.02 -25.025 -25.03 -25.035 -25.04 -25.045 -25.05 -25.055 -25.06 -25.065 -25.07 -25.075 -25.08 -25.085 -25.09 -25.095 -25.1 -25.105 -25.11 -25.115 -25.12 -25.125 -25.13 -25.135 -25.14 -25.145 -25.15 -25.155 -25.16 -25.165 -25.17 -25.175 -25.18 -25.185 -25.19 -25.195 -25.2 -25.205 -25.21 -25.215 -25.22 -25.225 -25.23 -25.235 -25.24 -25.245 -25.25 -25.255 -25.26 -25.265 -25.27 -25.275 -25.28 -25.285 -25.29 -25.295 -25.3 -25.305 -25.31 -25.315 -25.32 -25.325 -25.33 -25.335 -25.34 -25.345 -25.35 -25.355 -25.36 -25.365 -25.37 -25.375 -25.38 -25.385 -25.39 -25.395 -25.4 -25.405 -25.41 -25.415 -25.42 -25.425 -25.43 -25.435 -25.44 -25.445 -25.45 -25.455 -25.46 -25.465 -25.47 -25.475 -25.48 -25.485 -25.49 -25.495 -25.5 -25.505 -25.51 -25.515 -25.52 -25.525 -25.53 -25.535 -25.54 -25.545 -25.55 -25.555 -25.56 -25.565 -25.57 -25.575 -25.58 -25.585 -25.59 -25.595 -25.6 -25.605 -25.61 -25.615 -25.62 -25.625 -25.63 -25.635 -25.64 -25.645 -25.65 -25.655 -25.66 -25.665 -25.67 -25.675 -25.68 -25.685 -25.69 -25.695 -25.7 -25.705 -25.71 -25.715 -25.72 -25.725 -25.73 -25.735 -25.74 -25.745 -25.75 -25.755 -25.76 -25.765 -25.77 -25.775 -25.78 -25.785 -25.79 -25.795 -25.8 -25.805 -25.81 -25.815 -25.82 -25.825 -25.83 -25.835 -25.84 -25.845 -25.85 -25.855 -25.86 -25.865 -25.87 -25.875 -25.88 -25.885 -25.89 -25.895 -25.9 -25.905 -25.91 -25.915 -25.92 -25.925 -25.93 -25.935 -25.94 -25.945 -25.95 -25.955 -25.96 -25.965 -25.97 -25.975 -25.98 -25.985 -25.99 -25.995 -26 -26.005 -26.01 -26.015 -26.02 -26.025 -26.03 -26.035 -26.04 -26.045 -26.05 -26.055 -26.06 -26.065 -26.07 -26.075 -26.08 -26.085 -26.09 -26.095 -26.1 -26.105 -26.11 -26.115 -26.12 -26.125 -26.13 -26.135 -26.14 -26.145 -26.15 -26.155 -26.16 -26.165 -26.17 -26.175 -26.18 -26.185 -26.19 -26.195 -26.2 -26.205 -26.21 -26.215 -26.22 -26.225 -26.23 -26.235 -26.24 -26.245 -26.25 -26.255 -26.26 -26.265 -26.27 -26.275 -26.28 -26.285 -26.29 -26.295 -26.3 -26.305 -26.31 -26.315 -26.32 -26.325 -26.33 -26.335 -26.34 -26.345 -26.35 -26.355 -26.36 -26.365 -26.37 -26.375 -26.38 -26.385 -26.39 -26.395 -26.4 -26.405 -26.41 -26.415 -26.42 -26.425 -26.43 -26.435 -26.44 -26.445 -26.45 -26.455 -26.46 -26.465 -26.47 -26.475 -26.48 -26.485 -26.49 -26.495 -26.5 -26.505 -26.51 -26.515 -26.52 -26.525 -26.53 -26.535 -26.54 -26.545 -26.55 -26.555 -26.56 -26.565 -26.57 -26.575 -26.58 -26.585 -26.59 -26.595 -26.6 -26.605 -26.61 -26.615 -26.62 -26.625 -26.63 -26.635 -26.64 -26.645 -26.65 -26.655 -26.66 -26.665 -26.67 -26.675 -26.68 -26.685 -26.69 -26.695 -26.7 -26.705 -26.71 -26.715 -26.72 -26.725 -26.73 -26.735 -26.74 -26.745 -26.75 -26.755 -26.76 -26.765 -26.77 -26.775 -26.78 -26.785 -26.79 -26.795 -26.8 -26.805 -26.81 -26.815 -26.82 -26.825 -26.83 -26.835 -26.84 -26.845 -26.85 -26.855 -26.86 -26.865 -26.87 -26.875 -26.88 -26.885 -26.89 -26.895 -26.9 -26.905 -26.91 -26.915 -26.92 -26.925 -26.93 -26.935 -26.94 -26.945 -26.95 -26.955 -26.96 -26.965 -26.97 -26.975 -26.98 -26.985 -26.99 -26.995 -27 -27.005 -27.01 -27.015 -27.02 -27.025 -27.03 -27.035 -27.04 -27.045 -27.05 -27.055 -27.06 -27.065 -27.07 -27.075 -27.08 -27.085 -27.09 -27.095 -27.1 -27.105 -27.11 -27.115 -27.12 -27.125 -27.13 -27.135 -27.14 -27.145 -27.15 -27.155 -27.16 -27.165 -27.17 -27.175 -27.18 -27.185 -27.19 -27.195 -27.2 -27.205 -27.21 -27.215 -27.22 -27.225 -27.23 -27.235 -27.24 -27.245 -27.25 -27.255 -27.26 -27.265 -27.27 -27.275 -27.28 -27.285 -27.29 -27.295 -27.3 -27.305 -27.31 -27.315 -27.32 -27.325 -27.33 -27.335 -27.34 -27.345 -27.35 -27.355 -27.36 -27.365 -27.37 -27.375 -27.38 -27.385 -27.39 -27.395 -27.4 -27.405 -27.41 -27.415 -27.42 -27.425 -27.43 -27.435 -27.44 -27.445 -27.45 -27.455 -27.46 -27.465 -27.47 -27.475 -27.48 -27.485 -27.49 -27.495 -27.5 -27.505 -27.51 -27.515 -27.52 -27.525 -27.53 -27.535 -27.54 -27.545 -27.55 -27.555 -27.56 -27.565 -27.57 -27.575 -27.58 -27.585 -27.59 -27.595 -27.6 -27.605 -27.61 -27.615 -27.62 -27.625 -27.63 -27.635 -27.64 -27.645 -27.65 -27.655 -27.66 -27.665 -27.67 -27.675 -27.68 -27.685 -27.69 -27.695 -27.7 -27.705 -27.71 -27.715 -27.72 -27.725 -27.73 -27.735 -27.74 -27.745 -27.75 -27.755 -27.76 -27.765 -27.77 -27.775 -27.78 -27.785 -27.79 -27.795 -27.8 -27.805 -27.81 -27.815 -27.82 -27.825 -27.83 -27.835 -27.84 -27.845 -27.85 -27.855 -27.86 -27.865 -27.87 -27.875 -27.88 -27.885 -27.89 -27.895 -27.9 -27.905 -27.91 -27.915 -27.92 -27.925 -27.93 -27.935 -27.94 -27.945 -27.95 -27.955 -27.96 -27.965 -27.97 -27.975 -27.98 -27.985 -27.99 -27.995 -28 -28.005 -28.01 -28.015 -28.02 -28.025 -28.03 -28.035 -28.04 -28.045 -28.05 -28.055 -28.06 -28.065 -28.07 -28.075 -28.08 -28.085 -28.09 -28.095 -28.1 -28.105 -28.11 -28.115 -28.12 -28.125 -28.13 -28.135 -28.14 -28.145 -28.15 -28.155 -28.16 -28.165 -28.17 -28.175 -28.18 -28.185 -28.19 -28.195 -28.2 -28.205 -28.21 -28.215 -28.22 -28.225 -28.23 -28.235 -28.24 -28.245 -28.25 -28.255 -28.26 -28.265 -28.27 -28.275 -28.28 -28.285 -28.29 -28.295 -28.3 -28.305 -28.31 -28.315 -28.32 -28.325 -28.33 -28.335 -28.34 -28.345 -28.35 -28.355 -28.36 -28.365 -28.37 -28.375 -28.38 -28.385 -28.39 -28.395 -28.4 -28.405 -28.41 -28.415 -28.42 -28.425 -28.43 -28.435 -28.44 -28.445 -28.45 -28.455 -28.46 -28.465 -28.47 -28.475 -28.48 -28.485 -28.49 -28.495 -28.5 -28.505 -28.51 -28.515 -28.52 -28.525 -28.53 -28.535 -28.54 -28.545 -28.55 -28.555 -28.56 -28.565 -28.57 -28.575 -28.58 -28.585 -28.59 -28.595 -28.6 -28.605 -28.61 -28.615 -28.62 -28.625 -28.63 -28.635 -28.64 -28.645 -28.65 -28.655 -28.66 -28.665 -28.67 -28.675 -28.68 -28.685 -28.69 -28.695 -28.7 -28.705 -28.71 -28.715 -28.72 -28.725 -28.73 -28.735 -28.74 -28.745 -28.75 -28.755 -28.76 -28.765 -28.77 -28.775 -28.78 -28.785 -28.79 -28.795 -28.8 -28.805 -28.81 -28.815 -28.82 -28.825 -28.83 -28.835 -28.84 -28.845 -28.85 -28.855 -28.86 -28.865 -28.87 -28.875 -28.88 -28.885 -28.89 -28.895 -28.9 -28.905 -28.91 -28.915 -28.92 -28.925 -28.93 -28.935 -28.94 -28.945 -28.95 -28.955 -28.96 -28.965 -28.97 -28.975 -28.98 -28.985 -28.99 -28.995 -29 -29.005 -29.01 -29.015 -29.02 -29.025 -29.03 -29.035 -29.04 -29.045 -29.05 -29.055 -29.06 -29.065 -29.07 -29.075 -29.08 -29.085 -29.09 -29.095 -29.1 -29.105 -29.11 -29.115 -29.12 -29.125 -29.13 -29.135 -29.14 -29.145 -29.15 -29.155 -29.16 -29.165 -29.17 -29.175 -29.18 -29.185 -29.19 -29.195 -29.2 -29.205 -29.21 -29.215 -29.22 -29.225 -29.23 -29.235 -29.24 -29.245 -29.25 -29.255 -29.26 -29.265 -29.27 -29.275 -29.28 -29.285 -29.29 -29.295 -29.3 -29.305 -29.31 -29.315 -29.32 -29.325 -29.33 -29.335 -29.34 -29.345 -29.35 -29.355 -29.36 -29.365 -29.37 -29.375 -29.38 -29.385 -29.39 -29.395 -29.4 -29.405 -29.41 -29.415 -29.42 -29.425 -29.43 -29.435 -29.44 -29.445 -29.45 -29.455 -29.46 -29.465 -29.47 -29.475 -29.48 -29.485 -29.49 -29.495 -29.5 -29.505 -29.51 -29.515 -29.52 -29.525 -29.53 -29.535 -29.54 -29.545 -29.55 -29.555 -29.56 -29.565 -29.57 -29.575 -29.58 -29.585 -29.59 -29.595 -29.6 -29.605 -29.61 -29.615 -29.62 -29.625 -29.63 -29.635 -29.64 -29.645 -29.65 -29.655 -29.66 -29.665 -29.67 -29.675 -29.68 -29.685 -29.69 -29.695 -29.7 -29.705 -29.71 -29.715 -29.72 -29.725 -29.73 -29.735 -29.74 -29.745 -29.75 -29.755 -29.76 -29.765 -29.77 -29.775 -29.78 -29.785 -29.79 -29.795 -29.8 -29.805 -29.81 -29.815 -29.82 -29.825 -29.83 -29.835 -29.84 -29.845 -29.85 -29.855 -29.86 -29.865 -29.87 -29.875 -29.88 -29.885 -29.89 -29.895 -29.9 -29.905 -29.91 -29.915 -29.92 -29.925 -29.93 -29.935 -29.94 -29.945 -29.95 -29.955 -29.96 -29.965 -29.97 -29.975 -29.98 -29.985 -29.99 -29.995 -30 -30.005 -30.01 -30.015 -30.02 -30.025 -30.03 -30.035 -30.04 -30.045 -30.05 -30.055 -30.06 -30.065 -30.07 -30.075 -30.08 -30.085 -30.09 -30.095 -30.1 -30.105 -30.11 -30.115 -30.12 -30.125 -30.13 -30.135 -30.14 -30.145 -30.15 -30.155 -30.16 -30.165 -30.17 -30.175 -30.18 -30.185 -30.19 -30.195 -30.2 -30.205 -30.21 -30.215 -30.22 -30.225 -30.23 -30.235 -30.24 -30.245 -30.25 -30.255 -30.26 -30.265 -30.27 -30.275 -30.28 -30.285 -30.29 -30.295 -30.3 -30.305 -30.31 -30.315 -30.32 -30.325 -30.33 -30.335 -30.34 -30.345 -30.35 -30.355 -30.36 -30.365 -30.37 -30.375 -30.38 -30.385 -30.39 -30.395 -30.4 -30.405 -30.41 -30.415 -30.42 -30.425 -30.43 -30.435 -30.44 -30.445 -30.45 -30.455 -30.46 -30.465 -30.47 -30.475 -30.48 -30.485 -30.49 -30.495 -30.5 -30.505 -30.51 -30.515 -30.52 -30.525 -30.53 -30.535 -30.54 -30.545 -30.55 -30.555 -30.56 -30.565 -30.57 -30.575 -30.58 -30.585 -30.59 -30.595 -30.6 -30.605 -30.61 -30.615 -30.62 -30.625 -30.63 -30.635 -30.64 -30.645 -30.65 -30.655 -30.66 -30.665 -30.67 -30.675 -30.68 -30.685 -30.69 -30.695 -30.7 -30.705 -30.71 -30.715 -30.72 -30.725 -30.73 -30.735 -30.74 -30.745 -30.75 -30.755 -30.76 -30.765 -30.77 -30.775 -30.78 -30.785 -30.79 -30.795 -30.8 -30.805 -30.81 -30.815 -30.82 -30.825 -30.83 -30.835 -30.84 -30.845 -30.85 -30.855 -30.86 -30.865 -30.87 -30.875 -30.88 -30.885 -30.89 -30.895 -30.9 -30.905 -30.91 -30.915 -30.92 -30.925 -30.93 -30.935 -30.94 -30.945 -30.95 -30.955 -30.96 -30.965 -30.97 -30.975 -30.98 -30.985 -30.99 -30.995 -31 -31.005 -31.01 -31.015 -31.02 -31.025 -31.03 -31.035 -31.04 -31.045 -31.05 -31.055 -31.06 -31.065 -31.07 -31.075 -31.08 -31.085 -31.09 -31.095 -31.1 -31.105 -31.11 -31.115 -31.12 -31.125 -31.13 -31.135 -31.14 -31.145 -31.15 -31.155 -31.16 -31.165 -31.17 -31.175 -31.18 -31.185 -31.19 -31.195 -31.2 -31.205 -31.21 -31.215 -31.22 -31.225 -31.23 -31.235 -31.24 -31.245 -31.25 -31.255 -31.26 -31.265 -31.27 -31.275 -31.28 -31.285 -31.29 -31.295 -31.3 -31.305 -31.31 -31.315 -31.32 -31.325 -31.33 -31.335 -31.34 -31.345 -31.35 -31.355 -31.36 -31.365 -31.37 -31.375 -31.38 -31.385 -31.39 -31.395 -31.4 -31.405 -31.41 -31.415 -31.42 -31.425 -31.43 -31.435 -31.44 -31.445 -31.45 -31.455 -31.46 -31.465 -31.47 -31.475 -31.48 -31.485 -31.49 -31.495 -31.5 -31.505 -31.51 -31.515 -31.52 -31.525 -31.53 -31.535 -31.54 -31.545 -31.55 -31.555 -31.56 -31.565 -31.57 -31.575 -31.58 -31.585 -31.59 -31.595 -31.6 -31.605 -31.61 -31.615 -31.62 -31.625 -31.63 -31.635 -31.64 -31.645 -31.65 -31.655 -31.66 -31.665 -31.67 -31.675 -31.68 -31.685 -31.69 -31.695 -31.7 -31.705 -31.71 -31.715 -31.72 -31.725 -31.73 -31.735 -31.74 -31.745 -31.75 -31.755 -31.76 -31.765 -31.77 -31.775 -31.78 -31.785 -31.79 -31.795 -31.8 -31.805 -31.81 -31.815 -31.82 -31.825 -31.83 -31.835 -31.84 -31.845 -31.85 -31.855 -31.86 -31.865 -31.87 -31.875 -31.88 -31.885 -31.89 -31.895 -31.9 -31.905 -31.91 -31.915 -31.92 -31.925 -31.93 -31.935 -31.94 -31.945 -31.95 -31.955 -31.96 -31.965 -31.97 -31.975 -31.98 -31.985 -31.99 -31.995 -32 -32.005 -32.01 -32.015 -32.02 -32.025 -32.03 -32.035 -32.04 -32.045 -32.05 -32.055 -32.06 -32.065 -32.07 -32.075 -32.08 -32.085 -32.09 -32.095 -32.1 -32.105 -32.11 -32.115 -32.12 -32.125 -32.13 -32.135 -32.14 -32.145 -32.15 -32.155 -32.16 -32.165 -32.17 -32.175 -32.18 -32.185 -32.19 -32.195 -32.2 -32.205 -32.21 -32.215 -32.22 -32.225 -32.23 -32.235 -32.24 -32.245 -32.25 -32.255 -32.26 -32.265 -32.27 -32.275 -32.28 -32.285 -32.29 -32.295 -32.3 -32.305 -32.31 -32.315 -32.32 -32.325 -32.33 -32.335 -32.34 -32.345 -32.35 -32.355 -32.36 -32.365 -32.37 -32.375 -32.38 -32.385 -32.39 -32.395 -32.4 -32.405 -32.41 -32.415 -32.42 -32.425 -32.43 -32.435 -32.44 -32.445 -32.45 -32.455 -32.46 -32.465 -32.47 -32.475 -32.48 -32.485 -32.49 -32.495 -32.5 -32.505 -32.51 -32.515 -32.52 -32.525 -32.53 -32.535 -32.54 -32.545 -32.55 -32.555 -32.56 -32.565 -32.57 -32.575 -32.58 -32.585 -32.59 -32.595 -32.6 -32.605 -32.61 -32.615 -32.62 -32.625 -32.63 -32.635 -32.64 -32.645 -32.65 -32.655 -32.66 -32.665 -32.67 -32.675 -32.68 -32.685 -32.69 -32.695 -32.7 -32.705 -32.71 -32.715 -32.72 -32.725 -32.73 -32.735 -32.74 -32.745 -32.75 -32.755 -32.76 -32.765 -32.77 -32.775 -32.78 -32.785 -32.79 -32.795 -32.8 -32.805 -32.81 -32.815 -32.82 -32.825 -32.83 -32.835 -32.84 -32.845 -32.85 -32.855 -32.86 -32.865 -32.87 -32.875 -32.88 -32.885 -32.89 -32.895 -32.9 -32.905 -32.91 -32.915 -32.92 -32.925 -32.93 -32.935 -32.94 -32.945 -32.95 -32.955 -32.96 -32.965 -32.97 -32.975 -32.98 -32.985 -32.99 -32.995 -33 -33.005 -33.01 -33.015 -33.02 -33.025 -33.03 -33.035 -33.04 -33.045 -33.05 -33.055 -33.06 -33.065 -33.07 -33.075 -33.08 -33.085 -33.09 -33.095 -33.1 -33.105 -33.11 -33.115 -33.12 -33.125 -33.13 -33.135 -33.14 -33.145 -33.15 -33.155 -33.16 -33.165 -33.17 -33.175 -33.18 -33.185 -33.19 -33.195 -33.2 -33.205 -33.21 -33.215 -33.22 -33.225 -33.23 -33.235 -33.24 -33.245 -33.25 -33.255 -33.26 -33.265 -33.27 -33.275 -33.28 -33.285 -33.29 -33.295 -33.3 -33.305 -33.31 -33.315 -33.32 -33.325 -33.33 -33.335 -33.34 -33.345 -33.35 -33.355 -33.36 -33.365 -33.37 -33.375 -33.38 -33.385 -33.39 -33.395 -33.4 -33.405 -33.41 -33.415 -33.42 -33.425 -33.43 -33.435 -33.44 -33.445 -33.45 -33.455 -33.46 -33.465 -33.47 -33.475 -33.48 -33.485 -33.49 -33.495 -33.5 -33.505 -33.51 -33.515 -33.52 -33.525 -33.53 -33.535 -33.54 -33.545 -33.55 -33.555 -33.56 -33.565 -33.57 -33.575 -33.58 -33.585 -33.59 -33.595 -33.6 -33.605 -33.61 -33.615 -33.62 -33.625 -33.63 -33.635 -33.64 -33.645 -33.65 -33.655 -33.66 -33.665 -33.67 -33.675 -33.68 -33.685 -33.69 -33.695 -33.7 -33.705 -33.71 -33.715 -33.72 -33.725 -33.73 -33.735 -33.74 -33.745 -33.75 -33.755 -33.76 -33.765 -33.77 -33.775 -33.78 -33.785 -33.79 -33.795 -33.8 -33.805 -33.81 -33.815 -33.82 -33.825 -33.83 -33.835 -33.84 -33.845 -33.85 -33.855 -33.86 -33.865 -33.87 -33.875 -33.88 -33.885 -33.89 -33.895 -33.9 -33.905 -33.91 -33.915 -33.92 -33.925 -33.93 -33.935 -33.94 -33.945 -33.95 -33.955 -33.96 -33.965 -33.97 -33.975 -33.98 -33.985 -33.99 -33.995 -34 -34.005 -34.01 -34.015 -34.02 -34.025 -34.03 -34.035 -34.04 -34.045 -34.05 -34.055 -34.06 -34.065 -34.07 -34.075 -34.08 -34.085 -34.09 -34.095 -34.1 -34.105 -34.11 -34.115 -34.12 -34.125 -34.13 -34.135 -34.14 -34.145 -34.15 -34.155 -34.16 -34.165 -34.17 -34.175 -34.18 -34.185 -34.19 -34.195 -34.2 -34.205 -34.21 -34.215 -34.22 -34.225 -34.23 -34.235 -34.24 -34.245 -34.25 -34.255 -34.26 -34.265 -34.27 -34.275 -34.28 -34.285 -34.29 -34.295 -34.3 -34.305 -34.31 -34.315 -34.32 -34.325 -34.33 -34.335 -34.34 -34.345 -34.35 -34.355 -34.36 -34.365 -34.37 -34.375 -34.38 -34.385 -34.39 -34.395 -34.4 -34.405 -34.41 -34.415 -34.42 -34.425 -34.43 -34.435 -34.44 -34.445 -34.45 -34.455 -34.46 -34.465 -34.47 -34.475 -34.48 -34.485 -34.49 -34.495 -34.5 -34.505 -34.51 -34.515 -34.52 -34.525 -34.53 -34.535 -34.54 -34.545 -34.55 -34.555 -34.56 -34.565 -34.57 -34.575 -34.58 -34.585 -34.59 -34.595 -34.6 -34.605 -34.61 -34.615 -34.62 -34.625 -34.63 -34.635 -34.64 -34.645 -34.65 -34.655 -34.66 -34.665 -34.67 -34.675 -34.68 -34.685 -34.69 -34.695 -34.7 -34.705 -34.71 -34.715 -34.72 -34.725 -34.73 -34.735 -34.74 -34.745 -34.75 -34.755 -34.76 -34.765 -34.77 -34.775 -34.78 -34.785 -34.79 -34.795 -34.8 -34.805 -34.81 -34.815 -34.82 -34.825 -34.83 -34.835 -34.84 -34.845 -34.85 -34.855 -34.86 -34.865 -34.87 -34.875 -34.88 -34.885 -34.89 -34.895 -34.9 -34.905 -34.91 -34.915 -34.92 -34.925 -34.93 -34.935 -34.94 -34.945 -34.95 -34.955 -34.96 -34.965 -34.97 -34.975 -34.98 -34.985 -34.99 -34.995 -35 -35.005 -35.01 -35.015 -35.02 -35.025 -35.03 -35.035 -35.04 -35.045 -35.05 -35.055 -35.06 -35.065 -35.07 -35.075 -35.08 -35.085 -35.09 -35.095 -35.1 -35.105 -35.11 -35.115 -35.12 -35.125 -35.13 -35.135 -35.14 -35.145 -35.15 -35.155 -35.16 -35.165 -35.17 -35.175 -35.18 -35.185 -35.19 -35.195 -35.2 -35.205 -35.21 -35.215 -35.22 -35.225 -35.23 -35.235 -35.24 -35.245 -35.25 -35.255 -35.26 -35.265 -35.27 -35.275 -35.28 -35.285 -35.29 -35.295 -35.3 -35.305 -35.31 -35.315 -35.32 -35.325 -35.33 -35.335 -35.34 -35.345 -35.35 -35.355 -35.36 -35.365 -35.37 -35.375 -35.38 -35.385 -35.39 -35.395 -35.4 -35.405 -35.41 -35.415 -35.42 -35.425 -35.43 -35.435 -35.44 -35.445 -35.45 -35.455 -35.46 -35.465 -35.47 -35.475 -35.48 -35.485 -35.49 -35.495 -35.5 -35.505 -35.51 -35.515 -35.52 -35.525 -35.53 -35.535 -35.54 -35.545 -35.55 -35.555 -35.56 -35.565 -35.57 -35.575 -35.58 -35.585 -35.59 -35.595 -35.6 -35.605 -35.61 -35.615 -35.62 -35.625 -35.63 -35.635 -35.64 -35.645 -35.65 -35.655 -35.66 -35.665 -35.67 -35.675 -35.68 -35.685 -35.69 -35.695 -35.7 -35.705 -35.71 -35.715 -35.72 -35.725 -35.73 -35.735 -35.74 -35.745 -35.75 -35.755 -35.76 -35.765 -35.77 -35.775 -35.78 -35.785 -35.79 -35.795 -35.8 -35.805 -35.81 -35.815 -35.82 -35.825 -35.83 -35.835 -35.84 -35.845 -35.85 -35.855 -35.86 -35.865 -35.87 -35.875 -35.88 -35.885 -35.89 -35.895 -35.9 -35.905 -35.91 -35.915 -35.92 -35.925 -35.93 -35.935 -35.94 -35.945 -35.95 -35.955 -35.96 -35.965 -35.97 -35.975 -35.98 -35.985 -35.99 -35.995 -36 -36.005 -36.01 -36.015 -36.02 -36.025 -36.03 -36.035 -36.04 -36.045 -36.05 -36.055 -36.06 -36.065 -36.07 -36.075 -36.08 -36.085 -36.09 -36.095 -36.1 -36.105 -36.11 -36.115 -36.12 -36.125 -36.13 -36.135 -36.14 -36.145 -36.15 -36.155 -36.16 -36.165 -36.17 -36.175 -36.18 -36.185 -36.19 -36.195 -36.2 -36.205 -36.21 -36.215 -36.22 -36.225 -36.23 -36.235 -36.24 -36.245 -36.25 -36.255 -36.26 -36.265 -36.27 -36.275 -36.28 -36.285 -36.29 -36.295 -36.3 -36.305 -36.31 -36.315 -36.32 -36.325 -36.33 -36.335 -36.34 -36.345 -36.35 -36.355 -36.36 -36.365 -36.37 -36.375 -36.38 -36.385 -36.39 -36.395 -36.4 -36.405 -36.41 -36.415 -36.42 -36.425 -36.43 -36.435 -36.44 -36.445 -36.45 -36.455 -36.46 -36.465 -36.47 -36.475 -36.48 -36.485 -36.49 -36.495 -36.5 -36.505 -36.51 -36.515 -36.52 -36.525 -36.53 -36.535 -36.54 -36.545 -36.55 -36.555 -36.56 -36.565 -36.57 -36.575 -36.58 -36.585 -36.59 -36.595 -36.6 -36.605 -36.61 -36.615 -36.62 -36.625 -36.63 -36.635 -36.64 -36.645 -36.65 -36.655 -36.66 -36.665 -36.67 -36.675 -36.68 -36.685 -36.69 -36.695 -36.7 -36.705 -36.71 -36.715 -36.72 -36.725 -36.73 -36.735 -36.74 -36.745 -36.75 -36.755 -36.76 -36.765 -36.77 -36.775 -36.78 -36.785 -36.79 -36.795 -36.8 -36.805 -36.81 -36.815 -36.82 -36.825 -36.83 -36.835 -36.84 -36.845 -36.85 -36.855 -36.86 -36.865 -36.87 -36.875 -36.88 -36.885 -36.89 -36.895 -36.9 -36.905 -36.91 -36.915 -36.92 -36.925 -36.93 -36.935 -36.94 -36.945 -36.95 -36.955 -36.96 -36.965 -36.97 -36.975 -36.98 -36.985 -36.99 -36.995 -37 -37.005 -37.01 -37.015 -37.02 -37.025 -37.03 -37.035 -37.04 -37.045 -37.05 -37.055 -37.06 -37.065 -37.07 -37.075 -37.08 -37.085 -37.09 -37.095 -37.1 -37.105 -37.11 -37.115 -37.12 -37.125 -37.13 -37.135 -37.14 -37.145 -37.15 -37.155 -37.16 -37.165 -37.17 -37.175 -37.18 -37.185 -37.19 -37.195 -37.2 -37.205 -37.21 -37.215 -37.22 -37.225 -37.23 -37.235 -37.24 -37.245 -37.25 -37.255 -37.26 -37.265 -37.27 -37.275 -37.28 -37.285 -37.29 -37.295 -37.3 -37.305 -37.31 -37.315 -37.32 -37.325 -37.33 -37.335 -37.34 -37.345 -37.35 -37.355 -37.36 -37.365 -37.37 -37.375 -37.38 -37.385 -37.39 -37.395 -37.4 -37.405 -37.41 -37.415 -37.42 -37.425 -37.43 -37.435 -37.44 -37.445 -37.45 -37.455 -37.46 -37.465 -37.47 -37.475 -37.48 -37.485 -37.49 -37.495 -37.5 -37.505 -37.51 -37.515 -37.52 -37.525 -37.53 -37.535 -37.54 -37.545 -37.55 -37.555 -37.56 -37.565 -37.57 -37.575 -37.58 -37.585 -37.59 -37.595 -37.6 -37.605 -37.61 -37.615 -37.62 -37.625 -37.63 -37.635 -37.64 -37.645 -37.65 -37.655 -37.66 -37.665 -37.67 -37.675 -37.68 -37.685 -37.69 -37.695 -37.7 -37.705 -37.71 -37.715 -37.72 -37.725 -37.73 -37.735 -37.74 -37.745 -37.75 -37.755 -37.76 -37.765 -37.77 -37.775 -37.78 -37.785 -37.79 -37.795 -37.8 -37.805 -37.81 -37.815 -37.82 -37.825 -37.83 -37.835 -37.84 -37.845 -37.85 -37.855 -37.86 -37.865 -37.87 -37.875 -37.88 -37.885 -37.89 -37.895 -37.9 -37.905 -37.91 -37.915 -37.92 -37.925 -37.93 -37.935 -37.94 -37.945 -37.95 -37.955 -37.96 -37.965 -37.97 -37.975 -37.98 -37.985 -37.99 -37.995 -38 -38.005 -38.01 -38.015 -38.02 -38.025 -38.03 -38.035 -38.04 -38.045 -38.05 -38.055 -38.06 -38.065 -38.07 -38.075 -38.08 -38.085 -38.09 -38.095 -38.1 -38.105 -38.11 -38.115 -38.12 -38.125 -38.13 -38.135 -38.14 -38.145 -38.15 -38.155 -38.16 -38.165 -38.17 -38.175 -38.18 -38.185 -38.19 -38.195 -38.2 -38.205 -38.21 -38.215 -38.22 -38.225 -38.23 -38.235 -38.24 -38.245 -38.25 -38.255 -38.26 -38.265 -38.27 -38.275 -38.28 -38.285 -38.29 -38.295 -38.3 -38.305 -38.31 -38.315 -38.32 -38.325 -38.33 -38.335 -38.34 -38.345 -38.35 -38.355 -38.36 -38.365 -38.37 -38.375 -38.38 -38.385 -38.39 -38.395 -38.4 -38.405 -38.41 -38.415 -38.42 -38.425 -38.43 -38.435 -38.44 -38.445 -38.45 -38.455 -38.46 -38.465 -38.47 -38.475 -38.48 -38.485 -38.49 -38.495 -38.5 -38.505 -38.51 -38.515 -38.52 -38.525 -38.53 -38.535 -38.54 -38.545 -38.55 -38.555 -38.56 -38.565 -38.57 -38.575 -38.58 -38.585 -38.59 -38.595 -38.6 -38.605 -38.61 -38.615 -38.62 -38.625 -38.63 -38.635 -38.64 -38.645 -38.65 -38.655 -38.66 -38.665 -38.67 -38.675 -38.68 -38.685 -38.69 -38.695 -38.7 -38.705 -38.71 -38.715 -38.72 -38.725 -38.73 -38.735 -38.74 -38.745 -38.75 -38.755 -38.76 -38.765 -38.77 -38.775 -38.78 -38.785 -38.79 -38.795 -38.8 -38.805 -38.81 -38.815 -38.82 -38.825 -38.83 -38.835 -38.84 -38.845 -38.85 -38.855 -38.86 -38.865 -38.87 -38.875 -38.88 -38.885 -38.89 -38.895 -38.9 -38.905 -38.91 -38.915 -38.92 -38.925 -38.93 -38.935 -38.94 -38.945 -38.95 -38.955 -38.96 -38.965 -38.97 -38.975 -38.98 -38.985 -38.99 -38.995 -39 -39.005 -39.01 -39.015 -39.02 -39.025 -39.03 -39.035 -39.04 -39.045 -39.05 -39.055 -39.06 -39.065 -39.07 -39.075 -39.08 -39.085 -39.09 -39.095 -39.1 -39.105 -39.11 -39.115 -39.12 -39.125 -39.13 -39.135 -39.14 -39.145 -39.15 -39.155 -39.16 -39.165 -39.17 -39.175 -39.18 -39.185 -39.19 -39.195 -39.2 -39.205 -39.21 -39.215 -39.22 -39.225 -39.23 -39.235 -39.24 -39.245 -39.25 -39.255 -39.26 -39.265 -39.27 -39.275 -39.28 -39.285 -39.29 -39.295 -39.3 -39.305 -39.31 -39.315 -39.32 -39.325 -39.33 -39.335 -39.34 -39.345 -39.35 -39.355 -39.36 -39.365 -39.37 -39.375 -39.38 -39.385 -39.39 -39.395 -39.4 -39.405 -39.41 -39.415 -39.42 -39.425 -39.43 -39.435 -39.44 -39.445 -39.45 -39.455 -39.46 -39.465 -39.47 -39.475 -39.48 -39.485 -39.49 -39.495 -39.5 -39.505 -39.51 -39.515 -39.52 -39.525 -39.53 -39.535 -39.54 -39.545 -39.55 -39.555 -39.56 -39.565 -39.57 -39.575 -39.58 -39.585 -39.59 -39.595 -39.6 -39.605 -39.61 -39.615 -39.62 -39.625 -39.63 -39.635 -39.64 -39.645 -39.65 -39.655 -39.66 -39.665 -39.67 -39.675 -39.68 -39.685 -39.69 -39.695 -39.7 -39.705 -39.71 -39.715 -39.72 -39.725 -39.73 -39.735 -39.74 -39.745 -39.75 -39.755 -39.76 -39.765 -39.77 -39.775 -39.78 -39.785 -39.79 -39.795 -39.8 -39.805 -39.81 -39.815 -39.82 -39.825 -39.83 -39.835 -39.84 -39.845 -39.85 -39.855 -39.86 -39.865 -39.87 -39.875 -39.88 -39.885 -39.89 -39.895 -39.9 -39.905 -39.91 -39.915 -39.92 -39.925 -39.93 -39.935 -39.94 -39.945 -39.95 -39.955 -39.96 -39.965 -39.97 -39.975 -39.98 -39.985 -39.99 -39.995 -40 -40.005 -40.01 -40.015 -40.02 -40.025 -40.03 -40.035 -40.04 -40.045 -40.05 -40.055 -40.06 -40.065 -40.07 -40.075 -40.08 -40.085 -40.09 -40.095 -40.1 -40.105 -40.11 -40.115 -40.12 -40.125 -40.13 -40.135 -40.14 -40.145 -40.15 -40.155 -40.16 -40.165 -40.17 -40.175 -40.18 -40.185 -40.19 -40.195 -40.2 -40.205 -40.21 -40.215 -40.22 -40.225 -40.23 -40.235 -40.24 -40.245 -40.25 -40.255 -40.26 -40.265 -40.27 -40.275 -40.28 -40.285 -40.29 -40.295 -40.3 -40.305 -40.31 -40.315 -40.32 -40.325 -40.33 -40.335 -40.34 -40.345 -40.35 -40.355 -40.36 -40.365 -40.37 -40.375 -40.38 -40.385 -40.39 -40.395 -40.4 -40.405 -40.41 -40.415 -40.42 -40.425 -40.43 -40.435 -40.44 -40.445 -40.45 -40.455 -40.46 -40.465 -40.47 -40.475 -40.48 -40.485 -40.49 -40.495 -40.5 -40.505 -40.51 -40.515 -40.52 -40.525 -40.53 -40.535 -40.54 -40.545 -40.55 -40.555 -40.56 -40.565 -40.57 -40.575 -40.58 -40.585 -40.59 -40.595 -40.6 -40.605 -40.61 -40.615 -40.62 -40.625 -40.63 -40.635 -40.64 -40.645 -40.65 -40.655 -40.66 -40.665 -40.67 -40.675 -40.68 -40.685 -40.69 -40.695 -40.7 -40.705 -40.71 -40.715 -40.72 -40.725 -40.73 -40.735 -40.74 -40.745 -40.75 -40.755 -40.76 -40.765 -40.77 -40.775 -40.78 -40.785 -40.79 -40.795 -40.8 -40.805 -40.81 -40.815 -40.82 -40.825 -40.83 -40.835 -40.84 -40.845 -40.85 -40.855 -40.86 -40.865 -40.87 -40.875 -40.88 -40.885 -40.89 -40.895 -40.9 -40.905 -40.91 -40.915 -40.92 -40.925 -40.93 -40.935 -40.94 -40.945 -40.95 -40.955 -40.96 -40.965 -40.97 -40.975 -40.98 -40.985 -40.99 -40.995 -41 -41.005 -41.01 -41.015 -41.02 -41.025 -41.03 -41.035 -41.04 -41.045 -41.05 -41.055 -41.06 -41.065 -41.07 -41.075 -41.08 -41.085 -41.09 -41.095 -41.1 -41.105 -41.11 -41.115 -41.12 -41.125 -41.13 -41.135 -41.14 -41.145 -41.15 -41.155 -41.16 -41.165 -41.17 -41.175 -41.18 -41.185 -41.19 -41.195 -41.2 -41.205 -41.21 -41.215 -41.22 -41.225 -41.23 -41.235 -41.24 -41.245 -41.25 -41.255 -41.26 -41.265 -41.27 -41.275 -41.28 -41.285 -41.29 -41.295 -41.3 -41.305 -41.31 -41.315 -41.32 -41.325 -41.33 -41.335 -41.34 -41.345 -41.35 -41.355 -41.36 -41.365 -41.37 -41.375 -41.38 -41.385 -41.39 -41.395 -41.4 -41.405 -41.41 -41.415 -41.42 -41.425 -41.43 -41.435 -41.44 -41.445 -41.45 -41.455 -41.46 -41.465 -41.47 -41.475 -41.48 -41.485 -41.49 -41.495 -41.5 -41.505 -41.51 -41.515 -41.52 -41.525 -41.53 -41.535 -41.54 -41.545 -41.55 -41.555 -41.56 -41.565 -41.57 -41.575 -41.58 -41.585 -41.59 -41.595 -41.6 -41.605 -41.61 -41.615 -41.62 -41.625 -41.63 -41.635 -41.64 -41.645 -41.65 -41.655 -41.66 -41.665 -41.67 -41.675 -41.68 -41.685 -41.69 -41.695 -41.7 -41.705 -41.71 -41.715 -41.72 -41.725 -41.73 -41.735 -41.74 -41.745 -41.75 -41.755 -41.76 -41.765 -41.77 -41.775 -41.78 -41.785 -41.79 -41.795 -41.8 -41.805 -41.81 -41.815 -41.82 -41.825 -41.83 -41.835 -41.84 -41.845 -41.85 -41.855 -41.86 -41.865 -41.87 -41.875 -41.88 -41.885 -41.89 -41.895 -41.9 -41.905 -41.91 -41.915 -41.92 -41.925 -41.93 -41.935 -41.94 -41.945 -41.95 -41.955 -41.96 -41.965 -41.97 -41.975 -41.98 -41.985 -41.99 -41.995 -42 -42.005 -42.01 -42.015 -42.02 -42.025 -42.03 -42.035 -42.04 -42.045 -42.05 -42.055 -42.06 -42.065 -42.07 -42.075 -42.08 -42.085 -42.09 -42.095 -42.1 -42.105 -42.11 -42.115 -42.12 -42.125 -42.13 -42.135 -42.14 -42.145 -42.15 -42.155 -42.16 -42.165 -42.17 -42.175 -42.18 -42.185 -42.19 -42.195 -42.2 -42.205 -42.21 -42.215 -42.22 -42.225 -42.23 -42.235 -42.24 -42.245 -42.25 -42.255 -42.26 -42.265 -42.27 -42.275 -42.28 -42.285 -42.29 -42.295 -42.3 -42.305 -42.31 -42.315 -42.32 -42.325 -42.33 -42.335 -42.34 -42.345 -42.35 -42.355 -42.36 -42.365 -42.37 -42.375 -42.38 -42.385 -42.39 -42.395 -42.4 -42.405 -42.41 -42.415 -42.42 -42.425 -42.43 -42.435 -42.44 -42.445 -42.45 -42.455 -42.46 -42.465 -42.47 -42.475 -42.48 -42.485 -42.49 -42.495 -42.5 -42.505 -42.51 -42.515 -42.52 -42.525 -42.53 -42.535 -42.54 -42.545 -42.55 -42.555 -42.56 -42.565 -42.57 -42.575 -42.58 -42.585 -42.59 -42.595 -42.6 -42.605 -42.61 -42.615 -42.62 -42.625 -42.63 -42.635 -42.64 -42.645 -42.65 -42.655 -42.66 -42.665 -42.67 -42.675 -42.68 -42.685 -42.69 -42.695 -42.7 -42.705 -42.71 -42.715 -42.72 -42.725 -42.73 -42.735 -42.74 -42.745 -42.75 -42.755 -42.76 -42.765 -42.77 -42.775 -42.78 -42.785 -42.79 -42.795 -42.8 -42.805 -42.81 -42.815 -42.82 -42.825 -42.83 -42.835 -42.84 -42.845 -42.85 -42.855 -42.86 -42.865 -42.87 -42.875 -42.88 -42.885 -42.89 -42.895 -42.9 -42.905 -42.91 -42.915 -42.92 -42.925 -42.93 -42.935 -42.94 -42.945 -42.95 -42.955 -42.96 -42.965 -42.97 -42.975 -42.98 -42.985 -42.99 -42.995 -43 -43.005 -43.01 -43.015 -43.02 -43.025 -43.03 -43.035 -43.04 -43.045 -43.05 -43.055 -43.06 -43.065 -43.07 -43.075 -43.08 -43.085 -43.09 -43.095 -43.1 -43.105 -43.11 -43.115 -43.12 -43.125 -43.13 -43.135 -43.14 -43.145 -43.15 -43.155 -43.16 -43.165 -43.17 -43.175 -43.18 -43.185 -43.19 -43.195 -43.2 -43.205 -43.21 -43.215 -43.22 -43.225 -43.23 -43.235 -43.24 -43.245 -43.25 -43.255 -43.26 -43.265 -43.27 -43.275 -43.28 -43.285 -43.29 -43.295 -43.3 -43.305 -43.31 -43.315 -43.32 -43.325 -43.33 -43.335 -43.34 -43.345 -43.35 -43.355 -43.36 -43.365 -43.37 -43.375 -43.38 -43.385 -43.39 -43.395 -43.4 -43.405 -43.41 -43.415 -43.42 -43.425 -43.43 -43.435 -43.44 -43.445 -43.45 -43.455 -43.46 -43.465 -43.47 -43.475 -43.48 -43.485 -43.49 -43.495 -43.5 -43.505 -43.51 -43.515 -43.52 -43.525 -43.53 -43.535 -43.54 -43.545 -43.55 -43.555 -43.56 -43.565 -43.57 -43.575 -43.58 -43.585 -43.59 -43.595 -43.6 -43.605 -43.61 -43.615 -43.62 -43.625 -43.63 -43.635 -43.64 -43.645 -43.65 -43.655 -43.66 -43.665 -43.67 -43.675 -43.68 -43.685 -43.69 -43.695 -43.7 -43.705 -43.71 -43.715 -43.72 -43.725 -43.73 -43.735 -43.74 -43.745 -43.75 -43.755 -43.76 -43.765 -43.77 -43.775 -43.78 -43.785 -43.79 -43.795 -43.8 -43.805 -43.81 -43.815 -43.82 -43.825 -43.83 -43.835 -43.84 -43.845 -43.85 -43.855 -43.86 -43.865 -43.87 -43.875 -43.88 -43.885 -43.89 -43.895 -43.9 -43.905 -43.91 -43.915 -43.92 -43.925 -43.93 -43.935 -43.94 -43.945 -43.95 -43.955 -43.96 -43.965 -43.97 -43.975 -43.98 -43.985 -43.99 -43.995 -44 -44.005 -44.01 -44.015 -44.02 -44.025 -44.03 -44.035 -44.04 -44.045 -44.05 -44.055 -44.06 -44.065 -44.07 -44.075 -44.08 -44.085 -44.09 -44.095 -44.1 -44.105 -44.11 -44.115 -44.12 -44.125 -44.13 -44.135 -44.14 -44.145 -44.15 -44.155 -44.16 -44.165 -44.17 -44.175 -44.18 -44.185 -44.19 -44.195 -44.2 -44.205 -44.21 -44.215 -44.22 -44.225 -44.23 -44.235 -44.24 -44.245 -44.25 -44.255 -44.26 -44.265 -44.27 -44.275 -44.28 -44.285 -44.29 -44.295 -44.3 -44.305 -44.31 -44.315 -44.32 -44.325 -44.33 -44.335 -44.34 -44.345 -44.35 -44.355 -44.36 -44.365 -44.37 -44.375 -44.38 -44.385 -44.39 -44.395 -44.4 -44.405 -44.41 -44.415 -44.42 -44.425 -44.43 -44.435 -44.44 -44.445 -44.45 -44.455 -44.46 -44.465 -44.47 -44.475 -44.48 -44.485 -44.49 -44.495 -44.5 -44.505 -44.51 -44.515 -44.52 -44.525 -44.53 -44.535 -44.54 -44.545 -44.55 -44.555 -44.56 -44.565 -44.57 -44.575 -44.58 -44.585 -44.59 -44.595 -44.6 -44.605 -44.61 -44.615 -44.62 -44.625 -44.63 -44.635 -44.64 -44.645 -44.65 -44.655 -44.66 -44.665 -44.67 -44.675 -44.68 -44.685 -44.69 -44.695 -44.7 -44.705 -44.71 -44.715 -44.72 -44.725 -44.73 -44.735 -44.74 -44.745 -44.75 -44.755 -44.76 -44.765 -44.77 -44.775 -44.78 -44.785 -44.79 -44.795 -44.8 -44.805 -44.81 -44.815 -44.82 -44.825 -44.83 -44.835 -44.84 -44.845 -44.85 -44.855 -44.86 -44.865 -44.87 -44.875 -44.88 -44.885 -44.89 -44.895 -44.9 -44.905 -44.91 -44.915 -44.92 -44.925 -44.93 -44.935 -44.94 -44.945 -44.95 -44.955 -44.96 -44.965 -44.97 -44.975 -44.98 -44.985 -44.99 -44.995 -45 -45.005 -45.01 -45.015 -45.02 -45.025 -45.03 -45.035 -45.04 -45.045 -45.05 -45.055 -45.06 -45.065 -45.07 -45.075 -45.08 -45.085 -45.09 -45.095 -45.1 -45.105 -45.11 -45.115 -45.12 -45.125 -45.13 -45.135 -45.14 -45.145 -45.15 -45.155 -45.16 -45.165 -45.17 -45.175 -45.18 -45.185 -45.19 -45.195 -45.2 -45.205 -45.21 -45.215 -45.22 -45.225 -45.23 -45.235 -45.24 -45.245 -45.25 -45.255 -45.26 -45.265 -45.27 -45.275 -45.28 -45.285 -45.29 -45.295 -45.3 -45.305 -45.31 -45.315 -45.32 -45.325 -45.33 -45.335 -45.34 -45.345 -45.35 -45.355 -45.36 -45.365 -45.37 -45.375 -45.38 -45.385 -45.39 -45.395 -45.4 -45.405 -45.41 -45.415 -45.42 -45.425 -45.43 -45.435 -45.44 -45.445 -45.45 -45.455 -45.46 -45.465 -45.47 -45.475 -45.48 -45.485 -45.49 -45.495 -45.5 -45.505 -45.51 -45.515 -45.52 -45.525 -45.53 -45.535 -45.54 -45.545 -45.55 -45.555 -45.56 -45.565 -45.57 -45.575 -45.58 -45.585 -45.59 -45.595 -45.6 -45.605 -45.61 -45.615 -45.62 -45.625 -45.63 -45.635 -45.64 -45.645 -45.65 -45.655 -45.66 -45.665 -45.67 -45.675 -45.68 -45.685 -45.69 -45.695 -45.7 -45.705 -45.71 -45.715 -45.72 -45.725 -45.73 -45.735 -45.74 -45.745 -45.75 -45.755 -45.76 -45.765 -45.77 -45.775 -45.78 -45.785 -45.79 -45.795 -45.8 -45.805 -45.81 -45.815 -45.82 -45.825 -45.83 -45.835 -45.84 -45.845 -45.85 -45.855 -45.86 -45.865 -45.87 -45.875 -45.88 -45.885 -45.89 -45.895 -45.9 -45.905 -45.91 -45.915 -45.92 -45.925 -45.93 -45.935 -45.94 -45.945 -45.95 -45.955 -45.96 -45.965 -45.97 -45.975 -45.98 -45.985 -45.99 -45.995 -46 -46.005 -46.01 -46.015 -46.02 -46.025 -46.03 -46.035 -46.04 -46.045 -46.05 -46.055 -46.06 -46.065 -46.07 -46.075 -46.08 -46.085 -46.09 -46.095 -46.1 -46.105 -46.11 -46.115 -46.12 -46.125 -46.13 -46.135 -46.14 -46.145 -46.15 -46.155 -46.16 -46.165 -46.17 -46.175 -46.18 -46.185 -46.19 -46.195 -46.2 -46.205 -46.21 -46.215 -46.22 -46.225 -46.23 -46.235 -46.24 -46.245 -46.25 -46.255 -46.26 -46.265 -46.27 -46.275 -46.28 -46.285 -46.29 -46.295 -46.3 -46.305 -46.31 -46.315 -46.32 -46.325 -46.33 -46.335 -46.34 -46.345 -46.35 -46.355 -46.36 -46.365 -46.37 -46.375 -46.38 -46.385 -46.39 -46.395 -46.4 -46.405 -46.41 -46.415 -46.42 -46.425 -46.43 -46.435 -46.44 -46.445 -46.45 -46.455 -46.46 -46.465 -46.47 -46.475 -46.48 -46.485 -46.49 -46.495 -46.5 -46.505 -46.51 -46.515 -46.52 -46.525 -46.53 -46.535 -46.54 -46.545 -46.55 -46.555 -46.56 -46.565 -46.57 -46.575 -46.58 -46.585 -46.59 -46.595 -46.6 -46.605 -46.61 -46.615 -46.62 -46.625 -46.63 -46.635 -46.64 -46.645 -46.65 -46.655 -46.66 -46.665 -46.67 -46.675 -46.68 -46.685 -46.69 -46.695 -46.7 -46.705 -46.71 -46.715 -46.72 -46.725 -46.73 -46.735 -46.74 -46.745 -46.75 -46.755 -46.76 -46.765 -46.77 -46.775 -46.78 -46.785 -46.79 -46.795 -46.8 -46.805 -46.81 -46.815 -46.82 -46.825 -46.83 -46.835 -46.84 -46.845 -46.85 -46.855 -46.86 -46.865 -46.87 -46.875 -46.88 -46.885 -46.89 -46.895 -46.9 -46.905 -46.91 -46.915 -46.92 -46.925 -46.93 -46.935 -46.94 -46.945 -46.95 -46.955 -46.96 -46.965 -46.97 -46.975 -46.98 -46.985 -46.99 -46.995 -47 -47.005 -47.01 -47.015 -47.02 -47.025 -47.03 -47.035 -47.04 -47.045 -47.05 -47.055 -47.06 -47.065 -47.07 -47.075 -47.08 -47.085 -47.09 -47.095 -47.1 -47.105 -47.11 -47.115 -47.12 -47.125 -47.13 -47.135 -47.14 -47.145 -47.15 -47.155 -47.16 -47.165 -47.17 -47.175 -47.18 -47.185 -47.19 -47.195 -47.2 -47.205 -47.21 -47.215 -47.22 -47.225 -47.23 -47.235 -47.24 -47.245 -47.25 -47.255 -47.26 -47.265 -47.27 -47.275 -47.28 -47.285 -47.29 -47.295 -47.3 -47.305 -47.31 -47.315 -47.32 -47.325 -47.33 -47.335 -47.34 -47.345 -47.35 -47.355 -47.36 -47.365 -47.37 -47.375 -47.38 -47.385 -47.39 -47.395 -47.4 -47.405 -47.41 -47.415 -47.42 -47.425 -47.43 -47.435 -47.44 -47.445 -47.45 -47.455 -47.46 -47.465 -47.47 -47.475 -47.48 -47.485 -47.49 -47.495 -47.5 -47.505 -47.51 -47.515 -47.52 -47.525 -47.53 -47.535 -47.54 -47.545 -47.55 -47.555 -47.56 -47.565 -47.57 -47.575 -47.58 -47.585 -47.59 -47.595 -47.6 -47.605 -47.61 -47.615 -47.62 -47.625 -47.63 -47.635 -47.64 -47.645 -47.65 -47.655 -47.66 -47.665 -47.67 -47.675 -47.68 -47.685 -47.69 -47.695 -47.7 -47.705 -47.71 -47.715 -47.72 -47.725 -47.73 -47.735 -47.74 -47.745 -47.75 -47.755 -47.76 -47.765 -47.77 -47.775 -47.78 -47.785 -47.79 -47.795 -47.8 -47.805 -47.81 -47.815 -47.82 -47.825 -47.83 -47.835 -47.84 -47.845 -47.85 -47.855 -47.86 -47.865 -47.87 -47.875 -47.88 -47.885 -47.89 -47.895 -47.9 -47.905 -47.91 -47.915 -47.92 -47.925 -47.93 -47.935 -47.94 -47.945 -47.95 -47.955 -47.96 -47.965 -47.97 -47.975 -47.98 -47.985 -47.99 -47.995 -48 -48.005 -48.01 -48.015 -48.02 -48.025 -48.03 -48.035 -48.04 -48.045 -48.05 -48.055 -48.06 -48.065 -48.07 -48.075 -48.08 -48.085 -48.09 -48.095 -48.1 -48.105 -48.11 -48.115 -48.12 -48.125 -48.13 -48.135 -48.14 -48.145 -48.15 -48.155 -48.16 -48.165 -48.17 -48.175 -48.18 -48.185 -48.19 -48.195 -48.2 -48.205 -48.21 -48.215 -48.22 -48.225 -48.23 -48.235 -48.24 -48.245 -48.25 -48.255 -48.26 -48.265 -48.27 -48.275 -48.28 -48.285 -48.29 -48.295 -48.3 -48.305 -48.31 -48.315 -48.32 -48.325 -48.33 -48.335 -48.34 -48.345 -48.35 -48.355 -48.36 -48.365 -48.37 -48.375 -48.38 -48.385 -48.39 -48.395 -48.4 -48.405 -48.41 -48.415 -48.42 -48.425 -48.43 -48.435 -48.44 -48.445 -48.45 -48.455 -48.46 -48.465 -48.47 -48.475 -48.48 -48.485 -48.49 -48.495 -48.5 -48.505 -48.51 -48.515 -48.52 -48.525 -48.53 -48.535 -48.54 -48.545 -48.55 -48.555 -48.56 -48.565 -48.57 -48.575 -48.58 -48.585 -48.59 -48.595 -48.6 -48.605 -48.61 -48.615 -48.62 -48.625 -48.63 -48.635 -48.64 -48.645 -48.65 -48.655 -48.66 -48.665 -48.67 -48.675 -48.68 -48.685 -48.69 -48.695 -48.7 -48.705 -48.71 -48.715 -48.72 -48.725 -48.73 -48.735 -48.74 -48.745 -48.75 -48.755 -48.76 -48.765 -48.77 -48.775 -48.78 -48.785 -48.79 -48.795 -48.8 -48.805 -48.81 -48.815 -48.82 -48.825 -48.83 -48.835 -48.84 -48.845 -48.85 -48.855 -48.86 -48.865 -48.87 -48.875 -48.88 -48.885 -48.89 -48.895 -48.9 -48.905 -48.91 -48.915 -48.92 -48.925 -48.93 -48.935 -48.94 -48.945 -48.95 -48.955 -48.96 -48.965 -48.97 -48.975 -48.98 -48.985 -48.99 -48.995 -49 -49.005 -49.01 -49.015 -49.02 -49.025 -49.03 -49.035 -49.04 -49.045 -49.05 -49.055 -49.06 -49.065 -49.07 -49.075 -49.08 -49.085 -49.09 -49.095 -49.1 -49.105 -49.11 -49.115 -49.12 -49.125 -49.13 -49.135 -49.14 -49.145 -49.15 -49.155 -49.16 -49.165 -49.17 -49.175 -49.18 -49.185 -49.19 -49.195 -49.2 -49.205 -49.21 -49.215 -49.22 -49.225 -49.23 -49.235 -49.24 -49.245 -49.25 -49.255 -49.26 -49.265 -49.27 -49.275 -49.28 -49.285 -49.29 -49.295 -49.3 -49.305 -49.31 -49.315 -49.32 -49.325 -49.33 -49.335 -49.34 -49.345 -49.35 -49.355 -49.36 -49.365 -49.37 -49.375 -49.38 -49.385 -49.39 -49.395 -49.4 -49.405 -49.41 -49.415 -49.42 -49.425 -49.43 -49.435 -49.44 -49.445 -49.45 -49.455 -49.46 -49.465 -49.47 -49.475 -49.48 -49.485 -49.49 -49.495 -49.5 -49.505 -49.51 -49.515 -49.52 -49.525 -49.53 -49.535 -49.54 -49.545 -49.55 -49.555 -49.56 -49.565 -49.57 -49.575 -49.58 -49.585 -49.59 -49.595 -49.6 -49.605 -49.61 -49.615 -49.62 -49.625 -49.63 -49.635 -49.64 -49.645 -49.65 -49.655 -49.66 -49.665 -49.67 -49.675 -49.68 -49.685 -49.69 -49.695 -49.7 -49.705 -49.71 -49.715 -49.72 -49.725 -49.73 -49.735 -49.74 -49.745 -49.75 -49.755 -49.76 -49.765 -49.77 -49.775 -49.78 -49.785 -49.79 -49.795 -49.8 -49.805 -49.81 -49.815 -49.82 -49.825 -49.83 -49.835 -49.84 -49.845 -49.85 -49.855 -49.86 -49.865 -49.87 -49.875 -49.88 -49.885 -49.89 -49.895 -49.9 -49.905 -49.91 -49.915 -49.92 -49.925 -49.93 -49.935 -49.94 -49.945 -49.95 -49.955 -49.96 -49.965 -49.97 -49.975 -49.98 -49.985 -49.99 -49.995 -50 -50.005 -50.01 -50.015 -50.02 -50.025 -50.03 -50.035 -50.04 -50.045 -50.05 -50.055 -50.06 -50.065 -50.07 -50.075 -50.08 -50.085 -50.09 -50.095 -50.1 -50.105 -50.11 -50.115 -50.12 -50.125 -50.13 -50.135 -50.14 -50.145 -50.15 -50.155 -50.16 -50.165 -50.17 -50.175 -50.18 -50.185 -50.19 -50.195 -50.2 -50.205 -50.21 -50.215 -50.22 -50.225 -50.23 -50.235 -50.24 -50.245 -50.25 -50.255 -50.26 -50.265 -50.27 -50.275 -50.28 -50.285 -50.29 -50.295 -50.3 -50.305 -50.31 -50.315 -50.32 -50.325 -50.33 -50.335 -50.34 -50.345 -50.35 -50.355 -50.36 -50.365 -50.37 -50.375 -50.38 -50.385 -50.39 -50.395 -50.4 -50.405 -50.41 -50.415 -50.42 -50.425 -50.43 -50.435 -50.44 -50.445 -50.45 -50.455 -50.46 -50.465 -50.47 -50.475 -50.48 -50.485 -50.49 -50.495 -50.5 -50.505 -50.51 -50.515 -50.52 -50.525 -50.53 -50.535 -50.54 -50.545 -50.55 -50.555 -50.56 -50.565 -50.57 -50.575 -50.58 -50.585 -50.59 -50.595 -50.6 -50.605 -50.61 -50.615 -50.62 -50.625 -50.63 -50.635 -50.64 -50.645 -50.65 -50.655 -50.66 -50.665 -50.67 -50.675 -50.68 -50.685 -50.69 -50.695 -50.7 -50.705 -50.71 -50.715 -50.72 -50.725 -50.73 -50.735 -50.74 -50.745 -50.75 -50.755 -50.76 -50.765 -50.77 -50.775 -50.78 -50.785 -50.79 -50.795 -50.8 -50.805 -50.81 -50.815 -50.82 -50.825 -50.83 -50.835 -50.84 -50.845 -50.85 -50.855 -50.86 -50.865 -50.87 -50.875 -50.88 -50.885 -50.89 -50.895 -50.9 -50.905 -50.91 -50.915 -50.92 -50.925 -50.93 -50.935 -50.94 -50.945 -50.95 -50.955 -50.96 -50.965 -50.97 -50.975 -50.98 -50.985 -50.99 -50.995 -51 -51.005 -51.01 -51.015 -51.02 -51.025 -51.03 -51.035 -51.04 -51.045 -51.05 -51.055 -51.06 -51.065 -51.07 -51.075 -51.08 -51.085 -51.09 -51.095 -51.1 -51.105 -51.11 -51.115 -51.12 -51.125 -51.13 -51.135 -51.14 -51.145 -51.15 -51.155 -51.16 -51.165 -51.17 -51.175 -51.18 -51.185 -51.19 -51.195 -51.2 -51.205 -51.21 -51.215 -51.22 -51.225 -51.23 -51.235 -51.24 -51.245 -51.25 -51.255 -51.26 -51.265 -51.27 -51.275 -51.28 -51.285 -51.29 -51.295 -51.3 -51.305 -51.31 -51.315 -51.32 -51.325 -51.33 -51.335 -51.34 -51.345 -51.35 -51.355 -51.36 -51.365 -51.37 -51.375 -51.38 -51.385 -51.39 -51.395 -51.4 -51.405 -51.41 -51.415 -51.42 -51.425 -51.43 -51.435 -51.44 -51.445 -51.45 -51.455 -51.46 -51.465 -51.47 -51.475 -51.48 -51.485 -51.49 -51.495 -51.5 -51.505 -51.51 -51.515 -51.52 -51.525 -51.53 -51.535 -51.54 -51.545 -51.55 -51.555 -51.56 -51.565 -51.57 -51.575 -51.58 -51.585 -51.59 -51.595 -51.6 -51.605 -51.61 -51.615 -51.62 -51.625 -51.63 -51.635 -51.64 -51.645 -51.65 -51.655 -51.66 -51.665 -51.67 -51.675 -51.68 -51.685 -51.69 -51.695 -51.7 -51.705 -51.71 -51.715 -51.72 -51.725 -51.73 -51.735 -51.74 -51.745 -51.75 -51.755 -51.76 -51.765 -51.77 -51.775 -51.78 -51.785 -51.79 -51.795 -51.8 -51.805 -51.81 -51.815 -51.82 -51.825 -51.83 -51.835 -51.84 -51.845 -51.85 -51.855 -51.86 -51.865 -51.87 -51.875 -51.88 -51.885 -51.89 -51.895 -51.9 -51.905 -51.91 -51.915 -51.92 -51.925 -51.93 -51.935 -51.94 -51.945 -51.95 -51.955 -51.96 -51.965 -51.97 -51.975 -51.98 -51.985 -51.99 -51.995 -52 -52.005 -52.01 -52.015 -52.02 -52.025 -52.03 -52.035 -52.04 -52.045 -52.05 -52.055 -52.06 -52.065 -52.07 -52.075 -52.08 -52.085 -52.09 -52.095 -52.1 -52.105 -52.11 -52.115 -52.12 -52.125 -52.13 -52.135 -52.14 -52.145 -52.15 -52.155 -52.16 -52.165 -52.17 -52.175 -52.18 -52.185 -52.19 -52.195 -52.2 -52.205 -52.21 -52.215 -52.22 -52.225 -52.23 -52.235 -52.24 -52.245 -52.25 -52.255 -52.26 -52.265 -52.27 -52.275 -52.28 -52.285 -52.29 -52.295 -52.3 -52.305 -52.31 -52.315 -52.32 -52.325 -52.33 -52.335 -52.34 -52.345 -52.35 -52.355 -52.36 -52.365 -52.37 -52.375 -52.38 -52.385 -52.39 -52.395 -52.4 -52.405 -52.41 -52.415 -52.42 -52.425 -52.43 -52.435 -52.44 -52.445 -52.45 -52.455 -52.46 -52.465 -52.47 -52.475 -52.48 -52.485 -52.49 -52.495 -52.5 -52.505 -52.51 -52.515 -52.52 -52.525 -52.53 -52.535 -52.54 -52.545 -52.55 -52.555 -52.56 -52.565 -52.57 -52.575 -52.58 -52.585 -52.59 -52.595 -52.6 -52.605 -52.61 -52.615 -52.62 -52.625 -52.63 -52.635 -52.64 -52.645 -52.65 -52.655 -52.66 -52.665 -52.67 -52.675 -52.68 -52.685 -52.69 -52.695 -52.7 -52.705 -52.71 -52.715 -52.72 -52.725 -52.73 -52.735 -52.74 -52.745 -52.75 -52.755 -52.76 -52.765 -52.77 -52.775 -52.78 -52.785 -52.79 -52.795 -52.8 -52.805 -52.81 -52.815 -52.82 -52.825 -52.83 -52.835 -52.84 -52.845 -52.85 -52.855 -52.86 -52.865 -52.87 -52.875 -52.88 -52.885 -52.89 -52.895 -52.9 -52.905 -52.91 -52.915 -52.92 -52.925 -52.93 -52.935 -52.94 -52.945 -52.95 -52.955 -52.96 -52.965 -52.97 -52.975 -52.98 -52.985 -52.99 -52.995 -53 -53.005 -53.01 -53.015 -53.02 -53.025 -53.03 -53.035 -53.04 -53.045 -53.05 -53.055 -53.06 -53.065 -53.07 -53.075 -53.08 -53.085 -53.09 -53.095 -53.1 -53.105 -53.11 -53.115 -53.12 -53.125 -53.13 -53.135 -53.14 -53.145 -53.15 -53.155 -53.16 -53.165 -53.17 -53.175 -53.18 -53.185 -53.19 -53.195 -53.2 -53.205 -53.21 -53.215 -53.22 -53.225 -53.23 -53.235 -53.24 -53.245 -53.25 -53.255 -53.26 -53.265 -53.27 -53.275 -53.28 -53.285 -53.29 -53.295 -53.3 -53.305 -53.31 -53.315 -53.32 -53.325 -53.33 -53.335 -53.34 -53.345 -53.35 -53.355 -53.36 -53.365 -53.37 -53.375 -53.38 -53.385 -53.39 -53.395 -53.4 -53.405 -53.41 -53.415 -53.42 -53.425 -53.43 -53.435 -53.44 -53.445 -53.45 -53.455 -53.46 -53.465 -53.47 -53.475 -53.48 -53.485 -53.49 -53.495 -53.5 -53.505 -53.51 -53.515 -53.52 -53.525 -53.53 -53.535 -53.54 -53.545 -53.55 -53.555 -53.56 -53.565 -53.57 -53.575 -53.58 -53.585 -53.59 -53.595 -53.6 -53.605 -53.61 -53.615 -53.62 -53.625 -53.63 -53.635 -53.64 -53.645 -53.65 -53.655 -53.66 -53.665 -53.67 -53.675 -53.68 -53.685 -53.69 -53.695 -53.7 -53.705 -53.71 -53.715 -53.72 -53.725 -53.73 -53.735 -53.74 -53.745 -53.75 -53.755 -53.76 -53.765 -53.77 -53.775 -53.78 -53.785 -53.79 -53.795 -53.8 -53.805 -53.81 -53.815 -53.82 -53.825 -53.83 -53.835 -53.84 -53.845 -53.85 -53.855 -53.86 -53.865 -53.87 -53.875 -53.88 -53.885 -53.89 -53.895 -53.9 -53.905 -53.91 -53.915 -53.92 -53.925 -53.93 -53.935 -53.94 -53.945 -53.95 -53.955 -53.96 -53.965 -53.97 -53.975 -53.98 -53.985 -53.99 -53.995 -54 -54.005 -54.01 -54.015 -54.02 -54.025 -54.03 -54.035 -54.04 -54.045 -54.05 -54.055 -54.06 -54.065 -54.07 -54.075 -54.08 -54.085 -54.09 -54.095 -54.1 -54.105 -54.11 -54.115 -54.12 -54.125 -54.13 -54.135 -54.14 -54.145 -54.15 -54.155 -54.16 -54.165 -54.17 -54.175 -54.18 -54.185 -54.19 -54.195 -54.2 -54.205 -54.21 -54.215 -54.22 -54.225 -54.23 -54.235 -54.24 -54.245 -54.25 -54.255 -54.26 -54.265 -54.27 -54.275 -54.28 -54.285 -54.29 -54.295 -54.3 -54.305 -54.31 -54.315 -54.32 -54.325 -54.33 -54.335 -54.34 -54.345 -54.35 -54.355 -54.36 -54.365 -54.37 -54.375 -54.38 -54.385 -54.39 -54.395 -54.4 -54.405 -54.41 -54.415 -54.42 -54.425 -54.43 -54.435 -54.44 -54.445 -54.45 -54.455 -54.46 -54.465 -54.47 -54.475 -54.48 -54.485 -54.49 -54.495 -54.5 -54.505 -54.51 -54.515 -54.52 -54.525 -54.53 -54.535 -54.54 -54.545 -54.55 -54.555 -54.56 -54.565 -54.57 -54.575 -54.58 -54.585 -54.59 -54.595 -54.6 -54.605 -54.61 -54.615 -54.62 -54.625 -54.63 -54.635 -54.64 -54.645 -54.65 -54.655 -54.66 -54.665 -54.67 -54.675 -54.68 -54.685 -54.69 -54.695 -54.7 -54.705 -54.71 -54.715 -54.72 -54.725 -54.73 -54.735 -54.74 -54.745 -54.75 -54.755 -54.76 -54.765 -54.77 -54.775 -54.78 -54.785 -54.79 -54.795 -54.8 -54.805 -54.81 -54.815 -54.82 -54.825 -54.83 -54.835 -54.84 -54.845 -54.85 -54.855 -54.86 -54.865 -54.87 -54.875 -54.88 -54.885 -54.89 -54.895 -54.9 -54.905 -54.91 -54.915 -54.92 -54.925 -54.93 -54.935 -54.94 -54.945 -54.95 -54.955 -54.96 -54.965 -54.97 -54.975 -54.98 -54.985 -54.99 -54.995 -55 -55.005 -55.01 -55.015 -55.02 -55.025 -55.03 -55.035 -55.04 -55.045 -55.05 -55.055 -55.06 -55.065 -55.07 -55.075 -55.08 -55.085 -55.09 -55.095 -55.1 -55.105 -55.11 -55.115 -55.12 -55.125 -55.13 -55.135 -55.14 -55.145 -55.15 -55.155 -55.16 -55.165 -55.17 -55.175 -55.18 -55.185 -55.19 -55.195 -55.2 -55.205 -55.21 -55.215 -55.22 -55.225 -55.23 -55.235 -55.24 -55.245 -55.25 -55.255 -55.26 -55.265 -55.27 -55.275 -55.28 -55.285 -55.29 -55.295 -55.3 -55.305 -55.31 -55.315 -55.32 -55.325 -55.33 -55.335 -55.34 -55.345 -55.35 -55.355 -55.36 -55.365 -55.37 -55.375 -55.38 -55.385 -55.39 -55.395 -55.4 -55.405 -55.41 -55.415 -55.42 -55.425 -55.43 -55.435 -55.44 -55.445 -55.45 -55.455 -55.46 -55.465 -55.47 -55.475 -55.48 -55.485 -55.49 -55.495 -55.5 -55.505 -55.51 -55.515 -55.52 -55.525 -55.53 -55.535 -55.54 -55.545 -55.55 -55.555 -55.56 -55.565 -55.57 -55.575 -55.58 -55.585 -55.59 -55.595 -55.6 -55.605 -55.61 -55.615 -55.62 -55.625 -55.63 -55.635 -55.64 -55.645 -55.65 -55.655 -55.66 -55.665 -55.67 -55.675 -55.68 -55.685 -55.69 -55.695 -55.7 -55.705 -55.71 -55.715 -55.72 -55.725 -55.73 -55.735 -55.74 -55.745 -55.75 -55.755 -55.76 -55.765 -55.77 -55.775 -55.78 -55.785 -55.79 -55.795 -55.8 -55.805 -55.81 -55.815 -55.82 -55.825 -55.83 -55.835 -55.84 -55.845 -55.85 -55.855 -55.86 -55.865 -55.87 -55.875 -55.88 -55.885 -55.89 -55.895 -55.9 -55.905 -55.91 -55.915 -55.92 -55.925 -55.93 -55.935 -55.94 -55.945 -55.95 -55.955 -55.96 -55.965 -55.97 -55.975 -55.98 -55.985 -55.99 -55.995 -56 -56.005 -56.01 -56.015 -56.02 -56.025 -56.03 -56.035 -56.04 -56.045 -56.05 -56.055 -56.06 -56.065 -56.07 -56.075 -56.08 -56.085 -56.09 -56.095 -56.1 -56.105 -56.11 -56.115 -56.12 -56.125 -56.13 -56.135 -56.14 -56.145 -56.15 -56.155 -56.16 -56.165 -56.17 -56.175 -56.18 -56.185 -56.19 -56.195 -56.2 -56.205 -56.21 -56.215 -56.22 -56.225 -56.23 -56.235 -56.24 -56.245 -56.25 -56.255 -56.26 -56.265 -56.27 -56.275 -56.28 -56.285 -56.29 -56.295 -56.3 -56.305 -56.31 -56.315 -56.32 -56.325 -56.33 -56.335 -56.34 -56.345 -56.35 -56.355 -56.36 -56.365 -56.37 -56.375 -56.38 -56.385 -56.39 -56.395 -56.4 -56.405 -56.41 -56.415 -56.42 -56.425 -56.43 -56.435 -56.44 -56.445 -56.45 -56.455 -56.46 -56.465 -56.47 -56.475 -56.48 -56.485 -56.49 -56.495 -56.5 -56.505 -56.51 -56.515 -56.52 -56.525 -56.53 -56.535 -56.54 -56.545 -56.55 -56.555 -56.56 -56.565 -56.57 -56.575 -56.58 -56.585 -56.59 -56.595 -56.6 -56.605 -56.61 -56.615 -56.62 -56.625 -56.63 -56.635 -56.64 -56.645 -56.65 -56.655 -56.66 -56.665 -56.67 -56.675 -56.68 -56.685 -56.69 -56.695 -56.7 -56.705 -56.71 -56.715 -56.72 -56.725 -56.73 -56.735 -56.74 -56.745 -56.75 -56.755 -56.76 -56.765 -56.77 -56.775 -56.78 -56.785 -56.79 -56.795 -56.8 -56.805 -56.81 -56.815 -56.82 -56.825 -56.83 -56.835 -56.84 -56.845 -56.85 -56.855 -56.86 -56.865 -56.87 -56.875 -56.88 -56.885 -56.89 -56.895 -56.9 -56.905 -56.91 -56.915 -56.92 -56.925 -56.93 -56.935 -56.94 -56.945 -56.95 -56.955 -56.96 -56.965 -56.97 -56.975 -56.98 -56.985 -56.99 -56.995 -57 -57.005 -57.01 -57.015 -57.02 -57.025 -57.03 -57.035 -57.04 -57.045 -57.05 -57.055 -57.06 -57.065 -57.07 -57.075 -57.08 -57.085 -57.09 -57.095 -57.1 -57.105 -57.11 -57.115 -57.12 -57.125 -57.13 -57.135 -57.14 -57.145 -57.15 -57.155 -57.16 -57.165 -57.17 -57.175 -57.18 -57.185 -57.19 -57.195 -57.2 -57.205 -57.21 -57.215 -57.22 -57.225 -57.23 -57.235 -57.24 -57.245 -57.25 -57.255 -57.26 -57.265 -57.27 -57.275 -57.28 -57.285 -57.29 -57.295 -57.3 -57.305 -57.31 -57.315 -57.32 -57.325 -57.33 -57.335 -57.34 -57.345 -57.35 -57.355 -57.36 -57.365 -57.37 -57.375 -57.38 -57.385 -57.39 -57.395 -57.4 -57.405 -57.41 -57.415 -57.42 -57.425 -57.43 -57.435 -57.44 -57.445 -57.45 -57.455 -57.46 -57.465 -57.47 -57.475 -57.48 -57.485 -57.49 -57.495 -57.5 -57.505 -57.51 -57.515 -57.52 -57.525 -57.53 -57.535 -57.54 -57.545 -57.55 -57.555 -57.56 -57.565 -57.57 -57.575 -57.58 -57.585 -57.59 -57.595 -57.6 -57.605 -57.61 -57.615 -57.62 -57.625 -57.63 -57.635 -57.64 -57.645 -57.65 -57.655 -57.66 -57.665 -57.67 -57.675 -57.68 -57.685 -57.69 -57.695 -57.7 -57.705 -57.71 -57.715 -57.72 -57.725 -57.73 -57.735 -57.74 -57.745 -57.75 -57.755 -57.76 -57.765 -57.77 -57.775 -57.78 -57.785 -57.79 -57.795 -57.8 -57.805 -57.81 -57.815 -57.82 -57.825 -57.83 -57.835 -57.84 -57.845 -57.85 -57.855 -57.86 -57.865 -57.87 -57.875 -57.88 -57.885 -57.89 -57.895 -57.9 -57.905 -57.91 -57.915 -57.92 -57.925 -57.93 -57.935 -57.94 -57.945 -57.95 -57.955 -57.96 -57.965 -57.97 -57.975 -57.98 -57.985 -57.99 -57.995 -58 -58.005 -58.01 -58.015 -58.02 -58.025 -58.03 -58.035 -58.04 -58.045 -58.05 -58.055 -58.06 -58.065 -58.07 -58.075 -58.08 -58.085 -58.09 -58.095 -58.1 -58.105 -58.11 -58.115 -58.12 -58.125 -58.13 -58.135 -58.14 -58.145 -58.15 -58.155 -58.16 -58.165 -58.17 -58.175 -58.18 -58.185 -58.19 -58.195 -58.2 -58.205 -58.21 -58.215 -58.22 -58.225 -58.23 -58.235 -58.24 -58.245 -58.25 -58.255 -58.26 -58.265 -58.27 -58.275 -58.28 -58.285 -58.29 -58.295 -58.3 -58.305 -58.31 -58.315 -58.32 -58.325 -58.33 -58.335 -58.34 -58.345 -58.35 -58.355 -58.36 -58.365 -58.37 -58.375 -58.38 -58.385 -58.39 -58.395 -58.4 -58.405 -58.41 -58.415 -58.42 -58.425 -58.43 -58.435 -58.44 -58.445 -58.45 -58.455 -58.46 -58.465 -58.47 -58.475 -58.48 -58.485 -58.49 -58.495 -58.5 -58.505 -58.51 -58.515 -58.52 -58.525 -58.53 -58.535 -58.54 -58.545 -58.55 -58.555 -58.56 -58.565 -58.57 -58.575 -58.58 -58.585 -58.59 -58.595 -58.6 -58.605 -58.61 -58.615 -58.62 -58.625 -58.63 -58.635 -58.64 -58.645 -58.65 -58.655 -58.66 -58.665 -58.67 -58.675 -58.68 -58.685 -58.69 -58.695 -58.7 -58.705 -58.71 -58.715 -58.72 -58.725 -58.73 -58.735 -58.74 -58.745 -58.75 -58.755 -58.76 -58.765 -58.77 -58.775 -58.78 -58.785 -58.79 -58.795 -58.8 -58.805 -58.81 -58.815 -58.82 -58.825 -58.83 -58.835 -58.84 -58.845 -58.85 -58.855 -58.86 -58.865 -58.87 -58.875 -58.88 -58.885 -58.89 -58.895 -58.9 -58.905 -58.91 -58.915 -58.92 -58.925 -58.93 -58.935 -58.94 -58.945 -58.95 -58.955 -58.96 -58.965 -58.97 -58.975 -58.98 -58.985 -58.99 -58.995 -59 -59.005 -59.01 -59.015 -59.02 -59.025 -59.03 -59.035 -59.04 -59.045 -59.05 -59.055 -59.06 -59.065 -59.07 -59.075 -59.08 -59.085 -59.09 -59.095 -59.1 -59.105 -59.11 -59.115 -59.12 -59.125 -59.13 -59.135 -59.14 -59.145 -59.15 -59.155 -59.16 -59.165 -59.17 -59.175 -59.18 -59.185 -59.19 -59.195 -59.2 -59.205 -59.21 -59.215 -59.22 -59.225 -59.23 -59.235 -59.24 -59.245 -59.25 -59.255 -59.26 -59.265 -59.27 -59.275 -59.28 -59.285 -59.29 -59.295 -59.3 -59.305 -59.31 -59.315 -59.32 -59.325 -59.33 -59.335 -59.34 -59.345 -59.35 -59.355 -59.36 -59.365 -59.37 -59.375 -59.38 -59.385 -59.39 -59.395 -59.4 -59.405 -59.41 -59.415 -59.42 -59.425 -59.43 -59.435 -59.44 -59.445 -59.45 -59.455 -59.46 -59.465 -59.47 -59.475 -59.48 -59.485 -59.49 -59.495 -59.5 -59.505 -59.51 -59.515 -59.52 -59.525 -59.53 -59.535 -59.54 -59.545 -59.55 -59.555 -59.56 -59.565 -59.57 -59.575 -59.58 -59.585 -59.59 -59.595 -59.6 -59.605 -59.61 -59.615 -59.62 -59.625 -59.63 -59.635 -59.64 -59.645 -59.65 -59.655 -59.66 -59.665 -59.67 -59.675 -59.68 -59.685 -59.69 -59.695 -59.7 -59.705 -59.71 -59.715 -59.72 -59.725 -59.73 -59.735 -59.74 -59.745 -59.75 -59.755 -59.76 -59.765 -59.77 -59.775 -59.78 -59.785 -59.79 -59.795 -59.8 -59.805 -59.81 -59.815 -59.82 -59.825 -59.83 -59.835 -59.84 -59.845 -59.85 -59.855 -59.86 -59.865 -59.87 -59.875 -59.88 -59.885 -59.89 -59.895 -59.9 -59.905 -59.91 -59.915 -59.92 -59.925 -59.93 -59.935 -59.94 -59.945 -59.95 -59.955 -59.96 -59.965 -59.97 -59.975 -59.98 -59.985 -59.99 -59.995 -60 -60.005 -60.01 -60.015 -60.02 -60.025 -60.03 -60.035 -60.04 -60.045 -60.05 -60.055 -60.06 -60.065 -60.07 -60.075 -60.08 -60.085 -60.09 -60.095 -60.1 -60.105 -60.11 -60.115 -60.12 -60.125 -60.13 -60.135 -60.14 -60.145 -60.15 -60.155 -60.16 -60.165 -60.17 -60.175 -60.18 -60.185 -60.19 -60.195 -60.2 -60.205 -60.21 -60.215 -60.22 -60.225 -60.23 -60.235 -60.24 -60.245 -60.25 -60.255 -60.26 -60.265 -60.27 -60.275 -60.28 -60.285 -60.29 -60.295 -60.3 -60.305 -60.31 -60.315 -60.32 -60.325 -60.33 -60.335 -60.34 -60.345 -60.35 -60.355 -60.36 -60.365 -60.37 -60.375 -60.38 -60.385 -60.39 -60.395 -60.4 -60.405 -60.41 -60.415 -60.42 -60.425 -60.43 -60.435 -60.44 -60.445 -60.45 -60.455 -60.46 -60.465 -60.47 -60.475 -60.48 -60.485 -60.49 -60.495 -60.5 -60.505 -60.51 -60.515 -60.52 -60.525 -60.53 -60.535 -60.54 -60.545 -60.55 -60.555 -60.56 -60.565 -60.57 -60.575 -60.58 -60.585 -60.59 -60.595 -60.6 -60.605 -60.61 -60.615 -60.62 -60.625 -60.63 -60.635 -60.64 -60.645 -60.65 -60.655 -60.66 -60.665 -60.67 -60.675 -60.68 -60.685 -60.69 -60.695 -60.7 -60.705 -60.71 -60.715 -60.72 -60.725 -60.73 -60.735 -60.74 -60.745 -60.75 -60.755 -60.76 -60.765 -60.77 -60.775 -60.78 -60.785 -60.79 -60.795 -60.8 -60.805 -60.81 -60.815 -60.82 -60.825 -60.83 -60.835 -60.84 -60.845 -60.85 -60.855 -60.86 -60.865 -60.87 -60.875 -60.88 -60.885 -60.89 -60.895 -60.9 -60.905 -60.91 -60.915 -60.92 -60.925 -60.93 -60.935 -60.94 -60.945 -60.95 -60.955 -60.96 -60.965 -60.97 -60.975 -60.98 -60.985 -60.99 -60.995 -61 -61.005 -61.01 -61.015 -61.02 -61.025 -61.03 -61.035 -61.04 -61.045 -61.05 -61.055 -61.06 -61.065 -61.07 -61.075 -61.08 -61.085 -61.09 -61.095 -61.1 -61.105 -61.11 -61.115 -61.12 -61.125 -61.13 -61.135 -61.14 -61.145 -61.15 -61.155 -61.16 -61.165 -61.17 -61.175 -61.18 -61.185 -61.19 -61.195 -61.2 -61.205 -61.21 -61.215 -61.22 -61.225 -61.23 -61.235 -61.24 -61.245 -61.25 -61.255 -61.26 -61.265 -61.27 -61.275 -61.28 -61.285 -61.29 -61.295 -61.3 -61.305 -61.31 -61.315 -61.32 -61.325 -61.33 -61.335 -61.34 -61.345 -61.35 -61.355 -61.36 -61.365 -61.37 -61.375 -61.38 -61.385 -61.39 -61.395 -61.4 -61.405 -61.41 -61.415 -61.42 -61.425 -61.43 -61.435 -61.44 -61.445 -61.45 -61.455 -61.46 -61.465 -61.47 -61.475 -61.48 -61.485 -61.49 -61.495 -61.5 -61.505 -61.51 -61.515 -61.52 -61.525 -61.53 -61.535 -61.54 -61.545 -61.55 -61.555 -61.56 -61.565 -61.57 -61.575 -61.58 -61.585 -61.59 -61.595 -61.6 -61.605 -61.61 -61.615 -61.62 -61.625 -61.63 -61.635 -61.64 -61.645 -61.65 -61.655 -61.66 -61.665 -61.67 -61.675 -61.68 -61.685 -61.69 -61.695 -61.7 -61.705 -61.71 -61.715 -61.72 -61.725 -61.73 -61.735 -61.74 -61.745 -61.75 -61.755 -61.76 -61.765 -61.77 -61.775 -61.78 -61.785 -61.79 -61.795 -61.8 -61.805 -61.81 -61.815 -61.82 -61.825 -61.83 -61.835 -61.84 -61.845 -61.85 -61.855 -61.86 -61.865 -61.87 -61.875 -61.88 -61.885 -61.89 -61.895 -61.9 -61.905 -61.91 -61.915 -61.92 -61.925 -61.93 -61.935 -61.94 -61.945 -61.95 -61.955 -61.96 -61.965 -61.97 -61.975 -61.98 -61.985 -61.99 -61.995 -62 -62.005 -62.01 -62.015 -62.02 -62.025 -62.03 -62.035 -62.04 -62.045 -62.05 -62.055 -62.06 -62.065 -62.07 -62.075 -62.08 -62.085 -62.09 -62.095 -62.1 -62.105 -62.11 -62.115 -62.12 -62.125 -62.13 -62.135 -62.14 -62.145 -62.15 -62.155 -62.16 -62.165 -62.17 -62.175 -62.18 -62.185 -62.19 -62.195 -62.2 -62.205 -62.21 -62.215 -62.22 -62.225 -62.23 -62.235 -62.24 -62.245 -62.25 -62.255 -62.26 -62.265 -62.27 -62.275 -62.28 -62.285 -62.29 -62.295 -62.3 -62.305 -62.31 -62.315 -62.32 -62.325 -62.33 -62.335 -62.34 -62.345 -62.35 -62.355 -62.36 -62.365 -62.37 -62.375 -62.38 -62.385 -62.39 -62.395 -62.4 -62.405 -62.41 -62.415 -62.42 -62.425 -62.43 -62.435 -62.44 -62.445 -62.45 -62.455 -62.46 -62.465 -62.47 -62.475 -62.48 -62.485 -62.49 -62.495 -62.5 -62.505 -62.51 -62.515 -62.52 -62.525 -62.53 -62.535 -62.54 -62.545 -62.55 -62.555 -62.56 -62.565 -62.57 -62.575 -62.58 -62.585 -62.59 -62.595 -62.6 -62.605 -62.61 -62.615 -62.62 -62.625 -62.63 -62.635 -62.64 -62.645 -62.65 -62.655 -62.66 -62.665 -62.67 -62.675 -62.68 -62.685 -62.69 -62.695 -62.7 -62.705 -62.71 -62.715 -62.72 -62.725 -62.73 -62.735 -62.74 -62.745 -62.75 -62.755 -62.76 -62.765 -62.77 -62.775 -62.78 -62.785 -62.79 -62.795 -62.8 -62.805 -62.81 -62.815 -62.82 -62.825 -62.83 -62.835 -62.84 -62.845 -62.85 -62.855 -62.86 -62.865 -62.87 -62.875 -62.88 -62.885 -62.89 -62.895 -62.9 -62.905 -62.91 -62.915 -62.92 -62.925 -62.93 -62.935 -62.94 -62.945 -62.95 -62.955 -62.96 -62.965 -62.97 -62.975 -62.98 -62.985 -62.99 -62.995 -63 -63.005 -63.01 -63.015 -63.02 -63.025 -63.03 -63.035 -63.04 -63.045 -63.05 -63.055 -63.06 -63.065 -63.07 -63.075 -63.08 -63.085 -63.09 -63.095 -63.1 -63.105 -63.11 -63.115 -63.12 -63.125 -63.13 -63.135 -63.14 -63.145 -63.15 -63.155 -63.16 -63.165 -63.17 -63.175 -63.18 -63.185 -63.19 -63.195 -63.2 -63.205 -63.21 -63.215 -63.22 -63.225 -63.23 -63.235 -63.24 -63.245 -63.25 -63.255 -63.26 -63.265 -63.27 -63.275 -63.28 -63.285 -63.29 -63.295 -63.3 -63.305 -63.31 -63.315 -63.32 -63.325 -63.33 -63.335 -63.34 -63.345 -63.35 -63.355 -63.36 -63.365 -63.37 -63.375 -63.38 -63.385 -63.39 -63.395 -63.4 -63.405 -63.41 -63.415 -63.42 -63.425 -63.43 -63.435 -63.44 -63.445 -63.45 -63.455 -63.46 -63.465 -63.47 -63.475 -63.48 -63.485 -63.49 -63.495 -63.5 -63.505 -63.51 -63.515 -63.52 -63.525 -63.53 -63.535 -63.54 -63.545 -63.55 -63.555 -63.56 -63.565 -63.57 -63.575 -63.58 -63.585 -63.59 -63.595 -63.6 -63.605 -63.61 -63.615 -63.62 -63.625 -63.63 -63.635 -63.64 -63.645 -63.65 -63.655 -63.66 -63.665 -63.67 -63.675 -63.68 -63.685 -63.69 -63.695 -63.7 -63.705 -63.71 -63.715 -63.72 -63.725 -63.73 -63.735 -63.74 -63.745 -63.75 -63.755 -63.76 -63.765 -63.77 -63.775 -63.78 -63.785 -63.79 -63.795 -63.8 -63.805 -63.81 -63.815 -63.82 -63.825 -63.83 -63.835 -63.84 -63.845 -63.85 -63.855 -63.86 -63.865 -63.87 -63.875 -63.88 -63.885 -63.89 -63.895 -63.9 -63.905 -63.91 -63.915 -63.92 -63.925 -63.93 -63.935 -63.94 -63.945 -63.95 -63.955 -63.96 -63.965 -63.97 -63.975 -63.98 -63.985 -63.99 -63.995 -64 -64.005 -64.01 -64.015 -64.02 -64.025 -64.03 -64.035 -64.04 -64.045 -64.05 -64.055 -64.06 -64.065 -64.07 -64.075 -64.08 -64.085 -64.09 -64.095 -64.1 -64.105 -64.11 -64.115 -64.12 -64.125 -64.13 -64.135 -64.14 -64.145 -64.15 -64.155 -64.16 -64.165 -64.17 -64.175 -64.18 -64.185 -64.19 -64.195 -64.2 -64.205 -64.21 -64.215 -64.22 -64.225 -64.23 -64.235 -64.24 -64.245 -64.25 -64.255 -64.26 -64.265 -64.27 -64.275 -64.28 -64.285 -64.29 -64.295 -64.3 -64.305 -64.31 -64.315 -64.32 -64.325 -64.33 -64.335 -64.34 -64.345 -64.35 -64.355 -64.36 -64.365 -64.37 -64.375 -64.38 -64.385 -64.39 -64.395 -64.4 -64.405 -64.41 -64.415 -64.42 -64.425 -64.43 -64.435 -64.44 -64.445 -64.45 -64.455 -64.46 -64.465 -64.47 -64.475 -64.48 -64.485 -64.49 -64.495 -64.5 -64.505 -64.51 -64.515 -64.52 -64.525 -64.53 -64.535 -64.54 -64.545 -64.55 -64.555 -64.56 -64.565 -64.57 -64.575 -64.58 -64.585 -64.59 -64.595 -64.6 -64.605 -64.61 -64.615 -64.62 -64.625 -64.63 -64.635 -64.64 -64.645 -64.65 -64.655 -64.66 -64.665 -64.67 -64.675 -64.68 -64.685 -64.69 -64.695 -64.7 -64.705 -64.71 -64.715 -64.72 -64.725 -64.73 -64.735 -64.74 -64.745 -64.75 -64.755 -64.76 -64.765 -64.77 -64.775 -64.78 -64.785 -64.79 -64.795 -64.8 -64.805 -64.81 -64.815 -64.82 -64.825 -64.83 -64.835 -64.84 -64.845 -64.85 -64.855 -64.86 -64.865 -64.87 -64.875 -64.88 -64.885 -64.89 -64.895 -64.9 -64.905 -64.91 -64.915 -64.92 -64.925 -64.93 -64.935 -64.94 -64.945 -64.95 -64.955 -64.96 -64.965 -64.97 -64.975 -64.98 -64.985 -64.99 -64.995 -65 -65.005 -65.01 -65.015 -65.02 -65.025 -65.03 -65.035 -65.04 -65.045 -65.05 -65.055 -65.06 -65.065 -65.07 -65.075 -65.08 -65.085 -65.09 -65.095 -65.1 -65.105 -65.11 -65.115 -65.12 -65.125 -65.13 -65.135 -65.14 -65.145 -65.15 -65.155 -65.16 -65.165 -65.17 -65.175 -65.18 -65.185 -65.19 -65.195 -65.2 -65.205 -65.21 -65.215 -65.22 -65.225 -65.23 -65.235 -65.24 -65.245 -65.25 -65.255 -65.26 -65.265 -65.27 -65.275 -65.28 -65.285 -65.29 -65.295 -65.3 -65.305 -65.31 -65.315 -65.32 -65.325 -65.33 -65.335 -65.34 -65.345 -65.35 -65.355 -65.36 -65.365 -65.37 -65.375 -65.38 -65.385 -65.39 -65.395 -65.4 -65.405 -65.41 -65.415 -65.42 -65.425 -65.43 -65.435 -65.44 -65.445 -65.45 -65.455 -65.46 -65.465 -65.47 -65.475 -65.48 -65.485 -65.49 -65.495 -65.5 -65.505 -65.51 -65.515 -65.52 -65.525 -65.53 -65.535 -65.54 -65.545 -65.55 -65.555 -65.56 -65.565 -65.57 -65.575 -65.58 -65.585 -65.59 -65.595 -65.6 -65.605 -65.61 -65.615 -65.62 -65.625 -65.63 -65.635 -65.64 -65.645 -65.65 -65.655 -65.66 -65.665 -65.67 -65.675 -65.68 -65.685 -65.69 -65.695 -65.7 -65.705 -65.71 -65.715 -65.72 -65.725 -65.73 -65.735 -65.74 -65.745 -65.75 -65.755 -65.76 -65.765 -65.77 -65.775 -65.78 -65.785 -65.79 -65.795 -65.8 -65.805 -65.81 -65.815 -65.82 -65.825 -65.83 -65.835 -65.84 -65.845 -65.85 -65.855 -65.86 -65.865 -65.87 -65.875 -65.88 -65.885 -65.89 -65.895 -65.9 -65.905 -65.91 -65.915 -65.92 -65.925 -65.93 -65.935 -65.94 -65.945 -65.95 -65.955 -65.96 -65.965 -65.97 -65.975 -65.98 -65.985 -65.99 -65.995 -66 -66.005 -66.01 -66.015 -66.02 -66.025 -66.03 -66.035 -66.04 -66.045 -66.05 -66.055 -66.06 -66.065 -66.07 -66.075 -66.08 -66.085 -66.09 -66.095 -66.1 -66.105 -66.11 -66.115 -66.12 -66.125 -66.13 -66.135 -66.14 -66.145 -66.15 -66.155 -66.16 -66.165 -66.17 -66.175 -66.18 -66.185 -66.19 -66.195 -66.2 -66.205 -66.21 -66.215 -66.22 -66.225 -66.23 -66.235 -66.24 -66.245 -66.25 -66.255 -66.26 -66.265 -66.27 -66.275 -66.28 -66.285 -66.29 -66.295 -66.3 -66.305 -66.31 -66.315 -66.32 -66.325 -66.33 -66.335 -66.34 -66.345 -66.35 -66.355 -66.36 -66.365 -66.37 -66.375 -66.38 -66.385 -66.39 -66.395 -66.4 -66.405 -66.41 -66.415 -66.42 -66.425 -66.43 -66.435 -66.44 -66.445 -66.45 -66.455 -66.46 -66.465 -66.47 -66.475 -66.48 -66.485 -66.49 -66.495 -66.5 -66.505 -66.51 -66.515 -66.52 -66.525 -66.53 -66.535 -66.54 -66.545 -66.55 -66.555 -66.56 -66.565 -66.57 -66.575 -66.58 -66.585 -66.59 -66.595 -66.6 -66.605 -66.61 -66.615 -66.62 -66.625 -66.63 -66.635 -66.64 -66.645 -66.65 -66.655 -66.66 -66.665 -66.67 -66.675 -66.68 -66.685 -66.69 -66.695 -66.7 -66.705 -66.71 -66.715 -66.72 -66.725 -66.73 -66.735 -66.74 -66.745 -66.75 -66.755 -66.76 -66.765 -66.77 -66.775 -66.78 -66.785 -66.79 -66.795 -66.8 -66.805 -66.81 -66.815 -66.82 -66.825 -66.83 -66.835 -66.84 -66.845 -66.85 -66.855 -66.86 -66.865 -66.87 -66.875 -66.88 -66.885 -66.89 -66.895 -66.9 -66.905 -66.91 -66.915 -66.92 -66.925 -66.93 -66.935 -66.94 -66.945 -66.95 -66.955 -66.96 -66.965 -66.97 -66.975 -66.98 -66.985 -66.99 -66.995 -67 -67.005 -67.01 -67.015 -67.02 -67.025 -67.03 -67.035 -67.04 -67.045 -67.05 -67.055 -67.06 -67.065 -67.07 -67.075 -67.08 -67.085 -67.09 -67.095 -67.1 -67.105 -67.11 -67.115 -67.12 -67.125 -67.13 -67.135 -67.14 -67.145 -67.15 -67.155 -67.16 -67.165 -67.17 -67.175 -67.18 -67.185 -67.19 -67.195 -67.2 -67.205 -67.21 -67.215 -67.22 -67.225 -67.23 -67.235 -67.24 -67.245 -67.25 -67.255 -67.26 -67.265 -67.27 -67.275 -67.28 -67.285 -67.29 -67.295 -67.3 -67.305 -67.31 -67.315 -67.32 -67.325 -67.33 -67.335 -67.34 -67.345 -67.35 -67.355 -67.36 -67.365 -67.37 -67.375 -67.38 -67.385 -67.39 -67.395 -67.4 -67.405 -67.41 -67.415 -67.42 -67.425 -67.43 -67.435 -67.44 -67.445 -67.45 -67.455 -67.46 -67.465 -67.47 -67.475 -67.48 -67.485 -67.49 -67.495 -67.5 -67.505 -67.51 -67.515 -67.52 -67.525 -67.53 -67.535 -67.54 -67.545 -67.55 -67.555 -67.56 -67.565 -67.57 -67.575 -67.58 -67.585 -67.59 -67.595 -67.6 -67.605 -67.61 -67.615 -67.62 -67.625 -67.63 -67.635 -67.64 -67.645 -67.65 -67.655 -67.66 -67.665 -67.67 -67.675 -67.68 -67.685 -67.69 -67.695 -67.7 -67.705 -67.71 -67.715 -67.72 -67.725 -67.73 -67.735 -67.74 -67.745 -67.75 -67.755 -67.76 -67.765 -67.77 -67.775 -67.78 -67.785 -67.79 -67.795 -67.8 -67.805 -67.81 -67.815 -67.82 -67.825 -67.83 -67.835 -67.84 -67.845 -67.85 -67.855 -67.86 -67.865 -67.87 -67.875 -67.88 -67.885 -67.89 -67.895 -67.9 -67.905 -67.91 -67.915 -67.92 -67.925 -67.93 -67.935 -67.94 -67.945 -67.95 -67.955 -67.96 -67.965 -67.97 -67.975 -67.98 -67.985 -67.99 -67.995 -68 -68.005 -68.01 -68.015 -68.02 -68.025 -68.03 -68.035 -68.04 -68.045 -68.05 -68.055 -68.06 -68.065 -68.07 -68.075 -68.08 -68.085 -68.09 -68.095 -68.1 -68.105 -68.11 -68.115 -68.12 -68.125 -68.13 -68.135 -68.14 -68.145 -68.15 -68.155 -68.16 -68.165 -68.17 -68.175 -68.18 -68.185 -68.19 -68.195 -68.2 -68.205 -68.21 -68.215 -68.22 -68.225 -68.23 -68.235 -68.24 -68.245 -68.25 -68.255 -68.26 -68.265 -68.27 -68.275 -68.28 -68.285 -68.29 -68.295 -68.3 -68.305 -68.31 -68.315 -68.32 -68.325 -68.33 -68.335 -68.34 -68.345 -68.35 -68.355 -68.36 -68.365 -68.37 -68.375 -68.38 -68.385 -68.39 -68.395 -68.4 -68.405 -68.41 -68.415 -68.42 -68.425 -68.43 -68.435 -68.44 -68.445 -68.45 -68.455 -68.46 -68.465 -68.47 -68.475 -68.48 -68.485 -68.49 -68.495 -68.5 -68.505 -68.51 -68.515 -68.52 -68.525 -68.53 -68.535 -68.54 -68.545 -68.55 -68.555 -68.56 -68.565 -68.57 -68.575 -68.58 -68.585 -68.59 -68.595 -68.6 -68.605 -68.61 -68.615 -68.62 -68.625 -68.63 -68.635 -68.64 -68.645 -68.65 -68.655 -68.66 -68.665 -68.67 -68.675 -68.68 -68.685 -68.69 -68.695 -68.7 -68.705 -68.71 -68.715 -68.72 -68.725 -68.73 -68.735 -68.74 -68.745 -68.75 -68.755 -68.76 -68.765 -68.77 -68.775 -68.78 -68.785 -68.79 -68.795 -68.8 -68.805 -68.81 -68.815 -68.82 -68.825 -68.83 -68.835 -68.84 -68.845 -68.85 -68.855 -68.86 -68.865 -68.87 -68.875 -68.88 -68.885 -68.89 -68.895 -68.9 -68.905 -68.91 -68.915 -68.92 -68.925 -68.93 -68.935 -68.94 -68.945 -68.95 -68.955 -68.96 -68.965 -68.97 -68.975 -68.98 -68.985 -68.99 -68.995 -69 -69.005 -69.01 -69.015 -69.02 -69.025 -69.03 -69.035 -69.04 -69.045 -69.05 -69.055 -69.06 -69.065 -69.07 -69.075 -69.08 -69.085 -69.09 -69.095 -69.1 -69.105 -69.11 -69.115 -69.12 -69.125 -69.13 -69.135 -69.14 -69.145 -69.15 -69.155 -69.16 -69.165 -69.17 -69.175 -69.18 -69.185 -69.19 -69.195 -69.2 -69.205 -69.21 -69.215 -69.22 -69.225 -69.23 -69.235 -69.24 -69.245 -69.25 -69.255 -69.26 -69.265 -69.27 -69.275 -69.28 -69.285 -69.29 -69.295 -69.3 -69.305 -69.31 -69.315 -69.32 -69.325 -69.33 -69.335 -69.34 -69.345 -69.35 -69.355 -69.36 -69.365 -69.37 -69.375 -69.38 -69.385 -69.39 -69.395 -69.4 -69.405 -69.41 -69.415 -69.42 -69.425 -69.43 -69.435 -69.44 -69.445 -69.45 -69.455 -69.46 -69.465 -69.47 -69.475 -69.48 -69.485 -69.49 -69.495 -69.5 -69.505 -69.51 -69.515 -69.52 -69.525 -69.53 -69.535 -69.54 -69.545 -69.55 -69.555 -69.56 -69.565 -69.57 -69.575 -69.58 -69.585 -69.59 -69.595 -69.6 -69.605 -69.61 -69.615 -69.62 -69.625 -69.63 -69.635 -69.64 -69.645 -69.65 -69.655 -69.66 -69.665 -69.67 -69.675 -69.68 -69.685 -69.69 -69.695 -69.7 -69.705 -69.71 -69.715 -69.72 -69.725 -69.73 -69.735 -69.74 -69.745 -69.75 -69.755 -69.76 -69.765 -69.77 -69.775 -69.78 -69.785 -69.79 -69.795 -69.8 -69.805 -69.81 -69.815 -69.82 -69.825 -69.83 -69.835 -69.84 -69.845 -69.85 -69.855 -69.86 -69.865 -69.87 -69.875 -69.88 -69.885 -69.89 -69.895 -69.9 -69.905 -69.91 -69.915 -69.92 -69.925 -69.93 -69.935 -69.94 -69.945 -69.95 -69.955 -69.96 -69.965 -69.97 -69.975 -69.98 -69.985 -69.99 -69.995 -70 -70.005 -70.01 -70.015 -70.02 -70.025 -70.03 -70.035 -70.04 -70.045 -70.05 -70.055 -70.06 -70.065 -70.07 -70.075 -70.08 -70.085 -70.09 -70.095 -70.1 -70.105 -70.11 -70.115 -70.12 -70.125 -70.13 -70.135 -70.14 -70.145 -70.15 -70.155 -70.16 -70.165 -70.17 -70.175 -70.18 -70.185 -70.19 -70.195 -70.2 -70.205 -70.21 -70.215 -70.22 -70.225 -70.23 -70.235 -70.24 -70.245 -70.25 -70.255 -70.26 -70.265 -70.27 -70.275 -70.28 -70.285 -70.29 -70.295 -70.3 -70.305 -70.31 -70.315 -70.32 -70.325 -70.33 -70.335 -70.34 -70.345 -70.35 -70.355 -70.36 -70.365 -70.37 -70.375 -70.38 -70.385 -70.39 -70.395 -70.4 -70.405 -70.41 -70.415 -70.42 -70.425 -70.43 -70.435 -70.44 -70.445 -70.45 -70.455 -70.46 -70.465 -70.47 -70.475 -70.48 -70.485 -70.49 -70.495 -70.5 -70.505 -70.51 -70.515 -70.52 -70.525 -70.53 -70.535 -70.54 -70.545 -70.55 -70.555 -70.56 -70.565 -70.57 -70.575 -70.58 -70.585 -70.59 -70.595 -70.6 -70.605 -70.61 -70.615 -70.62 -70.625 -70.63 -70.635 -70.64 -70.645 -70.65 -70.655 -70.66 -70.665 -70.67 -70.675 -70.68 -70.685 -70.69 -70.695 -70.7 -70.705 -70.71 -70.715 -70.72 -70.725 -70.73 -70.735 -70.74 -70.745 -70.75 -70.755 -70.76 -70.765 -70.77 -70.775 -70.78 -70.785 -70.79 -70.795 -70.8 -70.805 -70.81 -70.815 -70.82 -70.825 -70.83 -70.835 -70.84 -70.845 -70.85 -70.855 -70.86 -70.865 -70.87 -70.875 -70.88 -70.885 -70.89 -70.895 -70.9 -70.905 -70.91 -70.915 -70.92 -70.925 -70.93 -70.935 -70.94 -70.945 -70.95 -70.955 -70.96 -70.965 -70.97 -70.975 -70.98 -70.985 -70.99 -70.995 -71 -71.005 -71.01 -71.015 -71.02 -71.025 -71.03 -71.035 -71.04 -71.045 -71.05 -71.055 -71.06 -71.065 -71.07 -71.075 -71.08 -71.085 -71.09 -71.095 -71.1 -71.105 -71.11 -71.115 -71.12 -71.125 -71.13 -71.135 -71.14 -71.145 -71.15 -71.155 -71.16 -71.165 -71.17 -71.175 -71.18 -71.185 -71.19 -71.195 -71.2 -71.205 -71.21 -71.215 -71.22 -71.225 -71.23 -71.235 -71.24 -71.245 -71.25 -71.255 -71.26 -71.265 -71.27 -71.275 -71.28 -71.285 -71.29 -71.295 -71.3 -71.305 -71.31 -71.315 -71.32 -71.325 -71.33 -71.335 -71.34 -71.345 -71.35 -71.355 -71.36 -71.365 -71.37 -71.375 -71.38 -71.385 -71.39 -71.395 -71.4 -71.405 -71.41 -71.415 -71.42 -71.425 -71.43 -71.435 -71.44 -71.445 -71.45 -71.455 -71.46 -71.465 -71.47 -71.475 -71.48 -71.485 -71.49 -71.495 -71.5 -71.505 -71.51 -71.515 -71.52 -71.525 -71.53 -71.535 -71.54 -71.545 -71.55 -71.555 -71.56 -71.565 -71.57 -71.575 -71.58 -71.585 -71.59 -71.595 -71.6 -71.605 -71.61 -71.615 -71.62 -71.625 -71.63 -71.635 -71.64 -71.645 -71.65 -71.655 -71.66 -71.665 -71.67 -71.675 -71.68 -71.685 -71.69 -71.695 -71.7 -71.705 -71.71 -71.715 -71.72 -71.725 -71.73 -71.735 -71.74 -71.745 -71.75 -71.755 -71.76 -71.765 -71.77 -71.775 -71.78 -71.785 -71.79 -71.795 -71.8 -71.805 -71.81 -71.815 -71.82 -71.825 -71.83 -71.835 -71.84 -71.845 -71.85 -71.855 -71.86 -71.865 -71.87 -71.875 -71.88 -71.885 -71.89 -71.895 -71.9 -71.905 -71.91 -71.915 -71.92 -71.925 -71.93 -71.935 -71.94 -71.945 -71.95 -71.955 -71.96 -71.965 -71.97 -71.975 -71.98 -71.985 -71.99 -71.995 -72 -72.005 -72.01 -72.015 -72.02 -72.025 -72.03 -72.035 -72.04 -72.045 -72.05 -72.055 -72.06 -72.065 -72.07 -72.075 -72.08 -72.085 -72.09 -72.095 -72.1 -72.105 -72.11 -72.115 -72.12 -72.125 -72.13 -72.135 -72.14 -72.145 -72.15 -72.155 -72.16 -72.165 -72.17 -72.175 -72.18 -72.185 -72.19 -72.195 -72.2 -72.205 -72.21 -72.215 -72.22 -72.225 -72.23 -72.235 -72.24 -72.245 -72.25 -72.255 -72.26 -72.265 -72.27 -72.275 -72.28 -72.285 -72.29 -72.295 -72.3 -72.305 -72.31 -72.315 -72.32 -72.325 -72.33 -72.335 -72.34 -72.345 -72.35 -72.355 -72.36 -72.365 -72.37 -72.375 -72.38 -72.385 -72.39 -72.395 -72.4 -72.405 -72.41 -72.415 -72.42 -72.425 -72.43 -72.435 -72.44 -72.445 -72.45 -72.455 -72.46 -72.465 -72.47 -72.475 -72.48 -72.485 -72.49 -72.495 -72.5 -72.505 -72.51 -72.515 -72.52 -72.525 -72.53 -72.535 -72.54 -72.545 -72.55 -72.555 -72.56 -72.565 -72.57 -72.575 -72.58 -72.585 -72.59 -72.595 -72.6 -72.605 -72.61 -72.615 -72.62 -72.625 -72.63 -72.635 -72.64 -72.645 -72.65 -72.655 -72.66 -72.665 -72.67 -72.675 -72.68 -72.685 -72.69 -72.695 -72.7 -72.705 -72.71 -72.715 -72.72 -72.725 -72.73 -72.735 -72.74 -72.745 -72.75 -72.755 -72.76 -72.765 -72.77 -72.775 -72.78 -72.785 -72.79 -72.795 -72.8 -72.805 -72.81 -72.815 -72.82 -72.825 -72.83 -72.835 -72.84 -72.845 -72.85 -72.855 -72.86 -72.865 -72.87 -72.875 -72.88 -72.885 -72.89 -72.895 -72.9 -72.905 -72.91 -72.915 -72.92 -72.925 -72.93 -72.935 -72.94 -72.945 -72.95 -72.955 -72.96 -72.965 -72.97 -72.975 -72.98 -72.985 -72.99 -72.995 -73 -73.005 -73.01 -73.015 -73.02 -73.025 -73.03 -73.035 -73.04 -73.045 -73.05 -73.055 -73.06 -73.065 -73.07 -73.075 -73.08 -73.085 -73.09 -73.095 -73.1 -73.105 -73.11 -73.115 -73.12 -73.125 -73.13 -73.135 -73.14 -73.145 -73.15 -73.155 -73.16 -73.165 -73.17 -73.175 -73.18 -73.185 -73.19 -73.195 -73.2 -73.205 -73.21 -73.215 -73.22 -73.225 -73.23 -73.235 -73.24 -73.245 -73.25 -73.255 -73.26 -73.265 -73.27 -73.275 -73.28 -73.285 -73.29 -73.295 -73.3 -73.305 -73.31 -73.315 -73.32 -73.325 -73.33 -73.335 -73.34 -73.345 -73.35 -73.355 -73.36 -73.365 -73.37 -73.375 -73.38 -73.385 -73.39 -73.395 -73.4 -73.405 -73.41 -73.415 -73.42 -73.425 -73.43 -73.435 -73.44 -73.445 -73.45 -73.455 -73.46 -73.465 -73.47 -73.475 -73.48 -73.485 -73.49 -73.495 -73.5 -73.505 -73.51 -73.515 -73.52 -73.525 -73.53 -73.535 -73.54 -73.545 -73.55 -73.555 -73.56 -73.565 -73.57 -73.575 -73.58 -73.585 -73.59 -73.595 -73.6 -73.605 -73.61 -73.615 -73.62 -73.625 -73.63 -73.635 -73.64 -73.645 -73.65 -73.655 -73.66 -73.665 -73.67 -73.675 -73.68 -73.685 -73.69 -73.695 -73.7 -73.705 -73.71 -73.715 -73.72 -73.725 -73.73 -73.735 -73.74 -73.745 -73.75 -73.755 -73.76 -73.765 -73.77 -73.775 -73.78 -73.785 -73.79 -73.795 -73.8 -73.805 -73.81 -73.815 -73.82 -73.825 -73.83 -73.835 -73.84 -73.845 -73.85 -73.855 -73.86 -73.865 -73.87 -73.875 -73.88 -73.885 -73.89 -73.895 -73.9 -73.905 -73.91 -73.915 -73.92 -73.925 -73.93 -73.935 -73.94 -73.945 -73.95 -73.955 -73.96 -73.965 -73.97 -73.975 -73.98 -73.985 -73.99 -73.995 -74 -74.005 -74.01 -74.015 -74.02 -74.025 -74.03 -74.035 -74.04 -74.045 -74.05 -74.055 -74.06 -74.065 -74.07 -74.075 -74.08 -74.085 -74.09 -74.095 -74.1 -74.105 -74.11 -74.115 -74.12 -74.125 -74.13 -74.135 -74.14 -74.145 -74.15 -74.155 -74.16 -74.165 -74.17 -74.175 -74.18 -74.185 -74.19 -74.195 -74.2 -74.205 -74.21 -74.215 -74.22 -74.225 -74.23 -74.235 -74.24 -74.245 -74.25 -74.255 -74.26 -74.265 -74.27 -74.275 -74.28 -74.285 -74.29 -74.295 -74.3 -74.305 -74.31 -74.315 -74.32 -74.325 -74.33 -74.335 -74.34 -74.345 -74.35 -74.355 -74.36 -74.365 -74.37 -74.375 -74.38 -74.385 -74.39 -74.395 -74.4 -74.405 -74.41 -74.415 -74.42 -74.425 -74.43 -74.435 -74.44 -74.445 -74.45 -74.455 -74.46 -74.465 -74.47 -74.475 -74.48 -74.485 -74.49 -74.495 -74.5 -74.505 -74.51 -74.515 -74.52 -74.525 -74.53 -74.535 -74.54 -74.545 -74.55 -74.555 -74.56 -74.565 -74.57 -74.575 -74.58 -74.585 -74.59 -74.595 -74.6 -74.605 -74.61 -74.615 -74.62 -74.625 -74.63 -74.635 -74.64 -74.645 -74.65 -74.655 -74.66 -74.665 -74.67 -74.675 -74.68 -74.685 -74.69 -74.695 -74.7 -74.705 -74.71 -74.715 -74.72 -74.725 -74.73 -74.735 -74.74 -74.745 -74.75 -74.755 -74.76 -74.765 -74.77 -74.775 -74.78 -74.785 -74.79 -74.795 -74.8 -74.805 -74.81 -74.815 -74.82 -74.825 -74.83 -74.835 -74.84 -74.845 -74.85 -74.855 -74.86 -74.865 -74.87 -74.875 -74.88 -74.885 -74.89 -74.895 -74.9 -74.905 -74.91 -74.915 -74.92 -74.925 -74.93 -74.935 -74.94 -74.945 -74.95 -74.955 -74.96 -74.965 -74.97 -74.975 -74.98 -74.985 -74.99 -74.995 -75 -75.005 -75.01 -75.015 -75.02 -75.025 -75.03 -75.035 -75.04 -75.045 -75.05 -75.055 -75.06 -75.065 -75.07 -75.075 -75.08 -75.085 -75.09 -75.095 -75.1 -75.105 -75.11 -75.115 -75.12 -75.125 -75.13 -75.135 -75.14 -75.145 -75.15 -75.155 -75.16 -75.165 -75.17 -75.175 -75.18 -75.185 -75.19 -75.195 -75.2 -75.205 -75.21 -75.215 -75.22 -75.225 -75.23 -75.235 -75.24 -75.245 -75.25 -75.255 -75.26 -75.265 -75.27 -75.275 -75.28 -75.285 -75.29 -75.295 -75.3 -75.305 -75.31 -75.315 -75.32 -75.325 -75.33 -75.335 -75.34 -75.345 -75.35 -75.355 -75.36 -75.365 -75.37 -75.375 -75.38 -75.385 -75.39 -75.395 -75.4 -75.405 -75.41 -75.415 -75.42 -75.425 -75.43 -75.435 -75.44 -75.445 -75.45 -75.455 -75.46 -75.465 -75.47 -75.475 -75.48 -75.485 -75.49 -75.495 -75.5 -75.505 -75.51 -75.515 -75.52 -75.525 -75.53 -75.535 -75.54 -75.545 -75.55 -75.555 -75.56 -75.565 -75.57 -75.575 -75.58 -75.585 -75.59 -75.595 -75.6 -75.605 -75.61 -75.615 -75.62 -75.625 -75.63 -75.635 -75.64 -75.645 -75.65 -75.655 -75.66 -75.665 -75.67 -75.675 -75.68 -75.685 -75.69 -75.695 -75.7 -75.705 -75.71 -75.715 -75.72 -75.725 -75.73 -75.735 -75.74 -75.745 -75.75 -75.755 -75.76 -75.765 -75.77 -75.775 -75.78 -75.785 -75.79 -75.795 -75.8 -75.805 -75.81 -75.815 -75.82 -75.825 -75.83 -75.835 -75.84 -75.845 -75.85 -75.855 -75.86 -75.865 -75.87 -75.875 -75.88 -75.885 -75.89 -75.895 -75.9 -75.905 -75.91 -75.915 -75.92 -75.925 -75.93 -75.935 -75.94 -75.945 -75.95 -75.955 -75.96 -75.965 -75.97 -75.975 -75.98 -75.985 -75.99 -75.995 -76 -76.005 -76.01 -76.015 -76.02 -76.025 -76.03 -76.035 -76.04 -76.045 -76.05 -76.055 -76.06 -76.065 -76.07 -76.075 -76.08 -76.085 -76.09 -76.095 -76.1 -76.105 -76.11 -76.115 -76.12 -76.125 -76.13 -76.135 -76.14 -76.145 -76.15 -76.155 -76.16 -76.165 -76.17 -76.175 -76.18 -76.185 -76.19 -76.195 -76.2 -76.205 -76.21 -76.215 -76.22 -76.225 -76.23 -76.235 -76.24 -76.245 -76.25 -76.255 -76.26 -76.265 -76.27 -76.275 -76.28 -76.285 -76.29 -76.295 -76.3 -76.305 -76.31 -76.315 -76.32 -76.325 -76.33 -76.335 -76.34 -76.345 -76.35 -76.355 -76.36 -76.365 -76.37 -76.375 -76.38 -76.385 -76.39 -76.395 -76.4 -76.405 -76.41 -76.415 -76.42 -76.425 -76.43 -76.435 -76.44 -76.445 -76.45 -76.455 -76.46 -76.465 -76.47 -76.475 -76.48 -76.485 -76.49 -76.495 -76.5 -76.505 -76.51 -76.515 -76.52 -76.525 -76.53 -76.535 -76.54 -76.545 -76.55 -76.555 -76.56 -76.565 -76.57 -76.575 -76.58 -76.585 -76.59 -76.595 -76.6 -76.605 -76.61 -76.615 -76.62 -76.625 -76.63 -76.635 -76.64 -76.645 -76.65 -76.655 -76.66 -76.665 -76.67 -76.675 -76.68 -76.685 -76.69 -76.695 -76.7 -76.705 -76.71 -76.715 -76.72 -76.725 -76.73 -76.735 -76.74 -76.745 -76.75 -76.755 -76.76 -76.765 -76.77 -76.775 -76.78 -76.785 -76.79 -76.795 -76.8 -76.805 -76.81 -76.815 -76.82 -76.825 -76.83 -76.835 -76.84 -76.845 -76.85 -76.855 -76.86 -76.865 -76.87 -76.875 -76.88 -76.885 -76.89 -76.895 -76.9 -76.905 -76.91 -76.915 -76.92 -76.925 -76.93 -76.935 -76.94 -76.945 -76.95 -76.955 -76.96 -76.965 -76.97 -76.975 -76.98 -76.985 -76.99 -76.995 -77 -77.005 -77.01 -77.015 -77.02 -77.025 -77.03 -77.035 -77.04 -77.045 -77.05 -77.055 -77.06 -77.065 -77.07 -77.075 -77.08 -77.085 -77.09 -77.095 -77.1 -77.105 -77.11 -77.115 -77.12 -77.125 -77.13 -77.135 -77.14 -77.145 -77.15 -77.155 -77.16 -77.165 -77.17 -77.175 -77.18 -77.185 -77.19 -77.195 -77.2 -77.205 -77.21 -77.215 -77.22 -77.225 -77.23 -77.235 -77.24 -77.245 -77.25 -77.255 -77.26 -77.265 -77.27 -77.275 -77.28 -77.285 -77.29 -77.295 -77.3 -77.305 -77.31 -77.315 -77.32 -77.325 -77.33 -77.335 -77.34 -77.345 -77.35 -77.355 -77.36 -77.365 -77.37 -77.375 -77.38 -77.385 -77.39 -77.395 -77.4 -77.405 -77.41 -77.415 -77.42 -77.425 -77.43 -77.435 -77.44 -77.445 -77.45 -77.455 -77.46 -77.465 -77.47 -77.475 -77.48 -77.485 -77.49 -77.495 -77.5 -77.505 -77.51 -77.515 -77.52 -77.525 -77.53 -77.535 -77.54 -77.545 -77.55 -77.555 -77.56 -77.565 -77.57 -77.575 -77.58 -77.585 -77.59 -77.595 -77.6 -77.605 -77.61 -77.615 -77.62 -77.625 -77.63 -77.635 -77.64 -77.645 -77.65 -77.655 -77.66 -77.665 -77.67 -77.675 -77.68 -77.685 -77.69 -77.695 -77.7 -77.705 -77.71 -77.715 -77.72 -77.725 -77.73 -77.735 -77.74 -77.745 -77.75 -77.755 -77.76 -77.765 -77.77 -77.775 -77.78 -77.785 -77.79 -77.795 -77.8 -77.805 -77.81 -77.815 -77.82 -77.825 -77.83 -77.835 -77.84 -77.845 -77.85 -77.855 -77.86 -77.865 -77.87 -77.875 -77.88 -77.885 -77.89 -77.895 -77.9 -77.905 -77.91 -77.915 -77.92 -77.925 -77.93 -77.935 -77.94 -77.945 -77.95 -77.955 -77.96 -77.965 -77.97 -77.975 -77.98 -77.985 -77.99 -77.995 -78 -78.005 -78.01 -78.015 -78.02 -78.025 -78.03 -78.035 -78.04 -78.045 -78.05 -78.055 -78.06 -78.065 -78.07 -78.075 -78.08 -78.085 -78.09 -78.095 -78.1 -78.105 -78.11 -78.115 -78.12 -78.125 -78.13 -78.135 -78.14 -78.145 -78.15 -78.155 -78.16 -78.165 -78.17 -78.175 -78.18 -78.185 -78.19 -78.195 -78.2 -78.205 -78.21 -78.215 -78.22 -78.225 -78.23 -78.235 -78.24 -78.245 -78.25 -78.255 -78.26 -78.265 -78.27 -78.275 -78.28 -78.285 -78.29 -78.295 -78.3 -78.305 -78.31 -78.315 -78.32 -78.325 -78.33 -78.335 -78.34 -78.345 -78.35 -78.355 -78.36 -78.365 -78.37 -78.375 -78.38 -78.385 -78.39 -78.395 -78.4 -78.405 -78.41 -78.415 -78.42 -78.425 -78.43 -78.435 -78.44 -78.445 -78.45 -78.455 -78.46 -78.465 -78.47 -78.475 -78.48 -78.485 -78.49 -78.495 -78.5 -78.505 -78.51 -78.515 -78.52 -78.525 -78.53 -78.535 -78.54 -78.545 -78.55 -78.555 -78.56 -78.565 -78.57 -78.575 -78.58 -78.585 -78.59 -78.595 -78.6 -78.605 -78.61 -78.615 -78.62 -78.625 -78.63 -78.635 -78.64 -78.645 -78.65 -78.655 -78.66 -78.665 -78.67 -78.675 -78.68 -78.685 -78.69 -78.695 -78.7 -78.705 -78.71 -78.715 -78.72 -78.725 -78.73 -78.735 -78.74 -78.745 -78.75 -78.755 -78.76 -78.765 -78.77 -78.775 -78.78 -78.785 -78.79 -78.795 -78.8 -78.805 -78.81 -78.815 -78.82 -78.825 -78.83 -78.835 -78.84 -78.845 -78.85 -78.855 -78.86 -78.865 -78.87 -78.875 -78.88 -78.885 -78.89 -78.895 -78.9 -78.905 -78.91 -78.915 -78.92 -78.925 -78.93 -78.935 -78.94 -78.945 -78.95 -78.955 -78.96 -78.965 -78.97 -78.975 -78.98 -78.985 -78.99 -78.995 -79 -79.005 -79.01 -79.015 -79.02 -79.025 -79.03 -79.035 -79.04 -79.045 -79.05 -79.055 -79.06 -79.065 -79.07 -79.075 -79.08 -79.085 -79.09 -79.095 -79.1 -79.105 -79.11 -79.115 -79.12 -79.125 -79.13 -79.135 -79.14 -79.145 -79.15 -79.155 -79.16 -79.165 -79.17 -79.175 -79.18 -79.185 -79.19 -79.195 -79.2 -79.205 -79.21 -79.215 -79.22 -79.225 -79.23 -79.235 -79.24 -79.245 -79.25 -79.255 -79.26 -79.265 -79.27 -79.275 -79.28 -79.285 -79.29 -79.295 -79.3 -79.305 -79.31 -79.315 -79.32 -79.325 -79.33 -79.335 -79.34 -79.345 -79.35 -79.355 -79.36 -79.365 -79.37 -79.375 -79.38 -79.385 -79.39 -79.395 -79.4 -79.405 -79.41 -79.415 -79.42 -79.425 -79.43 -79.435 -79.44 -79.445 -79.45 -79.455 -79.46 -79.465 -79.47 -79.475 -79.48 -79.485 -79.49 -79.495 -79.5 -79.505 -79.51 -79.515 -79.52 -79.525 -79.53 -79.535 -79.54 -79.545 -79.55 -79.555 -79.56 -79.565 -79.57 -79.575 -79.58 -79.585 -79.59 -79.595 -79.6 -79.605 -79.61 -79.615 -79.62 -79.625 -79.63 -79.635 -79.64 -79.645 -79.65 -79.655 -79.66 -79.665 -79.67 -79.675 -79.68 -79.685 -79.69 -79.695 -79.7 -79.705 -79.71 -79.715 -79.72 -79.725 -79.73 -79.735 -79.74 -79.745 -79.75 -79.755 -79.76 -79.765 -79.77 -79.775 -79.78 -79.785 -79.79 -79.795 -79.8 -79.805 -79.81 -79.815 -79.82 -79.825 -79.83 -79.835 -79.84 -79.845 -79.85 -79.855 -79.86 -79.865 -79.87 -79.875 -79.88 -79.885 -79.89 -79.895 -79.9 -79.905 -79.91 -79.915 -79.92 -79.925 -79.93 -79.935 -79.94 -79.945 -79.95 -79.955 -79.96 -79.965 -79.97 -79.975 -79.98 -79.985 -79.99 -79.995 -80 -80.005 -80.01 -80.015 -80.02 -80.025 -80.03 -80.035 -80.04 -80.045 -80.05 -80.055 -80.06 -80.065 -80.07 -80.075 -80.08 -80.085 -80.09 -80.095 -80.1 -80.105 -80.11 -80.115 -80.12 -80.125 -80.13 -80.135 -80.14 -80.145 -80.15 -80.155 -80.16 -80.165 -80.17 -80.175 -80.18 -80.185 -80.19 -80.195 -80.2 -80.205 -80.21 -80.215 -80.22 -80.225 -80.23 -80.235 -80.24 -80.245 -80.25 -80.255 -80.26 -80.265 -80.27 -80.275 -80.28 -80.285 -80.29 -80.295 -80.3 -80.305 -80.31 -80.315 -80.32 -80.325 -80.33 -80.335 -80.34 -80.345 -80.35 -80.355 -80.36 -80.365 -80.37 -80.375 -80.38 -80.385 -80.39 -80.395 -80.4 -80.405 -80.41 -80.415 -80.42 -80.425 -80.43 -80.435 -80.44 -80.445 -80.45 -80.455 -80.46 -80.465 -80.47 -80.475 -80.48 -80.485 -80.49 -80.495 -80.5 -80.505 -80.51 -80.515 -80.52 -80.525 -80.53 -80.535 -80.54 -80.545 -80.55 -80.555 -80.56 -80.565 -80.57 -80.575 -80.58 -80.585 -80.59 -80.595 -80.6 -80.605 -80.61 -80.615 -80.62 -80.625 -80.63 -80.635 -80.64 -80.645 -80.65 -80.655 -80.66 -80.665 -80.67 -80.675 -80.68 -80.685 -80.69 -80.695 -80.7 -80.705 -80.71 -80.715 -80.72 -80.725 -80.73 -80.735 -80.74 -80.745 -80.75 -80.755 -80.76 -80.765 -80.77 -80.775 -80.78 -80.785 -80.79 -80.795 -80.8 -80.805 -80.81 -80.815 -80.82 -80.825 -80.83 -80.835 -80.84 -80.845 -80.85 -80.855 -80.86 -80.865 -80.87 -80.875 -80.88 -80.885 -80.89 -80.895 -80.9 -80.905 -80.91 -80.915 -80.92 -80.925 -80.93 -80.935 -80.94 -80.945 -80.95 -80.955 -80.96 -80.965 -80.97 -80.975 -80.98 -80.985 -80.99 -80.995 -81 -81.005 -81.01 -81.015 -81.02 -81.025 -81.03 -81.035 -81.04 -81.045 -81.05 -81.055 -81.06 -81.065 -81.07 -81.075 -81.08 -81.085 -81.09 -81.095 -81.1 -81.105 -81.11 -81.115 -81.12 -81.125 -81.13 -81.135 -81.14 -81.145 -81.15 -81.155 -81.16 -81.165 -81.17 -81.175 -81.18 -81.185 -81.19 -81.195 -81.2 -81.205 -81.21 -81.215 -81.22 -81.225 -81.23 -81.235 -81.24 -81.245 -81.25 -81.255 -81.26 -81.265 -81.27 -81.275 -81.28 -81.285 -81.29 -81.295 -81.3 -81.305 -81.31 -81.315 -81.32 -81.325 -81.33 -81.335 -81.34 -81.345 -81.35 -81.355 -81.36 -81.365 -81.37 -81.375 -81.38 -81.385 -81.39 -81.395 -81.4 -81.405 -81.41 -81.415 -81.42 -81.425 -81.43 -81.435 -81.44 -81.445 -81.45 -81.455 -81.46 -81.465 -81.47 -81.475 -81.48 -81.485 -81.49 -81.495 -81.5 -81.505 -81.51 -81.515 -81.52 -81.525 -81.53 -81.535 -81.54 -81.545 -81.55 -81.555 -81.56 -81.565 -81.57 -81.575 -81.58 -81.585 -81.59 -81.595 -81.6 -81.605 -81.61 -81.615 -81.62 -81.625 -81.63 -81.635 -81.64 -81.645 -81.65 -81.655 -81.66 -81.665 -81.67 -81.675 -81.68 -81.685 -81.69 -81.695 -81.7 -81.705 -81.71 -81.715 -81.72 -81.725 -81.73 -81.735 -81.74 -81.745 -81.75 -81.755 -81.76 -81.765 -81.77 -81.775 -81.78 -81.785 -81.79 -81.795 -81.8 -81.805 -81.81 -81.815 -81.82 -81.825 -81.83 -81.835 -81.84 -81.845 -81.85 -81.855 -81.86 -81.865 -81.87 -81.875 -81.88 -81.885 -81.89 -81.895 -81.9 -81.905 -81.91 -81.915 -81.92 -81.925 -81.93 -81.935 -81.94 -81.945 -81.95 -81.955 -81.96 -81.965 -81.97 -81.975 -81.98 -81.985 -81.99 -81.995 -82 -82.005 -82.01 -82.015 -82.02 -82.025 -82.03 -82.035 -82.04 -82.045 -82.05 -82.055 -82.06 -82.065 -82.07 -82.075 -82.08 -82.085 -82.09 -82.095 -82.1 -82.105 -82.11 -82.115 -82.12 -82.125 -82.13 -82.135 -82.14 -82.145 -82.15 -82.155 -82.16 -82.165 -82.17 -82.175 -82.18 -82.185 -82.19 -82.195 -82.2 -82.205 -82.21 -82.215 -82.22 -82.225 -82.23 -82.235 -82.24 -82.245 -82.25 -82.255 -82.26 -82.265 -82.27 -82.275 -82.28 -82.285 -82.29 -82.295 -82.3 -82.305 -82.31 -82.315 -82.32 -82.325 -82.33 -82.335 -82.34 -82.345 -82.35 -82.355 -82.36 -82.365 -82.37 -82.375 -82.38 -82.385 -82.39 -82.395 -82.4 -82.405 -82.41 -82.415 -82.42 -82.425 -82.43 -82.435 -82.44 -82.445 -82.45 -82.455 -82.46 -82.465 -82.47 -82.475 -82.48 -82.485 -82.49 -82.495 -82.5 -82.505 -82.51 -82.515 -82.52 -82.525 -82.53 -82.535 -82.54 -82.545 -82.55 -82.555 -82.56 -82.565 -82.57 -82.575 -82.58 -82.585 -82.59 -82.595 -82.6 -82.605 -82.61 -82.615 -82.62 -82.625 -82.63 -82.635 -82.64 -82.645 -82.65 -82.655 -82.66 -82.665 -82.67 -82.675 -82.68 -82.685 -82.69 -82.695 -82.7 -82.705 -82.71 -82.715 -82.72 -82.725 -82.73 -82.735 -82.74 -82.745 -82.75 -82.755 -82.76 -82.765 -82.77 -82.775 -82.78 -82.785 -82.79 -82.795 -82.8 -82.805 -82.81 -82.815 -82.82 -82.825 -82.83 -82.835 -82.84 -82.845 -82.85 -82.855 -82.86 -82.865 -82.87 -82.875 -82.88 -82.885 -82.89 -82.895 -82.9 -82.905 -82.91 -82.915 -82.92 -82.925 -82.93 -82.935 -82.94 -82.945 -82.95 -82.955 -82.96 -82.965 -82.97 -82.975 -82.98 -82.985 -82.99 -82.995 -83 -83.005 -83.01 -83.015 -83.02 -83.025 -83.03 -83.035 -83.04 -83.045 -83.05 -83.055 -83.06 -83.065 -83.07 -83.075 -83.08 -83.085 -83.09 -83.095 -83.1 -83.105 -83.11 -83.115 -83.12 -83.125 -83.13 -83.135 -83.14 -83.145 -83.15 -83.155 -83.16 -83.165 -83.17 -83.175 -83.18 -83.185 -83.19 -83.195 -83.2 -83.205 -83.21 -83.215 -83.22 -83.225 -83.23 -83.235 -83.24 -83.245 -83.25 -83.255 -83.26 -83.265 -83.27 -83.275 -83.28 -83.285 -83.29 -83.295 -83.3 -83.305 -83.31 -83.315 -83.32 -83.325 -83.33 -83.335 -83.34 -83.345 -83.35 -83.355 -83.36 -83.365 -83.37 -83.375 -83.38 -83.385 -83.39 -83.395 -83.4 -83.405 -83.41 -83.415 -83.42 -83.425 -83.43 -83.435 -83.44 -83.445 -83.45 -83.455 -83.46 -83.465 -83.47 -83.475 -83.48 -83.485 -83.49 -83.495 -83.5 -83.505 -83.51 -83.515 -83.52 -83.525 -83.53 -83.535 -83.54 -83.545 -83.55 -83.555 -83.56 -83.565 -83.57 -83.575 -83.58 -83.585 -83.59 -83.595 -83.6 -83.605 -83.61 -83.615 -83.62 -83.625 -83.63 -83.635 -83.64 -83.645 -83.65 -83.655 -83.66 -83.665 -83.67 -83.675 -83.68 -83.685 -83.69 -83.695 -83.7 -83.705 -83.71 -83.715 -83.72 -83.725 -83.73 -83.735 -83.74 -83.745 -83.75 -83.755 -83.76 -83.765 -83.77 -83.775 -83.78 -83.785 -83.79 -83.795 -83.8 -83.805 -83.81 -83.815 -83.82 -83.825 -83.83 -83.835 -83.84 -83.845 -83.85 -83.855 -83.86 -83.865 -83.87 -83.875 -83.88 -83.885 -83.89 -83.895 -83.9 -83.905 -83.91 -83.915 -83.92 -83.925 -83.93 -83.935 -83.94 -83.945 -83.95 -83.955 -83.96 -83.965 -83.97 -83.975 -83.98 -83.985 -83.99 -83.995 -84 -84.005 -84.01 -84.015 -84.02 -84.025 -84.03 -84.035 -84.04 -84.045 -84.05 -84.055 -84.06 -84.065 -84.07 -84.075 -84.08 -84.085 -84.09 -84.095 -84.1 -84.105 -84.11 -84.115 -84.12 -84.125 -84.13 -84.135 -84.14 -84.145 -84.15 -84.155 -84.16 -84.165 -84.17 -84.175 -84.18 -84.185 -84.19 -84.195 -84.2 -84.205 -84.21 -84.215 -84.22 -84.225 -84.23 -84.235 -84.24 -84.245 -84.25 -84.255 -84.26 -84.265 -84.27 -84.275 -84.28 -84.285 -84.29 -84.295 -84.3 -84.305 -84.31 -84.315 -84.32 -84.325 -84.33 -84.335 -84.34 -84.345 -84.35 -84.355 -84.36 -84.365 -84.37 -84.375 -84.38 -84.385 -84.39 -84.395 -84.4 -84.405 -84.41 -84.415 -84.42 -84.425 -84.43 -84.435 -84.44 -84.445 -84.45 -84.455 -84.46 -84.465 -84.47 -84.475 -84.48 -84.485 -84.49 -84.495 -84.5 -84.505 -84.51 -84.515 -84.52 -84.525 -84.53 -84.535 -84.54 -84.545 -84.55 -84.555 -84.56 -84.565 -84.57 -84.575 -84.58 -84.585 -84.59 -84.595 -84.6 -84.605 -84.61 -84.615 -84.62 -84.625 -84.63 -84.635 -84.64 -84.645 -84.65 -84.655 -84.66 -84.665 -84.67 -84.675 -84.68 -84.685 -84.69 -84.695 -84.7 -84.705 -84.71 -84.715 -84.72 -84.725 -84.73 -84.735 -84.74 -84.745 -84.75 -84.755 -84.76 -84.765 -84.77 -84.775 -84.78 -84.785 -84.79 -84.795 -84.8 -84.805 -84.81 -84.815 -84.82 -84.825 -84.83 -84.835 -84.84 -84.845 -84.85 -84.855 -84.86 -84.865 -84.87 -84.875 -84.88 -84.885 -84.89 -84.895 -84.9 -84.905 -84.91 -84.915 -84.92 -84.925 -84.93 -84.935 -84.94 -84.945 -84.95 -84.955 -84.96 -84.965 -84.97 -84.975 -84.98 -84.985 -84.99 -84.995 -85 -85.005 -85.01 -85.015 -85.02 -85.025 -85.03 -85.035 -85.04 -85.045 -85.05 -85.055 -85.06 -85.065 -85.07 -85.075 -85.08 -85.085 -85.09 -85.095 -85.1 -85.105 -85.11 -85.115 -85.12 -85.125 -85.13 -85.135 -85.14 -85.145 -85.15 -85.155 -85.16 -85.165 -85.17 -85.175 -85.18 -85.185 -85.19 -85.195 -85.2 -85.205 -85.21 -85.215 -85.22 -85.225 -85.23 -85.235 -85.24 -85.245 -85.25 -85.255 -85.26 -85.265 -85.27 -85.275 -85.28 -85.285 -85.29 -85.295 -85.3 -85.305 -85.31 -85.315 -85.32 -85.325 -85.33 -85.335 -85.34 -85.345 -85.35 -85.355 -85.36 -85.365 -85.37 -85.375 -85.38 -85.385 -85.39 -85.395 -85.4 -85.405 -85.41 -85.415 -85.42 -85.425 -85.43 -85.435 -85.44 -85.445 -85.45 -85.455 -85.46 -85.465 -85.47 -85.475 -85.48 -85.485 -85.49 -85.495 -85.5 -85.505 -85.51 -85.515 -85.52 -85.525 -85.53 -85.535 -85.54 -85.545 -85.55 -85.555 -85.56 -85.565 -85.57 -85.575 -85.58 -85.585 -85.59 -85.595 -85.6 -85.605 -85.61 -85.615 -85.62 -85.625 -85.63 -85.635 -85.64 -85.645 -85.65 -85.655 -85.66 -85.665 -85.67 -85.675 -85.68 -85.685 -85.69 -85.695 -85.7 -85.705 -85.71 -85.715 -85.72 -85.725 -85.73 -85.735 -85.74 -85.745 -85.75 -85.755 -85.76 -85.765 -85.77 -85.775 -85.78 -85.785 -85.79 -85.795 -85.8 -85.805 -85.81 -85.815 -85.82 -85.825 -85.83 -85.835 -85.84 -85.845 -85.85 -85.855 -85.86 -85.865 -85.87 -85.875 -85.88 -85.885 -85.89 -85.895 -85.9 -85.905 -85.91 -85.915 -85.92 -85.925 -85.93 -85.935 -85.94 -85.945 -85.95 -85.955 -85.96 -85.965 -85.97 -85.975 -85.98 -85.985 -85.99 -85.995 -86 -86.005 -86.01 -86.015 -86.02 -86.025 -86.03 -86.035 -86.04 -86.045 -86.05 -86.055 -86.06 -86.065 -86.07 -86.075 -86.08 -86.085 -86.09 -86.095 -86.1 -86.105 -86.11 -86.115 -86.12 -86.125 -86.13 -86.135 -86.14 -86.145 -86.15 -86.155 -86.16 -86.165 -86.17 -86.175 -86.18 -86.185 -86.19 -86.195 -86.2 -86.205 -86.21 -86.215 -86.22 -86.225 -86.23 -86.235 -86.24 -86.245 -86.25 -86.255 -86.26 -86.265 -86.27 -86.275 -86.28 -86.285 -86.29 -86.295 -86.3 -86.305 -86.31 -86.315 -86.32 -86.325 -86.33 -86.335 -86.34 -86.345 -86.35 -86.355 -86.36 -86.365 -86.37 -86.375 -86.38 -86.385 -86.39 -86.395 -86.4 -86.405 -86.41 -86.415 -86.42 -86.425 -86.43 -86.435 -86.44 -86.445 -86.45 -86.455 -86.46 -86.465 -86.47 -86.475 -86.48 -86.485 -86.49 -86.495 -86.5 -86.505 -86.51 -86.515 -86.52 -86.525 -86.53 -86.535 -86.54 -86.545 -86.55 -86.555 -86.56 -86.565 -86.57 -86.575 -86.58 -86.585 -86.59 -86.595 -86.6 -86.605 -86.61 -86.615 -86.62 -86.625 -86.63 -86.635 -86.64 -86.645 -86.65 -86.655 -86.66 -86.665 -86.67 -86.675 -86.68 -86.685 -86.69 -86.695 -86.7 -86.705 -86.71 -86.715 -86.72 -86.725 -86.73 -86.735 -86.74 -86.745 -86.75 -86.755 -86.76 -86.765 -86.77 -86.775 -86.78 -86.785 -86.79 -86.795 -86.8 -86.805 -86.81 -86.815 -86.82 -86.825 -86.83 -86.835 -86.84 -86.845 -86.85 -86.855 -86.86 -86.865 -86.87 -86.875 -86.88 -86.885 -86.89 -86.895 -86.9 -86.905 -86.91 -86.915 -86.92 -86.925 -86.93 -86.935 -86.94 -86.945 -86.95 -86.955 -86.96 -86.965 -86.97 -86.975 -86.98 -86.985 -86.99 -86.995 -87 -87.005 -87.01 -87.015 -87.02 -87.025 -87.03 -87.035 -87.04 -87.045 -87.05 -87.055 -87.06 -87.065 -87.07 -87.075 -87.08 -87.085 -87.09 -87.095 -87.1 -87.105 -87.11 -87.115 -87.12 -87.125 -87.13 -87.135 -87.14 -87.145 -87.15 -87.155 -87.16 -87.165 -87.17 -87.175 -87.18 -87.185 -87.19 -87.195 -87.2 -87.205 -87.21 -87.215 -87.22 -87.225 -87.23 -87.235 -87.24 -87.245 -87.25 -87.255 -87.26 -87.265 -87.27 -87.275 -87.28 -87.285 -87.29 -87.295 -87.3 -87.305 -87.31 -87.315 -87.32 -87.325 -87.33 -87.335 -87.34 -87.345 -87.35 -87.355 -87.36 -87.365 -87.37 -87.375 -87.38 -87.385 -87.39 -87.395 -87.4 -87.405 -87.41 -87.415 -87.42 -87.425 -87.43 -87.435 -87.44 -87.445 -87.45 -87.455 -87.46 -87.465 -87.47 -87.475 -87.48 -87.485 -87.49 -87.495 -87.5 -87.505 -87.51 -87.515 -87.52 -87.525 -87.53 -87.535 -87.54 -87.545 -87.55 -87.555 -87.56 -87.565 -87.57 -87.575 -87.58 -87.585 -87.59 -87.595 -87.6 -87.605 -87.61 -87.615 -87.62 -87.625 -87.63 -87.635 -87.64 -87.645 -87.65 -87.655 -87.66 -87.665 -87.67 -87.675 -87.68 -87.685 -87.69 -87.695 -87.7 -87.705 -87.71 -87.715 -87.72 -87.725 -87.73 -87.735 -87.74 -87.745 -87.75 -87.755 -87.76 -87.765 -87.77 -87.775 -87.78 -87.785 -87.79 -87.795 -87.8 -87.805 -87.81 -87.815 -87.82 -87.825 -87.83 -87.835 -87.84 -87.845 -87.85 -87.855 -87.86 -87.865 -87.87 -87.875 -87.88 -87.885 -87.89 -87.895 -87.9 -87.905 -87.91 -87.915 -87.92 -87.925 -87.93 -87.935 -87.94 -87.945 -87.95 -87.955 -87.96 -87.965 -87.97 -87.975 -87.98 -87.985 -87.99 -87.995 -88 -88.005 -88.01 -88.015 -88.02 -88.025 -88.03 -88.035 -88.04 -88.045 -88.05 -88.055 -88.06 -88.065 -88.07 -88.075 -88.08 -88.085 -88.09 -88.095 -88.1 -88.105 -88.11 -88.115 -88.12 -88.125 -88.13 -88.135 -88.14 -88.145 -88.15 -88.155 -88.16 -88.165 -88.17 -88.175 -88.18 -88.185 -88.19 -88.195 -88.2 -88.205 -88.21 -88.215 -88.22 -88.225 -88.23 -88.235 -88.24 -88.245 -88.25 -88.255 -88.26 -88.265 -88.27 -88.275 -88.28 -88.285 -88.29 -88.295 -88.3 -88.305 -88.31 -88.315 -88.32 -88.325 -88.33 -88.335 -88.34 -88.345 -88.35 -88.355 -88.36 -88.365 -88.37 -88.375 -88.38 -88.385 -88.39 -88.395 -88.4 -88.405 -88.41 -88.415 -88.42 -88.425 -88.43 -88.435 -88.44 -88.445 -88.45 -88.455 -88.46 -88.465 -88.47 -88.475 -88.48 -88.485 -88.49 -88.495 -88.5 -88.505 -88.51 -88.515 -88.52 -88.525 -88.53 -88.535 -88.54 -88.545 -88.55 -88.555 -88.56 -88.565 -88.57 -88.575 -88.58 -88.585 -88.59 -88.595 -88.6 -88.605 -88.61 -88.615 -88.62 -88.625 -88.63 -88.635 -88.64 -88.645 -88.65 -88.655 -88.66 -88.665 -88.67 -88.675 -88.68 -88.685 -88.69 -88.695 -88.7 -88.705 -88.71 -88.715 -88.72 -88.725 -88.73 -88.735 -88.74 -88.745 -88.75 -88.755 -88.76 -88.765 -88.77 -88.775 -88.78 -88.785 -88.79 -88.795 -88.8 -88.805 -88.81 -88.815 -88.82 -88.825 -88.83 -88.835 -88.84 -88.845 -88.85 -88.855 -88.86 -88.865 -88.87 -88.875 -88.88 -88.885 -88.89 -88.895 -88.9 -88.905 -88.91 -88.915 -88.92 -88.925 -88.93 -88.935 -88.94 -88.945 -88.95 -88.955 -88.96 -88.965 -88.97 -88.975 -88.98 -88.985 -88.99 -88.995 -89 -89.005 -89.01 -89.015 -89.02 -89.025 -89.03 -89.035 -89.04 -89.045 -89.05 -89.055 -89.06 -89.065 -89.07 -89.075 -89.08 -89.085 -89.09 -89.095 -89.1 -89.105 -89.11 -89.115 -89.12 -89.125 -89.13 -89.135 -89.14 -89.145 -89.15 -89.155 -89.16 -89.165 -89.17 -89.175 -89.18 -89.185 -89.19 -89.195 -89.2 -89.205 -89.21 -89.215 -89.22 -89.225 -89.23 -89.235 -89.24 -89.245 -89.25 -89.255 -89.26 -89.265 -89.27 -89.275 -89.28 -89.285 -89.29 -89.295 -89.3 -89.305 -89.31 -89.315 -89.32 -89.325 -89.33 -89.335 -89.34 -89.345 -89.35 -89.355 -89.36 -89.365 -89.37 -89.375 -89.38 -89.385 -89.39 -89.395 -89.4 -89.405 -89.41 -89.415 -89.42 -89.425 -89.43 -89.435 -89.44 -89.445 -89.45 -89.455 -89.46 -89.465 -89.47 -89.475 -89.48 -89.485 -89.49 -89.495 -89.5 -89.505 -89.51 -89.515 -89.52 -89.525 -89.53 -89.535 -89.54 -89.545 -89.55 -89.555 -89.56 -89.565 -89.57 -89.575 -89.58 -89.585 -89.59 -89.595 -89.6 -89.605 -89.61 -89.615 -89.62 -89.625 -89.63 -89.635 -89.64 -89.645 -89.65 -89.655 -89.66 -89.665 -89.67 -89.675 -89.68 -89.685 -89.69 -89.695 -89.7 -89.705 -89.71 -89.715 -89.72 -89.725 -89.73 -89.735 -89.74 -89.745 -89.75 -89.755 -89.76 -89.765 -89.77 -89.775 -89.78 -89.785 -89.79 -89.795 -89.8 -89.805 -89.81 -89.815 -89.82 -89.825 -89.83 -89.835 -89.84 -89.845 -89.85 -89.855 -89.86 -89.865 -89.87 -89.875 -89.88 -89.885 -89.89 -89.895 -89.9 -89.905 -89.91 -89.915 -89.92 -89.925 -89.93 -89.935 -89.94 -89.945 -89.95 -89.955 -89.96 -89.965 -89.97 -89.975 -89.98 -89.985 -89.99 -89.995 -90 -90.005 -90.01 -90.015 -90.02 -90.025 -90.03 -90.035 -90.04 -90.045 -90.05 -90.055 -90.06 -90.065 -90.07 -90.075 -90.08 -90.085 -90.09 -90.095 -90.1 -90.105 -90.11 -90.115 -90.12 -90.125 -90.13 -90.135 -90.14 -90.145 -90.15 -90.155 -90.16 -90.165 -90.17 -90.175 -90.18 -90.185 -90.19 -90.195 -90.2 -90.205 -90.21 -90.215 -90.22 -90.225 -90.23 -90.235 -90.24 -90.245 -90.25 -90.255 -90.26 -90.265 -90.27 -90.275 -90.28 -90.285 -90.29 -90.295 -90.3 -90.305 -90.31 -90.315 -90.32 -90.325 -90.33 -90.335 -90.34 -90.345 -90.35 -90.355 -90.36 -90.365 -90.37 -90.375 -90.38 -90.385 -90.39 -90.395 -90.4 -90.405 -90.41 -90.415 -90.42 -90.425 -90.43 -90.435 -90.44 -90.445 -90.45 -90.455 -90.46 -90.465 -90.47 -90.475 -90.48 -90.485 -90.49 -90.495 -90.5 -90.505 -90.51 -90.515 -90.52 -90.525 -90.53 -90.535 -90.54 -90.545 -90.55 -90.555 -90.56 -90.565 -90.57 -90.575 -90.58 -90.585 -90.59 -90.595 -90.6 -90.605 -90.61 -90.615 -90.62 -90.625 -90.63 -90.635 -90.64 -90.645 -90.65 -90.655 -90.66 -90.665 -90.67 -90.675 -90.68 -90.685 -90.69 -90.695 -90.7 -90.705 -90.71 -90.715 -90.72 -90.725 -90.73 -90.735 -90.74 -90.745 -90.75 -90.755 -90.76 -90.765 -90.77 -90.775 -90.78 -90.785 -90.79 -90.795 -90.8 -90.805 -90.81 -90.815 -90.82 -90.825 -90.83 -90.835 -90.84 -90.845 -90.85 -90.855 -90.86 -90.865 -90.87 -90.875 -90.88 -90.885 -90.89 -90.895 -90.9 -90.905 -90.91 -90.915 -90.92 -90.925 -90.93 -90.935 -90.94 -90.945 -90.95 -90.955 -90.96 -90.965 -90.97 -90.975 -90.98 -90.985 -90.99 -90.995 -91 -91.005 -91.01 -91.015 -91.02 -91.025 -91.03 -91.035 -91.04 -91.045 -91.05 -91.055 -91.06 -91.065 -91.07 -91.075 -91.08 -91.085 -91.09 -91.095 -91.1 -91.105 -91.11 -91.115 -91.12 -91.125 -91.13 -91.135 -91.14 -91.145 -91.15 -91.155 -91.16 -91.165 -91.17 -91.175 -91.18 -91.185 -91.19 -91.195 -91.2 -91.205 -91.21 -91.215 -91.22 -91.225 -91.23 -91.235 -91.24 -91.245 -91.25 -91.255 -91.26 -91.265 -91.27 -91.275 -91.28 -91.285 -91.29 -91.295 -91.3 -91.305 -91.31 -91.315 -91.32 -91.325 -91.33 -91.335 -91.34 -91.345 -91.35 -91.355 -91.36 -91.365 -91.37 -91.375 -91.38 -91.385 -91.39 -91.395 -91.4 -91.405 -91.41 -91.415 -91.42 -91.425 -91.43 -91.435 -91.44 -91.445 -91.45 -91.455 -91.46 -91.465 -91.47 -91.475 -91.48 -91.485 -91.49 -91.495 -91.5 -91.505 -91.51 -91.515 -91.52 -91.525 -91.53 -91.535 -91.54 -91.545 -91.55 -91.555 -91.56 -91.565 -91.57 -91.575 -91.58 -91.585 -91.59 -91.595 -91.6 -91.605 -91.61 -91.615 -91.62 -91.625 -91.63 -91.635 -91.64 -91.645 -91.65 -91.655 -91.66 -91.665 -91.67 -91.675 -91.68 -91.685 -91.69 -91.695 -91.7 -91.705 -91.71 -91.715 -91.72 -91.725 -91.73 -91.735 -91.74 -91.745 -91.75 -91.755 -91.76 -91.765 -91.77 -91.775 -91.78 -91.785 -91.79 -91.795 -91.8 -91.805 -91.81 -91.815 -91.82 -91.825 -91.83 -91.835 -91.84 -91.845 -91.85 -91.855 -91.86 -91.865 -91.87 -91.875 -91.88 -91.885 -91.89 -91.895 -91.9 -91.905 -91.91 -91.915 -91.92 -91.925 -91.93 -91.935 -91.94 -91.945 -91.95 -91.955 -91.96 -91.965 -91.97 -91.975 -91.98 -91.985 -91.99 -91.995 -92 -92.005 -92.01 -92.015 -92.02 -92.025 -92.03 -92.035 -92.04 -92.045 -92.05 -92.055 -92.06 -92.065 -92.07 -92.075 -92.08 -92.085 -92.09 -92.095 -92.1 -92.105 -92.11 -92.115 -92.12 -92.125 -92.13 -92.135 -92.14 -92.145 -92.15 -92.155 -92.16 -92.165 -92.17 -92.175 -92.18 -92.185 -92.19 -92.195 -92.2 -92.205 -92.21 -92.215 -92.22 -92.225 -92.23 -92.235 -92.24 -92.245 -92.25 -92.255 -92.26 -92.265 -92.27 -92.275 -92.28 -92.285 -92.29 -92.295 -92.3 -92.305 -92.31 -92.315 -92.32 -92.325 -92.33 -92.335 -92.34 -92.345 -92.35 -92.355 -92.36 -92.365 -92.37 -92.375 -92.38 -92.385 -92.39 -92.395 -92.4 -92.405 -92.41 -92.415 -92.42 -92.425 -92.43 -92.435 -92.44 -92.445 -92.45 -92.455 -92.46 -92.465 -92.47 -92.475 -92.48 -92.485 -92.49 -92.495 -92.5 -92.505 -92.51 -92.515 -92.52 -92.525 -92.53 -92.535 -92.54 -92.545 -92.55 -92.555 -92.56 -92.565 -92.57 -92.575 -92.58 -92.585 -92.59 -92.595 -92.6 -92.605 -92.61 -92.615 -92.62 -92.625 -92.63 -92.635 -92.64 -92.645 -92.65 -92.655 -92.66 -92.665 -92.67 -92.675 -92.68 -92.685 -92.69 -92.695 -92.7 -92.705 -92.71 -92.715 -92.72 -92.725 -92.73 -92.735 -92.74 -92.745 -92.75 -92.755 -92.76 -92.765 -92.77 -92.775 -92.78 -92.785 -92.79 -92.795 -92.8 -92.805 -92.81 -92.815 -92.82 -92.825 -92.83 -92.835 -92.84 -92.845 -92.85 -92.855 -92.86 -92.865 -92.87 -92.875 -92.88 -92.885 -92.89 -92.895 -92.9 -92.905 -92.91 -92.915 -92.92 -92.925 -92.93 -92.935 -92.94 -92.945 -92.95 -92.955 -92.96 -92.965 -92.97 -92.975 -92.98 -92.985 -92.99 -92.995 -93 -93.005 -93.01 -93.015 -93.02 -93.025 -93.03 -93.035 -93.04 -93.045 -93.05 -93.055 -93.06 -93.065 -93.07 -93.075 -93.08 -93.085 -93.09 -93.095 -93.1 -93.105 -93.11 -93.115 -93.12 -93.125 -93.13 -93.135 -93.14 -93.145 -93.15 -93.155 -93.16 -93.165 -93.17 -93.175 -93.18 -93.185 -93.19 -93.195 -93.2 -93.205 -93.21 -93.215 -93.22 -93.225 -93.23 -93.235 -93.24 -93.245 -93.25 -93.255 -93.26 -93.265 -93.27 -93.275 -93.28 -93.285 -93.29 -93.295 -93.3 -93.305 -93.31 -93.315 -93.32 -93.325 -93.33 -93.335 -93.34 -93.345 -93.35 -93.355 -93.36 -93.365 -93.37 -93.375 -93.38 -93.385 -93.39 -93.395 -93.4 -93.405 -93.41 -93.415 -93.42 -93.425 -93.43 -93.435 -93.44 -93.445 -93.45 -93.455 -93.46 -93.465 -93.47 -93.475 -93.48 -93.485 -93.49 -93.495 -93.5 -93.505 -93.51 -93.515 -93.52 -93.525 -93.53 -93.535 -93.54 -93.545 -93.55 -93.555 -93.56 -93.565 -93.57 -93.575 -93.58 -93.585 -93.59 -93.595 -93.6 -93.605 -93.61 -93.615 -93.62 -93.625 -93.63 -93.635 -93.64 -93.645 -93.65 -93.655 -93.66 -93.665 -93.67 -93.675 -93.68 -93.685 -93.69 -93.695 -93.7 -93.705 -93.71 -93.715 -93.72 -93.725 -93.73 -93.735 -93.74 -93.745 -93.75 -93.755 -93.76 -93.765 -93.77 -93.775 -93.78 -93.785 -93.79 -93.795 -93.8 -93.805 -93.81 -93.815 -93.82 -93.825 -93.83 -93.835 -93.84 -93.845 -93.85 -93.855 -93.86 -93.865 -93.87 -93.875 -93.88 -93.885 -93.89 -93.895 -93.9 -93.905 -93.91 -93.915 -93.92 -93.925 -93.93 -93.935 -93.94 -93.945 -93.95 -93.955 -93.96 -93.965 -93.97 -93.975 -93.98 -93.985 -93.99 -93.995 -94 -94.005 -94.01 -94.015 -94.02 -94.025 -94.03 -94.035 -94.04 -94.045 -94.05 -94.055 -94.06 -94.065 -94.07 -94.075 -94.08 -94.085 -94.09 -94.095 -94.1 -94.105 -94.11 -94.115 -94.12 -94.125 -94.13 -94.135 -94.14 -94.145 -94.15 -94.155 -94.16 -94.165 -94.17 -94.175 -94.18 -94.185 -94.19 -94.195 -94.2 -94.205 -94.21 -94.215 -94.22 -94.225 -94.23 -94.235 -94.24 -94.245 -94.25 -94.255 -94.26 -94.265 -94.27 -94.275 -94.28 -94.285 -94.29 -94.295 -94.3 -94.305 -94.31 -94.315 -94.32 -94.325 -94.33 -94.335 -94.34 -94.345 -94.35 -94.355 -94.36 -94.365 -94.37 -94.375 -94.38 -94.385 -94.39 -94.395 -94.4 -94.405 -94.41 -94.415 -94.42 -94.425 -94.43 -94.435 -94.44 -94.445 -94.45 -94.455 -94.46 -94.465 -94.47 -94.475 -94.48 -94.485 -94.49 -94.495 -94.5 -94.505 -94.51 -94.515 -94.52 -94.525 -94.53 -94.535 -94.54 -94.545 -94.55 -94.555 -94.56 -94.565 -94.57 -94.575 -94.58 -94.585 -94.59 -94.595 -94.6 -94.605 -94.61 -94.615 -94.62 -94.625 -94.63 -94.635 -94.64 -94.645 -94.65 -94.655 -94.66 -94.665 -94.67 -94.675 -94.68 -94.685 -94.69 -94.695 -94.7 -94.705 -94.71 -94.715 -94.72 -94.725 -94.73 -94.735 -94.74 -94.745 -94.75 -94.755 -94.76 -94.765 -94.77 -94.775 -94.78 -94.785 -94.79 -94.795 -94.8 -94.805 -94.81 -94.815 -94.82 -94.825 -94.83 -94.835 -94.84 -94.845 -94.85 -94.855 -94.86 -94.865 -94.87 -94.875 -94.88 -94.885 -94.89 -94.895 -94.9 -94.905 -94.91 -94.915 -94.92 -94.925 -94.93 -94.935 -94.94 -94.945 -94.95 -94.955 -94.96 -94.965 -94.97 -94.975 -94.98 -94.985 -94.99 -94.995 -95 -95.005 -95.01 -95.015 -95.02 -95.025 -95.03 -95.035 -95.04 -95.045 -95.05 -95.055 -95.06 -95.065 -95.07 -95.075 -95.08 -95.085 -95.09 -95.095 -95.1 -95.105 -95.11 -95.115 -95.12 -95.125 -95.13 -95.135 -95.14 -95.145 -95.15 -95.155 -95.16 -95.165 -95.17 -95.175 -95.18 -95.185 -95.19 -95.195 -95.2 -95.205 -95.21 -95.215 -95.22 -95.225 -95.23 -95.235 -95.24 -95.245 -95.25 -95.255 -95.26 -95.265 -95.27 -95.275 -95.28 -95.285 -95.29 -95.295 -95.3 -95.305 -95.31 -95.315 -95.32 -95.325 -95.33 -95.335 -95.34 -95.345 -95.35 -95.355 -95.36 -95.365 -95.37 -95.375 -95.38 -95.385 -95.39 -95.395 -95.4 -95.405 -95.41 -95.415 -95.42 -95.425 -95.43 -95.435 -95.44 -95.445 -95.45 -95.455 -95.46 -95.465 -95.47 -95.475 -95.48 -95.485 -95.49 -95.495 -95.5 -95.505 -95.51 -95.515 -95.52 -95.525 -95.53 -95.535 -95.54 -95.545 -95.55 -95.555 -95.56 -95.565 -95.57 -95.575 -95.58 -95.585 -95.59 -95.595 -95.6 -95.605 -95.61 -95.615 -95.62 -95.625 -95.63 -95.635 -95.64 -95.645 -95.65 -95.655 -95.66 -95.665 -95.67 -95.675 -95.68 -95.685 -95.69 -95.695 -95.7 -95.705 -95.71 -95.715 -95.72 -95.725 -95.73 -95.735 -95.74 -95.745 -95.75 -95.755 -95.76 -95.765 -95.77 -95.775 -95.78 -95.785 -95.79 -95.795 -95.8 -95.805 -95.81 -95.815 -95.82 -95.825 -95.83 -95.835 -95.84 -95.845 -95.85 -95.855 -95.86 -95.865 -95.87 -95.875 -95.88 -95.885 -95.89 -95.895 -95.9 -95.905 -95.91 -95.915 -95.92 -95.925 -95.93 -95.935 -95.94 -95.945 -95.95 -95.955 -95.96 -95.965 -95.97 -95.975 -95.98 -95.985 -95.99 -95.995 -96 -96.005 -96.01 -96.015 -96.02 -96.025 -96.03 -96.035 -96.04 -96.045 -96.05 -96.055 -96.06 -96.065 -96.07 -96.075 -96.08 -96.085 -96.09 -96.095 -96.1 -96.105 -96.11 -96.115 -96.12 -96.125 -96.13 -96.135 -96.14 -96.145 -96.15 -96.155 -96.16 -96.165 -96.17 -96.175 -96.18 -96.185 -96.19 -96.195 -96.2 -96.205 -96.21 -96.215 -96.22 -96.225 -96.23 -96.235 -96.24 -96.245 -96.25 -96.255 -96.26 -96.265 -96.27 -96.275 -96.28 -96.285 -96.29 -96.295 -96.3 -96.305 -96.31 -96.315 -96.32 -96.325 -96.33 -96.335 -96.34 -96.345 -96.35 -96.355 -96.36 -96.365 -96.37 -96.375 -96.38 -96.385 -96.39 -96.395 -96.4 -96.405 -96.41 -96.415 -96.42 -96.425 -96.43 -96.435 -96.44 -96.445 -96.45 -96.455 -96.46 -96.465 -96.47 -96.475 -96.48 -96.485 -96.49 -96.495 -96.5 -96.505 -96.51 -96.515 -96.52 -96.525 -96.53 -96.535 -96.54 -96.545 -96.55 -96.555 -96.56 -96.565 -96.57 -96.575 -96.58 -96.585 -96.59 -96.595 -96.6 -96.605 -96.61 -96.615 -96.62 -96.625 -96.63 -96.635 -96.64 -96.645 -96.65 -96.655 -96.66 -96.665 -96.67 -96.675 -96.68 -96.685 -96.69 -96.695 -96.7 -96.705 -96.71 -96.715 -96.72 -96.725 -96.73 -96.735 -96.74 -96.745 -96.75 -96.755 -96.76 -96.765 -96.77 -96.775 -96.78 -96.785 -96.79 -96.795 -96.8 -96.805 -96.81 -96.815 -96.82 -96.825 -96.83 -96.835 -96.84 -96.845 -96.85 -96.855 -96.86 -96.865 -96.87 -96.875 -96.88 -96.885 -96.89 -96.895 -96.9 -96.905 -96.91 -96.915 -96.92 -96.925 -96.93 -96.935 -96.94 -96.945 -96.95 -96.955 -96.96 -96.965 -96.97 -96.975 -96.98 -96.985 -96.99 -96.995 -97 -97.005 -97.01 -97.015 -97.02 -97.025 -97.03 -97.035 -97.04 -97.045 -97.05 -97.055 -97.06 -97.065 -97.07 -97.075 -97.08 -97.085 -97.09 -97.095 -97.1 -97.105 -97.11 -97.115 -97.12 -97.125 -97.13 -97.135 -97.14 -97.145 -97.15 -97.155 -97.16 -97.165 -97.17 -97.175 -97.18 -97.185 -97.19 -97.195 -97.2 -97.205 -97.21 -97.215 -97.22 -97.225 -97.23 -97.235 -97.24 -97.245 -97.25 -97.255 -97.26 -97.265 -97.27 -97.275 -97.28 -97.285 -97.29 -97.295 -97.3 -97.305 -97.31 -97.315 -97.32 -97.325 -97.33 -97.335 -97.34 -97.345 -97.35 -97.355 -97.36 -97.365 -97.37 -97.375 -97.38 -97.385 -97.39 -97.395 -97.4 -97.405 -97.41 -97.415 -97.42 -97.425 -97.43 -97.435 -97.44 -97.445 -97.45 -97.455 -97.46 -97.465 -97.47 -97.475 -97.48 -97.485 -97.49 -97.495 -97.5 -97.505 -97.51 -97.515 -97.52 -97.525 -97.53 -97.535 -97.54 -97.545 -97.55 -97.555 -97.56 -97.565 -97.57 -97.575 -97.58 -97.585 -97.59 -97.595 -97.6 -97.605 -97.61 -97.615 -97.62 -97.625 -97.63 -97.635 -97.64 -97.645 -97.65 -97.655 -97.66 -97.665 -97.67 -97.675 -97.68 -97.685 -97.69 -97.695 -97.7 -97.705 -97.71 -97.715 -97.72 -97.725 -97.73 -97.735 -97.74 -97.745 -97.75 -97.755 -97.76 -97.765 -97.77 -97.775 -97.78 -97.785 -97.79 -97.795 -97.8 -97.805 -97.81 -97.815 -97.82 -97.825 -97.83 -97.835 -97.84 -97.845 -97.85 -97.855 -97.86 -97.865 -97.87 -97.875 -97.88 -97.885 -97.89 -97.895 -97.9 -97.905 -97.91 -97.915 -97.92 -97.925 -97.93 -97.935 -97.94 -97.945 -97.95 -97.955 -97.96 -97.965 -97.97 -97.975 -97.98 -97.985 -97.99 -97.995 -98 -98.005 -98.01 -98.015 -98.02 -98.025 -98.03 -98.035 -98.04 -98.045 -98.05 -98.055 -98.06 -98.065 -98.07 -98.075 -98.08 -98.085 -98.09 -98.095 -98.1 -98.105 -98.11 -98.115 -98.12 -98.125 -98.13 -98.135 -98.14 -98.145 -98.15 -98.155 -98.16 -98.165 -98.17 -98.175 -98.18 -98.185 -98.19 -98.195 -98.2 -98.205 -98.21 -98.215 -98.22 -98.225 -98.23 -98.235 -98.24 -98.245 -98.25 -98.255 -98.26 -98.265 -98.27 -98.275 -98.28 -98.285 -98.29 -98.295 -98.3 -98.305 -98.31 -98.315 -98.32 -98.325 -98.33 -98.335 -98.34 -98.345 -98.35 -98.355 -98.36 -98.365 -98.37 -98.375 -98.38 -98.385 -98.39 -98.395 -98.4 -98.405 -98.41 -98.415 -98.42 -98.425 -98.43 -98.435 -98.44 -98.445 -98.45 -98.455 -98.46 -98.465 -98.47 -98.475 -98.48 -98.485 -98.49 -98.495 -98.5 -98.505 -98.51 -98.515 -98.52 -98.525 -98.53 -98.535 -98.54 -98.545 -98.55 -98.555 -98.56 -98.565 -98.57 -98.575 -98.58 -98.585 -98.59 -98.595 -98.6 -98.605 -98.61 -98.615 -98.62 -98.625 -98.63 -98.635 -98.64 -98.645 -98.65 -98.655 -98.66 -98.665 -98.67 -98.675 -98.68 -98.685 -98.69 -98.695 -98.7 -98.705 -98.71 -98.715 -98.72 -98.725 -98.73 -98.735 -98.74 -98.745 -98.75 -98.755 -98.76 -98.765 -98.77 -98.775 -98.78 -98.785 -98.79 -98.795 -98.8 -98.805 -98.81 -98.815 -98.82 -98.825 -98.83 -98.835 -98.84 -98.845 -98.85 -98.855 -98.86 -98.865 -98.87 -98.875 -98.88 -98.885 -98.89 -98.895 -98.9 -98.905 -98.91 -98.915 -98.92 -98.925 -98.93 -98.935 -98.94 -98.945 -98.95 -98.955 -98.96 -98.965 -98.97 -98.975 -98.98 -98.985 -98.99 -98.995 -99 -99.005 -99.01 -99.015 -99.02 -99.025 -99.03 -99.035 -99.04 -99.045 -99.05 -99.055 -99.06 -99.065 -99.07 -99.075 -99.08 -99.085 -99.09 -99.095 -99.1 -99.105 -99.11 -99.115 -99.12 -99.125 -99.13 -99.135 -99.14 -99.145 -99.15 -99.155 -99.16 -99.165 -99.17 -99.175 -99.18 -99.185 -99.19 -99.195 -99.2 -99.205 -99.21 -99.215 -99.22 -99.225 -99.23 -99.235 -99.24 -99.245 -99.25 -99.255 -99.26 -99.265 -99.27 -99.275 -99.28 -99.285 -99.29 -99.295 -99.3 -99.305 -99.31 -99.315 -99.32 -99.325 -99.33 -99.335 -99.34 -99.345 -99.35 -99.355 -99.36 -99.365 -99.37 -99.375 -99.38 -99.385 -99.39 -99.395 -99.4 -99.405 -99.41 -99.415 -99.42 -99.425 -99.43 -99.435 -99.44 -99.445 -99.45 -99.455 -99.46 -99.465 -99.47 -99.475 -99.48 -99.485 -99.49 -99.495 -99.5 -99.505 -99.51 -99.515 -99.52 -99.525 -99.53 -99.535 -99.54 -99.545 -99.55 -99.555 -99.56 -99.565 -99.57 -99.575 -99.58 -99.585 -99.59 -99.595 -99.6 -99.605 -99.61 -99.615 -99.62 -99.625 -99.63 -99.635 -99.64 -99.645 -99.65 -99.655 -99.66 -99.665 -99.67 -99.675 -99.68 -99.685 -99.69 -99.695 -99.7 -99.705 -99.71 -99.715 -99.72 -99.725 -99.73 -99.735 -99.74 -99.745 -99.75 -99.755 -99.76 -99.765 -99.77 -99.775 -99.78 -99.785 -99.79 -99.795 -99.8 -99.805 -99.81 -99.815 -99.82 -99.825 -99.83 -99.835 -99.84 -99.845 -99.85 -99.855 -99.86 -99.865 -99.87 -99.875 -99.88 -99.885 -99.89 -99.895 -99.9 -99.905 -99.91 -99.915 -99.92 -99.925 -99.93 -99.935 -99.94 -99.945 -99.95 -99.955 -99.96 -99.965 -99.97 -99.975 -99.98 -99.985 -99.99 -99.995 -100 -100.005 -100.01 -100.015 -100.02 -100.025 -100.03 -100.035 -100.04 -100.045 -100.05 -100.055 -100.06 -100.065 -100.07 -100.075 -100.08 -100.085 -100.09 -100.095 -100.1 -100.105 -100.11 -100.115 -100.12 -100.125 -100.13 -100.135 -100.14 -100.145 -100.15 -100.155 -100.16 -100.165 -100.17 -100.175 -100.18 -100.185 -100.19 -100.195 -100.2 -100.205 -100.21 -100.215 -100.22 -100.225 -100.23 -100.235 -100.24 -100.245 -100.25 -100.255 -100.26 -100.265 -100.27 -100.275 -100.28 -100.285 -100.29 -100.295 -100.3 -100.305 -100.31 -100.315 -100.32 -100.325 -100.33 -100.335 -100.34 -100.345 -100.35 -100.355 -100.36 -100.365 -100.37 -100.375 -100.38 -100.385 -100.39 -100.395 -100.4 -100.405 -100.41 -100.415 -100.42 -100.425 -100.43 -100.435 -100.44 -100.445 -100.45 -100.455 -100.46 -100.465 -100.47 -100.475 -100.48 -100.485 -100.49 -100.495 -100.5 -100.505 -100.51 -100.515 -100.52 -100.525 -100.53 -100.535 -100.54 -100.545 -100.55 -100.555 -100.56 -100.565 -100.57 -100.575 -100.58 -100.585 -100.59 -100.595 -100.6 -100.605 -100.61 -100.615 -100.62 -100.625 -100.63 -100.635 -100.64 -100.645 -100.65 -100.655 -100.66 -100.665 -100.67 -100.675 -100.68 -100.685 -100.69 -100.695 -100.7 -100.705 -100.71 -100.715 -100.72 -100.725 -100.73 -100.735 -100.74 -100.745 -100.75 -100.755 -100.76 -100.765 -100.77 -100.775 -100.78 -100.785 -100.79 -100.795 -100.8 -100.805 -100.81 -100.815 -100.82 -100.825 -100.83 -100.835 -100.84 -100.845 -100.85 -100.855 -100.86 -100.865 -100.87 -100.875 -100.88 -100.885 -100.89 -100.895 -100.9 -100.905 -100.91 -100.915 -100.92 -100.925 -100.93 -100.935 -100.94 -100.945 -100.95 -100.955 -100.96 -100.965 -100.97 -100.975 -100.98 -100.985 -100.99 -100.995 -101 -101.005 -101.01 -101.015 -101.02 -101.025 -101.03 -101.035 -101.04 -101.045 -101.05 -101.055 -101.06 -101.065 -101.07 -101.075 -101.08 -101.085 -101.09 -101.095 -101.1 -101.105 -101.11 -101.115 -101.12 -101.125 -101.13 -101.135 -101.14 -101.145 -101.15 -101.155 -101.16 -101.165 -101.17 -101.175 -101.18 -101.185 -101.19 -101.195 -101.2 -101.205 -101.21 -101.215 -101.22 -101.225 -101.23 -101.235 -101.24 -101.245 -101.25 -101.255 -101.26 -101.265 -101.27 -101.275 -101.28 -101.285 -101.29 -101.295 -101.3 -101.305 -101.31 -101.315 -101.32 -101.325 -101.33 -101.335 -101.34 -101.345 -101.35 -101.355 -101.36 -101.365 -101.37 -101.375 -101.38 -101.385 -101.39 -101.395 -101.4 -101.405 -101.41 -101.415 -101.42 -101.425 -101.43 -101.435 -101.44 -101.445 -101.45 -101.455 -101.46 -101.465 -101.47 -101.475 -101.48 -101.485 -101.49 -101.495 -101.5 -101.505 -101.51 -101.515 -101.52 -101.525 -101.53 -101.535 -101.54 -101.545 -101.55 -101.555 -101.56 -101.565 -101.57 -101.575 -101.58 -101.585 -101.59 -101.595 -101.6 -101.605 -101.61 -101.615 -101.62 -101.625 -101.63 -101.635 -101.64 -101.645 -101.65 -101.655 -101.66 -101.665 -101.67 -101.675 -101.68 -101.685 -101.69 -101.695 -101.7 -101.705 -101.71 -101.715 -101.72 -101.725 -101.73 -101.735 -101.74 -101.745 -101.75 -101.755 -101.76 -101.765 -101.77 -101.775 -101.78 -101.785 -101.79 -101.795 -101.8 -101.805 -101.81 -101.815 -101.82 -101.825 -101.83 -101.835 -101.84 -101.845 -101.85 -101.855 -101.86 -101.865 -101.87 -101.875 -101.88 -101.885 -101.89 -101.895 -101.9 -101.905 -101.91 -101.915 -101.92 -101.925 -101.93 -101.935 -101.94 -101.945 -101.95 -101.955 -101.96 -101.965 -101.97 -101.975 -101.98 -101.985 -101.99 -101.995 -102 -102.005 -102.01 -102.015 -102.02 -102.025 -102.03 -102.035 -102.04 -102.045 -102.05 -102.055 -102.06 -102.065 -102.07 -102.075 -102.08 -102.085 -102.09 -102.095 -102.1 -102.105 -102.11 -102.115 -102.12 -102.125 -102.13 -102.135 -102.14 -102.145 -102.15 -102.155 -102.16 -102.165 -102.17 -102.175 -102.18 -102.185 -102.19 -102.195 -102.2 -102.205 -102.21 -102.215 -102.22 -102.225 -102.23 -102.235 -102.24 -102.245 -102.25 -102.255 -102.26 -102.265 -102.27 -102.275 -102.28 -102.285 -102.29 -102.295 -102.3 -102.305 -102.31 -102.315 -102.32 -102.325 -102.33 -102.335 -102.34 -102.345 -102.35 -102.355 -102.36 -102.365 -102.37 -102.375 -102.38 -102.385 -102.39 -102.395 -102.4 -102.405 -102.41 -102.415 -102.42 -102.425 -102.43 -102.435 -102.44 -102.445 -102.45 -102.455 -102.46 -102.465 -102.47 -102.475 -102.48 -102.485 -102.49 -102.495 -102.5 -102.505 -102.51 -102.515 -102.52 -102.525 -102.53 -102.535 -102.54 -102.545 -102.55 -102.555 -102.56 -102.565 -102.57 -102.575 -102.58 -102.585 -102.59 -102.595 -102.6 -102.605 -102.61 -102.615 -102.62 -102.625 -102.63 -102.635 -102.64 -102.645 -102.65 -102.655 -102.66 -102.665 -102.67 -102.675 -102.68 -102.685 -102.69 -102.695 -102.7 -102.705 -102.71 -102.715 -102.72 -102.725 -102.73 -102.735 -102.74 -102.745 -102.75 -102.755 -102.76 -102.765 -102.77 -102.775 -102.78 -102.785 -102.79 -102.795 -102.8 -102.805 -102.81 -102.815 -102.82 -102.825 -102.83 -102.835 -102.84 -102.845 -102.85 -102.855 -102.86 -102.865 -102.87 -102.875 -102.88 -102.885 -102.89 -102.895 -102.9 -102.905 -102.91 -102.915 -102.92 -102.925 -102.93 -102.935 -102.94 -102.945 -102.95 -102.955 -102.96 -102.965 -102.97 -102.975 -102.98 -102.985 -102.99 -102.995 -103 -103.005 -103.01 -103.015 -103.02 -103.025 -103.03 -103.035 -103.04 -103.045 -103.05 -103.055 -103.06 -103.065 -103.07 -103.075 -103.08 -103.085 -103.09 -103.095 -103.1 -103.105 -103.11 -103.115 -103.12 -103.125 -103.13 -103.135 -103.14 -103.145 -103.15 -103.155 -103.16 -103.165 -103.17 -103.175 -103.18 -103.185 -103.19 -103.195 -103.2 -103.205 -103.21 -103.215 -103.22 -103.225 -103.23 -103.235 -103.24 -103.245 -103.25 -103.255 -103.26 -103.265 -103.27 -103.275 -103.28 -103.285 -103.29 -103.295 -103.3 -103.305 -103.31 -103.315 -103.32 -103.325 -103.33 -103.335 -103.34 -103.345 -103.35 -103.355 -103.36 -103.365 -103.37 -103.375 -103.38 -103.385 -103.39 -103.395 -103.4 -103.405 -103.41 -103.415 -103.42 -103.425 -103.43 -103.435 -103.44 -103.445 -103.45 -103.455 -103.46 -103.465 -103.47 -103.475 -103.48 -103.485 -103.49 -103.495 -103.5 -103.505 -103.51 -103.515 -103.52 -103.525 -103.53 -103.535 -103.54 -103.545 -103.55 -103.555 -103.56 -103.565 -103.57 -103.575 -103.58 -103.585 -103.59 -103.595 -103.6 -103.605 -103.61 -103.615 -103.62 -103.625 -103.63 -103.635 -103.64 -103.645 -103.65 -103.655 -103.66 -103.665 -103.67 -103.675 -103.68 -103.685 -103.69 -103.695 -103.7 -103.705 -103.71 -103.715 -103.72 -103.725 -103.73 -103.735 -103.74 -103.745 -103.75 -103.755 -103.76 -103.765 -103.77 -103.775 -103.78 -103.785 -103.79 -103.795 -103.8 -103.805 -103.81 -103.815 -103.82 -103.825 -103.83 -103.835 -103.84 -103.845 -103.85 -103.855 -103.86 -103.865 -103.87 -103.875 -103.88 -103.885 -103.89 -103.895 -103.9 -103.905 -103.91 -103.915 -103.92 -103.925 -103.93 -103.935 -103.94 -103.945 -103.95 -103.955 -103.96 -103.965 -103.97 -103.975 -103.98 -103.985 -103.99 -103.995 -104 -104.005 -104.01 -104.015 -104.02 -104.025 -104.03 -104.035 -104.04 -104.045 -104.05 -104.055 -104.06 -104.065 -104.07 -104.075 -104.08 -104.085 -104.09 -104.095 -104.1 -104.105 -104.11 -104.115 -104.12 -104.125 -104.13 -104.135 -104.14 -104.145 -104.15 -104.155 -104.16 -104.165 -104.17 -104.175 -104.18 -104.185 -104.19 -104.195 -104.2 -104.205 -104.21 -104.215 -104.22 -104.225 -104.23 -104.235 -104.24 -104.245 -104.25 -104.255 -104.26 -104.265 -104.27 -104.275 -104.28 -104.285 -104.29 -104.295 -104.3 -104.305 -104.31 -104.315 -104.32 -104.325 -104.33 -104.335 -104.34 -104.345 -104.35 -104.355 -104.36 -104.365 -104.37 -104.375 -104.38 -104.385 -104.39 -104.395 -104.4 -104.405 -104.41 -104.415 -104.42 -104.425 -104.43 -104.435 -104.44 -104.445 -104.45 -104.455 -104.46 -104.465 -104.47 -104.475 -104.48 -104.485 -104.49 -104.495 -104.5 -104.505 -104.51 -104.515 -104.52 -104.525 -104.53 -104.535 -104.54 -104.545 -104.55 -104.555 -104.56 -104.565 -104.57 -104.575 -104.58 -104.585 -104.59 -104.595 -104.6 -104.605 -104.61 -104.615 -104.62 -104.625 -104.63 -104.635 -104.64 -104.645 -104.65 -104.655 -104.66 -104.665 -104.67 -104.675 -104.68 -104.685 -104.69 -104.695 -104.7 -104.705 -104.71 -104.715 -104.72 -104.725 -104.73 -104.735 -104.74 -104.745 -104.75 -104.755 -104.76 -104.765 -104.77 -104.775 -104.78 -104.785 -104.79 -104.795 -104.8 -104.805 -104.81 -104.815 -104.82 -104.825 -104.83 -104.835 -104.84 -104.845 -104.85 -104.855 -104.86 -104.865 -104.87 -104.875 -104.88 -104.885 -104.89 -104.895 -104.9 -104.905 -104.91 -104.915 -104.92 -104.925 -104.93 -104.935 -104.94 -104.945 -104.95 -104.955 -104.96 -104.965 -104.97 -104.975 -104.98 -104.985 -104.99 -104.995 -105 -105.005 -105.01 -105.015 -105.02 -105.025 -105.03 -105.035 -105.04 -105.045 -105.05 -105.055 -105.06 -105.065 -105.07 -105.075 -105.08 -105.085 -105.09 -105.095 -105.1 -105.105 -105.11 -105.115 -105.12 -105.125 -105.13 -105.135 -105.14 -105.145 -105.15 -105.155 -105.16 -105.165 -105.17 -105.175 -105.18 -105.185 -105.19 -105.195 -105.2 -105.205 -105.21 -105.215 -105.22 -105.225 -105.23 -105.235 -105.24 -105.245 -105.25 -105.255 -105.26 -105.265 -105.27 -105.275 -105.28 -105.285 -105.29 -105.295 -105.3 -105.305 -105.31 -105.315 -105.32 -105.325 -105.33 -105.335 -105.34 -105.345 -105.35 -105.355 -105.36 -105.365 -105.37 -105.375 -105.38 -105.385 -105.39 -105.395 -105.4 -105.405 -105.41 -105.415 -105.42 -105.425 -105.43 -105.435 -105.44 -105.445 -105.45 -105.455 -105.46 -105.465 -105.47 -105.475 -105.48 -105.485 -105.49 -105.495 -105.5 -105.505 -105.51 -105.515 -105.52 -105.525 -105.53 -105.535 -105.54 -105.545 -105.55 -105.555 -105.56 -105.565 -105.57 -105.575 -105.58 -105.585 -105.59 -105.595 -105.6 -105.605 -105.61 -105.615 -105.62 -105.625 -105.63 -105.635 -105.64 -105.645 -105.65 -105.655 -105.66 -105.665 -105.67 -105.675 -105.68 -105.685 -105.69 -105.695 -105.7 -105.705 -105.71 -105.715 -105.72 -105.725 -105.73 -105.735 -105.74 -105.745 -105.75 -105.755 -105.76 -105.765 -105.77 -105.775 -105.78 -105.785 -105.79 -105.795 -105.8 -105.805 -105.81 -105.815 -105.82 -105.825 -105.83 -105.835 -105.84 -105.845 -105.85 -105.855 -105.86 -105.865 -105.87 -105.875 -105.88 -105.885 -105.89 -105.895 -105.9 -105.905 -105.91 -105.915 -105.92 -105.925 -105.93 -105.935 -105.94 -105.945 -105.95 -105.955 -105.96 -105.965 -105.97 -105.975 -105.98 -105.985 -105.99 -105.995 -106 -106.005 -106.01 -106.015 -106.02 -106.025 -106.03 -106.035 -106.04 -106.045 -106.05 -106.055 -106.06 -106.065 -106.07 -106.075 -106.08 -106.085 -106.09 -106.095 -106.1 -106.105 -106.11 -106.115 -106.12 -106.125 -106.13 -106.135 -106.14 -106.145 -106.15 -106.155 -106.16 -106.165 -106.17 -106.175 -106.18 -106.185 -106.19 -106.195 -106.2 -106.205 -106.21 -106.215 -106.22 -106.225 -106.23 -106.235 -106.24 -106.245 -106.25 -106.255 -106.26 -106.265 -106.27 -106.275 -106.28 -106.285 -106.29 -106.295 -106.3 -106.305 -106.31 -106.315 -106.32 -106.325 -106.33 -106.335 -106.34 -106.345 -106.35 -106.355 -106.36 -106.365 -106.37 -106.375 -106.38 -106.385 -106.39 -106.395 -106.4 -106.405 -106.41 -106.415 -106.42 -106.425 -106.43 -106.435 -106.44 -106.445 -106.45 -106.455 -106.46 -106.465 -106.47 -106.475 -106.48 -106.485 -106.49 -106.495 -106.5 -106.505 -106.51 -106.515 -106.52 -106.525 -106.53 -106.535 -106.54 -106.545 -106.55 -106.555 -106.56 -106.565 -106.57 -106.575 -106.58 -106.585 -106.59 -106.595 -106.6 -106.605 -106.61 -106.615 -106.62 -106.625 -106.63 -106.635 -106.64 -106.645 -106.65 -106.655 -106.66 -106.665 -106.67 -106.675 -106.68 -106.685 -106.69 -106.695 -106.7 -106.705 -106.71 -106.715 -106.72 -106.725 -106.73 -106.735 -106.74 -106.745 -106.75 -106.755 -106.76 -106.765 -106.77 -106.775 -106.78 -106.785 -106.79 -106.795 -106.8 -106.805 -106.81 -106.815 -106.82 -106.825 -106.83 -106.835 -106.84 -106.845 -106.85 -106.855 -106.86 -106.865 -106.87 -106.875 -106.88 -106.885 -106.89 -106.895 -106.9 -106.905 -106.91 -106.915 -106.92 -106.925 -106.93 -106.935 -106.94 -106.945 -106.95 -106.955 -106.96 -106.965 -106.97 -106.975 -106.98 -106.985 -106.99 -106.995 -107 -107.005 -107.01 -107.015 -107.02 -107.025 -107.03 -107.035 -107.04 -107.045 -107.05 -107.055 -107.06 -107.065 -107.07 -107.075 -107.08 -107.085 -107.09 -107.095 -107.1 -107.105 -107.11 -107.115 -107.12 -107.125 -107.13 -107.135 -107.14 -107.145 -107.15 -107.155 -107.16 -107.165 -107.17 -107.175 -107.18 -107.185 -107.19 -107.195 -107.2 -107.205 -107.21 -107.215 -107.22 -107.225 -107.23 -107.235 -107.24 -107.245 -107.25 -107.255 -107.26 -107.265 -107.27 -107.275 -107.28 -107.285 -107.29 -107.295 -107.3 -107.305 -107.31 -107.315 -107.32 -107.325 -107.33 -107.335 -107.34 -107.345 -107.35 -107.355 -107.36 -107.365 -107.37 -107.375 -107.38 -107.385 -107.39 -107.395 -107.4 -107.405 -107.41 -107.415 -107.42 -107.425 -107.43 -107.435 -107.44 -107.445 -107.45 -107.455 -107.46 -107.465 -107.47 -107.475 -107.48 -107.485 -107.49 -107.495 -107.5 -107.505 -107.51 -107.515 -107.52 -107.525 -107.53 -107.535 -107.54 -107.545 -107.55 -107.555 -107.56 -107.565 -107.57 -107.575 -107.58 -107.585 -107.59 -107.595 -107.6 -107.605 -107.61 -107.615 -107.62 -107.625 -107.63 -107.635 -107.64 -107.645 -107.65 -107.655 -107.66 -107.665 -107.67 -107.675 -107.68 -107.685 -107.69 -107.695 -107.7 -107.705 -107.71 -107.715 -107.72 -107.725 -107.73 -107.735 -107.74 -107.745 -107.75 -107.755 -107.76 -107.765 -107.77 -107.775 -107.78 -107.785 -107.79 -107.795 -107.8 -107.805 -107.81 -107.815 -107.82 -107.825 -107.83 -107.835 -107.84 -107.845 -107.85 -107.855 -107.86 -107.865 -107.87 -107.875 -107.88 -107.885 -107.89 -107.895 -107.9 -107.905 -107.91 -107.915 -107.92 -107.925 -107.93 -107.935 -107.94 -107.945 -107.95 -107.955 -107.96 -107.965 -107.97 -107.975 -107.98 -107.985 -107.99 -107.995 -108 -108.005 -108.01 -108.015 -108.02 -108.025 -108.03 -108.035 -108.04 -108.045 -108.05 -108.055 -108.06 -108.065 -108.07 -108.075 -108.08 -108.085 -108.09 -108.095 -108.1 -108.105 -108.11 -108.115 -108.12 -108.125 -108.13 -108.135 -108.14 -108.145 -108.15 -108.155 -108.16 -108.165 -108.17 -108.175 -108.18 -108.185 -108.19 -108.195 -108.2 -108.205 -108.21 -108.215 -108.22 -108.225 -108.23 -108.235 -108.24 -108.245 -108.25 -108.255 -108.26 -108.265 -108.27 -108.275 -108.28 -108.285 -108.29 -108.295 -108.3 -108.305 -108.31 -108.315 -108.32 -108.325 -108.33 -108.335 -108.34 -108.345 -108.35 -108.355 -108.36 -108.365 -108.37 -108.375 -108.38 -108.385 -108.39 -108.395 -108.4 -108.405 -108.41 -108.415 -108.42 -108.425 -108.43 -108.435 -108.44 -108.445 -108.45 -108.455 -108.46 -108.465 -108.47 -108.475 -108.48 -108.485 -108.49 -108.495 -108.5 -108.505 -108.51 -108.515 -108.52 -108.525 -108.53 -108.535 -108.54 -108.545 -108.55 -108.555 -108.56 -108.565 -108.57 -108.575 -108.58 -108.585 -108.59 -108.595 -108.6 -108.605 -108.61 -108.615 -108.62 -108.625 -108.63 -108.635 -108.64 -108.645 -108.65 -108.655 -108.66 -108.665 -108.67 -108.675 -108.68 -108.685 -108.69 -108.695 -108.7 -108.705 -108.71 -108.715 -108.72 -108.725 -108.73 -108.735 -108.74 -108.745 -108.75 -108.755 -108.76 -108.765 -108.77 -108.775 -108.78 -108.785 -108.79 -108.795 -108.8 -108.805 -108.81 -108.815 -108.82 -108.825 -108.83 -108.835 -108.84 -108.845 -108.85 -108.855 -108.86 -108.865 -108.87 -108.875 -108.88 -108.885 -108.89 -108.895 -108.9 -108.905 -108.91 -108.915 -108.92 -108.925 -108.93 -108.935 -108.94 -108.945 -108.95 -108.955 -108.96 -108.965 -108.97 -108.975 -108.98 -108.985 -108.99 -108.995 -109 -109.005 -109.01 -109.015 -109.02 -109.025 -109.03 -109.035 -109.04 -109.045 -109.05 -109.055 -109.06 -109.065 -109.07 -109.075 -109.08 -109.085 -109.09 -109.095 -109.1 -109.105 -109.11 -109.115 -109.12 -109.125 -109.13 -109.135 -109.14 -109.145 -109.15 -109.155 -109.16 -109.165 -109.17 -109.175 -109.18 -109.185 -109.19 -109.195 -109.2 -109.205 -109.21 -109.215 -109.22 -109.225 -109.23 -109.235 -109.24 -109.245 -109.25 -109.255 -109.26 -109.265 -109.27 -109.275 -109.28 -109.285 -109.29 -109.295 -109.3 -109.305 -109.31 -109.315 -109.32 -109.325 -109.33 -109.335 -109.34 -109.345 -109.35 -109.355 -109.36 -109.365 -109.37 -109.375 -109.38 -109.385 -109.39 -109.395 -109.4 -109.405 -109.41 -109.415 -109.42 -109.425 -109.43 -109.435 -109.44 -109.445 -109.45 -109.455 -109.46 -109.465 -109.47 -109.475 -109.48 -109.485 -109.49 -109.495 -109.5 -109.505 -109.51 -109.515 -109.52 -109.525 -109.53 -109.535 -109.54 -109.545 -109.55 -109.555 -109.56 -109.565 -109.57 -109.575 -109.58 -109.585 -109.59 -109.595 -109.6 -109.605 -109.61 -109.615 -109.62 -109.625 -109.63 -109.635 -109.64 -109.645 -109.65 -109.655 -109.66 -109.665 -109.67 -109.675 -109.68 -109.685 -109.69 -109.695 -109.7 -109.705 -109.71 -109.715 -109.72 -109.725 -109.73 -109.735 -109.74 -109.745 -109.75 -109.755 -109.76 -109.765 -109.77 -109.775 -109.78 -109.785 -109.79 -109.795 -109.8 -109.805 -109.81 -109.815 -109.82 -109.825 -109.83 -109.835 -109.84 -109.845 -109.85 -109.855 -109.86 -109.865 -109.87 -109.875 -109.88 -109.885 -109.89 -109.895 -109.9 -109.905 -109.91 -109.915 -109.92 -109.925 -109.93 -109.935 -109.94 -109.945 -109.95 -109.955 -109.96 -109.965 -109.97 -109.975 -109.98 -109.985 -109.99 -109.995 -110 -110.005 -110.01 -110.015 -110.02 -110.025 -110.03 -110.035 -110.04 -110.045 -110.05 -110.055 -110.06 -110.065 -110.07 -110.075 -110.08 -110.085 -110.09 -110.095 -110.1 -110.105 -110.11 -110.115 -110.12 -110.125 -110.13 -110.135 -110.14 -110.145 -110.15 -110.155 -110.16 -110.165 -110.17 -110.175 -110.18 -110.185 -110.19 -110.195 -110.2 -110.205 -110.21 -110.215 -110.22 -110.225 -110.23 -110.235 -110.24 -110.245 -110.25 -110.255 -110.26 -110.265 -110.27 -110.275 -110.28 -110.285 -110.29 -110.295 -110.3 -110.305 -110.31 -110.315 -110.32 -110.325 -110.33 -110.335 -110.34 -110.345 -110.35 -110.355 -110.36 -110.365 -110.37 -110.375 -110.38 -110.385 -110.39 -110.395 -110.4 -110.405 -110.41 -110.415 -110.42 -110.425 -110.43 -110.435 -110.44 -110.445 -110.45 -110.455 -110.46 -110.465 -110.47 -110.475 -110.48 -110.485 -110.49 -110.495 -110.5 -110.505 -110.51 -110.515 -110.52 -110.525 -110.53 -110.535 -110.54 -110.545 -110.55 -110.555 -110.56 -110.565 -110.57 -110.575 -110.58 -110.585 -110.59 -110.595 -110.6 -110.605 -110.61 -110.615 -110.62 -110.625 -110.63 -110.635 -110.64 -110.645 -110.65 -110.655 -110.66 -110.665 -110.67 -110.675 -110.68 -110.685 -110.69 -110.695 -110.7 -110.705 -110.71 -110.715 -110.72 -110.725 -110.73 -110.735 -110.74 -110.745 -110.75 -110.755 -110.76 -110.765 -110.77 -110.775 -110.78 -110.785 -110.79 -110.795 -110.8 -110.805 -110.81 -110.815 -110.82 -110.825 -110.83 -110.835 -110.84 -110.845 -110.85 -110.855 -110.86 -110.865 -110.87 -110.875 -110.88 -110.885 -110.89 -110.895 -110.9 -110.905 -110.91 -110.915 -110.92 -110.925 -110.93 -110.935 -110.94 -110.945 -110.95 -110.955 -110.96 -110.965 -110.97 -110.975 -110.98 -110.985 -110.99 -110.995 -111 -111.005 -111.01 -111.015 -111.02 -111.025 -111.03 -111.035 -111.04 -111.045 -111.05 -111.055 -111.06 -111.065 -111.07 -111.075 -111.08 -111.085 -111.09 -111.095 -111.1 -111.105 -111.11 -111.115 -111.12 -111.125 -111.13 -111.135 -111.14 -111.145 -111.15 -111.155 -111.16 -111.165 -111.17 -111.175 -111.18 -111.185 -111.19 -111.195 -111.2 -111.205 -111.21 -111.215 -111.22 -111.225 -111.23 -111.235 -111.24 -111.245 -111.25 -111.255 -111.26 -111.265 -111.27 -111.275 -111.28 -111.285 -111.29 -111.295 -111.3 -111.305 -111.31 -111.315 -111.32 -111.325 -111.33 -111.335 -111.34 -111.345 -111.35 -111.355 -111.36 -111.365 -111.37 -111.375 -111.38 -111.385 -111.39 -111.395 -111.4 -111.405 -111.41 -111.415 -111.42 -111.425 -111.43 -111.435 -111.44 -111.445 -111.45 -111.455 -111.46 -111.465 -111.47 -111.475 -111.48 -111.485 -111.49 -111.495 -111.5 -111.505 -111.51 -111.515 -111.52 -111.525 -111.53 -111.535 -111.54 -111.545 -111.55 -111.555 -111.56 -111.565 -111.57 -111.575 -111.58 -111.585 -111.59 -111.595 -111.6 -111.605 -111.61 -111.615 -111.62 -111.625 -111.63 -111.635 -111.64 -111.645 -111.65 -111.655 -111.66 -111.665 -111.67 -111.675 -111.68 -111.685 -111.69 -111.695 -111.7 -111.705 -111.71 -111.715 -111.72 -111.725 -111.73 -111.735 -111.74 -111.745 -111.75 -111.755 -111.76 -111.765 -111.77 -111.775 -111.78 -111.785 -111.79 -111.795 -111.8 -111.805 -111.81 -111.815 -111.82 -111.825 -111.83 -111.835 -111.84 -111.845 -111.85 -111.855 -111.86 -111.865 -111.87 -111.875 -111.88 -111.885 -111.89 -111.895 -111.9 -111.905 -111.91 -111.915 -111.92 -111.925 -111.93 -111.935 -111.94 -111.945 -111.95 -111.955 -111.96 -111.965 -111.97 -111.975 -111.98 -111.985 -111.99 -111.995 -112 -112.005 -112.01 -112.015 -112.02 -112.025 -112.03 -112.035 -112.04 -112.045 -112.05 -112.055 -112.06 -112.065 -112.07 -112.075 -112.08 -112.085 -112.09 -112.095 -112.1 -112.105 -112.11 -112.115 -112.12 -112.125 -112.13 -112.135 -112.14 -112.145 -112.15 -112.155 -112.16 -112.165 -112.17 -112.175 -112.18 -112.185 -112.19 -112.195 -112.2 -112.205 -112.21 -112.215 -112.22 -112.225 -112.23 -112.235 -112.24 -112.245 -112.25 -112.255 -112.26 -112.265 -112.27 -112.275 -112.28 -112.285 -112.29 -112.295 -112.3 -112.305 -112.31 -112.315 -112.32 -112.325 -112.33 -112.335 -112.34 -112.345 -112.35 -112.355 -112.36 -112.365 -112.37 -112.375 -112.38 -112.385 -112.39 -112.395 -112.4 -112.405 -112.41 -112.415 -112.42 -112.425 -112.43 -112.435 -112.44 -112.445 -112.45 -112.455 -112.46 -112.465 -112.47 -112.475 -112.48 -112.485 -112.49 -112.495 -112.5 -112.505 -112.51 -112.515 -112.52 -112.525 -112.53 -112.535 -112.54 -112.545 -112.55 -112.555 -112.56 -112.565 -112.57 -112.575 -112.58 -112.585 -112.59 -112.595 -112.6 -112.605 -112.61 -112.615 -112.62 -112.625 -112.63 -112.635 -112.64 -112.645 -112.65 -112.655 -112.66 -112.665 -112.67 -112.675 -112.68 -112.685 -112.69 -112.695 -112.7 -112.705 -112.71 -112.715 -112.72 -112.725 -112.73 -112.735 -112.74 -112.745 -112.75 -112.755 -112.76 -112.765 -112.77 -112.775 -112.78 -112.785 -112.79 -112.795 -112.8 -112.805 -112.81 -112.815 -112.82 -112.825 -112.83 -112.835 -112.84 -112.845 -112.85 -112.855 -112.86 -112.865 -112.87 -112.875 -112.88 -112.885 -112.89 -112.895 -112.9 -112.905 -112.91 -112.915 -112.92 -112.925 -112.93 -112.935 -112.94 -112.945 -112.95 -112.955 -112.96 -112.965 -112.97 -112.975 -112.98 -112.985 -112.99 -112.995 -113 -113.005 -113.01 -113.015 -113.02 -113.025 -113.03 -113.035 -113.04 -113.045 -113.05 -113.055 -113.06 -113.065 -113.07 -113.075 -113.08 -113.085 -113.09 -113.095 -113.1 -113.105 -113.11 -113.115 -113.12 -113.125 -113.13 -113.135 -113.14 -113.145 -113.15 -113.155 -113.16 -113.165 -113.17 -113.175 -113.18 -113.185 -113.19 -113.195 -113.2 -113.205 -113.21 -113.215 -113.22 -113.225 -113.23 -113.235 -113.24 -113.245 -113.25 -113.255 -113.26 -113.265 -113.27 -113.275 -113.28 -113.285 -113.29 -113.295 -113.3 -113.305 -113.31 -113.315 -113.32 -113.325 -113.33 -113.335 -113.34 -113.345 -113.35 -113.355 -113.36 -113.365 -113.37 -113.375 -113.38 -113.385 -113.39 -113.395 -113.4 -113.405 -113.41 -113.415 -113.42 -113.425 -113.43 -113.435 -113.44 -113.445 -113.45 -113.455 -113.46 -113.465 -113.47 -113.475 -113.48 -113.485 -113.49 -113.495 -113.5 -113.505 -113.51 -113.515 -113.52 -113.525 -113.53 -113.535 -113.54 -113.545 -113.55 -113.555 -113.56 -113.565 -113.57 -113.575 -113.58 -113.585 -113.59 -113.595 -113.6 -113.605 -113.61 -113.615 -113.62 -113.625 -113.63 -113.635 -113.64 -113.645 -113.65 -113.655 -113.66 -113.665 -113.67 -113.675 -113.68 -113.685 -113.69 -113.695 -113.7 -113.705 -113.71 -113.715 -113.72 -113.725 -113.73 -113.735 -113.74 -113.745 -113.75 -113.755 -113.76 -113.765 -113.77 -113.775 -113.78 -113.785 -113.79 -113.795 -113.8 -113.805 -113.81 -113.815 -113.82 -113.825 -113.83 -113.835 -113.84 -113.845 -113.85 -113.855 -113.86 -113.865 -113.87 -113.875 -113.88 -113.885 -113.89 -113.895 -113.9 -113.905 -113.91 -113.915 -113.92 -113.925 -113.93 -113.935 -113.94 -113.945 -113.95 -113.955 -113.96 -113.965 -113.97 -113.975 -113.98 -113.985 -113.99 -113.995 -114 -114.005 -114.01 -114.015 -114.02 -114.025 -114.03 -114.035 -114.04 -114.045 -114.05 -114.055 -114.06 -114.065 -114.07 -114.075 -114.08 -114.085 -114.09 -114.095 -114.1 -114.105 -114.11 -114.115 -114.12 -114.125 -114.13 -114.135 -114.14 -114.145 -114.15 -114.155 -114.16 -114.165 -114.17 -114.175 -114.18 -114.185 -114.19 -114.195 -114.2 -114.205 -114.21 -114.215 -114.22 -114.225 -114.23 -114.235 -114.24 -114.245 -114.25 -114.255 -114.26 -114.265 -114.27 -114.275 -114.28 -114.285 -114.29 -114.295 -114.3 -114.305 -114.31 -114.315 -114.32 -114.325 -114.33 -114.335 -114.34 -114.345 -114.35 -114.355 -114.36 -114.365 -114.37 -114.375 -114.38 -114.385 -114.39 -114.395 -114.4 -114.405 -114.41 -114.415 -114.42 -114.425 -114.43 -114.435 -114.44 -114.445 -114.45 -114.455 -114.46 -114.465 -114.47 -114.475 -114.48 -114.485 -114.49 -114.495 -114.5 -114.505 -114.51 -114.515 -114.52 -114.525 -114.53 -114.535 -114.54 -114.545 -114.55 -114.555 -114.56 -114.565 -114.57 -114.575 -114.58 -114.585 -114.59 -114.595 -114.6 -114.605 -114.61 -114.615 -114.62 -114.625 -114.63 -114.635 -114.64 -114.645 -114.65 -114.655 -114.66 -114.665 -114.67 -114.675 -114.68 -114.685 -114.69 -114.695 -114.7 -114.705 -114.71 -114.715 -114.72 -114.725 -114.73 -114.735 -114.74 -114.745 -114.75 -114.755 -114.76 -114.765 -114.77 -114.775 -114.78 -114.785 -114.79 -114.795 -114.8 -114.805 -114.81 -114.815 -114.82 -114.825 -114.83 -114.835 -114.84 -114.845 -114.85 -114.855 -114.86 -114.865 -114.87 -114.875 -114.88 -114.885 -114.89 -114.895 -114.9 -114.905 -114.91 -114.915 -114.92 -114.925 -114.93 -114.935 -114.94 -114.945 -114.95 -114.955 -114.96 -114.965 -114.97 -114.975 -114.98 -114.985 -114.99 -114.995 -115 -115.005 -115.01 -115.015 -115.02 -115.025 -115.03 -115.035 -115.04 -115.045 -115.05 -115.055 -115.06 -115.065 -115.07 -115.075 -115.08 -115.085 -115.09 -115.095 -115.1 -115.105 -115.11 -115.115 -115.12 -115.125 -115.13 -115.135 -115.14 -115.145 -115.15 -115.155 -115.16 -115.165 -115.17 -115.175 -115.18 -115.185 -115.19 -115.195 -115.2 -115.205 -115.21 -115.215 -115.22 -115.225 -115.23 -115.235 -115.24 -115.245 -115.25 -115.255 -115.26 -115.265 -115.27 -115.275 -115.28 -115.285 -115.29 -115.295 -115.3 -115.305 -115.31 -115.315 -115.32 -115.325 -115.33 -115.335 -115.34 -115.345 -115.35 -115.355 -115.36 -115.365 -115.37 -115.375 -115.38 -115.385 -115.39 -115.395 -115.4 -115.405 -115.41 -115.415 -115.42 -115.425 -115.43 -115.435 -115.44 -115.445 -115.45 -115.455 -115.46 -115.465 -115.47 -115.475 -115.48 -115.485 -115.49 -115.495 -115.5 -115.505 -115.51 -115.515 -115.52 -115.525 -115.53 -115.535 -115.54 -115.545 -115.55 -115.555 -115.56 -115.565 -115.57 -115.575 -115.58 -115.585 -115.59 -115.595 -115.6 -115.605 -115.61 -115.615 -115.62 -115.625 -115.63 -115.635 -115.64 -115.645 -115.65 -115.655 -115.66 -115.665 -115.67 -115.675 -115.68 -115.685 -115.69 -115.695 -115.7 -115.705 -115.71 -115.715 -115.72 -115.725 -115.73 -115.735 -115.74 -115.745 -115.75 -115.755 -115.76 -115.765 -115.77 -115.775 -115.78 -115.785 -115.79 -115.795 -115.8 -115.805 -115.81 -115.815 -115.82 -115.825 -115.83 -115.835 -115.84 -115.845 -115.85 -115.855 -115.86 -115.865 -115.87 -115.875 -115.88 -115.885 -115.89 -115.895 -115.9 -115.905 -115.91 -115.915 -115.92 -115.925 -115.93 -115.935 -115.94 -115.945 -115.95 -115.955 -115.96 -115.965 -115.97 -115.975 -115.98 -115.985 -115.99 -115.995 -116 -116.005 -116.01 -116.015 -116.02 -116.025 -116.03 -116.035 -116.04 -116.045 -116.05 -116.055 -116.06 -116.065 -116.07 -116.075 -116.08 -116.085 -116.09 -116.095 -116.1 -116.105 -116.11 -116.115 -116.12 -116.125 -116.13 -116.135 -116.14 -116.145 -116.15 -116.155 -116.16 -116.165 -116.17 -116.175 -116.18 -116.185 -116.19 -116.195 -116.2 -116.205 -116.21 -116.215 -116.22 -116.225 -116.23 -116.235 -116.24 -116.245 -116.25 -116.255 -116.26 -116.265 -116.27 -116.275 -116.28 -116.285 -116.29 -116.295 -116.3 -116.305 -116.31 -116.315 -116.32 -116.325 -116.33 -116.335 -116.34 -116.345 -116.35 -116.355 -116.36 -116.365 -116.37 -116.375 -116.38 -116.385 -116.39 -116.395 -116.4 -116.405 -116.41 -116.415 -116.42 -116.425 -116.43 -116.435 -116.44 -116.445 -116.45 -116.455 -116.46 -116.465 -116.47 -116.475 -116.48 -116.485 -116.49 -116.495 -116.5 -116.505 -116.51 -116.515 -116.52 -116.525 -116.53 -116.535 -116.54 -116.545 -116.55 -116.555 -116.56 -116.565 -116.57 -116.575 -116.58 -116.585 -116.59 -116.595 -116.6 -116.605 -116.61 -116.615 -116.62 -116.625 -116.63 -116.635 -116.64 -116.645 -116.65 -116.655 -116.66 -116.665 -116.67 -116.675 -116.68 -116.685 -116.69 -116.695 -116.7 -116.705 -116.71 -116.715 -116.72 -116.725 -116.73 -116.735 -116.74 -116.745 -116.75 -116.755 -116.76 -116.765 -116.77 -116.775 -116.78 -116.785 -116.79 -116.795 -116.8 -116.805 -116.81 -116.815 -116.82 -116.825 -116.83 -116.835 -116.84 -116.845 -116.85 -116.855 -116.86 -116.865 -116.87 -116.875 -116.88 -116.885 -116.89 -116.895 -116.9 -116.905 -116.91 -116.915 -116.92 -116.925 -116.93 -116.935 -116.94 -116.945 -116.95 -116.955 -116.96 -116.965 -116.97 -116.975 -116.98 -116.985 -116.99 -116.995 -117 -117.005 -117.01 -117.015 -117.02 -117.025 -117.03 -117.035 -117.04 -117.045 -117.05 -117.055 -117.06 -117.065 -117.07 -117.075 -117.08 -117.085 -117.09 -117.095 -117.1 -117.105 -117.11 -117.115 -117.12 -117.125 -117.13 -117.135 -117.14 -117.145 -117.15 -117.155 -117.16 -117.165 -117.17 -117.175 -117.18 -117.185 -117.19 -117.195 -117.2 -117.205 -117.21 -117.215 -117.22 -117.225 -117.23 -117.235 -117.24 -117.245 -117.25 -117.255 -117.26 -117.265 -117.27 -117.275 -117.28 -117.285 -117.29 -117.295 -117.3 -117.305 -117.31 -117.315 -117.32 -117.325 -117.33 -117.335 -117.34 -117.345 -117.35 -117.355 -117.36 -117.365 -117.37 -117.375 -117.38 -117.385 -117.39 -117.395 -117.4 -117.405 -117.41 -117.415 -117.42 -117.425 -117.43 -117.435 -117.44 -117.445 -117.45 -117.455 -117.46 -117.465 -117.47 -117.475 -117.48 -117.485 -117.49 -117.495 -117.5 -117.505 -117.51 -117.515 -117.52 -117.525 -117.53 -117.535 -117.54 -117.545 -117.55 -117.555 -117.56 -117.565 -117.57 -117.575 -117.58 -117.585 -117.59 -117.595 -117.6 -117.605 -117.61 -117.615 -117.62 -117.625 -117.63 -117.635 -117.64 -117.645 -117.65 -117.655 -117.66 -117.665 -117.67 -117.675 -117.68 -117.685 -117.69 -117.695 -117.7 -117.705 -117.71 -117.715 -117.72 -117.725 -117.73 -117.735 -117.74 -117.745 -117.75 -117.755 -117.76 -117.765 -117.77 -117.775 -117.78 -117.785 -117.79 -117.795 -117.8 -117.805 -117.81 -117.815 -117.82 -117.825 -117.83 -117.835 -117.84 -117.845 -117.85 -117.855 -117.86 -117.865 -117.87 -117.875 -117.88 -117.885 -117.89 -117.895 -117.9 -117.905 -117.91 -117.915 -117.92 -117.925 -117.93 -117.935 -117.94 -117.945 -117.95 -117.955 -117.96 -117.965 -117.97 -117.975 -117.98 -117.985 -117.99 -117.995 -118 -118.005 -118.01 -118.015 -118.02 -118.025 -118.03 -118.035 -118.04 -118.045 -118.05 -118.055 -118.06 -118.065 -118.07 -118.075 -118.08 -118.085 -118.09 -118.095 -118.1 -118.105 -118.11 -118.115 -118.12 -118.125 -118.13 -118.135 -118.14 -118.145 -118.15 -118.155 -118.16 -118.165 -118.17 -118.175 -118.18 -118.185 -118.19 -118.195 -118.2 -118.205 -118.21 -118.215 -118.22 -118.225 -118.23 -118.235 -118.24 -118.245 -118.25 -118.255 -118.26 -118.265 -118.27 -118.275 -118.28 -118.285 -118.29 -118.295 -118.3 -118.305 -118.31 -118.315 -118.32 -118.325 -118.33 -118.335 -118.34 -118.345 -118.35 -118.355 -118.36 -118.365 -118.37 -118.375 -118.38 -118.385 -118.39 -118.395 -118.4 -118.405 -118.41 -118.415 -118.42 -118.425 -118.43 -118.435 -118.44 -118.445 -118.45 -118.455 -118.46 -118.465 -118.47 -118.475 -118.48 -118.485 -118.49 -118.495 -118.5 -118.505 -118.51 -118.515 -118.52 -118.525 -118.53 -118.535 -118.54 -118.545 -118.55 -118.555 -118.56 -118.565 -118.57 -118.575 -118.58 -118.585 -118.59 -118.595 -118.6 -118.605 -118.61 -118.615 -118.62 -118.625 -118.63 -118.635 -118.64 -118.645 -118.65 -118.655 -118.66 -118.665 -118.67 -118.675 -118.68 -118.685 -118.69 -118.695 -118.7 -118.705 -118.71 -118.715 -118.72 -118.725 -118.73 -118.735 -118.74 -118.745 -118.75 -118.755 -118.76 -118.765 -118.77 -118.775 -118.78 -118.785 -118.79 -118.795 -118.8 -118.805 -118.81 -118.815 -118.82 -118.825 -118.83 -118.835 -118.84 -118.845 -118.85 -118.855 -118.86 -118.865 -118.87 -118.875 -118.88 -118.885 -118.89 -118.895 -118.9 -118.905 -118.91 -118.915 -118.92 -118.925 -118.93 -118.935 -118.94 -118.945 -118.95 -118.955 -118.96 -118.965 -118.97 -118.975 -118.98 -118.985 -118.99 -118.995 -119 -119.005 -119.01 -119.015 -119.02 -119.025 -119.03 -119.035 -119.04 -119.045 -119.05 -119.055 -119.06 -119.065 -119.07 -119.075 -119.08 -119.085 -119.09 -119.095 -119.1 -119.105 -119.11 -119.115 -119.12 -119.125 -119.13 -119.135 -119.14 -119.145 -119.15 -119.155 -119.16 -119.165 -119.17 -119.175 -119.18 -119.185 -119.19 -119.195 -119.2 -119.205 -119.21 -119.215 -119.22 -119.225 -119.23 -119.235 -119.24 -119.245 -119.25 -119.255 -119.26 -119.265 -119.27 -119.275 -119.28 -119.285 -119.29 -119.295 -119.3 -119.305 -119.31 -119.315 -119.32 -119.325 -119.33 -119.335 -119.34 -119.345 -119.35 -119.355 -119.36 -119.365 -119.37 -119.375 -119.38 -119.385 -119.39 -119.395 -119.4 -119.405 -119.41 -119.415 -119.42 -119.425 -119.43 -119.435 -119.44 -119.445 -119.45 -119.455 -119.46 -119.465 -119.47 -119.475 -119.48 -119.485 -119.49 -119.495 -119.5 -119.505 -119.51 -119.515 -119.52 -119.525 -119.53 -119.535 -119.54 -119.545 -119.55 -119.555 -119.56 -119.565 -119.57 -119.575 -119.58 -119.585 -119.59 -119.595 -119.6 -119.605 -119.61 -119.615 -119.62 -119.625 -119.63 -119.635 -119.64 -119.645 -119.65 -119.655 -119.66 -119.665 -119.67 -119.675 -119.68 -119.685 -119.69 -119.695 -119.7 -119.705 -119.71 -119.715 -119.72 -119.725 -119.73 -119.735 -119.74 -119.745 -119.75 -119.755 -119.76 -119.765 -119.77 -119.775 -119.78 -119.785 -119.79 -119.795 -119.8 -119.805 -119.81 -119.815 -119.82 -119.825 -119.83 -119.835 -119.84 -119.845 -119.85 -119.855 -119.86 -119.865 -119.87 -119.875 -119.88 -119.885 -119.89 -119.895 -119.9 -119.905 -119.91 -119.915 -119.92 -119.925 -119.93 -119.935 -119.94 -119.945 -119.95 -119.955 -119.96 -119.965 -119.97 -119.975 -119.98 -119.985 -119.99 -119.995 -120 -120.005 -120.01 -120.015 -120.02 -120.025 -120.03 -120.035 -120.04 -120.045 -120.05 -120.055 -120.06 -120.065 -120.07 -120.075 -120.08 -120.085 -120.09 -120.095 -120.1 -120.105 -120.11 -120.115 -120.12 -120.125 -120.13 -120.135 -120.14 -120.145 -120.15 -120.155 -120.16 -120.165 -120.17 -120.175 -120.18 -120.185 -120.19 -120.195 -120.2 -120.205 -120.21 -120.215 -120.22 -120.225 -120.23 -120.235 -120.24 -120.245 -120.25 -120.255 -120.26 -120.265 -120.27 -120.275 -120.28 -120.285 -120.29 -120.295 -120.3 -120.305 -120.31 -120.315 -120.32 -120.325 -120.33 -120.335 -120.34 -120.345 -120.35 -120.355 -120.36 -120.365 -120.37 -120.375 -120.38 -120.385 -120.39 -120.395 -120.4 -120.405 -120.41 -120.415 -120.42 -120.425 -120.43 -120.435 -120.44 -120.445 -120.45 -120.455 -120.46 -120.465 -120.47 -120.475 -120.48 -120.485 -120.49 -120.495 -120.5 -120.505 -120.51 -120.515 -120.52 -120.525 -120.53 -120.535 -120.54 -120.545 -120.55 -120.555 -120.56 -120.565 -120.57 -120.575 -120.58 -120.585 -120.59 -120.595 -120.6 -120.605 -120.61 -120.615 -120.62 -120.625 -120.63 -120.635 -120.64 -120.645 -120.65 -120.655 -120.66 -120.665 -120.67 -120.675 -120.68 -120.685 -120.69 -120.695 -120.7 -120.705 -120.71 -120.715 -120.72 -120.725 -120.73 -120.735 -120.74 -120.745 -120.75 -120.755 -120.76 -120.765 -120.77 -120.775 -120.78 -120.785 -120.79 -120.795 -120.8 -120.805 -120.81 -120.815 -120.82 -120.825 -120.83 -120.835 -120.84 -120.845 -120.85 -120.855 -120.86 -120.865 -120.87 -120.875 -120.88 -120.885 -120.89 -120.895 -120.9 -120.905 -120.91 -120.915 -120.92 -120.925 -120.93 -120.935 -120.94 -120.945 -120.95 -120.955 -120.96 -120.965 -120.97 -120.975 -120.98 -120.985 -120.99 -120.995 -121 -121.005 -121.01 -121.015 -121.02 -121.025 -121.03 -121.035 -121.04 -121.045 -121.05 -121.055 -121.06 -121.065 -121.07 -121.075 -121.08 -121.085 -121.09 -121.095 -121.1 -121.105 -121.11 -121.115 -121.12 -121.125 -121.13 -121.135 -121.14 -121.145 -121.15 -121.155 -121.16 -121.165 -121.17 -121.175 -121.18 -121.185 -121.19 -121.195 -121.2 -121.205 -121.21 -121.215 -121.22 -121.225 -121.23 -121.235 -121.24 -121.245 -121.25 -121.255 -121.26 -121.265 -121.27 -121.275 -121.28 -121.285 -121.29 -121.295 -121.3 -121.305 -121.31 -121.315 -121.32 -121.325 -121.33 -121.335 -121.34 -121.345 -121.35 -121.355 -121.36 -121.365 -121.37 -121.375 -121.38 -121.385 -121.39 -121.395 -121.4 -121.405 -121.41 -121.415 -121.42 -121.425 -121.43 -121.435 -121.44 -121.445 -121.45 -121.455 -121.46 -121.465 -121.47 -121.475 -121.48 -121.485 -121.49 -121.495 -121.5 -121.505 -121.51 -121.515 -121.52 -121.525 -121.53 -121.535 -121.54 -121.545 -121.55 -121.555 -121.56 -121.565 -121.57 -121.575 -121.58 -121.585 -121.59 -121.595 -121.6 -121.605 -121.61 -121.615 -121.62 -121.625 -121.63 -121.635 -121.64 -121.645 -121.65 -121.655 -121.66 -121.665 -121.67 -121.675 -121.68 -121.685 -121.69 -121.695 -121.7 -121.705 -121.71 -121.715 -121.72 -121.725 -121.73 -121.735 -121.74 -121.745 -121.75 -121.755 -121.76 -121.765 -121.77 -121.775 -121.78 -121.785 -121.79 -121.795 -121.8 -121.805 -121.81 -121.815 -121.82 -121.825 -121.83 -121.835 -121.84 -121.845 -121.85 -121.855 -121.86 -121.865 -121.87 -121.875 -121.88 -121.885 -121.89 -121.895 -121.9 -121.905 -121.91 -121.915 -121.92 -121.925 -121.93 -121.935 -121.94 -121.945 -121.95 -121.955 -121.96 -121.965 -121.97 -121.975 -121.98 -121.985 -121.99 -121.995 -122 -122.005 -122.01 -122.015 -122.02 -122.025 -122.03 -122.035 -122.04 -122.045 -122.05 -122.055 -122.06 -122.065 -122.07 -122.075 -122.08 -122.085 -122.09 -122.095 -122.1 -122.105 -122.11 -122.115 -122.12 -122.125 -122.13 -122.135 -122.14 -122.145 -122.15 -122.155 -122.16 -122.165 -122.17 -122.175 -122.18 -122.185 -122.19 -122.195 -122.2 -122.205 -122.21 -122.215 -122.22 -122.225 -122.23 -122.235 -122.24 -122.245 -122.25 -122.255 -122.26 -122.265 -122.27 -122.275 -122.28 -122.285 -122.29 -122.295 -122.3 -122.305 -122.31 -122.315 -122.32 -122.325 -122.33 -122.335 -122.34 -122.345 -122.35 -122.355 -122.36 -122.365 -122.37 -122.375 -122.38 -122.385 -122.39 -122.395 -122.4 -122.405 -122.41 -122.415 -122.42 -122.425 -122.43 -122.435 -122.44 -122.445 -122.45 -122.455 -122.46 -122.465 -122.47 -122.475 -122.48 -122.485 -122.49 -122.495 -122.5 -122.505 -122.51 -122.515 -122.52 -122.525 -122.53 -122.535 -122.54 -122.545 -122.55 -122.555 -122.56 -122.565 -122.57 -122.575 -122.58 -122.585 -122.59 -122.595 -122.6 -122.605 -122.61 -122.615 -122.62 -122.625 -122.63 -122.635 -122.64 -122.645 -122.65 -122.655 -122.66 -122.665 -122.67 -122.675 -122.68 -122.685 -122.69 -122.695 -122.7 -122.705 -122.71 -122.715 -122.72 -122.725 -122.73 -122.735 -122.74 -122.745 -122.75 -122.755 -122.76 -122.765 -122.77 -122.775 -122.78 -122.785 -122.79 -122.795 -122.8 -122.805 -122.81 -122.815 -122.82 -122.825 -122.83 -122.835 -122.84 -122.845 -122.85 -122.855 -122.86 -122.865 -122.87 -122.875 -122.88 -122.885 -122.89 -122.895 -122.9 -122.905 -122.91 -122.915 -122.92 -122.925 -122.93 -122.935 -122.94 -122.945 -122.95 -122.955 -122.96 -122.965 -122.97 -122.975 -122.98 -122.985 -122.99 -122.995 -123 -123.005 -123.01 -123.015 -123.02 -123.025 -123.03 -123.035 -123.04 -123.045 -123.05 -123.055 -123.06 -123.065 -123.07 -123.075 -123.08 -123.085 -123.09 -123.095 -123.1 -123.105 -123.11 -123.115 -123.12 -123.125 -123.13 -123.135 -123.14 -123.145 -123.15 -123.155 -123.16 -123.165 -123.17 -123.175 -123.18 -123.185 -123.19 -123.195 -123.2 -123.205 -123.21 -123.215 -123.22 -123.225 -123.23 -123.235 -123.24 -123.245 -123.25 -123.255 -123.26 -123.265 -123.27 -123.275 -123.28 -123.285 -123.29 -123.295 -123.3 -123.305 -123.31 -123.315 -123.32 -123.325 -123.33 -123.335 -123.34 -123.345 -123.35 -123.355 -123.36 -123.365 -123.37 -123.375 -123.38 -123.385 -123.39 -123.395 -123.4 -123.405 -123.41 -123.415 -123.42 -123.425 -123.43 -123.435 -123.44 -123.445 -123.45 -123.455 -123.46 -123.465 -123.47 -123.475 -123.48 -123.485 -123.49 -123.495 -123.5 -123.505 -123.51 -123.515 -123.52 -123.525 -123.53 -123.535 -123.54 -123.545 -123.55 -123.555 -123.56 -123.565 -123.57 -123.575 -123.58 -123.585 -123.59 -123.595 -123.6 -123.605 -123.61 -123.615 -123.62 -123.625 -123.63 -123.635 -123.64 -123.645 -123.65 -123.655 -123.66 -123.665 -123.67 -123.675 -123.68 -123.685 -123.69 -123.695 -123.7 -123.705 -123.71 -123.715 -123.72 -123.725 -123.73 -123.735 -123.74 -123.745 -123.75 -123.755 -123.76 -123.765 -123.77 -123.775 -123.78 -123.785 -123.79 -123.795 -123.8 -123.805 -123.81 -123.815 -123.82 -123.825 -123.83 -123.835 -123.84 -123.845 -123.85 -123.855 -123.86 -123.865 -123.87 -123.875 -123.88 -123.885 -123.89 -123.895 -123.9 -123.905 -123.91 -123.915 -123.92 -123.925 -123.93 -123.935 -123.94 -123.945 -123.95 -123.955 -123.96 -123.965 -123.97 -123.975 -123.98 -123.985 -123.99 -123.995 -124 -124.005 -124.01 -124.015 -124.02 -124.025 -124.03 -124.035 -124.04 -124.045 -124.05 -124.055 -124.06 -124.065 -124.07 -124.075 -124.08 -124.085 -124.09 -124.095 -124.1 -124.105 -124.11 -124.115 -124.12 -124.125 -124.13 -124.135 -124.14 -124.145 -124.15 -124.155 -124.16 -124.165 -124.17 -124.175 -124.18 -124.185 -124.19 -124.195 -124.2 -124.205 -124.21 -124.215 -124.22 -124.225 -124.23 -124.235 -124.24 -124.245 -124.25 -124.255 -124.26 -124.265 -124.27 -124.275 -124.28 -124.285 -124.29 -124.295 -124.3 -124.305 -124.31 -124.315 -124.32 -124.325 -124.33 -124.335 -124.34 -124.345 -124.35 -124.355 -124.36 -124.365 -124.37 -124.375 -124.38 -124.385 -124.39 -124.395 -124.4 -124.405 -124.41 -124.415 -124.42 -124.425 -124.43 -124.435 -124.44 -124.445 -124.45 -124.455 -124.46 -124.465 -124.47 -124.475 -124.48 -124.485 -124.49 -124.495 -124.5 -124.505 -124.51 -124.515 -124.52 -124.525 -124.53 -124.535 -124.54 -124.545 -124.55 -124.555 -124.56 -124.565 -124.57 -124.575 -124.58 -124.585 -124.59 -124.595 -124.6 -124.605 -124.61 -124.615 -124.62 -124.625 -124.63 -124.635 -124.64 -124.645 -124.65 -124.655 -124.66 -124.665 -124.67 -124.675 -124.68 -124.685 -124.69 -124.695 -124.7 -124.705 -124.71 -124.715 -124.72 -124.725 -124.73 -124.735 -124.74 -124.745 -124.75 -124.755 -124.76 -124.765 -124.77 -124.775 -124.78 -124.785 -124.79 -124.795 -124.8 -124.805 -124.81 -124.815 -124.82 -124.825 -124.83 -124.835 -124.84 -124.845 -124.85 -124.855 -124.86 -124.865 -124.87 -124.875 -124.88 -124.885 -124.89 -124.895 -124.9 -124.905 -124.91 -124.915 -124.92 -124.925 -124.93 -124.935 -124.94 -124.945 -124.95 -124.955 -124.96 -124.965 -124.97 -124.975 -124.98 -124.985 -124.99 -124.995 -125 -125.005 -125.01 -125.015 -125.02 -125.025 -125.03 -125.035 -125.04 -125.045 -125.05 -125.055 -125.06 -125.065 -125.07 -125.075 -125.08 -125.085 -125.09 -125.095 -125.1 -125.105 -125.11 -125.115 -125.12 -125.125 -125.13 -125.135 -125.14 -125.145 -125.15 -125.155 -125.16 -125.165 -125.17 -125.175 -125.18 -125.185 -125.19 -125.195 -125.2 -125.205 -125.21 -125.215 -125.22 -125.225 -125.23 -125.235 -125.24 -125.245 -125.25 -125.255 -125.26 -125.265 -125.27 -125.275 -125.28 -125.285 -125.29 -125.295 -125.3 -125.305 -125.31 -125.315 -125.32 -125.325 -125.33 -125.335 -125.34 -125.345 -125.35 -125.355 -125.36 -125.365 -125.37 -125.375 -125.38 -125.385 -125.39 -125.395 -125.4 -125.405 -125.41 -125.415 -125.42 -125.425 -125.43 -125.435 -125.44 -125.445 -125.45 -125.455 -125.46 -125.465 -125.47 -125.475 -125.48 -125.485 -125.49 -125.495 -125.5 -125.505 -125.51 -125.515 -125.52 -125.525 -125.53 -125.535 -125.54 -125.545 -125.55 -125.555 -125.56 -125.565 -125.57 -125.575 -125.58 -125.585 -125.59 -125.595 -125.6 -125.605 -125.61 -125.615 -125.62 -125.625 -125.63 -125.635 -125.64 -125.645 -125.65 -125.655 -125.66 -125.665 -125.67 -125.675 -125.68 -125.685 -125.69 -125.695 -125.7 -125.705 -125.71 -125.715 -125.72 -125.725 -125.73 -125.735 -125.74 -125.745 -125.75 -125.755 -125.76 -125.765 -125.77 -125.775 -125.78 -125.785 -125.79 -125.795 -125.8 -125.805 -125.81 -125.815 -125.82 -125.825 -125.83 -125.835 -125.84 -125.845 -125.85 -125.855 -125.86 -125.865 -125.87 -125.875 -125.88 -125.885 -125.89 -125.895 -125.9 -125.905 -125.91 -125.915 -125.92 -125.925 -125.93 -125.935 -125.94 -125.945 -125.95 -125.955 -125.96 -125.965 -125.97 -125.975 -125.98 -125.985 -125.99 -125.995 -126 -126.005 -126.01 -126.015 -126.02 -126.025 -126.03 -126.035 -126.04 -126.045 -126.05 -126.055 -126.06 -126.065 -126.07 -126.075 -126.08 -126.085 -126.09 -126.095 -126.1 -126.105 -126.11 -126.115 -126.12 -126.125 -126.13 -126.135 -126.14 -126.145 -126.15 -126.155 -126.16 -126.165 -126.17 -126.175 -126.18 -126.185 -126.19 -126.195 -126.2 -126.205 -126.21 -126.215 -126.22 -126.225 -126.23 -126.235 -126.24 -126.245 -126.25 -126.255 -126.26 -126.265 -126.27 -126.275 -126.28 -126.285 -126.29 -126.295 -126.3 -126.305 -126.31 -126.315 -126.32 -126.325 -126.33 -126.335 -126.34 -126.345 -126.35 -126.355 -126.36 -126.365 -126.37 -126.375 -126.38 -126.385 -126.39 -126.395 -126.4 -126.405 -126.41 -126.415 -126.42 -126.425 -126.43 -126.435 -126.44 -126.445 -126.45 -126.455 -126.46 -126.465 -126.47 -126.475 -126.48 -126.485 -126.49 -126.495 -126.5 -126.505 -126.51 -126.515 -126.52 -126.525 -126.53 -126.535 -126.54 -126.545 -126.55 -126.555 -126.56 -126.565 -126.57 -126.575 -126.58 -126.585 -126.59 -126.595 -126.6 -126.605 -126.61 -126.615 -126.62 -126.625 -126.63 -126.635 -126.64 -126.645 -126.65 -126.655 -126.66 -126.665 -126.67 -126.675 -126.68 -126.685 -126.69 -126.695 -126.7 -126.705 -126.71 -126.715 -126.72 -126.725 -126.73 -126.735 -126.74 -126.745 -126.75 -126.755 -126.76 -126.765 -126.77 -126.775 -126.78 -126.785 -126.79 -126.795 -126.8 -126.805 -126.81 -126.815 -126.82 -126.825 -126.83 -126.835 -126.84 -126.845 -126.85 -126.855 -126.86 -126.865 -126.87 -126.875 -126.88 -126.885 -126.89 -126.895 -126.9 -126.905 -126.91 -126.915 -126.92 -126.925 -126.93 -126.935 -126.94 -126.945 -126.95 -126.955 -126.96 -126.965 -126.97 -126.975 -126.98 -126.985 -126.99 -126.995 -127 -127.005 -127.01 -127.015 -127.02 -127.025 -127.03 -127.035 -127.04 -127.045 -127.05 -127.055 -127.06 -127.065 -127.07 -127.075 -127.08 -127.085 -127.09 -127.095 -127.1 -127.105 -127.11 -127.115 -127.12 -127.125 -127.13 -127.135 -127.14 -127.145 -127.15 -127.155 -127.16 -127.165 -127.17 -127.175 -127.18 -127.185 -127.19 -127.195 -127.2 -127.205 -127.21 -127.215 -127.22 -127.225 -127.23 -127.235 -127.24 -127.245 -127.25 -127.255 -127.26 -127.265 -127.27 -127.275 -127.28 -127.285 -127.29 -127.295 -127.3 -127.305 -127.31 -127.315 -127.32 -127.325 -127.33 -127.335 -127.34 -127.345 -127.35 -127.355 -127.36 -127.365 -127.37 -127.375 -127.38 -127.385 -127.39 -127.395 -127.4 -127.405 -127.41 -127.415 -127.42 -127.425 -127.43 -127.435 -127.44 -127.445 -127.45 -127.455 -127.46 -127.465 -127.47 -127.475 -127.48 -127.485 -127.49 -127.495 -127.5 -127.505 -127.51 -127.515 -127.52 -127.525 -127.53 -127.535 -127.54 -127.545 -127.55 -127.555 -127.56 -127.565 -127.57 -127.575 -127.58 -127.585 -127.59 -127.595 -127.6 -127.605 -127.61 -127.615 -127.62 -127.625 -127.63 -127.635 -127.64 -127.645 -127.65 -127.655 -127.66 -127.665 -127.67 -127.675 -127.68 -127.685 -127.69 -127.695 -127.7 -127.705 -127.71 -127.715 -127.72 -127.725 -127.73 -127.735 -127.74 -127.745 -127.75 -127.755 -127.76 -127.765 -127.77 -127.775 -127.78 -127.785 -127.79 -127.795 -127.8 -127.805 -127.81 -127.815 -127.82 -127.825 -127.83 -127.835 -127.84 -127.845 -127.85 -127.855 -127.86 -127.865 -127.87 -127.875 -127.88 -127.885 -127.89 -127.895 -127.9 -127.905 -127.91 -127.915 -127.92 -127.925 -127.93 -127.935 -127.94 -127.945 -127.95 -127.955 -127.96 -127.965 -127.97 -127.975 -127.98 -127.985 -127.99 -127.995 -128 -128.005 -128.01 -128.015 -128.02 -128.025 -128.03 -128.035 -128.04 -128.045 -128.05 -128.055 -128.06 -128.065 -128.07 -128.075 -128.08 -128.085 -128.09 -128.095 -128.1 -128.105 -128.11 -128.115 -128.12 -128.125 -128.13 -128.135 -128.14 -128.145 -128.15 -128.155 -128.16 -128.165 -128.17 -128.175 -128.18 -128.185 -128.19 -128.195 -128.2 -128.205 -128.21 -128.215 -128.22 -128.225 -128.23 -128.235 -128.24 -128.245 -128.25 -128.255 -128.26 -128.265 -128.27 -128.275 -128.28 -128.285 -128.29 -128.295 -128.3 -128.305 -128.31 -128.315 -128.32 -128.325 -128.33 -128.335 -128.34 -128.345 -128.35 -128.355 -128.36 -128.365 -128.37 -128.375 -128.38 -128.385 -128.39 -128.395 -128.4 -128.405 -128.41 -128.415 -128.42 -128.425 -128.43 -128.435 -128.44 -128.445 -128.45 -128.455 -128.46 -128.465 -128.47 -128.475 -128.48 -128.485 -128.49 -128.495 -128.5 -128.505 -128.51 -128.515 -128.52 -128.525 -128.53 -128.535 -128.54 -128.545 -128.55 -128.555 -128.56 -128.565 -128.57 -128.575 -128.58 -128.585 -128.59 -128.595 -128.6 -128.605 -128.61 -128.615 -128.62 -128.625 -128.63 -128.635 -128.64 -128.645 -128.65 -128.655 -128.66 -128.665 -128.67 -128.675 -128.68 -128.685 -128.69 -128.695 -128.7 -128.705 -128.71 -128.715 -128.72 -128.725 -128.73 -128.735 -128.74 -128.745 -128.75 -128.755 -128.76 -128.765 -128.77 -128.775 -128.78 -128.785 -128.79 -128.795 -128.8 -128.805 -128.81 -128.815 -128.82 -128.825 -128.83 -128.835 -128.84 -128.845 -128.85 -128.855 -128.86 -128.865 -128.87 -128.875 -128.88 -128.885 -128.89 -128.895 -128.9 -128.905 -128.91 -128.915 -128.92 -128.925 -128.93 -128.935 -128.94 -128.945 -128.95 -128.955 -128.96 -128.965 -128.97 -128.975 -128.98 -128.985 -128.99 -128.995 -129 -129.005 -129.01 -129.015 -129.02 -129.025 -129.03 -129.035 -129.04 -129.045 -129.05 -129.055 -129.06 -129.065 -129.07 -129.075 -129.08 -129.085 -129.09 -129.095 -129.1 -129.105 -129.11 -129.115 -129.12 -129.125 -129.13 -129.135 -129.14 -129.145 -129.15 -129.155 -129.16 -129.165 -129.17 -129.175 -129.18 -129.185 -129.19 -129.195 -129.2 -129.205 -129.21 -129.215 -129.22 -129.225 -129.23 -129.235 -129.24 -129.245 -129.25 -129.255 -129.26 -129.265 -129.27 -129.275 -129.28 -129.285 -129.29 -129.295 -129.3 -129.305 -129.31 -129.315 -129.32 -129.325 -129.33 -129.335 -129.34 -129.345 -129.35 -129.355 -129.36 -129.365 -129.37 -129.375 -129.38 -129.385 -129.39 -129.395 -129.4 -129.405 -129.41 -129.415 -129.42 -129.425 -129.43 -129.435 -129.44 -129.445 -129.45 -129.455 -129.46 -129.465 -129.47 -129.475 -129.48 -129.485 -129.49 -129.495 -129.5 -129.505 -129.51 -129.515 -129.52 -129.525 -129.53 -129.535 -129.54 -129.545 -129.55 -129.555 -129.56 -129.565 -129.57 -129.575 -129.58 -129.585 -129.59 -129.595 -129.6 -129.605 -129.61 -129.615 -129.62 -129.625 -129.63 -129.635 -129.64 -129.645 -129.65 -129.655 -129.66 -129.665 -129.67 -129.675 -129.68 -129.685 -129.69 -129.695 -129.7 -129.705 -129.71 -129.715 -129.72 -129.725 -129.73 -129.735 -129.74 -129.745 -129.75 -129.755 -129.76 -129.765 -129.77 -129.775 -129.78 -129.785 -129.79 -129.795 -129.8 -129.805 -129.81 -129.815 -129.82 -129.825 -129.83 -129.835 -129.84 -129.845 -129.85 -129.855 -129.86 -129.865 -129.87 -129.875 -129.88 -129.885 -129.89 -129.895 -129.9 -129.905 -129.91 -129.915 -129.92 -129.925 -129.93 -129.935 -129.94 -129.945 -129.95 -129.955 -129.96 -129.965 -129.97 -129.975 -129.98 -129.985 -129.99 -129.995 -130 -130.005 -130.01 -130.015 -130.02 -130.025 -130.03 -130.035 -130.04 -130.045 -130.05 -130.055 -130.06 -130.065 -130.07 -130.075 -130.08 -130.085 -130.09 -130.095 -130.1 -130.105 -130.11 -130.115 -130.12 -130.125 -130.13 -130.135 -130.14 -130.145 -130.15 -130.155 -130.16 -130.165 -130.17 -130.175 -130.18 -130.185 -130.19 -130.195 -130.2 -130.205 -130.21 -130.215 -130.22 -130.225 -130.23 -130.235 -130.24 -130.245 -130.25 -130.255 -130.26 -130.265 -130.27 -130.275 -130.28 -130.285 -130.29 -130.295 -130.3 -130.305 -130.31 -130.315 -130.32 -130.325 -130.33 -130.335 -130.34 -130.345 -130.35 -130.355 -130.36 -130.365 -130.37 -130.375 -130.38 -130.385 -130.39 -130.395 -130.4 -130.405 -130.41 -130.415 -130.42 -130.425 -130.43 -130.435 -130.44 -130.445 -130.45 -130.455 -130.46 -130.465 -130.47 -130.475 -130.48 -130.485 -130.49 -130.495 -130.5 -130.505 -130.51 -130.515 -130.52 -130.525 -130.53 -130.535 -130.54 -130.545 -130.55 -130.555 -130.56 -130.565 -130.57 -130.575 -130.58 -130.585 -130.59 -130.595 -130.6 -130.605 -130.61 -130.615 -130.62 -130.625 -130.63 -130.635 -130.64 -130.645 -130.65 -130.655 -130.66 -130.665 -130.67 -130.675 -130.68 -130.685 -130.69 -130.695 -130.7 -130.705 -130.71 -130.715 -130.72 -130.725 -130.73 -130.735 -130.74 -130.745 -130.75 -130.755 -130.76 -130.765 -130.77 -130.775 -130.78 -130.785 -130.79 -130.795 -130.8 -130.805 -130.81 -130.815 -130.82 -130.825 -130.83 -130.835 -130.84 -130.845 -130.85 -130.855 -130.86 -130.865 -130.87 -130.875 -130.88 -130.885 -130.89 -130.895 -130.9 -130.905 -130.91 -130.915 -130.92 -130.925 -130.93 -130.935 -130.94 -130.945 -130.95 -130.955 -130.96 -130.965 -130.97 -130.975 -130.98 -130.985 -130.99 -130.995 -131 -131.005 -131.01 -131.015 -131.02 -131.025 -131.03 -131.035 -131.04 -131.045 -131.05 -131.055 -131.06 -131.065 -131.07 -131.075 -131.08 -131.085 -131.09 -131.095 -131.1 -131.105 -131.11 -131.115 -131.12 -131.125 -131.13 -131.135 -131.14 -131.145 -131.15 -131.155 -131.16 -131.165 -131.17 -131.175 -131.18 -131.185 -131.19 -131.195 -131.2 -131.205 -131.21 -131.215 -131.22 -131.225 -131.23 -131.235 -131.24 -131.245 -131.25 -131.255 -131.26 -131.265 -131.27 -131.275 -131.28 -131.285 -131.29 -131.295 -131.3 -131.305 -131.31 -131.315 -131.32 -131.325 -131.33 -131.335 -131.34 -131.345 -131.35 -131.355 -131.36 -131.365 -131.37 -131.375 -131.38 -131.385 -131.39 -131.395 -131.4 -131.405 -131.41 -131.415 -131.42 -131.425 -131.43 -131.435 -131.44 -131.445 -131.45 -131.455 -131.46 -131.465 -131.47 -131.475 -131.48 -131.485 -131.49 -131.495 -131.5 -131.505 -131.51 -131.515 -131.52 -131.525 -131.53 -131.535 -131.54 -131.545 -131.55 -131.555 -131.56 -131.565 -131.57 -131.575 -131.58 -131.585 -131.59 -131.595 -131.6 -131.605 -131.61 -131.615 -131.62 -131.625 -131.63 -131.635 -131.64 -131.645 -131.65 -131.655 -131.66 -131.665 -131.67 -131.675 -131.68 -131.685 -131.69 -131.695 -131.7 -131.705 -131.71 -131.715 -131.72 -131.725 -131.73 -131.735 -131.74 -131.745 -131.75 -131.755 -131.76 -131.765 -131.77 -131.775 -131.78 -131.785 -131.79 -131.795 -131.8 -131.805 -131.81 -131.815 -131.82 -131.825 -131.83 -131.835 -131.84 -131.845 -131.85 -131.855 -131.86 -131.865 -131.87 -131.875 -131.88 -131.885 -131.89 -131.895 -131.9 -131.905 -131.91 -131.915 -131.92 -131.925 -131.93 -131.935 -131.94 -131.945 -131.95 -131.955 -131.96 -131.965 -131.97 -131.975 -131.98 -131.985 -131.99 -131.995 -132 -132.005 -132.01 -132.015 -132.02 -132.025 -132.03 -132.035 -132.04 -132.045 -132.05 -132.055 -132.06 -132.065 -132.07 -132.075 -132.08 -132.085 -132.09 -132.095 -132.1 -132.105 -132.11 -132.115 -132.12 -132.125 -132.13 -132.135 -132.14 -132.145 -132.15 -132.155 -132.16 -132.165 -132.17 -132.175 -132.18 -132.185 -132.19 -132.195 -132.2 -132.205 -132.21 -132.215 -132.22 -132.225 -132.23 -132.235 -132.24 -132.245 -132.25 -132.255 -132.26 -132.265 -132.27 -132.275 -132.28 -132.285 -132.29 -132.295 -132.3 -132.305 -132.31 -132.315 -132.32 -132.325 -132.33 -132.335 -132.34 -132.345 -132.35 -132.355 -132.36 -132.365 -132.37 -132.375 -132.38 -132.385 -132.39 -132.395 -132.4 -132.405 -132.41 -132.415 -132.42 -132.425 -132.43 -132.435 -132.44 -132.445 -132.45 -132.455 -132.46 -132.465 -132.47 -132.475 -132.48 -132.485 -132.49 -132.495 -132.5 -132.505 -132.51 -132.515 -132.52 -132.525 -132.53 -132.535 -132.54 -132.545 -132.55 -132.555 -132.56 -132.565 -132.57 -132.575 -132.58 -132.585 -132.59 -132.595 -132.6 -132.605 -132.61 -132.615 -132.62 -132.625 -132.63 -132.635 -132.64 -132.645 -132.65 -132.655 -132.66 -132.665 -132.67 -132.675 -132.68 -132.685 -132.69 -132.695 -132.7 -132.705 -132.71 -132.715 -132.72 -132.725 -132.73 -132.735 -132.74 -132.745 -132.75 -132.755 -132.76 -132.765 -132.77 -132.775 -132.78 -132.785 -132.79 -132.795 -132.8 -132.805 -132.81 -132.815 -132.82 -132.825 -132.83 -132.835 -132.84 -132.845 -132.85 -132.855 -132.86 -132.865 -132.87 -132.875 -132.88 -132.885 -132.89 -132.895 -132.9 -132.905 -132.91 -132.915 -132.92 -132.925 -132.93 -132.935 -132.94 -132.945 -132.95 -132.955 -132.96 -132.965 -132.97 -132.975 -132.98 -132.985 -132.99 -132.995 -133 -133.005 -133.01 -133.015 -133.02 -133.025 -133.03 -133.035 -133.04 -133.045 -133.05 -133.055 -133.06 -133.065 -133.07 -133.075 -133.08 -133.085 -133.09 -133.095 -133.1 -133.105 -133.11 -133.115 -133.12 -133.125 -133.13 -133.135 -133.14 -133.145 -133.15 -133.155 -133.16 -133.165 -133.17 -133.175 -133.18 -133.185 -133.19 -133.195 -133.2 -133.205 -133.21 -133.215 -133.22 -133.225 -133.23 -133.235 -133.24 -133.245 -133.25 -133.255 -133.26 -133.265 -133.27 -133.275 -133.28 -133.285 -133.29 -133.295 -133.3 -133.305 -133.31 -133.315 -133.32 -133.325 -133.33 -133.335 -133.34 -133.345 -133.35 -133.355 -133.36 -133.365 -133.37 -133.375 -133.38 -133.385 -133.39 -133.395 -133.4 -133.405 -133.41 -133.415 -133.42 -133.425 -133.43 -133.435 -133.44 -133.445 -133.45 -133.455 -133.46 -133.465 -133.47 -133.475 -133.48 -133.485 -133.49 -133.495 -133.5 -133.505 -133.51 -133.515 -133.52 -133.525 -133.53 -133.535 -133.54 -133.545 -133.55 -133.555 -133.56 -133.565 -133.57 -133.575 -133.58 -133.585 -133.59 -133.595 -133.6 -133.605 -133.61 -133.615 -133.62 -133.625 -133.63 -133.635 -133.64 -133.645 -133.65 -133.655 -133.66 -133.665 -133.67 -133.675 -133.68 -133.685 -133.69 -133.695 -133.7 -133.705 -133.71 -133.715 -133.72 -133.725 -133.73 -133.735 -133.74 -133.745 -133.75 -133.755 -133.76 -133.765 -133.77 -133.775 -133.78 -133.785 -133.79 -133.795 -133.8 -133.805 -133.81 -133.815 -133.82 -133.825 -133.83 -133.835 -133.84 -133.845 -133.85 -133.855 -133.86 -133.865 -133.87 -133.875 -133.88 -133.885 -133.89 -133.895 -133.9 -133.905 -133.91 -133.915 -133.92 -133.925 -133.93 -133.935 -133.94 -133.945 -133.95 -133.955 -133.96 -133.965 -133.97 -133.975 -133.98 -133.985 -133.99 -133.995 -134 -134.005 -134.01 -134.015 -134.02 -134.025 -134.03 -134.035 -134.04 -134.045 -134.05 -134.055 -134.06 -134.065 -134.07 -134.075 -134.08 -134.085 -134.09 -134.095 -134.1 -134.105 -134.11 -134.115 -134.12 -134.125 -134.13 -134.135 -134.14 -134.145 -134.15 -134.155 -134.16 -134.165 -134.17 -134.175 -134.18 -134.185 -134.19 -134.195 -134.2 -134.205 -134.21 -134.215 -134.22 -134.225 -134.23 -134.235 -134.24 -134.245 -134.25 -134.255 -134.26 -134.265 -134.27 -134.275 -134.28 -134.285 -134.29 -134.295 -134.3 -134.305 -134.31 -134.315 -134.32 -134.325 -134.33 -134.335 -134.34 -134.345 -134.35 -134.355 -134.36 -134.365 -134.37 -134.375 -134.38 -134.385 -134.39 -134.395 -134.4 -134.405 -134.41 -134.415 -134.42 -134.425 -134.43 -134.435 -134.44 -134.445 -134.45 -134.455 -134.46 -134.465 -134.47 -134.475 -134.48 -134.485 -134.49 -134.495 -134.5 -134.505 -134.51 -134.515 -134.52 -134.525 -134.53 -134.535 -134.54 -134.545 -134.55 -134.555 -134.56 -134.565 -134.57 -134.575 -134.58 -134.585 -134.59 -134.595 -134.6 -134.605 -134.61 -134.615 -134.62 -134.625 -134.63 -134.635 -134.64 -134.645 -134.65 -134.655 -134.66 -134.665 -134.67 -134.675 -134.68 -134.685 -134.69 -134.695 -134.7 -134.705 -134.71 -134.715 -134.72 -134.725 -134.73 -134.735 -134.74 -134.745 -134.75 -134.755 -134.76 -134.765 -134.77 -134.775 -134.78 -134.785 -134.79 -134.795 -134.8 -134.805 -134.81 -134.815 -134.82 -134.825 -134.83 -134.835 -134.84 -134.845 -134.85 -134.855 -134.86 -134.865 -134.87 -134.875 -134.88 -134.885 -134.89 -134.895 -134.9 -134.905 -134.91 -134.915 -134.92 -134.925 -134.93 -134.935 -134.94 -134.945 -134.95 -134.955 -134.96 -134.965 -134.97 -134.975 -134.98 -134.985 -134.99 -134.995 -135 -135.005 -135.01 -135.015 -135.02 -135.025 -135.03 -135.035 -135.04 -135.045 -135.05 -135.055 -135.06 -135.065 -135.07 -135.075 -135.08 -135.085 -135.09 -135.095 -135.1 -135.105 -135.11 -135.115 -135.12 -135.125 -135.13 -135.135 -135.14 -135.145 -135.15 -135.155 -135.16 -135.165 -135.17 -135.175 -135.18 -135.185 -135.19 -135.195 -135.2 -135.205 -135.21 -135.215 -135.22 -135.225 -135.23 -135.235 -135.24 -135.245 -135.25 -135.255 -135.26 -135.265 -135.27 -135.275 -135.28 -135.285 -135.29 -135.295 -135.3 -135.305 -135.31 -135.315 -135.32 -135.325 -135.33 -135.335 -135.34 -135.345 -135.35 -135.355 -135.36 -135.365 -135.37 -135.375 -135.38 -135.385 -135.39 -135.395 -135.4 -135.405 -135.41 -135.415 -135.42 -135.425 -135.43 -135.435 -135.44 -135.445 -135.45 -135.455 -135.46 -135.465 -135.47 -135.475 -135.48 -135.485 -135.49 -135.495 -135.5 -135.505 -135.51 -135.515 -135.52 -135.525 -135.53 -135.535 -135.54 -135.545 -135.55 -135.555 -135.56 -135.565 -135.57 -135.575 -135.58 -135.585 -135.59 -135.595 -135.6 -135.605 -135.61 -135.615 -135.62 -135.625 -135.63 -135.635 -135.64 -135.645 -135.65 -135.655 -135.66 -135.665 -135.67 -135.675 -135.68 -135.685 -135.69 -135.695 -135.7 -135.705 -135.71 -135.715 -135.72 -135.725 -135.73 -135.735 -135.74 -135.745 -135.75 -135.755 -135.76 -135.765 -135.77 -135.775 -135.78 -135.785 -135.79 -135.795 -135.8 -135.805 -135.81 -135.815 -135.82 -135.825 -135.83 -135.835 -135.84 -135.845 -135.85 -135.855 -135.86 -135.865 -135.87 -135.875 -135.88 -135.885 -135.89 -135.895 -135.9 -135.905 -135.91 -135.915 -135.92 -135.925 -135.93 -135.935 -135.94 -135.945 -135.95 -135.955 -135.96 -135.965 -135.97 -135.975 -135.98 -135.985 -135.99 -135.995 -136 -136.005 -136.01 -136.015 -136.02 -136.025 -136.03 -136.035 -136.04 -136.045 -136.05 -136.055 -136.06 -136.065 -136.07 -136.075 -136.08 -136.085 -136.09 -136.095 -136.1 -136.105 -136.11 -136.115 -136.12 -136.125 -136.13 -136.135 -136.14 -136.145 -136.15 -136.155 -136.16 -136.165 -136.17 -136.175 -136.18 -136.185 -136.19 -136.195 -136.2 -136.205 -136.21 -136.215 -136.22 -136.225 -136.23 -136.235 -136.24 -136.245 -136.25 -136.255 -136.26 -136.265 -136.27 -136.275 -136.28 -136.285 -136.29 -136.295 -136.3 -136.305 -136.31 -136.315 -136.32 -136.325 -136.33 -136.335 -136.34 -136.345 -136.35 -136.355 -136.36 -136.365 -136.37 -136.375 -136.38 -136.385 -136.39 -136.395 -136.4 -136.405 -136.41 -136.415 -136.42 -136.425 -136.43 -136.435 -136.44 -136.445 -136.45 -136.455 -136.46 -136.465 -136.47 -136.475 -136.48 -136.485 -136.49 -136.495 -136.5 -136.505 -136.51 -136.515 -136.52 -136.525 -136.53 -136.535 -136.54 -136.545 -136.55 -136.555 -136.56 -136.565 -136.57 -136.575 -136.58 -136.585 -136.59 -136.595 -136.6 -136.605 -136.61 -136.615 -136.62 -136.625 -136.63 -136.635 -136.64 -136.645 -136.65 -136.655 -136.66 -136.665 -136.67 -136.675 -136.68 -136.685 -136.69 -136.695 -136.7 -136.705 -136.71 -136.715 -136.72 -136.725 -136.73 -136.735 -136.74 -136.745 -136.75 -136.755 -136.76 -136.765 -136.77 -136.775 -136.78 -136.785 -136.79 -136.795 -136.8 -136.805 -136.81 -136.815 -136.82 -136.825 -136.83 -136.835 -136.84 -136.845 -136.85 -136.855 -136.86 -136.865 -136.87 -136.875 -136.88 -136.885 -136.89 -136.895 -136.9 -136.905 -136.91 -136.915 -136.92 -136.925 -136.93 -136.935 -136.94 -136.945 -136.95 -136.955 -136.96 -136.965 -136.97 -136.975 -136.98 -136.985 -136.99 -136.995 -137 -137.005 -137.01 -137.015 -137.02 -137.025 -137.03 -137.035 -137.04 -137.045 -137.05 -137.055 -137.06 -137.065 -137.07 -137.075 -137.08 -137.085 -137.09 -137.095 -137.1 -137.105 -137.11 -137.115 -137.12 -137.125 -137.13 -137.135 -137.14 -137.145 -137.15 -137.155 -137.16 -137.165 -137.17 -137.175 -137.18 -137.185 -137.19 -137.195 -137.2 -137.205 -137.21 -137.215 -137.22 -137.225 -137.23 -137.235 -137.24 -137.245 -137.25 -137.255 -137.26 -137.265 -137.27 -137.275 -137.28 -137.285 -137.29 -137.295 -137.3 -137.305 -137.31 -137.315 -137.32 -137.325 -137.33 -137.335 -137.34 -137.345 -137.35 -137.355 -137.36 -137.365 -137.37 -137.375 -137.38 -137.385 -137.39 -137.395 -137.4 -137.405 -137.41 -137.415 -137.42 -137.425 -137.43 -137.435 -137.44 -137.445 -137.45 -137.455 -137.46 -137.465 -137.47 -137.475 -137.48 -137.485 -137.49 -137.495 -137.5 -137.505 -137.51 -137.515 -137.52 -137.525 -137.53 -137.535 -137.54 -137.545 -137.55 -137.555 -137.56 -137.565 -137.57 -137.575 -137.58 -137.585 -137.59 -137.595 -137.6 -137.605 -137.61 -137.615 -137.62 -137.625 -137.63 -137.635 -137.64 -137.645 -137.65 -137.655 -137.66 -137.665 -137.67 -137.675 -137.68 -137.685 -137.69 -137.695 -137.7 -137.705 -137.71 -137.715 -137.72 -137.725 -137.73 -137.735 -137.74 -137.745 -137.75 -137.755 -137.76 -137.765 -137.77 -137.775 -137.78 -137.785 -137.79 -137.795 -137.8 -137.805 -137.81 -137.815 -137.82 -137.825 -137.83 -137.835 -137.84 -137.845 -137.85 -137.855 -137.86 -137.865 -137.87 -137.875 -137.88 -137.885 -137.89 -137.895 -137.9 -137.905 -137.91 -137.915 -137.92 -137.925 -137.93 -137.935 -137.94 -137.945 -137.95 -137.955 -137.96 -137.965 -137.97 -137.975 -137.98 -137.985 -137.99 -137.995 -138 -138.005 -138.01 -138.015 -138.02 -138.025 -138.03 -138.035 -138.04 -138.045 -138.05 -138.055 -138.06 -138.065 -138.07 -138.075 -138.08 -138.085 -138.09 -138.095 -138.1 -138.105 -138.11 -138.115 -138.12 -138.125 -138.13 -138.135 -138.14 -138.145 -138.15 -138.155 -138.16 -138.165 -138.17 -138.175 -138.18 -138.185 -138.19 -138.195 -138.2 -138.205 -138.21 -138.215 -138.22 -138.225 -138.23 -138.235 -138.24 -138.245 -138.25 -138.255 -138.26 -138.265 -138.27 -138.275 -138.28 -138.285 -138.29 -138.295 -138.3 -138.305 -138.31 -138.315 -138.32 -138.325 -138.33 -138.335 -138.34 -138.345 -138.35 -138.355 -138.36 -138.365 -138.37 -138.375 -138.38 -138.385 -138.39 -138.395 -138.4 -138.405 -138.41 -138.415 -138.42 -138.425 -138.43 -138.435 -138.44 -138.445 -138.45 -138.455 -138.46 -138.465 -138.47 -138.475 -138.48 -138.485 -138.49 -138.495 -138.5 -138.505 -138.51 -138.515 -138.52 -138.525 -138.53 -138.535 -138.54 -138.545 -138.55 -138.555 -138.56 -138.565 -138.57 -138.575 -138.58 -138.585 -138.59 -138.595 -138.6 -138.605 -138.61 -138.615 -138.62 -138.625 -138.63 -138.635 -138.64 -138.645 -138.65 -138.655 -138.66 -138.665 -138.67 -138.675 -138.68 -138.685 -138.69 -138.695 -138.7 -138.705 -138.71 -138.715 -138.72 -138.725 -138.73 -138.735 -138.74 -138.745 -138.75 -138.755 -138.76 -138.765 -138.77 -138.775 -138.78 -138.785 -138.79 -138.795 -138.8 -138.805 -138.81 -138.815 -138.82 -138.825 -138.83 -138.835 -138.84 -138.845 -138.85 -138.855 -138.86 -138.865 -138.87 -138.875 -138.88 -138.885 -138.89 -138.895 -138.9 -138.905 -138.91 -138.915 -138.92 -138.925 -138.93 -138.935 -138.94 -138.945 -138.95 -138.955 -138.96 -138.965 -138.97 -138.975 -138.98 -138.985 -138.99 -138.995 -139 -139.005 -139.01 -139.015 -139.02 -139.025 -139.03 -139.035 -139.04 -139.045 -139.05 -139.055 -139.06 -139.065 -139.07 -139.075 -139.08 -139.085 -139.09 -139.095 -139.1 -139.105 -139.11 -139.115 -139.12 -139.125 -139.13 -139.135 -139.14 -139.145 -139.15 -139.155 -139.16 -139.165 -139.17 -139.175 -139.18 -139.185 -139.19 -139.195 -139.2 -139.205 -139.21 -139.215 -139.22 -139.225 -139.23 -139.235 -139.24 -139.245 -139.25 -139.255 -139.26 -139.265 -139.27 -139.275 -139.28 -139.285 -139.29 -139.295 -139.3 -139.305 -139.31 -139.315 -139.32 -139.325 -139.33 -139.335 -139.34 -139.345 -139.35 -139.355 -139.36 -139.365 -139.37 -139.375 -139.38 -139.385 -139.39 -139.395 -139.4 -139.405 -139.41 -139.415 -139.42 -139.425 -139.43 -139.435 -139.44 -139.445 -139.45 -139.455 -139.46 -139.465 -139.47 -139.475 -139.48 -139.485 -139.49 -139.495 -139.5 -139.505 -139.51 -139.515 -139.52 -139.525 -139.53 -139.535 -139.54 -139.545 -139.55 -139.555 -139.56 -139.565 -139.57 -139.575 -139.58 -139.585 -139.59 -139.595 -139.6 -139.605 -139.61 -139.615 -139.62 -139.625 -139.63 -139.635 -139.64 -139.645 -139.65 -139.655 -139.66 -139.665 -139.67 -139.675 -139.68 -139.685 -139.69 -139.695 -139.7 -139.705 -139.71 -139.715 -139.72 -139.725 -139.73 -139.735 -139.74 -139.745 -139.75 -139.755 -139.76 -139.765 -139.77 -139.775 -139.78 -139.785 -139.79 -139.795 -139.8 -139.805 -139.81 -139.815 -139.82 -139.825 -139.83 -139.835 -139.84 -139.845 -139.85 -139.855 -139.86 -139.865 -139.87 -139.875 -139.88 -139.885 -139.89 -139.895 -139.9 -139.905 -139.91 -139.915 -139.92 -139.925 -139.93 -139.935 -139.94 -139.945 -139.95 -139.955 -139.96 -139.965 -139.97 -139.975 -139.98 -139.985 -139.99 -139.995 -140 -140.005 -140.01 -140.015 -140.02 -140.025 -140.03 -140.035 -140.04 -140.045 -140.05 -140.055 -140.06 -140.065 -140.07 -140.075 -140.08 -140.085 -140.09 -140.095 -140.1 -140.105 -140.11 -140.115 -140.12 -140.125 -140.13 -140.135 -140.14 -140.145 -140.15 -140.155 -140.16 -140.165 -140.17 -140.175 -140.18 -140.185 -140.19 -140.195 -140.2 -140.205 -140.21 -140.215 -140.22 -140.225 -140.23 -140.235 -140.24 -140.245 -140.25 -140.255 -140.26 -140.265 -140.27 -140.275 -140.28 -140.285 -140.29 -140.295 -140.3 -140.305 -140.31 -140.315 -140.32 -140.325 -140.33 -140.335 -140.34 -140.345 -140.35 -140.355 -140.36 -140.365 -140.37 -140.375 -140.38 -140.385 -140.39 -140.395 -140.4 -140.405 -140.41 -140.415 -140.42 -140.425 -140.43 -140.435 -140.44 -140.445 -140.45 -140.455 -140.46 -140.465 -140.47 -140.475 -140.48 -140.485 -140.49 -140.495 -140.5 -140.505 -140.51 -140.515 -140.52 -140.525 -140.53 -140.535 -140.54 -140.545 -140.55 -140.555 -140.56 -140.565 -140.57 -140.575 -140.58 -140.585 -140.59 -140.595 -140.6 -140.605 -140.61 -140.615 -140.62 -140.625 -140.63 -140.635 -140.64 -140.645 -140.65 -140.655 -140.66 -140.665 -140.67 -140.675 -140.68 -140.685 -140.69 -140.695 -140.7 -140.705 -140.71 -140.715 -140.72 -140.725 -140.73 -140.735 -140.74 -140.745 -140.75 -140.755 -140.76 -140.765 -140.77 -140.775 -140.78 -140.785 -140.79 -140.795 -140.8 -140.805 -140.81 -140.815 -140.82 -140.825 -140.83 -140.835 -140.84 -140.845 -140.85 -140.855 -140.86 -140.865 -140.87 -140.875 -140.88 -140.885 -140.89 -140.895 -140.9 -140.905 -140.91 -140.915 -140.92 -140.925 -140.93 -140.935 -140.94 -140.945 -140.95 -140.955 -140.96 -140.965 -140.97 -140.975 -140.98 -140.985 -140.99 -140.995 -141 -141.005 -141.01 -141.015 -141.02 -141.025 -141.03 -141.035 -141.04 -141.045 -141.05 -141.055 -141.06 -141.065 -141.07 -141.075 -141.08 -141.085 -141.09 -141.095 -141.1 -141.105 -141.11 -141.115 -141.12 -141.125 -141.13 -141.135 -141.14 -141.145 -141.15 -141.155 -141.16 -141.165 -141.17 -141.175 -141.18 -141.185 -141.19 -141.195 -141.2 -141.205 -141.21 -141.215 -141.22 -141.225 -141.23 -141.235 -141.24 -141.245 -141.25 -141.255 -141.26 -141.265 -141.27 -141.275 -141.28 -141.285 -141.29 -141.295 -141.3 -141.305 -141.31 -141.315 -141.32 -141.325 -141.33 -141.335 -141.34 -141.345 -141.35 -141.355 -141.36 -141.365 -141.37 -141.375 -141.38 -141.385 -141.39 -141.395 -141.4 -141.405 -141.41 -141.415 -141.42 -141.425 -141.43 -141.435 -141.44 -141.445 -141.45 -141.455 -141.46 -141.465 -141.47 -141.475 -141.48 -141.485 -141.49 -141.495 -141.5 -141.505 -141.51 -141.515 -141.52 -141.525 -141.53 -141.535 -141.54 -141.545 -141.55 -141.555 -141.56 -141.565 -141.57 -141.575 -141.58 -141.585 -141.59 -141.595 -141.6 -141.605 -141.61 -141.615 -141.62 -141.625 -141.63 -141.635 -141.64 -141.645 -141.65 -141.655 -141.66 -141.665 -141.67 -141.675 -141.68 -141.685 -141.69 -141.695 -141.7 -141.705 -141.71 -141.715 -141.72 -141.725 -141.73 -141.735 -141.74 -141.745 -141.75 -141.755 -141.76 -141.765 -141.77 -141.775 -141.78 -141.785 -141.79 -141.795 -141.8 -141.805 -141.81 -141.815 -141.82 -141.825 -141.83 -141.835 -141.84 -141.845 -141.85 -141.855 -141.86 -141.865 -141.87 -141.875 -141.88 -141.885 -141.89 -141.895 -141.9 -141.905 -141.91 -141.915 -141.92 -141.925 -141.93 -141.935 -141.94 -141.945 -141.95 -141.955 -141.96 -141.965 -141.97 -141.975 -141.98 -141.985 -141.99 -141.995 -142 -142.005 -142.01 -142.015 -142.02 -142.025 -142.03 -142.035 -142.04 -142.045 -142.05 -142.055 -142.06 -142.065 -142.07 -142.075 -142.08 -142.085 -142.09 -142.095 -142.1 -142.105 -142.11 -142.115 -142.12 -142.125 -142.13 -142.135 -142.14 -142.145 -142.15 -142.155 -142.16 -142.165 -142.17 -142.175 -142.18 -142.185 -142.19 -142.195 -142.2 -142.205 -142.21 -142.215 -142.22 -142.225 -142.23 -142.235 -142.24 -142.245 -142.25 -142.255 -142.26 -142.265 -142.27 -142.275 -142.28 -142.285 -142.29 -142.295 -142.3 -142.305 -142.31 -142.315 -142.32 -142.325 -142.33 -142.335 -142.34 -142.345 -142.35 -142.355 -142.36 -142.365 -142.37 -142.375 -142.38 -142.385 -142.39 -142.395 -142.4 -142.405 -142.41 -142.415 -142.42 -142.425 -142.43 -142.435 -142.44 -142.445 -142.45 -142.455 -142.46 -142.465 -142.47 -142.475 -142.48 -142.485 -142.49 -142.495 -142.5 -142.505 -142.51 -142.515 -142.52 -142.525 -142.53 -142.535 -142.54 -142.545 -142.55 -142.555 -142.56 -142.565 -142.57 -142.575 -142.58 -142.585 -142.59 -142.595 -142.6 -142.605 -142.61 -142.615 -142.62 -142.625 -142.63 -142.635 -142.64 -142.645 -142.65 -142.655 -142.66 -142.665 -142.67 -142.675 -142.68 -142.685 -142.69 -142.695 -142.7 -142.705 -142.71 -142.715 -142.72 -142.725 -142.73 -142.735 -142.74 -142.745 -142.75 -142.755 -142.76 -142.765 -142.77 -142.775 -142.78 -142.785 -142.79 -142.795 -142.8 -142.805 -142.81 -142.815 -142.82 -142.825 -142.83 -142.835 -142.84 -142.845 -142.85 -142.855 -142.86 -142.865 -142.87 -142.875 -142.88 -142.885 -142.89 -142.895 -142.9 -142.905 -142.91 -142.915 -142.92 -142.925 -142.93 -142.935 -142.94 -142.945 -142.95 -142.955 -142.96 -142.965 -142.97 -142.975 -142.98 -142.985 -142.99 -142.995 -143 -143.005 -143.01 -143.015 -143.02 -143.025 -143.03 -143.035 -143.04 -143.045 -143.05 -143.055 -143.06 -143.065 -143.07 -143.075 -143.08 -143.085 -143.09 -143.095 -143.1 -143.105 -143.11 -143.115 -143.12 -143.125 -143.13 -143.135 -143.14 -143.145 -143.15 -143.155 -143.16 -143.165 -143.17 -143.175 -143.18 -143.185 -143.19 -143.195 -143.2 -143.205 -143.21 -143.215 -143.22 -143.225 -143.23 -143.235 -143.24 -143.245 -143.25 -143.255 -143.26 -143.265 -143.27 -143.275 -143.28 -143.285 -143.29 -143.295 -143.3 -143.305 -143.31 -143.315 -143.32 -143.325 -143.33 -143.335 -143.34 -143.345 -143.35 -143.355 -143.36 -143.365 -143.37 -143.375 -143.38 -143.385 -143.39 -143.395 -143.4 -143.405 -143.41 -143.415 -143.42 -143.425 -143.43 -143.435 -143.44 -143.445 -143.45 -143.455 -143.46 -143.465 -143.47 -143.475 -143.48 -143.485 -143.49 -143.495 -143.5 -143.505 -143.51 -143.515 -143.52 -143.525 -143.53 -143.535 -143.54 -143.545 -143.55 -143.555 -143.56 -143.565 -143.57 -143.575 -143.58 -143.585 -143.59 -143.595 -143.6 -143.605 -143.61 -143.615 -143.62 -143.625 -143.63 -143.635 -143.64 -143.645 -143.65 -143.655 -143.66 -143.665 -143.67 -143.675 -143.68 -143.685 -143.69 -143.695 -143.7 -143.705 -143.71 -143.715 -143.72 -143.725 -143.73 -143.735 -143.74 -143.745 -143.75 -143.755 -143.76 -143.765 -143.77 -143.775 -143.78 -143.785 -143.79 -143.795 -143.8 -143.805 -143.81 -143.815 -143.82 -143.825 -143.83 -143.835 -143.84 -143.845 -143.85 -143.855 -143.86 -143.865 -143.87 -143.875 -143.88 -143.885 -143.89 -143.895 -143.9 -143.905 -143.91 -143.915 -143.92 -143.925 -143.93 -143.935 -143.94 -143.945 -143.95 -143.955 -143.96 -143.965 -143.97 -143.975 -143.98 -143.985 -143.99 -143.995 -144 -144.005 -144.01 -144.015 -144.02 -144.025 -144.03 -144.035 -144.04 -144.045 -144.05 -144.055 -144.06 -144.065 -144.07 -144.075 -144.08 -144.085 -144.09 -144.095 -144.1 -144.105 -144.11 -144.115 -144.12 -144.125 -144.13 -144.135 -144.14 -144.145 -144.15 -144.155 -144.16 -144.165 -144.17 -144.175 -144.18 -144.185 -144.19 -144.195 -144.2 -144.205 -144.21 -144.215 -144.22 -144.225 -144.23 -144.235 -144.24 -144.245 -144.25 -144.255 -144.26 -144.265 -144.27 -144.275 -144.28 -144.285 -144.29 -144.295 -144.3 -144.305 -144.31 -144.315 -144.32 -144.325 -144.33 -144.335 -144.34 -144.345 -144.35 -144.355 -144.36 -144.365 -144.37 -144.375 -144.38 -144.385 -144.39 -144.395 -144.4 -144.405 -144.41 -144.415 -144.42 -144.425 -144.43 -144.435 -144.44 -144.445 -144.45 -144.455 -144.46 -144.465 -144.47 -144.475 -144.48 -144.485 -144.49 -144.495 -144.5 -144.505 -144.51 -144.515 -144.52 -144.525 -144.53 -144.535 -144.54 -144.545 -144.55 -144.555 -144.56 -144.565 -144.57 -144.575 -144.58 -144.585 -144.59 -144.595 -144.6 -144.605 -144.61 -144.615 -144.62 -144.625 -144.63 -144.635 -144.64 -144.645 -144.65 -144.655 -144.66 -144.665 -144.67 -144.675 -144.68 -144.685 -144.69 -144.695 -144.7 -144.705 -144.71 -144.715 -144.72 -144.725 -144.73 -144.735 -144.74 -144.745 -144.75 -144.755 -144.76 -144.765 -144.77 -144.775 -144.78 -144.785 -144.79 -144.795 -144.8 -144.805 -144.81 -144.815 -144.82 -144.825 -144.83 -144.835 -144.84 -144.845 -144.85 -144.855 -144.86 -144.865 -144.87 -144.875 -144.88 -144.885 -144.89 -144.895 -144.9 -144.905 -144.91 -144.915 -144.92 -144.925 -144.93 -144.935 -144.94 -144.945 -144.95 -144.955 -144.96 -144.965 -144.97 -144.975 -144.98 -144.985 -144.99 -144.995 -145 -145.005 -145.01 -145.015 -145.02 -145.025 -145.03 -145.035 -145.04 -145.045 -145.05 -145.055 -145.06 -145.065 -145.07 -145.075 -145.08 -145.085 -145.09 -145.095 -145.1 -145.105 -145.11 -145.115 -145.12 -145.125 -145.13 -145.135 -145.14 -145.145 -145.15 -145.155 -145.16 -145.165 -145.17 -145.175 -145.18 -145.185 -145.19 -145.195 -145.2 -145.205 -145.21 -145.215 -145.22 -145.225 -145.23 -145.235 -145.24 -145.245 -145.25 -145.255 -145.26 -145.265 -145.27 -145.275 -145.28 -145.285 -145.29 -145.295 -145.3 -145.305 -145.31 -145.315 -145.32 -145.325 -145.33 -145.335 -145.34 -145.345 -145.35 -145.355 -145.36 -145.365 -145.37 -145.375 -145.38 -145.385 -145.39 -145.395 -145.4 -145.405 -145.41 -145.415 -145.42 -145.425 -145.43 -145.435 -145.44 -145.445 -145.45 -145.455 -145.46 -145.465 -145.47 -145.475 -145.48 -145.485 -145.49 -145.495 -145.5 -145.505 -145.51 -145.515 -145.52 -145.525 -145.53 -145.535 -145.54 -145.545 -145.55 -145.555 -145.56 -145.565 -145.57 -145.575 -145.58 -145.585 -145.59 -145.595 -145.6 -145.605 -145.61 -145.615 -145.62 -145.625 -145.63 -145.635 -145.64 -145.645 -145.65 -145.655 -145.66 -145.665 -145.67 -145.675 -145.68 -145.685 -145.69 -145.695 -145.7 -145.705 -145.71 -145.715 -145.72 -145.725 -145.73 -145.735 -145.74 -145.745 -145.75 -145.755 -145.76 -145.765 -145.77 -145.775 -145.78 -145.785 -145.79 -145.795 -145.8 -145.805 -145.81 -145.815 -145.82 -145.825 -145.83 -145.835 -145.84 -145.845 -145.85 -145.855 -145.86 -145.865 -145.87 -145.875 -145.88 -145.885 -145.89 -145.895 -145.9 -145.905 -145.91 -145.915 -145.92 -145.925 -145.93 -145.935 -145.94 -145.945 -145.95 -145.955 -145.96 -145.965 -145.97 -145.975 -145.98 -145.985 -145.99 -145.995 -146 -146.005 -146.01 -146.015 -146.02 -146.025 -146.03 -146.035 -146.04 -146.045 -146.05 -146.055 -146.06 -146.065 -146.07 -146.075 -146.08 -146.085 -146.09 -146.095 -146.1 -146.105 -146.11 -146.115 -146.12 -146.125 -146.13 -146.135 -146.14 -146.145 -146.15 -146.155 -146.16 -146.165 -146.17 -146.175 -146.18 -146.185 -146.19 -146.195 -146.2 -146.205 -146.21 -146.215 -146.22 -146.225 -146.23 -146.235 -146.24 -146.245 -146.25 -146.255 -146.26 -146.265 -146.27 -146.275 -146.28 -146.285 -146.29 -146.295 -146.3 -146.305 -146.31 -146.315 -146.32 -146.325 -146.33 -146.335 -146.34 -146.345 -146.35 -146.355 -146.36 -146.365 -146.37 -146.375 -146.38 -146.385 -146.39 -146.395 -146.4 -146.405 -146.41 -146.415 -146.42 -146.425 -146.43 -146.435 -146.44 -146.445 -146.45 -146.455 -146.46 -146.465 -146.47 -146.475 -146.48 -146.485 -146.49 -146.495 -146.5 -146.505 -146.51 -146.515 -146.52 -146.525 -146.53 -146.535 -146.54 -146.545 -146.55 -146.555 -146.56 -146.565 -146.57 -146.575 -146.58 -146.585 -146.59 -146.595 -146.6 -146.605 -146.61 -146.615 -146.62 -146.625 -146.63 -146.635 -146.64 -146.645 -146.65 -146.655 -146.66 -146.665 -146.67 -146.675 -146.68 -146.685 -146.69 -146.695 -146.7 -146.705 -146.71 -146.715 -146.72 -146.725 -146.73 -146.735 -146.74 -146.745 -146.75 -146.755 -146.76 -146.765 -146.77 -146.775 -146.78 -146.785 -146.79 -146.795 -146.8 -146.805 -146.81 -146.815 -146.82 -146.825 -146.83 -146.835 -146.84 -146.845 -146.85 -146.855 -146.86 -146.865 -146.87 -146.875 -146.88 -146.885 -146.89 -146.895 -146.9 -146.905 -146.91 -146.915 -146.92 -146.925 -146.93 -146.935 -146.94 -146.945 -146.95 -146.955 -146.96 -146.965 -146.97 -146.975 -146.98 -146.985 -146.99 -146.995 -147 -147.005 -147.01 -147.015 -147.02 -147.025 -147.03 -147.035 -147.04 -147.045 -147.05 -147.055 -147.06 -147.065 -147.07 -147.075 -147.08 -147.085 -147.09 -147.095 -147.1 -147.105 -147.11 -147.115 -147.12 -147.125 -147.13 -147.135 -147.14 -147.145 -147.15 -147.155 -147.16 -147.165 -147.17 -147.175 -147.18 -147.185 -147.19 -147.195 -147.2 -147.205 -147.21 -147.215 -147.22 -147.225 -147.23 -147.235 -147.24 -147.245 -147.25 -147.255 -147.26 -147.265 -147.27 -147.275 -147.28 -147.285 -147.29 -147.295 -147.3 -147.305 -147.31 -147.315 -147.32 -147.325 -147.33 -147.335 -147.34 -147.345 -147.35 -147.355 -147.36 -147.365 -147.37 -147.375 -147.38 -147.385 -147.39 -147.395 -147.4 -147.405 -147.41 -147.415 -147.42 -147.425 -147.43 -147.435 -147.44 -147.445 -147.45 -147.455 -147.46 -147.465 -147.47 -147.475 -147.48 -147.485 -147.49 -147.495 -147.5 -147.505 -147.51 -147.515 -147.52 -147.525 -147.53 -147.535 -147.54 -147.545 -147.55 -147.555 -147.56 -147.565 -147.57 -147.575 -147.58 -147.585 -147.59 -147.595 -147.6 -147.605 -147.61 -147.615 -147.62 -147.625 -147.63 -147.635 -147.64 -147.645 -147.65 -147.655 -147.66 -147.665 -147.67 -147.675 -147.68 -147.685 -147.69 -147.695 -147.7 -147.705 -147.71 -147.715 -147.72 -147.725 -147.73 -147.735 -147.74 -147.745 -147.75 -147.755 -147.76 -147.765 -147.77 -147.775 -147.78 -147.785 -147.79 -147.795 -147.8 -147.805 -147.81 -147.815 -147.82 -147.825 -147.83 -147.835 -147.84 -147.845 -147.85 -147.855 -147.86 -147.865 -147.87 -147.875 -147.88 -147.885 -147.89 -147.895 -147.9 -147.905 -147.91 -147.915 -147.92 -147.925 -147.93 -147.935 -147.94 -147.945 -147.95 -147.955 -147.96 -147.965 -147.97 -147.975 -147.98 -147.985 -147.99 -147.995 -148 -148.005 -148.01 -148.015 -148.02 -148.025 -148.03 -148.035 -148.04 -148.045 -148.05 -148.055 -148.06 -148.065 -148.07 -148.075 -148.08 -148.085 -148.09 -148.095 -148.1 -148.105 -148.11 -148.115 -148.12 -148.125 -148.13 -148.135 -148.14 -148.145 -148.15 -148.155 -148.16 -148.165 -148.17 -148.175 -148.18 -148.185 -148.19 -148.195 -148.2 -148.205 -148.21 -148.215 -148.22 -148.225 -148.23 -148.235 -148.24 -148.245 -148.25 -148.255 -148.26 -148.265 -148.27 -148.275 -148.28 -148.285 -148.29 -148.295 -148.3 -148.305 -148.31 -148.315 -148.32 -148.325 -148.33 -148.335 -148.34 -148.345 -148.35 -148.355 -148.36 -148.365 -148.37 -148.375 -148.38 -148.385 -148.39 -148.395 -148.4 -148.405 -148.41 -148.415 -148.42 -148.425 -148.43 -148.435 -148.44 -148.445 -148.45 -148.455 -148.46 -148.465 -148.47 -148.475 -148.48 -148.485 -148.49 -148.495 -148.5 -148.505 -148.51 -148.515 -148.52 -148.525 -148.53 -148.535 -148.54 -148.545 -148.55 -148.555 -148.56 -148.565 -148.57 -148.575 -148.58 -148.585 -148.59 -148.595 -148.6 -148.605 -148.61 -148.615 -148.62 -148.625 -148.63 -148.635 -148.64 -148.645 -148.65 -148.655 -148.66 -148.665 -148.67 -148.675 -148.68 -148.685 -148.69 -148.695 -148.7 -148.705 -148.71 -148.715 -148.72 -148.725 -148.73 -148.735 -148.74 -148.745 -148.75 -148.755 -148.76 -148.765 -148.77 -148.775 -148.78 -148.785 -148.79 -148.795 -148.8 -148.805 -148.81 -148.815 -148.82 -148.825 -148.83 -148.835 -148.84 -148.845 -148.85 -148.855 -148.86 -148.865 -148.87 -148.875 -148.88 -148.885 -148.89 -148.895 -148.9 -148.905 -148.91 -148.915 -148.92 -148.925 -148.93 -148.935 -148.94 -148.945 -148.95 -148.955 -148.96 -148.965 -148.97 -148.975 -148.98 -148.985 -148.99 -148.995 -149 -149.005 -149.01 -149.015 -149.02 -149.025 -149.03 -149.035 -149.04 -149.045 -149.05 -149.055 -149.06 -149.065 -149.07 -149.075 -149.08 -149.085 -149.09 -149.095 -149.1 -149.105 -149.11 -149.115 -149.12 -149.125 -149.13 -149.135 -149.14 -149.145 -149.15 -149.155 -149.16 -149.165 -149.17 -149.175 -149.18 -149.185 -149.19 -149.195 -149.2 -149.205 -149.21 -149.215 -149.22 -149.225 -149.23 -149.235 -149.24 -149.245 -149.25 -149.255 -149.26 -149.265 -149.27 -149.275 -149.28 -149.285 -149.29 -149.295 -149.3 -149.305 -149.31 -149.315 -149.32 -149.325 -149.33 -149.335 -149.34 -149.345 -149.35 -149.355 -149.36 -149.365 -149.37 -149.375 -149.38 -149.385 -149.39 -149.395 -149.4 -149.405 -149.41 -149.415 -149.42 -149.425 -149.43 -149.435 -149.44 -149.445 -149.45 -149.455 -149.46 -149.465 -149.47 -149.475 -149.48 -149.485 -149.49 -149.495 -149.5 -149.505 -149.51 -149.515 -149.52 -149.525 -149.53 -149.535 -149.54 -149.545 -149.55 -149.555 -149.56 -149.565 -149.57 -149.575 -149.58 -149.585 -149.59 -149.595 -149.6 -149.605 -149.61 -149.615 -149.62 -149.625 -149.63 -149.635 -149.64 -149.645 -149.65 -149.655 -149.66 -149.665 -149.67 -149.675 -149.68 -149.685 -149.69 -149.695 -149.7 -149.705 -149.71 -149.715 -149.72 -149.725 -149.73 -149.735 -149.74 -149.745 -149.75 -149.755 -149.76 -149.765 -149.77 -149.775 -149.78 -149.785 -149.79 -149.795 -149.8 -149.805 -149.81 -149.815 -149.82 -149.825 -149.83 -149.835 -149.84 -149.845 -149.85 -149.855 -149.86 -149.865 -149.87 -149.875 -149.88 -149.885 -149.89 -149.895 -149.9 -149.905 -149.91 -149.915 -149.92 -149.925 -149.93 -149.935 -149.94 -149.945 -149.95 -149.955 -149.96 -149.965 -149.97 -149.975 -149.98 -149.985 -149.99 -149.995 -150 -150.005 -150.01 -150.015 -150.02 -150.025 -150.03 -150.035 -150.04 -150.045 -150.05 -150.055 -150.06 -150.065 -150.07 -150.075 -150.08 -150.085 -150.09 -150.095 -150.1 -150.105 -150.11 -150.115 -150.12 -150.125 -150.13 -150.135 -150.14 -150.145 -150.15 -150.155 -150.16 -150.165 -150.17 -150.175 -150.18 -150.185 -150.19 -150.195 -150.2 -150.205 -150.21 -150.215 -150.22 -150.225 -150.23 -150.235 -150.24 -150.245 -150.25 -150.255 -150.26 -150.265 -150.27 -150.275 -150.28 -150.285 -150.29 -150.295 -150.3 -150.305 -150.31 -150.315 -150.32 -150.325 -150.33 -150.335 -150.34 -150.345 -150.35 -150.355 -150.36 -150.365 -150.37 -150.375 -150.38 -150.385 -150.39 -150.395 -150.4 -150.405 -150.41 -150.415 -150.42 -150.425 -150.43 -150.435 -150.44 -150.445 -150.45 -150.455 -150.46 -150.465 -150.47 -150.475 -150.48 -150.485 -150.49 -150.495 -150.5 -150.505 -150.51 -150.515 -150.52 -150.525 -150.53 -150.535 -150.54 -150.545 -150.55 -150.555 -150.56 -150.565 -150.57 -150.575 -150.58 -150.585 -150.59 -150.595 -150.6 -150.605 -150.61 -150.615 -150.62 -150.625 -150.63 -150.635 -150.64 -150.645 -150.65 -150.655 -150.66 -150.665 -150.67 -150.675 -150.68 -150.685 -150.69 -150.695 -150.7 -150.705 -150.71 -150.715 -150.72 -150.725 -150.73 -150.735 -150.74 -150.745 -150.75 -150.755 -150.76 -150.765 -150.77 -150.775 -150.78 -150.785 -150.79 -150.795 -150.8 -150.805 -150.81 -150.815 -150.82 -150.825 -150.83 -150.835 -150.84 -150.845 -150.85 -150.855 -150.86 -150.865 -150.87 -150.875 -150.88 -150.885 -150.89 -150.895 -150.9 -150.905 -150.91 -150.915 -150.92 -150.925 -150.93 -150.935 -150.94 -150.945 -150.95 -150.955 -150.96 -150.965 -150.97 -150.975 -150.98 -150.985 -150.99 -150.995 -151 -151.005 -151.01 -151.015 -151.02 -151.025 -151.03 -151.035 -151.04 -151.045 -151.05 -151.055 -151.06 -151.065 -151.07 -151.075 -151.08 -151.085 -151.09 -151.095 -151.1 -151.105 -151.11 -151.115 -151.12 -151.125 -151.13 -151.135 -151.14 -151.145 -151.15 -151.155 -151.16 -151.165 -151.17 -151.175 -151.18 -151.185 -151.19 -151.195 -151.2 -151.205 -151.21 -151.215 -151.22 -151.225 -151.23 -151.235 -151.24 -151.245 -151.25 -151.255 -151.26 -151.265 -151.27 -151.275 -151.28 -151.285 -151.29 -151.295 -151.3 -151.305 -151.31 -151.315 -151.32 -151.325 -151.33 -151.335 -151.34 -151.345 -151.35 -151.355 -151.36 -151.365 -151.37 -151.375 -151.38 -151.385 -151.39 -151.395 -151.4 -151.405 -151.41 -151.415 -151.42 -151.425 -151.43 -151.435 -151.44 -151.445 -151.45 -151.455 -151.46 -151.465 -151.47 -151.475 -151.48 -151.485 -151.49 -151.495 -151.5 -151.505 -151.51 -151.515 -151.52 -151.525 -151.53 -151.535 -151.54 -151.545 -151.55 -151.555 -151.56 -151.565 -151.57 -151.575 -151.58 -151.585 -151.59 -151.595 -151.6 -151.605 -151.61 -151.615 -151.62 -151.625 -151.63 -151.635 -151.64 -151.645 -151.65 -151.655 -151.66 -151.665 -151.67 -151.675 -151.68 -151.685 -151.69 -151.695 -151.7 -151.705 -151.71 -151.715 -151.72 -151.725 -151.73 -151.735 -151.74 -151.745 -151.75 -151.755 -151.76 -151.765 -151.77 -151.775 -151.78 -151.785 -151.79 -151.795 -151.8 -151.805 -151.81 -151.815 -151.82 -151.825 -151.83 -151.835 -151.84 -151.845 -151.85 -151.855 -151.86 -151.865 -151.87 -151.875 -151.88 -151.885 -151.89 -151.895 -151.9 -151.905 -151.91 -151.915 -151.92 -151.925 -151.93 -151.935 -151.94 -151.945 -151.95 -151.955 -151.96 -151.965 -151.97 -151.975 -151.98 -151.985 -151.99 -151.995 -152 -152.005 -152.01 -152.015 -152.02 -152.025 -152.03 -152.035 -152.04 -152.045 -152.05 -152.055 -152.06 -152.065 -152.07 -152.075 -152.08 -152.085 -152.09 -152.095 -152.1 -152.105 -152.11 -152.115 -152.12 -152.125 -152.13 -152.135 -152.14 -152.145 -152.15 -152.155 -152.16 -152.165 -152.17 -152.175 -152.18 -152.185 -152.19 -152.195 -152.2 -152.205 -152.21 -152.215 -152.22 -152.225 -152.23 -152.235 -152.24 -152.245 -152.25 -152.255 -152.26 -152.265 -152.27 -152.275 -152.28 -152.285 -152.29 -152.295 -152.3 -152.305 -152.31 -152.315 -152.32 -152.325 -152.33 -152.335 -152.34 -152.345 -152.35 -152.355 -152.36 -152.365 -152.37 -152.375 -152.38 -152.385 -152.39 -152.395 -152.4 -152.405 -152.41 -152.415 -152.42 -152.425 -152.43 -152.435 -152.44 -152.445 -152.45 -152.455 -152.46 -152.465 -152.47 -152.475 -152.48 -152.485 -152.49 -152.495 -152.5 -152.505 -152.51 -152.515 -152.52 -152.525 -152.53 -152.535 -152.54 -152.545 -152.55 -152.555 -152.56 -152.565 -152.57 -152.575 -152.58 -152.585 -152.59 -152.595 -152.6 -152.605 -152.61 -152.615 -152.62 -152.625 -152.63 -152.635 -152.64 -152.645 -152.65 -152.655 -152.66 -152.665 -152.67 -152.675 -152.68 -152.685 -152.69 -152.695 -152.7 -152.705 -152.71 -152.715 -152.72 -152.725 -152.73 -152.735 -152.74 -152.745 -152.75 -152.755 -152.76 -152.765 -152.77 -152.775 -152.78 -152.785 -152.79 -152.795 -152.8 -152.805 -152.81 -152.815 -152.82 -152.825 -152.83 -152.835 -152.84 -152.845 -152.85 -152.855 -152.86 -152.865 -152.87 -152.875 -152.88 -152.885 -152.89 -152.895 -152.9 -152.905 -152.91 -152.915 -152.92 -152.925 -152.93 -152.935 -152.94 -152.945 -152.95 -152.955 -152.96 -152.965 -152.97 -152.975 -152.98 -152.985 -152.99 -152.995 -153 -153.005 -153.01 -153.015 -153.02 -153.025 -153.03 -153.035 -153.04 -153.045 -153.05 -153.055 -153.06 -153.065 -153.07 -153.075 -153.08 -153.085 -153.09 -153.095 -153.1 -153.105 -153.11 -153.115 -153.12 -153.125 -153.13 -153.135 -153.14 -153.145 -153.15 -153.155 -153.16 -153.165 -153.17 -153.175 -153.18 -153.185 -153.19 -153.195 -153.2 -153.205 -153.21 -153.215 -153.22 -153.225 -153.23 -153.235 -153.24 -153.245 -153.25 -153.255 -153.26 -153.265 -153.27 -153.275 -153.28 -153.285 -153.29 -153.295 -153.3 -153.305 -153.31 -153.315 -153.32 -153.325 -153.33 -153.335 -153.34 -153.345 -153.35 -153.355 -153.36 -153.365 -153.37 -153.375 -153.38 -153.385 -153.39 -153.395 -153.4 -153.405 -153.41 -153.415 -153.42 -153.425 -153.43 -153.435 -153.44 -153.445 -153.45 -153.455 -153.46 -153.465 -153.47 -153.475 -153.48 -153.485 -153.49 -153.495 -153.5 -153.505 -153.51 -153.515 -153.52 -153.525 -153.53 -153.535 -153.54 -153.545 -153.55 -153.555 -153.56 -153.565 -153.57 -153.575 -153.58 -153.585 -153.59 -153.595 -153.6 -153.605 -153.61 -153.615 -153.62 -153.625 -153.63 -153.635 -153.64 -153.645 -153.65 -153.655 -153.66 -153.665 -153.67 -153.675 -153.68 -153.685 -153.69 -153.695 -153.7 -153.705 -153.71 -153.715 -153.72 -153.725 -153.73 -153.735 -153.74 -153.745 -153.75 -153.755 -153.76 -153.765 -153.77 -153.775 -153.78 -153.785 -153.79 -153.795 -153.8 -153.805 -153.81 -153.815 -153.82 -153.825 -153.83 -153.835 -153.84 -153.845 -153.85 -153.855 -153.86 -153.865 -153.87 -153.875 -153.88 -153.885 -153.89 -153.895 -153.9 -153.905 -153.91 -153.915 -153.92 -153.925 -153.93 -153.935 -153.94 -153.945 -153.95 -153.955 -153.96 -153.965 -153.97 -153.975 -153.98 -153.985 -153.99 -153.995 -154 -154.005 -154.01 -154.015 -154.02 -154.025 -154.03 -154.035 -154.04 -154.045 -154.05 -154.055 -154.06 -154.065 -154.07 -154.075 -154.08 -154.085 -154.09 -154.095 -154.1 -154.105 -154.11 -154.115 -154.12 -154.125 -154.13 -154.135 -154.14 -154.145 -154.15 -154.155 -154.16 -154.165 -154.17 -154.175 -154.18 -154.185 -154.19 -154.195 -154.2 -154.205 -154.21 -154.215 -154.22 -154.225 -154.23 -154.235 -154.24 -154.245 -154.25 -154.255 -154.26 -154.265 -154.27 -154.275 -154.28 -154.285 -154.29 -154.295 -154.3 -154.305 -154.31 -154.315 -154.32 -154.325 -154.33 -154.335 -154.34 -154.345 -154.35 -154.355 -154.36 -154.365 -154.37 -154.375 -154.38 -154.385 -154.39 -154.395 -154.4 -154.405 -154.41 -154.415 -154.42 -154.425 -154.43 -154.435 -154.44 -154.445 -154.45 -154.455 -154.46 -154.465 -154.47 -154.475 -154.48 -154.485 -154.49 -154.495 -154.5 -154.505 -154.51 -154.515 -154.52 -154.525 -154.53 -154.535 -154.54 -154.545 -154.55 -154.555 -154.56 -154.565 -154.57 -154.575 -154.58 -154.585 -154.59 -154.595 -154.6 -154.605 -154.61 -154.615 -154.62 -154.625 -154.63 -154.635 -154.64 -154.645 -154.65 -154.655 -154.66 -154.665 -154.67 -154.675 -154.68 -154.685 -154.69 -154.695 -154.7 -154.705 -154.71 -154.715 -154.72 -154.725 -154.73 -154.735 -154.74 -154.745 -154.75 -154.755 -154.76 -154.765 -154.77 -154.775 -154.78 -154.785 -154.79 -154.795 -154.8 -154.805 -154.81 -154.815 -154.82 -154.825 -154.83 -154.835 -154.84 -154.845 -154.85 -154.855 -154.86 -154.865 -154.87 -154.875 -154.88 -154.885 -154.89 -154.895 -154.9 -154.905 -154.91 -154.915 -154.92 -154.925 -154.93 -154.935 -154.94 -154.945 -154.95 -154.955 -154.96 -154.965 -154.97 -154.975 -154.98 -154.985 -154.99 -154.995 -155 -155.005 -155.01 -155.015 -155.02 -155.025 -155.03 -155.035 -155.04 -155.045 -155.05 -155.055 -155.06 -155.065 -155.07 -155.075 -155.08 -155.085 -155.09 -155.095 -155.1 -155.105 -155.11 -155.115 -155.12 -155.125 -155.13 -155.135 -155.14 -155.145 -155.15 -155.155 -155.16 -155.165 -155.17 -155.175 -155.18 -155.185 -155.19 -155.195 -155.2 -155.205 -155.21 -155.215 -155.22 -155.225 -155.23 -155.235 -155.24 -155.245 -155.25 -155.255 -155.26 -155.265 -155.27 -155.275 -155.28 -155.285 -155.29 -155.295 -155.3 -155.305 -155.31 -155.315 -155.32 -155.325 -155.33 -155.335 -155.34 -155.345 -155.35 -155.355 -155.36 -155.365 -155.37 -155.375 -155.38 -155.385 -155.39 -155.395 -155.4 -155.405 -155.41 -155.415 -155.42 -155.425 -155.43 -155.435 -155.44 -155.445 -155.45 -155.455 -155.46 -155.465 -155.47 -155.475 -155.48 -155.485 -155.49 -155.495 -155.5 -155.505 -155.51 -155.515 -155.52 -155.525 -155.53 -155.535 -155.54 -155.545 -155.55 -155.555 -155.56 -155.565 -155.57 -155.575 -155.58 -155.585 -155.59 -155.595 -155.6 -155.605 -155.61 -155.615 -155.62 -155.625 -155.63 -155.635 -155.64 -155.645 -155.65 -155.655 -155.66 -155.665 -155.67 -155.675 -155.68 -155.685 -155.69 -155.695 -155.7 -155.705 -155.71 -155.715 -155.72 -155.725 -155.73 -155.735 -155.74 -155.745 -155.75 -155.755 -155.76 -155.765 -155.77 -155.775 -155.78 -155.785 -155.79 -155.795 -155.8 -155.805 -155.81 -155.815 -155.82 -155.825 -155.83 -155.835 -155.84 -155.845 -155.85 -155.855 -155.86 -155.865 -155.87 -155.875 -155.88 -155.885 -155.89 -155.895 -155.9 -155.905 -155.91 -155.915 -155.92 -155.925 -155.93 -155.935 -155.94 -155.945 -155.95 -155.955 -155.96 -155.965 -155.97 -155.975 -155.98 -155.985 -155.99 -155.995 -156 -156.005 -156.01 -156.015 -156.02 -156.025 -156.03 -156.035 -156.04 -156.045 -156.05 -156.055 -156.06 -156.065 -156.07 -156.075 -156.08 -156.085 -156.09 -156.095 -156.1 -156.105 -156.11 -156.115 -156.12 -156.125 -156.13 -156.135 -156.14 -156.145 -156.15 -156.155 -156.16 -156.165 -156.17 -156.175 -156.18 -156.185 -156.19 -156.195 -156.2 -156.205 -156.21 -156.215 -156.22 -156.225 -156.23 -156.235 -156.24 -156.245 -156.25 -156.255 -156.26 -156.265 -156.27 -156.275 -156.28 -156.285 -156.29 -156.295 -156.3 -156.305 -156.31 -156.315 -156.32 -156.325 -156.33 -156.335 -156.34 -156.345 -156.35 -156.355 -156.36 -156.365 -156.37 -156.375 -156.38 -156.385 -156.39 -156.395 -156.4 -156.405 -156.41 -156.415 -156.42 -156.425 -156.43 -156.435 -156.44 -156.445 -156.45 -156.455 -156.46 -156.465 -156.47 -156.475 -156.48 -156.485 -156.49 -156.495 -156.5 -156.505 -156.51 -156.515 -156.52 -156.525 -156.53 -156.535 -156.54 -156.545 -156.55 -156.555 -156.56 -156.565 -156.57 -156.575 -156.58 -156.585 -156.59 -156.595 -156.6 -156.605 -156.61 -156.615 -156.62 -156.625 -156.63 -156.635 -156.64 -156.645 -156.65 -156.655 -156.66 -156.665 -156.67 -156.675 -156.68 -156.685 -156.69 -156.695 -156.7 -156.705 -156.71 -156.715 -156.72 -156.725 -156.73 -156.735 -156.74 -156.745 -156.75 -156.755 -156.76 -156.765 -156.77 -156.775 -156.78 -156.785 -156.79 -156.795 -156.8 -156.805 -156.81 -156.815 -156.82 -156.825 -156.83 -156.835 -156.84 -156.845 -156.85 -156.855 -156.86 -156.865 -156.87 -156.875 -156.88 -156.885 -156.89 -156.895 -156.9 -156.905 -156.91 -156.915 -156.92 -156.925 -156.93 -156.935 -156.94 -156.945 -156.95 -156.955 -156.96 -156.965 -156.97 -156.975 -156.98 -156.985 -156.99 -156.995 -157 -157.005 -157.01 -157.015 -157.02 -157.025 -157.03 -157.035 -157.04 -157.045 -157.05 -157.055 -157.06 -157.065 -157.07 -157.075 -157.08 -157.085 -157.09 -157.095 -157.1 -157.105 -157.11 -157.115 -157.12 -157.125 -157.13 -157.135 -157.14 -157.145 -157.15 -157.155 -157.16 -157.165 -157.17 -157.175 -157.18 -157.185 -157.19 -157.195 -157.2 -157.205 -157.21 -157.215 -157.22 -157.225 -157.23 -157.235 -157.24 -157.245 -157.25 -157.255 -157.26 -157.265 -157.27 -157.275 -157.28 -157.285 -157.29 -157.295 -157.3 -157.305 -157.31 -157.315 -157.32 -157.325 -157.33 -157.335 -157.34 -157.345 -157.35 -157.355 -157.36 -157.365 -157.37 -157.375 -157.38 -157.385 -157.39 -157.395 -157.4 -157.405 -157.41 -157.415 -157.42 -157.425 -157.43 -157.435 -157.44 -157.445 -157.45 -157.455 -157.46 -157.465 -157.47 -157.475 -157.48 -157.485 -157.49 -157.495 -157.5 -157.505 -157.51 -157.515 -157.52 -157.525 -157.53 -157.535 -157.54 -157.545 -157.55 -157.555 -157.56 -157.565 -157.57 -157.575 -157.58 -157.585 -157.59 -157.595 -157.6 -157.605 -157.61 -157.615 -157.62 -157.625 -157.63 -157.635 -157.64 -157.645 -157.65 -157.655 -157.66 -157.665 -157.67 -157.675 -157.68 -157.685 -157.69 -157.695 -157.7 -157.705 -157.71 -157.715 -157.72 -157.725 -157.73 -157.735 -157.74 -157.745 -157.75 -157.755 -157.76 -157.765 -157.77 -157.775 -157.78 -157.785 -157.79 -157.795 -157.8 -157.805 -157.81 -157.815 -157.82 -157.825 -157.83 -157.835 -157.84 -157.845 -157.85 -157.855 -157.86 -157.865 -157.87 -157.875 -157.88 -157.885 -157.89 -157.895 -157.9 -157.905 -157.91 -157.915 -157.92 -157.925 -157.93 -157.935 -157.94 -157.945 -157.95 -157.955 -157.96 -157.965 -157.97 -157.975 -157.98 -157.985 -157.99 -157.995 -158 -158.005 -158.01 -158.015 -158.02 -158.025 -158.03 -158.035 -158.04 -158.045 -158.05 -158.055 -158.06 -158.065 -158.07 -158.075 -158.08 -158.085 -158.09 -158.095 -158.1 -158.105 -158.11 -158.115 -158.12 -158.125 -158.13 -158.135 -158.14 -158.145 -158.15 -158.155 -158.16 -158.165 -158.17 -158.175 -158.18 -158.185 -158.19 -158.195 -158.2 -158.205 -158.21 -158.215 -158.22 -158.225 -158.23 -158.235 -158.24 -158.245 -158.25 -158.255 -158.26 -158.265 -158.27 -158.275 -158.28 -158.285 -158.29 -158.295 -158.3 -158.305 -158.31 -158.315 -158.32 -158.325 -158.33 -158.335 -158.34 -158.345 -158.35 -158.355 -158.36 -158.365 -158.37 -158.375 -158.38 -158.385 -158.39 -158.395 -158.4 -158.405 -158.41 -158.415 -158.42 -158.425 -158.43 -158.435 -158.44 -158.445 -158.45 -158.455 -158.46 -158.465 -158.47 -158.475 -158.48 -158.485 -158.49 -158.495 -158.5 -158.505 -158.51 -158.515 -158.52 -158.525 -158.53 -158.535 -158.54 -158.545 -158.55 -158.555 -158.56 -158.565 -158.57 -158.575 -158.58 -158.585 -158.59 -158.595 -158.6 -158.605 -158.61 -158.615 -158.62 -158.625 -158.63 -158.635 -158.64 -158.645 -158.65 -158.655 -158.66 -158.665 -158.67 -158.675 -158.68 -158.685 -158.69 -158.695 -158.7 -158.705 -158.71 -158.715 -158.72 -158.725 -158.73 -158.735 -158.74 -158.745 -158.75 -158.755 -158.76 -158.765 -158.77 -158.775 -158.78 -158.785 -158.79 -158.795 -158.8 -158.805 -158.81 -158.815 -158.82 -158.825 -158.83 -158.835 -158.84 -158.845 -158.85 -158.855 -158.86 -158.865 -158.87 -158.875 -158.88 -158.885 -158.89 -158.895 -158.9 -158.905 -158.91 -158.915 -158.92 -158.925 -158.93 -158.935 -158.94 -158.945 -158.95 -158.955 -158.96 -158.965 -158.97 -158.975 -158.98 -158.985 -158.99 -158.995 -159 -159.005 -159.01 -159.015 -159.02 -159.025 -159.03 -159.035 -159.04 -159.045 -159.05 -159.055 -159.06 -159.065 -159.07 -159.075 -159.08 -159.085 -159.09 -159.095 -159.1 -159.105 -159.11 -159.115 -159.12 -159.125 -159.13 -159.135 -159.14 -159.145 -159.15 -159.155 -159.16 -159.165 -159.17 -159.175 -159.18 -159.185 -159.19 -159.195 -159.2 -159.205 -159.21 -159.215 -159.22 -159.225 -159.23 -159.235 -159.24 -159.245 -159.25 -159.255 -159.26 -159.265 -159.27 -159.275 -159.28 -159.285 -159.29 -159.295 -159.3 -159.305 -159.31 -159.315 -159.32 -159.325 -159.33 -159.335 -159.34 -159.345 -159.35 -159.355 -159.36 -159.365 -159.37 -159.375 -159.38 -159.385 -159.39 -159.395 -159.4 -159.405 -159.41 -159.415 -159.42 -159.425 -159.43 -159.435 -159.44 -159.445 -159.45 -159.455 -159.46 -159.465 -159.47 -159.475 -159.48 -159.485 -159.49 -159.495 -159.5 -159.505 -159.51 -159.515 -159.52 -159.525 -159.53 -159.535 -159.54 -159.545 -159.55 -159.555 -159.56 -159.565 -159.57 -159.575 -159.58 -159.585 -159.59 -159.595 -159.6 -159.605 -159.61 -159.615 -159.62 -159.625 -159.63 -159.635 -159.64 -159.645 -159.65 -159.655 -159.66 -159.665 -159.67 -159.675 -159.68 -159.685 -159.69 -159.695 -159.7 -159.705 -159.71 -159.715 -159.72 -159.725 -159.73 -159.735 -159.74 -159.745 -159.75 -159.755 -159.76 -159.765 -159.77 -159.775 -159.78 -159.785 -159.79 -159.795 -159.8 -159.805 -159.81 -159.815 -159.82 -159.825 -159.83 -159.835 -159.84 -159.845 -159.85 -159.855 -159.86 -159.865 -159.87 -159.875 -159.88 -159.885 -159.89 -159.895 -159.9 -159.905 -159.91 -159.915 -159.92 -159.925 -159.93 -159.935 -159.94 -159.945 -159.95 -159.955 -159.96 -159.965 -159.97 -159.975 -159.98 -159.985 -159.99 -159.995 -160 -160.005 -160.01 -160.015 -160.02 -160.025 -160.03 -160.035 -160.04 -160.045 -160.05 -160.055 -160.06 -160.065 -160.07 -160.075 -160.08 -160.085 -160.09 -160.095 -160.1 -160.105 -160.11 -160.115 -160.12 -160.125 -160.13 -160.135 -160.14 -160.145 -160.15 -160.155 -160.16 -160.165 -160.17 -160.175 -160.18 -160.185 -160.19 -160.195 -160.2 -160.205 -160.21 -160.215 -160.22 -160.225 -160.23 -160.235 -160.24 -160.245 -160.25 -160.255 -160.26 -160.265 -160.27 -160.275 -160.28 -160.285 -160.29 -160.295 -160.3 -160.305 -160.31 -160.315 -160.32 -160.325 -160.33 -160.335 -160.34 -160.345 -160.35 -160.355 -160.36 -160.365 -160.37 -160.375 -160.38 -160.385 -160.39 -160.395 -160.4 -160.405 -160.41 -160.415 -160.42 -160.425 -160.43 -160.435 -160.44 -160.445 -160.45 -160.455 -160.46 -160.465 -160.47 -160.475 -160.48 -160.485 -160.49 -160.495 -160.5 -160.505 -160.51 -160.515 -160.52 -160.525 -160.53 -160.535 -160.54 -160.545 -160.55 -160.555 -160.56 -160.565 -160.57 -160.575 -160.58 -160.585 -160.59 -160.595 -160.6 -160.605 -160.61 -160.615 -160.62 -160.625 -160.63 -160.635 -160.64 -160.645 -160.65 -160.655 -160.66 -160.665 -160.67 -160.675 -160.68 -160.685 -160.69 -160.695 -160.7 -160.705 -160.71 -160.715 -160.72 -160.725 -160.73 -160.735 -160.74 -160.745 -160.75 -160.755 -160.76 -160.765 -160.77 -160.775 -160.78 -160.785 -160.79 -160.795 -160.8 -160.805 -160.81 -160.815 -160.82 -160.825 -160.83 -160.835 -160.84 -160.845 -160.85 -160.855 -160.86 -160.865 -160.87 -160.875 -160.88 -160.885 -160.89 -160.895 -160.9 -160.905 -160.91 -160.915 -160.92 -160.925 -160.93 -160.935 -160.94 -160.945 -160.95 -160.955 -160.96 -160.965 -160.97 -160.975 -160.98 -160.985 -160.99 -160.995 -161 -161.005 -161.01 -161.015 -161.02 -161.025 -161.03 -161.035 -161.04 -161.045 -161.05 -161.055 -161.06 -161.065 -161.07 -161.075 -161.08 -161.085 -161.09 -161.095 -161.1 -161.105 -161.11 -161.115 -161.12 -161.125 -161.13 -161.135 -161.14 -161.145 -161.15 -161.155 -161.16 -161.165 -161.17 -161.175 -161.18 -161.185 -161.19 -161.195 -161.2 -161.205 -161.21 -161.215 -161.22 -161.225 -161.23 -161.235 -161.24 -161.245 -161.25 -161.255 -161.26 -161.265 -161.27 -161.275 -161.28 -161.285 -161.29 -161.295 -161.3 -161.305 -161.31 -161.315 -161.32 -161.325 -161.33 -161.335 -161.34 -161.345 -161.35 -161.355 -161.36 -161.365 -161.37 -161.375 -161.38 -161.385 -161.39 -161.395 -161.4 -161.405 -161.41 -161.415 -161.42 -161.425 -161.43 -161.435 -161.44 -161.445 -161.45 -161.455 -161.46 -161.465 -161.47 -161.475 -161.48 -161.485 -161.49 -161.495 -161.5 -161.505 -161.51 -161.515 -161.52 -161.525 -161.53 -161.535 -161.54 -161.545 -161.55 -161.555 -161.56 -161.565 -161.57 -161.575 -161.58 -161.585 -161.59 -161.595 -161.6 -161.605 -161.61 -161.615 -161.62 -161.625 -161.63 -161.635 -161.64 -161.645 -161.65 -161.655 -161.66 -161.665 -161.67 -161.675 -161.68 -161.685 -161.69 -161.695 -161.7 -161.705 -161.71 -161.715 -161.72 -161.725 -161.73 -161.735 -161.74 -161.745 -161.75 -161.755 -161.76 -161.765 -161.77 -161.775 -161.78 -161.785 -161.79 -161.795 -161.8 -161.805 -161.81 -161.815 -161.82 -161.825 -161.83 -161.835 -161.84 -161.845 -161.85 -161.855 -161.86 -161.865 -161.87 -161.875 -161.88 -161.885 -161.89 -161.895 -161.9 -161.905 -161.91 -161.915 -161.92 -161.925 -161.93 -161.935 -161.94 -161.945 -161.95 -161.955 -161.96 -161.965 -161.97 -161.975 -161.98 -161.985 -161.99 -161.995 -162 -162.005 -162.01 -162.015 -162.02 -162.025 -162.03 -162.035 -162.04 -162.045 -162.05 -162.055 -162.06 -162.065 -162.07 -162.075 -162.08 -162.085 -162.09 -162.095 -162.1 -162.105 -162.11 -162.115 -162.12 -162.125 -162.13 -162.135 -162.14 -162.145 -162.15 -162.155 -162.16 -162.165 -162.17 -162.175 -162.18 -162.185 -162.19 -162.195 -162.2 -162.205 -162.21 -162.215 -162.22 -162.225 -162.23 -162.235 -162.24 -162.245 -162.25 -162.255 -162.26 -162.265 -162.27 -162.275 -162.28 -162.285 -162.29 -162.295 -162.3 -162.305 -162.31 -162.315 -162.32 -162.325 -162.33 -162.335 -162.34 -162.345 -162.35 -162.355 -162.36 -162.365 -162.37 -162.375 -162.38 -162.385 -162.39 -162.395 -162.4 -162.405 -162.41 -162.415 -162.42 -162.425 -162.43 -162.435 -162.44 -162.445 -162.45 -162.455 -162.46 -162.465 -162.47 -162.475 -162.48 -162.485 -162.49 -162.495 -162.5 -162.505 -162.51 -162.515 -162.52 -162.525 -162.53 -162.535 -162.54 -162.545 -162.55 -162.555 -162.56 -162.565 -162.57 -162.575 -162.58 -162.585 -162.59 -162.595 -162.6 -162.605 -162.61 -162.615 -162.62 -162.625 -162.63 -162.635 -162.64 -162.645 -162.65 -162.655 -162.66 -162.665 -162.67 -162.675 -162.68 -162.685 -162.69 -162.695 -162.7 -162.705 -162.71 -162.715 -162.72 -162.725 -162.73 -162.735 -162.74 -162.745 -162.75 -162.755 -162.76 -162.765 -162.77 -162.775 -162.78 -162.785 -162.79 -162.795 -162.8 -162.805 -162.81 -162.815 -162.82 -162.825 -162.83 -162.835 -162.84 -162.845 -162.85 -162.855 -162.86 -162.865 -162.87 -162.875 -162.88 -162.885 -162.89 -162.895 -162.9 -162.905 -162.91 -162.915 -162.92 -162.925 -162.93 -162.935 -162.94 -162.945 -162.95 -162.955 -162.96 -162.965 -162.97 -162.975 -162.98 -162.985 -162.99 -162.995 -163 -163.005 -163.01 -163.015 -163.02 -163.025 -163.03 -163.035 -163.04 -163.045 -163.05 -163.055 -163.06 -163.065 -163.07 -163.075 -163.08 -163.085 -163.09 -163.095 -163.1 -163.105 -163.11 -163.115 -163.12 -163.125 -163.13 -163.135 -163.14 -163.145 -163.15 -163.155 -163.16 -163.165 -163.17 -163.175 -163.18 -163.185 -163.19 -163.195 -163.2 -163.205 -163.21 -163.215 -163.22 -163.225 -163.23 -163.235 -163.24 -163.245 -163.25 -163.255 -163.26 -163.265 -163.27 -163.275 -163.28 -163.285 -163.29 -163.295 -163.3 -163.305 -163.31 -163.315 -163.32 -163.325 -163.33 -163.335 -163.34 -163.345 -163.35 -163.355 -163.36 -163.365 -163.37 -163.375 -163.38 -163.385 -163.39 -163.395 -163.4 -163.405 -163.41 -163.415 -163.42 -163.425 -163.43 -163.435 -163.44 -163.445 -163.45 -163.455 -163.46 -163.465 -163.47 -163.475 -163.48 -163.485 -163.49 -163.495 -163.5 -163.505 -163.51 -163.515 -163.52 -163.525 -163.53 -163.535 -163.54 -163.545 -163.55 -163.555 -163.56 -163.565 -163.57 -163.575 -163.58 -163.585 -163.59 -163.595 -163.6 -163.605 -163.61 -163.615 -163.62 -163.625 -163.63 -163.635 -163.64 -163.645 -163.65 -163.655 -163.66 -163.665 -163.67 -163.675 -163.68 -163.685 -163.69 -163.695 -163.7 -163.705 -163.71 -163.715 -163.72 -163.725 -163.73 -163.735 -163.74 -163.745 -163.75 -163.755 -163.76 -163.765 -163.77 -163.775 -163.78 -163.785 -163.79 -163.795 -163.8 -163.805 -163.81 -163.815 -163.82 -163.825 -163.83 -163.835 -163.84 -163.845 -163.85 -163.855 -163.86 -163.865 -163.87 -163.875 -163.88 -163.885 -163.89 -163.895 -163.9 -163.905 -163.91 -163.915 -163.92 -163.925 -163.93 -163.935 -163.94 -163.945 -163.95 -163.955 -163.96 -163.965 -163.97 -163.975 -163.98 -163.985 -163.99 -163.995 -164 -164.005 -164.01 -164.015 -164.02 -164.025 -164.03 -164.035 -164.04 -164.045 -164.05 -164.055 -164.06 -164.065 -164.07 -164.075 -164.08 -164.085 -164.09 -164.095 -164.1 -164.105 -164.11 -164.115 -164.12 -164.125 -164.13 -164.135 -164.14 -164.145 -164.15 -164.155 -164.16 -164.165 -164.17 -164.175 -164.18 -164.185 -164.19 -164.195 -164.2 -164.205 -164.21 -164.215 -164.22 -164.225 -164.23 -164.235 -164.24 -164.245 -164.25 -164.255 -164.26 -164.265 -164.27 -164.275 -164.28 -164.285 -164.29 -164.295 -164.3 -164.305 -164.31 -164.315 -164.32 -164.325 -164.33 -164.335 -164.34 -164.345 -164.35 -164.355 -164.36 -164.365 -164.37 -164.375 -164.38 -164.385 -164.39 -164.395 -164.4 -164.405 -164.41 -164.415 -164.42 -164.425 -164.43 -164.435 -164.44 -164.445 -164.45 -164.455 -164.46 -164.465 -164.47 -164.475 -164.48 -164.485 -164.49 -164.495 -164.5 -164.505 -164.51 -164.515 -164.52 -164.525 -164.53 -164.535 -164.54 -164.545 -164.55 -164.555 -164.56 -164.565 -164.57 -164.575 -164.58 -164.585 -164.59 -164.595 -164.6 -164.605 -164.61 -164.615 -164.62 -164.625 -164.63 -164.635 -164.64 -164.645 -164.65 -164.655 -164.66 -164.665 -164.67 -164.675 -164.68 -164.685 -164.69 -164.695 -164.7 -164.705 -164.71 -164.715 -164.72 -164.725 -164.73 -164.735 -164.74 -164.745 -164.75 -164.755 -164.76 -164.765 -164.77 -164.775 -164.78 -164.785 -164.79 -164.795 -164.8 -164.805 -164.81 -164.815 -164.82 -164.825 -164.83 -164.835 -164.84 -164.845 -164.85 -164.855 -164.86 -164.865 -164.87 -164.875 -164.88 -164.885 -164.89 -164.895 -164.9 -164.905 -164.91 -164.915 -164.92 -164.925 -164.93 -164.935 -164.94 -164.945 -164.95 -164.955 -164.96 -164.965 -164.97 -164.975 -164.98 -164.985 -164.99 -164.995 -165 -165.005 -165.01 -165.015 -165.02 -165.025 -165.03 -165.035 -165.04 -165.045 -165.05 -165.055 -165.06 -165.065 -165.07 -165.075 -165.08 -165.085 -165.09 -165.095 -165.1 -165.105 -165.11 -165.115 -165.12 -165.125 -165.13 -165.135 -165.14 -165.145 -165.15 -165.155 -165.16 -165.165 -165.17 -165.175 -165.18 -165.185 -165.19 -165.195 -165.2 -165.205 -165.21 -165.215 -165.22 -165.225 -165.23 -165.235 -165.24 -165.245 -165.25 -165.255 -165.26 -165.265 -165.27 -165.275 -165.28 -165.285 -165.29 -165.295 -165.3 -165.305 -165.31 -165.315 -165.32 -165.325 -165.33 -165.335 -165.34 -165.345 -165.35 -165.355 -165.36 -165.365 -165.37 -165.375 -165.38 -165.385 -165.39 -165.395 -165.4 -165.405 -165.41 -165.415 -165.42 -165.425 -165.43 -165.435 -165.44 -165.445 -165.45 -165.455 -165.46 -165.465 -165.47 -165.475 -165.48 -165.485 -165.49 -165.495 -165.5 -165.505 -165.51 -165.515 -165.52 -165.525 -165.53 -165.535 -165.54 -165.545 -165.55 -165.555 -165.56 -165.565 -165.57 -165.575 -165.58 -165.585 -165.59 -165.595 -165.6 -165.605 -165.61 -165.615 -165.62 -165.625 -165.63 -165.635 -165.64 -165.645 -165.65 -165.655 -165.66 -165.665 -165.67 -165.675 -165.68 -165.685 -165.69 -165.695 -165.7 -165.705 -165.71 -165.715 -165.72 -165.725 -165.73 -165.735 -165.74 -165.745 -165.75 -165.755 -165.76 -165.765 -165.77 -165.775 -165.78 -165.785 -165.79 -165.795 -165.8 -165.805 -165.81 -165.815 -165.82 -165.825 -165.83 -165.835 -165.84 -165.845 -165.85 -165.855 -165.86 -165.865 -165.87 -165.875 -165.88 -165.885 -165.89 -165.895 -165.9 -165.905 -165.91 -165.915 -165.92 -165.925 -165.93 -165.935 -165.94 -165.945 -165.95 -165.955 -165.96 -165.965 -165.97 -165.975 -165.98 -165.985 -165.99 -165.995 -166 -166.005 -166.01 -166.015 -166.02 -166.025 -166.03 -166.035 -166.04 -166.045 -166.05 -166.055 -166.06 -166.065 -166.07 -166.075 -166.08 -166.085 -166.09 -166.095 -166.1 -166.105 -166.11 -166.115 -166.12 -166.125 -166.13 -166.135 -166.14 -166.145 -166.15 -166.155 -166.16 -166.165 -166.17 -166.175 -166.18 -166.185 -166.19 -166.195 -166.2 -166.205 -166.21 -166.215 -166.22 -166.225 -166.23 -166.235 -166.24 -166.245 -166.25 -166.255 -166.26 -166.265 -166.27 -166.275 -166.28 -166.285 -166.29 -166.295 -166.3 -166.305 -166.31 -166.315 -166.32 -166.325 -166.33 -166.335 -166.34 -166.345 -166.35 -166.355 -166.36 -166.365 -166.37 -166.375 -166.38 -166.385 -166.39 -166.395 -166.4 -166.405 -166.41 -166.415 -166.42 -166.425 -166.43 -166.435 -166.44 -166.445 -166.45 -166.455 -166.46 -166.465 -166.47 -166.475 -166.48 -166.485 -166.49 -166.495 -166.5 -166.505 -166.51 -166.515 -166.52 -166.525 -166.53 -166.535 -166.54 -166.545 -166.55 -166.555 -166.56 -166.565 -166.57 -166.575 -166.58 -166.585 -166.59 -166.595 -166.6 -166.605 -166.61 -166.615 -166.62 -166.625 -166.63 -166.635 -166.64 -166.645 -166.65 -166.655 -166.66 -166.665 -166.67 -166.675 -166.68 -166.685 -166.69 -166.695 -166.7 -166.705 -166.71 -166.715 -166.72 -166.725 -166.73 -166.735 -166.74 -166.745 -166.75 -166.755 -166.76 -166.765 -166.77 -166.775 -166.78 -166.785 -166.79 -166.795 -166.8 -166.805 -166.81 -166.815 -166.82 -166.825 -166.83 -166.835 -166.84 -166.845 -166.85 -166.855 -166.86 -166.865 -166.87 -166.875 -166.88 -166.885 -166.89 -166.895 -166.9 -166.905 -166.91 -166.915 -166.92 -166.925 -166.93 -166.935 -166.94 -166.945 -166.95 -166.955 -166.96 -166.965 -166.97 -166.975 -166.98 -166.985 -166.99 -166.995 -167 -167.005 -167.01 -167.015 -167.02 -167.025 -167.03 -167.035 -167.04 -167.045 -167.05 -167.055 -167.06 -167.065 -167.07 -167.075 -167.08 -167.085 -167.09 -167.095 -167.1 -167.105 -167.11 -167.115 -167.12 -167.125 -167.13 -167.135 -167.14 -167.145 -167.15 -167.155 -167.16 -167.165 -167.17 -167.175 -167.18 -167.185 -167.19 -167.195 -167.2 -167.205 -167.21 -167.215 -167.22 -167.225 -167.23 -167.235 -167.24 -167.245 -167.25 -167.255 -167.26 -167.265 -167.27 -167.275 -167.28 -167.285 -167.29 -167.295 -167.3 -167.305 -167.31 -167.315 -167.32 -167.325 -167.33 -167.335 -167.34 -167.345 -167.35 -167.355 -167.36 -167.365 -167.37 -167.375 -167.38 -167.385 -167.39 -167.395 -167.4 -167.405 -167.41 -167.415 -167.42 -167.425 -167.43 -167.435 -167.44 -167.445 -167.45 -167.455 -167.46 -167.465 -167.47 -167.475 -167.48 -167.485 -167.49 -167.495 -167.5 -167.505 -167.51 -167.515 -167.52 -167.525 -167.53 -167.535 -167.54 -167.545 -167.55 -167.555 -167.56 -167.565 -167.57 -167.575 -167.58 -167.585 -167.59 -167.595 -167.6 -167.605 -167.61 -167.615 -167.62 -167.625 -167.63 -167.635 -167.64 -167.645 -167.65 -167.655 -167.66 -167.665 -167.67 -167.675 -167.68 -167.685 -167.69 -167.695 -167.7 -167.705 -167.71 -167.715 -167.72 -167.725 -167.73 -167.735 -167.74 -167.745 -167.75 -167.755 -167.76 -167.765 -167.77 -167.775 -167.78 -167.785 -167.79 -167.795 -167.8 -167.805 -167.81 -167.815 -167.82 -167.825 -167.83 -167.835 -167.84 -167.845 -167.85 -167.855 -167.86 -167.865 -167.87 -167.875 -167.88 -167.885 -167.89 -167.895 -167.9 -167.905 -167.91 -167.915 -167.92 -167.925 -167.93 -167.935 -167.94 -167.945 -167.95 -167.955 -167.96 -167.965 -167.97 -167.975 -167.98 -167.985 -167.99 -167.995 -168 -168.005 -168.01 -168.015 -168.02 -168.025 -168.03 -168.035 -168.04 -168.045 -168.05 -168.055 -168.06 -168.065 -168.07 -168.075 -168.08 -168.085 -168.09 -168.095 -168.1 -168.105 -168.11 -168.115 -168.12 -168.125 -168.13 -168.135 -168.14 -168.145 -168.15 -168.155 -168.16 -168.165 -168.17 -168.175 -168.18 -168.185 -168.19 -168.195 -168.2 -168.205 -168.21 -168.215 -168.22 -168.225 -168.23 -168.235 -168.24 -168.245 -168.25 -168.255 -168.26 -168.265 -168.27 -168.275 -168.28 -168.285 -168.29 -168.295 -168.3 -168.305 -168.31 -168.315 -168.32 -168.325 -168.33 -168.335 -168.34 -168.345 -168.35 -168.355 -168.36 -168.365 -168.37 -168.375 -168.38 -168.385 -168.39 -168.395 -168.4 -168.405 -168.41 -168.415 -168.42 -168.425 -168.43 -168.435 -168.44 -168.445 -168.45 -168.455 -168.46 -168.465 -168.47 -168.475 -168.48 -168.485 -168.49 -168.495 -168.5 -168.505 -168.51 -168.515 -168.52 -168.525 -168.53 -168.535 -168.54 -168.545 -168.55 -168.555 -168.56 -168.565 -168.57 -168.575 -168.58 -168.585 -168.59 -168.595 -168.6 -168.605 -168.61 -168.615 -168.62 -168.625 -168.63 -168.635 -168.64 -168.645 -168.65 -168.655 -168.66 -168.665 -168.67 -168.675 -168.68 -168.685 -168.69 -168.695 -168.7 -168.705 -168.71 -168.715 -168.72 -168.725 -168.73 -168.735 -168.74 -168.745 -168.75 -168.755 -168.76 -168.765 -168.77 -168.775 -168.78 -168.785 -168.79 -168.795 -168.8 -168.805 -168.81 -168.815 -168.82 -168.825 -168.83 -168.835 -168.84 -168.845 -168.85 -168.855 -168.86 -168.865 -168.87 -168.875 -168.88 -168.885 -168.89 -168.895 -168.9 -168.905 -168.91 -168.915 -168.92 -168.925 -168.93 -168.935 -168.94 -168.945 -168.95 -168.955 -168.96 -168.965 -168.97 -168.975 -168.98 -168.985 -168.99 -168.995 -169 -169.005 -169.01 -169.015 -169.02 -169.025 -169.03 -169.035 -169.04 -169.045 -169.05 -169.055 -169.06 -169.065 -169.07 -169.075 -169.08 -169.085 -169.09 -169.095 -169.1 -169.105 -169.11 -169.115 -169.12 -169.125 -169.13 -169.135 -169.14 -169.145 -169.15 -169.155 -169.16 -169.165 -169.17 -169.175 -169.18 -169.185 -169.19 -169.195 -169.2 -169.205 -169.21 -169.215 -169.22 -169.225 -169.23 -169.235 -169.24 -169.245 -169.25 -169.255 -169.26 -169.265 -169.27 -169.275 -169.28 -169.285 -169.29 -169.295 -169.3 -169.305 -169.31 -169.315 -169.32 -169.325 -169.33 -169.335 -169.34 -169.345 -169.35 -169.355 -169.36 -169.365 -169.37 -169.375 -169.38 -169.385 -169.39 -169.395 -169.4 -169.405 -169.41 -169.415 -169.42 -169.425 -169.43 -169.435 -169.44 -169.445 -169.45 -169.455 -169.46 -169.465 -169.47 -169.475 -169.48 -169.485 -169.49 -169.495 -169.5 -169.505 -169.51 -169.515 -169.52 -169.525 -169.53 -169.535 -169.54 -169.545 -169.55 -169.555 -169.56 -169.565 -169.57 -169.575 -169.58 -169.585 -169.59 -169.595 -169.6 -169.605 -169.61 -169.615 -169.62 -169.625 -169.63 -169.635 -169.64 -169.645 -169.65 -169.655 -169.66 -169.665 -169.67 -169.675 -169.68 -169.685 -169.69 -169.695 -169.7 -169.705 -169.71 -169.715 -169.72 -169.725 -169.73 -169.735 -169.74 -169.745 -169.75 -169.755 -169.76 -169.765 -169.77 -169.775 -169.78 -169.785 -169.79 -169.795 -169.8 -169.805 -169.81 -169.815 -169.82 -169.825 -169.83 -169.835 -169.84 -169.845 -169.85 -169.855 -169.86 -169.865 -169.87 -169.875 -169.88 -169.885 -169.89 -169.895 -169.9 -169.905 -169.91 -169.915 -169.92 -169.925 -169.93 -169.935 -169.94 -169.945 -169.95 -169.955 -169.96 -169.965 -169.97 -169.975 -169.98 -169.985 -169.99 -169.995 -170 -170.005 -170.01 -170.015 -170.02 -170.025 -170.03 -170.035 -170.04 -170.045 -170.05 -170.055 -170.06 -170.065 -170.07 -170.075 -170.08 -170.085 -170.09 -170.095 -170.1 -170.105 -170.11 -170.115 -170.12 -170.125 -170.13 -170.135 -170.14 -170.145 -170.15 -170.155 -170.16 -170.165 -170.17 -170.175 -170.18 -170.185 -170.19 -170.195 -170.2 -170.205 -170.21 -170.215 -170.22 -170.225 -170.23 -170.235 -170.24 -170.245 -170.25 -170.255 -170.26 -170.265 -170.27 -170.275 -170.28 -170.285 -170.29 -170.295 -170.3 -170.305 -170.31 -170.315 -170.32 -170.325 -170.33 -170.335 -170.34 -170.345 -170.35 -170.355 -170.36 -170.365 -170.37 -170.375 -170.38 -170.385 -170.39 -170.395 -170.4 -170.405 -170.41 -170.415 -170.42 -170.425 -170.43 -170.435 -170.44 -170.445 -170.45 -170.455 -170.46 -170.465 -170.47 -170.475 -170.48 -170.485 -170.49 -170.495 -170.5 -170.505 -170.51 -170.515 -170.52 -170.525 -170.53 -170.535 -170.54 -170.545 -170.55 -170.555 -170.56 -170.565 -170.57 -170.575 -170.58 -170.585 -170.59 -170.595 -170.6 -170.605 -170.61 -170.615 -170.62 -170.625 -170.63 -170.635 -170.64 -170.645 -170.65 -170.655 -170.66 -170.665 -170.67 -170.675 -170.68 -170.685 -170.69 -170.695 -170.7 -170.705 -170.71 -170.715 -170.72 -170.725 -170.73 -170.735 -170.74 -170.745 -170.75 -170.755 -170.76 -170.765 -170.77 -170.775 -170.78 -170.785 -170.79 -170.795 -170.8 -170.805 -170.81 -170.815 -170.82 -170.825 -170.83 -170.835 -170.84 -170.845 -170.85 -170.855 -170.86 -170.865 -170.87 -170.875 -170.88 -170.885 -170.89 -170.895 -170.9 -170.905 -170.91 -170.915 -170.92 -170.925 -170.93 -170.935 -170.94 -170.945 -170.95 -170.955 -170.96 -170.965 -170.97 -170.975 -170.98 -170.985 -170.99 -170.995 -171 -171.005 -171.01 -171.015 -171.02 -171.025 -171.03 -171.035 -171.04 -171.045 -171.05 -171.055 -171.06 -171.065 -171.07 -171.075 -171.08 -171.085 -171.09 -171.095 -171.1 -171.105 -171.11 -171.115 -171.12 -171.125 -171.13 -171.135 -171.14 -171.145 -171.15 -171.155 -171.16 -171.165 -171.17 -171.175 -171.18 -171.185 -171.19 -171.195 -171.2 -171.205 -171.21 -171.215 -171.22 -171.225 -171.23 -171.235 -171.24 -171.245 -171.25 -171.255 -171.26 -171.265 -171.27 -171.275 -171.28 -171.285 -171.29 -171.295 -171.3 -171.305 -171.31 -171.315 -171.32 -171.325 -171.33 -171.335 -171.34 -171.345 -171.35 -171.355 -171.36 -171.365 -171.37 -171.375 -171.38 -171.385 -171.39 -171.395 -171.4 -171.405 -171.41 -171.415 -171.42 -171.425 -171.43 -171.435 -171.44 -171.445 -171.45 -171.455 -171.46 -171.465 -171.47 -171.475 -171.48 -171.485 -171.49 -171.495 -171.5 -171.505 -171.51 -171.515 -171.52 -171.525 -171.53 -171.535 -171.54 -171.545 -171.55 -171.555 -171.56 -171.565 -171.57 -171.575 -171.58 -171.585 -171.59 -171.595 -171.6 -171.605 -171.61 -171.615 -171.62 -171.625 -171.63 -171.635 -171.64 -171.645 -171.65 -171.655 -171.66 -171.665 -171.67 -171.675 -171.68 -171.685 -171.69 -171.695 -171.7 -171.705 -171.71 -171.715 -171.72 -171.725 -171.73 -171.735 -171.74 -171.745 -171.75 -171.755 -171.76 -171.765 -171.77 -171.775 -171.78 -171.785 -171.79 -171.795 -171.8 -171.805 -171.81 -171.815 -171.82 -171.825 -171.83 -171.835 -171.84 -171.845 -171.85 -171.855 -171.86 -171.865 -171.87 -171.875 -171.88 -171.885 -171.89 -171.895 -171.9 -171.905 -171.91 -171.915 -171.92 -171.925 -171.93 -171.935 -171.94 -171.945 -171.95 -171.955 -171.96 -171.965 -171.97 -171.975 -171.98 -171.985 -171.99 -171.995 -172 -172.005 -172.01 -172.015 -172.02 -172.025 -172.03 -172.035 -172.04 -172.045 -172.05 -172.055 -172.06 -172.065 -172.07 -172.075 -172.08 -172.085 -172.09 -172.095 -172.1 -172.105 -172.11 -172.115 -172.12 -172.125 -172.13 -172.135 -172.14 -172.145 -172.15 -172.155 -172.16 -172.165 -172.17 -172.175 -172.18 -172.185 -172.19 -172.195 -172.2 -172.205 -172.21 -172.215 -172.22 -172.225 -172.23 -172.235 -172.24 -172.245 -172.25 -172.255 -172.26 -172.265 -172.27 -172.275 -172.28 -172.285 -172.29 -172.295 -172.3 -172.305 -172.31 -172.315 -172.32 -172.325 -172.33 -172.335 -172.34 -172.345 -172.35 -172.355 -172.36 -172.365 -172.37 -172.375 -172.38 -172.385 -172.39 -172.395 -172.4 -172.405 -172.41 -172.415 -172.42 -172.425 -172.43 -172.435 -172.44 -172.445 -172.45 -172.455 -172.46 -172.465 -172.47 -172.475 -172.48 -172.485 -172.49 -172.495 -172.5 -172.505 -172.51 -172.515 -172.52 -172.525 -172.53 -172.535 -172.54 -172.545 -172.55 -172.555 -172.56 -172.565 -172.57 -172.575 -172.58 -172.585 -172.59 -172.595 -172.6 -172.605 -172.61 -172.615 -172.62 -172.625 -172.63 -172.635 -172.64 -172.645 -172.65 -172.655 -172.66 -172.665 -172.67 -172.675 -172.68 -172.685 -172.69 -172.695 -172.7 -172.705 -172.71 -172.715 -172.72 -172.725 -172.73 -172.735 -172.74 -172.745 -172.75 -172.755 -172.76 -172.765 -172.77 -172.775 -172.78 -172.785 -172.79 -172.795 -172.8 -172.805 -172.81 -172.815 -172.82 -172.825 -172.83 -172.835 -172.84 -172.845 -172.85 -172.855 -172.86 -172.865 -172.87 -172.875 -172.88 -172.885 -172.89 -172.895 -172.9 -172.905 -172.91 -172.915 -172.92 -172.925 -172.93 -172.935 -172.94 -172.945 -172.95 -172.955 -172.96 -172.965 -172.97 -172.975 -172.98 -172.985 -172.99 -172.995 -173 -173.005 -173.01 -173.015 -173.02 -173.025 -173.03 -173.035 -173.04 -173.045 -173.05 -173.055 -173.06 -173.065 -173.07 -173.075 -173.08 -173.085 -173.09 -173.095 -173.1 -173.105 -173.11 -173.115 -173.12 -173.125 -173.13 -173.135 -173.14 -173.145 -173.15 -173.155 -173.16 -173.165 -173.17 -173.175 -173.18 -173.185 -173.19 -173.195 -173.2 -173.205 -173.21 -173.215 -173.22 -173.225 -173.23 -173.235 -173.24 -173.245 -173.25 -173.255 -173.26 -173.265 -173.27 -173.275 -173.28 -173.285 -173.29 -173.295 -173.3 -173.305 -173.31 -173.315 -173.32 -173.325 -173.33 -173.335 -173.34 -173.345 -173.35 -173.355 -173.36 -173.365 -173.37 -173.375 -173.38 -173.385 -173.39 -173.395 -173.4 -173.405 -173.41 -173.415 -173.42 -173.425 -173.43 -173.435 -173.44 -173.445 -173.45 -173.455 -173.46 -173.465 -173.47 -173.475 -173.48 -173.485 -173.49 -173.495 -173.5 -173.505 -173.51 -173.515 -173.52 -173.525 -173.53 -173.535 -173.54 -173.545 -173.55 -173.555 -173.56 -173.565 -173.57 -173.575 -173.58 -173.585 -173.59 -173.595 -173.6 -173.605 -173.61 -173.615 -173.62 -173.625 -173.63 -173.635 -173.64 -173.645 -173.65 -173.655 -173.66 -173.665 -173.67 -173.675 -173.68 -173.685 -173.69 -173.695 -173.7 -173.705 -173.71 -173.715 -173.72 -173.725 -173.73 -173.735 -173.74 -173.745 -173.75 -173.755 -173.76 -173.765 -173.77 -173.775 -173.78 -173.785 -173.79 -173.795 -173.8 -173.805 -173.81 -173.815 -173.82 -173.825 -173.83 -173.835 -173.84 -173.845 -173.85 -173.855 -173.86 -173.865 -173.87 -173.875 -173.88 -173.885 -173.89 -173.895 -173.9 -173.905 -173.91 -173.915 -173.92 -173.925 -173.93 -173.935 -173.94 -173.945 -173.95 -173.955 -173.96 -173.965 -173.97 -173.975 -173.98 -173.985 -173.99 -173.995 -174 -174.005 -174.01 -174.015 -174.02 -174.025 -174.03 -174.035 -174.04 -174.045 -174.05 -174.055 -174.06 -174.065 -174.07 -174.075 -174.08 -174.085 -174.09 -174.095 -174.1 -174.105 -174.11 -174.115 -174.12 -174.125 -174.13 -174.135 -174.14 -174.145 -174.15 -174.155 -174.16 -174.165 -174.17 -174.175 -174.18 -174.185 -174.19 -174.195 -174.2 -174.205 -174.21 -174.215 -174.22 -174.225 -174.23 -174.235 -174.24 -174.245 -174.25 -174.255 -174.26 -174.265 -174.27 -174.275 -174.28 -174.285 -174.29 -174.295 -174.3 -174.305 -174.31 -174.315 -174.32 -174.325 -174.33 -174.335 -174.34 -174.345 -174.35 -174.355 -174.36 -174.365 -174.37 -174.375 -174.38 -174.385 -174.39 -174.395 -174.4 -174.405 -174.41 -174.415 -174.42 -174.425 -174.43 -174.435 -174.44 -174.445 -174.45 -174.455 -174.46 -174.465 -174.47 -174.475 -174.48 -174.485 -174.49 -174.495 -174.5 -174.505 -174.51 -174.515 -174.52 -174.525 -174.53 -174.535 -174.54 -174.545 -174.55 -174.555 -174.56 -174.565 -174.57 -174.575 -174.58 -174.585 -174.59 -174.595 -174.6 -174.605 -174.61 -174.615 -174.62 -174.625 -174.63 -174.635 -174.64 -174.645 -174.65 -174.655 -174.66 -174.665 -174.67 -174.675 -174.68 -174.685 -174.69 -174.695 -174.7 -174.705 -174.71 -174.715 -174.72 -174.725 -174.73 -174.735 -174.74 -174.745 -174.75 -174.755 -174.76 -174.765 -174.77 -174.775 -174.78 -174.785 -174.79 -174.795 -174.8 -174.805 -174.81 -174.815 -174.82 -174.825 -174.83 -174.835 -174.84 -174.845 -174.85 -174.855 -174.86 -174.865 -174.87 -174.875 -174.88 -174.885 -174.89 -174.895 -174.9 -174.905 -174.91 -174.915 -174.92 -174.925 -174.93 -174.935 -174.94 -174.945 -174.95 -174.955 -174.96 -174.965 -174.97 -174.975 -174.98 -174.985 -174.99 -174.995 -175 -175.005 -175.01 -175.015 -175.02 -175.025 -175.03 -175.035 -175.04 -175.045 -175.05 -175.055 -175.06 -175.065 -175.07 -175.075 -175.08 -175.085 -175.09 -175.095 -175.1 -175.105 -175.11 -175.115 -175.12 -175.125 -175.13 -175.135 -175.14 -175.145 -175.15 -175.155 -175.16 -175.165 -175.17 -175.175 -175.18 -175.185 -175.19 -175.195 -175.2 -175.205 -175.21 -175.215 -175.22 -175.225 -175.23 -175.235 -175.24 -175.245 -175.25 -175.255 -175.26 -175.265 -175.27 -175.275 -175.28 -175.285 -175.29 -175.295 -175.3 -175.305 -175.31 -175.315 -175.32 -175.325 -175.33 -175.335 -175.34 -175.345 -175.35 -175.355 -175.36 -175.365 -175.37 -175.375 -175.38 -175.385 -175.39 -175.395 -175.4 -175.405 -175.41 -175.415 -175.42 -175.425 -175.43 -175.435 -175.44 -175.445 -175.45 -175.455 -175.46 -175.465 -175.47 -175.475 -175.48 -175.485 -175.49 -175.495 -175.5 -175.505 -175.51 -175.515 -175.52 -175.525 -175.53 -175.535 -175.54 -175.545 -175.55 -175.555 -175.56 -175.565 -175.57 -175.575 -175.58 -175.585 -175.59 -175.595 -175.6 -175.605 -175.61 -175.615 -175.62 -175.625 -175.63 -175.635 -175.64 -175.645 -175.65 -175.655 -175.66 -175.665 -175.67 -175.675 -175.68 -175.685 -175.69 -175.695 -175.7 -175.705 -175.71 -175.715 -175.72 -175.725 -175.73 -175.735 -175.74 -175.745 -175.75 -175.755 -175.76 -175.765 -175.77 -175.775 -175.78 -175.785 -175.79 -175.795 -175.8 -175.805 -175.81 -175.815 -175.82 -175.825 -175.83 -175.835 -175.84 -175.845 -175.85 -175.855 -175.86 -175.865 -175.87 -175.875 -175.88 -175.885 -175.89 -175.895 -175.9 -175.905 -175.91 -175.915 -175.92 -175.925 -175.93 -175.935 -175.94 -175.945 -175.95 -175.955 -175.96 -175.965 -175.97 -175.975 -175.98 -175.985 -175.99 -175.995 -176 -176.005 -176.01 -176.015 -176.02 -176.025 -176.03 -176.035 -176.04 -176.045 -176.05 -176.055 -176.06 -176.065 -176.07 -176.075 -176.08 -176.085 -176.09 -176.095 -176.1 -176.105 -176.11 -176.115 -176.12 -176.125 -176.13 -176.135 -176.14 -176.145 -176.15 -176.155 -176.16 -176.165 -176.17 -176.175 -176.18 -176.185 -176.19 -176.195 -176.2 -176.205 -176.21 -176.215 -176.22 -176.225 -176.23 -176.235 -176.24 -176.245 -176.25 -176.255 -176.26 -176.265 -176.27 -176.275 -176.28 -176.285 -176.29 -176.295 -176.3 -176.305 -176.31 -176.315 -176.32 -176.325 -176.33 -176.335 -176.34 -176.345 -176.35 -176.355 -176.36 -176.365 -176.37 -176.375 -176.38 -176.385 -176.39 -176.395 -176.4 -176.405 -176.41 -176.415 -176.42 -176.425 -176.43 -176.435 -176.44 -176.445 -176.45 -176.455 -176.46 -176.465 -176.47 -176.475 -176.48 -176.485 -176.49 -176.495 -176.5 -176.505 -176.51 -176.515 -176.52 -176.525 -176.53 -176.535 -176.54 -176.545 -176.55 -176.555 -176.56 -176.565 -176.57 -176.575 -176.58 -176.585 -176.59 -176.595 -176.6 -176.605 -176.61 -176.615 -176.62 -176.625 -176.63 -176.635 -176.64 -176.645 -176.65 -176.655 -176.66 -176.665 -176.67 -176.675 -176.68 -176.685 -176.69 -176.695 -176.7 -176.705 -176.71 -176.715 -176.72 -176.725 -176.73 -176.735 -176.74 -176.745 -176.75 -176.755 -176.76 -176.765 -176.77 -176.775 -176.78 -176.785 -176.79 -176.795 -176.8 -176.805 -176.81 -176.815 -176.82 -176.825 -176.83 -176.835 -176.84 -176.845 -176.85 -176.855 -176.86 -176.865 -176.87 -176.875 -176.88 -176.885 -176.89 -176.895 -176.9 -176.905 -176.91 -176.915 -176.92 -176.925 -176.93 -176.935 -176.94 -176.945 -176.95 -176.955 -176.96 -176.965 -176.97 -176.975 -176.98 -176.985 -176.99 -176.995 -177 -177.005 -177.01 -177.015 -177.02 -177.025 -177.03 -177.035 -177.04 -177.045 -177.05 -177.055 -177.06 -177.065 -177.07 -177.075 -177.08 -177.085 -177.09 -177.095 -177.1 -177.105 -177.11 -177.115 -177.12 -177.125 -177.13 -177.135 -177.14 -177.145 -177.15 -177.155 -177.16 -177.165 -177.17 -177.175 -177.18 -177.185 -177.19 -177.195 -177.2 -177.205 -177.21 -177.215 -177.22 -177.225 -177.23 -177.235 -177.24 -177.245 -177.25 -177.255 -177.26 -177.265 -177.27 -177.275 -177.28 -177.285 -177.29 -177.295 -177.3 -177.305 -177.31 -177.315 -177.32 -177.325 -177.33 -177.335 -177.34 -177.345 -177.35 -177.355 -177.36 -177.365 -177.37 -177.375 -177.38 -177.385 -177.39 -177.395 -177.4 -177.405 -177.41 -177.415 -177.42 -177.425 -177.43 -177.435 -177.44 -177.445 -177.45 -177.455 -177.46 -177.465 -177.47 -177.475 -177.48 -177.485 -177.49 -177.495 -177.5 -177.505 -177.51 -177.515 -177.52 -177.525 -177.53 -177.535 -177.54 -177.545 -177.55 -177.555 -177.56 -177.565 -177.57 -177.575 -177.58 -177.585 -177.59 -177.595 -177.6 -177.605 -177.61 -177.615 -177.62 -177.625 -177.63 -177.635 -177.64 -177.645 -177.65 -177.655 -177.66 -177.665 -177.67 -177.675 -177.68 -177.685 -177.69 -177.695 -177.7 -177.705 -177.71 -177.715 -177.72 -177.725 -177.73 -177.735 -177.74 -177.745 -177.75 -177.755 -177.76 -177.765 -177.77 -177.775 -177.78 -177.785 -177.79 -177.795 -177.8 -177.805 -177.81 -177.815 -177.82 -177.825 -177.83 -177.835 -177.84 -177.845 -177.85 -177.855 -177.86 -177.865 -177.87 -177.875 -177.88 -177.885 -177.89 -177.895 -177.9 -177.905 -177.91 -177.915 -177.92 -177.925 -177.93 -177.935 -177.94 -177.945 -177.95 -177.955 -177.96 -177.965 -177.97 -177.975 -177.98 -177.985 -177.99 -177.995 -178 -178.005 -178.01 -178.015 -178.02 -178.025 -178.03 -178.035 -178.04 -178.045 -178.05 -178.055 -178.06 -178.065 -178.07 -178.075 -178.08 -178.085 -178.09 -178.095 -178.1 -178.105 -178.11 -178.115 -178.12 -178.125 -178.13 -178.135 -178.14 -178.145 -178.15 -178.155 -178.16 -178.165 -178.17 -178.175 -178.18 -178.185 -178.19 -178.195 -178.2 -178.205 -178.21 -178.215 -178.22 -178.225 -178.23 -178.235 -178.24 -178.245 -178.25 -178.255 -178.26 -178.265 -178.27 -178.275 -178.28 -178.285 -178.29 -178.295 -178.3 -178.305 -178.31 -178.315 -178.32 -178.325 -178.33 -178.335 -178.34 -178.345 -178.35 -178.355 -178.36 -178.365 -178.37 -178.375 -178.38 -178.385 -178.39 -178.395 -178.4 -178.405 -178.41 -178.415 -178.42 -178.425 -178.43 -178.435 -178.44 -178.445 -178.45 -178.455 -178.46 -178.465 -178.47 -178.475 -178.48 -178.485 -178.49 -178.495 -178.5 -178.505 -178.51 -178.515 -178.52 -178.525 -178.53 -178.535 -178.54 -178.545 -178.55 -178.555 -178.56 -178.565 -178.57 -178.575 -178.58 -178.585 -178.59 -178.595 -178.6 -178.605 -178.61 -178.615 -178.62 -178.625 -178.63 -178.635 -178.64 -178.645 -178.65 -178.655 -178.66 -178.665 -178.67 -178.675 -178.68 -178.685 -178.69 -178.695 -178.7 -178.705 -178.71 -178.715 -178.72 -178.725 -178.73 -178.735 -178.74 -178.745 -178.75 -178.755 -178.76 -178.765 -178.77 -178.775 -178.78 -178.785 -178.79 -178.795 -178.8 -178.805 -178.81 -178.815 -178.82 -178.825 -178.83 -178.835 -178.84 -178.845 -178.85 -178.855 -178.86 -178.865 -178.87 -178.875 -178.88 -178.885 -178.89 -178.895 -178.9 -178.905 -178.91 -178.915 -178.92 -178.925 -178.93 -178.935 -178.94 -178.945 -178.95 -178.955 -178.96 -178.965 -178.97 -178.975 -178.98 -178.985 -178.99 -178.995 -179 -179.005 -179.01 -179.015 -179.02 -179.025 -179.03 -179.035 -179.04 -179.045 -179.05 -179.055 -179.06 -179.065 -179.07 -179.075 -179.08 -179.085 -179.09 -179.095 -179.1 -179.105 -179.11 -179.115 -179.12 -179.125 -179.13 -179.135 -179.14 -179.145 -179.15 -179.155 -179.16 -179.165 -179.17 -179.175 -179.18 -179.185 -179.19 -179.195 -179.2 -179.205 -179.21 -179.215 -179.22 -179.225 -179.23 -179.235 -179.24 -179.245 -179.25 -179.255 -179.26 -179.265 -179.27 -179.275 -179.28 -179.285 -179.29 -179.295 -179.3 -179.305 -179.31 -179.315 -179.32 -179.325 -179.33 -179.335 -179.34 -179.345 -179.35 -179.355 -179.36 -179.365 -179.37 -179.375 -179.38 -179.385 -179.39 -179.395 -179.4 -179.405 -179.41 -179.415 -179.42 -179.425 -179.43 -179.435 -179.44 -179.445 -179.45 -179.455 -179.46 -179.465 -179.47 -179.475 -179.48 -179.485 -179.49 -179.495 -179.5 -179.505 -179.51 -179.515 -179.52 -179.525 -179.53 -179.535 -179.54 -179.545 -179.55 -179.555 -179.56 -179.565 -179.57 -179.575 -179.58 -179.585 -179.59 -179.595 -179.6 -179.605 -179.61 -179.615 -179.62 -179.625 -179.63 -179.635 -179.64 -179.645 -179.65 -179.655 -179.66 -179.665 -179.67 -179.675 -179.68 -179.685 -179.69 -179.695 -179.7 -179.705 -179.71 -179.715 -179.72 -179.725 -179.73 -179.735 -179.74 -179.745 -179.75 -179.755 -179.76 -179.765 -179.77 -179.775 -179.78 -179.785 -179.79 -179.795 -179.8 -179.805 -179.81 -179.815 -179.82 -179.825 -179.83 -179.835 -179.84 -179.845 -179.85 -179.855 -179.86 -179.865 -179.87 -179.875 -179.88 -179.885 -179.89 -179.895 -179.9 -179.905 -179.91 -179.915 -179.92 -179.925 -179.93 -179.935 -179.94 -179.945 -179.95 -179.955 -179.96 -179.965 -179.97 -179.975 -179.98 -179.985 -179.99 -179.995 -180 -180.005 -180.01 -180.015 -180.02 -180.025 -180.03 -180.035 -180.04 -180.045 -180.05 -180.055 -180.06 -180.065 -180.07 -180.075 -180.08 -180.085 -180.09 -180.095 -180.1 -180.105 -180.11 -180.115 -180.12 -180.125 -180.13 -180.135 -180.14 -180.145 -180.15 -180.155 -180.16 -180.165 -180.17 -180.175 -180.18 -180.185 -180.19 -180.195 -180.2 -180.205 -180.21 -180.215 -180.22 -180.225 -180.23 -180.235 -180.24 -180.245 -180.25 -180.255 -180.26 -180.265 -180.27 -180.275 -180.28 -180.285 -180.29 -180.295 -180.3 -180.305 -180.31 -180.315 -180.32 -180.325 -180.33 -180.335 -180.34 -180.345 -180.35 -180.355 -180.36 -180.365 -180.37 -180.375 -180.38 -180.385 -180.39 -180.395 -180.4 -180.405 -180.41 -180.415 -180.42 -180.425 -180.43 -180.435 -180.44 -180.445 -180.45 -180.455 -180.46 -180.465 -180.47 -180.475 -180.48 -180.485 -180.49 -180.495 -180.5 -180.505 -180.51 -180.515 -180.52 -180.525 -180.53 -180.535 -180.54 -180.545 -180.55 -180.555 -180.56 -180.565 -180.57 -180.575 -180.58 -180.585 -180.59 -180.595 -180.6 -180.605 -180.61 -180.615 -180.62 -180.625 -180.63 -180.635 -180.64 -180.645 -180.65 -180.655 -180.66 -180.665 -180.67 -180.675 -180.68 -180.685 -180.69 -180.695 -180.7 -180.705 -180.71 -180.715 -180.72 -180.725 -180.73 -180.735 -180.74 -180.745 -180.75 -180.755 -180.76 -180.765 -180.77 -180.775 -180.78 -180.785 -180.79 -180.795 -180.8 -180.805 -180.81 -180.815 -180.82 -180.825 -180.83 -180.835 -180.84 -180.845 -180.85 -180.855 -180.86 -180.865 -180.87 -180.875 -180.88 -180.885 -180.89 -180.895 -180.9 -180.905 -180.91 -180.915 -180.92 -180.925 -180.93 -180.935 -180.94 -180.945 -180.95 -180.955 -180.96 -180.965 -180.97 -180.975 -180.98 -180.985 -180.99 -180.995 -181 -181.005 -181.01 -181.015 -181.02 -181.025 -181.03 -181.035 -181.04 -181.045 -181.05 -181.055 -181.06 -181.065 -181.07 -181.075 -181.08 -181.085 -181.09 -181.095 -181.1 -181.105 -181.11 -181.115 -181.12 -181.125 -181.13 -181.135 -181.14 -181.145 -181.15 -181.155 -181.16 -181.165 -181.17 -181.175 -181.18 -181.185 -181.19 -181.195 -181.2 -181.205 -181.21 -181.215 -181.22 -181.225 -181.23 -181.235 -181.24 -181.245 -181.25 -181.255 -181.26 -181.265 -181.27 -181.275 -181.28 -181.285 -181.29 -181.295 -181.3 -181.305 -181.31 -181.315 -181.32 -181.325 -181.33 -181.335 -181.34 -181.345 -181.35 -181.355 -181.36 -181.365 -181.37 -181.375 -181.38 -181.385 -181.39 -181.395 -181.4 -181.405 -181.41 -181.415 -181.42 -181.425 -181.43 -181.435 -181.44 -181.445 -181.45 -181.455 -181.46 -181.465 -181.47 -181.475 -181.48 -181.485 -181.49 -181.495 -181.5 -181.505 -181.51 -181.515 -181.52 -181.525 -181.53 -181.535 -181.54 -181.545 -181.55 -181.555 -181.56 -181.565 -181.57 -181.575 -181.58 -181.585 -181.59 -181.595 -181.6 -181.605 -181.61 -181.615 -181.62 -181.625 -181.63 -181.635 -181.64 -181.645 -181.65 -181.655 -181.66 -181.665 -181.67 -181.675 -181.68 -181.685 -181.69 -181.695 -181.7 -181.705 -181.71 -181.715 -181.72 -181.725 -181.73 -181.735 -181.74 -181.745 -181.75 -181.755 -181.76 -181.765 -181.77 -181.775 -181.78 -181.785 -181.79 -181.795 -181.8 -181.805 -181.81 -181.815 -181.82 -181.825 -181.83 -181.835 -181.84 -181.845 -181.85 -181.855 -181.86 -181.865 -181.87 -181.875 -181.88 -181.885 -181.89 -181.895 -181.9 -181.905 -181.91 -181.915 -181.92 -181.925 -181.93 -181.935 -181.94 -181.945 -181.95 -181.955 -181.96 -181.965 -181.97 -181.975 -181.98 -181.985 -181.99 -181.995 -182 -182.005 -182.01 -182.015 -182.02 -182.025 -182.03 -182.035 -182.04 -182.045 -182.05 -182.055 -182.06 -182.065 -182.07 -182.075 -182.08 -182.085 -182.09 -182.095 -182.1 -182.105 -182.11 -182.115 -182.12 -182.125 -182.13 -182.135 -182.14 -182.145 -182.15 -182.155 -182.16 -182.165 -182.17 -182.175 -182.18 -182.185 -182.19 -182.195 -182.2 -182.205 -182.21 -182.215 -182.22 -182.225 -182.23 -182.235 -182.24 -182.245 -182.25 -182.255 -182.26 -182.265 -182.27 -182.275 -182.28 -182.285 -182.29 -182.295 -182.3 -182.305 -182.31 -182.315 -182.32 -182.325 -182.33 -182.335 -182.34 -182.345 -182.35 -182.355 -182.36 -182.365 -182.37 -182.375 -182.38 -182.385 -182.39 -182.395 -182.4 -182.405 -182.41 -182.415 -182.42 -182.425 -182.43 -182.435 -182.44 -182.445 -182.45 -182.455 -182.46 -182.465 -182.47 -182.475 -182.48 -182.485 -182.49 -182.495 -182.5 -182.505 -182.51 -182.515 -182.52 -182.525 -182.53 -182.535 -182.54 -182.545 -182.55 -182.555 -182.56 -182.565 -182.57 -182.575 -182.58 -182.585 -182.59 -182.595 -182.6 -182.605 -182.61 -182.615 -182.62 -182.625 -182.63 -182.635 -182.64 -182.645 -182.65 -182.655 -182.66 -182.665 -182.67 -182.675 -182.68 -182.685 -182.69 -182.695 -182.7 -182.705 -182.71 -182.715 -182.72 -182.725 -182.73 -182.735 -182.74 -182.745 -182.75 -182.755 -182.76 -182.765 -182.77 -182.775 -182.78 -182.785 -182.79 -182.795 -182.8 -182.805 -182.81 -182.815 -182.82 -182.825 -182.83 -182.835 -182.84 -182.845 -182.85 -182.855 -182.86 -182.865 -182.87 -182.875 -182.88 -182.885 -182.89 -182.895 -182.9 -182.905 -182.91 -182.915 -182.92 -182.925 -182.93 -182.935 -182.94 -182.945 -182.95 -182.955 -182.96 -182.965 -182.97 -182.975 -182.98 -182.985 -182.99 -182.995 -183 -183.005 -183.01 -183.015 -183.02 -183.025 -183.03 -183.035 -183.04 -183.045 -183.05 -183.055 -183.06 -183.065 -183.07 -183.075 -183.08 -183.085 -183.09 -183.095 -183.1 -183.105 -183.11 -183.115 -183.12 -183.125 -183.13 -183.135 -183.14 -183.145 -183.15 -183.155 -183.16 -183.165 -183.17 -183.175 -183.18 -183.185 -183.19 -183.195 -183.2 -183.205 -183.21 -183.215 -183.22 -183.225 -183.23 -183.235 -183.24 -183.245 -183.25 -183.255 -183.26 -183.265 -183.27 -183.275 -183.28 -183.285 -183.29 -183.295 -183.3 -183.305 -183.31 -183.315 -183.32 -183.325 -183.33 -183.335 -183.34 -183.345 -183.35 -183.355 -183.36 -183.365 -183.37 -183.375 -183.38 -183.385 -183.39 -183.395 -183.4 -183.405 -183.41 -183.415 -183.42 -183.425 -183.43 -183.435 -183.44 -183.445 -183.45 -183.455 -183.46 -183.465 -183.47 -183.475 -183.48 -183.485 -183.49 -183.495 -183.5 -183.505 -183.51 -183.515 -183.52 -183.525 -183.53 -183.535 -183.54 -183.545 -183.55 -183.555 -183.56 -183.565 -183.57 -183.575 -183.58 -183.585 -183.59 -183.595 -183.6 -183.605 -183.61 -183.615 -183.62 -183.625 -183.63 -183.635 -183.64 -183.645 -183.65 -183.655 -183.66 -183.665 -183.67 -183.675 -183.68 -183.685 -183.69 -183.695 -183.7 -183.705 -183.71 -183.715 -183.72 -183.725 -183.73 -183.735 -183.74 -183.745 -183.75 -183.755 -183.76 -183.765 -183.77 -183.775 -183.78 -183.785 -183.79 -183.795 -183.8 -183.805 -183.81 -183.815 -183.82 -183.825 -183.83 -183.835 -183.84 -183.845 -183.85 -183.855 -183.86 -183.865 -183.87 -183.875 -183.88 -183.885 -183.89 -183.895 -183.9 -183.905 -183.91 -183.915 -183.92 -183.925 -183.93 -183.935 -183.94 -183.945 -183.95 -183.955 -183.96 -183.965 -183.97 -183.975 -183.98 -183.985 -183.99 -183.995 -184 -184.005 -184.01 -184.015 -184.02 -184.025 -184.03 -184.035 -184.04 -184.045 -184.05 -184.055 -184.06 -184.065 -184.07 -184.075 -184.08 -184.085 -184.09 -184.095 -184.1 -184.105 -184.11 -184.115 -184.12 -184.125 -184.13 -184.135 -184.14 -184.145 -184.15 -184.155 -184.16 -184.165 -184.17 -184.175 -184.18 -184.185 -184.19 -184.195 -184.2 -184.205 -184.21 -184.215 -184.22 -184.225 -184.23 -184.235 -184.24 -184.245 -184.25 -184.255 -184.26 -184.265 -184.27 -184.275 -184.28 -184.285 -184.29 -184.295 -184.3 -184.305 -184.31 -184.315 -184.32 -184.325 -184.33 -184.335 -184.34 -184.345 -184.35 -184.355 -184.36 -184.365 -184.37 -184.375 -184.38 -184.385 -184.39 -184.395 -184.4 -184.405 -184.41 -184.415 -184.42 -184.425 -184.43 -184.435 -184.44 -184.445 -184.45 -184.455 -184.46 -184.465 -184.47 -184.475 -184.48 -184.485 -184.49 -184.495 -184.5 -184.505 -184.51 -184.515 -184.52 -184.525 -184.53 -184.535 -184.54 -184.545 -184.55 -184.555 -184.56 -184.565 -184.57 -184.575 -184.58 -184.585 -184.59 -184.595 -184.6 -184.605 -184.61 -184.615 -184.62 -184.625 -184.63 -184.635 -184.64 -184.645 -184.65 -184.655 -184.66 -184.665 -184.67 -184.675 -184.68 -184.685 -184.69 -184.695 -184.7 -184.705 -184.71 -184.715 -184.72 -184.725 -184.73 -184.735 -184.74 -184.745 -184.75 -184.755 -184.76 -184.765 -184.77 -184.775 -184.78 -184.785 -184.79 -184.795 -184.8 -184.805 -184.81 -184.815 -184.82 -184.825 -184.83 -184.835 -184.84 -184.845 -184.85 -184.855 -184.86 -184.865 -184.87 -184.875 -184.88 -184.885 -184.89 -184.895 -184.9 -184.905 -184.91 -184.915 -184.92 -184.925 -184.93 -184.935 -184.94 -184.945 -184.95 -184.955 -184.96 -184.965 -184.97 -184.975 -184.98 -184.985 -184.99 -184.995 -185 -185.005 -185.01 -185.015 -185.02 -185.025 -185.03 -185.035 -185.04 -185.045 -185.05 -185.055 -185.06 -185.065 -185.07 -185.075 -185.08 -185.085 -185.09 -185.095 -185.1 -185.105 -185.11 -185.115 -185.12 -185.125 -185.13 -185.135 -185.14 -185.145 -185.15 -185.155 -185.16 -185.165 -185.17 -185.175 -185.18 -185.185 -185.19 -185.195 -185.2 -185.205 -185.21 -185.215 -185.22 -185.225 -185.23 -185.235 -185.24 -185.245 -185.25 -185.255 -185.26 -185.265 -185.27 -185.275 -185.28 -185.285 -185.29 -185.295 -185.3 -185.305 -185.31 -185.315 -185.32 -185.325 -185.33 -185.335 -185.34 -185.345 -185.35 -185.355 -185.36 -185.365 -185.37 -185.375 -185.38 -185.385 -185.39 -185.395 -185.4 -185.405 -185.41 -185.415 -185.42 -185.425 -185.43 -185.435 -185.44 -185.445 -185.45 -185.455 -185.46 -185.465 -185.47 -185.475 -185.48 -185.485 -185.49 -185.495 -185.5 -185.505 -185.51 -185.515 -185.52 -185.525 -185.53 -185.535 -185.54 -185.545 -185.55 -185.555 -185.56 -185.565 -185.57 -185.575 -185.58 -185.585 -185.59 -185.595 -185.6 -185.605 -185.61 -185.615 -185.62 -185.625 -185.63 -185.635 -185.64 -185.645 -185.65 -185.655 -185.66 -185.665 -185.67 -185.675 -185.68 -185.685 -185.69 -185.695 -185.7 -185.705 -185.71 -185.715 -185.72 -185.725 -185.73 -185.735 -185.74 -185.745 -185.75 -185.755 -185.76 -185.765 -185.77 -185.775 -185.78 -185.785 -185.79 -185.795 -185.8 -185.805 -185.81 -185.815 -185.82 -185.825 -185.83 -185.835 -185.84 -185.845 -185.85 -185.855 -185.86 -185.865 -185.87 -185.875 -185.88 -185.885 -185.89 -185.895 -185.9 -185.905 -185.91 -185.915 -185.92 -185.925 -185.93 -185.935 -185.94 -185.945 -185.95 -185.955 -185.96 -185.965 -185.97 -185.975 -185.98 -185.985 -185.99 -185.995 -186 -186.005 -186.01 -186.015 -186.02 -186.025 -186.03 -186.035 -186.04 -186.045 -186.05 -186.055 -186.06 -186.065 -186.07 -186.075 -186.08 -186.085 -186.09 -186.095 -186.1 -186.105 -186.11 -186.115 -186.12 -186.125 -186.13 -186.135 -186.14 -186.145 -186.15 -186.155 -186.16 -186.165 -186.17 -186.175 -186.18 -186.185 -186.19 -186.195 -186.2 -186.205 -186.21 -186.215 -186.22 -186.225 -186.23 -186.235 -186.24 -186.245 -186.25 -186.255 -186.26 -186.265 -186.27 -186.275 -186.28 -186.285 -186.29 -186.295 -186.3 -186.305 -186.31 -186.315 -186.32 -186.325 -186.33 -186.335 -186.34 -186.345 -186.35 -186.355 -186.36 -186.365 -186.37 -186.375 -186.38 -186.385 -186.39 -186.395 -186.4 -186.405 -186.41 -186.415 -186.42 -186.425 -186.43 -186.435 -186.44 -186.445 -186.45 -186.455 -186.46 -186.465 -186.47 -186.475 -186.48 -186.485 -186.49 -186.495 -186.5 -186.505 -186.51 -186.515 -186.52 -186.525 -186.53 -186.535 -186.54 -186.545 -186.55 -186.555 -186.56 -186.565 -186.57 -186.575 -186.58 -186.585 -186.59 -186.595 -186.6 -186.605 -186.61 -186.615 -186.62 -186.625 -186.63 -186.635 -186.64 -186.645 -186.65 -186.655 -186.66 -186.665 -186.67 -186.675 -186.68 -186.685 -186.69 -186.695 -186.7 -186.705 -186.71 -186.715 -186.72 -186.725 -186.73 -186.735 -186.74 -186.745 -186.75 -186.755 -186.76 -186.765 -186.77 -186.775 -186.78 -186.785 -186.79 -186.795 -186.8 -186.805 -186.81 -186.815 -186.82 -186.825 -186.83 -186.835 -186.84 -186.845 -186.85 -186.855 -186.86 -186.865 -186.87 -186.875 -186.88 -186.885 -186.89 -186.895 -186.9 -186.905 -186.91 -186.915 -186.92 -186.925 -186.93 -186.935 -186.94 -186.945 -186.95 -186.955 -186.96 -186.965 -186.97 -186.975 -186.98 -186.985 -186.99 -186.995 -187 -187.005 -187.01 -187.015 -187.02 -187.025 -187.03 -187.035 -187.04 -187.045 -187.05 -187.055 -187.06 -187.065 -187.07 -187.075 -187.08 -187.085 -187.09 -187.095 -187.1 -187.105 -187.11 -187.115 -187.12 -187.125 -187.13 -187.135 -187.14 -187.145 -187.15 -187.155 -187.16 -187.165 -187.17 -187.175 -187.18 -187.185 -187.19 -187.195 -187.2 -187.205 -187.21 -187.215 -187.22 -187.225 -187.23 -187.235 -187.24 -187.245 -187.25 -187.255 -187.26 -187.265 -187.27 -187.275 -187.28 -187.285 -187.29 -187.295 -187.3 -187.305 -187.31 -187.315 -187.32 -187.325 -187.33 -187.335 -187.34 -187.345 -187.35 -187.355 -187.36 -187.365 -187.37 -187.375 -187.38 -187.385 -187.39 -187.395 -187.4 -187.405 -187.41 -187.415 -187.42 -187.425 -187.43 -187.435 -187.44 -187.445 -187.45 -187.455 -187.46 -187.465 -187.47 -187.475 -187.48 -187.485 -187.49 -187.495 -187.5 -187.505 -187.51 -187.515 -187.52 -187.525 -187.53 -187.535 -187.54 -187.545 -187.55 -187.555 -187.56 -187.565 -187.57 -187.575 -187.58 -187.585 -187.59 -187.595 -187.6 -187.605 -187.61 -187.615 -187.62 -187.625 -187.63 -187.635 -187.64 -187.645 -187.65 -187.655 -187.66 -187.665 -187.67 -187.675 -187.68 -187.685 -187.69 -187.695 -187.7 -187.705 -187.71 -187.715 -187.72 -187.725 -187.73 -187.735 -187.74 -187.745 -187.75 -187.755 -187.76 -187.765 -187.77 -187.775 -187.78 -187.785 -187.79 -187.795 -187.8 -187.805 -187.81 -187.815 -187.82 -187.825 -187.83 -187.835 -187.84 -187.845 -187.85 -187.855 -187.86 -187.865 -187.87 -187.875 -187.88 -187.885 -187.89 -187.895 -187.9 -187.905 -187.91 -187.915 -187.92 -187.925 -187.93 -187.935 -187.94 -187.945 -187.95 -187.955 -187.96 -187.965 -187.97 -187.975 -187.98 -187.985 -187.99 -187.995 -188 -188.005 -188.01 -188.015 -188.02 -188.025 -188.03 -188.035 -188.04 -188.045 -188.05 -188.055 -188.06 -188.065 -188.07 -188.075 -188.08 -188.085 -188.09 -188.095 -188.1 -188.105 -188.11 -188.115 -188.12 -188.125 -188.13 -188.135 -188.14 -188.145 -188.15 -188.155 -188.16 -188.165 -188.17 -188.175 -188.18 -188.185 -188.19 -188.195 -188.2 -188.205 -188.21 -188.215 -188.22 -188.225 -188.23 -188.235 -188.24 -188.245 -188.25 -188.255 -188.26 -188.265 -188.27 -188.275 -188.28 -188.285 -188.29 -188.295 -188.3 -188.305 -188.31 -188.315 -188.32 -188.325 -188.33 -188.335 -188.34 -188.345 -188.35 -188.355 -188.36 -188.365 -188.37 -188.375 -188.38 -188.385 -188.39 -188.395 -188.4 -188.405 -188.41 -188.415 -188.42 -188.425 -188.43 -188.435 -188.44 -188.445 -188.45 -188.455 -188.46 -188.465 -188.47 -188.475 -188.48 -188.485 -188.49 -188.495 -188.5 -188.505 -188.51 -188.515 -188.52 -188.525 -188.53 -188.535 -188.54 -188.545 -188.55 -188.555 -188.56 -188.565 -188.57 -188.575 -188.58 -188.585 -188.59 -188.595 -188.6 -188.605 -188.61 -188.615 -188.62 -188.625 -188.63 -188.635 -188.64 -188.645 -188.65 -188.655 -188.66 -188.665 -188.67 -188.675 -188.68 -188.685 -188.69 -188.695 -188.7 -188.705 -188.71 -188.715 -188.72 -188.725 -188.73 -188.735 -188.74 -188.745 -188.75 -188.755 -188.76 -188.765 -188.77 -188.775 -188.78 -188.785 -188.79 -188.795 -188.8 -188.805 -188.81 -188.815 -188.82 -188.825 -188.83 -188.835 -188.84 -188.845 -188.85 -188.855 -188.86 -188.865 -188.87 -188.875 -188.88 -188.885 -188.89 -188.895 -188.9 -188.905 -188.91 -188.915 -188.92 -188.925 -188.93 -188.935 -188.94 -188.945 -188.95 -188.955 -188.96 -188.965 -188.97 -188.975 -188.98 -188.985 -188.99 -188.995 -189 -189.005 -189.01 -189.015 -189.02 -189.025 -189.03 -189.035 -189.04 -189.045 -189.05 -189.055 -189.06 -189.065 -189.07 -189.075 -189.08 -189.085 -189.09 -189.095 -189.1 -189.105 -189.11 -189.115 -189.12 -189.125 -189.13 -189.135 -189.14 -189.145 -189.15 -189.155 -189.16 -189.165 -189.17 -189.175 -189.18 -189.185 -189.19 -189.195 -189.2 -189.205 -189.21 -189.215 -189.22 -189.225 -189.23 -189.235 -189.24 -189.245 -189.25 -189.255 -189.26 -189.265 -189.27 -189.275 -189.28 -189.285 -189.29 -189.295 -189.3 -189.305 -189.31 -189.315 -189.32 -189.325 -189.33 -189.335 -189.34 -189.345 -189.35 -189.355 -189.36 -189.365 -189.37 -189.375 -189.38 -189.385 -189.39 -189.395 -189.4 -189.405 -189.41 -189.415 -189.42 -189.425 -189.43 -189.435 -189.44 -189.445 -189.45 -189.455 -189.46 -189.465 -189.47 -189.475 -189.48 -189.485 -189.49 -189.495 -189.5 -189.505 -189.51 -189.515 -189.52 -189.525 -189.53 -189.535 -189.54 -189.545 -189.55 -189.555 -189.56 -189.565 -189.57 -189.575 -189.58 -189.585 -189.59 -189.595 -189.6 -189.605 -189.61 -189.615 -189.62 -189.625 -189.63 -189.635 -189.64 -189.645 -189.65 -189.655 -189.66 -189.665 -189.67 -189.675 -189.68 -189.685 -189.69 -189.695 -189.7 -189.705 -189.71 -189.715 -189.72 -189.725 -189.73 -189.735 -189.74 -189.745 -189.75 -189.755 -189.76 -189.765 -189.77 -189.775 -189.78 -189.785 -189.79 -189.795 -189.8 -189.805 -189.81 -189.815 -189.82 -189.825 -189.83 -189.835 -189.84 -189.845 -189.85 -189.855 -189.86 -189.865 -189.87 -189.875 -189.88 -189.885 -189.89 -189.895 -189.9 -189.905 -189.91 -189.915 -189.92 -189.925 -189.93 -189.935 -189.94 -189.945 -189.95 -189.955 -189.96 -189.965 -189.97 -189.975 -189.98 -189.985 -189.99 -189.995 -190 -190.005 -190.01 -190.015 -190.02 -190.025 -190.03 -190.035 -190.04 -190.045 -190.05 -190.055 -190.06 -190.065 -190.07 -190.075 -190.08 -190.085 -190.09 -190.095 -190.1 -190.105 -190.11 -190.115 -190.12 -190.125 -190.13 -190.135 -190.14 -190.145 -190.15 -190.155 -190.16 -190.165 -190.17 -190.175 -190.18 -190.185 -190.19 -190.195 -190.2 -190.205 -190.21 -190.215 -190.22 -190.225 -190.23 -190.235 -190.24 -190.245 -190.25 -190.255 -190.26 -190.265 -190.27 -190.275 -190.28 -190.285 -190.29 -190.295 -190.3 -190.305 -190.31 -190.315 -190.32 -190.325 -190.33 -190.335 -190.34 -190.345 -190.35 -190.355 -190.36 -190.365 -190.37 -190.375 -190.38 -190.385 -190.39 -190.395 -190.4 -190.405 -190.41 -190.415 -190.42 -190.425 -190.43 -190.435 -190.44 -190.445 -190.45 -190.455 -190.46 -190.465 -190.47 -190.475 -190.48 -190.485 -190.49 -190.495 -190.5 -190.505 -190.51 -190.515 -190.52 -190.525 -190.53 -190.535 -190.54 -190.545 -190.55 -190.555 -190.56 -190.565 -190.57 -190.575 -190.58 -190.585 -190.59 -190.595 -190.6 -190.605 -190.61 -190.615 -190.62 -190.625 -190.63 -190.635 -190.64 -190.645 -190.65 -190.655 -190.66 -190.665 -190.67 -190.675 -190.68 -190.685 -190.69 -190.695 -190.7 -190.705 -190.71 -190.715 -190.72 -190.725 -190.73 -190.735 -190.74 -190.745 -190.75 -190.755 -190.76 -190.765 -190.77 -190.775 -190.78 -190.785 -190.79 -190.795 -190.8 -190.805 -190.81 -190.815 -190.82 -190.825 -190.83 -190.835 -190.84 -190.845 -190.85 -190.855 -190.86 -190.865 -190.87 -190.875 -190.88 -190.885 -190.89 -190.895 -190.9 -190.905 -190.91 -190.915 -190.92 -190.925 -190.93 -190.935 -190.94 -190.945 -190.95 -190.955 -190.96 -190.965 -190.97 -190.975 -190.98 -190.985 -190.99 -190.995 -191 -191.005 -191.01 -191.015 -191.02 -191.025 -191.03 -191.035 -191.04 -191.045 -191.05 -191.055 -191.06 -191.065 -191.07 -191.075 -191.08 -191.085 -191.09 -191.095 -191.1 -191.105 -191.11 -191.115 -191.12 -191.125 -191.13 -191.135 -191.14 -191.145 -191.15 -191.155 -191.16 -191.165 -191.17 -191.175 -191.18 -191.185 -191.19 -191.195 -191.2 -191.205 -191.21 -191.215 -191.22 -191.225 -191.23 -191.235 -191.24 -191.245 -191.25 -191.255 -191.26 -191.265 -191.27 -191.275 -191.28 -191.285 -191.29 -191.295 -191.3 -191.305 -191.31 -191.315 -191.32 -191.325 -191.33 -191.335 -191.34 -191.345 -191.35 -191.355 -191.36 -191.365 -191.37 -191.375 -191.38 -191.385 -191.39 -191.395 -191.4 -191.405 -191.41 -191.415 -191.42 -191.425 -191.43 -191.435 -191.44 -191.445 -191.45 -191.455 -191.46 -191.465 -191.47 -191.475 -191.48 -191.485 -191.49 -191.495 -191.5 -191.505 -191.51 -191.515 -191.52 -191.525 -191.53 -191.535 -191.54 -191.545 -191.55 -191.555 -191.56 -191.565 -191.57 -191.575 -191.58 -191.585 -191.59 -191.595 -191.6 -191.605 -191.61 -191.615 -191.62 -191.625 -191.63 -191.635 -191.64 -191.645 -191.65 -191.655 -191.66 -191.665 -191.67 -191.675 -191.68 -191.685 -191.69 -191.695 -191.7 -191.705 -191.71 -191.715 -191.72 -191.725 -191.73 -191.735 -191.74 -191.745 -191.75 -191.755 -191.76 -191.765 -191.77 -191.775 -191.78 -191.785 -191.79 -191.795 -191.8 -191.805 -191.81 -191.815 -191.82 -191.825 -191.83 -191.835 -191.84 -191.845 -191.85 -191.855 -191.86 -191.865 -191.87 -191.875 -191.88 -191.885 -191.89 -191.895 -191.9 -191.905 -191.91 -191.915 -191.92 -191.925 -191.93 -191.935 -191.94 -191.945 -191.95 -191.955 -191.96 -191.965 -191.97 -191.975 -191.98 -191.985 -191.99 -191.995 -192 -192.005 -192.01 -192.015 -192.02 -192.025 -192.03 -192.035 -192.04 -192.045 -192.05 -192.055 -192.06 -192.065 -192.07 -192.075 -192.08 -192.085 -192.09 -192.095 -192.1 -192.105 -192.11 -192.115 -192.12 -192.125 -192.13 -192.135 -192.14 -192.145 -192.15 -192.155 -192.16 -192.165 -192.17 -192.175 -192.18 -192.185 -192.19 -192.195 -192.2 -192.205 -192.21 -192.215 -192.22 -192.225 -192.23 -192.235 -192.24 -192.245 -192.25 -192.255 -192.26 -192.265 -192.27 -192.275 -192.28 -192.285 -192.29 -192.295 -192.3 -192.305 -192.31 -192.315 -192.32 -192.325 -192.33 -192.335 -192.34 -192.345 -192.35 -192.355 -192.36 -192.365 -192.37 -192.375 -192.38 -192.385 -192.39 -192.395 -192.4 -192.405 -192.41 -192.415 -192.42 -192.425 -192.43 -192.435 -192.44 -192.445 -192.45 -192.455 -192.46 -192.465 -192.47 -192.475 -192.48 -192.485 -192.49 -192.495 -192.5 -192.505 -192.51 -192.515 -192.52 -192.525 -192.53 -192.535 -192.54 -192.545 -192.55 -192.555 -192.56 -192.565 -192.57 -192.575 -192.58 -192.585 -192.59 -192.595 -192.6 -192.605 -192.61 -192.615 -192.62 -192.625 -192.63 -192.635 -192.64 -192.645 -192.65 -192.655 -192.66 -192.665 -192.67 -192.675 -192.68 -192.685 -192.69 -192.695 -192.7 -192.705 -192.71 -192.715 -192.72 -192.725 -192.73 -192.735 -192.74 -192.745 -192.75 -192.755 -192.76 -192.765 -192.77 -192.775 -192.78 -192.785 -192.79 -192.795 -192.8 -192.805 -192.81 -192.815 -192.82 -192.825 -192.83 -192.835 -192.84 -192.845 -192.85 -192.855 -192.86 -192.865 -192.87 -192.875 -192.88 -192.885 -192.89 -192.895 -192.9 -192.905 -192.91 -192.915 -192.92 -192.925 -192.93 -192.935 -192.94 -192.945 -192.95 -192.955 -192.96 -192.965 -192.97 -192.975 -192.98 -192.985 -192.99 -192.995 -193 -193.005 -193.01 -193.015 -193.02 -193.025 -193.03 -193.035 -193.04 -193.045 -193.05 -193.055 -193.06 -193.065 -193.07 -193.075 -193.08 -193.085 -193.09 -193.095 -193.1 -193.105 -193.11 -193.115 -193.12 -193.125 -193.13 -193.135 -193.14 -193.145 -193.15 -193.155 -193.16 -193.165 -193.17 -193.175 -193.18 -193.185 -193.19 -193.195 -193.2 -193.205 -193.21 -193.215 -193.22 -193.225 -193.23 -193.235 -193.24 -193.245 -193.25 -193.255 -193.26 -193.265 -193.27 -193.275 -193.28 -193.285 -193.29 -193.295 -193.3 -193.305 -193.31 -193.315 -193.32 -193.325 -193.33 -193.335 -193.34 -193.345 -193.35 -193.355 -193.36 -193.365 -193.37 -193.375 -193.38 -193.385 -193.39 -193.395 -193.4 -193.405 -193.41 -193.415 -193.42 -193.425 -193.43 -193.435 -193.44 -193.445 -193.45 -193.455 -193.46 -193.465 -193.47 -193.475 -193.48 -193.485 -193.49 -193.495 -193.5 -193.505 -193.51 -193.515 -193.52 -193.525 -193.53 -193.535 -193.54 -193.545 -193.55 -193.555 -193.56 -193.565 -193.57 -193.575 -193.58 -193.585 -193.59 -193.595 -193.6 -193.605 -193.61 -193.615 -193.62 -193.625 -193.63 -193.635 -193.64 -193.645 -193.65 -193.655 -193.66 -193.665 -193.67 -193.675 -193.68 -193.685 -193.69 -193.695 -193.7 -193.705 -193.71 -193.715 -193.72 -193.725 -193.73 -193.735 -193.74 -193.745 -193.75 -193.755 -193.76 -193.765 -193.77 -193.775 -193.78 -193.785 -193.79 -193.795 -193.8 -193.805 -193.81 -193.815 -193.82 -193.825 -193.83 -193.835 -193.84 -193.845 -193.85 -193.855 -193.86 -193.865 -193.87 -193.875 -193.88 -193.885 -193.89 -193.895 -193.9 -193.905 -193.91 -193.915 -193.92 -193.925 -193.93 -193.935 -193.94 -193.945 -193.95 -193.955 -193.96 -193.965 -193.97 -193.975 -193.98 -193.985 -193.99 -193.995 -194 -194.005 -194.01 -194.015 -194.02 -194.025 -194.03 -194.035 -194.04 -194.045 -194.05 -194.055 -194.06 -194.065 -194.07 -194.075 -194.08 -194.085 -194.09 -194.095 -194.1 -194.105 -194.11 -194.115 -194.12 -194.125 -194.13 -194.135 -194.14 -194.145 -194.15 -194.155 -194.16 -194.165 -194.17 -194.175 -194.18 -194.185 -194.19 -194.195 -194.2 -194.205 -194.21 -194.215 -194.22 -194.225 -194.23 -194.235 -194.24 -194.245 -194.25 -194.255 -194.26 -194.265 -194.27 -194.275 -194.28 -194.285 -194.29 -194.295 -194.3 -194.305 -194.31 -194.315 -194.32 -194.325 -194.33 -194.335 -194.34 -194.345 -194.35 -194.355 -194.36 -194.365 -194.37 -194.375 -194.38 -194.385 -194.39 -194.395 -194.4 -194.405 -194.41 -194.415 -194.42 -194.425 -194.43 -194.435 -194.44 -194.445 -194.45 -194.455 -194.46 -194.465 -194.47 -194.475 -194.48 -194.485 -194.49 -194.495 -194.5 -194.505 -194.51 -194.515 -194.52 -194.525 -194.53 -194.535 -194.54 -194.545 -194.55 -194.555 -194.56 -194.565 -194.57 -194.575 -194.58 -194.585 -194.59 -194.595 -194.6 -194.605 -194.61 -194.615 -194.62 -194.625 -194.63 -194.635 -194.64 -194.645 -194.65 -194.655 -194.66 -194.665 -194.67 -194.675 -194.68 -194.685 -194.69 -194.695 -194.7 -194.705 -194.71 -194.715 -194.72 -194.725 -194.73 -194.735 -194.74 -194.745 -194.75 -194.755 -194.76 -194.765 -194.77 -194.775 -194.78 -194.785 -194.79 -194.795 -194.8 -194.805 -194.81 -194.815 -194.82 -194.825 -194.83 -194.835 -194.84 -194.845 -194.85 -194.855 -194.86 -194.865 -194.87 -194.875 -194.88 -194.885 -194.89 -194.895 -194.9 -194.905 -194.91 -194.915 -194.92 -194.925 -194.93 -194.935 -194.94 -194.945 -194.95 -194.955 -194.96 -194.965 -194.97 -194.975 -194.98 -194.985 -194.99 -194.995 -195 -195.005 -195.01 -195.015 -195.02 -195.025 -195.03 -195.035 -195.04 -195.045 -195.05 -195.055 -195.06 -195.065 -195.07 -195.075 -195.08 -195.085 -195.09 -195.095 -195.1 -195.105 -195.11 -195.115 -195.12 -195.125 -195.13 -195.135 -195.14 -195.145 -195.15 -195.155 -195.16 -195.165 -195.17 -195.175 -195.18 -195.185 -195.19 -195.195 -195.2 -195.205 -195.21 -195.215 -195.22 -195.225 -195.23 -195.235 -195.24 -195.245 -195.25 -195.255 -195.26 -195.265 -195.27 -195.275 -195.28 -195.285 -195.29 -195.295 -195.3 -195.305 -195.31 -195.315 -195.32 -195.325 -195.33 -195.335 -195.34 -195.345 -195.35 -195.355 -195.36 -195.365 -195.37 -195.375 -195.38 -195.385 -195.39 -195.395 -195.4 -195.405 -195.41 -195.415 -195.42 -195.425 -195.43 -195.435 -195.44 -195.445 -195.45 -195.455 -195.46 -195.465 -195.47 -195.475 -195.48 -195.485 -195.49 -195.495 -195.5 -195.505 -195.51 -195.515 -195.52 -195.525 -195.53 -195.535 -195.54 -195.545 -195.55 -195.555 -195.56 -195.565 -195.57 -195.575 -195.58 -195.585 -195.59 -195.595 -195.6 -195.605 -195.61 -195.615 -195.62 -195.625 -195.63 -195.635 -195.64 -195.645 -195.65 -195.655 -195.66 -195.665 -195.67 -195.675 -195.68 -195.685 -195.69 -195.695 -195.7 -195.705 -195.71 -195.715 -195.72 -195.725 -195.73 -195.735 -195.74 -195.745 -195.75 -195.755 -195.76 -195.765 -195.77 -195.775 -195.78 -195.785 -195.79 -195.795 -195.8 -195.805 -195.81 -195.815 -195.82 -195.825 -195.83 -195.835 -195.84 -195.845 -195.85 -195.855 -195.86 -195.865 -195.87 -195.875 -195.88 -195.885 -195.89 -195.895 -195.9 -195.905 -195.91 -195.915 -195.92 -195.925 -195.93 -195.935 -195.94 -195.945 -195.95 -195.955 -195.96 -195.965 -195.97 -195.975 -195.98 -195.985 -195.99 -195.995 -196 -196.005 -196.01 -196.015 -196.02 -196.025 -196.03 -196.035 -196.04 -196.045 -196.05 -196.055 -196.06 -196.065 -196.07 -196.075 -196.08 -196.085 -196.09 -196.095 -196.1 -196.105 -196.11 -196.115 -196.12 -196.125 -196.13 -196.135 -196.14 -196.145 -196.15 -196.155 -196.16 -196.165 -196.17 -196.175 -196.18 -196.185 -196.19 -196.195 -196.2 -196.205 -196.21 -196.215 -196.22 -196.225 -196.23 -196.235 -196.24 -196.245 -196.25 -196.255 -196.26 -196.265 -196.27 -196.275 -196.28 -196.285 -196.29 -196.295 -196.3 -196.305 -196.31 -196.315 -196.32 -196.325 -196.33 -196.335 -196.34 -196.345 -196.35 -196.355 -196.36 -196.365 -196.37 -196.375 -196.38 -196.385 -196.39 -196.395 -196.4 -196.405 -196.41 -196.415 -196.42 -196.425 -196.43 -196.435 -196.44 -196.445 -196.45 -196.455 -196.46 -196.465 -196.47 -196.475 -196.48 -196.485 -196.49 -196.495 -196.5 -196.505 -196.51 -196.515 -196.52 -196.525 -196.53 -196.535 -196.54 -196.545 -196.55 -196.555 -196.56 -196.565 -196.57 -196.575 -196.58 -196.585 -196.59 -196.595 -196.6 -196.605 -196.61 -196.615 -196.62 -196.625 -196.63 -196.635 -196.64 -196.645 -196.65 -196.655 -196.66 -196.665 -196.67 -196.675 -196.68 -196.685 -196.69 -196.695 -196.7 -196.705 -196.71 -196.715 -196.72 -196.725 -196.73 -196.735 -196.74 -196.745 -196.75 -196.755 -196.76 -196.765 -196.77 -196.775 -196.78 -196.785 -196.79 -196.795 -196.8 -196.805 -196.81 -196.815 -196.82 -196.825 -196.83 -196.835 -196.84 -196.845 -196.85 -196.855 -196.86 -196.865 -196.87 -196.875 -196.88 -196.885 -196.89 -196.895 -196.9 -196.905 -196.91 -196.915 -196.92 -196.925 -196.93 -196.935 -196.94 -196.945 -196.95 -196.955 -196.96 -196.965 -196.97 -196.975 -196.98 -196.985 -196.99 -196.995 -197 -197.005 -197.01 -197.015 -197.02 -197.025 -197.03 -197.035 -197.04 -197.045 -197.05 -197.055 -197.06 -197.065 -197.07 -197.075 -197.08 -197.085 -197.09 -197.095 -197.1 -197.105 -197.11 -197.115 -197.12 -197.125 -197.13 -197.135 -197.14 -197.145 -197.15 -197.155 -197.16 -197.165 -197.17 -197.175 -197.18 -197.185 -197.19 -197.195 -197.2 -197.205 -197.21 -197.215 -197.22 -197.225 -197.23 -197.235 -197.24 -197.245 -197.25 -197.255 -197.26 -197.265 -197.27 -197.275 -197.28 -197.285 -197.29 -197.295 -197.3 -197.305 -197.31 -197.315 -197.32 -197.325 -197.33 -197.335 -197.34 -197.345 -197.35 -197.355 -197.36 -197.365 -197.37 -197.375 -197.38 -197.385 -197.39 -197.395 -197.4 -197.405 -197.41 -197.415 -197.42 -197.425 -197.43 -197.435 -197.44 -197.445 -197.45 -197.455 -197.46 -197.465 -197.47 -197.475 -197.48 -197.485 -197.49 -197.495 -197.5 -197.505 -197.51 -197.515 -197.52 -197.525 -197.53 -197.535 -197.54 -197.545 -197.55 -197.555 -197.56 -197.565 -197.57 -197.575 -197.58 -197.585 -197.59 -197.595 -197.6 -197.605 -197.61 -197.615 -197.62 -197.625 -197.63 -197.635 -197.64 -197.645 -197.65 -197.655 -197.66 -197.665 -197.67 -197.675 -197.68 -197.685 -197.69 -197.695 -197.7 -197.705 -197.71 -197.715 -197.72 -197.725 -197.73 -197.735 -197.74 -197.745 -197.75 -197.755 -197.76 -197.765 -197.77 -197.775 -197.78 -197.785 -197.79 -197.795 -197.8 -197.805 -197.81 -197.815 -197.82 -197.825 -197.83 -197.835 -197.84 -197.845 -197.85 -197.855 -197.86 -197.865 -197.87 -197.875 -197.88 -197.885 -197.89 -197.895 -197.9 -197.905 -197.91 -197.915 -197.92 -197.925 -197.93 -197.935 -197.94 -197.945 -197.95 -197.955 -197.96 -197.965 -197.97 -197.975 -197.98 -197.985 -197.99 -197.995 -198 -198.005 -198.01 -198.015 -198.02 -198.025 -198.03 -198.035 -198.04 -198.045 -198.05 -198.055 -198.06 -198.065 -198.07 -198.075 -198.08 -198.085 -198.09 -198.095 -198.1 -198.105 -198.11 -198.115 -198.12 -198.125 -198.13 -198.135 -198.14 -198.145 -198.15 -198.155 -198.16 -198.165 -198.17 -198.175 -198.18 -198.185 -198.19 -198.195 -198.2 -198.205 -198.21 -198.215 -198.22 -198.225 -198.23 -198.235 -198.24 -198.245 -198.25 -198.255 -198.26 -198.265 -198.27 -198.275 -198.28 -198.285 -198.29 -198.295 -198.3 -198.305 -198.31 -198.315 -198.32 -198.325 -198.33 -198.335 -198.34 -198.345 -198.35 -198.355 -198.36 -198.365 -198.37 -198.375 -198.38 -198.385 -198.39 -198.395 -198.4 -198.405 -198.41 -198.415 -198.42 -198.425 -198.43 -198.435 -198.44 -198.445 -198.45 -198.455 -198.46 -198.465 -198.47 -198.475 -198.48 -198.485 -198.49 -198.495 -198.5 -198.505 -198.51 -198.515 -198.52 -198.525 -198.53 -198.535 -198.54 -198.545 -198.55 -198.555 -198.56 -198.565 -198.57 -198.575 -198.58 -198.585 -198.59 -198.595 -198.6 -198.605 -198.61 -198.615 -198.62 -198.625 -198.63 -198.635 -198.64 -198.645 -198.65 -198.655 -198.66 -198.665 -198.67 -198.675 -198.68 -198.685 -198.69 -198.695 -198.7 -198.705 -198.71 -198.715 -198.72 -198.725 -198.73 -198.735 -198.74 -198.745 -198.75 -198.755 -198.76 -198.765 -198.77 -198.775 -198.78 -198.785 -198.79 -198.795 -198.8 -198.805 -198.81 -198.815 -198.82 -198.825 -198.83 -198.835 -198.84 -198.845 -198.85 -198.855 -198.86 -198.865 -198.87 -198.875 -198.88 -198.885 -198.89 -198.895 -198.9 -198.905 -198.91 -198.915 -198.92 -198.925 -198.93 -198.935 -198.94 -198.945 -198.95 -198.955 -198.96 -198.965 -198.97 -198.975 -198.98 -198.985 -198.99 -198.995 -199 -199.005 -199.01 -199.015 -199.02 -199.025 -199.03 -199.035 -199.04 -199.045 -199.05 -199.055 -199.06 -199.065 -199.07 -199.075 -199.08 -199.085 -199.09 -199.095 -199.1 -199.105 -199.11 -199.115 -199.12 -199.125 -199.13 -199.135 -199.14 -199.145 -199.15 -199.155 -199.16 -199.165 -199.17 -199.175 -199.18 -199.185 -199.19 -199.195 -199.2 -199.205 -199.21 -199.215 -199.22 -199.225 -199.23 -199.235 -199.24 -199.245 -199.25 -199.255 -199.26 -199.265 -199.27 -199.275 -199.28 -199.285 -199.29 -199.295 -199.3 -199.305 -199.31 -199.315 -199.32 -199.325 -199.33 -199.335 -199.34 -199.345 -199.35 -199.355 -199.36 -199.365 -199.37 -199.375 -199.38 -199.385 -199.39 -199.395 -199.4 -199.405 -199.41 -199.415 -199.42 -199.425 -199.43 -199.435 -199.44 -199.445 -199.45 -199.455 -199.46 -199.465 -199.47 -199.475 -199.48 -199.485 -199.49 -199.495 -199.5 -199.505 -199.51 -199.515 -199.52 -199.525 -199.53 -199.535 -199.54 -199.545 -199.55 -199.555 -199.56 -199.565 -199.57 -199.575 -199.58 -199.585 -199.59 -199.595 -199.6 -199.605 -199.61 -199.615 -199.62 -199.625 -199.63 -199.635 -199.64 -199.645 -199.65 -199.655 -199.66 -199.665 -199.67 -199.675 -199.68 -199.685 -199.69 -199.695 -199.7 -199.705 -199.71 -199.715 -199.72 -199.725 -199.73 -199.735 -199.74 -199.745 -199.75 -199.755 -199.76 -199.765 -199.77 -199.775 -199.78 -199.785 -199.79 -199.795 -199.8 -199.805 -199.81 -199.815 -199.82 -199.825 -199.83 -199.835 -199.84 -199.845 -199.85 -199.855 -199.86 -199.865 -199.87 -199.875 -199.88 -199.885 -199.89 -199.895 -199.9 -199.905 -199.91 -199.915 -199.92 -199.925 -199.93 -199.935 -199.94 -199.945 -199.95 -199.955 -199.96 -199.965 -199.97 -199.975 -199.98 -199.985 -199.99 -199.995 -200 -200.005 -200.01 -200.015 -200.02 -200.025 -200.03 -200.035 -200.04 -200.045 -200.05 -200.055 -200.06 -200.065 -200.07 -200.075 -200.08 -200.085 -200.09 -200.095 -200.1 -200.105 -200.11 -200.115 -200.12 -200.125 -200.13 -200.135 -200.14 -200.145 -200.15 -200.155 -200.16 -200.165 -200.17 -200.175 -200.18 -200.185 -200.19 -200.195 -200.2 -200.205 -200.21 -200.215 -200.22 -200.225 -200.23 -200.235 -200.24 -200.245 -200.25 -200.255 -200.26 -200.265 -200.27 -200.275 -200.28 -200.285 -200.29 -200.295 -200.3 -200.305 -200.31 -200.315 -200.32 -200.325 -200.33 -200.335 -200.34 -200.345 -200.35 -200.355 -200.36 -200.365 -200.37 -200.375 -200.38 -200.385 -200.39 -200.395 -200.4 -200.405 -200.41 -200.415 -200.42 -200.425 -200.43 -200.435 -200.44 -200.445 -200.45 -200.455 -200.46 -200.465 -200.47 -200.475 -200.48 -200.485 -200.49 -200.495 -200.5 -200.505 -200.51 -200.515 -200.52 -200.525 -200.53 -200.535 -200.54 -200.545 -200.55 -200.555 -200.56 -200.565 -200.57 -200.575 -200.58 -200.585 -200.59 -200.595 -200.6 -200.605 -200.61 -200.615 -200.62 -200.625 -200.63 -200.635 -200.64 -200.645 -200.65 -200.655 -200.66 -200.665 -200.67 -200.675 -200.68 -200.685 -200.69 -200.695 -200.7 -200.705 -200.71 -200.715 -200.72 -200.725 -200.73 -200.735 -200.74 -200.745 -200.75 -200.755 -200.76 -200.765 -200.77 -200.775 -200.78 -200.785 -200.79 -200.795 -200.8 -200.805 -200.81 -200.815 -200.82 -200.825 -200.83 -200.835 -200.84 -200.845 -200.85 -200.855 -200.86 -200.865 -200.87 -200.875 -200.88 -200.885 -200.89 -200.895 -200.9 -200.905 -200.91 -200.915 -200.92 -200.925 -200.93 -200.935 -200.94 -200.945 -200.95 -200.955 -200.96 -200.965 -200.97 -200.975 -200.98 -200.985 -200.99 -200.995 -201 -201.005 -201.01 -201.015 -201.02 -201.025 -201.03 -201.035 -201.04 -201.045 -201.05 -201.055 -201.06 -201.065 -201.07 -201.075 -201.08 -201.085 -201.09 -201.095 -201.1 -201.105 -201.11 -201.115 -201.12 -201.125 -201.13 -201.135 -201.14 -201.145 -201.15 -201.155 -201.16 -201.165 -201.17 -201.175 -201.18 -201.185 -201.19 -201.195 -201.2 -201.205 -201.21 -201.215 -201.22 -201.225 -201.23 -201.235 -201.24 -201.245 -201.25 -201.255 -201.26 -201.265 -201.27 -201.275 -201.28 -201.285 -201.29 -201.295 -201.3 -201.305 -201.31 -201.315 -201.32 -201.325 -201.33 -201.335 -201.34 -201.345 -201.35 -201.355 -201.36 -201.365 -201.37 -201.375 -201.38 -201.385 -201.39 -201.395 -201.4 -201.405 -201.41 -201.415 -201.42 -201.425 -201.43 -201.435 -201.44 -201.445 -201.45 -201.455 -201.46 -201.465 -201.47 -201.475 -201.48 -201.485 -201.49 -201.495 -201.5 -201.505 -201.51 -201.515 -201.52 -201.525 -201.53 -201.535 -201.54 -201.545 -201.55 -201.555 -201.56 -201.565 -201.57 -201.575 -201.58 -201.585 -201.59 -201.595 -201.6 -201.605 -201.61 -201.615 -201.62 -201.625 -201.63 -201.635 -201.64 -201.645 -201.65 -201.655 -201.66 -201.665 -201.67 -201.675 -201.68 -201.685 -201.69 -201.695 -201.7 -201.705 -201.71 -201.715 -201.72 -201.725 -201.73 -201.735 -201.74 -201.745 -201.75 -201.755 -201.76 -201.765 -201.77 -201.775 -201.78 -201.785 -201.79 -201.795 -201.8 -201.805 -201.81 -201.815 -201.82 -201.825 -201.83 -201.835 -201.84 -201.845 -201.85 -201.855 -201.86 -201.865 -201.87 -201.875 -201.88 -201.885 -201.89 -201.895 -201.9 -201.905 -201.91 -201.915 -201.92 -201.925 -201.93 -201.935 -201.94 -201.945 -201.95 -201.955 -201.96 -201.965 -201.97 -201.975 -201.98 -201.985 -201.99 -201.995 -202 -202.005 -202.01 -202.015 -202.02 -202.025 -202.03 -202.035 -202.04 -202.045 -202.05 -202.055 -202.06 -202.065 -202.07 -202.075 -202.08 -202.085 -202.09 -202.095 -202.1 -202.105 -202.11 -202.115 -202.12 -202.125 -202.13 -202.135 -202.14 -202.145 -202.15 -202.155 -202.16 -202.165 -202.17 -202.175 -202.18 -202.185 -202.19 -202.195 -202.2 -202.205 -202.21 -202.215 -202.22 -202.225 -202.23 -202.235 -202.24 -202.245 -202.25 -202.255 -202.26 -202.265 -202.27 -202.275 -202.28 -202.285 -202.29 -202.295 -202.3 -202.305 -202.31 -202.315 -202.32 -202.325 -202.33 -202.335 -202.34 -202.345 -202.35 -202.355 -202.36 -202.365 -202.37 -202.375 -202.38 -202.385 -202.39 -202.395 -202.4 -202.405 -202.41 -202.415 -202.42 -202.425 -202.43 -202.435 -202.44 -202.445 -202.45 -202.455 -202.46 -202.465 -202.47 -202.475 -202.48 -202.485 -202.49 -202.495 - --75.9641 --75.975 --75.9656 --75.9844 --75.9672 --75.9641 --75.9656 --75.9609 --75.9609 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9547 --75.9672 --75.9641 --75.9734 --75.9625 --75.9734 --75.9703 --75.975 --75.9922 --75.9672 --75.9625 --75.9812 --75.9703 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.975 --75.9766 --75.9906 --75.975 --75.9719 --75.9859 --75.9594 --75.9719 --75.9547 --75.9719 --75.9703 --75.9703 --75.9594 --75.9688 --75.9641 --75.9594 --75.9844 --75.9547 --75.9688 --75.975 --75.9719 --75.9609 --75.9703 --75.9688 --75.9578 --75.9641 --75.9594 --75.9578 --75.975 --75.9656 --75.9688 --75.9625 --75.9531 --75.9563 --75.9641 --75.9594 --75.9641 --75.9609 --75.9578 --75.9719 --75.9547 --75.9563 --75.9703 --75.9672 --75.9578 --75.9734 --75.9734 --75.9594 --75.9656 --75.9578 --75.9516 --75.9578 --75.9563 --75.9563 --75.9609 --75.9516 --75.9688 --75.9422 --75.9516 --75.9688 --75.9656 --75.9641 --75.9547 --75.9531 --75.9734 --75.9578 --75.9469 --75.9625 --75.9594 --75.9375 --75.9594 --75.9641 --75.9625 --75.9531 --75.9422 --75.95 --75.95 --75.9578 --75.9547 --75.9609 --75.9484 --75.9484 --75.9547 --75.9469 --75.9641 --75.9563 --75.9328 --75.9547 --75.95 --75.9578 --75.9563 --75.9531 --75.9563 --75.9359 --75.9594 --75.95 --75.9609 --75.9531 --75.9594 --75.9547 --75.9656 --75.9594 --75.9578 --75.9516 --75.9516 --75.9484 --75.9516 --75.9563 --75.9547 --75.9531 --75.9453 --75.9531 --75.9688 --75.9516 --75.9594 --75.9516 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9609 --75.9703 --75.9734 --75.9609 --75.9672 --75.9531 --75.9625 --75.9625 --75.9563 --75.9734 --75.9656 --75.9641 --75.9578 --75.9656 --75.9563 --75.9656 --75.9672 --75.9625 --75.9688 --75.9594 --75.9641 --75.9688 --75.9656 --75.9625 --75.9812 --75.9594 --75.9672 --75.9656 --75.9547 --75.9563 --75.9594 --75.9703 --75.9641 --75.9688 --75.9531 --75.95 --75.9594 --75.9469 --75.9547 --75.9563 --75.9609 --75.9672 --75.9563 --75.9578 --75.9547 --75.9609 --75.9469 --75.9594 --75.9594 --75.9484 --75.9625 --75.9641 --75.9547 --75.9531 --75.9484 --75.9547 --75.9484 --75.9422 --75.9594 --75.9516 --75.9609 --75.9672 --75.9672 --75.9609 --75.9516 --75.9594 --75.9781 --75.9563 --75.9688 --75.9703 --75.9625 --75.9563 --75.9437 --75.9578 --75.9547 --75.9609 --75.9688 --75.9609 --75.9594 --75.9609 --75.9547 --75.9719 --75.9656 --75.9578 --75.9688 --75.975 --75.9594 --75.9609 --75.9609 --75.9563 --75.9656 --75.9563 --75.9563 --75.9719 --75.9578 --75.9609 --75.9625 --75.9578 --75.9563 --75.9578 --75.9563 --75.95 --75.9594 --75.9594 --75.9594 --75.975 --75.9641 --75.9703 --75.9578 --75.9594 --75.9734 --75.9656 --75.9516 --75.9766 --75.9656 --75.9656 --75.9594 --75.9688 --75.9656 --75.9609 --75.9766 --75.9656 --75.9734 --75.9516 --75.9609 --75.9547 --75.9453 --75.9672 --75.9625 --75.9594 --75.9609 --75.9656 --75.9609 --75.9656 --75.9656 --75.9578 --75.9625 --75.9453 --75.9531 --75.9719 --75.9734 --75.9656 --75.9516 --75.9609 --75.9688 --75.9594 --75.9719 --75.9641 --75.9641 --75.9531 --75.95 --75.9437 --75.9437 --75.9594 --75.9516 --75.9359 --75.9609 --75.9469 --75.9453 --75.9391 --75.9437 --75.9531 --75.9531 --75.9563 --75.9547 --75.9547 --75.9719 --75.9672 --75.9641 --75.9609 --75.9766 --75.9484 --75.9563 --75.9594 --75.9547 --75.9578 --75.9609 --75.9516 --75.9547 --75.9594 --75.9578 --75.9656 --75.9516 --75.9531 --75.9422 --75.9516 --75.9453 --75.95 --75.9625 --75.95 --75.9531 --75.9641 --75.9703 --75.9594 --75.9531 --75.9563 --75.9594 --75.9516 --75.9719 --75.9672 --75.9531 --75.9703 --75.9547 --75.9641 --75.9688 --75.9547 --75.9547 --75.9625 --75.9641 --75.9656 --75.9609 --75.95 --75.9547 --75.9531 --75.9531 --75.9547 --75.9609 --75.9641 --75.9594 --75.9594 --75.9547 --75.9469 --75.9625 --75.9734 --75.9609 --75.9516 --75.975 --75.9672 --75.9594 --75.9609 --75.9609 --75.95 --75.9609 --75.9766 --75.9609 --75.9563 --75.95 --75.9625 --75.9641 --75.9656 --75.9516 --75.9594 --75.9594 --75.9563 --75.9641 --75.9672 --75.9609 --75.9703 --75.9516 --75.9531 --75.9625 --75.9578 --75.9672 --75.9859 --76.0484 --76.0938 --76.1594 --76.2 --76.2063 --76.1203 --76.0156 --75.8641 --75.7141 --75.5953 --75.4844 --75.3938 --75.3313 --75.2594 --75.2 --75.1547 --75.1109 --75.0766 --75.0281 --74.9938 --74.95 --74.9047 --74.8578 --74.8063 --74.7594 --74.7281 --74.6875 --74.6484 --74.5953 --74.5641 --74.5203 --74.4719 --74.4313 --74.3906 --74.3703 --74.3281 --74.2922 --74.2453 --74.2188 --74.1844 --74.1438 --74.1094 --74.0719 --74.0391 --74.0125 --73.9734 --73.9328 --73.8906 --73.8625 --73.8422 --73.8125 --73.7656 --73.7328 --73.7125 --73.675 --73.6375 --73.6125 --73.5797 --73.5469 --73.5156 --73.4938 --73.4516 --73.4187 --73.4078 --73.3781 --73.3438 --73.3125 --73.2937 --73.2719 --73.2406 --73.2156 --73.1891 --73.1672 --73.1359 --73.0969 --73.0719 --73.0531 --73.0266 --73 --72.9828 --72.95 --72.9297 --72.9125 --72.9 --72.875 --72.85 --72.825 --72.7984 --72.7734 --72.7438 --72.7359 --72.725 --72.675 --72.6578 --72.6469 --72.625 --72.5984 --72.575 --72.55 --72.5016 --72.4406 --72.3766 --72.2906 --72.2281 --72.2188 --72.2578 --72.3469 --72.475 --72.5844 --72.6844 --72.7719 --72.8422 --72.9031 --72.9484 --72.9734 --73.0156 --73.0234 --73.0531 --73.0797 --73.1109 --73.1281 --73.1703 --73.1891 --73.2109 --73.2312 --73.2547 --73.2781 --73.3031 --73.3297 --73.3531 --73.3656 --73.4 --73.4187 --73.4375 --73.4625 --73.4812 --73.5031 --73.5344 --73.5297 --73.55 --73.5781 --73.5969 --73.6047 --73.6328 --73.6594 --73.6609 --73.6984 --73.7063 --73.7203 --73.7438 --73.7516 --73.7734 --73.7906 --73.8266 --73.8313 --73.8484 --73.8578 --73.8734 --73.8781 --73.9047 --73.9156 --73.9266 --73.9453 --73.9656 --73.9734 --74 --74.0078 --74.0078 --74.0312 --74.0453 --74.0531 --74.0687 --74.075 --74.0844 --74.1078 --74.1031 --74.1172 --74.1312 --74.1438 --74.1484 --74.1734 --74.1766 --74.1953 --74.2 --74.2016 --74.2281 --74.2391 --74.2547 --74.2594 --74.2672 --74.2766 --74.2875 --74.2969 --74.2969 --74.3109 --74.3203 --74.3156 --74.3406 --74.3391 --74.3391 --74.35 --74.3594 --74.3656 --74.375 --74.3797 --74.3953 --74.3969 --74.4141 --74.4047 --74.4281 --74.4172 --74.4359 --74.4344 --74.4469 --74.4547 --74.4469 --74.4625 --74.475 --74.475 --74.4922 --74.4906 --74.5016 --74.4969 --74.5188 --74.525 --74.5188 --74.5391 --74.5375 --74.5422 --74.5375 --74.5453 --74.5547 --74.5531 --74.5703 --74.5719 --74.5828 --74.5828 --74.5875 --74.5922 --74.6016 --74.6078 --74.6031 --74.6 --74.6156 --74.6312 --74.6359 --74.6422 --74.65 --74.6328 --74.6516 --74.6609 --74.6609 --74.6734 --74.6594 --74.6734 --74.6703 --74.675 --74.6687 --74.6797 --74.6828 --74.6937 --74.6766 --74.7016 --74.7047 --74.6969 --74.7031 --74.7031 --74.7078 --74.7109 --74.7266 --74.7234 --74.7406 --74.7234 --74.725 --74.7422 --74.7312 --74.7391 --74.7359 --74.7516 --74.7453 --74.7547 --74.7672 --74.7578 --74.7656 --74.7641 --74.7719 --74.7688 --74.7703 --74.7875 --74.7812 --74.7953 --74.7797 --74.7812 --74.7844 --74.775 --74.8031 --74.8047 --74.8172 --74.8078 --74.8016 --74.8016 --74.825 --74.8156 --74.8109 --74.825 --74.8219 --74.8187 --74.8187 --74.8406 --74.8281 --74.8328 --74.8422 --74.8453 --74.8266 --74.8375 --74.8438 --74.8391 --74.8422 --74.8391 --74.8422 --74.8547 --74.8531 --74.8484 --74.8625 --74.8781 --74.8672 --74.8547 --74.8812 --74.8719 --74.8609 --74.8625 --74.8828 --74.8688 --74.8938 --74.8812 --74.8891 --74.9031 --74.8922 --74.8953 --74.9078 --74.9016 --74.9031 --74.8922 --74.9047 --74.9078 --74.8938 --74.9094 --74.9109 --74.9094 --74.9125 --74.9203 --74.9125 --74.9125 --74.9219 --74.9203 --74.9187 --74.9062 --74.9094 --74.9047 --74.9141 --74.9281 --74.9313 --74.9172 --74.9156 --74.9297 --74.9328 --74.9313 --74.9391 --74.9375 --74.9406 --74.9313 --74.9469 --74.9453 --74.9422 --74.9641 --74.9609 --74.9484 --74.9531 --74.9453 --74.9578 --74.9484 --74.9469 --74.9437 --74.9563 --74.9656 --74.9609 --74.9609 --74.9453 --74.9703 --74.9672 --74.9609 --74.975 --74.9797 --74.9719 --74.9703 --74.9656 --74.9906 --74.9812 --74.975 --74.9797 --74.9922 --74.975 --74.9859 --74.9922 --74.9859 --74.9953 --75.0031 --74.9922 --74.9844 --75.0047 --74.9781 --74.9906 --75.0016 --74.9906 --75.0047 --75 --74.9953 --74.9969 --74.9984 --75.0094 --75.0062 --75.0047 --75.0047 --75 --75.0141 --75.0297 --75.0078 --75.0125 --75.0141 --75.0156 --75.0125 --75.0219 --75.0219 --75.0141 --75.0109 --75.0031 --75.0125 --75.0203 --75.0328 --75.0234 --75.0344 --75.0266 --75.0172 --75.0297 --75.0297 --75.0219 --75.0344 --75.0312 --75.0344 --75.025 --75.0359 --75.0344 --75.0281 --75.0234 --75.0344 --75.0312 --75.0297 --75.0359 --75.0203 --75.0422 --75.0219 --75.0266 --75.025 --75.0375 --75.0469 --75.0469 --75.0328 --75.0484 --75.0469 --75.0578 --75.0344 --75.0406 --75.0375 --75.0391 --75.0453 --75.0406 --75.0531 --75.0484 --75.05 --75.0391 --75.0516 --75.0484 --75.05 --75.0437 --75.0484 --75.0344 --75.0594 --75.0359 --75.0453 --75.0531 --75.0469 --75.0547 --75.0344 --75.0469 --75.0391 --75.0484 --75.0437 --75.0531 --75.0516 --75.0547 --75.0578 --75.0594 --75.0563 --75.0375 --75.0531 --75.05 --75.0672 --75.0547 --75.0578 --75.0563 --75.0609 --75.0484 --75.0719 --75.0484 --75.075 --75.0609 --75.0516 --75.0563 --75.0625 --75.0625 --75.0594 --75.0578 --75.0719 --75.0594 --75.0687 --75.0656 --75.0547 --75.0578 --75.0672 --75.0766 --75.0703 --75.0594 --75.0609 --75.0687 --75.0625 --75.0844 --75.0719 --75.0734 --75.0703 --75.0719 --75.0828 --75.0687 --75.0875 --75.0703 --75.0656 --75.0922 --75.0844 --75.0859 --75.0703 --75.0828 --75.0781 --75.0813 --75.0641 --75.0797 --75.0703 --75.0875 --75.0875 --75.0703 --75.0828 --75.0922 --75.0766 --75.0766 --75.0781 --75.0891 --75.1016 --75.0781 --75.0781 --75.0859 --75.0906 --75.0813 --75.0938 --75.0844 --75.0953 --75.1016 --75.0906 --75.1094 --75.1 --75.1031 --75.0984 --75.1031 --75.0719 --75.0969 --75.0906 --75.1031 --75.1047 --75.0938 --75.1078 --75.1047 --75.1172 --75.1047 --75.1078 --75.0891 --75.1 --75.0953 --75.0938 --75.1031 --75.0875 --75.1 --75.1 --75.1031 --75.1125 --75.1031 --75.1062 --75.0938 --75.0969 --75.1125 --75.1047 --75.1188 --75.1125 --75.1062 --75.1125 --75.1125 --75.1156 --75.1109 --75.1109 --75.1078 --75.125 --75.1078 --75.1 --75.1156 --75.1062 --75.1156 --75.1141 --75.1156 --75.1109 --75.1109 --75.1234 --75.1203 --75.1125 --75.1266 --75.1031 --75.0969 --75.1219 --75.1094 --75.1172 --75.1203 --75.1172 --75.1266 --75.1219 --75.1125 --75.1203 --75.1234 --75.1172 --75.1141 --75.1188 --75.1125 --75.1172 --75.1219 --75.1188 --75.1266 --75.1172 --75.1219 --75.1297 --75.1297 --75.1172 --75.1297 --75.125 --75.1297 --75.1297 --75.1188 --75.1297 --75.125 --75.1297 --75.1266 --75.1219 --75.1156 --75.1266 --75.1297 --75.1172 --75.1266 --75.1094 --75.1156 --75.1312 --75.125 --75.1188 --75.1281 --75.1266 --75.1234 --75.1297 --75.1344 --75.1312 --75.1312 --75.1297 --75.1188 --75.1359 --75.1297 --75.1281 --75.1328 --75.1391 --75.1375 --75.1297 --75.125 --75.1281 --75.1312 --75.125 --75.1156 --75.1312 --75.1375 --75.1359 --75.1359 --75.1312 --75.1328 --75.1422 --75.1219 --75.1266 --75.1312 --75.1391 --75.1359 --75.1297 --75.1344 --75.1375 --75.1469 --75.125 --75.1375 --75.125 --75.1344 --75.1375 --75.1328 --75.1328 --75.1391 --75.1375 --75.1328 --75.1328 --75.1328 --75.1422 --75.1406 --75.1484 --75.1438 --75.1531 --75.1422 --75.1484 --75.1328 --75.1406 --75.1391 --75.15 --75.1406 --75.1484 --75.1391 --75.1469 --75.1531 --75.1484 --75.15 --75.1391 --75.1438 --75.1406 --75.1594 --75.1469 --75.1469 --75.1453 --75.1531 --75.1469 --75.1516 --75.1453 --75.1531 --75.1312 --75.1375 --75.1453 --75.1438 --75.1422 --75.1578 --75.1594 --75.1469 --75.1578 --75.1516 --75.1438 --75.1453 --75.15 --75.1656 --75.1453 --75.1484 --75.1594 --75.1594 --75.1703 --75.1719 --75.1594 --75.1562 --75.1516 --75.1687 --75.1609 --75.1609 --75.1625 --75.1594 --75.1547 --75.1547 --75.1781 --75.1687 --75.175 --75.1672 --75.1719 --75.175 --75.1781 --75.1781 --75.1719 --75.1797 --75.1656 --75.1656 --75.1828 --75.1656 --75.1766 --75.1734 --75.1719 --75.1687 --75.1531 --75.1813 --75.1703 --75.1594 --75.1703 --75.1766 --75.1703 --75.1578 --75.1766 --75.1656 --75.1703 --75.1703 --75.1797 --75.1656 --75.1531 --75.1562 --75.1734 --75.1672 --75.1781 --75.1781 --75.1953 --75.1719 --75.1734 --75.1891 --75.175 --75.1766 --75.1813 --75.1766 --75.1844 --75.1641 --75.1734 --75.1766 --75.1781 --75.1781 --75.1828 --75.1859 --75.1875 --75.1813 --75.1797 --75.1813 --75.1766 --75.1937 --75.1672 --75.175 --75.1781 --75.1703 --75.1844 --75.1813 --75.1875 --75.175 --75.1766 --75.1875 --75.1891 --75.1906 --75.1813 --75.175 --75.1906 --75.1875 --75.1719 --75.175 --75.1703 --75.1766 --75.1797 --75.1797 --75.1719 --75.1734 --75.1859 --75.1891 --75.175 --75.1703 --75.1859 --75.1859 --75.1828 --75.1672 --75.1859 --75.1766 --75.1922 --75.175 --75.1797 --75.1828 --75.1781 --75.1625 --75.1703 --75.1844 --75.1844 --75.1797 --75.1719 --75.1672 --75.1719 --75.1766 --75.1906 --75.175 --75.1828 --75.1922 --75.1781 --75.1797 --75.1828 --75.1969 --75.2016 --75.1891 --75.1984 --75.1781 --75.1906 --75.1734 --75.1844 --75.1844 --75.175 --75.1891 --75.1719 --75.1875 --75.1859 --75.1859 --75.1828 --75.1891 --75.1844 --75.1859 --75.1703 --75.1828 --75.1891 --75.2016 --75.175 --75.1937 --75.1859 --75.1969 --75.1891 --75.1906 --75.1953 --75.1953 --75.1906 --75.1844 --75.2 --75.1953 --75.1766 --75.1875 --75.1953 --75.1906 --75.1906 --75.2047 --75.2047 --75.2 --75.2063 --75.2063 --75.1953 --75.1969 --75.2047 --75.1984 --75.2 --75.2031 --75.2 --75.2 --75.1953 --75.2047 --75.2094 --75.2109 --75.1969 --75.2188 --75.2016 --75.2016 --75.1937 --75.1937 --75.2016 --75.2156 --75.2031 --75.2016 --75.2 --75.2 --75.2188 --75.1984 --75.2031 --75.2094 --75.1969 --75.2047 --75.2063 --75.2125 --75.2016 --75.2078 --75.2125 --75.2016 --75.2 --75.2063 --75.1984 --75.2016 --75.2016 --75.1984 --75.1937 --75.2031 --75.2016 --75.2094 --75.2063 --75.2 --75.2 --75.2219 --75.2047 --75.2078 --75.1984 --75.2094 --75.2125 --75.2047 --75.2141 --75.2094 --75.2109 --75.2063 --75.2063 --75.2016 --75.2063 --75.2172 --75.2156 --75.2016 --75.2078 --75.1937 --75.2031 --75.2031 --75.2016 --75.2188 --75.2016 --75.2 --75.2016 --75.2141 --75.2109 --75.2063 --75.2203 --75.2125 --75.2 --75.2234 --75.225 --75.2141 --75.2047 --75.2266 --75.2203 --75.2312 --75.225 --75.2109 --75.2063 --75.2391 --75.2203 --75.2188 --75.2109 --75.2063 --75.2125 --75.2219 --75.2188 --75.2219 --75.2219 --75.2172 --75.2156 --75.2156 --75.2109 --75.2156 --75.2109 --75.2219 --75.2203 --75.225 --75.2172 --75.2219 --75.2125 --75.2281 --75.2234 --75.2141 --75.225 --75.2156 --75.2281 --75.2219 --75.2109 --75.2156 --75.2141 --75.2156 --75.2078 --75.2359 --75.225 --75.2219 --75.2312 --75.2219 --75.2156 --75.2281 --75.2219 --75.2266 --75.2203 --75.2297 --75.2391 --75.2266 --75.2375 --75.2188 --75.2297 --75.2266 --75.2359 --75.225 --75.2172 --75.2328 --75.2125 --75.2234 --75.2312 --75.2125 --75.2391 --75.2266 --75.2234 --75.225 --75.2328 --75.2312 --75.2406 --75.2375 --75.2438 --75.2344 --75.2328 --75.2234 --75.2281 --75.2203 --75.2328 --75.2266 --75.2281 --75.2234 --75.225 --75.225 --75.2359 --75.2328 --75.2359 --75.2312 --75.2359 --75.2375 --75.2359 --75.2406 --75.2422 --75.2422 --75.2484 --75.2406 --75.2359 --75.25 --75.2281 --75.2203 --75.2391 --75.2312 --75.2312 --75.2234 --75.2344 --75.2375 --75.2359 --75.2297 --75.2312 --75.2469 --75.2359 --75.2406 --75.225 --75.2359 --75.2391 --75.2281 --75.2234 --75.2359 --75.2203 --75.2266 --75.2266 --75.2234 --75.2406 --75.2281 --75.225 --75.2281 --75.2344 --75.2234 --75.225 --75.2266 --75.2375 --75.225 --75.2406 --75.2219 --75.2312 --75.2375 --75.2266 --75.2312 --75.225 --75.2344 --75.2469 --75.2266 --75.2438 --75.2359 --75.2422 --75.2516 --75.2484 --75.2266 --75.2344 --75.2391 --75.2453 --75.2344 --75.2547 --75.2375 --75.2438 --75.2406 --75.2484 --75.2281 --75.2422 --75.2297 --75.2609 --75.2453 --75.2266 --75.2406 --75.2375 --75.2297 --75.2391 --75.2453 --75.2438 --75.2438 --75.2344 --75.2406 --75.25 --75.2438 --75.2391 --75.2328 --75.2375 --75.2422 --75.2406 --75.2453 --75.2375 --75.2484 --75.2453 --75.2438 --75.25 --75.2391 --75.25 --75.2422 --75.2469 --75.2562 --75.2422 --75.25 --75.2516 --75.2359 --75.2641 --75.2547 --75.2656 --75.2453 --75.2547 --75.2453 --75.2578 --75.2531 --75.2438 --75.2469 --75.2562 --75.2531 --75.2344 --75.2594 --75.2625 --75.2469 --75.2562 --75.2391 --75.2516 --75.2547 --75.2531 --75.2422 --75.2531 --75.2594 --75.2422 --75.2422 --75.2484 --75.2531 --75.2562 --75.2406 --75.2312 --75.2438 --75.25 --75.2578 --75.2453 --75.2281 --75.25 --75.2562 --75.2594 --75.2609 --75.2625 --75.2438 --75.2578 --75.2609 --75.2641 --75.2672 --75.2609 --75.2547 --75.2578 --75.2672 --75.2703 --75.2625 --75.2578 --75.2547 --75.2703 --75.2688 --75.2594 --75.2703 --75.2781 --75.2656 --75.2734 --75.2844 --75.2734 --75.275 --75.2797 --75.2828 --75.2656 --75.2844 --75.2812 --75.2859 --75.2766 --75.2688 --75.275 --75.275 --75.2797 --75.2641 --75.275 --75.2688 --75.2672 --75.2703 --75.2609 --75.2766 --75.2797 --75.2531 --75.2703 --75.2594 --75.2672 --75.2609 --75.2703 --75.2703 --75.2625 --75.2641 --75.2516 --75.2625 --75.2656 --75.25 --75.2734 --75.2656 --75.2469 --75.2688 --75.2734 --75.2797 --75.2688 --75.2562 --75.2859 --75.2688 --75.275 --75.2688 --75.2609 --75.2625 --75.2641 --75.2625 --75.2641 --75.2641 --75.2688 --75.2547 --75.2578 --75.275 --75.2672 --75.2859 --75.275 --75.2828 --75.2641 --75.2812 --75.2703 --75.2656 --75.2734 --75.2797 --75.2797 --75.2828 --75.2672 --75.2656 --75.2812 --75.2719 --75.2797 --75.2797 --75.2625 --75.275 --75.2688 --75.2719 --75.2625 --75.2812 --75.2766 --75.2688 --75.2734 --75.2812 --75.275 --75.2766 --75.2844 --75.2781 --75.2781 --75.2828 --75.2812 --75.2797 --75.2875 --75.2547 --75.2734 --75.2656 --75.2844 --75.2812 --75.2812 --75.2766 --75.2703 --75.275 --75.2719 --75.2844 --75.2828 --75.2797 --75.2922 --75.2859 --75.3 --75.2875 --75.2844 --75.2844 --75.3031 --75.2766 --75.2844 --75.2688 --75.2828 --75.2781 --75.2797 --75.2766 --75.2828 --75.2937 --75.2812 --75.275 --75.275 --75.2969 --75.2797 --75.2719 --75.2766 --75.2828 --75.2828 --75.2875 --75.2797 --75.2797 --75.2906 --75.2797 --75.2812 --75.2859 --75.3047 --75.2984 --75.2984 --75.2766 --75.2859 --75.2859 --75.2781 --75.2891 --75.2875 --75.2906 --75.2828 --75.2906 --75.2828 --75.2797 --75.2844 --75.2828 --75.3047 --75.2812 --75.2844 --75.2766 --75.2937 --75.2781 --75.2844 --75.2766 --75.2891 --75.3 --75.2844 --75.2859 --75.2922 --75.3 --75.2891 --75.3 --75.2906 --75.2797 --75.2953 --75.2953 --75.2875 --75.2891 --75.2937 --75.2906 --75.2922 --75.2812 --75.2812 --75.2969 --75.2766 --75.2875 --75.2828 --75.2937 --75.2969 --75.2656 --75.2969 --75.2937 --75.2688 --75.2859 --75.2875 --75.2891 --75.2734 --75.2781 --75.2891 --75.2984 --75.2953 --75.2906 --75.2953 --75.2937 --75.3031 --75.3063 --75.3047 --75.3 --75.2937 --75.2937 --75.2984 --75.3031 --75.2891 --75.3031 --75.3047 --75.3031 --75.3047 --75.2937 --75.3016 --75.3031 --75.3016 --75.2922 --75.3047 --75.3016 --75.2906 --75.3016 --75.3109 --75.2969 --75.3125 --75.3078 --75.2969 --75.3 --75.2891 --75.3094 --75.3 --75.3016 --75.2875 --75.3125 --75.2953 --75.3078 --75.3016 --75.2891 --75.3 --75.3031 --75.2969 --75.3031 --75.3063 --75.2906 --75.2922 --75.2953 --75.2922 --75.3063 --75.2969 --75.3 --75.2906 --75.2984 --75.2969 --75.3109 --75.2937 --75.2937 --75.3063 --75.2937 --75.3 --75.2984 --75.3 --75.2953 --75.3016 --75.3 --75.3047 --75.3031 --75.2922 --75.2906 --75.2906 --75.3172 --75.2891 --75.2891 --75.2953 --75.2953 --75.2984 --75.2937 --75.2969 --75.2859 --75.3031 --75.2953 --75.2922 --75.2937 --75.3016 --75.2984 --75.2969 --75.2922 --75.3141 --75.3109 --75.3109 --75.2922 --75.3203 --75.3094 --75.3266 --75.3 --75.3016 --75.3125 --75.3078 --75.3109 --75.3016 --75.3094 --75.3141 --75.3094 --75.3078 --75.3047 --75.3203 --75.3063 --75.3063 --75.3187 --75.3125 --75.3187 --75.3203 --75.3187 --75.3187 --75.3125 --75.3203 --75.3063 --75.3172 --75.3125 --75.3063 --75.325 --75.3266 --75.3078 --75.3187 --75.3172 --75.3187 --75.3125 --75.3266 --75.3078 --75.3094 --75.325 --75.325 --75.3156 --75.3234 --75.3094 --75.3219 --75.3219 --75.3172 --75.3187 --75.3203 --75.3203 --75.3125 --75.3172 --75.3219 --75.3125 --75.3141 --75.3234 --75.3297 --75.3266 --75.3156 --75.3172 --75.3125 --75.3187 --75.3172 --75.3266 --75.3203 --75.3125 --75.3266 --75.3172 --75.3234 --75.3187 --75.3219 --75.3266 --75.3156 --75.3313 --75.325 --75.325 --75.3266 --75.3375 --75.3172 --75.3313 --75.3375 --75.3359 --75.3297 --75.3422 --75.3344 --75.3344 --75.3297 --75.3359 --75.3187 --75.3344 --75.3344 --75.3281 --75.3313 --75.3281 --75.3297 --75.3281 --75.3297 --75.3422 --75.3234 --75.3219 --75.3297 --75.3328 --75.3313 --75.3281 --75.3281 --75.3438 --75.325 --75.3359 --75.3391 --75.3391 --75.3266 --75.3391 --75.3375 --75.3422 --75.3453 --75.3359 --75.3375 --75.3391 --75.3344 --75.3422 --75.3391 --75.3484 --75.3406 --75.3469 --75.3453 --75.3234 --75.3328 --75.3328 --75.3391 --75.3453 --75.3313 --75.325 --75.3453 --75.3281 --75.3469 --75.3453 --75.3531 --75.35 --75.3406 --75.3359 --75.3359 --75.3438 --75.3281 --75.35 --75.3578 --75.3469 --75.3531 --75.3453 --75.3453 --75.35 --75.3391 --75.3453 --75.3484 --75.3313 --75.3516 --75.3422 --75.35 --75.3422 --75.3625 --75.3453 --75.3422 --75.3531 --75.3469 --75.3453 --75.3438 --75.3422 --75.3359 --75.3469 --75.3672 --75.3469 --75.3422 --75.3547 --75.3422 --75.35 --75.3531 --75.3641 --75.3391 --75.3469 --75.3453 --75.3422 --75.3422 --75.3469 --75.3391 --75.3484 --75.3531 --75.3438 --75.3438 --75.3562 --75.3609 --75.3453 --75.3578 --75.3578 --75.3484 --75.3594 --75.3516 --75.3578 --75.3594 --75.3391 --75.3531 --75.35 --75.3516 --75.3422 --75.3359 --75.3406 --75.3531 --75.3391 --75.3516 --75.3453 --75.3484 --75.3578 --75.3562 --75.3594 --75.3438 --75.3547 --75.3469 --75.3562 --75.3484 --75.3375 --75.3484 --75.3484 --75.3594 --75.3625 --75.3625 --75.3453 --75.3516 --75.3625 --75.3516 --75.3562 --75.3453 --75.3469 --75.35 --75.3469 --75.3469 --75.3406 --75.3531 --75.3656 --75.3453 --75.3516 --75.3609 --75.3469 --75.3641 --75.3531 --75.3453 --75.3469 --75.3531 --75.3484 --75.3547 --75.3406 --75.3469 --75.35 --75.3547 --75.35 --75.35 --75.3406 --75.3516 --75.3531 --75.3375 --75.3453 --75.3438 --75.3438 --75.3484 --75.35 --75.3547 --75.35 --75.3422 --75.3578 --75.3578 --75.3406 --75.3484 --75.3531 --75.3547 --75.3484 --75.3469 --75.3438 --75.3438 --75.3547 --75.3547 --75.3672 --75.3547 --75.3453 --75.3703 --75.3719 --75.3578 --75.3688 --75.3531 --75.3625 --75.3734 --75.3594 --75.35 --75.3609 --75.375 --75.3641 --75.3688 --75.3703 --75.375 --75.3672 --75.3609 --75.3688 --75.3656 --75.3984 --75.3656 --75.3641 --75.3875 --75.3672 --75.3688 --75.3594 --75.3812 --75.3672 --75.3766 --75.3625 --75.3641 --75.3672 --75.3625 --75.3641 --75.3656 --75.3672 --75.3641 --75.3734 --75.3531 --75.3562 --75.3562 --75.3734 --75.3641 --75.3562 --75.3656 --75.375 --75.3484 --75.3641 --75.3625 --75.3719 --75.3641 --75.3625 --75.3828 --75.3641 --75.3641 --75.3734 --75.3828 --75.3688 --75.375 --75.375 --75.3703 --75.3703 --75.3547 --75.3703 --75.3656 --75.3703 --75.3734 --75.3719 --75.3703 --75.3641 --75.3688 --75.3656 --75.3734 --75.3766 --75.3594 --75.3703 --75.3688 --75.3656 --75.3734 --75.3672 --75.3828 --75.3688 --75.3672 --75.3812 --75.375 --75.3812 --75.3672 --75.3703 --75.3875 --75.3797 --75.3688 --75.375 --75.3781 --75.3875 --75.3859 --75.3734 --75.375 --75.3781 --75.3766 --75.3609 --75.3828 --75.3672 --75.3891 --75.3781 --75.3797 --75.3875 --75.3703 --75.3859 --75.3828 --75.3781 --75.3781 --75.3969 --75.3766 --75.3828 --75.3875 --75.3859 --75.3938 --75.3828 --75.3828 --75.3797 --75.3906 --75.3922 --75.3781 --75.375 --75.3875 --75.3922 --75.3766 --75.3906 --75.3906 --75.3781 --75.3859 --75.3734 --75.3781 --75.3781 --75.3969 --75.3781 --75.3859 --75.3781 --75.3859 --75.3781 --75.3906 --75.3844 --75.3781 --75.3875 --75.3797 --75.3812 --75.3703 --75.3688 --75.3922 --75.3828 --75.3734 --75.3719 --75.3812 --75.3641 --75.3797 --75.3812 --75.3906 --75.3797 --75.3875 --75.3719 --75.3797 --75.3844 --75.3844 --75.3844 --75.3734 --75.3703 --75.4 --75.4031 --75.3672 --75.3875 --75.3719 --75.3594 --75.3859 --75.375 --75.3875 --75.3734 --75.3812 --75.3938 --75.3844 --75.3688 --75.3719 --75.3703 --75.3812 --75.375 --75.3625 --75.3797 --75.3766 --75.3781 --75.3734 --75.375 --75.3766 --75.3875 --75.3906 --75.3844 --75.3797 --75.3844 --75.3875 --75.3703 --75.3922 --75.3859 --75.3828 --75.375 --75.3844 --75.3906 --75.3906 --75.3828 --75.3844 --75.3766 --75.3891 --75.375 --75.3781 --75.3859 --75.3953 --75.3656 --75.3781 --75.375 --75.3938 --75.3891 --75.3891 --75.3781 --75.3781 --75.3922 --75.3766 --75.3812 --75.3828 --75.3938 --75.3828 --75.3953 --75.3922 --75.3969 --75.3828 --75.3969 --75.4 --75.3859 --75.3922 --75.3969 --75.4016 --75.3969 --75.3953 --75.3969 --75.4078 --75.3922 --75.3969 --75.4031 --75.4047 --75.3984 --75.3922 --75.3969 --75.3844 --75.3844 --75.4031 --75.4016 --75.4078 --75.3844 --75.4047 --75.3906 --75.3953 --75.4 --75.4 --75.3875 --75.3938 --75.3875 --75.3922 --75.3781 --75.3844 --75.3953 --75.3812 --75.3953 --75.3969 --75.3797 --75.3969 --75.3984 --75.3953 --75.3922 --75.3891 --75.3922 --75.3859 --75.3828 --75.3906 --75.4062 --75.3844 --75.3969 --75.3781 --75.3797 --75.3734 --75.3922 --75.3875 --75.3844 --75.3938 --75.3938 --75.3781 --75.4047 --75.3984 --75.3938 --75.3984 --75.4016 --75.4016 --75.3859 --75.3891 --75.3844 --75.3969 --75.3922 --75.3938 --75.3797 --75.3984 --75.3938 --75.3906 --75.3938 --75.3953 --75.3953 --75.3891 --75.3891 --75.3891 --75.3891 --75.4047 --75.3922 --75.3953 --75.3922 --75.3875 --75.3859 --75.3906 --75.3922 --75.3984 --75.3891 --75.3797 --75.3922 --75.3797 --75.375 --75.3891 --75.3797 --75.3828 --75.3828 --75.3906 --75.3875 --75.3922 --75.4016 --75.3938 --75.3891 --75.3891 --75.3906 --75.3969 --75.3922 --75.3922 --75.3969 --75.3781 --75.3938 --75.4047 --75.3984 --75.3812 --75.3828 --75.4016 --75.3922 --75.3891 --75.3906 --75.3922 --75.4 --75.3891 --75.3828 --75.4 --75.3953 --75.3891 --75.3969 --75.3938 --75.3984 --75.3984 --75.3938 --75.3953 --75.3953 --75.3938 --75.3953 --75.3938 --75.3922 --75.3984 --75.4 --75.4062 --75.4078 --75.4078 --75.3984 --75.4172 --75.4062 --75.4 --75.4 --75.4078 --75.4094 --75.4047 --75.4031 --75.3953 --75.4047 --75.3891 --75.4078 --75.4 --75.4062 --75.4109 --75.4031 --75.4094 --75.4 --75.4062 --75.4078 --75.4172 --75.4187 --75.3891 --75.4109 --75.4062 --75.4062 --75.4125 --75.4141 --75.4062 --75.4125 --75.4062 --75.4062 --75.4047 --75.4094 --75.4078 --75.4078 --75.4078 --75.4016 --75.4062 --75.4062 --75.4141 --75.4031 --75.4047 --75.3922 --75.4062 --75.4047 --75.4094 --75.4156 --75.4109 --75.4234 --75.4125 --75.4125 --75.4094 --75.4078 --75.4062 --75.4047 --75.3969 --75.4078 --75.4109 --75.4031 --75.4062 --75.4125 --75.3984 --75.4016 --75.4016 --75.4016 --75.4062 --75.3969 --75.3875 --75.4047 --75.4 --75.4 --75.3969 --75.3875 --75.3984 --75.3969 --75.4125 --75.4094 --75.4031 --75.4047 --75.4047 --75.4016 --75.3922 --75.4062 --75.4187 --75.4078 --75.4156 --75.4172 --75.4062 --75.4156 --75.4016 --75.4031 --75.4094 --75.4094 --75.4094 --75.4078 --75.4094 --75.4078 --75.4 --75.4094 --75.4047 --75.4016 --75.4109 --75.4109 --75.4109 --75.4141 --75.3984 --75.4125 --75.4047 --75.4031 --75.4031 --75.4016 --75.4078 --75.4078 --75.4094 --75.4187 --75.4094 --75.4094 --75.4031 --75.4141 --75.4031 --75.4156 --75.4062 --75.4078 --75.4109 --75.4125 --75.3984 --75.4047 --75.4156 --75.4219 --75.4078 --75.4109 --75.4062 --75.4156 --75.4094 --75.4125 --75.4187 --75.4219 --75.4187 --75.4219 --75.4109 --75.4203 --75.4156 --75.4203 --75.4156 --75.4203 --75.4219 --75.425 --75.4203 --75.4094 --75.4234 --75.4219 --75.4203 --75.4203 --75.4203 --75.4234 --75.4203 --75.4219 --75.4297 --75.425 --75.4391 --75.4094 --75.4344 --75.4219 --75.4187 --75.4187 --75.4219 --75.4187 --75.4109 --75.4062 --75.4125 --75.4219 --75.4187 --75.4203 --75.4156 --75.425 --75.4266 --75.4187 --75.4172 --75.4313 --75.4219 --75.4141 --75.4375 --75.425 --75.4313 --75.4234 --75.4219 --75.4313 --75.4234 --75.4156 --75.4172 --75.4094 --75.4219 --75.4219 --75.4078 --75.4203 --75.4219 --75.4172 --75.4125 --75.4219 --75.4203 --75.4047 --75.4344 --75.4297 --75.425 --75.4219 --75.4266 --75.4313 --75.4219 --75.4297 --75.4078 --75.4391 --75.4281 --75.4344 --75.4172 --75.4172 --75.4297 --75.4203 --75.4266 --75.4187 --75.425 --75.4187 --75.4234 --75.4234 --75.4203 --75.425 --75.4203 --75.4141 --75.4297 --75.4297 --75.4344 --75.4234 --75.4328 --75.4344 --75.4234 --75.4281 --75.4297 --75.4297 --75.425 --75.4172 --75.425 --75.4203 --75.4187 --75.4187 --75.4313 --75.4219 --75.4187 --75.4234 --75.4281 --75.4281 --75.4281 --75.4313 --75.4266 --75.4422 --75.4234 --75.425 --75.4375 --75.4313 --75.4281 --75.4234 --75.4297 --75.4281 --75.4313 --75.4219 --75.4344 --75.4313 --75.4313 --75.425 --75.4359 --75.4297 --75.4297 --75.4313 --75.4234 --75.4266 --75.425 --75.4187 --75.4078 --75.4141 --75.4187 --75.4281 --75.4172 --75.4328 --75.4375 --75.4234 --75.4328 --75.4219 --75.4266 --75.4297 --75.4203 --75.4234 --75.4328 --75.4219 --75.4281 --75.4391 --75.4297 --75.4328 --75.4359 --75.4422 --75.4266 --75.4234 --75.4234 --75.4453 --75.425 --75.4141 --75.4313 --75.4156 --75.4344 --75.4313 --75.4266 --75.4453 --75.4375 --75.4328 --75.4313 --75.4406 --75.4437 --75.4328 --75.4359 --75.4313 --75.4281 --75.425 --75.425 --75.4203 --75.4359 --75.4234 --75.4156 --75.4297 --75.4328 --75.4203 --75.4375 --75.4469 --75.4453 --75.4422 --75.4469 --75.4313 --75.4422 --75.4469 --75.4281 --75.4391 --75.4344 --75.4281 --75.4219 --75.4313 --75.4234 --75.4375 --75.4375 --75.4234 --75.4297 --75.4422 --75.4375 --75.4281 --75.4313 --75.4359 --75.4375 --75.4406 --75.4125 --75.4172 --75.4156 --75.4313 --75.4313 --75.4219 --75.4344 --75.425 --75.4375 --75.4313 --75.4391 --75.4172 --75.4344 --75.4328 --75.4297 --75.4313 --75.4328 --75.4203 --75.425 --75.425 --75.4141 --75.4219 --75.425 --75.4141 --75.4187 --75.4203 --75.4406 --75.4422 --75.4125 --75.4297 --75.4297 --75.4266 --75.4344 --75.425 --75.4234 --75.4234 --75.4328 --75.4344 --75.4297 --75.4219 --75.4234 --75.4156 --75.4187 --75.4344 --75.4297 --75.4281 --75.45 --75.4391 --75.4437 --75.4422 --75.4422 --75.4406 --75.4437 --75.4359 --75.4391 --75.4281 --75.4547 --75.4406 --75.4391 --75.4422 --75.4391 --75.4484 --75.45 --75.4313 --75.4297 --75.4297 --75.4328 --75.4344 --75.4422 --75.4437 --75.4469 --75.4437 --75.4359 --75.4422 --75.4484 --75.4359 --75.4437 --75.4359 --75.4406 --75.4375 --75.4406 --75.4406 --75.4406 --75.4297 --75.4484 --75.4453 --75.4281 --75.4422 --75.4406 --75.4328 --75.4313 --75.4297 --75.4422 --75.4437 --75.4391 --75.4313 --75.4406 --75.4375 --75.4375 --75.4391 --75.4266 --75.4516 --75.4281 --75.4391 --75.4344 --75.4375 --75.4266 --75.4359 --75.4437 --75.4391 --75.4422 --75.4437 --75.4563 --75.4437 --75.4437 --75.4313 --75.4328 --75.4266 --75.4406 --75.4375 --75.4375 --75.4344 --75.4266 --75.4422 --75.4328 --75.4391 --75.4437 --75.4453 --75.4391 --75.4531 --75.4406 --75.4437 --75.4406 --75.4469 --75.4437 --75.4516 --75.4484 --75.4469 --75.4469 --75.4594 --75.45 --75.4391 --75.4437 --75.4469 --75.4453 --75.4406 --75.4531 --75.4359 --75.4391 --75.4516 --75.45 --75.4469 --75.4297 --75.4484 --75.4406 --75.4359 --75.4437 --75.4422 --75.4391 --75.4531 --75.45 --75.4469 --75.4437 --75.4406 --75.4391 --75.4437 --75.4453 --75.4375 --75.4391 --75.4391 --75.4313 --75.4547 --75.4531 --75.4578 --75.4391 --75.4391 --75.4453 --75.4563 --75.4406 --75.4625 --75.4531 --75.4359 --75.4547 --75.4547 --75.4375 --75.4531 --75.4547 --75.45 --75.4391 --75.4437 --75.4484 --75.45 --75.4453 --75.4531 --75.4469 --75.4297 --75.4469 --75.4453 --75.4406 --75.4578 --75.4547 --75.4594 --75.4406 --75.4734 --75.4531 --75.4594 --75.4453 --75.4453 --75.4453 --75.4437 --75.4484 --75.4531 --75.4422 --75.45 --75.4266 --75.4437 --75.4531 --75.4359 --75.4547 --75.4531 --75.4406 --75.4547 --75.4578 --75.45 --75.4625 --75.4594 --75.4641 --75.4578 --75.4656 --75.4641 --75.4563 --75.4594 --75.4703 --75.4437 --75.4563 --75.4609 --75.4734 --75.4609 --75.4469 --75.4594 --75.4531 --75.4547 --75.4531 --75.4625 --75.4719 --75.4563 --75.45 --75.4641 --75.4516 --75.45 --75.4656 --75.4437 --75.4516 --75.4578 --75.4563 --75.4594 --75.4531 --75.4531 --75.4641 --75.45 --75.4656 --75.4609 --75.4688 --75.475 --75.4563 --75.4672 --75.4641 --75.4656 --75.4703 --75.4609 --75.4656 --75.4844 --75.4609 --75.4688 --75.4578 --75.4703 --75.4563 --75.4547 --75.4641 --75.4625 --75.4406 --75.4594 --75.4594 --75.4688 --75.4609 --75.4563 --75.45 --75.4594 --75.4656 --75.4563 --75.4609 --75.4609 --75.4766 --75.4641 --75.4656 --75.4563 --75.4688 --75.4703 --75.4516 --75.4609 --75.4734 --75.4578 --75.4703 --75.4516 --75.4688 --75.4625 --75.4766 --75.4719 --75.4688 --75.4875 --75.4828 --75.4797 --75.4703 --75.4766 --75.4672 --75.4703 --75.475 --75.4719 --75.4766 --75.4641 --75.4781 --75.4734 --75.4797 --75.4625 --75.4781 --75.4641 --75.475 --75.4563 --75.4656 --75.4531 --75.4734 --75.4719 --75.4719 --75.45 --75.4688 --75.4797 --75.4625 --75.4734 --75.4609 --75.4594 --75.4594 --75.4672 --75.4719 --75.4609 --75.4453 --75.4609 --75.4672 --75.4688 --75.475 --75.4641 --75.4563 --75.4672 --75.4547 --75.4672 --75.4531 --75.4609 --75.4578 --75.475 --75.4688 --75.4688 --75.4688 --75.4641 --75.4578 --75.475 --75.4609 --75.4641 --75.4625 --75.4797 --75.4578 --75.4547 --75.4641 --75.4563 --75.4703 --75.4625 --75.4484 --75.4672 --75.4734 --75.4688 --75.475 --75.4688 --75.475 --75.4797 --75.4906 --75.4734 --75.4719 --75.4859 --75.4812 --75.4688 --75.4734 --75.4812 --75.4672 --75.4844 --75.4688 --75.4672 --75.4781 --75.4719 --75.4672 --75.4484 --75.4719 --75.475 --75.4672 --75.4703 --75.4688 --75.4828 --75.4703 --75.475 --75.4703 --75.4719 --75.4797 --75.4672 --75.4781 --75.4625 --75.4766 --75.4734 --75.4734 --75.4609 --75.4703 --75.4563 --75.4734 --75.475 --75.475 --75.4766 --75.475 --75.4672 --75.4797 --75.4922 --75.4719 --75.4781 --75.475 --75.4688 --75.4734 --75.4641 --75.4812 --75.4719 --75.4656 --75.475 --75.4641 --75.4875 --75.4609 --75.475 --75.4703 --75.4859 --75.4609 --75.4812 --75.4734 --75.4688 --75.4781 --75.4781 --75.4688 --75.4656 --75.4766 --75.4859 --75.4734 --75.4766 --75.4734 --75.4828 --75.4812 --75.4797 --75.475 --75.4812 --75.4844 --75.4844 --75.4828 --75.4703 --75.475 --75.4781 --75.4828 --75.4781 --75.4734 --75.475 --75.4859 --75.4672 --75.4891 --75.4688 --75.4859 --75.475 --75.4812 --75.4734 --75.4859 --75.4734 --75.4797 --75.4625 --75.4781 --75.4797 --75.4781 --75.4766 --75.4797 --75.4766 --75.4797 --75.4844 --75.4906 --75.4953 --75.4875 --75.4781 --75.4672 --75.4719 --75.4719 --75.4828 --75.4703 --75.4766 --75.4828 --75.4812 --75.4922 --75.4891 --75.4859 --75.4812 --75.4812 --75.4984 --75.4891 --75.4828 --75.4641 --75.4781 --75.4734 --75.4703 --75.4703 --75.4781 --75.4766 --75.4859 --75.4688 --75.4766 --75.4578 --75.4672 --75.4844 --75.4703 --75.4844 --75.475 --75.4812 --75.4703 --75.4766 --75.4719 --75.4844 --75.4734 --75.4922 --75.4766 --75.4828 --75.4797 --75.475 --75.4781 --75.4875 --75.4859 --75.4844 --75.4828 --75.4922 --75.475 --75.4844 --75.5094 --75.4906 --75.4922 --75.4938 --75.4812 --75.4812 --75.4891 --75.475 --75.4891 --75.4781 --75.4891 --75.4875 --75.4844 --75.4969 --75.4953 --75.4781 --75.4969 --75.4922 --75.5016 --75.4938 --75.4859 --75.4938 --75.4875 --75.4953 --75.4875 --75.5016 --75.4859 --75.4922 --75.5094 --75.4922 --75.4984 --75.5031 --75.4875 --75.5016 --75.4984 --75.4969 --75.4969 --75.5078 --75.5 --75.4953 --75.4906 --75.4906 --75.4922 --75.4875 --75.4953 --75.4844 --75.4984 --75.4969 --75.4766 --75.4875 --75.4828 --75.5016 --75.5047 --75.4922 --75.4922 --75.5062 --75.5078 --75.4938 --75.4984 --75.5047 --75.5016 --75.4938 --75.4938 --75.5062 --75.4938 --75.4812 --75.4891 --75.4875 --75.5 --75.4953 --75.4844 --75.4844 --75.4969 --75.4938 --75.4953 --75.4859 --75.5125 --75.4953 --75.4922 --75.5047 --75.5016 --75.4859 --75.4906 --75.5 --75.4938 --75.5 --75.5109 --75.4969 --75.5031 --75.4953 --75.5078 --75.5078 --75.5094 --75.5016 --75.5109 --75.4969 --75.5094 --75.5031 --75.5125 --75.5219 --75.5062 --75.5 --75.5094 --75.5 --75.5203 --75.5188 --75.5125 --75.5125 --75.5172 --75.5141 --75.5297 --75.5234 --75.5219 --75.5172 --75.5047 --75.5172 --75.5109 --75.5156 --75.5188 --75.525 --75.5172 --75.5203 --75.5125 --75.5125 --75.5125 --75.5062 --75.5188 --75.5094 --75.5062 --75.5109 --75.5266 --75.5281 --75.4969 --75.5094 --75.5062 --75.5125 --75.5125 --75.5234 --75.4984 --75.5062 --75.5047 --75.5 --75.5078 --75.5141 --75.5125 --75.5203 --75.5203 --75.5141 --75.5062 --75.5109 --75.5125 --75.5094 --75.5125 --75.5219 --75.5141 --75.5047 --75.5312 --75.5172 --75.5125 --75.5125 --75.5359 --75.5234 --75.5109 --75.5172 --75.5078 --75.5234 --75.525 --75.5062 --75.5016 --75.5156 --75.5172 --75.5203 --75.5156 --75.4969 --75.5219 --75.5172 --75.5078 --75.5234 --75.5031 --75.5109 --75.5 --75.5062 --75.525 --75.5094 --75.5234 --75.5266 --75.5047 --75.5094 --75.5141 --75.5188 --75.5109 --75.5188 --75.5125 --75.5266 --75.5078 --75.5203 --75.5125 --75.5172 --75.5188 --75.5234 --75.5094 --75.5188 --75.5062 --75.5234 --75.5203 --75.5125 --75.5141 --75.5141 --75.5203 --75.5062 --75.5219 --75.5203 --75.5016 --75.5109 --75.5109 --75.5109 --75.4922 --75.5141 --75.5062 --75.4938 --75.5 --75.5078 --75.4953 --75.4938 --75.5031 --75.5078 --75.5203 --75.4969 --75.4922 --75.5078 --75.5016 --75.5078 --75.5078 --75.5062 --75.5125 --75.5125 --75.5031 --75.5047 --75.5062 --75.5016 --75.5125 --75.5031 --75.5047 --75.5125 --75.5156 --75.5094 --75.5078 --75.5328 --75.5109 --75.5156 --75.5047 --75.5094 --75.5125 --75.5062 --75.5062 --75.5109 --75.5156 --75.4891 --75.5062 --75.5047 --75.5109 --75.5156 --75.5047 --75.5219 --75.5 --75.5141 --75.5281 --75.5062 --75.5078 --75.4984 --75.5219 --75.5047 --75.5062 --75.5203 --75.5203 --75.5188 --75.5094 --75.5125 --75.5188 --75.5125 --75.5141 --75.5125 --75.5203 --75.5234 --75.5219 --75.5312 --75.5109 --75.5234 --75.5266 --75.5172 --75.5266 --75.5188 --75.5312 --75.5219 --75.5172 --75.5172 --75.5234 --75.5156 --75.5078 --75.5062 --75.5297 --75.5109 --75.5047 --75.5016 --75.5047 --75.525 --75.4969 --75.5141 --75.5172 --75.5188 --75.5156 --75.5219 --75.5281 --75.5188 --75.5266 --75.5266 --75.5297 --75.5328 --75.5312 --75.5359 --75.5188 --75.5359 --75.5312 --75.5281 --75.5359 --75.5312 --75.5109 --75.5203 --75.5328 --75.5125 --75.5156 --75.5203 --75.5078 --75.5094 --75.525 --75.5172 --75.5156 --75.5016 --75.5062 --75.5156 --75.5219 --75.5125 --75.5125 --75.5062 --75.5125 --75.5109 --75.5297 --75.5016 --75.5156 --75.5266 --75.5281 --75.5375 --75.5219 --75.5141 --75.5266 --75.5172 --75.5188 --75.525 --75.5203 --75.5094 --75.5141 --75.5281 --75.5266 --75.5359 --75.5297 --75.5141 --75.5328 --75.5266 --75.5266 --75.5188 --75.5141 --75.5156 --75.5281 --75.5297 --75.5219 --75.5219 --75.5172 --75.5406 --75.5125 --75.5281 --75.5188 --75.5297 --75.5312 --75.5297 --75.525 --75.5203 --75.5328 --75.525 --75.5188 --75.5203 --75.5266 --75.5234 --75.5219 --75.5219 --75.525 --75.5266 --75.5344 --75.5172 --75.5203 --75.5344 --75.5203 --75.5203 --75.5188 --75.5297 --75.5328 --75.5219 --75.5391 --75.5297 --75.525 --75.5312 --75.5328 --75.5266 --75.5188 --75.5344 --75.5281 --75.5281 --75.5484 --75.5359 --75.5312 --75.5406 --75.5437 --75.5328 --75.5297 --75.5344 --75.525 --75.5234 --75.5422 --75.5344 --75.5344 --75.525 --75.5469 --75.5484 --75.5422 --75.5312 --75.5344 --75.5484 --75.5391 --75.5312 --75.525 --75.5469 --75.5359 --75.5516 --75.5484 --75.5422 --75.5437 --75.5312 --75.5359 --75.5266 --75.5312 --75.5359 --75.5422 --75.5266 --75.5531 --75.5422 --75.5344 --75.5422 --75.5297 --75.5391 --75.5297 --75.5469 --75.5344 --75.5422 --75.5312 --75.5203 --75.5484 --75.5484 --75.5437 --75.5375 --75.5453 --75.5391 --75.5281 --75.5281 --75.5484 --75.5563 --75.5375 --75.5359 --75.5437 --75.5359 --75.5203 --75.5406 --75.5422 --75.5328 --75.5578 --75.5297 --75.5391 --75.5359 --75.5359 --75.5281 --75.5469 --75.5453 --75.5391 --75.5328 --75.525 --75.5563 --75.5406 --75.5422 --75.5344 --75.5422 --75.5359 --75.5437 --75.5531 --75.5594 --75.5516 --75.5359 --75.5453 --75.5547 --75.5516 --75.55 --75.5312 --75.5422 --75.5359 --75.5484 --75.5516 --75.5437 --75.5437 --75.5469 --75.55 --75.5547 --75.5437 --75.5516 --75.5375 --75.5484 --75.5422 --75.5547 --75.5375 --75.5484 --75.5563 --75.5516 --75.5469 --75.5531 --75.5375 --75.5422 --75.5469 --75.5547 --75.5344 --75.5484 --75.5437 --75.5359 --75.5328 --75.5469 --75.55 --75.5406 --75.5516 --75.5469 --75.5437 --75.5437 --75.5437 --75.5531 --75.5328 --75.5547 --75.5516 --75.5516 --75.5516 --75.5453 --75.5484 --75.5391 --75.5531 --75.5469 --75.5594 --75.5453 --75.5578 --75.5594 --75.5578 --75.5469 --75.5563 --75.5453 --75.525 --75.5437 --75.5422 --75.5344 --75.5547 --75.5547 --75.5547 --75.5391 --75.5453 --75.5437 --75.5453 --75.5453 --75.5484 --75.5516 --75.5437 --75.5422 --75.5469 --75.55 --75.5516 --75.5453 --75.5437 --75.5516 --75.5516 --75.5422 --75.5547 --75.5406 --75.5453 --75.5484 --75.5516 --75.5391 --75.5531 --75.5422 --75.5531 --75.5531 --75.5391 --75.5469 --75.5563 --75.5406 --75.5563 --75.5563 --75.5406 --75.5594 --75.5469 --75.5453 --75.5516 --75.5516 --75.5531 --75.5422 --75.5359 --75.5453 --75.5547 --75.5594 --75.5516 --75.5344 --75.5516 --75.5531 --75.5453 --75.5672 --75.5422 --75.5594 --75.5578 --75.5563 --75.5672 --75.5625 --75.5594 --75.55 --75.5516 --75.5641 --75.55 --75.5609 --75.5734 --75.5625 --75.5531 --75.5469 --75.5516 --75.5641 --75.5547 --75.5609 --75.5563 --75.5641 --75.5594 --75.5531 --75.5609 --75.5469 --75.5547 --75.5406 --75.5563 --75.5375 --75.55 --75.5469 --75.5469 --75.5453 --75.5437 --75.5547 --75.5516 --75.5547 --75.5641 --75.5563 --75.55 --75.5422 --75.55 --75.5422 --75.5578 --75.55 --75.55 --75.5609 --75.5469 --75.5734 --75.5453 --75.5547 --75.5516 --75.5516 --75.5531 --75.5625 --75.5594 --75.5594 --75.5547 --75.55 --75.5547 --75.5625 --75.5594 --75.5625 --75.55 --75.5563 --75.5531 --75.5422 --75.5422 --75.5547 --75.5578 --75.5625 --75.5563 --75.5594 --75.5641 --75.5484 --75.5516 --75.5594 --75.5594 --75.5531 --75.5594 --75.5531 --75.5547 --75.5687 --75.5687 --75.575 --75.5531 --75.5547 --75.5547 --75.5531 --75.5578 --75.5469 --75.5531 --75.5516 --75.5547 --75.5547 --75.5578 --75.5594 --75.5578 --75.5656 --75.55 --75.5578 --75.5531 --75.5672 --75.5594 --75.5687 --75.5578 --75.5594 --75.5609 --75.5594 --75.5547 --75.5531 --75.5734 --75.5734 --75.5437 --75.5609 --75.5547 --75.5687 --75.5563 --75.5578 --75.5703 --75.5578 --75.5563 --75.5641 --75.5516 --75.5516 --75.5578 --75.5656 --75.5578 --75.5563 --75.5594 --75.5672 --75.5734 --75.5781 --75.575 --75.5563 --75.5594 --75.5609 --75.5625 --75.575 --75.5672 --75.5594 --75.5656 --75.5719 --75.5563 --75.5797 --75.5625 --75.5609 --75.5641 --75.5594 --75.5625 --75.5594 --75.5609 --75.5578 --75.5609 --75.5469 --75.5594 --75.5547 --75.5531 --75.5625 --75.575 --75.5687 --75.5859 --75.5687 --75.5766 --75.5719 --75.5906 --75.5766 --75.5719 --75.5672 --75.5563 --75.575 --75.5687 --75.5641 --75.5672 --75.5641 --75.5594 --75.5703 --75.5609 --75.5625 --75.575 --75.5625 --75.5609 --75.5594 --75.5625 --75.5531 --75.5563 --75.55 --75.5641 --75.5594 --75.5687 --75.5609 --75.5734 --75.5594 --75.5687 --75.5656 --75.5703 --75.5687 --75.5781 --75.5641 --75.5641 --75.5656 --75.5719 --75.55 --75.5703 --75.5578 --75.5656 --75.5656 --75.5641 --75.575 --75.5547 --75.5797 --75.5797 --75.5797 --75.5844 --75.5734 --75.5703 --75.5578 --75.5703 --75.575 --75.575 --75.5797 --75.5797 --75.5813 --75.5719 --75.5578 --75.5734 --75.575 --75.5672 --75.5687 --75.5719 --75.5687 --75.5719 --75.5641 --75.5687 --75.5813 --75.5625 --75.575 --75.5609 --75.5656 --75.5906 --75.5656 --75.5672 --75.5672 --75.5625 --75.5641 --75.5609 --75.5531 --75.5594 --75.5469 --75.5578 --75.55 --75.5609 --75.5609 --75.5703 --75.5563 --75.5578 --75.5531 --75.5609 --75.5719 --75.5641 --75.5781 --75.5625 --75.5609 --75.5766 --75.5703 --75.5594 --75.5625 --75.575 --75.5547 --75.5687 --75.5641 --75.575 --75.5703 --75.5813 --75.5641 --75.5656 --75.5656 --75.5859 --75.5797 --75.575 --75.5703 --75.5875 --75.5844 --75.5687 --75.575 --75.5547 --75.5703 --75.5625 --75.5594 --75.5672 --75.5563 --75.5656 --75.5672 --75.5703 --75.575 --75.5687 --75.5641 --75.5859 --75.5766 --75.5734 --75.5766 --75.5766 --75.5656 --75.5641 --75.5844 --75.5859 --75.5766 --75.5781 --75.5859 --75.5672 --75.575 --75.5875 --75.5703 --75.5891 --75.5734 --75.5734 --75.5797 --75.5703 --75.5813 --75.5813 --75.5813 --75.5781 --75.5828 --75.575 --75.5859 --75.5797 --75.5844 --75.5687 --75.5797 --75.5734 --75.5797 --75.5734 --75.5656 --75.5719 --75.5641 --75.5687 --75.5656 --75.5656 --75.5813 --75.575 --75.5641 --75.5719 --75.5719 --75.5734 --75.5656 --75.5672 --75.5734 --75.575 --75.575 --75.5859 --75.5891 --75.5891 --75.5734 --75.5953 --75.5953 --75.5828 --75.5922 --75.5719 --75.5813 --75.5828 --75.5781 --75.5844 --75.5766 --75.5859 --75.5828 --75.5594 --75.575 --75.5859 --75.5687 --75.575 --75.5859 --75.5859 --75.5766 --75.5828 --75.5781 --75.5813 --75.5703 --75.575 --75.5938 --75.5719 --75.5781 --75.5828 --75.5766 --75.5781 --75.5891 --75.5797 --75.5797 --75.5813 --75.5781 --75.5734 --75.5766 --75.5766 --75.5813 --75.5813 --75.5703 --75.5844 --75.5797 --75.5797 --75.5953 --75.5813 --75.5844 --75.5828 --75.5766 --75.5734 --75.5875 --75.5703 --75.575 --75.5734 --75.575 --75.5672 --75.5734 --75.5844 --75.5797 --75.5813 --75.5844 --75.5859 --75.5891 --75.5781 --75.5828 --75.5844 --75.5781 --75.5797 --75.575 --75.5703 --75.575 --75.5641 --75.5687 --75.5766 --75.5828 --75.5875 --75.575 --75.5734 --75.5734 --75.5797 --75.5687 --75.5859 --75.5859 --75.5719 --75.5813 --75.5687 --75.5734 --75.5719 --75.5609 --75.5766 --75.5719 --75.5703 --75.5828 --75.5766 --75.5719 --75.5875 --75.5797 --75.5781 --75.5797 --75.5844 --75.6016 --75.5875 --75.5828 --75.5891 --75.5734 --75.5781 --75.5687 --75.5813 --75.5797 --75.575 --75.5719 --75.5797 --75.5797 --75.5875 --75.5953 --75.5672 --75.5891 --75.5766 --75.5687 --75.5813 --75.5844 --75.5719 --75.5797 --75.5859 --75.5844 --75.5906 --75.5906 --75.5828 --75.5875 --75.5891 --75.5859 --75.5969 --75.5766 --75.5656 --75.5813 --75.5719 --75.5734 --75.5734 --75.5859 --75.5891 --75.5719 --75.5734 --75.5938 --75.5828 --75.5875 --75.5828 --75.5813 --75.5969 --75.5891 --75.5672 --75.5781 --75.5828 --75.575 --75.5781 --75.5844 --75.5938 --75.5906 --75.5781 --75.5844 --75.5813 --75.5719 --75.5844 --75.5703 --75.5687 --75.5687 --75.5766 --75.575 --75.5656 --75.5875 --75.5844 --75.5719 --75.5578 --75.5734 --75.575 --75.5813 --75.5719 --75.5641 --75.5828 --75.5719 --75.5859 --75.575 --75.575 --75.5813 --75.575 --75.5781 --75.5781 --75.5781 --75.5719 --75.5656 --75.5687 --75.575 --75.5844 --75.5766 --75.5813 --75.5828 --75.5781 --75.5875 --75.5875 --75.575 --75.5922 --75.5875 --75.5828 --75.5859 --75.5687 --75.5828 --75.5906 --75.5828 --75.5813 --75.5766 --75.5781 --75.5891 --75.575 --75.5656 --75.5766 --75.5766 --75.5813 --75.5797 --75.5844 --75.5797 --75.5797 --75.5656 --75.5609 --75.5672 --75.5844 --75.5828 --75.5734 --75.5672 --75.5703 --75.5594 --75.5844 --75.5797 --75.5844 --75.5859 --75.5781 --75.575 --75.5703 --75.5781 --75.5813 --75.5687 --75.5875 --75.5781 --75.575 --75.5781 --75.5781 --75.5828 --75.5781 --75.5797 --75.5797 --75.5906 --75.5719 --75.5797 --75.5906 --75.5938 --75.5797 --75.5922 --75.575 --75.6016 --75.5891 --75.5859 --75.5875 --75.5938 --75.5984 --75.5891 --75.5859 --75.5813 --75.5828 --75.575 --75.5797 --75.5828 --75.5797 --75.5813 --75.5875 --75.5859 --75.5781 --75.5781 --75.5844 --75.5891 --75.5734 --75.5969 --75.5922 --75.5938 --75.5859 --75.5859 --75.5969 --75.5781 --75.5844 --75.5906 --75.575 --75.5734 --75.5797 --75.5922 --75.5953 --75.5797 --75.5953 --75.5969 --75.5813 --75.5984 --75.6078 --75.6047 --75.5906 --75.5844 --75.6 --75.5875 --75.5813 --75.5891 --75.5875 --75.5844 --75.5922 --75.6 --75.6016 --75.5875 --75.5984 --75.5797 --75.5969 --75.5984 --75.6016 --75.6047 --75.5953 --75.5953 --75.5859 --75.5953 --75.5969 --75.5828 --75.5906 --75.5938 --75.5828 --75.5891 --75.5844 --75.5938 --75.5844 --75.5984 --75.5875 --75.5906 --75.5953 --75.6062 --75.5906 --75.5969 --75.5969 --75.5844 --75.5891 --75.5766 --75.5813 --75.5969 --75.5797 --75.5797 --75.5813 --75.5813 --75.5891 --75.5828 --75.5766 --75.5766 --75.5875 --75.575 --75.5875 --75.5781 --75.5922 --75.6016 --75.5938 --75.5734 --75.5813 --75.5859 --75.5766 --75.5891 --75.5734 --75.5781 --75.5766 --75.5844 --75.5938 --75.5828 --75.5906 --75.5953 --75.5969 --75.5859 --75.575 --75.5891 --75.5922 --75.5891 --75.5813 --75.5953 --75.5906 --75.5938 --75.6 --75.6 --75.5938 --75.5984 --75.5984 --75.5953 --75.5984 --75.6047 --75.5906 --75.5922 --75.5922 --75.6031 --75.5891 --75.5953 --75.5875 --75.5859 --75.6031 --75.5938 --75.6016 --75.5984 --75.6016 --75.6109 --75.5984 --75.6078 --75.5984 --75.6047 --75.6031 --75.5984 --75.5891 --75.5953 --75.5859 --75.5938 --75.6016 --75.5844 --75.6078 --75.5953 --75.6016 --75.6062 --75.5828 --75.5922 --75.5969 --75.5828 --75.5813 --75.5969 --75.5906 --75.5938 --75.5922 --75.5891 --75.5906 --75.5875 --75.5828 --75.5906 --75.575 --75.6 --75.5781 --75.5891 --75.5703 --75.6016 --75.5969 --75.5906 --75.5797 --75.6125 --75.6094 --75.5859 --75.5922 --75.5922 --75.6062 --75.5984 --75.6016 --75.6016 --75.6062 --75.5953 --75.5969 --75.6016 --75.5969 --75.5969 --75.5875 --75.6016 --75.6062 --75.6 --75.6031 --75.6078 --75.6078 --75.6016 --75.5875 --75.5969 --75.5938 --75.6 --75.5922 --75.5969 --75.6078 --75.5969 --75.6016 --75.5859 --75.5922 --75.6016 --75.6031 --75.5953 --75.5922 --75.6062 --75.6031 --75.6016 --75.6109 --75.5969 --75.5922 --75.6016 --75.6109 --75.5984 --75.5875 --75.6109 --75.6141 --75.6172 --75.6047 --75.6203 --75.6109 --75.625 --75.6078 --75.5984 --75.6141 --75.6156 --75.6047 --75.6016 --75.6094 --75.6141 --75.6109 --75.6156 --75.6188 --75.6141 --75.6125 --75.6156 --75.6109 --75.6141 --75.6078 --75.6172 --75.5938 --75.6 --75.5984 --75.5969 --75.6047 --75.5984 --75.6109 --75.6078 --75.6047 --75.6016 --75.6016 --75.6094 --75.6078 --75.6188 --75.6078 --75.6094 --75.6109 --75.6078 --75.6188 --75.6141 --75.6156 --75.6078 --75.6062 --75.6141 --75.625 --75.6094 --75.6094 --75.6172 --75.6094 --75.6141 --75.6047 --75.6141 --75.6062 --75.6062 --75.6109 --75.6125 --75.6188 --75.6078 --75.6 --75.6109 --75.6047 --75.6 --75.6156 --75.6203 --75.6203 --75.6109 --75.6203 --75.6172 --75.6281 --75.6094 --75.6094 --75.6156 --75.6078 --75.6234 --75.6188 --75.625 --75.6047 --75.6141 --75.6078 --75.6141 --75.625 --75.6234 --75.625 --75.6062 --75.6172 --75.6125 --75.6172 --75.6266 --75.6078 --75.6234 --75.6172 --75.6234 --75.6234 --75.6203 --75.6203 --75.6094 --75.6172 --75.6125 --75.6078 --75.6188 --75.5969 --75.6156 --75.6078 --75.6 --75.6047 --75.6031 --75.6172 --75.5953 --75.6062 --75.6172 --75.6188 --75.6109 --75.6203 --75.6188 --75.6203 --75.6125 --75.6141 --75.6328 --75.6203 --75.6219 --75.6266 --75.6156 --75.6266 --75.6156 --75.6141 --75.6125 --75.6172 --75.6156 --75.6203 --75.6219 --75.6156 --75.6156 --75.6312 --75.6141 --75.6047 --75.6203 --75.6109 --75.6219 --75.6344 --75.6203 --75.6109 --75.6188 --75.6156 --75.6109 --75.6172 --75.6125 --75.6203 --75.6109 --75.6172 --75.6219 --75.6109 --75.6328 --75.6188 --75.6203 --75.6328 --75.6156 --75.6172 --75.6125 --75.6141 --75.625 --75.6172 --75.6188 --75.6156 --75.6203 --75.6328 --75.6125 --75.6266 --75.6266 --75.6203 --75.6047 --75.6172 --75.6141 --75.6219 --75.6047 --75.6188 --75.6141 --75.6188 --75.625 --75.6172 --75.6234 --75.6203 --75.6109 --75.6125 --75.6188 --75.6141 --75.6203 --75.6328 --75.6234 --75.6047 --75.6125 --75.6094 --75.6219 --75.6203 --75.6266 --75.6203 --75.6125 --75.6203 --75.6047 --75.6109 --75.6125 --75.6141 --75.6078 --75.6266 --75.6156 --75.6125 --75.6203 --75.6109 --75.6219 --75.6109 --75.6156 --75.625 --75.6031 --75.6203 --75.6125 --75.6078 --75.6109 --75.6141 --75.6078 --75.6203 --75.6281 --75.6141 --75.6422 --75.5984 --75.6125 --75.6141 --75.6172 --75.6062 --75.6219 --75.6016 --75.6281 --75.6219 --75.6156 --75.6188 --75.6141 --75.6234 --75.6328 --75.6156 --75.6203 --75.6203 --75.6328 --75.6078 --75.6125 --75.6156 --75.6203 --75.6172 --75.6125 --75.6203 --75.6141 --75.6219 --75.6219 --75.6266 --75.6172 --75.6297 --75.6031 --75.6219 --75.6172 --75.6281 --75.6156 --75.6312 --75.6312 --75.6234 --75.6266 --75.6297 --75.6188 --75.6125 --75.6219 --75.6234 --75.6016 --75.6078 --75.6219 --75.6109 --75.6172 --75.625 --75.6109 --75.6312 --75.6188 --75.625 --75.6266 --75.6266 --75.6219 --75.625 --75.625 --75.6234 --75.6266 --75.625 --75.625 --75.6266 --75.6297 --75.6234 --75.6328 --75.6266 --75.6172 --75.6375 --75.6266 --75.6266 --75.6188 --75.6359 --75.6188 --75.6297 --75.6203 --75.6312 --75.625 --75.6109 --75.6141 --75.6109 --75.6297 --75.6266 --75.6281 --75.6328 --75.6203 --75.6328 --75.6219 --75.6359 --75.6297 --75.6281 --75.6375 --75.6344 --75.6328 --75.6438 --75.6266 --75.6328 --75.6328 --75.6344 --75.6484 --75.6406 --75.6406 --75.6469 --75.6406 --75.6359 --75.6297 --75.6344 --75.6188 --75.6297 --75.6203 --75.6281 --75.6203 --75.6328 --75.6406 --75.6312 --75.625 --75.6188 --75.6375 --75.6156 --75.6312 --75.6188 --75.6297 --75.6172 --75.6422 --75.6344 --75.6562 --75.6281 --75.6453 --75.6297 --75.6344 --75.6297 --75.6359 --75.6266 --75.6328 --75.6359 --75.65 --75.6328 --75.6375 --75.6531 --75.6375 --75.6359 --75.6406 --75.6438 --75.6375 --75.6312 --75.6391 --75.6359 --75.6453 --75.6438 --75.6453 --75.6438 --75.6484 --75.65 --75.6562 --75.6359 --75.6375 --75.6297 --75.6422 --75.6344 --75.6516 --75.6391 --75.6391 --75.6453 --75.6422 --75.65 --75.6281 --75.6344 --75.6469 --75.6359 --75.6375 --75.6406 --75.6438 --75.6375 --75.6422 --75.6391 --75.6406 --75.6297 --75.6516 --75.6266 --75.6516 --75.6484 --75.6375 --75.6453 --75.6297 --75.6375 --75.6359 --75.6328 --75.6281 --75.6266 --75.6406 --75.6344 --75.6266 --75.6281 --75.6422 --75.6234 --75.6375 --75.6391 --75.6203 --75.6422 --75.6406 --75.6375 --75.6438 --75.6438 --75.6391 --75.6406 --75.6484 --75.6359 --75.6375 --75.6328 --75.6469 --75.6375 --75.6453 --75.6562 --75.6656 --75.6422 --75.6641 --75.6516 --75.6594 --75.6641 --75.6594 --75.6516 --75.6391 --75.6516 --75.6594 --75.6578 --75.6703 --75.6516 --75.6516 --75.6516 --75.6484 --75.6547 --75.6469 --75.6406 --75.6516 --75.6578 --75.6578 --75.65 --75.6516 --75.6562 --75.6375 --75.6391 --75.6391 --75.6516 --75.6469 --75.6516 --75.6422 --75.6578 --75.6516 --75.6547 --75.6391 --75.6578 --75.6453 --75.6594 --75.65 --75.6562 --75.6484 --75.65 --75.6547 --75.6609 --75.6516 --75.6484 --75.6469 --75.6453 --75.6359 --75.6391 --75.6641 --75.6625 --75.6531 --75.6578 --75.6531 --75.6516 --75.6438 --75.6453 --75.6438 --75.6406 --75.6484 --75.6484 --75.6438 --75.6547 --75.65 --75.6453 --75.6547 --75.6359 --75.6453 --75.6438 --75.65 --75.6516 --75.6578 --75.6562 --75.6469 --75.6547 --75.6453 --75.6641 --75.6438 --75.6625 --75.6469 --75.6594 --75.6438 --75.6484 --75.6469 --75.6531 --75.6438 --75.65 --75.6609 --75.65 --75.6453 --75.6484 --75.6516 --75.6422 --75.6438 --75.6406 --75.6453 --75.6453 --75.6453 --75.6453 --75.6281 --75.6578 --75.6391 --75.6531 --75.6516 --75.6484 --75.6469 --75.6469 --75.6469 --75.6375 --75.6516 --75.6406 --75.65 --75.6516 --75.6469 --75.6312 --75.65 --75.6297 --75.6547 --75.6516 --75.6422 --75.6375 --75.6406 --75.6391 --75.6375 --75.6469 --75.6406 --75.6391 --75.6453 --75.6391 --75.6359 --75.6359 --75.6406 --75.6453 --75.6359 --75.6531 --75.6359 --75.6438 --75.6406 --75.6484 --75.6375 --75.6438 --75.6531 --75.6484 --75.65 --75.6422 --75.6406 --75.6375 --75.6469 --75.65 --75.65 --75.6516 --75.6422 --75.6453 --75.6641 --75.6609 --75.6406 --75.6359 --75.6438 --75.6641 --75.65 --75.65 --75.6578 --75.6562 --75.6516 --75.6484 --75.6484 --75.6484 --75.6516 --75.6547 --75.6406 --75.6594 --75.6469 --75.6406 --75.6547 --75.6547 --75.6484 --75.6656 --75.6672 --75.6516 --75.6578 --75.6375 --75.6562 --75.6516 --75.6641 --75.65 --75.6703 --75.6547 --75.6594 --75.65 --75.6516 --75.6484 --75.65 --75.6516 --75.6422 --75.6625 --75.65 --75.6422 --75.6531 --75.6391 --75.6531 --75.6438 --75.6625 --75.6422 --75.6469 --75.6687 --75.6641 --75.6562 --75.6531 --75.6609 --75.6562 --75.6594 --75.6609 --75.6578 --75.6562 --75.6469 --75.6453 --75.6531 --75.6641 --75.6562 --75.6547 --75.6594 --75.6547 --75.6516 --75.6641 --75.6578 --75.6641 --75.6641 --75.6578 --75.6578 --75.6625 --75.6469 --75.6453 --75.6594 --75.6594 --75.6625 --75.6516 --75.6484 --75.6594 --75.6594 --75.6594 --75.65 --75.6625 --75.6703 --75.6531 --75.6594 --75.6422 --75.6609 --75.6609 --75.65 --75.6484 --75.6609 --75.6703 --75.6641 --75.6594 --75.6703 --75.6531 --75.6531 --75.6453 --75.6562 --75.6594 --75.65 --75.6625 --75.6578 --75.6422 --75.6516 --75.65 --75.6625 --75.6578 --75.6609 --75.6531 --75.6516 --75.6719 --75.6531 --75.6469 --75.6719 --75.6609 --75.6578 --75.6703 --75.6719 --75.6453 --75.6719 --75.6656 --75.6781 --75.6781 --75.6734 --75.6813 --75.6687 --75.6719 --75.6672 --75.6672 --75.6578 --75.6672 --75.6547 --75.6641 --75.6719 --75.6547 --75.6625 --75.6672 --75.6641 --75.6734 --75.6625 --75.6719 --75.6672 --75.6719 --75.6703 --75.6656 --75.6625 --75.6594 --75.675 --75.6734 --75.6547 --75.6484 --75.6625 --75.6594 --75.6687 --75.6828 --75.6766 --75.675 --75.6656 --75.6859 --75.675 --75.6687 --75.6813 --75.6641 --75.6656 --75.6797 --75.6656 --75.6641 --75.6844 --75.6703 --75.6719 --75.675 --75.6625 --75.6703 --75.6766 --75.6641 --75.6687 --75.6781 --75.6797 --75.6609 --75.675 --75.6672 --75.6766 --75.6844 --75.6687 --75.6766 --75.6656 --75.6781 --75.6734 --75.6609 --75.6641 --75.6734 --75.6797 --75.6703 --75.6766 --75.6703 --75.6719 --75.6844 --75.6781 --75.6813 --75.6672 --75.6766 --75.675 --75.6969 --75.6797 --75.6906 --75.6766 --75.6813 --75.6984 --75.6969 --75.6844 --75.6859 --75.6969 --75.6922 --75.6922 --75.6859 --75.6797 --75.6797 --75.6781 --75.6703 --75.6687 --75.6875 --75.6813 --75.7 --75.6813 --75.6828 --75.6859 --75.6656 --75.6828 --75.675 --75.6844 --75.6813 --75.6781 --75.6797 --75.6766 --75.6734 --75.6781 --75.6813 --75.6687 --75.6766 --75.6813 --75.6594 --75.6625 --75.6672 --75.6719 --75.6875 --75.6672 --75.6703 --75.675 --75.6844 --75.6766 --75.6719 --75.6797 --75.6719 --75.6687 --75.6781 --75.6766 --75.6766 --75.6813 --75.6766 --75.6781 --75.6672 --75.6828 --75.6766 --75.6781 --75.6828 --75.6687 --75.6844 --75.6813 --75.6828 --75.6891 --75.6859 --75.6687 --75.6969 --75.6797 --75.6766 --75.6969 --75.6797 --75.675 --75.6844 --75.6828 --75.6766 --75.6703 --75.6937 --75.675 --75.6828 --75.6828 --75.675 --75.6937 --75.6813 --75.6828 --75.6797 --75.6781 --75.6813 --75.6859 --75.6844 --75.6828 --75.6641 --75.675 --75.6609 --75.6813 --75.6734 --75.675 --75.6781 --75.6766 --75.6625 --75.6656 --75.6828 --75.6656 --75.6672 --75.6906 --75.6766 --75.6813 --75.6781 --75.6781 --75.6734 --75.6641 --75.6641 --75.6828 --75.6875 --75.6703 --75.6641 --75.6797 --75.6719 --75.6703 --75.6672 --75.6719 --75.6672 --75.6766 --75.6734 --75.6766 --75.6766 --75.6609 --75.6813 --75.6594 --75.6703 --75.6828 --75.6734 --75.6922 --75.6891 --75.6766 --75.6797 --75.6891 --75.6797 --75.6625 --75.675 --75.6703 --75.6766 --75.6766 --75.6578 --75.6672 --75.6797 --75.6656 --75.6781 --75.6828 --75.6594 --75.6797 --75.6797 --75.6625 --75.6781 --75.6672 --75.6781 --75.6703 --75.6687 --75.6781 --75.6813 --75.6875 --75.6703 --75.6609 --75.6734 --75.6875 --75.675 --75.6906 --75.6969 --75.6969 --75.6797 --75.675 --75.6953 --75.6844 --75.6734 --75.6828 --75.6719 --75.6687 --75.6859 --75.6781 --75.6813 --75.6922 --75.6844 --75.6797 --75.6781 --75.6891 --75.6828 --75.6828 --75.6797 --75.6703 --75.6859 --75.6719 --75.675 --75.6781 --75.6844 --75.6797 --75.6703 --75.6703 --75.6797 --75.6859 --75.6828 --75.6906 --75.6984 --75.6781 --75.6891 --75.6969 --75.6859 --75.6937 --75.6844 --75.6719 --75.6719 --75.6875 --75.6937 --75.6672 --75.6703 --75.6781 --75.6703 --75.6766 --75.6844 --75.6797 --75.6844 --75.6813 --75.6844 --75.6828 --75.6734 --75.6766 --75.6906 --75.6703 --75.6703 --75.6813 --75.6891 --75.6703 --75.6844 --75.6828 --75.6844 --75.6844 --75.6813 --75.6719 --75.6859 --75.6797 --75.6813 --75.6859 --75.6859 --75.6875 --75.6641 --75.6906 --75.6828 --75.6844 --75.6687 --75.6797 --75.6813 --75.6813 --75.6844 --75.6734 --75.675 --75.6719 --75.6859 --75.6859 --75.6984 --75.6828 --75.6672 --75.6906 --75.6766 --75.6875 --75.6969 --75.6984 --75.6969 --75.7031 --75.6906 --75.6969 --75.6906 --75.6844 --75.7 --75.6875 --75.7078 --75.7125 --75.6969 --75.7016 --75.7016 --75.675 --75.6906 --75.6891 --75.6781 --75.6937 --75.6797 --75.6937 --75.6781 --75.675 --75.675 --75.7016 --75.6922 --75.6859 --75.6969 --75.6766 --75.6906 --75.6891 --75.6906 --75.6891 --75.6891 --75.6875 --75.6937 --75.7031 --75.7016 --75.6906 --75.7031 --75.6813 --75.6906 --75.6906 --75.6906 --75.6766 --75.6875 --75.6859 --75.6828 --75.6922 --75.6984 --75.6766 --75.6781 --75.6875 --75.7 --75.6922 --75.6922 --75.7031 --75.6875 --75.7063 --75.6891 --75.6875 --75.6828 --75.6906 --75.6844 --75.6859 --75.6906 --75.6875 --75.6797 --75.6781 --75.6797 --75.6734 --75.6844 --75.6828 --75.6922 --75.6813 --75.6891 --75.6891 --75.6844 --75.6859 --75.6781 --75.6813 --75.6828 --75.6906 --75.6797 --75.6891 --75.6937 --75.6953 --75.6719 --75.6891 --75.6797 --75.6813 --75.6844 --75.675 --75.6797 --75.6797 --75.6953 --75.6953 --75.6828 --75.6781 --75.7 --75.6937 --75.6891 --75.6969 --75.6922 --75.7 --75.6875 --75.6937 --75.6844 --75.6875 --75.6953 --75.6922 --75.6828 --75.6953 --75.6969 --75.6828 --75.7 --75.7 --75.7109 --75.7156 --75.6937 --75.6922 --75.6937 --75.6906 --75.6875 --75.6922 --75.6922 --75.6813 --75.6937 --75.6891 --75.6969 --75.6953 --75.6906 --75.7 --75.6906 --75.6984 --75.6828 --75.7031 --75.7 --75.6937 --75.6875 --75.7031 --75.6969 --75.7031 --75.6984 --75.6969 --75.7 --75.7078 --75.7094 --75.6984 --75.6922 --75.7031 --75.7078 --75.7109 --75.7047 --75.7031 --75.6984 --75.7125 --75.7016 --75.7031 --75.7031 --75.7 --75.7063 --75.7109 --75.7063 --75.7109 --75.7094 --75.7047 --75.7 --75.7188 --75.7078 --75.7141 --75.7063 --75.7047 --75.7094 --75.7047 --75.7016 --75.7172 --75.7063 --75.7047 --75.6953 --75.7078 --75.7172 --75.6953 --75.7 --75.7063 --75.7016 --75.7125 --75.6984 --75.6937 --75.7188 --75.7063 --75.7094 --75.7078 --75.7063 --75.7094 --75.7016 --75.7031 --75.7172 --75.7063 --75.6828 --75.7016 --75.7031 --75.6984 --75.7172 --75.6969 --75.7 --75.7047 --75.6906 --75.6906 --75.6969 --75.6937 --75.6906 --75.7016 --75.6891 --75.7047 --75.7016 --75.7063 --75.7047 --75.7063 --75.6984 --75.6969 --75.6984 --75.7 --75.7016 --75.7078 --75.6891 --75.7031 --75.6922 --75.7188 --75.7109 --75.7016 --75.6891 --75.6984 --75.7047 --75.7 --75.6984 --75.6953 --75.7156 --75.7063 --75.7078 --75.7063 --75.7031 --75.7078 --75.6984 --75.6969 --75.6984 --75.7016 --75.6937 --75.7031 --75.7047 --75.7 --75.7047 --75.7094 --75.6922 --75.7016 --75.7109 --75.6891 --75.7 --75.6953 --75.7 --75.6922 --75.7 --75.6922 --75.7016 --75.7047 --75.7063 --75.7063 --75.7031 --75.7031 --75.7016 --75.6969 --75.7047 --75.7109 --75.7109 --75.6984 --75.7047 --75.7016 --75.7094 --75.7063 --75.6922 --75.6969 --75.7063 --75.7172 --75.6984 --75.7047 --75.7141 --75.7063 --75.7031 --75.7016 --75.7156 --75.7219 --75.7219 --75.6969 --75.7156 --75.7016 --75.725 --75.7063 --75.7109 --75.7125 --75.7156 --75.7078 --75.7078 --75.7063 --75.7031 --75.7 --75.6984 --75.7078 --75.7141 --75.7047 --75.6953 --75.7016 --75.6969 --75.7016 --75.6984 --75.7031 --75.7031 --75.6953 --75.6969 --75.7031 --75.6969 --75.6984 --75.6953 --75.6953 --75.6875 --75.7063 --75.6953 --75.6906 --75.6875 --75.6891 --75.7031 --75.6875 --75.7016 --75.6984 --75.6937 --75.6844 --75.7 --75.7 --75.6891 --75.6984 --75.6969 --75.7063 --75.7078 --75.7016 --75.6922 --75.7109 --75.7063 --75.7094 --75.7078 --75.7141 --75.6984 --75.7188 --75.7125 --75.7203 --75.7094 --75.7125 --75.7094 --75.7031 --75.7172 --75.6906 --75.7031 --75.7063 --75.7 --75.7094 --75.7109 --75.6969 --75.7109 --75.7063 --75.7125 --75.7188 --75.7172 --75.7141 --75.7063 --75.7 --75.6969 --75.6953 --75.7078 --75.7125 --75.7 --75.7 --75.7109 --75.6984 --75.7188 --75.7141 --75.7047 --75.7016 --75.7078 --75.7016 --75.7047 --75.6922 --75.6984 --75.6875 --75.6969 --75.7094 --75.7094 --75.6969 --75.7078 --75.6937 --75.6937 --75.7109 --75.6969 --75.7172 --75.7141 --75.7188 --75.7172 --75.7203 --75.7109 --75.7063 --75.6875 --75.7063 --75.7125 --75.6984 --75.7031 --75.7156 --75.7047 --75.7016 --75.6984 --75.7078 --75.7141 --75.7125 --75.7094 --75.7125 --75.7094 --75.7109 --75.7109 --75.7031 --75.7109 --75.7063 --75.7109 --75.7063 --75.6984 --75.6969 --75.7 --75.7188 --75.7078 --75.7078 --75.6969 --75.7047 --75.7219 --75.7172 --75.7125 --75.7078 --75.7188 --75.7047 --75.7078 --75.7203 --75.7203 --75.6906 --75.7031 --75.6797 --75.7031 --75.6937 --75.7031 --75.7188 --75.7109 --75.6953 --75.7266 --75.6984 --75.6984 --75.7031 --75.7234 --75.7063 --75.7078 --75.6953 --75.7016 --75.7 --75.7109 --75.7047 --75.7266 --75.6969 --75.7125 --75.7031 --75.6984 --75.7 --75.7063 --75.7078 --75.7109 --75.7063 --75.7063 --75.7016 --75.6953 --75.7125 --75.6922 --75.6984 --75.6969 --75.6953 --75.6984 --75.6844 --75.7125 --75.7047 --75.7094 --75.7047 --75.7156 --75.7219 --75.6969 --75.7125 --75.7188 --75.6984 --75.7109 --75.7063 --75.7063 --75.6844 --75.7016 --75.6859 --75.6969 --75.7047 --75.6969 --75.7125 --75.7141 --75.7141 --75.7109 --75.7063 --75.7047 --75.7172 --75.7078 --75.7156 --75.7031 --75.7031 --75.7125 --75.7109 --75.7125 --75.7016 --75.7094 --75.725 --75.7125 --75.7094 --75.7125 --75.7172 --75.7109 --75.7109 --75.7234 --75.7156 --75.7172 --75.725 --75.7219 --75.7141 --75.725 --75.7203 --75.7031 --75.725 --75.7328 --75.7094 --75.7172 --75.7141 --75.7266 --75.725 --75.7156 --75.7266 --75.7188 --75.7125 --75.7063 --75.7094 --75.7141 --75.7219 --75.7203 --75.7094 --75.725 --75.7156 --75.7344 --75.7125 --75.7203 --75.7109 --75.7078 --75.6984 --75.6922 --75.7047 --75.7078 --75.7016 --75.7078 --75.7141 --75.7109 --75.6969 --75.7047 --75.7031 --75.6906 --75.7094 --75.6922 --75.6953 --75.7109 --75.7094 --75.7109 --75.7109 --75.7078 --75.7141 --75.7188 --75.7047 --75.7297 --75.7172 --75.7156 --75.7172 --75.7 --75.7125 --75.7078 --75.7172 --75.7203 --75.7156 --75.7266 --75.7188 --75.7203 --75.7234 --75.725 --75.7234 --75.7141 --75.7063 --75.7172 --75.7172 --75.7203 --75.7141 --75.7125 --75.7328 --75.7188 --75.7297 --75.7328 --75.7094 --75.7031 --75.7063 --75.7063 --75.7141 --75.7172 --75.6953 --75.7125 --75.7094 --75.7109 --75.7344 --75.7047 --75.7141 --75.7078 --75.7078 --75.7266 --75.7172 --75.7188 --75.7031 --75.7156 --75.7188 --75.7234 --75.7219 --75.7328 --75.7188 --75.7156 --75.7219 --75.7063 --75.7141 --75.7047 --75.7172 --75.7172 --75.7172 --75.7141 --75.7047 --75.7156 --75.7109 --75.7203 --75.6891 --75.7203 --75.7172 --75.7063 --75.7078 --75.7125 --75.7234 --75.7203 --75.7078 --75.6984 --75.7266 --75.7219 --75.7109 --75.7047 --75.7125 --75.7125 --75.7109 --75.7203 --75.7016 --75.7156 --75.7172 --75.7125 --75.7266 --75.7234 --75.7297 --75.7156 --75.7141 --75.7078 --75.7172 --75.7047 --75.7094 --75.7094 --75.7094 --75.7125 --75.7063 --75.7094 --75.7078 --75.7047 --75.6984 --75.7094 --75.725 --75.7234 --75.7094 --75.6984 --75.7141 --75.7063 --75.6984 --75.7031 --75.7078 --75.6969 --75.7141 --75.6984 --75.7125 --75.7156 --75.7094 --75.7031 --75.6969 --75.7094 --75.7156 --75.7219 --75.7063 --75.7078 --75.7266 --75.7125 --75.7125 --75.7188 --75.7203 --75.7109 --75.725 --75.7156 --75.7234 --75.7203 --75.7094 --75.7172 --75.7328 --75.7297 --75.7094 --75.7141 --75.7281 --75.7203 --75.7172 --75.7219 --75.725 --75.7094 --75.7156 --75.7094 --75.7188 --75.725 --75.7141 --75.7047 --75.7172 --75.7234 --75.7156 --75.7188 --75.7312 --75.7203 --75.7281 --75.7156 --75.7266 --75.7234 --75.725 --75.7219 --75.7312 --75.7188 --75.7078 --75.7281 --75.7156 --75.7172 --75.7125 --75.7281 --75.7281 --75.7234 --75.7219 --75.7094 --75.7109 --75.7125 --75.7281 --75.7172 --75.725 --75.7188 --75.7391 --75.7188 --75.7328 --75.7359 --75.7188 --75.7234 --75.7078 --75.725 --75.7234 --75.7188 --75.7234 --75.7281 --75.7359 --75.7281 --75.7234 --75.7391 --75.7438 --75.7312 --75.7219 --75.7297 --75.7312 --75.7359 --75.7219 --75.7375 --75.7219 --75.7266 --75.7266 --75.7297 --75.7281 --75.725 --75.7266 --75.7234 --75.7234 --75.7125 --75.7203 --75.7297 --75.7125 --75.7297 --75.7297 --75.7188 --75.7219 --75.7312 --75.7188 --75.7281 --75.7234 --75.7438 --75.7234 --75.7344 --75.7203 --75.7188 --75.7 --75.7234 --75.7344 --75.7297 --75.7406 --75.7344 --75.7344 --75.7344 --75.7375 --75.7094 --75.725 --75.7281 --75.7328 --75.7219 --75.7297 --75.7125 --75.7125 --75.7281 --75.7234 --75.7172 --75.7156 --75.7172 --75.7234 --75.6984 --75.725 --75.725 --75.7234 --75.7312 --75.7172 --75.7203 --75.7328 --75.7234 --75.7234 --75.7359 --75.7344 --75.7312 --75.7375 --75.7203 --75.725 --75.7156 --75.7203 --75.7109 --75.7203 --75.7188 --75.7297 --75.7234 --75.7281 --75.7281 --75.7188 --75.7312 --75.7281 --75.7297 --75.7312 --75.7359 --75.7203 --75.7328 --75.7375 --75.7266 --75.7281 --75.7328 --75.7219 --75.7234 --75.7266 --75.7391 --75.7359 --75.7312 --75.725 --75.725 --75.7438 --75.7359 --75.7359 --75.7328 --75.7188 --75.7312 --75.7219 --75.7281 --75.7266 --75.7359 --75.725 --75.7469 --75.7188 --75.725 --75.7328 --75.7297 --75.7312 --75.7266 --75.7266 --75.7203 --75.7328 --75.725 --75.7281 --75.7297 --75.7391 --75.7312 --75.7266 --75.7359 --75.7281 --75.725 --75.7391 --75.7391 --75.7297 --75.7219 --75.7172 --75.7172 --75.7141 --75.7172 --75.7156 --75.725 --75.7203 --75.7219 --75.7328 --75.725 --75.7219 --75.7109 --75.7328 --75.7219 --75.7312 --75.7203 --75.7312 --75.7453 --75.7297 --75.7172 --75.7266 --75.7328 --75.7281 --75.7375 --75.7203 --75.7375 --75.7078 --75.7219 --75.7281 --75.7172 --75.7266 --75.7172 --75.7188 --75.7203 --75.725 --75.7188 --75.7234 --75.7297 --75.7312 --75.7344 --75.7234 --75.7266 --75.7172 --75.725 --75.725 --75.7172 --75.7281 --75.7312 --75.7297 --75.7109 --75.7156 --75.7266 --75.7188 --75.7141 --75.7156 --75.7109 --75.7094 --75.7219 --75.7188 --75.7109 --75.7312 --75.7422 --75.7422 --75.7297 --75.7375 --75.7312 --75.7297 --75.7234 --75.7266 --75.7266 --75.7234 --75.7484 --75.7297 --75.7234 --75.7344 --75.7328 --75.7359 --75.7438 --75.7297 --75.7297 --75.7219 --75.7281 --75.7219 --75.7375 --75.7281 --75.7266 --75.7188 --75.7312 --75.7375 --75.7172 --75.7141 --75.7172 --75.7266 --75.7312 --75.7281 --75.7141 --75.7312 --75.7141 --75.7312 --75.7391 --75.7281 --75.7266 --75.7188 --75.7297 --75.7422 --75.7188 --75.7422 --75.7172 --75.7281 --75.7375 --75.7234 --75.7359 --75.7281 --75.7453 --75.7516 --75.7391 --75.7297 --75.7281 --75.7406 --75.75 --75.7406 --75.7312 --75.7469 --75.7359 --75.7297 --75.7438 --75.7312 --75.7469 --75.7438 --75.7469 --75.7391 --75.7406 --75.7266 --75.7344 --75.7328 --75.7406 --75.7344 --75.7266 --75.7344 --75.7391 --75.7359 --75.7438 --75.7406 --75.7203 --75.7234 --75.7344 --75.725 --75.7422 --75.7219 --75.7312 --75.7297 --75.7344 --75.7266 --75.7266 --75.7188 --75.7188 --75.7234 --75.7297 --75.7281 --75.7219 --75.7484 --75.7375 --75.7375 --75.7438 --75.7406 --75.7344 --75.7328 --75.7375 --75.7391 --75.7359 --75.7266 --75.7312 --75.7297 --75.7422 --75.7156 --75.7203 --75.7328 --75.7391 --75.7281 --75.7406 --75.7234 --75.7406 --75.7312 --75.7266 --75.725 --75.7312 --75.7188 --75.7484 --75.7359 --75.7328 --75.7453 --75.7359 --75.7234 --75.7234 --75.7328 --75.7391 --75.7297 --75.7359 --75.7422 --75.7297 --75.7375 --75.7375 --75.7469 --75.7266 --75.7359 --75.7391 --75.7453 --75.7422 --75.7297 --75.7469 --75.7391 --75.7328 --75.7312 --75.7281 --75.7188 --75.7328 --75.7312 --75.7406 --75.7328 --75.725 --75.7281 --75.7219 --75.7297 --75.7156 --75.7281 --75.7281 --75.7297 --75.7375 --75.7188 --75.7344 --75.7109 --75.7219 --75.7344 --75.7312 --75.7234 --75.7234 --75.7266 --75.7188 --75.7438 --75.7406 --75.7391 --75.7453 --75.7438 --75.7312 --75.7375 --75.7219 --75.7203 --75.7375 --75.7281 --75.7219 --75.7297 --75.7266 --75.7375 --75.7281 --75.7203 --75.7297 --75.7453 --75.7359 --75.7375 --75.7469 --75.7422 --75.7328 --75.7281 --75.7297 --75.7359 --75.7328 --75.7438 --75.7312 --75.7281 --75.7438 --75.7594 --75.7344 --75.7484 --75.7328 --75.7359 --75.7406 --75.7547 --75.7516 --75.7391 --75.7484 --75.7578 --75.7453 --75.7375 --75.7469 --75.7516 --75.7312 --75.7422 --75.7438 --75.7422 --75.7406 --75.7469 --75.7438 --75.7359 --75.7312 --75.7266 --75.7422 --75.7469 --75.7578 --75.75 --75.7359 --75.7219 --75.7406 --75.7328 --75.7375 --75.7453 --75.7375 --75.7469 --75.7266 --75.7297 --75.7328 --75.7484 --75.7281 --75.7391 --75.7234 --75.7422 --75.7281 --75.7344 --75.7484 --75.7391 --75.7453 --75.7375 --75.7469 --75.7469 --75.7359 --75.7406 --75.7547 --75.7391 --75.7422 --75.7344 --75.7453 --75.7328 --75.7453 --75.7438 --75.7594 --75.7531 --75.7422 --75.7578 --75.7344 --75.7422 --75.725 --75.7438 --75.7406 --75.7422 --75.7469 --75.7578 --75.7328 --75.7438 --75.7422 --75.7234 --75.7531 --75.7453 --75.7406 --75.7359 --75.7391 --75.7438 --75.7344 --75.75 --75.7484 --75.7359 --75.75 --75.7484 --75.7516 --75.7359 --75.7328 --75.7312 --75.7391 --75.7391 --75.7359 --75.7375 --75.7453 --75.7422 --75.7375 --75.7391 --75.7422 --75.7344 --75.7391 --75.7359 --75.7422 --75.7344 --75.7234 --75.7406 --75.7281 --75.7359 --75.7469 --75.7359 --75.7375 --75.7484 --75.7375 --75.7281 --75.7344 --75.7328 --75.7328 --75.7359 --75.7312 --75.7297 --75.7438 --75.7359 --75.7391 --75.7344 --75.7344 --75.7422 --75.7422 --75.7438 --75.7391 --75.7266 --75.7594 --75.7391 --75.7391 --75.7547 --75.7531 --75.7406 --75.7484 --75.7484 --75.7547 --75.7422 --75.7328 --75.7344 --75.7422 --75.7391 --75.725 --75.7391 --75.7469 --75.7438 --75.7453 --75.7359 --75.7422 --75.7375 --75.7375 --75.7484 --75.7453 --75.7297 --75.7531 --75.725 --75.7438 --75.7344 --75.7312 --75.7438 --75.7391 --75.7438 --75.7375 --75.7422 --75.75 --75.7391 --75.7328 --75.7453 --75.7438 --75.7375 --75.7312 --75.7297 --75.7234 --75.7422 --75.7391 --75.7469 --75.7391 --75.7312 --75.7281 --75.7469 --75.7453 --75.7359 --75.7406 --75.7422 --75.7469 --75.7406 --75.7469 --75.7516 --75.7453 --75.7484 --75.7391 --75.7203 --75.7438 --75.7469 --75.7328 --75.7438 --75.7359 --75.7328 --75.7375 --75.7344 --75.7359 --75.7328 --75.7453 --75.7547 --75.7516 --75.7375 --75.7344 --75.7359 --75.7562 --75.7328 --75.7406 --75.7531 --75.7312 --75.7438 --75.7422 --75.7156 --75.7375 --75.7359 --75.7328 --75.725 --75.7469 --75.7469 --75.7234 --75.7391 --75.7391 --75.7375 --75.7391 --75.7328 --75.7344 --75.7375 --75.7375 --75.7328 --75.7406 --75.7375 --75.7359 --75.7375 --75.7516 --75.7438 --75.7516 --75.7484 --75.7422 --75.7438 --75.7438 --75.7406 --75.7359 --75.7422 --75.7391 --75.7328 --75.7344 --75.7328 --75.7312 --75.725 --75.7359 --75.7344 --75.7469 --75.7312 --75.7375 --75.7344 --75.7391 --75.7312 --75.7469 --75.7344 --75.7469 --75.7422 --75.7328 --75.7422 --75.7469 --75.7297 --75.7547 --75.7328 --75.75 --75.7297 --75.7531 --75.7438 --75.7406 --75.7344 --75.7359 --75.7562 --75.7312 --75.7422 --75.7516 --75.7406 --75.7312 --75.7406 --75.725 --75.7312 --75.7312 --75.7312 --75.7328 --75.7375 --75.7297 --75.7219 --75.7312 --75.7266 --75.725 --75.7312 --75.75 --75.7375 --75.7375 --75.7375 --75.7406 --75.7469 --75.7359 --75.7391 --75.7391 --75.7422 --75.7359 --75.7359 --75.7391 --75.7469 --75.7391 --75.7469 --75.7344 --75.7453 --75.7547 --75.7453 --75.7391 --75.7344 --75.7391 --75.7312 --75.7281 --75.7453 --75.7453 --75.7438 --75.725 --75.7438 --75.7484 --75.7516 --75.7391 --75.7438 --75.7406 --75.7391 --75.7484 --75.7484 --75.7422 --75.7484 --75.7391 --75.7453 --75.7344 --75.7422 --75.7422 --75.7328 --75.7469 --75.7328 --75.75 --75.7312 --75.7469 --75.7422 --75.7469 --75.7391 --75.7531 --75.7391 --75.7281 --75.7359 --75.7422 --75.7453 --75.7375 --75.7328 --75.7375 --75.7469 --75.7359 --75.7359 --75.75 --75.7312 --75.7469 --75.7469 --75.7484 --75.7562 --75.7328 --75.7297 --75.7453 --75.7547 --75.7469 --75.7391 --75.7422 --75.7344 --75.7297 --75.7438 --75.7391 --75.7172 --75.7375 --75.7391 --75.7312 --75.7281 --75.7312 --75.7328 --75.725 --75.7422 --75.75 --75.7328 --75.7547 --75.7438 --75.7484 --75.7453 --75.7453 --75.7297 --75.7422 --75.7391 --75.7328 --75.7203 --75.7391 --75.7328 --75.7453 --75.7344 --75.7406 --75.7453 --75.7469 --75.7359 --75.7484 --75.7469 --75.7484 --75.7328 --75.7438 --75.7406 --75.75 --75.7266 --75.7375 --75.7359 --75.7422 --75.7391 --75.7406 --75.7375 --75.7391 --75.7297 --75.7328 --75.7234 --75.7406 --75.7438 --75.7531 --75.7469 --75.7531 --75.7312 --75.725 --75.7516 --75.7312 --75.7328 --75.7406 --75.7375 --75.7594 --75.7359 --75.7484 --75.7453 --75.7438 --75.75 --75.7531 --75.75 --75.7391 --75.7328 --75.75 --75.7422 --75.7375 --75.7422 --75.7422 --75.7391 --75.7484 --75.7469 --75.7422 --75.7469 --75.7422 --75.7453 --75.7344 --75.7484 --75.7438 --75.7391 --75.75 --75.7562 --75.7531 --75.7641 --75.7547 --75.7531 --75.7438 --75.7406 --75.7531 --75.7391 --75.7406 --75.7422 --75.7422 --75.7531 --75.7391 --75.7531 --75.7422 --75.7359 --75.7469 --75.7531 --75.7469 --75.7594 --75.75 --75.7344 --75.7438 --75.7453 --75.7359 --75.7469 --75.7422 --75.7359 --75.7359 --75.7672 --75.75 --75.7453 --75.7516 --75.7516 --75.7641 --75.7516 --75.7406 --75.7438 --75.7594 --75.7438 --75.7562 --75.7609 --75.7531 --75.7531 --75.7672 --75.7547 --75.7641 --75.7531 --75.7562 --75.7531 --75.7531 --75.7516 --75.7375 --75.7625 --75.7562 --75.7625 --75.7625 --75.7469 --75.7562 --75.75 --75.7562 --75.7484 --75.7625 --75.7484 --75.75 --75.7469 --75.7688 --75.7625 --75.7578 --75.7453 --75.7531 --75.7484 --75.7422 --75.7469 --75.7562 --75.7547 --75.7453 --75.75 --75.7469 --75.7453 --75.7422 --75.7547 --75.7484 --75.7469 --75.7656 --75.7578 --75.7531 --75.7531 --75.7391 --75.7547 --75.7484 --75.7547 --75.7578 --75.75 --75.7578 --75.7531 --75.75 --75.7453 --75.7453 --75.7375 --75.7422 --75.75 --75.7484 --75.7547 --75.7438 --75.7641 --75.75 --75.7703 --75.7438 --75.7406 --75.7328 --75.75 --75.7406 --75.7562 --75.7484 --75.7578 --75.7547 --75.7469 --75.7484 --75.7484 --75.7531 --75.7391 --75.7609 --75.7484 --75.7531 --75.7641 --75.7625 --75.7422 --75.7438 --75.7453 --75.7547 --75.7484 --75.7438 --75.7516 --75.7516 --75.7297 --75.75 --75.7531 --75.7562 --75.7547 --75.7641 --75.7531 --75.7578 --75.7453 --75.7516 --75.7562 --75.7422 --75.7406 --75.7453 --75.7547 --75.7375 --75.75 --75.7406 --75.7469 --75.75 --75.7453 --75.7562 --75.75 --75.7453 --75.7344 --75.7469 --75.7562 --75.7469 --75.7438 --75.7453 --75.7625 --75.7531 --75.7484 --75.7484 --75.7469 --75.7469 --75.7484 --75.7531 --75.7359 --75.7422 --75.7469 --75.75 --75.7719 --75.7641 --75.7688 --75.7641 --75.7703 --75.7594 --75.7422 --75.7594 --75.7594 --75.7562 --75.7562 --75.7547 --75.7391 --75.7656 --75.7484 --75.7422 --75.7625 --75.7547 --75.7562 --75.7484 --75.7594 --75.7422 --75.7578 --75.7531 --75.7578 --75.7594 --75.7703 --75.7578 --75.7672 --75.7766 --75.7547 --75.7594 --75.7484 --75.7469 --75.7422 --75.7562 --75.7484 --75.7453 --75.7625 --75.7719 --75.7562 --75.7453 --75.7578 --75.7656 --75.7641 --75.7484 --75.7688 --75.7625 --75.7578 --75.7594 --75.75 --75.7438 --75.7656 --75.7594 --75.7469 --75.7547 --75.7516 --75.7734 --75.7672 --75.7531 --75.7422 --75.7578 --75.7484 --75.7328 --75.75 --75.7469 --75.7375 --75.7297 --75.7359 --75.7406 --75.7422 --75.7438 --75.7453 --75.7453 --75.7484 --75.7531 --75.75 --75.7562 --75.7641 --75.7484 --75.7562 --75.7469 --75.7672 --75.7562 --75.7469 --75.7453 --75.7484 --75.75 --75.7609 --75.7453 --75.7406 --75.7547 --75.7531 --75.7578 --75.7484 --75.7562 --75.7516 --75.7578 --75.7469 --75.7562 --75.7594 --75.7672 --75.7547 --75.7672 --75.7562 --75.7828 --75.7594 --75.7719 --75.7609 --75.7531 --75.7578 --75.7531 --75.7562 --75.7609 --75.7641 --75.7547 --75.7625 --75.7625 --75.7547 --75.7594 --75.7641 --75.7594 --75.7594 --75.7562 --75.7578 --75.75 --75.7547 --75.7609 --75.7547 --75.7625 --75.7594 --75.7609 --75.7516 --75.75 --75.7484 --75.7625 --75.7703 --75.7609 --75.75 --75.7516 --75.7531 --75.7562 --75.7609 --75.7609 --75.7562 --75.7469 --75.7609 --75.7656 --75.7672 --75.7734 --75.7641 --75.7625 --75.7672 --75.7578 --75.7656 --75.7594 --75.7531 --75.7688 --75.7594 --75.7609 --75.7594 --75.7672 --75.7656 --75.7609 --75.7594 --75.7625 --75.7688 --75.7562 --75.7641 --75.7609 --75.7547 --75.7562 --75.7766 --75.7578 --75.7547 --75.7672 --75.7703 --75.7656 --75.7469 --75.7516 --75.7594 --75.7688 --75.7641 --75.7594 --75.7625 --75.7609 --75.7672 --75.7688 --75.7719 --75.7688 --75.7719 --75.7797 --75.7781 --75.7719 --75.7594 --75.7719 --75.7766 --75.7688 --75.775 --75.7906 --75.7797 --75.7766 --75.7812 --75.7719 --75.7828 --75.7828 --75.7688 --75.7688 --75.7766 --75.7703 --75.7812 --75.7672 --75.7594 --75.7688 --75.7766 --75.7734 --75.7672 --75.7594 --75.7797 --75.7828 --75.7719 --75.7937 --75.7797 --75.7922 --75.7766 --75.7688 --75.7703 --75.7891 --75.7734 --75.7641 --75.7719 --75.7812 --75.7797 --75.7719 --75.7719 --75.775 --75.7719 --75.7766 --75.7734 --75.775 --75.7719 --75.7844 --75.775 --75.7547 --75.775 --75.7734 --75.7703 --75.7766 --75.7766 --75.7797 --75.7703 --75.7625 --75.775 --75.7734 --75.7734 --75.7688 --75.7766 --75.7578 --75.7797 --75.7844 --75.7609 --75.7875 --75.7719 --75.775 --75.7781 --75.7547 --75.7625 --75.7781 --75.775 --75.7719 --75.7734 --75.7844 --75.7781 --75.7547 --75.7672 --75.7734 --75.7766 --75.7719 --75.7594 --75.7703 --75.7656 --75.7656 --75.7734 --75.7562 --75.7625 --75.7672 --75.7484 --75.7703 --75.7594 --75.7641 --75.7719 --75.7641 --75.7672 --75.7703 --75.7875 --75.775 --75.7641 --75.7656 --75.7594 --75.775 --75.7641 --75.7781 --75.7594 --75.7578 --75.7672 --75.7594 --75.7703 --75.7531 --75.7531 --75.7641 --75.75 --75.7688 --75.7641 --75.7453 --75.7609 --75.7547 --75.7562 --75.7516 --75.7594 --75.7625 --75.7594 --75.7547 --75.7594 --75.7672 --75.7516 --75.7703 --75.7516 --75.7531 --75.7438 --75.7547 --75.7719 --75.7641 --75.75 --75.7594 --75.75 --75.7562 --75.7594 --75.7625 --75.7625 --75.75 --75.7672 --75.7656 --75.7594 --75.7578 --75.7578 --75.7641 --75.7641 --75.7609 --75.7578 --75.7641 --75.7875 --75.7641 --75.7672 --75.7609 --75.7734 --75.7688 --75.7625 --75.7672 --75.7594 --75.7641 --75.7562 --75.7656 --75.7734 --75.7641 --75.7703 --75.7672 --75.7641 --75.7703 --75.7562 --75.7562 --75.7547 --75.775 --75.7469 --75.7641 --75.7672 --75.7734 --75.7672 --75.7531 --75.7594 --75.7672 --75.7703 --75.75 --75.7641 --75.7641 --75.7641 --75.7828 --75.7562 --75.7672 --75.7672 --75.7625 --75.7859 --75.7766 --75.7688 --75.7812 --75.775 --75.7656 --75.7812 --75.7781 --75.7625 --75.7781 --75.7891 --75.7797 --75.7641 --75.7844 --75.7672 --75.7891 --75.7797 --75.7734 --75.775 --75.7594 --75.7562 --75.7781 --75.7734 --75.7688 --75.7766 --75.775 --75.7625 --75.7656 --75.7719 --75.7641 --75.7703 --75.7719 --75.7609 --75.775 --75.7797 --75.775 --75.7781 --75.7797 --75.7734 --75.7703 --75.7719 --75.7734 --75.7656 --75.7547 --75.7859 --75.775 --75.7641 --75.7609 --75.775 --75.7578 --75.7719 --75.7719 --75.7594 --75.7719 --75.7609 --75.7734 --75.7781 --75.7609 --75.7625 --75.7641 --75.7641 --75.7656 --75.7703 --75.7688 --75.7734 --75.7703 --75.7609 --75.775 --75.7688 --75.7703 --75.7875 --75.7781 --75.7719 --75.7734 --75.7766 --75.7734 --75.7641 --75.7703 --75.7703 --75.7656 --75.7797 --75.7734 --75.7688 --75.7688 --75.7609 --75.7641 --75.7719 --75.7688 --75.7594 --75.7734 --75.7703 --75.7766 --75.7688 --75.775 --75.7703 --75.7688 --75.7781 --75.7562 --75.7562 --75.7641 --75.7594 --75.7781 --75.7797 --75.7656 --75.7672 --75.7672 --75.7719 --75.7547 --75.7562 --75.7703 --75.7734 --75.7688 --75.7797 --75.7703 --75.7719 --75.7672 --75.7516 --75.7734 --75.7641 --75.7703 --75.7672 --75.7766 --75.7766 --75.7812 --75.7828 --75.775 --75.775 --75.7812 --75.7844 --75.7688 --75.775 --75.7812 --75.7734 --75.7766 --75.7734 --75.7688 --75.7688 --75.7719 --75.7734 --75.7578 --75.7672 --75.7781 --75.775 --75.7672 --75.7672 --75.7672 --75.7703 --75.7734 --75.7766 --75.7672 --75.7844 --75.7734 --75.7734 --75.7812 --75.7672 --75.7844 --75.7781 --75.7609 --75.7812 --75.7734 --75.7781 --75.7688 --75.7703 --75.7672 --75.7656 --75.7781 --75.7812 --75.7688 --75.7688 --75.7672 --75.7766 --75.7656 --75.7734 --75.7641 --75.7594 --75.7625 --75.7531 --75.7906 --75.7625 --75.7703 --75.775 --75.7578 --75.775 --75.7656 --75.7562 --75.7719 --75.7766 --75.7641 --75.7719 --75.7766 --75.7797 --75.7625 --75.7719 --75.7719 --75.7688 --75.7781 --75.775 --75.7656 --75.7781 --75.7797 --75.7797 --75.7859 --75.7891 --75.7844 --75.7734 --75.7828 --75.7719 --75.7797 --75.7672 --75.7703 --75.7828 --75.7703 --75.7594 --75.7688 --75.7766 --75.7891 --75.775 --75.7703 --75.775 --75.7688 --75.775 --75.7906 --75.7812 --75.775 --75.7688 --75.7719 --75.7672 --75.7688 --75.7766 --75.7797 --75.775 --75.7703 --75.7672 --75.7797 --75.7766 --75.7734 --75.7859 --75.775 --75.7766 --75.7766 --75.7859 --75.7812 --75.7844 --75.7859 --75.7859 --75.775 --75.7922 --75.7797 --75.7719 --75.7953 --75.7797 --75.7734 --75.7734 --75.7781 --75.7766 --75.7734 --75.7734 --75.7641 --75.7734 --75.7734 --75.7656 --75.7766 --75.7719 --75.7703 --75.7625 --75.7594 --75.7688 --75.7828 --75.7703 --75.7875 --75.7812 --75.7719 --75.7812 --75.775 --75.775 --75.7656 --75.7766 --75.7766 --75.7609 --75.7812 --75.7922 --75.7891 --75.7891 --75.7906 --75.7859 --75.7859 --75.775 --75.7953 --75.7875 --75.7672 --75.7828 --75.7688 --75.7875 --75.7828 --75.8016 --75.8047 --75.7703 --75.7984 --75.7969 --75.775 --75.7875 --75.7922 --75.7812 --75.7734 --75.7891 --75.7891 --75.7828 --75.7844 --75.7984 --75.7875 --75.7906 --75.7937 --75.7875 --75.7969 --75.7937 --75.7953 --75.7922 --75.7781 --75.8016 --75.7859 --75.7984 --75.7906 --75.7781 --75.7922 --75.7953 --75.7969 --75.7922 --75.7844 --75.7859 --75.7875 --75.7937 --75.7937 --75.7891 --75.7891 --75.7953 --75.7969 --75.7922 --75.7859 --75.7797 --75.7891 --75.7953 --75.7828 --75.7734 --75.7844 --75.775 --75.8 --75.7844 --75.7906 --75.7922 --75.7734 --75.7906 --75.7828 --75.7891 --75.7937 --75.7922 --75.7969 --75.7906 --75.7953 --75.7812 --75.7906 --75.7875 --75.7937 --75.7844 --75.7984 --75.775 --75.775 --75.775 --75.775 --75.7734 --75.8 --75.7781 --75.7828 --75.7797 --75.7844 --75.7875 --75.7875 --75.7922 --75.7812 --75.7844 --75.775 --75.7781 --75.7844 --75.7875 --75.7906 --75.7906 --75.7844 --75.7781 --75.7844 --75.7688 --75.7875 --75.7797 --75.7797 --75.775 --75.7688 --75.775 --75.7922 --75.7703 --75.7734 --75.7703 --75.7812 --75.7781 --75.7906 --75.7812 --75.7891 --75.7859 --75.7719 --75.7766 --75.7703 --75.7859 --75.7844 --75.7781 --75.7906 --75.7766 --75.7891 --75.7734 --75.7922 --75.7797 --75.7906 --75.7859 --75.7703 --75.7906 --75.7812 --75.7766 --75.7797 --75.7844 --75.7734 --75.7734 --75.7766 --75.7828 --75.7766 --75.7766 --75.7891 --75.7859 --75.775 --75.7672 --75.7812 --75.775 --75.7828 --75.7844 --75.7672 --75.7766 --75.775 --75.7641 --75.7781 --75.7609 --75.7875 --75.7703 --75.7734 --75.7766 --75.7719 --75.7734 --75.7672 --75.7828 --75.7828 --75.7719 --75.7891 --75.7891 --75.7781 --75.7766 --75.7625 --75.7781 --75.7703 --75.7812 --75.7719 --75.7656 --75.7688 --75.775 --75.7812 --75.7781 --75.7953 --75.7781 --75.7672 --75.7844 --75.7844 --75.7766 --75.7906 --75.7844 --75.7766 --75.7922 --75.7922 --75.7844 --75.7781 --75.7812 --75.7812 --75.7781 --75.7859 --75.7875 --75.7828 --75.7906 --75.7906 --75.7953 --75.7922 --75.7891 --75.7828 --75.7828 --75.7891 --75.7797 --75.7922 --75.7844 --75.7953 --75.7969 --75.7953 --75.7875 --75.8031 --75.7984 --75.7984 --75.7875 --75.8 --75.7812 --75.7859 --75.7906 --75.7891 --75.7766 --75.7984 --75.7937 --75.7953 --75.7906 --75.7906 --75.7891 --75.7797 --75.7906 --75.7875 --75.7891 --75.7875 --75.7766 --75.7781 --75.7891 --75.7906 --75.7828 --75.7828 --75.7953 --75.7922 --75.7875 --75.7875 --75.7891 --75.7859 --75.7859 --75.7906 --75.7969 --75.7969 --75.7906 --75.7922 --75.7953 --75.7922 --75.7797 --75.7844 --75.7969 --75.8 --75.7906 --75.7891 --75.7891 --75.775 --75.7812 --75.7859 --75.7859 --75.8 --75.7719 --75.7953 --75.7844 --75.7797 --75.7797 --75.7891 --75.775 --75.7953 --75.7781 --75.7937 --75.7875 --75.7937 --75.7969 --75.7844 --75.7922 --75.8 --75.7984 --75.7906 --75.7937 --75.8047 --75.7828 --75.7766 --75.7781 --75.7906 --75.7812 --75.7937 --75.7906 --75.7906 --75.7906 --75.7719 --75.7781 --75.7875 --75.7922 --75.7859 --75.7812 --75.7906 --75.7797 --75.7875 --75.7828 --75.7719 --75.7922 --75.7922 --75.7906 --75.7859 --75.7875 --75.7937 --75.7828 --75.7906 --75.7859 --75.8031 --75.7937 --75.8016 --75.7953 --75.7922 --75.7797 --75.7828 --75.7953 --75.7906 --75.7953 --75.8 --75.7828 --75.7953 --75.7922 --75.7937 --75.7906 --75.7906 --75.8016 --75.7937 --75.7844 --75.7844 --75.7984 --75.7906 --75.7875 --75.7906 --75.7953 --75.7875 --75.7781 --75.7766 --75.7922 --75.7828 --75.7953 --75.7937 --75.7875 --75.7797 --75.7828 --75.7828 --75.7906 --75.7875 --75.7891 --75.7812 --75.7906 --75.7891 --75.7734 --75.7875 --75.7875 --75.8 --75.7953 --75.7969 --75.8141 --75.8016 --75.7953 --75.8141 --75.7812 --75.7937 --75.7859 --75.7922 --75.7875 --75.7891 --75.8078 --75.7922 --75.7953 --75.8063 --75.8047 --75.7969 --75.7937 --75.7922 --75.7937 --75.7875 --75.8047 --75.7844 --75.8 --75.8016 --75.7937 --75.7891 --75.8031 --75.8031 --75.7859 --75.7891 --75.7781 --75.8016 --75.7859 --75.7812 --75.7922 --75.7937 --75.7875 --75.8031 --75.8 --75.8016 --75.8031 --75.7953 --75.7922 --75.7984 --75.7844 --75.7859 --75.7844 --75.8 --75.8031 --75.8047 --75.8094 --75.7969 --75.7953 --75.7922 --75.8094 --75.7937 --75.8172 --75.8016 --75.7953 --75.7906 --75.7828 --75.8 --75.7859 --75.7953 --75.7984 --75.7922 --75.7828 --75.7875 --75.7875 --75.7922 --75.8125 --75.8031 --75.7984 --75.8094 --75.8063 --75.7922 --75.7969 --75.7906 --75.8016 --75.7937 --75.8016 --75.8031 --75.8031 --75.7891 --75.8078 --75.7953 --75.7922 --75.7953 --75.8047 --75.7969 --75.7953 --75.7875 --75.7906 --75.7891 --75.7984 --75.7937 --75.7844 --75.8031 --75.7891 --75.8063 --75.7875 --75.7828 --75.7828 --75.7953 --75.7812 --75.7937 --75.8063 --75.7844 --75.7937 --75.7953 --75.7812 --75.7906 --75.7844 --75.7969 --75.7906 --75.7937 --75.7937 --75.7953 --75.7937 --75.7859 --75.7844 --75.7984 --75.7953 --75.8063 --75.7953 --75.8031 --75.8016 --75.8016 --75.7953 --75.7937 --75.7891 --75.7906 --75.7953 --75.7922 --75.7891 --75.7859 --75.8 --75.7828 --75.7906 --75.8094 --75.7937 --75.7953 --75.7953 --75.8047 --75.7891 --75.7953 --75.7844 --75.7906 --75.7969 --75.7953 --75.7875 --75.7844 --75.7797 --75.7781 --75.8031 --75.7875 --75.7859 --75.7922 --75.7797 --75.7875 --75.7875 --75.7844 --75.7937 --75.7969 --75.7828 --75.7906 --75.7875 --75.7953 --75.7922 --75.7922 --75.8063 --75.8047 --75.7891 --75.7953 --75.7922 --75.7906 --75.7937 --75.7937 --75.7937 --75.7937 --75.8078 --75.7922 --75.7891 --75.7922 --75.7859 --75.7891 --75.7891 --75.7969 --75.8016 --75.7937 --75.8078 --75.7984 --75.7922 --75.7969 --75.7875 --75.7859 --75.7984 --75.8063 --75.7969 --75.7984 --75.8 --75.7922 --75.7906 --75.7859 --75.7906 --75.7969 --75.7812 --75.7984 --75.8 --75.7812 --75.7969 --75.7937 --75.7828 --75.7844 --75.7875 --75.7922 --75.7875 --75.7984 --75.7953 --75.7984 --75.7969 --75.7969 --75.7922 --75.8078 --75.7828 --75.7937 --75.7984 --75.7891 --75.7937 --75.8125 --75.8047 --75.7906 --75.8125 --75.8 --75.8031 --75.8078 --75.7969 --75.8125 --75.8063 --75.8094 --75.8109 --75.8078 --75.8016 --75.7937 --75.8094 --75.8063 --75.8031 --75.8187 --75.8109 --75.8031 --75.8172 --75.8 --75.8109 --75.7984 --75.8094 --75.7953 --75.7875 --75.7969 --75.8016 --75.7984 --75.8031 --75.7953 --75.8016 --75.7984 --75.7891 --75.7828 --75.7922 --75.7969 --75.7891 --75.8 --75.7859 --75.8031 --75.7984 --75.7984 --75.7844 --75.8031 --75.7937 --75.8094 --75.7859 --75.8016 --75.7875 --75.8 --75.7906 --75.8 --75.7828 --75.7969 --75.7984 --75.7891 --75.7984 --75.7969 --75.7906 --75.7984 --75.8031 --75.8063 --75.8203 --75.8063 --75.7953 --75.7969 --75.8031 --75.8031 --75.8016 --75.8078 --75.8016 --75.8 --75.8047 --75.7969 --75.7922 --75.7906 --75.7969 --75.7859 --75.8078 --75.8047 --75.8047 --75.7906 --75.8063 --75.8063 --75.8125 --75.8047 --75.8141 --75.8031 --75.8109 --75.8094 --75.7953 --75.8078 --75.7953 --75.7969 --75.8047 --75.8 --75.7859 --75.8 --75.8203 --75.8063 --75.8156 --75.8094 --75.8094 --75.8203 --75.8156 --75.8094 --75.8187 --75.8266 --75.8266 --75.8109 --75.8063 --75.8109 --75.8172 --75.8141 --75.8187 --75.8031 --75.8219 --75.8047 --75.8172 --75.7891 --75.8125 --75.8063 --75.8078 --75.7875 --75.7984 --75.8094 --75.8266 --75.8047 --75.8078 --75.8047 --75.7906 --75.8109 --75.8109 --75.8047 --75.8156 --75.8109 --75.8266 --75.8234 --75.8328 --75.8297 --75.825 --75.8078 --75.8187 --75.8219 --75.8172 --75.8156 --75.8141 --75.8156 --75.8156 --75.8203 --75.8172 --75.8187 --75.8219 --75.8203 --75.8125 --75.8094 --75.8094 --75.8172 --75.8094 --75.8172 --75.8125 --75.8094 --75.8094 --75.8047 --75.8109 --75.8094 --75.7953 --75.8063 --75.7969 --75.8016 --75.8094 --75.8172 --75.8063 --75.8094 --75.7984 --75.8031 --75.8109 --75.8031 --75.8125 --75.8094 --75.8172 --75.8141 --75.8094 --75.8094 --75.8172 --75.8109 --75.8172 --75.8 --75.8 --75.8063 --75.8109 --75.8141 --75.8187 --75.8234 --75.8141 --75.8187 --75.825 --75.8156 --75.8203 --75.8203 --75.8094 --75.8219 --75.8078 --75.8187 --75.8172 --75.8047 --75.7984 --75.8047 --75.8063 --75.8156 --75.8063 --75.8141 --75.8109 --75.8203 --75.8219 --75.8187 --75.8141 --75.7969 --75.8125 --75.8063 --75.8125 --75.8172 --75.8187 --75.8297 --75.8297 --75.8172 --75.8281 --75.8125 --75.8313 --75.8141 --75.825 --75.8187 --75.8219 --75.825 --75.8187 --75.8203 --75.8313 --75.8172 --75.8156 --75.8219 --75.8078 --75.8328 --75.8234 --75.8344 --75.8203 --75.8281 --75.8234 --75.8234 --75.8172 --75.825 --75.8219 --75.8109 --75.8094 --75.8047 --75.8234 --75.8172 --75.8203 --75.8094 --75.8047 --75.8125 --75.8125 --75.8141 --75.8078 --75.8156 --75.8078 --75.8172 --75.8047 --75.8109 --75.8125 --75.8031 --75.8125 --75.8031 --75.8094 --75.8063 --75.8 --75.8094 --75.8078 --75.8109 --75.8047 --75.8063 --75.8172 --75.8078 --75.7969 --75.8203 --75.8141 --75.8109 --75.8203 --75.8219 --75.8172 --75.8016 --75.8078 --75.8156 --75.8047 --75.8219 --75.8109 --75.8094 --75.8187 --75.8125 --75.8297 --75.8172 --75.8172 --75.8063 --75.8156 --75.8047 --75.8125 --75.8172 --75.8281 --75.7984 --75.8125 --75.8109 --75.7969 --75.8078 --75.8219 --75.8203 --75.8078 --75.8047 --75.8109 --75.8047 --75.8156 --75.8172 --75.8187 --75.8109 --75.8203 --75.8203 --75.8109 --75.8078 --75.8219 --75.8109 --75.8141 --75.8187 --75.8187 --75.8203 --75.8047 --75.8203 --75.8172 --75.8234 --75.8266 --75.8094 --75.8141 --75.8031 --75.8172 --75.825 --75.8078 --75.8109 --75.8328 --75.8109 --75.8234 --75.8094 --75.8281 --75.8016 --75.8078 --75.8109 --75.8109 --75.8078 --75.8094 --75.8187 --75.8141 --75.8375 --75.8109 --75.8234 --75.8297 --75.8187 --75.8203 --75.8047 --75.8109 --75.8094 --75.8109 --75.7953 --75.8125 --75.8219 --75.8094 --75.8141 --75.8125 --75.8297 --75.8359 --75.8172 --75.8234 --75.8281 --75.825 --75.8281 --75.825 --75.8187 --75.825 --75.8281 --75.8234 --75.8094 --75.8156 --75.8172 --75.8281 --75.8203 --75.8266 --75.8172 --75.8281 --75.8141 --75.8156 --75.8109 --75.8109 --75.8359 --75.8156 --75.8219 --75.8141 --75.8219 --75.8234 --75.8078 --75.8187 --75.8016 --75.8156 --75.8125 --75.8063 --75.8172 --75.8172 --75.8078 --75.8063 --75.8109 --75.8141 --75.8203 --75.8047 --75.8031 --75.8203 --75.8125 --75.8109 --75.8078 --75.8109 --75.8297 --75.8187 --75.8125 --75.8281 --75.8109 --75.8219 --75.8047 --75.8094 --75.8187 --75.8078 --75.8234 --75.7937 --75.8187 --75.8063 --75.8063 --75.8234 --75.8109 --75.8141 --75.8172 --75.8078 --75.8109 --75.8172 --75.8234 --75.8094 --75.8141 --75.8094 --75.8078 --75.8187 --75.8203 --75.8125 --75.8078 --75.8094 --75.8172 --75.8172 --75.8234 --75.8094 --75.8156 --75.8219 --75.8172 --75.8063 --75.8203 --75.8219 --75.8016 --75.8078 --75.8047 --75.8203 --75.8172 --75.8063 --75.8063 --75.7969 --75.8156 --75.8172 --75.8063 --75.825 --75.8313 --75.8125 --75.8281 --75.8078 --75.8234 --75.8203 --75.8297 --75.8219 --75.8281 --75.8063 --75.8109 --75.8187 --75.8125 --75.8203 --75.8141 --75.8125 --75.8172 --75.7969 --75.8156 --75.8047 --75.8 --75.8063 --75.8016 --75.8016 --75.7953 --75.8125 --75.8094 --75.8078 --75.8219 --75.8234 --75.7937 --75.8203 --75.8141 --75.8187 --75.8156 --75.8125 --75.8125 --75.8 --75.825 --75.8016 --75.8141 --75.8297 --75.8063 --75.8203 --75.8156 --75.825 --75.825 --75.8187 --75.8219 --75.825 --75.8234 --75.8063 --75.8172 --75.8234 --75.8172 --75.8187 --75.8031 --75.8297 --75.8203 --75.8344 --75.8094 --75.8266 --75.8234 --75.8016 --75.8219 --75.8078 --75.8313 --75.8187 --75.8313 --75.8109 --75.8141 --75.8219 --75.8219 --75.8281 --75.8266 --75.8063 --75.8078 --75.8219 --75.8219 --75.8266 --75.8063 --75.8266 --75.8219 --75.8281 --75.8172 --75.8187 --75.8219 --75.8234 --75.8406 --75.8344 --75.8297 --75.8125 --75.8234 --75.8375 --75.8328 --75.8281 --75.8375 --75.8297 --75.8281 --75.8281 --75.8359 --75.8375 --75.8266 --75.8234 --75.8203 --75.8187 --75.8156 --75.8234 --75.8078 --75.8125 --75.8172 --75.8125 --75.8094 --75.8063 --75.8203 --75.8234 --75.8094 --75.8203 --75.8063 --75.8031 --75.8141 --75.8187 --75.8063 --75.8125 --75.8094 --75.8141 --75.8203 --75.8109 --75.8141 --75.8109 --75.7984 --75.8109 --75.8047 --75.8094 --75.8234 --75.8047 --75.8078 --75.8156 --75.8219 --75.8141 --75.8156 --75.8141 --75.8063 --75.8078 --75.8109 --75.8125 --75.8187 --75.8078 --75.8125 --75.8047 --75.8203 --75.8125 --75.8125 --75.8172 --75.8109 --75.8016 --75.8016 --75.8094 --75.8063 --75.8094 --75.8063 --75.7953 --75.8016 --75.8016 --75.8094 --75.8031 --75.8016 --75.8047 --75.8125 --75.8109 --75.8094 --75.8172 --75.8203 --75.8203 --75.8125 --75.8063 --75.8125 --75.8219 --75.8172 --75.8078 --75.8219 --75.8063 --75.8109 --75.8109 --75.8187 --75.8172 --75.8281 --75.8031 --75.8234 --75.8156 --75.8219 --75.8125 --75.825 --75.8203 --75.8156 --75.8031 --75.8156 --75.8125 --75.8125 --75.8109 --75.8187 --75.8125 --75.8094 --75.8141 --75.8187 --75.8078 --75.8141 --75.8187 --75.8187 --75.8187 --75.8156 --75.8063 --75.8266 --75.8187 --75.8109 --75.8156 --75.8266 --75.8203 --75.8141 --75.8125 --75.8109 --75.8203 --75.8078 --75.8297 --75.8141 --75.8266 --75.8172 --75.8156 --75.8094 --75.8078 --75.8109 --75.8219 --75.8266 --75.8219 --75.825 --75.8172 --75.8156 --75.8203 --75.8156 --75.8141 --75.8109 --75.8063 --75.8016 --75.8203 --75.8219 --75.8047 --75.8187 --75.8203 --75.8203 --75.8141 --75.8078 --75.8094 --75.8078 --75.8187 --75.8141 --75.8109 --75.8172 --75.8078 --75.8016 --75.7969 --75.8187 --75.7922 --75.8109 --75.8078 --75.8078 --75.8156 --75.8141 --75.8 --75.8016 --75.8125 --75.8016 --75.8063 --75.8141 --75.8203 --75.8078 --75.8031 --75.8031 --75.8 --75.8016 --75.8094 --75.8172 --75.7984 --75.8078 --75.8203 --75.8187 --75.8078 --75.8141 --75.8156 --75.8156 --75.8172 --75.8094 --75.8109 --75.8031 --75.8094 --75.8125 --75.8172 --75.8109 --75.8109 --75.8016 --75.8063 --75.8 --75.8109 --75.8156 --75.8047 --75.8078 --75.8047 --75.8063 --75.7969 --75.8266 --75.8203 --75.8172 --75.8141 --75.8172 --75.8109 --75.8234 --75.8156 --75.8172 --75.8109 --75.825 --75.8078 --75.8266 --75.8219 --75.8203 --75.8078 --75.8141 --75.8203 --75.8297 --75.8266 --75.8219 --75.825 --75.8141 --75.8063 --75.8266 --75.8187 --75.8125 --75.8094 --75.7937 --75.8156 --75.8047 --75.8063 --75.8125 --75.8125 --75.8141 --75.8109 --75.8406 --75.8313 --75.8094 --75.8172 --75.8203 --75.8219 --75.8203 --75.8172 --75.8078 --75.8094 --75.8172 --75.8125 --75.8219 --75.8094 --75.8031 --75.8172 --75.8078 --75.8219 --75.8187 --75.8109 --75.8172 --75.8047 --75.8109 --75.8141 --75.8187 --75.8219 --75.8156 --75.8031 --75.8141 --75.8156 --75.8156 --75.8047 --75.7906 --75.8125 --75.8094 --75.8016 --75.8156 --75.8172 --75.8219 --75.8078 --75.8172 --75.8109 --75.8047 --75.8 --75.8063 --75.8047 --75.8109 --75.8063 --75.8141 --75.8141 --75.8 --75.8156 --75.8141 --75.8219 --75.8125 --75.8094 --75.8266 --75.8156 --75.8172 --75.8094 --75.8094 --75.8047 --75.8125 --75.8172 --75.8078 --75.8047 --75.8156 --75.8094 --75.8172 --75.8094 --75.8141 --75.8203 --75.8172 --75.8172 --75.8109 --75.8422 --75.8078 --75.8047 --75.8016 --75.8172 --75.8047 --75.8172 --75.8187 --75.8156 --75.825 --75.8203 --75.8344 --75.8047 --75.8344 --75.8297 --75.8187 --75.8047 --75.8187 --75.8031 --75.8313 --75.8281 --75.8141 --75.825 --75.8328 --75.8187 --75.8234 --75.8328 --75.825 --75.8406 --75.8281 --75.8297 --75.8375 --75.825 --75.825 --75.8156 --75.8219 --75.8391 --75.8328 --75.8219 --75.8203 --75.8281 --75.8203 --75.8234 --75.8203 --75.8234 --75.8203 --75.8313 --75.8328 --75.8187 --75.8219 --75.8422 --75.8203 --75.8219 --75.8281 --75.8219 --75.8344 --75.8219 --75.8313 --75.8328 --75.8328 --75.8313 --75.8266 --75.8344 --75.8172 --75.8172 --75.8375 --75.8234 --75.8156 --75.8203 --75.8281 --75.8391 --75.8172 --75.8047 --75.8187 --75.8219 --75.8281 --75.8219 --75.8219 --75.8266 --75.8156 --75.8125 --75.8172 --75.8344 --75.8203 --75.8156 --75.8281 --75.8344 --75.8344 --75.8234 --75.8281 --75.8125 --75.8281 --75.825 --75.8266 --75.8156 --75.8125 --75.8344 --75.8156 --75.8219 --75.825 --75.8187 --75.8281 --75.8234 --75.8219 --75.8234 --75.8172 --75.8047 --75.8187 --75.8219 --75.8187 --75.8078 --75.8234 --75.8266 --75.8187 --75.8125 --75.8078 --75.8266 --75.8187 --75.8328 --75.8234 --75.8172 --75.8266 --75.8359 --75.8266 --75.8438 --75.8438 --75.8281 --75.8219 --75.8063 --75.8203 --75.8094 --75.8094 --75.8125 --75.8063 --75.8156 --75.8266 --75.8109 --75.8219 --75.8078 --75.8313 --75.8109 --75.8359 --75.8266 --75.8156 --75.8203 --75.8313 --75.8297 --75.8375 --75.8266 --75.8359 --75.8375 --75.825 --75.8281 --75.8203 --75.8172 --75.8359 --75.8203 --75.8203 --75.8156 --75.8344 --75.8266 --75.8281 --75.8375 --75.8344 --75.8375 --75.8406 --75.8313 --75.8234 --75.8187 --75.8344 --75.8344 --75.8281 --75.8172 --75.8297 --75.8187 --75.8266 --75.8281 --75.8297 --75.8328 --75.8219 --75.8172 --75.8187 --75.8281 --75.8156 --75.8203 --75.8094 --75.8234 --75.825 --75.8313 --75.825 --75.8141 --75.825 --75.8266 --75.825 --75.8438 --75.8203 --75.825 --75.8328 --75.8187 --75.8234 --75.8234 --75.8344 --75.8313 --75.8391 --75.8266 --75.8234 --75.825 --75.8219 --75.8328 --75.825 --75.8297 --75.825 --75.8328 --75.8203 --75.8234 --75.8375 --75.8172 --75.8344 --75.8281 --75.8297 --75.8297 --75.8125 --75.8313 --75.8203 --75.8187 --75.8187 --75.8219 --75.8266 --75.8219 --75.8187 --75.8203 --75.8125 --75.8187 --75.8047 --75.8281 --75.8203 --75.8078 --75.8219 --75.8141 --75.8187 --75.8203 --75.8094 --75.8281 --75.8172 --75.8125 --75.8219 --75.8203 --75.825 --75.825 --75.8234 --75.8234 --75.8156 --75.8203 --75.825 --75.825 --75.8406 --75.8094 --75.8375 --75.8266 --75.8156 --75.8187 --75.8094 --75.8109 --75.8328 --75.8359 --75.8359 --75.8453 --75.8344 --75.8297 --75.8281 --75.8281 --75.8328 --75.8297 --75.8359 --75.8375 --75.8375 --75.8313 --75.8156 --75.8344 --75.8281 --75.8203 --75.8328 --75.8156 --75.8125 --75.8328 --75.8203 --75.8281 --75.8266 --75.8219 --75.8313 --75.8125 --75.8375 --75.8219 --75.8141 --75.8219 --75.8203 --75.8063 --75.8094 --75.8156 --75.825 --75.8187 --75.8125 --75.825 --75.8172 --75.8187 --75.8281 --75.8266 --75.8187 --75.8453 --75.8234 --75.8187 --75.8141 --75.8172 --75.8187 --75.8297 --75.8125 --75.825 --75.8187 --75.825 --75.8109 --75.8313 --75.8234 --75.8219 --75.8172 --75.8063 --75.8094 --75.825 --75.8297 --75.8156 --75.8109 --75.825 --75.8109 --75.8141 --75.8109 --75.8266 --75.8281 --75.8094 --75.8094 --75.8109 --75.8203 --75.8172 --75.8187 --75.8125 --75.8187 --75.8344 --75.8094 --75.825 --75.8203 --75.8125 --75.8234 --75.825 --75.8234 --75.8313 --75.8359 --75.8281 --75.8234 --75.8172 --75.8234 --75.8172 --75.8141 --75.825 --75.8219 --75.8187 --75.8313 --75.8203 --75.8234 --75.8203 --75.8109 --75.8172 --75.8016 --75.8266 --75.8125 --75.8172 --75.8172 --75.8219 --75.8344 --75.8219 --75.8094 --75.8219 --75.8141 --75.8219 --75.8187 --75.8281 --75.8359 --75.8156 --75.8109 --75.8141 --75.8187 --75.8078 --75.8281 --75.8203 --75.8156 --75.8047 --75.8266 --75.8172 --75.7984 --75.8109 --75.8156 --75.8078 --75.8141 --75.7953 --75.8297 --75.8047 --75.8 --75.8141 --75.8219 --75.8078 --75.8219 --75.8156 --75.8016 --75.7984 --75.8187 --75.8078 --75.8344 --75.8219 --75.8078 --75.8344 --75.8187 --75.8172 --75.8094 --75.8125 --75.8187 --75.8031 --75.8031 --75.825 --75.8094 --75.8234 --75.8156 --75.8266 --75.8187 --75.8063 --75.8187 --75.8156 --75.8187 --75.8156 --75.8187 --75.8172 --75.8234 --75.8094 --75.8203 --75.8172 --75.8359 --75.8187 --75.8172 --75.825 --75.8297 --75.8297 --75.8234 --75.8234 --75.8141 --75.8281 --75.8234 --75.8266 --75.8141 --75.8109 --75.8266 --75.8219 --75.8187 --75.8187 --75.8234 --75.8297 --75.8234 --75.825 --75.8344 --75.8344 --75.825 --75.825 --75.8344 --75.8234 --75.8234 --75.8391 --75.825 --75.8156 --75.8344 --75.8266 --75.8016 --75.8313 --75.8187 --75.8297 --75.8266 --75.8156 --75.8234 --75.8125 --75.8187 --75.8219 --75.8172 --75.8063 --75.8141 --75.8156 --75.8078 --75.8172 --75.8141 --75.8109 --75.8172 --75.8203 --75.8156 --75.8109 --75.8203 --75.8234 --75.8141 --75.8234 --75.8125 --75.8234 --75.8141 --75.8266 --75.8125 --75.8203 --75.8187 --75.8281 --75.8125 --75.8 --75.8047 --75.8156 --75.8141 --75.8281 --75.8125 --75.8219 --75.8219 --75.8172 --75.8141 --75.8203 --75.8172 --75.8156 --75.8187 --75.8141 --75.8016 --75.8031 --75.7922 --75.8156 --75.8125 --75.8219 --75.8281 --75.8125 --75.8156 --75.8172 --75.8266 --75.8094 --75.8234 --75.8063 --75.825 --75.8141 --75.8125 --75.8297 --75.8187 --75.8281 --75.8219 --75.8078 --75.8187 --75.825 --75.8016 --75.8219 --75.8203 --75.8266 --75.8203 --75.8141 --75.8219 --75.8063 --75.8172 --75.8031 --75.8109 --75.8063 --75.7969 --75.8141 --75.8187 --75.8219 --75.8234 --75.8187 --75.8016 --75.8125 --75.8109 --75.8094 --75.8219 --75.825 --75.8141 --75.8234 --75.8141 --75.8172 --75.8219 --75.8344 --75.8203 --75.7953 --75.8187 --75.8172 --75.7875 --75.7922 --75.7906 --75.8078 --75.825 --75.8094 --75.8 --75.8141 --75.8094 --75.8203 --75.8109 --75.8078 --75.8156 --75.7953 --75.8125 --75.7953 --75.8031 --75.8187 --75.7984 --75.8266 --75.8156 --75.8094 --75.8078 --75.8344 --75.8141 --75.8078 --75.8125 --75.8172 --75.8172 --75.8125 --75.8125 --75.8063 --75.8156 --75.8141 --75.8078 --75.8297 --75.8047 --75.8063 --75.8125 --75.8219 --75.8063 --75.8297 --75.8141 --75.8219 --75.8156 --75.8187 --75.825 --75.8219 --75.8109 --75.8234 --75.8156 --75.825 --75.8109 --75.8109 --75.8313 --75.8156 --75.8078 --75.8266 --75.8172 --75.8125 --75.8234 --75.8375 --75.8234 --75.8172 --75.8391 --75.8328 --75.8172 --75.8266 --75.8266 --75.8203 --75.8109 --75.825 --75.8219 --75.8266 --75.8313 --75.8172 --75.8219 --75.8297 --75.8313 --75.8219 --75.8219 --75.8156 --75.8187 --75.8172 --75.8219 --75.8172 --75.8141 --75.8094 --75.8375 --75.825 --75.825 --75.8313 --75.8375 --75.8344 --75.8156 --75.8344 --75.8359 --75.8297 --75.8297 --75.8234 --75.825 --75.8266 --75.8281 --75.8172 --75.825 --75.8234 --75.8172 --75.8219 --75.8094 --75.8187 --75.825 --75.8141 --75.8141 --75.8125 --75.8234 --75.8078 --75.8172 --75.8125 --75.8219 --75.8234 --75.8203 --75.8297 --75.8234 --75.8234 --75.825 --75.8156 --75.8 --75.8156 --75.8109 --75.8266 --75.8141 --75.8156 --75.8125 --75.825 --75.8047 --75.8219 --75.8047 --75.8078 --75.825 --75.8156 --75.8281 --75.8313 --75.8219 --75.8375 --75.8187 --75.8109 --75.8313 --75.8219 --75.8313 --75.8187 --75.8203 --75.8203 --75.825 --75.8109 --75.8109 --75.8172 --75.8156 --75.8047 --75.8172 --75.8156 --75.8078 --75.8141 --75.8203 --75.8141 --75.8156 --75.8234 --75.8016 --75.8109 --75.8109 --75.8281 --75.7984 --75.8063 --75.8172 --75.8125 --75.8187 --75.8187 --75.8109 --75.8125 --75.8047 --75.8031 --75.8156 --75.8141 --75.8063 --75.8234 --75.8313 --75.8172 --75.8187 --75.8203 --75.8016 --75.8172 --75.8125 --75.8203 --75.8219 --75.8203 --75.8109 --75.8063 --75.8203 --75.8141 --75.8156 --75.8047 --75.8125 --75.8281 --75.8141 --75.8125 --75.8234 --75.8219 --75.8203 --75.8125 --75.8156 --75.8156 --75.8203 --75.8094 --75.8203 --75.8156 --75.8156 --75.8109 --75.825 --75.8125 --75.8219 --75.8172 --75.8125 --75.8094 --75.8234 --75.8063 --75.8234 --75.8234 --75.8031 --75.8172 --75.8125 --75.8141 --75.8187 --75.8156 --75.8187 --75.8094 --75.8094 --75.8187 --75.8203 --75.8094 --75.8078 --75.8094 --75.8187 --75.8234 --75.8234 --75.8203 --75.8328 --75.8156 --75.8313 --75.8266 --75.8219 --75.8313 --75.8109 --75.8187 --75.8125 --75.8125 --75.8203 --75.8234 --75.8078 --75.8187 --75.8094 --75.8187 --75.8141 --75.8156 --75.8187 --75.8063 --75.8141 --75.8234 --75.8297 --75.8141 --75.8203 --75.8187 --75.8313 --75.8187 --75.8141 --75.8266 --75.8297 --75.8234 --75.8281 --75.8172 --75.8172 --75.8203 --75.8297 --75.8109 --75.8203 --75.8172 --75.8203 --75.8328 --75.8344 --75.8219 --75.8297 --75.8297 --75.8219 --75.8344 --75.8187 --75.8156 --75.825 --75.8281 --75.8141 --75.8328 --75.8219 --75.8219 --75.8219 --75.8203 --75.8172 --75.8203 --75.8094 --75.8234 --75.8297 --75.8172 --75.8172 --75.825 --75.8203 --75.8172 --75.8172 --75.8156 --75.825 --75.8156 --75.8141 --75.8172 --75.8234 --75.8094 --75.8187 --75.8109 --75.8203 --75.8156 --75.8172 --75.8313 --75.8281 --75.8281 --75.8141 --75.8141 --75.8391 --75.8172 --75.8203 --75.8281 --75.8203 --75.8172 --75.8219 --75.825 --75.8344 --75.8328 --75.8219 --75.8328 --75.8219 --75.825 --75.8359 --75.8391 --75.8297 --75.8266 --75.8297 --75.8391 --75.8234 --75.8547 --75.8234 --75.8234 --75.8281 --75.8313 --75.8234 --75.8438 --75.8234 --75.8391 --75.8234 --75.8203 --75.8391 --75.8297 --75.8281 --75.8297 --75.8375 --75.8219 --75.8422 --75.8328 --75.8313 --75.8281 --75.8375 --75.8297 --75.8406 --75.8547 --75.8328 --75.8406 --75.8422 --75.8375 --75.8375 --75.8406 --75.8531 --75.8484 --75.8516 --75.8391 --75.8297 --75.8328 --75.85 --75.8391 --75.8422 --75.8453 --75.8438 --75.8562 --75.8375 --75.8313 --75.8328 --75.8281 --75.825 --75.8391 --75.8281 --75.8313 --75.8234 --75.8219 --75.825 --75.8172 --75.8234 --75.8281 --75.825 --75.8344 --75.8344 --75.8266 --75.8344 --75.8297 --75.8422 --75.8297 --75.8297 --75.8359 --75.8234 --75.8203 --75.8313 --75.8266 --75.8219 --75.8359 --75.825 --75.8344 --75.825 --75.8313 --75.8297 --75.825 --75.8297 --75.8297 --75.8219 --75.8219 --75.8234 --75.8313 --75.8531 --75.8234 --75.8266 --75.8109 --75.8203 --75.8359 --75.8203 --75.8234 --75.8281 --75.8313 --75.8266 --75.825 --75.8281 --75.8438 --75.8391 --75.8469 --75.8266 --75.8313 --75.8281 --75.8234 --75.8313 --75.85 --75.8422 --75.8125 --75.8219 --75.8203 --75.8094 --75.8297 --75.8453 --75.8391 --75.8187 --75.8344 --75.8531 --75.8297 --75.8344 --75.8234 --75.8203 --75.8297 --75.8266 --75.8281 --75.8313 --75.8313 --75.8422 --75.8234 --75.8297 --75.8297 --75.8328 --75.8219 --75.8219 --75.8219 --75.8187 --75.8266 --75.8281 --75.8156 --75.8234 --75.8141 --75.825 --75.8094 --75.8203 --75.8328 --75.8125 --75.8234 --75.8156 --75.825 --75.8234 --75.8109 --75.8187 --75.8156 --75.8172 --75.8125 --75.8047 --75.8203 --75.8219 --75.825 --75.8156 --75.825 --75.8266 --75.8141 --75.8141 --75.825 --75.8234 --75.8313 --75.8219 --75.8187 --75.8234 --75.8203 --75.8266 --75.825 --75.8313 --75.8266 --75.8234 --75.8219 --75.8172 --75.8109 --75.8203 --75.8187 --75.8328 --75.825 --75.8438 --75.8281 --75.8313 --75.8422 --75.8297 --75.8359 --75.8281 --75.8266 --75.8125 --75.8266 --75.8141 --75.8094 --75.8187 --75.8234 --75.8187 --75.8203 --75.8281 --75.8344 --75.8234 --75.8141 --75.8125 --75.8281 --75.8219 --75.825 --75.8219 --75.8219 --75.8187 --75.8187 --75.8156 --75.8187 --75.8187 --75.8313 --75.8266 --75.8234 --75.8266 --75.8281 --75.8313 --75.8094 --75.8344 --75.8172 --75.8281 --75.8313 --75.8219 --75.8391 --75.8359 --75.8156 --75.8266 --75.8328 --75.8391 --75.825 --75.8234 --75.8344 --75.8375 --75.8375 --75.8297 --75.8234 --75.8156 --75.8187 --75.8328 --75.8313 --75.8234 --75.8266 --75.8266 --75.8187 --75.8359 --75.8359 --75.8531 --75.8328 --75.8234 --75.8266 --75.8313 --75.8313 --75.8266 --75.8281 --75.8313 --75.8281 --75.8281 --75.825 --75.8266 --75.825 --75.8141 --75.8344 --75.8281 --75.8203 --75.8297 --75.8187 --75.8297 --75.8313 --75.8375 --75.8375 --75.8203 --75.8375 --75.8219 --75.8234 --75.8203 --75.8328 --75.8266 --75.8344 --75.8203 --75.8 --75.8234 --75.8141 --75.8125 --75.8281 --75.8141 --75.8125 --75.8266 --75.8203 --75.8375 --75.8391 --75.8281 --75.8187 --75.8281 --75.8234 --75.8281 --75.8281 --75.8359 --75.8234 --75.8234 --75.8219 --75.8266 --75.8375 --75.8281 --75.8344 --75.8328 --75.8313 --75.8359 --75.8219 --75.8219 --75.825 --75.825 --75.825 --75.8156 --75.8375 --75.8297 --75.8359 --75.825 --75.8281 --75.8203 --75.8313 --75.8344 --75.8234 --75.8375 --75.8219 --75.8344 --75.8203 --75.8297 --75.8234 --75.8266 --75.8234 --75.8219 --75.8234 --75.8328 --75.8109 --75.8266 --75.8172 --75.8187 --75.8156 --75.8359 --75.8281 --75.8359 --75.8234 --75.8328 --75.8266 --75.825 --75.8359 --75.8203 --75.8266 --75.825 --75.8234 --75.8266 --75.8297 --75.8266 --75.8281 --75.8234 --75.8234 --75.825 --75.8391 --75.8359 --75.8297 --75.8391 --75.8375 --75.8234 --75.8344 --75.8438 --75.8234 --75.8281 --75.8422 --75.8234 --75.8313 --75.8328 --75.8328 --75.8344 --75.85 --75.8219 --75.8344 --75.8344 --75.8344 --75.8375 --75.8375 --75.8328 --75.8391 --75.8313 --75.8203 --75.8219 --75.8328 --75.8281 --75.8297 --75.8266 --75.8297 --75.8422 --75.8313 --75.8266 --75.825 --75.8297 --75.8453 --75.8422 --75.8375 --75.8359 --75.825 --75.8438 --75.8328 --75.8422 --75.8359 --75.8375 --75.8313 --75.825 --75.8344 --75.8187 --75.8297 --75.825 --75.8359 --75.8281 --75.8375 --75.8266 --75.8328 --75.8359 --75.8313 --75.8375 --75.8359 --75.8297 --75.8328 --75.8453 --75.8297 --75.8359 --75.8297 --75.8375 --75.8391 --75.8375 --75.8328 --75.8406 --75.8313 --75.8453 --75.8281 --75.8297 --75.8375 --75.8344 --75.8234 --75.8344 --75.8234 --75.8266 --75.8375 --75.8266 --75.8391 --75.8297 --75.8438 --75.8234 --75.8328 --75.8391 --75.8375 --75.8328 --75.8234 --75.8516 --75.8375 --75.8391 --75.8438 --75.8469 --75.8422 --75.8375 --75.8562 --75.8391 --75.825 --75.8422 --75.8328 --75.8406 --75.8359 --75.8484 --75.8406 --75.8391 --75.8328 --75.8391 --75.8438 --75.825 --75.8359 --75.8359 --75.8359 --75.8406 --75.8422 --75.8266 --75.8453 --75.8422 --75.8375 --75.8516 --75.8516 --75.8406 --75.8516 --75.8344 --75.8406 --75.8359 --75.8266 --75.8344 --75.8453 --75.825 --75.8375 --75.8406 --75.8344 --75.8375 --75.8266 --75.8344 --75.8297 --75.8391 --75.8281 --75.8391 --75.8438 --75.8328 --75.8422 --75.8359 --75.8344 --75.8391 --75.8219 --75.8328 --75.8359 --75.8328 --75.8172 --75.8391 --75.8453 --75.8313 --75.8344 --75.8234 --75.85 --75.8297 --75.8375 --75.8406 --75.8531 --75.8359 --75.8375 --75.8391 --75.8359 --75.8219 --75.8219 --75.8281 --75.8422 --75.8219 --75.8328 --75.8313 --75.8281 --75.8359 --75.8391 --75.8391 --75.8344 --75.8359 --75.825 --75.8391 --75.8375 --75.8344 --75.8375 --75.8313 --75.8422 --75.8344 --75.8313 --75.8344 --75.8297 --75.8328 --75.8375 --75.8156 --75.8328 --75.8344 --75.8391 --75.8422 --75.8187 --75.8375 --75.8406 --75.8187 --75.8281 --75.8375 --75.8344 --75.8281 --75.825 --75.8234 --75.825 --75.8391 --75.8219 --75.8328 --75.8297 --75.8281 --75.8281 --75.8281 --75.8359 --75.8328 --75.8453 --75.8438 --75.8484 --75.85 --75.8484 --75.8453 --75.8344 --75.8359 --75.85 --75.8359 --75.8516 --75.8453 --75.8469 --75.8438 --75.8344 --75.8562 --75.8484 --75.8406 --75.8422 --75.8375 --75.8516 --75.8438 --75.8406 --75.8438 --75.825 --75.8438 --75.8234 --75.8375 --75.8328 --75.8484 --75.8375 --75.8344 --75.8422 --75.8375 --75.8484 --75.8328 --75.8453 --75.8266 --75.8391 --75.8438 --75.8328 --75.8578 --75.8328 --75.8328 --75.825 --75.8234 --75.8187 --75.8422 --75.8328 --75.8375 --75.8266 --75.8328 --75.8281 --75.8438 --75.8219 --75.8328 --75.8297 --75.8516 --75.8422 --75.8328 --75.8391 --75.8438 --75.8297 --75.8453 --75.8375 --75.8391 --75.8422 --75.8406 --75.8531 --75.8422 --75.8281 --75.8313 --75.8453 --75.8391 --75.8281 --75.8234 --75.8391 --75.8406 --75.8375 --75.8375 --75.8266 --75.8438 --75.8344 --75.825 --75.8484 --75.8313 --75.8203 --75.8297 --75.8297 --75.8469 --75.8453 --75.8391 --75.8313 --75.8484 --75.8453 --75.8359 --75.8406 --75.8313 --75.8344 --75.8453 --75.8469 --75.8313 --75.8266 --75.8359 --75.8344 --75.8359 --75.8438 --75.8328 --75.8375 --75.8344 --75.8438 --75.8344 --75.8266 --75.8375 --75.8187 --75.8453 --75.8297 --75.8375 --75.8094 --75.8328 --75.8328 --75.825 --75.8109 --75.8109 --75.8313 --75.8187 --75.8328 --75.8328 --75.8328 --75.8297 --75.8313 --75.8359 --75.8219 --75.825 --75.8281 --75.8313 --75.8281 --75.8375 --75.8234 --75.8344 --75.8281 --75.8406 --75.8297 --75.8281 --75.8281 --75.8344 --75.8328 --75.8141 --75.825 --75.8234 --75.8234 --75.8313 --75.8297 --75.8547 --75.8406 --75.8422 --75.8359 --75.8234 --75.8422 --75.8313 --75.8344 --75.8359 --75.8391 --75.8344 --75.8344 --75.8281 --75.8438 --75.8328 --75.85 --75.8531 --75.8344 --75.8328 --75.8344 --75.8375 --75.8391 --75.8187 --75.8187 --75.8422 --75.8359 --75.8234 --75.8344 --75.8359 --75.8328 --75.8344 --75.8234 --75.8359 --75.8234 --75.8406 --75.8297 --75.8234 --75.8344 --75.8344 --75.8344 --75.8266 --75.8453 --75.8359 --75.8281 --75.8375 --75.8453 --75.8438 --75.8281 --75.8328 --75.825 --75.8344 --75.825 --75.8359 --75.8344 --75.8359 --75.8484 --75.8391 --75.8375 --75.8453 --75.8344 --75.8281 --75.8281 --75.8359 --75.8328 --75.8422 --75.8375 --75.8344 --75.8391 --75.8344 --75.8266 --75.8328 --75.8375 --75.825 --75.825 --75.8313 --75.8297 --75.8281 --75.8391 --75.8203 --75.8234 --75.8297 --75.8281 --75.8438 --75.8344 --75.8344 --75.8406 --75.8375 --75.8391 --75.8359 --75.8344 --75.8281 --75.8406 --75.8281 --75.8359 --75.8406 --75.8375 --75.8297 --75.8578 --75.8391 --75.8438 --75.8562 --75.8438 --75.8484 --75.8375 --75.8344 --75.8406 --75.8406 --75.8391 --75.8391 --75.8484 --75.8422 --75.8484 --75.8313 --75.8344 --75.85 --75.8375 --75.8344 --75.8531 --75.8484 --75.8531 --75.8516 --75.8422 --75.8547 --75.8438 --75.8406 --75.8531 --75.8438 --75.8391 --75.8266 --75.8375 --75.85 --75.8297 --75.8422 --75.8453 --75.8438 --75.8234 --75.8281 --75.8391 --75.8375 --75.8359 --75.8297 --75.8313 --75.8375 --75.8281 --75.8344 --75.8344 --75.8531 --75.8391 --75.8391 --75.8344 --75.8422 --75.8484 --75.8406 --75.8516 --75.8313 --75.8328 --75.8328 --75.8453 --75.8375 --75.8438 --75.8578 --75.8406 --75.8313 --75.8359 --75.8344 --75.8406 --75.8328 --75.85 --75.8422 --75.8344 --75.8625 --75.8453 --75.85 --75.8391 --75.8375 --75.8438 --75.8625 --75.8469 --75.8406 --75.8391 --75.8438 --75.8406 --75.8516 --75.8359 --75.85 --75.8391 --75.8438 --75.8359 --75.8516 --75.8531 --75.8297 --75.8453 --75.8391 --75.8391 --75.8422 --75.8453 --75.8391 --75.8344 --75.8391 --75.8328 --75.8359 --75.8328 --75.8391 --75.8344 --75.8438 --75.8422 --75.8328 --75.8422 --75.8297 --75.8469 --75.825 --75.8438 --75.8328 --75.8406 --75.8453 --75.8344 --75.8328 --75.8328 --75.8375 --75.8344 --75.8266 --75.8344 --75.8484 --75.85 --75.8375 --75.8297 --75.8391 --75.8344 --75.8422 --75.8375 --75.8469 --75.8469 --75.8438 --75.8344 --75.8516 --75.8438 --75.8375 --75.8375 --75.8484 --75.8516 --75.8531 --75.8484 --75.8391 --75.8406 --75.8375 --75.8484 --75.8469 --75.8438 --75.8516 --75.8469 --75.8453 --75.8453 --75.8391 --75.8375 --75.8344 --75.8469 --75.8469 --75.8375 --75.8406 --75.8547 --75.8375 --75.85 --75.8391 --75.8328 --75.8531 --75.8547 --75.8391 --75.8453 --75.8422 --75.8438 --75.8547 --75.8578 --75.8484 --75.8438 --75.8359 --75.8594 --75.8469 --75.8641 --75.8625 --75.8641 --75.8594 --75.8609 --75.8625 --75.8703 --75.8656 --75.8672 --75.8609 --75.8672 --75.8656 --75.85 --75.8578 --75.8562 --75.85 --75.8531 --75.8625 --75.8656 --75.8516 --75.85 --75.8391 --75.8547 --75.8562 --75.8594 --75.8578 --75.8594 --75.8703 --75.8547 --75.85 --75.8641 --75.8656 --75.8594 --75.8547 --75.8438 --75.85 --75.8578 --75.8484 --75.8594 --75.85 --75.8484 --75.8531 --75.8469 --75.8453 --75.8375 --75.8672 --75.8422 --75.8484 --75.8469 --75.8484 --75.8531 --75.8562 --75.8531 --75.8438 --75.8375 --75.8453 --75.8391 --75.8547 --75.8578 --75.8516 --75.8516 --75.8453 --75.8531 --75.8516 --75.8578 --75.8547 --75.8547 --75.8594 --75.8609 --75.8484 --75.8578 --75.8438 --75.8578 --75.8641 --75.8594 --75.8562 --75.8547 --75.8547 --75.8594 --75.8531 --75.8484 --75.8547 --75.8609 --75.8484 --75.8531 --75.8516 --75.8672 --75.8625 --75.8562 --75.8547 --75.8672 --75.8719 --75.8688 --75.8688 --75.8641 --75.8609 --75.8531 --75.8672 --75.8562 --75.8578 --75.8656 --75.8547 --75.8578 --75.8609 --75.85 --75.85 --75.8562 --75.8609 --75.8547 --75.8625 --75.8453 --75.8562 --75.8594 --75.8609 --75.8484 --75.8641 --75.8562 --75.8484 --75.8516 --75.8531 --75.8453 --75.8562 --75.8562 --75.8516 --75.8672 --75.85 --75.8594 --75.8469 --75.8438 --75.8469 --75.8438 --75.8562 --75.8625 --75.8625 --75.8562 --75.8547 --75.8562 --75.8484 --75.8703 --75.8406 --75.8578 --75.8594 --75.8453 --75.8609 --75.8516 --75.8594 --75.8656 --75.8516 --75.8547 --75.8562 --75.8656 --75.8547 --75.8562 --75.8547 --75.8531 --75.8484 --75.85 --75.8672 --75.8562 --75.8578 --75.8469 --75.8484 --75.8547 --75.8719 --75.8609 --75.8562 --75.8625 --75.8641 --75.8703 --75.8656 --75.8562 --75.8672 --75.8531 --75.8516 --75.8562 --75.875 --75.8594 --75.8594 --75.8688 --75.8609 --75.8656 --75.8531 --75.8547 --75.8531 --75.8609 --75.8531 --75.8609 --75.8703 --75.8656 --75.8656 --75.8688 --75.8625 --75.8578 --75.8766 --75.8516 --75.8641 --75.8516 --75.8625 --75.8688 --75.85 --75.8594 --75.8766 --75.8578 --75.8609 --75.8484 --75.8641 --75.8672 --75.8562 --75.8609 --75.8688 --75.8609 --75.8688 --75.8688 --75.8594 --75.8656 --75.8594 --75.8703 --75.8516 --75.8719 --75.8656 --75.8547 --75.8547 --75.8578 --75.8422 --75.8547 --75.8672 --75.8703 --75.8656 --75.8766 --75.8672 --75.8672 --75.8594 --75.8578 --75.8594 --75.8594 --75.8672 --75.8578 --75.8609 --75.8672 --75.8547 --75.8578 --75.8688 --75.8703 --75.8672 --75.8719 --75.8703 --75.8594 --75.8562 --75.8719 --75.8719 --75.8609 --75.8656 --75.8625 --75.8625 --75.8734 --75.8609 --75.8578 --75.8484 --75.8578 --75.8594 --75.85 --75.8516 --75.8625 --75.8594 --75.8609 --75.8578 --75.8562 --75.8516 --75.8547 --75.8484 --75.8641 --75.8547 --75.8688 --75.8578 --75.8719 --75.8688 --75.8719 --75.8672 --75.8609 --75.8625 --75.8641 --75.8672 --75.8578 --75.8703 --75.8609 --75.8688 --75.8719 --75.8766 --75.8703 --75.8719 --75.875 --75.8547 --75.8734 --75.8672 --75.8672 --75.8672 --75.8625 --75.8641 --75.8578 --75.875 --75.8391 --75.8594 --75.8547 --75.8609 --75.8516 --75.8641 --75.8703 --75.8578 --75.8625 --75.8578 --75.8672 --75.8656 --75.8562 --75.8531 --75.8516 --75.8578 --75.8516 --75.8562 --75.8547 --75.8625 --75.8578 --75.8766 --75.8625 --75.8672 --75.8531 --75.8609 --75.8609 --75.8562 --75.8641 --75.8547 --75.8547 --75.8719 --75.8531 --75.8562 --75.8531 --75.8609 --75.8547 --75.8578 --75.8609 --75.8562 --75.8578 --75.8578 --75.8766 --75.8562 --75.8484 --75.8797 --75.8547 --75.8609 --75.8641 --75.8625 --75.8734 --75.8422 --75.8734 --75.8688 --75.8781 --75.8547 --75.8609 --75.8609 --75.8641 --75.8859 --75.8656 --75.8594 --75.8672 --75.8625 --75.85 --75.8641 --75.8609 --75.8672 --75.8594 --75.8688 --75.8578 --75.8641 --75.8578 --75.8547 --75.8625 --75.8703 --75.8516 --75.8656 --75.8594 --75.8688 --75.8703 --75.8719 --75.8734 --75.8656 --75.8656 --75.8531 --75.8641 --75.8734 --75.8828 --75.8781 --75.8719 --75.8688 --75.8562 --75.8688 --75.8625 --75.8641 --75.8625 --75.8781 --75.8828 --75.8719 --75.8703 --75.875 --75.8672 --75.8703 --75.8781 --75.8703 --75.8625 --75.8672 --75.8703 --75.8766 --75.8672 --75.8781 --75.8641 --75.8875 --75.8594 --75.8672 --75.8703 --75.8656 --75.8641 --75.8719 --75.8656 --75.8703 --75.8719 --75.8734 --75.85 --75.8672 --75.8734 --75.8578 --75.8641 --75.8656 --75.8688 --75.8656 --75.8641 --75.8688 --75.8703 --75.8609 --75.8562 --75.8703 --75.8859 --75.8703 --75.8703 --75.8812 --75.875 --75.8719 --75.8766 --75.8703 --75.8703 --75.8781 --75.8672 --75.875 --75.875 --75.8797 --75.8875 --75.8766 --75.8781 --75.8938 --75.875 --75.8781 --75.8781 --75.875 --75.8672 --75.8797 --75.875 --75.8859 --75.8797 --75.8734 --75.875 --75.8672 --75.8812 --75.8688 --75.8688 --75.8766 --75.8688 --75.875 --75.8781 --75.8828 --75.8812 --75.8703 --75.875 --75.8719 --75.8625 --75.8812 --75.8656 --75.8547 --75.8672 --75.875 --75.8734 --75.8766 --75.8719 --75.8828 --75.8641 --75.8719 --75.8766 --75.8797 --75.8688 --75.8766 --75.8688 --75.8812 --75.8781 --75.875 --75.8844 --75.8734 --75.8844 --75.8766 --75.8703 --75.8797 --75.8734 --75.8781 --75.8797 --75.8734 --75.8828 --75.8812 --75.8656 --75.8828 --75.8781 --75.8766 --75.8734 --75.8844 --75.8703 --75.875 --75.8797 --75.8875 --75.8859 --75.8922 --75.8781 --75.8828 --75.8719 --75.8703 --75.8828 --75.8906 --75.8781 --75.8906 --75.8781 --75.8766 --75.8766 --75.8797 --75.8906 --75.8797 --75.8797 --75.8734 --75.8688 --75.8797 --75.8703 --75.8828 --75.8781 --75.8797 --75.8672 --75.8641 --75.8609 --75.8609 --75.8766 --75.8703 --75.8766 --75.8781 --75.8766 --75.8578 --75.85 --75.8641 --75.8562 --75.8594 --75.8719 --75.8562 --75.8703 --75.8719 --75.8703 --75.8578 --75.8656 --75.8703 --75.8688 --75.8688 --75.8891 --75.8688 --75.8766 --75.8578 --75.8875 --75.8891 --75.8781 --75.8688 --75.8781 --75.8812 --75.8812 --75.8766 --75.8828 --75.8797 --75.8672 --75.8719 --75.8891 --75.8797 --75.8672 --75.8781 --75.8828 --75.8859 --75.8859 --75.8875 --75.875 --75.8828 --75.8859 --75.8797 --75.8844 --75.8781 --75.8781 --75.8891 --75.8891 --75.8984 --75.8781 --75.8781 --75.8891 --75.8859 --75.8891 --75.8859 --75.8891 --75.8781 --75.875 --75.8672 --75.8797 --75.8875 --75.8766 --75.8766 --75.8719 --75.8797 --75.8719 --75.8766 --75.8688 --75.8797 --75.8547 --75.8891 --75.8906 --75.8828 --75.8812 --75.8891 --75.8859 --75.8812 --75.8781 --75.8766 --75.8688 --75.8797 --75.8844 --75.8828 --75.8828 --75.8859 --75.8781 --75.8969 --75.8875 --75.8797 --75.8859 --75.8734 --75.875 --75.875 --75.8812 --75.8812 --75.8891 --75.8719 --75.8828 --75.8812 --75.8844 --75.8922 --75.8875 --75.8906 --75.8844 --75.8781 --75.8859 --75.8891 --75.8719 --75.8875 --75.8859 --75.8859 --75.8875 --75.8922 --75.8844 --75.8797 --75.8828 --75.8781 --75.8766 --75.8828 --75.8703 --75.8797 --75.8625 --75.8781 --75.8703 --75.8656 --75.8703 --75.875 --75.8656 --75.8688 --75.8766 --75.8844 --75.8828 --75.8719 --75.8891 --75.8688 --75.8859 --75.8844 --75.8812 --75.8719 --75.8844 --75.8875 --75.8828 --75.8859 --75.8812 --75.8859 --75.8906 --75.8984 --75.8891 --75.8906 --75.8812 --75.8812 --75.8906 --75.9 --75.8891 --75.8734 --75.8812 --75.9109 --75.8984 --75.9016 --75.9016 --75.9172 --75.8875 --75.8828 --75.8969 --75.8891 --75.9016 --75.8969 --75.9 --75.8906 --75.8828 --75.8812 --75.8953 --75.8984 --75.8891 --75.8922 --75.8984 --75.8875 --75.8984 --75.8812 --75.9047 --75.8828 --75.8812 --75.9172 --75.8922 --75.8938 --75.8938 --75.8828 --75.8875 --75.8875 --75.8797 --75.8875 --75.8828 --75.8797 --75.8766 --75.8828 --75.8875 --75.8828 --75.8797 --75.8828 --75.8859 --75.8859 --75.8781 --75.8766 --75.8844 --75.8969 --75.8859 --75.8859 --75.9016 --75.8984 --75.875 --75.8797 --75.8781 --75.8703 --75.8875 --75.8734 --75.8844 --75.8844 --75.8688 --75.8875 --75.8703 --75.8812 --75.8828 --75.8859 --75.8875 --75.8859 --75.8797 --75.8766 --75.8797 --75.8875 --75.8781 --75.8844 --75.8875 --75.8766 --75.875 --75.8766 --75.8781 --75.8797 --75.8859 --75.8719 --75.8766 --75.8844 --75.8656 --75.8875 --75.8609 --75.8672 --75.8922 --75.875 --75.8781 --75.9 --75.8688 --75.8875 --75.8906 --75.8766 --75.8922 --75.8891 --75.9016 --75.875 --75.8844 --75.8844 --75.8906 --75.8875 --75.8844 --75.8859 --75.8828 --75.8797 --75.8719 --75.8703 --75.8906 --75.875 --75.8953 --75.8906 --75.8812 --75.8781 --75.8969 --75.8828 --75.8797 --75.8875 --75.8812 --75.8812 --75.8719 --75.8953 --75.8906 --75.8938 --75.8875 --75.8844 --75.8766 --75.8797 --75.8719 --75.8938 --75.8797 --75.8875 --75.8953 --75.8891 --75.8781 --75.8828 --75.8797 --75.9016 --75.8875 --75.9062 --75.8953 --75.9047 --75.8938 --75.9141 --75.8859 --75.8875 --75.8812 --75.8875 --75.8828 --75.8906 --75.8906 --75.8938 --75.8906 --75.9016 --75.875 --75.8797 --75.8906 --75.9047 --75.8844 --75.8875 --75.8984 --75.8828 --75.8938 --75.8953 --75.8859 --75.9016 --75.8859 --75.8984 --75.8891 --75.8875 --75.8922 --75.8922 --75.8844 --75.8875 --75.8844 --75.9016 --75.8875 --75.8859 --75.8891 --75.8969 --75.8844 --75.8844 --75.8938 --75.8859 --75.8859 --75.8922 --75.8812 --75.8938 --75.8938 --75.8812 --75.8828 --75.9031 --75.8875 --75.8922 --75.8984 --75.875 --75.8812 --75.8891 --75.8797 --75.8828 --75.8766 --75.8859 --75.8953 --75.8875 --75.8844 --75.8844 --75.8844 --75.8906 --75.8938 --75.8812 --75.9 --75.9047 --75.8906 --75.8922 --75.8969 --75.8875 --75.875 --75.8734 --75.9062 --75.8984 --75.8922 --75.8875 --75.8953 --75.8875 --75.8859 --75.8891 --75.8906 --75.8906 --75.8922 --75.8797 --75.8828 --75.8859 --75.8797 --75.8984 --75.8812 --75.8938 --75.8703 --75.8844 --75.9109 --75.8906 --75.8922 --75.8875 --75.8906 --75.8922 --75.8938 --75.8938 --75.8844 --75.8906 --75.8766 --75.8812 --75.8891 --75.8891 --75.8688 --75.8812 --75.8828 --75.8734 --75.8891 --75.8938 --75.8844 --75.9016 --75.8828 --75.8766 --75.875 --75.8719 --75.8766 --75.8953 --75.8875 --75.8844 --75.8859 --75.8953 --75.8922 --75.8781 --75.8922 --75.8969 --75.8828 --75.8844 --75.8844 --75.8828 --75.8797 --75.8984 --75.8828 --75.8844 --75.8766 --75.8844 --75.8891 --75.8812 --75.8812 --75.8875 --75.8984 --75.8734 --75.8859 --75.8766 --75.8844 --75.8781 --75.8859 --75.8891 --75.8922 --75.9 --75.8969 --75.8891 --75.9062 --75.8859 --75.8938 --75.8828 --75.8875 --75.8922 --75.8891 --75.8828 --75.9047 --75.8922 --75.8859 --75.8875 --75.9016 --75.9 --75.9016 --75.8906 --75.8938 --75.8922 --75.8906 --75.8938 --75.9016 --75.8875 --75.9016 --75.8953 --75.8938 --75.8922 --75.9062 --75.8906 --75.8984 --75.9031 --75.8844 --75.9031 --75.8891 --75.8906 --75.8828 --75.8891 --75.8906 --75.875 --75.8859 --75.8844 --75.8828 --75.8906 --75.8906 --75.8891 --75.8812 --75.8766 --75.8766 --75.8844 --75.8922 --75.8734 --75.8812 --75.8906 --75.8828 --75.8844 --75.8953 --75.8984 --75.8859 --75.9047 --75.8844 --75.8844 --75.8969 --75.8797 --75.8875 --75.8859 --75.8891 --75.8828 --75.8953 --75.8875 --75.8922 --75.8953 --75.9016 --75.9141 --75.8875 --75.8922 --75.8875 --75.8891 --75.9125 --75.8969 --75.8922 --75.8969 --75.8875 --75.8891 --75.8891 --75.8906 --75.8891 --75.8938 --75.8938 --75.8797 --75.8906 --75.8812 --75.8781 --75.8875 --75.8844 --75.8906 --75.8891 --75.875 --75.8938 --75.8922 --75.8969 --75.8875 --75.8922 --75.8859 --75.8938 --75.9062 --75.8953 --75.8891 --75.8797 --75.8844 --75.8906 --75.8922 --75.8781 --75.8812 --75.9016 --75.8844 --75.8719 --75.8984 --75.8953 --75.8688 --75.8828 --75.8938 --75.8797 --75.8844 --75.875 --75.8984 --75.8859 --75.8984 --75.9031 --75.9109 --75.8859 --75.8891 --75.8969 --75.8984 --75.8859 --75.8844 --75.8891 --75.8859 --75.8922 --75.8984 --75.8938 --75.8922 --75.9062 --75.9016 --75.8859 --75.9031 --75.9031 --75.9062 --75.8953 --75.8984 --75.9047 --75.9141 --75.9109 --75.9016 --75.8953 --75.8969 --75.9109 --75.9125 --75.8969 --75.8938 --75.9078 --75.8891 --75.9016 --75.8953 --75.8969 --75.9062 --75.8938 --75.9062 --75.9016 --75.9109 --75.9 --75.8922 --75.9078 --75.9062 --75.8891 --75.8969 --75.8953 --75.8906 --75.8938 --75.9047 --75.9219 --75.9031 --75.9062 --75.9062 --75.9031 --75.9062 --75.9062 --75.9141 --75.9156 --75.8984 --75.9031 --75.9109 --75.9078 --75.9 --75.9109 --75.9031 --75.9062 --75.9078 --75.8984 --75.8938 --75.9125 --75.8984 --75.9125 --75.8938 --75.9094 --75.8984 --75.8953 --75.9125 --75.8969 --75.8969 --75.9 --75.8953 --75.9016 --75.9141 --75.9031 --75.9062 --75.9047 --75.9016 --75.9109 --75.8922 --75.9062 --75.9 --75.9125 --75.9078 --75.9 --75.8922 --75.9078 --75.9031 --75.9016 --75.8922 --75.9047 --75.8875 --75.8953 --75.925 --75.9141 --75.9062 --75.8984 --75.8938 --75.9016 --75.9031 --75.9156 --75.9125 --75.925 --75.9094 --75.9234 --75.9156 --75.9219 --75.9 --75.9172 --75.9109 --75.9203 --75.9203 --75.8969 --75.9094 --75.9078 --75.9109 --75.9359 --75.9109 --75.9078 --75.9047 --75.8984 --75.9062 --75.9031 --75.9109 --75.8906 --75.9062 --75.9047 --75.9156 --75.9047 --75.9078 --75.8969 --75.9141 --75.9109 --75.9094 --75.9 --75.9203 --75.9172 --75.9031 --75.9094 --75.8969 --75.9141 --75.9078 --75.9109 --75.9109 --75.9125 --75.9109 --75.9078 --75.9062 --75.9078 --75.9109 --75.9125 --75.9125 --75.9094 --75.9078 --75.9078 --75.8953 --75.8938 --75.8953 --75.9016 --75.8922 --75.9047 --75.8984 --75.9062 --75.9016 --75.9047 --75.8891 --75.9094 --75.9 --75.9047 --75.8969 --75.8922 --75.8906 --75.9062 --75.9156 --75.8922 --75.8953 --75.8969 --75.8797 --75.8875 --75.9062 --75.8828 --75.9062 --75.8766 --75.9016 --75.8938 --75.8875 --75.8922 --75.8891 --75.8906 --75.9047 --75.8859 --75.8922 --75.8906 --75.8953 --75.8953 --75.8922 --75.8922 --75.8938 --75.8938 --75.8984 --75.9141 --75.8891 --75.9016 --75.8906 --75.9109 --75.8922 --75.9031 --75.8938 --75.8984 --75.8953 --75.8812 --75.8938 --75.8953 --75.9016 --75.8875 --75.8938 --75.8922 --75.8938 --75.9047 --75.9047 --75.8953 --75.8984 --75.9 --75.9016 --75.9078 --75.9141 --75.8969 --75.8984 --75.9 --75.8969 --75.9016 --75.9016 --75.9047 --75.9 --75.8969 --75.9094 --75.8969 --75.9109 --75.9047 --75.9047 --75.8984 --75.8938 --75.9 --75.9062 --75.9078 --75.9062 --75.9062 --75.9031 --75.8969 --75.8938 --75.9094 --75.9016 --75.9047 --75.8906 --75.9047 --75.9078 --75.8906 --75.9016 --75.9109 --75.8938 --75.9109 --75.9016 --75.9078 --75.9031 --75.9078 --75.9078 --75.9109 --75.9109 --75.9141 --75.9078 --75.9094 --75.9 --75.9047 --75.9109 --75.925 --75.9109 --75.9109 --75.8969 --75.9 --75.9016 --75.9156 --75.8859 --75.9141 --75.9109 --75.9094 --75.9109 --75.9187 --75.9078 --75.8984 --75.9203 --75.9234 --75.9031 --75.9125 --75.9172 --75.9172 --75.9016 --75.9125 --75.9172 --75.9141 --75.9062 --75.9109 --75.9156 --75.9156 --75.9094 --75.9109 --75.9078 --75.9125 --75.8953 --75.9109 --75.9062 --75.9109 --75.9266 --75.9156 --75.9094 --75.9156 --75.8953 --75.9172 --75.9203 --75.925 --75.9281 --75.9266 --75.9187 --75.9156 --75.9187 --75.9141 --75.9172 --75.9109 --75.9156 --75.9094 --75.9234 --75.9 --75.9078 --75.9141 --75.9031 --75.9203 --75.9234 --75.9187 --75.9078 --75.8953 --75.9125 --75.9031 --75.9062 --75.9016 --75.9062 --75.9094 --75.8891 --75.8938 --75.9125 --75.9078 --75.9031 --75.9125 --75.9062 --75.8953 --75.8984 --75.8938 --75.9062 --75.9047 --75.9016 --75.9031 --75.9125 --75.9031 --75.9062 --75.9016 --75.9 --75.9172 --75.9 --75.9094 --75.9125 --75.9094 --75.8922 --75.9141 --75.9297 --75.9313 --75.9078 --75.9031 --75.9078 --75.9187 --75.9125 --75.8984 --75.9172 --75.9031 --75.9 --75.8969 --75.9141 --75.9187 --75.9031 --75.8984 --75.9094 --75.9125 --75.9094 --75.9219 --75.9 --75.9234 --75.9078 --75.9062 --75.9016 --75.8938 --75.9031 --75.9187 --75.9047 --75.9094 --75.9109 --75.9062 --75.9047 --75.9109 --75.9109 --75.8969 --75.8953 --75.9125 --75.9141 --75.9047 --75.8984 --75.9094 --75.9109 --75.9062 --75.9062 --75.9031 --75.9094 --75.9109 --75.9078 --75.9094 --75.9094 --75.9094 --75.8953 --75.9062 --75.9109 --75.9016 --75.9156 --75.9078 --75.9109 --75.9172 --75.9141 --75.9187 --75.9141 --75.9266 --75.9047 --75.9125 --75.9281 --75.9156 --75.9062 --75.9281 --75.9094 --75.9141 --75.9109 --75.9313 --75.9109 --75.9094 --75.9141 --75.9187 --75.9109 --75.9094 --75.9219 --75.9187 --75.9187 --75.9281 --75.9141 --75.9156 --75.9156 --75.9 --75.9125 --75.9156 --75.9109 --75.9125 --75.9172 --75.9109 --75.9109 --75.9047 --75.9297 --75.9297 --75.9156 --75.9219 --75.9203 --75.9328 --75.9187 --75.9172 --75.9219 --75.9172 --75.9313 --75.9141 --75.9109 --75.9281 --75.9109 --75.9344 --75.9187 --75.9219 --75.9156 --75.9172 --75.9094 --75.9187 --75.9109 --75.9094 --75.9094 --75.9203 --75.9187 --75.9187 --75.925 --75.9281 --75.9203 --75.9109 --75.9203 --75.9109 --75.9156 --75.9156 --75.9062 --75.9219 --75.9297 --75.9203 --75.9203 --75.9125 --75.9094 --75.9266 --75.9187 --75.9203 --75.9203 --75.9156 --75.9281 --75.9109 --75.9219 --75.9234 --75.9125 --75.9156 --75.9203 --75.9078 --75.9125 --75.9187 --75.9125 --75.925 --75.9109 --75.9016 --75.9156 --75.9187 --75.9187 --75.9172 --75.9203 --75.9125 --75.9266 --75.9141 --75.9187 --75.9125 --75.9219 --75.925 --75.9219 --75.9062 --75.9047 --75.9156 --75.9219 --75.9219 --75.9203 --75.9094 --75.9125 --75.9078 --75.9187 --75.925 --75.9172 --75.9187 --75.9125 --75.9109 --75.9109 --75.9062 --75.9156 --75.9062 --75.9219 --75.9047 --75.9094 --75.9156 --75.9297 --75.9062 --75.9172 --75.925 --75.9078 --75.9234 --75.9187 --75.9109 --75.9187 --75.925 --75.9203 --75.9078 --75.9234 --75.9125 --75.9281 --75.9234 --75.9234 --75.9219 --75.9172 --75.9187 --75.9172 --75.9078 --75.9203 --75.9266 --75.9078 --75.9187 --75.9109 --75.9141 --75.9094 --75.9266 --75.9266 --75.9187 --75.9187 --75.9172 --75.9297 --75.9109 --75.9094 --75.9297 --75.9281 --75.9234 --75.9281 --75.9141 --75.9203 --75.9219 --75.925 --75.9187 --75.9094 --75.9141 --75.925 --75.9141 --75.9187 --75.9141 --75.9187 --75.9 --75.9156 --75.9156 --75.9062 --75.9219 --75.9297 --75.9187 --75.9266 --75.9187 --75.9219 --75.9203 --75.9234 --75.9187 --75.9078 --75.9156 --75.9078 --75.9328 --75.9172 --75.9078 --75.9125 --75.9141 --75.9219 --75.925 --75.9109 --75.9187 --75.9219 --75.9125 --75.9141 --75.9141 --75.9187 --75.9203 --75.9313 --75.9078 --75.9234 --75.9203 --75.9203 --75.9172 --75.9281 --75.9359 --75.9109 --75.9297 --75.9406 --75.9234 --75.9172 --75.925 --75.925 --75.9328 --75.9172 --75.9344 --75.9141 --75.9344 --75.9328 --75.925 --75.9156 --75.925 --75.9234 --75.9141 --75.9234 --75.9203 --75.9203 --75.9203 --75.9109 --75.9141 --75.9094 --75.9125 --75.9156 --75.9062 --75.8984 --75.9109 --75.9172 --75.9047 --75.925 --75.925 --75.9266 --75.925 --75.9266 --75.9266 --75.9313 --75.9297 --75.9172 --75.9219 --75.9172 --75.9219 --75.925 --75.9219 --75.9109 --75.925 --75.9234 --75.9234 --75.9281 --75.9141 --75.9266 --75.9203 --75.9187 --75.9281 --75.9109 --75.9234 --75.9172 --75.9172 --75.9172 --75.925 --75.9297 --75.9266 --75.9266 --75.9109 --75.9094 --75.9281 --75.9297 --75.9328 --75.9344 --75.9203 --75.9156 --75.9234 --75.9156 --75.925 --75.9375 --75.9187 --75.9187 --75.9266 --75.9313 --75.9234 --75.9109 --75.9313 --75.9266 --75.9313 --75.9219 --75.9156 --75.9219 --75.9109 --75.9328 --75.9313 --75.9187 --75.9078 --75.9297 --75.9219 --75.9203 --75.9187 --75.9422 --75.9281 --75.9297 --75.925 --75.9125 --75.9156 --75.9281 --75.9234 --75.9094 --75.925 --75.9266 --75.9266 --75.9297 --75.9156 --75.925 --75.9297 --75.9313 --75.9313 --75.9141 --75.9187 --75.9344 --75.9172 --75.925 --75.9219 --75.925 --75.9266 --75.9234 --75.9172 --75.9156 --75.9125 --75.9219 --75.9266 --75.9266 --75.9375 --75.925 --75.925 --75.9281 --75.9219 --75.9219 --75.9234 --75.925 --75.9234 --75.9234 --75.9281 --75.9297 --75.9328 --75.9141 --75.9187 --75.9172 --75.9156 --75.9109 --75.925 --75.9187 --75.9266 --75.9109 --75.9156 --75.9172 --75.9281 --75.9187 --75.9109 --75.9203 --75.9156 --75.9172 --75.9094 --75.9141 --75.9172 --75.9078 --75.9062 --75.9234 --75.9062 --75.9172 --75.9297 --75.9156 --75.9016 --75.9187 --75.9297 --75.9125 --75.9156 --75.925 --75.9266 --75.9234 --75.9313 --75.9187 --75.9328 --75.925 --75.9219 --75.9078 --75.9156 --75.9141 --75.9187 --75.9141 --75.9141 --75.9016 --75.9156 --75.9234 --75.9109 --75.9109 --75.9187 --75.9172 --75.9109 --75.9187 --75.9187 --75.9016 --75.9094 --75.9187 --75.9172 --75.9109 --75.9125 --75.9062 --75.9203 --75.9062 --75.8953 --75.9203 --75.9062 --75.9 --75.9125 --75.9156 --75.9 --75.8984 --75.9125 --75.9156 --75.9078 --75.9141 --75.9062 --75.9172 --75.9062 --75.9187 --75.9109 --75.925 --75.9109 --75.925 --75.9156 --75.9109 --75.9078 --75.9187 --75.9297 --75.9172 --75.9109 --75.9234 --75.9344 --75.9062 --75.9094 --75.9016 --75.9125 --75.8922 --75.9172 --75.9172 --75.9125 --75.9016 --75.9234 --75.9094 --75.9141 --75.9266 --75.9172 --75.9047 --75.9141 --75.9094 --75.9203 --75.9375 --75.9078 --75.9156 --75.9187 --75.9156 --75.9109 --75.9156 --75.9281 --75.9078 --75.925 --75.9094 --75.9016 --75.9172 --75.9156 --75.9016 --75.925 --75.9062 --75.9125 --75.9187 --75.9203 --75.9203 --75.9187 --75.9094 --75.8984 --75.9125 --75.9094 --75.9109 --75.9187 --75.9094 --75.9234 --75.9203 --75.925 --75.9187 --75.9266 --75.9203 --75.9219 --75.9187 --75.9156 --75.9047 --75.9125 --75.9031 --75.9125 --75.9313 --75.9031 --75.9203 --75.9078 --75.9313 --75.9078 --75.9094 --75.9062 --75.9297 --75.9016 --75.925 --75.9219 --75.9156 --75.9125 --75.9031 --75.9141 --75.9234 --75.9062 --75.9031 --75.9141 --75.8938 --75.9078 --75.8969 --75.9109 --75.9078 --75.9047 --75.9016 --75.9016 --75.9094 --75.9109 --75.8984 --75.9031 --75.9125 --75.9094 --75.9094 --75.9016 --75.9172 --75.9094 --75.9062 --75.9156 --75.9094 --75.9109 --75.9203 --75.9203 --75.9109 --75.9031 --75.9109 --75.9062 --75.9266 --75.9031 --75.9125 --75.9 --75.9156 --75.9 --75.9187 --75.9078 --75.9078 --75.9047 --75.9109 --75.8984 --75.9187 --75.9125 --75.8969 --75.9156 --75.9062 --75.9172 --75.9047 --75.9156 --75.9203 --75.9125 --75.9156 --75.9141 --75.9203 --75.9078 --75.9047 --75.9109 --75.9062 --75.9187 --75.9109 --75.9 --75.9109 --75.9109 --75.9078 --75.9172 --75.9203 --75.9109 --75.9219 --75.9047 --75.9187 --75.9125 --75.9031 --75.9125 --75.9281 --75.9219 --75.9062 --75.925 --75.9266 --75.9203 --75.9297 --75.9187 --75.9219 --75.9047 --75.9125 --75.9078 --75.9062 --75.8984 --75.9172 --75.9125 --75.9062 --75.9047 --75.9031 --75.9172 --75.9094 --75.9172 --75.9125 --75.9047 --75.9047 --75.9062 --75.9062 --75.9109 --75.9094 --75.8938 --75.9094 --75.9219 --75.9031 --75.9125 --75.9125 --75.9141 --75.9141 --75.9109 --75.8953 --75.9047 --75.9062 --75.9125 --75.9031 --75.9078 --75.9125 --75.8953 --75.9094 --75.9094 --75.9062 --75.9078 --75.9062 --75.9313 --75.9141 --75.9094 --75.9156 --75.9109 --75.9109 --75.9 --75.9156 --75.9094 --75.9047 --75.9187 --75.9234 --75.8984 --75.9047 --75.9219 --75.9062 --75.9109 --75.9234 --75.9125 --75.9203 --75.9187 --75.9234 --75.9172 --75.9219 --75.9094 --75.9125 --75.9062 --75.925 --75.9031 --75.9156 --75.9016 --75.9031 --75.8953 --75.9062 --75.9094 --75.9109 --75.9016 --75.9016 --75.9031 --75.9016 --75.9156 --75.9078 --75.9125 --75.9031 --75.8922 --75.9141 --75.9047 --75.9094 --75.8969 --75.9094 --75.9125 --75.9172 --75.9 --75.9125 --75.9 --75.9062 --75.9297 --75.8922 --75.9141 --75.9047 --75.9062 --75.9203 --75.9156 --75.9031 --75.9109 --75.9156 --75.9047 --75.9125 --75.9125 --75.9266 --75.9187 --75.9078 --75.9094 --75.9141 --75.9094 --75.9125 --75.9109 --75.9031 --75.9047 --75.9172 --75.9219 --75.9016 --75.9094 --75.9047 --75.9141 --75.9062 --75.9109 --75.9016 --75.9 --75.9047 --75.9047 --75.9297 --75.9125 --75.9203 --75.9078 --75.9187 --75.9141 --75.9 --75.9109 --75.9187 --75.9078 --75.9094 --75.925 --75.9172 --75.9203 --75.9234 --75.9031 --75.9219 --75.9125 --75.9125 --75.9156 --75.8891 --75.9047 --75.9094 --75.9031 --75.9062 --75.9203 --75.9031 --75.9219 --75.9141 --75.9125 --75.9156 --75.9078 --75.9297 --75.9078 --75.9078 --75.9156 --75.9219 --75.9203 --75.9203 --75.9203 --75.9156 --75.9062 --75.9109 --75.9203 --75.9078 --75.9109 --75.9031 --75.9094 --75.9078 --75.9187 --75.9078 --75.9078 --75.9047 --75.9031 --75.9047 --75.9219 --75.9078 --75.9156 --75.9141 --75.9187 --75.9047 --75.9141 --75.9094 --75.9219 --75.9281 --75.9203 --75.9313 --75.9297 --75.9187 --75.9297 --75.9266 --75.9109 --75.9234 --75.9281 --75.9156 --75.9141 --75.9156 --75.9094 --75.9234 --75.9219 --75.9313 --75.9422 --75.9109 --75.9109 --75.9172 --75.9062 --75.9297 --75.925 --75.9219 --75.9234 --75.925 --75.9203 --75.9203 --75.9203 --75.9187 --75.9203 --75.9203 --75.9297 --75.9156 --75.9187 --75.925 --75.925 --75.9187 --75.9266 --75.9359 --75.9203 --75.9141 --75.9047 --75.9219 --75.9078 --75.925 --75.9266 --75.9266 --75.9156 --75.9141 --75.9266 --75.9219 --75.9266 --75.9125 --75.9266 --75.9125 --75.9203 --75.9062 --75.9156 --75.9313 --75.9313 --75.9187 --75.9281 --75.9313 --75.9203 --75.9203 --75.9281 --75.9203 --75.9187 --75.9328 --75.9266 --75.925 --75.9187 --75.9156 --75.9234 --75.9172 --75.9172 --75.9187 --75.9281 --75.9203 --75.9156 --75.9219 --75.9172 --75.9156 --75.9172 --75.9234 --75.9062 --75.9141 --75.9187 --75.9094 --75.9125 --75.9141 --75.9156 --75.9156 --75.9125 --75.9203 --75.9094 --75.9156 --75.925 --75.9109 --75.9156 --75.9109 --75.9313 --75.9141 --75.9109 --75.9031 --75.9156 --75.9078 --75.9219 --75.9187 --75.9234 --75.9094 --75.9219 --75.9094 --75.9172 --75.8984 --75.9062 --75.9313 --75.9391 --75.9297 --75.9266 --75.9031 --75.9141 --75.9172 --75.9203 --75.9047 --75.9062 --75.8969 --75.9156 --75.9141 --75.9234 --75.9203 --75.9297 --75.925 --75.9313 --75.9375 --75.9219 --75.925 --75.9219 --75.9047 --75.9187 --75.9141 --75.9234 --75.9375 --75.9172 --75.9281 --75.9297 --75.9297 --75.9328 --75.9297 --75.925 --75.9141 --75.9172 --75.9031 --75.9031 --75.9203 --75.9031 --75.9156 --75.9156 --75.9141 --75.9219 --75.9297 --75.9219 --75.9281 --75.925 --75.9203 --75.9266 --75.9172 --75.9156 --75.9094 --75.9375 --75.9266 --75.9297 --75.925 --75.9094 --75.9203 --75.9094 --75.9156 --75.9141 --75.9047 --75.9234 --75.9109 --75.9187 --75.9156 --75.9281 --75.9125 --75.9109 --75.9281 --75.9266 --75.9172 --75.9141 --75.9109 --75.9203 --75.9125 --75.9187 --75.9156 --75.9266 --75.9187 --75.9125 --75.9187 --75.9297 --75.9219 --75.9187 --75.9047 --75.9344 --75.9234 --75.9344 --75.9187 --75.9297 --75.9141 --75.9141 --75.9203 --75.9313 --75.925 --75.9141 --75.9172 --75.9234 --75.9078 --75.9281 --75.9187 --75.9281 --75.9219 --75.9109 --75.9156 --75.9062 --75.9016 --75.9219 --75.9203 --75.925 --75.9156 --75.9156 --75.925 --75.925 --75.9141 --75.9125 --75.9125 --75.9156 --75.9094 --75.9047 --75.9078 --75.9234 --75.9031 --75.9266 --75.9141 --75.9094 --75.9219 --75.9297 --75.9297 --75.9203 --75.9187 --75.9219 --75.9172 --75.9078 --75.9125 --75.9234 --75.9141 --75.9141 --75.9203 --75.9234 --75.9141 --75.9156 --75.9156 --75.9281 --75.9141 --75.9203 --75.925 --75.9 --75.9219 --75.9281 --75.9172 --75.9109 --75.9125 --75.9219 --75.9031 --75.9141 --75.9391 --75.9031 --75.9172 --75.9078 --75.9109 --75.9187 --75.9 --75.9203 --75.9219 --75.9016 --75.9156 --75.9094 --75.9109 --75.9203 --75.9187 --75.9187 --75.9172 --75.9172 --75.9172 --75.9156 --75.9109 --75.9234 --75.9203 --75.9109 --75.9062 --75.9219 --75.9125 --75.9141 --75.9172 --75.8984 --75.9187 --75.9172 --75.9203 --75.9141 --75.9156 --75.9156 --75.9156 --75.9078 --75.9172 --75.9141 --75.8922 --75.9141 --75.9219 --75.9172 --75.9172 --75.9141 --75.9016 --75.9109 --75.9125 --75.9172 --75.9172 --75.9156 --75.9078 --75.9187 --75.9109 --75.9078 --75.9219 --75.9187 --75.9234 --75.9203 --75.9234 --75.9203 --75.9141 --75.9359 --75.9125 --75.9156 --75.9187 --75.9141 --75.9016 --75.9172 --75.9203 --75.925 --75.9313 --75.925 --75.9062 --75.9219 --75.9266 --75.9266 --75.9125 --75.9219 --75.925 --75.9156 --75.9125 --75.9234 --75.9125 --75.9219 --75.9266 --75.9203 --75.9234 --75.9125 --75.9187 --75.9266 --75.9156 --75.9281 --75.9125 --75.925 --75.9219 --75.9359 --75.9266 --75.9297 --75.9172 --75.9359 --75.9219 --75.9219 --75.9141 --75.9172 --75.9203 --75.9344 --75.925 --75.9141 --75.9109 --75.9078 --75.9203 --75.9172 --75.9266 --75.9219 --75.9328 --75.9156 --75.9187 --75.925 --75.925 --75.9141 --75.9297 --75.9156 --75.9203 --75.9234 --75.9313 --75.9344 --75.9187 --75.9172 --75.9219 --75.9078 --75.9187 --75.9172 --75.9281 --75.9297 --75.9203 --75.9281 --75.925 --75.9313 --75.9141 --75.9062 --75.9375 --75.9203 --75.9109 --75.9313 --75.9281 --75.9328 --75.925 --75.9156 --75.9297 --75.925 --75.9266 --75.9391 --75.9297 --75.9328 --75.9281 --75.9172 --75.9359 --75.9313 --75.9437 --75.9281 --75.9219 --75.9281 --75.9156 --75.925 --75.9281 --75.9313 --75.9078 --75.9016 --75.9219 --75.9266 --75.9297 --75.9187 --75.9234 --75.9078 --75.9172 --75.9219 --75.9156 --75.9156 --75.9172 --75.9203 --75.9172 --75.9109 --75.9125 --75.925 --75.9141 --75.9125 --75.9109 --75.9297 --75.9078 --75.9094 --75.9047 --75.9125 --75.9141 --75.9234 --75.9203 --75.9156 --75.9047 --75.9031 --75.9109 --75.9062 --75.9281 --75.9266 --75.9031 --75.9047 --75.9125 --75.9062 --75.9094 --75.9234 --75.9219 --75.9328 --75.9078 --75.9156 --75.9109 --75.9203 --75.9156 --75.9141 --75.9234 --75.9031 --75.9172 --75.9094 --75.9 --75.9125 --75.9234 --75.9125 --75.9156 --75.9172 --75.9156 --75.9234 --75.9031 --75.9078 --75.9172 --75.9156 --75.9219 --75.9156 --75.9141 --75.9062 --75.9078 --75.9141 --75.9 --75.9187 --75.9156 --75.9328 --75.9109 --75.9156 --75.9234 --75.9016 --75.9187 --75.9187 --75.9125 --75.9172 --75.9078 --75.9125 --75.9187 --75.9156 --75.9187 --75.925 --75.9313 --75.9187 --75.9109 --75.9141 --75.9313 --75.9187 --75.9219 --75.9234 --75.9203 --75.9297 --75.9313 --75.9187 --75.9219 --75.9187 --75.9172 --75.9094 --75.9187 --75.9234 --75.9172 --75.9109 --75.9172 --75.9078 --75.9219 --75.9203 --75.9187 --75.925 --75.9141 --75.9156 --75.9187 --75.9172 --75.9266 --75.9297 --75.9219 --75.9219 --75.9297 --75.9297 --75.9141 --75.9203 --75.9094 --75.925 --75.9047 --75.9156 --75.9219 --75.9281 --75.9219 --75.925 --75.9406 --75.9187 --75.9234 --75.9172 --75.9141 --75.9234 --75.9328 --75.9281 --75.9187 --75.9234 --75.9109 --75.9187 --75.9234 --75.9156 --75.9187 --75.9125 --75.9297 --75.9203 --75.9344 --75.9297 --75.9187 --75.925 --75.9328 --75.9313 --75.9359 --75.9297 --75.9187 --75.9219 --75.9359 --75.9359 --75.9281 --75.9344 --75.9266 --75.9344 --75.9359 --75.9344 --75.9266 --75.9234 --75.9297 --75.9328 --75.9313 --75.9266 --75.9469 --75.9422 --75.9313 --75.9375 --75.9313 --75.9437 --75.9406 --75.9375 --75.9297 --75.9422 --75.9359 --75.9484 --75.95 --75.9469 --75.9453 --75.9328 --75.9406 --75.9359 --75.9391 --75.9422 --75.9391 --75.9297 --75.9437 --75.9297 --75.9328 --75.9359 --75.95 --75.9281 --75.9422 --75.9359 --75.9281 --75.9313 --75.9406 --75.9531 --75.9313 --75.9313 --75.95 --75.9391 --75.9469 --75.9328 --75.9344 --75.9375 --75.9313 --75.9516 --75.9375 --75.9313 --75.9344 --75.9313 --75.9359 --75.9266 --75.9281 --75.925 --75.9172 --75.9313 --75.9344 --75.9344 --75.9219 --75.9313 --75.9297 --75.9266 --75.9313 --75.9281 --75.9297 --75.9359 --75.9219 --75.9375 --75.9375 --75.9422 --75.9375 --75.9359 --75.9375 --75.9297 --75.9297 --75.9266 --75.9313 --75.9313 --75.9219 --75.9344 --75.9281 --75.9375 --75.9375 --75.9203 --75.9297 --75.9391 --75.9281 --75.9453 --75.9344 --75.9297 --75.9219 --75.9172 --75.9422 --75.9125 --75.9281 --75.9281 --75.9266 --75.9359 --75.9219 --75.9187 --75.9328 --75.9266 --75.9297 --75.9313 --75.9531 --75.9344 --75.9281 --75.9328 --75.9313 --75.9328 --75.9453 --75.9234 --75.9406 --75.9266 --75.9297 --75.9344 --75.9141 --75.9281 --75.9219 --75.9187 --75.9234 --75.9172 --75.9219 --75.9203 --75.9375 --75.925 --75.925 --75.9313 --75.9219 --75.9141 --75.9219 --75.9313 --75.9328 --75.9375 --75.9234 --75.9281 --75.925 --75.925 --75.9297 --75.9219 --75.9313 --75.9313 --75.9328 --75.9297 --75.9391 --75.9219 --75.9187 --75.9375 --75.9391 --75.9406 --75.925 --75.9297 --75.9328 --75.925 --75.9375 --75.9313 --75.9422 --75.925 --75.9266 --75.9203 --75.9219 --75.9297 --75.9109 --75.9359 --75.9281 --75.9359 --75.9297 --75.9266 --75.9313 --75.925 --75.9266 --75.9297 --75.9203 --75.9266 --75.9313 --75.9344 --75.925 --75.925 --75.9156 --75.9219 --75.9313 --75.9297 --75.9156 --75.9219 --75.9359 --75.9359 --75.9234 --75.9328 --75.9172 --75.9297 --75.9359 --75.9234 --75.9172 --75.9109 --75.9109 --75.9297 --75.9313 --75.9297 --75.9359 --75.9234 --75.9328 --75.925 --75.9125 --75.9219 --75.9203 --75.9313 --75.925 --75.9187 --75.9281 --75.9281 --75.9266 --75.9172 --75.9141 --75.9328 --75.9344 --75.925 --75.9328 --75.925 --75.9313 --75.925 --75.9297 --75.925 --75.9203 --75.9203 --75.9219 --75.9313 --75.9172 --75.9266 --75.9234 --75.925 --75.9141 --75.9281 --75.9281 --75.9266 --75.9313 --75.9375 --75.9266 --75.9219 --75.9406 --75.9313 --75.9328 --75.95 --75.9437 --75.9344 --75.9391 --75.9344 --75.9437 --75.9437 --75.9375 --75.9437 --75.9281 --75.9516 --75.9469 --75.9266 --75.9391 --75.9281 --75.9359 --75.925 --75.9266 --75.9437 --75.9203 --75.9391 --75.9422 --75.925 --75.9313 --75.9406 --75.9391 --75.9266 --75.9281 --75.9266 --75.9219 --75.9203 --75.9281 --75.9172 --75.9219 --75.9375 --75.9344 --75.9109 --75.9172 --75.9281 --75.9203 --75.9141 --75.9344 --75.9266 --75.9219 --75.9141 --75.9313 --75.9219 --75.9156 --75.9234 --75.9313 --75.9172 --75.9406 --75.9375 --75.925 --75.9187 --75.9297 --75.9281 --75.9328 --75.9375 --75.9266 --75.9266 --75.9313 --75.9297 --75.9125 --75.9141 --75.9219 --75.9156 --75.9359 --75.9219 --75.9219 --75.9172 --75.925 --75.9469 --75.9375 --75.9313 --75.9375 --75.9406 --75.9266 --75.9234 --75.9281 --75.9219 --75.9375 --75.9094 --75.9141 --75.9281 --75.9328 --75.9359 --75.9234 --75.9281 --75.9453 --75.9219 --75.9313 --75.9344 --75.9234 --75.9187 --75.9187 --75.9375 --75.9297 --75.9375 --75.9344 --75.9234 --75.9281 --75.9344 --75.9266 --75.9234 --75.9281 --75.9359 --75.9281 --75.9187 --75.925 --75.9375 --75.9344 --75.9266 --75.9266 --75.9281 --75.9266 --75.9281 --75.9156 --75.9219 --75.9266 --75.9297 --75.9406 --75.9219 --75.9359 --75.9266 --75.9469 --75.9359 --75.9422 --75.9375 --75.9219 --75.9234 --75.9391 --75.9406 --75.9328 --75.9297 --75.9375 --75.9375 --75.9328 --75.925 --75.9375 --75.9281 --75.9266 --75.9422 --75.9234 --75.9234 --75.9266 --75.9453 --75.925 --75.9156 --75.9172 --75.9219 --75.9203 --75.9281 --75.9281 --75.9016 --75.9125 --75.9141 --75.9031 --75.9234 --75.9062 --75.9187 --75.9156 --75.9125 --75.925 --75.9109 --75.9219 --75.9234 --75.9187 --75.9047 --75.925 --75.9187 --75.925 --75.9344 --75.9094 --75.9125 --75.9219 --75.9266 --75.9172 --75.9125 --75.9234 --75.9406 --75.9219 --75.9359 --75.925 --75.9219 --75.9313 --75.9281 --75.9266 --75.9203 --75.9219 --75.9297 --75.9203 --75.9281 --75.925 --75.9266 --75.9313 --75.9437 --75.9266 --75.9359 --75.9328 --75.9375 --75.925 --75.9375 --75.9266 --75.9297 --75.9437 --75.9187 --75.9219 --75.9281 --75.9297 --75.9266 --75.9219 --75.9359 --75.9391 --75.9453 --75.9281 --75.9266 --75.9375 --75.9281 --75.9281 --75.9266 --75.9359 --75.9344 --75.9375 --75.9344 --75.9156 --75.9297 --75.9313 --75.9328 --75.9172 --75.9281 --75.9344 --75.925 --75.9203 --75.9266 --75.9313 --75.9297 --75.9313 --75.9203 --75.9266 --75.9281 --75.9234 --75.9297 --75.9172 --75.9391 --75.9313 --75.9281 --75.925 --75.9391 --75.9313 --75.9297 --75.9219 --75.9391 --75.9344 --75.9141 --75.9187 --75.9234 --75.9281 --75.9328 --75.9359 --75.9344 --75.9141 --75.925 --75.9219 --75.9297 --75.925 --75.9234 --75.9187 --75.9313 --75.9313 --75.9234 --75.9203 --75.9187 --75.9266 --75.9297 --75.9203 --75.9219 --75.9141 --75.9141 --75.9344 --75.9141 --75.9187 --75.9297 --75.9219 --75.9156 --75.9203 --75.9125 --75.9313 --75.9281 --75.9297 --75.9266 --75.9266 --75.9187 --75.9266 --75.925 --75.9391 --75.925 --75.9344 --75.9328 --75.9313 --75.9266 --75.9234 --75.9219 --75.9156 --75.9219 --75.9125 --75.9219 --75.9172 --75.9281 --75.9219 --75.9203 --75.9234 --75.9109 --75.9375 --75.9094 --75.9297 --75.9125 --75.925 --75.9187 --75.9234 --75.9109 --75.9109 --75.9281 --75.9172 --75.9391 --75.9156 --75.9281 --75.9172 --75.9187 --75.9219 --75.925 --75.9219 --75.9141 --75.9234 --75.9187 --75.9219 --75.9172 --75.9234 --75.9328 --75.925 --75.9219 --75.9219 --75.9297 --75.9156 --75.9031 --75.9203 --75.9141 --75.925 --75.9094 --75.9109 --75.9031 --75.9016 --75.9203 --75.9141 --75.9156 --75.925 --75.925 --75.9187 --75.9125 --75.9094 --75.925 --75.9156 --75.9219 --75.9219 --75.9219 --75.9297 --75.9234 --75.9125 --75.9266 --75.9156 --75.9109 --75.9125 --75.9156 --75.9203 --75.9203 --75.9094 --75.9203 --75.9078 --75.9281 --75.9219 --75.9203 --75.9203 --75.9203 --75.9234 --75.9172 --75.9172 --75.9156 --75.9234 --75.9109 --75.9234 --75.9172 --75.9031 --75.9062 --75.9062 --75.9156 --75.9187 --75.9031 --75.9078 --75.9156 --75.9141 --75.9219 --75.9234 --75.9281 --75.9297 --75.9094 --75.9219 --75.9062 --75.9156 --75.9313 --75.9078 --75.9203 --75.9094 --75.9187 --75.9281 --75.8984 --75.9141 --75.9109 --75.9094 --75.9187 --75.9141 --75.9219 --75.9156 --75.8984 --75.9078 --75.9141 --75.9047 --75.9094 --75.9094 --75.9203 --75.9016 --75.9047 --75.9187 --75.9016 --75.9062 --75.9141 --75.9172 --75.9078 --75.9094 --75.9062 --75.9234 --75.9172 --75.9031 --75.9187 --75.9344 --75.9187 --75.9281 --75.9156 --75.9187 --75.9203 --75.9203 --75.9172 --75.9109 --75.9187 --75.9172 --75.9203 --75.9156 --75.925 --75.9203 --75.9281 --75.9156 --75.9156 --75.9219 --75.9187 --75.9313 --75.9234 --75.9141 --75.9094 --75.925 --75.9203 --75.9156 --75.9203 --75.9172 --75.9031 --75.9187 --75.9203 --75.9203 --75.9219 --75.9187 --75.9281 --75.9172 --75.9141 --75.9187 --75.9187 --75.9297 --75.9281 --75.9391 --75.9328 --75.9156 --75.9172 --75.9125 --75.9219 --75.9281 --75.9203 --75.9156 --75.9172 --75.9281 --75.9219 --75.9156 --75.9266 --75.9016 --75.9219 --75.9281 --75.9172 --75.9203 --75.9266 --75.9234 --75.9359 --75.9297 --75.9297 --75.9313 --75.9313 --75.9359 --75.9328 --75.9234 --75.925 --75.9266 --75.9234 --75.9187 --75.9172 --75.9187 --75.9203 --75.9125 --75.9156 --75.9187 --75.9078 --75.9172 --75.9156 --75.925 --75.9219 --75.9094 --75.9203 --75.9187 --75.9172 --75.9187 --75.9187 --75.9234 --75.9219 --75.9203 --75.9109 --75.9141 --75.9094 --75.9078 --75.9234 --75.9187 --75.9062 --75.9266 --75.9172 --75.9266 --75.9156 --75.9281 --75.9109 --75.9062 --75.9062 --75.9219 --75.9172 --75.925 --75.9281 --75.9203 --75.9281 --75.9266 --75.9313 --75.9281 --75.9313 --75.9156 --75.9234 --75.9109 --75.9078 --75.9156 --75.9219 --75.9203 --75.9109 --75.9297 --75.9078 --75.9313 --75.9328 --75.9187 --75.9281 --75.925 --75.9266 --75.9281 --75.9156 --75.9187 --75.9219 --75.9266 --75.9203 --75.9234 --75.9281 --75.9203 --75.9313 --75.9234 --75.9172 --75.9359 --75.9266 --75.9203 --75.9219 --75.9141 --75.9219 --75.9203 --75.9203 --75.9281 --75.9156 --75.9156 --75.9281 --75.9141 --75.9094 --75.9391 --75.9141 --75.9281 --75.9281 --75.9125 --75.9266 --75.9203 --75.9156 --75.9313 --75.9094 --75.9062 --75.9187 --75.9203 --75.9078 --75.9234 --75.9031 --75.9375 --75.9219 --75.9219 --75.9156 --75.9344 --75.9187 --75.9172 --75.9141 --75.9359 --75.9047 --75.9187 --75.9187 --75.9203 --75.9344 --75.9281 --75.9219 --75.9203 --75.9187 --75.9219 --75.9344 --75.9219 --75.9266 --75.9281 --75.9172 --75.9047 --75.9141 --75.9109 --75.9062 --75.9187 --75.9219 --75.9172 --75.9016 --75.9016 --75.9187 --75.9156 --75.9141 --75.9156 --75.9172 --75.9187 --75.9172 --75.9125 --75.9141 --75.9187 --75.9062 --75.9141 --75.9203 --75.9141 --75.9109 --75.9219 --75.9187 --75.9172 --75.9156 --75.9125 --75.9219 --75.9234 --75.9297 --75.9031 --75.9203 --75.9234 --75.9234 --75.9016 --75.9078 --75.9172 --75.9203 --75.9234 --75.9047 --75.9203 --75.9062 --75.9109 --75.9172 --75.9109 --75.9156 --75.9172 --75.9 --75.9 --75.9109 --75.9125 --75.9187 --75.9297 --75.9109 --75.9203 --75.9141 --75.9141 --75.9328 --75.9203 --75.9156 --75.9219 --75.9125 --75.9156 --75.9187 --75.9156 --75.9125 --75.9141 --75.9219 --75.9156 --75.9359 --75.9078 --75.9313 --75.9109 --75.9078 --75.9203 --75.9313 --75.9266 --75.9313 --75.9062 --75.9109 --75.9266 --75.9125 --75.9234 --75.9187 --75.9156 --75.9281 --75.9266 --75.9109 --75.925 --75.9125 --75.9313 --75.9172 --75.9062 --75.9141 --75.925 --75.9219 --75.925 --75.9156 --75.9375 --75.9266 --75.9203 --75.9125 --75.9109 --75.9078 --75.9062 --75.9156 --75.9203 --75.9187 --75.9125 --75.9125 --75.9172 --75.9047 --75.9141 --75.9141 --75.9172 --75.9078 --75.9109 --75.9109 --75.9078 --75.9141 --75.9172 --75.9297 --75.9219 --75.9109 --75.9234 --75.9187 --75.9297 --75.9266 --75.9234 --75.9219 --75.9141 --75.9172 --75.9344 --75.9328 --75.9297 --75.9297 --75.9203 --75.9172 --75.9172 --75.9313 --75.9313 --75.9234 --75.925 --75.9141 --75.9141 --75.9187 --75.9297 --75.9156 --75.9313 --75.9344 --75.9219 --75.925 --75.9219 --75.9047 --75.9125 --75.9203 --75.9141 --75.925 --75.9406 --75.9297 --75.9313 --75.9219 --75.9172 --75.9375 --75.9187 --75.9187 --75.9031 --75.9172 --75.9391 --75.9297 --75.9297 --75.9078 --75.9187 --75.9203 --75.9344 --75.9203 --75.9281 --75.925 --75.9156 --75.9187 --75.9219 --75.9047 --75.9297 --75.9219 --75.9328 --75.9234 --75.9141 --75.9281 --75.9125 --75.9344 --75.925 --75.9266 --75.9187 --75.9172 --75.9328 --75.9094 --75.9156 --75.9281 --75.9219 --75.9297 --75.9203 --75.9234 --75.9203 --75.9359 --75.9125 --75.9172 --75.8938 --75.9203 --75.9109 --75.9281 --75.9078 --75.9062 --75.9172 --75.9203 --75.9187 --75.9281 --75.9172 --75.9234 --75.9234 --75.9187 --75.9187 --75.9266 --75.9422 --75.9125 --75.9297 --75.9172 --75.9203 --75.9344 --75.9187 --75.9203 --75.9125 --75.9203 --75.9172 --75.9172 --75.9109 --75.9187 --75.9125 --75.9156 --75.9328 --75.9109 --75.9109 --75.9 --75.9156 --75.9047 --75.9109 --75.9062 --75.9078 --75.9172 --75.9047 --75.9 --75.9125 --75.9016 --75.9172 --75.9062 --75.8984 --75.9094 --75.9047 --75.9 --75.9125 --75.9125 --75.8984 --75.9016 --75.9125 --75.9125 --75.9031 --75.9047 --75.9016 --75.9141 --75.9281 --75.9078 --75.9125 --75.9156 --75.9125 --75.9031 --75.9094 --75.925 --75.9172 --75.9078 --75.9062 --75.8984 --75.9219 --75.9109 --75.9125 --75.9125 --75.9031 --75.9187 --75.9141 --75.9141 --75.9203 --75.9156 --75.9187 --75.9219 --75.9109 --75.9016 --75.9078 --75.9156 --75.9281 --75.9125 --75.9219 --75.9219 --75.9234 --75.9187 --75.925 --75.9187 --75.9203 --75.9125 --75.9125 --75.9094 --75.9109 --75.9156 --75.925 --75.9219 --75.9187 --75.9203 --75.9141 --75.9156 --75.9125 --75.9203 --75.925 --75.9187 --75.9172 --75.9297 --75.9172 --75.9203 --75.9078 --75.9094 --75.9203 --75.9297 --75.9234 --75.9141 --75.9094 --75.9172 --75.9141 --75.9062 --75.9141 --75.9078 --75.9078 --75.9203 --75.9094 --75.9047 --75.9172 --75.9187 --75.9172 --75.9266 --75.9078 --75.9031 --75.9203 --75.9203 --75.9187 --75.9156 --75.9156 --75.9141 --75.9141 --75.925 --75.9422 --75.9219 --75.9172 --75.9313 --75.9234 --75.9187 --75.9109 --75.9234 --75.9281 --75.9141 --75.9266 --75.9234 --75.9125 --75.9172 --75.9109 --75.9219 --75.9047 --75.9062 --75.9219 --75.9078 --75.9156 --75.9125 --75.9156 --75.925 --75.9156 --75.9078 --75.9172 --75.8984 --75.9078 --75.9062 --75.8969 --75.9078 --75.8969 --75.9141 --75.9016 --75.9078 --75.9172 --75.9062 --75.9062 --75.9062 --75.9109 --75.9156 --75.9156 --75.9156 --75.8969 --75.9297 --75.9094 --75.9125 --75.9125 --75.9047 --75.9078 --75.9172 --75.9141 --75.9109 --75.9172 --75.9078 --75.9031 --75.9047 --75.9094 --75.9141 --75.9109 --75.8938 --75.9016 --75.9187 --75.9094 --75.925 --75.9156 --75.8922 --75.9141 --75.9156 --75.9156 --75.9078 --75.9109 --75.9141 --75.9094 --75.9141 --75.9047 --75.9016 --75.9109 --75.9094 --75.8922 --75.9 --75.9078 --75.8906 --75.9031 --75.9094 --75.9047 --75.9047 --75.9078 --75.8906 --75.9047 --75.9016 --75.9078 --75.8984 --75.8984 --75.9078 --75.9094 --75.9078 --75.9 --75.9094 --75.8844 --75.8938 --75.8922 --75.9031 --75.8984 --75.9094 --75.9078 --75.9172 --75.9266 --75.8891 --75.9062 --75.8969 --75.8969 --75.9016 --75.9016 --75.9 --75.8984 --75.8906 --75.8875 --75.8922 --75.8906 --75.9109 --75.8875 --75.8984 --75.8922 --75.8922 --75.8922 --75.8953 --75.9062 --75.8828 --75.9 --75.8906 --75.8984 --75.8938 --75.9031 --75.8938 --75.8953 --75.9047 --75.9062 --75.8891 --75.9062 --75.9016 --75.8906 --75.9047 --75.8969 --75.9 --75.9109 --75.9047 --75.9031 --75.9016 --75.9125 --75.9047 --75.9187 --75.9047 --75.9031 --75.8953 --75.8984 --75.9 --75.9062 --75.8953 --75.8906 --75.9 --75.8844 --75.8891 --75.8922 --75.8938 --75.8766 --75.8859 --75.9016 --75.8922 --75.8969 --75.8922 --75.9016 --75.8703 --75.8938 --75.9062 --75.8984 --75.8922 --75.8938 --75.9109 --75.8953 --75.8891 --75.9047 --75.8906 --75.9 --75.8812 --75.8953 --75.9078 --75.8828 --75.9 --75.9047 --75.9125 --75.8938 --75.9125 --75.9109 --75.8969 --75.8922 --75.9031 --75.9109 --75.8984 --75.9047 --75.9016 --75.9141 --75.8906 --75.9078 --75.9094 --75.8953 --75.8969 --75.9172 --75.9109 --75.9078 --75.9094 --75.9047 --75.9172 --75.9062 --75.9094 --75.9031 --75.8969 --75.9 --75.8984 --75.9078 --75.8969 --75.9109 --75.8969 --75.8922 --75.9016 --75.9047 --75.9078 --75.8969 --75.8984 --75.9 --75.9078 --75.9016 --75.9062 --75.9031 --75.9031 --75.9109 --75.9016 --75.9094 --75.8984 --75.9016 --75.8812 --75.8969 --75.9016 --75.9016 --75.8938 --75.8969 --75.8906 --75.8844 --75.8984 --75.9125 --75.9078 --75.8969 --75.8891 --75.9016 --75.8875 --75.8922 --75.9016 --75.9047 --75.9 --75.8938 --75.8922 --75.875 --75.8875 --75.8922 --75.8891 --75.8969 --75.8938 --75.8891 --75.8984 --75.9078 --75.9 --75.8922 --75.8922 --75.8891 --75.8953 --75.8922 --75.8969 --75.8922 --75.8766 --75.9047 --75.9047 --75.9078 --75.8984 --75.9016 --75.9094 --75.9094 --75.9062 --75.9094 --75.8797 --75.9078 --75.9141 --75.9 --75.8969 --75.9047 --75.8875 --75.8844 --75.9047 --75.8953 --75.8969 --75.8906 --75.8953 --75.9062 --75.9062 --75.8969 --75.9047 --75.9125 --75.9141 --75.9047 --75.9109 --75.9094 --75.9078 --75.9094 --75.9156 --75.9203 --75.9031 --75.9109 --75.9125 --75.9094 --75.9 --75.9125 --75.9156 --75.8969 --75.8984 --75.8938 --75.9 --75.9 --75.9078 --75.9156 --75.9016 --75.9141 --75.9203 --75.9062 --75.8969 --75.9047 --75.9094 --75.9156 --75.9156 --75.9094 --75.8922 --75.9016 --75.9 --75.9047 --75.8938 --75.9031 --75.8984 --75.9078 --75.9016 --75.8891 --75.9062 --75.9172 --75.8922 --75.8969 --75.8938 --75.8938 --75.8953 --75.9 --75.9094 --75.9094 --75.8969 --75.8984 --75.8953 --75.9 --75.9047 --75.9047 --75.8938 --75.8891 --75.9047 --75.8984 --75.9016 --75.8969 --75.9031 --75.9094 --75.9031 --75.9078 --75.8984 --75.8984 --75.9016 --75.9125 --75.9 --75.8875 --75.8891 --75.9109 --75.8844 --75.9094 --75.8953 --75.8953 --75.9062 --75.9 --75.9078 --75.9016 --75.9109 --75.9078 --75.9156 --75.9078 --75.9156 --75.9109 --75.9156 --75.9094 --75.9125 --75.9031 --75.9172 --75.9187 --75.9109 --75.9125 --75.9109 --75.9 --75.9047 --75.9078 --75.9094 --75.9047 --75.9078 --75.8953 --75.9187 --75.9016 --75.9062 --75.8938 --75.9047 --75.9219 --75.9016 --75.9203 --75.9141 --75.8953 --75.9062 --75.9172 --75.9141 --75.9109 --75.9234 --75.9047 --75.9141 --75.9156 --75.9016 --75.9203 --75.9125 --75.9109 --75.9219 --75.9219 --75.9187 --75.9047 --75.9078 --75.9078 --75.9031 --75.9094 --75.9078 --75.9109 --75.9156 --75.9125 --75.9109 --75.9109 --75.9094 --75.9109 --75.925 --75.9094 --75.9141 --75.9078 --75.9297 --75.9234 --75.9156 --75.9156 --75.9094 --75.9062 --75.9062 --75.9156 --75.9156 --75.9062 --75.9031 --75.9078 --75.9125 --75.9141 --75.9 --75.9094 --75.9187 --75.9187 --75.9094 --75.8984 --75.8984 --75.9078 --75.9031 --75.9047 --75.8953 --75.8891 --75.9016 --75.9047 --75.9 --75.8969 --75.8906 --75.9062 --75.9062 --75.8984 --75.9094 --75.9031 --75.9031 --75.9078 --75.9 --75.8953 --75.8984 --75.8969 --75.9062 --75.9 --75.8938 --75.8844 --75.8984 --75.8938 --75.8922 --75.8859 --75.8969 --75.9141 --75.8953 --75.9 --75.8953 --75.8938 --75.8953 --75.8938 --75.9078 --75.8953 --75.9094 --75.9047 --75.8953 --75.9094 --75.9031 --75.9031 --75.9078 --75.9156 --75.9094 --75.9 --75.9219 --75.9094 --75.9234 --75.9203 --75.9031 --75.8938 --75.9031 --75.8938 --75.8984 --75.9125 --75.9031 --75.9062 --75.9047 --75.8969 --75.8938 --75.9141 --75.9125 --75.9016 --75.9062 --75.8969 --75.9109 --75.8938 --75.9141 --75.9125 --75.9187 --75.9016 --75.9016 --75.9094 --75.9062 --75.8938 --75.9 --75.9031 --75.9156 --75.9125 --75.9094 --75.9047 --75.9047 --75.9156 --75.9031 --75.9172 --75.9094 --75.9094 --75.9062 --75.9203 --75.9109 --75.9094 --75.9 --75.9109 --75.9062 --75.9187 --75.8922 --75.9125 --75.9109 --75.9094 --75.9 --75.8938 --75.9016 --75.9062 --75.9172 --75.9016 --75.9203 --75.9109 --75.9062 --75.9047 --75.9109 --75.9094 --75.9016 --75.8844 --75.8906 --75.9078 --75.8906 --75.9062 --75.9031 --75.9109 --75.9 --75.9109 --75.9125 --75.9 --75.8922 --75.9016 --75.8984 --75.9016 --75.8969 --75.9078 --75.9031 --75.9281 --75.9078 --75.9172 --75.8922 --75.8984 --75.9062 --75.8953 --75.9062 --75.8984 --75.9094 --75.9062 --75.8922 --75.9047 --75.9031 --75.9078 --75.9031 --75.9062 --75.8906 --75.9016 --75.9031 --75.9016 --75.9016 --75.9031 --75.9 --75.8906 --75.9125 --75.9094 --75.9047 --75.9172 --75.9062 --75.8938 --75.9047 --75.9047 --75.8812 --75.8984 --75.9062 --75.9109 --75.9016 --75.8922 --75.9078 --75.8969 --75.9062 --75.9016 --75.8969 --75.8953 --75.9 --75.8984 --75.9016 --75.8984 --75.8891 --75.9047 --75.8969 --75.8922 --75.9047 --75.8953 --75.9094 --75.8969 --75.9219 --75.9125 --75.9016 --75.9109 --75.9172 --75.9078 --75.9141 --75.9094 --75.9094 --75.8969 --75.9047 --75.9094 --75.9109 --75.9031 --75.9 --75.9016 --75.9062 --75.8984 --75.8984 --75.8953 --75.8984 --75.8891 --75.9109 --75.9016 --75.9047 --75.9 --75.9062 --75.8938 --75.9062 --75.9016 --75.8906 --75.9062 --75.9 --75.8984 --75.9031 --75.8922 --75.8844 --75.9016 --75.9031 --75.8953 --75.9 --75.9141 --75.8984 --75.9078 --75.8953 --75.8969 --75.9047 --75.8953 --75.8953 --75.8953 --75.9125 --75.8891 --75.8969 --75.8922 --75.9 --75.8922 --75.8984 --75.8828 --75.8891 --75.8938 --75.8953 --75.9156 --75.8969 --75.8984 --75.9047 --75.8922 --75.8938 --75.9094 --75.9078 --75.8922 --75.8875 --75.9 --75.9016 --75.9016 --75.8969 --75.9094 --75.8969 --75.9078 --75.9078 --75.8953 --75.9 --75.9031 --75.9 --75.8969 --75.9047 --75.9141 --75.9031 --75.8906 --75.9141 --75.8938 --75.9016 --75.8938 --75.8969 --75.8953 --75.8953 --75.8922 --75.9062 --75.8938 --75.9094 --75.9047 --75.9047 --75.9047 --75.9 --75.9109 --75.9125 --75.9125 --75.9 --75.9047 --75.9031 --75.9109 --75.9031 --75.9109 --75.9062 --75.9156 --75.9156 --75.9281 --75.9062 --75.9 --75.9141 --75.9141 --75.9156 --75.9078 --75.9172 --75.925 --75.9281 --75.9141 --75.925 --75.9172 --75.9172 --75.9172 --75.9031 --75.9172 --75.9047 --75.9141 --75.9109 --75.9156 --75.9141 --75.9109 --75.9141 --75.9219 --75.9 --75.8969 --75.9156 --75.9047 --75.9094 --75.9141 --75.9062 --75.9047 --75.9016 --75.8984 --75.9141 --75.9016 --75.9203 --75.9156 --75.9109 --75.9094 --75.9094 --75.9109 --75.9031 --75.9031 --75.9078 --75.9016 --75.9125 --75.9141 --75.8984 --75.9031 --75.8984 --75.9016 --75.9156 --75.9031 --75.9062 --75.9203 --75.9 --75.9297 --75.9094 --75.9234 --75.9078 --75.9125 --75.9203 --75.9125 --75.9094 --75.9187 --75.9125 --75.9219 --75.9156 --75.9187 --75.9094 --75.9203 --75.9094 --75.9141 --75.9141 --75.9078 --75.9 --75.8953 --75.9062 --75.8969 --75.8906 --75.9016 --75.9094 --75.8953 --75.8875 --75.8984 --75.9141 --75.8953 --75.9031 --75.9125 --75.9047 --75.9016 --75.8953 --75.9047 --75.9094 --75.9141 --75.8984 --75.9141 --75.9 --75.9031 --75.9047 --75.9031 --75.9125 --75.9125 --75.8922 --75.9141 --75.9047 --75.9109 --75.9016 --75.9141 --75.9031 --75.9109 --75.8953 --75.9047 --75.9125 --75.9062 --75.8938 --75.9031 --75.9031 --75.9047 --75.8938 --75.9078 --75.9047 --75.9047 --75.9125 --75.9156 --75.9078 --75.9047 --75.8969 --75.9047 --75.9 --75.8984 --75.9125 --75.9109 --75.9125 --75.9094 --75.9125 --75.9156 --75.9125 --75.9219 --75.9156 --75.9125 --75.9203 --75.9062 --75.9016 --75.9031 --75.9016 --75.9062 --75.9047 --75.9016 --75.9047 --75.8938 --75.8953 --75.9062 --75.9125 --75.9109 --75.9125 --75.8984 --75.9 --75.9141 --75.9141 --75.9203 --75.9109 --75.9016 --75.9047 --75.9078 --75.9062 --75.8984 --75.9094 --75.8984 --75.9094 --75.9156 --75.8953 --75.8953 --75.9172 --75.9125 --75.9172 --75.9234 --75.9016 --75.9141 --75.9125 --75.9094 --75.9234 --75.9062 --75.9156 --75.9125 --75.8875 --75.8984 --75.8938 --75.9109 --75.8969 --75.9109 --75.9016 --75.8938 --75.8984 --75.8938 --75.9062 --75.8953 --75.8828 --75.9047 --75.8969 --75.9 --75.9141 --75.9078 --75.9047 --75.8891 --75.9109 --75.9047 --75.9016 --75.9 --75.8938 --75.9156 --75.9 --75.9094 --75.9031 --75.8875 --75.8922 --75.8984 --75.9031 --75.9047 --75.9125 --75.9031 --75.9016 --75.8906 --75.9109 --75.8812 --75.8953 --75.8922 --75.9047 --75.9031 --75.8812 --75.8984 --75.8969 --75.8844 --75.8969 --75.8938 --75.9047 --75.8969 --75.9 --75.9031 --75.9094 --75.9062 --75.9 --75.8953 --75.9047 --75.9 --75.8953 --75.8938 --75.9031 --75.9062 --75.9109 --75.8984 --75.8984 --75.9047 --75.9031 --75.8938 --75.9062 --75.8953 --75.9047 --75.9 --75.8938 --75.8906 --75.9109 --75.9047 --75.9016 --75.9125 --75.9 --75.9125 --75.9094 --75.8969 --75.9031 --75.9016 --75.9078 --75.9078 --75.8969 --75.8953 --75.8859 --75.8938 --75.9062 --75.9047 --75.9016 --75.8859 --75.9062 --75.8953 --75.9078 --75.9094 --75.8938 --75.9016 --75.9203 --75.8891 --75.8984 --75.8953 --75.8938 --75.9047 --75.9047 --75.9 --75.8922 --75.8969 --75.9047 --75.8938 --75.9094 --75.8938 --75.9031 --75.8844 --75.8984 --75.8844 --75.8922 --75.8969 --75.9016 --75.9031 --75.8953 --75.8922 --75.9109 --75.8938 --75.9 --75.8953 --75.9047 --75.8938 --75.8922 --75.8844 --75.9 --75.8891 --75.8953 --75.8891 --75.8922 --75.9047 --75.8953 --75.9 --75.9031 --75.9078 --75.9156 --75.8922 --75.8984 --75.9016 --75.8938 --75.9 --75.8938 --75.9062 --75.8906 --75.8969 --75.8984 --75.8922 --75.8969 --75.9016 --75.9078 --75.8938 --75.8938 --75.9094 --75.9 --75.8875 --75.9016 --75.8938 --75.9016 --75.8969 --75.9078 --75.9031 --75.8984 --75.9047 --75.9 --75.9078 --75.9 --75.8984 --75.9031 --75.9203 --75.9047 --75.9062 --75.8953 --75.9047 --75.9187 --75.9187 --75.9062 --75.9047 --75.9078 --75.9 --75.8922 --75.9016 --75.9016 --75.9016 --75.9 --75.9016 --75.8984 --75.9 --75.9125 --75.8906 --75.9 --75.8953 --75.8875 --75.9141 --75.8969 --75.9109 --75.8938 --75.9 --75.9016 --75.9016 --75.8875 --75.9016 --75.9 --75.9 --75.8984 --75.9 --75.8953 --75.9016 --75.9016 --75.9078 --75.9 --75.9094 --75.9094 --75.9062 --75.8953 --75.9062 --75.8969 --75.8859 --75.9109 --75.8984 --75.9031 --75.9031 --75.8938 --75.8781 --75.8938 --75.9078 --75.8906 --75.8969 --75.8938 --75.8875 --75.8984 --75.8969 --75.8891 --75.9016 --75.9047 --75.9094 --75.8891 --75.9125 --75.9062 --75.9094 --75.9125 --75.9031 --75.9141 --75.9016 --75.9094 --75.9094 --75.9094 --75.9 --75.8922 --75.9141 --75.9 --75.8906 --75.8984 --75.9062 --75.9062 --75.9125 --75.9 --75.9047 --75.9016 --75.9109 --75.8891 --75.8953 --75.8922 --75.9094 --75.8969 --75.9094 --75.9156 --75.9109 --75.9 --75.9031 --75.9078 --75.9125 --75.9094 --75.9125 --75.9078 --75.9125 --75.9078 --75.9062 --75.9125 --75.9016 --75.8938 --75.9016 --75.9219 --75.9062 --75.9094 --75.9187 --75.8953 --75.9 --75.9062 --75.9016 --75.9094 --75.8969 --75.9156 --75.9016 --75.9031 --75.9031 --75.9062 --75.9047 --75.9062 --75.9109 --75.8984 --75.9062 --75.9047 --75.8969 --75.8922 --75.9016 --75.9125 --75.8953 --75.8953 --75.8969 --75.9109 --75.8984 --75.9062 --75.9031 --75.9047 --75.9031 --75.8969 --75.9094 --75.9031 --75.9109 --75.8938 --75.8984 --75.9156 --75.9078 --75.9078 --75.8859 --75.8859 --75.8891 --75.9 --75.9016 --75.9 --75.8984 --75.8812 --75.8906 --75.9016 --75.9 --75.8922 --75.9031 --75.9078 --75.9 --75.9047 --75.9031 --75.9 --75.9062 --75.9125 --75.9 --75.8969 --75.8953 --75.8859 --75.9016 --75.8859 --75.8922 --75.8938 --75.8984 --75.8953 --75.8969 --75.8953 --75.8906 --75.8953 --75.8984 --75.9 --75.8938 --75.8969 --75.8859 --75.9078 --75.9187 --75.9062 --75.9156 --75.9016 --75.8984 --75.9047 --75.9062 --75.8953 --75.8969 --75.9031 --75.9047 --75.9078 --75.9031 --75.9047 --75.9109 --75.9047 --75.8969 --75.8984 --75.9031 --75.9031 --75.9016 --75.9016 --75.8922 --75.9016 --75.9047 --75.9047 --75.9109 --75.9047 --75.9078 --75.9 --75.9094 --75.9141 --75.9234 --75.9109 --75.9094 --75.9047 --75.9078 --75.9047 --75.9078 --75.9031 --75.9094 --75.8969 --75.9141 --75.9172 --75.9141 --75.9016 --75.8812 --75.8969 --75.9016 --75.8906 --75.9047 --75.8922 --75.9078 --75.8844 --75.9031 --75.9016 --75.9 --75.9016 --75.8953 --75.9078 --75.8984 --75.8891 --75.9109 --75.8984 --75.9078 --75.8859 --75.9031 --75.8875 --75.8875 --75.8844 --75.8906 --75.8906 --75.8906 --75.8906 --75.8891 --75.8938 --75.8953 --75.8859 --75.8953 --75.8859 --75.8969 --75.9 --75.8938 --75.8875 --75.9047 --75.8891 --75.8969 --75.9062 --75.9016 --75.9031 --75.9047 --75.9031 --75.9172 --75.8844 --75.9047 --75.8891 --75.8984 --75.8938 --75.8828 --75.8844 --75.8828 --75.8906 --75.8969 --75.8859 --75.8797 --75.8969 --75.8906 --75.8906 --75.9 --75.8969 --75.8844 --75.8812 --75.8891 --75.8891 --75.8875 --75.8969 --75.8891 --75.8969 --75.9062 --75.9016 --75.8953 --75.9 --75.8953 --75.9 --75.9094 --75.8953 --75.8938 --75.9016 --75.9 --75.9 --75.8938 --75.8875 --75.9047 --75.9031 --75.9062 --75.9078 --75.8969 --75.9109 --75.8984 --75.8953 --75.9 --75.9031 --75.9109 --75.8844 --75.8906 --75.8984 --75.8875 --75.8953 --75.8984 --75.9 --75.8953 --75.9094 --75.8938 --75.9031 --75.8938 --75.9047 --75.9 --75.8922 --75.9172 --75.9016 --75.9016 --75.9 --75.9094 --75.9109 --75.9062 --75.9016 --75.8953 --75.9062 --75.9094 --75.9266 --75.9109 --75.8953 --75.9047 --75.9062 --75.8875 --75.9 --75.9078 --75.9125 --75.8969 --75.8969 --75.9062 --75.9094 --75.8891 --75.8938 --75.8938 --75.9094 --75.8844 --75.8906 --75.8953 --75.9 --75.9078 --75.9016 --75.9016 --75.9109 --75.8922 --75.9109 --75.9031 --75.9078 --75.9016 --75.9078 --75.8984 --75.9078 --75.9016 --75.9078 --75.8938 --75.9078 --75.8984 --75.8938 --75.8938 --75.8922 --75.9 --75.8875 --75.9 --75.8922 --75.8859 --75.9109 --75.9047 --75.8984 --75.8953 --75.8984 --75.8844 --75.8938 --75.8953 --75.8938 --75.8844 --75.9094 --75.8859 --75.9125 --75.8906 --75.8906 --75.8969 --75.9016 --75.8953 --75.8906 --75.9047 --75.8938 --75.8953 --75.9125 --75.8938 --75.9031 --75.8938 --75.9016 --75.9094 --75.9031 --75.9031 --75.9031 --75.9062 --75.9156 --75.9125 --75.9 --75.9062 --75.8984 --75.9047 --75.9094 --75.9234 --75.9031 --75.9016 --75.9141 --75.9062 --75.8906 --75.8969 --75.8938 --75.9062 --75.8969 --75.9047 --75.8906 --75.9078 --75.9094 --75.8984 --75.9125 --75.9266 --75.9109 --75.8969 --75.8938 --75.9234 --75.9016 --75.9047 --75.8953 --75.9141 --75.9062 --75.9 --75.8969 --75.8984 --75.8875 --75.8906 --75.8891 --75.8906 --75.8906 --75.8891 --75.8906 --75.8844 --75.9 --75.9172 --75.8922 --75.8953 --75.9031 --75.9094 --75.9047 --75.9016 --75.8922 --75.9031 --75.8969 --75.9 --75.8969 --75.9062 --75.9016 --75.9031 --75.8844 --75.9031 --75.8953 --75.8906 --75.8906 --75.8922 --75.8906 --75.9 --75.8938 --75.8891 --75.8938 --75.9 --75.9031 --75.9047 --75.8984 --75.8969 --75.9031 --75.9031 --75.8938 --75.9016 --75.9031 --75.8984 --75.9125 --75.9109 --75.9031 --75.8984 --75.8984 --75.9016 --75.9047 --75.9 --75.9 --75.8938 --75.8984 --75.8953 --75.8953 --75.9203 --75.8969 --75.8953 --75.9016 --75.9078 --75.9109 --75.8984 --75.8875 --75.9109 --75.9047 --75.8891 --75.9094 --75.9031 --75.8922 --75.8953 --75.8984 --75.9156 --75.8953 --75.8953 --75.8922 --75.8984 --75.8969 --75.8891 --75.8922 --75.8922 --75.8922 --75.8781 --75.8969 --75.8891 --75.9078 --75.8938 --75.9031 --75.9078 --75.8984 --75.9016 --75.9016 --75.9047 --75.9 --75.9187 --75.8984 --75.8969 --75.8969 --75.9 --75.9031 --75.8891 --75.8906 --75.8984 --75.8984 --75.8922 --75.8969 --75.8953 --75.9078 --75.9016 --75.8875 --75.8828 --75.8984 --75.8906 --75.8906 --75.8906 --75.8875 --75.8938 --75.8906 --75.8781 --75.8922 --75.8891 --75.9031 --75.8828 --75.8844 --75.8969 --75.9078 --75.8984 --75.9 --75.8922 --75.9031 --75.9 --75.9 --75.9109 --75.8922 --75.8969 --75.9109 --75.9 --75.9141 --75.9016 --75.9094 --75.9094 --75.9094 --75.9141 --75.9047 --75.9109 --75.9 --75.9141 --75.8891 --75.9062 --75.9078 --75.9016 --75.9047 --75.9062 --75.9187 --75.9141 --75.9094 --75.9156 --75.9 --75.9078 --75.9125 --75.9031 --75.9203 --75.9187 --75.9141 --75.9125 --75.9047 --75.9031 --75.8969 --75.9062 --75.9094 --75.9094 --75.9062 --75.9031 --75.9047 --75.9 --75.9078 --75.9062 --75.9062 --75.9 --75.9047 --75.9047 --75.9078 --75.9047 --75.9094 --75.9062 --75.8906 --75.8953 --75.9094 --75.8938 --75.8938 --75.8922 --75.8906 --75.9 --75.8859 --75.8875 --75.8797 --75.8922 --75.8906 --75.8875 --75.8859 --75.9016 --75.9047 --75.8891 --75.8969 --75.8938 --75.8906 --75.8938 --75.875 --75.9 --75.8766 --75.8828 --75.8875 --75.9 --75.8938 --75.8844 --75.8922 --75.8969 --75.8938 --75.8891 --75.8969 --75.8922 --75.8969 --75.8891 --75.8859 --75.9016 --75.9 --75.8969 --75.9078 --75.9 --75.9031 --75.9062 --75.9047 --75.8938 --75.8875 --75.8891 --75.9094 --75.9031 --75.9031 --75.8938 --75.8938 --75.9 --75.8922 --75.8984 --75.8969 --75.9031 --75.9156 --75.9016 --75.8906 --75.9016 --75.9078 --75.8938 --75.8969 --75.9141 --75.9031 --75.8922 --75.8922 --75.9094 --75.9016 --75.9062 --75.9016 --75.9078 --75.8984 --75.9062 --75.9094 --75.9078 --75.9 --75.9156 --75.9016 --75.8984 --75.9156 --75.9047 --75.9062 --75.9094 --75.9062 --75.9016 --75.9078 --75.8969 --75.9156 --75.9 --75.9062 --75.9047 --75.9203 --75.9047 --75.9156 --75.9109 --75.9141 --75.9141 --75.9156 --75.9187 --75.9234 --75.9203 --75.9203 --75.9297 --75.9109 --75.9375 --75.9031 --75.9031 --75.9187 --75.9219 --75.9078 --75.9125 --75.9125 --75.9187 --75.9219 --75.9094 --75.9203 --75.9016 --75.9094 --75.9047 --75.9047 --75.9 --75.9172 --75.9016 --75.8953 --75.9062 --75.8984 --75.8938 --75.8969 --75.9031 --75.9016 --75.8984 --75.8922 --75.9 --75.8984 --75.8953 --75.9047 --75.8984 --75.8969 --75.9016 --75.9094 --75.9031 --75.9062 --75.9047 --75.9031 --75.9016 --75.9062 --75.9016 --75.9 --75.9094 --75.9031 --75.8984 --75.9016 --75.9047 --75.8953 --75.8969 --75.9047 --75.8984 --75.8906 --75.8984 --75.8859 --75.8859 --75.8969 --75.8891 --75.8766 --75.8797 --75.8828 --75.8969 --75.8984 --75.8766 --75.8906 --75.8875 --75.9016 --75.8922 --75.8938 --75.8969 --75.8844 --75.9016 --75.9016 --75.8953 --75.8875 --75.9109 --75.9016 --75.8953 --75.8906 --75.9078 --75.9031 --75.8953 --75.9062 --75.8859 --75.9078 --75.8938 --75.9078 --75.9 --75.8953 --75.9062 --75.8953 --75.8984 --75.9047 --75.9016 --75.8891 --75.9 --75.8906 --75.8906 --75.8922 --75.8938 --75.8922 --75.8891 --75.8766 --75.8906 --75.8922 --75.9016 --75.8922 --75.8922 --75.8969 --75.8906 --75.8859 --75.8938 --75.8828 --75.8891 --75.8875 --75.8906 --75.8812 --75.9031 --75.8953 --75.8812 --75.9016 --75.8812 --75.8812 --75.8844 --75.8953 --75.9016 --75.8906 --75.9062 --75.9 --75.8953 --75.9062 --75.8984 --75.8922 --75.9031 --75.8922 --75.8766 --75.8906 --75.8875 --75.8922 --75.9047 --75.8844 --75.8938 --75.9 --75.8891 --75.9 --75.8781 --75.9016 --75.8906 --75.8969 --75.8938 --75.8906 --75.8922 --75.9 --75.8953 --75.8922 --75.8938 --75.9078 --75.8938 --75.9031 --75.8984 --75.9078 --75.8969 --75.8859 --75.8781 --75.8922 --75.8859 --75.8797 --75.8812 --75.8938 --75.8953 --75.9031 --75.8781 --75.8969 --75.8844 --75.9031 --75.8812 --75.8891 --75.8984 --75.8891 --75.8844 --75.8891 --75.8766 --75.8891 --75.8844 --75.8781 --75.8859 --75.8734 --75.8844 --75.8859 --75.8812 --75.8812 --75.8781 --75.8766 --75.8766 --75.8797 --75.8781 --75.8766 --75.8797 --75.8844 --75.8781 --75.8828 --75.8875 --75.8766 --75.8859 --75.8859 --75.875 --75.8781 --75.8812 --75.8734 --75.8703 --75.8828 --75.8734 --75.8828 --75.8906 --75.8844 --75.8609 --75.875 --75.8734 --75.8734 --75.8688 --75.8781 --75.8781 --75.8703 --75.8719 --75.8844 --75.8766 --75.8828 --75.8812 --75.8656 --75.8766 --75.8766 --75.8922 --75.875 --75.8953 --75.8766 --75.8906 --75.8812 --75.8891 --75.8766 --75.8703 --75.875 --75.8828 --75.8891 --75.8734 --75.8766 --75.8891 --75.8797 --75.8797 --75.8828 --75.8969 --75.8828 --75.8672 --75.8906 --75.8984 --75.8703 --75.8812 --75.8922 --75.875 --75.8766 --75.8703 --75.8844 --75.8984 --75.8797 --75.8797 --75.8797 --75.8812 --75.8906 --75.8875 --75.8828 --75.8906 --75.8906 --75.8906 --75.8906 --75.8859 --75.8844 --75.9016 --75.8844 --75.8922 --75.8953 --75.8844 --75.875 --75.8734 --75.9016 --75.8938 --75.8922 --75.8891 --75.8891 --75.9016 --75.8953 --75.9 --75.9 --75.8938 --75.8734 --75.9031 --75.9047 --75.8953 --75.8844 --75.8984 --75.9031 --75.9016 --75.9016 --75.9047 --75.8922 --75.9031 --75.9016 --75.8984 --75.9109 --75.8906 --75.8859 --75.8984 --75.8766 --75.8891 --75.8922 --75.8891 --75.8844 --75.8906 --75.8938 --75.9 --75.8953 --75.8859 --75.8969 --75.8891 --75.8984 --75.8953 --75.9078 --75.8906 --75.9047 --75.8797 --75.8844 --75.9016 --75.9047 --75.8984 --75.8938 --75.8922 --75.8828 --75.8984 --75.8984 --75.8938 --75.8906 --75.8984 --75.8938 --75.8891 --75.8922 --75.8797 --75.8828 --75.8969 --75.8969 --75.8953 --75.8891 --75.9 --75.8891 --75.8953 --75.8844 --75.8906 --75.8906 --75.8922 --75.8906 --75.8938 --75.9062 --75.8969 --75.9016 --75.9016 --75.9031 --75.9062 --75.9 --75.8922 --75.8984 --75.8969 --75.8984 --75.9109 --75.9062 --75.9 --75.9141 --75.8984 --75.9062 --75.9031 --75.8891 --75.9125 --75.8891 --75.9031 --75.9016 --75.9047 --75.9 --75.8969 --75.8969 --75.8922 --75.8844 --75.8906 --75.9047 --75.8875 --75.8953 --75.8859 --75.8984 --75.8859 --75.8828 --75.8922 --75.8969 --75.9031 --75.8984 --75.8812 --75.8781 --75.8906 --75.8906 --75.8953 --75.8859 --75.8969 --75.8922 --75.8891 --75.8875 --75.9047 --75.8906 --75.8953 --75.8906 --75.8953 --75.8922 --75.8953 --75.8859 --75.8859 --75.9016 --75.8953 --75.8953 --75.8906 --75.9016 --75.8828 --75.8922 --75.8812 --75.8953 --75.8984 --75.8969 --75.8922 --75.8953 --75.8891 --75.8891 --75.8922 --75.8797 --75.8906 --75.8891 --75.8828 --75.8844 --75.8922 --75.8891 --75.8875 --75.8906 --75.9016 --75.8812 --75.8891 --75.8797 --75.9016 --75.8875 --75.8859 --75.8875 --75.8906 --75.8906 --75.8734 --75.8953 --75.8859 --75.8906 --75.8844 --75.9 --75.8828 --75.8859 --75.8891 --75.8844 --75.8875 --75.8922 --75.875 --75.9016 --75.8859 --75.8859 --75.8922 --75.8828 --75.8844 --75.8859 --75.8797 --75.8859 --75.8781 --75.8953 --75.8906 --75.875 --75.8891 --75.8875 --75.8906 --75.8844 --75.8859 --75.8859 --75.8781 --75.8812 --75.8734 --75.8812 --75.8828 --75.9031 --75.9047 --75.8922 --75.8922 --75.8891 --75.8953 --75.9047 --75.8953 --75.8906 --75.8953 --75.8844 --75.8969 --75.9 --75.8906 --75.8844 --75.8969 --75.8969 --75.8953 --75.9031 --75.9 --75.8969 --75.8969 --75.8875 --75.9047 --75.8891 --75.9047 --75.9031 --75.8938 --75.8969 --75.9016 --75.8984 --75.8953 --75.8875 --75.8812 --75.9062 --75.8859 --75.8844 --75.8875 --75.9 --75.8875 --75.8781 --75.8781 --75.8891 --75.8891 --75.8797 --75.8688 --75.8797 --75.8875 --75.8734 --75.8859 --75.8844 --75.8766 --75.8812 --75.8781 --75.8812 --75.8812 --75.8672 --75.8891 --75.875 --75.8812 --75.8766 --75.8734 --75.8844 --75.8828 --75.8781 --75.8844 --75.8938 --75.8797 --75.8781 --75.8891 --75.8906 --75.8891 --75.8844 --75.8781 --75.8812 --75.8891 --75.9047 --75.8844 --75.9078 --75.8734 --75.8906 --75.8906 --75.8859 --75.8906 --75.8656 --75.8812 --75.9031 --75.8922 --75.8859 --75.8922 --75.8875 --75.8828 --75.9 --75.8922 --75.9 --75.8859 --75.8969 --75.8828 --75.8953 --75.8844 --75.9062 --75.8922 --75.8953 --75.8984 --75.8969 --75.8984 --75.8922 --75.8984 --75.8844 --75.8875 --75.9 --75.8781 --75.8953 --75.9 --75.8922 --75.8844 --75.8891 --75.8844 --75.9062 --75.9109 --75.8891 --75.9031 --75.9016 --75.9047 --75.8969 --75.9 --75.8938 --75.8969 --75.9062 --75.8812 --75.9016 --75.8969 --75.8891 --75.9016 --75.9016 --75.8938 --75.9062 --75.8953 --75.8984 --75.8828 --75.9047 --75.8953 --75.9031 --75.8906 --75.9 --75.9031 --75.8922 --75.8906 --75.9047 --75.8969 --75.9 --75.8922 --75.8828 --75.8984 --75.8922 --75.8875 --75.9016 --75.9 --75.9031 --75.8891 --75.8891 --75.8984 --75.8859 --75.8891 --75.8812 --75.8781 --75.8953 --75.8781 --75.8875 --75.8828 --75.8938 --75.8844 --75.9094 --75.8844 --75.8875 --75.9 --75.8953 --75.8906 --75.8969 --75.8906 --75.8891 --75.9047 --75.9031 --75.8922 --75.8859 --75.9047 --75.8953 --75.8859 --75.8875 --75.8844 --75.8891 --75.8781 --75.8984 --75.8938 --75.8938 --75.8844 --75.8922 --75.8844 --75.8859 --75.9078 --75.9031 --75.8812 --75.8953 --75.8984 --75.8891 --75.875 --75.9062 --75.9062 --75.8953 --75.8953 --75.9047 --75.8969 --75.9 --75.8984 --75.9062 --75.9 --75.8953 --75.8938 --75.8969 --75.8938 --75.9016 --75.8984 --75.8969 --75.8969 --75.8953 --75.8906 --75.9031 --75.8984 --75.9016 --75.8969 --75.8859 --75.8922 --75.8938 --75.8875 --75.8828 --75.9047 --75.8859 --75.8984 --75.9078 --75.8969 --75.9109 --75.9 --75.8938 --75.8906 --75.8969 --75.8938 --75.9078 --75.8922 --75.8938 --75.9 --75.9078 --75.9109 --75.8891 --75.9094 --75.8922 --75.9156 --75.8828 --75.9062 --75.8906 --75.8984 --75.9031 --75.8891 --75.8969 --75.8953 --75.9062 --75.9047 --75.8938 --75.8875 --75.9078 --75.8953 --75.8922 --75.9031 --75.8984 --75.9031 --75.9047 --75.9125 --75.9031 --75.8906 --75.8938 --75.8953 --75.8953 --75.9047 --75.9016 --75.9016 --75.9125 --75.8938 --75.9125 --75.8984 --75.9125 --75.9156 --75.8938 --75.9031 --75.8984 --75.8844 --75.9 --75.9047 --75.8859 --75.8953 --75.8891 --75.8984 --75.9125 --75.8844 --75.9047 --75.8984 --75.9031 --75.9 --75.8844 --75.8984 --75.8875 --75.9 --75.8953 --75.9062 --75.8938 --75.9 --75.8953 --75.9 --75.8938 --75.8969 --75.8875 --75.8922 --75.8828 --75.8953 --75.9094 --75.9031 --75.9016 --75.8797 --75.8953 --75.8969 --75.9047 --75.8938 --75.8922 --75.9078 --75.8984 --75.9109 --75.8938 --75.8984 --75.9047 --75.8844 --75.9016 --75.8922 --75.9094 --75.8797 --75.8984 --75.9062 --75.9031 --75.8922 --75.8969 --75.8984 --75.8984 --75.8969 --75.8938 --75.9016 --75.9031 --75.8859 --75.8906 --75.8938 --75.8906 --75.8969 --75.8906 --75.9 --75.8875 --75.8891 --75.8859 --75.8969 --75.8891 --75.8938 --75.8875 --75.9047 --75.9016 --75.8969 --75.8953 --75.8969 --75.9062 --75.8891 --75.8938 --75.8922 --75.8984 --75.9031 --75.9031 --75.8797 --75.8938 --75.8891 --75.9 --75.9 --75.8953 --75.8938 --75.8891 --75.8906 --75.8859 --75.8828 --75.8891 --75.8875 --75.8953 --75.8969 --75.8766 --75.8828 --75.8984 --75.9094 --75.8734 --75.8875 --75.8875 --75.8844 --75.8797 --75.8719 --75.8812 --75.8812 --75.8891 --75.8953 --75.8953 --75.8844 --75.8922 --75.8844 --75.8891 --75.8922 --75.8953 --75.8906 --75.8781 --75.8875 --75.8844 --75.8766 --75.8828 --75.8953 --75.8797 --75.8859 --75.8906 --75.8859 --75.8984 --75.8938 --75.8875 --75.8875 --75.8906 --75.9094 --75.8844 --75.9 --75.8828 --75.8984 --75.8891 --75.8844 --75.8812 --75.8922 --75.9031 --75.8797 --75.8844 --75.8844 --75.8969 --75.8734 --75.8844 --75.8938 --75.8844 --75.9 --75.8891 --75.8953 --75.8828 --75.8938 --75.8781 --75.8797 --75.9016 --75.8781 --75.8828 --75.8828 --75.9031 --75.8984 --75.9062 --75.8875 --75.8875 --75.8875 --75.8953 --75.8906 --75.8812 --75.8672 --75.8891 --75.8875 --75.8859 --75.875 --75.8828 --75.8844 --75.8891 --75.8844 --75.8844 --75.8891 --75.8828 --75.875 --75.8672 --75.8797 --75.8875 --75.8875 --75.8922 --75.8656 --75.8844 --75.8906 --75.875 --75.8859 --75.8797 --75.8828 --75.8656 --75.8875 --75.8781 --75.875 --75.8734 --75.8844 --75.8734 --75.8828 --75.8719 --75.8766 --75.8703 --75.8703 --75.8703 --75.8719 --75.875 --75.875 --75.8875 --75.8766 --75.8844 --75.8828 --75.8812 --75.8703 --75.8844 --75.8625 --75.8922 --75.8844 --75.8719 --75.8766 --75.8891 --75.8922 --75.8766 --75.8922 --75.8828 --75.8812 --75.8781 --75.8938 --75.8828 --75.8844 --75.8844 --75.8953 --75.8844 --75.8859 --75.8875 --75.8875 --75.8906 --75.8781 --75.8766 --75.8719 --75.8875 --75.8797 --75.8812 --75.8844 --75.8781 --75.8938 --75.8859 --75.8812 --75.8688 --75.8844 --75.8734 --75.8844 --75.8781 --75.875 --75.8812 --75.8766 --75.8797 --75.8859 --75.8844 --75.875 --75.8781 --75.8797 --75.8625 --75.8797 --75.8797 --75.8812 --75.8828 --75.8828 --75.8812 --75.8859 --75.8844 --75.8891 --75.8844 --75.8797 --75.8703 --75.8797 --75.8859 --75.8953 --75.8859 --75.8656 --75.8844 --75.8906 --75.8797 --75.8719 --75.8781 --75.8781 --75.8844 --75.8859 --75.8906 --75.8766 --75.8859 --75.8719 --75.8797 --75.8688 --75.8734 --75.8797 --75.8781 --75.8906 --75.8938 --75.8844 --75.8828 --75.8734 --75.8812 --75.8578 --75.8828 --75.8703 --75.8797 --75.8797 --75.8797 --75.8906 --75.8891 --75.8797 --75.8797 --75.8641 --75.8781 --75.8781 --75.8719 --75.8766 --75.8766 --75.8812 --75.8875 --75.8797 --75.8859 --75.8875 --75.8875 --75.8812 --75.8766 --75.8938 --75.9016 --75.8906 --75.8859 --75.8875 --75.8812 --75.8906 --75.8859 --75.8844 --75.8781 --75.8875 --75.8906 --75.8812 --75.8969 --75.8719 --75.8875 --75.8828 --75.8906 --75.8828 --75.8875 --75.8984 --75.8719 --75.8797 --75.8766 --75.8797 --75.8859 --75.8859 --75.8859 --75.8688 --75.8953 --75.8969 --75.8828 --75.8828 --75.8828 --75.875 --75.8781 --75.8875 --75.8781 --75.8703 --75.8953 --75.8844 --75.8859 --75.8906 --75.8922 --75.8953 --75.8953 --75.8953 --75.8703 --75.8859 --75.8812 --75.8828 --75.8812 --75.8828 --75.8797 --75.8734 --75.8859 --75.8891 --75.8875 --75.8891 --75.8844 --75.8703 --75.8844 --75.8844 --75.8812 --75.8766 --75.8719 --75.8766 --75.875 --75.8625 --75.8766 --75.8812 --75.8656 --75.8766 --75.8766 --75.8781 --75.875 --75.8641 --75.8688 --75.8641 --75.8797 --75.8859 --75.8719 --75.8828 --75.875 --75.8719 --75.875 --75.8797 --75.8812 --75.8828 --75.8688 --75.8766 --75.8734 --75.8844 --75.8703 --75.8844 --75.8734 --75.8859 --75.8734 --75.8688 --75.8797 --75.8859 --75.8828 --75.8875 --75.8906 --75.8859 --75.8891 --75.8844 --75.8922 --75.8828 --75.875 --75.8812 --75.8719 --75.8844 --75.8891 --75.8891 --75.8875 --75.8812 --75.8906 --75.8984 --75.8781 --75.8766 --75.8703 --75.8922 --75.8906 --75.8781 --75.8812 --75.8859 --75.8859 --75.8969 --75.9031 --75.8844 --75.8719 --75.8812 --75.8891 --75.8922 --75.8969 --75.8922 --75.8844 --75.8953 --75.875 --75.8766 --75.8797 --75.8891 --75.8797 --75.9016 --75.8953 --75.8859 --75.8922 --75.8906 --75.8938 --75.9016 --75.8859 --75.8891 --75.9031 --75.9062 --75.9 --75.8984 --75.8969 --75.8703 --75.8797 --75.9016 --75.9016 --75.8906 --75.8984 --75.8844 --75.875 --75.8938 --75.8859 --75.8906 --75.8875 --75.8891 --75.8734 --75.8797 --75.8766 --75.8734 --75.8797 --75.8828 --75.8828 --75.8828 --75.8828 --75.8906 --75.8703 --75.8844 --75.8875 --75.8703 --75.8812 --75.8891 --75.8891 --75.8766 --75.8922 --75.8719 --75.8891 --75.8812 --75.8844 --75.8719 --75.8828 --75.8906 --75.8859 --75.8922 --75.8906 --75.8891 --75.8938 --75.8844 --75.8969 --75.8906 --75.8969 --75.8766 --75.8859 --75.8906 --75.8812 --75.8922 --75.8828 --75.8875 --75.8734 --75.8844 --75.8797 --75.8969 --75.9 --75.9031 --75.8828 --75.9062 --75.8938 --75.8953 --75.9156 --75.8875 --75.8938 --75.9062 --75.8859 --75.8953 --75.9 --75.8844 --75.8891 --75.9125 --75.8953 --75.8922 --75.9094 --75.8875 --75.8922 --75.8984 --75.9047 --75.8891 --75.8906 --75.8875 --75.8906 --75.8969 --75.8766 --75.8953 --75.8969 --75.8953 --75.8828 --75.9047 --75.8859 --75.8953 --75.8938 --75.8969 --75.8984 --75.8781 --75.8953 --75.8922 --75.8969 --75.8891 --75.8922 --75.9016 --75.8828 --75.9047 --75.9047 --75.8906 --75.8969 --75.8828 --75.8875 --75.8766 --75.8859 --75.8969 --75.8797 --75.8844 --75.8859 --75.8891 --75.9047 --75.9016 --75.9 --75.8891 --75.8969 --75.8766 --75.8891 --75.9062 --75.8844 --75.8828 --75.9062 --75.8922 --75.8906 --75.9047 --75.9078 --75.8922 --75.9062 --75.8875 --75.8953 --75.8875 --75.8859 --75.8828 --75.9047 --75.8953 --75.8891 --75.8844 --75.8891 --75.8891 --75.8922 --75.9109 --75.8797 --75.8984 --75.8953 --75.9016 --75.8922 --75.8844 --75.9016 --75.8859 --75.9031 --75.8984 --75.9016 --75.8984 --75.8875 --75.9031 --75.8875 --75.8953 --75.8906 --75.9 --75.8922 --75.8875 --75.9 --75.8953 --75.8953 --75.8812 --75.8844 --75.8859 --75.8922 --75.8812 --75.8812 --75.8938 --75.8922 --75.8844 --75.8859 --75.9 --75.9 --75.8875 --75.9016 --75.8875 --75.8969 --75.8969 --75.8875 --75.8938 --75.8969 --75.8906 --75.8828 --75.8875 --75.8922 --75.8844 --75.8938 --75.8906 --75.8984 --75.8938 --75.8828 --75.8859 --75.8922 --75.8859 --75.9047 --75.8906 --75.9 --75.9172 --75.9 --75.9 --75.8906 --75.8906 --75.8953 --75.8844 --75.9031 --75.8859 --75.8969 --75.8828 --75.8922 --75.8906 --75.9094 --75.8891 --75.9016 --75.8906 --75.9078 --75.8953 --75.9 --75.8969 --75.8812 --75.8969 --75.8938 --75.9062 --75.8969 --75.9031 --75.8984 --75.9062 --75.8906 --75.8984 --75.9047 --75.8969 --75.9 --75.8922 --75.8938 --75.8891 --75.8953 --75.8844 --75.9 --75.8875 --75.8844 --75.8875 --75.8938 --75.8859 --75.8812 --75.8812 --75.8797 --75.8719 --75.8891 --75.8969 --75.8812 --75.8922 --75.8906 --75.8875 --75.8875 --75.9031 --75.9031 --75.8828 --75.9016 --75.8984 --75.8672 --75.8844 --75.8938 --75.8891 --75.9 --75.8953 --75.9031 --75.9031 --75.8828 --75.8969 --75.8969 --75.8906 --75.9016 --75.9016 --75.8969 --75.8828 --75.8812 --75.8953 --75.8875 --75.8969 --75.8859 --75.8922 --75.8859 --75.8828 --75.8922 --75.875 --75.8906 --75.8703 --75.8953 --75.8812 --75.8797 --75.8781 --75.8812 --75.8891 --75.8891 --75.8844 --75.8859 --75.8828 --75.8828 --75.8891 --75.8859 --75.8797 --75.875 --75.8812 --75.8891 --75.8844 --75.8969 --75.8828 --75.8953 --75.875 --75.9047 --75.8875 --75.8906 --75.8969 --75.8734 --75.8844 --75.8875 --75.8938 --75.8891 --75.8938 --75.8891 --75.8828 --75.8969 --75.8875 --75.8969 --75.8906 --75.8922 --75.8875 --75.8906 --75.8891 --75.8828 --75.8906 --75.8781 --75.9047 --75.8891 --75.8781 --75.8953 --75.8781 --75.9 --75.8844 --75.8812 --75.8859 --75.8984 --75.8828 --75.8875 --75.8891 --75.8891 --75.8938 --75.8906 --75.8875 --75.9031 --75.8859 --75.8922 --75.9031 --75.8922 --75.8969 --75.9016 --75.8984 --75.8906 --75.8922 --75.8812 --75.8875 --75.8891 --75.8953 --75.875 --75.8969 --75.8953 --75.8906 --75.8844 --75.8766 --75.8938 --75.8906 --75.8922 --75.8844 --75.8891 --75.8953 --75.8891 --75.8891 --75.8875 --75.8859 --75.8859 --75.8969 --75.8766 --75.8766 --75.8812 --75.8922 --75.8938 --75.9016 --75.8891 --75.8953 --75.8953 --75.8891 --75.8859 --75.8891 --75.8891 --75.8922 --75.8953 --75.8812 --75.8797 --75.8922 --75.8812 --75.8812 --75.875 --75.8812 --75.8875 --75.8719 --75.8734 --75.8812 --75.8891 --75.8906 --75.8688 --75.8906 --75.8906 --75.8953 --75.8859 --75.8906 --75.8875 --75.8766 --75.8828 --75.8781 --75.8875 --75.8969 --75.8766 --75.8875 --75.8844 --75.8844 --75.8938 --75.8844 --75.8828 --75.8922 --75.8844 --75.8812 --75.8859 --75.8828 --75.8812 --75.8953 --75.8828 --75.8938 --75.8844 --75.8859 --75.8844 --75.8828 --75.8922 --75.8812 --75.8922 --75.8812 --75.8875 --75.8906 --75.8812 --75.8828 --75.8766 --75.8812 --75.8812 --75.8719 --75.8672 --75.8766 --75.8688 --75.8797 --75.875 --75.8797 --75.8766 --75.8938 --75.8797 --75.8828 --75.8609 --75.8828 --75.8703 --75.8688 --75.8812 --75.8812 --75.8812 --75.8766 --75.8844 --75.8969 --75.8828 --75.8891 --75.8844 --75.8844 --75.8984 --75.8984 --75.8781 --75.8875 --75.8828 --75.8891 --75.8688 --75.875 --75.8781 --75.8672 --75.8703 --75.8766 --75.875 --75.8703 --75.8953 --75.8766 --75.8688 --75.8656 --75.8844 --75.8734 --75.8781 --75.8766 --75.8812 --75.8844 --75.8859 --75.8719 --75.8859 --75.875 --75.8766 --75.8672 --75.8797 --75.8828 --75.8781 --75.8781 --75.8734 --75.8859 --75.8703 --75.8672 --75.8844 --75.8891 --75.8641 --75.8828 --75.8828 --75.8812 --75.8781 --75.8719 --75.8703 --75.8922 --75.8828 --75.8781 --75.8781 --75.8703 --75.8797 --75.8688 --75.8828 --75.8766 --75.8953 --75.8781 --75.8812 --75.8844 --75.8875 --75.8828 --75.8875 --75.8812 --75.8844 --75.8766 --75.8766 --75.8797 --75.8703 --75.8703 --75.8688 --75.8812 --75.8703 --75.8688 --75.8703 --75.8781 --75.8703 --75.8734 --75.8766 --75.8781 --75.8734 --75.8828 --75.875 --75.8703 --75.8766 --75.8703 --75.8781 --75.8797 --75.8766 --75.8688 --75.8703 --75.8656 --75.8672 --75.8859 --75.8766 --75.8922 --75.8688 --75.8703 --75.8656 --75.8703 --75.8703 --75.8812 --75.8859 --75.8703 --75.8719 --75.875 --75.8734 --75.8672 --75.8812 --75.8797 --75.8828 --75.8625 --75.8859 --75.8594 --75.8812 --75.8891 --75.8828 --75.8891 --75.8797 --75.8891 --75.8828 --75.8844 --75.8781 --75.8891 --75.8781 --75.8766 --75.8844 --75.8734 --75.8797 --75.8828 --75.8875 --75.8844 --75.8812 --75.8797 --75.8625 --75.8875 --75.8891 --75.8828 --75.8906 --75.8734 --75.8812 --75.9 --75.8844 --75.8922 --75.875 --75.8875 --75.8891 --75.8922 --75.8875 --75.8797 --75.8812 --75.8828 --75.8891 --75.8844 --75.8719 --75.8875 --75.8797 --75.8953 --75.8859 --75.8969 --75.8797 --75.8812 --75.8781 --75.8859 --75.8844 --75.8859 --75.8781 --75.8922 --75.8859 --75.8797 --75.8875 --75.8781 --75.8938 --75.8875 --75.8906 --75.8875 --75.8891 --75.8891 --75.8922 --75.8969 --75.9047 --75.8797 --75.8891 --75.8938 --75.8969 --75.8922 --75.8922 --75.8906 --75.8891 --75.8781 --75.8828 --75.8766 --75.8875 --75.8703 --75.8797 --75.8984 --75.8781 --75.8984 --75.8797 --75.8781 --75.8844 --75.8859 --75.8625 --75.8734 --75.8703 --75.8953 --75.8625 --75.8828 --75.8828 --75.8734 --75.8875 --75.8891 --75.8969 --75.8875 --75.8719 --75.8719 --75.8734 --75.8781 --75.8719 --75.8516 --75.8719 --75.8828 --75.8906 --75.8781 --75.8922 --75.8859 --75.8812 --75.8781 --75.8812 --75.8812 --75.8812 --75.8859 --75.8828 --75.8812 --75.8875 --75.8812 --75.8797 --75.8641 --75.8734 --75.8797 --75.8844 --75.8812 --75.8891 --75.8906 --75.8906 --75.8953 --75.8844 --75.8922 --75.9 --75.8938 --75.8891 --75.8797 --75.8953 --75.8781 --75.8844 --75.8922 --75.8875 --75.8906 --75.8938 --75.8953 --75.8953 --75.9 --75.8922 --75.8938 --75.8797 --75.8812 --75.8953 --75.8906 --75.8828 --75.8797 --75.8844 --75.9 --75.8828 --75.8891 --75.8953 --75.9 --75.8906 --75.8984 --75.8844 --75.8969 --75.8844 --75.8984 --75.8844 --75.8953 --75.8969 --75.8891 --75.9031 --75.8969 --75.8984 --75.9016 --75.8891 --75.8828 --75.8812 --75.8797 --75.8719 --75.8672 --75.8844 --75.8812 --75.8906 --75.875 --75.875 --75.8781 --75.875 --75.8781 --75.8812 --75.875 --75.8594 --75.8719 --75.8781 --75.8766 --75.875 --75.8703 --75.8781 --75.8969 --75.8844 --75.8859 --75.8875 --75.8766 --75.8906 --75.8922 --75.8812 --75.8844 --75.875 --75.8844 --75.8609 --75.8859 --75.8719 --75.8828 --75.8797 --75.8859 --75.8812 --75.8766 --75.8781 --75.8797 --75.875 --75.875 --75.8734 --75.8672 --75.8781 --75.8875 --75.8797 --75.8859 --75.8734 --75.8797 --75.8828 --75.8859 --75.8719 --75.9016 --75.8891 --75.8828 --75.8906 --75.8922 --75.8875 --75.8891 --75.8766 --75.8875 --75.8734 --75.8734 --75.875 --75.8844 --75.8859 --75.8797 --75.8828 --75.8922 --75.8734 --75.8734 --75.8766 --75.8766 --75.8906 --75.8906 --75.8922 --75.8781 --75.875 --75.8797 --75.8844 --75.8828 --75.8906 --75.8828 --75.8797 --75.875 --75.8828 --75.8734 --75.8812 --75.8688 --75.875 --75.8734 --75.8672 --75.8781 --75.8797 --75.8812 --75.8734 --75.8688 --75.8734 --75.8906 --75.8781 --75.8906 --75.8812 --75.8797 --75.8953 --75.8844 --75.8797 --75.8844 --75.8672 --75.8844 --75.8797 --75.8844 --75.8719 --75.8844 --75.8781 --75.8688 --75.8641 --75.8844 --75.8906 --75.8875 --75.875 --75.875 --75.8844 --75.8781 --75.8766 --75.8781 --75.8875 --75.8797 --75.8797 --75.8766 --75.8891 --75.8844 --75.8844 --75.8891 --75.8828 --75.8906 --75.8828 --75.8703 --75.8766 --75.8688 --75.8844 --75.8844 --75.8891 --75.8812 --75.8906 --75.8734 --75.8875 --75.8734 --75.8812 --75.8781 --75.8906 --75.8812 --75.8844 --75.8672 --75.8797 --75.8656 --75.8797 --75.8844 --75.8844 --75.8766 --75.8797 --75.8844 --75.8844 --75.8828 --75.8609 --75.8828 --75.8812 --75.8906 --75.8844 --75.8734 --75.8625 --75.8734 --75.8891 --75.8875 --75.8766 --75.8906 --75.8672 --75.8719 --75.8844 --75.8812 --75.8656 --75.8844 --75.8719 --75.8766 --75.8734 --75.8859 --75.8844 --75.8703 --75.8828 --75.8781 --75.8812 --75.8828 --75.8703 --75.8719 --75.8828 --75.8766 --75.8703 --75.8609 --75.8719 --75.8734 --75.8672 --75.8641 --75.8703 --75.8797 --75.8672 --75.8656 --75.8797 --75.8594 --75.8703 --75.8734 --75.8828 --75.8734 --75.8656 --75.875 --75.8812 --75.8766 --75.8812 --75.8922 --75.8734 --75.8828 --75.8812 --75.8844 --75.8781 --75.8812 --75.8875 --75.8703 --75.8844 --75.8828 --75.8766 --75.875 --75.8719 --75.8781 --75.8875 --75.8781 --75.8844 --75.8781 --75.8875 --75.8812 --75.8812 --75.8797 --75.8797 --75.8797 --75.8812 --75.8688 --75.8812 --75.8844 --75.875 --75.8719 --75.8859 --75.8703 --75.875 --75.8781 --75.8656 --75.8625 --75.8734 --75.8688 --75.8609 --75.8688 --75.8656 --75.8703 --75.8781 --75.8734 --75.8781 --75.8734 --75.8859 --75.8688 --75.8719 --75.875 --75.8812 --75.8781 --75.8812 --75.8734 --75.8781 --75.8797 --75.8656 --75.875 --75.8656 --75.875 --75.8641 --75.8625 --75.8734 --75.875 --75.8672 --75.8719 --75.8672 --75.8812 --75.8531 --75.8719 --75.8656 --75.8781 --75.8625 --75.875 --75.8766 --75.8688 --75.875 --75.8766 --75.8719 --75.8641 --75.8656 --75.8672 --75.8781 --75.8766 --75.875 --75.875 --75.8859 --75.8625 --75.8859 --75.8766 --75.8703 --75.8797 --75.8797 --75.8797 --75.8797 --75.8797 --75.8828 --75.8828 --75.8766 --75.8812 --75.8844 --75.8656 --75.8906 --75.8641 --75.8828 --75.8641 --75.8828 --75.8641 --75.8922 --75.8828 --75.8766 --75.8766 --75.8938 --75.8688 --75.8797 --75.8734 --75.8812 --75.8672 --75.8656 --75.8766 --75.8828 --75.8719 --75.8719 --75.8734 --75.8766 --75.8719 --75.8734 --75.8906 --75.9016 --75.8859 --75.8734 --75.8938 --75.8812 --75.8703 --75.8859 --75.8812 --75.8781 --75.8906 --75.8844 --75.8734 --75.8875 --75.8859 --75.8859 --75.8844 --75.8688 --75.8812 --75.8656 --75.8766 --75.8859 --75.8719 --75.8734 --75.8781 --75.8797 --75.8906 --75.8781 --75.8797 --75.8828 --75.8922 --75.8766 --75.8828 --75.8891 --75.8797 --75.8828 --75.8953 --75.8891 --75.8859 --75.8766 --75.8688 --75.8875 --75.8828 --75.8812 --75.8859 --75.8828 --75.8891 --75.8938 --75.8906 --75.8844 --75.8922 --75.8969 --75.8734 --75.8906 --75.8828 --75.8844 --75.8844 --75.8812 --75.875 --75.8891 --75.8719 --75.8797 --75.8781 --75.8625 --75.8812 --75.8828 --75.8812 --75.8719 --75.8812 --75.8844 --75.8859 --75.875 --75.8781 --75.8828 --75.8906 --75.8797 --75.8797 --75.8859 --75.8812 --75.8828 --75.8812 --75.8797 --75.8797 --75.875 --75.8703 --75.8812 --75.8844 --75.8828 --75.8797 --75.8766 --75.875 --75.875 --75.8734 --75.8719 --75.8656 --75.8844 --75.8609 --75.8578 --75.8797 --75.8719 --75.8828 --75.8766 --75.8719 --75.8797 --75.8688 --75.8797 --75.8844 --75.8875 --75.8734 --75.875 --75.8734 --75.875 --75.8625 --75.875 --75.8562 --75.8594 --75.8797 --75.8766 --75.875 --75.8891 --75.8625 --75.8688 --75.8766 --75.8812 --75.875 --75.875 --75.8828 --75.8656 --75.8734 --75.8781 --75.8594 --75.8688 --75.8766 --75.8812 --75.8719 --75.8734 --75.8797 --75.8656 --75.8672 --75.8672 --75.8703 --75.8672 --75.875 --75.8844 --75.8797 --75.8703 --75.8703 --75.8797 --75.8594 --75.8672 --75.8578 --75.8641 --75.8766 --75.8656 --75.8797 --75.875 --75.8891 --75.8812 --75.8766 --75.8812 --75.8641 --75.8672 --75.8688 --75.8656 --75.8719 --75.8828 --75.8578 --75.875 --75.8828 --75.8812 --75.8797 --75.8703 --75.875 --75.8719 --75.8703 --75.8656 --75.8797 --75.8797 --75.8797 --75.8891 --75.8812 --75.8953 --75.8875 --75.8891 --75.8844 --75.8719 --75.8859 --75.8875 --75.8875 --75.8781 --75.8812 --75.8938 --75.8906 --75.8844 --75.8828 --75.8766 --75.8812 --75.8812 --75.8781 --75.8797 --75.8781 --75.8844 --75.8672 --75.8875 --75.8797 --75.8828 --75.8688 --75.8844 --75.8828 --75.8766 --75.8812 --75.8828 --75.8719 --75.8672 --75.8641 --75.875 --75.8688 --75.8797 --75.8797 --75.8875 --75.8781 --75.8719 --75.8797 --75.8703 --75.8672 --75.875 --75.8734 --75.8672 --75.8703 --75.8766 --75.8672 --75.8766 --75.8703 --75.8797 --75.8734 --75.8719 --75.8734 --75.8797 --75.8656 --75.8719 --75.8703 --75.8641 --75.8828 --75.8828 --75.8797 --75.8734 --75.8812 --75.8734 --75.8734 --75.8734 --75.8734 --75.8734 --75.8734 --75.8719 --75.8703 --75.8797 --75.8719 --75.8875 --75.8688 --75.8781 --75.8703 --75.8781 --75.8766 --75.8641 --75.8688 --75.8703 --75.8781 --75.8812 --75.875 --75.8766 --75.8766 --75.8688 --75.8703 --75.8797 --75.8844 --75.8812 --75.8812 --75.8797 --75.8828 --75.8797 --75.875 --75.8609 --75.8781 --75.8812 --75.8812 --75.8734 --75.8781 --75.8859 --75.8781 --75.8828 --75.8781 --75.8781 --75.8828 --75.8703 --75.8625 --75.8719 --75.8688 --75.8719 --75.8734 --75.8859 --75.8781 --75.8656 --75.875 --75.8688 --75.8703 --75.875 --75.8828 --75.8828 --75.8672 --75.8656 --75.8719 --75.875 --75.8672 --75.875 --75.8797 --75.8859 --75.8828 --75.875 --75.8844 --75.8766 --75.8812 --75.8859 --75.8781 --75.8812 --75.8703 --75.8719 --75.875 --75.8797 --75.8766 --75.8672 --75.8656 --75.8859 --75.8812 --75.8781 --75.8656 --75.875 --75.8859 --75.8672 --75.8781 --75.8859 --75.8766 --75.875 --75.8672 --75.8797 --75.8781 --75.8734 --75.8656 --75.8781 --75.8703 --75.8609 --75.8781 --75.8781 --75.8688 --75.8859 --75.8656 --75.8656 --75.8688 --75.8766 --75.8781 --75.8766 --75.8859 --75.8688 --75.8797 --75.8828 --75.8734 --75.8766 --75.8828 --75.8828 --75.8688 --75.8766 --75.8812 --75.8906 --75.8906 --75.8859 --75.875 --75.8734 --75.875 --75.8625 --75.8734 --75.8562 --75.8719 --75.875 --75.8703 --75.8719 --75.8688 --75.8781 --75.875 --75.8672 --75.8688 --75.8703 --75.8766 --75.8625 --75.8859 --75.875 --75.8812 --75.8828 --75.8828 --75.8859 --75.8859 --75.8719 --75.8812 --75.8766 --75.8781 --75.8812 --75.8703 --75.8766 --75.8828 --75.8812 --75.8812 --75.8859 --75.8703 --75.8734 --75.8844 --75.8766 --75.8859 --75.8828 --75.8734 --75.8766 --75.8625 --75.8688 --75.8781 --75.8906 --75.8719 --75.8828 --75.8734 --75.8797 --75.8703 --75.8828 --75.8688 --75.8688 --75.875 --75.8688 --75.8703 --75.8766 --75.8672 --75.8766 --75.8812 --75.8734 --75.8766 --75.8719 --75.8703 --75.8812 --75.8906 --75.8719 --75.8828 --75.8672 --75.8891 --75.8922 --75.8969 --75.8812 --75.8828 --75.8781 --75.8781 --75.8703 --75.8781 --75.8812 --75.8906 --75.8797 --75.8844 --75.8891 --75.8719 --75.8797 --75.8609 --75.8859 --75.8656 --75.8812 --75.8797 --75.875 --75.875 --75.8703 --75.8703 --75.8797 --75.8812 --75.8812 --75.8875 --75.8781 --75.8859 --75.8828 --75.8844 --75.8812 --75.8797 --75.8734 --75.8859 --75.8891 --75.8797 --75.8844 --75.8609 --75.8781 --75.8688 --75.8969 --75.8797 --75.8781 --75.8781 --75.8734 --75.8766 --75.8844 --75.8781 --75.8891 --75.8797 --75.8922 --75.8719 --75.8828 --75.8766 --75.8766 --75.875 --75.8641 --75.8766 --75.8734 --75.875 --75.8641 --75.8609 --75.8781 --75.8797 --75.8781 --75.8703 --75.8844 --75.8766 --75.8875 --75.8734 --75.8875 --75.8641 --75.875 --75.8578 --75.8734 --75.8734 --75.8766 --75.8656 --75.8766 --75.8766 --75.8719 --75.8781 --75.8891 --75.8656 --75.8844 --75.8734 --75.875 --75.8891 --75.8688 --75.8891 --75.8844 --75.8766 --75.8719 --75.8859 --75.8703 --75.8719 --75.8859 --75.8656 --75.8734 --75.8781 --75.8812 --75.8781 --75.8703 --75.8688 --75.8734 --75.8797 --75.8766 --75.8891 --75.8859 --75.8922 --75.8781 --75.8922 --75.8781 --75.8922 --75.8922 --75.8844 --75.8797 --75.8969 --75.8766 --75.9 --75.8703 --75.8719 --75.8797 --75.8688 --75.8938 --75.8625 --75.8734 --75.875 --75.8625 --75.8734 --75.8703 --75.8797 --75.8766 --75.875 --75.8688 --75.8688 --75.8891 --75.8672 --75.8688 --75.8734 --75.8703 --75.8844 --75.8859 --75.8859 --75.8672 --75.8797 --75.8797 --75.8656 --75.8875 --75.8906 --75.8812 --75.8797 --75.8641 --75.8828 --75.8656 --75.8828 --75.8906 --75.8828 --75.8688 --75.8844 --75.8766 --75.8875 --75.8859 --75.8812 --75.8844 --75.8781 --75.8766 --75.8906 --75.8719 --75.8812 --75.8609 --75.8781 --75.8719 --75.8578 --75.8812 --75.8547 --75.8781 --75.8625 --75.8656 --75.8672 --75.8906 --75.8766 --75.8812 --75.8859 --75.8719 --75.8719 --75.8812 --75.8734 --75.8719 --75.8672 --75.8766 --75.8922 --75.875 --75.8828 --75.8812 --75.8766 --75.8781 --75.8766 --75.8828 --75.8719 --75.875 --75.8703 --75.8797 --75.8922 --75.8781 --75.8875 --75.8891 --75.8953 --75.8766 --75.875 --75.8938 --75.8906 --75.8875 --75.8797 --75.8844 --75.8828 --75.8969 --75.8891 --75.9016 --75.8844 --75.875 --75.8875 --75.8859 --75.8953 --75.8812 --75.8797 --75.8891 --75.8812 --75.8859 --75.8812 --75.8766 --75.8797 --75.8875 --75.875 --75.9 --75.9 --75.8875 --75.8781 --75.8953 --75.8953 --75.8859 --75.8859 --75.875 --75.8859 --75.8797 --75.8875 --75.8734 --75.8719 --75.8719 --75.875 --75.8922 --75.8781 --75.8844 --75.8891 --75.8688 --75.8641 --75.8984 --75.8609 --75.8734 --75.8828 --75.8688 --75.8766 --75.8719 --75.8719 --75.8812 --75.8734 --75.8766 --75.8859 --75.8797 --75.8812 --75.8656 --75.8719 --75.875 --75.8812 --75.8828 --75.8828 --75.8734 --75.8922 --75.8766 --75.8781 --75.8844 --75.8844 --75.8672 --75.8875 --75.8906 --75.8828 --75.8797 --75.8734 --75.8766 --75.8719 --75.8828 --75.8781 --75.8672 --75.8766 --75.875 --75.8609 --75.8672 --75.8734 --75.8672 --75.8656 --75.8688 --75.8766 --75.8703 --75.875 --75.8688 --75.8734 --75.8703 --75.8703 --75.8797 --75.8734 --75.8656 --75.875 --75.8859 --75.8828 --75.8812 --75.8828 --75.8703 --75.8703 --75.8812 --75.8641 --75.8703 --75.8812 --75.8766 --75.8688 --75.8719 --75.8766 --75.8594 --75.8609 --75.8688 --75.8781 --75.8625 --75.8656 --75.8812 --75.875 --75.8609 --75.8844 --75.8641 --75.8797 --75.8734 --75.8828 --75.8734 --75.8797 --75.8594 --75.8609 --75.8734 --75.875 --75.8547 --75.8766 --75.8781 --75.8703 --75.8719 --75.8672 --75.8703 --75.8797 --75.8719 --75.8766 --75.8719 --75.8797 --75.8828 --75.8656 --75.8828 --75.8828 --75.8859 --75.8812 --75.875 --75.8703 --75.8672 --75.8875 --75.8688 --75.8859 --75.8734 --75.8734 --75.8812 --75.8859 --75.8766 --75.8797 --75.8781 --75.8672 --75.8719 --75.8734 --75.8781 --75.8766 --75.8719 --75.8625 --75.8625 --75.8625 --75.8781 --75.875 --75.8828 --75.8562 --75.8703 --75.875 --75.8766 --75.8688 --75.8719 --75.8719 --75.8688 --75.8828 --75.875 --75.8734 --75.8703 --75.8656 --75.8672 --75.8734 --75.8656 --75.8672 --75.8625 --75.8812 --75.8656 --75.8656 --75.8609 --75.8734 --75.8672 --75.8625 --75.8766 --75.8969 --75.8891 --75.8859 --75.8766 --75.8906 --75.8797 --75.875 --75.8766 --75.8875 --75.8828 --75.8797 --75.8734 --75.8641 --75.8875 --75.8875 --75.8828 --75.8781 --75.8875 --75.8844 --75.8859 --75.875 --75.8781 --75.8703 --75.8812 --75.8641 --75.8812 --75.8859 --75.8781 --75.8797 --75.8781 --75.8875 --75.8797 --75.8875 --75.8828 --75.875 --75.875 --75.8906 --75.8734 --75.8688 --75.875 --75.8891 --75.8688 --75.875 --75.8719 --75.8781 --75.8719 --75.8688 --75.8703 --75.8719 --75.8688 --75.8688 --75.8625 --75.875 --75.8656 --75.875 --75.8797 --75.8703 --75.8875 --75.8781 --75.8906 --75.8641 --75.8672 --75.8812 --75.8641 --75.8844 --75.8703 --75.9 --75.8906 --75.8875 --75.8812 --75.8906 --75.8688 --75.8828 --75.8719 --75.875 --75.8641 --75.8859 --75.8922 --75.8828 --75.8859 --75.8844 --75.8797 --75.8781 --75.8688 --75.8719 --75.8828 --75.8625 --75.875 --75.8688 --75.8844 --75.8828 --75.8734 --75.8734 --75.8719 --75.8844 --75.8734 --75.8797 --75.8641 --75.8625 --75.8562 --75.8719 --75.8734 --75.8734 --75.8828 --75.8641 --75.8859 --75.875 --75.8797 --75.8672 --75.8672 --75.8719 --75.8719 --75.8594 --75.875 --75.8797 --75.8797 --75.8641 --75.8641 --75.8688 --75.8734 --75.8719 --75.8656 --75.8766 --75.8703 --75.8781 --75.8656 --75.8797 --75.875 --75.8688 --75.8688 --75.8641 --75.8812 --75.8734 --75.8812 --75.8719 --75.8844 --75.8797 --75.8719 --75.8766 --75.8766 --75.8703 --75.8812 --75.875 --75.8672 --75.8844 --75.8766 --75.8844 --75.8672 --75.8719 --75.8672 --75.8594 --75.8719 --75.875 --75.8703 --75.8734 --75.875 --75.8672 --75.875 --75.8828 --75.8719 --75.8688 --75.8719 --75.8641 --75.8688 --75.8641 --75.8641 --75.8578 --75.8672 --75.8641 --75.8578 --75.8562 --75.8719 --75.8562 --75.8594 --75.8594 --75.8625 --75.8609 --75.8484 --75.8719 --75.8656 --75.8641 --75.8625 --75.8516 --75.8609 --75.875 --75.875 --75.8734 --75.8688 --75.8688 --75.85 --75.8578 --75.8703 --75.8594 --75.8719 --75.8641 --75.8719 --75.8766 --75.8828 --75.8656 --75.8859 --75.8781 --75.8625 --75.8734 --75.8625 --75.8641 --75.8703 --75.8828 --75.8516 --75.8516 --75.8625 --75.8547 --75.8656 --75.875 --75.8672 --75.8578 --75.8656 --75.8672 --75.8625 --75.8734 --75.8766 --75.8734 --75.8625 --75.8719 --75.875 --75.8828 --75.8781 --75.8766 --75.8688 --75.8719 --75.8734 --75.875 --75.8781 --75.8703 --75.875 --75.8656 --75.875 --75.8719 --75.8703 --75.8656 --75.8625 --75.8672 --75.8781 --75.8703 --75.875 --75.8812 --75.8797 --75.8781 --75.8688 --75.8672 --75.8781 --75.8703 --75.875 --75.8812 --75.8828 --75.8781 --75.8828 --75.8781 --75.8891 --75.8766 --75.8859 --75.8859 --75.8906 --75.8719 --75.8875 --75.8844 --75.875 --75.9 --75.8891 --75.8688 --75.8828 --75.8688 --75.8766 --75.8766 --75.8719 --75.8766 --75.8766 --75.8875 --75.8906 --75.875 --75.8859 --75.8891 --75.8859 --75.8766 --75.8828 --75.8703 --75.875 --75.8812 --75.9016 --75.8641 --75.8844 --75.8625 --75.8781 --75.8797 --75.8688 --75.8625 --75.8688 --75.8734 --75.8875 --75.8828 --75.8828 --75.8703 --75.8797 --75.875 --75.8781 --75.8734 --75.8703 --75.8781 --75.875 --75.8641 --75.8703 --75.8766 --75.8984 --75.8906 --75.8859 --75.8797 --75.8891 --75.8828 --75.8797 --75.8844 --75.8734 --75.8844 --75.8922 --75.8906 --75.8922 --75.8906 --75.8812 --75.9 --75.8703 --75.8875 --75.8891 --75.9 --75.8812 --75.8891 --75.8812 --75.8812 --75.9 --75.8906 --75.8938 --75.8844 --75.8828 --75.8797 --75.8781 --75.8781 --75.8781 --75.8906 --75.8859 --75.8781 --75.8922 --75.8859 --75.8859 --75.8797 --75.8812 --75.8781 --75.8734 --75.8875 --75.8859 --75.8781 --75.8812 --75.8922 --75.8859 --75.8828 --75.8906 --75.8656 --75.8781 --75.8703 --75.8688 --75.8906 --75.875 --75.8875 --75.8766 --75.8844 --75.8594 --75.875 --75.8859 --75.8844 --75.8828 --75.8859 --75.8875 --75.8828 --75.8922 --75.8812 --75.8797 --75.8844 --75.8703 --75.8734 --75.8922 --75.8781 --75.8828 --75.8859 --75.8953 --75.8781 --75.8812 --75.8781 --75.8719 --75.8812 --75.8703 --75.8609 --75.8797 --75.8828 --75.8688 --75.8766 --75.8766 --75.8781 --75.8875 --75.8734 --75.8766 --75.875 --75.8812 --75.8891 --75.8781 --75.8812 --75.8719 --75.8766 --75.8797 --75.8844 --75.8812 --75.8703 --75.8734 --75.8656 --75.8688 --75.8797 --75.8703 --75.8719 --75.8828 --75.8797 --75.8703 --75.8734 --75.8719 --75.8734 --75.8672 --75.8578 --75.8688 --75.8797 --75.8516 --75.8672 --75.8656 --75.8703 --75.875 --75.8641 --75.8703 --75.8797 --75.8531 --75.8766 --75.8797 --75.8734 --75.8719 --75.8672 --75.8781 --75.8641 --75.8703 --75.8688 --75.8844 --75.8938 --75.8844 --75.8766 --75.8688 --75.8734 --75.8766 --75.8688 --75.8703 --75.8844 --75.8797 --75.8812 --75.8734 --75.8797 --75.8812 --75.8797 --75.8938 --75.8828 --75.8859 --75.875 --75.8859 --75.8797 --75.875 --75.8828 --75.8906 --75.8781 --75.8828 --75.8891 --75.8844 --75.8891 --75.8828 --75.8578 --75.8844 --75.875 --75.875 --75.8844 --75.8734 --75.8734 --75.8766 --75.8719 --75.8797 --75.8812 --75.8719 --75.8703 --75.8844 --75.8656 --75.8781 --75.8781 --75.8719 --75.8672 --75.8781 --75.8828 --75.8859 --75.8656 --75.8781 --75.8891 --75.8672 --75.8719 --75.8812 --75.8719 --75.8703 --75.8844 --75.8719 --75.8766 --75.8844 --75.8734 --75.8781 --75.8781 --75.8734 --75.8766 --75.8859 --75.8812 --75.8688 --75.8766 --75.8781 --75.8734 --75.8875 --75.8891 --75.8984 --75.8875 --75.8828 --75.8797 --75.8625 --75.8719 --75.8641 --75.8812 --75.8906 --75.8781 --75.8875 --75.8703 --75.8906 --75.8891 --75.8906 --75.875 --75.8859 --75.8734 --75.8781 --75.8797 --75.8891 --75.8797 --75.8906 --75.8859 --75.8859 --75.8922 --75.8859 --75.8766 --75.8938 --75.8906 --75.8766 --75.8859 --75.8719 --75.8969 --75.8906 --75.8969 --75.8938 --75.8891 --75.8984 --75.8891 --75.8859 --75.8953 --75.8875 --75.8859 --75.8859 --75.8922 --75.8859 --75.8984 --75.8891 --75.8938 --75.9016 --75.9031 --75.8875 --75.8891 --75.8938 --75.9016 --75.8891 --75.8906 --75.8844 --75.8938 --75.8812 --75.8859 --75.8859 --75.8812 --75.8781 --75.8812 --75.8797 --75.8984 --75.8812 --75.8797 --75.8828 --75.8953 --75.8859 --75.8781 --75.8812 --75.8844 --75.8844 --75.8859 --75.8875 --75.8906 --75.8938 --75.8844 --75.8797 --75.8828 --75.8906 --75.8797 --75.8891 --75.8906 --75.8828 --75.8703 --75.8844 --75.8891 --75.8875 --75.8781 --75.8922 --75.8766 --75.8766 --75.8672 --75.8766 --75.8672 --75.875 --75.8953 --75.8703 --75.8906 --75.8734 --75.8781 --75.8719 --75.8797 --75.8828 --75.8844 --75.8781 --75.8828 --75.8828 --75.8656 --75.8969 --75.8828 --75.8656 --75.8719 --75.8812 --75.8766 --75.8766 --75.8922 --75.8891 --75.8828 --75.8828 --75.8859 --75.8781 --75.9016 --75.8875 --75.8812 --75.8891 --75.8844 --75.8938 --75.8797 --75.8891 --75.8734 --75.875 --75.8938 --75.8797 --75.8859 --75.875 --75.8906 --75.8719 --75.8766 --75.8828 --75.8797 --75.8734 --75.8812 --75.8906 --75.8859 --75.8797 --75.9062 --75.8656 --75.8859 --75.8828 --75.8781 --75.8859 --75.8844 --75.8891 --75.8859 --75.8844 --75.8875 --75.8844 --75.8922 --75.8969 --75.8906 --75.8797 --75.8781 --75.8844 --75.9016 --75.8844 --75.8812 --75.8781 --75.8891 --75.8859 --75.8875 --75.8906 --75.8938 --75.8812 --75.8922 --75.8922 --75.8797 --75.8953 --75.8812 --75.9 --75.8891 --75.8844 --75.9031 --75.8969 --75.9109 --75.8969 --75.8953 --75.8969 --75.8875 --75.8953 --75.9078 --75.8844 --75.8859 --75.8906 --75.8875 --75.9031 --75.8875 --75.8875 --75.8859 --75.9047 --75.8953 --75.8859 --75.8953 --75.8891 --75.8797 --75.8859 --75.8797 --75.8875 --75.8844 --75.8953 --75.8766 --75.8875 --75.8828 --75.9 --75.8812 --75.8828 --75.8984 --75.8875 --75.8891 --75.8844 --75.8844 --75.8969 --75.8844 --75.8875 --75.8906 --75.8906 --75.8828 --75.8922 --75.8922 --75.8812 --75.8953 --75.875 --75.8781 --75.8828 --75.8828 --75.8906 --75.8875 --75.875 --75.8812 --75.8812 --75.8891 --75.8844 --75.8812 --75.8844 --75.8781 --75.8938 --75.8844 --75.8891 --75.8797 --75.8844 --75.8766 --75.8766 --75.8859 --75.8781 --75.8875 --75.8844 --75.8766 --75.8844 --75.8766 --75.8828 --75.8906 --75.8812 --75.8953 --75.8891 --75.9047 --75.8984 --75.9016 --75.8906 --75.8938 --75.8828 --75.8859 --75.8812 --75.8828 --75.8828 --75.8828 --75.8906 --75.8859 --75.8766 --75.875 --75.8766 --75.8781 --75.8859 --75.8891 --75.8891 --75.8797 --75.8906 --75.8969 --75.8703 --75.8859 --75.8844 --75.9031 --75.8812 --75.9078 --75.8953 --75.8797 --75.8812 --75.8938 --75.9078 --75.8891 --75.8922 --75.9031 --75.8828 --75.8953 --75.8891 --75.8672 --75.8906 --75.8828 --75.8844 --75.8891 --75.8891 --75.8844 --75.8875 --75.8922 --75.8891 --75.8688 --75.8797 --75.8953 --75.8875 --75.8828 --75.8766 --75.8797 --75.8859 --75.8906 --75.8938 --75.8938 --75.8922 --75.8938 --75.8938 --75.9047 --75.8922 --75.8953 --75.8922 --75.8844 --75.8969 --75.8891 --75.8922 --75.8938 --75.9 --75.8766 --75.8953 --75.8953 --75.8891 --75.8969 --75.8875 --75.8906 --75.9 --75.9047 --75.8969 --75.8844 --75.8938 --75.9031 --75.8859 --75.9 --75.8891 --75.9016 --75.8938 --75.8859 --75.8797 --75.8797 --75.8875 --75.8953 --75.8922 --75.8812 --75.8844 --75.8891 --75.8891 --75.8828 --75.8969 --75.8797 --75.8891 --75.8891 --75.8859 --75.8875 --75.8906 --75.8844 --75.8891 --75.8922 --75.8938 --75.8953 --75.8953 --75.8953 --75.8922 --75.8938 --75.9016 --75.8797 --75.8906 --75.8938 --75.8922 --75.8938 --75.8891 --75.8906 --75.8906 --75.8906 --75.8719 --75.8844 --75.8906 --75.8828 --75.8844 --75.8875 --75.8797 --75.875 --75.8875 --75.8922 --75.8828 --75.8891 --75.8969 --75.8812 --75.8922 --75.8969 --75.8844 --75.8828 --75.8812 --75.8844 --75.875 --75.8797 --75.8828 --75.8781 --75.8938 --75.8719 --75.8891 --75.8844 --75.8891 --75.8719 --75.8828 --75.8875 --75.8672 --75.8734 --75.8859 --75.8797 --75.8938 --75.8969 --75.8766 --75.8859 --75.8766 --75.8688 --75.8797 --75.8781 --75.8812 --75.8891 --75.8906 --75.8703 --75.8781 --75.8906 --75.8969 --75.8859 --75.8906 --75.8797 --75.8875 --75.8953 --75.8781 --75.8781 --75.8781 --75.8719 --75.8797 --75.8859 --75.8797 --75.8844 --75.8688 --75.8703 --75.8766 --75.8766 --75.8812 --75.8844 --75.8875 --75.8812 --75.8828 --75.8734 --75.8891 --75.8828 --75.8922 --75.8922 --75.9 --75.8844 --75.8844 --75.8922 --75.8859 --75.8703 --75.8766 --75.8719 --75.875 --75.8781 --75.8797 --75.8781 --75.8781 --75.8828 --75.8875 --75.8797 --75.8719 --75.8781 --75.8812 --75.875 --75.8844 --75.8875 --75.8828 --75.8969 --75.8828 --75.8875 --75.8906 --75.8875 --75.8969 --75.8844 --75.8891 --75.8812 --75.8938 --75.8922 --75.8969 --75.8875 --75.8828 --75.8891 --75.8969 --75.875 --75.8875 --75.8797 --75.8781 --75.8875 --75.8828 --75.8875 --75.8938 --75.8781 --75.875 --75.8828 --75.8859 --75.8828 --75.8891 --75.8766 --75.8859 --75.8891 --75.8844 --75.8922 --75.8969 --75.8797 --75.9031 --75.8812 --75.8812 --75.8797 --75.8781 --75.8844 --75.8734 --75.8922 --75.8844 --75.8859 --75.8875 --75.8969 --75.9016 --75.8797 --75.8891 --75.8969 --75.8938 --75.8938 --75.8875 --75.8891 --75.8938 --75.8766 --75.8969 --75.9078 --75.8906 --75.9016 --75.8922 --75.8828 --75.9031 --75.8922 --75.8859 --75.8875 --75.8953 --75.8891 --75.8875 --75.8906 --75.8891 --75.8938 --75.9 --75.8891 --75.9047 --75.9 --75.8875 --75.8812 --75.9016 --75.8875 --75.8922 --75.9 --75.8938 --75.8969 --75.8891 --75.8875 --75.8922 --75.9016 --75.8812 --75.8891 --75.8938 --75.8828 --75.8891 --75.8891 --75.8812 --75.8781 --75.8953 --75.8875 --75.8688 --75.8953 --75.8875 --75.8719 --75.8734 --75.8828 --75.8781 --75.8719 --75.8828 --75.8766 --75.8781 --75.8781 --75.8781 --75.8781 --75.8688 --75.8781 --75.8859 --75.8828 --75.8891 --75.9 --75.8766 --75.8906 --75.8906 --75.8797 --75.8734 --75.8781 --75.8844 --75.8766 --75.8781 --75.8812 --75.8641 --75.8844 --75.8703 --75.8672 --75.8766 --75.8828 --75.8641 --75.8859 --75.8672 --75.8859 --75.8625 --75.8812 --75.8766 --75.8812 --75.8922 --75.8859 --75.8688 --75.8891 --75.8828 --75.8891 --75.8906 --75.8734 --75.8859 --75.8844 --75.8828 --75.8766 --75.8891 --75.8703 --75.8875 --75.8875 --75.8734 --75.8828 --75.8922 --75.8797 --75.8797 --75.8875 --75.8891 --75.8844 --75.8969 --75.8922 --75.8828 --75.8734 --75.8844 --75.8891 --75.8891 --75.8969 --75.8938 --75.8828 --75.8906 --75.9031 --75.8891 --75.8859 --75.8906 --75.8938 --75.8891 --75.8781 --75.8922 --75.8766 --75.8797 --75.8891 --75.8734 --75.8844 --75.8906 --75.8766 --75.8797 --75.8812 --75.8844 --75.8906 --75.8938 --75.8844 --75.8828 --75.8734 --75.8844 --75.8812 --75.8719 --75.8891 --75.8828 --75.8766 --75.8594 --75.8969 --75.8734 --75.8766 --75.8969 --75.8828 --75.8812 --75.8656 --75.8812 --75.8984 --75.8859 --75.8812 --75.875 --75.875 --75.8891 --75.8891 --75.8797 --75.8891 --75.8781 --75.8891 --75.8734 --75.8906 --75.8875 --75.8938 --75.8953 --75.8781 --75.8875 --75.8859 --75.8938 --75.8875 --75.8969 --75.8953 --75.8828 --75.9031 --75.8875 --75.8875 --75.8766 --75.8922 --75.8781 --75.8906 --75.8922 --75.8812 --75.8938 --75.8953 --75.9016 --75.9031 --75.9031 --75.8797 --75.8828 --75.9016 --75.9047 --75.8922 --75.8844 --75.8781 --75.875 --75.8844 --75.8969 --75.8938 --75.8953 --75.8938 --75.8891 --75.8828 --75.8922 --75.8828 --75.8906 --75.9 --75.8828 --75.8797 --75.8844 --75.8891 --75.8875 --75.8844 --75.8797 --75.8922 --75.8953 --75.9 --75.9 --75.8891 --75.9 --75.9047 --75.8938 --75.8969 --75.8969 --75.9 --75.8828 --75.8922 --75.8781 --75.8812 --75.8828 --75.8938 --75.8891 --75.8938 --75.8859 --75.8891 --75.8969 --75.8922 --75.8859 --75.8875 --75.8891 --75.8797 --75.8875 --75.8859 --75.8922 --75.8969 --75.8828 --75.8953 --75.8859 --75.8922 --75.8922 --75.8906 --75.8891 --75.8922 --75.9016 --75.8844 --75.8984 --75.9078 --75.9078 --75.8938 --75.8953 --75.9 --75.8969 --75.8922 --75.8906 --75.9016 --75.9 --75.8969 --75.8906 --75.9031 --75.9031 --75.8984 --75.9016 --75.8891 --75.8938 --75.8906 --75.9016 --75.9016 --75.9062 --75.8938 --75.8953 --75.8984 --75.8859 --75.9 --75.9016 --75.8938 --75.8922 --75.8922 --75.8891 --75.8875 --75.8984 --75.8938 --75.8953 --75.9047 --75.8969 --75.8859 --75.9 --75.8953 --75.9 --75.9109 --75.8891 --75.8938 --75.9047 --75.8953 --75.9016 --75.8906 --75.8969 --75.8906 --75.8953 --75.8969 --75.8781 --75.8938 --75.8922 --75.8969 --75.8875 --75.8859 --75.8906 --75.8859 --75.8859 --75.8766 --75.8906 --75.8828 --75.8906 --75.8922 --75.8984 --75.8781 --75.9 --75.8891 --75.8875 --75.8969 --75.8891 --75.8828 --75.8812 --75.8844 --75.8891 --75.8938 --75.8797 --75.8828 --75.9031 --75.8859 --75.8984 --75.8953 --75.8797 --75.875 --75.8797 --75.8844 --75.8906 --75.8812 --75.8891 --75.8844 --75.8891 --75.8797 --75.9 --75.8938 --75.8938 --75.8953 --75.8891 --75.8812 --75.8844 --75.8953 --75.875 --75.8844 --75.8906 --75.8828 --75.8875 --75.8797 --75.8844 --75.8875 --75.8875 --75.8953 --75.8922 --75.8781 --75.8891 --75.8938 --75.8734 --75.8891 --75.8875 --75.9 --75.8922 --75.9047 --75.8859 --75.8891 --75.8844 --75.8891 --75.9062 --75.8984 --75.8906 --75.9016 --75.8938 --75.8859 --75.8938 --75.8797 --75.8812 --75.9078 --75.8797 --75.9 --75.8953 --75.8891 --75.9 --75.8844 --75.8875 --75.9125 --75.9094 --75.8953 --75.8812 --75.8844 --75.9016 --75.9 --75.8938 --75.9 --75.8984 --75.9125 --75.8906 --75.8984 --75.9031 --75.8859 --75.8891 --75.8828 --75.8797 --75.8797 --75.8891 --75.8984 --75.8984 --75.9016 --75.9047 --75.8969 --75.8875 --75.8969 --75.9 --75.8891 --75.8969 --75.8781 --75.8859 --75.8797 --75.9 --75.8906 --75.8906 --75.8984 --75.8766 --75.9062 --75.8953 --75.8766 --75.8859 --75.8844 --75.9 --75.9 --75.8906 --75.875 --75.8953 --75.8703 --75.8891 --75.8891 --75.9 --75.875 --75.875 --75.8875 --75.8844 --75.8969 --75.8844 --75.8875 --75.8844 --75.8891 --75.8797 --75.8812 --75.8719 --75.8766 --75.8797 --75.8812 --75.8891 --75.8797 --75.9031 --75.8766 --75.8844 --75.8906 --75.8828 --75.8984 --75.8828 --75.8891 --75.8844 --75.8828 --75.8812 --75.8812 --75.8906 --75.8969 --75.9 --75.8766 --75.8812 --75.8781 --75.8859 --75.8891 --75.8844 --75.8844 --75.8797 --75.8875 --75.8766 --75.8906 --75.8906 --75.8938 --75.8797 --75.8891 --75.8969 --75.8812 --75.8828 --75.8844 --75.8828 --75.8828 --75.8922 --75.8953 --75.8859 --75.8875 --75.8828 --75.8906 --75.8875 --75.8828 --75.8766 --75.8922 --75.8828 --75.875 --75.8922 --75.8938 --75.8828 --75.8922 --75.8922 --75.8781 --75.8969 --75.9047 --75.8922 --75.9047 --75.8953 --75.8859 --75.8953 --75.8969 --75.8984 --75.8828 --75.8766 --75.8719 --75.8891 --75.9016 --75.8938 --75.8906 --75.8859 --75.8859 --75.8969 --75.9 --75.8859 --75.8953 --75.8922 --75.875 --75.8906 --75.8891 --75.8953 --75.8906 --75.8781 --75.8734 --75.8828 --75.8797 --75.8797 --75.8938 --75.8766 --75.8766 --75.8812 --75.8781 --75.8922 --75.8906 --75.875 --75.8938 --75.8828 --75.8844 --75.8875 --75.875 --75.8969 --75.8781 --75.8891 --75.8906 --75.8938 --75.8781 --75.8875 --75.8953 --75.8984 --75.8891 --75.8953 --75.8953 --75.8844 --75.8938 --75.8938 --75.8844 --75.8906 --75.8906 --75.8781 --75.8828 --75.8906 --75.8828 --75.8922 --75.8859 --75.8938 --75.8844 --75.8875 --75.8812 --75.8719 --75.8922 --75.8891 --75.8953 --75.8891 --75.8969 --75.8766 --75.8828 --75.8781 --75.8781 --75.8797 --75.8953 --75.8828 --75.8859 --75.8922 --75.8656 --75.8672 --75.8859 --75.8922 --75.8781 --75.8766 --75.8859 --75.8859 --75.8906 --75.8844 --75.8844 --75.8781 --75.8891 --75.8812 --75.8766 --75.8688 --75.8719 --75.8812 --75.8719 --75.8766 --75.8875 --75.8953 --75.8906 --75.8766 --75.8922 --75.8922 --75.8906 --75.8906 --75.8906 --75.8984 --75.8906 --75.8984 --75.9062 --75.9047 --75.8922 --75.8906 --75.8844 --75.8891 --75.9 --75.8969 --75.8906 --75.8891 --75.8812 --75.8812 --75.8891 --75.8672 --75.8844 --75.8797 --75.8781 --75.8938 --75.8828 --75.8844 --75.8891 --75.8922 --75.8766 --75.8797 --75.8812 --75.8828 --75.8922 --75.8859 --75.9016 --75.8969 --75.8922 --75.8906 --75.8828 --75.8969 --75.8875 --75.8891 --75.8734 --75.9031 --75.8984 --75.8906 --75.8984 --75.8922 --75.8844 --75.8891 --75.8875 --75.8922 --75.8859 --75.8922 --75.8734 --75.8797 --75.8828 --75.8688 --75.8844 --75.8766 --75.8891 --75.8859 --75.8688 --75.875 --75.8922 --75.8797 --75.8797 --75.8906 --75.8719 --75.8812 --75.8875 --75.8734 --75.8812 --75.8953 --75.8906 --75.8859 --75.8797 --75.9031 --75.8984 --75.8922 --75.8828 --75.8703 --75.8969 --75.8891 --75.8906 --75.8953 --75.8812 --75.8922 --75.9031 --75.8938 --75.9078 --75.8844 --75.8766 --75.8844 --75.8828 --75.8969 --75.8953 --75.8844 --75.8859 --75.8984 --75.9062 --75.8766 --75.9 --75.9016 --75.8797 --75.8922 --75.8828 --75.8891 --75.8703 --75.8891 --75.8891 --75.8938 --75.8969 --75.8906 --75.8891 --75.8953 --75.8891 --75.8922 --75.8969 --75.8953 --75.8953 --75.9031 --75.8984 --75.8953 --75.8984 --75.9 --75.8891 --75.8875 --75.8875 --75.8922 --75.8859 --75.8766 --75.8922 --75.8859 --75.8984 --75.8906 --75.8875 --75.8875 --75.8922 --75.8875 --75.8828 --75.8875 --75.8875 --75.8938 --75.8953 --75.8797 --75.8906 --75.9 --75.8906 --75.8953 --75.8984 --75.8859 --75.8906 --75.9078 --75.8922 --75.8906 --75.8922 --75.8797 --75.8953 --75.8812 --75.8859 --75.8938 --75.8953 --75.9062 --75.8953 --75.9 --75.8844 --75.8875 --75.9062 --75.9031 --75.8812 --75.8953 --75.9 --75.8891 --75.8984 --75.8969 --75.8891 --75.8969 --75.8875 --75.8891 --75.8969 --75.8906 --75.8953 --75.8938 --75.8953 --75.8812 --75.9031 --75.8875 --75.8844 --75.8938 --75.8906 --75.9047 --75.8906 --75.8812 --75.8922 --75.8891 --75.8938 --75.8938 --75.8984 --75.8906 --75.8922 --75.8969 --75.9 --75.8906 --75.9 --75.8969 --75.9016 --75.8969 --75.8844 --75.8969 --75.8922 --75.8953 --75.8891 --75.9078 --75.8938 --75.8922 --75.9031 --75.9047 --75.8984 --75.9047 --75.9062 --75.8953 --75.9047 --75.9031 --75.8938 --75.9031 --75.8859 --75.8891 --75.8891 --75.8859 --75.8984 --75.9016 --75.9062 --75.9047 --75.8969 --75.8812 --75.8953 --75.8984 --75.8844 --75.8922 --75.8875 --75.9 --75.8922 --75.8891 --75.8953 --75.8984 --75.9031 --75.8984 --75.9 --75.8953 --75.8859 --75.9062 --75.8922 --75.8922 --75.8953 --75.9016 --75.9031 --75.8938 --75.8891 --75.9047 --75.8844 --75.8969 --75.8969 --75.9062 --75.9047 --75.9047 --75.8984 --75.9031 --75.8891 --75.9062 --75.9047 --75.9 --75.8875 --75.8938 --75.9016 --75.8984 --75.8969 --75.8891 --75.9 --75.8859 --75.8906 --75.8922 --75.8891 --75.8922 --75.8922 --75.8812 --75.8906 --75.8828 --75.8859 --75.8953 --75.8984 --75.8984 --75.8938 --75.8938 --75.8875 --75.9016 --75.8891 --75.8844 --75.8969 --75.9031 --75.9047 --75.8906 --75.8984 --75.8922 --75.8969 --75.8891 --75.9031 --75.8984 --75.8812 --75.8875 --75.8984 --75.8875 --75.8906 --75.8875 --75.8938 --75.8891 --75.8891 --75.8906 --75.8859 --75.8859 --75.9062 --75.8906 --75.8828 --75.8891 --75.8953 --75.8922 --75.9016 --75.8891 --75.8969 --75.8906 --75.8922 --75.875 --75.8938 --75.8938 --75.8875 --75.8859 --75.8969 --75.9 --75.8891 --75.8984 --75.8891 --75.8938 --75.8891 --75.8891 --75.8953 --75.8859 --75.8859 --75.8828 --75.8969 --75.8812 --75.9 --75.8891 --75.8766 --75.8859 --75.8906 --75.9016 --75.8906 --75.8844 --75.8906 --75.8844 --75.8953 --75.8844 --75.8859 --75.8953 --75.8953 --75.8922 --75.8984 --75.8875 --75.8938 --75.8922 --75.8766 --75.8891 --75.8938 --75.8781 --75.8859 --75.8828 --75.8938 --75.8859 --75.8891 --75.8938 --75.9031 --75.8859 --75.8812 --75.8844 --75.8875 --75.8859 --75.8812 --75.8812 --75.8766 --75.8875 --75.8781 --75.8938 --75.8938 --75.8844 --75.8875 --75.8984 --75.8984 --75.8922 --75.8875 --75.8812 --75.8797 --75.8859 --75.8859 --75.8844 --75.8828 --75.8922 --75.8891 --75.8906 --75.8938 --75.8891 --75.8828 --75.8844 --75.8859 --75.8828 --75.8766 --75.8984 --75.8875 --75.8828 --75.8969 --75.8953 --75.8922 --75.8969 --75.8969 --75.8906 --75.8875 --75.8734 --75.8797 --75.8891 --75.8906 --75.8797 --75.8906 --75.8844 --75.8828 --75.8781 --75.9 --75.8797 --75.8828 --75.8781 --75.8844 --75.8781 --75.8859 --75.8766 --75.8875 --75.8781 --75.8797 --75.8766 --75.8922 --75.8969 --75.8828 --75.8719 --75.8938 --75.8812 --75.8891 --75.8922 --75.8766 --75.8953 --75.8844 --75.8984 --75.8953 --75.8953 --75.8953 --75.8906 --75.9016 --75.8797 --75.8812 --75.8906 --75.8969 --75.8812 --75.8891 --75.8938 --75.8922 --75.8922 --75.8953 --75.9047 --75.8922 --75.8922 --75.8719 --75.8875 --75.8922 --75.8891 --75.8875 --75.9016 --75.8953 --75.8938 --75.8891 --75.9141 --75.9 --75.9031 --75.8984 --75.9141 --75.8938 --75.8938 --75.9016 --75.9 --75.8953 --75.9016 --75.8891 --75.8875 --75.9047 --75.8906 --75.9062 --75.8969 --75.8891 --75.9 --75.8891 --75.8953 --75.8891 --75.8703 --75.8906 --75.8922 --75.8812 --75.8875 --75.8875 --75.8953 --75.8984 --75.8906 --75.8891 --75.8938 --75.8859 --75.8953 --75.9016 --75.9016 --75.8922 --75.8984 --75.8891 --75.9 --75.9 --75.8953 --75.8922 --75.8969 --75.8984 --75.8859 --75.8922 --75.8984 --75.8984 --75.8797 --75.8812 --75.9 --75.8938 --75.8953 --75.8859 --75.8844 --75.8906 --75.8906 --75.8797 --75.8844 --75.8953 --75.8844 --75.8875 --75.8891 --75.8891 --75.8906 --75.8953 --75.8875 --75.9062 --75.9047 --75.9016 --75.8938 --75.9 --75.8969 --75.8906 --75.8938 --75.8812 --75.9 --75.8875 --75.8969 --75.8891 --75.8875 --75.8922 --75.9 --75.8922 --75.8938 --75.8828 --75.8953 --75.8953 --75.8875 --75.9 --75.9062 --75.9016 --75.9078 --75.9 --75.8891 --75.9 --75.8953 --75.9078 --75.8969 --75.9031 --75.9016 --75.9 --75.8859 --75.8844 --75.9031 --75.9 --75.8938 --75.8922 --75.9109 --75.8938 --75.8844 --75.9141 --75.8984 --75.8953 --75.9 --75.9031 --75.8984 --75.8984 --75.9047 --75.9016 --75.9078 --75.9047 --75.9062 --75.9078 --75.9172 --75.9047 --75.9078 --75.8812 --75.8922 --75.9047 --75.9078 --75.8984 --75.8922 --75.9031 --75.9109 --75.9031 --75.9047 --75.9016 --75.8953 --75.9062 --75.8969 --75.8969 --75.8953 --75.9 --75.8984 --75.8969 --75.9141 --75.9125 --75.9031 --75.925 --75.9 --75.8984 --75.9047 --75.9031 --75.9016 --75.9078 --75.9062 --75.9125 --75.9094 --75.9094 --75.9047 --75.9016 --75.9187 --75.9109 --75.9094 --75.8984 --75.9016 --75.9094 --75.9 --75.9094 --75.9016 --75.8953 --75.8953 --75.8891 --75.8922 --75.8969 --75.9125 --75.8969 --75.9094 --75.9031 --75.9141 --75.9016 --75.8984 --75.8953 --75.9031 --75.8922 --75.9 --75.8891 --75.9062 --75.8844 --75.8875 --75.8969 --75.8875 --75.8875 --75.8984 --75.8891 --75.8969 --75.8969 --75.9031 --75.8875 --75.8859 --75.8891 --75.8984 --75.9016 --75.8906 --75.8859 --75.8859 --75.8938 --75.8859 --75.8969 --75.8938 --75.8906 --75.8969 --75.8969 --75.8781 --75.9016 --75.9078 --75.8859 --75.9 --75.8969 --75.8891 --75.8891 --75.8922 --75.8891 --75.8859 --75.8969 --75.8938 --75.8906 --75.9 --75.9016 --75.8953 --75.9 --75.8984 --75.8922 --75.8953 --75.8906 --75.9 --75.8859 --75.8922 --75.8953 --75.8938 --75.9016 --75.8938 --75.8828 --75.8969 --75.9062 --75.8969 --75.8938 --75.8938 --75.8844 --75.9094 --75.8984 --75.8953 --75.8984 --75.9 --75.9031 --75.9062 --75.8812 --75.8906 --75.8969 --75.9094 --75.8906 --75.8922 --75.8969 --75.9031 --75.9016 --75.9031 --75.8953 --75.8859 --75.9 --75.8953 --75.8969 --75.8906 --75.9078 --75.9 --75.9031 --75.8953 --75.8922 --75.9016 --75.9109 --75.9031 --75.9 --75.9062 --75.8953 --75.8953 --75.9078 --75.8969 --75.8953 --75.8969 --75.8812 --75.8922 --75.8875 --75.8938 --75.8953 --75.8969 --75.8938 --75.8906 --75.9125 --75.8969 --75.8844 --75.8859 --75.8906 --75.9062 --75.8984 --75.9047 --75.8938 --75.8969 --75.8953 --75.8938 --75.8938 --75.9 --75.875 --75.9016 --75.8938 --75.8828 --75.8844 --75.8891 --75.8906 --75.8953 --75.8859 --75.8984 --75.8797 --75.8969 --75.8875 --75.8875 --75.8797 --75.8859 --75.8906 --75.8828 --75.8828 --75.8781 --75.9016 --75.8797 --75.8891 --75.8797 --75.8922 --75.8828 --75.8891 --75.8969 --75.8828 --75.8938 --75.8734 --75.8891 --75.8844 --75.875 --75.8906 --75.875 --75.8859 --75.8859 --75.8828 --75.8812 --75.9 --75.8844 --75.8906 --75.8969 --75.875 --75.8844 --75.8969 --75.8781 --75.9094 --75.8969 --75.8922 --75.8844 --75.8969 --75.9 --75.9062 --75.8969 --75.8891 --75.9047 --75.8891 --75.8828 --75.9109 --75.8938 --75.8891 --75.8969 --75.8938 --75.8812 --75.8875 --75.8812 --75.8938 --75.8828 --75.9016 --75.8844 --75.8984 --75.8922 --75.8844 --75.8938 --75.8938 --75.8938 --75.8844 --75.8922 --75.8844 --75.9016 --75.8953 --75.8906 --75.8953 --75.8953 --75.8984 --75.8812 --75.8969 --75.8906 --75.8844 --75.8844 --75.8812 --75.8797 --75.8984 --75.8938 --75.8984 --75.8984 --75.9266 --75.9 --75.8906 --75.9062 --75.8953 --75.9062 --75.9047 --75.8812 --75.8875 --75.8969 --75.8844 --75.8906 --75.8969 --75.9031 --75.8906 --75.8891 --75.8812 --75.8969 --75.8969 --75.8859 --75.8797 --75.8828 --75.8953 --75.9047 --75.9141 --75.8969 --75.8906 --75.8844 --75.9 --75.9031 --75.9 --75.8953 --75.9 --75.8844 --75.8953 --75.9031 --75.9062 --75.8781 --75.8844 --75.9031 --75.8953 --75.9062 --75.8969 --75.8953 --75.9062 --75.9047 --75.9031 --75.8953 --75.9047 --75.8938 --75.9 --75.8922 --75.8969 --75.8844 --75.8938 --75.8922 --75.8844 --75.8828 --75.8859 --75.8906 --75.8875 --75.8953 --75.9016 --75.9172 --75.8906 --75.8969 --75.8844 --75.8969 --75.8891 --75.8891 --75.8922 --75.9 --75.9016 --75.9109 --75.8922 --75.8984 --75.9125 --75.9047 --75.9078 --75.8953 --75.9 --75.9047 --75.9047 --75.9 --75.8984 --75.9078 --75.9031 --75.9016 --75.9031 --75.9031 --75.9 --75.9031 --75.9187 --75.8859 --75.8906 --75.9 --75.8906 --75.9125 --75.8859 --75.8969 --75.9109 --75.8938 --75.9078 --75.9 --75.9016 --75.8906 --75.8953 --75.9047 --75.8734 --75.9078 --75.8844 --75.9078 --75.9 --75.9187 --75.9031 --75.9156 --75.9062 --75.8922 --75.9047 --75.9016 --75.9094 --75.9 --75.9031 --75.9062 --75.9109 --75.8922 --75.9031 --75.8984 --75.8922 --75.8891 --75.8906 --75.9047 --75.8891 --75.8953 --75.8922 --75.8953 --75.9016 --75.8969 --75.8938 --75.8984 --75.8922 --75.8984 --75.9078 --75.8906 --75.8953 --75.9031 --75.9016 --75.8875 --75.8938 --75.875 --75.8969 --75.8922 --75.8828 --75.8859 --75.8875 --75.875 --75.8922 --75.8906 --75.8734 --75.8875 --75.8797 --75.8859 --75.8781 --75.8891 --75.8859 --75.875 --75.8891 --75.8906 --75.8906 --75.8859 --75.8875 --75.8984 --75.8859 --75.8875 --75.8859 --75.875 --75.8766 --75.8797 --75.8984 --75.8812 --75.8938 --75.8922 --75.8797 --75.8984 --75.8859 --75.8781 --75.8906 --75.8828 --75.8875 --75.8953 --75.875 --75.8891 --75.8953 --75.9016 --75.8859 --75.9016 --75.8828 --75.8859 --75.8719 --75.8891 --75.8891 --75.8859 --75.8875 --75.8812 --75.8734 --75.8906 --75.8875 --75.8844 --75.9062 --75.8797 --75.8891 --75.8938 --75.8953 --75.9031 --75.8906 --75.9016 --75.8844 --75.8891 --75.9016 --75.8875 --75.9047 --75.8891 --75.8922 --75.8844 --75.8812 --75.8984 --75.8844 --75.8781 --75.8875 --75.8828 --75.8859 --75.8938 --75.8859 --75.8781 --75.8906 --75.9031 --75.8828 --75.8891 --75.8891 --75.8859 --75.8828 --75.8953 --75.9 --75.9031 --75.8891 --75.8766 --75.8938 --75.8875 --75.9016 --75.8906 --75.8781 --75.8891 --75.9016 --75.8953 --75.9 --75.8844 --75.8891 --75.8875 --75.8984 --75.8906 --75.9031 --75.8984 --75.8953 --75.8953 --75.9 --75.8875 --75.9031 --75.8906 --75.8875 --75.8875 --75.8969 --75.8891 --75.8922 --75.9062 --75.8734 --75.9 --75.9125 --75.8969 --75.9141 --75.8875 --75.8938 --75.8938 --75.9031 --75.8969 --75.9 --75.8969 --75.8984 --75.8922 --75.8969 --75.8906 --75.9094 --75.9125 --75.9047 --75.8922 --75.9094 --75.9125 --75.9016 --75.8984 --75.9031 --75.8969 --75.9109 --75.8906 --75.9062 --75.9016 --75.9 --75.9 --75.8969 --75.9 --75.9 --75.8891 --75.8969 --75.8906 --75.8859 --75.8969 --75.9094 --75.8953 --75.8969 --75.8891 --75.8922 --75.8859 --75.8906 --75.9 --75.8938 --75.8953 --75.8984 --75.9047 --75.8906 --75.8812 --75.9031 --75.9 --75.9016 --75.8969 --75.8984 --75.8984 --75.8844 --75.8766 --75.9016 --75.8953 --75.9031 --75.8859 --75.9031 --75.8984 --75.8953 --75.8969 --75.8969 --75.8891 --75.8859 --75.8953 --75.8906 --75.8984 --75.8875 --75.8828 --75.8875 --75.8922 --75.8844 --75.9047 --75.8891 --75.8859 --75.9 --75.8969 --75.8812 --75.8953 --75.8984 --75.8906 --75.9062 --75.8859 --75.8891 --75.9094 --75.8875 --75.8938 --75.8875 --75.8859 --75.8891 --75.8938 --75.8859 --75.8906 --75.8922 --75.8688 --75.8844 --75.8844 --75.8891 --75.8766 --75.8875 --75.8844 --75.8781 --75.8859 --75.8906 --75.9047 --75.8922 --75.8766 --75.8797 --75.8812 --75.8906 --75.8891 --75.9 --75.8812 --75.8953 --75.8828 --75.875 --75.8859 --75.8953 --75.8906 --75.8984 --75.8859 --75.8828 --75.9031 --75.8906 --75.8953 --75.9031 --75.8891 --75.8922 --75.8828 --75.8922 --75.8984 --75.8891 --75.9 --75.8828 --75.8891 --75.8781 --75.8906 --75.9016 --75.8922 --75.8953 --75.9047 --75.9047 --75.8984 --75.8984 --75.9031 --75.9016 --75.9016 --75.8891 --75.8875 --75.9109 --75.8859 --75.8906 --75.8812 --75.8844 --75.9031 --75.8906 --75.8938 --75.9016 --75.8984 --75.8938 --75.8984 --75.9031 --75.8922 --75.9031 --75.8922 --75.8922 --75.9031 --75.8922 --75.9031 --75.9016 --75.9062 --75.8938 --75.9109 --75.9 --75.9 --75.9016 --75.8969 --75.9016 --75.8953 --75.8812 --75.8828 --75.8938 --75.8938 --75.8984 --75.8969 --75.8906 --75.9 --75.9 --75.9031 --75.9031 --75.8984 --75.9 --75.9062 --75.8969 --75.8891 --75.8922 --75.8875 --75.8984 --75.9031 --75.9047 --75.8953 --75.8891 --75.8828 --75.9016 --75.8891 --75.8984 --75.9 --75.8875 --75.8938 --75.8875 --75.8859 --75.8859 --75.8875 --75.9 --75.9 --75.8891 --75.8984 --75.8922 --75.8875 --75.8953 --75.8984 --75.8891 --75.8953 --75.8906 --75.9047 --75.8906 --75.8906 --75.8969 --75.875 --75.8969 --75.8984 --75.8797 --75.8906 --75.8922 --75.9016 --75.8859 --75.8938 --75.8875 --75.8875 --75.8953 --75.9 --75.9031 --75.8906 --75.8922 --75.8859 --75.8875 --75.8797 --75.8969 --75.8938 --75.8938 --75.8891 --75.8984 --75.9062 --75.8859 --75.8812 --75.8984 --75.8828 --75.8969 --75.8875 --75.8906 --75.9031 --75.8953 --75.9016 --75.9016 --75.8969 --75.9125 --75.9031 --75.8938 --75.9109 --75.8906 --75.8938 --75.9109 --75.9062 --75.9 --75.8969 --75.8984 --75.9062 --75.9125 --75.9047 --75.8984 --75.8922 --75.9062 --75.9078 --75.9016 --75.9016 --75.9125 --75.9094 --75.9062 --75.9031 --75.9047 --75.9 --75.8969 --75.8828 --75.8984 --75.8875 --75.9109 --75.8984 --75.8891 --75.9016 --75.8969 --75.9047 --75.8891 --75.9062 --75.9047 --75.9016 --75.8922 --75.9 --75.8969 --75.9062 --75.9078 --75.9016 --75.8953 --75.8922 --75.9047 --75.9141 --75.9 --75.8891 --75.9062 --75.9078 --75.9 --75.9047 --75.9109 --75.9062 --75.9078 --75.8984 --75.9109 --75.9094 --75.8984 --75.8938 --75.9047 --75.9047 --75.9047 --75.8953 --75.9 --75.8969 --75.8922 --75.9016 --75.9016 --75.9031 --75.9 --75.9 --75.8969 --75.8984 --75.9016 --75.8969 --75.9047 --75.8984 --75.8875 --75.9078 --75.8969 --75.9031 --75.9062 --75.9109 --75.8891 --75.9078 --75.9016 --75.9031 --75.8984 --75.8938 --75.9109 --75.8953 --75.9062 --75.9109 --75.9016 --75.8953 --75.9078 --75.9016 --75.8984 --75.9031 --75.9156 --75.9016 --75.9109 --75.9125 --75.8984 --75.9141 --75.9109 --75.9062 --75.9156 --75.9172 --75.9016 --75.9016 --75.9047 --75.9109 --75.8938 --75.8766 --75.9031 --75.8953 --75.8875 --75.9078 --75.8828 --75.9047 --75.8844 --75.9031 --75.8891 --75.8969 --75.8922 --75.8906 --75.8984 --75.9031 --75.9047 --75.8984 --75.8938 --75.9062 --75.9109 --75.9078 --75.9141 --75.9156 --75.9062 --75.9062 --75.9078 --75.9156 --75.9 --75.9109 --75.9062 --75.9 --75.8984 --75.9125 --75.9062 --75.9109 --75.9 --75.9 --75.9109 --75.8922 --75.9 --75.8984 --75.9078 --75.9078 --75.8906 --75.9109 --75.8984 --75.9109 --75.9141 --75.9047 --75.8984 --75.8938 --75.8984 --75.8906 --75.9031 --75.9094 --75.8984 --75.8984 --75.9016 --75.9094 --75.9062 --75.8891 --75.9062 --75.8984 --75.9109 --75.8984 --75.9078 --75.9016 --75.8906 --75.9062 --75.9062 --75.9 --75.9156 --75.8891 --75.8828 --75.9078 --75.8906 --75.8953 --75.8984 --75.9016 --75.9 --75.9047 --75.9125 --75.9109 --75.9016 --75.9 --75.9016 --75.9047 --75.9094 --75.9078 --75.9062 --75.9094 --75.8969 --75.9016 --75.9109 --75.9219 --75.9016 --75.9109 --75.9094 --75.9141 --75.9109 --75.9 --75.9109 --75.9219 --75.8984 --75.8969 --75.8969 --75.8844 --75.8938 --75.8953 --75.9047 --75.9062 --75.9031 --75.8875 --75.8984 --75.9 --75.9031 --75.8969 --75.8984 --75.8734 --75.8859 --75.9031 --75.9062 --75.8922 --75.9 --75.9 --75.8875 --75.8891 --75.8922 --75.8875 --75.8906 --75.9047 --75.8891 --75.8844 --75.9016 --75.8938 --75.8875 --75.8953 --75.8922 --75.8922 --75.8984 --75.9062 --75.8859 --75.8953 --75.8953 --75.8953 --75.8922 --75.8906 --75.8984 --75.8891 --75.8938 --75.8922 --75.8969 --75.8922 --75.8891 --75.9047 --75.8844 --75.8953 --75.9062 --75.8844 --75.9 --75.8938 --75.8906 --75.9078 --75.8828 --75.8938 --75.8938 --75.9016 --75.8906 --75.8938 --75.8844 --75.9016 --75.8969 --75.8859 --75.8953 --75.8953 --75.8938 --75.9125 --75.8922 --75.9062 --75.8922 --75.8984 --75.8812 --75.8938 --75.8891 --75.9109 --75.8844 --75.9047 --75.8906 --75.9016 --75.8891 --75.8922 --75.8859 --75.9 --75.8938 --75.8906 --75.9016 --75.9016 --75.9016 --75.9094 --75.8984 --75.9016 --75.8922 --75.8938 --75.9031 --75.9109 --75.9125 --75.9031 --75.9 --75.9062 --75.9078 --75.9172 --75.9 --75.9047 --75.9078 --75.9047 --75.9047 --75.9141 --75.9062 --75.9031 --75.9109 --75.8922 --75.8906 --75.9078 --75.9047 --75.9219 --75.9109 --75.8953 --75.8984 --75.8969 --75.8953 --75.9047 --75.9016 --75.9 --75.9016 --75.9047 --75.9078 --75.9 --75.9141 --75.9109 --75.8984 --75.9031 --75.9031 --75.9031 --75.9094 --75.8984 --75.9187 --75.9125 --75.9172 --75.9062 --75.9234 --75.9125 --75.9156 --75.9094 --75.9187 --75.9078 --75.9062 --75.9094 --75.9203 --75.9156 --75.9234 --75.9047 --75.9031 --75.9219 --75.9016 --75.9172 --75.9156 --75.9203 --75.9187 --75.9078 --75.9094 --75.9141 --75.9031 --75.9172 --75.9094 --75.9141 --75.9203 --75.9125 --75.9125 --75.9156 --75.9109 --75.9156 --75.9109 --75.9031 --75.9031 --75.9203 --75.9125 --75.9141 --75.8953 --75.8953 --75.9078 --75.8938 --75.8953 --75.9047 --75.9125 --75.9047 --75.8938 --75.8953 --75.9016 --75.9 --75.8922 --75.9062 --75.9047 --75.8938 --75.8969 --75.9125 --75.9062 --75.9141 --75.9094 --75.9156 --75.9016 --75.9156 --75.9203 --75.9062 --75.9078 --75.9094 --75.9016 --75.9125 --75.9031 --75.8953 --75.9 --75.9078 --75.8969 --75.8984 --75.8938 --75.8969 --75.8969 --75.8922 --75.9016 --75.8969 --75.9141 --75.8875 --75.9156 --75.9156 --75.8984 --75.9016 --75.9062 --75.9016 --75.8984 --75.9 --75.9094 --75.8969 --75.9062 --75.9 --75.8891 --75.9156 --75.8953 --75.9016 --75.9141 --75.9062 --75.9062 --75.9031 --75.9109 --75.9125 --75.9109 --75.9 --75.9031 --75.9078 --75.8984 --75.9125 --75.9031 --75.9203 --75.9094 --75.9047 --75.9016 --75.8844 --75.9109 --75.8844 --75.9125 --75.9109 --75.8938 --75.8984 --75.8938 --75.9031 --75.9203 --75.9 --75.9078 --75.9047 --75.9078 --75.8953 --75.9219 --75.9 --75.9156 --75.9047 --75.9 --75.8953 --75.8984 --75.8984 --75.9078 --75.9094 --75.9 --75.8984 --75.8922 --75.8859 --75.8969 --75.8938 --75.9 --75.9203 --75.9078 --75.9 --75.9047 --75.9094 --75.9125 --75.9062 --75.9125 --75.9219 --75.9047 --75.9109 --75.9203 --75.9141 --75.9203 --75.9125 --75.9141 --75.9234 --75.9125 --75.9031 --75.9016 --75.8922 --75.9125 --75.9141 --75.9047 --75.8922 --75.9203 --75.9109 --75.9141 --75.9094 --75.8953 --75.9109 --75.8984 --75.9281 --75.9109 --75.9016 --75.9078 --75.9016 --75.8891 --75.9219 --75.9109 --75.8969 --75.9062 --75.9141 --75.9094 --75.9125 --75.9156 --75.9016 --75.9219 --75.9109 --75.9156 --75.9203 --75.9016 --75.9016 --75.9094 --75.9156 --75.9047 --75.8969 --75.9031 --75.9187 --75.9156 --75.9141 --75.9156 --75.9078 --75.9047 --75.9187 --75.9125 --75.9156 --75.9062 --75.9141 --75.9172 --75.9203 --75.9078 --75.9203 --75.9125 --75.9125 --75.9172 --75.9078 --75.9125 --75.9031 --75.9078 --75.9156 --75.8984 --75.9203 --75.9094 --75.9172 --75.9141 --75.9219 --75.9109 --75.9172 --75.9141 --75.9109 --75.9203 --75.9125 --75.9172 --75.9172 --75.9125 --75.9156 --75.9094 --75.9156 --75.9172 --75.9141 --75.9187 --75.9125 --75.9109 --75.9172 --75.9219 --75.9234 --75.9187 --75.9187 --75.9234 --75.9219 --75.9266 --75.9141 --75.9187 --75.9187 --75.9109 --75.9266 --75.9297 --75.9187 --75.9187 --75.9125 --75.9234 --75.9234 --75.9219 --75.9141 --75.9125 --75.9 --75.9297 --75.9078 --75.9187 --75.9234 --75.9125 --75.9187 --75.9203 --75.9141 --75.9172 --75.9141 --75.9109 --75.8938 --75.9109 --75.9109 --75.9125 --75.8984 --75.9016 --75.9172 --75.9141 --75.9094 --75.9125 --75.9078 --75.9203 --75.9062 --75.9109 --75.9078 --75.9125 --75.9016 --75.9156 --75.9187 --75.9156 --75.9016 --75.9125 --75.9047 --75.9047 --75.9047 --75.9156 --75.9078 --75.9078 --75.9266 --75.9031 --75.9016 --75.9062 --75.9156 --75.9156 --75.9031 --75.9156 --75.9 --75.9062 --75.9016 --75.9156 --75.9094 --75.9031 --75.9156 --75.9187 --75.9109 --75.9094 --75.9109 --75.9109 --75.9109 --75.9328 --75.9031 --75.9187 --75.9047 --75.9047 --75.9047 --75.8891 --75.9 --75.9078 --75.9125 --75.8891 --75.8922 --75.9016 --75.9 --75.8922 --75.8953 --75.8969 --75.9125 --75.9 --75.9094 --75.9094 --75.9062 --75.9078 --75.9187 --75.9047 --75.9094 --75.9109 --75.9125 --75.9141 --75.9016 --75.9047 --75.9109 --75.9031 --75.8984 --75.9203 --75.9031 --75.9203 --75.9141 --75.9031 --75.9062 --75.9297 --75.9094 --75.9297 --75.9016 --75.9078 --75.9062 --75.9156 --75.9062 --75.9156 --75.9141 --75.9141 --75.9078 --75.8984 --75.9047 --75.8953 --75.8984 --75.9 --75.9141 --75.9125 --75.8922 --75.9109 --75.8969 --75.9125 --75.8922 --75.9 --75.9125 --75.9047 --75.9031 --75.9031 --75.9047 --75.9141 --75.9078 --75.9094 --75.9047 --75.9109 --75.9125 --75.9062 --75.9047 --75.9094 --75.9094 --75.9047 --75.8953 --75.9094 --75.9094 --75.9078 --75.9281 --75.9016 --75.9141 --75.9187 --75.9094 --75.9078 --75.9062 --75.8969 --75.9062 --75.9078 --75.9219 --75.9109 --75.9047 --75.9187 --75.9156 --75.8938 --75.9109 --75.9062 --75.9078 --75.9078 --75.8969 --75.8984 --75.9031 --75.9 --75.8969 --75.9047 --75.9094 --75.8906 --75.9016 --75.9078 --75.8984 --75.8953 --75.9 --75.9156 --75.9078 --75.8969 --75.9031 --75.9156 --75.9094 --75.9062 --75.8938 --75.9156 --75.8984 --75.8984 --75.9047 --75.8891 --75.9 --75.8938 --75.8906 --75.9031 --75.8922 --75.9 --75.8922 --75.9078 --75.8969 --75.9109 --75.8875 --75.8922 --75.8984 --75.9047 --75.9047 --75.8922 --75.8969 --75.9094 --75.9156 --75.8938 --75.9078 --75.8953 --75.8891 --75.8906 --75.8797 --75.8906 --75.8844 --75.8859 --75.9031 --75.8859 --75.8906 --75.8906 --75.9078 --75.8969 --75.8984 --75.8906 --75.8953 --75.8781 --75.8984 --75.8906 --75.8969 --75.8969 --75.8875 --75.9047 --75.9156 --75.9016 --75.8953 --75.8953 --75.9078 --75.9062 --75.8969 --75.8969 --75.9016 --75.8953 --75.8984 --75.9 --75.8906 --75.8938 --75.8953 --75.8969 --75.8984 --75.8984 --75.8906 --75.9078 --75.9031 --75.8938 --75.8906 --75.8922 --75.8938 --75.8922 --75.8984 --75.8953 --75.8969 --75.8922 --75.8891 --75.8844 --75.9 --75.8891 --75.8938 --75.8891 --75.8938 --75.9016 --75.9016 --75.8969 --75.9016 --75.8906 --75.8938 --75.8891 --75.9016 --75.9031 --75.9016 --75.8922 --75.8875 --75.9016 --75.8984 --75.8938 --75.8891 --75.9125 --75.8953 --75.8969 --75.8906 --75.8859 --75.8891 --75.8891 --75.8875 --75.8891 --75.8906 --75.8797 --75.8969 --75.8938 --75.8953 --75.8922 --75.8875 --75.8797 --75.8938 --75.9 --75.875 --75.8984 --75.8812 --75.8875 --75.8938 --75.8906 --75.8984 --75.8922 --75.9109 --75.8922 --75.8859 --75.8922 --75.9 --75.9031 --75.8984 --75.9031 --75.8953 --75.9047 --75.9 --75.8969 --75.9016 --75.8938 --75.9016 --75.8906 --75.9125 --75.8938 --75.9078 --75.8953 --75.9031 --75.8969 --75.8984 --75.8953 --75.9 --75.8969 --75.9094 --75.8859 --75.8891 --75.8922 --75.8938 --75.8984 --75.8969 --75.9 --75.8906 --75.9109 --75.8969 --75.9094 --75.8859 --75.8906 --75.8828 --75.9031 --75.8969 --75.8953 --75.9016 --75.9078 --75.9016 --75.9031 --75.8891 --75.9 --75.9125 --75.9078 --75.9016 --75.9 --75.9094 --75.9203 --75.8953 --75.8984 --75.8969 --75.9109 --75.9109 --75.8969 --75.8953 --75.9062 --75.8984 --75.8969 --75.9016 --75.8859 --75.9047 --75.8969 --75.8906 --75.8859 --75.8938 --75.8891 --75.8969 --75.8812 --75.8953 --75.9016 --75.9047 --75.9016 --75.9062 --75.9 --75.8984 --75.8984 --75.9016 --75.8734 --75.8984 --75.8953 --75.9078 --75.8828 --75.8953 --75.9016 --75.8906 --75.9047 --75.8891 --75.9016 --75.9016 --75.8828 --75.9031 --75.9031 --75.9 --75.8828 --75.8969 --75.9 --75.8938 --75.9031 --75.8984 --75.8922 --75.8828 --75.9062 --75.9047 --75.8922 --75.9047 --75.9016 --75.8984 --75.9172 --75.9016 --75.8953 --75.8969 --75.8938 --75.9 --75.8922 --75.8906 --75.8922 --75.8812 --75.8938 --75.8984 --75.8984 --75.8984 --75.8859 --75.8984 --75.8812 --75.9109 --75.9156 --75.9094 --75.8891 --75.9172 --75.9187 --75.9187 --75.9156 --75.9094 --75.8922 --75.9172 --75.9 --75.9156 --75.9172 --75.9062 --75.9078 --75.9031 --75.9203 --75.9062 --75.9078 --75.9094 --75.9031 --75.9156 --75.9016 --75.9031 --75.8969 --75.9031 --75.9 --75.8984 --75.8953 --75.9094 --75.9078 --75.9172 --75.9203 --75.9109 --75.9109 --75.9078 --75.9047 --75.9156 --75.9297 --75.9109 --75.9062 --75.9187 --75.9078 --75.9016 --75.9047 --75.9109 --75.9047 --75.9141 --75.9266 --75.8922 --75.9125 --75.9187 --75.9047 --75.9219 --75.9031 --75.9078 --75.9141 --75.9078 --75.9141 --75.9047 --75.9203 --75.9109 --75.9031 --75.8984 --75.9031 --75.9078 --75.9109 --75.9047 --75.9 --75.9109 --75.9109 --75.9156 --75.925 --75.9078 --75.9094 --75.9016 --75.8891 --75.9109 --75.9156 --75.9109 --75.9203 --75.9031 --75.9078 --75.9031 --75.8969 --75.9141 --75.9031 --75.9156 --75.9125 --75.9187 --75.9047 --75.8984 --75.9078 --75.9062 --75.9031 --75.925 --75.9125 --75.9094 --75.9062 --75.9109 --75.9094 --75.9109 --75.8984 --75.9031 --75.8953 --75.9109 --75.9141 --75.8938 --75.9016 --75.9094 --75.9078 --75.9109 --75.925 --75.9281 --75.8922 --75.9156 --75.9062 --75.9047 --75.9141 --75.9109 --75.9094 --75.8922 --75.9016 --75.9031 --75.9062 --75.9062 --75.9156 --75.9094 --75.9141 --75.9219 --75.9172 --75.9094 --75.9031 --75.9062 --75.9094 --75.9 --75.9062 --75.9125 --75.9109 --75.8938 --75.9109 --75.9047 --75.9078 --75.9141 --75.9 --75.9094 --75.9094 --75.9 --75.9141 --75.8969 --75.9094 --75.9 --75.9 --75.9203 --75.9016 --75.8953 --75.9016 --75.9141 --75.8969 --75.9031 --75.9047 --75.9219 --75.9078 --75.9125 --75.925 --75.9078 --75.9219 --75.9094 --75.9094 --75.925 --75.9109 --75.9187 --75.925 --75.9172 --75.9219 --75.9094 --75.9094 --75.9156 --75.9109 --75.9156 --75.9219 --75.9078 --75.9109 --75.9078 --75.8953 --75.9094 --75.9187 --75.9 --75.9047 --75.9125 --75.9141 --75.9187 --75.9141 --75.9109 --75.9062 --75.9094 --75.9234 --75.9125 --75.9187 --75.9078 --75.9094 --75.9078 --75.9141 --75.9156 --75.9187 --75.9141 --75.9234 --75.9062 --75.9141 --75.9156 --75.9203 --75.9172 --75.9187 --75.925 --75.9266 --75.9266 --75.9141 --75.9187 --75.9281 --75.9313 --75.9078 --75.9203 --75.9187 --75.9406 --75.9125 --75.9141 --75.9187 --75.9219 --75.9062 --75.9266 --75.9266 --75.9172 --75.9062 --75.9187 --75.9203 --75.9328 --75.9172 --75.9375 --75.9219 --75.9141 --75.9203 --75.9125 --75.9141 --75.9203 --75.9328 --75.9172 --75.9281 --75.9187 --75.9187 --75.9328 --75.9156 --75.9219 --75.9109 --75.9219 --75.9141 --75.9187 --75.9172 --75.9172 --75.9172 --75.9156 --75.9125 --75.9203 --75.9062 --75.9109 --75.9031 --75.9047 --75.9172 --75.9078 --75.9172 --75.9031 --75.9234 --75.9313 --75.9156 --75.9031 --75.9125 --75.9219 --75.9078 --75.9313 --75.9203 --75.9187 --75.9172 --75.9203 --75.925 --75.9094 --75.8984 --75.9156 --75.9219 --75.925 --75.9125 --75.9187 --75.9141 --75.9109 --75.9141 --75.9219 --75.9125 --75.9125 --75.9219 --75.9125 --75.925 --75.9281 --75.9328 --75.9094 --75.9266 --75.9234 --75.925 --75.9313 --75.9234 --75.9156 --75.9266 --75.9219 --75.9266 --75.9328 --75.9219 --75.9328 --75.9156 --75.9297 --75.9172 --75.9109 --75.9094 --75.9031 --75.9328 --75.9281 --75.925 --75.9062 --75.925 --75.9172 --75.9016 --75.9125 --75.9094 --75.9234 --75.9203 --75.9203 --75.9078 --75.925 --75.9281 --75.9266 --75.9344 --75.9156 --75.9344 --75.9359 --75.9219 --75.9156 --75.9203 --75.9109 --75.9203 --75.9297 --75.9203 --75.9187 --75.9281 --75.9375 --75.9203 --75.9328 --75.9266 --75.9375 --75.9172 --75.9344 --75.9187 --75.9266 --75.9266 --75.9406 --75.9313 --75.9313 --75.9172 --75.9281 --75.9156 --75.925 --75.9297 --75.9297 --75.9266 --75.9344 --75.9344 --75.9344 --75.9266 --75.9266 --75.9359 --75.9375 --75.9234 --75.9234 --75.9219 --75.9328 --75.9344 --75.9219 --75.9328 --75.9141 --75.9391 --75.9203 --75.9266 --75.9375 --75.9156 --75.9266 --75.9156 --75.9297 --75.925 --75.9141 --75.9219 --75.9359 --75.9266 --75.9203 --75.9125 --75.9266 --75.9375 --75.9234 --75.9203 --75.925 --75.925 --75.9266 --75.9266 --75.9297 --75.925 --75.9187 --75.9156 --75.9234 --75.9328 --75.9172 --75.925 --75.9062 --75.9297 --75.9328 --75.925 --75.9187 --75.9344 --75.9266 --75.9328 --75.9125 --75.9172 --75.9234 --75.9187 --75.925 --75.9266 --75.9297 --75.9141 --75.9172 --75.9344 --75.9219 --75.9328 --75.9219 --75.9125 --75.925 --75.9313 --75.9391 --75.9219 --75.9359 --75.9344 --75.9313 --75.9375 --75.9234 --75.9375 --75.9359 --75.9234 --75.9297 --75.9203 --75.9266 --75.9281 --75.9234 --75.9281 --75.9328 --75.9266 --75.9406 --75.9203 --75.9281 --75.9391 --75.9281 --75.9062 --75.925 --75.9109 --75.9156 --75.9094 --75.9313 --75.9187 --75.9328 --75.9375 --75.9234 --75.9141 --75.9141 --75.9234 --75.9313 --75.9281 --75.9297 --75.9375 --75.9313 --75.9297 --75.9297 --75.9141 --75.9344 --75.9313 --75.9422 --75.9344 --75.9328 --75.9313 --75.9359 --75.9187 --75.9172 --75.9266 --75.9156 --75.9234 --75.9313 --75.9281 --75.9281 --75.925 --75.9125 --75.9172 --75.9156 --75.925 --75.9141 --75.9203 --75.9187 --75.9203 --75.925 --75.9391 --75.9172 --75.9328 --75.9172 --75.9187 --75.925 --75.9266 --75.9203 --75.9313 --75.9281 --75.9281 --75.9344 --75.9281 --75.9172 --75.9266 --75.9234 --75.9234 --75.9203 --75.9172 --75.9297 --75.9281 --75.9203 --75.9328 --75.9344 --75.9187 --75.9359 --75.9234 --75.9156 --75.9266 --75.9156 --75.9313 --75.9344 --75.9203 --75.9266 --75.9172 --75.9313 --75.925 --75.925 --75.9266 --75.9281 --75.9203 --75.9141 --75.9281 --75.9219 --75.9172 --75.9203 --75.9172 --75.9219 --75.9141 --75.9219 --75.9172 --75.9187 --75.9344 --75.9156 --75.9187 --75.9234 --75.9281 --75.9234 --75.9344 --75.9344 --75.9344 --75.9297 --75.9203 --75.9422 --75.9313 --75.9234 --75.9344 --75.9313 --75.9313 --75.9484 --75.925 --75.9266 --75.9109 --75.9281 --75.9313 --75.9344 --75.925 --75.9375 --75.9281 --75.9328 --75.9234 --75.9219 --75.9375 --75.925 --75.9281 --75.9234 --75.9203 --75.9234 --75.9219 --75.9234 --75.9266 --75.9297 --75.9187 --75.9203 --75.9234 --75.9281 --75.9156 --75.9313 --75.9281 --75.9125 --75.9187 --75.925 --75.9297 --75.9219 --75.9359 --75.9297 --75.9187 --75.9187 --75.9266 --75.9313 --75.9219 --75.9359 --75.9266 --75.9297 --75.9172 --75.9375 --75.9328 --75.925 --75.925 --75.9156 --75.9219 --75.9281 --75.9156 --75.925 --75.9203 --75.9141 --75.9234 --75.9125 --75.925 --75.9266 --75.925 --75.925 --75.9219 --75.9266 --75.9266 --75.9156 --75.9281 --75.9297 --75.9391 --75.9313 --75.9062 --75.9266 --75.9109 --75.9125 --75.9141 --75.9281 --75.9219 --75.925 --75.9281 --75.9406 --75.9266 --75.9141 --75.9219 --75.9297 --75.9313 --75.9172 --75.9187 --75.9422 --75.9313 --75.9313 --75.9297 --75.9313 --75.9266 --75.9328 --75.9313 --75.9297 --75.9281 --75.9453 --75.9344 --75.9234 --75.9234 --75.9266 --75.9281 --75.9266 --75.9422 --75.9313 --75.9281 --75.9344 --75.9297 --75.9281 --75.9328 --75.9484 --75.9203 --75.9281 --75.9375 --75.9375 --75.9375 --75.9328 --75.9219 --75.9313 --75.9266 --75.9391 --75.9313 --75.9313 --75.9313 --75.9406 --75.9297 --75.9297 --75.9328 --75.9313 --75.9406 --75.9359 --75.9313 --75.9391 --75.9375 --75.9297 --75.9234 --75.9297 --75.9266 --75.925 --75.9281 --75.9266 --75.9391 --75.9297 --75.9313 --75.925 --75.925 --75.9266 --75.9313 --75.9234 --75.925 --75.9156 --75.9219 --75.9313 --75.9078 --75.9187 --75.9313 --75.9281 --75.9187 --75.9359 --75.9109 --75.9094 --75.9203 --75.9344 --75.9141 --75.9125 --75.9062 --75.925 --75.9203 --75.9156 --75.9172 --75.9203 --75.9156 --75.9109 --75.9219 --75.9187 --75.925 --75.9344 --75.925 --75.9125 --75.9313 --75.9344 --75.9219 --75.9359 --75.9266 --75.9187 --75.9156 --75.9297 --75.9187 --75.9297 --75.9156 --75.9375 --75.9344 --75.925 --75.9344 --75.9344 --75.9234 --75.9281 --75.9187 --75.925 --75.9406 --75.9328 --75.9141 --75.9328 --75.9266 --75.9203 --75.9281 --75.9328 --75.925 --75.9422 --75.925 --75.9437 --75.9281 --75.9344 --75.9297 --75.925 --75.9266 --75.9344 --75.9313 --75.9156 --75.9172 --75.9422 --75.9281 --75.9281 --75.9344 --75.9453 --75.9344 --75.9453 --75.9203 --75.9375 --75.9328 --75.9375 --75.9281 --75.9281 --75.9187 --75.9281 --75.9437 --75.9234 --75.9281 --75.9344 --75.9313 --75.9281 --75.9234 --75.9281 --75.925 --75.9281 --75.9187 --75.9453 --75.9187 --75.9156 --75.9187 --75.9187 --75.9187 --75.9266 --75.9078 --75.9141 --75.9234 --75.9313 --75.9266 --75.9359 --75.9219 --75.9172 --75.9203 --75.9172 --75.9172 --75.9156 --75.9172 --75.9219 --75.9031 --75.9203 --75.9156 --75.9266 --75.9187 --75.9141 --75.9094 --75.925 --75.9266 --75.9234 --75.9187 --75.925 --75.9125 --75.9187 --75.9281 --75.9125 --75.9266 --75.9109 --75.9203 --75.9203 --75.9219 --75.9359 --75.9344 --75.9234 --75.9156 --75.9266 --75.9078 --75.9172 --75.9313 --75.9203 --75.9203 --75.9313 --75.9125 --75.9047 --75.9172 --75.9156 --75.9141 --75.9141 --75.9078 --75.9109 --75.9094 --75.9187 --75.9125 --75.9141 --75.9062 --75.9172 --75.9156 --75.9187 --75.9141 --75.9141 --75.9141 --75.9266 --75.9141 --75.9281 --75.925 --75.9109 --75.9234 --75.925 --75.9156 --75.9141 --75.9234 --75.925 --75.9359 --75.9203 --75.9031 --75.9219 --75.9234 --75.9266 --75.9062 --75.9234 --75.9078 --75.9062 --75.9031 --75.8953 --75.8938 --75.9203 --75.9109 --75.8984 --75.9156 --75.9141 --75.8953 --75.9125 --75.9297 --75.9078 --75.9031 --75.9078 --75.9156 --75.9031 --75.9078 --75.9078 --75.9078 --75.9109 --75.9187 --75.9141 --75.9187 --75.9234 --75.9156 --75.9203 --75.9125 --75.9109 --75.9 --75.9125 --75.9094 --75.9125 --75.9156 --75.9219 --75.9094 --75.9313 --75.9109 --75.9406 --75.9187 --75.925 --75.9297 --75.9234 --75.9156 --75.9078 --75.9078 --75.9141 --75.9156 --75.9094 --75.9156 --75.9062 --75.9203 --75.9187 --75.9109 --75.9109 --75.9031 --75.9125 --75.9187 --75.9234 --75.9141 --75.9016 --75.9266 --75.9234 --75.9172 --75.9141 --75.9141 --75.9219 --75.9062 --75.9156 --75.9156 --75.9094 --75.9141 --75.9141 --75.925 --75.9094 --75.9219 --75.9219 --75.9234 --75.9141 --75.9078 --75.9219 --75.9156 --75.9172 --75.9187 --75.9156 --75.925 --75.9141 --75.9266 --75.9219 --75.925 --75.9281 --75.925 --75.9313 --75.9391 --75.9328 --75.9313 --75.9234 --75.925 --75.9281 --75.9281 --75.9344 --75.9297 --75.9219 --75.9391 --75.9203 --75.9187 --75.9344 --75.9141 --75.9313 --75.9297 --75.9297 --75.9328 --75.9234 --75.9219 --75.9266 --75.9078 --75.925 --75.9234 --75.9187 --75.9266 --75.925 --75.9359 --75.9281 --75.9203 --75.9187 --75.9203 --75.9156 --75.9203 --75.9109 --75.9062 --75.9266 --75.9125 --75.9172 --75.9266 --75.9 --75.9172 --75.9297 --75.9094 --75.9031 --75.9109 --75.9172 --75.9141 --75.9125 --75.9109 --75.9 --75.9109 --75.9031 --75.9109 --75.9047 --75.9094 --75.9078 --75.9219 --75.9172 --75.9062 --75.9266 --75.9156 --75.9203 --75.9156 --75.9141 --75.9281 --75.9234 --75.9187 --75.9203 --75.9219 --75.9016 --75.9141 --75.925 --75.9094 --75.9344 --75.9156 --75.9172 --75.9187 --75.9203 --75.9078 --75.9187 --75.9266 --75.9203 --75.9094 --75.9266 --75.9344 --75.9172 --75.9156 --75.9219 --75.9266 --75.9219 --75.925 --75.9234 --75.9141 --75.9219 --75.9281 --75.9297 --75.9297 --75.9359 --75.9297 --75.9313 --75.9297 --75.9266 --75.9344 --75.9219 --75.925 --75.9281 --75.9141 --75.9375 --75.9344 --75.9187 --75.9156 --75.9187 --75.925 --75.9203 --75.9219 --75.9172 --75.9172 --75.9281 --75.9266 --75.9172 --75.9266 --75.9141 --75.9281 --75.9234 --75.9344 --75.9172 --75.9297 --75.9172 --75.9297 --75.9172 --75.9234 --75.9234 --75.9203 --75.9266 --75.9125 --75.9125 --75.9281 --75.9156 --75.9172 --75.9156 --75.9266 --75.9125 --75.9266 --75.9266 --75.9125 --75.925 --75.9281 --75.9266 --75.9203 --75.9203 --75.9125 --75.925 --75.9016 --75.9172 --75.9266 --75.925 --75.9297 --75.9344 --75.9219 --75.925 --75.9109 --75.9078 --75.9313 --75.9172 --75.9125 --75.9078 --75.9156 --75.9203 --75.9062 --75.9172 --75.9172 --75.9141 --75.9156 --75.9109 --75.9125 --75.9047 --75.9125 --75.9031 --75.8969 --75.9078 --75.9016 --75.9094 --75.9094 --75.9062 --75.9062 --75.9141 --75.9094 --75.9062 --75.9156 --75.9031 --75.9172 --75.9094 --75.9031 --75.8969 --75.9078 --75.9141 --75.9125 --75.9031 --75.9031 --75.8969 --75.8922 --75.9141 --75.8953 --75.9062 --75.9234 --75.9172 --75.9187 --75.9094 --75.8922 --75.9156 --75.9 --75.9094 --75.9156 --75.9078 --75.9203 --75.9125 --75.9109 --75.9141 --75.9109 --75.9094 --75.9 --75.9125 --75.9187 --75.9172 --75.9172 --75.9281 --75.9078 --75.9062 --75.9125 --75.9094 --75.9094 --75.9203 --75.9156 --75.9203 --75.9219 --75.9172 --75.9297 --75.9297 --75.9187 --75.9219 --75.9078 --75.9 --75.9125 --75.9187 --75.9234 --75.9281 --75.9219 --75.9156 --75.9266 --75.9203 --75.8953 --75.925 --75.9094 --75.9234 --75.9187 --75.9219 --75.9156 --75.9109 --75.9125 --75.9156 --75.9078 --75.9219 --75.9203 --75.9094 --75.9125 --75.9156 --75.9109 --75.9234 --75.9281 --75.9281 --75.925 --75.9156 --75.9328 --75.9219 --75.9281 --75.9156 --75.9203 --75.9281 --75.9234 --75.9156 --75.9187 --75.9031 --75.9172 --75.9109 --75.9125 --75.9297 --75.9172 --75.9156 --75.9203 --75.9156 --75.9187 --75.9219 --75.9234 --75.9141 --75.9375 --75.9156 --75.9125 --75.9172 --75.9203 --75.9297 --75.925 --75.9297 --75.9281 --75.9172 --75.9078 --75.9125 --75.9156 --75.9094 --75.9109 --75.9203 --75.9109 --75.9031 --75.9234 --75.9078 --75.9125 --75.9125 --75.9156 --75.9172 --75.9109 --75.9141 --75.9203 --75.9297 --75.9172 --75.9219 --75.9187 --75.925 --75.9234 --75.9141 --75.9234 --75.9062 --75.9172 --75.9125 --75.9219 --75.9281 --75.9094 --75.9219 --75.9031 --75.9219 --75.9266 --75.9172 --75.9062 --75.9125 --75.9078 --75.9328 --75.9344 --75.9109 --75.9187 --75.925 --75.925 --75.9266 --75.9297 --75.9281 --75.9266 --75.9187 --75.9172 --75.9187 --75.9125 --75.9219 --75.9281 --75.9281 --75.9219 --75.9375 --75.9297 --75.9313 --75.9203 --75.9234 --75.9203 --75.9266 --75.9313 --75.9297 --75.9344 --75.9281 --75.9078 --75.9391 --75.9219 --75.9203 --75.9219 --75.9187 --75.9219 --75.9219 --75.9297 --75.9313 --75.9281 --75.9141 --75.9266 --75.9313 --75.9297 --75.9344 --75.9406 --75.9313 --75.925 --75.9344 --75.9406 --75.9406 --75.9203 --75.9219 --75.9187 --75.9172 --75.9281 --75.9156 --75.9016 --75.9094 --75.9125 --75.9125 --75.9094 --75.9 --75.9125 --75.9047 --75.9094 --75.9094 --75.9 --75.9156 --75.9203 --75.9062 --75.9016 --75.9109 --75.9156 --75.8969 --75.9078 --75.9016 --75.8953 --75.9156 --75.9109 --75.9031 --75.9047 --75.9094 --75.9172 --75.9094 --75.9 --75.9031 --75.8984 --75.9094 --75.9109 --75.9094 --75.9156 --75.9141 --75.9156 --75.925 --75.9094 --75.9109 --75.9125 --75.9141 --75.9094 --75.9234 --75.9281 --75.9203 --75.9187 --75.9172 --75.9094 --75.9219 --75.9141 --75.9203 --75.9109 --75.9141 --75.9078 --75.9187 --75.9062 --75.9078 --75.9062 --75.9156 --75.9016 --75.9094 --75.9125 --75.8906 --75.9047 --75.9109 --75.925 --75.9109 --75.9187 --75.9 --75.9156 --75.9047 --75.9234 --75.9172 --75.9172 --75.9203 --75.9219 --75.9187 --75.9187 --75.9156 --75.9094 --75.9141 --75.9344 --75.9156 --75.9125 --75.9156 --75.9203 --75.9125 --75.9109 --75.9141 --75.9109 --75.9078 --75.9141 --75.9125 --75.9156 --75.9062 --75.925 --75.9203 --75.9234 --75.9109 --75.9172 --75.9141 --75.9156 --75.9156 --75.9094 --75.9031 --75.9172 --75.9078 --75.9172 --75.9125 --75.9281 --75.9219 --75.9234 --75.9187 --75.9187 --75.9125 --75.9203 --75.9313 --75.9156 --75.9219 --75.925 --75.9141 --75.9156 --75.9219 --75.9047 --75.9 --75.9094 --75.9062 --75.9125 --75.9078 --75.9 --75.9031 --75.9109 --75.9125 --75.9047 --75.9187 --75.9125 --75.9094 --75.9187 --75.9172 --75.9 --75.9141 --75.9234 --75.9125 --75.9344 --75.9266 --75.9219 --75.925 --75.9266 --75.9141 --75.9094 --75.9266 --75.9031 --75.925 --75.9094 --75.9094 --75.9313 --75.9172 --75.9266 --75.9344 --75.9344 --75.925 --75.9297 --75.9266 --75.9172 --75.9187 --75.9187 --75.9187 --75.9281 --75.9359 --75.9062 --75.925 --75.9172 --75.9266 --75.9266 --75.9125 --75.9125 --75.9203 --75.9141 --75.9156 --75.9125 --75.9047 --75.9234 --75.9219 --75.9313 --75.925 --75.9172 --75.9219 --75.9219 --75.9281 --75.9141 --75.9156 --75.9297 --75.9297 --75.925 --75.9281 --75.9219 --75.9328 --75.9266 --75.9359 --75.9344 --75.925 --75.9109 --75.9234 --75.9125 --75.9187 --75.9266 --75.9266 --75.9172 --75.925 --75.9359 --75.9219 --75.9297 --75.9281 --75.9281 --75.9172 --75.9125 --75.9297 --75.9313 --75.9203 --75.9266 --75.9328 --75.9266 --75.9172 --75.9297 --75.9359 --75.9375 --75.9187 --75.9281 --75.9281 --75.9219 --75.9344 --75.925 --75.925 --75.9234 --75.8984 --75.925 --75.9172 --75.925 --75.9344 --75.9219 --75.9187 --75.9281 --75.9187 --75.9172 --75.9156 --75.9172 --75.9156 --75.9359 --75.9172 --75.9359 --75.9406 --75.9297 --75.9203 --75.9375 --75.9187 --75.9219 --75.9219 --75.9203 --75.9141 --75.9109 --75.9062 --75.9219 --75.9016 --75.9172 --75.9141 --75.9125 --75.9313 --75.9141 --75.9094 --75.9156 --75.9078 --75.9109 --75.9172 --75.9125 --75.9109 --75.9156 --75.9187 --75.9156 --75.9141 --75.9281 --75.9172 --75.9328 --75.925 --75.9141 --75.9234 --75.9156 --75.9219 --75.9141 --75.9125 --75.9078 --75.9297 --75.925 --75.9047 --75.9062 --75.9203 --75.9219 --75.9109 --75.9266 --75.9094 --75.9172 --75.9297 --75.9172 --75.9125 --75.9266 --75.9047 --75.8953 --75.9313 --75.9203 --75.9187 --75.9047 --75.9141 --75.9328 --75.9125 --75.9047 --75.9141 --75.9281 --75.9187 --75.9156 --75.9047 --75.9187 --75.9281 --75.9156 --75.9187 --75.9219 --75.8953 --75.9094 --75.9203 --75.9125 --75.9 --75.9203 --75.9281 --75.9109 --75.9219 --75.925 --75.925 --75.925 --75.9281 --75.9109 --75.9297 --75.9031 --75.9109 --75.9344 --75.9203 --75.9297 --75.9203 --75.9219 --75.9281 --75.9313 --75.9203 --75.9234 --75.9297 --75.9187 --75.9203 --75.925 --75.9266 --75.9281 --75.9187 --75.9297 --75.925 --75.9203 --75.9172 --75.9156 --75.925 --75.925 --75.9187 --75.9219 --75.9203 --75.9266 --75.925 --75.9266 --75.9203 --75.9203 --75.9172 --75.9203 --75.9156 --75.9109 --75.9078 --75.9313 --75.9203 --75.9234 --75.9109 --75.9203 --75.9234 --75.9266 --75.9203 --75.9234 --75.9219 --75.9328 --75.925 --75.9266 --75.9141 --75.9187 --75.9344 --75.9266 --75.9313 --75.9344 --75.9281 --75.9297 --75.9234 --75.9359 --75.9281 --75.9281 --75.9156 --75.9094 --75.9172 --75.9219 --75.9281 --75.9187 --75.9203 --75.9391 --75.9281 --75.9156 --75.9125 --75.9375 --75.9125 --75.9266 --75.9344 --75.9344 --75.9328 --75.9297 --75.9375 --75.9281 --75.925 --75.9453 --75.9406 --75.9328 --75.9406 --75.9172 --75.925 --75.9344 --75.9344 --75.9359 --75.9125 --75.9219 --75.9125 --75.9219 --75.9141 --75.9344 --75.9156 --75.9234 --75.9203 --75.9187 --75.9187 --75.9156 --75.9266 --75.9172 --75.9156 --75.9141 --75.9234 --75.9266 --75.9297 --75.925 --75.9234 --75.9281 --75.9172 --75.9156 --75.9109 --75.9 --75.9297 --75.9125 --75.9078 --75.9313 --75.9172 --75.9187 --75.9172 --75.9422 --75.9297 --75.9203 --75.9266 --75.9281 --75.9375 --75.9313 --75.9297 --75.9313 --75.9234 --75.9187 --75.9297 --75.9359 --75.9344 --75.925 --75.9297 --75.9297 --75.9281 --75.925 --75.9313 --75.925 --75.9172 --75.9219 --75.9125 --75.9141 --75.9234 --75.9297 --75.9266 --75.925 --75.9172 --75.9156 --75.9109 --75.9281 --75.925 --75.9172 --75.9 --75.9187 --75.9234 --75.9219 --75.9281 --75.9109 --75.9109 --75.9141 --75.9203 --75.9109 --75.925 --75.9328 --75.9187 --75.9375 --75.9141 --75.9328 --75.9094 --75.9344 --75.9266 --75.9281 --75.9203 --75.9313 --75.9359 --75.9281 --75.925 --75.9422 --75.9328 --75.9328 --75.9359 --75.9344 --75.9156 --75.9203 --75.925 --75.9219 --75.9094 --75.9266 --75.9187 --75.9234 --75.925 --75.9125 --75.9187 --75.9094 --75.9172 --75.9281 --75.9156 --75.9297 --75.9172 --75.9172 --75.9125 --75.9328 --75.925 --75.9172 --75.925 --75.9203 --75.9125 --75.9203 --75.9031 --75.9281 --75.9141 --75.9094 --75.9219 --75.9234 --75.9141 --75.9187 --75.9187 --75.9234 --75.9141 --75.9187 --75.9172 --75.9313 --75.9203 --75.9109 --75.9328 --75.9313 --75.925 --75.9328 --75.9172 --75.9125 --75.9266 --75.9313 --75.9187 --75.9156 --75.9234 --75.9125 --75.9156 --75.9078 --75.9141 --75.9156 --75.925 --75.9125 --75.9203 --75.9062 --75.9266 --75.925 --75.9219 --75.9359 --75.9297 --75.9297 --75.9297 --75.9172 --75.9203 --75.925 --75.925 --75.9328 --75.925 --75.9391 --75.9359 --75.9234 --75.9313 --75.9359 --75.9313 --75.9313 --75.9281 --75.9203 --75.9313 --75.9281 --75.9266 --75.9328 --75.9297 --75.9219 --75.9313 --75.9297 --75.9375 --75.9313 --75.9359 --75.9234 --75.9328 --75.9344 --75.9391 --75.9453 --75.9297 --75.9359 --75.9328 --75.9313 --75.9406 --75.9469 --75.9313 --75.9266 --75.9234 --75.95 --75.9219 --75.9359 --75.9359 --75.9344 --75.9437 --75.9406 --75.9375 --75.9297 --75.9328 --75.9297 --75.925 --75.9203 --75.9203 --75.9219 --75.9203 --75.925 --75.9141 --75.9234 --75.9219 --75.9281 --75.9281 --75.9172 --75.9328 --75.925 --75.9141 --75.9203 --75.9203 --75.9266 --75.925 --75.9313 --75.925 --75.925 --75.9234 --75.925 --75.9187 --75.9281 --75.9313 --75.9266 --75.9344 --75.9328 --75.9344 --75.9266 --75.9437 --75.9172 --75.9328 --75.9203 --75.9313 --75.9406 --75.9375 --75.9266 --75.9266 --75.9344 --75.9156 --75.9344 --75.9297 --75.9516 --75.9328 --75.9297 --75.9422 --75.9266 --75.9109 --75.925 --75.9359 --75.9391 --75.9375 --75.925 --75.925 --75.9156 --75.9266 --75.9187 --75.9187 --75.9359 --75.9344 --75.9359 --75.9203 --75.9172 --75.9391 --75.925 --75.9266 --75.9313 --75.9375 --75.925 --75.9422 --75.9313 --75.9375 --75.9328 --75.9359 --75.9281 --75.9219 --75.9406 --75.9297 --75.9344 --75.9391 --75.9281 --75.9187 --75.9437 --75.9344 --75.9406 --75.9266 --75.9344 --75.9313 --75.9313 --75.9328 --75.9328 --75.9328 --75.9344 --75.9375 --75.9406 --75.9344 --75.9281 --75.9344 --75.9313 --75.9313 --75.9156 --75.9313 --75.925 --75.9391 --75.9328 --75.9328 --75.9359 --75.9406 --75.9484 --75.9359 --75.9313 --75.9234 --75.9313 --75.9297 --75.925 --75.9172 --75.9266 --75.925 --75.9266 --75.9172 --75.9266 --75.9219 --75.9172 --75.9297 --75.9375 --75.9313 --75.9234 --75.9203 --75.9125 --75.9391 --75.9219 --75.9172 --75.9281 --75.9297 --75.9328 --75.9437 --75.9344 --75.9234 --75.9156 --75.9297 --75.9375 --75.9359 --75.9313 --75.9281 --75.9422 --75.9219 --75.925 --75.9281 --75.9344 --75.9219 --75.9422 --75.9297 --75.9172 --75.9359 --75.9187 --75.9391 --75.9266 --75.9266 --75.925 --75.9203 --75.9453 --75.9406 --75.9313 --75.9297 --75.9437 --75.9422 --75.9344 --75.9203 --75.9406 --75.9328 --75.9375 --75.9422 --75.9469 --75.9313 --75.9359 --75.9437 --75.9484 --75.9266 --75.9406 --75.9359 --75.9344 --75.9453 --75.9391 --75.9469 --75.9469 --75.9547 --75.9688 --75.9531 --75.9625 --75.9531 --75.9516 --75.9406 --75.9437 --75.9453 --75.9484 --75.9391 --75.9328 --75.9422 --75.9328 --75.9313 --75.9328 --75.9313 --75.95 --75.9375 --75.9406 --75.9297 --75.9297 --75.9406 --75.9219 --75.9391 --75.9422 --75.9313 --75.9406 --75.9531 --75.9313 --75.9391 --75.9453 --75.9391 --75.925 --75.9516 --75.9437 --75.9328 --75.9219 --75.9344 --75.9297 --75.9266 --75.9281 --75.9234 --75.9219 --75.925 --75.9313 --75.9297 --75.925 --75.9328 --75.9297 --75.9266 --75.9187 --75.9172 --75.925 --75.9234 --75.9187 --75.9328 --75.9344 --75.9187 --75.9344 --75.9187 --75.9375 --75.9281 --75.9437 --75.9359 --75.9297 --75.9469 --75.9375 --75.9328 --75.9359 --75.9422 --75.9266 --75.9344 --75.9469 --75.9453 --75.9266 --75.9406 --75.9359 --75.9359 --75.9359 --75.9344 --75.9375 --75.9422 --75.925 --75.9328 --75.9391 --75.9391 --75.9375 --75.9391 --75.9422 --75.9328 --75.9297 --75.9328 --75.9328 --75.9344 --75.9437 --75.9313 --75.9453 --75.9344 --75.9375 --75.9328 --75.9375 --75.9406 --75.9313 --75.9391 --75.9484 --75.9391 --75.9469 --75.9313 --75.9531 --75.9469 --75.9469 --75.9422 --75.9391 --75.9406 --75.9281 --75.9437 --75.9375 --75.9328 --75.9359 --75.9266 --75.9391 --75.9375 --75.9422 --75.9281 --75.9422 --75.9344 --75.9437 --75.9406 --75.9375 --75.9391 --75.925 --75.9328 --75.9328 --75.9422 --75.9344 --75.9297 --75.925 --75.9437 --75.9359 --75.9266 --75.9328 --75.9453 --75.9375 --75.9469 --75.9344 --75.9469 --75.9422 --75.9297 --75.9406 --75.9344 --75.9406 --75.9516 --75.9437 --75.9453 --75.9516 --75.9484 --75.9406 --75.9469 --75.9297 --75.9453 --75.9313 --75.9391 --75.9344 --75.9266 --75.9437 --75.9328 --75.925 --75.9359 --75.9187 --75.9266 --75.9234 --75.9234 --75.9156 --75.9062 --75.9344 --75.9391 --75.9219 --75.9313 --75.9281 --75.9234 --75.9328 --75.9156 --75.9297 --75.9109 --75.9281 --75.9141 --75.925 --75.9234 --75.9156 --75.9219 --75.9359 --75.9375 --75.9313 --75.9125 --75.9297 --75.9219 --75.9109 --75.9172 --75.925 --75.9047 --75.9297 --75.9281 --75.9359 --75.9266 --75.9156 --75.9344 --75.9328 --75.925 --75.9297 --75.9297 --75.9328 --75.9328 --75.9359 --75.9234 --75.9266 --75.9359 --75.9266 --75.9266 --75.9234 --75.9219 --75.9313 --75.9203 --75.9344 --75.9234 --75.9203 --75.925 --75.9187 --75.9187 --75.9094 --75.9187 --75.9172 --75.9203 --75.9219 --75.9156 --75.9281 --75.925 --75.9234 --75.9125 --75.9156 --75.9141 --75.9109 --75.9313 --75.9234 --75.9203 --75.9375 --75.9281 --75.9297 --75.9391 --75.9266 --75.9219 --75.9328 --75.9375 --75.9219 --75.9391 --75.9313 --75.9406 --75.9172 --75.925 --75.9141 --75.9234 --75.9187 --75.9203 --75.9203 --75.925 --75.8891 --75.9 --75.9125 --75.9219 --75.9172 --75.9109 --75.9141 --75.9234 --75.9062 --75.9203 --75.9219 --75.9094 --75.9187 --75.9172 --75.9281 --75.9125 --75.9156 --75.9359 --75.9234 --75.9344 --75.9266 --75.9141 --75.9297 --75.9172 --75.9344 --75.9297 --75.925 --75.9266 --75.9234 --75.9344 --75.9266 --75.9281 --75.9375 --75.9266 --75.9219 --75.9328 --75.9219 --75.9313 --75.9172 --75.9266 --75.9344 --75.9328 --75.9141 --75.9344 --75.9281 --75.9328 --75.925 --75.9234 --75.925 --75.9328 --75.9281 --75.9359 --75.9219 --75.9328 --75.9359 --75.9313 --75.9266 --75.9141 --75.9297 --75.9328 --75.9406 --75.9313 --75.9328 --75.9297 --75.9313 --75.9484 --75.9422 --75.9469 --75.9422 --75.9281 --75.9313 --75.925 --75.9281 --75.9266 --75.9406 --75.9281 --75.9219 --75.9328 --75.9453 --75.9219 --75.925 --75.9297 --75.9313 --75.9344 --75.9281 --75.9109 --75.925 --75.9203 --75.9328 --75.9234 --75.9172 --75.9156 --75.9109 --75.9359 --75.9219 --75.9297 --75.9281 --75.9281 --75.9328 --75.9172 --75.9203 --75.9187 --75.925 --75.9281 --75.9328 --75.9047 --75.9391 --75.9406 --75.9125 --75.925 --75.9328 --75.9313 --75.925 --75.9203 --75.9359 --75.9344 --75.9375 --75.9344 --75.9187 --75.9156 --75.9281 --75.9375 --75.9391 --75.9344 --75.925 --75.9328 --75.9234 --75.9484 --75.9266 --75.9437 --75.9219 --75.9281 --75.9344 --75.9406 --75.9375 --75.9281 --75.9422 --75.9359 --75.9328 --75.9234 --75.9328 --75.9313 --75.9281 --75.9359 --75.9359 --75.9406 --75.9313 --75.9469 --75.9406 --75.925 --75.9266 --75.9266 --75.9469 --75.9328 --75.9203 --75.9297 --75.9266 --75.9469 --75.9328 --75.925 --75.9234 --75.9359 --75.9234 --75.9313 --75.9187 --75.9359 --75.9391 --75.9313 --75.9281 --75.9266 --75.9266 --75.9281 --75.9219 --75.9313 --75.9172 --75.9266 --75.9219 --75.9313 --75.9203 --75.9219 --75.9234 --75.9172 --75.9141 --75.9187 --75.9281 --75.9109 --75.9203 --75.9172 --75.9266 --75.9344 --75.9313 --75.9109 --75.9266 --75.9141 --75.9109 --75.9172 --75.9375 --75.9141 --75.9328 --75.9187 --75.9281 --75.9328 --75.9125 --75.9187 --75.9078 --75.9203 --75.9125 --75.9062 --75.9219 --75.925 --75.9203 --75.9156 --75.9172 --75.9281 --75.9078 --75.925 --75.9172 --75.9219 --75.9187 --75.9266 --75.9422 --75.925 --75.9266 --75.9266 --75.9266 --75.9281 --75.9313 --75.9156 --75.9297 --75.9297 --75.9187 --75.9375 --75.9313 --75.9234 --75.9391 --75.9313 --75.9187 --75.9328 --75.9234 --75.925 --75.9203 --75.9313 --75.9297 --75.9281 --75.9328 --75.9359 --75.9375 --75.9391 --75.9281 --75.9234 --75.9281 --75.9422 --75.9469 --75.9281 --75.9375 --75.9359 --75.9422 --75.9313 --75.9281 --75.9344 --75.9187 --75.9391 --75.9344 --75.925 --75.9344 --75.9375 --75.9406 --75.9406 --75.9313 --75.9422 --75.9391 --75.9328 --75.9531 --75.925 --75.9328 --75.9344 --75.9203 --75.9328 --75.9391 --75.9297 --75.9391 --75.9328 --75.9344 --75.9344 --75.9203 --75.9313 --75.9328 --75.9344 --75.9422 --75.9344 --75.9344 --75.9453 --75.9406 --75.9359 --75.9328 --75.9422 --75.9594 --75.9391 --75.9297 --75.9406 --75.9406 --75.9266 --75.9297 --75.925 --75.95 --75.9313 --75.9469 --75.9344 --75.925 --75.9328 --75.9453 --75.95 --75.9547 --75.9484 --75.9328 --75.9453 --75.9422 --75.9453 --75.9297 --75.9344 --75.9344 --75.9297 --75.9437 --75.9297 --75.9266 --75.9391 --75.9391 --75.9375 --75.925 --75.9234 --75.9391 --75.9328 --75.9266 --75.9297 --75.9313 --75.9406 --75.9266 --75.9234 --75.9344 --75.9375 --75.9375 --75.9297 --75.9297 --75.9328 --75.9328 --75.9297 --75.9219 --75.925 --75.9234 --75.9297 --75.9234 --75.9281 --75.9234 --75.9219 --75.9172 --75.9422 --75.9156 --75.9328 --75.9266 --75.9437 --75.9109 --75.9281 --75.9406 --75.9328 --75.9313 --75.9328 --75.9219 --75.9281 --75.9234 --75.9203 --75.9125 --75.9266 --75.925 --75.9141 --75.9375 --75.9234 --75.9187 --75.9094 --75.9359 --75.9234 --75.9156 --75.9172 --75.925 --75.9281 --75.9234 --75.9125 --75.9156 --75.9234 --75.9328 --75.9234 --75.9328 --75.9297 --75.9187 --75.9094 --75.9187 --75.9094 --75.9203 --75.9234 --75.9344 --75.9172 --75.9344 --75.9016 --75.9078 --75.9078 --75.9109 --75.9234 --75.9234 --75.9266 --75.9219 --75.9234 --75.9297 --75.9234 --75.9234 --75.9328 --75.9234 --75.9266 --75.9172 --75.9359 --75.9187 --75.9141 --75.9359 --75.9313 --75.9187 --75.9437 --75.9328 --75.9266 --75.9406 --75.925 --75.9219 --75.9297 --75.9422 --75.925 --75.9406 --75.9328 --75.9266 --75.9359 --75.9344 --75.9375 --75.9297 --75.9281 --75.925 --75.9297 --75.9359 --75.9172 --75.9391 --75.9406 --75.9187 --75.9344 --75.9219 --75.9234 --75.9313 --75.9203 --75.9141 --75.9297 --75.9391 --75.9219 --75.9141 --75.9297 --75.9156 --75.9391 --75.9344 --75.9437 --75.9344 --75.9203 --75.9359 --75.9266 --75.9203 --75.9141 --75.9422 --75.9234 --75.9328 --75.9125 --75.9141 --75.9328 --75.9234 --75.9203 --75.9203 --75.925 --75.9156 --75.9359 --75.9141 --75.9094 --75.9078 --75.9203 --75.9141 --75.9094 --75.9141 --75.9141 --75.9266 --75.9281 --75.9219 --75.9094 --75.9047 --75.925 --75.9141 --75.9078 --75.9266 --75.9187 --75.9203 --75.9359 --75.9297 --75.9328 --75.9078 --75.9437 --75.9359 --75.9453 --75.9187 --75.9297 --75.9281 --75.9203 --75.9187 --75.9234 --75.9297 --75.9125 --75.9234 --75.9234 --75.9156 --75.9391 --75.9172 --75.9391 --75.9297 --75.9344 --75.9297 --75.9313 --75.9422 --75.9344 --75.9219 --75.9313 --75.9437 --75.9187 --75.9359 --75.925 --75.9266 --75.9313 --75.9313 --75.9141 --75.9281 --75.9297 --75.9234 --75.925 --75.9297 --75.9266 --75.925 --75.9078 --75.9344 --75.9375 --75.9172 --75.9391 --75.9359 --75.9234 --75.9328 --75.9313 --75.9297 --75.9437 --75.9187 --75.9219 --75.9344 --75.9437 --75.9266 --75.9281 --75.95 --75.9359 --75.9375 --75.9187 --75.9453 --75.925 --75.9266 --75.9297 --75.9422 --75.9391 --75.9344 --75.9359 --75.9313 --75.9328 --75.9344 --75.9203 --75.9359 --75.9281 --75.9266 --75.9328 --75.9344 --75.9328 --75.9234 --75.9328 --75.9234 --75.9437 --75.9313 --75.9344 --75.9297 --75.925 --75.9313 --75.9328 --75.9297 --75.9266 --75.9109 --75.9141 --75.9234 --75.9219 --75.925 --75.9187 --75.9234 --75.9406 --75.9344 --75.9281 --75.9313 --75.9422 --75.9203 --75.9344 --75.95 --75.9234 --75.9453 --75.9406 --75.9328 --75.9328 --75.9391 --75.9234 --75.9203 --75.925 --75.9531 --75.9328 --75.9359 --75.9234 --75.9281 --75.9297 --75.9266 --75.9359 --75.9344 --75.9281 --75.9328 --75.9328 --75.9234 --75.9297 --75.9313 --75.9375 --75.9359 --75.9422 --75.9469 --75.9313 --75.9313 --75.9375 --75.9266 --75.9359 --75.9375 --75.9375 --75.9391 --75.9328 --75.9359 --75.9422 --75.9406 --75.9266 --75.9422 --75.9344 --75.9328 --75.9297 --75.9375 --75.9375 --75.9328 --75.9297 --75.9422 --75.925 --75.9422 --75.9328 --75.9156 --75.925 --75.9359 --75.9344 --75.9375 --75.9313 --75.9422 --75.9313 --75.925 --75.9297 --75.9359 --75.9313 --75.9125 --75.9297 --75.9281 --75.9469 --75.9406 --75.9484 --75.9406 --75.9281 --75.9313 --75.9281 --75.9219 --75.9359 --75.9328 --75.9219 --75.9344 --75.925 --75.9375 --75.9437 --75.9281 --75.9266 --75.9375 --75.9344 --75.925 --75.9406 --75.9266 --75.9328 --75.9406 --75.9297 --75.9391 --75.9406 --75.9469 --75.9406 --75.9297 --75.9437 --75.9375 --75.9422 --75.9391 --75.9422 --75.9297 --75.9344 --75.9422 --75.9547 --75.9484 --75.9359 --75.9344 --75.9359 --75.9328 --75.9359 --75.9297 --75.9313 --75.9297 --75.9297 --75.9172 --75.9266 --75.9344 --75.9266 --75.9266 --75.9406 --75.9391 --75.9422 --75.95 --75.9281 --75.9313 --75.9375 --75.9437 --75.9297 --75.9359 --75.9437 --75.9344 --75.9328 --75.9406 --75.9422 --75.9328 --75.9344 --75.9453 --75.9328 --75.9328 --75.9375 --75.9359 --75.9359 --75.9422 --75.9547 --75.925 --75.9359 --75.9422 --75.9375 --75.9375 --75.9203 --75.9391 --75.9437 --75.9391 --75.9313 --75.925 --75.9328 --75.9266 --75.9344 --75.9313 --75.9328 --75.9266 --75.9375 --75.9406 --75.9359 --75.9359 --75.9328 --75.9469 --75.9266 --75.9297 --75.9328 --75.9281 --75.9266 --75.9453 --75.9469 --75.9391 --75.9422 --75.9219 --75.9359 --75.9375 --75.9437 --75.9344 --75.9297 --75.9344 --75.9469 --75.9297 --75.9422 --75.9281 --75.9422 --75.9406 --75.9313 --75.9359 --75.9219 --75.9219 --75.9297 --75.9187 --75.9391 --75.9328 --75.9391 --75.9437 --75.9297 --75.9375 --75.9313 --75.9375 --75.9437 --75.9406 --75.9406 --75.9344 --75.9375 --75.95 --75.9359 --75.9313 --75.9406 --75.9313 --75.9359 --75.9375 --75.9281 --75.9344 --75.9469 --75.9437 --75.9422 --75.9406 --75.9406 --75.9344 --75.9469 --75.9422 --75.9422 --75.9375 --75.9453 --75.9344 --75.9547 --75.9375 --75.9469 --75.9344 --75.9359 --75.9344 --75.9563 --75.9391 --75.9422 --75.9531 --75.9484 --75.95 --75.9563 --75.9281 --75.9375 --75.9469 --75.9375 --75.9406 --75.9297 --75.9578 --75.9375 --75.9484 --75.9531 --75.9594 --75.9391 --75.9422 --75.95 --75.9437 --75.9422 --75.9547 --75.9469 --75.95 --75.9375 --75.9375 --75.9469 --75.9578 --75.95 --75.9547 --75.9531 --75.9453 --75.9406 --75.9484 --75.9453 --75.9406 --75.95 --75.9469 --75.9453 --75.9469 --75.95 --75.9656 --75.9422 --75.9453 --75.9422 --75.9406 --75.9469 --75.9313 --75.9313 --75.9547 --75.9469 --75.9359 --75.9328 --75.9516 --75.9531 --75.9469 --75.9484 --75.9531 --75.9437 --75.9437 --75.9422 --75.9219 --75.9484 --75.95 --75.9344 --75.9297 --75.9391 --75.9375 --75.9391 --75.9422 --75.9453 --75.9469 --75.9453 --75.9359 --75.9563 --75.9422 --75.9437 --75.9484 --75.9453 --75.9422 --75.9531 --75.9484 --75.9406 --75.9328 --75.9547 --75.9422 --75.9406 --75.9359 --75.9328 --75.9391 --75.9422 --75.9437 --75.9547 --75.9516 --75.9422 --75.9453 --75.9437 --75.9422 --75.95 --75.9531 --75.9453 --75.9406 --75.9422 --75.9297 --75.9484 --75.9328 --75.9422 --75.9375 --75.9437 --75.9359 --75.9563 --75.9359 --75.95 --75.9437 --75.9375 --75.9391 --75.9281 --75.9281 --75.9453 --75.9344 --75.9406 --75.9484 --75.9234 --75.9328 --75.9344 --75.9469 --75.9375 --75.9266 --75.9297 --75.9359 --75.9328 --75.95 --75.9578 --75.95 --75.9422 --75.9453 --75.9422 --75.9406 --75.9641 --75.9437 --75.9484 --75.9344 --75.9375 --75.9406 --75.9469 --75.9313 --75.9406 --75.9391 --75.9375 --75.9422 --75.9453 --75.9313 --75.9469 --75.9422 --75.9359 --75.9344 --75.9266 --75.9375 --75.9406 --75.9359 --75.9313 --75.9391 --75.9313 --75.9328 --75.9281 --75.9406 --75.9344 --75.9344 --75.9375 --75.9359 --75.9406 --75.9344 --75.9344 --75.9313 --75.9313 --75.9297 --75.9359 --75.9359 --75.9328 --75.9453 --75.9453 --75.9391 --75.9422 --75.9422 --75.9359 --75.9375 --75.9437 --75.9313 --75.9187 --75.9328 --75.9422 --75.9359 --75.9375 --75.9531 --75.9437 --75.9406 --75.9437 --75.9484 --75.9422 --75.9453 --75.9375 --75.9406 --75.9359 --75.9313 --75.9391 --75.9453 --75.9484 --75.9609 --75.9391 --75.9469 --75.9375 --75.9453 --75.9313 --75.9531 --75.9359 --75.9344 --75.9406 --75.9328 --75.9391 --75.9469 --75.9453 --75.95 --75.9484 --75.9359 --75.9547 --75.9391 --75.9422 --75.9422 --75.9453 --75.9234 --75.9437 --75.9313 --75.9422 --75.9453 --75.9422 --75.9469 --75.9375 --75.95 --75.9422 --75.9281 --75.9516 --75.9422 --75.9406 --75.925 --75.95 --75.9453 --75.9469 --75.9453 --75.9297 --75.9391 --75.9406 --75.9328 --75.9297 --75.9313 --75.9297 --75.9359 --75.9313 --75.9375 --75.9187 --75.9359 --75.9391 --75.9391 --75.9469 --75.9313 --75.9406 --75.9359 --75.9422 --75.9172 --75.9406 --75.9422 --75.9297 --75.9391 --75.9406 --75.9328 --75.9437 --75.9453 --75.9453 --75.9531 --75.9359 --75.9297 --75.9437 --75.9391 --75.9219 --75.9328 --75.9281 --75.9297 --75.9484 --75.9266 --75.9453 --75.9266 --75.9437 --75.9313 --75.9484 --75.9422 --75.9359 --75.9406 --75.9422 --75.9359 --75.9359 --75.9406 --75.9328 --75.9328 --75.9313 --75.9328 --75.9422 --75.9313 --75.9406 --75.9328 --75.9391 --75.9344 --75.9313 --75.9422 --75.9281 --75.9313 --75.9359 --75.9359 --75.9344 --75.9344 --75.9406 --75.9375 --75.9375 --75.9453 --75.9328 --75.9281 --75.9359 --75.9391 --75.9422 --75.9469 --75.9344 --75.9437 --75.9234 --75.9313 --75.9375 --75.9297 --75.925 --75.9266 --75.9266 --75.9422 --75.9391 --75.9422 --75.9422 --75.9359 --75.9344 --75.9453 --75.9547 --75.9391 --75.9422 --75.9344 --75.9313 --75.9375 --75.9281 --75.9313 --75.9328 --75.9437 --75.9328 --75.9437 --75.925 --75.9328 --75.9313 --75.95 --75.9437 --75.9391 --75.9328 --75.9281 --75.9547 --75.9375 --75.9266 --75.9375 --75.9313 --75.9391 --75.9328 --75.9391 --75.9344 --75.9375 --75.9234 --75.9297 --75.9359 --75.9281 --75.9266 --75.9266 --75.9313 --75.9328 --75.9281 --75.9344 --75.9313 --75.95 --75.9328 --75.9547 --75.9375 --75.9406 --75.9437 --75.9422 --75.9391 --75.9328 --75.9531 --75.9406 --75.95 --75.9375 --75.9578 --75.9406 --75.9469 --75.9391 --75.9516 --75.9437 --75.9469 --75.9516 --75.9328 --75.9313 --75.9484 --75.9391 --75.9437 --75.9344 --75.9344 --75.9469 --75.9391 --75.9516 --75.9484 --75.9547 --75.9375 --75.95 --75.9313 --75.9328 --75.95 --75.9375 --75.9344 --75.9547 --75.9313 --75.9359 --75.9344 --75.9422 --75.9422 --75.9313 --75.9313 --75.95 --75.9469 --75.9234 --75.9391 --75.9406 --75.9297 --75.9375 --75.9391 --75.9422 --75.9422 --75.9422 --75.9484 --75.9406 --75.9328 --75.9359 --75.9328 --75.9281 --75.9375 --75.9391 --75.9437 --75.9453 --75.9453 --75.9344 --75.9313 --75.9547 --75.9406 --75.9406 --75.9437 --75.9281 --75.9359 --75.9469 --75.9266 --75.9359 --75.9359 --75.9297 --75.9328 --75.9406 --75.9375 --75.95 --75.9359 --75.9469 --75.9313 --75.9359 --75.9484 --75.9422 --75.9313 --75.9437 --75.95 --75.9281 --75.9437 --75.9437 --75.9391 --75.9375 --75.9516 --75.9344 --75.9313 --75.9437 --75.9406 --75.9406 --75.9437 --75.9391 --75.9375 --75.9422 --75.9359 --75.9469 --75.9391 --75.9531 --75.9422 --75.925 --75.9375 --75.9297 --75.9359 --75.9328 --75.9234 --75.9406 --75.9375 --75.9406 --75.9391 --75.9406 --75.9313 --75.9406 --75.9453 --75.9437 --75.9391 --75.95 --75.9406 --75.9422 --75.9297 --75.9391 --75.9281 --75.9281 --75.9234 --75.9359 --75.9328 --75.9422 --75.9375 --75.9313 --75.9219 --75.95 --75.9344 --75.9484 --75.9437 --75.9313 --75.9344 --75.9375 --75.9453 --75.9516 --75.9375 --75.9391 --75.9344 --75.9406 --75.9375 --75.9422 --75.9391 --75.9344 --75.9375 --75.9406 --75.95 --75.9328 --75.9437 --75.9484 --75.9391 --75.9469 --75.9516 --75.9406 --75.9484 --75.9453 --75.9406 --75.9453 --75.9484 --75.9594 --75.9594 --75.9531 --75.9406 --75.9578 --75.9406 --75.9406 --75.95 --75.9453 --75.9469 --75.9422 --75.9469 --75.9344 --75.9453 --75.9453 --75.9437 --75.9453 --75.9547 --75.9328 --75.9422 --75.9375 --75.9437 --75.9359 --75.9391 --75.9391 --75.9469 --75.9422 --75.9344 --75.95 --75.9437 --75.9422 --75.9406 --75.9453 --75.9469 --75.9437 --75.9469 --75.9406 --75.9344 --75.9375 --75.9375 --75.9359 --75.9422 --75.9375 --75.9422 --75.9328 --75.9219 --75.9328 --75.9187 --75.9266 --75.9297 --75.9266 --75.9297 --75.9391 --75.9344 --75.9219 --75.9281 --75.9313 --75.9375 --75.9375 --75.9391 --75.9328 --75.9328 --75.9375 --75.9437 --75.925 --75.9281 --75.9391 --75.9297 --75.9359 --75.9203 --75.9344 --75.9328 --75.9344 --75.9437 --75.9422 --75.9313 --75.9281 --75.9453 --75.9453 --75.9453 --75.925 --75.9359 --75.9422 --75.9172 --75.925 --75.9328 --75.9469 --75.9391 --75.9359 --75.9359 --75.9406 --75.9297 --75.9437 --75.9219 --75.9313 --75.9234 --75.9297 --75.9234 --75.9219 --75.9281 --75.9313 --75.9297 --75.9297 --75.9234 --75.9266 --75.9375 --75.9391 --75.9375 --75.9375 --75.9422 --75.95 --75.9594 --75.9484 --75.9344 --75.9391 --75.95 --75.9359 --75.9484 --75.9484 --75.95 --75.9453 --75.9344 --75.9422 --75.9391 --75.9469 --75.9531 --75.9453 --75.9359 --75.9375 --75.9375 --75.9406 --75.9406 --75.9531 --75.9484 --75.9437 --75.9437 --75.9266 --75.9437 --75.9422 --75.9484 --75.9281 --75.9391 --75.9547 --75.9516 --75.9391 --75.9391 --75.9406 --75.9453 --75.9359 --75.9375 --75.9453 --75.9297 --75.9406 --75.95 --75.9563 --75.9484 --75.9391 --75.9406 --75.95 --75.9578 --75.9453 --75.9484 --75.9641 --75.9469 --75.9516 --75.9609 --75.9469 --75.9391 --75.9406 --75.9453 --75.9516 --75.95 --75.9594 --75.9625 --75.9484 --75.9469 --75.9266 --75.9531 --75.9422 --75.9391 --75.9531 --75.9453 --75.9469 --75.9297 --75.9469 --75.9422 --75.9297 --75.9344 --75.9281 --75.9313 --75.925 --75.9344 --75.9328 --75.9328 --75.9484 --75.9344 --75.9406 --75.9469 --75.9422 --75.9531 --75.9375 --75.9484 --75.95 --75.9375 --75.9391 --75.9516 --75.9281 --75.9344 --75.9422 --75.9422 --75.9234 --75.9578 --75.9406 --75.9391 --75.9484 --75.9344 --75.9422 --75.9453 --75.9531 --75.9422 --75.95 --75.9625 --75.9422 --75.9437 --75.95 --75.9437 --75.9328 --75.9391 --75.9375 --75.9234 --75.9359 --75.9313 --75.9453 --75.9375 --75.9391 --75.9359 --75.9359 --75.9484 --75.9359 --75.9266 --75.9422 --75.9344 --75.9437 --75.9344 --75.9391 --75.9531 --75.9516 --75.9453 --75.9328 --75.9406 --75.9391 --75.9453 --75.9422 --75.9422 --75.9453 --75.9437 --75.9484 --75.9453 --75.9516 --75.9406 --75.95 --75.9469 --75.9516 --75.9453 --75.9313 --75.9453 --75.9422 --75.9437 --75.9516 --75.95 --75.9484 --75.9422 --75.9484 --75.9609 --75.9422 --75.9437 --75.9437 --75.9406 --75.9437 --75.9422 --75.9422 --75.9359 --75.9391 --75.9359 --75.9578 --75.9453 --75.9313 --75.9297 --75.9391 --75.9406 --75.9297 --75.9391 --75.9313 --75.925 --75.9344 --75.9469 --75.9344 --75.9437 --75.9375 --75.9453 --75.9313 --75.9219 --75.9422 --75.9484 --75.9359 --75.9344 --75.9437 --75.9391 --75.9469 --75.9531 --75.9453 --75.9437 --75.9578 --75.9609 --75.9406 --75.9328 --75.9422 --75.9422 --75.9422 --75.9453 --75.9406 --75.95 --75.95 --75.9469 --75.9437 --75.95 --75.9547 --75.95 --75.9437 --75.9547 --75.9453 --75.9469 --75.9422 --75.9484 --75.9578 --75.9453 --75.9344 --75.9313 --75.9406 --75.9437 --75.9328 --75.9422 --75.9406 --75.9375 --75.9297 --75.9406 --75.9406 --75.9344 --75.9422 --75.9453 --75.9484 --75.9484 --75.9422 --75.9375 --75.9281 --75.9516 --75.9453 --75.9344 --75.9375 --75.95 --75.9375 --75.9437 --75.9437 --75.9453 --75.9578 --75.9453 --75.9484 --75.9453 --75.9359 --75.9375 --75.9328 --75.9469 --75.9453 --75.9563 --75.9391 --75.9484 --75.9469 --75.9516 --75.9344 --75.95 --75.9563 --75.9531 --75.9359 --75.9437 --75.9531 --75.9453 --75.9609 --75.95 --75.9547 --75.9484 --75.9563 --75.9484 --75.9484 --75.95 --75.9531 --75.95 --75.9344 --75.9484 --75.9422 --75.9531 --75.9484 --75.9531 --75.9563 --75.9484 --75.9484 --75.9547 --75.9531 --75.9578 --75.9516 --75.9609 --75.9437 --75.9469 --75.9422 --75.9531 --75.9484 --75.9437 --75.9672 --75.9437 --75.9625 --75.9547 --75.9484 --75.9531 --75.9422 --75.9547 --75.9531 --75.9594 --75.9516 --75.9516 --75.9641 --75.9531 --75.9531 --75.9406 --75.9469 --75.9547 --75.9484 --75.9563 --75.9375 --75.9516 --75.9328 --75.9453 --75.9437 --75.9453 --75.9484 --75.9359 --75.9375 --75.9437 --75.9516 --75.9297 --75.9437 --75.9453 --75.9359 --75.9469 --75.9391 --75.95 --75.9344 --75.9531 --75.9422 --75.9328 --75.9484 --75.9453 --75.9359 --75.9453 --75.9437 --75.9453 --75.9375 --75.9437 --75.9391 --75.9578 --75.9453 --75.9516 --75.9547 --75.9375 --75.9422 --75.9375 --75.9469 --75.9484 --75.9609 --75.9547 --75.9578 --75.9609 --75.9563 --75.9641 --75.9453 --75.9578 --75.9547 --75.9437 --75.9359 --75.9484 --75.9437 --75.9422 --75.9344 --75.9375 --75.9344 --75.9391 --75.9531 --75.9344 --75.9406 --75.9578 --75.9437 --75.9531 --75.9578 --75.9453 --75.9656 --75.9563 --75.9469 --75.9547 --75.9563 --75.9516 --75.95 --75.9453 --75.9594 --75.9672 --75.9484 --75.9609 --75.9547 --75.9563 --75.9531 --75.9578 --75.9469 --75.9469 --75.9578 --75.9484 --75.9563 --75.9375 --75.9609 --75.9578 --75.95 --75.9531 --75.9656 --75.9656 --75.9594 --75.9437 --75.9469 --75.9547 --75.9469 --75.9531 --75.9609 --75.9609 --75.9547 --75.9547 --75.9578 --75.9516 --75.9469 --75.9609 --75.9437 --75.9578 --75.9563 --75.95 --75.9594 --75.9453 --75.9578 --75.95 --75.9547 --75.9625 --75.9516 --75.9516 --75.9578 --75.9547 --75.9531 --75.9594 --75.9563 --75.9609 --75.9469 --75.9422 --75.9547 --75.9453 --75.9547 --75.9531 --75.9453 --75.9625 --75.9516 --75.9516 --75.9547 --75.9484 --75.9547 --75.95 --75.9469 --75.9437 --75.9297 --75.95 --75.9469 --75.9469 --75.9531 --75.9656 --75.9641 --75.9437 --75.9391 --75.9484 --75.9484 --75.9281 --75.9422 --75.95 --75.9406 --75.9437 --75.9422 --75.9437 --75.925 --75.9453 --75.9328 --75.9375 --75.9297 --75.9328 --75.9344 --75.9422 --75.9375 --75.9437 --75.9469 --75.9391 --75.9391 --75.9422 --75.9313 --75.9531 --75.9406 --75.9469 --75.9391 --75.925 --75.9391 --75.95 --75.9281 --75.9469 --75.9328 --75.9453 --75.9313 --75.9359 --75.9391 --75.9359 --75.9391 --75.9422 --75.9313 --75.9484 --75.9344 --75.9297 --75.9469 --75.9375 --75.9359 --75.9266 --75.9484 --75.9375 --75.9422 --75.9328 --75.9375 --75.9437 --75.9469 --75.9313 --75.9187 --75.9437 --75.9484 --75.95 --75.9297 --75.9375 --75.9547 --75.9453 --75.9469 --75.9359 --75.9406 --75.9547 --75.9359 --75.9359 --75.9531 --75.9437 --75.9578 --75.9437 --75.9391 --75.9484 --75.9453 --75.9453 --75.9484 --75.9484 --75.9359 --75.9391 --75.9344 --75.9375 --75.9344 --75.9359 --75.9359 --75.9453 --75.9313 --75.9422 --75.9344 --75.9406 --75.9516 --75.9516 --75.9359 --75.9328 --75.9547 --75.9453 --75.9156 --75.9453 --75.95 --75.9313 --75.9469 --75.9406 --75.9281 --75.9313 --75.9406 --75.9531 --75.9484 --75.9469 --75.9406 --75.9422 --75.9375 --75.9422 --75.9359 --75.9328 --75.9328 --75.9391 --75.9344 --75.9437 --75.9313 --75.9203 --75.9313 --75.9297 --75.9297 --75.9328 --75.9391 --75.9375 --75.9359 --75.9359 --75.9313 --75.9297 --75.9359 --75.9375 --75.9375 --75.9344 --75.9344 --75.9328 --75.9422 --75.9391 --75.9437 --75.9469 --75.9453 --75.9484 --75.9516 --75.9375 --75.9391 --75.9375 --75.9328 --75.9422 --75.95 --75.9344 --75.9469 --75.9375 --75.9391 --75.9516 --75.9359 --75.95 --75.9437 --75.9328 --75.9375 --75.9422 --75.9313 --75.9344 --75.9313 --75.9313 --75.9391 --75.9391 --75.9437 --75.9563 --75.9484 --75.9516 --75.9453 --75.9563 --75.9391 --75.9625 --75.9484 --75.9516 --75.95 --75.9375 --75.9453 --75.9578 --75.9531 --75.9594 --75.9547 --75.9484 --75.9422 --75.95 --75.95 --75.9516 --75.9563 --75.9547 --75.9484 --75.9469 --75.9609 --75.9437 --75.9469 --75.9516 --75.9375 --75.9609 --75.9406 --75.9453 --75.9469 --75.9531 --75.9437 --75.9375 --75.9469 --75.9516 --75.9453 --75.9375 --75.9531 --75.9531 --75.9437 --75.9563 --75.9484 --75.9594 --75.9391 --75.9484 --75.9516 --75.9359 --75.9344 --75.9547 --75.9469 --75.9375 --75.9437 --75.9375 --75.9406 --75.95 --75.9437 --75.9437 --75.9422 --75.9406 --75.9453 --75.9484 --75.9437 --75.9344 --75.9297 --75.9297 --75.9297 --75.9234 --75.9281 --75.9453 --75.9328 --75.9328 --75.9359 --75.9328 --75.9328 --75.9453 --75.9391 --75.9234 --75.9375 --75.9563 --75.9328 --75.9375 --75.9359 --75.9469 --75.9422 --75.9375 --75.9328 --75.9406 --75.9437 --75.9281 --75.9375 --75.9406 --75.9313 --75.9281 --75.925 --75.9313 --75.9375 --75.95 --75.9422 --75.9531 --75.9469 --75.9531 --75.9344 --75.9516 --75.9437 --75.9266 --75.9375 --75.9391 --75.9516 --75.9344 --75.9391 --75.9469 --75.9406 --75.9406 --75.9484 --75.9313 --75.9422 --75.9391 --75.9484 --75.9359 --75.9609 --75.9406 --75.9516 --75.9469 --75.9453 --75.9422 --75.9359 --75.9453 --75.9484 --75.9437 --75.9391 --75.95 --75.95 --75.9469 --75.9422 --75.9437 --75.9313 --75.9437 --75.9484 --75.9359 --75.9313 --75.9391 --75.9422 --75.9422 --75.9266 --75.9344 --75.9328 --75.9313 --75.9453 --75.9406 --75.9406 --75.9266 --75.9375 --75.9359 --75.9344 --75.9313 --75.9375 --75.9328 --75.9391 --75.9344 --75.9484 --75.9437 --75.9406 --75.9453 --75.9391 --75.9328 --75.9437 --75.9422 --75.9391 --75.9422 --75.9281 --75.9516 --75.9359 --75.9344 --75.9406 --75.9437 --75.9437 --75.9437 --75.9359 --75.9437 --75.9391 --75.9422 --75.9422 --75.9516 --75.9531 --75.9437 --75.95 --75.9453 --75.9375 --75.9391 --75.9406 --75.9516 --75.9406 --75.9437 --75.9484 --75.9469 --75.9594 --75.9484 --75.9516 --75.9328 --75.9453 --75.9297 --75.9391 --75.9437 --75.9406 --75.9313 --75.9359 --75.9359 --75.9344 --75.9281 --75.9437 --75.9531 --75.9391 --75.9531 --75.9422 --75.9469 --75.9344 --75.9406 --75.9469 --75.9594 --75.9344 --75.9281 --75.9484 --75.9516 --75.9406 --75.9422 --75.9359 --75.9422 --75.9375 --75.9297 --75.9437 --75.9328 --75.9266 --75.9453 --75.9313 --75.9375 --75.9453 --75.9266 --75.9297 --75.9281 --75.9406 --75.9406 --75.9266 --75.9453 --75.9437 --75.9422 --75.9422 --75.95 --75.9406 --75.9469 --75.9344 --75.9344 --75.9344 --75.9297 --75.9297 --75.9313 --75.9344 --75.9437 --75.9469 --75.9281 --75.9359 --75.9344 --75.9359 --75.9422 --75.9422 --75.9344 --75.9391 --75.9516 --75.95 --75.9359 --75.9437 --75.9344 --75.9328 --75.9391 --75.9375 --75.9469 --75.9391 --75.9313 --75.9484 --75.9578 --75.9453 --75.9406 --75.9609 --75.9484 --75.9453 --75.9594 --75.9531 --75.9375 --75.9484 --75.95 --75.9531 --75.9563 --75.9531 --75.9516 --75.9344 --75.9516 --75.9422 --75.9453 --75.9437 --75.9437 --75.9422 --75.9516 --75.9469 --75.9328 --75.9469 --75.9437 --75.9391 --75.9453 --75.9391 --75.9391 --75.9406 --75.9391 --75.9469 --75.9328 --75.9391 --75.9406 --75.9422 --75.9313 --75.9422 --75.9453 --75.9375 --75.9359 --75.9453 --75.9437 --75.9297 --75.9313 --75.9391 --75.9422 --75.9375 --75.9359 --75.9563 --75.9406 --75.9422 --75.9406 --75.9359 --75.9484 --75.9391 --75.9422 --75.925 --75.9469 --75.9281 --75.9469 --75.9453 --75.9422 --75.9516 --75.9328 --75.9531 --75.9359 --75.9422 --75.9391 --75.9547 --75.9469 --75.9313 --75.9547 --75.9453 --75.9422 --75.9469 --75.9547 --75.9297 --75.9484 --75.9469 --75.9437 --75.95 --75.95 --75.9531 --75.9453 --75.95 --75.9391 --75.9484 --75.9531 --75.9609 --75.9469 --75.9422 --75.9516 --75.9578 --75.9469 --75.9516 --75.9375 --75.9328 --75.9344 --75.9563 --75.9437 --75.9437 --75.9453 --75.9391 --75.9484 --75.9437 --75.9422 --75.95 --75.9516 --75.9531 --75.9328 --75.9594 --75.9437 --75.9453 --75.9484 --75.9422 --75.9406 --75.9453 --75.9375 --75.9328 --75.9484 --75.9469 --75.9391 --75.9391 --75.95 --75.9437 --75.9422 --75.95 --75.9516 --75.9516 --75.9516 --75.9422 --75.9469 --75.9578 --75.9375 --75.9406 --75.9516 --75.9469 --75.9469 --75.9375 --75.9516 --75.9516 --75.9406 --75.9437 --75.9344 --75.9375 --75.9453 --75.9297 --75.9609 --75.95 --75.9437 --75.9406 --75.9594 --75.9453 --75.9484 --75.9406 --75.9453 --75.9375 --75.9453 --75.9484 --75.95 --75.9437 --75.95 --75.9391 --75.9484 --75.9547 --75.9281 --75.9609 --75.9391 --75.9359 --75.9469 --75.9344 --75.9297 --75.9453 --75.9391 --75.9469 --75.9547 --75.9391 --75.9531 --75.9453 --75.9328 --75.9406 --75.9437 --75.9344 --75.9391 --75.9406 --75.9563 --75.9359 --75.9422 --75.9422 --75.95 --75.9516 --75.9469 --75.9484 --75.9406 --75.9531 --75.9578 --75.9453 --75.9531 --75.9484 --75.9469 --75.9297 --75.9531 --75.9391 --75.95 --75.9437 --75.9375 --75.9375 --75.9453 --75.95 --75.9422 --75.9516 --75.9469 --75.9375 --75.95 --75.95 --75.9453 --75.9469 --75.95 --75.9516 --75.9406 --75.9328 --75.9547 --75.9375 --75.9406 --75.9563 --75.9391 --75.9453 --75.9516 --75.9656 --75.9437 --75.9484 --75.9609 --75.9547 --75.9547 --75.9437 --75.9625 --75.9594 --75.9422 --75.9297 --75.9578 --75.9703 --75.9359 --75.9344 --75.9516 --75.9437 --75.9422 --75.9547 --75.9422 --75.9578 --75.9359 --75.9422 --75.9406 --75.9484 --75.9203 --75.9406 --75.9453 --75.9453 --75.9375 --75.9437 --75.9594 --75.9719 --75.95 --75.9547 --75.9531 --75.9578 --75.9359 --75.9469 --75.9437 --75.95 --75.9375 --75.9578 --75.9297 --75.9422 --75.9359 --75.9516 --75.95 --75.9422 --75.9344 --75.9297 --75.9375 --75.9406 --75.9344 --75.9422 --75.9328 --75.9375 --75.9328 --75.9266 --75.9391 --75.9516 --75.95 --75.9453 --75.9375 --75.9437 --75.9406 --75.9531 --75.9453 --75.9406 --75.9484 --75.9453 --75.9469 --75.9437 --75.95 --75.9531 --75.9531 --75.9594 --75.9453 --75.9437 --75.9563 --75.9469 --75.9563 --75.9469 --75.9563 --75.9469 --75.9516 --75.9406 --75.9422 --75.9484 --75.9328 --75.9484 --75.9406 --75.9469 --75.9375 --75.9437 --75.9469 --75.9469 --75.9516 --75.9406 --75.9391 --75.9531 --75.9516 --75.9422 --75.9594 --75.9641 --75.9625 --75.9391 --75.95 --75.9484 --75.95 --75.9609 --75.9641 --75.9484 --75.9516 --75.9547 --75.9484 --75.9516 --75.9375 --75.9391 --75.9422 --75.9391 --75.9547 --75.9422 --75.9297 --75.9422 --75.9531 --75.9469 --75.9437 --75.9703 --75.9578 --75.9422 --75.9484 --75.9406 --75.9422 --75.9516 --75.9406 --75.9516 --75.9484 --75.9516 --75.9469 --75.9406 --75.95 --75.9422 --75.9563 --75.9422 --75.9578 --75.9344 --75.9406 --75.9391 --75.9531 --75.9391 --75.9547 --75.9578 --75.95 --75.9484 --75.9594 --75.9406 --75.9422 --75.9344 --75.9516 --75.9484 --75.9391 --75.9437 --75.9469 --75.9328 --75.9453 --75.9453 --75.9469 --75.9453 --75.9422 --75.9375 --75.9578 --75.9469 --75.9328 --75.9297 --75.9375 --75.9516 --75.9469 --75.9469 --75.9516 --75.9391 --75.9469 --75.9531 --75.9375 --75.9437 --75.9328 --75.9516 --75.9313 --75.9453 --75.9422 --75.9453 --75.9469 --75.9453 --75.9594 --75.9469 --75.95 --75.9469 --75.9484 --75.9516 --75.9359 --75.9469 --75.9422 --75.9484 --75.9422 --75.9469 --75.9594 --75.95 --75.9391 --75.9328 --75.9469 --75.9437 --75.9313 --75.9531 --75.9547 --75.9563 --75.9437 --75.9484 --75.95 --75.95 --75.9313 --75.9406 --75.9437 --75.9453 --75.9328 --75.9328 --75.9437 --75.9391 --75.9422 --75.9375 --75.9359 --75.9359 --75.9328 --75.9563 --75.9437 --75.9422 --75.9437 --75.9469 --75.95 --75.9469 --75.9391 --75.9375 --75.9375 --75.9344 --75.9422 --75.9437 --75.9437 --75.9484 --75.9453 --75.9375 --75.9516 --75.9328 --75.95 --75.9328 --75.9484 --75.9469 --75.9516 --75.9453 --75.9484 --75.9484 --75.9531 --75.9563 --75.9406 --75.9563 --75.9516 --75.9531 --75.9437 --75.9469 --75.9531 --75.95 --75.9516 --75.9531 --75.9578 --75.9437 --75.9469 --75.9453 --75.95 --75.9516 --75.95 --75.9531 --75.9484 --75.9469 --75.9578 --75.9641 --75.95 --75.9344 --75.9422 --75.9516 --75.9422 --75.9484 --75.9609 --75.9547 --75.9422 --75.95 --75.9516 --75.9453 --75.9578 --75.9609 --75.9578 --75.9563 --75.9484 --75.9531 --75.9547 --75.9594 --75.9578 --75.9594 --75.9563 --75.9547 --75.9625 --75.9641 --75.9609 --75.9656 --75.9531 --75.9641 --75.9547 --75.9422 --75.9516 --75.9563 --75.9453 --75.9453 --75.9547 --75.9484 --75.9625 --75.9547 --75.9609 --75.9422 --75.9437 --75.9578 --75.9547 --75.95 --75.9516 --75.9641 --75.9453 --75.9531 --75.9469 --75.9531 --75.9422 --75.9453 --75.9391 --75.9594 --75.9359 --75.9437 --75.9594 --75.9297 --75.9547 --75.9484 --75.9609 --75.9547 --75.9766 --75.9531 --75.9453 --75.9734 --75.9594 --75.9531 --75.9547 --75.9375 --75.9594 --75.9641 --75.9531 --75.9641 --75.9531 --75.9625 --75.9516 --75.9391 --75.9531 --75.9547 --75.9656 --75.9469 --75.9516 --75.9437 --75.9469 --75.9484 --75.9563 --75.95 --75.9469 --75.9609 --75.9547 --75.9422 --75.9625 --75.9516 --75.9609 --75.95 --75.9484 --75.9578 --75.9531 --75.9453 --75.9531 --75.9625 --75.9406 --75.9516 --75.9516 --75.95 --75.9469 --75.9531 --75.9578 --75.9641 --75.95 --75.9578 --75.9484 --75.9641 --75.9516 --75.9516 --75.9766 --75.9469 --75.9453 --75.9484 --75.9484 --75.9531 --75.9594 --75.9641 --75.95 --75.9484 --75.9484 --75.9547 --75.95 --75.9719 --75.9453 --75.9484 --75.9422 --75.9516 --75.9656 --75.9516 --75.9594 --75.9625 --75.9594 --75.9625 --75.9594 --75.9578 --75.9563 --75.9734 --75.9563 --75.9656 --75.9641 --75.9516 --75.9703 --75.9531 --75.9547 --75.9594 --75.9594 --75.9656 --75.9609 --75.9625 --75.9672 --75.9719 --75.9641 --75.9484 --75.9688 --75.9594 --75.95 --75.9609 --75.95 --75.9422 --75.9547 --75.9563 --75.9625 --75.9547 --75.9484 --75.9531 --75.9563 --75.9531 --75.9563 --75.95 --75.9547 --75.9625 --75.9609 --75.9563 --75.9609 --75.9625 --75.9531 --75.9531 --75.9688 --75.9641 --75.9594 --75.9625 --75.9563 --75.9672 --75.975 --75.9656 --75.9641 --75.9578 --75.9547 --75.9609 --75.9469 --75.975 --75.9469 --75.9563 --75.9641 --75.9563 --75.9703 --75.9625 --75.9625 --75.9703 --75.9656 --75.9563 --75.9703 --75.9547 --75.9719 --75.9641 --75.9719 --75.9516 --75.9625 --75.9578 --75.9688 --75.9469 --75.9547 --75.9391 --75.9734 --75.9484 --75.9531 --75.9484 --75.9531 --75.9531 --75.9547 --75.9484 --75.9609 --75.95 --75.9594 --75.975 --75.9594 --75.9625 --75.9391 --75.9516 --75.95 --75.9563 --75.9656 --75.9578 --75.9578 --75.9594 --75.9625 --75.9594 --75.9469 --75.9484 --75.9531 --75.9625 --75.9656 --75.9516 --75.9578 --75.9578 --75.9594 --75.9453 --75.9516 --75.9453 --75.9641 --75.9391 --75.9484 --75.9453 --75.9422 --75.9609 --75.9563 --75.9688 --75.9609 --75.9328 --75.9437 --75.9594 --75.9453 --75.9531 --75.9688 --75.9516 --75.9469 --75.9594 --75.9625 --75.9516 --75.9547 --75.9469 --75.9563 --75.9375 --75.9422 --75.9516 --75.9453 --75.9516 --75.9531 --75.95 --75.9313 --75.9406 --75.9422 --75.9391 --75.9516 --75.9547 --75.9453 --75.9547 --75.9422 --75.95 --75.9531 --75.9375 --75.9375 --75.9453 --75.9594 --75.9437 --75.95 --75.9453 --75.9437 --75.9484 --75.9391 --75.9422 --75.9484 --75.9484 --75.9375 --75.9453 --75.9547 --75.9328 --75.9359 --75.9484 --75.9531 --75.9437 --75.95 --75.9563 --75.9516 --75.9609 --75.9516 --75.9516 --75.9328 --75.9641 --75.9469 --75.9437 --75.9391 --75.95 --75.9484 --75.9625 --75.9437 --75.95 --75.9531 --75.9453 --75.9547 --75.9547 --75.9313 --75.9469 --75.9469 --75.9531 --75.9437 --75.9406 --75.9437 --75.9469 --75.9437 --75.9313 --75.9625 --75.9422 --75.9484 --75.9391 --75.9516 --75.9375 --75.9391 --75.9437 --75.9344 --75.95 --75.9422 --75.9469 --75.9516 --75.9391 --75.95 --75.9437 --75.9453 --75.9547 --75.95 --75.9516 --75.9609 --75.9391 --75.9516 --75.9344 --75.9547 --75.9688 --75.9531 --75.9609 --75.9641 --75.9484 --75.9516 --75.9547 --75.9484 --75.9594 --75.9484 --75.9391 --75.9469 --75.95 --75.9391 --75.9594 --75.9484 --75.9516 --75.9422 --75.9594 --75.9625 --75.9531 --75.9516 --75.9547 --75.9453 --75.95 --75.9391 --75.9563 --75.9547 --75.9484 --75.9453 --75.9516 --75.9625 --75.9547 --75.9547 --75.9469 --75.9391 --75.9625 --75.9547 --75.9437 --75.9547 --75.9391 --75.9609 --75.9594 --75.9516 --75.95 --75.9594 --75.9406 --75.9578 --75.9516 --75.9422 --75.9547 --75.95 --75.9641 --75.9531 --75.9594 --75.9563 --75.95 --75.9516 --75.9516 --75.9484 --75.9547 --75.9422 --75.9547 --75.9594 --75.9484 --75.9641 --75.9422 --75.9594 --75.95 --75.9531 --75.9547 --75.95 --75.9656 --75.9469 --75.9469 --75.9625 --75.9625 --75.9625 --75.9672 --75.9563 --75.9609 --75.9516 --75.9625 --75.9609 --75.9609 --75.9719 --75.9641 --75.9563 --75.95 --75.9547 --75.9672 --75.9547 --75.9641 --75.9594 --75.9516 --75.9609 --75.9594 --75.9469 --75.9594 --75.9609 --75.9563 --75.9641 --75.9578 --75.9719 --75.9594 --75.9594 --75.9672 --75.9609 --75.9563 --75.9641 --75.9672 --75.9516 --75.9578 --75.9547 --75.9563 --75.9734 --75.9609 --75.9672 --75.9516 --75.9563 --75.9688 --75.9563 --75.9578 --75.9594 --75.9578 --75.9594 --75.9734 --75.9484 --75.9625 --75.95 --75.9688 --75.9484 --75.9641 --75.9594 --75.9672 --75.9594 --75.9797 --75.9734 --75.9828 --75.9578 --75.9656 --75.9594 --75.9641 --75.9609 --75.9594 --75.9625 --75.9437 --75.9641 --75.9609 --75.9609 --75.9703 --75.975 --75.9656 --75.9703 --75.9688 --75.9781 --75.9656 --75.9547 --75.9688 --75.9578 --75.9656 --75.975 --75.9672 --75.9469 --75.9688 --75.9781 --75.9812 --75.9609 --75.9766 --75.9625 --75.9688 --75.9844 --75.9922 --75.9734 --75.9719 --75.9688 --75.9906 --75.9812 --75.9703 --75.975 --75.9672 --75.9844 --75.9734 --75.9703 --75.9688 --75.9719 --75.9719 --75.9734 --75.9734 --75.9594 --75.9609 --75.9672 --75.9656 --75.9563 --75.9688 --75.9688 --75.9563 --75.9531 --75.9672 --75.9672 --75.9703 --75.9641 --75.9703 --75.9578 --75.9734 --75.9641 --75.9656 --75.9609 --75.9734 --75.9594 --75.9656 --75.975 --75.9625 --75.9578 --75.9672 --75.9797 --75.9688 --75.9656 --75.9547 --75.9656 --75.9469 --75.9547 --75.9547 --75.9594 --75.9516 --75.9625 --75.9625 --75.9563 --75.9656 --75.9578 --75.9766 --75.9734 --75.975 --75.9609 --75.9641 --75.9703 --75.9672 --75.9609 --75.9797 --75.9703 --75.9766 --75.9797 --75.9812 --75.9781 --75.9703 --75.9906 --75.9656 --75.9688 --75.9703 --75.9734 --75.9766 --75.9797 --75.9688 --75.975 --75.975 --75.9641 --75.9781 --75.9797 --75.9812 --75.9672 --75.9641 --75.975 --75.9672 --75.9781 --75.9781 --75.9781 --75.9797 --75.9781 --75.9797 --75.9719 --75.9703 --75.975 --75.9703 --75.9781 --75.9656 --75.9688 --75.9656 --75.9797 --75.9703 --75.975 --75.9719 --75.9688 --75.9578 --75.9703 --75.9563 --75.9437 --75.9563 --75.9688 --75.9594 --75.9578 --75.9672 --75.9547 --75.9578 --75.9578 --75.9578 --75.9578 --75.9578 --75.9531 --75.9578 --75.9672 --75.9609 --75.9484 --75.9484 --75.9547 --75.9578 --75.9703 --75.9703 --75.9531 --75.9688 --75.9563 --75.95 --75.9609 --75.9703 --75.9703 --75.9516 --75.9688 --75.9703 --75.9703 --75.9578 --75.9766 --75.9609 --75.9703 --75.9594 --75.9734 --75.9797 --75.9641 --75.9781 --75.9812 --75.975 --75.9625 --75.9828 --75.9672 --75.9797 --75.9641 --75.9609 --75.9734 --75.9781 --75.9672 --75.9625 --75.9672 --75.9703 --75.9578 --75.9641 --75.9672 --75.9547 --75.9594 --75.9594 --75.9547 --75.9531 --75.9609 --75.9609 --75.9484 --75.9437 --75.9625 --75.9547 --75.9563 --75.9656 --75.9656 --75.9453 --75.9609 --75.9516 --75.9531 --75.9516 --75.9484 --75.95 --75.9625 --75.9437 --75.9453 --75.9672 --75.975 --75.9594 --75.9656 --75.9641 --75.9531 --75.9609 --75.9516 --75.9516 --75.9656 --75.9484 --75.9719 --75.9594 --75.9437 --75.95 --75.9453 --75.9406 --75.9375 --75.9391 --75.95 --75.95 --75.9594 --75.9516 --75.9328 --75.9484 --75.9594 --75.9625 --75.9563 --75.9531 --75.9469 --75.95 --75.9469 --75.9547 --75.9484 --75.9563 --75.9625 --75.9547 --75.9641 --75.975 --75.975 --75.9703 --75.9563 --75.9625 --75.9563 --75.9625 --75.9656 --75.9594 --75.9563 --75.9516 --75.9594 --75.9516 --75.9672 --75.9578 --75.9563 --75.9625 --75.9594 --75.9578 --75.9531 --75.9484 --75.9516 --75.9656 --75.9484 --75.9547 --75.9563 --75.9609 --75.9781 --75.9609 --75.9672 --75.9656 --75.9672 --75.9641 --75.9563 --75.9547 --75.9609 --75.9484 --75.9609 --75.9672 --75.9578 --75.9719 --75.9766 --75.9812 --75.9578 --75.9688 --75.9766 --75.9594 --75.9547 --75.9641 --75.9688 --75.9656 --75.9563 --75.9641 --75.9766 --75.975 --75.9625 --75.9625 --75.9766 --75.9563 --75.9609 --75.9594 --75.9734 --75.9734 --75.9812 --75.9578 --75.9688 --75.9594 --75.9703 --75.9703 --75.9641 --75.9719 --75.9797 --75.9719 --75.9781 --75.9656 --75.9516 --75.9656 --75.9594 --75.9719 --75.9609 --75.9609 --75.975 --75.9703 --75.9625 --75.9609 --75.9703 --75.975 --75.9656 --75.9875 --75.9672 --75.975 --75.9766 --75.9594 --75.9609 --75.975 --75.975 --75.9609 --75.9547 --75.9719 --75.9547 --75.9672 --75.9594 --75.9578 --75.9594 --75.9797 --75.9656 --75.9812 --75.9703 --75.9672 --75.9656 --75.9609 --75.9688 --75.9609 --75.9563 --75.9719 --75.9766 --75.9641 --75.9672 --75.9641 --75.9766 --75.9625 --75.9812 --75.9672 --75.975 --75.9781 --75.9703 --75.9703 --75.9641 --75.9766 --75.9625 --75.9625 --75.9594 --75.9719 --75.9688 --75.9672 --75.9531 --75.9703 --75.9594 --75.9594 --75.9688 --75.9672 --75.9734 --75.9688 --75.9656 --75.9781 --75.9703 --75.9641 --75.9656 --75.9609 --75.9625 --75.975 --75.9781 --75.975 --75.9812 --75.9672 --75.9672 --75.9672 --75.9625 --75.9797 --75.9719 --75.9672 --75.975 --75.9734 --75.9719 --75.9719 --75.9672 --75.9766 --75.9734 --75.9781 --75.9734 --75.9734 --75.9766 --75.9781 --75.9781 --75.9672 --75.9734 --75.9797 --75.9781 --75.9719 --75.9719 --75.975 --75.9766 --75.9625 --75.9734 --75.9719 --75.9641 --75.9609 --75.9578 --75.9594 --75.9703 --75.9844 --75.9719 --75.9719 --75.9734 --75.9719 --75.9734 --75.975 --75.9688 --75.9781 --75.9594 --75.9641 --75.9703 --75.9688 --75.9641 --75.9766 --75.9828 --75.9719 --75.9719 --75.9734 --75.9719 --75.9828 --75.9812 --75.9781 --75.975 --75.9641 --75.9797 --75.9688 --75.9781 --75.9828 --75.9906 --75.9859 --75.9719 --75.9734 --75.9828 --75.9875 --75.9938 --75.9734 --75.9875 --75.9766 --75.9766 --75.9719 --75.9859 --75.9672 --75.9797 --75.9844 --75.9781 --75.9906 --75.9875 --75.9859 --75.9797 --75.9859 --75.9547 --75.9719 --75.9641 --75.9656 --75.9812 --75.975 --75.9812 --75.9828 --75.9828 --75.9766 --75.9734 --75.9859 --75.9641 --75.9609 --75.9641 --75.9641 --75.9703 --75.9812 --75.9641 --75.9578 --75.9812 --75.9781 --75.9609 --75.9656 --75.9688 --75.9719 --75.9625 --75.9563 --75.9688 --75.9734 --75.975 --75.9781 --75.9656 --75.9672 --75.9641 --75.9734 --75.9703 --75.9781 --75.9688 --75.9641 --75.9641 --75.9609 --75.9672 --75.9641 --75.9656 --75.9625 --75.9672 --75.9578 --75.9625 --75.9734 --75.9656 --75.9563 --75.9625 --75.9563 --75.9703 --75.9531 --75.9594 --75.9734 --75.9672 --75.9859 --75.9688 --75.9594 --75.9563 --75.9609 --75.9547 --75.9625 --75.9781 --75.9578 --75.9844 --75.9766 --75.9719 --75.9688 --75.9719 --75.9844 --75.9781 --75.9734 --75.9594 --75.9719 --75.9781 --75.9703 --75.9703 --75.9656 --75.9656 --75.975 --75.9672 --75.9641 --75.9703 --75.975 --75.9688 --75.975 --75.9688 --75.9578 --75.9594 --75.9688 --75.9812 --75.9797 --75.9828 --75.9875 --75.9703 --75.975 --75.9516 --75.9703 --75.9594 --75.9625 --75.9641 --75.9672 --75.9828 --75.9844 --75.9766 --75.9734 --75.9781 --75.9797 --75.9656 --75.975 --75.9734 --75.9828 --75.9703 --75.9547 --75.9703 --75.9594 --75.9578 --75.9594 --75.9672 --75.9859 --75.9734 --75.9719 --75.9734 --75.9688 --75.9688 --75.9766 --75.9703 --75.975 --75.975 --75.9797 --75.9766 --75.9734 --75.9875 --75.9703 --75.9797 --75.9906 --75.9828 --75.9797 --75.9812 --75.975 --75.9734 --75.9672 --75.975 --75.9688 --75.9547 --75.9719 --75.9859 --75.9828 --75.9672 --75.9688 --75.9859 --75.9734 --75.9828 --75.9844 --75.9672 --75.9797 --75.975 --75.9859 --75.9922 --75.9891 --75.9766 --75.9828 --75.9734 --75.9609 --75.9828 --75.9859 --75.9859 --75.9844 --76 --75.9766 --75.9797 --75.9672 --75.9812 --75.9781 --75.975 --75.975 --75.9703 --75.9812 --75.9891 --75.9875 --75.9797 --75.9906 --75.9828 --75.9844 --75.9844 --75.9938 --75.9766 --75.9797 --75.9859 --75.9906 --75.9797 --75.9875 --75.9797 --75.9703 --75.9844 --75.9859 --75.9875 --75.9875 --75.975 --75.9969 --75.9734 --75.9906 --75.9891 --75.9859 --75.9844 --75.9812 --75.975 --75.9812 --75.9781 --75.9812 --75.9781 --75.9766 --75.9859 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.9828 --75.9703 --75.975 --75.9641 --75.9641 --75.9547 --75.9719 --75.95 --75.9625 --75.975 --75.9563 --75.9672 --75.9594 --75.9672 --75.9594 --75.9672 --75.9734 --75.95 --75.9734 --75.9766 --75.95 --75.9766 --75.9719 --75.9531 --75.9547 --75.9625 --75.9672 --75.9625 --75.9703 --75.9812 --75.9766 --75.9547 --75.9641 --75.9578 --75.9672 --75.9578 --75.9797 --75.9703 --75.9578 --75.9609 --75.9625 --75.9563 --75.9688 --75.9609 --75.9656 --75.9672 --75.9625 --75.9484 --75.9547 --75.9547 --75.9484 --75.9656 --75.9625 --75.9609 --75.9578 --75.9688 --75.9547 --75.9703 --75.9563 --75.9563 --75.9609 --75.9437 --75.9703 --75.9672 --75.9578 --75.9578 --75.9641 --75.9563 --75.9656 --75.95 --75.9547 --75.9688 --75.95 --75.9656 --75.9625 --75.9563 --75.9563 --75.9547 --75.9484 --75.9609 --75.9594 --75.9609 --75.9578 --75.9531 --75.9672 --75.9609 --75.9469 --75.9656 --75.9625 --75.9578 --75.9531 --75.9484 --75.9703 --75.9656 --75.9672 --75.9656 --75.9656 --75.9437 --75.9594 --75.95 --75.9516 --75.9641 --75.9641 --75.9656 --75.9703 --75.975 --75.9672 --75.9594 --75.9703 --75.9578 --75.9844 --75.9719 --75.9672 --75.9656 --75.95 --75.9656 --75.9766 --75.9656 --75.9688 --75.9812 --75.9672 --75.9656 --75.9734 --75.9672 --75.9516 --75.9656 --75.9641 --75.9625 --75.9688 --75.9719 --75.9578 --75.9656 --75.975 --75.9688 --75.9688 --75.9672 --75.9781 --75.9516 --75.9547 --75.9625 --75.975 --75.9547 --75.9656 --75.9594 --75.9672 --75.9766 --75.9719 --75.9766 --75.9641 --75.9703 --75.9688 --75.9547 --75.9672 --75.9609 --75.9656 --75.9625 --75.975 --75.9703 --75.9625 --75.9641 --75.9609 --75.9703 --75.9688 --75.9672 --75.9672 --75.975 --75.9828 --75.9688 --75.9641 --75.9578 --75.9719 --75.9734 --75.9656 --75.9703 --75.9609 --75.9734 --75.9578 --75.9703 --75.9688 --75.9734 --75.9625 --75.9688 --75.9734 --75.9703 --75.9719 --75.9594 --75.9609 --75.9609 --75.9641 --75.9625 --75.9703 --75.9563 --75.9594 --75.9531 --75.9734 --75.9547 --75.9688 --75.9734 --75.9766 --75.9641 --75.9672 --75.9797 --75.9703 --75.9688 --75.9531 --75.9578 --75.9609 --75.9594 --75.9437 --75.9578 --75.9688 --75.9578 --75.9594 --75.9641 --75.9656 --75.9578 --75.9453 --75.9641 --75.9578 --75.9484 --75.9625 --75.9578 --75.9484 --75.9594 --75.9484 --75.9578 --75.9547 --75.95 --75.9531 --75.9391 --75.9563 --75.9609 --75.9594 --75.9656 --75.9672 --75.9594 --75.9625 --75.9641 --75.9703 --75.9609 --75.9688 --75.9547 --75.9547 --75.9547 --75.9469 --75.9578 --75.9625 --75.9531 --75.9484 --75.95 --75.9688 --75.9547 --75.9484 --75.9547 --75.9641 --75.9422 --75.9422 --75.9594 --75.9656 --75.9563 --75.9453 --75.9516 --75.9641 --75.9656 --75.9547 --75.9547 --75.9516 --75.9641 --75.9609 --75.9516 --75.9563 --75.95 --75.9453 --75.9484 --75.9484 --75.9359 --75.9406 --75.9578 --75.9359 --75.9516 --75.9516 --75.9547 --75.9531 --75.9641 --75.9531 --75.9578 --75.9563 --75.95 --75.9547 --75.9641 --75.9391 --75.95 --75.9547 --75.9469 --75.9516 --75.9484 --75.9328 --75.9563 --75.9391 --75.9516 --75.9437 --75.9313 --75.9516 --75.9578 --75.9516 --75.9578 --75.9531 --75.9641 --75.9516 --75.9641 --75.9578 --75.9703 --75.9641 --75.9625 --75.9641 --75.9656 --75.9594 --75.9578 --75.9594 --75.95 --75.9703 --75.9547 --75.9656 --75.9563 --75.9625 --75.9672 --75.9531 --75.9469 --75.9688 --75.9594 --75.9594 --75.9469 --75.9609 --75.9516 --75.95 --75.9437 --75.9609 --75.9672 --75.9484 --75.9531 --75.9563 --75.9469 --75.9516 --75.95 --75.9656 --75.9484 --75.9688 --75.9531 --75.9672 --75.9516 --75.9531 --75.9656 --75.9578 --75.9625 --75.9609 --75.95 --75.9563 --75.9547 --75.9484 --75.9594 --75.9531 --75.9594 --75.9531 --75.9469 --75.9594 --75.9578 --75.9469 --75.9531 --75.9563 --75.9547 --75.9516 --75.9516 --75.9516 --75.9453 --75.9469 --75.9563 --75.9625 --75.9484 --75.9641 --75.9563 --75.9484 --75.9516 --75.9484 --75.9547 --75.9672 --75.95 --75.9453 --75.9453 --75.9625 --75.9641 --75.9609 --75.9547 --75.9625 --75.9594 --75.9688 --75.9547 --75.9703 --75.9578 --75.9672 --75.9484 --75.9453 --75.9609 --75.9453 --75.9563 --75.9578 --75.95 --75.95 --75.9531 --75.9547 --75.9531 --75.9563 --75.9516 --75.9625 --75.9484 --75.95 --75.9641 --75.9406 --75.9391 --75.9484 --75.9484 --75.9344 --75.9437 --75.9391 --75.9406 --75.95 --75.9531 --75.9484 --75.9422 --75.9391 --75.9516 --75.9484 --75.95 --75.9625 --75.9531 --75.9422 --75.9609 --75.9375 --75.9344 --75.9266 --75.9625 --75.9375 --75.9484 --75.9578 --75.9391 --75.95 --75.9484 --75.95 --75.9531 --75.9688 --75.9469 --75.9484 --75.9437 --75.9516 --75.9437 --75.9609 --75.9484 --75.9484 --75.9609 --75.9406 --75.9563 --75.9469 --75.9453 --75.9406 --75.9625 --75.9531 --75.9547 --75.9391 --75.9422 --75.9578 --75.9484 --75.9547 --75.9516 --75.9547 --75.9531 --75.9547 --75.9609 --75.9484 --75.9516 --75.9594 --75.9469 --75.9453 --75.9516 --75.9578 --75.9391 --75.9547 --75.9578 --75.9484 --75.9484 --75.95 --75.9547 --75.9547 --75.9484 --75.9422 --75.9563 --75.9547 --75.9375 --75.9469 --75.9547 --75.9563 --75.9563 --75.9469 --75.95 --75.9609 --75.9594 --75.9437 --75.9453 --75.9609 --75.9328 --75.9406 --75.9266 --75.9516 --75.9484 --75.9453 --75.9437 --75.9453 --75.9359 --75.9297 --75.9328 --75.925 --75.9359 --75.9422 --75.9359 --75.9484 --75.9531 --75.9484 --75.9297 --75.9531 --75.9359 --75.95 --75.9437 --75.9484 --75.9453 --75.9406 --75.9422 --75.9437 --75.9484 --75.9437 --75.9375 --75.9391 --75.95 --75.9453 --75.9516 --75.95 --75.9531 --75.9516 --75.9547 --75.9563 --75.9484 --75.9641 --75.9469 --75.9484 --75.9422 --75.9484 --75.9516 --75.9625 --75.95 --75.9437 --75.9469 --75.9578 --75.9516 --75.9563 --75.9594 --75.9578 --75.9578 --75.9266 --75.9469 --75.9563 --75.9469 --75.9625 --75.9547 --75.9578 --75.9516 --75.9578 --75.9406 --75.9516 --75.9594 --75.9641 --75.9578 --75.9656 --75.9734 --75.9625 --75.9656 --75.9547 --75.9563 --75.9578 --75.9656 --75.9531 --75.9547 --75.9516 --75.9531 --75.9406 --75.95 --75.95 --75.9437 --75.9484 --75.9516 --75.9563 --75.9391 --75.9422 --75.9453 --75.9469 --75.9594 --75.9422 --75.9484 --75.9609 --75.9531 --75.9547 --75.9563 --75.9547 --75.9547 --75.9484 --75.9609 --75.9594 --75.9547 --75.9609 --75.9609 --75.9516 --75.9437 --75.9453 --75.9437 --75.9453 --75.9422 --75.9484 --75.9469 --75.9594 --75.9406 --75.9609 --75.9484 --75.9437 --75.95 --75.9625 --75.9594 --75.9531 --75.9531 --75.9578 --75.9641 --75.9469 --75.9563 --75.9594 --75.9656 --75.9609 --75.9453 --75.9422 --75.9422 --75.9469 --75.9578 --75.95 --75.9578 --75.9625 --75.9578 --75.9547 --75.9719 --75.9594 --75.9578 --75.9656 --75.9609 --75.9641 --75.9547 --75.9484 --75.9594 --75.9625 --75.9641 --75.9484 --75.9437 --75.9422 --75.9563 --75.9469 --75.9453 --75.9563 --75.9578 --75.9469 --75.95 --75.9391 --75.9453 --75.9563 --75.9563 --75.9672 --75.9578 --75.9359 --75.9594 --75.9516 --75.9469 --75.9406 --75.9594 --75.9531 --75.95 --75.9453 --75.9656 --75.9672 --75.9484 --75.9484 --75.95 --75.9578 --75.9375 --75.9422 --75.9516 --75.9484 --75.95 --75.9453 --75.9578 --75.9484 --75.9484 --75.9484 --75.9484 --75.9469 --75.9359 --75.9391 --75.9344 --75.9406 --75.9453 --75.9563 --75.95 --75.9406 --75.9547 --75.95 --75.9469 --75.9313 --75.9484 --75.9453 --75.9313 --75.9344 --75.9422 --75.9578 --75.9422 --75.9531 --75.9516 --75.9531 --75.9547 --75.9625 --75.9531 --75.9469 --75.9453 --75.9531 --75.9547 --75.9516 --75.9594 --75.9563 --75.9391 --75.9453 --75.9563 --75.9578 --75.9375 --75.9531 --75.9469 --75.9453 --75.9453 --75.9531 --75.9531 --75.9328 --75.9359 --75.9437 --75.9344 --75.9563 --75.9359 --75.9422 --75.9469 --75.9422 --75.9313 --75.9375 --75.9313 --75.9344 --75.9422 --75.9391 --75.9359 --75.9391 --75.9406 --75.9453 --75.9313 --75.9391 --75.9469 --75.9437 --75.9297 --75.9406 --75.9437 --75.9469 --75.9375 --75.9484 --75.9563 --75.9391 --75.9453 --75.925 --75.9344 --75.9406 --75.9391 --75.9547 --75.9359 --75.9516 --75.9484 --75.9531 --75.9641 --75.9484 --75.9609 --75.9422 --75.9469 --75.9375 --75.9453 --75.9484 --75.95 --75.9641 --75.9359 --75.9422 --75.9453 --75.9516 --75.9297 --75.9531 --75.9469 --75.9609 --75.9391 --75.9484 --75.9344 --75.9563 --75.9547 --75.9594 --75.9484 --75.9547 --75.9422 --75.9453 --75.9734 --75.9625 --75.9563 --75.9547 --75.9578 --75.9656 --75.9609 --75.9422 --75.9531 --75.9609 --75.9563 --75.9484 --75.9516 --75.95 --75.9656 --75.9484 --75.9437 --75.9625 --75.9422 --75.9531 --75.9406 --75.9563 --75.9422 --75.9437 --75.9453 --75.9453 --75.9453 --75.9422 --75.9359 --75.9469 --75.9359 --75.9406 --75.9453 --75.9359 --75.9469 --75.9609 --75.9344 --75.9359 --75.9516 --75.9437 --75.9344 --75.9531 --75.9328 --75.9437 --75.9406 --75.95 --75.9469 --75.9547 --75.9469 --75.9375 --75.9594 --75.95 --75.9469 --75.95 --75.9484 --75.9516 --75.95 --75.9422 --75.9437 --75.9469 --75.9484 --75.9469 --75.9531 --75.9578 --75.9688 --75.95 --75.9516 --75.9422 --75.9484 --75.9547 --75.9313 --75.9422 --75.9484 --75.9266 --75.9281 --75.9547 --75.9563 --75.9328 --75.9375 --75.9422 --75.9328 --75.9313 --75.9484 --75.9437 --75.9375 --75.9375 --75.9391 --75.9359 --75.9391 --75.9328 --75.9469 --75.9344 --75.9344 --75.9484 --75.9328 --75.9344 --75.9437 --75.9313 --75.9453 --75.9391 --75.9406 --75.9547 --75.9375 --75.9437 --75.9469 --75.9328 --75.9266 --75.9359 --75.9437 --75.9328 --75.9359 --75.9391 --75.9375 --75.9484 --75.9375 --75.9391 --75.9453 --75.9422 --75.9375 --75.9375 --75.9266 --75.9422 --75.9422 --75.9422 --75.9563 --75.9359 --75.9313 --75.9344 --75.9391 --75.925 --75.9344 --75.9344 --75.9297 --75.9375 --75.9453 --75.9516 --75.9375 --75.9391 --75.9406 --75.9203 --75.9344 --75.9422 --75.9406 --75.9375 --75.9391 --75.9375 --75.9344 --75.9266 --75.9281 --75.9344 --75.9422 --75.9359 --75.9406 --75.9484 --75.9359 --75.9516 --75.9437 --75.9469 --75.95 --75.9547 --75.95 --75.9469 --75.9422 --75.95 --75.9484 --75.9531 --75.9531 --75.9469 --75.9531 --75.95 --75.9453 --75.9531 --75.9484 --75.9469 --75.9516 --75.9672 --75.9281 --75.9453 --75.9563 --75.9422 --75.9609 --75.9453 --75.9516 --75.9422 --75.9625 --75.9406 --75.9437 --75.9344 --75.9375 --75.9375 --75.9359 --75.9453 --75.9437 --75.9391 --75.9437 --75.9375 --75.9328 --75.9453 --75.9437 --75.9516 --75.9453 --75.9453 --75.9344 --75.9344 --75.9406 --75.95 --75.9547 --75.9469 --75.9563 --75.9578 --75.9484 --75.9578 --75.9484 --75.9516 --75.9328 --75.9578 --75.9375 --75.9531 --75.9578 --75.9437 --75.9531 --75.9625 --75.9484 --75.925 --75.9391 --75.9484 --75.9578 --75.9547 --75.9422 --75.9422 --75.95 --75.9469 --75.9453 --75.9437 --75.9422 --75.9531 --75.9453 --75.9547 --75.9516 --75.9359 --75.9391 --75.9406 --75.9406 --75.9406 --75.9453 --75.9375 --75.9563 --75.9391 --75.9516 --75.9437 --75.9484 --75.9547 --75.9313 --75.9531 --75.9563 --75.9375 --75.9375 --75.925 --75.9172 --75.9453 --75.9422 --75.9437 --75.9422 --75.9437 --75.9344 --75.9328 --75.9437 --75.9422 --75.9359 --75.9406 --75.9375 --75.9375 --75.9406 --75.9375 --75.9594 --75.9484 --75.9516 --75.9359 --75.9391 --75.9484 --75.9313 --75.9344 --75.9359 --75.9281 --75.9391 --75.9359 --75.9328 --75.9328 --75.9406 --75.9484 --75.9359 --75.9344 --75.9297 --75.9297 --75.9328 --75.9313 --75.9422 --75.9234 --75.9219 --75.9281 --75.9234 --75.9328 --75.925 --75.9234 --75.9266 --75.9359 --75.9359 --75.9281 --75.9422 --75.9328 --75.9531 --75.9313 --75.9344 --75.9422 --75.9219 --75.9297 --75.9437 --75.9437 --75.9375 --75.9375 --75.9328 --75.9391 --75.9281 --75.9328 --75.9344 --75.9328 --75.9422 --75.9297 --75.9453 --75.9328 --75.9313 --75.9453 --75.9391 --75.9422 --75.9391 --75.9391 --75.9359 --75.9516 --75.9453 --75.9406 --75.9547 --75.9406 --75.9406 --75.9313 --75.9453 --75.9453 --75.9516 --75.9375 --75.95 --75.9578 --75.9547 --75.9625 --75.9531 --75.9422 --75.9563 --75.9406 --75.9453 --75.95 --75.9516 --75.9531 --75.9469 --75.9469 --75.9453 --75.9516 --75.9547 --75.9437 --75.9437 --75.9406 --75.9422 --75.9234 --75.9391 --75.9391 --75.9516 --75.9422 --75.9484 --75.95 --75.9266 --75.95 --75.9484 --75.9437 --75.95 --75.9578 --75.9453 --75.9563 --75.95 --75.9453 --75.9484 --75.9469 --75.9453 --75.9313 --75.9391 --75.9453 --75.9359 --75.9422 --75.925 --75.9453 --75.9375 --75.9344 --75.9344 --75.95 --75.9328 --75.9422 --75.9375 --75.9266 --75.9406 --75.9406 --75.9516 --75.9406 --75.9531 --75.9453 --75.9375 --75.9281 --75.9453 --75.9437 --75.9187 --75.9406 --75.9266 --75.9219 --75.9187 --75.9328 --75.9422 --75.9328 --75.9422 --75.9359 --75.9422 --75.9266 --75.9406 --75.925 --75.95 --75.9422 --75.95 --75.9391 --75.9266 --75.9328 --75.9297 --75.9344 --75.9359 --75.9422 --75.9313 --75.9422 --75.9484 --75.9281 --75.9422 --75.9203 --75.9344 --75.9359 --75.9547 --75.9313 --75.9484 --75.9469 --75.9469 --75.9437 --75.9453 --75.9328 --75.9391 --75.9516 --75.9469 --75.9406 --75.9375 --75.9328 --75.9328 --75.9375 --75.9406 --75.9328 --75.9469 --75.9344 --75.95 --75.9375 --75.9406 --75.9391 --75.9453 --75.9484 --75.9266 --75.9453 --75.9375 --75.9484 --75.9391 --75.9422 --75.9437 --75.9484 --75.9516 --75.9484 --75.9313 --75.9391 --75.9391 --75.925 --75.9344 --75.9406 --75.9469 --75.9328 --75.9484 --75.9422 --75.9453 --75.9594 --75.9484 --75.9484 --75.9578 --75.9422 --75.9625 --75.9641 --75.9469 --75.9547 --75.9406 --75.9578 --75.9484 --75.9516 --75.9422 --75.9391 --75.9484 --75.9375 --75.9484 --75.9484 --75.9406 --75.9531 --75.9375 --75.9406 --75.95 --75.9656 --75.9313 --75.9484 --75.9484 --75.9422 --75.9391 --75.9547 --75.9437 --75.9406 --75.9437 --75.9594 --75.9484 --75.9391 --75.9641 --75.9531 --75.9437 --75.9391 --75.9531 --75.9391 --75.9578 --75.9375 --75.9359 --75.9516 --75.9266 --75.9453 --75.9359 --75.9375 --75.9359 --75.9344 --75.9375 --75.9484 --75.9359 --75.9297 --75.9344 --75.9172 --75.9359 --75.9359 --75.9234 --75.9375 --75.9313 --75.9172 --75.9234 --75.9187 --75.925 --75.9344 --75.9281 --75.9281 --75.9187 --75.9266 --75.9359 --75.925 --75.9266 --75.9484 --75.9297 --75.9344 --75.9453 --75.9406 --75.9359 --75.9344 --75.9313 --75.9219 --75.9344 --75.9281 --75.9313 --75.9297 --75.9313 --75.9313 --75.9094 --75.9437 --75.9281 --75.9281 --75.9281 --75.9344 --75.925 --75.9328 --75.9313 --75.9297 --75.9281 --75.9187 --75.9391 --75.9281 --75.9406 --75.9375 --75.9328 --75.9344 --75.9437 --75.925 --75.9437 --75.9297 --75.9406 --75.9281 --75.9422 --75.9469 --75.9406 --75.9266 --75.9281 --75.9281 --75.9297 --75.9266 --75.9328 --75.9375 --75.9344 --75.9313 --75.9453 --75.9359 --75.9313 --75.9391 --75.9484 --75.9375 --75.9313 --75.9203 --75.9375 --75.9313 --75.9375 --75.9469 --75.9344 --75.9375 --75.9297 --75.9422 --75.9422 --75.9563 --75.9375 --75.9266 --75.9391 --75.9359 --75.9375 --75.9422 --75.9453 --75.9437 --75.9328 --75.9422 --75.9391 --75.9406 --75.9484 --75.9359 --75.9437 --75.9281 --75.9437 --75.9563 --75.9281 --75.95 --75.9406 --75.9406 --75.9437 --75.9297 --75.9453 --75.9344 --75.9359 --75.9328 --75.9328 --75.9359 --75.9406 --75.9328 --75.9359 --75.9344 --75.9359 --75.9359 --75.9344 --75.9297 --75.9359 --75.9297 --75.9344 --75.9203 --75.9359 --75.9203 --75.9203 --75.9234 --75.9234 --75.9266 --75.9484 --75.9313 --75.9391 --75.9406 --75.9437 --75.9406 --75.9281 --75.9359 --75.9406 --75.9531 --75.9484 --75.9406 --75.9422 --75.9391 --75.925 --75.9437 --75.9406 --75.9453 --75.9313 --75.9422 --75.9422 --75.9313 --75.9484 --75.9281 --75.9266 --75.9359 --75.9391 --75.9375 --75.9375 --75.9125 --75.9313 --75.925 --75.9219 --75.9187 --75.9297 --75.9156 --75.9422 --75.925 --75.9281 --75.9172 --75.9328 --75.925 --75.9156 --75.9172 --75.9281 --75.9281 --75.9203 --75.9266 --75.9172 --75.9328 --75.925 --75.9344 --75.9187 --75.9281 --75.9125 --75.9187 --75.9453 --75.9172 --75.9219 --75.9141 --75.9094 --75.9141 --75.9313 --75.9313 --75.9328 --75.9234 --75.9203 --75.9234 --75.9203 --75.9187 --75.9297 --75.9203 --75.9297 --75.9187 --75.9172 --75.9234 --75.9219 --75.9156 --75.9187 --75.9203 --75.925 --75.9109 --75.9219 --75.9125 --75.9375 --75.9266 --75.9203 --75.925 --75.9172 --75.9187 --75.9219 --75.9344 --75.925 --75.9313 --75.9266 --75.925 --75.925 --75.9266 --75.9203 --75.925 --75.9203 --75.9203 --75.9219 --75.9437 --75.9328 --75.925 --75.9187 --75.9281 --75.9234 --75.9266 --75.9281 --75.9266 --75.9328 --75.9375 --75.9406 --75.9328 --75.9328 --75.9203 --75.9375 --75.9344 --75.9266 --75.9391 --75.9297 --75.9297 --75.9328 --75.9469 --75.9344 --75.9313 --75.9234 --75.9281 --75.9453 --75.9281 --75.925 --75.9297 --75.9281 --75.9187 --75.9328 --75.925 --75.9281 --75.9328 --75.9516 --75.9391 --75.9469 --75.9391 --75.9359 --75.9391 --75.9344 --75.9406 --75.9297 --75.9359 --75.9203 --75.9219 --75.9359 --75.9266 --75.9219 --75.9281 --75.9391 --75.9234 --75.9359 --75.9437 --75.9328 --75.9313 --75.9281 --75.9281 --75.9328 --75.9297 --75.9234 --75.9359 --75.925 --75.925 --75.9344 --75.9344 --75.9391 --75.9219 --75.9313 --75.925 --75.9359 --75.9359 --75.9313 --75.9344 --75.9266 --75.9313 --75.9281 --75.9234 --75.9219 --75.925 --75.9375 --75.9281 --75.9266 --75.9344 --75.9484 --75.9234 --75.9328 --75.9297 --75.9328 --75.9375 --75.9328 --75.9266 --75.9313 --75.9328 --75.925 --75.9328 --75.9281 --75.925 --75.9094 --75.9422 --75.9234 --75.9234 --75.9281 --75.9406 --75.9328 --75.925 --75.9141 --75.9391 --75.9297 --75.9203 --75.9391 --75.9219 --75.9344 --75.9328 --75.9266 --75.9297 --75.9344 --75.9328 --75.9469 --75.925 --75.9234 --75.9297 --75.95 --75.9484 --75.9453 --75.9375 --75.9453 --75.9484 --75.9422 --75.9391 --75.9328 --75.9375 --75.9344 --75.9344 --75.9359 --75.9422 --75.9328 --75.9281 --75.9203 --75.925 --75.9313 --75.9359 --75.9437 --75.9297 --75.9437 --75.9266 --75.9406 --75.9469 --75.9391 --75.9359 --75.9172 --75.9375 --75.9406 --75.9406 --75.9328 --75.9344 --75.9297 --75.9344 --75.9375 --75.9391 --75.9391 --75.9453 --75.9375 --75.9203 --75.9406 --75.9406 --75.9281 --75.925 --75.9328 --75.9297 --75.9281 --75.9359 --75.9437 --75.9313 --75.9375 --75.9391 --75.9516 --75.9281 --75.9375 --75.9391 --75.9469 --75.9313 --75.9391 --75.9469 --75.9516 --75.9469 --75.9406 --75.9328 --75.9375 --75.9453 --75.9344 --75.9578 --75.9484 --75.9422 --75.9344 --75.9328 --75.9297 --75.9219 --75.9547 --75.9313 --75.9437 --75.9203 --75.9391 --75.9297 --75.9297 --75.9437 --75.95 --75.9375 --75.9281 --75.9344 --75.9328 --75.9266 --75.9203 --75.9297 --75.9297 --75.9297 --75.9266 --75.925 --75.9281 --75.9344 --75.9234 --75.9313 --75.9391 --75.9313 --75.9375 --75.95 --75.9437 --75.9359 --75.9391 --75.9234 --75.9344 --75.9313 --75.9484 --75.9344 --75.9406 --75.9187 --75.9328 --75.9297 --75.9375 --75.9437 --75.9344 --75.9266 --75.9281 --75.9437 --75.9359 --75.9313 --75.9313 --75.9266 --75.9219 --75.9391 --75.9281 --75.9297 --75.9219 --75.9266 --75.9406 --75.925 --75.9297 --75.9406 --75.9391 --75.9172 --75.9391 --75.9359 --75.9344 --75.9234 --75.925 --75.9313 --75.9172 --75.9219 --75.9266 --75.925 --75.9344 --75.9172 --75.9203 --75.9187 --75.9281 --75.9219 --75.925 --75.9156 --75.9297 --75.9313 --75.9234 --75.9234 --75.9125 --75.9297 --75.9281 --75.9187 --75.9266 --75.9281 --75.9406 --75.9406 --75.9375 --75.9219 --75.9328 --75.9313 --75.9219 --75.9172 --75.9297 --75.9203 --75.9219 --75.9172 --75.9156 --75.9172 --75.9062 --75.9203 --75.9109 --75.9016 --75.9094 --75.9031 --75.9219 --75.9141 --75.9219 --75.9281 --75.9187 --75.9078 --75.9156 --75.9219 --75.9281 --75.9328 --75.9156 --75.9187 --75.9375 --75.9078 --75.9172 --75.9297 --75.9406 --75.9203 --75.9234 --75.9234 --75.9156 --75.9078 --75.9062 --75.9047 --75.9219 --75.9234 --75.9062 --75.9141 --75.9219 --75.9172 --75.9234 --75.9031 --75.9219 --75.9281 --75.9156 --75.9156 --75.9125 --75.9125 --75.9125 --75.9078 --75.9203 --75.9016 --75.9109 --75.9187 --75.9141 --75.9031 --75.9109 --75.9234 --75.9391 --75.9156 --75.9125 --75.9219 --75.9219 --75.9062 --75.9266 --75.9125 --75.9172 --75.925 --75.9031 --75.9203 --75.9141 --75.9297 --75.9094 --75.9187 --75.9203 --75.9187 --75.9172 --75.925 --75.9109 --75.9297 --75.9172 --75.9031 --75.9125 --75.925 --75.9359 --75.9203 --75.9156 --75.9219 --75.9172 --75.9437 --75.9203 --75.9266 --75.9125 --75.9172 --75.9141 --75.9359 --75.9234 --75.9266 --75.9016 --75.9141 --75.9156 --75.9109 --75.9156 --75.9172 --75.9141 --75.9203 --75.9141 --75.9203 --75.9172 --75.9156 --75.9219 --75.9219 --75.9187 --75.9187 --75.9187 --75.9234 --75.9266 --75.9234 --75.9125 --75.9281 --75.9078 --75.9062 --75.9219 --75.9125 --75.9156 --75.9125 --75.9109 --75.9219 --75.9156 --75.9172 --75.9094 --75.9172 --75.9109 --75.9156 --75.9125 --75.9172 --75.9141 --75.9094 --75.9187 --75.9062 --75.9266 --75.9234 --75.9234 --75.9172 --75.9187 --75.9266 --75.9375 --75.9281 --75.9219 --75.9219 --75.9344 --75.9297 --75.9234 --75.925 --75.9172 --75.9219 --75.9219 --75.9187 --75.9094 --75.9328 --75.9203 --75.9234 --75.9203 --75.9203 --75.9109 --75.9141 --75.9078 --75.9109 --75.9187 --75.9062 --75.9109 --75.9203 --75.9078 --75.925 --75.9234 --75.9281 --75.9313 --75.9281 --75.9219 --75.9266 --75.9172 --75.9297 --75.9156 --75.9281 --75.9297 --75.9234 --75.9359 --75.9344 --75.9219 --75.9109 --75.925 --75.9203 --75.9328 --75.9203 --75.9328 --75.9234 --75.9281 --75.9266 --75.9375 --75.9219 --75.9328 --75.9328 --75.9313 --75.9437 --75.9281 --75.9359 --75.9406 --75.9266 --75.9156 --75.925 --75.9313 --75.9187 --75.9109 --75.9297 --75.9219 --75.9203 --75.9203 --75.9141 --75.925 --75.9203 --75.9203 --75.9234 --75.9203 --75.9375 --75.925 --75.9344 --75.9203 --75.9234 --75.9297 --75.9266 --75.9203 --75.9187 --75.9234 --75.9234 --75.9234 --75.9234 --75.9078 --75.9422 --75.9 --75.9359 --75.925 --75.9172 --75.9266 --75.9219 --75.925 --75.9141 --75.9297 --75.9156 --75.9266 --75.9156 --75.9328 --75.9297 --75.9219 --75.9219 --75.9313 --75.9156 --75.9125 --75.925 --75.9391 --75.9344 --75.9297 --75.9187 --75.9109 --75.9266 --75.9219 --75.9281 --75.9203 --75.9297 --75.9141 --75.9109 --75.9219 --75.9156 --75.9219 --75.9156 --75.9234 --75.9219 --75.9234 --75.9187 --75.9109 --75.9031 --75.9266 --75.9172 --75.9172 --75.9234 --75.9187 --75.9219 --75.9078 --75.925 --75.9187 --75.9234 --75.9281 --75.9125 --75.925 --75.9156 --75.9266 --75.9187 --75.9297 --75.9234 --75.9281 --75.9328 --75.9281 --75.9297 --75.9281 --75.9203 --75.9203 --75.9266 --75.9234 --75.9391 --75.9219 --75.9313 --75.9375 --75.9203 --75.9359 --75.9422 --75.9125 --75.9328 --75.9297 --75.925 --75.9266 --75.9203 --75.9266 --75.9187 --75.9266 --75.9281 --75.9187 --75.9281 --75.9266 --75.9141 --75.9375 --75.9187 --75.9297 --75.9203 --75.9313 --75.9281 --75.9187 --75.9344 --75.9359 --75.9359 --75.9219 --75.9281 --75.9141 --75.9391 --75.9281 --75.9156 --75.9344 --75.9219 --75.9453 --75.9344 --75.9313 --75.9328 --75.925 --75.9359 --75.9141 --75.9203 --75.9203 --75.9141 --75.9141 --75.9281 --75.925 --75.9141 --75.9344 --75.9359 --75.9219 --75.9344 --75.9313 --75.9406 --75.9328 --75.9234 --75.9281 --75.9219 --75.9266 --75.9359 --75.9359 --75.9313 --75.9219 --75.9297 --75.9391 --75.9234 --75.9406 --75.9453 --75.9531 --75.925 --75.9437 --75.9437 --75.9219 --75.9328 --75.9234 --75.9266 --75.9234 --75.9375 --75.925 --75.9172 --75.9203 --75.9266 --75.9281 --75.9313 --75.9359 --75.9266 --75.9234 --75.9328 --75.9281 --75.9109 --75.9328 --75.925 --75.9219 --75.9219 --75.925 --75.9359 --75.9281 --75.9234 --75.9219 --75.9203 --75.9469 --75.9234 --75.9313 --75.9344 --75.925 --75.9328 --75.9359 --75.9234 --75.9328 --75.9141 --75.9266 --75.9156 --75.9375 --75.9187 --75.9219 --75.9187 --75.9219 --75.9187 --75.9219 --75.9203 --75.9375 --75.9344 --75.9313 --75.9219 --75.9313 --75.9281 --75.9234 --75.9187 --75.9281 --75.9297 --75.9172 --75.9266 --75.9219 --75.9359 --75.9281 --75.9281 --75.9328 --75.9281 --75.9234 --75.9375 --75.9406 --75.9313 --75.9281 --75.9234 --75.9328 --75.9234 --75.9219 --75.9219 --75.9187 --75.9281 --75.925 --75.9344 --75.9203 --75.925 --75.9141 --75.9172 --75.9328 --75.9156 --75.9187 --75.9156 --75.9203 --75.9219 --75.9281 --75.9281 --75.9313 --75.9141 --75.9266 --75.9328 --75.925 --75.9359 --75.9234 --75.9203 --75.9344 --75.9266 --75.9219 --75.9328 --75.9219 --75.925 --75.9328 --75.9297 --75.9328 --75.925 --75.9281 --75.925 --75.925 --75.9234 --75.9203 --75.9297 --75.9281 --75.9375 --75.9078 --75.9172 --75.9391 --75.9187 --75.9313 --75.9391 --75.9172 --75.9328 --75.9359 --75.9344 --75.9437 --75.9375 --75.9359 --75.9422 --75.9359 --75.9172 --75.9328 --75.9297 --75.9328 --75.9234 --75.9203 --75.9203 --75.9187 --75.925 --75.9187 --75.9203 --75.9297 --75.9141 --75.9266 --75.9203 --75.8969 --75.9156 --75.9078 --75.9141 --75.9156 --75.9203 --75.9172 --75.9094 --75.925 --75.9187 --75.9203 --75.9156 --75.9203 --75.9281 --75.9234 --75.9203 --75.9187 --75.9187 --75.9172 --75.9219 --75.9172 --75.9313 --75.925 --75.9156 --75.9234 --75.9391 --75.9359 --75.9141 --75.9359 --75.9203 --75.9078 --75.9234 --75.9047 --75.9172 --75.9172 --75.9219 --75.9266 --75.925 --75.9172 --75.925 --75.9297 --75.9156 --75.9109 --75.9172 --75.9297 --75.9172 --75.9156 --75.9172 --75.9125 --75.925 --75.9125 --75.9313 --75.9203 --75.9172 --75.9047 --75.9109 --75.9187 --75.9062 --75.9094 --75.9344 --75.9187 --75.9187 --75.9141 --75.9172 --75.9203 --75.9266 --75.9156 --75.9172 --75.9219 --75.9062 --75.9062 --75.9016 --75.9078 --75.9203 --75.9172 --75.9172 --75.9062 --75.9203 --75.9266 --75.9281 --75.9187 --75.9109 --75.9234 --75.9156 --75.9172 --75.9219 --75.9234 --75.9141 --75.9141 --75.9172 --75.9016 --75.9141 --75.9062 --75.9 --75.9 --75.9094 --75.9094 --75.9094 --75.9031 --75.9078 --75.9203 --75.9062 --75.9172 --75.9047 --75.8984 --75.9125 --75.9078 --75.8969 --75.9109 --75.9047 --75.9094 --75.9031 --75.9094 --75.9062 --75.9047 --75.9062 --75.9141 --75.9031 --75.9031 --75.9156 --75.9 --75.8953 --75.9047 --75.8828 --75.9078 --75.9016 --75.9172 --75.9031 --75.9125 --75.9172 --75.9047 --75.9062 --75.9125 --75.9156 --75.9156 --75.9187 --75.9187 --75.8938 --75.9125 --75.9203 --75.9078 --75.9109 --75.9266 --75.9062 --75.9125 --75.9031 --75.9141 --75.9141 --75.8969 --75.9094 --75.9141 --75.9062 --75.9062 --75.9109 --75.9156 --75.9094 --75.9078 --75.9031 --75.9 --75.9016 --75.9047 --75.9016 --75.9031 --75.9187 --75.8859 --75.8922 --75.9109 --75.9172 --75.9078 --75.9125 --75.8969 --75.9016 --75.9125 --75.8984 --75.8984 --75.8969 --75.8891 --75.9078 --75.9016 --75.9062 --75.8891 --75.9141 --75.9031 --75.9094 --75.9047 --75.8938 --75.9031 --75.9125 --75.8922 --75.9094 --75.9016 --75.8891 --75.9125 --75.8938 --75.9094 --75.9078 --75.9031 --75.8938 --75.9094 --75.9094 --75.9 --75.9031 --75.9047 --75.9 --75.8969 --75.9062 --75.8984 --75.8922 --75.8859 --75.9062 --75.8891 --75.9141 --75.9156 --75.9031 --75.9125 --75.9094 --75.9016 --75.8953 --75.9078 --75.8984 --75.8938 --75.9109 --75.8938 --75.8906 --75.9172 --75.8969 --75.9141 --75.9 --75.8984 --75.8953 --75.9016 --75.8953 --75.8922 --75.9 --75.9047 --75.9078 --75.8984 --75.9078 --75.9219 --75.9016 --75.9094 --75.9109 --75.9187 --75.9031 --75.9172 --75.9109 --75.9141 --75.9047 --75.8938 --75.9078 --75.9203 --75.9094 --75.9187 --75.9094 --75.9047 --75.9234 --75.9109 --75.9297 --75.9172 --75.9125 --75.9125 --75.8969 --75.9016 --75.9047 --75.8906 --75.9 --75.9078 --75.9047 --75.8891 --75.9062 --75.9187 --75.9141 --75.9062 --75.9078 --75.9109 --75.9047 --75.9187 --75.9141 --75.9 --75.9062 --75.9172 --75.9109 --75.9078 --75.8953 --75.9125 --75.9109 --75.9 --75.9203 --75.9016 --75.9016 --75.9016 --75.9031 --75.9109 --75.9141 --75.9141 --75.8969 --75.9031 --75.9203 --75.8984 --75.8922 --75.8969 --75.9062 --75.8875 --75.9094 --75.9016 --75.8953 --75.9078 --75.9078 --75.8984 --75.9016 --75.9109 --75.9 --75.9 --75.8906 --75.9094 --75.8984 --75.8922 --75.9031 --75.9031 --75.9016 --75.9094 --75.8891 --75.9 --75.9031 --75.9141 --75.9016 --75.9078 --75.8922 --75.9031 --75.8859 --75.8984 --75.8922 --75.8891 --75.8922 --75.8922 --75.9031 --75.8969 --75.8984 --75.9031 --75.8953 --75.9078 --75.9 --75.9078 --75.8875 --75.9094 --75.8922 --75.8938 --75.9 --75.8953 --75.9016 --75.9047 --75.8984 --75.9047 --75.8984 --75.8891 --75.9125 --75.9094 --75.9094 --75.8984 --75.9062 --75.9047 --75.8906 --75.8984 --75.9031 --75.8953 --75.9078 --75.9 --75.9109 --75.9 --75.9094 --75.8906 --75.9109 --75.9094 --75.8922 --75.8984 --75.8922 --75.8984 --75.8953 --75.9047 --75.9047 --75.9016 --75.8969 --75.9172 --75.8984 --75.9094 --75.9 --75.9016 --75.9016 --75.9109 --75.8984 --75.9109 --75.9094 --75.9125 --75.9078 --75.8984 --75.9172 --75.9234 --75.9109 --75.9172 --75.9016 --75.9109 --75.9094 --75.9109 --75.9109 --75.9187 --75.9125 --75.9141 --75.9187 --75.9062 --75.9203 --75.9109 --75.9219 --75.8984 --75.9031 --75.9141 --75.8984 --75.9031 --75.9047 --75.9109 --75.9047 --75.9078 --75.8891 --75.9031 --75.9187 --75.9219 --75.9219 --75.9094 --75.8984 --75.9156 --75.9094 --75.9078 --75.9203 --75.9187 --75.9078 --75.9109 --75.9 --75.9 --75.9109 --75.9031 --75.9062 --75.9078 --75.9156 --75.9016 --75.9109 --75.9078 --75.8953 --75.9047 --75.8922 --75.9062 --75.9016 --75.9016 --75.9016 --75.9016 --75.9047 --75.9031 --75.8953 --75.9031 --75.8891 --75.9078 --75.9062 --75.8906 --75.9141 --75.9 --75.8984 --75.8875 --75.8969 --75.9016 --75.8844 --75.9125 --75.9125 --75.9234 --75.9078 --75.9109 --75.9094 --75.8984 --75.9187 --75.8953 --75.9062 --75.9078 --75.9094 --75.9 --75.8922 --75.9016 --75.9031 --75.9031 --75.9047 --75.9047 --75.9094 --75.9187 --75.9109 --75.9078 --75.925 --75.9125 --75.9141 --75.9187 --75.9109 --75.9125 --75.9281 --75.9219 --75.9172 --75.9172 --75.9297 --75.9047 --75.9203 --75.9109 --75.9109 --75.8969 --75.9187 --75.9141 --75.9156 --75.9094 --75.9234 --75.9172 --75.9219 --75.9297 --75.9187 --75.9172 --75.925 --75.9172 --75.9062 --75.9094 --75.9078 --75.9062 --75.925 --75.9156 --75.9234 --75.925 --75.9203 --75.9187 --75.9062 --75.9078 --75.925 --75.9078 --75.9125 --75.9031 --75.9203 --75.9094 --75.9141 --75.9187 --75.9094 --75.9047 --75.9094 --75.9187 --75.9047 --75.9062 --75.9031 --75.9125 --75.9078 --75.9078 --75.9172 --75.9187 --75.9187 --75.925 --75.9141 --75.9078 --75.9125 --75.9359 --75.9187 --75.9313 --75.925 --75.9141 --75.9266 --75.9328 --75.9156 --75.9156 --75.9266 --75.925 --75.9156 --75.9109 --75.9047 --75.9047 --75.9234 --75.8969 --75.9187 --75.9125 --75.9156 --75.9156 --75.9172 --75.9203 --75.9187 --75.925 --75.8953 --75.9125 --75.9156 --75.9187 --75.9078 --75.9141 --75.9219 --75.9219 --75.9187 --75.9172 --75.9125 --75.9234 --75.9141 --75.9156 --75.9109 --75.9125 --75.9187 --75.9172 --75.9078 --75.9266 --75.9266 --75.9094 --75.9109 --75.9219 --75.9094 --75.9281 --75.9266 --75.9125 --75.9141 --75.9266 --75.9187 --75.9156 --75.9062 --75.9125 --75.9172 --75.9047 --75.9094 --75.9031 --75.9047 --75.9234 --75.9078 --75.9156 --75.9125 --75.9109 --75.9109 --75.9203 --75.9172 --75.9297 --75.9078 --75.9266 --75.9094 --75.9078 --75.9141 --75.9156 --75.9047 --75.9219 --75.9125 --75.9187 --75.9172 --75.9172 --75.9031 --75.9078 --75.9078 --75.9 --75.9094 --75.8984 --75.9094 --75.9219 --75.9187 --75.9125 --75.9156 --75.9078 --75.9109 --75.9 --75.9047 --75.8922 --75.9047 --75.9109 --75.8969 --75.8969 --75.9125 --75.8953 --75.8938 --75.9 --75.9078 --75.9109 --75.9047 --75.9047 --75.9078 --75.9125 --75.9125 --75.9047 --75.9094 --75.9031 --75.8969 --75.9031 --75.9078 --75.9078 --75.9125 --75.9016 --75.8984 --75.9 --75.8984 --75.925 --75.9047 --75.9 --75.8875 --75.8891 --75.9141 --75.8922 --75.8969 --75.8953 --75.9047 --75.8938 --75.8984 --75.8953 --75.9094 --75.8969 --75.8953 --75.9 --75.9031 --75.9 --75.9016 --75.9031 --75.8875 --75.9141 --75.8938 --75.8953 --75.9094 --75.9 --75.9031 --75.9203 --75.9016 --75.8953 --75.9031 --75.9219 --75.9047 --75.9031 --75.9016 --75.8984 --75.8938 --75.9109 --75.9031 --75.9 --75.9078 --75.9109 --75.9031 --75.8984 --75.9109 --75.9078 --75.9109 --75.9062 --75.8969 --75.9062 --75.8938 --75.9109 --75.8953 --75.9 --75.8953 --75.9016 --75.9062 --75.9 --75.9047 --75.9047 --75.8922 --75.9172 --75.9125 --75.9031 --75.9 --75.8953 --75.9125 --75.9172 --75.9203 --75.9125 --75.9078 --75.9156 --75.9203 --75.8953 --75.9125 --75.9031 --75.9156 --75.9062 --75.8953 --75.8953 --75.9031 --75.9125 --75.9141 --75.9031 --75.9062 --75.9047 --75.8969 --75.8938 --75.9016 --75.9062 --75.9 --75.9094 --75.9125 --75.9016 --75.8969 --75.9062 --75.9078 --75.9016 --75.9016 --75.9031 --75.8938 --75.9172 --75.9109 --75.8781 --75.9 --75.8859 --75.9078 --75.9125 --75.9156 --75.9016 --75.8906 --75.9078 --75.8984 --75.9 --75.9016 --75.9062 --75.9016 --75.8953 --75.9094 --75.9047 --75.9094 --75.9047 --75.8984 --75.8906 --75.9 --75.9125 --75.9047 --75.9047 --75.8969 --75.9031 --75.8969 --75.8984 --75.9016 --75.9031 --75.9031 --75.9062 --75.9141 --75.9078 --75.9062 --75.9016 --75.9 --75.9094 --75.8984 --75.9109 --75.9094 --75.9141 --75.925 --75.9062 --75.9062 --75.8953 --75.9078 --75.8969 --75.9156 --75.9078 --75.8938 --75.9172 --75.9031 --75.9 --75.9031 --75.9031 --75.9047 --75.8969 --75.9109 --75.9047 --75.9047 --75.8938 --75.9078 --75.8984 --75.9141 --75.8969 --75.9031 --75.9062 --75.9078 --75.9125 --75.9062 --75.9109 --75.9016 --75.9031 --75.9047 --75.9062 --75.9047 --75.9203 --75.9 --75.9062 --75.9031 --75.9062 --75.8984 --75.9047 --75.9031 --75.8938 --75.9062 --75.8984 --75.9219 --75.9031 --75.9062 --75.9047 --75.9 --75.9062 --75.9187 --75.9016 --75.9313 --75.9141 --75.9125 --75.9078 --75.9031 --75.9047 --75.9047 --75.9109 --75.9172 --75.9141 --75.9125 --75.925 --75.9172 --75.9187 --75.9328 --75.9234 --75.9203 --75.9125 --75.9172 --75.9109 --75.9203 --75.9094 --75.9234 --75.9094 --75.9047 --75.9125 --75.9109 --75.9016 --75.9094 --75.8984 --75.9062 --75.8938 --75.9078 --75.9047 --75.9234 --75.8938 --75.9047 --75.9172 --75.8984 --75.9094 --75.9109 --75.9156 --75.9141 --75.925 --75.9125 --75.9125 --75.9156 --75.9125 --75.9109 --75.9094 --75.9062 --75.9172 --75.925 --75.9094 --75.9156 --75.9219 --75.9016 --75.9219 --75.925 --75.9062 --75.9047 --75.9156 --75.9062 --75.9078 --75.9109 --75.8953 --75.9031 --75.9094 --75.8969 --75.9047 --75.9031 --75.9031 --75.9062 --75.8922 --75.8953 --75.9062 --75.9 --75.9 --75.8969 --75.8812 --75.8938 --75.8953 --75.9 --75.8891 --75.9016 --75.8953 --75.8938 --75.8906 --75.8938 --75.9 --75.9 --75.8969 --75.8984 --75.8625 --75.8969 --75.8953 --75.8844 --75.875 --75.8812 --75.8859 --75.8969 --75.9 --75.8844 --75.8906 --75.9109 --75.8844 --75.8938 --75.8875 --75.8938 --75.8969 --75.8891 --75.8938 --75.9 --75.8938 --75.8812 --75.8922 --75.9031 --75.8938 --75.8969 --75.8859 --75.8922 --75.8875 --75.8906 --75.8922 --75.8891 --75.8875 --75.8719 --75.8766 --75.8953 --75.8953 --75.8891 --75.8797 --75.8969 --75.8781 --75.8766 --75.8828 --75.8812 --75.8797 --75.8938 --75.8859 --75.8922 --75.8922 --75.8812 --75.8703 --75.8938 --75.875 --75.8844 --75.8922 --75.8703 --75.8984 --75.8812 --75.8781 --75.8891 --75.8906 --75.8828 --75.8812 --75.8828 --75.8875 --75.8688 --75.8938 --75.8938 --75.8812 --75.8828 --75.8812 --75.8938 --75.8859 --75.8891 --75.9 --75.8719 --75.9 --75.8859 --75.8922 --75.8953 --75.8922 --75.8938 --75.8922 --75.8984 --75.9016 --75.8984 --75.9078 --75.9062 --75.8969 --75.8906 --75.8984 --75.8953 --75.8906 --75.8938 --75.9016 --75.9031 --75.9 --75.8984 --75.8844 --75.9 --75.9016 --75.8859 --75.8953 --75.8828 --75.8984 --75.9 --75.8953 --75.8906 --75.8859 --75.8922 --75.8953 --75.9031 --75.8844 --75.8875 --75.8875 --75.8906 --75.8922 --75.8922 --75.8969 --75.8906 --75.8938 --75.8938 --75.8906 --75.8984 --75.8938 --75.9047 --75.9047 --75.9047 --75.8984 --75.9 --75.8953 --75.9031 --75.9047 --75.8875 --75.9125 --75.8953 --75.9109 --75.9062 --75.9 --75.9094 --75.9 --75.8859 --75.8938 --75.9047 --75.8969 --75.9016 --75.9016 --75.9031 --75.8891 --75.9078 --75.8922 --75.8938 --75.9031 --75.9109 --75.8938 --75.8984 --75.9031 --75.8938 --75.9016 --75.9 --75.9078 --75.8953 --75.8906 --75.9141 --75.9047 --75.8969 --75.9078 --75.8984 --75.9062 --75.8969 --75.8922 --75.8938 --75.9031 --75.8906 --75.8906 --75.8953 --75.8906 --75.8984 --75.8938 --75.8969 --75.9016 --75.8969 --75.8984 --75.9 --75.9125 --75.9 --75.8969 --75.9 --75.9062 --75.9016 --75.8828 --75.8969 --75.8953 --75.9016 --75.9031 --75.8984 --75.9031 --75.9031 --75.9016 --75.9031 --75.9047 --75.9047 --75.9047 --75.9 --75.9016 --75.8938 --75.9094 --75.8969 --75.9187 --75.9156 --75.9078 --75.8984 --75.9016 --75.8938 --75.9062 --75.9 --75.8953 --75.8938 --75.8984 --75.9078 --75.9 --75.9031 --75.8922 --75.8969 --75.9031 --75.9172 --75.9094 --75.8938 --75.9031 --75.9 --75.8906 --75.9016 --75.8906 --75.9094 --75.8984 --75.8953 --75.9172 --75.9016 --75.9 --75.8984 --75.9016 --75.9109 --75.9 --75.8984 --75.9 --75.9031 --75.9047 --75.9 --75.9016 --75.9125 --75.9016 --75.9125 --75.9016 --75.9172 --75.8891 --75.9078 --75.8922 --75.9047 --75.8922 --75.8984 --75.9047 --75.9 --75.9 --75.9062 --75.9062 --75.9031 --75.9062 --75.9047 --75.8906 --75.8969 --75.8938 --75.8859 --75.8844 --75.8938 --75.9016 --75.8828 --75.9078 --75.9016 --75.8969 --75.9016 --75.8906 --75.8844 --75.9078 --75.8812 --75.8906 --75.8938 --75.8844 --75.8922 --75.8984 --75.8766 --75.8828 --75.8922 --75.8844 --75.8859 --75.8875 --75.8891 --75.8844 --75.9016 --75.8969 --75.8828 --75.8906 --75.8969 --75.8906 --75.8891 --75.8812 --75.8906 --75.8859 --75.8844 --75.8766 --75.8984 --75.8984 --75.9016 --75.8891 --75.8891 --75.8969 --75.8922 --75.8984 --75.8891 --75.8875 --75.8828 --75.8875 --75.8859 --75.8844 --75.9031 --75.8969 --75.8859 --75.9094 --75.8859 --75.8906 --75.8812 --75.8906 --75.8828 --75.9016 --75.8906 --75.8844 --75.8922 --75.8922 --75.8922 --75.8953 --75.9 --75.9 --75.8984 --75.8984 --75.8984 --75.8938 --75.8906 --75.9 --75.9 --75.8859 --75.9 --75.8891 --75.8922 --75.8875 --75.8859 --75.8938 --75.8938 --75.8922 --75.8969 --75.8859 --75.8938 --75.8922 --75.9031 --75.8828 --75.8969 --75.8859 --75.8891 --75.8828 --75.8812 --75.8828 --75.8859 --75.8641 --75.8906 --75.8766 --75.8766 --75.8953 --75.8969 --75.8906 --75.8828 --75.8828 --75.8953 --75.8812 --75.8828 --75.8875 --75.8812 --75.8859 --75.8719 --75.8828 --75.8797 --75.8844 --75.8844 --75.8969 --75.8781 --75.8828 --75.8766 --75.8797 --75.8688 --75.8734 --75.8875 --75.8734 --75.8828 --75.8984 --75.875 --75.8781 --75.8859 --75.8734 --75.8812 --75.8828 --75.8875 --75.8828 --75.8812 --75.8891 --75.8891 --75.8781 --75.9 --75.875 --75.8922 --75.9016 --75.8875 --75.8984 --75.8922 --75.8938 --75.8906 --75.8922 --75.9016 --75.8812 --75.8859 --75.9016 --75.8891 --75.8844 --75.8953 --75.8812 --75.8859 --75.8828 --75.8766 --75.8828 --75.8859 --75.8891 --75.8969 --75.8859 --75.8766 --75.8812 --75.8969 --75.8828 --75.8875 --75.8953 --75.8797 --75.8891 --75.9047 --75.8812 --75.8953 --75.8828 --75.8844 --75.8969 --75.8734 --75.8828 --75.8922 --75.8906 --75.8844 --75.8906 --75.8797 --75.875 --75.8719 --75.8922 --75.8922 --75.9062 --75.8812 --75.8906 --75.8906 --75.8812 --75.8812 --75.8953 --75.8703 --75.8812 --75.8875 --75.8922 --75.8875 --75.8891 --75.8781 --75.8938 --75.8922 --75.8828 --75.8812 --75.8766 --75.8828 --75.8828 --75.8844 --75.8844 --75.8875 --75.8766 --75.8844 --75.8812 --75.8891 --75.8781 --75.8906 --75.8859 --75.8797 --75.8891 --75.8938 --75.8906 --75.8828 --75.8953 --75.8812 --75.8812 --75.8812 --75.8906 --75.8969 --75.8922 --75.8781 --75.8781 --75.8891 --75.8891 --75.8828 --75.8938 --75.8969 --75.8938 --75.8953 --75.8984 --75.8969 --75.8875 --75.8969 --75.8891 --75.8828 --75.8953 --75.9 --75.8938 --75.8891 --75.8812 --75.9141 --75.9141 --75.9078 --75.9031 --75.8969 --75.9062 --75.9031 --75.9016 --75.8906 --75.9141 --75.8953 --75.9047 --75.8922 --75.8953 --75.8828 --75.8891 --75.8938 --75.8891 --75.8953 --75.8922 --75.8875 --75.8969 --75.9031 --75.8859 --75.8984 --75.9 --75.8875 --75.8891 --75.9031 --75.8875 --75.9141 --75.8984 --75.8953 --75.8891 --75.8938 --75.8984 --75.8953 --75.8938 --75.8906 --75.9 --75.8906 --75.8922 --75.9156 --75.8906 --75.9078 --75.9 --75.9078 --75.9016 --75.8875 --75.8953 --75.9062 --75.9078 --75.9062 --75.9 --75.9047 --75.8938 --75.9031 --75.8906 --75.9016 --75.9078 --75.9078 --75.9094 --75.9031 --75.9094 --75.9156 --75.9062 --75.9047 --75.9062 --75.9016 --75.9125 --75.925 --75.9031 --75.9187 --75.9078 --75.9016 --75.9062 --75.8953 --75.9094 --75.8984 --75.8953 --75.9109 --75.9094 --75.9047 --75.8906 --75.9031 --75.9047 --75.8984 --75.9031 --75.8953 --75.9 --75.9016 --75.9078 --75.8969 --75.9047 --75.9 --75.8984 --75.9031 --75.9109 --75.9031 --75.8984 --75.9125 --75.8938 --75.8906 --75.8938 --75.9094 --75.9062 --75.9016 --75.9016 --75.9109 --75.8938 --75.8984 --75.8844 --75.8969 --75.8969 --75.8953 --75.8938 --75.8922 --75.9047 --75.9094 --75.9062 --75.8922 --75.9047 --75.8906 --75.9031 --75.9016 --75.9125 --75.9062 --75.8984 --75.9078 --75.9 --75.9016 --75.8984 --75.9031 --75.9016 --75.8969 --75.9016 --75.9062 --75.8984 --75.9 --75.9156 --75.9 --75.8969 --75.8953 --75.9109 --75.9016 --75.9141 --75.9031 --75.9031 --75.9062 --75.9078 --75.8969 --75.9078 --75.8984 --75.9031 --75.9031 --75.9031 --75.8984 --75.8984 --75.9016 --75.9062 --75.9109 --75.9016 --75.9 --75.9109 --75.9016 --75.9078 --75.9094 --75.9047 --75.9109 --75.9141 --75.8969 --75.9219 --75.9094 --75.9062 --75.9031 --75.9094 --75.925 --75.9203 --75.9344 --75.9297 --75.9109 --75.9047 --75.9094 --75.9125 --75.9078 --75.9172 --75.9297 --75.9313 --75.9125 --75.9203 --75.9016 --75.9219 --75.9094 --75.9109 --75.9203 --75.9219 --75.9094 --75.9281 --75.9234 --75.9141 --75.9203 --75.8953 --75.9094 --75.9156 --75.9078 --75.9125 --75.9313 --75.925 --75.9203 --75.9141 --75.9187 --75.9266 --75.925 --75.9328 --75.9219 --75.9109 --75.9281 --75.9219 --75.9016 --75.9187 --75.9172 --75.9141 --75.9234 --75.9156 --75.9219 --75.9156 --75.9172 --75.9203 --75.9016 --75.9266 --75.9234 --75.9203 --75.9219 --75.9328 --75.9266 --75.9156 --75.9156 --75.9109 --75.9156 --75.9078 --75.9 --75.9203 --75.9062 --75.9109 --75.9078 --75.9016 --75.9156 --75.9094 --75.9156 --75.9203 --75.9187 --75.9 --75.9078 --75.9047 --75.9203 --75.9109 --75.9141 --75.9125 --75.9109 --75.9078 --75.9203 --75.9234 --75.9047 --75.9125 --75.9125 --75.9078 --75.9141 --75.9141 --75.9219 --75.925 --75.9125 --75.925 --75.9297 --75.9109 --75.9234 --75.9156 --75.9203 --75.9078 --75.9187 --75.9094 --75.9156 --75.9187 --75.9187 --75.9156 --75.9141 --75.9297 --75.9094 --75.9062 --75.9047 --75.925 --75.9172 --75.9109 --75.8969 --75.9078 --75.9156 --75.9094 --75.9141 --75.9094 --75.9047 --75.9187 --75.9016 --75.9016 --75.925 --75.9156 --75.9 --75.9078 --75.9234 --75.9203 --75.9094 --75.9203 --75.9094 --75.9187 --75.9156 --75.9187 --75.9141 --75.9156 --75.9078 --75.8969 --75.9062 --75.9109 --75.9078 --75.9031 --75.9031 --75.9094 --75.9016 --75.9203 --75.9094 --75.9 --75.9172 --75.9047 --75.9141 --75.9078 --75.9125 --75.9156 --75.9094 --75.9078 --75.9203 --75.9031 --75.9156 --75.9094 --75.9234 --75.925 --75.9062 --75.9125 --75.9187 --75.9125 --75.9187 --75.9109 --75.9203 --75.9094 --75.9187 --75.9047 --75.9156 --75.9078 --75.9062 --75.9016 --75.9094 --75.9031 --75.9031 --75.9031 --75.9062 --75.9187 --75.9 --75.9187 --75.9156 --75.9 --75.9203 --75.9078 --75.9125 --75.9094 --75.9 --75.9141 --75.9094 --75.9 --75.9187 --75.9047 --75.9156 --75.8984 --75.9078 --75.9078 --75.9094 --75.9125 --75.8969 --75.9047 --75.8875 --75.9062 --75.8969 --75.9047 --75.9094 --75.9031 --75.9062 --75.8922 --75.9047 --75.8875 --75.9078 --75.9078 --75.9 --75.9109 --75.8969 --75.9047 --75.9031 --75.8984 --75.9078 --75.8984 --75.9062 --75.9047 --75.9203 --75.9016 --75.9031 --75.9047 --75.9141 --75.9156 --75.9031 --75.9062 --75.8906 --75.9078 --75.9047 --75.8984 --75.9062 --75.9156 --75.9 --75.9016 --75.9031 --75.9047 --75.9 --75.8969 --75.8922 --75.9047 --75.9 --75.9031 --75.9172 --75.9094 --75.9109 --75.9031 --75.9172 --75.9031 --75.8984 --75.8969 --75.9125 --75.8891 --75.8969 --75.9125 --75.8891 --75.9062 --75.8984 --75.8953 --75.8938 --75.9016 --75.8953 --75.8953 --75.9031 --75.9016 --75.8812 --75.8984 --75.8984 --75.9 --75.8969 --75.9094 --75.8953 --75.8922 --75.9125 --75.8984 --75.8969 --75.8969 --75.8922 --75.8891 --75.9031 --75.8938 --75.9047 --75.9125 --75.9031 --75.9078 --75.8938 --75.9047 --75.9016 --75.8922 --75.9031 --75.8766 --75.8922 --75.8922 --75.8953 --75.8984 --75.8953 --75.8891 --75.9031 --75.8938 --75.9062 --75.8969 --75.8922 --75.9 --75.8953 --75.8938 --75.8875 --75.8797 --75.8688 --75.9078 --75.8906 --75.8891 --75.8984 --75.8906 --75.8766 --75.8688 --75.8828 --75.8922 --75.8844 --75.8906 --75.8984 --75.8891 --75.8797 --75.8969 --75.8953 --75.8906 --75.8938 --75.9062 --75.8906 --75.8922 --75.8859 --75.8797 --75.8875 --75.8797 --75.8828 --75.8891 --75.8812 --75.8844 --75.8875 --75.8891 --75.8922 --75.8953 --75.8734 --75.8906 --75.8938 --75.9 --75.8875 --75.8922 --75.9016 --75.8891 --75.8859 --75.8891 --75.9 --75.8938 --75.9031 --75.8844 --75.8812 --75.8844 --75.9016 --75.8922 --75.9094 --75.8953 --75.8938 --75.9062 --75.9125 --75.9031 --75.8984 --75.8953 --75.8812 --75.8797 --75.8938 --75.8797 --75.8828 --75.8969 --75.8844 --75.8859 --75.8969 --75.8984 --75.8969 --75.8984 --75.8922 --75.8906 --75.8875 --75.8984 --75.8859 --75.8828 --75.8906 --75.8891 --75.8953 --75.8844 --75.8906 --75.8875 --75.8688 --75.8797 --75.8812 --75.8844 --75.8828 --75.8906 --75.8922 --75.8875 --75.875 --75.8766 --75.8922 --75.9031 --75.8812 --75.8812 --75.8875 --75.8891 --75.8922 --75.8891 --75.8938 --75.8766 --75.8922 --75.875 --75.8875 --75.8969 --75.8781 --75.8844 --75.8766 --75.8781 --75.8828 --75.8938 --75.8875 --75.8969 --75.8875 --75.8859 --75.8984 --75.8797 --75.8891 --75.8844 --75.8984 --75.9 --75.8984 --75.8891 --75.8984 --75.9 --75.8953 --75.8984 --75.8938 --75.9 --75.9031 --75.8844 --75.8859 --75.8859 --75.9062 --75.9 --75.8953 --75.8953 --75.8875 --75.8922 --75.8875 --75.8781 --75.8859 --75.8859 --75.8828 --75.8906 --75.8938 --75.8938 --75.8891 --75.8938 --75.8781 --75.8844 --75.8781 --75.8922 --75.8859 --75.8906 --75.8891 --75.8781 --75.8859 --75.8844 --75.875 --75.8938 --75.8984 --75.8859 --75.9031 --75.8938 --75.8859 --75.8938 --75.8844 --75.8828 --75.8797 --75.8797 --75.8812 --75.8891 --75.8953 --75.8938 --75.8781 --75.8703 --75.8781 --75.8688 --75.8875 --75.8703 --75.8781 --75.8797 --75.8703 --75.8688 --75.8625 --75.8656 --75.8641 --75.8781 --75.8594 --75.8625 --75.8688 --75.8672 --75.8719 --75.8688 --75.8625 --75.8703 --75.8656 --75.8734 --75.8703 --75.8625 --75.8641 --75.8859 --75.8797 --75.8781 --75.8734 --75.8812 --75.8797 --75.8781 --75.8781 --75.8891 --75.8891 --75.8891 --75.8844 --75.8828 --75.8906 --75.8812 --75.8844 --75.8703 --75.8922 --75.8797 --75.8828 --75.9 --75.8828 --75.9 --75.8828 --75.8812 --75.8859 --75.875 --75.8766 --75.875 --75.8906 --75.8734 --75.8766 --75.8828 --75.9031 --75.875 --75.8891 --75.8703 --75.8844 --75.8828 --75.8828 --75.8844 --75.8844 --75.8875 --75.8812 --75.8672 --75.8734 --75.8578 --75.8875 --75.8812 --75.8797 --75.8766 --75.8766 --75.8719 --75.8688 --75.8656 --75.8734 --75.8641 --75.8688 --75.8672 --75.8703 --75.8875 --75.8578 --75.8656 --75.8797 --75.8797 --75.8688 --75.8828 --75.8797 --75.8844 --75.8734 --75.8766 --75.8844 --75.8859 --75.875 --75.8781 --75.875 --75.8719 --75.8688 --75.8688 --75.8719 --75.8672 --75.8688 --75.8672 --75.8781 --75.8922 --75.8688 --75.8906 --75.8844 --75.8812 --75.8734 --75.8812 --75.8781 --75.8688 --75.8906 --75.8812 --75.8828 --75.8781 --75.8734 --75.875 --75.8781 --75.8797 --75.875 --75.8719 --75.8766 --75.8656 --75.8891 --75.8859 --75.8875 --75.8672 --75.8812 --75.8781 --75.8688 --75.875 --75.8797 --75.8797 --75.8812 --75.8906 --75.8781 --75.8766 --75.8719 --75.8703 --75.8656 --75.8719 --75.8875 --75.8656 --75.8828 --75.8688 --75.8812 --75.8688 --75.8844 --75.8766 --75.8625 --75.8766 --75.8766 --75.8828 --75.8953 --75.875 --75.8781 --75.8859 --75.8828 --75.8719 --75.8703 --75.8891 --75.8703 --75.8578 --75.8656 --75.8656 --75.875 --75.8766 --75.8719 --75.8766 --75.8812 --75.8625 --75.8703 --75.8875 --75.8734 --75.8734 --75.8672 --75.8672 --75.8844 --75.875 --75.8688 --75.8891 --75.8922 --75.8797 --75.8656 --75.8844 --75.8906 --75.8891 --75.8703 --75.8828 --75.8734 --75.8703 --75.8812 --75.8828 --75.8688 --75.8656 --75.8734 --75.8734 --75.8797 --75.8734 --75.8812 --75.8812 --75.8734 --75.8766 --75.8844 --75.8734 --75.8766 --75.8672 --75.8812 --75.8719 --75.8828 --75.8672 --75.8766 --75.875 --75.8688 --75.8703 --75.8703 --75.8828 --75.8703 --75.8734 --75.8703 --75.8734 --75.8641 --75.8703 --75.8906 --75.8703 --75.8781 --75.8734 --75.8938 --75.8891 --75.8812 --75.8828 --75.8875 --75.8812 --75.8875 --75.8953 --75.8812 --75.8703 --75.8797 --75.8859 --75.8875 --75.8875 --75.8781 --75.875 --75.8719 --75.8766 --75.8984 --75.8719 --75.8844 --75.8828 --75.8906 --75.8875 --75.8766 --75.8719 --75.8797 --75.8938 --75.8875 --75.8938 --75.8891 --75.8859 --75.8891 --75.8859 --75.8906 --75.8797 --75.8969 --75.8797 --75.8844 --75.8844 --75.8859 --75.8797 --75.8844 --75.8797 --75.8938 --75.8906 --75.8953 --75.8797 --75.8812 --75.8859 --75.8922 --75.8875 --75.8828 --75.8891 --75.8812 --75.8594 --75.8797 --75.875 --75.8781 --75.8703 --75.8766 --75.875 --75.8719 --75.8812 --75.8859 --75.8719 --75.8812 --75.8891 --75.8828 --75.8797 --75.8781 --75.8844 --75.875 --75.8672 --75.8922 --75.8797 --75.8859 --75.8703 --75.8844 --75.8906 --75.8812 --75.8875 --75.8766 --75.8859 --75.8828 --75.8766 --75.8906 --75.8906 --75.8703 --75.8922 --75.8844 --75.8859 --75.8766 --75.8781 --75.8766 --75.8766 --75.8969 --75.8812 --75.8891 --75.8922 --75.9 --75.8891 --75.8906 --75.8922 --75.8906 --75.8938 --75.8859 --75.8891 --75.8938 --75.8812 --75.8859 --75.8875 --75.8844 --75.8875 --75.8953 --75.8906 --75.8922 --75.9031 --75.9047 --75.8875 --75.9047 --75.9 --75.8953 --75.8984 --75.8875 --75.8844 --75.8953 --75.8922 --75.8875 --75.8906 --75.8875 --75.8812 --75.8891 --75.9016 --75.8969 --75.9062 --75.9016 --75.8859 --75.8859 --75.9016 --75.875 --75.8859 --75.8781 --75.9 --75.8766 --75.8734 --75.8969 --75.8859 --75.8844 --75.8734 --75.8938 --75.8953 --75.8984 --75.9016 --75.9 --75.8797 --75.8875 --75.9031 --75.8891 --75.8828 --75.8922 --75.8891 --75.8938 --75.8859 --75.8672 --75.8891 --75.8875 --75.8844 --75.8922 --75.8906 --75.8797 --75.8812 --75.8906 --75.8953 --75.8875 --75.8844 --75.8766 --75.8984 --75.8812 --75.8906 --75.8953 --75.8891 --75.8875 --75.8875 --75.8828 --75.8828 --75.8828 --75.8672 --75.8828 --75.8875 --75.8828 --75.8812 --75.8766 --75.875 --75.8844 --75.8875 --75.875 --75.8859 --75.8859 --75.8672 --75.8969 --75.8859 --75.8812 --75.8828 --75.8781 --75.8672 --75.8828 --75.8719 --75.875 --75.8828 --75.8688 --75.8797 --75.8797 --75.8781 --75.8734 --75.8703 --75.8781 --75.8844 --75.8688 --75.8891 --75.8859 --75.8828 --75.875 --75.8844 --75.8922 --75.8797 --75.8812 --75.8875 --75.8844 --75.8969 --75.8859 --75.8812 --75.8906 --75.8906 --75.8766 --75.8797 --75.8828 --75.8797 --75.875 --75.8844 --75.8719 --75.8797 --75.8766 --75.8875 --75.8688 --75.8828 --75.8766 --75.8766 --75.8797 --75.8703 --75.8828 --75.8625 --75.8625 --75.8812 --75.8719 --75.8844 --75.8766 --75.8656 --75.8812 --75.8672 --75.8734 --75.8719 --75.8844 --75.8734 --75.875 --75.8594 --75.8875 --75.8766 --75.8766 --75.8766 --75.8844 --75.8781 --75.8844 --75.8891 --75.9031 --75.8859 --75.8828 --75.8859 --75.8859 --75.8688 --75.8781 --75.8766 --75.8766 --75.8844 --75.8812 --75.8891 --75.8797 --75.8891 --75.875 --75.8766 --75.8703 --75.8703 --75.8688 --75.8719 --75.8688 --75.8781 --75.8688 --75.8828 --75.8625 --75.8656 --75.8797 --75.8781 --75.8656 --75.8844 --75.8766 --75.8859 --75.8812 --75.8812 --75.8781 --75.8859 --75.8875 --75.8891 --75.8891 --75.8875 --75.8875 --75.8797 --75.8859 --75.8906 --75.8906 --75.8922 --75.9 --75.8969 --75.8969 --75.8906 --75.8938 --75.8828 --75.8953 --75.8891 --75.8984 --75.8828 --75.8859 --75.8938 --75.8828 --75.8703 --75.8891 --75.8906 --75.9047 --75.9 --75.9078 --75.8859 --75.8953 --75.8922 --75.8953 --75.8844 --75.8922 --75.9016 --75.8891 --75.8891 --75.8969 --75.8734 --75.8859 --75.8891 --75.8859 --75.8953 --75.8812 --75.8875 --75.8828 --75.8953 --75.8734 --75.8938 --75.8859 --75.8922 --75.8859 --75.9 --75.9016 --75.9109 --75.8828 --75.8766 --75.8969 --75.8953 --75.8844 --75.9016 --75.8953 --75.8922 --75.8812 --75.9047 --75.8906 --75.9031 --75.8969 --75.8844 --75.8875 --75.8984 --75.8828 --75.8875 --75.8812 --75.8828 --75.8812 --75.8719 --75.8812 --75.8922 --75.8844 --75.8875 --75.8953 --75.8938 --75.9 --75.8688 --75.8969 --75.8797 --75.8906 --75.8938 --75.8906 --75.8953 --75.8859 --75.8922 --75.8828 --75.8969 --75.8891 --75.9 --75.8875 --75.8797 --75.8938 --75.8938 --75.8875 --75.8969 --75.8859 --75.8984 --75.875 --75.8844 --75.8953 --75.8703 --75.8906 --75.8781 --75.9031 --75.8891 --75.8891 --75.8891 --75.8859 --75.8844 --75.8828 --75.8734 --75.8812 --75.8781 --75.9016 --75.8828 --75.8906 --75.8859 --75.8906 --75.8984 --75.8891 --75.8969 --75.8953 --75.8875 --75.8953 --75.9031 --75.8953 --75.8906 --75.8969 --75.8828 --75.8969 --75.9047 --75.9031 --75.8984 --75.8938 --75.9 --75.8984 --75.8891 --75.8938 --75.8844 --75.8922 --75.8766 --75.8875 --75.8875 --75.8906 --75.8875 --75.8828 --75.8922 --75.8938 --75.8891 --75.8844 --75.8891 --75.8859 --75.8984 --75.8812 --75.8812 --75.8812 --75.8844 --75.8875 --75.8828 --75.8953 --75.8922 --75.8969 --75.8891 --75.9016 --75.8969 --75.8953 --75.9016 --75.8891 --75.8812 --75.8891 --75.9062 --75.8969 --75.8953 --75.8906 --75.8891 --75.8797 --75.8969 --75.9062 --75.8969 --75.8953 --75.8969 --75.8797 --75.8875 --75.8875 --75.8938 --75.8938 --75.8953 --75.8969 --75.8891 --75.8938 --75.8953 --75.8766 --75.8828 --75.8891 --75.8797 --75.8734 --75.8891 --75.9016 --75.8859 --75.8984 --75.8922 --75.8703 --75.8891 --75.8844 --75.8859 --75.8891 --75.8828 --75.8812 --75.8766 --75.8844 --75.8859 --75.8875 --75.8922 --75.8781 --75.8891 --75.8859 --75.8906 --75.8859 --75.8844 --75.8828 --75.8906 --75.8781 --75.8828 --75.8891 --75.8734 --75.8781 --75.8828 --75.8891 --75.8922 --75.8688 --75.8828 --75.8906 --75.8781 --75.875 --75.8844 --75.8922 --75.8766 --75.875 --75.8734 --75.8719 --75.8703 --75.8828 --75.8828 --75.8719 --75.8781 --75.8906 --75.8734 --75.8953 --75.8953 --75.8797 --75.8922 --75.8781 --75.8891 --75.8828 --75.8859 --75.8703 --75.875 --75.8984 --75.8906 --75.8766 --75.8938 --75.8906 --75.8875 --75.8859 --75.8797 --75.8812 --75.8906 --75.8828 --75.8922 --75.8922 --75.8875 --75.8922 --75.9 --75.8875 --75.8984 --75.8906 --75.9109 --75.9016 --75.8938 --75.8938 --75.8938 --75.8766 --75.8906 --75.8766 --75.8984 --75.8938 --75.8922 --75.8891 --75.8828 --75.9016 --75.9031 --75.8859 --75.8875 --75.8891 --75.8797 --75.8891 --75.8891 --75.8797 --75.8891 --75.8797 --75.8922 --75.8906 --75.9 --75.8891 --75.8953 --75.8875 --75.8891 --75.8906 --75.8906 --75.8953 --75.8969 --75.8875 --75.8891 --75.8797 --75.8797 --75.8875 --75.8781 --75.8781 --75.8938 --75.875 --75.8844 --75.8844 --75.8844 --75.8891 --75.8844 --75.8672 --75.8766 --75.8688 --75.8797 --75.8688 --75.875 --75.8734 --75.8672 --75.8594 --75.8734 --75.8703 --75.8859 --75.8766 --75.8812 --75.8719 --75.8797 --75.8828 --75.8828 --75.8781 --75.8609 --75.8766 --75.8859 --75.8766 --75.8719 --75.875 --75.8828 --75.8625 --75.8688 --75.8844 --75.8781 --75.8766 --75.8766 --75.8672 --75.8844 --75.8812 --75.8859 --75.8938 --75.8828 --75.8844 --75.8922 --75.875 --75.8812 --75.8891 --75.8891 --75.8719 --75.8844 --75.8906 --75.8844 --75.8812 --75.8734 --75.8797 --75.8844 --75.8781 --75.8891 --75.8844 --75.8812 --75.8906 --75.8891 --75.8859 --75.875 --75.8859 --75.8859 --75.8875 --75.9031 --75.8875 --75.8828 --75.8688 --75.8812 --75.8703 --75.8703 --75.8656 --75.8734 --75.8781 --75.8625 --75.875 --75.8719 --75.8703 --75.8719 --75.8812 --75.8719 --75.8688 --75.8688 --75.8672 --75.8844 --75.8766 --75.8875 --75.8844 --75.8812 --75.8781 --75.8938 --75.8844 --75.8812 --75.8844 --75.8797 --75.875 --75.8812 --75.8922 --75.8766 --75.8891 --75.8953 --75.8922 --75.8828 --75.875 --75.8703 --75.8719 --75.8781 --75.8812 --75.8812 --75.8703 --75.8891 --75.875 --75.8703 --75.8781 --75.875 --75.8734 --75.8766 --75.8844 --75.8781 --75.8781 --75.8766 --75.8781 --75.8766 --75.8844 --75.8766 --75.875 --75.8844 --75.8906 --75.8672 --75.8875 --75.8953 --75.8891 --75.8875 --75.8891 --75.8875 --75.8875 --75.8781 --75.8906 --75.8844 --75.8891 --75.8656 --75.8906 --75.8797 --75.8781 --75.8859 --75.8797 --75.8812 --75.8922 --75.8625 --75.875 --75.8828 --75.8719 --75.875 --75.8812 --75.8781 --75.8797 --75.8938 --75.8734 --75.8703 --75.8875 --75.8766 --75.8734 --75.8828 --75.8719 --75.875 --75.8844 --75.8797 --75.8828 --75.8781 --75.8672 --75.8688 --75.8781 --75.8828 --75.8781 --75.8812 --75.8812 --75.8844 --75.875 --75.8734 --75.8828 --75.8828 --75.8781 --75.8938 --75.8859 --75.8938 --75.8828 --75.8781 --75.8766 --75.8734 --75.8875 --75.8828 --75.8828 --75.8766 --75.8812 --75.8672 --75.8875 --75.875 --75.8719 --75.8844 --75.8844 --75.8875 --75.8719 --75.8797 --75.875 --75.8797 --75.8828 --75.875 --75.8859 --75.8719 --75.8891 --75.8953 --75.8781 --75.8656 --75.8766 --75.8844 --75.8828 --75.875 --75.8688 --75.875 --75.8859 --75.8625 --75.8781 --75.8812 --75.8641 --75.8656 --75.8953 --75.8844 --75.8828 --75.875 --75.8797 --75.8734 --75.8797 --75.8766 --75.8844 --75.8859 --75.8781 --75.8688 --75.8859 --75.8828 --75.8938 --75.8828 --75.8797 --75.8969 --75.8781 --75.8953 --75.8781 --75.8859 --75.8891 --75.8875 --75.8875 --75.9031 --75.8859 --75.8984 --75.8875 --75.8828 --75.8844 --75.8812 --75.8984 --75.8891 --75.8828 --75.8812 --75.8891 --75.8797 --75.8703 --75.8953 --75.8828 --75.8875 --75.8875 --75.8734 --75.8828 --75.8953 --75.8812 --75.8922 --75.8844 --75.8891 --75.8922 --75.8859 --75.8859 --75.8781 --75.8875 --75.8938 --75.8844 --75.8891 --75.8812 --75.8969 --75.8828 --75.8812 --75.8906 --75.9094 --75.8891 --75.8828 --75.8938 --75.8859 --75.9016 --75.8953 --75.8844 --75.9047 --75.8766 --75.8969 --75.8766 --75.8797 --75.8891 --75.8844 --75.8969 --75.8844 --75.8734 --75.8984 --75.8812 --75.8859 --75.8766 --75.8938 --75.8922 --75.8797 --75.8875 --75.8875 --75.8906 --75.8922 --75.8875 --75.8844 --75.8891 --75.8688 --75.8672 --75.8938 --75.9016 --75.8906 --75.8984 --75.9 --75.8906 --75.8906 --75.9 --75.8984 --75.8766 --75.8875 --75.8891 --75.8844 --75.9 --75.8984 --75.8969 --75.8922 --75.8875 --75.9031 --75.8844 --75.8797 --75.8812 --75.8984 --75.8953 --75.8969 --75.9031 --75.8875 --75.8906 --75.9 --75.8922 --75.8938 --75.8844 --75.8969 --75.9 --75.8938 --75.8922 --75.8859 --75.8891 --75.8969 --75.8984 --75.8844 --75.8891 --75.8969 --75.9 --75.8859 --75.8938 --75.9047 --75.8891 --75.8891 --75.8844 --75.8891 --75.8953 --75.8859 --75.8922 --75.8844 --75.8812 --75.8906 --75.8844 --75.8938 --75.8938 --75.8922 --75.8984 --75.8922 --75.8812 --75.9 --75.8922 --75.9016 --75.9047 --75.9094 --75.8922 --75.9062 --75.8891 --75.9062 --75.8969 --75.8938 --75.8969 --75.8828 --75.8984 --75.8984 --75.8797 --75.8906 --75.8922 --75.8859 --75.8812 --75.8953 --75.8891 --75.8984 --75.8969 --75.8953 --75.8859 --75.8766 --75.8875 --75.8875 --75.8906 --75.8875 --75.8875 --75.8938 --75.8812 --75.9141 --75.8953 --75.8938 --75.9016 --75.9031 --75.9016 --75.9141 --75.9094 --75.9062 --75.9094 --75.9062 --75.8969 --75.9094 --75.9219 --75.9078 --75.8969 --75.9062 --75.9109 --75.9047 --75.8938 --75.8953 --75.9016 --75.8938 --75.8969 --75.9 --75.9031 --75.9094 --75.8969 --75.9094 --75.8938 --75.9125 --75.9016 --75.8984 --75.8938 --75.8938 --75.8859 --75.8922 --75.9016 --75.9 --75.8906 --75.8859 --75.8906 --75.9094 --75.9 --75.9016 --75.9016 --75.8984 --75.8969 --75.9219 --75.8859 --75.9094 --75.9047 --75.9094 --75.8984 --75.8844 --75.8984 --75.9031 --75.8984 --75.8969 --75.8984 --75.8906 --75.9031 --75.8969 --75.9047 --75.8953 --75.8906 --75.8953 --75.8766 --75.9031 --75.8906 --75.9047 --75.9094 --75.8844 --75.8969 --75.9062 --75.8875 --75.9141 --75.9031 --75.9031 --75.9141 --75.9 --75.9062 --75.8859 --75.9047 --75.9016 --75.9047 --75.8906 --75.8828 --75.8922 --75.9047 --75.8828 --75.8984 --75.8891 --75.9031 --75.9047 --75.9062 --75.8875 --75.9047 --75.9 --75.8984 --75.9078 --75.8969 --75.9 --75.8969 --75.8938 --75.8938 --75.9109 --75.9109 --75.8984 --75.9 --75.9062 --75.9016 --75.9016 --75.8875 --75.9047 --75.8969 --75.9031 --75.8797 --75.9062 --75.9062 --75.8953 --75.8984 --75.9047 --75.8984 --75.8844 --75.9031 --75.9031 --75.8984 --75.9 --75.9078 --75.8969 --75.8984 --75.8891 --75.9031 --75.9016 --75.8984 --75.9047 --75.9 --75.9 --75.8984 --75.8953 --75.8922 --75.8984 --75.9141 --75.8922 --75.9 --75.8938 --75.8938 --75.9031 --75.8953 --75.9047 --75.8891 --75.9125 --75.9125 --75.9062 --75.8938 --75.9094 --75.8984 --75.8969 --75.8844 --75.8922 --75.9016 --75.9062 --75.9078 --75.8969 --75.9031 --75.9062 --75.8922 --75.8906 --75.8984 --75.9078 --75.9062 --75.9016 --75.9094 --75.9125 --75.8938 --75.8969 --75.8953 --75.9062 --75.9094 --75.9047 --75.9109 --75.9062 --75.8844 --75.9031 --75.9 --75.8891 --75.8906 --75.8938 --75.9078 --75.8969 --75.8953 --75.8938 --75.8875 --75.9031 --75.8984 --75.8953 --75.9016 --75.9031 --75.9 --75.9031 --75.8875 --75.8938 --75.9 --75.9141 --75.8844 --75.8984 --75.9031 --75.9062 --75.9062 --75.9078 --75.8844 --75.9062 --75.9062 --75.9 --75.8969 --75.8891 --75.8938 --75.8922 --75.8891 --75.8891 --75.8938 --75.8891 --75.8922 --75.9016 --75.8922 --75.9078 --75.8906 --75.9016 --75.8969 --75.9156 --75.9047 --75.8922 --75.9031 --75.9078 --75.9125 --75.8938 --75.8906 --75.9047 --75.8984 --75.9031 --75.8969 --75.8844 --75.9031 --75.8906 --75.9062 --75.8812 --75.8875 --75.9031 --75.8922 --75.8953 --75.9078 --75.8875 --75.8969 --75.9141 --75.9047 --75.9109 --75.9062 --75.9047 --75.9078 --75.9047 --75.9016 --75.9016 --75.9 --75.9078 --75.9031 --75.9062 --75.9 --75.9016 --75.9047 --75.9203 --75.9 --75.9 --75.9219 --75.9156 --75.9328 --75.9078 --75.9062 --75.9172 --75.9313 --75.9141 --75.9281 --75.9219 --75.9234 --75.9094 --75.9172 --75.9094 --75.9109 --75.9141 --75.9297 --75.9266 --75.9078 --75.9078 --75.9094 --75.8984 --75.9156 --75.9141 --75.8906 --75.9 --75.9047 --75.9016 --75.9078 --75.9141 --75.9047 --75.9156 --75.9141 --75.9156 --75.9016 --75.9109 --75.9141 --75.8984 --75.9062 --75.9016 --75.8875 --75.9016 --75.8906 --75.9047 --75.8969 --75.9031 --75.9031 --75.9047 --75.8859 --75.8953 --75.9078 --75.9109 --75.8969 --75.9031 --75.8984 --75.8938 --75.9016 --75.8859 --75.8953 --75.8938 --75.8922 --75.9047 --75.9125 --75.9016 --75.9094 --75.8969 --75.9234 --75.8969 --75.9031 --75.9094 --75.8984 --75.9016 --75.9094 --75.9078 --75.8969 --75.9 --75.9047 --75.8922 --75.9031 --75.9078 --75.9234 --75.9031 --75.9219 --75.9141 --75.9141 --75.8969 --75.9016 --75.8984 --75.9125 --75.9 --75.8984 --75.9016 --75.9125 --75.9 --75.9047 --75.8953 --75.9062 --75.9234 --75.9141 --75.9047 --75.8938 --75.9156 --75.9187 --75.8953 --75.9094 --75.9078 --75.9047 --75.9047 --75.9109 --75.9016 --75.9141 --75.9 --75.9094 --75.9062 --75.9125 --75.9141 --75.9031 --75.9156 --75.9219 --75.8953 --75.8984 --75.9141 --75.9031 --75.8953 --75.9094 --75.9 --75.8969 --75.9047 --75.8984 --75.8906 --75.9062 --75.9094 --75.8875 --75.8922 --75.9078 --75.9172 --75.9109 --75.9109 --75.8953 --75.8906 --75.9031 --75.9078 --75.9062 --75.8938 --75.8953 --75.9016 --75.9156 --75.9109 --75.9156 --75.9094 --75.9172 --75.9172 --75.9016 --75.9047 --75.9078 --75.9031 --75.9094 --75.9016 --75.8953 --75.8875 --75.9016 --75.9047 --75.8938 --75.8953 --75.8938 --75.9 --75.9031 --75.9094 --75.9047 --75.9016 --75.9187 --75.9156 --75.9125 --75.9125 --75.9125 --75.9047 --75.9109 --75.8984 --75.9187 --75.925 --75.8969 --75.9172 --75.9078 --75.9141 --75.9094 --75.9172 --75.9156 --75.9125 --75.9 --75.9062 --75.9094 --75.9109 --75.9078 --75.9 --75.8906 --75.9156 --75.9031 --75.9094 --75.9156 --75.9156 --75.9141 --75.9219 --75.9141 --75.9078 --75.9062 --75.9094 --75.9 --75.9156 --75.9187 --75.9078 --75.9187 --75.9062 --75.9016 --75.8938 --75.8922 --75.8906 --75.9078 --75.9016 --75.9141 --75.9125 --75.8984 --75.9031 --75.9031 --75.9016 --75.9109 --75.8906 --75.9094 --75.9047 --75.8938 --75.9 --75.8906 --75.8891 --75.8969 --75.8797 --75.9016 --75.8984 --75.9062 --75.9 --75.9047 --75.9125 --75.9141 --75.8891 --75.9109 --75.9172 --75.9016 --75.9172 --75.9047 --75.9125 --75.9109 --75.9172 --75.9203 --75.9125 --75.9016 --75.8938 --75.9125 --75.9016 --75.9109 --75.9 --75.8906 --75.9 --75.9047 --75.9094 --75.925 --75.9219 --75.9141 --75.9234 --75.9094 --75.9234 --75.9016 --75.8953 --75.9078 --75.8969 --75.8969 --75.9313 --75.9094 --75.9109 --75.9141 --75.9078 --75.8969 --75.9156 --75.9078 --75.9125 --75.9062 --75.9031 --75.9203 --75.9078 --75.9187 --75.8938 --75.9047 --75.9016 --75.9031 --75.9125 --75.8984 --75.9094 --75.9094 --75.9047 --75.8953 --75.8984 --75.9047 --75.9094 --75.9047 --75.9125 --75.9078 --75.9016 --75.9047 --75.9031 --75.9047 --75.9109 --75.9078 --75.9047 --75.8969 --75.8922 --75.9078 --75.9062 --75.9109 --75.9062 --75.9047 --75.9125 --75.9156 --75.9062 --75.8953 --75.9047 --75.9047 --75.9172 --75.9187 --75.9078 --75.9078 --75.8984 --75.9094 --75.9047 --75.9109 --75.9141 --75.9094 --75.9109 --75.9141 --75.9141 --75.9156 --75.9141 --75.9031 --75.9219 --75.9219 --75.9344 --75.9234 --75.9156 --75.9281 --75.9266 --75.8953 --75.9172 --75.9141 --75.9359 --75.9219 --75.9328 --75.9234 --75.9203 --75.9187 --75.9187 --75.9156 --75.9031 --75.9219 --75.9203 --75.9 --75.9 --75.9172 --75.9219 --75.9266 --75.9109 --75.9281 --75.925 --75.9141 --75.925 --75.9172 --75.9187 --75.9219 --75.925 --75.9172 --75.925 --75.9313 --75.9328 --75.9109 --75.9266 --75.9313 --75.9156 --75.9203 --75.9047 --75.9313 --75.9187 --75.9172 --75.9297 --75.9125 --75.9359 --75.9078 --75.9187 --75.9187 --75.9375 --75.9203 --75.9281 --75.9187 --75.9094 --75.9109 --75.9094 --75.9094 --75.9156 --75.9266 --75.9109 --75.9187 --75.9281 --75.9109 --75.9172 --75.9156 --75.9172 --75.9062 --75.925 --75.9109 --75.9187 --75.9203 --75.9172 --75.9203 --75.9234 --75.9266 --75.9172 --75.9281 --75.9109 --75.9109 --75.9125 --75.9203 --75.9187 --75.9094 --75.8969 --75.9156 --75.9109 --75.9141 --75.9062 --75.9047 --75.9109 --75.8953 --75.9125 --75.9141 --75.9125 --75.9 --75.9141 --75.9187 --75.9031 --75.9062 --75.9078 --75.9094 --75.9141 --75.9125 --75.8984 --75.9094 --75.9109 --75.8969 --75.9187 --75.9141 --75.9141 --75.9172 --75.9187 --75.9094 --75.9078 --75.9172 --75.9094 --75.9062 --75.9141 --75.9031 --75.9219 --75.9219 --75.9109 --75.9187 --75.9266 --75.9187 --75.9156 --75.9219 --75.9062 --75.9156 --75.9156 --75.9266 --75.9156 --75.9172 --75.9187 --75.9203 --75.9172 --75.9266 --75.9187 --75.9141 --75.9313 --75.9234 --75.925 --75.9234 --75.9219 --75.9234 --75.9281 --75.9156 --75.9187 --75.9141 --75.9031 --75.9219 --75.9172 --75.9219 --75.9234 --75.9281 --75.9234 --75.9297 --75.925 --75.9266 --75.9234 --75.9266 --75.925 --75.9203 --75.9219 --75.9344 --75.9281 --75.9219 --75.925 --75.9187 --75.9266 --75.9281 --75.9313 --75.9406 --75.9234 --75.9297 --75.9313 --75.9422 --75.9359 --75.9203 --75.9406 --75.9281 --75.9391 --75.9391 --75.9313 --75.9359 --75.9422 --75.9297 --75.9281 --75.9281 --75.9375 --75.9344 --75.9375 --75.9469 --75.9359 --75.9484 --75.9359 --75.9375 --75.9281 --75.925 --75.9422 --75.9344 --75.9281 --75.9391 --75.9453 --75.9187 --75.9297 --75.9234 --75.9219 --75.9328 --75.9109 --75.9219 --75.9203 --75.9297 --75.9141 --75.9266 --75.9234 --75.9109 --75.9141 --75.9266 --75.9391 --75.9187 --75.9266 --75.9187 --75.9187 --75.9203 --75.9313 --75.9313 --75.9156 --75.9156 --75.9281 --75.9234 --75.9203 --75.9109 --75.9266 --75.9187 --75.9313 --75.925 --75.9141 --75.9344 --75.925 --75.9187 --75.9266 --75.9234 --75.9391 --75.9297 --75.9297 --75.9172 --75.9219 --75.9328 --75.9375 --75.9219 --75.9281 --75.9109 --75.9203 --75.9266 --75.9297 --75.9078 --75.925 --75.925 --75.9234 --75.9172 --75.9172 --75.9313 --75.9281 --75.9422 --75.9281 --75.9375 --75.9313 --75.9219 --75.9313 --75.9375 --75.9125 --75.9328 --75.9344 --75.9297 --75.9328 --75.9313 --75.9375 --75.9359 --75.9328 --75.9234 --75.9344 --75.9437 --75.9313 --75.9328 --75.9281 --75.9359 --75.9297 --75.925 --75.9297 --75.9359 --75.9344 --75.9391 --75.9359 --75.9156 --75.9281 --75.925 --75.9313 --75.9234 --75.9344 --75.925 --75.9297 --75.9313 --75.9344 --75.9313 --75.9344 --75.9313 --75.9266 --75.9266 --75.9266 --75.9297 --75.9297 --75.9234 --75.9359 --75.9281 --75.9234 --75.9375 --75.925 --75.9219 --75.9234 --75.9234 --75.9203 --75.9187 --75.9219 --75.925 --75.925 --75.9109 --75.9234 --75.9281 --75.9359 --75.9266 --75.9281 --75.9344 --75.9219 --75.9313 --75.9187 --75.9203 --75.9266 --75.9297 --75.9187 --75.9219 --75.9266 --75.9266 --75.9281 --75.9391 --75.925 --75.9266 --75.9172 --75.9281 --75.9156 --75.9328 --75.9156 --75.9297 --75.9375 --75.925 --75.9422 --75.9453 --75.9313 --75.925 --75.9266 --75.9344 --75.9297 --75.9125 --75.9313 --75.9328 --75.9391 --75.9141 --75.925 --75.9187 --75.9203 --75.9313 --75.9313 --75.9344 --75.9234 --75.9109 --75.9203 --75.9172 --75.9234 --75.9203 --75.925 --75.9297 --75.9328 --75.9297 --75.9297 --75.9422 --75.9328 --75.9313 --75.9297 --75.9297 --75.9281 --75.9094 --75.9375 --75.9375 --75.9422 --75.9297 --75.9328 --75.9344 --75.9375 --75.925 --75.9266 --75.9297 --75.9359 --75.9266 --75.95 --75.9375 --75.9172 --75.9219 --75.9313 --75.9234 --75.9375 --75.925 --75.9281 --75.9156 --75.9344 --75.9437 --75.9359 --75.9437 --75.9359 --75.9422 --75.9359 --75.9516 --75.9406 --75.9328 --75.9391 --75.925 --75.9328 --75.9359 --75.9344 --75.9516 --75.9344 --75.9406 --75.9375 --75.9406 --75.9328 --75.9234 --75.9391 --75.9344 --75.9313 --75.9344 --75.9375 --75.9422 --75.9344 --75.95 --75.9266 --75.9406 --75.9328 --75.9453 --75.9375 --75.9281 --75.9453 --75.9391 --75.9437 --75.9266 --75.9359 --75.9391 --75.9297 --75.9281 --75.925 --75.9391 --75.9375 --75.9344 --75.9328 --75.9203 --75.9313 --75.9359 --75.9328 --75.9641 --75.9375 --75.9281 --75.9391 --75.9375 --75.9313 --75.9297 --75.9391 --75.9359 --75.9359 --75.9391 --75.9172 --75.9437 --75.9344 --75.9516 --75.9328 --75.9359 --75.9406 --75.9297 --75.9328 --75.9328 --75.9281 --75.9266 --75.9406 --75.9359 --75.9219 --75.9297 --75.9344 --75.9187 --75.9359 --75.9141 --75.925 --75.925 --75.9266 --75.9297 --75.9313 --75.9094 --75.9344 --75.9328 --75.9375 --75.9234 --75.9234 --75.9297 --75.925 --75.9359 --75.925 --75.9391 --75.9266 --75.925 --75.9281 --75.9359 --75.9344 --75.9328 --75.9156 --75.9344 --75.9234 --75.9203 --75.9219 --75.9359 --75.9328 --75.9281 --75.925 --75.9172 --75.9406 --75.9391 --75.9281 --75.9344 --75.9328 --75.9391 --75.9359 --75.9234 --75.9313 --75.925 --75.9203 --75.9453 --75.9187 --75.9359 --75.9344 --75.9266 --75.9328 --75.9328 --75.9172 --75.9344 --75.9391 --75.9297 --75.9266 --75.9297 --75.9313 --75.9469 --75.9484 --75.925 --75.9266 --75.9375 --75.9391 --75.9344 --75.9359 --75.9375 --75.9297 --75.9281 --75.95 --75.9437 --75.9375 --75.95 --75.9469 --75.9422 --75.9406 --75.9406 --75.9437 --75.9344 --75.9359 --75.9328 --75.9359 --75.9391 --75.9281 --75.9375 --75.9437 --75.9344 --75.925 --75.9297 --75.9422 --75.9391 --75.9484 --75.9219 --75.9406 --75.9453 --75.9375 --75.9344 --75.9391 --75.9453 --75.9422 --75.9437 --75.9516 --75.9406 --75.9391 --75.9469 --75.9313 --75.9469 --75.9453 --75.9516 --75.9625 --75.9453 --75.9422 --75.9437 --75.9359 --75.9453 --75.9578 --75.9359 --75.9437 --75.9359 --75.9406 --75.9422 --75.9344 --75.9437 --75.9344 --75.9453 --75.9406 --75.9437 --75.9391 --75.9375 --75.9406 --75.9469 --75.9359 --75.95 --75.9406 --75.9516 --75.9437 --75.9578 --75.9531 --75.9469 --75.9406 --75.9437 --75.9531 --75.9422 --75.9422 --75.9328 --75.9437 --75.9344 --75.9656 --75.9375 --75.9484 --75.9484 --75.9359 --75.9313 --75.9594 --75.9484 --75.9375 --75.9391 --75.9453 --75.9469 --75.9563 --75.9406 --75.9547 --75.9344 --75.9391 --75.9469 --75.9531 --75.9516 --75.9406 --75.9453 --75.9563 --75.9422 --75.9469 --75.9437 --75.9594 --75.9594 --75.9641 --75.9484 --75.9531 --75.9563 --75.95 --75.9547 --75.9453 --75.9625 --75.9484 --75.9547 --75.9594 --75.9422 --75.9375 --75.9531 --75.9469 --75.9469 --75.95 --75.9547 --75.9469 --75.9437 --75.9422 --75.95 --75.9406 --75.9578 --75.9406 --75.9406 --75.9516 --75.9344 --75.9422 --75.9547 --75.95 --75.9406 --75.9391 --75.9375 --75.9469 --75.9453 --75.9422 --75.9297 --75.9344 --75.9437 --75.9469 --75.9391 --75.9516 --75.9422 --75.9453 --75.9437 --75.9406 --75.9437 --75.9578 --75.9375 --75.9453 --75.9453 --75.9422 --75.95 --75.9547 --75.9422 --75.9328 --75.9641 --75.9672 --75.95 --75.9563 --75.9469 --75.9578 --75.9516 --75.9469 --75.9328 --75.9453 --75.9406 --75.95 --75.9563 --75.9578 --75.9484 --75.9547 --75.9578 --75.9563 --75.9469 --75.95 --75.9422 --75.9359 --75.9594 --75.9484 --75.9453 --75.95 --75.9609 --75.9422 --75.9578 --75.9516 --75.9594 --75.9516 --75.9531 --75.9469 --75.9422 --75.9453 --75.95 --75.9437 --75.9391 --75.9453 --75.9484 --75.9375 --75.9469 --75.9437 --75.95 --75.9469 --75.9453 --75.95 --75.9406 --75.9484 --75.9563 --75.9578 --75.9406 --75.9437 --75.95 --75.9484 --75.9516 --75.9422 --75.9531 --75.9437 --75.9484 --75.9578 --75.9672 --75.95 --75.9531 --75.9656 --75.9453 --75.9641 --75.9453 --75.9531 --75.9484 --75.9516 --75.9484 --75.9531 --75.9563 --75.9469 --75.9484 --75.9625 --75.9437 --75.9609 --75.9516 --75.9609 --75.9484 --75.9625 --75.9563 --75.9625 --75.9437 --75.9516 --75.9656 --75.9437 --75.9641 --75.9578 --75.9563 --75.9547 --75.9344 --75.9453 --75.9578 --75.9453 --75.9516 --75.9391 --75.9453 --75.9484 --75.9437 --75.9344 --75.9375 --75.9437 --75.9422 --75.9469 --75.9422 --75.9516 --75.9328 --75.9437 --75.9375 --75.9266 --75.9422 --75.9422 --75.9406 --75.9516 --75.9406 --75.9453 --75.9484 --75.9328 --75.9422 --75.9531 --75.9437 --75.9406 --75.9281 --75.9281 --75.9313 --75.9375 --75.9281 --75.9391 --75.9437 --75.9422 --75.9328 --75.9469 --75.9344 --75.9453 --75.95 --75.9484 --75.9281 --75.9547 --75.9328 --75.9437 --75.9563 --75.9484 --75.9328 --75.9578 --75.9344 --75.9297 --75.9313 --75.9484 --75.95 --75.9469 --75.9484 --75.9437 --75.9266 --75.9406 --75.9453 --75.9422 --75.9516 --75.9328 --75.9437 --75.9469 --75.9344 --75.9437 --75.9437 --75.9375 --75.9391 --75.9406 --75.9547 --75.9453 --75.9563 --75.9578 --75.9484 --75.9437 --75.9359 --75.9422 --75.9391 --75.9578 --75.9516 --75.95 --75.9531 --75.9563 --75.9563 --75.9578 --75.9594 --75.9609 --75.9594 --75.9516 --75.9563 --75.9578 --75.9609 --75.9672 --75.9547 --75.9563 --75.9625 --75.9656 --75.95 --75.9563 --75.9656 --75.9469 --75.9484 --75.9547 --75.9453 --75.95 --75.95 --75.9609 --75.9531 --75.9484 --75.9344 --75.9328 --75.95 --75.9484 --75.9531 --75.9391 --75.9516 --75.9344 --75.9531 --75.9469 --75.9484 --75.9469 --75.9469 --75.9578 --75.9547 --75.9547 --75.9437 --75.9469 --75.95 --75.95 --75.9578 --75.9437 --75.9531 --75.9563 --75.9453 --75.9453 --75.9453 --75.9422 --75.95 --75.9531 --75.9609 --75.9531 --75.9328 --75.9328 --75.9547 --75.9406 --75.9531 --75.9516 --75.9547 --75.9391 --75.9609 --75.95 --75.9531 --75.9406 --75.9297 --75.9313 --75.9406 --75.9484 --75.9469 --75.9625 --75.9406 --75.9578 --75.9563 --75.9641 --75.9484 --75.9625 --75.9641 --75.9594 --75.9672 --75.95 --75.9563 --75.9484 --75.9563 --75.95 --75.9531 --75.9563 --75.9391 --75.95 --75.9516 --75.9563 --75.9516 --75.9484 --75.95 --75.9688 --75.9656 --75.9578 --75.95 --75.9375 --75.9609 --75.9516 --75.9547 --75.9406 --75.9344 --75.9609 --75.9547 --75.9563 --75.9406 --75.9594 --75.9656 --75.9391 --75.9609 --75.9578 --75.9469 --75.9609 --75.9578 --75.9422 --75.9563 --75.9672 --75.9547 --75.9625 --75.9594 --75.9516 --75.9688 --75.9594 --75.9563 --75.9594 --75.9594 --75.9672 --75.9625 --75.9563 --75.9594 --75.9656 --75.9578 --75.9656 --75.9688 --75.9734 --75.9563 --75.9609 --75.9625 --75.9641 --75.9641 --75.9594 --75.9609 --75.9547 --75.9656 --75.9563 --75.9656 --75.9688 --75.9609 --75.9563 --75.9641 --75.9734 --75.9609 --75.9609 --75.9703 --75.9547 --75.9594 --75.9594 --75.9781 --75.9625 --75.9578 --75.9563 --75.9594 --75.9531 --75.9516 --75.9594 --75.95 --75.9469 --75.9563 --75.9531 --75.9594 --75.9547 --75.9422 --75.9453 --75.9531 --75.95 --75.9531 --75.9563 --75.9547 --75.9672 --75.9703 --75.9547 --75.9594 --75.9516 --75.9547 --75.9578 --75.9578 --75.9609 --75.9703 --75.9531 --75.9594 --75.9563 --75.9609 --75.9563 --75.9688 --75.9422 --75.9531 --75.9594 --75.9641 --75.9563 --75.9656 --75.9469 --75.9688 --75.9672 --75.9563 --75.9625 --75.9609 --75.9594 --75.9578 --75.9672 --75.9656 --75.9656 --75.95 --75.9656 --75.9688 --75.9656 --75.9766 --75.9719 --75.9688 --75.9812 --75.9719 --75.9719 --75.9703 --75.9672 --75.9641 --75.9719 --75.9781 --75.9766 --75.9672 --75.9656 --75.9656 --75.9609 --75.9688 --75.9625 --75.9688 --75.9625 --75.9656 --75.9781 --75.9766 --75.9781 --75.9703 --75.975 --75.9734 --75.9719 --75.9609 --75.9766 --75.9609 --75.9812 --75.9828 --75.9828 --75.9812 --75.9672 --75.9719 --75.9797 --75.975 --75.9797 --75.9719 --75.9719 --75.9812 --75.9625 --75.9766 --75.9812 --75.9797 --75.9719 --75.9766 --75.975 --75.9703 --75.9797 --75.9688 --75.9703 --75.9766 --75.9859 --75.975 --75.9812 --75.9641 --75.9797 --75.9781 --75.9609 --75.9812 --75.9891 --75.9719 --75.975 --75.9688 --75.9641 --75.9656 --75.9766 --75.9797 --75.9891 --75.9781 --75.9672 --75.9703 --75.9703 --75.9766 --75.9625 --75.9734 --75.9688 --75.9812 --75.975 --75.9734 --75.9688 --75.9766 --75.9812 --75.9703 --75.9703 --75.9797 --75.9797 --75.9828 --75.9781 --75.9703 --75.9781 --75.975 --75.9719 --75.9719 --75.9625 --75.9875 --75.9719 --75.9734 --75.9734 --75.9688 --75.9688 --75.9656 --75.9781 --75.9672 --75.9703 --75.9766 --75.9719 --75.9656 --75.9797 --75.9688 --75.9672 --75.9641 --75.9781 --75.9844 --75.9641 --75.9719 --75.9844 --75.9781 --75.9703 --75.9703 --75.9797 --75.9656 --75.9641 --75.9734 --75.9578 --75.9734 --75.9563 --75.9688 --75.9516 --75.9609 --75.9563 --75.9594 --75.9594 --75.9578 --75.9547 --75.9594 --75.9672 --75.9703 --75.9703 --75.9609 --75.9609 --75.9641 --75.975 --75.9609 --75.9609 --75.9531 --75.9578 --75.9516 --75.9531 --75.9703 --75.9641 --75.9656 --75.9703 --75.9469 --75.9641 --75.9563 --75.9688 --75.9625 --75.9578 --75.9641 --75.9656 --75.9641 --75.9672 --75.9578 --75.9547 --75.9688 --75.9672 --75.9609 --75.9625 --75.9625 --75.9609 --75.9594 --75.9516 --75.9594 --75.9703 --75.9594 --75.9656 --75.9719 --75.9625 --75.9578 --75.9563 --75.9625 --75.9766 --75.9734 --75.9563 --75.9766 --75.9656 --75.9641 --75.9891 --75.9563 --75.9812 --75.9656 --75.9781 --75.975 --75.9781 --75.9688 --75.9672 --75.9641 --75.9609 --75.9734 --75.9719 --75.9516 --75.9734 --75.9531 --75.9719 --75.9641 --75.9563 --75.9625 --75.9547 --75.9578 --75.9688 --75.9766 --75.9641 --75.9812 --75.9609 --75.9766 --75.9766 --75.9609 --75.9719 --75.9688 --75.9641 --75.975 --75.9672 --75.9609 --75.9656 --75.9594 --75.9734 --75.9766 --75.9531 --75.9641 --75.9703 --75.9625 --75.9688 --75.9563 --75.9656 --75.9594 --75.9484 --75.9641 --75.9563 --75.9469 --75.9547 --75.9703 --75.9641 --75.9609 --75.9563 --75.9688 --75.9563 --75.9547 --75.9594 --75.9484 --75.9578 --75.9594 --75.9437 --75.9625 --75.9719 --75.9672 --75.9437 --75.9719 --75.9609 --75.9625 --75.9797 --75.9547 --75.9563 --75.9484 --75.9609 --75.9484 --75.9641 --75.9625 --75.9656 --75.9688 --75.9688 --75.9609 --75.9563 --75.9625 --75.9641 --75.9672 --75.9719 --75.9672 --75.9656 --75.9531 --75.9563 --75.9609 --75.9656 --75.9563 --75.9625 --75.9656 --75.9578 --75.9469 --75.9781 --75.9594 --75.9578 --75.9672 --75.9641 --75.9641 --75.9703 --75.9578 --75.9609 --75.9672 --75.9641 --75.9594 --75.9656 --75.9656 --75.9641 --75.9578 --75.9719 --75.95 --75.9641 --75.9531 --75.9656 --75.9578 --75.9563 --75.95 --75.9563 --75.9594 --75.9578 --75.9594 --75.9609 --75.9484 --75.9625 --75.9391 --75.9578 --75.9672 --75.9563 --75.9453 --75.9516 --75.9531 --75.9594 --75.9484 --75.9516 --75.9531 --75.9531 --75.9672 --75.9516 --75.9625 --75.9547 - -2 -4.0025 -100.002 - -0 -1 - -0 -RegionFitness xdat ydat boundary weight (lines=81008) 1 -|| -40500 -0 -0.005 -0.01 -0.015 -0.02 -0.025 -0.03 -0.035 -0.04 -0.045 -0.05 -0.055 -0.06 -0.065 -0.07 -0.075 -0.08 -0.085 -0.09 -0.095 -0.1 -0.105 -0.11 -0.115 -0.12 -0.125 -0.13 -0.135 -0.14 -0.145 -0.15 -0.155 -0.16 -0.165 -0.17 -0.175 -0.18 -0.185 -0.19 -0.195 -0.2 -0.205 -0.21 -0.215 -0.22 -0.225 -0.23 -0.235 -0.24 -0.245 -0.25 -0.255 -0.26 -0.265 -0.27 -0.275 -0.28 -0.285 -0.29 -0.295 -0.3 -0.305 -0.31 -0.315 -0.32 -0.325 -0.33 -0.335 -0.34 -0.345 -0.35 -0.355 -0.36 -0.365 -0.37 -0.375 -0.38 -0.385 -0.39 -0.395 -0.4 -0.405 -0.41 -0.415 -0.42 -0.425 -0.43 -0.435 -0.44 -0.445 -0.45 -0.455 -0.46 -0.465 -0.47 -0.475 -0.48 -0.485 -0.49 -0.495 -0.5 -0.505 -0.51 -0.515 -0.52 -0.525 -0.53 -0.535 -0.54 -0.545 -0.55 -0.555 -0.56 -0.565 -0.57 -0.575 -0.58 -0.585 -0.59 -0.595 -0.6 -0.605 -0.61 -0.615 -0.62 -0.625 -0.63 -0.635 -0.64 -0.645 -0.65 -0.655 -0.66 -0.665 -0.67 -0.675 -0.68 -0.685 -0.69 -0.695 -0.7 -0.705 -0.71 -0.715 -0.72 -0.725 -0.73 -0.735 -0.74 -0.745 -0.75 -0.755 -0.76 -0.765 -0.77 -0.775 -0.78 -0.785 -0.79 -0.795 -0.8 -0.805 -0.81 -0.815 -0.82 -0.825 -0.83 -0.835 -0.84 -0.845 -0.85 -0.855 -0.86 -0.865 -0.87 -0.875 -0.88 -0.885 -0.89 -0.895 -0.9 -0.905 -0.91 -0.915 -0.92 -0.925 -0.93 -0.935 -0.94 -0.945 -0.95 -0.955 -0.96 -0.965 -0.97 -0.975 -0.98 -0.985 -0.99 -0.995 -1 -1.005 -1.01 -1.015 -1.02 -1.025 -1.03 -1.035 -1.04 -1.045 -1.05 -1.055 -1.06 -1.065 -1.07 -1.075 -1.08 -1.085 -1.09 -1.095 -1.1 -1.105 -1.11 -1.115 -1.12 -1.125 -1.13 -1.135 -1.14 -1.145 -1.15 -1.155 -1.16 -1.165 -1.17 -1.175 -1.18 -1.185 -1.19 -1.195 -1.2 -1.205 -1.21 -1.215 -1.22 -1.225 -1.23 -1.235 -1.24 -1.245 -1.25 -1.255 -1.26 -1.265 -1.27 -1.275 -1.28 -1.285 -1.29 -1.295 -1.3 -1.305 -1.31 -1.315 -1.32 -1.325 -1.33 -1.335 -1.34 -1.345 -1.35 -1.355 -1.36 -1.365 -1.37 -1.375 -1.38 -1.385 -1.39 -1.395 -1.4 -1.405 -1.41 -1.415 -1.42 -1.425 -1.43 -1.435 -1.44 -1.445 -1.45 -1.455 -1.46 -1.465 -1.47 -1.475 -1.48 -1.485 -1.49 -1.495 -1.5 -1.505 -1.51 -1.515 -1.52 -1.525 -1.53 -1.535 -1.54 -1.545 -1.55 -1.555 -1.56 -1.565 -1.57 -1.575 -1.58 -1.585 -1.59 -1.595 -1.6 -1.605 -1.61 -1.615 -1.62 -1.625 -1.63 -1.635 -1.64 -1.645 -1.65 -1.655 -1.66 -1.665 -1.67 -1.675 -1.68 -1.685 -1.69 -1.695 -1.7 -1.705 -1.71 -1.715 -1.72 -1.725 -1.73 -1.735 -1.74 -1.745 -1.75 -1.755 -1.76 -1.765 -1.77 -1.775 -1.78 -1.785 -1.79 -1.795 -1.8 -1.805 -1.81 -1.815 -1.82 -1.825 -1.83 -1.835 -1.84 -1.845 -1.85 -1.855 -1.86 -1.865 -1.87 -1.875 -1.88 -1.885 -1.89 -1.895 -1.9 -1.905 -1.91 -1.915 -1.92 -1.925 -1.93 -1.935 -1.94 -1.945 -1.95 -1.955 -1.96 -1.965 -1.97 -1.975 -1.98 -1.985 -1.99 -1.995 -2 -2.005 -2.01 -2.015 -2.02 -2.025 -2.03 -2.035 -2.04 -2.045 -2.05 -2.055 -2.06 -2.065 -2.07 -2.075 -2.08 -2.085 -2.09 -2.095 -2.1 -2.105 -2.11 -2.115 -2.12 -2.125 -2.13 -2.135 -2.14 -2.145 -2.15 -2.155 -2.16 -2.165 -2.17 -2.175 -2.18 -2.185 -2.19 -2.195 -2.2 -2.205 -2.21 -2.215 -2.22 -2.225 -2.23 -2.235 -2.24 -2.245 -2.25 -2.255 -2.26 -2.265 -2.27 -2.275 -2.28 -2.285 -2.29 -2.295 -2.3 -2.305 -2.31 -2.315 -2.32 -2.325 -2.33 -2.335 -2.34 -2.345 -2.35 -2.355 -2.36 -2.365 -2.37 -2.375 -2.38 -2.385 -2.39 -2.395 -2.4 -2.405 -2.41 -2.415 -2.42 -2.425 -2.43 -2.435 -2.44 -2.445 -2.45 -2.455 -2.46 -2.465 -2.47 -2.475 -2.48 -2.485 -2.49 -2.495 -2.5 -2.505 -2.51 -2.515 -2.52 -2.525 -2.53 -2.535 -2.54 -2.545 -2.55 -2.555 -2.56 -2.565 -2.57 -2.575 -2.58 -2.585 -2.59 -2.595 -2.6 -2.605 -2.61 -2.615 -2.62 -2.625 -2.63 -2.635 -2.64 -2.645 -2.65 -2.655 -2.66 -2.665 -2.67 -2.675 -2.68 -2.685 -2.69 -2.695 -2.7 -2.705 -2.71 -2.715 -2.72 -2.725 -2.73 -2.735 -2.74 -2.745 -2.75 -2.755 -2.76 -2.765 -2.77 -2.775 -2.78 -2.785 -2.79 -2.795 -2.8 -2.805 -2.81 -2.815 -2.82 -2.825 -2.83 -2.835 -2.84 -2.845 -2.85 -2.855 -2.86 -2.865 -2.87 -2.875 -2.88 -2.885 -2.89 -2.895 -2.9 -2.905 -2.91 -2.915 -2.92 -2.925 -2.93 -2.935 -2.94 -2.945 -2.95 -2.955 -2.96 -2.965 -2.97 -2.975 -2.98 -2.985 -2.99 -2.995 -3 -3.005 -3.01 -3.015 -3.02 -3.025 -3.03 -3.035 -3.04 -3.045 -3.05 -3.055 -3.06 -3.065 -3.07 -3.075 -3.08 -3.085 -3.09 -3.095 -3.1 -3.105 -3.11 -3.115 -3.12 -3.125 -3.13 -3.135 -3.14 -3.145 -3.15 -3.155 -3.16 -3.165 -3.17 -3.175 -3.18 -3.185 -3.19 -3.195 -3.2 -3.205 -3.21 -3.215 -3.22 -3.225 -3.23 -3.235 -3.24 -3.245 -3.25 -3.255 -3.26 -3.265 -3.27 -3.275 -3.28 -3.285 -3.29 -3.295 -3.3 -3.305 -3.31 -3.315 -3.32 -3.325 -3.33 -3.335 -3.34 -3.345 -3.35 -3.355 -3.36 -3.365 -3.37 -3.375 -3.38 -3.385 -3.39 -3.395 -3.4 -3.405 -3.41 -3.415 -3.42 -3.425 -3.43 -3.435 -3.44 -3.445 -3.45 -3.455 -3.46 -3.465 -3.47 -3.475 -3.48 -3.485 -3.49 -3.495 -3.5 -3.505 -3.51 -3.515 -3.52 -3.525 -3.53 -3.535 -3.54 -3.545 -3.55 -3.555 -3.56 -3.565 -3.57 -3.575 -3.58 -3.585 -3.59 -3.595 -3.6 -3.605 -3.61 -3.615 -3.62 -3.625 -3.63 -3.635 -3.64 -3.645 -3.65 -3.655 -3.66 -3.665 -3.67 -3.675 -3.68 -3.685 -3.69 -3.695 -3.7 -3.705 -3.71 -3.715 -3.72 -3.725 -3.73 -3.735 -3.74 -3.745 -3.75 -3.755 -3.76 -3.765 -3.77 -3.775 -3.78 -3.785 -3.79 -3.795 -3.8 -3.805 -3.81 -3.815 -3.82 -3.825 -3.83 -3.835 -3.84 -3.845 -3.85 -3.855 -3.86 -3.865 -3.87 -3.875 -3.88 -3.885 -3.89 -3.895 -3.9 -3.905 -3.91 -3.915 -3.92 -3.925 -3.93 -3.935 -3.94 -3.945 -3.95 -3.955 -3.96 -3.965 -3.97 -3.975 -3.98 -3.985 -3.99 -3.995 -4 -4.005 -4.01 -4.015 -4.02 -4.025 -4.03 -4.035 -4.04 -4.045 -4.05 -4.055 -4.06 -4.065 -4.07 -4.075 -4.08 -4.085 -4.09 -4.095 -4.1 -4.105 -4.11 -4.115 -4.12 -4.125 -4.13 -4.135 -4.14 -4.145 -4.15 -4.155 -4.16 -4.165 -4.17 -4.175 -4.18 -4.185 -4.19 -4.195 -4.2 -4.205 -4.21 -4.215 -4.22 -4.225 -4.23 -4.235 -4.24 -4.245 -4.25 -4.255 -4.26 -4.265 -4.27 -4.275 -4.28 -4.285 -4.29 -4.295 -4.3 -4.305 -4.31 -4.315 -4.32 -4.325 -4.33 -4.335 -4.34 -4.345 -4.35 -4.355 -4.36 -4.365 -4.37 -4.375 -4.38 -4.385 -4.39 -4.395 -4.4 -4.405 -4.41 -4.415 -4.42 -4.425 -4.43 -4.435 -4.44 -4.445 -4.45 -4.455 -4.46 -4.465 -4.47 -4.475 -4.48 -4.485 -4.49 -4.495 -4.5 -4.505 -4.51 -4.515 -4.52 -4.525 -4.53 -4.535 -4.54 -4.545 -4.55 -4.555 -4.56 -4.565 -4.57 -4.575 -4.58 -4.585 -4.59 -4.595 -4.6 -4.605 -4.61 -4.615 -4.62 -4.625 -4.63 -4.635 -4.64 -4.645 -4.65 -4.655 -4.66 -4.665 -4.67 -4.675 -4.68 -4.685 -4.69 -4.695 -4.7 -4.705 -4.71 -4.715 -4.72 -4.725 -4.73 -4.735 -4.74 -4.745 -4.75 -4.755 -4.76 -4.765 -4.77 -4.775 -4.78 -4.785 -4.79 -4.795 -4.8 -4.805 -4.81 -4.815 -4.82 -4.825 -4.83 -4.835 -4.84 -4.845 -4.85 -4.855 -4.86 -4.865 -4.87 -4.875 -4.88 -4.885 -4.89 -4.895 -4.9 -4.905 -4.91 -4.915 -4.92 -4.925 -4.93 -4.935 -4.94 -4.945 -4.95 -4.955 -4.96 -4.965 -4.97 -4.975 -4.98 -4.985 -4.99 -4.995 -5 -5.005 -5.01 -5.015 -5.02 -5.025 -5.03 -5.035 -5.04 -5.045 -5.05 -5.055 -5.06 -5.065 -5.07 -5.075 -5.08 -5.085 -5.09 -5.095 -5.1 -5.105 -5.11 -5.115 -5.12 -5.125 -5.13 -5.135 -5.14 -5.145 -5.15 -5.155 -5.16 -5.165 -5.17 -5.175 -5.18 -5.185 -5.19 -5.195 -5.2 -5.205 -5.21 -5.215 -5.22 -5.225 -5.23 -5.235 -5.24 -5.245 -5.25 -5.255 -5.26 -5.265 -5.27 -5.275 -5.28 -5.285 -5.29 -5.295 -5.3 -5.305 -5.31 -5.315 -5.32 -5.325 -5.33 -5.335 -5.34 -5.345 -5.35 -5.355 -5.36 -5.365 -5.37 -5.375 -5.38 -5.385 -5.39 -5.395 -5.4 -5.405 -5.41 -5.415 -5.42 -5.425 -5.43 -5.435 -5.44 -5.445 -5.45 -5.455 -5.46 -5.465 -5.47 -5.475 -5.48 -5.485 -5.49 -5.495 -5.5 -5.505 -5.51 -5.515 -5.52 -5.525 -5.53 -5.535 -5.54 -5.545 -5.55 -5.555 -5.56 -5.565 -5.57 -5.575 -5.58 -5.585 -5.59 -5.595 -5.6 -5.605 -5.61 -5.615 -5.62 -5.625 -5.63 -5.635 -5.64 -5.645 -5.65 -5.655 -5.66 -5.665 -5.67 -5.675 -5.68 -5.685 -5.69 -5.695 -5.7 -5.705 -5.71 -5.715 -5.72 -5.725 -5.73 -5.735 -5.74 -5.745 -5.75 -5.755 -5.76 -5.765 -5.77 -5.775 -5.78 -5.785 -5.79 -5.795 -5.8 -5.805 -5.81 -5.815 -5.82 -5.825 -5.83 -5.835 -5.84 -5.845 -5.85 -5.855 -5.86 -5.865 -5.87 -5.875 -5.88 -5.885 -5.89 -5.895 -5.9 -5.905 -5.91 -5.915 -5.92 -5.925 -5.93 -5.935 -5.94 -5.945 -5.95 -5.955 -5.96 -5.965 -5.97 -5.975 -5.98 -5.985 -5.99 -5.995 -6 -6.005 -6.01 -6.015 -6.02 -6.025 -6.03 -6.035 -6.04 -6.045 -6.05 -6.055 -6.06 -6.065 -6.07 -6.075 -6.08 -6.085 -6.09 -6.095 -6.1 -6.105 -6.11 -6.115 -6.12 -6.125 -6.13 -6.135 -6.14 -6.145 -6.15 -6.155 -6.16 -6.165 -6.17 -6.175 -6.18 -6.185 -6.19 -6.195 -6.2 -6.205 -6.21 -6.215 -6.22 -6.225 -6.23 -6.235 -6.24 -6.245 -6.25 -6.255 -6.26 -6.265 -6.27 -6.275 -6.28 -6.285 -6.29 -6.295 -6.3 -6.305 -6.31 -6.315 -6.32 -6.325 -6.33 -6.335 -6.34 -6.345 -6.35 -6.355 -6.36 -6.365 -6.37 -6.375 -6.38 -6.385 -6.39 -6.395 -6.4 -6.405 -6.41 -6.415 -6.42 -6.425 -6.43 -6.435 -6.44 -6.445 -6.45 -6.455 -6.46 -6.465 -6.47 -6.475 -6.48 -6.485 -6.49 -6.495 -6.5 -6.505 -6.51 -6.515 -6.52 -6.525 -6.53 -6.535 -6.54 -6.545 -6.55 -6.555 -6.56 -6.565 -6.57 -6.575 -6.58 -6.585 -6.59 -6.595 -6.6 -6.605 -6.61 -6.615 -6.62 -6.625 -6.63 -6.635 -6.64 -6.645 -6.65 -6.655 -6.66 -6.665 -6.67 -6.675 -6.68 -6.685 -6.69 -6.695 -6.7 -6.705 -6.71 -6.715 -6.72 -6.725 -6.73 -6.735 -6.74 -6.745 -6.75 -6.755 -6.76 -6.765 -6.77 -6.775 -6.78 -6.785 -6.79 -6.795 -6.8 -6.805 -6.81 -6.815 -6.82 -6.825 -6.83 -6.835 -6.84 -6.845 -6.85 -6.855 -6.86 -6.865 -6.87 -6.875 -6.88 -6.885 -6.89 -6.895 -6.9 -6.905 -6.91 -6.915 -6.92 -6.925 -6.93 -6.935 -6.94 -6.945 -6.95 -6.955 -6.96 -6.965 -6.97 -6.975 -6.98 -6.985 -6.99 -6.995 -7 -7.005 -7.01 -7.015 -7.02 -7.025 -7.03 -7.035 -7.04 -7.045 -7.05 -7.055 -7.06 -7.065 -7.07 -7.075 -7.08 -7.085 -7.09 -7.095 -7.1 -7.105 -7.11 -7.115 -7.12 -7.125 -7.13 -7.135 -7.14 -7.145 -7.15 -7.155 -7.16 -7.165 -7.17 -7.175 -7.18 -7.185 -7.19 -7.195 -7.2 -7.205 -7.21 -7.215 -7.22 -7.225 -7.23 -7.235 -7.24 -7.245 -7.25 -7.255 -7.26 -7.265 -7.27 -7.275 -7.28 -7.285 -7.29 -7.295 -7.3 -7.305 -7.31 -7.315 -7.32 -7.325 -7.33 -7.335 -7.34 -7.345 -7.35 -7.355 -7.36 -7.365 -7.37 -7.375 -7.38 -7.385 -7.39 -7.395 -7.4 -7.405 -7.41 -7.415 -7.42 -7.425 -7.43 -7.435 -7.44 -7.445 -7.45 -7.455 -7.46 -7.465 -7.47 -7.475 -7.48 -7.485 -7.49 -7.495 -7.5 -7.505 -7.51 -7.515 -7.52 -7.525 -7.53 -7.535 -7.54 -7.545 -7.55 -7.555 -7.56 -7.565 -7.57 -7.575 -7.58 -7.585 -7.59 -7.595 -7.6 -7.605 -7.61 -7.615 -7.62 -7.625 -7.63 -7.635 -7.64 -7.645 -7.65 -7.655 -7.66 -7.665 -7.67 -7.675 -7.68 -7.685 -7.69 -7.695 -7.7 -7.705 -7.71 -7.715 -7.72 -7.725 -7.73 -7.735 -7.74 -7.745 -7.75 -7.755 -7.76 -7.765 -7.77 -7.775 -7.78 -7.785 -7.79 -7.795 -7.8 -7.805 -7.81 -7.815 -7.82 -7.825 -7.83 -7.835 -7.84 -7.845 -7.85 -7.855 -7.86 -7.865 -7.87 -7.875 -7.88 -7.885 -7.89 -7.895 -7.9 -7.905 -7.91 -7.915 -7.92 -7.925 -7.93 -7.935 -7.94 -7.945 -7.95 -7.955 -7.96 -7.965 -7.97 -7.975 -7.98 -7.985 -7.99 -7.995 -8 -8.005 -8.01 -8.015 -8.02 -8.025 -8.03 -8.035 -8.04 -8.045 -8.05 -8.055 -8.06 -8.065 -8.07 -8.075 -8.08 -8.085 -8.09 -8.095 -8.1 -8.105 -8.11 -8.115 -8.12 -8.125 -8.13 -8.135 -8.14 -8.145 -8.15 -8.155 -8.16 -8.165 -8.17 -8.175 -8.18 -8.185 -8.19 -8.195 -8.2 -8.205 -8.21 -8.215 -8.22 -8.225 -8.23 -8.235 -8.24 -8.245 -8.25 -8.255 -8.26 -8.265 -8.27 -8.275 -8.28 -8.285 -8.29 -8.295 -8.3 -8.305 -8.31 -8.315 -8.32 -8.325 -8.33 -8.335 -8.34 -8.345 -8.35 -8.355 -8.36 -8.365 -8.37 -8.375 -8.38 -8.385 -8.39 -8.395 -8.4 -8.405 -8.41 -8.415 -8.42 -8.425 -8.43 -8.435 -8.44 -8.445 -8.45 -8.455 -8.46 -8.465 -8.47 -8.475 -8.48 -8.485 -8.49 -8.495 -8.5 -8.505 -8.51 -8.515 -8.52 -8.525 -8.53 -8.535 -8.54 -8.545 -8.55 -8.555 -8.56 -8.565 -8.57 -8.575 -8.58 -8.585 -8.59 -8.595 -8.6 -8.605 -8.61 -8.615 -8.62 -8.625 -8.63 -8.635 -8.64 -8.645 -8.65 -8.655 -8.66 -8.665 -8.67 -8.675 -8.68 -8.685 -8.69 -8.695 -8.7 -8.705 -8.71 -8.715 -8.72 -8.725 -8.73 -8.735 -8.74 -8.745 -8.75 -8.755 -8.76 -8.765 -8.77 -8.775 -8.78 -8.785 -8.79 -8.795 -8.8 -8.805 -8.81 -8.815 -8.82 -8.825 -8.83 -8.835 -8.84 -8.845 -8.85 -8.855 -8.86 -8.865 -8.87 -8.875 -8.88 -8.885 -8.89 -8.895 -8.9 -8.905 -8.91 -8.915 -8.92 -8.925 -8.93 -8.935 -8.94 -8.945 -8.95 -8.955 -8.96 -8.965 -8.97 -8.975 -8.98 -8.985 -8.99 -8.995 -9 -9.005 -9.01 -9.015 -9.02 -9.025 -9.03 -9.035 -9.04 -9.045 -9.05 -9.055 -9.06 -9.065 -9.07 -9.075 -9.08 -9.085 -9.09 -9.095 -9.1 -9.105 -9.11 -9.115 -9.12 -9.125 -9.13 -9.135 -9.14 -9.145 -9.15 -9.155 -9.16 -9.165 -9.17 -9.175 -9.18 -9.185 -9.19 -9.195 -9.2 -9.205 -9.21 -9.215 -9.22 -9.225 -9.23 -9.235 -9.24 -9.245 -9.25 -9.255 -9.26 -9.265 -9.27 -9.275 -9.28 -9.285 -9.29 -9.295 -9.3 -9.305 -9.31 -9.315 -9.32 -9.325 -9.33 -9.335 -9.34 -9.345 -9.35 -9.355 -9.36 -9.365 -9.37 -9.375 -9.38 -9.385 -9.39 -9.395 -9.4 -9.405 -9.41 -9.415 -9.42 -9.425 -9.43 -9.435 -9.44 -9.445 -9.45 -9.455 -9.46 -9.465 -9.47 -9.475 -9.48 -9.485 -9.49 -9.495 -9.5 -9.505 -9.51 -9.515 -9.52 -9.525 -9.53 -9.535 -9.54 -9.545 -9.55 -9.555 -9.56 -9.565 -9.57 -9.575 -9.58 -9.585 -9.59 -9.595 -9.6 -9.605 -9.61 -9.615 -9.62 -9.625 -9.63 -9.635 -9.64 -9.645 -9.65 -9.655 -9.66 -9.665 -9.67 -9.675 -9.68 -9.685 -9.69 -9.695 -9.7 -9.705 -9.71 -9.715 -9.72 -9.725 -9.73 -9.735 -9.74 -9.745 -9.75 -9.755 -9.76 -9.765 -9.77 -9.775 -9.78 -9.785 -9.79 -9.795 -9.8 -9.805 -9.81 -9.815 -9.82 -9.825 -9.83 -9.835 -9.84 -9.845 -9.85 -9.855 -9.86 -9.865 -9.87 -9.875 -9.88 -9.885 -9.89 -9.895 -9.9 -9.905 -9.91 -9.915 -9.92 -9.925 -9.93 -9.935 -9.94 -9.945 -9.95 -9.955 -9.96 -9.965 -9.97 -9.975 -9.98 -9.985 -9.99 -9.995 -10 -10.005 -10.01 -10.015 -10.02 -10.025 -10.03 -10.035 -10.04 -10.045 -10.05 -10.055 -10.06 -10.065 -10.07 -10.075 -10.08 -10.085 -10.09 -10.095 -10.1 -10.105 -10.11 -10.115 -10.12 -10.125 -10.13 -10.135 -10.14 -10.145 -10.15 -10.155 -10.16 -10.165 -10.17 -10.175 -10.18 -10.185 -10.19 -10.195 -10.2 -10.205 -10.21 -10.215 -10.22 -10.225 -10.23 -10.235 -10.24 -10.245 -10.25 -10.255 -10.26 -10.265 -10.27 -10.275 -10.28 -10.285 -10.29 -10.295 -10.3 -10.305 -10.31 -10.315 -10.32 -10.325 -10.33 -10.335 -10.34 -10.345 -10.35 -10.355 -10.36 -10.365 -10.37 -10.375 -10.38 -10.385 -10.39 -10.395 -10.4 -10.405 -10.41 -10.415 -10.42 -10.425 -10.43 -10.435 -10.44 -10.445 -10.45 -10.455 -10.46 -10.465 -10.47 -10.475 -10.48 -10.485 -10.49 -10.495 -10.5 -10.505 -10.51 -10.515 -10.52 -10.525 -10.53 -10.535 -10.54 -10.545 -10.55 -10.555 -10.56 -10.565 -10.57 -10.575 -10.58 -10.585 -10.59 -10.595 -10.6 -10.605 -10.61 -10.615 -10.62 -10.625 -10.63 -10.635 -10.64 -10.645 -10.65 -10.655 -10.66 -10.665 -10.67 -10.675 -10.68 -10.685 -10.69 -10.695 -10.7 -10.705 -10.71 -10.715 -10.72 -10.725 -10.73 -10.735 -10.74 -10.745 -10.75 -10.755 -10.76 -10.765 -10.77 -10.775 -10.78 -10.785 -10.79 -10.795 -10.8 -10.805 -10.81 -10.815 -10.82 -10.825 -10.83 -10.835 -10.84 -10.845 -10.85 -10.855 -10.86 -10.865 -10.87 -10.875 -10.88 -10.885 -10.89 -10.895 -10.9 -10.905 -10.91 -10.915 -10.92 -10.925 -10.93 -10.935 -10.94 -10.945 -10.95 -10.955 -10.96 -10.965 -10.97 -10.975 -10.98 -10.985 -10.99 -10.995 -11 -11.005 -11.01 -11.015 -11.02 -11.025 -11.03 -11.035 -11.04 -11.045 -11.05 -11.055 -11.06 -11.065 -11.07 -11.075 -11.08 -11.085 -11.09 -11.095 -11.1 -11.105 -11.11 -11.115 -11.12 -11.125 -11.13 -11.135 -11.14 -11.145 -11.15 -11.155 -11.16 -11.165 -11.17 -11.175 -11.18 -11.185 -11.19 -11.195 -11.2 -11.205 -11.21 -11.215 -11.22 -11.225 -11.23 -11.235 -11.24 -11.245 -11.25 -11.255 -11.26 -11.265 -11.27 -11.275 -11.28 -11.285 -11.29 -11.295 -11.3 -11.305 -11.31 -11.315 -11.32 -11.325 -11.33 -11.335 -11.34 -11.345 -11.35 -11.355 -11.36 -11.365 -11.37 -11.375 -11.38 -11.385 -11.39 -11.395 -11.4 -11.405 -11.41 -11.415 -11.42 -11.425 -11.43 -11.435 -11.44 -11.445 -11.45 -11.455 -11.46 -11.465 -11.47 -11.475 -11.48 -11.485 -11.49 -11.495 -11.5 -11.505 -11.51 -11.515 -11.52 -11.525 -11.53 -11.535 -11.54 -11.545 -11.55 -11.555 -11.56 -11.565 -11.57 -11.575 -11.58 -11.585 -11.59 -11.595 -11.6 -11.605 -11.61 -11.615 -11.62 -11.625 -11.63 -11.635 -11.64 -11.645 -11.65 -11.655 -11.66 -11.665 -11.67 -11.675 -11.68 -11.685 -11.69 -11.695 -11.7 -11.705 -11.71 -11.715 -11.72 -11.725 -11.73 -11.735 -11.74 -11.745 -11.75 -11.755 -11.76 -11.765 -11.77 -11.775 -11.78 -11.785 -11.79 -11.795 -11.8 -11.805 -11.81 -11.815 -11.82 -11.825 -11.83 -11.835 -11.84 -11.845 -11.85 -11.855 -11.86 -11.865 -11.87 -11.875 -11.88 -11.885 -11.89 -11.895 -11.9 -11.905 -11.91 -11.915 -11.92 -11.925 -11.93 -11.935 -11.94 -11.945 -11.95 -11.955 -11.96 -11.965 -11.97 -11.975 -11.98 -11.985 -11.99 -11.995 -12 -12.005 -12.01 -12.015 -12.02 -12.025 -12.03 -12.035 -12.04 -12.045 -12.05 -12.055 -12.06 -12.065 -12.07 -12.075 -12.08 -12.085 -12.09 -12.095 -12.1 -12.105 -12.11 -12.115 -12.12 -12.125 -12.13 -12.135 -12.14 -12.145 -12.15 -12.155 -12.16 -12.165 -12.17 -12.175 -12.18 -12.185 -12.19 -12.195 -12.2 -12.205 -12.21 -12.215 -12.22 -12.225 -12.23 -12.235 -12.24 -12.245 -12.25 -12.255 -12.26 -12.265 -12.27 -12.275 -12.28 -12.285 -12.29 -12.295 -12.3 -12.305 -12.31 -12.315 -12.32 -12.325 -12.33 -12.335 -12.34 -12.345 -12.35 -12.355 -12.36 -12.365 -12.37 -12.375 -12.38 -12.385 -12.39 -12.395 -12.4 -12.405 -12.41 -12.415 -12.42 -12.425 -12.43 -12.435 -12.44 -12.445 -12.45 -12.455 -12.46 -12.465 -12.47 -12.475 -12.48 -12.485 -12.49 -12.495 -12.5 -12.505 -12.51 -12.515 -12.52 -12.525 -12.53 -12.535 -12.54 -12.545 -12.55 -12.555 -12.56 -12.565 -12.57 -12.575 -12.58 -12.585 -12.59 -12.595 -12.6 -12.605 -12.61 -12.615 -12.62 -12.625 -12.63 -12.635 -12.64 -12.645 -12.65 -12.655 -12.66 -12.665 -12.67 -12.675 -12.68 -12.685 -12.69 -12.695 -12.7 -12.705 -12.71 -12.715 -12.72 -12.725 -12.73 -12.735 -12.74 -12.745 -12.75 -12.755 -12.76 -12.765 -12.77 -12.775 -12.78 -12.785 -12.79 -12.795 -12.8 -12.805 -12.81 -12.815 -12.82 -12.825 -12.83 -12.835 -12.84 -12.845 -12.85 -12.855 -12.86 -12.865 -12.87 -12.875 -12.88 -12.885 -12.89 -12.895 -12.9 -12.905 -12.91 -12.915 -12.92 -12.925 -12.93 -12.935 -12.94 -12.945 -12.95 -12.955 -12.96 -12.965 -12.97 -12.975 -12.98 -12.985 -12.99 -12.995 -13 -13.005 -13.01 -13.015 -13.02 -13.025 -13.03 -13.035 -13.04 -13.045 -13.05 -13.055 -13.06 -13.065 -13.07 -13.075 -13.08 -13.085 -13.09 -13.095 -13.1 -13.105 -13.11 -13.115 -13.12 -13.125 -13.13 -13.135 -13.14 -13.145 -13.15 -13.155 -13.16 -13.165 -13.17 -13.175 -13.18 -13.185 -13.19 -13.195 -13.2 -13.205 -13.21 -13.215 -13.22 -13.225 -13.23 -13.235 -13.24 -13.245 -13.25 -13.255 -13.26 -13.265 -13.27 -13.275 -13.28 -13.285 -13.29 -13.295 -13.3 -13.305 -13.31 -13.315 -13.32 -13.325 -13.33 -13.335 -13.34 -13.345 -13.35 -13.355 -13.36 -13.365 -13.37 -13.375 -13.38 -13.385 -13.39 -13.395 -13.4 -13.405 -13.41 -13.415 -13.42 -13.425 -13.43 -13.435 -13.44 -13.445 -13.45 -13.455 -13.46 -13.465 -13.47 -13.475 -13.48 -13.485 -13.49 -13.495 -13.5 -13.505 -13.51 -13.515 -13.52 -13.525 -13.53 -13.535 -13.54 -13.545 -13.55 -13.555 -13.56 -13.565 -13.57 -13.575 -13.58 -13.585 -13.59 -13.595 -13.6 -13.605 -13.61 -13.615 -13.62 -13.625 -13.63 -13.635 -13.64 -13.645 -13.65 -13.655 -13.66 -13.665 -13.67 -13.675 -13.68 -13.685 -13.69 -13.695 -13.7 -13.705 -13.71 -13.715 -13.72 -13.725 -13.73 -13.735 -13.74 -13.745 -13.75 -13.755 -13.76 -13.765 -13.77 -13.775 -13.78 -13.785 -13.79 -13.795 -13.8 -13.805 -13.81 -13.815 -13.82 -13.825 -13.83 -13.835 -13.84 -13.845 -13.85 -13.855 -13.86 -13.865 -13.87 -13.875 -13.88 -13.885 -13.89 -13.895 -13.9 -13.905 -13.91 -13.915 -13.92 -13.925 -13.93 -13.935 -13.94 -13.945 -13.95 -13.955 -13.96 -13.965 -13.97 -13.975 -13.98 -13.985 -13.99 -13.995 -14 -14.005 -14.01 -14.015 -14.02 -14.025 -14.03 -14.035 -14.04 -14.045 -14.05 -14.055 -14.06 -14.065 -14.07 -14.075 -14.08 -14.085 -14.09 -14.095 -14.1 -14.105 -14.11 -14.115 -14.12 -14.125 -14.13 -14.135 -14.14 -14.145 -14.15 -14.155 -14.16 -14.165 -14.17 -14.175 -14.18 -14.185 -14.19 -14.195 -14.2 -14.205 -14.21 -14.215 -14.22 -14.225 -14.23 -14.235 -14.24 -14.245 -14.25 -14.255 -14.26 -14.265 -14.27 -14.275 -14.28 -14.285 -14.29 -14.295 -14.3 -14.305 -14.31 -14.315 -14.32 -14.325 -14.33 -14.335 -14.34 -14.345 -14.35 -14.355 -14.36 -14.365 -14.37 -14.375 -14.38 -14.385 -14.39 -14.395 -14.4 -14.405 -14.41 -14.415 -14.42 -14.425 -14.43 -14.435 -14.44 -14.445 -14.45 -14.455 -14.46 -14.465 -14.47 -14.475 -14.48 -14.485 -14.49 -14.495 -14.5 -14.505 -14.51 -14.515 -14.52 -14.525 -14.53 -14.535 -14.54 -14.545 -14.55 -14.555 -14.56 -14.565 -14.57 -14.575 -14.58 -14.585 -14.59 -14.595 -14.6 -14.605 -14.61 -14.615 -14.62 -14.625 -14.63 -14.635 -14.64 -14.645 -14.65 -14.655 -14.66 -14.665 -14.67 -14.675 -14.68 -14.685 -14.69 -14.695 -14.7 -14.705 -14.71 -14.715 -14.72 -14.725 -14.73 -14.735 -14.74 -14.745 -14.75 -14.755 -14.76 -14.765 -14.77 -14.775 -14.78 -14.785 -14.79 -14.795 -14.8 -14.805 -14.81 -14.815 -14.82 -14.825 -14.83 -14.835 -14.84 -14.845 -14.85 -14.855 -14.86 -14.865 -14.87 -14.875 -14.88 -14.885 -14.89 -14.895 -14.9 -14.905 -14.91 -14.915 -14.92 -14.925 -14.93 -14.935 -14.94 -14.945 -14.95 -14.955 -14.96 -14.965 -14.97 -14.975 -14.98 -14.985 -14.99 -14.995 -15 -15.005 -15.01 -15.015 -15.02 -15.025 -15.03 -15.035 -15.04 -15.045 -15.05 -15.055 -15.06 -15.065 -15.07 -15.075 -15.08 -15.085 -15.09 -15.095 -15.1 -15.105 -15.11 -15.115 -15.12 -15.125 -15.13 -15.135 -15.14 -15.145 -15.15 -15.155 -15.16 -15.165 -15.17 -15.175 -15.18 -15.185 -15.19 -15.195 -15.2 -15.205 -15.21 -15.215 -15.22 -15.225 -15.23 -15.235 -15.24 -15.245 -15.25 -15.255 -15.26 -15.265 -15.27 -15.275 -15.28 -15.285 -15.29 -15.295 -15.3 -15.305 -15.31 -15.315 -15.32 -15.325 -15.33 -15.335 -15.34 -15.345 -15.35 -15.355 -15.36 -15.365 -15.37 -15.375 -15.38 -15.385 -15.39 -15.395 -15.4 -15.405 -15.41 -15.415 -15.42 -15.425 -15.43 -15.435 -15.44 -15.445 -15.45 -15.455 -15.46 -15.465 -15.47 -15.475 -15.48 -15.485 -15.49 -15.495 -15.5 -15.505 -15.51 -15.515 -15.52 -15.525 -15.53 -15.535 -15.54 -15.545 -15.55 -15.555 -15.56 -15.565 -15.57 -15.575 -15.58 -15.585 -15.59 -15.595 -15.6 -15.605 -15.61 -15.615 -15.62 -15.625 -15.63 -15.635 -15.64 -15.645 -15.65 -15.655 -15.66 -15.665 -15.67 -15.675 -15.68 -15.685 -15.69 -15.695 -15.7 -15.705 -15.71 -15.715 -15.72 -15.725 -15.73 -15.735 -15.74 -15.745 -15.75 -15.755 -15.76 -15.765 -15.77 -15.775 -15.78 -15.785 -15.79 -15.795 -15.8 -15.805 -15.81 -15.815 -15.82 -15.825 -15.83 -15.835 -15.84 -15.845 -15.85 -15.855 -15.86 -15.865 -15.87 -15.875 -15.88 -15.885 -15.89 -15.895 -15.9 -15.905 -15.91 -15.915 -15.92 -15.925 -15.93 -15.935 -15.94 -15.945 -15.95 -15.955 -15.96 -15.965 -15.97 -15.975 -15.98 -15.985 -15.99 -15.995 -16 -16.005 -16.01 -16.015 -16.02 -16.025 -16.03 -16.035 -16.04 -16.045 -16.05 -16.055 -16.06 -16.065 -16.07 -16.075 -16.08 -16.085 -16.09 -16.095 -16.1 -16.105 -16.11 -16.115 -16.12 -16.125 -16.13 -16.135 -16.14 -16.145 -16.15 -16.155 -16.16 -16.165 -16.17 -16.175 -16.18 -16.185 -16.19 -16.195 -16.2 -16.205 -16.21 -16.215 -16.22 -16.225 -16.23 -16.235 -16.24 -16.245 -16.25 -16.255 -16.26 -16.265 -16.27 -16.275 -16.28 -16.285 -16.29 -16.295 -16.3 -16.305 -16.31 -16.315 -16.32 -16.325 -16.33 -16.335 -16.34 -16.345 -16.35 -16.355 -16.36 -16.365 -16.37 -16.375 -16.38 -16.385 -16.39 -16.395 -16.4 -16.405 -16.41 -16.415 -16.42 -16.425 -16.43 -16.435 -16.44 -16.445 -16.45 -16.455 -16.46 -16.465 -16.47 -16.475 -16.48 -16.485 -16.49 -16.495 -16.5 -16.505 -16.51 -16.515 -16.52 -16.525 -16.53 -16.535 -16.54 -16.545 -16.55 -16.555 -16.56 -16.565 -16.57 -16.575 -16.58 -16.585 -16.59 -16.595 -16.6 -16.605 -16.61 -16.615 -16.62 -16.625 -16.63 -16.635 -16.64 -16.645 -16.65 -16.655 -16.66 -16.665 -16.67 -16.675 -16.68 -16.685 -16.69 -16.695 -16.7 -16.705 -16.71 -16.715 -16.72 -16.725 -16.73 -16.735 -16.74 -16.745 -16.75 -16.755 -16.76 -16.765 -16.77 -16.775 -16.78 -16.785 -16.79 -16.795 -16.8 -16.805 -16.81 -16.815 -16.82 -16.825 -16.83 -16.835 -16.84 -16.845 -16.85 -16.855 -16.86 -16.865 -16.87 -16.875 -16.88 -16.885 -16.89 -16.895 -16.9 -16.905 -16.91 -16.915 -16.92 -16.925 -16.93 -16.935 -16.94 -16.945 -16.95 -16.955 -16.96 -16.965 -16.97 -16.975 -16.98 -16.985 -16.99 -16.995 -17 -17.005 -17.01 -17.015 -17.02 -17.025 -17.03 -17.035 -17.04 -17.045 -17.05 -17.055 -17.06 -17.065 -17.07 -17.075 -17.08 -17.085 -17.09 -17.095 -17.1 -17.105 -17.11 -17.115 -17.12 -17.125 -17.13 -17.135 -17.14 -17.145 -17.15 -17.155 -17.16 -17.165 -17.17 -17.175 -17.18 -17.185 -17.19 -17.195 -17.2 -17.205 -17.21 -17.215 -17.22 -17.225 -17.23 -17.235 -17.24 -17.245 -17.25 -17.255 -17.26 -17.265 -17.27 -17.275 -17.28 -17.285 -17.29 -17.295 -17.3 -17.305 -17.31 -17.315 -17.32 -17.325 -17.33 -17.335 -17.34 -17.345 -17.35 -17.355 -17.36 -17.365 -17.37 -17.375 -17.38 -17.385 -17.39 -17.395 -17.4 -17.405 -17.41 -17.415 -17.42 -17.425 -17.43 -17.435 -17.44 -17.445 -17.45 -17.455 -17.46 -17.465 -17.47 -17.475 -17.48 -17.485 -17.49 -17.495 -17.5 -17.505 -17.51 -17.515 -17.52 -17.525 -17.53 -17.535 -17.54 -17.545 -17.55 -17.555 -17.56 -17.565 -17.57 -17.575 -17.58 -17.585 -17.59 -17.595 -17.6 -17.605 -17.61 -17.615 -17.62 -17.625 -17.63 -17.635 -17.64 -17.645 -17.65 -17.655 -17.66 -17.665 -17.67 -17.675 -17.68 -17.685 -17.69 -17.695 -17.7 -17.705 -17.71 -17.715 -17.72 -17.725 -17.73 -17.735 -17.74 -17.745 -17.75 -17.755 -17.76 -17.765 -17.77 -17.775 -17.78 -17.785 -17.79 -17.795 -17.8 -17.805 -17.81 -17.815 -17.82 -17.825 -17.83 -17.835 -17.84 -17.845 -17.85 -17.855 -17.86 -17.865 -17.87 -17.875 -17.88 -17.885 -17.89 -17.895 -17.9 -17.905 -17.91 -17.915 -17.92 -17.925 -17.93 -17.935 -17.94 -17.945 -17.95 -17.955 -17.96 -17.965 -17.97 -17.975 -17.98 -17.985 -17.99 -17.995 -18 -18.005 -18.01 -18.015 -18.02 -18.025 -18.03 -18.035 -18.04 -18.045 -18.05 -18.055 -18.06 -18.065 -18.07 -18.075 -18.08 -18.085 -18.09 -18.095 -18.1 -18.105 -18.11 -18.115 -18.12 -18.125 -18.13 -18.135 -18.14 -18.145 -18.15 -18.155 -18.16 -18.165 -18.17 -18.175 -18.18 -18.185 -18.19 -18.195 -18.2 -18.205 -18.21 -18.215 -18.22 -18.225 -18.23 -18.235 -18.24 -18.245 -18.25 -18.255 -18.26 -18.265 -18.27 -18.275 -18.28 -18.285 -18.29 -18.295 -18.3 -18.305 -18.31 -18.315 -18.32 -18.325 -18.33 -18.335 -18.34 -18.345 -18.35 -18.355 -18.36 -18.365 -18.37 -18.375 -18.38 -18.385 -18.39 -18.395 -18.4 -18.405 -18.41 -18.415 -18.42 -18.425 -18.43 -18.435 -18.44 -18.445 -18.45 -18.455 -18.46 -18.465 -18.47 -18.475 -18.48 -18.485 -18.49 -18.495 -18.5 -18.505 -18.51 -18.515 -18.52 -18.525 -18.53 -18.535 -18.54 -18.545 -18.55 -18.555 -18.56 -18.565 -18.57 -18.575 -18.58 -18.585 -18.59 -18.595 -18.6 -18.605 -18.61 -18.615 -18.62 -18.625 -18.63 -18.635 -18.64 -18.645 -18.65 -18.655 -18.66 -18.665 -18.67 -18.675 -18.68 -18.685 -18.69 -18.695 -18.7 -18.705 -18.71 -18.715 -18.72 -18.725 -18.73 -18.735 -18.74 -18.745 -18.75 -18.755 -18.76 -18.765 -18.77 -18.775 -18.78 -18.785 -18.79 -18.795 -18.8 -18.805 -18.81 -18.815 -18.82 -18.825 -18.83 -18.835 -18.84 -18.845 -18.85 -18.855 -18.86 -18.865 -18.87 -18.875 -18.88 -18.885 -18.89 -18.895 -18.9 -18.905 -18.91 -18.915 -18.92 -18.925 -18.93 -18.935 -18.94 -18.945 -18.95 -18.955 -18.96 -18.965 -18.97 -18.975 -18.98 -18.985 -18.99 -18.995 -19 -19.005 -19.01 -19.015 -19.02 -19.025 -19.03 -19.035 -19.04 -19.045 -19.05 -19.055 -19.06 -19.065 -19.07 -19.075 -19.08 -19.085 -19.09 -19.095 -19.1 -19.105 -19.11 -19.115 -19.12 -19.125 -19.13 -19.135 -19.14 -19.145 -19.15 -19.155 -19.16 -19.165 -19.17 -19.175 -19.18 -19.185 -19.19 -19.195 -19.2 -19.205 -19.21 -19.215 -19.22 -19.225 -19.23 -19.235 -19.24 -19.245 -19.25 -19.255 -19.26 -19.265 -19.27 -19.275 -19.28 -19.285 -19.29 -19.295 -19.3 -19.305 -19.31 -19.315 -19.32 -19.325 -19.33 -19.335 -19.34 -19.345 -19.35 -19.355 -19.36 -19.365 -19.37 -19.375 -19.38 -19.385 -19.39 -19.395 -19.4 -19.405 -19.41 -19.415 -19.42 -19.425 -19.43 -19.435 -19.44 -19.445 -19.45 -19.455 -19.46 -19.465 -19.47 -19.475 -19.48 -19.485 -19.49 -19.495 -19.5 -19.505 -19.51 -19.515 -19.52 -19.525 -19.53 -19.535 -19.54 -19.545 -19.55 -19.555 -19.56 -19.565 -19.57 -19.575 -19.58 -19.585 -19.59 -19.595 -19.6 -19.605 -19.61 -19.615 -19.62 -19.625 -19.63 -19.635 -19.64 -19.645 -19.65 -19.655 -19.66 -19.665 -19.67 -19.675 -19.68 -19.685 -19.69 -19.695 -19.7 -19.705 -19.71 -19.715 -19.72 -19.725 -19.73 -19.735 -19.74 -19.745 -19.75 -19.755 -19.76 -19.765 -19.77 -19.775 -19.78 -19.785 -19.79 -19.795 -19.8 -19.805 -19.81 -19.815 -19.82 -19.825 -19.83 -19.835 -19.84 -19.845 -19.85 -19.855 -19.86 -19.865 -19.87 -19.875 -19.88 -19.885 -19.89 -19.895 -19.9 -19.905 -19.91 -19.915 -19.92 -19.925 -19.93 -19.935 -19.94 -19.945 -19.95 -19.955 -19.96 -19.965 -19.97 -19.975 -19.98 -19.985 -19.99 -19.995 -20 -20.005 -20.01 -20.015 -20.02 -20.025 -20.03 -20.035 -20.04 -20.045 -20.05 -20.055 -20.06 -20.065 -20.07 -20.075 -20.08 -20.085 -20.09 -20.095 -20.1 -20.105 -20.11 -20.115 -20.12 -20.125 -20.13 -20.135 -20.14 -20.145 -20.15 -20.155 -20.16 -20.165 -20.17 -20.175 -20.18 -20.185 -20.19 -20.195 -20.2 -20.205 -20.21 -20.215 -20.22 -20.225 -20.23 -20.235 -20.24 -20.245 -20.25 -20.255 -20.26 -20.265 -20.27 -20.275 -20.28 -20.285 -20.29 -20.295 -20.3 -20.305 -20.31 -20.315 -20.32 -20.325 -20.33 -20.335 -20.34 -20.345 -20.35 -20.355 -20.36 -20.365 -20.37 -20.375 -20.38 -20.385 -20.39 -20.395 -20.4 -20.405 -20.41 -20.415 -20.42 -20.425 -20.43 -20.435 -20.44 -20.445 -20.45 -20.455 -20.46 -20.465 -20.47 -20.475 -20.48 -20.485 -20.49 -20.495 -20.5 -20.505 -20.51 -20.515 -20.52 -20.525 -20.53 -20.535 -20.54 -20.545 -20.55 -20.555 -20.56 -20.565 -20.57 -20.575 -20.58 -20.585 -20.59 -20.595 -20.6 -20.605 -20.61 -20.615 -20.62 -20.625 -20.63 -20.635 -20.64 -20.645 -20.65 -20.655 -20.66 -20.665 -20.67 -20.675 -20.68 -20.685 -20.69 -20.695 -20.7 -20.705 -20.71 -20.715 -20.72 -20.725 -20.73 -20.735 -20.74 -20.745 -20.75 -20.755 -20.76 -20.765 -20.77 -20.775 -20.78 -20.785 -20.79 -20.795 -20.8 -20.805 -20.81 -20.815 -20.82 -20.825 -20.83 -20.835 -20.84 -20.845 -20.85 -20.855 -20.86 -20.865 -20.87 -20.875 -20.88 -20.885 -20.89 -20.895 -20.9 -20.905 -20.91 -20.915 -20.92 -20.925 -20.93 -20.935 -20.94 -20.945 -20.95 -20.955 -20.96 -20.965 -20.97 -20.975 -20.98 -20.985 -20.99 -20.995 -21 -21.005 -21.01 -21.015 -21.02 -21.025 -21.03 -21.035 -21.04 -21.045 -21.05 -21.055 -21.06 -21.065 -21.07 -21.075 -21.08 -21.085 -21.09 -21.095 -21.1 -21.105 -21.11 -21.115 -21.12 -21.125 -21.13 -21.135 -21.14 -21.145 -21.15 -21.155 -21.16 -21.165 -21.17 -21.175 -21.18 -21.185 -21.19 -21.195 -21.2 -21.205 -21.21 -21.215 -21.22 -21.225 -21.23 -21.235 -21.24 -21.245 -21.25 -21.255 -21.26 -21.265 -21.27 -21.275 -21.28 -21.285 -21.29 -21.295 -21.3 -21.305 -21.31 -21.315 -21.32 -21.325 -21.33 -21.335 -21.34 -21.345 -21.35 -21.355 -21.36 -21.365 -21.37 -21.375 -21.38 -21.385 -21.39 -21.395 -21.4 -21.405 -21.41 -21.415 -21.42 -21.425 -21.43 -21.435 -21.44 -21.445 -21.45 -21.455 -21.46 -21.465 -21.47 -21.475 -21.48 -21.485 -21.49 -21.495 -21.5 -21.505 -21.51 -21.515 -21.52 -21.525 -21.53 -21.535 -21.54 -21.545 -21.55 -21.555 -21.56 -21.565 -21.57 -21.575 -21.58 -21.585 -21.59 -21.595 -21.6 -21.605 -21.61 -21.615 -21.62 -21.625 -21.63 -21.635 -21.64 -21.645 -21.65 -21.655 -21.66 -21.665 -21.67 -21.675 -21.68 -21.685 -21.69 -21.695 -21.7 -21.705 -21.71 -21.715 -21.72 -21.725 -21.73 -21.735 -21.74 -21.745 -21.75 -21.755 -21.76 -21.765 -21.77 -21.775 -21.78 -21.785 -21.79 -21.795 -21.8 -21.805 -21.81 -21.815 -21.82 -21.825 -21.83 -21.835 -21.84 -21.845 -21.85 -21.855 -21.86 -21.865 -21.87 -21.875 -21.88 -21.885 -21.89 -21.895 -21.9 -21.905 -21.91 -21.915 -21.92 -21.925 -21.93 -21.935 -21.94 -21.945 -21.95 -21.955 -21.96 -21.965 -21.97 -21.975 -21.98 -21.985 -21.99 -21.995 -22 -22.005 -22.01 -22.015 -22.02 -22.025 -22.03 -22.035 -22.04 -22.045 -22.05 -22.055 -22.06 -22.065 -22.07 -22.075 -22.08 -22.085 -22.09 -22.095 -22.1 -22.105 -22.11 -22.115 -22.12 -22.125 -22.13 -22.135 -22.14 -22.145 -22.15 -22.155 -22.16 -22.165 -22.17 -22.175 -22.18 -22.185 -22.19 -22.195 -22.2 -22.205 -22.21 -22.215 -22.22 -22.225 -22.23 -22.235 -22.24 -22.245 -22.25 -22.255 -22.26 -22.265 -22.27 -22.275 -22.28 -22.285 -22.29 -22.295 -22.3 -22.305 -22.31 -22.315 -22.32 -22.325 -22.33 -22.335 -22.34 -22.345 -22.35 -22.355 -22.36 -22.365 -22.37 -22.375 -22.38 -22.385 -22.39 -22.395 -22.4 -22.405 -22.41 -22.415 -22.42 -22.425 -22.43 -22.435 -22.44 -22.445 -22.45 -22.455 -22.46 -22.465 -22.47 -22.475 -22.48 -22.485 -22.49 -22.495 -22.5 -22.505 -22.51 -22.515 -22.52 -22.525 -22.53 -22.535 -22.54 -22.545 -22.55 -22.555 -22.56 -22.565 -22.57 -22.575 -22.58 -22.585 -22.59 -22.595 -22.6 -22.605 -22.61 -22.615 -22.62 -22.625 -22.63 -22.635 -22.64 -22.645 -22.65 -22.655 -22.66 -22.665 -22.67 -22.675 -22.68 -22.685 -22.69 -22.695 -22.7 -22.705 -22.71 -22.715 -22.72 -22.725 -22.73 -22.735 -22.74 -22.745 -22.75 -22.755 -22.76 -22.765 -22.77 -22.775 -22.78 -22.785 -22.79 -22.795 -22.8 -22.805 -22.81 -22.815 -22.82 -22.825 -22.83 -22.835 -22.84 -22.845 -22.85 -22.855 -22.86 -22.865 -22.87 -22.875 -22.88 -22.885 -22.89 -22.895 -22.9 -22.905 -22.91 -22.915 -22.92 -22.925 -22.93 -22.935 -22.94 -22.945 -22.95 -22.955 -22.96 -22.965 -22.97 -22.975 -22.98 -22.985 -22.99 -22.995 -23 -23.005 -23.01 -23.015 -23.02 -23.025 -23.03 -23.035 -23.04 -23.045 -23.05 -23.055 -23.06 -23.065 -23.07 -23.075 -23.08 -23.085 -23.09 -23.095 -23.1 -23.105 -23.11 -23.115 -23.12 -23.125 -23.13 -23.135 -23.14 -23.145 -23.15 -23.155 -23.16 -23.165 -23.17 -23.175 -23.18 -23.185 -23.19 -23.195 -23.2 -23.205 -23.21 -23.215 -23.22 -23.225 -23.23 -23.235 -23.24 -23.245 -23.25 -23.255 -23.26 -23.265 -23.27 -23.275 -23.28 -23.285 -23.29 -23.295 -23.3 -23.305 -23.31 -23.315 -23.32 -23.325 -23.33 -23.335 -23.34 -23.345 -23.35 -23.355 -23.36 -23.365 -23.37 -23.375 -23.38 -23.385 -23.39 -23.395 -23.4 -23.405 -23.41 -23.415 -23.42 -23.425 -23.43 -23.435 -23.44 -23.445 -23.45 -23.455 -23.46 -23.465 -23.47 -23.475 -23.48 -23.485 -23.49 -23.495 -23.5 -23.505 -23.51 -23.515 -23.52 -23.525 -23.53 -23.535 -23.54 -23.545 -23.55 -23.555 -23.56 -23.565 -23.57 -23.575 -23.58 -23.585 -23.59 -23.595 -23.6 -23.605 -23.61 -23.615 -23.62 -23.625 -23.63 -23.635 -23.64 -23.645 -23.65 -23.655 -23.66 -23.665 -23.67 -23.675 -23.68 -23.685 -23.69 -23.695 -23.7 -23.705 -23.71 -23.715 -23.72 -23.725 -23.73 -23.735 -23.74 -23.745 -23.75 -23.755 -23.76 -23.765 -23.77 -23.775 -23.78 -23.785 -23.79 -23.795 -23.8 -23.805 -23.81 -23.815 -23.82 -23.825 -23.83 -23.835 -23.84 -23.845 -23.85 -23.855 -23.86 -23.865 -23.87 -23.875 -23.88 -23.885 -23.89 -23.895 -23.9 -23.905 -23.91 -23.915 -23.92 -23.925 -23.93 -23.935 -23.94 -23.945 -23.95 -23.955 -23.96 -23.965 -23.97 -23.975 -23.98 -23.985 -23.99 -23.995 -24 -24.005 -24.01 -24.015 -24.02 -24.025 -24.03 -24.035 -24.04 -24.045 -24.05 -24.055 -24.06 -24.065 -24.07 -24.075 -24.08 -24.085 -24.09 -24.095 -24.1 -24.105 -24.11 -24.115 -24.12 -24.125 -24.13 -24.135 -24.14 -24.145 -24.15 -24.155 -24.16 -24.165 -24.17 -24.175 -24.18 -24.185 -24.19 -24.195 -24.2 -24.205 -24.21 -24.215 -24.22 -24.225 -24.23 -24.235 -24.24 -24.245 -24.25 -24.255 -24.26 -24.265 -24.27 -24.275 -24.28 -24.285 -24.29 -24.295 -24.3 -24.305 -24.31 -24.315 -24.32 -24.325 -24.33 -24.335 -24.34 -24.345 -24.35 -24.355 -24.36 -24.365 -24.37 -24.375 -24.38 -24.385 -24.39 -24.395 -24.4 -24.405 -24.41 -24.415 -24.42 -24.425 -24.43 -24.435 -24.44 -24.445 -24.45 -24.455 -24.46 -24.465 -24.47 -24.475 -24.48 -24.485 -24.49 -24.495 -24.5 -24.505 -24.51 -24.515 -24.52 -24.525 -24.53 -24.535 -24.54 -24.545 -24.55 -24.555 -24.56 -24.565 -24.57 -24.575 -24.58 -24.585 -24.59 -24.595 -24.6 -24.605 -24.61 -24.615 -24.62 -24.625 -24.63 -24.635 -24.64 -24.645 -24.65 -24.655 -24.66 -24.665 -24.67 -24.675 -24.68 -24.685 -24.69 -24.695 -24.7 -24.705 -24.71 -24.715 -24.72 -24.725 -24.73 -24.735 -24.74 -24.745 -24.75 -24.755 -24.76 -24.765 -24.77 -24.775 -24.78 -24.785 -24.79 -24.795 -24.8 -24.805 -24.81 -24.815 -24.82 -24.825 -24.83 -24.835 -24.84 -24.845 -24.85 -24.855 -24.86 -24.865 -24.87 -24.875 -24.88 -24.885 -24.89 -24.895 -24.9 -24.905 -24.91 -24.915 -24.92 -24.925 -24.93 -24.935 -24.94 -24.945 -24.95 -24.955 -24.96 -24.965 -24.97 -24.975 -24.98 -24.985 -24.99 -24.995 -25 -25.005 -25.01 -25.015 -25.02 -25.025 -25.03 -25.035 -25.04 -25.045 -25.05 -25.055 -25.06 -25.065 -25.07 -25.075 -25.08 -25.085 -25.09 -25.095 -25.1 -25.105 -25.11 -25.115 -25.12 -25.125 -25.13 -25.135 -25.14 -25.145 -25.15 -25.155 -25.16 -25.165 -25.17 -25.175 -25.18 -25.185 -25.19 -25.195 -25.2 -25.205 -25.21 -25.215 -25.22 -25.225 -25.23 -25.235 -25.24 -25.245 -25.25 -25.255 -25.26 -25.265 -25.27 -25.275 -25.28 -25.285 -25.29 -25.295 -25.3 -25.305 -25.31 -25.315 -25.32 -25.325 -25.33 -25.335 -25.34 -25.345 -25.35 -25.355 -25.36 -25.365 -25.37 -25.375 -25.38 -25.385 -25.39 -25.395 -25.4 -25.405 -25.41 -25.415 -25.42 -25.425 -25.43 -25.435 -25.44 -25.445 -25.45 -25.455 -25.46 -25.465 -25.47 -25.475 -25.48 -25.485 -25.49 -25.495 -25.5 -25.505 -25.51 -25.515 -25.52 -25.525 -25.53 -25.535 -25.54 -25.545 -25.55 -25.555 -25.56 -25.565 -25.57 -25.575 -25.58 -25.585 -25.59 -25.595 -25.6 -25.605 -25.61 -25.615 -25.62 -25.625 -25.63 -25.635 -25.64 -25.645 -25.65 -25.655 -25.66 -25.665 -25.67 -25.675 -25.68 -25.685 -25.69 -25.695 -25.7 -25.705 -25.71 -25.715 -25.72 -25.725 -25.73 -25.735 -25.74 -25.745 -25.75 -25.755 -25.76 -25.765 -25.77 -25.775 -25.78 -25.785 -25.79 -25.795 -25.8 -25.805 -25.81 -25.815 -25.82 -25.825 -25.83 -25.835 -25.84 -25.845 -25.85 -25.855 -25.86 -25.865 -25.87 -25.875 -25.88 -25.885 -25.89 -25.895 -25.9 -25.905 -25.91 -25.915 -25.92 -25.925 -25.93 -25.935 -25.94 -25.945 -25.95 -25.955 -25.96 -25.965 -25.97 -25.975 -25.98 -25.985 -25.99 -25.995 -26 -26.005 -26.01 -26.015 -26.02 -26.025 -26.03 -26.035 -26.04 -26.045 -26.05 -26.055 -26.06 -26.065 -26.07 -26.075 -26.08 -26.085 -26.09 -26.095 -26.1 -26.105 -26.11 -26.115 -26.12 -26.125 -26.13 -26.135 -26.14 -26.145 -26.15 -26.155 -26.16 -26.165 -26.17 -26.175 -26.18 -26.185 -26.19 -26.195 -26.2 -26.205 -26.21 -26.215 -26.22 -26.225 -26.23 -26.235 -26.24 -26.245 -26.25 -26.255 -26.26 -26.265 -26.27 -26.275 -26.28 -26.285 -26.29 -26.295 -26.3 -26.305 -26.31 -26.315 -26.32 -26.325 -26.33 -26.335 -26.34 -26.345 -26.35 -26.355 -26.36 -26.365 -26.37 -26.375 -26.38 -26.385 -26.39 -26.395 -26.4 -26.405 -26.41 -26.415 -26.42 -26.425 -26.43 -26.435 -26.44 -26.445 -26.45 -26.455 -26.46 -26.465 -26.47 -26.475 -26.48 -26.485 -26.49 -26.495 -26.5 -26.505 -26.51 -26.515 -26.52 -26.525 -26.53 -26.535 -26.54 -26.545 -26.55 -26.555 -26.56 -26.565 -26.57 -26.575 -26.58 -26.585 -26.59 -26.595 -26.6 -26.605 -26.61 -26.615 -26.62 -26.625 -26.63 -26.635 -26.64 -26.645 -26.65 -26.655 -26.66 -26.665 -26.67 -26.675 -26.68 -26.685 -26.69 -26.695 -26.7 -26.705 -26.71 -26.715 -26.72 -26.725 -26.73 -26.735 -26.74 -26.745 -26.75 -26.755 -26.76 -26.765 -26.77 -26.775 -26.78 -26.785 -26.79 -26.795 -26.8 -26.805 -26.81 -26.815 -26.82 -26.825 -26.83 -26.835 -26.84 -26.845 -26.85 -26.855 -26.86 -26.865 -26.87 -26.875 -26.88 -26.885 -26.89 -26.895 -26.9 -26.905 -26.91 -26.915 -26.92 -26.925 -26.93 -26.935 -26.94 -26.945 -26.95 -26.955 -26.96 -26.965 -26.97 -26.975 -26.98 -26.985 -26.99 -26.995 -27 -27.005 -27.01 -27.015 -27.02 -27.025 -27.03 -27.035 -27.04 -27.045 -27.05 -27.055 -27.06 -27.065 -27.07 -27.075 -27.08 -27.085 -27.09 -27.095 -27.1 -27.105 -27.11 -27.115 -27.12 -27.125 -27.13 -27.135 -27.14 -27.145 -27.15 -27.155 -27.16 -27.165 -27.17 -27.175 -27.18 -27.185 -27.19 -27.195 -27.2 -27.205 -27.21 -27.215 -27.22 -27.225 -27.23 -27.235 -27.24 -27.245 -27.25 -27.255 -27.26 -27.265 -27.27 -27.275 -27.28 -27.285 -27.29 -27.295 -27.3 -27.305 -27.31 -27.315 -27.32 -27.325 -27.33 -27.335 -27.34 -27.345 -27.35 -27.355 -27.36 -27.365 -27.37 -27.375 -27.38 -27.385 -27.39 -27.395 -27.4 -27.405 -27.41 -27.415 -27.42 -27.425 -27.43 -27.435 -27.44 -27.445 -27.45 -27.455 -27.46 -27.465 -27.47 -27.475 -27.48 -27.485 -27.49 -27.495 -27.5 -27.505 -27.51 -27.515 -27.52 -27.525 -27.53 -27.535 -27.54 -27.545 -27.55 -27.555 -27.56 -27.565 -27.57 -27.575 -27.58 -27.585 -27.59 -27.595 -27.6 -27.605 -27.61 -27.615 -27.62 -27.625 -27.63 -27.635 -27.64 -27.645 -27.65 -27.655 -27.66 -27.665 -27.67 -27.675 -27.68 -27.685 -27.69 -27.695 -27.7 -27.705 -27.71 -27.715 -27.72 -27.725 -27.73 -27.735 -27.74 -27.745 -27.75 -27.755 -27.76 -27.765 -27.77 -27.775 -27.78 -27.785 -27.79 -27.795 -27.8 -27.805 -27.81 -27.815 -27.82 -27.825 -27.83 -27.835 -27.84 -27.845 -27.85 -27.855 -27.86 -27.865 -27.87 -27.875 -27.88 -27.885 -27.89 -27.895 -27.9 -27.905 -27.91 -27.915 -27.92 -27.925 -27.93 -27.935 -27.94 -27.945 -27.95 -27.955 -27.96 -27.965 -27.97 -27.975 -27.98 -27.985 -27.99 -27.995 -28 -28.005 -28.01 -28.015 -28.02 -28.025 -28.03 -28.035 -28.04 -28.045 -28.05 -28.055 -28.06 -28.065 -28.07 -28.075 -28.08 -28.085 -28.09 -28.095 -28.1 -28.105 -28.11 -28.115 -28.12 -28.125 -28.13 -28.135 -28.14 -28.145 -28.15 -28.155 -28.16 -28.165 -28.17 -28.175 -28.18 -28.185 -28.19 -28.195 -28.2 -28.205 -28.21 -28.215 -28.22 -28.225 -28.23 -28.235 -28.24 -28.245 -28.25 -28.255 -28.26 -28.265 -28.27 -28.275 -28.28 -28.285 -28.29 -28.295 -28.3 -28.305 -28.31 -28.315 -28.32 -28.325 -28.33 -28.335 -28.34 -28.345 -28.35 -28.355 -28.36 -28.365 -28.37 -28.375 -28.38 -28.385 -28.39 -28.395 -28.4 -28.405 -28.41 -28.415 -28.42 -28.425 -28.43 -28.435 -28.44 -28.445 -28.45 -28.455 -28.46 -28.465 -28.47 -28.475 -28.48 -28.485 -28.49 -28.495 -28.5 -28.505 -28.51 -28.515 -28.52 -28.525 -28.53 -28.535 -28.54 -28.545 -28.55 -28.555 -28.56 -28.565 -28.57 -28.575 -28.58 -28.585 -28.59 -28.595 -28.6 -28.605 -28.61 -28.615 -28.62 -28.625 -28.63 -28.635 -28.64 -28.645 -28.65 -28.655 -28.66 -28.665 -28.67 -28.675 -28.68 -28.685 -28.69 -28.695 -28.7 -28.705 -28.71 -28.715 -28.72 -28.725 -28.73 -28.735 -28.74 -28.745 -28.75 -28.755 -28.76 -28.765 -28.77 -28.775 -28.78 -28.785 -28.79 -28.795 -28.8 -28.805 -28.81 -28.815 -28.82 -28.825 -28.83 -28.835 -28.84 -28.845 -28.85 -28.855 -28.86 -28.865 -28.87 -28.875 -28.88 -28.885 -28.89 -28.895 -28.9 -28.905 -28.91 -28.915 -28.92 -28.925 -28.93 -28.935 -28.94 -28.945 -28.95 -28.955 -28.96 -28.965 -28.97 -28.975 -28.98 -28.985 -28.99 -28.995 -29 -29.005 -29.01 -29.015 -29.02 -29.025 -29.03 -29.035 -29.04 -29.045 -29.05 -29.055 -29.06 -29.065 -29.07 -29.075 -29.08 -29.085 -29.09 -29.095 -29.1 -29.105 -29.11 -29.115 -29.12 -29.125 -29.13 -29.135 -29.14 -29.145 -29.15 -29.155 -29.16 -29.165 -29.17 -29.175 -29.18 -29.185 -29.19 -29.195 -29.2 -29.205 -29.21 -29.215 -29.22 -29.225 -29.23 -29.235 -29.24 -29.245 -29.25 -29.255 -29.26 -29.265 -29.27 -29.275 -29.28 -29.285 -29.29 -29.295 -29.3 -29.305 -29.31 -29.315 -29.32 -29.325 -29.33 -29.335 -29.34 -29.345 -29.35 -29.355 -29.36 -29.365 -29.37 -29.375 -29.38 -29.385 -29.39 -29.395 -29.4 -29.405 -29.41 -29.415 -29.42 -29.425 -29.43 -29.435 -29.44 -29.445 -29.45 -29.455 -29.46 -29.465 -29.47 -29.475 -29.48 -29.485 -29.49 -29.495 -29.5 -29.505 -29.51 -29.515 -29.52 -29.525 -29.53 -29.535 -29.54 -29.545 -29.55 -29.555 -29.56 -29.565 -29.57 -29.575 -29.58 -29.585 -29.59 -29.595 -29.6 -29.605 -29.61 -29.615 -29.62 -29.625 -29.63 -29.635 -29.64 -29.645 -29.65 -29.655 -29.66 -29.665 -29.67 -29.675 -29.68 -29.685 -29.69 -29.695 -29.7 -29.705 -29.71 -29.715 -29.72 -29.725 -29.73 -29.735 -29.74 -29.745 -29.75 -29.755 -29.76 -29.765 -29.77 -29.775 -29.78 -29.785 -29.79 -29.795 -29.8 -29.805 -29.81 -29.815 -29.82 -29.825 -29.83 -29.835 -29.84 -29.845 -29.85 -29.855 -29.86 -29.865 -29.87 -29.875 -29.88 -29.885 -29.89 -29.895 -29.9 -29.905 -29.91 -29.915 -29.92 -29.925 -29.93 -29.935 -29.94 -29.945 -29.95 -29.955 -29.96 -29.965 -29.97 -29.975 -29.98 -29.985 -29.99 -29.995 -30 -30.005 -30.01 -30.015 -30.02 -30.025 -30.03 -30.035 -30.04 -30.045 -30.05 -30.055 -30.06 -30.065 -30.07 -30.075 -30.08 -30.085 -30.09 -30.095 -30.1 -30.105 -30.11 -30.115 -30.12 -30.125 -30.13 -30.135 -30.14 -30.145 -30.15 -30.155 -30.16 -30.165 -30.17 -30.175 -30.18 -30.185 -30.19 -30.195 -30.2 -30.205 -30.21 -30.215 -30.22 -30.225 -30.23 -30.235 -30.24 -30.245 -30.25 -30.255 -30.26 -30.265 -30.27 -30.275 -30.28 -30.285 -30.29 -30.295 -30.3 -30.305 -30.31 -30.315 -30.32 -30.325 -30.33 -30.335 -30.34 -30.345 -30.35 -30.355 -30.36 -30.365 -30.37 -30.375 -30.38 -30.385 -30.39 -30.395 -30.4 -30.405 -30.41 -30.415 -30.42 -30.425 -30.43 -30.435 -30.44 -30.445 -30.45 -30.455 -30.46 -30.465 -30.47 -30.475 -30.48 -30.485 -30.49 -30.495 -30.5 -30.505 -30.51 -30.515 -30.52 -30.525 -30.53 -30.535 -30.54 -30.545 -30.55 -30.555 -30.56 -30.565 -30.57 -30.575 -30.58 -30.585 -30.59 -30.595 -30.6 -30.605 -30.61 -30.615 -30.62 -30.625 -30.63 -30.635 -30.64 -30.645 -30.65 -30.655 -30.66 -30.665 -30.67 -30.675 -30.68 -30.685 -30.69 -30.695 -30.7 -30.705 -30.71 -30.715 -30.72 -30.725 -30.73 -30.735 -30.74 -30.745 -30.75 -30.755 -30.76 -30.765 -30.77 -30.775 -30.78 -30.785 -30.79 -30.795 -30.8 -30.805 -30.81 -30.815 -30.82 -30.825 -30.83 -30.835 -30.84 -30.845 -30.85 -30.855 -30.86 -30.865 -30.87 -30.875 -30.88 -30.885 -30.89 -30.895 -30.9 -30.905 -30.91 -30.915 -30.92 -30.925 -30.93 -30.935 -30.94 -30.945 -30.95 -30.955 -30.96 -30.965 -30.97 -30.975 -30.98 -30.985 -30.99 -30.995 -31 -31.005 -31.01 -31.015 -31.02 -31.025 -31.03 -31.035 -31.04 -31.045 -31.05 -31.055 -31.06 -31.065 -31.07 -31.075 -31.08 -31.085 -31.09 -31.095 -31.1 -31.105 -31.11 -31.115 -31.12 -31.125 -31.13 -31.135 -31.14 -31.145 -31.15 -31.155 -31.16 -31.165 -31.17 -31.175 -31.18 -31.185 -31.19 -31.195 -31.2 -31.205 -31.21 -31.215 -31.22 -31.225 -31.23 -31.235 -31.24 -31.245 -31.25 -31.255 -31.26 -31.265 -31.27 -31.275 -31.28 -31.285 -31.29 -31.295 -31.3 -31.305 -31.31 -31.315 -31.32 -31.325 -31.33 -31.335 -31.34 -31.345 -31.35 -31.355 -31.36 -31.365 -31.37 -31.375 -31.38 -31.385 -31.39 -31.395 -31.4 -31.405 -31.41 -31.415 -31.42 -31.425 -31.43 -31.435 -31.44 -31.445 -31.45 -31.455 -31.46 -31.465 -31.47 -31.475 -31.48 -31.485 -31.49 -31.495 -31.5 -31.505 -31.51 -31.515 -31.52 -31.525 -31.53 -31.535 -31.54 -31.545 -31.55 -31.555 -31.56 -31.565 -31.57 -31.575 -31.58 -31.585 -31.59 -31.595 -31.6 -31.605 -31.61 -31.615 -31.62 -31.625 -31.63 -31.635 -31.64 -31.645 -31.65 -31.655 -31.66 -31.665 -31.67 -31.675 -31.68 -31.685 -31.69 -31.695 -31.7 -31.705 -31.71 -31.715 -31.72 -31.725 -31.73 -31.735 -31.74 -31.745 -31.75 -31.755 -31.76 -31.765 -31.77 -31.775 -31.78 -31.785 -31.79 -31.795 -31.8 -31.805 -31.81 -31.815 -31.82 -31.825 -31.83 -31.835 -31.84 -31.845 -31.85 -31.855 -31.86 -31.865 -31.87 -31.875 -31.88 -31.885 -31.89 -31.895 -31.9 -31.905 -31.91 -31.915 -31.92 -31.925 -31.93 -31.935 -31.94 -31.945 -31.95 -31.955 -31.96 -31.965 -31.97 -31.975 -31.98 -31.985 -31.99 -31.995 -32 -32.005 -32.01 -32.015 -32.02 -32.025 -32.03 -32.035 -32.04 -32.045 -32.05 -32.055 -32.06 -32.065 -32.07 -32.075 -32.08 -32.085 -32.09 -32.095 -32.1 -32.105 -32.11 -32.115 -32.12 -32.125 -32.13 -32.135 -32.14 -32.145 -32.15 -32.155 -32.16 -32.165 -32.17 -32.175 -32.18 -32.185 -32.19 -32.195 -32.2 -32.205 -32.21 -32.215 -32.22 -32.225 -32.23 -32.235 -32.24 -32.245 -32.25 -32.255 -32.26 -32.265 -32.27 -32.275 -32.28 -32.285 -32.29 -32.295 -32.3 -32.305 -32.31 -32.315 -32.32 -32.325 -32.33 -32.335 -32.34 -32.345 -32.35 -32.355 -32.36 -32.365 -32.37 -32.375 -32.38 -32.385 -32.39 -32.395 -32.4 -32.405 -32.41 -32.415 -32.42 -32.425 -32.43 -32.435 -32.44 -32.445 -32.45 -32.455 -32.46 -32.465 -32.47 -32.475 -32.48 -32.485 -32.49 -32.495 -32.5 -32.505 -32.51 -32.515 -32.52 -32.525 -32.53 -32.535 -32.54 -32.545 -32.55 -32.555 -32.56 -32.565 -32.57 -32.575 -32.58 -32.585 -32.59 -32.595 -32.6 -32.605 -32.61 -32.615 -32.62 -32.625 -32.63 -32.635 -32.64 -32.645 -32.65 -32.655 -32.66 -32.665 -32.67 -32.675 -32.68 -32.685 -32.69 -32.695 -32.7 -32.705 -32.71 -32.715 -32.72 -32.725 -32.73 -32.735 -32.74 -32.745 -32.75 -32.755 -32.76 -32.765 -32.77 -32.775 -32.78 -32.785 -32.79 -32.795 -32.8 -32.805 -32.81 -32.815 -32.82 -32.825 -32.83 -32.835 -32.84 -32.845 -32.85 -32.855 -32.86 -32.865 -32.87 -32.875 -32.88 -32.885 -32.89 -32.895 -32.9 -32.905 -32.91 -32.915 -32.92 -32.925 -32.93 -32.935 -32.94 -32.945 -32.95 -32.955 -32.96 -32.965 -32.97 -32.975 -32.98 -32.985 -32.99 -32.995 -33 -33.005 -33.01 -33.015 -33.02 -33.025 -33.03 -33.035 -33.04 -33.045 -33.05 -33.055 -33.06 -33.065 -33.07 -33.075 -33.08 -33.085 -33.09 -33.095 -33.1 -33.105 -33.11 -33.115 -33.12 -33.125 -33.13 -33.135 -33.14 -33.145 -33.15 -33.155 -33.16 -33.165 -33.17 -33.175 -33.18 -33.185 -33.19 -33.195 -33.2 -33.205 -33.21 -33.215 -33.22 -33.225 -33.23 -33.235 -33.24 -33.245 -33.25 -33.255 -33.26 -33.265 -33.27 -33.275 -33.28 -33.285 -33.29 -33.295 -33.3 -33.305 -33.31 -33.315 -33.32 -33.325 -33.33 -33.335 -33.34 -33.345 -33.35 -33.355 -33.36 -33.365 -33.37 -33.375 -33.38 -33.385 -33.39 -33.395 -33.4 -33.405 -33.41 -33.415 -33.42 -33.425 -33.43 -33.435 -33.44 -33.445 -33.45 -33.455 -33.46 -33.465 -33.47 -33.475 -33.48 -33.485 -33.49 -33.495 -33.5 -33.505 -33.51 -33.515 -33.52 -33.525 -33.53 -33.535 -33.54 -33.545 -33.55 -33.555 -33.56 -33.565 -33.57 -33.575 -33.58 -33.585 -33.59 -33.595 -33.6 -33.605 -33.61 -33.615 -33.62 -33.625 -33.63 -33.635 -33.64 -33.645 -33.65 -33.655 -33.66 -33.665 -33.67 -33.675 -33.68 -33.685 -33.69 -33.695 -33.7 -33.705 -33.71 -33.715 -33.72 -33.725 -33.73 -33.735 -33.74 -33.745 -33.75 -33.755 -33.76 -33.765 -33.77 -33.775 -33.78 -33.785 -33.79 -33.795 -33.8 -33.805 -33.81 -33.815 -33.82 -33.825 -33.83 -33.835 -33.84 -33.845 -33.85 -33.855 -33.86 -33.865 -33.87 -33.875 -33.88 -33.885 -33.89 -33.895 -33.9 -33.905 -33.91 -33.915 -33.92 -33.925 -33.93 -33.935 -33.94 -33.945 -33.95 -33.955 -33.96 -33.965 -33.97 -33.975 -33.98 -33.985 -33.99 -33.995 -34 -34.005 -34.01 -34.015 -34.02 -34.025 -34.03 -34.035 -34.04 -34.045 -34.05 -34.055 -34.06 -34.065 -34.07 -34.075 -34.08 -34.085 -34.09 -34.095 -34.1 -34.105 -34.11 -34.115 -34.12 -34.125 -34.13 -34.135 -34.14 -34.145 -34.15 -34.155 -34.16 -34.165 -34.17 -34.175 -34.18 -34.185 -34.19 -34.195 -34.2 -34.205 -34.21 -34.215 -34.22 -34.225 -34.23 -34.235 -34.24 -34.245 -34.25 -34.255 -34.26 -34.265 -34.27 -34.275 -34.28 -34.285 -34.29 -34.295 -34.3 -34.305 -34.31 -34.315 -34.32 -34.325 -34.33 -34.335 -34.34 -34.345 -34.35 -34.355 -34.36 -34.365 -34.37 -34.375 -34.38 -34.385 -34.39 -34.395 -34.4 -34.405 -34.41 -34.415 -34.42 -34.425 -34.43 -34.435 -34.44 -34.445 -34.45 -34.455 -34.46 -34.465 -34.47 -34.475 -34.48 -34.485 -34.49 -34.495 -34.5 -34.505 -34.51 -34.515 -34.52 -34.525 -34.53 -34.535 -34.54 -34.545 -34.55 -34.555 -34.56 -34.565 -34.57 -34.575 -34.58 -34.585 -34.59 -34.595 -34.6 -34.605 -34.61 -34.615 -34.62 -34.625 -34.63 -34.635 -34.64 -34.645 -34.65 -34.655 -34.66 -34.665 -34.67 -34.675 -34.68 -34.685 -34.69 -34.695 -34.7 -34.705 -34.71 -34.715 -34.72 -34.725 -34.73 -34.735 -34.74 -34.745 -34.75 -34.755 -34.76 -34.765 -34.77 -34.775 -34.78 -34.785 -34.79 -34.795 -34.8 -34.805 -34.81 -34.815 -34.82 -34.825 -34.83 -34.835 -34.84 -34.845 -34.85 -34.855 -34.86 -34.865 -34.87 -34.875 -34.88 -34.885 -34.89 -34.895 -34.9 -34.905 -34.91 -34.915 -34.92 -34.925 -34.93 -34.935 -34.94 -34.945 -34.95 -34.955 -34.96 -34.965 -34.97 -34.975 -34.98 -34.985 -34.99 -34.995 -35 -35.005 -35.01 -35.015 -35.02 -35.025 -35.03 -35.035 -35.04 -35.045 -35.05 -35.055 -35.06 -35.065 -35.07 -35.075 -35.08 -35.085 -35.09 -35.095 -35.1 -35.105 -35.11 -35.115 -35.12 -35.125 -35.13 -35.135 -35.14 -35.145 -35.15 -35.155 -35.16 -35.165 -35.17 -35.175 -35.18 -35.185 -35.19 -35.195 -35.2 -35.205 -35.21 -35.215 -35.22 -35.225 -35.23 -35.235 -35.24 -35.245 -35.25 -35.255 -35.26 -35.265 -35.27 -35.275 -35.28 -35.285 -35.29 -35.295 -35.3 -35.305 -35.31 -35.315 -35.32 -35.325 -35.33 -35.335 -35.34 -35.345 -35.35 -35.355 -35.36 -35.365 -35.37 -35.375 -35.38 -35.385 -35.39 -35.395 -35.4 -35.405 -35.41 -35.415 -35.42 -35.425 -35.43 -35.435 -35.44 -35.445 -35.45 -35.455 -35.46 -35.465 -35.47 -35.475 -35.48 -35.485 -35.49 -35.495 -35.5 -35.505 -35.51 -35.515 -35.52 -35.525 -35.53 -35.535 -35.54 -35.545 -35.55 -35.555 -35.56 -35.565 -35.57 -35.575 -35.58 -35.585 -35.59 -35.595 -35.6 -35.605 -35.61 -35.615 -35.62 -35.625 -35.63 -35.635 -35.64 -35.645 -35.65 -35.655 -35.66 -35.665 -35.67 -35.675 -35.68 -35.685 -35.69 -35.695 -35.7 -35.705 -35.71 -35.715 -35.72 -35.725 -35.73 -35.735 -35.74 -35.745 -35.75 -35.755 -35.76 -35.765 -35.77 -35.775 -35.78 -35.785 -35.79 -35.795 -35.8 -35.805 -35.81 -35.815 -35.82 -35.825 -35.83 -35.835 -35.84 -35.845 -35.85 -35.855 -35.86 -35.865 -35.87 -35.875 -35.88 -35.885 -35.89 -35.895 -35.9 -35.905 -35.91 -35.915 -35.92 -35.925 -35.93 -35.935 -35.94 -35.945 -35.95 -35.955 -35.96 -35.965 -35.97 -35.975 -35.98 -35.985 -35.99 -35.995 -36 -36.005 -36.01 -36.015 -36.02 -36.025 -36.03 -36.035 -36.04 -36.045 -36.05 -36.055 -36.06 -36.065 -36.07 -36.075 -36.08 -36.085 -36.09 -36.095 -36.1 -36.105 -36.11 -36.115 -36.12 -36.125 -36.13 -36.135 -36.14 -36.145 -36.15 -36.155 -36.16 -36.165 -36.17 -36.175 -36.18 -36.185 -36.19 -36.195 -36.2 -36.205 -36.21 -36.215 -36.22 -36.225 -36.23 -36.235 -36.24 -36.245 -36.25 -36.255 -36.26 -36.265 -36.27 -36.275 -36.28 -36.285 -36.29 -36.295 -36.3 -36.305 -36.31 -36.315 -36.32 -36.325 -36.33 -36.335 -36.34 -36.345 -36.35 -36.355 -36.36 -36.365 -36.37 -36.375 -36.38 -36.385 -36.39 -36.395 -36.4 -36.405 -36.41 -36.415 -36.42 -36.425 -36.43 -36.435 -36.44 -36.445 -36.45 -36.455 -36.46 -36.465 -36.47 -36.475 -36.48 -36.485 -36.49 -36.495 -36.5 -36.505 -36.51 -36.515 -36.52 -36.525 -36.53 -36.535 -36.54 -36.545 -36.55 -36.555 -36.56 -36.565 -36.57 -36.575 -36.58 -36.585 -36.59 -36.595 -36.6 -36.605 -36.61 -36.615 -36.62 -36.625 -36.63 -36.635 -36.64 -36.645 -36.65 -36.655 -36.66 -36.665 -36.67 -36.675 -36.68 -36.685 -36.69 -36.695 -36.7 -36.705 -36.71 -36.715 -36.72 -36.725 -36.73 -36.735 -36.74 -36.745 -36.75 -36.755 -36.76 -36.765 -36.77 -36.775 -36.78 -36.785 -36.79 -36.795 -36.8 -36.805 -36.81 -36.815 -36.82 -36.825 -36.83 -36.835 -36.84 -36.845 -36.85 -36.855 -36.86 -36.865 -36.87 -36.875 -36.88 -36.885 -36.89 -36.895 -36.9 -36.905 -36.91 -36.915 -36.92 -36.925 -36.93 -36.935 -36.94 -36.945 -36.95 -36.955 -36.96 -36.965 -36.97 -36.975 -36.98 -36.985 -36.99 -36.995 -37 -37.005 -37.01 -37.015 -37.02 -37.025 -37.03 -37.035 -37.04 -37.045 -37.05 -37.055 -37.06 -37.065 -37.07 -37.075 -37.08 -37.085 -37.09 -37.095 -37.1 -37.105 -37.11 -37.115 -37.12 -37.125 -37.13 -37.135 -37.14 -37.145 -37.15 -37.155 -37.16 -37.165 -37.17 -37.175 -37.18 -37.185 -37.19 -37.195 -37.2 -37.205 -37.21 -37.215 -37.22 -37.225 -37.23 -37.235 -37.24 -37.245 -37.25 -37.255 -37.26 -37.265 -37.27 -37.275 -37.28 -37.285 -37.29 -37.295 -37.3 -37.305 -37.31 -37.315 -37.32 -37.325 -37.33 -37.335 -37.34 -37.345 -37.35 -37.355 -37.36 -37.365 -37.37 -37.375 -37.38 -37.385 -37.39 -37.395 -37.4 -37.405 -37.41 -37.415 -37.42 -37.425 -37.43 -37.435 -37.44 -37.445 -37.45 -37.455 -37.46 -37.465 -37.47 -37.475 -37.48 -37.485 -37.49 -37.495 -37.5 -37.505 -37.51 -37.515 -37.52 -37.525 -37.53 -37.535 -37.54 -37.545 -37.55 -37.555 -37.56 -37.565 -37.57 -37.575 -37.58 -37.585 -37.59 -37.595 -37.6 -37.605 -37.61 -37.615 -37.62 -37.625 -37.63 -37.635 -37.64 -37.645 -37.65 -37.655 -37.66 -37.665 -37.67 -37.675 -37.68 -37.685 -37.69 -37.695 -37.7 -37.705 -37.71 -37.715 -37.72 -37.725 -37.73 -37.735 -37.74 -37.745 -37.75 -37.755 -37.76 -37.765 -37.77 -37.775 -37.78 -37.785 -37.79 -37.795 -37.8 -37.805 -37.81 -37.815 -37.82 -37.825 -37.83 -37.835 -37.84 -37.845 -37.85 -37.855 -37.86 -37.865 -37.87 -37.875 -37.88 -37.885 -37.89 -37.895 -37.9 -37.905 -37.91 -37.915 -37.92 -37.925 -37.93 -37.935 -37.94 -37.945 -37.95 -37.955 -37.96 -37.965 -37.97 -37.975 -37.98 -37.985 -37.99 -37.995 -38 -38.005 -38.01 -38.015 -38.02 -38.025 -38.03 -38.035 -38.04 -38.045 -38.05 -38.055 -38.06 -38.065 -38.07 -38.075 -38.08 -38.085 -38.09 -38.095 -38.1 -38.105 -38.11 -38.115 -38.12 -38.125 -38.13 -38.135 -38.14 -38.145 -38.15 -38.155 -38.16 -38.165 -38.17 -38.175 -38.18 -38.185 -38.19 -38.195 -38.2 -38.205 -38.21 -38.215 -38.22 -38.225 -38.23 -38.235 -38.24 -38.245 -38.25 -38.255 -38.26 -38.265 -38.27 -38.275 -38.28 -38.285 -38.29 -38.295 -38.3 -38.305 -38.31 -38.315 -38.32 -38.325 -38.33 -38.335 -38.34 -38.345 -38.35 -38.355 -38.36 -38.365 -38.37 -38.375 -38.38 -38.385 -38.39 -38.395 -38.4 -38.405 -38.41 -38.415 -38.42 -38.425 -38.43 -38.435 -38.44 -38.445 -38.45 -38.455 -38.46 -38.465 -38.47 -38.475 -38.48 -38.485 -38.49 -38.495 -38.5 -38.505 -38.51 -38.515 -38.52 -38.525 -38.53 -38.535 -38.54 -38.545 -38.55 -38.555 -38.56 -38.565 -38.57 -38.575 -38.58 -38.585 -38.59 -38.595 -38.6 -38.605 -38.61 -38.615 -38.62 -38.625 -38.63 -38.635 -38.64 -38.645 -38.65 -38.655 -38.66 -38.665 -38.67 -38.675 -38.68 -38.685 -38.69 -38.695 -38.7 -38.705 -38.71 -38.715 -38.72 -38.725 -38.73 -38.735 -38.74 -38.745 -38.75 -38.755 -38.76 -38.765 -38.77 -38.775 -38.78 -38.785 -38.79 -38.795 -38.8 -38.805 -38.81 -38.815 -38.82 -38.825 -38.83 -38.835 -38.84 -38.845 -38.85 -38.855 -38.86 -38.865 -38.87 -38.875 -38.88 -38.885 -38.89 -38.895 -38.9 -38.905 -38.91 -38.915 -38.92 -38.925 -38.93 -38.935 -38.94 -38.945 -38.95 -38.955 -38.96 -38.965 -38.97 -38.975 -38.98 -38.985 -38.99 -38.995 -39 -39.005 -39.01 -39.015 -39.02 -39.025 -39.03 -39.035 -39.04 -39.045 -39.05 -39.055 -39.06 -39.065 -39.07 -39.075 -39.08 -39.085 -39.09 -39.095 -39.1 -39.105 -39.11 -39.115 -39.12 -39.125 -39.13 -39.135 -39.14 -39.145 -39.15 -39.155 -39.16 -39.165 -39.17 -39.175 -39.18 -39.185 -39.19 -39.195 -39.2 -39.205 -39.21 -39.215 -39.22 -39.225 -39.23 -39.235 -39.24 -39.245 -39.25 -39.255 -39.26 -39.265 -39.27 -39.275 -39.28 -39.285 -39.29 -39.295 -39.3 -39.305 -39.31 -39.315 -39.32 -39.325 -39.33 -39.335 -39.34 -39.345 -39.35 -39.355 -39.36 -39.365 -39.37 -39.375 -39.38 -39.385 -39.39 -39.395 -39.4 -39.405 -39.41 -39.415 -39.42 -39.425 -39.43 -39.435 -39.44 -39.445 -39.45 -39.455 -39.46 -39.465 -39.47 -39.475 -39.48 -39.485 -39.49 -39.495 -39.5 -39.505 -39.51 -39.515 -39.52 -39.525 -39.53 -39.535 -39.54 -39.545 -39.55 -39.555 -39.56 -39.565 -39.57 -39.575 -39.58 -39.585 -39.59 -39.595 -39.6 -39.605 -39.61 -39.615 -39.62 -39.625 -39.63 -39.635 -39.64 -39.645 -39.65 -39.655 -39.66 -39.665 -39.67 -39.675 -39.68 -39.685 -39.69 -39.695 -39.7 -39.705 -39.71 -39.715 -39.72 -39.725 -39.73 -39.735 -39.74 -39.745 -39.75 -39.755 -39.76 -39.765 -39.77 -39.775 -39.78 -39.785 -39.79 -39.795 -39.8 -39.805 -39.81 -39.815 -39.82 -39.825 -39.83 -39.835 -39.84 -39.845 -39.85 -39.855 -39.86 -39.865 -39.87 -39.875 -39.88 -39.885 -39.89 -39.895 -39.9 -39.905 -39.91 -39.915 -39.92 -39.925 -39.93 -39.935 -39.94 -39.945 -39.95 -39.955 -39.96 -39.965 -39.97 -39.975 -39.98 -39.985 -39.99 -39.995 -40 -40.005 -40.01 -40.015 -40.02 -40.025 -40.03 -40.035 -40.04 -40.045 -40.05 -40.055 -40.06 -40.065 -40.07 -40.075 -40.08 -40.085 -40.09 -40.095 -40.1 -40.105 -40.11 -40.115 -40.12 -40.125 -40.13 -40.135 -40.14 -40.145 -40.15 -40.155 -40.16 -40.165 -40.17 -40.175 -40.18 -40.185 -40.19 -40.195 -40.2 -40.205 -40.21 -40.215 -40.22 -40.225 -40.23 -40.235 -40.24 -40.245 -40.25 -40.255 -40.26 -40.265 -40.27 -40.275 -40.28 -40.285 -40.29 -40.295 -40.3 -40.305 -40.31 -40.315 -40.32 -40.325 -40.33 -40.335 -40.34 -40.345 -40.35 -40.355 -40.36 -40.365 -40.37 -40.375 -40.38 -40.385 -40.39 -40.395 -40.4 -40.405 -40.41 -40.415 -40.42 -40.425 -40.43 -40.435 -40.44 -40.445 -40.45 -40.455 -40.46 -40.465 -40.47 -40.475 -40.48 -40.485 -40.49 -40.495 -40.5 -40.505 -40.51 -40.515 -40.52 -40.525 -40.53 -40.535 -40.54 -40.545 -40.55 -40.555 -40.56 -40.565 -40.57 -40.575 -40.58 -40.585 -40.59 -40.595 -40.6 -40.605 -40.61 -40.615 -40.62 -40.625 -40.63 -40.635 -40.64 -40.645 -40.65 -40.655 -40.66 -40.665 -40.67 -40.675 -40.68 -40.685 -40.69 -40.695 -40.7 -40.705 -40.71 -40.715 -40.72 -40.725 -40.73 -40.735 -40.74 -40.745 -40.75 -40.755 -40.76 -40.765 -40.77 -40.775 -40.78 -40.785 -40.79 -40.795 -40.8 -40.805 -40.81 -40.815 -40.82 -40.825 -40.83 -40.835 -40.84 -40.845 -40.85 -40.855 -40.86 -40.865 -40.87 -40.875 -40.88 -40.885 -40.89 -40.895 -40.9 -40.905 -40.91 -40.915 -40.92 -40.925 -40.93 -40.935 -40.94 -40.945 -40.95 -40.955 -40.96 -40.965 -40.97 -40.975 -40.98 -40.985 -40.99 -40.995 -41 -41.005 -41.01 -41.015 -41.02 -41.025 -41.03 -41.035 -41.04 -41.045 -41.05 -41.055 -41.06 -41.065 -41.07 -41.075 -41.08 -41.085 -41.09 -41.095 -41.1 -41.105 -41.11 -41.115 -41.12 -41.125 -41.13 -41.135 -41.14 -41.145 -41.15 -41.155 -41.16 -41.165 -41.17 -41.175 -41.18 -41.185 -41.19 -41.195 -41.2 -41.205 -41.21 -41.215 -41.22 -41.225 -41.23 -41.235 -41.24 -41.245 -41.25 -41.255 -41.26 -41.265 -41.27 -41.275 -41.28 -41.285 -41.29 -41.295 -41.3 -41.305 -41.31 -41.315 -41.32 -41.325 -41.33 -41.335 -41.34 -41.345 -41.35 -41.355 -41.36 -41.365 -41.37 -41.375 -41.38 -41.385 -41.39 -41.395 -41.4 -41.405 -41.41 -41.415 -41.42 -41.425 -41.43 -41.435 -41.44 -41.445 -41.45 -41.455 -41.46 -41.465 -41.47 -41.475 -41.48 -41.485 -41.49 -41.495 -41.5 -41.505 -41.51 -41.515 -41.52 -41.525 -41.53 -41.535 -41.54 -41.545 -41.55 -41.555 -41.56 -41.565 -41.57 -41.575 -41.58 -41.585 -41.59 -41.595 -41.6 -41.605 -41.61 -41.615 -41.62 -41.625 -41.63 -41.635 -41.64 -41.645 -41.65 -41.655 -41.66 -41.665 -41.67 -41.675 -41.68 -41.685 -41.69 -41.695 -41.7 -41.705 -41.71 -41.715 -41.72 -41.725 -41.73 -41.735 -41.74 -41.745 -41.75 -41.755 -41.76 -41.765 -41.77 -41.775 -41.78 -41.785 -41.79 -41.795 -41.8 -41.805 -41.81 -41.815 -41.82 -41.825 -41.83 -41.835 -41.84 -41.845 -41.85 -41.855 -41.86 -41.865 -41.87 -41.875 -41.88 -41.885 -41.89 -41.895 -41.9 -41.905 -41.91 -41.915 -41.92 -41.925 -41.93 -41.935 -41.94 -41.945 -41.95 -41.955 -41.96 -41.965 -41.97 -41.975 -41.98 -41.985 -41.99 -41.995 -42 -42.005 -42.01 -42.015 -42.02 -42.025 -42.03 -42.035 -42.04 -42.045 -42.05 -42.055 -42.06 -42.065 -42.07 -42.075 -42.08 -42.085 -42.09 -42.095 -42.1 -42.105 -42.11 -42.115 -42.12 -42.125 -42.13 -42.135 -42.14 -42.145 -42.15 -42.155 -42.16 -42.165 -42.17 -42.175 -42.18 -42.185 -42.19 -42.195 -42.2 -42.205 -42.21 -42.215 -42.22 -42.225 -42.23 -42.235 -42.24 -42.245 -42.25 -42.255 -42.26 -42.265 -42.27 -42.275 -42.28 -42.285 -42.29 -42.295 -42.3 -42.305 -42.31 -42.315 -42.32 -42.325 -42.33 -42.335 -42.34 -42.345 -42.35 -42.355 -42.36 -42.365 -42.37 -42.375 -42.38 -42.385 -42.39 -42.395 -42.4 -42.405 -42.41 -42.415 -42.42 -42.425 -42.43 -42.435 -42.44 -42.445 -42.45 -42.455 -42.46 -42.465 -42.47 -42.475 -42.48 -42.485 -42.49 -42.495 -42.5 -42.505 -42.51 -42.515 -42.52 -42.525 -42.53 -42.535 -42.54 -42.545 -42.55 -42.555 -42.56 -42.565 -42.57 -42.575 -42.58 -42.585 -42.59 -42.595 -42.6 -42.605 -42.61 -42.615 -42.62 -42.625 -42.63 -42.635 -42.64 -42.645 -42.65 -42.655 -42.66 -42.665 -42.67 -42.675 -42.68 -42.685 -42.69 -42.695 -42.7 -42.705 -42.71 -42.715 -42.72 -42.725 -42.73 -42.735 -42.74 -42.745 -42.75 -42.755 -42.76 -42.765 -42.77 -42.775 -42.78 -42.785 -42.79 -42.795 -42.8 -42.805 -42.81 -42.815 -42.82 -42.825 -42.83 -42.835 -42.84 -42.845 -42.85 -42.855 -42.86 -42.865 -42.87 -42.875 -42.88 -42.885 -42.89 -42.895 -42.9 -42.905 -42.91 -42.915 -42.92 -42.925 -42.93 -42.935 -42.94 -42.945 -42.95 -42.955 -42.96 -42.965 -42.97 -42.975 -42.98 -42.985 -42.99 -42.995 -43 -43.005 -43.01 -43.015 -43.02 -43.025 -43.03 -43.035 -43.04 -43.045 -43.05 -43.055 -43.06 -43.065 -43.07 -43.075 -43.08 -43.085 -43.09 -43.095 -43.1 -43.105 -43.11 -43.115 -43.12 -43.125 -43.13 -43.135 -43.14 -43.145 -43.15 -43.155 -43.16 -43.165 -43.17 -43.175 -43.18 -43.185 -43.19 -43.195 -43.2 -43.205 -43.21 -43.215 -43.22 -43.225 -43.23 -43.235 -43.24 -43.245 -43.25 -43.255 -43.26 -43.265 -43.27 -43.275 -43.28 -43.285 -43.29 -43.295 -43.3 -43.305 -43.31 -43.315 -43.32 -43.325 -43.33 -43.335 -43.34 -43.345 -43.35 -43.355 -43.36 -43.365 -43.37 -43.375 -43.38 -43.385 -43.39 -43.395 -43.4 -43.405 -43.41 -43.415 -43.42 -43.425 -43.43 -43.435 -43.44 -43.445 -43.45 -43.455 -43.46 -43.465 -43.47 -43.475 -43.48 -43.485 -43.49 -43.495 -43.5 -43.505 -43.51 -43.515 -43.52 -43.525 -43.53 -43.535 -43.54 -43.545 -43.55 -43.555 -43.56 -43.565 -43.57 -43.575 -43.58 -43.585 -43.59 -43.595 -43.6 -43.605 -43.61 -43.615 -43.62 -43.625 -43.63 -43.635 -43.64 -43.645 -43.65 -43.655 -43.66 -43.665 -43.67 -43.675 -43.68 -43.685 -43.69 -43.695 -43.7 -43.705 -43.71 -43.715 -43.72 -43.725 -43.73 -43.735 -43.74 -43.745 -43.75 -43.755 -43.76 -43.765 -43.77 -43.775 -43.78 -43.785 -43.79 -43.795 -43.8 -43.805 -43.81 -43.815 -43.82 -43.825 -43.83 -43.835 -43.84 -43.845 -43.85 -43.855 -43.86 -43.865 -43.87 -43.875 -43.88 -43.885 -43.89 -43.895 -43.9 -43.905 -43.91 -43.915 -43.92 -43.925 -43.93 -43.935 -43.94 -43.945 -43.95 -43.955 -43.96 -43.965 -43.97 -43.975 -43.98 -43.985 -43.99 -43.995 -44 -44.005 -44.01 -44.015 -44.02 -44.025 -44.03 -44.035 -44.04 -44.045 -44.05 -44.055 -44.06 -44.065 -44.07 -44.075 -44.08 -44.085 -44.09 -44.095 -44.1 -44.105 -44.11 -44.115 -44.12 -44.125 -44.13 -44.135 -44.14 -44.145 -44.15 -44.155 -44.16 -44.165 -44.17 -44.175 -44.18 -44.185 -44.19 -44.195 -44.2 -44.205 -44.21 -44.215 -44.22 -44.225 -44.23 -44.235 -44.24 -44.245 -44.25 -44.255 -44.26 -44.265 -44.27 -44.275 -44.28 -44.285 -44.29 -44.295 -44.3 -44.305 -44.31 -44.315 -44.32 -44.325 -44.33 -44.335 -44.34 -44.345 -44.35 -44.355 -44.36 -44.365 -44.37 -44.375 -44.38 -44.385 -44.39 -44.395 -44.4 -44.405 -44.41 -44.415 -44.42 -44.425 -44.43 -44.435 -44.44 -44.445 -44.45 -44.455 -44.46 -44.465 -44.47 -44.475 -44.48 -44.485 -44.49 -44.495 -44.5 -44.505 -44.51 -44.515 -44.52 -44.525 -44.53 -44.535 -44.54 -44.545 -44.55 -44.555 -44.56 -44.565 -44.57 -44.575 -44.58 -44.585 -44.59 -44.595 -44.6 -44.605 -44.61 -44.615 -44.62 -44.625 -44.63 -44.635 -44.64 -44.645 -44.65 -44.655 -44.66 -44.665 -44.67 -44.675 -44.68 -44.685 -44.69 -44.695 -44.7 -44.705 -44.71 -44.715 -44.72 -44.725 -44.73 -44.735 -44.74 -44.745 -44.75 -44.755 -44.76 -44.765 -44.77 -44.775 -44.78 -44.785 -44.79 -44.795 -44.8 -44.805 -44.81 -44.815 -44.82 -44.825 -44.83 -44.835 -44.84 -44.845 -44.85 -44.855 -44.86 -44.865 -44.87 -44.875 -44.88 -44.885 -44.89 -44.895 -44.9 -44.905 -44.91 -44.915 -44.92 -44.925 -44.93 -44.935 -44.94 -44.945 -44.95 -44.955 -44.96 -44.965 -44.97 -44.975 -44.98 -44.985 -44.99 -44.995 -45 -45.005 -45.01 -45.015 -45.02 -45.025 -45.03 -45.035 -45.04 -45.045 -45.05 -45.055 -45.06 -45.065 -45.07 -45.075 -45.08 -45.085 -45.09 -45.095 -45.1 -45.105 -45.11 -45.115 -45.12 -45.125 -45.13 -45.135 -45.14 -45.145 -45.15 -45.155 -45.16 -45.165 -45.17 -45.175 -45.18 -45.185 -45.19 -45.195 -45.2 -45.205 -45.21 -45.215 -45.22 -45.225 -45.23 -45.235 -45.24 -45.245 -45.25 -45.255 -45.26 -45.265 -45.27 -45.275 -45.28 -45.285 -45.29 -45.295 -45.3 -45.305 -45.31 -45.315 -45.32 -45.325 -45.33 -45.335 -45.34 -45.345 -45.35 -45.355 -45.36 -45.365 -45.37 -45.375 -45.38 -45.385 -45.39 -45.395 -45.4 -45.405 -45.41 -45.415 -45.42 -45.425 -45.43 -45.435 -45.44 -45.445 -45.45 -45.455 -45.46 -45.465 -45.47 -45.475 -45.48 -45.485 -45.49 -45.495 -45.5 -45.505 -45.51 -45.515 -45.52 -45.525 -45.53 -45.535 -45.54 -45.545 -45.55 -45.555 -45.56 -45.565 -45.57 -45.575 -45.58 -45.585 -45.59 -45.595 -45.6 -45.605 -45.61 -45.615 -45.62 -45.625 -45.63 -45.635 -45.64 -45.645 -45.65 -45.655 -45.66 -45.665 -45.67 -45.675 -45.68 -45.685 -45.69 -45.695 -45.7 -45.705 -45.71 -45.715 -45.72 -45.725 -45.73 -45.735 -45.74 -45.745 -45.75 -45.755 -45.76 -45.765 -45.77 -45.775 -45.78 -45.785 -45.79 -45.795 -45.8 -45.805 -45.81 -45.815 -45.82 -45.825 -45.83 -45.835 -45.84 -45.845 -45.85 -45.855 -45.86 -45.865 -45.87 -45.875 -45.88 -45.885 -45.89 -45.895 -45.9 -45.905 -45.91 -45.915 -45.92 -45.925 -45.93 -45.935 -45.94 -45.945 -45.95 -45.955 -45.96 -45.965 -45.97 -45.975 -45.98 -45.985 -45.99 -45.995 -46 -46.005 -46.01 -46.015 -46.02 -46.025 -46.03 -46.035 -46.04 -46.045 -46.05 -46.055 -46.06 -46.065 -46.07 -46.075 -46.08 -46.085 -46.09 -46.095 -46.1 -46.105 -46.11 -46.115 -46.12 -46.125 -46.13 -46.135 -46.14 -46.145 -46.15 -46.155 -46.16 -46.165 -46.17 -46.175 -46.18 -46.185 -46.19 -46.195 -46.2 -46.205 -46.21 -46.215 -46.22 -46.225 -46.23 -46.235 -46.24 -46.245 -46.25 -46.255 -46.26 -46.265 -46.27 -46.275 -46.28 -46.285 -46.29 -46.295 -46.3 -46.305 -46.31 -46.315 -46.32 -46.325 -46.33 -46.335 -46.34 -46.345 -46.35 -46.355 -46.36 -46.365 -46.37 -46.375 -46.38 -46.385 -46.39 -46.395 -46.4 -46.405 -46.41 -46.415 -46.42 -46.425 -46.43 -46.435 -46.44 -46.445 -46.45 -46.455 -46.46 -46.465 -46.47 -46.475 -46.48 -46.485 -46.49 -46.495 -46.5 -46.505 -46.51 -46.515 -46.52 -46.525 -46.53 -46.535 -46.54 -46.545 -46.55 -46.555 -46.56 -46.565 -46.57 -46.575 -46.58 -46.585 -46.59 -46.595 -46.6 -46.605 -46.61 -46.615 -46.62 -46.625 -46.63 -46.635 -46.64 -46.645 -46.65 -46.655 -46.66 -46.665 -46.67 -46.675 -46.68 -46.685 -46.69 -46.695 -46.7 -46.705 -46.71 -46.715 -46.72 -46.725 -46.73 -46.735 -46.74 -46.745 -46.75 -46.755 -46.76 -46.765 -46.77 -46.775 -46.78 -46.785 -46.79 -46.795 -46.8 -46.805 -46.81 -46.815 -46.82 -46.825 -46.83 -46.835 -46.84 -46.845 -46.85 -46.855 -46.86 -46.865 -46.87 -46.875 -46.88 -46.885 -46.89 -46.895 -46.9 -46.905 -46.91 -46.915 -46.92 -46.925 -46.93 -46.935 -46.94 -46.945 -46.95 -46.955 -46.96 -46.965 -46.97 -46.975 -46.98 -46.985 -46.99 -46.995 -47 -47.005 -47.01 -47.015 -47.02 -47.025 -47.03 -47.035 -47.04 -47.045 -47.05 -47.055 -47.06 -47.065 -47.07 -47.075 -47.08 -47.085 -47.09 -47.095 -47.1 -47.105 -47.11 -47.115 -47.12 -47.125 -47.13 -47.135 -47.14 -47.145 -47.15 -47.155 -47.16 -47.165 -47.17 -47.175 -47.18 -47.185 -47.19 -47.195 -47.2 -47.205 -47.21 -47.215 -47.22 -47.225 -47.23 -47.235 -47.24 -47.245 -47.25 -47.255 -47.26 -47.265 -47.27 -47.275 -47.28 -47.285 -47.29 -47.295 -47.3 -47.305 -47.31 -47.315 -47.32 -47.325 -47.33 -47.335 -47.34 -47.345 -47.35 -47.355 -47.36 -47.365 -47.37 -47.375 -47.38 -47.385 -47.39 -47.395 -47.4 -47.405 -47.41 -47.415 -47.42 -47.425 -47.43 -47.435 -47.44 -47.445 -47.45 -47.455 -47.46 -47.465 -47.47 -47.475 -47.48 -47.485 -47.49 -47.495 -47.5 -47.505 -47.51 -47.515 -47.52 -47.525 -47.53 -47.535 -47.54 -47.545 -47.55 -47.555 -47.56 -47.565 -47.57 -47.575 -47.58 -47.585 -47.59 -47.595 -47.6 -47.605 -47.61 -47.615 -47.62 -47.625 -47.63 -47.635 -47.64 -47.645 -47.65 -47.655 -47.66 -47.665 -47.67 -47.675 -47.68 -47.685 -47.69 -47.695 -47.7 -47.705 -47.71 -47.715 -47.72 -47.725 -47.73 -47.735 -47.74 -47.745 -47.75 -47.755 -47.76 -47.765 -47.77 -47.775 -47.78 -47.785 -47.79 -47.795 -47.8 -47.805 -47.81 -47.815 -47.82 -47.825 -47.83 -47.835 -47.84 -47.845 -47.85 -47.855 -47.86 -47.865 -47.87 -47.875 -47.88 -47.885 -47.89 -47.895 -47.9 -47.905 -47.91 -47.915 -47.92 -47.925 -47.93 -47.935 -47.94 -47.945 -47.95 -47.955 -47.96 -47.965 -47.97 -47.975 -47.98 -47.985 -47.99 -47.995 -48 -48.005 -48.01 -48.015 -48.02 -48.025 -48.03 -48.035 -48.04 -48.045 -48.05 -48.055 -48.06 -48.065 -48.07 -48.075 -48.08 -48.085 -48.09 -48.095 -48.1 -48.105 -48.11 -48.115 -48.12 -48.125 -48.13 -48.135 -48.14 -48.145 -48.15 -48.155 -48.16 -48.165 -48.17 -48.175 -48.18 -48.185 -48.19 -48.195 -48.2 -48.205 -48.21 -48.215 -48.22 -48.225 -48.23 -48.235 -48.24 -48.245 -48.25 -48.255 -48.26 -48.265 -48.27 -48.275 -48.28 -48.285 -48.29 -48.295 -48.3 -48.305 -48.31 -48.315 -48.32 -48.325 -48.33 -48.335 -48.34 -48.345 -48.35 -48.355 -48.36 -48.365 -48.37 -48.375 -48.38 -48.385 -48.39 -48.395 -48.4 -48.405 -48.41 -48.415 -48.42 -48.425 -48.43 -48.435 -48.44 -48.445 -48.45 -48.455 -48.46 -48.465 -48.47 -48.475 -48.48 -48.485 -48.49 -48.495 -48.5 -48.505 -48.51 -48.515 -48.52 -48.525 -48.53 -48.535 -48.54 -48.545 -48.55 -48.555 -48.56 -48.565 -48.57 -48.575 -48.58 -48.585 -48.59 -48.595 -48.6 -48.605 -48.61 -48.615 -48.62 -48.625 -48.63 -48.635 -48.64 -48.645 -48.65 -48.655 -48.66 -48.665 -48.67 -48.675 -48.68 -48.685 -48.69 -48.695 -48.7 -48.705 -48.71 -48.715 -48.72 -48.725 -48.73 -48.735 -48.74 -48.745 -48.75 -48.755 -48.76 -48.765 -48.77 -48.775 -48.78 -48.785 -48.79 -48.795 -48.8 -48.805 -48.81 -48.815 -48.82 -48.825 -48.83 -48.835 -48.84 -48.845 -48.85 -48.855 -48.86 -48.865 -48.87 -48.875 -48.88 -48.885 -48.89 -48.895 -48.9 -48.905 -48.91 -48.915 -48.92 -48.925 -48.93 -48.935 -48.94 -48.945 -48.95 -48.955 -48.96 -48.965 -48.97 -48.975 -48.98 -48.985 -48.99 -48.995 -49 -49.005 -49.01 -49.015 -49.02 -49.025 -49.03 -49.035 -49.04 -49.045 -49.05 -49.055 -49.06 -49.065 -49.07 -49.075 -49.08 -49.085 -49.09 -49.095 -49.1 -49.105 -49.11 -49.115 -49.12 -49.125 -49.13 -49.135 -49.14 -49.145 -49.15 -49.155 -49.16 -49.165 -49.17 -49.175 -49.18 -49.185 -49.19 -49.195 -49.2 -49.205 -49.21 -49.215 -49.22 -49.225 -49.23 -49.235 -49.24 -49.245 -49.25 -49.255 -49.26 -49.265 -49.27 -49.275 -49.28 -49.285 -49.29 -49.295 -49.3 -49.305 -49.31 -49.315 -49.32 -49.325 -49.33 -49.335 -49.34 -49.345 -49.35 -49.355 -49.36 -49.365 -49.37 -49.375 -49.38 -49.385 -49.39 -49.395 -49.4 -49.405 -49.41 -49.415 -49.42 -49.425 -49.43 -49.435 -49.44 -49.445 -49.45 -49.455 -49.46 -49.465 -49.47 -49.475 -49.48 -49.485 -49.49 -49.495 -49.5 -49.505 -49.51 -49.515 -49.52 -49.525 -49.53 -49.535 -49.54 -49.545 -49.55 -49.555 -49.56 -49.565 -49.57 -49.575 -49.58 -49.585 -49.59 -49.595 -49.6 -49.605 -49.61 -49.615 -49.62 -49.625 -49.63 -49.635 -49.64 -49.645 -49.65 -49.655 -49.66 -49.665 -49.67 -49.675 -49.68 -49.685 -49.69 -49.695 -49.7 -49.705 -49.71 -49.715 -49.72 -49.725 -49.73 -49.735 -49.74 -49.745 -49.75 -49.755 -49.76 -49.765 -49.77 -49.775 -49.78 -49.785 -49.79 -49.795 -49.8 -49.805 -49.81 -49.815 -49.82 -49.825 -49.83 -49.835 -49.84 -49.845 -49.85 -49.855 -49.86 -49.865 -49.87 -49.875 -49.88 -49.885 -49.89 -49.895 -49.9 -49.905 -49.91 -49.915 -49.92 -49.925 -49.93 -49.935 -49.94 -49.945 -49.95 -49.955 -49.96 -49.965 -49.97 -49.975 -49.98 -49.985 -49.99 -49.995 -50 -50.005 -50.01 -50.015 -50.02 -50.025 -50.03 -50.035 -50.04 -50.045 -50.05 -50.055 -50.06 -50.065 -50.07 -50.075 -50.08 -50.085 -50.09 -50.095 -50.1 -50.105 -50.11 -50.115 -50.12 -50.125 -50.13 -50.135 -50.14 -50.145 -50.15 -50.155 -50.16 -50.165 -50.17 -50.175 -50.18 -50.185 -50.19 -50.195 -50.2 -50.205 -50.21 -50.215 -50.22 -50.225 -50.23 -50.235 -50.24 -50.245 -50.25 -50.255 -50.26 -50.265 -50.27 -50.275 -50.28 -50.285 -50.29 -50.295 -50.3 -50.305 -50.31 -50.315 -50.32 -50.325 -50.33 -50.335 -50.34 -50.345 -50.35 -50.355 -50.36 -50.365 -50.37 -50.375 -50.38 -50.385 -50.39 -50.395 -50.4 -50.405 -50.41 -50.415 -50.42 -50.425 -50.43 -50.435 -50.44 -50.445 -50.45 -50.455 -50.46 -50.465 -50.47 -50.475 -50.48 -50.485 -50.49 -50.495 -50.5 -50.505 -50.51 -50.515 -50.52 -50.525 -50.53 -50.535 -50.54 -50.545 -50.55 -50.555 -50.56 -50.565 -50.57 -50.575 -50.58 -50.585 -50.59 -50.595 -50.6 -50.605 -50.61 -50.615 -50.62 -50.625 -50.63 -50.635 -50.64 -50.645 -50.65 -50.655 -50.66 -50.665 -50.67 -50.675 -50.68 -50.685 -50.69 -50.695 -50.7 -50.705 -50.71 -50.715 -50.72 -50.725 -50.73 -50.735 -50.74 -50.745 -50.75 -50.755 -50.76 -50.765 -50.77 -50.775 -50.78 -50.785 -50.79 -50.795 -50.8 -50.805 -50.81 -50.815 -50.82 -50.825 -50.83 -50.835 -50.84 -50.845 -50.85 -50.855 -50.86 -50.865 -50.87 -50.875 -50.88 -50.885 -50.89 -50.895 -50.9 -50.905 -50.91 -50.915 -50.92 -50.925 -50.93 -50.935 -50.94 -50.945 -50.95 -50.955 -50.96 -50.965 -50.97 -50.975 -50.98 -50.985 -50.99 -50.995 -51 -51.005 -51.01 -51.015 -51.02 -51.025 -51.03 -51.035 -51.04 -51.045 -51.05 -51.055 -51.06 -51.065 -51.07 -51.075 -51.08 -51.085 -51.09 -51.095 -51.1 -51.105 -51.11 -51.115 -51.12 -51.125 -51.13 -51.135 -51.14 -51.145 -51.15 -51.155 -51.16 -51.165 -51.17 -51.175 -51.18 -51.185 -51.19 -51.195 -51.2 -51.205 -51.21 -51.215 -51.22 -51.225 -51.23 -51.235 -51.24 -51.245 -51.25 -51.255 -51.26 -51.265 -51.27 -51.275 -51.28 -51.285 -51.29 -51.295 -51.3 -51.305 -51.31 -51.315 -51.32 -51.325 -51.33 -51.335 -51.34 -51.345 -51.35 -51.355 -51.36 -51.365 -51.37 -51.375 -51.38 -51.385 -51.39 -51.395 -51.4 -51.405 -51.41 -51.415 -51.42 -51.425 -51.43 -51.435 -51.44 -51.445 -51.45 -51.455 -51.46 -51.465 -51.47 -51.475 -51.48 -51.485 -51.49 -51.495 -51.5 -51.505 -51.51 -51.515 -51.52 -51.525 -51.53 -51.535 -51.54 -51.545 -51.55 -51.555 -51.56 -51.565 -51.57 -51.575 -51.58 -51.585 -51.59 -51.595 -51.6 -51.605 -51.61 -51.615 -51.62 -51.625 -51.63 -51.635 -51.64 -51.645 -51.65 -51.655 -51.66 -51.665 -51.67 -51.675 -51.68 -51.685 -51.69 -51.695 -51.7 -51.705 -51.71 -51.715 -51.72 -51.725 -51.73 -51.735 -51.74 -51.745 -51.75 -51.755 -51.76 -51.765 -51.77 -51.775 -51.78 -51.785 -51.79 -51.795 -51.8 -51.805 -51.81 -51.815 -51.82 -51.825 -51.83 -51.835 -51.84 -51.845 -51.85 -51.855 -51.86 -51.865 -51.87 -51.875 -51.88 -51.885 -51.89 -51.895 -51.9 -51.905 -51.91 -51.915 -51.92 -51.925 -51.93 -51.935 -51.94 -51.945 -51.95 -51.955 -51.96 -51.965 -51.97 -51.975 -51.98 -51.985 -51.99 -51.995 -52 -52.005 -52.01 -52.015 -52.02 -52.025 -52.03 -52.035 -52.04 -52.045 -52.05 -52.055 -52.06 -52.065 -52.07 -52.075 -52.08 -52.085 -52.09 -52.095 -52.1 -52.105 -52.11 -52.115 -52.12 -52.125 -52.13 -52.135 -52.14 -52.145 -52.15 -52.155 -52.16 -52.165 -52.17 -52.175 -52.18 -52.185 -52.19 -52.195 -52.2 -52.205 -52.21 -52.215 -52.22 -52.225 -52.23 -52.235 -52.24 -52.245 -52.25 -52.255 -52.26 -52.265 -52.27 -52.275 -52.28 -52.285 -52.29 -52.295 -52.3 -52.305 -52.31 -52.315 -52.32 -52.325 -52.33 -52.335 -52.34 -52.345 -52.35 -52.355 -52.36 -52.365 -52.37 -52.375 -52.38 -52.385 -52.39 -52.395 -52.4 -52.405 -52.41 -52.415 -52.42 -52.425 -52.43 -52.435 -52.44 -52.445 -52.45 -52.455 -52.46 -52.465 -52.47 -52.475 -52.48 -52.485 -52.49 -52.495 -52.5 -52.505 -52.51 -52.515 -52.52 -52.525 -52.53 -52.535 -52.54 -52.545 -52.55 -52.555 -52.56 -52.565 -52.57 -52.575 -52.58 -52.585 -52.59 -52.595 -52.6 -52.605 -52.61 -52.615 -52.62 -52.625 -52.63 -52.635 -52.64 -52.645 -52.65 -52.655 -52.66 -52.665 -52.67 -52.675 -52.68 -52.685 -52.69 -52.695 -52.7 -52.705 -52.71 -52.715 -52.72 -52.725 -52.73 -52.735 -52.74 -52.745 -52.75 -52.755 -52.76 -52.765 -52.77 -52.775 -52.78 -52.785 -52.79 -52.795 -52.8 -52.805 -52.81 -52.815 -52.82 -52.825 -52.83 -52.835 -52.84 -52.845 -52.85 -52.855 -52.86 -52.865 -52.87 -52.875 -52.88 -52.885 -52.89 -52.895 -52.9 -52.905 -52.91 -52.915 -52.92 -52.925 -52.93 -52.935 -52.94 -52.945 -52.95 -52.955 -52.96 -52.965 -52.97 -52.975 -52.98 -52.985 -52.99 -52.995 -53 -53.005 -53.01 -53.015 -53.02 -53.025 -53.03 -53.035 -53.04 -53.045 -53.05 -53.055 -53.06 -53.065 -53.07 -53.075 -53.08 -53.085 -53.09 -53.095 -53.1 -53.105 -53.11 -53.115 -53.12 -53.125 -53.13 -53.135 -53.14 -53.145 -53.15 -53.155 -53.16 -53.165 -53.17 -53.175 -53.18 -53.185 -53.19 -53.195 -53.2 -53.205 -53.21 -53.215 -53.22 -53.225 -53.23 -53.235 -53.24 -53.245 -53.25 -53.255 -53.26 -53.265 -53.27 -53.275 -53.28 -53.285 -53.29 -53.295 -53.3 -53.305 -53.31 -53.315 -53.32 -53.325 -53.33 -53.335 -53.34 -53.345 -53.35 -53.355 -53.36 -53.365 -53.37 -53.375 -53.38 -53.385 -53.39 -53.395 -53.4 -53.405 -53.41 -53.415 -53.42 -53.425 -53.43 -53.435 -53.44 -53.445 -53.45 -53.455 -53.46 -53.465 -53.47 -53.475 -53.48 -53.485 -53.49 -53.495 -53.5 -53.505 -53.51 -53.515 -53.52 -53.525 -53.53 -53.535 -53.54 -53.545 -53.55 -53.555 -53.56 -53.565 -53.57 -53.575 -53.58 -53.585 -53.59 -53.595 -53.6 -53.605 -53.61 -53.615 -53.62 -53.625 -53.63 -53.635 -53.64 -53.645 -53.65 -53.655 -53.66 -53.665 -53.67 -53.675 -53.68 -53.685 -53.69 -53.695 -53.7 -53.705 -53.71 -53.715 -53.72 -53.725 -53.73 -53.735 -53.74 -53.745 -53.75 -53.755 -53.76 -53.765 -53.77 -53.775 -53.78 -53.785 -53.79 -53.795 -53.8 -53.805 -53.81 -53.815 -53.82 -53.825 -53.83 -53.835 -53.84 -53.845 -53.85 -53.855 -53.86 -53.865 -53.87 -53.875 -53.88 -53.885 -53.89 -53.895 -53.9 -53.905 -53.91 -53.915 -53.92 -53.925 -53.93 -53.935 -53.94 -53.945 -53.95 -53.955 -53.96 -53.965 -53.97 -53.975 -53.98 -53.985 -53.99 -53.995 -54 -54.005 -54.01 -54.015 -54.02 -54.025 -54.03 -54.035 -54.04 -54.045 -54.05 -54.055 -54.06 -54.065 -54.07 -54.075 -54.08 -54.085 -54.09 -54.095 -54.1 -54.105 -54.11 -54.115 -54.12 -54.125 -54.13 -54.135 -54.14 -54.145 -54.15 -54.155 -54.16 -54.165 -54.17 -54.175 -54.18 -54.185 -54.19 -54.195 -54.2 -54.205 -54.21 -54.215 -54.22 -54.225 -54.23 -54.235 -54.24 -54.245 -54.25 -54.255 -54.26 -54.265 -54.27 -54.275 -54.28 -54.285 -54.29 -54.295 -54.3 -54.305 -54.31 -54.315 -54.32 -54.325 -54.33 -54.335 -54.34 -54.345 -54.35 -54.355 -54.36 -54.365 -54.37 -54.375 -54.38 -54.385 -54.39 -54.395 -54.4 -54.405 -54.41 -54.415 -54.42 -54.425 -54.43 -54.435 -54.44 -54.445 -54.45 -54.455 -54.46 -54.465 -54.47 -54.475 -54.48 -54.485 -54.49 -54.495 -54.5 -54.505 -54.51 -54.515 -54.52 -54.525 -54.53 -54.535 -54.54 -54.545 -54.55 -54.555 -54.56 -54.565 -54.57 -54.575 -54.58 -54.585 -54.59 -54.595 -54.6 -54.605 -54.61 -54.615 -54.62 -54.625 -54.63 -54.635 -54.64 -54.645 -54.65 -54.655 -54.66 -54.665 -54.67 -54.675 -54.68 -54.685 -54.69 -54.695 -54.7 -54.705 -54.71 -54.715 -54.72 -54.725 -54.73 -54.735 -54.74 -54.745 -54.75 -54.755 -54.76 -54.765 -54.77 -54.775 -54.78 -54.785 -54.79 -54.795 -54.8 -54.805 -54.81 -54.815 -54.82 -54.825 -54.83 -54.835 -54.84 -54.845 -54.85 -54.855 -54.86 -54.865 -54.87 -54.875 -54.88 -54.885 -54.89 -54.895 -54.9 -54.905 -54.91 -54.915 -54.92 -54.925 -54.93 -54.935 -54.94 -54.945 -54.95 -54.955 -54.96 -54.965 -54.97 -54.975 -54.98 -54.985 -54.99 -54.995 -55 -55.005 -55.01 -55.015 -55.02 -55.025 -55.03 -55.035 -55.04 -55.045 -55.05 -55.055 -55.06 -55.065 -55.07 -55.075 -55.08 -55.085 -55.09 -55.095 -55.1 -55.105 -55.11 -55.115 -55.12 -55.125 -55.13 -55.135 -55.14 -55.145 -55.15 -55.155 -55.16 -55.165 -55.17 -55.175 -55.18 -55.185 -55.19 -55.195 -55.2 -55.205 -55.21 -55.215 -55.22 -55.225 -55.23 -55.235 -55.24 -55.245 -55.25 -55.255 -55.26 -55.265 -55.27 -55.275 -55.28 -55.285 -55.29 -55.295 -55.3 -55.305 -55.31 -55.315 -55.32 -55.325 -55.33 -55.335 -55.34 -55.345 -55.35 -55.355 -55.36 -55.365 -55.37 -55.375 -55.38 -55.385 -55.39 -55.395 -55.4 -55.405 -55.41 -55.415 -55.42 -55.425 -55.43 -55.435 -55.44 -55.445 -55.45 -55.455 -55.46 -55.465 -55.47 -55.475 -55.48 -55.485 -55.49 -55.495 -55.5 -55.505 -55.51 -55.515 -55.52 -55.525 -55.53 -55.535 -55.54 -55.545 -55.55 -55.555 -55.56 -55.565 -55.57 -55.575 -55.58 -55.585 -55.59 -55.595 -55.6 -55.605 -55.61 -55.615 -55.62 -55.625 -55.63 -55.635 -55.64 -55.645 -55.65 -55.655 -55.66 -55.665 -55.67 -55.675 -55.68 -55.685 -55.69 -55.695 -55.7 -55.705 -55.71 -55.715 -55.72 -55.725 -55.73 -55.735 -55.74 -55.745 -55.75 -55.755 -55.76 -55.765 -55.77 -55.775 -55.78 -55.785 -55.79 -55.795 -55.8 -55.805 -55.81 -55.815 -55.82 -55.825 -55.83 -55.835 -55.84 -55.845 -55.85 -55.855 -55.86 -55.865 -55.87 -55.875 -55.88 -55.885 -55.89 -55.895 -55.9 -55.905 -55.91 -55.915 -55.92 -55.925 -55.93 -55.935 -55.94 -55.945 -55.95 -55.955 -55.96 -55.965 -55.97 -55.975 -55.98 -55.985 -55.99 -55.995 -56 -56.005 -56.01 -56.015 -56.02 -56.025 -56.03 -56.035 -56.04 -56.045 -56.05 -56.055 -56.06 -56.065 -56.07 -56.075 -56.08 -56.085 -56.09 -56.095 -56.1 -56.105 -56.11 -56.115 -56.12 -56.125 -56.13 -56.135 -56.14 -56.145 -56.15 -56.155 -56.16 -56.165 -56.17 -56.175 -56.18 -56.185 -56.19 -56.195 -56.2 -56.205 -56.21 -56.215 -56.22 -56.225 -56.23 -56.235 -56.24 -56.245 -56.25 -56.255 -56.26 -56.265 -56.27 -56.275 -56.28 -56.285 -56.29 -56.295 -56.3 -56.305 -56.31 -56.315 -56.32 -56.325 -56.33 -56.335 -56.34 -56.345 -56.35 -56.355 -56.36 -56.365 -56.37 -56.375 -56.38 -56.385 -56.39 -56.395 -56.4 -56.405 -56.41 -56.415 -56.42 -56.425 -56.43 -56.435 -56.44 -56.445 -56.45 -56.455 -56.46 -56.465 -56.47 -56.475 -56.48 -56.485 -56.49 -56.495 -56.5 -56.505 -56.51 -56.515 -56.52 -56.525 -56.53 -56.535 -56.54 -56.545 -56.55 -56.555 -56.56 -56.565 -56.57 -56.575 -56.58 -56.585 -56.59 -56.595 -56.6 -56.605 -56.61 -56.615 -56.62 -56.625 -56.63 -56.635 -56.64 -56.645 -56.65 -56.655 -56.66 -56.665 -56.67 -56.675 -56.68 -56.685 -56.69 -56.695 -56.7 -56.705 -56.71 -56.715 -56.72 -56.725 -56.73 -56.735 -56.74 -56.745 -56.75 -56.755 -56.76 -56.765 -56.77 -56.775 -56.78 -56.785 -56.79 -56.795 -56.8 -56.805 -56.81 -56.815 -56.82 -56.825 -56.83 -56.835 -56.84 -56.845 -56.85 -56.855 -56.86 -56.865 -56.87 -56.875 -56.88 -56.885 -56.89 -56.895 -56.9 -56.905 -56.91 -56.915 -56.92 -56.925 -56.93 -56.935 -56.94 -56.945 -56.95 -56.955 -56.96 -56.965 -56.97 -56.975 -56.98 -56.985 -56.99 -56.995 -57 -57.005 -57.01 -57.015 -57.02 -57.025 -57.03 -57.035 -57.04 -57.045 -57.05 -57.055 -57.06 -57.065 -57.07 -57.075 -57.08 -57.085 -57.09 -57.095 -57.1 -57.105 -57.11 -57.115 -57.12 -57.125 -57.13 -57.135 -57.14 -57.145 -57.15 -57.155 -57.16 -57.165 -57.17 -57.175 -57.18 -57.185 -57.19 -57.195 -57.2 -57.205 -57.21 -57.215 -57.22 -57.225 -57.23 -57.235 -57.24 -57.245 -57.25 -57.255 -57.26 -57.265 -57.27 -57.275 -57.28 -57.285 -57.29 -57.295 -57.3 -57.305 -57.31 -57.315 -57.32 -57.325 -57.33 -57.335 -57.34 -57.345 -57.35 -57.355 -57.36 -57.365 -57.37 -57.375 -57.38 -57.385 -57.39 -57.395 -57.4 -57.405 -57.41 -57.415 -57.42 -57.425 -57.43 -57.435 -57.44 -57.445 -57.45 -57.455 -57.46 -57.465 -57.47 -57.475 -57.48 -57.485 -57.49 -57.495 -57.5 -57.505 -57.51 -57.515 -57.52 -57.525 -57.53 -57.535 -57.54 -57.545 -57.55 -57.555 -57.56 -57.565 -57.57 -57.575 -57.58 -57.585 -57.59 -57.595 -57.6 -57.605 -57.61 -57.615 -57.62 -57.625 -57.63 -57.635 -57.64 -57.645 -57.65 -57.655 -57.66 -57.665 -57.67 -57.675 -57.68 -57.685 -57.69 -57.695 -57.7 -57.705 -57.71 -57.715 -57.72 -57.725 -57.73 -57.735 -57.74 -57.745 -57.75 -57.755 -57.76 -57.765 -57.77 -57.775 -57.78 -57.785 -57.79 -57.795 -57.8 -57.805 -57.81 -57.815 -57.82 -57.825 -57.83 -57.835 -57.84 -57.845 -57.85 -57.855 -57.86 -57.865 -57.87 -57.875 -57.88 -57.885 -57.89 -57.895 -57.9 -57.905 -57.91 -57.915 -57.92 -57.925 -57.93 -57.935 -57.94 -57.945 -57.95 -57.955 -57.96 -57.965 -57.97 -57.975 -57.98 -57.985 -57.99 -57.995 -58 -58.005 -58.01 -58.015 -58.02 -58.025 -58.03 -58.035 -58.04 -58.045 -58.05 -58.055 -58.06 -58.065 -58.07 -58.075 -58.08 -58.085 -58.09 -58.095 -58.1 -58.105 -58.11 -58.115 -58.12 -58.125 -58.13 -58.135 -58.14 -58.145 -58.15 -58.155 -58.16 -58.165 -58.17 -58.175 -58.18 -58.185 -58.19 -58.195 -58.2 -58.205 -58.21 -58.215 -58.22 -58.225 -58.23 -58.235 -58.24 -58.245 -58.25 -58.255 -58.26 -58.265 -58.27 -58.275 -58.28 -58.285 -58.29 -58.295 -58.3 -58.305 -58.31 -58.315 -58.32 -58.325 -58.33 -58.335 -58.34 -58.345 -58.35 -58.355 -58.36 -58.365 -58.37 -58.375 -58.38 -58.385 -58.39 -58.395 -58.4 -58.405 -58.41 -58.415 -58.42 -58.425 -58.43 -58.435 -58.44 -58.445 -58.45 -58.455 -58.46 -58.465 -58.47 -58.475 -58.48 -58.485 -58.49 -58.495 -58.5 -58.505 -58.51 -58.515 -58.52 -58.525 -58.53 -58.535 -58.54 -58.545 -58.55 -58.555 -58.56 -58.565 -58.57 -58.575 -58.58 -58.585 -58.59 -58.595 -58.6 -58.605 -58.61 -58.615 -58.62 -58.625 -58.63 -58.635 -58.64 -58.645 -58.65 -58.655 -58.66 -58.665 -58.67 -58.675 -58.68 -58.685 -58.69 -58.695 -58.7 -58.705 -58.71 -58.715 -58.72 -58.725 -58.73 -58.735 -58.74 -58.745 -58.75 -58.755 -58.76 -58.765 -58.77 -58.775 -58.78 -58.785 -58.79 -58.795 -58.8 -58.805 -58.81 -58.815 -58.82 -58.825 -58.83 -58.835 -58.84 -58.845 -58.85 -58.855 -58.86 -58.865 -58.87 -58.875 -58.88 -58.885 -58.89 -58.895 -58.9 -58.905 -58.91 -58.915 -58.92 -58.925 -58.93 -58.935 -58.94 -58.945 -58.95 -58.955 -58.96 -58.965 -58.97 -58.975 -58.98 -58.985 -58.99 -58.995 -59 -59.005 -59.01 -59.015 -59.02 -59.025 -59.03 -59.035 -59.04 -59.045 -59.05 -59.055 -59.06 -59.065 -59.07 -59.075 -59.08 -59.085 -59.09 -59.095 -59.1 -59.105 -59.11 -59.115 -59.12 -59.125 -59.13 -59.135 -59.14 -59.145 -59.15 -59.155 -59.16 -59.165 -59.17 -59.175 -59.18 -59.185 -59.19 -59.195 -59.2 -59.205 -59.21 -59.215 -59.22 -59.225 -59.23 -59.235 -59.24 -59.245 -59.25 -59.255 -59.26 -59.265 -59.27 -59.275 -59.28 -59.285 -59.29 -59.295 -59.3 -59.305 -59.31 -59.315 -59.32 -59.325 -59.33 -59.335 -59.34 -59.345 -59.35 -59.355 -59.36 -59.365 -59.37 -59.375 -59.38 -59.385 -59.39 -59.395 -59.4 -59.405 -59.41 -59.415 -59.42 -59.425 -59.43 -59.435 -59.44 -59.445 -59.45 -59.455 -59.46 -59.465 -59.47 -59.475 -59.48 -59.485 -59.49 -59.495 -59.5 -59.505 -59.51 -59.515 -59.52 -59.525 -59.53 -59.535 -59.54 -59.545 -59.55 -59.555 -59.56 -59.565 -59.57 -59.575 -59.58 -59.585 -59.59 -59.595 -59.6 -59.605 -59.61 -59.615 -59.62 -59.625 -59.63 -59.635 -59.64 -59.645 -59.65 -59.655 -59.66 -59.665 -59.67 -59.675 -59.68 -59.685 -59.69 -59.695 -59.7 -59.705 -59.71 -59.715 -59.72 -59.725 -59.73 -59.735 -59.74 -59.745 -59.75 -59.755 -59.76 -59.765 -59.77 -59.775 -59.78 -59.785 -59.79 -59.795 -59.8 -59.805 -59.81 -59.815 -59.82 -59.825 -59.83 -59.835 -59.84 -59.845 -59.85 -59.855 -59.86 -59.865 -59.87 -59.875 -59.88 -59.885 -59.89 -59.895 -59.9 -59.905 -59.91 -59.915 -59.92 -59.925 -59.93 -59.935 -59.94 -59.945 -59.95 -59.955 -59.96 -59.965 -59.97 -59.975 -59.98 -59.985 -59.99 -59.995 -60 -60.005 -60.01 -60.015 -60.02 -60.025 -60.03 -60.035 -60.04 -60.045 -60.05 -60.055 -60.06 -60.065 -60.07 -60.075 -60.08 -60.085 -60.09 -60.095 -60.1 -60.105 -60.11 -60.115 -60.12 -60.125 -60.13 -60.135 -60.14 -60.145 -60.15 -60.155 -60.16 -60.165 -60.17 -60.175 -60.18 -60.185 -60.19 -60.195 -60.2 -60.205 -60.21 -60.215 -60.22 -60.225 -60.23 -60.235 -60.24 -60.245 -60.25 -60.255 -60.26 -60.265 -60.27 -60.275 -60.28 -60.285 -60.29 -60.295 -60.3 -60.305 -60.31 -60.315 -60.32 -60.325 -60.33 -60.335 -60.34 -60.345 -60.35 -60.355 -60.36 -60.365 -60.37 -60.375 -60.38 -60.385 -60.39 -60.395 -60.4 -60.405 -60.41 -60.415 -60.42 -60.425 -60.43 -60.435 -60.44 -60.445 -60.45 -60.455 -60.46 -60.465 -60.47 -60.475 -60.48 -60.485 -60.49 -60.495 -60.5 -60.505 -60.51 -60.515 -60.52 -60.525 -60.53 -60.535 -60.54 -60.545 -60.55 -60.555 -60.56 -60.565 -60.57 -60.575 -60.58 -60.585 -60.59 -60.595 -60.6 -60.605 -60.61 -60.615 -60.62 -60.625 -60.63 -60.635 -60.64 -60.645 -60.65 -60.655 -60.66 -60.665 -60.67 -60.675 -60.68 -60.685 -60.69 -60.695 -60.7 -60.705 -60.71 -60.715 -60.72 -60.725 -60.73 -60.735 -60.74 -60.745 -60.75 -60.755 -60.76 -60.765 -60.77 -60.775 -60.78 -60.785 -60.79 -60.795 -60.8 -60.805 -60.81 -60.815 -60.82 -60.825 -60.83 -60.835 -60.84 -60.845 -60.85 -60.855 -60.86 -60.865 -60.87 -60.875 -60.88 -60.885 -60.89 -60.895 -60.9 -60.905 -60.91 -60.915 -60.92 -60.925 -60.93 -60.935 -60.94 -60.945 -60.95 -60.955 -60.96 -60.965 -60.97 -60.975 -60.98 -60.985 -60.99 -60.995 -61 -61.005 -61.01 -61.015 -61.02 -61.025 -61.03 -61.035 -61.04 -61.045 -61.05 -61.055 -61.06 -61.065 -61.07 -61.075 -61.08 -61.085 -61.09 -61.095 -61.1 -61.105 -61.11 -61.115 -61.12 -61.125 -61.13 -61.135 -61.14 -61.145 -61.15 -61.155 -61.16 -61.165 -61.17 -61.175 -61.18 -61.185 -61.19 -61.195 -61.2 -61.205 -61.21 -61.215 -61.22 -61.225 -61.23 -61.235 -61.24 -61.245 -61.25 -61.255 -61.26 -61.265 -61.27 -61.275 -61.28 -61.285 -61.29 -61.295 -61.3 -61.305 -61.31 -61.315 -61.32 -61.325 -61.33 -61.335 -61.34 -61.345 -61.35 -61.355 -61.36 -61.365 -61.37 -61.375 -61.38 -61.385 -61.39 -61.395 -61.4 -61.405 -61.41 -61.415 -61.42 -61.425 -61.43 -61.435 -61.44 -61.445 -61.45 -61.455 -61.46 -61.465 -61.47 -61.475 -61.48 -61.485 -61.49 -61.495 -61.5 -61.505 -61.51 -61.515 -61.52 -61.525 -61.53 -61.535 -61.54 -61.545 -61.55 -61.555 -61.56 -61.565 -61.57 -61.575 -61.58 -61.585 -61.59 -61.595 -61.6 -61.605 -61.61 -61.615 -61.62 -61.625 -61.63 -61.635 -61.64 -61.645 -61.65 -61.655 -61.66 -61.665 -61.67 -61.675 -61.68 -61.685 -61.69 -61.695 -61.7 -61.705 -61.71 -61.715 -61.72 -61.725 -61.73 -61.735 -61.74 -61.745 -61.75 -61.755 -61.76 -61.765 -61.77 -61.775 -61.78 -61.785 -61.79 -61.795 -61.8 -61.805 -61.81 -61.815 -61.82 -61.825 -61.83 -61.835 -61.84 -61.845 -61.85 -61.855 -61.86 -61.865 -61.87 -61.875 -61.88 -61.885 -61.89 -61.895 -61.9 -61.905 -61.91 -61.915 -61.92 -61.925 -61.93 -61.935 -61.94 -61.945 -61.95 -61.955 -61.96 -61.965 -61.97 -61.975 -61.98 -61.985 -61.99 -61.995 -62 -62.005 -62.01 -62.015 -62.02 -62.025 -62.03 -62.035 -62.04 -62.045 -62.05 -62.055 -62.06 -62.065 -62.07 -62.075 -62.08 -62.085 -62.09 -62.095 -62.1 -62.105 -62.11 -62.115 -62.12 -62.125 -62.13 -62.135 -62.14 -62.145 -62.15 -62.155 -62.16 -62.165 -62.17 -62.175 -62.18 -62.185 -62.19 -62.195 -62.2 -62.205 -62.21 -62.215 -62.22 -62.225 -62.23 -62.235 -62.24 -62.245 -62.25 -62.255 -62.26 -62.265 -62.27 -62.275 -62.28 -62.285 -62.29 -62.295 -62.3 -62.305 -62.31 -62.315 -62.32 -62.325 -62.33 -62.335 -62.34 -62.345 -62.35 -62.355 -62.36 -62.365 -62.37 -62.375 -62.38 -62.385 -62.39 -62.395 -62.4 -62.405 -62.41 -62.415 -62.42 -62.425 -62.43 -62.435 -62.44 -62.445 -62.45 -62.455 -62.46 -62.465 -62.47 -62.475 -62.48 -62.485 -62.49 -62.495 -62.5 -62.505 -62.51 -62.515 -62.52 -62.525 -62.53 -62.535 -62.54 -62.545 -62.55 -62.555 -62.56 -62.565 -62.57 -62.575 -62.58 -62.585 -62.59 -62.595 -62.6 -62.605 -62.61 -62.615 -62.62 -62.625 -62.63 -62.635 -62.64 -62.645 -62.65 -62.655 -62.66 -62.665 -62.67 -62.675 -62.68 -62.685 -62.69 -62.695 -62.7 -62.705 -62.71 -62.715 -62.72 -62.725 -62.73 -62.735 -62.74 -62.745 -62.75 -62.755 -62.76 -62.765 -62.77 -62.775 -62.78 -62.785 -62.79 -62.795 -62.8 -62.805 -62.81 -62.815 -62.82 -62.825 -62.83 -62.835 -62.84 -62.845 -62.85 -62.855 -62.86 -62.865 -62.87 -62.875 -62.88 -62.885 -62.89 -62.895 -62.9 -62.905 -62.91 -62.915 -62.92 -62.925 -62.93 -62.935 -62.94 -62.945 -62.95 -62.955 -62.96 -62.965 -62.97 -62.975 -62.98 -62.985 -62.99 -62.995 -63 -63.005 -63.01 -63.015 -63.02 -63.025 -63.03 -63.035 -63.04 -63.045 -63.05 -63.055 -63.06 -63.065 -63.07 -63.075 -63.08 -63.085 -63.09 -63.095 -63.1 -63.105 -63.11 -63.115 -63.12 -63.125 -63.13 -63.135 -63.14 -63.145 -63.15 -63.155 -63.16 -63.165 -63.17 -63.175 -63.18 -63.185 -63.19 -63.195 -63.2 -63.205 -63.21 -63.215 -63.22 -63.225 -63.23 -63.235 -63.24 -63.245 -63.25 -63.255 -63.26 -63.265 -63.27 -63.275 -63.28 -63.285 -63.29 -63.295 -63.3 -63.305 -63.31 -63.315 -63.32 -63.325 -63.33 -63.335 -63.34 -63.345 -63.35 -63.355 -63.36 -63.365 -63.37 -63.375 -63.38 -63.385 -63.39 -63.395 -63.4 -63.405 -63.41 -63.415 -63.42 -63.425 -63.43 -63.435 -63.44 -63.445 -63.45 -63.455 -63.46 -63.465 -63.47 -63.475 -63.48 -63.485 -63.49 -63.495 -63.5 -63.505 -63.51 -63.515 -63.52 -63.525 -63.53 -63.535 -63.54 -63.545 -63.55 -63.555 -63.56 -63.565 -63.57 -63.575 -63.58 -63.585 -63.59 -63.595 -63.6 -63.605 -63.61 -63.615 -63.62 -63.625 -63.63 -63.635 -63.64 -63.645 -63.65 -63.655 -63.66 -63.665 -63.67 -63.675 -63.68 -63.685 -63.69 -63.695 -63.7 -63.705 -63.71 -63.715 -63.72 -63.725 -63.73 -63.735 -63.74 -63.745 -63.75 -63.755 -63.76 -63.765 -63.77 -63.775 -63.78 -63.785 -63.79 -63.795 -63.8 -63.805 -63.81 -63.815 -63.82 -63.825 -63.83 -63.835 -63.84 -63.845 -63.85 -63.855 -63.86 -63.865 -63.87 -63.875 -63.88 -63.885 -63.89 -63.895 -63.9 -63.905 -63.91 -63.915 -63.92 -63.925 -63.93 -63.935 -63.94 -63.945 -63.95 -63.955 -63.96 -63.965 -63.97 -63.975 -63.98 -63.985 -63.99 -63.995 -64 -64.005 -64.01 -64.015 -64.02 -64.025 -64.03 -64.035 -64.04 -64.045 -64.05 -64.055 -64.06 -64.065 -64.07 -64.075 -64.08 -64.085 -64.09 -64.095 -64.1 -64.105 -64.11 -64.115 -64.12 -64.125 -64.13 -64.135 -64.14 -64.145 -64.15 -64.155 -64.16 -64.165 -64.17 -64.175 -64.18 -64.185 -64.19 -64.195 -64.2 -64.205 -64.21 -64.215 -64.22 -64.225 -64.23 -64.235 -64.24 -64.245 -64.25 -64.255 -64.26 -64.265 -64.27 -64.275 -64.28 -64.285 -64.29 -64.295 -64.3 -64.305 -64.31 -64.315 -64.32 -64.325 -64.33 -64.335 -64.34 -64.345 -64.35 -64.355 -64.36 -64.365 -64.37 -64.375 -64.38 -64.385 -64.39 -64.395 -64.4 -64.405 -64.41 -64.415 -64.42 -64.425 -64.43 -64.435 -64.44 -64.445 -64.45 -64.455 -64.46 -64.465 -64.47 -64.475 -64.48 -64.485 -64.49 -64.495 -64.5 -64.505 -64.51 -64.515 -64.52 -64.525 -64.53 -64.535 -64.54 -64.545 -64.55 -64.555 -64.56 -64.565 -64.57 -64.575 -64.58 -64.585 -64.59 -64.595 -64.6 -64.605 -64.61 -64.615 -64.62 -64.625 -64.63 -64.635 -64.64 -64.645 -64.65 -64.655 -64.66 -64.665 -64.67 -64.675 -64.68 -64.685 -64.69 -64.695 -64.7 -64.705 -64.71 -64.715 -64.72 -64.725 -64.73 -64.735 -64.74 -64.745 -64.75 -64.755 -64.76 -64.765 -64.77 -64.775 -64.78 -64.785 -64.79 -64.795 -64.8 -64.805 -64.81 -64.815 -64.82 -64.825 -64.83 -64.835 -64.84 -64.845 -64.85 -64.855 -64.86 -64.865 -64.87 -64.875 -64.88 -64.885 -64.89 -64.895 -64.9 -64.905 -64.91 -64.915 -64.92 -64.925 -64.93 -64.935 -64.94 -64.945 -64.95 -64.955 -64.96 -64.965 -64.97 -64.975 -64.98 -64.985 -64.99 -64.995 -65 -65.005 -65.01 -65.015 -65.02 -65.025 -65.03 -65.035 -65.04 -65.045 -65.05 -65.055 -65.06 -65.065 -65.07 -65.075 -65.08 -65.085 -65.09 -65.095 -65.1 -65.105 -65.11 -65.115 -65.12 -65.125 -65.13 -65.135 -65.14 -65.145 -65.15 -65.155 -65.16 -65.165 -65.17 -65.175 -65.18 -65.185 -65.19 -65.195 -65.2 -65.205 -65.21 -65.215 -65.22 -65.225 -65.23 -65.235 -65.24 -65.245 -65.25 -65.255 -65.26 -65.265 -65.27 -65.275 -65.28 -65.285 -65.29 -65.295 -65.3 -65.305 -65.31 -65.315 -65.32 -65.325 -65.33 -65.335 -65.34 -65.345 -65.35 -65.355 -65.36 -65.365 -65.37 -65.375 -65.38 -65.385 -65.39 -65.395 -65.4 -65.405 -65.41 -65.415 -65.42 -65.425 -65.43 -65.435 -65.44 -65.445 -65.45 -65.455 -65.46 -65.465 -65.47 -65.475 -65.48 -65.485 -65.49 -65.495 -65.5 -65.505 -65.51 -65.515 -65.52 -65.525 -65.53 -65.535 -65.54 -65.545 -65.55 -65.555 -65.56 -65.565 -65.57 -65.575 -65.58 -65.585 -65.59 -65.595 -65.6 -65.605 -65.61 -65.615 -65.62 -65.625 -65.63 -65.635 -65.64 -65.645 -65.65 -65.655 -65.66 -65.665 -65.67 -65.675 -65.68 -65.685 -65.69 -65.695 -65.7 -65.705 -65.71 -65.715 -65.72 -65.725 -65.73 -65.735 -65.74 -65.745 -65.75 -65.755 -65.76 -65.765 -65.77 -65.775 -65.78 -65.785 -65.79 -65.795 -65.8 -65.805 -65.81 -65.815 -65.82 -65.825 -65.83 -65.835 -65.84 -65.845 -65.85 -65.855 -65.86 -65.865 -65.87 -65.875 -65.88 -65.885 -65.89 -65.895 -65.9 -65.905 -65.91 -65.915 -65.92 -65.925 -65.93 -65.935 -65.94 -65.945 -65.95 -65.955 -65.96 -65.965 -65.97 -65.975 -65.98 -65.985 -65.99 -65.995 -66 -66.005 -66.01 -66.015 -66.02 -66.025 -66.03 -66.035 -66.04 -66.045 -66.05 -66.055 -66.06 -66.065 -66.07 -66.075 -66.08 -66.085 -66.09 -66.095 -66.1 -66.105 -66.11 -66.115 -66.12 -66.125 -66.13 -66.135 -66.14 -66.145 -66.15 -66.155 -66.16 -66.165 -66.17 -66.175 -66.18 -66.185 -66.19 -66.195 -66.2 -66.205 -66.21 -66.215 -66.22 -66.225 -66.23 -66.235 -66.24 -66.245 -66.25 -66.255 -66.26 -66.265 -66.27 -66.275 -66.28 -66.285 -66.29 -66.295 -66.3 -66.305 -66.31 -66.315 -66.32 -66.325 -66.33 -66.335 -66.34 -66.345 -66.35 -66.355 -66.36 -66.365 -66.37 -66.375 -66.38 -66.385 -66.39 -66.395 -66.4 -66.405 -66.41 -66.415 -66.42 -66.425 -66.43 -66.435 -66.44 -66.445 -66.45 -66.455 -66.46 -66.465 -66.47 -66.475 -66.48 -66.485 -66.49 -66.495 -66.5 -66.505 -66.51 -66.515 -66.52 -66.525 -66.53 -66.535 -66.54 -66.545 -66.55 -66.555 -66.56 -66.565 -66.57 -66.575 -66.58 -66.585 -66.59 -66.595 -66.6 -66.605 -66.61 -66.615 -66.62 -66.625 -66.63 -66.635 -66.64 -66.645 -66.65 -66.655 -66.66 -66.665 -66.67 -66.675 -66.68 -66.685 -66.69 -66.695 -66.7 -66.705 -66.71 -66.715 -66.72 -66.725 -66.73 -66.735 -66.74 -66.745 -66.75 -66.755 -66.76 -66.765 -66.77 -66.775 -66.78 -66.785 -66.79 -66.795 -66.8 -66.805 -66.81 -66.815 -66.82 -66.825 -66.83 -66.835 -66.84 -66.845 -66.85 -66.855 -66.86 -66.865 -66.87 -66.875 -66.88 -66.885 -66.89 -66.895 -66.9 -66.905 -66.91 -66.915 -66.92 -66.925 -66.93 -66.935 -66.94 -66.945 -66.95 -66.955 -66.96 -66.965 -66.97 -66.975 -66.98 -66.985 -66.99 -66.995 -67 -67.005 -67.01 -67.015 -67.02 -67.025 -67.03 -67.035 -67.04 -67.045 -67.05 -67.055 -67.06 -67.065 -67.07 -67.075 -67.08 -67.085 -67.09 -67.095 -67.1 -67.105 -67.11 -67.115 -67.12 -67.125 -67.13 -67.135 -67.14 -67.145 -67.15 -67.155 -67.16 -67.165 -67.17 -67.175 -67.18 -67.185 -67.19 -67.195 -67.2 -67.205 -67.21 -67.215 -67.22 -67.225 -67.23 -67.235 -67.24 -67.245 -67.25 -67.255 -67.26 -67.265 -67.27 -67.275 -67.28 -67.285 -67.29 -67.295 -67.3 -67.305 -67.31 -67.315 -67.32 -67.325 -67.33 -67.335 -67.34 -67.345 -67.35 -67.355 -67.36 -67.365 -67.37 -67.375 -67.38 -67.385 -67.39 -67.395 -67.4 -67.405 -67.41 -67.415 -67.42 -67.425 -67.43 -67.435 -67.44 -67.445 -67.45 -67.455 -67.46 -67.465 -67.47 -67.475 -67.48 -67.485 -67.49 -67.495 -67.5 -67.505 -67.51 -67.515 -67.52 -67.525 -67.53 -67.535 -67.54 -67.545 -67.55 -67.555 -67.56 -67.565 -67.57 -67.575 -67.58 -67.585 -67.59 -67.595 -67.6 -67.605 -67.61 -67.615 -67.62 -67.625 -67.63 -67.635 -67.64 -67.645 -67.65 -67.655 -67.66 -67.665 -67.67 -67.675 -67.68 -67.685 -67.69 -67.695 -67.7 -67.705 -67.71 -67.715 -67.72 -67.725 -67.73 -67.735 -67.74 -67.745 -67.75 -67.755 -67.76 -67.765 -67.77 -67.775 -67.78 -67.785 -67.79 -67.795 -67.8 -67.805 -67.81 -67.815 -67.82 -67.825 -67.83 -67.835 -67.84 -67.845 -67.85 -67.855 -67.86 -67.865 -67.87 -67.875 -67.88 -67.885 -67.89 -67.895 -67.9 -67.905 -67.91 -67.915 -67.92 -67.925 -67.93 -67.935 -67.94 -67.945 -67.95 -67.955 -67.96 -67.965 -67.97 -67.975 -67.98 -67.985 -67.99 -67.995 -68 -68.005 -68.01 -68.015 -68.02 -68.025 -68.03 -68.035 -68.04 -68.045 -68.05 -68.055 -68.06 -68.065 -68.07 -68.075 -68.08 -68.085 -68.09 -68.095 -68.1 -68.105 -68.11 -68.115 -68.12 -68.125 -68.13 -68.135 -68.14 -68.145 -68.15 -68.155 -68.16 -68.165 -68.17 -68.175 -68.18 -68.185 -68.19 -68.195 -68.2 -68.205 -68.21 -68.215 -68.22 -68.225 -68.23 -68.235 -68.24 -68.245 -68.25 -68.255 -68.26 -68.265 -68.27 -68.275 -68.28 -68.285 -68.29 -68.295 -68.3 -68.305 -68.31 -68.315 -68.32 -68.325 -68.33 -68.335 -68.34 -68.345 -68.35 -68.355 -68.36 -68.365 -68.37 -68.375 -68.38 -68.385 -68.39 -68.395 -68.4 -68.405 -68.41 -68.415 -68.42 -68.425 -68.43 -68.435 -68.44 -68.445 -68.45 -68.455 -68.46 -68.465 -68.47 -68.475 -68.48 -68.485 -68.49 -68.495 -68.5 -68.505 -68.51 -68.515 -68.52 -68.525 -68.53 -68.535 -68.54 -68.545 -68.55 -68.555 -68.56 -68.565 -68.57 -68.575 -68.58 -68.585 -68.59 -68.595 -68.6 -68.605 -68.61 -68.615 -68.62 -68.625 -68.63 -68.635 -68.64 -68.645 -68.65 -68.655 -68.66 -68.665 -68.67 -68.675 -68.68 -68.685 -68.69 -68.695 -68.7 -68.705 -68.71 -68.715 -68.72 -68.725 -68.73 -68.735 -68.74 -68.745 -68.75 -68.755 -68.76 -68.765 -68.77 -68.775 -68.78 -68.785 -68.79 -68.795 -68.8 -68.805 -68.81 -68.815 -68.82 -68.825 -68.83 -68.835 -68.84 -68.845 -68.85 -68.855 -68.86 -68.865 -68.87 -68.875 -68.88 -68.885 -68.89 -68.895 -68.9 -68.905 -68.91 -68.915 -68.92 -68.925 -68.93 -68.935 -68.94 -68.945 -68.95 -68.955 -68.96 -68.965 -68.97 -68.975 -68.98 -68.985 -68.99 -68.995 -69 -69.005 -69.01 -69.015 -69.02 -69.025 -69.03 -69.035 -69.04 -69.045 -69.05 -69.055 -69.06 -69.065 -69.07 -69.075 -69.08 -69.085 -69.09 -69.095 -69.1 -69.105 -69.11 -69.115 -69.12 -69.125 -69.13 -69.135 -69.14 -69.145 -69.15 -69.155 -69.16 -69.165 -69.17 -69.175 -69.18 -69.185 -69.19 -69.195 -69.2 -69.205 -69.21 -69.215 -69.22 -69.225 -69.23 -69.235 -69.24 -69.245 -69.25 -69.255 -69.26 -69.265 -69.27 -69.275 -69.28 -69.285 -69.29 -69.295 -69.3 -69.305 -69.31 -69.315 -69.32 -69.325 -69.33 -69.335 -69.34 -69.345 -69.35 -69.355 -69.36 -69.365 -69.37 -69.375 -69.38 -69.385 -69.39 -69.395 -69.4 -69.405 -69.41 -69.415 -69.42 -69.425 -69.43 -69.435 -69.44 -69.445 -69.45 -69.455 -69.46 -69.465 -69.47 -69.475 -69.48 -69.485 -69.49 -69.495 -69.5 -69.505 -69.51 -69.515 -69.52 -69.525 -69.53 -69.535 -69.54 -69.545 -69.55 -69.555 -69.56 -69.565 -69.57 -69.575 -69.58 -69.585 -69.59 -69.595 -69.6 -69.605 -69.61 -69.615 -69.62 -69.625 -69.63 -69.635 -69.64 -69.645 -69.65 -69.655 -69.66 -69.665 -69.67 -69.675 -69.68 -69.685 -69.69 -69.695 -69.7 -69.705 -69.71 -69.715 -69.72 -69.725 -69.73 -69.735 -69.74 -69.745 -69.75 -69.755 -69.76 -69.765 -69.77 -69.775 -69.78 -69.785 -69.79 -69.795 -69.8 -69.805 -69.81 -69.815 -69.82 -69.825 -69.83 -69.835 -69.84 -69.845 -69.85 -69.855 -69.86 -69.865 -69.87 -69.875 -69.88 -69.885 -69.89 -69.895 -69.9 -69.905 -69.91 -69.915 -69.92 -69.925 -69.93 -69.935 -69.94 -69.945 -69.95 -69.955 -69.96 -69.965 -69.97 -69.975 -69.98 -69.985 -69.99 -69.995 -70 -70.005 -70.01 -70.015 -70.02 -70.025 -70.03 -70.035 -70.04 -70.045 -70.05 -70.055 -70.06 -70.065 -70.07 -70.075 -70.08 -70.085 -70.09 -70.095 -70.1 -70.105 -70.11 -70.115 -70.12 -70.125 -70.13 -70.135 -70.14 -70.145 -70.15 -70.155 -70.16 -70.165 -70.17 -70.175 -70.18 -70.185 -70.19 -70.195 -70.2 -70.205 -70.21 -70.215 -70.22 -70.225 -70.23 -70.235 -70.24 -70.245 -70.25 -70.255 -70.26 -70.265 -70.27 -70.275 -70.28 -70.285 -70.29 -70.295 -70.3 -70.305 -70.31 -70.315 -70.32 -70.325 -70.33 -70.335 -70.34 -70.345 -70.35 -70.355 -70.36 -70.365 -70.37 -70.375 -70.38 -70.385 -70.39 -70.395 -70.4 -70.405 -70.41 -70.415 -70.42 -70.425 -70.43 -70.435 -70.44 -70.445 -70.45 -70.455 -70.46 -70.465 -70.47 -70.475 -70.48 -70.485 -70.49 -70.495 -70.5 -70.505 -70.51 -70.515 -70.52 -70.525 -70.53 -70.535 -70.54 -70.545 -70.55 -70.555 -70.56 -70.565 -70.57 -70.575 -70.58 -70.585 -70.59 -70.595 -70.6 -70.605 -70.61 -70.615 -70.62 -70.625 -70.63 -70.635 -70.64 -70.645 -70.65 -70.655 -70.66 -70.665 -70.67 -70.675 -70.68 -70.685 -70.69 -70.695 -70.7 -70.705 -70.71 -70.715 -70.72 -70.725 -70.73 -70.735 -70.74 -70.745 -70.75 -70.755 -70.76 -70.765 -70.77 -70.775 -70.78 -70.785 -70.79 -70.795 -70.8 -70.805 -70.81 -70.815 -70.82 -70.825 -70.83 -70.835 -70.84 -70.845 -70.85 -70.855 -70.86 -70.865 -70.87 -70.875 -70.88 -70.885 -70.89 -70.895 -70.9 -70.905 -70.91 -70.915 -70.92 -70.925 -70.93 -70.935 -70.94 -70.945 -70.95 -70.955 -70.96 -70.965 -70.97 -70.975 -70.98 -70.985 -70.99 -70.995 -71 -71.005 -71.01 -71.015 -71.02 -71.025 -71.03 -71.035 -71.04 -71.045 -71.05 -71.055 -71.06 -71.065 -71.07 -71.075 -71.08 -71.085 -71.09 -71.095 -71.1 -71.105 -71.11 -71.115 -71.12 -71.125 -71.13 -71.135 -71.14 -71.145 -71.15 -71.155 -71.16 -71.165 -71.17 -71.175 -71.18 -71.185 -71.19 -71.195 -71.2 -71.205 -71.21 -71.215 -71.22 -71.225 -71.23 -71.235 -71.24 -71.245 -71.25 -71.255 -71.26 -71.265 -71.27 -71.275 -71.28 -71.285 -71.29 -71.295 -71.3 -71.305 -71.31 -71.315 -71.32 -71.325 -71.33 -71.335 -71.34 -71.345 -71.35 -71.355 -71.36 -71.365 -71.37 -71.375 -71.38 -71.385 -71.39 -71.395 -71.4 -71.405 -71.41 -71.415 -71.42 -71.425 -71.43 -71.435 -71.44 -71.445 -71.45 -71.455 -71.46 -71.465 -71.47 -71.475 -71.48 -71.485 -71.49 -71.495 -71.5 -71.505 -71.51 -71.515 -71.52 -71.525 -71.53 -71.535 -71.54 -71.545 -71.55 -71.555 -71.56 -71.565 -71.57 -71.575 -71.58 -71.585 -71.59 -71.595 -71.6 -71.605 -71.61 -71.615 -71.62 -71.625 -71.63 -71.635 -71.64 -71.645 -71.65 -71.655 -71.66 -71.665 -71.67 -71.675 -71.68 -71.685 -71.69 -71.695 -71.7 -71.705 -71.71 -71.715 -71.72 -71.725 -71.73 -71.735 -71.74 -71.745 -71.75 -71.755 -71.76 -71.765 -71.77 -71.775 -71.78 -71.785 -71.79 -71.795 -71.8 -71.805 -71.81 -71.815 -71.82 -71.825 -71.83 -71.835 -71.84 -71.845 -71.85 -71.855 -71.86 -71.865 -71.87 -71.875 -71.88 -71.885 -71.89 -71.895 -71.9 -71.905 -71.91 -71.915 -71.92 -71.925 -71.93 -71.935 -71.94 -71.945 -71.95 -71.955 -71.96 -71.965 -71.97 -71.975 -71.98 -71.985 -71.99 -71.995 -72 -72.005 -72.01 -72.015 -72.02 -72.025 -72.03 -72.035 -72.04 -72.045 -72.05 -72.055 -72.06 -72.065 -72.07 -72.075 -72.08 -72.085 -72.09 -72.095 -72.1 -72.105 -72.11 -72.115 -72.12 -72.125 -72.13 -72.135 -72.14 -72.145 -72.15 -72.155 -72.16 -72.165 -72.17 -72.175 -72.18 -72.185 -72.19 -72.195 -72.2 -72.205 -72.21 -72.215 -72.22 -72.225 -72.23 -72.235 -72.24 -72.245 -72.25 -72.255 -72.26 -72.265 -72.27 -72.275 -72.28 -72.285 -72.29 -72.295 -72.3 -72.305 -72.31 -72.315 -72.32 -72.325 -72.33 -72.335 -72.34 -72.345 -72.35 -72.355 -72.36 -72.365 -72.37 -72.375 -72.38 -72.385 -72.39 -72.395 -72.4 -72.405 -72.41 -72.415 -72.42 -72.425 -72.43 -72.435 -72.44 -72.445 -72.45 -72.455 -72.46 -72.465 -72.47 -72.475 -72.48 -72.485 -72.49 -72.495 -72.5 -72.505 -72.51 -72.515 -72.52 -72.525 -72.53 -72.535 -72.54 -72.545 -72.55 -72.555 -72.56 -72.565 -72.57 -72.575 -72.58 -72.585 -72.59 -72.595 -72.6 -72.605 -72.61 -72.615 -72.62 -72.625 -72.63 -72.635 -72.64 -72.645 -72.65 -72.655 -72.66 -72.665 -72.67 -72.675 -72.68 -72.685 -72.69 -72.695 -72.7 -72.705 -72.71 -72.715 -72.72 -72.725 -72.73 -72.735 -72.74 -72.745 -72.75 -72.755 -72.76 -72.765 -72.77 -72.775 -72.78 -72.785 -72.79 -72.795 -72.8 -72.805 -72.81 -72.815 -72.82 -72.825 -72.83 -72.835 -72.84 -72.845 -72.85 -72.855 -72.86 -72.865 -72.87 -72.875 -72.88 -72.885 -72.89 -72.895 -72.9 -72.905 -72.91 -72.915 -72.92 -72.925 -72.93 -72.935 -72.94 -72.945 -72.95 -72.955 -72.96 -72.965 -72.97 -72.975 -72.98 -72.985 -72.99 -72.995 -73 -73.005 -73.01 -73.015 -73.02 -73.025 -73.03 -73.035 -73.04 -73.045 -73.05 -73.055 -73.06 -73.065 -73.07 -73.075 -73.08 -73.085 -73.09 -73.095 -73.1 -73.105 -73.11 -73.115 -73.12 -73.125 -73.13 -73.135 -73.14 -73.145 -73.15 -73.155 -73.16 -73.165 -73.17 -73.175 -73.18 -73.185 -73.19 -73.195 -73.2 -73.205 -73.21 -73.215 -73.22 -73.225 -73.23 -73.235 -73.24 -73.245 -73.25 -73.255 -73.26 -73.265 -73.27 -73.275 -73.28 -73.285 -73.29 -73.295 -73.3 -73.305 -73.31 -73.315 -73.32 -73.325 -73.33 -73.335 -73.34 -73.345 -73.35 -73.355 -73.36 -73.365 -73.37 -73.375 -73.38 -73.385 -73.39 -73.395 -73.4 -73.405 -73.41 -73.415 -73.42 -73.425 -73.43 -73.435 -73.44 -73.445 -73.45 -73.455 -73.46 -73.465 -73.47 -73.475 -73.48 -73.485 -73.49 -73.495 -73.5 -73.505 -73.51 -73.515 -73.52 -73.525 -73.53 -73.535 -73.54 -73.545 -73.55 -73.555 -73.56 -73.565 -73.57 -73.575 -73.58 -73.585 -73.59 -73.595 -73.6 -73.605 -73.61 -73.615 -73.62 -73.625 -73.63 -73.635 -73.64 -73.645 -73.65 -73.655 -73.66 -73.665 -73.67 -73.675 -73.68 -73.685 -73.69 -73.695 -73.7 -73.705 -73.71 -73.715 -73.72 -73.725 -73.73 -73.735 -73.74 -73.745 -73.75 -73.755 -73.76 -73.765 -73.77 -73.775 -73.78 -73.785 -73.79 -73.795 -73.8 -73.805 -73.81 -73.815 -73.82 -73.825 -73.83 -73.835 -73.84 -73.845 -73.85 -73.855 -73.86 -73.865 -73.87 -73.875 -73.88 -73.885 -73.89 -73.895 -73.9 -73.905 -73.91 -73.915 -73.92 -73.925 -73.93 -73.935 -73.94 -73.945 -73.95 -73.955 -73.96 -73.965 -73.97 -73.975 -73.98 -73.985 -73.99 -73.995 -74 -74.005 -74.01 -74.015 -74.02 -74.025 -74.03 -74.035 -74.04 -74.045 -74.05 -74.055 -74.06 -74.065 -74.07 -74.075 -74.08 -74.085 -74.09 -74.095 -74.1 -74.105 -74.11 -74.115 -74.12 -74.125 -74.13 -74.135 -74.14 -74.145 -74.15 -74.155 -74.16 -74.165 -74.17 -74.175 -74.18 -74.185 -74.19 -74.195 -74.2 -74.205 -74.21 -74.215 -74.22 -74.225 -74.23 -74.235 -74.24 -74.245 -74.25 -74.255 -74.26 -74.265 -74.27 -74.275 -74.28 -74.285 -74.29 -74.295 -74.3 -74.305 -74.31 -74.315 -74.32 -74.325 -74.33 -74.335 -74.34 -74.345 -74.35 -74.355 -74.36 -74.365 -74.37 -74.375 -74.38 -74.385 -74.39 -74.395 -74.4 -74.405 -74.41 -74.415 -74.42 -74.425 -74.43 -74.435 -74.44 -74.445 -74.45 -74.455 -74.46 -74.465 -74.47 -74.475 -74.48 -74.485 -74.49 -74.495 -74.5 -74.505 -74.51 -74.515 -74.52 -74.525 -74.53 -74.535 -74.54 -74.545 -74.55 -74.555 -74.56 -74.565 -74.57 -74.575 -74.58 -74.585 -74.59 -74.595 -74.6 -74.605 -74.61 -74.615 -74.62 -74.625 -74.63 -74.635 -74.64 -74.645 -74.65 -74.655 -74.66 -74.665 -74.67 -74.675 -74.68 -74.685 -74.69 -74.695 -74.7 -74.705 -74.71 -74.715 -74.72 -74.725 -74.73 -74.735 -74.74 -74.745 -74.75 -74.755 -74.76 -74.765 -74.77 -74.775 -74.78 -74.785 -74.79 -74.795 -74.8 -74.805 -74.81 -74.815 -74.82 -74.825 -74.83 -74.835 -74.84 -74.845 -74.85 -74.855 -74.86 -74.865 -74.87 -74.875 -74.88 -74.885 -74.89 -74.895 -74.9 -74.905 -74.91 -74.915 -74.92 -74.925 -74.93 -74.935 -74.94 -74.945 -74.95 -74.955 -74.96 -74.965 -74.97 -74.975 -74.98 -74.985 -74.99 -74.995 -75 -75.005 -75.01 -75.015 -75.02 -75.025 -75.03 -75.035 -75.04 -75.045 -75.05 -75.055 -75.06 -75.065 -75.07 -75.075 -75.08 -75.085 -75.09 -75.095 -75.1 -75.105 -75.11 -75.115 -75.12 -75.125 -75.13 -75.135 -75.14 -75.145 -75.15 -75.155 -75.16 -75.165 -75.17 -75.175 -75.18 -75.185 -75.19 -75.195 -75.2 -75.205 -75.21 -75.215 -75.22 -75.225 -75.23 -75.235 -75.24 -75.245 -75.25 -75.255 -75.26 -75.265 -75.27 -75.275 -75.28 -75.285 -75.29 -75.295 -75.3 -75.305 -75.31 -75.315 -75.32 -75.325 -75.33 -75.335 -75.34 -75.345 -75.35 -75.355 -75.36 -75.365 -75.37 -75.375 -75.38 -75.385 -75.39 -75.395 -75.4 -75.405 -75.41 -75.415 -75.42 -75.425 -75.43 -75.435 -75.44 -75.445 -75.45 -75.455 -75.46 -75.465 -75.47 -75.475 -75.48 -75.485 -75.49 -75.495 -75.5 -75.505 -75.51 -75.515 -75.52 -75.525 -75.53 -75.535 -75.54 -75.545 -75.55 -75.555 -75.56 -75.565 -75.57 -75.575 -75.58 -75.585 -75.59 -75.595 -75.6 -75.605 -75.61 -75.615 -75.62 -75.625 -75.63 -75.635 -75.64 -75.645 -75.65 -75.655 -75.66 -75.665 -75.67 -75.675 -75.68 -75.685 -75.69 -75.695 -75.7 -75.705 -75.71 -75.715 -75.72 -75.725 -75.73 -75.735 -75.74 -75.745 -75.75 -75.755 -75.76 -75.765 -75.77 -75.775 -75.78 -75.785 -75.79 -75.795 -75.8 -75.805 -75.81 -75.815 -75.82 -75.825 -75.83 -75.835 -75.84 -75.845 -75.85 -75.855 -75.86 -75.865 -75.87 -75.875 -75.88 -75.885 -75.89 -75.895 -75.9 -75.905 -75.91 -75.915 -75.92 -75.925 -75.93 -75.935 -75.94 -75.945 -75.95 -75.955 -75.96 -75.965 -75.97 -75.975 -75.98 -75.985 -75.99 -75.995 -76 -76.005 -76.01 -76.015 -76.02 -76.025 -76.03 -76.035 -76.04 -76.045 -76.05 -76.055 -76.06 -76.065 -76.07 -76.075 -76.08 -76.085 -76.09 -76.095 -76.1 -76.105 -76.11 -76.115 -76.12 -76.125 -76.13 -76.135 -76.14 -76.145 -76.15 -76.155 -76.16 -76.165 -76.17 -76.175 -76.18 -76.185 -76.19 -76.195 -76.2 -76.205 -76.21 -76.215 -76.22 -76.225 -76.23 -76.235 -76.24 -76.245 -76.25 -76.255 -76.26 -76.265 -76.27 -76.275 -76.28 -76.285 -76.29 -76.295 -76.3 -76.305 -76.31 -76.315 -76.32 -76.325 -76.33 -76.335 -76.34 -76.345 -76.35 -76.355 -76.36 -76.365 -76.37 -76.375 -76.38 -76.385 -76.39 -76.395 -76.4 -76.405 -76.41 -76.415 -76.42 -76.425 -76.43 -76.435 -76.44 -76.445 -76.45 -76.455 -76.46 -76.465 -76.47 -76.475 -76.48 -76.485 -76.49 -76.495 -76.5 -76.505 -76.51 -76.515 -76.52 -76.525 -76.53 -76.535 -76.54 -76.545 -76.55 -76.555 -76.56 -76.565 -76.57 -76.575 -76.58 -76.585 -76.59 -76.595 -76.6 -76.605 -76.61 -76.615 -76.62 -76.625 -76.63 -76.635 -76.64 -76.645 -76.65 -76.655 -76.66 -76.665 -76.67 -76.675 -76.68 -76.685 -76.69 -76.695 -76.7 -76.705 -76.71 -76.715 -76.72 -76.725 -76.73 -76.735 -76.74 -76.745 -76.75 -76.755 -76.76 -76.765 -76.77 -76.775 -76.78 -76.785 -76.79 -76.795 -76.8 -76.805 -76.81 -76.815 -76.82 -76.825 -76.83 -76.835 -76.84 -76.845 -76.85 -76.855 -76.86 -76.865 -76.87 -76.875 -76.88 -76.885 -76.89 -76.895 -76.9 -76.905 -76.91 -76.915 -76.92 -76.925 -76.93 -76.935 -76.94 -76.945 -76.95 -76.955 -76.96 -76.965 -76.97 -76.975 -76.98 -76.985 -76.99 -76.995 -77 -77.005 -77.01 -77.015 -77.02 -77.025 -77.03 -77.035 -77.04 -77.045 -77.05 -77.055 -77.06 -77.065 -77.07 -77.075 -77.08 -77.085 -77.09 -77.095 -77.1 -77.105 -77.11 -77.115 -77.12 -77.125 -77.13 -77.135 -77.14 -77.145 -77.15 -77.155 -77.16 -77.165 -77.17 -77.175 -77.18 -77.185 -77.19 -77.195 -77.2 -77.205 -77.21 -77.215 -77.22 -77.225 -77.23 -77.235 -77.24 -77.245 -77.25 -77.255 -77.26 -77.265 -77.27 -77.275 -77.28 -77.285 -77.29 -77.295 -77.3 -77.305 -77.31 -77.315 -77.32 -77.325 -77.33 -77.335 -77.34 -77.345 -77.35 -77.355 -77.36 -77.365 -77.37 -77.375 -77.38 -77.385 -77.39 -77.395 -77.4 -77.405 -77.41 -77.415 -77.42 -77.425 -77.43 -77.435 -77.44 -77.445 -77.45 -77.455 -77.46 -77.465 -77.47 -77.475 -77.48 -77.485 -77.49 -77.495 -77.5 -77.505 -77.51 -77.515 -77.52 -77.525 -77.53 -77.535 -77.54 -77.545 -77.55 -77.555 -77.56 -77.565 -77.57 -77.575 -77.58 -77.585 -77.59 -77.595 -77.6 -77.605 -77.61 -77.615 -77.62 -77.625 -77.63 -77.635 -77.64 -77.645 -77.65 -77.655 -77.66 -77.665 -77.67 -77.675 -77.68 -77.685 -77.69 -77.695 -77.7 -77.705 -77.71 -77.715 -77.72 -77.725 -77.73 -77.735 -77.74 -77.745 -77.75 -77.755 -77.76 -77.765 -77.77 -77.775 -77.78 -77.785 -77.79 -77.795 -77.8 -77.805 -77.81 -77.815 -77.82 -77.825 -77.83 -77.835 -77.84 -77.845 -77.85 -77.855 -77.86 -77.865 -77.87 -77.875 -77.88 -77.885 -77.89 -77.895 -77.9 -77.905 -77.91 -77.915 -77.92 -77.925 -77.93 -77.935 -77.94 -77.945 -77.95 -77.955 -77.96 -77.965 -77.97 -77.975 -77.98 -77.985 -77.99 -77.995 -78 -78.005 -78.01 -78.015 -78.02 -78.025 -78.03 -78.035 -78.04 -78.045 -78.05 -78.055 -78.06 -78.065 -78.07 -78.075 -78.08 -78.085 -78.09 -78.095 -78.1 -78.105 -78.11 -78.115 -78.12 -78.125 -78.13 -78.135 -78.14 -78.145 -78.15 -78.155 -78.16 -78.165 -78.17 -78.175 -78.18 -78.185 -78.19 -78.195 -78.2 -78.205 -78.21 -78.215 -78.22 -78.225 -78.23 -78.235 -78.24 -78.245 -78.25 -78.255 -78.26 -78.265 -78.27 -78.275 -78.28 -78.285 -78.29 -78.295 -78.3 -78.305 -78.31 -78.315 -78.32 -78.325 -78.33 -78.335 -78.34 -78.345 -78.35 -78.355 -78.36 -78.365 -78.37 -78.375 -78.38 -78.385 -78.39 -78.395 -78.4 -78.405 -78.41 -78.415 -78.42 -78.425 -78.43 -78.435 -78.44 -78.445 -78.45 -78.455 -78.46 -78.465 -78.47 -78.475 -78.48 -78.485 -78.49 -78.495 -78.5 -78.505 -78.51 -78.515 -78.52 -78.525 -78.53 -78.535 -78.54 -78.545 -78.55 -78.555 -78.56 -78.565 -78.57 -78.575 -78.58 -78.585 -78.59 -78.595 -78.6 -78.605 -78.61 -78.615 -78.62 -78.625 -78.63 -78.635 -78.64 -78.645 -78.65 -78.655 -78.66 -78.665 -78.67 -78.675 -78.68 -78.685 -78.69 -78.695 -78.7 -78.705 -78.71 -78.715 -78.72 -78.725 -78.73 -78.735 -78.74 -78.745 -78.75 -78.755 -78.76 -78.765 -78.77 -78.775 -78.78 -78.785 -78.79 -78.795 -78.8 -78.805 -78.81 -78.815 -78.82 -78.825 -78.83 -78.835 -78.84 -78.845 -78.85 -78.855 -78.86 -78.865 -78.87 -78.875 -78.88 -78.885 -78.89 -78.895 -78.9 -78.905 -78.91 -78.915 -78.92 -78.925 -78.93 -78.935 -78.94 -78.945 -78.95 -78.955 -78.96 -78.965 -78.97 -78.975 -78.98 -78.985 -78.99 -78.995 -79 -79.005 -79.01 -79.015 -79.02 -79.025 -79.03 -79.035 -79.04 -79.045 -79.05 -79.055 -79.06 -79.065 -79.07 -79.075 -79.08 -79.085 -79.09 -79.095 -79.1 -79.105 -79.11 -79.115 -79.12 -79.125 -79.13 -79.135 -79.14 -79.145 -79.15 -79.155 -79.16 -79.165 -79.17 -79.175 -79.18 -79.185 -79.19 -79.195 -79.2 -79.205 -79.21 -79.215 -79.22 -79.225 -79.23 -79.235 -79.24 -79.245 -79.25 -79.255 -79.26 -79.265 -79.27 -79.275 -79.28 -79.285 -79.29 -79.295 -79.3 -79.305 -79.31 -79.315 -79.32 -79.325 -79.33 -79.335 -79.34 -79.345 -79.35 -79.355 -79.36 -79.365 -79.37 -79.375 -79.38 -79.385 -79.39 -79.395 -79.4 -79.405 -79.41 -79.415 -79.42 -79.425 -79.43 -79.435 -79.44 -79.445 -79.45 -79.455 -79.46 -79.465 -79.47 -79.475 -79.48 -79.485 -79.49 -79.495 -79.5 -79.505 -79.51 -79.515 -79.52 -79.525 -79.53 -79.535 -79.54 -79.545 -79.55 -79.555 -79.56 -79.565 -79.57 -79.575 -79.58 -79.585 -79.59 -79.595 -79.6 -79.605 -79.61 -79.615 -79.62 -79.625 -79.63 -79.635 -79.64 -79.645 -79.65 -79.655 -79.66 -79.665 -79.67 -79.675 -79.68 -79.685 -79.69 -79.695 -79.7 -79.705 -79.71 -79.715 -79.72 -79.725 -79.73 -79.735 -79.74 -79.745 -79.75 -79.755 -79.76 -79.765 -79.77 -79.775 -79.78 -79.785 -79.79 -79.795 -79.8 -79.805 -79.81 -79.815 -79.82 -79.825 -79.83 -79.835 -79.84 -79.845 -79.85 -79.855 -79.86 -79.865 -79.87 -79.875 -79.88 -79.885 -79.89 -79.895 -79.9 -79.905 -79.91 -79.915 -79.92 -79.925 -79.93 -79.935 -79.94 -79.945 -79.95 -79.955 -79.96 -79.965 -79.97 -79.975 -79.98 -79.985 -79.99 -79.995 -80 -80.005 -80.01 -80.015 -80.02 -80.025 -80.03 -80.035 -80.04 -80.045 -80.05 -80.055 -80.06 -80.065 -80.07 -80.075 -80.08 -80.085 -80.09 -80.095 -80.1 -80.105 -80.11 -80.115 -80.12 -80.125 -80.13 -80.135 -80.14 -80.145 -80.15 -80.155 -80.16 -80.165 -80.17 -80.175 -80.18 -80.185 -80.19 -80.195 -80.2 -80.205 -80.21 -80.215 -80.22 -80.225 -80.23 -80.235 -80.24 -80.245 -80.25 -80.255 -80.26 -80.265 -80.27 -80.275 -80.28 -80.285 -80.29 -80.295 -80.3 -80.305 -80.31 -80.315 -80.32 -80.325 -80.33 -80.335 -80.34 -80.345 -80.35 -80.355 -80.36 -80.365 -80.37 -80.375 -80.38 -80.385 -80.39 -80.395 -80.4 -80.405 -80.41 -80.415 -80.42 -80.425 -80.43 -80.435 -80.44 -80.445 -80.45 -80.455 -80.46 -80.465 -80.47 -80.475 -80.48 -80.485 -80.49 -80.495 -80.5 -80.505 -80.51 -80.515 -80.52 -80.525 -80.53 -80.535 -80.54 -80.545 -80.55 -80.555 -80.56 -80.565 -80.57 -80.575 -80.58 -80.585 -80.59 -80.595 -80.6 -80.605 -80.61 -80.615 -80.62 -80.625 -80.63 -80.635 -80.64 -80.645 -80.65 -80.655 -80.66 -80.665 -80.67 -80.675 -80.68 -80.685 -80.69 -80.695 -80.7 -80.705 -80.71 -80.715 -80.72 -80.725 -80.73 -80.735 -80.74 -80.745 -80.75 -80.755 -80.76 -80.765 -80.77 -80.775 -80.78 -80.785 -80.79 -80.795 -80.8 -80.805 -80.81 -80.815 -80.82 -80.825 -80.83 -80.835 -80.84 -80.845 -80.85 -80.855 -80.86 -80.865 -80.87 -80.875 -80.88 -80.885 -80.89 -80.895 -80.9 -80.905 -80.91 -80.915 -80.92 -80.925 -80.93 -80.935 -80.94 -80.945 -80.95 -80.955 -80.96 -80.965 -80.97 -80.975 -80.98 -80.985 -80.99 -80.995 -81 -81.005 -81.01 -81.015 -81.02 -81.025 -81.03 -81.035 -81.04 -81.045 -81.05 -81.055 -81.06 -81.065 -81.07 -81.075 -81.08 -81.085 -81.09 -81.095 -81.1 -81.105 -81.11 -81.115 -81.12 -81.125 -81.13 -81.135 -81.14 -81.145 -81.15 -81.155 -81.16 -81.165 -81.17 -81.175 -81.18 -81.185 -81.19 -81.195 -81.2 -81.205 -81.21 -81.215 -81.22 -81.225 -81.23 -81.235 -81.24 -81.245 -81.25 -81.255 -81.26 -81.265 -81.27 -81.275 -81.28 -81.285 -81.29 -81.295 -81.3 -81.305 -81.31 -81.315 -81.32 -81.325 -81.33 -81.335 -81.34 -81.345 -81.35 -81.355 -81.36 -81.365 -81.37 -81.375 -81.38 -81.385 -81.39 -81.395 -81.4 -81.405 -81.41 -81.415 -81.42 -81.425 -81.43 -81.435 -81.44 -81.445 -81.45 -81.455 -81.46 -81.465 -81.47 -81.475 -81.48 -81.485 -81.49 -81.495 -81.5 -81.505 -81.51 -81.515 -81.52 -81.525 -81.53 -81.535 -81.54 -81.545 -81.55 -81.555 -81.56 -81.565 -81.57 -81.575 -81.58 -81.585 -81.59 -81.595 -81.6 -81.605 -81.61 -81.615 -81.62 -81.625 -81.63 -81.635 -81.64 -81.645 -81.65 -81.655 -81.66 -81.665 -81.67 -81.675 -81.68 -81.685 -81.69 -81.695 -81.7 -81.705 -81.71 -81.715 -81.72 -81.725 -81.73 -81.735 -81.74 -81.745 -81.75 -81.755 -81.76 -81.765 -81.77 -81.775 -81.78 -81.785 -81.79 -81.795 -81.8 -81.805 -81.81 -81.815 -81.82 -81.825 -81.83 -81.835 -81.84 -81.845 -81.85 -81.855 -81.86 -81.865 -81.87 -81.875 -81.88 -81.885 -81.89 -81.895 -81.9 -81.905 -81.91 -81.915 -81.92 -81.925 -81.93 -81.935 -81.94 -81.945 -81.95 -81.955 -81.96 -81.965 -81.97 -81.975 -81.98 -81.985 -81.99 -81.995 -82 -82.005 -82.01 -82.015 -82.02 -82.025 -82.03 -82.035 -82.04 -82.045 -82.05 -82.055 -82.06 -82.065 -82.07 -82.075 -82.08 -82.085 -82.09 -82.095 -82.1 -82.105 -82.11 -82.115 -82.12 -82.125 -82.13 -82.135 -82.14 -82.145 -82.15 -82.155 -82.16 -82.165 -82.17 -82.175 -82.18 -82.185 -82.19 -82.195 -82.2 -82.205 -82.21 -82.215 -82.22 -82.225 -82.23 -82.235 -82.24 -82.245 -82.25 -82.255 -82.26 -82.265 -82.27 -82.275 -82.28 -82.285 -82.29 -82.295 -82.3 -82.305 -82.31 -82.315 -82.32 -82.325 -82.33 -82.335 -82.34 -82.345 -82.35 -82.355 -82.36 -82.365 -82.37 -82.375 -82.38 -82.385 -82.39 -82.395 -82.4 -82.405 -82.41 -82.415 -82.42 -82.425 -82.43 -82.435 -82.44 -82.445 -82.45 -82.455 -82.46 -82.465 -82.47 -82.475 -82.48 -82.485 -82.49 -82.495 -82.5 -82.505 -82.51 -82.515 -82.52 -82.525 -82.53 -82.535 -82.54 -82.545 -82.55 -82.555 -82.56 -82.565 -82.57 -82.575 -82.58 -82.585 -82.59 -82.595 -82.6 -82.605 -82.61 -82.615 -82.62 -82.625 -82.63 -82.635 -82.64 -82.645 -82.65 -82.655 -82.66 -82.665 -82.67 -82.675 -82.68 -82.685 -82.69 -82.695 -82.7 -82.705 -82.71 -82.715 -82.72 -82.725 -82.73 -82.735 -82.74 -82.745 -82.75 -82.755 -82.76 -82.765 -82.77 -82.775 -82.78 -82.785 -82.79 -82.795 -82.8 -82.805 -82.81 -82.815 -82.82 -82.825 -82.83 -82.835 -82.84 -82.845 -82.85 -82.855 -82.86 -82.865 -82.87 -82.875 -82.88 -82.885 -82.89 -82.895 -82.9 -82.905 -82.91 -82.915 -82.92 -82.925 -82.93 -82.935 -82.94 -82.945 -82.95 -82.955 -82.96 -82.965 -82.97 -82.975 -82.98 -82.985 -82.99 -82.995 -83 -83.005 -83.01 -83.015 -83.02 -83.025 -83.03 -83.035 -83.04 -83.045 -83.05 -83.055 -83.06 -83.065 -83.07 -83.075 -83.08 -83.085 -83.09 -83.095 -83.1 -83.105 -83.11 -83.115 -83.12 -83.125 -83.13 -83.135 -83.14 -83.145 -83.15 -83.155 -83.16 -83.165 -83.17 -83.175 -83.18 -83.185 -83.19 -83.195 -83.2 -83.205 -83.21 -83.215 -83.22 -83.225 -83.23 -83.235 -83.24 -83.245 -83.25 -83.255 -83.26 -83.265 -83.27 -83.275 -83.28 -83.285 -83.29 -83.295 -83.3 -83.305 -83.31 -83.315 -83.32 -83.325 -83.33 -83.335 -83.34 -83.345 -83.35 -83.355 -83.36 -83.365 -83.37 -83.375 -83.38 -83.385 -83.39 -83.395 -83.4 -83.405 -83.41 -83.415 -83.42 -83.425 -83.43 -83.435 -83.44 -83.445 -83.45 -83.455 -83.46 -83.465 -83.47 -83.475 -83.48 -83.485 -83.49 -83.495 -83.5 -83.505 -83.51 -83.515 -83.52 -83.525 -83.53 -83.535 -83.54 -83.545 -83.55 -83.555 -83.56 -83.565 -83.57 -83.575 -83.58 -83.585 -83.59 -83.595 -83.6 -83.605 -83.61 -83.615 -83.62 -83.625 -83.63 -83.635 -83.64 -83.645 -83.65 -83.655 -83.66 -83.665 -83.67 -83.675 -83.68 -83.685 -83.69 -83.695 -83.7 -83.705 -83.71 -83.715 -83.72 -83.725 -83.73 -83.735 -83.74 -83.745 -83.75 -83.755 -83.76 -83.765 -83.77 -83.775 -83.78 -83.785 -83.79 -83.795 -83.8 -83.805 -83.81 -83.815 -83.82 -83.825 -83.83 -83.835 -83.84 -83.845 -83.85 -83.855 -83.86 -83.865 -83.87 -83.875 -83.88 -83.885 -83.89 -83.895 -83.9 -83.905 -83.91 -83.915 -83.92 -83.925 -83.93 -83.935 -83.94 -83.945 -83.95 -83.955 -83.96 -83.965 -83.97 -83.975 -83.98 -83.985 -83.99 -83.995 -84 -84.005 -84.01 -84.015 -84.02 -84.025 -84.03 -84.035 -84.04 -84.045 -84.05 -84.055 -84.06 -84.065 -84.07 -84.075 -84.08 -84.085 -84.09 -84.095 -84.1 -84.105 -84.11 -84.115 -84.12 -84.125 -84.13 -84.135 -84.14 -84.145 -84.15 -84.155 -84.16 -84.165 -84.17 -84.175 -84.18 -84.185 -84.19 -84.195 -84.2 -84.205 -84.21 -84.215 -84.22 -84.225 -84.23 -84.235 -84.24 -84.245 -84.25 -84.255 -84.26 -84.265 -84.27 -84.275 -84.28 -84.285 -84.29 -84.295 -84.3 -84.305 -84.31 -84.315 -84.32 -84.325 -84.33 -84.335 -84.34 -84.345 -84.35 -84.355 -84.36 -84.365 -84.37 -84.375 -84.38 -84.385 -84.39 -84.395 -84.4 -84.405 -84.41 -84.415 -84.42 -84.425 -84.43 -84.435 -84.44 -84.445 -84.45 -84.455 -84.46 -84.465 -84.47 -84.475 -84.48 -84.485 -84.49 -84.495 -84.5 -84.505 -84.51 -84.515 -84.52 -84.525 -84.53 -84.535 -84.54 -84.545 -84.55 -84.555 -84.56 -84.565 -84.57 -84.575 -84.58 -84.585 -84.59 -84.595 -84.6 -84.605 -84.61 -84.615 -84.62 -84.625 -84.63 -84.635 -84.64 -84.645 -84.65 -84.655 -84.66 -84.665 -84.67 -84.675 -84.68 -84.685 -84.69 -84.695 -84.7 -84.705 -84.71 -84.715 -84.72 -84.725 -84.73 -84.735 -84.74 -84.745 -84.75 -84.755 -84.76 -84.765 -84.77 -84.775 -84.78 -84.785 -84.79 -84.795 -84.8 -84.805 -84.81 -84.815 -84.82 -84.825 -84.83 -84.835 -84.84 -84.845 -84.85 -84.855 -84.86 -84.865 -84.87 -84.875 -84.88 -84.885 -84.89 -84.895 -84.9 -84.905 -84.91 -84.915 -84.92 -84.925 -84.93 -84.935 -84.94 -84.945 -84.95 -84.955 -84.96 -84.965 -84.97 -84.975 -84.98 -84.985 -84.99 -84.995 -85 -85.005 -85.01 -85.015 -85.02 -85.025 -85.03 -85.035 -85.04 -85.045 -85.05 -85.055 -85.06 -85.065 -85.07 -85.075 -85.08 -85.085 -85.09 -85.095 -85.1 -85.105 -85.11 -85.115 -85.12 -85.125 -85.13 -85.135 -85.14 -85.145 -85.15 -85.155 -85.16 -85.165 -85.17 -85.175 -85.18 -85.185 -85.19 -85.195 -85.2 -85.205 -85.21 -85.215 -85.22 -85.225 -85.23 -85.235 -85.24 -85.245 -85.25 -85.255 -85.26 -85.265 -85.27 -85.275 -85.28 -85.285 -85.29 -85.295 -85.3 -85.305 -85.31 -85.315 -85.32 -85.325 -85.33 -85.335 -85.34 -85.345 -85.35 -85.355 -85.36 -85.365 -85.37 -85.375 -85.38 -85.385 -85.39 -85.395 -85.4 -85.405 -85.41 -85.415 -85.42 -85.425 -85.43 -85.435 -85.44 -85.445 -85.45 -85.455 -85.46 -85.465 -85.47 -85.475 -85.48 -85.485 -85.49 -85.495 -85.5 -85.505 -85.51 -85.515 -85.52 -85.525 -85.53 -85.535 -85.54 -85.545 -85.55 -85.555 -85.56 -85.565 -85.57 -85.575 -85.58 -85.585 -85.59 -85.595 -85.6 -85.605 -85.61 -85.615 -85.62 -85.625 -85.63 -85.635 -85.64 -85.645 -85.65 -85.655 -85.66 -85.665 -85.67 -85.675 -85.68 -85.685 -85.69 -85.695 -85.7 -85.705 -85.71 -85.715 -85.72 -85.725 -85.73 -85.735 -85.74 -85.745 -85.75 -85.755 -85.76 -85.765 -85.77 -85.775 -85.78 -85.785 -85.79 -85.795 -85.8 -85.805 -85.81 -85.815 -85.82 -85.825 -85.83 -85.835 -85.84 -85.845 -85.85 -85.855 -85.86 -85.865 -85.87 -85.875 -85.88 -85.885 -85.89 -85.895 -85.9 -85.905 -85.91 -85.915 -85.92 -85.925 -85.93 -85.935 -85.94 -85.945 -85.95 -85.955 -85.96 -85.965 -85.97 -85.975 -85.98 -85.985 -85.99 -85.995 -86 -86.005 -86.01 -86.015 -86.02 -86.025 -86.03 -86.035 -86.04 -86.045 -86.05 -86.055 -86.06 -86.065 -86.07 -86.075 -86.08 -86.085 -86.09 -86.095 -86.1 -86.105 -86.11 -86.115 -86.12 -86.125 -86.13 -86.135 -86.14 -86.145 -86.15 -86.155 -86.16 -86.165 -86.17 -86.175 -86.18 -86.185 -86.19 -86.195 -86.2 -86.205 -86.21 -86.215 -86.22 -86.225 -86.23 -86.235 -86.24 -86.245 -86.25 -86.255 -86.26 -86.265 -86.27 -86.275 -86.28 -86.285 -86.29 -86.295 -86.3 -86.305 -86.31 -86.315 -86.32 -86.325 -86.33 -86.335 -86.34 -86.345 -86.35 -86.355 -86.36 -86.365 -86.37 -86.375 -86.38 -86.385 -86.39 -86.395 -86.4 -86.405 -86.41 -86.415 -86.42 -86.425 -86.43 -86.435 -86.44 -86.445 -86.45 -86.455 -86.46 -86.465 -86.47 -86.475 -86.48 -86.485 -86.49 -86.495 -86.5 -86.505 -86.51 -86.515 -86.52 -86.525 -86.53 -86.535 -86.54 -86.545 -86.55 -86.555 -86.56 -86.565 -86.57 -86.575 -86.58 -86.585 -86.59 -86.595 -86.6 -86.605 -86.61 -86.615 -86.62 -86.625 -86.63 -86.635 -86.64 -86.645 -86.65 -86.655 -86.66 -86.665 -86.67 -86.675 -86.68 -86.685 -86.69 -86.695 -86.7 -86.705 -86.71 -86.715 -86.72 -86.725 -86.73 -86.735 -86.74 -86.745 -86.75 -86.755 -86.76 -86.765 -86.77 -86.775 -86.78 -86.785 -86.79 -86.795 -86.8 -86.805 -86.81 -86.815 -86.82 -86.825 -86.83 -86.835 -86.84 -86.845 -86.85 -86.855 -86.86 -86.865 -86.87 -86.875 -86.88 -86.885 -86.89 -86.895 -86.9 -86.905 -86.91 -86.915 -86.92 -86.925 -86.93 -86.935 -86.94 -86.945 -86.95 -86.955 -86.96 -86.965 -86.97 -86.975 -86.98 -86.985 -86.99 -86.995 -87 -87.005 -87.01 -87.015 -87.02 -87.025 -87.03 -87.035 -87.04 -87.045 -87.05 -87.055 -87.06 -87.065 -87.07 -87.075 -87.08 -87.085 -87.09 -87.095 -87.1 -87.105 -87.11 -87.115 -87.12 -87.125 -87.13 -87.135 -87.14 -87.145 -87.15 -87.155 -87.16 -87.165 -87.17 -87.175 -87.18 -87.185 -87.19 -87.195 -87.2 -87.205 -87.21 -87.215 -87.22 -87.225 -87.23 -87.235 -87.24 -87.245 -87.25 -87.255 -87.26 -87.265 -87.27 -87.275 -87.28 -87.285 -87.29 -87.295 -87.3 -87.305 -87.31 -87.315 -87.32 -87.325 -87.33 -87.335 -87.34 -87.345 -87.35 -87.355 -87.36 -87.365 -87.37 -87.375 -87.38 -87.385 -87.39 -87.395 -87.4 -87.405 -87.41 -87.415 -87.42 -87.425 -87.43 -87.435 -87.44 -87.445 -87.45 -87.455 -87.46 -87.465 -87.47 -87.475 -87.48 -87.485 -87.49 -87.495 -87.5 -87.505 -87.51 -87.515 -87.52 -87.525 -87.53 -87.535 -87.54 -87.545 -87.55 -87.555 -87.56 -87.565 -87.57 -87.575 -87.58 -87.585 -87.59 -87.595 -87.6 -87.605 -87.61 -87.615 -87.62 -87.625 -87.63 -87.635 -87.64 -87.645 -87.65 -87.655 -87.66 -87.665 -87.67 -87.675 -87.68 -87.685 -87.69 -87.695 -87.7 -87.705 -87.71 -87.715 -87.72 -87.725 -87.73 -87.735 -87.74 -87.745 -87.75 -87.755 -87.76 -87.765 -87.77 -87.775 -87.78 -87.785 -87.79 -87.795 -87.8 -87.805 -87.81 -87.815 -87.82 -87.825 -87.83 -87.835 -87.84 -87.845 -87.85 -87.855 -87.86 -87.865 -87.87 -87.875 -87.88 -87.885 -87.89 -87.895 -87.9 -87.905 -87.91 -87.915 -87.92 -87.925 -87.93 -87.935 -87.94 -87.945 -87.95 -87.955 -87.96 -87.965 -87.97 -87.975 -87.98 -87.985 -87.99 -87.995 -88 -88.005 -88.01 -88.015 -88.02 -88.025 -88.03 -88.035 -88.04 -88.045 -88.05 -88.055 -88.06 -88.065 -88.07 -88.075 -88.08 -88.085 -88.09 -88.095 -88.1 -88.105 -88.11 -88.115 -88.12 -88.125 -88.13 -88.135 -88.14 -88.145 -88.15 -88.155 -88.16 -88.165 -88.17 -88.175 -88.18 -88.185 -88.19 -88.195 -88.2 -88.205 -88.21 -88.215 -88.22 -88.225 -88.23 -88.235 -88.24 -88.245 -88.25 -88.255 -88.26 -88.265 -88.27 -88.275 -88.28 -88.285 -88.29 -88.295 -88.3 -88.305 -88.31 -88.315 -88.32 -88.325 -88.33 -88.335 -88.34 -88.345 -88.35 -88.355 -88.36 -88.365 -88.37 -88.375 -88.38 -88.385 -88.39 -88.395 -88.4 -88.405 -88.41 -88.415 -88.42 -88.425 -88.43 -88.435 -88.44 -88.445 -88.45 -88.455 -88.46 -88.465 -88.47 -88.475 -88.48 -88.485 -88.49 -88.495 -88.5 -88.505 -88.51 -88.515 -88.52 -88.525 -88.53 -88.535 -88.54 -88.545 -88.55 -88.555 -88.56 -88.565 -88.57 -88.575 -88.58 -88.585 -88.59 -88.595 -88.6 -88.605 -88.61 -88.615 -88.62 -88.625 -88.63 -88.635 -88.64 -88.645 -88.65 -88.655 -88.66 -88.665 -88.67 -88.675 -88.68 -88.685 -88.69 -88.695 -88.7 -88.705 -88.71 -88.715 -88.72 -88.725 -88.73 -88.735 -88.74 -88.745 -88.75 -88.755 -88.76 -88.765 -88.77 -88.775 -88.78 -88.785 -88.79 -88.795 -88.8 -88.805 -88.81 -88.815 -88.82 -88.825 -88.83 -88.835 -88.84 -88.845 -88.85 -88.855 -88.86 -88.865 -88.87 -88.875 -88.88 -88.885 -88.89 -88.895 -88.9 -88.905 -88.91 -88.915 -88.92 -88.925 -88.93 -88.935 -88.94 -88.945 -88.95 -88.955 -88.96 -88.965 -88.97 -88.975 -88.98 -88.985 -88.99 -88.995 -89 -89.005 -89.01 -89.015 -89.02 -89.025 -89.03 -89.035 -89.04 -89.045 -89.05 -89.055 -89.06 -89.065 -89.07 -89.075 -89.08 -89.085 -89.09 -89.095 -89.1 -89.105 -89.11 -89.115 -89.12 -89.125 -89.13 -89.135 -89.14 -89.145 -89.15 -89.155 -89.16 -89.165 -89.17 -89.175 -89.18 -89.185 -89.19 -89.195 -89.2 -89.205 -89.21 -89.215 -89.22 -89.225 -89.23 -89.235 -89.24 -89.245 -89.25 -89.255 -89.26 -89.265 -89.27 -89.275 -89.28 -89.285 -89.29 -89.295 -89.3 -89.305 -89.31 -89.315 -89.32 -89.325 -89.33 -89.335 -89.34 -89.345 -89.35 -89.355 -89.36 -89.365 -89.37 -89.375 -89.38 -89.385 -89.39 -89.395 -89.4 -89.405 -89.41 -89.415 -89.42 -89.425 -89.43 -89.435 -89.44 -89.445 -89.45 -89.455 -89.46 -89.465 -89.47 -89.475 -89.48 -89.485 -89.49 -89.495 -89.5 -89.505 -89.51 -89.515 -89.52 -89.525 -89.53 -89.535 -89.54 -89.545 -89.55 -89.555 -89.56 -89.565 -89.57 -89.575 -89.58 -89.585 -89.59 -89.595 -89.6 -89.605 -89.61 -89.615 -89.62 -89.625 -89.63 -89.635 -89.64 -89.645 -89.65 -89.655 -89.66 -89.665 -89.67 -89.675 -89.68 -89.685 -89.69 -89.695 -89.7 -89.705 -89.71 -89.715 -89.72 -89.725 -89.73 -89.735 -89.74 -89.745 -89.75 -89.755 -89.76 -89.765 -89.77 -89.775 -89.78 -89.785 -89.79 -89.795 -89.8 -89.805 -89.81 -89.815 -89.82 -89.825 -89.83 -89.835 -89.84 -89.845 -89.85 -89.855 -89.86 -89.865 -89.87 -89.875 -89.88 -89.885 -89.89 -89.895 -89.9 -89.905 -89.91 -89.915 -89.92 -89.925 -89.93 -89.935 -89.94 -89.945 -89.95 -89.955 -89.96 -89.965 -89.97 -89.975 -89.98 -89.985 -89.99 -89.995 -90 -90.005 -90.01 -90.015 -90.02 -90.025 -90.03 -90.035 -90.04 -90.045 -90.05 -90.055 -90.06 -90.065 -90.07 -90.075 -90.08 -90.085 -90.09 -90.095 -90.1 -90.105 -90.11 -90.115 -90.12 -90.125 -90.13 -90.135 -90.14 -90.145 -90.15 -90.155 -90.16 -90.165 -90.17 -90.175 -90.18 -90.185 -90.19 -90.195 -90.2 -90.205 -90.21 -90.215 -90.22 -90.225 -90.23 -90.235 -90.24 -90.245 -90.25 -90.255 -90.26 -90.265 -90.27 -90.275 -90.28 -90.285 -90.29 -90.295 -90.3 -90.305 -90.31 -90.315 -90.32 -90.325 -90.33 -90.335 -90.34 -90.345 -90.35 -90.355 -90.36 -90.365 -90.37 -90.375 -90.38 -90.385 -90.39 -90.395 -90.4 -90.405 -90.41 -90.415 -90.42 -90.425 -90.43 -90.435 -90.44 -90.445 -90.45 -90.455 -90.46 -90.465 -90.47 -90.475 -90.48 -90.485 -90.49 -90.495 -90.5 -90.505 -90.51 -90.515 -90.52 -90.525 -90.53 -90.535 -90.54 -90.545 -90.55 -90.555 -90.56 -90.565 -90.57 -90.575 -90.58 -90.585 -90.59 -90.595 -90.6 -90.605 -90.61 -90.615 -90.62 -90.625 -90.63 -90.635 -90.64 -90.645 -90.65 -90.655 -90.66 -90.665 -90.67 -90.675 -90.68 -90.685 -90.69 -90.695 -90.7 -90.705 -90.71 -90.715 -90.72 -90.725 -90.73 -90.735 -90.74 -90.745 -90.75 -90.755 -90.76 -90.765 -90.77 -90.775 -90.78 -90.785 -90.79 -90.795 -90.8 -90.805 -90.81 -90.815 -90.82 -90.825 -90.83 -90.835 -90.84 -90.845 -90.85 -90.855 -90.86 -90.865 -90.87 -90.875 -90.88 -90.885 -90.89 -90.895 -90.9 -90.905 -90.91 -90.915 -90.92 -90.925 -90.93 -90.935 -90.94 -90.945 -90.95 -90.955 -90.96 -90.965 -90.97 -90.975 -90.98 -90.985 -90.99 -90.995 -91 -91.005 -91.01 -91.015 -91.02 -91.025 -91.03 -91.035 -91.04 -91.045 -91.05 -91.055 -91.06 -91.065 -91.07 -91.075 -91.08 -91.085 -91.09 -91.095 -91.1 -91.105 -91.11 -91.115 -91.12 -91.125 -91.13 -91.135 -91.14 -91.145 -91.15 -91.155 -91.16 -91.165 -91.17 -91.175 -91.18 -91.185 -91.19 -91.195 -91.2 -91.205 -91.21 -91.215 -91.22 -91.225 -91.23 -91.235 -91.24 -91.245 -91.25 -91.255 -91.26 -91.265 -91.27 -91.275 -91.28 -91.285 -91.29 -91.295 -91.3 -91.305 -91.31 -91.315 -91.32 -91.325 -91.33 -91.335 -91.34 -91.345 -91.35 -91.355 -91.36 -91.365 -91.37 -91.375 -91.38 -91.385 -91.39 -91.395 -91.4 -91.405 -91.41 -91.415 -91.42 -91.425 -91.43 -91.435 -91.44 -91.445 -91.45 -91.455 -91.46 -91.465 -91.47 -91.475 -91.48 -91.485 -91.49 -91.495 -91.5 -91.505 -91.51 -91.515 -91.52 -91.525 -91.53 -91.535 -91.54 -91.545 -91.55 -91.555 -91.56 -91.565 -91.57 -91.575 -91.58 -91.585 -91.59 -91.595 -91.6 -91.605 -91.61 -91.615 -91.62 -91.625 -91.63 -91.635 -91.64 -91.645 -91.65 -91.655 -91.66 -91.665 -91.67 -91.675 -91.68 -91.685 -91.69 -91.695 -91.7 -91.705 -91.71 -91.715 -91.72 -91.725 -91.73 -91.735 -91.74 -91.745 -91.75 -91.755 -91.76 -91.765 -91.77 -91.775 -91.78 -91.785 -91.79 -91.795 -91.8 -91.805 -91.81 -91.815 -91.82 -91.825 -91.83 -91.835 -91.84 -91.845 -91.85 -91.855 -91.86 -91.865 -91.87 -91.875 -91.88 -91.885 -91.89 -91.895 -91.9 -91.905 -91.91 -91.915 -91.92 -91.925 -91.93 -91.935 -91.94 -91.945 -91.95 -91.955 -91.96 -91.965 -91.97 -91.975 -91.98 -91.985 -91.99 -91.995 -92 -92.005 -92.01 -92.015 -92.02 -92.025 -92.03 -92.035 -92.04 -92.045 -92.05 -92.055 -92.06 -92.065 -92.07 -92.075 -92.08 -92.085 -92.09 -92.095 -92.1 -92.105 -92.11 -92.115 -92.12 -92.125 -92.13 -92.135 -92.14 -92.145 -92.15 -92.155 -92.16 -92.165 -92.17 -92.175 -92.18 -92.185 -92.19 -92.195 -92.2 -92.205 -92.21 -92.215 -92.22 -92.225 -92.23 -92.235 -92.24 -92.245 -92.25 -92.255 -92.26 -92.265 -92.27 -92.275 -92.28 -92.285 -92.29 -92.295 -92.3 -92.305 -92.31 -92.315 -92.32 -92.325 -92.33 -92.335 -92.34 -92.345 -92.35 -92.355 -92.36 -92.365 -92.37 -92.375 -92.38 -92.385 -92.39 -92.395 -92.4 -92.405 -92.41 -92.415 -92.42 -92.425 -92.43 -92.435 -92.44 -92.445 -92.45 -92.455 -92.46 -92.465 -92.47 -92.475 -92.48 -92.485 -92.49 -92.495 -92.5 -92.505 -92.51 -92.515 -92.52 -92.525 -92.53 -92.535 -92.54 -92.545 -92.55 -92.555 -92.56 -92.565 -92.57 -92.575 -92.58 -92.585 -92.59 -92.595 -92.6 -92.605 -92.61 -92.615 -92.62 -92.625 -92.63 -92.635 -92.64 -92.645 -92.65 -92.655 -92.66 -92.665 -92.67 -92.675 -92.68 -92.685 -92.69 -92.695 -92.7 -92.705 -92.71 -92.715 -92.72 -92.725 -92.73 -92.735 -92.74 -92.745 -92.75 -92.755 -92.76 -92.765 -92.77 -92.775 -92.78 -92.785 -92.79 -92.795 -92.8 -92.805 -92.81 -92.815 -92.82 -92.825 -92.83 -92.835 -92.84 -92.845 -92.85 -92.855 -92.86 -92.865 -92.87 -92.875 -92.88 -92.885 -92.89 -92.895 -92.9 -92.905 -92.91 -92.915 -92.92 -92.925 -92.93 -92.935 -92.94 -92.945 -92.95 -92.955 -92.96 -92.965 -92.97 -92.975 -92.98 -92.985 -92.99 -92.995 -93 -93.005 -93.01 -93.015 -93.02 -93.025 -93.03 -93.035 -93.04 -93.045 -93.05 -93.055 -93.06 -93.065 -93.07 -93.075 -93.08 -93.085 -93.09 -93.095 -93.1 -93.105 -93.11 -93.115 -93.12 -93.125 -93.13 -93.135 -93.14 -93.145 -93.15 -93.155 -93.16 -93.165 -93.17 -93.175 -93.18 -93.185 -93.19 -93.195 -93.2 -93.205 -93.21 -93.215 -93.22 -93.225 -93.23 -93.235 -93.24 -93.245 -93.25 -93.255 -93.26 -93.265 -93.27 -93.275 -93.28 -93.285 -93.29 -93.295 -93.3 -93.305 -93.31 -93.315 -93.32 -93.325 -93.33 -93.335 -93.34 -93.345 -93.35 -93.355 -93.36 -93.365 -93.37 -93.375 -93.38 -93.385 -93.39 -93.395 -93.4 -93.405 -93.41 -93.415 -93.42 -93.425 -93.43 -93.435 -93.44 -93.445 -93.45 -93.455 -93.46 -93.465 -93.47 -93.475 -93.48 -93.485 -93.49 -93.495 -93.5 -93.505 -93.51 -93.515 -93.52 -93.525 -93.53 -93.535 -93.54 -93.545 -93.55 -93.555 -93.56 -93.565 -93.57 -93.575 -93.58 -93.585 -93.59 -93.595 -93.6 -93.605 -93.61 -93.615 -93.62 -93.625 -93.63 -93.635 -93.64 -93.645 -93.65 -93.655 -93.66 -93.665 -93.67 -93.675 -93.68 -93.685 -93.69 -93.695 -93.7 -93.705 -93.71 -93.715 -93.72 -93.725 -93.73 -93.735 -93.74 -93.745 -93.75 -93.755 -93.76 -93.765 -93.77 -93.775 -93.78 -93.785 -93.79 -93.795 -93.8 -93.805 -93.81 -93.815 -93.82 -93.825 -93.83 -93.835 -93.84 -93.845 -93.85 -93.855 -93.86 -93.865 -93.87 -93.875 -93.88 -93.885 -93.89 -93.895 -93.9 -93.905 -93.91 -93.915 -93.92 -93.925 -93.93 -93.935 -93.94 -93.945 -93.95 -93.955 -93.96 -93.965 -93.97 -93.975 -93.98 -93.985 -93.99 -93.995 -94 -94.005 -94.01 -94.015 -94.02 -94.025 -94.03 -94.035 -94.04 -94.045 -94.05 -94.055 -94.06 -94.065 -94.07 -94.075 -94.08 -94.085 -94.09 -94.095 -94.1 -94.105 -94.11 -94.115 -94.12 -94.125 -94.13 -94.135 -94.14 -94.145 -94.15 -94.155 -94.16 -94.165 -94.17 -94.175 -94.18 -94.185 -94.19 -94.195 -94.2 -94.205 -94.21 -94.215 -94.22 -94.225 -94.23 -94.235 -94.24 -94.245 -94.25 -94.255 -94.26 -94.265 -94.27 -94.275 -94.28 -94.285 -94.29 -94.295 -94.3 -94.305 -94.31 -94.315 -94.32 -94.325 -94.33 -94.335 -94.34 -94.345 -94.35 -94.355 -94.36 -94.365 -94.37 -94.375 -94.38 -94.385 -94.39 -94.395 -94.4 -94.405 -94.41 -94.415 -94.42 -94.425 -94.43 -94.435 -94.44 -94.445 -94.45 -94.455 -94.46 -94.465 -94.47 -94.475 -94.48 -94.485 -94.49 -94.495 -94.5 -94.505 -94.51 -94.515 -94.52 -94.525 -94.53 -94.535 -94.54 -94.545 -94.55 -94.555 -94.56 -94.565 -94.57 -94.575 -94.58 -94.585 -94.59 -94.595 -94.6 -94.605 -94.61 -94.615 -94.62 -94.625 -94.63 -94.635 -94.64 -94.645 -94.65 -94.655 -94.66 -94.665 -94.67 -94.675 -94.68 -94.685 -94.69 -94.695 -94.7 -94.705 -94.71 -94.715 -94.72 -94.725 -94.73 -94.735 -94.74 -94.745 -94.75 -94.755 -94.76 -94.765 -94.77 -94.775 -94.78 -94.785 -94.79 -94.795 -94.8 -94.805 -94.81 -94.815 -94.82 -94.825 -94.83 -94.835 -94.84 -94.845 -94.85 -94.855 -94.86 -94.865 -94.87 -94.875 -94.88 -94.885 -94.89 -94.895 -94.9 -94.905 -94.91 -94.915 -94.92 -94.925 -94.93 -94.935 -94.94 -94.945 -94.95 -94.955 -94.96 -94.965 -94.97 -94.975 -94.98 -94.985 -94.99 -94.995 -95 -95.005 -95.01 -95.015 -95.02 -95.025 -95.03 -95.035 -95.04 -95.045 -95.05 -95.055 -95.06 -95.065 -95.07 -95.075 -95.08 -95.085 -95.09 -95.095 -95.1 -95.105 -95.11 -95.115 -95.12 -95.125 -95.13 -95.135 -95.14 -95.145 -95.15 -95.155 -95.16 -95.165 -95.17 -95.175 -95.18 -95.185 -95.19 -95.195 -95.2 -95.205 -95.21 -95.215 -95.22 -95.225 -95.23 -95.235 -95.24 -95.245 -95.25 -95.255 -95.26 -95.265 -95.27 -95.275 -95.28 -95.285 -95.29 -95.295 -95.3 -95.305 -95.31 -95.315 -95.32 -95.325 -95.33 -95.335 -95.34 -95.345 -95.35 -95.355 -95.36 -95.365 -95.37 -95.375 -95.38 -95.385 -95.39 -95.395 -95.4 -95.405 -95.41 -95.415 -95.42 -95.425 -95.43 -95.435 -95.44 -95.445 -95.45 -95.455 -95.46 -95.465 -95.47 -95.475 -95.48 -95.485 -95.49 -95.495 -95.5 -95.505 -95.51 -95.515 -95.52 -95.525 -95.53 -95.535 -95.54 -95.545 -95.55 -95.555 -95.56 -95.565 -95.57 -95.575 -95.58 -95.585 -95.59 -95.595 -95.6 -95.605 -95.61 -95.615 -95.62 -95.625 -95.63 -95.635 -95.64 -95.645 -95.65 -95.655 -95.66 -95.665 -95.67 -95.675 -95.68 -95.685 -95.69 -95.695 -95.7 -95.705 -95.71 -95.715 -95.72 -95.725 -95.73 -95.735 -95.74 -95.745 -95.75 -95.755 -95.76 -95.765 -95.77 -95.775 -95.78 -95.785 -95.79 -95.795 -95.8 -95.805 -95.81 -95.815 -95.82 -95.825 -95.83 -95.835 -95.84 -95.845 -95.85 -95.855 -95.86 -95.865 -95.87 -95.875 -95.88 -95.885 -95.89 -95.895 -95.9 -95.905 -95.91 -95.915 -95.92 -95.925 -95.93 -95.935 -95.94 -95.945 -95.95 -95.955 -95.96 -95.965 -95.97 -95.975 -95.98 -95.985 -95.99 -95.995 -96 -96.005 -96.01 -96.015 -96.02 -96.025 -96.03 -96.035 -96.04 -96.045 -96.05 -96.055 -96.06 -96.065 -96.07 -96.075 -96.08 -96.085 -96.09 -96.095 -96.1 -96.105 -96.11 -96.115 -96.12 -96.125 -96.13 -96.135 -96.14 -96.145 -96.15 -96.155 -96.16 -96.165 -96.17 -96.175 -96.18 -96.185 -96.19 -96.195 -96.2 -96.205 -96.21 -96.215 -96.22 -96.225 -96.23 -96.235 -96.24 -96.245 -96.25 -96.255 -96.26 -96.265 -96.27 -96.275 -96.28 -96.285 -96.29 -96.295 -96.3 -96.305 -96.31 -96.315 -96.32 -96.325 -96.33 -96.335 -96.34 -96.345 -96.35 -96.355 -96.36 -96.365 -96.37 -96.375 -96.38 -96.385 -96.39 -96.395 -96.4 -96.405 -96.41 -96.415 -96.42 -96.425 -96.43 -96.435 -96.44 -96.445 -96.45 -96.455 -96.46 -96.465 -96.47 -96.475 -96.48 -96.485 -96.49 -96.495 -96.5 -96.505 -96.51 -96.515 -96.52 -96.525 -96.53 -96.535 -96.54 -96.545 -96.55 -96.555 -96.56 -96.565 -96.57 -96.575 -96.58 -96.585 -96.59 -96.595 -96.6 -96.605 -96.61 -96.615 -96.62 -96.625 -96.63 -96.635 -96.64 -96.645 -96.65 -96.655 -96.66 -96.665 -96.67 -96.675 -96.68 -96.685 -96.69 -96.695 -96.7 -96.705 -96.71 -96.715 -96.72 -96.725 -96.73 -96.735 -96.74 -96.745 -96.75 -96.755 -96.76 -96.765 -96.77 -96.775 -96.78 -96.785 -96.79 -96.795 -96.8 -96.805 -96.81 -96.815 -96.82 -96.825 -96.83 -96.835 -96.84 -96.845 -96.85 -96.855 -96.86 -96.865 -96.87 -96.875 -96.88 -96.885 -96.89 -96.895 -96.9 -96.905 -96.91 -96.915 -96.92 -96.925 -96.93 -96.935 -96.94 -96.945 -96.95 -96.955 -96.96 -96.965 -96.97 -96.975 -96.98 -96.985 -96.99 -96.995 -97 -97.005 -97.01 -97.015 -97.02 -97.025 -97.03 -97.035 -97.04 -97.045 -97.05 -97.055 -97.06 -97.065 -97.07 -97.075 -97.08 -97.085 -97.09 -97.095 -97.1 -97.105 -97.11 -97.115 -97.12 -97.125 -97.13 -97.135 -97.14 -97.145 -97.15 -97.155 -97.16 -97.165 -97.17 -97.175 -97.18 -97.185 -97.19 -97.195 -97.2 -97.205 -97.21 -97.215 -97.22 -97.225 -97.23 -97.235 -97.24 -97.245 -97.25 -97.255 -97.26 -97.265 -97.27 -97.275 -97.28 -97.285 -97.29 -97.295 -97.3 -97.305 -97.31 -97.315 -97.32 -97.325 -97.33 -97.335 -97.34 -97.345 -97.35 -97.355 -97.36 -97.365 -97.37 -97.375 -97.38 -97.385 -97.39 -97.395 -97.4 -97.405 -97.41 -97.415 -97.42 -97.425 -97.43 -97.435 -97.44 -97.445 -97.45 -97.455 -97.46 -97.465 -97.47 -97.475 -97.48 -97.485 -97.49 -97.495 -97.5 -97.505 -97.51 -97.515 -97.52 -97.525 -97.53 -97.535 -97.54 -97.545 -97.55 -97.555 -97.56 -97.565 -97.57 -97.575 -97.58 -97.585 -97.59 -97.595 -97.6 -97.605 -97.61 -97.615 -97.62 -97.625 -97.63 -97.635 -97.64 -97.645 -97.65 -97.655 -97.66 -97.665 -97.67 -97.675 -97.68 -97.685 -97.69 -97.695 -97.7 -97.705 -97.71 -97.715 -97.72 -97.725 -97.73 -97.735 -97.74 -97.745 -97.75 -97.755 -97.76 -97.765 -97.77 -97.775 -97.78 -97.785 -97.79 -97.795 -97.8 -97.805 -97.81 -97.815 -97.82 -97.825 -97.83 -97.835 -97.84 -97.845 -97.85 -97.855 -97.86 -97.865 -97.87 -97.875 -97.88 -97.885 -97.89 -97.895 -97.9 -97.905 -97.91 -97.915 -97.92 -97.925 -97.93 -97.935 -97.94 -97.945 -97.95 -97.955 -97.96 -97.965 -97.97 -97.975 -97.98 -97.985 -97.99 -97.995 -98 -98.005 -98.01 -98.015 -98.02 -98.025 -98.03 -98.035 -98.04 -98.045 -98.05 -98.055 -98.06 -98.065 -98.07 -98.075 -98.08 -98.085 -98.09 -98.095 -98.1 -98.105 -98.11 -98.115 -98.12 -98.125 -98.13 -98.135 -98.14 -98.145 -98.15 -98.155 -98.16 -98.165 -98.17 -98.175 -98.18 -98.185 -98.19 -98.195 -98.2 -98.205 -98.21 -98.215 -98.22 -98.225 -98.23 -98.235 -98.24 -98.245 -98.25 -98.255 -98.26 -98.265 -98.27 -98.275 -98.28 -98.285 -98.29 -98.295 -98.3 -98.305 -98.31 -98.315 -98.32 -98.325 -98.33 -98.335 -98.34 -98.345 -98.35 -98.355 -98.36 -98.365 -98.37 -98.375 -98.38 -98.385 -98.39 -98.395 -98.4 -98.405 -98.41 -98.415 -98.42 -98.425 -98.43 -98.435 -98.44 -98.445 -98.45 -98.455 -98.46 -98.465 -98.47 -98.475 -98.48 -98.485 -98.49 -98.495 -98.5 -98.505 -98.51 -98.515 -98.52 -98.525 -98.53 -98.535 -98.54 -98.545 -98.55 -98.555 -98.56 -98.565 -98.57 -98.575 -98.58 -98.585 -98.59 -98.595 -98.6 -98.605 -98.61 -98.615 -98.62 -98.625 -98.63 -98.635 -98.64 -98.645 -98.65 -98.655 -98.66 -98.665 -98.67 -98.675 -98.68 -98.685 -98.69 -98.695 -98.7 -98.705 -98.71 -98.715 -98.72 -98.725 -98.73 -98.735 -98.74 -98.745 -98.75 -98.755 -98.76 -98.765 -98.77 -98.775 -98.78 -98.785 -98.79 -98.795 -98.8 -98.805 -98.81 -98.815 -98.82 -98.825 -98.83 -98.835 -98.84 -98.845 -98.85 -98.855 -98.86 -98.865 -98.87 -98.875 -98.88 -98.885 -98.89 -98.895 -98.9 -98.905 -98.91 -98.915 -98.92 -98.925 -98.93 -98.935 -98.94 -98.945 -98.95 -98.955 -98.96 -98.965 -98.97 -98.975 -98.98 -98.985 -98.99 -98.995 -99 -99.005 -99.01 -99.015 -99.02 -99.025 -99.03 -99.035 -99.04 -99.045 -99.05 -99.055 -99.06 -99.065 -99.07 -99.075 -99.08 -99.085 -99.09 -99.095 -99.1 -99.105 -99.11 -99.115 -99.12 -99.125 -99.13 -99.135 -99.14 -99.145 -99.15 -99.155 -99.16 -99.165 -99.17 -99.175 -99.18 -99.185 -99.19 -99.195 -99.2 -99.205 -99.21 -99.215 -99.22 -99.225 -99.23 -99.235 -99.24 -99.245 -99.25 -99.255 -99.26 -99.265 -99.27 -99.275 -99.28 -99.285 -99.29 -99.295 -99.3 -99.305 -99.31 -99.315 -99.32 -99.325 -99.33 -99.335 -99.34 -99.345 -99.35 -99.355 -99.36 -99.365 -99.37 -99.375 -99.38 -99.385 -99.39 -99.395 -99.4 -99.405 -99.41 -99.415 -99.42 -99.425 -99.43 -99.435 -99.44 -99.445 -99.45 -99.455 -99.46 -99.465 -99.47 -99.475 -99.48 -99.485 -99.49 -99.495 -99.5 -99.505 -99.51 -99.515 -99.52 -99.525 -99.53 -99.535 -99.54 -99.545 -99.55 -99.555 -99.56 -99.565 -99.57 -99.575 -99.58 -99.585 -99.59 -99.595 -99.6 -99.605 -99.61 -99.615 -99.62 -99.625 -99.63 -99.635 -99.64 -99.645 -99.65 -99.655 -99.66 -99.665 -99.67 -99.675 -99.68 -99.685 -99.69 -99.695 -99.7 -99.705 -99.71 -99.715 -99.72 -99.725 -99.73 -99.735 -99.74 -99.745 -99.75 -99.755 -99.76 -99.765 -99.77 -99.775 -99.78 -99.785 -99.79 -99.795 -99.8 -99.805 -99.81 -99.815 -99.82 -99.825 -99.83 -99.835 -99.84 -99.845 -99.85 -99.855 -99.86 -99.865 -99.87 -99.875 -99.88 -99.885 -99.89 -99.895 -99.9 -99.905 -99.91 -99.915 -99.92 -99.925 -99.93 -99.935 -99.94 -99.945 -99.95 -99.955 -99.96 -99.965 -99.97 -99.975 -99.98 -99.985 -99.99 -99.995 -100 -100.005 -100.01 -100.015 -100.02 -100.025 -100.03 -100.035 -100.04 -100.045 -100.05 -100.055 -100.06 -100.065 -100.07 -100.075 -100.08 -100.085 -100.09 -100.095 -100.1 -100.105 -100.11 -100.115 -100.12 -100.125 -100.13 -100.135 -100.14 -100.145 -100.15 -100.155 -100.16 -100.165 -100.17 -100.175 -100.18 -100.185 -100.19 -100.195 -100.2 -100.205 -100.21 -100.215 -100.22 -100.225 -100.23 -100.235 -100.24 -100.245 -100.25 -100.255 -100.26 -100.265 -100.27 -100.275 -100.28 -100.285 -100.29 -100.295 -100.3 -100.305 -100.31 -100.315 -100.32 -100.325 -100.33 -100.335 -100.34 -100.345 -100.35 -100.355 -100.36 -100.365 -100.37 -100.375 -100.38 -100.385 -100.39 -100.395 -100.4 -100.405 -100.41 -100.415 -100.42 -100.425 -100.43 -100.435 -100.44 -100.445 -100.45 -100.455 -100.46 -100.465 -100.47 -100.475 -100.48 -100.485 -100.49 -100.495 -100.5 -100.505 -100.51 -100.515 -100.52 -100.525 -100.53 -100.535 -100.54 -100.545 -100.55 -100.555 -100.56 -100.565 -100.57 -100.575 -100.58 -100.585 -100.59 -100.595 -100.6 -100.605 -100.61 -100.615 -100.62 -100.625 -100.63 -100.635 -100.64 -100.645 -100.65 -100.655 -100.66 -100.665 -100.67 -100.675 -100.68 -100.685 -100.69 -100.695 -100.7 -100.705 -100.71 -100.715 -100.72 -100.725 -100.73 -100.735 -100.74 -100.745 -100.75 -100.755 -100.76 -100.765 -100.77 -100.775 -100.78 -100.785 -100.79 -100.795 -100.8 -100.805 -100.81 -100.815 -100.82 -100.825 -100.83 -100.835 -100.84 -100.845 -100.85 -100.855 -100.86 -100.865 -100.87 -100.875 -100.88 -100.885 -100.89 -100.895 -100.9 -100.905 -100.91 -100.915 -100.92 -100.925 -100.93 -100.935 -100.94 -100.945 -100.95 -100.955 -100.96 -100.965 -100.97 -100.975 -100.98 -100.985 -100.99 -100.995 -101 -101.005 -101.01 -101.015 -101.02 -101.025 -101.03 -101.035 -101.04 -101.045 -101.05 -101.055 -101.06 -101.065 -101.07 -101.075 -101.08 -101.085 -101.09 -101.095 -101.1 -101.105 -101.11 -101.115 -101.12 -101.125 -101.13 -101.135 -101.14 -101.145 -101.15 -101.155 -101.16 -101.165 -101.17 -101.175 -101.18 -101.185 -101.19 -101.195 -101.2 -101.205 -101.21 -101.215 -101.22 -101.225 -101.23 -101.235 -101.24 -101.245 -101.25 -101.255 -101.26 -101.265 -101.27 -101.275 -101.28 -101.285 -101.29 -101.295 -101.3 -101.305 -101.31 -101.315 -101.32 -101.325 -101.33 -101.335 -101.34 -101.345 -101.35 -101.355 -101.36 -101.365 -101.37 -101.375 -101.38 -101.385 -101.39 -101.395 -101.4 -101.405 -101.41 -101.415 -101.42 -101.425 -101.43 -101.435 -101.44 -101.445 -101.45 -101.455 -101.46 -101.465 -101.47 -101.475 -101.48 -101.485 -101.49 -101.495 -101.5 -101.505 -101.51 -101.515 -101.52 -101.525 -101.53 -101.535 -101.54 -101.545 -101.55 -101.555 -101.56 -101.565 -101.57 -101.575 -101.58 -101.585 -101.59 -101.595 -101.6 -101.605 -101.61 -101.615 -101.62 -101.625 -101.63 -101.635 -101.64 -101.645 -101.65 -101.655 -101.66 -101.665 -101.67 -101.675 -101.68 -101.685 -101.69 -101.695 -101.7 -101.705 -101.71 -101.715 -101.72 -101.725 -101.73 -101.735 -101.74 -101.745 -101.75 -101.755 -101.76 -101.765 -101.77 -101.775 -101.78 -101.785 -101.79 -101.795 -101.8 -101.805 -101.81 -101.815 -101.82 -101.825 -101.83 -101.835 -101.84 -101.845 -101.85 -101.855 -101.86 -101.865 -101.87 -101.875 -101.88 -101.885 -101.89 -101.895 -101.9 -101.905 -101.91 -101.915 -101.92 -101.925 -101.93 -101.935 -101.94 -101.945 -101.95 -101.955 -101.96 -101.965 -101.97 -101.975 -101.98 -101.985 -101.99 -101.995 -102 -102.005 -102.01 -102.015 -102.02 -102.025 -102.03 -102.035 -102.04 -102.045 -102.05 -102.055 -102.06 -102.065 -102.07 -102.075 -102.08 -102.085 -102.09 -102.095 -102.1 -102.105 -102.11 -102.115 -102.12 -102.125 -102.13 -102.135 -102.14 -102.145 -102.15 -102.155 -102.16 -102.165 -102.17 -102.175 -102.18 -102.185 -102.19 -102.195 -102.2 -102.205 -102.21 -102.215 -102.22 -102.225 -102.23 -102.235 -102.24 -102.245 -102.25 -102.255 -102.26 -102.265 -102.27 -102.275 -102.28 -102.285 -102.29 -102.295 -102.3 -102.305 -102.31 -102.315 -102.32 -102.325 -102.33 -102.335 -102.34 -102.345 -102.35 -102.355 -102.36 -102.365 -102.37 -102.375 -102.38 -102.385 -102.39 -102.395 -102.4 -102.405 -102.41 -102.415 -102.42 -102.425 -102.43 -102.435 -102.44 -102.445 -102.45 -102.455 -102.46 -102.465 -102.47 -102.475 -102.48 -102.485 -102.49 -102.495 -102.5 -102.505 -102.51 -102.515 -102.52 -102.525 -102.53 -102.535 -102.54 -102.545 -102.55 -102.555 -102.56 -102.565 -102.57 -102.575 -102.58 -102.585 -102.59 -102.595 -102.6 -102.605 -102.61 -102.615 -102.62 -102.625 -102.63 -102.635 -102.64 -102.645 -102.65 -102.655 -102.66 -102.665 -102.67 -102.675 -102.68 -102.685 -102.69 -102.695 -102.7 -102.705 -102.71 -102.715 -102.72 -102.725 -102.73 -102.735 -102.74 -102.745 -102.75 -102.755 -102.76 -102.765 -102.77 -102.775 -102.78 -102.785 -102.79 -102.795 -102.8 -102.805 -102.81 -102.815 -102.82 -102.825 -102.83 -102.835 -102.84 -102.845 -102.85 -102.855 -102.86 -102.865 -102.87 -102.875 -102.88 -102.885 -102.89 -102.895 -102.9 -102.905 -102.91 -102.915 -102.92 -102.925 -102.93 -102.935 -102.94 -102.945 -102.95 -102.955 -102.96 -102.965 -102.97 -102.975 -102.98 -102.985 -102.99 -102.995 -103 -103.005 -103.01 -103.015 -103.02 -103.025 -103.03 -103.035 -103.04 -103.045 -103.05 -103.055 -103.06 -103.065 -103.07 -103.075 -103.08 -103.085 -103.09 -103.095 -103.1 -103.105 -103.11 -103.115 -103.12 -103.125 -103.13 -103.135 -103.14 -103.145 -103.15 -103.155 -103.16 -103.165 -103.17 -103.175 -103.18 -103.185 -103.19 -103.195 -103.2 -103.205 -103.21 -103.215 -103.22 -103.225 -103.23 -103.235 -103.24 -103.245 -103.25 -103.255 -103.26 -103.265 -103.27 -103.275 -103.28 -103.285 -103.29 -103.295 -103.3 -103.305 -103.31 -103.315 -103.32 -103.325 -103.33 -103.335 -103.34 -103.345 -103.35 -103.355 -103.36 -103.365 -103.37 -103.375 -103.38 -103.385 -103.39 -103.395 -103.4 -103.405 -103.41 -103.415 -103.42 -103.425 -103.43 -103.435 -103.44 -103.445 -103.45 -103.455 -103.46 -103.465 -103.47 -103.475 -103.48 -103.485 -103.49 -103.495 -103.5 -103.505 -103.51 -103.515 -103.52 -103.525 -103.53 -103.535 -103.54 -103.545 -103.55 -103.555 -103.56 -103.565 -103.57 -103.575 -103.58 -103.585 -103.59 -103.595 -103.6 -103.605 -103.61 -103.615 -103.62 -103.625 -103.63 -103.635 -103.64 -103.645 -103.65 -103.655 -103.66 -103.665 -103.67 -103.675 -103.68 -103.685 -103.69 -103.695 -103.7 -103.705 -103.71 -103.715 -103.72 -103.725 -103.73 -103.735 -103.74 -103.745 -103.75 -103.755 -103.76 -103.765 -103.77 -103.775 -103.78 -103.785 -103.79 -103.795 -103.8 -103.805 -103.81 -103.815 -103.82 -103.825 -103.83 -103.835 -103.84 -103.845 -103.85 -103.855 -103.86 -103.865 -103.87 -103.875 -103.88 -103.885 -103.89 -103.895 -103.9 -103.905 -103.91 -103.915 -103.92 -103.925 -103.93 -103.935 -103.94 -103.945 -103.95 -103.955 -103.96 -103.965 -103.97 -103.975 -103.98 -103.985 -103.99 -103.995 -104 -104.005 -104.01 -104.015 -104.02 -104.025 -104.03 -104.035 -104.04 -104.045 -104.05 -104.055 -104.06 -104.065 -104.07 -104.075 -104.08 -104.085 -104.09 -104.095 -104.1 -104.105 -104.11 -104.115 -104.12 -104.125 -104.13 -104.135 -104.14 -104.145 -104.15 -104.155 -104.16 -104.165 -104.17 -104.175 -104.18 -104.185 -104.19 -104.195 -104.2 -104.205 -104.21 -104.215 -104.22 -104.225 -104.23 -104.235 -104.24 -104.245 -104.25 -104.255 -104.26 -104.265 -104.27 -104.275 -104.28 -104.285 -104.29 -104.295 -104.3 -104.305 -104.31 -104.315 -104.32 -104.325 -104.33 -104.335 -104.34 -104.345 -104.35 -104.355 -104.36 -104.365 -104.37 -104.375 -104.38 -104.385 -104.39 -104.395 -104.4 -104.405 -104.41 -104.415 -104.42 -104.425 -104.43 -104.435 -104.44 -104.445 -104.45 -104.455 -104.46 -104.465 -104.47 -104.475 -104.48 -104.485 -104.49 -104.495 -104.5 -104.505 -104.51 -104.515 -104.52 -104.525 -104.53 -104.535 -104.54 -104.545 -104.55 -104.555 -104.56 -104.565 -104.57 -104.575 -104.58 -104.585 -104.59 -104.595 -104.6 -104.605 -104.61 -104.615 -104.62 -104.625 -104.63 -104.635 -104.64 -104.645 -104.65 -104.655 -104.66 -104.665 -104.67 -104.675 -104.68 -104.685 -104.69 -104.695 -104.7 -104.705 -104.71 -104.715 -104.72 -104.725 -104.73 -104.735 -104.74 -104.745 -104.75 -104.755 -104.76 -104.765 -104.77 -104.775 -104.78 -104.785 -104.79 -104.795 -104.8 -104.805 -104.81 -104.815 -104.82 -104.825 -104.83 -104.835 -104.84 -104.845 -104.85 -104.855 -104.86 -104.865 -104.87 -104.875 -104.88 -104.885 -104.89 -104.895 -104.9 -104.905 -104.91 -104.915 -104.92 -104.925 -104.93 -104.935 -104.94 -104.945 -104.95 -104.955 -104.96 -104.965 -104.97 -104.975 -104.98 -104.985 -104.99 -104.995 -105 -105.005 -105.01 -105.015 -105.02 -105.025 -105.03 -105.035 -105.04 -105.045 -105.05 -105.055 -105.06 -105.065 -105.07 -105.075 -105.08 -105.085 -105.09 -105.095 -105.1 -105.105 -105.11 -105.115 -105.12 -105.125 -105.13 -105.135 -105.14 -105.145 -105.15 -105.155 -105.16 -105.165 -105.17 -105.175 -105.18 -105.185 -105.19 -105.195 -105.2 -105.205 -105.21 -105.215 -105.22 -105.225 -105.23 -105.235 -105.24 -105.245 -105.25 -105.255 -105.26 -105.265 -105.27 -105.275 -105.28 -105.285 -105.29 -105.295 -105.3 -105.305 -105.31 -105.315 -105.32 -105.325 -105.33 -105.335 -105.34 -105.345 -105.35 -105.355 -105.36 -105.365 -105.37 -105.375 -105.38 -105.385 -105.39 -105.395 -105.4 -105.405 -105.41 -105.415 -105.42 -105.425 -105.43 -105.435 -105.44 -105.445 -105.45 -105.455 -105.46 -105.465 -105.47 -105.475 -105.48 -105.485 -105.49 -105.495 -105.5 -105.505 -105.51 -105.515 -105.52 -105.525 -105.53 -105.535 -105.54 -105.545 -105.55 -105.555 -105.56 -105.565 -105.57 -105.575 -105.58 -105.585 -105.59 -105.595 -105.6 -105.605 -105.61 -105.615 -105.62 -105.625 -105.63 -105.635 -105.64 -105.645 -105.65 -105.655 -105.66 -105.665 -105.67 -105.675 -105.68 -105.685 -105.69 -105.695 -105.7 -105.705 -105.71 -105.715 -105.72 -105.725 -105.73 -105.735 -105.74 -105.745 -105.75 -105.755 -105.76 -105.765 -105.77 -105.775 -105.78 -105.785 -105.79 -105.795 -105.8 -105.805 -105.81 -105.815 -105.82 -105.825 -105.83 -105.835 -105.84 -105.845 -105.85 -105.855 -105.86 -105.865 -105.87 -105.875 -105.88 -105.885 -105.89 -105.895 -105.9 -105.905 -105.91 -105.915 -105.92 -105.925 -105.93 -105.935 -105.94 -105.945 -105.95 -105.955 -105.96 -105.965 -105.97 -105.975 -105.98 -105.985 -105.99 -105.995 -106 -106.005 -106.01 -106.015 -106.02 -106.025 -106.03 -106.035 -106.04 -106.045 -106.05 -106.055 -106.06 -106.065 -106.07 -106.075 -106.08 -106.085 -106.09 -106.095 -106.1 -106.105 -106.11 -106.115 -106.12 -106.125 -106.13 -106.135 -106.14 -106.145 -106.15 -106.155 -106.16 -106.165 -106.17 -106.175 -106.18 -106.185 -106.19 -106.195 -106.2 -106.205 -106.21 -106.215 -106.22 -106.225 -106.23 -106.235 -106.24 -106.245 -106.25 -106.255 -106.26 -106.265 -106.27 -106.275 -106.28 -106.285 -106.29 -106.295 -106.3 -106.305 -106.31 -106.315 -106.32 -106.325 -106.33 -106.335 -106.34 -106.345 -106.35 -106.355 -106.36 -106.365 -106.37 -106.375 -106.38 -106.385 -106.39 -106.395 -106.4 -106.405 -106.41 -106.415 -106.42 -106.425 -106.43 -106.435 -106.44 -106.445 -106.45 -106.455 -106.46 -106.465 -106.47 -106.475 -106.48 -106.485 -106.49 -106.495 -106.5 -106.505 -106.51 -106.515 -106.52 -106.525 -106.53 -106.535 -106.54 -106.545 -106.55 -106.555 -106.56 -106.565 -106.57 -106.575 -106.58 -106.585 -106.59 -106.595 -106.6 -106.605 -106.61 -106.615 -106.62 -106.625 -106.63 -106.635 -106.64 -106.645 -106.65 -106.655 -106.66 -106.665 -106.67 -106.675 -106.68 -106.685 -106.69 -106.695 -106.7 -106.705 -106.71 -106.715 -106.72 -106.725 -106.73 -106.735 -106.74 -106.745 -106.75 -106.755 -106.76 -106.765 -106.77 -106.775 -106.78 -106.785 -106.79 -106.795 -106.8 -106.805 -106.81 -106.815 -106.82 -106.825 -106.83 -106.835 -106.84 -106.845 -106.85 -106.855 -106.86 -106.865 -106.87 -106.875 -106.88 -106.885 -106.89 -106.895 -106.9 -106.905 -106.91 -106.915 -106.92 -106.925 -106.93 -106.935 -106.94 -106.945 -106.95 -106.955 -106.96 -106.965 -106.97 -106.975 -106.98 -106.985 -106.99 -106.995 -107 -107.005 -107.01 -107.015 -107.02 -107.025 -107.03 -107.035 -107.04 -107.045 -107.05 -107.055 -107.06 -107.065 -107.07 -107.075 -107.08 -107.085 -107.09 -107.095 -107.1 -107.105 -107.11 -107.115 -107.12 -107.125 -107.13 -107.135 -107.14 -107.145 -107.15 -107.155 -107.16 -107.165 -107.17 -107.175 -107.18 -107.185 -107.19 -107.195 -107.2 -107.205 -107.21 -107.215 -107.22 -107.225 -107.23 -107.235 -107.24 -107.245 -107.25 -107.255 -107.26 -107.265 -107.27 -107.275 -107.28 -107.285 -107.29 -107.295 -107.3 -107.305 -107.31 -107.315 -107.32 -107.325 -107.33 -107.335 -107.34 -107.345 -107.35 -107.355 -107.36 -107.365 -107.37 -107.375 -107.38 -107.385 -107.39 -107.395 -107.4 -107.405 -107.41 -107.415 -107.42 -107.425 -107.43 -107.435 -107.44 -107.445 -107.45 -107.455 -107.46 -107.465 -107.47 -107.475 -107.48 -107.485 -107.49 -107.495 -107.5 -107.505 -107.51 -107.515 -107.52 -107.525 -107.53 -107.535 -107.54 -107.545 -107.55 -107.555 -107.56 -107.565 -107.57 -107.575 -107.58 -107.585 -107.59 -107.595 -107.6 -107.605 -107.61 -107.615 -107.62 -107.625 -107.63 -107.635 -107.64 -107.645 -107.65 -107.655 -107.66 -107.665 -107.67 -107.675 -107.68 -107.685 -107.69 -107.695 -107.7 -107.705 -107.71 -107.715 -107.72 -107.725 -107.73 -107.735 -107.74 -107.745 -107.75 -107.755 -107.76 -107.765 -107.77 -107.775 -107.78 -107.785 -107.79 -107.795 -107.8 -107.805 -107.81 -107.815 -107.82 -107.825 -107.83 -107.835 -107.84 -107.845 -107.85 -107.855 -107.86 -107.865 -107.87 -107.875 -107.88 -107.885 -107.89 -107.895 -107.9 -107.905 -107.91 -107.915 -107.92 -107.925 -107.93 -107.935 -107.94 -107.945 -107.95 -107.955 -107.96 -107.965 -107.97 -107.975 -107.98 -107.985 -107.99 -107.995 -108 -108.005 -108.01 -108.015 -108.02 -108.025 -108.03 -108.035 -108.04 -108.045 -108.05 -108.055 -108.06 -108.065 -108.07 -108.075 -108.08 -108.085 -108.09 -108.095 -108.1 -108.105 -108.11 -108.115 -108.12 -108.125 -108.13 -108.135 -108.14 -108.145 -108.15 -108.155 -108.16 -108.165 -108.17 -108.175 -108.18 -108.185 -108.19 -108.195 -108.2 -108.205 -108.21 -108.215 -108.22 -108.225 -108.23 -108.235 -108.24 -108.245 -108.25 -108.255 -108.26 -108.265 -108.27 -108.275 -108.28 -108.285 -108.29 -108.295 -108.3 -108.305 -108.31 -108.315 -108.32 -108.325 -108.33 -108.335 -108.34 -108.345 -108.35 -108.355 -108.36 -108.365 -108.37 -108.375 -108.38 -108.385 -108.39 -108.395 -108.4 -108.405 -108.41 -108.415 -108.42 -108.425 -108.43 -108.435 -108.44 -108.445 -108.45 -108.455 -108.46 -108.465 -108.47 -108.475 -108.48 -108.485 -108.49 -108.495 -108.5 -108.505 -108.51 -108.515 -108.52 -108.525 -108.53 -108.535 -108.54 -108.545 -108.55 -108.555 -108.56 -108.565 -108.57 -108.575 -108.58 -108.585 -108.59 -108.595 -108.6 -108.605 -108.61 -108.615 -108.62 -108.625 -108.63 -108.635 -108.64 -108.645 -108.65 -108.655 -108.66 -108.665 -108.67 -108.675 -108.68 -108.685 -108.69 -108.695 -108.7 -108.705 -108.71 -108.715 -108.72 -108.725 -108.73 -108.735 -108.74 -108.745 -108.75 -108.755 -108.76 -108.765 -108.77 -108.775 -108.78 -108.785 -108.79 -108.795 -108.8 -108.805 -108.81 -108.815 -108.82 -108.825 -108.83 -108.835 -108.84 -108.845 -108.85 -108.855 -108.86 -108.865 -108.87 -108.875 -108.88 -108.885 -108.89 -108.895 -108.9 -108.905 -108.91 -108.915 -108.92 -108.925 -108.93 -108.935 -108.94 -108.945 -108.95 -108.955 -108.96 -108.965 -108.97 -108.975 -108.98 -108.985 -108.99 -108.995 -109 -109.005 -109.01 -109.015 -109.02 -109.025 -109.03 -109.035 -109.04 -109.045 -109.05 -109.055 -109.06 -109.065 -109.07 -109.075 -109.08 -109.085 -109.09 -109.095 -109.1 -109.105 -109.11 -109.115 -109.12 -109.125 -109.13 -109.135 -109.14 -109.145 -109.15 -109.155 -109.16 -109.165 -109.17 -109.175 -109.18 -109.185 -109.19 -109.195 -109.2 -109.205 -109.21 -109.215 -109.22 -109.225 -109.23 -109.235 -109.24 -109.245 -109.25 -109.255 -109.26 -109.265 -109.27 -109.275 -109.28 -109.285 -109.29 -109.295 -109.3 -109.305 -109.31 -109.315 -109.32 -109.325 -109.33 -109.335 -109.34 -109.345 -109.35 -109.355 -109.36 -109.365 -109.37 -109.375 -109.38 -109.385 -109.39 -109.395 -109.4 -109.405 -109.41 -109.415 -109.42 -109.425 -109.43 -109.435 -109.44 -109.445 -109.45 -109.455 -109.46 -109.465 -109.47 -109.475 -109.48 -109.485 -109.49 -109.495 -109.5 -109.505 -109.51 -109.515 -109.52 -109.525 -109.53 -109.535 -109.54 -109.545 -109.55 -109.555 -109.56 -109.565 -109.57 -109.575 -109.58 -109.585 -109.59 -109.595 -109.6 -109.605 -109.61 -109.615 -109.62 -109.625 -109.63 -109.635 -109.64 -109.645 -109.65 -109.655 -109.66 -109.665 -109.67 -109.675 -109.68 -109.685 -109.69 -109.695 -109.7 -109.705 -109.71 -109.715 -109.72 -109.725 -109.73 -109.735 -109.74 -109.745 -109.75 -109.755 -109.76 -109.765 -109.77 -109.775 -109.78 -109.785 -109.79 -109.795 -109.8 -109.805 -109.81 -109.815 -109.82 -109.825 -109.83 -109.835 -109.84 -109.845 -109.85 -109.855 -109.86 -109.865 -109.87 -109.875 -109.88 -109.885 -109.89 -109.895 -109.9 -109.905 -109.91 -109.915 -109.92 -109.925 -109.93 -109.935 -109.94 -109.945 -109.95 -109.955 -109.96 -109.965 -109.97 -109.975 -109.98 -109.985 -109.99 -109.995 -110 -110.005 -110.01 -110.015 -110.02 -110.025 -110.03 -110.035 -110.04 -110.045 -110.05 -110.055 -110.06 -110.065 -110.07 -110.075 -110.08 -110.085 -110.09 -110.095 -110.1 -110.105 -110.11 -110.115 -110.12 -110.125 -110.13 -110.135 -110.14 -110.145 -110.15 -110.155 -110.16 -110.165 -110.17 -110.175 -110.18 -110.185 -110.19 -110.195 -110.2 -110.205 -110.21 -110.215 -110.22 -110.225 -110.23 -110.235 -110.24 -110.245 -110.25 -110.255 -110.26 -110.265 -110.27 -110.275 -110.28 -110.285 -110.29 -110.295 -110.3 -110.305 -110.31 -110.315 -110.32 -110.325 -110.33 -110.335 -110.34 -110.345 -110.35 -110.355 -110.36 -110.365 -110.37 -110.375 -110.38 -110.385 -110.39 -110.395 -110.4 -110.405 -110.41 -110.415 -110.42 -110.425 -110.43 -110.435 -110.44 -110.445 -110.45 -110.455 -110.46 -110.465 -110.47 -110.475 -110.48 -110.485 -110.49 -110.495 -110.5 -110.505 -110.51 -110.515 -110.52 -110.525 -110.53 -110.535 -110.54 -110.545 -110.55 -110.555 -110.56 -110.565 -110.57 -110.575 -110.58 -110.585 -110.59 -110.595 -110.6 -110.605 -110.61 -110.615 -110.62 -110.625 -110.63 -110.635 -110.64 -110.645 -110.65 -110.655 -110.66 -110.665 -110.67 -110.675 -110.68 -110.685 -110.69 -110.695 -110.7 -110.705 -110.71 -110.715 -110.72 -110.725 -110.73 -110.735 -110.74 -110.745 -110.75 -110.755 -110.76 -110.765 -110.77 -110.775 -110.78 -110.785 -110.79 -110.795 -110.8 -110.805 -110.81 -110.815 -110.82 -110.825 -110.83 -110.835 -110.84 -110.845 -110.85 -110.855 -110.86 -110.865 -110.87 -110.875 -110.88 -110.885 -110.89 -110.895 -110.9 -110.905 -110.91 -110.915 -110.92 -110.925 -110.93 -110.935 -110.94 -110.945 -110.95 -110.955 -110.96 -110.965 -110.97 -110.975 -110.98 -110.985 -110.99 -110.995 -111 -111.005 -111.01 -111.015 -111.02 -111.025 -111.03 -111.035 -111.04 -111.045 -111.05 -111.055 -111.06 -111.065 -111.07 -111.075 -111.08 -111.085 -111.09 -111.095 -111.1 -111.105 -111.11 -111.115 -111.12 -111.125 -111.13 -111.135 -111.14 -111.145 -111.15 -111.155 -111.16 -111.165 -111.17 -111.175 -111.18 -111.185 -111.19 -111.195 -111.2 -111.205 -111.21 -111.215 -111.22 -111.225 -111.23 -111.235 -111.24 -111.245 -111.25 -111.255 -111.26 -111.265 -111.27 -111.275 -111.28 -111.285 -111.29 -111.295 -111.3 -111.305 -111.31 -111.315 -111.32 -111.325 -111.33 -111.335 -111.34 -111.345 -111.35 -111.355 -111.36 -111.365 -111.37 -111.375 -111.38 -111.385 -111.39 -111.395 -111.4 -111.405 -111.41 -111.415 -111.42 -111.425 -111.43 -111.435 -111.44 -111.445 -111.45 -111.455 -111.46 -111.465 -111.47 -111.475 -111.48 -111.485 -111.49 -111.495 -111.5 -111.505 -111.51 -111.515 -111.52 -111.525 -111.53 -111.535 -111.54 -111.545 -111.55 -111.555 -111.56 -111.565 -111.57 -111.575 -111.58 -111.585 -111.59 -111.595 -111.6 -111.605 -111.61 -111.615 -111.62 -111.625 -111.63 -111.635 -111.64 -111.645 -111.65 -111.655 -111.66 -111.665 -111.67 -111.675 -111.68 -111.685 -111.69 -111.695 -111.7 -111.705 -111.71 -111.715 -111.72 -111.725 -111.73 -111.735 -111.74 -111.745 -111.75 -111.755 -111.76 -111.765 -111.77 -111.775 -111.78 -111.785 -111.79 -111.795 -111.8 -111.805 -111.81 -111.815 -111.82 -111.825 -111.83 -111.835 -111.84 -111.845 -111.85 -111.855 -111.86 -111.865 -111.87 -111.875 -111.88 -111.885 -111.89 -111.895 -111.9 -111.905 -111.91 -111.915 -111.92 -111.925 -111.93 -111.935 -111.94 -111.945 -111.95 -111.955 -111.96 -111.965 -111.97 -111.975 -111.98 -111.985 -111.99 -111.995 -112 -112.005 -112.01 -112.015 -112.02 -112.025 -112.03 -112.035 -112.04 -112.045 -112.05 -112.055 -112.06 -112.065 -112.07 -112.075 -112.08 -112.085 -112.09 -112.095 -112.1 -112.105 -112.11 -112.115 -112.12 -112.125 -112.13 -112.135 -112.14 -112.145 -112.15 -112.155 -112.16 -112.165 -112.17 -112.175 -112.18 -112.185 -112.19 -112.195 -112.2 -112.205 -112.21 -112.215 -112.22 -112.225 -112.23 -112.235 -112.24 -112.245 -112.25 -112.255 -112.26 -112.265 -112.27 -112.275 -112.28 -112.285 -112.29 -112.295 -112.3 -112.305 -112.31 -112.315 -112.32 -112.325 -112.33 -112.335 -112.34 -112.345 -112.35 -112.355 -112.36 -112.365 -112.37 -112.375 -112.38 -112.385 -112.39 -112.395 -112.4 -112.405 -112.41 -112.415 -112.42 -112.425 -112.43 -112.435 -112.44 -112.445 -112.45 -112.455 -112.46 -112.465 -112.47 -112.475 -112.48 -112.485 -112.49 -112.495 -112.5 -112.505 -112.51 -112.515 -112.52 -112.525 -112.53 -112.535 -112.54 -112.545 -112.55 -112.555 -112.56 -112.565 -112.57 -112.575 -112.58 -112.585 -112.59 -112.595 -112.6 -112.605 -112.61 -112.615 -112.62 -112.625 -112.63 -112.635 -112.64 -112.645 -112.65 -112.655 -112.66 -112.665 -112.67 -112.675 -112.68 -112.685 -112.69 -112.695 -112.7 -112.705 -112.71 -112.715 -112.72 -112.725 -112.73 -112.735 -112.74 -112.745 -112.75 -112.755 -112.76 -112.765 -112.77 -112.775 -112.78 -112.785 -112.79 -112.795 -112.8 -112.805 -112.81 -112.815 -112.82 -112.825 -112.83 -112.835 -112.84 -112.845 -112.85 -112.855 -112.86 -112.865 -112.87 -112.875 -112.88 -112.885 -112.89 -112.895 -112.9 -112.905 -112.91 -112.915 -112.92 -112.925 -112.93 -112.935 -112.94 -112.945 -112.95 -112.955 -112.96 -112.965 -112.97 -112.975 -112.98 -112.985 -112.99 -112.995 -113 -113.005 -113.01 -113.015 -113.02 -113.025 -113.03 -113.035 -113.04 -113.045 -113.05 -113.055 -113.06 -113.065 -113.07 -113.075 -113.08 -113.085 -113.09 -113.095 -113.1 -113.105 -113.11 -113.115 -113.12 -113.125 -113.13 -113.135 -113.14 -113.145 -113.15 -113.155 -113.16 -113.165 -113.17 -113.175 -113.18 -113.185 -113.19 -113.195 -113.2 -113.205 -113.21 -113.215 -113.22 -113.225 -113.23 -113.235 -113.24 -113.245 -113.25 -113.255 -113.26 -113.265 -113.27 -113.275 -113.28 -113.285 -113.29 -113.295 -113.3 -113.305 -113.31 -113.315 -113.32 -113.325 -113.33 -113.335 -113.34 -113.345 -113.35 -113.355 -113.36 -113.365 -113.37 -113.375 -113.38 -113.385 -113.39 -113.395 -113.4 -113.405 -113.41 -113.415 -113.42 -113.425 -113.43 -113.435 -113.44 -113.445 -113.45 -113.455 -113.46 -113.465 -113.47 -113.475 -113.48 -113.485 -113.49 -113.495 -113.5 -113.505 -113.51 -113.515 -113.52 -113.525 -113.53 -113.535 -113.54 -113.545 -113.55 -113.555 -113.56 -113.565 -113.57 -113.575 -113.58 -113.585 -113.59 -113.595 -113.6 -113.605 -113.61 -113.615 -113.62 -113.625 -113.63 -113.635 -113.64 -113.645 -113.65 -113.655 -113.66 -113.665 -113.67 -113.675 -113.68 -113.685 -113.69 -113.695 -113.7 -113.705 -113.71 -113.715 -113.72 -113.725 -113.73 -113.735 -113.74 -113.745 -113.75 -113.755 -113.76 -113.765 -113.77 -113.775 -113.78 -113.785 -113.79 -113.795 -113.8 -113.805 -113.81 -113.815 -113.82 -113.825 -113.83 -113.835 -113.84 -113.845 -113.85 -113.855 -113.86 -113.865 -113.87 -113.875 -113.88 -113.885 -113.89 -113.895 -113.9 -113.905 -113.91 -113.915 -113.92 -113.925 -113.93 -113.935 -113.94 -113.945 -113.95 -113.955 -113.96 -113.965 -113.97 -113.975 -113.98 -113.985 -113.99 -113.995 -114 -114.005 -114.01 -114.015 -114.02 -114.025 -114.03 -114.035 -114.04 -114.045 -114.05 -114.055 -114.06 -114.065 -114.07 -114.075 -114.08 -114.085 -114.09 -114.095 -114.1 -114.105 -114.11 -114.115 -114.12 -114.125 -114.13 -114.135 -114.14 -114.145 -114.15 -114.155 -114.16 -114.165 -114.17 -114.175 -114.18 -114.185 -114.19 -114.195 -114.2 -114.205 -114.21 -114.215 -114.22 -114.225 -114.23 -114.235 -114.24 -114.245 -114.25 -114.255 -114.26 -114.265 -114.27 -114.275 -114.28 -114.285 -114.29 -114.295 -114.3 -114.305 -114.31 -114.315 -114.32 -114.325 -114.33 -114.335 -114.34 -114.345 -114.35 -114.355 -114.36 -114.365 -114.37 -114.375 -114.38 -114.385 -114.39 -114.395 -114.4 -114.405 -114.41 -114.415 -114.42 -114.425 -114.43 -114.435 -114.44 -114.445 -114.45 -114.455 -114.46 -114.465 -114.47 -114.475 -114.48 -114.485 -114.49 -114.495 -114.5 -114.505 -114.51 -114.515 -114.52 -114.525 -114.53 -114.535 -114.54 -114.545 -114.55 -114.555 -114.56 -114.565 -114.57 -114.575 -114.58 -114.585 -114.59 -114.595 -114.6 -114.605 -114.61 -114.615 -114.62 -114.625 -114.63 -114.635 -114.64 -114.645 -114.65 -114.655 -114.66 -114.665 -114.67 -114.675 -114.68 -114.685 -114.69 -114.695 -114.7 -114.705 -114.71 -114.715 -114.72 -114.725 -114.73 -114.735 -114.74 -114.745 -114.75 -114.755 -114.76 -114.765 -114.77 -114.775 -114.78 -114.785 -114.79 -114.795 -114.8 -114.805 -114.81 -114.815 -114.82 -114.825 -114.83 -114.835 -114.84 -114.845 -114.85 -114.855 -114.86 -114.865 -114.87 -114.875 -114.88 -114.885 -114.89 -114.895 -114.9 -114.905 -114.91 -114.915 -114.92 -114.925 -114.93 -114.935 -114.94 -114.945 -114.95 -114.955 -114.96 -114.965 -114.97 -114.975 -114.98 -114.985 -114.99 -114.995 -115 -115.005 -115.01 -115.015 -115.02 -115.025 -115.03 -115.035 -115.04 -115.045 -115.05 -115.055 -115.06 -115.065 -115.07 -115.075 -115.08 -115.085 -115.09 -115.095 -115.1 -115.105 -115.11 -115.115 -115.12 -115.125 -115.13 -115.135 -115.14 -115.145 -115.15 -115.155 -115.16 -115.165 -115.17 -115.175 -115.18 -115.185 -115.19 -115.195 -115.2 -115.205 -115.21 -115.215 -115.22 -115.225 -115.23 -115.235 -115.24 -115.245 -115.25 -115.255 -115.26 -115.265 -115.27 -115.275 -115.28 -115.285 -115.29 -115.295 -115.3 -115.305 -115.31 -115.315 -115.32 -115.325 -115.33 -115.335 -115.34 -115.345 -115.35 -115.355 -115.36 -115.365 -115.37 -115.375 -115.38 -115.385 -115.39 -115.395 -115.4 -115.405 -115.41 -115.415 -115.42 -115.425 -115.43 -115.435 -115.44 -115.445 -115.45 -115.455 -115.46 -115.465 -115.47 -115.475 -115.48 -115.485 -115.49 -115.495 -115.5 -115.505 -115.51 -115.515 -115.52 -115.525 -115.53 -115.535 -115.54 -115.545 -115.55 -115.555 -115.56 -115.565 -115.57 -115.575 -115.58 -115.585 -115.59 -115.595 -115.6 -115.605 -115.61 -115.615 -115.62 -115.625 -115.63 -115.635 -115.64 -115.645 -115.65 -115.655 -115.66 -115.665 -115.67 -115.675 -115.68 -115.685 -115.69 -115.695 -115.7 -115.705 -115.71 -115.715 -115.72 -115.725 -115.73 -115.735 -115.74 -115.745 -115.75 -115.755 -115.76 -115.765 -115.77 -115.775 -115.78 -115.785 -115.79 -115.795 -115.8 -115.805 -115.81 -115.815 -115.82 -115.825 -115.83 -115.835 -115.84 -115.845 -115.85 -115.855 -115.86 -115.865 -115.87 -115.875 -115.88 -115.885 -115.89 -115.895 -115.9 -115.905 -115.91 -115.915 -115.92 -115.925 -115.93 -115.935 -115.94 -115.945 -115.95 -115.955 -115.96 -115.965 -115.97 -115.975 -115.98 -115.985 -115.99 -115.995 -116 -116.005 -116.01 -116.015 -116.02 -116.025 -116.03 -116.035 -116.04 -116.045 -116.05 -116.055 -116.06 -116.065 -116.07 -116.075 -116.08 -116.085 -116.09 -116.095 -116.1 -116.105 -116.11 -116.115 -116.12 -116.125 -116.13 -116.135 -116.14 -116.145 -116.15 -116.155 -116.16 -116.165 -116.17 -116.175 -116.18 -116.185 -116.19 -116.195 -116.2 -116.205 -116.21 -116.215 -116.22 -116.225 -116.23 -116.235 -116.24 -116.245 -116.25 -116.255 -116.26 -116.265 -116.27 -116.275 -116.28 -116.285 -116.29 -116.295 -116.3 -116.305 -116.31 -116.315 -116.32 -116.325 -116.33 -116.335 -116.34 -116.345 -116.35 -116.355 -116.36 -116.365 -116.37 -116.375 -116.38 -116.385 -116.39 -116.395 -116.4 -116.405 -116.41 -116.415 -116.42 -116.425 -116.43 -116.435 -116.44 -116.445 -116.45 -116.455 -116.46 -116.465 -116.47 -116.475 -116.48 -116.485 -116.49 -116.495 -116.5 -116.505 -116.51 -116.515 -116.52 -116.525 -116.53 -116.535 -116.54 -116.545 -116.55 -116.555 -116.56 -116.565 -116.57 -116.575 -116.58 -116.585 -116.59 -116.595 -116.6 -116.605 -116.61 -116.615 -116.62 -116.625 -116.63 -116.635 -116.64 -116.645 -116.65 -116.655 -116.66 -116.665 -116.67 -116.675 -116.68 -116.685 -116.69 -116.695 -116.7 -116.705 -116.71 -116.715 -116.72 -116.725 -116.73 -116.735 -116.74 -116.745 -116.75 -116.755 -116.76 -116.765 -116.77 -116.775 -116.78 -116.785 -116.79 -116.795 -116.8 -116.805 -116.81 -116.815 -116.82 -116.825 -116.83 -116.835 -116.84 -116.845 -116.85 -116.855 -116.86 -116.865 -116.87 -116.875 -116.88 -116.885 -116.89 -116.895 -116.9 -116.905 -116.91 -116.915 -116.92 -116.925 -116.93 -116.935 -116.94 -116.945 -116.95 -116.955 -116.96 -116.965 -116.97 -116.975 -116.98 -116.985 -116.99 -116.995 -117 -117.005 -117.01 -117.015 -117.02 -117.025 -117.03 -117.035 -117.04 -117.045 -117.05 -117.055 -117.06 -117.065 -117.07 -117.075 -117.08 -117.085 -117.09 -117.095 -117.1 -117.105 -117.11 -117.115 -117.12 -117.125 -117.13 -117.135 -117.14 -117.145 -117.15 -117.155 -117.16 -117.165 -117.17 -117.175 -117.18 -117.185 -117.19 -117.195 -117.2 -117.205 -117.21 -117.215 -117.22 -117.225 -117.23 -117.235 -117.24 -117.245 -117.25 -117.255 -117.26 -117.265 -117.27 -117.275 -117.28 -117.285 -117.29 -117.295 -117.3 -117.305 -117.31 -117.315 -117.32 -117.325 -117.33 -117.335 -117.34 -117.345 -117.35 -117.355 -117.36 -117.365 -117.37 -117.375 -117.38 -117.385 -117.39 -117.395 -117.4 -117.405 -117.41 -117.415 -117.42 -117.425 -117.43 -117.435 -117.44 -117.445 -117.45 -117.455 -117.46 -117.465 -117.47 -117.475 -117.48 -117.485 -117.49 -117.495 -117.5 -117.505 -117.51 -117.515 -117.52 -117.525 -117.53 -117.535 -117.54 -117.545 -117.55 -117.555 -117.56 -117.565 -117.57 -117.575 -117.58 -117.585 -117.59 -117.595 -117.6 -117.605 -117.61 -117.615 -117.62 -117.625 -117.63 -117.635 -117.64 -117.645 -117.65 -117.655 -117.66 -117.665 -117.67 -117.675 -117.68 -117.685 -117.69 -117.695 -117.7 -117.705 -117.71 -117.715 -117.72 -117.725 -117.73 -117.735 -117.74 -117.745 -117.75 -117.755 -117.76 -117.765 -117.77 -117.775 -117.78 -117.785 -117.79 -117.795 -117.8 -117.805 -117.81 -117.815 -117.82 -117.825 -117.83 -117.835 -117.84 -117.845 -117.85 -117.855 -117.86 -117.865 -117.87 -117.875 -117.88 -117.885 -117.89 -117.895 -117.9 -117.905 -117.91 -117.915 -117.92 -117.925 -117.93 -117.935 -117.94 -117.945 -117.95 -117.955 -117.96 -117.965 -117.97 -117.975 -117.98 -117.985 -117.99 -117.995 -118 -118.005 -118.01 -118.015 -118.02 -118.025 -118.03 -118.035 -118.04 -118.045 -118.05 -118.055 -118.06 -118.065 -118.07 -118.075 -118.08 -118.085 -118.09 -118.095 -118.1 -118.105 -118.11 -118.115 -118.12 -118.125 -118.13 -118.135 -118.14 -118.145 -118.15 -118.155 -118.16 -118.165 -118.17 -118.175 -118.18 -118.185 -118.19 -118.195 -118.2 -118.205 -118.21 -118.215 -118.22 -118.225 -118.23 -118.235 -118.24 -118.245 -118.25 -118.255 -118.26 -118.265 -118.27 -118.275 -118.28 -118.285 -118.29 -118.295 -118.3 -118.305 -118.31 -118.315 -118.32 -118.325 -118.33 -118.335 -118.34 -118.345 -118.35 -118.355 -118.36 -118.365 -118.37 -118.375 -118.38 -118.385 -118.39 -118.395 -118.4 -118.405 -118.41 -118.415 -118.42 -118.425 -118.43 -118.435 -118.44 -118.445 -118.45 -118.455 -118.46 -118.465 -118.47 -118.475 -118.48 -118.485 -118.49 -118.495 -118.5 -118.505 -118.51 -118.515 -118.52 -118.525 -118.53 -118.535 -118.54 -118.545 -118.55 -118.555 -118.56 -118.565 -118.57 -118.575 -118.58 -118.585 -118.59 -118.595 -118.6 -118.605 -118.61 -118.615 -118.62 -118.625 -118.63 -118.635 -118.64 -118.645 -118.65 -118.655 -118.66 -118.665 -118.67 -118.675 -118.68 -118.685 -118.69 -118.695 -118.7 -118.705 -118.71 -118.715 -118.72 -118.725 -118.73 -118.735 -118.74 -118.745 -118.75 -118.755 -118.76 -118.765 -118.77 -118.775 -118.78 -118.785 -118.79 -118.795 -118.8 -118.805 -118.81 -118.815 -118.82 -118.825 -118.83 -118.835 -118.84 -118.845 -118.85 -118.855 -118.86 -118.865 -118.87 -118.875 -118.88 -118.885 -118.89 -118.895 -118.9 -118.905 -118.91 -118.915 -118.92 -118.925 -118.93 -118.935 -118.94 -118.945 -118.95 -118.955 -118.96 -118.965 -118.97 -118.975 -118.98 -118.985 -118.99 -118.995 -119 -119.005 -119.01 -119.015 -119.02 -119.025 -119.03 -119.035 -119.04 -119.045 -119.05 -119.055 -119.06 -119.065 -119.07 -119.075 -119.08 -119.085 -119.09 -119.095 -119.1 -119.105 -119.11 -119.115 -119.12 -119.125 -119.13 -119.135 -119.14 -119.145 -119.15 -119.155 -119.16 -119.165 -119.17 -119.175 -119.18 -119.185 -119.19 -119.195 -119.2 -119.205 -119.21 -119.215 -119.22 -119.225 -119.23 -119.235 -119.24 -119.245 -119.25 -119.255 -119.26 -119.265 -119.27 -119.275 -119.28 -119.285 -119.29 -119.295 -119.3 -119.305 -119.31 -119.315 -119.32 -119.325 -119.33 -119.335 -119.34 -119.345 -119.35 -119.355 -119.36 -119.365 -119.37 -119.375 -119.38 -119.385 -119.39 -119.395 -119.4 -119.405 -119.41 -119.415 -119.42 -119.425 -119.43 -119.435 -119.44 -119.445 -119.45 -119.455 -119.46 -119.465 -119.47 -119.475 -119.48 -119.485 -119.49 -119.495 -119.5 -119.505 -119.51 -119.515 -119.52 -119.525 -119.53 -119.535 -119.54 -119.545 -119.55 -119.555 -119.56 -119.565 -119.57 -119.575 -119.58 -119.585 -119.59 -119.595 -119.6 -119.605 -119.61 -119.615 -119.62 -119.625 -119.63 -119.635 -119.64 -119.645 -119.65 -119.655 -119.66 -119.665 -119.67 -119.675 -119.68 -119.685 -119.69 -119.695 -119.7 -119.705 -119.71 -119.715 -119.72 -119.725 -119.73 -119.735 -119.74 -119.745 -119.75 -119.755 -119.76 -119.765 -119.77 -119.775 -119.78 -119.785 -119.79 -119.795 -119.8 -119.805 -119.81 -119.815 -119.82 -119.825 -119.83 -119.835 -119.84 -119.845 -119.85 -119.855 -119.86 -119.865 -119.87 -119.875 -119.88 -119.885 -119.89 -119.895 -119.9 -119.905 -119.91 -119.915 -119.92 -119.925 -119.93 -119.935 -119.94 -119.945 -119.95 -119.955 -119.96 -119.965 -119.97 -119.975 -119.98 -119.985 -119.99 -119.995 -120 -120.005 -120.01 -120.015 -120.02 -120.025 -120.03 -120.035 -120.04 -120.045 -120.05 -120.055 -120.06 -120.065 -120.07 -120.075 -120.08 -120.085 -120.09 -120.095 -120.1 -120.105 -120.11 -120.115 -120.12 -120.125 -120.13 -120.135 -120.14 -120.145 -120.15 -120.155 -120.16 -120.165 -120.17 -120.175 -120.18 -120.185 -120.19 -120.195 -120.2 -120.205 -120.21 -120.215 -120.22 -120.225 -120.23 -120.235 -120.24 -120.245 -120.25 -120.255 -120.26 -120.265 -120.27 -120.275 -120.28 -120.285 -120.29 -120.295 -120.3 -120.305 -120.31 -120.315 -120.32 -120.325 -120.33 -120.335 -120.34 -120.345 -120.35 -120.355 -120.36 -120.365 -120.37 -120.375 -120.38 -120.385 -120.39 -120.395 -120.4 -120.405 -120.41 -120.415 -120.42 -120.425 -120.43 -120.435 -120.44 -120.445 -120.45 -120.455 -120.46 -120.465 -120.47 -120.475 -120.48 -120.485 -120.49 -120.495 -120.5 -120.505 -120.51 -120.515 -120.52 -120.525 -120.53 -120.535 -120.54 -120.545 -120.55 -120.555 -120.56 -120.565 -120.57 -120.575 -120.58 -120.585 -120.59 -120.595 -120.6 -120.605 -120.61 -120.615 -120.62 -120.625 -120.63 -120.635 -120.64 -120.645 -120.65 -120.655 -120.66 -120.665 -120.67 -120.675 -120.68 -120.685 -120.69 -120.695 -120.7 -120.705 -120.71 -120.715 -120.72 -120.725 -120.73 -120.735 -120.74 -120.745 -120.75 -120.755 -120.76 -120.765 -120.77 -120.775 -120.78 -120.785 -120.79 -120.795 -120.8 -120.805 -120.81 -120.815 -120.82 -120.825 -120.83 -120.835 -120.84 -120.845 -120.85 -120.855 -120.86 -120.865 -120.87 -120.875 -120.88 -120.885 -120.89 -120.895 -120.9 -120.905 -120.91 -120.915 -120.92 -120.925 -120.93 -120.935 -120.94 -120.945 -120.95 -120.955 -120.96 -120.965 -120.97 -120.975 -120.98 -120.985 -120.99 -120.995 -121 -121.005 -121.01 -121.015 -121.02 -121.025 -121.03 -121.035 -121.04 -121.045 -121.05 -121.055 -121.06 -121.065 -121.07 -121.075 -121.08 -121.085 -121.09 -121.095 -121.1 -121.105 -121.11 -121.115 -121.12 -121.125 -121.13 -121.135 -121.14 -121.145 -121.15 -121.155 -121.16 -121.165 -121.17 -121.175 -121.18 -121.185 -121.19 -121.195 -121.2 -121.205 -121.21 -121.215 -121.22 -121.225 -121.23 -121.235 -121.24 -121.245 -121.25 -121.255 -121.26 -121.265 -121.27 -121.275 -121.28 -121.285 -121.29 -121.295 -121.3 -121.305 -121.31 -121.315 -121.32 -121.325 -121.33 -121.335 -121.34 -121.345 -121.35 -121.355 -121.36 -121.365 -121.37 -121.375 -121.38 -121.385 -121.39 -121.395 -121.4 -121.405 -121.41 -121.415 -121.42 -121.425 -121.43 -121.435 -121.44 -121.445 -121.45 -121.455 -121.46 -121.465 -121.47 -121.475 -121.48 -121.485 -121.49 -121.495 -121.5 -121.505 -121.51 -121.515 -121.52 -121.525 -121.53 -121.535 -121.54 -121.545 -121.55 -121.555 -121.56 -121.565 -121.57 -121.575 -121.58 -121.585 -121.59 -121.595 -121.6 -121.605 -121.61 -121.615 -121.62 -121.625 -121.63 -121.635 -121.64 -121.645 -121.65 -121.655 -121.66 -121.665 -121.67 -121.675 -121.68 -121.685 -121.69 -121.695 -121.7 -121.705 -121.71 -121.715 -121.72 -121.725 -121.73 -121.735 -121.74 -121.745 -121.75 -121.755 -121.76 -121.765 -121.77 -121.775 -121.78 -121.785 -121.79 -121.795 -121.8 -121.805 -121.81 -121.815 -121.82 -121.825 -121.83 -121.835 -121.84 -121.845 -121.85 -121.855 -121.86 -121.865 -121.87 -121.875 -121.88 -121.885 -121.89 -121.895 -121.9 -121.905 -121.91 -121.915 -121.92 -121.925 -121.93 -121.935 -121.94 -121.945 -121.95 -121.955 -121.96 -121.965 -121.97 -121.975 -121.98 -121.985 -121.99 -121.995 -122 -122.005 -122.01 -122.015 -122.02 -122.025 -122.03 -122.035 -122.04 -122.045 -122.05 -122.055 -122.06 -122.065 -122.07 -122.075 -122.08 -122.085 -122.09 -122.095 -122.1 -122.105 -122.11 -122.115 -122.12 -122.125 -122.13 -122.135 -122.14 -122.145 -122.15 -122.155 -122.16 -122.165 -122.17 -122.175 -122.18 -122.185 -122.19 -122.195 -122.2 -122.205 -122.21 -122.215 -122.22 -122.225 -122.23 -122.235 -122.24 -122.245 -122.25 -122.255 -122.26 -122.265 -122.27 -122.275 -122.28 -122.285 -122.29 -122.295 -122.3 -122.305 -122.31 -122.315 -122.32 -122.325 -122.33 -122.335 -122.34 -122.345 -122.35 -122.355 -122.36 -122.365 -122.37 -122.375 -122.38 -122.385 -122.39 -122.395 -122.4 -122.405 -122.41 -122.415 -122.42 -122.425 -122.43 -122.435 -122.44 -122.445 -122.45 -122.455 -122.46 -122.465 -122.47 -122.475 -122.48 -122.485 -122.49 -122.495 -122.5 -122.505 -122.51 -122.515 -122.52 -122.525 -122.53 -122.535 -122.54 -122.545 -122.55 -122.555 -122.56 -122.565 -122.57 -122.575 -122.58 -122.585 -122.59 -122.595 -122.6 -122.605 -122.61 -122.615 -122.62 -122.625 -122.63 -122.635 -122.64 -122.645 -122.65 -122.655 -122.66 -122.665 -122.67 -122.675 -122.68 -122.685 -122.69 -122.695 -122.7 -122.705 -122.71 -122.715 -122.72 -122.725 -122.73 -122.735 -122.74 -122.745 -122.75 -122.755 -122.76 -122.765 -122.77 -122.775 -122.78 -122.785 -122.79 -122.795 -122.8 -122.805 -122.81 -122.815 -122.82 -122.825 -122.83 -122.835 -122.84 -122.845 -122.85 -122.855 -122.86 -122.865 -122.87 -122.875 -122.88 -122.885 -122.89 -122.895 -122.9 -122.905 -122.91 -122.915 -122.92 -122.925 -122.93 -122.935 -122.94 -122.945 -122.95 -122.955 -122.96 -122.965 -122.97 -122.975 -122.98 -122.985 -122.99 -122.995 -123 -123.005 -123.01 -123.015 -123.02 -123.025 -123.03 -123.035 -123.04 -123.045 -123.05 -123.055 -123.06 -123.065 -123.07 -123.075 -123.08 -123.085 -123.09 -123.095 -123.1 -123.105 -123.11 -123.115 -123.12 -123.125 -123.13 -123.135 -123.14 -123.145 -123.15 -123.155 -123.16 -123.165 -123.17 -123.175 -123.18 -123.185 -123.19 -123.195 -123.2 -123.205 -123.21 -123.215 -123.22 -123.225 -123.23 -123.235 -123.24 -123.245 -123.25 -123.255 -123.26 -123.265 -123.27 -123.275 -123.28 -123.285 -123.29 -123.295 -123.3 -123.305 -123.31 -123.315 -123.32 -123.325 -123.33 -123.335 -123.34 -123.345 -123.35 -123.355 -123.36 -123.365 -123.37 -123.375 -123.38 -123.385 -123.39 -123.395 -123.4 -123.405 -123.41 -123.415 -123.42 -123.425 -123.43 -123.435 -123.44 -123.445 -123.45 -123.455 -123.46 -123.465 -123.47 -123.475 -123.48 -123.485 -123.49 -123.495 -123.5 -123.505 -123.51 -123.515 -123.52 -123.525 -123.53 -123.535 -123.54 -123.545 -123.55 -123.555 -123.56 -123.565 -123.57 -123.575 -123.58 -123.585 -123.59 -123.595 -123.6 -123.605 -123.61 -123.615 -123.62 -123.625 -123.63 -123.635 -123.64 -123.645 -123.65 -123.655 -123.66 -123.665 -123.67 -123.675 -123.68 -123.685 -123.69 -123.695 -123.7 -123.705 -123.71 -123.715 -123.72 -123.725 -123.73 -123.735 -123.74 -123.745 -123.75 -123.755 -123.76 -123.765 -123.77 -123.775 -123.78 -123.785 -123.79 -123.795 -123.8 -123.805 -123.81 -123.815 -123.82 -123.825 -123.83 -123.835 -123.84 -123.845 -123.85 -123.855 -123.86 -123.865 -123.87 -123.875 -123.88 -123.885 -123.89 -123.895 -123.9 -123.905 -123.91 -123.915 -123.92 -123.925 -123.93 -123.935 -123.94 -123.945 -123.95 -123.955 -123.96 -123.965 -123.97 -123.975 -123.98 -123.985 -123.99 -123.995 -124 -124.005 -124.01 -124.015 -124.02 -124.025 -124.03 -124.035 -124.04 -124.045 -124.05 -124.055 -124.06 -124.065 -124.07 -124.075 -124.08 -124.085 -124.09 -124.095 -124.1 -124.105 -124.11 -124.115 -124.12 -124.125 -124.13 -124.135 -124.14 -124.145 -124.15 -124.155 -124.16 -124.165 -124.17 -124.175 -124.18 -124.185 -124.19 -124.195 -124.2 -124.205 -124.21 -124.215 -124.22 -124.225 -124.23 -124.235 -124.24 -124.245 -124.25 -124.255 -124.26 -124.265 -124.27 -124.275 -124.28 -124.285 -124.29 -124.295 -124.3 -124.305 -124.31 -124.315 -124.32 -124.325 -124.33 -124.335 -124.34 -124.345 -124.35 -124.355 -124.36 -124.365 -124.37 -124.375 -124.38 -124.385 -124.39 -124.395 -124.4 -124.405 -124.41 -124.415 -124.42 -124.425 -124.43 -124.435 -124.44 -124.445 -124.45 -124.455 -124.46 -124.465 -124.47 -124.475 -124.48 -124.485 -124.49 -124.495 -124.5 -124.505 -124.51 -124.515 -124.52 -124.525 -124.53 -124.535 -124.54 -124.545 -124.55 -124.555 -124.56 -124.565 -124.57 -124.575 -124.58 -124.585 -124.59 -124.595 -124.6 -124.605 -124.61 -124.615 -124.62 -124.625 -124.63 -124.635 -124.64 -124.645 -124.65 -124.655 -124.66 -124.665 -124.67 -124.675 -124.68 -124.685 -124.69 -124.695 -124.7 -124.705 -124.71 -124.715 -124.72 -124.725 -124.73 -124.735 -124.74 -124.745 -124.75 -124.755 -124.76 -124.765 -124.77 -124.775 -124.78 -124.785 -124.79 -124.795 -124.8 -124.805 -124.81 -124.815 -124.82 -124.825 -124.83 -124.835 -124.84 -124.845 -124.85 -124.855 -124.86 -124.865 -124.87 -124.875 -124.88 -124.885 -124.89 -124.895 -124.9 -124.905 -124.91 -124.915 -124.92 -124.925 -124.93 -124.935 -124.94 -124.945 -124.95 -124.955 -124.96 -124.965 -124.97 -124.975 -124.98 -124.985 -124.99 -124.995 -125 -125.005 -125.01 -125.015 -125.02 -125.025 -125.03 -125.035 -125.04 -125.045 -125.05 -125.055 -125.06 -125.065 -125.07 -125.075 -125.08 -125.085 -125.09 -125.095 -125.1 -125.105 -125.11 -125.115 -125.12 -125.125 -125.13 -125.135 -125.14 -125.145 -125.15 -125.155 -125.16 -125.165 -125.17 -125.175 -125.18 -125.185 -125.19 -125.195 -125.2 -125.205 -125.21 -125.215 -125.22 -125.225 -125.23 -125.235 -125.24 -125.245 -125.25 -125.255 -125.26 -125.265 -125.27 -125.275 -125.28 -125.285 -125.29 -125.295 -125.3 -125.305 -125.31 -125.315 -125.32 -125.325 -125.33 -125.335 -125.34 -125.345 -125.35 -125.355 -125.36 -125.365 -125.37 -125.375 -125.38 -125.385 -125.39 -125.395 -125.4 -125.405 -125.41 -125.415 -125.42 -125.425 -125.43 -125.435 -125.44 -125.445 -125.45 -125.455 -125.46 -125.465 -125.47 -125.475 -125.48 -125.485 -125.49 -125.495 -125.5 -125.505 -125.51 -125.515 -125.52 -125.525 -125.53 -125.535 -125.54 -125.545 -125.55 -125.555 -125.56 -125.565 -125.57 -125.575 -125.58 -125.585 -125.59 -125.595 -125.6 -125.605 -125.61 -125.615 -125.62 -125.625 -125.63 -125.635 -125.64 -125.645 -125.65 -125.655 -125.66 -125.665 -125.67 -125.675 -125.68 -125.685 -125.69 -125.695 -125.7 -125.705 -125.71 -125.715 -125.72 -125.725 -125.73 -125.735 -125.74 -125.745 -125.75 -125.755 -125.76 -125.765 -125.77 -125.775 -125.78 -125.785 -125.79 -125.795 -125.8 -125.805 -125.81 -125.815 -125.82 -125.825 -125.83 -125.835 -125.84 -125.845 -125.85 -125.855 -125.86 -125.865 -125.87 -125.875 -125.88 -125.885 -125.89 -125.895 -125.9 -125.905 -125.91 -125.915 -125.92 -125.925 -125.93 -125.935 -125.94 -125.945 -125.95 -125.955 -125.96 -125.965 -125.97 -125.975 -125.98 -125.985 -125.99 -125.995 -126 -126.005 -126.01 -126.015 -126.02 -126.025 -126.03 -126.035 -126.04 -126.045 -126.05 -126.055 -126.06 -126.065 -126.07 -126.075 -126.08 -126.085 -126.09 -126.095 -126.1 -126.105 -126.11 -126.115 -126.12 -126.125 -126.13 -126.135 -126.14 -126.145 -126.15 -126.155 -126.16 -126.165 -126.17 -126.175 -126.18 -126.185 -126.19 -126.195 -126.2 -126.205 -126.21 -126.215 -126.22 -126.225 -126.23 -126.235 -126.24 -126.245 -126.25 -126.255 -126.26 -126.265 -126.27 -126.275 -126.28 -126.285 -126.29 -126.295 -126.3 -126.305 -126.31 -126.315 -126.32 -126.325 -126.33 -126.335 -126.34 -126.345 -126.35 -126.355 -126.36 -126.365 -126.37 -126.375 -126.38 -126.385 -126.39 -126.395 -126.4 -126.405 -126.41 -126.415 -126.42 -126.425 -126.43 -126.435 -126.44 -126.445 -126.45 -126.455 -126.46 -126.465 -126.47 -126.475 -126.48 -126.485 -126.49 -126.495 -126.5 -126.505 -126.51 -126.515 -126.52 -126.525 -126.53 -126.535 -126.54 -126.545 -126.55 -126.555 -126.56 -126.565 -126.57 -126.575 -126.58 -126.585 -126.59 -126.595 -126.6 -126.605 -126.61 -126.615 -126.62 -126.625 -126.63 -126.635 -126.64 -126.645 -126.65 -126.655 -126.66 -126.665 -126.67 -126.675 -126.68 -126.685 -126.69 -126.695 -126.7 -126.705 -126.71 -126.715 -126.72 -126.725 -126.73 -126.735 -126.74 -126.745 -126.75 -126.755 -126.76 -126.765 -126.77 -126.775 -126.78 -126.785 -126.79 -126.795 -126.8 -126.805 -126.81 -126.815 -126.82 -126.825 -126.83 -126.835 -126.84 -126.845 -126.85 -126.855 -126.86 -126.865 -126.87 -126.875 -126.88 -126.885 -126.89 -126.895 -126.9 -126.905 -126.91 -126.915 -126.92 -126.925 -126.93 -126.935 -126.94 -126.945 -126.95 -126.955 -126.96 -126.965 -126.97 -126.975 -126.98 -126.985 -126.99 -126.995 -127 -127.005 -127.01 -127.015 -127.02 -127.025 -127.03 -127.035 -127.04 -127.045 -127.05 -127.055 -127.06 -127.065 -127.07 -127.075 -127.08 -127.085 -127.09 -127.095 -127.1 -127.105 -127.11 -127.115 -127.12 -127.125 -127.13 -127.135 -127.14 -127.145 -127.15 -127.155 -127.16 -127.165 -127.17 -127.175 -127.18 -127.185 -127.19 -127.195 -127.2 -127.205 -127.21 -127.215 -127.22 -127.225 -127.23 -127.235 -127.24 -127.245 -127.25 -127.255 -127.26 -127.265 -127.27 -127.275 -127.28 -127.285 -127.29 -127.295 -127.3 -127.305 -127.31 -127.315 -127.32 -127.325 -127.33 -127.335 -127.34 -127.345 -127.35 -127.355 -127.36 -127.365 -127.37 -127.375 -127.38 -127.385 -127.39 -127.395 -127.4 -127.405 -127.41 -127.415 -127.42 -127.425 -127.43 -127.435 -127.44 -127.445 -127.45 -127.455 -127.46 -127.465 -127.47 -127.475 -127.48 -127.485 -127.49 -127.495 -127.5 -127.505 -127.51 -127.515 -127.52 -127.525 -127.53 -127.535 -127.54 -127.545 -127.55 -127.555 -127.56 -127.565 -127.57 -127.575 -127.58 -127.585 -127.59 -127.595 -127.6 -127.605 -127.61 -127.615 -127.62 -127.625 -127.63 -127.635 -127.64 -127.645 -127.65 -127.655 -127.66 -127.665 -127.67 -127.675 -127.68 -127.685 -127.69 -127.695 -127.7 -127.705 -127.71 -127.715 -127.72 -127.725 -127.73 -127.735 -127.74 -127.745 -127.75 -127.755 -127.76 -127.765 -127.77 -127.775 -127.78 -127.785 -127.79 -127.795 -127.8 -127.805 -127.81 -127.815 -127.82 -127.825 -127.83 -127.835 -127.84 -127.845 -127.85 -127.855 -127.86 -127.865 -127.87 -127.875 -127.88 -127.885 -127.89 -127.895 -127.9 -127.905 -127.91 -127.915 -127.92 -127.925 -127.93 -127.935 -127.94 -127.945 -127.95 -127.955 -127.96 -127.965 -127.97 -127.975 -127.98 -127.985 -127.99 -127.995 -128 -128.005 -128.01 -128.015 -128.02 -128.025 -128.03 -128.035 -128.04 -128.045 -128.05 -128.055 -128.06 -128.065 -128.07 -128.075 -128.08 -128.085 -128.09 -128.095 -128.1 -128.105 -128.11 -128.115 -128.12 -128.125 -128.13 -128.135 -128.14 -128.145 -128.15 -128.155 -128.16 -128.165 -128.17 -128.175 -128.18 -128.185 -128.19 -128.195 -128.2 -128.205 -128.21 -128.215 -128.22 -128.225 -128.23 -128.235 -128.24 -128.245 -128.25 -128.255 -128.26 -128.265 -128.27 -128.275 -128.28 -128.285 -128.29 -128.295 -128.3 -128.305 -128.31 -128.315 -128.32 -128.325 -128.33 -128.335 -128.34 -128.345 -128.35 -128.355 -128.36 -128.365 -128.37 -128.375 -128.38 -128.385 -128.39 -128.395 -128.4 -128.405 -128.41 -128.415 -128.42 -128.425 -128.43 -128.435 -128.44 -128.445 -128.45 -128.455 -128.46 -128.465 -128.47 -128.475 -128.48 -128.485 -128.49 -128.495 -128.5 -128.505 -128.51 -128.515 -128.52 -128.525 -128.53 -128.535 -128.54 -128.545 -128.55 -128.555 -128.56 -128.565 -128.57 -128.575 -128.58 -128.585 -128.59 -128.595 -128.6 -128.605 -128.61 -128.615 -128.62 -128.625 -128.63 -128.635 -128.64 -128.645 -128.65 -128.655 -128.66 -128.665 -128.67 -128.675 -128.68 -128.685 -128.69 -128.695 -128.7 -128.705 -128.71 -128.715 -128.72 -128.725 -128.73 -128.735 -128.74 -128.745 -128.75 -128.755 -128.76 -128.765 -128.77 -128.775 -128.78 -128.785 -128.79 -128.795 -128.8 -128.805 -128.81 -128.815 -128.82 -128.825 -128.83 -128.835 -128.84 -128.845 -128.85 -128.855 -128.86 -128.865 -128.87 -128.875 -128.88 -128.885 -128.89 -128.895 -128.9 -128.905 -128.91 -128.915 -128.92 -128.925 -128.93 -128.935 -128.94 -128.945 -128.95 -128.955 -128.96 -128.965 -128.97 -128.975 -128.98 -128.985 -128.99 -128.995 -129 -129.005 -129.01 -129.015 -129.02 -129.025 -129.03 -129.035 -129.04 -129.045 -129.05 -129.055 -129.06 -129.065 -129.07 -129.075 -129.08 -129.085 -129.09 -129.095 -129.1 -129.105 -129.11 -129.115 -129.12 -129.125 -129.13 -129.135 -129.14 -129.145 -129.15 -129.155 -129.16 -129.165 -129.17 -129.175 -129.18 -129.185 -129.19 -129.195 -129.2 -129.205 -129.21 -129.215 -129.22 -129.225 -129.23 -129.235 -129.24 -129.245 -129.25 -129.255 -129.26 -129.265 -129.27 -129.275 -129.28 -129.285 -129.29 -129.295 -129.3 -129.305 -129.31 -129.315 -129.32 -129.325 -129.33 -129.335 -129.34 -129.345 -129.35 -129.355 -129.36 -129.365 -129.37 -129.375 -129.38 -129.385 -129.39 -129.395 -129.4 -129.405 -129.41 -129.415 -129.42 -129.425 -129.43 -129.435 -129.44 -129.445 -129.45 -129.455 -129.46 -129.465 -129.47 -129.475 -129.48 -129.485 -129.49 -129.495 -129.5 -129.505 -129.51 -129.515 -129.52 -129.525 -129.53 -129.535 -129.54 -129.545 -129.55 -129.555 -129.56 -129.565 -129.57 -129.575 -129.58 -129.585 -129.59 -129.595 -129.6 -129.605 -129.61 -129.615 -129.62 -129.625 -129.63 -129.635 -129.64 -129.645 -129.65 -129.655 -129.66 -129.665 -129.67 -129.675 -129.68 -129.685 -129.69 -129.695 -129.7 -129.705 -129.71 -129.715 -129.72 -129.725 -129.73 -129.735 -129.74 -129.745 -129.75 -129.755 -129.76 -129.765 -129.77 -129.775 -129.78 -129.785 -129.79 -129.795 -129.8 -129.805 -129.81 -129.815 -129.82 -129.825 -129.83 -129.835 -129.84 -129.845 -129.85 -129.855 -129.86 -129.865 -129.87 -129.875 -129.88 -129.885 -129.89 -129.895 -129.9 -129.905 -129.91 -129.915 -129.92 -129.925 -129.93 -129.935 -129.94 -129.945 -129.95 -129.955 -129.96 -129.965 -129.97 -129.975 -129.98 -129.985 -129.99 -129.995 -130 -130.005 -130.01 -130.015 -130.02 -130.025 -130.03 -130.035 -130.04 -130.045 -130.05 -130.055 -130.06 -130.065 -130.07 -130.075 -130.08 -130.085 -130.09 -130.095 -130.1 -130.105 -130.11 -130.115 -130.12 -130.125 -130.13 -130.135 -130.14 -130.145 -130.15 -130.155 -130.16 -130.165 -130.17 -130.175 -130.18 -130.185 -130.19 -130.195 -130.2 -130.205 -130.21 -130.215 -130.22 -130.225 -130.23 -130.235 -130.24 -130.245 -130.25 -130.255 -130.26 -130.265 -130.27 -130.275 -130.28 -130.285 -130.29 -130.295 -130.3 -130.305 -130.31 -130.315 -130.32 -130.325 -130.33 -130.335 -130.34 -130.345 -130.35 -130.355 -130.36 -130.365 -130.37 -130.375 -130.38 -130.385 -130.39 -130.395 -130.4 -130.405 -130.41 -130.415 -130.42 -130.425 -130.43 -130.435 -130.44 -130.445 -130.45 -130.455 -130.46 -130.465 -130.47 -130.475 -130.48 -130.485 -130.49 -130.495 -130.5 -130.505 -130.51 -130.515 -130.52 -130.525 -130.53 -130.535 -130.54 -130.545 -130.55 -130.555 -130.56 -130.565 -130.57 -130.575 -130.58 -130.585 -130.59 -130.595 -130.6 -130.605 -130.61 -130.615 -130.62 -130.625 -130.63 -130.635 -130.64 -130.645 -130.65 -130.655 -130.66 -130.665 -130.67 -130.675 -130.68 -130.685 -130.69 -130.695 -130.7 -130.705 -130.71 -130.715 -130.72 -130.725 -130.73 -130.735 -130.74 -130.745 -130.75 -130.755 -130.76 -130.765 -130.77 -130.775 -130.78 -130.785 -130.79 -130.795 -130.8 -130.805 -130.81 -130.815 -130.82 -130.825 -130.83 -130.835 -130.84 -130.845 -130.85 -130.855 -130.86 -130.865 -130.87 -130.875 -130.88 -130.885 -130.89 -130.895 -130.9 -130.905 -130.91 -130.915 -130.92 -130.925 -130.93 -130.935 -130.94 -130.945 -130.95 -130.955 -130.96 -130.965 -130.97 -130.975 -130.98 -130.985 -130.99 -130.995 -131 -131.005 -131.01 -131.015 -131.02 -131.025 -131.03 -131.035 -131.04 -131.045 -131.05 -131.055 -131.06 -131.065 -131.07 -131.075 -131.08 -131.085 -131.09 -131.095 -131.1 -131.105 -131.11 -131.115 -131.12 -131.125 -131.13 -131.135 -131.14 -131.145 -131.15 -131.155 -131.16 -131.165 -131.17 -131.175 -131.18 -131.185 -131.19 -131.195 -131.2 -131.205 -131.21 -131.215 -131.22 -131.225 -131.23 -131.235 -131.24 -131.245 -131.25 -131.255 -131.26 -131.265 -131.27 -131.275 -131.28 -131.285 -131.29 -131.295 -131.3 -131.305 -131.31 -131.315 -131.32 -131.325 -131.33 -131.335 -131.34 -131.345 -131.35 -131.355 -131.36 -131.365 -131.37 -131.375 -131.38 -131.385 -131.39 -131.395 -131.4 -131.405 -131.41 -131.415 -131.42 -131.425 -131.43 -131.435 -131.44 -131.445 -131.45 -131.455 -131.46 -131.465 -131.47 -131.475 -131.48 -131.485 -131.49 -131.495 -131.5 -131.505 -131.51 -131.515 -131.52 -131.525 -131.53 -131.535 -131.54 -131.545 -131.55 -131.555 -131.56 -131.565 -131.57 -131.575 -131.58 -131.585 -131.59 -131.595 -131.6 -131.605 -131.61 -131.615 -131.62 -131.625 -131.63 -131.635 -131.64 -131.645 -131.65 -131.655 -131.66 -131.665 -131.67 -131.675 -131.68 -131.685 -131.69 -131.695 -131.7 -131.705 -131.71 -131.715 -131.72 -131.725 -131.73 -131.735 -131.74 -131.745 -131.75 -131.755 -131.76 -131.765 -131.77 -131.775 -131.78 -131.785 -131.79 -131.795 -131.8 -131.805 -131.81 -131.815 -131.82 -131.825 -131.83 -131.835 -131.84 -131.845 -131.85 -131.855 -131.86 -131.865 -131.87 -131.875 -131.88 -131.885 -131.89 -131.895 -131.9 -131.905 -131.91 -131.915 -131.92 -131.925 -131.93 -131.935 -131.94 -131.945 -131.95 -131.955 -131.96 -131.965 -131.97 -131.975 -131.98 -131.985 -131.99 -131.995 -132 -132.005 -132.01 -132.015 -132.02 -132.025 -132.03 -132.035 -132.04 -132.045 -132.05 -132.055 -132.06 -132.065 -132.07 -132.075 -132.08 -132.085 -132.09 -132.095 -132.1 -132.105 -132.11 -132.115 -132.12 -132.125 -132.13 -132.135 -132.14 -132.145 -132.15 -132.155 -132.16 -132.165 -132.17 -132.175 -132.18 -132.185 -132.19 -132.195 -132.2 -132.205 -132.21 -132.215 -132.22 -132.225 -132.23 -132.235 -132.24 -132.245 -132.25 -132.255 -132.26 -132.265 -132.27 -132.275 -132.28 -132.285 -132.29 -132.295 -132.3 -132.305 -132.31 -132.315 -132.32 -132.325 -132.33 -132.335 -132.34 -132.345 -132.35 -132.355 -132.36 -132.365 -132.37 -132.375 -132.38 -132.385 -132.39 -132.395 -132.4 -132.405 -132.41 -132.415 -132.42 -132.425 -132.43 -132.435 -132.44 -132.445 -132.45 -132.455 -132.46 -132.465 -132.47 -132.475 -132.48 -132.485 -132.49 -132.495 -132.5 -132.505 -132.51 -132.515 -132.52 -132.525 -132.53 -132.535 -132.54 -132.545 -132.55 -132.555 -132.56 -132.565 -132.57 -132.575 -132.58 -132.585 -132.59 -132.595 -132.6 -132.605 -132.61 -132.615 -132.62 -132.625 -132.63 -132.635 -132.64 -132.645 -132.65 -132.655 -132.66 -132.665 -132.67 -132.675 -132.68 -132.685 -132.69 -132.695 -132.7 -132.705 -132.71 -132.715 -132.72 -132.725 -132.73 -132.735 -132.74 -132.745 -132.75 -132.755 -132.76 -132.765 -132.77 -132.775 -132.78 -132.785 -132.79 -132.795 -132.8 -132.805 -132.81 -132.815 -132.82 -132.825 -132.83 -132.835 -132.84 -132.845 -132.85 -132.855 -132.86 -132.865 -132.87 -132.875 -132.88 -132.885 -132.89 -132.895 -132.9 -132.905 -132.91 -132.915 -132.92 -132.925 -132.93 -132.935 -132.94 -132.945 -132.95 -132.955 -132.96 -132.965 -132.97 -132.975 -132.98 -132.985 -132.99 -132.995 -133 -133.005 -133.01 -133.015 -133.02 -133.025 -133.03 -133.035 -133.04 -133.045 -133.05 -133.055 -133.06 -133.065 -133.07 -133.075 -133.08 -133.085 -133.09 -133.095 -133.1 -133.105 -133.11 -133.115 -133.12 -133.125 -133.13 -133.135 -133.14 -133.145 -133.15 -133.155 -133.16 -133.165 -133.17 -133.175 -133.18 -133.185 -133.19 -133.195 -133.2 -133.205 -133.21 -133.215 -133.22 -133.225 -133.23 -133.235 -133.24 -133.245 -133.25 -133.255 -133.26 -133.265 -133.27 -133.275 -133.28 -133.285 -133.29 -133.295 -133.3 -133.305 -133.31 -133.315 -133.32 -133.325 -133.33 -133.335 -133.34 -133.345 -133.35 -133.355 -133.36 -133.365 -133.37 -133.375 -133.38 -133.385 -133.39 -133.395 -133.4 -133.405 -133.41 -133.415 -133.42 -133.425 -133.43 -133.435 -133.44 -133.445 -133.45 -133.455 -133.46 -133.465 -133.47 -133.475 -133.48 -133.485 -133.49 -133.495 -133.5 -133.505 -133.51 -133.515 -133.52 -133.525 -133.53 -133.535 -133.54 -133.545 -133.55 -133.555 -133.56 -133.565 -133.57 -133.575 -133.58 -133.585 -133.59 -133.595 -133.6 -133.605 -133.61 -133.615 -133.62 -133.625 -133.63 -133.635 -133.64 -133.645 -133.65 -133.655 -133.66 -133.665 -133.67 -133.675 -133.68 -133.685 -133.69 -133.695 -133.7 -133.705 -133.71 -133.715 -133.72 -133.725 -133.73 -133.735 -133.74 -133.745 -133.75 -133.755 -133.76 -133.765 -133.77 -133.775 -133.78 -133.785 -133.79 -133.795 -133.8 -133.805 -133.81 -133.815 -133.82 -133.825 -133.83 -133.835 -133.84 -133.845 -133.85 -133.855 -133.86 -133.865 -133.87 -133.875 -133.88 -133.885 -133.89 -133.895 -133.9 -133.905 -133.91 -133.915 -133.92 -133.925 -133.93 -133.935 -133.94 -133.945 -133.95 -133.955 -133.96 -133.965 -133.97 -133.975 -133.98 -133.985 -133.99 -133.995 -134 -134.005 -134.01 -134.015 -134.02 -134.025 -134.03 -134.035 -134.04 -134.045 -134.05 -134.055 -134.06 -134.065 -134.07 -134.075 -134.08 -134.085 -134.09 -134.095 -134.1 -134.105 -134.11 -134.115 -134.12 -134.125 -134.13 -134.135 -134.14 -134.145 -134.15 -134.155 -134.16 -134.165 -134.17 -134.175 -134.18 -134.185 -134.19 -134.195 -134.2 -134.205 -134.21 -134.215 -134.22 -134.225 -134.23 -134.235 -134.24 -134.245 -134.25 -134.255 -134.26 -134.265 -134.27 -134.275 -134.28 -134.285 -134.29 -134.295 -134.3 -134.305 -134.31 -134.315 -134.32 -134.325 -134.33 -134.335 -134.34 -134.345 -134.35 -134.355 -134.36 -134.365 -134.37 -134.375 -134.38 -134.385 -134.39 -134.395 -134.4 -134.405 -134.41 -134.415 -134.42 -134.425 -134.43 -134.435 -134.44 -134.445 -134.45 -134.455 -134.46 -134.465 -134.47 -134.475 -134.48 -134.485 -134.49 -134.495 -134.5 -134.505 -134.51 -134.515 -134.52 -134.525 -134.53 -134.535 -134.54 -134.545 -134.55 -134.555 -134.56 -134.565 -134.57 -134.575 -134.58 -134.585 -134.59 -134.595 -134.6 -134.605 -134.61 -134.615 -134.62 -134.625 -134.63 -134.635 -134.64 -134.645 -134.65 -134.655 -134.66 -134.665 -134.67 -134.675 -134.68 -134.685 -134.69 -134.695 -134.7 -134.705 -134.71 -134.715 -134.72 -134.725 -134.73 -134.735 -134.74 -134.745 -134.75 -134.755 -134.76 -134.765 -134.77 -134.775 -134.78 -134.785 -134.79 -134.795 -134.8 -134.805 -134.81 -134.815 -134.82 -134.825 -134.83 -134.835 -134.84 -134.845 -134.85 -134.855 -134.86 -134.865 -134.87 -134.875 -134.88 -134.885 -134.89 -134.895 -134.9 -134.905 -134.91 -134.915 -134.92 -134.925 -134.93 -134.935 -134.94 -134.945 -134.95 -134.955 -134.96 -134.965 -134.97 -134.975 -134.98 -134.985 -134.99 -134.995 -135 -135.005 -135.01 -135.015 -135.02 -135.025 -135.03 -135.035 -135.04 -135.045 -135.05 -135.055 -135.06 -135.065 -135.07 -135.075 -135.08 -135.085 -135.09 -135.095 -135.1 -135.105 -135.11 -135.115 -135.12 -135.125 -135.13 -135.135 -135.14 -135.145 -135.15 -135.155 -135.16 -135.165 -135.17 -135.175 -135.18 -135.185 -135.19 -135.195 -135.2 -135.205 -135.21 -135.215 -135.22 -135.225 -135.23 -135.235 -135.24 -135.245 -135.25 -135.255 -135.26 -135.265 -135.27 -135.275 -135.28 -135.285 -135.29 -135.295 -135.3 -135.305 -135.31 -135.315 -135.32 -135.325 -135.33 -135.335 -135.34 -135.345 -135.35 -135.355 -135.36 -135.365 -135.37 -135.375 -135.38 -135.385 -135.39 -135.395 -135.4 -135.405 -135.41 -135.415 -135.42 -135.425 -135.43 -135.435 -135.44 -135.445 -135.45 -135.455 -135.46 -135.465 -135.47 -135.475 -135.48 -135.485 -135.49 -135.495 -135.5 -135.505 -135.51 -135.515 -135.52 -135.525 -135.53 -135.535 -135.54 -135.545 -135.55 -135.555 -135.56 -135.565 -135.57 -135.575 -135.58 -135.585 -135.59 -135.595 -135.6 -135.605 -135.61 -135.615 -135.62 -135.625 -135.63 -135.635 -135.64 -135.645 -135.65 -135.655 -135.66 -135.665 -135.67 -135.675 -135.68 -135.685 -135.69 -135.695 -135.7 -135.705 -135.71 -135.715 -135.72 -135.725 -135.73 -135.735 -135.74 -135.745 -135.75 -135.755 -135.76 -135.765 -135.77 -135.775 -135.78 -135.785 -135.79 -135.795 -135.8 -135.805 -135.81 -135.815 -135.82 -135.825 -135.83 -135.835 -135.84 -135.845 -135.85 -135.855 -135.86 -135.865 -135.87 -135.875 -135.88 -135.885 -135.89 -135.895 -135.9 -135.905 -135.91 -135.915 -135.92 -135.925 -135.93 -135.935 -135.94 -135.945 -135.95 -135.955 -135.96 -135.965 -135.97 -135.975 -135.98 -135.985 -135.99 -135.995 -136 -136.005 -136.01 -136.015 -136.02 -136.025 -136.03 -136.035 -136.04 -136.045 -136.05 -136.055 -136.06 -136.065 -136.07 -136.075 -136.08 -136.085 -136.09 -136.095 -136.1 -136.105 -136.11 -136.115 -136.12 -136.125 -136.13 -136.135 -136.14 -136.145 -136.15 -136.155 -136.16 -136.165 -136.17 -136.175 -136.18 -136.185 -136.19 -136.195 -136.2 -136.205 -136.21 -136.215 -136.22 -136.225 -136.23 -136.235 -136.24 -136.245 -136.25 -136.255 -136.26 -136.265 -136.27 -136.275 -136.28 -136.285 -136.29 -136.295 -136.3 -136.305 -136.31 -136.315 -136.32 -136.325 -136.33 -136.335 -136.34 -136.345 -136.35 -136.355 -136.36 -136.365 -136.37 -136.375 -136.38 -136.385 -136.39 -136.395 -136.4 -136.405 -136.41 -136.415 -136.42 -136.425 -136.43 -136.435 -136.44 -136.445 -136.45 -136.455 -136.46 -136.465 -136.47 -136.475 -136.48 -136.485 -136.49 -136.495 -136.5 -136.505 -136.51 -136.515 -136.52 -136.525 -136.53 -136.535 -136.54 -136.545 -136.55 -136.555 -136.56 -136.565 -136.57 -136.575 -136.58 -136.585 -136.59 -136.595 -136.6 -136.605 -136.61 -136.615 -136.62 -136.625 -136.63 -136.635 -136.64 -136.645 -136.65 -136.655 -136.66 -136.665 -136.67 -136.675 -136.68 -136.685 -136.69 -136.695 -136.7 -136.705 -136.71 -136.715 -136.72 -136.725 -136.73 -136.735 -136.74 -136.745 -136.75 -136.755 -136.76 -136.765 -136.77 -136.775 -136.78 -136.785 -136.79 -136.795 -136.8 -136.805 -136.81 -136.815 -136.82 -136.825 -136.83 -136.835 -136.84 -136.845 -136.85 -136.855 -136.86 -136.865 -136.87 -136.875 -136.88 -136.885 -136.89 -136.895 -136.9 -136.905 -136.91 -136.915 -136.92 -136.925 -136.93 -136.935 -136.94 -136.945 -136.95 -136.955 -136.96 -136.965 -136.97 -136.975 -136.98 -136.985 -136.99 -136.995 -137 -137.005 -137.01 -137.015 -137.02 -137.025 -137.03 -137.035 -137.04 -137.045 -137.05 -137.055 -137.06 -137.065 -137.07 -137.075 -137.08 -137.085 -137.09 -137.095 -137.1 -137.105 -137.11 -137.115 -137.12 -137.125 -137.13 -137.135 -137.14 -137.145 -137.15 -137.155 -137.16 -137.165 -137.17 -137.175 -137.18 -137.185 -137.19 -137.195 -137.2 -137.205 -137.21 -137.215 -137.22 -137.225 -137.23 -137.235 -137.24 -137.245 -137.25 -137.255 -137.26 -137.265 -137.27 -137.275 -137.28 -137.285 -137.29 -137.295 -137.3 -137.305 -137.31 -137.315 -137.32 -137.325 -137.33 -137.335 -137.34 -137.345 -137.35 -137.355 -137.36 -137.365 -137.37 -137.375 -137.38 -137.385 -137.39 -137.395 -137.4 -137.405 -137.41 -137.415 -137.42 -137.425 -137.43 -137.435 -137.44 -137.445 -137.45 -137.455 -137.46 -137.465 -137.47 -137.475 -137.48 -137.485 -137.49 -137.495 -137.5 -137.505 -137.51 -137.515 -137.52 -137.525 -137.53 -137.535 -137.54 -137.545 -137.55 -137.555 -137.56 -137.565 -137.57 -137.575 -137.58 -137.585 -137.59 -137.595 -137.6 -137.605 -137.61 -137.615 -137.62 -137.625 -137.63 -137.635 -137.64 -137.645 -137.65 -137.655 -137.66 -137.665 -137.67 -137.675 -137.68 -137.685 -137.69 -137.695 -137.7 -137.705 -137.71 -137.715 -137.72 -137.725 -137.73 -137.735 -137.74 -137.745 -137.75 -137.755 -137.76 -137.765 -137.77 -137.775 -137.78 -137.785 -137.79 -137.795 -137.8 -137.805 -137.81 -137.815 -137.82 -137.825 -137.83 -137.835 -137.84 -137.845 -137.85 -137.855 -137.86 -137.865 -137.87 -137.875 -137.88 -137.885 -137.89 -137.895 -137.9 -137.905 -137.91 -137.915 -137.92 -137.925 -137.93 -137.935 -137.94 -137.945 -137.95 -137.955 -137.96 -137.965 -137.97 -137.975 -137.98 -137.985 -137.99 -137.995 -138 -138.005 -138.01 -138.015 -138.02 -138.025 -138.03 -138.035 -138.04 -138.045 -138.05 -138.055 -138.06 -138.065 -138.07 -138.075 -138.08 -138.085 -138.09 -138.095 -138.1 -138.105 -138.11 -138.115 -138.12 -138.125 -138.13 -138.135 -138.14 -138.145 -138.15 -138.155 -138.16 -138.165 -138.17 -138.175 -138.18 -138.185 -138.19 -138.195 -138.2 -138.205 -138.21 -138.215 -138.22 -138.225 -138.23 -138.235 -138.24 -138.245 -138.25 -138.255 -138.26 -138.265 -138.27 -138.275 -138.28 -138.285 -138.29 -138.295 -138.3 -138.305 -138.31 -138.315 -138.32 -138.325 -138.33 -138.335 -138.34 -138.345 -138.35 -138.355 -138.36 -138.365 -138.37 -138.375 -138.38 -138.385 -138.39 -138.395 -138.4 -138.405 -138.41 -138.415 -138.42 -138.425 -138.43 -138.435 -138.44 -138.445 -138.45 -138.455 -138.46 -138.465 -138.47 -138.475 -138.48 -138.485 -138.49 -138.495 -138.5 -138.505 -138.51 -138.515 -138.52 -138.525 -138.53 -138.535 -138.54 -138.545 -138.55 -138.555 -138.56 -138.565 -138.57 -138.575 -138.58 -138.585 -138.59 -138.595 -138.6 -138.605 -138.61 -138.615 -138.62 -138.625 -138.63 -138.635 -138.64 -138.645 -138.65 -138.655 -138.66 -138.665 -138.67 -138.675 -138.68 -138.685 -138.69 -138.695 -138.7 -138.705 -138.71 -138.715 -138.72 -138.725 -138.73 -138.735 -138.74 -138.745 -138.75 -138.755 -138.76 -138.765 -138.77 -138.775 -138.78 -138.785 -138.79 -138.795 -138.8 -138.805 -138.81 -138.815 -138.82 -138.825 -138.83 -138.835 -138.84 -138.845 -138.85 -138.855 -138.86 -138.865 -138.87 -138.875 -138.88 -138.885 -138.89 -138.895 -138.9 -138.905 -138.91 -138.915 -138.92 -138.925 -138.93 -138.935 -138.94 -138.945 -138.95 -138.955 -138.96 -138.965 -138.97 -138.975 -138.98 -138.985 -138.99 -138.995 -139 -139.005 -139.01 -139.015 -139.02 -139.025 -139.03 -139.035 -139.04 -139.045 -139.05 -139.055 -139.06 -139.065 -139.07 -139.075 -139.08 -139.085 -139.09 -139.095 -139.1 -139.105 -139.11 -139.115 -139.12 -139.125 -139.13 -139.135 -139.14 -139.145 -139.15 -139.155 -139.16 -139.165 -139.17 -139.175 -139.18 -139.185 -139.19 -139.195 -139.2 -139.205 -139.21 -139.215 -139.22 -139.225 -139.23 -139.235 -139.24 -139.245 -139.25 -139.255 -139.26 -139.265 -139.27 -139.275 -139.28 -139.285 -139.29 -139.295 -139.3 -139.305 -139.31 -139.315 -139.32 -139.325 -139.33 -139.335 -139.34 -139.345 -139.35 -139.355 -139.36 -139.365 -139.37 -139.375 -139.38 -139.385 -139.39 -139.395 -139.4 -139.405 -139.41 -139.415 -139.42 -139.425 -139.43 -139.435 -139.44 -139.445 -139.45 -139.455 -139.46 -139.465 -139.47 -139.475 -139.48 -139.485 -139.49 -139.495 -139.5 -139.505 -139.51 -139.515 -139.52 -139.525 -139.53 -139.535 -139.54 -139.545 -139.55 -139.555 -139.56 -139.565 -139.57 -139.575 -139.58 -139.585 -139.59 -139.595 -139.6 -139.605 -139.61 -139.615 -139.62 -139.625 -139.63 -139.635 -139.64 -139.645 -139.65 -139.655 -139.66 -139.665 -139.67 -139.675 -139.68 -139.685 -139.69 -139.695 -139.7 -139.705 -139.71 -139.715 -139.72 -139.725 -139.73 -139.735 -139.74 -139.745 -139.75 -139.755 -139.76 -139.765 -139.77 -139.775 -139.78 -139.785 -139.79 -139.795 -139.8 -139.805 -139.81 -139.815 -139.82 -139.825 -139.83 -139.835 -139.84 -139.845 -139.85 -139.855 -139.86 -139.865 -139.87 -139.875 -139.88 -139.885 -139.89 -139.895 -139.9 -139.905 -139.91 -139.915 -139.92 -139.925 -139.93 -139.935 -139.94 -139.945 -139.95 -139.955 -139.96 -139.965 -139.97 -139.975 -139.98 -139.985 -139.99 -139.995 -140 -140.005 -140.01 -140.015 -140.02 -140.025 -140.03 -140.035 -140.04 -140.045 -140.05 -140.055 -140.06 -140.065 -140.07 -140.075 -140.08 -140.085 -140.09 -140.095 -140.1 -140.105 -140.11 -140.115 -140.12 -140.125 -140.13 -140.135 -140.14 -140.145 -140.15 -140.155 -140.16 -140.165 -140.17 -140.175 -140.18 -140.185 -140.19 -140.195 -140.2 -140.205 -140.21 -140.215 -140.22 -140.225 -140.23 -140.235 -140.24 -140.245 -140.25 -140.255 -140.26 -140.265 -140.27 -140.275 -140.28 -140.285 -140.29 -140.295 -140.3 -140.305 -140.31 -140.315 -140.32 -140.325 -140.33 -140.335 -140.34 -140.345 -140.35 -140.355 -140.36 -140.365 -140.37 -140.375 -140.38 -140.385 -140.39 -140.395 -140.4 -140.405 -140.41 -140.415 -140.42 -140.425 -140.43 -140.435 -140.44 -140.445 -140.45 -140.455 -140.46 -140.465 -140.47 -140.475 -140.48 -140.485 -140.49 -140.495 -140.5 -140.505 -140.51 -140.515 -140.52 -140.525 -140.53 -140.535 -140.54 -140.545 -140.55 -140.555 -140.56 -140.565 -140.57 -140.575 -140.58 -140.585 -140.59 -140.595 -140.6 -140.605 -140.61 -140.615 -140.62 -140.625 -140.63 -140.635 -140.64 -140.645 -140.65 -140.655 -140.66 -140.665 -140.67 -140.675 -140.68 -140.685 -140.69 -140.695 -140.7 -140.705 -140.71 -140.715 -140.72 -140.725 -140.73 -140.735 -140.74 -140.745 -140.75 -140.755 -140.76 -140.765 -140.77 -140.775 -140.78 -140.785 -140.79 -140.795 -140.8 -140.805 -140.81 -140.815 -140.82 -140.825 -140.83 -140.835 -140.84 -140.845 -140.85 -140.855 -140.86 -140.865 -140.87 -140.875 -140.88 -140.885 -140.89 -140.895 -140.9 -140.905 -140.91 -140.915 -140.92 -140.925 -140.93 -140.935 -140.94 -140.945 -140.95 -140.955 -140.96 -140.965 -140.97 -140.975 -140.98 -140.985 -140.99 -140.995 -141 -141.005 -141.01 -141.015 -141.02 -141.025 -141.03 -141.035 -141.04 -141.045 -141.05 -141.055 -141.06 -141.065 -141.07 -141.075 -141.08 -141.085 -141.09 -141.095 -141.1 -141.105 -141.11 -141.115 -141.12 -141.125 -141.13 -141.135 -141.14 -141.145 -141.15 -141.155 -141.16 -141.165 -141.17 -141.175 -141.18 -141.185 -141.19 -141.195 -141.2 -141.205 -141.21 -141.215 -141.22 -141.225 -141.23 -141.235 -141.24 -141.245 -141.25 -141.255 -141.26 -141.265 -141.27 -141.275 -141.28 -141.285 -141.29 -141.295 -141.3 -141.305 -141.31 -141.315 -141.32 -141.325 -141.33 -141.335 -141.34 -141.345 -141.35 -141.355 -141.36 -141.365 -141.37 -141.375 -141.38 -141.385 -141.39 -141.395 -141.4 -141.405 -141.41 -141.415 -141.42 -141.425 -141.43 -141.435 -141.44 -141.445 -141.45 -141.455 -141.46 -141.465 -141.47 -141.475 -141.48 -141.485 -141.49 -141.495 -141.5 -141.505 -141.51 -141.515 -141.52 -141.525 -141.53 -141.535 -141.54 -141.545 -141.55 -141.555 -141.56 -141.565 -141.57 -141.575 -141.58 -141.585 -141.59 -141.595 -141.6 -141.605 -141.61 -141.615 -141.62 -141.625 -141.63 -141.635 -141.64 -141.645 -141.65 -141.655 -141.66 -141.665 -141.67 -141.675 -141.68 -141.685 -141.69 -141.695 -141.7 -141.705 -141.71 -141.715 -141.72 -141.725 -141.73 -141.735 -141.74 -141.745 -141.75 -141.755 -141.76 -141.765 -141.77 -141.775 -141.78 -141.785 -141.79 -141.795 -141.8 -141.805 -141.81 -141.815 -141.82 -141.825 -141.83 -141.835 -141.84 -141.845 -141.85 -141.855 -141.86 -141.865 -141.87 -141.875 -141.88 -141.885 -141.89 -141.895 -141.9 -141.905 -141.91 -141.915 -141.92 -141.925 -141.93 -141.935 -141.94 -141.945 -141.95 -141.955 -141.96 -141.965 -141.97 -141.975 -141.98 -141.985 -141.99 -141.995 -142 -142.005 -142.01 -142.015 -142.02 -142.025 -142.03 -142.035 -142.04 -142.045 -142.05 -142.055 -142.06 -142.065 -142.07 -142.075 -142.08 -142.085 -142.09 -142.095 -142.1 -142.105 -142.11 -142.115 -142.12 -142.125 -142.13 -142.135 -142.14 -142.145 -142.15 -142.155 -142.16 -142.165 -142.17 -142.175 -142.18 -142.185 -142.19 -142.195 -142.2 -142.205 -142.21 -142.215 -142.22 -142.225 -142.23 -142.235 -142.24 -142.245 -142.25 -142.255 -142.26 -142.265 -142.27 -142.275 -142.28 -142.285 -142.29 -142.295 -142.3 -142.305 -142.31 -142.315 -142.32 -142.325 -142.33 -142.335 -142.34 -142.345 -142.35 -142.355 -142.36 -142.365 -142.37 -142.375 -142.38 -142.385 -142.39 -142.395 -142.4 -142.405 -142.41 -142.415 -142.42 -142.425 -142.43 -142.435 -142.44 -142.445 -142.45 -142.455 -142.46 -142.465 -142.47 -142.475 -142.48 -142.485 -142.49 -142.495 -142.5 -142.505 -142.51 -142.515 -142.52 -142.525 -142.53 -142.535 -142.54 -142.545 -142.55 -142.555 -142.56 -142.565 -142.57 -142.575 -142.58 -142.585 -142.59 -142.595 -142.6 -142.605 -142.61 -142.615 -142.62 -142.625 -142.63 -142.635 -142.64 -142.645 -142.65 -142.655 -142.66 -142.665 -142.67 -142.675 -142.68 -142.685 -142.69 -142.695 -142.7 -142.705 -142.71 -142.715 -142.72 -142.725 -142.73 -142.735 -142.74 -142.745 -142.75 -142.755 -142.76 -142.765 -142.77 -142.775 -142.78 -142.785 -142.79 -142.795 -142.8 -142.805 -142.81 -142.815 -142.82 -142.825 -142.83 -142.835 -142.84 -142.845 -142.85 -142.855 -142.86 -142.865 -142.87 -142.875 -142.88 -142.885 -142.89 -142.895 -142.9 -142.905 -142.91 -142.915 -142.92 -142.925 -142.93 -142.935 -142.94 -142.945 -142.95 -142.955 -142.96 -142.965 -142.97 -142.975 -142.98 -142.985 -142.99 -142.995 -143 -143.005 -143.01 -143.015 -143.02 -143.025 -143.03 -143.035 -143.04 -143.045 -143.05 -143.055 -143.06 -143.065 -143.07 -143.075 -143.08 -143.085 -143.09 -143.095 -143.1 -143.105 -143.11 -143.115 -143.12 -143.125 -143.13 -143.135 -143.14 -143.145 -143.15 -143.155 -143.16 -143.165 -143.17 -143.175 -143.18 -143.185 -143.19 -143.195 -143.2 -143.205 -143.21 -143.215 -143.22 -143.225 -143.23 -143.235 -143.24 -143.245 -143.25 -143.255 -143.26 -143.265 -143.27 -143.275 -143.28 -143.285 -143.29 -143.295 -143.3 -143.305 -143.31 -143.315 -143.32 -143.325 -143.33 -143.335 -143.34 -143.345 -143.35 -143.355 -143.36 -143.365 -143.37 -143.375 -143.38 -143.385 -143.39 -143.395 -143.4 -143.405 -143.41 -143.415 -143.42 -143.425 -143.43 -143.435 -143.44 -143.445 -143.45 -143.455 -143.46 -143.465 -143.47 -143.475 -143.48 -143.485 -143.49 -143.495 -143.5 -143.505 -143.51 -143.515 -143.52 -143.525 -143.53 -143.535 -143.54 -143.545 -143.55 -143.555 -143.56 -143.565 -143.57 -143.575 -143.58 -143.585 -143.59 -143.595 -143.6 -143.605 -143.61 -143.615 -143.62 -143.625 -143.63 -143.635 -143.64 -143.645 -143.65 -143.655 -143.66 -143.665 -143.67 -143.675 -143.68 -143.685 -143.69 -143.695 -143.7 -143.705 -143.71 -143.715 -143.72 -143.725 -143.73 -143.735 -143.74 -143.745 -143.75 -143.755 -143.76 -143.765 -143.77 -143.775 -143.78 -143.785 -143.79 -143.795 -143.8 -143.805 -143.81 -143.815 -143.82 -143.825 -143.83 -143.835 -143.84 -143.845 -143.85 -143.855 -143.86 -143.865 -143.87 -143.875 -143.88 -143.885 -143.89 -143.895 -143.9 -143.905 -143.91 -143.915 -143.92 -143.925 -143.93 -143.935 -143.94 -143.945 -143.95 -143.955 -143.96 -143.965 -143.97 -143.975 -143.98 -143.985 -143.99 -143.995 -144 -144.005 -144.01 -144.015 -144.02 -144.025 -144.03 -144.035 -144.04 -144.045 -144.05 -144.055 -144.06 -144.065 -144.07 -144.075 -144.08 -144.085 -144.09 -144.095 -144.1 -144.105 -144.11 -144.115 -144.12 -144.125 -144.13 -144.135 -144.14 -144.145 -144.15 -144.155 -144.16 -144.165 -144.17 -144.175 -144.18 -144.185 -144.19 -144.195 -144.2 -144.205 -144.21 -144.215 -144.22 -144.225 -144.23 -144.235 -144.24 -144.245 -144.25 -144.255 -144.26 -144.265 -144.27 -144.275 -144.28 -144.285 -144.29 -144.295 -144.3 -144.305 -144.31 -144.315 -144.32 -144.325 -144.33 -144.335 -144.34 -144.345 -144.35 -144.355 -144.36 -144.365 -144.37 -144.375 -144.38 -144.385 -144.39 -144.395 -144.4 -144.405 -144.41 -144.415 -144.42 -144.425 -144.43 -144.435 -144.44 -144.445 -144.45 -144.455 -144.46 -144.465 -144.47 -144.475 -144.48 -144.485 -144.49 -144.495 -144.5 -144.505 -144.51 -144.515 -144.52 -144.525 -144.53 -144.535 -144.54 -144.545 -144.55 -144.555 -144.56 -144.565 -144.57 -144.575 -144.58 -144.585 -144.59 -144.595 -144.6 -144.605 -144.61 -144.615 -144.62 -144.625 -144.63 -144.635 -144.64 -144.645 -144.65 -144.655 -144.66 -144.665 -144.67 -144.675 -144.68 -144.685 -144.69 -144.695 -144.7 -144.705 -144.71 -144.715 -144.72 -144.725 -144.73 -144.735 -144.74 -144.745 -144.75 -144.755 -144.76 -144.765 -144.77 -144.775 -144.78 -144.785 -144.79 -144.795 -144.8 -144.805 -144.81 -144.815 -144.82 -144.825 -144.83 -144.835 -144.84 -144.845 -144.85 -144.855 -144.86 -144.865 -144.87 -144.875 -144.88 -144.885 -144.89 -144.895 -144.9 -144.905 -144.91 -144.915 -144.92 -144.925 -144.93 -144.935 -144.94 -144.945 -144.95 -144.955 -144.96 -144.965 -144.97 -144.975 -144.98 -144.985 -144.99 -144.995 -145 -145.005 -145.01 -145.015 -145.02 -145.025 -145.03 -145.035 -145.04 -145.045 -145.05 -145.055 -145.06 -145.065 -145.07 -145.075 -145.08 -145.085 -145.09 -145.095 -145.1 -145.105 -145.11 -145.115 -145.12 -145.125 -145.13 -145.135 -145.14 -145.145 -145.15 -145.155 -145.16 -145.165 -145.17 -145.175 -145.18 -145.185 -145.19 -145.195 -145.2 -145.205 -145.21 -145.215 -145.22 -145.225 -145.23 -145.235 -145.24 -145.245 -145.25 -145.255 -145.26 -145.265 -145.27 -145.275 -145.28 -145.285 -145.29 -145.295 -145.3 -145.305 -145.31 -145.315 -145.32 -145.325 -145.33 -145.335 -145.34 -145.345 -145.35 -145.355 -145.36 -145.365 -145.37 -145.375 -145.38 -145.385 -145.39 -145.395 -145.4 -145.405 -145.41 -145.415 -145.42 -145.425 -145.43 -145.435 -145.44 -145.445 -145.45 -145.455 -145.46 -145.465 -145.47 -145.475 -145.48 -145.485 -145.49 -145.495 -145.5 -145.505 -145.51 -145.515 -145.52 -145.525 -145.53 -145.535 -145.54 -145.545 -145.55 -145.555 -145.56 -145.565 -145.57 -145.575 -145.58 -145.585 -145.59 -145.595 -145.6 -145.605 -145.61 -145.615 -145.62 -145.625 -145.63 -145.635 -145.64 -145.645 -145.65 -145.655 -145.66 -145.665 -145.67 -145.675 -145.68 -145.685 -145.69 -145.695 -145.7 -145.705 -145.71 -145.715 -145.72 -145.725 -145.73 -145.735 -145.74 -145.745 -145.75 -145.755 -145.76 -145.765 -145.77 -145.775 -145.78 -145.785 -145.79 -145.795 -145.8 -145.805 -145.81 -145.815 -145.82 -145.825 -145.83 -145.835 -145.84 -145.845 -145.85 -145.855 -145.86 -145.865 -145.87 -145.875 -145.88 -145.885 -145.89 -145.895 -145.9 -145.905 -145.91 -145.915 -145.92 -145.925 -145.93 -145.935 -145.94 -145.945 -145.95 -145.955 -145.96 -145.965 -145.97 -145.975 -145.98 -145.985 -145.99 -145.995 -146 -146.005 -146.01 -146.015 -146.02 -146.025 -146.03 -146.035 -146.04 -146.045 -146.05 -146.055 -146.06 -146.065 -146.07 -146.075 -146.08 -146.085 -146.09 -146.095 -146.1 -146.105 -146.11 -146.115 -146.12 -146.125 -146.13 -146.135 -146.14 -146.145 -146.15 -146.155 -146.16 -146.165 -146.17 -146.175 -146.18 -146.185 -146.19 -146.195 -146.2 -146.205 -146.21 -146.215 -146.22 -146.225 -146.23 -146.235 -146.24 -146.245 -146.25 -146.255 -146.26 -146.265 -146.27 -146.275 -146.28 -146.285 -146.29 -146.295 -146.3 -146.305 -146.31 -146.315 -146.32 -146.325 -146.33 -146.335 -146.34 -146.345 -146.35 -146.355 -146.36 -146.365 -146.37 -146.375 -146.38 -146.385 -146.39 -146.395 -146.4 -146.405 -146.41 -146.415 -146.42 -146.425 -146.43 -146.435 -146.44 -146.445 -146.45 -146.455 -146.46 -146.465 -146.47 -146.475 -146.48 -146.485 -146.49 -146.495 -146.5 -146.505 -146.51 -146.515 -146.52 -146.525 -146.53 -146.535 -146.54 -146.545 -146.55 -146.555 -146.56 -146.565 -146.57 -146.575 -146.58 -146.585 -146.59 -146.595 -146.6 -146.605 -146.61 -146.615 -146.62 -146.625 -146.63 -146.635 -146.64 -146.645 -146.65 -146.655 -146.66 -146.665 -146.67 -146.675 -146.68 -146.685 -146.69 -146.695 -146.7 -146.705 -146.71 -146.715 -146.72 -146.725 -146.73 -146.735 -146.74 -146.745 -146.75 -146.755 -146.76 -146.765 -146.77 -146.775 -146.78 -146.785 -146.79 -146.795 -146.8 -146.805 -146.81 -146.815 -146.82 -146.825 -146.83 -146.835 -146.84 -146.845 -146.85 -146.855 -146.86 -146.865 -146.87 -146.875 -146.88 -146.885 -146.89 -146.895 -146.9 -146.905 -146.91 -146.915 -146.92 -146.925 -146.93 -146.935 -146.94 -146.945 -146.95 -146.955 -146.96 -146.965 -146.97 -146.975 -146.98 -146.985 -146.99 -146.995 -147 -147.005 -147.01 -147.015 -147.02 -147.025 -147.03 -147.035 -147.04 -147.045 -147.05 -147.055 -147.06 -147.065 -147.07 -147.075 -147.08 -147.085 -147.09 -147.095 -147.1 -147.105 -147.11 -147.115 -147.12 -147.125 -147.13 -147.135 -147.14 -147.145 -147.15 -147.155 -147.16 -147.165 -147.17 -147.175 -147.18 -147.185 -147.19 -147.195 -147.2 -147.205 -147.21 -147.215 -147.22 -147.225 -147.23 -147.235 -147.24 -147.245 -147.25 -147.255 -147.26 -147.265 -147.27 -147.275 -147.28 -147.285 -147.29 -147.295 -147.3 -147.305 -147.31 -147.315 -147.32 -147.325 -147.33 -147.335 -147.34 -147.345 -147.35 -147.355 -147.36 -147.365 -147.37 -147.375 -147.38 -147.385 -147.39 -147.395 -147.4 -147.405 -147.41 -147.415 -147.42 -147.425 -147.43 -147.435 -147.44 -147.445 -147.45 -147.455 -147.46 -147.465 -147.47 -147.475 -147.48 -147.485 -147.49 -147.495 -147.5 -147.505 -147.51 -147.515 -147.52 -147.525 -147.53 -147.535 -147.54 -147.545 -147.55 -147.555 -147.56 -147.565 -147.57 -147.575 -147.58 -147.585 -147.59 -147.595 -147.6 -147.605 -147.61 -147.615 -147.62 -147.625 -147.63 -147.635 -147.64 -147.645 -147.65 -147.655 -147.66 -147.665 -147.67 -147.675 -147.68 -147.685 -147.69 -147.695 -147.7 -147.705 -147.71 -147.715 -147.72 -147.725 -147.73 -147.735 -147.74 -147.745 -147.75 -147.755 -147.76 -147.765 -147.77 -147.775 -147.78 -147.785 -147.79 -147.795 -147.8 -147.805 -147.81 -147.815 -147.82 -147.825 -147.83 -147.835 -147.84 -147.845 -147.85 -147.855 -147.86 -147.865 -147.87 -147.875 -147.88 -147.885 -147.89 -147.895 -147.9 -147.905 -147.91 -147.915 -147.92 -147.925 -147.93 -147.935 -147.94 -147.945 -147.95 -147.955 -147.96 -147.965 -147.97 -147.975 -147.98 -147.985 -147.99 -147.995 -148 -148.005 -148.01 -148.015 -148.02 -148.025 -148.03 -148.035 -148.04 -148.045 -148.05 -148.055 -148.06 -148.065 -148.07 -148.075 -148.08 -148.085 -148.09 -148.095 -148.1 -148.105 -148.11 -148.115 -148.12 -148.125 -148.13 -148.135 -148.14 -148.145 -148.15 -148.155 -148.16 -148.165 -148.17 -148.175 -148.18 -148.185 -148.19 -148.195 -148.2 -148.205 -148.21 -148.215 -148.22 -148.225 -148.23 -148.235 -148.24 -148.245 -148.25 -148.255 -148.26 -148.265 -148.27 -148.275 -148.28 -148.285 -148.29 -148.295 -148.3 -148.305 -148.31 -148.315 -148.32 -148.325 -148.33 -148.335 -148.34 -148.345 -148.35 -148.355 -148.36 -148.365 -148.37 -148.375 -148.38 -148.385 -148.39 -148.395 -148.4 -148.405 -148.41 -148.415 -148.42 -148.425 -148.43 -148.435 -148.44 -148.445 -148.45 -148.455 -148.46 -148.465 -148.47 -148.475 -148.48 -148.485 -148.49 -148.495 -148.5 -148.505 -148.51 -148.515 -148.52 -148.525 -148.53 -148.535 -148.54 -148.545 -148.55 -148.555 -148.56 -148.565 -148.57 -148.575 -148.58 -148.585 -148.59 -148.595 -148.6 -148.605 -148.61 -148.615 -148.62 -148.625 -148.63 -148.635 -148.64 -148.645 -148.65 -148.655 -148.66 -148.665 -148.67 -148.675 -148.68 -148.685 -148.69 -148.695 -148.7 -148.705 -148.71 -148.715 -148.72 -148.725 -148.73 -148.735 -148.74 -148.745 -148.75 -148.755 -148.76 -148.765 -148.77 -148.775 -148.78 -148.785 -148.79 -148.795 -148.8 -148.805 -148.81 -148.815 -148.82 -148.825 -148.83 -148.835 -148.84 -148.845 -148.85 -148.855 -148.86 -148.865 -148.87 -148.875 -148.88 -148.885 -148.89 -148.895 -148.9 -148.905 -148.91 -148.915 -148.92 -148.925 -148.93 -148.935 -148.94 -148.945 -148.95 -148.955 -148.96 -148.965 -148.97 -148.975 -148.98 -148.985 -148.99 -148.995 -149 -149.005 -149.01 -149.015 -149.02 -149.025 -149.03 -149.035 -149.04 -149.045 -149.05 -149.055 -149.06 -149.065 -149.07 -149.075 -149.08 -149.085 -149.09 -149.095 -149.1 -149.105 -149.11 -149.115 -149.12 -149.125 -149.13 -149.135 -149.14 -149.145 -149.15 -149.155 -149.16 -149.165 -149.17 -149.175 -149.18 -149.185 -149.19 -149.195 -149.2 -149.205 -149.21 -149.215 -149.22 -149.225 -149.23 -149.235 -149.24 -149.245 -149.25 -149.255 -149.26 -149.265 -149.27 -149.275 -149.28 -149.285 -149.29 -149.295 -149.3 -149.305 -149.31 -149.315 -149.32 -149.325 -149.33 -149.335 -149.34 -149.345 -149.35 -149.355 -149.36 -149.365 -149.37 -149.375 -149.38 -149.385 -149.39 -149.395 -149.4 -149.405 -149.41 -149.415 -149.42 -149.425 -149.43 -149.435 -149.44 -149.445 -149.45 -149.455 -149.46 -149.465 -149.47 -149.475 -149.48 -149.485 -149.49 -149.495 -149.5 -149.505 -149.51 -149.515 -149.52 -149.525 -149.53 -149.535 -149.54 -149.545 -149.55 -149.555 -149.56 -149.565 -149.57 -149.575 -149.58 -149.585 -149.59 -149.595 -149.6 -149.605 -149.61 -149.615 -149.62 -149.625 -149.63 -149.635 -149.64 -149.645 -149.65 -149.655 -149.66 -149.665 -149.67 -149.675 -149.68 -149.685 -149.69 -149.695 -149.7 -149.705 -149.71 -149.715 -149.72 -149.725 -149.73 -149.735 -149.74 -149.745 -149.75 -149.755 -149.76 -149.765 -149.77 -149.775 -149.78 -149.785 -149.79 -149.795 -149.8 -149.805 -149.81 -149.815 -149.82 -149.825 -149.83 -149.835 -149.84 -149.845 -149.85 -149.855 -149.86 -149.865 -149.87 -149.875 -149.88 -149.885 -149.89 -149.895 -149.9 -149.905 -149.91 -149.915 -149.92 -149.925 -149.93 -149.935 -149.94 -149.945 -149.95 -149.955 -149.96 -149.965 -149.97 -149.975 -149.98 -149.985 -149.99 -149.995 -150 -150.005 -150.01 -150.015 -150.02 -150.025 -150.03 -150.035 -150.04 -150.045 -150.05 -150.055 -150.06 -150.065 -150.07 -150.075 -150.08 -150.085 -150.09 -150.095 -150.1 -150.105 -150.11 -150.115 -150.12 -150.125 -150.13 -150.135 -150.14 -150.145 -150.15 -150.155 -150.16 -150.165 -150.17 -150.175 -150.18 -150.185 -150.19 -150.195 -150.2 -150.205 -150.21 -150.215 -150.22 -150.225 -150.23 -150.235 -150.24 -150.245 -150.25 -150.255 -150.26 -150.265 -150.27 -150.275 -150.28 -150.285 -150.29 -150.295 -150.3 -150.305 -150.31 -150.315 -150.32 -150.325 -150.33 -150.335 -150.34 -150.345 -150.35 -150.355 -150.36 -150.365 -150.37 -150.375 -150.38 -150.385 -150.39 -150.395 -150.4 -150.405 -150.41 -150.415 -150.42 -150.425 -150.43 -150.435 -150.44 -150.445 -150.45 -150.455 -150.46 -150.465 -150.47 -150.475 -150.48 -150.485 -150.49 -150.495 -150.5 -150.505 -150.51 -150.515 -150.52 -150.525 -150.53 -150.535 -150.54 -150.545 -150.55 -150.555 -150.56 -150.565 -150.57 -150.575 -150.58 -150.585 -150.59 -150.595 -150.6 -150.605 -150.61 -150.615 -150.62 -150.625 -150.63 -150.635 -150.64 -150.645 -150.65 -150.655 -150.66 -150.665 -150.67 -150.675 -150.68 -150.685 -150.69 -150.695 -150.7 -150.705 -150.71 -150.715 -150.72 -150.725 -150.73 -150.735 -150.74 -150.745 -150.75 -150.755 -150.76 -150.765 -150.77 -150.775 -150.78 -150.785 -150.79 -150.795 -150.8 -150.805 -150.81 -150.815 -150.82 -150.825 -150.83 -150.835 -150.84 -150.845 -150.85 -150.855 -150.86 -150.865 -150.87 -150.875 -150.88 -150.885 -150.89 -150.895 -150.9 -150.905 -150.91 -150.915 -150.92 -150.925 -150.93 -150.935 -150.94 -150.945 -150.95 -150.955 -150.96 -150.965 -150.97 -150.975 -150.98 -150.985 -150.99 -150.995 -151 -151.005 -151.01 -151.015 -151.02 -151.025 -151.03 -151.035 -151.04 -151.045 -151.05 -151.055 -151.06 -151.065 -151.07 -151.075 -151.08 -151.085 -151.09 -151.095 -151.1 -151.105 -151.11 -151.115 -151.12 -151.125 -151.13 -151.135 -151.14 -151.145 -151.15 -151.155 -151.16 -151.165 -151.17 -151.175 -151.18 -151.185 -151.19 -151.195 -151.2 -151.205 -151.21 -151.215 -151.22 -151.225 -151.23 -151.235 -151.24 -151.245 -151.25 -151.255 -151.26 -151.265 -151.27 -151.275 -151.28 -151.285 -151.29 -151.295 -151.3 -151.305 -151.31 -151.315 -151.32 -151.325 -151.33 -151.335 -151.34 -151.345 -151.35 -151.355 -151.36 -151.365 -151.37 -151.375 -151.38 -151.385 -151.39 -151.395 -151.4 -151.405 -151.41 -151.415 -151.42 -151.425 -151.43 -151.435 -151.44 -151.445 -151.45 -151.455 -151.46 -151.465 -151.47 -151.475 -151.48 -151.485 -151.49 -151.495 -151.5 -151.505 -151.51 -151.515 -151.52 -151.525 -151.53 -151.535 -151.54 -151.545 -151.55 -151.555 -151.56 -151.565 -151.57 -151.575 -151.58 -151.585 -151.59 -151.595 -151.6 -151.605 -151.61 -151.615 -151.62 -151.625 -151.63 -151.635 -151.64 -151.645 -151.65 -151.655 -151.66 -151.665 -151.67 -151.675 -151.68 -151.685 -151.69 -151.695 -151.7 -151.705 -151.71 -151.715 -151.72 -151.725 -151.73 -151.735 -151.74 -151.745 -151.75 -151.755 -151.76 -151.765 -151.77 -151.775 -151.78 -151.785 -151.79 -151.795 -151.8 -151.805 -151.81 -151.815 -151.82 -151.825 -151.83 -151.835 -151.84 -151.845 -151.85 -151.855 -151.86 -151.865 -151.87 -151.875 -151.88 -151.885 -151.89 -151.895 -151.9 -151.905 -151.91 -151.915 -151.92 -151.925 -151.93 -151.935 -151.94 -151.945 -151.95 -151.955 -151.96 -151.965 -151.97 -151.975 -151.98 -151.985 -151.99 -151.995 -152 -152.005 -152.01 -152.015 -152.02 -152.025 -152.03 -152.035 -152.04 -152.045 -152.05 -152.055 -152.06 -152.065 -152.07 -152.075 -152.08 -152.085 -152.09 -152.095 -152.1 -152.105 -152.11 -152.115 -152.12 -152.125 -152.13 -152.135 -152.14 -152.145 -152.15 -152.155 -152.16 -152.165 -152.17 -152.175 -152.18 -152.185 -152.19 -152.195 -152.2 -152.205 -152.21 -152.215 -152.22 -152.225 -152.23 -152.235 -152.24 -152.245 -152.25 -152.255 -152.26 -152.265 -152.27 -152.275 -152.28 -152.285 -152.29 -152.295 -152.3 -152.305 -152.31 -152.315 -152.32 -152.325 -152.33 -152.335 -152.34 -152.345 -152.35 -152.355 -152.36 -152.365 -152.37 -152.375 -152.38 -152.385 -152.39 -152.395 -152.4 -152.405 -152.41 -152.415 -152.42 -152.425 -152.43 -152.435 -152.44 -152.445 -152.45 -152.455 -152.46 -152.465 -152.47 -152.475 -152.48 -152.485 -152.49 -152.495 -152.5 -152.505 -152.51 -152.515 -152.52 -152.525 -152.53 -152.535 -152.54 -152.545 -152.55 -152.555 -152.56 -152.565 -152.57 -152.575 -152.58 -152.585 -152.59 -152.595 -152.6 -152.605 -152.61 -152.615 -152.62 -152.625 -152.63 -152.635 -152.64 -152.645 -152.65 -152.655 -152.66 -152.665 -152.67 -152.675 -152.68 -152.685 -152.69 -152.695 -152.7 -152.705 -152.71 -152.715 -152.72 -152.725 -152.73 -152.735 -152.74 -152.745 -152.75 -152.755 -152.76 -152.765 -152.77 -152.775 -152.78 -152.785 -152.79 -152.795 -152.8 -152.805 -152.81 -152.815 -152.82 -152.825 -152.83 -152.835 -152.84 -152.845 -152.85 -152.855 -152.86 -152.865 -152.87 -152.875 -152.88 -152.885 -152.89 -152.895 -152.9 -152.905 -152.91 -152.915 -152.92 -152.925 -152.93 -152.935 -152.94 -152.945 -152.95 -152.955 -152.96 -152.965 -152.97 -152.975 -152.98 -152.985 -152.99 -152.995 -153 -153.005 -153.01 -153.015 -153.02 -153.025 -153.03 -153.035 -153.04 -153.045 -153.05 -153.055 -153.06 -153.065 -153.07 -153.075 -153.08 -153.085 -153.09 -153.095 -153.1 -153.105 -153.11 -153.115 -153.12 -153.125 -153.13 -153.135 -153.14 -153.145 -153.15 -153.155 -153.16 -153.165 -153.17 -153.175 -153.18 -153.185 -153.19 -153.195 -153.2 -153.205 -153.21 -153.215 -153.22 -153.225 -153.23 -153.235 -153.24 -153.245 -153.25 -153.255 -153.26 -153.265 -153.27 -153.275 -153.28 -153.285 -153.29 -153.295 -153.3 -153.305 -153.31 -153.315 -153.32 -153.325 -153.33 -153.335 -153.34 -153.345 -153.35 -153.355 -153.36 -153.365 -153.37 -153.375 -153.38 -153.385 -153.39 -153.395 -153.4 -153.405 -153.41 -153.415 -153.42 -153.425 -153.43 -153.435 -153.44 -153.445 -153.45 -153.455 -153.46 -153.465 -153.47 -153.475 -153.48 -153.485 -153.49 -153.495 -153.5 -153.505 -153.51 -153.515 -153.52 -153.525 -153.53 -153.535 -153.54 -153.545 -153.55 -153.555 -153.56 -153.565 -153.57 -153.575 -153.58 -153.585 -153.59 -153.595 -153.6 -153.605 -153.61 -153.615 -153.62 -153.625 -153.63 -153.635 -153.64 -153.645 -153.65 -153.655 -153.66 -153.665 -153.67 -153.675 -153.68 -153.685 -153.69 -153.695 -153.7 -153.705 -153.71 -153.715 -153.72 -153.725 -153.73 -153.735 -153.74 -153.745 -153.75 -153.755 -153.76 -153.765 -153.77 -153.775 -153.78 -153.785 -153.79 -153.795 -153.8 -153.805 -153.81 -153.815 -153.82 -153.825 -153.83 -153.835 -153.84 -153.845 -153.85 -153.855 -153.86 -153.865 -153.87 -153.875 -153.88 -153.885 -153.89 -153.895 -153.9 -153.905 -153.91 -153.915 -153.92 -153.925 -153.93 -153.935 -153.94 -153.945 -153.95 -153.955 -153.96 -153.965 -153.97 -153.975 -153.98 -153.985 -153.99 -153.995 -154 -154.005 -154.01 -154.015 -154.02 -154.025 -154.03 -154.035 -154.04 -154.045 -154.05 -154.055 -154.06 -154.065 -154.07 -154.075 -154.08 -154.085 -154.09 -154.095 -154.1 -154.105 -154.11 -154.115 -154.12 -154.125 -154.13 -154.135 -154.14 -154.145 -154.15 -154.155 -154.16 -154.165 -154.17 -154.175 -154.18 -154.185 -154.19 -154.195 -154.2 -154.205 -154.21 -154.215 -154.22 -154.225 -154.23 -154.235 -154.24 -154.245 -154.25 -154.255 -154.26 -154.265 -154.27 -154.275 -154.28 -154.285 -154.29 -154.295 -154.3 -154.305 -154.31 -154.315 -154.32 -154.325 -154.33 -154.335 -154.34 -154.345 -154.35 -154.355 -154.36 -154.365 -154.37 -154.375 -154.38 -154.385 -154.39 -154.395 -154.4 -154.405 -154.41 -154.415 -154.42 -154.425 -154.43 -154.435 -154.44 -154.445 -154.45 -154.455 -154.46 -154.465 -154.47 -154.475 -154.48 -154.485 -154.49 -154.495 -154.5 -154.505 -154.51 -154.515 -154.52 -154.525 -154.53 -154.535 -154.54 -154.545 -154.55 -154.555 -154.56 -154.565 -154.57 -154.575 -154.58 -154.585 -154.59 -154.595 -154.6 -154.605 -154.61 -154.615 -154.62 -154.625 -154.63 -154.635 -154.64 -154.645 -154.65 -154.655 -154.66 -154.665 -154.67 -154.675 -154.68 -154.685 -154.69 -154.695 -154.7 -154.705 -154.71 -154.715 -154.72 -154.725 -154.73 -154.735 -154.74 -154.745 -154.75 -154.755 -154.76 -154.765 -154.77 -154.775 -154.78 -154.785 -154.79 -154.795 -154.8 -154.805 -154.81 -154.815 -154.82 -154.825 -154.83 -154.835 -154.84 -154.845 -154.85 -154.855 -154.86 -154.865 -154.87 -154.875 -154.88 -154.885 -154.89 -154.895 -154.9 -154.905 -154.91 -154.915 -154.92 -154.925 -154.93 -154.935 -154.94 -154.945 -154.95 -154.955 -154.96 -154.965 -154.97 -154.975 -154.98 -154.985 -154.99 -154.995 -155 -155.005 -155.01 -155.015 -155.02 -155.025 -155.03 -155.035 -155.04 -155.045 -155.05 -155.055 -155.06 -155.065 -155.07 -155.075 -155.08 -155.085 -155.09 -155.095 -155.1 -155.105 -155.11 -155.115 -155.12 -155.125 -155.13 -155.135 -155.14 -155.145 -155.15 -155.155 -155.16 -155.165 -155.17 -155.175 -155.18 -155.185 -155.19 -155.195 -155.2 -155.205 -155.21 -155.215 -155.22 -155.225 -155.23 -155.235 -155.24 -155.245 -155.25 -155.255 -155.26 -155.265 -155.27 -155.275 -155.28 -155.285 -155.29 -155.295 -155.3 -155.305 -155.31 -155.315 -155.32 -155.325 -155.33 -155.335 -155.34 -155.345 -155.35 -155.355 -155.36 -155.365 -155.37 -155.375 -155.38 -155.385 -155.39 -155.395 -155.4 -155.405 -155.41 -155.415 -155.42 -155.425 -155.43 -155.435 -155.44 -155.445 -155.45 -155.455 -155.46 -155.465 -155.47 -155.475 -155.48 -155.485 -155.49 -155.495 -155.5 -155.505 -155.51 -155.515 -155.52 -155.525 -155.53 -155.535 -155.54 -155.545 -155.55 -155.555 -155.56 -155.565 -155.57 -155.575 -155.58 -155.585 -155.59 -155.595 -155.6 -155.605 -155.61 -155.615 -155.62 -155.625 -155.63 -155.635 -155.64 -155.645 -155.65 -155.655 -155.66 -155.665 -155.67 -155.675 -155.68 -155.685 -155.69 -155.695 -155.7 -155.705 -155.71 -155.715 -155.72 -155.725 -155.73 -155.735 -155.74 -155.745 -155.75 -155.755 -155.76 -155.765 -155.77 -155.775 -155.78 -155.785 -155.79 -155.795 -155.8 -155.805 -155.81 -155.815 -155.82 -155.825 -155.83 -155.835 -155.84 -155.845 -155.85 -155.855 -155.86 -155.865 -155.87 -155.875 -155.88 -155.885 -155.89 -155.895 -155.9 -155.905 -155.91 -155.915 -155.92 -155.925 -155.93 -155.935 -155.94 -155.945 -155.95 -155.955 -155.96 -155.965 -155.97 -155.975 -155.98 -155.985 -155.99 -155.995 -156 -156.005 -156.01 -156.015 -156.02 -156.025 -156.03 -156.035 -156.04 -156.045 -156.05 -156.055 -156.06 -156.065 -156.07 -156.075 -156.08 -156.085 -156.09 -156.095 -156.1 -156.105 -156.11 -156.115 -156.12 -156.125 -156.13 -156.135 -156.14 -156.145 -156.15 -156.155 -156.16 -156.165 -156.17 -156.175 -156.18 -156.185 -156.19 -156.195 -156.2 -156.205 -156.21 -156.215 -156.22 -156.225 -156.23 -156.235 -156.24 -156.245 -156.25 -156.255 -156.26 -156.265 -156.27 -156.275 -156.28 -156.285 -156.29 -156.295 -156.3 -156.305 -156.31 -156.315 -156.32 -156.325 -156.33 -156.335 -156.34 -156.345 -156.35 -156.355 -156.36 -156.365 -156.37 -156.375 -156.38 -156.385 -156.39 -156.395 -156.4 -156.405 -156.41 -156.415 -156.42 -156.425 -156.43 -156.435 -156.44 -156.445 -156.45 -156.455 -156.46 -156.465 -156.47 -156.475 -156.48 -156.485 -156.49 -156.495 -156.5 -156.505 -156.51 -156.515 -156.52 -156.525 -156.53 -156.535 -156.54 -156.545 -156.55 -156.555 -156.56 -156.565 -156.57 -156.575 -156.58 -156.585 -156.59 -156.595 -156.6 -156.605 -156.61 -156.615 -156.62 -156.625 -156.63 -156.635 -156.64 -156.645 -156.65 -156.655 -156.66 -156.665 -156.67 -156.675 -156.68 -156.685 -156.69 -156.695 -156.7 -156.705 -156.71 -156.715 -156.72 -156.725 -156.73 -156.735 -156.74 -156.745 -156.75 -156.755 -156.76 -156.765 -156.77 -156.775 -156.78 -156.785 -156.79 -156.795 -156.8 -156.805 -156.81 -156.815 -156.82 -156.825 -156.83 -156.835 -156.84 -156.845 -156.85 -156.855 -156.86 -156.865 -156.87 -156.875 -156.88 -156.885 -156.89 -156.895 -156.9 -156.905 -156.91 -156.915 -156.92 -156.925 -156.93 -156.935 -156.94 -156.945 -156.95 -156.955 -156.96 -156.965 -156.97 -156.975 -156.98 -156.985 -156.99 -156.995 -157 -157.005 -157.01 -157.015 -157.02 -157.025 -157.03 -157.035 -157.04 -157.045 -157.05 -157.055 -157.06 -157.065 -157.07 -157.075 -157.08 -157.085 -157.09 -157.095 -157.1 -157.105 -157.11 -157.115 -157.12 -157.125 -157.13 -157.135 -157.14 -157.145 -157.15 -157.155 -157.16 -157.165 -157.17 -157.175 -157.18 -157.185 -157.19 -157.195 -157.2 -157.205 -157.21 -157.215 -157.22 -157.225 -157.23 -157.235 -157.24 -157.245 -157.25 -157.255 -157.26 -157.265 -157.27 -157.275 -157.28 -157.285 -157.29 -157.295 -157.3 -157.305 -157.31 -157.315 -157.32 -157.325 -157.33 -157.335 -157.34 -157.345 -157.35 -157.355 -157.36 -157.365 -157.37 -157.375 -157.38 -157.385 -157.39 -157.395 -157.4 -157.405 -157.41 -157.415 -157.42 -157.425 -157.43 -157.435 -157.44 -157.445 -157.45 -157.455 -157.46 -157.465 -157.47 -157.475 -157.48 -157.485 -157.49 -157.495 -157.5 -157.505 -157.51 -157.515 -157.52 -157.525 -157.53 -157.535 -157.54 -157.545 -157.55 -157.555 -157.56 -157.565 -157.57 -157.575 -157.58 -157.585 -157.59 -157.595 -157.6 -157.605 -157.61 -157.615 -157.62 -157.625 -157.63 -157.635 -157.64 -157.645 -157.65 -157.655 -157.66 -157.665 -157.67 -157.675 -157.68 -157.685 -157.69 -157.695 -157.7 -157.705 -157.71 -157.715 -157.72 -157.725 -157.73 -157.735 -157.74 -157.745 -157.75 -157.755 -157.76 -157.765 -157.77 -157.775 -157.78 -157.785 -157.79 -157.795 -157.8 -157.805 -157.81 -157.815 -157.82 -157.825 -157.83 -157.835 -157.84 -157.845 -157.85 -157.855 -157.86 -157.865 -157.87 -157.875 -157.88 -157.885 -157.89 -157.895 -157.9 -157.905 -157.91 -157.915 -157.92 -157.925 -157.93 -157.935 -157.94 -157.945 -157.95 -157.955 -157.96 -157.965 -157.97 -157.975 -157.98 -157.985 -157.99 -157.995 -158 -158.005 -158.01 -158.015 -158.02 -158.025 -158.03 -158.035 -158.04 -158.045 -158.05 -158.055 -158.06 -158.065 -158.07 -158.075 -158.08 -158.085 -158.09 -158.095 -158.1 -158.105 -158.11 -158.115 -158.12 -158.125 -158.13 -158.135 -158.14 -158.145 -158.15 -158.155 -158.16 -158.165 -158.17 -158.175 -158.18 -158.185 -158.19 -158.195 -158.2 -158.205 -158.21 -158.215 -158.22 -158.225 -158.23 -158.235 -158.24 -158.245 -158.25 -158.255 -158.26 -158.265 -158.27 -158.275 -158.28 -158.285 -158.29 -158.295 -158.3 -158.305 -158.31 -158.315 -158.32 -158.325 -158.33 -158.335 -158.34 -158.345 -158.35 -158.355 -158.36 -158.365 -158.37 -158.375 -158.38 -158.385 -158.39 -158.395 -158.4 -158.405 -158.41 -158.415 -158.42 -158.425 -158.43 -158.435 -158.44 -158.445 -158.45 -158.455 -158.46 -158.465 -158.47 -158.475 -158.48 -158.485 -158.49 -158.495 -158.5 -158.505 -158.51 -158.515 -158.52 -158.525 -158.53 -158.535 -158.54 -158.545 -158.55 -158.555 -158.56 -158.565 -158.57 -158.575 -158.58 -158.585 -158.59 -158.595 -158.6 -158.605 -158.61 -158.615 -158.62 -158.625 -158.63 -158.635 -158.64 -158.645 -158.65 -158.655 -158.66 -158.665 -158.67 -158.675 -158.68 -158.685 -158.69 -158.695 -158.7 -158.705 -158.71 -158.715 -158.72 -158.725 -158.73 -158.735 -158.74 -158.745 -158.75 -158.755 -158.76 -158.765 -158.77 -158.775 -158.78 -158.785 -158.79 -158.795 -158.8 -158.805 -158.81 -158.815 -158.82 -158.825 -158.83 -158.835 -158.84 -158.845 -158.85 -158.855 -158.86 -158.865 -158.87 -158.875 -158.88 -158.885 -158.89 -158.895 -158.9 -158.905 -158.91 -158.915 -158.92 -158.925 -158.93 -158.935 -158.94 -158.945 -158.95 -158.955 -158.96 -158.965 -158.97 -158.975 -158.98 -158.985 -158.99 -158.995 -159 -159.005 -159.01 -159.015 -159.02 -159.025 -159.03 -159.035 -159.04 -159.045 -159.05 -159.055 -159.06 -159.065 -159.07 -159.075 -159.08 -159.085 -159.09 -159.095 -159.1 -159.105 -159.11 -159.115 -159.12 -159.125 -159.13 -159.135 -159.14 -159.145 -159.15 -159.155 -159.16 -159.165 -159.17 -159.175 -159.18 -159.185 -159.19 -159.195 -159.2 -159.205 -159.21 -159.215 -159.22 -159.225 -159.23 -159.235 -159.24 -159.245 -159.25 -159.255 -159.26 -159.265 -159.27 -159.275 -159.28 -159.285 -159.29 -159.295 -159.3 -159.305 -159.31 -159.315 -159.32 -159.325 -159.33 -159.335 -159.34 -159.345 -159.35 -159.355 -159.36 -159.365 -159.37 -159.375 -159.38 -159.385 -159.39 -159.395 -159.4 -159.405 -159.41 -159.415 -159.42 -159.425 -159.43 -159.435 -159.44 -159.445 -159.45 -159.455 -159.46 -159.465 -159.47 -159.475 -159.48 -159.485 -159.49 -159.495 -159.5 -159.505 -159.51 -159.515 -159.52 -159.525 -159.53 -159.535 -159.54 -159.545 -159.55 -159.555 -159.56 -159.565 -159.57 -159.575 -159.58 -159.585 -159.59 -159.595 -159.6 -159.605 -159.61 -159.615 -159.62 -159.625 -159.63 -159.635 -159.64 -159.645 -159.65 -159.655 -159.66 -159.665 -159.67 -159.675 -159.68 -159.685 -159.69 -159.695 -159.7 -159.705 -159.71 -159.715 -159.72 -159.725 -159.73 -159.735 -159.74 -159.745 -159.75 -159.755 -159.76 -159.765 -159.77 -159.775 -159.78 -159.785 -159.79 -159.795 -159.8 -159.805 -159.81 -159.815 -159.82 -159.825 -159.83 -159.835 -159.84 -159.845 -159.85 -159.855 -159.86 -159.865 -159.87 -159.875 -159.88 -159.885 -159.89 -159.895 -159.9 -159.905 -159.91 -159.915 -159.92 -159.925 -159.93 -159.935 -159.94 -159.945 -159.95 -159.955 -159.96 -159.965 -159.97 -159.975 -159.98 -159.985 -159.99 -159.995 -160 -160.005 -160.01 -160.015 -160.02 -160.025 -160.03 -160.035 -160.04 -160.045 -160.05 -160.055 -160.06 -160.065 -160.07 -160.075 -160.08 -160.085 -160.09 -160.095 -160.1 -160.105 -160.11 -160.115 -160.12 -160.125 -160.13 -160.135 -160.14 -160.145 -160.15 -160.155 -160.16 -160.165 -160.17 -160.175 -160.18 -160.185 -160.19 -160.195 -160.2 -160.205 -160.21 -160.215 -160.22 -160.225 -160.23 -160.235 -160.24 -160.245 -160.25 -160.255 -160.26 -160.265 -160.27 -160.275 -160.28 -160.285 -160.29 -160.295 -160.3 -160.305 -160.31 -160.315 -160.32 -160.325 -160.33 -160.335 -160.34 -160.345 -160.35 -160.355 -160.36 -160.365 -160.37 -160.375 -160.38 -160.385 -160.39 -160.395 -160.4 -160.405 -160.41 -160.415 -160.42 -160.425 -160.43 -160.435 -160.44 -160.445 -160.45 -160.455 -160.46 -160.465 -160.47 -160.475 -160.48 -160.485 -160.49 -160.495 -160.5 -160.505 -160.51 -160.515 -160.52 -160.525 -160.53 -160.535 -160.54 -160.545 -160.55 -160.555 -160.56 -160.565 -160.57 -160.575 -160.58 -160.585 -160.59 -160.595 -160.6 -160.605 -160.61 -160.615 -160.62 -160.625 -160.63 -160.635 -160.64 -160.645 -160.65 -160.655 -160.66 -160.665 -160.67 -160.675 -160.68 -160.685 -160.69 -160.695 -160.7 -160.705 -160.71 -160.715 -160.72 -160.725 -160.73 -160.735 -160.74 -160.745 -160.75 -160.755 -160.76 -160.765 -160.77 -160.775 -160.78 -160.785 -160.79 -160.795 -160.8 -160.805 -160.81 -160.815 -160.82 -160.825 -160.83 -160.835 -160.84 -160.845 -160.85 -160.855 -160.86 -160.865 -160.87 -160.875 -160.88 -160.885 -160.89 -160.895 -160.9 -160.905 -160.91 -160.915 -160.92 -160.925 -160.93 -160.935 -160.94 -160.945 -160.95 -160.955 -160.96 -160.965 -160.97 -160.975 -160.98 -160.985 -160.99 -160.995 -161 -161.005 -161.01 -161.015 -161.02 -161.025 -161.03 -161.035 -161.04 -161.045 -161.05 -161.055 -161.06 -161.065 -161.07 -161.075 -161.08 -161.085 -161.09 -161.095 -161.1 -161.105 -161.11 -161.115 -161.12 -161.125 -161.13 -161.135 -161.14 -161.145 -161.15 -161.155 -161.16 -161.165 -161.17 -161.175 -161.18 -161.185 -161.19 -161.195 -161.2 -161.205 -161.21 -161.215 -161.22 -161.225 -161.23 -161.235 -161.24 -161.245 -161.25 -161.255 -161.26 -161.265 -161.27 -161.275 -161.28 -161.285 -161.29 -161.295 -161.3 -161.305 -161.31 -161.315 -161.32 -161.325 -161.33 -161.335 -161.34 -161.345 -161.35 -161.355 -161.36 -161.365 -161.37 -161.375 -161.38 -161.385 -161.39 -161.395 -161.4 -161.405 -161.41 -161.415 -161.42 -161.425 -161.43 -161.435 -161.44 -161.445 -161.45 -161.455 -161.46 -161.465 -161.47 -161.475 -161.48 -161.485 -161.49 -161.495 -161.5 -161.505 -161.51 -161.515 -161.52 -161.525 -161.53 -161.535 -161.54 -161.545 -161.55 -161.555 -161.56 -161.565 -161.57 -161.575 -161.58 -161.585 -161.59 -161.595 -161.6 -161.605 -161.61 -161.615 -161.62 -161.625 -161.63 -161.635 -161.64 -161.645 -161.65 -161.655 -161.66 -161.665 -161.67 -161.675 -161.68 -161.685 -161.69 -161.695 -161.7 -161.705 -161.71 -161.715 -161.72 -161.725 -161.73 -161.735 -161.74 -161.745 -161.75 -161.755 -161.76 -161.765 -161.77 -161.775 -161.78 -161.785 -161.79 -161.795 -161.8 -161.805 -161.81 -161.815 -161.82 -161.825 -161.83 -161.835 -161.84 -161.845 -161.85 -161.855 -161.86 -161.865 -161.87 -161.875 -161.88 -161.885 -161.89 -161.895 -161.9 -161.905 -161.91 -161.915 -161.92 -161.925 -161.93 -161.935 -161.94 -161.945 -161.95 -161.955 -161.96 -161.965 -161.97 -161.975 -161.98 -161.985 -161.99 -161.995 -162 -162.005 -162.01 -162.015 -162.02 -162.025 -162.03 -162.035 -162.04 -162.045 -162.05 -162.055 -162.06 -162.065 -162.07 -162.075 -162.08 -162.085 -162.09 -162.095 -162.1 -162.105 -162.11 -162.115 -162.12 -162.125 -162.13 -162.135 -162.14 -162.145 -162.15 -162.155 -162.16 -162.165 -162.17 -162.175 -162.18 -162.185 -162.19 -162.195 -162.2 -162.205 -162.21 -162.215 -162.22 -162.225 -162.23 -162.235 -162.24 -162.245 -162.25 -162.255 -162.26 -162.265 -162.27 -162.275 -162.28 -162.285 -162.29 -162.295 -162.3 -162.305 -162.31 -162.315 -162.32 -162.325 -162.33 -162.335 -162.34 -162.345 -162.35 -162.355 -162.36 -162.365 -162.37 -162.375 -162.38 -162.385 -162.39 -162.395 -162.4 -162.405 -162.41 -162.415 -162.42 -162.425 -162.43 -162.435 -162.44 -162.445 -162.45 -162.455 -162.46 -162.465 -162.47 -162.475 -162.48 -162.485 -162.49 -162.495 -162.5 -162.505 -162.51 -162.515 -162.52 -162.525 -162.53 -162.535 -162.54 -162.545 -162.55 -162.555 -162.56 -162.565 -162.57 -162.575 -162.58 -162.585 -162.59 -162.595 -162.6 -162.605 -162.61 -162.615 -162.62 -162.625 -162.63 -162.635 -162.64 -162.645 -162.65 -162.655 -162.66 -162.665 -162.67 -162.675 -162.68 -162.685 -162.69 -162.695 -162.7 -162.705 -162.71 -162.715 -162.72 -162.725 -162.73 -162.735 -162.74 -162.745 -162.75 -162.755 -162.76 -162.765 -162.77 -162.775 -162.78 -162.785 -162.79 -162.795 -162.8 -162.805 -162.81 -162.815 -162.82 -162.825 -162.83 -162.835 -162.84 -162.845 -162.85 -162.855 -162.86 -162.865 -162.87 -162.875 -162.88 -162.885 -162.89 -162.895 -162.9 -162.905 -162.91 -162.915 -162.92 -162.925 -162.93 -162.935 -162.94 -162.945 -162.95 -162.955 -162.96 -162.965 -162.97 -162.975 -162.98 -162.985 -162.99 -162.995 -163 -163.005 -163.01 -163.015 -163.02 -163.025 -163.03 -163.035 -163.04 -163.045 -163.05 -163.055 -163.06 -163.065 -163.07 -163.075 -163.08 -163.085 -163.09 -163.095 -163.1 -163.105 -163.11 -163.115 -163.12 -163.125 -163.13 -163.135 -163.14 -163.145 -163.15 -163.155 -163.16 -163.165 -163.17 -163.175 -163.18 -163.185 -163.19 -163.195 -163.2 -163.205 -163.21 -163.215 -163.22 -163.225 -163.23 -163.235 -163.24 -163.245 -163.25 -163.255 -163.26 -163.265 -163.27 -163.275 -163.28 -163.285 -163.29 -163.295 -163.3 -163.305 -163.31 -163.315 -163.32 -163.325 -163.33 -163.335 -163.34 -163.345 -163.35 -163.355 -163.36 -163.365 -163.37 -163.375 -163.38 -163.385 -163.39 -163.395 -163.4 -163.405 -163.41 -163.415 -163.42 -163.425 -163.43 -163.435 -163.44 -163.445 -163.45 -163.455 -163.46 -163.465 -163.47 -163.475 -163.48 -163.485 -163.49 -163.495 -163.5 -163.505 -163.51 -163.515 -163.52 -163.525 -163.53 -163.535 -163.54 -163.545 -163.55 -163.555 -163.56 -163.565 -163.57 -163.575 -163.58 -163.585 -163.59 -163.595 -163.6 -163.605 -163.61 -163.615 -163.62 -163.625 -163.63 -163.635 -163.64 -163.645 -163.65 -163.655 -163.66 -163.665 -163.67 -163.675 -163.68 -163.685 -163.69 -163.695 -163.7 -163.705 -163.71 -163.715 -163.72 -163.725 -163.73 -163.735 -163.74 -163.745 -163.75 -163.755 -163.76 -163.765 -163.77 -163.775 -163.78 -163.785 -163.79 -163.795 -163.8 -163.805 -163.81 -163.815 -163.82 -163.825 -163.83 -163.835 -163.84 -163.845 -163.85 -163.855 -163.86 -163.865 -163.87 -163.875 -163.88 -163.885 -163.89 -163.895 -163.9 -163.905 -163.91 -163.915 -163.92 -163.925 -163.93 -163.935 -163.94 -163.945 -163.95 -163.955 -163.96 -163.965 -163.97 -163.975 -163.98 -163.985 -163.99 -163.995 -164 -164.005 -164.01 -164.015 -164.02 -164.025 -164.03 -164.035 -164.04 -164.045 -164.05 -164.055 -164.06 -164.065 -164.07 -164.075 -164.08 -164.085 -164.09 -164.095 -164.1 -164.105 -164.11 -164.115 -164.12 -164.125 -164.13 -164.135 -164.14 -164.145 -164.15 -164.155 -164.16 -164.165 -164.17 -164.175 -164.18 -164.185 -164.19 -164.195 -164.2 -164.205 -164.21 -164.215 -164.22 -164.225 -164.23 -164.235 -164.24 -164.245 -164.25 -164.255 -164.26 -164.265 -164.27 -164.275 -164.28 -164.285 -164.29 -164.295 -164.3 -164.305 -164.31 -164.315 -164.32 -164.325 -164.33 -164.335 -164.34 -164.345 -164.35 -164.355 -164.36 -164.365 -164.37 -164.375 -164.38 -164.385 -164.39 -164.395 -164.4 -164.405 -164.41 -164.415 -164.42 -164.425 -164.43 -164.435 -164.44 -164.445 -164.45 -164.455 -164.46 -164.465 -164.47 -164.475 -164.48 -164.485 -164.49 -164.495 -164.5 -164.505 -164.51 -164.515 -164.52 -164.525 -164.53 -164.535 -164.54 -164.545 -164.55 -164.555 -164.56 -164.565 -164.57 -164.575 -164.58 -164.585 -164.59 -164.595 -164.6 -164.605 -164.61 -164.615 -164.62 -164.625 -164.63 -164.635 -164.64 -164.645 -164.65 -164.655 -164.66 -164.665 -164.67 -164.675 -164.68 -164.685 -164.69 -164.695 -164.7 -164.705 -164.71 -164.715 -164.72 -164.725 -164.73 -164.735 -164.74 -164.745 -164.75 -164.755 -164.76 -164.765 -164.77 -164.775 -164.78 -164.785 -164.79 -164.795 -164.8 -164.805 -164.81 -164.815 -164.82 -164.825 -164.83 -164.835 -164.84 -164.845 -164.85 -164.855 -164.86 -164.865 -164.87 -164.875 -164.88 -164.885 -164.89 -164.895 -164.9 -164.905 -164.91 -164.915 -164.92 -164.925 -164.93 -164.935 -164.94 -164.945 -164.95 -164.955 -164.96 -164.965 -164.97 -164.975 -164.98 -164.985 -164.99 -164.995 -165 -165.005 -165.01 -165.015 -165.02 -165.025 -165.03 -165.035 -165.04 -165.045 -165.05 -165.055 -165.06 -165.065 -165.07 -165.075 -165.08 -165.085 -165.09 -165.095 -165.1 -165.105 -165.11 -165.115 -165.12 -165.125 -165.13 -165.135 -165.14 -165.145 -165.15 -165.155 -165.16 -165.165 -165.17 -165.175 -165.18 -165.185 -165.19 -165.195 -165.2 -165.205 -165.21 -165.215 -165.22 -165.225 -165.23 -165.235 -165.24 -165.245 -165.25 -165.255 -165.26 -165.265 -165.27 -165.275 -165.28 -165.285 -165.29 -165.295 -165.3 -165.305 -165.31 -165.315 -165.32 -165.325 -165.33 -165.335 -165.34 -165.345 -165.35 -165.355 -165.36 -165.365 -165.37 -165.375 -165.38 -165.385 -165.39 -165.395 -165.4 -165.405 -165.41 -165.415 -165.42 -165.425 -165.43 -165.435 -165.44 -165.445 -165.45 -165.455 -165.46 -165.465 -165.47 -165.475 -165.48 -165.485 -165.49 -165.495 -165.5 -165.505 -165.51 -165.515 -165.52 -165.525 -165.53 -165.535 -165.54 -165.545 -165.55 -165.555 -165.56 -165.565 -165.57 -165.575 -165.58 -165.585 -165.59 -165.595 -165.6 -165.605 -165.61 -165.615 -165.62 -165.625 -165.63 -165.635 -165.64 -165.645 -165.65 -165.655 -165.66 -165.665 -165.67 -165.675 -165.68 -165.685 -165.69 -165.695 -165.7 -165.705 -165.71 -165.715 -165.72 -165.725 -165.73 -165.735 -165.74 -165.745 -165.75 -165.755 -165.76 -165.765 -165.77 -165.775 -165.78 -165.785 -165.79 -165.795 -165.8 -165.805 -165.81 -165.815 -165.82 -165.825 -165.83 -165.835 -165.84 -165.845 -165.85 -165.855 -165.86 -165.865 -165.87 -165.875 -165.88 -165.885 -165.89 -165.895 -165.9 -165.905 -165.91 -165.915 -165.92 -165.925 -165.93 -165.935 -165.94 -165.945 -165.95 -165.955 -165.96 -165.965 -165.97 -165.975 -165.98 -165.985 -165.99 -165.995 -166 -166.005 -166.01 -166.015 -166.02 -166.025 -166.03 -166.035 -166.04 -166.045 -166.05 -166.055 -166.06 -166.065 -166.07 -166.075 -166.08 -166.085 -166.09 -166.095 -166.1 -166.105 -166.11 -166.115 -166.12 -166.125 -166.13 -166.135 -166.14 -166.145 -166.15 -166.155 -166.16 -166.165 -166.17 -166.175 -166.18 -166.185 -166.19 -166.195 -166.2 -166.205 -166.21 -166.215 -166.22 -166.225 -166.23 -166.235 -166.24 -166.245 -166.25 -166.255 -166.26 -166.265 -166.27 -166.275 -166.28 -166.285 -166.29 -166.295 -166.3 -166.305 -166.31 -166.315 -166.32 -166.325 -166.33 -166.335 -166.34 -166.345 -166.35 -166.355 -166.36 -166.365 -166.37 -166.375 -166.38 -166.385 -166.39 -166.395 -166.4 -166.405 -166.41 -166.415 -166.42 -166.425 -166.43 -166.435 -166.44 -166.445 -166.45 -166.455 -166.46 -166.465 -166.47 -166.475 -166.48 -166.485 -166.49 -166.495 -166.5 -166.505 -166.51 -166.515 -166.52 -166.525 -166.53 -166.535 -166.54 -166.545 -166.55 -166.555 -166.56 -166.565 -166.57 -166.575 -166.58 -166.585 -166.59 -166.595 -166.6 -166.605 -166.61 -166.615 -166.62 -166.625 -166.63 -166.635 -166.64 -166.645 -166.65 -166.655 -166.66 -166.665 -166.67 -166.675 -166.68 -166.685 -166.69 -166.695 -166.7 -166.705 -166.71 -166.715 -166.72 -166.725 -166.73 -166.735 -166.74 -166.745 -166.75 -166.755 -166.76 -166.765 -166.77 -166.775 -166.78 -166.785 -166.79 -166.795 -166.8 -166.805 -166.81 -166.815 -166.82 -166.825 -166.83 -166.835 -166.84 -166.845 -166.85 -166.855 -166.86 -166.865 -166.87 -166.875 -166.88 -166.885 -166.89 -166.895 -166.9 -166.905 -166.91 -166.915 -166.92 -166.925 -166.93 -166.935 -166.94 -166.945 -166.95 -166.955 -166.96 -166.965 -166.97 -166.975 -166.98 -166.985 -166.99 -166.995 -167 -167.005 -167.01 -167.015 -167.02 -167.025 -167.03 -167.035 -167.04 -167.045 -167.05 -167.055 -167.06 -167.065 -167.07 -167.075 -167.08 -167.085 -167.09 -167.095 -167.1 -167.105 -167.11 -167.115 -167.12 -167.125 -167.13 -167.135 -167.14 -167.145 -167.15 -167.155 -167.16 -167.165 -167.17 -167.175 -167.18 -167.185 -167.19 -167.195 -167.2 -167.205 -167.21 -167.215 -167.22 -167.225 -167.23 -167.235 -167.24 -167.245 -167.25 -167.255 -167.26 -167.265 -167.27 -167.275 -167.28 -167.285 -167.29 -167.295 -167.3 -167.305 -167.31 -167.315 -167.32 -167.325 -167.33 -167.335 -167.34 -167.345 -167.35 -167.355 -167.36 -167.365 -167.37 -167.375 -167.38 -167.385 -167.39 -167.395 -167.4 -167.405 -167.41 -167.415 -167.42 -167.425 -167.43 -167.435 -167.44 -167.445 -167.45 -167.455 -167.46 -167.465 -167.47 -167.475 -167.48 -167.485 -167.49 -167.495 -167.5 -167.505 -167.51 -167.515 -167.52 -167.525 -167.53 -167.535 -167.54 -167.545 -167.55 -167.555 -167.56 -167.565 -167.57 -167.575 -167.58 -167.585 -167.59 -167.595 -167.6 -167.605 -167.61 -167.615 -167.62 -167.625 -167.63 -167.635 -167.64 -167.645 -167.65 -167.655 -167.66 -167.665 -167.67 -167.675 -167.68 -167.685 -167.69 -167.695 -167.7 -167.705 -167.71 -167.715 -167.72 -167.725 -167.73 -167.735 -167.74 -167.745 -167.75 -167.755 -167.76 -167.765 -167.77 -167.775 -167.78 -167.785 -167.79 -167.795 -167.8 -167.805 -167.81 -167.815 -167.82 -167.825 -167.83 -167.835 -167.84 -167.845 -167.85 -167.855 -167.86 -167.865 -167.87 -167.875 -167.88 -167.885 -167.89 -167.895 -167.9 -167.905 -167.91 -167.915 -167.92 -167.925 -167.93 -167.935 -167.94 -167.945 -167.95 -167.955 -167.96 -167.965 -167.97 -167.975 -167.98 -167.985 -167.99 -167.995 -168 -168.005 -168.01 -168.015 -168.02 -168.025 -168.03 -168.035 -168.04 -168.045 -168.05 -168.055 -168.06 -168.065 -168.07 -168.075 -168.08 -168.085 -168.09 -168.095 -168.1 -168.105 -168.11 -168.115 -168.12 -168.125 -168.13 -168.135 -168.14 -168.145 -168.15 -168.155 -168.16 -168.165 -168.17 -168.175 -168.18 -168.185 -168.19 -168.195 -168.2 -168.205 -168.21 -168.215 -168.22 -168.225 -168.23 -168.235 -168.24 -168.245 -168.25 -168.255 -168.26 -168.265 -168.27 -168.275 -168.28 -168.285 -168.29 -168.295 -168.3 -168.305 -168.31 -168.315 -168.32 -168.325 -168.33 -168.335 -168.34 -168.345 -168.35 -168.355 -168.36 -168.365 -168.37 -168.375 -168.38 -168.385 -168.39 -168.395 -168.4 -168.405 -168.41 -168.415 -168.42 -168.425 -168.43 -168.435 -168.44 -168.445 -168.45 -168.455 -168.46 -168.465 -168.47 -168.475 -168.48 -168.485 -168.49 -168.495 -168.5 -168.505 -168.51 -168.515 -168.52 -168.525 -168.53 -168.535 -168.54 -168.545 -168.55 -168.555 -168.56 -168.565 -168.57 -168.575 -168.58 -168.585 -168.59 -168.595 -168.6 -168.605 -168.61 -168.615 -168.62 -168.625 -168.63 -168.635 -168.64 -168.645 -168.65 -168.655 -168.66 -168.665 -168.67 -168.675 -168.68 -168.685 -168.69 -168.695 -168.7 -168.705 -168.71 -168.715 -168.72 -168.725 -168.73 -168.735 -168.74 -168.745 -168.75 -168.755 -168.76 -168.765 -168.77 -168.775 -168.78 -168.785 -168.79 -168.795 -168.8 -168.805 -168.81 -168.815 -168.82 -168.825 -168.83 -168.835 -168.84 -168.845 -168.85 -168.855 -168.86 -168.865 -168.87 -168.875 -168.88 -168.885 -168.89 -168.895 -168.9 -168.905 -168.91 -168.915 -168.92 -168.925 -168.93 -168.935 -168.94 -168.945 -168.95 -168.955 -168.96 -168.965 -168.97 -168.975 -168.98 -168.985 -168.99 -168.995 -169 -169.005 -169.01 -169.015 -169.02 -169.025 -169.03 -169.035 -169.04 -169.045 -169.05 -169.055 -169.06 -169.065 -169.07 -169.075 -169.08 -169.085 -169.09 -169.095 -169.1 -169.105 -169.11 -169.115 -169.12 -169.125 -169.13 -169.135 -169.14 -169.145 -169.15 -169.155 -169.16 -169.165 -169.17 -169.175 -169.18 -169.185 -169.19 -169.195 -169.2 -169.205 -169.21 -169.215 -169.22 -169.225 -169.23 -169.235 -169.24 -169.245 -169.25 -169.255 -169.26 -169.265 -169.27 -169.275 -169.28 -169.285 -169.29 -169.295 -169.3 -169.305 -169.31 -169.315 -169.32 -169.325 -169.33 -169.335 -169.34 -169.345 -169.35 -169.355 -169.36 -169.365 -169.37 -169.375 -169.38 -169.385 -169.39 -169.395 -169.4 -169.405 -169.41 -169.415 -169.42 -169.425 -169.43 -169.435 -169.44 -169.445 -169.45 -169.455 -169.46 -169.465 -169.47 -169.475 -169.48 -169.485 -169.49 -169.495 -169.5 -169.505 -169.51 -169.515 -169.52 -169.525 -169.53 -169.535 -169.54 -169.545 -169.55 -169.555 -169.56 -169.565 -169.57 -169.575 -169.58 -169.585 -169.59 -169.595 -169.6 -169.605 -169.61 -169.615 -169.62 -169.625 -169.63 -169.635 -169.64 -169.645 -169.65 -169.655 -169.66 -169.665 -169.67 -169.675 -169.68 -169.685 -169.69 -169.695 -169.7 -169.705 -169.71 -169.715 -169.72 -169.725 -169.73 -169.735 -169.74 -169.745 -169.75 -169.755 -169.76 -169.765 -169.77 -169.775 -169.78 -169.785 -169.79 -169.795 -169.8 -169.805 -169.81 -169.815 -169.82 -169.825 -169.83 -169.835 -169.84 -169.845 -169.85 -169.855 -169.86 -169.865 -169.87 -169.875 -169.88 -169.885 -169.89 -169.895 -169.9 -169.905 -169.91 -169.915 -169.92 -169.925 -169.93 -169.935 -169.94 -169.945 -169.95 -169.955 -169.96 -169.965 -169.97 -169.975 -169.98 -169.985 -169.99 -169.995 -170 -170.005 -170.01 -170.015 -170.02 -170.025 -170.03 -170.035 -170.04 -170.045 -170.05 -170.055 -170.06 -170.065 -170.07 -170.075 -170.08 -170.085 -170.09 -170.095 -170.1 -170.105 -170.11 -170.115 -170.12 -170.125 -170.13 -170.135 -170.14 -170.145 -170.15 -170.155 -170.16 -170.165 -170.17 -170.175 -170.18 -170.185 -170.19 -170.195 -170.2 -170.205 -170.21 -170.215 -170.22 -170.225 -170.23 -170.235 -170.24 -170.245 -170.25 -170.255 -170.26 -170.265 -170.27 -170.275 -170.28 -170.285 -170.29 -170.295 -170.3 -170.305 -170.31 -170.315 -170.32 -170.325 -170.33 -170.335 -170.34 -170.345 -170.35 -170.355 -170.36 -170.365 -170.37 -170.375 -170.38 -170.385 -170.39 -170.395 -170.4 -170.405 -170.41 -170.415 -170.42 -170.425 -170.43 -170.435 -170.44 -170.445 -170.45 -170.455 -170.46 -170.465 -170.47 -170.475 -170.48 -170.485 -170.49 -170.495 -170.5 -170.505 -170.51 -170.515 -170.52 -170.525 -170.53 -170.535 -170.54 -170.545 -170.55 -170.555 -170.56 -170.565 -170.57 -170.575 -170.58 -170.585 -170.59 -170.595 -170.6 -170.605 -170.61 -170.615 -170.62 -170.625 -170.63 -170.635 -170.64 -170.645 -170.65 -170.655 -170.66 -170.665 -170.67 -170.675 -170.68 -170.685 -170.69 -170.695 -170.7 -170.705 -170.71 -170.715 -170.72 -170.725 -170.73 -170.735 -170.74 -170.745 -170.75 -170.755 -170.76 -170.765 -170.77 -170.775 -170.78 -170.785 -170.79 -170.795 -170.8 -170.805 -170.81 -170.815 -170.82 -170.825 -170.83 -170.835 -170.84 -170.845 -170.85 -170.855 -170.86 -170.865 -170.87 -170.875 -170.88 -170.885 -170.89 -170.895 -170.9 -170.905 -170.91 -170.915 -170.92 -170.925 -170.93 -170.935 -170.94 -170.945 -170.95 -170.955 -170.96 -170.965 -170.97 -170.975 -170.98 -170.985 -170.99 -170.995 -171 -171.005 -171.01 -171.015 -171.02 -171.025 -171.03 -171.035 -171.04 -171.045 -171.05 -171.055 -171.06 -171.065 -171.07 -171.075 -171.08 -171.085 -171.09 -171.095 -171.1 -171.105 -171.11 -171.115 -171.12 -171.125 -171.13 -171.135 -171.14 -171.145 -171.15 -171.155 -171.16 -171.165 -171.17 -171.175 -171.18 -171.185 -171.19 -171.195 -171.2 -171.205 -171.21 -171.215 -171.22 -171.225 -171.23 -171.235 -171.24 -171.245 -171.25 -171.255 -171.26 -171.265 -171.27 -171.275 -171.28 -171.285 -171.29 -171.295 -171.3 -171.305 -171.31 -171.315 -171.32 -171.325 -171.33 -171.335 -171.34 -171.345 -171.35 -171.355 -171.36 -171.365 -171.37 -171.375 -171.38 -171.385 -171.39 -171.395 -171.4 -171.405 -171.41 -171.415 -171.42 -171.425 -171.43 -171.435 -171.44 -171.445 -171.45 -171.455 -171.46 -171.465 -171.47 -171.475 -171.48 -171.485 -171.49 -171.495 -171.5 -171.505 -171.51 -171.515 -171.52 -171.525 -171.53 -171.535 -171.54 -171.545 -171.55 -171.555 -171.56 -171.565 -171.57 -171.575 -171.58 -171.585 -171.59 -171.595 -171.6 -171.605 -171.61 -171.615 -171.62 -171.625 -171.63 -171.635 -171.64 -171.645 -171.65 -171.655 -171.66 -171.665 -171.67 -171.675 -171.68 -171.685 -171.69 -171.695 -171.7 -171.705 -171.71 -171.715 -171.72 -171.725 -171.73 -171.735 -171.74 -171.745 -171.75 -171.755 -171.76 -171.765 -171.77 -171.775 -171.78 -171.785 -171.79 -171.795 -171.8 -171.805 -171.81 -171.815 -171.82 -171.825 -171.83 -171.835 -171.84 -171.845 -171.85 -171.855 -171.86 -171.865 -171.87 -171.875 -171.88 -171.885 -171.89 -171.895 -171.9 -171.905 -171.91 -171.915 -171.92 -171.925 -171.93 -171.935 -171.94 -171.945 -171.95 -171.955 -171.96 -171.965 -171.97 -171.975 -171.98 -171.985 -171.99 -171.995 -172 -172.005 -172.01 -172.015 -172.02 -172.025 -172.03 -172.035 -172.04 -172.045 -172.05 -172.055 -172.06 -172.065 -172.07 -172.075 -172.08 -172.085 -172.09 -172.095 -172.1 -172.105 -172.11 -172.115 -172.12 -172.125 -172.13 -172.135 -172.14 -172.145 -172.15 -172.155 -172.16 -172.165 -172.17 -172.175 -172.18 -172.185 -172.19 -172.195 -172.2 -172.205 -172.21 -172.215 -172.22 -172.225 -172.23 -172.235 -172.24 -172.245 -172.25 -172.255 -172.26 -172.265 -172.27 -172.275 -172.28 -172.285 -172.29 -172.295 -172.3 -172.305 -172.31 -172.315 -172.32 -172.325 -172.33 -172.335 -172.34 -172.345 -172.35 -172.355 -172.36 -172.365 -172.37 -172.375 -172.38 -172.385 -172.39 -172.395 -172.4 -172.405 -172.41 -172.415 -172.42 -172.425 -172.43 -172.435 -172.44 -172.445 -172.45 -172.455 -172.46 -172.465 -172.47 -172.475 -172.48 -172.485 -172.49 -172.495 -172.5 -172.505 -172.51 -172.515 -172.52 -172.525 -172.53 -172.535 -172.54 -172.545 -172.55 -172.555 -172.56 -172.565 -172.57 -172.575 -172.58 -172.585 -172.59 -172.595 -172.6 -172.605 -172.61 -172.615 -172.62 -172.625 -172.63 -172.635 -172.64 -172.645 -172.65 -172.655 -172.66 -172.665 -172.67 -172.675 -172.68 -172.685 -172.69 -172.695 -172.7 -172.705 -172.71 -172.715 -172.72 -172.725 -172.73 -172.735 -172.74 -172.745 -172.75 -172.755 -172.76 -172.765 -172.77 -172.775 -172.78 -172.785 -172.79 -172.795 -172.8 -172.805 -172.81 -172.815 -172.82 -172.825 -172.83 -172.835 -172.84 -172.845 -172.85 -172.855 -172.86 -172.865 -172.87 -172.875 -172.88 -172.885 -172.89 -172.895 -172.9 -172.905 -172.91 -172.915 -172.92 -172.925 -172.93 -172.935 -172.94 -172.945 -172.95 -172.955 -172.96 -172.965 -172.97 -172.975 -172.98 -172.985 -172.99 -172.995 -173 -173.005 -173.01 -173.015 -173.02 -173.025 -173.03 -173.035 -173.04 -173.045 -173.05 -173.055 -173.06 -173.065 -173.07 -173.075 -173.08 -173.085 -173.09 -173.095 -173.1 -173.105 -173.11 -173.115 -173.12 -173.125 -173.13 -173.135 -173.14 -173.145 -173.15 -173.155 -173.16 -173.165 -173.17 -173.175 -173.18 -173.185 -173.19 -173.195 -173.2 -173.205 -173.21 -173.215 -173.22 -173.225 -173.23 -173.235 -173.24 -173.245 -173.25 -173.255 -173.26 -173.265 -173.27 -173.275 -173.28 -173.285 -173.29 -173.295 -173.3 -173.305 -173.31 -173.315 -173.32 -173.325 -173.33 -173.335 -173.34 -173.345 -173.35 -173.355 -173.36 -173.365 -173.37 -173.375 -173.38 -173.385 -173.39 -173.395 -173.4 -173.405 -173.41 -173.415 -173.42 -173.425 -173.43 -173.435 -173.44 -173.445 -173.45 -173.455 -173.46 -173.465 -173.47 -173.475 -173.48 -173.485 -173.49 -173.495 -173.5 -173.505 -173.51 -173.515 -173.52 -173.525 -173.53 -173.535 -173.54 -173.545 -173.55 -173.555 -173.56 -173.565 -173.57 -173.575 -173.58 -173.585 -173.59 -173.595 -173.6 -173.605 -173.61 -173.615 -173.62 -173.625 -173.63 -173.635 -173.64 -173.645 -173.65 -173.655 -173.66 -173.665 -173.67 -173.675 -173.68 -173.685 -173.69 -173.695 -173.7 -173.705 -173.71 -173.715 -173.72 -173.725 -173.73 -173.735 -173.74 -173.745 -173.75 -173.755 -173.76 -173.765 -173.77 -173.775 -173.78 -173.785 -173.79 -173.795 -173.8 -173.805 -173.81 -173.815 -173.82 -173.825 -173.83 -173.835 -173.84 -173.845 -173.85 -173.855 -173.86 -173.865 -173.87 -173.875 -173.88 -173.885 -173.89 -173.895 -173.9 -173.905 -173.91 -173.915 -173.92 -173.925 -173.93 -173.935 -173.94 -173.945 -173.95 -173.955 -173.96 -173.965 -173.97 -173.975 -173.98 -173.985 -173.99 -173.995 -174 -174.005 -174.01 -174.015 -174.02 -174.025 -174.03 -174.035 -174.04 -174.045 -174.05 -174.055 -174.06 -174.065 -174.07 -174.075 -174.08 -174.085 -174.09 -174.095 -174.1 -174.105 -174.11 -174.115 -174.12 -174.125 -174.13 -174.135 -174.14 -174.145 -174.15 -174.155 -174.16 -174.165 -174.17 -174.175 -174.18 -174.185 -174.19 -174.195 -174.2 -174.205 -174.21 -174.215 -174.22 -174.225 -174.23 -174.235 -174.24 -174.245 -174.25 -174.255 -174.26 -174.265 -174.27 -174.275 -174.28 -174.285 -174.29 -174.295 -174.3 -174.305 -174.31 -174.315 -174.32 -174.325 -174.33 -174.335 -174.34 -174.345 -174.35 -174.355 -174.36 -174.365 -174.37 -174.375 -174.38 -174.385 -174.39 -174.395 -174.4 -174.405 -174.41 -174.415 -174.42 -174.425 -174.43 -174.435 -174.44 -174.445 -174.45 -174.455 -174.46 -174.465 -174.47 -174.475 -174.48 -174.485 -174.49 -174.495 -174.5 -174.505 -174.51 -174.515 -174.52 -174.525 -174.53 -174.535 -174.54 -174.545 -174.55 -174.555 -174.56 -174.565 -174.57 -174.575 -174.58 -174.585 -174.59 -174.595 -174.6 -174.605 -174.61 -174.615 -174.62 -174.625 -174.63 -174.635 -174.64 -174.645 -174.65 -174.655 -174.66 -174.665 -174.67 -174.675 -174.68 -174.685 -174.69 -174.695 -174.7 -174.705 -174.71 -174.715 -174.72 -174.725 -174.73 -174.735 -174.74 -174.745 -174.75 -174.755 -174.76 -174.765 -174.77 -174.775 -174.78 -174.785 -174.79 -174.795 -174.8 -174.805 -174.81 -174.815 -174.82 -174.825 -174.83 -174.835 -174.84 -174.845 -174.85 -174.855 -174.86 -174.865 -174.87 -174.875 -174.88 -174.885 -174.89 -174.895 -174.9 -174.905 -174.91 -174.915 -174.92 -174.925 -174.93 -174.935 -174.94 -174.945 -174.95 -174.955 -174.96 -174.965 -174.97 -174.975 -174.98 -174.985 -174.99 -174.995 -175 -175.005 -175.01 -175.015 -175.02 -175.025 -175.03 -175.035 -175.04 -175.045 -175.05 -175.055 -175.06 -175.065 -175.07 -175.075 -175.08 -175.085 -175.09 -175.095 -175.1 -175.105 -175.11 -175.115 -175.12 -175.125 -175.13 -175.135 -175.14 -175.145 -175.15 -175.155 -175.16 -175.165 -175.17 -175.175 -175.18 -175.185 -175.19 -175.195 -175.2 -175.205 -175.21 -175.215 -175.22 -175.225 -175.23 -175.235 -175.24 -175.245 -175.25 -175.255 -175.26 -175.265 -175.27 -175.275 -175.28 -175.285 -175.29 -175.295 -175.3 -175.305 -175.31 -175.315 -175.32 -175.325 -175.33 -175.335 -175.34 -175.345 -175.35 -175.355 -175.36 -175.365 -175.37 -175.375 -175.38 -175.385 -175.39 -175.395 -175.4 -175.405 -175.41 -175.415 -175.42 -175.425 -175.43 -175.435 -175.44 -175.445 -175.45 -175.455 -175.46 -175.465 -175.47 -175.475 -175.48 -175.485 -175.49 -175.495 -175.5 -175.505 -175.51 -175.515 -175.52 -175.525 -175.53 -175.535 -175.54 -175.545 -175.55 -175.555 -175.56 -175.565 -175.57 -175.575 -175.58 -175.585 -175.59 -175.595 -175.6 -175.605 -175.61 -175.615 -175.62 -175.625 -175.63 -175.635 -175.64 -175.645 -175.65 -175.655 -175.66 -175.665 -175.67 -175.675 -175.68 -175.685 -175.69 -175.695 -175.7 -175.705 -175.71 -175.715 -175.72 -175.725 -175.73 -175.735 -175.74 -175.745 -175.75 -175.755 -175.76 -175.765 -175.77 -175.775 -175.78 -175.785 -175.79 -175.795 -175.8 -175.805 -175.81 -175.815 -175.82 -175.825 -175.83 -175.835 -175.84 -175.845 -175.85 -175.855 -175.86 -175.865 -175.87 -175.875 -175.88 -175.885 -175.89 -175.895 -175.9 -175.905 -175.91 -175.915 -175.92 -175.925 -175.93 -175.935 -175.94 -175.945 -175.95 -175.955 -175.96 -175.965 -175.97 -175.975 -175.98 -175.985 -175.99 -175.995 -176 -176.005 -176.01 -176.015 -176.02 -176.025 -176.03 -176.035 -176.04 -176.045 -176.05 -176.055 -176.06 -176.065 -176.07 -176.075 -176.08 -176.085 -176.09 -176.095 -176.1 -176.105 -176.11 -176.115 -176.12 -176.125 -176.13 -176.135 -176.14 -176.145 -176.15 -176.155 -176.16 -176.165 -176.17 -176.175 -176.18 -176.185 -176.19 -176.195 -176.2 -176.205 -176.21 -176.215 -176.22 -176.225 -176.23 -176.235 -176.24 -176.245 -176.25 -176.255 -176.26 -176.265 -176.27 -176.275 -176.28 -176.285 -176.29 -176.295 -176.3 -176.305 -176.31 -176.315 -176.32 -176.325 -176.33 -176.335 -176.34 -176.345 -176.35 -176.355 -176.36 -176.365 -176.37 -176.375 -176.38 -176.385 -176.39 -176.395 -176.4 -176.405 -176.41 -176.415 -176.42 -176.425 -176.43 -176.435 -176.44 -176.445 -176.45 -176.455 -176.46 -176.465 -176.47 -176.475 -176.48 -176.485 -176.49 -176.495 -176.5 -176.505 -176.51 -176.515 -176.52 -176.525 -176.53 -176.535 -176.54 -176.545 -176.55 -176.555 -176.56 -176.565 -176.57 -176.575 -176.58 -176.585 -176.59 -176.595 -176.6 -176.605 -176.61 -176.615 -176.62 -176.625 -176.63 -176.635 -176.64 -176.645 -176.65 -176.655 -176.66 -176.665 -176.67 -176.675 -176.68 -176.685 -176.69 -176.695 -176.7 -176.705 -176.71 -176.715 -176.72 -176.725 -176.73 -176.735 -176.74 -176.745 -176.75 -176.755 -176.76 -176.765 -176.77 -176.775 -176.78 -176.785 -176.79 -176.795 -176.8 -176.805 -176.81 -176.815 -176.82 -176.825 -176.83 -176.835 -176.84 -176.845 -176.85 -176.855 -176.86 -176.865 -176.87 -176.875 -176.88 -176.885 -176.89 -176.895 -176.9 -176.905 -176.91 -176.915 -176.92 -176.925 -176.93 -176.935 -176.94 -176.945 -176.95 -176.955 -176.96 -176.965 -176.97 -176.975 -176.98 -176.985 -176.99 -176.995 -177 -177.005 -177.01 -177.015 -177.02 -177.025 -177.03 -177.035 -177.04 -177.045 -177.05 -177.055 -177.06 -177.065 -177.07 -177.075 -177.08 -177.085 -177.09 -177.095 -177.1 -177.105 -177.11 -177.115 -177.12 -177.125 -177.13 -177.135 -177.14 -177.145 -177.15 -177.155 -177.16 -177.165 -177.17 -177.175 -177.18 -177.185 -177.19 -177.195 -177.2 -177.205 -177.21 -177.215 -177.22 -177.225 -177.23 -177.235 -177.24 -177.245 -177.25 -177.255 -177.26 -177.265 -177.27 -177.275 -177.28 -177.285 -177.29 -177.295 -177.3 -177.305 -177.31 -177.315 -177.32 -177.325 -177.33 -177.335 -177.34 -177.345 -177.35 -177.355 -177.36 -177.365 -177.37 -177.375 -177.38 -177.385 -177.39 -177.395 -177.4 -177.405 -177.41 -177.415 -177.42 -177.425 -177.43 -177.435 -177.44 -177.445 -177.45 -177.455 -177.46 -177.465 -177.47 -177.475 -177.48 -177.485 -177.49 -177.495 -177.5 -177.505 -177.51 -177.515 -177.52 -177.525 -177.53 -177.535 -177.54 -177.545 -177.55 -177.555 -177.56 -177.565 -177.57 -177.575 -177.58 -177.585 -177.59 -177.595 -177.6 -177.605 -177.61 -177.615 -177.62 -177.625 -177.63 -177.635 -177.64 -177.645 -177.65 -177.655 -177.66 -177.665 -177.67 -177.675 -177.68 -177.685 -177.69 -177.695 -177.7 -177.705 -177.71 -177.715 -177.72 -177.725 -177.73 -177.735 -177.74 -177.745 -177.75 -177.755 -177.76 -177.765 -177.77 -177.775 -177.78 -177.785 -177.79 -177.795 -177.8 -177.805 -177.81 -177.815 -177.82 -177.825 -177.83 -177.835 -177.84 -177.845 -177.85 -177.855 -177.86 -177.865 -177.87 -177.875 -177.88 -177.885 -177.89 -177.895 -177.9 -177.905 -177.91 -177.915 -177.92 -177.925 -177.93 -177.935 -177.94 -177.945 -177.95 -177.955 -177.96 -177.965 -177.97 -177.975 -177.98 -177.985 -177.99 -177.995 -178 -178.005 -178.01 -178.015 -178.02 -178.025 -178.03 -178.035 -178.04 -178.045 -178.05 -178.055 -178.06 -178.065 -178.07 -178.075 -178.08 -178.085 -178.09 -178.095 -178.1 -178.105 -178.11 -178.115 -178.12 -178.125 -178.13 -178.135 -178.14 -178.145 -178.15 -178.155 -178.16 -178.165 -178.17 -178.175 -178.18 -178.185 -178.19 -178.195 -178.2 -178.205 -178.21 -178.215 -178.22 -178.225 -178.23 -178.235 -178.24 -178.245 -178.25 -178.255 -178.26 -178.265 -178.27 -178.275 -178.28 -178.285 -178.29 -178.295 -178.3 -178.305 -178.31 -178.315 -178.32 -178.325 -178.33 -178.335 -178.34 -178.345 -178.35 -178.355 -178.36 -178.365 -178.37 -178.375 -178.38 -178.385 -178.39 -178.395 -178.4 -178.405 -178.41 -178.415 -178.42 -178.425 -178.43 -178.435 -178.44 -178.445 -178.45 -178.455 -178.46 -178.465 -178.47 -178.475 -178.48 -178.485 -178.49 -178.495 -178.5 -178.505 -178.51 -178.515 -178.52 -178.525 -178.53 -178.535 -178.54 -178.545 -178.55 -178.555 -178.56 -178.565 -178.57 -178.575 -178.58 -178.585 -178.59 -178.595 -178.6 -178.605 -178.61 -178.615 -178.62 -178.625 -178.63 -178.635 -178.64 -178.645 -178.65 -178.655 -178.66 -178.665 -178.67 -178.675 -178.68 -178.685 -178.69 -178.695 -178.7 -178.705 -178.71 -178.715 -178.72 -178.725 -178.73 -178.735 -178.74 -178.745 -178.75 -178.755 -178.76 -178.765 -178.77 -178.775 -178.78 -178.785 -178.79 -178.795 -178.8 -178.805 -178.81 -178.815 -178.82 -178.825 -178.83 -178.835 -178.84 -178.845 -178.85 -178.855 -178.86 -178.865 -178.87 -178.875 -178.88 -178.885 -178.89 -178.895 -178.9 -178.905 -178.91 -178.915 -178.92 -178.925 -178.93 -178.935 -178.94 -178.945 -178.95 -178.955 -178.96 -178.965 -178.97 -178.975 -178.98 -178.985 -178.99 -178.995 -179 -179.005 -179.01 -179.015 -179.02 -179.025 -179.03 -179.035 -179.04 -179.045 -179.05 -179.055 -179.06 -179.065 -179.07 -179.075 -179.08 -179.085 -179.09 -179.095 -179.1 -179.105 -179.11 -179.115 -179.12 -179.125 -179.13 -179.135 -179.14 -179.145 -179.15 -179.155 -179.16 -179.165 -179.17 -179.175 -179.18 -179.185 -179.19 -179.195 -179.2 -179.205 -179.21 -179.215 -179.22 -179.225 -179.23 -179.235 -179.24 -179.245 -179.25 -179.255 -179.26 -179.265 -179.27 -179.275 -179.28 -179.285 -179.29 -179.295 -179.3 -179.305 -179.31 -179.315 -179.32 -179.325 -179.33 -179.335 -179.34 -179.345 -179.35 -179.355 -179.36 -179.365 -179.37 -179.375 -179.38 -179.385 -179.39 -179.395 -179.4 -179.405 -179.41 -179.415 -179.42 -179.425 -179.43 -179.435 -179.44 -179.445 -179.45 -179.455 -179.46 -179.465 -179.47 -179.475 -179.48 -179.485 -179.49 -179.495 -179.5 -179.505 -179.51 -179.515 -179.52 -179.525 -179.53 -179.535 -179.54 -179.545 -179.55 -179.555 -179.56 -179.565 -179.57 -179.575 -179.58 -179.585 -179.59 -179.595 -179.6 -179.605 -179.61 -179.615 -179.62 -179.625 -179.63 -179.635 -179.64 -179.645 -179.65 -179.655 -179.66 -179.665 -179.67 -179.675 -179.68 -179.685 -179.69 -179.695 -179.7 -179.705 -179.71 -179.715 -179.72 -179.725 -179.73 -179.735 -179.74 -179.745 -179.75 -179.755 -179.76 -179.765 -179.77 -179.775 -179.78 -179.785 -179.79 -179.795 -179.8 -179.805 -179.81 -179.815 -179.82 -179.825 -179.83 -179.835 -179.84 -179.845 -179.85 -179.855 -179.86 -179.865 -179.87 -179.875 -179.88 -179.885 -179.89 -179.895 -179.9 -179.905 -179.91 -179.915 -179.92 -179.925 -179.93 -179.935 -179.94 -179.945 -179.95 -179.955 -179.96 -179.965 -179.97 -179.975 -179.98 -179.985 -179.99 -179.995 -180 -180.005 -180.01 -180.015 -180.02 -180.025 -180.03 -180.035 -180.04 -180.045 -180.05 -180.055 -180.06 -180.065 -180.07 -180.075 -180.08 -180.085 -180.09 -180.095 -180.1 -180.105 -180.11 -180.115 -180.12 -180.125 -180.13 -180.135 -180.14 -180.145 -180.15 -180.155 -180.16 -180.165 -180.17 -180.175 -180.18 -180.185 -180.19 -180.195 -180.2 -180.205 -180.21 -180.215 -180.22 -180.225 -180.23 -180.235 -180.24 -180.245 -180.25 -180.255 -180.26 -180.265 -180.27 -180.275 -180.28 -180.285 -180.29 -180.295 -180.3 -180.305 -180.31 -180.315 -180.32 -180.325 -180.33 -180.335 -180.34 -180.345 -180.35 -180.355 -180.36 -180.365 -180.37 -180.375 -180.38 -180.385 -180.39 -180.395 -180.4 -180.405 -180.41 -180.415 -180.42 -180.425 -180.43 -180.435 -180.44 -180.445 -180.45 -180.455 -180.46 -180.465 -180.47 -180.475 -180.48 -180.485 -180.49 -180.495 -180.5 -180.505 -180.51 -180.515 -180.52 -180.525 -180.53 -180.535 -180.54 -180.545 -180.55 -180.555 -180.56 -180.565 -180.57 -180.575 -180.58 -180.585 -180.59 -180.595 -180.6 -180.605 -180.61 -180.615 -180.62 -180.625 -180.63 -180.635 -180.64 -180.645 -180.65 -180.655 -180.66 -180.665 -180.67 -180.675 -180.68 -180.685 -180.69 -180.695 -180.7 -180.705 -180.71 -180.715 -180.72 -180.725 -180.73 -180.735 -180.74 -180.745 -180.75 -180.755 -180.76 -180.765 -180.77 -180.775 -180.78 -180.785 -180.79 -180.795 -180.8 -180.805 -180.81 -180.815 -180.82 -180.825 -180.83 -180.835 -180.84 -180.845 -180.85 -180.855 -180.86 -180.865 -180.87 -180.875 -180.88 -180.885 -180.89 -180.895 -180.9 -180.905 -180.91 -180.915 -180.92 -180.925 -180.93 -180.935 -180.94 -180.945 -180.95 -180.955 -180.96 -180.965 -180.97 -180.975 -180.98 -180.985 -180.99 -180.995 -181 -181.005 -181.01 -181.015 -181.02 -181.025 -181.03 -181.035 -181.04 -181.045 -181.05 -181.055 -181.06 -181.065 -181.07 -181.075 -181.08 -181.085 -181.09 -181.095 -181.1 -181.105 -181.11 -181.115 -181.12 -181.125 -181.13 -181.135 -181.14 -181.145 -181.15 -181.155 -181.16 -181.165 -181.17 -181.175 -181.18 -181.185 -181.19 -181.195 -181.2 -181.205 -181.21 -181.215 -181.22 -181.225 -181.23 -181.235 -181.24 -181.245 -181.25 -181.255 -181.26 -181.265 -181.27 -181.275 -181.28 -181.285 -181.29 -181.295 -181.3 -181.305 -181.31 -181.315 -181.32 -181.325 -181.33 -181.335 -181.34 -181.345 -181.35 -181.355 -181.36 -181.365 -181.37 -181.375 -181.38 -181.385 -181.39 -181.395 -181.4 -181.405 -181.41 -181.415 -181.42 -181.425 -181.43 -181.435 -181.44 -181.445 -181.45 -181.455 -181.46 -181.465 -181.47 -181.475 -181.48 -181.485 -181.49 -181.495 -181.5 -181.505 -181.51 -181.515 -181.52 -181.525 -181.53 -181.535 -181.54 -181.545 -181.55 -181.555 -181.56 -181.565 -181.57 -181.575 -181.58 -181.585 -181.59 -181.595 -181.6 -181.605 -181.61 -181.615 -181.62 -181.625 -181.63 -181.635 -181.64 -181.645 -181.65 -181.655 -181.66 -181.665 -181.67 -181.675 -181.68 -181.685 -181.69 -181.695 -181.7 -181.705 -181.71 -181.715 -181.72 -181.725 -181.73 -181.735 -181.74 -181.745 -181.75 -181.755 -181.76 -181.765 -181.77 -181.775 -181.78 -181.785 -181.79 -181.795 -181.8 -181.805 -181.81 -181.815 -181.82 -181.825 -181.83 -181.835 -181.84 -181.845 -181.85 -181.855 -181.86 -181.865 -181.87 -181.875 -181.88 -181.885 -181.89 -181.895 -181.9 -181.905 -181.91 -181.915 -181.92 -181.925 -181.93 -181.935 -181.94 -181.945 -181.95 -181.955 -181.96 -181.965 -181.97 -181.975 -181.98 -181.985 -181.99 -181.995 -182 -182.005 -182.01 -182.015 -182.02 -182.025 -182.03 -182.035 -182.04 -182.045 -182.05 -182.055 -182.06 -182.065 -182.07 -182.075 -182.08 -182.085 -182.09 -182.095 -182.1 -182.105 -182.11 -182.115 -182.12 -182.125 -182.13 -182.135 -182.14 -182.145 -182.15 -182.155 -182.16 -182.165 -182.17 -182.175 -182.18 -182.185 -182.19 -182.195 -182.2 -182.205 -182.21 -182.215 -182.22 -182.225 -182.23 -182.235 -182.24 -182.245 -182.25 -182.255 -182.26 -182.265 -182.27 -182.275 -182.28 -182.285 -182.29 -182.295 -182.3 -182.305 -182.31 -182.315 -182.32 -182.325 -182.33 -182.335 -182.34 -182.345 -182.35 -182.355 -182.36 -182.365 -182.37 -182.375 -182.38 -182.385 -182.39 -182.395 -182.4 -182.405 -182.41 -182.415 -182.42 -182.425 -182.43 -182.435 -182.44 -182.445 -182.45 -182.455 -182.46 -182.465 -182.47 -182.475 -182.48 -182.485 -182.49 -182.495 -182.5 -182.505 -182.51 -182.515 -182.52 -182.525 -182.53 -182.535 -182.54 -182.545 -182.55 -182.555 -182.56 -182.565 -182.57 -182.575 -182.58 -182.585 -182.59 -182.595 -182.6 -182.605 -182.61 -182.615 -182.62 -182.625 -182.63 -182.635 -182.64 -182.645 -182.65 -182.655 -182.66 -182.665 -182.67 -182.675 -182.68 -182.685 -182.69 -182.695 -182.7 -182.705 -182.71 -182.715 -182.72 -182.725 -182.73 -182.735 -182.74 -182.745 -182.75 -182.755 -182.76 -182.765 -182.77 -182.775 -182.78 -182.785 -182.79 -182.795 -182.8 -182.805 -182.81 -182.815 -182.82 -182.825 -182.83 -182.835 -182.84 -182.845 -182.85 -182.855 -182.86 -182.865 -182.87 -182.875 -182.88 -182.885 -182.89 -182.895 -182.9 -182.905 -182.91 -182.915 -182.92 -182.925 -182.93 -182.935 -182.94 -182.945 -182.95 -182.955 -182.96 -182.965 -182.97 -182.975 -182.98 -182.985 -182.99 -182.995 -183 -183.005 -183.01 -183.015 -183.02 -183.025 -183.03 -183.035 -183.04 -183.045 -183.05 -183.055 -183.06 -183.065 -183.07 -183.075 -183.08 -183.085 -183.09 -183.095 -183.1 -183.105 -183.11 -183.115 -183.12 -183.125 -183.13 -183.135 -183.14 -183.145 -183.15 -183.155 -183.16 -183.165 -183.17 -183.175 -183.18 -183.185 -183.19 -183.195 -183.2 -183.205 -183.21 -183.215 -183.22 -183.225 -183.23 -183.235 -183.24 -183.245 -183.25 -183.255 -183.26 -183.265 -183.27 -183.275 -183.28 -183.285 -183.29 -183.295 -183.3 -183.305 -183.31 -183.315 -183.32 -183.325 -183.33 -183.335 -183.34 -183.345 -183.35 -183.355 -183.36 -183.365 -183.37 -183.375 -183.38 -183.385 -183.39 -183.395 -183.4 -183.405 -183.41 -183.415 -183.42 -183.425 -183.43 -183.435 -183.44 -183.445 -183.45 -183.455 -183.46 -183.465 -183.47 -183.475 -183.48 -183.485 -183.49 -183.495 -183.5 -183.505 -183.51 -183.515 -183.52 -183.525 -183.53 -183.535 -183.54 -183.545 -183.55 -183.555 -183.56 -183.565 -183.57 -183.575 -183.58 -183.585 -183.59 -183.595 -183.6 -183.605 -183.61 -183.615 -183.62 -183.625 -183.63 -183.635 -183.64 -183.645 -183.65 -183.655 -183.66 -183.665 -183.67 -183.675 -183.68 -183.685 -183.69 -183.695 -183.7 -183.705 -183.71 -183.715 -183.72 -183.725 -183.73 -183.735 -183.74 -183.745 -183.75 -183.755 -183.76 -183.765 -183.77 -183.775 -183.78 -183.785 -183.79 -183.795 -183.8 -183.805 -183.81 -183.815 -183.82 -183.825 -183.83 -183.835 -183.84 -183.845 -183.85 -183.855 -183.86 -183.865 -183.87 -183.875 -183.88 -183.885 -183.89 -183.895 -183.9 -183.905 -183.91 -183.915 -183.92 -183.925 -183.93 -183.935 -183.94 -183.945 -183.95 -183.955 -183.96 -183.965 -183.97 -183.975 -183.98 -183.985 -183.99 -183.995 -184 -184.005 -184.01 -184.015 -184.02 -184.025 -184.03 -184.035 -184.04 -184.045 -184.05 -184.055 -184.06 -184.065 -184.07 -184.075 -184.08 -184.085 -184.09 -184.095 -184.1 -184.105 -184.11 -184.115 -184.12 -184.125 -184.13 -184.135 -184.14 -184.145 -184.15 -184.155 -184.16 -184.165 -184.17 -184.175 -184.18 -184.185 -184.19 -184.195 -184.2 -184.205 -184.21 -184.215 -184.22 -184.225 -184.23 -184.235 -184.24 -184.245 -184.25 -184.255 -184.26 -184.265 -184.27 -184.275 -184.28 -184.285 -184.29 -184.295 -184.3 -184.305 -184.31 -184.315 -184.32 -184.325 -184.33 -184.335 -184.34 -184.345 -184.35 -184.355 -184.36 -184.365 -184.37 -184.375 -184.38 -184.385 -184.39 -184.395 -184.4 -184.405 -184.41 -184.415 -184.42 -184.425 -184.43 -184.435 -184.44 -184.445 -184.45 -184.455 -184.46 -184.465 -184.47 -184.475 -184.48 -184.485 -184.49 -184.495 -184.5 -184.505 -184.51 -184.515 -184.52 -184.525 -184.53 -184.535 -184.54 -184.545 -184.55 -184.555 -184.56 -184.565 -184.57 -184.575 -184.58 -184.585 -184.59 -184.595 -184.6 -184.605 -184.61 -184.615 -184.62 -184.625 -184.63 -184.635 -184.64 -184.645 -184.65 -184.655 -184.66 -184.665 -184.67 -184.675 -184.68 -184.685 -184.69 -184.695 -184.7 -184.705 -184.71 -184.715 -184.72 -184.725 -184.73 -184.735 -184.74 -184.745 -184.75 -184.755 -184.76 -184.765 -184.77 -184.775 -184.78 -184.785 -184.79 -184.795 -184.8 -184.805 -184.81 -184.815 -184.82 -184.825 -184.83 -184.835 -184.84 -184.845 -184.85 -184.855 -184.86 -184.865 -184.87 -184.875 -184.88 -184.885 -184.89 -184.895 -184.9 -184.905 -184.91 -184.915 -184.92 -184.925 -184.93 -184.935 -184.94 -184.945 -184.95 -184.955 -184.96 -184.965 -184.97 -184.975 -184.98 -184.985 -184.99 -184.995 -185 -185.005 -185.01 -185.015 -185.02 -185.025 -185.03 -185.035 -185.04 -185.045 -185.05 -185.055 -185.06 -185.065 -185.07 -185.075 -185.08 -185.085 -185.09 -185.095 -185.1 -185.105 -185.11 -185.115 -185.12 -185.125 -185.13 -185.135 -185.14 -185.145 -185.15 -185.155 -185.16 -185.165 -185.17 -185.175 -185.18 -185.185 -185.19 -185.195 -185.2 -185.205 -185.21 -185.215 -185.22 -185.225 -185.23 -185.235 -185.24 -185.245 -185.25 -185.255 -185.26 -185.265 -185.27 -185.275 -185.28 -185.285 -185.29 -185.295 -185.3 -185.305 -185.31 -185.315 -185.32 -185.325 -185.33 -185.335 -185.34 -185.345 -185.35 -185.355 -185.36 -185.365 -185.37 -185.375 -185.38 -185.385 -185.39 -185.395 -185.4 -185.405 -185.41 -185.415 -185.42 -185.425 -185.43 -185.435 -185.44 -185.445 -185.45 -185.455 -185.46 -185.465 -185.47 -185.475 -185.48 -185.485 -185.49 -185.495 -185.5 -185.505 -185.51 -185.515 -185.52 -185.525 -185.53 -185.535 -185.54 -185.545 -185.55 -185.555 -185.56 -185.565 -185.57 -185.575 -185.58 -185.585 -185.59 -185.595 -185.6 -185.605 -185.61 -185.615 -185.62 -185.625 -185.63 -185.635 -185.64 -185.645 -185.65 -185.655 -185.66 -185.665 -185.67 -185.675 -185.68 -185.685 -185.69 -185.695 -185.7 -185.705 -185.71 -185.715 -185.72 -185.725 -185.73 -185.735 -185.74 -185.745 -185.75 -185.755 -185.76 -185.765 -185.77 -185.775 -185.78 -185.785 -185.79 -185.795 -185.8 -185.805 -185.81 -185.815 -185.82 -185.825 -185.83 -185.835 -185.84 -185.845 -185.85 -185.855 -185.86 -185.865 -185.87 -185.875 -185.88 -185.885 -185.89 -185.895 -185.9 -185.905 -185.91 -185.915 -185.92 -185.925 -185.93 -185.935 -185.94 -185.945 -185.95 -185.955 -185.96 -185.965 -185.97 -185.975 -185.98 -185.985 -185.99 -185.995 -186 -186.005 -186.01 -186.015 -186.02 -186.025 -186.03 -186.035 -186.04 -186.045 -186.05 -186.055 -186.06 -186.065 -186.07 -186.075 -186.08 -186.085 -186.09 -186.095 -186.1 -186.105 -186.11 -186.115 -186.12 -186.125 -186.13 -186.135 -186.14 -186.145 -186.15 -186.155 -186.16 -186.165 -186.17 -186.175 -186.18 -186.185 -186.19 -186.195 -186.2 -186.205 -186.21 -186.215 -186.22 -186.225 -186.23 -186.235 -186.24 -186.245 -186.25 -186.255 -186.26 -186.265 -186.27 -186.275 -186.28 -186.285 -186.29 -186.295 -186.3 -186.305 -186.31 -186.315 -186.32 -186.325 -186.33 -186.335 -186.34 -186.345 -186.35 -186.355 -186.36 -186.365 -186.37 -186.375 -186.38 -186.385 -186.39 -186.395 -186.4 -186.405 -186.41 -186.415 -186.42 -186.425 -186.43 -186.435 -186.44 -186.445 -186.45 -186.455 -186.46 -186.465 -186.47 -186.475 -186.48 -186.485 -186.49 -186.495 -186.5 -186.505 -186.51 -186.515 -186.52 -186.525 -186.53 -186.535 -186.54 -186.545 -186.55 -186.555 -186.56 -186.565 -186.57 -186.575 -186.58 -186.585 -186.59 -186.595 -186.6 -186.605 -186.61 -186.615 -186.62 -186.625 -186.63 -186.635 -186.64 -186.645 -186.65 -186.655 -186.66 -186.665 -186.67 -186.675 -186.68 -186.685 -186.69 -186.695 -186.7 -186.705 -186.71 -186.715 -186.72 -186.725 -186.73 -186.735 -186.74 -186.745 -186.75 -186.755 -186.76 -186.765 -186.77 -186.775 -186.78 -186.785 -186.79 -186.795 -186.8 -186.805 -186.81 -186.815 -186.82 -186.825 -186.83 -186.835 -186.84 -186.845 -186.85 -186.855 -186.86 -186.865 -186.87 -186.875 -186.88 -186.885 -186.89 -186.895 -186.9 -186.905 -186.91 -186.915 -186.92 -186.925 -186.93 -186.935 -186.94 -186.945 -186.95 -186.955 -186.96 -186.965 -186.97 -186.975 -186.98 -186.985 -186.99 -186.995 -187 -187.005 -187.01 -187.015 -187.02 -187.025 -187.03 -187.035 -187.04 -187.045 -187.05 -187.055 -187.06 -187.065 -187.07 -187.075 -187.08 -187.085 -187.09 -187.095 -187.1 -187.105 -187.11 -187.115 -187.12 -187.125 -187.13 -187.135 -187.14 -187.145 -187.15 -187.155 -187.16 -187.165 -187.17 -187.175 -187.18 -187.185 -187.19 -187.195 -187.2 -187.205 -187.21 -187.215 -187.22 -187.225 -187.23 -187.235 -187.24 -187.245 -187.25 -187.255 -187.26 -187.265 -187.27 -187.275 -187.28 -187.285 -187.29 -187.295 -187.3 -187.305 -187.31 -187.315 -187.32 -187.325 -187.33 -187.335 -187.34 -187.345 -187.35 -187.355 -187.36 -187.365 -187.37 -187.375 -187.38 -187.385 -187.39 -187.395 -187.4 -187.405 -187.41 -187.415 -187.42 -187.425 -187.43 -187.435 -187.44 -187.445 -187.45 -187.455 -187.46 -187.465 -187.47 -187.475 -187.48 -187.485 -187.49 -187.495 -187.5 -187.505 -187.51 -187.515 -187.52 -187.525 -187.53 -187.535 -187.54 -187.545 -187.55 -187.555 -187.56 -187.565 -187.57 -187.575 -187.58 -187.585 -187.59 -187.595 -187.6 -187.605 -187.61 -187.615 -187.62 -187.625 -187.63 -187.635 -187.64 -187.645 -187.65 -187.655 -187.66 -187.665 -187.67 -187.675 -187.68 -187.685 -187.69 -187.695 -187.7 -187.705 -187.71 -187.715 -187.72 -187.725 -187.73 -187.735 -187.74 -187.745 -187.75 -187.755 -187.76 -187.765 -187.77 -187.775 -187.78 -187.785 -187.79 -187.795 -187.8 -187.805 -187.81 -187.815 -187.82 -187.825 -187.83 -187.835 -187.84 -187.845 -187.85 -187.855 -187.86 -187.865 -187.87 -187.875 -187.88 -187.885 -187.89 -187.895 -187.9 -187.905 -187.91 -187.915 -187.92 -187.925 -187.93 -187.935 -187.94 -187.945 -187.95 -187.955 -187.96 -187.965 -187.97 -187.975 -187.98 -187.985 -187.99 -187.995 -188 -188.005 -188.01 -188.015 -188.02 -188.025 -188.03 -188.035 -188.04 -188.045 -188.05 -188.055 -188.06 -188.065 -188.07 -188.075 -188.08 -188.085 -188.09 -188.095 -188.1 -188.105 -188.11 -188.115 -188.12 -188.125 -188.13 -188.135 -188.14 -188.145 -188.15 -188.155 -188.16 -188.165 -188.17 -188.175 -188.18 -188.185 -188.19 -188.195 -188.2 -188.205 -188.21 -188.215 -188.22 -188.225 -188.23 -188.235 -188.24 -188.245 -188.25 -188.255 -188.26 -188.265 -188.27 -188.275 -188.28 -188.285 -188.29 -188.295 -188.3 -188.305 -188.31 -188.315 -188.32 -188.325 -188.33 -188.335 -188.34 -188.345 -188.35 -188.355 -188.36 -188.365 -188.37 -188.375 -188.38 -188.385 -188.39 -188.395 -188.4 -188.405 -188.41 -188.415 -188.42 -188.425 -188.43 -188.435 -188.44 -188.445 -188.45 -188.455 -188.46 -188.465 -188.47 -188.475 -188.48 -188.485 -188.49 -188.495 -188.5 -188.505 -188.51 -188.515 -188.52 -188.525 -188.53 -188.535 -188.54 -188.545 -188.55 -188.555 -188.56 -188.565 -188.57 -188.575 -188.58 -188.585 -188.59 -188.595 -188.6 -188.605 -188.61 -188.615 -188.62 -188.625 -188.63 -188.635 -188.64 -188.645 -188.65 -188.655 -188.66 -188.665 -188.67 -188.675 -188.68 -188.685 -188.69 -188.695 -188.7 -188.705 -188.71 -188.715 -188.72 -188.725 -188.73 -188.735 -188.74 -188.745 -188.75 -188.755 -188.76 -188.765 -188.77 -188.775 -188.78 -188.785 -188.79 -188.795 -188.8 -188.805 -188.81 -188.815 -188.82 -188.825 -188.83 -188.835 -188.84 -188.845 -188.85 -188.855 -188.86 -188.865 -188.87 -188.875 -188.88 -188.885 -188.89 -188.895 -188.9 -188.905 -188.91 -188.915 -188.92 -188.925 -188.93 -188.935 -188.94 -188.945 -188.95 -188.955 -188.96 -188.965 -188.97 -188.975 -188.98 -188.985 -188.99 -188.995 -189 -189.005 -189.01 -189.015 -189.02 -189.025 -189.03 -189.035 -189.04 -189.045 -189.05 -189.055 -189.06 -189.065 -189.07 -189.075 -189.08 -189.085 -189.09 -189.095 -189.1 -189.105 -189.11 -189.115 -189.12 -189.125 -189.13 -189.135 -189.14 -189.145 -189.15 -189.155 -189.16 -189.165 -189.17 -189.175 -189.18 -189.185 -189.19 -189.195 -189.2 -189.205 -189.21 -189.215 -189.22 -189.225 -189.23 -189.235 -189.24 -189.245 -189.25 -189.255 -189.26 -189.265 -189.27 -189.275 -189.28 -189.285 -189.29 -189.295 -189.3 -189.305 -189.31 -189.315 -189.32 -189.325 -189.33 -189.335 -189.34 -189.345 -189.35 -189.355 -189.36 -189.365 -189.37 -189.375 -189.38 -189.385 -189.39 -189.395 -189.4 -189.405 -189.41 -189.415 -189.42 -189.425 -189.43 -189.435 -189.44 -189.445 -189.45 -189.455 -189.46 -189.465 -189.47 -189.475 -189.48 -189.485 -189.49 -189.495 -189.5 -189.505 -189.51 -189.515 -189.52 -189.525 -189.53 -189.535 -189.54 -189.545 -189.55 -189.555 -189.56 -189.565 -189.57 -189.575 -189.58 -189.585 -189.59 -189.595 -189.6 -189.605 -189.61 -189.615 -189.62 -189.625 -189.63 -189.635 -189.64 -189.645 -189.65 -189.655 -189.66 -189.665 -189.67 -189.675 -189.68 -189.685 -189.69 -189.695 -189.7 -189.705 -189.71 -189.715 -189.72 -189.725 -189.73 -189.735 -189.74 -189.745 -189.75 -189.755 -189.76 -189.765 -189.77 -189.775 -189.78 -189.785 -189.79 -189.795 -189.8 -189.805 -189.81 -189.815 -189.82 -189.825 -189.83 -189.835 -189.84 -189.845 -189.85 -189.855 -189.86 -189.865 -189.87 -189.875 -189.88 -189.885 -189.89 -189.895 -189.9 -189.905 -189.91 -189.915 -189.92 -189.925 -189.93 -189.935 -189.94 -189.945 -189.95 -189.955 -189.96 -189.965 -189.97 -189.975 -189.98 -189.985 -189.99 -189.995 -190 -190.005 -190.01 -190.015 -190.02 -190.025 -190.03 -190.035 -190.04 -190.045 -190.05 -190.055 -190.06 -190.065 -190.07 -190.075 -190.08 -190.085 -190.09 -190.095 -190.1 -190.105 -190.11 -190.115 -190.12 -190.125 -190.13 -190.135 -190.14 -190.145 -190.15 -190.155 -190.16 -190.165 -190.17 -190.175 -190.18 -190.185 -190.19 -190.195 -190.2 -190.205 -190.21 -190.215 -190.22 -190.225 -190.23 -190.235 -190.24 -190.245 -190.25 -190.255 -190.26 -190.265 -190.27 -190.275 -190.28 -190.285 -190.29 -190.295 -190.3 -190.305 -190.31 -190.315 -190.32 -190.325 -190.33 -190.335 -190.34 -190.345 -190.35 -190.355 -190.36 -190.365 -190.37 -190.375 -190.38 -190.385 -190.39 -190.395 -190.4 -190.405 -190.41 -190.415 -190.42 -190.425 -190.43 -190.435 -190.44 -190.445 -190.45 -190.455 -190.46 -190.465 -190.47 -190.475 -190.48 -190.485 -190.49 -190.495 -190.5 -190.505 -190.51 -190.515 -190.52 -190.525 -190.53 -190.535 -190.54 -190.545 -190.55 -190.555 -190.56 -190.565 -190.57 -190.575 -190.58 -190.585 -190.59 -190.595 -190.6 -190.605 -190.61 -190.615 -190.62 -190.625 -190.63 -190.635 -190.64 -190.645 -190.65 -190.655 -190.66 -190.665 -190.67 -190.675 -190.68 -190.685 -190.69 -190.695 -190.7 -190.705 -190.71 -190.715 -190.72 -190.725 -190.73 -190.735 -190.74 -190.745 -190.75 -190.755 -190.76 -190.765 -190.77 -190.775 -190.78 -190.785 -190.79 -190.795 -190.8 -190.805 -190.81 -190.815 -190.82 -190.825 -190.83 -190.835 -190.84 -190.845 -190.85 -190.855 -190.86 -190.865 -190.87 -190.875 -190.88 -190.885 -190.89 -190.895 -190.9 -190.905 -190.91 -190.915 -190.92 -190.925 -190.93 -190.935 -190.94 -190.945 -190.95 -190.955 -190.96 -190.965 -190.97 -190.975 -190.98 -190.985 -190.99 -190.995 -191 -191.005 -191.01 -191.015 -191.02 -191.025 -191.03 -191.035 -191.04 -191.045 -191.05 -191.055 -191.06 -191.065 -191.07 -191.075 -191.08 -191.085 -191.09 -191.095 -191.1 -191.105 -191.11 -191.115 -191.12 -191.125 -191.13 -191.135 -191.14 -191.145 -191.15 -191.155 -191.16 -191.165 -191.17 -191.175 -191.18 -191.185 -191.19 -191.195 -191.2 -191.205 -191.21 -191.215 -191.22 -191.225 -191.23 -191.235 -191.24 -191.245 -191.25 -191.255 -191.26 -191.265 -191.27 -191.275 -191.28 -191.285 -191.29 -191.295 -191.3 -191.305 -191.31 -191.315 -191.32 -191.325 -191.33 -191.335 -191.34 -191.345 -191.35 -191.355 -191.36 -191.365 -191.37 -191.375 -191.38 -191.385 -191.39 -191.395 -191.4 -191.405 -191.41 -191.415 -191.42 -191.425 -191.43 -191.435 -191.44 -191.445 -191.45 -191.455 -191.46 -191.465 -191.47 -191.475 -191.48 -191.485 -191.49 -191.495 -191.5 -191.505 -191.51 -191.515 -191.52 -191.525 -191.53 -191.535 -191.54 -191.545 -191.55 -191.555 -191.56 -191.565 -191.57 -191.575 -191.58 -191.585 -191.59 -191.595 -191.6 -191.605 -191.61 -191.615 -191.62 -191.625 -191.63 -191.635 -191.64 -191.645 -191.65 -191.655 -191.66 -191.665 -191.67 -191.675 -191.68 -191.685 -191.69 -191.695 -191.7 -191.705 -191.71 -191.715 -191.72 -191.725 -191.73 -191.735 -191.74 -191.745 -191.75 -191.755 -191.76 -191.765 -191.77 -191.775 -191.78 -191.785 -191.79 -191.795 -191.8 -191.805 -191.81 -191.815 -191.82 -191.825 -191.83 -191.835 -191.84 -191.845 -191.85 -191.855 -191.86 -191.865 -191.87 -191.875 -191.88 -191.885 -191.89 -191.895 -191.9 -191.905 -191.91 -191.915 -191.92 -191.925 -191.93 -191.935 -191.94 -191.945 -191.95 -191.955 -191.96 -191.965 -191.97 -191.975 -191.98 -191.985 -191.99 -191.995 -192 -192.005 -192.01 -192.015 -192.02 -192.025 -192.03 -192.035 -192.04 -192.045 -192.05 -192.055 -192.06 -192.065 -192.07 -192.075 -192.08 -192.085 -192.09 -192.095 -192.1 -192.105 -192.11 -192.115 -192.12 -192.125 -192.13 -192.135 -192.14 -192.145 -192.15 -192.155 -192.16 -192.165 -192.17 -192.175 -192.18 -192.185 -192.19 -192.195 -192.2 -192.205 -192.21 -192.215 -192.22 -192.225 -192.23 -192.235 -192.24 -192.245 -192.25 -192.255 -192.26 -192.265 -192.27 -192.275 -192.28 -192.285 -192.29 -192.295 -192.3 -192.305 -192.31 -192.315 -192.32 -192.325 -192.33 -192.335 -192.34 -192.345 -192.35 -192.355 -192.36 -192.365 -192.37 -192.375 -192.38 -192.385 -192.39 -192.395 -192.4 -192.405 -192.41 -192.415 -192.42 -192.425 -192.43 -192.435 -192.44 -192.445 -192.45 -192.455 -192.46 -192.465 -192.47 -192.475 -192.48 -192.485 -192.49 -192.495 -192.5 -192.505 -192.51 -192.515 -192.52 -192.525 -192.53 -192.535 -192.54 -192.545 -192.55 -192.555 -192.56 -192.565 -192.57 -192.575 -192.58 -192.585 -192.59 -192.595 -192.6 -192.605 -192.61 -192.615 -192.62 -192.625 -192.63 -192.635 -192.64 -192.645 -192.65 -192.655 -192.66 -192.665 -192.67 -192.675 -192.68 -192.685 -192.69 -192.695 -192.7 -192.705 -192.71 -192.715 -192.72 -192.725 -192.73 -192.735 -192.74 -192.745 -192.75 -192.755 -192.76 -192.765 -192.77 -192.775 -192.78 -192.785 -192.79 -192.795 -192.8 -192.805 -192.81 -192.815 -192.82 -192.825 -192.83 -192.835 -192.84 -192.845 -192.85 -192.855 -192.86 -192.865 -192.87 -192.875 -192.88 -192.885 -192.89 -192.895 -192.9 -192.905 -192.91 -192.915 -192.92 -192.925 -192.93 -192.935 -192.94 -192.945 -192.95 -192.955 -192.96 -192.965 -192.97 -192.975 -192.98 -192.985 -192.99 -192.995 -193 -193.005 -193.01 -193.015 -193.02 -193.025 -193.03 -193.035 -193.04 -193.045 -193.05 -193.055 -193.06 -193.065 -193.07 -193.075 -193.08 -193.085 -193.09 -193.095 -193.1 -193.105 -193.11 -193.115 -193.12 -193.125 -193.13 -193.135 -193.14 -193.145 -193.15 -193.155 -193.16 -193.165 -193.17 -193.175 -193.18 -193.185 -193.19 -193.195 -193.2 -193.205 -193.21 -193.215 -193.22 -193.225 -193.23 -193.235 -193.24 -193.245 -193.25 -193.255 -193.26 -193.265 -193.27 -193.275 -193.28 -193.285 -193.29 -193.295 -193.3 -193.305 -193.31 -193.315 -193.32 -193.325 -193.33 -193.335 -193.34 -193.345 -193.35 -193.355 -193.36 -193.365 -193.37 -193.375 -193.38 -193.385 -193.39 -193.395 -193.4 -193.405 -193.41 -193.415 -193.42 -193.425 -193.43 -193.435 -193.44 -193.445 -193.45 -193.455 -193.46 -193.465 -193.47 -193.475 -193.48 -193.485 -193.49 -193.495 -193.5 -193.505 -193.51 -193.515 -193.52 -193.525 -193.53 -193.535 -193.54 -193.545 -193.55 -193.555 -193.56 -193.565 -193.57 -193.575 -193.58 -193.585 -193.59 -193.595 -193.6 -193.605 -193.61 -193.615 -193.62 -193.625 -193.63 -193.635 -193.64 -193.645 -193.65 -193.655 -193.66 -193.665 -193.67 -193.675 -193.68 -193.685 -193.69 -193.695 -193.7 -193.705 -193.71 -193.715 -193.72 -193.725 -193.73 -193.735 -193.74 -193.745 -193.75 -193.755 -193.76 -193.765 -193.77 -193.775 -193.78 -193.785 -193.79 -193.795 -193.8 -193.805 -193.81 -193.815 -193.82 -193.825 -193.83 -193.835 -193.84 -193.845 -193.85 -193.855 -193.86 -193.865 -193.87 -193.875 -193.88 -193.885 -193.89 -193.895 -193.9 -193.905 -193.91 -193.915 -193.92 -193.925 -193.93 -193.935 -193.94 -193.945 -193.95 -193.955 -193.96 -193.965 -193.97 -193.975 -193.98 -193.985 -193.99 -193.995 -194 -194.005 -194.01 -194.015 -194.02 -194.025 -194.03 -194.035 -194.04 -194.045 -194.05 -194.055 -194.06 -194.065 -194.07 -194.075 -194.08 -194.085 -194.09 -194.095 -194.1 -194.105 -194.11 -194.115 -194.12 -194.125 -194.13 -194.135 -194.14 -194.145 -194.15 -194.155 -194.16 -194.165 -194.17 -194.175 -194.18 -194.185 -194.19 -194.195 -194.2 -194.205 -194.21 -194.215 -194.22 -194.225 -194.23 -194.235 -194.24 -194.245 -194.25 -194.255 -194.26 -194.265 -194.27 -194.275 -194.28 -194.285 -194.29 -194.295 -194.3 -194.305 -194.31 -194.315 -194.32 -194.325 -194.33 -194.335 -194.34 -194.345 -194.35 -194.355 -194.36 -194.365 -194.37 -194.375 -194.38 -194.385 -194.39 -194.395 -194.4 -194.405 -194.41 -194.415 -194.42 -194.425 -194.43 -194.435 -194.44 -194.445 -194.45 -194.455 -194.46 -194.465 -194.47 -194.475 -194.48 -194.485 -194.49 -194.495 -194.5 -194.505 -194.51 -194.515 -194.52 -194.525 -194.53 -194.535 -194.54 -194.545 -194.55 -194.555 -194.56 -194.565 -194.57 -194.575 -194.58 -194.585 -194.59 -194.595 -194.6 -194.605 -194.61 -194.615 -194.62 -194.625 -194.63 -194.635 -194.64 -194.645 -194.65 -194.655 -194.66 -194.665 -194.67 -194.675 -194.68 -194.685 -194.69 -194.695 -194.7 -194.705 -194.71 -194.715 -194.72 -194.725 -194.73 -194.735 -194.74 -194.745 -194.75 -194.755 -194.76 -194.765 -194.77 -194.775 -194.78 -194.785 -194.79 -194.795 -194.8 -194.805 -194.81 -194.815 -194.82 -194.825 -194.83 -194.835 -194.84 -194.845 -194.85 -194.855 -194.86 -194.865 -194.87 -194.875 -194.88 -194.885 -194.89 -194.895 -194.9 -194.905 -194.91 -194.915 -194.92 -194.925 -194.93 -194.935 -194.94 -194.945 -194.95 -194.955 -194.96 -194.965 -194.97 -194.975 -194.98 -194.985 -194.99 -194.995 -195 -195.005 -195.01 -195.015 -195.02 -195.025 -195.03 -195.035 -195.04 -195.045 -195.05 -195.055 -195.06 -195.065 -195.07 -195.075 -195.08 -195.085 -195.09 -195.095 -195.1 -195.105 -195.11 -195.115 -195.12 -195.125 -195.13 -195.135 -195.14 -195.145 -195.15 -195.155 -195.16 -195.165 -195.17 -195.175 -195.18 -195.185 -195.19 -195.195 -195.2 -195.205 -195.21 -195.215 -195.22 -195.225 -195.23 -195.235 -195.24 -195.245 -195.25 -195.255 -195.26 -195.265 -195.27 -195.275 -195.28 -195.285 -195.29 -195.295 -195.3 -195.305 -195.31 -195.315 -195.32 -195.325 -195.33 -195.335 -195.34 -195.345 -195.35 -195.355 -195.36 -195.365 -195.37 -195.375 -195.38 -195.385 -195.39 -195.395 -195.4 -195.405 -195.41 -195.415 -195.42 -195.425 -195.43 -195.435 -195.44 -195.445 -195.45 -195.455 -195.46 -195.465 -195.47 -195.475 -195.48 -195.485 -195.49 -195.495 -195.5 -195.505 -195.51 -195.515 -195.52 -195.525 -195.53 -195.535 -195.54 -195.545 -195.55 -195.555 -195.56 -195.565 -195.57 -195.575 -195.58 -195.585 -195.59 -195.595 -195.6 -195.605 -195.61 -195.615 -195.62 -195.625 -195.63 -195.635 -195.64 -195.645 -195.65 -195.655 -195.66 -195.665 -195.67 -195.675 -195.68 -195.685 -195.69 -195.695 -195.7 -195.705 -195.71 -195.715 -195.72 -195.725 -195.73 -195.735 -195.74 -195.745 -195.75 -195.755 -195.76 -195.765 -195.77 -195.775 -195.78 -195.785 -195.79 -195.795 -195.8 -195.805 -195.81 -195.815 -195.82 -195.825 -195.83 -195.835 -195.84 -195.845 -195.85 -195.855 -195.86 -195.865 -195.87 -195.875 -195.88 -195.885 -195.89 -195.895 -195.9 -195.905 -195.91 -195.915 -195.92 -195.925 -195.93 -195.935 -195.94 -195.945 -195.95 -195.955 -195.96 -195.965 -195.97 -195.975 -195.98 -195.985 -195.99 -195.995 -196 -196.005 -196.01 -196.015 -196.02 -196.025 -196.03 -196.035 -196.04 -196.045 -196.05 -196.055 -196.06 -196.065 -196.07 -196.075 -196.08 -196.085 -196.09 -196.095 -196.1 -196.105 -196.11 -196.115 -196.12 -196.125 -196.13 -196.135 -196.14 -196.145 -196.15 -196.155 -196.16 -196.165 -196.17 -196.175 -196.18 -196.185 -196.19 -196.195 -196.2 -196.205 -196.21 -196.215 -196.22 -196.225 -196.23 -196.235 -196.24 -196.245 -196.25 -196.255 -196.26 -196.265 -196.27 -196.275 -196.28 -196.285 -196.29 -196.295 -196.3 -196.305 -196.31 -196.315 -196.32 -196.325 -196.33 -196.335 -196.34 -196.345 -196.35 -196.355 -196.36 -196.365 -196.37 -196.375 -196.38 -196.385 -196.39 -196.395 -196.4 -196.405 -196.41 -196.415 -196.42 -196.425 -196.43 -196.435 -196.44 -196.445 -196.45 -196.455 -196.46 -196.465 -196.47 -196.475 -196.48 -196.485 -196.49 -196.495 -196.5 -196.505 -196.51 -196.515 -196.52 -196.525 -196.53 -196.535 -196.54 -196.545 -196.55 -196.555 -196.56 -196.565 -196.57 -196.575 -196.58 -196.585 -196.59 -196.595 -196.6 -196.605 -196.61 -196.615 -196.62 -196.625 -196.63 -196.635 -196.64 -196.645 -196.65 -196.655 -196.66 -196.665 -196.67 -196.675 -196.68 -196.685 -196.69 -196.695 -196.7 -196.705 -196.71 -196.715 -196.72 -196.725 -196.73 -196.735 -196.74 -196.745 -196.75 -196.755 -196.76 -196.765 -196.77 -196.775 -196.78 -196.785 -196.79 -196.795 -196.8 -196.805 -196.81 -196.815 -196.82 -196.825 -196.83 -196.835 -196.84 -196.845 -196.85 -196.855 -196.86 -196.865 -196.87 -196.875 -196.88 -196.885 -196.89 -196.895 -196.9 -196.905 -196.91 -196.915 -196.92 -196.925 -196.93 -196.935 -196.94 -196.945 -196.95 -196.955 -196.96 -196.965 -196.97 -196.975 -196.98 -196.985 -196.99 -196.995 -197 -197.005 -197.01 -197.015 -197.02 -197.025 -197.03 -197.035 -197.04 -197.045 -197.05 -197.055 -197.06 -197.065 -197.07 -197.075 -197.08 -197.085 -197.09 -197.095 -197.1 -197.105 -197.11 -197.115 -197.12 -197.125 -197.13 -197.135 -197.14 -197.145 -197.15 -197.155 -197.16 -197.165 -197.17 -197.175 -197.18 -197.185 -197.19 -197.195 -197.2 -197.205 -197.21 -197.215 -197.22 -197.225 -197.23 -197.235 -197.24 -197.245 -197.25 -197.255 -197.26 -197.265 -197.27 -197.275 -197.28 -197.285 -197.29 -197.295 -197.3 -197.305 -197.31 -197.315 -197.32 -197.325 -197.33 -197.335 -197.34 -197.345 -197.35 -197.355 -197.36 -197.365 -197.37 -197.375 -197.38 -197.385 -197.39 -197.395 -197.4 -197.405 -197.41 -197.415 -197.42 -197.425 -197.43 -197.435 -197.44 -197.445 -197.45 -197.455 -197.46 -197.465 -197.47 -197.475 -197.48 -197.485 -197.49 -197.495 -197.5 -197.505 -197.51 -197.515 -197.52 -197.525 -197.53 -197.535 -197.54 -197.545 -197.55 -197.555 -197.56 -197.565 -197.57 -197.575 -197.58 -197.585 -197.59 -197.595 -197.6 -197.605 -197.61 -197.615 -197.62 -197.625 -197.63 -197.635 -197.64 -197.645 -197.65 -197.655 -197.66 -197.665 -197.67 -197.675 -197.68 -197.685 -197.69 -197.695 -197.7 -197.705 -197.71 -197.715 -197.72 -197.725 -197.73 -197.735 -197.74 -197.745 -197.75 -197.755 -197.76 -197.765 -197.77 -197.775 -197.78 -197.785 -197.79 -197.795 -197.8 -197.805 -197.81 -197.815 -197.82 -197.825 -197.83 -197.835 -197.84 -197.845 -197.85 -197.855 -197.86 -197.865 -197.87 -197.875 -197.88 -197.885 -197.89 -197.895 -197.9 -197.905 -197.91 -197.915 -197.92 -197.925 -197.93 -197.935 -197.94 -197.945 -197.95 -197.955 -197.96 -197.965 -197.97 -197.975 -197.98 -197.985 -197.99 -197.995 -198 -198.005 -198.01 -198.015 -198.02 -198.025 -198.03 -198.035 -198.04 -198.045 -198.05 -198.055 -198.06 -198.065 -198.07 -198.075 -198.08 -198.085 -198.09 -198.095 -198.1 -198.105 -198.11 -198.115 -198.12 -198.125 -198.13 -198.135 -198.14 -198.145 -198.15 -198.155 -198.16 -198.165 -198.17 -198.175 -198.18 -198.185 -198.19 -198.195 -198.2 -198.205 -198.21 -198.215 -198.22 -198.225 -198.23 -198.235 -198.24 -198.245 -198.25 -198.255 -198.26 -198.265 -198.27 -198.275 -198.28 -198.285 -198.29 -198.295 -198.3 -198.305 -198.31 -198.315 -198.32 -198.325 -198.33 -198.335 -198.34 -198.345 -198.35 -198.355 -198.36 -198.365 -198.37 -198.375 -198.38 -198.385 -198.39 -198.395 -198.4 -198.405 -198.41 -198.415 -198.42 -198.425 -198.43 -198.435 -198.44 -198.445 -198.45 -198.455 -198.46 -198.465 -198.47 -198.475 -198.48 -198.485 -198.49 -198.495 -198.5 -198.505 -198.51 -198.515 -198.52 -198.525 -198.53 -198.535 -198.54 -198.545 -198.55 -198.555 -198.56 -198.565 -198.57 -198.575 -198.58 -198.585 -198.59 -198.595 -198.6 -198.605 -198.61 -198.615 -198.62 -198.625 -198.63 -198.635 -198.64 -198.645 -198.65 -198.655 -198.66 -198.665 -198.67 -198.675 -198.68 -198.685 -198.69 -198.695 -198.7 -198.705 -198.71 -198.715 -198.72 -198.725 -198.73 -198.735 -198.74 -198.745 -198.75 -198.755 -198.76 -198.765 -198.77 -198.775 -198.78 -198.785 -198.79 -198.795 -198.8 -198.805 -198.81 -198.815 -198.82 -198.825 -198.83 -198.835 -198.84 -198.845 -198.85 -198.855 -198.86 -198.865 -198.87 -198.875 -198.88 -198.885 -198.89 -198.895 -198.9 -198.905 -198.91 -198.915 -198.92 -198.925 -198.93 -198.935 -198.94 -198.945 -198.95 -198.955 -198.96 -198.965 -198.97 -198.975 -198.98 -198.985 -198.99 -198.995 -199 -199.005 -199.01 -199.015 -199.02 -199.025 -199.03 -199.035 -199.04 -199.045 -199.05 -199.055 -199.06 -199.065 -199.07 -199.075 -199.08 -199.085 -199.09 -199.095 -199.1 -199.105 -199.11 -199.115 -199.12 -199.125 -199.13 -199.135 -199.14 -199.145 -199.15 -199.155 -199.16 -199.165 -199.17 -199.175 -199.18 -199.185 -199.19 -199.195 -199.2 -199.205 -199.21 -199.215 -199.22 -199.225 -199.23 -199.235 -199.24 -199.245 -199.25 -199.255 -199.26 -199.265 -199.27 -199.275 -199.28 -199.285 -199.29 -199.295 -199.3 -199.305 -199.31 -199.315 -199.32 -199.325 -199.33 -199.335 -199.34 -199.345 -199.35 -199.355 -199.36 -199.365 -199.37 -199.375 -199.38 -199.385 -199.39 -199.395 -199.4 -199.405 -199.41 -199.415 -199.42 -199.425 -199.43 -199.435 -199.44 -199.445 -199.45 -199.455 -199.46 -199.465 -199.47 -199.475 -199.48 -199.485 -199.49 -199.495 -199.5 -199.505 -199.51 -199.515 -199.52 -199.525 -199.53 -199.535 -199.54 -199.545 -199.55 -199.555 -199.56 -199.565 -199.57 -199.575 -199.58 -199.585 -199.59 -199.595 -199.6 -199.605 -199.61 -199.615 -199.62 -199.625 -199.63 -199.635 -199.64 -199.645 -199.65 -199.655 -199.66 -199.665 -199.67 -199.675 -199.68 -199.685 -199.69 -199.695 -199.7 -199.705 -199.71 -199.715 -199.72 -199.725 -199.73 -199.735 -199.74 -199.745 -199.75 -199.755 -199.76 -199.765 -199.77 -199.775 -199.78 -199.785 -199.79 -199.795 -199.8 -199.805 -199.81 -199.815 -199.82 -199.825 -199.83 -199.835 -199.84 -199.845 -199.85 -199.855 -199.86 -199.865 -199.87 -199.875 -199.88 -199.885 -199.89 -199.895 -199.9 -199.905 -199.91 -199.915 -199.92 -199.925 -199.93 -199.935 -199.94 -199.945 -199.95 -199.955 -199.96 -199.965 -199.97 -199.975 -199.98 -199.985 -199.99 -199.995 -200 -200.005 -200.01 -200.015 -200.02 -200.025 -200.03 -200.035 -200.04 -200.045 -200.05 -200.055 -200.06 -200.065 -200.07 -200.075 -200.08 -200.085 -200.09 -200.095 -200.1 -200.105 -200.11 -200.115 -200.12 -200.125 -200.13 -200.135 -200.14 -200.145 -200.15 -200.155 -200.16 -200.165 -200.17 -200.175 -200.18 -200.185 -200.19 -200.195 -200.2 -200.205 -200.21 -200.215 -200.22 -200.225 -200.23 -200.235 -200.24 -200.245 -200.25 -200.255 -200.26 -200.265 -200.27 -200.275 -200.28 -200.285 -200.29 -200.295 -200.3 -200.305 -200.31 -200.315 -200.32 -200.325 -200.33 -200.335 -200.34 -200.345 -200.35 -200.355 -200.36 -200.365 -200.37 -200.375 -200.38 -200.385 -200.39 -200.395 -200.4 -200.405 -200.41 -200.415 -200.42 -200.425 -200.43 -200.435 -200.44 -200.445 -200.45 -200.455 -200.46 -200.465 -200.47 -200.475 -200.48 -200.485 -200.49 -200.495 -200.5 -200.505 -200.51 -200.515 -200.52 -200.525 -200.53 -200.535 -200.54 -200.545 -200.55 -200.555 -200.56 -200.565 -200.57 -200.575 -200.58 -200.585 -200.59 -200.595 -200.6 -200.605 -200.61 -200.615 -200.62 -200.625 -200.63 -200.635 -200.64 -200.645 -200.65 -200.655 -200.66 -200.665 -200.67 -200.675 -200.68 -200.685 -200.69 -200.695 -200.7 -200.705 -200.71 -200.715 -200.72 -200.725 -200.73 -200.735 -200.74 -200.745 -200.75 -200.755 -200.76 -200.765 -200.77 -200.775 -200.78 -200.785 -200.79 -200.795 -200.8 -200.805 -200.81 -200.815 -200.82 -200.825 -200.83 -200.835 -200.84 -200.845 -200.85 -200.855 -200.86 -200.865 -200.87 -200.875 -200.88 -200.885 -200.89 -200.895 -200.9 -200.905 -200.91 -200.915 -200.92 -200.925 -200.93 -200.935 -200.94 -200.945 -200.95 -200.955 -200.96 -200.965 -200.97 -200.975 -200.98 -200.985 -200.99 -200.995 -201 -201.005 -201.01 -201.015 -201.02 -201.025 -201.03 -201.035 -201.04 -201.045 -201.05 -201.055 -201.06 -201.065 -201.07 -201.075 -201.08 -201.085 -201.09 -201.095 -201.1 -201.105 -201.11 -201.115 -201.12 -201.125 -201.13 -201.135 -201.14 -201.145 -201.15 -201.155 -201.16 -201.165 -201.17 -201.175 -201.18 -201.185 -201.19 -201.195 -201.2 -201.205 -201.21 -201.215 -201.22 -201.225 -201.23 -201.235 -201.24 -201.245 -201.25 -201.255 -201.26 -201.265 -201.27 -201.275 -201.28 -201.285 -201.29 -201.295 -201.3 -201.305 -201.31 -201.315 -201.32 -201.325 -201.33 -201.335 -201.34 -201.345 -201.35 -201.355 -201.36 -201.365 -201.37 -201.375 -201.38 -201.385 -201.39 -201.395 -201.4 -201.405 -201.41 -201.415 -201.42 -201.425 -201.43 -201.435 -201.44 -201.445 -201.45 -201.455 -201.46 -201.465 -201.47 -201.475 -201.48 -201.485 -201.49 -201.495 -201.5 -201.505 -201.51 -201.515 -201.52 -201.525 -201.53 -201.535 -201.54 -201.545 -201.55 -201.555 -201.56 -201.565 -201.57 -201.575 -201.58 -201.585 -201.59 -201.595 -201.6 -201.605 -201.61 -201.615 -201.62 -201.625 -201.63 -201.635 -201.64 -201.645 -201.65 -201.655 -201.66 -201.665 -201.67 -201.675 -201.68 -201.685 -201.69 -201.695 -201.7 -201.705 -201.71 -201.715 -201.72 -201.725 -201.73 -201.735 -201.74 -201.745 -201.75 -201.755 -201.76 -201.765 -201.77 -201.775 -201.78 -201.785 -201.79 -201.795 -201.8 -201.805 -201.81 -201.815 -201.82 -201.825 -201.83 -201.835 -201.84 -201.845 -201.85 -201.855 -201.86 -201.865 -201.87 -201.875 -201.88 -201.885 -201.89 -201.895 -201.9 -201.905 -201.91 -201.915 -201.92 -201.925 -201.93 -201.935 -201.94 -201.945 -201.95 -201.955 -201.96 -201.965 -201.97 -201.975 -201.98 -201.985 -201.99 -201.995 -202 -202.005 -202.01 -202.015 -202.02 -202.025 -202.03 -202.035 -202.04 -202.045 -202.05 -202.055 -202.06 -202.065 -202.07 -202.075 -202.08 -202.085 -202.09 -202.095 -202.1 -202.105 -202.11 -202.115 -202.12 -202.125 -202.13 -202.135 -202.14 -202.145 -202.15 -202.155 -202.16 -202.165 -202.17 -202.175 -202.18 -202.185 -202.19 -202.195 -202.2 -202.205 -202.21 -202.215 -202.22 -202.225 -202.23 -202.235 -202.24 -202.245 -202.25 -202.255 -202.26 -202.265 -202.27 -202.275 -202.28 -202.285 -202.29 -202.295 -202.3 -202.305 -202.31 -202.315 -202.32 -202.325 -202.33 -202.335 -202.34 -202.345 -202.35 -202.355 -202.36 -202.365 -202.37 -202.375 -202.38 -202.385 -202.39 -202.395 -202.4 -202.405 -202.41 -202.415 -202.42 -202.425 -202.43 -202.435 -202.44 -202.445 -202.45 -202.455 -202.46 -202.465 -202.47 -202.475 -202.48 -202.485 -202.49 -202.495 - --75.9281 --75.9125 --75.9203 --75.9203 --75.9375 --75.9203 --75.9172 --75.9141 --75.9187 --75.9141 --75.9156 --75.9172 --75.9078 --75.9062 --75.9172 --75.9125 --75.9172 --75.9141 --75.9 --75.9094 --75.9141 --75.9125 --75.9156 --75.9172 --75.9172 --75.9313 --75.9328 --75.9187 --75.9203 --75.9172 --75.9125 --75.9203 --75.9187 --75.9234 --75.9297 --75.9156 --75.9203 --75.9187 --75.9187 --75.9187 --75.9281 --75.9 --75.9109 --75.9156 --75.9187 --75.9156 --75.9234 --75.9109 --75.9313 --75.9313 --75.9141 --75.9203 --75.9203 --75.9203 --75.9203 --75.9328 --75.9266 --75.9266 --75.9141 --75.9234 --75.9313 --75.9297 --75.9375 --75.9359 --75.9266 --75.9453 --75.9313 --75.9359 --75.9313 --75.925 --75.9203 --75.9344 --75.9391 --75.9391 --75.925 --75.9266 --75.9219 --75.9219 --75.9297 --75.9219 --75.9266 --75.9219 --75.9266 --75.9344 --75.9328 --75.9391 --75.9313 --75.9344 --75.9375 --75.9328 --75.9219 --75.9391 --75.9187 --75.9406 --75.9406 --75.9422 --75.9437 --75.9313 --75.9328 --75.9391 --75.9391 --75.9437 --75.9328 --75.9344 --75.9453 --75.925 --75.9344 --75.9422 --75.9359 --75.9328 --75.9391 --75.9359 --75.9328 --75.9453 --75.9344 --75.9328 --75.9344 --75.9469 --75.9344 --75.9406 --75.9203 --75.9391 --75.9359 --75.9219 --75.9391 --75.9469 --75.9313 --75.9344 --75.9219 --75.9203 --75.9219 --75.9359 --75.9344 --75.9469 --75.9359 --75.9234 --75.9313 --75.9266 --75.9344 --75.9219 --75.9328 --75.9297 --75.9406 --75.9359 --75.9328 --75.9281 --75.9391 --75.9406 --75.9297 --75.9266 --75.9391 --75.9391 --75.9406 --75.9391 --75.9313 --75.9406 --75.9344 --75.9313 --75.9328 --75.9203 --75.9437 --75.9313 --75.9328 --75.9328 --75.9281 --75.9281 --75.9266 --75.9328 --75.9266 --75.925 --75.9344 --75.9328 --75.925 --75.9391 --75.9281 --75.9266 --75.9234 --75.9406 --75.9437 --75.925 --75.9344 --75.9422 --75.9375 --75.9297 --75.9297 --75.9375 --75.9234 --75.9203 --75.9344 --75.9156 --75.9359 --75.9172 --75.9266 --75.9109 --75.9172 --75.9125 --75.9203 --75.9172 --75.9156 --75.9125 --75.9172 --75.9281 --75.9297 --75.9281 --75.9141 --75.9187 --75.9203 --75.9297 --75.9187 --75.9187 --75.9094 --75.9125 --75.9047 --75.9141 --75.9266 --75.9234 --75.9203 --75.9266 --75.9094 --75.9219 --75.9094 --75.9266 --75.9219 --75.9156 --75.9234 --75.9219 --75.925 --75.925 --75.9187 --75.9141 --75.9234 --75.9234 --75.9141 --75.9187 --75.9141 --75.9203 --75.9156 --75.9125 --75.9219 --75.9297 --75.9156 --75.9234 --75.9313 --75.925 --75.9172 --75.9141 --75.9234 --75.9359 --75.9328 --75.9187 --75.9375 --75.9234 --75.9281 --75.95 --75.9187 --75.9437 --75.9297 --75.9437 --75.9375 --75.9422 --75.9281 --75.9297 --75.9281 --75.925 --75.9328 --75.9359 --75.9172 --75.9406 --75.9172 --75.9359 --75.925 --75.9219 --75.925 --75.9156 --75.9187 --75.9313 --75.9328 --75.9266 --75.9422 --75.925 --75.9391 --75.9359 --75.9266 --75.9359 --75.9266 --75.925 --75.9375 --75.9313 --75.9266 --75.9281 --75.9219 --75.9344 --75.9406 --75.9219 --75.9281 --75.9344 --75.9297 --75.9313 --75.9219 --75.9266 --75.925 --75.9094 --75.9297 --75.9219 --75.9094 --75.9172 --75.9297 --75.9313 --75.925 --75.9203 --75.9328 --75.9203 --75.9156 --75.9203 --75.9094 --75.9203 --75.9203 --75.9094 --75.925 --75.9344 --75.9234 --75.9078 --75.9328 --75.9203 --75.9266 --75.9406 --75.9156 --75.9141 --75.9109 --75.9266 --75.9109 --75.925 --75.9281 --75.9281 --75.9344 --75.9313 --75.9297 --75.9187 --75.9266 --75.925 --75.9281 --75.9344 --75.9328 --75.9266 --75.9187 --75.9219 --75.9266 --75.9281 --75.9203 --75.9234 --75.9234 --75.9234 --75.9109 --75.9359 --75.9234 --75.9187 --75.925 --75.9281 --75.9219 --75.9328 --75.9203 --75.925 --75.9281 --75.9281 --75.9234 --75.9281 --75.9266 --75.925 --75.9187 --75.9359 --75.9094 --75.9234 --75.9141 --75.9281 --75.9187 --75.9203 --75.9125 --75.9156 --75.925 --75.9187 --75.9234 --75.925 --75.9109 --75.9266 --75.9031 --75.9203 --75.9313 --75.9187 --75.9125 --75.9172 --75.9156 --75.9234 --75.9094 --75.9203 --75.9203 --75.9141 --75.9297 --75.9141 --75.9281 --75.9203 --75.9156 --75.9141 --75.9313 --75.9141 --75.9281 --75.9219 --75.8938 --75.8609 --75.8016 --75.7453 --75.7063 --75.7156 --75.775 --75.8844 --76.0297 --76.1625 --76.2937 --76.3969 --76.4859 --76.5531 --76.6203 --76.6734 --76.7094 --76.7562 --76.8 --76.8562 --76.9 --76.9313 --76.975 --77.0297 --77.0656 --77.1141 --77.1453 --77.1937 --77.2266 --77.2734 --77.3203 --77.3578 --77.375 --77.4359 --77.4625 --77.5078 --77.5406 --77.5875 --77.6234 --77.6531 --77.6984 --77.7234 --77.75 --77.7797 --77.8281 --77.8516 --77.9 --77.9219 --77.9625 --77.9953 --78.0422 --78.075 --78.1094 --78.1328 --78.1703 --78.1969 --78.2281 --78.2422 --78.2797 --78.3016 --78.3641 --78.3625 --78.4016 --78.4375 --78.4672 --78.4938 --78.5297 --78.5609 --78.5859 --78.6141 --78.6359 --78.6609 --78.7016 --78.7109 --78.7391 --78.7562 --78.7906 --78.7891 --78.8531 --78.8547 --78.9062 --78.9156 --78.9297 --78.9688 --78.9766 --79.0047 --79.0234 --79.0531 --79.0813 --79.0906 --79.1234 --79.1562 --79.1547 --79.1937 --79.2016 --79.2234 --79.2547 --79.2766 --79.3016 --79.3281 --79.3781 --79.4391 --79.5344 --79.6062 --79.6594 --79.675 --79.6281 --79.5391 --79.4156 --79.2891 --79.1781 --79.0938 --79.025 --78.9594 --78.9172 --78.8984 --78.8672 --78.8531 --78.8313 --78.8047 --78.7922 --78.7484 --78.7344 --78.7031 --78.6781 --78.6484 --78.6156 --78.5953 --78.575 --78.5484 --78.5297 --78.5172 --78.4938 --78.4906 --78.4453 --78.4219 --78.4094 --78.3844 --78.3625 --78.3469 --78.325 --78.3078 --78.2797 --78.2719 --78.2438 --78.225 --78.2031 --78.1937 --78.1828 --78.1516 --78.125 --78.1234 --78.1 --78.0953 --78.0687 --78.0531 --78.0359 --78.0375 --78.0094 --77.9938 --77.9828 --77.9688 --77.9516 --77.9359 --77.9141 --77.9125 --77.8891 --77.8734 --77.8516 --77.8531 --77.8422 --77.8328 --77.8047 --77.8031 --77.8031 --77.7844 --77.7672 --77.7672 --77.7312 --77.7312 --77.7312 --77.7141 --77.6984 --77.6875 --77.6719 --77.6547 --77.6547 --77.6438 --77.65 --77.625 --77.6172 --77.6031 --77.6109 --77.5828 --77.5813 --77.5734 --77.5531 --77.5625 --77.5406 --77.5297 --77.5188 --77.5062 --77.5016 --77.4938 --77.4859 --77.4781 --77.4875 --77.4703 --77.4609 --77.4469 --77.4437 --77.4328 --77.4328 --77.4313 --77.425 --77.4344 --77.4078 --77.3828 --77.3922 --77.375 --77.3766 --77.3812 --77.3734 --77.3562 --77.3578 --77.3531 --77.3469 --77.3266 --77.3453 --77.3172 --77.3406 --77.3375 --77.3125 --77.3172 --77.3156 --77.2969 --77.2859 --77.2828 --77.2797 --77.2734 --77.275 --77.2688 --77.2547 --77.2625 --77.2547 --77.2562 --77.2438 --77.2562 --77.2438 --77.2281 --77.2172 --77.2156 --77.2172 --77.2266 --77.2156 --77.2109 --77.2047 --77.1937 --77.1969 --77.2078 --77.1859 --77.1875 --77.1813 --77.1797 --77.1703 --77.175 --77.1734 --77.1687 --77.1672 --77.1641 --77.1547 --77.1469 --77.15 --77.1516 --77.15 --77.1328 --77.1297 --77.1328 --77.1359 --77.1281 --77.1125 --77.1297 --77.1078 --77.1203 --77.1047 --77.1062 --77.1156 --77.1109 --77.1 --77.0984 --77.0969 --77.0906 --77.0938 --77.0844 --77.0813 --77.0734 --77.0828 --77.075 --77.0734 --77.0531 --77.0672 --77.0578 --77.0578 --77.0563 --77.0656 --77.05 --77.0469 --77.0516 --77.0437 --77.0547 --77.0406 --77.0266 --77.0437 --77.0359 --77.0312 --77.0281 --77.0234 --77.0328 --77.0156 --77.0219 --77.0234 --77.0219 --77.0062 --77.0203 --77.0031 --77.0094 --76.9984 --76.9984 --76.9875 --76.9859 --76.9953 --76.9781 --76.9734 --76.9812 --76.9859 --76.9797 --76.9891 --76.9812 --76.9625 --76.9734 --76.9734 --76.9766 --76.9594 --76.9672 --76.9594 --76.9594 --76.9656 --76.9563 --76.9734 --76.95 --76.9563 --76.9469 --76.9422 --76.9516 --76.9516 --76.9453 --76.9516 --76.9516 --76.9375 --76.9531 --76.9672 --76.9406 --76.9422 --76.9391 --76.95 --76.9484 --76.9375 --76.9391 --76.9484 --76.9406 --76.95 --76.9328 --76.9375 --76.9391 --76.9328 --76.9219 --76.9359 --76.9297 --76.925 --76.9203 --76.9234 --76.9234 --76.9094 --76.925 --76.9047 --76.9047 --76.9234 --76.9125 --76.9078 --76.9109 --76.9062 --76.9078 --76.9172 --76.9 --76.8906 --76.8953 --76.8984 --76.8969 --76.8844 --76.9 --76.9062 --76.8891 --76.8859 --76.8938 --76.8812 --76.8734 --76.8781 --76.8781 --76.8703 --76.875 --76.8719 --76.8781 --76.8828 --76.8703 --76.8766 --76.8703 --76.8734 --76.8734 --76.8641 --76.8734 --76.8594 --76.8688 --76.8609 --76.8672 --76.8656 --76.8516 --76.8656 --76.8625 --76.8406 --76.8484 --76.8578 --76.8625 --76.8406 --76.8578 --76.8719 --76.85 --76.8516 --76.85 --76.8547 --76.8562 --76.8516 --76.8578 --76.8531 --76.8562 --76.8516 --76.8469 --76.8438 --76.8516 --76.8359 --76.8594 --76.8453 --76.85 --76.85 --76.8484 --76.8516 --76.8328 --76.8375 --76.8422 --76.8453 --76.8359 --76.8406 --76.8344 --76.8406 --76.8422 --76.8469 --76.8438 --76.8391 --76.8281 --76.8453 --76.8422 --76.825 --76.8484 --76.8406 --76.8203 --76.8422 --76.8313 --76.8328 --76.8281 --76.8344 --76.8141 --76.8219 --76.8375 --76.8187 --76.8219 --76.8281 --76.825 --76.8156 --76.8344 --76.8266 --76.8219 --76.825 --76.8344 --76.8281 --76.825 --76.8187 --76.8266 --76.825 --76.8219 --76.8281 --76.8125 --76.8266 --76.8109 --76.8203 --76.8281 --76.8078 --76.8219 --76.8219 --76.8297 --76.8078 --76.8047 --76.7984 --76.8109 --76.8094 --76.8078 --76.8375 --76.825 --76.8125 --76.8172 --76.8172 --76.8156 --76.8156 --76.8031 --76.8047 --76.8031 --76.8031 --76.8031 --76.8016 --76.8172 --76.8109 --76.8125 --76.8109 --76.7984 --76.8047 --76.7984 --76.8156 --76.7922 --76.8094 --76.7969 --76.8172 --76.8016 --76.8203 --76.8031 --76.8109 --76.8078 --76.8078 --76.8047 --76.7953 --76.7875 --76.8016 --76.7766 --76.8094 --76.8047 --76.7891 --76.8031 --76.7922 --76.7953 --76.7906 --76.7937 --76.7859 --76.7891 --76.7766 --76.7844 --76.7937 --76.7844 --76.775 --76.7828 --76.7937 --76.7875 --76.7953 --76.7828 --76.7844 --76.7859 --76.7781 --76.7734 --76.7766 --76.7734 --76.7781 --76.775 --76.7891 --76.7906 --76.7844 --76.7719 --76.7781 --76.7797 --76.7734 --76.7766 --76.7922 --76.7812 --76.7875 --76.7734 --76.7828 --76.7766 --76.7766 --76.7906 --76.7906 --76.7781 --76.7703 --76.7812 --76.7844 --76.775 --76.7703 --76.7703 --76.7703 --76.7875 --76.7766 --76.7859 --76.7844 --76.7906 --76.7844 --76.7734 --76.7844 --76.7906 --76.7812 --76.7578 --76.7656 --76.7766 --76.7734 --76.7656 --76.7719 --76.7703 --76.7594 --76.7766 --76.7781 --76.7812 --76.775 --76.7672 --76.7703 --76.7656 --76.7781 --76.7828 --76.7625 --76.7688 --76.7641 --76.7766 --76.7656 --76.7641 --76.7516 --76.7609 --76.7766 --76.7641 --76.7531 --76.7672 --76.7672 --76.7578 --76.7656 --76.7578 --76.7578 --76.7609 --76.7719 --76.7625 --76.7484 --76.7609 --76.75 --76.7625 --76.7781 --76.7609 --76.7656 --76.7609 --76.7672 --76.7656 --76.7516 --76.7609 --76.7578 --76.7625 --76.7547 --76.7453 --76.7609 --76.7469 --76.7609 --76.7531 --76.7391 --76.7594 --76.7562 --76.7562 --76.7609 --76.7484 --76.7484 --76.7453 --76.7531 --76.7531 --76.75 --76.7469 --76.7375 --76.75 --76.7531 --76.7453 --76.7453 --76.7453 --76.7281 --76.7438 --76.7406 --76.7219 --76.7406 --76.7391 --76.7375 --76.7453 --76.75 --76.7328 --76.7406 --76.7391 --76.7297 --76.7328 --76.7234 --76.725 --76.7469 --76.725 --76.7422 --76.7312 --76.7359 --76.7266 --76.7328 --76.7391 --76.7375 --76.7172 --76.7344 --76.7375 --76.7297 --76.725 --76.7125 --76.7141 --76.7094 --76.7266 --76.725 --76.7328 --76.7156 --76.7172 --76.7141 --76.7125 --76.7109 --76.7281 --76.7188 --76.7219 --76.7172 --76.7203 --76.7281 --76.7312 --76.7188 --76.7266 --76.7344 --76.7328 --76.7219 --76.7234 --76.7172 --76.7281 --76.7141 --76.7297 --76.7219 --76.7266 --76.7141 --76.7203 --76.7312 --76.7391 --76.7219 --76.7188 --76.725 --76.7219 --76.7063 --76.7172 --76.7359 --76.7188 --76.7109 --76.7312 --76.7172 --76.7125 --76.7047 --76.7047 --76.7234 --76.7266 --76.7203 --76.7156 --76.7172 --76.7281 --76.7234 --76.7297 --76.725 --76.7172 --76.7203 --76.7203 --76.7047 --76.725 --76.7219 --76.7125 --76.7156 --76.7078 --76.7156 --76.6984 --76.7094 --76.7078 --76.7078 --76.7219 --76.7141 --76.7078 --76.7094 --76.7094 --76.7094 --76.7125 --76.7109 --76.7219 --76.7141 --76.7141 --76.7047 --76.7141 --76.7063 --76.7078 --76.7063 --76.7125 --76.7188 --76.7078 --76.6984 --76.7078 --76.6984 --76.7109 --76.7094 --76.7078 --76.7016 --76.6984 --76.7047 --76.7203 --76.6953 --76.7016 --76.7094 --76.6937 --76.6953 --76.7016 --76.7063 --76.7031 --76.7016 --76.6953 --76.7031 --76.7219 --76.7047 --76.7109 --76.7125 --76.6953 --76.7016 --76.6969 --76.7031 --76.7 --76.6844 --76.6969 --76.7031 --76.7047 --76.6922 --76.6922 --76.6984 --76.6969 --76.6844 --76.6859 --76.6969 --76.6875 --76.6797 --76.675 --76.6813 --76.6922 --76.6906 --76.6844 --76.6828 --76.6922 --76.6891 --76.6937 --76.6875 --76.6875 --76.6859 --76.6781 --76.6906 --76.6734 --76.6891 --76.6891 --76.6906 --76.6937 --76.6875 --76.6625 --76.6797 --76.6875 --76.6813 --76.6797 --76.6781 --76.6828 --76.6828 --76.6797 --76.6781 --76.6813 --76.6797 --76.6937 --76.675 --76.6844 --76.6906 --76.6813 --76.6828 --76.6813 --76.6859 --76.6813 --76.6875 --76.6766 --76.6844 --76.6828 --76.6594 --76.6719 --76.6687 --76.6703 --76.6687 --76.6734 --76.6844 --76.6813 --76.6766 --76.6781 --76.6891 --76.6844 --76.6672 --76.6687 --76.6734 --76.6766 --76.6719 --76.675 --76.675 --76.6672 --76.675 --76.6797 --76.6797 --76.6734 --76.6891 --76.6766 --76.6719 --76.6703 --76.6813 --76.675 --76.6875 --76.6766 --76.6906 --76.6859 --76.6797 --76.6797 --76.6734 --76.6734 --76.675 --76.6703 --76.6891 --76.6656 --76.6844 --76.6922 --76.6766 --76.6828 --76.675 --76.6734 --76.675 --76.6734 --76.6594 --76.6703 --76.6797 --76.6703 --76.6813 --76.6844 --76.675 --76.6687 --76.6641 --76.6766 --76.6531 --76.6734 --76.6672 --76.6625 --76.6516 --76.6781 --76.6672 --76.6672 --76.6719 --76.6609 --76.6594 --76.6766 --76.6594 --76.6516 --76.65 --76.6594 --76.6625 --76.675 --76.6656 --76.6672 --76.675 --76.6672 --76.675 --76.6703 --76.6656 --76.6719 --76.6641 --76.6531 --76.6562 --76.6531 --76.6516 --76.6562 --76.6703 --76.6594 --76.6516 --76.6609 --76.6734 --76.6531 --76.6594 --76.6656 --76.6578 --76.6609 --76.6547 --76.6578 --76.6672 --76.6578 --76.6531 --76.6562 --76.6547 --76.6562 --76.6609 --76.6578 --76.6594 --76.6625 --76.6453 --76.6562 --76.6656 --76.6719 --76.6641 --76.6516 --76.6672 --76.6531 --76.6562 --76.6547 --76.6625 --76.6656 --76.6594 --76.6734 --76.6547 --76.6578 --76.6547 --76.6531 --76.6578 --76.6578 --76.6469 --76.6469 --76.65 --76.6516 --76.65 --76.6687 --76.6547 --76.6438 --76.6516 --76.65 --76.6547 --76.6516 --76.6547 --76.6438 --76.6469 --76.6406 --76.6578 --76.6531 --76.6469 --76.6484 --76.65 --76.6391 --76.6547 --76.6453 --76.6469 --76.6609 --76.6547 --76.6625 --76.6422 --76.6406 --76.6281 --76.65 --76.6547 --76.6422 --76.65 --76.6453 --76.6484 --76.6328 --76.6406 --76.6406 --76.6578 --76.6453 --76.6562 --76.6359 --76.6484 --76.6531 --76.6391 --76.6438 --76.6484 --76.6344 --76.6469 --76.6422 --76.65 --76.6406 --76.6406 --76.6453 --76.6484 --76.6531 --76.6359 --76.6453 --76.6375 --76.65 --76.6469 --76.6438 --76.6328 --76.6422 --76.65 --76.6344 --76.6406 --76.6312 --76.6312 --76.6516 --76.6391 --76.6484 --76.6453 --76.6359 --76.6531 --76.6406 --76.6312 --76.6453 --76.6328 --76.6406 --76.6438 --76.6344 --76.6391 --76.6281 --76.6266 --76.6312 --76.6375 --76.6375 --76.6406 --76.6406 --76.6484 --76.6469 --76.6438 --76.6469 --76.6266 --76.6453 --76.6375 --76.6422 --76.6469 --76.6406 --76.6438 --76.6516 --76.6328 --76.6266 --76.6344 --76.6234 --76.6328 --76.6438 --76.6359 --76.6344 --76.6453 --76.6344 --76.6344 --76.6281 --76.6469 --76.6266 --76.6203 --76.6422 --76.6469 --76.6391 --76.6406 --76.6312 --76.6375 --76.6391 --76.6281 --76.6188 --76.6328 --76.6406 --76.6266 --76.6297 --76.6188 --76.6328 --76.6375 --76.6281 --76.6453 --76.625 --76.6344 --76.6297 --76.6219 --76.6312 --76.6406 --76.6375 --76.6328 --76.6328 --76.6328 --76.6453 --76.625 --76.6312 --76.6422 --76.6344 --76.6391 --76.6406 --76.6453 --76.6312 --76.6125 --76.625 --76.625 --76.6266 --76.6 --76.625 --76.6219 --76.6375 --76.6281 --76.6203 --76.6328 --76.6109 --76.6297 --76.6281 --76.6297 --76.6016 --76.6359 --76.6344 --76.6266 --76.6406 --76.6203 --76.6203 --76.6172 --76.6047 --76.6234 --76.6234 --76.6234 --76.625 --76.6281 --76.6281 --76.6234 --76.6219 --76.6312 --76.6266 --76.6172 --76.6125 --76.6109 --76.6062 --76.6266 --76.6141 --76.6188 --76.6203 --76.6016 --76.6188 --76.6062 --76.6062 --76.5969 --76.6062 --76.6203 --76.6141 --76.6125 --76.6094 --76.5984 --76.6234 --76.6125 --76.6094 --76.6125 --76.6016 --76.6219 --76.6062 --76.6047 --76.6094 --76.6141 --76.6109 --76.6281 --76.6062 --76.6062 --76.6219 --76.6156 --76.6141 --76.6047 --76.6234 --76.6016 --76.6062 --76.6031 --76.6016 --76.6172 --76.6109 --76.6094 --76.6047 --76.6141 --76.6062 --76.6047 --76.6109 --76.6031 --76.6094 --76.6094 --76.6047 --76.5906 --76.6141 --76.5938 --76.6094 --76.6109 --76.6078 --76.6062 --76.6 --76.6062 --76.6266 --76.6062 --76.6141 --76.6141 --76.6062 --76.6125 --76.6078 --76.6172 --76.6078 --76.6109 --76.6062 --76.6094 --76.6109 --76.6109 --76.6078 --76.6156 --76.6203 --76.6078 --76.6062 --76.6 --76.6109 --76.6016 --76.6094 --76.6078 --76.6047 --76.6125 --76.6156 --76.6141 --76.6062 --76.6062 --76.6078 --76.6031 --76.6203 --76.6062 --76.6109 --76.6047 --76.6062 --76.6172 --76.6125 --76.6 --76.6078 --76.6094 --76.6031 --76.6062 --76.5984 --76.5984 --76.6172 --76.5969 --76.6172 --76.6031 --76.6109 --76.6016 --76.5984 --76.6109 --76.5922 --76.6062 --76.5922 --76.5938 --76.6 --76.5953 --76.6047 --76.5938 --76.5984 --76.6 --76.6031 --76.6078 --76.5922 --76.5906 --76.6016 --76.6125 --76.5953 --76.6062 --76.5922 --76.6062 --76.6031 --76.6078 --76.5906 --76.6188 --76.6031 --76.6016 --76.6172 --76.5938 --76.6 --76.5938 --76.5938 --76.6016 --76.6062 --76.5984 --76.5922 --76.6062 --76.6031 --76.6109 --76.6109 --76.6094 --76.6156 --76.6047 --76.5953 --76.5984 --76.6016 --76.6125 --76.6094 --76.5969 --76.6062 --76.6062 --76.6109 --76.5938 --76.6094 --76.5969 --76.5938 --76.6047 --76.6094 --76.6078 --76.6094 --76.5984 --76.6031 --76.6125 --76.6031 --76.6141 --76.6 --76.5922 --76.6 --76.6109 --76.6016 --76.6078 --76.6016 --76.6 --76.5984 --76.6109 --76.6078 --76.5984 --76.5938 --76.6031 --76.6016 --76.5984 --76.5906 --76.6062 --76.6062 --76.6125 --76.6094 --76.6016 --76.5984 --76.6016 --76.6062 --76.6 --76.6219 --76.5969 --76.6109 --76.6047 --76.6 --76.6047 --76.6078 --76.6 --76.6125 --76.6125 --76.6062 --76.5906 --76.5906 --76.6125 --76.6094 --76.6 --76.5984 --76.5969 --76.5938 --76.5797 --76.5953 --76.5922 --76.6 --76.6016 --76.5953 --76.5875 --76.5969 --76.575 --76.5938 --76.6016 --76.5875 --76.6062 --76.5891 --76.5859 --76.5906 --76.6031 --76.5984 --76.5922 --76.5922 --76.5922 --76.5797 --76.5938 --76.5938 --76.5859 --76.5891 --76.6016 --76.5953 --76.5813 --76.5906 --76.5938 --76.5891 --76.6109 --76.5938 --76.5953 --76.5922 --76.6 --76.5938 --76.6047 --76.6 --76.5938 --76.5922 --76.5844 --76.5969 --76.5891 --76.5969 --76.5922 --76.5922 --76.5813 --76.5891 --76.5906 --76.5813 --76.5828 --76.5969 --76.5859 --76.5984 --76.5953 --76.5875 --76.5969 --76.575 --76.5844 --76.5891 --76.5781 --76.5844 --76.5859 --76.5766 --76.5797 --76.5844 --76.5781 --76.5656 --76.5687 --76.5891 --76.575 --76.5719 --76.5656 --76.5766 --76.5703 --76.5891 --76.5797 --76.5687 --76.5703 --76.5797 --76.5781 --76.5797 --76.5781 --76.5859 --76.5781 --76.5703 --76.5781 --76.5797 --76.5672 --76.5703 --76.5781 --76.5719 --76.5906 --76.5813 --76.5734 --76.5813 --76.5766 --76.5922 --76.5797 --76.5719 --76.5625 --76.5797 --76.5703 --76.5687 --76.5797 --76.5625 --76.5687 --76.5766 --76.5797 --76.55 --76.5766 --76.5766 --76.5563 --76.5641 --76.5703 --76.5781 --76.5844 --76.5656 --76.5703 --76.5687 --76.5719 --76.5703 --76.5734 --76.5594 --76.5594 --76.575 --76.5719 --76.5828 --76.5734 --76.5781 --76.5641 --76.5719 --76.5953 --76.5875 --76.575 --76.5766 --76.5703 --76.5844 --76.5781 --76.5813 --76.5672 --76.5734 --76.5828 --76.5859 --76.5734 --76.5734 --76.5672 --76.5734 --76.5797 --76.5734 --76.5641 --76.575 --76.5891 --76.5641 --76.5734 --76.5687 --76.5563 --76.5719 --76.5781 --76.5781 --76.5859 --76.5687 --76.5813 --76.575 --76.5719 --76.5859 --76.5719 --76.5875 --76.5859 --76.5797 --76.5797 --76.5687 --76.5813 --76.5609 --76.5813 --76.5766 --76.5766 --76.5687 --76.575 --76.5656 --76.5656 --76.5578 --76.5594 --76.5625 --76.5703 --76.5703 --76.5703 --76.5641 --76.5625 --76.5641 --76.5687 --76.5609 --76.5687 --76.5625 --76.5703 --76.5656 --76.5578 --76.5578 --76.5625 --76.5656 --76.575 --76.5734 --76.5766 --76.5813 --76.5547 --76.575 --76.5687 --76.575 --76.5797 --76.5672 --76.5703 --76.5578 --76.575 --76.5813 --76.5719 --76.5563 --76.575 --76.5609 --76.5797 --76.5641 --76.5672 --76.5828 --76.5672 --76.5734 --76.5828 --76.5922 --76.5734 --76.5703 --76.5703 --76.5766 --76.5703 --76.5719 --76.575 --76.5734 --76.5734 --76.5734 --76.5563 --76.5797 --76.5547 --76.5828 --76.5609 --76.5766 --76.5797 --76.5766 --76.5656 --76.5797 --76.5672 --76.5719 --76.5672 --76.5656 --76.5594 --76.5828 --76.5844 --76.5734 --76.5719 --76.5719 --76.5641 --76.5656 --76.5672 --76.5891 --76.5719 --76.5687 --76.5703 --76.5547 --76.5703 --76.5609 --76.5578 --76.5656 --76.5563 --76.5516 --76.5719 --76.5406 --76.5547 --76.5406 --76.5563 --76.5469 --76.5609 --76.55 --76.55 --76.5578 --76.5609 --76.5531 --76.5641 --76.5563 --76.5609 --76.5719 --76.5703 --76.5516 --76.5594 --76.5609 --76.5578 --76.5469 --76.5687 --76.5594 --76.5719 --76.5687 --76.5547 --76.5516 --76.5578 --76.5672 --76.5391 --76.5578 --76.5578 --76.5453 --76.55 --76.5578 --76.5609 --76.5422 --76.5484 --76.5578 --76.5609 --76.5516 --76.5672 --76.5484 --76.5703 --76.5516 --76.5578 --76.5672 --76.5563 --76.5625 --76.5563 --76.5703 --76.5406 --76.5625 --76.5656 --76.5641 --76.5625 --76.5656 --76.5547 --76.5578 --76.5547 --76.5578 --76.5766 --76.5656 --76.5578 --76.5516 --76.5641 --76.5594 --76.5687 --76.5563 --76.55 --76.5531 --76.5578 --76.5437 --76.5516 --76.5469 --76.5422 --76.5437 --76.5531 --76.5484 --76.5516 --76.5469 --76.5453 --76.5531 --76.5531 --76.5453 --76.5516 --76.5531 --76.5437 --76.5484 --76.5484 --76.5406 --76.5516 --76.5297 --76.5406 --76.5531 --76.5344 --76.55 --76.5328 --76.5469 --76.5422 --76.5484 --76.5328 --76.5516 --76.5469 --76.5453 --76.5359 --76.5484 --76.55 --76.55 --76.5437 --76.5437 --76.5547 --76.5453 --76.55 --76.5563 --76.5547 --76.5406 --76.5516 --76.5516 --76.5406 --76.5594 --76.5547 --76.5297 --76.5406 --76.5312 --76.525 --76.5359 --76.55 --76.5391 --76.5406 --76.5328 --76.5406 --76.5344 --76.55 --76.5453 --76.55 --76.5375 --76.5437 --76.5422 --76.5516 --76.5594 --76.5547 --76.55 --76.5375 --76.5453 --76.5484 --76.5453 --76.5437 --76.5406 --76.55 --76.5578 --76.5422 --76.5547 --76.5484 --76.5469 --76.5344 --76.5391 --76.5375 --76.55 --76.5563 --76.5375 --76.5328 --76.5422 --76.5453 --76.5344 --76.5422 --76.5531 --76.5359 --76.5266 --76.5344 --76.5406 --76.5328 --76.5531 --76.5453 --76.5469 --76.55 --76.5391 --76.5453 --76.5328 --76.5422 --76.5312 --76.5375 --76.5406 --76.5437 --76.5375 --76.5344 --76.5375 --76.5391 --76.5453 --76.5391 --76.5328 --76.5328 --76.5359 --76.5391 --76.5188 --76.5328 --76.5469 --76.5328 --76.5203 --76.5344 --76.5422 --76.5266 --76.5359 --76.5266 --76.5281 --76.5297 --76.5234 --76.5328 --76.525 --76.5375 --76.5297 --76.5312 --76.5359 --76.5234 --76.5312 --76.5359 --76.5281 --76.5281 --76.5344 --76.5297 --76.5219 --76.5203 --76.5281 --76.5359 --76.5172 --76.5328 --76.5234 --76.5531 --76.5297 --76.5172 --76.5359 --76.5281 --76.5344 --76.5281 --76.525 --76.5203 --76.5344 --76.525 --76.5437 --76.5359 --76.5406 --76.5328 --76.5281 --76.5344 --76.5125 --76.5234 --76.5188 --76.5188 --76.5297 --76.5281 --76.5125 --76.5266 --76.5141 --76.5141 --76.5188 --76.525 --76.5141 --76.5219 --76.5125 --76.5203 --76.5266 --76.5234 --76.5375 --76.5328 --76.5328 --76.5312 --76.5297 --76.5328 --76.5516 --76.5391 --76.5312 --76.5297 --76.5344 --76.5391 --76.525 --76.5406 --76.5406 --76.5312 --76.5297 --76.5172 --76.5328 --76.55 --76.5297 --76.525 --76.5188 --76.5328 --76.5141 --76.525 --76.5359 --76.5391 --76.525 --76.5297 --76.5266 --76.5234 --76.5109 --76.5219 --76.5188 --76.5125 --76.5156 --76.5312 --76.5375 --76.5219 --76.5219 --76.5188 --76.5266 --76.5234 --76.5203 --76.525 --76.525 --76.5328 --76.5266 --76.5203 --76.5281 --76.5375 --76.5203 --76.5328 --76.525 --76.5281 --76.5172 --76.5359 --76.5312 --76.5172 --76.5359 --76.5266 --76.5141 --76.5266 --76.5219 --76.5297 --76.5203 --76.5328 --76.5266 --76.5375 --76.5281 --76.5297 --76.5312 --76.5141 --76.5281 --76.5219 --76.5203 --76.525 --76.5078 --76.5203 --76.5125 --76.5141 --76.5188 --76.5094 --76.5234 --76.5156 --76.5016 --76.5109 --76.5141 --76.5062 --76.5016 --76.5062 --76.5078 --76.5297 --76.5125 --76.5062 --76.5172 --76.5156 --76.5125 --76.4984 --76.5172 --76.5016 --76.5172 --76.5047 --76.5203 --76.5062 --76.5078 --76.5 --76.5141 --76.5047 --76.5156 --76.5109 --76.5062 --76.5078 --76.5062 --76.5016 --76.5047 --76.5125 --76.5094 --76.5188 --76.5109 --76.5031 --76.5094 --76.5312 --76.5219 --76.5031 --76.5094 --76.5016 --76.5031 --76.5016 --76.5016 --76.5109 --76.5 --76.5125 --76.5109 --76.5234 --76.5156 --76.5 --76.5328 --76.5219 --76.5078 --76.4938 --76.5047 --76.5125 --76.5078 --76.5266 --76.5219 --76.5156 --76.5266 --76.5141 --76.525 --76.5188 --76.5219 --76.5188 --76.5094 --76.5203 --76.5 --76.5172 --76.5047 --76.5156 --76.5016 --76.4984 --76.5172 --76.5078 --76.5062 --76.5062 --76.5109 --76.5172 --76.5078 --76.5031 --76.5078 --76.5031 --76.4859 --76.5172 --76.5062 --76.5109 --76.5078 --76.4984 --76.5094 --76.5062 --76.4969 --76.5141 --76.4969 --76.5047 --76.5109 --76.5016 --76.5094 --76.5188 --76.5188 --76.5031 --76.5141 --76.4953 --76.5062 --76.5047 --76.4984 --76.5016 --76.4969 --76.5 --76.5172 --76.4922 --76.5031 --76.5094 --76.4844 --76.5016 --76.4812 --76.5 --76.5016 --76.5031 --76.4922 --76.5062 --76.5062 --76.4844 --76.4969 --76.5234 --76.4969 --76.5094 --76.5125 --76.5062 --76.5078 --76.5109 --76.5156 --76.5219 --76.5141 --76.5094 --76.5125 --76.5047 --76.5172 --76.4859 --76.5078 --76.4984 --76.5 --76.5172 --76.5156 --76.5125 --76.5094 --76.5141 --76.4953 --76.5109 --76.5078 --76.5203 --76.5062 --76.5 --76.5078 --76.5 --76.5016 --76.5031 --76.4891 --76.5031 --76.4969 --76.5062 --76.5 --76.4906 --76.4953 --76.5016 --76.5016 --76.5094 --76.5125 --76.4953 --76.5094 --76.5016 --76.5141 --76.5 --76.5125 --76.4969 --76.4984 --76.4875 --76.5031 --76.4938 --76.4953 --76.4922 --76.4891 --76.5016 --76.4922 --76.5016 --76.4797 --76.4922 --76.5109 --76.4984 --76.4906 --76.4984 --76.4922 --76.5109 --76.5109 --76.5016 --76.5062 --76.4844 --76.5062 --76.4969 --76.5078 --76.5016 --76.5141 --76.5 --76.4953 --76.4922 --76.4875 --76.4953 --76.4984 --76.4969 --76.4953 --76.4938 --76.4891 --76.4953 --76.4906 --76.4922 --76.5047 --76.4984 --76.4969 --76.4906 --76.5031 --76.5016 --76.5047 --76.5156 --76.5 --76.4891 --76.5016 --76.5094 --76.4906 --76.4953 --76.4984 --76.4875 --76.5109 --76.4984 --76.4953 --76.4859 --76.4844 --76.4875 --76.4875 --76.475 --76.4969 --76.4859 --76.4766 --76.4781 --76.4969 --76.4781 --76.4844 --76.4859 --76.4922 --76.4797 --76.4844 --76.4828 --76.475 --76.4891 --76.4938 --76.4781 --76.475 --76.4812 --76.4828 --76.4859 --76.4859 --76.4969 --76.4891 --76.4922 --76.475 --76.4734 --76.4875 --76.4844 --76.4906 --76.4969 --76.4984 --76.4906 --76.4938 --76.4875 --76.4859 --76.5 --76.4984 --76.4953 --76.4859 --76.4828 --76.5016 --76.4953 --76.4781 --76.4844 --76.4828 --76.5016 --76.4797 --76.4906 --76.4781 --76.4812 --76.4797 --76.4891 --76.4938 --76.4922 --76.4906 --76.4859 --76.4828 --76.4844 --76.4766 --76.4922 --76.4812 --76.4781 --76.4781 --76.5031 --76.4938 --76.4688 --76.4766 --76.4875 --76.4734 --76.4781 --76.4844 --76.475 --76.4891 --76.4734 --76.4859 --76.4797 --76.4688 --76.4797 --76.4797 --76.4969 --76.4844 --76.4719 --76.4859 --76.4891 --76.4906 --76.4766 --76.4766 --76.475 --76.4844 --76.4766 --76.4891 --76.4812 --76.4891 --76.4812 --76.4703 --76.4859 --76.5 --76.4859 --76.4797 --76.4859 --76.4938 --76.475 --76.4875 --76.4859 --76.4922 --76.4578 --76.5 --76.4891 --76.4891 --76.4984 --76.4922 --76.4922 --76.4812 --76.4875 --76.4875 --76.4859 --76.4938 --76.4828 --76.4906 --76.4969 --76.4703 --76.475 --76.4859 --76.4828 --76.4766 --76.4719 --76.4812 --76.4781 --76.4719 --76.4641 --76.4734 --76.4797 --76.4828 --76.4766 --76.475 --76.4797 --76.4734 --76.4672 --76.475 --76.4625 --76.4656 --76.4734 --76.4781 --76.4766 --76.4828 --76.4766 --76.4781 --76.4812 --76.4859 --76.4703 --76.4688 --76.475 --76.4734 --76.4797 --76.4734 --76.4844 --76.4781 --76.4688 --76.4906 --76.4828 --76.4781 --76.4703 --76.4641 --76.4844 --76.4844 --76.4781 --76.475 --76.4766 --76.4781 --76.4875 --76.4672 --76.4781 --76.4688 --76.4844 --76.4781 --76.4656 --76.4625 --76.4641 --76.4719 --76.4578 --76.4609 --76.4781 --76.4641 --76.4688 --76.4641 --76.4828 --76.4734 --76.4781 --76.4547 --76.4672 --76.4719 --76.475 --76.4672 --76.4812 --76.4734 --76.4625 --76.4766 --76.4688 --76.4844 --76.4656 --76.4703 --76.4703 --76.4703 --76.4719 --76.4734 --76.4703 --76.4594 --76.4797 --76.4766 --76.4703 --76.4797 --76.4703 --76.4719 --76.4828 --76.4734 --76.4734 --76.4734 --76.4703 --76.4859 --76.4812 --76.4703 --76.4797 --76.4766 --76.4625 --76.4688 --76.4844 --76.475 --76.4797 --76.475 --76.4891 --76.4797 --76.475 --76.4734 --76.4703 --76.4688 --76.475 --76.4781 --76.4719 --76.4656 --76.4797 --76.4609 --76.4703 --76.4656 --76.4734 --76.4719 --76.4641 --76.4641 --76.4766 --76.4672 --76.4609 --76.4563 --76.4625 --76.4609 --76.4844 --76.4594 --76.4578 --76.4656 --76.4672 --76.4641 --76.4609 --76.4719 --76.4672 --76.4766 --76.4828 --76.4641 --76.4703 --76.4578 --76.4594 --76.4656 --76.4703 --76.4656 --76.4734 --76.4688 --76.4563 --76.4609 --76.4625 --76.4688 --76.4734 --76.4625 --76.4422 --76.4578 --76.475 --76.4719 --76.4703 --76.4563 --76.4547 --76.4625 --76.4703 --76.4578 --76.4703 --76.4563 --76.4594 --76.4578 --76.4734 --76.4656 --76.4625 --76.4625 --76.4578 --76.4531 --76.4563 --76.45 --76.4641 --76.45 --76.4641 --76.45 --76.4594 --76.4734 --76.4734 --76.4656 --76.4703 --76.4563 --76.4703 --76.475 --76.4609 --76.4531 --76.4547 --76.4766 --76.4672 --76.4734 --76.4641 --76.4734 --76.4578 --76.4641 --76.4688 --76.4688 --76.4672 --76.4734 --76.4641 --76.4703 --76.4672 --76.4781 --76.4516 --76.4625 --76.4609 --76.4578 --76.4453 --76.4531 --76.4609 --76.4594 --76.4516 --76.4531 --76.4469 --76.4531 --76.4531 --76.4453 --76.4469 --76.4641 --76.45 --76.4469 --76.4641 --76.45 --76.4516 --76.4484 --76.4453 --76.45 --76.4531 --76.45 --76.4484 --76.4437 --76.4594 --76.4516 --76.4609 --76.4531 --76.4547 --76.4578 --76.4672 --76.4484 --76.4563 --76.4437 --76.4469 --76.4578 --76.4484 --76.4672 --76.4641 --76.4516 --76.4359 --76.4344 --76.4547 --76.4391 --76.4406 --76.4469 --76.4328 --76.4406 --76.4453 --76.4359 --76.4406 --76.4406 --76.4469 --76.4391 --76.4375 --76.4437 --76.4406 --76.4453 --76.4422 --76.4375 --76.45 --76.4266 --76.4375 --76.4469 --76.4328 --76.4375 --76.4422 --76.4344 --76.4281 --76.4469 --76.4266 --76.4359 --76.4344 --76.4297 --76.4313 --76.4359 --76.4141 --76.4359 --76.4219 --76.425 --76.4453 --76.4297 --76.4344 --76.4375 --76.4313 --76.4547 --76.4219 --76.4281 --76.4328 --76.4344 --76.4375 --76.4203 --76.4281 --76.4266 --76.4313 --76.4375 --76.4391 --76.4266 --76.4219 --76.4375 --76.4313 --76.4406 --76.4391 --76.4469 --76.4344 --76.4313 --76.4406 --76.4437 --76.4187 --76.4328 --76.4453 --76.4375 --76.425 --76.4313 --76.4328 --76.4328 --76.4281 --76.4422 --76.4344 --76.4313 --76.4437 --76.4313 --76.4375 --76.4328 --76.4422 --76.4391 --76.4437 --76.4359 --76.4359 --76.4406 --76.4313 --76.4422 --76.4328 --76.4359 --76.4437 --76.4281 --76.4359 --76.4391 --76.4437 --76.4437 --76.4406 --76.4375 --76.4391 --76.4375 --76.4391 --76.4297 --76.425 --76.4187 --76.4297 --76.4328 --76.4313 --76.4391 --76.4219 --76.4281 --76.4313 --76.4391 --76.4516 --76.4453 --76.4375 --76.4359 --76.4391 --76.4406 --76.4313 --76.4313 --76.4469 --76.4281 --76.4406 --76.4453 --76.4437 --76.4469 --76.4391 --76.4484 --76.4375 --76.4406 --76.4328 --76.4344 --76.4375 --76.4469 --76.4406 --76.4375 --76.4406 --76.4391 --76.4391 --76.4437 --76.4406 --76.4453 --76.4422 --76.4469 --76.4375 --76.4422 --76.4453 --76.4484 --76.4391 --76.4516 --76.4391 --76.4375 --76.4422 --76.4469 --76.4469 --76.4375 --76.4359 --76.4281 --76.4359 --76.4469 --76.4453 --76.4516 --76.4484 --76.4437 --76.4391 --76.4469 --76.4406 --76.4344 --76.4594 --76.4547 --76.4484 --76.4187 --76.4469 --76.4422 --76.4375 --76.45 --76.4516 --76.4375 --76.4344 --76.4453 --76.4359 --76.4391 --76.4328 --76.4328 --76.4266 --76.4391 --76.4281 --76.4266 --76.4297 --76.4375 --76.425 --76.4422 --76.4313 --76.4313 --76.4469 --76.4281 --76.4297 --76.4391 --76.4234 --76.4266 --76.4344 --76.4328 --76.4328 --76.4203 --76.4281 --76.4422 --76.4422 --76.4359 --76.425 --76.4203 --76.4172 --76.4281 --76.4328 --76.4281 --76.4375 --76.4203 --76.4328 --76.4234 --76.4234 --76.425 --76.4313 --76.4203 --76.4297 --76.4172 --76.4281 --76.4297 --76.4391 --76.4203 --76.4187 --76.4359 --76.4219 --76.4344 --76.4297 --76.4234 --76.4187 --76.4281 --76.4203 --76.4344 --76.425 --76.4172 --76.4156 --76.4172 --76.4094 --76.4203 --76.4234 --76.4156 --76.4266 --76.4172 --76.4266 --76.4187 --76.4219 --76.4281 --76.4281 --76.4172 --76.4281 --76.4234 --76.4219 --76.4281 --76.4344 --76.4359 --76.4187 --76.4437 --76.4172 --76.4297 --76.4297 --76.4266 --76.4328 --76.4266 --76.4375 --76.4375 --76.4266 --76.4391 --76.4391 --76.4281 --76.4437 --76.4203 --76.4359 --76.4344 --76.4313 --76.4281 --76.4375 --76.4297 --76.4437 --76.4187 --76.4266 --76.4313 --76.4219 --76.4156 --76.4172 --76.425 --76.4281 --76.4234 --76.4203 --76.4313 --76.4313 --76.4281 --76.4031 --76.4234 --76.4156 --76.4313 --76.4234 --76.4187 --76.4344 --76.4141 --76.4141 --76.4125 --76.4266 --76.425 --76.4328 --76.4375 --76.4203 --76.4172 --76.4141 --76.4219 --76.425 --76.4203 --76.4406 --76.4109 --76.425 --76.4281 --76.4156 --76.4297 --76.4141 --76.4125 --76.4156 --76.4141 --76.4172 --76.4156 --76.425 --76.4047 --76.4187 --76.4109 --76.4219 --76.4078 --76.4156 --76.4078 --76.4016 --76.4125 --76.4187 --76.4109 --76.4109 --76.4172 --76.4141 --76.425 --76.425 --76.4203 --76.4234 --76.4297 --76.4187 --76.425 --76.4187 --76.4156 --76.4297 --76.4203 --76.4141 --76.4125 --76.4203 --76.4187 --76.4078 --76.4359 --76.4094 --76.4141 --76.4266 --76.4187 --76.4203 --76.4219 --76.4141 --76.4172 --76.4047 --76.4062 --76.4125 --76.4234 --76.4172 --76.4125 --76.4141 --76.4172 --76.4219 --76.4219 --76.4219 --76.4187 --76.4156 --76.4266 --76.4203 --76.4141 --76.4156 --76.4203 --76.4172 --76.4094 --76.4156 --76.4141 --76.4156 --76.4203 --76.3969 --76.4109 --76.4094 --76.3953 --76.4125 --76.4078 --76.3984 --76.4062 --76.4062 --76.4062 --76.3984 --76.4062 --76.4 --76.4047 --76.4078 --76.4125 --76.4094 --76.4016 --76.4125 --76.3844 --76.4031 --76.4125 --76.4031 --76.4062 --76.4016 --76.4062 --76.3875 --76.4 --76.4047 --76.4187 --76.3906 --76.4125 --76.4047 --76.3953 --76.4062 --76.4078 --76.3984 --76.4141 --76.4109 --76.4031 --76.4172 --76.4172 --76.4094 --76.4062 --76.4 --76.3938 --76.4078 --76.4062 --76.4094 --76.4 --76.3969 --76.3984 --76.4031 --76.4234 --76.4016 --76.4078 --76.4 --76.4016 --76.4016 --76.4078 --76.4141 --76.4094 --76.4 --76.4031 --76.4031 --76.4062 --76.3922 --76.4062 --76.4094 --76.3938 --76.4016 --76.4109 --76.4016 --76.3984 --76.4125 --76.4141 --76.4156 --76.4187 --76.4219 --76.4141 --76.4141 --76.4094 --76.4047 --76.4094 --76.4109 --76.4 --76.3969 --76.3953 --76.3906 --76.4047 --76.4016 --76.4109 --76.4078 --76.3922 --76.4109 --76.4047 --76.4 --76.4047 --76.4109 --76.4047 --76.3875 --76.4109 --76.3953 --76.3984 --76.4047 --76.3938 --76.3938 --76.4 --76.4031 --76.3953 --76.3797 --76.3953 --76.4016 --76.3984 --76.3938 --76.3922 --76.3859 --76.4094 --76.3922 --76.3828 --76.3859 --76.3891 --76.3906 --76.3891 --76.3859 --76.4 --76.3797 --76.3984 --76.4016 --76.4047 --76.3938 --76.3984 --76.3938 --76.3969 --76.3859 --76.3984 --76.3859 --76.4 --76.3891 --76.3969 --76.3922 --76.3969 --76.3984 --76.3859 --76.3953 --76.4047 --76.3891 --76.3922 --76.3891 --76.3938 --76.3922 --76.3969 --76.3875 --76.3953 --76.4078 --76.4016 --76.4062 --76.4 --76.3922 --76.3953 --76.3891 --76.3922 --76.3906 --76.3938 --76.3891 --76.3875 --76.3906 --76.4047 --76.3859 --76.3984 --76.3969 --76.3766 --76.3984 --76.3891 --76.4016 --76.4109 --76.3906 --76.3969 --76.3938 --76.3953 --76.3859 --76.4 --76.3938 --76.3922 --76.3906 --76.3984 --76.4062 --76.3969 --76.3922 --76.3875 --76.3906 --76.3875 --76.3844 --76.3938 --76.3938 --76.4047 --76.4 --76.3844 --76.3766 --76.3906 --76.3984 --76.3891 --76.3969 --76.3984 --76.3953 --76.3812 --76.3969 --76.4016 --76.3891 --76.4 --76.3984 --76.3969 --76.3906 --76.4047 --76.4 --76.4 --76.3969 --76.4 --76.3875 --76.4031 --76.4016 --76.4031 --76.3953 --76.3891 --76.3984 --76.3984 --76.4031 --76.4125 --76.4 --76.3953 --76.3984 --76.4031 --76.3938 --76.3922 --76.4109 --76.4094 --76.4156 --76.3906 --76.3953 --76.3891 --76.3984 --76.3875 --76.3953 --76.3922 --76.4094 --76.3984 --76.4141 --76.4062 --76.3953 --76.4 --76.4109 --76.3875 --76.3969 --76.3922 --76.4031 --76.3969 --76.3812 --76.3906 --76.3953 --76.3953 --76.3953 --76.4094 --76.4031 --76.4047 --76.4062 --76.3984 --76.3953 --76.3984 --76.3969 --76.4 --76.3984 --76.4 --76.4125 --76.4078 --76.3891 --76.3875 --76.4031 --76.4062 --76.3828 --76.3938 --76.3953 --76.3984 --76.4 --76.4109 --76.3984 --76.3938 --76.3844 --76.3922 --76.3922 --76.3828 --76.3797 --76.3844 --76.3844 --76.3766 --76.3906 --76.3938 --76.3906 --76.3969 --76.4062 --76.375 --76.3906 --76.3922 --76.3891 --76.3953 --76.3844 --76.3859 --76.3891 --76.375 --76.3875 --76.4 --76.3891 --76.4 --76.3953 --76.3891 --76.3875 --76.4031 --76.3844 --76.3938 --76.3922 --76.3891 --76.3953 --76.4 --76.3906 --76.3891 --76.3984 --76.3859 --76.3828 --76.3812 --76.3984 --76.3984 --76.3906 --76.3953 --76.3891 --76.3984 --76.3984 --76.3969 --76.3953 --76.3891 --76.3938 --76.3969 --76.4047 --76.3906 --76.3828 --76.4 --76.3953 --76.4047 --76.3969 --76.3953 --76.4 --76.3844 --76.4 --76.3922 --76.3859 --76.3844 --76.3859 --76.3859 --76.3922 --76.3844 --76.3938 --76.3875 --76.3922 --76.3734 --76.3812 --76.3859 --76.3797 --76.3906 --76.3969 --76.3734 --76.3828 --76.4031 --76.375 --76.375 --76.3641 --76.3844 --76.3828 --76.3859 --76.3938 --76.3812 --76.375 --76.3719 --76.3812 --76.3781 --76.3703 --76.3938 --76.3734 --76.3703 --76.3812 --76.3828 --76.3797 --76.3797 --76.3828 --76.3828 --76.375 --76.3781 --76.3781 --76.3875 --76.3594 --76.3781 --76.3781 --76.3578 --76.3578 --76.3766 --76.3656 --76.3875 --76.3766 --76.3859 --76.375 --76.3766 --76.3594 --76.3766 --76.375 --76.3781 --76.3672 --76.3797 --76.3766 --76.3688 --76.3641 --76.3906 --76.3766 --76.3719 --76.3812 --76.3688 --76.3859 --76.3906 --76.3906 --76.3844 --76.3828 --76.3844 --76.3766 --76.3781 --76.3781 --76.3812 --76.3844 --76.3828 --76.3766 --76.3938 --76.3828 --76.3875 --76.3938 --76.3922 --76.3828 --76.3828 --76.3797 --76.3891 --76.3953 --76.3875 --76.3734 --76.3906 --76.3766 --76.3812 --76.3859 --76.3859 --76.3797 --76.3719 --76.3844 --76.375 --76.3781 --76.3891 --76.3703 --76.3734 --76.375 --76.3875 --76.3797 --76.3781 --76.3688 --76.3781 --76.375 --76.3875 --76.3703 --76.3812 --76.3828 --76.3766 --76.3734 --76.3781 --76.3812 --76.3797 --76.3812 --76.3875 --76.3703 --76.3719 --76.375 --76.3828 --76.3719 --76.3656 --76.3484 --76.3516 --76.3625 --76.3891 --76.375 --76.3766 --76.3766 --76.3906 --76.3625 --76.3734 --76.375 --76.3766 --76.3812 --76.3797 --76.3812 --76.3812 --76.3703 --76.3781 --76.375 --76.3844 --76.3688 --76.3766 --76.3766 --76.3719 --76.3734 --76.375 --76.3719 --76.3656 --76.3781 --76.3719 --76.3688 --76.3719 --76.3797 --76.3781 --76.375 --76.375 --76.3719 --76.3688 --76.375 --76.3781 --76.3656 --76.3656 --76.3766 --76.3641 --76.3688 --76.3828 --76.3625 --76.3703 --76.3641 --76.3797 --76.3703 --76.3719 --76.3578 --76.3719 --76.3656 --76.3609 --76.3656 --76.3703 --76.3641 --76.3734 --76.3625 --76.375 --76.3641 --76.3703 --76.3656 --76.3688 --76.3703 --76.3625 --76.3625 --76.3703 --76.3703 --76.3703 --76.3719 --76.3641 --76.3609 --76.3672 --76.3688 --76.3672 --76.3625 --76.375 --76.3688 --76.3766 --76.3672 --76.3641 --76.3688 --76.3781 --76.3828 --76.3547 --76.3625 --76.3672 --76.3672 --76.3609 --76.375 --76.3469 --76.3719 --76.3656 --76.3609 --76.3672 --76.3719 --76.3641 --76.3656 --76.3641 --76.3484 --76.3594 --76.3594 --76.3672 --76.3594 --76.3516 --76.3656 --76.3578 --76.3656 --76.3641 --76.3734 --76.3672 --76.3641 --76.3625 --76.3703 --76.3625 --76.3625 --76.3594 --76.3625 --76.3688 --76.3703 --76.3688 --76.3594 --76.3641 --76.3688 --76.3531 --76.3672 --76.3469 --76.3594 --76.3516 --76.3656 --76.3578 --76.3766 --76.3672 --76.3578 --76.3656 --76.3578 --76.3641 --76.3594 --76.3594 --76.3688 --76.3672 --76.3547 --76.3547 --76.3719 --76.3641 --76.3703 --76.3641 --76.3641 --76.35 --76.3609 --76.3672 --76.3656 --76.3641 --76.3672 --76.3609 --76.3703 --76.3688 --76.3531 --76.3656 --76.3609 --76.3531 --76.3609 --76.3547 --76.3703 --76.3625 --76.3797 --76.3719 --76.3562 --76.3578 --76.3688 --76.3547 --76.3719 --76.3688 --76.3734 --76.3703 --76.3812 --76.3656 --76.3656 --76.3656 --76.375 --76.3641 --76.3562 --76.3547 --76.3578 --76.3688 --76.35 --76.3562 --76.3578 --76.3688 --76.3609 --76.3578 --76.3625 --76.3453 --76.3578 --76.3531 --76.3469 --76.3516 --76.3594 --76.3672 --76.35 --76.3594 --76.3641 --76.3453 --76.3562 --76.3594 --76.3578 --76.3625 --76.3594 --76.3594 --76.3547 --76.3641 --76.3688 --76.3594 --76.3688 --76.3578 --76.3656 --76.3625 --76.3594 --76.3484 --76.3562 --76.3641 --76.3531 --76.3594 --76.3734 --76.3578 --76.3688 --76.3578 --76.3609 --76.3672 --76.3484 --76.3609 --76.3625 --76.3641 --76.35 --76.3625 --76.3625 --76.3625 --76.35 --76.3703 --76.3656 --76.3594 --76.3594 --76.3688 --76.3625 --76.3516 --76.3641 --76.3719 --76.35 --76.3625 --76.3609 --76.3766 --76.3656 --76.3641 --76.3609 --76.3656 --76.3562 --76.3562 --76.3656 --76.3641 --76.3625 --76.3719 --76.3641 --76.3766 --76.3688 --76.3656 --76.3625 --76.3547 --76.3391 --76.3625 --76.3547 --76.3641 --76.3578 --76.35 --76.3422 --76.3547 --76.35 --76.3438 --76.3672 --76.3625 --76.3656 --76.3688 --76.3547 --76.3531 --76.3484 --76.3562 --76.3578 --76.3562 --76.3531 --76.3484 --76.3625 --76.35 --76.3531 --76.3641 --76.3438 --76.3453 --76.3422 --76.3484 --76.3531 --76.3438 --76.3484 --76.35 --76.3672 --76.3562 --76.3578 --76.3562 --76.3562 --76.3641 --76.3516 --76.3547 --76.3625 --76.3469 --76.3531 --76.3625 --76.35 --76.3641 --76.3531 --76.3688 --76.3531 --76.3703 --76.3688 --76.3672 --76.3828 --76.3469 --76.3578 --76.3672 --76.3609 --76.3547 --76.3594 --76.3531 --76.35 --76.3516 --76.3422 --76.3594 --76.3531 --76.3547 --76.3484 --76.3406 --76.3422 --76.3578 --76.3469 --76.3516 --76.3453 --76.3453 --76.3594 --76.3422 --76.3375 --76.3391 --76.3453 --76.3453 --76.35 --76.3438 --76.3406 --76.3484 --76.3469 --76.3359 --76.3422 --76.3516 --76.3562 --76.3547 --76.3391 --76.3516 --76.3453 --76.3453 --76.3594 --76.3594 --76.3578 --76.3344 --76.3562 --76.3531 --76.3547 --76.3594 --76.35 --76.3547 --76.3438 --76.3562 --76.35 --76.3406 --76.3375 --76.3594 --76.3484 --76.3531 --76.3406 --76.35 --76.3453 --76.3578 --76.3438 --76.3422 --76.3453 --76.3375 --76.3422 --76.3422 --76.3422 --76.3516 --76.35 --76.3422 --76.3516 --76.3422 --76.3297 --76.3375 --76.3453 --76.3453 --76.3422 --76.3453 --76.3484 --76.3422 --76.3484 --76.35 --76.3469 --76.3469 --76.35 --76.3438 --76.35 --76.3531 --76.3531 --76.3469 --76.3516 --76.3469 --76.3562 --76.3438 --76.3484 --76.3531 --76.3578 --76.3516 --76.3562 --76.3328 --76.3453 --76.3594 --76.3562 --76.3469 --76.35 --76.3484 --76.3531 --76.35 --76.3484 --76.3453 --76.3469 --76.3578 --76.3438 --76.3359 --76.3375 --76.3438 --76.3562 --76.3625 --76.3438 --76.3391 --76.3375 --76.35 --76.3438 --76.3531 --76.3391 --76.3375 --76.3266 --76.35 --76.3406 --76.35 --76.3328 --76.3344 --76.3375 --76.3359 --76.3391 --76.3344 --76.3453 --76.3422 --76.3406 --76.35 --76.3359 --76.3344 --76.3391 --76.3422 --76.3391 --76.35 --76.35 --76.3422 --76.3297 --76.3266 --76.3391 --76.3453 --76.3484 --76.3406 --76.3406 --76.325 --76.3484 --76.3375 --76.3344 --76.3391 --76.3484 --76.3297 --76.3328 --76.3391 --76.3391 --76.3391 --76.3469 --76.3375 --76.3297 --76.3313 --76.3359 --76.3187 --76.3313 --76.3406 --76.3297 --76.3141 --76.3234 --76.3406 --76.3219 --76.3313 --76.3344 --76.3328 --76.3219 --76.3281 --76.3281 --76.3203 --76.3297 --76.3281 --76.3281 --76.3266 --76.3219 --76.3313 --76.3203 --76.3156 --76.3219 --76.3094 --76.3281 --76.325 --76.3203 --76.3344 --76.3328 --76.325 --76.3281 --76.3297 --76.3281 --76.3297 --76.3219 --76.3172 --76.3172 --76.3203 --76.3125 --76.3203 --76.3156 --76.3219 --76.3313 --76.3187 --76.3172 --76.3187 --76.3203 --76.3328 --76.3438 --76.3234 --76.3297 --76.3266 --76.3156 --76.3219 --76.3172 --76.3297 --76.3219 --76.3125 --76.3313 --76.3172 --76.3187 --76.325 --76.3125 --76.3203 --76.3125 --76.3281 --76.3469 --76.3328 --76.325 --76.3219 --76.3219 --76.3141 --76.3359 --76.3203 --76.3203 --76.3203 --76.3219 --76.3234 --76.325 --76.3344 --76.3281 --76.3344 --76.3328 --76.3344 --76.3328 --76.3203 --76.3313 --76.3422 --76.3297 --76.3391 --76.3438 --76.3406 --76.3469 --76.3375 --76.3344 --76.3328 --76.3344 --76.3453 --76.3266 --76.3328 --76.3234 --76.3469 --76.3469 --76.3438 --76.3344 --76.3344 --76.3359 --76.3344 --76.3281 --76.3297 --76.3203 --76.3344 --76.325 --76.3281 --76.3391 --76.3438 --76.3234 --76.3313 --76.3297 --76.3344 --76.3375 --76.3281 --76.325 --76.3203 --76.3328 --76.3359 --76.3328 --76.3406 --76.325 --76.3297 --76.3344 --76.3297 --76.3359 --76.3281 --76.3422 --76.325 --76.3328 --76.3391 --76.3531 --76.3359 --76.3297 --76.3344 --76.3391 --76.3391 --76.3234 --76.3219 --76.3297 --76.3219 --76.3297 --76.3219 --76.3281 --76.3281 --76.3078 --76.3203 --76.3344 --76.3266 --76.3078 --76.3203 --76.3203 --76.3172 --76.3187 --76.3094 --76.3078 --76.3219 --76.3203 --76.3109 --76.3266 --76.3266 --76.3297 --76.3219 --76.3141 --76.3281 --76.3234 --76.3094 --76.325 --76.3172 --76.3281 --76.325 --76.3344 --76.3344 --76.3344 --76.3266 --76.3297 --76.3297 --76.3234 --76.3156 --76.3172 --76.3187 --76.3187 --76.325 --76.325 --76.3422 --76.3109 --76.3187 --76.3125 --76.3141 --76.3078 --76.3141 --76.3219 --76.3172 --76.3063 --76.3219 --76.3094 --76.3141 --76.3187 --76.3172 --76.3125 --76.3203 --76.3187 --76.3297 --76.3156 --76.325 --76.3266 --76.3172 --76.3031 --76.3281 --76.3266 --76.3234 --76.3078 --76.3094 --76.3172 --76.3094 --76.3078 --76.3187 --76.3281 --76.3109 --76.3 --76.3172 --76.3063 --76.3125 --76.3266 --76.3156 --76.3094 --76.3109 --76.3187 --76.3047 --76.3187 --76.3109 --76.3063 --76.3047 --76.3078 --76.3156 --76.3031 --76.3125 --76.3141 --76.3047 --76.3 --76.3172 --76.3094 --76.3078 --76.3156 --76.3125 --76.3172 --76.3172 --76.3078 --76.3141 --76.3141 --76.3141 --76.3172 --76.3031 --76.3187 --76.325 --76.3063 --76.3063 --76.3 --76.3047 --76.3281 --76.3078 --76.3016 --76.3203 --76.3078 --76.3031 --76.3016 --76.3031 --76.3141 --76.3016 --76.3063 --76.3 --76.3125 --76.2953 --76.2984 --76.3047 --76.3 --76.2969 --76.3156 --76.2953 --76.3141 --76.3063 --76.3031 --76.3187 --76.3094 --76.2969 --76.2969 --76.3094 --76.3047 --76.3 --76.3172 --76.2984 --76.3 --76.3016 --76.3047 --76.3 --76.3047 --76.3016 --76.2953 --76.3 --76.3047 --76.3109 --76.3047 --76.3125 --76.3172 --76.3172 --76.2984 --76.3 --76.3109 --76.3094 --76.3156 --76.2953 --76.2953 --76.2906 --76.3031 --76.2953 --76.2984 --76.2922 --76.3141 --76.3 --76.3047 --76.2984 --76.2891 --76.2969 --76.3078 --76.3125 --76.3047 --76.2859 --76.3141 --76.2953 --76.3078 --76.3172 --76.3094 --76.3156 --76.2984 --76.3078 --76.3109 --76.3 --76.3047 --76.2937 --76.2969 --76.3 --76.3078 --76.3109 --76.3016 --76.3 --76.3016 --76.2969 --76.2859 --76.2969 --76.2937 --76.2922 --76.2969 --76.2969 --76.2984 --76.3016 --76.3172 --76.2969 --76.3016 --76.3047 --76.2766 --76.2859 --76.3016 --76.2891 --76.3 --76.2828 --76.2844 --76.2937 --76.2922 --76.2937 --76.2906 --76.2969 --76.2922 --76.2891 --76.2859 --76.3063 --76.2891 --76.275 --76.2953 --76.3031 --76.2859 --76.2969 --76.2891 --76.2969 --76.2969 --76.2937 --76.2906 --76.3 --76.3 --76.3 --76.2859 --76.2875 --76.2937 --76.2969 --76.2828 --76.2953 --76.2844 --76.2891 --76.2984 --76.2937 --76.3109 --76.2953 --76.2984 --76.2937 --76.3031 --76.2922 --76.3063 --76.3016 --76.3016 --76.2969 --76.3109 --76.2953 --76.3016 --76.2969 --76.3 --76.2797 --76.3047 --76.3078 --76.2953 --76.2953 --76.2969 --76.3078 --76.3109 --76.2984 --76.3125 --76.2984 --76.3047 --76.2875 --76.2984 --76.3031 --76.2891 --76.2984 --76.2922 --76.2906 --76.2906 --76.2812 --76.2953 --76.3031 --76.2984 --76.2906 --76.2937 --76.2953 --76.2969 --76.2781 --76.2875 --76.2875 --76.2937 --76.2953 --76.2797 --76.2828 --76.2875 --76.2859 --76.2859 --76.2828 --76.2875 --76.2766 --76.2953 --76.2875 --76.2922 --76.2891 --76.2812 --76.2766 --76.2859 --76.2953 --76.2766 --76.2937 --76.2891 --76.2828 --76.3 --76.2906 --76.2937 --76.2656 --76.2969 --76.2969 --76.2844 --76.3063 --76.2844 --76.2812 --76.2797 --76.2812 --76.2906 --76.2688 --76.2766 --76.2844 --76.2844 --76.2906 --76.2797 --76.2797 --76.2656 --76.2766 --76.2828 --76.2859 --76.2875 --76.2734 --76.2688 --76.2812 --76.2641 --76.2719 --76.2672 --76.2766 --76.2797 --76.2766 --76.2922 --76.275 --76.2906 --76.2797 --76.2797 --76.2625 --76.2875 --76.2891 --76.2953 --76.2891 --76.2859 --76.2797 --76.2953 --76.2922 --76.2797 --76.2953 --76.275 --76.2969 --76.2844 --76.2812 --76.2906 --76.2891 --76.2844 --76.2875 --76.2937 --76.2859 --76.2781 --76.2984 --76.2984 --76.2797 --76.2781 --76.2828 --76.275 --76.2891 --76.2703 --76.2734 --76.2859 --76.3 --76.2937 --76.3 --76.3016 --76.2844 --76.2812 --76.2984 --76.2953 --76.275 --76.2953 --76.2859 --76.2781 --76.2781 --76.2906 --76.2812 --76.2781 --76.2859 --76.2828 --76.2797 --76.2672 --76.2859 --76.2672 --76.275 --76.2766 --76.2891 --76.2906 --76.2812 --76.2891 --76.2812 --76.2844 --76.275 --76.2734 --76.2703 --76.2875 --76.2781 --76.2797 --76.2859 --76.2844 --76.2766 --76.2859 --76.2891 --76.2875 --76.2875 --76.2766 --76.2875 --76.2891 --76.2812 --76.2688 --76.2891 --76.2906 --76.2937 --76.2797 --76.2703 --76.2734 --76.2844 --76.2781 --76.275 --76.2625 --76.2703 --76.2844 --76.2656 --76.2828 --76.2859 --76.2891 --76.2734 --76.2891 --76.2844 --76.275 --76.2656 --76.2781 --76.2844 --76.2812 --76.2734 --76.2719 --76.2781 --76.2578 --76.2625 --76.2625 --76.2703 --76.2609 --76.2688 --76.2734 --76.2625 --76.2641 --76.2766 --76.2859 --76.2594 --76.2547 --76.2641 --76.2703 --76.2641 --76.2828 --76.2719 --76.2625 --76.2672 --76.275 --76.2703 --76.2719 --76.2688 --76.2703 --76.2609 --76.2656 --76.2719 --76.2703 --76.275 --76.2672 --76.2688 --76.2672 --76.2688 --76.2625 --76.2734 --76.275 --76.2656 --76.2734 --76.2688 --76.2609 --76.2688 --76.2719 --76.2734 --76.2719 --76.2625 --76.2688 --76.2719 --76.2656 --76.2672 --76.2672 --76.275 --76.2562 --76.275 --76.2656 --76.2672 --76.2641 --76.2703 --76.2734 --76.275 --76.2641 --76.275 --76.2547 --76.2703 --76.2578 --76.2516 --76.2641 --76.2672 --76.2656 --76.2688 --76.2641 --76.2594 --76.2672 --76.275 --76.2516 --76.2609 --76.2672 --76.2703 --76.2656 --76.2594 --76.2547 --76.2594 --76.2562 --76.2688 --76.2594 --76.2719 --76.2641 --76.2719 --76.2781 --76.2562 --76.2594 --76.2625 --76.2688 --76.2641 --76.2812 --76.2781 --76.2781 --76.2781 --76.2766 --76.2734 --76.2656 --76.2672 --76.2703 --76.2828 --76.2719 --76.2766 --76.275 --76.2719 --76.2656 --76.2703 --76.2766 --76.275 --76.2828 --76.2766 --76.2875 --76.275 --76.2828 --76.2719 --76.2578 --76.2781 --76.2766 --76.2781 --76.2688 --76.2672 --76.2594 --76.2734 --76.2672 --76.2719 --76.2781 --76.2641 --76.275 --76.2688 --76.2672 --76.2766 --76.2844 --76.2875 --76.2766 --76.2719 --76.2734 --76.2641 --76.2672 --76.2641 --76.2875 --76.2875 --76.2828 --76.2719 --76.2812 --76.275 --76.2844 --76.2797 --76.2766 --76.2719 --76.2922 --76.2828 --76.2672 --76.2844 --76.2766 --76.2797 --76.2766 --76.2781 --76.2797 --76.2672 --76.2688 --76.2609 --76.2625 --76.2781 --76.2609 --76.2734 --76.2656 --76.2703 --76.2656 --76.2641 --76.2703 --76.2641 --76.2688 --76.2578 --76.2547 --76.2656 --76.2688 --76.2625 --76.2625 --76.2594 --76.2641 --76.2688 --76.2641 --76.2578 --76.2594 --76.2641 --76.2656 --76.2672 --76.2641 --76.2578 --76.2641 --76.2672 --76.2812 --76.2641 --76.2516 --76.2703 --76.25 --76.275 --76.2641 --76.2609 --76.2641 --76.2641 --76.2719 --76.2672 --76.2562 --76.2594 --76.2688 --76.2672 --76.2641 --76.2625 --76.275 --76.2688 --76.2484 --76.2688 --76.2609 --76.2656 --76.2719 --76.2719 --76.2641 --76.2703 --76.2656 --76.2641 --76.2625 --76.2703 --76.2719 --76.2703 --76.2703 --76.2609 --76.275 --76.2625 --76.2703 --76.2641 --76.2719 --76.2703 --76.2656 --76.2625 --76.2719 --76.2734 --76.2703 --76.275 --76.2703 --76.2688 --76.2781 --76.2781 --76.2641 --76.2703 --76.2812 --76.2781 --76.2688 --76.2688 --76.275 --76.2734 --76.275 --76.2812 --76.2781 --76.2844 --76.2625 --76.2734 --76.2719 --76.2656 --76.2641 --76.2797 --76.2812 --76.2719 --76.2672 --76.2797 --76.2812 --76.2828 --76.2781 --76.2672 --76.2656 --76.2734 --76.2641 --76.2703 --76.2703 --76.2734 --76.2578 --76.2734 --76.2484 --76.2703 --76.2688 --76.2703 --76.2734 --76.2719 --76.2688 --76.2656 --76.2703 --76.2562 --76.2703 --76.2828 --76.2609 --76.2531 --76.2609 --76.2703 --76.2719 --76.2766 --76.2484 --76.2594 --76.275 --76.2766 --76.2688 --76.2438 --76.2594 --76.2734 --76.2641 --76.2641 --76.2594 --76.2641 --76.2641 --76.2656 --76.2734 --76.2609 --76.2672 --76.2688 --76.2734 --76.2625 --76.2734 --76.2656 --76.2656 --76.2734 --76.2719 --76.2734 --76.2703 --76.2797 --76.2734 --76.2609 --76.2594 --76.2703 --76.2656 --76.2578 --76.2703 --76.2734 --76.2562 --76.2781 --76.2594 --76.2688 --76.2656 --76.2609 --76.2594 --76.2703 --76.2766 --76.2562 --76.2719 --76.2547 --76.2547 --76.2578 --76.2688 --76.2641 --76.2578 --76.2641 --76.2672 --76.2688 --76.2547 --76.2578 --76.2328 --76.2422 --76.2594 --76.2594 --76.2547 --76.25 --76.2641 --76.2625 --76.2719 --76.2719 --76.2594 --76.2641 --76.2562 --76.2625 --76.2641 --76.2547 --76.2609 --76.2562 --76.2547 --76.2562 --76.2531 --76.2469 --76.2688 --76.2516 --76.2578 --76.2625 --76.2516 --76.2625 --76.2531 --76.2578 --76.2641 --76.2688 --76.2672 --76.2625 --76.2719 --76.2672 --76.2688 --76.25 --76.2562 --76.2688 --76.2641 --76.2625 --76.2734 --76.2594 --76.2688 --76.2531 --76.2562 --76.2656 --76.2688 --76.2531 --76.2656 --76.2562 --76.2672 --76.2766 --76.2531 --76.2562 --76.2562 --76.2672 --76.2562 --76.2766 --76.2688 --76.2516 --76.275 --76.2594 --76.2578 --76.2516 --76.2641 --76.2625 --76.2453 --76.2609 --76.2578 --76.2562 --76.2531 --76.2609 --76.2531 --76.25 --76.2531 --76.2531 --76.2547 --76.2688 --76.2516 --76.2578 --76.2578 --76.2594 --76.2594 --76.2344 --76.25 --76.2625 --76.2453 --76.2469 --76.2734 --76.2531 --76.2547 --76.2531 --76.2531 --76.2641 --76.2578 --76.25 --76.2547 --76.2641 --76.2609 --76.2484 --76.2641 --76.25 --76.2406 --76.2516 --76.2312 --76.2438 --76.2484 --76.2516 --76.2547 --76.2594 --76.2531 --76.2609 --76.2531 --76.2578 --76.2453 --76.2547 --76.2484 --76.2578 --76.2406 --76.2469 --76.25 --76.2469 --76.2422 --76.2531 --76.2625 --76.2422 --76.2516 --76.2359 --76.2547 --76.25 --76.2594 --76.2547 --76.2547 --76.2578 --76.2516 --76.25 --76.2531 --76.2516 --76.2438 --76.2578 --76.2453 --76.2438 --76.2531 --76.2562 --76.2438 --76.2484 --76.2422 --76.2609 --76.2422 --76.25 --76.2469 --76.2391 --76.2516 --76.2609 --76.2469 --76.2391 --76.2609 --76.2297 --76.2453 --76.25 --76.2438 --76.2516 --76.2672 --76.2625 --76.2469 --76.2469 --76.2484 --76.25 --76.2656 --76.2547 --76.2516 --76.2562 --76.2594 --76.2484 --76.2484 --76.2422 --76.2562 --76.2531 --76.2422 --76.2594 --76.2594 --76.2406 --76.2484 --76.2641 --76.2453 --76.2344 --76.2594 --76.25 --76.2469 --76.2438 --76.2516 --76.2375 --76.2594 --76.2438 --76.2438 --76.2625 --76.2562 --76.25 --76.2547 --76.2562 --76.2359 --76.25 --76.2422 --76.2453 --76.2344 --76.2375 --76.2375 --76.2453 --76.2422 --76.2344 --76.2375 --76.2375 --76.2344 --76.2469 --76.2312 --76.2391 --76.2375 --76.2281 --76.2344 --76.2359 --76.2406 --76.2375 --76.2359 --76.2469 --76.2375 --76.2422 --76.2422 --76.2531 --76.2391 --76.2328 --76.2375 --76.2422 --76.2375 --76.2438 --76.2297 --76.2438 --76.2406 --76.2391 --76.2375 --76.2469 --76.2359 --76.2219 --76.2422 --76.2422 --76.2422 --76.2312 --76.2172 --76.2453 --76.2406 --76.25 --76.2422 --76.2359 --76.2391 --76.2359 --76.2438 --76.2281 --76.225 --76.2344 --76.2375 --76.2344 --76.2281 --76.2344 --76.2484 --76.25 --76.2375 --76.2406 --76.2344 --76.2312 --76.2406 --76.225 --76.2375 --76.2328 --76.2203 --76.2422 --76.2328 --76.2172 --76.2391 --76.2391 --76.2281 --76.2328 --76.2281 --76.2312 --76.2406 --76.2422 --76.2422 --76.2484 --76.2281 --76.2562 --76.2438 --76.2328 --76.2531 --76.2375 --76.2203 --76.2516 --76.2406 --76.2391 --76.2297 --76.2391 --76.2438 --76.2484 --76.2375 --76.2453 --76.2375 --76.2344 --76.2359 --76.2438 --76.2328 --76.2422 --76.2438 --76.2438 --76.2391 --76.2469 --76.2547 --76.2453 --76.2375 --76.2359 --76.2438 --76.2328 --76.2453 --76.2391 --76.2422 --76.2406 --76.2375 --76.2359 --76.2531 --76.2469 --76.2484 --76.2609 --76.2469 --76.2469 --76.2484 --76.2438 --76.2484 --76.2609 --76.2234 --76.2375 --76.2266 --76.2438 --76.2438 --76.2562 --76.2406 --76.2344 --76.2453 --76.2406 --76.2422 --76.2469 --76.2391 --76.2562 --76.2438 --76.2391 --76.2359 --76.2438 --76.2375 --76.2453 --76.2344 --76.2359 --76.2344 --76.2406 --76.2281 --76.2125 --76.25 --76.2438 --76.2406 --76.2406 --76.2391 --76.2375 --76.2297 --76.2359 --76.2359 --76.2516 --76.25 --76.2359 --76.2406 --76.2438 --76.2422 --76.25 --76.2344 --76.2391 --76.2281 --76.2359 --76.2391 --76.2234 --76.2266 --76.2266 --76.2344 --76.2234 --76.2406 --76.225 --76.225 --76.2312 --76.2312 --76.2359 --76.2281 --76.2375 --76.2188 --76.2438 --76.2344 --76.2375 --76.2312 --76.2344 --76.2172 --76.2406 --76.2422 --76.2422 --76.225 --76.2359 --76.2375 --76.2344 --76.2484 --76.2234 --76.2391 --76.2297 --76.2328 --76.2375 --76.2328 --76.2469 --76.2281 --76.2484 --76.2422 --76.2344 --76.2422 --76.2312 --76.2422 --76.2391 --76.2484 --76.2391 --76.2484 --76.25 --76.2312 --76.2516 --76.2484 --76.2391 --76.2422 --76.2375 --76.2562 --76.2453 --76.2484 --76.2438 --76.2406 --76.2438 --76.2422 --76.2453 --76.2359 --76.25 --76.2391 --76.2359 --76.2359 --76.2234 --76.25 --76.2391 --76.2438 --76.2438 --76.2453 --76.2531 --76.2422 --76.2406 --76.2469 --76.2312 --76.2438 --76.2438 --76.2422 --76.2484 --76.2438 --76.2422 --76.2281 --76.2391 --76.2375 --76.2453 --76.2281 --76.2344 --76.2281 --76.2391 --76.2359 --76.2281 --76.2234 --76.2375 --76.2328 --76.2312 --76.2344 --76.2375 --76.2234 --76.2375 --76.2312 --76.2438 --76.2234 --76.2219 --76.2125 --76.225 --76.2281 --76.2312 --76.2375 --76.225 --76.2344 --76.2125 --76.2375 --76.2359 --76.225 --76.2391 --76.2391 --76.2266 --76.2359 --76.2266 --76.2406 --76.2344 --76.2219 --76.2234 --76.2391 --76.2344 --76.225 --76.2219 --76.2375 --76.225 --76.2297 --76.2297 --76.2312 --76.225 --76.2203 --76.2422 --76.2125 --76.2188 --76.2203 --76.2172 --76.225 --76.2234 --76.2219 --76.2266 --76.2312 --76.2281 --76.2281 --76.2297 --76.2234 --76.2359 --76.2188 --76.2297 --76.2344 --76.2234 --76.2125 --76.2391 --76.2203 --76.2188 --76.2172 --76.2266 --76.2219 --76.2406 --76.2266 --76.2203 --76.2391 --76.2219 --76.2328 --76.2188 --76.2359 --76.2328 --76.2266 --76.2234 --76.2281 --76.2266 --76.2188 --76.2266 --76.2234 --76.2188 --76.2219 --76.2328 --76.2422 --76.2234 --76.2312 --76.2266 --76.2234 --76.2156 --76.2359 --76.2281 --76.2297 --76.2266 --76.2203 --76.2328 --76.2141 --76.2188 --76.225 --76.2219 --76.2234 --76.2312 --76.2141 --76.2297 --76.2328 --76.2172 --76.2109 --76.225 --76.2125 --76.2156 --76.2234 --76.2094 --76.2109 --76.2297 --76.2281 --76.2125 --76.2188 --76.2172 --76.2219 --76.225 --76.2297 --76.2312 --76.2266 --76.225 --76.2297 --76.2219 --76.2328 --76.2328 --76.2266 --76.2188 --76.2219 --76.2266 --76.2219 --76.2312 --76.2328 --76.2188 --76.2281 --76.225 --76.2297 --76.2203 --76.2219 --76.225 --76.2172 --76.2266 --76.2297 --76.2312 --76.2312 --76.2156 --76.2422 --76.2375 --76.2219 --76.2234 --76.2188 --76.2297 --76.2219 --76.2312 --76.2406 --76.2344 --76.2219 --76.2266 --76.2203 --76.2406 --76.2297 --76.2156 --76.2375 --76.225 --76.2328 --76.2312 --76.2203 --76.2094 --76.2375 --76.2172 --76.2156 --76.2109 --76.2188 --76.2328 --76.2203 --76.2203 --76.2203 --76.2281 --76.2234 --76.2312 --76.2281 --76.2234 --76.2281 --76.2297 --76.2375 --76.2203 --76.2203 --76.2219 --76.2109 --76.225 --76.2188 --76.2297 --76.2141 --76.2141 --76.2203 --76.2094 --76.2078 --76.2234 --76.2063 --76.2141 --76.2109 --76.2094 --76.2125 --76.2109 --76.2203 --76.2125 --76.225 --76.2141 --76.2172 --76.225 --76.2234 --76.2156 --76.2172 --76.2172 --76.2203 --76.2031 --76.2188 --76.2219 --76.2281 --76.2281 --76.2094 --76.2172 --76.2266 --76.2141 --76.2063 --76.2281 --76.225 --76.2125 --76.2094 --76.2094 --76.2266 --76.2156 --76.2094 --76.2328 --76.2203 --76.2203 --76.2234 --76.2078 --76.2172 --76.2234 --76.2094 --76.2172 --76.2063 --76.2078 --76.2234 --76.2203 --76.2234 --76.2219 --76.2188 --76.2234 --76.2219 --76.2281 --76.2266 --76.2234 --76.2234 --76.2266 --76.225 --76.2297 --76.2156 --76.2156 --76.225 --76.2109 --76.2297 --76.2203 --76.2312 --76.2141 --76.2141 --76.2219 --76.2125 --76.2078 --76.2297 --76.2141 --76.225 --76.2234 --76.2219 --76.2156 --76.2063 --76.2094 --76.2141 --76.2219 --76.1984 --76.2016 --76.2141 --76.2172 --76.2219 --76.2094 --76.2109 --76.2203 --76.2141 --76.2219 --76.2188 --76.2156 --76.2203 --76.2203 --76.2172 --76.2109 --76.2188 --76.2234 --76.2219 --76.2063 --76.2 --76.2063 --76.2078 --76.2266 --76.2125 --76.2281 --76.2109 --76.225 --76.2172 --76.2141 --76.225 --76.2109 --76.2109 --76.2141 --76.2031 --76.2203 --76.2141 --76.2063 --76.2094 --76.2047 --76.2156 --76.1891 --76.2078 --76.2188 --76.2031 --76.2203 --76.1969 --76.2047 --76.2094 --76.2031 --76.2016 --76.1984 --76.2047 --76.2094 --76.2156 --76.2016 --76.2094 --76.2141 --76.2047 --76.2078 --76.2109 --76.2156 --76.1984 --76.2109 --76.2188 --76.2031 --76.2188 --76.2078 --76.2094 --76.2031 --76.2094 --76.2094 --76.2094 --76.225 --76.2344 --76.2063 --76.2156 --76.2156 --76.2094 --76.2078 --76.2094 --76.2203 --76.2141 --76.2094 --76.2063 --76.2125 --76.2141 --76.2344 --76.1969 --76.2125 --76.1984 --76.2078 --76.1984 --76.1953 --76.2063 --76.2141 --76.2016 --76.2063 --76.2109 --76.2063 --76.2094 --76.2031 --76.2125 --76.1875 --76.2141 --76.2141 --76.2109 --76.2016 --76.2016 --76.2141 --76.2172 --76.2094 --76.2125 --76.2031 --76.2094 --76.2109 --76.2156 --76.2094 --76.2016 --76.2125 --76.2031 --76.1984 --76.2047 --76.2141 --76.2094 --76.2109 --76.2188 --76.2 --76.2094 --76.2156 --76.2141 --76.2078 --76.2031 --76.2031 --76.2156 --76.2156 --76.2109 --76.2141 --76.2016 --76.2156 --76.2078 --76.2078 --76.2 --76.2172 --76.2156 --76.1937 --76.2031 --76.2203 --76.2141 --76.1969 --76.2047 --76.2078 --76.2203 --76.2063 --76.2031 --76.2109 --76.2047 --76.2047 --76.2188 --76.2172 --76.2094 --76.2047 --76.2016 --76.2047 --76.2156 --76.2094 --76.2141 --76.2141 --76.2188 --76.225 --76.2156 --76.2203 --76.2 --76.2281 --76.2188 --76.2266 --76.2203 --76.2016 --76.2063 --76.2109 --76.2188 --76.2141 --76.2047 --76.2047 --76.1984 --76.2156 --76.2047 --76.2094 --76.2063 --76.1922 --76.2063 --76.1922 --76.1984 --76.2172 --76.1953 --76.2 --76.1984 --76.2156 --76.2047 --76.2094 --76.2094 --76.2 --76.1922 --76.2172 --76.2094 --76.2219 --76.2125 --76.2063 --76.2031 --76.2094 --76.2078 --76.2078 --76.2188 --76.1984 --76.2078 --76.2141 --76.2047 --76.2 --76.2109 --76.2 --76.2125 --76.2031 --76.2125 --76.2094 --76.1984 --76.2063 --76.2094 --76.1969 --76.2016 --76.2188 --76.2109 --76.2078 --76.2063 --76.2156 --76.1937 --76.2047 --76.1969 --76.2109 --76.2156 --76.2016 --76.1953 --76.2047 --76.2203 --76.2141 --76.2078 --76.2047 --76.2109 --76.1984 --76.2078 --76.2188 --76.2188 --76.2328 --76.2047 --76.2203 --76.2125 --76.2047 --76.2219 --76.2234 --76.2016 --76.2141 --76.2031 --76.2109 --76.2047 --76.2031 --76.2125 --76.2172 --76.1937 --76.2125 --76.2172 --76.2172 --76.2047 --76.2031 --76.2063 --76.2109 --76.2016 --76.2047 --76.1937 --76.1969 --76.2016 --76.2063 --76.1922 --76.1969 --76.2109 --76.2109 --76.2 --76.1922 --76.2063 --76.1984 --76.2047 --76.2109 --76.2063 --76.225 --76.1922 --76.2141 --76.2141 --76.2156 --76.1953 --76.2031 --76.2125 --76.2078 --76.2016 --76.2219 --76.2156 --76.2078 --76.2078 --76.2063 --76.2094 --76.1922 --76.2016 --76.1969 --76.2063 --76.2109 --76.2141 --76.2 --76.2109 --76.1828 --76.2047 --76.2031 --76.2031 --76.2156 --76.1969 --76.2141 --76.2047 --76.2172 --76.2047 --76.2063 --76.2031 --76.2141 --76.1984 --76.2063 --76.2016 --76.1953 --76.1891 --76.1984 --76.1953 --76.1969 --76.2109 --76.2094 --76.1937 --76.2031 --76.2109 --76.2125 --76.2219 --76.2219 --76.2047 --76.2078 --76.2063 --76.2 --76.2047 --76.2031 --76.2047 --76.1969 --76.2141 --76.2063 --76.1875 --76.1906 --76.2078 --76.1781 --76.1891 --76.1922 --76.1953 --76.1859 --76.1875 --76.1906 --76.2 --76.2125 --76.1969 --76.1922 --76.2109 --76.2109 --76.1984 --76.2 --76.2063 --76.2031 --76.2 --76.2172 --76.2 --76.2078 --76.2109 --76.1969 --76.1922 --76.1937 --76.1922 --76.1906 --76.1906 --76.1984 --76.2031 --76.1891 --76.2094 --76.1859 --76.1922 --76.1922 --76.1953 --76.2016 --76.2 --76.1859 --76.2016 --76.1953 --76.1937 --76.1922 --76.1891 --76.1859 --76.1922 --76.2016 --76.2094 --76.1969 --76.2078 --76.1891 --76.2063 --76.1937 --76.2047 --76.2031 --76.1984 --76.1984 --76.1984 --76.1969 --76.2094 --76.1969 --76.1969 --76.2172 --76.1922 --76.2031 --76.2063 --76.2078 --76.1969 --76.2156 --76.2016 --76.1906 --76.2 --76.1969 --76.2 --76.1953 --76.2016 --76.1922 --76.2016 --76.1937 --76.1875 --76.1875 --76.1953 --76.1906 --76.1953 --76.1969 --76.1969 --76.1969 --76.2016 --76.1969 --76.2078 --76.1984 --76.1922 --76.1937 --76.1969 --76.2047 --76.1906 --76.1906 --76.1937 --76.2016 --76.2031 --76.1984 --76.1984 --76.1906 --76.1984 --76.1953 --76.1984 --76.1937 --76.1891 --76.1953 --76.1953 --76.2078 --76.1906 --76.2016 --76.1922 --76.2172 --76.1922 --76.1969 --76.1984 --76.2063 --76.1953 --76.1984 --76.2063 --76.2016 --76.1937 --76.1906 --76.1953 --76.1937 --76.2047 --76.1906 --76.2016 --76.2109 --76.1953 --76.1969 --76.2016 --76.2016 --76.1969 --76.1906 --76.2047 --76.1969 --76.2109 --76.2141 --76.1922 --76.2047 --76.2016 --76.2078 --76.1953 --76.2047 --76.2109 --76.1984 --76.1937 --76.2031 --76.1891 --76.2031 --76.2078 --76.2031 --76.2047 --76.2156 --76.1953 --76.2078 --76.1953 --76.2 --76.2094 --76.2016 --76.2063 --76.1953 --76.2094 --76.2047 --76.1969 --76.1953 --76.2063 --76.1984 --76.1984 --76.1906 --76.1891 --76.1922 --76.1875 --76.1937 --76.1875 --76.1844 --76.2047 --76.1922 --76.1859 --76.1906 --76.1906 --76.1766 --76.1922 --76.1844 --76.175 --76.1875 --76.2 --76.1937 --76.1844 --76.1953 --76.175 --76.2031 --76.2031 --76.1984 --76.1891 --76.2016 --76.2016 --76.1953 --76.2016 --76.1937 --76.1891 --76.1859 --76.1906 --76.1937 --76.2 --76.1922 --76.1953 --76.1891 --76.1891 --76.1766 --76.1875 --76.2 --76.1797 --76.1875 --76.1875 --76.1906 --76.1859 --76.1797 --76.1844 --76.1891 --76.2031 --76.1953 --76.1953 --76.1859 --76.2031 --76.1875 --76.1922 --76.1984 --76.1937 --76.2016 --76.1922 --76.1859 --76.1969 --76.1953 --76.1953 --76.2063 --76.2094 --76.2141 --76.2094 --76.1922 --76.1984 --76.1969 --76.2063 --76.1969 --76.1891 --76.1984 --76.1953 --76.1906 --76.1937 --76.1875 --76.1922 --76.1922 --76.1937 --76.2 --76.1797 --76.1937 --76.2 --76.1906 --76.2 --76.1875 --76.1906 --76.1984 --76.2 --76.2031 --76.1844 --76.2 --76.1828 --76.1953 --76.2094 --76.1969 --76.2078 --76.1953 --76.1984 --76.2141 --76.2047 --76.1969 --76.1937 --76.2125 --76.2 --76.2031 --76.2063 --76.2063 --76.2 --76.2 --76.1922 --76.2031 --76.1969 --76.2047 --76.2047 --76.1984 --76.1922 --76.1906 --76.1828 --76.1844 --76.2016 --76.1922 --76.2109 --76.2188 --76.1906 --76.1984 --76.1922 --76.2031 --76.1906 --76.2063 --76.2016 --76.2094 --76.2031 --76.1875 --76.2031 --76.1969 --76.1828 --76.2078 --76.1906 --76.1813 --76.1766 --76.1875 --76.2016 --76.1891 --76.1953 --76.1875 --76.2078 --76.1922 --76.1937 --76.1953 --76.1906 --76.1875 --76.1922 --76.1906 --76.1844 --76.1859 --76.1906 --76.1969 --76.1891 --76.1875 --76.1781 --76.1937 --76.2016 --76.1922 --76.1969 --76.1813 --76.2078 --76.1797 --76.1984 --76.1875 --76.1875 --76.2016 --76.1797 --76.1797 --76.1813 --76.1891 --76.1891 --76.175 --76.1922 --76.1766 --76.1734 --76.1906 --76.1844 --76.1734 --76.1844 --76.1875 --76.1984 --76.1906 --76.1922 --76.2 --76.1969 --76.1922 --76.2109 --76.1969 --76.2094 --76.2031 --76.1906 --76.2016 --76.1922 --76.1875 --76.2016 --76.1859 --76.1813 --76.1891 --76.1766 --76.1687 --76.1906 --76.1828 --76.1922 --76.2047 --76.1984 --76.2047 --76.1891 --76.1953 --76.1937 --76.1891 --76.1844 --76.1984 --76.1828 --76.1891 --76.1953 --76.2016 --76.2 --76.1984 --76.2125 --76.2109 --76.2 --76.2094 --76.2 --76.1937 --76.1984 --76.1984 --76.2078 --76.1984 --76.2047 --76.2063 --76.2047 --76.2031 --76.1906 --76.1953 --76.1891 --76.2031 --76.1922 --76.2109 --76.1891 --76.1906 --76.2 --76.2031 --76.1859 --76.1922 --76.1828 --76.2125 --76.2094 --76.1969 --76.2 --76.1969 --76.1859 --76.2 --76.2063 --76.1953 --76.2047 --76.2109 --76.2031 --76.1922 --76.2063 --76.2016 --76.2078 --76.1984 --76.1922 --76.1969 --76.1937 --76.2078 --76.1813 --76.2047 --76.1953 --76.2016 --76.1937 --76.1891 --76.1969 --76.1781 --76.1969 --76.1891 --76.1813 --76.1813 --76.2141 --76.2078 --76.1937 --76.1891 --76.2031 --76.2016 --76.1984 --76.1937 --76.1984 --76.1953 --76.1953 --76.1953 --76.2016 --76.1922 --76.1953 --76.2016 --76.1969 --76.1922 --76.1953 --76.2031 --76.2078 --76.2078 --76.2094 --76.2031 --76.2016 --76.1969 --76.1953 --76.1906 --76.1906 --76.2063 --76.1969 --76.2063 --76.2078 --76.2109 --76.2188 --76.1969 --76.2094 --76.1844 --76.1922 --76.1922 --76.1922 --76.2047 --76.2016 --76.2031 --76.1922 --76.1984 --76.1813 --76.1984 --76.1922 --76.1766 --76.1813 --76.2016 --76.1922 --76.2 --76.1906 --76.2047 --76.1969 --76.1969 --76.2047 --76.2063 --76.2016 --76.2078 --76.1984 --76.2031 --76.1875 --76.2 --76.1984 --76.1906 --76.1984 --76.1953 --76.1875 --76.1969 --76.2 --76.1969 --76.1891 --76.1969 --76.1922 --76.2063 --76.1797 --76.1891 --76.1844 --76.1922 --76.1922 --76.1891 --76.1969 --76.1797 --76.2016 --76.1937 --76.1875 --76.1969 --76.1906 --76.2 --76.1766 --76.1891 --76.1906 --76.2047 --76.1922 --76.1953 --76.1875 --76.1781 --76.1844 --76.2063 --76.1969 --76.1906 --76.2016 --76.1984 --76.2094 --76.2 --76.1984 --76.2078 --76.2063 --76.2141 --76.2047 --76.1844 --76.1906 --76.1859 --76.1969 --76.1844 --76.1937 --76.1813 --76.1937 --76.2 --76.1984 --76.1844 --76.1969 --76.1891 --76.1922 --76.1844 --76.2078 --76.1828 --76.1953 --76.1922 --76.1937 --76.1984 --76.1906 --76.1984 --76.1891 --76.2 --76.2031 --76.1984 --76.2 --76.1969 --76.1766 --76.1906 --76.1797 --76.1984 --76.1797 --76.1922 --76.1937 --76.1859 --76.1859 --76.1844 --76.1859 --76.2016 --76.1906 --76.1859 --76.1969 --76.1891 --76.1891 --76.2016 --76.2031 --76.1875 --76.2016 --76.1859 --76.1906 --76.1984 --76.2016 --76.1859 --76.1937 --76.1922 --76.2078 --76.1813 --76.1906 --76.1906 --76.2 --76.1828 --76.1906 --76.1984 --76.1875 --76.1875 --76.1906 --76.1969 --76.1922 --76.175 --76.1844 --76.1734 --76.1828 --76.1781 --76.1766 --76.1734 --76.1719 --76.1984 --76.2 --76.1969 --76.1797 --76.1891 --76.1922 --76.1875 --76.1891 --76.1875 --76.1859 --76.2031 --76.1766 --76.1875 --76.1969 --76.1766 --76.1875 --76.1953 --76.1937 --76.1875 --76.2031 --76.1937 --76.1891 --76.1922 --76.1797 --76.2 --76.1937 --76.1797 --76.1844 --76.1875 --76.1844 --76.1859 --76.1906 --76.2016 --76.1797 --76.1953 --76.1859 --76.1859 --76.1766 --76.1813 --76.1859 --76.1766 --76.1922 --76.1813 --76.2063 --76.1813 --76.1844 --76.1875 --76.2 --76.1875 --76.2016 --76.2031 --76.1797 --76.2047 --76.2047 --76.2172 --76.1969 --76.1953 --76.1937 --76.1875 --76.2063 --76.1813 --76.1875 --76.2016 --76.1797 --76.1969 --76.1844 --76.1922 --76.1766 --76.1953 --76.1781 --76.1719 --76.1969 --76.1641 --76.1797 --76.175 --76.1703 --76.1906 --76.1844 --76.1922 --76.175 --76.1969 --76.1906 --76.1937 --76.175 --76.1953 --76.1734 --76.1719 --76.1906 --76.1844 --76.1828 --76.1984 --76.1797 --76.1844 --76.1859 --76.175 --76.1891 --76.1781 --76.1875 --76.1937 --76.1875 --76.1875 --76.1875 --76.1906 --76.1937 --76.1906 --76.1875 --76.1875 --76.1984 --76.1969 --76.1953 --76.1859 --76.2078 --76.1953 --76.1797 --76.2031 --76.1875 --76.1906 --76.1922 --76.2016 --76.1875 --76.1797 --76.1984 --76.1891 --76.1859 --76.1953 --76.1906 --76.1922 --76.2 --76.1906 --76.2109 --76.1875 --76.1906 --76.1953 --76.1937 --76.1969 --76.1922 --76.1984 --76.2156 --76.1984 --76.2016 --76.2047 --76.2063 --76.2078 --76.1828 --76.2016 --76.1969 --76.1875 --76.1875 --76.1891 --76.1875 --76.2078 --76.1891 --76.2016 --76.2031 --76.1953 --76.1875 --76.2016 --76.1953 --76.1953 --76.2047 --76.2031 --76.2 --76.2031 --76.1891 --76.1922 --76.2016 --76.2031 --76.1969 --76.1937 --76.1922 --76.2 --76.1813 --76.1859 --76.1906 --76.1937 --76.1937 --76.1813 --76.1766 --76.1937 --76.2063 --76.1922 --76.1937 --76.1859 --76.1891 --76.1891 --76.2047 --76.1906 --76.1984 --76.1922 --76.2094 --76.2 --76.2031 --76.1906 --76.1984 --76.2109 --76.1969 --76.2047 --76.1969 --76.2031 --76.1906 --76.2125 --76.2 --76.1906 --76.2125 --76.2156 --76.2031 --76.2063 --76.2172 --76.1953 --76.2047 --76.2 --76.2016 --76.1984 --76.1922 --76.1937 --76.1828 --76.1875 --76.2063 --76.1922 --76.2016 --76.1922 --76.2031 --76.1953 --76.1969 --76.2078 --76.1953 --76.1922 --76.1875 --76.1891 --76.2016 --76.1813 --76.1984 --76.2031 --76.1875 --76.1891 --76.1984 --76.1922 --76.1859 --76.2031 --76.1984 --76.1906 --76.2016 --76.1922 --76.1844 --76.1937 --76.1844 --76.1859 --76.1813 --76.1875 --76.1953 --76.1937 --76.1953 --76.2016 --76.1937 --76.2125 --76.1844 --76.1922 --76.1953 --76.1859 --76.1891 --76.2 --76.2 --76.2 --76.1953 --76.1922 --76.1828 --76.1906 --76.1984 --76.1844 --76.1797 --76.1859 --76.1766 --76.1797 --76.1891 --76.1891 --76.1937 --76.1844 --76.1859 --76.1875 --76.1859 --76.1937 --76.2 --76.1953 --76.1844 --76.1875 --76.1969 --76.1953 --76.2 --76.2031 --76.1922 --76.1937 --76.1844 --76.2031 --76.1937 --76.1813 --76.1813 --76.1875 --76.1813 --76.1969 --76.1859 --76.1875 --76.1906 --76.1859 --76.1984 --76.1922 --76.1984 --76.1953 --76.1844 --76.1937 --76.1859 --76.2 --76.1766 --76.1844 --76.1797 --76.1844 --76.1844 --76.2016 --76.1969 --76.1922 --76.2031 --76.1859 --76.1937 --76.2063 --76.1906 --76.1781 --76.1937 --76.1937 --76.1984 --76.2016 --76.1906 --76.1969 --76.1844 --76.1984 --76.1859 --76.1875 --76.1875 --76.1953 --76.2078 --76.2016 --76.2 --76.1859 --76.1937 --76.1953 --76.2016 --76.1953 --76.1859 --76.1937 --76.1969 --76.1781 --76.1875 --76.2016 --76.1984 --76.1937 --76.2016 --76.1953 --76.1969 --76.1859 --76.1813 --76.1922 --76.1828 --76.1953 --76.1953 --76.2063 --76.1813 --76.1875 --76.2031 --76.1813 --76.1781 --76.1703 --76.1844 --76.2016 --76.1813 --76.1781 --76.1875 --76.1891 --76.1875 --76.1844 --76.1844 --76.1859 --76.1891 --76.1906 --76.1906 --76.1906 --76.1891 --76.1859 --76.1781 --76.1844 --76.1969 --76.1844 --76.1937 --76.1969 --76.1813 --76.1844 --76.1875 --76.1813 --76.175 --76.1828 --76.1859 --76.1844 --76.2016 --76.1797 --76.1922 --76.1797 --76.1734 --76.1922 --76.1906 --76.2047 --76.1813 --76.1984 --76.1891 --76.1922 --76.1672 --76.1906 --76.1953 --76.1891 --76.1859 --76.1953 --76.1891 --76.1781 --76.1984 --76.1969 --76.1797 --76.1953 --76.1906 --76.1859 --76.1891 --76.1797 --76.1766 --76.1859 --76.1969 --76.1859 --76.1844 --76.1922 --76.1813 --76.1844 --76.1703 --76.1813 --76.1906 --76.1859 --76.1781 --76.1922 --76.1875 --76.1922 --76.175 --76.2016 --76.1891 --76.1922 --76.1969 --76.1813 --76.1844 --76.1828 --76.1906 --76.1828 --76.1719 --76.1766 --76.1781 --76.1828 --76.1844 --76.1922 --76.2094 --76.1906 --76.2 --76.2031 --76.2031 --76.1891 --76.1953 --76.1906 --76.175 --76.1969 --76.1828 --76.1891 --76.175 --76.1828 --76.1969 --76.1953 --76.1953 --76.1734 --76.1875 --76.1813 --76.1844 --76.2 --76.1953 --76.1922 --76.1969 --76.1859 --76.2078 --76.2094 --76.2 --76.2031 --76.1937 --76.2016 --76.2 --76.2047 --76.1969 --76.1844 --76.1953 --76.1891 --76.1813 --76.1766 --76.1922 --76.1922 --76.1859 --76.1891 --76.1828 --76.1781 --76.1844 --76.1937 --76.1953 --76.1969 --76.1922 --76.1766 --76.1766 --76.1906 --76.1859 --76.1906 --76.1813 --76.1891 --76.1984 --76.1875 --76.1875 --76.1859 --76.1906 --76.1797 --76.1906 --76.1844 --76.1891 --76.1844 --76.1766 --76.1813 --76.1828 --76.1859 --76.1969 --76.1781 --76.1828 --76.1906 --76.1859 --76.1859 --76.1797 --76.1859 --76.1781 --76.1734 --76.1828 --76.1781 --76.1875 --76.1781 --76.1906 --76.1828 --76.1828 --76.1875 --76.1813 --76.1906 --76.1906 --76.1781 --76.1844 --76.1906 --76.1766 --76.1875 --76.1813 --76.1766 --76.1766 --76.1859 --76.1828 --76.1781 --76.1672 --76.1828 --76.1859 --76.1844 --76.1906 --76.1797 --76.1781 --76.1844 --76.1922 --76.1891 --76.1828 --76.1797 --76.1719 --76.1844 --76.1813 --76.1875 --76.1734 --76.1813 --76.1875 --76.1766 --76.1859 --76.1813 --76.1656 --76.175 --76.1781 --76.175 --76.1656 --76.1875 --76.1641 --76.1687 --76.1734 --76.1625 --76.1719 --76.1531 --76.1547 --76.1578 --76.1656 --76.1609 --76.1609 --76.1797 --76.1719 --76.175 --76.1703 --76.1672 --76.1703 --76.1859 --76.1703 --76.1781 --76.1813 --76.1797 --76.1891 --76.1719 --76.1766 --76.1781 --76.175 --76.1641 --76.175 --76.1828 --76.1734 --76.1922 --76.1797 --76.1844 --76.1813 --76.1719 --76.1828 --76.1859 --76.1766 --76.1859 --76.1656 --76.175 --76.1828 --76.1672 --76.1687 --76.1719 --76.1844 --76.1609 --76.1672 --76.175 --76.1781 --76.1703 --76.1766 --76.1734 --76.1734 --76.1719 --76.1813 --76.1719 --76.1562 --76.1766 --76.1734 --76.1625 --76.1687 --76.1656 --76.1719 --76.1687 --76.1656 --76.1672 --76.1703 --76.1813 --76.1734 --76.1625 --76.1797 --76.1797 --76.1719 --76.1703 --76.1719 --76.1562 --76.1656 --76.1625 --76.1734 --76.1656 --76.1594 --76.1594 --76.1562 --76.1672 --76.1734 --76.1562 --76.1687 --76.1672 --76.1594 --76.1797 --76.1781 --76.175 --76.1734 --76.1703 --76.1844 --76.1781 --76.1781 --76.1672 --76.1766 --76.1766 --76.1781 --76.1766 --76.1719 --76.1703 --76.1687 --76.1797 --76.1734 --76.1625 --76.1672 --76.1609 --76.1766 --76.1562 --76.1703 --76.1703 --76.1844 --76.1797 --76.1672 --76.1641 --76.1656 --76.175 --76.1734 --76.1672 --76.1781 --76.1797 --76.1813 --76.1828 --76.1781 --76.1781 --76.1828 --76.1828 --76.1953 --76.1797 --76.1766 --76.1766 --76.1672 --76.1766 --76.1875 --76.1719 --76.1703 --76.1797 --76.1844 --76.1891 --76.1828 --76.1766 --76.1875 --76.1891 --76.1906 --76.1844 --76.1891 --76.1891 --76.1781 --76.1781 --76.1859 --76.1719 --76.1828 --76.1719 --76.175 --76.1813 --76.1641 --76.1875 --76.1797 --76.1766 --76.1859 --76.1781 --76.1687 --76.1672 --76.1891 --76.1766 --76.1844 --76.1797 --76.1891 --76.1891 --76.1734 --76.1703 --76.1906 --76.1766 --76.175 --76.1891 --76.1703 --76.1844 --76.1719 --76.1766 --76.1734 --76.1656 --76.1719 --76.1797 --76.1766 --76.1578 --76.1641 --76.1859 --76.1734 --76.1859 --76.1734 --76.1641 --76.1766 --76.1719 --76.1797 --76.1781 --76.1797 --76.1719 --76.1797 --76.1906 --76.1781 --76.1719 --76.1875 --76.1781 --76.1875 --76.1875 --76.175 --76.1797 --76.1797 --76.1891 --76.1859 --76.1891 --76.1719 --76.1781 --76.1781 --76.1844 --76.1703 --76.1844 --76.1828 --76.1734 --76.1859 --76.1797 --76.175 --76.1828 --76.1656 --76.1906 --76.1687 --76.1828 --76.1656 --76.1703 --76.1844 --76.175 --76.1687 --76.1609 --76.1813 --76.1594 --76.1625 --76.1781 --76.1813 --76.1844 --76.1734 --76.1641 --76.1844 --76.1734 --76.1828 --76.1859 --76.1844 --76.1719 --76.1859 --76.1906 --76.1813 --76.1766 --76.1906 --76.1672 --76.1813 --76.175 --76.1766 --76.1813 --76.1766 --76.1813 --76.1813 --76.1813 --76.1781 --76.1687 --76.1719 --76.1797 --76.1734 --76.1766 --76.175 --76.1734 --76.1703 --76.1641 --76.1719 --76.1781 --76.1719 --76.1891 --76.175 --76.1766 --76.1781 --76.1766 --76.1766 --76.1641 --76.1734 --76.1734 --76.1766 --76.1813 --76.1687 --76.1734 --76.1844 --76.1734 --76.1734 --76.1625 --76.1797 --76.1578 --76.175 --76.1813 --76.1734 --76.1766 --76.175 --76.1859 --76.1828 --76.1859 --76.1859 --76.1687 --76.1719 --76.175 --76.1719 --76.1734 --76.1656 --76.175 --76.1719 --76.175 --76.175 --76.1719 --76.1766 --76.175 --76.1734 --76.1781 --76.1719 --76.1828 --76.1609 --76.175 --76.1672 --76.1625 --76.175 --76.1797 --76.1828 --76.1625 --76.1719 --76.1719 --76.175 --76.1703 --76.1734 --76.1656 --76.1844 --76.1734 --76.1703 --76.1547 --76.1703 --76.1703 --76.1844 --76.1687 --76.1719 --76.175 --76.175 --76.1766 --76.1875 --76.1766 --76.1828 --76.1562 --76.1859 --76.1875 --76.1828 --76.1734 --76.1766 --76.1828 --76.1703 --76.1562 --76.1641 --76.1719 --76.1734 --76.1844 --76.1672 --76.1719 --76.1687 --76.1687 --76.1672 --76.1672 --76.1687 --76.1469 --76.175 --76.1797 --76.1672 --76.1687 --76.1703 --76.1766 --76.1703 --76.1703 --76.1797 --76.1687 --76.1734 --76.1719 --76.175 --76.1625 --76.1719 --76.175 --76.1781 --76.1641 --76.1813 --76.1703 --76.1703 --76.1797 --76.1734 --76.1813 --76.1766 --76.1687 --76.1547 --76.1703 --76.1641 --76.1781 --76.1781 --76.1734 --76.1687 --76.1672 --76.1766 --76.1781 --76.1781 --76.175 --76.1766 --76.1609 --76.1641 --76.175 --76.1656 --76.1781 --76.1609 --76.1562 --76.1672 --76.1797 --76.1891 --76.1781 --76.1844 --76.1937 --76.1828 --76.1891 --76.1766 --76.1687 --76.1813 --76.1813 --76.1687 --76.1687 --76.175 --76.175 --76.1703 --76.1687 --76.1656 --76.1813 --76.1609 --76.1734 --76.1625 --76.1734 --76.1687 --76.1781 --76.1766 --76.1656 --76.1703 --76.1875 --76.1656 --76.1781 --76.1719 --76.1703 --76.1734 --76.175 --76.175 --76.1672 --76.1672 --76.1687 --76.175 --76.1781 --76.175 --76.1656 --76.1594 --76.1562 --76.1609 --76.1719 --76.1672 --76.175 --76.1625 --76.1687 --76.1828 --76.1703 --76.175 --76.1719 --76.1797 --76.175 --76.1766 --76.1703 --76.1625 --76.1609 --76.1672 --76.1687 --76.1625 --76.1641 --76.1594 --76.1672 --76.1703 --76.1766 --76.1656 --76.1687 --76.1781 --76.1781 --76.1625 --76.1719 --76.1813 --76.1953 --76.1844 --76.1922 --76.1891 --76.1828 --76.1891 --76.1719 --76.1641 --76.1828 --76.1672 --76.1672 --76.1703 --76.1703 --76.1813 --76.1719 --76.1828 --76.1734 --76.1813 --76.1797 --76.1687 --76.1641 --76.1703 --76.1719 --76.1578 --76.1609 --76.1625 --76.1687 --76.1578 --76.175 --76.1734 --76.175 --76.1578 --76.1641 --76.1687 --76.1719 --76.1641 --76.1562 --76.1687 --76.1672 --76.1672 --76.1703 --76.1641 --76.1672 --76.1797 --76.1578 --76.1734 --76.1516 --76.1891 --76.1625 --76.1672 --76.1547 --76.1562 --76.1813 --76.1781 --76.1766 --76.1672 --76.1891 --76.1703 --76.1562 --76.1687 --76.1672 --76.1562 --76.1609 --76.1687 --76.1609 --76.1672 --76.1609 --76.1562 --76.1656 --76.1703 --76.1703 --76.1672 --76.1656 --76.1641 --76.1703 --76.1578 --76.1687 --76.1781 --76.1766 --76.1844 --76.1797 --76.1641 --76.1875 --76.1781 --76.1734 --76.1609 --76.1687 --76.1625 --76.1844 --76.1656 --76.1719 --76.1672 --76.15 --76.1766 --76.1797 --76.1672 --76.1813 --76.1734 --76.1672 --76.1844 --76.1875 --76.1719 --76.1781 --76.1766 --76.1781 --76.1734 --76.1609 --76.175 --76.1734 --76.1609 --76.1766 --76.1656 --76.175 --76.1719 --76.1734 --76.1875 --76.1844 --76.1672 --76.1734 --76.1844 --76.1656 --76.1719 --76.1703 --76.15 --76.1703 --76.1609 --76.1594 --76.1734 --76.1672 --76.1547 --76.1687 --76.1687 --76.1609 --76.1656 --76.1844 --76.1562 --76.1547 --76.1641 --76.1562 --76.1687 --76.1609 --76.1734 --76.1703 --76.1547 --76.1625 --76.1703 --76.1547 --76.1625 --76.1734 --76.1531 --76.1656 --76.1609 --76.1687 --76.1641 --76.1641 --76.1578 --76.1547 --76.1547 --76.1734 --76.1641 --76.1594 --76.1656 --76.1766 --76.1766 --76.1781 --76.1656 --76.175 --76.1734 --76.1719 --76.1703 --76.1813 --76.1609 --76.1641 --76.1813 --76.1859 --76.1734 --76.1687 --76.1656 --76.1813 --76.1609 --76.1719 --76.1609 --76.1484 --76.1781 --76.1609 --76.175 --76.1609 --76.1766 --76.1734 --76.1656 --76.1734 --76.1766 --76.1781 --76.1734 --76.1766 --76.1625 --76.1672 --76.1734 --76.1719 --76.1734 --76.1766 --76.1781 --76.1828 --76.1766 --76.1719 --76.1719 --76.1719 --76.1687 --76.1625 --76.175 --76.1656 --76.1703 --76.1547 --76.1594 --76.1672 --76.1656 --76.1656 --76.1656 --76.1641 --76.1516 --76.1641 --76.1516 --76.1547 --76.1609 --76.1562 --76.1516 --76.1578 --76.1625 --76.1766 --76.1656 --76.1734 --76.1687 --76.1766 --76.1531 --76.1641 --76.1656 --76.1625 --76.1641 --76.1641 --76.1625 --76.1687 --76.1562 --76.1656 --76.1672 --76.1625 --76.1719 --76.1562 --76.1562 --76.1609 --76.1516 --76.1531 --76.1625 --76.1703 --76.1594 --76.1687 --76.1703 --76.1703 --76.1719 --76.1656 --76.1594 --76.1672 --76.1578 --76.1656 --76.1531 --76.1719 --76.1719 --76.1672 --76.1766 --76.1547 --76.1609 --76.1547 --76.1562 --76.1562 --76.1578 --76.1578 --76.1562 --76.1531 --76.1578 --76.1641 --76.1703 --76.1734 --76.1547 --76.1531 --76.1625 --76.1672 --76.1578 --76.15 --76.15 --76.1562 --76.1594 --76.1516 --76.1766 --76.1594 --76.1734 --76.15 --76.1656 --76.1687 --76.1672 --76.1641 --76.1547 --76.1641 --76.15 --76.1453 --76.1594 --76.175 --76.1687 --76.1562 --76.1641 --76.1609 --76.1547 --76.1656 --76.175 --76.1531 --76.1562 --76.1578 --76.1516 --76.1719 --76.1656 --76.1781 --76.1562 --76.1578 --76.1687 --76.1578 --76.1641 --76.1656 --76.1562 --76.1641 --76.1703 --76.1719 --76.1672 --76.1703 --76.1734 --76.1859 --76.175 --76.1625 --76.1781 --76.1484 --76.1578 --76.1625 --76.1687 --76.175 --76.1484 --76.1703 --76.1656 --76.1562 --76.1781 --76.1547 --76.1484 --76.1734 --76.1609 --76.1578 --76.1687 --76.1719 --76.1656 --76.1625 --76.1641 --76.1625 --76.1656 --76.1578 --76.1687 --76.1625 --76.1672 --76.175 --76.1672 --76.1641 --76.1703 --76.1609 --76.1594 --76.1641 --76.1594 --76.1641 --76.1656 --76.1578 --76.1813 --76.1547 --76.1516 --76.1625 --76.1766 --76.1734 --76.1547 --76.1797 --76.1656 --76.1672 --76.1609 --76.1609 --76.1609 --76.1719 --76.1672 --76.1641 --76.1594 --76.1719 --76.1687 --76.1594 --76.1734 --76.1625 --76.1797 --76.1562 --76.1781 --76.1641 --76.1531 --76.15 --76.1594 --76.1547 --76.1609 --76.1609 --76.1484 --76.1687 --76.1609 --76.1516 --76.1625 --76.1594 --76.1484 --76.1438 --76.1625 --76.1562 --76.1531 --76.1641 --76.1484 --76.1594 --76.1547 --76.1672 --76.1547 --76.1656 --76.1562 --76.1562 --76.1547 --76.1641 --76.1562 --76.1438 --76.1734 --76.1562 --76.1594 --76.1719 --76.1547 --76.1562 --76.1656 --76.15 --76.1484 --76.1609 --76.1656 --76.1641 --76.1594 --76.15 --76.1531 --76.1516 --76.1484 --76.1578 --76.1484 --76.1641 --76.1641 --76.1547 --76.1703 --76.1547 --76.1625 --76.1609 --76.15 --76.1672 --76.1516 --76.1719 --76.1609 --76.1594 --76.1609 --76.1703 --76.15 --76.1609 --76.1531 --76.1625 --76.175 --76.1734 --76.1672 --76.1656 --76.1687 --76.1625 --76.1656 --76.1766 --76.1594 --76.1703 --76.1625 --76.175 --76.1703 --76.1859 --76.1781 --76.1719 --76.1766 --76.1797 --76.1656 --76.1656 --76.1734 --76.1547 --76.1625 --76.1656 --76.1672 --76.1641 --76.175 --76.1687 --76.1766 --76.1687 --76.1734 --76.1578 --76.1516 --76.1609 --76.1594 --76.1641 --76.1578 --76.1531 --76.1656 --76.1578 --76.1656 --76.1641 --76.1625 --76.1578 --76.1562 --76.15 --76.1672 --76.1703 --76.1594 --76.1625 --76.1578 --76.1594 --76.1672 --76.1781 --76.1578 --76.1531 --76.1594 --76.1656 --76.1562 --76.1594 --76.1562 --76.1656 --76.1656 --76.1625 --76.1625 --76.1672 --76.1625 --76.1578 --76.1625 --76.1578 --76.1578 --76.1625 --76.1531 --76.1578 --76.1547 --76.1719 --76.1438 --76.1562 --76.1562 --76.1594 --76.1687 --76.1609 --76.1547 --76.1656 --76.1687 --76.1656 --76.1578 --76.1625 --76.1625 --76.15 --76.1562 --76.1547 --76.1562 --76.1734 --76.1687 --76.1438 --76.1516 --76.1516 --76.1687 --76.1609 --76.1516 --76.1656 --76.1625 --76.1609 --76.1766 --76.1578 --76.1609 --76.1609 --76.1719 --76.1625 --76.1578 --76.1656 --76.1516 --76.1703 --76.1687 --76.1625 --76.1531 --76.1641 --76.1516 --76.1609 --76.1406 --76.1562 --76.1594 --76.1531 --76.1516 --76.1578 --76.1453 --76.1438 --76.1422 --76.1578 --76.1531 --76.1406 --76.15 --76.1625 --76.1547 --76.1547 --76.1516 --76.1562 --76.1484 --76.1547 --76.1516 --76.1594 --76.1641 --76.1422 --76.1547 --76.1578 --76.1531 --76.1438 --76.1406 --76.1453 --76.1422 --76.1453 --76.1328 --76.1344 --76.15 --76.1453 --76.1531 --76.1344 --76.1531 --76.1375 --76.1359 --76.1484 --76.1531 --76.1547 --76.1531 --76.1625 --76.1516 --76.1516 --76.1516 --76.15 --76.1531 --76.1438 --76.125 --76.15 --76.1328 --76.1391 --76.125 --76.15 --76.1422 --76.1609 --76.1469 --76.1469 --76.15 --76.1547 --76.1641 --76.1406 --76.1531 --76.1406 --76.1531 --76.1484 --76.15 --76.1547 --76.1484 --76.1703 --76.1547 --76.1469 --76.1609 --76.1562 --76.1578 --76.1547 --76.1562 --76.1562 --76.1547 --76.1531 --76.1609 --76.1578 --76.1562 --76.1687 --76.1672 --76.1578 --76.1516 --76.1734 --76.1609 --76.1781 --76.1766 --76.1672 --76.1687 --76.1484 --76.1609 --76.1562 --76.1594 --76.1641 --76.1641 --76.1687 --76.1719 --76.1687 --76.1547 --76.1625 --76.1672 --76.1656 --76.1578 --76.1687 --76.1734 --76.1578 --76.1578 --76.1687 --76.1672 --76.1734 --76.1719 --76.1719 --76.1547 --76.1594 --76.1625 --76.1766 --76.1547 --76.1734 --76.1672 --76.1766 --76.1641 --76.1594 --76.1578 --76.1594 --76.1531 --76.1547 --76.1547 --76.1609 --76.1562 --76.1484 --76.1672 --76.1594 --76.1672 --76.1578 --76.1781 --76.1609 --76.1719 --76.15 --76.1578 --76.1516 --76.1547 --76.1641 --76.1687 --76.1484 --76.1625 --76.1703 --76.1484 --76.1484 --76.1734 --76.1594 --76.1734 --76.1578 --76.1547 --76.1656 --76.1734 --76.1609 --76.1672 --76.1469 --76.1672 --76.1609 --76.1516 --76.1547 --76.175 --76.1734 --76.1609 --76.1562 --76.1578 --76.1625 --76.1547 --76.1609 --76.1687 --76.1484 --76.1656 --76.1438 --76.1672 --76.1531 --76.1516 --76.1578 --76.1687 --76.1484 --76.1547 --76.1531 --76.1594 --76.1656 --76.1562 --76.1516 --76.1766 --76.1562 --76.1578 --76.1766 --76.1578 --76.1484 --76.1547 --76.15 --76.1594 --76.1594 --76.1594 --76.1656 --76.15 --76.15 --76.1531 --76.1641 --76.1562 --76.1672 --76.15 --76.1687 --76.1578 --76.1562 --76.175 --76.1797 --76.1547 --76.1703 --76.1625 --76.1687 --76.1562 --76.1469 --76.1516 --76.1641 --76.1594 --76.1687 --76.1531 --76.1609 --76.1484 --76.1438 --76.1469 --76.1531 --76.1578 --76.1641 --76.1609 --76.1516 --76.1391 --76.1562 --76.1406 --76.1531 --76.1625 --76.1656 --76.1516 --76.1484 --76.1531 --76.1547 --76.1484 --76.1453 --76.1672 --76.1609 --76.1484 --76.1656 --76.1672 --76.1438 --76.1562 --76.1656 --76.15 --76.1656 --76.1469 --76.1484 --76.1562 --76.1562 --76.1516 --76.1641 --76.1562 --76.1547 --76.1531 --76.1594 --76.15 --76.1656 --76.1672 --76.1609 --76.1547 --76.1656 --76.1562 --76.1594 --76.1547 --76.1609 --76.1578 --76.1516 --76.1531 --76.1562 --76.1516 --76.1609 --76.1531 --76.1562 --76.1687 --76.1656 --76.1719 --76.1516 --76.1578 --76.1609 --76.1547 --76.1594 --76.1547 --76.1547 --76.1562 --76.1516 --76.1687 --76.1562 --76.1609 --76.1641 --76.1609 --76.1687 --76.15 --76.1625 --76.1578 --76.1547 --76.1562 --76.1719 --76.1547 --76.1516 --76.1703 --76.1547 --76.1656 --76.1516 --76.1531 --76.1578 --76.1531 --76.1609 --76.1609 --76.1547 --76.1641 --76.1578 --76.1703 --76.1656 --76.1516 --76.1516 --76.1469 --76.1422 --76.15 --76.1547 --76.1438 --76.1531 --76.1641 --76.15 --76.1547 --76.1562 --76.1641 --76.1594 --76.1578 --76.1687 --76.1469 --76.1484 --76.175 --76.1516 --76.1344 --76.1453 --76.1531 --76.1562 --76.1547 --76.1609 --76.1469 --76.1594 --76.1531 --76.1594 --76.15 --76.1625 --76.1484 --76.1484 --76.1578 --76.1438 --76.1516 --76.1719 --76.1719 --76.1594 --76.1391 --76.1484 --76.15 --76.1516 --76.1516 --76.1578 --76.1375 --76.1453 --76.15 --76.1562 --76.1531 --76.1516 --76.1547 --76.1609 --76.1547 --76.1516 --76.1531 --76.1672 --76.1484 --76.15 --76.1578 --76.1641 --76.1656 --76.1469 --76.1625 --76.1516 --76.1594 --76.1578 --76.1531 --76.1453 --76.1578 --76.1406 --76.1531 --76.1625 --76.1516 --76.1594 --76.1609 --76.1609 --76.1578 --76.1562 --76.1531 --76.1531 --76.15 --76.1469 --76.175 --76.1562 --76.1609 --76.1422 --76.1641 --76.1469 --76.1484 --76.1531 --76.1594 --76.1672 --76.1531 --76.1562 --76.1625 --76.1641 --76.1453 --76.1578 --76.1484 --76.1516 --76.15 --76.1406 --76.1359 --76.1344 --76.1453 --76.1422 --76.1578 --76.1531 --76.1469 --76.1438 --76.1547 --76.1562 --76.1438 --76.1484 --76.1594 --76.1484 --76.1547 --76.1469 --76.1562 --76.1531 --76.1469 --76.1453 --76.1578 --76.15 --76.1609 --76.1547 --76.1734 --76.1516 --76.1594 --76.1484 --76.1516 --76.1484 --76.1422 --76.1375 --76.1328 --76.1562 --76.1484 --76.1484 --76.1562 --76.1578 --76.1594 --76.1531 --76.1484 --76.1422 --76.1469 --76.1625 --76.15 --76.1453 --76.1422 --76.1625 --76.1531 --76.1578 --76.1719 --76.1594 --76.1516 --76.1594 --76.1562 --76.1391 --76.1594 --76.1469 --76.1391 --76.1594 --76.1469 --76.15 --76.1562 --76.1687 --76.1453 --76.15 --76.1547 --76.1531 --76.1484 --76.1531 --76.1641 --76.1547 --76.1516 --76.1406 --76.1438 --76.1453 --76.1516 --76.1453 --76.1641 --76.1453 --76.1578 --76.1656 --76.1531 --76.1422 --76.1562 --76.1469 --76.1438 --76.1531 --76.1547 --76.1453 --76.1531 --76.1594 --76.1484 --76.1562 --76.1547 --76.1516 --76.1469 --76.15 --76.1547 --76.1469 --76.1531 --76.1484 --76.1469 --76.1375 --76.1531 --76.1469 --76.1484 --76.1438 --76.1438 --76.1484 --76.1391 --76.1328 --76.15 --76.1531 --76.1406 --76.1422 --76.1406 --76.1438 --76.1484 --76.1375 --76.1453 --76.1453 --76.1484 --76.1469 --76.1469 --76.1562 --76.1422 --76.1391 --76.1391 --76.1453 --76.1453 --76.1453 --76.1328 --76.1578 --76.1562 --76.1703 --76.1469 --76.1531 --76.1656 --76.1594 --76.15 --76.1672 --76.1469 --76.1609 --76.1562 --76.1516 --76.1547 --76.1453 --76.1562 --76.1672 --76.15 --76.1469 --76.1578 --76.1531 --76.1641 --76.1625 --76.1531 --76.1641 --76.1562 --76.1547 --76.1547 --76.1625 --76.1484 --76.1578 --76.15 --76.1422 --76.1609 --76.1562 --76.1578 --76.1703 --76.1562 --76.1453 --76.15 --76.1547 --76.1578 --76.1531 --76.1531 --76.1656 --76.1562 --76.1625 --76.1594 --76.1594 --76.1687 --76.1594 --76.1656 --76.1609 --76.1656 --76.1516 --76.1484 --76.1453 --76.1438 --76.1531 --76.1578 --76.1453 --76.1687 --76.1594 --76.1609 --76.1672 --76.1625 --76.1641 --76.1562 --76.1516 --76.1484 --76.1469 --76.1578 --76.1578 --76.15 --76.1562 --76.15 --76.1594 --76.1562 --76.1672 --76.1641 --76.1562 --76.1609 --76.1312 --76.1641 --76.1531 --76.1516 --76.1641 --76.1438 --76.1406 --76.1516 --76.1578 --76.1547 --76.1469 --76.1531 --76.1547 --76.1578 --76.1375 --76.1609 --76.1531 --76.1438 --76.1562 --76.1531 --76.1484 --76.1469 --76.1547 --76.1578 --76.1516 --76.15 --76.15 --76.1547 --76.1484 --76.1516 --76.1547 --76.1516 --76.1484 --76.1547 --76.1578 --76.1609 --76.1422 --76.1516 --76.1625 --76.1531 --76.1531 --76.1469 --76.15 --76.1469 --76.15 --76.1609 --76.1516 --76.1562 --76.1656 --76.1531 --76.15 --76.1672 --76.1562 --76.1547 --76.1594 --76.1687 --76.1719 --76.1672 --76.1578 --76.1578 --76.1609 --76.1531 --76.1547 --76.1609 --76.1609 --76.1562 --76.1641 --76.1594 --76.1672 --76.1719 --76.1562 --76.1641 --76.1547 --76.1547 --76.1547 --76.1641 --76.1625 --76.15 --76.1562 --76.1453 --76.1469 --76.1406 --76.1422 --76.1609 --76.1469 --76.1578 --76.1609 --76.1547 --76.1578 --76.1641 --76.15 --76.1609 --76.15 --76.1672 --76.1547 --76.1484 --76.1578 --76.1484 --76.1562 --76.1406 --76.1484 --76.1578 --76.1469 --76.1516 --76.1438 --76.15 --76.1484 --76.1453 --76.1438 --76.1359 --76.1406 --76.1453 --76.1516 --76.1453 --76.1406 --76.15 --76.1547 --76.1422 --76.1641 --76.15 --76.1438 --76.1359 --76.1609 --76.1422 --76.1422 --76.1453 --76.1422 --76.1422 --76.1344 --76.1531 --76.1359 --76.1391 --76.1641 --76.1375 --76.1453 --76.1375 --76.1578 --76.1641 --76.1438 --76.1359 --76.1578 --76.1469 --76.1484 --76.1469 --76.1516 --76.1453 --76.1516 --76.1438 --76.1531 --76.1438 --76.1453 --76.1625 --76.1641 --76.1438 --76.1516 --76.1625 --76.1656 --76.1453 --76.1594 --76.1703 --76.1594 --76.1625 --76.1672 --76.1813 --76.1766 --76.1609 --76.1703 --76.1531 --76.1578 --76.1469 --76.15 --76.1562 --76.1438 --76.15 --76.15 --76.1562 --76.1609 --76.1484 --76.1516 --76.1484 --76.1469 --76.1641 --76.1578 --76.1422 --76.1656 --76.1438 --76.1531 --76.1438 --76.1531 --76.1469 --76.1547 --76.1562 --76.1406 --76.1562 --76.1453 --76.1406 --76.1344 --76.1453 --76.1531 --76.1562 --76.1484 --76.1406 --76.1344 --76.1375 --76.1484 --76.1469 --76.15 --76.1359 --76.1531 --76.1328 --76.1312 --76.1484 --76.1531 --76.1328 --76.1406 --76.1344 --76.1438 --76.1359 --76.1453 --76.1406 --76.1469 --76.1266 --76.1391 --76.1219 --76.1484 --76.1516 --76.1375 --76.1406 --76.1422 --76.1234 --76.1297 --76.1469 --76.1359 --76.1375 --76.1312 --76.1375 --76.1281 --76.1375 --76.1281 --76.1359 --76.1406 --76.1188 --76.1375 --76.1422 --76.1531 --76.1453 --76.1312 --76.1234 --76.1547 --76.1312 --76.1281 --76.1312 --76.1375 --76.1344 --76.1406 --76.1484 --76.1344 --76.1438 --76.1438 --76.1312 --76.1344 --76.1578 --76.1422 --76.1344 --76.1469 --76.1328 --76.1453 --76.1391 --76.1547 --76.1531 --76.1422 --76.1375 --76.1328 --76.125 --76.1328 --76.1422 --76.1375 --76.1297 --76.1406 --76.1438 --76.1406 --76.1359 --76.1359 --76.1266 --76.1438 --76.1391 --76.1391 --76.1531 --76.1406 --76.1406 --76.1406 --76.1438 --76.1359 --76.1484 --76.1422 --76.1312 --76.1516 --76.1297 --76.125 --76.1312 --76.1422 --76.1312 --76.1406 --76.1328 --76.1375 --76.1438 --76.1359 --76.1328 --76.1391 --76.1391 --76.1328 --76.1438 --76.1375 --76.1594 --76.1391 --76.1562 --76.1453 --76.1484 --76.1453 --76.1406 --76.1375 --76.1469 --76.1609 --76.1484 --76.1375 --76.15 --76.1594 --76.1344 --76.1359 --76.1391 --76.1516 --76.1391 --76.1484 --76.1438 --76.1344 --76.1391 --76.1484 --76.1406 --76.1453 --76.1375 --76.1344 --76.1453 --76.1375 --76.1328 --76.1406 --76.1453 --76.15 --76.1312 --76.1328 --76.1266 --76.1359 --76.125 --76.1312 --76.1328 --76.1453 --76.1312 --76.1297 --76.1312 --76.1375 --76.1422 --76.1125 --76.1391 --76.1391 --76.1422 --76.1359 --76.1312 --76.1312 --76.1344 --76.1406 --76.1297 --76.1391 --76.1266 --76.1438 --76.1453 --76.1391 --76.1344 --76.1266 --76.1375 --76.1516 --76.1484 --76.1312 --76.1406 --76.15 --76.1359 --76.1328 --76.1391 --76.1438 --76.1359 --76.1453 --76.1438 --76.15 --76.1234 --76.1391 --76.1422 --76.1422 --76.1469 --76.1422 --76.1609 --76.1328 --76.1484 --76.1422 --76.1562 --76.1438 --76.1375 --76.15 --76.1516 --76.1391 --76.1547 --76.1406 --76.1469 --76.1328 --76.1359 --76.1516 --76.1344 --76.1422 --76.1406 --76.1328 --76.1672 --76.1469 --76.1516 --76.1406 --76.1359 --76.1516 --76.1328 --76.1297 --76.1312 --76.1422 --76.1578 --76.1453 --76.1484 --76.1453 --76.1453 --76.1422 --76.1453 --76.1406 --76.1312 --76.1344 --76.1375 --76.1203 --76.1406 --76.1391 --76.1438 --76.1406 --76.1516 --76.1422 --76.1422 --76.1297 --76.1391 --76.1391 --76.1484 --76.1453 --76.1344 --76.1375 --76.1516 --76.1375 --76.1453 --76.1422 --76.1406 --76.1266 --76.1484 --76.1266 --76.1453 --76.1516 --76.1344 --76.1406 --76.1422 --76.1484 --76.1406 --76.1391 --76.15 --76.1469 --76.1484 --76.1594 --76.15 --76.1469 --76.1469 --76.1469 --76.1375 --76.1422 --76.15 --76.1422 --76.1469 --76.1516 --76.1484 --76.1406 --76.15 --76.1438 --76.1469 --76.1469 --76.1469 --76.1453 --76.1562 --76.1422 --76.1219 --76.1453 --76.1375 --76.1438 --76.1438 --76.1375 --76.1484 --76.1422 --76.1469 --76.1422 --76.1359 --76.1344 --76.1422 --76.1516 --76.1609 --76.1328 --76.1359 --76.1594 --76.1422 --76.1516 --76.1469 --76.1359 --76.1406 --76.1562 --76.1469 --76.1484 --76.1422 --76.1422 --76.1453 --76.1422 --76.1438 --76.1344 --76.1516 --76.1406 --76.1484 --76.1422 --76.1516 --76.1484 --76.1484 --76.15 --76.1484 --76.1516 --76.1438 --76.1516 --76.1562 --76.1344 --76.1422 --76.1391 --76.1406 --76.1625 --76.1469 --76.1375 --76.1406 --76.1406 --76.1359 --76.15 --76.1469 --76.15 --76.1516 --76.1422 --76.1391 --76.1422 --76.1312 --76.1453 --76.1406 --76.1469 --76.1375 --76.1375 --76.1297 --76.1422 --76.1391 --76.1484 --76.1328 --76.1422 --76.1359 --76.1375 --76.1375 --76.1484 --76.15 --76.1438 --76.1359 --76.1219 --76.1422 --76.1438 --76.1391 --76.1375 --76.1406 --76.1312 --76.1344 --76.1391 --76.1359 --76.1406 --76.1453 --76.1312 --76.1297 --76.1391 --76.1453 --76.1359 --76.1422 --76.1406 --76.1359 --76.1422 --76.1312 --76.1344 --76.1312 --76.1531 --76.1406 --76.1328 --76.1281 --76.1359 --76.1359 --76.125 --76.1438 --76.1359 --76.1469 --76.1359 --76.1391 --76.1328 --76.1438 --76.1469 --76.1344 --76.1391 --76.1328 --76.1344 --76.1438 --76.1281 --76.1547 --76.1375 --76.1453 --76.1453 --76.1375 --76.1391 --76.1453 --76.1344 --76.1484 --76.1328 --76.1281 --76.1453 --76.1422 --76.1438 --76.1422 --76.15 --76.1328 --76.1453 --76.1359 --76.1391 --76.1359 --76.1359 --76.1359 --76.1469 --76.1469 --76.1422 --76.1344 --76.1312 --76.1328 --76.1266 --76.1422 --76.125 --76.1453 --76.1422 --76.1406 --76.1469 --76.1406 --76.1375 --76.1438 --76.1375 --76.1328 --76.1375 --76.1391 --76.1344 --76.1484 --76.1375 --76.1438 --76.1422 --76.1359 --76.1438 --76.1516 --76.1375 --76.1438 --76.1344 --76.1312 --76.1453 --76.1438 --76.1406 --76.1438 --76.1406 --76.1391 --76.1438 --76.1516 --76.1375 --76.1453 --76.1391 --76.1469 --76.15 --76.1406 --76.1375 --76.1281 --76.1391 --76.1391 --76.1344 --76.1359 --76.1375 --76.1406 --76.1391 --76.1328 --76.1328 --76.1359 --76.1375 --76.1484 --76.1438 --76.1469 --76.1469 --76.1469 --76.15 --76.1312 --76.1406 --76.1297 --76.1453 --76.1562 --76.1562 --76.1422 --76.1547 --76.1484 --76.1531 --76.1453 --76.15 --76.1547 --76.1469 --76.1469 --76.1422 --76.1469 --76.1594 --76.1641 --76.1625 --76.1625 --76.1484 --76.1516 --76.1578 --76.1578 --76.1609 --76.1516 --76.1641 --76.1578 --76.1672 --76.1703 --76.1656 --76.1578 --76.1687 --76.1781 --76.1516 --76.1562 --76.1641 --76.1578 --76.1625 --76.1578 --76.1672 --76.1625 --76.1687 --76.1547 --76.1547 --76.1547 --76.1438 --76.1609 --76.1547 --76.1625 --76.1438 --76.1484 --76.1547 --76.1562 --76.1375 --76.1453 --76.1516 --76.1578 --76.1516 --76.1516 --76.1516 --76.1547 --76.1422 --76.1422 --76.1609 --76.1547 --76.1375 --76.1516 --76.1594 --76.1578 --76.1438 --76.1547 --76.1516 --76.1578 --76.1562 --76.1562 --76.1516 --76.1516 --76.1609 --76.1594 --76.1516 --76.1484 --76.1531 --76.1531 --76.1609 --76.1484 --76.1578 --76.1578 --76.1438 --76.1578 --76.1422 --76.1359 --76.15 --76.1438 --76.1344 --76.1375 --76.1359 --76.1281 --76.1375 --76.1391 --76.15 --76.1391 --76.1578 --76.1406 --76.1594 --76.1328 --76.1406 --76.1422 --76.1375 --76.1453 --76.1406 --76.1453 --76.1531 --76.1344 --76.1594 --76.15 --76.1687 --76.1547 --76.1516 --76.1547 --76.1562 --76.1484 --76.1391 --76.1547 --76.1391 --76.1375 --76.15 --76.1484 --76.1641 --76.1562 --76.1438 --76.1594 --76.1484 --76.1453 --76.1484 --76.1438 --76.1562 --76.1516 --76.15 --76.1453 --76.1391 --76.1406 --76.1453 --76.1484 --76.1406 --76.1484 --76.1438 --76.1531 --76.1438 --76.1469 --76.1375 --76.1406 --76.1422 --76.1422 --76.15 --76.1391 --76.1359 --76.1562 --76.1406 --76.15 --76.1438 --76.15 --76.1453 --76.1562 --76.1641 --76.1438 --76.1484 --76.1469 --76.1516 --76.1516 --76.15 --76.1422 --76.1453 --76.1375 --76.1359 --76.1281 --76.1438 --76.1297 --76.1406 --76.15 --76.1469 --76.1344 --76.1359 --76.1406 --76.1328 --76.1344 --76.1297 --76.1344 --76.1375 --76.1172 --76.1422 --76.1328 --76.1312 --76.1297 --76.1344 --76.1375 --76.1422 --76.1188 --76.1359 --76.1312 --76.1297 --76.1328 --76.1375 --76.1312 --76.15 --76.1344 --76.1344 --76.1312 --76.15 --76.1375 --76.1438 --76.1469 --76.1266 --76.1344 --76.1297 --76.1344 --76.1438 --76.1391 --76.1266 --76.1453 --76.1344 --76.1484 --76.1359 --76.1297 --76.15 --76.1484 --76.1344 --76.1391 --76.1453 --76.1406 --76.1438 --76.1516 --76.1391 --76.1531 --76.1484 --76.1484 --76.1469 --76.1375 --76.1344 --76.1359 --76.1562 --76.1406 --76.1406 --76.1328 --76.1375 --76.1359 --76.1359 --76.1391 --76.1203 --76.1375 --76.1203 --76.1422 --76.1156 --76.1297 --76.1266 --76.1453 --76.1484 --76.1406 --76.1453 --76.1328 --76.1531 --76.1359 --76.1406 --76.1484 --76.1406 --76.1391 --76.1344 --76.1406 --76.1281 --76.1359 --76.1469 --76.15 --76.1469 --76.1406 --76.1641 --76.1391 --76.1578 --76.1359 --76.1344 --76.1359 --76.1375 --76.1516 --76.1344 --76.1406 --76.1266 --76.1469 --76.1422 --76.1203 --76.1312 --76.1312 --76.1328 --76.1391 --76.1266 --76.1406 --76.1234 --76.1203 --76.1328 --76.1234 --76.1312 --76.1188 --76.1234 --76.1234 --76.1469 --76.1359 --76.1406 --76.1359 --76.1391 --76.1438 --76.1359 --76.1422 --76.1281 --76.1453 --76.1391 --76.1312 --76.1266 --76.1344 --76.1344 --76.1391 --76.1156 --76.1297 --76.1328 --76.1281 --76.1281 --76.1312 --76.1359 --76.1141 --76.1219 --76.1344 --76.1328 --76.1297 --76.1359 --76.1188 --76.1344 --76.1328 --76.1312 --76.1312 --76.1406 --76.1344 --76.1312 --76.1312 --76.1125 --76.1297 --76.1344 --76.1359 --76.1391 --76.1281 --76.1234 --76.1297 --76.1312 --76.15 --76.1328 --76.1547 --76.1406 --76.1359 --76.1453 --76.1406 --76.1281 --76.15 --76.1359 --76.1516 --76.1469 --76.1375 --76.1453 --76.1453 --76.1469 --76.1359 --76.1344 --76.1281 --76.1375 --76.1391 --76.1188 --76.1328 --76.1406 --76.1344 --76.1484 --76.1359 --76.1156 --76.1281 --76.1281 --76.125 --76.1203 --76.125 --76.1312 --76.1281 --76.1344 --76.1438 --76.1328 --76.1344 --76.1406 --76.1297 --76.1359 --76.1359 --76.1266 --76.1422 --76.1359 --76.1328 --76.1359 --76.1469 --76.1453 --76.1297 --76.1328 --76.1391 --76.1438 --76.1344 --76.1375 --76.1359 --76.1312 --76.1328 --76.1266 --76.1312 --76.1422 --76.1469 --76.1266 --76.1453 --76.1562 --76.1266 --76.1422 --76.1297 --76.1266 --76.1375 --76.125 --76.1344 --76.1359 --76.1234 --76.15 --76.1516 --76.1406 --76.1219 --76.1312 --76.1391 --76.1281 --76.15 --76.1422 --76.1312 --76.1391 --76.1344 --76.1375 --76.1484 --76.1406 --76.1234 --76.1328 --76.1391 --76.1359 --76.1203 --76.1219 --76.1172 --76.1234 --76.1359 --76.1359 --76.1344 --76.1359 --76.1219 --76.1391 --76.1406 --76.1203 --76.1453 --76.1328 --76.1391 --76.1391 --76.1531 --76.1438 --76.1469 --76.1375 --76.1438 --76.1422 --76.1422 --76.1484 --76.1391 --76.1547 --76.1438 --76.1406 --76.1469 --76.125 --76.1516 --76.1547 --76.1375 --76.1469 --76.1406 --76.1422 --76.1484 --76.1266 --76.1328 --76.1281 --76.1359 --76.1453 --76.1422 --76.1375 --76.1484 --76.1453 --76.1344 --76.1312 --76.1375 --76.1469 --76.1375 --76.1375 --76.1453 --76.1297 --76.1359 --76.1375 --76.1406 --76.1531 --76.1375 --76.1547 --76.1578 --76.1516 --76.1422 --76.1375 --76.1484 --76.1516 --76.1234 --76.1406 --76.1375 --76.1344 --76.1438 --76.1281 --76.1297 --76.1578 --76.1375 --76.1312 --76.1453 --76.1422 --76.1516 --76.1391 --76.1484 --76.1375 --76.1453 --76.1344 --76.1328 --76.1297 --76.1422 --76.1375 --76.1531 --76.1406 --76.1453 --76.1422 --76.1312 --76.1344 --76.1359 --76.15 --76.1375 --76.1438 --76.1281 --76.125 --76.1297 --76.1453 --76.1234 --76.1297 --76.1531 --76.1391 --76.1328 --76.15 --76.1547 --76.1469 --76.1375 --76.1484 --76.1391 --76.1375 --76.1391 --76.1375 --76.1328 --76.1406 --76.1422 --76.1422 --76.1422 --76.1422 --76.1453 --76.1406 --76.1406 --76.1359 --76.1406 --76.1234 --76.1422 --76.1391 --76.1328 --76.1453 --76.1438 --76.1438 --76.1391 --76.1453 --76.1469 --76.1281 --76.1328 --76.1344 --76.125 --76.1391 --76.1375 --76.1359 --76.1484 --76.1219 --76.1297 --76.1484 --76.1438 --76.1281 --76.1422 --76.1328 --76.1281 --76.1375 --76.125 --76.1375 --76.1484 --76.1328 --76.1359 --76.1344 --76.1438 --76.1375 --76.1391 --76.1422 --76.1328 --76.125 --76.1359 --76.1312 --76.1469 --76.1344 --76.1297 --76.1406 --76.1469 --76.1438 --76.1375 --76.1375 --76.1438 --76.1391 --76.15 --76.1297 --76.1297 --76.1266 --76.1328 --76.1359 --76.1422 --76.1422 --76.1406 --76.1391 --76.1391 --76.1312 --76.1469 --76.1453 --76.1422 --76.1406 --76.1375 --76.1484 --76.1547 --76.1406 --76.1438 --76.1469 --76.1422 --76.1344 --76.15 --76.1391 --76.1438 --76.1469 --76.1406 --76.1469 --76.1547 --76.1453 --76.1422 --76.1297 --76.1453 --76.1484 --76.1562 --76.1406 --76.1453 --76.15 --76.1469 --76.1438 --76.125 --76.1469 --76.1438 --76.1516 --76.1484 --76.1516 --76.1531 --76.1375 --76.1469 --76.1438 --76.1531 --76.1469 --76.1531 --76.1469 --76.1453 --76.1562 --76.1469 --76.1453 --76.1484 --76.1422 --76.1359 --76.1453 --76.1469 --76.1594 --76.1422 --76.1359 --76.1516 --76.1359 --76.1438 --76.1281 --76.1328 --76.1438 --76.1422 --76.1453 --76.1438 --76.1281 --76.1391 --76.1297 --76.1344 --76.1312 --76.1297 --76.1234 --76.1391 --76.1375 --76.1359 --76.125 --76.1344 --76.1344 --76.1312 --76.1375 --76.1359 --76.1297 --76.1266 --76.125 --76.1359 --76.1422 --76.1312 --76.1375 --76.1391 --76.1391 --76.1359 --76.1312 --76.1312 --76.1359 --76.1281 --76.1344 --76.1391 --76.1391 --76.1328 --76.1297 --76.1312 --76.1359 --76.1312 --76.1344 --76.1281 --76.1391 --76.1328 --76.1172 --76.1141 --76.1172 --76.1281 --76.1281 --76.1203 --76.1125 --76.1203 --76.1219 --76.1141 --76.1359 --76.1125 --76.1312 --76.1109 --76.125 --76.0969 --76.125 --76.1203 --76.1125 --76.1281 --76.1203 --76.1281 --76.1359 --76.1234 --76.125 --76.1094 --76.1109 --76.1141 --76.1266 --76.1234 --76.1297 --76.1328 --76.1219 --76.1328 --76.1203 --76.1109 --76.1469 --76.1297 --76.1219 --76.1281 --76.1312 --76.1297 --76.1203 --76.125 --76.1219 --76.1312 --76.1281 --76.1234 --76.1234 --76.1203 --76.1203 --76.1203 --76.1312 --76.1312 --76.1203 --76.1312 --76.1344 --76.1281 --76.125 --76.1266 --76.1078 --76.1156 --76.1094 --76.1188 --76.1188 --76.1172 --76.1125 --76.125 --76.1125 --76.1297 --76.1344 --76.1312 --76.1281 --76.125 --76.1297 --76.1281 --76.1297 --76.1312 --76.125 --76.1281 --76.1531 --76.1312 --76.1375 --76.1312 --76.1328 --76.1453 --76.1203 --76.1266 --76.1266 --76.1172 --76.1266 --76.1344 --76.1328 --76.1516 --76.1312 --76.1281 --76.1328 --76.1516 --76.1406 --76.1406 --76.1281 --76.1328 --76.1328 --76.1203 --76.1375 --76.1375 --76.1266 --76.1312 --76.1406 --76.1328 --76.1266 --76.1359 --76.1328 --76.1281 --76.1266 --76.1422 --76.1344 --76.1391 --76.1438 --76.1312 --76.1391 --76.1266 --76.1203 --76.1234 --76.1359 --76.1281 --76.1156 --76.1375 --76.1328 --76.1328 --76.1234 --76.1406 --76.1312 --76.1438 --76.1281 --76.1297 --76.1312 --76.1328 --76.1297 --76.1266 --76.1203 --76.1188 --76.1266 --76.1141 --76.1172 --76.1203 --76.1234 --76.1234 --76.1266 --76.1172 --76.1047 --76.1203 --76.1188 --76.1203 --76.1312 --76.1234 --76.1188 --76.1203 --76.1219 --76.1234 --76.1203 --76.1219 --76.1078 --76.1141 --76.125 --76.1297 --76.1156 --76.1234 --76.1234 --76.1234 --76.1188 --76.125 --76.1359 --76.1312 --76.1328 --76.1141 --76.1219 --76.1219 --76.1219 --76.1125 --76.125 --76.1156 --76.1328 --76.1359 --76.1266 --76.1234 --76.1188 --76.1156 --76.1266 --76.1281 --76.1203 --76.1375 --76.1172 --76.1219 --76.1344 --76.1234 --76.1281 --76.1281 --76.1406 --76.1312 --76.1266 --76.1328 --76.1125 --76.1234 --76.1375 --76.1344 --76.1297 --76.1219 --76.125 --76.125 --76.1297 --76.1297 --76.1484 --76.1328 --76.1234 --76.1422 --76.1281 --76.1234 --76.1297 --76.1188 --76.125 --76.125 --76.1234 --76.1203 --76.1375 --76.1141 --76.1156 --76.125 --76.1156 --76.1312 --76.1219 --76.1281 --76.1266 --76.1203 --76.1219 --76.1172 --76.125 --76.1219 --76.1234 --76.1094 --76.1312 --76.125 --76.1094 --76.125 --76.125 --76.1219 --76.1141 --76.1219 --76.125 --76.1109 --76.125 --76.1172 --76.1281 --76.1234 --76.1219 --76.1172 --76.1266 --76.1312 --76.1109 --76.125 --76.1188 --76.1219 --76.1219 --76.1172 --76.1344 --76.1094 --76.1266 --76.1219 --76.1234 --76.1281 --76.1188 --76.1375 --76.1297 --76.1266 --76.1422 --76.1328 --76.1375 --76.1281 --76.1406 --76.1547 --76.1375 --76.1359 --76.1422 --76.1406 --76.1438 --76.1234 --76.1156 --76.1422 --76.1453 --76.1234 --76.1359 --76.1391 --76.1219 --76.1453 --76.1422 --76.1391 --76.1328 --76.1469 --76.1297 --76.1344 --76.1297 --76.1422 --76.1344 --76.1375 --76.1453 --76.1234 --76.1297 --76.1359 --76.1406 --76.1469 --76.1266 --76.1359 --76.1328 --76.125 --76.1234 --76.1406 --76.1344 --76.1359 --76.1281 --76.1328 --76.1391 --76.1312 --76.1281 --76.1219 --76.1266 --76.125 --76.1312 --76.1219 --76.1344 --76.1172 --76.1125 --76.1156 --76.1156 --76.1141 --76.1094 --76.1094 --76.1281 --76.1203 --76.1109 --76.1234 --76.1234 --76.1156 --76.1266 --76.1312 --76.1234 --76.1312 --76.1312 --76.1281 --76.1312 --76.1359 --76.1312 --76.1172 --76.125 --76.1281 --76.125 --76.1281 --76.1344 --76.1234 --76.1266 --76.1344 --76.1359 --76.1297 --76.1328 --76.1266 --76.1203 --76.125 --76.125 --76.1359 --76.1375 --76.1281 --76.15 --76.1312 --76.125 --76.125 --76.1266 --76.1172 --76.1281 --76.1219 --76.1312 --76.1312 --76.1453 --76.1344 --76.1328 --76.1375 --76.1297 --76.1453 --76.125 --76.1375 --76.1328 --76.1312 --76.1188 --76.1297 --76.15 --76.1219 --76.1359 --76.1422 --76.1344 --76.15 --76.1281 --76.1297 --76.1422 --76.1328 --76.1266 --76.1297 --76.1281 --76.1422 --76.1484 --76.1219 --76.1281 --76.1266 --76.1266 --76.1266 --76.1234 --76.1219 --76.1297 --76.1219 --76.1266 --76.1312 --76.125 --76.1156 --76.1266 --76.1203 --76.1297 --76.1109 --76.1422 --76.1156 --76.1156 --76.1141 --76.1156 --76.1109 --76.1266 --76.1203 --76.1219 --76.1203 --76.1375 --76.1312 --76.125 --76.1312 --76.1234 --76.1297 --76.1266 --76.1312 --76.1359 --76.1344 --76.1344 --76.1344 --76.1391 --76.1359 --76.1375 --76.1172 --76.1453 --76.1344 --76.1297 --76.1281 --76.1562 --76.1281 --76.1344 --76.1312 --76.1312 --76.1172 --76.1234 --76.1234 --76.1359 --76.1359 --76.1203 --76.1391 --76.1266 --76.1281 --76.1281 --76.1266 --76.1266 --76.1297 --76.1297 --76.1297 --76.1344 --76.1391 --76.1375 --76.1281 --76.1266 --76.1281 --76.125 --76.1219 --76.1234 --76.1266 --76.1297 --76.1188 --76.125 --76.1266 --76.1266 --76.1281 --76.1297 --76.1172 --76.1109 --76.1172 --76.1203 --76.1125 --76.1266 --76.1234 --76.1078 --76.1297 --76.1188 --76.1297 --76.1312 --76.1234 --76.1203 --76.1203 --76.1078 --76.1094 --76.1297 --76.1375 --76.1297 --76.1234 --76.1203 --76.1297 --76.1422 --76.1312 --76.1172 --76.1156 --76.1156 --76.1156 --76.1172 --76.1156 --76.1156 --76.1141 --76.1297 --76.1281 --76.1188 --76.1219 --76.1188 --76.1219 --76.1297 --76.1266 --76.1266 --76.1125 --76.1125 --76.1078 --76.1297 --76.1203 --76.1297 --76.1219 --76.1172 --76.1266 --76.1156 --76.1328 --76.1281 --76.1328 --76.1266 --76.1375 --76.1312 --76.1234 --76.1281 --76.1234 --76.1281 --76.1391 --76.1328 --76.1344 --76.1359 --76.1375 --76.1172 --76.1359 --76.1281 --76.1344 --76.1234 --76.1344 --76.1312 --76.1281 --76.1281 --76.1422 --76.1359 --76.125 --76.1234 --76.15 --76.1203 --76.1219 --76.1375 --76.1375 --76.1406 --76.1484 --76.1281 --76.1234 --76.1406 --76.1312 --76.1484 --76.1422 --76.1422 --76.1266 --76.1359 --76.1359 --76.1406 --76.1422 --76.1422 --76.1375 --76.1438 --76.1281 --76.1453 --76.1375 --76.1375 --76.1438 --76.1359 --76.1297 --76.1219 --76.1312 --76.1438 --76.1297 --76.1391 --76.1375 --76.1219 --76.1281 --76.1375 --76.1203 --76.1141 --76.1219 --76.125 --76.1141 --76.1266 --76.1188 --76.1422 --76.1219 --76.1156 --76.1188 --76.1234 --76.1172 --76.1203 --76.1047 --76.1172 --76.1312 --76.1344 --76.1266 --76.1344 --76.1281 --76.1297 --76.1297 --76.1266 --76.1344 --76.1203 --76.1188 --76.1125 --76.1172 --76.1141 --76.1109 --76.1094 --76.1125 --76.125 --76.1375 --76.1219 --76.125 --76.1266 --76.1078 --76.1359 --76.1266 --76.1266 --76.1297 --76.1109 --76.1391 --76.125 --76.125 --76.1328 --76.1219 --76.1297 --76.1234 --76.1266 --76.1219 --76.1203 --76.125 --76.1172 --76.1094 --76.1375 --76.1156 --76.1281 --76.1172 --76.1203 --76.1172 --76.1141 --76.1078 --76.1094 --76.1078 --76.1203 --76.1125 --76.1219 --76.1141 --76.1141 --76.1281 --76.1141 --76.1219 --76.1094 --76.1062 --76.1281 --76.1078 --76.1156 --76.1234 --76.1188 --76.1078 --76.1234 --76.1156 --76.1156 --76.1125 --76.1094 --76.1109 --76.1109 --76.1156 --76.1203 --76.1297 --76.1172 --76.1172 --76.1141 --76.1141 --76.1125 --76.1234 --76.125 --76.1109 --76.1047 --76.1141 --76.1094 --76.1094 --76.1141 --76.1172 --76.125 --76.1312 --76.1219 --76.1188 --76.125 --76.1188 --76.1156 --76.1188 --76.1266 --76.1203 --76.1188 --76.1094 --76.1109 --76.1 --76.1156 --76.1203 --76.1078 --76.1078 --76.1125 --76.1109 --76.1062 --76.1172 --76.1031 --76.1062 --76.1203 --76.1219 --76.1031 --76.1203 --76.1109 --76.1031 --76.1094 --76.1188 --76.1125 --76.1109 --76.1094 --76.1156 --76.1078 --76.1016 --76.1141 --76.1016 --76.1219 --76.1203 --76.1125 --76.1016 --76.1219 --76.1109 --76.1219 --76.1156 --76.1234 --76.1203 --76.125 --76.1391 --76.1359 --76.1312 --76.1328 --76.125 --76.1188 --76.1188 --76.1219 --76.1219 --76.1156 --76.125 --76.1188 --76.1344 --76.1328 --76.125 --76.1094 --76.1156 --76.1172 --76.1109 --76.1203 --76.1219 --76.1047 --76.1219 --76.1125 --76.1109 --76.1078 --76.1109 --76.1047 --76.1219 --76.1062 --76.1062 --76.1109 --76.1156 --76.1156 --76.1203 --76.0984 --76.1094 --76.1188 --76.1281 --76.1297 --76.1172 --76.1312 --76.1172 --76.1156 --76.1266 --76.1219 --76.125 --76.1156 --76.1281 --76.1047 --76.1156 --76.1234 --76.1328 --76.1234 --76.1219 --76.1266 --76.1141 --76.1141 --76.1203 --76.1312 --76.1266 --76.1188 --76.125 --76.1328 --76.1188 --76.1266 --76.1172 --76.1188 --76.1234 --76.1219 --76.1078 --76.1172 --76.1234 --76.1203 --76.1203 --76.1125 --76.1094 --76.1141 --76.1297 --76.1188 --76.1297 --76.1219 --76.1141 --76.1109 --76.1188 --76.1156 --76.1203 --76.1062 --76.1062 --76.1125 --76.1188 --76.1141 --76.1094 --76.1125 --76.1219 --76.1406 --76.1328 --76.125 --76.1188 --76.1141 --76.125 --76.125 --76.1 --76.125 --76.1312 --76.1141 --76.1172 --76.1062 --76.1344 --76.1109 --76.1141 --76.1219 --76.1172 --76.1219 --76.1 --76.1141 --76.1109 --76.1188 --76.1172 --76.1172 --76.1328 --76.1156 --76.1172 --76.1188 --76.1219 --76.1109 --76.1172 --76.1266 --76.1188 --76.1234 --76.1188 --76.125 --76.1141 --76.1141 --76.1172 --76.125 --76.0953 --76.1094 --76.1109 --76.1188 --76.1125 --76.125 --76.1125 --76.1219 --76.1141 --76.1312 --76.1203 --76.1125 --76.1234 --76.1125 --76.1219 --76.1188 --76.1234 --76.1047 --76.1234 --76.1297 --76.1281 --76.1266 --76.1156 --76.1141 --76.1219 --76.1141 --76.1297 --76.1234 --76.1203 --76.1234 --76.1016 --76.1156 --76.1234 --76.1109 --76.1172 --76.1188 --76.1078 --76.1078 --76.1156 --76.1203 --76.1172 --76.1297 --76.1219 --76.1281 --76.1234 --76.1375 --76.1094 --76.1281 --76.1266 --76.1219 --76.1141 --76.1031 --76.1266 --76.1219 --76.1062 --76.1234 --76.1141 --76.1109 --76.1016 --76.1109 --76.125 --76.1125 --76.1266 --76.1141 --76.1141 --76.1234 --76.1203 --76.1156 --76.1094 --76.1312 --76.1125 --76.1141 --76.1359 --76.1188 --76.1188 --76.1109 --76.1188 --76.1094 --76.1078 --76.1281 --76.1375 --76.1078 --76.1219 --76.125 --76.1141 --76.1172 --76.1 --76.1203 --76.1156 --76.1281 --76.1219 --76.125 --76.125 --76.125 --76.1266 --76.1172 --76.1078 --76.1141 --76.1156 --76.1203 --76.1172 --76.1109 --76.1094 --76.1094 --76.1234 --76.125 --76.1203 --76.1156 --76.1125 --76.1172 --76.1047 --76.1078 --76.1266 --76.1219 --76.1156 --76.1094 --76.1078 --76.1109 --76.1047 --76.1219 --76.1203 --76.1062 --76.1203 --76.1125 --76.1234 --76.1156 --76.1188 --76.1078 --76.1109 --76.1109 --76.1125 --76.1203 --76.1125 --76.1047 --76.1156 --76.1109 --76.1062 --76.1141 --76.1109 --76.1078 --76.1062 --76.1078 --76.1031 --76.1281 --76.1062 --76.1047 --76.1125 --76.1172 --76.1156 --76.1125 --76.1062 --76.1188 --76.1078 --76.1125 --76.0938 --76.1234 --76.1266 --76.1188 --76.1234 --76.1031 --76.1078 --76.125 --76.1281 --76.1219 --76.1156 --76.1234 --76.1172 --76.1234 --76.1234 --76.1109 --76.1156 --76.1156 --76.125 --76.1234 --76.1031 --76.1203 --76.1203 --76.1266 --76.1156 --76.1359 --76.1172 --76.1188 --76.1203 --76.1141 --76.125 --76.1219 --76.1406 --76.1203 --76.1078 --76.1125 --76.1094 --76.1172 --76.1219 --76.1188 --76.1078 --76.1234 --76.1219 --76.1125 --76.1109 --76.125 --76.1125 --76.1156 --76.0984 --76.1156 --76.1156 --76.1141 --76.1125 --76.125 --76.1031 --76.1062 --76.1172 --76.1078 --76.1078 --76.1172 --76.1172 --76.0969 --76.1078 --76.1266 --76.1141 --76.1266 --76.1 --76.1125 --76.1156 --76.1141 --76.1172 --76.1156 --76.1125 --76.1234 --76.1062 --76.1062 --76.0984 --76.1078 --76.1125 --76.1078 --76.1219 --76.1234 --76.1219 --76.1188 --76.1156 --76.1234 --76.1188 --76.1219 --76.1094 --76.1203 --76.1219 --76.1156 --76.1234 --76.1188 --76.1141 --76.1156 --76.1141 --76.0938 --76.1172 --76.1094 --76.1219 --76.1172 --76.1094 --76.1078 --76.1016 --76.1172 --76.1172 --76.1203 --76.1234 --76.1109 --76.1219 --76.125 --76.1094 --76.1234 --76.1312 --76.1156 --76.1281 --76.1109 --76.1266 --76.1281 --76.1203 --76.1281 --76.1391 --76.1234 --76.1281 --76.1344 --76.1172 --76.1297 --76.1328 --76.1234 --76.1203 --76.1281 --76.1219 --76.1312 --76.1172 --76.1297 --76.1281 --76.1188 --76.1234 --76.125 --76.125 --76.1188 --76.1219 --76.1281 --76.1172 --76.1234 --76.1188 --76.1109 --76.1031 --76.1125 --76.1141 --76.1266 --76.1062 --76.1109 --76.1109 --76.1188 --76.1188 --76.125 --76.1234 --76.1156 --76.1109 --76.1172 --76.1234 --76.1109 --76.1266 --76.1125 --76.1078 --76.125 --76.125 --76.1141 --76.1156 --76.1203 --76.1234 --76.1062 --76.125 --76.1141 --76.1125 --76.1203 --76.1125 --76.1266 --76.1047 --76.1203 --76.1062 --76.1359 --76.1281 --76.1266 --76.1188 --76.1297 --76.1266 --76.1266 --76.1203 --76.1344 --76.125 --76.1203 --76.1359 --76.1172 --76.1203 --76.1078 --76.1188 --76.1297 --76.1297 --76.125 --76.1188 --76.1188 --76.1297 --76.125 --76.1188 --76.1125 --76.1219 --76.1312 --76.1344 --76.1359 --76.1328 --76.1172 --76.1234 --76.1359 --76.1156 --76.1141 --76.1312 --76.1219 --76.1156 --76.1234 --76.1219 --76.1328 --76.125 --76.1297 --76.1156 --76.1344 --76.125 --76.1359 --76.1359 --76.1266 --76.1297 --76.1266 --76.1312 --76.1188 --76.1203 --76.1219 --76.1172 --76.125 --76.1344 --76.1266 --76.1406 --76.1172 --76.1188 --76.1328 --76.1219 --76.1297 --76.1281 --76.1219 --76.1188 --76.1266 --76.1297 --76.1297 --76.1219 --76.1234 --76.1188 --76.1281 --76.1172 --76.1234 --76.1203 --76.1172 --76.1219 --76.1281 --76.1141 --76.1219 --76.1219 --76.1344 --76.1188 --76.1156 --76.1188 --76.1125 --76.1219 --76.1203 --76.1453 --76.1297 --76.1219 --76.1234 --76.1266 --76.1281 --76.1156 --76.1188 --76.1094 --76.1281 --76.1203 --76.1109 --76.1094 --76.1094 --76.1094 --76.1125 --76.1156 --76.1125 --76.1203 --76.1188 --76.1094 --76.1203 --76.1047 --76.1172 --76.1203 --76.1172 --76.1109 --76.1078 --76.1094 --76.1188 --76.1172 --76.1188 --76.1109 --76.1266 --76.125 --76.1109 --76.1141 --76.1234 --76.1156 --76.1203 --76.1312 --76.1219 --76.1172 --76.1 --76.1203 --76.1156 --76.1141 --76.1234 --76.1172 --76.1078 --76.1188 --76.1188 --76.1062 --76.1094 --76.1172 --76.1125 --76.1188 --76.1203 --76.1125 --76.1156 --76.1234 --76.1109 --76.1172 --76.1172 --76.1219 --76.125 --76.1219 --76.1266 --76.1281 --76.1156 --76.125 --76.1188 --76.1188 --76.1297 --76.1 --76.125 --76.1062 --76.1203 --76.1109 --76.1219 --76.1219 --76.1156 --76.1281 --76.1297 --76.1188 --76.125 --76.1047 --76.1172 --76.1234 --76.1188 --76.1328 --76.1172 --76.125 --76.1312 --76.1344 --76.1172 --76.1156 --76.1359 --76.1047 --76.1172 --76.1234 --76.1234 --76.1172 --76.1219 --76.1234 --76.1234 --76.0969 --76.1094 --76.0984 --76.1094 --76.1094 --76.1156 --76.1188 --76.1188 --76.1141 --76.1109 --76.1188 --76.1172 --76.1172 --76.1344 --76.1234 --76.1047 --76.1219 --76.1203 --76.1156 --76.1156 --76.1094 --76.1188 --76.1156 --76.1219 --76.1219 --76.1172 --76.1234 --76.125 --76.1344 --76.1359 --76.1266 --76.1281 --76.1406 --76.1266 --76.125 --76.1281 --76.125 --76.1406 --76.125 --76.1375 --76.1406 --76.1328 --76.1359 --76.1328 --76.125 --76.1188 --76.1391 --76.1344 --76.1219 --76.1188 --76.1203 --76.1219 --76.125 --76.1219 --76.1234 --76.1328 --76.1266 --76.1141 --76.1312 --76.1125 --76.1203 --76.1312 --76.1188 --76.1125 --76.1188 --76.1234 --76.125 --76.1281 --76.1125 --76.1156 --76.1125 --76.1172 --76.1203 --76.1172 --76.1234 --76.1156 --76.1141 --76.125 --76.1188 --76.1203 --76.1219 --76.1172 --76.1 --76.1156 --76.1172 --76.1062 --76.1203 --76.1109 --76.1109 --76.1219 --76.1141 --76.1203 --76.1234 --76.125 --76.1172 --76.1172 --76.1047 --76.1234 --76.1203 --76.1266 --76.1156 --76.1188 --76.1281 --76.1188 --76.1328 --76.1359 --76.1266 --76.1188 --76.125 --76.1141 --76.1188 --76.1234 --76.1297 --76.1172 --76.1312 --76.1203 --76.1156 --76.1188 --76.1219 --76.1141 --76.1172 --76.1125 --76.1125 --76.1297 --76.1125 --76.1078 --76.1203 --76.1172 --76.1266 --76.1141 --76.1219 --76.1172 --76.1156 --76.1094 --76.1234 --76.1078 --76.1078 --76.1172 --76.1203 --76.0969 --76.1156 --76.1109 --76.1156 --76.1156 --76.1094 --76.1156 --76.1188 --76.1156 --76.1219 --76.1203 --76.1141 --76.1156 --76.1188 --76.1203 --76.1172 --76.1219 --76.1203 --76.1281 --76.1141 --76.1328 --76.125 --76.1234 --76.1047 --76.1094 --76.1031 --76.1219 --76.1344 --76.1203 --76.1125 --76.1125 --76.1141 --76.1156 --76.1125 --76.1125 --76.1141 --76.1031 --76.1125 --76.1375 --76.1109 --76.1203 --76.1094 --76.125 --76.1094 --76.1062 --76.1125 --76.1016 --76.1094 --76.1062 --76.1188 --76.1094 --76.1219 --76.1203 --76.1125 --76.1172 --76.1203 --76.1234 --76.1219 --76.1078 --76.1094 --76.1 --76.1062 --76.1 --76.1094 --76.1203 --76.1078 --76.1062 --76.1078 --76.1234 --76.1094 --76.1094 --76.1047 --76.1031 --76.1094 --76.1156 --76.1047 --76.1 --76.1172 --76.1188 --76.1094 --76.0984 --76.1141 --76.1094 --76.1125 --76.1 --76.1 --76.1078 --76.1109 --76.1 --76.1078 --76.1062 --76.1141 --76.1094 --76.1156 --76.1047 --76.1016 --76.0875 --76.0984 --76.0953 --76.1 --76.0984 --76.1047 --76.1156 --76.1078 --76.0969 --76.1125 --76.1125 --76.1125 --76.0922 --76.1125 --76.1172 --76.1047 --76.1016 --76.1031 --76.0969 --76.0922 --76.1047 --76.0969 --76.1078 --76.1109 --76.1 --76.1125 --76.1031 --76.1031 --76.1203 --76.1156 --76.1234 --76.1094 --76.1156 --76.1125 --76.1031 --76.125 --76.1047 --76.1109 --76.1109 --76.1 --76.1047 --76.1125 --76.1109 --76.1109 --76.1219 --76.1094 --76.0984 --76.1203 --76.1125 --76.1141 --76.1016 --76.1047 --76.1188 --76.1125 --76.1203 --76.1234 --76.1156 --76.1203 --76.1172 --76.1281 --76.1125 --76.1141 --76.1016 --76.1125 --76.1062 --76.1062 --76.0984 --76.1188 --76.1062 --76.1125 --76.1062 --76.0969 --76.1203 --76.1125 --76.1109 --76.1188 --76.0984 --76.1031 --76.1125 --76.1297 --76.1094 --76.1078 --76.1031 --76.1156 --76.1031 --76.1234 --76.0984 --76.1109 --76.1156 --76.1281 --76.1297 --76.1281 --76.1172 --76.1172 --76.1188 --76.1297 --76.1281 --76.1219 --76.1125 --76.1109 --76.1188 --76.1078 --76.1094 --76.1078 --76.1172 --76.1094 --76.1 --76.1172 --76.1109 --76.1125 --76.1188 --76.1172 --76.1203 --76.1188 --76.1156 --76.1297 --76.1094 --76.1219 --76.1172 --76.1234 --76.1141 --76.1141 --76.1156 --76.1047 --76.1141 --76.1219 --76.0984 --76.1094 --76.1219 --76.1219 --76.1141 --76.1094 --76.1078 --76.1094 --76.1109 --76.1125 --76.1047 --76.1156 --76.1031 --76.1141 --76.1125 --76.1125 --76.1281 --76.1109 --76.1062 --76.1219 --76.1188 --76.1109 --76.0953 --76.1031 --76.1125 --76.1156 --76.1125 --76.1141 --76.1219 --76.1094 --76.1047 --76.1172 --76.1141 --76.1141 --76.1156 --76.1047 --76.1141 --76.0938 --76.1094 --76.1031 --76.1094 --76.1266 --76.1078 --76.1062 --76.1 --76.1062 --76.1125 --76.1078 --76.0969 --76.1094 --76.0906 --76.1078 --76.1094 --76.0828 --76.0969 --76.0891 --76.0969 --76.1031 --76.1016 --76.1031 --76.0969 --76.1031 --76.1156 --76.1 --76.1 --76.0984 --76.1078 --76.0922 --76.1156 --76.0906 --76.0891 --76.1047 --76.1109 --76.1062 --76.1 --76.1047 --76.1047 --76.0984 --76.1 --76.1062 --76.1078 --76.1031 --76.1047 --76.1172 --76.1234 --76.1125 --76.1219 --76.0969 --76.0984 --76.1031 --76.1109 --76.1078 --76.1078 --76.1094 --76.1062 --76.1 --76.1125 --76.1203 --76.1062 --76.1125 --76.1172 --76.1125 --76.1094 --76.1109 --76.1047 --76.1125 --76.1141 --76.1062 --76.1188 --76.1141 --76.1203 --76.1203 --76.1094 --76.1188 --76.1125 --76.1141 --76.1219 --76.125 --76.1016 --76.1172 --76.125 --76.1125 --76.1062 --76.1234 --76.1203 --76.1062 --76.1156 --76.1047 --76.1 --76.1062 --76.1219 --76.1094 --76.1047 --76.1016 --76.1172 --76.1016 --76.1047 --76.1047 --76.1172 --76.1031 --76.1016 --76.0938 --76.1078 --76.1062 --76.1016 --76.1047 --76.0938 --76.1125 --76.1047 --76.1047 --76.1062 --76.1016 --76.1172 --76.0906 --76.0938 --76.1094 --76.1031 --76.0969 --76.0984 --76.1047 --76.0969 --76.0969 --76.1047 --76.1062 --76.1047 --76.1016 --76.1016 --76.0969 --76.0813 --76.1188 --76.1156 --76.1047 --76.1031 --76.1172 --76.0953 --76.1078 --76.1109 --76.1125 --76.1047 --76.1047 --76.1094 --76.1078 --76.1156 --76.1047 --76.1062 --76.1109 --76.1125 --76.0953 --76.1062 --76.0969 --76.0938 --76.0969 --76.1047 --76.0938 --76.0953 --76.1125 --76.0828 --76.0969 --76.0984 --76.0984 --76.0984 --76.0922 --76.0875 --76.0969 --76.0875 --76.1 --76.0938 --76.0906 --76.0953 --76.0906 --76.0953 --76.0828 --76.0969 --76.0906 --76.0891 --76.0859 --76.0953 --76.0828 --76.0938 --76.0922 --76.1078 --76.0984 --76.0953 --76.0938 --76.1 --76.0984 --76.0953 --76.0922 --76.0953 --76.1031 --76.0875 --76.1031 --76.0984 --76.0922 --76.0906 --76.1047 --76.1031 --76.1094 --76.1016 --76.0984 --76.0938 --76.1062 --76.1109 --76.1 --76.0922 --76.1031 --76.0969 --76.1 --76.1094 --76.1016 --76.1094 --76.0984 --76.1016 --76.1188 --76.1 --76.0922 --76.1141 --76.0813 --76.0859 --76.0953 --76.1 --76.0922 --76.1 --76.1016 --76.1031 --76.0875 --76.0938 --76.0922 --76.1 --76.0969 --76.1062 --76.0906 --76.1016 --76.0984 --76.0875 --76.0938 --76.1047 --76.1 --76.0813 --76.0906 --76.1141 --76.0953 --76.1062 --76.0938 --76.0969 --76.0797 --76.0938 --76.0859 --76.0813 --76.1 --76.0859 --76.0844 --76.0953 --76.0797 --76.0828 --76.0906 --76.0969 --76.0922 --76.0969 --76.0875 --76.0828 --76.0922 --76.0922 --76.0781 --76.0859 --76.0813 --76.0984 --76.0844 --76.1078 --76.0953 --76.0922 --76.0891 --76.0938 --76.0781 --76.0875 --76.0969 --76.0813 --76.1094 --76.0859 --76.0906 --76.0938 --76.1078 --76.0969 --76.0906 --76.1016 --76.0922 --76.0969 --76.0891 --76.0766 --76.1016 --76.0906 --76.0875 --76.0938 --76.0766 --76.0953 --76.0875 --76.0813 --76.0938 --76.0797 --76.0891 --76.0797 --76.0875 --76.1 --76.0922 --76.0938 --76.0984 --76.0906 --76.0938 --76.0813 --76.1062 --76.0891 --76.0922 --76.0922 --76.0953 --76.0797 --76.0766 --76.0828 --76.0828 --76.0719 --76.0828 --76.075 --76.0891 --76.0781 --76.0859 --76.0875 --76.0953 --76.0844 --76.0891 --76.0891 --76.0938 --76.0984 --76.0891 --76.0906 --76.0922 --76.1 --76.0938 --76.0953 --76.0875 --76.0891 --76.1125 --76.1 --76.1 --76.1078 --76.1094 --76.0984 --76.1047 --76.1016 --76.1109 --76.1016 --76.0953 --76.1078 --76.1078 --76.0922 --76.1 --76.1156 --76.0969 --76.1078 --76.1 --76.1141 --76.1031 --76.1188 --76.1203 --76.1234 --76.1141 --76.1156 --76.0984 --76.1172 --76.1047 --76.1078 --76.1141 --76.1141 --76.1031 --76.1078 --76.1125 --76.1188 --76.1031 --76.0984 --76.1016 --76.1141 --76.0938 --76.1094 --76.1016 --76.1125 --76.1172 --76.1188 --76.1094 --76.1094 --76.1016 --76.1 --76.1203 --76.1141 --76.1109 --76.1078 --76.1031 --76.1078 --76.1109 --76.1078 --76.1047 --76.1 --76.1094 --76.1031 --76.0969 --76.0984 --76.0922 --76.1062 --76.1125 --76.0984 --76.0875 --76.1094 --76.0938 --76.0953 --76.0969 --76.1 --76.0859 --76.1016 --76.0922 --76.0969 --76.0969 --76.0969 --76.0953 --76.0844 --76.0891 --76.0984 --76.1016 --76.0906 --76.0734 --76.0922 --76.0813 --76.0922 --76.0844 --76.0922 --76.0953 --76.0953 --76.0891 --76.0984 --76.1047 --76.0844 --76.1094 --76.0922 --76.0922 --76.1 --76.0984 --76.0969 --76.1016 --76.0953 --76.0969 --76.0875 --76.1031 --76.0891 --76.0844 --76.1109 --76.0844 --76.0875 --76.0859 --76.0891 --76.0891 --76.0984 --76.1031 --76.0859 --76.0922 --76.0906 --76.0891 --76.0953 --76.0766 --76.0953 --76.0703 --76.1078 --76.0891 --76.0875 --76.1031 --76.0828 --76.0844 --76.0953 --76.0891 --76.0875 --76.0844 --76.0969 --76.0875 --76.0953 --76.0891 --76.0891 --76.0844 --76.0813 --76.0984 --76.0844 --76.0891 --76.0813 --76.0844 --76.0766 --76.0859 --76.0781 --76.0844 --76.0719 --76.0781 --76.0844 --76.0719 --76.0922 --76.0906 --76.1 --76.0859 --76.0828 --76.0938 --76.1047 --76.0859 --76.0906 --76.1062 --76.1078 --76.1031 --76.1016 --76.0969 --76.0891 --76.1062 --76.0922 --76.1078 --76.0906 --76.1062 --76.0922 --76.1016 --76.1062 --76.1016 --76.0938 --76.1062 --76.0969 --76.0813 --76.0938 --76.0906 --76.0984 --76.1016 --76.0984 --76.0969 --76.0938 --76.1047 --76.0938 --76.1 --76.0938 --76.1031 --76.0922 --76.1188 --76.0969 --76.1109 --76.0891 --76.0953 --76.0938 --76.0859 --76.0922 --76.0969 --76.0891 --76.0813 --76.1 --76.0953 --76.0984 --76.0938 --76.0828 --76.1 --76.0828 --76.0922 --76.0828 --76.0922 --76.0922 --76.0938 --76.1016 --76.0781 --76.0844 --76.1031 --76.0938 --76.0938 --76.0969 --76.0922 --76.0984 --76.1031 --76.0984 --76.0969 --76.0938 --76.0938 --76.0969 --76.0969 --76.0703 --76.0891 --76.0891 --76.0797 --76.0984 --76.0891 --76.0938 --76.0672 --76.0859 --76.0844 --76.0906 --76.1031 --76.0922 --76.1047 --76.0922 --76.1062 --76.1047 --76.0969 --76.1016 --76.1016 --76.0953 --76.0891 --76.1031 --76.0969 --76.0922 --76.0891 --76.0922 --76.0922 --76.0844 --76.1 --76.0984 --76.0891 --76.0828 --76.0953 --76.0828 --76.0875 --76.0766 --76.0859 --76.1 --76.075 --76.0797 --76.0922 --76.1062 --76.0828 --76.0922 --76.1016 --76.0734 --76.1094 --76.0938 --76.0891 --76.0875 --76.0797 --76.0828 --76.0766 --76.0938 --76.0859 --76.1016 --76.1 --76.0891 --76.0906 --76.0969 --76.0984 --76.0891 --76.1016 --76.1109 --76.0844 --76.1047 --76.0844 --76.1031 --76.0953 --76.0938 --76.0891 --76.0844 --76.0953 --76.0953 --76.0813 --76.0844 --76.0859 --76.0797 --76.0953 --76.0813 --76.0766 --76.0859 --76.1 --76.0906 --76.0813 --76.0875 --76.0922 --76.0828 --76.0859 --76.075 --76.0734 --76.0891 --76.0766 --76.0875 --76.0719 --76.1062 --76.0875 --76.0844 --76.0875 --76.0859 --76.1031 --76.0938 --76.0938 --76.0906 --76.0938 --76.0828 --76.0859 --76.0969 --76.0891 --76.0875 --76.0906 --76.0922 --76.0828 --76.0953 --76.0953 --76.0922 --76.0641 --76.0953 --76.0859 --76.0953 --76.0813 --76.0875 --76.0797 --76.0781 --76.0781 --76.0875 --76.0766 --76.1031 --76.0953 --76.0797 --76.0984 --76.0953 --76.0906 --76.1031 --76.0875 --76.0938 --76.0844 --76.0938 --76.0953 --76.0859 --76.0891 --76.0797 --76.0844 --76.0875 --76.0844 --76.0828 --76.0938 --76.075 --76.0875 --76.0813 --76.0984 --76.0875 --76.0969 --76.0875 --76.0875 --76.0938 --76.0984 --76.0969 --76.0859 --76.1016 --76.0922 --76.0891 --76.0984 --76.0922 --76.0766 --76.0891 --76.0797 --76.0797 --76.0891 --76.0891 --76.0859 --76.0859 --76.0813 --76.0906 --76.0953 --76.0797 --76.0813 --76.1 --76.0891 --76.1 --76.1 --76.0953 --76.0953 --76.0875 --76.1062 --76.0953 --76.0891 --76.0906 --76.0938 --76.1031 --76.0813 --76.0984 --76.0938 --76.0859 --76.1062 --76.0969 --76.0969 --76.1031 --76.1172 --76.0969 --76.1078 --76.1047 --76.0875 --76.1 --76.1031 --76.0906 --76.1062 --76.0891 --76.1047 --76.1062 --76.1047 --76.0922 --76.0906 --76.0844 --76.0859 --76.0891 --76.0797 --76.0844 --76.1016 --76.0969 --76.0984 --76.1031 --76.0875 --76.0781 --76.0828 --76.0922 --76.0922 --76.0922 --76.0906 --76.0859 --76.0859 --76.1 --76.0891 --76.0922 --76.0766 --76.0906 --76.0828 --76.1031 --76.0813 --76.0875 --76.1 --76.0922 --76.0938 --76.0859 --76.0875 --76.0906 --76.0953 --76.0906 --76.0969 --76.1078 --76.0938 --76.0922 --76.0938 --76.0844 --76.0813 --76.0906 --76.0953 --76.1 --76.1016 --76.1016 --76.1109 --76.0828 --76.0906 --76.0813 --76.0875 --76.0844 --76.1 --76.0922 --76.0875 --76.1047 --76.1094 --76.1031 --76.0938 --76.0891 --76.0859 --76.0906 --76.0938 --76.0969 --76.0938 --76.0875 --76.0891 --76.0906 --76.0906 --76.0797 --76.0953 --76.0875 --76.0844 --76.0922 --76.0891 --76.0891 --76.1 --76.0891 --76.1094 --76.0953 --76.1047 --76.0891 --76.1016 --76.1031 --76.1062 --76.0938 --76.0828 --76.0844 --76.1078 --76.0969 --76.0984 --76.0953 --76.1 --76.1016 --76.1078 --76.0984 --76.1 --76.0969 --76.1016 --76.0906 --76.0828 --76.0813 --76.0906 --76.0984 --76.0922 --76.0891 --76.0906 --76.0938 --76.0906 --76.0969 --76.0984 --76.0859 --76.1 --76.0953 --76.1 --76.0922 --76.0891 --76.1062 --76.0875 --76.0953 --76.0906 --76.0953 --76.0938 --76.0859 --76.0891 --76.0938 --76.1078 --76.0828 --76.0766 --76.0844 --76.0938 --76.1 --76.0891 --76.0969 --76.1062 --76.1016 --76.1062 --76.0891 --76.1 --76.1047 --76.0875 --76.0906 --76.0906 --76.0984 --76.0906 --76.0938 --76.0938 --76.0828 --76.0922 --76.0953 --76.0875 --76.0797 --76.1016 --76.0859 --76.0906 --76.0813 --76.0844 --76.0844 --76.0859 --76.0969 --76.0984 --76.0953 --76.0969 --76.0906 --76.1062 --76.0813 --76.0984 --76.0938 --76.0906 --76.0922 --76.0813 --76.0922 --76.0953 --76.0875 --76.0938 --76.1016 --76.0938 --76.0844 --76.0844 --76.0969 --76.0781 --76.0875 --76.0969 --76.1016 --76.0922 --76.0906 --76.0969 --76.1 --76.0938 --76.0984 --76.0844 --76.0984 --76.0984 --76.0953 --76.0891 --76.0938 --76.0922 --76.0922 --76.0984 --76.0953 --76.0703 --76.0891 --76.1031 --76.0922 --76.0922 --76.1031 --76.1 --76.1 --76.1031 --76.0891 --76.1031 --76.0953 --76.0875 --76.1031 --76.1047 --76.1031 --76.1016 --76.1 --76.1031 --76.0938 --76.1016 --76.1031 --76.0844 --76.0984 --76.0844 --76.1016 --76.0938 --76.1078 --76.1 --76.1031 --76.1234 --76.0922 --76.0969 --76.0891 --76.0813 --76.1094 --76.0953 --76.1 --76.1062 --76.0891 --76.0969 --76.1078 --76.1031 --76.1047 --76.0953 --76.1031 --76.0969 --76.0938 --76.1031 --76.0938 --76.0938 --76.0859 --76.0953 --76.0938 --76.0859 --76.0969 --76.0969 --76.0984 --76.0953 --76.0922 --76.0844 --76.1156 --76.1016 --76.125 --76.1047 --76.0891 --76.0984 --76.1016 --76.1062 --76.1 --76.1078 --76.0953 --76.1031 --76.0922 --76.0875 --76.1 --76.1016 --76.0906 --76.0922 --76.1156 --76.0797 --76.0984 --76.0969 --76.1016 --76.0875 --76.0828 --76.0984 --76.0875 --76.0984 --76.0984 --76.0984 --76.0828 --76.0969 --76.1047 --76.0875 --76.0953 --76.0953 --76.1062 --76.0906 --76.0906 --76.0875 --76.0891 --76.0984 --76.1047 --76.1078 --76.1016 --76.0938 --76.1 --76.1 --76.1094 --76.0922 --76.1016 --76.0891 --76.0906 --76.0844 --76.1156 --76.1016 --76.1062 --76.0953 --76.0984 --76.1125 --76.0984 --76.1031 --76.0906 --76.1062 --76.0984 --76.1172 --76.1062 --76.0844 --76.1125 --76.0922 --76.1094 --76.0906 --76.0984 --76.0875 --76.0984 --76.0891 --76.0891 --76.1 --76.0813 --76.1109 --76.1094 --76.1062 --76.0875 --76.0859 --76.0828 --76.1062 --76.0891 --76.0984 --76.0984 --76.0984 --76.0891 --76.1016 --76.0766 --76.0953 --76.0938 --76.0891 --76.0906 --76.1094 --76.0859 --76.0891 --76.1078 --76.0969 --76.1 --76.1 --76.0969 --76.1047 --76.0906 --76.0813 --76.0875 --76.0813 --76.1016 --76.0875 --76.1125 --76.1125 --76.1 --76.0906 --76.0984 --76.1047 --76.0984 --76.0969 --76.0891 --76.1062 --76.0906 --76.1016 --76.0906 --76.0953 --76.1 --76.1031 --76.1109 --76.0906 --76.0906 --76.1141 --76.0938 --76.1062 --76.1109 --76.0922 --76.0969 --76.1031 --76.1188 --76.0891 --76.0953 --76.1156 --76.1062 --76.0922 --76.1047 --76.0859 --76.0813 --76.0891 --76.0922 --76.1094 --76.0938 --76.0938 --76.1094 --76.1031 --76.0875 --76.0906 --76.1 --76.0922 --76.0984 --76.0938 --76.0844 --76.0922 --76.0906 --76.0969 --76.0953 --76.1 --76.0984 --76.0938 --76.1047 --76.0969 --76.0891 --76.0922 --76.0813 --76.1 --76.0953 --76.0938 --76.0938 --76.0938 --76.1078 --76.0953 --76.075 --76.0906 --76.0891 --76.0875 --76.1031 --76.0891 --76.1016 --76.0766 --76.0844 --76.0719 --76.0922 --76.1031 --76.0844 --76.0891 --76.0984 --76.0922 --76.0953 --76.0844 --76.0891 --76.0875 --76.0922 --76.0797 --76.0891 --76.0891 --76.1 --76.0984 --76.1016 --76.0938 --76.0938 --76.0984 --76.1031 --76.0969 --76.1 --76.0906 --76.1031 --76.1125 --76.0859 --76.0938 --76.1031 --76.0938 --76.0938 --76.0984 --76.0953 --76.0875 --76.0922 --76.0875 --76.1031 --76.0953 --76.0922 --76.1 --76.1031 --76.0938 --76.0984 --76.0766 --76.1109 --76.0938 --76.0969 --76.0797 --76.0969 --76.0953 --76.0953 --76.1047 --76.0891 --76.0922 --76.0984 --76.0844 --76.0953 --76.0984 --76.0922 --76.0859 --76.1 --76.0969 --76.0969 --76.0922 --76.0922 --76.1109 --76.0969 --76.0938 --76.0984 --76.1062 --76.1078 --76.0875 --76.1047 --76.0969 --76.0938 --76.1172 --76.0906 --76.0859 --76.1078 --76.0906 --76.1016 --76.0922 --76.1094 --76.0906 --76.1047 --76.0906 --76.1016 --76.0969 --76.0984 --76.0938 --76.1031 --76.1125 --76.0953 --76.0984 --76.0922 --76.0969 --76.1172 --76.0922 --76.0875 --76.1078 --76.1 --76.0969 --76.1 --76.0969 --76.0953 --76.1 --76.0906 --76.0969 --76.0969 --76.0687 --76.0969 --76.0859 --76.0859 --76.0938 --76.0953 --76.0906 --76.0891 --76.0969 --76.0969 --76.0938 --76.0797 --76.0875 --76.0875 --76.0859 --76.1047 --76.0813 --76.0906 --76.0922 --76.0844 --76.0984 --76.0953 --76.0891 --76.0906 --76.0906 --76.0859 --76.0844 --76.0922 --76.0922 --76.0984 --76.1 --76.1016 --76.1109 --76.1125 --76.1 --76.0906 --76.0875 --76.0859 --76.0906 --76.0844 --76.0813 --76.0906 --76.0828 --76.0938 --76.0891 --76.0859 --76.0828 --76.0906 --76.0875 --76.0969 --76.0828 --76.0953 --76.0875 --76.0922 --76.0984 --76.1 --76.0781 --76.075 --76.0875 --76.0813 --76.0813 --76.0891 --76.0813 --76.0766 --76.0859 --76.0891 --76.0953 --76.0797 --76.0797 --76.0766 --76.0906 --76.0984 --76.0906 --76.0969 --76.0938 --76.0891 --76.0953 --76.0859 --76.1016 --76.0953 --76.1031 --76.0891 --76.0891 --76.1031 --76.0906 --76.0891 --76.0984 --76.0828 --76.0969 --76.0813 --76.0938 --76.0938 --76.1031 --76.0969 --76.0938 --76.1 --76.0859 --76.0813 --76.0797 --76.0844 --76.0953 --76.0891 --76.0844 --76.075 --76.0938 --76.0953 --76.0953 --76.0828 --76.0797 --76.0938 --76.0891 --76.0906 --76.0891 --76.0766 --76.0969 --76.0859 --76.0797 --76.1016 --76.0906 --76.0781 --76.0875 --76.0938 --76.0813 --76.0766 --76.0766 --76.0891 --76.0844 --76.0891 --76.0797 --76.0969 --76.0859 --76.1062 --76.0906 --76.0906 --76.1 --76.0891 --76.0828 --76.0906 --76.0844 --76.0906 --76.0844 --76.0906 --76.0953 --76.0844 --76.0891 --76.0906 --76.0859 --76.0813 --76.0797 --76.0781 --76.0859 --76.1016 --76.0828 --76.0875 --76.1016 --76.0828 --76.0922 --76.0969 --76.0891 --76.0734 --76.0734 --76.0938 --76.1031 --76.0969 --76.0703 --76.0875 --76.0844 --76.0766 --76.0906 --76.0875 --76.1 --76.0859 --76.0891 --76.0938 --76.0781 --76.0813 --76.0969 --76.0781 --76.1016 --76.0969 --76.0891 --76.0813 --76.0859 --76.0781 --76.0969 --76.1031 --76.075 --76.0828 --76.0859 --76.0813 --76.1016 --76.1016 --76.0813 --76.0859 --76.0781 --76.0844 --76.0969 --76.0859 --76.0859 --76.0922 --76.0813 --76.0891 --76.0891 --76.0875 --76.0766 --76.0844 --76.0906 --76.0859 --76.0891 --76.0844 --76.0844 --76.0859 --76.0828 --76.0859 --76.0844 --76.0953 --76.0797 --76.0797 --76.0844 --76.0844 --76.0781 --76.0625 --76.0781 --76.0687 --76.0938 --76.0766 --76.0813 --76.075 --76.0797 --76.0797 --76.0938 --76.0703 --76.0891 --76.0844 --76.0687 --76.0969 --76.075 --76.0953 --76.0875 --76.0781 --76.0875 --76.0734 --76.0953 --76.0906 --76.0953 --76.0906 --76.0953 --76.0813 --76.0656 --76.0953 --76.0766 --76.0703 --76.0984 --76.0859 --76.0922 --76.0844 --76.0859 --76.0813 --76.0828 --76.0875 --76.0844 --76.0922 --76.0844 --76.0859 --76.0922 --76.0875 --76.0906 --76.0859 --76.0922 --76.0844 --76.0859 --76.0922 --76.0859 --76.0938 --76.0797 --76.0875 --76.0859 --76.0859 --76.0797 --76.0906 --76.0797 --76.0797 --76.0797 --76.0828 --76.0844 --76.0766 --76.0797 --76.0656 --76.0844 --76.0766 --76.0641 --76.0875 --76.0797 --76.0797 --76.0766 --76.0781 --76.0734 --76.0844 --76.075 --76.0891 --76.0703 --76.0828 --76.0703 --76.0719 --76.0984 --76.0734 --76.0766 --76.0703 --76.0734 --76.0672 --76.0734 --76.0656 --76.0766 --76.075 --76.0672 --76.0781 --76.0656 --76.0687 --76.0719 --76.0859 --76.0766 --76.0656 --76.0656 --76.075 --76.0687 --76.0828 --76.0781 --76.0734 --76.0828 --76.0828 --76.075 --76.0781 --76.0891 --76.0828 --76.0719 --76.0797 --76.0734 --76.0719 --76.0813 --76.0656 --76.0844 --76.0844 --76.0891 --76.0609 --76.0734 --76.0813 --76.0719 --76.0781 --76.0703 --76.0813 --76.0875 --76.075 --76.0766 --76.0906 --76.0797 --76.0703 --76.0906 --76.075 --76.0781 --76.0672 --76.0875 --76.0797 --76.0656 --76.0734 --76.0922 --76.0875 --76.0828 --76.0703 --76.0734 --76.0813 --76.0844 --76.0781 --76.0875 --76.0891 --76.0953 --76.0828 --76.0703 --76.0734 --76.0828 --76.0828 --76.0687 --76.0922 --76.0813 --76.0813 --76.0766 --76.0859 --76.0875 --76.0781 --76.075 --76.0672 --76.0828 --76.0641 --76.0797 --76.0703 --76.0797 --76.0703 --76.0813 --76.0734 --76.0734 --76.0781 --76.0828 --76.0844 --76.0844 --76.0734 --76.0766 --76.0844 --76.0594 --76.0781 --76.0719 --76.0609 --76.0641 --76.0641 --76.0641 --76.0703 --76.0687 --76.075 --76.0734 --76.0672 --76.0719 --76.0609 --76.0797 --76.0734 --76.0656 --76.0672 --76.0563 --76.0594 --76.0625 --76.075 --76.0797 --76.0766 --76.0813 --76.0672 --76.0687 --76.075 --76.0797 --76.0687 --76.0766 --76.0656 --76.0656 --76.0578 --76.0641 --76.0734 --76.0719 --76.0672 --76.0813 --76.0656 --76.0641 --76.0656 --76.0625 --76.0609 --76.0734 --76.0813 --76.0672 --76.0625 --76.075 --76.0641 --76.0734 --76.0734 --76.0703 --76.0625 --76.0781 --76.0687 --76.0703 --76.0641 --76.0703 --76.0828 --76.0687 --76.0969 --76.0641 --76.0656 --76.0781 --76.0656 --76.075 --76.0781 --76.0719 --76.0781 --76.0672 --76.0828 --76.075 --76.0703 --76.075 --76.0672 --76.0797 --76.0656 --76.0672 --76.0578 --76.0625 --76.0641 --76.075 --76.0781 --76.0781 --76.0703 --76.0844 --76.0734 --76.0734 --76.0703 --76.0625 --76.0781 --76.0719 --76.0672 --76.0469 --76.0766 --76.0531 --76.0594 --76.0703 --76.0719 --76.0531 --76.0625 --76.0625 --76.0609 --76.0469 --76.05 --76.0703 --76.0672 --76.0687 --76.0656 --76.0453 --76.0641 --76.0609 --76.0594 --76.0703 --76.0719 --76.0687 --76.0609 --76.0609 --76.0703 --76.0641 --76.0672 --76.0734 --76.0672 --76.0734 --76.075 --76.0578 --76.0547 --76.0656 --76.0766 --76.0641 --76.0656 --76.0719 --76.0641 --76.0703 --76.0719 --76.0813 --76.0734 --76.0734 --76.0672 --76.0781 --76.0859 --76.0703 --76.0672 --76.0687 --76.0656 --76.0797 --76.0594 --76.0687 --76.0641 --76.0609 --76.0766 --76.0797 --76.0719 --76.0656 --76.0656 --76.0672 --76.0578 --76.0453 --76.0625 --76.0609 --76.0641 --76.0703 --76.0813 --76.0687 --76.0547 --76.0547 --76.0578 --76.0516 --76.075 --76.0609 --76.0734 --76.0687 --76.0734 --76.0781 --76.0703 --76.0641 --76.0703 --76.0719 --76.0578 --76.0734 --76.0578 --76.0625 --76.0641 --76.0563 --76.0563 --76.0766 --76.0516 --76.05 --76.0609 --76.0641 --76.0516 --76.0656 --76.0641 --76.0625 --76.0687 --76.0594 --76.0594 --76.0672 --76.0594 --76.0625 --76.075 --76.0672 --76.0563 --76.0625 --76.0609 --76.0531 --76.0547 --76.0672 --76.0563 --76.0406 --76.0437 --76.0719 --76.0641 --76.0437 --76.0453 --76.0641 --76.0563 --76.0672 --76.0547 --76.0578 --76.0563 --76.0547 --76.0703 --76.05 --76.0719 --76.0781 --76.0703 --76.075 --76.0578 --76.0609 --76.0656 --76.0391 --76.0594 --76.0578 --76.0578 --76.0563 --76.0625 --76.0563 --76.0625 --76.0609 --76.0563 --76.0672 --76.0531 --76.0625 --76.0547 --76.0641 --76.0609 --76.0719 --76.0547 --76.0484 --76.075 --76.0563 --76.0703 --76.075 --76.0594 --76.0516 --76.0719 --76.0547 --76.0563 --76.0641 --76.0766 --76.0687 --76.0625 --76.05 --76.0531 --76.0547 --76.0594 --76.05 --76.0734 --76.0656 --76.0609 --76.0563 --76.0563 --76.0641 --76.0625 --76.0672 --76.0547 --76.0563 --76.0641 --76.0594 --76.0672 --76.0594 --76.0641 --76.0609 --76.0437 --76.0609 --76.0547 --76.0578 --76.0656 --76.0734 --76.0391 --76.0547 --76.0594 --76.0547 --76.0703 --76.0609 --76.0594 --76.0578 --76.0547 --76.0594 --76.0609 --76.0703 --76.0656 --76.0609 --76.0484 --76.0594 --76.0516 --76.0578 --76.0453 --76.0531 --76.0687 --76.0578 --76.0656 --76.0609 --76.0563 --76.0625 --76.0609 --76.075 --76.0563 --76.0641 --76.0484 --76.0656 --76.0516 --76.0406 --76.0453 --76.0422 --76.05 --76.0437 --76.0516 --76.0422 --76.05 --76.0625 --76.0563 --76.0625 --76.0563 --76.05 --76.0516 --76.0609 --76.0594 --76.0531 --76.0484 --76.0469 --76.0437 --76.0406 --76.0453 --76.0516 --76.0531 --76.0484 --76.0547 --76.0547 --76.0453 --76.0531 --76.0469 --76.0469 --76.0594 --76.0453 --76.0578 --76.0437 --76.0547 --76.0703 --76.0578 --76.0609 --76.0437 --76.0625 --76.05 --76.0453 --76.0578 --76.05 --76.0578 --76.0641 --76.0656 --76.0656 --76.0625 --76.0672 --76.0563 --76.0531 --76.0547 --76.0422 --76.0641 --76.0594 --76.0547 --76.0531 --76.0516 --76.0578 --76.0641 --76.0469 --76.0609 --76.0531 --76.0609 --76.05 --76.0469 --76.05 --76.0484 --76.0453 --76.0469 --76.0531 --76.0609 --76.0578 --76.0516 --76.0484 --76.0641 --76.0516 --76.05 --76.0453 --76.0578 --76.0547 --76.0563 --76.0703 --76.0563 --76.0672 --76.0563 --76.0641 --76.0641 --76.0641 --76.0609 --76.075 --76.0531 --76.0672 --76.0625 --76.0563 --76.0656 --76.0516 --76.0453 --76.0563 --76.0656 --76.0609 --76.0703 --76.0625 --76.0594 --76.0625 --76.0516 --76.0672 --76.0563 --76.0563 --76.075 --76.0672 --76.0578 --76.0625 --76.0547 --76.0578 --76.0625 --76.0625 --76.0516 --76.0625 --76.0672 --76.0609 --76.0594 --76.05 --76.0531 --76.0672 --76.0453 --76.0578 --76.0594 --76.05 --76.0625 --76.0437 --76.0516 --76.0609 --76.0563 --76.0437 --76.0453 --76.0594 --76.0547 --76.0578 --76.0563 --76.0437 --76.0578 --76.0531 --76.0625 --76.0469 --76.0531 --76.0656 --76.0516 --76.0625 --76.0437 --76.0687 --76.0406 --76.0484 --76.0719 --76.0547 --76.0531 --76.0516 --76.0484 --76.0594 --76.05 --76.0547 --76.0484 --76.0687 --76.0531 --76.0656 --76.0594 --76.0609 --76.0516 --76.0719 --76.05 --76.0578 --76.0625 --76.0625 --76.0484 --76.0594 --76.0563 --76.0766 --76.0656 --76.0578 --76.0531 --76.0625 --76.0609 --76.0625 --76.0703 --76.0469 --76.0563 --76.0453 --76.0516 --76.0516 --76.0531 --76.0609 --76.0625 --76.0469 --76.0531 --76.0547 --76.0563 --76.0687 --76.0656 --76.0687 --76.0563 --76.0609 --76.0516 --76.0656 --76.0594 --76.0672 --76.0609 --76.0734 --76.0672 --76.0609 --76.0687 --76.0766 --76.0687 --76.0625 --76.0797 --76.075 --76.0672 --76.0672 --76.0687 --76.0609 --76.0531 --76.0531 --76.0578 --76.0687 --76.0625 --76.0687 --76.0703 --76.0547 --76.0594 --76.0641 --76.0516 --76.0672 --76.0516 --76.0578 --76.0563 --76.0625 --76.0594 --76.0641 --76.0406 --76.0687 --76.0578 --76.0578 --76.0719 --76.0531 --76.0703 --76.0609 --76.0672 --76.0578 --76.0594 --76.0531 --76.0719 --76.0703 --76.0734 --76.0547 --76.0594 --76.0703 --76.0687 --76.0687 --76.0687 --76.0625 --76.0687 --76.0594 --76.0766 --76.0594 --76.0656 --76.0641 --76.0469 --76.0625 --76.0563 --76.0625 --76.0563 --76.0703 --76.0594 --76.0719 --76.0547 --76.0703 --76.0531 --76.0594 --76.0578 --76.0437 --76.0797 --76.0625 --76.0563 --76.05 --76.0563 --76.0656 --76.0578 --76.0687 --76.0578 --76.0437 --76.0656 --76.0547 --76.0609 --76.0625 --76.0625 --76.0578 --76.0734 --76.0531 --76.05 --76.0734 --76.0625 --76.0609 --76.075 --76.0609 --76.0656 --76.0687 --76.0687 --76.0594 --76.0594 --76.0625 --76.0641 --76.0656 --76.0609 --76.0453 --76.0641 --76.0734 --76.0766 --76.075 --76.0828 --76.075 --76.0703 --76.0672 --76.0641 --76.0734 --76.0672 --76.0641 --76.0672 --76.0672 --76.0672 --76.0594 --76.0625 --76.0594 --76.0641 --76.0625 --76.0766 --76.0687 --76.0531 --76.0594 --76.0563 --76.0719 --76.0656 --76.0437 --76.0547 --76.0469 --76.0734 --76.0406 --76.0609 --76.0656 --76.0641 --76.0625 --76.0469 --76.0672 --76.0703 --76.0687 --76.0687 --76.0766 --76.05 --76.0734 --76.0828 --76.0672 --76.0687 --76.0672 --76.0641 --76.0719 --76.0625 --76.0484 --76.0703 --76.0687 --76.0703 --76.0672 --76.075 --76.0516 --76.0672 --76.0703 --76.0609 --76.0578 --76.0672 --76.0594 --76.0687 --76.0687 --76.0703 --76.0859 --76.0687 --76.0734 --76.0609 --76.0719 --76.0828 --76.0625 --76.075 --76.0641 --76.075 --76.0734 --76.0547 --76.0703 --76.0734 --76.0734 --76.0703 --76.0875 --76.0719 --76.0781 --76.0563 --76.0734 --76.0672 --76.0813 --76.0813 --76.0687 --76.0734 --76.0656 --76.0891 --76.075 --76.0563 --76.075 --76.0672 --76.0781 --76.0734 --76.075 --76.075 --76.0609 --76.0703 --76.0813 --76.0578 --76.0687 --76.0641 --76.0813 --76.0703 --76.0609 --76.0719 --76.0547 --76.0609 --76.0594 --76.0719 --76.0625 --76.0547 --76.0578 --76.0656 --76.05 --76.0609 --76.0719 --76.0687 --76.0625 --76.0781 --76.0563 --76.0656 --76.0609 --76.0484 --76.0844 --76.0578 --76.0656 --76.0687 --76.0516 --76.0531 --76.0531 --76.05 --76.0609 --76.0531 --76.0484 --76.0453 --76.0531 --76.0594 --76.0656 --76.0516 --76.0516 --76.0609 --76.0625 --76.0563 --76.0531 --76.0484 --76.0516 --76.0516 --76.0469 --76.0547 --76.0484 --76.0594 --76.0484 --76.0453 --76.0516 --76.0625 --76.0641 --76.0625 --76.0531 --76.05 --76.0594 --76.0609 --76.0547 --76.0516 --76.0578 --76.0531 --76.0687 --76.0531 --76.0594 --76.0563 --76.0625 --76.0594 --76.0609 --76.0625 --76.0531 --76.0437 --76.05 --76.0547 --76.0609 --76.0656 --76.0594 --76.0734 --76.0719 --76.0547 --76.0672 --76.0641 --76.0516 --76.0766 --76.0656 --76.0578 --76.0516 --76.0594 --76.0687 --76.0766 --76.0609 --76.0734 --76.0734 --76.0719 --76.0625 --76.0734 --76.0672 --76.0594 --76.0703 --76.0531 --76.0625 --76.0656 --76.0781 --76.0797 --76.0781 --76.0687 --76.0672 --76.0656 --76.0719 --76.0734 --76.0609 --76.0563 --76.0781 --76.0656 --76.0578 --76.0719 --76.0703 --76.0563 --76.0625 --76.0625 --76.0719 --76.0531 --76.0625 --76.0687 --76.0578 --76.075 --76.0656 --76.0563 --76.0531 --76.0594 --76.0594 --76.0594 --76.0563 --76.0594 --76.0578 --76.0594 --76.0766 --76.0609 --76.0766 --76.0656 --76.0578 --76.0547 --76.0609 --76.0641 --76.05 --76.0797 --76.0766 --76.0703 --76.05 --76.0656 --76.0594 --76.0578 --76.0594 --76.0531 --76.0687 --76.0563 --76.0641 --76.0656 --76.0594 --76.0609 --76.05 --76.0641 --76.0578 --76.0547 --76.0578 --76.0625 --76.0625 --76.0547 --76.05 --76.0484 --76.0547 --76.0547 --76.0547 --76.0594 --76.075 --76.0828 --76.0672 --76.0547 --76.0609 --76.0734 --76.075 --76.0687 --76.0703 --76.0719 --76.0766 --76.0578 --76.0531 --76.0703 --76.0703 --76.0594 --76.0625 --76.0578 --76.0547 --76.0437 --76.0563 --76.0594 --76.075 --76.0531 --76.0641 --76.075 --76.0609 --76.0656 --76.0641 --76.0641 --76.0719 --76.0641 --76.0656 --76.0578 --76.0687 --76.0578 --76.0672 --76.0625 --76.0734 --76.0578 --76.0531 --76.0719 --76.0656 --76.0516 --76.0625 --76.0672 --76.075 --76.0797 --76.0672 --76.0531 --76.0656 --76.0672 --76.0766 --76.0578 --76.0578 --76.0734 --76.0719 --76.0687 --76.0609 --76.0859 --76.0531 --76.0656 --76.0781 --76.0656 --76.0781 --76.0734 --76.0672 --76.0656 --76.0563 --76.0563 --76.0703 --76.0516 --76.0734 --76.0781 --76.0797 --76.0609 --76.0719 --76.0578 --76.0797 --76.0609 --76.0703 --76.0844 --76.0891 --76.0781 --76.0953 --76.0797 --76.0797 --76.0781 --76.0703 --76.0609 --76.0797 --76.0672 --76.0813 --76.0609 --76.0766 --76.0641 --76.0797 --76.0797 --76.0687 --76.0687 --76.075 --76.0844 --76.0828 --76.0656 --76.0844 --76.075 --76.0766 --76.075 --76.0719 --76.0875 --76.0703 --76.0609 --76.0656 --76.0625 --76.0625 --76.0641 --76.0687 --76.0641 --76.0625 --76.0672 --76.0625 --76.0563 --76.0531 --76.0703 --76.0547 --76.05 --76.0609 --76.0594 --76.0703 --76.0578 --76.0594 --76.0547 --76.0547 --76.0766 --76.0656 --76.0625 --76.0687 --76.0594 --76.0609 --76.0531 --76.0609 --76.0641 --76.0703 --76.0625 --76.0531 --76.0594 --76.0703 --76.0609 --76.0469 --76.0641 --76.0672 --76.0484 --76.0625 --76.0594 --76.0516 --76.0594 --76.0594 --76.0547 --76.0656 --76.0531 --76.0609 --76.0578 --76.0563 --76.075 --76.0516 --76.0547 --76.05 --76.0516 --76.0516 --76.0703 --76.0641 --76.0734 --76.0609 --76.0625 --76.075 --76.0625 --76.0563 --76.0625 --76.0594 --76.075 --76.0609 --76.0656 --76.0703 --76.0719 --76.0594 --76.0797 --76.0719 --76.0781 --76.0625 --76.0703 --76.0641 --76.0641 --76.0547 --76.0563 --76.0625 --76.05 --76.0641 --76.0687 --76.0594 --76.0594 --76.05 --76.0719 --76.0656 --76.0375 --76.0687 --76.0797 --76.0609 --76.0656 --76.0563 --76.0687 --76.0641 --76.0625 --76.0641 --76.0594 --76.0641 --76.0594 --76.0641 --76.0547 --76.05 --76.0563 --76.0563 --76.0672 --76.0703 --76.0687 --76.075 --76.0594 --76.0672 --76.0594 --76.0703 --76.0625 --76.0609 --76.0422 --76.0484 --76.0609 --76.0687 --76.0578 --76.0656 --76.0625 --76.0703 --76.0734 --76.0563 --76.0609 --76.0656 --76.0531 --76.0594 --76.0609 --76.0609 --76.0531 --76.0641 --76.0609 --76.0719 --76.0563 --76.0578 --76.0625 --76.0719 --76.0672 --76.0547 --76.0578 --76.0563 --76.0672 --76.0563 --76.0578 --76.075 --76.0641 --76.0672 --76.0687 --76.0594 --76.0563 --76.0625 --76.0656 --76.0563 --76.0594 --76.0719 --76.0594 --76.0734 --76.0547 --76.0594 --76.0531 --76.0625 --76.0703 --76.0531 --76.0578 --76.0594 --76.0641 --76.0547 --76.0609 --76.0594 --76.0656 --76.0625 --76.0703 --76.0531 --76.0516 --76.0531 --76.0516 --76.0563 --76.0547 --76.0453 --76.0781 --76.0531 --76.0703 --76.0516 --76.0609 --76.0531 --76.0406 --76.0594 --76.0531 --76.0531 --76.0641 --76.0547 --76.0516 --76.0547 --76.0641 --76.0641 --76.0484 --76.0656 --76.0672 --76.0672 --76.0672 --76.0766 --76.0531 --76.0609 --76.0703 --76.0672 --76.0719 --76.0844 --76.0766 --76.0687 --76.0844 --76.0828 --76.0781 --76.0766 --76.0828 --76.075 --76.0703 --76.0719 --76.0734 --76.0672 --76.0656 --76.0703 --76.0672 --76.0734 --76.0734 --76.0641 --76.0828 --76.0875 --76.0656 --76.0625 --76.0734 --76.0813 --76.0687 --76.0844 --76.0719 --76.0609 --76.0687 --76.0641 --76.0672 --76.0656 --76.0641 --76.0687 --76.0703 --76.0578 --76.0578 --76.0797 --76.0609 --76.0734 --76.075 --76.0687 --76.0813 --76.0797 --76.0672 --76.0859 --76.0766 --76.0578 --76.0625 --76.0734 --76.0687 --76.0734 --76.0766 --76.0609 --76.0625 --76.0687 --76.0672 --76.0563 --76.0563 --76.0531 --76.0781 --76.0516 --76.0563 --76.0594 --76.0625 --76.0594 --76.0516 --76.0641 --76.0594 --76.0563 --76.0547 --76.0719 --76.0687 --76.0672 --76.0641 --76.0531 --76.0687 --76.0563 --76.0563 --76.0703 --76.0625 --76.0781 --76.0578 --76.0641 --76.0578 --76.0687 --76.0578 --76.0594 --76.0703 --76.0609 --76.0719 --76.0703 --76.0609 --76.0656 --76.0656 --76.0656 --76.0609 --76.0672 --76.0656 --76.0734 --76.0734 --76.0719 --76.0687 --76.0547 --76.0703 --76.075 --76.0656 --76.0719 --76.0703 --76.0531 --76.0703 --76.0672 --76.0656 --76.0563 --76.0656 --76.0656 --76.0641 --76.0687 --76.0578 --76.0641 --76.0734 --76.0625 --76.0594 --76.0656 --76.0547 --76.0594 --76.0531 --76.0563 --76.0672 --76.0594 --76.0516 --76.05 --76.0719 --76.0516 --76.0547 --76.0781 --76.0563 --76.0734 --76.0609 --76.0609 --76.0719 --76.0547 --76.0516 --76.0625 --76.0578 --76.0672 --76.0656 --76.0687 --76.0531 --76.0672 --76.0719 --76.0578 --76.0531 --76.0516 --76.0594 --76.0563 --76.0563 --76.0609 --76.0781 --76.0625 --76.0703 --76.0734 --76.0656 --76.0563 --76.0672 --76.0625 --76.0609 --76.0641 --76.0828 --76.0641 --76.0609 --76.0687 --76.0672 --76.0609 --76.0641 --76.0609 --76.0625 --76.0563 --76.0656 --76.0625 --76.0578 --76.0578 --76.0484 --76.0453 --76.0672 --76.0547 --76.0563 --76.0687 --76.0578 --76.0641 --76.0578 --76.0672 --76.0625 --76.0469 --76.0594 --76.0641 --76.0594 --76.0516 --76.0703 --76.0547 --76.0516 --76.0531 --76.0547 --76.0672 --76.0563 --76.0656 --76.0563 --76.0437 --76.0453 --76.0531 --76.0484 --76.0703 --76.0609 --76.0578 --76.0672 --76.0484 --76.0547 --76.0563 --76.0516 --76.0609 --76.0609 --76.0578 --76.0609 --76.0625 --76.0547 --76.0641 --76.0641 --76.0656 --76.0656 --76.075 --76.075 --76.0734 --76.075 --76.0484 --76.0719 --76.0516 --76.0625 --76.0625 --76.0609 --76.0641 --76.0703 --76.0828 --76.0734 --76.0609 --76.0703 --76.0734 --76.0719 --76.0641 --76.0625 --76.0703 --76.0625 --76.0625 --76.0656 --76.0563 --76.0719 --76.0578 --76.0437 --76.0531 --76.0672 --76.0672 --76.0531 --76.0578 --76.0375 --76.0734 --76.0531 --76.0672 --76.0687 --76.0484 --76.0672 --76.0594 --76.0656 --76.0547 --76.0484 --76.0578 --76.0547 --76.0563 --76.0703 --76.0609 --76.0703 --76.0656 --76.0719 --76.0703 --76.0625 --76.0781 --76.0641 --76.0641 --76.0625 --76.0469 --76.0547 --76.0578 --76.0437 --76.0719 --76.0672 --76.0531 --76.0609 --76.0781 --76.0609 --76.0563 --76.075 --76.0531 --76.0563 --76.0453 --76.0609 --76.0609 --76.0719 --76.0578 --76.0687 --76.0641 --76.0594 --76.0547 --76.0641 --76.0687 --76.0391 --76.0672 --76.0594 --76.0625 --76.0672 --76.0687 --76.0734 --76.0578 --76.0719 --76.0594 --76.05 --76.0656 --76.0687 --76.0547 --76.0563 --76.0594 --76.0609 --76.0656 --76.0516 --76.0594 --76.0641 --76.0484 --76.0703 --76.0719 --76.0672 --76.0625 --76.0641 --76.0609 --76.0563 --76.0687 --76.0531 --76.0531 --76.0625 --76.0437 --76.0578 --76.0563 --76.0609 --76.0563 --76.0422 --76.0469 --76.0531 --76.0594 --76.0594 --76.0703 --76.0609 --76.0594 --76.0656 --76.0578 --76.0672 --76.0656 --76.0563 --76.075 --76.0422 --76.0641 --76.0547 --76.0516 --76.0563 --76.0547 --76.0484 --76.0578 --76.0703 --76.0656 --76.0547 --76.075 --76.0656 --76.0672 --76.0641 --76.0547 --76.0531 --76.0625 --76.0641 --76.0687 --76.0594 --76.0563 --76.0469 --76.0516 --76.0563 --76.0531 --76.0672 --76.0641 --76.0594 --76.0703 --76.0437 --76.0625 --76.05 --76.0359 --76.0547 --76.0578 --76.0656 --76.0766 --76.0578 --76.0469 --76.0703 --76.0563 --76.0594 --76.0547 --76.0563 --76.0578 --76.0563 --76.0625 --76.0656 --76.0594 --76.0516 --76.0625 --76.0453 --76.0469 --76.0531 --76.0594 --76.0531 --76.0547 --76.0656 --76.0609 --76.0531 --76.0609 --76.0609 --76.0656 --76.0516 --76.0609 --76.0641 --76.0531 --76.0609 --76.0578 --76.0578 --76.0625 --76.0719 --76.0531 --76.0625 --76.0641 --76.05 --76.0672 --76.0531 --76.0563 --76.0469 --76.0594 --76.0609 --76.0594 --76.05 --76.05 --76.0609 --76.0563 --76.0516 --76.0437 --76.0422 --76.0484 --76.0563 --76.0656 --76.0547 --76.0516 --76.0547 --76.0719 --76.0594 --76.0531 --76.0547 --76.0547 --76.0563 --76.05 --76.0609 --76.0531 --76.0563 --76.0578 --76.0484 --76.0594 --76.0484 --76.0516 --76.0578 --76.05 --76.0563 --76.0578 --76.0687 --76.0672 --76.0703 --76.0641 --76.0719 --76.0703 --76.0672 --76.0594 --76.0656 --76.0656 --76.0656 --76.0672 --76.0734 --76.0625 --76.0516 --76.0703 --76.0641 --76.0563 --76.0703 --76.0687 --76.0719 --76.0641 --76.0531 --76.0563 --76.0594 --76.0578 --76.0531 --76.0734 --76.0672 --76.0531 --76.0563 --76.0609 --76.0734 --76.0687 --76.0641 --76.0531 --76.0531 --76.0594 --76.05 --76.0531 --76.0422 --76.0563 --76.0625 --76.05 --76.0484 --76.0531 --76.0578 --76.0453 --76.0547 --76.05 --76.0531 --76.0516 --76.0344 --76.0437 --76.0563 --76.05 --76.0563 --76.0563 --76.0547 --76.0531 --76.0531 --76.0641 --76.0563 --76.0609 --76.0672 --76.0563 --76.0625 --76.0609 --76.0531 --76.0578 --76.0609 --76.05 --76.0547 --76.0641 --76.0609 --76.0594 --76.0563 --76.05 --76.0484 --76.0656 --76.0594 --76.0594 --76.0766 --76.0578 --76.0609 --76.0672 --76.0641 --76.0641 --76.0563 --76.0687 --76.0641 --76.0703 --76.0703 --76.0469 --76.0563 --76.0609 --76.0594 --76.0656 --76.0625 --76.0625 --76.0578 --76.0547 --76.0734 --76.0609 --76.0703 --76.0687 --76.0813 --76.0687 --76.0719 --76.0687 --76.0641 --76.0844 --76.0672 --76.0875 --76.0766 --76.0719 --76.0766 --76.0563 --76.0719 --76.0687 --76.0813 --76.075 --76.0687 --76.0938 --76.0828 --76.0797 --76.0703 --76.075 --76.0656 --76.0781 --76.0734 --76.0719 --76.0906 --76.0781 --76.0781 --76.0828 --76.0594 --76.0609 --76.0719 --76.0813 --76.0781 --76.0766 --76.0844 --76.0844 --76.0672 --76.0563 --76.0828 --76.0922 --76.0734 --76.0641 --76.075 --76.0859 --76.0672 --76.075 --76.0734 --76.0484 --76.0891 --76.0859 --76.0844 --76.0734 --76.0906 --76.0828 --76.0719 --76.0813 --76.0766 --76.0703 --76.075 --76.0578 --76.0781 --76.0594 --76.075 --76.0781 --76.0734 --76.0547 --76.0594 --76.0719 --76.0734 --76.0656 --76.0594 --76.0672 --76.0719 --76.0563 --76.0734 --76.0641 --76.0797 --76.0687 --76.0719 --76.0578 --76.0656 --76.0547 --76.0469 --76.0453 --76.0594 --76.0594 --76.0484 --76.0578 --76.0609 --76.0484 --76.0656 --76.0625 --76.05 --76.0625 --76.0578 --76.0531 --76.0594 --76.0531 --76.0687 --76.0516 --76.0625 --76.0687 --76.0687 --76.0766 --76.0703 --76.0703 --76.0625 --76.0687 --76.0625 --76.0563 --76.0656 --76.0641 --76.0656 --76.0547 --76.0547 --76.0625 --76.0734 --76.0563 --76.075 --76.0547 --76.0547 --76.0641 --76.0656 --76.0687 --76.0578 --76.0656 --76.0609 --76.0531 --76.0641 --76.0563 --76.0437 --76.0625 --76.05 --76.0609 --76.0594 --76.0531 --76.0547 --76.0625 --76.0641 --76.0641 --76.0547 --76.0609 --76.0531 --76.0484 --76.0531 --76.0437 --76.0578 --76.0531 --76.0547 --76.0547 --76.0609 --76.0563 --76.0469 --76.0563 --76.0641 --76.0563 --76.0484 --76.0594 --76.0594 --76.0469 --76.0594 --76.05 --76.0484 --76.0578 --76.05 --76.0703 --76.0563 --76.0594 --76.0563 --76.0609 --76.0578 --76.0437 --76.0484 --76.0469 --76.0422 --76.0734 --76.0594 --76.0578 --76.0594 --76.0609 --76.075 --76.0625 --76.0594 --76.0625 --76.0625 --76.0641 --76.0687 --76.0609 --76.0594 --76.0719 --76.0516 --76.0625 --76.0672 --76.0563 --76.0453 --76.0563 --76.0641 --76.0469 --76.0484 --76.0594 --76.0609 --76.0687 --76.0516 --76.0547 --76.0516 --76.0641 --76.0672 --76.0469 --76.0625 --76.0609 --76.0734 --76.0672 --76.0672 --76.0734 --76.0625 --76.0813 --76.0734 --76.0656 --76.0703 --76.0641 --76.0703 --76.0578 --76.0656 --76.0531 --76.0641 --76.0703 --76.0609 --76.0719 --76.0641 --76.0687 --76.0641 --76.0656 --76.0672 --76.0672 --76.0656 --76.0813 --76.0687 --76.075 --76.0656 --76.0578 --76.0687 --76.0578 --76.0719 --76.0625 --76.0781 --76.0625 --76.0641 --76.0734 --76.0625 --76.0672 --76.0719 --76.0516 --76.05 --76.0609 --76.0531 --76.0563 --76.0625 --76.0594 --76.0563 --76.0641 --76.0766 --76.0625 --76.0547 --76.0641 --76.0547 --76.0609 --76.0609 --76.0672 --76.0766 --76.0609 --76.0703 --76.0687 --76.075 --76.0687 --76.0594 --76.0687 --76.0766 --76.0578 --76.0672 --76.0656 --76.0469 --76.0719 --76.0672 --76.0781 --76.0687 --76.0578 --76.0641 --76.0578 --76.0641 --76.0641 --76.0656 --76.0687 --76.0703 --76.0594 --76.0703 --76.0703 --76.0734 --76.075 --76.075 --76.0641 --76.0781 --76.0641 --76.0656 --76.0594 --76.0578 --76.0531 --76.0625 --76.0609 --76.0609 --76.0531 --76.0578 --76.0578 --76.0656 --76.0453 --76.0859 --76.0734 --76.0687 --76.0547 --76.0578 --76.0578 --76.0687 --76.0656 --76.0469 --76.0672 --76.0609 --76.0469 --76.0609 --76.0484 --76.0672 --76.0625 --76.0594 --76.0609 --76.0578 --76.0641 --76.0453 --76.0687 --76.0625 --76.0609 --76.0703 --76.0594 --76.0641 --76.0719 --76.0547 --76.0625 --76.0656 --76.0594 --76.0563 --76.0594 --76.0672 --76.0672 --76.0703 --76.0719 --76.0578 --76.0594 --76.0703 --76.0687 --76.0547 --76.075 --76.0625 --76.0797 --76.0547 --76.0672 --76.0781 --76.0734 --76.0703 --76.0609 --76.0469 --76.0578 --76.0797 --76.0609 --76.0609 --76.0703 --76.0563 --76.0703 --76.0734 --76.0563 --76.0703 --76.0594 --76.0687 --76.0719 --76.0766 --76.0453 --76.0719 --76.0469 --76.0594 --76.0516 --76.0641 --76.0609 --76.0609 --76.0625 --76.0531 --76.0719 --76.0594 --76.0594 --76.0672 --76.0578 --76.0609 --76.0594 --76.0594 --76.0609 --76.0672 --76.0516 --76.0703 --76.0609 --76.0547 --76.0641 --76.0547 --76.075 --76.0625 --76.0687 --76.075 --76.0672 --76.0656 --76.0594 --76.0594 --76.0594 --76.0703 --76.0797 --76.0703 --76.05 --76.0656 --76.0719 --76.0578 --76.0578 --76.0625 --76.0656 --76.0734 --76.0719 --76.0594 --76.0547 --76.0578 --76.0625 --76.0563 --76.0531 --76.0547 --76.0547 --76.0531 --76.0594 --76.0625 --76.0531 --76.05 --76.0516 --76.0578 --76.0578 --76.0563 --76.05 --76.0687 --76.0672 --76.0531 --76.0734 --76.0578 --76.0594 --76.0531 --76.0563 --76.0453 --76.0672 --76.0703 --76.0641 --76.0594 --76.05 --76.0563 --76.0531 --76.0484 --76.0609 --76.0609 --76.0594 --76.0641 --76.0641 --76.0687 --76.0563 --76.0625 --76.0594 --76.0703 --76.05 --76.0547 --76.0516 --76.0656 --76.0594 --76.05 --76.0609 --76.0641 --76.0547 --76.0766 --76.0594 --76.0563 --76.0578 --76.0484 --76.0484 --76.0563 --76.0641 --76.0563 --76.0594 --76.0469 --76.0563 --76.0469 --76.0672 --76.0563 --76.0609 --76.0625 --76.0719 --76.0547 --76.0719 --76.0453 --76.0594 --76.0391 --76.05 --76.0641 --76.0594 --76.0469 --76.0656 --76.0656 --76.0547 --76.0516 --76.0656 --76.0469 --76.0563 --76.0453 --76.0703 --76.0656 --76.0656 --76.0609 --76.0609 --76.0719 --76.0734 --76.0687 --76.075 --76.0578 --76.0813 --76.0703 --76.0766 --76.0625 --76.0609 --76.0656 --76.0734 --76.075 --76.0672 --76.0719 --76.0672 --76.0563 --76.0656 --76.0656 --76.0563 --76.0625 --76.0687 --76.0531 --76.0625 --76.0578 --76.0563 --76.0703 --76.0656 --76.0672 --76.0516 --76.0594 --76.0531 --76.0656 --76.0578 --76.0625 --76.0578 --76.0734 --76.0656 --76.0656 --76.0578 --76.0656 --76.0625 --76.0484 --76.0609 --76.0484 --76.0547 --76.0656 --76.0641 --76.0672 --76.0703 --76.0734 --76.0781 --76.0734 --76.0625 --76.0641 --76.0797 --76.0531 --76.0625 --76.0578 --76.0547 --76.0594 --76.0719 --76.0516 --76.0422 --76.0625 --76.0547 --76.05 --76.0563 --76.0547 --76.0531 --76.0531 --76.0516 --76.0656 --76.0484 --76.0625 --76.0516 --76.0594 --76.0531 --76.0734 --76.0594 --76.0625 --76.0594 --76.0656 --76.0719 --76.0484 --76.0594 --76.0469 --76.0484 --76.0641 --76.0563 --76.0563 --76.05 --76.0516 --76.0672 --76.0594 --76.0719 --76.0469 --76.0625 --76.0594 --76.0641 --76.0719 --76.0703 --76.0703 --76.0672 --76.0563 --76.0656 --76.0813 --76.0703 --76.0578 --76.0813 --76.0563 --76.0797 --76.0656 --76.0625 --76.0672 --76.0625 --76.0687 --76.0531 --76.0563 --76.0703 --76.0734 --76.0734 --76.0609 --76.05 --76.0625 --76.0547 --76.0672 --76.0687 --76.0672 --76.0531 --76.0656 --76.0625 --76.0594 --76.0641 --76.0531 --76.0594 --76.0484 --76.0625 --76.0609 --76.0609 --76.0547 --76.0641 --76.0781 --76.0672 --76.0641 --76.0719 --76.0672 --76.0609 --76.0547 --76.075 --76.0703 --76.0672 --76.0516 --76.0594 --76.0609 --76.0484 --76.0609 --76.0578 --76.075 --76.0609 --76.0672 --76.0687 --76.0594 --76.0594 --76.0687 --76.0578 --76.05 --76.0547 --76.0484 --76.0547 --76.0641 --76.0625 --76.0484 --76.0594 --76.0625 --76.0578 --76.0531 --76.0594 --76.0453 --76.0531 --76.0578 --76.0687 --76.0594 --76.0437 --76.0547 --76.0437 --76.0641 --76.0547 --76.0516 --76.0563 --76.0547 --76.0516 --76.0594 --76.0531 --76.0672 --76.0594 --76.0641 --76.0687 --76.0609 --76.0703 --76.0672 --76.0563 --76.0797 --76.0703 --76.0656 --76.0766 --76.0656 --76.0656 --76.0656 --76.0687 --76.0594 --76.0719 --76.0687 --76.0797 --76.0719 --76.0547 --76.0625 --76.0766 --76.0641 --76.0687 --76.0625 --76.0594 --76.0563 --76.0563 --76.0594 --76.0719 --76.0563 --76.0563 --76.0672 --76.0563 --76.0609 --76.0609 --76.0656 --76.0547 --76.0563 --76.0563 --76.0656 --76.0687 --76.0625 --76.0641 --76.0609 --76.0656 --76.0625 --76.0656 --76.0609 --76.0484 --76.0656 --76.0437 --76.0609 --76.0594 --76.0516 --76.0578 --76.0516 --76.0609 --76.0703 --76.0609 --76.05 --76.0672 --76.0547 --76.0672 --76.0766 --76.075 --76.0687 --76.0734 --76.0734 --76.0734 --76.0672 --76.0578 --76.0797 --76.0594 --76.0594 --76.0578 --76.0641 --76.0766 --76.075 --76.0531 --76.0719 --76.0594 --76.0594 --76.0609 --76.0703 --76.0578 --76.0516 --76.0641 --76.0516 --76.0703 --76.0687 --76.0781 --76.0453 --76.0672 --76.0703 --76.0703 --76.0672 --76.0703 --76.0609 --76.0641 --76.0734 --76.0672 --76.0641 --76.0594 --76.0484 --76.0594 --76.0766 --76.0672 --76.0656 --76.0656 --76.0687 --76.0516 --76.0578 --76.0766 --76.075 --76.0563 --76.05 --76.0578 --76.0641 --76.075 --76.0656 --76.0531 --76.05 --76.0516 --76.0516 --76.0453 --76.05 --76.0641 --76.0531 --76.0531 --76.0547 --76.0719 --76.0469 --76.0578 --76.0531 --76.05 --76.0531 --76.0625 --76.0531 --76.0609 --76.0641 --76.0687 --76.0641 --76.0547 --76.0625 --76.0719 --76.0516 --76.0563 --76.0672 --76.0609 --76.0687 --76.05 --76.0516 --76.0516 --76.0547 --76.0672 --76.0437 --76.0625 --76.05 --76.0563 --76.0469 --76.0609 --76.0469 --76.0578 --76.0406 --76.0453 --76.0531 --76.0531 --76.0453 --76.0531 --76.0437 --76.0531 --76.0516 --76.0453 --76.0672 --76.05 --76.0563 --76.075 --76.0563 --76.0609 --76.0641 --76.0625 --76.0656 --76.0531 --76.0578 --76.0563 --76.0391 --76.0453 --76.0641 --76.0547 --76.0516 --76.0469 --76.0453 --76.0531 --76.0625 --76.0516 --76.0625 --76.0687 --76.0687 --76.0641 --76.0594 --76.0734 --76.0484 --76.0625 --76.0719 --76.0547 --76.0781 --76.0656 --76.0641 --76.0734 --76.0672 --76.0625 --76.0672 --76.0547 --76.0797 --76.0625 --76.0516 --76.0609 --76.0766 --76.0719 --76.0687 --76.0656 --76.05 --76.0656 --76.0641 --76.0656 --76.0687 --76.0594 --76.0641 --76.0844 --76.0641 --76.0625 --76.0703 --76.0422 --76.0656 --76.0594 --76.0563 --76.0719 --76.0734 --76.0797 --76.0703 --76.0516 --76.0672 --76.0578 --76.0563 --76.0828 --76.0516 --76.0375 --76.0641 --76.0641 --76.0609 --76.0609 --76.0516 --76.05 --76.0656 --76.0594 --76.0672 --76.0625 --76.0625 --76.0594 --76.0531 --76.0547 --76.0703 --76.05 --76.0484 --76.0484 --76.0594 --76.0484 --76.0656 --76.05 --76.0578 --76.0406 --76.0656 --76.0484 --76.0641 --76.05 --76.0703 --76.0609 --76.0594 --76.0797 --76.0609 --76.0609 --76.0797 --76.0531 --76.0656 --76.0687 --76.0719 --76.0641 --76.0641 --76.0563 --76.0563 --76.0703 --76.0594 --76.0609 --76.0531 --76.0656 --76.0609 --76.0563 --76.0437 --76.0766 --76.0453 --76.0422 --76.05 --76.0641 --76.0547 --76.0609 --76.0594 --76.0594 --76.0625 --76.0531 --76.0453 --76.0578 --76.0531 --76.0531 --76.0437 --76.0391 --76.0563 --76.0609 --76.0563 --76.0609 --76.0516 --76.0437 --76.0406 --76.0641 --76.0437 --76.0563 --76.0656 --76.0531 --76.0672 --76.0516 --76.0547 --76.0594 --76.0453 --76.0469 --76.0547 --76.0531 --76.0359 --76.0672 --76.0578 --76.0656 --76.0563 --76.05 --76.0578 --76.0609 --76.0672 --76.0672 --76.0563 --76.0687 --76.0609 --76.0609 --76.0641 --76.0531 --76.0656 --76.0547 --76.0656 --76.0547 --76.0516 --76.0563 --76.0672 --76.0547 --76.0813 --76.0563 --76.0625 --76.0563 --76.0578 --76.05 --76.0563 --76.0672 --76.0609 --76.0687 --76.0531 --76.0547 --76.0516 --76.0547 --76.0563 --76.0578 --76.0547 --76.0594 --76.0625 --76.0625 --76.0625 --76.0547 --76.0484 --76.0594 --76.0547 --76.0609 --76.0687 --76.0609 --76.0625 --76.0703 --76.0547 --76.0609 --76.075 --76.0719 --76.0687 --76.0656 --76.0594 --76.0656 --76.0641 --76.0641 --76.0781 --76.0719 --76.0641 --76.0672 --76.0609 --76.0656 --76.0656 --76.0531 --76.0703 --76.0766 --76.0719 --76.0703 --76.0719 --76.0703 --76.0687 --76.0766 --76.0734 --76.0484 --76.0531 --76.05 --76.0734 --76.0625 --76.0719 --76.0594 --76.0719 --76.0719 --76.0703 --76.0578 --76.0656 --76.0531 --76.0625 --76.0687 --76.0625 --76.0641 --76.0734 --76.0578 --76.0656 --76.0656 --76.0609 --76.0703 --76.0687 --76.0625 --76.0625 --76.0609 --76.0641 --76.0766 --76.0641 --76.0641 --76.0594 --76.0641 --76.0656 --76.0625 --76.0594 --76.0703 --76.0656 --76.0625 --76.0641 --76.0594 --76.0531 --76.0609 --76.0594 --76.0594 --76.0687 --76.0703 --76.0703 --76.0781 --76.0687 --76.0766 --76.0609 --76.0703 --76.0609 --76.0625 --76.0641 --76.0578 --76.0703 --76.0563 --76.0578 --76.0609 --76.0719 --76.0672 --76.0578 --76.0672 --76.0703 --76.0719 --76.0687 --76.0641 --76.0609 --76.0625 --76.0672 --76.0672 --76.0594 --76.0609 --76.0531 --76.0484 --76.0531 --76.0641 --76.0484 --76.0531 --76.0422 --76.0406 --76.0563 --76.0531 --76.05 --76.0578 --76.0563 --76.0422 --76.0625 --76.0547 --76.0516 --76.0641 --76.0563 --76.0484 --76.05 --76.0531 --76.0484 --76.0641 --76.0406 --76.075 --76.0609 --76.0469 --76.0687 --76.0547 --76.0656 --76.0516 --76.0656 --76.05 --76.0531 --76.0656 --76.0578 --76.0484 --76.0594 --76.0594 --76.0469 --76.0625 --76.0578 --76.0547 --76.0422 --76.0469 --76.0578 --76.0609 --76.0531 --76.0422 --76.0609 --76.0547 --76.0516 --76.05 --76.0578 --76.0484 --76.0391 --76.0531 --76.0516 --76.0547 --76.0594 --76.0547 --76.0563 --76.0563 --76.0516 --76.0516 --76.0516 --76.0594 --76.0594 --76.0437 --76.0594 --76.0609 --76.0578 --76.0563 --76.0578 --76.0547 --76.0578 --76.0578 --76.0563 --76.05 --76.0609 --76.0547 --76.0531 --76.0531 --76.0469 --76.0234 --76.0328 --76.0422 --76.0375 --76.0406 --76.0406 --76.0469 --76.0437 --76.0531 --76.0422 --76.0563 --76.0469 --76.0422 --76.0437 --76.0531 --76.0547 --76.05 --76.0625 --76.0687 --76.0547 --76.0609 --76.0484 --76.0672 --76.0578 --76.0484 --76.0469 --76.05 --76.0469 --76.0563 --76.0469 --76.05 --76.0469 --76.0437 --76.0422 --76.0578 --76.0594 --76.0453 --76.0687 --76.0531 --76.0516 --76.0594 --76.0469 --76.0469 --76.0531 --76.0609 --76.0625 --76.0516 --76.0625 --76.0484 --76.0687 --76.0516 --76.0719 --76.0734 --76.0781 --76.0594 --76.0516 --76.0656 --76.0625 --76.0578 --76.0641 --76.0578 --76.0641 --76.0563 --76.0563 --76.0641 --76.0687 --76.0594 --76.0578 --76.0687 --76.0672 --76.0672 --76.0703 --76.0484 --76.0609 --76.0547 --76.0578 --76.0563 --76.0609 --76.0687 --76.0703 --76.0609 --76.0625 --76.0578 --76.0703 --76.0641 --76.075 --76.0687 --76.0609 --76.0687 --76.0578 --76.0594 --76.0641 --76.0719 --76.0656 --76.0578 --76.0687 --76.0734 --76.0609 --76.0531 --76.0625 --76.0672 --76.0609 --76.0703 --76.0563 --76.0547 --76.0703 --76.0625 --76.0625 --76.0594 --76.0641 --76.0734 --76.0656 --76.0656 --76.0875 --76.0531 --76.0625 --76.0563 --76.0687 --76.075 --76.0672 --76.0453 --76.0625 --76.0594 --76.0594 --76.0594 --76.0609 --76.0734 --76.0563 --76.0547 --76.0609 --76.0609 --76.0625 --76.05 --76.0484 --76.0656 --76.0609 --76.0641 --76.0563 --76.0531 --76.0594 --76.0609 --76.0625 --76.0609 --76.0656 --76.05 --76.0703 --76.0594 --76.0453 --76.0578 --76.0484 --76.0547 --76.0641 --76.0703 --76.0734 --76.0547 --76.0703 --76.0609 --76.05 --76.0609 --76.0578 --76.0625 --76.0625 --76.0484 --76.0531 --76.0531 --76.0391 --76.0703 --76.0641 --76.0625 --76.0672 --76.0563 --76.0687 --76.0719 --76.0609 --76.0578 --76.0672 --76.0563 --76.0547 --76.0734 --76.0625 --76.0594 --76.0703 --76.0672 --76.0656 --76.0609 --76.0625 --76.0547 --76.0531 --76.0594 --76.0563 --76.0719 --76.0625 --76.0563 --76.0656 --76.0594 --76.0578 --76.0687 --76.0547 --76.0609 --76.0609 --76.0578 --76.0719 --76.0672 --76.0719 --76.0797 --76.0547 --76.0531 --76.0641 --76.0563 --76.0594 --76.0437 --76.0531 --76.0578 --76.0516 --76.0422 --76.0453 --76.0484 --76.0531 --76.0594 --76.0437 --76.0516 --76.0594 --76.0531 --76.0531 --76.0625 --76.0594 --76.0578 --76.0641 --76.0781 --76.0672 --76.0734 --76.0656 --76.0641 --76.0609 --76.0719 --76.0672 --76.0625 --76.0672 --76.0578 --76.0531 --76.0703 --76.0656 --76.0703 --76.0656 --76.0719 --76.0547 --76.0516 --76.0594 --76.0531 --76.075 --76.0516 --76.0641 --76.0687 --76.0594 --76.0609 --76.0672 --76.0563 --76.0687 --76.0531 --76.0656 --76.0687 --76.075 --76.0672 --76.0625 --76.0578 --76.075 --76.0734 --76.0594 --76.0703 --76.0703 --76.0687 --76.0625 --76.0703 --76.0672 --76.0687 --76.0734 --76.0641 --76.0813 --76.0656 --76.0719 --76.0859 --76.0719 --76.0734 --76.0719 --76.0719 --76.0641 --76.0859 --76.0687 --76.0734 --76.0641 --76.0766 --76.0641 --76.0672 --76.0687 --76.0656 --76.0719 --76.0703 --76.0641 --76.0656 --76.0609 --76.0734 --76.0563 --76.0656 --76.0766 --76.0609 --76.0703 --76.0766 --76.075 --76.0734 --76.0703 --76.0859 --76.0641 --76.075 --76.0625 --76.0594 --76.0641 --76.0594 --76.075 --76.0578 --76.0656 --76.0641 --76.0687 --76.0672 --76.0563 --76.0656 --76.0672 --76.0719 --76.0531 --76.0687 --76.0563 --76.0594 --76.0687 --76.0672 --76.0687 --76.0672 --76.0641 --76.0625 --76.0813 --76.0687 --76.0625 --76.0797 --76.0641 --76.0609 --76.0719 --76.0656 --76.0766 --76.0781 --76.075 --76.0813 --76.0813 --76.0781 --76.0734 --76.0703 --76.0719 --76.0672 --76.075 --76.0609 --76.0687 --76.0703 --76.0703 --76.0797 --76.0719 --76.0687 --76.0813 --76.0703 --76.0719 --76.0687 --76.0687 --76.075 --76.0781 --76.0703 --76.075 --76.0687 --76.0625 --76.0875 --76.0687 --76.0734 --76.0781 --76.0813 --76.0687 --76.075 --76.075 --76.0719 --76.0625 --76.0734 --76.0734 --76.0641 --76.0813 --76.0781 --76.0844 --76.0797 --76.0734 --76.0891 --76.0594 --76.0703 --76.0734 --76.0687 --76.0609 --76.0781 --76.0687 --76.0781 --76.075 --76.0547 --76.0844 --76.0687 --76.0484 --76.075 --76.0563 --76.0563 --76.0813 --76.0625 --76.0563 --76.0719 --76.0563 --76.0609 --76.0875 --76.0766 --76.0687 --76.0734 --76.0687 --76.0641 --76.0687 --76.075 --76.0625 --76.075 --76.0687 --76.0656 --76.0625 --76.0672 --76.0813 --76.075 --76.0703 --76.0594 --76.0563 --76.0781 --76.0703 --76.0766 --76.0781 --76.0766 --76.0687 --76.0656 --76.0578 --76.0641 --76.0687 --76.0844 --76.0687 --76.0516 --76.0687 --76.0687 --76.0641 --76.0625 --76.0734 --76.0656 --76.0734 --76.0609 --76.0672 --76.0609 --76.0625 --76.0547 --76.0484 --76.0703 --76.0578 --76.0672 --76.0687 --76.0719 --76.0656 --76.0719 --76.0656 --76.0594 --76.0734 --76.0641 --76.0531 --76.0609 --76.0594 --76.0609 --76.0766 --76.0563 --76.0719 --76.0625 --76.0672 --76.0781 --76.0516 --76.0625 --76.075 --76.0781 --76.0703 --76.0656 --76.0719 --76.0781 --76.0781 --76.0625 --76.0813 --76.0687 --76.0781 --76.0687 --76.0656 --76.0781 --76.0781 --76.075 --76.0797 --76.0891 --76.0797 --76.0828 --76.0875 --76.0641 --76.0641 --76.0734 --76.0813 --76.0719 --76.0781 --76.0781 --76.0656 --76.0656 --76.0703 --76.0797 --76.0625 --76.0687 --76.0734 --76.0813 --76.0531 --76.0734 --76.0672 --76.0734 --76.0703 --76.0687 --76.0719 --76.0734 --76.0813 --76.0687 --76.0797 --76.0734 --76.0719 --76.0828 --76.0906 --76.075 --76.0594 --76.0813 --76.0797 --76.0938 --76.0687 --76.0687 --76.0828 --76.0891 --76.075 --76.0828 --76.0875 --76.0969 --76.1031 --76.0922 --76.075 --76.0719 --76.0844 --76.075 --76.0797 --76.0672 --76.0922 --76.0813 --76.0734 --76.075 --76.075 --76.0813 --76.0766 --76.0719 --76.0797 --76.0703 --76.0734 --76.0734 --76.0703 --76.0703 --76.0703 --76.0797 --76.0641 --76.0719 --76.0797 --76.0797 --76.0797 --76.0875 --76.0906 --76.075 --76.0844 --76.0734 --76.0781 --76.0875 --76.0938 --76.0828 --76.0891 --76.0797 --76.0828 --76.0844 --76.0781 --76.0859 --76.0672 --76.0844 --76.0797 --76.075 --76.075 --76.0672 --76.0766 --76.0609 --76.0766 --76.0687 --76.0719 --76.0813 --76.0859 --76.0781 --76.0703 --76.0719 --76.0656 --76.0687 --76.0719 --76.0703 --76.075 --76.0719 --76.0687 --76.0781 --76.0813 --76.075 --76.0813 --76.0813 --76.0766 --76.0813 --76.0797 --76.0828 --76.0687 --76.0828 --76.0828 --76.0656 --76.0844 --76.0672 --76.0547 --76.0625 --76.0656 --76.0734 --76.0609 --76.0766 --76.0594 --76.0719 --76.0781 --76.0531 --76.0656 --76.0531 --76.0703 --76.0594 --76.0641 --76.0484 --76.0578 --76.0594 --76.0547 --76.0578 --76.0625 --76.0641 --76.0563 --76.0625 --76.0625 --76.075 --76.0531 --76.0625 --76.0453 --76.0578 --76.0641 --76.0672 --76.0766 --76.0625 --76.0687 --76.0547 --76.0547 --76.0672 --76.0672 --76.0641 --76.0687 --76.0641 --76.0656 --76.0687 --76.0766 --76.0594 --76.0625 --76.0719 --76.0719 --76.0609 --76.0656 --76.0687 --76.0687 --76.0781 --76.0719 --76.0703 --76.0625 --76.0828 --76.0594 --76.075 --76.0641 --76.0594 --76.0781 --76.0609 --76.0781 --76.0703 --76.0672 --76.075 --76.0703 --76.0719 --76.0734 --76.0656 --76.0641 --76.0781 --76.0687 --76.0672 --76.075 --76.0703 --76.0766 --76.0594 --76.0703 --76.0703 --76.0766 --76.075 --76.0672 --76.0641 --76.0516 --76.0656 --76.0687 --76.0672 --76.0641 --76.0766 --76.0641 --76.0703 --76.0781 --76.0719 --76.0672 --76.0719 --76.0641 --76.0687 --76.0641 --76.0766 --76.0656 --76.0625 --76.0719 --76.0703 --76.0672 --76.0672 --76.0734 --76.0672 --76.0625 --76.0687 --76.0625 --76.0687 --76.0609 --76.0797 --76.0719 --76.0734 --76.0703 --76.0766 --76.0656 --76.075 --76.0828 --76.0859 --76.0844 --76.0703 --76.075 --76.0734 --76.0594 --76.0766 --76.0625 --76.0844 --76.0781 --76.0781 --76.0719 --76.0797 --76.0938 --76.0828 --76.0609 --76.0906 --76.0687 --76.0906 --76.0828 --76.0641 --76.0781 --76.0781 --76.0766 --76.0797 --76.075 --76.0578 --76.0734 --76.0687 --76.0687 --76.0734 --76.0656 --76.0781 --76.0641 --76.0719 --76.0734 --76.0687 --76.0844 --76.0766 --76.0766 --76.0719 --76.0641 --76.0609 --76.0547 --76.0563 --76.0641 --76.0578 --76.075 --76.0672 --76.0813 --76.0734 --76.0672 --76.0687 --76.0734 --76.0656 --76.075 --76.0734 --76.0687 --76.0719 --76.0625 --76.0625 --76.0797 --76.0656 --76.0563 --76.0734 --76.0703 --76.0719 --76.0719 --76.0703 --76.0734 --76.0656 --76.0719 --76.0641 --76.0813 --76.0625 --76.0781 --76.0703 --76.0797 --76.0734 --76.0766 --76.0672 --76.0641 --76.0828 --76.0719 --76.0703 --76.0875 --76.0797 --76.0766 --76.0703 --76.0813 --76.0766 --76.0687 --76.0672 --76.0719 --76.0797 --76.075 --76.0813 --76.0859 --76.0813 --76.0875 --76.0969 --76.0844 --76.0781 --76.0687 --76.0734 --76.0734 --76.0703 --76.0781 --76.0734 --76.075 --76.0844 --76.0734 --76.0813 --76.0656 --76.0828 --76.0813 --76.0828 --76.0984 --76.0813 --76.0797 --76.0766 --76.0797 --76.075 --76.0781 --76.0594 --76.0687 --76.0875 --76.0734 --76.0781 --76.0734 --76.0687 --76.0734 --76.0875 --76.0797 --76.075 --76.0687 --76.0719 --76.0875 --76.0734 --76.0703 --76.0719 --76.0781 --76.0734 --76.0734 --76.0906 --76.0766 --76.0719 --76.0672 --76.0844 --76.0656 --76.0984 --76.0734 --76.0719 --76.0797 --76.0687 --76.0609 --76.0703 --76.0687 --76.0625 --76.075 --76.0687 --76.075 --76.0703 --76.0609 --76.0719 --76.0797 --76.0641 --76.0781 --76.0703 --76.0766 --76.0563 --76.0656 --76.0578 --76.0687 --76.0656 --76.0594 --76.0563 --76.0703 --76.0703 --76.0734 --76.0672 --76.0703 --76.0781 --76.0703 --76.0797 --76.0672 --76.0703 --76.0687 --76.0656 --76.0719 --76.0641 --76.0687 --76.0719 --76.0797 --76.0766 --76.0734 --76.0609 --76.0844 --76.0672 --76.0672 --76.0656 --76.0766 --76.0687 --76.0797 --76.0734 --76.0766 --76.0813 --76.0719 --76.0672 --76.0687 --76.0781 --76.0656 --76.0828 --76.0875 --76.0813 --76.0797 --76.0766 --76.1 --76.0953 --76.075 --76.0781 --76.0781 --76.0734 --76.0875 --76.0703 --76.0656 --76.0672 --76.0781 --76.0656 --76.0875 --76.0813 --76.0625 --76.0703 --76.0687 --76.0766 --76.0797 --76.0859 --76.0844 --76.0719 --76.0891 --76.0703 --76.0828 --76.0719 --76.0828 --76.0906 --76.0641 --76.0625 --76.0734 --76.0625 --76.0813 --76.0719 --76.0563 --76.0813 --76.0766 --76.0547 --76.0641 --76.0813 --76.0781 --76.0875 --76.0625 --76.0625 --76.0766 --76.075 --76.0703 --76.075 --76.0734 --76.0656 --76.0781 --76.075 --76.0641 --76.075 --76.0781 --76.075 --76.0703 --76.0563 --76.0625 --76.0766 --76.0687 --76.0703 --76.0578 --76.0641 --76.0719 --76.0859 --76.0797 --76.0828 --76.0563 --76.075 --76.0641 --76.0687 --76.075 --76.0875 --76.0578 --76.0687 --76.0656 --76.0734 --76.0719 --76.0625 --76.0797 --76.0563 --76.0734 --76.0641 --76.0703 --76.0609 --76.0531 --76.0594 --76.0703 --76.0563 --76.0891 --76.0687 --76.0672 --76.0687 --76.0719 --76.0813 --76.0703 --76.0672 --76.0578 --76.0734 --76.0641 --76.0687 --76.0703 --76.0625 --76.0656 --76.0781 --76.0656 --76.0578 --76.0703 --76.0531 --76.0609 --76.0687 --76.0531 --76.0656 --76.0578 --76.0578 --76.0781 --76.0687 --76.0781 --76.0609 --76.0719 --76.0656 --76.0734 --76.0641 --76.0734 --76.0828 --76.0656 --76.0687 --76.0734 --76.0594 --76.0641 --76.0531 --76.0656 --76.0625 --76.0734 --76.0609 --76.0656 --76.0516 --76.0703 --76.0578 --76.0734 --76.0656 --76.0578 --76.0594 --76.0578 --76.0625 --76.0594 --76.0687 --76.0797 --76.0641 --76.0656 --76.0781 --76.0656 --76.0625 --76.0625 --76.0609 --76.0719 --76.0609 --76.0672 --76.0609 --76.075 --76.0781 --76.0578 --76.0781 --76.0609 --76.0906 --76.0734 --76.0625 --76.0813 --76.0625 --76.0734 --76.0687 --76.0687 --76.0703 --76.0781 --76.0594 --76.0734 --76.075 --76.0734 --76.0656 --76.0672 --76.0578 --76.0656 --76.0672 --76.0687 --76.0703 --76.0641 --76.0687 --76.0563 --76.0656 --76.0594 --76.0813 --76.0719 --76.0641 --76.0672 --76.0609 --76.0609 --76.0734 --76.0656 --76.075 --76.0844 --76.0609 --76.0719 --76.0719 --76.0687 --76.075 --76.0734 --76.0734 --76.0641 --76.0703 --76.0797 --76.0547 --76.0734 --76.0734 --76.0703 --76.0859 --76.0578 --76.0672 --76.0625 --76.0656 --76.0766 --76.0813 --76.0672 --76.0734 --76.0484 --76.0766 --76.0703 --76.0734 --76.0594 --76.075 --76.0609 --76.0594 --76.0844 --76.0656 --76.0656 --76.0594 --76.0656 --76.0516 --76.0656 --76.0844 --76.0609 --76.0781 --76.0828 --76.0656 --76.0766 --76.0781 --76.0766 --76.0703 --76.0719 --76.0828 --76.0719 --76.075 --76.0813 --76.0828 --76.0687 --76.0687 --76.0813 --76.0578 --76.0844 --76.0672 --76.0625 --76.0719 --76.0594 --76.0687 --76.0797 --76.0734 --76.0703 --76.0734 --76.0875 --76.0687 --76.0828 --76.0687 --76.0828 --76.0672 --76.0656 --76.0547 --76.0687 --76.0734 --76.0609 --76.0719 --76.075 --76.0766 --76.0797 --76.0813 --76.0687 --76.0672 --76.0687 --76.0578 --76.0828 --76.0641 --76.0828 --76.0625 --76.0672 --76.0813 --76.0828 --76.0719 --76.0672 --76.0703 --76.0641 --76.0625 --76.0656 --76.0734 --76.0641 --76.0625 --76.0641 --76.0766 --76.0703 --76.0781 --76.0609 --76.0656 --76.0672 --76.0656 --76.0625 --76.0703 --76.0719 --76.0687 --76.0625 --76.0594 --76.075 --76.0656 --76.0625 --76.0687 --76.0625 --76.0734 --76.0687 --76.0734 --76.0813 --76.0609 --76.0594 --76.0563 --76.0625 --76.0687 --76.0734 --76.0766 --76.0609 --76.0766 --76.0828 --76.0797 --76.0578 --76.0687 --76.0703 --76.0703 --76.0625 --76.0766 --76.0703 --76.0672 --76.0766 --76.0703 --76.0734 --76.0734 --76.0766 --76.0859 --76.0672 --76.0703 --76.0813 --76.0656 --76.0875 --76.075 --76.0609 --76.0734 --76.0828 --76.0875 --76.0781 --76.0828 --76.0781 --76.0828 --76.0813 --76.0813 --76.0844 --76.0828 --76.0703 --76.0875 --76.0922 --76.0766 --76.0859 --76.0719 --76.075 --76.0656 --76.0687 --76.0797 --76.0672 --76.0578 --76.0781 --76.075 --76.0656 --76.0672 --76.0594 --76.0859 --76.0594 --76.0672 --76.0781 --76.0859 --76.0813 --76.0766 --76.0781 --76.0687 --76.0797 --76.0656 --76.0672 --76.0703 --76.0734 --76.0687 --76.0687 --76.0828 --76.0781 --76.0719 --76.0766 --76.0594 --76.0719 --76.0781 --76.0828 --76.0641 --76.0766 --76.0797 --76.0703 --76.0797 --76.0734 --76.0766 --76.0656 --76.0859 --76.0844 --76.0687 --76.0578 --76.075 --76.0719 --76.0734 --76.0687 --76.0719 --76.0766 --76.075 --76.0594 --76.0734 --76.075 --76.0844 --76.0828 --76.0984 --76.0828 --76.0703 --76.0781 --76.0703 --76.0687 --76.0672 --76.0719 --76.0734 --76.0719 --76.0781 --76.0781 --76.0687 --76.0766 --76.0672 --76.0687 --76.0906 --76.0797 --76.075 --76.0656 --76.0875 --76.0594 --76.0625 --76.0609 --76.0813 --76.0797 --76.0609 --76.0766 --76.0609 --76.0672 --76.0797 --76.0828 --76.0719 --76.0781 --76.0687 --76.0672 --76.0734 --76.0687 --76.0656 --76.0766 --76.075 --76.0703 --76.0687 --76.0719 --76.0719 --76.0797 --76.0891 --76.0719 --76.0656 --76.0719 --76.075 --76.0781 --76.0828 --76.0687 --76.0891 --76.0766 --76.0625 --76.0734 --76.0813 --76.0563 --76.0719 --76.0687 --76.0813 --76.0719 --76.0719 --76.0844 --76.0844 --76.0703 --76.0781 --76.0641 --76.0719 --76.0625 --76.0703 --76.0703 --76.075 --76.0734 --76.0687 --76.0766 --76.075 --76.0719 --76.0734 --76.0797 --76.0859 --76.0797 --76.0703 --76.0797 --76.0797 --76.075 --76.0687 --76.0813 --76.0734 --76.0844 --76.0797 --76.0797 --76.0687 --76.0719 --76.0781 --76.0641 --76.0797 --76.0781 --76.0797 --76.0859 --76.0813 --76.0828 --76.0859 --76.0938 --76.0766 --76.0734 --76.0656 --76.0703 --76.0766 --76.0687 --76.0813 --76.0641 --76.0797 --76.0844 --76.0719 --76.075 --76.0781 --76.0672 --76.0813 --76.0797 --76.0641 --76.0859 --76.0766 --76.075 --76.0734 --76.0813 --76.0719 --76.0656 --76.0875 --76.0813 --76.0891 --76.0828 --76.0766 --76.075 --76.0813 --76.0656 --76.075 --76.0891 --76.0844 --76.0969 --76.0859 --76.0766 --76.0797 --76.0891 --76.0859 --76.0922 --76.0781 --76.0875 --76.0781 --76.0859 --76.0844 --76.075 --76.0797 --76.0797 --76.0844 --76.0813 --76.0859 --76.0781 --76.0891 --76.0656 --76.0859 --76.0609 --76.0922 --76.0844 --76.0797 --76.0719 --76.0891 --76.0875 --76.0781 --76.0859 --76.0844 --76.0687 --76.0797 --76.0844 --76.0875 --76.0766 --76.0828 --76.0859 --76.075 --76.0844 --76.0797 --76.0922 --76.0875 --76.0844 --76.0734 --76.0828 --76.0875 --76.0797 --76.0875 --76.075 --76.0813 --76.0797 --76.0781 --76.075 --76.0844 --76.0672 --76.0766 --76.0641 --76.0813 --76.0797 --76.0766 --76.0875 --76.0797 --76.0844 --76.0922 --76.0844 --76.0906 --76.0813 --76.0938 --76.075 --76.0922 --76.0938 --76.0781 --76.0891 --76.0875 --76.0781 --76.0734 --76.0906 --76.0813 --76.0766 --76.0781 --76.0844 --76.075 --76.0828 --76.0797 --76.0891 --76.0766 --76.0734 --76.0813 --76.0875 --76.0891 --76.0766 --76.0797 --76.0844 --76.0719 --76.0859 --76.0766 --76.0734 --76.0766 --76.0719 --76.0641 --76.0797 --76.0875 --76.0875 --76.0844 --76.0797 --76.0781 --76.0891 --76.0625 --76.0656 --76.0781 --76.0859 --76.075 --76.0859 --76.0828 --76.0766 --76.0672 --76.0641 --76.0609 --76.0687 --76.0781 --76.0687 --76.0687 --76.0828 --76.0734 --76.0687 --76.0734 --76.0687 --76.0891 --76.0719 --76.0719 --76.0687 --76.0719 --76.0672 --76.0687 --76.0656 --76.0547 --76.0625 --76.0625 --76.0656 --76.0625 --76.0703 --76.0703 --76.075 --76.0625 --76.0781 --76.0766 --76.0703 --76.0828 --76.0828 --76.0734 --76.0687 --76.0687 --76.0609 --76.0859 --76.0563 --76.0641 --76.075 --76.0656 --76.0766 --76.0609 --76.0609 --76.075 --76.0609 --76.0625 --76.0656 --76.0609 --76.0703 --76.0641 --76.0766 --76.0578 --76.0656 --76.0734 --76.0547 --76.0609 --76.0719 --76.0719 --76.0531 --76.0687 --76.0766 --76.0687 --76.0687 --76.0766 --76.0656 --76.0672 --76.0734 --76.0766 --76.0734 --76.0594 --76.0781 --76.0766 --76.0578 --76.0703 --76.0625 --76.0687 --76.0547 --76.0625 --76.0625 --76.0563 --76.075 --76.0609 --76.0813 --76.0703 --76.0687 --76.0734 --76.0609 --76.0672 --76.0656 --76.0609 --76.0672 --76.0656 --76.0703 --76.075 --76.0797 --76.0672 --76.0641 --76.0625 --76.0734 --76.0719 --76.0656 --76.0516 --76.0703 --76.0781 --76.0703 --76.0641 --76.075 --76.0797 --76.0703 --76.0656 --76.0625 --76.075 --76.0703 --76.0687 --76.0797 --76.0703 --76.0594 --76.0719 --76.0828 --76.0672 --76.0578 --76.0813 --76.0734 --76.0922 --76.0828 --76.075 --76.0797 --76.0625 --76.0687 --76.0734 --76.0672 --76.0781 --76.0781 --76.0594 --76.0687 --76.0656 --76.075 --76.0813 --76.0781 --76.0859 --76.075 --76.0609 --76.075 --76.0859 --76.0719 --76.0719 --76.0797 --76.0797 --76.0844 --76.0766 --76.075 --76.0813 --76.0719 --76.0687 --76.0719 --76.0859 --76.0766 --76.0797 --76.0672 --76.0859 --76.0625 --76.0609 --76.0813 --76.0734 --76.0844 --76.0766 --76.0734 --76.0734 --76.0672 --76.075 --76.0797 --76.0687 --76.0828 --76.0844 --76.0687 --76.0828 --76.0922 --76.0906 --76.0781 --76.0938 --76.0922 --76.075 --76.075 --76.0781 --76.075 --76.0703 --76.0766 --76.0813 --76.0703 --76.0656 --76.0734 --76.075 --76.0672 --76.0891 --76.0687 --76.0844 --76.075 --76.0828 --76.0703 --76.0719 --76.0719 --76.0719 --76.075 --76.0734 --76.0781 --76.0813 --76.0734 --76.0672 --76.0672 --76.0719 --76.0672 --76.0719 --76.0703 --76.0719 --76.0656 --76.0687 --76.075 --76.0734 --76.0703 --76.0766 --76.0734 --76.075 --76.0781 --76.0687 --76.0719 --76.0766 --76.0719 --76.0734 --76.0656 --76.0547 --76.0672 --76.0828 --76.0563 --76.0672 --76.0719 --76.0672 --76.0641 --76.0719 --76.0625 --76.0703 --76.075 --76.0781 --76.0766 --76.0797 --76.0797 --76.0859 --76.0844 --76.0578 --76.0844 --76.0687 --76.0781 --76.0719 --76.0734 --76.0594 --76.075 --76.0672 --76.0797 --76.0687 --76.0703 --76.0547 --76.0797 --76.0687 --76.0656 --76.0797 --76.0734 --76.0766 --76.0719 --76.075 --76.0891 --76.0844 --76.0672 --76.0687 --76.0687 --76.0813 --76.075 --76.0828 --76.0922 --76.0875 --76.0703 --76.0641 --76.075 --76.0766 --76.0656 --76.0703 --76.0719 --76.0703 --76.0656 --76.0719 --76.0703 --76.0672 --76.0703 --76.0703 --76.0687 --76.0719 --76.0672 --76.0672 --76.0687 --76.0781 --76.0609 --76.0578 --76.0766 --76.075 --76.0594 --76.0719 --76.0844 --76.0672 --76.0656 --76.0594 --76.0578 --76.0687 --76.0672 --76.0625 --76.0625 --76.0578 --76.0687 --76.0656 --76.0719 --76.0641 --76.0594 --76.0719 --76.0656 --76.0656 --76.0641 --76.0578 --76.0656 --76.0625 --76.0531 --76.0656 --76.0609 --76.0797 --76.0625 --76.0641 --76.0672 --76.0625 --76.0734 --76.0563 --76.0516 --76.0719 --76.0625 --76.075 --76.0734 --76.0766 --76.0703 --76.0766 --76.0797 --76.0953 --76.0672 --76.0797 --76.0813 --76.0687 --76.0828 --76.0781 --76.0687 --76.0672 --76.0703 --76.0594 --76.0766 --76.0641 --76.0563 --76.0672 --76.0766 --76.0641 --76.0609 --76.0641 --76.0547 --76.0625 --76.0734 --76.0609 --76.0609 --76.0687 --76.0734 --76.0703 --76.0828 --76.0687 --76.0875 --76.0797 --76.075 --76.0641 --76.0734 --76.0656 --76.0641 --76.075 --76.0641 --76.0906 --76.0625 --76.0719 --76.0703 --76.0734 --76.0578 --76.0656 --76.0734 --76.0734 --76.0703 --76.0578 --76.0641 --76.0719 --76.0625 --76.0703 --76.0766 --76.0766 --76.0672 --76.0703 --76.0734 --76.0734 --76.0641 --76.0563 --76.0656 --76.0672 --76.0734 --76.0625 --76.0687 --76.0609 --76.0594 --76.0703 --76.0453 --76.0641 --76.0516 --76.0484 --76.0719 --76.0703 --76.0469 --76.0625 --76.0563 --76.0641 --76.0672 --76.0609 --76.0547 --76.0609 --76.0547 --76.0531 --76.0469 --76.0547 --76.0563 --76.0609 --76.05 --76.0766 --76.0531 --76.0609 --76.0609 --76.0625 --76.0469 --76.0594 --76.0437 --76.0672 --76.0516 --76.0531 --76.0578 --76.0563 --76.0422 --76.0656 --76.0578 --76.0531 --76.0516 --76.0625 --76.075 --76.0594 --76.0625 --76.0672 --76.0672 --76.0469 --76.0594 --76.0609 --76.0359 --76.0656 --76.0547 --76.0437 --76.0469 --76.0672 --76.0547 --76.0578 --76.0516 --76.0563 --76.05 --76.0609 --76.0437 --76.0594 --76.0484 --76.0641 --76.0594 --76.0594 --76.0687 --76.0594 --76.0672 --76.0672 --76.0734 --76.0625 --76.0531 --76.0578 --76.0578 --76.0656 --76.0516 --76.0594 --76.05 --76.0609 --76.0687 --76.0719 --76.0547 --76.0719 --76.0656 --76.0687 --76.0594 --76.0625 --76.0672 --76.0719 --76.0703 --76.0609 --76.0922 --76.0609 --76.0734 --76.0703 --76.0719 --76.0687 --76.0719 --76.0719 --76.0672 --76.0563 --76.0563 --76.0766 --76.0703 --76.0781 --76.0766 --76.0641 --76.0719 --76.0719 --76.0734 --76.0672 --76.0734 --76.0656 --76.0641 --76.0609 --76.0641 --76.075 --76.0656 --76.0734 --76.0687 --76.0734 --76.0656 --76.0687 --76.0609 --76.0687 --76.0641 --76.0625 --76.0625 --76.0797 --76.0687 --76.0656 --76.0625 --76.0766 --76.0797 --76.0563 --76.0734 --76.0547 --76.0625 --76.0687 --76.0484 --76.0625 --76.0641 --76.0578 --76.0594 --76.0687 --76.0625 --76.0766 --76.0734 --76.0656 --76.0563 --76.0578 --76.0641 --76.0672 --76.0656 --76.0625 --76.0625 --76.0641 --76.0625 --76.0625 --76.0625 --76.075 --76.0719 --76.0563 --76.0703 --76.0531 --76.0578 --76.0578 --76.0641 --76.0578 --76.0594 --76.0641 --76.0578 --76.05 --76.0687 --76.0656 --76.0531 --76.0547 --76.0531 --76.0656 --76.0516 --76.0578 --76.0484 --76.0516 --76.0469 --76.05 --76.0641 --76.0578 --76.0594 --76.0578 --76.0578 --76.0531 --76.0594 --76.0656 --76.0563 --76.0609 --76.0484 --76.05 --76.0484 --76.0625 --76.0531 --76.0516 --76.0484 --76.0578 --76.05 --76.0578 --76.0578 --76.0516 --76.05 --76.0594 --76.0547 --76.0563 --76.0563 --76.0594 --76.0609 --76.0469 --76.0563 --76.0641 --76.0516 --76.0516 --76.0516 --76.05 --76.05 --76.0453 --76.0469 --76.0672 --76.0406 --76.0516 --76.0391 --76.0484 --76.0563 --76.0406 --76.0578 --76.05 --76.0484 --76.0453 --76.05 --76.0469 --76.0563 --76.0516 --76.0375 --76.0422 --76.0469 --76.0359 --76.0516 --76.0469 --76.0312 --76.0484 --76.0437 --76.0594 --76.0437 --76.0437 --76.0578 --76.0422 --76.0437 --76.0406 --76.0531 --76.0563 --76.05 --76.0531 --76.0375 --76.0484 --76.0547 --76.0422 --76.0609 --76.0469 --76.0594 --76.0469 --76.0563 --76.0469 --76.0609 --76.0672 --76.0422 --76.0484 --76.05 --76.0437 --76.0359 --76.0344 --76.0344 --76.0375 --76.0437 --76.05 --76.0406 --76.0547 --76.0469 --76.0422 --76.0484 --76.0297 --76.0469 --76.0453 --76.0344 --76.0422 --76.05 --76.0437 --76.0469 --76.0484 --76.0422 --76.0422 --76.0484 --76.0484 --76.0656 --76.0484 --76.0312 --76.0437 --76.0328 --76.0453 --76.0687 --76.0328 --76.0391 --76.0422 --76.0391 --76.0469 --76.0391 --76.0625 --76.05 --76.0359 --76.0563 --76.0516 --76.0531 --76.05 --76.0469 --76.0406 --76.0484 --76.0484 --76.0422 --76.0453 --76.0375 --76.0328 --76.0422 --76.0375 --76.0563 --76.0563 --76.0406 --76.0422 --76.0453 --76.0641 --76.0344 --76.0578 --76.0594 --76.0484 --76.0516 --76.0469 --76.0609 --76.0594 --76.0484 --76.0391 --76.0437 --76.0531 --76.0547 --76.0469 --76.0437 --76.0563 --76.0531 --76.0547 --76.0406 --76.0469 --76.0484 --76.0391 --76.0437 --76.0547 --76.0531 --76.0547 --76.05 --76.0469 --76.0406 --76.0469 --76.0547 --76.0312 --76.0406 --76.0406 --76.0484 --76.0437 --76.0422 --76.0578 --76.0437 --76.0516 --76.0531 --76.0375 --76.0406 --76.0453 --76.0469 --76.0516 --76.0625 --76.0422 --76.0484 --76.0469 --76.0594 --76.0531 --76.0453 --76.0422 --76.0469 --76.0547 --76.0594 --76.0609 --76.0609 --76.0563 --76.0594 --76.0469 --76.0453 --76.0453 --76.0344 --76.0641 --76.0484 --76.0516 --76.05 --76.0469 --76.0547 --76.0594 --76.0453 --76.0641 --76.0453 --76.0703 --76.0453 --76.0312 --76.0406 --76.0563 --76.0563 --76.05 --76.0531 --76.0422 --76.0578 --76.0531 --76.0391 --76.0406 --76.0516 --76.0516 --76.0578 --76.0594 --76.0531 --76.0453 --76.0453 --76.0266 --76.0609 --76.0484 --76.0516 --76.0453 --76.0484 --76.0375 --76.0406 --76.0422 --76.0437 --76.0469 --76.0453 --76.0328 --76.0594 --76.05 --76.0406 --76.0375 --76.05 --76.0312 --76.0437 --76.0531 --76.0563 --76.0359 --76.0422 --76.0469 --76.0391 --76.0422 --76.0375 --76.0484 --76.0391 --76.05 --76.0437 --76.0531 --76.0344 --76.0453 --76.0563 --76.05 --76.0344 --76.0406 --76.0484 --76.0422 --76.0578 --76.0531 --76.0437 --76.0375 --76.0563 --76.0484 --76.0531 --76.0469 --76.0484 --76.0563 --76.0516 --76.0516 --76.0375 --76.0563 --76.0578 --76.0437 --76.05 --76.0484 --76.0375 --76.0359 --76.0297 --76.0453 --76.0531 --76.0391 --76.0516 --76.0437 --76.0328 --76.0484 --76.0578 --76.0359 --76.0391 --76.0406 --76.0312 --76.0297 --76.0359 --76.0328 --76.0312 --76.0281 --76.0359 --76.0422 --76.0469 --76.0469 --76.0344 --76.0328 --76.0297 --76.0312 --76.0234 --76.0219 --76.0281 --76.0312 --76.0344 --76.025 --76.0406 --76.0156 --76.0359 --76.0469 --76.0359 --76.0328 --76.0328 --76.0406 --76.0328 --76.0281 --76.0391 --76.0344 --76.0406 --76.0375 --76.0391 --76.0531 --76.0484 --76.0422 --76.0391 --76.0406 --76.0281 --76.0516 --76.0422 --76.0312 --76.0391 --76.0406 --76.0266 --76.0406 --76.0281 --76.0359 --76.0391 --76.0391 --76.0516 --76.0344 --76.0406 --76.0391 --76.0453 --76.0359 --76.0391 --76.0234 --76.0453 --76.0281 --76.0469 --76.0437 --76.0359 --76.0422 --76.0437 --76.0359 --76.0391 --76.0344 --76.0375 --76.025 --76.0156 --76.0391 --76.0391 --76.0469 --76.0375 --76.0437 --76.0406 --76.0359 --76.0328 --76.0266 --76.0328 --76.0344 --76.0422 --76.0281 --76.0312 --76.0344 --76.0453 --76.0266 --76.0453 --76.0391 --76.0406 --76.0219 --76.0391 --76.0406 --76.0328 --76.0453 --76.05 --76.0391 --76.0391 --76.0312 --76.025 --76.0266 --76.0328 --76.0375 --76.0312 --76.0312 --76.0281 --76.025 --76.0266 --76.025 --76.0266 --76.0375 --76.0453 --76.0406 --76.0281 --76.0406 --76.0328 --76.0328 --76.0297 --76.0234 --76.0328 --76.0297 --76.0234 --76.0344 --76.0391 --76.0266 --76.0391 --76.0188 --76.0266 --76.0344 --76.0359 --76.0328 --76.0328 --76.0281 --76.0375 --76.0297 --76.0281 --76.0297 --76.0297 --76.0312 --76.0453 --76.0359 --76.0359 --76.0391 --76.0328 --76.0188 --76.0219 --76.0375 --76.0281 --76.0312 --76.0234 --76.0312 --76.0391 --76.0281 --76.0359 --76.0328 --76.0234 --76.0344 --76.0188 --76.0219 --76.0359 --76.0328 --76.0312 --76.0375 --76.0359 --76.0234 --76.0422 --76.0266 --76.0344 --76.0266 --76.0328 --76.0406 --76.0234 --76.0203 --76.0297 --76.0266 --76.0359 --76.0219 --76.0281 --76.0375 --76.0281 --76.0391 --76.0344 --76.0453 --76.0219 --76.0344 --76.0328 --76.0375 --76.0391 --76.0297 --76.0406 --76.0266 --76.0469 --76.0359 --76.0344 --76.0219 --76.0375 --76.0406 --76.0328 --76.0406 --76.0312 --76.0375 --76.0312 --76.0328 --76.0422 --76.0547 --76.0437 --76.05 --76.0406 --76.0359 --76.0219 --76.0188 --76.0312 --76.0281 --76.0297 --76.0188 --76.0375 --76.0125 --76.0172 --76.0156 --76.0391 --76.0297 --76.025 --76.0234 --76.0344 --76.0172 --76.0188 --76.0281 --76.0234 --76.0312 --76.0328 --76.0172 --76.0375 --76.0281 --76.0312 --76.0312 --76.0266 --76.0344 --76.0359 --76.0297 --76.0312 --76.0406 --76.0422 --76.0359 --76.0437 --76.0359 --76.0453 --76.0453 --76.0281 --76.0344 --76.0469 --76.0563 --76.0422 --76.0453 --76.0391 --76.0312 --76.0312 --76.0437 --76.0422 --76.0391 --76.0609 --76.0234 --76.0391 --76.0406 --76.0328 --76.0234 --76.025 --76.0359 --76.0266 --76.0219 --76.0469 --76.0547 --76.0203 --76.0453 --76.0391 --76.0281 --76.0312 --76.0297 --76.0312 --76.0391 --76.0453 --76.0344 --76.0375 --76.0359 --76.0469 --76.0437 --76.0359 --76.0359 --76.0281 --76.0219 --76.0094 --76.0312 --76.0359 --76.0266 --76.0344 --76.0437 --76.0406 --76.0328 --76.0328 --76.0375 --76.0328 --76.0391 --76.0203 --76.0297 --76.0297 --76.0359 --76.0281 --76.0391 --76.0422 --76.0312 --76.0344 --76.0281 --76.025 --76.0359 --76.0484 --76.0516 --76.0484 --76.0234 --76.0531 --76.0625 --76.0344 --76.0453 --76.0609 --76.0422 --76.0563 --76.0437 --76.0469 --76.0422 --76.0453 --76.05 --76.05 --76.05 --76.0391 --76.0469 --76.0422 --76.0516 --76.0484 --76.05 --76.0422 --76.0469 --76.0484 --76.0437 --76.0453 --76.0406 --76.0406 --76.0312 --76.0359 --76.0469 --76.0516 --76.0359 --76.0453 --76.0563 --76.0516 --76.0484 --76.0531 --76.0531 --76.0516 --76.05 --76.0531 --76.0328 --76.0531 --76.0422 --76.0578 --76.0453 --76.0422 --76.05 --76.0406 --76.0453 --76.0469 --76.0609 --76.0359 --76.0391 --76.0281 --76.0406 --76.0391 --76.0375 --76.025 --76.0391 --76.0312 --76.0312 --76.0359 --76.0422 --76.0391 --76.0359 --76.0406 --76.0406 --76.0297 --76.0531 --76.0375 --76.0469 --76.0266 --76.0344 --76.0375 --76.0281 --76.0281 --76.0312 --76.0266 --76.0375 --76.0406 --76.0234 --76.0344 --76.0297 --76.0266 --76.0281 --76.0281 --76.0453 --76.0437 --76.0453 --76.0312 --76.0344 --76.0406 --76.0312 --76.0312 --76.0297 --76.0359 --76.0328 --76.0547 --76.0375 --76.0516 --76.0437 --76.0359 --76.0469 --76.0312 --76.0281 --76.0359 --76.0359 --76.0453 --76.0531 --76.0422 --76.05 --76.0328 --76.0453 --76.0437 --76.0266 --76.0453 --76.0328 --76.0297 --76.0453 --76.0297 --76.0422 --76.0375 --76.0312 --76.0516 --76.0297 --76.0359 --76.0437 --76.0422 --76.0406 --76.0375 --76.0406 --76.0422 --76.0344 --76.0406 --76.0516 --76.0422 --76.0484 --76.0422 --76.0406 --76.0359 --76.0453 --76.05 --76.0406 --76.0281 --76.0375 --76.0484 --76.0484 --76.0359 --76.0516 --76.0422 --76.0328 --76.0578 --76.0469 --76.0516 --76.05 --76.0656 --76.0609 --76.0437 --76.0516 --76.0437 --76.0453 --76.0375 --76.0625 --76.0516 --76.0484 --76.0484 --76.0375 --76.0406 --76.0453 --76.0375 --76.0547 --76.0375 --76.0437 --76.0547 --76.0531 --76.0375 --76.0422 --76.0469 --76.0578 --76.0422 --76.0516 --76.0391 --76.0469 --76.0469 --76.0375 --76.0422 --76.0469 --76.0547 --76.0422 --76.0437 --76.0406 --76.0375 --76.0344 --76.0391 --76.0359 --76.0375 --76.0281 --76.0422 --76.0203 --76.0266 --76.0406 --76.0312 --76.0375 --76.0219 --76.0359 --76.0266 --76.0281 --76.0422 --76.0203 --76.0406 --76.0297 --76.0406 --76.0484 --76.0469 --76.0312 --76.0469 --76.0375 --76.0406 --76.0391 --76.0344 --76.0484 --76.0484 --76.0328 --76.0328 --76.0422 --76.0344 --76.0422 --76.0344 --76.0344 --76.0344 --76.0453 --76.0453 --76.0359 --76.0406 --76.0375 --76.0375 --76.0281 --76.0391 --76.0344 --76.0266 --76.0469 --76.0188 --76.0312 --76.0359 --76.0359 --76.0266 --76.0188 --76.0297 --76.0297 --76.0312 --76.0359 --76.0297 --76.0266 --76.025 --76.0328 --76.0375 --76.0422 --76.0219 --76.0188 --76.0203 --76.0359 --76.0172 --76.0109 --76.0141 --76.0234 --76.0281 --76.0312 --76.0203 --76.0188 --76.025 --76.0078 --76.0344 --76.0281 --76.0281 --76.0344 --76.0359 --76.0281 --76.0375 --76.0219 --76.025 --76.0453 --76.0312 --76.0453 --76.0375 --76.0297 --76.0344 --76.0344 --76.0422 --76.0375 --76.025 --76.025 --76.0344 --76.0297 --76.0391 --76.0203 --76.025 --76.0406 --76.0359 --76.0328 --76.0234 --76.0297 --76.0422 --76.0234 --76.0437 --76.0391 --76.0344 --76.0453 --76.0437 --76.0359 --76.0328 --76.0234 --76.0406 --76.0266 --76.0328 --76.0391 --76.0312 --76.0281 --76.0328 --76.0266 --76.0219 --76.0188 --76.0328 --76.0234 --76.0344 --76.0203 --76.0328 --76.0266 --76.0375 --76.0359 --76.0297 --76.0219 --76.0234 --76.0328 --76.0281 --76.0406 --76.0344 --76.025 --76.0344 --76.0219 --76.0297 --76.0266 --76.0172 --76.0219 --76.0312 --76.0437 --76.0203 --76.0312 --76.0375 --76.0266 --76.0312 --76.0266 --76.025 --76.0219 --76.0234 --76.025 --76.0188 --76.0219 --76.0422 --76.0437 --76.0219 --76.0234 --76.0266 --76.025 --76.0062 --76.025 --76.0188 --76.0203 --76.0172 --76.0266 --76.0281 --76.0281 --76.0234 --76.0234 --76.0219 --76.0234 --76.0109 --76.025 --76.0312 --76.0203 --76.0188 --76.0156 --76.0219 --76.0375 --76.0234 --76.0047 --76.0312 --76.0328 --76.0109 --76.0391 --76.0281 --76.0328 --76.0188 --76.0266 --76.0141 --76.0203 --76.0266 --76.025 --76.0188 --76.0219 --76.0188 --76.0188 --76.0172 --76.0188 --76.0172 --76.0188 --76.0156 --76.0312 --75.9906 --76.0125 --76.0125 --76.0312 --76.0125 --76.0172 --76.0172 --76.0141 --76.0188 --76.0109 --76.0359 --76.0125 --76.0062 --76.0125 --76.0234 --76.0344 --76.0234 --76.0188 --76.0172 --76.0203 --76.0219 --76.0281 --76.0234 --76.0297 --76.0234 --76.0266 --76.0109 --76.0109 --76.0125 --76.0047 --76.0047 --76.0109 --76.0219 --76.0031 --76.0219 --76.0031 --76.0141 --76 --76.0125 --76.0125 --76.0172 --75.9969 --76.0031 --76.0109 --76.0188 --76.0094 --76.0125 --76.0078 --76.0141 --76.0094 --76.025 --76.025 --76.0156 --76.025 --76.0219 --76.0141 --76.0234 --76.0078 --76.0203 --76.0125 --76.0344 --76.0219 --76.0109 --76.0156 --76.0234 --76.0234 --76.0062 --76.0156 --76.0156 --76.0234 --76.0094 --76.0219 --76.0203 --76.0219 --76.0062 --76.025 --76.0266 --76.0172 --76.0109 --76.0156 --76.0219 --76.0078 --76.0219 --76.0188 --76.0328 --76.0172 --76.0062 --76.0156 --76.0172 --76.0156 --76.0078 --76.0188 --76.0094 --76.025 --76.0125 --76.0234 --76.0141 --76.0203 --76.0141 --76.0156 --76.0078 --76.0188 --76.0125 --76.025 --76.0109 --76.0109 --76.0141 --76.0156 --76.0188 --76.0172 --76.0328 --76.0281 --76.0203 --76.0297 --76.0297 --76.0266 --76.0109 --76.0219 --76.0312 --76.0234 --76.0219 --76.0188 --76.0219 --76.0344 --76.0156 --76.0266 --76.0328 --76.0281 --76.0078 --76.0203 --76.0188 --76.0203 --76.0109 --76.025 --76.0234 --76.0188 --76.0156 --76.0125 --76.0094 --76.0125 --76.0078 --76.0281 --76.0094 --76.0234 --76.0109 --76.0016 --76.0125 --76.0094 --76.0219 --76.0203 --76.0219 --76.0297 --76.0109 --76.0188 --76.025 --76.0062 --76.0125 --76.0172 --76.0266 --76.0047 --76.0234 --76.0203 --76.0312 --76.0219 --76.0062 --76.0234 --75.9984 --76.0219 --76.0219 --76 --76.0156 --76.0312 --76.0219 --76.0219 --76.0219 --76.0094 --76.0078 --76.0078 --76.0047 --76.0281 --76.0125 --76.0016 --76.0047 --76.0141 --76.0031 --76.0047 --76.0016 --76.0141 --76.0141 --76.0172 --76.0062 --76.0172 --76.0094 --76.0234 --75.9938 --76.0047 --76.0125 --76.0062 --75.9953 --76.0109 --75.9984 --76.0031 --76.0125 --76.0141 --76.0188 --76.0094 --76.0219 --76.0109 --76.0062 --75.9875 --76.0016 --76.0094 --76.025 --76.0141 --76.0156 --76.0188 --76.025 --76.0234 --76.0062 --76.0266 --76.0172 --76.0312 --76.0188 --76.0047 --76.0203 --76.0234 --76.0062 --76.0109 --76 --76.0062 --76.0141 --76.0078 --76.0188 --76.0156 --76.0172 --76.0188 --76.0141 --76.0062 --76.0172 --76.0188 --76.0172 --76.0156 --75.9969 --76.0172 --76.0172 --76.0172 --76.0016 --76.0188 --76.0125 --76.0094 --76.0016 --75.9984 --76.0078 --76.0047 --76.0156 --75.9891 --76.0047 --76.0109 --76.0031 --76.0016 --76.0062 --76.0047 --76.0125 --75.9953 --76.0094 --76.0062 --76.0031 --75.9922 --75.9984 --76.0062 --76.0047 --76.0125 --76 --75.9984 --76.0031 --76.0031 --75.9953 --76.0031 --75.9969 --76.0094 --76.0094 --76 --76.0094 --76.0203 --76.0031 --76.0016 --75.9984 --76.0125 --76.0141 --76.0094 --76.0062 --76.0062 --76.0031 --76.0141 --76.0219 --75.9875 --76.0109 --76.0062 --76.0094 --76.0141 --76.0078 --76.0125 --76.0156 --76.0125 --76.0125 --76.0016 --76.0062 --76.0172 --75.9953 --76.0141 --75.9953 --76.0016 --75.9969 --76.0125 --76.0047 --76.0031 --75.9984 --76.0062 --76.0062 --75.9922 --76.0031 --75.9922 --76 --75.9953 --76.0016 --76.0125 --76.0016 --76 --75.9969 --76.0031 --76.0156 --75.9922 --76.0109 --76.0016 --75.9984 --76.0047 --75.9969 --75.9953 --76.0078 --75.9922 --76.0031 --76.0047 --76.0125 --76.0141 --76.0047 --76.0156 --76.0078 --76 --75.9984 --76.0094 --76.0016 --76.0109 --76.0078 --76.0016 --75.9984 --75.9984 --76.0016 --76.0094 --76.0062 --75.9906 --76.0016 --76.0078 --75.9953 --76.0094 --76.0094 --76.0047 --75.9953 --75.9953 --76.0031 --76.0047 --75.9969 --76.0062 --76.0109 --75.9969 --76.0109 --76.0078 --76.0016 --75.9906 --76.0016 --75.9969 --76.0062 --75.9875 --75.9953 --76.0094 --76.0016 --76.0141 --75.9891 --75.9953 --76.0047 --76.0062 --76.0078 --76.0078 --75.9906 --75.9938 --75.9969 --75.9953 --75.9953 --75.9969 --76.0125 --76.0016 --75.9953 --76 --76.0031 --76.0141 --76.0016 --76.0078 --76.0031 --76.0078 --76.0156 --76.0031 --76.0047 --76.0078 --76.0141 --75.9969 --76.0031 --75.9984 --75.9938 --75.9969 --76 --76.0078 --76 --76 --76.0141 --75.9938 --75.9953 --76.0078 --76.0078 --76.0109 --76 --75.9906 --76.0062 --76.0078 --76.0156 --75.9969 --76.0078 --76.0141 --75.9922 --76.0078 --76.0062 --76.0125 --76.0062 --76.0203 --76.0172 --76.0141 --76.0203 --76.0172 --76.0141 --76.0188 --76.025 --76.0188 --76.0281 --76.0141 --76.0172 --76.0062 --76.0141 --76.0125 --76.0094 --76.0266 --76.0062 --76.0062 --76.0062 --76.0172 --76.0094 --76.0094 --76 --75.9969 --76.0016 --76.0094 --76.0047 --76.0266 --76.0203 --75.9969 --76.0078 --76.0047 --76.0062 --76.0094 --76.0203 --76.0031 --76.0078 --76.0062 --75.9969 --76.0062 --76.0094 --76.0094 --76.0047 --76.0078 --75.9844 --76.0156 --75.9953 --76.0141 --75.9969 --76.0031 --76.0172 --76 --76.0078 --76.0109 --76.0125 --76.0125 --75.9953 --76.0125 --76.0094 --76.0156 --76.0234 --76.0125 --76.0172 --76 --76.0047 --76.0172 --76.0141 --76.0234 --76.0219 --76.0078 --76.0109 --76.0062 --76.0047 --76.0203 --76 --76.0156 --76.0094 --76.0141 --76.0094 --76.0094 --76 --75.9922 --76.0047 --76.0078 --76.0031 --76.0047 --76.0062 --76.0125 --76 --76.0109 --76.0109 --76.0156 --76.0172 --76.0125 --76.0156 --76.0172 --76.0172 --76.0094 --76.0094 --76.0188 --76.0109 --76.0047 --76.0172 --76.0031 --76.0062 --76.0156 --76 --75.9938 --76.0094 --76.0109 --75.9922 --75.9922 --75.9922 --76.0125 --76.0109 --76.0047 --75.9969 --76.0188 --75.9922 --76.0078 --75.9984 --76.0016 --76.0016 --76.0031 --76.0094 --75.9969 --76.0172 --76.0062 --76.0156 --76.0062 --75.9938 --76.0219 --75.9969 --76.0062 --75.9984 --76.0016 --76.0062 --75.9922 --75.9891 --76.0062 --75.9969 --75.9969 --76.0047 --76.0109 --75.9969 --75.9969 --76.0078 --75.9938 --76.0078 --75.9938 --76.0125 --76.0094 --76.0141 --76.0234 --75.9938 --76.0109 --76.0078 --75.9969 --76.0016 --76.0172 --76.0109 --75.9922 --76.0156 --76.0094 --76.0078 --76.0109 --76.0078 --76.0078 --76 --76.0312 --76.0031 --76.0156 --76.0047 --75.9984 --76.0094 --76.0219 --76.0234 --76.0203 --76.0156 --76.0234 --76.0094 --76.0094 --76.0062 --76.0062 --75.9984 --75.9984 --75.9984 --75.9859 --75.9922 --76.0047 --75.9953 --76.0047 --75.9938 --75.9969 --75.9984 --75.9969 --75.9953 --76.0016 --75.9969 --75.9938 --75.9844 --75.9891 --75.9906 --75.9844 --75.9875 --75.9953 --75.9875 --75.9875 --75.9859 --75.9844 --75.9859 --75.9891 --75.9859 --75.9938 --75.9859 --75.9906 --75.9906 --75.9844 --75.9938 --75.975 --75.9938 --76 --76.0094 --75.9938 --75.9938 --76 --75.9906 --76.0031 --75.9844 --75.9953 --75.9891 --75.9812 --75.9906 --75.9766 --75.9812 --75.9891 --75.9938 --76.0016 --75.9938 --75.9844 --76 --75.9875 --75.975 --75.9844 --75.9984 --75.9859 --75.9859 --76 --75.9844 --75.9781 --75.9844 --75.9953 --75.9875 --75.9828 --75.9969 --75.9938 --75.9844 --75.9922 --75.9859 --75.9812 --75.9844 --75.9797 --75.9781 --75.9844 --75.9828 --75.9797 --75.9828 --75.9797 --75.9875 --75.9859 --75.9828 --75.9875 --75.9797 --75.9719 --75.9797 --75.9938 --75.9781 --75.9844 --75.9781 --75.9797 --75.9969 --75.9969 --75.9828 --75.9922 --75.9875 --75.9953 --75.9891 --75.9906 --75.9891 --75.9969 --75.9906 --75.9953 --76.0062 --75.9906 --75.9859 --75.9922 --76.0016 --75.9938 --75.9938 --75.9875 --75.9891 --75.9953 --75.9953 --75.9844 --76.0016 --75.9984 --75.9984 --75.9875 --75.9984 --75.9906 --75.9875 --75.9906 --75.9844 --75.9922 --75.9938 --75.9906 --75.9891 --75.9922 --75.9859 --75.9859 --75.9953 --75.9906 --75.9922 --75.9922 --75.9938 --75.9953 --76.0031 --75.9859 --76 --76 --76.0094 --75.9938 --75.9875 --75.9984 --75.9906 --75.9953 --75.9984 --76.0016 --75.9891 --75.9922 --75.9891 --76.0016 --75.9953 --76.0062 --75.9828 --76.0062 --76.0078 --76.0047 --75.9922 --75.9984 --76.0047 --76.0031 --75.9859 --75.9766 --75.9953 --75.9906 --75.975 --75.9953 --76.0016 --76.0031 --76 --76.0016 --75.9938 --75.9984 --76 --75.9969 --76.0016 --75.9922 --76.0062 --75.9953 --76.0016 --75.9953 --76.0172 --76.0078 --76 --75.9922 --75.9922 --75.9922 --75.9969 --76.0016 --76 --75.9953 --76.0031 --75.9922 --76.0078 --76.0031 --76.0062 --75.9922 --76.0016 --76.0078 --76.0125 --76.0031 --76.0016 --75.9922 --76.0203 --76.0016 --76.0109 --75.9953 --76.0062 --75.9984 --75.9875 --75.9938 --75.9906 --75.9875 --75.9984 --76.0109 --75.9953 --75.9891 --76 --76.0094 --75.9953 --75.9875 --76.0188 --75.9984 --76.0016 --75.9906 --75.9938 --75.9875 --75.9875 --75.9953 --75.9953 --76.0016 --76.0125 --75.9984 --75.9812 --75.9828 --75.9984 --76.0031 --75.9922 --76 --75.9875 --75.9875 --75.9891 --76.0047 --75.9844 --76.0078 --76.0062 --75.9969 --76.0062 --76.0047 --76.0031 --76.0141 --76.0062 --75.9844 --76.0031 --76.0031 --75.9953 --76.0016 --76 --76.0141 --76 --75.9984 --75.9891 --76.0156 --76.0141 --76.0094 --75.9969 --76.0031 --76.0016 --75.9953 --75.9953 --76 --76.0016 --76.0016 --75.9938 --76.0047 --75.9969 --75.9969 --75.9938 --76.0094 --76.0078 --75.9953 --75.9984 --76.0078 --75.9984 --75.9969 --75.9922 --75.9953 --75.9906 --75.9969 --76.0047 --76.0016 --76.0047 --76.0016 --76.0031 --75.9953 --76.0188 --76.0078 --76.0031 --75.9953 --76.0062 --75.9969 --76.0078 --75.9969 --75.9938 --75.9906 --76.0094 --75.9922 --76 --75.9984 --75.9891 --76 --76.0062 --76.0016 --76.0062 --76.0219 --75.9953 --75.9891 --76.0062 --76.0125 --75.9984 --76.0031 --75.9984 --75.9891 --75.9984 --76.0078 --76.0109 --76.0062 --76.0094 --76.0047 --76.0141 --76.0156 --76.0125 --76.0094 --76.0109 --76.0016 --75.9984 --76.0031 --76.0125 --76.0047 --76.0047 --75.9969 --76.0062 --76.0156 --76.0062 --76 --76.0031 --76.0047 --76.0031 --76.0016 --76.0094 --76.0141 --76.0047 --75.9984 --76.0094 --76.0125 --76.0125 --76.0172 --76.0031 --75.9984 --75.9984 --75.9953 --75.9875 --75.9969 --75.9953 --75.9969 --75.9984 --76.0109 --76.0094 --76.0094 --76.0141 --76.0031 --75.9969 --75.9984 --76.0031 --75.9969 --76.0016 --75.9969 --75.9859 --76.0031 --76.0031 --76.0141 --76.0062 --76.0172 --76.0047 --75.9984 --76.0047 --76.0094 --75.9859 --76 --75.9953 --76.0016 --75.9969 --75.9953 --76.0016 --76.0062 --75.975 --75.9922 --76.0047 --76.0016 --75.9953 --75.9953 --76.0016 --76.0172 --76.0047 --75.9969 --76.0062 --76 --76.0062 --76.0156 --76.0109 --76.0078 --75.9953 --76.0047 --76.0094 --76.0109 --76.0031 --76.0031 --76.0016 --76.0078 --76.0078 --76.0078 --75.9953 --76.0047 --76.0062 --76.0031 --76.0062 --75.9875 --75.9984 --75.9828 --75.9891 --76.0031 --75.9984 --75.9922 --76 --76.0109 --76.0062 --76.0062 --76.0031 --75.9984 --76.0141 --76.0078 --76.0062 --76 --76.0094 --76.0047 --76 --75.9891 --76 --75.9859 --76.0141 --76.0156 --76 --76.0125 --75.9828 --75.9891 --76 --75.9922 --76.0031 --76.0078 --76.0062 --75.9922 --76.0062 --76 --75.9922 --75.9953 --75.9953 --75.9938 --75.9922 --75.9859 --75.9828 --75.9984 --75.9922 --75.9812 --75.9906 --76 --75.9938 --75.9875 --76.0031 --75.9906 --75.9891 --75.9906 --75.9859 --75.9875 --75.9875 --75.9953 --75.9969 --76 --75.9875 --75.9922 --75.9922 --76.0031 --76.0078 --76.0156 --75.9875 --76.0016 --76.0031 --76.0031 --75.9969 --75.9984 --75.9953 --76.0094 --75.9859 --75.9969 --75.9984 --75.9984 --75.9984 --75.9781 --75.9938 --75.9875 --76.0125 --76.0016 --76.0031 --76.0031 --76.0141 --76 --76.0062 --76.0062 --76.0016 --76.0016 --76.0234 --75.9953 --76.0031 --76.0016 --76.0062 --76 --76.0141 --76.0125 --76.0094 --76.0203 --76.0031 --76.0109 --76.0109 --76.0094 --76.0109 --76.0094 --76 --76.0078 --76.0203 --76.0047 --76.0172 --76 --76.0031 --76.0062 --76.0094 --75.9984 --75.9969 --76.0125 --76.0141 --75.9953 --76.0125 --76.0172 --76.0047 --76.0094 --76.0031 --76.0094 --75.9938 --75.9906 --76.0094 --75.9938 --76.0031 --76.0094 --76 --75.9906 --76.0047 --76 --76.0078 --76.0078 --75.9938 --76.0031 --75.9969 --76.0172 --75.9953 --75.9891 --76.0016 --76.0047 --76.0078 --75.9953 --76.0219 --76 --76.0188 --75.9844 --76.0094 --75.9906 --76 --75.9906 --76.0031 --75.9922 --76.0031 --76 --75.9891 --75.9938 --76.0078 --76.0188 --76.0031 --75.9984 --75.9969 --76.0047 --76.0078 --75.9969 --76.0047 --75.9938 --76.0094 --76 --76.0125 --76 --75.9922 --75.9969 --75.9859 --75.9938 --75.9906 --75.9938 --76 --75.9891 --75.9984 --75.9969 --75.9938 --75.9984 --76.0031 --75.9969 --76.0062 --75.9906 --76.0016 --76.0141 --75.9859 --75.9875 --75.9906 --76.0031 --76.0047 --75.9969 --76 --75.9969 --75.9953 --75.9969 --75.9969 --76 --76 --76 --75.9953 --76 --76.0016 --75.9938 --75.9984 --75.9922 --76.0047 --75.9891 --76 --76.0031 --75.9953 --76.0047 --75.9922 --75.9984 --75.9922 --75.9938 --75.9875 --75.9938 --75.9969 --76 --75.9875 --76.0047 --75.9844 --75.9953 --75.9953 --76.0062 --75.9938 --75.9953 --76.0031 --75.9953 --76.0016 --76.0031 --76.0047 --76.0125 --76.0234 --76.0031 --76.0172 --76.0031 --76.0125 --76.0047 --75.9953 --76.0094 --76.0094 --76 --75.9969 --76.0109 --76.0094 --76.0062 --76.0047 --76.0031 --75.9953 --76.0109 --76.0031 --76.0031 --75.9938 --76.0031 --75.9969 --76 --75.9891 --75.9891 --76.0016 --75.9953 --75.9922 --75.9953 --76.0031 --75.9906 --76.0031 --75.9938 --76.0062 --76.0047 --75.9969 --76.0125 --75.9891 --76.0031 --75.9969 --76 --76.0047 --76.0016 --76.0109 --76.0094 --76.0078 --76.0031 --75.9984 --76 --75.9969 --76.0016 --75.9953 --76.0031 --76.0062 --75.9906 --76.0047 --75.9891 --76.0203 --76.0172 --75.9875 --76.0141 --75.9969 --75.9953 --75.9984 --76.0109 --76.0047 --75.9969 --76.0078 --75.9875 --76.0016 --75.9891 --76 --75.9875 --75.9953 --76.0016 --75.9969 --75.9906 --76.0062 --76.0062 --76.0016 --76 --75.9938 --75.9969 --75.9984 --76.0016 --75.9859 --75.9891 --75.9969 --75.9969 --75.9781 --76.0016 --75.9984 --75.9953 --75.9984 --75.9922 --76.0031 --75.9875 --75.9938 --76 --75.9953 --75.9828 --75.9953 --76 --76.0016 --75.9922 --75.9938 --76.0109 --75.9922 --75.9938 --75.9844 --75.9828 --75.9875 --75.9797 --75.9922 --75.9984 --75.9812 --76.0016 --75.9953 --76.0047 --75.9922 --75.9969 --75.9812 --75.9922 --75.9969 --75.9938 --75.9906 --76.0078 --75.9906 --75.9859 --76 --75.9844 --75.9891 --75.9953 --75.9984 --75.9922 --75.9906 --75.9906 --75.975 --75.9922 --75.9688 --75.9688 --75.9766 --75.9922 --75.9844 --75.9781 --75.9828 --75.9969 --75.9922 --75.9797 --75.9859 --75.9922 --75.9812 --75.9844 --75.9969 --75.9891 --75.9891 --75.9891 --76 --75.9891 --75.9844 --75.9859 --75.9922 --75.9984 --75.9781 --75.9922 --75.9891 --75.9922 --76.0094 --76 --75.9906 --75.9844 --75.9906 --75.9984 --76.0047 --75.9891 --75.9844 --75.9859 --75.9875 --75.9906 --75.9969 --75.9969 --75.9875 --76.0016 --76.0016 --76 --75.9906 --75.9875 --76.0031 --75.9891 --75.9781 --75.9922 --75.9938 --75.9828 --75.9844 --76.0031 --75.9844 --75.9812 --75.9859 --75.9781 --75.9844 --75.9906 --76 --75.9891 --75.9875 --75.9906 --75.9734 --75.9859 --75.9969 --75.9766 --75.9969 --75.975 --75.9969 --75.9938 --75.9859 --75.9812 --75.9812 --75.9938 --75.9734 --75.9891 --75.9828 --75.9922 --75.975 --75.9969 --75.9922 --76.0031 --76.0062 --75.9938 --75.9844 --76 --75.9781 --75.9719 --75.9812 --75.9844 --75.9938 --75.975 --75.9938 --75.9922 --75.9969 --76.0016 --75.9875 --75.9969 --75.9906 --75.9844 --75.9891 --75.9969 --75.9922 --75.9844 --75.9891 --75.9969 --75.9859 --76.0016 --75.9969 --75.9891 --75.9875 --75.9953 --76.0062 --76.0031 --75.9984 --75.9938 --75.9922 --75.9969 --76.0016 --76 --75.9906 --76.0031 --76.0062 --76.0016 --75.9859 --76.0062 --76.0109 --75.9844 --76.0125 --75.9938 --75.9984 --76.0031 --75.9953 --75.9984 --75.9938 --75.9859 --76 --76.0016 --75.9906 --76 --75.9984 --75.9938 --75.9922 --76.0094 --76.0016 --75.9969 --76 --75.9969 --76.0047 --75.9859 --76.0078 --75.9875 --76.0047 --75.9938 --75.9984 --75.9969 --75.9891 --75.9984 --75.9984 --76.0047 --76.0141 --76.0016 --76.0125 --75.9984 --75.9969 --75.9906 --75.9875 --75.9891 --75.9953 --75.9859 --76 --76.0016 --75.9938 --75.9953 --75.9953 --76.0109 --76.0016 --75.9906 --75.9984 --75.9906 --75.9938 --75.9797 --75.9875 --75.9984 --75.9891 --75.9922 --75.9969 --75.9828 --76.0016 --75.9859 --75.9922 --75.9938 --75.9938 --75.9953 --75.9891 --75.9922 --76.0062 --75.9891 --76 --75.9891 --75.9953 --76.0031 --75.9891 --75.9938 --76.0031 --76.0047 --75.9938 --75.9828 --75.9969 --75.9781 --75.9938 --75.9844 --76 --75.9938 --76.0094 --76 --75.9906 --75.9922 --75.9875 --76 --75.9953 --75.9891 --75.9734 --76.0031 --75.9797 --76.0031 --75.9938 --75.9984 --76.0031 --75.9969 --75.9984 --76.0062 --75.9938 --75.9938 --75.9922 --75.9828 --76.0016 --75.9922 --75.9875 --76.0047 --75.9828 --75.9891 --75.9906 --76.0016 --75.9891 --76.0047 --76 --76.0047 --76.0047 --76 --76.0078 --76.0109 --76.0156 --76.0094 --76.0125 --75.9969 --76.0062 --76.0047 --76.0062 --75.9906 --75.9938 --75.9938 --75.9922 --75.9922 --75.9984 --76.0047 --75.9859 --75.9922 --75.9781 --75.9859 --75.9875 --75.9922 --75.9781 --75.9938 --75.9938 --75.9984 --75.9922 --75.9875 --75.9875 --75.9844 --75.9875 --75.9844 --75.9844 --75.9875 --75.9984 --76 --75.9969 --75.9984 --76.0094 --75.9859 --75.9969 --75.9922 --75.9828 --75.9922 --75.9953 --75.9875 --75.9891 --76 --75.9984 --75.9969 --75.9984 --75.9922 --75.9953 --75.9797 --75.9891 --75.9812 --75.9938 --75.9797 --75.9906 --75.9906 --75.9891 --75.9844 --75.9969 --75.9984 --75.9938 --75.9875 --75.9922 --75.9797 --75.9906 --75.9828 --75.9984 --75.9938 --76 --75.9891 --76.0125 --76.0078 --76.0016 --75.9844 --75.9984 --75.9938 --75.9906 --75.9969 --75.9938 --75.9938 --76 --76 --75.9969 --75.9969 --75.9938 --75.9891 --75.9938 --76.0016 --75.9875 --76.0031 --75.9906 --75.9906 --75.9922 --76.0062 --75.9984 --75.9938 --76.0109 --76.0109 --76.0047 --75.9953 --76 --76.0031 --76.0094 --76.0016 --75.9953 --76.0062 --76.0031 --75.9938 --75.9938 --76.0078 --75.9969 --76.0047 --76.0078 --76.0094 --76.0031 --75.9938 --75.9938 --76.0078 --75.9906 --75.9938 --76.0062 --75.9969 --75.9906 --75.9969 --75.9984 --75.9938 --76.0016 --75.9906 --76.0047 --75.9969 --76.0156 --76 --76.0094 --76.0047 --76.0078 --76.0109 --75.9938 --75.9953 --75.9984 --75.9938 --75.9938 --75.9938 --75.9891 --75.9938 --75.9797 --76 --75.9859 --75.9984 --76.0016 --76 --75.9891 --76.0078 --75.9969 --75.9922 --76.0016 --76.0078 --75.9906 --76.0016 --76.0031 --75.9922 --75.9953 --76 --75.9953 --75.9906 --76.0031 --76.0078 --76.0062 --76.0062 --76.0109 --76.0141 --76.0016 --76.0094 --76.0172 --76.0094 --76.0078 --76 --76.0062 --76.0156 --76.0047 --76.0078 --76.0125 --76.0156 --75.9969 --76.0234 --76.0016 --76.0062 --76.0047 --76.0094 --75.9906 --75.9984 --75.9922 --76.0125 --76.0125 --75.9969 --75.9969 --76.0109 --76 --76.0047 --76.0172 --75.9953 --75.9875 --75.9922 --76.0094 --75.9984 --75.9969 --75.9906 --76.0062 --76.0062 --76.0031 --76.0031 --76.0047 --76.0031 --76.0234 --76.0016 --75.9984 --76.0141 --75.9812 --76.0172 --76.0078 --75.9984 --76.0016 --75.9875 --76.0031 --75.9922 --75.9891 --75.9953 --75.9828 --75.9922 --75.9922 --75.9797 --75.9938 --75.9828 --75.9984 --75.9891 --75.9953 --75.9938 --75.9859 --75.9953 --75.9906 --76.0031 --75.9922 --75.9953 --75.9906 --75.9875 --75.9875 --75.9891 --76 --75.9906 --75.9875 --75.9922 --76.0062 --75.9984 --75.9969 --76.0109 --75.9891 --76.0016 --75.9938 --75.9984 --75.9922 --76.0062 --76.0047 --75.9969 --75.9953 --75.9938 --76 --76.0016 --76.0047 --75.9875 --75.9938 --76.0016 --75.9906 --75.9906 --76.0047 --75.9953 --76.0016 --76.0062 --75.9859 --75.9953 --75.9938 --75.9969 --75.9984 --76.0125 --75.9969 --75.9844 --75.9875 --75.9953 --76.0047 --76.0016 --76.0031 --75.9922 --75.9922 --75.9984 --76 --76 --75.9906 --75.9969 --75.9969 --75.9953 --76.0094 --76.0125 --75.9906 --75.9969 --76 --75.9906 --75.9969 --75.9953 --76.0094 --75.9969 --75.9953 --75.9922 --76.0031 --76.0078 --75.9938 --76 --75.9969 --75.9812 --75.9906 --75.9844 --75.9844 --75.9906 --75.9797 --75.9906 --75.9875 --75.9875 --75.9969 --76.0016 --75.9922 --75.9938 --75.9984 --76.0078 --76 --76.0047 --75.9922 --75.9984 --76.0031 --75.9938 --75.9875 --76 --75.9922 --76 --76.0062 --76.0078 --75.9859 --75.9875 --75.9844 --75.9797 --75.9922 --75.9781 --75.9891 --75.9812 --75.9844 --75.9844 --75.9984 --75.9938 --75.9859 --75.9781 --75.9875 --75.9766 --75.9906 --75.9875 --75.9859 --75.9797 --75.9859 --75.9766 --76.0016 --75.9812 --75.9797 --75.9938 --76 --75.9875 --75.9906 --75.9984 --75.9984 --75.9875 --75.9984 --76.0016 --75.9953 --75.9953 --75.9984 --75.9969 --76.0031 --75.9969 --76.0031 --75.9844 --76.0016 --75.9953 --76.0047 --75.9984 --76.0062 --76.0109 --76.0016 --76.0094 --76.0047 --75.9906 --76.0016 --76.0094 --76.0141 --75.9844 --75.9969 --75.9953 --75.9984 --76.0016 --76 --76.0094 --76 --76.0062 --76.0016 --75.9781 --75.9922 --75.9812 --75.9922 --75.9906 --75.9969 --75.9969 --75.9906 --76.0062 --76 --76.0078 --75.9891 --75.9969 --76 --76.0031 --76.0094 --76.0062 --75.9906 --76.0047 --75.9922 --75.9922 --75.9812 --76.0031 --75.9969 --75.9953 --75.9938 --75.9984 --76.0078 --75.9938 --75.9969 --75.9906 --75.9766 --75.9844 --76.0016 --75.9875 --75.9938 --75.9891 --75.9938 --75.9969 --75.9984 --75.9812 --75.9859 --75.9906 --75.9891 --75.9875 --75.9844 --75.975 --75.9734 --75.9812 --75.9812 --75.9734 --75.9625 --75.9703 --75.9922 --75.9703 --75.9766 --75.9922 --75.9656 --75.9766 --75.9812 --75.9797 --75.9781 --75.9938 --75.9891 --75.975 --75.9828 --75.9906 --75.9906 --75.9875 --75.975 --75.9875 --75.975 --75.9781 --75.9875 --75.9875 --75.9906 --75.9922 --75.9906 --75.9922 --75.9969 --75.9859 --75.9906 --75.9891 --75.9875 --75.9781 --75.9891 --75.9859 --75.9859 --76.0062 --75.9828 --75.9828 --75.9969 --75.9891 --76.0047 --75.9812 --75.9922 --75.9891 --75.9906 --75.9891 --75.9859 --76.0094 --75.9828 --76 --76.0062 --75.9922 --75.9938 --75.9953 --75.9891 --75.9844 --75.9938 --75.9953 --75.9703 --75.9953 --75.9875 --76 --75.975 --75.9984 --75.9938 --76.0109 --75.9859 --75.9938 --75.9969 --76.0031 --76.0031 --76.0016 --76.0016 --75.975 --75.9922 --76.0016 --75.9875 --75.9875 --75.9953 --75.9875 --75.9969 --75.9859 --75.9766 --75.9922 --75.975 --75.9734 --75.9828 --75.9859 --75.9922 --75.9766 --75.9859 --75.9797 --75.975 --75.9812 --75.9766 --75.9719 --75.9766 --75.9844 --75.9781 --75.9766 --75.9922 --75.9828 --75.9969 --75.9844 --75.9953 --75.9828 --75.9812 --75.9922 --75.9859 --75.9797 --75.9781 --75.9906 --75.9828 --75.9734 --75.9891 --75.9688 --75.9797 --75.9766 --75.9781 --75.9969 --75.9797 --75.9797 --75.9938 --75.9953 --75.9812 --76.0031 --75.9922 --75.9875 --75.9906 --75.9922 --75.9859 --75.9953 --75.9875 --75.9922 --76.0016 --75.9922 --75.9984 --75.9844 --75.9953 --75.9938 --75.9844 --75.975 --75.9891 --75.9797 --75.9844 --75.9734 --75.9734 --76.0031 --75.9969 --75.9781 --75.9719 --75.9781 --75.9719 --75.9797 --75.9828 --75.9812 --75.9828 --75.975 --75.9766 --75.9812 --75.9906 --75.9875 --75.9797 --75.9812 --75.9797 --75.9891 --75.9953 --75.975 --75.9828 --75.9781 --75.975 --75.9812 --75.9797 --75.975 --75.9938 --75.9812 --75.9875 --75.9797 --75.9828 --75.9906 --75.9812 --75.9781 --75.9844 --75.9875 --75.9844 --75.9609 --75.9953 --75.9812 --75.9656 --75.9734 --75.975 --75.9875 --75.9797 --75.9828 --75.9625 --75.9875 --75.9797 --75.9938 --75.975 --75.9891 --75.9844 --75.9797 --75.9828 --75.975 --75.9781 --75.9828 --75.9766 --75.9922 --75.975 --75.9828 --75.9859 --75.9781 --75.9875 --75.9844 --75.9797 --75.9812 --75.9734 --75.9875 --75.9797 --75.9953 --75.9719 --75.9953 --75.9953 --75.9609 --75.9734 --75.9781 --75.9719 --75.9844 --75.9734 --75.9797 --75.9797 --75.9688 --75.9828 --75.9781 --75.9641 --75.9828 --75.975 --75.9797 --75.9703 --75.9812 --75.9766 --75.9766 --75.975 --75.975 --75.9734 --75.9781 --75.9781 --75.9844 --75.9844 --75.9656 --75.9719 --75.9766 --75.9703 --75.9703 --75.9781 --75.9797 --75.9672 --75.9812 --75.9844 --75.9812 --75.9703 --75.9828 --75.9766 --75.9828 --75.9797 --75.9922 --75.9781 --75.9906 --75.9734 --75.9797 --75.9844 --75.9812 --75.9766 --75.9891 --75.9828 --75.9875 --75.9766 --75.9812 --75.9859 --75.9688 --75.9922 --75.9844 --75.9844 --75.9891 --75.9719 --75.9797 --75.9609 --75.975 --75.9938 --75.9906 --75.9812 --76 --75.975 --75.9703 --75.9828 --75.9766 --75.975 --75.9703 --75.9688 --75.9734 --75.9781 --75.9719 --75.9703 --75.9719 --75.9594 --75.9516 --75.9688 --75.9563 --75.9844 --75.9656 --75.9734 --75.9641 --75.9812 --75.9844 --75.9844 --75.9766 --75.9812 --75.9812 --75.9812 --75.9656 --75.9672 --75.9719 --75.9734 --75.9844 --75.9906 --75.9797 --75.9719 --75.9859 --75.9781 --75.9797 --75.9781 --75.9828 --75.9781 --75.975 --75.9781 --75.9688 --75.9672 --75.9625 --75.9812 --75.9703 --75.9781 --75.9797 --75.9719 --75.9922 --75.9797 --75.9844 --75.9734 --75.9641 --75.9703 --75.9688 --75.975 --75.9828 --75.9703 --75.9703 --75.9766 --75.9656 --75.9703 --75.9797 --75.9828 --75.9797 --75.9938 --75.975 --75.9688 --75.9734 --75.9719 --75.9734 --75.9719 --75.9781 --75.9797 --75.9703 --75.9672 --75.9734 --75.9812 --75.9781 --75.9781 --75.975 --75.9812 --75.9781 --75.9641 --75.9703 --75.9734 --75.9844 --75.9875 --75.9719 --75.9703 --75.975 --75.9891 --75.9719 --75.9734 --75.9812 --75.9719 --75.9625 --75.9703 --75.9625 --75.9641 --75.9578 --75.9688 --75.9797 --75.9672 --75.9609 --75.9672 --75.9734 --75.9547 --75.9828 --75.9828 --75.9766 --75.9594 --75.9844 --75.9578 --75.9781 --75.9766 --75.9906 --75.9781 --75.9656 --75.9812 --75.975 --75.9734 --75.9703 --75.9672 --75.9703 --75.9609 --75.9625 --75.9672 --75.9688 --75.9609 --75.9625 --75.9734 --75.975 --75.9563 --75.9656 --75.9719 --75.9688 --75.9594 --75.9641 --75.9812 --75.975 --75.9641 --75.9812 --75.9797 --75.9688 --75.9656 --75.9719 --75.9656 --75.9703 --75.9625 --75.9656 --75.9578 --75.9781 --75.9625 --75.9453 --75.9672 --75.9625 --75.9812 --75.9531 --75.9578 --75.9563 --75.9578 --75.9672 --75.9609 --75.9672 --75.9594 --75.9734 --75.9625 --75.9766 --75.9766 --75.9812 --75.9766 --75.9719 --75.975 --75.9781 --75.9781 --75.9781 --75.9734 --75.9688 --75.9734 --75.9797 --75.9828 --75.9797 --75.9703 --75.9594 --75.9766 --75.975 --75.9656 --75.9703 --75.9672 --75.9688 --75.9781 --75.9703 --75.9844 --75.9875 --75.9828 --75.975 --75.9812 --75.9625 --75.9781 --75.9781 --75.9859 --75.9672 --75.9672 --75.9797 --75.9703 --75.975 --75.975 --75.9656 --75.9594 --75.9578 --75.9625 --75.9781 --75.9531 --75.9625 --75.9578 --75.9688 --75.9641 --75.9672 --75.9703 --75.9672 --75.9625 --75.9656 --75.9703 --75.9703 --75.9641 --75.9609 --75.9641 --75.9609 --75.95 --75.9797 --75.9563 --75.9734 --75.9719 --75.9719 --75.9625 --75.9766 --75.9781 --75.9656 --75.9812 --75.9531 --75.9594 --75.9703 --75.9609 --75.9781 --75.9797 --75.9688 --75.975 --75.975 --75.9656 --75.9797 --75.9703 --75.9625 --75.9812 --75.9609 --75.9641 --75.9656 --75.9672 --75.9578 --75.9625 --75.9578 --75.9641 --75.9563 --75.9781 --75.9656 --75.9781 --75.975 --75.9625 --75.9656 --75.9688 --75.9703 --75.9828 --75.9563 --75.9656 --75.9656 --75.9594 --75.9797 --75.9641 --75.9828 --75.9641 --75.9656 --75.9875 --75.9688 --75.9766 --75.9688 --75.9625 --75.9563 --75.9703 --75.9766 --75.9578 --75.9672 --75.9656 --75.9563 --75.9812 --75.9516 --75.9609 --75.95 --75.9563 --75.9609 --75.9766 --75.9766 --75.9625 --75.9547 --75.9609 --75.9703 --75.9703 --75.9688 --75.9672 --75.9797 --75.9719 --75.9625 --75.9563 --75.9609 --75.9703 --75.9719 --75.9609 --75.9781 --75.9625 --75.9797 --75.9828 --75.9812 --75.9734 --75.9594 --75.9609 --75.9609 --75.9578 --75.9578 --75.9641 --75.9656 --75.9672 --75.9672 --75.9625 --75.9625 --75.9609 --75.9781 --75.9609 --75.9563 --75.9656 --75.9578 --75.9781 --75.9734 --75.9609 --75.9641 --75.9609 --75.9516 --75.9703 --75.9734 --75.9766 --75.9719 --75.9703 --75.9688 --75.9625 --75.9688 --75.9703 --75.9719 --75.9766 --75.9531 --75.9766 --75.9531 --75.975 --75.9641 --75.9672 --75.9719 --75.9688 --75.95 --75.9563 --75.9609 --75.9625 --75.9781 --75.9656 --75.9703 --75.9563 --75.9609 --75.9828 --75.9656 --75.9719 --75.9625 --75.9703 --75.9719 --75.9672 --75.9688 --75.9609 --75.9609 --75.9563 --75.9688 --75.9547 --75.9609 --75.9516 --75.9578 --75.9656 --75.9594 --75.9641 --75.9578 --75.9484 --75.9547 --75.9594 --75.9672 --75.9625 --75.9781 --75.9578 --75.9719 --75.975 --75.9578 --75.9844 --75.9656 --75.9688 --75.9766 --75.9797 --75.9719 --75.9625 --75.9703 --75.9703 --75.9688 --75.9719 --75.9641 --75.9609 --75.9797 --75.975 --75.9672 --75.9703 --75.9625 --75.9688 --75.975 --75.9688 --75.975 --75.9766 --75.9797 --75.9594 --75.9766 --75.9656 --75.9609 --75.975 --75.9734 --75.9641 --75.9734 --75.9734 --75.9844 --75.9781 --75.9734 --75.9859 --75.9688 --75.9688 --75.975 --75.9734 --75.975 --75.9594 --75.9641 --75.9578 --75.9609 --75.9703 --75.9672 --75.9672 --75.9734 --75.9641 --75.975 --75.9719 --75.9734 --75.9609 --75.9734 --75.9688 --75.9719 --75.9672 --75.9469 --75.9641 --75.9484 --75.9578 --75.9703 --75.9766 --75.9625 --75.9641 --75.9688 --75.9609 --75.9859 --75.975 --75.9547 --75.9609 --75.9812 --75.9734 --75.9781 --75.9781 --75.9734 --75.9641 --75.9812 --75.9703 --75.9766 --75.9656 --75.975 --75.975 --75.9766 --75.975 --75.9766 --75.9844 --75.9844 --75.9875 --75.9828 --75.9875 --75.9734 --75.9906 --75.9734 --75.9766 --75.9891 --75.9859 --75.9625 --75.9766 --75.9781 --75.9781 --75.9891 --75.9781 --75.9781 --75.9766 --75.9781 --75.9781 --75.9609 --75.9641 --75.9766 --75.9734 --75.9594 --75.9688 --75.9766 --75.9719 --75.9563 --75.9609 --75.9641 --75.9609 --75.9719 --75.9516 --75.9766 --75.9563 --75.9656 --75.9609 --75.9719 --75.975 --75.9641 --75.9578 --75.9734 --75.9734 --75.9703 --75.975 --75.9688 --75.9656 --75.9641 --75.9797 --75.9672 --75.9797 --75.9672 --75.9906 --75.9797 --75.9703 --75.9828 --75.9672 --75.9641 --75.9594 --75.9672 --75.9812 --75.9688 --75.975 --75.9734 --75.9672 --75.9844 --75.9812 --75.9781 --75.9703 --75.9719 --75.9703 --75.9844 --75.9766 --75.9719 --75.9766 --75.9688 --75.9844 --75.9828 --75.9859 --75.9656 --75.9812 --75.9688 --75.9688 --75.9766 --75.9828 --75.9734 --75.9812 --75.9734 --75.9688 --75.9828 --75.9703 --75.9812 --75.975 --75.9875 --75.9719 --75.9812 --75.9656 --75.9844 --75.9656 --75.9703 --75.9719 --75.9656 --75.9766 --75.9797 --75.9797 --75.9734 --75.9844 --75.9641 --75.9656 --75.9641 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9922 --75.975 --75.9797 --75.9734 --75.9812 --75.9734 --75.9797 --75.9844 --75.9719 --75.9844 --75.9797 --75.9703 --75.975 --75.9641 --75.9688 --75.9734 --75.9781 --75.9812 --75.9625 --75.9641 --75.9703 --75.9766 --75.9766 --75.9812 --75.9859 --75.9688 --75.9797 --75.9703 --75.9641 --75.9844 --75.975 --75.9719 --75.9609 --75.9734 --75.9938 --75.9688 --75.9703 --75.9812 --75.9734 --75.9641 --75.9656 --75.975 --75.975 --75.9766 --75.9734 --75.9781 --75.9812 --75.9719 --75.9609 --75.9797 --75.9844 --75.9625 --75.9719 --75.9781 --75.9734 --75.975 --75.9609 --75.9781 --75.9766 --75.9766 --75.975 --75.9703 --75.9797 --75.9812 --75.9703 --75.9766 --75.9688 --75.9734 --75.975 --75.975 --75.9734 --75.9625 --75.9766 --75.9766 --75.9719 --75.9781 --75.9625 --75.9719 --75.9672 --75.9719 --75.9781 --75.9641 --75.9688 --75.9719 --75.9672 --75.9859 --75.975 --75.9797 --75.9672 --75.9609 --75.9828 --75.9766 --75.9766 --75.9781 --75.9719 --75.9859 --75.9703 --75.9703 --75.9641 --75.9766 --75.9812 --75.9719 --75.9781 --75.9656 --75.9703 --75.9625 --75.9766 --75.9672 --75.975 --75.9688 --75.9719 --75.9766 --75.9797 --75.9797 --75.9656 --75.975 --75.9734 --75.9594 --75.9578 --75.9781 --75.9672 --75.9609 --75.9688 --75.9578 --75.9703 --75.9672 --75.9594 --75.9703 --75.9688 --75.9703 --75.9766 --75.9844 --75.9625 --75.9547 --75.975 --75.9641 --75.9828 --75.9781 --75.9656 --75.9688 --75.9797 --75.9828 --75.9688 --75.9563 --75.9641 --75.9734 --75.9719 --75.9812 --75.9766 --75.9672 --75.9688 --75.9703 --75.9625 --75.9703 --75.9609 --75.9703 --75.9703 --75.9688 --75.9719 --75.9703 --75.9656 --75.9594 --75.9594 --75.9563 --75.9656 --75.9656 --75.9719 --75.9688 --75.9641 --75.9594 --75.9578 --75.9703 --75.9766 --75.9719 --75.9703 --75.9641 --75.9641 --75.9563 --75.9609 --75.9609 --75.9672 --75.95 --75.9734 --75.9688 --75.9734 --75.9609 --75.9656 --75.9672 --75.9625 --75.9719 --75.9625 --75.9641 --75.9531 --75.9672 --75.9703 --75.9719 --75.9547 --75.9594 --75.9531 --75.9672 --75.9563 --75.9516 --75.9688 --75.95 --75.9484 --75.9563 --75.9516 --75.9656 --75.95 --75.9594 --75.9812 --75.95 --75.9594 --75.9625 --75.9656 --75.9531 --75.9688 --75.9594 --75.9672 --75.9672 --75.9563 --75.9703 --75.9516 --75.9656 --75.9703 --75.9578 --75.9688 --75.9609 --75.9734 --75.9734 --75.9563 --75.9594 --75.95 --75.9563 --75.9578 --75.9453 --75.9703 --75.9594 --75.9531 --75.9516 --75.9672 --75.9344 --75.9469 --75.9547 --75.95 --75.95 --75.9641 --75.9578 --75.95 --75.9625 --75.9672 --75.9609 --75.9734 --75.9688 --75.9641 --75.9516 --75.9563 --75.9703 --75.9688 --75.9734 --75.9734 --75.9688 --75.9719 --75.9656 --75.9531 --75.9734 --75.9719 --75.9672 --75.9703 --75.9734 --75.9672 --75.9688 --75.9672 --75.9437 --75.9625 --75.9578 --75.9641 --75.9594 --75.9672 --75.9719 --75.9594 --75.9625 --75.95 --75.9484 --75.9625 --75.9625 --75.9609 --75.9719 --75.9609 --75.9641 --75.9719 --75.9641 --75.9563 --75.9672 --75.9672 --75.9719 --75.9672 --75.9641 --75.975 --75.975 --75.9828 --75.9594 --75.9594 --75.9609 --75.9719 --75.9578 --75.9484 --75.9594 --75.9734 --75.9703 --75.9578 --75.9578 --75.9656 --75.9672 --75.9734 --75.9641 --75.975 --75.9703 --75.9688 --75.9797 --75.9781 --75.9656 --75.9734 --75.9609 --75.9703 --75.9766 --75.975 --75.9766 --75.9781 --75.9828 --75.9656 --75.9703 --75.975 --75.9797 --75.975 --75.9688 --75.9688 --75.9563 --75.9859 --75.9594 --75.9688 --75.9578 --75.9594 --75.9594 --75.9656 --75.9812 --75.9719 --75.9547 --75.9719 --75.9688 --75.9703 --75.9703 --75.9594 --75.9594 --75.9672 --75.9484 --75.9688 --75.9437 --75.9594 --75.9625 --75.9672 --75.9547 --75.9672 --75.9563 --75.9563 --75.9656 --75.9719 --75.9688 --75.9531 --75.9656 --75.9609 --75.9688 --75.9531 --75.9672 --75.9578 --75.9563 --75.975 --75.9547 --75.9609 --75.9609 --75.9563 --75.9594 --75.9406 --75.9609 --75.9547 --75.9516 --75.9656 --75.9516 --75.9797 --75.9734 --75.9625 --75.9609 --75.9797 --75.9703 --75.9547 --75.9641 --75.9688 --75.9625 --75.9719 --75.9516 --75.9625 --75.9688 --75.9625 --75.9734 --75.9547 --75.9609 --75.9625 --75.9484 --75.9516 --75.9641 --75.9656 --75.9547 --75.9578 --75.9688 --75.9734 --75.9484 --75.9578 --75.9641 --75.9484 --75.9641 --75.95 --75.9531 --75.9547 --75.9531 --75.9563 --75.9594 --75.9688 --75.9641 --75.9594 --75.9703 --75.9563 --75.9688 --75.9625 --75.9594 --75.9578 --75.9437 --75.9609 --75.9594 --75.9625 --75.9578 --75.9688 --75.9641 --75.9672 --75.975 --75.9563 --75.9609 --75.9672 --75.9453 --75.9469 --75.9703 --75.9563 --75.95 --75.9734 --75.9594 --75.9594 --75.9578 --75.9719 --75.9719 --75.9594 --75.9609 --75.9625 --75.975 --75.9688 --75.9672 --75.9688 --75.9656 --75.9672 --75.9609 --75.9734 --75.9563 --75.9797 --75.9672 --75.9812 --75.9734 --75.9844 --75.975 --75.9844 --75.9812 --75.975 --75.9859 --75.9766 --75.9625 --75.9563 --75.9672 --75.9516 --75.9609 --75.9672 --75.9766 --75.9578 --75.9672 --75.9609 --75.9625 --75.9625 --75.9609 --75.9625 --75.9688 --75.9625 --75.9594 --75.9547 --75.9484 --75.9547 --75.9672 --75.9828 --75.9625 --75.9688 --75.9688 --75.9594 --75.9656 --75.9547 --75.9547 --75.9563 --75.9547 --75.9516 --75.9656 --75.9531 --75.9641 --75.9719 --75.9625 --75.9531 --75.9766 --75.9672 --75.9641 --75.9734 --75.9656 --75.9703 --75.9656 --75.9859 --75.9766 --75.9703 --75.9719 --75.9641 --75.9672 --75.9703 --75.9625 --75.9703 --75.9594 --75.9625 --75.9656 --75.9625 --75.9672 --75.9563 --75.9547 --75.9688 --75.9578 --75.9734 --75.9563 --75.9719 --75.975 --75.975 --75.9734 --75.9766 --75.9688 --75.9609 --75.9703 --75.9641 --75.9609 --75.9734 --75.9656 --75.9688 --75.9828 --75.975 --75.9781 --75.9734 --75.9922 --75.9609 --75.9734 --75.9812 --75.9766 --75.975 --75.9688 --75.9891 --75.9734 --75.9688 --75.9719 --75.9797 --75.9781 --75.975 --75.9719 --75.9641 --75.9719 --75.9672 --75.9609 --75.9719 --75.9625 --75.9656 --75.9531 --75.9625 --75.9516 --75.9781 --75.9641 --75.9812 --75.9656 --75.9688 --75.9672 --75.9719 --75.9672 --75.9688 --75.9609 --75.9641 --75.9734 --75.975 --75.9812 --75.9625 --75.9672 --75.9656 --75.9578 --75.9625 --75.9641 --75.9625 --75.9656 --75.9609 --75.9594 --75.9719 --75.9641 --75.9641 --75.9578 --75.9484 --75.975 --75.9688 --75.9609 --75.9609 --75.9672 --75.9641 --75.9547 --75.9672 --75.9625 --75.9688 --75.9672 --75.9688 --75.9656 --75.9672 --75.9719 --75.9703 --75.9688 --75.9734 --75.9563 --75.9656 --75.9656 --75.9672 --75.9656 --75.9703 --75.9766 --75.9609 --75.9781 --75.9625 --75.9563 --75.975 --75.9781 --75.9609 --75.9578 --75.9766 --75.9688 --75.9719 --75.9469 --75.975 --75.9688 --75.9594 --75.9656 --75.9672 --75.9688 --75.9766 --75.9688 --75.9703 --75.9641 --75.9781 --75.9703 --75.9766 --75.9672 --75.9719 --75.9703 --75.9703 --75.9766 --75.9609 --75.9734 --75.9719 --75.9672 --75.9641 --75.9609 --75.9641 --75.9844 --75.9734 --75.9781 --75.9844 --75.9844 --75.9625 --75.9672 --75.9688 --75.975 --75.9641 --75.9719 --75.9609 --75.9766 --75.9641 --75.9641 --75.9688 --75.9641 --75.9688 --75.9719 --75.9797 --75.975 --75.9484 --75.9766 --75.9594 --75.9547 --75.9656 --75.9719 --75.9906 --75.9672 --75.9828 --75.9719 --75.9625 --75.9672 --75.9734 --75.9703 --75.9656 --75.9797 --75.9625 --75.9625 --75.9563 --75.9594 --75.9766 --75.9781 --75.9672 --75.9812 --75.9719 --75.9812 --75.9656 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9734 --75.9625 --75.9781 --75.9734 --75.9547 --75.9766 --75.9625 --75.9703 --75.9609 --75.9703 --75.9719 --75.9703 --75.9766 --75.9734 --75.9703 --75.9797 --75.9563 --75.9609 --75.9641 --75.9703 --75.9641 --75.9578 --75.9688 --75.9641 --75.9688 --75.9781 --75.975 --75.9641 --75.9812 --75.9703 --75.9719 --75.9719 --75.9734 --75.975 --75.9828 --75.9641 --75.9719 --75.9734 --75.9672 --75.975 --75.9719 --75.9859 --75.9812 --75.975 --75.9797 --75.9828 --75.9875 --75.9828 --75.9766 --75.9734 --75.9766 --75.9656 --75.9703 --75.9766 --75.9703 --75.9844 --75.9812 --75.9812 --75.9797 --75.9703 --75.9797 --75.9688 --75.9859 --75.9781 --75.9844 --75.975 --75.9766 --75.9688 --75.9734 --75.9906 --75.9859 --75.9797 --75.9781 --75.9828 --75.9688 --75.9922 --75.9859 --75.9797 --75.9719 --75.9828 --75.9859 --75.9875 --75.975 --75.9688 --75.9828 --75.9703 --75.9656 --75.9781 --75.9781 --75.9609 --75.9719 --75.9938 --75.9766 --75.9719 --75.9703 --75.9703 --75.9797 --75.9766 --75.9672 --75.9766 --75.975 --75.9609 --75.9812 --75.9688 --75.9672 --75.9563 --75.9812 --75.975 --75.9953 --75.9766 --75.9781 --75.9812 --75.9828 --75.9734 --75.9719 --75.9844 --75.9703 --75.9734 --75.9734 --75.9828 --75.9656 --75.9672 --75.9719 --75.9672 --75.9828 --75.9781 --75.9766 --75.9844 --75.975 --75.9766 --75.9703 --75.9781 --75.9797 --75.9812 --75.9641 --75.975 --75.9672 --75.9734 --75.9656 --75.9719 --75.9703 --75.9703 --75.9688 --75.9828 --75.9969 --75.9719 --75.9781 --75.9781 --75.9734 --75.9781 --75.9844 --75.9812 --75.9875 --75.9781 --75.9781 --75.9766 --75.9641 --75.975 --75.9734 --75.9672 --75.9703 --75.9719 --75.9812 --75.9641 --75.9734 --75.9563 --75.975 --75.9844 --75.9766 --75.9719 --75.9719 --75.9719 --75.9609 --75.9688 --75.9641 --75.9625 --75.9719 --75.9859 --75.9766 --75.9766 --75.9766 --75.9688 --75.9922 --75.9672 --75.9844 --75.9609 --75.9563 --75.9703 --75.9594 --75.9672 --75.9625 --75.975 --75.9656 --75.9734 --75.9609 --75.9672 --75.975 --75.9688 --75.9703 --75.9656 --75.9719 --75.9703 --75.975 --75.9844 --75.9797 --75.9797 --75.9781 --75.9766 --75.9828 --75.9844 --75.9703 --75.9719 --75.9766 --75.9719 --75.9781 --75.9844 --75.9766 --75.9797 --75.9578 --75.9688 --75.9734 --75.9734 --75.9781 --75.9734 --75.9703 --75.9688 --75.9547 --75.9781 --75.9781 --75.9672 --75.9734 --75.975 --75.9781 --75.9766 --75.9734 --75.975 --75.9766 --75.9766 --75.9641 --75.975 --75.9734 --75.9766 --75.9703 --75.9688 --75.9766 --75.9797 --75.9719 --75.9719 --75.975 --75.975 --75.9625 --75.9812 --75.9688 --75.975 --75.9703 --75.9672 --75.9734 --75.9766 --75.975 --75.9812 --75.9859 --75.9781 --75.9828 --75.9766 --75.9844 --75.9828 --75.9828 --75.9828 --75.9781 --75.9922 --75.9859 --75.9906 --75.9859 --75.9766 --75.9734 --75.9859 --75.9828 --75.975 --75.9812 --75.9875 --75.9875 --75.9781 --75.9703 --75.9906 --75.9891 --75.9734 --75.9891 --75.9812 --75.9875 --75.9797 --75.975 --75.975 --75.9906 --75.975 --75.9781 --75.9828 --75.9766 --75.9844 --75.9859 --75.975 --75.9922 --75.9781 --75.9844 --75.9672 --75.9609 --75.9719 --75.9875 --75.9812 --75.9906 --75.9719 --75.9812 --75.9859 --75.9734 --75.9938 --75.9781 --75.9797 --75.9828 --75.9703 --75.9906 --75.9922 --75.9781 --75.975 --75.9703 --75.9719 --75.9797 --75.9781 --75.9844 --75.975 --75.9797 --75.9797 --75.9734 --75.9625 --75.9734 --75.9828 --75.9766 --75.9859 --75.9781 --75.975 --75.9797 --75.9672 --75.975 --75.9609 --75.9766 --75.9641 --75.9844 --75.9797 --75.9766 --75.9859 --75.9891 --75.9734 --75.9734 --75.975 --75.9641 --75.9594 --75.9734 --75.9719 --75.9703 --75.9734 --75.9781 --75.9688 --75.9766 --75.9719 --75.9609 --75.9578 --75.9719 --75.9656 --75.9688 --75.9688 --75.9781 --75.9719 --75.9625 --75.9734 --75.9672 --75.9797 --75.9859 --75.9734 --75.9797 --75.9719 --75.9781 --75.9859 --75.9906 --75.9797 --75.9812 --75.9734 --75.975 --75.9781 --75.9797 --75.9859 --75.9766 --75.9844 --75.9781 --75.9734 --75.9781 --75.9797 --75.9828 --75.9812 --75.9797 --75.9781 --75.9719 --75.975 --75.9922 --75.975 --75.9625 --75.9844 --75.9719 --75.9734 --75.9828 --75.9844 --75.9656 --75.9688 --75.9578 --75.9781 --75.9938 --75.9719 --75.9797 --75.9781 --75.9719 --75.9766 --75.9672 --75.9578 --75.9609 --75.9797 --75.9719 --75.9734 --75.9734 --75.9719 --75.9641 --75.9766 --75.9688 --75.975 --75.9719 --75.9797 --75.9828 --75.9891 --75.9812 --75.9766 --75.975 --75.9906 --75.9922 --75.9953 --75.9734 --75.9828 --75.9828 --75.9797 --75.9766 --75.9828 --75.975 --75.9703 --75.9875 --75.9766 --75.9828 --75.9891 --75.9703 --75.9797 --75.9766 --75.9859 --75.9797 --75.9719 --75.95 --75.9797 --75.9844 --75.9734 --75.9734 --75.9812 --75.9984 --75.9875 --75.9953 --75.9656 --75.9797 --75.9703 --75.9641 --75.9734 --75.9781 --75.9734 --75.9734 --75.9656 --75.975 --75.9797 --75.9703 --75.9734 --75.9563 --75.9734 --75.9688 --75.9656 --75.9781 --75.9641 --75.9609 --75.9672 --75.9719 --75.9844 --75.975 --75.9781 --75.9734 --75.9688 --75.9734 --75.9641 --75.9703 --75.9781 --75.9844 --75.9656 --75.9766 --75.975 --75.975 --75.9781 --75.9828 --75.9703 --75.9719 --75.9812 --75.9953 --75.9672 --75.9625 --75.9672 --75.9828 --75.9719 --75.9828 --75.9781 --75.975 --75.9875 --75.9812 --75.9766 --75.9875 --75.9656 --75.9781 --75.9969 --75.9734 --75.9766 --75.9797 --75.975 --75.9781 --75.9703 --75.975 --75.9609 --75.9828 --75.9812 --75.9797 --75.9797 --75.9594 --75.9781 --75.975 --75.9656 --75.9594 --75.9734 --75.9563 --75.9625 --75.9766 --75.9734 --75.9641 --75.9656 --75.9766 --75.9812 --75.9672 --75.9719 --75.9781 --75.9734 --75.975 --75.975 --75.9719 --75.9703 --75.9703 --75.9859 --75.9797 --75.9688 --75.9938 --75.975 --75.9688 --75.9859 --75.975 --75.9797 --75.9719 --75.9766 --75.9703 --75.9781 --75.9703 --75.9812 --75.9578 --75.9656 --75.9578 --75.9703 --75.9594 --75.9656 --75.9609 --75.9688 --75.9719 --75.9859 --75.9781 --75.9703 --75.9766 --75.9828 --75.9734 --75.9828 --75.9828 --75.9875 --75.9812 --75.9859 --75.9781 --75.9844 --75.9797 --75.9797 --75.9766 --75.975 --75.9719 --75.9875 --75.9719 --75.9781 --75.9797 --75.9953 --75.9906 --75.9891 --75.9766 --75.9891 --75.9984 --75.9859 --75.9703 --75.9891 --75.9797 --75.9844 --75.9922 --75.9891 --75.9781 --75.9828 --75.9672 --75.9797 --75.9766 --75.9578 --75.9703 --75.9641 --75.9719 --75.9609 --75.9656 --75.9703 --75.9766 --75.9594 --75.9734 --75.9812 --75.9719 --75.9797 --75.9688 --75.9656 --75.9703 --75.9703 --75.9672 --75.9703 --75.9719 --75.9625 --75.9734 --75.9766 --75.9797 --75.9672 --75.9922 --75.9906 --75.9797 --75.9781 --75.9734 --75.9844 --75.9828 --75.9656 --75.9828 --75.9812 --75.9672 --75.9781 --75.9859 --75.9859 --75.9688 --75.9797 --75.9828 --75.9656 --75.9688 --75.9906 --75.9781 --75.9719 --75.9734 --75.9812 --75.9625 --75.9812 --75.9719 --75.9844 --75.9766 --75.9828 --75.9812 --75.9812 --75.9781 --75.9641 --75.9906 --75.9781 --75.9719 --75.975 --75.975 --75.9812 --75.9844 --75.9688 --75.9641 --75.9656 --75.9734 --75.9563 --75.9641 --75.9625 --75.9625 --75.975 --75.9625 --75.9797 --75.9672 --75.9688 --75.9812 --75.9672 --75.9734 --75.975 --75.9766 --75.9719 --75.9625 --75.9844 --75.9703 --75.9734 --75.9672 --75.9734 --75.9891 --75.9719 --75.9812 --75.975 --75.9766 --75.9766 --75.9797 --75.9797 --75.9828 --75.9781 --75.9812 --75.9656 --75.9875 --75.9719 --75.9797 --75.9781 --75.9797 --75.9828 --75.9812 --75.9781 --75.9672 --75.975 --75.9719 --75.9828 --75.9781 --75.9828 --75.9734 --75.9656 --75.9672 --75.9766 --75.9844 --75.9812 --75.9875 --75.9891 --75.9766 --75.9781 --75.9828 --75.9781 --75.9672 --75.9828 --75.9797 --75.9922 --75.9938 --75.9875 --75.975 --75.9812 --75.9672 --75.9797 --75.975 --75.9891 --75.9938 --75.9703 --75.9781 --75.9812 --75.9875 --75.9734 --75.9922 --75.9781 --75.9844 --75.9781 --75.9844 --75.9844 --75.9688 --75.9781 --76.0078 --75.9844 --75.9953 --75.9891 --76 --75.9828 --75.9953 --75.9875 --75.9766 --75.9766 --75.9906 --75.9859 --75.9797 --75.9828 --75.975 --75.9828 --75.9969 --75.9859 --75.9734 --75.9953 --75.9844 --75.9906 --75.9844 --75.9766 --75.9875 --75.9797 --75.9828 --75.9844 --75.9812 --75.9922 --75.975 --75.9844 --75.9859 --75.9766 --75.9844 --75.9922 --75.9875 --75.9688 --75.9844 --75.9906 --75.9766 --75.9797 --75.9922 --75.9828 --75.9875 --75.9938 --75.9922 --75.9828 --75.9766 --75.9812 --75.9703 --75.9703 --75.9719 --75.9875 --75.9734 --75.9734 --75.9922 --75.9766 --75.9688 --75.9734 --75.975 --75.9875 --75.9719 --75.9812 --75.9797 --75.9875 --75.9688 --75.9859 --75.9797 --75.9797 --75.9922 --75.9594 --75.9781 --75.9891 --75.975 --75.9797 --75.9719 --75.9734 --75.9859 --75.9844 --75.9656 --75.9812 --75.9781 --75.975 --75.9906 --75.9891 --75.9797 --75.9703 --75.9906 --75.9734 --75.9922 --75.975 --75.9688 --75.9781 --75.9812 --75.9797 --75.9781 --75.9906 --75.9875 --75.9797 --75.9719 --75.9719 --75.975 --75.9781 --75.9828 --75.9719 --75.9875 --75.9797 --75.9828 --75.9766 --75.9672 --75.9875 --75.9812 --75.9859 --75.9781 --75.975 --75.9594 --75.9609 --75.975 --75.9734 --75.9734 --75.9797 --75.9875 --75.9578 --75.9797 --75.9672 --75.9703 --75.9812 --75.9672 --75.9719 --75.975 --75.9844 --75.9781 --75.9719 --75.975 --75.975 --75.9797 --75.9703 --75.9719 --75.9625 --75.9781 --75.9797 --75.9594 --75.9688 --75.9656 --75.975 --75.9547 --75.9781 --75.9688 --75.9719 --75.9656 --75.9656 --75.9719 --75.9828 --75.9688 --75.9906 --75.9781 --75.9828 --75.9734 --75.9828 --75.9781 --75.9844 --75.9938 --75.9875 --75.9781 --75.9828 --75.9812 --75.9688 --75.9766 --75.9781 --75.9891 --75.9844 --75.9766 --75.9766 --75.9641 --75.9703 --75.9781 --75.9875 --75.9859 --75.9719 --75.9766 --75.9734 --75.9766 --75.9844 --75.9688 --75.9594 --75.9781 --75.9781 --75.9844 --75.9797 --76.0047 --75.9734 --75.975 --75.9734 --75.9766 --75.9812 --75.9844 --75.9859 --75.9859 --75.9812 --75.9703 --75.9844 --75.9828 --75.9828 --75.9828 --75.9719 --75.9828 --75.975 --75.9812 --75.9734 --75.9734 --75.9781 --75.975 --75.9672 --75.9797 --75.9828 --75.9844 --75.9734 --75.9797 --75.975 --75.9766 --75.9781 --75.9641 --75.9766 --75.9672 --75.9594 --75.9656 --75.9594 --75.9656 --75.9594 --75.9609 --75.9688 --75.9734 --75.9547 --75.9703 --75.9641 --75.9688 --75.9703 --75.9719 --75.9844 --75.9672 --75.9688 --75.9719 --75.9641 --75.9828 --75.9812 --75.9531 --75.9688 --75.9609 --75.9812 --75.9609 --75.9656 --75.9766 --75.9797 --75.9641 --75.975 --75.9578 --75.975 --75.9594 --75.9719 --75.9812 --75.9766 --75.9766 --75.9828 --75.9766 --75.975 --75.975 --75.9859 --75.9594 --75.9703 --75.9781 --75.9719 --75.9781 --75.975 --75.9766 --75.9844 --75.975 --75.975 --75.9781 --75.975 --75.9719 --75.9875 --75.9766 --75.9781 --75.9781 --75.9828 --75.9938 --75.9906 --75.9781 --75.9828 --75.9781 --75.9906 --75.9906 --75.9828 --76 --75.9922 --75.9938 --75.9859 --75.9891 --76.0078 --75.975 --76 --76.0031 --75.9953 --75.9906 --75.9906 --75.9875 --75.9734 --75.9828 --75.9891 --75.9875 --75.9719 --75.9844 --75.9719 --75.9781 --75.975 --75.9797 --75.9797 --75.9766 --75.9828 --75.9812 --75.9875 --75.9688 --75.9766 --75.9859 --75.9875 --75.9922 --75.9875 --75.9781 --75.9781 --75.9891 --75.9875 --75.9859 --75.9672 --75.9906 --75.9891 --75.9859 --75.9797 --75.9828 --75.9672 --75.9766 --75.9766 --75.9781 --75.9812 --75.9906 --75.9938 --75.9859 --75.9984 --75.9766 --75.9891 --75.9922 --76.0016 --75.9984 --75.9844 --76.0031 --75.9891 --75.9906 --75.9891 --75.9906 --75.9766 --75.9891 --75.9844 --75.9828 --75.9812 --75.9672 --75.9781 --75.9875 --75.9844 --75.9703 --75.9766 --75.9641 --75.9875 --75.9797 --75.9797 --75.9875 --75.9922 --75.9828 --75.9844 --75.9922 --75.9734 --75.9625 --75.975 --75.9891 --75.9812 --75.9875 --75.9797 --75.9766 --75.9938 --75.9844 --75.9812 --75.9812 --75.9625 --75.975 --75.9625 --75.9859 --75.9766 --75.9781 --75.9688 --75.9672 --75.9906 --75.975 --75.9719 --75.9641 --75.9734 --75.9703 --75.9719 --75.9812 --75.9875 --75.9844 --75.9797 --75.9875 --75.9641 --75.9875 --75.9828 --75.9719 --75.975 --75.9703 --75.9797 --75.9812 --75.9875 --75.975 --75.9844 --75.9781 --75.9766 --75.9672 --75.9797 --75.9906 --75.9688 --75.9812 --75.975 --75.9859 --75.9812 --75.9812 --75.9984 --75.9953 --75.9844 --75.9844 --75.9781 --75.975 --75.9797 --75.9844 --75.9719 --75.9734 --75.9906 --75.9969 --75.9703 --75.9703 --75.9859 --75.9859 --75.9797 --75.9703 --75.9766 --75.9844 --75.9812 --75.9812 --75.9672 --75.9891 --75.9734 --75.9828 --75.9797 --75.9781 --75.9969 --75.9734 --75.9875 --75.9828 --75.9859 --75.9984 --75.9828 --75.9766 --75.9922 --75.9828 --75.9797 --75.9812 --75.9906 --75.9984 --75.9859 --76.0031 --75.9844 --75.9734 --75.9859 --75.9844 --75.9922 --75.9875 --76 --75.9922 --75.9766 --75.9812 --76 --75.9812 --75.9797 --75.9922 --75.9828 --75.975 --75.9891 --75.9891 --75.9906 --75.9859 --75.9797 --75.9969 --75.9719 --75.9953 --76.0016 --75.9891 --75.9953 --75.9953 --76 --75.9891 --75.9875 --75.975 --75.9891 --75.9984 --75.9938 --76.0031 --75.9891 --75.9828 --75.9828 --75.9922 --75.9828 --76 --75.9828 --75.9797 --75.9938 --75.9766 --75.9891 --75.9953 --75.9922 --75.9859 --75.9875 --75.9703 --75.9875 --75.9859 --75.9703 --75.9875 --75.9875 --76 --75.9922 --75.9938 --75.9812 --75.9922 --75.9766 --75.9688 --75.9766 --75.975 --75.9922 --75.9859 --75.9984 --75.9797 --75.9938 --75.9922 --75.9953 --75.9859 --75.9922 --75.9859 --75.9891 --75.9844 --75.9859 --75.9922 --75.9859 --75.9812 --75.9859 --75.9938 --75.9719 --75.9906 --75.9859 --75.9766 --75.9938 --76.0016 --75.9812 --75.9906 --75.9828 --75.9844 --75.9766 --75.9938 --75.9938 --75.9953 --75.9891 --75.9781 --75.9797 --75.9922 --75.9891 --75.9875 --75.9844 --75.9828 --75.9875 --75.9859 --75.9781 --75.9656 --75.9766 --75.9734 --75.9844 --75.9891 --75.9781 --75.9812 --75.9766 --75.9766 --75.9609 --75.9781 --75.9906 --75.975 --75.9703 --75.9688 --75.9875 --75.9891 --75.9859 --75.9828 --75.9609 --75.9766 --75.9828 --75.9703 --75.975 --75.9719 --75.9734 --75.9703 --75.9797 --75.9656 --75.9609 --75.9719 --75.9703 --75.9719 --75.975 --75.9734 --75.9734 --75.9688 --75.9578 --75.9734 --75.9594 --75.975 --75.9672 --75.9688 --75.9766 --75.9859 --75.975 --75.9688 --75.9906 --75.9781 --75.9828 --75.9891 --75.9844 --75.9719 --75.9891 --75.9828 --75.9734 --75.9703 --75.9875 --75.9719 --75.9734 --75.9766 --75.9797 --75.9734 --75.9844 --75.9766 --75.9797 --75.9766 --75.9766 --75.9812 --75.9781 --75.9781 --75.9781 --75.9672 --75.9891 --75.9781 --75.975 --75.975 --75.9672 --75.9859 --75.9891 --75.9672 --75.9688 --75.9781 --75.9719 --75.9781 --75.9703 --75.9875 --75.9828 --75.9797 --75.9766 --75.9797 --75.9844 --75.975 --75.9922 --75.9828 --75.9828 --75.975 --75.9812 --75.9719 --75.9672 --75.9859 --75.9922 --75.975 --75.975 --75.9734 --75.9734 --75.9859 --75.9688 --75.9891 --75.9719 --75.9859 --75.9797 --75.9766 --75.9906 --75.9766 --75.9797 --75.9797 --75.9891 --75.9844 --75.9906 --75.975 --75.9812 --75.9797 --75.9734 --75.9734 --75.9734 --75.9828 --75.9812 --75.975 --75.9812 --75.9875 --75.9812 --75.9688 --75.9719 --75.9656 --75.9734 --75.9797 --75.9688 --75.9766 --75.9812 --75.9719 --75.9625 --75.975 --75.9828 --75.9672 --75.9766 --75.9672 --75.9844 --75.9734 --75.9766 --75.9719 --75.9844 --75.9828 --75.975 --75.9812 --75.9766 --75.9719 --75.9703 --75.9594 --75.9891 --75.975 --75.9812 --75.9797 --75.9719 --75.9719 --75.9719 --75.9594 --75.9719 --75.9672 --75.9766 --75.9781 --75.9656 --75.9703 --75.9719 --75.9641 --75.9703 --75.9734 --75.9859 --75.975 --75.9609 --75.9734 --75.975 --75.9734 --75.9766 --75.9828 --75.975 --75.9703 --75.9844 --75.9859 --75.9703 --75.9891 --75.9781 --75.9844 --75.9812 --75.9859 --75.9906 --75.975 --75.9828 --75.9969 --75.9797 --75.9797 --75.975 --75.9609 --75.9828 --75.9891 --75.9859 --75.9766 --75.9781 --75.9766 --75.9703 --75.9734 --75.9859 --76.0031 --75.9766 --75.9953 --75.975 --75.9797 --75.9766 --75.9859 --75.975 --75.975 --75.9891 --75.9781 --75.9734 --75.9828 --75.9797 --75.9797 --75.9719 --75.9703 --75.9766 --75.9797 --75.9844 --75.9844 --75.9875 --75.9703 --75.9844 --75.9656 --75.9828 --75.9688 --75.9812 --75.9703 --75.9766 --75.9672 --75.9812 --75.9703 --75.9656 --75.9859 --75.9703 --75.9734 --75.9656 --75.975 --75.9859 --75.9828 --75.9734 --75.9844 --75.9875 --75.9734 --75.9844 --75.9828 --75.9781 --75.9672 --75.9703 --75.9766 --75.9828 --75.9781 --75.9609 --75.9719 --75.9734 --75.9672 --75.975 --75.975 --75.9734 --75.9688 --75.9719 --75.9641 --75.9781 --75.9781 --75.9703 --75.9594 --75.9578 --75.9672 --75.9797 --75.9734 --75.9797 --75.9781 --75.9609 --75.9797 --75.9688 --75.9766 --75.9703 --75.975 --75.9672 --75.9781 --75.9656 --75.9891 --75.9719 --75.9766 --75.9766 --75.9906 --75.9734 --75.9766 --75.9797 --75.9781 --75.9641 --75.9891 --75.9797 --75.9672 --75.9797 --75.9891 --75.9734 --75.9844 --75.9781 --75.9828 --75.9828 --75.9766 --75.9766 --75.9812 --75.9828 --75.9672 --75.9766 --75.975 --75.9812 --75.9734 --75.9672 --75.975 --75.9688 --75.9844 --75.9812 --75.9734 --75.9859 --75.9781 --75.9703 --75.9844 --75.9672 --75.9672 --75.9797 --75.9703 --75.9688 --75.975 --75.9641 --75.9578 --75.975 --75.9656 --75.9812 --75.9828 --75.9563 --75.9641 --75.9656 --75.9547 --75.9641 --75.9625 --75.9672 --75.9625 --75.9563 --75.9703 --75.9563 --75.9703 --75.9656 --75.9688 --75.9641 --75.9781 --75.9641 --75.9734 --75.9672 --75.9672 --75.9734 --75.9812 --75.9688 --75.9641 --75.9906 --75.9656 --75.9891 --75.9641 --75.9656 --75.9812 --75.9719 --75.9766 --75.9734 --75.975 --75.975 --75.9766 --75.9891 --75.9812 --75.9859 --75.9875 --75.9828 --75.9812 --75.9812 --75.9875 --75.9844 --75.9781 --75.9781 --75.9719 --75.9734 --75.9859 --75.9719 --75.9797 --75.9656 --75.9781 --75.9797 --75.9703 --75.975 --75.9656 --75.9719 --75.9828 --75.9859 --75.975 --75.9719 --75.9703 --75.9719 --75.9797 --75.9672 --75.9656 --75.975 --75.975 --75.9609 --75.9844 --75.9766 --75.9766 --75.975 --75.9859 --75.9563 --75.9672 --75.9672 --75.9719 --75.9578 --75.9766 --75.9594 --75.9656 --75.9609 --75.975 --75.9688 --75.9547 --75.9578 --75.9563 --75.9641 --75.9672 --75.9641 --75.9797 --75.9641 --75.9703 --75.9563 --75.9766 --75.9531 --75.9734 --75.9625 --75.9719 --75.9531 --75.9594 --75.9656 --75.9563 --75.95 --75.9563 --75.9625 --75.9641 --75.975 --75.9578 --75.9656 --75.9766 --75.9719 --75.9656 --75.9672 --75.9656 --75.9688 --75.9594 --75.9641 --75.9656 --75.9688 --75.9766 --75.9547 --75.9656 --75.9641 --75.9656 --75.9594 --75.9734 --75.9563 --75.975 --75.9625 --75.9688 --75.9734 --75.9688 --75.9656 --75.9703 --75.9719 --75.9766 --75.9812 --75.9734 --75.975 --75.9672 --75.9672 --75.9719 --75.9719 --75.9703 --75.9781 --75.9781 --75.9641 --75.9719 --75.9641 --75.9703 --75.9688 --75.9641 --75.9516 --75.9563 --75.9734 --75.9766 --75.9594 --75.9734 --75.9609 --75.9688 --75.9625 --75.9719 --75.9656 --75.9766 --75.9688 --75.9688 --75.975 --75.9766 --75.9781 --75.9781 --75.9672 --75.9828 --75.9734 --75.9688 --75.9719 --75.9734 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9781 --75.9812 --75.9563 --75.9672 --75.9672 --75.9578 --75.9703 --75.9703 --75.9781 --75.9641 --75.9672 --75.9703 --75.9719 --75.9828 --75.9875 --75.9656 --75.9781 --75.975 --75.975 --75.9703 --75.9719 --75.9578 --75.9547 --75.9734 --75.9734 --75.9766 --75.95 --75.9578 --75.9563 --75.9516 --75.9594 --75.9563 --75.9641 --75.9563 --75.9594 --75.9484 --75.9609 --75.9484 --75.9625 --75.95 --75.9563 --75.9609 --75.9516 --75.9688 --75.9531 --75.9453 --75.9609 --75.9609 --75.9469 --75.9594 --75.9422 --75.95 --75.9547 --75.9594 --75.9594 --75.9547 --75.9484 --75.9531 --75.9688 --75.9547 --75.9609 --75.9672 --75.9578 --75.9547 --75.95 --75.9672 --75.9641 --75.9578 --75.9406 --75.9734 --75.9531 --75.9516 --75.9594 --75.9484 --75.9547 --75.9547 --75.9469 --75.9391 --75.9594 --75.9625 --75.9453 --75.9563 --75.9516 --75.9594 --75.9547 --75.9703 --75.9563 --75.9578 --75.9375 --75.9547 --75.9641 --75.9547 --75.95 --75.9563 --75.9563 --75.9609 --75.9656 --75.9734 --75.9437 --75.9688 --75.9563 --75.9563 --75.9625 --75.9469 --75.9625 --75.9437 --75.9516 --75.95 --75.9516 --75.975 --75.9297 --75.9703 --75.9516 --75.9547 --75.9578 --75.9406 --75.9609 --75.9547 --75.9516 --75.9484 --75.9453 --75.9609 --75.9531 --75.9641 --75.9422 --75.9531 --75.9531 --75.9563 --75.9594 --75.9406 --75.9641 --75.9437 --75.9594 --75.9453 --75.9516 --75.9531 --75.9563 --75.95 --75.9437 --75.9469 --75.9484 --75.9641 --75.9641 --75.9516 --75.9484 --75.9563 --75.9531 --75.9594 --75.9437 --75.95 --75.9609 --75.9437 --75.9422 --75.9453 --75.9563 --75.9531 --75.9453 --75.9469 --75.9484 --75.9531 --75.9437 --75.9469 --75.9484 --75.9359 --75.9453 --75.9578 --75.9469 --75.9578 --75.9547 --75.9469 --75.9359 --75.9328 --75.95 --75.9344 --75.9422 --75.9609 --75.9437 --75.9453 --75.9484 --75.9469 --75.9375 --75.9406 --75.9516 --75.9422 --75.9453 --75.9406 --75.9594 --75.9453 --75.9375 --75.9391 --75.9406 --75.9484 --75.9297 --75.9484 --75.9484 --75.9437 --75.9641 --75.9531 --75.9344 --75.9375 --75.9375 --75.95 --75.9516 --75.9594 --75.9516 --75.9391 --75.9453 --75.9484 --75.9469 --75.9328 --75.9437 --75.9484 --75.9469 --75.9422 --75.9437 --75.9375 --75.9297 --75.9453 --75.9484 --75.9484 --75.9234 --75.9313 --75.9391 --75.9344 --75.9453 --75.9547 --75.9453 --75.9484 --75.9328 --75.95 --75.95 --75.9359 --75.9297 --75.9406 --75.9484 --75.9422 --75.9344 --75.9406 --75.9437 --75.9406 --75.9406 --75.95 --75.9484 --75.9453 --75.9422 --75.9328 --75.9437 --75.9406 --75.9391 --75.9297 --75.9359 --75.9391 --75.9313 --75.9344 --75.9359 --75.9281 --75.9344 --75.9453 --75.9313 --75.9344 --75.9359 --75.9406 --75.9266 --75.9203 --75.9266 --75.9203 --75.9437 --75.9375 --75.9375 --75.9266 --75.9266 --75.9281 --75.9422 --75.9234 --75.9391 --75.9359 --75.9437 --75.9266 --75.9266 --75.9422 --75.9375 --75.9437 --75.9375 --75.9406 --75.9359 --75.9422 --75.9516 --75.9344 --75.95 --75.9328 --75.9453 --75.95 --75.9313 --75.9234 --75.9313 --75.9406 --75.9281 --75.9469 --75.9328 --75.9406 --75.9375 --75.9422 --75.9359 --75.9391 --75.9297 --75.9328 --75.9203 --75.9406 --75.9359 --75.9469 --75.9313 --75.9547 --75.9406 --75.9313 --75.9266 --75.9359 --75.9406 --75.9297 --75.9328 --75.9313 --75.9344 --75.9281 --75.9406 --75.9391 --75.9516 --75.9297 --75.9359 --75.9391 --75.9359 --75.9406 --75.9391 --75.9328 --75.9234 --75.9422 --75.9422 --75.9484 --75.9328 --75.9391 --75.9391 --75.9437 --75.9406 --75.9313 --75.9453 --75.9359 --75.9359 --75.9375 --75.9375 --75.9453 --75.9422 --75.9234 --75.9531 --75.9422 --75.925 --75.925 --75.9391 --75.9266 --75.9422 --75.9437 --75.9437 --75.9406 --75.9437 --75.9484 --75.9391 --75.9453 --75.9453 --75.9437 --75.9453 --75.9437 --75.9422 --75.9391 --75.9422 --75.9313 --75.9328 --75.9375 --75.9359 --75.9266 --75.9375 --75.9266 --75.9391 --75.9391 --75.9359 --75.9531 --75.9391 --75.9344 --75.9406 --75.9313 --75.9375 --75.9437 --75.9484 --75.9547 --75.9469 --75.9516 --75.9406 --75.9531 --75.9391 --75.9391 --75.9422 --75.9422 --75.9313 --75.9359 --75.9375 --75.9484 --75.9437 --75.9266 --75.9453 --75.9359 --75.9422 --75.9359 --75.9563 --75.9359 --75.9516 --75.9453 --75.9344 --75.9406 --75.9453 --75.9344 --75.9297 --75.9344 --75.9484 --75.9297 --75.9359 --75.9344 --75.9484 --75.9359 --75.9359 --75.9219 --75.925 --75.9313 --75.9297 --75.9266 --75.9125 --75.9391 --75.9313 --75.9391 --75.9203 --75.9281 --75.9297 --75.9266 --75.9172 --75.9141 --75.9359 --75.9344 --75.9453 --75.9406 --75.9266 --75.9391 --75.925 --75.9266 --75.925 --75.9203 --75.925 --75.9281 --75.9313 --75.9313 --75.9391 --75.9281 --75.9344 --75.9484 --75.925 --75.9313 --75.9141 --75.9375 --75.9359 --75.9281 --75.9297 --75.9406 --75.9375 --75.9328 --75.9172 --75.9484 --75.9297 --75.9297 --75.9391 --75.9375 --75.9234 --75.9313 --75.9313 --75.9297 --75.9313 --75.9172 --75.9313 --75.9234 --75.9344 --75.9437 --75.9375 --75.9406 --75.925 --75.9313 --75.9375 --75.9344 --75.9359 --75.9422 --75.9328 --75.95 --75.9391 --75.9437 --75.9344 --75.9281 --75.9437 --75.9359 --75.9437 --75.9359 --75.9391 --75.9328 --75.9375 --75.9281 --75.9406 --75.9391 --75.925 --75.9297 --75.9344 --75.9328 --75.9281 --75.9344 --75.925 --75.9281 --75.9344 --75.9375 --75.9437 --75.9344 --75.9234 --75.95 --75.9437 --75.9375 --75.925 --75.9328 --75.9453 --75.9328 --75.9563 --75.9391 --75.9437 --75.9437 --75.9344 --75.9453 --75.9391 --75.9547 --75.9359 --75.9328 --75.95 --75.9484 --75.9266 --75.925 --75.9359 --75.9375 --75.9219 --75.9406 --75.9344 --75.9313 --75.9313 --75.9375 --75.9484 --75.9313 --75.9297 --75.9297 --75.9234 --75.9281 --75.9344 --75.9297 --75.9344 --75.9422 --75.9422 --75.9359 --75.9406 --75.9297 --75.9219 --75.925 --75.9391 --75.9391 --75.9391 --75.9203 --75.9203 --75.9266 --75.9187 --75.9391 --75.9219 --75.9266 --75.9437 --75.9281 --75.9281 --75.9406 --75.9328 --75.9266 --75.9297 --75.9297 --75.9266 --75.9297 --75.9406 --75.9266 --75.9359 --75.9391 --75.9266 --75.9437 --75.9328 --75.9266 --75.9281 --75.9328 --75.9375 --75.9313 --75.9406 --75.9266 --75.9391 --75.9281 --75.9281 --75.925 --75.9406 --75.9281 --75.9359 --75.9297 --75.9391 --75.9328 --75.9375 --75.9328 --75.9359 --75.9328 --75.9375 --75.9391 --75.9375 --75.9266 --75.9375 --75.9453 --75.9281 --75.9281 --75.9297 --75.9344 --75.9359 --75.9234 --75.9234 --75.9313 --75.9266 --75.9219 --75.9297 --75.9281 --75.9328 --75.9219 --75.9281 --75.9328 --75.9172 --75.9359 --75.9328 --75.9375 --75.9297 --75.9391 --75.9281 --75.9375 --75.9203 --75.9297 --75.9234 --75.9297 --75.95 --75.9344 --75.9328 --75.9375 --75.9297 --75.9391 --75.9344 --75.925 --75.9281 --75.9344 --75.9297 --75.9422 --75.95 --75.9578 --75.9469 --75.9391 --75.9422 --75.9453 --75.9281 --75.9203 --75.9219 --75.9422 --75.9391 --75.9469 --75.9328 --75.9391 --75.9297 --75.9344 --75.9375 --75.9281 --75.9297 --75.9359 --75.9203 --75.9344 --75.9406 --75.925 --75.9266 --75.9281 --75.9344 --75.9266 --75.9453 --75.9344 --75.9422 --75.9391 --75.9422 --75.925 --75.9281 --75.9281 --75.9297 --75.9391 --75.9469 --75.9203 --75.9313 --75.9344 --75.9219 --75.9281 --75.9406 --75.9297 --75.9344 --75.9313 --75.9344 --75.9187 --75.9234 --75.9391 --75.9328 --75.9328 --75.9266 --75.9406 --75.9422 --75.9156 --75.9313 --75.9297 --75.9281 --75.9172 --75.9187 --75.925 --75.9125 --75.9187 --75.9469 --75.9187 --75.9313 --75.9266 --75.9203 --75.9203 --75.9266 --75.9141 --75.9203 --75.9109 --75.925 --75.9313 --75.9344 --75.9266 --75.9328 --75.9281 --75.9234 --75.9297 --75.9187 --75.9266 --75.9187 --75.9422 --75.925 --75.9281 --75.9281 --75.9266 --75.9359 --75.9187 --75.9234 --75.925 --75.925 --75.9375 --75.9156 --75.9344 --75.9313 --75.9313 --75.9297 --75.9203 --75.9234 --75.9219 --75.9156 --75.9203 --75.925 --75.9094 --75.9094 --75.9203 --75.9187 --75.9109 --75.9062 --75.9094 --75.9141 --75.9156 --75.9203 --75.9234 --75.925 --75.9094 --75.9203 --75.9203 --75.9219 --75.9141 --75.9281 --75.925 --75.9172 --75.9172 --75.9094 --75.9203 --75.9172 --75.9219 --75.9266 --75.9344 --75.9266 --75.9187 --75.9234 --75.9203 --75.9125 --75.9141 --75.9281 --75.9328 --75.9375 --75.9297 --75.9187 --75.9172 --75.9219 --75.9359 --75.9094 --75.925 --75.9266 --75.9172 --75.9172 --75.9297 --75.9328 --75.9234 --75.925 --75.9234 --75.9328 --75.9109 --75.9281 --75.925 --75.9375 --75.9172 --75.9156 --75.9094 --75.9156 --75.9125 --75.9328 --75.925 --75.9203 --75.9234 --75.9234 --75.9281 --75.9203 --75.9172 --75.9203 --75.9187 --75.9313 --75.9266 --75.9359 --75.9328 --75.9141 --75.9219 --75.9187 --75.925 --75.9187 --75.9266 --75.9281 --75.9266 --75.9297 --75.9219 --75.9266 --75.9141 --75.9125 --75.9172 --75.9172 --75.925 --75.9125 --75.9219 --75.9172 --75.9234 --75.9234 --75.9391 --75.9094 --75.9187 --75.925 --75.9187 --75.9156 --75.9219 --75.9141 --75.9187 --75.9156 --75.9266 --75.9281 --75.9437 --75.9234 --75.9234 --75.9437 --75.9328 --75.9281 --75.9281 --75.9297 --75.9297 --75.9266 --75.9359 --75.9141 --75.9281 --75.9187 --75.9344 --75.9391 --75.9328 --75.9266 --75.9234 --75.9313 --75.9328 --75.9313 --75.925 --75.9422 --75.9172 --75.9422 --75.9328 --75.9313 --75.9359 --75.9297 --75.9234 --75.9375 --75.9203 --75.9281 --75.9281 --75.9266 --75.9391 --75.9344 --75.9328 --75.9328 --75.9219 --75.9172 --75.9266 --75.9187 --75.9203 --75.925 --75.9172 --75.9359 --75.9234 --75.9187 --75.9203 --75.9281 --75.925 --75.925 --75.9281 --75.9328 --75.9203 --75.9266 --75.9281 --75.9172 --75.9219 --75.9187 --75.9219 --75.9422 --75.9141 --75.9266 --75.925 --75.9375 --75.9344 --75.9297 --75.9375 --75.9297 --75.9156 --75.925 --75.9281 --75.925 --75.9313 --75.9156 --75.9359 --75.9187 --75.9297 --75.9328 --75.9234 --75.9266 --75.9344 --75.9391 --75.9203 --75.9203 --75.9359 --75.9203 --75.9266 --75.9234 --75.9313 --75.9187 --75.9219 --75.9234 --75.9125 --75.9156 --75.9297 --75.9344 --75.9125 --75.9266 --75.9266 --75.9422 --75.9297 --75.9328 --75.9156 --75.9141 --75.9172 --75.9219 --75.9141 --75.9313 --75.9344 --75.9187 --75.925 --75.9219 --75.9266 --75.9328 --75.9203 --75.9297 --75.9219 --75.9141 --75.9156 --75.9234 --75.9266 --75.9156 --75.9219 --75.9219 --75.9266 --75.9234 --75.9125 --75.9219 --75.9094 --75.9313 --75.9328 --75.9234 --75.9219 --75.9109 --75.9281 --75.9328 --75.9281 --75.9266 --75.9344 --75.9219 --75.9172 --75.9172 --75.9187 --75.9234 --75.9156 --75.9203 --75.9172 --75.9141 --75.9203 --75.9281 --75.9234 --75.9281 --75.9156 --75.9094 --75.9141 --75.9125 --75.9047 --75.9078 --75.9281 --75.9187 --75.9297 --75.9062 --75.9125 --75.9219 --75.9141 --75.9234 --75.9187 --75.9172 --75.9281 --75.9328 --75.9094 --75.9156 --75.9297 --75.9219 --75.9203 --75.9219 --75.9234 --75.9156 --75.9187 --75.9219 --75.9094 --75.9313 --75.9203 --75.9187 --75.925 --75.9172 --75.9281 --75.9219 --75.9156 --75.9297 --75.9281 --75.9187 --75.9156 --75.9125 --75.925 --75.9281 --75.925 --75.9203 --75.9203 --75.9078 --75.925 --75.9156 --75.9219 --75.9156 --75.9031 --75.9313 --75.9406 --75.925 --75.9187 --75.9156 --75.9203 --75.9203 --75.9328 --75.9281 --75.9266 --75.925 --75.9219 --75.9328 --75.9281 --75.9234 --75.9344 --75.9297 --75.9172 --75.9297 --75.9266 --75.9328 --75.925 --75.9234 --75.9234 --75.925 --75.9281 --75.9375 --75.9187 --75.9219 --75.9328 --75.9234 --75.9187 --75.9234 --75.9375 --75.925 --75.9234 --75.9219 --75.9281 --75.9234 --75.9219 --75.9047 --75.9187 --75.9078 --75.9109 --75.9125 --75.9109 --75.9062 --75.925 --75.9125 --75.9203 --75.9047 --75.9172 --75.9156 --75.9078 --75.9031 --75.9141 --75.9078 --75.9156 --75.9187 --75.9281 --75.9187 --75.9109 --75.9187 --75.9141 --75.9266 --75.9094 --75.9219 --75.9203 --75.9156 --75.9125 --75.9156 --75.9187 --75.9125 --75.9062 --75.9094 --75.9141 --75.9125 --75.9078 --75.9156 --75.9125 --75.9 --75.9062 --75.9187 --75.9094 --75.9203 --75.9187 --75.9094 --75.9109 --75.9094 --75.9187 --75.9234 --75.925 --75.9297 --75.9094 --75.9125 --75.9266 --75.9281 --75.9062 --75.9359 --75.9078 --75.9203 --75.9172 --75.925 --75.9125 --75.9297 --75.9203 --75.9172 --75.9266 --75.9219 --75.9234 --75.925 --75.9266 --75.9219 --75.9359 --75.9266 --75.9172 --75.925 --75.9172 --75.9156 --75.9141 --75.9203 --75.9313 --75.9094 --75.9344 --75.9328 --75.9187 --75.9281 --75.9297 --75.9328 --75.9187 --75.925 --75.9109 --75.9219 --75.9219 --75.9266 --75.9109 --75.9391 --75.9234 --75.9172 --75.9344 --75.9141 --75.9187 --75.9172 --75.9234 --75.9297 --75.9141 --75.9187 --75.9078 --75.9203 --75.9141 --75.9109 --75.9187 --75.9297 --75.9203 --75.9187 --75.9344 --75.9297 --75.9313 --75.9219 --75.9219 --75.925 --75.9125 --75.9281 --75.9359 --75.9203 --75.9234 --75.925 --75.9187 --75.9172 --75.9234 --75.9094 --75.8984 --75.9109 --75.9094 --75.9109 --75.9219 --75.9125 --75.9109 --75.9109 --75.9219 --75.925 --75.9234 --75.9094 --75.9172 --75.9219 --75.925 --75.9062 --75.9078 --75.9047 --75.9141 --75.9062 --75.9156 --75.8984 --75.9062 --75.9109 --75.9062 --75.9344 --75.9062 --75.9172 --75.9047 --75.9219 --75.9094 --75.9141 --75.9141 --75.9172 --75.9234 --75.9125 --75.9219 --75.9031 --75.9109 --75.8984 --75.9156 --75.9078 --75.8984 --75.9203 --75.9141 --75.8969 --75.9 --75.9078 --75.8875 --75.9094 --75.9078 --75.9109 --75.9125 --75.9016 --75.9109 --75.8969 --75.9078 --75.9031 --75.8875 --75.9047 --75.9 --75.8953 --75.9 --75.9062 --75.9094 --75.9125 --75.9016 --75.9125 --75.9141 --75.8969 --75.9016 --75.9016 --75.9047 --75.9047 --75.9047 --75.9047 --75.9016 --75.8906 --75.9016 --75.8984 --75.9141 --75.9047 --75.9047 --75.9 --75.9 --75.9094 --75.8922 --75.8984 --75.9047 --75.8906 --75.8984 --75.8953 --75.8938 --75.8984 --75.8906 --75.9016 --75.9062 --75.9016 --75.8984 --75.9047 --75.8938 --75.8875 --75.8906 --75.8891 --75.8875 --75.8969 --75.9016 --75.8891 --75.8953 --75.8953 --75.8953 --75.9078 --75.8938 --75.9031 --75.9062 --75.8891 --75.9062 --75.8906 --75.9172 --75.8922 --75.9078 --75.9078 --75.8938 --75.8969 --75.8922 --75.9094 --75.8969 --75.9031 --75.8969 --75.8984 --75.9016 --75.9062 --75.9031 --75.9031 --75.9078 --75.9 --75.8938 --75.9016 --75.8953 --75.9062 --75.9031 --75.9109 --75.8969 --75.9047 --75.8906 --75.8938 --75.9062 --75.8969 --75.9062 --75.9078 --75.9047 --75.9156 --75.9078 --75.9 --75.9125 --75.9219 --75.9234 --75.9141 --75.9219 --75.9141 --75.8953 --75.9031 --75.9016 --75.8938 --75.9031 --75.8969 --75.9125 --75.9 --75.8906 --75.8906 --75.9 --75.9 --75.9047 --75.9078 --75.9016 --75.8984 --75.9156 --75.9 --75.8828 --75.8969 --75.8969 --75.8969 --75.9 --75.9109 --75.9047 --75.8969 --75.8984 --75.9141 --75.9078 --75.9266 --75.9156 --75.9062 --75.9 --75.8984 --75.9172 --75.9078 --75.9062 --75.9062 --75.9 --75.9062 --75.9094 --75.8953 --75.9016 --75.8922 --75.9078 --75.9203 --75.9172 --75.9078 --75.8922 --75.8938 --75.9172 --75.9109 --75.9016 --75.9078 --75.9078 --75.9016 --75.9187 --75.9 --75.9187 --75.8969 --75.9172 --75.9125 --75.9094 --75.9109 --75.9016 --75.9031 --75.9125 --75.9141 --75.9125 --75.9078 --75.9031 --75.9125 --75.9156 --75.9094 --75.9172 --75.9031 --75.9078 --75.9266 --75.9062 --75.9234 --75.9125 --75.8984 --75.8953 --75.9156 --75.9234 --75.9156 --75.9219 --75.9281 --75.9234 --75.9141 --75.9141 --75.9187 --75.9156 --75.9172 --75.9094 --75.9047 --75.9062 --75.9109 --75.9219 --75.925 --75.9078 --75.9266 --75.9172 --75.9125 --75.9094 --75.9125 --75.9109 --75.9078 --75.9172 --75.8984 --75.9078 --75.8969 --75.9125 --75.9078 --75.8953 --75.9125 --75.9078 --75.9141 --75.9047 --75.9016 --75.9078 --75.8969 --75.9109 --75.9109 --75.9125 --75.9047 --75.9141 --75.9187 --75.9109 --75.925 --75.9125 --75.9094 --75.9047 --75.9203 --75.9156 --75.9078 --75.9078 --75.9062 --75.9016 --75.9031 --75.9016 --75.9125 --75.9141 --75.9031 --75.9031 --75.9047 --75.9078 --75.8938 --75.9125 --75.9047 --75.8875 --75.9 --75.9156 --75.9141 --75.9234 --75.925 --75.9156 --75.9313 --75.9219 --75.9141 --75.9281 --75.9141 --75.9141 --75.9125 --75.925 --75.9391 --75.9219 --75.9125 --75.9203 --75.9297 --75.9172 --75.925 --75.9125 --75.9359 --75.9266 --75.9234 --75.9219 --75.9375 --75.9266 --75.9313 --75.9187 --75.9203 --75.9047 --75.9125 --75.9141 --75.9062 --75.9187 --75.9313 --75.9203 --75.9094 --75.9219 --75.9156 --75.925 --75.925 --75.8984 --75.9062 --75.9297 --75.9187 --75.925 --75.9094 --75.9172 --75.9234 --75.9094 --75.9109 --75.9297 --75.9125 --75.9219 --75.9234 --75.9219 --75.9203 --75.9328 --75.9078 --75.9172 --75.9266 --75.9078 --75.9156 --75.9172 --75.9156 --75.9219 --75.9031 --75.9109 --75.9062 --75.9219 --75.9109 --75.9047 --75.9016 --75.9125 --75.9031 --75.9062 --75.9078 --75.8969 --75.9125 --75.9125 --75.9031 --75.9156 --75.9156 --75.9281 --75.9141 --75.9141 --75.925 --75.925 --75.9156 --75.9156 --75.9141 --75.9187 --75.9219 --75.9203 --75.9219 --75.9234 --75.9234 --75.9219 --75.9141 --75.9219 --75.9141 --75.9266 --75.9062 --75.9187 --75.9047 --75.9094 --75.9109 --75.9234 --75.9031 --75.8844 --75.8984 --75.9047 --75.8906 --75.9 --75.8938 --75.9109 --75.8969 --75.8953 --75.9125 --75.8906 --75.8938 --75.9125 --75.925 --75.8906 --75.9125 --75.9078 --75.9016 --75.9094 --75.9125 --75.9187 --75.9125 --75.9172 --75.9172 --75.9062 --75.9203 --75.9109 --75.9141 --75.9187 --75.9187 --75.9156 --75.9203 --75.9156 --75.9031 --75.9172 --75.9219 --75.9219 --75.9094 --75.9172 --75.9187 --75.9047 --75.9109 --75.9219 --75.9078 --75.9141 --75.9094 --75.9016 --75.9203 --75.925 --75.9125 --75.9156 --75.8953 --75.9 --75.9125 --75.9141 --75.9125 --75.9172 --75.9109 --75.9172 --75.9187 --75.9266 --75.9078 --75.9094 --75.9172 --75.8922 --75.9078 --75.9156 --75.9109 --75.9109 --75.9 --75.9 --75.9 --75.9047 --75.9 --75.9016 --75.9016 --75.8906 --75.9078 --75.9094 --75.8922 --75.9094 --75.9125 --75.9141 --75.9 --75.9094 --75.9094 --75.9031 --75.9062 --75.9047 --75.9 --75.9062 --75.9062 --75.9156 --75.9078 --75.8938 --75.9141 --75.9 --75.9031 --75.8984 --75.8906 --75.9109 --75.9062 --75.9062 --75.9109 --75.9031 --75.8875 --75.9094 --75.8984 --75.9078 --75.8844 --75.9047 --75.9094 --75.9109 --75.9 --75.8953 --75.9047 --75.8906 --75.8891 --75.8938 --75.9062 --75.8922 --75.8938 --75.9 --75.8938 --75.9047 --75.8844 --75.8969 --75.9062 --75.9219 --75.9109 --75.9109 --75.9016 --75.9062 --75.9016 --75.9047 --75.9047 --75.8922 --75.9062 --75.8953 --75.8953 --75.8938 --75.9031 --75.9016 --75.8969 --75.8969 --75.8984 --75.9094 --75.9125 --75.8969 --75.8969 --75.8984 --75.8969 --75.9078 --75.9094 --75.9016 --75.9062 --75.9047 --75.9016 --75.9094 --75.9016 --75.8969 --75.8938 --75.9078 --75.9109 --75.8953 --75.8906 --75.9187 --75.9047 --75.8984 --75.9078 --75.9109 --75.9094 --75.9031 --75.9125 --75.9031 --75.9172 --75.9016 --75.9187 --75.9062 --75.9141 --75.9047 --75.8984 --75.9187 --75.9078 --75.9141 --75.9047 --75.9062 --75.9016 --75.9078 --75.9109 --75.9125 --75.9062 --75.9094 --75.9062 --75.9031 --75.9078 --75.9172 --75.9031 --75.9109 --75.9016 --75.9 --75.9016 --75.8953 --75.9109 --75.8984 --75.8969 --75.8938 --75.8844 --75.8922 --75.8969 --75.8891 --75.8984 --75.9047 --75.9 --75.9 --75.8938 --75.9125 --75.8891 --75.8984 --75.8875 --75.8969 --75.9062 --75.9016 --75.9172 --75.9016 --75.8984 --75.8828 --75.9 --75.8891 --75.8828 --75.8922 --75.8891 --75.9062 --75.9016 --75.8969 --75.9 --75.9031 --75.9047 --75.9141 --75.9125 --75.9125 --75.9078 --75.8906 --75.8984 --75.9047 --75.8938 --75.9156 --75.8969 --75.9062 --75.8984 --75.9062 --75.9062 --75.8875 --75.9141 --75.9047 --75.9094 --75.9078 --75.9125 --75.9156 --75.9047 --75.9062 --75.9062 --75.9141 --75.9156 --75.9094 --75.9094 --75.9109 --75.9156 --75.9172 --75.9062 --75.9203 --75.9109 --75.9094 --75.9094 --75.9187 --75.9125 --75.9125 --75.9016 --75.9109 --75.9219 --75.9125 --75.9094 --75.9141 --75.8906 --75.9 --75.8984 --75.9141 --75.9 --75.9156 --75.9031 --75.9031 --75.9125 --75.9203 --75.9187 --75.9094 --75.9172 --75.9125 --75.9219 --75.9062 --75.9078 --75.9156 --75.9016 --75.9 --75.9016 --75.9062 --75.9062 --75.9031 --75.8984 --75.9203 --75.9109 --75.8938 --75.9047 --75.9094 --75.9031 --75.8984 --75.9047 --75.9109 --75.9062 --75.9047 --75.8969 --75.9 --75.9078 --75.9109 --75.9016 --75.9031 --75.9047 --75.9 --75.9219 --75.9062 --75.8938 --75.9047 --75.9062 --75.9094 --75.9109 --75.9125 --75.9016 --75.9219 --75.9078 --75.9016 --75.9031 --75.9062 --75.9094 --75.8984 --75.9109 --75.9109 --75.8984 --75.9 --75.9172 --75.9047 --75.9016 --75.9187 --75.9078 --75.9187 --75.9047 --75.9156 --75.9078 --75.9156 --75.9078 --75.9094 --75.9203 --75.9078 --75.9141 --75.9141 --75.9078 --75.9125 --75.9062 --75.9078 --75.9203 --75.9078 --75.9094 --75.9062 --75.9078 --75.9047 --75.9234 --75.9156 --75.9172 --75.9094 --75.9109 --75.9234 --75.9109 --75.9141 --75.9047 --75.9109 --75.9094 --75.9141 --75.9094 --75.9062 --75.9047 --75.9 --75.9094 --75.9156 --75.9187 --75.9016 --75.9094 --75.9031 --75.9125 --75.9047 --75.9047 --75.9016 --75.9062 --75.9156 --75.9016 --75.9172 --75.9125 --75.9062 --75.9031 --75.9203 --75.9047 --75.9172 --75.9109 --75.9156 --75.9 --75.8938 --75.9031 --75.9031 --75.9 --75.9031 --75.9047 --75.9047 --75.9047 --75.9234 --75.9047 --75.9016 --75.9094 --75.9031 --75.9016 --75.9141 --75.9109 --75.9016 --75.9078 --75.9062 --75.9219 --75.8922 --75.9203 --75.9031 --75.9078 --75.9094 --75.9078 --75.9062 --75.9187 --75.9109 --75.9109 --75.9062 --75.9266 --75.9141 --75.9187 --75.9172 --75.9156 --75.9234 --75.9219 --75.9203 --75.9203 --75.9156 --75.9141 --75.9172 --75.9203 --75.9187 --75.9141 --75.9234 --75.9141 --75.9109 --75.9109 --75.9125 --75.9031 --75.9094 --75.9094 --75.9062 --75.9109 --75.9062 --75.9078 --75.9141 --75.9156 --75.9156 --75.9047 --75.9187 --75.9078 --75.9078 --75.9172 --75.9141 --75.9172 --75.9172 --75.9141 --75.9 --75.9109 --75.9078 --75.9234 --75.8984 --75.9172 --75.9219 --75.9156 --75.9094 --75.9094 --75.9047 --75.9187 --75.9141 --75.9062 --75.9156 --75.9156 --75.9203 --75.9094 --75.9109 --75.9109 --75.9078 --75.9125 --75.9203 --75.9172 --75.8969 --75.9125 --75.9094 --75.9062 --75.9141 --75.9016 --75.9109 --75.8922 --75.9047 --75.9047 --75.9031 --75.9125 --75.9078 --75.9109 --75.9078 --75.9109 --75.9047 --75.9219 --75.9141 --75.9 --75.9187 --75.9 --75.9141 --75.9062 --75.9062 --75.8969 --75.9047 --75.9078 --75.9047 --75.9156 --75.9203 --75.9078 --75.9062 --75.9219 --75.9078 --75.8969 --75.9062 --75.9031 --75.9109 --75.9141 --75.9172 --75.9125 --75.9109 --75.9109 --75.9062 --75.9141 --75.9047 --75.9203 --75.9203 --75.9109 --75.9203 --75.9172 --75.9078 --75.9078 --75.8984 --75.9187 --75.9094 --75.9094 --75.9109 --75.9141 --75.8969 --75.925 --75.9141 --75.9109 --75.9062 --75.9047 --75.9156 --75.9031 --75.9062 --75.9094 --75.9125 --75.9047 --75.9062 --75.9156 --75.8922 --75.9109 --75.9016 --75.9109 --75.9078 --75.9078 --75.8953 --75.8938 --75.9031 --75.8859 --75.9094 --75.9062 --75.8953 --75.8969 --75.8953 --75.9 --75.9031 --75.9047 --75.9172 --75.9203 --75.9156 --75.9125 --75.9219 --75.925 --75.9047 --75.9187 --75.9203 --75.9078 --75.9109 --75.9062 --75.9109 --75.9156 --75.9078 --75.9078 --75.8969 --75.8969 --75.9078 --75.9094 --75.9016 --75.9125 --75.8953 --75.8938 --75.9 --75.8922 --75.8953 --75.9078 --75.8969 --75.8984 --75.9078 --75.8969 --75.9031 --75.8953 --75.8859 --75.9016 --75.8891 --75.9 --75.9031 --75.9062 --75.9078 --75.9062 --75.9031 --75.9141 --75.8875 --75.8922 --75.9 --75.8969 --75.9062 --75.8984 --75.9078 --75.9047 --75.9125 --75.8953 --75.8953 --75.8891 --75.8922 --75.9062 --75.9 --75.9 --75.9125 --75.9031 --75.8984 --75.9031 --75.9 --75.8891 --75.9062 --75.8984 --75.8859 --75.8969 --75.9016 --75.9 --75.8922 --75.8812 --75.8938 --75.8891 --75.8875 --75.8781 --75.8859 --75.8969 --75.8969 --75.9062 --75.8953 --75.8844 --75.9 --75.9125 --75.8844 --75.8984 --75.8891 --75.8969 --75.8844 --75.8953 --75.9016 --75.8891 --75.8828 --75.875 --75.8688 --75.8953 --75.8906 --75.8859 --75.8875 --75.8906 --75.8812 --75.8875 --75.8781 --75.8859 --75.8812 --75.8844 --75.8875 --75.8922 --75.8859 --75.8859 --75.8875 --75.8797 --75.8812 --75.8828 --75.8844 --75.8672 --75.8844 --75.8922 --75.8891 --75.8828 --75.8984 --75.8922 --75.8984 --75.8859 --75.8891 --75.8781 --75.8844 --75.8953 --75.8953 --75.8969 --75.8969 --75.8875 --75.9016 --75.8984 --75.9016 --75.9016 --75.8969 --75.8969 --75.8953 --75.9 --75.9016 --75.9 --75.8938 --75.8953 --75.8984 --75.9062 --75.8828 --75.9141 --75.8984 --75.9016 --75.8938 --75.8891 --75.8984 --75.9109 --75.8984 --75.9078 --75.9 --75.8969 --75.8906 --75.8969 --75.8969 --75.8875 --75.8828 --75.9016 --75.9094 --75.9016 --75.9109 --75.8984 --75.9047 --75.9062 --75.9047 --75.9031 --75.9125 --75.9031 --75.8984 --75.8969 --75.9031 --75.8984 --75.8891 --75.8906 --75.9031 --75.8969 --75.8984 --75.8969 --75.8938 --75.8984 --75.9 --75.8875 --75.9016 --75.9078 --75.8891 --75.9062 --75.9 --75.8875 --75.8938 --75.8844 --75.8953 --75.8969 --75.8906 --75.8953 --75.8953 --75.8922 --75.8938 --75.8875 --75.8938 --75.8891 --75.8969 --75.8969 --75.8922 --75.8828 --75.9031 --75.8812 --75.8953 --75.8953 --75.8906 --75.8875 --75.8938 --75.9 --75.8812 --75.8969 --75.8969 --75.9062 --75.9 --75.8797 --75.8938 --75.8859 --75.8844 --75.8984 --75.8922 --75.8766 --75.9031 --75.8938 --75.8984 --75.8922 --75.8984 --75.8875 --75.9047 --75.8828 --75.8828 --75.8875 --75.8891 --75.8891 --75.8797 --75.8984 --75.8891 --75.8859 --75.8891 --75.8906 --75.8875 --75.8922 --75.8953 --75.8938 --75.8953 --75.8922 --75.8922 --75.8953 --75.9016 --75.8859 --75.8812 --75.8906 --75.8812 --75.8844 --75.9047 --75.8844 --75.8969 --75.8969 --75.8953 --75.8953 --75.8969 --75.8781 --75.8953 --75.8953 --75.8797 --75.8719 --75.8922 --75.8859 --75.8953 --75.9031 --75.8906 --75.9031 --75.8922 --75.8953 --75.8969 --75.8984 --75.9 --75.9078 --75.8984 --75.8859 --75.9031 --75.8969 --75.9 --75.9031 --75.9047 --75.9016 --75.8938 --75.8953 --75.9031 --75.8969 --75.9031 --75.9016 --75.9 --75.9031 --75.8828 --75.8953 --75.9031 --75.8875 --75.8844 --75.8969 --75.8953 --75.8859 --75.8844 --75.8812 --75.8891 --75.8891 --75.8906 --75.8953 --75.8922 --75.8922 --75.8969 --75.9 --75.8922 --75.8984 --75.8828 --75.8906 --75.9016 --75.8891 --75.8891 --75.8922 --75.8984 --75.8828 --75.8953 --75.8891 --75.8812 --75.8969 --75.8812 --75.8938 --75.8812 --75.8969 --75.8844 --75.8938 --75.8719 --75.8875 --75.8844 --75.9016 --75.8891 --75.8859 --75.8812 --75.8906 --75.8922 --75.8812 --75.8875 --75.8922 --75.8844 --75.9 --75.8844 --75.8953 --75.8828 --75.9 --75.8891 --75.8812 --75.8984 --75.8797 --75.8875 --75.8859 --75.8859 --75.8922 --75.8906 --75.9 --75.8984 --75.8922 --75.8875 --75.8938 --75.8812 --75.8859 --75.8906 --75.8859 --75.8766 --75.8922 --75.8844 --75.8953 --75.8906 --75.8859 --75.8953 --75.8938 --75.8891 --75.8844 --75.8953 --75.8859 --75.8875 --75.875 --75.8859 --75.8844 --75.8703 --75.8734 --75.8891 --75.8828 --75.8859 --75.8828 --75.8781 --75.8906 --75.8844 --75.8844 --75.8797 --75.8938 --75.8766 --75.8953 --75.8922 --75.9 --75.8797 --75.8828 --75.8984 --75.8781 --75.8891 --75.8859 --75.8875 --75.8891 --75.8844 --75.8828 --75.8844 --75.8734 --75.8828 --75.8797 --75.9125 --75.8797 --75.8719 --75.8844 --75.8953 --75.8938 --75.8859 --75.8812 --75.8875 --75.9047 --75.8922 --75.8875 --75.8906 --75.8859 --75.8781 --75.8984 --75.9031 --75.8938 --75.9 --75.8906 --75.8875 --75.8938 --75.8953 --75.8969 --75.8891 --75.8859 --75.8953 --75.875 --75.8891 --75.8891 --75.8922 --75.9 --75.9 --75.8875 --75.8953 --75.8891 --75.8906 --75.8953 --75.8906 --75.8953 --75.9016 --75.9109 --75.9047 --75.8938 --75.8875 --75.8969 --75.8828 --75.8906 --75.8844 --75.8938 --75.8875 --75.8953 --75.8984 --75.8859 --75.8828 --75.8906 --75.9094 --75.9094 --75.9 --75.9062 --75.8922 --75.9062 --75.8828 --75.8953 --75.9 --75.8875 --75.8984 --75.8766 --75.8938 --75.8953 --75.8938 --75.9109 --75.9016 --75.8891 --75.8984 --75.8969 --75.8875 --75.8938 --75.8984 --75.9 --75.8938 --75.8875 --75.9031 --75.8875 --75.8828 --75.9 --75.8938 --75.8875 --75.8844 --75.8922 --75.8984 --75.8938 --75.8922 --75.8938 --75.9062 --75.8938 --75.9062 --75.8969 --75.9062 --75.8953 --75.8922 --75.9062 --75.9031 --75.8938 --75.8969 --75.8938 --75.9062 --75.8938 --75.9031 --75.8969 --75.9031 --75.9078 --75.8938 --75.9125 --75.9 --75.8969 --75.8891 --75.8922 --75.9172 --75.8906 --75.8969 --75.8953 --75.8984 --75.8938 --75.9031 --75.9016 --75.9078 --75.8938 --75.8875 --75.9047 --75.8891 --75.9125 --75.8781 --75.9 --75.8875 --75.8922 --75.9016 --75.8938 --75.9047 --75.8844 --75.8969 --75.9078 --75.8969 --75.8906 --75.9 --75.9062 --75.9016 --75.9141 --75.9016 --75.9031 --75.9109 --75.9078 --75.9125 --75.8859 --75.8984 --75.8953 --75.9172 --75.9109 --75.9172 --75.9047 --75.9062 --75.9016 --75.8969 --75.8984 --75.9141 --75.9078 --75.9 --75.9047 --75.8953 --75.9125 --75.9062 --75.8953 --75.9031 --75.9047 --75.9 --75.8953 --75.9016 --75.9094 --75.8938 --75.8984 --75.9156 --75.9 --75.9094 --75.9094 --75.8953 --75.8969 --75.9047 --75.9047 --75.9016 --75.8969 --75.9 --75.8969 --75.9062 --75.8984 --75.8938 --75.9031 --75.9 --75.8984 --75.8906 --75.8969 --75.9062 --75.9016 --75.9062 --75.9125 --75.9047 --75.9172 --75.9078 --75.8984 --75.8984 --75.9094 --75.9047 --75.9031 --75.9047 --75.9031 --75.8969 --75.9078 --75.9031 --75.8891 --75.9062 --75.9125 --75.8984 --75.9062 --75.9031 --75.9031 --75.9 --75.9078 --75.8969 --75.9078 --75.8922 --75.8938 --75.8969 --75.9078 --75.9094 --75.9016 --75.8859 --75.8984 --75.9062 --75.8969 --75.9016 --75.9031 --75.8891 --75.9016 --75.9062 --75.8953 --75.9 --75.9047 --75.8969 --75.8922 --75.8859 --75.8906 --75.9031 --75.9078 --75.8938 --75.9016 --75.8969 --75.9062 --75.8906 --75.9047 --75.8922 --75.9 --75.9078 --75.8984 --75.8859 --75.8969 --75.8812 --75.8906 --75.8875 --75.8906 --75.8969 --75.8953 --75.8906 --75.8953 --75.9047 --75.9016 --75.8969 --75.9 --75.9141 --75.8938 --75.9031 --75.9031 --75.8984 --75.8969 --75.8766 --75.9016 --75.8766 --75.9109 --75.9 --75.8938 --75.8969 --75.8875 --75.9031 --75.8906 --75.8891 --75.9 --75.9062 --75.9031 --75.9016 --75.9047 --75.8938 --75.8891 --75.8938 --75.8906 --75.8938 --75.8859 --75.8875 --75.9016 --75.8906 --75.8969 --75.9062 --75.8922 --75.8922 --75.8859 --75.8984 --75.8812 --75.9047 --75.8938 --75.9078 --75.8938 --75.8938 --75.8844 --75.9 --75.9016 --75.8969 --75.9078 --75.8844 --75.8891 --75.9062 --75.8984 --75.8875 --75.8828 --75.9031 --75.8781 --75.8781 --75.8875 --75.8906 --75.8906 --75.8734 --75.8891 --75.8891 --75.8875 --75.8875 --75.8781 --75.8828 --75.8891 --75.8875 --75.8906 --75.8781 --75.8859 --75.8891 --75.8875 --75.9 --75.8797 --75.875 --75.8781 --75.8906 --75.8922 --75.9 --75.8984 --75.8828 --75.8859 --75.9031 --75.8859 --75.8859 --75.8984 --75.8828 --75.8922 --75.8922 --75.9 --75.8781 --75.9031 --75.8719 --75.8875 --75.8844 --75.8844 --75.8828 --75.8906 --75.8859 --75.8844 --75.8875 --75.8891 --75.8828 --75.9047 --75.8812 --75.9016 --75.8953 --75.8922 --75.8922 --75.9031 --75.9 --75.8922 --75.8984 --75.9062 --75.9125 --75.9187 --75.9 --75.9031 --75.9031 --75.9125 --75.9047 --75.9016 --75.9094 --75.8922 --75.8875 --75.9078 --75.9062 --75.8891 --75.9031 --75.9062 --75.9016 --75.8938 --75.8906 --75.8938 --75.8969 --75.8906 --75.8906 --75.8891 --75.8953 --75.8891 --75.8984 --75.8984 --75.8844 --75.9 --75.9141 --75.8984 --75.8875 --75.8922 --75.8828 --75.8875 --75.8781 --75.9 --75.8953 --75.8922 --75.9047 --75.8922 --75.9016 --75.8906 --75.9094 --75.8875 --75.9031 --75.9031 --75.9047 --75.8875 --75.8812 --75.8969 --75.8875 --75.8828 --75.9047 --75.8875 --75.8859 --75.9 --75.8922 --75.8984 --75.8969 --75.9016 --75.9094 --75.8969 --75.8922 --75.8953 --75.9031 --75.8781 --75.9031 --75.8969 --75.875 --75.8844 --75.9031 --75.8969 --75.8969 --75.8875 --75.9016 --75.8922 --75.8906 --75.9094 --75.8797 --75.9 --75.8938 --75.8906 --75.8828 --75.8906 --75.8875 --75.8781 --75.8938 --75.8953 --75.8922 --75.9 --75.8781 --75.8984 --75.9031 --75.8969 --75.8984 --75.9016 --75.9031 --75.8859 --75.8891 --75.8922 --75.8969 --75.8969 --75.8812 --75.8938 --75.9 --75.8969 --75.9031 --75.8953 --75.8938 --75.8984 --75.8906 --75.9 --75.8797 --75.9078 --75.8969 --75.9078 --75.9 --75.8875 --75.8984 --75.9047 --75.8969 --75.8906 --75.8969 --75.9016 --75.9031 --75.9125 --75.9 --75.9047 --75.9031 --75.9062 --75.8875 --75.8812 --75.8906 --75.8781 --75.8953 --75.8891 --75.8938 --75.8953 --75.8875 --75.8953 --75.8922 --75.8844 --75.8828 --75.8812 --75.8891 --75.8906 --75.8938 --75.9016 --75.9047 --75.8922 --75.8828 --75.8891 --75.8938 --75.9031 --75.8859 --75.9031 --75.9078 --75.8922 --75.8906 --75.8719 --75.8969 --75.9094 --75.8859 --75.8953 --75.9047 --75.8922 --75.8969 --75.9078 --75.9 --75.9 --75.8922 --75.8969 --75.8891 --75.8984 --75.9 --75.9031 --75.8891 --75.9047 --75.8859 --75.8984 --75.8875 --75.8891 --75.9 --75.8984 --75.8922 --75.9016 --75.8953 --75.8938 --75.9016 --75.8984 --75.9047 --75.9 --75.9125 --75.8922 --75.8953 --75.8891 --75.8891 --75.9031 --75.9094 --75.9109 --75.9 --75.8938 --75.9 --75.9031 --75.9047 --75.8938 --75.8859 --75.8922 --75.9031 --75.8781 --75.8891 --75.8906 --75.8875 --75.8875 --75.8859 --75.8844 --75.8875 --75.8812 --75.8812 --75.8984 --75.8938 --75.8984 --75.9016 --75.8953 --75.8906 --75.8938 --75.8891 --75.8859 --75.8922 --75.9078 --75.8891 --75.8953 --75.8984 --75.8938 --75.9047 --75.8969 --75.8797 --75.8891 --75.8891 --75.8828 --75.8984 --75.8719 --75.8859 --75.8984 --75.8875 --75.8922 --75.8859 --75.9094 --75.9 --75.9 --75.9094 --75.9016 --75.8859 --75.8875 --75.9016 --75.8984 --75.8781 --75.9109 --75.8812 --75.8891 --75.8938 --75.8938 --75.8891 --75.8875 --75.8969 --75.8922 --75.8797 --75.8844 --75.8781 --75.8906 --75.8969 --75.8953 --75.8844 --75.8875 --75.8859 --75.8953 --75.8828 --75.8828 --75.8938 --75.8922 --75.8906 --75.9016 --75.8906 --75.9031 --75.9 --75.8922 --75.8953 --75.8844 --75.8922 --75.8906 --75.9031 --75.8891 --75.9016 --75.9078 --75.8969 --75.8969 --75.8844 --75.8859 --75.8938 --75.8875 --75.8922 --75.8859 --75.8734 --75.8828 --75.8953 --75.9 --75.8828 --75.8938 --75.8969 --75.9047 --75.9 --75.8844 --75.8938 --75.8938 --75.8922 --75.8938 --75.9125 --75.8984 --75.8938 --75.8969 --75.8984 --75.8891 --75.875 --75.8828 --75.8812 --75.8812 --75.8797 --75.8797 --75.8828 --75.8891 --75.8859 --75.8906 --75.8797 --75.8828 --75.8781 --75.8906 --75.8828 --75.8906 --75.8766 --75.8797 --75.8891 --75.8859 --75.8875 --75.8812 --75.8906 --75.8953 --75.8922 --75.8953 --75.8859 --75.9062 --75.8906 --75.8938 --75.8719 --75.8781 --75.8812 --75.8781 --75.8938 --75.8922 --75.8891 --75.8953 --75.8812 --75.8875 --75.8922 --75.8844 --75.8781 --75.8875 --75.8812 --75.8812 --75.8797 --75.8906 --75.8891 --75.8984 --75.8953 --75.8984 --75.8953 --75.8875 --75.8891 --75.8906 --75.9016 --75.9 --75.8859 --75.8906 --75.9047 --75.8938 --75.8875 --75.9016 --75.9016 --75.8844 --75.8844 --75.8953 --75.9 --75.8797 --75.8844 --75.8906 --75.8953 --75.8953 --75.8875 --75.8938 --75.8984 --75.8984 --75.8844 --75.9 --75.8938 --75.8828 --75.9047 --75.8891 --75.8859 --75.8906 --75.9 --75.8938 --75.8906 --75.8891 --75.8938 --75.9 --75.8922 --75.9062 --75.8906 --75.9078 --75.8953 --75.9 --75.9094 --75.9016 --75.8984 --75.9156 --75.9016 --75.9016 --75.9141 --75.8969 --75.9094 --75.9031 --75.9062 --75.8984 --75.8938 --75.8922 --75.9078 --75.8969 --75.9016 --75.8922 --75.8969 --75.8984 --75.9031 --75.8984 --75.8969 --75.9078 --75.9094 --75.9125 --75.9047 --75.9125 --75.9125 --75.9109 --75.9016 --75.8984 --75.9062 --75.9047 --75.9094 --75.8953 --75.8984 --75.9031 --75.9 --75.8906 --75.9094 --75.8953 --75.8969 --75.9141 --75.9 --75.9047 --75.9047 --75.9 --75.9016 --75.8953 --75.8797 --75.9 --75.9109 --75.8969 --75.8938 --75.8891 --75.9078 --75.9125 --75.9125 --75.9 --75.9156 --75.9125 --75.9047 --75.8969 --75.8938 --75.9031 --75.9109 --75.9141 --75.9062 --75.9062 --75.9172 --75.9078 --75.9172 --75.8984 --75.9094 --75.9094 --75.8922 --75.9 --75.9141 --75.9078 --75.8953 --75.8984 --75.9125 --75.9109 --75.9094 --75.9187 --75.9234 --75.9109 --75.9141 --75.9109 --75.925 --75.9297 --75.9062 --75.9047 --75.9031 --75.9078 --75.9141 --75.9062 --75.9016 --75.9 --75.8859 --75.9 --75.8984 --75.9 --75.9094 --75.9094 --75.8875 --75.9125 --75.8969 --75.9047 --75.8922 --75.8969 --75.8922 --75.8938 --75.9047 --75.9 --75.8844 --75.9109 --75.9016 --75.9031 --75.9 --75.8922 --75.9016 --75.8859 --75.8922 --75.8859 --75.8906 --75.8922 --75.8953 --75.9 --75.9016 --75.8953 --75.9016 --75.8984 --75.9031 --75.8969 --75.8969 --75.9 --75.8953 --75.8938 --75.9 --75.8906 --75.8891 --75.9 --75.9078 --75.8953 --75.9031 --75.8875 --75.9016 --75.8875 --75.8984 --75.8922 --75.9125 --75.9016 --75.9062 --75.8969 --75.9094 --75.9078 --75.9047 --75.9156 --75.9016 --75.8891 --75.9031 --75.8938 --75.9047 --75.8984 --75.8969 --75.8906 --75.8938 --75.8906 --75.8891 --75.8953 --75.8984 --75.8984 --75.8938 --75.8953 --75.9078 --75.8906 --75.8969 --75.8953 --75.9047 --75.9141 --75.8844 --75.8969 --75.8906 --75.9047 --75.9125 --75.8984 --75.9047 --75.9141 --75.9016 --75.9156 --75.9094 --75.9062 --75.9203 --75.8938 --75.9203 --75.9234 --75.9016 --75.9266 --75.925 --75.9141 --75.9094 --75.9172 --75.9203 --75.9125 --75.8953 --75.9109 --75.9203 --75.9078 --75.9141 --75.8938 --75.9 --75.8906 --75.9187 --75.9141 --75.9 --75.9047 --75.9109 --75.9203 --75.9141 --75.9062 --75.9094 --75.9141 --75.9 --75.9187 --75.9031 --75.9156 --75.9172 --75.9141 --75.9172 --75.8938 --75.9109 --75.9141 --75.9141 --75.9094 --75.9078 --75.9109 --75.9047 --75.9094 --75.9078 --75.8938 --75.9078 --75.9031 --75.9 --75.9141 --75.8984 --75.9031 --75.9094 --75.9094 --75.9047 --75.8984 --75.9062 --75.8969 --75.9 --75.8922 --75.8984 --75.8969 --75.8859 --75.8891 --75.8969 --75.8938 --75.8953 --75.9047 --75.8891 --75.9016 --75.9094 --75.9047 --75.9047 --75.9047 --75.8938 --75.8984 --75.8969 --75.9094 --75.9016 --75.8938 --75.8891 --75.8984 --75.8859 --75.8984 --75.8953 --75.9016 --75.9016 --75.8953 --75.8859 --75.8844 --75.8906 --75.8938 --75.8922 --75.9156 --75.9 --75.8781 --75.8859 --75.8891 --75.8938 --75.8953 --75.8969 --75.9078 --75.8906 --75.9078 --75.8969 --75.8922 --75.8984 --75.9031 --75.9062 --75.9062 --75.8906 --75.8984 --75.8953 --75.8969 --75.8891 --75.8891 --75.9016 --75.8906 --75.8922 --75.8828 --75.8938 --75.8891 --75.8969 --75.8984 --75.8859 --75.8906 --75.8922 --75.9 --75.8906 --75.8984 --75.8969 --75.8859 --75.8891 --75.8953 --75.9031 --75.8766 --75.8953 --75.8906 --75.8875 --75.8875 --75.8844 --75.8859 --75.8891 --75.8938 --75.8922 --75.8922 --75.8938 --75.8984 --75.9016 --75.9047 --75.8984 --75.9109 --75.8984 --75.9078 --75.9125 --75.8891 --75.8906 --75.9062 --75.9062 --75.8984 --75.9062 --75.8906 --75.8938 --75.8812 --75.9125 --75.9031 --75.8875 --75.8922 --75.8906 --75.8938 --75.8922 --75.8984 --75.9062 --75.9047 --75.8984 --75.8953 --75.9047 --75.9031 --75.9031 --75.9016 --75.9016 --75.9031 --75.8984 --75.8922 --75.8938 --75.9062 --75.8906 --75.9 --75.8938 --75.8922 --75.8938 --75.9078 --75.8906 --75.9 --75.8953 --75.8953 --75.8969 --75.8984 --75.8953 --75.8984 --75.8938 --75.8953 --75.8953 --75.8969 --75.9 --75.9016 --75.9062 --75.8969 --75.8984 --75.9062 --75.9031 --75.9047 --75.8969 --75.9062 --75.8969 --75.9094 --75.9109 --75.9078 --75.9047 --75.9047 --75.9016 --75.8984 --75.9094 --75.9031 --75.9125 --75.8969 --75.9062 --75.9016 --75.9094 --75.9031 --75.9156 --75.9125 --75.9141 --75.9156 --75.9125 --75.9047 --75.9094 --75.9156 --75.9047 --75.9109 --75.8984 --75.9031 --75.9078 --75.9047 --75.9141 --75.9172 --75.9 --75.9078 --75.9062 --75.9078 --75.9062 --75.9047 --75.8984 --75.9 --75.9 --75.9094 --75.9047 --75.9 --75.9219 --75.9031 --75.9031 --75.9 --75.9156 --75.9187 --75.8953 --75.9109 --75.9141 --75.9047 --75.9047 --75.9094 --75.9141 --75.9047 --75.9266 --75.9094 --75.9016 --75.9156 --75.9047 --75.9016 --75.9141 --75.9094 --75.8953 --75.9156 --75.9125 --75.9 --75.9031 --75.8875 --75.9062 --75.8953 --75.9062 --75.9031 --75.8922 --75.8984 --75.8875 --75.8953 --75.9 --75.9 --75.9047 --75.8922 --75.9031 --75.8953 --75.8906 --75.9 --75.9078 --75.9031 --75.9 --75.9141 --75.9062 --75.9016 --75.8891 --75.8812 --75.9062 --75.8969 --75.8922 --75.8969 --75.9031 --75.8953 --75.9047 --75.9047 --75.8828 --75.8781 --75.8984 --75.9016 --75.8953 --75.9172 --75.9125 --75.8984 --75.9172 --75.9219 --75.9094 --75.9141 --75.9141 --75.9062 --75.9062 --75.9094 --75.9031 --75.9062 --75.9109 --75.9094 --75.8969 --75.9156 --75.9062 --75.9094 --75.8984 --75.9094 --75.9109 --75.9031 --75.9047 --75.9094 --75.9047 --75.9094 --75.9094 --75.8844 --75.9031 --75.9 --75.9109 --75.9016 --75.9047 --75.9187 --75.8984 --75.9109 --75.9031 --75.9031 --75.8922 --75.9156 --75.8969 --75.9062 --75.8984 --75.9 --75.9094 --75.8922 --75.8938 --75.8938 --75.8969 --75.8969 --75.8984 --75.8891 --75.8844 --75.8906 --75.8844 --75.8938 --75.9062 --75.9062 --75.8906 --75.8938 --75.8906 --75.8984 --75.8953 --75.9016 --75.8859 --75.8984 --75.9047 --75.9016 --75.9016 --75.8875 --75.9062 --75.9047 --75.9047 --75.8938 --75.8938 --75.8812 --75.9062 --75.8984 --75.8922 --75.9062 --75.8906 --75.8938 --75.8859 --75.9 --75.8953 --75.8828 --75.8953 --75.9062 --75.8844 --75.8891 --75.8922 --75.8828 --75.8891 --75.8812 --75.8953 --75.8891 --75.9031 --75.8875 --75.8828 --75.8953 --75.8922 --75.8938 --75.8984 --75.8828 --75.8828 --75.8969 --75.8984 --75.9031 --75.8859 --75.9 --75.8969 --75.9047 --75.8969 --75.8875 --75.8891 --75.8969 --75.8938 --75.9078 --75.9109 --75.9016 --75.9078 --75.8906 --75.9016 --75.8969 --75.9047 --75.9047 --75.9047 --75.8953 --75.8984 --75.8938 --75.8969 --75.9078 --75.8969 --75.8875 --75.9 --75.8906 --75.8922 --75.8984 --75.8875 --75.9016 --75.8844 --75.8891 --75.8938 --75.8922 --75.9031 --75.8922 --75.8984 --75.8828 --75.8781 --75.8828 --75.9 --75.8953 --75.8938 --75.8984 --75.8906 --75.8969 --75.9094 --75.8891 --75.8969 --75.8906 --75.8922 --75.8859 --75.8969 --75.8969 --75.8891 --75.8828 --75.8812 --75.9016 --75.8938 --75.8906 --75.8922 --75.8875 --75.8797 --75.8953 --75.8906 --75.8953 --75.9016 --75.8922 --75.8938 --75.8859 --75.875 --75.9031 --75.8969 --75.8969 --75.8891 --75.8969 --75.8812 --75.8938 --75.8828 --75.8859 --75.8875 --75.8906 --75.8859 --75.8953 --75.9016 --75.8828 --75.8938 --75.8922 --75.8938 --75.875 --75.8875 --75.8922 --75.8875 --75.8766 --75.875 --75.8969 --75.8797 --75.8938 --75.9 --75.8875 --75.8984 --75.8875 --75.9016 --75.9016 --75.8844 --75.8922 --75.9031 --75.9 --75.8984 --75.8906 --75.8984 --75.8984 --75.8922 --75.8797 --75.9 --75.8984 --75.8859 --75.9078 --75.9094 --75.8891 --75.8922 --75.8906 --75.8969 --75.8922 --75.9016 --75.8969 --75.9016 --75.9125 --75.9062 --75.8953 --75.8969 --75.8906 --75.8984 --75.9047 --75.8844 --75.9125 --75.9 --75.8938 --75.9078 --75.9078 --75.9031 --75.8859 --75.9141 --75.8969 --75.9031 --75.8875 --75.8922 --75.8906 --75.8797 --75.9047 --75.8938 --75.9031 --75.9062 --75.9094 --75.8906 --75.8984 --75.8953 --75.9062 --75.8953 --75.8984 --75.8906 --75.8953 --75.9016 --75.8922 --75.8906 --75.8875 --75.8844 --75.8781 --75.8859 --75.8906 --75.8797 --75.8891 --75.8922 --75.9047 --75.8828 --75.8906 --75.9047 --75.8844 --75.8906 --75.8984 --75.9016 --75.8953 --75.8969 --75.9047 --75.9078 --75.8797 --75.9 --75.8891 --75.8891 --75.8906 --75.8922 --75.8844 --75.8938 --75.8875 --75.8906 --75.8906 --75.8859 --75.8891 --75.8859 --75.8969 --75.8719 --75.8844 --75.9047 --75.8984 --75.9094 --75.8828 --75.8797 --75.8922 --75.8953 --75.8844 --75.8969 --75.8938 --75.8828 --75.8953 --75.8844 --75.8906 --75.9047 --75.9047 --75.8875 --75.9 --75.9078 --75.9078 --75.8875 --75.8906 --75.8938 --75.8828 --75.8953 --75.8875 --75.8922 --75.8922 --75.8953 --75.8906 --75.8859 --75.8969 --75.8859 --75.9156 --75.8922 --75.8969 --75.9125 --75.8875 --75.9031 --75.9109 --75.8953 --75.9062 --75.9125 --75.8938 --75.8969 --75.9047 --75.9031 --75.8969 --75.8859 --75.8891 --75.8938 --75.8953 --75.8984 --75.8922 --75.9031 --75.8969 --75.9016 --75.8984 --75.9062 --75.8891 --75.9062 --75.8922 --75.9062 --75.9047 --75.8953 --75.8828 --75.8859 --75.8875 --75.9016 --75.9016 --75.8891 --75.8953 --75.9 --75.9 --75.8844 --75.9047 --75.9016 --75.8984 --75.9016 --75.9 --75.9156 --75.9141 --75.9031 --75.9203 --75.9016 --75.9141 --75.9141 --75.9156 --75.9125 --75.9187 --75.9109 --75.9062 --75.9078 --75.9078 --75.9062 --75.9 --75.9172 --75.9078 --75.8859 --75.9062 --75.9047 --75.8891 --75.8844 --75.8938 --75.8984 --75.8938 --75.9062 --75.9016 --75.9016 --75.8922 --75.8828 --75.9094 --75.9062 --75.9 --75.8953 --75.9031 --75.9016 --75.9016 --75.8969 --75.9031 --75.9031 --75.8984 --75.8875 --75.9 --75.9062 --75.8953 --75.8938 --75.8938 --75.8953 --75.8969 --75.9094 --75.9 --75.8875 --75.8875 --75.8844 --75.8938 --75.8953 --75.8891 --75.8984 --75.9 --75.9016 --75.8984 --75.9094 --75.8969 --75.9031 --75.8828 --75.9016 --75.8938 --75.9 --75.8828 --75.9031 --75.8984 --75.8922 --75.9 --75.8969 --75.9094 --75.8984 --75.8969 --75.8953 --75.8922 --75.8984 --75.8859 --75.9047 --75.9031 --75.8844 --75.8984 --75.9016 --75.9016 --75.8953 --75.8984 --75.9078 --75.9031 --75.8938 --75.8953 --75.8922 --75.8953 --75.8969 --75.9 --75.9078 --75.8922 --75.9078 --75.8953 --75.9 --75.8922 --75.8922 --75.9062 --75.8859 --75.8906 --75.8953 --75.8719 --75.8969 --75.8969 --75.8969 --75.8969 --75.8938 --75.8953 --75.9016 --75.8859 --75.8922 --75.8906 --75.8875 --75.8922 --75.8891 --75.8828 --75.8875 --75.9 --75.8938 --75.9047 --75.9109 --75.8969 --75.8984 --75.9 --75.8891 --75.8953 --75.9 --75.8984 --75.8844 --75.8984 --75.9 --75.8859 --75.8906 --75.8938 --75.9 --75.8922 --75.8969 --75.8859 --75.8875 --75.8984 --75.8906 --75.8891 --75.8844 --75.8812 --75.8766 --75.8781 --75.8891 --75.8906 --75.8984 --75.8875 --75.8844 --75.8953 --75.8828 --75.8859 --75.8734 --75.8906 --75.8781 --75.8781 --75.8953 --75.8906 --75.8781 --75.8828 --75.8906 --75.8844 --75.8844 --75.8953 --75.8891 --75.8953 --75.8812 --75.8938 --75.8828 --75.8875 --75.8938 --75.8938 --75.8922 --75.8812 --75.8891 --75.8891 --75.8875 --75.8984 --75.8969 --75.8938 --75.8922 --75.8906 --75.9062 --75.8844 --75.8922 --75.8797 --75.8828 --75.8875 --75.8891 --75.8906 --75.8906 --75.8688 --75.8891 --75.8969 --75.8812 --75.8875 --75.8891 --75.9 --75.8844 --75.8922 --75.8938 --75.8906 --75.8969 --75.8953 --75.8969 --75.9047 --75.8828 --75.8922 --75.8922 --75.8938 --75.8891 --75.8953 --75.8812 --75.8891 --75.8906 --75.9031 --75.8953 --75.8922 --75.8875 --75.8875 --75.9 --75.8906 --75.8906 --75.8953 --75.8828 --75.9047 --75.8797 --75.8953 --75.8969 --75.9 --75.8938 --75.8953 --75.8922 --75.8891 --75.8906 --75.9 --75.8891 --75.8859 --75.9 --75.8938 --75.8984 --75.8734 --75.8922 --75.8875 --75.8781 --75.8875 --75.8797 --75.8953 --75.8844 --75.8766 --75.9062 --75.9047 --75.8984 --75.9094 --75.8875 --75.9016 --75.9016 --75.8953 --75.8938 --75.9016 --75.8938 --75.9016 --75.9 --75.9047 --75.8969 --75.8891 --75.8969 --75.8953 --75.8844 --75.8844 --75.8859 --75.9047 --75.8984 --75.8984 --75.8859 --75.8906 --75.9031 --75.8938 --75.9047 --75.8969 --75.9047 --75.8922 --75.9078 --75.9031 --75.8953 --75.8984 --75.8969 --75.9094 --75.8812 --75.8953 --75.9016 --75.9078 --75.9047 --75.8953 --75.9125 --75.9203 --75.9047 --75.8953 --75.8984 --75.9078 --75.9172 --75.9016 --75.9141 --75.8922 --75.9094 --75.9109 --75.9062 --75.8875 --75.9 --75.8969 --75.8969 --75.8984 --75.9 --75.9047 --75.9 --75.8953 --75.8984 --75.8875 --75.9 --75.8938 --75.8969 --75.8953 --75.9031 --75.8953 --75.8953 --75.8953 --75.8906 --75.8938 --75.8875 --75.8953 --75.9031 --75.8875 --75.8953 --75.9016 --75.9016 --75.9 --75.9078 --75.8969 --75.9 --75.9016 --75.9141 --75.9 --75.8875 --75.8828 --75.8938 --75.9 --75.9 --75.9047 --75.8875 --75.8875 --75.9031 --75.9078 --75.8922 --75.9125 --75.8922 --75.9047 --75.8828 --75.8906 --75.8906 --75.8969 --75.8875 --75.8984 --75.8938 --75.8969 --75.9 --75.9109 --75.8875 --75.9 --75.8984 --75.8984 --75.9062 --75.8984 --75.8969 --75.8891 --75.9031 --75.8969 --75.8938 --75.9094 --75.9016 --75.9109 --75.8938 --75.9016 --75.9047 --75.8922 --75.9016 --75.9109 --75.8969 --75.9094 --75.8938 --75.9078 --75.8984 --75.9031 --75.8969 --75.9062 --75.9062 --75.9016 --75.9047 --75.9125 --75.9094 --75.8938 --75.9187 --75.9031 --75.9094 --75.9 --75.9109 --75.9094 --75.9078 --75.9203 --75.9047 --75.9047 --75.9109 --75.9 --75.8906 --75.8922 --75.9062 --75.9047 --75.8984 --75.9062 --75.9 --75.9062 --75.9047 --75.9031 --75.8859 --75.8984 --75.9031 --75.8859 --75.9 --75.9094 --75.9031 --75.8984 --75.8953 --75.9016 --75.9141 --75.9125 --75.9094 --75.9109 --75.9 --75.9141 --75.9062 --75.9094 --75.9047 --75.9 --75.9 --75.9078 --75.9078 --75.9094 --75.9 --75.9031 --75.9016 --75.8984 --75.8844 --75.9047 --75.9125 --75.9047 --75.8891 --75.8969 --75.9156 --75.9094 --75.8891 --75.9062 --75.9031 --75.8969 --75.8844 --75.8953 --75.9047 --75.9078 --75.8906 --75.8906 --75.9094 --75.8922 --75.9078 --75.8953 --75.8891 --75.8812 --75.8969 --75.8859 --75.8859 --75.8969 --75.8812 --75.8953 --75.8938 --75.8797 --75.8984 --75.8922 --75.8922 --75.8875 --75.9062 --75.8828 --75.8984 --75.8844 --75.8906 --75.9016 --75.8938 --75.8922 --75.9 --75.8891 --75.9094 --75.8984 --75.9031 --75.8859 --75.8859 --75.8922 --75.8891 --75.8812 --75.8938 --75.8969 --75.9016 --75.9016 --75.8953 --75.9031 --75.8953 --75.8953 --75.8938 --75.8953 --75.9 --75.8812 --75.8875 --75.9016 --75.9047 --75.9156 --75.8891 --75.9016 --75.8953 --75.8859 --75.8906 --75.8859 --75.8875 --75.9094 --75.9016 --75.8875 --75.8984 --75.8922 --75.8891 --75.8875 --75.8812 --75.8938 --75.8906 --75.8922 --75.8906 --75.8906 --75.8812 --75.8953 --75.8969 --75.8969 --75.8828 --75.9031 --75.9016 --75.9 --75.8953 --75.8969 --75.8969 --75.8938 --75.8922 --75.8938 --75.8953 --75.8875 --75.8984 --75.9016 --75.8953 --75.9062 --75.8906 --75.8875 --75.8922 --75.8812 --75.9016 --75.8938 --75.8969 --75.9031 --75.9047 --75.8984 --75.8953 --75.9062 --75.9109 --75.8953 --75.9031 --75.8984 --75.9 --75.9 --75.9078 --75.9109 --75.9016 --75.9094 --75.8984 --75.9094 --75.8938 --75.8984 --75.9062 --75.9047 --75.9062 --75.9047 --75.9078 --75.9016 --75.9219 --75.9094 --75.9094 --75.9062 --75.9016 --75.9062 --75.9156 --75.8938 --75.9094 --75.8984 --75.9109 --75.8891 --75.9125 --75.9141 --75.9062 --75.9187 --75.9109 --75.9 --75.9094 --75.9016 --75.8969 --75.9047 --75.8812 --75.9078 --75.9016 --75.9094 --75.9031 --75.9047 --75.9109 --75.9234 --75.9141 --75.9078 --75.9109 --75.9062 --75.9156 --75.8984 --75.925 --75.9156 --75.9031 --75.9187 --75.9078 --75.9047 --75.9156 --75.9141 --75.9187 --75.9078 --75.9 --75.9141 --75.9094 --75.9016 --75.9125 --75.8969 --75.9047 --75.9109 --75.9062 --75.8938 --75.9047 --75.8969 --75.9078 --75.9047 --75.9078 --75.9219 --75.9234 --75.9125 --75.9078 --75.9109 --75.9125 --75.9281 --75.9094 --75.9094 --75.9187 --75.9 --75.9016 --75.9031 --75.9141 --75.9094 --75.8969 --75.9078 --75.8969 --75.9047 --75.8969 --75.9016 --75.9047 --75.9156 --75.9172 --75.9031 --75.8922 --75.8875 --75.8922 --75.9078 --75.9016 --75.9 --75.9 --75.9062 --75.9 --75.9125 --75.9109 --75.9016 --75.9125 --75.9078 --75.9109 --75.9109 --75.9031 --75.8953 --75.9062 --75.9125 --75.9047 --75.9172 --75.9172 --75.9141 --75.8906 --75.9125 --75.925 --75.9078 --75.9016 --75.9156 --75.9125 --75.9078 --75.9172 --75.9047 --75.9219 --75.9172 --75.8938 --75.9172 --75.9016 --75.9016 --75.9062 --75.9203 --75.9156 --75.9172 --75.9172 --75.9094 --75.9109 --75.9031 --75.8953 --75.9187 --75.8891 --75.9125 --75.9109 --75.9078 --75.9031 --75.9078 --75.9062 --75.9047 --75.9078 --75.8938 --75.8938 --75.8906 --75.8875 --75.8938 --75.9062 --75.9 --75.9094 --75.9031 --75.8969 --75.9031 --75.9172 --75.9047 --75.8969 --75.9141 --75.9094 --75.9109 --75.9047 --75.9109 --75.9172 --75.9078 --75.9062 --75.9 --75.9016 --75.9031 --75.9172 --75.9 --75.8891 --75.8906 --75.8938 --75.8984 --75.9016 --75.9156 --75.8953 --75.8953 --75.9094 --75.9 --75.9 --75.9094 --75.9141 --75.9094 --75.8922 --75.8984 --75.8938 --75.9078 --75.9031 --75.9109 --75.8922 --75.9031 --75.9031 --75.8906 --75.9109 --75.9047 --75.8969 --75.9031 --75.8969 --75.9016 --75.9172 --75.9031 --75.9094 --75.8969 --75.8984 --75.8953 --75.9219 --75.9094 --75.9062 --75.9094 --75.9031 --75.9 --75.8891 --75.8953 --75.9 --75.9047 --75.8984 --75.8938 --75.9109 --75.8875 --75.8828 --75.9078 --75.8938 --75.8891 --75.8953 --75.8906 --75.9094 --75.9047 --75.9016 --75.9031 --75.8969 --75.8938 --75.9062 --75.9031 --75.9109 --75.9031 --75.9094 --75.9078 --75.9078 --75.8875 --75.9062 --75.9047 --75.9125 --75.8906 --75.9062 --75.9094 --75.9016 --75.8969 --75.9 --75.8922 --75.9031 --75.9172 --75.9 --75.8953 --75.8984 --75.8938 --75.9047 --75.9031 --75.9 --75.9094 --75.9062 --75.8875 --75.9125 --75.8938 --75.9094 --75.9078 --75.9016 --75.8984 --75.8875 --75.8984 --75.8984 --75.9047 --75.8953 --75.9 --75.9109 --75.8969 --75.9109 --75.8969 --75.8891 --75.9094 --75.8797 --75.8891 --75.8844 --75.9016 --75.8953 --75.8953 --75.9047 --75.8875 --75.8812 --75.8938 --75.8766 --75.8781 --75.8859 --75.8688 --75.8781 --75.875 --75.8875 --75.9031 --75.8844 --75.8812 --75.8875 --75.8906 --75.8844 --75.8938 --75.8875 --75.8875 --75.8859 --75.9062 --75.8781 --75.8844 --75.8906 --75.8812 --75.9062 --75.8828 --75.8922 --75.8797 --75.8969 --75.9078 --75.9016 --75.9031 --75.8938 --75.9109 --75.8828 --75.8969 --75.9031 --75.9125 --75.9031 --75.8922 --75.9031 --75.8938 --75.8859 --75.9109 --75.9078 --75.9031 --75.8938 --75.9016 --75.9 --75.9 --75.8734 --75.8906 --75.9062 --75.9031 --75.8797 --75.9094 --75.9016 --75.8844 --75.8875 --75.8938 --75.8875 --75.8969 --75.8938 --75.8906 --75.8906 --75.8922 --75.9031 --75.9047 --75.8938 --75.8969 --75.9 --75.8922 --75.9047 --75.8938 --75.9078 --75.9078 --75.8969 --75.8875 --75.9078 --75.8828 --75.8969 --75.9156 --75.8953 --75.9109 --75.9109 --75.8938 --75.8875 --75.9078 --75.9031 --75.8953 --75.9031 --75.8828 --75.9156 --75.9094 --75.9 --75.9109 --75.8984 --75.8938 --75.9062 --75.9094 --75.8906 --75.9078 --75.9125 --75.9031 --75.9 --75.9109 --75.9125 --75.9109 --75.9062 --75.9016 --75.9 --75.9203 --75.9187 --75.8984 --75.9125 --75.8969 --75.8938 --75.9016 --75.9219 --75.9031 --75.9219 --75.9156 --75.9172 --75.9031 --75.9031 --75.9156 --75.9094 --75.8984 --75.9016 --75.8953 --75.9047 --75.8906 --75.9156 --75.9109 --75.9031 --75.9062 --75.9 --75.9047 --75.9016 --75.9078 --75.9109 --75.8969 --75.9078 --75.9016 --75.9062 --75.9047 --75.8922 --75.8922 --75.9141 --75.9109 --75.8891 --75.8891 --75.8938 --75.9094 --75.9047 --75.8922 --75.8953 --75.9 --75.8984 --75.9031 --75.9234 --75.8969 --75.9031 --75.9078 --75.8922 --75.9 --75.9078 --75.9 --75.8984 --75.8922 --75.9047 --75.8969 --75.8984 --75.8969 --75.9031 --75.9062 --75.9141 --75.8969 --75.8953 --75.9031 --75.9031 --75.9047 --75.8984 --75.9047 --75.8922 --75.9016 --75.9125 --75.9 --75.9016 --75.8922 --75.9016 --75.9031 --75.9 --75.9047 --75.9078 --75.9078 --75.9 --75.9 --75.9203 --75.9 --75.9 --75.9078 --75.9172 --75.8969 --75.9047 --75.8906 --75.9156 --75.9 --75.9016 --75.9078 --75.9047 --75.8922 --75.9016 --75.9109 --75.9047 --75.9062 --75.9094 --75.9 --75.8969 --75.9078 --75.9047 --75.9031 --75.9094 --75.9078 --75.9125 --75.9125 --75.9078 --75.9203 --75.9125 --75.9234 --75.9172 --75.925 --75.9125 --75.9156 --75.9 --75.9219 --75.9156 --75.9156 --75.9156 --75.9203 --75.9328 --75.9219 --75.9031 --75.9172 --75.9203 --75.9219 --75.9016 --75.9141 --75.9078 --75.925 --75.9047 --75.9172 --75.9172 --75.9266 --75.9125 --75.9047 --75.9172 --75.9156 --75.9172 --75.9047 --75.9172 --75.9031 --75.9016 --75.9141 --75.9203 --75.9109 --75.8875 --75.9062 --75.9297 --75.9125 --75.9156 --75.9141 --75.9172 --75.9078 --75.9062 --75.9156 --75.9141 --75.9125 --75.9016 --75.9047 --75.9156 --75.9109 --75.8906 --75.9078 --75.9141 --75.9016 --75.9141 --75.9016 --75.9094 --75.9078 --75.9062 --75.8953 --75.9187 --75.8984 --75.9031 --75.9156 --75.9172 --75.9109 --75.9094 --75.9047 --75.9109 --75.9109 --75.9047 --75.9109 --75.9094 --75.8984 --75.9109 --75.9125 --75.9094 --75.9234 --75.9094 --75.9109 --75.9062 --75.9078 --75.9078 --75.9141 --75.9156 --75.9156 --75.8984 --75.9156 --75.9031 --75.9234 --75.9187 --75.8922 --75.9078 --75.9109 --75.8969 --75.8953 --75.9062 --75.9156 --75.9016 --75.8891 --75.9078 --75.9062 --75.9187 --75.9141 --75.8969 --75.8953 --75.9031 --75.9016 --75.9187 --75.9062 --75.9109 --75.9062 --75.9266 --75.9234 --75.9016 --75.9234 --75.9266 --75.9 --75.9062 --75.9141 --75.925 --75.8984 --75.9266 --75.9156 --75.9219 --75.9172 --75.9203 --75.9141 --75.9078 --75.9062 --75.9109 --75.9109 --75.9141 --75.9125 --75.9234 --75.9219 --75.925 --75.9219 --75.9156 --75.9125 --75.9062 --75.9062 --75.9266 --75.9109 --75.9 --75.9078 --75.9109 --75.9016 --75.9141 --75.9156 --75.9156 --75.8953 --75.8984 --75.8953 --75.8844 --75.8953 --75.8891 --75.9109 --75.9062 --75.8922 --75.9016 --75.9125 --75.9125 --75.9172 --75.9094 --75.925 --75.9109 --75.9094 --75.9141 --75.9016 --75.9047 --75.9031 --75.9016 --75.9203 --75.9094 --75.9141 --75.9094 --75.9156 --75.9203 --75.9062 --75.9016 --75.9078 --75.9047 --75.9125 --75.9172 --75.9141 --75.9031 --75.9078 --75.9172 --75.9156 --75.9094 --75.925 --75.9016 --75.9156 --75.9172 --75.9156 --75.9313 --75.9047 --75.925 --75.9109 --75.9094 --75.9172 --75.9234 --75.9234 --75.9156 --75.9141 --75.9234 --75.9281 --75.9109 --75.9375 --75.9141 --75.9219 --75.9234 --75.9172 --75.9172 --75.9234 --75.9359 --75.925 --75.9313 --75.9391 --75.9187 --75.9172 --75.9266 --75.9219 --75.9031 --75.9281 --75.9219 --75.9109 --75.9109 --75.9187 --75.9297 --75.9219 --75.925 --75.9203 --75.9203 --75.9219 --75.9203 --75.9047 --75.9125 --75.9187 --75.9328 --75.9266 --75.9313 --75.9203 --75.9016 --75.9172 --75.9109 --75.9094 --75.9 --75.9062 --75.9234 --75.9234 --75.9062 --75.9125 --75.9203 --75.9219 --75.9281 --75.9328 --75.9266 --75.9172 --75.9297 --75.9203 --75.9359 --75.9187 --75.9266 --75.9375 --75.9328 --75.9375 --75.9266 --75.925 --75.9141 --75.9219 --75.925 --75.9281 --75.9281 --75.9203 --75.9203 --75.9313 --75.9234 --75.9109 --75.9109 --75.9203 --75.9125 --75.9281 --75.9219 --75.9203 --75.9078 --75.9109 --75.9187 --75.9187 --75.9125 --75.925 --75.9203 --75.9328 --75.9297 --75.9328 --75.9344 --75.9172 --75.9219 --75.9219 --75.9203 --75.9281 --75.9172 --75.9266 --75.9234 --75.925 --75.9172 --75.9187 --75.9234 --75.9234 --75.9297 --75.9109 --75.9375 --75.9234 --75.9281 --75.925 --75.9344 --75.9203 --75.9109 --75.9187 --75.9187 --75.9234 --75.9172 --75.9125 --75.9297 --75.9156 --75.925 --75.9313 --75.9141 --75.95 --75.9219 --75.925 --75.9297 --75.9203 --75.9422 --75.9203 --75.9203 --75.9281 --75.925 --75.925 --75.9437 --75.9406 --75.9313 --75.925 --75.925 --75.9359 --75.9359 --75.9328 --75.9234 --75.9141 --75.9187 --75.9297 --75.9219 --75.9219 --75.9156 --75.9219 --75.9156 --75.9172 --75.9266 --75.9281 --75.9234 --75.9125 --75.9234 --75.9234 --75.9125 --75.9109 --75.9281 --75.9375 --75.925 --75.9281 --75.925 --75.9313 --75.9406 --75.9437 --75.925 --75.9094 --75.9187 --75.9359 --75.9234 --75.9344 --75.9281 --75.9406 --75.9375 --75.9281 --75.925 --75.9203 --75.9062 --75.9344 --75.9313 --75.9266 --75.9266 --75.9172 --75.9125 --75.9375 --75.925 --75.9234 --75.9281 --75.9281 --75.9203 --75.9328 --75.925 --75.9281 --75.9328 --75.9328 --75.9344 --75.9375 --75.9359 --75.9328 --75.9391 --75.9313 --75.9359 --75.9359 --75.9406 --75.9281 --75.9547 --75.9219 --75.9266 --75.9328 --75.9437 --75.9344 --75.9453 --75.9313 --75.9328 --75.9281 --75.9234 --75.9406 --75.9187 --75.9125 --75.9406 --75.9391 --75.9203 --75.9297 --75.9313 --75.9297 --75.9313 --75.9344 --75.9344 --75.9344 --75.9297 --75.9297 --75.9281 --75.9266 --75.9344 --75.9406 --75.9313 --75.9359 --75.9156 --75.9266 --75.9313 --75.9344 --75.9453 --75.9375 --75.9406 --75.9344 --75.9391 --75.9281 --75.9328 --75.9281 --75.9187 --75.9313 --75.9375 --75.9359 --75.9375 --75.9328 --75.9266 --75.9266 --75.9328 --75.9391 --75.9391 --75.925 --75.9359 --75.925 --75.9391 --75.9391 --75.9187 --75.9437 --75.9375 --75.925 --75.9281 --75.9297 --75.9313 --75.9328 --75.9359 --75.9281 --75.9266 --75.9406 --75.9344 --75.9437 --75.9437 --75.9328 --75.9297 --75.9281 --75.9469 --75.9484 --75.9375 --75.9391 --75.9484 --75.9422 --75.9406 --75.9437 --75.9453 --75.9453 --75.95 --75.9437 --75.9391 --75.9453 --75.9406 --75.9266 --75.9422 --75.9422 --75.9406 --75.9453 --75.9406 --75.95 --75.95 --75.9375 --75.9406 --75.9422 --75.9484 --75.9453 --75.9406 --75.9437 --75.9391 --75.9359 --75.9484 --75.9391 --75.9391 --75.9406 --75.9297 --75.9359 --75.9531 --75.9469 --75.9344 --75.9359 --75.9563 --75.9422 --75.9531 --75.9422 --75.9453 --75.9531 --75.95 --75.9422 --75.9469 --75.9313 --75.925 --75.9328 --75.9516 --75.925 --75.925 --75.9531 --75.9391 --75.9375 --75.9281 --75.9344 --75.9281 --75.9453 --75.9391 --75.9453 --75.9219 --75.9328 --75.9344 --75.9328 --75.9313 --75.9266 --75.9078 --75.9359 --75.9234 --75.9234 --75.9297 --75.9406 --75.9328 --75.9391 --75.9266 --75.9266 --75.9359 --75.9359 --75.9437 --75.9187 --75.9328 --75.9453 --75.9203 --75.9375 --75.9422 --75.9344 --75.9328 --75.9297 --75.9281 --75.9313 --75.9375 --75.9328 --75.9391 --75.9422 --75.9219 --75.9359 --75.9281 --75.9156 --75.9234 --75.9266 --75.9234 --75.9328 --75.9313 --75.9266 --75.9266 --75.9172 --75.9375 --75.9313 --75.9375 --75.9313 --75.9266 --75.9453 --75.9328 --75.9313 --75.9281 --75.925 --75.9406 --75.9391 --75.9391 --75.9281 --75.9375 --75.9313 --75.9437 --75.9281 --75.9359 --75.9297 --75.9375 --75.9391 --75.9266 --75.9375 --75.9391 --75.9391 --75.9406 --75.9313 --75.9375 --75.9375 --75.9375 --75.9344 --75.9344 --75.9406 --75.9453 --75.9547 --75.9406 --75.9469 --75.9484 --75.9422 --75.9453 --75.9484 --75.9484 --75.9516 --75.9313 --75.95 --75.9391 --75.9422 --75.9453 --75.9375 --75.9391 --75.9484 --75.95 --75.9437 --75.9531 --75.9453 --75.9359 --75.95 --75.9406 --75.9422 --75.9609 --75.9609 --75.9437 --75.9453 --75.9391 --75.9266 --75.9359 --75.9422 --75.9484 --75.9328 --75.95 --75.9625 --75.9406 --75.95 --75.95 --75.9422 --75.9531 --75.9406 --75.9453 --75.9469 --75.9422 --75.95 --75.9484 --75.9453 --75.9422 --75.9391 --75.9484 --75.9563 --75.9563 --75.9609 --75.9547 --75.9344 --75.9469 --75.9359 --75.9453 --75.9344 --75.9437 --75.9391 --75.9563 --75.9437 --75.9469 --75.9437 --75.9406 --75.9375 --75.9563 --75.9453 --75.9437 --75.9422 --75.9437 --75.9406 --75.9391 --75.9484 --75.9484 --75.9484 --75.9391 --75.9547 --75.9531 --75.95 --75.9422 --75.9453 --75.9437 --75.9453 --75.9469 --75.9484 --75.9453 --75.9437 --75.9297 --75.9375 --75.9391 --75.9516 --75.9422 --75.9375 --75.95 --75.9516 --75.9422 --75.9453 --75.9422 --75.9359 --75.9328 --75.9297 --75.9578 --75.9484 --75.9406 --75.9344 --75.9484 --75.9422 --75.9391 --75.9406 --75.9469 --75.9484 --75.9391 --75.9344 --75.9375 --75.9391 --75.9328 --75.9375 --75.9344 --75.9453 --75.95 --75.9375 --75.9516 --75.9344 --75.9406 --75.925 --75.9313 --75.9219 --75.9313 --75.9391 --75.9266 --75.925 --75.9391 --75.9297 --75.9297 --75.9328 --75.9391 --75.9422 --75.9297 --75.9297 --75.9484 --75.9375 --75.9406 --75.9437 --75.9359 --75.925 --75.9391 --75.9266 --75.9344 --75.9234 --75.9313 --75.9266 --75.9328 --75.9328 --75.9266 --75.9391 --75.925 --75.9391 --75.9266 --75.9406 --75.9375 --75.9328 --75.9359 --75.9406 --75.9266 --75.9391 --75.9391 --75.9359 --75.925 --75.9344 --75.9234 --75.925 --75.9422 --75.9484 --75.9297 --75.9281 --75.9328 --75.9391 --75.9391 --75.9406 --75.9422 --75.9437 --75.9375 --75.9437 --75.9344 --75.95 --75.9406 --75.9484 --75.9203 --75.9453 --75.9359 --75.9359 --75.9234 --75.9234 --75.9328 --75.9281 --75.9375 --75.9266 --75.9344 --75.9297 --75.9453 --75.9375 --75.9313 --75.9391 --75.9281 --75.9375 --75.9375 --75.9297 --75.95 --75.9359 --75.9437 --75.9422 --75.9437 --75.9344 --75.9234 --75.9453 --75.9406 --75.9422 --75.9437 --75.9297 --75.9375 --75.9281 --75.9281 --75.9422 --75.9203 --75.9313 --75.9406 --75.9344 --75.9359 --75.9437 --75.9266 --75.9297 --75.9281 --75.9359 --75.9328 --75.9203 --75.9328 --75.9406 --75.9266 --75.9266 --75.9422 --75.925 --75.9437 --75.9406 --75.9297 --75.9328 --75.9359 --75.9281 --75.9391 --75.9406 --75.9297 --75.9469 --75.9453 --75.9422 --75.9344 --75.9344 --75.9234 --75.9344 --75.9234 --75.9313 --75.9344 --75.9328 --75.9391 --75.9453 --75.9375 --75.9406 --75.9391 --75.9375 --75.9422 --75.9453 --75.9406 --75.95 --75.9547 --75.9422 --75.9531 --75.95 --75.9453 --75.9359 --75.9297 --75.9453 --75.9422 --75.95 --75.9469 --75.9344 --75.9391 --75.9422 --75.9406 --75.9406 --75.9422 --75.9344 --75.9359 --75.9125 --75.9391 --75.9344 --75.9359 --75.9484 --75.9328 --75.9266 --75.9406 --75.9547 --75.9375 --75.9469 --75.9516 --75.9422 --75.9422 --75.9406 --75.9484 --75.9313 --75.9594 --75.9391 --75.9422 --75.9437 --75.9437 --75.9422 --75.95 --75.9406 --75.9391 --75.9437 --75.9422 --75.95 --75.9469 --75.9359 --75.9422 --75.9375 --75.9469 --75.9563 --75.9391 --75.9484 --75.9313 --75.9313 --75.9406 --75.9469 --75.9375 --75.9359 --75.9203 --75.9375 --75.9375 --75.9406 --75.9406 --75.9453 --75.9437 --75.9422 --75.9437 --75.9406 --75.9516 --75.9375 --75.95 --75.9437 --75.9484 --75.9469 --75.9422 --75.9516 --75.9406 --75.9391 --75.9359 --75.95 --75.9422 --75.9375 --75.9453 --75.9328 --75.9359 --75.9359 --75.925 --75.9484 --75.9375 --75.9375 --75.9359 --75.9344 --75.9422 --75.9313 --75.9469 --75.9625 --75.9328 --75.9516 --75.9406 --75.9531 --75.9484 --75.9484 --75.9422 --75.9578 --75.95 --75.9422 --75.9453 --75.95 --75.9344 --75.9484 --75.9359 --75.9406 --75.9344 --75.9375 --75.9281 --75.9563 --75.9516 --75.9406 --75.9484 --75.9406 --75.9422 --75.9437 --75.9484 --75.9484 --75.9406 --75.9453 --75.9484 --75.9453 --75.9469 --75.9469 --75.9422 --75.9437 --75.9344 --75.9594 --75.9281 --75.9391 --75.9531 --75.9406 --75.9422 --75.9422 --75.9453 --75.9359 --75.9406 --75.9563 --75.9203 --75.9406 --75.9437 --75.9266 --75.9344 --75.9406 --75.9453 --75.9344 --75.9297 --75.9469 --75.9531 --75.9484 --75.9484 --75.9391 --75.9547 --75.9453 --75.9359 --75.9516 --75.9437 --75.9297 --75.95 --75.9484 --75.9328 --75.9531 --75.9437 --75.9266 --75.9469 --75.9406 --75.95 --75.9344 --75.9359 --75.9297 --75.9344 --75.9344 --75.9234 --75.9406 --75.9359 --75.9359 --75.9297 --75.9297 --75.9375 --75.9375 --75.9344 --75.9141 --75.9266 --75.9313 --75.9375 --75.9375 --75.9516 --75.9281 --75.9344 --75.9469 --75.9297 --75.9375 --75.9266 --75.9437 --75.9484 --75.9328 --75.9422 --75.9406 --75.9469 --75.9328 --75.9328 --75.9313 --75.9516 --75.95 --75.9437 --75.9437 --75.9531 --75.9531 --75.9453 --75.9594 --75.9422 --75.9281 --75.925 --75.9422 --75.9547 --75.9437 --75.9344 --75.9437 --75.95 --75.9531 --75.9484 --75.9359 --75.9391 --75.9422 --75.9469 --75.9578 --75.9516 --75.9578 --75.9406 --75.9469 --75.9531 --75.9406 --75.9375 --75.9391 --75.9406 --75.9281 --75.9469 --75.9422 --75.9625 --75.9344 --75.9375 --75.9375 --75.9328 --75.9359 --75.9297 --75.9453 --75.9484 --75.95 --75.9422 --75.9375 --75.9406 --75.9422 --75.95 --75.95 --75.9391 --75.9406 --75.9406 --75.9281 --75.9609 --75.9313 --75.9313 --75.9453 --75.9563 --75.9391 --75.9406 --75.9453 --75.9484 --75.9406 --75.9453 --75.9516 --75.95 --75.9391 --75.9391 --75.95 --75.9391 --75.9437 --75.9578 --75.9578 --75.95 --75.9422 --75.9594 --75.95 --75.95 --75.9406 --75.9484 --75.9547 --75.9391 --75.9469 --75.9484 --75.9453 --75.95 --75.9359 --75.9453 --75.9453 --75.9266 --75.9375 --75.9297 --75.9406 --75.9328 --75.9281 --75.9344 --75.9391 --75.9344 --75.9422 --75.9375 --75.9375 --75.9297 --75.9563 --75.9422 --75.9469 --75.9313 --75.9453 --75.9437 --75.9656 --75.9609 --75.95 --75.9578 --75.9391 --75.9484 --75.925 --75.9437 --75.9469 --75.9422 --75.9375 --75.9203 --75.9391 --75.9375 --75.9281 --75.9313 --75.9375 --75.9547 --75.9594 --75.9375 --75.9453 --75.9406 --75.9422 --75.9234 --75.9391 --75.9359 --75.9422 --75.9422 --75.9328 --75.9359 --75.9437 --75.9391 --75.9328 --75.9391 --75.9234 --75.9344 --75.9422 --75.9359 --75.925 --75.9313 --75.9391 --75.925 --75.9313 --75.9375 --75.9422 --75.9453 --75.9422 --75.9406 --75.9516 --75.9484 --75.9359 --75.9484 --75.9375 --75.9281 --75.9437 --75.9219 --75.95 --75.9422 --75.95 --75.9437 --75.9297 --75.9516 --75.9344 --75.9391 --75.9266 --75.9422 --75.9359 --75.9469 --75.9516 --75.9391 --75.95 --75.9359 --75.9469 --75.9469 --75.9516 --75.9359 --75.9344 --75.9469 --75.9406 --75.9391 --75.9422 --75.9375 --75.9406 --75.9547 --75.9406 --75.9359 --75.9531 --75.9328 --75.9391 --75.95 --75.9437 --75.9453 --75.9453 --75.9344 --75.9516 --75.9422 --75.9281 --75.9359 --75.9453 --75.9578 --75.9344 --75.9391 --75.9375 --75.9406 --75.9469 --75.9437 --75.9391 --75.9406 --75.9266 --75.9391 --75.9297 --75.9313 --75.9453 --75.9375 --75.9437 --75.9375 --75.9281 --75.9469 --75.9437 --75.95 --75.9469 --75.9453 --75.9437 --75.9453 --75.9422 --75.9437 --75.9219 --75.9359 --75.9391 --75.9547 --75.9453 --75.9453 --75.9516 --75.9453 --75.9422 --75.9422 --75.9531 --75.9531 --75.9609 --75.9625 --75.9328 --75.9453 --75.9375 --75.9531 --75.9469 --75.9422 --75.9531 --75.9422 --75.9609 --75.9328 --75.9469 --75.9406 --75.9359 --75.95 --75.9547 --75.9453 --75.9359 --75.9297 --75.9422 --75.95 --75.9484 --75.9453 --75.9469 --75.9594 --75.95 --75.9516 --75.9563 --75.9547 --75.9578 --75.9563 --75.9547 --75.95 --75.9656 --75.9531 --75.9516 --75.9563 --75.95 --75.9422 --75.95 --75.9375 --75.9594 --75.9594 --75.9391 --75.95 --75.9484 --75.95 --75.9578 --75.9484 --75.9453 --75.9406 --75.9516 --75.9406 --75.95 --75.95 --75.9453 --75.9547 --75.9469 --75.9594 --75.9516 --75.9563 --75.9547 --75.9516 --75.9469 --75.9469 --75.9547 --75.9484 --75.9516 --75.9469 --75.9547 --75.9328 --75.9328 --75.9406 --75.9484 --75.9578 --75.9531 --75.9547 --75.9594 --75.9469 --75.9437 --75.9359 --75.9437 --75.9391 --75.9359 --75.9328 --75.9313 --75.9375 --75.9375 --75.9359 --75.9437 --75.9234 --75.9484 --75.9422 --75.9297 --75.9375 --75.9219 --75.9469 --75.9375 --75.9391 --75.9469 --75.9391 --75.9266 --75.9344 --75.9406 --75.9281 --75.9391 --75.9453 --75.9406 --75.95 --75.9406 --75.9437 --75.9531 --75.9469 --75.9344 --75.9453 --75.9375 --75.9422 --75.9453 --75.9391 --75.9375 --75.925 --75.9437 --75.9141 --75.9375 --75.9313 --75.9234 --75.9313 --75.9281 --75.9391 --75.9297 --75.9234 --75.9437 --75.9391 --75.9406 --75.9406 --75.9234 --75.9391 --75.9469 --75.9469 --75.9406 --75.9422 --75.9344 --75.9359 --75.95 --75.9437 --75.9437 --75.9516 --75.9484 --75.9375 --75.9484 --75.9469 --75.9422 --75.95 --75.9578 --75.9547 --75.9469 --75.9563 --75.9375 --75.9563 --75.9391 --75.9625 --75.9453 --75.9297 --75.9344 --75.9516 --75.9453 --75.9578 --75.9375 --75.9484 --75.9391 --75.9406 --75.9406 --75.9484 --75.9484 --75.9437 --75.9359 --75.9422 --75.9437 --75.95 --75.9469 --75.9359 --75.9328 --75.9406 --75.9469 --75.9375 --75.9391 --75.9437 --75.9516 --75.9406 --75.9391 --75.9453 --75.95 --75.9531 --75.9484 --75.9391 --75.9484 --75.9578 --75.9328 --75.9406 --75.9359 --75.9313 --75.9531 --75.9453 --75.9516 --75.9297 --75.9375 --75.95 --75.9406 --75.9453 --75.9453 --75.95 --75.9437 --75.9453 --75.95 --75.9453 --75.95 --75.9484 --75.9406 --75.9406 --75.9484 --75.9391 --75.9359 --75.9359 --75.9406 --75.9469 --75.9563 --75.9578 --75.9469 --75.9469 --75.9531 --75.9422 --75.9437 --75.9391 --75.9406 --75.9391 --75.9422 --75.9359 --75.9469 --75.9531 --75.9563 --75.9328 --75.9453 --75.9375 --75.9531 --75.9328 --75.9375 --75.9406 --75.9469 --75.9469 --75.9375 --75.9406 --75.9422 --75.9547 --75.9375 --75.9437 --75.9469 --75.9391 --75.9563 --75.9391 --75.9531 --75.9437 --75.9469 --75.9391 --75.9453 --75.9609 --75.9609 --75.9594 --75.95 --75.9359 --75.9406 --75.9469 --75.9484 --75.9484 --75.9406 --75.9453 --75.9516 --75.9453 --75.9469 --75.9469 --75.9578 --75.9625 --75.9469 --75.9672 --75.9656 --75.9609 --75.9594 --75.9437 --75.9641 --75.9469 --75.9484 --75.9531 --75.9469 --75.9719 --75.9609 --75.9578 --75.95 --75.9609 --75.9531 --75.9437 --75.9563 --75.975 --75.9563 --75.9578 --75.9594 --75.9625 --75.9531 --75.9688 --75.9641 --75.9656 --75.9594 --75.9641 --75.9563 --75.9688 --75.9563 --75.975 --75.9625 --75.9531 --75.9516 --75.9672 --75.9781 --75.9563 --75.9422 --75.9547 --75.9719 --75.9656 --75.95 --75.9547 --75.9656 --75.9641 --75.9563 --75.9656 --75.9641 --75.9563 --75.9531 --75.975 --75.9594 --75.9688 --75.95 --75.9641 --75.9609 --75.9437 --75.9703 --75.95 --75.9641 --75.9547 --75.9469 --75.9406 --75.9641 --75.9563 --75.9516 --75.9578 --75.9531 --75.9531 --75.9406 --75.95 --75.9641 --75.9437 --75.9547 --75.9672 --75.9672 --75.9688 --75.9688 --75.9656 --75.9594 --75.9703 --75.9609 --75.9594 --75.9578 --75.9609 --75.9531 --75.9703 --75.9672 --75.9641 --75.9578 --75.9609 --75.9641 --75.9547 --75.9609 --75.9563 --75.9719 --75.9609 --75.9625 --75.9688 --75.9656 --75.9672 --75.9641 --75.9672 --75.9531 --75.9703 --75.9563 --75.9594 --75.9688 --75.9563 --75.9609 --75.9609 --75.9703 --75.9391 --75.9563 --75.9484 --75.9437 --75.9594 --75.9703 --75.9516 --75.9609 --75.9656 --75.9563 --75.9531 --75.9563 --75.9625 --75.9688 --75.9797 --75.9563 --75.9641 --75.9547 --75.9656 --75.9531 --75.9656 --75.95 --75.9531 --75.9656 --75.9656 --75.9563 --75.9547 --75.9641 --75.9594 --75.9656 --75.9594 --75.9609 --75.9688 --75.9703 --75.9531 --75.9391 --75.9563 --75.9703 --75.9594 --75.9734 --75.9641 --75.9688 --75.9672 --75.9734 --75.9766 --75.9703 --75.9578 --75.9609 --75.9594 --75.9688 --75.9609 --75.9625 --75.9531 --75.9547 --75.9656 --75.9734 --75.9797 --75.9688 --75.9688 --75.9563 --75.9766 --75.9656 --75.9453 --75.9672 --75.9641 --75.9672 --75.9656 --75.9656 --75.9594 --75.9719 --75.9734 --75.9656 --75.9703 --75.9719 --75.9516 --75.9531 --75.9563 --75.9563 --75.9672 --75.9484 --75.9688 --75.9641 --75.9516 --75.9422 --75.9547 --75.9594 --75.95 --75.9609 --75.9359 --75.9531 --75.9453 --75.9547 --75.95 --75.9578 --75.9516 --75.9547 --75.9547 --75.9484 --75.9641 --75.9578 --75.9547 --75.9516 --75.9531 --75.9641 --75.9609 --75.9375 --75.9547 --75.9469 --75.9672 --75.9484 --75.9547 --75.9422 --75.9375 --75.9437 --75.9563 --75.9594 --75.9469 --75.9406 --75.9563 --75.9437 --75.9641 --75.9672 --75.9656 --75.9625 --75.9719 --75.9453 --75.9578 --75.9469 --75.9563 --75.9469 --75.9484 --75.9547 --75.9453 --75.9594 --75.9469 --75.9437 --75.9625 --75.9359 --75.9516 --75.9594 --75.9484 --75.95 --75.9547 --75.95 --75.9641 --75.9594 --75.9516 --75.9469 --75.9484 --75.9547 --75.9469 --75.9563 --75.9625 --75.9391 --75.9547 --75.95 --75.9437 --75.9453 --75.9375 --75.9563 --75.9563 --75.9547 --75.9563 --75.9594 --75.95 --75.9656 --75.9547 --75.9609 --75.9578 --75.9672 --75.9516 --75.9609 --75.9547 --75.9547 --75.9656 --75.9625 --75.9578 --75.9563 --75.9609 --75.9688 --75.9625 --75.9641 --75.9563 --75.9437 --75.9563 --75.9625 --75.9672 --75.9578 --75.9609 --75.9656 --75.9609 --75.9516 --75.9609 --75.9656 --75.9609 --75.9734 --75.9641 --75.9688 --75.9563 --75.9531 --75.9594 --75.9609 --75.9437 --75.9688 --75.9609 --75.9563 --75.9563 --75.9391 --75.9656 --75.9484 --75.9531 --75.9594 --75.9531 --75.9734 --75.9594 --75.9531 --75.9531 --75.9594 --75.9578 --75.9594 --75.9609 --75.9531 --75.9625 --75.9594 --75.9609 --75.9594 --75.9516 --75.9672 --75.9437 --75.9609 --75.95 --75.9484 --75.9594 --75.9672 --75.9625 --75.9516 --75.9594 --75.9594 --75.9359 --75.9625 --75.9547 --75.95 --75.9609 --75.9516 --75.9578 --75.9484 --75.9578 --75.9422 --75.9594 --75.9406 --75.9391 --75.9453 --75.95 --75.9531 --75.9609 --75.9641 --75.9344 --75.9531 --75.9625 --75.9594 --75.9531 --75.9531 --75.9578 --75.9578 --75.9641 --75.9484 --75.9516 --75.9609 --75.9516 --75.9672 --75.9703 --75.9547 --75.9625 --75.9547 --75.9594 --75.9453 --75.9422 --75.9641 --75.9625 --75.9609 --75.9594 --75.9625 --75.975 --75.9609 --75.9688 --75.9531 --75.9656 --75.9453 --75.9719 --75.95 --75.9547 --75.9563 --75.9625 --75.9563 --75.95 --75.9563 --75.9484 --75.9375 --75.9656 --75.9563 --75.9609 --75.9609 --75.9531 --75.9547 --75.9703 --75.9547 --75.9531 --75.9391 --75.9563 --75.9469 --75.9484 --75.9656 --75.9578 --75.9594 --75.9563 --75.9609 --75.9609 --75.9625 --75.9531 --75.9656 --75.9625 --75.9609 --75.9609 --75.9656 --75.95 --75.9641 --75.9547 --75.9547 --75.9688 --75.975 --75.9609 --75.9609 --75.9516 --75.9563 --75.9609 --75.9656 --75.9609 --75.9578 --75.9641 --75.9734 --75.9656 --75.95 --75.9641 --75.9516 --75.9625 --75.9437 --75.9578 --75.9734 --75.9625 --75.9656 --75.9656 --75.9625 --75.9672 --75.9703 --75.9672 --75.975 --75.95 --75.9641 --75.9625 --75.9516 --75.9688 --75.9563 --75.9656 --75.9453 --75.9547 --75.9609 --75.9625 --75.9656 --75.9703 --75.9656 --75.9766 --75.9703 --75.9563 --75.9719 --75.9469 --75.9641 --75.9641 --75.9719 --75.9594 --75.9609 --75.9656 --75.9547 --75.9516 --75.9609 --75.9578 --75.9656 --75.9547 --75.9547 --75.95 --75.9594 --75.9672 --75.9484 --75.9578 --75.9625 --75.9719 --75.9563 --75.9516 --75.9531 --75.9578 --75.9688 --75.9391 --75.9437 --75.9563 --75.9594 --75.9484 --75.9531 --75.9375 --75.9547 --75.9469 --75.9656 --75.9516 --75.9594 --75.9516 --75.9484 --75.95 --75.9422 --75.9516 --75.9578 --75.9516 --75.9719 --75.9625 --75.9609 --75.9656 --75.9672 --75.9609 --75.9641 --75.9563 --75.9672 --75.9484 --75.9688 --75.9484 --75.95 --75.9516 --75.9453 --75.9516 --75.9531 --75.9625 --75.9516 --75.9563 --75.9625 --75.9531 --75.9578 --75.9563 --75.9547 --75.9437 --75.95 --75.95 --75.9609 --75.95 --75.9547 --75.9609 --75.9547 --75.9516 --75.9516 --75.9594 --75.9453 --75.9437 --75.9578 --75.9516 --75.9547 --75.9578 --75.9656 --75.9688 --75.9484 --75.9469 --75.9531 --75.9625 --75.9641 --75.9688 --75.9531 --75.9563 --75.9656 --75.9594 --75.9531 --75.9547 --75.9594 --75.9594 --75.9594 --75.975 --75.9547 --75.9547 --75.9688 --75.9594 --75.9719 --75.9609 --75.9672 --75.9609 --75.9656 --75.9531 --75.9734 --75.9703 --75.9594 --75.9469 --75.9563 --75.9484 --75.9484 --75.9641 --75.9625 --75.95 --75.9672 --75.9469 --75.9516 --75.9531 --75.9578 --75.9563 --75.9578 --75.9594 --75.95 --75.9594 --75.9688 --75.9578 --75.9672 --75.9516 --75.9531 --75.9578 --75.9641 --75.975 --75.9641 --75.9656 --75.9578 --75.9641 --75.9641 --75.9594 --75.9609 --75.9766 --75.9578 --75.9531 --75.9812 --75.9578 --75.975 --75.9703 --75.9703 --75.9609 --75.9625 --75.9609 --75.9547 --75.9781 --75.9688 --75.9688 --75.9703 --75.9734 --75.9719 --75.9781 --75.9609 --75.9688 --75.9688 --75.9547 --75.9609 --75.9563 --75.9703 --75.9672 --75.9547 --75.9828 --75.9594 --75.9625 --75.9672 --75.9531 --75.9531 --75.9734 --75.9578 --75.9594 --75.9563 --75.9609 --75.9656 --75.9453 --75.9641 --75.9719 --75.9578 --75.9719 --75.9641 --75.9641 --75.9688 --75.9641 --75.9703 --75.9703 --75.9625 --75.9656 --75.9938 --75.9609 --75.9609 --75.9766 --75.9719 --75.9688 --75.9641 --75.9859 --75.9734 --75.9719 --75.9719 --75.9719 --75.9594 --75.9781 --75.9812 --75.9766 --75.975 --75.9719 --75.9656 --75.9656 --75.975 --75.975 --75.9719 --75.9797 --75.9734 --75.9672 --75.9672 --75.9812 --75.9812 --75.9891 --75.9844 --75.9719 --75.9656 --75.9891 --75.9719 --75.975 --75.9672 --75.9672 --75.9719 --75.9609 --75.9875 --75.9859 --75.975 --75.9672 --75.9734 --75.9703 --75.9766 --75.9672 --75.9594 --75.9625 --75.9719 --75.9688 --75.9563 --75.9828 --75.9609 --75.9703 --75.9609 --75.9688 --75.9656 --75.9781 --75.9625 --75.9828 --75.9609 --75.9734 --75.9734 --75.9766 --75.9703 --75.9766 --75.9688 --75.9766 --75.9766 --75.9812 --75.9766 --75.9781 --75.9688 --75.9625 --75.9625 --75.9719 --75.9625 --75.9734 --75.9719 --75.9719 --75.975 --75.9734 --75.9672 --75.9594 --75.9563 --75.9625 --75.9828 --75.9563 --75.9609 --75.9672 --75.9563 --75.9688 --75.9656 --75.9797 --75.9672 --75.9641 --75.9766 --75.9484 --75.9656 --75.9688 --75.9828 --75.9672 --75.9719 --75.9656 --75.9891 --75.9688 --75.9656 --75.9719 --75.9594 --75.9656 --75.9703 --75.9578 --75.9719 --75.9688 --75.9641 --75.9672 --75.9656 --75.9563 --75.9719 --75.9625 --75.9656 --75.9625 --75.9656 --75.9656 --75.9641 --75.9859 --75.9672 --75.9703 --75.9781 --75.9719 --75.9688 --75.9781 --75.9734 --75.9734 --75.9812 --75.9688 --75.9516 --75.9672 --75.9672 --75.9688 --75.9766 --75.9578 --75.9703 --75.9594 --75.9625 --75.975 --75.9734 --75.9844 --75.975 --75.975 --75.9703 --75.9844 --75.9672 --75.9672 --75.9625 --75.975 --75.9781 --75.9734 --75.975 --75.9781 --75.9797 --75.9703 --75.9688 --75.9734 --75.9703 --75.9797 --75.9734 --75.9594 --75.9797 --75.9797 --75.9531 --75.975 --75.9766 --75.9734 --75.9609 --75.9703 --75.9703 --75.9609 --75.9844 --75.9609 --75.9625 --75.9641 --75.9563 --75.9641 --75.9656 --75.9594 --75.95 --75.9656 --75.9734 --75.9688 --75.9594 --75.9625 --75.9641 --75.9641 --75.9656 --75.9719 --75.9609 --75.9609 --75.9688 --75.9734 --75.9625 --75.9641 --75.9641 --75.9609 --75.9609 --75.9563 --75.9625 --75.9531 --75.9516 --75.9563 --75.9625 --75.9547 --75.9563 --75.9484 --75.9594 --75.9547 --75.9625 --75.9641 --75.9469 --75.9656 --75.95 --75.9641 --75.9766 --75.9734 --75.9672 --75.975 --75.9547 --75.9563 --75.9547 --75.9609 --75.9625 --75.9672 --75.9578 --75.9484 --75.9547 --75.9625 --75.9578 --75.9625 --75.9688 --75.9625 --75.9609 --75.9672 --75.9609 --75.9688 --75.9625 --75.9594 --75.9703 --75.9734 --75.9609 --75.9719 --75.9578 --75.9703 --75.9703 --75.9625 --75.9641 --75.9703 --75.9625 --75.9641 --75.9656 --75.9703 --75.9703 --75.9641 --75.9672 --75.9609 --75.9578 --75.9641 --75.9594 --75.9703 --75.9625 --75.9672 --75.9766 --75.9578 --75.9609 --75.9594 --75.9656 --75.9828 --75.9531 --75.9641 --75.9563 --75.95 --75.9641 --75.9703 --75.975 --75.9625 --75.9563 --75.9734 --75.975 --75.9672 --75.9703 --75.9594 --75.9609 --75.9563 --75.9594 --75.9578 --75.9578 --75.9594 --75.9594 --75.9563 --75.9547 --75.9703 --75.9656 --75.9547 --75.9688 --75.9641 --75.9688 --75.9563 --75.9703 --75.9641 --75.9594 --75.9594 --75.9672 --75.9703 --75.9688 --75.9563 --75.9563 --75.9516 --75.9625 --75.9422 --75.9516 --75.9547 --75.9609 --75.9578 --75.9578 --75.9656 --75.9734 --75.9703 --75.9719 --75.9719 --75.9625 --75.9469 --75.9594 --75.9516 --75.975 --75.9641 --75.9516 --75.9734 --75.9688 --75.975 --75.9688 --75.9609 --75.9719 --75.9641 --75.9625 --75.9734 --75.9594 --75.9641 --75.9656 --75.9625 --75.9563 --75.9484 --75.9641 --75.9641 --75.9688 --75.9734 --75.975 --75.9609 --75.9656 --75.9656 --75.9547 --75.9516 --75.9578 --75.9641 --75.9688 --75.9672 --75.9656 --75.9734 --75.9688 --75.9656 --75.9672 --75.9578 --75.9656 --75.9484 --75.9609 --75.9578 --75.9641 --75.9656 --75.9672 --75.9469 --75.9672 --75.9563 --75.9609 --75.9656 --75.9625 --75.9641 --75.9703 --75.9578 --75.9734 --75.9656 --75.9766 --75.9656 --75.9672 --75.975 --75.9594 --75.9547 --75.9516 --75.9734 --75.9688 --75.9563 --75.95 --75.9609 --75.9641 --75.9594 --75.9688 --75.9594 --75.9437 --75.9547 --75.9781 --75.9563 --75.9484 --75.9594 --75.9609 --75.9578 --75.9594 --75.9563 --75.9656 --75.9578 --75.9531 --75.9516 --75.9578 --75.9641 --75.9625 --75.9609 --75.9719 --75.9719 --75.9641 --75.9703 --75.9641 --75.9516 --75.9672 --75.9672 --75.9656 --75.9625 --75.9734 --75.9672 --75.9609 --75.9703 --75.9625 --75.9719 --75.9812 --75.9641 --75.9672 --75.9656 --75.9812 --75.9703 --75.9703 --75.9766 --75.9609 --75.9781 --75.9734 --75.975 --75.9688 --75.9766 --75.9672 --75.9766 --75.9703 --75.9734 --75.9625 --75.9688 --75.9625 --75.9672 --75.9703 --75.9563 --75.9656 --75.9563 --75.9672 --75.9781 --75.9703 --75.9625 --75.9734 --75.9625 --75.9594 --75.9672 --75.9563 --75.9688 --75.9766 --75.9672 --75.9781 --75.9781 --75.9781 --75.9797 --75.9688 --75.9688 --75.9719 --75.9766 --75.9734 --75.9641 --75.9656 --75.9656 --75.9797 --75.9594 --75.9688 --75.9625 --75.9766 --75.9688 --75.9734 --75.9656 --75.9688 --75.9688 --75.9766 --75.9672 --75.9797 --75.9703 --75.9797 --75.9547 --75.9719 --75.9672 --75.9812 --75.9688 --75.9797 --75.9703 --75.9703 --75.9891 --75.9812 --75.9484 --75.9578 --75.9734 --75.9688 --75.9547 --75.9688 --75.975 --75.9656 --75.9594 --75.975 --75.9656 --75.9625 --75.9688 --75.9703 --75.9703 --75.9766 --75.9703 --75.9656 --75.9656 --75.9875 --75.9578 --75.9641 --75.9781 --75.9672 --75.9828 --75.9703 --75.9547 --75.9578 --75.9578 --75.9594 --75.9625 --75.9594 --75.9703 --75.9609 --75.9516 --75.9625 --75.9547 --75.9453 --75.9578 --75.9609 --75.9641 --75.9781 --75.9672 --75.9672 --75.9719 --75.9547 --75.9688 --75.9625 --75.9703 --75.9609 --75.9625 --75.9625 --75.9688 --75.9641 --75.9641 --75.9719 --75.9578 --75.9578 --75.9672 --75.9703 --75.9625 --75.9719 --75.9672 --75.9719 --75.9625 --75.9656 --75.9625 --75.9563 --75.9656 --75.9703 --75.9625 --75.9688 --75.9688 --75.9563 --75.9578 --75.9453 --75.9688 --75.9609 --75.9734 --75.9656 --75.9547 --75.9422 --75.9578 --75.9531 --75.9437 --75.9656 --75.9547 --75.9547 --75.9563 --75.9547 --75.9453 --75.9672 --75.9609 --75.9672 --75.9563 --75.975 --75.9578 --75.9719 --75.9656 --75.9594 --75.9672 --75.9563 --75.9719 --75.9625 --75.9656 --75.9656 --75.9516 --75.9625 --75.9641 --75.9563 --75.9703 --75.9609 --75.9547 --75.9563 --75.9563 --75.9656 --75.95 --75.9547 --75.9391 --75.9578 --75.9641 --75.9453 --75.9703 --75.9734 --75.9516 --75.95 --75.9594 --75.9594 --75.9578 --75.9578 --75.9609 --75.9641 --75.9625 --75.9625 --75.9531 --75.9703 --75.9703 --75.9688 --75.9734 --75.9703 --75.9656 --75.975 --75.9703 --75.9641 --75.9719 --75.9578 --75.9531 --75.9656 --75.9594 --75.9641 --75.9609 --75.9641 --75.9719 --75.975 --75.9578 --75.9672 --75.9594 --75.9656 --75.9547 --75.9531 --75.9563 --75.9719 --75.9688 --75.9625 --75.9719 --75.9688 --75.9625 --75.9609 --75.9734 --75.9781 --75.9797 --75.9641 --75.9797 --75.9734 --75.9703 --75.9609 --75.9719 --75.9766 --75.9703 --75.975 --75.9703 --75.9609 --75.9672 --75.9719 --75.9625 --75.9703 --75.9641 --75.9797 --75.9719 --75.9734 --75.9656 --75.9703 --75.9672 --75.9672 --75.9641 --75.9734 --75.9609 --75.9719 --75.9672 --75.9656 --75.9625 --75.9609 --75.975 --75.9656 --75.9625 --75.9625 --75.9672 --75.9656 --75.9609 --75.9797 --75.9609 --75.9672 --75.9609 --75.9609 --75.9703 --75.9594 --75.9859 --75.9625 --75.9781 --75.9688 --75.9688 --75.9688 --75.9578 --75.9625 --75.9578 --75.9688 --75.9609 --75.9531 --75.9641 --75.9531 --75.9625 --75.9672 --75.9563 --75.9656 --75.9609 --75.9578 --75.975 --75.9641 --75.9578 --75.9547 --75.9563 --75.9484 --75.9578 --75.9578 --75.9547 --75.9516 --75.9625 --75.9688 --75.9531 --75.9672 --75.9578 --75.9703 --75.9516 --75.9625 --75.9594 --75.9516 --75.9625 --75.9563 --75.9563 --75.9641 --75.9578 --75.9469 --75.9609 --75.9469 --75.9547 --75.9578 --75.9484 --75.9547 --75.9609 --75.9547 --75.9609 --75.9594 --75.9703 --75.9625 --75.9703 --75.9609 --75.9797 --75.9547 --75.9641 --75.95 --75.9656 --75.9609 --75.9672 --75.9797 --75.9672 --75.9625 --75.9672 --75.9609 --75.9578 --75.9641 --75.9469 --75.9672 --75.9641 --75.9547 --75.9469 --75.9594 --75.975 --75.9703 --75.9547 --75.975 --75.9688 --75.9641 --75.9625 --75.9594 --75.9609 --75.9531 --75.9672 --75.9609 --75.9484 --75.9547 --75.9625 --75.9594 --75.9641 --75.9547 --75.9531 --75.9547 --75.9516 --75.9594 --75.9641 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9656 --75.9625 --75.9563 --75.9609 --75.9672 --75.9578 --75.9625 --75.9703 --75.9766 --75.9703 --75.9547 --75.9594 --75.9688 --75.9641 --75.95 --75.9766 --75.9609 --75.95 --75.9641 --75.9578 --75.9516 --75.9547 --75.9609 --75.9734 --75.9734 --75.95 --75.9609 --75.9656 --75.9672 --75.9703 --75.9703 --75.9609 --75.9641 --75.9844 --75.9594 --75.9797 --75.9734 --75.9766 --75.9734 --75.9656 --75.9719 --75.9844 --75.9656 --75.9891 --75.9859 --75.9781 --75.975 --75.9734 --75.9812 --75.9844 --75.9797 --75.9922 --75.9844 --75.9891 --75.975 --75.975 --75.9797 --75.9812 --75.9688 --75.9703 --75.9656 --75.9812 --75.9703 --75.9719 --75.9781 --75.975 --75.9844 --75.9641 --75.9688 --75.9641 --75.9547 --75.9578 --75.9688 --75.9703 --75.9703 --75.9531 --75.9688 --75.9703 --75.975 --75.9688 --75.9766 --75.9625 --75.9781 --75.9703 --75.9734 --75.9609 --75.9641 --75.9578 --75.975 --75.9719 --75.9578 --75.9719 --75.9797 --75.9656 --75.975 --75.9703 --75.9828 --75.9625 --75.9578 --75.9625 --75.9547 --75.9719 --75.9688 --75.9516 --75.9609 --75.9641 --75.9734 --75.9594 --75.9688 --75.9703 --75.9703 --75.975 --75.9828 --75.9719 --75.9609 --75.9688 --75.9672 --75.975 --75.9609 --75.9641 --75.9703 --75.9625 --75.9531 --75.9703 --75.9641 --75.9656 --75.9609 --75.9766 --75.9484 --75.9672 --75.9625 --75.9781 --75.9781 --75.9641 --75.9656 --75.975 --75.9797 --75.9688 --75.9781 --75.9656 --75.9703 --75.9578 --75.9797 --75.9625 --75.9672 --75.9594 --75.9641 --75.9703 --75.9656 --75.9719 --75.9656 --75.9781 --75.9656 --75.9734 --75.9672 --75.9594 --75.9609 --75.9781 --75.9672 --75.9797 --75.9578 --75.9828 --75.9594 --75.9672 --75.9766 --75.9688 --75.9734 --75.9688 --75.9719 --75.9625 --75.9703 --75.9641 --75.975 --75.9656 --75.9656 --75.9609 --75.9672 --75.9688 --75.9609 --75.9719 --75.9625 --75.9609 --75.9406 --75.9719 --75.9703 --75.9672 --75.9719 --75.9734 --75.9766 --75.9563 --75.9563 --75.9688 --75.9797 --75.9641 --75.9578 --75.9672 --75.9578 --75.9578 --75.9609 --75.9531 --75.9641 --75.9609 --75.9594 --75.9672 --75.9625 --75.9578 --75.9578 --75.9688 --75.9594 --75.9531 --75.9719 --75.9625 --75.9594 --75.9594 --75.9828 --75.9656 --75.9688 --75.9703 --75.9688 --75.9625 --75.9672 --75.9594 --75.9578 --75.9578 --75.9672 --75.9641 --75.9656 --75.9578 --75.9703 --75.9672 --75.9641 --75.9609 --75.95 --75.9656 --75.9594 --75.9594 --75.9656 --75.9594 --75.9719 --75.9656 --75.9703 --75.9641 --75.9781 --75.9625 --75.9797 --75.9703 --75.9641 --75.9734 --75.9781 --75.9625 --75.9672 --75.9734 --75.9734 --75.9625 --75.9688 --75.9688 --75.9703 --75.9625 --75.975 --75.9688 --75.9672 --75.9656 --75.9719 --75.9641 --75.9703 --75.9828 --75.9797 --75.9891 --75.9688 --75.9656 --75.9703 --75.9703 --75.975 --75.9859 --75.9766 --75.9688 --75.9672 --75.9672 --75.9844 --75.9828 --75.9703 --75.9703 --75.9719 --75.9812 --75.9766 --75.9625 --75.9828 --75.9812 --75.9578 --75.9688 --75.9797 --75.9656 --75.9891 --75.9703 --75.9719 --75.9781 --75.9781 --75.9719 --75.975 --75.9688 --75.9641 --75.9656 --75.9672 --75.9766 --75.95 --75.9641 --75.9484 --75.9594 --75.9609 --75.9578 --75.9625 --75.9672 --75.9563 --75.95 --75.9656 --75.9672 --75.9609 --75.9516 --75.9719 --75.9625 --75.9672 --75.9641 --75.9734 --75.9656 --75.9719 --75.9578 --75.9688 --75.9719 --75.9625 --75.975 --75.9656 --75.9594 --75.9688 --75.9594 --75.9672 --75.9734 --75.9688 --75.9766 --75.9578 --75.975 --75.9609 --75.9719 --75.95 --75.9609 --75.9703 --75.975 --75.9656 --75.9578 --75.9688 --75.9625 --75.9641 --75.9672 --75.9453 --75.9609 --75.9531 --75.9609 --75.9578 --75.9625 --75.9641 --75.9688 --75.9578 --75.9609 --75.9531 --75.9563 --75.9734 --75.9672 --75.9578 --75.9625 --75.9641 --75.9641 --75.9844 --75.9828 --75.9781 --75.9688 --75.9766 --75.9797 --75.9766 --75.9625 --75.9672 --75.9734 --75.9734 --75.9672 --75.9781 --75.9656 --75.9703 --75.9672 --75.9688 --75.9563 --75.9609 --75.9656 --75.9688 --75.9656 --75.9578 --75.9641 --75.9563 --75.9531 --75.9531 --75.9547 --75.975 --75.95 --75.95 --75.9578 --75.9672 --75.9609 --75.9578 --75.9516 --75.9563 --75.9656 --75.9563 --75.9719 --75.9516 --75.9531 --75.9469 --75.9594 --75.9563 --75.9594 --75.9531 --75.9391 --75.975 --75.9547 --75.9719 --75.9516 --75.9625 --75.9641 --75.9625 --75.9547 --75.9547 --75.9563 --75.9594 --75.975 --75.9531 --75.9625 --75.9625 --75.9703 --75.9734 --75.9641 --75.9688 --75.9625 --75.9625 --75.9594 --75.9594 --75.9625 --75.9531 --75.9437 --75.9625 --75.9563 --75.9594 --75.9531 --75.9578 --75.9563 --75.9453 --75.9609 --75.9453 --75.9516 --75.9563 --75.9672 --75.9594 --75.9688 --75.9594 --75.9625 --75.9734 --75.9672 --75.9656 --75.9656 --75.9703 --75.9625 --75.9516 --75.9609 --75.9594 --75.9594 --75.9688 --75.9437 --75.9563 --75.9484 --75.9563 --75.9609 --75.9594 --75.9484 --75.9625 --75.9484 --75.9531 --75.9578 --75.9625 --75.9547 --75.9656 --75.9516 --75.9641 --75.9578 --75.9484 --75.9703 --75.9703 --75.9516 --75.9625 --75.9609 --75.9563 --75.9656 --75.9703 --75.9625 --75.9625 --75.9703 --75.9609 --75.9625 --75.9609 --75.9656 --75.9672 --75.9719 --75.9594 --75.9688 --75.9625 --75.9531 --75.9734 --75.975 --75.9547 --75.9703 --75.9672 --75.9672 --75.9656 --75.9547 --75.9516 --75.9578 --75.9531 --75.9516 --75.9469 --75.9656 --75.9578 --75.9641 --75.9563 --75.9703 --75.9625 --75.9688 --75.9672 --75.9656 --75.9484 --75.9672 --75.9563 --75.9656 --75.9703 --75.9656 --75.9625 --75.9625 --75.9625 --75.9547 --75.9547 --75.9578 --75.9547 --75.9484 --75.9688 --75.9547 --75.9453 --75.9578 --75.9703 --75.9609 --75.9828 --75.9578 --75.9625 --75.9703 --75.9547 --75.9484 --75.9672 --75.9563 --75.9594 --75.9609 --75.9422 --75.9656 --75.95 --75.9625 --75.9594 --75.9578 --75.9563 --75.9469 --75.9734 --75.9625 --75.9703 --75.9594 --75.9578 --75.9719 --75.9719 --75.9781 --75.9672 --75.9781 --75.9656 --75.9703 --75.9688 --75.9672 --75.9688 --75.9703 --75.9625 --75.9812 --75.975 --75.9844 --75.9703 --75.9734 --75.9563 --75.9688 --75.9797 --75.9656 --75.9641 --75.9563 --75.9625 --75.9734 --75.9641 --75.9563 --75.9484 --75.9578 --75.9672 --75.9734 --75.9625 --75.9703 --75.9719 --75.9641 --75.9703 --75.9766 --75.9781 --75.9859 --75.975 --75.9797 --75.975 --75.975 --75.9812 --75.9844 --75.9719 --75.9891 --75.9719 --75.9828 --75.9719 --75.9719 --75.9688 --75.9812 --75.9797 --75.9734 --75.9844 --75.9688 --75.9594 --75.9891 --75.9641 --75.9781 --75.9812 --75.9578 --75.9781 --75.9766 --75.9688 --75.9828 --75.9766 --75.9797 --75.9844 --75.9734 --75.9828 --75.9734 --75.9891 --75.9625 --75.9875 --75.9734 --75.9891 --75.9812 --75.9828 --75.9812 --75.9672 --75.9797 --75.9781 --75.9812 --75.975 --75.9828 --75.975 --75.9734 --75.9625 --75.9719 --75.9734 --75.975 --75.9703 --75.9875 --75.9828 --75.9844 --75.9797 --75.9812 --75.9797 --75.9812 --75.9891 --75.9859 --75.9812 --75.9766 --75.9875 --75.9859 --75.9672 --75.9953 --75.9656 --75.9844 --75.9828 --75.9797 --75.9906 --75.9797 --75.9797 --75.9719 --75.9891 --75.9844 --75.9859 --75.9844 --75.9625 --75.9766 --75.9594 --75.9625 --75.9609 --75.9672 --75.9688 --75.9719 --75.9812 --75.9656 --75.9781 --75.9781 --75.9859 --75.9734 --75.9719 --75.975 --75.9719 --75.9656 --75.9719 --75.9891 --75.9719 --75.9625 --75.9688 --75.9797 --75.9719 --75.975 --75.9719 --75.9703 --75.9766 --75.9609 --75.9672 --75.9688 --75.9672 --75.9766 --75.9891 --75.9641 --75.9703 --75.9641 --75.9734 --75.9672 --75.9688 --75.9766 --75.9656 --75.9781 --75.9672 --75.9703 --75.9641 --75.9609 --75.9734 --75.9469 --75.9547 --75.9656 --75.9703 --75.9688 --75.9609 --75.9656 --75.9625 --75.975 --75.9563 --75.9578 --75.9484 --75.9719 --75.9734 --75.9688 --75.9531 --75.9766 --75.975 --75.9594 --75.9594 --75.9625 --75.9641 --75.9547 --75.9688 --75.9531 --75.9563 --75.9609 --75.9688 --75.9609 --75.9625 --75.9656 --75.9656 --75.9578 --75.9547 --75.9734 --75.9656 --75.9578 --75.9641 --75.9656 --75.9625 --75.9688 --75.9625 --75.9469 --75.9516 --75.9531 --75.9563 --75.9563 --75.9641 --75.9703 --75.9688 --75.9594 --75.9594 --75.9641 --75.9703 --75.9609 --75.9672 --75.9563 --75.9609 --75.9688 --75.9656 --75.9656 --75.9609 --75.9688 --75.9734 --75.9672 --75.9578 --75.9734 --75.9656 --75.9563 --75.9609 --75.9578 --75.9641 --75.9672 --75.9734 --75.9672 --75.9734 --75.9641 --75.9797 --75.9594 --75.9688 --75.9875 --75.9656 --75.9719 --75.9766 --75.9578 --75.9859 --75.9719 --75.9734 --75.9578 --75.9734 --75.9641 --75.975 --75.9766 --75.9688 --75.9578 --75.9563 --75.9625 --75.9594 --75.9609 --75.9531 --75.9594 --75.9641 --75.9531 --75.9672 --75.9672 --75.9625 --75.9688 --75.9734 --75.9516 --75.9625 --75.975 --75.9703 --75.9641 --75.9484 --75.9688 --75.9688 --75.9594 --75.9641 --75.9516 --75.9656 --75.9625 --75.9641 --75.9688 --75.9734 --75.9844 --75.9656 --75.9641 --75.9703 --75.9594 --75.9734 --75.9812 --75.9641 --75.9797 --75.9625 --75.9812 --75.9625 --75.9781 --75.9594 --75.9641 --75.9688 --75.9563 --75.9641 --75.9656 --75.9766 --75.9672 --75.9703 --75.9672 --75.9625 --75.9672 --75.975 --75.9688 --75.9828 --75.9703 --75.9828 --75.9594 --75.9812 --75.9766 --75.9812 --75.9828 --75.9656 --75.9578 --75.9688 --75.9656 --75.9688 --75.9734 --75.9812 --75.9734 --75.9672 --75.9734 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9703 --75.9672 --75.9625 --75.9547 --75.9688 --75.9672 --75.975 --75.9703 --75.9656 --75.9828 --75.9703 --75.9719 --75.9719 --75.9641 --75.9766 --75.9672 --75.9719 --75.9719 --75.9656 --75.9672 --75.9578 --75.9703 --75.9828 --75.9703 --75.9672 --75.9781 --75.9656 --75.9703 --75.9656 --75.9641 --75.9781 --75.9688 --75.9828 --75.9719 --75.9688 --75.9734 --75.975 --75.9844 --75.9656 --75.9906 --75.9766 --75.9766 --75.9719 --75.9859 --75.9641 --75.9828 --75.9797 --75.9797 --75.9703 --75.9688 --75.9812 --75.9844 --75.975 --75.9656 --75.9672 --75.9703 --75.9688 --75.9734 --75.9828 --75.9641 --75.9781 --75.9672 --75.9625 --75.9781 --75.9688 --75.9594 --75.9719 --75.9766 --75.9703 --75.9656 --75.975 --75.9719 --75.9609 --75.9641 --75.9812 --75.9719 --75.9672 --75.975 --75.9875 --75.975 --75.9797 --75.9734 --75.9891 --75.9781 --75.9828 --75.9859 --75.9828 --75.9781 --75.9719 --75.9781 --75.9781 --75.9766 --75.9672 --75.9672 --75.9656 --75.9672 --75.9672 --75.9688 --75.9719 --75.9688 --75.9719 --75.9703 --75.9641 --75.9641 --75.9672 --75.975 --75.9641 --75.9734 --75.9797 --75.9672 --75.975 --75.975 --75.9688 --75.9703 --75.9859 --75.9563 --75.9625 --75.9719 --75.9812 --75.9734 --75.9578 --75.9781 --75.9703 --75.9734 --75.9734 --75.9844 --75.9688 --75.9781 --75.9734 --75.9703 --75.9734 --75.9766 --75.9766 --75.975 --75.9844 --75.9734 --75.9719 --75.9688 --75.9734 --75.9797 --75.9672 --75.9625 --75.9625 --75.9625 --75.9672 --75.975 --75.9625 --75.9656 --75.9516 --75.9688 --75.9781 --75.9578 --75.9719 --75.9641 --75.9766 --75.9766 --75.9781 --75.9781 --75.9672 --75.9625 --75.9641 --75.9656 --75.9594 --75.9578 --75.9734 --75.9703 --75.9656 --75.9609 --75.9656 --75.9594 --75.9719 --75.9641 --75.975 --75.9641 --75.9734 --75.9547 --75.9547 --75.9594 --75.9719 --75.9688 --75.9625 --75.9656 --75.9609 --75.975 --75.9672 --75.9563 --75.9578 --75.9625 --75.9719 --75.9688 --75.9547 --75.9641 --75.9797 --75.9734 --75.9688 --75.975 --75.9719 --75.9625 --75.9766 --75.9656 --75.9672 --75.9703 --75.9672 --75.9531 --75.9656 --75.9703 --75.9625 --75.9563 --75.9656 --75.9609 --75.9656 --75.9797 --75.9812 --75.9781 --75.9719 --75.9625 --75.9688 --75.9672 --75.9781 --75.9672 --75.9672 --75.9703 --75.9781 --75.9609 --75.975 --75.9734 --75.9734 --75.9734 --75.9688 --75.9703 --75.9766 --75.9813 --75.9688 --75.9812 --75.9797 --75.9797 --75.975 --75.9859 --75.9719 --75.9734 --75.9719 --75.9906 --75.9641 --75.9781 --75.9734 --75.9656 --75.9719 --75.9688 --75.9734 --75.9766 --75.9906 --75.9875 --75.9594 --75.9625 --75.9688 --75.9719 --75.9766 --75.9609 --75.9641 --75.9656 --75.9812 --75.9641 --75.9641 --75.9656 --75.9703 --75.9641 --75.9781 --75.9719 --75.9688 --75.9578 --75.9672 --75.9656 --75.9516 --75.9609 --75.9625 --75.9672 --75.9578 --75.9781 --75.9719 --75.9594 --75.9703 --75.9766 --75.9766 --75.9578 --75.9734 --75.9766 --75.9547 --75.9781 --75.9656 --75.9641 --75.9688 --75.9781 --75.9672 --75.9656 --75.9625 --75.975 --75.9688 --75.9641 --75.9766 --75.9641 --75.9563 --75.9781 --75.9703 --75.9563 --75.9656 --75.9641 --75.9672 --75.9781 --75.9766 --75.9766 --75.9844 --75.9703 --75.9734 --75.9766 --75.9672 --75.9797 --75.9781 --75.9781 --75.975 --75.9766 --75.9797 --75.9703 --75.9812 --75.9688 --75.975 --75.9703 --75.9672 --75.9766 --75.9781 --75.9875 --75.9844 --75.9844 --75.975 --75.9797 --75.9781 --75.9734 --75.9672 --75.9672 --75.975 --75.9641 --75.9797 --75.975 --75.9672 --75.9578 --75.9734 --75.9797 --75.9828 --75.9672 --75.9672 --75.9766 --75.9797 --75.9922 --75.9781 --75.9812 --75.9844 --75.9906 --75.975 --75.9812 --75.9969 --75.9703 --75.9797 --75.9734 --75.9859 --75.9922 --75.9797 --75.9953 --75.9734 --75.9797 --75.9891 --75.9891 --75.9719 --75.975 --75.9828 --75.9859 --75.9719 --75.9844 --75.9656 --75.9656 --75.9828 --75.9781 --75.9734 --75.9844 --75.9844 --75.9781 --75.9828 --75.9797 --75.9812 --75.975 --75.9797 --75.9766 --75.9828 --75.9672 --75.9734 --75.9734 --75.9719 --75.9766 --75.9688 --75.9766 --75.9672 --75.9766 --75.9812 --75.9828 --75.9766 --75.975 --75.9797 --75.9828 --75.9703 --75.975 --75.9734 --75.9734 --75.9609 --75.9641 --75.9781 --75.9594 --75.9734 --75.9719 --75.9672 --75.9781 --75.9672 --75.9781 --75.9656 --75.9812 --75.9672 --75.9781 --75.9828 --75.9594 --75.9516 --75.9812 --75.9797 --75.9594 --75.9719 --75.9703 --75.9734 --75.9781 --75.9812 --75.9672 --75.9703 --75.9688 --75.9688 --75.9812 --75.9672 --75.9734 --75.9781 --75.9688 --75.9766 --75.9656 --75.9828 --75.9688 --75.975 --75.975 --75.9766 --75.9891 --75.9781 --75.9781 --75.9766 --75.9656 --75.9766 --75.9797 --75.9781 --75.9688 --75.9797 --75.9812 --75.9812 --75.9672 --75.9703 --75.9766 --75.9734 --75.9828 --75.9844 --75.9906 --75.9859 --75.9703 --75.975 --75.9859 --75.9844 --75.9844 --75.9812 --75.9734 --75.9766 --75.9766 --75.9703 --75.9641 --75.9828 --75.9672 --75.9734 --75.9641 --75.9672 --75.9781 --75.9781 --75.9641 --75.9906 --75.9797 --75.975 --75.9812 --75.9734 --75.9625 --75.9734 --75.9906 --75.9734 --75.9828 --75.975 --75.9797 --75.9938 --75.9656 --75.9828 --75.9797 --75.9781 --75.9844 --75.9703 --75.975 --75.9734 --75.9797 --75.9828 --75.975 --75.9703 --75.9641 --75.9734 --75.9781 --75.9734 --75.9641 --75.9656 --75.9828 --75.9797 --75.975 --75.9797 --75.9672 --75.9766 --75.9797 --75.9688 --75.975 --75.9703 --75.975 --75.9781 --75.9703 --75.9812 --75.9688 --75.9906 --75.9703 --75.9844 --75.9766 --75.9703 --75.9828 --75.9656 --75.9844 --75.9812 --75.9766 --75.9703 --75.9672 --75.9734 --75.9672 --75.9781 --75.9734 --75.975 --75.9719 --75.9922 --75.9797 --75.9797 --75.9875 --75.9875 --75.9875 --75.9812 --75.9766 --75.9672 --75.9859 --75.9797 --75.9859 --75.9859 --75.9828 --75.9797 --75.9797 --75.9734 --75.9797 --75.9844 --75.9875 --75.9719 --75.9672 --75.9781 --75.9875 --75.9828 --75.975 --75.9688 --75.9859 --75.9953 --75.9906 --75.9875 --75.9859 --75.975 --75.975 --75.9781 --75.9891 --75.9688 --75.9969 --75.9797 --75.9688 --75.9672 --75.9797 --75.9766 --75.9703 --75.9844 --75.975 --75.9828 --75.9719 --75.9828 --75.9812 --75.9703 --75.9656 --75.9781 --75.9812 --75.9781 --75.9781 --75.9812 --75.9812 --75.9672 --75.9844 --75.9781 --75.9703 --75.9703 --75.9656 --75.975 --75.9625 --75.9656 --75.9625 --75.9797 --75.9703 --75.9703 --75.9719 --75.9656 --75.9609 --75.9703 --75.9703 --75.9641 --75.9672 --75.9766 --75.9609 --75.9688 --75.9766 --75.9703 --75.9875 --75.9797 --75.9719 --75.9688 --75.9641 --75.9672 --75.975 --75.9656 --75.9578 --75.9688 --75.9656 --75.9797 --75.9641 --75.9594 --75.9781 --75.9563 --75.9609 --75.9734 --75.9672 --75.9656 --75.9766 --75.9672 --75.9625 --75.9547 --75.9625 --75.9734 --75.9734 --75.9594 --75.9594 --75.9641 --75.9656 --75.9625 --75.9625 --75.9484 --75.9797 --75.9766 --75.9688 --75.9672 --75.9656 --75.9625 --75.9672 --75.9625 --75.9625 --75.9625 --75.9766 --75.9703 --75.9516 --75.9672 --75.9609 --75.975 --75.9563 --75.9578 --75.9578 --75.9703 --75.9547 --75.9656 --75.9656 --75.9625 --75.95 --75.975 --75.9719 --75.9625 --75.9672 --75.975 --75.9578 --75.95 --75.9578 --75.9594 --75.9578 --75.9625 --75.95 --75.9672 --75.9672 --75.9625 --75.9641 --75.9844 --75.9641 --75.9594 --75.9734 --75.9766 --75.9672 --75.9609 --75.9516 --75.9672 --75.9719 --75.9688 --75.9578 --75.9703 --75.9609 --75.9594 --75.95 --75.9672 --75.9766 --75.9547 --75.9656 --75.9469 --75.9719 --75.9781 --75.9594 --75.9641 --75.9734 --75.9672 --75.9531 --75.9734 --75.9641 --75.9672 --75.9703 --75.9688 --75.9594 --75.9656 --75.9719 --75.9703 --75.9719 --75.9656 --75.9656 --75.9797 --75.9891 --75.9766 --75.9625 --75.9734 --75.9766 --75.9656 --75.9719 --75.9625 --75.9578 --75.9672 --75.9672 --75.9719 --75.975 --75.9656 --75.9891 --75.9812 --75.9734 --75.9625 --75.975 --75.9656 --75.9688 --75.975 --75.9563 --75.9609 --75.9594 --75.9563 --75.9609 --75.9594 --75.9656 --75.9672 --75.9656 --75.9594 --75.9688 --75.9641 --75.9641 --75.975 --75.9766 --75.9672 --75.9656 --75.9672 --75.9766 --75.9625 --75.9672 --75.9703 --75.9672 --75.9734 --75.9656 --75.9891 --75.9656 --75.9609 --75.9688 --75.9656 --75.9625 --75.9672 --75.9594 --75.9688 --75.9703 --75.9828 --75.9719 --75.9547 --75.9609 --75.9672 --75.9672 --75.9828 --75.9547 --75.9812 --75.9766 --75.9672 --75.9703 --75.9844 --75.9719 --75.9719 --75.9641 --75.9563 --75.9625 --75.9531 --75.9703 --75.9672 --75.9672 --75.9703 --75.9594 --75.9578 --75.9609 --75.9688 --75.9672 --75.9703 --75.9656 --75.9578 --75.9656 --75.9703 --75.9672 --75.9672 --75.9641 --75.9672 --75.9656 --75.9719 --75.9594 --75.9625 --75.9641 --75.9797 --75.975 --75.9781 --75.9672 --75.9656 --75.9703 --75.9688 --75.9672 --75.9531 --75.9859 --75.9766 --75.975 --75.9594 --75.9625 --75.9594 --75.9688 --75.9578 --75.9719 --75.9484 --75.9547 --75.9703 --75.9641 --75.9797 --75.9734 --75.9766 --75.9688 --75.9734 --75.9656 --75.9797 --75.9672 --75.9609 --75.9563 --75.9672 --75.9766 --75.9609 --75.9688 --75.9672 --75.9656 --75.9594 --75.9609 --75.9672 --75.9656 --75.9563 --75.9703 --75.9578 --75.9641 --75.9547 --75.9594 --75.9594 --75.9656 --75.9672 --75.9719 --75.9625 --75.9609 --75.9516 --75.9531 --75.9578 --75.9563 --75.9672 --75.9484 --75.9672 --75.9609 --75.9563 --75.9547 --75.9609 --75.9531 --75.9547 --75.9484 --75.9484 --75.9469 --75.9484 --75.9531 --75.9484 --75.95 --75.9422 --75.9453 --75.9437 --75.9609 --75.9547 --75.9609 --75.9516 --75.9563 --75.9641 --75.9578 --75.9578 --75.9641 --75.9656 --75.9625 --75.9578 --75.9516 --75.9688 --75.9516 --75.9594 --75.9531 --75.9656 --75.9516 --75.9594 --75.9625 --75.9578 --75.9656 --75.9547 --75.9594 --75.9547 --75.9531 --75.9641 --75.9703 --75.9531 --75.9578 --75.95 --75.9453 --75.9531 --75.9672 --75.9641 --75.9656 --75.9547 --75.9609 --75.9609 --75.9672 --75.9609 --75.9594 --75.95 --75.9625 --75.9766 --75.9703 --75.9563 --75.9578 --75.95 --75.9578 --75.9531 --75.9719 --75.9656 --75.9547 --75.9656 --75.9625 --75.9516 --75.9578 --75.9594 --75.9719 --75.9703 --75.9594 --75.9609 --75.9609 --75.9625 --75.9578 --75.9563 --75.9547 --75.9625 --75.9625 --75.9703 --75.9609 --75.9641 --75.9625 --75.9656 --75.95 --75.9656 --75.9563 --75.9609 --75.9609 --75.9625 --75.9594 --75.9531 --75.9547 --75.9484 --75.9406 --75.9641 --75.9453 --75.9516 --75.9672 --75.9578 --75.9609 --75.9406 --75.95 --75.9406 --75.95 --75.9594 --75.9422 --75.9422 --75.9609 --75.9453 --75.9547 --75.9453 --75.95 --75.9469 --75.9437 --75.9469 --75.9406 --75.9547 --75.9406 --75.9594 --75.9375 --75.9453 --75.9469 --75.9516 --75.9469 --75.9453 --75.9531 --75.9422 --75.9422 --75.9656 --75.9563 --75.9594 --75.9578 --75.9563 --75.9484 --75.9531 --75.9563 --75.9516 --75.9547 --75.9578 --75.9625 --75.95 --75.9437 --75.9672 --75.9547 --75.95 --75.9531 --75.9563 --75.9547 --75.9531 --75.9578 --75.9563 --75.9453 --75.9578 --75.9719 --75.9516 --75.9656 --75.9531 --75.9516 --75.9531 --75.9828 --75.9656 --75.9641 --75.9891 --75.9656 --75.9516 --75.9656 --75.9484 --75.9672 --75.9609 --75.9641 --75.9563 --75.9609 --75.9672 --75.9547 --75.9531 --75.9656 --75.9516 --75.9484 --75.9609 --75.9547 --75.9563 --75.95 --75.9609 --75.9656 --75.9531 --75.9547 --75.9625 --75.9563 --75.9563 --75.95 --75.9563 --75.9469 --75.9578 --75.9453 --75.9453 --75.9531 --75.9437 --75.9531 --75.9391 --75.9563 --75.9406 --75.9531 --75.9406 --75.9516 --75.9375 --75.9578 --75.9563 --75.9484 --75.9547 --75.9422 --75.9469 --75.9609 --75.95 --75.9516 --75.95 --75.9531 --75.9563 --75.9437 --75.9391 --75.9531 --75.9563 --75.95 --75.95 --75.9656 --75.9563 --75.9437 --75.9547 --75.9641 --75.9594 --75.95 --75.9547 --75.9672 --75.9578 --75.9422 --75.9703 --75.9656 --75.9563 --75.9656 --75.9594 --75.9688 --75.9516 --75.9719 --75.9563 --75.9516 --75.9719 --75.9734 --75.9609 --75.9672 --75.9656 --75.9766 --75.9672 --75.9578 --75.9547 --75.9625 --75.9594 --75.9609 --75.9828 --75.9703 --75.9781 --75.9719 --75.9625 --75.9734 --75.9797 --75.9844 --75.9656 --75.9656 --75.95 --75.9688 --75.9563 --75.9812 --75.9656 --75.9625 --75.9578 --75.9703 --75.9625 --75.9516 --75.9578 --75.9469 --75.9563 --75.9531 --75.9641 --75.9563 --75.9609 --75.9656 --75.9703 --75.9656 --75.9656 --75.9609 --75.9641 --75.9594 --75.9547 --75.9625 --75.9797 --75.9734 --75.9625 --75.9609 --75.9719 --75.9594 --75.9672 --75.9672 --75.975 --75.9703 --75.9719 --75.9734 --75.9703 --75.9797 --75.9656 --75.9563 --75.9641 --75.9656 --75.9719 --75.9609 --75.9641 --75.9625 --75.9516 --75.9641 --75.9688 --75.9625 --75.9703 --75.9437 --75.9563 --75.9453 --75.975 --75.9609 --75.9672 --75.9672 --75.9656 --75.9625 --75.9703 --75.9672 --75.9688 --75.9781 --75.9531 --75.9641 --75.9609 --75.9688 --75.9719 --75.9625 --75.9563 --75.9672 --75.9656 --75.9641 --75.9437 --75.9797 --75.9484 --75.9625 --75.9469 --75.9656 --75.9656 --75.9688 --75.9781 --75.9703 --75.9688 --75.9563 --75.9672 --75.9672 --75.9672 --75.9656 --75.9625 --75.9641 --75.9625 --75.95 --75.9594 --75.9719 --75.9656 --75.9594 --75.9688 --75.9641 --75.9719 --75.9547 --75.9672 --75.9563 --75.9594 --75.9688 --75.9516 --75.9578 --75.9766 --75.9594 --75.9672 --75.9703 --75.9719 --75.9781 --75.9625 --75.9641 --75.9688 --75.9531 --75.95 --75.9625 --75.9437 --75.9703 --75.95 --75.9578 --75.9484 --75.95 --75.9609 --75.9563 --75.9453 --75.9563 --75.9469 --75.9609 --75.9453 --75.9547 --75.9516 --75.9594 --75.9391 --75.9594 --75.9563 --75.9609 --75.9563 --75.9656 --75.9625 --75.9516 --75.9719 --75.9563 --75.9531 --75.9578 --75.9609 --75.9563 --75.9563 --75.9609 --75.9703 --75.9516 --75.9531 --75.9625 --75.9516 --75.9688 --75.9609 --75.9656 --75.9625 --75.9594 --75.9531 --75.9563 --75.9563 --75.9641 --75.9578 --75.9625 --75.9531 --75.9531 --75.95 --75.9594 --75.9625 --75.9578 --75.9609 --75.9547 --75.9672 --75.9437 --75.9625 --75.9531 --75.95 --75.9609 --75.9453 --75.9625 --75.9453 --75.9625 --75.95 --75.9594 --75.9609 --75.9641 --75.9578 --75.9703 --75.9719 --75.9688 --75.9688 --75.9609 --75.9609 --75.9578 --75.9578 --75.9547 --75.9672 --75.9609 --75.9656 --75.9625 --75.9734 --75.9703 --75.9563 --75.9609 --75.9437 --75.9531 --75.95 --75.9391 --75.9422 --75.95 --75.9422 --75.9484 --75.9516 --75.9641 --75.9609 --75.9547 --75.9437 --75.9516 --75.9594 --75.9734 --75.9437 --75.9484 --75.95 --75.9547 --75.9484 --75.9719 --75.9547 --75.9734 --75.9594 --75.9578 --75.9531 --75.9609 --75.9594 --75.9688 --75.9609 --75.9641 --75.9688 --75.9625 --75.9641 --75.9625 --75.9734 --75.9609 --75.9516 --75.9641 --75.9609 --75.9531 --75.9563 --75.9609 --75.9609 --75.9609 --75.9516 --75.9563 --75.9531 --75.9594 --75.9625 --75.9672 --75.9516 --75.9516 --75.9656 --75.9703 --75.9703 --75.975 --75.9703 --75.9578 --75.9719 --75.9688 --75.9625 --75.9516 --75.9563 --75.95 --75.9516 --75.9531 --75.9469 --75.9469 --75.9594 --75.9609 --75.9563 --75.9563 --75.9656 --75.9703 --75.9469 --75.9625 --75.9484 --75.9578 --75.9406 --75.9609 --75.9547 --75.9625 --75.9563 --75.9547 --75.9516 --75.9594 --75.9516 --75.9703 --75.9688 --75.9609 --75.9609 --75.9563 --75.9531 --75.9453 --75.9484 --75.9625 --75.9406 --75.9469 --75.9453 --75.9375 --75.9609 --75.9469 --75.9437 --75.95 --75.9547 --75.9516 --75.9484 --75.95 --75.9516 --75.9547 --75.9563 --75.9781 --75.9547 --75.95 --75.9719 --75.9547 --75.9516 --75.9547 --75.9609 --75.95 --75.9641 --75.9469 --75.95 --75.9609 --75.9594 --75.9469 --75.9641 --75.9469 --75.9578 --75.9609 --75.9563 --75.9422 --75.9594 --75.95 --75.9594 --75.9688 --75.9563 --75.9578 --75.9641 --75.9609 --75.9734 --75.9563 --75.9609 --75.9516 --75.95 --75.9531 --75.9437 --75.9625 --75.9547 --75.9437 --75.9516 --75.9531 --75.9609 --75.9516 --75.9594 --75.9594 --75.9531 --75.9578 --75.9547 --75.9578 --75.9734 --75.9609 --75.9766 --75.9672 --75.9609 --75.9594 --75.9594 --75.95 --75.9578 --75.9672 --75.9578 --75.9594 --75.9563 --75.9672 --75.9641 --75.9563 --75.9703 --75.9625 --75.9563 --75.9563 --75.9719 --75.9625 --75.9625 --75.9656 --75.9625 --75.9641 --75.9516 --75.9641 --75.9563 --75.9469 --75.9656 --75.9547 --75.9578 --75.9594 --75.95 --75.9578 --75.9641 --75.9453 --75.9484 --75.9531 --75.9578 --75.9422 --75.95 --75.9672 --75.9547 --75.9656 --75.9609 --75.9609 --75.9437 --75.9578 --75.9563 --75.9531 --75.9594 --75.9625 --75.9594 --75.9469 --75.9531 --75.9516 --75.9422 --75.9547 --75.9594 --75.9453 --75.95 --75.9563 --75.9625 --75.9516 --75.9578 --75.9531 --75.9437 --75.9594 --75.9641 --75.9531 --75.9516 --75.9484 --75.9641 --75.9547 --75.9578 --75.9594 --75.9672 --75.9641 --75.9609 --75.9531 --75.9688 --75.9547 --75.9656 --75.9625 --75.9719 --75.9688 --75.9531 --75.9547 --75.9484 --75.9656 --75.9531 --75.9672 --75.9531 --75.9719 --75.9531 --75.9469 --75.9437 --75.9578 --75.9484 --75.9406 --75.9453 --75.9531 --75.9578 --75.9531 --75.9484 --75.9406 --75.9578 --75.9594 --75.9422 --75.9516 --75.9469 --75.9531 --75.9453 --75.9531 --75.9531 --75.9656 --75.9594 --75.9703 --75.9625 --75.9563 --75.9609 --75.9734 --75.9531 --75.9672 --75.9578 --75.9594 --75.9531 --75.9406 --75.9625 --75.9688 --75.9625 --75.9656 --75.9656 --75.9516 --75.9625 --75.9641 --75.9609 --75.9563 --75.9578 --75.9609 --75.9531 --75.9563 --75.9516 --75.9703 --75.95 --75.9609 --75.9594 --75.9578 --75.9563 --75.9516 --75.9484 --75.9625 --75.9563 --75.95 --75.9609 --75.9641 --75.9578 --75.9656 --75.9578 --75.9547 --75.9547 --75.9578 --75.9516 --75.9656 --75.95 --75.9688 --75.9688 --75.9594 --75.9625 --75.9609 --75.9625 --75.9484 --75.9516 --75.9563 --75.9563 --75.9656 --75.9484 --75.9516 --75.9641 --75.9688 --75.9563 --75.9594 --75.9609 --75.9641 --75.9609 --75.9625 --75.9703 --75.9641 --75.9844 --75.9625 --75.975 --75.9594 --75.9734 --75.9766 --75.9719 --75.9734 --75.9672 --75.975 --75.9781 --75.9719 --75.9641 --75.9656 --75.9547 --75.9609 --75.9656 --75.9547 --75.9656 --75.9563 --75.9641 --75.9594 --75.9719 --75.9563 --75.9734 --75.9703 --75.9688 --75.9656 --75.9688 --75.9719 --75.9828 --75.9719 --75.95 --75.9688 --75.9656 --75.9547 --75.9703 --75.9609 --75.9656 --75.9578 --75.9453 --75.9656 --75.9469 --75.9422 --75.9547 --75.9625 --75.9563 --75.9609 --75.9563 --75.9734 --75.9563 --75.9594 --75.9625 --75.9641 --75.9641 --75.9703 --75.9703 --75.9484 --75.9578 --75.9656 --75.9609 --75.9609 --75.9484 --75.9656 --75.9531 --75.9531 --75.9672 --75.9609 --75.9547 --75.9547 --75.9469 --75.9453 --75.95 --75.9531 --75.9578 --75.9453 --75.95 --75.9531 --75.9375 --75.9406 --75.9437 --75.9375 --75.95 --75.9437 --75.9531 --75.9484 --75.9375 --75.9391 --75.9453 --75.9313 --75.9641 --75.9547 --75.9672 --75.9609 --75.9641 --75.9469 --75.9469 --75.9469 --75.9516 --75.9422 --75.9391 --75.9563 --75.9516 --75.9359 --75.9469 --75.9516 --75.9406 --75.95 --75.9422 --75.9422 --75.9453 --75.9594 --75.9484 --75.9469 --75.9391 --75.9453 --75.9297 --75.9422 --75.9422 --75.9531 --75.9391 --75.9469 --75.95 --75.9422 --75.9344 --75.9375 --75.9453 --75.9297 --75.9406 --75.9453 --75.9406 --75.9531 --75.9531 --75.9406 --75.9406 --75.9375 --75.9406 --75.9484 --75.9391 --75.9469 --75.95 --75.95 --75.9453 --75.9453 --75.9313 --75.9437 --75.9469 --75.9422 --75.9422 --75.9422 --75.9375 --75.9437 --75.9281 --75.9469 --75.9531 --75.95 --75.9609 --75.9563 --75.9625 --75.9484 --75.9547 --75.9469 --75.9453 --75.9406 --75.95 --75.9469 --75.9422 --75.9563 --75.9578 --75.9437 --75.9563 --75.9406 --75.9547 --75.9469 --75.95 --75.9563 --75.9563 --75.9437 --75.9594 --75.9484 --75.95 --75.9656 --75.95 --75.9563 --75.9563 --75.9547 --75.9563 --75.9406 --75.9563 --75.9641 --75.9375 --75.9453 --75.9641 --75.9688 --75.9547 --75.9484 --75.9578 --75.9547 --75.9375 --75.9563 --75.9422 --75.95 --75.9453 --75.9578 --75.9625 --75.9422 --75.9391 --75.9641 --75.9516 --75.9578 --75.9484 --75.9656 --75.9469 --75.95 --75.95 --75.9625 --75.9547 --75.9688 --75.9578 --75.9641 --75.9578 --75.9563 --75.9406 --75.9563 --75.9531 --75.9484 --75.9672 --75.9531 --75.95 --75.9766 --75.9703 --75.9547 --75.9531 --75.9563 --75.9391 --75.9563 --75.9375 --75.9375 --75.9391 --75.9578 --75.9437 --75.9328 --75.9406 --75.9437 --75.9531 --75.9437 --75.9625 --75.9359 --75.9469 --75.9281 --75.9391 --75.9391 --75.9391 --75.9391 --75.9281 --75.9453 --75.9469 --75.9516 --75.9516 --75.9406 --75.9422 --75.9578 --75.9531 --75.95 --75.9484 --75.9531 --75.9422 --75.9484 --75.9625 --75.9469 --75.9531 --75.9484 --75.95 --75.9531 --75.9625 --75.9563 --75.9469 --75.9578 --75.9609 --75.9594 --75.9578 --75.9453 --75.9547 --75.9594 --75.9531 --75.9547 --75.9594 --75.9703 --75.9578 --75.9563 --75.9594 --75.9563 --75.9547 --75.9578 --75.9531 --75.9469 --75.9484 --75.9484 --75.9453 --75.9625 --75.9594 --75.9531 --75.9578 --75.9547 --75.9406 --75.9609 --75.9531 --75.9688 --75.9547 --75.9484 --75.9406 --75.9609 --75.9625 --75.9547 --75.95 --75.9406 --75.9453 --75.95 --75.9625 --75.9453 --75.95 --75.9531 --75.9516 --75.9688 --75.9641 --75.9625 --75.9641 --75.9563 --75.9547 --75.9703 --75.9688 --75.9641 --75.9656 --75.9547 --75.9766 --75.9734 --75.9656 --75.9812 --75.9641 --75.9594 --75.9734 --75.9594 --75.9641 --75.9656 --75.9547 --75.9594 --75.9531 --75.9688 --75.9625 --75.9719 --75.9641 --75.9547 --75.95 --75.9656 --75.9594 --75.9594 --75.9578 --75.9641 --75.9641 --75.9578 --75.9469 --75.9547 --75.9547 --75.9484 --75.9547 --75.9469 --75.9594 --75.9516 --75.9641 --75.9781 --75.9719 --75.9578 --75.9656 --75.9594 --75.9656 --75.9563 --75.9531 --75.9703 --75.9719 --75.9547 --75.9672 --75.9578 --75.9531 --75.9594 --75.9375 --75.9625 --75.9437 --75.9578 --75.9609 --75.95 --75.9531 --75.95 --75.9531 --75.9344 --75.9531 --75.9469 --75.9547 --75.9578 --75.9422 --75.9563 --75.9563 --75.9547 --75.9563 --75.9531 --75.9484 --75.9688 --75.9516 --75.9563 --75.9531 --75.9688 --75.9609 --75.9484 --75.9531 --75.975 --75.9531 --75.9547 --75.95 --75.9516 --75.9563 --75.9484 --75.9422 --75.9547 --75.9531 --75.9594 --75.9422 --75.9609 --75.9437 --75.9422 --75.9469 --75.9391 --75.95 --75.9422 --75.9516 --75.9625 --75.9422 --75.9453 --75.9516 --75.9625 --75.9422 --75.9437 --75.9594 --75.9563 --75.9641 --75.9563 --75.9422 --75.9547 --75.9437 --75.95 --75.9609 --75.9594 --75.9531 --75.9547 --75.9406 --75.9531 --75.95 --75.9609 --75.9437 --75.9437 --75.9516 --75.9484 --75.9484 --75.9516 --75.9547 --75.9516 --75.9547 --75.9391 --75.9422 --75.9391 --75.9391 --75.9563 --75.9469 --75.9547 --75.9375 --75.9437 --75.95 --75.9313 --75.9547 --75.95 --75.9437 --75.9328 --75.9469 --75.9469 --75.95 --75.9422 --75.9453 --75.9516 --75.9578 --75.9594 --75.9547 --75.9578 --75.9437 --75.9594 --75.9531 --75.9578 --75.9469 --75.9437 --75.9437 --75.9594 --75.9469 --75.9516 --75.9531 --75.9484 --75.9391 --75.9516 --75.9609 --75.9484 --75.9547 --75.9406 --75.9531 --75.9547 --75.9453 --75.9516 --75.9328 --75.9563 --75.9406 --75.9422 --75.9547 --75.9531 --75.9578 --75.9578 --75.9437 --75.9437 --75.95 --75.9563 --75.9469 --75.9437 --75.9391 --75.9547 --75.9594 --75.9656 --75.9453 --75.9437 --75.9484 --75.9516 --75.9453 --75.9484 --75.9516 --75.9359 --75.9484 --75.9422 --75.9359 --75.9484 --75.9453 --75.9375 --75.9297 --75.9422 --75.9313 --75.9406 --75.9437 --75.9391 --75.9375 --75.9375 --75.95 --75.9547 --75.9547 --75.9563 --75.9469 --75.95 --75.9453 --75.9391 --75.9406 --75.9469 --75.9484 --75.9484 --75.9516 --75.9422 --75.9406 --75.9422 --75.9422 --75.9453 --75.9453 --75.9313 --75.9281 --75.9484 --75.9422 --75.9422 --75.9375 --75.9375 --75.9516 --75.9391 --75.9281 --75.9391 --75.9344 --75.9375 --75.9391 --75.9406 --75.9453 --75.9406 --75.9328 --75.9375 --75.9375 --75.9281 --75.9406 --75.9359 --75.9531 --75.95 --75.9547 --75.9406 --75.9406 --75.9422 --75.9297 --75.9453 --75.9313 --75.9344 --75.9422 --75.9469 --75.9391 --75.9484 --75.9391 --75.9359 --75.9437 --75.9344 --75.95 --75.9453 --75.9406 --75.9406 --75.9437 --75.9297 --75.9531 --75.9406 --75.9422 --75.9328 --75.9453 --75.9406 --75.9344 --75.9422 --75.9578 --75.9531 --75.95 --75.9578 --75.9547 --75.9656 --75.9359 --75.9641 --75.9688 --75.9422 --75.9391 --75.9453 --75.9453 --75.9453 --75.9578 --75.9437 --75.9437 --75.9469 --75.9344 --75.9437 --75.9625 --75.9437 --75.9359 --75.95 --75.9406 --75.9453 --75.9594 --75.9437 --75.9516 --75.9516 --75.95 --75.9437 --75.9422 --75.9391 --75.9453 --75.9469 --75.9469 --75.9391 --75.9297 --75.9437 --75.9453 --75.9406 --75.9391 --75.9484 --75.9422 --75.9359 --75.9531 --75.9406 --75.9484 --75.9406 --75.9391 --75.9453 --75.9359 --75.9516 --75.9422 --75.9547 --75.9516 --75.9578 --75.9609 --75.9547 --75.9422 --75.9531 --75.9453 --75.9578 --75.9359 --75.9484 --75.9391 --75.9437 --75.9516 --75.9375 --75.9391 --75.9594 --75.9516 --75.9313 --75.95 --75.9563 --75.9406 --75.9437 --75.9516 --75.9641 --75.9406 --75.9656 --75.9578 --75.9469 --75.9437 --75.9594 --75.9516 --75.9531 --75.9469 --75.9609 --75.9437 --75.9563 --75.9563 --75.9609 --75.9531 --75.9594 --75.9469 --75.9609 --75.9484 --75.9531 --75.9453 --75.9453 --75.9516 --75.9656 --75.9578 --75.9656 --75.9547 --75.9563 --75.95 --75.9375 --75.9563 --75.9375 --75.95 --75.9422 --75.9344 --75.9344 --75.95 --75.9437 --75.9422 --75.9578 --75.9359 --75.9531 --75.9437 --75.9469 --75.9547 --75.9469 --75.9469 --75.9484 --75.9547 --75.9594 --75.95 --75.9531 --75.9516 --75.9344 --75.9531 --75.9375 --75.9547 --75.9469 --75.9437 --75.9359 --75.9453 --75.9469 --75.9437 --75.9359 --75.9281 --75.9344 --75.9469 --75.9484 --75.9344 --75.9391 --75.9359 --75.9391 --75.9391 --75.9547 --75.925 --75.9437 --75.9453 --75.9437 --75.9281 --75.9359 --75.9313 --75.9359 --75.9469 --75.9484 --75.9281 --75.9328 --75.9391 --75.9344 --75.9531 --75.9422 --75.9328 --75.9531 --75.9547 --75.9422 --75.9453 --75.9375 --75.9516 --75.9344 --75.9453 --75.9328 --75.9609 --75.9469 --75.9547 --75.9313 --75.9391 --75.9406 --75.9391 --75.9422 --75.9453 --75.9453 --75.9219 --75.9453 --75.9563 --75.9406 --75.9375 --75.9453 --75.9375 --75.9563 --75.9391 --75.9406 --75.9375 --75.9469 --75.95 --75.9437 --75.9516 --75.9422 --75.9469 --75.9344 --75.9359 --75.9531 --75.9422 --75.9375 --75.9453 --75.9437 --75.9547 --75.9453 --75.9484 --75.9422 --75.9437 --75.9375 --75.9344 --75.9469 --75.9547 --75.9406 --75.9594 --75.9297 --75.9313 --75.9406 --75.9391 --75.9469 --75.9469 --75.9313 --75.9406 --75.9437 --75.9594 --75.9609 --75.9469 --75.9547 --75.9484 --75.9453 --75.9484 --75.9563 --75.9547 --75.9531 --75.9547 --75.9563 --75.9547 --75.9531 --75.9437 --75.9563 --75.9516 --75.9609 --75.9656 --75.9609 --75.9641 --75.9531 --75.9531 --75.9625 --75.9437 --75.9594 --75.9688 --75.95 --75.9688 --75.9453 --75.9484 --75.9625 --75.9422 --75.9437 --75.9516 --75.9516 --75.9453 --75.9469 --75.9437 --75.9469 --75.9609 --75.9531 --75.9547 --75.9547 --75.95 --75.9531 --75.9594 --75.9578 --75.9578 --75.9531 --75.9469 --75.9594 --75.9547 --75.9391 --75.9516 --75.9437 --75.95 --75.9359 --75.9531 --75.9594 --75.9516 --75.9437 --75.9391 --75.9422 --75.9437 --75.9516 --75.9516 --75.95 --75.9688 --75.9578 --75.9531 --75.9703 --75.9641 --75.9609 --75.9578 --75.9594 --75.9469 --75.9563 --75.9625 --75.9469 --75.9469 --75.9641 --75.9422 --75.9625 --75.95 --75.9703 --75.9563 --75.9594 --75.9609 --75.9516 --75.9516 --75.9641 --75.9609 --75.9563 --75.9656 --75.95 --75.9578 --75.9391 --75.9516 --75.9594 --75.9453 --75.95 --75.9547 --75.9406 --75.9703 --75.9625 --75.9453 --75.9609 --75.9578 --75.9609 --75.9531 --75.9625 --75.9547 --75.9531 --75.9625 --75.9531 --75.9625 --75.9484 --75.9781 --75.9531 --75.9625 --75.9688 --75.9656 --75.9563 --75.9531 --75.9703 --75.9547 --75.9563 --75.95 --75.9531 --75.9547 --75.9531 --75.9594 --75.9594 --75.9625 --75.9578 --75.9734 --75.9688 --75.9688 --75.9688 --75.9484 --75.9531 --75.9563 --75.9563 --75.9641 --75.9625 --75.9656 --75.9563 --75.9703 --75.9734 --75.9656 --75.9578 --75.9547 --75.9656 --75.9484 --75.95 --75.9688 --75.9563 --75.9563 --75.9656 --75.9625 --75.9719 --75.9688 --75.95 --75.9609 --75.9594 --75.9625 --75.9516 --75.9734 --75.9516 --75.9641 --75.9641 --75.9484 --75.9781 --75.9672 --75.9672 --75.9719 --75.9656 --75.9563 --75.9703 --75.9484 --75.9594 --75.9563 --75.9578 --75.9594 --75.9812 --75.9609 --75.9719 --75.9641 --75.9672 --75.95 --75.9703 --75.9547 --75.9688 --75.9641 --75.9609 --75.9578 --75.9625 --75.9578 --75.9563 --75.9609 --75.9672 --75.9672 --75.9672 --75.9641 --75.9531 --75.9516 --75.9609 --75.9688 --75.95 --75.9672 --75.9641 --75.9594 --75.9609 --75.9609 --75.9531 --75.9594 --75.9672 --75.9609 --75.9656 --75.9531 --75.9484 --75.9625 --75.95 --75.9578 --75.9625 --75.9781 --75.9547 --75.9578 --75.9641 --75.9547 --75.9516 --75.95 --75.9531 --75.9563 --75.9688 --75.9391 --75.9469 --75.9453 --75.9484 --75.9547 --75.9719 --75.9531 --75.9437 --75.9625 --75.95 --75.9578 --75.9375 --75.9563 --75.9578 --75.9547 --75.9578 --75.9594 --75.9422 --75.9531 --75.9469 --75.9563 --75.9578 --75.9563 --75.9453 --75.9484 --75.9547 --75.9641 --75.9531 --75.9578 --75.9656 --75.9594 --75.9672 --75.9453 --75.9578 --75.95 --75.9656 --75.9641 --75.9531 --75.9625 --75.975 --75.9719 --75.9672 --75.9656 --75.9719 --75.9656 --75.9609 --75.9484 --75.9531 --75.9641 --75.9641 --75.9469 --75.9656 --75.9594 --75.95 --75.9594 --75.9594 --75.9531 --75.9563 --75.9641 --75.9625 --75.9641 --75.9594 --75.9688 --75.9641 --75.9703 --75.9797 --75.9453 --75.9625 --75.9578 --75.9656 --75.9516 --75.9516 --75.9516 --75.9625 --75.9734 --75.9563 --75.9453 --75.9578 --75.9641 --75.9578 --75.95 --75.9578 --75.9594 --75.9578 --75.9609 --75.9672 --75.9547 --75.9641 --75.9625 --75.9594 --75.9547 --75.95 --75.9563 --75.9609 --75.9594 --75.9734 --75.95 --75.9609 --75.9625 --75.9625 --75.9594 --75.9594 --75.9609 --75.9656 --75.9547 --75.9594 --75.9688 --75.9703 --75.9703 --75.9672 --75.9641 --75.9625 --75.9578 --75.9563 --75.9547 --75.9656 --75.9688 --75.9547 --75.9516 --75.9672 --75.975 --75.9656 --75.9547 --75.9578 --75.9547 --75.9563 --75.9641 --75.9609 --75.9625 --75.9531 --75.9594 --75.9781 --75.9578 --75.9609 --75.9531 --75.9594 --75.9719 --75.9594 --75.9609 --75.9641 --75.9531 --75.9688 --75.9594 --75.9594 --75.9578 --75.9531 --75.9672 --75.9563 --75.9578 --75.9703 --75.975 --75.9734 --75.9594 --75.9563 --75.9578 --75.9563 --75.9766 --75.95 --75.9516 --75.9641 --75.9578 --75.9609 --75.9578 --75.9547 --75.9563 --75.9391 --75.9578 --75.9516 --75.9422 --75.9656 --75.9656 --75.9594 --75.9516 --75.9563 --75.9609 --75.9672 --75.9625 --75.9547 --75.9453 --75.9641 --75.9656 --75.9656 --75.9719 --75.9641 --75.9391 --75.9578 --75.9672 --75.9641 --75.9594 --75.9469 --75.9484 --75.9563 --75.9656 --75.9531 --75.9609 --75.9547 --75.9578 --75.9406 --75.95 --75.9609 --75.9656 --75.95 --75.9547 --75.9594 --75.9734 --75.9531 --75.9641 --75.9578 --75.9688 --75.9688 --75.9609 --75.9672 --75.9516 --75.9688 --75.9641 --75.9578 --75.9516 --75.9641 --75.95 --75.95 --75.9688 --75.9625 --75.9484 --75.9594 --75.9563 --75.9656 --75.9609 --75.9563 --75.9625 --75.9672 --75.9469 --75.9547 --75.975 --75.9484 --75.9719 --75.9641 --75.9484 --75.9594 --75.9609 --75.9688 --75.9594 --75.9594 --75.9625 --75.9703 --75.9672 --75.9563 --75.9437 --75.9563 --75.95 --75.9672 --75.9594 --75.9656 --75.9703 --75.9375 --75.9625 --75.9625 --75.9656 --75.9578 --75.9672 --75.9594 --75.9469 --75.9688 --75.9609 --75.9656 --75.9547 --75.9563 --75.9656 --75.9469 --75.9672 --75.9703 --75.9531 --75.9516 --75.95 --75.9641 --75.9578 --75.9563 --75.9734 --75.9563 --75.9594 --75.975 --75.9609 --75.9609 --75.9594 --75.9844 --75.9625 --75.9688 --75.9781 --75.9625 --75.975 --75.9578 --75.9563 --75.9547 --75.9531 --75.9625 --75.9641 --75.9578 --75.9563 --75.9625 --75.9531 --75.9641 --75.9656 --75.9563 --75.9641 --75.9547 --75.9703 --75.9766 --75.9641 --75.9672 --75.9578 --75.9641 --75.9547 --75.9656 --75.9672 --75.9688 --75.9672 --75.9641 --75.9672 --75.9672 --75.9641 --75.9688 --75.9672 --75.9609 --75.9672 --75.9766 --75.9594 --75.9641 --75.9578 --75.9531 --75.9609 --75.9641 --75.9516 --75.9625 --75.9469 --75.9594 --75.9609 --75.9703 --75.9594 --75.9656 --75.9609 --75.9703 --75.9609 --75.9688 --75.9656 --75.975 --75.9703 --75.9641 --75.9734 --75.9641 --75.9672 --75.9563 --75.9609 --75.9656 --75.9625 --75.9531 --75.9594 --75.9578 --75.9625 --75.95 --75.9531 --75.9578 --75.9609 --75.9578 --75.9453 --75.9563 --75.9453 --75.9578 --75.9594 --75.9547 --75.9516 --75.9422 --75.9422 --75.9688 --75.9531 --75.9641 --75.9531 --75.95 --75.9641 --75.9547 --75.9547 --75.9531 --75.9578 --75.9531 --75.9531 --75.9531 --75.9578 --75.9656 --75.9578 --75.9469 --75.9531 --75.9484 --75.9437 --75.9625 --75.9516 --75.9641 --75.9437 --75.9484 --75.95 --75.9625 --75.9422 --75.9563 --75.9594 --75.9547 --75.9594 --75.9641 --75.9469 --75.9531 --75.9641 --75.95 --75.9547 --75.95 --75.9484 --75.9547 --75.9625 --75.9578 --75.9469 --75.9516 --75.9578 --75.9641 --75.95 --75.9531 --75.9484 --75.9516 --75.9563 --75.9391 --75.9469 --75.9563 --75.9484 --75.9437 --75.9516 --75.9484 --75.9359 --75.9469 --75.9313 --75.9547 --75.95 --75.9578 --75.9547 --75.9641 --75.9516 --75.9609 --75.9531 --75.9453 --75.9484 --75.9484 --75.9375 --75.9594 --75.9656 --75.9453 --75.95 --75.9594 --75.9641 --75.9609 --75.9656 --75.9531 --75.9484 --75.9688 --75.9563 --75.9453 --75.9516 --75.9578 --75.9531 --75.9641 --75.9531 --75.9484 --75.9594 --75.9688 --75.9469 --75.9688 --75.9594 --75.9547 --75.9672 --75.9578 --75.9594 --75.9484 --75.9688 --75.9578 --75.9672 --75.9625 --75.9625 --75.9594 --75.95 --75.9484 --75.9625 --75.9641 --75.9594 --75.9484 --75.9703 --75.9641 --75.9594 --75.9734 --75.9719 --75.9766 --75.9688 --75.9609 --75.975 --75.9547 --75.9594 --75.975 --75.9578 --75.9578 --75.9625 --75.975 --75.9672 --75.9578 --75.9672 --75.9766 --75.9594 --75.9625 --75.9672 --75.9781 --75.9734 --75.9781 --75.9703 --75.9734 --75.9578 --75.9703 --75.9688 --75.9688 --75.9688 --75.9703 --75.9641 --75.9734 --75.9812 --75.9703 --75.9594 --75.9641 --75.9656 --75.9641 --75.9641 --75.9766 --75.9609 --75.9688 --75.9625 --75.9469 --75.9641 --75.9641 --75.9688 --75.9734 --75.9703 --75.9656 --75.9625 --75.9594 --75.9688 --75.9734 --75.9812 --75.9609 --75.9766 --75.9609 --75.9656 --75.9641 --75.9828 --75.9688 --75.9734 --75.9531 --75.9875 --75.9719 --75.9828 --75.9594 --75.9688 --75.9703 --75.9828 --75.9906 --75.9734 --75.9719 --75.9641 --75.9781 --75.9641 --75.9797 --75.9703 --75.9828 --75.9703 --75.9766 --75.9781 --75.975 --75.9812 --75.9578 --75.9688 --75.9828 --75.9656 --75.9656 --75.9797 --75.9781 --75.9563 --75.9531 --75.9688 --75.9641 --75.9672 --75.9797 --75.9688 --75.9656 --75.9609 --75.9594 --75.9656 --75.9641 --75.9578 --75.9516 --75.9672 --75.9688 --75.95 --75.9688 --75.9594 --75.9656 --75.9641 --75.9672 --75.9688 --75.9641 --75.9719 --75.9594 --75.9719 --75.9734 --75.9625 --75.9844 --75.9688 --75.9719 --75.9641 --75.9688 --75.9703 --75.9734 --75.9641 --75.9672 --75.975 --75.9703 --75.9453 --75.9578 --75.9719 --75.9641 --75.9734 --75.9828 --75.9734 --75.9766 --75.975 --75.9703 --75.9828 --75.9594 --75.9734 --75.9688 --75.9766 --75.9641 --75.9703 --75.9625 --75.9656 --75.9734 --75.9688 --75.9828 --75.9781 --75.9703 --75.9766 --75.9672 --75.9812 --75.975 --75.9688 --75.9641 --75.9688 --75.9734 --75.9594 --75.9781 --75.9844 --75.9781 --75.9891 --75.975 --75.9719 --75.9578 --75.9812 --75.9688 --75.9703 --75.9688 --75.9734 --75.9578 --75.9703 --75.9766 --75.9641 --75.9656 --75.9625 --75.9531 --75.9578 --75.9594 --75.9672 --75.9703 --75.9594 --75.9703 --75.9719 --75.9609 --75.9734 --75.9781 --75.9859 --75.9797 --75.9812 --75.9688 --75.9703 --75.9781 --75.9578 --75.9828 --75.9828 --75.9781 --75.9734 --75.9938 --75.9641 --75.9641 --75.975 --75.9766 --75.9719 --75.9812 --75.9625 --75.9656 --75.9734 --75.9719 --75.9719 --75.9719 --75.9812 --75.9797 --75.9812 --75.9656 --75.975 --75.9734 --75.9719 --75.9688 --75.9734 --75.9609 --75.9578 --75.9641 --75.975 --75.9609 --75.9781 --75.9781 --75.9875 --75.9781 --75.9703 --75.9516 --75.9656 --75.9656 --75.9578 --75.9688 --75.9734 --75.9766 --75.9656 --75.9594 --75.975 --75.9766 --75.9656 --75.9703 --75.9625 --75.9688 --75.9609 --75.9688 --75.975 --75.9594 --75.9547 --75.9578 --75.9609 --75.9688 --75.9781 --75.9594 --75.9594 --75.9656 --75.9609 --75.9625 --75.9656 --75.9656 --75.9656 --75.9641 --75.975 --75.9672 --75.9672 --75.9656 --75.9656 --75.9625 --75.9625 --75.9812 --75.975 --75.9781 --75.9703 --75.975 --75.9719 --75.9578 --75.9906 --75.9812 --75.975 --75.9594 --75.9797 --75.9672 --75.9672 --75.9625 --75.9672 --75.9859 --75.9672 --75.9828 --75.9563 --75.9734 --75.9719 --75.9609 --75.9703 --75.9688 --75.975 --75.9781 --75.9719 --75.975 --75.9828 --75.9797 --75.9766 --75.9953 --75.9859 --75.9828 --75.9859 --75.9734 --75.9719 --75.9734 --75.9766 --75.9828 --75.9703 --75.9656 --75.9734 --75.9734 --75.9781 --75.975 --75.9797 --75.9766 --75.9656 --75.9641 --75.9844 --75.9688 --75.9688 --75.9703 --75.9688 --75.9609 --75.9766 --75.9766 --75.9719 --75.9797 --75.9688 --75.9594 --75.9812 --75.9766 --75.9828 --75.975 --75.9703 --75.9844 --75.9672 --75.9953 --75.975 --75.9828 --75.9719 --75.9719 --75.9703 --75.9672 --75.975 --75.9781 --75.9844 --75.9828 --75.975 --75.9578 --75.9656 --75.9734 --75.975 --75.9578 --75.9812 --75.9703 --75.9719 --75.9703 --75.9719 --75.9609 --75.9656 --75.9672 --75.9891 --75.9719 --75.9875 --75.9688 --75.9703 --75.9641 --75.9578 --75.9688 --75.9688 --75.9703 --75.9734 --75.9766 --75.9703 --75.975 --75.9734 --75.9688 --75.9797 --75.9594 --75.9641 --75.975 --75.9656 --75.9844 --75.9672 --75.9641 --75.9656 --75.9609 --75.9609 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9547 --75.9672 --75.9641 --75.9734 --75.9625 --75.9734 --75.9703 --75.975 --75.9922 --75.9672 --75.9625 --75.9812 --75.9703 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.975 --75.9766 --75.9906 --75.975 --75.9719 --75.9859 --75.9594 --75.9719 --75.9547 --75.9719 --75.9703 --75.9703 --75.9594 --75.9688 --75.9641 --75.9594 --75.9844 --75.9547 --75.9688 --75.975 --75.9719 --75.9609 --75.9703 --75.9688 --75.9578 --75.9641 --75.9594 --75.9578 --75.975 --75.9656 --75.9688 --75.9625 --75.9531 --75.9563 --75.9641 --75.9594 --75.9641 --75.9609 --75.9578 --75.9719 --75.9547 --75.9563 --75.9703 --75.9672 --75.9578 --75.9734 --75.9734 --75.9594 --75.9656 --75.9578 --75.9516 --75.9578 --75.9563 --75.9563 --75.9609 --75.9516 --75.9688 --75.9422 --75.9516 --75.9688 --75.9656 --75.9641 --75.9547 --75.9531 --75.9734 --75.9578 --75.9469 --75.9625 --75.9594 --75.9375 --75.9594 --75.9641 --75.9625 --75.9531 --75.9422 --75.95 --75.95 --75.9578 --75.9547 --75.9609 --75.9484 --75.9484 --75.9547 --75.9469 --75.9641 --75.9563 --75.9328 --75.9547 --75.95 --75.9578 --75.9563 --75.9531 --75.9563 --75.9359 --75.9594 --75.95 --75.9609 --75.9531 --75.9594 --75.9547 --75.9656 --75.9594 --75.9578 --75.9516 --75.9516 --75.9484 --75.9516 --75.9563 --75.9547 --75.9531 --75.9453 --75.9531 --75.9688 --75.9516 --75.9594 --75.9516 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9609 --75.9703 --75.9734 --75.9609 --75.9672 --75.9531 --75.9625 --75.9625 --75.9563 --75.9734 --75.9656 --75.9641 --75.9578 --75.9656 --75.9563 --75.9656 --75.9672 --75.9625 --75.9688 --75.9594 --75.9641 --75.9688 --75.9656 --75.9625 --75.9812 --75.9594 --75.9672 --75.9656 --75.9547 --75.9563 --75.9594 --75.9703 --75.9641 --75.9688 --75.9531 --75.95 --75.9594 --75.9469 --75.9547 --75.9563 --75.9609 --75.9672 --75.9563 --75.9578 --75.9547 --75.9609 --75.9469 --75.9594 --75.9594 --75.9484 --75.9625 --75.9641 --75.9547 --75.9531 --75.9484 --75.9547 --75.9484 --75.9422 --75.9594 --75.9516 --75.9609 --75.9672 --75.9672 --75.9609 --75.9516 --75.9594 --75.9781 --75.9563 --75.9688 --75.9703 --75.9625 --75.9563 --75.9437 --75.9578 --75.9547 --75.9609 --75.9688 --75.9609 --75.9594 --75.9609 --75.9547 --75.9719 --75.9656 --75.9578 --75.9688 --75.975 --75.9594 --75.9609 --75.9609 --75.9563 --75.9656 --75.9563 --75.9563 --75.9719 --75.9578 --75.9609 --75.9625 --75.9578 --75.9563 --75.9578 --75.9563 --75.95 --75.9594 --75.9594 --75.9594 --75.975 --75.9641 --75.9703 --75.9578 --75.9594 --75.9734 --75.9656 --75.9516 --75.9766 --75.9656 --75.9656 --75.9594 --75.9688 --75.9656 --75.9609 --75.9766 --75.9656 --75.9734 --75.9516 --75.9609 --75.9547 --75.9453 --75.9672 --75.9625 --75.9594 --75.9609 --75.9656 --75.9609 --75.9656 --75.9656 --75.9578 --75.9625 --75.9453 --75.9531 --75.9719 --75.9734 --75.9656 --75.9516 --75.9609 --75.9688 --75.9594 --75.9719 --75.9641 --75.9641 --75.9531 --75.95 --75.9437 --75.9437 --75.9594 --75.9516 --75.9359 --75.9609 --75.9469 --75.9453 --75.9391 --75.9437 --75.9531 --75.9531 --75.9563 --75.9547 --75.9547 --75.9719 --75.9672 --75.9641 --75.9609 --75.9766 --75.9484 --75.9563 --75.9594 --75.9547 --75.9578 --75.9609 --75.9516 --75.9547 --75.9594 --75.9578 --75.9656 --75.9516 --75.9531 --75.9422 --75.9516 --75.9453 --75.95 --75.9625 --75.95 --75.9531 --75.9641 --75.9703 --75.9594 --75.9531 --75.9563 --75.9594 --75.9516 --75.9719 --75.9672 --75.9531 --75.9703 --75.9547 --75.9641 --75.9688 --75.9547 --75.9547 --75.9625 --75.9641 --75.9656 --75.9609 --75.95 --75.9547 --75.9531 --75.9531 --75.9547 --75.9609 --75.9641 --75.9594 --75.9594 --75.9547 --75.9469 --75.9625 --75.9734 --75.9609 --75.9516 --75.975 --75.9672 --75.9594 --75.9609 --75.9609 --75.95 --75.9609 --75.9766 --75.9609 --75.9563 --75.95 --75.9625 --75.9641 --75.9656 --75.9516 --75.9594 --75.9594 --75.9563 --75.9641 --75.9672 --75.9609 - -2 -4.0025 -100.002 - -0 -1 - -0 diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.ft1 b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.ft1 deleted file mode 100644 index 711312a489..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf2.ses.ft1 +++ /dev/null @@ -1,13 +0,0 @@ -ParmFitness: Unnamed multiple run protocol - FitnessGenerator: iclamp_up - RunStatement: 2, IClamp[0].amp = 0.2 - RegionFitness: soma.v(0.5) - - FitnessGenerator: iclamp_down - RunStatement: 2, IClamp[0].amp = -0.2 - RegionFitness: soma.v(0.5) - - Parameters: - "Cm", 1, 1e-09, 1e+09, 1, 1 - "Rm", 10000, 1e-09, 1e+09, 1, 1 -End ParmFitness diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses deleted file mode 100644 index 69e4f1f300..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses +++ /dev/null @@ -1,36 +0,0 @@ -objectvar save_window_, rvp_ -objectvar scene_vector_[7] -objectvar ocbox_, ocbox_list_, scene_, scene_list_ -{ocbox_list_ = new List() scene_list_ = new List()} - -//Begin MulRunFitter[0] -{ -load_file("mulfit.hoc", "MulRunFitter") -} -{ -ocbox_ = new MulRunFitter(1) -} -{object_push(ocbox_)} -{ -version(6) -ranfac = 2 -fspec = new File("mrf3.ses.ft1") -fdat = new File("mrf3.ses.fd1") -read_data() -build() -} -opt.set_optimizer("MulfitPraxWrap") -{object_push(opt.optimizer)} -{ -nstep = 0 -} -{object_pop()} -{object_pop()} -{ -ocbox_.map("MulRunFitter[0]", 729, 164, 360.96, 199.68) -} -objref ocbox_ -//End MulRunFitter[0] - -objectvar scene_vector_[1] -{doNotify()} diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.fd1 b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.fd1 deleted file mode 100644 index 87faaf872e..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.fd1 +++ /dev/null @@ -1,162026 +0,0 @@ -RegionFitness xdat ydat boundary weight (lines=81008) 1 -|| -40500 -0 -0.005 -0.01 -0.015 -0.02 -0.025 -0.03 -0.035 -0.04 -0.045 -0.05 -0.055 -0.06 -0.065 -0.07 -0.075 -0.08 -0.085 -0.09 -0.095 -0.1 -0.105 -0.11 -0.115 -0.12 -0.125 -0.13 -0.135 -0.14 -0.145 -0.15 -0.155 -0.16 -0.165 -0.17 -0.175 -0.18 -0.185 -0.19 -0.195 -0.2 -0.205 -0.21 -0.215 -0.22 -0.225 -0.23 -0.235 -0.24 -0.245 -0.25 -0.255 -0.26 -0.265 -0.27 -0.275 -0.28 -0.285 -0.29 -0.295 -0.3 -0.305 -0.31 -0.315 -0.32 -0.325 -0.33 -0.335 -0.34 -0.345 -0.35 -0.355 -0.36 -0.365 -0.37 -0.375 -0.38 -0.385 -0.39 -0.395 -0.4 -0.405 -0.41 -0.415 -0.42 -0.425 -0.43 -0.435 -0.44 -0.445 -0.45 -0.455 -0.46 -0.465 -0.47 -0.475 -0.48 -0.485 -0.49 -0.495 -0.5 -0.505 -0.51 -0.515 -0.52 -0.525 -0.53 -0.535 -0.54 -0.545 -0.55 -0.555 -0.56 -0.565 -0.57 -0.575 -0.58 -0.585 -0.59 -0.595 -0.6 -0.605 -0.61 -0.615 -0.62 -0.625 -0.63 -0.635 -0.64 -0.645 -0.65 -0.655 -0.66 -0.665 -0.67 -0.675 -0.68 -0.685 -0.69 -0.695 -0.7 -0.705 -0.71 -0.715 -0.72 -0.725 -0.73 -0.735 -0.74 -0.745 -0.75 -0.755 -0.76 -0.765 -0.77 -0.775 -0.78 -0.785 -0.79 -0.795 -0.8 -0.805 -0.81 -0.815 -0.82 -0.825 -0.83 -0.835 -0.84 -0.845 -0.85 -0.855 -0.86 -0.865 -0.87 -0.875 -0.88 -0.885 -0.89 -0.895 -0.9 -0.905 -0.91 -0.915 -0.92 -0.925 -0.93 -0.935 -0.94 -0.945 -0.95 -0.955 -0.96 -0.965 -0.97 -0.975 -0.98 -0.985 -0.99 -0.995 -1 -1.005 -1.01 -1.015 -1.02 -1.025 -1.03 -1.035 -1.04 -1.045 -1.05 -1.055 -1.06 -1.065 -1.07 -1.075 -1.08 -1.085 -1.09 -1.095 -1.1 -1.105 -1.11 -1.115 -1.12 -1.125 -1.13 -1.135 -1.14 -1.145 -1.15 -1.155 -1.16 -1.165 -1.17 -1.175 -1.18 -1.185 -1.19 -1.195 -1.2 -1.205 -1.21 -1.215 -1.22 -1.225 -1.23 -1.235 -1.24 -1.245 -1.25 -1.255 -1.26 -1.265 -1.27 -1.275 -1.28 -1.285 -1.29 -1.295 -1.3 -1.305 -1.31 -1.315 -1.32 -1.325 -1.33 -1.335 -1.34 -1.345 -1.35 -1.355 -1.36 -1.365 -1.37 -1.375 -1.38 -1.385 -1.39 -1.395 -1.4 -1.405 -1.41 -1.415 -1.42 -1.425 -1.43 -1.435 -1.44 -1.445 -1.45 -1.455 -1.46 -1.465 -1.47 -1.475 -1.48 -1.485 -1.49 -1.495 -1.5 -1.505 -1.51 -1.515 -1.52 -1.525 -1.53 -1.535 -1.54 -1.545 -1.55 -1.555 -1.56 -1.565 -1.57 -1.575 -1.58 -1.585 -1.59 -1.595 -1.6 -1.605 -1.61 -1.615 -1.62 -1.625 -1.63 -1.635 -1.64 -1.645 -1.65 -1.655 -1.66 -1.665 -1.67 -1.675 -1.68 -1.685 -1.69 -1.695 -1.7 -1.705 -1.71 -1.715 -1.72 -1.725 -1.73 -1.735 -1.74 -1.745 -1.75 -1.755 -1.76 -1.765 -1.77 -1.775 -1.78 -1.785 -1.79 -1.795 -1.8 -1.805 -1.81 -1.815 -1.82 -1.825 -1.83 -1.835 -1.84 -1.845 -1.85 -1.855 -1.86 -1.865 -1.87 -1.875 -1.88 -1.885 -1.89 -1.895 -1.9 -1.905 -1.91 -1.915 -1.92 -1.925 -1.93 -1.935 -1.94 -1.945 -1.95 -1.955 -1.96 -1.965 -1.97 -1.975 -1.98 -1.985 -1.99 -1.995 -2 -2.005 -2.01 -2.015 -2.02 -2.025 -2.03 -2.035 -2.04 -2.045 -2.05 -2.055 -2.06 -2.065 -2.07 -2.075 -2.08 -2.085 -2.09 -2.095 -2.1 -2.105 -2.11 -2.115 -2.12 -2.125 -2.13 -2.135 -2.14 -2.145 -2.15 -2.155 -2.16 -2.165 -2.17 -2.175 -2.18 -2.185 -2.19 -2.195 -2.2 -2.205 -2.21 -2.215 -2.22 -2.225 -2.23 -2.235 -2.24 -2.245 -2.25 -2.255 -2.26 -2.265 -2.27 -2.275 -2.28 -2.285 -2.29 -2.295 -2.3 -2.305 -2.31 -2.315 -2.32 -2.325 -2.33 -2.335 -2.34 -2.345 -2.35 -2.355 -2.36 -2.365 -2.37 -2.375 -2.38 -2.385 -2.39 -2.395 -2.4 -2.405 -2.41 -2.415 -2.42 -2.425 -2.43 -2.435 -2.44 -2.445 -2.45 -2.455 -2.46 -2.465 -2.47 -2.475 -2.48 -2.485 -2.49 -2.495 -2.5 -2.505 -2.51 -2.515 -2.52 -2.525 -2.53 -2.535 -2.54 -2.545 -2.55 -2.555 -2.56 -2.565 -2.57 -2.575 -2.58 -2.585 -2.59 -2.595 -2.6 -2.605 -2.61 -2.615 -2.62 -2.625 -2.63 -2.635 -2.64 -2.645 -2.65 -2.655 -2.66 -2.665 -2.67 -2.675 -2.68 -2.685 -2.69 -2.695 -2.7 -2.705 -2.71 -2.715 -2.72 -2.725 -2.73 -2.735 -2.74 -2.745 -2.75 -2.755 -2.76 -2.765 -2.77 -2.775 -2.78 -2.785 -2.79 -2.795 -2.8 -2.805 -2.81 -2.815 -2.82 -2.825 -2.83 -2.835 -2.84 -2.845 -2.85 -2.855 -2.86 -2.865 -2.87 -2.875 -2.88 -2.885 -2.89 -2.895 -2.9 -2.905 -2.91 -2.915 -2.92 -2.925 -2.93 -2.935 -2.94 -2.945 -2.95 -2.955 -2.96 -2.965 -2.97 -2.975 -2.98 -2.985 -2.99 -2.995 -3 -3.005 -3.01 -3.015 -3.02 -3.025 -3.03 -3.035 -3.04 -3.045 -3.05 -3.055 -3.06 -3.065 -3.07 -3.075 -3.08 -3.085 -3.09 -3.095 -3.1 -3.105 -3.11 -3.115 -3.12 -3.125 -3.13 -3.135 -3.14 -3.145 -3.15 -3.155 -3.16 -3.165 -3.17 -3.175 -3.18 -3.185 -3.19 -3.195 -3.2 -3.205 -3.21 -3.215 -3.22 -3.225 -3.23 -3.235 -3.24 -3.245 -3.25 -3.255 -3.26 -3.265 -3.27 -3.275 -3.28 -3.285 -3.29 -3.295 -3.3 -3.305 -3.31 -3.315 -3.32 -3.325 -3.33 -3.335 -3.34 -3.345 -3.35 -3.355 -3.36 -3.365 -3.37 -3.375 -3.38 -3.385 -3.39 -3.395 -3.4 -3.405 -3.41 -3.415 -3.42 -3.425 -3.43 -3.435 -3.44 -3.445 -3.45 -3.455 -3.46 -3.465 -3.47 -3.475 -3.48 -3.485 -3.49 -3.495 -3.5 -3.505 -3.51 -3.515 -3.52 -3.525 -3.53 -3.535 -3.54 -3.545 -3.55 -3.555 -3.56 -3.565 -3.57 -3.575 -3.58 -3.585 -3.59 -3.595 -3.6 -3.605 -3.61 -3.615 -3.62 -3.625 -3.63 -3.635 -3.64 -3.645 -3.65 -3.655 -3.66 -3.665 -3.67 -3.675 -3.68 -3.685 -3.69 -3.695 -3.7 -3.705 -3.71 -3.715 -3.72 -3.725 -3.73 -3.735 -3.74 -3.745 -3.75 -3.755 -3.76 -3.765 -3.77 -3.775 -3.78 -3.785 -3.79 -3.795 -3.8 -3.805 -3.81 -3.815 -3.82 -3.825 -3.83 -3.835 -3.84 -3.845 -3.85 -3.855 -3.86 -3.865 -3.87 -3.875 -3.88 -3.885 -3.89 -3.895 -3.9 -3.905 -3.91 -3.915 -3.92 -3.925 -3.93 -3.935 -3.94 -3.945 -3.95 -3.955 -3.96 -3.965 -3.97 -3.975 -3.98 -3.985 -3.99 -3.995 -4 -4.005 -4.01 -4.015 -4.02 -4.025 -4.03 -4.035 -4.04 -4.045 -4.05 -4.055 -4.06 -4.065 -4.07 -4.075 -4.08 -4.085 -4.09 -4.095 -4.1 -4.105 -4.11 -4.115 -4.12 -4.125 -4.13 -4.135 -4.14 -4.145 -4.15 -4.155 -4.16 -4.165 -4.17 -4.175 -4.18 -4.185 -4.19 -4.195 -4.2 -4.205 -4.21 -4.215 -4.22 -4.225 -4.23 -4.235 -4.24 -4.245 -4.25 -4.255 -4.26 -4.265 -4.27 -4.275 -4.28 -4.285 -4.29 -4.295 -4.3 -4.305 -4.31 -4.315 -4.32 -4.325 -4.33 -4.335 -4.34 -4.345 -4.35 -4.355 -4.36 -4.365 -4.37 -4.375 -4.38 -4.385 -4.39 -4.395 -4.4 -4.405 -4.41 -4.415 -4.42 -4.425 -4.43 -4.435 -4.44 -4.445 -4.45 -4.455 -4.46 -4.465 -4.47 -4.475 -4.48 -4.485 -4.49 -4.495 -4.5 -4.505 -4.51 -4.515 -4.52 -4.525 -4.53 -4.535 -4.54 -4.545 -4.55 -4.555 -4.56 -4.565 -4.57 -4.575 -4.58 -4.585 -4.59 -4.595 -4.6 -4.605 -4.61 -4.615 -4.62 -4.625 -4.63 -4.635 -4.64 -4.645 -4.65 -4.655 -4.66 -4.665 -4.67 -4.675 -4.68 -4.685 -4.69 -4.695 -4.7 -4.705 -4.71 -4.715 -4.72 -4.725 -4.73 -4.735 -4.74 -4.745 -4.75 -4.755 -4.76 -4.765 -4.77 -4.775 -4.78 -4.785 -4.79 -4.795 -4.8 -4.805 -4.81 -4.815 -4.82 -4.825 -4.83 -4.835 -4.84 -4.845 -4.85 -4.855 -4.86 -4.865 -4.87 -4.875 -4.88 -4.885 -4.89 -4.895 -4.9 -4.905 -4.91 -4.915 -4.92 -4.925 -4.93 -4.935 -4.94 -4.945 -4.95 -4.955 -4.96 -4.965 -4.97 -4.975 -4.98 -4.985 -4.99 -4.995 -5 -5.005 -5.01 -5.015 -5.02 -5.025 -5.03 -5.035 -5.04 -5.045 -5.05 -5.055 -5.06 -5.065 -5.07 -5.075 -5.08 -5.085 -5.09 -5.095 -5.1 -5.105 -5.11 -5.115 -5.12 -5.125 -5.13 -5.135 -5.14 -5.145 -5.15 -5.155 -5.16 -5.165 -5.17 -5.175 -5.18 -5.185 -5.19 -5.195 -5.2 -5.205 -5.21 -5.215 -5.22 -5.225 -5.23 -5.235 -5.24 -5.245 -5.25 -5.255 -5.26 -5.265 -5.27 -5.275 -5.28 -5.285 -5.29 -5.295 -5.3 -5.305 -5.31 -5.315 -5.32 -5.325 -5.33 -5.335 -5.34 -5.345 -5.35 -5.355 -5.36 -5.365 -5.37 -5.375 -5.38 -5.385 -5.39 -5.395 -5.4 -5.405 -5.41 -5.415 -5.42 -5.425 -5.43 -5.435 -5.44 -5.445 -5.45 -5.455 -5.46 -5.465 -5.47 -5.475 -5.48 -5.485 -5.49 -5.495 -5.5 -5.505 -5.51 -5.515 -5.52 -5.525 -5.53 -5.535 -5.54 -5.545 -5.55 -5.555 -5.56 -5.565 -5.57 -5.575 -5.58 -5.585 -5.59 -5.595 -5.6 -5.605 -5.61 -5.615 -5.62 -5.625 -5.63 -5.635 -5.64 -5.645 -5.65 -5.655 -5.66 -5.665 -5.67 -5.675 -5.68 -5.685 -5.69 -5.695 -5.7 -5.705 -5.71 -5.715 -5.72 -5.725 -5.73 -5.735 -5.74 -5.745 -5.75 -5.755 -5.76 -5.765 -5.77 -5.775 -5.78 -5.785 -5.79 -5.795 -5.8 -5.805 -5.81 -5.815 -5.82 -5.825 -5.83 -5.835 -5.84 -5.845 -5.85 -5.855 -5.86 -5.865 -5.87 -5.875 -5.88 -5.885 -5.89 -5.895 -5.9 -5.905 -5.91 -5.915 -5.92 -5.925 -5.93 -5.935 -5.94 -5.945 -5.95 -5.955 -5.96 -5.965 -5.97 -5.975 -5.98 -5.985 -5.99 -5.995 -6 -6.005 -6.01 -6.015 -6.02 -6.025 -6.03 -6.035 -6.04 -6.045 -6.05 -6.055 -6.06 -6.065 -6.07 -6.075 -6.08 -6.085 -6.09 -6.095 -6.1 -6.105 -6.11 -6.115 -6.12 -6.125 -6.13 -6.135 -6.14 -6.145 -6.15 -6.155 -6.16 -6.165 -6.17 -6.175 -6.18 -6.185 -6.19 -6.195 -6.2 -6.205 -6.21 -6.215 -6.22 -6.225 -6.23 -6.235 -6.24 -6.245 -6.25 -6.255 -6.26 -6.265 -6.27 -6.275 -6.28 -6.285 -6.29 -6.295 -6.3 -6.305 -6.31 -6.315 -6.32 -6.325 -6.33 -6.335 -6.34 -6.345 -6.35 -6.355 -6.36 -6.365 -6.37 -6.375 -6.38 -6.385 -6.39 -6.395 -6.4 -6.405 -6.41 -6.415 -6.42 -6.425 -6.43 -6.435 -6.44 -6.445 -6.45 -6.455 -6.46 -6.465 -6.47 -6.475 -6.48 -6.485 -6.49 -6.495 -6.5 -6.505 -6.51 -6.515 -6.52 -6.525 -6.53 -6.535 -6.54 -6.545 -6.55 -6.555 -6.56 -6.565 -6.57 -6.575 -6.58 -6.585 -6.59 -6.595 -6.6 -6.605 -6.61 -6.615 -6.62 -6.625 -6.63 -6.635 -6.64 -6.645 -6.65 -6.655 -6.66 -6.665 -6.67 -6.675 -6.68 -6.685 -6.69 -6.695 -6.7 -6.705 -6.71 -6.715 -6.72 -6.725 -6.73 -6.735 -6.74 -6.745 -6.75 -6.755 -6.76 -6.765 -6.77 -6.775 -6.78 -6.785 -6.79 -6.795 -6.8 -6.805 -6.81 -6.815 -6.82 -6.825 -6.83 -6.835 -6.84 -6.845 -6.85 -6.855 -6.86 -6.865 -6.87 -6.875 -6.88 -6.885 -6.89 -6.895 -6.9 -6.905 -6.91 -6.915 -6.92 -6.925 -6.93 -6.935 -6.94 -6.945 -6.95 -6.955 -6.96 -6.965 -6.97 -6.975 -6.98 -6.985 -6.99 -6.995 -7 -7.005 -7.01 -7.015 -7.02 -7.025 -7.03 -7.035 -7.04 -7.045 -7.05 -7.055 -7.06 -7.065 -7.07 -7.075 -7.08 -7.085 -7.09 -7.095 -7.1 -7.105 -7.11 -7.115 -7.12 -7.125 -7.13 -7.135 -7.14 -7.145 -7.15 -7.155 -7.16 -7.165 -7.17 -7.175 -7.18 -7.185 -7.19 -7.195 -7.2 -7.205 -7.21 -7.215 -7.22 -7.225 -7.23 -7.235 -7.24 -7.245 -7.25 -7.255 -7.26 -7.265 -7.27 -7.275 -7.28 -7.285 -7.29 -7.295 -7.3 -7.305 -7.31 -7.315 -7.32 -7.325 -7.33 -7.335 -7.34 -7.345 -7.35 -7.355 -7.36 -7.365 -7.37 -7.375 -7.38 -7.385 -7.39 -7.395 -7.4 -7.405 -7.41 -7.415 -7.42 -7.425 -7.43 -7.435 -7.44 -7.445 -7.45 -7.455 -7.46 -7.465 -7.47 -7.475 -7.48 -7.485 -7.49 -7.495 -7.5 -7.505 -7.51 -7.515 -7.52 -7.525 -7.53 -7.535 -7.54 -7.545 -7.55 -7.555 -7.56 -7.565 -7.57 -7.575 -7.58 -7.585 -7.59 -7.595 -7.6 -7.605 -7.61 -7.615 -7.62 -7.625 -7.63 -7.635 -7.64 -7.645 -7.65 -7.655 -7.66 -7.665 -7.67 -7.675 -7.68 -7.685 -7.69 -7.695 -7.7 -7.705 -7.71 -7.715 -7.72 -7.725 -7.73 -7.735 -7.74 -7.745 -7.75 -7.755 -7.76 -7.765 -7.77 -7.775 -7.78 -7.785 -7.79 -7.795 -7.8 -7.805 -7.81 -7.815 -7.82 -7.825 -7.83 -7.835 -7.84 -7.845 -7.85 -7.855 -7.86 -7.865 -7.87 -7.875 -7.88 -7.885 -7.89 -7.895 -7.9 -7.905 -7.91 -7.915 -7.92 -7.925 -7.93 -7.935 -7.94 -7.945 -7.95 -7.955 -7.96 -7.965 -7.97 -7.975 -7.98 -7.985 -7.99 -7.995 -8 -8.005 -8.01 -8.015 -8.02 -8.025 -8.03 -8.035 -8.04 -8.045 -8.05 -8.055 -8.06 -8.065 -8.07 -8.075 -8.08 -8.085 -8.09 -8.095 -8.1 -8.105 -8.11 -8.115 -8.12 -8.125 -8.13 -8.135 -8.14 -8.145 -8.15 -8.155 -8.16 -8.165 -8.17 -8.175 -8.18 -8.185 -8.19 -8.195 -8.2 -8.205 -8.21 -8.215 -8.22 -8.225 -8.23 -8.235 -8.24 -8.245 -8.25 -8.255 -8.26 -8.265 -8.27 -8.275 -8.28 -8.285 -8.29 -8.295 -8.3 -8.305 -8.31 -8.315 -8.32 -8.325 -8.33 -8.335 -8.34 -8.345 -8.35 -8.355 -8.36 -8.365 -8.37 -8.375 -8.38 -8.385 -8.39 -8.395 -8.4 -8.405 -8.41 -8.415 -8.42 -8.425 -8.43 -8.435 -8.44 -8.445 -8.45 -8.455 -8.46 -8.465 -8.47 -8.475 -8.48 -8.485 -8.49 -8.495 -8.5 -8.505 -8.51 -8.515 -8.52 -8.525 -8.53 -8.535 -8.54 -8.545 -8.55 -8.555 -8.56 -8.565 -8.57 -8.575 -8.58 -8.585 -8.59 -8.595 -8.6 -8.605 -8.61 -8.615 -8.62 -8.625 -8.63 -8.635 -8.64 -8.645 -8.65 -8.655 -8.66 -8.665 -8.67 -8.675 -8.68 -8.685 -8.69 -8.695 -8.7 -8.705 -8.71 -8.715 -8.72 -8.725 -8.73 -8.735 -8.74 -8.745 -8.75 -8.755 -8.76 -8.765 -8.77 -8.775 -8.78 -8.785 -8.79 -8.795 -8.8 -8.805 -8.81 -8.815 -8.82 -8.825 -8.83 -8.835 -8.84 -8.845 -8.85 -8.855 -8.86 -8.865 -8.87 -8.875 -8.88 -8.885 -8.89 -8.895 -8.9 -8.905 -8.91 -8.915 -8.92 -8.925 -8.93 -8.935 -8.94 -8.945 -8.95 -8.955 -8.96 -8.965 -8.97 -8.975 -8.98 -8.985 -8.99 -8.995 -9 -9.005 -9.01 -9.015 -9.02 -9.025 -9.03 -9.035 -9.04 -9.045 -9.05 -9.055 -9.06 -9.065 -9.07 -9.075 -9.08 -9.085 -9.09 -9.095 -9.1 -9.105 -9.11 -9.115 -9.12 -9.125 -9.13 -9.135 -9.14 -9.145 -9.15 -9.155 -9.16 -9.165 -9.17 -9.175 -9.18 -9.185 -9.19 -9.195 -9.2 -9.205 -9.21 -9.215 -9.22 -9.225 -9.23 -9.235 -9.24 -9.245 -9.25 -9.255 -9.26 -9.265 -9.27 -9.275 -9.28 -9.285 -9.29 -9.295 -9.3 -9.305 -9.31 -9.315 -9.32 -9.325 -9.33 -9.335 -9.34 -9.345 -9.35 -9.355 -9.36 -9.365 -9.37 -9.375 -9.38 -9.385 -9.39 -9.395 -9.4 -9.405 -9.41 -9.415 -9.42 -9.425 -9.43 -9.435 -9.44 -9.445 -9.45 -9.455 -9.46 -9.465 -9.47 -9.475 -9.48 -9.485 -9.49 -9.495 -9.5 -9.505 -9.51 -9.515 -9.52 -9.525 -9.53 -9.535 -9.54 -9.545 -9.55 -9.555 -9.56 -9.565 -9.57 -9.575 -9.58 -9.585 -9.59 -9.595 -9.6 -9.605 -9.61 -9.615 -9.62 -9.625 -9.63 -9.635 -9.64 -9.645 -9.65 -9.655 -9.66 -9.665 -9.67 -9.675 -9.68 -9.685 -9.69 -9.695 -9.7 -9.705 -9.71 -9.715 -9.72 -9.725 -9.73 -9.735 -9.74 -9.745 -9.75 -9.755 -9.76 -9.765 -9.77 -9.775 -9.78 -9.785 -9.79 -9.795 -9.8 -9.805 -9.81 -9.815 -9.82 -9.825 -9.83 -9.835 -9.84 -9.845 -9.85 -9.855 -9.86 -9.865 -9.87 -9.875 -9.88 -9.885 -9.89 -9.895 -9.9 -9.905 -9.91 -9.915 -9.92 -9.925 -9.93 -9.935 -9.94 -9.945 -9.95 -9.955 -9.96 -9.965 -9.97 -9.975 -9.98 -9.985 -9.99 -9.995 -10 -10.005 -10.01 -10.015 -10.02 -10.025 -10.03 -10.035 -10.04 -10.045 -10.05 -10.055 -10.06 -10.065 -10.07 -10.075 -10.08 -10.085 -10.09 -10.095 -10.1 -10.105 -10.11 -10.115 -10.12 -10.125 -10.13 -10.135 -10.14 -10.145 -10.15 -10.155 -10.16 -10.165 -10.17 -10.175 -10.18 -10.185 -10.19 -10.195 -10.2 -10.205 -10.21 -10.215 -10.22 -10.225 -10.23 -10.235 -10.24 -10.245 -10.25 -10.255 -10.26 -10.265 -10.27 -10.275 -10.28 -10.285 -10.29 -10.295 -10.3 -10.305 -10.31 -10.315 -10.32 -10.325 -10.33 -10.335 -10.34 -10.345 -10.35 -10.355 -10.36 -10.365 -10.37 -10.375 -10.38 -10.385 -10.39 -10.395 -10.4 -10.405 -10.41 -10.415 -10.42 -10.425 -10.43 -10.435 -10.44 -10.445 -10.45 -10.455 -10.46 -10.465 -10.47 -10.475 -10.48 -10.485 -10.49 -10.495 -10.5 -10.505 -10.51 -10.515 -10.52 -10.525 -10.53 -10.535 -10.54 -10.545 -10.55 -10.555 -10.56 -10.565 -10.57 -10.575 -10.58 -10.585 -10.59 -10.595 -10.6 -10.605 -10.61 -10.615 -10.62 -10.625 -10.63 -10.635 -10.64 -10.645 -10.65 -10.655 -10.66 -10.665 -10.67 -10.675 -10.68 -10.685 -10.69 -10.695 -10.7 -10.705 -10.71 -10.715 -10.72 -10.725 -10.73 -10.735 -10.74 -10.745 -10.75 -10.755 -10.76 -10.765 -10.77 -10.775 -10.78 -10.785 -10.79 -10.795 -10.8 -10.805 -10.81 -10.815 -10.82 -10.825 -10.83 -10.835 -10.84 -10.845 -10.85 -10.855 -10.86 -10.865 -10.87 -10.875 -10.88 -10.885 -10.89 -10.895 -10.9 -10.905 -10.91 -10.915 -10.92 -10.925 -10.93 -10.935 -10.94 -10.945 -10.95 -10.955 -10.96 -10.965 -10.97 -10.975 -10.98 -10.985 -10.99 -10.995 -11 -11.005 -11.01 -11.015 -11.02 -11.025 -11.03 -11.035 -11.04 -11.045 -11.05 -11.055 -11.06 -11.065 -11.07 -11.075 -11.08 -11.085 -11.09 -11.095 -11.1 -11.105 -11.11 -11.115 -11.12 -11.125 -11.13 -11.135 -11.14 -11.145 -11.15 -11.155 -11.16 -11.165 -11.17 -11.175 -11.18 -11.185 -11.19 -11.195 -11.2 -11.205 -11.21 -11.215 -11.22 -11.225 -11.23 -11.235 -11.24 -11.245 -11.25 -11.255 -11.26 -11.265 -11.27 -11.275 -11.28 -11.285 -11.29 -11.295 -11.3 -11.305 -11.31 -11.315 -11.32 -11.325 -11.33 -11.335 -11.34 -11.345 -11.35 -11.355 -11.36 -11.365 -11.37 -11.375 -11.38 -11.385 -11.39 -11.395 -11.4 -11.405 -11.41 -11.415 -11.42 -11.425 -11.43 -11.435 -11.44 -11.445 -11.45 -11.455 -11.46 -11.465 -11.47 -11.475 -11.48 -11.485 -11.49 -11.495 -11.5 -11.505 -11.51 -11.515 -11.52 -11.525 -11.53 -11.535 -11.54 -11.545 -11.55 -11.555 -11.56 -11.565 -11.57 -11.575 -11.58 -11.585 -11.59 -11.595 -11.6 -11.605 -11.61 -11.615 -11.62 -11.625 -11.63 -11.635 -11.64 -11.645 -11.65 -11.655 -11.66 -11.665 -11.67 -11.675 -11.68 -11.685 -11.69 -11.695 -11.7 -11.705 -11.71 -11.715 -11.72 -11.725 -11.73 -11.735 -11.74 -11.745 -11.75 -11.755 -11.76 -11.765 -11.77 -11.775 -11.78 -11.785 -11.79 -11.795 -11.8 -11.805 -11.81 -11.815 -11.82 -11.825 -11.83 -11.835 -11.84 -11.845 -11.85 -11.855 -11.86 -11.865 -11.87 -11.875 -11.88 -11.885 -11.89 -11.895 -11.9 -11.905 -11.91 -11.915 -11.92 -11.925 -11.93 -11.935 -11.94 -11.945 -11.95 -11.955 -11.96 -11.965 -11.97 -11.975 -11.98 -11.985 -11.99 -11.995 -12 -12.005 -12.01 -12.015 -12.02 -12.025 -12.03 -12.035 -12.04 -12.045 -12.05 -12.055 -12.06 -12.065 -12.07 -12.075 -12.08 -12.085 -12.09 -12.095 -12.1 -12.105 -12.11 -12.115 -12.12 -12.125 -12.13 -12.135 -12.14 -12.145 -12.15 -12.155 -12.16 -12.165 -12.17 -12.175 -12.18 -12.185 -12.19 -12.195 -12.2 -12.205 -12.21 -12.215 -12.22 -12.225 -12.23 -12.235 -12.24 -12.245 -12.25 -12.255 -12.26 -12.265 -12.27 -12.275 -12.28 -12.285 -12.29 -12.295 -12.3 -12.305 -12.31 -12.315 -12.32 -12.325 -12.33 -12.335 -12.34 -12.345 -12.35 -12.355 -12.36 -12.365 -12.37 -12.375 -12.38 -12.385 -12.39 -12.395 -12.4 -12.405 -12.41 -12.415 -12.42 -12.425 -12.43 -12.435 -12.44 -12.445 -12.45 -12.455 -12.46 -12.465 -12.47 -12.475 -12.48 -12.485 -12.49 -12.495 -12.5 -12.505 -12.51 -12.515 -12.52 -12.525 -12.53 -12.535 -12.54 -12.545 -12.55 -12.555 -12.56 -12.565 -12.57 -12.575 -12.58 -12.585 -12.59 -12.595 -12.6 -12.605 -12.61 -12.615 -12.62 -12.625 -12.63 -12.635 -12.64 -12.645 -12.65 -12.655 -12.66 -12.665 -12.67 -12.675 -12.68 -12.685 -12.69 -12.695 -12.7 -12.705 -12.71 -12.715 -12.72 -12.725 -12.73 -12.735 -12.74 -12.745 -12.75 -12.755 -12.76 -12.765 -12.77 -12.775 -12.78 -12.785 -12.79 -12.795 -12.8 -12.805 -12.81 -12.815 -12.82 -12.825 -12.83 -12.835 -12.84 -12.845 -12.85 -12.855 -12.86 -12.865 -12.87 -12.875 -12.88 -12.885 -12.89 -12.895 -12.9 -12.905 -12.91 -12.915 -12.92 -12.925 -12.93 -12.935 -12.94 -12.945 -12.95 -12.955 -12.96 -12.965 -12.97 -12.975 -12.98 -12.985 -12.99 -12.995 -13 -13.005 -13.01 -13.015 -13.02 -13.025 -13.03 -13.035 -13.04 -13.045 -13.05 -13.055 -13.06 -13.065 -13.07 -13.075 -13.08 -13.085 -13.09 -13.095 -13.1 -13.105 -13.11 -13.115 -13.12 -13.125 -13.13 -13.135 -13.14 -13.145 -13.15 -13.155 -13.16 -13.165 -13.17 -13.175 -13.18 -13.185 -13.19 -13.195 -13.2 -13.205 -13.21 -13.215 -13.22 -13.225 -13.23 -13.235 -13.24 -13.245 -13.25 -13.255 -13.26 -13.265 -13.27 -13.275 -13.28 -13.285 -13.29 -13.295 -13.3 -13.305 -13.31 -13.315 -13.32 -13.325 -13.33 -13.335 -13.34 -13.345 -13.35 -13.355 -13.36 -13.365 -13.37 -13.375 -13.38 -13.385 -13.39 -13.395 -13.4 -13.405 -13.41 -13.415 -13.42 -13.425 -13.43 -13.435 -13.44 -13.445 -13.45 -13.455 -13.46 -13.465 -13.47 -13.475 -13.48 -13.485 -13.49 -13.495 -13.5 -13.505 -13.51 -13.515 -13.52 -13.525 -13.53 -13.535 -13.54 -13.545 -13.55 -13.555 -13.56 -13.565 -13.57 -13.575 -13.58 -13.585 -13.59 -13.595 -13.6 -13.605 -13.61 -13.615 -13.62 -13.625 -13.63 -13.635 -13.64 -13.645 -13.65 -13.655 -13.66 -13.665 -13.67 -13.675 -13.68 -13.685 -13.69 -13.695 -13.7 -13.705 -13.71 -13.715 -13.72 -13.725 -13.73 -13.735 -13.74 -13.745 -13.75 -13.755 -13.76 -13.765 -13.77 -13.775 -13.78 -13.785 -13.79 -13.795 -13.8 -13.805 -13.81 -13.815 -13.82 -13.825 -13.83 -13.835 -13.84 -13.845 -13.85 -13.855 -13.86 -13.865 -13.87 -13.875 -13.88 -13.885 -13.89 -13.895 -13.9 -13.905 -13.91 -13.915 -13.92 -13.925 -13.93 -13.935 -13.94 -13.945 -13.95 -13.955 -13.96 -13.965 -13.97 -13.975 -13.98 -13.985 -13.99 -13.995 -14 -14.005 -14.01 -14.015 -14.02 -14.025 -14.03 -14.035 -14.04 -14.045 -14.05 -14.055 -14.06 -14.065 -14.07 -14.075 -14.08 -14.085 -14.09 -14.095 -14.1 -14.105 -14.11 -14.115 -14.12 -14.125 -14.13 -14.135 -14.14 -14.145 -14.15 -14.155 -14.16 -14.165 -14.17 -14.175 -14.18 -14.185 -14.19 -14.195 -14.2 -14.205 -14.21 -14.215 -14.22 -14.225 -14.23 -14.235 -14.24 -14.245 -14.25 -14.255 -14.26 -14.265 -14.27 -14.275 -14.28 -14.285 -14.29 -14.295 -14.3 -14.305 -14.31 -14.315 -14.32 -14.325 -14.33 -14.335 -14.34 -14.345 -14.35 -14.355 -14.36 -14.365 -14.37 -14.375 -14.38 -14.385 -14.39 -14.395 -14.4 -14.405 -14.41 -14.415 -14.42 -14.425 -14.43 -14.435 -14.44 -14.445 -14.45 -14.455 -14.46 -14.465 -14.47 -14.475 -14.48 -14.485 -14.49 -14.495 -14.5 -14.505 -14.51 -14.515 -14.52 -14.525 -14.53 -14.535 -14.54 -14.545 -14.55 -14.555 -14.56 -14.565 -14.57 -14.575 -14.58 -14.585 -14.59 -14.595 -14.6 -14.605 -14.61 -14.615 -14.62 -14.625 -14.63 -14.635 -14.64 -14.645 -14.65 -14.655 -14.66 -14.665 -14.67 -14.675 -14.68 -14.685 -14.69 -14.695 -14.7 -14.705 -14.71 -14.715 -14.72 -14.725 -14.73 -14.735 -14.74 -14.745 -14.75 -14.755 -14.76 -14.765 -14.77 -14.775 -14.78 -14.785 -14.79 -14.795 -14.8 -14.805 -14.81 -14.815 -14.82 -14.825 -14.83 -14.835 -14.84 -14.845 -14.85 -14.855 -14.86 -14.865 -14.87 -14.875 -14.88 -14.885 -14.89 -14.895 -14.9 -14.905 -14.91 -14.915 -14.92 -14.925 -14.93 -14.935 -14.94 -14.945 -14.95 -14.955 -14.96 -14.965 -14.97 -14.975 -14.98 -14.985 -14.99 -14.995 -15 -15.005 -15.01 -15.015 -15.02 -15.025 -15.03 -15.035 -15.04 -15.045 -15.05 -15.055 -15.06 -15.065 -15.07 -15.075 -15.08 -15.085 -15.09 -15.095 -15.1 -15.105 -15.11 -15.115 -15.12 -15.125 -15.13 -15.135 -15.14 -15.145 -15.15 -15.155 -15.16 -15.165 -15.17 -15.175 -15.18 -15.185 -15.19 -15.195 -15.2 -15.205 -15.21 -15.215 -15.22 -15.225 -15.23 -15.235 -15.24 -15.245 -15.25 -15.255 -15.26 -15.265 -15.27 -15.275 -15.28 -15.285 -15.29 -15.295 -15.3 -15.305 -15.31 -15.315 -15.32 -15.325 -15.33 -15.335 -15.34 -15.345 -15.35 -15.355 -15.36 -15.365 -15.37 -15.375 -15.38 -15.385 -15.39 -15.395 -15.4 -15.405 -15.41 -15.415 -15.42 -15.425 -15.43 -15.435 -15.44 -15.445 -15.45 -15.455 -15.46 -15.465 -15.47 -15.475 -15.48 -15.485 -15.49 -15.495 -15.5 -15.505 -15.51 -15.515 -15.52 -15.525 -15.53 -15.535 -15.54 -15.545 -15.55 -15.555 -15.56 -15.565 -15.57 -15.575 -15.58 -15.585 -15.59 -15.595 -15.6 -15.605 -15.61 -15.615 -15.62 -15.625 -15.63 -15.635 -15.64 -15.645 -15.65 -15.655 -15.66 -15.665 -15.67 -15.675 -15.68 -15.685 -15.69 -15.695 -15.7 -15.705 -15.71 -15.715 -15.72 -15.725 -15.73 -15.735 -15.74 -15.745 -15.75 -15.755 -15.76 -15.765 -15.77 -15.775 -15.78 -15.785 -15.79 -15.795 -15.8 -15.805 -15.81 -15.815 -15.82 -15.825 -15.83 -15.835 -15.84 -15.845 -15.85 -15.855 -15.86 -15.865 -15.87 -15.875 -15.88 -15.885 -15.89 -15.895 -15.9 -15.905 -15.91 -15.915 -15.92 -15.925 -15.93 -15.935 -15.94 -15.945 -15.95 -15.955 -15.96 -15.965 -15.97 -15.975 -15.98 -15.985 -15.99 -15.995 -16 -16.005 -16.01 -16.015 -16.02 -16.025 -16.03 -16.035 -16.04 -16.045 -16.05 -16.055 -16.06 -16.065 -16.07 -16.075 -16.08 -16.085 -16.09 -16.095 -16.1 -16.105 -16.11 -16.115 -16.12 -16.125 -16.13 -16.135 -16.14 -16.145 -16.15 -16.155 -16.16 -16.165 -16.17 -16.175 -16.18 -16.185 -16.19 -16.195 -16.2 -16.205 -16.21 -16.215 -16.22 -16.225 -16.23 -16.235 -16.24 -16.245 -16.25 -16.255 -16.26 -16.265 -16.27 -16.275 -16.28 -16.285 -16.29 -16.295 -16.3 -16.305 -16.31 -16.315 -16.32 -16.325 -16.33 -16.335 -16.34 -16.345 -16.35 -16.355 -16.36 -16.365 -16.37 -16.375 -16.38 -16.385 -16.39 -16.395 -16.4 -16.405 -16.41 -16.415 -16.42 -16.425 -16.43 -16.435 -16.44 -16.445 -16.45 -16.455 -16.46 -16.465 -16.47 -16.475 -16.48 -16.485 -16.49 -16.495 -16.5 -16.505 -16.51 -16.515 -16.52 -16.525 -16.53 -16.535 -16.54 -16.545 -16.55 -16.555 -16.56 -16.565 -16.57 -16.575 -16.58 -16.585 -16.59 -16.595 -16.6 -16.605 -16.61 -16.615 -16.62 -16.625 -16.63 -16.635 -16.64 -16.645 -16.65 -16.655 -16.66 -16.665 -16.67 -16.675 -16.68 -16.685 -16.69 -16.695 -16.7 -16.705 -16.71 -16.715 -16.72 -16.725 -16.73 -16.735 -16.74 -16.745 -16.75 -16.755 -16.76 -16.765 -16.77 -16.775 -16.78 -16.785 -16.79 -16.795 -16.8 -16.805 -16.81 -16.815 -16.82 -16.825 -16.83 -16.835 -16.84 -16.845 -16.85 -16.855 -16.86 -16.865 -16.87 -16.875 -16.88 -16.885 -16.89 -16.895 -16.9 -16.905 -16.91 -16.915 -16.92 -16.925 -16.93 -16.935 -16.94 -16.945 -16.95 -16.955 -16.96 -16.965 -16.97 -16.975 -16.98 -16.985 -16.99 -16.995 -17 -17.005 -17.01 -17.015 -17.02 -17.025 -17.03 -17.035 -17.04 -17.045 -17.05 -17.055 -17.06 -17.065 -17.07 -17.075 -17.08 -17.085 -17.09 -17.095 -17.1 -17.105 -17.11 -17.115 -17.12 -17.125 -17.13 -17.135 -17.14 -17.145 -17.15 -17.155 -17.16 -17.165 -17.17 -17.175 -17.18 -17.185 -17.19 -17.195 -17.2 -17.205 -17.21 -17.215 -17.22 -17.225 -17.23 -17.235 -17.24 -17.245 -17.25 -17.255 -17.26 -17.265 -17.27 -17.275 -17.28 -17.285 -17.29 -17.295 -17.3 -17.305 -17.31 -17.315 -17.32 -17.325 -17.33 -17.335 -17.34 -17.345 -17.35 -17.355 -17.36 -17.365 -17.37 -17.375 -17.38 -17.385 -17.39 -17.395 -17.4 -17.405 -17.41 -17.415 -17.42 -17.425 -17.43 -17.435 -17.44 -17.445 -17.45 -17.455 -17.46 -17.465 -17.47 -17.475 -17.48 -17.485 -17.49 -17.495 -17.5 -17.505 -17.51 -17.515 -17.52 -17.525 -17.53 -17.535 -17.54 -17.545 -17.55 -17.555 -17.56 -17.565 -17.57 -17.575 -17.58 -17.585 -17.59 -17.595 -17.6 -17.605 -17.61 -17.615 -17.62 -17.625 -17.63 -17.635 -17.64 -17.645 -17.65 -17.655 -17.66 -17.665 -17.67 -17.675 -17.68 -17.685 -17.69 -17.695 -17.7 -17.705 -17.71 -17.715 -17.72 -17.725 -17.73 -17.735 -17.74 -17.745 -17.75 -17.755 -17.76 -17.765 -17.77 -17.775 -17.78 -17.785 -17.79 -17.795 -17.8 -17.805 -17.81 -17.815 -17.82 -17.825 -17.83 -17.835 -17.84 -17.845 -17.85 -17.855 -17.86 -17.865 -17.87 -17.875 -17.88 -17.885 -17.89 -17.895 -17.9 -17.905 -17.91 -17.915 -17.92 -17.925 -17.93 -17.935 -17.94 -17.945 -17.95 -17.955 -17.96 -17.965 -17.97 -17.975 -17.98 -17.985 -17.99 -17.995 -18 -18.005 -18.01 -18.015 -18.02 -18.025 -18.03 -18.035 -18.04 -18.045 -18.05 -18.055 -18.06 -18.065 -18.07 -18.075 -18.08 -18.085 -18.09 -18.095 -18.1 -18.105 -18.11 -18.115 -18.12 -18.125 -18.13 -18.135 -18.14 -18.145 -18.15 -18.155 -18.16 -18.165 -18.17 -18.175 -18.18 -18.185 -18.19 -18.195 -18.2 -18.205 -18.21 -18.215 -18.22 -18.225 -18.23 -18.235 -18.24 -18.245 -18.25 -18.255 -18.26 -18.265 -18.27 -18.275 -18.28 -18.285 -18.29 -18.295 -18.3 -18.305 -18.31 -18.315 -18.32 -18.325 -18.33 -18.335 -18.34 -18.345 -18.35 -18.355 -18.36 -18.365 -18.37 -18.375 -18.38 -18.385 -18.39 -18.395 -18.4 -18.405 -18.41 -18.415 -18.42 -18.425 -18.43 -18.435 -18.44 -18.445 -18.45 -18.455 -18.46 -18.465 -18.47 -18.475 -18.48 -18.485 -18.49 -18.495 -18.5 -18.505 -18.51 -18.515 -18.52 -18.525 -18.53 -18.535 -18.54 -18.545 -18.55 -18.555 -18.56 -18.565 -18.57 -18.575 -18.58 -18.585 -18.59 -18.595 -18.6 -18.605 -18.61 -18.615 -18.62 -18.625 -18.63 -18.635 -18.64 -18.645 -18.65 -18.655 -18.66 -18.665 -18.67 -18.675 -18.68 -18.685 -18.69 -18.695 -18.7 -18.705 -18.71 -18.715 -18.72 -18.725 -18.73 -18.735 -18.74 -18.745 -18.75 -18.755 -18.76 -18.765 -18.77 -18.775 -18.78 -18.785 -18.79 -18.795 -18.8 -18.805 -18.81 -18.815 -18.82 -18.825 -18.83 -18.835 -18.84 -18.845 -18.85 -18.855 -18.86 -18.865 -18.87 -18.875 -18.88 -18.885 -18.89 -18.895 -18.9 -18.905 -18.91 -18.915 -18.92 -18.925 -18.93 -18.935 -18.94 -18.945 -18.95 -18.955 -18.96 -18.965 -18.97 -18.975 -18.98 -18.985 -18.99 -18.995 -19 -19.005 -19.01 -19.015 -19.02 -19.025 -19.03 -19.035 -19.04 -19.045 -19.05 -19.055 -19.06 -19.065 -19.07 -19.075 -19.08 -19.085 -19.09 -19.095 -19.1 -19.105 -19.11 -19.115 -19.12 -19.125 -19.13 -19.135 -19.14 -19.145 -19.15 -19.155 -19.16 -19.165 -19.17 -19.175 -19.18 -19.185 -19.19 -19.195 -19.2 -19.205 -19.21 -19.215 -19.22 -19.225 -19.23 -19.235 -19.24 -19.245 -19.25 -19.255 -19.26 -19.265 -19.27 -19.275 -19.28 -19.285 -19.29 -19.295 -19.3 -19.305 -19.31 -19.315 -19.32 -19.325 -19.33 -19.335 -19.34 -19.345 -19.35 -19.355 -19.36 -19.365 -19.37 -19.375 -19.38 -19.385 -19.39 -19.395 -19.4 -19.405 -19.41 -19.415 -19.42 -19.425 -19.43 -19.435 -19.44 -19.445 -19.45 -19.455 -19.46 -19.465 -19.47 -19.475 -19.48 -19.485 -19.49 -19.495 -19.5 -19.505 -19.51 -19.515 -19.52 -19.525 -19.53 -19.535 -19.54 -19.545 -19.55 -19.555 -19.56 -19.565 -19.57 -19.575 -19.58 -19.585 -19.59 -19.595 -19.6 -19.605 -19.61 -19.615 -19.62 -19.625 -19.63 -19.635 -19.64 -19.645 -19.65 -19.655 -19.66 -19.665 -19.67 -19.675 -19.68 -19.685 -19.69 -19.695 -19.7 -19.705 -19.71 -19.715 -19.72 -19.725 -19.73 -19.735 -19.74 -19.745 -19.75 -19.755 -19.76 -19.765 -19.77 -19.775 -19.78 -19.785 -19.79 -19.795 -19.8 -19.805 -19.81 -19.815 -19.82 -19.825 -19.83 -19.835 -19.84 -19.845 -19.85 -19.855 -19.86 -19.865 -19.87 -19.875 -19.88 -19.885 -19.89 -19.895 -19.9 -19.905 -19.91 -19.915 -19.92 -19.925 -19.93 -19.935 -19.94 -19.945 -19.95 -19.955 -19.96 -19.965 -19.97 -19.975 -19.98 -19.985 -19.99 -19.995 -20 -20.005 -20.01 -20.015 -20.02 -20.025 -20.03 -20.035 -20.04 -20.045 -20.05 -20.055 -20.06 -20.065 -20.07 -20.075 -20.08 -20.085 -20.09 -20.095 -20.1 -20.105 -20.11 -20.115 -20.12 -20.125 -20.13 -20.135 -20.14 -20.145 -20.15 -20.155 -20.16 -20.165 -20.17 -20.175 -20.18 -20.185 -20.19 -20.195 -20.2 -20.205 -20.21 -20.215 -20.22 -20.225 -20.23 -20.235 -20.24 -20.245 -20.25 -20.255 -20.26 -20.265 -20.27 -20.275 -20.28 -20.285 -20.29 -20.295 -20.3 -20.305 -20.31 -20.315 -20.32 -20.325 -20.33 -20.335 -20.34 -20.345 -20.35 -20.355 -20.36 -20.365 -20.37 -20.375 -20.38 -20.385 -20.39 -20.395 -20.4 -20.405 -20.41 -20.415 -20.42 -20.425 -20.43 -20.435 -20.44 -20.445 -20.45 -20.455 -20.46 -20.465 -20.47 -20.475 -20.48 -20.485 -20.49 -20.495 -20.5 -20.505 -20.51 -20.515 -20.52 -20.525 -20.53 -20.535 -20.54 -20.545 -20.55 -20.555 -20.56 -20.565 -20.57 -20.575 -20.58 -20.585 -20.59 -20.595 -20.6 -20.605 -20.61 -20.615 -20.62 -20.625 -20.63 -20.635 -20.64 -20.645 -20.65 -20.655 -20.66 -20.665 -20.67 -20.675 -20.68 -20.685 -20.69 -20.695 -20.7 -20.705 -20.71 -20.715 -20.72 -20.725 -20.73 -20.735 -20.74 -20.745 -20.75 -20.755 -20.76 -20.765 -20.77 -20.775 -20.78 -20.785 -20.79 -20.795 -20.8 -20.805 -20.81 -20.815 -20.82 -20.825 -20.83 -20.835 -20.84 -20.845 -20.85 -20.855 -20.86 -20.865 -20.87 -20.875 -20.88 -20.885 -20.89 -20.895 -20.9 -20.905 -20.91 -20.915 -20.92 -20.925 -20.93 -20.935 -20.94 -20.945 -20.95 -20.955 -20.96 -20.965 -20.97 -20.975 -20.98 -20.985 -20.99 -20.995 -21 -21.005 -21.01 -21.015 -21.02 -21.025 -21.03 -21.035 -21.04 -21.045 -21.05 -21.055 -21.06 -21.065 -21.07 -21.075 -21.08 -21.085 -21.09 -21.095 -21.1 -21.105 -21.11 -21.115 -21.12 -21.125 -21.13 -21.135 -21.14 -21.145 -21.15 -21.155 -21.16 -21.165 -21.17 -21.175 -21.18 -21.185 -21.19 -21.195 -21.2 -21.205 -21.21 -21.215 -21.22 -21.225 -21.23 -21.235 -21.24 -21.245 -21.25 -21.255 -21.26 -21.265 -21.27 -21.275 -21.28 -21.285 -21.29 -21.295 -21.3 -21.305 -21.31 -21.315 -21.32 -21.325 -21.33 -21.335 -21.34 -21.345 -21.35 -21.355 -21.36 -21.365 -21.37 -21.375 -21.38 -21.385 -21.39 -21.395 -21.4 -21.405 -21.41 -21.415 -21.42 -21.425 -21.43 -21.435 -21.44 -21.445 -21.45 -21.455 -21.46 -21.465 -21.47 -21.475 -21.48 -21.485 -21.49 -21.495 -21.5 -21.505 -21.51 -21.515 -21.52 -21.525 -21.53 -21.535 -21.54 -21.545 -21.55 -21.555 -21.56 -21.565 -21.57 -21.575 -21.58 -21.585 -21.59 -21.595 -21.6 -21.605 -21.61 -21.615 -21.62 -21.625 -21.63 -21.635 -21.64 -21.645 -21.65 -21.655 -21.66 -21.665 -21.67 -21.675 -21.68 -21.685 -21.69 -21.695 -21.7 -21.705 -21.71 -21.715 -21.72 -21.725 -21.73 -21.735 -21.74 -21.745 -21.75 -21.755 -21.76 -21.765 -21.77 -21.775 -21.78 -21.785 -21.79 -21.795 -21.8 -21.805 -21.81 -21.815 -21.82 -21.825 -21.83 -21.835 -21.84 -21.845 -21.85 -21.855 -21.86 -21.865 -21.87 -21.875 -21.88 -21.885 -21.89 -21.895 -21.9 -21.905 -21.91 -21.915 -21.92 -21.925 -21.93 -21.935 -21.94 -21.945 -21.95 -21.955 -21.96 -21.965 -21.97 -21.975 -21.98 -21.985 -21.99 -21.995 -22 -22.005 -22.01 -22.015 -22.02 -22.025 -22.03 -22.035 -22.04 -22.045 -22.05 -22.055 -22.06 -22.065 -22.07 -22.075 -22.08 -22.085 -22.09 -22.095 -22.1 -22.105 -22.11 -22.115 -22.12 -22.125 -22.13 -22.135 -22.14 -22.145 -22.15 -22.155 -22.16 -22.165 -22.17 -22.175 -22.18 -22.185 -22.19 -22.195 -22.2 -22.205 -22.21 -22.215 -22.22 -22.225 -22.23 -22.235 -22.24 -22.245 -22.25 -22.255 -22.26 -22.265 -22.27 -22.275 -22.28 -22.285 -22.29 -22.295 -22.3 -22.305 -22.31 -22.315 -22.32 -22.325 -22.33 -22.335 -22.34 -22.345 -22.35 -22.355 -22.36 -22.365 -22.37 -22.375 -22.38 -22.385 -22.39 -22.395 -22.4 -22.405 -22.41 -22.415 -22.42 -22.425 -22.43 -22.435 -22.44 -22.445 -22.45 -22.455 -22.46 -22.465 -22.47 -22.475 -22.48 -22.485 -22.49 -22.495 -22.5 -22.505 -22.51 -22.515 -22.52 -22.525 -22.53 -22.535 -22.54 -22.545 -22.55 -22.555 -22.56 -22.565 -22.57 -22.575 -22.58 -22.585 -22.59 -22.595 -22.6 -22.605 -22.61 -22.615 -22.62 -22.625 -22.63 -22.635 -22.64 -22.645 -22.65 -22.655 -22.66 -22.665 -22.67 -22.675 -22.68 -22.685 -22.69 -22.695 -22.7 -22.705 -22.71 -22.715 -22.72 -22.725 -22.73 -22.735 -22.74 -22.745 -22.75 -22.755 -22.76 -22.765 -22.77 -22.775 -22.78 -22.785 -22.79 -22.795 -22.8 -22.805 -22.81 -22.815 -22.82 -22.825 -22.83 -22.835 -22.84 -22.845 -22.85 -22.855 -22.86 -22.865 -22.87 -22.875 -22.88 -22.885 -22.89 -22.895 -22.9 -22.905 -22.91 -22.915 -22.92 -22.925 -22.93 -22.935 -22.94 -22.945 -22.95 -22.955 -22.96 -22.965 -22.97 -22.975 -22.98 -22.985 -22.99 -22.995 -23 -23.005 -23.01 -23.015 -23.02 -23.025 -23.03 -23.035 -23.04 -23.045 -23.05 -23.055 -23.06 -23.065 -23.07 -23.075 -23.08 -23.085 -23.09 -23.095 -23.1 -23.105 -23.11 -23.115 -23.12 -23.125 -23.13 -23.135 -23.14 -23.145 -23.15 -23.155 -23.16 -23.165 -23.17 -23.175 -23.18 -23.185 -23.19 -23.195 -23.2 -23.205 -23.21 -23.215 -23.22 -23.225 -23.23 -23.235 -23.24 -23.245 -23.25 -23.255 -23.26 -23.265 -23.27 -23.275 -23.28 -23.285 -23.29 -23.295 -23.3 -23.305 -23.31 -23.315 -23.32 -23.325 -23.33 -23.335 -23.34 -23.345 -23.35 -23.355 -23.36 -23.365 -23.37 -23.375 -23.38 -23.385 -23.39 -23.395 -23.4 -23.405 -23.41 -23.415 -23.42 -23.425 -23.43 -23.435 -23.44 -23.445 -23.45 -23.455 -23.46 -23.465 -23.47 -23.475 -23.48 -23.485 -23.49 -23.495 -23.5 -23.505 -23.51 -23.515 -23.52 -23.525 -23.53 -23.535 -23.54 -23.545 -23.55 -23.555 -23.56 -23.565 -23.57 -23.575 -23.58 -23.585 -23.59 -23.595 -23.6 -23.605 -23.61 -23.615 -23.62 -23.625 -23.63 -23.635 -23.64 -23.645 -23.65 -23.655 -23.66 -23.665 -23.67 -23.675 -23.68 -23.685 -23.69 -23.695 -23.7 -23.705 -23.71 -23.715 -23.72 -23.725 -23.73 -23.735 -23.74 -23.745 -23.75 -23.755 -23.76 -23.765 -23.77 -23.775 -23.78 -23.785 -23.79 -23.795 -23.8 -23.805 -23.81 -23.815 -23.82 -23.825 -23.83 -23.835 -23.84 -23.845 -23.85 -23.855 -23.86 -23.865 -23.87 -23.875 -23.88 -23.885 -23.89 -23.895 -23.9 -23.905 -23.91 -23.915 -23.92 -23.925 -23.93 -23.935 -23.94 -23.945 -23.95 -23.955 -23.96 -23.965 -23.97 -23.975 -23.98 -23.985 -23.99 -23.995 -24 -24.005 -24.01 -24.015 -24.02 -24.025 -24.03 -24.035 -24.04 -24.045 -24.05 -24.055 -24.06 -24.065 -24.07 -24.075 -24.08 -24.085 -24.09 -24.095 -24.1 -24.105 -24.11 -24.115 -24.12 -24.125 -24.13 -24.135 -24.14 -24.145 -24.15 -24.155 -24.16 -24.165 -24.17 -24.175 -24.18 -24.185 -24.19 -24.195 -24.2 -24.205 -24.21 -24.215 -24.22 -24.225 -24.23 -24.235 -24.24 -24.245 -24.25 -24.255 -24.26 -24.265 -24.27 -24.275 -24.28 -24.285 -24.29 -24.295 -24.3 -24.305 -24.31 -24.315 -24.32 -24.325 -24.33 -24.335 -24.34 -24.345 -24.35 -24.355 -24.36 -24.365 -24.37 -24.375 -24.38 -24.385 -24.39 -24.395 -24.4 -24.405 -24.41 -24.415 -24.42 -24.425 -24.43 -24.435 -24.44 -24.445 -24.45 -24.455 -24.46 -24.465 -24.47 -24.475 -24.48 -24.485 -24.49 -24.495 -24.5 -24.505 -24.51 -24.515 -24.52 -24.525 -24.53 -24.535 -24.54 -24.545 -24.55 -24.555 -24.56 -24.565 -24.57 -24.575 -24.58 -24.585 -24.59 -24.595 -24.6 -24.605 -24.61 -24.615 -24.62 -24.625 -24.63 -24.635 -24.64 -24.645 -24.65 -24.655 -24.66 -24.665 -24.67 -24.675 -24.68 -24.685 -24.69 -24.695 -24.7 -24.705 -24.71 -24.715 -24.72 -24.725 -24.73 -24.735 -24.74 -24.745 -24.75 -24.755 -24.76 -24.765 -24.77 -24.775 -24.78 -24.785 -24.79 -24.795 -24.8 -24.805 -24.81 -24.815 -24.82 -24.825 -24.83 -24.835 -24.84 -24.845 -24.85 -24.855 -24.86 -24.865 -24.87 -24.875 -24.88 -24.885 -24.89 -24.895 -24.9 -24.905 -24.91 -24.915 -24.92 -24.925 -24.93 -24.935 -24.94 -24.945 -24.95 -24.955 -24.96 -24.965 -24.97 -24.975 -24.98 -24.985 -24.99 -24.995 -25 -25.005 -25.01 -25.015 -25.02 -25.025 -25.03 -25.035 -25.04 -25.045 -25.05 -25.055 -25.06 -25.065 -25.07 -25.075 -25.08 -25.085 -25.09 -25.095 -25.1 -25.105 -25.11 -25.115 -25.12 -25.125 -25.13 -25.135 -25.14 -25.145 -25.15 -25.155 -25.16 -25.165 -25.17 -25.175 -25.18 -25.185 -25.19 -25.195 -25.2 -25.205 -25.21 -25.215 -25.22 -25.225 -25.23 -25.235 -25.24 -25.245 -25.25 -25.255 -25.26 -25.265 -25.27 -25.275 -25.28 -25.285 -25.29 -25.295 -25.3 -25.305 -25.31 -25.315 -25.32 -25.325 -25.33 -25.335 -25.34 -25.345 -25.35 -25.355 -25.36 -25.365 -25.37 -25.375 -25.38 -25.385 -25.39 -25.395 -25.4 -25.405 -25.41 -25.415 -25.42 -25.425 -25.43 -25.435 -25.44 -25.445 -25.45 -25.455 -25.46 -25.465 -25.47 -25.475 -25.48 -25.485 -25.49 -25.495 -25.5 -25.505 -25.51 -25.515 -25.52 -25.525 -25.53 -25.535 -25.54 -25.545 -25.55 -25.555 -25.56 -25.565 -25.57 -25.575 -25.58 -25.585 -25.59 -25.595 -25.6 -25.605 -25.61 -25.615 -25.62 -25.625 -25.63 -25.635 -25.64 -25.645 -25.65 -25.655 -25.66 -25.665 -25.67 -25.675 -25.68 -25.685 -25.69 -25.695 -25.7 -25.705 -25.71 -25.715 -25.72 -25.725 -25.73 -25.735 -25.74 -25.745 -25.75 -25.755 -25.76 -25.765 -25.77 -25.775 -25.78 -25.785 -25.79 -25.795 -25.8 -25.805 -25.81 -25.815 -25.82 -25.825 -25.83 -25.835 -25.84 -25.845 -25.85 -25.855 -25.86 -25.865 -25.87 -25.875 -25.88 -25.885 -25.89 -25.895 -25.9 -25.905 -25.91 -25.915 -25.92 -25.925 -25.93 -25.935 -25.94 -25.945 -25.95 -25.955 -25.96 -25.965 -25.97 -25.975 -25.98 -25.985 -25.99 -25.995 -26 -26.005 -26.01 -26.015 -26.02 -26.025 -26.03 -26.035 -26.04 -26.045 -26.05 -26.055 -26.06 -26.065 -26.07 -26.075 -26.08 -26.085 -26.09 -26.095 -26.1 -26.105 -26.11 -26.115 -26.12 -26.125 -26.13 -26.135 -26.14 -26.145 -26.15 -26.155 -26.16 -26.165 -26.17 -26.175 -26.18 -26.185 -26.19 -26.195 -26.2 -26.205 -26.21 -26.215 -26.22 -26.225 -26.23 -26.235 -26.24 -26.245 -26.25 -26.255 -26.26 -26.265 -26.27 -26.275 -26.28 -26.285 -26.29 -26.295 -26.3 -26.305 -26.31 -26.315 -26.32 -26.325 -26.33 -26.335 -26.34 -26.345 -26.35 -26.355 -26.36 -26.365 -26.37 -26.375 -26.38 -26.385 -26.39 -26.395 -26.4 -26.405 -26.41 -26.415 -26.42 -26.425 -26.43 -26.435 -26.44 -26.445 -26.45 -26.455 -26.46 -26.465 -26.47 -26.475 -26.48 -26.485 -26.49 -26.495 -26.5 -26.505 -26.51 -26.515 -26.52 -26.525 -26.53 -26.535 -26.54 -26.545 -26.55 -26.555 -26.56 -26.565 -26.57 -26.575 -26.58 -26.585 -26.59 -26.595 -26.6 -26.605 -26.61 -26.615 -26.62 -26.625 -26.63 -26.635 -26.64 -26.645 -26.65 -26.655 -26.66 -26.665 -26.67 -26.675 -26.68 -26.685 -26.69 -26.695 -26.7 -26.705 -26.71 -26.715 -26.72 -26.725 -26.73 -26.735 -26.74 -26.745 -26.75 -26.755 -26.76 -26.765 -26.77 -26.775 -26.78 -26.785 -26.79 -26.795 -26.8 -26.805 -26.81 -26.815 -26.82 -26.825 -26.83 -26.835 -26.84 -26.845 -26.85 -26.855 -26.86 -26.865 -26.87 -26.875 -26.88 -26.885 -26.89 -26.895 -26.9 -26.905 -26.91 -26.915 -26.92 -26.925 -26.93 -26.935 -26.94 -26.945 -26.95 -26.955 -26.96 -26.965 -26.97 -26.975 -26.98 -26.985 -26.99 -26.995 -27 -27.005 -27.01 -27.015 -27.02 -27.025 -27.03 -27.035 -27.04 -27.045 -27.05 -27.055 -27.06 -27.065 -27.07 -27.075 -27.08 -27.085 -27.09 -27.095 -27.1 -27.105 -27.11 -27.115 -27.12 -27.125 -27.13 -27.135 -27.14 -27.145 -27.15 -27.155 -27.16 -27.165 -27.17 -27.175 -27.18 -27.185 -27.19 -27.195 -27.2 -27.205 -27.21 -27.215 -27.22 -27.225 -27.23 -27.235 -27.24 -27.245 -27.25 -27.255 -27.26 -27.265 -27.27 -27.275 -27.28 -27.285 -27.29 -27.295 -27.3 -27.305 -27.31 -27.315 -27.32 -27.325 -27.33 -27.335 -27.34 -27.345 -27.35 -27.355 -27.36 -27.365 -27.37 -27.375 -27.38 -27.385 -27.39 -27.395 -27.4 -27.405 -27.41 -27.415 -27.42 -27.425 -27.43 -27.435 -27.44 -27.445 -27.45 -27.455 -27.46 -27.465 -27.47 -27.475 -27.48 -27.485 -27.49 -27.495 -27.5 -27.505 -27.51 -27.515 -27.52 -27.525 -27.53 -27.535 -27.54 -27.545 -27.55 -27.555 -27.56 -27.565 -27.57 -27.575 -27.58 -27.585 -27.59 -27.595 -27.6 -27.605 -27.61 -27.615 -27.62 -27.625 -27.63 -27.635 -27.64 -27.645 -27.65 -27.655 -27.66 -27.665 -27.67 -27.675 -27.68 -27.685 -27.69 -27.695 -27.7 -27.705 -27.71 -27.715 -27.72 -27.725 -27.73 -27.735 -27.74 -27.745 -27.75 -27.755 -27.76 -27.765 -27.77 -27.775 -27.78 -27.785 -27.79 -27.795 -27.8 -27.805 -27.81 -27.815 -27.82 -27.825 -27.83 -27.835 -27.84 -27.845 -27.85 -27.855 -27.86 -27.865 -27.87 -27.875 -27.88 -27.885 -27.89 -27.895 -27.9 -27.905 -27.91 -27.915 -27.92 -27.925 -27.93 -27.935 -27.94 -27.945 -27.95 -27.955 -27.96 -27.965 -27.97 -27.975 -27.98 -27.985 -27.99 -27.995 -28 -28.005 -28.01 -28.015 -28.02 -28.025 -28.03 -28.035 -28.04 -28.045 -28.05 -28.055 -28.06 -28.065 -28.07 -28.075 -28.08 -28.085 -28.09 -28.095 -28.1 -28.105 -28.11 -28.115 -28.12 -28.125 -28.13 -28.135 -28.14 -28.145 -28.15 -28.155 -28.16 -28.165 -28.17 -28.175 -28.18 -28.185 -28.19 -28.195 -28.2 -28.205 -28.21 -28.215 -28.22 -28.225 -28.23 -28.235 -28.24 -28.245 -28.25 -28.255 -28.26 -28.265 -28.27 -28.275 -28.28 -28.285 -28.29 -28.295 -28.3 -28.305 -28.31 -28.315 -28.32 -28.325 -28.33 -28.335 -28.34 -28.345 -28.35 -28.355 -28.36 -28.365 -28.37 -28.375 -28.38 -28.385 -28.39 -28.395 -28.4 -28.405 -28.41 -28.415 -28.42 -28.425 -28.43 -28.435 -28.44 -28.445 -28.45 -28.455 -28.46 -28.465 -28.47 -28.475 -28.48 -28.485 -28.49 -28.495 -28.5 -28.505 -28.51 -28.515 -28.52 -28.525 -28.53 -28.535 -28.54 -28.545 -28.55 -28.555 -28.56 -28.565 -28.57 -28.575 -28.58 -28.585 -28.59 -28.595 -28.6 -28.605 -28.61 -28.615 -28.62 -28.625 -28.63 -28.635 -28.64 -28.645 -28.65 -28.655 -28.66 -28.665 -28.67 -28.675 -28.68 -28.685 -28.69 -28.695 -28.7 -28.705 -28.71 -28.715 -28.72 -28.725 -28.73 -28.735 -28.74 -28.745 -28.75 -28.755 -28.76 -28.765 -28.77 -28.775 -28.78 -28.785 -28.79 -28.795 -28.8 -28.805 -28.81 -28.815 -28.82 -28.825 -28.83 -28.835 -28.84 -28.845 -28.85 -28.855 -28.86 -28.865 -28.87 -28.875 -28.88 -28.885 -28.89 -28.895 -28.9 -28.905 -28.91 -28.915 -28.92 -28.925 -28.93 -28.935 -28.94 -28.945 -28.95 -28.955 -28.96 -28.965 -28.97 -28.975 -28.98 -28.985 -28.99 -28.995 -29 -29.005 -29.01 -29.015 -29.02 -29.025 -29.03 -29.035 -29.04 -29.045 -29.05 -29.055 -29.06 -29.065 -29.07 -29.075 -29.08 -29.085 -29.09 -29.095 -29.1 -29.105 -29.11 -29.115 -29.12 -29.125 -29.13 -29.135 -29.14 -29.145 -29.15 -29.155 -29.16 -29.165 -29.17 -29.175 -29.18 -29.185 -29.19 -29.195 -29.2 -29.205 -29.21 -29.215 -29.22 -29.225 -29.23 -29.235 -29.24 -29.245 -29.25 -29.255 -29.26 -29.265 -29.27 -29.275 -29.28 -29.285 -29.29 -29.295 -29.3 -29.305 -29.31 -29.315 -29.32 -29.325 -29.33 -29.335 -29.34 -29.345 -29.35 -29.355 -29.36 -29.365 -29.37 -29.375 -29.38 -29.385 -29.39 -29.395 -29.4 -29.405 -29.41 -29.415 -29.42 -29.425 -29.43 -29.435 -29.44 -29.445 -29.45 -29.455 -29.46 -29.465 -29.47 -29.475 -29.48 -29.485 -29.49 -29.495 -29.5 -29.505 -29.51 -29.515 -29.52 -29.525 -29.53 -29.535 -29.54 -29.545 -29.55 -29.555 -29.56 -29.565 -29.57 -29.575 -29.58 -29.585 -29.59 -29.595 -29.6 -29.605 -29.61 -29.615 -29.62 -29.625 -29.63 -29.635 -29.64 -29.645 -29.65 -29.655 -29.66 -29.665 -29.67 -29.675 -29.68 -29.685 -29.69 -29.695 -29.7 -29.705 -29.71 -29.715 -29.72 -29.725 -29.73 -29.735 -29.74 -29.745 -29.75 -29.755 -29.76 -29.765 -29.77 -29.775 -29.78 -29.785 -29.79 -29.795 -29.8 -29.805 -29.81 -29.815 -29.82 -29.825 -29.83 -29.835 -29.84 -29.845 -29.85 -29.855 -29.86 -29.865 -29.87 -29.875 -29.88 -29.885 -29.89 -29.895 -29.9 -29.905 -29.91 -29.915 -29.92 -29.925 -29.93 -29.935 -29.94 -29.945 -29.95 -29.955 -29.96 -29.965 -29.97 -29.975 -29.98 -29.985 -29.99 -29.995 -30 -30.005 -30.01 -30.015 -30.02 -30.025 -30.03 -30.035 -30.04 -30.045 -30.05 -30.055 -30.06 -30.065 -30.07 -30.075 -30.08 -30.085 -30.09 -30.095 -30.1 -30.105 -30.11 -30.115 -30.12 -30.125 -30.13 -30.135 -30.14 -30.145 -30.15 -30.155 -30.16 -30.165 -30.17 -30.175 -30.18 -30.185 -30.19 -30.195 -30.2 -30.205 -30.21 -30.215 -30.22 -30.225 -30.23 -30.235 -30.24 -30.245 -30.25 -30.255 -30.26 -30.265 -30.27 -30.275 -30.28 -30.285 -30.29 -30.295 -30.3 -30.305 -30.31 -30.315 -30.32 -30.325 -30.33 -30.335 -30.34 -30.345 -30.35 -30.355 -30.36 -30.365 -30.37 -30.375 -30.38 -30.385 -30.39 -30.395 -30.4 -30.405 -30.41 -30.415 -30.42 -30.425 -30.43 -30.435 -30.44 -30.445 -30.45 -30.455 -30.46 -30.465 -30.47 -30.475 -30.48 -30.485 -30.49 -30.495 -30.5 -30.505 -30.51 -30.515 -30.52 -30.525 -30.53 -30.535 -30.54 -30.545 -30.55 -30.555 -30.56 -30.565 -30.57 -30.575 -30.58 -30.585 -30.59 -30.595 -30.6 -30.605 -30.61 -30.615 -30.62 -30.625 -30.63 -30.635 -30.64 -30.645 -30.65 -30.655 -30.66 -30.665 -30.67 -30.675 -30.68 -30.685 -30.69 -30.695 -30.7 -30.705 -30.71 -30.715 -30.72 -30.725 -30.73 -30.735 -30.74 -30.745 -30.75 -30.755 -30.76 -30.765 -30.77 -30.775 -30.78 -30.785 -30.79 -30.795 -30.8 -30.805 -30.81 -30.815 -30.82 -30.825 -30.83 -30.835 -30.84 -30.845 -30.85 -30.855 -30.86 -30.865 -30.87 -30.875 -30.88 -30.885 -30.89 -30.895 -30.9 -30.905 -30.91 -30.915 -30.92 -30.925 -30.93 -30.935 -30.94 -30.945 -30.95 -30.955 -30.96 -30.965 -30.97 -30.975 -30.98 -30.985 -30.99 -30.995 -31 -31.005 -31.01 -31.015 -31.02 -31.025 -31.03 -31.035 -31.04 -31.045 -31.05 -31.055 -31.06 -31.065 -31.07 -31.075 -31.08 -31.085 -31.09 -31.095 -31.1 -31.105 -31.11 -31.115 -31.12 -31.125 -31.13 -31.135 -31.14 -31.145 -31.15 -31.155 -31.16 -31.165 -31.17 -31.175 -31.18 -31.185 -31.19 -31.195 -31.2 -31.205 -31.21 -31.215 -31.22 -31.225 -31.23 -31.235 -31.24 -31.245 -31.25 -31.255 -31.26 -31.265 -31.27 -31.275 -31.28 -31.285 -31.29 -31.295 -31.3 -31.305 -31.31 -31.315 -31.32 -31.325 -31.33 -31.335 -31.34 -31.345 -31.35 -31.355 -31.36 -31.365 -31.37 -31.375 -31.38 -31.385 -31.39 -31.395 -31.4 -31.405 -31.41 -31.415 -31.42 -31.425 -31.43 -31.435 -31.44 -31.445 -31.45 -31.455 -31.46 -31.465 -31.47 -31.475 -31.48 -31.485 -31.49 -31.495 -31.5 -31.505 -31.51 -31.515 -31.52 -31.525 -31.53 -31.535 -31.54 -31.545 -31.55 -31.555 -31.56 -31.565 -31.57 -31.575 -31.58 -31.585 -31.59 -31.595 -31.6 -31.605 -31.61 -31.615 -31.62 -31.625 -31.63 -31.635 -31.64 -31.645 -31.65 -31.655 -31.66 -31.665 -31.67 -31.675 -31.68 -31.685 -31.69 -31.695 -31.7 -31.705 -31.71 -31.715 -31.72 -31.725 -31.73 -31.735 -31.74 -31.745 -31.75 -31.755 -31.76 -31.765 -31.77 -31.775 -31.78 -31.785 -31.79 -31.795 -31.8 -31.805 -31.81 -31.815 -31.82 -31.825 -31.83 -31.835 -31.84 -31.845 -31.85 -31.855 -31.86 -31.865 -31.87 -31.875 -31.88 -31.885 -31.89 -31.895 -31.9 -31.905 -31.91 -31.915 -31.92 -31.925 -31.93 -31.935 -31.94 -31.945 -31.95 -31.955 -31.96 -31.965 -31.97 -31.975 -31.98 -31.985 -31.99 -31.995 -32 -32.005 -32.01 -32.015 -32.02 -32.025 -32.03 -32.035 -32.04 -32.045 -32.05 -32.055 -32.06 -32.065 -32.07 -32.075 -32.08 -32.085 -32.09 -32.095 -32.1 -32.105 -32.11 -32.115 -32.12 -32.125 -32.13 -32.135 -32.14 -32.145 -32.15 -32.155 -32.16 -32.165 -32.17 -32.175 -32.18 -32.185 -32.19 -32.195 -32.2 -32.205 -32.21 -32.215 -32.22 -32.225 -32.23 -32.235 -32.24 -32.245 -32.25 -32.255 -32.26 -32.265 -32.27 -32.275 -32.28 -32.285 -32.29 -32.295 -32.3 -32.305 -32.31 -32.315 -32.32 -32.325 -32.33 -32.335 -32.34 -32.345 -32.35 -32.355 -32.36 -32.365 -32.37 -32.375 -32.38 -32.385 -32.39 -32.395 -32.4 -32.405 -32.41 -32.415 -32.42 -32.425 -32.43 -32.435 -32.44 -32.445 -32.45 -32.455 -32.46 -32.465 -32.47 -32.475 -32.48 -32.485 -32.49 -32.495 -32.5 -32.505 -32.51 -32.515 -32.52 -32.525 -32.53 -32.535 -32.54 -32.545 -32.55 -32.555 -32.56 -32.565 -32.57 -32.575 -32.58 -32.585 -32.59 -32.595 -32.6 -32.605 -32.61 -32.615 -32.62 -32.625 -32.63 -32.635 -32.64 -32.645 -32.65 -32.655 -32.66 -32.665 -32.67 -32.675 -32.68 -32.685 -32.69 -32.695 -32.7 -32.705 -32.71 -32.715 -32.72 -32.725 -32.73 -32.735 -32.74 -32.745 -32.75 -32.755 -32.76 -32.765 -32.77 -32.775 -32.78 -32.785 -32.79 -32.795 -32.8 -32.805 -32.81 -32.815 -32.82 -32.825 -32.83 -32.835 -32.84 -32.845 -32.85 -32.855 -32.86 -32.865 -32.87 -32.875 -32.88 -32.885 -32.89 -32.895 -32.9 -32.905 -32.91 -32.915 -32.92 -32.925 -32.93 -32.935 -32.94 -32.945 -32.95 -32.955 -32.96 -32.965 -32.97 -32.975 -32.98 -32.985 -32.99 -32.995 -33 -33.005 -33.01 -33.015 -33.02 -33.025 -33.03 -33.035 -33.04 -33.045 -33.05 -33.055 -33.06 -33.065 -33.07 -33.075 -33.08 -33.085 -33.09 -33.095 -33.1 -33.105 -33.11 -33.115 -33.12 -33.125 -33.13 -33.135 -33.14 -33.145 -33.15 -33.155 -33.16 -33.165 -33.17 -33.175 -33.18 -33.185 -33.19 -33.195 -33.2 -33.205 -33.21 -33.215 -33.22 -33.225 -33.23 -33.235 -33.24 -33.245 -33.25 -33.255 -33.26 -33.265 -33.27 -33.275 -33.28 -33.285 -33.29 -33.295 -33.3 -33.305 -33.31 -33.315 -33.32 -33.325 -33.33 -33.335 -33.34 -33.345 -33.35 -33.355 -33.36 -33.365 -33.37 -33.375 -33.38 -33.385 -33.39 -33.395 -33.4 -33.405 -33.41 -33.415 -33.42 -33.425 -33.43 -33.435 -33.44 -33.445 -33.45 -33.455 -33.46 -33.465 -33.47 -33.475 -33.48 -33.485 -33.49 -33.495 -33.5 -33.505 -33.51 -33.515 -33.52 -33.525 -33.53 -33.535 -33.54 -33.545 -33.55 -33.555 -33.56 -33.565 -33.57 -33.575 -33.58 -33.585 -33.59 -33.595 -33.6 -33.605 -33.61 -33.615 -33.62 -33.625 -33.63 -33.635 -33.64 -33.645 -33.65 -33.655 -33.66 -33.665 -33.67 -33.675 -33.68 -33.685 -33.69 -33.695 -33.7 -33.705 -33.71 -33.715 -33.72 -33.725 -33.73 -33.735 -33.74 -33.745 -33.75 -33.755 -33.76 -33.765 -33.77 -33.775 -33.78 -33.785 -33.79 -33.795 -33.8 -33.805 -33.81 -33.815 -33.82 -33.825 -33.83 -33.835 -33.84 -33.845 -33.85 -33.855 -33.86 -33.865 -33.87 -33.875 -33.88 -33.885 -33.89 -33.895 -33.9 -33.905 -33.91 -33.915 -33.92 -33.925 -33.93 -33.935 -33.94 -33.945 -33.95 -33.955 -33.96 -33.965 -33.97 -33.975 -33.98 -33.985 -33.99 -33.995 -34 -34.005 -34.01 -34.015 -34.02 -34.025 -34.03 -34.035 -34.04 -34.045 -34.05 -34.055 -34.06 -34.065 -34.07 -34.075 -34.08 -34.085 -34.09 -34.095 -34.1 -34.105 -34.11 -34.115 -34.12 -34.125 -34.13 -34.135 -34.14 -34.145 -34.15 -34.155 -34.16 -34.165 -34.17 -34.175 -34.18 -34.185 -34.19 -34.195 -34.2 -34.205 -34.21 -34.215 -34.22 -34.225 -34.23 -34.235 -34.24 -34.245 -34.25 -34.255 -34.26 -34.265 -34.27 -34.275 -34.28 -34.285 -34.29 -34.295 -34.3 -34.305 -34.31 -34.315 -34.32 -34.325 -34.33 -34.335 -34.34 -34.345 -34.35 -34.355 -34.36 -34.365 -34.37 -34.375 -34.38 -34.385 -34.39 -34.395 -34.4 -34.405 -34.41 -34.415 -34.42 -34.425 -34.43 -34.435 -34.44 -34.445 -34.45 -34.455 -34.46 -34.465 -34.47 -34.475 -34.48 -34.485 -34.49 -34.495 -34.5 -34.505 -34.51 -34.515 -34.52 -34.525 -34.53 -34.535 -34.54 -34.545 -34.55 -34.555 -34.56 -34.565 -34.57 -34.575 -34.58 -34.585 -34.59 -34.595 -34.6 -34.605 -34.61 -34.615 -34.62 -34.625 -34.63 -34.635 -34.64 -34.645 -34.65 -34.655 -34.66 -34.665 -34.67 -34.675 -34.68 -34.685 -34.69 -34.695 -34.7 -34.705 -34.71 -34.715 -34.72 -34.725 -34.73 -34.735 -34.74 -34.745 -34.75 -34.755 -34.76 -34.765 -34.77 -34.775 -34.78 -34.785 -34.79 -34.795 -34.8 -34.805 -34.81 -34.815 -34.82 -34.825 -34.83 -34.835 -34.84 -34.845 -34.85 -34.855 -34.86 -34.865 -34.87 -34.875 -34.88 -34.885 -34.89 -34.895 -34.9 -34.905 -34.91 -34.915 -34.92 -34.925 -34.93 -34.935 -34.94 -34.945 -34.95 -34.955 -34.96 -34.965 -34.97 -34.975 -34.98 -34.985 -34.99 -34.995 -35 -35.005 -35.01 -35.015 -35.02 -35.025 -35.03 -35.035 -35.04 -35.045 -35.05 -35.055 -35.06 -35.065 -35.07 -35.075 -35.08 -35.085 -35.09 -35.095 -35.1 -35.105 -35.11 -35.115 -35.12 -35.125 -35.13 -35.135 -35.14 -35.145 -35.15 -35.155 -35.16 -35.165 -35.17 -35.175 -35.18 -35.185 -35.19 -35.195 -35.2 -35.205 -35.21 -35.215 -35.22 -35.225 -35.23 -35.235 -35.24 -35.245 -35.25 -35.255 -35.26 -35.265 -35.27 -35.275 -35.28 -35.285 -35.29 -35.295 -35.3 -35.305 -35.31 -35.315 -35.32 -35.325 -35.33 -35.335 -35.34 -35.345 -35.35 -35.355 -35.36 -35.365 -35.37 -35.375 -35.38 -35.385 -35.39 -35.395 -35.4 -35.405 -35.41 -35.415 -35.42 -35.425 -35.43 -35.435 -35.44 -35.445 -35.45 -35.455 -35.46 -35.465 -35.47 -35.475 -35.48 -35.485 -35.49 -35.495 -35.5 -35.505 -35.51 -35.515 -35.52 -35.525 -35.53 -35.535 -35.54 -35.545 -35.55 -35.555 -35.56 -35.565 -35.57 -35.575 -35.58 -35.585 -35.59 -35.595 -35.6 -35.605 -35.61 -35.615 -35.62 -35.625 -35.63 -35.635 -35.64 -35.645 -35.65 -35.655 -35.66 -35.665 -35.67 -35.675 -35.68 -35.685 -35.69 -35.695 -35.7 -35.705 -35.71 -35.715 -35.72 -35.725 -35.73 -35.735 -35.74 -35.745 -35.75 -35.755 -35.76 -35.765 -35.77 -35.775 -35.78 -35.785 -35.79 -35.795 -35.8 -35.805 -35.81 -35.815 -35.82 -35.825 -35.83 -35.835 -35.84 -35.845 -35.85 -35.855 -35.86 -35.865 -35.87 -35.875 -35.88 -35.885 -35.89 -35.895 -35.9 -35.905 -35.91 -35.915 -35.92 -35.925 -35.93 -35.935 -35.94 -35.945 -35.95 -35.955 -35.96 -35.965 -35.97 -35.975 -35.98 -35.985 -35.99 -35.995 -36 -36.005 -36.01 -36.015 -36.02 -36.025 -36.03 -36.035 -36.04 -36.045 -36.05 -36.055 -36.06 -36.065 -36.07 -36.075 -36.08 -36.085 -36.09 -36.095 -36.1 -36.105 -36.11 -36.115 -36.12 -36.125 -36.13 -36.135 -36.14 -36.145 -36.15 -36.155 -36.16 -36.165 -36.17 -36.175 -36.18 -36.185 -36.19 -36.195 -36.2 -36.205 -36.21 -36.215 -36.22 -36.225 -36.23 -36.235 -36.24 -36.245 -36.25 -36.255 -36.26 -36.265 -36.27 -36.275 -36.28 -36.285 -36.29 -36.295 -36.3 -36.305 -36.31 -36.315 -36.32 -36.325 -36.33 -36.335 -36.34 -36.345 -36.35 -36.355 -36.36 -36.365 -36.37 -36.375 -36.38 -36.385 -36.39 -36.395 -36.4 -36.405 -36.41 -36.415 -36.42 -36.425 -36.43 -36.435 -36.44 -36.445 -36.45 -36.455 -36.46 -36.465 -36.47 -36.475 -36.48 -36.485 -36.49 -36.495 -36.5 -36.505 -36.51 -36.515 -36.52 -36.525 -36.53 -36.535 -36.54 -36.545 -36.55 -36.555 -36.56 -36.565 -36.57 -36.575 -36.58 -36.585 -36.59 -36.595 -36.6 -36.605 -36.61 -36.615 -36.62 -36.625 -36.63 -36.635 -36.64 -36.645 -36.65 -36.655 -36.66 -36.665 -36.67 -36.675 -36.68 -36.685 -36.69 -36.695 -36.7 -36.705 -36.71 -36.715 -36.72 -36.725 -36.73 -36.735 -36.74 -36.745 -36.75 -36.755 -36.76 -36.765 -36.77 -36.775 -36.78 -36.785 -36.79 -36.795 -36.8 -36.805 -36.81 -36.815 -36.82 -36.825 -36.83 -36.835 -36.84 -36.845 -36.85 -36.855 -36.86 -36.865 -36.87 -36.875 -36.88 -36.885 -36.89 -36.895 -36.9 -36.905 -36.91 -36.915 -36.92 -36.925 -36.93 -36.935 -36.94 -36.945 -36.95 -36.955 -36.96 -36.965 -36.97 -36.975 -36.98 -36.985 -36.99 -36.995 -37 -37.005 -37.01 -37.015 -37.02 -37.025 -37.03 -37.035 -37.04 -37.045 -37.05 -37.055 -37.06 -37.065 -37.07 -37.075 -37.08 -37.085 -37.09 -37.095 -37.1 -37.105 -37.11 -37.115 -37.12 -37.125 -37.13 -37.135 -37.14 -37.145 -37.15 -37.155 -37.16 -37.165 -37.17 -37.175 -37.18 -37.185 -37.19 -37.195 -37.2 -37.205 -37.21 -37.215 -37.22 -37.225 -37.23 -37.235 -37.24 -37.245 -37.25 -37.255 -37.26 -37.265 -37.27 -37.275 -37.28 -37.285 -37.29 -37.295 -37.3 -37.305 -37.31 -37.315 -37.32 -37.325 -37.33 -37.335 -37.34 -37.345 -37.35 -37.355 -37.36 -37.365 -37.37 -37.375 -37.38 -37.385 -37.39 -37.395 -37.4 -37.405 -37.41 -37.415 -37.42 -37.425 -37.43 -37.435 -37.44 -37.445 -37.45 -37.455 -37.46 -37.465 -37.47 -37.475 -37.48 -37.485 -37.49 -37.495 -37.5 -37.505 -37.51 -37.515 -37.52 -37.525 -37.53 -37.535 -37.54 -37.545 -37.55 -37.555 -37.56 -37.565 -37.57 -37.575 -37.58 -37.585 -37.59 -37.595 -37.6 -37.605 -37.61 -37.615 -37.62 -37.625 -37.63 -37.635 -37.64 -37.645 -37.65 -37.655 -37.66 -37.665 -37.67 -37.675 -37.68 -37.685 -37.69 -37.695 -37.7 -37.705 -37.71 -37.715 -37.72 -37.725 -37.73 -37.735 -37.74 -37.745 -37.75 -37.755 -37.76 -37.765 -37.77 -37.775 -37.78 -37.785 -37.79 -37.795 -37.8 -37.805 -37.81 -37.815 -37.82 -37.825 -37.83 -37.835 -37.84 -37.845 -37.85 -37.855 -37.86 -37.865 -37.87 -37.875 -37.88 -37.885 -37.89 -37.895 -37.9 -37.905 -37.91 -37.915 -37.92 -37.925 -37.93 -37.935 -37.94 -37.945 -37.95 -37.955 -37.96 -37.965 -37.97 -37.975 -37.98 -37.985 -37.99 -37.995 -38 -38.005 -38.01 -38.015 -38.02 -38.025 -38.03 -38.035 -38.04 -38.045 -38.05 -38.055 -38.06 -38.065 -38.07 -38.075 -38.08 -38.085 -38.09 -38.095 -38.1 -38.105 -38.11 -38.115 -38.12 -38.125 -38.13 -38.135 -38.14 -38.145 -38.15 -38.155 -38.16 -38.165 -38.17 -38.175 -38.18 -38.185 -38.19 -38.195 -38.2 -38.205 -38.21 -38.215 -38.22 -38.225 -38.23 -38.235 -38.24 -38.245 -38.25 -38.255 -38.26 -38.265 -38.27 -38.275 -38.28 -38.285 -38.29 -38.295 -38.3 -38.305 -38.31 -38.315 -38.32 -38.325 -38.33 -38.335 -38.34 -38.345 -38.35 -38.355 -38.36 -38.365 -38.37 -38.375 -38.38 -38.385 -38.39 -38.395 -38.4 -38.405 -38.41 -38.415 -38.42 -38.425 -38.43 -38.435 -38.44 -38.445 -38.45 -38.455 -38.46 -38.465 -38.47 -38.475 -38.48 -38.485 -38.49 -38.495 -38.5 -38.505 -38.51 -38.515 -38.52 -38.525 -38.53 -38.535 -38.54 -38.545 -38.55 -38.555 -38.56 -38.565 -38.57 -38.575 -38.58 -38.585 -38.59 -38.595 -38.6 -38.605 -38.61 -38.615 -38.62 -38.625 -38.63 -38.635 -38.64 -38.645 -38.65 -38.655 -38.66 -38.665 -38.67 -38.675 -38.68 -38.685 -38.69 -38.695 -38.7 -38.705 -38.71 -38.715 -38.72 -38.725 -38.73 -38.735 -38.74 -38.745 -38.75 -38.755 -38.76 -38.765 -38.77 -38.775 -38.78 -38.785 -38.79 -38.795 -38.8 -38.805 -38.81 -38.815 -38.82 -38.825 -38.83 -38.835 -38.84 -38.845 -38.85 -38.855 -38.86 -38.865 -38.87 -38.875 -38.88 -38.885 -38.89 -38.895 -38.9 -38.905 -38.91 -38.915 -38.92 -38.925 -38.93 -38.935 -38.94 -38.945 -38.95 -38.955 -38.96 -38.965 -38.97 -38.975 -38.98 -38.985 -38.99 -38.995 -39 -39.005 -39.01 -39.015 -39.02 -39.025 -39.03 -39.035 -39.04 -39.045 -39.05 -39.055 -39.06 -39.065 -39.07 -39.075 -39.08 -39.085 -39.09 -39.095 -39.1 -39.105 -39.11 -39.115 -39.12 -39.125 -39.13 -39.135 -39.14 -39.145 -39.15 -39.155 -39.16 -39.165 -39.17 -39.175 -39.18 -39.185 -39.19 -39.195 -39.2 -39.205 -39.21 -39.215 -39.22 -39.225 -39.23 -39.235 -39.24 -39.245 -39.25 -39.255 -39.26 -39.265 -39.27 -39.275 -39.28 -39.285 -39.29 -39.295 -39.3 -39.305 -39.31 -39.315 -39.32 -39.325 -39.33 -39.335 -39.34 -39.345 -39.35 -39.355 -39.36 -39.365 -39.37 -39.375 -39.38 -39.385 -39.39 -39.395 -39.4 -39.405 -39.41 -39.415 -39.42 -39.425 -39.43 -39.435 -39.44 -39.445 -39.45 -39.455 -39.46 -39.465 -39.47 -39.475 -39.48 -39.485 -39.49 -39.495 -39.5 -39.505 -39.51 -39.515 -39.52 -39.525 -39.53 -39.535 -39.54 -39.545 -39.55 -39.555 -39.56 -39.565 -39.57 -39.575 -39.58 -39.585 -39.59 -39.595 -39.6 -39.605 -39.61 -39.615 -39.62 -39.625 -39.63 -39.635 -39.64 -39.645 -39.65 -39.655 -39.66 -39.665 -39.67 -39.675 -39.68 -39.685 -39.69 -39.695 -39.7 -39.705 -39.71 -39.715 -39.72 -39.725 -39.73 -39.735 -39.74 -39.745 -39.75 -39.755 -39.76 -39.765 -39.77 -39.775 -39.78 -39.785 -39.79 -39.795 -39.8 -39.805 -39.81 -39.815 -39.82 -39.825 -39.83 -39.835 -39.84 -39.845 -39.85 -39.855 -39.86 -39.865 -39.87 -39.875 -39.88 -39.885 -39.89 -39.895 -39.9 -39.905 -39.91 -39.915 -39.92 -39.925 -39.93 -39.935 -39.94 -39.945 -39.95 -39.955 -39.96 -39.965 -39.97 -39.975 -39.98 -39.985 -39.99 -39.995 -40 -40.005 -40.01 -40.015 -40.02 -40.025 -40.03 -40.035 -40.04 -40.045 -40.05 -40.055 -40.06 -40.065 -40.07 -40.075 -40.08 -40.085 -40.09 -40.095 -40.1 -40.105 -40.11 -40.115 -40.12 -40.125 -40.13 -40.135 -40.14 -40.145 -40.15 -40.155 -40.16 -40.165 -40.17 -40.175 -40.18 -40.185 -40.19 -40.195 -40.2 -40.205 -40.21 -40.215 -40.22 -40.225 -40.23 -40.235 -40.24 -40.245 -40.25 -40.255 -40.26 -40.265 -40.27 -40.275 -40.28 -40.285 -40.29 -40.295 -40.3 -40.305 -40.31 -40.315 -40.32 -40.325 -40.33 -40.335 -40.34 -40.345 -40.35 -40.355 -40.36 -40.365 -40.37 -40.375 -40.38 -40.385 -40.39 -40.395 -40.4 -40.405 -40.41 -40.415 -40.42 -40.425 -40.43 -40.435 -40.44 -40.445 -40.45 -40.455 -40.46 -40.465 -40.47 -40.475 -40.48 -40.485 -40.49 -40.495 -40.5 -40.505 -40.51 -40.515 -40.52 -40.525 -40.53 -40.535 -40.54 -40.545 -40.55 -40.555 -40.56 -40.565 -40.57 -40.575 -40.58 -40.585 -40.59 -40.595 -40.6 -40.605 -40.61 -40.615 -40.62 -40.625 -40.63 -40.635 -40.64 -40.645 -40.65 -40.655 -40.66 -40.665 -40.67 -40.675 -40.68 -40.685 -40.69 -40.695 -40.7 -40.705 -40.71 -40.715 -40.72 -40.725 -40.73 -40.735 -40.74 -40.745 -40.75 -40.755 -40.76 -40.765 -40.77 -40.775 -40.78 -40.785 -40.79 -40.795 -40.8 -40.805 -40.81 -40.815 -40.82 -40.825 -40.83 -40.835 -40.84 -40.845 -40.85 -40.855 -40.86 -40.865 -40.87 -40.875 -40.88 -40.885 -40.89 -40.895 -40.9 -40.905 -40.91 -40.915 -40.92 -40.925 -40.93 -40.935 -40.94 -40.945 -40.95 -40.955 -40.96 -40.965 -40.97 -40.975 -40.98 -40.985 -40.99 -40.995 -41 -41.005 -41.01 -41.015 -41.02 -41.025 -41.03 -41.035 -41.04 -41.045 -41.05 -41.055 -41.06 -41.065 -41.07 -41.075 -41.08 -41.085 -41.09 -41.095 -41.1 -41.105 -41.11 -41.115 -41.12 -41.125 -41.13 -41.135 -41.14 -41.145 -41.15 -41.155 -41.16 -41.165 -41.17 -41.175 -41.18 -41.185 -41.19 -41.195 -41.2 -41.205 -41.21 -41.215 -41.22 -41.225 -41.23 -41.235 -41.24 -41.245 -41.25 -41.255 -41.26 -41.265 -41.27 -41.275 -41.28 -41.285 -41.29 -41.295 -41.3 -41.305 -41.31 -41.315 -41.32 -41.325 -41.33 -41.335 -41.34 -41.345 -41.35 -41.355 -41.36 -41.365 -41.37 -41.375 -41.38 -41.385 -41.39 -41.395 -41.4 -41.405 -41.41 -41.415 -41.42 -41.425 -41.43 -41.435 -41.44 -41.445 -41.45 -41.455 -41.46 -41.465 -41.47 -41.475 -41.48 -41.485 -41.49 -41.495 -41.5 -41.505 -41.51 -41.515 -41.52 -41.525 -41.53 -41.535 -41.54 -41.545 -41.55 -41.555 -41.56 -41.565 -41.57 -41.575 -41.58 -41.585 -41.59 -41.595 -41.6 -41.605 -41.61 -41.615 -41.62 -41.625 -41.63 -41.635 -41.64 -41.645 -41.65 -41.655 -41.66 -41.665 -41.67 -41.675 -41.68 -41.685 -41.69 -41.695 -41.7 -41.705 -41.71 -41.715 -41.72 -41.725 -41.73 -41.735 -41.74 -41.745 -41.75 -41.755 -41.76 -41.765 -41.77 -41.775 -41.78 -41.785 -41.79 -41.795 -41.8 -41.805 -41.81 -41.815 -41.82 -41.825 -41.83 -41.835 -41.84 -41.845 -41.85 -41.855 -41.86 -41.865 -41.87 -41.875 -41.88 -41.885 -41.89 -41.895 -41.9 -41.905 -41.91 -41.915 -41.92 -41.925 -41.93 -41.935 -41.94 -41.945 -41.95 -41.955 -41.96 -41.965 -41.97 -41.975 -41.98 -41.985 -41.99 -41.995 -42 -42.005 -42.01 -42.015 -42.02 -42.025 -42.03 -42.035 -42.04 -42.045 -42.05 -42.055 -42.06 -42.065 -42.07 -42.075 -42.08 -42.085 -42.09 -42.095 -42.1 -42.105 -42.11 -42.115 -42.12 -42.125 -42.13 -42.135 -42.14 -42.145 -42.15 -42.155 -42.16 -42.165 -42.17 -42.175 -42.18 -42.185 -42.19 -42.195 -42.2 -42.205 -42.21 -42.215 -42.22 -42.225 -42.23 -42.235 -42.24 -42.245 -42.25 -42.255 -42.26 -42.265 -42.27 -42.275 -42.28 -42.285 -42.29 -42.295 -42.3 -42.305 -42.31 -42.315 -42.32 -42.325 -42.33 -42.335 -42.34 -42.345 -42.35 -42.355 -42.36 -42.365 -42.37 -42.375 -42.38 -42.385 -42.39 -42.395 -42.4 -42.405 -42.41 -42.415 -42.42 -42.425 -42.43 -42.435 -42.44 -42.445 -42.45 -42.455 -42.46 -42.465 -42.47 -42.475 -42.48 -42.485 -42.49 -42.495 -42.5 -42.505 -42.51 -42.515 -42.52 -42.525 -42.53 -42.535 -42.54 -42.545 -42.55 -42.555 -42.56 -42.565 -42.57 -42.575 -42.58 -42.585 -42.59 -42.595 -42.6 -42.605 -42.61 -42.615 -42.62 -42.625 -42.63 -42.635 -42.64 -42.645 -42.65 -42.655 -42.66 -42.665 -42.67 -42.675 -42.68 -42.685 -42.69 -42.695 -42.7 -42.705 -42.71 -42.715 -42.72 -42.725 -42.73 -42.735 -42.74 -42.745 -42.75 -42.755 -42.76 -42.765 -42.77 -42.775 -42.78 -42.785 -42.79 -42.795 -42.8 -42.805 -42.81 -42.815 -42.82 -42.825 -42.83 -42.835 -42.84 -42.845 -42.85 -42.855 -42.86 -42.865 -42.87 -42.875 -42.88 -42.885 -42.89 -42.895 -42.9 -42.905 -42.91 -42.915 -42.92 -42.925 -42.93 -42.935 -42.94 -42.945 -42.95 -42.955 -42.96 -42.965 -42.97 -42.975 -42.98 -42.985 -42.99 -42.995 -43 -43.005 -43.01 -43.015 -43.02 -43.025 -43.03 -43.035 -43.04 -43.045 -43.05 -43.055 -43.06 -43.065 -43.07 -43.075 -43.08 -43.085 -43.09 -43.095 -43.1 -43.105 -43.11 -43.115 -43.12 -43.125 -43.13 -43.135 -43.14 -43.145 -43.15 -43.155 -43.16 -43.165 -43.17 -43.175 -43.18 -43.185 -43.19 -43.195 -43.2 -43.205 -43.21 -43.215 -43.22 -43.225 -43.23 -43.235 -43.24 -43.245 -43.25 -43.255 -43.26 -43.265 -43.27 -43.275 -43.28 -43.285 -43.29 -43.295 -43.3 -43.305 -43.31 -43.315 -43.32 -43.325 -43.33 -43.335 -43.34 -43.345 -43.35 -43.355 -43.36 -43.365 -43.37 -43.375 -43.38 -43.385 -43.39 -43.395 -43.4 -43.405 -43.41 -43.415 -43.42 -43.425 -43.43 -43.435 -43.44 -43.445 -43.45 -43.455 -43.46 -43.465 -43.47 -43.475 -43.48 -43.485 -43.49 -43.495 -43.5 -43.505 -43.51 -43.515 -43.52 -43.525 -43.53 -43.535 -43.54 -43.545 -43.55 -43.555 -43.56 -43.565 -43.57 -43.575 -43.58 -43.585 -43.59 -43.595 -43.6 -43.605 -43.61 -43.615 -43.62 -43.625 -43.63 -43.635 -43.64 -43.645 -43.65 -43.655 -43.66 -43.665 -43.67 -43.675 -43.68 -43.685 -43.69 -43.695 -43.7 -43.705 -43.71 -43.715 -43.72 -43.725 -43.73 -43.735 -43.74 -43.745 -43.75 -43.755 -43.76 -43.765 -43.77 -43.775 -43.78 -43.785 -43.79 -43.795 -43.8 -43.805 -43.81 -43.815 -43.82 -43.825 -43.83 -43.835 -43.84 -43.845 -43.85 -43.855 -43.86 -43.865 -43.87 -43.875 -43.88 -43.885 -43.89 -43.895 -43.9 -43.905 -43.91 -43.915 -43.92 -43.925 -43.93 -43.935 -43.94 -43.945 -43.95 -43.955 -43.96 -43.965 -43.97 -43.975 -43.98 -43.985 -43.99 -43.995 -44 -44.005 -44.01 -44.015 -44.02 -44.025 -44.03 -44.035 -44.04 -44.045 -44.05 -44.055 -44.06 -44.065 -44.07 -44.075 -44.08 -44.085 -44.09 -44.095 -44.1 -44.105 -44.11 -44.115 -44.12 -44.125 -44.13 -44.135 -44.14 -44.145 -44.15 -44.155 -44.16 -44.165 -44.17 -44.175 -44.18 -44.185 -44.19 -44.195 -44.2 -44.205 -44.21 -44.215 -44.22 -44.225 -44.23 -44.235 -44.24 -44.245 -44.25 -44.255 -44.26 -44.265 -44.27 -44.275 -44.28 -44.285 -44.29 -44.295 -44.3 -44.305 -44.31 -44.315 -44.32 -44.325 -44.33 -44.335 -44.34 -44.345 -44.35 -44.355 -44.36 -44.365 -44.37 -44.375 -44.38 -44.385 -44.39 -44.395 -44.4 -44.405 -44.41 -44.415 -44.42 -44.425 -44.43 -44.435 -44.44 -44.445 -44.45 -44.455 -44.46 -44.465 -44.47 -44.475 -44.48 -44.485 -44.49 -44.495 -44.5 -44.505 -44.51 -44.515 -44.52 -44.525 -44.53 -44.535 -44.54 -44.545 -44.55 -44.555 -44.56 -44.565 -44.57 -44.575 -44.58 -44.585 -44.59 -44.595 -44.6 -44.605 -44.61 -44.615 -44.62 -44.625 -44.63 -44.635 -44.64 -44.645 -44.65 -44.655 -44.66 -44.665 -44.67 -44.675 -44.68 -44.685 -44.69 -44.695 -44.7 -44.705 -44.71 -44.715 -44.72 -44.725 -44.73 -44.735 -44.74 -44.745 -44.75 -44.755 -44.76 -44.765 -44.77 -44.775 -44.78 -44.785 -44.79 -44.795 -44.8 -44.805 -44.81 -44.815 -44.82 -44.825 -44.83 -44.835 -44.84 -44.845 -44.85 -44.855 -44.86 -44.865 -44.87 -44.875 -44.88 -44.885 -44.89 -44.895 -44.9 -44.905 -44.91 -44.915 -44.92 -44.925 -44.93 -44.935 -44.94 -44.945 -44.95 -44.955 -44.96 -44.965 -44.97 -44.975 -44.98 -44.985 -44.99 -44.995 -45 -45.005 -45.01 -45.015 -45.02 -45.025 -45.03 -45.035 -45.04 -45.045 -45.05 -45.055 -45.06 -45.065 -45.07 -45.075 -45.08 -45.085 -45.09 -45.095 -45.1 -45.105 -45.11 -45.115 -45.12 -45.125 -45.13 -45.135 -45.14 -45.145 -45.15 -45.155 -45.16 -45.165 -45.17 -45.175 -45.18 -45.185 -45.19 -45.195 -45.2 -45.205 -45.21 -45.215 -45.22 -45.225 -45.23 -45.235 -45.24 -45.245 -45.25 -45.255 -45.26 -45.265 -45.27 -45.275 -45.28 -45.285 -45.29 -45.295 -45.3 -45.305 -45.31 -45.315 -45.32 -45.325 -45.33 -45.335 -45.34 -45.345 -45.35 -45.355 -45.36 -45.365 -45.37 -45.375 -45.38 -45.385 -45.39 -45.395 -45.4 -45.405 -45.41 -45.415 -45.42 -45.425 -45.43 -45.435 -45.44 -45.445 -45.45 -45.455 -45.46 -45.465 -45.47 -45.475 -45.48 -45.485 -45.49 -45.495 -45.5 -45.505 -45.51 -45.515 -45.52 -45.525 -45.53 -45.535 -45.54 -45.545 -45.55 -45.555 -45.56 -45.565 -45.57 -45.575 -45.58 -45.585 -45.59 -45.595 -45.6 -45.605 -45.61 -45.615 -45.62 -45.625 -45.63 -45.635 -45.64 -45.645 -45.65 -45.655 -45.66 -45.665 -45.67 -45.675 -45.68 -45.685 -45.69 -45.695 -45.7 -45.705 -45.71 -45.715 -45.72 -45.725 -45.73 -45.735 -45.74 -45.745 -45.75 -45.755 -45.76 -45.765 -45.77 -45.775 -45.78 -45.785 -45.79 -45.795 -45.8 -45.805 -45.81 -45.815 -45.82 -45.825 -45.83 -45.835 -45.84 -45.845 -45.85 -45.855 -45.86 -45.865 -45.87 -45.875 -45.88 -45.885 -45.89 -45.895 -45.9 -45.905 -45.91 -45.915 -45.92 -45.925 -45.93 -45.935 -45.94 -45.945 -45.95 -45.955 -45.96 -45.965 -45.97 -45.975 -45.98 -45.985 -45.99 -45.995 -46 -46.005 -46.01 -46.015 -46.02 -46.025 -46.03 -46.035 -46.04 -46.045 -46.05 -46.055 -46.06 -46.065 -46.07 -46.075 -46.08 -46.085 -46.09 -46.095 -46.1 -46.105 -46.11 -46.115 -46.12 -46.125 -46.13 -46.135 -46.14 -46.145 -46.15 -46.155 -46.16 -46.165 -46.17 -46.175 -46.18 -46.185 -46.19 -46.195 -46.2 -46.205 -46.21 -46.215 -46.22 -46.225 -46.23 -46.235 -46.24 -46.245 -46.25 -46.255 -46.26 -46.265 -46.27 -46.275 -46.28 -46.285 -46.29 -46.295 -46.3 -46.305 -46.31 -46.315 -46.32 -46.325 -46.33 -46.335 -46.34 -46.345 -46.35 -46.355 -46.36 -46.365 -46.37 -46.375 -46.38 -46.385 -46.39 -46.395 -46.4 -46.405 -46.41 -46.415 -46.42 -46.425 -46.43 -46.435 -46.44 -46.445 -46.45 -46.455 -46.46 -46.465 -46.47 -46.475 -46.48 -46.485 -46.49 -46.495 -46.5 -46.505 -46.51 -46.515 -46.52 -46.525 -46.53 -46.535 -46.54 -46.545 -46.55 -46.555 -46.56 -46.565 -46.57 -46.575 -46.58 -46.585 -46.59 -46.595 -46.6 -46.605 -46.61 -46.615 -46.62 -46.625 -46.63 -46.635 -46.64 -46.645 -46.65 -46.655 -46.66 -46.665 -46.67 -46.675 -46.68 -46.685 -46.69 -46.695 -46.7 -46.705 -46.71 -46.715 -46.72 -46.725 -46.73 -46.735 -46.74 -46.745 -46.75 -46.755 -46.76 -46.765 -46.77 -46.775 -46.78 -46.785 -46.79 -46.795 -46.8 -46.805 -46.81 -46.815 -46.82 -46.825 -46.83 -46.835 -46.84 -46.845 -46.85 -46.855 -46.86 -46.865 -46.87 -46.875 -46.88 -46.885 -46.89 -46.895 -46.9 -46.905 -46.91 -46.915 -46.92 -46.925 -46.93 -46.935 -46.94 -46.945 -46.95 -46.955 -46.96 -46.965 -46.97 -46.975 -46.98 -46.985 -46.99 -46.995 -47 -47.005 -47.01 -47.015 -47.02 -47.025 -47.03 -47.035 -47.04 -47.045 -47.05 -47.055 -47.06 -47.065 -47.07 -47.075 -47.08 -47.085 -47.09 -47.095 -47.1 -47.105 -47.11 -47.115 -47.12 -47.125 -47.13 -47.135 -47.14 -47.145 -47.15 -47.155 -47.16 -47.165 -47.17 -47.175 -47.18 -47.185 -47.19 -47.195 -47.2 -47.205 -47.21 -47.215 -47.22 -47.225 -47.23 -47.235 -47.24 -47.245 -47.25 -47.255 -47.26 -47.265 -47.27 -47.275 -47.28 -47.285 -47.29 -47.295 -47.3 -47.305 -47.31 -47.315 -47.32 -47.325 -47.33 -47.335 -47.34 -47.345 -47.35 -47.355 -47.36 -47.365 -47.37 -47.375 -47.38 -47.385 -47.39 -47.395 -47.4 -47.405 -47.41 -47.415 -47.42 -47.425 -47.43 -47.435 -47.44 -47.445 -47.45 -47.455 -47.46 -47.465 -47.47 -47.475 -47.48 -47.485 -47.49 -47.495 -47.5 -47.505 -47.51 -47.515 -47.52 -47.525 -47.53 -47.535 -47.54 -47.545 -47.55 -47.555 -47.56 -47.565 -47.57 -47.575 -47.58 -47.585 -47.59 -47.595 -47.6 -47.605 -47.61 -47.615 -47.62 -47.625 -47.63 -47.635 -47.64 -47.645 -47.65 -47.655 -47.66 -47.665 -47.67 -47.675 -47.68 -47.685 -47.69 -47.695 -47.7 -47.705 -47.71 -47.715 -47.72 -47.725 -47.73 -47.735 -47.74 -47.745 -47.75 -47.755 -47.76 -47.765 -47.77 -47.775 -47.78 -47.785 -47.79 -47.795 -47.8 -47.805 -47.81 -47.815 -47.82 -47.825 -47.83 -47.835 -47.84 -47.845 -47.85 -47.855 -47.86 -47.865 -47.87 -47.875 -47.88 -47.885 -47.89 -47.895 -47.9 -47.905 -47.91 -47.915 -47.92 -47.925 -47.93 -47.935 -47.94 -47.945 -47.95 -47.955 -47.96 -47.965 -47.97 -47.975 -47.98 -47.985 -47.99 -47.995 -48 -48.005 -48.01 -48.015 -48.02 -48.025 -48.03 -48.035 -48.04 -48.045 -48.05 -48.055 -48.06 -48.065 -48.07 -48.075 -48.08 -48.085 -48.09 -48.095 -48.1 -48.105 -48.11 -48.115 -48.12 -48.125 -48.13 -48.135 -48.14 -48.145 -48.15 -48.155 -48.16 -48.165 -48.17 -48.175 -48.18 -48.185 -48.19 -48.195 -48.2 -48.205 -48.21 -48.215 -48.22 -48.225 -48.23 -48.235 -48.24 -48.245 -48.25 -48.255 -48.26 -48.265 -48.27 -48.275 -48.28 -48.285 -48.29 -48.295 -48.3 -48.305 -48.31 -48.315 -48.32 -48.325 -48.33 -48.335 -48.34 -48.345 -48.35 -48.355 -48.36 -48.365 -48.37 -48.375 -48.38 -48.385 -48.39 -48.395 -48.4 -48.405 -48.41 -48.415 -48.42 -48.425 -48.43 -48.435 -48.44 -48.445 -48.45 -48.455 -48.46 -48.465 -48.47 -48.475 -48.48 -48.485 -48.49 -48.495 -48.5 -48.505 -48.51 -48.515 -48.52 -48.525 -48.53 -48.535 -48.54 -48.545 -48.55 -48.555 -48.56 -48.565 -48.57 -48.575 -48.58 -48.585 -48.59 -48.595 -48.6 -48.605 -48.61 -48.615 -48.62 -48.625 -48.63 -48.635 -48.64 -48.645 -48.65 -48.655 -48.66 -48.665 -48.67 -48.675 -48.68 -48.685 -48.69 -48.695 -48.7 -48.705 -48.71 -48.715 -48.72 -48.725 -48.73 -48.735 -48.74 -48.745 -48.75 -48.755 -48.76 -48.765 -48.77 -48.775 -48.78 -48.785 -48.79 -48.795 -48.8 -48.805 -48.81 -48.815 -48.82 -48.825 -48.83 -48.835 -48.84 -48.845 -48.85 -48.855 -48.86 -48.865 -48.87 -48.875 -48.88 -48.885 -48.89 -48.895 -48.9 -48.905 -48.91 -48.915 -48.92 -48.925 -48.93 -48.935 -48.94 -48.945 -48.95 -48.955 -48.96 -48.965 -48.97 -48.975 -48.98 -48.985 -48.99 -48.995 -49 -49.005 -49.01 -49.015 -49.02 -49.025 -49.03 -49.035 -49.04 -49.045 -49.05 -49.055 -49.06 -49.065 -49.07 -49.075 -49.08 -49.085 -49.09 -49.095 -49.1 -49.105 -49.11 -49.115 -49.12 -49.125 -49.13 -49.135 -49.14 -49.145 -49.15 -49.155 -49.16 -49.165 -49.17 -49.175 -49.18 -49.185 -49.19 -49.195 -49.2 -49.205 -49.21 -49.215 -49.22 -49.225 -49.23 -49.235 -49.24 -49.245 -49.25 -49.255 -49.26 -49.265 -49.27 -49.275 -49.28 -49.285 -49.29 -49.295 -49.3 -49.305 -49.31 -49.315 -49.32 -49.325 -49.33 -49.335 -49.34 -49.345 -49.35 -49.355 -49.36 -49.365 -49.37 -49.375 -49.38 -49.385 -49.39 -49.395 -49.4 -49.405 -49.41 -49.415 -49.42 -49.425 -49.43 -49.435 -49.44 -49.445 -49.45 -49.455 -49.46 -49.465 -49.47 -49.475 -49.48 -49.485 -49.49 -49.495 -49.5 -49.505 -49.51 -49.515 -49.52 -49.525 -49.53 -49.535 -49.54 -49.545 -49.55 -49.555 -49.56 -49.565 -49.57 -49.575 -49.58 -49.585 -49.59 -49.595 -49.6 -49.605 -49.61 -49.615 -49.62 -49.625 -49.63 -49.635 -49.64 -49.645 -49.65 -49.655 -49.66 -49.665 -49.67 -49.675 -49.68 -49.685 -49.69 -49.695 -49.7 -49.705 -49.71 -49.715 -49.72 -49.725 -49.73 -49.735 -49.74 -49.745 -49.75 -49.755 -49.76 -49.765 -49.77 -49.775 -49.78 -49.785 -49.79 -49.795 -49.8 -49.805 -49.81 -49.815 -49.82 -49.825 -49.83 -49.835 -49.84 -49.845 -49.85 -49.855 -49.86 -49.865 -49.87 -49.875 -49.88 -49.885 -49.89 -49.895 -49.9 -49.905 -49.91 -49.915 -49.92 -49.925 -49.93 -49.935 -49.94 -49.945 -49.95 -49.955 -49.96 -49.965 -49.97 -49.975 -49.98 -49.985 -49.99 -49.995 -50 -50.005 -50.01 -50.015 -50.02 -50.025 -50.03 -50.035 -50.04 -50.045 -50.05 -50.055 -50.06 -50.065 -50.07 -50.075 -50.08 -50.085 -50.09 -50.095 -50.1 -50.105 -50.11 -50.115 -50.12 -50.125 -50.13 -50.135 -50.14 -50.145 -50.15 -50.155 -50.16 -50.165 -50.17 -50.175 -50.18 -50.185 -50.19 -50.195 -50.2 -50.205 -50.21 -50.215 -50.22 -50.225 -50.23 -50.235 -50.24 -50.245 -50.25 -50.255 -50.26 -50.265 -50.27 -50.275 -50.28 -50.285 -50.29 -50.295 -50.3 -50.305 -50.31 -50.315 -50.32 -50.325 -50.33 -50.335 -50.34 -50.345 -50.35 -50.355 -50.36 -50.365 -50.37 -50.375 -50.38 -50.385 -50.39 -50.395 -50.4 -50.405 -50.41 -50.415 -50.42 -50.425 -50.43 -50.435 -50.44 -50.445 -50.45 -50.455 -50.46 -50.465 -50.47 -50.475 -50.48 -50.485 -50.49 -50.495 -50.5 -50.505 -50.51 -50.515 -50.52 -50.525 -50.53 -50.535 -50.54 -50.545 -50.55 -50.555 -50.56 -50.565 -50.57 -50.575 -50.58 -50.585 -50.59 -50.595 -50.6 -50.605 -50.61 -50.615 -50.62 -50.625 -50.63 -50.635 -50.64 -50.645 -50.65 -50.655 -50.66 -50.665 -50.67 -50.675 -50.68 -50.685 -50.69 -50.695 -50.7 -50.705 -50.71 -50.715 -50.72 -50.725 -50.73 -50.735 -50.74 -50.745 -50.75 -50.755 -50.76 -50.765 -50.77 -50.775 -50.78 -50.785 -50.79 -50.795 -50.8 -50.805 -50.81 -50.815 -50.82 -50.825 -50.83 -50.835 -50.84 -50.845 -50.85 -50.855 -50.86 -50.865 -50.87 -50.875 -50.88 -50.885 -50.89 -50.895 -50.9 -50.905 -50.91 -50.915 -50.92 -50.925 -50.93 -50.935 -50.94 -50.945 -50.95 -50.955 -50.96 -50.965 -50.97 -50.975 -50.98 -50.985 -50.99 -50.995 -51 -51.005 -51.01 -51.015 -51.02 -51.025 -51.03 -51.035 -51.04 -51.045 -51.05 -51.055 -51.06 -51.065 -51.07 -51.075 -51.08 -51.085 -51.09 -51.095 -51.1 -51.105 -51.11 -51.115 -51.12 -51.125 -51.13 -51.135 -51.14 -51.145 -51.15 -51.155 -51.16 -51.165 -51.17 -51.175 -51.18 -51.185 -51.19 -51.195 -51.2 -51.205 -51.21 -51.215 -51.22 -51.225 -51.23 -51.235 -51.24 -51.245 -51.25 -51.255 -51.26 -51.265 -51.27 -51.275 -51.28 -51.285 -51.29 -51.295 -51.3 -51.305 -51.31 -51.315 -51.32 -51.325 -51.33 -51.335 -51.34 -51.345 -51.35 -51.355 -51.36 -51.365 -51.37 -51.375 -51.38 -51.385 -51.39 -51.395 -51.4 -51.405 -51.41 -51.415 -51.42 -51.425 -51.43 -51.435 -51.44 -51.445 -51.45 -51.455 -51.46 -51.465 -51.47 -51.475 -51.48 -51.485 -51.49 -51.495 -51.5 -51.505 -51.51 -51.515 -51.52 -51.525 -51.53 -51.535 -51.54 -51.545 -51.55 -51.555 -51.56 -51.565 -51.57 -51.575 -51.58 -51.585 -51.59 -51.595 -51.6 -51.605 -51.61 -51.615 -51.62 -51.625 -51.63 -51.635 -51.64 -51.645 -51.65 -51.655 -51.66 -51.665 -51.67 -51.675 -51.68 -51.685 -51.69 -51.695 -51.7 -51.705 -51.71 -51.715 -51.72 -51.725 -51.73 -51.735 -51.74 -51.745 -51.75 -51.755 -51.76 -51.765 -51.77 -51.775 -51.78 -51.785 -51.79 -51.795 -51.8 -51.805 -51.81 -51.815 -51.82 -51.825 -51.83 -51.835 -51.84 -51.845 -51.85 -51.855 -51.86 -51.865 -51.87 -51.875 -51.88 -51.885 -51.89 -51.895 -51.9 -51.905 -51.91 -51.915 -51.92 -51.925 -51.93 -51.935 -51.94 -51.945 -51.95 -51.955 -51.96 -51.965 -51.97 -51.975 -51.98 -51.985 -51.99 -51.995 -52 -52.005 -52.01 -52.015 -52.02 -52.025 -52.03 -52.035 -52.04 -52.045 -52.05 -52.055 -52.06 -52.065 -52.07 -52.075 -52.08 -52.085 -52.09 -52.095 -52.1 -52.105 -52.11 -52.115 -52.12 -52.125 -52.13 -52.135 -52.14 -52.145 -52.15 -52.155 -52.16 -52.165 -52.17 -52.175 -52.18 -52.185 -52.19 -52.195 -52.2 -52.205 -52.21 -52.215 -52.22 -52.225 -52.23 -52.235 -52.24 -52.245 -52.25 -52.255 -52.26 -52.265 -52.27 -52.275 -52.28 -52.285 -52.29 -52.295 -52.3 -52.305 -52.31 -52.315 -52.32 -52.325 -52.33 -52.335 -52.34 -52.345 -52.35 -52.355 -52.36 -52.365 -52.37 -52.375 -52.38 -52.385 -52.39 -52.395 -52.4 -52.405 -52.41 -52.415 -52.42 -52.425 -52.43 -52.435 -52.44 -52.445 -52.45 -52.455 -52.46 -52.465 -52.47 -52.475 -52.48 -52.485 -52.49 -52.495 -52.5 -52.505 -52.51 -52.515 -52.52 -52.525 -52.53 -52.535 -52.54 -52.545 -52.55 -52.555 -52.56 -52.565 -52.57 -52.575 -52.58 -52.585 -52.59 -52.595 -52.6 -52.605 -52.61 -52.615 -52.62 -52.625 -52.63 -52.635 -52.64 -52.645 -52.65 -52.655 -52.66 -52.665 -52.67 -52.675 -52.68 -52.685 -52.69 -52.695 -52.7 -52.705 -52.71 -52.715 -52.72 -52.725 -52.73 -52.735 -52.74 -52.745 -52.75 -52.755 -52.76 -52.765 -52.77 -52.775 -52.78 -52.785 -52.79 -52.795 -52.8 -52.805 -52.81 -52.815 -52.82 -52.825 -52.83 -52.835 -52.84 -52.845 -52.85 -52.855 -52.86 -52.865 -52.87 -52.875 -52.88 -52.885 -52.89 -52.895 -52.9 -52.905 -52.91 -52.915 -52.92 -52.925 -52.93 -52.935 -52.94 -52.945 -52.95 -52.955 -52.96 -52.965 -52.97 -52.975 -52.98 -52.985 -52.99 -52.995 -53 -53.005 -53.01 -53.015 -53.02 -53.025 -53.03 -53.035 -53.04 -53.045 -53.05 -53.055 -53.06 -53.065 -53.07 -53.075 -53.08 -53.085 -53.09 -53.095 -53.1 -53.105 -53.11 -53.115 -53.12 -53.125 -53.13 -53.135 -53.14 -53.145 -53.15 -53.155 -53.16 -53.165 -53.17 -53.175 -53.18 -53.185 -53.19 -53.195 -53.2 -53.205 -53.21 -53.215 -53.22 -53.225 -53.23 -53.235 -53.24 -53.245 -53.25 -53.255 -53.26 -53.265 -53.27 -53.275 -53.28 -53.285 -53.29 -53.295 -53.3 -53.305 -53.31 -53.315 -53.32 -53.325 -53.33 -53.335 -53.34 -53.345 -53.35 -53.355 -53.36 -53.365 -53.37 -53.375 -53.38 -53.385 -53.39 -53.395 -53.4 -53.405 -53.41 -53.415 -53.42 -53.425 -53.43 -53.435 -53.44 -53.445 -53.45 -53.455 -53.46 -53.465 -53.47 -53.475 -53.48 -53.485 -53.49 -53.495 -53.5 -53.505 -53.51 -53.515 -53.52 -53.525 -53.53 -53.535 -53.54 -53.545 -53.55 -53.555 -53.56 -53.565 -53.57 -53.575 -53.58 -53.585 -53.59 -53.595 -53.6 -53.605 -53.61 -53.615 -53.62 -53.625 -53.63 -53.635 -53.64 -53.645 -53.65 -53.655 -53.66 -53.665 -53.67 -53.675 -53.68 -53.685 -53.69 -53.695 -53.7 -53.705 -53.71 -53.715 -53.72 -53.725 -53.73 -53.735 -53.74 -53.745 -53.75 -53.755 -53.76 -53.765 -53.77 -53.775 -53.78 -53.785 -53.79 -53.795 -53.8 -53.805 -53.81 -53.815 -53.82 -53.825 -53.83 -53.835 -53.84 -53.845 -53.85 -53.855 -53.86 -53.865 -53.87 -53.875 -53.88 -53.885 -53.89 -53.895 -53.9 -53.905 -53.91 -53.915 -53.92 -53.925 -53.93 -53.935 -53.94 -53.945 -53.95 -53.955 -53.96 -53.965 -53.97 -53.975 -53.98 -53.985 -53.99 -53.995 -54 -54.005 -54.01 -54.015 -54.02 -54.025 -54.03 -54.035 -54.04 -54.045 -54.05 -54.055 -54.06 -54.065 -54.07 -54.075 -54.08 -54.085 -54.09 -54.095 -54.1 -54.105 -54.11 -54.115 -54.12 -54.125 -54.13 -54.135 -54.14 -54.145 -54.15 -54.155 -54.16 -54.165 -54.17 -54.175 -54.18 -54.185 -54.19 -54.195 -54.2 -54.205 -54.21 -54.215 -54.22 -54.225 -54.23 -54.235 -54.24 -54.245 -54.25 -54.255 -54.26 -54.265 -54.27 -54.275 -54.28 -54.285 -54.29 -54.295 -54.3 -54.305 -54.31 -54.315 -54.32 -54.325 -54.33 -54.335 -54.34 -54.345 -54.35 -54.355 -54.36 -54.365 -54.37 -54.375 -54.38 -54.385 -54.39 -54.395 -54.4 -54.405 -54.41 -54.415 -54.42 -54.425 -54.43 -54.435 -54.44 -54.445 -54.45 -54.455 -54.46 -54.465 -54.47 -54.475 -54.48 -54.485 -54.49 -54.495 -54.5 -54.505 -54.51 -54.515 -54.52 -54.525 -54.53 -54.535 -54.54 -54.545 -54.55 -54.555 -54.56 -54.565 -54.57 -54.575 -54.58 -54.585 -54.59 -54.595 -54.6 -54.605 -54.61 -54.615 -54.62 -54.625 -54.63 -54.635 -54.64 -54.645 -54.65 -54.655 -54.66 -54.665 -54.67 -54.675 -54.68 -54.685 -54.69 -54.695 -54.7 -54.705 -54.71 -54.715 -54.72 -54.725 -54.73 -54.735 -54.74 -54.745 -54.75 -54.755 -54.76 -54.765 -54.77 -54.775 -54.78 -54.785 -54.79 -54.795 -54.8 -54.805 -54.81 -54.815 -54.82 -54.825 -54.83 -54.835 -54.84 -54.845 -54.85 -54.855 -54.86 -54.865 -54.87 -54.875 -54.88 -54.885 -54.89 -54.895 -54.9 -54.905 -54.91 -54.915 -54.92 -54.925 -54.93 -54.935 -54.94 -54.945 -54.95 -54.955 -54.96 -54.965 -54.97 -54.975 -54.98 -54.985 -54.99 -54.995 -55 -55.005 -55.01 -55.015 -55.02 -55.025 -55.03 -55.035 -55.04 -55.045 -55.05 -55.055 -55.06 -55.065 -55.07 -55.075 -55.08 -55.085 -55.09 -55.095 -55.1 -55.105 -55.11 -55.115 -55.12 -55.125 -55.13 -55.135 -55.14 -55.145 -55.15 -55.155 -55.16 -55.165 -55.17 -55.175 -55.18 -55.185 -55.19 -55.195 -55.2 -55.205 -55.21 -55.215 -55.22 -55.225 -55.23 -55.235 -55.24 -55.245 -55.25 -55.255 -55.26 -55.265 -55.27 -55.275 -55.28 -55.285 -55.29 -55.295 -55.3 -55.305 -55.31 -55.315 -55.32 -55.325 -55.33 -55.335 -55.34 -55.345 -55.35 -55.355 -55.36 -55.365 -55.37 -55.375 -55.38 -55.385 -55.39 -55.395 -55.4 -55.405 -55.41 -55.415 -55.42 -55.425 -55.43 -55.435 -55.44 -55.445 -55.45 -55.455 -55.46 -55.465 -55.47 -55.475 -55.48 -55.485 -55.49 -55.495 -55.5 -55.505 -55.51 -55.515 -55.52 -55.525 -55.53 -55.535 -55.54 -55.545 -55.55 -55.555 -55.56 -55.565 -55.57 -55.575 -55.58 -55.585 -55.59 -55.595 -55.6 -55.605 -55.61 -55.615 -55.62 -55.625 -55.63 -55.635 -55.64 -55.645 -55.65 -55.655 -55.66 -55.665 -55.67 -55.675 -55.68 -55.685 -55.69 -55.695 -55.7 -55.705 -55.71 -55.715 -55.72 -55.725 -55.73 -55.735 -55.74 -55.745 -55.75 -55.755 -55.76 -55.765 -55.77 -55.775 -55.78 -55.785 -55.79 -55.795 -55.8 -55.805 -55.81 -55.815 -55.82 -55.825 -55.83 -55.835 -55.84 -55.845 -55.85 -55.855 -55.86 -55.865 -55.87 -55.875 -55.88 -55.885 -55.89 -55.895 -55.9 -55.905 -55.91 -55.915 -55.92 -55.925 -55.93 -55.935 -55.94 -55.945 -55.95 -55.955 -55.96 -55.965 -55.97 -55.975 -55.98 -55.985 -55.99 -55.995 -56 -56.005 -56.01 -56.015 -56.02 -56.025 -56.03 -56.035 -56.04 -56.045 -56.05 -56.055 -56.06 -56.065 -56.07 -56.075 -56.08 -56.085 -56.09 -56.095 -56.1 -56.105 -56.11 -56.115 -56.12 -56.125 -56.13 -56.135 -56.14 -56.145 -56.15 -56.155 -56.16 -56.165 -56.17 -56.175 -56.18 -56.185 -56.19 -56.195 -56.2 -56.205 -56.21 -56.215 -56.22 -56.225 -56.23 -56.235 -56.24 -56.245 -56.25 -56.255 -56.26 -56.265 -56.27 -56.275 -56.28 -56.285 -56.29 -56.295 -56.3 -56.305 -56.31 -56.315 -56.32 -56.325 -56.33 -56.335 -56.34 -56.345 -56.35 -56.355 -56.36 -56.365 -56.37 -56.375 -56.38 -56.385 -56.39 -56.395 -56.4 -56.405 -56.41 -56.415 -56.42 -56.425 -56.43 -56.435 -56.44 -56.445 -56.45 -56.455 -56.46 -56.465 -56.47 -56.475 -56.48 -56.485 -56.49 -56.495 -56.5 -56.505 -56.51 -56.515 -56.52 -56.525 -56.53 -56.535 -56.54 -56.545 -56.55 -56.555 -56.56 -56.565 -56.57 -56.575 -56.58 -56.585 -56.59 -56.595 -56.6 -56.605 -56.61 -56.615 -56.62 -56.625 -56.63 -56.635 -56.64 -56.645 -56.65 -56.655 -56.66 -56.665 -56.67 -56.675 -56.68 -56.685 -56.69 -56.695 -56.7 -56.705 -56.71 -56.715 -56.72 -56.725 -56.73 -56.735 -56.74 -56.745 -56.75 -56.755 -56.76 -56.765 -56.77 -56.775 -56.78 -56.785 -56.79 -56.795 -56.8 -56.805 -56.81 -56.815 -56.82 -56.825 -56.83 -56.835 -56.84 -56.845 -56.85 -56.855 -56.86 -56.865 -56.87 -56.875 -56.88 -56.885 -56.89 -56.895 -56.9 -56.905 -56.91 -56.915 -56.92 -56.925 -56.93 -56.935 -56.94 -56.945 -56.95 -56.955 -56.96 -56.965 -56.97 -56.975 -56.98 -56.985 -56.99 -56.995 -57 -57.005 -57.01 -57.015 -57.02 -57.025 -57.03 -57.035 -57.04 -57.045 -57.05 -57.055 -57.06 -57.065 -57.07 -57.075 -57.08 -57.085 -57.09 -57.095 -57.1 -57.105 -57.11 -57.115 -57.12 -57.125 -57.13 -57.135 -57.14 -57.145 -57.15 -57.155 -57.16 -57.165 -57.17 -57.175 -57.18 -57.185 -57.19 -57.195 -57.2 -57.205 -57.21 -57.215 -57.22 -57.225 -57.23 -57.235 -57.24 -57.245 -57.25 -57.255 -57.26 -57.265 -57.27 -57.275 -57.28 -57.285 -57.29 -57.295 -57.3 -57.305 -57.31 -57.315 -57.32 -57.325 -57.33 -57.335 -57.34 -57.345 -57.35 -57.355 -57.36 -57.365 -57.37 -57.375 -57.38 -57.385 -57.39 -57.395 -57.4 -57.405 -57.41 -57.415 -57.42 -57.425 -57.43 -57.435 -57.44 -57.445 -57.45 -57.455 -57.46 -57.465 -57.47 -57.475 -57.48 -57.485 -57.49 -57.495 -57.5 -57.505 -57.51 -57.515 -57.52 -57.525 -57.53 -57.535 -57.54 -57.545 -57.55 -57.555 -57.56 -57.565 -57.57 -57.575 -57.58 -57.585 -57.59 -57.595 -57.6 -57.605 -57.61 -57.615 -57.62 -57.625 -57.63 -57.635 -57.64 -57.645 -57.65 -57.655 -57.66 -57.665 -57.67 -57.675 -57.68 -57.685 -57.69 -57.695 -57.7 -57.705 -57.71 -57.715 -57.72 -57.725 -57.73 -57.735 -57.74 -57.745 -57.75 -57.755 -57.76 -57.765 -57.77 -57.775 -57.78 -57.785 -57.79 -57.795 -57.8 -57.805 -57.81 -57.815 -57.82 -57.825 -57.83 -57.835 -57.84 -57.845 -57.85 -57.855 -57.86 -57.865 -57.87 -57.875 -57.88 -57.885 -57.89 -57.895 -57.9 -57.905 -57.91 -57.915 -57.92 -57.925 -57.93 -57.935 -57.94 -57.945 -57.95 -57.955 -57.96 -57.965 -57.97 -57.975 -57.98 -57.985 -57.99 -57.995 -58 -58.005 -58.01 -58.015 -58.02 -58.025 -58.03 -58.035 -58.04 -58.045 -58.05 -58.055 -58.06 -58.065 -58.07 -58.075 -58.08 -58.085 -58.09 -58.095 -58.1 -58.105 -58.11 -58.115 -58.12 -58.125 -58.13 -58.135 -58.14 -58.145 -58.15 -58.155 -58.16 -58.165 -58.17 -58.175 -58.18 -58.185 -58.19 -58.195 -58.2 -58.205 -58.21 -58.215 -58.22 -58.225 -58.23 -58.235 -58.24 -58.245 -58.25 -58.255 -58.26 -58.265 -58.27 -58.275 -58.28 -58.285 -58.29 -58.295 -58.3 -58.305 -58.31 -58.315 -58.32 -58.325 -58.33 -58.335 -58.34 -58.345 -58.35 -58.355 -58.36 -58.365 -58.37 -58.375 -58.38 -58.385 -58.39 -58.395 -58.4 -58.405 -58.41 -58.415 -58.42 -58.425 -58.43 -58.435 -58.44 -58.445 -58.45 -58.455 -58.46 -58.465 -58.47 -58.475 -58.48 -58.485 -58.49 -58.495 -58.5 -58.505 -58.51 -58.515 -58.52 -58.525 -58.53 -58.535 -58.54 -58.545 -58.55 -58.555 -58.56 -58.565 -58.57 -58.575 -58.58 -58.585 -58.59 -58.595 -58.6 -58.605 -58.61 -58.615 -58.62 -58.625 -58.63 -58.635 -58.64 -58.645 -58.65 -58.655 -58.66 -58.665 -58.67 -58.675 -58.68 -58.685 -58.69 -58.695 -58.7 -58.705 -58.71 -58.715 -58.72 -58.725 -58.73 -58.735 -58.74 -58.745 -58.75 -58.755 -58.76 -58.765 -58.77 -58.775 -58.78 -58.785 -58.79 -58.795 -58.8 -58.805 -58.81 -58.815 -58.82 -58.825 -58.83 -58.835 -58.84 -58.845 -58.85 -58.855 -58.86 -58.865 -58.87 -58.875 -58.88 -58.885 -58.89 -58.895 -58.9 -58.905 -58.91 -58.915 -58.92 -58.925 -58.93 -58.935 -58.94 -58.945 -58.95 -58.955 -58.96 -58.965 -58.97 -58.975 -58.98 -58.985 -58.99 -58.995 -59 -59.005 -59.01 -59.015 -59.02 -59.025 -59.03 -59.035 -59.04 -59.045 -59.05 -59.055 -59.06 -59.065 -59.07 -59.075 -59.08 -59.085 -59.09 -59.095 -59.1 -59.105 -59.11 -59.115 -59.12 -59.125 -59.13 -59.135 -59.14 -59.145 -59.15 -59.155 -59.16 -59.165 -59.17 -59.175 -59.18 -59.185 -59.19 -59.195 -59.2 -59.205 -59.21 -59.215 -59.22 -59.225 -59.23 -59.235 -59.24 -59.245 -59.25 -59.255 -59.26 -59.265 -59.27 -59.275 -59.28 -59.285 -59.29 -59.295 -59.3 -59.305 -59.31 -59.315 -59.32 -59.325 -59.33 -59.335 -59.34 -59.345 -59.35 -59.355 -59.36 -59.365 -59.37 -59.375 -59.38 -59.385 -59.39 -59.395 -59.4 -59.405 -59.41 -59.415 -59.42 -59.425 -59.43 -59.435 -59.44 -59.445 -59.45 -59.455 -59.46 -59.465 -59.47 -59.475 -59.48 -59.485 -59.49 -59.495 -59.5 -59.505 -59.51 -59.515 -59.52 -59.525 -59.53 -59.535 -59.54 -59.545 -59.55 -59.555 -59.56 -59.565 -59.57 -59.575 -59.58 -59.585 -59.59 -59.595 -59.6 -59.605 -59.61 -59.615 -59.62 -59.625 -59.63 -59.635 -59.64 -59.645 -59.65 -59.655 -59.66 -59.665 -59.67 -59.675 -59.68 -59.685 -59.69 -59.695 -59.7 -59.705 -59.71 -59.715 -59.72 -59.725 -59.73 -59.735 -59.74 -59.745 -59.75 -59.755 -59.76 -59.765 -59.77 -59.775 -59.78 -59.785 -59.79 -59.795 -59.8 -59.805 -59.81 -59.815 -59.82 -59.825 -59.83 -59.835 -59.84 -59.845 -59.85 -59.855 -59.86 -59.865 -59.87 -59.875 -59.88 -59.885 -59.89 -59.895 -59.9 -59.905 -59.91 -59.915 -59.92 -59.925 -59.93 -59.935 -59.94 -59.945 -59.95 -59.955 -59.96 -59.965 -59.97 -59.975 -59.98 -59.985 -59.99 -59.995 -60 -60.005 -60.01 -60.015 -60.02 -60.025 -60.03 -60.035 -60.04 -60.045 -60.05 -60.055 -60.06 -60.065 -60.07 -60.075 -60.08 -60.085 -60.09 -60.095 -60.1 -60.105 -60.11 -60.115 -60.12 -60.125 -60.13 -60.135 -60.14 -60.145 -60.15 -60.155 -60.16 -60.165 -60.17 -60.175 -60.18 -60.185 -60.19 -60.195 -60.2 -60.205 -60.21 -60.215 -60.22 -60.225 -60.23 -60.235 -60.24 -60.245 -60.25 -60.255 -60.26 -60.265 -60.27 -60.275 -60.28 -60.285 -60.29 -60.295 -60.3 -60.305 -60.31 -60.315 -60.32 -60.325 -60.33 -60.335 -60.34 -60.345 -60.35 -60.355 -60.36 -60.365 -60.37 -60.375 -60.38 -60.385 -60.39 -60.395 -60.4 -60.405 -60.41 -60.415 -60.42 -60.425 -60.43 -60.435 -60.44 -60.445 -60.45 -60.455 -60.46 -60.465 -60.47 -60.475 -60.48 -60.485 -60.49 -60.495 -60.5 -60.505 -60.51 -60.515 -60.52 -60.525 -60.53 -60.535 -60.54 -60.545 -60.55 -60.555 -60.56 -60.565 -60.57 -60.575 -60.58 -60.585 -60.59 -60.595 -60.6 -60.605 -60.61 -60.615 -60.62 -60.625 -60.63 -60.635 -60.64 -60.645 -60.65 -60.655 -60.66 -60.665 -60.67 -60.675 -60.68 -60.685 -60.69 -60.695 -60.7 -60.705 -60.71 -60.715 -60.72 -60.725 -60.73 -60.735 -60.74 -60.745 -60.75 -60.755 -60.76 -60.765 -60.77 -60.775 -60.78 -60.785 -60.79 -60.795 -60.8 -60.805 -60.81 -60.815 -60.82 -60.825 -60.83 -60.835 -60.84 -60.845 -60.85 -60.855 -60.86 -60.865 -60.87 -60.875 -60.88 -60.885 -60.89 -60.895 -60.9 -60.905 -60.91 -60.915 -60.92 -60.925 -60.93 -60.935 -60.94 -60.945 -60.95 -60.955 -60.96 -60.965 -60.97 -60.975 -60.98 -60.985 -60.99 -60.995 -61 -61.005 -61.01 -61.015 -61.02 -61.025 -61.03 -61.035 -61.04 -61.045 -61.05 -61.055 -61.06 -61.065 -61.07 -61.075 -61.08 -61.085 -61.09 -61.095 -61.1 -61.105 -61.11 -61.115 -61.12 -61.125 -61.13 -61.135 -61.14 -61.145 -61.15 -61.155 -61.16 -61.165 -61.17 -61.175 -61.18 -61.185 -61.19 -61.195 -61.2 -61.205 -61.21 -61.215 -61.22 -61.225 -61.23 -61.235 -61.24 -61.245 -61.25 -61.255 -61.26 -61.265 -61.27 -61.275 -61.28 -61.285 -61.29 -61.295 -61.3 -61.305 -61.31 -61.315 -61.32 -61.325 -61.33 -61.335 -61.34 -61.345 -61.35 -61.355 -61.36 -61.365 -61.37 -61.375 -61.38 -61.385 -61.39 -61.395 -61.4 -61.405 -61.41 -61.415 -61.42 -61.425 -61.43 -61.435 -61.44 -61.445 -61.45 -61.455 -61.46 -61.465 -61.47 -61.475 -61.48 -61.485 -61.49 -61.495 -61.5 -61.505 -61.51 -61.515 -61.52 -61.525 -61.53 -61.535 -61.54 -61.545 -61.55 -61.555 -61.56 -61.565 -61.57 -61.575 -61.58 -61.585 -61.59 -61.595 -61.6 -61.605 -61.61 -61.615 -61.62 -61.625 -61.63 -61.635 -61.64 -61.645 -61.65 -61.655 -61.66 -61.665 -61.67 -61.675 -61.68 -61.685 -61.69 -61.695 -61.7 -61.705 -61.71 -61.715 -61.72 -61.725 -61.73 -61.735 -61.74 -61.745 -61.75 -61.755 -61.76 -61.765 -61.77 -61.775 -61.78 -61.785 -61.79 -61.795 -61.8 -61.805 -61.81 -61.815 -61.82 -61.825 -61.83 -61.835 -61.84 -61.845 -61.85 -61.855 -61.86 -61.865 -61.87 -61.875 -61.88 -61.885 -61.89 -61.895 -61.9 -61.905 -61.91 -61.915 -61.92 -61.925 -61.93 -61.935 -61.94 -61.945 -61.95 -61.955 -61.96 -61.965 -61.97 -61.975 -61.98 -61.985 -61.99 -61.995 -62 -62.005 -62.01 -62.015 -62.02 -62.025 -62.03 -62.035 -62.04 -62.045 -62.05 -62.055 -62.06 -62.065 -62.07 -62.075 -62.08 -62.085 -62.09 -62.095 -62.1 -62.105 -62.11 -62.115 -62.12 -62.125 -62.13 -62.135 -62.14 -62.145 -62.15 -62.155 -62.16 -62.165 -62.17 -62.175 -62.18 -62.185 -62.19 -62.195 -62.2 -62.205 -62.21 -62.215 -62.22 -62.225 -62.23 -62.235 -62.24 -62.245 -62.25 -62.255 -62.26 -62.265 -62.27 -62.275 -62.28 -62.285 -62.29 -62.295 -62.3 -62.305 -62.31 -62.315 -62.32 -62.325 -62.33 -62.335 -62.34 -62.345 -62.35 -62.355 -62.36 -62.365 -62.37 -62.375 -62.38 -62.385 -62.39 -62.395 -62.4 -62.405 -62.41 -62.415 -62.42 -62.425 -62.43 -62.435 -62.44 -62.445 -62.45 -62.455 -62.46 -62.465 -62.47 -62.475 -62.48 -62.485 -62.49 -62.495 -62.5 -62.505 -62.51 -62.515 -62.52 -62.525 -62.53 -62.535 -62.54 -62.545 -62.55 -62.555 -62.56 -62.565 -62.57 -62.575 -62.58 -62.585 -62.59 -62.595 -62.6 -62.605 -62.61 -62.615 -62.62 -62.625 -62.63 -62.635 -62.64 -62.645 -62.65 -62.655 -62.66 -62.665 -62.67 -62.675 -62.68 -62.685 -62.69 -62.695 -62.7 -62.705 -62.71 -62.715 -62.72 -62.725 -62.73 -62.735 -62.74 -62.745 -62.75 -62.755 -62.76 -62.765 -62.77 -62.775 -62.78 -62.785 -62.79 -62.795 -62.8 -62.805 -62.81 -62.815 -62.82 -62.825 -62.83 -62.835 -62.84 -62.845 -62.85 -62.855 -62.86 -62.865 -62.87 -62.875 -62.88 -62.885 -62.89 -62.895 -62.9 -62.905 -62.91 -62.915 -62.92 -62.925 -62.93 -62.935 -62.94 -62.945 -62.95 -62.955 -62.96 -62.965 -62.97 -62.975 -62.98 -62.985 -62.99 -62.995 -63 -63.005 -63.01 -63.015 -63.02 -63.025 -63.03 -63.035 -63.04 -63.045 -63.05 -63.055 -63.06 -63.065 -63.07 -63.075 -63.08 -63.085 -63.09 -63.095 -63.1 -63.105 -63.11 -63.115 -63.12 -63.125 -63.13 -63.135 -63.14 -63.145 -63.15 -63.155 -63.16 -63.165 -63.17 -63.175 -63.18 -63.185 -63.19 -63.195 -63.2 -63.205 -63.21 -63.215 -63.22 -63.225 -63.23 -63.235 -63.24 -63.245 -63.25 -63.255 -63.26 -63.265 -63.27 -63.275 -63.28 -63.285 -63.29 -63.295 -63.3 -63.305 -63.31 -63.315 -63.32 -63.325 -63.33 -63.335 -63.34 -63.345 -63.35 -63.355 -63.36 -63.365 -63.37 -63.375 -63.38 -63.385 -63.39 -63.395 -63.4 -63.405 -63.41 -63.415 -63.42 -63.425 -63.43 -63.435 -63.44 -63.445 -63.45 -63.455 -63.46 -63.465 -63.47 -63.475 -63.48 -63.485 -63.49 -63.495 -63.5 -63.505 -63.51 -63.515 -63.52 -63.525 -63.53 -63.535 -63.54 -63.545 -63.55 -63.555 -63.56 -63.565 -63.57 -63.575 -63.58 -63.585 -63.59 -63.595 -63.6 -63.605 -63.61 -63.615 -63.62 -63.625 -63.63 -63.635 -63.64 -63.645 -63.65 -63.655 -63.66 -63.665 -63.67 -63.675 -63.68 -63.685 -63.69 -63.695 -63.7 -63.705 -63.71 -63.715 -63.72 -63.725 -63.73 -63.735 -63.74 -63.745 -63.75 -63.755 -63.76 -63.765 -63.77 -63.775 -63.78 -63.785 -63.79 -63.795 -63.8 -63.805 -63.81 -63.815 -63.82 -63.825 -63.83 -63.835 -63.84 -63.845 -63.85 -63.855 -63.86 -63.865 -63.87 -63.875 -63.88 -63.885 -63.89 -63.895 -63.9 -63.905 -63.91 -63.915 -63.92 -63.925 -63.93 -63.935 -63.94 -63.945 -63.95 -63.955 -63.96 -63.965 -63.97 -63.975 -63.98 -63.985 -63.99 -63.995 -64 -64.005 -64.01 -64.015 -64.02 -64.025 -64.03 -64.035 -64.04 -64.045 -64.05 -64.055 -64.06 -64.065 -64.07 -64.075 -64.08 -64.085 -64.09 -64.095 -64.1 -64.105 -64.11 -64.115 -64.12 -64.125 -64.13 -64.135 -64.14 -64.145 -64.15 -64.155 -64.16 -64.165 -64.17 -64.175 -64.18 -64.185 -64.19 -64.195 -64.2 -64.205 -64.21 -64.215 -64.22 -64.225 -64.23 -64.235 -64.24 -64.245 -64.25 -64.255 -64.26 -64.265 -64.27 -64.275 -64.28 -64.285 -64.29 -64.295 -64.3 -64.305 -64.31 -64.315 -64.32 -64.325 -64.33 -64.335 -64.34 -64.345 -64.35 -64.355 -64.36 -64.365 -64.37 -64.375 -64.38 -64.385 -64.39 -64.395 -64.4 -64.405 -64.41 -64.415 -64.42 -64.425 -64.43 -64.435 -64.44 -64.445 -64.45 -64.455 -64.46 -64.465 -64.47 -64.475 -64.48 -64.485 -64.49 -64.495 -64.5 -64.505 -64.51 -64.515 -64.52 -64.525 -64.53 -64.535 -64.54 -64.545 -64.55 -64.555 -64.56 -64.565 -64.57 -64.575 -64.58 -64.585 -64.59 -64.595 -64.6 -64.605 -64.61 -64.615 -64.62 -64.625 -64.63 -64.635 -64.64 -64.645 -64.65 -64.655 -64.66 -64.665 -64.67 -64.675 -64.68 -64.685 -64.69 -64.695 -64.7 -64.705 -64.71 -64.715 -64.72 -64.725 -64.73 -64.735 -64.74 -64.745 -64.75 -64.755 -64.76 -64.765 -64.77 -64.775 -64.78 -64.785 -64.79 -64.795 -64.8 -64.805 -64.81 -64.815 -64.82 -64.825 -64.83 -64.835 -64.84 -64.845 -64.85 -64.855 -64.86 -64.865 -64.87 -64.875 -64.88 -64.885 -64.89 -64.895 -64.9 -64.905 -64.91 -64.915 -64.92 -64.925 -64.93 -64.935 -64.94 -64.945 -64.95 -64.955 -64.96 -64.965 -64.97 -64.975 -64.98 -64.985 -64.99 -64.995 -65 -65.005 -65.01 -65.015 -65.02 -65.025 -65.03 -65.035 -65.04 -65.045 -65.05 -65.055 -65.06 -65.065 -65.07 -65.075 -65.08 -65.085 -65.09 -65.095 -65.1 -65.105 -65.11 -65.115 -65.12 -65.125 -65.13 -65.135 -65.14 -65.145 -65.15 -65.155 -65.16 -65.165 -65.17 -65.175 -65.18 -65.185 -65.19 -65.195 -65.2 -65.205 -65.21 -65.215 -65.22 -65.225 -65.23 -65.235 -65.24 -65.245 -65.25 -65.255 -65.26 -65.265 -65.27 -65.275 -65.28 -65.285 -65.29 -65.295 -65.3 -65.305 -65.31 -65.315 -65.32 -65.325 -65.33 -65.335 -65.34 -65.345 -65.35 -65.355 -65.36 -65.365 -65.37 -65.375 -65.38 -65.385 -65.39 -65.395 -65.4 -65.405 -65.41 -65.415 -65.42 -65.425 -65.43 -65.435 -65.44 -65.445 -65.45 -65.455 -65.46 -65.465 -65.47 -65.475 -65.48 -65.485 -65.49 -65.495 -65.5 -65.505 -65.51 -65.515 -65.52 -65.525 -65.53 -65.535 -65.54 -65.545 -65.55 -65.555 -65.56 -65.565 -65.57 -65.575 -65.58 -65.585 -65.59 -65.595 -65.6 -65.605 -65.61 -65.615 -65.62 -65.625 -65.63 -65.635 -65.64 -65.645 -65.65 -65.655 -65.66 -65.665 -65.67 -65.675 -65.68 -65.685 -65.69 -65.695 -65.7 -65.705 -65.71 -65.715 -65.72 -65.725 -65.73 -65.735 -65.74 -65.745 -65.75 -65.755 -65.76 -65.765 -65.77 -65.775 -65.78 -65.785 -65.79 -65.795 -65.8 -65.805 -65.81 -65.815 -65.82 -65.825 -65.83 -65.835 -65.84 -65.845 -65.85 -65.855 -65.86 -65.865 -65.87 -65.875 -65.88 -65.885 -65.89 -65.895 -65.9 -65.905 -65.91 -65.915 -65.92 -65.925 -65.93 -65.935 -65.94 -65.945 -65.95 -65.955 -65.96 -65.965 -65.97 -65.975 -65.98 -65.985 -65.99 -65.995 -66 -66.005 -66.01 -66.015 -66.02 -66.025 -66.03 -66.035 -66.04 -66.045 -66.05 -66.055 -66.06 -66.065 -66.07 -66.075 -66.08 -66.085 -66.09 -66.095 -66.1 -66.105 -66.11 -66.115 -66.12 -66.125 -66.13 -66.135 -66.14 -66.145 -66.15 -66.155 -66.16 -66.165 -66.17 -66.175 -66.18 -66.185 -66.19 -66.195 -66.2 -66.205 -66.21 -66.215 -66.22 -66.225 -66.23 -66.235 -66.24 -66.245 -66.25 -66.255 -66.26 -66.265 -66.27 -66.275 -66.28 -66.285 -66.29 -66.295 -66.3 -66.305 -66.31 -66.315 -66.32 -66.325 -66.33 -66.335 -66.34 -66.345 -66.35 -66.355 -66.36 -66.365 -66.37 -66.375 -66.38 -66.385 -66.39 -66.395 -66.4 -66.405 -66.41 -66.415 -66.42 -66.425 -66.43 -66.435 -66.44 -66.445 -66.45 -66.455 -66.46 -66.465 -66.47 -66.475 -66.48 -66.485 -66.49 -66.495 -66.5 -66.505 -66.51 -66.515 -66.52 -66.525 -66.53 -66.535 -66.54 -66.545 -66.55 -66.555 -66.56 -66.565 -66.57 -66.575 -66.58 -66.585 -66.59 -66.595 -66.6 -66.605 -66.61 -66.615 -66.62 -66.625 -66.63 -66.635 -66.64 -66.645 -66.65 -66.655 -66.66 -66.665 -66.67 -66.675 -66.68 -66.685 -66.69 -66.695 -66.7 -66.705 -66.71 -66.715 -66.72 -66.725 -66.73 -66.735 -66.74 -66.745 -66.75 -66.755 -66.76 -66.765 -66.77 -66.775 -66.78 -66.785 -66.79 -66.795 -66.8 -66.805 -66.81 -66.815 -66.82 -66.825 -66.83 -66.835 -66.84 -66.845 -66.85 -66.855 -66.86 -66.865 -66.87 -66.875 -66.88 -66.885 -66.89 -66.895 -66.9 -66.905 -66.91 -66.915 -66.92 -66.925 -66.93 -66.935 -66.94 -66.945 -66.95 -66.955 -66.96 -66.965 -66.97 -66.975 -66.98 -66.985 -66.99 -66.995 -67 -67.005 -67.01 -67.015 -67.02 -67.025 -67.03 -67.035 -67.04 -67.045 -67.05 -67.055 -67.06 -67.065 -67.07 -67.075 -67.08 -67.085 -67.09 -67.095 -67.1 -67.105 -67.11 -67.115 -67.12 -67.125 -67.13 -67.135 -67.14 -67.145 -67.15 -67.155 -67.16 -67.165 -67.17 -67.175 -67.18 -67.185 -67.19 -67.195 -67.2 -67.205 -67.21 -67.215 -67.22 -67.225 -67.23 -67.235 -67.24 -67.245 -67.25 -67.255 -67.26 -67.265 -67.27 -67.275 -67.28 -67.285 -67.29 -67.295 -67.3 -67.305 -67.31 -67.315 -67.32 -67.325 -67.33 -67.335 -67.34 -67.345 -67.35 -67.355 -67.36 -67.365 -67.37 -67.375 -67.38 -67.385 -67.39 -67.395 -67.4 -67.405 -67.41 -67.415 -67.42 -67.425 -67.43 -67.435 -67.44 -67.445 -67.45 -67.455 -67.46 -67.465 -67.47 -67.475 -67.48 -67.485 -67.49 -67.495 -67.5 -67.505 -67.51 -67.515 -67.52 -67.525 -67.53 -67.535 -67.54 -67.545 -67.55 -67.555 -67.56 -67.565 -67.57 -67.575 -67.58 -67.585 -67.59 -67.595 -67.6 -67.605 -67.61 -67.615 -67.62 -67.625 -67.63 -67.635 -67.64 -67.645 -67.65 -67.655 -67.66 -67.665 -67.67 -67.675 -67.68 -67.685 -67.69 -67.695 -67.7 -67.705 -67.71 -67.715 -67.72 -67.725 -67.73 -67.735 -67.74 -67.745 -67.75 -67.755 -67.76 -67.765 -67.77 -67.775 -67.78 -67.785 -67.79 -67.795 -67.8 -67.805 -67.81 -67.815 -67.82 -67.825 -67.83 -67.835 -67.84 -67.845 -67.85 -67.855 -67.86 -67.865 -67.87 -67.875 -67.88 -67.885 -67.89 -67.895 -67.9 -67.905 -67.91 -67.915 -67.92 -67.925 -67.93 -67.935 -67.94 -67.945 -67.95 -67.955 -67.96 -67.965 -67.97 -67.975 -67.98 -67.985 -67.99 -67.995 -68 -68.005 -68.01 -68.015 -68.02 -68.025 -68.03 -68.035 -68.04 -68.045 -68.05 -68.055 -68.06 -68.065 -68.07 -68.075 -68.08 -68.085 -68.09 -68.095 -68.1 -68.105 -68.11 -68.115 -68.12 -68.125 -68.13 -68.135 -68.14 -68.145 -68.15 -68.155 -68.16 -68.165 -68.17 -68.175 -68.18 -68.185 -68.19 -68.195 -68.2 -68.205 -68.21 -68.215 -68.22 -68.225 -68.23 -68.235 -68.24 -68.245 -68.25 -68.255 -68.26 -68.265 -68.27 -68.275 -68.28 -68.285 -68.29 -68.295 -68.3 -68.305 -68.31 -68.315 -68.32 -68.325 -68.33 -68.335 -68.34 -68.345 -68.35 -68.355 -68.36 -68.365 -68.37 -68.375 -68.38 -68.385 -68.39 -68.395 -68.4 -68.405 -68.41 -68.415 -68.42 -68.425 -68.43 -68.435 -68.44 -68.445 -68.45 -68.455 -68.46 -68.465 -68.47 -68.475 -68.48 -68.485 -68.49 -68.495 -68.5 -68.505 -68.51 -68.515 -68.52 -68.525 -68.53 -68.535 -68.54 -68.545 -68.55 -68.555 -68.56 -68.565 -68.57 -68.575 -68.58 -68.585 -68.59 -68.595 -68.6 -68.605 -68.61 -68.615 -68.62 -68.625 -68.63 -68.635 -68.64 -68.645 -68.65 -68.655 -68.66 -68.665 -68.67 -68.675 -68.68 -68.685 -68.69 -68.695 -68.7 -68.705 -68.71 -68.715 -68.72 -68.725 -68.73 -68.735 -68.74 -68.745 -68.75 -68.755 -68.76 -68.765 -68.77 -68.775 -68.78 -68.785 -68.79 -68.795 -68.8 -68.805 -68.81 -68.815 -68.82 -68.825 -68.83 -68.835 -68.84 -68.845 -68.85 -68.855 -68.86 -68.865 -68.87 -68.875 -68.88 -68.885 -68.89 -68.895 -68.9 -68.905 -68.91 -68.915 -68.92 -68.925 -68.93 -68.935 -68.94 -68.945 -68.95 -68.955 -68.96 -68.965 -68.97 -68.975 -68.98 -68.985 -68.99 -68.995 -69 -69.005 -69.01 -69.015 -69.02 -69.025 -69.03 -69.035 -69.04 -69.045 -69.05 -69.055 -69.06 -69.065 -69.07 -69.075 -69.08 -69.085 -69.09 -69.095 -69.1 -69.105 -69.11 -69.115 -69.12 -69.125 -69.13 -69.135 -69.14 -69.145 -69.15 -69.155 -69.16 -69.165 -69.17 -69.175 -69.18 -69.185 -69.19 -69.195 -69.2 -69.205 -69.21 -69.215 -69.22 -69.225 -69.23 -69.235 -69.24 -69.245 -69.25 -69.255 -69.26 -69.265 -69.27 -69.275 -69.28 -69.285 -69.29 -69.295 -69.3 -69.305 -69.31 -69.315 -69.32 -69.325 -69.33 -69.335 -69.34 -69.345 -69.35 -69.355 -69.36 -69.365 -69.37 -69.375 -69.38 -69.385 -69.39 -69.395 -69.4 -69.405 -69.41 -69.415 -69.42 -69.425 -69.43 -69.435 -69.44 -69.445 -69.45 -69.455 -69.46 -69.465 -69.47 -69.475 -69.48 -69.485 -69.49 -69.495 -69.5 -69.505 -69.51 -69.515 -69.52 -69.525 -69.53 -69.535 -69.54 -69.545 -69.55 -69.555 -69.56 -69.565 -69.57 -69.575 -69.58 -69.585 -69.59 -69.595 -69.6 -69.605 -69.61 -69.615 -69.62 -69.625 -69.63 -69.635 -69.64 -69.645 -69.65 -69.655 -69.66 -69.665 -69.67 -69.675 -69.68 -69.685 -69.69 -69.695 -69.7 -69.705 -69.71 -69.715 -69.72 -69.725 -69.73 -69.735 -69.74 -69.745 -69.75 -69.755 -69.76 -69.765 -69.77 -69.775 -69.78 -69.785 -69.79 -69.795 -69.8 -69.805 -69.81 -69.815 -69.82 -69.825 -69.83 -69.835 -69.84 -69.845 -69.85 -69.855 -69.86 -69.865 -69.87 -69.875 -69.88 -69.885 -69.89 -69.895 -69.9 -69.905 -69.91 -69.915 -69.92 -69.925 -69.93 -69.935 -69.94 -69.945 -69.95 -69.955 -69.96 -69.965 -69.97 -69.975 -69.98 -69.985 -69.99 -69.995 -70 -70.005 -70.01 -70.015 -70.02 -70.025 -70.03 -70.035 -70.04 -70.045 -70.05 -70.055 -70.06 -70.065 -70.07 -70.075 -70.08 -70.085 -70.09 -70.095 -70.1 -70.105 -70.11 -70.115 -70.12 -70.125 -70.13 -70.135 -70.14 -70.145 -70.15 -70.155 -70.16 -70.165 -70.17 -70.175 -70.18 -70.185 -70.19 -70.195 -70.2 -70.205 -70.21 -70.215 -70.22 -70.225 -70.23 -70.235 -70.24 -70.245 -70.25 -70.255 -70.26 -70.265 -70.27 -70.275 -70.28 -70.285 -70.29 -70.295 -70.3 -70.305 -70.31 -70.315 -70.32 -70.325 -70.33 -70.335 -70.34 -70.345 -70.35 -70.355 -70.36 -70.365 -70.37 -70.375 -70.38 -70.385 -70.39 -70.395 -70.4 -70.405 -70.41 -70.415 -70.42 -70.425 -70.43 -70.435 -70.44 -70.445 -70.45 -70.455 -70.46 -70.465 -70.47 -70.475 -70.48 -70.485 -70.49 -70.495 -70.5 -70.505 -70.51 -70.515 -70.52 -70.525 -70.53 -70.535 -70.54 -70.545 -70.55 -70.555 -70.56 -70.565 -70.57 -70.575 -70.58 -70.585 -70.59 -70.595 -70.6 -70.605 -70.61 -70.615 -70.62 -70.625 -70.63 -70.635 -70.64 -70.645 -70.65 -70.655 -70.66 -70.665 -70.67 -70.675 -70.68 -70.685 -70.69 -70.695 -70.7 -70.705 -70.71 -70.715 -70.72 -70.725 -70.73 -70.735 -70.74 -70.745 -70.75 -70.755 -70.76 -70.765 -70.77 -70.775 -70.78 -70.785 -70.79 -70.795 -70.8 -70.805 -70.81 -70.815 -70.82 -70.825 -70.83 -70.835 -70.84 -70.845 -70.85 -70.855 -70.86 -70.865 -70.87 -70.875 -70.88 -70.885 -70.89 -70.895 -70.9 -70.905 -70.91 -70.915 -70.92 -70.925 -70.93 -70.935 -70.94 -70.945 -70.95 -70.955 -70.96 -70.965 -70.97 -70.975 -70.98 -70.985 -70.99 -70.995 -71 -71.005 -71.01 -71.015 -71.02 -71.025 -71.03 -71.035 -71.04 -71.045 -71.05 -71.055 -71.06 -71.065 -71.07 -71.075 -71.08 -71.085 -71.09 -71.095 -71.1 -71.105 -71.11 -71.115 -71.12 -71.125 -71.13 -71.135 -71.14 -71.145 -71.15 -71.155 -71.16 -71.165 -71.17 -71.175 -71.18 -71.185 -71.19 -71.195 -71.2 -71.205 -71.21 -71.215 -71.22 -71.225 -71.23 -71.235 -71.24 -71.245 -71.25 -71.255 -71.26 -71.265 -71.27 -71.275 -71.28 -71.285 -71.29 -71.295 -71.3 -71.305 -71.31 -71.315 -71.32 -71.325 -71.33 -71.335 -71.34 -71.345 -71.35 -71.355 -71.36 -71.365 -71.37 -71.375 -71.38 -71.385 -71.39 -71.395 -71.4 -71.405 -71.41 -71.415 -71.42 -71.425 -71.43 -71.435 -71.44 -71.445 -71.45 -71.455 -71.46 -71.465 -71.47 -71.475 -71.48 -71.485 -71.49 -71.495 -71.5 -71.505 -71.51 -71.515 -71.52 -71.525 -71.53 -71.535 -71.54 -71.545 -71.55 -71.555 -71.56 -71.565 -71.57 -71.575 -71.58 -71.585 -71.59 -71.595 -71.6 -71.605 -71.61 -71.615 -71.62 -71.625 -71.63 -71.635 -71.64 -71.645 -71.65 -71.655 -71.66 -71.665 -71.67 -71.675 -71.68 -71.685 -71.69 -71.695 -71.7 -71.705 -71.71 -71.715 -71.72 -71.725 -71.73 -71.735 -71.74 -71.745 -71.75 -71.755 -71.76 -71.765 -71.77 -71.775 -71.78 -71.785 -71.79 -71.795 -71.8 -71.805 -71.81 -71.815 -71.82 -71.825 -71.83 -71.835 -71.84 -71.845 -71.85 -71.855 -71.86 -71.865 -71.87 -71.875 -71.88 -71.885 -71.89 -71.895 -71.9 -71.905 -71.91 -71.915 -71.92 -71.925 -71.93 -71.935 -71.94 -71.945 -71.95 -71.955 -71.96 -71.965 -71.97 -71.975 -71.98 -71.985 -71.99 -71.995 -72 -72.005 -72.01 -72.015 -72.02 -72.025 -72.03 -72.035 -72.04 -72.045 -72.05 -72.055 -72.06 -72.065 -72.07 -72.075 -72.08 -72.085 -72.09 -72.095 -72.1 -72.105 -72.11 -72.115 -72.12 -72.125 -72.13 -72.135 -72.14 -72.145 -72.15 -72.155 -72.16 -72.165 -72.17 -72.175 -72.18 -72.185 -72.19 -72.195 -72.2 -72.205 -72.21 -72.215 -72.22 -72.225 -72.23 -72.235 -72.24 -72.245 -72.25 -72.255 -72.26 -72.265 -72.27 -72.275 -72.28 -72.285 -72.29 -72.295 -72.3 -72.305 -72.31 -72.315 -72.32 -72.325 -72.33 -72.335 -72.34 -72.345 -72.35 -72.355 -72.36 -72.365 -72.37 -72.375 -72.38 -72.385 -72.39 -72.395 -72.4 -72.405 -72.41 -72.415 -72.42 -72.425 -72.43 -72.435 -72.44 -72.445 -72.45 -72.455 -72.46 -72.465 -72.47 -72.475 -72.48 -72.485 -72.49 -72.495 -72.5 -72.505 -72.51 -72.515 -72.52 -72.525 -72.53 -72.535 -72.54 -72.545 -72.55 -72.555 -72.56 -72.565 -72.57 -72.575 -72.58 -72.585 -72.59 -72.595 -72.6 -72.605 -72.61 -72.615 -72.62 -72.625 -72.63 -72.635 -72.64 -72.645 -72.65 -72.655 -72.66 -72.665 -72.67 -72.675 -72.68 -72.685 -72.69 -72.695 -72.7 -72.705 -72.71 -72.715 -72.72 -72.725 -72.73 -72.735 -72.74 -72.745 -72.75 -72.755 -72.76 -72.765 -72.77 -72.775 -72.78 -72.785 -72.79 -72.795 -72.8 -72.805 -72.81 -72.815 -72.82 -72.825 -72.83 -72.835 -72.84 -72.845 -72.85 -72.855 -72.86 -72.865 -72.87 -72.875 -72.88 -72.885 -72.89 -72.895 -72.9 -72.905 -72.91 -72.915 -72.92 -72.925 -72.93 -72.935 -72.94 -72.945 -72.95 -72.955 -72.96 -72.965 -72.97 -72.975 -72.98 -72.985 -72.99 -72.995 -73 -73.005 -73.01 -73.015 -73.02 -73.025 -73.03 -73.035 -73.04 -73.045 -73.05 -73.055 -73.06 -73.065 -73.07 -73.075 -73.08 -73.085 -73.09 -73.095 -73.1 -73.105 -73.11 -73.115 -73.12 -73.125 -73.13 -73.135 -73.14 -73.145 -73.15 -73.155 -73.16 -73.165 -73.17 -73.175 -73.18 -73.185 -73.19 -73.195 -73.2 -73.205 -73.21 -73.215 -73.22 -73.225 -73.23 -73.235 -73.24 -73.245 -73.25 -73.255 -73.26 -73.265 -73.27 -73.275 -73.28 -73.285 -73.29 -73.295 -73.3 -73.305 -73.31 -73.315 -73.32 -73.325 -73.33 -73.335 -73.34 -73.345 -73.35 -73.355 -73.36 -73.365 -73.37 -73.375 -73.38 -73.385 -73.39 -73.395 -73.4 -73.405 -73.41 -73.415 -73.42 -73.425 -73.43 -73.435 -73.44 -73.445 -73.45 -73.455 -73.46 -73.465 -73.47 -73.475 -73.48 -73.485 -73.49 -73.495 -73.5 -73.505 -73.51 -73.515 -73.52 -73.525 -73.53 -73.535 -73.54 -73.545 -73.55 -73.555 -73.56 -73.565 -73.57 -73.575 -73.58 -73.585 -73.59 -73.595 -73.6 -73.605 -73.61 -73.615 -73.62 -73.625 -73.63 -73.635 -73.64 -73.645 -73.65 -73.655 -73.66 -73.665 -73.67 -73.675 -73.68 -73.685 -73.69 -73.695 -73.7 -73.705 -73.71 -73.715 -73.72 -73.725 -73.73 -73.735 -73.74 -73.745 -73.75 -73.755 -73.76 -73.765 -73.77 -73.775 -73.78 -73.785 -73.79 -73.795 -73.8 -73.805 -73.81 -73.815 -73.82 -73.825 -73.83 -73.835 -73.84 -73.845 -73.85 -73.855 -73.86 -73.865 -73.87 -73.875 -73.88 -73.885 -73.89 -73.895 -73.9 -73.905 -73.91 -73.915 -73.92 -73.925 -73.93 -73.935 -73.94 -73.945 -73.95 -73.955 -73.96 -73.965 -73.97 -73.975 -73.98 -73.985 -73.99 -73.995 -74 -74.005 -74.01 -74.015 -74.02 -74.025 -74.03 -74.035 -74.04 -74.045 -74.05 -74.055 -74.06 -74.065 -74.07 -74.075 -74.08 -74.085 -74.09 -74.095 -74.1 -74.105 -74.11 -74.115 -74.12 -74.125 -74.13 -74.135 -74.14 -74.145 -74.15 -74.155 -74.16 -74.165 -74.17 -74.175 -74.18 -74.185 -74.19 -74.195 -74.2 -74.205 -74.21 -74.215 -74.22 -74.225 -74.23 -74.235 -74.24 -74.245 -74.25 -74.255 -74.26 -74.265 -74.27 -74.275 -74.28 -74.285 -74.29 -74.295 -74.3 -74.305 -74.31 -74.315 -74.32 -74.325 -74.33 -74.335 -74.34 -74.345 -74.35 -74.355 -74.36 -74.365 -74.37 -74.375 -74.38 -74.385 -74.39 -74.395 -74.4 -74.405 -74.41 -74.415 -74.42 -74.425 -74.43 -74.435 -74.44 -74.445 -74.45 -74.455 -74.46 -74.465 -74.47 -74.475 -74.48 -74.485 -74.49 -74.495 -74.5 -74.505 -74.51 -74.515 -74.52 -74.525 -74.53 -74.535 -74.54 -74.545 -74.55 -74.555 -74.56 -74.565 -74.57 -74.575 -74.58 -74.585 -74.59 -74.595 -74.6 -74.605 -74.61 -74.615 -74.62 -74.625 -74.63 -74.635 -74.64 -74.645 -74.65 -74.655 -74.66 -74.665 -74.67 -74.675 -74.68 -74.685 -74.69 -74.695 -74.7 -74.705 -74.71 -74.715 -74.72 -74.725 -74.73 -74.735 -74.74 -74.745 -74.75 -74.755 -74.76 -74.765 -74.77 -74.775 -74.78 -74.785 -74.79 -74.795 -74.8 -74.805 -74.81 -74.815 -74.82 -74.825 -74.83 -74.835 -74.84 -74.845 -74.85 -74.855 -74.86 -74.865 -74.87 -74.875 -74.88 -74.885 -74.89 -74.895 -74.9 -74.905 -74.91 -74.915 -74.92 -74.925 -74.93 -74.935 -74.94 -74.945 -74.95 -74.955 -74.96 -74.965 -74.97 -74.975 -74.98 -74.985 -74.99 -74.995 -75 -75.005 -75.01 -75.015 -75.02 -75.025 -75.03 -75.035 -75.04 -75.045 -75.05 -75.055 -75.06 -75.065 -75.07 -75.075 -75.08 -75.085 -75.09 -75.095 -75.1 -75.105 -75.11 -75.115 -75.12 -75.125 -75.13 -75.135 -75.14 -75.145 -75.15 -75.155 -75.16 -75.165 -75.17 -75.175 -75.18 -75.185 -75.19 -75.195 -75.2 -75.205 -75.21 -75.215 -75.22 -75.225 -75.23 -75.235 -75.24 -75.245 -75.25 -75.255 -75.26 -75.265 -75.27 -75.275 -75.28 -75.285 -75.29 -75.295 -75.3 -75.305 -75.31 -75.315 -75.32 -75.325 -75.33 -75.335 -75.34 -75.345 -75.35 -75.355 -75.36 -75.365 -75.37 -75.375 -75.38 -75.385 -75.39 -75.395 -75.4 -75.405 -75.41 -75.415 -75.42 -75.425 -75.43 -75.435 -75.44 -75.445 -75.45 -75.455 -75.46 -75.465 -75.47 -75.475 -75.48 -75.485 -75.49 -75.495 -75.5 -75.505 -75.51 -75.515 -75.52 -75.525 -75.53 -75.535 -75.54 -75.545 -75.55 -75.555 -75.56 -75.565 -75.57 -75.575 -75.58 -75.585 -75.59 -75.595 -75.6 -75.605 -75.61 -75.615 -75.62 -75.625 -75.63 -75.635 -75.64 -75.645 -75.65 -75.655 -75.66 -75.665 -75.67 -75.675 -75.68 -75.685 -75.69 -75.695 -75.7 -75.705 -75.71 -75.715 -75.72 -75.725 -75.73 -75.735 -75.74 -75.745 -75.75 -75.755 -75.76 -75.765 -75.77 -75.775 -75.78 -75.785 -75.79 -75.795 -75.8 -75.805 -75.81 -75.815 -75.82 -75.825 -75.83 -75.835 -75.84 -75.845 -75.85 -75.855 -75.86 -75.865 -75.87 -75.875 -75.88 -75.885 -75.89 -75.895 -75.9 -75.905 -75.91 -75.915 -75.92 -75.925 -75.93 -75.935 -75.94 -75.945 -75.95 -75.955 -75.96 -75.965 -75.97 -75.975 -75.98 -75.985 -75.99 -75.995 -76 -76.005 -76.01 -76.015 -76.02 -76.025 -76.03 -76.035 -76.04 -76.045 -76.05 -76.055 -76.06 -76.065 -76.07 -76.075 -76.08 -76.085 -76.09 -76.095 -76.1 -76.105 -76.11 -76.115 -76.12 -76.125 -76.13 -76.135 -76.14 -76.145 -76.15 -76.155 -76.16 -76.165 -76.17 -76.175 -76.18 -76.185 -76.19 -76.195 -76.2 -76.205 -76.21 -76.215 -76.22 -76.225 -76.23 -76.235 -76.24 -76.245 -76.25 -76.255 -76.26 -76.265 -76.27 -76.275 -76.28 -76.285 -76.29 -76.295 -76.3 -76.305 -76.31 -76.315 -76.32 -76.325 -76.33 -76.335 -76.34 -76.345 -76.35 -76.355 -76.36 -76.365 -76.37 -76.375 -76.38 -76.385 -76.39 -76.395 -76.4 -76.405 -76.41 -76.415 -76.42 -76.425 -76.43 -76.435 -76.44 -76.445 -76.45 -76.455 -76.46 -76.465 -76.47 -76.475 -76.48 -76.485 -76.49 -76.495 -76.5 -76.505 -76.51 -76.515 -76.52 -76.525 -76.53 -76.535 -76.54 -76.545 -76.55 -76.555 -76.56 -76.565 -76.57 -76.575 -76.58 -76.585 -76.59 -76.595 -76.6 -76.605 -76.61 -76.615 -76.62 -76.625 -76.63 -76.635 -76.64 -76.645 -76.65 -76.655 -76.66 -76.665 -76.67 -76.675 -76.68 -76.685 -76.69 -76.695 -76.7 -76.705 -76.71 -76.715 -76.72 -76.725 -76.73 -76.735 -76.74 -76.745 -76.75 -76.755 -76.76 -76.765 -76.77 -76.775 -76.78 -76.785 -76.79 -76.795 -76.8 -76.805 -76.81 -76.815 -76.82 -76.825 -76.83 -76.835 -76.84 -76.845 -76.85 -76.855 -76.86 -76.865 -76.87 -76.875 -76.88 -76.885 -76.89 -76.895 -76.9 -76.905 -76.91 -76.915 -76.92 -76.925 -76.93 -76.935 -76.94 -76.945 -76.95 -76.955 -76.96 -76.965 -76.97 -76.975 -76.98 -76.985 -76.99 -76.995 -77 -77.005 -77.01 -77.015 -77.02 -77.025 -77.03 -77.035 -77.04 -77.045 -77.05 -77.055 -77.06 -77.065 -77.07 -77.075 -77.08 -77.085 -77.09 -77.095 -77.1 -77.105 -77.11 -77.115 -77.12 -77.125 -77.13 -77.135 -77.14 -77.145 -77.15 -77.155 -77.16 -77.165 -77.17 -77.175 -77.18 -77.185 -77.19 -77.195 -77.2 -77.205 -77.21 -77.215 -77.22 -77.225 -77.23 -77.235 -77.24 -77.245 -77.25 -77.255 -77.26 -77.265 -77.27 -77.275 -77.28 -77.285 -77.29 -77.295 -77.3 -77.305 -77.31 -77.315 -77.32 -77.325 -77.33 -77.335 -77.34 -77.345 -77.35 -77.355 -77.36 -77.365 -77.37 -77.375 -77.38 -77.385 -77.39 -77.395 -77.4 -77.405 -77.41 -77.415 -77.42 -77.425 -77.43 -77.435 -77.44 -77.445 -77.45 -77.455 -77.46 -77.465 -77.47 -77.475 -77.48 -77.485 -77.49 -77.495 -77.5 -77.505 -77.51 -77.515 -77.52 -77.525 -77.53 -77.535 -77.54 -77.545 -77.55 -77.555 -77.56 -77.565 -77.57 -77.575 -77.58 -77.585 -77.59 -77.595 -77.6 -77.605 -77.61 -77.615 -77.62 -77.625 -77.63 -77.635 -77.64 -77.645 -77.65 -77.655 -77.66 -77.665 -77.67 -77.675 -77.68 -77.685 -77.69 -77.695 -77.7 -77.705 -77.71 -77.715 -77.72 -77.725 -77.73 -77.735 -77.74 -77.745 -77.75 -77.755 -77.76 -77.765 -77.77 -77.775 -77.78 -77.785 -77.79 -77.795 -77.8 -77.805 -77.81 -77.815 -77.82 -77.825 -77.83 -77.835 -77.84 -77.845 -77.85 -77.855 -77.86 -77.865 -77.87 -77.875 -77.88 -77.885 -77.89 -77.895 -77.9 -77.905 -77.91 -77.915 -77.92 -77.925 -77.93 -77.935 -77.94 -77.945 -77.95 -77.955 -77.96 -77.965 -77.97 -77.975 -77.98 -77.985 -77.99 -77.995 -78 -78.005 -78.01 -78.015 -78.02 -78.025 -78.03 -78.035 -78.04 -78.045 -78.05 -78.055 -78.06 -78.065 -78.07 -78.075 -78.08 -78.085 -78.09 -78.095 -78.1 -78.105 -78.11 -78.115 -78.12 -78.125 -78.13 -78.135 -78.14 -78.145 -78.15 -78.155 -78.16 -78.165 -78.17 -78.175 -78.18 -78.185 -78.19 -78.195 -78.2 -78.205 -78.21 -78.215 -78.22 -78.225 -78.23 -78.235 -78.24 -78.245 -78.25 -78.255 -78.26 -78.265 -78.27 -78.275 -78.28 -78.285 -78.29 -78.295 -78.3 -78.305 -78.31 -78.315 -78.32 -78.325 -78.33 -78.335 -78.34 -78.345 -78.35 -78.355 -78.36 -78.365 -78.37 -78.375 -78.38 -78.385 -78.39 -78.395 -78.4 -78.405 -78.41 -78.415 -78.42 -78.425 -78.43 -78.435 -78.44 -78.445 -78.45 -78.455 -78.46 -78.465 -78.47 -78.475 -78.48 -78.485 -78.49 -78.495 -78.5 -78.505 -78.51 -78.515 -78.52 -78.525 -78.53 -78.535 -78.54 -78.545 -78.55 -78.555 -78.56 -78.565 -78.57 -78.575 -78.58 -78.585 -78.59 -78.595 -78.6 -78.605 -78.61 -78.615 -78.62 -78.625 -78.63 -78.635 -78.64 -78.645 -78.65 -78.655 -78.66 -78.665 -78.67 -78.675 -78.68 -78.685 -78.69 -78.695 -78.7 -78.705 -78.71 -78.715 -78.72 -78.725 -78.73 -78.735 -78.74 -78.745 -78.75 -78.755 -78.76 -78.765 -78.77 -78.775 -78.78 -78.785 -78.79 -78.795 -78.8 -78.805 -78.81 -78.815 -78.82 -78.825 -78.83 -78.835 -78.84 -78.845 -78.85 -78.855 -78.86 -78.865 -78.87 -78.875 -78.88 -78.885 -78.89 -78.895 -78.9 -78.905 -78.91 -78.915 -78.92 -78.925 -78.93 -78.935 -78.94 -78.945 -78.95 -78.955 -78.96 -78.965 -78.97 -78.975 -78.98 -78.985 -78.99 -78.995 -79 -79.005 -79.01 -79.015 -79.02 -79.025 -79.03 -79.035 -79.04 -79.045 -79.05 -79.055 -79.06 -79.065 -79.07 -79.075 -79.08 -79.085 -79.09 -79.095 -79.1 -79.105 -79.11 -79.115 -79.12 -79.125 -79.13 -79.135 -79.14 -79.145 -79.15 -79.155 -79.16 -79.165 -79.17 -79.175 -79.18 -79.185 -79.19 -79.195 -79.2 -79.205 -79.21 -79.215 -79.22 -79.225 -79.23 -79.235 -79.24 -79.245 -79.25 -79.255 -79.26 -79.265 -79.27 -79.275 -79.28 -79.285 -79.29 -79.295 -79.3 -79.305 -79.31 -79.315 -79.32 -79.325 -79.33 -79.335 -79.34 -79.345 -79.35 -79.355 -79.36 -79.365 -79.37 -79.375 -79.38 -79.385 -79.39 -79.395 -79.4 -79.405 -79.41 -79.415 -79.42 -79.425 -79.43 -79.435 -79.44 -79.445 -79.45 -79.455 -79.46 -79.465 -79.47 -79.475 -79.48 -79.485 -79.49 -79.495 -79.5 -79.505 -79.51 -79.515 -79.52 -79.525 -79.53 -79.535 -79.54 -79.545 -79.55 -79.555 -79.56 -79.565 -79.57 -79.575 -79.58 -79.585 -79.59 -79.595 -79.6 -79.605 -79.61 -79.615 -79.62 -79.625 -79.63 -79.635 -79.64 -79.645 -79.65 -79.655 -79.66 -79.665 -79.67 -79.675 -79.68 -79.685 -79.69 -79.695 -79.7 -79.705 -79.71 -79.715 -79.72 -79.725 -79.73 -79.735 -79.74 -79.745 -79.75 -79.755 -79.76 -79.765 -79.77 -79.775 -79.78 -79.785 -79.79 -79.795 -79.8 -79.805 -79.81 -79.815 -79.82 -79.825 -79.83 -79.835 -79.84 -79.845 -79.85 -79.855 -79.86 -79.865 -79.87 -79.875 -79.88 -79.885 -79.89 -79.895 -79.9 -79.905 -79.91 -79.915 -79.92 -79.925 -79.93 -79.935 -79.94 -79.945 -79.95 -79.955 -79.96 -79.965 -79.97 -79.975 -79.98 -79.985 -79.99 -79.995 -80 -80.005 -80.01 -80.015 -80.02 -80.025 -80.03 -80.035 -80.04 -80.045 -80.05 -80.055 -80.06 -80.065 -80.07 -80.075 -80.08 -80.085 -80.09 -80.095 -80.1 -80.105 -80.11 -80.115 -80.12 -80.125 -80.13 -80.135 -80.14 -80.145 -80.15 -80.155 -80.16 -80.165 -80.17 -80.175 -80.18 -80.185 -80.19 -80.195 -80.2 -80.205 -80.21 -80.215 -80.22 -80.225 -80.23 -80.235 -80.24 -80.245 -80.25 -80.255 -80.26 -80.265 -80.27 -80.275 -80.28 -80.285 -80.29 -80.295 -80.3 -80.305 -80.31 -80.315 -80.32 -80.325 -80.33 -80.335 -80.34 -80.345 -80.35 -80.355 -80.36 -80.365 -80.37 -80.375 -80.38 -80.385 -80.39 -80.395 -80.4 -80.405 -80.41 -80.415 -80.42 -80.425 -80.43 -80.435 -80.44 -80.445 -80.45 -80.455 -80.46 -80.465 -80.47 -80.475 -80.48 -80.485 -80.49 -80.495 -80.5 -80.505 -80.51 -80.515 -80.52 -80.525 -80.53 -80.535 -80.54 -80.545 -80.55 -80.555 -80.56 -80.565 -80.57 -80.575 -80.58 -80.585 -80.59 -80.595 -80.6 -80.605 -80.61 -80.615 -80.62 -80.625 -80.63 -80.635 -80.64 -80.645 -80.65 -80.655 -80.66 -80.665 -80.67 -80.675 -80.68 -80.685 -80.69 -80.695 -80.7 -80.705 -80.71 -80.715 -80.72 -80.725 -80.73 -80.735 -80.74 -80.745 -80.75 -80.755 -80.76 -80.765 -80.77 -80.775 -80.78 -80.785 -80.79 -80.795 -80.8 -80.805 -80.81 -80.815 -80.82 -80.825 -80.83 -80.835 -80.84 -80.845 -80.85 -80.855 -80.86 -80.865 -80.87 -80.875 -80.88 -80.885 -80.89 -80.895 -80.9 -80.905 -80.91 -80.915 -80.92 -80.925 -80.93 -80.935 -80.94 -80.945 -80.95 -80.955 -80.96 -80.965 -80.97 -80.975 -80.98 -80.985 -80.99 -80.995 -81 -81.005 -81.01 -81.015 -81.02 -81.025 -81.03 -81.035 -81.04 -81.045 -81.05 -81.055 -81.06 -81.065 -81.07 -81.075 -81.08 -81.085 -81.09 -81.095 -81.1 -81.105 -81.11 -81.115 -81.12 -81.125 -81.13 -81.135 -81.14 -81.145 -81.15 -81.155 -81.16 -81.165 -81.17 -81.175 -81.18 -81.185 -81.19 -81.195 -81.2 -81.205 -81.21 -81.215 -81.22 -81.225 -81.23 -81.235 -81.24 -81.245 -81.25 -81.255 -81.26 -81.265 -81.27 -81.275 -81.28 -81.285 -81.29 -81.295 -81.3 -81.305 -81.31 -81.315 -81.32 -81.325 -81.33 -81.335 -81.34 -81.345 -81.35 -81.355 -81.36 -81.365 -81.37 -81.375 -81.38 -81.385 -81.39 -81.395 -81.4 -81.405 -81.41 -81.415 -81.42 -81.425 -81.43 -81.435 -81.44 -81.445 -81.45 -81.455 -81.46 -81.465 -81.47 -81.475 -81.48 -81.485 -81.49 -81.495 -81.5 -81.505 -81.51 -81.515 -81.52 -81.525 -81.53 -81.535 -81.54 -81.545 -81.55 -81.555 -81.56 -81.565 -81.57 -81.575 -81.58 -81.585 -81.59 -81.595 -81.6 -81.605 -81.61 -81.615 -81.62 -81.625 -81.63 -81.635 -81.64 -81.645 -81.65 -81.655 -81.66 -81.665 -81.67 -81.675 -81.68 -81.685 -81.69 -81.695 -81.7 -81.705 -81.71 -81.715 -81.72 -81.725 -81.73 -81.735 -81.74 -81.745 -81.75 -81.755 -81.76 -81.765 -81.77 -81.775 -81.78 -81.785 -81.79 -81.795 -81.8 -81.805 -81.81 -81.815 -81.82 -81.825 -81.83 -81.835 -81.84 -81.845 -81.85 -81.855 -81.86 -81.865 -81.87 -81.875 -81.88 -81.885 -81.89 -81.895 -81.9 -81.905 -81.91 -81.915 -81.92 -81.925 -81.93 -81.935 -81.94 -81.945 -81.95 -81.955 -81.96 -81.965 -81.97 -81.975 -81.98 -81.985 -81.99 -81.995 -82 -82.005 -82.01 -82.015 -82.02 -82.025 -82.03 -82.035 -82.04 -82.045 -82.05 -82.055 -82.06 -82.065 -82.07 -82.075 -82.08 -82.085 -82.09 -82.095 -82.1 -82.105 -82.11 -82.115 -82.12 -82.125 -82.13 -82.135 -82.14 -82.145 -82.15 -82.155 -82.16 -82.165 -82.17 -82.175 -82.18 -82.185 -82.19 -82.195 -82.2 -82.205 -82.21 -82.215 -82.22 -82.225 -82.23 -82.235 -82.24 -82.245 -82.25 -82.255 -82.26 -82.265 -82.27 -82.275 -82.28 -82.285 -82.29 -82.295 -82.3 -82.305 -82.31 -82.315 -82.32 -82.325 -82.33 -82.335 -82.34 -82.345 -82.35 -82.355 -82.36 -82.365 -82.37 -82.375 -82.38 -82.385 -82.39 -82.395 -82.4 -82.405 -82.41 -82.415 -82.42 -82.425 -82.43 -82.435 -82.44 -82.445 -82.45 -82.455 -82.46 -82.465 -82.47 -82.475 -82.48 -82.485 -82.49 -82.495 -82.5 -82.505 -82.51 -82.515 -82.52 -82.525 -82.53 -82.535 -82.54 -82.545 -82.55 -82.555 -82.56 -82.565 -82.57 -82.575 -82.58 -82.585 -82.59 -82.595 -82.6 -82.605 -82.61 -82.615 -82.62 -82.625 -82.63 -82.635 -82.64 -82.645 -82.65 -82.655 -82.66 -82.665 -82.67 -82.675 -82.68 -82.685 -82.69 -82.695 -82.7 -82.705 -82.71 -82.715 -82.72 -82.725 -82.73 -82.735 -82.74 -82.745 -82.75 -82.755 -82.76 -82.765 -82.77 -82.775 -82.78 -82.785 -82.79 -82.795 -82.8 -82.805 -82.81 -82.815 -82.82 -82.825 -82.83 -82.835 -82.84 -82.845 -82.85 -82.855 -82.86 -82.865 -82.87 -82.875 -82.88 -82.885 -82.89 -82.895 -82.9 -82.905 -82.91 -82.915 -82.92 -82.925 -82.93 -82.935 -82.94 -82.945 -82.95 -82.955 -82.96 -82.965 -82.97 -82.975 -82.98 -82.985 -82.99 -82.995 -83 -83.005 -83.01 -83.015 -83.02 -83.025 -83.03 -83.035 -83.04 -83.045 -83.05 -83.055 -83.06 -83.065 -83.07 -83.075 -83.08 -83.085 -83.09 -83.095 -83.1 -83.105 -83.11 -83.115 -83.12 -83.125 -83.13 -83.135 -83.14 -83.145 -83.15 -83.155 -83.16 -83.165 -83.17 -83.175 -83.18 -83.185 -83.19 -83.195 -83.2 -83.205 -83.21 -83.215 -83.22 -83.225 -83.23 -83.235 -83.24 -83.245 -83.25 -83.255 -83.26 -83.265 -83.27 -83.275 -83.28 -83.285 -83.29 -83.295 -83.3 -83.305 -83.31 -83.315 -83.32 -83.325 -83.33 -83.335 -83.34 -83.345 -83.35 -83.355 -83.36 -83.365 -83.37 -83.375 -83.38 -83.385 -83.39 -83.395 -83.4 -83.405 -83.41 -83.415 -83.42 -83.425 -83.43 -83.435 -83.44 -83.445 -83.45 -83.455 -83.46 -83.465 -83.47 -83.475 -83.48 -83.485 -83.49 -83.495 -83.5 -83.505 -83.51 -83.515 -83.52 -83.525 -83.53 -83.535 -83.54 -83.545 -83.55 -83.555 -83.56 -83.565 -83.57 -83.575 -83.58 -83.585 -83.59 -83.595 -83.6 -83.605 -83.61 -83.615 -83.62 -83.625 -83.63 -83.635 -83.64 -83.645 -83.65 -83.655 -83.66 -83.665 -83.67 -83.675 -83.68 -83.685 -83.69 -83.695 -83.7 -83.705 -83.71 -83.715 -83.72 -83.725 -83.73 -83.735 -83.74 -83.745 -83.75 -83.755 -83.76 -83.765 -83.77 -83.775 -83.78 -83.785 -83.79 -83.795 -83.8 -83.805 -83.81 -83.815 -83.82 -83.825 -83.83 -83.835 -83.84 -83.845 -83.85 -83.855 -83.86 -83.865 -83.87 -83.875 -83.88 -83.885 -83.89 -83.895 -83.9 -83.905 -83.91 -83.915 -83.92 -83.925 -83.93 -83.935 -83.94 -83.945 -83.95 -83.955 -83.96 -83.965 -83.97 -83.975 -83.98 -83.985 -83.99 -83.995 -84 -84.005 -84.01 -84.015 -84.02 -84.025 -84.03 -84.035 -84.04 -84.045 -84.05 -84.055 -84.06 -84.065 -84.07 -84.075 -84.08 -84.085 -84.09 -84.095 -84.1 -84.105 -84.11 -84.115 -84.12 -84.125 -84.13 -84.135 -84.14 -84.145 -84.15 -84.155 -84.16 -84.165 -84.17 -84.175 -84.18 -84.185 -84.19 -84.195 -84.2 -84.205 -84.21 -84.215 -84.22 -84.225 -84.23 -84.235 -84.24 -84.245 -84.25 -84.255 -84.26 -84.265 -84.27 -84.275 -84.28 -84.285 -84.29 -84.295 -84.3 -84.305 -84.31 -84.315 -84.32 -84.325 -84.33 -84.335 -84.34 -84.345 -84.35 -84.355 -84.36 -84.365 -84.37 -84.375 -84.38 -84.385 -84.39 -84.395 -84.4 -84.405 -84.41 -84.415 -84.42 -84.425 -84.43 -84.435 -84.44 -84.445 -84.45 -84.455 -84.46 -84.465 -84.47 -84.475 -84.48 -84.485 -84.49 -84.495 -84.5 -84.505 -84.51 -84.515 -84.52 -84.525 -84.53 -84.535 -84.54 -84.545 -84.55 -84.555 -84.56 -84.565 -84.57 -84.575 -84.58 -84.585 -84.59 -84.595 -84.6 -84.605 -84.61 -84.615 -84.62 -84.625 -84.63 -84.635 -84.64 -84.645 -84.65 -84.655 -84.66 -84.665 -84.67 -84.675 -84.68 -84.685 -84.69 -84.695 -84.7 -84.705 -84.71 -84.715 -84.72 -84.725 -84.73 -84.735 -84.74 -84.745 -84.75 -84.755 -84.76 -84.765 -84.77 -84.775 -84.78 -84.785 -84.79 -84.795 -84.8 -84.805 -84.81 -84.815 -84.82 -84.825 -84.83 -84.835 -84.84 -84.845 -84.85 -84.855 -84.86 -84.865 -84.87 -84.875 -84.88 -84.885 -84.89 -84.895 -84.9 -84.905 -84.91 -84.915 -84.92 -84.925 -84.93 -84.935 -84.94 -84.945 -84.95 -84.955 -84.96 -84.965 -84.97 -84.975 -84.98 -84.985 -84.99 -84.995 -85 -85.005 -85.01 -85.015 -85.02 -85.025 -85.03 -85.035 -85.04 -85.045 -85.05 -85.055 -85.06 -85.065 -85.07 -85.075 -85.08 -85.085 -85.09 -85.095 -85.1 -85.105 -85.11 -85.115 -85.12 -85.125 -85.13 -85.135 -85.14 -85.145 -85.15 -85.155 -85.16 -85.165 -85.17 -85.175 -85.18 -85.185 -85.19 -85.195 -85.2 -85.205 -85.21 -85.215 -85.22 -85.225 -85.23 -85.235 -85.24 -85.245 -85.25 -85.255 -85.26 -85.265 -85.27 -85.275 -85.28 -85.285 -85.29 -85.295 -85.3 -85.305 -85.31 -85.315 -85.32 -85.325 -85.33 -85.335 -85.34 -85.345 -85.35 -85.355 -85.36 -85.365 -85.37 -85.375 -85.38 -85.385 -85.39 -85.395 -85.4 -85.405 -85.41 -85.415 -85.42 -85.425 -85.43 -85.435 -85.44 -85.445 -85.45 -85.455 -85.46 -85.465 -85.47 -85.475 -85.48 -85.485 -85.49 -85.495 -85.5 -85.505 -85.51 -85.515 -85.52 -85.525 -85.53 -85.535 -85.54 -85.545 -85.55 -85.555 -85.56 -85.565 -85.57 -85.575 -85.58 -85.585 -85.59 -85.595 -85.6 -85.605 -85.61 -85.615 -85.62 -85.625 -85.63 -85.635 -85.64 -85.645 -85.65 -85.655 -85.66 -85.665 -85.67 -85.675 -85.68 -85.685 -85.69 -85.695 -85.7 -85.705 -85.71 -85.715 -85.72 -85.725 -85.73 -85.735 -85.74 -85.745 -85.75 -85.755 -85.76 -85.765 -85.77 -85.775 -85.78 -85.785 -85.79 -85.795 -85.8 -85.805 -85.81 -85.815 -85.82 -85.825 -85.83 -85.835 -85.84 -85.845 -85.85 -85.855 -85.86 -85.865 -85.87 -85.875 -85.88 -85.885 -85.89 -85.895 -85.9 -85.905 -85.91 -85.915 -85.92 -85.925 -85.93 -85.935 -85.94 -85.945 -85.95 -85.955 -85.96 -85.965 -85.97 -85.975 -85.98 -85.985 -85.99 -85.995 -86 -86.005 -86.01 -86.015 -86.02 -86.025 -86.03 -86.035 -86.04 -86.045 -86.05 -86.055 -86.06 -86.065 -86.07 -86.075 -86.08 -86.085 -86.09 -86.095 -86.1 -86.105 -86.11 -86.115 -86.12 -86.125 -86.13 -86.135 -86.14 -86.145 -86.15 -86.155 -86.16 -86.165 -86.17 -86.175 -86.18 -86.185 -86.19 -86.195 -86.2 -86.205 -86.21 -86.215 -86.22 -86.225 -86.23 -86.235 -86.24 -86.245 -86.25 -86.255 -86.26 -86.265 -86.27 -86.275 -86.28 -86.285 -86.29 -86.295 -86.3 -86.305 -86.31 -86.315 -86.32 -86.325 -86.33 -86.335 -86.34 -86.345 -86.35 -86.355 -86.36 -86.365 -86.37 -86.375 -86.38 -86.385 -86.39 -86.395 -86.4 -86.405 -86.41 -86.415 -86.42 -86.425 -86.43 -86.435 -86.44 -86.445 -86.45 -86.455 -86.46 -86.465 -86.47 -86.475 -86.48 -86.485 -86.49 -86.495 -86.5 -86.505 -86.51 -86.515 -86.52 -86.525 -86.53 -86.535 -86.54 -86.545 -86.55 -86.555 -86.56 -86.565 -86.57 -86.575 -86.58 -86.585 -86.59 -86.595 -86.6 -86.605 -86.61 -86.615 -86.62 -86.625 -86.63 -86.635 -86.64 -86.645 -86.65 -86.655 -86.66 -86.665 -86.67 -86.675 -86.68 -86.685 -86.69 -86.695 -86.7 -86.705 -86.71 -86.715 -86.72 -86.725 -86.73 -86.735 -86.74 -86.745 -86.75 -86.755 -86.76 -86.765 -86.77 -86.775 -86.78 -86.785 -86.79 -86.795 -86.8 -86.805 -86.81 -86.815 -86.82 -86.825 -86.83 -86.835 -86.84 -86.845 -86.85 -86.855 -86.86 -86.865 -86.87 -86.875 -86.88 -86.885 -86.89 -86.895 -86.9 -86.905 -86.91 -86.915 -86.92 -86.925 -86.93 -86.935 -86.94 -86.945 -86.95 -86.955 -86.96 -86.965 -86.97 -86.975 -86.98 -86.985 -86.99 -86.995 -87 -87.005 -87.01 -87.015 -87.02 -87.025 -87.03 -87.035 -87.04 -87.045 -87.05 -87.055 -87.06 -87.065 -87.07 -87.075 -87.08 -87.085 -87.09 -87.095 -87.1 -87.105 -87.11 -87.115 -87.12 -87.125 -87.13 -87.135 -87.14 -87.145 -87.15 -87.155 -87.16 -87.165 -87.17 -87.175 -87.18 -87.185 -87.19 -87.195 -87.2 -87.205 -87.21 -87.215 -87.22 -87.225 -87.23 -87.235 -87.24 -87.245 -87.25 -87.255 -87.26 -87.265 -87.27 -87.275 -87.28 -87.285 -87.29 -87.295 -87.3 -87.305 -87.31 -87.315 -87.32 -87.325 -87.33 -87.335 -87.34 -87.345 -87.35 -87.355 -87.36 -87.365 -87.37 -87.375 -87.38 -87.385 -87.39 -87.395 -87.4 -87.405 -87.41 -87.415 -87.42 -87.425 -87.43 -87.435 -87.44 -87.445 -87.45 -87.455 -87.46 -87.465 -87.47 -87.475 -87.48 -87.485 -87.49 -87.495 -87.5 -87.505 -87.51 -87.515 -87.52 -87.525 -87.53 -87.535 -87.54 -87.545 -87.55 -87.555 -87.56 -87.565 -87.57 -87.575 -87.58 -87.585 -87.59 -87.595 -87.6 -87.605 -87.61 -87.615 -87.62 -87.625 -87.63 -87.635 -87.64 -87.645 -87.65 -87.655 -87.66 -87.665 -87.67 -87.675 -87.68 -87.685 -87.69 -87.695 -87.7 -87.705 -87.71 -87.715 -87.72 -87.725 -87.73 -87.735 -87.74 -87.745 -87.75 -87.755 -87.76 -87.765 -87.77 -87.775 -87.78 -87.785 -87.79 -87.795 -87.8 -87.805 -87.81 -87.815 -87.82 -87.825 -87.83 -87.835 -87.84 -87.845 -87.85 -87.855 -87.86 -87.865 -87.87 -87.875 -87.88 -87.885 -87.89 -87.895 -87.9 -87.905 -87.91 -87.915 -87.92 -87.925 -87.93 -87.935 -87.94 -87.945 -87.95 -87.955 -87.96 -87.965 -87.97 -87.975 -87.98 -87.985 -87.99 -87.995 -88 -88.005 -88.01 -88.015 -88.02 -88.025 -88.03 -88.035 -88.04 -88.045 -88.05 -88.055 -88.06 -88.065 -88.07 -88.075 -88.08 -88.085 -88.09 -88.095 -88.1 -88.105 -88.11 -88.115 -88.12 -88.125 -88.13 -88.135 -88.14 -88.145 -88.15 -88.155 -88.16 -88.165 -88.17 -88.175 -88.18 -88.185 -88.19 -88.195 -88.2 -88.205 -88.21 -88.215 -88.22 -88.225 -88.23 -88.235 -88.24 -88.245 -88.25 -88.255 -88.26 -88.265 -88.27 -88.275 -88.28 -88.285 -88.29 -88.295 -88.3 -88.305 -88.31 -88.315 -88.32 -88.325 -88.33 -88.335 -88.34 -88.345 -88.35 -88.355 -88.36 -88.365 -88.37 -88.375 -88.38 -88.385 -88.39 -88.395 -88.4 -88.405 -88.41 -88.415 -88.42 -88.425 -88.43 -88.435 -88.44 -88.445 -88.45 -88.455 -88.46 -88.465 -88.47 -88.475 -88.48 -88.485 -88.49 -88.495 -88.5 -88.505 -88.51 -88.515 -88.52 -88.525 -88.53 -88.535 -88.54 -88.545 -88.55 -88.555 -88.56 -88.565 -88.57 -88.575 -88.58 -88.585 -88.59 -88.595 -88.6 -88.605 -88.61 -88.615 -88.62 -88.625 -88.63 -88.635 -88.64 -88.645 -88.65 -88.655 -88.66 -88.665 -88.67 -88.675 -88.68 -88.685 -88.69 -88.695 -88.7 -88.705 -88.71 -88.715 -88.72 -88.725 -88.73 -88.735 -88.74 -88.745 -88.75 -88.755 -88.76 -88.765 -88.77 -88.775 -88.78 -88.785 -88.79 -88.795 -88.8 -88.805 -88.81 -88.815 -88.82 -88.825 -88.83 -88.835 -88.84 -88.845 -88.85 -88.855 -88.86 -88.865 -88.87 -88.875 -88.88 -88.885 -88.89 -88.895 -88.9 -88.905 -88.91 -88.915 -88.92 -88.925 -88.93 -88.935 -88.94 -88.945 -88.95 -88.955 -88.96 -88.965 -88.97 -88.975 -88.98 -88.985 -88.99 -88.995 -89 -89.005 -89.01 -89.015 -89.02 -89.025 -89.03 -89.035 -89.04 -89.045 -89.05 -89.055 -89.06 -89.065 -89.07 -89.075 -89.08 -89.085 -89.09 -89.095 -89.1 -89.105 -89.11 -89.115 -89.12 -89.125 -89.13 -89.135 -89.14 -89.145 -89.15 -89.155 -89.16 -89.165 -89.17 -89.175 -89.18 -89.185 -89.19 -89.195 -89.2 -89.205 -89.21 -89.215 -89.22 -89.225 -89.23 -89.235 -89.24 -89.245 -89.25 -89.255 -89.26 -89.265 -89.27 -89.275 -89.28 -89.285 -89.29 -89.295 -89.3 -89.305 -89.31 -89.315 -89.32 -89.325 -89.33 -89.335 -89.34 -89.345 -89.35 -89.355 -89.36 -89.365 -89.37 -89.375 -89.38 -89.385 -89.39 -89.395 -89.4 -89.405 -89.41 -89.415 -89.42 -89.425 -89.43 -89.435 -89.44 -89.445 -89.45 -89.455 -89.46 -89.465 -89.47 -89.475 -89.48 -89.485 -89.49 -89.495 -89.5 -89.505 -89.51 -89.515 -89.52 -89.525 -89.53 -89.535 -89.54 -89.545 -89.55 -89.555 -89.56 -89.565 -89.57 -89.575 -89.58 -89.585 -89.59 -89.595 -89.6 -89.605 -89.61 -89.615 -89.62 -89.625 -89.63 -89.635 -89.64 -89.645 -89.65 -89.655 -89.66 -89.665 -89.67 -89.675 -89.68 -89.685 -89.69 -89.695 -89.7 -89.705 -89.71 -89.715 -89.72 -89.725 -89.73 -89.735 -89.74 -89.745 -89.75 -89.755 -89.76 -89.765 -89.77 -89.775 -89.78 -89.785 -89.79 -89.795 -89.8 -89.805 -89.81 -89.815 -89.82 -89.825 -89.83 -89.835 -89.84 -89.845 -89.85 -89.855 -89.86 -89.865 -89.87 -89.875 -89.88 -89.885 -89.89 -89.895 -89.9 -89.905 -89.91 -89.915 -89.92 -89.925 -89.93 -89.935 -89.94 -89.945 -89.95 -89.955 -89.96 -89.965 -89.97 -89.975 -89.98 -89.985 -89.99 -89.995 -90 -90.005 -90.01 -90.015 -90.02 -90.025 -90.03 -90.035 -90.04 -90.045 -90.05 -90.055 -90.06 -90.065 -90.07 -90.075 -90.08 -90.085 -90.09 -90.095 -90.1 -90.105 -90.11 -90.115 -90.12 -90.125 -90.13 -90.135 -90.14 -90.145 -90.15 -90.155 -90.16 -90.165 -90.17 -90.175 -90.18 -90.185 -90.19 -90.195 -90.2 -90.205 -90.21 -90.215 -90.22 -90.225 -90.23 -90.235 -90.24 -90.245 -90.25 -90.255 -90.26 -90.265 -90.27 -90.275 -90.28 -90.285 -90.29 -90.295 -90.3 -90.305 -90.31 -90.315 -90.32 -90.325 -90.33 -90.335 -90.34 -90.345 -90.35 -90.355 -90.36 -90.365 -90.37 -90.375 -90.38 -90.385 -90.39 -90.395 -90.4 -90.405 -90.41 -90.415 -90.42 -90.425 -90.43 -90.435 -90.44 -90.445 -90.45 -90.455 -90.46 -90.465 -90.47 -90.475 -90.48 -90.485 -90.49 -90.495 -90.5 -90.505 -90.51 -90.515 -90.52 -90.525 -90.53 -90.535 -90.54 -90.545 -90.55 -90.555 -90.56 -90.565 -90.57 -90.575 -90.58 -90.585 -90.59 -90.595 -90.6 -90.605 -90.61 -90.615 -90.62 -90.625 -90.63 -90.635 -90.64 -90.645 -90.65 -90.655 -90.66 -90.665 -90.67 -90.675 -90.68 -90.685 -90.69 -90.695 -90.7 -90.705 -90.71 -90.715 -90.72 -90.725 -90.73 -90.735 -90.74 -90.745 -90.75 -90.755 -90.76 -90.765 -90.77 -90.775 -90.78 -90.785 -90.79 -90.795 -90.8 -90.805 -90.81 -90.815 -90.82 -90.825 -90.83 -90.835 -90.84 -90.845 -90.85 -90.855 -90.86 -90.865 -90.87 -90.875 -90.88 -90.885 -90.89 -90.895 -90.9 -90.905 -90.91 -90.915 -90.92 -90.925 -90.93 -90.935 -90.94 -90.945 -90.95 -90.955 -90.96 -90.965 -90.97 -90.975 -90.98 -90.985 -90.99 -90.995 -91 -91.005 -91.01 -91.015 -91.02 -91.025 -91.03 -91.035 -91.04 -91.045 -91.05 -91.055 -91.06 -91.065 -91.07 -91.075 -91.08 -91.085 -91.09 -91.095 -91.1 -91.105 -91.11 -91.115 -91.12 -91.125 -91.13 -91.135 -91.14 -91.145 -91.15 -91.155 -91.16 -91.165 -91.17 -91.175 -91.18 -91.185 -91.19 -91.195 -91.2 -91.205 -91.21 -91.215 -91.22 -91.225 -91.23 -91.235 -91.24 -91.245 -91.25 -91.255 -91.26 -91.265 -91.27 -91.275 -91.28 -91.285 -91.29 -91.295 -91.3 -91.305 -91.31 -91.315 -91.32 -91.325 -91.33 -91.335 -91.34 -91.345 -91.35 -91.355 -91.36 -91.365 -91.37 -91.375 -91.38 -91.385 -91.39 -91.395 -91.4 -91.405 -91.41 -91.415 -91.42 -91.425 -91.43 -91.435 -91.44 -91.445 -91.45 -91.455 -91.46 -91.465 -91.47 -91.475 -91.48 -91.485 -91.49 -91.495 -91.5 -91.505 -91.51 -91.515 -91.52 -91.525 -91.53 -91.535 -91.54 -91.545 -91.55 -91.555 -91.56 -91.565 -91.57 -91.575 -91.58 -91.585 -91.59 -91.595 -91.6 -91.605 -91.61 -91.615 -91.62 -91.625 -91.63 -91.635 -91.64 -91.645 -91.65 -91.655 -91.66 -91.665 -91.67 -91.675 -91.68 -91.685 -91.69 -91.695 -91.7 -91.705 -91.71 -91.715 -91.72 -91.725 -91.73 -91.735 -91.74 -91.745 -91.75 -91.755 -91.76 -91.765 -91.77 -91.775 -91.78 -91.785 -91.79 -91.795 -91.8 -91.805 -91.81 -91.815 -91.82 -91.825 -91.83 -91.835 -91.84 -91.845 -91.85 -91.855 -91.86 -91.865 -91.87 -91.875 -91.88 -91.885 -91.89 -91.895 -91.9 -91.905 -91.91 -91.915 -91.92 -91.925 -91.93 -91.935 -91.94 -91.945 -91.95 -91.955 -91.96 -91.965 -91.97 -91.975 -91.98 -91.985 -91.99 -91.995 -92 -92.005 -92.01 -92.015 -92.02 -92.025 -92.03 -92.035 -92.04 -92.045 -92.05 -92.055 -92.06 -92.065 -92.07 -92.075 -92.08 -92.085 -92.09 -92.095 -92.1 -92.105 -92.11 -92.115 -92.12 -92.125 -92.13 -92.135 -92.14 -92.145 -92.15 -92.155 -92.16 -92.165 -92.17 -92.175 -92.18 -92.185 -92.19 -92.195 -92.2 -92.205 -92.21 -92.215 -92.22 -92.225 -92.23 -92.235 -92.24 -92.245 -92.25 -92.255 -92.26 -92.265 -92.27 -92.275 -92.28 -92.285 -92.29 -92.295 -92.3 -92.305 -92.31 -92.315 -92.32 -92.325 -92.33 -92.335 -92.34 -92.345 -92.35 -92.355 -92.36 -92.365 -92.37 -92.375 -92.38 -92.385 -92.39 -92.395 -92.4 -92.405 -92.41 -92.415 -92.42 -92.425 -92.43 -92.435 -92.44 -92.445 -92.45 -92.455 -92.46 -92.465 -92.47 -92.475 -92.48 -92.485 -92.49 -92.495 -92.5 -92.505 -92.51 -92.515 -92.52 -92.525 -92.53 -92.535 -92.54 -92.545 -92.55 -92.555 -92.56 -92.565 -92.57 -92.575 -92.58 -92.585 -92.59 -92.595 -92.6 -92.605 -92.61 -92.615 -92.62 -92.625 -92.63 -92.635 -92.64 -92.645 -92.65 -92.655 -92.66 -92.665 -92.67 -92.675 -92.68 -92.685 -92.69 -92.695 -92.7 -92.705 -92.71 -92.715 -92.72 -92.725 -92.73 -92.735 -92.74 -92.745 -92.75 -92.755 -92.76 -92.765 -92.77 -92.775 -92.78 -92.785 -92.79 -92.795 -92.8 -92.805 -92.81 -92.815 -92.82 -92.825 -92.83 -92.835 -92.84 -92.845 -92.85 -92.855 -92.86 -92.865 -92.87 -92.875 -92.88 -92.885 -92.89 -92.895 -92.9 -92.905 -92.91 -92.915 -92.92 -92.925 -92.93 -92.935 -92.94 -92.945 -92.95 -92.955 -92.96 -92.965 -92.97 -92.975 -92.98 -92.985 -92.99 -92.995 -93 -93.005 -93.01 -93.015 -93.02 -93.025 -93.03 -93.035 -93.04 -93.045 -93.05 -93.055 -93.06 -93.065 -93.07 -93.075 -93.08 -93.085 -93.09 -93.095 -93.1 -93.105 -93.11 -93.115 -93.12 -93.125 -93.13 -93.135 -93.14 -93.145 -93.15 -93.155 -93.16 -93.165 -93.17 -93.175 -93.18 -93.185 -93.19 -93.195 -93.2 -93.205 -93.21 -93.215 -93.22 -93.225 -93.23 -93.235 -93.24 -93.245 -93.25 -93.255 -93.26 -93.265 -93.27 -93.275 -93.28 -93.285 -93.29 -93.295 -93.3 -93.305 -93.31 -93.315 -93.32 -93.325 -93.33 -93.335 -93.34 -93.345 -93.35 -93.355 -93.36 -93.365 -93.37 -93.375 -93.38 -93.385 -93.39 -93.395 -93.4 -93.405 -93.41 -93.415 -93.42 -93.425 -93.43 -93.435 -93.44 -93.445 -93.45 -93.455 -93.46 -93.465 -93.47 -93.475 -93.48 -93.485 -93.49 -93.495 -93.5 -93.505 -93.51 -93.515 -93.52 -93.525 -93.53 -93.535 -93.54 -93.545 -93.55 -93.555 -93.56 -93.565 -93.57 -93.575 -93.58 -93.585 -93.59 -93.595 -93.6 -93.605 -93.61 -93.615 -93.62 -93.625 -93.63 -93.635 -93.64 -93.645 -93.65 -93.655 -93.66 -93.665 -93.67 -93.675 -93.68 -93.685 -93.69 -93.695 -93.7 -93.705 -93.71 -93.715 -93.72 -93.725 -93.73 -93.735 -93.74 -93.745 -93.75 -93.755 -93.76 -93.765 -93.77 -93.775 -93.78 -93.785 -93.79 -93.795 -93.8 -93.805 -93.81 -93.815 -93.82 -93.825 -93.83 -93.835 -93.84 -93.845 -93.85 -93.855 -93.86 -93.865 -93.87 -93.875 -93.88 -93.885 -93.89 -93.895 -93.9 -93.905 -93.91 -93.915 -93.92 -93.925 -93.93 -93.935 -93.94 -93.945 -93.95 -93.955 -93.96 -93.965 -93.97 -93.975 -93.98 -93.985 -93.99 -93.995 -94 -94.005 -94.01 -94.015 -94.02 -94.025 -94.03 -94.035 -94.04 -94.045 -94.05 -94.055 -94.06 -94.065 -94.07 -94.075 -94.08 -94.085 -94.09 -94.095 -94.1 -94.105 -94.11 -94.115 -94.12 -94.125 -94.13 -94.135 -94.14 -94.145 -94.15 -94.155 -94.16 -94.165 -94.17 -94.175 -94.18 -94.185 -94.19 -94.195 -94.2 -94.205 -94.21 -94.215 -94.22 -94.225 -94.23 -94.235 -94.24 -94.245 -94.25 -94.255 -94.26 -94.265 -94.27 -94.275 -94.28 -94.285 -94.29 -94.295 -94.3 -94.305 -94.31 -94.315 -94.32 -94.325 -94.33 -94.335 -94.34 -94.345 -94.35 -94.355 -94.36 -94.365 -94.37 -94.375 -94.38 -94.385 -94.39 -94.395 -94.4 -94.405 -94.41 -94.415 -94.42 -94.425 -94.43 -94.435 -94.44 -94.445 -94.45 -94.455 -94.46 -94.465 -94.47 -94.475 -94.48 -94.485 -94.49 -94.495 -94.5 -94.505 -94.51 -94.515 -94.52 -94.525 -94.53 -94.535 -94.54 -94.545 -94.55 -94.555 -94.56 -94.565 -94.57 -94.575 -94.58 -94.585 -94.59 -94.595 -94.6 -94.605 -94.61 -94.615 -94.62 -94.625 -94.63 -94.635 -94.64 -94.645 -94.65 -94.655 -94.66 -94.665 -94.67 -94.675 -94.68 -94.685 -94.69 -94.695 -94.7 -94.705 -94.71 -94.715 -94.72 -94.725 -94.73 -94.735 -94.74 -94.745 -94.75 -94.755 -94.76 -94.765 -94.77 -94.775 -94.78 -94.785 -94.79 -94.795 -94.8 -94.805 -94.81 -94.815 -94.82 -94.825 -94.83 -94.835 -94.84 -94.845 -94.85 -94.855 -94.86 -94.865 -94.87 -94.875 -94.88 -94.885 -94.89 -94.895 -94.9 -94.905 -94.91 -94.915 -94.92 -94.925 -94.93 -94.935 -94.94 -94.945 -94.95 -94.955 -94.96 -94.965 -94.97 -94.975 -94.98 -94.985 -94.99 -94.995 -95 -95.005 -95.01 -95.015 -95.02 -95.025 -95.03 -95.035 -95.04 -95.045 -95.05 -95.055 -95.06 -95.065 -95.07 -95.075 -95.08 -95.085 -95.09 -95.095 -95.1 -95.105 -95.11 -95.115 -95.12 -95.125 -95.13 -95.135 -95.14 -95.145 -95.15 -95.155 -95.16 -95.165 -95.17 -95.175 -95.18 -95.185 -95.19 -95.195 -95.2 -95.205 -95.21 -95.215 -95.22 -95.225 -95.23 -95.235 -95.24 -95.245 -95.25 -95.255 -95.26 -95.265 -95.27 -95.275 -95.28 -95.285 -95.29 -95.295 -95.3 -95.305 -95.31 -95.315 -95.32 -95.325 -95.33 -95.335 -95.34 -95.345 -95.35 -95.355 -95.36 -95.365 -95.37 -95.375 -95.38 -95.385 -95.39 -95.395 -95.4 -95.405 -95.41 -95.415 -95.42 -95.425 -95.43 -95.435 -95.44 -95.445 -95.45 -95.455 -95.46 -95.465 -95.47 -95.475 -95.48 -95.485 -95.49 -95.495 -95.5 -95.505 -95.51 -95.515 -95.52 -95.525 -95.53 -95.535 -95.54 -95.545 -95.55 -95.555 -95.56 -95.565 -95.57 -95.575 -95.58 -95.585 -95.59 -95.595 -95.6 -95.605 -95.61 -95.615 -95.62 -95.625 -95.63 -95.635 -95.64 -95.645 -95.65 -95.655 -95.66 -95.665 -95.67 -95.675 -95.68 -95.685 -95.69 -95.695 -95.7 -95.705 -95.71 -95.715 -95.72 -95.725 -95.73 -95.735 -95.74 -95.745 -95.75 -95.755 -95.76 -95.765 -95.77 -95.775 -95.78 -95.785 -95.79 -95.795 -95.8 -95.805 -95.81 -95.815 -95.82 -95.825 -95.83 -95.835 -95.84 -95.845 -95.85 -95.855 -95.86 -95.865 -95.87 -95.875 -95.88 -95.885 -95.89 -95.895 -95.9 -95.905 -95.91 -95.915 -95.92 -95.925 -95.93 -95.935 -95.94 -95.945 -95.95 -95.955 -95.96 -95.965 -95.97 -95.975 -95.98 -95.985 -95.99 -95.995 -96 -96.005 -96.01 -96.015 -96.02 -96.025 -96.03 -96.035 -96.04 -96.045 -96.05 -96.055 -96.06 -96.065 -96.07 -96.075 -96.08 -96.085 -96.09 -96.095 -96.1 -96.105 -96.11 -96.115 -96.12 -96.125 -96.13 -96.135 -96.14 -96.145 -96.15 -96.155 -96.16 -96.165 -96.17 -96.175 -96.18 -96.185 -96.19 -96.195 -96.2 -96.205 -96.21 -96.215 -96.22 -96.225 -96.23 -96.235 -96.24 -96.245 -96.25 -96.255 -96.26 -96.265 -96.27 -96.275 -96.28 -96.285 -96.29 -96.295 -96.3 -96.305 -96.31 -96.315 -96.32 -96.325 -96.33 -96.335 -96.34 -96.345 -96.35 -96.355 -96.36 -96.365 -96.37 -96.375 -96.38 -96.385 -96.39 -96.395 -96.4 -96.405 -96.41 -96.415 -96.42 -96.425 -96.43 -96.435 -96.44 -96.445 -96.45 -96.455 -96.46 -96.465 -96.47 -96.475 -96.48 -96.485 -96.49 -96.495 -96.5 -96.505 -96.51 -96.515 -96.52 -96.525 -96.53 -96.535 -96.54 -96.545 -96.55 -96.555 -96.56 -96.565 -96.57 -96.575 -96.58 -96.585 -96.59 -96.595 -96.6 -96.605 -96.61 -96.615 -96.62 -96.625 -96.63 -96.635 -96.64 -96.645 -96.65 -96.655 -96.66 -96.665 -96.67 -96.675 -96.68 -96.685 -96.69 -96.695 -96.7 -96.705 -96.71 -96.715 -96.72 -96.725 -96.73 -96.735 -96.74 -96.745 -96.75 -96.755 -96.76 -96.765 -96.77 -96.775 -96.78 -96.785 -96.79 -96.795 -96.8 -96.805 -96.81 -96.815 -96.82 -96.825 -96.83 -96.835 -96.84 -96.845 -96.85 -96.855 -96.86 -96.865 -96.87 -96.875 -96.88 -96.885 -96.89 -96.895 -96.9 -96.905 -96.91 -96.915 -96.92 -96.925 -96.93 -96.935 -96.94 -96.945 -96.95 -96.955 -96.96 -96.965 -96.97 -96.975 -96.98 -96.985 -96.99 -96.995 -97 -97.005 -97.01 -97.015 -97.02 -97.025 -97.03 -97.035 -97.04 -97.045 -97.05 -97.055 -97.06 -97.065 -97.07 -97.075 -97.08 -97.085 -97.09 -97.095 -97.1 -97.105 -97.11 -97.115 -97.12 -97.125 -97.13 -97.135 -97.14 -97.145 -97.15 -97.155 -97.16 -97.165 -97.17 -97.175 -97.18 -97.185 -97.19 -97.195 -97.2 -97.205 -97.21 -97.215 -97.22 -97.225 -97.23 -97.235 -97.24 -97.245 -97.25 -97.255 -97.26 -97.265 -97.27 -97.275 -97.28 -97.285 -97.29 -97.295 -97.3 -97.305 -97.31 -97.315 -97.32 -97.325 -97.33 -97.335 -97.34 -97.345 -97.35 -97.355 -97.36 -97.365 -97.37 -97.375 -97.38 -97.385 -97.39 -97.395 -97.4 -97.405 -97.41 -97.415 -97.42 -97.425 -97.43 -97.435 -97.44 -97.445 -97.45 -97.455 -97.46 -97.465 -97.47 -97.475 -97.48 -97.485 -97.49 -97.495 -97.5 -97.505 -97.51 -97.515 -97.52 -97.525 -97.53 -97.535 -97.54 -97.545 -97.55 -97.555 -97.56 -97.565 -97.57 -97.575 -97.58 -97.585 -97.59 -97.595 -97.6 -97.605 -97.61 -97.615 -97.62 -97.625 -97.63 -97.635 -97.64 -97.645 -97.65 -97.655 -97.66 -97.665 -97.67 -97.675 -97.68 -97.685 -97.69 -97.695 -97.7 -97.705 -97.71 -97.715 -97.72 -97.725 -97.73 -97.735 -97.74 -97.745 -97.75 -97.755 -97.76 -97.765 -97.77 -97.775 -97.78 -97.785 -97.79 -97.795 -97.8 -97.805 -97.81 -97.815 -97.82 -97.825 -97.83 -97.835 -97.84 -97.845 -97.85 -97.855 -97.86 -97.865 -97.87 -97.875 -97.88 -97.885 -97.89 -97.895 -97.9 -97.905 -97.91 -97.915 -97.92 -97.925 -97.93 -97.935 -97.94 -97.945 -97.95 -97.955 -97.96 -97.965 -97.97 -97.975 -97.98 -97.985 -97.99 -97.995 -98 -98.005 -98.01 -98.015 -98.02 -98.025 -98.03 -98.035 -98.04 -98.045 -98.05 -98.055 -98.06 -98.065 -98.07 -98.075 -98.08 -98.085 -98.09 -98.095 -98.1 -98.105 -98.11 -98.115 -98.12 -98.125 -98.13 -98.135 -98.14 -98.145 -98.15 -98.155 -98.16 -98.165 -98.17 -98.175 -98.18 -98.185 -98.19 -98.195 -98.2 -98.205 -98.21 -98.215 -98.22 -98.225 -98.23 -98.235 -98.24 -98.245 -98.25 -98.255 -98.26 -98.265 -98.27 -98.275 -98.28 -98.285 -98.29 -98.295 -98.3 -98.305 -98.31 -98.315 -98.32 -98.325 -98.33 -98.335 -98.34 -98.345 -98.35 -98.355 -98.36 -98.365 -98.37 -98.375 -98.38 -98.385 -98.39 -98.395 -98.4 -98.405 -98.41 -98.415 -98.42 -98.425 -98.43 -98.435 -98.44 -98.445 -98.45 -98.455 -98.46 -98.465 -98.47 -98.475 -98.48 -98.485 -98.49 -98.495 -98.5 -98.505 -98.51 -98.515 -98.52 -98.525 -98.53 -98.535 -98.54 -98.545 -98.55 -98.555 -98.56 -98.565 -98.57 -98.575 -98.58 -98.585 -98.59 -98.595 -98.6 -98.605 -98.61 -98.615 -98.62 -98.625 -98.63 -98.635 -98.64 -98.645 -98.65 -98.655 -98.66 -98.665 -98.67 -98.675 -98.68 -98.685 -98.69 -98.695 -98.7 -98.705 -98.71 -98.715 -98.72 -98.725 -98.73 -98.735 -98.74 -98.745 -98.75 -98.755 -98.76 -98.765 -98.77 -98.775 -98.78 -98.785 -98.79 -98.795 -98.8 -98.805 -98.81 -98.815 -98.82 -98.825 -98.83 -98.835 -98.84 -98.845 -98.85 -98.855 -98.86 -98.865 -98.87 -98.875 -98.88 -98.885 -98.89 -98.895 -98.9 -98.905 -98.91 -98.915 -98.92 -98.925 -98.93 -98.935 -98.94 -98.945 -98.95 -98.955 -98.96 -98.965 -98.97 -98.975 -98.98 -98.985 -98.99 -98.995 -99 -99.005 -99.01 -99.015 -99.02 -99.025 -99.03 -99.035 -99.04 -99.045 -99.05 -99.055 -99.06 -99.065 -99.07 -99.075 -99.08 -99.085 -99.09 -99.095 -99.1 -99.105 -99.11 -99.115 -99.12 -99.125 -99.13 -99.135 -99.14 -99.145 -99.15 -99.155 -99.16 -99.165 -99.17 -99.175 -99.18 -99.185 -99.19 -99.195 -99.2 -99.205 -99.21 -99.215 -99.22 -99.225 -99.23 -99.235 -99.24 -99.245 -99.25 -99.255 -99.26 -99.265 -99.27 -99.275 -99.28 -99.285 -99.29 -99.295 -99.3 -99.305 -99.31 -99.315 -99.32 -99.325 -99.33 -99.335 -99.34 -99.345 -99.35 -99.355 -99.36 -99.365 -99.37 -99.375 -99.38 -99.385 -99.39 -99.395 -99.4 -99.405 -99.41 -99.415 -99.42 -99.425 -99.43 -99.435 -99.44 -99.445 -99.45 -99.455 -99.46 -99.465 -99.47 -99.475 -99.48 -99.485 -99.49 -99.495 -99.5 -99.505 -99.51 -99.515 -99.52 -99.525 -99.53 -99.535 -99.54 -99.545 -99.55 -99.555 -99.56 -99.565 -99.57 -99.575 -99.58 -99.585 -99.59 -99.595 -99.6 -99.605 -99.61 -99.615 -99.62 -99.625 -99.63 -99.635 -99.64 -99.645 -99.65 -99.655 -99.66 -99.665 -99.67 -99.675 -99.68 -99.685 -99.69 -99.695 -99.7 -99.705 -99.71 -99.715 -99.72 -99.725 -99.73 -99.735 -99.74 -99.745 -99.75 -99.755 -99.76 -99.765 -99.77 -99.775 -99.78 -99.785 -99.79 -99.795 -99.8 -99.805 -99.81 -99.815 -99.82 -99.825 -99.83 -99.835 -99.84 -99.845 -99.85 -99.855 -99.86 -99.865 -99.87 -99.875 -99.88 -99.885 -99.89 -99.895 -99.9 -99.905 -99.91 -99.915 -99.92 -99.925 -99.93 -99.935 -99.94 -99.945 -99.95 -99.955 -99.96 -99.965 -99.97 -99.975 -99.98 -99.985 -99.99 -99.995 -100 -100.005 -100.01 -100.015 -100.02 -100.025 -100.03 -100.035 -100.04 -100.045 -100.05 -100.055 -100.06 -100.065 -100.07 -100.075 -100.08 -100.085 -100.09 -100.095 -100.1 -100.105 -100.11 -100.115 -100.12 -100.125 -100.13 -100.135 -100.14 -100.145 -100.15 -100.155 -100.16 -100.165 -100.17 -100.175 -100.18 -100.185 -100.19 -100.195 -100.2 -100.205 -100.21 -100.215 -100.22 -100.225 -100.23 -100.235 -100.24 -100.245 -100.25 -100.255 -100.26 -100.265 -100.27 -100.275 -100.28 -100.285 -100.29 -100.295 -100.3 -100.305 -100.31 -100.315 -100.32 -100.325 -100.33 -100.335 -100.34 -100.345 -100.35 -100.355 -100.36 -100.365 -100.37 -100.375 -100.38 -100.385 -100.39 -100.395 -100.4 -100.405 -100.41 -100.415 -100.42 -100.425 -100.43 -100.435 -100.44 -100.445 -100.45 -100.455 -100.46 -100.465 -100.47 -100.475 -100.48 -100.485 -100.49 -100.495 -100.5 -100.505 -100.51 -100.515 -100.52 -100.525 -100.53 -100.535 -100.54 -100.545 -100.55 -100.555 -100.56 -100.565 -100.57 -100.575 -100.58 -100.585 -100.59 -100.595 -100.6 -100.605 -100.61 -100.615 -100.62 -100.625 -100.63 -100.635 -100.64 -100.645 -100.65 -100.655 -100.66 -100.665 -100.67 -100.675 -100.68 -100.685 -100.69 -100.695 -100.7 -100.705 -100.71 -100.715 -100.72 -100.725 -100.73 -100.735 -100.74 -100.745 -100.75 -100.755 -100.76 -100.765 -100.77 -100.775 -100.78 -100.785 -100.79 -100.795 -100.8 -100.805 -100.81 -100.815 -100.82 -100.825 -100.83 -100.835 -100.84 -100.845 -100.85 -100.855 -100.86 -100.865 -100.87 -100.875 -100.88 -100.885 -100.89 -100.895 -100.9 -100.905 -100.91 -100.915 -100.92 -100.925 -100.93 -100.935 -100.94 -100.945 -100.95 -100.955 -100.96 -100.965 -100.97 -100.975 -100.98 -100.985 -100.99 -100.995 -101 -101.005 -101.01 -101.015 -101.02 -101.025 -101.03 -101.035 -101.04 -101.045 -101.05 -101.055 -101.06 -101.065 -101.07 -101.075 -101.08 -101.085 -101.09 -101.095 -101.1 -101.105 -101.11 -101.115 -101.12 -101.125 -101.13 -101.135 -101.14 -101.145 -101.15 -101.155 -101.16 -101.165 -101.17 -101.175 -101.18 -101.185 -101.19 -101.195 -101.2 -101.205 -101.21 -101.215 -101.22 -101.225 -101.23 -101.235 -101.24 -101.245 -101.25 -101.255 -101.26 -101.265 -101.27 -101.275 -101.28 -101.285 -101.29 -101.295 -101.3 -101.305 -101.31 -101.315 -101.32 -101.325 -101.33 -101.335 -101.34 -101.345 -101.35 -101.355 -101.36 -101.365 -101.37 -101.375 -101.38 -101.385 -101.39 -101.395 -101.4 -101.405 -101.41 -101.415 -101.42 -101.425 -101.43 -101.435 -101.44 -101.445 -101.45 -101.455 -101.46 -101.465 -101.47 -101.475 -101.48 -101.485 -101.49 -101.495 -101.5 -101.505 -101.51 -101.515 -101.52 -101.525 -101.53 -101.535 -101.54 -101.545 -101.55 -101.555 -101.56 -101.565 -101.57 -101.575 -101.58 -101.585 -101.59 -101.595 -101.6 -101.605 -101.61 -101.615 -101.62 -101.625 -101.63 -101.635 -101.64 -101.645 -101.65 -101.655 -101.66 -101.665 -101.67 -101.675 -101.68 -101.685 -101.69 -101.695 -101.7 -101.705 -101.71 -101.715 -101.72 -101.725 -101.73 -101.735 -101.74 -101.745 -101.75 -101.755 -101.76 -101.765 -101.77 -101.775 -101.78 -101.785 -101.79 -101.795 -101.8 -101.805 -101.81 -101.815 -101.82 -101.825 -101.83 -101.835 -101.84 -101.845 -101.85 -101.855 -101.86 -101.865 -101.87 -101.875 -101.88 -101.885 -101.89 -101.895 -101.9 -101.905 -101.91 -101.915 -101.92 -101.925 -101.93 -101.935 -101.94 -101.945 -101.95 -101.955 -101.96 -101.965 -101.97 -101.975 -101.98 -101.985 -101.99 -101.995 -102 -102.005 -102.01 -102.015 -102.02 -102.025 -102.03 -102.035 -102.04 -102.045 -102.05 -102.055 -102.06 -102.065 -102.07 -102.075 -102.08 -102.085 -102.09 -102.095 -102.1 -102.105 -102.11 -102.115 -102.12 -102.125 -102.13 -102.135 -102.14 -102.145 -102.15 -102.155 -102.16 -102.165 -102.17 -102.175 -102.18 -102.185 -102.19 -102.195 -102.2 -102.205 -102.21 -102.215 -102.22 -102.225 -102.23 -102.235 -102.24 -102.245 -102.25 -102.255 -102.26 -102.265 -102.27 -102.275 -102.28 -102.285 -102.29 -102.295 -102.3 -102.305 -102.31 -102.315 -102.32 -102.325 -102.33 -102.335 -102.34 -102.345 -102.35 -102.355 -102.36 -102.365 -102.37 -102.375 -102.38 -102.385 -102.39 -102.395 -102.4 -102.405 -102.41 -102.415 -102.42 -102.425 -102.43 -102.435 -102.44 -102.445 -102.45 -102.455 -102.46 -102.465 -102.47 -102.475 -102.48 -102.485 -102.49 -102.495 -102.5 -102.505 -102.51 -102.515 -102.52 -102.525 -102.53 -102.535 -102.54 -102.545 -102.55 -102.555 -102.56 -102.565 -102.57 -102.575 -102.58 -102.585 -102.59 -102.595 -102.6 -102.605 -102.61 -102.615 -102.62 -102.625 -102.63 -102.635 -102.64 -102.645 -102.65 -102.655 -102.66 -102.665 -102.67 -102.675 -102.68 -102.685 -102.69 -102.695 -102.7 -102.705 -102.71 -102.715 -102.72 -102.725 -102.73 -102.735 -102.74 -102.745 -102.75 -102.755 -102.76 -102.765 -102.77 -102.775 -102.78 -102.785 -102.79 -102.795 -102.8 -102.805 -102.81 -102.815 -102.82 -102.825 -102.83 -102.835 -102.84 -102.845 -102.85 -102.855 -102.86 -102.865 -102.87 -102.875 -102.88 -102.885 -102.89 -102.895 -102.9 -102.905 -102.91 -102.915 -102.92 -102.925 -102.93 -102.935 -102.94 -102.945 -102.95 -102.955 -102.96 -102.965 -102.97 -102.975 -102.98 -102.985 -102.99 -102.995 -103 -103.005 -103.01 -103.015 -103.02 -103.025 -103.03 -103.035 -103.04 -103.045 -103.05 -103.055 -103.06 -103.065 -103.07 -103.075 -103.08 -103.085 -103.09 -103.095 -103.1 -103.105 -103.11 -103.115 -103.12 -103.125 -103.13 -103.135 -103.14 -103.145 -103.15 -103.155 -103.16 -103.165 -103.17 -103.175 -103.18 -103.185 -103.19 -103.195 -103.2 -103.205 -103.21 -103.215 -103.22 -103.225 -103.23 -103.235 -103.24 -103.245 -103.25 -103.255 -103.26 -103.265 -103.27 -103.275 -103.28 -103.285 -103.29 -103.295 -103.3 -103.305 -103.31 -103.315 -103.32 -103.325 -103.33 -103.335 -103.34 -103.345 -103.35 -103.355 -103.36 -103.365 -103.37 -103.375 -103.38 -103.385 -103.39 -103.395 -103.4 -103.405 -103.41 -103.415 -103.42 -103.425 -103.43 -103.435 -103.44 -103.445 -103.45 -103.455 -103.46 -103.465 -103.47 -103.475 -103.48 -103.485 -103.49 -103.495 -103.5 -103.505 -103.51 -103.515 -103.52 -103.525 -103.53 -103.535 -103.54 -103.545 -103.55 -103.555 -103.56 -103.565 -103.57 -103.575 -103.58 -103.585 -103.59 -103.595 -103.6 -103.605 -103.61 -103.615 -103.62 -103.625 -103.63 -103.635 -103.64 -103.645 -103.65 -103.655 -103.66 -103.665 -103.67 -103.675 -103.68 -103.685 -103.69 -103.695 -103.7 -103.705 -103.71 -103.715 -103.72 -103.725 -103.73 -103.735 -103.74 -103.745 -103.75 -103.755 -103.76 -103.765 -103.77 -103.775 -103.78 -103.785 -103.79 -103.795 -103.8 -103.805 -103.81 -103.815 -103.82 -103.825 -103.83 -103.835 -103.84 -103.845 -103.85 -103.855 -103.86 -103.865 -103.87 -103.875 -103.88 -103.885 -103.89 -103.895 -103.9 -103.905 -103.91 -103.915 -103.92 -103.925 -103.93 -103.935 -103.94 -103.945 -103.95 -103.955 -103.96 -103.965 -103.97 -103.975 -103.98 -103.985 -103.99 -103.995 -104 -104.005 -104.01 -104.015 -104.02 -104.025 -104.03 -104.035 -104.04 -104.045 -104.05 -104.055 -104.06 -104.065 -104.07 -104.075 -104.08 -104.085 -104.09 -104.095 -104.1 -104.105 -104.11 -104.115 -104.12 -104.125 -104.13 -104.135 -104.14 -104.145 -104.15 -104.155 -104.16 -104.165 -104.17 -104.175 -104.18 -104.185 -104.19 -104.195 -104.2 -104.205 -104.21 -104.215 -104.22 -104.225 -104.23 -104.235 -104.24 -104.245 -104.25 -104.255 -104.26 -104.265 -104.27 -104.275 -104.28 -104.285 -104.29 -104.295 -104.3 -104.305 -104.31 -104.315 -104.32 -104.325 -104.33 -104.335 -104.34 -104.345 -104.35 -104.355 -104.36 -104.365 -104.37 -104.375 -104.38 -104.385 -104.39 -104.395 -104.4 -104.405 -104.41 -104.415 -104.42 -104.425 -104.43 -104.435 -104.44 -104.445 -104.45 -104.455 -104.46 -104.465 -104.47 -104.475 -104.48 -104.485 -104.49 -104.495 -104.5 -104.505 -104.51 -104.515 -104.52 -104.525 -104.53 -104.535 -104.54 -104.545 -104.55 -104.555 -104.56 -104.565 -104.57 -104.575 -104.58 -104.585 -104.59 -104.595 -104.6 -104.605 -104.61 -104.615 -104.62 -104.625 -104.63 -104.635 -104.64 -104.645 -104.65 -104.655 -104.66 -104.665 -104.67 -104.675 -104.68 -104.685 -104.69 -104.695 -104.7 -104.705 -104.71 -104.715 -104.72 -104.725 -104.73 -104.735 -104.74 -104.745 -104.75 -104.755 -104.76 -104.765 -104.77 -104.775 -104.78 -104.785 -104.79 -104.795 -104.8 -104.805 -104.81 -104.815 -104.82 -104.825 -104.83 -104.835 -104.84 -104.845 -104.85 -104.855 -104.86 -104.865 -104.87 -104.875 -104.88 -104.885 -104.89 -104.895 -104.9 -104.905 -104.91 -104.915 -104.92 -104.925 -104.93 -104.935 -104.94 -104.945 -104.95 -104.955 -104.96 -104.965 -104.97 -104.975 -104.98 -104.985 -104.99 -104.995 -105 -105.005 -105.01 -105.015 -105.02 -105.025 -105.03 -105.035 -105.04 -105.045 -105.05 -105.055 -105.06 -105.065 -105.07 -105.075 -105.08 -105.085 -105.09 -105.095 -105.1 -105.105 -105.11 -105.115 -105.12 -105.125 -105.13 -105.135 -105.14 -105.145 -105.15 -105.155 -105.16 -105.165 -105.17 -105.175 -105.18 -105.185 -105.19 -105.195 -105.2 -105.205 -105.21 -105.215 -105.22 -105.225 -105.23 -105.235 -105.24 -105.245 -105.25 -105.255 -105.26 -105.265 -105.27 -105.275 -105.28 -105.285 -105.29 -105.295 -105.3 -105.305 -105.31 -105.315 -105.32 -105.325 -105.33 -105.335 -105.34 -105.345 -105.35 -105.355 -105.36 -105.365 -105.37 -105.375 -105.38 -105.385 -105.39 -105.395 -105.4 -105.405 -105.41 -105.415 -105.42 -105.425 -105.43 -105.435 -105.44 -105.445 -105.45 -105.455 -105.46 -105.465 -105.47 -105.475 -105.48 -105.485 -105.49 -105.495 -105.5 -105.505 -105.51 -105.515 -105.52 -105.525 -105.53 -105.535 -105.54 -105.545 -105.55 -105.555 -105.56 -105.565 -105.57 -105.575 -105.58 -105.585 -105.59 -105.595 -105.6 -105.605 -105.61 -105.615 -105.62 -105.625 -105.63 -105.635 -105.64 -105.645 -105.65 -105.655 -105.66 -105.665 -105.67 -105.675 -105.68 -105.685 -105.69 -105.695 -105.7 -105.705 -105.71 -105.715 -105.72 -105.725 -105.73 -105.735 -105.74 -105.745 -105.75 -105.755 -105.76 -105.765 -105.77 -105.775 -105.78 -105.785 -105.79 -105.795 -105.8 -105.805 -105.81 -105.815 -105.82 -105.825 -105.83 -105.835 -105.84 -105.845 -105.85 -105.855 -105.86 -105.865 -105.87 -105.875 -105.88 -105.885 -105.89 -105.895 -105.9 -105.905 -105.91 -105.915 -105.92 -105.925 -105.93 -105.935 -105.94 -105.945 -105.95 -105.955 -105.96 -105.965 -105.97 -105.975 -105.98 -105.985 -105.99 -105.995 -106 -106.005 -106.01 -106.015 -106.02 -106.025 -106.03 -106.035 -106.04 -106.045 -106.05 -106.055 -106.06 -106.065 -106.07 -106.075 -106.08 -106.085 -106.09 -106.095 -106.1 -106.105 -106.11 -106.115 -106.12 -106.125 -106.13 -106.135 -106.14 -106.145 -106.15 -106.155 -106.16 -106.165 -106.17 -106.175 -106.18 -106.185 -106.19 -106.195 -106.2 -106.205 -106.21 -106.215 -106.22 -106.225 -106.23 -106.235 -106.24 -106.245 -106.25 -106.255 -106.26 -106.265 -106.27 -106.275 -106.28 -106.285 -106.29 -106.295 -106.3 -106.305 -106.31 -106.315 -106.32 -106.325 -106.33 -106.335 -106.34 -106.345 -106.35 -106.355 -106.36 -106.365 -106.37 -106.375 -106.38 -106.385 -106.39 -106.395 -106.4 -106.405 -106.41 -106.415 -106.42 -106.425 -106.43 -106.435 -106.44 -106.445 -106.45 -106.455 -106.46 -106.465 -106.47 -106.475 -106.48 -106.485 -106.49 -106.495 -106.5 -106.505 -106.51 -106.515 -106.52 -106.525 -106.53 -106.535 -106.54 -106.545 -106.55 -106.555 -106.56 -106.565 -106.57 -106.575 -106.58 -106.585 -106.59 -106.595 -106.6 -106.605 -106.61 -106.615 -106.62 -106.625 -106.63 -106.635 -106.64 -106.645 -106.65 -106.655 -106.66 -106.665 -106.67 -106.675 -106.68 -106.685 -106.69 -106.695 -106.7 -106.705 -106.71 -106.715 -106.72 -106.725 -106.73 -106.735 -106.74 -106.745 -106.75 -106.755 -106.76 -106.765 -106.77 -106.775 -106.78 -106.785 -106.79 -106.795 -106.8 -106.805 -106.81 -106.815 -106.82 -106.825 -106.83 -106.835 -106.84 -106.845 -106.85 -106.855 -106.86 -106.865 -106.87 -106.875 -106.88 -106.885 -106.89 -106.895 -106.9 -106.905 -106.91 -106.915 -106.92 -106.925 -106.93 -106.935 -106.94 -106.945 -106.95 -106.955 -106.96 -106.965 -106.97 -106.975 -106.98 -106.985 -106.99 -106.995 -107 -107.005 -107.01 -107.015 -107.02 -107.025 -107.03 -107.035 -107.04 -107.045 -107.05 -107.055 -107.06 -107.065 -107.07 -107.075 -107.08 -107.085 -107.09 -107.095 -107.1 -107.105 -107.11 -107.115 -107.12 -107.125 -107.13 -107.135 -107.14 -107.145 -107.15 -107.155 -107.16 -107.165 -107.17 -107.175 -107.18 -107.185 -107.19 -107.195 -107.2 -107.205 -107.21 -107.215 -107.22 -107.225 -107.23 -107.235 -107.24 -107.245 -107.25 -107.255 -107.26 -107.265 -107.27 -107.275 -107.28 -107.285 -107.29 -107.295 -107.3 -107.305 -107.31 -107.315 -107.32 -107.325 -107.33 -107.335 -107.34 -107.345 -107.35 -107.355 -107.36 -107.365 -107.37 -107.375 -107.38 -107.385 -107.39 -107.395 -107.4 -107.405 -107.41 -107.415 -107.42 -107.425 -107.43 -107.435 -107.44 -107.445 -107.45 -107.455 -107.46 -107.465 -107.47 -107.475 -107.48 -107.485 -107.49 -107.495 -107.5 -107.505 -107.51 -107.515 -107.52 -107.525 -107.53 -107.535 -107.54 -107.545 -107.55 -107.555 -107.56 -107.565 -107.57 -107.575 -107.58 -107.585 -107.59 -107.595 -107.6 -107.605 -107.61 -107.615 -107.62 -107.625 -107.63 -107.635 -107.64 -107.645 -107.65 -107.655 -107.66 -107.665 -107.67 -107.675 -107.68 -107.685 -107.69 -107.695 -107.7 -107.705 -107.71 -107.715 -107.72 -107.725 -107.73 -107.735 -107.74 -107.745 -107.75 -107.755 -107.76 -107.765 -107.77 -107.775 -107.78 -107.785 -107.79 -107.795 -107.8 -107.805 -107.81 -107.815 -107.82 -107.825 -107.83 -107.835 -107.84 -107.845 -107.85 -107.855 -107.86 -107.865 -107.87 -107.875 -107.88 -107.885 -107.89 -107.895 -107.9 -107.905 -107.91 -107.915 -107.92 -107.925 -107.93 -107.935 -107.94 -107.945 -107.95 -107.955 -107.96 -107.965 -107.97 -107.975 -107.98 -107.985 -107.99 -107.995 -108 -108.005 -108.01 -108.015 -108.02 -108.025 -108.03 -108.035 -108.04 -108.045 -108.05 -108.055 -108.06 -108.065 -108.07 -108.075 -108.08 -108.085 -108.09 -108.095 -108.1 -108.105 -108.11 -108.115 -108.12 -108.125 -108.13 -108.135 -108.14 -108.145 -108.15 -108.155 -108.16 -108.165 -108.17 -108.175 -108.18 -108.185 -108.19 -108.195 -108.2 -108.205 -108.21 -108.215 -108.22 -108.225 -108.23 -108.235 -108.24 -108.245 -108.25 -108.255 -108.26 -108.265 -108.27 -108.275 -108.28 -108.285 -108.29 -108.295 -108.3 -108.305 -108.31 -108.315 -108.32 -108.325 -108.33 -108.335 -108.34 -108.345 -108.35 -108.355 -108.36 -108.365 -108.37 -108.375 -108.38 -108.385 -108.39 -108.395 -108.4 -108.405 -108.41 -108.415 -108.42 -108.425 -108.43 -108.435 -108.44 -108.445 -108.45 -108.455 -108.46 -108.465 -108.47 -108.475 -108.48 -108.485 -108.49 -108.495 -108.5 -108.505 -108.51 -108.515 -108.52 -108.525 -108.53 -108.535 -108.54 -108.545 -108.55 -108.555 -108.56 -108.565 -108.57 -108.575 -108.58 -108.585 -108.59 -108.595 -108.6 -108.605 -108.61 -108.615 -108.62 -108.625 -108.63 -108.635 -108.64 -108.645 -108.65 -108.655 -108.66 -108.665 -108.67 -108.675 -108.68 -108.685 -108.69 -108.695 -108.7 -108.705 -108.71 -108.715 -108.72 -108.725 -108.73 -108.735 -108.74 -108.745 -108.75 -108.755 -108.76 -108.765 -108.77 -108.775 -108.78 -108.785 -108.79 -108.795 -108.8 -108.805 -108.81 -108.815 -108.82 -108.825 -108.83 -108.835 -108.84 -108.845 -108.85 -108.855 -108.86 -108.865 -108.87 -108.875 -108.88 -108.885 -108.89 -108.895 -108.9 -108.905 -108.91 -108.915 -108.92 -108.925 -108.93 -108.935 -108.94 -108.945 -108.95 -108.955 -108.96 -108.965 -108.97 -108.975 -108.98 -108.985 -108.99 -108.995 -109 -109.005 -109.01 -109.015 -109.02 -109.025 -109.03 -109.035 -109.04 -109.045 -109.05 -109.055 -109.06 -109.065 -109.07 -109.075 -109.08 -109.085 -109.09 -109.095 -109.1 -109.105 -109.11 -109.115 -109.12 -109.125 -109.13 -109.135 -109.14 -109.145 -109.15 -109.155 -109.16 -109.165 -109.17 -109.175 -109.18 -109.185 -109.19 -109.195 -109.2 -109.205 -109.21 -109.215 -109.22 -109.225 -109.23 -109.235 -109.24 -109.245 -109.25 -109.255 -109.26 -109.265 -109.27 -109.275 -109.28 -109.285 -109.29 -109.295 -109.3 -109.305 -109.31 -109.315 -109.32 -109.325 -109.33 -109.335 -109.34 -109.345 -109.35 -109.355 -109.36 -109.365 -109.37 -109.375 -109.38 -109.385 -109.39 -109.395 -109.4 -109.405 -109.41 -109.415 -109.42 -109.425 -109.43 -109.435 -109.44 -109.445 -109.45 -109.455 -109.46 -109.465 -109.47 -109.475 -109.48 -109.485 -109.49 -109.495 -109.5 -109.505 -109.51 -109.515 -109.52 -109.525 -109.53 -109.535 -109.54 -109.545 -109.55 -109.555 -109.56 -109.565 -109.57 -109.575 -109.58 -109.585 -109.59 -109.595 -109.6 -109.605 -109.61 -109.615 -109.62 -109.625 -109.63 -109.635 -109.64 -109.645 -109.65 -109.655 -109.66 -109.665 -109.67 -109.675 -109.68 -109.685 -109.69 -109.695 -109.7 -109.705 -109.71 -109.715 -109.72 -109.725 -109.73 -109.735 -109.74 -109.745 -109.75 -109.755 -109.76 -109.765 -109.77 -109.775 -109.78 -109.785 -109.79 -109.795 -109.8 -109.805 -109.81 -109.815 -109.82 -109.825 -109.83 -109.835 -109.84 -109.845 -109.85 -109.855 -109.86 -109.865 -109.87 -109.875 -109.88 -109.885 -109.89 -109.895 -109.9 -109.905 -109.91 -109.915 -109.92 -109.925 -109.93 -109.935 -109.94 -109.945 -109.95 -109.955 -109.96 -109.965 -109.97 -109.975 -109.98 -109.985 -109.99 -109.995 -110 -110.005 -110.01 -110.015 -110.02 -110.025 -110.03 -110.035 -110.04 -110.045 -110.05 -110.055 -110.06 -110.065 -110.07 -110.075 -110.08 -110.085 -110.09 -110.095 -110.1 -110.105 -110.11 -110.115 -110.12 -110.125 -110.13 -110.135 -110.14 -110.145 -110.15 -110.155 -110.16 -110.165 -110.17 -110.175 -110.18 -110.185 -110.19 -110.195 -110.2 -110.205 -110.21 -110.215 -110.22 -110.225 -110.23 -110.235 -110.24 -110.245 -110.25 -110.255 -110.26 -110.265 -110.27 -110.275 -110.28 -110.285 -110.29 -110.295 -110.3 -110.305 -110.31 -110.315 -110.32 -110.325 -110.33 -110.335 -110.34 -110.345 -110.35 -110.355 -110.36 -110.365 -110.37 -110.375 -110.38 -110.385 -110.39 -110.395 -110.4 -110.405 -110.41 -110.415 -110.42 -110.425 -110.43 -110.435 -110.44 -110.445 -110.45 -110.455 -110.46 -110.465 -110.47 -110.475 -110.48 -110.485 -110.49 -110.495 -110.5 -110.505 -110.51 -110.515 -110.52 -110.525 -110.53 -110.535 -110.54 -110.545 -110.55 -110.555 -110.56 -110.565 -110.57 -110.575 -110.58 -110.585 -110.59 -110.595 -110.6 -110.605 -110.61 -110.615 -110.62 -110.625 -110.63 -110.635 -110.64 -110.645 -110.65 -110.655 -110.66 -110.665 -110.67 -110.675 -110.68 -110.685 -110.69 -110.695 -110.7 -110.705 -110.71 -110.715 -110.72 -110.725 -110.73 -110.735 -110.74 -110.745 -110.75 -110.755 -110.76 -110.765 -110.77 -110.775 -110.78 -110.785 -110.79 -110.795 -110.8 -110.805 -110.81 -110.815 -110.82 -110.825 -110.83 -110.835 -110.84 -110.845 -110.85 -110.855 -110.86 -110.865 -110.87 -110.875 -110.88 -110.885 -110.89 -110.895 -110.9 -110.905 -110.91 -110.915 -110.92 -110.925 -110.93 -110.935 -110.94 -110.945 -110.95 -110.955 -110.96 -110.965 -110.97 -110.975 -110.98 -110.985 -110.99 -110.995 -111 -111.005 -111.01 -111.015 -111.02 -111.025 -111.03 -111.035 -111.04 -111.045 -111.05 -111.055 -111.06 -111.065 -111.07 -111.075 -111.08 -111.085 -111.09 -111.095 -111.1 -111.105 -111.11 -111.115 -111.12 -111.125 -111.13 -111.135 -111.14 -111.145 -111.15 -111.155 -111.16 -111.165 -111.17 -111.175 -111.18 -111.185 -111.19 -111.195 -111.2 -111.205 -111.21 -111.215 -111.22 -111.225 -111.23 -111.235 -111.24 -111.245 -111.25 -111.255 -111.26 -111.265 -111.27 -111.275 -111.28 -111.285 -111.29 -111.295 -111.3 -111.305 -111.31 -111.315 -111.32 -111.325 -111.33 -111.335 -111.34 -111.345 -111.35 -111.355 -111.36 -111.365 -111.37 -111.375 -111.38 -111.385 -111.39 -111.395 -111.4 -111.405 -111.41 -111.415 -111.42 -111.425 -111.43 -111.435 -111.44 -111.445 -111.45 -111.455 -111.46 -111.465 -111.47 -111.475 -111.48 -111.485 -111.49 -111.495 -111.5 -111.505 -111.51 -111.515 -111.52 -111.525 -111.53 -111.535 -111.54 -111.545 -111.55 -111.555 -111.56 -111.565 -111.57 -111.575 -111.58 -111.585 -111.59 -111.595 -111.6 -111.605 -111.61 -111.615 -111.62 -111.625 -111.63 -111.635 -111.64 -111.645 -111.65 -111.655 -111.66 -111.665 -111.67 -111.675 -111.68 -111.685 -111.69 -111.695 -111.7 -111.705 -111.71 -111.715 -111.72 -111.725 -111.73 -111.735 -111.74 -111.745 -111.75 -111.755 -111.76 -111.765 -111.77 -111.775 -111.78 -111.785 -111.79 -111.795 -111.8 -111.805 -111.81 -111.815 -111.82 -111.825 -111.83 -111.835 -111.84 -111.845 -111.85 -111.855 -111.86 -111.865 -111.87 -111.875 -111.88 -111.885 -111.89 -111.895 -111.9 -111.905 -111.91 -111.915 -111.92 -111.925 -111.93 -111.935 -111.94 -111.945 -111.95 -111.955 -111.96 -111.965 -111.97 -111.975 -111.98 -111.985 -111.99 -111.995 -112 -112.005 -112.01 -112.015 -112.02 -112.025 -112.03 -112.035 -112.04 -112.045 -112.05 -112.055 -112.06 -112.065 -112.07 -112.075 -112.08 -112.085 -112.09 -112.095 -112.1 -112.105 -112.11 -112.115 -112.12 -112.125 -112.13 -112.135 -112.14 -112.145 -112.15 -112.155 -112.16 -112.165 -112.17 -112.175 -112.18 -112.185 -112.19 -112.195 -112.2 -112.205 -112.21 -112.215 -112.22 -112.225 -112.23 -112.235 -112.24 -112.245 -112.25 -112.255 -112.26 -112.265 -112.27 -112.275 -112.28 -112.285 -112.29 -112.295 -112.3 -112.305 -112.31 -112.315 -112.32 -112.325 -112.33 -112.335 -112.34 -112.345 -112.35 -112.355 -112.36 -112.365 -112.37 -112.375 -112.38 -112.385 -112.39 -112.395 -112.4 -112.405 -112.41 -112.415 -112.42 -112.425 -112.43 -112.435 -112.44 -112.445 -112.45 -112.455 -112.46 -112.465 -112.47 -112.475 -112.48 -112.485 -112.49 -112.495 -112.5 -112.505 -112.51 -112.515 -112.52 -112.525 -112.53 -112.535 -112.54 -112.545 -112.55 -112.555 -112.56 -112.565 -112.57 -112.575 -112.58 -112.585 -112.59 -112.595 -112.6 -112.605 -112.61 -112.615 -112.62 -112.625 -112.63 -112.635 -112.64 -112.645 -112.65 -112.655 -112.66 -112.665 -112.67 -112.675 -112.68 -112.685 -112.69 -112.695 -112.7 -112.705 -112.71 -112.715 -112.72 -112.725 -112.73 -112.735 -112.74 -112.745 -112.75 -112.755 -112.76 -112.765 -112.77 -112.775 -112.78 -112.785 -112.79 -112.795 -112.8 -112.805 -112.81 -112.815 -112.82 -112.825 -112.83 -112.835 -112.84 -112.845 -112.85 -112.855 -112.86 -112.865 -112.87 -112.875 -112.88 -112.885 -112.89 -112.895 -112.9 -112.905 -112.91 -112.915 -112.92 -112.925 -112.93 -112.935 -112.94 -112.945 -112.95 -112.955 -112.96 -112.965 -112.97 -112.975 -112.98 -112.985 -112.99 -112.995 -113 -113.005 -113.01 -113.015 -113.02 -113.025 -113.03 -113.035 -113.04 -113.045 -113.05 -113.055 -113.06 -113.065 -113.07 -113.075 -113.08 -113.085 -113.09 -113.095 -113.1 -113.105 -113.11 -113.115 -113.12 -113.125 -113.13 -113.135 -113.14 -113.145 -113.15 -113.155 -113.16 -113.165 -113.17 -113.175 -113.18 -113.185 -113.19 -113.195 -113.2 -113.205 -113.21 -113.215 -113.22 -113.225 -113.23 -113.235 -113.24 -113.245 -113.25 -113.255 -113.26 -113.265 -113.27 -113.275 -113.28 -113.285 -113.29 -113.295 -113.3 -113.305 -113.31 -113.315 -113.32 -113.325 -113.33 -113.335 -113.34 -113.345 -113.35 -113.355 -113.36 -113.365 -113.37 -113.375 -113.38 -113.385 -113.39 -113.395 -113.4 -113.405 -113.41 -113.415 -113.42 -113.425 -113.43 -113.435 -113.44 -113.445 -113.45 -113.455 -113.46 -113.465 -113.47 -113.475 -113.48 -113.485 -113.49 -113.495 -113.5 -113.505 -113.51 -113.515 -113.52 -113.525 -113.53 -113.535 -113.54 -113.545 -113.55 -113.555 -113.56 -113.565 -113.57 -113.575 -113.58 -113.585 -113.59 -113.595 -113.6 -113.605 -113.61 -113.615 -113.62 -113.625 -113.63 -113.635 -113.64 -113.645 -113.65 -113.655 -113.66 -113.665 -113.67 -113.675 -113.68 -113.685 -113.69 -113.695 -113.7 -113.705 -113.71 -113.715 -113.72 -113.725 -113.73 -113.735 -113.74 -113.745 -113.75 -113.755 -113.76 -113.765 -113.77 -113.775 -113.78 -113.785 -113.79 -113.795 -113.8 -113.805 -113.81 -113.815 -113.82 -113.825 -113.83 -113.835 -113.84 -113.845 -113.85 -113.855 -113.86 -113.865 -113.87 -113.875 -113.88 -113.885 -113.89 -113.895 -113.9 -113.905 -113.91 -113.915 -113.92 -113.925 -113.93 -113.935 -113.94 -113.945 -113.95 -113.955 -113.96 -113.965 -113.97 -113.975 -113.98 -113.985 -113.99 -113.995 -114 -114.005 -114.01 -114.015 -114.02 -114.025 -114.03 -114.035 -114.04 -114.045 -114.05 -114.055 -114.06 -114.065 -114.07 -114.075 -114.08 -114.085 -114.09 -114.095 -114.1 -114.105 -114.11 -114.115 -114.12 -114.125 -114.13 -114.135 -114.14 -114.145 -114.15 -114.155 -114.16 -114.165 -114.17 -114.175 -114.18 -114.185 -114.19 -114.195 -114.2 -114.205 -114.21 -114.215 -114.22 -114.225 -114.23 -114.235 -114.24 -114.245 -114.25 -114.255 -114.26 -114.265 -114.27 -114.275 -114.28 -114.285 -114.29 -114.295 -114.3 -114.305 -114.31 -114.315 -114.32 -114.325 -114.33 -114.335 -114.34 -114.345 -114.35 -114.355 -114.36 -114.365 -114.37 -114.375 -114.38 -114.385 -114.39 -114.395 -114.4 -114.405 -114.41 -114.415 -114.42 -114.425 -114.43 -114.435 -114.44 -114.445 -114.45 -114.455 -114.46 -114.465 -114.47 -114.475 -114.48 -114.485 -114.49 -114.495 -114.5 -114.505 -114.51 -114.515 -114.52 -114.525 -114.53 -114.535 -114.54 -114.545 -114.55 -114.555 -114.56 -114.565 -114.57 -114.575 -114.58 -114.585 -114.59 -114.595 -114.6 -114.605 -114.61 -114.615 -114.62 -114.625 -114.63 -114.635 -114.64 -114.645 -114.65 -114.655 -114.66 -114.665 -114.67 -114.675 -114.68 -114.685 -114.69 -114.695 -114.7 -114.705 -114.71 -114.715 -114.72 -114.725 -114.73 -114.735 -114.74 -114.745 -114.75 -114.755 -114.76 -114.765 -114.77 -114.775 -114.78 -114.785 -114.79 -114.795 -114.8 -114.805 -114.81 -114.815 -114.82 -114.825 -114.83 -114.835 -114.84 -114.845 -114.85 -114.855 -114.86 -114.865 -114.87 -114.875 -114.88 -114.885 -114.89 -114.895 -114.9 -114.905 -114.91 -114.915 -114.92 -114.925 -114.93 -114.935 -114.94 -114.945 -114.95 -114.955 -114.96 -114.965 -114.97 -114.975 -114.98 -114.985 -114.99 -114.995 -115 -115.005 -115.01 -115.015 -115.02 -115.025 -115.03 -115.035 -115.04 -115.045 -115.05 -115.055 -115.06 -115.065 -115.07 -115.075 -115.08 -115.085 -115.09 -115.095 -115.1 -115.105 -115.11 -115.115 -115.12 -115.125 -115.13 -115.135 -115.14 -115.145 -115.15 -115.155 -115.16 -115.165 -115.17 -115.175 -115.18 -115.185 -115.19 -115.195 -115.2 -115.205 -115.21 -115.215 -115.22 -115.225 -115.23 -115.235 -115.24 -115.245 -115.25 -115.255 -115.26 -115.265 -115.27 -115.275 -115.28 -115.285 -115.29 -115.295 -115.3 -115.305 -115.31 -115.315 -115.32 -115.325 -115.33 -115.335 -115.34 -115.345 -115.35 -115.355 -115.36 -115.365 -115.37 -115.375 -115.38 -115.385 -115.39 -115.395 -115.4 -115.405 -115.41 -115.415 -115.42 -115.425 -115.43 -115.435 -115.44 -115.445 -115.45 -115.455 -115.46 -115.465 -115.47 -115.475 -115.48 -115.485 -115.49 -115.495 -115.5 -115.505 -115.51 -115.515 -115.52 -115.525 -115.53 -115.535 -115.54 -115.545 -115.55 -115.555 -115.56 -115.565 -115.57 -115.575 -115.58 -115.585 -115.59 -115.595 -115.6 -115.605 -115.61 -115.615 -115.62 -115.625 -115.63 -115.635 -115.64 -115.645 -115.65 -115.655 -115.66 -115.665 -115.67 -115.675 -115.68 -115.685 -115.69 -115.695 -115.7 -115.705 -115.71 -115.715 -115.72 -115.725 -115.73 -115.735 -115.74 -115.745 -115.75 -115.755 -115.76 -115.765 -115.77 -115.775 -115.78 -115.785 -115.79 -115.795 -115.8 -115.805 -115.81 -115.815 -115.82 -115.825 -115.83 -115.835 -115.84 -115.845 -115.85 -115.855 -115.86 -115.865 -115.87 -115.875 -115.88 -115.885 -115.89 -115.895 -115.9 -115.905 -115.91 -115.915 -115.92 -115.925 -115.93 -115.935 -115.94 -115.945 -115.95 -115.955 -115.96 -115.965 -115.97 -115.975 -115.98 -115.985 -115.99 -115.995 -116 -116.005 -116.01 -116.015 -116.02 -116.025 -116.03 -116.035 -116.04 -116.045 -116.05 -116.055 -116.06 -116.065 -116.07 -116.075 -116.08 -116.085 -116.09 -116.095 -116.1 -116.105 -116.11 -116.115 -116.12 -116.125 -116.13 -116.135 -116.14 -116.145 -116.15 -116.155 -116.16 -116.165 -116.17 -116.175 -116.18 -116.185 -116.19 -116.195 -116.2 -116.205 -116.21 -116.215 -116.22 -116.225 -116.23 -116.235 -116.24 -116.245 -116.25 -116.255 -116.26 -116.265 -116.27 -116.275 -116.28 -116.285 -116.29 -116.295 -116.3 -116.305 -116.31 -116.315 -116.32 -116.325 -116.33 -116.335 -116.34 -116.345 -116.35 -116.355 -116.36 -116.365 -116.37 -116.375 -116.38 -116.385 -116.39 -116.395 -116.4 -116.405 -116.41 -116.415 -116.42 -116.425 -116.43 -116.435 -116.44 -116.445 -116.45 -116.455 -116.46 -116.465 -116.47 -116.475 -116.48 -116.485 -116.49 -116.495 -116.5 -116.505 -116.51 -116.515 -116.52 -116.525 -116.53 -116.535 -116.54 -116.545 -116.55 -116.555 -116.56 -116.565 -116.57 -116.575 -116.58 -116.585 -116.59 -116.595 -116.6 -116.605 -116.61 -116.615 -116.62 -116.625 -116.63 -116.635 -116.64 -116.645 -116.65 -116.655 -116.66 -116.665 -116.67 -116.675 -116.68 -116.685 -116.69 -116.695 -116.7 -116.705 -116.71 -116.715 -116.72 -116.725 -116.73 -116.735 -116.74 -116.745 -116.75 -116.755 -116.76 -116.765 -116.77 -116.775 -116.78 -116.785 -116.79 -116.795 -116.8 -116.805 -116.81 -116.815 -116.82 -116.825 -116.83 -116.835 -116.84 -116.845 -116.85 -116.855 -116.86 -116.865 -116.87 -116.875 -116.88 -116.885 -116.89 -116.895 -116.9 -116.905 -116.91 -116.915 -116.92 -116.925 -116.93 -116.935 -116.94 -116.945 -116.95 -116.955 -116.96 -116.965 -116.97 -116.975 -116.98 -116.985 -116.99 -116.995 -117 -117.005 -117.01 -117.015 -117.02 -117.025 -117.03 -117.035 -117.04 -117.045 -117.05 -117.055 -117.06 -117.065 -117.07 -117.075 -117.08 -117.085 -117.09 -117.095 -117.1 -117.105 -117.11 -117.115 -117.12 -117.125 -117.13 -117.135 -117.14 -117.145 -117.15 -117.155 -117.16 -117.165 -117.17 -117.175 -117.18 -117.185 -117.19 -117.195 -117.2 -117.205 -117.21 -117.215 -117.22 -117.225 -117.23 -117.235 -117.24 -117.245 -117.25 -117.255 -117.26 -117.265 -117.27 -117.275 -117.28 -117.285 -117.29 -117.295 -117.3 -117.305 -117.31 -117.315 -117.32 -117.325 -117.33 -117.335 -117.34 -117.345 -117.35 -117.355 -117.36 -117.365 -117.37 -117.375 -117.38 -117.385 -117.39 -117.395 -117.4 -117.405 -117.41 -117.415 -117.42 -117.425 -117.43 -117.435 -117.44 -117.445 -117.45 -117.455 -117.46 -117.465 -117.47 -117.475 -117.48 -117.485 -117.49 -117.495 -117.5 -117.505 -117.51 -117.515 -117.52 -117.525 -117.53 -117.535 -117.54 -117.545 -117.55 -117.555 -117.56 -117.565 -117.57 -117.575 -117.58 -117.585 -117.59 -117.595 -117.6 -117.605 -117.61 -117.615 -117.62 -117.625 -117.63 -117.635 -117.64 -117.645 -117.65 -117.655 -117.66 -117.665 -117.67 -117.675 -117.68 -117.685 -117.69 -117.695 -117.7 -117.705 -117.71 -117.715 -117.72 -117.725 -117.73 -117.735 -117.74 -117.745 -117.75 -117.755 -117.76 -117.765 -117.77 -117.775 -117.78 -117.785 -117.79 -117.795 -117.8 -117.805 -117.81 -117.815 -117.82 -117.825 -117.83 -117.835 -117.84 -117.845 -117.85 -117.855 -117.86 -117.865 -117.87 -117.875 -117.88 -117.885 -117.89 -117.895 -117.9 -117.905 -117.91 -117.915 -117.92 -117.925 -117.93 -117.935 -117.94 -117.945 -117.95 -117.955 -117.96 -117.965 -117.97 -117.975 -117.98 -117.985 -117.99 -117.995 -118 -118.005 -118.01 -118.015 -118.02 -118.025 -118.03 -118.035 -118.04 -118.045 -118.05 -118.055 -118.06 -118.065 -118.07 -118.075 -118.08 -118.085 -118.09 -118.095 -118.1 -118.105 -118.11 -118.115 -118.12 -118.125 -118.13 -118.135 -118.14 -118.145 -118.15 -118.155 -118.16 -118.165 -118.17 -118.175 -118.18 -118.185 -118.19 -118.195 -118.2 -118.205 -118.21 -118.215 -118.22 -118.225 -118.23 -118.235 -118.24 -118.245 -118.25 -118.255 -118.26 -118.265 -118.27 -118.275 -118.28 -118.285 -118.29 -118.295 -118.3 -118.305 -118.31 -118.315 -118.32 -118.325 -118.33 -118.335 -118.34 -118.345 -118.35 -118.355 -118.36 -118.365 -118.37 -118.375 -118.38 -118.385 -118.39 -118.395 -118.4 -118.405 -118.41 -118.415 -118.42 -118.425 -118.43 -118.435 -118.44 -118.445 -118.45 -118.455 -118.46 -118.465 -118.47 -118.475 -118.48 -118.485 -118.49 -118.495 -118.5 -118.505 -118.51 -118.515 -118.52 -118.525 -118.53 -118.535 -118.54 -118.545 -118.55 -118.555 -118.56 -118.565 -118.57 -118.575 -118.58 -118.585 -118.59 -118.595 -118.6 -118.605 -118.61 -118.615 -118.62 -118.625 -118.63 -118.635 -118.64 -118.645 -118.65 -118.655 -118.66 -118.665 -118.67 -118.675 -118.68 -118.685 -118.69 -118.695 -118.7 -118.705 -118.71 -118.715 -118.72 -118.725 -118.73 -118.735 -118.74 -118.745 -118.75 -118.755 -118.76 -118.765 -118.77 -118.775 -118.78 -118.785 -118.79 -118.795 -118.8 -118.805 -118.81 -118.815 -118.82 -118.825 -118.83 -118.835 -118.84 -118.845 -118.85 -118.855 -118.86 -118.865 -118.87 -118.875 -118.88 -118.885 -118.89 -118.895 -118.9 -118.905 -118.91 -118.915 -118.92 -118.925 -118.93 -118.935 -118.94 -118.945 -118.95 -118.955 -118.96 -118.965 -118.97 -118.975 -118.98 -118.985 -118.99 -118.995 -119 -119.005 -119.01 -119.015 -119.02 -119.025 -119.03 -119.035 -119.04 -119.045 -119.05 -119.055 -119.06 -119.065 -119.07 -119.075 -119.08 -119.085 -119.09 -119.095 -119.1 -119.105 -119.11 -119.115 -119.12 -119.125 -119.13 -119.135 -119.14 -119.145 -119.15 -119.155 -119.16 -119.165 -119.17 -119.175 -119.18 -119.185 -119.19 -119.195 -119.2 -119.205 -119.21 -119.215 -119.22 -119.225 -119.23 -119.235 -119.24 -119.245 -119.25 -119.255 -119.26 -119.265 -119.27 -119.275 -119.28 -119.285 -119.29 -119.295 -119.3 -119.305 -119.31 -119.315 -119.32 -119.325 -119.33 -119.335 -119.34 -119.345 -119.35 -119.355 -119.36 -119.365 -119.37 -119.375 -119.38 -119.385 -119.39 -119.395 -119.4 -119.405 -119.41 -119.415 -119.42 -119.425 -119.43 -119.435 -119.44 -119.445 -119.45 -119.455 -119.46 -119.465 -119.47 -119.475 -119.48 -119.485 -119.49 -119.495 -119.5 -119.505 -119.51 -119.515 -119.52 -119.525 -119.53 -119.535 -119.54 -119.545 -119.55 -119.555 -119.56 -119.565 -119.57 -119.575 -119.58 -119.585 -119.59 -119.595 -119.6 -119.605 -119.61 -119.615 -119.62 -119.625 -119.63 -119.635 -119.64 -119.645 -119.65 -119.655 -119.66 -119.665 -119.67 -119.675 -119.68 -119.685 -119.69 -119.695 -119.7 -119.705 -119.71 -119.715 -119.72 -119.725 -119.73 -119.735 -119.74 -119.745 -119.75 -119.755 -119.76 -119.765 -119.77 -119.775 -119.78 -119.785 -119.79 -119.795 -119.8 -119.805 -119.81 -119.815 -119.82 -119.825 -119.83 -119.835 -119.84 -119.845 -119.85 -119.855 -119.86 -119.865 -119.87 -119.875 -119.88 -119.885 -119.89 -119.895 -119.9 -119.905 -119.91 -119.915 -119.92 -119.925 -119.93 -119.935 -119.94 -119.945 -119.95 -119.955 -119.96 -119.965 -119.97 -119.975 -119.98 -119.985 -119.99 -119.995 -120 -120.005 -120.01 -120.015 -120.02 -120.025 -120.03 -120.035 -120.04 -120.045 -120.05 -120.055 -120.06 -120.065 -120.07 -120.075 -120.08 -120.085 -120.09 -120.095 -120.1 -120.105 -120.11 -120.115 -120.12 -120.125 -120.13 -120.135 -120.14 -120.145 -120.15 -120.155 -120.16 -120.165 -120.17 -120.175 -120.18 -120.185 -120.19 -120.195 -120.2 -120.205 -120.21 -120.215 -120.22 -120.225 -120.23 -120.235 -120.24 -120.245 -120.25 -120.255 -120.26 -120.265 -120.27 -120.275 -120.28 -120.285 -120.29 -120.295 -120.3 -120.305 -120.31 -120.315 -120.32 -120.325 -120.33 -120.335 -120.34 -120.345 -120.35 -120.355 -120.36 -120.365 -120.37 -120.375 -120.38 -120.385 -120.39 -120.395 -120.4 -120.405 -120.41 -120.415 -120.42 -120.425 -120.43 -120.435 -120.44 -120.445 -120.45 -120.455 -120.46 -120.465 -120.47 -120.475 -120.48 -120.485 -120.49 -120.495 -120.5 -120.505 -120.51 -120.515 -120.52 -120.525 -120.53 -120.535 -120.54 -120.545 -120.55 -120.555 -120.56 -120.565 -120.57 -120.575 -120.58 -120.585 -120.59 -120.595 -120.6 -120.605 -120.61 -120.615 -120.62 -120.625 -120.63 -120.635 -120.64 -120.645 -120.65 -120.655 -120.66 -120.665 -120.67 -120.675 -120.68 -120.685 -120.69 -120.695 -120.7 -120.705 -120.71 -120.715 -120.72 -120.725 -120.73 -120.735 -120.74 -120.745 -120.75 -120.755 -120.76 -120.765 -120.77 -120.775 -120.78 -120.785 -120.79 -120.795 -120.8 -120.805 -120.81 -120.815 -120.82 -120.825 -120.83 -120.835 -120.84 -120.845 -120.85 -120.855 -120.86 -120.865 -120.87 -120.875 -120.88 -120.885 -120.89 -120.895 -120.9 -120.905 -120.91 -120.915 -120.92 -120.925 -120.93 -120.935 -120.94 -120.945 -120.95 -120.955 -120.96 -120.965 -120.97 -120.975 -120.98 -120.985 -120.99 -120.995 -121 -121.005 -121.01 -121.015 -121.02 -121.025 -121.03 -121.035 -121.04 -121.045 -121.05 -121.055 -121.06 -121.065 -121.07 -121.075 -121.08 -121.085 -121.09 -121.095 -121.1 -121.105 -121.11 -121.115 -121.12 -121.125 -121.13 -121.135 -121.14 -121.145 -121.15 -121.155 -121.16 -121.165 -121.17 -121.175 -121.18 -121.185 -121.19 -121.195 -121.2 -121.205 -121.21 -121.215 -121.22 -121.225 -121.23 -121.235 -121.24 -121.245 -121.25 -121.255 -121.26 -121.265 -121.27 -121.275 -121.28 -121.285 -121.29 -121.295 -121.3 -121.305 -121.31 -121.315 -121.32 -121.325 -121.33 -121.335 -121.34 -121.345 -121.35 -121.355 -121.36 -121.365 -121.37 -121.375 -121.38 -121.385 -121.39 -121.395 -121.4 -121.405 -121.41 -121.415 -121.42 -121.425 -121.43 -121.435 -121.44 -121.445 -121.45 -121.455 -121.46 -121.465 -121.47 -121.475 -121.48 -121.485 -121.49 -121.495 -121.5 -121.505 -121.51 -121.515 -121.52 -121.525 -121.53 -121.535 -121.54 -121.545 -121.55 -121.555 -121.56 -121.565 -121.57 -121.575 -121.58 -121.585 -121.59 -121.595 -121.6 -121.605 -121.61 -121.615 -121.62 -121.625 -121.63 -121.635 -121.64 -121.645 -121.65 -121.655 -121.66 -121.665 -121.67 -121.675 -121.68 -121.685 -121.69 -121.695 -121.7 -121.705 -121.71 -121.715 -121.72 -121.725 -121.73 -121.735 -121.74 -121.745 -121.75 -121.755 -121.76 -121.765 -121.77 -121.775 -121.78 -121.785 -121.79 -121.795 -121.8 -121.805 -121.81 -121.815 -121.82 -121.825 -121.83 -121.835 -121.84 -121.845 -121.85 -121.855 -121.86 -121.865 -121.87 -121.875 -121.88 -121.885 -121.89 -121.895 -121.9 -121.905 -121.91 -121.915 -121.92 -121.925 -121.93 -121.935 -121.94 -121.945 -121.95 -121.955 -121.96 -121.965 -121.97 -121.975 -121.98 -121.985 -121.99 -121.995 -122 -122.005 -122.01 -122.015 -122.02 -122.025 -122.03 -122.035 -122.04 -122.045 -122.05 -122.055 -122.06 -122.065 -122.07 -122.075 -122.08 -122.085 -122.09 -122.095 -122.1 -122.105 -122.11 -122.115 -122.12 -122.125 -122.13 -122.135 -122.14 -122.145 -122.15 -122.155 -122.16 -122.165 -122.17 -122.175 -122.18 -122.185 -122.19 -122.195 -122.2 -122.205 -122.21 -122.215 -122.22 -122.225 -122.23 -122.235 -122.24 -122.245 -122.25 -122.255 -122.26 -122.265 -122.27 -122.275 -122.28 -122.285 -122.29 -122.295 -122.3 -122.305 -122.31 -122.315 -122.32 -122.325 -122.33 -122.335 -122.34 -122.345 -122.35 -122.355 -122.36 -122.365 -122.37 -122.375 -122.38 -122.385 -122.39 -122.395 -122.4 -122.405 -122.41 -122.415 -122.42 -122.425 -122.43 -122.435 -122.44 -122.445 -122.45 -122.455 -122.46 -122.465 -122.47 -122.475 -122.48 -122.485 -122.49 -122.495 -122.5 -122.505 -122.51 -122.515 -122.52 -122.525 -122.53 -122.535 -122.54 -122.545 -122.55 -122.555 -122.56 -122.565 -122.57 -122.575 -122.58 -122.585 -122.59 -122.595 -122.6 -122.605 -122.61 -122.615 -122.62 -122.625 -122.63 -122.635 -122.64 -122.645 -122.65 -122.655 -122.66 -122.665 -122.67 -122.675 -122.68 -122.685 -122.69 -122.695 -122.7 -122.705 -122.71 -122.715 -122.72 -122.725 -122.73 -122.735 -122.74 -122.745 -122.75 -122.755 -122.76 -122.765 -122.77 -122.775 -122.78 -122.785 -122.79 -122.795 -122.8 -122.805 -122.81 -122.815 -122.82 -122.825 -122.83 -122.835 -122.84 -122.845 -122.85 -122.855 -122.86 -122.865 -122.87 -122.875 -122.88 -122.885 -122.89 -122.895 -122.9 -122.905 -122.91 -122.915 -122.92 -122.925 -122.93 -122.935 -122.94 -122.945 -122.95 -122.955 -122.96 -122.965 -122.97 -122.975 -122.98 -122.985 -122.99 -122.995 -123 -123.005 -123.01 -123.015 -123.02 -123.025 -123.03 -123.035 -123.04 -123.045 -123.05 -123.055 -123.06 -123.065 -123.07 -123.075 -123.08 -123.085 -123.09 -123.095 -123.1 -123.105 -123.11 -123.115 -123.12 -123.125 -123.13 -123.135 -123.14 -123.145 -123.15 -123.155 -123.16 -123.165 -123.17 -123.175 -123.18 -123.185 -123.19 -123.195 -123.2 -123.205 -123.21 -123.215 -123.22 -123.225 -123.23 -123.235 -123.24 -123.245 -123.25 -123.255 -123.26 -123.265 -123.27 -123.275 -123.28 -123.285 -123.29 -123.295 -123.3 -123.305 -123.31 -123.315 -123.32 -123.325 -123.33 -123.335 -123.34 -123.345 -123.35 -123.355 -123.36 -123.365 -123.37 -123.375 -123.38 -123.385 -123.39 -123.395 -123.4 -123.405 -123.41 -123.415 -123.42 -123.425 -123.43 -123.435 -123.44 -123.445 -123.45 -123.455 -123.46 -123.465 -123.47 -123.475 -123.48 -123.485 -123.49 -123.495 -123.5 -123.505 -123.51 -123.515 -123.52 -123.525 -123.53 -123.535 -123.54 -123.545 -123.55 -123.555 -123.56 -123.565 -123.57 -123.575 -123.58 -123.585 -123.59 -123.595 -123.6 -123.605 -123.61 -123.615 -123.62 -123.625 -123.63 -123.635 -123.64 -123.645 -123.65 -123.655 -123.66 -123.665 -123.67 -123.675 -123.68 -123.685 -123.69 -123.695 -123.7 -123.705 -123.71 -123.715 -123.72 -123.725 -123.73 -123.735 -123.74 -123.745 -123.75 -123.755 -123.76 -123.765 -123.77 -123.775 -123.78 -123.785 -123.79 -123.795 -123.8 -123.805 -123.81 -123.815 -123.82 -123.825 -123.83 -123.835 -123.84 -123.845 -123.85 -123.855 -123.86 -123.865 -123.87 -123.875 -123.88 -123.885 -123.89 -123.895 -123.9 -123.905 -123.91 -123.915 -123.92 -123.925 -123.93 -123.935 -123.94 -123.945 -123.95 -123.955 -123.96 -123.965 -123.97 -123.975 -123.98 -123.985 -123.99 -123.995 -124 -124.005 -124.01 -124.015 -124.02 -124.025 -124.03 -124.035 -124.04 -124.045 -124.05 -124.055 -124.06 -124.065 -124.07 -124.075 -124.08 -124.085 -124.09 -124.095 -124.1 -124.105 -124.11 -124.115 -124.12 -124.125 -124.13 -124.135 -124.14 -124.145 -124.15 -124.155 -124.16 -124.165 -124.17 -124.175 -124.18 -124.185 -124.19 -124.195 -124.2 -124.205 -124.21 -124.215 -124.22 -124.225 -124.23 -124.235 -124.24 -124.245 -124.25 -124.255 -124.26 -124.265 -124.27 -124.275 -124.28 -124.285 -124.29 -124.295 -124.3 -124.305 -124.31 -124.315 -124.32 -124.325 -124.33 -124.335 -124.34 -124.345 -124.35 -124.355 -124.36 -124.365 -124.37 -124.375 -124.38 -124.385 -124.39 -124.395 -124.4 -124.405 -124.41 -124.415 -124.42 -124.425 -124.43 -124.435 -124.44 -124.445 -124.45 -124.455 -124.46 -124.465 -124.47 -124.475 -124.48 -124.485 -124.49 -124.495 -124.5 -124.505 -124.51 -124.515 -124.52 -124.525 -124.53 -124.535 -124.54 -124.545 -124.55 -124.555 -124.56 -124.565 -124.57 -124.575 -124.58 -124.585 -124.59 -124.595 -124.6 -124.605 -124.61 -124.615 -124.62 -124.625 -124.63 -124.635 -124.64 -124.645 -124.65 -124.655 -124.66 -124.665 -124.67 -124.675 -124.68 -124.685 -124.69 -124.695 -124.7 -124.705 -124.71 -124.715 -124.72 -124.725 -124.73 -124.735 -124.74 -124.745 -124.75 -124.755 -124.76 -124.765 -124.77 -124.775 -124.78 -124.785 -124.79 -124.795 -124.8 -124.805 -124.81 -124.815 -124.82 -124.825 -124.83 -124.835 -124.84 -124.845 -124.85 -124.855 -124.86 -124.865 -124.87 -124.875 -124.88 -124.885 -124.89 -124.895 -124.9 -124.905 -124.91 -124.915 -124.92 -124.925 -124.93 -124.935 -124.94 -124.945 -124.95 -124.955 -124.96 -124.965 -124.97 -124.975 -124.98 -124.985 -124.99 -124.995 -125 -125.005 -125.01 -125.015 -125.02 -125.025 -125.03 -125.035 -125.04 -125.045 -125.05 -125.055 -125.06 -125.065 -125.07 -125.075 -125.08 -125.085 -125.09 -125.095 -125.1 -125.105 -125.11 -125.115 -125.12 -125.125 -125.13 -125.135 -125.14 -125.145 -125.15 -125.155 -125.16 -125.165 -125.17 -125.175 -125.18 -125.185 -125.19 -125.195 -125.2 -125.205 -125.21 -125.215 -125.22 -125.225 -125.23 -125.235 -125.24 -125.245 -125.25 -125.255 -125.26 -125.265 -125.27 -125.275 -125.28 -125.285 -125.29 -125.295 -125.3 -125.305 -125.31 -125.315 -125.32 -125.325 -125.33 -125.335 -125.34 -125.345 -125.35 -125.355 -125.36 -125.365 -125.37 -125.375 -125.38 -125.385 -125.39 -125.395 -125.4 -125.405 -125.41 -125.415 -125.42 -125.425 -125.43 -125.435 -125.44 -125.445 -125.45 -125.455 -125.46 -125.465 -125.47 -125.475 -125.48 -125.485 -125.49 -125.495 -125.5 -125.505 -125.51 -125.515 -125.52 -125.525 -125.53 -125.535 -125.54 -125.545 -125.55 -125.555 -125.56 -125.565 -125.57 -125.575 -125.58 -125.585 -125.59 -125.595 -125.6 -125.605 -125.61 -125.615 -125.62 -125.625 -125.63 -125.635 -125.64 -125.645 -125.65 -125.655 -125.66 -125.665 -125.67 -125.675 -125.68 -125.685 -125.69 -125.695 -125.7 -125.705 -125.71 -125.715 -125.72 -125.725 -125.73 -125.735 -125.74 -125.745 -125.75 -125.755 -125.76 -125.765 -125.77 -125.775 -125.78 -125.785 -125.79 -125.795 -125.8 -125.805 -125.81 -125.815 -125.82 -125.825 -125.83 -125.835 -125.84 -125.845 -125.85 -125.855 -125.86 -125.865 -125.87 -125.875 -125.88 -125.885 -125.89 -125.895 -125.9 -125.905 -125.91 -125.915 -125.92 -125.925 -125.93 -125.935 -125.94 -125.945 -125.95 -125.955 -125.96 -125.965 -125.97 -125.975 -125.98 -125.985 -125.99 -125.995 -126 -126.005 -126.01 -126.015 -126.02 -126.025 -126.03 -126.035 -126.04 -126.045 -126.05 -126.055 -126.06 -126.065 -126.07 -126.075 -126.08 -126.085 -126.09 -126.095 -126.1 -126.105 -126.11 -126.115 -126.12 -126.125 -126.13 -126.135 -126.14 -126.145 -126.15 -126.155 -126.16 -126.165 -126.17 -126.175 -126.18 -126.185 -126.19 -126.195 -126.2 -126.205 -126.21 -126.215 -126.22 -126.225 -126.23 -126.235 -126.24 -126.245 -126.25 -126.255 -126.26 -126.265 -126.27 -126.275 -126.28 -126.285 -126.29 -126.295 -126.3 -126.305 -126.31 -126.315 -126.32 -126.325 -126.33 -126.335 -126.34 -126.345 -126.35 -126.355 -126.36 -126.365 -126.37 -126.375 -126.38 -126.385 -126.39 -126.395 -126.4 -126.405 -126.41 -126.415 -126.42 -126.425 -126.43 -126.435 -126.44 -126.445 -126.45 -126.455 -126.46 -126.465 -126.47 -126.475 -126.48 -126.485 -126.49 -126.495 -126.5 -126.505 -126.51 -126.515 -126.52 -126.525 -126.53 -126.535 -126.54 -126.545 -126.55 -126.555 -126.56 -126.565 -126.57 -126.575 -126.58 -126.585 -126.59 -126.595 -126.6 -126.605 -126.61 -126.615 -126.62 -126.625 -126.63 -126.635 -126.64 -126.645 -126.65 -126.655 -126.66 -126.665 -126.67 -126.675 -126.68 -126.685 -126.69 -126.695 -126.7 -126.705 -126.71 -126.715 -126.72 -126.725 -126.73 -126.735 -126.74 -126.745 -126.75 -126.755 -126.76 -126.765 -126.77 -126.775 -126.78 -126.785 -126.79 -126.795 -126.8 -126.805 -126.81 -126.815 -126.82 -126.825 -126.83 -126.835 -126.84 -126.845 -126.85 -126.855 -126.86 -126.865 -126.87 -126.875 -126.88 -126.885 -126.89 -126.895 -126.9 -126.905 -126.91 -126.915 -126.92 -126.925 -126.93 -126.935 -126.94 -126.945 -126.95 -126.955 -126.96 -126.965 -126.97 -126.975 -126.98 -126.985 -126.99 -126.995 -127 -127.005 -127.01 -127.015 -127.02 -127.025 -127.03 -127.035 -127.04 -127.045 -127.05 -127.055 -127.06 -127.065 -127.07 -127.075 -127.08 -127.085 -127.09 -127.095 -127.1 -127.105 -127.11 -127.115 -127.12 -127.125 -127.13 -127.135 -127.14 -127.145 -127.15 -127.155 -127.16 -127.165 -127.17 -127.175 -127.18 -127.185 -127.19 -127.195 -127.2 -127.205 -127.21 -127.215 -127.22 -127.225 -127.23 -127.235 -127.24 -127.245 -127.25 -127.255 -127.26 -127.265 -127.27 -127.275 -127.28 -127.285 -127.29 -127.295 -127.3 -127.305 -127.31 -127.315 -127.32 -127.325 -127.33 -127.335 -127.34 -127.345 -127.35 -127.355 -127.36 -127.365 -127.37 -127.375 -127.38 -127.385 -127.39 -127.395 -127.4 -127.405 -127.41 -127.415 -127.42 -127.425 -127.43 -127.435 -127.44 -127.445 -127.45 -127.455 -127.46 -127.465 -127.47 -127.475 -127.48 -127.485 -127.49 -127.495 -127.5 -127.505 -127.51 -127.515 -127.52 -127.525 -127.53 -127.535 -127.54 -127.545 -127.55 -127.555 -127.56 -127.565 -127.57 -127.575 -127.58 -127.585 -127.59 -127.595 -127.6 -127.605 -127.61 -127.615 -127.62 -127.625 -127.63 -127.635 -127.64 -127.645 -127.65 -127.655 -127.66 -127.665 -127.67 -127.675 -127.68 -127.685 -127.69 -127.695 -127.7 -127.705 -127.71 -127.715 -127.72 -127.725 -127.73 -127.735 -127.74 -127.745 -127.75 -127.755 -127.76 -127.765 -127.77 -127.775 -127.78 -127.785 -127.79 -127.795 -127.8 -127.805 -127.81 -127.815 -127.82 -127.825 -127.83 -127.835 -127.84 -127.845 -127.85 -127.855 -127.86 -127.865 -127.87 -127.875 -127.88 -127.885 -127.89 -127.895 -127.9 -127.905 -127.91 -127.915 -127.92 -127.925 -127.93 -127.935 -127.94 -127.945 -127.95 -127.955 -127.96 -127.965 -127.97 -127.975 -127.98 -127.985 -127.99 -127.995 -128 -128.005 -128.01 -128.015 -128.02 -128.025 -128.03 -128.035 -128.04 -128.045 -128.05 -128.055 -128.06 -128.065 -128.07 -128.075 -128.08 -128.085 -128.09 -128.095 -128.1 -128.105 -128.11 -128.115 -128.12 -128.125 -128.13 -128.135 -128.14 -128.145 -128.15 -128.155 -128.16 -128.165 -128.17 -128.175 -128.18 -128.185 -128.19 -128.195 -128.2 -128.205 -128.21 -128.215 -128.22 -128.225 -128.23 -128.235 -128.24 -128.245 -128.25 -128.255 -128.26 -128.265 -128.27 -128.275 -128.28 -128.285 -128.29 -128.295 -128.3 -128.305 -128.31 -128.315 -128.32 -128.325 -128.33 -128.335 -128.34 -128.345 -128.35 -128.355 -128.36 -128.365 -128.37 -128.375 -128.38 -128.385 -128.39 -128.395 -128.4 -128.405 -128.41 -128.415 -128.42 -128.425 -128.43 -128.435 -128.44 -128.445 -128.45 -128.455 -128.46 -128.465 -128.47 -128.475 -128.48 -128.485 -128.49 -128.495 -128.5 -128.505 -128.51 -128.515 -128.52 -128.525 -128.53 -128.535 -128.54 -128.545 -128.55 -128.555 -128.56 -128.565 -128.57 -128.575 -128.58 -128.585 -128.59 -128.595 -128.6 -128.605 -128.61 -128.615 -128.62 -128.625 -128.63 -128.635 -128.64 -128.645 -128.65 -128.655 -128.66 -128.665 -128.67 -128.675 -128.68 -128.685 -128.69 -128.695 -128.7 -128.705 -128.71 -128.715 -128.72 -128.725 -128.73 -128.735 -128.74 -128.745 -128.75 -128.755 -128.76 -128.765 -128.77 -128.775 -128.78 -128.785 -128.79 -128.795 -128.8 -128.805 -128.81 -128.815 -128.82 -128.825 -128.83 -128.835 -128.84 -128.845 -128.85 -128.855 -128.86 -128.865 -128.87 -128.875 -128.88 -128.885 -128.89 -128.895 -128.9 -128.905 -128.91 -128.915 -128.92 -128.925 -128.93 -128.935 -128.94 -128.945 -128.95 -128.955 -128.96 -128.965 -128.97 -128.975 -128.98 -128.985 -128.99 -128.995 -129 -129.005 -129.01 -129.015 -129.02 -129.025 -129.03 -129.035 -129.04 -129.045 -129.05 -129.055 -129.06 -129.065 -129.07 -129.075 -129.08 -129.085 -129.09 -129.095 -129.1 -129.105 -129.11 -129.115 -129.12 -129.125 -129.13 -129.135 -129.14 -129.145 -129.15 -129.155 -129.16 -129.165 -129.17 -129.175 -129.18 -129.185 -129.19 -129.195 -129.2 -129.205 -129.21 -129.215 -129.22 -129.225 -129.23 -129.235 -129.24 -129.245 -129.25 -129.255 -129.26 -129.265 -129.27 -129.275 -129.28 -129.285 -129.29 -129.295 -129.3 -129.305 -129.31 -129.315 -129.32 -129.325 -129.33 -129.335 -129.34 -129.345 -129.35 -129.355 -129.36 -129.365 -129.37 -129.375 -129.38 -129.385 -129.39 -129.395 -129.4 -129.405 -129.41 -129.415 -129.42 -129.425 -129.43 -129.435 -129.44 -129.445 -129.45 -129.455 -129.46 -129.465 -129.47 -129.475 -129.48 -129.485 -129.49 -129.495 -129.5 -129.505 -129.51 -129.515 -129.52 -129.525 -129.53 -129.535 -129.54 -129.545 -129.55 -129.555 -129.56 -129.565 -129.57 -129.575 -129.58 -129.585 -129.59 -129.595 -129.6 -129.605 -129.61 -129.615 -129.62 -129.625 -129.63 -129.635 -129.64 -129.645 -129.65 -129.655 -129.66 -129.665 -129.67 -129.675 -129.68 -129.685 -129.69 -129.695 -129.7 -129.705 -129.71 -129.715 -129.72 -129.725 -129.73 -129.735 -129.74 -129.745 -129.75 -129.755 -129.76 -129.765 -129.77 -129.775 -129.78 -129.785 -129.79 -129.795 -129.8 -129.805 -129.81 -129.815 -129.82 -129.825 -129.83 -129.835 -129.84 -129.845 -129.85 -129.855 -129.86 -129.865 -129.87 -129.875 -129.88 -129.885 -129.89 -129.895 -129.9 -129.905 -129.91 -129.915 -129.92 -129.925 -129.93 -129.935 -129.94 -129.945 -129.95 -129.955 -129.96 -129.965 -129.97 -129.975 -129.98 -129.985 -129.99 -129.995 -130 -130.005 -130.01 -130.015 -130.02 -130.025 -130.03 -130.035 -130.04 -130.045 -130.05 -130.055 -130.06 -130.065 -130.07 -130.075 -130.08 -130.085 -130.09 -130.095 -130.1 -130.105 -130.11 -130.115 -130.12 -130.125 -130.13 -130.135 -130.14 -130.145 -130.15 -130.155 -130.16 -130.165 -130.17 -130.175 -130.18 -130.185 -130.19 -130.195 -130.2 -130.205 -130.21 -130.215 -130.22 -130.225 -130.23 -130.235 -130.24 -130.245 -130.25 -130.255 -130.26 -130.265 -130.27 -130.275 -130.28 -130.285 -130.29 -130.295 -130.3 -130.305 -130.31 -130.315 -130.32 -130.325 -130.33 -130.335 -130.34 -130.345 -130.35 -130.355 -130.36 -130.365 -130.37 -130.375 -130.38 -130.385 -130.39 -130.395 -130.4 -130.405 -130.41 -130.415 -130.42 -130.425 -130.43 -130.435 -130.44 -130.445 -130.45 -130.455 -130.46 -130.465 -130.47 -130.475 -130.48 -130.485 -130.49 -130.495 -130.5 -130.505 -130.51 -130.515 -130.52 -130.525 -130.53 -130.535 -130.54 -130.545 -130.55 -130.555 -130.56 -130.565 -130.57 -130.575 -130.58 -130.585 -130.59 -130.595 -130.6 -130.605 -130.61 -130.615 -130.62 -130.625 -130.63 -130.635 -130.64 -130.645 -130.65 -130.655 -130.66 -130.665 -130.67 -130.675 -130.68 -130.685 -130.69 -130.695 -130.7 -130.705 -130.71 -130.715 -130.72 -130.725 -130.73 -130.735 -130.74 -130.745 -130.75 -130.755 -130.76 -130.765 -130.77 -130.775 -130.78 -130.785 -130.79 -130.795 -130.8 -130.805 -130.81 -130.815 -130.82 -130.825 -130.83 -130.835 -130.84 -130.845 -130.85 -130.855 -130.86 -130.865 -130.87 -130.875 -130.88 -130.885 -130.89 -130.895 -130.9 -130.905 -130.91 -130.915 -130.92 -130.925 -130.93 -130.935 -130.94 -130.945 -130.95 -130.955 -130.96 -130.965 -130.97 -130.975 -130.98 -130.985 -130.99 -130.995 -131 -131.005 -131.01 -131.015 -131.02 -131.025 -131.03 -131.035 -131.04 -131.045 -131.05 -131.055 -131.06 -131.065 -131.07 -131.075 -131.08 -131.085 -131.09 -131.095 -131.1 -131.105 -131.11 -131.115 -131.12 -131.125 -131.13 -131.135 -131.14 -131.145 -131.15 -131.155 -131.16 -131.165 -131.17 -131.175 -131.18 -131.185 -131.19 -131.195 -131.2 -131.205 -131.21 -131.215 -131.22 -131.225 -131.23 -131.235 -131.24 -131.245 -131.25 -131.255 -131.26 -131.265 -131.27 -131.275 -131.28 -131.285 -131.29 -131.295 -131.3 -131.305 -131.31 -131.315 -131.32 -131.325 -131.33 -131.335 -131.34 -131.345 -131.35 -131.355 -131.36 -131.365 -131.37 -131.375 -131.38 -131.385 -131.39 -131.395 -131.4 -131.405 -131.41 -131.415 -131.42 -131.425 -131.43 -131.435 -131.44 -131.445 -131.45 -131.455 -131.46 -131.465 -131.47 -131.475 -131.48 -131.485 -131.49 -131.495 -131.5 -131.505 -131.51 -131.515 -131.52 -131.525 -131.53 -131.535 -131.54 -131.545 -131.55 -131.555 -131.56 -131.565 -131.57 -131.575 -131.58 -131.585 -131.59 -131.595 -131.6 -131.605 -131.61 -131.615 -131.62 -131.625 -131.63 -131.635 -131.64 -131.645 -131.65 -131.655 -131.66 -131.665 -131.67 -131.675 -131.68 -131.685 -131.69 -131.695 -131.7 -131.705 -131.71 -131.715 -131.72 -131.725 -131.73 -131.735 -131.74 -131.745 -131.75 -131.755 -131.76 -131.765 -131.77 -131.775 -131.78 -131.785 -131.79 -131.795 -131.8 -131.805 -131.81 -131.815 -131.82 -131.825 -131.83 -131.835 -131.84 -131.845 -131.85 -131.855 -131.86 -131.865 -131.87 -131.875 -131.88 -131.885 -131.89 -131.895 -131.9 -131.905 -131.91 -131.915 -131.92 -131.925 -131.93 -131.935 -131.94 -131.945 -131.95 -131.955 -131.96 -131.965 -131.97 -131.975 -131.98 -131.985 -131.99 -131.995 -132 -132.005 -132.01 -132.015 -132.02 -132.025 -132.03 -132.035 -132.04 -132.045 -132.05 -132.055 -132.06 -132.065 -132.07 -132.075 -132.08 -132.085 -132.09 -132.095 -132.1 -132.105 -132.11 -132.115 -132.12 -132.125 -132.13 -132.135 -132.14 -132.145 -132.15 -132.155 -132.16 -132.165 -132.17 -132.175 -132.18 -132.185 -132.19 -132.195 -132.2 -132.205 -132.21 -132.215 -132.22 -132.225 -132.23 -132.235 -132.24 -132.245 -132.25 -132.255 -132.26 -132.265 -132.27 -132.275 -132.28 -132.285 -132.29 -132.295 -132.3 -132.305 -132.31 -132.315 -132.32 -132.325 -132.33 -132.335 -132.34 -132.345 -132.35 -132.355 -132.36 -132.365 -132.37 -132.375 -132.38 -132.385 -132.39 -132.395 -132.4 -132.405 -132.41 -132.415 -132.42 -132.425 -132.43 -132.435 -132.44 -132.445 -132.45 -132.455 -132.46 -132.465 -132.47 -132.475 -132.48 -132.485 -132.49 -132.495 -132.5 -132.505 -132.51 -132.515 -132.52 -132.525 -132.53 -132.535 -132.54 -132.545 -132.55 -132.555 -132.56 -132.565 -132.57 -132.575 -132.58 -132.585 -132.59 -132.595 -132.6 -132.605 -132.61 -132.615 -132.62 -132.625 -132.63 -132.635 -132.64 -132.645 -132.65 -132.655 -132.66 -132.665 -132.67 -132.675 -132.68 -132.685 -132.69 -132.695 -132.7 -132.705 -132.71 -132.715 -132.72 -132.725 -132.73 -132.735 -132.74 -132.745 -132.75 -132.755 -132.76 -132.765 -132.77 -132.775 -132.78 -132.785 -132.79 -132.795 -132.8 -132.805 -132.81 -132.815 -132.82 -132.825 -132.83 -132.835 -132.84 -132.845 -132.85 -132.855 -132.86 -132.865 -132.87 -132.875 -132.88 -132.885 -132.89 -132.895 -132.9 -132.905 -132.91 -132.915 -132.92 -132.925 -132.93 -132.935 -132.94 -132.945 -132.95 -132.955 -132.96 -132.965 -132.97 -132.975 -132.98 -132.985 -132.99 -132.995 -133 -133.005 -133.01 -133.015 -133.02 -133.025 -133.03 -133.035 -133.04 -133.045 -133.05 -133.055 -133.06 -133.065 -133.07 -133.075 -133.08 -133.085 -133.09 -133.095 -133.1 -133.105 -133.11 -133.115 -133.12 -133.125 -133.13 -133.135 -133.14 -133.145 -133.15 -133.155 -133.16 -133.165 -133.17 -133.175 -133.18 -133.185 -133.19 -133.195 -133.2 -133.205 -133.21 -133.215 -133.22 -133.225 -133.23 -133.235 -133.24 -133.245 -133.25 -133.255 -133.26 -133.265 -133.27 -133.275 -133.28 -133.285 -133.29 -133.295 -133.3 -133.305 -133.31 -133.315 -133.32 -133.325 -133.33 -133.335 -133.34 -133.345 -133.35 -133.355 -133.36 -133.365 -133.37 -133.375 -133.38 -133.385 -133.39 -133.395 -133.4 -133.405 -133.41 -133.415 -133.42 -133.425 -133.43 -133.435 -133.44 -133.445 -133.45 -133.455 -133.46 -133.465 -133.47 -133.475 -133.48 -133.485 -133.49 -133.495 -133.5 -133.505 -133.51 -133.515 -133.52 -133.525 -133.53 -133.535 -133.54 -133.545 -133.55 -133.555 -133.56 -133.565 -133.57 -133.575 -133.58 -133.585 -133.59 -133.595 -133.6 -133.605 -133.61 -133.615 -133.62 -133.625 -133.63 -133.635 -133.64 -133.645 -133.65 -133.655 -133.66 -133.665 -133.67 -133.675 -133.68 -133.685 -133.69 -133.695 -133.7 -133.705 -133.71 -133.715 -133.72 -133.725 -133.73 -133.735 -133.74 -133.745 -133.75 -133.755 -133.76 -133.765 -133.77 -133.775 -133.78 -133.785 -133.79 -133.795 -133.8 -133.805 -133.81 -133.815 -133.82 -133.825 -133.83 -133.835 -133.84 -133.845 -133.85 -133.855 -133.86 -133.865 -133.87 -133.875 -133.88 -133.885 -133.89 -133.895 -133.9 -133.905 -133.91 -133.915 -133.92 -133.925 -133.93 -133.935 -133.94 -133.945 -133.95 -133.955 -133.96 -133.965 -133.97 -133.975 -133.98 -133.985 -133.99 -133.995 -134 -134.005 -134.01 -134.015 -134.02 -134.025 -134.03 -134.035 -134.04 -134.045 -134.05 -134.055 -134.06 -134.065 -134.07 -134.075 -134.08 -134.085 -134.09 -134.095 -134.1 -134.105 -134.11 -134.115 -134.12 -134.125 -134.13 -134.135 -134.14 -134.145 -134.15 -134.155 -134.16 -134.165 -134.17 -134.175 -134.18 -134.185 -134.19 -134.195 -134.2 -134.205 -134.21 -134.215 -134.22 -134.225 -134.23 -134.235 -134.24 -134.245 -134.25 -134.255 -134.26 -134.265 -134.27 -134.275 -134.28 -134.285 -134.29 -134.295 -134.3 -134.305 -134.31 -134.315 -134.32 -134.325 -134.33 -134.335 -134.34 -134.345 -134.35 -134.355 -134.36 -134.365 -134.37 -134.375 -134.38 -134.385 -134.39 -134.395 -134.4 -134.405 -134.41 -134.415 -134.42 -134.425 -134.43 -134.435 -134.44 -134.445 -134.45 -134.455 -134.46 -134.465 -134.47 -134.475 -134.48 -134.485 -134.49 -134.495 -134.5 -134.505 -134.51 -134.515 -134.52 -134.525 -134.53 -134.535 -134.54 -134.545 -134.55 -134.555 -134.56 -134.565 -134.57 -134.575 -134.58 -134.585 -134.59 -134.595 -134.6 -134.605 -134.61 -134.615 -134.62 -134.625 -134.63 -134.635 -134.64 -134.645 -134.65 -134.655 -134.66 -134.665 -134.67 -134.675 -134.68 -134.685 -134.69 -134.695 -134.7 -134.705 -134.71 -134.715 -134.72 -134.725 -134.73 -134.735 -134.74 -134.745 -134.75 -134.755 -134.76 -134.765 -134.77 -134.775 -134.78 -134.785 -134.79 -134.795 -134.8 -134.805 -134.81 -134.815 -134.82 -134.825 -134.83 -134.835 -134.84 -134.845 -134.85 -134.855 -134.86 -134.865 -134.87 -134.875 -134.88 -134.885 -134.89 -134.895 -134.9 -134.905 -134.91 -134.915 -134.92 -134.925 -134.93 -134.935 -134.94 -134.945 -134.95 -134.955 -134.96 -134.965 -134.97 -134.975 -134.98 -134.985 -134.99 -134.995 -135 -135.005 -135.01 -135.015 -135.02 -135.025 -135.03 -135.035 -135.04 -135.045 -135.05 -135.055 -135.06 -135.065 -135.07 -135.075 -135.08 -135.085 -135.09 -135.095 -135.1 -135.105 -135.11 -135.115 -135.12 -135.125 -135.13 -135.135 -135.14 -135.145 -135.15 -135.155 -135.16 -135.165 -135.17 -135.175 -135.18 -135.185 -135.19 -135.195 -135.2 -135.205 -135.21 -135.215 -135.22 -135.225 -135.23 -135.235 -135.24 -135.245 -135.25 -135.255 -135.26 -135.265 -135.27 -135.275 -135.28 -135.285 -135.29 -135.295 -135.3 -135.305 -135.31 -135.315 -135.32 -135.325 -135.33 -135.335 -135.34 -135.345 -135.35 -135.355 -135.36 -135.365 -135.37 -135.375 -135.38 -135.385 -135.39 -135.395 -135.4 -135.405 -135.41 -135.415 -135.42 -135.425 -135.43 -135.435 -135.44 -135.445 -135.45 -135.455 -135.46 -135.465 -135.47 -135.475 -135.48 -135.485 -135.49 -135.495 -135.5 -135.505 -135.51 -135.515 -135.52 -135.525 -135.53 -135.535 -135.54 -135.545 -135.55 -135.555 -135.56 -135.565 -135.57 -135.575 -135.58 -135.585 -135.59 -135.595 -135.6 -135.605 -135.61 -135.615 -135.62 -135.625 -135.63 -135.635 -135.64 -135.645 -135.65 -135.655 -135.66 -135.665 -135.67 -135.675 -135.68 -135.685 -135.69 -135.695 -135.7 -135.705 -135.71 -135.715 -135.72 -135.725 -135.73 -135.735 -135.74 -135.745 -135.75 -135.755 -135.76 -135.765 -135.77 -135.775 -135.78 -135.785 -135.79 -135.795 -135.8 -135.805 -135.81 -135.815 -135.82 -135.825 -135.83 -135.835 -135.84 -135.845 -135.85 -135.855 -135.86 -135.865 -135.87 -135.875 -135.88 -135.885 -135.89 -135.895 -135.9 -135.905 -135.91 -135.915 -135.92 -135.925 -135.93 -135.935 -135.94 -135.945 -135.95 -135.955 -135.96 -135.965 -135.97 -135.975 -135.98 -135.985 -135.99 -135.995 -136 -136.005 -136.01 -136.015 -136.02 -136.025 -136.03 -136.035 -136.04 -136.045 -136.05 -136.055 -136.06 -136.065 -136.07 -136.075 -136.08 -136.085 -136.09 -136.095 -136.1 -136.105 -136.11 -136.115 -136.12 -136.125 -136.13 -136.135 -136.14 -136.145 -136.15 -136.155 -136.16 -136.165 -136.17 -136.175 -136.18 -136.185 -136.19 -136.195 -136.2 -136.205 -136.21 -136.215 -136.22 -136.225 -136.23 -136.235 -136.24 -136.245 -136.25 -136.255 -136.26 -136.265 -136.27 -136.275 -136.28 -136.285 -136.29 -136.295 -136.3 -136.305 -136.31 -136.315 -136.32 -136.325 -136.33 -136.335 -136.34 -136.345 -136.35 -136.355 -136.36 -136.365 -136.37 -136.375 -136.38 -136.385 -136.39 -136.395 -136.4 -136.405 -136.41 -136.415 -136.42 -136.425 -136.43 -136.435 -136.44 -136.445 -136.45 -136.455 -136.46 -136.465 -136.47 -136.475 -136.48 -136.485 -136.49 -136.495 -136.5 -136.505 -136.51 -136.515 -136.52 -136.525 -136.53 -136.535 -136.54 -136.545 -136.55 -136.555 -136.56 -136.565 -136.57 -136.575 -136.58 -136.585 -136.59 -136.595 -136.6 -136.605 -136.61 -136.615 -136.62 -136.625 -136.63 -136.635 -136.64 -136.645 -136.65 -136.655 -136.66 -136.665 -136.67 -136.675 -136.68 -136.685 -136.69 -136.695 -136.7 -136.705 -136.71 -136.715 -136.72 -136.725 -136.73 -136.735 -136.74 -136.745 -136.75 -136.755 -136.76 -136.765 -136.77 -136.775 -136.78 -136.785 -136.79 -136.795 -136.8 -136.805 -136.81 -136.815 -136.82 -136.825 -136.83 -136.835 -136.84 -136.845 -136.85 -136.855 -136.86 -136.865 -136.87 -136.875 -136.88 -136.885 -136.89 -136.895 -136.9 -136.905 -136.91 -136.915 -136.92 -136.925 -136.93 -136.935 -136.94 -136.945 -136.95 -136.955 -136.96 -136.965 -136.97 -136.975 -136.98 -136.985 -136.99 -136.995 -137 -137.005 -137.01 -137.015 -137.02 -137.025 -137.03 -137.035 -137.04 -137.045 -137.05 -137.055 -137.06 -137.065 -137.07 -137.075 -137.08 -137.085 -137.09 -137.095 -137.1 -137.105 -137.11 -137.115 -137.12 -137.125 -137.13 -137.135 -137.14 -137.145 -137.15 -137.155 -137.16 -137.165 -137.17 -137.175 -137.18 -137.185 -137.19 -137.195 -137.2 -137.205 -137.21 -137.215 -137.22 -137.225 -137.23 -137.235 -137.24 -137.245 -137.25 -137.255 -137.26 -137.265 -137.27 -137.275 -137.28 -137.285 -137.29 -137.295 -137.3 -137.305 -137.31 -137.315 -137.32 -137.325 -137.33 -137.335 -137.34 -137.345 -137.35 -137.355 -137.36 -137.365 -137.37 -137.375 -137.38 -137.385 -137.39 -137.395 -137.4 -137.405 -137.41 -137.415 -137.42 -137.425 -137.43 -137.435 -137.44 -137.445 -137.45 -137.455 -137.46 -137.465 -137.47 -137.475 -137.48 -137.485 -137.49 -137.495 -137.5 -137.505 -137.51 -137.515 -137.52 -137.525 -137.53 -137.535 -137.54 -137.545 -137.55 -137.555 -137.56 -137.565 -137.57 -137.575 -137.58 -137.585 -137.59 -137.595 -137.6 -137.605 -137.61 -137.615 -137.62 -137.625 -137.63 -137.635 -137.64 -137.645 -137.65 -137.655 -137.66 -137.665 -137.67 -137.675 -137.68 -137.685 -137.69 -137.695 -137.7 -137.705 -137.71 -137.715 -137.72 -137.725 -137.73 -137.735 -137.74 -137.745 -137.75 -137.755 -137.76 -137.765 -137.77 -137.775 -137.78 -137.785 -137.79 -137.795 -137.8 -137.805 -137.81 -137.815 -137.82 -137.825 -137.83 -137.835 -137.84 -137.845 -137.85 -137.855 -137.86 -137.865 -137.87 -137.875 -137.88 -137.885 -137.89 -137.895 -137.9 -137.905 -137.91 -137.915 -137.92 -137.925 -137.93 -137.935 -137.94 -137.945 -137.95 -137.955 -137.96 -137.965 -137.97 -137.975 -137.98 -137.985 -137.99 -137.995 -138 -138.005 -138.01 -138.015 -138.02 -138.025 -138.03 -138.035 -138.04 -138.045 -138.05 -138.055 -138.06 -138.065 -138.07 -138.075 -138.08 -138.085 -138.09 -138.095 -138.1 -138.105 -138.11 -138.115 -138.12 -138.125 -138.13 -138.135 -138.14 -138.145 -138.15 -138.155 -138.16 -138.165 -138.17 -138.175 -138.18 -138.185 -138.19 -138.195 -138.2 -138.205 -138.21 -138.215 -138.22 -138.225 -138.23 -138.235 -138.24 -138.245 -138.25 -138.255 -138.26 -138.265 -138.27 -138.275 -138.28 -138.285 -138.29 -138.295 -138.3 -138.305 -138.31 -138.315 -138.32 -138.325 -138.33 -138.335 -138.34 -138.345 -138.35 -138.355 -138.36 -138.365 -138.37 -138.375 -138.38 -138.385 -138.39 -138.395 -138.4 -138.405 -138.41 -138.415 -138.42 -138.425 -138.43 -138.435 -138.44 -138.445 -138.45 -138.455 -138.46 -138.465 -138.47 -138.475 -138.48 -138.485 -138.49 -138.495 -138.5 -138.505 -138.51 -138.515 -138.52 -138.525 -138.53 -138.535 -138.54 -138.545 -138.55 -138.555 -138.56 -138.565 -138.57 -138.575 -138.58 -138.585 -138.59 -138.595 -138.6 -138.605 -138.61 -138.615 -138.62 -138.625 -138.63 -138.635 -138.64 -138.645 -138.65 -138.655 -138.66 -138.665 -138.67 -138.675 -138.68 -138.685 -138.69 -138.695 -138.7 -138.705 -138.71 -138.715 -138.72 -138.725 -138.73 -138.735 -138.74 -138.745 -138.75 -138.755 -138.76 -138.765 -138.77 -138.775 -138.78 -138.785 -138.79 -138.795 -138.8 -138.805 -138.81 -138.815 -138.82 -138.825 -138.83 -138.835 -138.84 -138.845 -138.85 -138.855 -138.86 -138.865 -138.87 -138.875 -138.88 -138.885 -138.89 -138.895 -138.9 -138.905 -138.91 -138.915 -138.92 -138.925 -138.93 -138.935 -138.94 -138.945 -138.95 -138.955 -138.96 -138.965 -138.97 -138.975 -138.98 -138.985 -138.99 -138.995 -139 -139.005 -139.01 -139.015 -139.02 -139.025 -139.03 -139.035 -139.04 -139.045 -139.05 -139.055 -139.06 -139.065 -139.07 -139.075 -139.08 -139.085 -139.09 -139.095 -139.1 -139.105 -139.11 -139.115 -139.12 -139.125 -139.13 -139.135 -139.14 -139.145 -139.15 -139.155 -139.16 -139.165 -139.17 -139.175 -139.18 -139.185 -139.19 -139.195 -139.2 -139.205 -139.21 -139.215 -139.22 -139.225 -139.23 -139.235 -139.24 -139.245 -139.25 -139.255 -139.26 -139.265 -139.27 -139.275 -139.28 -139.285 -139.29 -139.295 -139.3 -139.305 -139.31 -139.315 -139.32 -139.325 -139.33 -139.335 -139.34 -139.345 -139.35 -139.355 -139.36 -139.365 -139.37 -139.375 -139.38 -139.385 -139.39 -139.395 -139.4 -139.405 -139.41 -139.415 -139.42 -139.425 -139.43 -139.435 -139.44 -139.445 -139.45 -139.455 -139.46 -139.465 -139.47 -139.475 -139.48 -139.485 -139.49 -139.495 -139.5 -139.505 -139.51 -139.515 -139.52 -139.525 -139.53 -139.535 -139.54 -139.545 -139.55 -139.555 -139.56 -139.565 -139.57 -139.575 -139.58 -139.585 -139.59 -139.595 -139.6 -139.605 -139.61 -139.615 -139.62 -139.625 -139.63 -139.635 -139.64 -139.645 -139.65 -139.655 -139.66 -139.665 -139.67 -139.675 -139.68 -139.685 -139.69 -139.695 -139.7 -139.705 -139.71 -139.715 -139.72 -139.725 -139.73 -139.735 -139.74 -139.745 -139.75 -139.755 -139.76 -139.765 -139.77 -139.775 -139.78 -139.785 -139.79 -139.795 -139.8 -139.805 -139.81 -139.815 -139.82 -139.825 -139.83 -139.835 -139.84 -139.845 -139.85 -139.855 -139.86 -139.865 -139.87 -139.875 -139.88 -139.885 -139.89 -139.895 -139.9 -139.905 -139.91 -139.915 -139.92 -139.925 -139.93 -139.935 -139.94 -139.945 -139.95 -139.955 -139.96 -139.965 -139.97 -139.975 -139.98 -139.985 -139.99 -139.995 -140 -140.005 -140.01 -140.015 -140.02 -140.025 -140.03 -140.035 -140.04 -140.045 -140.05 -140.055 -140.06 -140.065 -140.07 -140.075 -140.08 -140.085 -140.09 -140.095 -140.1 -140.105 -140.11 -140.115 -140.12 -140.125 -140.13 -140.135 -140.14 -140.145 -140.15 -140.155 -140.16 -140.165 -140.17 -140.175 -140.18 -140.185 -140.19 -140.195 -140.2 -140.205 -140.21 -140.215 -140.22 -140.225 -140.23 -140.235 -140.24 -140.245 -140.25 -140.255 -140.26 -140.265 -140.27 -140.275 -140.28 -140.285 -140.29 -140.295 -140.3 -140.305 -140.31 -140.315 -140.32 -140.325 -140.33 -140.335 -140.34 -140.345 -140.35 -140.355 -140.36 -140.365 -140.37 -140.375 -140.38 -140.385 -140.39 -140.395 -140.4 -140.405 -140.41 -140.415 -140.42 -140.425 -140.43 -140.435 -140.44 -140.445 -140.45 -140.455 -140.46 -140.465 -140.47 -140.475 -140.48 -140.485 -140.49 -140.495 -140.5 -140.505 -140.51 -140.515 -140.52 -140.525 -140.53 -140.535 -140.54 -140.545 -140.55 -140.555 -140.56 -140.565 -140.57 -140.575 -140.58 -140.585 -140.59 -140.595 -140.6 -140.605 -140.61 -140.615 -140.62 -140.625 -140.63 -140.635 -140.64 -140.645 -140.65 -140.655 -140.66 -140.665 -140.67 -140.675 -140.68 -140.685 -140.69 -140.695 -140.7 -140.705 -140.71 -140.715 -140.72 -140.725 -140.73 -140.735 -140.74 -140.745 -140.75 -140.755 -140.76 -140.765 -140.77 -140.775 -140.78 -140.785 -140.79 -140.795 -140.8 -140.805 -140.81 -140.815 -140.82 -140.825 -140.83 -140.835 -140.84 -140.845 -140.85 -140.855 -140.86 -140.865 -140.87 -140.875 -140.88 -140.885 -140.89 -140.895 -140.9 -140.905 -140.91 -140.915 -140.92 -140.925 -140.93 -140.935 -140.94 -140.945 -140.95 -140.955 -140.96 -140.965 -140.97 -140.975 -140.98 -140.985 -140.99 -140.995 -141 -141.005 -141.01 -141.015 -141.02 -141.025 -141.03 -141.035 -141.04 -141.045 -141.05 -141.055 -141.06 -141.065 -141.07 -141.075 -141.08 -141.085 -141.09 -141.095 -141.1 -141.105 -141.11 -141.115 -141.12 -141.125 -141.13 -141.135 -141.14 -141.145 -141.15 -141.155 -141.16 -141.165 -141.17 -141.175 -141.18 -141.185 -141.19 -141.195 -141.2 -141.205 -141.21 -141.215 -141.22 -141.225 -141.23 -141.235 -141.24 -141.245 -141.25 -141.255 -141.26 -141.265 -141.27 -141.275 -141.28 -141.285 -141.29 -141.295 -141.3 -141.305 -141.31 -141.315 -141.32 -141.325 -141.33 -141.335 -141.34 -141.345 -141.35 -141.355 -141.36 -141.365 -141.37 -141.375 -141.38 -141.385 -141.39 -141.395 -141.4 -141.405 -141.41 -141.415 -141.42 -141.425 -141.43 -141.435 -141.44 -141.445 -141.45 -141.455 -141.46 -141.465 -141.47 -141.475 -141.48 -141.485 -141.49 -141.495 -141.5 -141.505 -141.51 -141.515 -141.52 -141.525 -141.53 -141.535 -141.54 -141.545 -141.55 -141.555 -141.56 -141.565 -141.57 -141.575 -141.58 -141.585 -141.59 -141.595 -141.6 -141.605 -141.61 -141.615 -141.62 -141.625 -141.63 -141.635 -141.64 -141.645 -141.65 -141.655 -141.66 -141.665 -141.67 -141.675 -141.68 -141.685 -141.69 -141.695 -141.7 -141.705 -141.71 -141.715 -141.72 -141.725 -141.73 -141.735 -141.74 -141.745 -141.75 -141.755 -141.76 -141.765 -141.77 -141.775 -141.78 -141.785 -141.79 -141.795 -141.8 -141.805 -141.81 -141.815 -141.82 -141.825 -141.83 -141.835 -141.84 -141.845 -141.85 -141.855 -141.86 -141.865 -141.87 -141.875 -141.88 -141.885 -141.89 -141.895 -141.9 -141.905 -141.91 -141.915 -141.92 -141.925 -141.93 -141.935 -141.94 -141.945 -141.95 -141.955 -141.96 -141.965 -141.97 -141.975 -141.98 -141.985 -141.99 -141.995 -142 -142.005 -142.01 -142.015 -142.02 -142.025 -142.03 -142.035 -142.04 -142.045 -142.05 -142.055 -142.06 -142.065 -142.07 -142.075 -142.08 -142.085 -142.09 -142.095 -142.1 -142.105 -142.11 -142.115 -142.12 -142.125 -142.13 -142.135 -142.14 -142.145 -142.15 -142.155 -142.16 -142.165 -142.17 -142.175 -142.18 -142.185 -142.19 -142.195 -142.2 -142.205 -142.21 -142.215 -142.22 -142.225 -142.23 -142.235 -142.24 -142.245 -142.25 -142.255 -142.26 -142.265 -142.27 -142.275 -142.28 -142.285 -142.29 -142.295 -142.3 -142.305 -142.31 -142.315 -142.32 -142.325 -142.33 -142.335 -142.34 -142.345 -142.35 -142.355 -142.36 -142.365 -142.37 -142.375 -142.38 -142.385 -142.39 -142.395 -142.4 -142.405 -142.41 -142.415 -142.42 -142.425 -142.43 -142.435 -142.44 -142.445 -142.45 -142.455 -142.46 -142.465 -142.47 -142.475 -142.48 -142.485 -142.49 -142.495 -142.5 -142.505 -142.51 -142.515 -142.52 -142.525 -142.53 -142.535 -142.54 -142.545 -142.55 -142.555 -142.56 -142.565 -142.57 -142.575 -142.58 -142.585 -142.59 -142.595 -142.6 -142.605 -142.61 -142.615 -142.62 -142.625 -142.63 -142.635 -142.64 -142.645 -142.65 -142.655 -142.66 -142.665 -142.67 -142.675 -142.68 -142.685 -142.69 -142.695 -142.7 -142.705 -142.71 -142.715 -142.72 -142.725 -142.73 -142.735 -142.74 -142.745 -142.75 -142.755 -142.76 -142.765 -142.77 -142.775 -142.78 -142.785 -142.79 -142.795 -142.8 -142.805 -142.81 -142.815 -142.82 -142.825 -142.83 -142.835 -142.84 -142.845 -142.85 -142.855 -142.86 -142.865 -142.87 -142.875 -142.88 -142.885 -142.89 -142.895 -142.9 -142.905 -142.91 -142.915 -142.92 -142.925 -142.93 -142.935 -142.94 -142.945 -142.95 -142.955 -142.96 -142.965 -142.97 -142.975 -142.98 -142.985 -142.99 -142.995 -143 -143.005 -143.01 -143.015 -143.02 -143.025 -143.03 -143.035 -143.04 -143.045 -143.05 -143.055 -143.06 -143.065 -143.07 -143.075 -143.08 -143.085 -143.09 -143.095 -143.1 -143.105 -143.11 -143.115 -143.12 -143.125 -143.13 -143.135 -143.14 -143.145 -143.15 -143.155 -143.16 -143.165 -143.17 -143.175 -143.18 -143.185 -143.19 -143.195 -143.2 -143.205 -143.21 -143.215 -143.22 -143.225 -143.23 -143.235 -143.24 -143.245 -143.25 -143.255 -143.26 -143.265 -143.27 -143.275 -143.28 -143.285 -143.29 -143.295 -143.3 -143.305 -143.31 -143.315 -143.32 -143.325 -143.33 -143.335 -143.34 -143.345 -143.35 -143.355 -143.36 -143.365 -143.37 -143.375 -143.38 -143.385 -143.39 -143.395 -143.4 -143.405 -143.41 -143.415 -143.42 -143.425 -143.43 -143.435 -143.44 -143.445 -143.45 -143.455 -143.46 -143.465 -143.47 -143.475 -143.48 -143.485 -143.49 -143.495 -143.5 -143.505 -143.51 -143.515 -143.52 -143.525 -143.53 -143.535 -143.54 -143.545 -143.55 -143.555 -143.56 -143.565 -143.57 -143.575 -143.58 -143.585 -143.59 -143.595 -143.6 -143.605 -143.61 -143.615 -143.62 -143.625 -143.63 -143.635 -143.64 -143.645 -143.65 -143.655 -143.66 -143.665 -143.67 -143.675 -143.68 -143.685 -143.69 -143.695 -143.7 -143.705 -143.71 -143.715 -143.72 -143.725 -143.73 -143.735 -143.74 -143.745 -143.75 -143.755 -143.76 -143.765 -143.77 -143.775 -143.78 -143.785 -143.79 -143.795 -143.8 -143.805 -143.81 -143.815 -143.82 -143.825 -143.83 -143.835 -143.84 -143.845 -143.85 -143.855 -143.86 -143.865 -143.87 -143.875 -143.88 -143.885 -143.89 -143.895 -143.9 -143.905 -143.91 -143.915 -143.92 -143.925 -143.93 -143.935 -143.94 -143.945 -143.95 -143.955 -143.96 -143.965 -143.97 -143.975 -143.98 -143.985 -143.99 -143.995 -144 -144.005 -144.01 -144.015 -144.02 -144.025 -144.03 -144.035 -144.04 -144.045 -144.05 -144.055 -144.06 -144.065 -144.07 -144.075 -144.08 -144.085 -144.09 -144.095 -144.1 -144.105 -144.11 -144.115 -144.12 -144.125 -144.13 -144.135 -144.14 -144.145 -144.15 -144.155 -144.16 -144.165 -144.17 -144.175 -144.18 -144.185 -144.19 -144.195 -144.2 -144.205 -144.21 -144.215 -144.22 -144.225 -144.23 -144.235 -144.24 -144.245 -144.25 -144.255 -144.26 -144.265 -144.27 -144.275 -144.28 -144.285 -144.29 -144.295 -144.3 -144.305 -144.31 -144.315 -144.32 -144.325 -144.33 -144.335 -144.34 -144.345 -144.35 -144.355 -144.36 -144.365 -144.37 -144.375 -144.38 -144.385 -144.39 -144.395 -144.4 -144.405 -144.41 -144.415 -144.42 -144.425 -144.43 -144.435 -144.44 -144.445 -144.45 -144.455 -144.46 -144.465 -144.47 -144.475 -144.48 -144.485 -144.49 -144.495 -144.5 -144.505 -144.51 -144.515 -144.52 -144.525 -144.53 -144.535 -144.54 -144.545 -144.55 -144.555 -144.56 -144.565 -144.57 -144.575 -144.58 -144.585 -144.59 -144.595 -144.6 -144.605 -144.61 -144.615 -144.62 -144.625 -144.63 -144.635 -144.64 -144.645 -144.65 -144.655 -144.66 -144.665 -144.67 -144.675 -144.68 -144.685 -144.69 -144.695 -144.7 -144.705 -144.71 -144.715 -144.72 -144.725 -144.73 -144.735 -144.74 -144.745 -144.75 -144.755 -144.76 -144.765 -144.77 -144.775 -144.78 -144.785 -144.79 -144.795 -144.8 -144.805 -144.81 -144.815 -144.82 -144.825 -144.83 -144.835 -144.84 -144.845 -144.85 -144.855 -144.86 -144.865 -144.87 -144.875 -144.88 -144.885 -144.89 -144.895 -144.9 -144.905 -144.91 -144.915 -144.92 -144.925 -144.93 -144.935 -144.94 -144.945 -144.95 -144.955 -144.96 -144.965 -144.97 -144.975 -144.98 -144.985 -144.99 -144.995 -145 -145.005 -145.01 -145.015 -145.02 -145.025 -145.03 -145.035 -145.04 -145.045 -145.05 -145.055 -145.06 -145.065 -145.07 -145.075 -145.08 -145.085 -145.09 -145.095 -145.1 -145.105 -145.11 -145.115 -145.12 -145.125 -145.13 -145.135 -145.14 -145.145 -145.15 -145.155 -145.16 -145.165 -145.17 -145.175 -145.18 -145.185 -145.19 -145.195 -145.2 -145.205 -145.21 -145.215 -145.22 -145.225 -145.23 -145.235 -145.24 -145.245 -145.25 -145.255 -145.26 -145.265 -145.27 -145.275 -145.28 -145.285 -145.29 -145.295 -145.3 -145.305 -145.31 -145.315 -145.32 -145.325 -145.33 -145.335 -145.34 -145.345 -145.35 -145.355 -145.36 -145.365 -145.37 -145.375 -145.38 -145.385 -145.39 -145.395 -145.4 -145.405 -145.41 -145.415 -145.42 -145.425 -145.43 -145.435 -145.44 -145.445 -145.45 -145.455 -145.46 -145.465 -145.47 -145.475 -145.48 -145.485 -145.49 -145.495 -145.5 -145.505 -145.51 -145.515 -145.52 -145.525 -145.53 -145.535 -145.54 -145.545 -145.55 -145.555 -145.56 -145.565 -145.57 -145.575 -145.58 -145.585 -145.59 -145.595 -145.6 -145.605 -145.61 -145.615 -145.62 -145.625 -145.63 -145.635 -145.64 -145.645 -145.65 -145.655 -145.66 -145.665 -145.67 -145.675 -145.68 -145.685 -145.69 -145.695 -145.7 -145.705 -145.71 -145.715 -145.72 -145.725 -145.73 -145.735 -145.74 -145.745 -145.75 -145.755 -145.76 -145.765 -145.77 -145.775 -145.78 -145.785 -145.79 -145.795 -145.8 -145.805 -145.81 -145.815 -145.82 -145.825 -145.83 -145.835 -145.84 -145.845 -145.85 -145.855 -145.86 -145.865 -145.87 -145.875 -145.88 -145.885 -145.89 -145.895 -145.9 -145.905 -145.91 -145.915 -145.92 -145.925 -145.93 -145.935 -145.94 -145.945 -145.95 -145.955 -145.96 -145.965 -145.97 -145.975 -145.98 -145.985 -145.99 -145.995 -146 -146.005 -146.01 -146.015 -146.02 -146.025 -146.03 -146.035 -146.04 -146.045 -146.05 -146.055 -146.06 -146.065 -146.07 -146.075 -146.08 -146.085 -146.09 -146.095 -146.1 -146.105 -146.11 -146.115 -146.12 -146.125 -146.13 -146.135 -146.14 -146.145 -146.15 -146.155 -146.16 -146.165 -146.17 -146.175 -146.18 -146.185 -146.19 -146.195 -146.2 -146.205 -146.21 -146.215 -146.22 -146.225 -146.23 -146.235 -146.24 -146.245 -146.25 -146.255 -146.26 -146.265 -146.27 -146.275 -146.28 -146.285 -146.29 -146.295 -146.3 -146.305 -146.31 -146.315 -146.32 -146.325 -146.33 -146.335 -146.34 -146.345 -146.35 -146.355 -146.36 -146.365 -146.37 -146.375 -146.38 -146.385 -146.39 -146.395 -146.4 -146.405 -146.41 -146.415 -146.42 -146.425 -146.43 -146.435 -146.44 -146.445 -146.45 -146.455 -146.46 -146.465 -146.47 -146.475 -146.48 -146.485 -146.49 -146.495 -146.5 -146.505 -146.51 -146.515 -146.52 -146.525 -146.53 -146.535 -146.54 -146.545 -146.55 -146.555 -146.56 -146.565 -146.57 -146.575 -146.58 -146.585 -146.59 -146.595 -146.6 -146.605 -146.61 -146.615 -146.62 -146.625 -146.63 -146.635 -146.64 -146.645 -146.65 -146.655 -146.66 -146.665 -146.67 -146.675 -146.68 -146.685 -146.69 -146.695 -146.7 -146.705 -146.71 -146.715 -146.72 -146.725 -146.73 -146.735 -146.74 -146.745 -146.75 -146.755 -146.76 -146.765 -146.77 -146.775 -146.78 -146.785 -146.79 -146.795 -146.8 -146.805 -146.81 -146.815 -146.82 -146.825 -146.83 -146.835 -146.84 -146.845 -146.85 -146.855 -146.86 -146.865 -146.87 -146.875 -146.88 -146.885 -146.89 -146.895 -146.9 -146.905 -146.91 -146.915 -146.92 -146.925 -146.93 -146.935 -146.94 -146.945 -146.95 -146.955 -146.96 -146.965 -146.97 -146.975 -146.98 -146.985 -146.99 -146.995 -147 -147.005 -147.01 -147.015 -147.02 -147.025 -147.03 -147.035 -147.04 -147.045 -147.05 -147.055 -147.06 -147.065 -147.07 -147.075 -147.08 -147.085 -147.09 -147.095 -147.1 -147.105 -147.11 -147.115 -147.12 -147.125 -147.13 -147.135 -147.14 -147.145 -147.15 -147.155 -147.16 -147.165 -147.17 -147.175 -147.18 -147.185 -147.19 -147.195 -147.2 -147.205 -147.21 -147.215 -147.22 -147.225 -147.23 -147.235 -147.24 -147.245 -147.25 -147.255 -147.26 -147.265 -147.27 -147.275 -147.28 -147.285 -147.29 -147.295 -147.3 -147.305 -147.31 -147.315 -147.32 -147.325 -147.33 -147.335 -147.34 -147.345 -147.35 -147.355 -147.36 -147.365 -147.37 -147.375 -147.38 -147.385 -147.39 -147.395 -147.4 -147.405 -147.41 -147.415 -147.42 -147.425 -147.43 -147.435 -147.44 -147.445 -147.45 -147.455 -147.46 -147.465 -147.47 -147.475 -147.48 -147.485 -147.49 -147.495 -147.5 -147.505 -147.51 -147.515 -147.52 -147.525 -147.53 -147.535 -147.54 -147.545 -147.55 -147.555 -147.56 -147.565 -147.57 -147.575 -147.58 -147.585 -147.59 -147.595 -147.6 -147.605 -147.61 -147.615 -147.62 -147.625 -147.63 -147.635 -147.64 -147.645 -147.65 -147.655 -147.66 -147.665 -147.67 -147.675 -147.68 -147.685 -147.69 -147.695 -147.7 -147.705 -147.71 -147.715 -147.72 -147.725 -147.73 -147.735 -147.74 -147.745 -147.75 -147.755 -147.76 -147.765 -147.77 -147.775 -147.78 -147.785 -147.79 -147.795 -147.8 -147.805 -147.81 -147.815 -147.82 -147.825 -147.83 -147.835 -147.84 -147.845 -147.85 -147.855 -147.86 -147.865 -147.87 -147.875 -147.88 -147.885 -147.89 -147.895 -147.9 -147.905 -147.91 -147.915 -147.92 -147.925 -147.93 -147.935 -147.94 -147.945 -147.95 -147.955 -147.96 -147.965 -147.97 -147.975 -147.98 -147.985 -147.99 -147.995 -148 -148.005 -148.01 -148.015 -148.02 -148.025 -148.03 -148.035 -148.04 -148.045 -148.05 -148.055 -148.06 -148.065 -148.07 -148.075 -148.08 -148.085 -148.09 -148.095 -148.1 -148.105 -148.11 -148.115 -148.12 -148.125 -148.13 -148.135 -148.14 -148.145 -148.15 -148.155 -148.16 -148.165 -148.17 -148.175 -148.18 -148.185 -148.19 -148.195 -148.2 -148.205 -148.21 -148.215 -148.22 -148.225 -148.23 -148.235 -148.24 -148.245 -148.25 -148.255 -148.26 -148.265 -148.27 -148.275 -148.28 -148.285 -148.29 -148.295 -148.3 -148.305 -148.31 -148.315 -148.32 -148.325 -148.33 -148.335 -148.34 -148.345 -148.35 -148.355 -148.36 -148.365 -148.37 -148.375 -148.38 -148.385 -148.39 -148.395 -148.4 -148.405 -148.41 -148.415 -148.42 -148.425 -148.43 -148.435 -148.44 -148.445 -148.45 -148.455 -148.46 -148.465 -148.47 -148.475 -148.48 -148.485 -148.49 -148.495 -148.5 -148.505 -148.51 -148.515 -148.52 -148.525 -148.53 -148.535 -148.54 -148.545 -148.55 -148.555 -148.56 -148.565 -148.57 -148.575 -148.58 -148.585 -148.59 -148.595 -148.6 -148.605 -148.61 -148.615 -148.62 -148.625 -148.63 -148.635 -148.64 -148.645 -148.65 -148.655 -148.66 -148.665 -148.67 -148.675 -148.68 -148.685 -148.69 -148.695 -148.7 -148.705 -148.71 -148.715 -148.72 -148.725 -148.73 -148.735 -148.74 -148.745 -148.75 -148.755 -148.76 -148.765 -148.77 -148.775 -148.78 -148.785 -148.79 -148.795 -148.8 -148.805 -148.81 -148.815 -148.82 -148.825 -148.83 -148.835 -148.84 -148.845 -148.85 -148.855 -148.86 -148.865 -148.87 -148.875 -148.88 -148.885 -148.89 -148.895 -148.9 -148.905 -148.91 -148.915 -148.92 -148.925 -148.93 -148.935 -148.94 -148.945 -148.95 -148.955 -148.96 -148.965 -148.97 -148.975 -148.98 -148.985 -148.99 -148.995 -149 -149.005 -149.01 -149.015 -149.02 -149.025 -149.03 -149.035 -149.04 -149.045 -149.05 -149.055 -149.06 -149.065 -149.07 -149.075 -149.08 -149.085 -149.09 -149.095 -149.1 -149.105 -149.11 -149.115 -149.12 -149.125 -149.13 -149.135 -149.14 -149.145 -149.15 -149.155 -149.16 -149.165 -149.17 -149.175 -149.18 -149.185 -149.19 -149.195 -149.2 -149.205 -149.21 -149.215 -149.22 -149.225 -149.23 -149.235 -149.24 -149.245 -149.25 -149.255 -149.26 -149.265 -149.27 -149.275 -149.28 -149.285 -149.29 -149.295 -149.3 -149.305 -149.31 -149.315 -149.32 -149.325 -149.33 -149.335 -149.34 -149.345 -149.35 -149.355 -149.36 -149.365 -149.37 -149.375 -149.38 -149.385 -149.39 -149.395 -149.4 -149.405 -149.41 -149.415 -149.42 -149.425 -149.43 -149.435 -149.44 -149.445 -149.45 -149.455 -149.46 -149.465 -149.47 -149.475 -149.48 -149.485 -149.49 -149.495 -149.5 -149.505 -149.51 -149.515 -149.52 -149.525 -149.53 -149.535 -149.54 -149.545 -149.55 -149.555 -149.56 -149.565 -149.57 -149.575 -149.58 -149.585 -149.59 -149.595 -149.6 -149.605 -149.61 -149.615 -149.62 -149.625 -149.63 -149.635 -149.64 -149.645 -149.65 -149.655 -149.66 -149.665 -149.67 -149.675 -149.68 -149.685 -149.69 -149.695 -149.7 -149.705 -149.71 -149.715 -149.72 -149.725 -149.73 -149.735 -149.74 -149.745 -149.75 -149.755 -149.76 -149.765 -149.77 -149.775 -149.78 -149.785 -149.79 -149.795 -149.8 -149.805 -149.81 -149.815 -149.82 -149.825 -149.83 -149.835 -149.84 -149.845 -149.85 -149.855 -149.86 -149.865 -149.87 -149.875 -149.88 -149.885 -149.89 -149.895 -149.9 -149.905 -149.91 -149.915 -149.92 -149.925 -149.93 -149.935 -149.94 -149.945 -149.95 -149.955 -149.96 -149.965 -149.97 -149.975 -149.98 -149.985 -149.99 -149.995 -150 -150.005 -150.01 -150.015 -150.02 -150.025 -150.03 -150.035 -150.04 -150.045 -150.05 -150.055 -150.06 -150.065 -150.07 -150.075 -150.08 -150.085 -150.09 -150.095 -150.1 -150.105 -150.11 -150.115 -150.12 -150.125 -150.13 -150.135 -150.14 -150.145 -150.15 -150.155 -150.16 -150.165 -150.17 -150.175 -150.18 -150.185 -150.19 -150.195 -150.2 -150.205 -150.21 -150.215 -150.22 -150.225 -150.23 -150.235 -150.24 -150.245 -150.25 -150.255 -150.26 -150.265 -150.27 -150.275 -150.28 -150.285 -150.29 -150.295 -150.3 -150.305 -150.31 -150.315 -150.32 -150.325 -150.33 -150.335 -150.34 -150.345 -150.35 -150.355 -150.36 -150.365 -150.37 -150.375 -150.38 -150.385 -150.39 -150.395 -150.4 -150.405 -150.41 -150.415 -150.42 -150.425 -150.43 -150.435 -150.44 -150.445 -150.45 -150.455 -150.46 -150.465 -150.47 -150.475 -150.48 -150.485 -150.49 -150.495 -150.5 -150.505 -150.51 -150.515 -150.52 -150.525 -150.53 -150.535 -150.54 -150.545 -150.55 -150.555 -150.56 -150.565 -150.57 -150.575 -150.58 -150.585 -150.59 -150.595 -150.6 -150.605 -150.61 -150.615 -150.62 -150.625 -150.63 -150.635 -150.64 -150.645 -150.65 -150.655 -150.66 -150.665 -150.67 -150.675 -150.68 -150.685 -150.69 -150.695 -150.7 -150.705 -150.71 -150.715 -150.72 -150.725 -150.73 -150.735 -150.74 -150.745 -150.75 -150.755 -150.76 -150.765 -150.77 -150.775 -150.78 -150.785 -150.79 -150.795 -150.8 -150.805 -150.81 -150.815 -150.82 -150.825 -150.83 -150.835 -150.84 -150.845 -150.85 -150.855 -150.86 -150.865 -150.87 -150.875 -150.88 -150.885 -150.89 -150.895 -150.9 -150.905 -150.91 -150.915 -150.92 -150.925 -150.93 -150.935 -150.94 -150.945 -150.95 -150.955 -150.96 -150.965 -150.97 -150.975 -150.98 -150.985 -150.99 -150.995 -151 -151.005 -151.01 -151.015 -151.02 -151.025 -151.03 -151.035 -151.04 -151.045 -151.05 -151.055 -151.06 -151.065 -151.07 -151.075 -151.08 -151.085 -151.09 -151.095 -151.1 -151.105 -151.11 -151.115 -151.12 -151.125 -151.13 -151.135 -151.14 -151.145 -151.15 -151.155 -151.16 -151.165 -151.17 -151.175 -151.18 -151.185 -151.19 -151.195 -151.2 -151.205 -151.21 -151.215 -151.22 -151.225 -151.23 -151.235 -151.24 -151.245 -151.25 -151.255 -151.26 -151.265 -151.27 -151.275 -151.28 -151.285 -151.29 -151.295 -151.3 -151.305 -151.31 -151.315 -151.32 -151.325 -151.33 -151.335 -151.34 -151.345 -151.35 -151.355 -151.36 -151.365 -151.37 -151.375 -151.38 -151.385 -151.39 -151.395 -151.4 -151.405 -151.41 -151.415 -151.42 -151.425 -151.43 -151.435 -151.44 -151.445 -151.45 -151.455 -151.46 -151.465 -151.47 -151.475 -151.48 -151.485 -151.49 -151.495 -151.5 -151.505 -151.51 -151.515 -151.52 -151.525 -151.53 -151.535 -151.54 -151.545 -151.55 -151.555 -151.56 -151.565 -151.57 -151.575 -151.58 -151.585 -151.59 -151.595 -151.6 -151.605 -151.61 -151.615 -151.62 -151.625 -151.63 -151.635 -151.64 -151.645 -151.65 -151.655 -151.66 -151.665 -151.67 -151.675 -151.68 -151.685 -151.69 -151.695 -151.7 -151.705 -151.71 -151.715 -151.72 -151.725 -151.73 -151.735 -151.74 -151.745 -151.75 -151.755 -151.76 -151.765 -151.77 -151.775 -151.78 -151.785 -151.79 -151.795 -151.8 -151.805 -151.81 -151.815 -151.82 -151.825 -151.83 -151.835 -151.84 -151.845 -151.85 -151.855 -151.86 -151.865 -151.87 -151.875 -151.88 -151.885 -151.89 -151.895 -151.9 -151.905 -151.91 -151.915 -151.92 -151.925 -151.93 -151.935 -151.94 -151.945 -151.95 -151.955 -151.96 -151.965 -151.97 -151.975 -151.98 -151.985 -151.99 -151.995 -152 -152.005 -152.01 -152.015 -152.02 -152.025 -152.03 -152.035 -152.04 -152.045 -152.05 -152.055 -152.06 -152.065 -152.07 -152.075 -152.08 -152.085 -152.09 -152.095 -152.1 -152.105 -152.11 -152.115 -152.12 -152.125 -152.13 -152.135 -152.14 -152.145 -152.15 -152.155 -152.16 -152.165 -152.17 -152.175 -152.18 -152.185 -152.19 -152.195 -152.2 -152.205 -152.21 -152.215 -152.22 -152.225 -152.23 -152.235 -152.24 -152.245 -152.25 -152.255 -152.26 -152.265 -152.27 -152.275 -152.28 -152.285 -152.29 -152.295 -152.3 -152.305 -152.31 -152.315 -152.32 -152.325 -152.33 -152.335 -152.34 -152.345 -152.35 -152.355 -152.36 -152.365 -152.37 -152.375 -152.38 -152.385 -152.39 -152.395 -152.4 -152.405 -152.41 -152.415 -152.42 -152.425 -152.43 -152.435 -152.44 -152.445 -152.45 -152.455 -152.46 -152.465 -152.47 -152.475 -152.48 -152.485 -152.49 -152.495 -152.5 -152.505 -152.51 -152.515 -152.52 -152.525 -152.53 -152.535 -152.54 -152.545 -152.55 -152.555 -152.56 -152.565 -152.57 -152.575 -152.58 -152.585 -152.59 -152.595 -152.6 -152.605 -152.61 -152.615 -152.62 -152.625 -152.63 -152.635 -152.64 -152.645 -152.65 -152.655 -152.66 -152.665 -152.67 -152.675 -152.68 -152.685 -152.69 -152.695 -152.7 -152.705 -152.71 -152.715 -152.72 -152.725 -152.73 -152.735 -152.74 -152.745 -152.75 -152.755 -152.76 -152.765 -152.77 -152.775 -152.78 -152.785 -152.79 -152.795 -152.8 -152.805 -152.81 -152.815 -152.82 -152.825 -152.83 -152.835 -152.84 -152.845 -152.85 -152.855 -152.86 -152.865 -152.87 -152.875 -152.88 -152.885 -152.89 -152.895 -152.9 -152.905 -152.91 -152.915 -152.92 -152.925 -152.93 -152.935 -152.94 -152.945 -152.95 -152.955 -152.96 -152.965 -152.97 -152.975 -152.98 -152.985 -152.99 -152.995 -153 -153.005 -153.01 -153.015 -153.02 -153.025 -153.03 -153.035 -153.04 -153.045 -153.05 -153.055 -153.06 -153.065 -153.07 -153.075 -153.08 -153.085 -153.09 -153.095 -153.1 -153.105 -153.11 -153.115 -153.12 -153.125 -153.13 -153.135 -153.14 -153.145 -153.15 -153.155 -153.16 -153.165 -153.17 -153.175 -153.18 -153.185 -153.19 -153.195 -153.2 -153.205 -153.21 -153.215 -153.22 -153.225 -153.23 -153.235 -153.24 -153.245 -153.25 -153.255 -153.26 -153.265 -153.27 -153.275 -153.28 -153.285 -153.29 -153.295 -153.3 -153.305 -153.31 -153.315 -153.32 -153.325 -153.33 -153.335 -153.34 -153.345 -153.35 -153.355 -153.36 -153.365 -153.37 -153.375 -153.38 -153.385 -153.39 -153.395 -153.4 -153.405 -153.41 -153.415 -153.42 -153.425 -153.43 -153.435 -153.44 -153.445 -153.45 -153.455 -153.46 -153.465 -153.47 -153.475 -153.48 -153.485 -153.49 -153.495 -153.5 -153.505 -153.51 -153.515 -153.52 -153.525 -153.53 -153.535 -153.54 -153.545 -153.55 -153.555 -153.56 -153.565 -153.57 -153.575 -153.58 -153.585 -153.59 -153.595 -153.6 -153.605 -153.61 -153.615 -153.62 -153.625 -153.63 -153.635 -153.64 -153.645 -153.65 -153.655 -153.66 -153.665 -153.67 -153.675 -153.68 -153.685 -153.69 -153.695 -153.7 -153.705 -153.71 -153.715 -153.72 -153.725 -153.73 -153.735 -153.74 -153.745 -153.75 -153.755 -153.76 -153.765 -153.77 -153.775 -153.78 -153.785 -153.79 -153.795 -153.8 -153.805 -153.81 -153.815 -153.82 -153.825 -153.83 -153.835 -153.84 -153.845 -153.85 -153.855 -153.86 -153.865 -153.87 -153.875 -153.88 -153.885 -153.89 -153.895 -153.9 -153.905 -153.91 -153.915 -153.92 -153.925 -153.93 -153.935 -153.94 -153.945 -153.95 -153.955 -153.96 -153.965 -153.97 -153.975 -153.98 -153.985 -153.99 -153.995 -154 -154.005 -154.01 -154.015 -154.02 -154.025 -154.03 -154.035 -154.04 -154.045 -154.05 -154.055 -154.06 -154.065 -154.07 -154.075 -154.08 -154.085 -154.09 -154.095 -154.1 -154.105 -154.11 -154.115 -154.12 -154.125 -154.13 -154.135 -154.14 -154.145 -154.15 -154.155 -154.16 -154.165 -154.17 -154.175 -154.18 -154.185 -154.19 -154.195 -154.2 -154.205 -154.21 -154.215 -154.22 -154.225 -154.23 -154.235 -154.24 -154.245 -154.25 -154.255 -154.26 -154.265 -154.27 -154.275 -154.28 -154.285 -154.29 -154.295 -154.3 -154.305 -154.31 -154.315 -154.32 -154.325 -154.33 -154.335 -154.34 -154.345 -154.35 -154.355 -154.36 -154.365 -154.37 -154.375 -154.38 -154.385 -154.39 -154.395 -154.4 -154.405 -154.41 -154.415 -154.42 -154.425 -154.43 -154.435 -154.44 -154.445 -154.45 -154.455 -154.46 -154.465 -154.47 -154.475 -154.48 -154.485 -154.49 -154.495 -154.5 -154.505 -154.51 -154.515 -154.52 -154.525 -154.53 -154.535 -154.54 -154.545 -154.55 -154.555 -154.56 -154.565 -154.57 -154.575 -154.58 -154.585 -154.59 -154.595 -154.6 -154.605 -154.61 -154.615 -154.62 -154.625 -154.63 -154.635 -154.64 -154.645 -154.65 -154.655 -154.66 -154.665 -154.67 -154.675 -154.68 -154.685 -154.69 -154.695 -154.7 -154.705 -154.71 -154.715 -154.72 -154.725 -154.73 -154.735 -154.74 -154.745 -154.75 -154.755 -154.76 -154.765 -154.77 -154.775 -154.78 -154.785 -154.79 -154.795 -154.8 -154.805 -154.81 -154.815 -154.82 -154.825 -154.83 -154.835 -154.84 -154.845 -154.85 -154.855 -154.86 -154.865 -154.87 -154.875 -154.88 -154.885 -154.89 -154.895 -154.9 -154.905 -154.91 -154.915 -154.92 -154.925 -154.93 -154.935 -154.94 -154.945 -154.95 -154.955 -154.96 -154.965 -154.97 -154.975 -154.98 -154.985 -154.99 -154.995 -155 -155.005 -155.01 -155.015 -155.02 -155.025 -155.03 -155.035 -155.04 -155.045 -155.05 -155.055 -155.06 -155.065 -155.07 -155.075 -155.08 -155.085 -155.09 -155.095 -155.1 -155.105 -155.11 -155.115 -155.12 -155.125 -155.13 -155.135 -155.14 -155.145 -155.15 -155.155 -155.16 -155.165 -155.17 -155.175 -155.18 -155.185 -155.19 -155.195 -155.2 -155.205 -155.21 -155.215 -155.22 -155.225 -155.23 -155.235 -155.24 -155.245 -155.25 -155.255 -155.26 -155.265 -155.27 -155.275 -155.28 -155.285 -155.29 -155.295 -155.3 -155.305 -155.31 -155.315 -155.32 -155.325 -155.33 -155.335 -155.34 -155.345 -155.35 -155.355 -155.36 -155.365 -155.37 -155.375 -155.38 -155.385 -155.39 -155.395 -155.4 -155.405 -155.41 -155.415 -155.42 -155.425 -155.43 -155.435 -155.44 -155.445 -155.45 -155.455 -155.46 -155.465 -155.47 -155.475 -155.48 -155.485 -155.49 -155.495 -155.5 -155.505 -155.51 -155.515 -155.52 -155.525 -155.53 -155.535 -155.54 -155.545 -155.55 -155.555 -155.56 -155.565 -155.57 -155.575 -155.58 -155.585 -155.59 -155.595 -155.6 -155.605 -155.61 -155.615 -155.62 -155.625 -155.63 -155.635 -155.64 -155.645 -155.65 -155.655 -155.66 -155.665 -155.67 -155.675 -155.68 -155.685 -155.69 -155.695 -155.7 -155.705 -155.71 -155.715 -155.72 -155.725 -155.73 -155.735 -155.74 -155.745 -155.75 -155.755 -155.76 -155.765 -155.77 -155.775 -155.78 -155.785 -155.79 -155.795 -155.8 -155.805 -155.81 -155.815 -155.82 -155.825 -155.83 -155.835 -155.84 -155.845 -155.85 -155.855 -155.86 -155.865 -155.87 -155.875 -155.88 -155.885 -155.89 -155.895 -155.9 -155.905 -155.91 -155.915 -155.92 -155.925 -155.93 -155.935 -155.94 -155.945 -155.95 -155.955 -155.96 -155.965 -155.97 -155.975 -155.98 -155.985 -155.99 -155.995 -156 -156.005 -156.01 -156.015 -156.02 -156.025 -156.03 -156.035 -156.04 -156.045 -156.05 -156.055 -156.06 -156.065 -156.07 -156.075 -156.08 -156.085 -156.09 -156.095 -156.1 -156.105 -156.11 -156.115 -156.12 -156.125 -156.13 -156.135 -156.14 -156.145 -156.15 -156.155 -156.16 -156.165 -156.17 -156.175 -156.18 -156.185 -156.19 -156.195 -156.2 -156.205 -156.21 -156.215 -156.22 -156.225 -156.23 -156.235 -156.24 -156.245 -156.25 -156.255 -156.26 -156.265 -156.27 -156.275 -156.28 -156.285 -156.29 -156.295 -156.3 -156.305 -156.31 -156.315 -156.32 -156.325 -156.33 -156.335 -156.34 -156.345 -156.35 -156.355 -156.36 -156.365 -156.37 -156.375 -156.38 -156.385 -156.39 -156.395 -156.4 -156.405 -156.41 -156.415 -156.42 -156.425 -156.43 -156.435 -156.44 -156.445 -156.45 -156.455 -156.46 -156.465 -156.47 -156.475 -156.48 -156.485 -156.49 -156.495 -156.5 -156.505 -156.51 -156.515 -156.52 -156.525 -156.53 -156.535 -156.54 -156.545 -156.55 -156.555 -156.56 -156.565 -156.57 -156.575 -156.58 -156.585 -156.59 -156.595 -156.6 -156.605 -156.61 -156.615 -156.62 -156.625 -156.63 -156.635 -156.64 -156.645 -156.65 -156.655 -156.66 -156.665 -156.67 -156.675 -156.68 -156.685 -156.69 -156.695 -156.7 -156.705 -156.71 -156.715 -156.72 -156.725 -156.73 -156.735 -156.74 -156.745 -156.75 -156.755 -156.76 -156.765 -156.77 -156.775 -156.78 -156.785 -156.79 -156.795 -156.8 -156.805 -156.81 -156.815 -156.82 -156.825 -156.83 -156.835 -156.84 -156.845 -156.85 -156.855 -156.86 -156.865 -156.87 -156.875 -156.88 -156.885 -156.89 -156.895 -156.9 -156.905 -156.91 -156.915 -156.92 -156.925 -156.93 -156.935 -156.94 -156.945 -156.95 -156.955 -156.96 -156.965 -156.97 -156.975 -156.98 -156.985 -156.99 -156.995 -157 -157.005 -157.01 -157.015 -157.02 -157.025 -157.03 -157.035 -157.04 -157.045 -157.05 -157.055 -157.06 -157.065 -157.07 -157.075 -157.08 -157.085 -157.09 -157.095 -157.1 -157.105 -157.11 -157.115 -157.12 -157.125 -157.13 -157.135 -157.14 -157.145 -157.15 -157.155 -157.16 -157.165 -157.17 -157.175 -157.18 -157.185 -157.19 -157.195 -157.2 -157.205 -157.21 -157.215 -157.22 -157.225 -157.23 -157.235 -157.24 -157.245 -157.25 -157.255 -157.26 -157.265 -157.27 -157.275 -157.28 -157.285 -157.29 -157.295 -157.3 -157.305 -157.31 -157.315 -157.32 -157.325 -157.33 -157.335 -157.34 -157.345 -157.35 -157.355 -157.36 -157.365 -157.37 -157.375 -157.38 -157.385 -157.39 -157.395 -157.4 -157.405 -157.41 -157.415 -157.42 -157.425 -157.43 -157.435 -157.44 -157.445 -157.45 -157.455 -157.46 -157.465 -157.47 -157.475 -157.48 -157.485 -157.49 -157.495 -157.5 -157.505 -157.51 -157.515 -157.52 -157.525 -157.53 -157.535 -157.54 -157.545 -157.55 -157.555 -157.56 -157.565 -157.57 -157.575 -157.58 -157.585 -157.59 -157.595 -157.6 -157.605 -157.61 -157.615 -157.62 -157.625 -157.63 -157.635 -157.64 -157.645 -157.65 -157.655 -157.66 -157.665 -157.67 -157.675 -157.68 -157.685 -157.69 -157.695 -157.7 -157.705 -157.71 -157.715 -157.72 -157.725 -157.73 -157.735 -157.74 -157.745 -157.75 -157.755 -157.76 -157.765 -157.77 -157.775 -157.78 -157.785 -157.79 -157.795 -157.8 -157.805 -157.81 -157.815 -157.82 -157.825 -157.83 -157.835 -157.84 -157.845 -157.85 -157.855 -157.86 -157.865 -157.87 -157.875 -157.88 -157.885 -157.89 -157.895 -157.9 -157.905 -157.91 -157.915 -157.92 -157.925 -157.93 -157.935 -157.94 -157.945 -157.95 -157.955 -157.96 -157.965 -157.97 -157.975 -157.98 -157.985 -157.99 -157.995 -158 -158.005 -158.01 -158.015 -158.02 -158.025 -158.03 -158.035 -158.04 -158.045 -158.05 -158.055 -158.06 -158.065 -158.07 -158.075 -158.08 -158.085 -158.09 -158.095 -158.1 -158.105 -158.11 -158.115 -158.12 -158.125 -158.13 -158.135 -158.14 -158.145 -158.15 -158.155 -158.16 -158.165 -158.17 -158.175 -158.18 -158.185 -158.19 -158.195 -158.2 -158.205 -158.21 -158.215 -158.22 -158.225 -158.23 -158.235 -158.24 -158.245 -158.25 -158.255 -158.26 -158.265 -158.27 -158.275 -158.28 -158.285 -158.29 -158.295 -158.3 -158.305 -158.31 -158.315 -158.32 -158.325 -158.33 -158.335 -158.34 -158.345 -158.35 -158.355 -158.36 -158.365 -158.37 -158.375 -158.38 -158.385 -158.39 -158.395 -158.4 -158.405 -158.41 -158.415 -158.42 -158.425 -158.43 -158.435 -158.44 -158.445 -158.45 -158.455 -158.46 -158.465 -158.47 -158.475 -158.48 -158.485 -158.49 -158.495 -158.5 -158.505 -158.51 -158.515 -158.52 -158.525 -158.53 -158.535 -158.54 -158.545 -158.55 -158.555 -158.56 -158.565 -158.57 -158.575 -158.58 -158.585 -158.59 -158.595 -158.6 -158.605 -158.61 -158.615 -158.62 -158.625 -158.63 -158.635 -158.64 -158.645 -158.65 -158.655 -158.66 -158.665 -158.67 -158.675 -158.68 -158.685 -158.69 -158.695 -158.7 -158.705 -158.71 -158.715 -158.72 -158.725 -158.73 -158.735 -158.74 -158.745 -158.75 -158.755 -158.76 -158.765 -158.77 -158.775 -158.78 -158.785 -158.79 -158.795 -158.8 -158.805 -158.81 -158.815 -158.82 -158.825 -158.83 -158.835 -158.84 -158.845 -158.85 -158.855 -158.86 -158.865 -158.87 -158.875 -158.88 -158.885 -158.89 -158.895 -158.9 -158.905 -158.91 -158.915 -158.92 -158.925 -158.93 -158.935 -158.94 -158.945 -158.95 -158.955 -158.96 -158.965 -158.97 -158.975 -158.98 -158.985 -158.99 -158.995 -159 -159.005 -159.01 -159.015 -159.02 -159.025 -159.03 -159.035 -159.04 -159.045 -159.05 -159.055 -159.06 -159.065 -159.07 -159.075 -159.08 -159.085 -159.09 -159.095 -159.1 -159.105 -159.11 -159.115 -159.12 -159.125 -159.13 -159.135 -159.14 -159.145 -159.15 -159.155 -159.16 -159.165 -159.17 -159.175 -159.18 -159.185 -159.19 -159.195 -159.2 -159.205 -159.21 -159.215 -159.22 -159.225 -159.23 -159.235 -159.24 -159.245 -159.25 -159.255 -159.26 -159.265 -159.27 -159.275 -159.28 -159.285 -159.29 -159.295 -159.3 -159.305 -159.31 -159.315 -159.32 -159.325 -159.33 -159.335 -159.34 -159.345 -159.35 -159.355 -159.36 -159.365 -159.37 -159.375 -159.38 -159.385 -159.39 -159.395 -159.4 -159.405 -159.41 -159.415 -159.42 -159.425 -159.43 -159.435 -159.44 -159.445 -159.45 -159.455 -159.46 -159.465 -159.47 -159.475 -159.48 -159.485 -159.49 -159.495 -159.5 -159.505 -159.51 -159.515 -159.52 -159.525 -159.53 -159.535 -159.54 -159.545 -159.55 -159.555 -159.56 -159.565 -159.57 -159.575 -159.58 -159.585 -159.59 -159.595 -159.6 -159.605 -159.61 -159.615 -159.62 -159.625 -159.63 -159.635 -159.64 -159.645 -159.65 -159.655 -159.66 -159.665 -159.67 -159.675 -159.68 -159.685 -159.69 -159.695 -159.7 -159.705 -159.71 -159.715 -159.72 -159.725 -159.73 -159.735 -159.74 -159.745 -159.75 -159.755 -159.76 -159.765 -159.77 -159.775 -159.78 -159.785 -159.79 -159.795 -159.8 -159.805 -159.81 -159.815 -159.82 -159.825 -159.83 -159.835 -159.84 -159.845 -159.85 -159.855 -159.86 -159.865 -159.87 -159.875 -159.88 -159.885 -159.89 -159.895 -159.9 -159.905 -159.91 -159.915 -159.92 -159.925 -159.93 -159.935 -159.94 -159.945 -159.95 -159.955 -159.96 -159.965 -159.97 -159.975 -159.98 -159.985 -159.99 -159.995 -160 -160.005 -160.01 -160.015 -160.02 -160.025 -160.03 -160.035 -160.04 -160.045 -160.05 -160.055 -160.06 -160.065 -160.07 -160.075 -160.08 -160.085 -160.09 -160.095 -160.1 -160.105 -160.11 -160.115 -160.12 -160.125 -160.13 -160.135 -160.14 -160.145 -160.15 -160.155 -160.16 -160.165 -160.17 -160.175 -160.18 -160.185 -160.19 -160.195 -160.2 -160.205 -160.21 -160.215 -160.22 -160.225 -160.23 -160.235 -160.24 -160.245 -160.25 -160.255 -160.26 -160.265 -160.27 -160.275 -160.28 -160.285 -160.29 -160.295 -160.3 -160.305 -160.31 -160.315 -160.32 -160.325 -160.33 -160.335 -160.34 -160.345 -160.35 -160.355 -160.36 -160.365 -160.37 -160.375 -160.38 -160.385 -160.39 -160.395 -160.4 -160.405 -160.41 -160.415 -160.42 -160.425 -160.43 -160.435 -160.44 -160.445 -160.45 -160.455 -160.46 -160.465 -160.47 -160.475 -160.48 -160.485 -160.49 -160.495 -160.5 -160.505 -160.51 -160.515 -160.52 -160.525 -160.53 -160.535 -160.54 -160.545 -160.55 -160.555 -160.56 -160.565 -160.57 -160.575 -160.58 -160.585 -160.59 -160.595 -160.6 -160.605 -160.61 -160.615 -160.62 -160.625 -160.63 -160.635 -160.64 -160.645 -160.65 -160.655 -160.66 -160.665 -160.67 -160.675 -160.68 -160.685 -160.69 -160.695 -160.7 -160.705 -160.71 -160.715 -160.72 -160.725 -160.73 -160.735 -160.74 -160.745 -160.75 -160.755 -160.76 -160.765 -160.77 -160.775 -160.78 -160.785 -160.79 -160.795 -160.8 -160.805 -160.81 -160.815 -160.82 -160.825 -160.83 -160.835 -160.84 -160.845 -160.85 -160.855 -160.86 -160.865 -160.87 -160.875 -160.88 -160.885 -160.89 -160.895 -160.9 -160.905 -160.91 -160.915 -160.92 -160.925 -160.93 -160.935 -160.94 -160.945 -160.95 -160.955 -160.96 -160.965 -160.97 -160.975 -160.98 -160.985 -160.99 -160.995 -161 -161.005 -161.01 -161.015 -161.02 -161.025 -161.03 -161.035 -161.04 -161.045 -161.05 -161.055 -161.06 -161.065 -161.07 -161.075 -161.08 -161.085 -161.09 -161.095 -161.1 -161.105 -161.11 -161.115 -161.12 -161.125 -161.13 -161.135 -161.14 -161.145 -161.15 -161.155 -161.16 -161.165 -161.17 -161.175 -161.18 -161.185 -161.19 -161.195 -161.2 -161.205 -161.21 -161.215 -161.22 -161.225 -161.23 -161.235 -161.24 -161.245 -161.25 -161.255 -161.26 -161.265 -161.27 -161.275 -161.28 -161.285 -161.29 -161.295 -161.3 -161.305 -161.31 -161.315 -161.32 -161.325 -161.33 -161.335 -161.34 -161.345 -161.35 -161.355 -161.36 -161.365 -161.37 -161.375 -161.38 -161.385 -161.39 -161.395 -161.4 -161.405 -161.41 -161.415 -161.42 -161.425 -161.43 -161.435 -161.44 -161.445 -161.45 -161.455 -161.46 -161.465 -161.47 -161.475 -161.48 -161.485 -161.49 -161.495 -161.5 -161.505 -161.51 -161.515 -161.52 -161.525 -161.53 -161.535 -161.54 -161.545 -161.55 -161.555 -161.56 -161.565 -161.57 -161.575 -161.58 -161.585 -161.59 -161.595 -161.6 -161.605 -161.61 -161.615 -161.62 -161.625 -161.63 -161.635 -161.64 -161.645 -161.65 -161.655 -161.66 -161.665 -161.67 -161.675 -161.68 -161.685 -161.69 -161.695 -161.7 -161.705 -161.71 -161.715 -161.72 -161.725 -161.73 -161.735 -161.74 -161.745 -161.75 -161.755 -161.76 -161.765 -161.77 -161.775 -161.78 -161.785 -161.79 -161.795 -161.8 -161.805 -161.81 -161.815 -161.82 -161.825 -161.83 -161.835 -161.84 -161.845 -161.85 -161.855 -161.86 -161.865 -161.87 -161.875 -161.88 -161.885 -161.89 -161.895 -161.9 -161.905 -161.91 -161.915 -161.92 -161.925 -161.93 -161.935 -161.94 -161.945 -161.95 -161.955 -161.96 -161.965 -161.97 -161.975 -161.98 -161.985 -161.99 -161.995 -162 -162.005 -162.01 -162.015 -162.02 -162.025 -162.03 -162.035 -162.04 -162.045 -162.05 -162.055 -162.06 -162.065 -162.07 -162.075 -162.08 -162.085 -162.09 -162.095 -162.1 -162.105 -162.11 -162.115 -162.12 -162.125 -162.13 -162.135 -162.14 -162.145 -162.15 -162.155 -162.16 -162.165 -162.17 -162.175 -162.18 -162.185 -162.19 -162.195 -162.2 -162.205 -162.21 -162.215 -162.22 -162.225 -162.23 -162.235 -162.24 -162.245 -162.25 -162.255 -162.26 -162.265 -162.27 -162.275 -162.28 -162.285 -162.29 -162.295 -162.3 -162.305 -162.31 -162.315 -162.32 -162.325 -162.33 -162.335 -162.34 -162.345 -162.35 -162.355 -162.36 -162.365 -162.37 -162.375 -162.38 -162.385 -162.39 -162.395 -162.4 -162.405 -162.41 -162.415 -162.42 -162.425 -162.43 -162.435 -162.44 -162.445 -162.45 -162.455 -162.46 -162.465 -162.47 -162.475 -162.48 -162.485 -162.49 -162.495 -162.5 -162.505 -162.51 -162.515 -162.52 -162.525 -162.53 -162.535 -162.54 -162.545 -162.55 -162.555 -162.56 -162.565 -162.57 -162.575 -162.58 -162.585 -162.59 -162.595 -162.6 -162.605 -162.61 -162.615 -162.62 -162.625 -162.63 -162.635 -162.64 -162.645 -162.65 -162.655 -162.66 -162.665 -162.67 -162.675 -162.68 -162.685 -162.69 -162.695 -162.7 -162.705 -162.71 -162.715 -162.72 -162.725 -162.73 -162.735 -162.74 -162.745 -162.75 -162.755 -162.76 -162.765 -162.77 -162.775 -162.78 -162.785 -162.79 -162.795 -162.8 -162.805 -162.81 -162.815 -162.82 -162.825 -162.83 -162.835 -162.84 -162.845 -162.85 -162.855 -162.86 -162.865 -162.87 -162.875 -162.88 -162.885 -162.89 -162.895 -162.9 -162.905 -162.91 -162.915 -162.92 -162.925 -162.93 -162.935 -162.94 -162.945 -162.95 -162.955 -162.96 -162.965 -162.97 -162.975 -162.98 -162.985 -162.99 -162.995 -163 -163.005 -163.01 -163.015 -163.02 -163.025 -163.03 -163.035 -163.04 -163.045 -163.05 -163.055 -163.06 -163.065 -163.07 -163.075 -163.08 -163.085 -163.09 -163.095 -163.1 -163.105 -163.11 -163.115 -163.12 -163.125 -163.13 -163.135 -163.14 -163.145 -163.15 -163.155 -163.16 -163.165 -163.17 -163.175 -163.18 -163.185 -163.19 -163.195 -163.2 -163.205 -163.21 -163.215 -163.22 -163.225 -163.23 -163.235 -163.24 -163.245 -163.25 -163.255 -163.26 -163.265 -163.27 -163.275 -163.28 -163.285 -163.29 -163.295 -163.3 -163.305 -163.31 -163.315 -163.32 -163.325 -163.33 -163.335 -163.34 -163.345 -163.35 -163.355 -163.36 -163.365 -163.37 -163.375 -163.38 -163.385 -163.39 -163.395 -163.4 -163.405 -163.41 -163.415 -163.42 -163.425 -163.43 -163.435 -163.44 -163.445 -163.45 -163.455 -163.46 -163.465 -163.47 -163.475 -163.48 -163.485 -163.49 -163.495 -163.5 -163.505 -163.51 -163.515 -163.52 -163.525 -163.53 -163.535 -163.54 -163.545 -163.55 -163.555 -163.56 -163.565 -163.57 -163.575 -163.58 -163.585 -163.59 -163.595 -163.6 -163.605 -163.61 -163.615 -163.62 -163.625 -163.63 -163.635 -163.64 -163.645 -163.65 -163.655 -163.66 -163.665 -163.67 -163.675 -163.68 -163.685 -163.69 -163.695 -163.7 -163.705 -163.71 -163.715 -163.72 -163.725 -163.73 -163.735 -163.74 -163.745 -163.75 -163.755 -163.76 -163.765 -163.77 -163.775 -163.78 -163.785 -163.79 -163.795 -163.8 -163.805 -163.81 -163.815 -163.82 -163.825 -163.83 -163.835 -163.84 -163.845 -163.85 -163.855 -163.86 -163.865 -163.87 -163.875 -163.88 -163.885 -163.89 -163.895 -163.9 -163.905 -163.91 -163.915 -163.92 -163.925 -163.93 -163.935 -163.94 -163.945 -163.95 -163.955 -163.96 -163.965 -163.97 -163.975 -163.98 -163.985 -163.99 -163.995 -164 -164.005 -164.01 -164.015 -164.02 -164.025 -164.03 -164.035 -164.04 -164.045 -164.05 -164.055 -164.06 -164.065 -164.07 -164.075 -164.08 -164.085 -164.09 -164.095 -164.1 -164.105 -164.11 -164.115 -164.12 -164.125 -164.13 -164.135 -164.14 -164.145 -164.15 -164.155 -164.16 -164.165 -164.17 -164.175 -164.18 -164.185 -164.19 -164.195 -164.2 -164.205 -164.21 -164.215 -164.22 -164.225 -164.23 -164.235 -164.24 -164.245 -164.25 -164.255 -164.26 -164.265 -164.27 -164.275 -164.28 -164.285 -164.29 -164.295 -164.3 -164.305 -164.31 -164.315 -164.32 -164.325 -164.33 -164.335 -164.34 -164.345 -164.35 -164.355 -164.36 -164.365 -164.37 -164.375 -164.38 -164.385 -164.39 -164.395 -164.4 -164.405 -164.41 -164.415 -164.42 -164.425 -164.43 -164.435 -164.44 -164.445 -164.45 -164.455 -164.46 -164.465 -164.47 -164.475 -164.48 -164.485 -164.49 -164.495 -164.5 -164.505 -164.51 -164.515 -164.52 -164.525 -164.53 -164.535 -164.54 -164.545 -164.55 -164.555 -164.56 -164.565 -164.57 -164.575 -164.58 -164.585 -164.59 -164.595 -164.6 -164.605 -164.61 -164.615 -164.62 -164.625 -164.63 -164.635 -164.64 -164.645 -164.65 -164.655 -164.66 -164.665 -164.67 -164.675 -164.68 -164.685 -164.69 -164.695 -164.7 -164.705 -164.71 -164.715 -164.72 -164.725 -164.73 -164.735 -164.74 -164.745 -164.75 -164.755 -164.76 -164.765 -164.77 -164.775 -164.78 -164.785 -164.79 -164.795 -164.8 -164.805 -164.81 -164.815 -164.82 -164.825 -164.83 -164.835 -164.84 -164.845 -164.85 -164.855 -164.86 -164.865 -164.87 -164.875 -164.88 -164.885 -164.89 -164.895 -164.9 -164.905 -164.91 -164.915 -164.92 -164.925 -164.93 -164.935 -164.94 -164.945 -164.95 -164.955 -164.96 -164.965 -164.97 -164.975 -164.98 -164.985 -164.99 -164.995 -165 -165.005 -165.01 -165.015 -165.02 -165.025 -165.03 -165.035 -165.04 -165.045 -165.05 -165.055 -165.06 -165.065 -165.07 -165.075 -165.08 -165.085 -165.09 -165.095 -165.1 -165.105 -165.11 -165.115 -165.12 -165.125 -165.13 -165.135 -165.14 -165.145 -165.15 -165.155 -165.16 -165.165 -165.17 -165.175 -165.18 -165.185 -165.19 -165.195 -165.2 -165.205 -165.21 -165.215 -165.22 -165.225 -165.23 -165.235 -165.24 -165.245 -165.25 -165.255 -165.26 -165.265 -165.27 -165.275 -165.28 -165.285 -165.29 -165.295 -165.3 -165.305 -165.31 -165.315 -165.32 -165.325 -165.33 -165.335 -165.34 -165.345 -165.35 -165.355 -165.36 -165.365 -165.37 -165.375 -165.38 -165.385 -165.39 -165.395 -165.4 -165.405 -165.41 -165.415 -165.42 -165.425 -165.43 -165.435 -165.44 -165.445 -165.45 -165.455 -165.46 -165.465 -165.47 -165.475 -165.48 -165.485 -165.49 -165.495 -165.5 -165.505 -165.51 -165.515 -165.52 -165.525 -165.53 -165.535 -165.54 -165.545 -165.55 -165.555 -165.56 -165.565 -165.57 -165.575 -165.58 -165.585 -165.59 -165.595 -165.6 -165.605 -165.61 -165.615 -165.62 -165.625 -165.63 -165.635 -165.64 -165.645 -165.65 -165.655 -165.66 -165.665 -165.67 -165.675 -165.68 -165.685 -165.69 -165.695 -165.7 -165.705 -165.71 -165.715 -165.72 -165.725 -165.73 -165.735 -165.74 -165.745 -165.75 -165.755 -165.76 -165.765 -165.77 -165.775 -165.78 -165.785 -165.79 -165.795 -165.8 -165.805 -165.81 -165.815 -165.82 -165.825 -165.83 -165.835 -165.84 -165.845 -165.85 -165.855 -165.86 -165.865 -165.87 -165.875 -165.88 -165.885 -165.89 -165.895 -165.9 -165.905 -165.91 -165.915 -165.92 -165.925 -165.93 -165.935 -165.94 -165.945 -165.95 -165.955 -165.96 -165.965 -165.97 -165.975 -165.98 -165.985 -165.99 -165.995 -166 -166.005 -166.01 -166.015 -166.02 -166.025 -166.03 -166.035 -166.04 -166.045 -166.05 -166.055 -166.06 -166.065 -166.07 -166.075 -166.08 -166.085 -166.09 -166.095 -166.1 -166.105 -166.11 -166.115 -166.12 -166.125 -166.13 -166.135 -166.14 -166.145 -166.15 -166.155 -166.16 -166.165 -166.17 -166.175 -166.18 -166.185 -166.19 -166.195 -166.2 -166.205 -166.21 -166.215 -166.22 -166.225 -166.23 -166.235 -166.24 -166.245 -166.25 -166.255 -166.26 -166.265 -166.27 -166.275 -166.28 -166.285 -166.29 -166.295 -166.3 -166.305 -166.31 -166.315 -166.32 -166.325 -166.33 -166.335 -166.34 -166.345 -166.35 -166.355 -166.36 -166.365 -166.37 -166.375 -166.38 -166.385 -166.39 -166.395 -166.4 -166.405 -166.41 -166.415 -166.42 -166.425 -166.43 -166.435 -166.44 -166.445 -166.45 -166.455 -166.46 -166.465 -166.47 -166.475 -166.48 -166.485 -166.49 -166.495 -166.5 -166.505 -166.51 -166.515 -166.52 -166.525 -166.53 -166.535 -166.54 -166.545 -166.55 -166.555 -166.56 -166.565 -166.57 -166.575 -166.58 -166.585 -166.59 -166.595 -166.6 -166.605 -166.61 -166.615 -166.62 -166.625 -166.63 -166.635 -166.64 -166.645 -166.65 -166.655 -166.66 -166.665 -166.67 -166.675 -166.68 -166.685 -166.69 -166.695 -166.7 -166.705 -166.71 -166.715 -166.72 -166.725 -166.73 -166.735 -166.74 -166.745 -166.75 -166.755 -166.76 -166.765 -166.77 -166.775 -166.78 -166.785 -166.79 -166.795 -166.8 -166.805 -166.81 -166.815 -166.82 -166.825 -166.83 -166.835 -166.84 -166.845 -166.85 -166.855 -166.86 -166.865 -166.87 -166.875 -166.88 -166.885 -166.89 -166.895 -166.9 -166.905 -166.91 -166.915 -166.92 -166.925 -166.93 -166.935 -166.94 -166.945 -166.95 -166.955 -166.96 -166.965 -166.97 -166.975 -166.98 -166.985 -166.99 -166.995 -167 -167.005 -167.01 -167.015 -167.02 -167.025 -167.03 -167.035 -167.04 -167.045 -167.05 -167.055 -167.06 -167.065 -167.07 -167.075 -167.08 -167.085 -167.09 -167.095 -167.1 -167.105 -167.11 -167.115 -167.12 -167.125 -167.13 -167.135 -167.14 -167.145 -167.15 -167.155 -167.16 -167.165 -167.17 -167.175 -167.18 -167.185 -167.19 -167.195 -167.2 -167.205 -167.21 -167.215 -167.22 -167.225 -167.23 -167.235 -167.24 -167.245 -167.25 -167.255 -167.26 -167.265 -167.27 -167.275 -167.28 -167.285 -167.29 -167.295 -167.3 -167.305 -167.31 -167.315 -167.32 -167.325 -167.33 -167.335 -167.34 -167.345 -167.35 -167.355 -167.36 -167.365 -167.37 -167.375 -167.38 -167.385 -167.39 -167.395 -167.4 -167.405 -167.41 -167.415 -167.42 -167.425 -167.43 -167.435 -167.44 -167.445 -167.45 -167.455 -167.46 -167.465 -167.47 -167.475 -167.48 -167.485 -167.49 -167.495 -167.5 -167.505 -167.51 -167.515 -167.52 -167.525 -167.53 -167.535 -167.54 -167.545 -167.55 -167.555 -167.56 -167.565 -167.57 -167.575 -167.58 -167.585 -167.59 -167.595 -167.6 -167.605 -167.61 -167.615 -167.62 -167.625 -167.63 -167.635 -167.64 -167.645 -167.65 -167.655 -167.66 -167.665 -167.67 -167.675 -167.68 -167.685 -167.69 -167.695 -167.7 -167.705 -167.71 -167.715 -167.72 -167.725 -167.73 -167.735 -167.74 -167.745 -167.75 -167.755 -167.76 -167.765 -167.77 -167.775 -167.78 -167.785 -167.79 -167.795 -167.8 -167.805 -167.81 -167.815 -167.82 -167.825 -167.83 -167.835 -167.84 -167.845 -167.85 -167.855 -167.86 -167.865 -167.87 -167.875 -167.88 -167.885 -167.89 -167.895 -167.9 -167.905 -167.91 -167.915 -167.92 -167.925 -167.93 -167.935 -167.94 -167.945 -167.95 -167.955 -167.96 -167.965 -167.97 -167.975 -167.98 -167.985 -167.99 -167.995 -168 -168.005 -168.01 -168.015 -168.02 -168.025 -168.03 -168.035 -168.04 -168.045 -168.05 -168.055 -168.06 -168.065 -168.07 -168.075 -168.08 -168.085 -168.09 -168.095 -168.1 -168.105 -168.11 -168.115 -168.12 -168.125 -168.13 -168.135 -168.14 -168.145 -168.15 -168.155 -168.16 -168.165 -168.17 -168.175 -168.18 -168.185 -168.19 -168.195 -168.2 -168.205 -168.21 -168.215 -168.22 -168.225 -168.23 -168.235 -168.24 -168.245 -168.25 -168.255 -168.26 -168.265 -168.27 -168.275 -168.28 -168.285 -168.29 -168.295 -168.3 -168.305 -168.31 -168.315 -168.32 -168.325 -168.33 -168.335 -168.34 -168.345 -168.35 -168.355 -168.36 -168.365 -168.37 -168.375 -168.38 -168.385 -168.39 -168.395 -168.4 -168.405 -168.41 -168.415 -168.42 -168.425 -168.43 -168.435 -168.44 -168.445 -168.45 -168.455 -168.46 -168.465 -168.47 -168.475 -168.48 -168.485 -168.49 -168.495 -168.5 -168.505 -168.51 -168.515 -168.52 -168.525 -168.53 -168.535 -168.54 -168.545 -168.55 -168.555 -168.56 -168.565 -168.57 -168.575 -168.58 -168.585 -168.59 -168.595 -168.6 -168.605 -168.61 -168.615 -168.62 -168.625 -168.63 -168.635 -168.64 -168.645 -168.65 -168.655 -168.66 -168.665 -168.67 -168.675 -168.68 -168.685 -168.69 -168.695 -168.7 -168.705 -168.71 -168.715 -168.72 -168.725 -168.73 -168.735 -168.74 -168.745 -168.75 -168.755 -168.76 -168.765 -168.77 -168.775 -168.78 -168.785 -168.79 -168.795 -168.8 -168.805 -168.81 -168.815 -168.82 -168.825 -168.83 -168.835 -168.84 -168.845 -168.85 -168.855 -168.86 -168.865 -168.87 -168.875 -168.88 -168.885 -168.89 -168.895 -168.9 -168.905 -168.91 -168.915 -168.92 -168.925 -168.93 -168.935 -168.94 -168.945 -168.95 -168.955 -168.96 -168.965 -168.97 -168.975 -168.98 -168.985 -168.99 -168.995 -169 -169.005 -169.01 -169.015 -169.02 -169.025 -169.03 -169.035 -169.04 -169.045 -169.05 -169.055 -169.06 -169.065 -169.07 -169.075 -169.08 -169.085 -169.09 -169.095 -169.1 -169.105 -169.11 -169.115 -169.12 -169.125 -169.13 -169.135 -169.14 -169.145 -169.15 -169.155 -169.16 -169.165 -169.17 -169.175 -169.18 -169.185 -169.19 -169.195 -169.2 -169.205 -169.21 -169.215 -169.22 -169.225 -169.23 -169.235 -169.24 -169.245 -169.25 -169.255 -169.26 -169.265 -169.27 -169.275 -169.28 -169.285 -169.29 -169.295 -169.3 -169.305 -169.31 -169.315 -169.32 -169.325 -169.33 -169.335 -169.34 -169.345 -169.35 -169.355 -169.36 -169.365 -169.37 -169.375 -169.38 -169.385 -169.39 -169.395 -169.4 -169.405 -169.41 -169.415 -169.42 -169.425 -169.43 -169.435 -169.44 -169.445 -169.45 -169.455 -169.46 -169.465 -169.47 -169.475 -169.48 -169.485 -169.49 -169.495 -169.5 -169.505 -169.51 -169.515 -169.52 -169.525 -169.53 -169.535 -169.54 -169.545 -169.55 -169.555 -169.56 -169.565 -169.57 -169.575 -169.58 -169.585 -169.59 -169.595 -169.6 -169.605 -169.61 -169.615 -169.62 -169.625 -169.63 -169.635 -169.64 -169.645 -169.65 -169.655 -169.66 -169.665 -169.67 -169.675 -169.68 -169.685 -169.69 -169.695 -169.7 -169.705 -169.71 -169.715 -169.72 -169.725 -169.73 -169.735 -169.74 -169.745 -169.75 -169.755 -169.76 -169.765 -169.77 -169.775 -169.78 -169.785 -169.79 -169.795 -169.8 -169.805 -169.81 -169.815 -169.82 -169.825 -169.83 -169.835 -169.84 -169.845 -169.85 -169.855 -169.86 -169.865 -169.87 -169.875 -169.88 -169.885 -169.89 -169.895 -169.9 -169.905 -169.91 -169.915 -169.92 -169.925 -169.93 -169.935 -169.94 -169.945 -169.95 -169.955 -169.96 -169.965 -169.97 -169.975 -169.98 -169.985 -169.99 -169.995 -170 -170.005 -170.01 -170.015 -170.02 -170.025 -170.03 -170.035 -170.04 -170.045 -170.05 -170.055 -170.06 -170.065 -170.07 -170.075 -170.08 -170.085 -170.09 -170.095 -170.1 -170.105 -170.11 -170.115 -170.12 -170.125 -170.13 -170.135 -170.14 -170.145 -170.15 -170.155 -170.16 -170.165 -170.17 -170.175 -170.18 -170.185 -170.19 -170.195 -170.2 -170.205 -170.21 -170.215 -170.22 -170.225 -170.23 -170.235 -170.24 -170.245 -170.25 -170.255 -170.26 -170.265 -170.27 -170.275 -170.28 -170.285 -170.29 -170.295 -170.3 -170.305 -170.31 -170.315 -170.32 -170.325 -170.33 -170.335 -170.34 -170.345 -170.35 -170.355 -170.36 -170.365 -170.37 -170.375 -170.38 -170.385 -170.39 -170.395 -170.4 -170.405 -170.41 -170.415 -170.42 -170.425 -170.43 -170.435 -170.44 -170.445 -170.45 -170.455 -170.46 -170.465 -170.47 -170.475 -170.48 -170.485 -170.49 -170.495 -170.5 -170.505 -170.51 -170.515 -170.52 -170.525 -170.53 -170.535 -170.54 -170.545 -170.55 -170.555 -170.56 -170.565 -170.57 -170.575 -170.58 -170.585 -170.59 -170.595 -170.6 -170.605 -170.61 -170.615 -170.62 -170.625 -170.63 -170.635 -170.64 -170.645 -170.65 -170.655 -170.66 -170.665 -170.67 -170.675 -170.68 -170.685 -170.69 -170.695 -170.7 -170.705 -170.71 -170.715 -170.72 -170.725 -170.73 -170.735 -170.74 -170.745 -170.75 -170.755 -170.76 -170.765 -170.77 -170.775 -170.78 -170.785 -170.79 -170.795 -170.8 -170.805 -170.81 -170.815 -170.82 -170.825 -170.83 -170.835 -170.84 -170.845 -170.85 -170.855 -170.86 -170.865 -170.87 -170.875 -170.88 -170.885 -170.89 -170.895 -170.9 -170.905 -170.91 -170.915 -170.92 -170.925 -170.93 -170.935 -170.94 -170.945 -170.95 -170.955 -170.96 -170.965 -170.97 -170.975 -170.98 -170.985 -170.99 -170.995 -171 -171.005 -171.01 -171.015 -171.02 -171.025 -171.03 -171.035 -171.04 -171.045 -171.05 -171.055 -171.06 -171.065 -171.07 -171.075 -171.08 -171.085 -171.09 -171.095 -171.1 -171.105 -171.11 -171.115 -171.12 -171.125 -171.13 -171.135 -171.14 -171.145 -171.15 -171.155 -171.16 -171.165 -171.17 -171.175 -171.18 -171.185 -171.19 -171.195 -171.2 -171.205 -171.21 -171.215 -171.22 -171.225 -171.23 -171.235 -171.24 -171.245 -171.25 -171.255 -171.26 -171.265 -171.27 -171.275 -171.28 -171.285 -171.29 -171.295 -171.3 -171.305 -171.31 -171.315 -171.32 -171.325 -171.33 -171.335 -171.34 -171.345 -171.35 -171.355 -171.36 -171.365 -171.37 -171.375 -171.38 -171.385 -171.39 -171.395 -171.4 -171.405 -171.41 -171.415 -171.42 -171.425 -171.43 -171.435 -171.44 -171.445 -171.45 -171.455 -171.46 -171.465 -171.47 -171.475 -171.48 -171.485 -171.49 -171.495 -171.5 -171.505 -171.51 -171.515 -171.52 -171.525 -171.53 -171.535 -171.54 -171.545 -171.55 -171.555 -171.56 -171.565 -171.57 -171.575 -171.58 -171.585 -171.59 -171.595 -171.6 -171.605 -171.61 -171.615 -171.62 -171.625 -171.63 -171.635 -171.64 -171.645 -171.65 -171.655 -171.66 -171.665 -171.67 -171.675 -171.68 -171.685 -171.69 -171.695 -171.7 -171.705 -171.71 -171.715 -171.72 -171.725 -171.73 -171.735 -171.74 -171.745 -171.75 -171.755 -171.76 -171.765 -171.77 -171.775 -171.78 -171.785 -171.79 -171.795 -171.8 -171.805 -171.81 -171.815 -171.82 -171.825 -171.83 -171.835 -171.84 -171.845 -171.85 -171.855 -171.86 -171.865 -171.87 -171.875 -171.88 -171.885 -171.89 -171.895 -171.9 -171.905 -171.91 -171.915 -171.92 -171.925 -171.93 -171.935 -171.94 -171.945 -171.95 -171.955 -171.96 -171.965 -171.97 -171.975 -171.98 -171.985 -171.99 -171.995 -172 -172.005 -172.01 -172.015 -172.02 -172.025 -172.03 -172.035 -172.04 -172.045 -172.05 -172.055 -172.06 -172.065 -172.07 -172.075 -172.08 -172.085 -172.09 -172.095 -172.1 -172.105 -172.11 -172.115 -172.12 -172.125 -172.13 -172.135 -172.14 -172.145 -172.15 -172.155 -172.16 -172.165 -172.17 -172.175 -172.18 -172.185 -172.19 -172.195 -172.2 -172.205 -172.21 -172.215 -172.22 -172.225 -172.23 -172.235 -172.24 -172.245 -172.25 -172.255 -172.26 -172.265 -172.27 -172.275 -172.28 -172.285 -172.29 -172.295 -172.3 -172.305 -172.31 -172.315 -172.32 -172.325 -172.33 -172.335 -172.34 -172.345 -172.35 -172.355 -172.36 -172.365 -172.37 -172.375 -172.38 -172.385 -172.39 -172.395 -172.4 -172.405 -172.41 -172.415 -172.42 -172.425 -172.43 -172.435 -172.44 -172.445 -172.45 -172.455 -172.46 -172.465 -172.47 -172.475 -172.48 -172.485 -172.49 -172.495 -172.5 -172.505 -172.51 -172.515 -172.52 -172.525 -172.53 -172.535 -172.54 -172.545 -172.55 -172.555 -172.56 -172.565 -172.57 -172.575 -172.58 -172.585 -172.59 -172.595 -172.6 -172.605 -172.61 -172.615 -172.62 -172.625 -172.63 -172.635 -172.64 -172.645 -172.65 -172.655 -172.66 -172.665 -172.67 -172.675 -172.68 -172.685 -172.69 -172.695 -172.7 -172.705 -172.71 -172.715 -172.72 -172.725 -172.73 -172.735 -172.74 -172.745 -172.75 -172.755 -172.76 -172.765 -172.77 -172.775 -172.78 -172.785 -172.79 -172.795 -172.8 -172.805 -172.81 -172.815 -172.82 -172.825 -172.83 -172.835 -172.84 -172.845 -172.85 -172.855 -172.86 -172.865 -172.87 -172.875 -172.88 -172.885 -172.89 -172.895 -172.9 -172.905 -172.91 -172.915 -172.92 -172.925 -172.93 -172.935 -172.94 -172.945 -172.95 -172.955 -172.96 -172.965 -172.97 -172.975 -172.98 -172.985 -172.99 -172.995 -173 -173.005 -173.01 -173.015 -173.02 -173.025 -173.03 -173.035 -173.04 -173.045 -173.05 -173.055 -173.06 -173.065 -173.07 -173.075 -173.08 -173.085 -173.09 -173.095 -173.1 -173.105 -173.11 -173.115 -173.12 -173.125 -173.13 -173.135 -173.14 -173.145 -173.15 -173.155 -173.16 -173.165 -173.17 -173.175 -173.18 -173.185 -173.19 -173.195 -173.2 -173.205 -173.21 -173.215 -173.22 -173.225 -173.23 -173.235 -173.24 -173.245 -173.25 -173.255 -173.26 -173.265 -173.27 -173.275 -173.28 -173.285 -173.29 -173.295 -173.3 -173.305 -173.31 -173.315 -173.32 -173.325 -173.33 -173.335 -173.34 -173.345 -173.35 -173.355 -173.36 -173.365 -173.37 -173.375 -173.38 -173.385 -173.39 -173.395 -173.4 -173.405 -173.41 -173.415 -173.42 -173.425 -173.43 -173.435 -173.44 -173.445 -173.45 -173.455 -173.46 -173.465 -173.47 -173.475 -173.48 -173.485 -173.49 -173.495 -173.5 -173.505 -173.51 -173.515 -173.52 -173.525 -173.53 -173.535 -173.54 -173.545 -173.55 -173.555 -173.56 -173.565 -173.57 -173.575 -173.58 -173.585 -173.59 -173.595 -173.6 -173.605 -173.61 -173.615 -173.62 -173.625 -173.63 -173.635 -173.64 -173.645 -173.65 -173.655 -173.66 -173.665 -173.67 -173.675 -173.68 -173.685 -173.69 -173.695 -173.7 -173.705 -173.71 -173.715 -173.72 -173.725 -173.73 -173.735 -173.74 -173.745 -173.75 -173.755 -173.76 -173.765 -173.77 -173.775 -173.78 -173.785 -173.79 -173.795 -173.8 -173.805 -173.81 -173.815 -173.82 -173.825 -173.83 -173.835 -173.84 -173.845 -173.85 -173.855 -173.86 -173.865 -173.87 -173.875 -173.88 -173.885 -173.89 -173.895 -173.9 -173.905 -173.91 -173.915 -173.92 -173.925 -173.93 -173.935 -173.94 -173.945 -173.95 -173.955 -173.96 -173.965 -173.97 -173.975 -173.98 -173.985 -173.99 -173.995 -174 -174.005 -174.01 -174.015 -174.02 -174.025 -174.03 -174.035 -174.04 -174.045 -174.05 -174.055 -174.06 -174.065 -174.07 -174.075 -174.08 -174.085 -174.09 -174.095 -174.1 -174.105 -174.11 -174.115 -174.12 -174.125 -174.13 -174.135 -174.14 -174.145 -174.15 -174.155 -174.16 -174.165 -174.17 -174.175 -174.18 -174.185 -174.19 -174.195 -174.2 -174.205 -174.21 -174.215 -174.22 -174.225 -174.23 -174.235 -174.24 -174.245 -174.25 -174.255 -174.26 -174.265 -174.27 -174.275 -174.28 -174.285 -174.29 -174.295 -174.3 -174.305 -174.31 -174.315 -174.32 -174.325 -174.33 -174.335 -174.34 -174.345 -174.35 -174.355 -174.36 -174.365 -174.37 -174.375 -174.38 -174.385 -174.39 -174.395 -174.4 -174.405 -174.41 -174.415 -174.42 -174.425 -174.43 -174.435 -174.44 -174.445 -174.45 -174.455 -174.46 -174.465 -174.47 -174.475 -174.48 -174.485 -174.49 -174.495 -174.5 -174.505 -174.51 -174.515 -174.52 -174.525 -174.53 -174.535 -174.54 -174.545 -174.55 -174.555 -174.56 -174.565 -174.57 -174.575 -174.58 -174.585 -174.59 -174.595 -174.6 -174.605 -174.61 -174.615 -174.62 -174.625 -174.63 -174.635 -174.64 -174.645 -174.65 -174.655 -174.66 -174.665 -174.67 -174.675 -174.68 -174.685 -174.69 -174.695 -174.7 -174.705 -174.71 -174.715 -174.72 -174.725 -174.73 -174.735 -174.74 -174.745 -174.75 -174.755 -174.76 -174.765 -174.77 -174.775 -174.78 -174.785 -174.79 -174.795 -174.8 -174.805 -174.81 -174.815 -174.82 -174.825 -174.83 -174.835 -174.84 -174.845 -174.85 -174.855 -174.86 -174.865 -174.87 -174.875 -174.88 -174.885 -174.89 -174.895 -174.9 -174.905 -174.91 -174.915 -174.92 -174.925 -174.93 -174.935 -174.94 -174.945 -174.95 -174.955 -174.96 -174.965 -174.97 -174.975 -174.98 -174.985 -174.99 -174.995 -175 -175.005 -175.01 -175.015 -175.02 -175.025 -175.03 -175.035 -175.04 -175.045 -175.05 -175.055 -175.06 -175.065 -175.07 -175.075 -175.08 -175.085 -175.09 -175.095 -175.1 -175.105 -175.11 -175.115 -175.12 -175.125 -175.13 -175.135 -175.14 -175.145 -175.15 -175.155 -175.16 -175.165 -175.17 -175.175 -175.18 -175.185 -175.19 -175.195 -175.2 -175.205 -175.21 -175.215 -175.22 -175.225 -175.23 -175.235 -175.24 -175.245 -175.25 -175.255 -175.26 -175.265 -175.27 -175.275 -175.28 -175.285 -175.29 -175.295 -175.3 -175.305 -175.31 -175.315 -175.32 -175.325 -175.33 -175.335 -175.34 -175.345 -175.35 -175.355 -175.36 -175.365 -175.37 -175.375 -175.38 -175.385 -175.39 -175.395 -175.4 -175.405 -175.41 -175.415 -175.42 -175.425 -175.43 -175.435 -175.44 -175.445 -175.45 -175.455 -175.46 -175.465 -175.47 -175.475 -175.48 -175.485 -175.49 -175.495 -175.5 -175.505 -175.51 -175.515 -175.52 -175.525 -175.53 -175.535 -175.54 -175.545 -175.55 -175.555 -175.56 -175.565 -175.57 -175.575 -175.58 -175.585 -175.59 -175.595 -175.6 -175.605 -175.61 -175.615 -175.62 -175.625 -175.63 -175.635 -175.64 -175.645 -175.65 -175.655 -175.66 -175.665 -175.67 -175.675 -175.68 -175.685 -175.69 -175.695 -175.7 -175.705 -175.71 -175.715 -175.72 -175.725 -175.73 -175.735 -175.74 -175.745 -175.75 -175.755 -175.76 -175.765 -175.77 -175.775 -175.78 -175.785 -175.79 -175.795 -175.8 -175.805 -175.81 -175.815 -175.82 -175.825 -175.83 -175.835 -175.84 -175.845 -175.85 -175.855 -175.86 -175.865 -175.87 -175.875 -175.88 -175.885 -175.89 -175.895 -175.9 -175.905 -175.91 -175.915 -175.92 -175.925 -175.93 -175.935 -175.94 -175.945 -175.95 -175.955 -175.96 -175.965 -175.97 -175.975 -175.98 -175.985 -175.99 -175.995 -176 -176.005 -176.01 -176.015 -176.02 -176.025 -176.03 -176.035 -176.04 -176.045 -176.05 -176.055 -176.06 -176.065 -176.07 -176.075 -176.08 -176.085 -176.09 -176.095 -176.1 -176.105 -176.11 -176.115 -176.12 -176.125 -176.13 -176.135 -176.14 -176.145 -176.15 -176.155 -176.16 -176.165 -176.17 -176.175 -176.18 -176.185 -176.19 -176.195 -176.2 -176.205 -176.21 -176.215 -176.22 -176.225 -176.23 -176.235 -176.24 -176.245 -176.25 -176.255 -176.26 -176.265 -176.27 -176.275 -176.28 -176.285 -176.29 -176.295 -176.3 -176.305 -176.31 -176.315 -176.32 -176.325 -176.33 -176.335 -176.34 -176.345 -176.35 -176.355 -176.36 -176.365 -176.37 -176.375 -176.38 -176.385 -176.39 -176.395 -176.4 -176.405 -176.41 -176.415 -176.42 -176.425 -176.43 -176.435 -176.44 -176.445 -176.45 -176.455 -176.46 -176.465 -176.47 -176.475 -176.48 -176.485 -176.49 -176.495 -176.5 -176.505 -176.51 -176.515 -176.52 -176.525 -176.53 -176.535 -176.54 -176.545 -176.55 -176.555 -176.56 -176.565 -176.57 -176.575 -176.58 -176.585 -176.59 -176.595 -176.6 -176.605 -176.61 -176.615 -176.62 -176.625 -176.63 -176.635 -176.64 -176.645 -176.65 -176.655 -176.66 -176.665 -176.67 -176.675 -176.68 -176.685 -176.69 -176.695 -176.7 -176.705 -176.71 -176.715 -176.72 -176.725 -176.73 -176.735 -176.74 -176.745 -176.75 -176.755 -176.76 -176.765 -176.77 -176.775 -176.78 -176.785 -176.79 -176.795 -176.8 -176.805 -176.81 -176.815 -176.82 -176.825 -176.83 -176.835 -176.84 -176.845 -176.85 -176.855 -176.86 -176.865 -176.87 -176.875 -176.88 -176.885 -176.89 -176.895 -176.9 -176.905 -176.91 -176.915 -176.92 -176.925 -176.93 -176.935 -176.94 -176.945 -176.95 -176.955 -176.96 -176.965 -176.97 -176.975 -176.98 -176.985 -176.99 -176.995 -177 -177.005 -177.01 -177.015 -177.02 -177.025 -177.03 -177.035 -177.04 -177.045 -177.05 -177.055 -177.06 -177.065 -177.07 -177.075 -177.08 -177.085 -177.09 -177.095 -177.1 -177.105 -177.11 -177.115 -177.12 -177.125 -177.13 -177.135 -177.14 -177.145 -177.15 -177.155 -177.16 -177.165 -177.17 -177.175 -177.18 -177.185 -177.19 -177.195 -177.2 -177.205 -177.21 -177.215 -177.22 -177.225 -177.23 -177.235 -177.24 -177.245 -177.25 -177.255 -177.26 -177.265 -177.27 -177.275 -177.28 -177.285 -177.29 -177.295 -177.3 -177.305 -177.31 -177.315 -177.32 -177.325 -177.33 -177.335 -177.34 -177.345 -177.35 -177.355 -177.36 -177.365 -177.37 -177.375 -177.38 -177.385 -177.39 -177.395 -177.4 -177.405 -177.41 -177.415 -177.42 -177.425 -177.43 -177.435 -177.44 -177.445 -177.45 -177.455 -177.46 -177.465 -177.47 -177.475 -177.48 -177.485 -177.49 -177.495 -177.5 -177.505 -177.51 -177.515 -177.52 -177.525 -177.53 -177.535 -177.54 -177.545 -177.55 -177.555 -177.56 -177.565 -177.57 -177.575 -177.58 -177.585 -177.59 -177.595 -177.6 -177.605 -177.61 -177.615 -177.62 -177.625 -177.63 -177.635 -177.64 -177.645 -177.65 -177.655 -177.66 -177.665 -177.67 -177.675 -177.68 -177.685 -177.69 -177.695 -177.7 -177.705 -177.71 -177.715 -177.72 -177.725 -177.73 -177.735 -177.74 -177.745 -177.75 -177.755 -177.76 -177.765 -177.77 -177.775 -177.78 -177.785 -177.79 -177.795 -177.8 -177.805 -177.81 -177.815 -177.82 -177.825 -177.83 -177.835 -177.84 -177.845 -177.85 -177.855 -177.86 -177.865 -177.87 -177.875 -177.88 -177.885 -177.89 -177.895 -177.9 -177.905 -177.91 -177.915 -177.92 -177.925 -177.93 -177.935 -177.94 -177.945 -177.95 -177.955 -177.96 -177.965 -177.97 -177.975 -177.98 -177.985 -177.99 -177.995 -178 -178.005 -178.01 -178.015 -178.02 -178.025 -178.03 -178.035 -178.04 -178.045 -178.05 -178.055 -178.06 -178.065 -178.07 -178.075 -178.08 -178.085 -178.09 -178.095 -178.1 -178.105 -178.11 -178.115 -178.12 -178.125 -178.13 -178.135 -178.14 -178.145 -178.15 -178.155 -178.16 -178.165 -178.17 -178.175 -178.18 -178.185 -178.19 -178.195 -178.2 -178.205 -178.21 -178.215 -178.22 -178.225 -178.23 -178.235 -178.24 -178.245 -178.25 -178.255 -178.26 -178.265 -178.27 -178.275 -178.28 -178.285 -178.29 -178.295 -178.3 -178.305 -178.31 -178.315 -178.32 -178.325 -178.33 -178.335 -178.34 -178.345 -178.35 -178.355 -178.36 -178.365 -178.37 -178.375 -178.38 -178.385 -178.39 -178.395 -178.4 -178.405 -178.41 -178.415 -178.42 -178.425 -178.43 -178.435 -178.44 -178.445 -178.45 -178.455 -178.46 -178.465 -178.47 -178.475 -178.48 -178.485 -178.49 -178.495 -178.5 -178.505 -178.51 -178.515 -178.52 -178.525 -178.53 -178.535 -178.54 -178.545 -178.55 -178.555 -178.56 -178.565 -178.57 -178.575 -178.58 -178.585 -178.59 -178.595 -178.6 -178.605 -178.61 -178.615 -178.62 -178.625 -178.63 -178.635 -178.64 -178.645 -178.65 -178.655 -178.66 -178.665 -178.67 -178.675 -178.68 -178.685 -178.69 -178.695 -178.7 -178.705 -178.71 -178.715 -178.72 -178.725 -178.73 -178.735 -178.74 -178.745 -178.75 -178.755 -178.76 -178.765 -178.77 -178.775 -178.78 -178.785 -178.79 -178.795 -178.8 -178.805 -178.81 -178.815 -178.82 -178.825 -178.83 -178.835 -178.84 -178.845 -178.85 -178.855 -178.86 -178.865 -178.87 -178.875 -178.88 -178.885 -178.89 -178.895 -178.9 -178.905 -178.91 -178.915 -178.92 -178.925 -178.93 -178.935 -178.94 -178.945 -178.95 -178.955 -178.96 -178.965 -178.97 -178.975 -178.98 -178.985 -178.99 -178.995 -179 -179.005 -179.01 -179.015 -179.02 -179.025 -179.03 -179.035 -179.04 -179.045 -179.05 -179.055 -179.06 -179.065 -179.07 -179.075 -179.08 -179.085 -179.09 -179.095 -179.1 -179.105 -179.11 -179.115 -179.12 -179.125 -179.13 -179.135 -179.14 -179.145 -179.15 -179.155 -179.16 -179.165 -179.17 -179.175 -179.18 -179.185 -179.19 -179.195 -179.2 -179.205 -179.21 -179.215 -179.22 -179.225 -179.23 -179.235 -179.24 -179.245 -179.25 -179.255 -179.26 -179.265 -179.27 -179.275 -179.28 -179.285 -179.29 -179.295 -179.3 -179.305 -179.31 -179.315 -179.32 -179.325 -179.33 -179.335 -179.34 -179.345 -179.35 -179.355 -179.36 -179.365 -179.37 -179.375 -179.38 -179.385 -179.39 -179.395 -179.4 -179.405 -179.41 -179.415 -179.42 -179.425 -179.43 -179.435 -179.44 -179.445 -179.45 -179.455 -179.46 -179.465 -179.47 -179.475 -179.48 -179.485 -179.49 -179.495 -179.5 -179.505 -179.51 -179.515 -179.52 -179.525 -179.53 -179.535 -179.54 -179.545 -179.55 -179.555 -179.56 -179.565 -179.57 -179.575 -179.58 -179.585 -179.59 -179.595 -179.6 -179.605 -179.61 -179.615 -179.62 -179.625 -179.63 -179.635 -179.64 -179.645 -179.65 -179.655 -179.66 -179.665 -179.67 -179.675 -179.68 -179.685 -179.69 -179.695 -179.7 -179.705 -179.71 -179.715 -179.72 -179.725 -179.73 -179.735 -179.74 -179.745 -179.75 -179.755 -179.76 -179.765 -179.77 -179.775 -179.78 -179.785 -179.79 -179.795 -179.8 -179.805 -179.81 -179.815 -179.82 -179.825 -179.83 -179.835 -179.84 -179.845 -179.85 -179.855 -179.86 -179.865 -179.87 -179.875 -179.88 -179.885 -179.89 -179.895 -179.9 -179.905 -179.91 -179.915 -179.92 -179.925 -179.93 -179.935 -179.94 -179.945 -179.95 -179.955 -179.96 -179.965 -179.97 -179.975 -179.98 -179.985 -179.99 -179.995 -180 -180.005 -180.01 -180.015 -180.02 -180.025 -180.03 -180.035 -180.04 -180.045 -180.05 -180.055 -180.06 -180.065 -180.07 -180.075 -180.08 -180.085 -180.09 -180.095 -180.1 -180.105 -180.11 -180.115 -180.12 -180.125 -180.13 -180.135 -180.14 -180.145 -180.15 -180.155 -180.16 -180.165 -180.17 -180.175 -180.18 -180.185 -180.19 -180.195 -180.2 -180.205 -180.21 -180.215 -180.22 -180.225 -180.23 -180.235 -180.24 -180.245 -180.25 -180.255 -180.26 -180.265 -180.27 -180.275 -180.28 -180.285 -180.29 -180.295 -180.3 -180.305 -180.31 -180.315 -180.32 -180.325 -180.33 -180.335 -180.34 -180.345 -180.35 -180.355 -180.36 -180.365 -180.37 -180.375 -180.38 -180.385 -180.39 -180.395 -180.4 -180.405 -180.41 -180.415 -180.42 -180.425 -180.43 -180.435 -180.44 -180.445 -180.45 -180.455 -180.46 -180.465 -180.47 -180.475 -180.48 -180.485 -180.49 -180.495 -180.5 -180.505 -180.51 -180.515 -180.52 -180.525 -180.53 -180.535 -180.54 -180.545 -180.55 -180.555 -180.56 -180.565 -180.57 -180.575 -180.58 -180.585 -180.59 -180.595 -180.6 -180.605 -180.61 -180.615 -180.62 -180.625 -180.63 -180.635 -180.64 -180.645 -180.65 -180.655 -180.66 -180.665 -180.67 -180.675 -180.68 -180.685 -180.69 -180.695 -180.7 -180.705 -180.71 -180.715 -180.72 -180.725 -180.73 -180.735 -180.74 -180.745 -180.75 -180.755 -180.76 -180.765 -180.77 -180.775 -180.78 -180.785 -180.79 -180.795 -180.8 -180.805 -180.81 -180.815 -180.82 -180.825 -180.83 -180.835 -180.84 -180.845 -180.85 -180.855 -180.86 -180.865 -180.87 -180.875 -180.88 -180.885 -180.89 -180.895 -180.9 -180.905 -180.91 -180.915 -180.92 -180.925 -180.93 -180.935 -180.94 -180.945 -180.95 -180.955 -180.96 -180.965 -180.97 -180.975 -180.98 -180.985 -180.99 -180.995 -181 -181.005 -181.01 -181.015 -181.02 -181.025 -181.03 -181.035 -181.04 -181.045 -181.05 -181.055 -181.06 -181.065 -181.07 -181.075 -181.08 -181.085 -181.09 -181.095 -181.1 -181.105 -181.11 -181.115 -181.12 -181.125 -181.13 -181.135 -181.14 -181.145 -181.15 -181.155 -181.16 -181.165 -181.17 -181.175 -181.18 -181.185 -181.19 -181.195 -181.2 -181.205 -181.21 -181.215 -181.22 -181.225 -181.23 -181.235 -181.24 -181.245 -181.25 -181.255 -181.26 -181.265 -181.27 -181.275 -181.28 -181.285 -181.29 -181.295 -181.3 -181.305 -181.31 -181.315 -181.32 -181.325 -181.33 -181.335 -181.34 -181.345 -181.35 -181.355 -181.36 -181.365 -181.37 -181.375 -181.38 -181.385 -181.39 -181.395 -181.4 -181.405 -181.41 -181.415 -181.42 -181.425 -181.43 -181.435 -181.44 -181.445 -181.45 -181.455 -181.46 -181.465 -181.47 -181.475 -181.48 -181.485 -181.49 -181.495 -181.5 -181.505 -181.51 -181.515 -181.52 -181.525 -181.53 -181.535 -181.54 -181.545 -181.55 -181.555 -181.56 -181.565 -181.57 -181.575 -181.58 -181.585 -181.59 -181.595 -181.6 -181.605 -181.61 -181.615 -181.62 -181.625 -181.63 -181.635 -181.64 -181.645 -181.65 -181.655 -181.66 -181.665 -181.67 -181.675 -181.68 -181.685 -181.69 -181.695 -181.7 -181.705 -181.71 -181.715 -181.72 -181.725 -181.73 -181.735 -181.74 -181.745 -181.75 -181.755 -181.76 -181.765 -181.77 -181.775 -181.78 -181.785 -181.79 -181.795 -181.8 -181.805 -181.81 -181.815 -181.82 -181.825 -181.83 -181.835 -181.84 -181.845 -181.85 -181.855 -181.86 -181.865 -181.87 -181.875 -181.88 -181.885 -181.89 -181.895 -181.9 -181.905 -181.91 -181.915 -181.92 -181.925 -181.93 -181.935 -181.94 -181.945 -181.95 -181.955 -181.96 -181.965 -181.97 -181.975 -181.98 -181.985 -181.99 -181.995 -182 -182.005 -182.01 -182.015 -182.02 -182.025 -182.03 -182.035 -182.04 -182.045 -182.05 -182.055 -182.06 -182.065 -182.07 -182.075 -182.08 -182.085 -182.09 -182.095 -182.1 -182.105 -182.11 -182.115 -182.12 -182.125 -182.13 -182.135 -182.14 -182.145 -182.15 -182.155 -182.16 -182.165 -182.17 -182.175 -182.18 -182.185 -182.19 -182.195 -182.2 -182.205 -182.21 -182.215 -182.22 -182.225 -182.23 -182.235 -182.24 -182.245 -182.25 -182.255 -182.26 -182.265 -182.27 -182.275 -182.28 -182.285 -182.29 -182.295 -182.3 -182.305 -182.31 -182.315 -182.32 -182.325 -182.33 -182.335 -182.34 -182.345 -182.35 -182.355 -182.36 -182.365 -182.37 -182.375 -182.38 -182.385 -182.39 -182.395 -182.4 -182.405 -182.41 -182.415 -182.42 -182.425 -182.43 -182.435 -182.44 -182.445 -182.45 -182.455 -182.46 -182.465 -182.47 -182.475 -182.48 -182.485 -182.49 -182.495 -182.5 -182.505 -182.51 -182.515 -182.52 -182.525 -182.53 -182.535 -182.54 -182.545 -182.55 -182.555 -182.56 -182.565 -182.57 -182.575 -182.58 -182.585 -182.59 -182.595 -182.6 -182.605 -182.61 -182.615 -182.62 -182.625 -182.63 -182.635 -182.64 -182.645 -182.65 -182.655 -182.66 -182.665 -182.67 -182.675 -182.68 -182.685 -182.69 -182.695 -182.7 -182.705 -182.71 -182.715 -182.72 -182.725 -182.73 -182.735 -182.74 -182.745 -182.75 -182.755 -182.76 -182.765 -182.77 -182.775 -182.78 -182.785 -182.79 -182.795 -182.8 -182.805 -182.81 -182.815 -182.82 -182.825 -182.83 -182.835 -182.84 -182.845 -182.85 -182.855 -182.86 -182.865 -182.87 -182.875 -182.88 -182.885 -182.89 -182.895 -182.9 -182.905 -182.91 -182.915 -182.92 -182.925 -182.93 -182.935 -182.94 -182.945 -182.95 -182.955 -182.96 -182.965 -182.97 -182.975 -182.98 -182.985 -182.99 -182.995 -183 -183.005 -183.01 -183.015 -183.02 -183.025 -183.03 -183.035 -183.04 -183.045 -183.05 -183.055 -183.06 -183.065 -183.07 -183.075 -183.08 -183.085 -183.09 -183.095 -183.1 -183.105 -183.11 -183.115 -183.12 -183.125 -183.13 -183.135 -183.14 -183.145 -183.15 -183.155 -183.16 -183.165 -183.17 -183.175 -183.18 -183.185 -183.19 -183.195 -183.2 -183.205 -183.21 -183.215 -183.22 -183.225 -183.23 -183.235 -183.24 -183.245 -183.25 -183.255 -183.26 -183.265 -183.27 -183.275 -183.28 -183.285 -183.29 -183.295 -183.3 -183.305 -183.31 -183.315 -183.32 -183.325 -183.33 -183.335 -183.34 -183.345 -183.35 -183.355 -183.36 -183.365 -183.37 -183.375 -183.38 -183.385 -183.39 -183.395 -183.4 -183.405 -183.41 -183.415 -183.42 -183.425 -183.43 -183.435 -183.44 -183.445 -183.45 -183.455 -183.46 -183.465 -183.47 -183.475 -183.48 -183.485 -183.49 -183.495 -183.5 -183.505 -183.51 -183.515 -183.52 -183.525 -183.53 -183.535 -183.54 -183.545 -183.55 -183.555 -183.56 -183.565 -183.57 -183.575 -183.58 -183.585 -183.59 -183.595 -183.6 -183.605 -183.61 -183.615 -183.62 -183.625 -183.63 -183.635 -183.64 -183.645 -183.65 -183.655 -183.66 -183.665 -183.67 -183.675 -183.68 -183.685 -183.69 -183.695 -183.7 -183.705 -183.71 -183.715 -183.72 -183.725 -183.73 -183.735 -183.74 -183.745 -183.75 -183.755 -183.76 -183.765 -183.77 -183.775 -183.78 -183.785 -183.79 -183.795 -183.8 -183.805 -183.81 -183.815 -183.82 -183.825 -183.83 -183.835 -183.84 -183.845 -183.85 -183.855 -183.86 -183.865 -183.87 -183.875 -183.88 -183.885 -183.89 -183.895 -183.9 -183.905 -183.91 -183.915 -183.92 -183.925 -183.93 -183.935 -183.94 -183.945 -183.95 -183.955 -183.96 -183.965 -183.97 -183.975 -183.98 -183.985 -183.99 -183.995 -184 -184.005 -184.01 -184.015 -184.02 -184.025 -184.03 -184.035 -184.04 -184.045 -184.05 -184.055 -184.06 -184.065 -184.07 -184.075 -184.08 -184.085 -184.09 -184.095 -184.1 -184.105 -184.11 -184.115 -184.12 -184.125 -184.13 -184.135 -184.14 -184.145 -184.15 -184.155 -184.16 -184.165 -184.17 -184.175 -184.18 -184.185 -184.19 -184.195 -184.2 -184.205 -184.21 -184.215 -184.22 -184.225 -184.23 -184.235 -184.24 -184.245 -184.25 -184.255 -184.26 -184.265 -184.27 -184.275 -184.28 -184.285 -184.29 -184.295 -184.3 -184.305 -184.31 -184.315 -184.32 -184.325 -184.33 -184.335 -184.34 -184.345 -184.35 -184.355 -184.36 -184.365 -184.37 -184.375 -184.38 -184.385 -184.39 -184.395 -184.4 -184.405 -184.41 -184.415 -184.42 -184.425 -184.43 -184.435 -184.44 -184.445 -184.45 -184.455 -184.46 -184.465 -184.47 -184.475 -184.48 -184.485 -184.49 -184.495 -184.5 -184.505 -184.51 -184.515 -184.52 -184.525 -184.53 -184.535 -184.54 -184.545 -184.55 -184.555 -184.56 -184.565 -184.57 -184.575 -184.58 -184.585 -184.59 -184.595 -184.6 -184.605 -184.61 -184.615 -184.62 -184.625 -184.63 -184.635 -184.64 -184.645 -184.65 -184.655 -184.66 -184.665 -184.67 -184.675 -184.68 -184.685 -184.69 -184.695 -184.7 -184.705 -184.71 -184.715 -184.72 -184.725 -184.73 -184.735 -184.74 -184.745 -184.75 -184.755 -184.76 -184.765 -184.77 -184.775 -184.78 -184.785 -184.79 -184.795 -184.8 -184.805 -184.81 -184.815 -184.82 -184.825 -184.83 -184.835 -184.84 -184.845 -184.85 -184.855 -184.86 -184.865 -184.87 -184.875 -184.88 -184.885 -184.89 -184.895 -184.9 -184.905 -184.91 -184.915 -184.92 -184.925 -184.93 -184.935 -184.94 -184.945 -184.95 -184.955 -184.96 -184.965 -184.97 -184.975 -184.98 -184.985 -184.99 -184.995 -185 -185.005 -185.01 -185.015 -185.02 -185.025 -185.03 -185.035 -185.04 -185.045 -185.05 -185.055 -185.06 -185.065 -185.07 -185.075 -185.08 -185.085 -185.09 -185.095 -185.1 -185.105 -185.11 -185.115 -185.12 -185.125 -185.13 -185.135 -185.14 -185.145 -185.15 -185.155 -185.16 -185.165 -185.17 -185.175 -185.18 -185.185 -185.19 -185.195 -185.2 -185.205 -185.21 -185.215 -185.22 -185.225 -185.23 -185.235 -185.24 -185.245 -185.25 -185.255 -185.26 -185.265 -185.27 -185.275 -185.28 -185.285 -185.29 -185.295 -185.3 -185.305 -185.31 -185.315 -185.32 -185.325 -185.33 -185.335 -185.34 -185.345 -185.35 -185.355 -185.36 -185.365 -185.37 -185.375 -185.38 -185.385 -185.39 -185.395 -185.4 -185.405 -185.41 -185.415 -185.42 -185.425 -185.43 -185.435 -185.44 -185.445 -185.45 -185.455 -185.46 -185.465 -185.47 -185.475 -185.48 -185.485 -185.49 -185.495 -185.5 -185.505 -185.51 -185.515 -185.52 -185.525 -185.53 -185.535 -185.54 -185.545 -185.55 -185.555 -185.56 -185.565 -185.57 -185.575 -185.58 -185.585 -185.59 -185.595 -185.6 -185.605 -185.61 -185.615 -185.62 -185.625 -185.63 -185.635 -185.64 -185.645 -185.65 -185.655 -185.66 -185.665 -185.67 -185.675 -185.68 -185.685 -185.69 -185.695 -185.7 -185.705 -185.71 -185.715 -185.72 -185.725 -185.73 -185.735 -185.74 -185.745 -185.75 -185.755 -185.76 -185.765 -185.77 -185.775 -185.78 -185.785 -185.79 -185.795 -185.8 -185.805 -185.81 -185.815 -185.82 -185.825 -185.83 -185.835 -185.84 -185.845 -185.85 -185.855 -185.86 -185.865 -185.87 -185.875 -185.88 -185.885 -185.89 -185.895 -185.9 -185.905 -185.91 -185.915 -185.92 -185.925 -185.93 -185.935 -185.94 -185.945 -185.95 -185.955 -185.96 -185.965 -185.97 -185.975 -185.98 -185.985 -185.99 -185.995 -186 -186.005 -186.01 -186.015 -186.02 -186.025 -186.03 -186.035 -186.04 -186.045 -186.05 -186.055 -186.06 -186.065 -186.07 -186.075 -186.08 -186.085 -186.09 -186.095 -186.1 -186.105 -186.11 -186.115 -186.12 -186.125 -186.13 -186.135 -186.14 -186.145 -186.15 -186.155 -186.16 -186.165 -186.17 -186.175 -186.18 -186.185 -186.19 -186.195 -186.2 -186.205 -186.21 -186.215 -186.22 -186.225 -186.23 -186.235 -186.24 -186.245 -186.25 -186.255 -186.26 -186.265 -186.27 -186.275 -186.28 -186.285 -186.29 -186.295 -186.3 -186.305 -186.31 -186.315 -186.32 -186.325 -186.33 -186.335 -186.34 -186.345 -186.35 -186.355 -186.36 -186.365 -186.37 -186.375 -186.38 -186.385 -186.39 -186.395 -186.4 -186.405 -186.41 -186.415 -186.42 -186.425 -186.43 -186.435 -186.44 -186.445 -186.45 -186.455 -186.46 -186.465 -186.47 -186.475 -186.48 -186.485 -186.49 -186.495 -186.5 -186.505 -186.51 -186.515 -186.52 -186.525 -186.53 -186.535 -186.54 -186.545 -186.55 -186.555 -186.56 -186.565 -186.57 -186.575 -186.58 -186.585 -186.59 -186.595 -186.6 -186.605 -186.61 -186.615 -186.62 -186.625 -186.63 -186.635 -186.64 -186.645 -186.65 -186.655 -186.66 -186.665 -186.67 -186.675 -186.68 -186.685 -186.69 -186.695 -186.7 -186.705 -186.71 -186.715 -186.72 -186.725 -186.73 -186.735 -186.74 -186.745 -186.75 -186.755 -186.76 -186.765 -186.77 -186.775 -186.78 -186.785 -186.79 -186.795 -186.8 -186.805 -186.81 -186.815 -186.82 -186.825 -186.83 -186.835 -186.84 -186.845 -186.85 -186.855 -186.86 -186.865 -186.87 -186.875 -186.88 -186.885 -186.89 -186.895 -186.9 -186.905 -186.91 -186.915 -186.92 -186.925 -186.93 -186.935 -186.94 -186.945 -186.95 -186.955 -186.96 -186.965 -186.97 -186.975 -186.98 -186.985 -186.99 -186.995 -187 -187.005 -187.01 -187.015 -187.02 -187.025 -187.03 -187.035 -187.04 -187.045 -187.05 -187.055 -187.06 -187.065 -187.07 -187.075 -187.08 -187.085 -187.09 -187.095 -187.1 -187.105 -187.11 -187.115 -187.12 -187.125 -187.13 -187.135 -187.14 -187.145 -187.15 -187.155 -187.16 -187.165 -187.17 -187.175 -187.18 -187.185 -187.19 -187.195 -187.2 -187.205 -187.21 -187.215 -187.22 -187.225 -187.23 -187.235 -187.24 -187.245 -187.25 -187.255 -187.26 -187.265 -187.27 -187.275 -187.28 -187.285 -187.29 -187.295 -187.3 -187.305 -187.31 -187.315 -187.32 -187.325 -187.33 -187.335 -187.34 -187.345 -187.35 -187.355 -187.36 -187.365 -187.37 -187.375 -187.38 -187.385 -187.39 -187.395 -187.4 -187.405 -187.41 -187.415 -187.42 -187.425 -187.43 -187.435 -187.44 -187.445 -187.45 -187.455 -187.46 -187.465 -187.47 -187.475 -187.48 -187.485 -187.49 -187.495 -187.5 -187.505 -187.51 -187.515 -187.52 -187.525 -187.53 -187.535 -187.54 -187.545 -187.55 -187.555 -187.56 -187.565 -187.57 -187.575 -187.58 -187.585 -187.59 -187.595 -187.6 -187.605 -187.61 -187.615 -187.62 -187.625 -187.63 -187.635 -187.64 -187.645 -187.65 -187.655 -187.66 -187.665 -187.67 -187.675 -187.68 -187.685 -187.69 -187.695 -187.7 -187.705 -187.71 -187.715 -187.72 -187.725 -187.73 -187.735 -187.74 -187.745 -187.75 -187.755 -187.76 -187.765 -187.77 -187.775 -187.78 -187.785 -187.79 -187.795 -187.8 -187.805 -187.81 -187.815 -187.82 -187.825 -187.83 -187.835 -187.84 -187.845 -187.85 -187.855 -187.86 -187.865 -187.87 -187.875 -187.88 -187.885 -187.89 -187.895 -187.9 -187.905 -187.91 -187.915 -187.92 -187.925 -187.93 -187.935 -187.94 -187.945 -187.95 -187.955 -187.96 -187.965 -187.97 -187.975 -187.98 -187.985 -187.99 -187.995 -188 -188.005 -188.01 -188.015 -188.02 -188.025 -188.03 -188.035 -188.04 -188.045 -188.05 -188.055 -188.06 -188.065 -188.07 -188.075 -188.08 -188.085 -188.09 -188.095 -188.1 -188.105 -188.11 -188.115 -188.12 -188.125 -188.13 -188.135 -188.14 -188.145 -188.15 -188.155 -188.16 -188.165 -188.17 -188.175 -188.18 -188.185 -188.19 -188.195 -188.2 -188.205 -188.21 -188.215 -188.22 -188.225 -188.23 -188.235 -188.24 -188.245 -188.25 -188.255 -188.26 -188.265 -188.27 -188.275 -188.28 -188.285 -188.29 -188.295 -188.3 -188.305 -188.31 -188.315 -188.32 -188.325 -188.33 -188.335 -188.34 -188.345 -188.35 -188.355 -188.36 -188.365 -188.37 -188.375 -188.38 -188.385 -188.39 -188.395 -188.4 -188.405 -188.41 -188.415 -188.42 -188.425 -188.43 -188.435 -188.44 -188.445 -188.45 -188.455 -188.46 -188.465 -188.47 -188.475 -188.48 -188.485 -188.49 -188.495 -188.5 -188.505 -188.51 -188.515 -188.52 -188.525 -188.53 -188.535 -188.54 -188.545 -188.55 -188.555 -188.56 -188.565 -188.57 -188.575 -188.58 -188.585 -188.59 -188.595 -188.6 -188.605 -188.61 -188.615 -188.62 -188.625 -188.63 -188.635 -188.64 -188.645 -188.65 -188.655 -188.66 -188.665 -188.67 -188.675 -188.68 -188.685 -188.69 -188.695 -188.7 -188.705 -188.71 -188.715 -188.72 -188.725 -188.73 -188.735 -188.74 -188.745 -188.75 -188.755 -188.76 -188.765 -188.77 -188.775 -188.78 -188.785 -188.79 -188.795 -188.8 -188.805 -188.81 -188.815 -188.82 -188.825 -188.83 -188.835 -188.84 -188.845 -188.85 -188.855 -188.86 -188.865 -188.87 -188.875 -188.88 -188.885 -188.89 -188.895 -188.9 -188.905 -188.91 -188.915 -188.92 -188.925 -188.93 -188.935 -188.94 -188.945 -188.95 -188.955 -188.96 -188.965 -188.97 -188.975 -188.98 -188.985 -188.99 -188.995 -189 -189.005 -189.01 -189.015 -189.02 -189.025 -189.03 -189.035 -189.04 -189.045 -189.05 -189.055 -189.06 -189.065 -189.07 -189.075 -189.08 -189.085 -189.09 -189.095 -189.1 -189.105 -189.11 -189.115 -189.12 -189.125 -189.13 -189.135 -189.14 -189.145 -189.15 -189.155 -189.16 -189.165 -189.17 -189.175 -189.18 -189.185 -189.19 -189.195 -189.2 -189.205 -189.21 -189.215 -189.22 -189.225 -189.23 -189.235 -189.24 -189.245 -189.25 -189.255 -189.26 -189.265 -189.27 -189.275 -189.28 -189.285 -189.29 -189.295 -189.3 -189.305 -189.31 -189.315 -189.32 -189.325 -189.33 -189.335 -189.34 -189.345 -189.35 -189.355 -189.36 -189.365 -189.37 -189.375 -189.38 -189.385 -189.39 -189.395 -189.4 -189.405 -189.41 -189.415 -189.42 -189.425 -189.43 -189.435 -189.44 -189.445 -189.45 -189.455 -189.46 -189.465 -189.47 -189.475 -189.48 -189.485 -189.49 -189.495 -189.5 -189.505 -189.51 -189.515 -189.52 -189.525 -189.53 -189.535 -189.54 -189.545 -189.55 -189.555 -189.56 -189.565 -189.57 -189.575 -189.58 -189.585 -189.59 -189.595 -189.6 -189.605 -189.61 -189.615 -189.62 -189.625 -189.63 -189.635 -189.64 -189.645 -189.65 -189.655 -189.66 -189.665 -189.67 -189.675 -189.68 -189.685 -189.69 -189.695 -189.7 -189.705 -189.71 -189.715 -189.72 -189.725 -189.73 -189.735 -189.74 -189.745 -189.75 -189.755 -189.76 -189.765 -189.77 -189.775 -189.78 -189.785 -189.79 -189.795 -189.8 -189.805 -189.81 -189.815 -189.82 -189.825 -189.83 -189.835 -189.84 -189.845 -189.85 -189.855 -189.86 -189.865 -189.87 -189.875 -189.88 -189.885 -189.89 -189.895 -189.9 -189.905 -189.91 -189.915 -189.92 -189.925 -189.93 -189.935 -189.94 -189.945 -189.95 -189.955 -189.96 -189.965 -189.97 -189.975 -189.98 -189.985 -189.99 -189.995 -190 -190.005 -190.01 -190.015 -190.02 -190.025 -190.03 -190.035 -190.04 -190.045 -190.05 -190.055 -190.06 -190.065 -190.07 -190.075 -190.08 -190.085 -190.09 -190.095 -190.1 -190.105 -190.11 -190.115 -190.12 -190.125 -190.13 -190.135 -190.14 -190.145 -190.15 -190.155 -190.16 -190.165 -190.17 -190.175 -190.18 -190.185 -190.19 -190.195 -190.2 -190.205 -190.21 -190.215 -190.22 -190.225 -190.23 -190.235 -190.24 -190.245 -190.25 -190.255 -190.26 -190.265 -190.27 -190.275 -190.28 -190.285 -190.29 -190.295 -190.3 -190.305 -190.31 -190.315 -190.32 -190.325 -190.33 -190.335 -190.34 -190.345 -190.35 -190.355 -190.36 -190.365 -190.37 -190.375 -190.38 -190.385 -190.39 -190.395 -190.4 -190.405 -190.41 -190.415 -190.42 -190.425 -190.43 -190.435 -190.44 -190.445 -190.45 -190.455 -190.46 -190.465 -190.47 -190.475 -190.48 -190.485 -190.49 -190.495 -190.5 -190.505 -190.51 -190.515 -190.52 -190.525 -190.53 -190.535 -190.54 -190.545 -190.55 -190.555 -190.56 -190.565 -190.57 -190.575 -190.58 -190.585 -190.59 -190.595 -190.6 -190.605 -190.61 -190.615 -190.62 -190.625 -190.63 -190.635 -190.64 -190.645 -190.65 -190.655 -190.66 -190.665 -190.67 -190.675 -190.68 -190.685 -190.69 -190.695 -190.7 -190.705 -190.71 -190.715 -190.72 -190.725 -190.73 -190.735 -190.74 -190.745 -190.75 -190.755 -190.76 -190.765 -190.77 -190.775 -190.78 -190.785 -190.79 -190.795 -190.8 -190.805 -190.81 -190.815 -190.82 -190.825 -190.83 -190.835 -190.84 -190.845 -190.85 -190.855 -190.86 -190.865 -190.87 -190.875 -190.88 -190.885 -190.89 -190.895 -190.9 -190.905 -190.91 -190.915 -190.92 -190.925 -190.93 -190.935 -190.94 -190.945 -190.95 -190.955 -190.96 -190.965 -190.97 -190.975 -190.98 -190.985 -190.99 -190.995 -191 -191.005 -191.01 -191.015 -191.02 -191.025 -191.03 -191.035 -191.04 -191.045 -191.05 -191.055 -191.06 -191.065 -191.07 -191.075 -191.08 -191.085 -191.09 -191.095 -191.1 -191.105 -191.11 -191.115 -191.12 -191.125 -191.13 -191.135 -191.14 -191.145 -191.15 -191.155 -191.16 -191.165 -191.17 -191.175 -191.18 -191.185 -191.19 -191.195 -191.2 -191.205 -191.21 -191.215 -191.22 -191.225 -191.23 -191.235 -191.24 -191.245 -191.25 -191.255 -191.26 -191.265 -191.27 -191.275 -191.28 -191.285 -191.29 -191.295 -191.3 -191.305 -191.31 -191.315 -191.32 -191.325 -191.33 -191.335 -191.34 -191.345 -191.35 -191.355 -191.36 -191.365 -191.37 -191.375 -191.38 -191.385 -191.39 -191.395 -191.4 -191.405 -191.41 -191.415 -191.42 -191.425 -191.43 -191.435 -191.44 -191.445 -191.45 -191.455 -191.46 -191.465 -191.47 -191.475 -191.48 -191.485 -191.49 -191.495 -191.5 -191.505 -191.51 -191.515 -191.52 -191.525 -191.53 -191.535 -191.54 -191.545 -191.55 -191.555 -191.56 -191.565 -191.57 -191.575 -191.58 -191.585 -191.59 -191.595 -191.6 -191.605 -191.61 -191.615 -191.62 -191.625 -191.63 -191.635 -191.64 -191.645 -191.65 -191.655 -191.66 -191.665 -191.67 -191.675 -191.68 -191.685 -191.69 -191.695 -191.7 -191.705 -191.71 -191.715 -191.72 -191.725 -191.73 -191.735 -191.74 -191.745 -191.75 -191.755 -191.76 -191.765 -191.77 -191.775 -191.78 -191.785 -191.79 -191.795 -191.8 -191.805 -191.81 -191.815 -191.82 -191.825 -191.83 -191.835 -191.84 -191.845 -191.85 -191.855 -191.86 -191.865 -191.87 -191.875 -191.88 -191.885 -191.89 -191.895 -191.9 -191.905 -191.91 -191.915 -191.92 -191.925 -191.93 -191.935 -191.94 -191.945 -191.95 -191.955 -191.96 -191.965 -191.97 -191.975 -191.98 -191.985 -191.99 -191.995 -192 -192.005 -192.01 -192.015 -192.02 -192.025 -192.03 -192.035 -192.04 -192.045 -192.05 -192.055 -192.06 -192.065 -192.07 -192.075 -192.08 -192.085 -192.09 -192.095 -192.1 -192.105 -192.11 -192.115 -192.12 -192.125 -192.13 -192.135 -192.14 -192.145 -192.15 -192.155 -192.16 -192.165 -192.17 -192.175 -192.18 -192.185 -192.19 -192.195 -192.2 -192.205 -192.21 -192.215 -192.22 -192.225 -192.23 -192.235 -192.24 -192.245 -192.25 -192.255 -192.26 -192.265 -192.27 -192.275 -192.28 -192.285 -192.29 -192.295 -192.3 -192.305 -192.31 -192.315 -192.32 -192.325 -192.33 -192.335 -192.34 -192.345 -192.35 -192.355 -192.36 -192.365 -192.37 -192.375 -192.38 -192.385 -192.39 -192.395 -192.4 -192.405 -192.41 -192.415 -192.42 -192.425 -192.43 -192.435 -192.44 -192.445 -192.45 -192.455 -192.46 -192.465 -192.47 -192.475 -192.48 -192.485 -192.49 -192.495 -192.5 -192.505 -192.51 -192.515 -192.52 -192.525 -192.53 -192.535 -192.54 -192.545 -192.55 -192.555 -192.56 -192.565 -192.57 -192.575 -192.58 -192.585 -192.59 -192.595 -192.6 -192.605 -192.61 -192.615 -192.62 -192.625 -192.63 -192.635 -192.64 -192.645 -192.65 -192.655 -192.66 -192.665 -192.67 -192.675 -192.68 -192.685 -192.69 -192.695 -192.7 -192.705 -192.71 -192.715 -192.72 -192.725 -192.73 -192.735 -192.74 -192.745 -192.75 -192.755 -192.76 -192.765 -192.77 -192.775 -192.78 -192.785 -192.79 -192.795 -192.8 -192.805 -192.81 -192.815 -192.82 -192.825 -192.83 -192.835 -192.84 -192.845 -192.85 -192.855 -192.86 -192.865 -192.87 -192.875 -192.88 -192.885 -192.89 -192.895 -192.9 -192.905 -192.91 -192.915 -192.92 -192.925 -192.93 -192.935 -192.94 -192.945 -192.95 -192.955 -192.96 -192.965 -192.97 -192.975 -192.98 -192.985 -192.99 -192.995 -193 -193.005 -193.01 -193.015 -193.02 -193.025 -193.03 -193.035 -193.04 -193.045 -193.05 -193.055 -193.06 -193.065 -193.07 -193.075 -193.08 -193.085 -193.09 -193.095 -193.1 -193.105 -193.11 -193.115 -193.12 -193.125 -193.13 -193.135 -193.14 -193.145 -193.15 -193.155 -193.16 -193.165 -193.17 -193.175 -193.18 -193.185 -193.19 -193.195 -193.2 -193.205 -193.21 -193.215 -193.22 -193.225 -193.23 -193.235 -193.24 -193.245 -193.25 -193.255 -193.26 -193.265 -193.27 -193.275 -193.28 -193.285 -193.29 -193.295 -193.3 -193.305 -193.31 -193.315 -193.32 -193.325 -193.33 -193.335 -193.34 -193.345 -193.35 -193.355 -193.36 -193.365 -193.37 -193.375 -193.38 -193.385 -193.39 -193.395 -193.4 -193.405 -193.41 -193.415 -193.42 -193.425 -193.43 -193.435 -193.44 -193.445 -193.45 -193.455 -193.46 -193.465 -193.47 -193.475 -193.48 -193.485 -193.49 -193.495 -193.5 -193.505 -193.51 -193.515 -193.52 -193.525 -193.53 -193.535 -193.54 -193.545 -193.55 -193.555 -193.56 -193.565 -193.57 -193.575 -193.58 -193.585 -193.59 -193.595 -193.6 -193.605 -193.61 -193.615 -193.62 -193.625 -193.63 -193.635 -193.64 -193.645 -193.65 -193.655 -193.66 -193.665 -193.67 -193.675 -193.68 -193.685 -193.69 -193.695 -193.7 -193.705 -193.71 -193.715 -193.72 -193.725 -193.73 -193.735 -193.74 -193.745 -193.75 -193.755 -193.76 -193.765 -193.77 -193.775 -193.78 -193.785 -193.79 -193.795 -193.8 -193.805 -193.81 -193.815 -193.82 -193.825 -193.83 -193.835 -193.84 -193.845 -193.85 -193.855 -193.86 -193.865 -193.87 -193.875 -193.88 -193.885 -193.89 -193.895 -193.9 -193.905 -193.91 -193.915 -193.92 -193.925 -193.93 -193.935 -193.94 -193.945 -193.95 -193.955 -193.96 -193.965 -193.97 -193.975 -193.98 -193.985 -193.99 -193.995 -194 -194.005 -194.01 -194.015 -194.02 -194.025 -194.03 -194.035 -194.04 -194.045 -194.05 -194.055 -194.06 -194.065 -194.07 -194.075 -194.08 -194.085 -194.09 -194.095 -194.1 -194.105 -194.11 -194.115 -194.12 -194.125 -194.13 -194.135 -194.14 -194.145 -194.15 -194.155 -194.16 -194.165 -194.17 -194.175 -194.18 -194.185 -194.19 -194.195 -194.2 -194.205 -194.21 -194.215 -194.22 -194.225 -194.23 -194.235 -194.24 -194.245 -194.25 -194.255 -194.26 -194.265 -194.27 -194.275 -194.28 -194.285 -194.29 -194.295 -194.3 -194.305 -194.31 -194.315 -194.32 -194.325 -194.33 -194.335 -194.34 -194.345 -194.35 -194.355 -194.36 -194.365 -194.37 -194.375 -194.38 -194.385 -194.39 -194.395 -194.4 -194.405 -194.41 -194.415 -194.42 -194.425 -194.43 -194.435 -194.44 -194.445 -194.45 -194.455 -194.46 -194.465 -194.47 -194.475 -194.48 -194.485 -194.49 -194.495 -194.5 -194.505 -194.51 -194.515 -194.52 -194.525 -194.53 -194.535 -194.54 -194.545 -194.55 -194.555 -194.56 -194.565 -194.57 -194.575 -194.58 -194.585 -194.59 -194.595 -194.6 -194.605 -194.61 -194.615 -194.62 -194.625 -194.63 -194.635 -194.64 -194.645 -194.65 -194.655 -194.66 -194.665 -194.67 -194.675 -194.68 -194.685 -194.69 -194.695 -194.7 -194.705 -194.71 -194.715 -194.72 -194.725 -194.73 -194.735 -194.74 -194.745 -194.75 -194.755 -194.76 -194.765 -194.77 -194.775 -194.78 -194.785 -194.79 -194.795 -194.8 -194.805 -194.81 -194.815 -194.82 -194.825 -194.83 -194.835 -194.84 -194.845 -194.85 -194.855 -194.86 -194.865 -194.87 -194.875 -194.88 -194.885 -194.89 -194.895 -194.9 -194.905 -194.91 -194.915 -194.92 -194.925 -194.93 -194.935 -194.94 -194.945 -194.95 -194.955 -194.96 -194.965 -194.97 -194.975 -194.98 -194.985 -194.99 -194.995 -195 -195.005 -195.01 -195.015 -195.02 -195.025 -195.03 -195.035 -195.04 -195.045 -195.05 -195.055 -195.06 -195.065 -195.07 -195.075 -195.08 -195.085 -195.09 -195.095 -195.1 -195.105 -195.11 -195.115 -195.12 -195.125 -195.13 -195.135 -195.14 -195.145 -195.15 -195.155 -195.16 -195.165 -195.17 -195.175 -195.18 -195.185 -195.19 -195.195 -195.2 -195.205 -195.21 -195.215 -195.22 -195.225 -195.23 -195.235 -195.24 -195.245 -195.25 -195.255 -195.26 -195.265 -195.27 -195.275 -195.28 -195.285 -195.29 -195.295 -195.3 -195.305 -195.31 -195.315 -195.32 -195.325 -195.33 -195.335 -195.34 -195.345 -195.35 -195.355 -195.36 -195.365 -195.37 -195.375 -195.38 -195.385 -195.39 -195.395 -195.4 -195.405 -195.41 -195.415 -195.42 -195.425 -195.43 -195.435 -195.44 -195.445 -195.45 -195.455 -195.46 -195.465 -195.47 -195.475 -195.48 -195.485 -195.49 -195.495 -195.5 -195.505 -195.51 -195.515 -195.52 -195.525 -195.53 -195.535 -195.54 -195.545 -195.55 -195.555 -195.56 -195.565 -195.57 -195.575 -195.58 -195.585 -195.59 -195.595 -195.6 -195.605 -195.61 -195.615 -195.62 -195.625 -195.63 -195.635 -195.64 -195.645 -195.65 -195.655 -195.66 -195.665 -195.67 -195.675 -195.68 -195.685 -195.69 -195.695 -195.7 -195.705 -195.71 -195.715 -195.72 -195.725 -195.73 -195.735 -195.74 -195.745 -195.75 -195.755 -195.76 -195.765 -195.77 -195.775 -195.78 -195.785 -195.79 -195.795 -195.8 -195.805 -195.81 -195.815 -195.82 -195.825 -195.83 -195.835 -195.84 -195.845 -195.85 -195.855 -195.86 -195.865 -195.87 -195.875 -195.88 -195.885 -195.89 -195.895 -195.9 -195.905 -195.91 -195.915 -195.92 -195.925 -195.93 -195.935 -195.94 -195.945 -195.95 -195.955 -195.96 -195.965 -195.97 -195.975 -195.98 -195.985 -195.99 -195.995 -196 -196.005 -196.01 -196.015 -196.02 -196.025 -196.03 -196.035 -196.04 -196.045 -196.05 -196.055 -196.06 -196.065 -196.07 -196.075 -196.08 -196.085 -196.09 -196.095 -196.1 -196.105 -196.11 -196.115 -196.12 -196.125 -196.13 -196.135 -196.14 -196.145 -196.15 -196.155 -196.16 -196.165 -196.17 -196.175 -196.18 -196.185 -196.19 -196.195 -196.2 -196.205 -196.21 -196.215 -196.22 -196.225 -196.23 -196.235 -196.24 -196.245 -196.25 -196.255 -196.26 -196.265 -196.27 -196.275 -196.28 -196.285 -196.29 -196.295 -196.3 -196.305 -196.31 -196.315 -196.32 -196.325 -196.33 -196.335 -196.34 -196.345 -196.35 -196.355 -196.36 -196.365 -196.37 -196.375 -196.38 -196.385 -196.39 -196.395 -196.4 -196.405 -196.41 -196.415 -196.42 -196.425 -196.43 -196.435 -196.44 -196.445 -196.45 -196.455 -196.46 -196.465 -196.47 -196.475 -196.48 -196.485 -196.49 -196.495 -196.5 -196.505 -196.51 -196.515 -196.52 -196.525 -196.53 -196.535 -196.54 -196.545 -196.55 -196.555 -196.56 -196.565 -196.57 -196.575 -196.58 -196.585 -196.59 -196.595 -196.6 -196.605 -196.61 -196.615 -196.62 -196.625 -196.63 -196.635 -196.64 -196.645 -196.65 -196.655 -196.66 -196.665 -196.67 -196.675 -196.68 -196.685 -196.69 -196.695 -196.7 -196.705 -196.71 -196.715 -196.72 -196.725 -196.73 -196.735 -196.74 -196.745 -196.75 -196.755 -196.76 -196.765 -196.77 -196.775 -196.78 -196.785 -196.79 -196.795 -196.8 -196.805 -196.81 -196.815 -196.82 -196.825 -196.83 -196.835 -196.84 -196.845 -196.85 -196.855 -196.86 -196.865 -196.87 -196.875 -196.88 -196.885 -196.89 -196.895 -196.9 -196.905 -196.91 -196.915 -196.92 -196.925 -196.93 -196.935 -196.94 -196.945 -196.95 -196.955 -196.96 -196.965 -196.97 -196.975 -196.98 -196.985 -196.99 -196.995 -197 -197.005 -197.01 -197.015 -197.02 -197.025 -197.03 -197.035 -197.04 -197.045 -197.05 -197.055 -197.06 -197.065 -197.07 -197.075 -197.08 -197.085 -197.09 -197.095 -197.1 -197.105 -197.11 -197.115 -197.12 -197.125 -197.13 -197.135 -197.14 -197.145 -197.15 -197.155 -197.16 -197.165 -197.17 -197.175 -197.18 -197.185 -197.19 -197.195 -197.2 -197.205 -197.21 -197.215 -197.22 -197.225 -197.23 -197.235 -197.24 -197.245 -197.25 -197.255 -197.26 -197.265 -197.27 -197.275 -197.28 -197.285 -197.29 -197.295 -197.3 -197.305 -197.31 -197.315 -197.32 -197.325 -197.33 -197.335 -197.34 -197.345 -197.35 -197.355 -197.36 -197.365 -197.37 -197.375 -197.38 -197.385 -197.39 -197.395 -197.4 -197.405 -197.41 -197.415 -197.42 -197.425 -197.43 -197.435 -197.44 -197.445 -197.45 -197.455 -197.46 -197.465 -197.47 -197.475 -197.48 -197.485 -197.49 -197.495 -197.5 -197.505 -197.51 -197.515 -197.52 -197.525 -197.53 -197.535 -197.54 -197.545 -197.55 -197.555 -197.56 -197.565 -197.57 -197.575 -197.58 -197.585 -197.59 -197.595 -197.6 -197.605 -197.61 -197.615 -197.62 -197.625 -197.63 -197.635 -197.64 -197.645 -197.65 -197.655 -197.66 -197.665 -197.67 -197.675 -197.68 -197.685 -197.69 -197.695 -197.7 -197.705 -197.71 -197.715 -197.72 -197.725 -197.73 -197.735 -197.74 -197.745 -197.75 -197.755 -197.76 -197.765 -197.77 -197.775 -197.78 -197.785 -197.79 -197.795 -197.8 -197.805 -197.81 -197.815 -197.82 -197.825 -197.83 -197.835 -197.84 -197.845 -197.85 -197.855 -197.86 -197.865 -197.87 -197.875 -197.88 -197.885 -197.89 -197.895 -197.9 -197.905 -197.91 -197.915 -197.92 -197.925 -197.93 -197.935 -197.94 -197.945 -197.95 -197.955 -197.96 -197.965 -197.97 -197.975 -197.98 -197.985 -197.99 -197.995 -198 -198.005 -198.01 -198.015 -198.02 -198.025 -198.03 -198.035 -198.04 -198.045 -198.05 -198.055 -198.06 -198.065 -198.07 -198.075 -198.08 -198.085 -198.09 -198.095 -198.1 -198.105 -198.11 -198.115 -198.12 -198.125 -198.13 -198.135 -198.14 -198.145 -198.15 -198.155 -198.16 -198.165 -198.17 -198.175 -198.18 -198.185 -198.19 -198.195 -198.2 -198.205 -198.21 -198.215 -198.22 -198.225 -198.23 -198.235 -198.24 -198.245 -198.25 -198.255 -198.26 -198.265 -198.27 -198.275 -198.28 -198.285 -198.29 -198.295 -198.3 -198.305 -198.31 -198.315 -198.32 -198.325 -198.33 -198.335 -198.34 -198.345 -198.35 -198.355 -198.36 -198.365 -198.37 -198.375 -198.38 -198.385 -198.39 -198.395 -198.4 -198.405 -198.41 -198.415 -198.42 -198.425 -198.43 -198.435 -198.44 -198.445 -198.45 -198.455 -198.46 -198.465 -198.47 -198.475 -198.48 -198.485 -198.49 -198.495 -198.5 -198.505 -198.51 -198.515 -198.52 -198.525 -198.53 -198.535 -198.54 -198.545 -198.55 -198.555 -198.56 -198.565 -198.57 -198.575 -198.58 -198.585 -198.59 -198.595 -198.6 -198.605 -198.61 -198.615 -198.62 -198.625 -198.63 -198.635 -198.64 -198.645 -198.65 -198.655 -198.66 -198.665 -198.67 -198.675 -198.68 -198.685 -198.69 -198.695 -198.7 -198.705 -198.71 -198.715 -198.72 -198.725 -198.73 -198.735 -198.74 -198.745 -198.75 -198.755 -198.76 -198.765 -198.77 -198.775 -198.78 -198.785 -198.79 -198.795 -198.8 -198.805 -198.81 -198.815 -198.82 -198.825 -198.83 -198.835 -198.84 -198.845 -198.85 -198.855 -198.86 -198.865 -198.87 -198.875 -198.88 -198.885 -198.89 -198.895 -198.9 -198.905 -198.91 -198.915 -198.92 -198.925 -198.93 -198.935 -198.94 -198.945 -198.95 -198.955 -198.96 -198.965 -198.97 -198.975 -198.98 -198.985 -198.99 -198.995 -199 -199.005 -199.01 -199.015 -199.02 -199.025 -199.03 -199.035 -199.04 -199.045 -199.05 -199.055 -199.06 -199.065 -199.07 -199.075 -199.08 -199.085 -199.09 -199.095 -199.1 -199.105 -199.11 -199.115 -199.12 -199.125 -199.13 -199.135 -199.14 -199.145 -199.15 -199.155 -199.16 -199.165 -199.17 -199.175 -199.18 -199.185 -199.19 -199.195 -199.2 -199.205 -199.21 -199.215 -199.22 -199.225 -199.23 -199.235 -199.24 -199.245 -199.25 -199.255 -199.26 -199.265 -199.27 -199.275 -199.28 -199.285 -199.29 -199.295 -199.3 -199.305 -199.31 -199.315 -199.32 -199.325 -199.33 -199.335 -199.34 -199.345 -199.35 -199.355 -199.36 -199.365 -199.37 -199.375 -199.38 -199.385 -199.39 -199.395 -199.4 -199.405 -199.41 -199.415 -199.42 -199.425 -199.43 -199.435 -199.44 -199.445 -199.45 -199.455 -199.46 -199.465 -199.47 -199.475 -199.48 -199.485 -199.49 -199.495 -199.5 -199.505 -199.51 -199.515 -199.52 -199.525 -199.53 -199.535 -199.54 -199.545 -199.55 -199.555 -199.56 -199.565 -199.57 -199.575 -199.58 -199.585 -199.59 -199.595 -199.6 -199.605 -199.61 -199.615 -199.62 -199.625 -199.63 -199.635 -199.64 -199.645 -199.65 -199.655 -199.66 -199.665 -199.67 -199.675 -199.68 -199.685 -199.69 -199.695 -199.7 -199.705 -199.71 -199.715 -199.72 -199.725 -199.73 -199.735 -199.74 -199.745 -199.75 -199.755 -199.76 -199.765 -199.77 -199.775 -199.78 -199.785 -199.79 -199.795 -199.8 -199.805 -199.81 -199.815 -199.82 -199.825 -199.83 -199.835 -199.84 -199.845 -199.85 -199.855 -199.86 -199.865 -199.87 -199.875 -199.88 -199.885 -199.89 -199.895 -199.9 -199.905 -199.91 -199.915 -199.92 -199.925 -199.93 -199.935 -199.94 -199.945 -199.95 -199.955 -199.96 -199.965 -199.97 -199.975 -199.98 -199.985 -199.99 -199.995 -200 -200.005 -200.01 -200.015 -200.02 -200.025 -200.03 -200.035 -200.04 -200.045 -200.05 -200.055 -200.06 -200.065 -200.07 -200.075 -200.08 -200.085 -200.09 -200.095 -200.1 -200.105 -200.11 -200.115 -200.12 -200.125 -200.13 -200.135 -200.14 -200.145 -200.15 -200.155 -200.16 -200.165 -200.17 -200.175 -200.18 -200.185 -200.19 -200.195 -200.2 -200.205 -200.21 -200.215 -200.22 -200.225 -200.23 -200.235 -200.24 -200.245 -200.25 -200.255 -200.26 -200.265 -200.27 -200.275 -200.28 -200.285 -200.29 -200.295 -200.3 -200.305 -200.31 -200.315 -200.32 -200.325 -200.33 -200.335 -200.34 -200.345 -200.35 -200.355 -200.36 -200.365 -200.37 -200.375 -200.38 -200.385 -200.39 -200.395 -200.4 -200.405 -200.41 -200.415 -200.42 -200.425 -200.43 -200.435 -200.44 -200.445 -200.45 -200.455 -200.46 -200.465 -200.47 -200.475 -200.48 -200.485 -200.49 -200.495 -200.5 -200.505 -200.51 -200.515 -200.52 -200.525 -200.53 -200.535 -200.54 -200.545 -200.55 -200.555 -200.56 -200.565 -200.57 -200.575 -200.58 -200.585 -200.59 -200.595 -200.6 -200.605 -200.61 -200.615 -200.62 -200.625 -200.63 -200.635 -200.64 -200.645 -200.65 -200.655 -200.66 -200.665 -200.67 -200.675 -200.68 -200.685 -200.69 -200.695 -200.7 -200.705 -200.71 -200.715 -200.72 -200.725 -200.73 -200.735 -200.74 -200.745 -200.75 -200.755 -200.76 -200.765 -200.77 -200.775 -200.78 -200.785 -200.79 -200.795 -200.8 -200.805 -200.81 -200.815 -200.82 -200.825 -200.83 -200.835 -200.84 -200.845 -200.85 -200.855 -200.86 -200.865 -200.87 -200.875 -200.88 -200.885 -200.89 -200.895 -200.9 -200.905 -200.91 -200.915 -200.92 -200.925 -200.93 -200.935 -200.94 -200.945 -200.95 -200.955 -200.96 -200.965 -200.97 -200.975 -200.98 -200.985 -200.99 -200.995 -201 -201.005 -201.01 -201.015 -201.02 -201.025 -201.03 -201.035 -201.04 -201.045 -201.05 -201.055 -201.06 -201.065 -201.07 -201.075 -201.08 -201.085 -201.09 -201.095 -201.1 -201.105 -201.11 -201.115 -201.12 -201.125 -201.13 -201.135 -201.14 -201.145 -201.15 -201.155 -201.16 -201.165 -201.17 -201.175 -201.18 -201.185 -201.19 -201.195 -201.2 -201.205 -201.21 -201.215 -201.22 -201.225 -201.23 -201.235 -201.24 -201.245 -201.25 -201.255 -201.26 -201.265 -201.27 -201.275 -201.28 -201.285 -201.29 -201.295 -201.3 -201.305 -201.31 -201.315 -201.32 -201.325 -201.33 -201.335 -201.34 -201.345 -201.35 -201.355 -201.36 -201.365 -201.37 -201.375 -201.38 -201.385 -201.39 -201.395 -201.4 -201.405 -201.41 -201.415 -201.42 -201.425 -201.43 -201.435 -201.44 -201.445 -201.45 -201.455 -201.46 -201.465 -201.47 -201.475 -201.48 -201.485 -201.49 -201.495 -201.5 -201.505 -201.51 -201.515 -201.52 -201.525 -201.53 -201.535 -201.54 -201.545 -201.55 -201.555 -201.56 -201.565 -201.57 -201.575 -201.58 -201.585 -201.59 -201.595 -201.6 -201.605 -201.61 -201.615 -201.62 -201.625 -201.63 -201.635 -201.64 -201.645 -201.65 -201.655 -201.66 -201.665 -201.67 -201.675 -201.68 -201.685 -201.69 -201.695 -201.7 -201.705 -201.71 -201.715 -201.72 -201.725 -201.73 -201.735 -201.74 -201.745 -201.75 -201.755 -201.76 -201.765 -201.77 -201.775 -201.78 -201.785 -201.79 -201.795 -201.8 -201.805 -201.81 -201.815 -201.82 -201.825 -201.83 -201.835 -201.84 -201.845 -201.85 -201.855 -201.86 -201.865 -201.87 -201.875 -201.88 -201.885 -201.89 -201.895 -201.9 -201.905 -201.91 -201.915 -201.92 -201.925 -201.93 -201.935 -201.94 -201.945 -201.95 -201.955 -201.96 -201.965 -201.97 -201.975 -201.98 -201.985 -201.99 -201.995 -202 -202.005 -202.01 -202.015 -202.02 -202.025 -202.03 -202.035 -202.04 -202.045 -202.05 -202.055 -202.06 -202.065 -202.07 -202.075 -202.08 -202.085 -202.09 -202.095 -202.1 -202.105 -202.11 -202.115 -202.12 -202.125 -202.13 -202.135 -202.14 -202.145 -202.15 -202.155 -202.16 -202.165 -202.17 -202.175 -202.18 -202.185 -202.19 -202.195 -202.2 -202.205 -202.21 -202.215 -202.22 -202.225 -202.23 -202.235 -202.24 -202.245 -202.25 -202.255 -202.26 -202.265 -202.27 -202.275 -202.28 -202.285 -202.29 -202.295 -202.3 -202.305 -202.31 -202.315 -202.32 -202.325 -202.33 -202.335 -202.34 -202.345 -202.35 -202.355 -202.36 -202.365 -202.37 -202.375 -202.38 -202.385 -202.39 -202.395 -202.4 -202.405 -202.41 -202.415 -202.42 -202.425 -202.43 -202.435 -202.44 -202.445 -202.45 -202.455 -202.46 -202.465 -202.47 -202.475 -202.48 -202.485 -202.49 -202.495 - --75.9641 --75.975 --75.9656 --75.9844 --75.9672 --75.9641 --75.9656 --75.9609 --75.9609 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9547 --75.9672 --75.9641 --75.9734 --75.9625 --75.9734 --75.9703 --75.975 --75.9922 --75.9672 --75.9625 --75.9812 --75.9703 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.975 --75.9766 --75.9906 --75.975 --75.9719 --75.9859 --75.9594 --75.9719 --75.9547 --75.9719 --75.9703 --75.9703 --75.9594 --75.9688 --75.9641 --75.9594 --75.9844 --75.9547 --75.9688 --75.975 --75.9719 --75.9609 --75.9703 --75.9688 --75.9578 --75.9641 --75.9594 --75.9578 --75.975 --75.9656 --75.9688 --75.9625 --75.9531 --75.9563 --75.9641 --75.9594 --75.9641 --75.9609 --75.9578 --75.9719 --75.9547 --75.9563 --75.9703 --75.9672 --75.9578 --75.9734 --75.9734 --75.9594 --75.9656 --75.9578 --75.9516 --75.9578 --75.9563 --75.9563 --75.9609 --75.9516 --75.9688 --75.9422 --75.9516 --75.9688 --75.9656 --75.9641 --75.9547 --75.9531 --75.9734 --75.9578 --75.9469 --75.9625 --75.9594 --75.9375 --75.9594 --75.9641 --75.9625 --75.9531 --75.9422 --75.95 --75.95 --75.9578 --75.9547 --75.9609 --75.9484 --75.9484 --75.9547 --75.9469 --75.9641 --75.9563 --75.9328 --75.9547 --75.95 --75.9578 --75.9563 --75.9531 --75.9563 --75.9359 --75.9594 --75.95 --75.9609 --75.9531 --75.9594 --75.9547 --75.9656 --75.9594 --75.9578 --75.9516 --75.9516 --75.9484 --75.9516 --75.9563 --75.9547 --75.9531 --75.9453 --75.9531 --75.9688 --75.9516 --75.9594 --75.9516 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9609 --75.9703 --75.9734 --75.9609 --75.9672 --75.9531 --75.9625 --75.9625 --75.9563 --75.9734 --75.9656 --75.9641 --75.9578 --75.9656 --75.9563 --75.9656 --75.9672 --75.9625 --75.9688 --75.9594 --75.9641 --75.9688 --75.9656 --75.9625 --75.9812 --75.9594 --75.9672 --75.9656 --75.9547 --75.9563 --75.9594 --75.9703 --75.9641 --75.9688 --75.9531 --75.95 --75.9594 --75.9469 --75.9547 --75.9563 --75.9609 --75.9672 --75.9563 --75.9578 --75.9547 --75.9609 --75.9469 --75.9594 --75.9594 --75.9484 --75.9625 --75.9641 --75.9547 --75.9531 --75.9484 --75.9547 --75.9484 --75.9422 --75.9594 --75.9516 --75.9609 --75.9672 --75.9672 --75.9609 --75.9516 --75.9594 --75.9781 --75.9563 --75.9688 --75.9703 --75.9625 --75.9563 --75.9437 --75.9578 --75.9547 --75.9609 --75.9688 --75.9609 --75.9594 --75.9609 --75.9547 --75.9719 --75.9656 --75.9578 --75.9688 --75.975 --75.9594 --75.9609 --75.9609 --75.9563 --75.9656 --75.9563 --75.9563 --75.9719 --75.9578 --75.9609 --75.9625 --75.9578 --75.9563 --75.9578 --75.9563 --75.95 --75.9594 --75.9594 --75.9594 --75.975 --75.9641 --75.9703 --75.9578 --75.9594 --75.9734 --75.9656 --75.9516 --75.9766 --75.9656 --75.9656 --75.9594 --75.9688 --75.9656 --75.9609 --75.9766 --75.9656 --75.9734 --75.9516 --75.9609 --75.9547 --75.9453 --75.9672 --75.9625 --75.9594 --75.9609 --75.9656 --75.9609 --75.9656 --75.9656 --75.9578 --75.9625 --75.9453 --75.9531 --75.9719 --75.9734 --75.9656 --75.9516 --75.9609 --75.9688 --75.9594 --75.9719 --75.9641 --75.9641 --75.9531 --75.95 --75.9437 --75.9437 --75.9594 --75.9516 --75.9359 --75.9609 --75.9469 --75.9453 --75.9391 --75.9437 --75.9531 --75.9531 --75.9563 --75.9547 --75.9547 --75.9719 --75.9672 --75.9641 --75.9609 --75.9766 --75.9484 --75.9563 --75.9594 --75.9547 --75.9578 --75.9609 --75.9516 --75.9547 --75.9594 --75.9578 --75.9656 --75.9516 --75.9531 --75.9422 --75.9516 --75.9453 --75.95 --75.9625 --75.95 --75.9531 --75.9641 --75.9703 --75.9594 --75.9531 --75.9563 --75.9594 --75.9516 --75.9719 --75.9672 --75.9531 --75.9703 --75.9547 --75.9641 --75.9688 --75.9547 --75.9547 --75.9625 --75.9641 --75.9656 --75.9609 --75.95 --75.9547 --75.9531 --75.9531 --75.9547 --75.9609 --75.9641 --75.9594 --75.9594 --75.9547 --75.9469 --75.9625 --75.9734 --75.9609 --75.9516 --75.975 --75.9672 --75.9594 --75.9609 --75.9609 --75.95 --75.9609 --75.9766 --75.9609 --75.9563 --75.95 --75.9625 --75.9641 --75.9656 --75.9516 --75.9594 --75.9594 --75.9563 --75.9641 --75.9672 --75.9609 --75.9703 --75.9516 --75.9531 --75.9625 --75.9578 --75.9672 --75.9859 --76.0484 --76.0938 --76.1594 --76.2 --76.2063 --76.1203 --76.0156 --75.8641 --75.7141 --75.5953 --75.4844 --75.3938 --75.3313 --75.2594 --75.2 --75.1547 --75.1109 --75.0766 --75.0281 --74.9938 --74.95 --74.9047 --74.8578 --74.8063 --74.7594 --74.7281 --74.6875 --74.6484 --74.5953 --74.5641 --74.5203 --74.4719 --74.4313 --74.3906 --74.3703 --74.3281 --74.2922 --74.2453 --74.2188 --74.1844 --74.1438 --74.1094 --74.0719 --74.0391 --74.0125 --73.9734 --73.9328 --73.8906 --73.8625 --73.8422 --73.8125 --73.7656 --73.7328 --73.7125 --73.675 --73.6375 --73.6125 --73.5797 --73.5469 --73.5156 --73.4938 --73.4516 --73.4187 --73.4078 --73.3781 --73.3438 --73.3125 --73.2937 --73.2719 --73.2406 --73.2156 --73.1891 --73.1672 --73.1359 --73.0969 --73.0719 --73.0531 --73.0266 --73 --72.9828 --72.95 --72.9297 --72.9125 --72.9 --72.875 --72.85 --72.825 --72.7984 --72.7734 --72.7438 --72.7359 --72.725 --72.675 --72.6578 --72.6469 --72.625 --72.5984 --72.575 --72.55 --72.5016 --72.4406 --72.3766 --72.2906 --72.2281 --72.2188 --72.2578 --72.3469 --72.475 --72.5844 --72.6844 --72.7719 --72.8422 --72.9031 --72.9484 --72.9734 --73.0156 --73.0234 --73.0531 --73.0797 --73.1109 --73.1281 --73.1703 --73.1891 --73.2109 --73.2312 --73.2547 --73.2781 --73.3031 --73.3297 --73.3531 --73.3656 --73.4 --73.4187 --73.4375 --73.4625 --73.4812 --73.5031 --73.5344 --73.5297 --73.55 --73.5781 --73.5969 --73.6047 --73.6328 --73.6594 --73.6609 --73.6984 --73.7063 --73.7203 --73.7438 --73.7516 --73.7734 --73.7906 --73.8266 --73.8313 --73.8484 --73.8578 --73.8734 --73.8781 --73.9047 --73.9156 --73.9266 --73.9453 --73.9656 --73.9734 --74 --74.0078 --74.0078 --74.0312 --74.0453 --74.0531 --74.0687 --74.075 --74.0844 --74.1078 --74.1031 --74.1172 --74.1312 --74.1438 --74.1484 --74.1734 --74.1766 --74.1953 --74.2 --74.2016 --74.2281 --74.2391 --74.2547 --74.2594 --74.2672 --74.2766 --74.2875 --74.2969 --74.2969 --74.3109 --74.3203 --74.3156 --74.3406 --74.3391 --74.3391 --74.35 --74.3594 --74.3656 --74.375 --74.3797 --74.3953 --74.3969 --74.4141 --74.4047 --74.4281 --74.4172 --74.4359 --74.4344 --74.4469 --74.4547 --74.4469 --74.4625 --74.475 --74.475 --74.4922 --74.4906 --74.5016 --74.4969 --74.5188 --74.525 --74.5188 --74.5391 --74.5375 --74.5422 --74.5375 --74.5453 --74.5547 --74.5531 --74.5703 --74.5719 --74.5828 --74.5828 --74.5875 --74.5922 --74.6016 --74.6078 --74.6031 --74.6 --74.6156 --74.6312 --74.6359 --74.6422 --74.65 --74.6328 --74.6516 --74.6609 --74.6609 --74.6734 --74.6594 --74.6734 --74.6703 --74.675 --74.6687 --74.6797 --74.6828 --74.6937 --74.6766 --74.7016 --74.7047 --74.6969 --74.7031 --74.7031 --74.7078 --74.7109 --74.7266 --74.7234 --74.7406 --74.7234 --74.725 --74.7422 --74.7312 --74.7391 --74.7359 --74.7516 --74.7453 --74.7547 --74.7672 --74.7578 --74.7656 --74.7641 --74.7719 --74.7688 --74.7703 --74.7875 --74.7812 --74.7953 --74.7797 --74.7812 --74.7844 --74.775 --74.8031 --74.8047 --74.8172 --74.8078 --74.8016 --74.8016 --74.825 --74.8156 --74.8109 --74.825 --74.8219 --74.8187 --74.8187 --74.8406 --74.8281 --74.8328 --74.8422 --74.8453 --74.8266 --74.8375 --74.8438 --74.8391 --74.8422 --74.8391 --74.8422 --74.8547 --74.8531 --74.8484 --74.8625 --74.8781 --74.8672 --74.8547 --74.8812 --74.8719 --74.8609 --74.8625 --74.8828 --74.8688 --74.8938 --74.8812 --74.8891 --74.9031 --74.8922 --74.8953 --74.9078 --74.9016 --74.9031 --74.8922 --74.9047 --74.9078 --74.8938 --74.9094 --74.9109 --74.9094 --74.9125 --74.9203 --74.9125 --74.9125 --74.9219 --74.9203 --74.9187 --74.9062 --74.9094 --74.9047 --74.9141 --74.9281 --74.9313 --74.9172 --74.9156 --74.9297 --74.9328 --74.9313 --74.9391 --74.9375 --74.9406 --74.9313 --74.9469 --74.9453 --74.9422 --74.9641 --74.9609 --74.9484 --74.9531 --74.9453 --74.9578 --74.9484 --74.9469 --74.9437 --74.9563 --74.9656 --74.9609 --74.9609 --74.9453 --74.9703 --74.9672 --74.9609 --74.975 --74.9797 --74.9719 --74.9703 --74.9656 --74.9906 --74.9812 --74.975 --74.9797 --74.9922 --74.975 --74.9859 --74.9922 --74.9859 --74.9953 --75.0031 --74.9922 --74.9844 --75.0047 --74.9781 --74.9906 --75.0016 --74.9906 --75.0047 --75 --74.9953 --74.9969 --74.9984 --75.0094 --75.0062 --75.0047 --75.0047 --75 --75.0141 --75.0297 --75.0078 --75.0125 --75.0141 --75.0156 --75.0125 --75.0219 --75.0219 --75.0141 --75.0109 --75.0031 --75.0125 --75.0203 --75.0328 --75.0234 --75.0344 --75.0266 --75.0172 --75.0297 --75.0297 --75.0219 --75.0344 --75.0312 --75.0344 --75.025 --75.0359 --75.0344 --75.0281 --75.0234 --75.0344 --75.0312 --75.0297 --75.0359 --75.0203 --75.0422 --75.0219 --75.0266 --75.025 --75.0375 --75.0469 --75.0469 --75.0328 --75.0484 --75.0469 --75.0578 --75.0344 --75.0406 --75.0375 --75.0391 --75.0453 --75.0406 --75.0531 --75.0484 --75.05 --75.0391 --75.0516 --75.0484 --75.05 --75.0437 --75.0484 --75.0344 --75.0594 --75.0359 --75.0453 --75.0531 --75.0469 --75.0547 --75.0344 --75.0469 --75.0391 --75.0484 --75.0437 --75.0531 --75.0516 --75.0547 --75.0578 --75.0594 --75.0563 --75.0375 --75.0531 --75.05 --75.0672 --75.0547 --75.0578 --75.0563 --75.0609 --75.0484 --75.0719 --75.0484 --75.075 --75.0609 --75.0516 --75.0563 --75.0625 --75.0625 --75.0594 --75.0578 --75.0719 --75.0594 --75.0687 --75.0656 --75.0547 --75.0578 --75.0672 --75.0766 --75.0703 --75.0594 --75.0609 --75.0687 --75.0625 --75.0844 --75.0719 --75.0734 --75.0703 --75.0719 --75.0828 --75.0687 --75.0875 --75.0703 --75.0656 --75.0922 --75.0844 --75.0859 --75.0703 --75.0828 --75.0781 --75.0813 --75.0641 --75.0797 --75.0703 --75.0875 --75.0875 --75.0703 --75.0828 --75.0922 --75.0766 --75.0766 --75.0781 --75.0891 --75.1016 --75.0781 --75.0781 --75.0859 --75.0906 --75.0813 --75.0938 --75.0844 --75.0953 --75.1016 --75.0906 --75.1094 --75.1 --75.1031 --75.0984 --75.1031 --75.0719 --75.0969 --75.0906 --75.1031 --75.1047 --75.0938 --75.1078 --75.1047 --75.1172 --75.1047 --75.1078 --75.0891 --75.1 --75.0953 --75.0938 --75.1031 --75.0875 --75.1 --75.1 --75.1031 --75.1125 --75.1031 --75.1062 --75.0938 --75.0969 --75.1125 --75.1047 --75.1188 --75.1125 --75.1062 --75.1125 --75.1125 --75.1156 --75.1109 --75.1109 --75.1078 --75.125 --75.1078 --75.1 --75.1156 --75.1062 --75.1156 --75.1141 --75.1156 --75.1109 --75.1109 --75.1234 --75.1203 --75.1125 --75.1266 --75.1031 --75.0969 --75.1219 --75.1094 --75.1172 --75.1203 --75.1172 --75.1266 --75.1219 --75.1125 --75.1203 --75.1234 --75.1172 --75.1141 --75.1188 --75.1125 --75.1172 --75.1219 --75.1188 --75.1266 --75.1172 --75.1219 --75.1297 --75.1297 --75.1172 --75.1297 --75.125 --75.1297 --75.1297 --75.1188 --75.1297 --75.125 --75.1297 --75.1266 --75.1219 --75.1156 --75.1266 --75.1297 --75.1172 --75.1266 --75.1094 --75.1156 --75.1312 --75.125 --75.1188 --75.1281 --75.1266 --75.1234 --75.1297 --75.1344 --75.1312 --75.1312 --75.1297 --75.1188 --75.1359 --75.1297 --75.1281 --75.1328 --75.1391 --75.1375 --75.1297 --75.125 --75.1281 --75.1312 --75.125 --75.1156 --75.1312 --75.1375 --75.1359 --75.1359 --75.1312 --75.1328 --75.1422 --75.1219 --75.1266 --75.1312 --75.1391 --75.1359 --75.1297 --75.1344 --75.1375 --75.1469 --75.125 --75.1375 --75.125 --75.1344 --75.1375 --75.1328 --75.1328 --75.1391 --75.1375 --75.1328 --75.1328 --75.1328 --75.1422 --75.1406 --75.1484 --75.1438 --75.1531 --75.1422 --75.1484 --75.1328 --75.1406 --75.1391 --75.15 --75.1406 --75.1484 --75.1391 --75.1469 --75.1531 --75.1484 --75.15 --75.1391 --75.1438 --75.1406 --75.1594 --75.1469 --75.1469 --75.1453 --75.1531 --75.1469 --75.1516 --75.1453 --75.1531 --75.1312 --75.1375 --75.1453 --75.1438 --75.1422 --75.1578 --75.1594 --75.1469 --75.1578 --75.1516 --75.1438 --75.1453 --75.15 --75.1656 --75.1453 --75.1484 --75.1594 --75.1594 --75.1703 --75.1719 --75.1594 --75.1562 --75.1516 --75.1687 --75.1609 --75.1609 --75.1625 --75.1594 --75.1547 --75.1547 --75.1781 --75.1687 --75.175 --75.1672 --75.1719 --75.175 --75.1781 --75.1781 --75.1719 --75.1797 --75.1656 --75.1656 --75.1828 --75.1656 --75.1766 --75.1734 --75.1719 --75.1687 --75.1531 --75.1813 --75.1703 --75.1594 --75.1703 --75.1766 --75.1703 --75.1578 --75.1766 --75.1656 --75.1703 --75.1703 --75.1797 --75.1656 --75.1531 --75.1562 --75.1734 --75.1672 --75.1781 --75.1781 --75.1953 --75.1719 --75.1734 --75.1891 --75.175 --75.1766 --75.1813 --75.1766 --75.1844 --75.1641 --75.1734 --75.1766 --75.1781 --75.1781 --75.1828 --75.1859 --75.1875 --75.1813 --75.1797 --75.1813 --75.1766 --75.1937 --75.1672 --75.175 --75.1781 --75.1703 --75.1844 --75.1813 --75.1875 --75.175 --75.1766 --75.1875 --75.1891 --75.1906 --75.1813 --75.175 --75.1906 --75.1875 --75.1719 --75.175 --75.1703 --75.1766 --75.1797 --75.1797 --75.1719 --75.1734 --75.1859 --75.1891 --75.175 --75.1703 --75.1859 --75.1859 --75.1828 --75.1672 --75.1859 --75.1766 --75.1922 --75.175 --75.1797 --75.1828 --75.1781 --75.1625 --75.1703 --75.1844 --75.1844 --75.1797 --75.1719 --75.1672 --75.1719 --75.1766 --75.1906 --75.175 --75.1828 --75.1922 --75.1781 --75.1797 --75.1828 --75.1969 --75.2016 --75.1891 --75.1984 --75.1781 --75.1906 --75.1734 --75.1844 --75.1844 --75.175 --75.1891 --75.1719 --75.1875 --75.1859 --75.1859 --75.1828 --75.1891 --75.1844 --75.1859 --75.1703 --75.1828 --75.1891 --75.2016 --75.175 --75.1937 --75.1859 --75.1969 --75.1891 --75.1906 --75.1953 --75.1953 --75.1906 --75.1844 --75.2 --75.1953 --75.1766 --75.1875 --75.1953 --75.1906 --75.1906 --75.2047 --75.2047 --75.2 --75.2063 --75.2063 --75.1953 --75.1969 --75.2047 --75.1984 --75.2 --75.2031 --75.2 --75.2 --75.1953 --75.2047 --75.2094 --75.2109 --75.1969 --75.2188 --75.2016 --75.2016 --75.1937 --75.1937 --75.2016 --75.2156 --75.2031 --75.2016 --75.2 --75.2 --75.2188 --75.1984 --75.2031 --75.2094 --75.1969 --75.2047 --75.2063 --75.2125 --75.2016 --75.2078 --75.2125 --75.2016 --75.2 --75.2063 --75.1984 --75.2016 --75.2016 --75.1984 --75.1937 --75.2031 --75.2016 --75.2094 --75.2063 --75.2 --75.2 --75.2219 --75.2047 --75.2078 --75.1984 --75.2094 --75.2125 --75.2047 --75.2141 --75.2094 --75.2109 --75.2063 --75.2063 --75.2016 --75.2063 --75.2172 --75.2156 --75.2016 --75.2078 --75.1937 --75.2031 --75.2031 --75.2016 --75.2188 --75.2016 --75.2 --75.2016 --75.2141 --75.2109 --75.2063 --75.2203 --75.2125 --75.2 --75.2234 --75.225 --75.2141 --75.2047 --75.2266 --75.2203 --75.2312 --75.225 --75.2109 --75.2063 --75.2391 --75.2203 --75.2188 --75.2109 --75.2063 --75.2125 --75.2219 --75.2188 --75.2219 --75.2219 --75.2172 --75.2156 --75.2156 --75.2109 --75.2156 --75.2109 --75.2219 --75.2203 --75.225 --75.2172 --75.2219 --75.2125 --75.2281 --75.2234 --75.2141 --75.225 --75.2156 --75.2281 --75.2219 --75.2109 --75.2156 --75.2141 --75.2156 --75.2078 --75.2359 --75.225 --75.2219 --75.2312 --75.2219 --75.2156 --75.2281 --75.2219 --75.2266 --75.2203 --75.2297 --75.2391 --75.2266 --75.2375 --75.2188 --75.2297 --75.2266 --75.2359 --75.225 --75.2172 --75.2328 --75.2125 --75.2234 --75.2312 --75.2125 --75.2391 --75.2266 --75.2234 --75.225 --75.2328 --75.2312 --75.2406 --75.2375 --75.2438 --75.2344 --75.2328 --75.2234 --75.2281 --75.2203 --75.2328 --75.2266 --75.2281 --75.2234 --75.225 --75.225 --75.2359 --75.2328 --75.2359 --75.2312 --75.2359 --75.2375 --75.2359 --75.2406 --75.2422 --75.2422 --75.2484 --75.2406 --75.2359 --75.25 --75.2281 --75.2203 --75.2391 --75.2312 --75.2312 --75.2234 --75.2344 --75.2375 --75.2359 --75.2297 --75.2312 --75.2469 --75.2359 --75.2406 --75.225 --75.2359 --75.2391 --75.2281 --75.2234 --75.2359 --75.2203 --75.2266 --75.2266 --75.2234 --75.2406 --75.2281 --75.225 --75.2281 --75.2344 --75.2234 --75.225 --75.2266 --75.2375 --75.225 --75.2406 --75.2219 --75.2312 --75.2375 --75.2266 --75.2312 --75.225 --75.2344 --75.2469 --75.2266 --75.2438 --75.2359 --75.2422 --75.2516 --75.2484 --75.2266 --75.2344 --75.2391 --75.2453 --75.2344 --75.2547 --75.2375 --75.2438 --75.2406 --75.2484 --75.2281 --75.2422 --75.2297 --75.2609 --75.2453 --75.2266 --75.2406 --75.2375 --75.2297 --75.2391 --75.2453 --75.2438 --75.2438 --75.2344 --75.2406 --75.25 --75.2438 --75.2391 --75.2328 --75.2375 --75.2422 --75.2406 --75.2453 --75.2375 --75.2484 --75.2453 --75.2438 --75.25 --75.2391 --75.25 --75.2422 --75.2469 --75.2562 --75.2422 --75.25 --75.2516 --75.2359 --75.2641 --75.2547 --75.2656 --75.2453 --75.2547 --75.2453 --75.2578 --75.2531 --75.2438 --75.2469 --75.2562 --75.2531 --75.2344 --75.2594 --75.2625 --75.2469 --75.2562 --75.2391 --75.2516 --75.2547 --75.2531 --75.2422 --75.2531 --75.2594 --75.2422 --75.2422 --75.2484 --75.2531 --75.2562 --75.2406 --75.2312 --75.2438 --75.25 --75.2578 --75.2453 --75.2281 --75.25 --75.2562 --75.2594 --75.2609 --75.2625 --75.2438 --75.2578 --75.2609 --75.2641 --75.2672 --75.2609 --75.2547 --75.2578 --75.2672 --75.2703 --75.2625 --75.2578 --75.2547 --75.2703 --75.2688 --75.2594 --75.2703 --75.2781 --75.2656 --75.2734 --75.2844 --75.2734 --75.275 --75.2797 --75.2828 --75.2656 --75.2844 --75.2812 --75.2859 --75.2766 --75.2688 --75.275 --75.275 --75.2797 --75.2641 --75.275 --75.2688 --75.2672 --75.2703 --75.2609 --75.2766 --75.2797 --75.2531 --75.2703 --75.2594 --75.2672 --75.2609 --75.2703 --75.2703 --75.2625 --75.2641 --75.2516 --75.2625 --75.2656 --75.25 --75.2734 --75.2656 --75.2469 --75.2688 --75.2734 --75.2797 --75.2688 --75.2562 --75.2859 --75.2688 --75.275 --75.2688 --75.2609 --75.2625 --75.2641 --75.2625 --75.2641 --75.2641 --75.2688 --75.2547 --75.2578 --75.275 --75.2672 --75.2859 --75.275 --75.2828 --75.2641 --75.2812 --75.2703 --75.2656 --75.2734 --75.2797 --75.2797 --75.2828 --75.2672 --75.2656 --75.2812 --75.2719 --75.2797 --75.2797 --75.2625 --75.275 --75.2688 --75.2719 --75.2625 --75.2812 --75.2766 --75.2688 --75.2734 --75.2812 --75.275 --75.2766 --75.2844 --75.2781 --75.2781 --75.2828 --75.2812 --75.2797 --75.2875 --75.2547 --75.2734 --75.2656 --75.2844 --75.2812 --75.2812 --75.2766 --75.2703 --75.275 --75.2719 --75.2844 --75.2828 --75.2797 --75.2922 --75.2859 --75.3 --75.2875 --75.2844 --75.2844 --75.3031 --75.2766 --75.2844 --75.2688 --75.2828 --75.2781 --75.2797 --75.2766 --75.2828 --75.2937 --75.2812 --75.275 --75.275 --75.2969 --75.2797 --75.2719 --75.2766 --75.2828 --75.2828 --75.2875 --75.2797 --75.2797 --75.2906 --75.2797 --75.2812 --75.2859 --75.3047 --75.2984 --75.2984 --75.2766 --75.2859 --75.2859 --75.2781 --75.2891 --75.2875 --75.2906 --75.2828 --75.2906 --75.2828 --75.2797 --75.2844 --75.2828 --75.3047 --75.2812 --75.2844 --75.2766 --75.2937 --75.2781 --75.2844 --75.2766 --75.2891 --75.3 --75.2844 --75.2859 --75.2922 --75.3 --75.2891 --75.3 --75.2906 --75.2797 --75.2953 --75.2953 --75.2875 --75.2891 --75.2937 --75.2906 --75.2922 --75.2812 --75.2812 --75.2969 --75.2766 --75.2875 --75.2828 --75.2937 --75.2969 --75.2656 --75.2969 --75.2937 --75.2688 --75.2859 --75.2875 --75.2891 --75.2734 --75.2781 --75.2891 --75.2984 --75.2953 --75.2906 --75.2953 --75.2937 --75.3031 --75.3063 --75.3047 --75.3 --75.2937 --75.2937 --75.2984 --75.3031 --75.2891 --75.3031 --75.3047 --75.3031 --75.3047 --75.2937 --75.3016 --75.3031 --75.3016 --75.2922 --75.3047 --75.3016 --75.2906 --75.3016 --75.3109 --75.2969 --75.3125 --75.3078 --75.2969 --75.3 --75.2891 --75.3094 --75.3 --75.3016 --75.2875 --75.3125 --75.2953 --75.3078 --75.3016 --75.2891 --75.3 --75.3031 --75.2969 --75.3031 --75.3063 --75.2906 --75.2922 --75.2953 --75.2922 --75.3063 --75.2969 --75.3 --75.2906 --75.2984 --75.2969 --75.3109 --75.2937 --75.2937 --75.3063 --75.2937 --75.3 --75.2984 --75.3 --75.2953 --75.3016 --75.3 --75.3047 --75.3031 --75.2922 --75.2906 --75.2906 --75.3172 --75.2891 --75.2891 --75.2953 --75.2953 --75.2984 --75.2937 --75.2969 --75.2859 --75.3031 --75.2953 --75.2922 --75.2937 --75.3016 --75.2984 --75.2969 --75.2922 --75.3141 --75.3109 --75.3109 --75.2922 --75.3203 --75.3094 --75.3266 --75.3 --75.3016 --75.3125 --75.3078 --75.3109 --75.3016 --75.3094 --75.3141 --75.3094 --75.3078 --75.3047 --75.3203 --75.3063 --75.3063 --75.3187 --75.3125 --75.3187 --75.3203 --75.3187 --75.3187 --75.3125 --75.3203 --75.3063 --75.3172 --75.3125 --75.3063 --75.325 --75.3266 --75.3078 --75.3187 --75.3172 --75.3187 --75.3125 --75.3266 --75.3078 --75.3094 --75.325 --75.325 --75.3156 --75.3234 --75.3094 --75.3219 --75.3219 --75.3172 --75.3187 --75.3203 --75.3203 --75.3125 --75.3172 --75.3219 --75.3125 --75.3141 --75.3234 --75.3297 --75.3266 --75.3156 --75.3172 --75.3125 --75.3187 --75.3172 --75.3266 --75.3203 --75.3125 --75.3266 --75.3172 --75.3234 --75.3187 --75.3219 --75.3266 --75.3156 --75.3313 --75.325 --75.325 --75.3266 --75.3375 --75.3172 --75.3313 --75.3375 --75.3359 --75.3297 --75.3422 --75.3344 --75.3344 --75.3297 --75.3359 --75.3187 --75.3344 --75.3344 --75.3281 --75.3313 --75.3281 --75.3297 --75.3281 --75.3297 --75.3422 --75.3234 --75.3219 --75.3297 --75.3328 --75.3313 --75.3281 --75.3281 --75.3438 --75.325 --75.3359 --75.3391 --75.3391 --75.3266 --75.3391 --75.3375 --75.3422 --75.3453 --75.3359 --75.3375 --75.3391 --75.3344 --75.3422 --75.3391 --75.3484 --75.3406 --75.3469 --75.3453 --75.3234 --75.3328 --75.3328 --75.3391 --75.3453 --75.3313 --75.325 --75.3453 --75.3281 --75.3469 --75.3453 --75.3531 --75.35 --75.3406 --75.3359 --75.3359 --75.3438 --75.3281 --75.35 --75.3578 --75.3469 --75.3531 --75.3453 --75.3453 --75.35 --75.3391 --75.3453 --75.3484 --75.3313 --75.3516 --75.3422 --75.35 --75.3422 --75.3625 --75.3453 --75.3422 --75.3531 --75.3469 --75.3453 --75.3438 --75.3422 --75.3359 --75.3469 --75.3672 --75.3469 --75.3422 --75.3547 --75.3422 --75.35 --75.3531 --75.3641 --75.3391 --75.3469 --75.3453 --75.3422 --75.3422 --75.3469 --75.3391 --75.3484 --75.3531 --75.3438 --75.3438 --75.3562 --75.3609 --75.3453 --75.3578 --75.3578 --75.3484 --75.3594 --75.3516 --75.3578 --75.3594 --75.3391 --75.3531 --75.35 --75.3516 --75.3422 --75.3359 --75.3406 --75.3531 --75.3391 --75.3516 --75.3453 --75.3484 --75.3578 --75.3562 --75.3594 --75.3438 --75.3547 --75.3469 --75.3562 --75.3484 --75.3375 --75.3484 --75.3484 --75.3594 --75.3625 --75.3625 --75.3453 --75.3516 --75.3625 --75.3516 --75.3562 --75.3453 --75.3469 --75.35 --75.3469 --75.3469 --75.3406 --75.3531 --75.3656 --75.3453 --75.3516 --75.3609 --75.3469 --75.3641 --75.3531 --75.3453 --75.3469 --75.3531 --75.3484 --75.3547 --75.3406 --75.3469 --75.35 --75.3547 --75.35 --75.35 --75.3406 --75.3516 --75.3531 --75.3375 --75.3453 --75.3438 --75.3438 --75.3484 --75.35 --75.3547 --75.35 --75.3422 --75.3578 --75.3578 --75.3406 --75.3484 --75.3531 --75.3547 --75.3484 --75.3469 --75.3438 --75.3438 --75.3547 --75.3547 --75.3672 --75.3547 --75.3453 --75.3703 --75.3719 --75.3578 --75.3688 --75.3531 --75.3625 --75.3734 --75.3594 --75.35 --75.3609 --75.375 --75.3641 --75.3688 --75.3703 --75.375 --75.3672 --75.3609 --75.3688 --75.3656 --75.3984 --75.3656 --75.3641 --75.3875 --75.3672 --75.3688 --75.3594 --75.3812 --75.3672 --75.3766 --75.3625 --75.3641 --75.3672 --75.3625 --75.3641 --75.3656 --75.3672 --75.3641 --75.3734 --75.3531 --75.3562 --75.3562 --75.3734 --75.3641 --75.3562 --75.3656 --75.375 --75.3484 --75.3641 --75.3625 --75.3719 --75.3641 --75.3625 --75.3828 --75.3641 --75.3641 --75.3734 --75.3828 --75.3688 --75.375 --75.375 --75.3703 --75.3703 --75.3547 --75.3703 --75.3656 --75.3703 --75.3734 --75.3719 --75.3703 --75.3641 --75.3688 --75.3656 --75.3734 --75.3766 --75.3594 --75.3703 --75.3688 --75.3656 --75.3734 --75.3672 --75.3828 --75.3688 --75.3672 --75.3812 --75.375 --75.3812 --75.3672 --75.3703 --75.3875 --75.3797 --75.3688 --75.375 --75.3781 --75.3875 --75.3859 --75.3734 --75.375 --75.3781 --75.3766 --75.3609 --75.3828 --75.3672 --75.3891 --75.3781 --75.3797 --75.3875 --75.3703 --75.3859 --75.3828 --75.3781 --75.3781 --75.3969 --75.3766 --75.3828 --75.3875 --75.3859 --75.3938 --75.3828 --75.3828 --75.3797 --75.3906 --75.3922 --75.3781 --75.375 --75.3875 --75.3922 --75.3766 --75.3906 --75.3906 --75.3781 --75.3859 --75.3734 --75.3781 --75.3781 --75.3969 --75.3781 --75.3859 --75.3781 --75.3859 --75.3781 --75.3906 --75.3844 --75.3781 --75.3875 --75.3797 --75.3812 --75.3703 --75.3688 --75.3922 --75.3828 --75.3734 --75.3719 --75.3812 --75.3641 --75.3797 --75.3812 --75.3906 --75.3797 --75.3875 --75.3719 --75.3797 --75.3844 --75.3844 --75.3844 --75.3734 --75.3703 --75.4 --75.4031 --75.3672 --75.3875 --75.3719 --75.3594 --75.3859 --75.375 --75.3875 --75.3734 --75.3812 --75.3938 --75.3844 --75.3688 --75.3719 --75.3703 --75.3812 --75.375 --75.3625 --75.3797 --75.3766 --75.3781 --75.3734 --75.375 --75.3766 --75.3875 --75.3906 --75.3844 --75.3797 --75.3844 --75.3875 --75.3703 --75.3922 --75.3859 --75.3828 --75.375 --75.3844 --75.3906 --75.3906 --75.3828 --75.3844 --75.3766 --75.3891 --75.375 --75.3781 --75.3859 --75.3953 --75.3656 --75.3781 --75.375 --75.3938 --75.3891 --75.3891 --75.3781 --75.3781 --75.3922 --75.3766 --75.3812 --75.3828 --75.3938 --75.3828 --75.3953 --75.3922 --75.3969 --75.3828 --75.3969 --75.4 --75.3859 --75.3922 --75.3969 --75.4016 --75.3969 --75.3953 --75.3969 --75.4078 --75.3922 --75.3969 --75.4031 --75.4047 --75.3984 --75.3922 --75.3969 --75.3844 --75.3844 --75.4031 --75.4016 --75.4078 --75.3844 --75.4047 --75.3906 --75.3953 --75.4 --75.4 --75.3875 --75.3938 --75.3875 --75.3922 --75.3781 --75.3844 --75.3953 --75.3812 --75.3953 --75.3969 --75.3797 --75.3969 --75.3984 --75.3953 --75.3922 --75.3891 --75.3922 --75.3859 --75.3828 --75.3906 --75.4062 --75.3844 --75.3969 --75.3781 --75.3797 --75.3734 --75.3922 --75.3875 --75.3844 --75.3938 --75.3938 --75.3781 --75.4047 --75.3984 --75.3938 --75.3984 --75.4016 --75.4016 --75.3859 --75.3891 --75.3844 --75.3969 --75.3922 --75.3938 --75.3797 --75.3984 --75.3938 --75.3906 --75.3938 --75.3953 --75.3953 --75.3891 --75.3891 --75.3891 --75.3891 --75.4047 --75.3922 --75.3953 --75.3922 --75.3875 --75.3859 --75.3906 --75.3922 --75.3984 --75.3891 --75.3797 --75.3922 --75.3797 --75.375 --75.3891 --75.3797 --75.3828 --75.3828 --75.3906 --75.3875 --75.3922 --75.4016 --75.3938 --75.3891 --75.3891 --75.3906 --75.3969 --75.3922 --75.3922 --75.3969 --75.3781 --75.3938 --75.4047 --75.3984 --75.3812 --75.3828 --75.4016 --75.3922 --75.3891 --75.3906 --75.3922 --75.4 --75.3891 --75.3828 --75.4 --75.3953 --75.3891 --75.3969 --75.3938 --75.3984 --75.3984 --75.3938 --75.3953 --75.3953 --75.3938 --75.3953 --75.3938 --75.3922 --75.3984 --75.4 --75.4062 --75.4078 --75.4078 --75.3984 --75.4172 --75.4062 --75.4 --75.4 --75.4078 --75.4094 --75.4047 --75.4031 --75.3953 --75.4047 --75.3891 --75.4078 --75.4 --75.4062 --75.4109 --75.4031 --75.4094 --75.4 --75.4062 --75.4078 --75.4172 --75.4187 --75.3891 --75.4109 --75.4062 --75.4062 --75.4125 --75.4141 --75.4062 --75.4125 --75.4062 --75.4062 --75.4047 --75.4094 --75.4078 --75.4078 --75.4078 --75.4016 --75.4062 --75.4062 --75.4141 --75.4031 --75.4047 --75.3922 --75.4062 --75.4047 --75.4094 --75.4156 --75.4109 --75.4234 --75.4125 --75.4125 --75.4094 --75.4078 --75.4062 --75.4047 --75.3969 --75.4078 --75.4109 --75.4031 --75.4062 --75.4125 --75.3984 --75.4016 --75.4016 --75.4016 --75.4062 --75.3969 --75.3875 --75.4047 --75.4 --75.4 --75.3969 --75.3875 --75.3984 --75.3969 --75.4125 --75.4094 --75.4031 --75.4047 --75.4047 --75.4016 --75.3922 --75.4062 --75.4187 --75.4078 --75.4156 --75.4172 --75.4062 --75.4156 --75.4016 --75.4031 --75.4094 --75.4094 --75.4094 --75.4078 --75.4094 --75.4078 --75.4 --75.4094 --75.4047 --75.4016 --75.4109 --75.4109 --75.4109 --75.4141 --75.3984 --75.4125 --75.4047 --75.4031 --75.4031 --75.4016 --75.4078 --75.4078 --75.4094 --75.4187 --75.4094 --75.4094 --75.4031 --75.4141 --75.4031 --75.4156 --75.4062 --75.4078 --75.4109 --75.4125 --75.3984 --75.4047 --75.4156 --75.4219 --75.4078 --75.4109 --75.4062 --75.4156 --75.4094 --75.4125 --75.4187 --75.4219 --75.4187 --75.4219 --75.4109 --75.4203 --75.4156 --75.4203 --75.4156 --75.4203 --75.4219 --75.425 --75.4203 --75.4094 --75.4234 --75.4219 --75.4203 --75.4203 --75.4203 --75.4234 --75.4203 --75.4219 --75.4297 --75.425 --75.4391 --75.4094 --75.4344 --75.4219 --75.4187 --75.4187 --75.4219 --75.4187 --75.4109 --75.4062 --75.4125 --75.4219 --75.4187 --75.4203 --75.4156 --75.425 --75.4266 --75.4187 --75.4172 --75.4313 --75.4219 --75.4141 --75.4375 --75.425 --75.4313 --75.4234 --75.4219 --75.4313 --75.4234 --75.4156 --75.4172 --75.4094 --75.4219 --75.4219 --75.4078 --75.4203 --75.4219 --75.4172 --75.4125 --75.4219 --75.4203 --75.4047 --75.4344 --75.4297 --75.425 --75.4219 --75.4266 --75.4313 --75.4219 --75.4297 --75.4078 --75.4391 --75.4281 --75.4344 --75.4172 --75.4172 --75.4297 --75.4203 --75.4266 --75.4187 --75.425 --75.4187 --75.4234 --75.4234 --75.4203 --75.425 --75.4203 --75.4141 --75.4297 --75.4297 --75.4344 --75.4234 --75.4328 --75.4344 --75.4234 --75.4281 --75.4297 --75.4297 --75.425 --75.4172 --75.425 --75.4203 --75.4187 --75.4187 --75.4313 --75.4219 --75.4187 --75.4234 --75.4281 --75.4281 --75.4281 --75.4313 --75.4266 --75.4422 --75.4234 --75.425 --75.4375 --75.4313 --75.4281 --75.4234 --75.4297 --75.4281 --75.4313 --75.4219 --75.4344 --75.4313 --75.4313 --75.425 --75.4359 --75.4297 --75.4297 --75.4313 --75.4234 --75.4266 --75.425 --75.4187 --75.4078 --75.4141 --75.4187 --75.4281 --75.4172 --75.4328 --75.4375 --75.4234 --75.4328 --75.4219 --75.4266 --75.4297 --75.4203 --75.4234 --75.4328 --75.4219 --75.4281 --75.4391 --75.4297 --75.4328 --75.4359 --75.4422 --75.4266 --75.4234 --75.4234 --75.4453 --75.425 --75.4141 --75.4313 --75.4156 --75.4344 --75.4313 --75.4266 --75.4453 --75.4375 --75.4328 --75.4313 --75.4406 --75.4437 --75.4328 --75.4359 --75.4313 --75.4281 --75.425 --75.425 --75.4203 --75.4359 --75.4234 --75.4156 --75.4297 --75.4328 --75.4203 --75.4375 --75.4469 --75.4453 --75.4422 --75.4469 --75.4313 --75.4422 --75.4469 --75.4281 --75.4391 --75.4344 --75.4281 --75.4219 --75.4313 --75.4234 --75.4375 --75.4375 --75.4234 --75.4297 --75.4422 --75.4375 --75.4281 --75.4313 --75.4359 --75.4375 --75.4406 --75.4125 --75.4172 --75.4156 --75.4313 --75.4313 --75.4219 --75.4344 --75.425 --75.4375 --75.4313 --75.4391 --75.4172 --75.4344 --75.4328 --75.4297 --75.4313 --75.4328 --75.4203 --75.425 --75.425 --75.4141 --75.4219 --75.425 --75.4141 --75.4187 --75.4203 --75.4406 --75.4422 --75.4125 --75.4297 --75.4297 --75.4266 --75.4344 --75.425 --75.4234 --75.4234 --75.4328 --75.4344 --75.4297 --75.4219 --75.4234 --75.4156 --75.4187 --75.4344 --75.4297 --75.4281 --75.45 --75.4391 --75.4437 --75.4422 --75.4422 --75.4406 --75.4437 --75.4359 --75.4391 --75.4281 --75.4547 --75.4406 --75.4391 --75.4422 --75.4391 --75.4484 --75.45 --75.4313 --75.4297 --75.4297 --75.4328 --75.4344 --75.4422 --75.4437 --75.4469 --75.4437 --75.4359 --75.4422 --75.4484 --75.4359 --75.4437 --75.4359 --75.4406 --75.4375 --75.4406 --75.4406 --75.4406 --75.4297 --75.4484 --75.4453 --75.4281 --75.4422 --75.4406 --75.4328 --75.4313 --75.4297 --75.4422 --75.4437 --75.4391 --75.4313 --75.4406 --75.4375 --75.4375 --75.4391 --75.4266 --75.4516 --75.4281 --75.4391 --75.4344 --75.4375 --75.4266 --75.4359 --75.4437 --75.4391 --75.4422 --75.4437 --75.4563 --75.4437 --75.4437 --75.4313 --75.4328 --75.4266 --75.4406 --75.4375 --75.4375 --75.4344 --75.4266 --75.4422 --75.4328 --75.4391 --75.4437 --75.4453 --75.4391 --75.4531 --75.4406 --75.4437 --75.4406 --75.4469 --75.4437 --75.4516 --75.4484 --75.4469 --75.4469 --75.4594 --75.45 --75.4391 --75.4437 --75.4469 --75.4453 --75.4406 --75.4531 --75.4359 --75.4391 --75.4516 --75.45 --75.4469 --75.4297 --75.4484 --75.4406 --75.4359 --75.4437 --75.4422 --75.4391 --75.4531 --75.45 --75.4469 --75.4437 --75.4406 --75.4391 --75.4437 --75.4453 --75.4375 --75.4391 --75.4391 --75.4313 --75.4547 --75.4531 --75.4578 --75.4391 --75.4391 --75.4453 --75.4563 --75.4406 --75.4625 --75.4531 --75.4359 --75.4547 --75.4547 --75.4375 --75.4531 --75.4547 --75.45 --75.4391 --75.4437 --75.4484 --75.45 --75.4453 --75.4531 --75.4469 --75.4297 --75.4469 --75.4453 --75.4406 --75.4578 --75.4547 --75.4594 --75.4406 --75.4734 --75.4531 --75.4594 --75.4453 --75.4453 --75.4453 --75.4437 --75.4484 --75.4531 --75.4422 --75.45 --75.4266 --75.4437 --75.4531 --75.4359 --75.4547 --75.4531 --75.4406 --75.4547 --75.4578 --75.45 --75.4625 --75.4594 --75.4641 --75.4578 --75.4656 --75.4641 --75.4563 --75.4594 --75.4703 --75.4437 --75.4563 --75.4609 --75.4734 --75.4609 --75.4469 --75.4594 --75.4531 --75.4547 --75.4531 --75.4625 --75.4719 --75.4563 --75.45 --75.4641 --75.4516 --75.45 --75.4656 --75.4437 --75.4516 --75.4578 --75.4563 --75.4594 --75.4531 --75.4531 --75.4641 --75.45 --75.4656 --75.4609 --75.4688 --75.475 --75.4563 --75.4672 --75.4641 --75.4656 --75.4703 --75.4609 --75.4656 --75.4844 --75.4609 --75.4688 --75.4578 --75.4703 --75.4563 --75.4547 --75.4641 --75.4625 --75.4406 --75.4594 --75.4594 --75.4688 --75.4609 --75.4563 --75.45 --75.4594 --75.4656 --75.4563 --75.4609 --75.4609 --75.4766 --75.4641 --75.4656 --75.4563 --75.4688 --75.4703 --75.4516 --75.4609 --75.4734 --75.4578 --75.4703 --75.4516 --75.4688 --75.4625 --75.4766 --75.4719 --75.4688 --75.4875 --75.4828 --75.4797 --75.4703 --75.4766 --75.4672 --75.4703 --75.475 --75.4719 --75.4766 --75.4641 --75.4781 --75.4734 --75.4797 --75.4625 --75.4781 --75.4641 --75.475 --75.4563 --75.4656 --75.4531 --75.4734 --75.4719 --75.4719 --75.45 --75.4688 --75.4797 --75.4625 --75.4734 --75.4609 --75.4594 --75.4594 --75.4672 --75.4719 --75.4609 --75.4453 --75.4609 --75.4672 --75.4688 --75.475 --75.4641 --75.4563 --75.4672 --75.4547 --75.4672 --75.4531 --75.4609 --75.4578 --75.475 --75.4688 --75.4688 --75.4688 --75.4641 --75.4578 --75.475 --75.4609 --75.4641 --75.4625 --75.4797 --75.4578 --75.4547 --75.4641 --75.4563 --75.4703 --75.4625 --75.4484 --75.4672 --75.4734 --75.4688 --75.475 --75.4688 --75.475 --75.4797 --75.4906 --75.4734 --75.4719 --75.4859 --75.4812 --75.4688 --75.4734 --75.4812 --75.4672 --75.4844 --75.4688 --75.4672 --75.4781 --75.4719 --75.4672 --75.4484 --75.4719 --75.475 --75.4672 --75.4703 --75.4688 --75.4828 --75.4703 --75.475 --75.4703 --75.4719 --75.4797 --75.4672 --75.4781 --75.4625 --75.4766 --75.4734 --75.4734 --75.4609 --75.4703 --75.4563 --75.4734 --75.475 --75.475 --75.4766 --75.475 --75.4672 --75.4797 --75.4922 --75.4719 --75.4781 --75.475 --75.4688 --75.4734 --75.4641 --75.4812 --75.4719 --75.4656 --75.475 --75.4641 --75.4875 --75.4609 --75.475 --75.4703 --75.4859 --75.4609 --75.4812 --75.4734 --75.4688 --75.4781 --75.4781 --75.4688 --75.4656 --75.4766 --75.4859 --75.4734 --75.4766 --75.4734 --75.4828 --75.4812 --75.4797 --75.475 --75.4812 --75.4844 --75.4844 --75.4828 --75.4703 --75.475 --75.4781 --75.4828 --75.4781 --75.4734 --75.475 --75.4859 --75.4672 --75.4891 --75.4688 --75.4859 --75.475 --75.4812 --75.4734 --75.4859 --75.4734 --75.4797 --75.4625 --75.4781 --75.4797 --75.4781 --75.4766 --75.4797 --75.4766 --75.4797 --75.4844 --75.4906 --75.4953 --75.4875 --75.4781 --75.4672 --75.4719 --75.4719 --75.4828 --75.4703 --75.4766 --75.4828 --75.4812 --75.4922 --75.4891 --75.4859 --75.4812 --75.4812 --75.4984 --75.4891 --75.4828 --75.4641 --75.4781 --75.4734 --75.4703 --75.4703 --75.4781 --75.4766 --75.4859 --75.4688 --75.4766 --75.4578 --75.4672 --75.4844 --75.4703 --75.4844 --75.475 --75.4812 --75.4703 --75.4766 --75.4719 --75.4844 --75.4734 --75.4922 --75.4766 --75.4828 --75.4797 --75.475 --75.4781 --75.4875 --75.4859 --75.4844 --75.4828 --75.4922 --75.475 --75.4844 --75.5094 --75.4906 --75.4922 --75.4938 --75.4812 --75.4812 --75.4891 --75.475 --75.4891 --75.4781 --75.4891 --75.4875 --75.4844 --75.4969 --75.4953 --75.4781 --75.4969 --75.4922 --75.5016 --75.4938 --75.4859 --75.4938 --75.4875 --75.4953 --75.4875 --75.5016 --75.4859 --75.4922 --75.5094 --75.4922 --75.4984 --75.5031 --75.4875 --75.5016 --75.4984 --75.4969 --75.4969 --75.5078 --75.5 --75.4953 --75.4906 --75.4906 --75.4922 --75.4875 --75.4953 --75.4844 --75.4984 --75.4969 --75.4766 --75.4875 --75.4828 --75.5016 --75.5047 --75.4922 --75.4922 --75.5062 --75.5078 --75.4938 --75.4984 --75.5047 --75.5016 --75.4938 --75.4938 --75.5062 --75.4938 --75.4812 --75.4891 --75.4875 --75.5 --75.4953 --75.4844 --75.4844 --75.4969 --75.4938 --75.4953 --75.4859 --75.5125 --75.4953 --75.4922 --75.5047 --75.5016 --75.4859 --75.4906 --75.5 --75.4938 --75.5 --75.5109 --75.4969 --75.5031 --75.4953 --75.5078 --75.5078 --75.5094 --75.5016 --75.5109 --75.4969 --75.5094 --75.5031 --75.5125 --75.5219 --75.5062 --75.5 --75.5094 --75.5 --75.5203 --75.5188 --75.5125 --75.5125 --75.5172 --75.5141 --75.5297 --75.5234 --75.5219 --75.5172 --75.5047 --75.5172 --75.5109 --75.5156 --75.5188 --75.525 --75.5172 --75.5203 --75.5125 --75.5125 --75.5125 --75.5062 --75.5188 --75.5094 --75.5062 --75.5109 --75.5266 --75.5281 --75.4969 --75.5094 --75.5062 --75.5125 --75.5125 --75.5234 --75.4984 --75.5062 --75.5047 --75.5 --75.5078 --75.5141 --75.5125 --75.5203 --75.5203 --75.5141 --75.5062 --75.5109 --75.5125 --75.5094 --75.5125 --75.5219 --75.5141 --75.5047 --75.5312 --75.5172 --75.5125 --75.5125 --75.5359 --75.5234 --75.5109 --75.5172 --75.5078 --75.5234 --75.525 --75.5062 --75.5016 --75.5156 --75.5172 --75.5203 --75.5156 --75.4969 --75.5219 --75.5172 --75.5078 --75.5234 --75.5031 --75.5109 --75.5 --75.5062 --75.525 --75.5094 --75.5234 --75.5266 --75.5047 --75.5094 --75.5141 --75.5188 --75.5109 --75.5188 --75.5125 --75.5266 --75.5078 --75.5203 --75.5125 --75.5172 --75.5188 --75.5234 --75.5094 --75.5188 --75.5062 --75.5234 --75.5203 --75.5125 --75.5141 --75.5141 --75.5203 --75.5062 --75.5219 --75.5203 --75.5016 --75.5109 --75.5109 --75.5109 --75.4922 --75.5141 --75.5062 --75.4938 --75.5 --75.5078 --75.4953 --75.4938 --75.5031 --75.5078 --75.5203 --75.4969 --75.4922 --75.5078 --75.5016 --75.5078 --75.5078 --75.5062 --75.5125 --75.5125 --75.5031 --75.5047 --75.5062 --75.5016 --75.5125 --75.5031 --75.5047 --75.5125 --75.5156 --75.5094 --75.5078 --75.5328 --75.5109 --75.5156 --75.5047 --75.5094 --75.5125 --75.5062 --75.5062 --75.5109 --75.5156 --75.4891 --75.5062 --75.5047 --75.5109 --75.5156 --75.5047 --75.5219 --75.5 --75.5141 --75.5281 --75.5062 --75.5078 --75.4984 --75.5219 --75.5047 --75.5062 --75.5203 --75.5203 --75.5188 --75.5094 --75.5125 --75.5188 --75.5125 --75.5141 --75.5125 --75.5203 --75.5234 --75.5219 --75.5312 --75.5109 --75.5234 --75.5266 --75.5172 --75.5266 --75.5188 --75.5312 --75.5219 --75.5172 --75.5172 --75.5234 --75.5156 --75.5078 --75.5062 --75.5297 --75.5109 --75.5047 --75.5016 --75.5047 --75.525 --75.4969 --75.5141 --75.5172 --75.5188 --75.5156 --75.5219 --75.5281 --75.5188 --75.5266 --75.5266 --75.5297 --75.5328 --75.5312 --75.5359 --75.5188 --75.5359 --75.5312 --75.5281 --75.5359 --75.5312 --75.5109 --75.5203 --75.5328 --75.5125 --75.5156 --75.5203 --75.5078 --75.5094 --75.525 --75.5172 --75.5156 --75.5016 --75.5062 --75.5156 --75.5219 --75.5125 --75.5125 --75.5062 --75.5125 --75.5109 --75.5297 --75.5016 --75.5156 --75.5266 --75.5281 --75.5375 --75.5219 --75.5141 --75.5266 --75.5172 --75.5188 --75.525 --75.5203 --75.5094 --75.5141 --75.5281 --75.5266 --75.5359 --75.5297 --75.5141 --75.5328 --75.5266 --75.5266 --75.5188 --75.5141 --75.5156 --75.5281 --75.5297 --75.5219 --75.5219 --75.5172 --75.5406 --75.5125 --75.5281 --75.5188 --75.5297 --75.5312 --75.5297 --75.525 --75.5203 --75.5328 --75.525 --75.5188 --75.5203 --75.5266 --75.5234 --75.5219 --75.5219 --75.525 --75.5266 --75.5344 --75.5172 --75.5203 --75.5344 --75.5203 --75.5203 --75.5188 --75.5297 --75.5328 --75.5219 --75.5391 --75.5297 --75.525 --75.5312 --75.5328 --75.5266 --75.5188 --75.5344 --75.5281 --75.5281 --75.5484 --75.5359 --75.5312 --75.5406 --75.5437 --75.5328 --75.5297 --75.5344 --75.525 --75.5234 --75.5422 --75.5344 --75.5344 --75.525 --75.5469 --75.5484 --75.5422 --75.5312 --75.5344 --75.5484 --75.5391 --75.5312 --75.525 --75.5469 --75.5359 --75.5516 --75.5484 --75.5422 --75.5437 --75.5312 --75.5359 --75.5266 --75.5312 --75.5359 --75.5422 --75.5266 --75.5531 --75.5422 --75.5344 --75.5422 --75.5297 --75.5391 --75.5297 --75.5469 --75.5344 --75.5422 --75.5312 --75.5203 --75.5484 --75.5484 --75.5437 --75.5375 --75.5453 --75.5391 --75.5281 --75.5281 --75.5484 --75.5563 --75.5375 --75.5359 --75.5437 --75.5359 --75.5203 --75.5406 --75.5422 --75.5328 --75.5578 --75.5297 --75.5391 --75.5359 --75.5359 --75.5281 --75.5469 --75.5453 --75.5391 --75.5328 --75.525 --75.5563 --75.5406 --75.5422 --75.5344 --75.5422 --75.5359 --75.5437 --75.5531 --75.5594 --75.5516 --75.5359 --75.5453 --75.5547 --75.5516 --75.55 --75.5312 --75.5422 --75.5359 --75.5484 --75.5516 --75.5437 --75.5437 --75.5469 --75.55 --75.5547 --75.5437 --75.5516 --75.5375 --75.5484 --75.5422 --75.5547 --75.5375 --75.5484 --75.5563 --75.5516 --75.5469 --75.5531 --75.5375 --75.5422 --75.5469 --75.5547 --75.5344 --75.5484 --75.5437 --75.5359 --75.5328 --75.5469 --75.55 --75.5406 --75.5516 --75.5469 --75.5437 --75.5437 --75.5437 --75.5531 --75.5328 --75.5547 --75.5516 --75.5516 --75.5516 --75.5453 --75.5484 --75.5391 --75.5531 --75.5469 --75.5594 --75.5453 --75.5578 --75.5594 --75.5578 --75.5469 --75.5563 --75.5453 --75.525 --75.5437 --75.5422 --75.5344 --75.5547 --75.5547 --75.5547 --75.5391 --75.5453 --75.5437 --75.5453 --75.5453 --75.5484 --75.5516 --75.5437 --75.5422 --75.5469 --75.55 --75.5516 --75.5453 --75.5437 --75.5516 --75.5516 --75.5422 --75.5547 --75.5406 --75.5453 --75.5484 --75.5516 --75.5391 --75.5531 --75.5422 --75.5531 --75.5531 --75.5391 --75.5469 --75.5563 --75.5406 --75.5563 --75.5563 --75.5406 --75.5594 --75.5469 --75.5453 --75.5516 --75.5516 --75.5531 --75.5422 --75.5359 --75.5453 --75.5547 --75.5594 --75.5516 --75.5344 --75.5516 --75.5531 --75.5453 --75.5672 --75.5422 --75.5594 --75.5578 --75.5563 --75.5672 --75.5625 --75.5594 --75.55 --75.5516 --75.5641 --75.55 --75.5609 --75.5734 --75.5625 --75.5531 --75.5469 --75.5516 --75.5641 --75.5547 --75.5609 --75.5563 --75.5641 --75.5594 --75.5531 --75.5609 --75.5469 --75.5547 --75.5406 --75.5563 --75.5375 --75.55 --75.5469 --75.5469 --75.5453 --75.5437 --75.5547 --75.5516 --75.5547 --75.5641 --75.5563 --75.55 --75.5422 --75.55 --75.5422 --75.5578 --75.55 --75.55 --75.5609 --75.5469 --75.5734 --75.5453 --75.5547 --75.5516 --75.5516 --75.5531 --75.5625 --75.5594 --75.5594 --75.5547 --75.55 --75.5547 --75.5625 --75.5594 --75.5625 --75.55 --75.5563 --75.5531 --75.5422 --75.5422 --75.5547 --75.5578 --75.5625 --75.5563 --75.5594 --75.5641 --75.5484 --75.5516 --75.5594 --75.5594 --75.5531 --75.5594 --75.5531 --75.5547 --75.5687 --75.5687 --75.575 --75.5531 --75.5547 --75.5547 --75.5531 --75.5578 --75.5469 --75.5531 --75.5516 --75.5547 --75.5547 --75.5578 --75.5594 --75.5578 --75.5656 --75.55 --75.5578 --75.5531 --75.5672 --75.5594 --75.5687 --75.5578 --75.5594 --75.5609 --75.5594 --75.5547 --75.5531 --75.5734 --75.5734 --75.5437 --75.5609 --75.5547 --75.5687 --75.5563 --75.5578 --75.5703 --75.5578 --75.5563 --75.5641 --75.5516 --75.5516 --75.5578 --75.5656 --75.5578 --75.5563 --75.5594 --75.5672 --75.5734 --75.5781 --75.575 --75.5563 --75.5594 --75.5609 --75.5625 --75.575 --75.5672 --75.5594 --75.5656 --75.5719 --75.5563 --75.5797 --75.5625 --75.5609 --75.5641 --75.5594 --75.5625 --75.5594 --75.5609 --75.5578 --75.5609 --75.5469 --75.5594 --75.5547 --75.5531 --75.5625 --75.575 --75.5687 --75.5859 --75.5687 --75.5766 --75.5719 --75.5906 --75.5766 --75.5719 --75.5672 --75.5563 --75.575 --75.5687 --75.5641 --75.5672 --75.5641 --75.5594 --75.5703 --75.5609 --75.5625 --75.575 --75.5625 --75.5609 --75.5594 --75.5625 --75.5531 --75.5563 --75.55 --75.5641 --75.5594 --75.5687 --75.5609 --75.5734 --75.5594 --75.5687 --75.5656 --75.5703 --75.5687 --75.5781 --75.5641 --75.5641 --75.5656 --75.5719 --75.55 --75.5703 --75.5578 --75.5656 --75.5656 --75.5641 --75.575 --75.5547 --75.5797 --75.5797 --75.5797 --75.5844 --75.5734 --75.5703 --75.5578 --75.5703 --75.575 --75.575 --75.5797 --75.5797 --75.5813 --75.5719 --75.5578 --75.5734 --75.575 --75.5672 --75.5687 --75.5719 --75.5687 --75.5719 --75.5641 --75.5687 --75.5813 --75.5625 --75.575 --75.5609 --75.5656 --75.5906 --75.5656 --75.5672 --75.5672 --75.5625 --75.5641 --75.5609 --75.5531 --75.5594 --75.5469 --75.5578 --75.55 --75.5609 --75.5609 --75.5703 --75.5563 --75.5578 --75.5531 --75.5609 --75.5719 --75.5641 --75.5781 --75.5625 --75.5609 --75.5766 --75.5703 --75.5594 --75.5625 --75.575 --75.5547 --75.5687 --75.5641 --75.575 --75.5703 --75.5813 --75.5641 --75.5656 --75.5656 --75.5859 --75.5797 --75.575 --75.5703 --75.5875 --75.5844 --75.5687 --75.575 --75.5547 --75.5703 --75.5625 --75.5594 --75.5672 --75.5563 --75.5656 --75.5672 --75.5703 --75.575 --75.5687 --75.5641 --75.5859 --75.5766 --75.5734 --75.5766 --75.5766 --75.5656 --75.5641 --75.5844 --75.5859 --75.5766 --75.5781 --75.5859 --75.5672 --75.575 --75.5875 --75.5703 --75.5891 --75.5734 --75.5734 --75.5797 --75.5703 --75.5813 --75.5813 --75.5813 --75.5781 --75.5828 --75.575 --75.5859 --75.5797 --75.5844 --75.5687 --75.5797 --75.5734 --75.5797 --75.5734 --75.5656 --75.5719 --75.5641 --75.5687 --75.5656 --75.5656 --75.5813 --75.575 --75.5641 --75.5719 --75.5719 --75.5734 --75.5656 --75.5672 --75.5734 --75.575 --75.575 --75.5859 --75.5891 --75.5891 --75.5734 --75.5953 --75.5953 --75.5828 --75.5922 --75.5719 --75.5813 --75.5828 --75.5781 --75.5844 --75.5766 --75.5859 --75.5828 --75.5594 --75.575 --75.5859 --75.5687 --75.575 --75.5859 --75.5859 --75.5766 --75.5828 --75.5781 --75.5813 --75.5703 --75.575 --75.5938 --75.5719 --75.5781 --75.5828 --75.5766 --75.5781 --75.5891 --75.5797 --75.5797 --75.5813 --75.5781 --75.5734 --75.5766 --75.5766 --75.5813 --75.5813 --75.5703 --75.5844 --75.5797 --75.5797 --75.5953 --75.5813 --75.5844 --75.5828 --75.5766 --75.5734 --75.5875 --75.5703 --75.575 --75.5734 --75.575 --75.5672 --75.5734 --75.5844 --75.5797 --75.5813 --75.5844 --75.5859 --75.5891 --75.5781 --75.5828 --75.5844 --75.5781 --75.5797 --75.575 --75.5703 --75.575 --75.5641 --75.5687 --75.5766 --75.5828 --75.5875 --75.575 --75.5734 --75.5734 --75.5797 --75.5687 --75.5859 --75.5859 --75.5719 --75.5813 --75.5687 --75.5734 --75.5719 --75.5609 --75.5766 --75.5719 --75.5703 --75.5828 --75.5766 --75.5719 --75.5875 --75.5797 --75.5781 --75.5797 --75.5844 --75.6016 --75.5875 --75.5828 --75.5891 --75.5734 --75.5781 --75.5687 --75.5813 --75.5797 --75.575 --75.5719 --75.5797 --75.5797 --75.5875 --75.5953 --75.5672 --75.5891 --75.5766 --75.5687 --75.5813 --75.5844 --75.5719 --75.5797 --75.5859 --75.5844 --75.5906 --75.5906 --75.5828 --75.5875 --75.5891 --75.5859 --75.5969 --75.5766 --75.5656 --75.5813 --75.5719 --75.5734 --75.5734 --75.5859 --75.5891 --75.5719 --75.5734 --75.5938 --75.5828 --75.5875 --75.5828 --75.5813 --75.5969 --75.5891 --75.5672 --75.5781 --75.5828 --75.575 --75.5781 --75.5844 --75.5938 --75.5906 --75.5781 --75.5844 --75.5813 --75.5719 --75.5844 --75.5703 --75.5687 --75.5687 --75.5766 --75.575 --75.5656 --75.5875 --75.5844 --75.5719 --75.5578 --75.5734 --75.575 --75.5813 --75.5719 --75.5641 --75.5828 --75.5719 --75.5859 --75.575 --75.575 --75.5813 --75.575 --75.5781 --75.5781 --75.5781 --75.5719 --75.5656 --75.5687 --75.575 --75.5844 --75.5766 --75.5813 --75.5828 --75.5781 --75.5875 --75.5875 --75.575 --75.5922 --75.5875 --75.5828 --75.5859 --75.5687 --75.5828 --75.5906 --75.5828 --75.5813 --75.5766 --75.5781 --75.5891 --75.575 --75.5656 --75.5766 --75.5766 --75.5813 --75.5797 --75.5844 --75.5797 --75.5797 --75.5656 --75.5609 --75.5672 --75.5844 --75.5828 --75.5734 --75.5672 --75.5703 --75.5594 --75.5844 --75.5797 --75.5844 --75.5859 --75.5781 --75.575 --75.5703 --75.5781 --75.5813 --75.5687 --75.5875 --75.5781 --75.575 --75.5781 --75.5781 --75.5828 --75.5781 --75.5797 --75.5797 --75.5906 --75.5719 --75.5797 --75.5906 --75.5938 --75.5797 --75.5922 --75.575 --75.6016 --75.5891 --75.5859 --75.5875 --75.5938 --75.5984 --75.5891 --75.5859 --75.5813 --75.5828 --75.575 --75.5797 --75.5828 --75.5797 --75.5813 --75.5875 --75.5859 --75.5781 --75.5781 --75.5844 --75.5891 --75.5734 --75.5969 --75.5922 --75.5938 --75.5859 --75.5859 --75.5969 --75.5781 --75.5844 --75.5906 --75.575 --75.5734 --75.5797 --75.5922 --75.5953 --75.5797 --75.5953 --75.5969 --75.5813 --75.5984 --75.6078 --75.6047 --75.5906 --75.5844 --75.6 --75.5875 --75.5813 --75.5891 --75.5875 --75.5844 --75.5922 --75.6 --75.6016 --75.5875 --75.5984 --75.5797 --75.5969 --75.5984 --75.6016 --75.6047 --75.5953 --75.5953 --75.5859 --75.5953 --75.5969 --75.5828 --75.5906 --75.5938 --75.5828 --75.5891 --75.5844 --75.5938 --75.5844 --75.5984 --75.5875 --75.5906 --75.5953 --75.6062 --75.5906 --75.5969 --75.5969 --75.5844 --75.5891 --75.5766 --75.5813 --75.5969 --75.5797 --75.5797 --75.5813 --75.5813 --75.5891 --75.5828 --75.5766 --75.5766 --75.5875 --75.575 --75.5875 --75.5781 --75.5922 --75.6016 --75.5938 --75.5734 --75.5813 --75.5859 --75.5766 --75.5891 --75.5734 --75.5781 --75.5766 --75.5844 --75.5938 --75.5828 --75.5906 --75.5953 --75.5969 --75.5859 --75.575 --75.5891 --75.5922 --75.5891 --75.5813 --75.5953 --75.5906 --75.5938 --75.6 --75.6 --75.5938 --75.5984 --75.5984 --75.5953 --75.5984 --75.6047 --75.5906 --75.5922 --75.5922 --75.6031 --75.5891 --75.5953 --75.5875 --75.5859 --75.6031 --75.5938 --75.6016 --75.5984 --75.6016 --75.6109 --75.5984 --75.6078 --75.5984 --75.6047 --75.6031 --75.5984 --75.5891 --75.5953 --75.5859 --75.5938 --75.6016 --75.5844 --75.6078 --75.5953 --75.6016 --75.6062 --75.5828 --75.5922 --75.5969 --75.5828 --75.5813 --75.5969 --75.5906 --75.5938 --75.5922 --75.5891 --75.5906 --75.5875 --75.5828 --75.5906 --75.575 --75.6 --75.5781 --75.5891 --75.5703 --75.6016 --75.5969 --75.5906 --75.5797 --75.6125 --75.6094 --75.5859 --75.5922 --75.5922 --75.6062 --75.5984 --75.6016 --75.6016 --75.6062 --75.5953 --75.5969 --75.6016 --75.5969 --75.5969 --75.5875 --75.6016 --75.6062 --75.6 --75.6031 --75.6078 --75.6078 --75.6016 --75.5875 --75.5969 --75.5938 --75.6 --75.5922 --75.5969 --75.6078 --75.5969 --75.6016 --75.5859 --75.5922 --75.6016 --75.6031 --75.5953 --75.5922 --75.6062 --75.6031 --75.6016 --75.6109 --75.5969 --75.5922 --75.6016 --75.6109 --75.5984 --75.5875 --75.6109 --75.6141 --75.6172 --75.6047 --75.6203 --75.6109 --75.625 --75.6078 --75.5984 --75.6141 --75.6156 --75.6047 --75.6016 --75.6094 --75.6141 --75.6109 --75.6156 --75.6188 --75.6141 --75.6125 --75.6156 --75.6109 --75.6141 --75.6078 --75.6172 --75.5938 --75.6 --75.5984 --75.5969 --75.6047 --75.5984 --75.6109 --75.6078 --75.6047 --75.6016 --75.6016 --75.6094 --75.6078 --75.6188 --75.6078 --75.6094 --75.6109 --75.6078 --75.6188 --75.6141 --75.6156 --75.6078 --75.6062 --75.6141 --75.625 --75.6094 --75.6094 --75.6172 --75.6094 --75.6141 --75.6047 --75.6141 --75.6062 --75.6062 --75.6109 --75.6125 --75.6188 --75.6078 --75.6 --75.6109 --75.6047 --75.6 --75.6156 --75.6203 --75.6203 --75.6109 --75.6203 --75.6172 --75.6281 --75.6094 --75.6094 --75.6156 --75.6078 --75.6234 --75.6188 --75.625 --75.6047 --75.6141 --75.6078 --75.6141 --75.625 --75.6234 --75.625 --75.6062 --75.6172 --75.6125 --75.6172 --75.6266 --75.6078 --75.6234 --75.6172 --75.6234 --75.6234 --75.6203 --75.6203 --75.6094 --75.6172 --75.6125 --75.6078 --75.6188 --75.5969 --75.6156 --75.6078 --75.6 --75.6047 --75.6031 --75.6172 --75.5953 --75.6062 --75.6172 --75.6188 --75.6109 --75.6203 --75.6188 --75.6203 --75.6125 --75.6141 --75.6328 --75.6203 --75.6219 --75.6266 --75.6156 --75.6266 --75.6156 --75.6141 --75.6125 --75.6172 --75.6156 --75.6203 --75.6219 --75.6156 --75.6156 --75.6312 --75.6141 --75.6047 --75.6203 --75.6109 --75.6219 --75.6344 --75.6203 --75.6109 --75.6188 --75.6156 --75.6109 --75.6172 --75.6125 --75.6203 --75.6109 --75.6172 --75.6219 --75.6109 --75.6328 --75.6188 --75.6203 --75.6328 --75.6156 --75.6172 --75.6125 --75.6141 --75.625 --75.6172 --75.6188 --75.6156 --75.6203 --75.6328 --75.6125 --75.6266 --75.6266 --75.6203 --75.6047 --75.6172 --75.6141 --75.6219 --75.6047 --75.6188 --75.6141 --75.6188 --75.625 --75.6172 --75.6234 --75.6203 --75.6109 --75.6125 --75.6188 --75.6141 --75.6203 --75.6328 --75.6234 --75.6047 --75.6125 --75.6094 --75.6219 --75.6203 --75.6266 --75.6203 --75.6125 --75.6203 --75.6047 --75.6109 --75.6125 --75.6141 --75.6078 --75.6266 --75.6156 --75.6125 --75.6203 --75.6109 --75.6219 --75.6109 --75.6156 --75.625 --75.6031 --75.6203 --75.6125 --75.6078 --75.6109 --75.6141 --75.6078 --75.6203 --75.6281 --75.6141 --75.6422 --75.5984 --75.6125 --75.6141 --75.6172 --75.6062 --75.6219 --75.6016 --75.6281 --75.6219 --75.6156 --75.6188 --75.6141 --75.6234 --75.6328 --75.6156 --75.6203 --75.6203 --75.6328 --75.6078 --75.6125 --75.6156 --75.6203 --75.6172 --75.6125 --75.6203 --75.6141 --75.6219 --75.6219 --75.6266 --75.6172 --75.6297 --75.6031 --75.6219 --75.6172 --75.6281 --75.6156 --75.6312 --75.6312 --75.6234 --75.6266 --75.6297 --75.6188 --75.6125 --75.6219 --75.6234 --75.6016 --75.6078 --75.6219 --75.6109 --75.6172 --75.625 --75.6109 --75.6312 --75.6188 --75.625 --75.6266 --75.6266 --75.6219 --75.625 --75.625 --75.6234 --75.6266 --75.625 --75.625 --75.6266 --75.6297 --75.6234 --75.6328 --75.6266 --75.6172 --75.6375 --75.6266 --75.6266 --75.6188 --75.6359 --75.6188 --75.6297 --75.6203 --75.6312 --75.625 --75.6109 --75.6141 --75.6109 --75.6297 --75.6266 --75.6281 --75.6328 --75.6203 --75.6328 --75.6219 --75.6359 --75.6297 --75.6281 --75.6375 --75.6344 --75.6328 --75.6438 --75.6266 --75.6328 --75.6328 --75.6344 --75.6484 --75.6406 --75.6406 --75.6469 --75.6406 --75.6359 --75.6297 --75.6344 --75.6188 --75.6297 --75.6203 --75.6281 --75.6203 --75.6328 --75.6406 --75.6312 --75.625 --75.6188 --75.6375 --75.6156 --75.6312 --75.6188 --75.6297 --75.6172 --75.6422 --75.6344 --75.6562 --75.6281 --75.6453 --75.6297 --75.6344 --75.6297 --75.6359 --75.6266 --75.6328 --75.6359 --75.65 --75.6328 --75.6375 --75.6531 --75.6375 --75.6359 --75.6406 --75.6438 --75.6375 --75.6312 --75.6391 --75.6359 --75.6453 --75.6438 --75.6453 --75.6438 --75.6484 --75.65 --75.6562 --75.6359 --75.6375 --75.6297 --75.6422 --75.6344 --75.6516 --75.6391 --75.6391 --75.6453 --75.6422 --75.65 --75.6281 --75.6344 --75.6469 --75.6359 --75.6375 --75.6406 --75.6438 --75.6375 --75.6422 --75.6391 --75.6406 --75.6297 --75.6516 --75.6266 --75.6516 --75.6484 --75.6375 --75.6453 --75.6297 --75.6375 --75.6359 --75.6328 --75.6281 --75.6266 --75.6406 --75.6344 --75.6266 --75.6281 --75.6422 --75.6234 --75.6375 --75.6391 --75.6203 --75.6422 --75.6406 --75.6375 --75.6438 --75.6438 --75.6391 --75.6406 --75.6484 --75.6359 --75.6375 --75.6328 --75.6469 --75.6375 --75.6453 --75.6562 --75.6656 --75.6422 --75.6641 --75.6516 --75.6594 --75.6641 --75.6594 --75.6516 --75.6391 --75.6516 --75.6594 --75.6578 --75.6703 --75.6516 --75.6516 --75.6516 --75.6484 --75.6547 --75.6469 --75.6406 --75.6516 --75.6578 --75.6578 --75.65 --75.6516 --75.6562 --75.6375 --75.6391 --75.6391 --75.6516 --75.6469 --75.6516 --75.6422 --75.6578 --75.6516 --75.6547 --75.6391 --75.6578 --75.6453 --75.6594 --75.65 --75.6562 --75.6484 --75.65 --75.6547 --75.6609 --75.6516 --75.6484 --75.6469 --75.6453 --75.6359 --75.6391 --75.6641 --75.6625 --75.6531 --75.6578 --75.6531 --75.6516 --75.6438 --75.6453 --75.6438 --75.6406 --75.6484 --75.6484 --75.6438 --75.6547 --75.65 --75.6453 --75.6547 --75.6359 --75.6453 --75.6438 --75.65 --75.6516 --75.6578 --75.6562 --75.6469 --75.6547 --75.6453 --75.6641 --75.6438 --75.6625 --75.6469 --75.6594 --75.6438 --75.6484 --75.6469 --75.6531 --75.6438 --75.65 --75.6609 --75.65 --75.6453 --75.6484 --75.6516 --75.6422 --75.6438 --75.6406 --75.6453 --75.6453 --75.6453 --75.6453 --75.6281 --75.6578 --75.6391 --75.6531 --75.6516 --75.6484 --75.6469 --75.6469 --75.6469 --75.6375 --75.6516 --75.6406 --75.65 --75.6516 --75.6469 --75.6312 --75.65 --75.6297 --75.6547 --75.6516 --75.6422 --75.6375 --75.6406 --75.6391 --75.6375 --75.6469 --75.6406 --75.6391 --75.6453 --75.6391 --75.6359 --75.6359 --75.6406 --75.6453 --75.6359 --75.6531 --75.6359 --75.6438 --75.6406 --75.6484 --75.6375 --75.6438 --75.6531 --75.6484 --75.65 --75.6422 --75.6406 --75.6375 --75.6469 --75.65 --75.65 --75.6516 --75.6422 --75.6453 --75.6641 --75.6609 --75.6406 --75.6359 --75.6438 --75.6641 --75.65 --75.65 --75.6578 --75.6562 --75.6516 --75.6484 --75.6484 --75.6484 --75.6516 --75.6547 --75.6406 --75.6594 --75.6469 --75.6406 --75.6547 --75.6547 --75.6484 --75.6656 --75.6672 --75.6516 --75.6578 --75.6375 --75.6562 --75.6516 --75.6641 --75.65 --75.6703 --75.6547 --75.6594 --75.65 --75.6516 --75.6484 --75.65 --75.6516 --75.6422 --75.6625 --75.65 --75.6422 --75.6531 --75.6391 --75.6531 --75.6438 --75.6625 --75.6422 --75.6469 --75.6687 --75.6641 --75.6562 --75.6531 --75.6609 --75.6562 --75.6594 --75.6609 --75.6578 --75.6562 --75.6469 --75.6453 --75.6531 --75.6641 --75.6562 --75.6547 --75.6594 --75.6547 --75.6516 --75.6641 --75.6578 --75.6641 --75.6641 --75.6578 --75.6578 --75.6625 --75.6469 --75.6453 --75.6594 --75.6594 --75.6625 --75.6516 --75.6484 --75.6594 --75.6594 --75.6594 --75.65 --75.6625 --75.6703 --75.6531 --75.6594 --75.6422 --75.6609 --75.6609 --75.65 --75.6484 --75.6609 --75.6703 --75.6641 --75.6594 --75.6703 --75.6531 --75.6531 --75.6453 --75.6562 --75.6594 --75.65 --75.6625 --75.6578 --75.6422 --75.6516 --75.65 --75.6625 --75.6578 --75.6609 --75.6531 --75.6516 --75.6719 --75.6531 --75.6469 --75.6719 --75.6609 --75.6578 --75.6703 --75.6719 --75.6453 --75.6719 --75.6656 --75.6781 --75.6781 --75.6734 --75.6813 --75.6687 --75.6719 --75.6672 --75.6672 --75.6578 --75.6672 --75.6547 --75.6641 --75.6719 --75.6547 --75.6625 --75.6672 --75.6641 --75.6734 --75.6625 --75.6719 --75.6672 --75.6719 --75.6703 --75.6656 --75.6625 --75.6594 --75.675 --75.6734 --75.6547 --75.6484 --75.6625 --75.6594 --75.6687 --75.6828 --75.6766 --75.675 --75.6656 --75.6859 --75.675 --75.6687 --75.6813 --75.6641 --75.6656 --75.6797 --75.6656 --75.6641 --75.6844 --75.6703 --75.6719 --75.675 --75.6625 --75.6703 --75.6766 --75.6641 --75.6687 --75.6781 --75.6797 --75.6609 --75.675 --75.6672 --75.6766 --75.6844 --75.6687 --75.6766 --75.6656 --75.6781 --75.6734 --75.6609 --75.6641 --75.6734 --75.6797 --75.6703 --75.6766 --75.6703 --75.6719 --75.6844 --75.6781 --75.6813 --75.6672 --75.6766 --75.675 --75.6969 --75.6797 --75.6906 --75.6766 --75.6813 --75.6984 --75.6969 --75.6844 --75.6859 --75.6969 --75.6922 --75.6922 --75.6859 --75.6797 --75.6797 --75.6781 --75.6703 --75.6687 --75.6875 --75.6813 --75.7 --75.6813 --75.6828 --75.6859 --75.6656 --75.6828 --75.675 --75.6844 --75.6813 --75.6781 --75.6797 --75.6766 --75.6734 --75.6781 --75.6813 --75.6687 --75.6766 --75.6813 --75.6594 --75.6625 --75.6672 --75.6719 --75.6875 --75.6672 --75.6703 --75.675 --75.6844 --75.6766 --75.6719 --75.6797 --75.6719 --75.6687 --75.6781 --75.6766 --75.6766 --75.6813 --75.6766 --75.6781 --75.6672 --75.6828 --75.6766 --75.6781 --75.6828 --75.6687 --75.6844 --75.6813 --75.6828 --75.6891 --75.6859 --75.6687 --75.6969 --75.6797 --75.6766 --75.6969 --75.6797 --75.675 --75.6844 --75.6828 --75.6766 --75.6703 --75.6937 --75.675 --75.6828 --75.6828 --75.675 --75.6937 --75.6813 --75.6828 --75.6797 --75.6781 --75.6813 --75.6859 --75.6844 --75.6828 --75.6641 --75.675 --75.6609 --75.6813 --75.6734 --75.675 --75.6781 --75.6766 --75.6625 --75.6656 --75.6828 --75.6656 --75.6672 --75.6906 --75.6766 --75.6813 --75.6781 --75.6781 --75.6734 --75.6641 --75.6641 --75.6828 --75.6875 --75.6703 --75.6641 --75.6797 --75.6719 --75.6703 --75.6672 --75.6719 --75.6672 --75.6766 --75.6734 --75.6766 --75.6766 --75.6609 --75.6813 --75.6594 --75.6703 --75.6828 --75.6734 --75.6922 --75.6891 --75.6766 --75.6797 --75.6891 --75.6797 --75.6625 --75.675 --75.6703 --75.6766 --75.6766 --75.6578 --75.6672 --75.6797 --75.6656 --75.6781 --75.6828 --75.6594 --75.6797 --75.6797 --75.6625 --75.6781 --75.6672 --75.6781 --75.6703 --75.6687 --75.6781 --75.6813 --75.6875 --75.6703 --75.6609 --75.6734 --75.6875 --75.675 --75.6906 --75.6969 --75.6969 --75.6797 --75.675 --75.6953 --75.6844 --75.6734 --75.6828 --75.6719 --75.6687 --75.6859 --75.6781 --75.6813 --75.6922 --75.6844 --75.6797 --75.6781 --75.6891 --75.6828 --75.6828 --75.6797 --75.6703 --75.6859 --75.6719 --75.675 --75.6781 --75.6844 --75.6797 --75.6703 --75.6703 --75.6797 --75.6859 --75.6828 --75.6906 --75.6984 --75.6781 --75.6891 --75.6969 --75.6859 --75.6937 --75.6844 --75.6719 --75.6719 --75.6875 --75.6937 --75.6672 --75.6703 --75.6781 --75.6703 --75.6766 --75.6844 --75.6797 --75.6844 --75.6813 --75.6844 --75.6828 --75.6734 --75.6766 --75.6906 --75.6703 --75.6703 --75.6813 --75.6891 --75.6703 --75.6844 --75.6828 --75.6844 --75.6844 --75.6813 --75.6719 --75.6859 --75.6797 --75.6813 --75.6859 --75.6859 --75.6875 --75.6641 --75.6906 --75.6828 --75.6844 --75.6687 --75.6797 --75.6813 --75.6813 --75.6844 --75.6734 --75.675 --75.6719 --75.6859 --75.6859 --75.6984 --75.6828 --75.6672 --75.6906 --75.6766 --75.6875 --75.6969 --75.6984 --75.6969 --75.7031 --75.6906 --75.6969 --75.6906 --75.6844 --75.7 --75.6875 --75.7078 --75.7125 --75.6969 --75.7016 --75.7016 --75.675 --75.6906 --75.6891 --75.6781 --75.6937 --75.6797 --75.6937 --75.6781 --75.675 --75.675 --75.7016 --75.6922 --75.6859 --75.6969 --75.6766 --75.6906 --75.6891 --75.6906 --75.6891 --75.6891 --75.6875 --75.6937 --75.7031 --75.7016 --75.6906 --75.7031 --75.6813 --75.6906 --75.6906 --75.6906 --75.6766 --75.6875 --75.6859 --75.6828 --75.6922 --75.6984 --75.6766 --75.6781 --75.6875 --75.7 --75.6922 --75.6922 --75.7031 --75.6875 --75.7063 --75.6891 --75.6875 --75.6828 --75.6906 --75.6844 --75.6859 --75.6906 --75.6875 --75.6797 --75.6781 --75.6797 --75.6734 --75.6844 --75.6828 --75.6922 --75.6813 --75.6891 --75.6891 --75.6844 --75.6859 --75.6781 --75.6813 --75.6828 --75.6906 --75.6797 --75.6891 --75.6937 --75.6953 --75.6719 --75.6891 --75.6797 --75.6813 --75.6844 --75.675 --75.6797 --75.6797 --75.6953 --75.6953 --75.6828 --75.6781 --75.7 --75.6937 --75.6891 --75.6969 --75.6922 --75.7 --75.6875 --75.6937 --75.6844 --75.6875 --75.6953 --75.6922 --75.6828 --75.6953 --75.6969 --75.6828 --75.7 --75.7 --75.7109 --75.7156 --75.6937 --75.6922 --75.6937 --75.6906 --75.6875 --75.6922 --75.6922 --75.6813 --75.6937 --75.6891 --75.6969 --75.6953 --75.6906 --75.7 --75.6906 --75.6984 --75.6828 --75.7031 --75.7 --75.6937 --75.6875 --75.7031 --75.6969 --75.7031 --75.6984 --75.6969 --75.7 --75.7078 --75.7094 --75.6984 --75.6922 --75.7031 --75.7078 --75.7109 --75.7047 --75.7031 --75.6984 --75.7125 --75.7016 --75.7031 --75.7031 --75.7 --75.7063 --75.7109 --75.7063 --75.7109 --75.7094 --75.7047 --75.7 --75.7188 --75.7078 --75.7141 --75.7063 --75.7047 --75.7094 --75.7047 --75.7016 --75.7172 --75.7063 --75.7047 --75.6953 --75.7078 --75.7172 --75.6953 --75.7 --75.7063 --75.7016 --75.7125 --75.6984 --75.6937 --75.7188 --75.7063 --75.7094 --75.7078 --75.7063 --75.7094 --75.7016 --75.7031 --75.7172 --75.7063 --75.6828 --75.7016 --75.7031 --75.6984 --75.7172 --75.6969 --75.7 --75.7047 --75.6906 --75.6906 --75.6969 --75.6937 --75.6906 --75.7016 --75.6891 --75.7047 --75.7016 --75.7063 --75.7047 --75.7063 --75.6984 --75.6969 --75.6984 --75.7 --75.7016 --75.7078 --75.6891 --75.7031 --75.6922 --75.7188 --75.7109 --75.7016 --75.6891 --75.6984 --75.7047 --75.7 --75.6984 --75.6953 --75.7156 --75.7063 --75.7078 --75.7063 --75.7031 --75.7078 --75.6984 --75.6969 --75.6984 --75.7016 --75.6937 --75.7031 --75.7047 --75.7 --75.7047 --75.7094 --75.6922 --75.7016 --75.7109 --75.6891 --75.7 --75.6953 --75.7 --75.6922 --75.7 --75.6922 --75.7016 --75.7047 --75.7063 --75.7063 --75.7031 --75.7031 --75.7016 --75.6969 --75.7047 --75.7109 --75.7109 --75.6984 --75.7047 --75.7016 --75.7094 --75.7063 --75.6922 --75.6969 --75.7063 --75.7172 --75.6984 --75.7047 --75.7141 --75.7063 --75.7031 --75.7016 --75.7156 --75.7219 --75.7219 --75.6969 --75.7156 --75.7016 --75.725 --75.7063 --75.7109 --75.7125 --75.7156 --75.7078 --75.7078 --75.7063 --75.7031 --75.7 --75.6984 --75.7078 --75.7141 --75.7047 --75.6953 --75.7016 --75.6969 --75.7016 --75.6984 --75.7031 --75.7031 --75.6953 --75.6969 --75.7031 --75.6969 --75.6984 --75.6953 --75.6953 --75.6875 --75.7063 --75.6953 --75.6906 --75.6875 --75.6891 --75.7031 --75.6875 --75.7016 --75.6984 --75.6937 --75.6844 --75.7 --75.7 --75.6891 --75.6984 --75.6969 --75.7063 --75.7078 --75.7016 --75.6922 --75.7109 --75.7063 --75.7094 --75.7078 --75.7141 --75.6984 --75.7188 --75.7125 --75.7203 --75.7094 --75.7125 --75.7094 --75.7031 --75.7172 --75.6906 --75.7031 --75.7063 --75.7 --75.7094 --75.7109 --75.6969 --75.7109 --75.7063 --75.7125 --75.7188 --75.7172 --75.7141 --75.7063 --75.7 --75.6969 --75.6953 --75.7078 --75.7125 --75.7 --75.7 --75.7109 --75.6984 --75.7188 --75.7141 --75.7047 --75.7016 --75.7078 --75.7016 --75.7047 --75.6922 --75.6984 --75.6875 --75.6969 --75.7094 --75.7094 --75.6969 --75.7078 --75.6937 --75.6937 --75.7109 --75.6969 --75.7172 --75.7141 --75.7188 --75.7172 --75.7203 --75.7109 --75.7063 --75.6875 --75.7063 --75.7125 --75.6984 --75.7031 --75.7156 --75.7047 --75.7016 --75.6984 --75.7078 --75.7141 --75.7125 --75.7094 --75.7125 --75.7094 --75.7109 --75.7109 --75.7031 --75.7109 --75.7063 --75.7109 --75.7063 --75.6984 --75.6969 --75.7 --75.7188 --75.7078 --75.7078 --75.6969 --75.7047 --75.7219 --75.7172 --75.7125 --75.7078 --75.7188 --75.7047 --75.7078 --75.7203 --75.7203 --75.6906 --75.7031 --75.6797 --75.7031 --75.6937 --75.7031 --75.7188 --75.7109 --75.6953 --75.7266 --75.6984 --75.6984 --75.7031 --75.7234 --75.7063 --75.7078 --75.6953 --75.7016 --75.7 --75.7109 --75.7047 --75.7266 --75.6969 --75.7125 --75.7031 --75.6984 --75.7 --75.7063 --75.7078 --75.7109 --75.7063 --75.7063 --75.7016 --75.6953 --75.7125 --75.6922 --75.6984 --75.6969 --75.6953 --75.6984 --75.6844 --75.7125 --75.7047 --75.7094 --75.7047 --75.7156 --75.7219 --75.6969 --75.7125 --75.7188 --75.6984 --75.7109 --75.7063 --75.7063 --75.6844 --75.7016 --75.6859 --75.6969 --75.7047 --75.6969 --75.7125 --75.7141 --75.7141 --75.7109 --75.7063 --75.7047 --75.7172 --75.7078 --75.7156 --75.7031 --75.7031 --75.7125 --75.7109 --75.7125 --75.7016 --75.7094 --75.725 --75.7125 --75.7094 --75.7125 --75.7172 --75.7109 --75.7109 --75.7234 --75.7156 --75.7172 --75.725 --75.7219 --75.7141 --75.725 --75.7203 --75.7031 --75.725 --75.7328 --75.7094 --75.7172 --75.7141 --75.7266 --75.725 --75.7156 --75.7266 --75.7188 --75.7125 --75.7063 --75.7094 --75.7141 --75.7219 --75.7203 --75.7094 --75.725 --75.7156 --75.7344 --75.7125 --75.7203 --75.7109 --75.7078 --75.6984 --75.6922 --75.7047 --75.7078 --75.7016 --75.7078 --75.7141 --75.7109 --75.6969 --75.7047 --75.7031 --75.6906 --75.7094 --75.6922 --75.6953 --75.7109 --75.7094 --75.7109 --75.7109 --75.7078 --75.7141 --75.7188 --75.7047 --75.7297 --75.7172 --75.7156 --75.7172 --75.7 --75.7125 --75.7078 --75.7172 --75.7203 --75.7156 --75.7266 --75.7188 --75.7203 --75.7234 --75.725 --75.7234 --75.7141 --75.7063 --75.7172 --75.7172 --75.7203 --75.7141 --75.7125 --75.7328 --75.7188 --75.7297 --75.7328 --75.7094 --75.7031 --75.7063 --75.7063 --75.7141 --75.7172 --75.6953 --75.7125 --75.7094 --75.7109 --75.7344 --75.7047 --75.7141 --75.7078 --75.7078 --75.7266 --75.7172 --75.7188 --75.7031 --75.7156 --75.7188 --75.7234 --75.7219 --75.7328 --75.7188 --75.7156 --75.7219 --75.7063 --75.7141 --75.7047 --75.7172 --75.7172 --75.7172 --75.7141 --75.7047 --75.7156 --75.7109 --75.7203 --75.6891 --75.7203 --75.7172 --75.7063 --75.7078 --75.7125 --75.7234 --75.7203 --75.7078 --75.6984 --75.7266 --75.7219 --75.7109 --75.7047 --75.7125 --75.7125 --75.7109 --75.7203 --75.7016 --75.7156 --75.7172 --75.7125 --75.7266 --75.7234 --75.7297 --75.7156 --75.7141 --75.7078 --75.7172 --75.7047 --75.7094 --75.7094 --75.7094 --75.7125 --75.7063 --75.7094 --75.7078 --75.7047 --75.6984 --75.7094 --75.725 --75.7234 --75.7094 --75.6984 --75.7141 --75.7063 --75.6984 --75.7031 --75.7078 --75.6969 --75.7141 --75.6984 --75.7125 --75.7156 --75.7094 --75.7031 --75.6969 --75.7094 --75.7156 --75.7219 --75.7063 --75.7078 --75.7266 --75.7125 --75.7125 --75.7188 --75.7203 --75.7109 --75.725 --75.7156 --75.7234 --75.7203 --75.7094 --75.7172 --75.7328 --75.7297 --75.7094 --75.7141 --75.7281 --75.7203 --75.7172 --75.7219 --75.725 --75.7094 --75.7156 --75.7094 --75.7188 --75.725 --75.7141 --75.7047 --75.7172 --75.7234 --75.7156 --75.7188 --75.7312 --75.7203 --75.7281 --75.7156 --75.7266 --75.7234 --75.725 --75.7219 --75.7312 --75.7188 --75.7078 --75.7281 --75.7156 --75.7172 --75.7125 --75.7281 --75.7281 --75.7234 --75.7219 --75.7094 --75.7109 --75.7125 --75.7281 --75.7172 --75.725 --75.7188 --75.7391 --75.7188 --75.7328 --75.7359 --75.7188 --75.7234 --75.7078 --75.725 --75.7234 --75.7188 --75.7234 --75.7281 --75.7359 --75.7281 --75.7234 --75.7391 --75.7438 --75.7312 --75.7219 --75.7297 --75.7312 --75.7359 --75.7219 --75.7375 --75.7219 --75.7266 --75.7266 --75.7297 --75.7281 --75.725 --75.7266 --75.7234 --75.7234 --75.7125 --75.7203 --75.7297 --75.7125 --75.7297 --75.7297 --75.7188 --75.7219 --75.7312 --75.7188 --75.7281 --75.7234 --75.7438 --75.7234 --75.7344 --75.7203 --75.7188 --75.7 --75.7234 --75.7344 --75.7297 --75.7406 --75.7344 --75.7344 --75.7344 --75.7375 --75.7094 --75.725 --75.7281 --75.7328 --75.7219 --75.7297 --75.7125 --75.7125 --75.7281 --75.7234 --75.7172 --75.7156 --75.7172 --75.7234 --75.6984 --75.725 --75.725 --75.7234 --75.7312 --75.7172 --75.7203 --75.7328 --75.7234 --75.7234 --75.7359 --75.7344 --75.7312 --75.7375 --75.7203 --75.725 --75.7156 --75.7203 --75.7109 --75.7203 --75.7188 --75.7297 --75.7234 --75.7281 --75.7281 --75.7188 --75.7312 --75.7281 --75.7297 --75.7312 --75.7359 --75.7203 --75.7328 --75.7375 --75.7266 --75.7281 --75.7328 --75.7219 --75.7234 --75.7266 --75.7391 --75.7359 --75.7312 --75.725 --75.725 --75.7438 --75.7359 --75.7359 --75.7328 --75.7188 --75.7312 --75.7219 --75.7281 --75.7266 --75.7359 --75.725 --75.7469 --75.7188 --75.725 --75.7328 --75.7297 --75.7312 --75.7266 --75.7266 --75.7203 --75.7328 --75.725 --75.7281 --75.7297 --75.7391 --75.7312 --75.7266 --75.7359 --75.7281 --75.725 --75.7391 --75.7391 --75.7297 --75.7219 --75.7172 --75.7172 --75.7141 --75.7172 --75.7156 --75.725 --75.7203 --75.7219 --75.7328 --75.725 --75.7219 --75.7109 --75.7328 --75.7219 --75.7312 --75.7203 --75.7312 --75.7453 --75.7297 --75.7172 --75.7266 --75.7328 --75.7281 --75.7375 --75.7203 --75.7375 --75.7078 --75.7219 --75.7281 --75.7172 --75.7266 --75.7172 --75.7188 --75.7203 --75.725 --75.7188 --75.7234 --75.7297 --75.7312 --75.7344 --75.7234 --75.7266 --75.7172 --75.725 --75.725 --75.7172 --75.7281 --75.7312 --75.7297 --75.7109 --75.7156 --75.7266 --75.7188 --75.7141 --75.7156 --75.7109 --75.7094 --75.7219 --75.7188 --75.7109 --75.7312 --75.7422 --75.7422 --75.7297 --75.7375 --75.7312 --75.7297 --75.7234 --75.7266 --75.7266 --75.7234 --75.7484 --75.7297 --75.7234 --75.7344 --75.7328 --75.7359 --75.7438 --75.7297 --75.7297 --75.7219 --75.7281 --75.7219 --75.7375 --75.7281 --75.7266 --75.7188 --75.7312 --75.7375 --75.7172 --75.7141 --75.7172 --75.7266 --75.7312 --75.7281 --75.7141 --75.7312 --75.7141 --75.7312 --75.7391 --75.7281 --75.7266 --75.7188 --75.7297 --75.7422 --75.7188 --75.7422 --75.7172 --75.7281 --75.7375 --75.7234 --75.7359 --75.7281 --75.7453 --75.7516 --75.7391 --75.7297 --75.7281 --75.7406 --75.75 --75.7406 --75.7312 --75.7469 --75.7359 --75.7297 --75.7438 --75.7312 --75.7469 --75.7438 --75.7469 --75.7391 --75.7406 --75.7266 --75.7344 --75.7328 --75.7406 --75.7344 --75.7266 --75.7344 --75.7391 --75.7359 --75.7438 --75.7406 --75.7203 --75.7234 --75.7344 --75.725 --75.7422 --75.7219 --75.7312 --75.7297 --75.7344 --75.7266 --75.7266 --75.7188 --75.7188 --75.7234 --75.7297 --75.7281 --75.7219 --75.7484 --75.7375 --75.7375 --75.7438 --75.7406 --75.7344 --75.7328 --75.7375 --75.7391 --75.7359 --75.7266 --75.7312 --75.7297 --75.7422 --75.7156 --75.7203 --75.7328 --75.7391 --75.7281 --75.7406 --75.7234 --75.7406 --75.7312 --75.7266 --75.725 --75.7312 --75.7188 --75.7484 --75.7359 --75.7328 --75.7453 --75.7359 --75.7234 --75.7234 --75.7328 --75.7391 --75.7297 --75.7359 --75.7422 --75.7297 --75.7375 --75.7375 --75.7469 --75.7266 --75.7359 --75.7391 --75.7453 --75.7422 --75.7297 --75.7469 --75.7391 --75.7328 --75.7312 --75.7281 --75.7188 --75.7328 --75.7312 --75.7406 --75.7328 --75.725 --75.7281 --75.7219 --75.7297 --75.7156 --75.7281 --75.7281 --75.7297 --75.7375 --75.7188 --75.7344 --75.7109 --75.7219 --75.7344 --75.7312 --75.7234 --75.7234 --75.7266 --75.7188 --75.7438 --75.7406 --75.7391 --75.7453 --75.7438 --75.7312 --75.7375 --75.7219 --75.7203 --75.7375 --75.7281 --75.7219 --75.7297 --75.7266 --75.7375 --75.7281 --75.7203 --75.7297 --75.7453 --75.7359 --75.7375 --75.7469 --75.7422 --75.7328 --75.7281 --75.7297 --75.7359 --75.7328 --75.7438 --75.7312 --75.7281 --75.7438 --75.7594 --75.7344 --75.7484 --75.7328 --75.7359 --75.7406 --75.7547 --75.7516 --75.7391 --75.7484 --75.7578 --75.7453 --75.7375 --75.7469 --75.7516 --75.7312 --75.7422 --75.7438 --75.7422 --75.7406 --75.7469 --75.7438 --75.7359 --75.7312 --75.7266 --75.7422 --75.7469 --75.7578 --75.75 --75.7359 --75.7219 --75.7406 --75.7328 --75.7375 --75.7453 --75.7375 --75.7469 --75.7266 --75.7297 --75.7328 --75.7484 --75.7281 --75.7391 --75.7234 --75.7422 --75.7281 --75.7344 --75.7484 --75.7391 --75.7453 --75.7375 --75.7469 --75.7469 --75.7359 --75.7406 --75.7547 --75.7391 --75.7422 --75.7344 --75.7453 --75.7328 --75.7453 --75.7438 --75.7594 --75.7531 --75.7422 --75.7578 --75.7344 --75.7422 --75.725 --75.7438 --75.7406 --75.7422 --75.7469 --75.7578 --75.7328 --75.7438 --75.7422 --75.7234 --75.7531 --75.7453 --75.7406 --75.7359 --75.7391 --75.7438 --75.7344 --75.75 --75.7484 --75.7359 --75.75 --75.7484 --75.7516 --75.7359 --75.7328 --75.7312 --75.7391 --75.7391 --75.7359 --75.7375 --75.7453 --75.7422 --75.7375 --75.7391 --75.7422 --75.7344 --75.7391 --75.7359 --75.7422 --75.7344 --75.7234 --75.7406 --75.7281 --75.7359 --75.7469 --75.7359 --75.7375 --75.7484 --75.7375 --75.7281 --75.7344 --75.7328 --75.7328 --75.7359 --75.7312 --75.7297 --75.7438 --75.7359 --75.7391 --75.7344 --75.7344 --75.7422 --75.7422 --75.7438 --75.7391 --75.7266 --75.7594 --75.7391 --75.7391 --75.7547 --75.7531 --75.7406 --75.7484 --75.7484 --75.7547 --75.7422 --75.7328 --75.7344 --75.7422 --75.7391 --75.725 --75.7391 --75.7469 --75.7438 --75.7453 --75.7359 --75.7422 --75.7375 --75.7375 --75.7484 --75.7453 --75.7297 --75.7531 --75.725 --75.7438 --75.7344 --75.7312 --75.7438 --75.7391 --75.7438 --75.7375 --75.7422 --75.75 --75.7391 --75.7328 --75.7453 --75.7438 --75.7375 --75.7312 --75.7297 --75.7234 --75.7422 --75.7391 --75.7469 --75.7391 --75.7312 --75.7281 --75.7469 --75.7453 --75.7359 --75.7406 --75.7422 --75.7469 --75.7406 --75.7469 --75.7516 --75.7453 --75.7484 --75.7391 --75.7203 --75.7438 --75.7469 --75.7328 --75.7438 --75.7359 --75.7328 --75.7375 --75.7344 --75.7359 --75.7328 --75.7453 --75.7547 --75.7516 --75.7375 --75.7344 --75.7359 --75.7562 --75.7328 --75.7406 --75.7531 --75.7312 --75.7438 --75.7422 --75.7156 --75.7375 --75.7359 --75.7328 --75.725 --75.7469 --75.7469 --75.7234 --75.7391 --75.7391 --75.7375 --75.7391 --75.7328 --75.7344 --75.7375 --75.7375 --75.7328 --75.7406 --75.7375 --75.7359 --75.7375 --75.7516 --75.7438 --75.7516 --75.7484 --75.7422 --75.7438 --75.7438 --75.7406 --75.7359 --75.7422 --75.7391 --75.7328 --75.7344 --75.7328 --75.7312 --75.725 --75.7359 --75.7344 --75.7469 --75.7312 --75.7375 --75.7344 --75.7391 --75.7312 --75.7469 --75.7344 --75.7469 --75.7422 --75.7328 --75.7422 --75.7469 --75.7297 --75.7547 --75.7328 --75.75 --75.7297 --75.7531 --75.7438 --75.7406 --75.7344 --75.7359 --75.7562 --75.7312 --75.7422 --75.7516 --75.7406 --75.7312 --75.7406 --75.725 --75.7312 --75.7312 --75.7312 --75.7328 --75.7375 --75.7297 --75.7219 --75.7312 --75.7266 --75.725 --75.7312 --75.75 --75.7375 --75.7375 --75.7375 --75.7406 --75.7469 --75.7359 --75.7391 --75.7391 --75.7422 --75.7359 --75.7359 --75.7391 --75.7469 --75.7391 --75.7469 --75.7344 --75.7453 --75.7547 --75.7453 --75.7391 --75.7344 --75.7391 --75.7312 --75.7281 --75.7453 --75.7453 --75.7438 --75.725 --75.7438 --75.7484 --75.7516 --75.7391 --75.7438 --75.7406 --75.7391 --75.7484 --75.7484 --75.7422 --75.7484 --75.7391 --75.7453 --75.7344 --75.7422 --75.7422 --75.7328 --75.7469 --75.7328 --75.75 --75.7312 --75.7469 --75.7422 --75.7469 --75.7391 --75.7531 --75.7391 --75.7281 --75.7359 --75.7422 --75.7453 --75.7375 --75.7328 --75.7375 --75.7469 --75.7359 --75.7359 --75.75 --75.7312 --75.7469 --75.7469 --75.7484 --75.7562 --75.7328 --75.7297 --75.7453 --75.7547 --75.7469 --75.7391 --75.7422 --75.7344 --75.7297 --75.7438 --75.7391 --75.7172 --75.7375 --75.7391 --75.7312 --75.7281 --75.7312 --75.7328 --75.725 --75.7422 --75.75 --75.7328 --75.7547 --75.7438 --75.7484 --75.7453 --75.7453 --75.7297 --75.7422 --75.7391 --75.7328 --75.7203 --75.7391 --75.7328 --75.7453 --75.7344 --75.7406 --75.7453 --75.7469 --75.7359 --75.7484 --75.7469 --75.7484 --75.7328 --75.7438 --75.7406 --75.75 --75.7266 --75.7375 --75.7359 --75.7422 --75.7391 --75.7406 --75.7375 --75.7391 --75.7297 --75.7328 --75.7234 --75.7406 --75.7438 --75.7531 --75.7469 --75.7531 --75.7312 --75.725 --75.7516 --75.7312 --75.7328 --75.7406 --75.7375 --75.7594 --75.7359 --75.7484 --75.7453 --75.7438 --75.75 --75.7531 --75.75 --75.7391 --75.7328 --75.75 --75.7422 --75.7375 --75.7422 --75.7422 --75.7391 --75.7484 --75.7469 --75.7422 --75.7469 --75.7422 --75.7453 --75.7344 --75.7484 --75.7438 --75.7391 --75.75 --75.7562 --75.7531 --75.7641 --75.7547 --75.7531 --75.7438 --75.7406 --75.7531 --75.7391 --75.7406 --75.7422 --75.7422 --75.7531 --75.7391 --75.7531 --75.7422 --75.7359 --75.7469 --75.7531 --75.7469 --75.7594 --75.75 --75.7344 --75.7438 --75.7453 --75.7359 --75.7469 --75.7422 --75.7359 --75.7359 --75.7672 --75.75 --75.7453 --75.7516 --75.7516 --75.7641 --75.7516 --75.7406 --75.7438 --75.7594 --75.7438 --75.7562 --75.7609 --75.7531 --75.7531 --75.7672 --75.7547 --75.7641 --75.7531 --75.7562 --75.7531 --75.7531 --75.7516 --75.7375 --75.7625 --75.7562 --75.7625 --75.7625 --75.7469 --75.7562 --75.75 --75.7562 --75.7484 --75.7625 --75.7484 --75.75 --75.7469 --75.7688 --75.7625 --75.7578 --75.7453 --75.7531 --75.7484 --75.7422 --75.7469 --75.7562 --75.7547 --75.7453 --75.75 --75.7469 --75.7453 --75.7422 --75.7547 --75.7484 --75.7469 --75.7656 --75.7578 --75.7531 --75.7531 --75.7391 --75.7547 --75.7484 --75.7547 --75.7578 --75.75 --75.7578 --75.7531 --75.75 --75.7453 --75.7453 --75.7375 --75.7422 --75.75 --75.7484 --75.7547 --75.7438 --75.7641 --75.75 --75.7703 --75.7438 --75.7406 --75.7328 --75.75 --75.7406 --75.7562 --75.7484 --75.7578 --75.7547 --75.7469 --75.7484 --75.7484 --75.7531 --75.7391 --75.7609 --75.7484 --75.7531 --75.7641 --75.7625 --75.7422 --75.7438 --75.7453 --75.7547 --75.7484 --75.7438 --75.7516 --75.7516 --75.7297 --75.75 --75.7531 --75.7562 --75.7547 --75.7641 --75.7531 --75.7578 --75.7453 --75.7516 --75.7562 --75.7422 --75.7406 --75.7453 --75.7547 --75.7375 --75.75 --75.7406 --75.7469 --75.75 --75.7453 --75.7562 --75.75 --75.7453 --75.7344 --75.7469 --75.7562 --75.7469 --75.7438 --75.7453 --75.7625 --75.7531 --75.7484 --75.7484 --75.7469 --75.7469 --75.7484 --75.7531 --75.7359 --75.7422 --75.7469 --75.75 --75.7719 --75.7641 --75.7688 --75.7641 --75.7703 --75.7594 --75.7422 --75.7594 --75.7594 --75.7562 --75.7562 --75.7547 --75.7391 --75.7656 --75.7484 --75.7422 --75.7625 --75.7547 --75.7562 --75.7484 --75.7594 --75.7422 --75.7578 --75.7531 --75.7578 --75.7594 --75.7703 --75.7578 --75.7672 --75.7766 --75.7547 --75.7594 --75.7484 --75.7469 --75.7422 --75.7562 --75.7484 --75.7453 --75.7625 --75.7719 --75.7562 --75.7453 --75.7578 --75.7656 --75.7641 --75.7484 --75.7688 --75.7625 --75.7578 --75.7594 --75.75 --75.7438 --75.7656 --75.7594 --75.7469 --75.7547 --75.7516 --75.7734 --75.7672 --75.7531 --75.7422 --75.7578 --75.7484 --75.7328 --75.75 --75.7469 --75.7375 --75.7297 --75.7359 --75.7406 --75.7422 --75.7438 --75.7453 --75.7453 --75.7484 --75.7531 --75.75 --75.7562 --75.7641 --75.7484 --75.7562 --75.7469 --75.7672 --75.7562 --75.7469 --75.7453 --75.7484 --75.75 --75.7609 --75.7453 --75.7406 --75.7547 --75.7531 --75.7578 --75.7484 --75.7562 --75.7516 --75.7578 --75.7469 --75.7562 --75.7594 --75.7672 --75.7547 --75.7672 --75.7562 --75.7828 --75.7594 --75.7719 --75.7609 --75.7531 --75.7578 --75.7531 --75.7562 --75.7609 --75.7641 --75.7547 --75.7625 --75.7625 --75.7547 --75.7594 --75.7641 --75.7594 --75.7594 --75.7562 --75.7578 --75.75 --75.7547 --75.7609 --75.7547 --75.7625 --75.7594 --75.7609 --75.7516 --75.75 --75.7484 --75.7625 --75.7703 --75.7609 --75.75 --75.7516 --75.7531 --75.7562 --75.7609 --75.7609 --75.7562 --75.7469 --75.7609 --75.7656 --75.7672 --75.7734 --75.7641 --75.7625 --75.7672 --75.7578 --75.7656 --75.7594 --75.7531 --75.7688 --75.7594 --75.7609 --75.7594 --75.7672 --75.7656 --75.7609 --75.7594 --75.7625 --75.7688 --75.7562 --75.7641 --75.7609 --75.7547 --75.7562 --75.7766 --75.7578 --75.7547 --75.7672 --75.7703 --75.7656 --75.7469 --75.7516 --75.7594 --75.7688 --75.7641 --75.7594 --75.7625 --75.7609 --75.7672 --75.7688 --75.7719 --75.7688 --75.7719 --75.7797 --75.7781 --75.7719 --75.7594 --75.7719 --75.7766 --75.7688 --75.775 --75.7906 --75.7797 --75.7766 --75.7812 --75.7719 --75.7828 --75.7828 --75.7688 --75.7688 --75.7766 --75.7703 --75.7812 --75.7672 --75.7594 --75.7688 --75.7766 --75.7734 --75.7672 --75.7594 --75.7797 --75.7828 --75.7719 --75.7937 --75.7797 --75.7922 --75.7766 --75.7688 --75.7703 --75.7891 --75.7734 --75.7641 --75.7719 --75.7812 --75.7797 --75.7719 --75.7719 --75.775 --75.7719 --75.7766 --75.7734 --75.775 --75.7719 --75.7844 --75.775 --75.7547 --75.775 --75.7734 --75.7703 --75.7766 --75.7766 --75.7797 --75.7703 --75.7625 --75.775 --75.7734 --75.7734 --75.7688 --75.7766 --75.7578 --75.7797 --75.7844 --75.7609 --75.7875 --75.7719 --75.775 --75.7781 --75.7547 --75.7625 --75.7781 --75.775 --75.7719 --75.7734 --75.7844 --75.7781 --75.7547 --75.7672 --75.7734 --75.7766 --75.7719 --75.7594 --75.7703 --75.7656 --75.7656 --75.7734 --75.7562 --75.7625 --75.7672 --75.7484 --75.7703 --75.7594 --75.7641 --75.7719 --75.7641 --75.7672 --75.7703 --75.7875 --75.775 --75.7641 --75.7656 --75.7594 --75.775 --75.7641 --75.7781 --75.7594 --75.7578 --75.7672 --75.7594 --75.7703 --75.7531 --75.7531 --75.7641 --75.75 --75.7688 --75.7641 --75.7453 --75.7609 --75.7547 --75.7562 --75.7516 --75.7594 --75.7625 --75.7594 --75.7547 --75.7594 --75.7672 --75.7516 --75.7703 --75.7516 --75.7531 --75.7438 --75.7547 --75.7719 --75.7641 --75.75 --75.7594 --75.75 --75.7562 --75.7594 --75.7625 --75.7625 --75.75 --75.7672 --75.7656 --75.7594 --75.7578 --75.7578 --75.7641 --75.7641 --75.7609 --75.7578 --75.7641 --75.7875 --75.7641 --75.7672 --75.7609 --75.7734 --75.7688 --75.7625 --75.7672 --75.7594 --75.7641 --75.7562 --75.7656 --75.7734 --75.7641 --75.7703 --75.7672 --75.7641 --75.7703 --75.7562 --75.7562 --75.7547 --75.775 --75.7469 --75.7641 --75.7672 --75.7734 --75.7672 --75.7531 --75.7594 --75.7672 --75.7703 --75.75 --75.7641 --75.7641 --75.7641 --75.7828 --75.7562 --75.7672 --75.7672 --75.7625 --75.7859 --75.7766 --75.7688 --75.7812 --75.775 --75.7656 --75.7812 --75.7781 --75.7625 --75.7781 --75.7891 --75.7797 --75.7641 --75.7844 --75.7672 --75.7891 --75.7797 --75.7734 --75.775 --75.7594 --75.7562 --75.7781 --75.7734 --75.7688 --75.7766 --75.775 --75.7625 --75.7656 --75.7719 --75.7641 --75.7703 --75.7719 --75.7609 --75.775 --75.7797 --75.775 --75.7781 --75.7797 --75.7734 --75.7703 --75.7719 --75.7734 --75.7656 --75.7547 --75.7859 --75.775 --75.7641 --75.7609 --75.775 --75.7578 --75.7719 --75.7719 --75.7594 --75.7719 --75.7609 --75.7734 --75.7781 --75.7609 --75.7625 --75.7641 --75.7641 --75.7656 --75.7703 --75.7688 --75.7734 --75.7703 --75.7609 --75.775 --75.7688 --75.7703 --75.7875 --75.7781 --75.7719 --75.7734 --75.7766 --75.7734 --75.7641 --75.7703 --75.7703 --75.7656 --75.7797 --75.7734 --75.7688 --75.7688 --75.7609 --75.7641 --75.7719 --75.7688 --75.7594 --75.7734 --75.7703 --75.7766 --75.7688 --75.775 --75.7703 --75.7688 --75.7781 --75.7562 --75.7562 --75.7641 --75.7594 --75.7781 --75.7797 --75.7656 --75.7672 --75.7672 --75.7719 --75.7547 --75.7562 --75.7703 --75.7734 --75.7688 --75.7797 --75.7703 --75.7719 --75.7672 --75.7516 --75.7734 --75.7641 --75.7703 --75.7672 --75.7766 --75.7766 --75.7812 --75.7828 --75.775 --75.775 --75.7812 --75.7844 --75.7688 --75.775 --75.7812 --75.7734 --75.7766 --75.7734 --75.7688 --75.7688 --75.7719 --75.7734 --75.7578 --75.7672 --75.7781 --75.775 --75.7672 --75.7672 --75.7672 --75.7703 --75.7734 --75.7766 --75.7672 --75.7844 --75.7734 --75.7734 --75.7812 --75.7672 --75.7844 --75.7781 --75.7609 --75.7812 --75.7734 --75.7781 --75.7688 --75.7703 --75.7672 --75.7656 --75.7781 --75.7812 --75.7688 --75.7688 --75.7672 --75.7766 --75.7656 --75.7734 --75.7641 --75.7594 --75.7625 --75.7531 --75.7906 --75.7625 --75.7703 --75.775 --75.7578 --75.775 --75.7656 --75.7562 --75.7719 --75.7766 --75.7641 --75.7719 --75.7766 --75.7797 --75.7625 --75.7719 --75.7719 --75.7688 --75.7781 --75.775 --75.7656 --75.7781 --75.7797 --75.7797 --75.7859 --75.7891 --75.7844 --75.7734 --75.7828 --75.7719 --75.7797 --75.7672 --75.7703 --75.7828 --75.7703 --75.7594 --75.7688 --75.7766 --75.7891 --75.775 --75.7703 --75.775 --75.7688 --75.775 --75.7906 --75.7812 --75.775 --75.7688 --75.7719 --75.7672 --75.7688 --75.7766 --75.7797 --75.775 --75.7703 --75.7672 --75.7797 --75.7766 --75.7734 --75.7859 --75.775 --75.7766 --75.7766 --75.7859 --75.7812 --75.7844 --75.7859 --75.7859 --75.775 --75.7922 --75.7797 --75.7719 --75.7953 --75.7797 --75.7734 --75.7734 --75.7781 --75.7766 --75.7734 --75.7734 --75.7641 --75.7734 --75.7734 --75.7656 --75.7766 --75.7719 --75.7703 --75.7625 --75.7594 --75.7688 --75.7828 --75.7703 --75.7875 --75.7812 --75.7719 --75.7812 --75.775 --75.775 --75.7656 --75.7766 --75.7766 --75.7609 --75.7812 --75.7922 --75.7891 --75.7891 --75.7906 --75.7859 --75.7859 --75.775 --75.7953 --75.7875 --75.7672 --75.7828 --75.7688 --75.7875 --75.7828 --75.8016 --75.8047 --75.7703 --75.7984 --75.7969 --75.775 --75.7875 --75.7922 --75.7812 --75.7734 --75.7891 --75.7891 --75.7828 --75.7844 --75.7984 --75.7875 --75.7906 --75.7937 --75.7875 --75.7969 --75.7937 --75.7953 --75.7922 --75.7781 --75.8016 --75.7859 --75.7984 --75.7906 --75.7781 --75.7922 --75.7953 --75.7969 --75.7922 --75.7844 --75.7859 --75.7875 --75.7937 --75.7937 --75.7891 --75.7891 --75.7953 --75.7969 --75.7922 --75.7859 --75.7797 --75.7891 --75.7953 --75.7828 --75.7734 --75.7844 --75.775 --75.8 --75.7844 --75.7906 --75.7922 --75.7734 --75.7906 --75.7828 --75.7891 --75.7937 --75.7922 --75.7969 --75.7906 --75.7953 --75.7812 --75.7906 --75.7875 --75.7937 --75.7844 --75.7984 --75.775 --75.775 --75.775 --75.775 --75.7734 --75.8 --75.7781 --75.7828 --75.7797 --75.7844 --75.7875 --75.7875 --75.7922 --75.7812 --75.7844 --75.775 --75.7781 --75.7844 --75.7875 --75.7906 --75.7906 --75.7844 --75.7781 --75.7844 --75.7688 --75.7875 --75.7797 --75.7797 --75.775 --75.7688 --75.775 --75.7922 --75.7703 --75.7734 --75.7703 --75.7812 --75.7781 --75.7906 --75.7812 --75.7891 --75.7859 --75.7719 --75.7766 --75.7703 --75.7859 --75.7844 --75.7781 --75.7906 --75.7766 --75.7891 --75.7734 --75.7922 --75.7797 --75.7906 --75.7859 --75.7703 --75.7906 --75.7812 --75.7766 --75.7797 --75.7844 --75.7734 --75.7734 --75.7766 --75.7828 --75.7766 --75.7766 --75.7891 --75.7859 --75.775 --75.7672 --75.7812 --75.775 --75.7828 --75.7844 --75.7672 --75.7766 --75.775 --75.7641 --75.7781 --75.7609 --75.7875 --75.7703 --75.7734 --75.7766 --75.7719 --75.7734 --75.7672 --75.7828 --75.7828 --75.7719 --75.7891 --75.7891 --75.7781 --75.7766 --75.7625 --75.7781 --75.7703 --75.7812 --75.7719 --75.7656 --75.7688 --75.775 --75.7812 --75.7781 --75.7953 --75.7781 --75.7672 --75.7844 --75.7844 --75.7766 --75.7906 --75.7844 --75.7766 --75.7922 --75.7922 --75.7844 --75.7781 --75.7812 --75.7812 --75.7781 --75.7859 --75.7875 --75.7828 --75.7906 --75.7906 --75.7953 --75.7922 --75.7891 --75.7828 --75.7828 --75.7891 --75.7797 --75.7922 --75.7844 --75.7953 --75.7969 --75.7953 --75.7875 --75.8031 --75.7984 --75.7984 --75.7875 --75.8 --75.7812 --75.7859 --75.7906 --75.7891 --75.7766 --75.7984 --75.7937 --75.7953 --75.7906 --75.7906 --75.7891 --75.7797 --75.7906 --75.7875 --75.7891 --75.7875 --75.7766 --75.7781 --75.7891 --75.7906 --75.7828 --75.7828 --75.7953 --75.7922 --75.7875 --75.7875 --75.7891 --75.7859 --75.7859 --75.7906 --75.7969 --75.7969 --75.7906 --75.7922 --75.7953 --75.7922 --75.7797 --75.7844 --75.7969 --75.8 --75.7906 --75.7891 --75.7891 --75.775 --75.7812 --75.7859 --75.7859 --75.8 --75.7719 --75.7953 --75.7844 --75.7797 --75.7797 --75.7891 --75.775 --75.7953 --75.7781 --75.7937 --75.7875 --75.7937 --75.7969 --75.7844 --75.7922 --75.8 --75.7984 --75.7906 --75.7937 --75.8047 --75.7828 --75.7766 --75.7781 --75.7906 --75.7812 --75.7937 --75.7906 --75.7906 --75.7906 --75.7719 --75.7781 --75.7875 --75.7922 --75.7859 --75.7812 --75.7906 --75.7797 --75.7875 --75.7828 --75.7719 --75.7922 --75.7922 --75.7906 --75.7859 --75.7875 --75.7937 --75.7828 --75.7906 --75.7859 --75.8031 --75.7937 --75.8016 --75.7953 --75.7922 --75.7797 --75.7828 --75.7953 --75.7906 --75.7953 --75.8 --75.7828 --75.7953 --75.7922 --75.7937 --75.7906 --75.7906 --75.8016 --75.7937 --75.7844 --75.7844 --75.7984 --75.7906 --75.7875 --75.7906 --75.7953 --75.7875 --75.7781 --75.7766 --75.7922 --75.7828 --75.7953 --75.7937 --75.7875 --75.7797 --75.7828 --75.7828 --75.7906 --75.7875 --75.7891 --75.7812 --75.7906 --75.7891 --75.7734 --75.7875 --75.7875 --75.8 --75.7953 --75.7969 --75.8141 --75.8016 --75.7953 --75.8141 --75.7812 --75.7937 --75.7859 --75.7922 --75.7875 --75.7891 --75.8078 --75.7922 --75.7953 --75.8063 --75.8047 --75.7969 --75.7937 --75.7922 --75.7937 --75.7875 --75.8047 --75.7844 --75.8 --75.8016 --75.7937 --75.7891 --75.8031 --75.8031 --75.7859 --75.7891 --75.7781 --75.8016 --75.7859 --75.7812 --75.7922 --75.7937 --75.7875 --75.8031 --75.8 --75.8016 --75.8031 --75.7953 --75.7922 --75.7984 --75.7844 --75.7859 --75.7844 --75.8 --75.8031 --75.8047 --75.8094 --75.7969 --75.7953 --75.7922 --75.8094 --75.7937 --75.8172 --75.8016 --75.7953 --75.7906 --75.7828 --75.8 --75.7859 --75.7953 --75.7984 --75.7922 --75.7828 --75.7875 --75.7875 --75.7922 --75.8125 --75.8031 --75.7984 --75.8094 --75.8063 --75.7922 --75.7969 --75.7906 --75.8016 --75.7937 --75.8016 --75.8031 --75.8031 --75.7891 --75.8078 --75.7953 --75.7922 --75.7953 --75.8047 --75.7969 --75.7953 --75.7875 --75.7906 --75.7891 --75.7984 --75.7937 --75.7844 --75.8031 --75.7891 --75.8063 --75.7875 --75.7828 --75.7828 --75.7953 --75.7812 --75.7937 --75.8063 --75.7844 --75.7937 --75.7953 --75.7812 --75.7906 --75.7844 --75.7969 --75.7906 --75.7937 --75.7937 --75.7953 --75.7937 --75.7859 --75.7844 --75.7984 --75.7953 --75.8063 --75.7953 --75.8031 --75.8016 --75.8016 --75.7953 --75.7937 --75.7891 --75.7906 --75.7953 --75.7922 --75.7891 --75.7859 --75.8 --75.7828 --75.7906 --75.8094 --75.7937 --75.7953 --75.7953 --75.8047 --75.7891 --75.7953 --75.7844 --75.7906 --75.7969 --75.7953 --75.7875 --75.7844 --75.7797 --75.7781 --75.8031 --75.7875 --75.7859 --75.7922 --75.7797 --75.7875 --75.7875 --75.7844 --75.7937 --75.7969 --75.7828 --75.7906 --75.7875 --75.7953 --75.7922 --75.7922 --75.8063 --75.8047 --75.7891 --75.7953 --75.7922 --75.7906 --75.7937 --75.7937 --75.7937 --75.7937 --75.8078 --75.7922 --75.7891 --75.7922 --75.7859 --75.7891 --75.7891 --75.7969 --75.8016 --75.7937 --75.8078 --75.7984 --75.7922 --75.7969 --75.7875 --75.7859 --75.7984 --75.8063 --75.7969 --75.7984 --75.8 --75.7922 --75.7906 --75.7859 --75.7906 --75.7969 --75.7812 --75.7984 --75.8 --75.7812 --75.7969 --75.7937 --75.7828 --75.7844 --75.7875 --75.7922 --75.7875 --75.7984 --75.7953 --75.7984 --75.7969 --75.7969 --75.7922 --75.8078 --75.7828 --75.7937 --75.7984 --75.7891 --75.7937 --75.8125 --75.8047 --75.7906 --75.8125 --75.8 --75.8031 --75.8078 --75.7969 --75.8125 --75.8063 --75.8094 --75.8109 --75.8078 --75.8016 --75.7937 --75.8094 --75.8063 --75.8031 --75.8187 --75.8109 --75.8031 --75.8172 --75.8 --75.8109 --75.7984 --75.8094 --75.7953 --75.7875 --75.7969 --75.8016 --75.7984 --75.8031 --75.7953 --75.8016 --75.7984 --75.7891 --75.7828 --75.7922 --75.7969 --75.7891 --75.8 --75.7859 --75.8031 --75.7984 --75.7984 --75.7844 --75.8031 --75.7937 --75.8094 --75.7859 --75.8016 --75.7875 --75.8 --75.7906 --75.8 --75.7828 --75.7969 --75.7984 --75.7891 --75.7984 --75.7969 --75.7906 --75.7984 --75.8031 --75.8063 --75.8203 --75.8063 --75.7953 --75.7969 --75.8031 --75.8031 --75.8016 --75.8078 --75.8016 --75.8 --75.8047 --75.7969 --75.7922 --75.7906 --75.7969 --75.7859 --75.8078 --75.8047 --75.8047 --75.7906 --75.8063 --75.8063 --75.8125 --75.8047 --75.8141 --75.8031 --75.8109 --75.8094 --75.7953 --75.8078 --75.7953 --75.7969 --75.8047 --75.8 --75.7859 --75.8 --75.8203 --75.8063 --75.8156 --75.8094 --75.8094 --75.8203 --75.8156 --75.8094 --75.8187 --75.8266 --75.8266 --75.8109 --75.8063 --75.8109 --75.8172 --75.8141 --75.8187 --75.8031 --75.8219 --75.8047 --75.8172 --75.7891 --75.8125 --75.8063 --75.8078 --75.7875 --75.7984 --75.8094 --75.8266 --75.8047 --75.8078 --75.8047 --75.7906 --75.8109 --75.8109 --75.8047 --75.8156 --75.8109 --75.8266 --75.8234 --75.8328 --75.8297 --75.825 --75.8078 --75.8187 --75.8219 --75.8172 --75.8156 --75.8141 --75.8156 --75.8156 --75.8203 --75.8172 --75.8187 --75.8219 --75.8203 --75.8125 --75.8094 --75.8094 --75.8172 --75.8094 --75.8172 --75.8125 --75.8094 --75.8094 --75.8047 --75.8109 --75.8094 --75.7953 --75.8063 --75.7969 --75.8016 --75.8094 --75.8172 --75.8063 --75.8094 --75.7984 --75.8031 --75.8109 --75.8031 --75.8125 --75.8094 --75.8172 --75.8141 --75.8094 --75.8094 --75.8172 --75.8109 --75.8172 --75.8 --75.8 --75.8063 --75.8109 --75.8141 --75.8187 --75.8234 --75.8141 --75.8187 --75.825 --75.8156 --75.8203 --75.8203 --75.8094 --75.8219 --75.8078 --75.8187 --75.8172 --75.8047 --75.7984 --75.8047 --75.8063 --75.8156 --75.8063 --75.8141 --75.8109 --75.8203 --75.8219 --75.8187 --75.8141 --75.7969 --75.8125 --75.8063 --75.8125 --75.8172 --75.8187 --75.8297 --75.8297 --75.8172 --75.8281 --75.8125 --75.8313 --75.8141 --75.825 --75.8187 --75.8219 --75.825 --75.8187 --75.8203 --75.8313 --75.8172 --75.8156 --75.8219 --75.8078 --75.8328 --75.8234 --75.8344 --75.8203 --75.8281 --75.8234 --75.8234 --75.8172 --75.825 --75.8219 --75.8109 --75.8094 --75.8047 --75.8234 --75.8172 --75.8203 --75.8094 --75.8047 --75.8125 --75.8125 --75.8141 --75.8078 --75.8156 --75.8078 --75.8172 --75.8047 --75.8109 --75.8125 --75.8031 --75.8125 --75.8031 --75.8094 --75.8063 --75.8 --75.8094 --75.8078 --75.8109 --75.8047 --75.8063 --75.8172 --75.8078 --75.7969 --75.8203 --75.8141 --75.8109 --75.8203 --75.8219 --75.8172 --75.8016 --75.8078 --75.8156 --75.8047 --75.8219 --75.8109 --75.8094 --75.8187 --75.8125 --75.8297 --75.8172 --75.8172 --75.8063 --75.8156 --75.8047 --75.8125 --75.8172 --75.8281 --75.7984 --75.8125 --75.8109 --75.7969 --75.8078 --75.8219 --75.8203 --75.8078 --75.8047 --75.8109 --75.8047 --75.8156 --75.8172 --75.8187 --75.8109 --75.8203 --75.8203 --75.8109 --75.8078 --75.8219 --75.8109 --75.8141 --75.8187 --75.8187 --75.8203 --75.8047 --75.8203 --75.8172 --75.8234 --75.8266 --75.8094 --75.8141 --75.8031 --75.8172 --75.825 --75.8078 --75.8109 --75.8328 --75.8109 --75.8234 --75.8094 --75.8281 --75.8016 --75.8078 --75.8109 --75.8109 --75.8078 --75.8094 --75.8187 --75.8141 --75.8375 --75.8109 --75.8234 --75.8297 --75.8187 --75.8203 --75.8047 --75.8109 --75.8094 --75.8109 --75.7953 --75.8125 --75.8219 --75.8094 --75.8141 --75.8125 --75.8297 --75.8359 --75.8172 --75.8234 --75.8281 --75.825 --75.8281 --75.825 --75.8187 --75.825 --75.8281 --75.8234 --75.8094 --75.8156 --75.8172 --75.8281 --75.8203 --75.8266 --75.8172 --75.8281 --75.8141 --75.8156 --75.8109 --75.8109 --75.8359 --75.8156 --75.8219 --75.8141 --75.8219 --75.8234 --75.8078 --75.8187 --75.8016 --75.8156 --75.8125 --75.8063 --75.8172 --75.8172 --75.8078 --75.8063 --75.8109 --75.8141 --75.8203 --75.8047 --75.8031 --75.8203 --75.8125 --75.8109 --75.8078 --75.8109 --75.8297 --75.8187 --75.8125 --75.8281 --75.8109 --75.8219 --75.8047 --75.8094 --75.8187 --75.8078 --75.8234 --75.7937 --75.8187 --75.8063 --75.8063 --75.8234 --75.8109 --75.8141 --75.8172 --75.8078 --75.8109 --75.8172 --75.8234 --75.8094 --75.8141 --75.8094 --75.8078 --75.8187 --75.8203 --75.8125 --75.8078 --75.8094 --75.8172 --75.8172 --75.8234 --75.8094 --75.8156 --75.8219 --75.8172 --75.8063 --75.8203 --75.8219 --75.8016 --75.8078 --75.8047 --75.8203 --75.8172 --75.8063 --75.8063 --75.7969 --75.8156 --75.8172 --75.8063 --75.825 --75.8313 --75.8125 --75.8281 --75.8078 --75.8234 --75.8203 --75.8297 --75.8219 --75.8281 --75.8063 --75.8109 --75.8187 --75.8125 --75.8203 --75.8141 --75.8125 --75.8172 --75.7969 --75.8156 --75.8047 --75.8 --75.8063 --75.8016 --75.8016 --75.7953 --75.8125 --75.8094 --75.8078 --75.8219 --75.8234 --75.7937 --75.8203 --75.8141 --75.8187 --75.8156 --75.8125 --75.8125 --75.8 --75.825 --75.8016 --75.8141 --75.8297 --75.8063 --75.8203 --75.8156 --75.825 --75.825 --75.8187 --75.8219 --75.825 --75.8234 --75.8063 --75.8172 --75.8234 --75.8172 --75.8187 --75.8031 --75.8297 --75.8203 --75.8344 --75.8094 --75.8266 --75.8234 --75.8016 --75.8219 --75.8078 --75.8313 --75.8187 --75.8313 --75.8109 --75.8141 --75.8219 --75.8219 --75.8281 --75.8266 --75.8063 --75.8078 --75.8219 --75.8219 --75.8266 --75.8063 --75.8266 --75.8219 --75.8281 --75.8172 --75.8187 --75.8219 --75.8234 --75.8406 --75.8344 --75.8297 --75.8125 --75.8234 --75.8375 --75.8328 --75.8281 --75.8375 --75.8297 --75.8281 --75.8281 --75.8359 --75.8375 --75.8266 --75.8234 --75.8203 --75.8187 --75.8156 --75.8234 --75.8078 --75.8125 --75.8172 --75.8125 --75.8094 --75.8063 --75.8203 --75.8234 --75.8094 --75.8203 --75.8063 --75.8031 --75.8141 --75.8187 --75.8063 --75.8125 --75.8094 --75.8141 --75.8203 --75.8109 --75.8141 --75.8109 --75.7984 --75.8109 --75.8047 --75.8094 --75.8234 --75.8047 --75.8078 --75.8156 --75.8219 --75.8141 --75.8156 --75.8141 --75.8063 --75.8078 --75.8109 --75.8125 --75.8187 --75.8078 --75.8125 --75.8047 --75.8203 --75.8125 --75.8125 --75.8172 --75.8109 --75.8016 --75.8016 --75.8094 --75.8063 --75.8094 --75.8063 --75.7953 --75.8016 --75.8016 --75.8094 --75.8031 --75.8016 --75.8047 --75.8125 --75.8109 --75.8094 --75.8172 --75.8203 --75.8203 --75.8125 --75.8063 --75.8125 --75.8219 --75.8172 --75.8078 --75.8219 --75.8063 --75.8109 --75.8109 --75.8187 --75.8172 --75.8281 --75.8031 --75.8234 --75.8156 --75.8219 --75.8125 --75.825 --75.8203 --75.8156 --75.8031 --75.8156 --75.8125 --75.8125 --75.8109 --75.8187 --75.8125 --75.8094 --75.8141 --75.8187 --75.8078 --75.8141 --75.8187 --75.8187 --75.8187 --75.8156 --75.8063 --75.8266 --75.8187 --75.8109 --75.8156 --75.8266 --75.8203 --75.8141 --75.8125 --75.8109 --75.8203 --75.8078 --75.8297 --75.8141 --75.8266 --75.8172 --75.8156 --75.8094 --75.8078 --75.8109 --75.8219 --75.8266 --75.8219 --75.825 --75.8172 --75.8156 --75.8203 --75.8156 --75.8141 --75.8109 --75.8063 --75.8016 --75.8203 --75.8219 --75.8047 --75.8187 --75.8203 --75.8203 --75.8141 --75.8078 --75.8094 --75.8078 --75.8187 --75.8141 --75.8109 --75.8172 --75.8078 --75.8016 --75.7969 --75.8187 --75.7922 --75.8109 --75.8078 --75.8078 --75.8156 --75.8141 --75.8 --75.8016 --75.8125 --75.8016 --75.8063 --75.8141 --75.8203 --75.8078 --75.8031 --75.8031 --75.8 --75.8016 --75.8094 --75.8172 --75.7984 --75.8078 --75.8203 --75.8187 --75.8078 --75.8141 --75.8156 --75.8156 --75.8172 --75.8094 --75.8109 --75.8031 --75.8094 --75.8125 --75.8172 --75.8109 --75.8109 --75.8016 --75.8063 --75.8 --75.8109 --75.8156 --75.8047 --75.8078 --75.8047 --75.8063 --75.7969 --75.8266 --75.8203 --75.8172 --75.8141 --75.8172 --75.8109 --75.8234 --75.8156 --75.8172 --75.8109 --75.825 --75.8078 --75.8266 --75.8219 --75.8203 --75.8078 --75.8141 --75.8203 --75.8297 --75.8266 --75.8219 --75.825 --75.8141 --75.8063 --75.8266 --75.8187 --75.8125 --75.8094 --75.7937 --75.8156 --75.8047 --75.8063 --75.8125 --75.8125 --75.8141 --75.8109 --75.8406 --75.8313 --75.8094 --75.8172 --75.8203 --75.8219 --75.8203 --75.8172 --75.8078 --75.8094 --75.8172 --75.8125 --75.8219 --75.8094 --75.8031 --75.8172 --75.8078 --75.8219 --75.8187 --75.8109 --75.8172 --75.8047 --75.8109 --75.8141 --75.8187 --75.8219 --75.8156 --75.8031 --75.8141 --75.8156 --75.8156 --75.8047 --75.7906 --75.8125 --75.8094 --75.8016 --75.8156 --75.8172 --75.8219 --75.8078 --75.8172 --75.8109 --75.8047 --75.8 --75.8063 --75.8047 --75.8109 --75.8063 --75.8141 --75.8141 --75.8 --75.8156 --75.8141 --75.8219 --75.8125 --75.8094 --75.8266 --75.8156 --75.8172 --75.8094 --75.8094 --75.8047 --75.8125 --75.8172 --75.8078 --75.8047 --75.8156 --75.8094 --75.8172 --75.8094 --75.8141 --75.8203 --75.8172 --75.8172 --75.8109 --75.8422 --75.8078 --75.8047 --75.8016 --75.8172 --75.8047 --75.8172 --75.8187 --75.8156 --75.825 --75.8203 --75.8344 --75.8047 --75.8344 --75.8297 --75.8187 --75.8047 --75.8187 --75.8031 --75.8313 --75.8281 --75.8141 --75.825 --75.8328 --75.8187 --75.8234 --75.8328 --75.825 --75.8406 --75.8281 --75.8297 --75.8375 --75.825 --75.825 --75.8156 --75.8219 --75.8391 --75.8328 --75.8219 --75.8203 --75.8281 --75.8203 --75.8234 --75.8203 --75.8234 --75.8203 --75.8313 --75.8328 --75.8187 --75.8219 --75.8422 --75.8203 --75.8219 --75.8281 --75.8219 --75.8344 --75.8219 --75.8313 --75.8328 --75.8328 --75.8313 --75.8266 --75.8344 --75.8172 --75.8172 --75.8375 --75.8234 --75.8156 --75.8203 --75.8281 --75.8391 --75.8172 --75.8047 --75.8187 --75.8219 --75.8281 --75.8219 --75.8219 --75.8266 --75.8156 --75.8125 --75.8172 --75.8344 --75.8203 --75.8156 --75.8281 --75.8344 --75.8344 --75.8234 --75.8281 --75.8125 --75.8281 --75.825 --75.8266 --75.8156 --75.8125 --75.8344 --75.8156 --75.8219 --75.825 --75.8187 --75.8281 --75.8234 --75.8219 --75.8234 --75.8172 --75.8047 --75.8187 --75.8219 --75.8187 --75.8078 --75.8234 --75.8266 --75.8187 --75.8125 --75.8078 --75.8266 --75.8187 --75.8328 --75.8234 --75.8172 --75.8266 --75.8359 --75.8266 --75.8438 --75.8438 --75.8281 --75.8219 --75.8063 --75.8203 --75.8094 --75.8094 --75.8125 --75.8063 --75.8156 --75.8266 --75.8109 --75.8219 --75.8078 --75.8313 --75.8109 --75.8359 --75.8266 --75.8156 --75.8203 --75.8313 --75.8297 --75.8375 --75.8266 --75.8359 --75.8375 --75.825 --75.8281 --75.8203 --75.8172 --75.8359 --75.8203 --75.8203 --75.8156 --75.8344 --75.8266 --75.8281 --75.8375 --75.8344 --75.8375 --75.8406 --75.8313 --75.8234 --75.8187 --75.8344 --75.8344 --75.8281 --75.8172 --75.8297 --75.8187 --75.8266 --75.8281 --75.8297 --75.8328 --75.8219 --75.8172 --75.8187 --75.8281 --75.8156 --75.8203 --75.8094 --75.8234 --75.825 --75.8313 --75.825 --75.8141 --75.825 --75.8266 --75.825 --75.8438 --75.8203 --75.825 --75.8328 --75.8187 --75.8234 --75.8234 --75.8344 --75.8313 --75.8391 --75.8266 --75.8234 --75.825 --75.8219 --75.8328 --75.825 --75.8297 --75.825 --75.8328 --75.8203 --75.8234 --75.8375 --75.8172 --75.8344 --75.8281 --75.8297 --75.8297 --75.8125 --75.8313 --75.8203 --75.8187 --75.8187 --75.8219 --75.8266 --75.8219 --75.8187 --75.8203 --75.8125 --75.8187 --75.8047 --75.8281 --75.8203 --75.8078 --75.8219 --75.8141 --75.8187 --75.8203 --75.8094 --75.8281 --75.8172 --75.8125 --75.8219 --75.8203 --75.825 --75.825 --75.8234 --75.8234 --75.8156 --75.8203 --75.825 --75.825 --75.8406 --75.8094 --75.8375 --75.8266 --75.8156 --75.8187 --75.8094 --75.8109 --75.8328 --75.8359 --75.8359 --75.8453 --75.8344 --75.8297 --75.8281 --75.8281 --75.8328 --75.8297 --75.8359 --75.8375 --75.8375 --75.8313 --75.8156 --75.8344 --75.8281 --75.8203 --75.8328 --75.8156 --75.8125 --75.8328 --75.8203 --75.8281 --75.8266 --75.8219 --75.8313 --75.8125 --75.8375 --75.8219 --75.8141 --75.8219 --75.8203 --75.8063 --75.8094 --75.8156 --75.825 --75.8187 --75.8125 --75.825 --75.8172 --75.8187 --75.8281 --75.8266 --75.8187 --75.8453 --75.8234 --75.8187 --75.8141 --75.8172 --75.8187 --75.8297 --75.8125 --75.825 --75.8187 --75.825 --75.8109 --75.8313 --75.8234 --75.8219 --75.8172 --75.8063 --75.8094 --75.825 --75.8297 --75.8156 --75.8109 --75.825 --75.8109 --75.8141 --75.8109 --75.8266 --75.8281 --75.8094 --75.8094 --75.8109 --75.8203 --75.8172 --75.8187 --75.8125 --75.8187 --75.8344 --75.8094 --75.825 --75.8203 --75.8125 --75.8234 --75.825 --75.8234 --75.8313 --75.8359 --75.8281 --75.8234 --75.8172 --75.8234 --75.8172 --75.8141 --75.825 --75.8219 --75.8187 --75.8313 --75.8203 --75.8234 --75.8203 --75.8109 --75.8172 --75.8016 --75.8266 --75.8125 --75.8172 --75.8172 --75.8219 --75.8344 --75.8219 --75.8094 --75.8219 --75.8141 --75.8219 --75.8187 --75.8281 --75.8359 --75.8156 --75.8109 --75.8141 --75.8187 --75.8078 --75.8281 --75.8203 --75.8156 --75.8047 --75.8266 --75.8172 --75.7984 --75.8109 --75.8156 --75.8078 --75.8141 --75.7953 --75.8297 --75.8047 --75.8 --75.8141 --75.8219 --75.8078 --75.8219 --75.8156 --75.8016 --75.7984 --75.8187 --75.8078 --75.8344 --75.8219 --75.8078 --75.8344 --75.8187 --75.8172 --75.8094 --75.8125 --75.8187 --75.8031 --75.8031 --75.825 --75.8094 --75.8234 --75.8156 --75.8266 --75.8187 --75.8063 --75.8187 --75.8156 --75.8187 --75.8156 --75.8187 --75.8172 --75.8234 --75.8094 --75.8203 --75.8172 --75.8359 --75.8187 --75.8172 --75.825 --75.8297 --75.8297 --75.8234 --75.8234 --75.8141 --75.8281 --75.8234 --75.8266 --75.8141 --75.8109 --75.8266 --75.8219 --75.8187 --75.8187 --75.8234 --75.8297 --75.8234 --75.825 --75.8344 --75.8344 --75.825 --75.825 --75.8344 --75.8234 --75.8234 --75.8391 --75.825 --75.8156 --75.8344 --75.8266 --75.8016 --75.8313 --75.8187 --75.8297 --75.8266 --75.8156 --75.8234 --75.8125 --75.8187 --75.8219 --75.8172 --75.8063 --75.8141 --75.8156 --75.8078 --75.8172 --75.8141 --75.8109 --75.8172 --75.8203 --75.8156 --75.8109 --75.8203 --75.8234 --75.8141 --75.8234 --75.8125 --75.8234 --75.8141 --75.8266 --75.8125 --75.8203 --75.8187 --75.8281 --75.8125 --75.8 --75.8047 --75.8156 --75.8141 --75.8281 --75.8125 --75.8219 --75.8219 --75.8172 --75.8141 --75.8203 --75.8172 --75.8156 --75.8187 --75.8141 --75.8016 --75.8031 --75.7922 --75.8156 --75.8125 --75.8219 --75.8281 --75.8125 --75.8156 --75.8172 --75.8266 --75.8094 --75.8234 --75.8063 --75.825 --75.8141 --75.8125 --75.8297 --75.8187 --75.8281 --75.8219 --75.8078 --75.8187 --75.825 --75.8016 --75.8219 --75.8203 --75.8266 --75.8203 --75.8141 --75.8219 --75.8063 --75.8172 --75.8031 --75.8109 --75.8063 --75.7969 --75.8141 --75.8187 --75.8219 --75.8234 --75.8187 --75.8016 --75.8125 --75.8109 --75.8094 --75.8219 --75.825 --75.8141 --75.8234 --75.8141 --75.8172 --75.8219 --75.8344 --75.8203 --75.7953 --75.8187 --75.8172 --75.7875 --75.7922 --75.7906 --75.8078 --75.825 --75.8094 --75.8 --75.8141 --75.8094 --75.8203 --75.8109 --75.8078 --75.8156 --75.7953 --75.8125 --75.7953 --75.8031 --75.8187 --75.7984 --75.8266 --75.8156 --75.8094 --75.8078 --75.8344 --75.8141 --75.8078 --75.8125 --75.8172 --75.8172 --75.8125 --75.8125 --75.8063 --75.8156 --75.8141 --75.8078 --75.8297 --75.8047 --75.8063 --75.8125 --75.8219 --75.8063 --75.8297 --75.8141 --75.8219 --75.8156 --75.8187 --75.825 --75.8219 --75.8109 --75.8234 --75.8156 --75.825 --75.8109 --75.8109 --75.8313 --75.8156 --75.8078 --75.8266 --75.8172 --75.8125 --75.8234 --75.8375 --75.8234 --75.8172 --75.8391 --75.8328 --75.8172 --75.8266 --75.8266 --75.8203 --75.8109 --75.825 --75.8219 --75.8266 --75.8313 --75.8172 --75.8219 --75.8297 --75.8313 --75.8219 --75.8219 --75.8156 --75.8187 --75.8172 --75.8219 --75.8172 --75.8141 --75.8094 --75.8375 --75.825 --75.825 --75.8313 --75.8375 --75.8344 --75.8156 --75.8344 --75.8359 --75.8297 --75.8297 --75.8234 --75.825 --75.8266 --75.8281 --75.8172 --75.825 --75.8234 --75.8172 --75.8219 --75.8094 --75.8187 --75.825 --75.8141 --75.8141 --75.8125 --75.8234 --75.8078 --75.8172 --75.8125 --75.8219 --75.8234 --75.8203 --75.8297 --75.8234 --75.8234 --75.825 --75.8156 --75.8 --75.8156 --75.8109 --75.8266 --75.8141 --75.8156 --75.8125 --75.825 --75.8047 --75.8219 --75.8047 --75.8078 --75.825 --75.8156 --75.8281 --75.8313 --75.8219 --75.8375 --75.8187 --75.8109 --75.8313 --75.8219 --75.8313 --75.8187 --75.8203 --75.8203 --75.825 --75.8109 --75.8109 --75.8172 --75.8156 --75.8047 --75.8172 --75.8156 --75.8078 --75.8141 --75.8203 --75.8141 --75.8156 --75.8234 --75.8016 --75.8109 --75.8109 --75.8281 --75.7984 --75.8063 --75.8172 --75.8125 --75.8187 --75.8187 --75.8109 --75.8125 --75.8047 --75.8031 --75.8156 --75.8141 --75.8063 --75.8234 --75.8313 --75.8172 --75.8187 --75.8203 --75.8016 --75.8172 --75.8125 --75.8203 --75.8219 --75.8203 --75.8109 --75.8063 --75.8203 --75.8141 --75.8156 --75.8047 --75.8125 --75.8281 --75.8141 --75.8125 --75.8234 --75.8219 --75.8203 --75.8125 --75.8156 --75.8156 --75.8203 --75.8094 --75.8203 --75.8156 --75.8156 --75.8109 --75.825 --75.8125 --75.8219 --75.8172 --75.8125 --75.8094 --75.8234 --75.8063 --75.8234 --75.8234 --75.8031 --75.8172 --75.8125 --75.8141 --75.8187 --75.8156 --75.8187 --75.8094 --75.8094 --75.8187 --75.8203 --75.8094 --75.8078 --75.8094 --75.8187 --75.8234 --75.8234 --75.8203 --75.8328 --75.8156 --75.8313 --75.8266 --75.8219 --75.8313 --75.8109 --75.8187 --75.8125 --75.8125 --75.8203 --75.8234 --75.8078 --75.8187 --75.8094 --75.8187 --75.8141 --75.8156 --75.8187 --75.8063 --75.8141 --75.8234 --75.8297 --75.8141 --75.8203 --75.8187 --75.8313 --75.8187 --75.8141 --75.8266 --75.8297 --75.8234 --75.8281 --75.8172 --75.8172 --75.8203 --75.8297 --75.8109 --75.8203 --75.8172 --75.8203 --75.8328 --75.8344 --75.8219 --75.8297 --75.8297 --75.8219 --75.8344 --75.8187 --75.8156 --75.825 --75.8281 --75.8141 --75.8328 --75.8219 --75.8219 --75.8219 --75.8203 --75.8172 --75.8203 --75.8094 --75.8234 --75.8297 --75.8172 --75.8172 --75.825 --75.8203 --75.8172 --75.8172 --75.8156 --75.825 --75.8156 --75.8141 --75.8172 --75.8234 --75.8094 --75.8187 --75.8109 --75.8203 --75.8156 --75.8172 --75.8313 --75.8281 --75.8281 --75.8141 --75.8141 --75.8391 --75.8172 --75.8203 --75.8281 --75.8203 --75.8172 --75.8219 --75.825 --75.8344 --75.8328 --75.8219 --75.8328 --75.8219 --75.825 --75.8359 --75.8391 --75.8297 --75.8266 --75.8297 --75.8391 --75.8234 --75.8547 --75.8234 --75.8234 --75.8281 --75.8313 --75.8234 --75.8438 --75.8234 --75.8391 --75.8234 --75.8203 --75.8391 --75.8297 --75.8281 --75.8297 --75.8375 --75.8219 --75.8422 --75.8328 --75.8313 --75.8281 --75.8375 --75.8297 --75.8406 --75.8547 --75.8328 --75.8406 --75.8422 --75.8375 --75.8375 --75.8406 --75.8531 --75.8484 --75.8516 --75.8391 --75.8297 --75.8328 --75.85 --75.8391 --75.8422 --75.8453 --75.8438 --75.8562 --75.8375 --75.8313 --75.8328 --75.8281 --75.825 --75.8391 --75.8281 --75.8313 --75.8234 --75.8219 --75.825 --75.8172 --75.8234 --75.8281 --75.825 --75.8344 --75.8344 --75.8266 --75.8344 --75.8297 --75.8422 --75.8297 --75.8297 --75.8359 --75.8234 --75.8203 --75.8313 --75.8266 --75.8219 --75.8359 --75.825 --75.8344 --75.825 --75.8313 --75.8297 --75.825 --75.8297 --75.8297 --75.8219 --75.8219 --75.8234 --75.8313 --75.8531 --75.8234 --75.8266 --75.8109 --75.8203 --75.8359 --75.8203 --75.8234 --75.8281 --75.8313 --75.8266 --75.825 --75.8281 --75.8438 --75.8391 --75.8469 --75.8266 --75.8313 --75.8281 --75.8234 --75.8313 --75.85 --75.8422 --75.8125 --75.8219 --75.8203 --75.8094 --75.8297 --75.8453 --75.8391 --75.8187 --75.8344 --75.8531 --75.8297 --75.8344 --75.8234 --75.8203 --75.8297 --75.8266 --75.8281 --75.8313 --75.8313 --75.8422 --75.8234 --75.8297 --75.8297 --75.8328 --75.8219 --75.8219 --75.8219 --75.8187 --75.8266 --75.8281 --75.8156 --75.8234 --75.8141 --75.825 --75.8094 --75.8203 --75.8328 --75.8125 --75.8234 --75.8156 --75.825 --75.8234 --75.8109 --75.8187 --75.8156 --75.8172 --75.8125 --75.8047 --75.8203 --75.8219 --75.825 --75.8156 --75.825 --75.8266 --75.8141 --75.8141 --75.825 --75.8234 --75.8313 --75.8219 --75.8187 --75.8234 --75.8203 --75.8266 --75.825 --75.8313 --75.8266 --75.8234 --75.8219 --75.8172 --75.8109 --75.8203 --75.8187 --75.8328 --75.825 --75.8438 --75.8281 --75.8313 --75.8422 --75.8297 --75.8359 --75.8281 --75.8266 --75.8125 --75.8266 --75.8141 --75.8094 --75.8187 --75.8234 --75.8187 --75.8203 --75.8281 --75.8344 --75.8234 --75.8141 --75.8125 --75.8281 --75.8219 --75.825 --75.8219 --75.8219 --75.8187 --75.8187 --75.8156 --75.8187 --75.8187 --75.8313 --75.8266 --75.8234 --75.8266 --75.8281 --75.8313 --75.8094 --75.8344 --75.8172 --75.8281 --75.8313 --75.8219 --75.8391 --75.8359 --75.8156 --75.8266 --75.8328 --75.8391 --75.825 --75.8234 --75.8344 --75.8375 --75.8375 --75.8297 --75.8234 --75.8156 --75.8187 --75.8328 --75.8313 --75.8234 --75.8266 --75.8266 --75.8187 --75.8359 --75.8359 --75.8531 --75.8328 --75.8234 --75.8266 --75.8313 --75.8313 --75.8266 --75.8281 --75.8313 --75.8281 --75.8281 --75.825 --75.8266 --75.825 --75.8141 --75.8344 --75.8281 --75.8203 --75.8297 --75.8187 --75.8297 --75.8313 --75.8375 --75.8375 --75.8203 --75.8375 --75.8219 --75.8234 --75.8203 --75.8328 --75.8266 --75.8344 --75.8203 --75.8 --75.8234 --75.8141 --75.8125 --75.8281 --75.8141 --75.8125 --75.8266 --75.8203 --75.8375 --75.8391 --75.8281 --75.8187 --75.8281 --75.8234 --75.8281 --75.8281 --75.8359 --75.8234 --75.8234 --75.8219 --75.8266 --75.8375 --75.8281 --75.8344 --75.8328 --75.8313 --75.8359 --75.8219 --75.8219 --75.825 --75.825 --75.825 --75.8156 --75.8375 --75.8297 --75.8359 --75.825 --75.8281 --75.8203 --75.8313 --75.8344 --75.8234 --75.8375 --75.8219 --75.8344 --75.8203 --75.8297 --75.8234 --75.8266 --75.8234 --75.8219 --75.8234 --75.8328 --75.8109 --75.8266 --75.8172 --75.8187 --75.8156 --75.8359 --75.8281 --75.8359 --75.8234 --75.8328 --75.8266 --75.825 --75.8359 --75.8203 --75.8266 --75.825 --75.8234 --75.8266 --75.8297 --75.8266 --75.8281 --75.8234 --75.8234 --75.825 --75.8391 --75.8359 --75.8297 --75.8391 --75.8375 --75.8234 --75.8344 --75.8438 --75.8234 --75.8281 --75.8422 --75.8234 --75.8313 --75.8328 --75.8328 --75.8344 --75.85 --75.8219 --75.8344 --75.8344 --75.8344 --75.8375 --75.8375 --75.8328 --75.8391 --75.8313 --75.8203 --75.8219 --75.8328 --75.8281 --75.8297 --75.8266 --75.8297 --75.8422 --75.8313 --75.8266 --75.825 --75.8297 --75.8453 --75.8422 --75.8375 --75.8359 --75.825 --75.8438 --75.8328 --75.8422 --75.8359 --75.8375 --75.8313 --75.825 --75.8344 --75.8187 --75.8297 --75.825 --75.8359 --75.8281 --75.8375 --75.8266 --75.8328 --75.8359 --75.8313 --75.8375 --75.8359 --75.8297 --75.8328 --75.8453 --75.8297 --75.8359 --75.8297 --75.8375 --75.8391 --75.8375 --75.8328 --75.8406 --75.8313 --75.8453 --75.8281 --75.8297 --75.8375 --75.8344 --75.8234 --75.8344 --75.8234 --75.8266 --75.8375 --75.8266 --75.8391 --75.8297 --75.8438 --75.8234 --75.8328 --75.8391 --75.8375 --75.8328 --75.8234 --75.8516 --75.8375 --75.8391 --75.8438 --75.8469 --75.8422 --75.8375 --75.8562 --75.8391 --75.825 --75.8422 --75.8328 --75.8406 --75.8359 --75.8484 --75.8406 --75.8391 --75.8328 --75.8391 --75.8438 --75.825 --75.8359 --75.8359 --75.8359 --75.8406 --75.8422 --75.8266 --75.8453 --75.8422 --75.8375 --75.8516 --75.8516 --75.8406 --75.8516 --75.8344 --75.8406 --75.8359 --75.8266 --75.8344 --75.8453 --75.825 --75.8375 --75.8406 --75.8344 --75.8375 --75.8266 --75.8344 --75.8297 --75.8391 --75.8281 --75.8391 --75.8438 --75.8328 --75.8422 --75.8359 --75.8344 --75.8391 --75.8219 --75.8328 --75.8359 --75.8328 --75.8172 --75.8391 --75.8453 --75.8313 --75.8344 --75.8234 --75.85 --75.8297 --75.8375 --75.8406 --75.8531 --75.8359 --75.8375 --75.8391 --75.8359 --75.8219 --75.8219 --75.8281 --75.8422 --75.8219 --75.8328 --75.8313 --75.8281 --75.8359 --75.8391 --75.8391 --75.8344 --75.8359 --75.825 --75.8391 --75.8375 --75.8344 --75.8375 --75.8313 --75.8422 --75.8344 --75.8313 --75.8344 --75.8297 --75.8328 --75.8375 --75.8156 --75.8328 --75.8344 --75.8391 --75.8422 --75.8187 --75.8375 --75.8406 --75.8187 --75.8281 --75.8375 --75.8344 --75.8281 --75.825 --75.8234 --75.825 --75.8391 --75.8219 --75.8328 --75.8297 --75.8281 --75.8281 --75.8281 --75.8359 --75.8328 --75.8453 --75.8438 --75.8484 --75.85 --75.8484 --75.8453 --75.8344 --75.8359 --75.85 --75.8359 --75.8516 --75.8453 --75.8469 --75.8438 --75.8344 --75.8562 --75.8484 --75.8406 --75.8422 --75.8375 --75.8516 --75.8438 --75.8406 --75.8438 --75.825 --75.8438 --75.8234 --75.8375 --75.8328 --75.8484 --75.8375 --75.8344 --75.8422 --75.8375 --75.8484 --75.8328 --75.8453 --75.8266 --75.8391 --75.8438 --75.8328 --75.8578 --75.8328 --75.8328 --75.825 --75.8234 --75.8187 --75.8422 --75.8328 --75.8375 --75.8266 --75.8328 --75.8281 --75.8438 --75.8219 --75.8328 --75.8297 --75.8516 --75.8422 --75.8328 --75.8391 --75.8438 --75.8297 --75.8453 --75.8375 --75.8391 --75.8422 --75.8406 --75.8531 --75.8422 --75.8281 --75.8313 --75.8453 --75.8391 --75.8281 --75.8234 --75.8391 --75.8406 --75.8375 --75.8375 --75.8266 --75.8438 --75.8344 --75.825 --75.8484 --75.8313 --75.8203 --75.8297 --75.8297 --75.8469 --75.8453 --75.8391 --75.8313 --75.8484 --75.8453 --75.8359 --75.8406 --75.8313 --75.8344 --75.8453 --75.8469 --75.8313 --75.8266 --75.8359 --75.8344 --75.8359 --75.8438 --75.8328 --75.8375 --75.8344 --75.8438 --75.8344 --75.8266 --75.8375 --75.8187 --75.8453 --75.8297 --75.8375 --75.8094 --75.8328 --75.8328 --75.825 --75.8109 --75.8109 --75.8313 --75.8187 --75.8328 --75.8328 --75.8328 --75.8297 --75.8313 --75.8359 --75.8219 --75.825 --75.8281 --75.8313 --75.8281 --75.8375 --75.8234 --75.8344 --75.8281 --75.8406 --75.8297 --75.8281 --75.8281 --75.8344 --75.8328 --75.8141 --75.825 --75.8234 --75.8234 --75.8313 --75.8297 --75.8547 --75.8406 --75.8422 --75.8359 --75.8234 --75.8422 --75.8313 --75.8344 --75.8359 --75.8391 --75.8344 --75.8344 --75.8281 --75.8438 --75.8328 --75.85 --75.8531 --75.8344 --75.8328 --75.8344 --75.8375 --75.8391 --75.8187 --75.8187 --75.8422 --75.8359 --75.8234 --75.8344 --75.8359 --75.8328 --75.8344 --75.8234 --75.8359 --75.8234 --75.8406 --75.8297 --75.8234 --75.8344 --75.8344 --75.8344 --75.8266 --75.8453 --75.8359 --75.8281 --75.8375 --75.8453 --75.8438 --75.8281 --75.8328 --75.825 --75.8344 --75.825 --75.8359 --75.8344 --75.8359 --75.8484 --75.8391 --75.8375 --75.8453 --75.8344 --75.8281 --75.8281 --75.8359 --75.8328 --75.8422 --75.8375 --75.8344 --75.8391 --75.8344 --75.8266 --75.8328 --75.8375 --75.825 --75.825 --75.8313 --75.8297 --75.8281 --75.8391 --75.8203 --75.8234 --75.8297 --75.8281 --75.8438 --75.8344 --75.8344 --75.8406 --75.8375 --75.8391 --75.8359 --75.8344 --75.8281 --75.8406 --75.8281 --75.8359 --75.8406 --75.8375 --75.8297 --75.8578 --75.8391 --75.8438 --75.8562 --75.8438 --75.8484 --75.8375 --75.8344 --75.8406 --75.8406 --75.8391 --75.8391 --75.8484 --75.8422 --75.8484 --75.8313 --75.8344 --75.85 --75.8375 --75.8344 --75.8531 --75.8484 --75.8531 --75.8516 --75.8422 --75.8547 --75.8438 --75.8406 --75.8531 --75.8438 --75.8391 --75.8266 --75.8375 --75.85 --75.8297 --75.8422 --75.8453 --75.8438 --75.8234 --75.8281 --75.8391 --75.8375 --75.8359 --75.8297 --75.8313 --75.8375 --75.8281 --75.8344 --75.8344 --75.8531 --75.8391 --75.8391 --75.8344 --75.8422 --75.8484 --75.8406 --75.8516 --75.8313 --75.8328 --75.8328 --75.8453 --75.8375 --75.8438 --75.8578 --75.8406 --75.8313 --75.8359 --75.8344 --75.8406 --75.8328 --75.85 --75.8422 --75.8344 --75.8625 --75.8453 --75.85 --75.8391 --75.8375 --75.8438 --75.8625 --75.8469 --75.8406 --75.8391 --75.8438 --75.8406 --75.8516 --75.8359 --75.85 --75.8391 --75.8438 --75.8359 --75.8516 --75.8531 --75.8297 --75.8453 --75.8391 --75.8391 --75.8422 --75.8453 --75.8391 --75.8344 --75.8391 --75.8328 --75.8359 --75.8328 --75.8391 --75.8344 --75.8438 --75.8422 --75.8328 --75.8422 --75.8297 --75.8469 --75.825 --75.8438 --75.8328 --75.8406 --75.8453 --75.8344 --75.8328 --75.8328 --75.8375 --75.8344 --75.8266 --75.8344 --75.8484 --75.85 --75.8375 --75.8297 --75.8391 --75.8344 --75.8422 --75.8375 --75.8469 --75.8469 --75.8438 --75.8344 --75.8516 --75.8438 --75.8375 --75.8375 --75.8484 --75.8516 --75.8531 --75.8484 --75.8391 --75.8406 --75.8375 --75.8484 --75.8469 --75.8438 --75.8516 --75.8469 --75.8453 --75.8453 --75.8391 --75.8375 --75.8344 --75.8469 --75.8469 --75.8375 --75.8406 --75.8547 --75.8375 --75.85 --75.8391 --75.8328 --75.8531 --75.8547 --75.8391 --75.8453 --75.8422 --75.8438 --75.8547 --75.8578 --75.8484 --75.8438 --75.8359 --75.8594 --75.8469 --75.8641 --75.8625 --75.8641 --75.8594 --75.8609 --75.8625 --75.8703 --75.8656 --75.8672 --75.8609 --75.8672 --75.8656 --75.85 --75.8578 --75.8562 --75.85 --75.8531 --75.8625 --75.8656 --75.8516 --75.85 --75.8391 --75.8547 --75.8562 --75.8594 --75.8578 --75.8594 --75.8703 --75.8547 --75.85 --75.8641 --75.8656 --75.8594 --75.8547 --75.8438 --75.85 --75.8578 --75.8484 --75.8594 --75.85 --75.8484 --75.8531 --75.8469 --75.8453 --75.8375 --75.8672 --75.8422 --75.8484 --75.8469 --75.8484 --75.8531 --75.8562 --75.8531 --75.8438 --75.8375 --75.8453 --75.8391 --75.8547 --75.8578 --75.8516 --75.8516 --75.8453 --75.8531 --75.8516 --75.8578 --75.8547 --75.8547 --75.8594 --75.8609 --75.8484 --75.8578 --75.8438 --75.8578 --75.8641 --75.8594 --75.8562 --75.8547 --75.8547 --75.8594 --75.8531 --75.8484 --75.8547 --75.8609 --75.8484 --75.8531 --75.8516 --75.8672 --75.8625 --75.8562 --75.8547 --75.8672 --75.8719 --75.8688 --75.8688 --75.8641 --75.8609 --75.8531 --75.8672 --75.8562 --75.8578 --75.8656 --75.8547 --75.8578 --75.8609 --75.85 --75.85 --75.8562 --75.8609 --75.8547 --75.8625 --75.8453 --75.8562 --75.8594 --75.8609 --75.8484 --75.8641 --75.8562 --75.8484 --75.8516 --75.8531 --75.8453 --75.8562 --75.8562 --75.8516 --75.8672 --75.85 --75.8594 --75.8469 --75.8438 --75.8469 --75.8438 --75.8562 --75.8625 --75.8625 --75.8562 --75.8547 --75.8562 --75.8484 --75.8703 --75.8406 --75.8578 --75.8594 --75.8453 --75.8609 --75.8516 --75.8594 --75.8656 --75.8516 --75.8547 --75.8562 --75.8656 --75.8547 --75.8562 --75.8547 --75.8531 --75.8484 --75.85 --75.8672 --75.8562 --75.8578 --75.8469 --75.8484 --75.8547 --75.8719 --75.8609 --75.8562 --75.8625 --75.8641 --75.8703 --75.8656 --75.8562 --75.8672 --75.8531 --75.8516 --75.8562 --75.875 --75.8594 --75.8594 --75.8688 --75.8609 --75.8656 --75.8531 --75.8547 --75.8531 --75.8609 --75.8531 --75.8609 --75.8703 --75.8656 --75.8656 --75.8688 --75.8625 --75.8578 --75.8766 --75.8516 --75.8641 --75.8516 --75.8625 --75.8688 --75.85 --75.8594 --75.8766 --75.8578 --75.8609 --75.8484 --75.8641 --75.8672 --75.8562 --75.8609 --75.8688 --75.8609 --75.8688 --75.8688 --75.8594 --75.8656 --75.8594 --75.8703 --75.8516 --75.8719 --75.8656 --75.8547 --75.8547 --75.8578 --75.8422 --75.8547 --75.8672 --75.8703 --75.8656 --75.8766 --75.8672 --75.8672 --75.8594 --75.8578 --75.8594 --75.8594 --75.8672 --75.8578 --75.8609 --75.8672 --75.8547 --75.8578 --75.8688 --75.8703 --75.8672 --75.8719 --75.8703 --75.8594 --75.8562 --75.8719 --75.8719 --75.8609 --75.8656 --75.8625 --75.8625 --75.8734 --75.8609 --75.8578 --75.8484 --75.8578 --75.8594 --75.85 --75.8516 --75.8625 --75.8594 --75.8609 --75.8578 --75.8562 --75.8516 --75.8547 --75.8484 --75.8641 --75.8547 --75.8688 --75.8578 --75.8719 --75.8688 --75.8719 --75.8672 --75.8609 --75.8625 --75.8641 --75.8672 --75.8578 --75.8703 --75.8609 --75.8688 --75.8719 --75.8766 --75.8703 --75.8719 --75.875 --75.8547 --75.8734 --75.8672 --75.8672 --75.8672 --75.8625 --75.8641 --75.8578 --75.875 --75.8391 --75.8594 --75.8547 --75.8609 --75.8516 --75.8641 --75.8703 --75.8578 --75.8625 --75.8578 --75.8672 --75.8656 --75.8562 --75.8531 --75.8516 --75.8578 --75.8516 --75.8562 --75.8547 --75.8625 --75.8578 --75.8766 --75.8625 --75.8672 --75.8531 --75.8609 --75.8609 --75.8562 --75.8641 --75.8547 --75.8547 --75.8719 --75.8531 --75.8562 --75.8531 --75.8609 --75.8547 --75.8578 --75.8609 --75.8562 --75.8578 --75.8578 --75.8766 --75.8562 --75.8484 --75.8797 --75.8547 --75.8609 --75.8641 --75.8625 --75.8734 --75.8422 --75.8734 --75.8688 --75.8781 --75.8547 --75.8609 --75.8609 --75.8641 --75.8859 --75.8656 --75.8594 --75.8672 --75.8625 --75.85 --75.8641 --75.8609 --75.8672 --75.8594 --75.8688 --75.8578 --75.8641 --75.8578 --75.8547 --75.8625 --75.8703 --75.8516 --75.8656 --75.8594 --75.8688 --75.8703 --75.8719 --75.8734 --75.8656 --75.8656 --75.8531 --75.8641 --75.8734 --75.8828 --75.8781 --75.8719 --75.8688 --75.8562 --75.8688 --75.8625 --75.8641 --75.8625 --75.8781 --75.8828 --75.8719 --75.8703 --75.875 --75.8672 --75.8703 --75.8781 --75.8703 --75.8625 --75.8672 --75.8703 --75.8766 --75.8672 --75.8781 --75.8641 --75.8875 --75.8594 --75.8672 --75.8703 --75.8656 --75.8641 --75.8719 --75.8656 --75.8703 --75.8719 --75.8734 --75.85 --75.8672 --75.8734 --75.8578 --75.8641 --75.8656 --75.8688 --75.8656 --75.8641 --75.8688 --75.8703 --75.8609 --75.8562 --75.8703 --75.8859 --75.8703 --75.8703 --75.8812 --75.875 --75.8719 --75.8766 --75.8703 --75.8703 --75.8781 --75.8672 --75.875 --75.875 --75.8797 --75.8875 --75.8766 --75.8781 --75.8938 --75.875 --75.8781 --75.8781 --75.875 --75.8672 --75.8797 --75.875 --75.8859 --75.8797 --75.8734 --75.875 --75.8672 --75.8812 --75.8688 --75.8688 --75.8766 --75.8688 --75.875 --75.8781 --75.8828 --75.8812 --75.8703 --75.875 --75.8719 --75.8625 --75.8812 --75.8656 --75.8547 --75.8672 --75.875 --75.8734 --75.8766 --75.8719 --75.8828 --75.8641 --75.8719 --75.8766 --75.8797 --75.8688 --75.8766 --75.8688 --75.8812 --75.8781 --75.875 --75.8844 --75.8734 --75.8844 --75.8766 --75.8703 --75.8797 --75.8734 --75.8781 --75.8797 --75.8734 --75.8828 --75.8812 --75.8656 --75.8828 --75.8781 --75.8766 --75.8734 --75.8844 --75.8703 --75.875 --75.8797 --75.8875 --75.8859 --75.8922 --75.8781 --75.8828 --75.8719 --75.8703 --75.8828 --75.8906 --75.8781 --75.8906 --75.8781 --75.8766 --75.8766 --75.8797 --75.8906 --75.8797 --75.8797 --75.8734 --75.8688 --75.8797 --75.8703 --75.8828 --75.8781 --75.8797 --75.8672 --75.8641 --75.8609 --75.8609 --75.8766 --75.8703 --75.8766 --75.8781 --75.8766 --75.8578 --75.85 --75.8641 --75.8562 --75.8594 --75.8719 --75.8562 --75.8703 --75.8719 --75.8703 --75.8578 --75.8656 --75.8703 --75.8688 --75.8688 --75.8891 --75.8688 --75.8766 --75.8578 --75.8875 --75.8891 --75.8781 --75.8688 --75.8781 --75.8812 --75.8812 --75.8766 --75.8828 --75.8797 --75.8672 --75.8719 --75.8891 --75.8797 --75.8672 --75.8781 --75.8828 --75.8859 --75.8859 --75.8875 --75.875 --75.8828 --75.8859 --75.8797 --75.8844 --75.8781 --75.8781 --75.8891 --75.8891 --75.8984 --75.8781 --75.8781 --75.8891 --75.8859 --75.8891 --75.8859 --75.8891 --75.8781 --75.875 --75.8672 --75.8797 --75.8875 --75.8766 --75.8766 --75.8719 --75.8797 --75.8719 --75.8766 --75.8688 --75.8797 --75.8547 --75.8891 --75.8906 --75.8828 --75.8812 --75.8891 --75.8859 --75.8812 --75.8781 --75.8766 --75.8688 --75.8797 --75.8844 --75.8828 --75.8828 --75.8859 --75.8781 --75.8969 --75.8875 --75.8797 --75.8859 --75.8734 --75.875 --75.875 --75.8812 --75.8812 --75.8891 --75.8719 --75.8828 --75.8812 --75.8844 --75.8922 --75.8875 --75.8906 --75.8844 --75.8781 --75.8859 --75.8891 --75.8719 --75.8875 --75.8859 --75.8859 --75.8875 --75.8922 --75.8844 --75.8797 --75.8828 --75.8781 --75.8766 --75.8828 --75.8703 --75.8797 --75.8625 --75.8781 --75.8703 --75.8656 --75.8703 --75.875 --75.8656 --75.8688 --75.8766 --75.8844 --75.8828 --75.8719 --75.8891 --75.8688 --75.8859 --75.8844 --75.8812 --75.8719 --75.8844 --75.8875 --75.8828 --75.8859 --75.8812 --75.8859 --75.8906 --75.8984 --75.8891 --75.8906 --75.8812 --75.8812 --75.8906 --75.9 --75.8891 --75.8734 --75.8812 --75.9109 --75.8984 --75.9016 --75.9016 --75.9172 --75.8875 --75.8828 --75.8969 --75.8891 --75.9016 --75.8969 --75.9 --75.8906 --75.8828 --75.8812 --75.8953 --75.8984 --75.8891 --75.8922 --75.8984 --75.8875 --75.8984 --75.8812 --75.9047 --75.8828 --75.8812 --75.9172 --75.8922 --75.8938 --75.8938 --75.8828 --75.8875 --75.8875 --75.8797 --75.8875 --75.8828 --75.8797 --75.8766 --75.8828 --75.8875 --75.8828 --75.8797 --75.8828 --75.8859 --75.8859 --75.8781 --75.8766 --75.8844 --75.8969 --75.8859 --75.8859 --75.9016 --75.8984 --75.875 --75.8797 --75.8781 --75.8703 --75.8875 --75.8734 --75.8844 --75.8844 --75.8688 --75.8875 --75.8703 --75.8812 --75.8828 --75.8859 --75.8875 --75.8859 --75.8797 --75.8766 --75.8797 --75.8875 --75.8781 --75.8844 --75.8875 --75.8766 --75.875 --75.8766 --75.8781 --75.8797 --75.8859 --75.8719 --75.8766 --75.8844 --75.8656 --75.8875 --75.8609 --75.8672 --75.8922 --75.875 --75.8781 --75.9 --75.8688 --75.8875 --75.8906 --75.8766 --75.8922 --75.8891 --75.9016 --75.875 --75.8844 --75.8844 --75.8906 --75.8875 --75.8844 --75.8859 --75.8828 --75.8797 --75.8719 --75.8703 --75.8906 --75.875 --75.8953 --75.8906 --75.8812 --75.8781 --75.8969 --75.8828 --75.8797 --75.8875 --75.8812 --75.8812 --75.8719 --75.8953 --75.8906 --75.8938 --75.8875 --75.8844 --75.8766 --75.8797 --75.8719 --75.8938 --75.8797 --75.8875 --75.8953 --75.8891 --75.8781 --75.8828 --75.8797 --75.9016 --75.8875 --75.9062 --75.8953 --75.9047 --75.8938 --75.9141 --75.8859 --75.8875 --75.8812 --75.8875 --75.8828 --75.8906 --75.8906 --75.8938 --75.8906 --75.9016 --75.875 --75.8797 --75.8906 --75.9047 --75.8844 --75.8875 --75.8984 --75.8828 --75.8938 --75.8953 --75.8859 --75.9016 --75.8859 --75.8984 --75.8891 --75.8875 --75.8922 --75.8922 --75.8844 --75.8875 --75.8844 --75.9016 --75.8875 --75.8859 --75.8891 --75.8969 --75.8844 --75.8844 --75.8938 --75.8859 --75.8859 --75.8922 --75.8812 --75.8938 --75.8938 --75.8812 --75.8828 --75.9031 --75.8875 --75.8922 --75.8984 --75.875 --75.8812 --75.8891 --75.8797 --75.8828 --75.8766 --75.8859 --75.8953 --75.8875 --75.8844 --75.8844 --75.8844 --75.8906 --75.8938 --75.8812 --75.9 --75.9047 --75.8906 --75.8922 --75.8969 --75.8875 --75.875 --75.8734 --75.9062 --75.8984 --75.8922 --75.8875 --75.8953 --75.8875 --75.8859 --75.8891 --75.8906 --75.8906 --75.8922 --75.8797 --75.8828 --75.8859 --75.8797 --75.8984 --75.8812 --75.8938 --75.8703 --75.8844 --75.9109 --75.8906 --75.8922 --75.8875 --75.8906 --75.8922 --75.8938 --75.8938 --75.8844 --75.8906 --75.8766 --75.8812 --75.8891 --75.8891 --75.8688 --75.8812 --75.8828 --75.8734 --75.8891 --75.8938 --75.8844 --75.9016 --75.8828 --75.8766 --75.875 --75.8719 --75.8766 --75.8953 --75.8875 --75.8844 --75.8859 --75.8953 --75.8922 --75.8781 --75.8922 --75.8969 --75.8828 --75.8844 --75.8844 --75.8828 --75.8797 --75.8984 --75.8828 --75.8844 --75.8766 --75.8844 --75.8891 --75.8812 --75.8812 --75.8875 --75.8984 --75.8734 --75.8859 --75.8766 --75.8844 --75.8781 --75.8859 --75.8891 --75.8922 --75.9 --75.8969 --75.8891 --75.9062 --75.8859 --75.8938 --75.8828 --75.8875 --75.8922 --75.8891 --75.8828 --75.9047 --75.8922 --75.8859 --75.8875 --75.9016 --75.9 --75.9016 --75.8906 --75.8938 --75.8922 --75.8906 --75.8938 --75.9016 --75.8875 --75.9016 --75.8953 --75.8938 --75.8922 --75.9062 --75.8906 --75.8984 --75.9031 --75.8844 --75.9031 --75.8891 --75.8906 --75.8828 --75.8891 --75.8906 --75.875 --75.8859 --75.8844 --75.8828 --75.8906 --75.8906 --75.8891 --75.8812 --75.8766 --75.8766 --75.8844 --75.8922 --75.8734 --75.8812 --75.8906 --75.8828 --75.8844 --75.8953 --75.8984 --75.8859 --75.9047 --75.8844 --75.8844 --75.8969 --75.8797 --75.8875 --75.8859 --75.8891 --75.8828 --75.8953 --75.8875 --75.8922 --75.8953 --75.9016 --75.9141 --75.8875 --75.8922 --75.8875 --75.8891 --75.9125 --75.8969 --75.8922 --75.8969 --75.8875 --75.8891 --75.8891 --75.8906 --75.8891 --75.8938 --75.8938 --75.8797 --75.8906 --75.8812 --75.8781 --75.8875 --75.8844 --75.8906 --75.8891 --75.875 --75.8938 --75.8922 --75.8969 --75.8875 --75.8922 --75.8859 --75.8938 --75.9062 --75.8953 --75.8891 --75.8797 --75.8844 --75.8906 --75.8922 --75.8781 --75.8812 --75.9016 --75.8844 --75.8719 --75.8984 --75.8953 --75.8688 --75.8828 --75.8938 --75.8797 --75.8844 --75.875 --75.8984 --75.8859 --75.8984 --75.9031 --75.9109 --75.8859 --75.8891 --75.8969 --75.8984 --75.8859 --75.8844 --75.8891 --75.8859 --75.8922 --75.8984 --75.8938 --75.8922 --75.9062 --75.9016 --75.8859 --75.9031 --75.9031 --75.9062 --75.8953 --75.8984 --75.9047 --75.9141 --75.9109 --75.9016 --75.8953 --75.8969 --75.9109 --75.9125 --75.8969 --75.8938 --75.9078 --75.8891 --75.9016 --75.8953 --75.8969 --75.9062 --75.8938 --75.9062 --75.9016 --75.9109 --75.9 --75.8922 --75.9078 --75.9062 --75.8891 --75.8969 --75.8953 --75.8906 --75.8938 --75.9047 --75.9219 --75.9031 --75.9062 --75.9062 --75.9031 --75.9062 --75.9062 --75.9141 --75.9156 --75.8984 --75.9031 --75.9109 --75.9078 --75.9 --75.9109 --75.9031 --75.9062 --75.9078 --75.8984 --75.8938 --75.9125 --75.8984 --75.9125 --75.8938 --75.9094 --75.8984 --75.8953 --75.9125 --75.8969 --75.8969 --75.9 --75.8953 --75.9016 --75.9141 --75.9031 --75.9062 --75.9047 --75.9016 --75.9109 --75.8922 --75.9062 --75.9 --75.9125 --75.9078 --75.9 --75.8922 --75.9078 --75.9031 --75.9016 --75.8922 --75.9047 --75.8875 --75.8953 --75.925 --75.9141 --75.9062 --75.8984 --75.8938 --75.9016 --75.9031 --75.9156 --75.9125 --75.925 --75.9094 --75.9234 --75.9156 --75.9219 --75.9 --75.9172 --75.9109 --75.9203 --75.9203 --75.8969 --75.9094 --75.9078 --75.9109 --75.9359 --75.9109 --75.9078 --75.9047 --75.8984 --75.9062 --75.9031 --75.9109 --75.8906 --75.9062 --75.9047 --75.9156 --75.9047 --75.9078 --75.8969 --75.9141 --75.9109 --75.9094 --75.9 --75.9203 --75.9172 --75.9031 --75.9094 --75.8969 --75.9141 --75.9078 --75.9109 --75.9109 --75.9125 --75.9109 --75.9078 --75.9062 --75.9078 --75.9109 --75.9125 --75.9125 --75.9094 --75.9078 --75.9078 --75.8953 --75.8938 --75.8953 --75.9016 --75.8922 --75.9047 --75.8984 --75.9062 --75.9016 --75.9047 --75.8891 --75.9094 --75.9 --75.9047 --75.8969 --75.8922 --75.8906 --75.9062 --75.9156 --75.8922 --75.8953 --75.8969 --75.8797 --75.8875 --75.9062 --75.8828 --75.9062 --75.8766 --75.9016 --75.8938 --75.8875 --75.8922 --75.8891 --75.8906 --75.9047 --75.8859 --75.8922 --75.8906 --75.8953 --75.8953 --75.8922 --75.8922 --75.8938 --75.8938 --75.8984 --75.9141 --75.8891 --75.9016 --75.8906 --75.9109 --75.8922 --75.9031 --75.8938 --75.8984 --75.8953 --75.8812 --75.8938 --75.8953 --75.9016 --75.8875 --75.8938 --75.8922 --75.8938 --75.9047 --75.9047 --75.8953 --75.8984 --75.9 --75.9016 --75.9078 --75.9141 --75.8969 --75.8984 --75.9 --75.8969 --75.9016 --75.9016 --75.9047 --75.9 --75.8969 --75.9094 --75.8969 --75.9109 --75.9047 --75.9047 --75.8984 --75.8938 --75.9 --75.9062 --75.9078 --75.9062 --75.9062 --75.9031 --75.8969 --75.8938 --75.9094 --75.9016 --75.9047 --75.8906 --75.9047 --75.9078 --75.8906 --75.9016 --75.9109 --75.8938 --75.9109 --75.9016 --75.9078 --75.9031 --75.9078 --75.9078 --75.9109 --75.9109 --75.9141 --75.9078 --75.9094 --75.9 --75.9047 --75.9109 --75.925 --75.9109 --75.9109 --75.8969 --75.9 --75.9016 --75.9156 --75.8859 --75.9141 --75.9109 --75.9094 --75.9109 --75.9187 --75.9078 --75.8984 --75.9203 --75.9234 --75.9031 --75.9125 --75.9172 --75.9172 --75.9016 --75.9125 --75.9172 --75.9141 --75.9062 --75.9109 --75.9156 --75.9156 --75.9094 --75.9109 --75.9078 --75.9125 --75.8953 --75.9109 --75.9062 --75.9109 --75.9266 --75.9156 --75.9094 --75.9156 --75.8953 --75.9172 --75.9203 --75.925 --75.9281 --75.9266 --75.9187 --75.9156 --75.9187 --75.9141 --75.9172 --75.9109 --75.9156 --75.9094 --75.9234 --75.9 --75.9078 --75.9141 --75.9031 --75.9203 --75.9234 --75.9187 --75.9078 --75.8953 --75.9125 --75.9031 --75.9062 --75.9016 --75.9062 --75.9094 --75.8891 --75.8938 --75.9125 --75.9078 --75.9031 --75.9125 --75.9062 --75.8953 --75.8984 --75.8938 --75.9062 --75.9047 --75.9016 --75.9031 --75.9125 --75.9031 --75.9062 --75.9016 --75.9 --75.9172 --75.9 --75.9094 --75.9125 --75.9094 --75.8922 --75.9141 --75.9297 --75.9313 --75.9078 --75.9031 --75.9078 --75.9187 --75.9125 --75.8984 --75.9172 --75.9031 --75.9 --75.8969 --75.9141 --75.9187 --75.9031 --75.8984 --75.9094 --75.9125 --75.9094 --75.9219 --75.9 --75.9234 --75.9078 --75.9062 --75.9016 --75.8938 --75.9031 --75.9187 --75.9047 --75.9094 --75.9109 --75.9062 --75.9047 --75.9109 --75.9109 --75.8969 --75.8953 --75.9125 --75.9141 --75.9047 --75.8984 --75.9094 --75.9109 --75.9062 --75.9062 --75.9031 --75.9094 --75.9109 --75.9078 --75.9094 --75.9094 --75.9094 --75.8953 --75.9062 --75.9109 --75.9016 --75.9156 --75.9078 --75.9109 --75.9172 --75.9141 --75.9187 --75.9141 --75.9266 --75.9047 --75.9125 --75.9281 --75.9156 --75.9062 --75.9281 --75.9094 --75.9141 --75.9109 --75.9313 --75.9109 --75.9094 --75.9141 --75.9187 --75.9109 --75.9094 --75.9219 --75.9187 --75.9187 --75.9281 --75.9141 --75.9156 --75.9156 --75.9 --75.9125 --75.9156 --75.9109 --75.9125 --75.9172 --75.9109 --75.9109 --75.9047 --75.9297 --75.9297 --75.9156 --75.9219 --75.9203 --75.9328 --75.9187 --75.9172 --75.9219 --75.9172 --75.9313 --75.9141 --75.9109 --75.9281 --75.9109 --75.9344 --75.9187 --75.9219 --75.9156 --75.9172 --75.9094 --75.9187 --75.9109 --75.9094 --75.9094 --75.9203 --75.9187 --75.9187 --75.925 --75.9281 --75.9203 --75.9109 --75.9203 --75.9109 --75.9156 --75.9156 --75.9062 --75.9219 --75.9297 --75.9203 --75.9203 --75.9125 --75.9094 --75.9266 --75.9187 --75.9203 --75.9203 --75.9156 --75.9281 --75.9109 --75.9219 --75.9234 --75.9125 --75.9156 --75.9203 --75.9078 --75.9125 --75.9187 --75.9125 --75.925 --75.9109 --75.9016 --75.9156 --75.9187 --75.9187 --75.9172 --75.9203 --75.9125 --75.9266 --75.9141 --75.9187 --75.9125 --75.9219 --75.925 --75.9219 --75.9062 --75.9047 --75.9156 --75.9219 --75.9219 --75.9203 --75.9094 --75.9125 --75.9078 --75.9187 --75.925 --75.9172 --75.9187 --75.9125 --75.9109 --75.9109 --75.9062 --75.9156 --75.9062 --75.9219 --75.9047 --75.9094 --75.9156 --75.9297 --75.9062 --75.9172 --75.925 --75.9078 --75.9234 --75.9187 --75.9109 --75.9187 --75.925 --75.9203 --75.9078 --75.9234 --75.9125 --75.9281 --75.9234 --75.9234 --75.9219 --75.9172 --75.9187 --75.9172 --75.9078 --75.9203 --75.9266 --75.9078 --75.9187 --75.9109 --75.9141 --75.9094 --75.9266 --75.9266 --75.9187 --75.9187 --75.9172 --75.9297 --75.9109 --75.9094 --75.9297 --75.9281 --75.9234 --75.9281 --75.9141 --75.9203 --75.9219 --75.925 --75.9187 --75.9094 --75.9141 --75.925 --75.9141 --75.9187 --75.9141 --75.9187 --75.9 --75.9156 --75.9156 --75.9062 --75.9219 --75.9297 --75.9187 --75.9266 --75.9187 --75.9219 --75.9203 --75.9234 --75.9187 --75.9078 --75.9156 --75.9078 --75.9328 --75.9172 --75.9078 --75.9125 --75.9141 --75.9219 --75.925 --75.9109 --75.9187 --75.9219 --75.9125 --75.9141 --75.9141 --75.9187 --75.9203 --75.9313 --75.9078 --75.9234 --75.9203 --75.9203 --75.9172 --75.9281 --75.9359 --75.9109 --75.9297 --75.9406 --75.9234 --75.9172 --75.925 --75.925 --75.9328 --75.9172 --75.9344 --75.9141 --75.9344 --75.9328 --75.925 --75.9156 --75.925 --75.9234 --75.9141 --75.9234 --75.9203 --75.9203 --75.9203 --75.9109 --75.9141 --75.9094 --75.9125 --75.9156 --75.9062 --75.8984 --75.9109 --75.9172 --75.9047 --75.925 --75.925 --75.9266 --75.925 --75.9266 --75.9266 --75.9313 --75.9297 --75.9172 --75.9219 --75.9172 --75.9219 --75.925 --75.9219 --75.9109 --75.925 --75.9234 --75.9234 --75.9281 --75.9141 --75.9266 --75.9203 --75.9187 --75.9281 --75.9109 --75.9234 --75.9172 --75.9172 --75.9172 --75.925 --75.9297 --75.9266 --75.9266 --75.9109 --75.9094 --75.9281 --75.9297 --75.9328 --75.9344 --75.9203 --75.9156 --75.9234 --75.9156 --75.925 --75.9375 --75.9187 --75.9187 --75.9266 --75.9313 --75.9234 --75.9109 --75.9313 --75.9266 --75.9313 --75.9219 --75.9156 --75.9219 --75.9109 --75.9328 --75.9313 --75.9187 --75.9078 --75.9297 --75.9219 --75.9203 --75.9187 --75.9422 --75.9281 --75.9297 --75.925 --75.9125 --75.9156 --75.9281 --75.9234 --75.9094 --75.925 --75.9266 --75.9266 --75.9297 --75.9156 --75.925 --75.9297 --75.9313 --75.9313 --75.9141 --75.9187 --75.9344 --75.9172 --75.925 --75.9219 --75.925 --75.9266 --75.9234 --75.9172 --75.9156 --75.9125 --75.9219 --75.9266 --75.9266 --75.9375 --75.925 --75.925 --75.9281 --75.9219 --75.9219 --75.9234 --75.925 --75.9234 --75.9234 --75.9281 --75.9297 --75.9328 --75.9141 --75.9187 --75.9172 --75.9156 --75.9109 --75.925 --75.9187 --75.9266 --75.9109 --75.9156 --75.9172 --75.9281 --75.9187 --75.9109 --75.9203 --75.9156 --75.9172 --75.9094 --75.9141 --75.9172 --75.9078 --75.9062 --75.9234 --75.9062 --75.9172 --75.9297 --75.9156 --75.9016 --75.9187 --75.9297 --75.9125 --75.9156 --75.925 --75.9266 --75.9234 --75.9313 --75.9187 --75.9328 --75.925 --75.9219 --75.9078 --75.9156 --75.9141 --75.9187 --75.9141 --75.9141 --75.9016 --75.9156 --75.9234 --75.9109 --75.9109 --75.9187 --75.9172 --75.9109 --75.9187 --75.9187 --75.9016 --75.9094 --75.9187 --75.9172 --75.9109 --75.9125 --75.9062 --75.9203 --75.9062 --75.8953 --75.9203 --75.9062 --75.9 --75.9125 --75.9156 --75.9 --75.8984 --75.9125 --75.9156 --75.9078 --75.9141 --75.9062 --75.9172 --75.9062 --75.9187 --75.9109 --75.925 --75.9109 --75.925 --75.9156 --75.9109 --75.9078 --75.9187 --75.9297 --75.9172 --75.9109 --75.9234 --75.9344 --75.9062 --75.9094 --75.9016 --75.9125 --75.8922 --75.9172 --75.9172 --75.9125 --75.9016 --75.9234 --75.9094 --75.9141 --75.9266 --75.9172 --75.9047 --75.9141 --75.9094 --75.9203 --75.9375 --75.9078 --75.9156 --75.9187 --75.9156 --75.9109 --75.9156 --75.9281 --75.9078 --75.925 --75.9094 --75.9016 --75.9172 --75.9156 --75.9016 --75.925 --75.9062 --75.9125 --75.9187 --75.9203 --75.9203 --75.9187 --75.9094 --75.8984 --75.9125 --75.9094 --75.9109 --75.9187 --75.9094 --75.9234 --75.9203 --75.925 --75.9187 --75.9266 --75.9203 --75.9219 --75.9187 --75.9156 --75.9047 --75.9125 --75.9031 --75.9125 --75.9313 --75.9031 --75.9203 --75.9078 --75.9313 --75.9078 --75.9094 --75.9062 --75.9297 --75.9016 --75.925 --75.9219 --75.9156 --75.9125 --75.9031 --75.9141 --75.9234 --75.9062 --75.9031 --75.9141 --75.8938 --75.9078 --75.8969 --75.9109 --75.9078 --75.9047 --75.9016 --75.9016 --75.9094 --75.9109 --75.8984 --75.9031 --75.9125 --75.9094 --75.9094 --75.9016 --75.9172 --75.9094 --75.9062 --75.9156 --75.9094 --75.9109 --75.9203 --75.9203 --75.9109 --75.9031 --75.9109 --75.9062 --75.9266 --75.9031 --75.9125 --75.9 --75.9156 --75.9 --75.9187 --75.9078 --75.9078 --75.9047 --75.9109 --75.8984 --75.9187 --75.9125 --75.8969 --75.9156 --75.9062 --75.9172 --75.9047 --75.9156 --75.9203 --75.9125 --75.9156 --75.9141 --75.9203 --75.9078 --75.9047 --75.9109 --75.9062 --75.9187 --75.9109 --75.9 --75.9109 --75.9109 --75.9078 --75.9172 --75.9203 --75.9109 --75.9219 --75.9047 --75.9187 --75.9125 --75.9031 --75.9125 --75.9281 --75.9219 --75.9062 --75.925 --75.9266 --75.9203 --75.9297 --75.9187 --75.9219 --75.9047 --75.9125 --75.9078 --75.9062 --75.8984 --75.9172 --75.9125 --75.9062 --75.9047 --75.9031 --75.9172 --75.9094 --75.9172 --75.9125 --75.9047 --75.9047 --75.9062 --75.9062 --75.9109 --75.9094 --75.8938 --75.9094 --75.9219 --75.9031 --75.9125 --75.9125 --75.9141 --75.9141 --75.9109 --75.8953 --75.9047 --75.9062 --75.9125 --75.9031 --75.9078 --75.9125 --75.8953 --75.9094 --75.9094 --75.9062 --75.9078 --75.9062 --75.9313 --75.9141 --75.9094 --75.9156 --75.9109 --75.9109 --75.9 --75.9156 --75.9094 --75.9047 --75.9187 --75.9234 --75.8984 --75.9047 --75.9219 --75.9062 --75.9109 --75.9234 --75.9125 --75.9203 --75.9187 --75.9234 --75.9172 --75.9219 --75.9094 --75.9125 --75.9062 --75.925 --75.9031 --75.9156 --75.9016 --75.9031 --75.8953 --75.9062 --75.9094 --75.9109 --75.9016 --75.9016 --75.9031 --75.9016 --75.9156 --75.9078 --75.9125 --75.9031 --75.8922 --75.9141 --75.9047 --75.9094 --75.8969 --75.9094 --75.9125 --75.9172 --75.9 --75.9125 --75.9 --75.9062 --75.9297 --75.8922 --75.9141 --75.9047 --75.9062 --75.9203 --75.9156 --75.9031 --75.9109 --75.9156 --75.9047 --75.9125 --75.9125 --75.9266 --75.9187 --75.9078 --75.9094 --75.9141 --75.9094 --75.9125 --75.9109 --75.9031 --75.9047 --75.9172 --75.9219 --75.9016 --75.9094 --75.9047 --75.9141 --75.9062 --75.9109 --75.9016 --75.9 --75.9047 --75.9047 --75.9297 --75.9125 --75.9203 --75.9078 --75.9187 --75.9141 --75.9 --75.9109 --75.9187 --75.9078 --75.9094 --75.925 --75.9172 --75.9203 --75.9234 --75.9031 --75.9219 --75.9125 --75.9125 --75.9156 --75.8891 --75.9047 --75.9094 --75.9031 --75.9062 --75.9203 --75.9031 --75.9219 --75.9141 --75.9125 --75.9156 --75.9078 --75.9297 --75.9078 --75.9078 --75.9156 --75.9219 --75.9203 --75.9203 --75.9203 --75.9156 --75.9062 --75.9109 --75.9203 --75.9078 --75.9109 --75.9031 --75.9094 --75.9078 --75.9187 --75.9078 --75.9078 --75.9047 --75.9031 --75.9047 --75.9219 --75.9078 --75.9156 --75.9141 --75.9187 --75.9047 --75.9141 --75.9094 --75.9219 --75.9281 --75.9203 --75.9313 --75.9297 --75.9187 --75.9297 --75.9266 --75.9109 --75.9234 --75.9281 --75.9156 --75.9141 --75.9156 --75.9094 --75.9234 --75.9219 --75.9313 --75.9422 --75.9109 --75.9109 --75.9172 --75.9062 --75.9297 --75.925 --75.9219 --75.9234 --75.925 --75.9203 --75.9203 --75.9203 --75.9187 --75.9203 --75.9203 --75.9297 --75.9156 --75.9187 --75.925 --75.925 --75.9187 --75.9266 --75.9359 --75.9203 --75.9141 --75.9047 --75.9219 --75.9078 --75.925 --75.9266 --75.9266 --75.9156 --75.9141 --75.9266 --75.9219 --75.9266 --75.9125 --75.9266 --75.9125 --75.9203 --75.9062 --75.9156 --75.9313 --75.9313 --75.9187 --75.9281 --75.9313 --75.9203 --75.9203 --75.9281 --75.9203 --75.9187 --75.9328 --75.9266 --75.925 --75.9187 --75.9156 --75.9234 --75.9172 --75.9172 --75.9187 --75.9281 --75.9203 --75.9156 --75.9219 --75.9172 --75.9156 --75.9172 --75.9234 --75.9062 --75.9141 --75.9187 --75.9094 --75.9125 --75.9141 --75.9156 --75.9156 --75.9125 --75.9203 --75.9094 --75.9156 --75.925 --75.9109 --75.9156 --75.9109 --75.9313 --75.9141 --75.9109 --75.9031 --75.9156 --75.9078 --75.9219 --75.9187 --75.9234 --75.9094 --75.9219 --75.9094 --75.9172 --75.8984 --75.9062 --75.9313 --75.9391 --75.9297 --75.9266 --75.9031 --75.9141 --75.9172 --75.9203 --75.9047 --75.9062 --75.8969 --75.9156 --75.9141 --75.9234 --75.9203 --75.9297 --75.925 --75.9313 --75.9375 --75.9219 --75.925 --75.9219 --75.9047 --75.9187 --75.9141 --75.9234 --75.9375 --75.9172 --75.9281 --75.9297 --75.9297 --75.9328 --75.9297 --75.925 --75.9141 --75.9172 --75.9031 --75.9031 --75.9203 --75.9031 --75.9156 --75.9156 --75.9141 --75.9219 --75.9297 --75.9219 --75.9281 --75.925 --75.9203 --75.9266 --75.9172 --75.9156 --75.9094 --75.9375 --75.9266 --75.9297 --75.925 --75.9094 --75.9203 --75.9094 --75.9156 --75.9141 --75.9047 --75.9234 --75.9109 --75.9187 --75.9156 --75.9281 --75.9125 --75.9109 --75.9281 --75.9266 --75.9172 --75.9141 --75.9109 --75.9203 --75.9125 --75.9187 --75.9156 --75.9266 --75.9187 --75.9125 --75.9187 --75.9297 --75.9219 --75.9187 --75.9047 --75.9344 --75.9234 --75.9344 --75.9187 --75.9297 --75.9141 --75.9141 --75.9203 --75.9313 --75.925 --75.9141 --75.9172 --75.9234 --75.9078 --75.9281 --75.9187 --75.9281 --75.9219 --75.9109 --75.9156 --75.9062 --75.9016 --75.9219 --75.9203 --75.925 --75.9156 --75.9156 --75.925 --75.925 --75.9141 --75.9125 --75.9125 --75.9156 --75.9094 --75.9047 --75.9078 --75.9234 --75.9031 --75.9266 --75.9141 --75.9094 --75.9219 --75.9297 --75.9297 --75.9203 --75.9187 --75.9219 --75.9172 --75.9078 --75.9125 --75.9234 --75.9141 --75.9141 --75.9203 --75.9234 --75.9141 --75.9156 --75.9156 --75.9281 --75.9141 --75.9203 --75.925 --75.9 --75.9219 --75.9281 --75.9172 --75.9109 --75.9125 --75.9219 --75.9031 --75.9141 --75.9391 --75.9031 --75.9172 --75.9078 --75.9109 --75.9187 --75.9 --75.9203 --75.9219 --75.9016 --75.9156 --75.9094 --75.9109 --75.9203 --75.9187 --75.9187 --75.9172 --75.9172 --75.9172 --75.9156 --75.9109 --75.9234 --75.9203 --75.9109 --75.9062 --75.9219 --75.9125 --75.9141 --75.9172 --75.8984 --75.9187 --75.9172 --75.9203 --75.9141 --75.9156 --75.9156 --75.9156 --75.9078 --75.9172 --75.9141 --75.8922 --75.9141 --75.9219 --75.9172 --75.9172 --75.9141 --75.9016 --75.9109 --75.9125 --75.9172 --75.9172 --75.9156 --75.9078 --75.9187 --75.9109 --75.9078 --75.9219 --75.9187 --75.9234 --75.9203 --75.9234 --75.9203 --75.9141 --75.9359 --75.9125 --75.9156 --75.9187 --75.9141 --75.9016 --75.9172 --75.9203 --75.925 --75.9313 --75.925 --75.9062 --75.9219 --75.9266 --75.9266 --75.9125 --75.9219 --75.925 --75.9156 --75.9125 --75.9234 --75.9125 --75.9219 --75.9266 --75.9203 --75.9234 --75.9125 --75.9187 --75.9266 --75.9156 --75.9281 --75.9125 --75.925 --75.9219 --75.9359 --75.9266 --75.9297 --75.9172 --75.9359 --75.9219 --75.9219 --75.9141 --75.9172 --75.9203 --75.9344 --75.925 --75.9141 --75.9109 --75.9078 --75.9203 --75.9172 --75.9266 --75.9219 --75.9328 --75.9156 --75.9187 --75.925 --75.925 --75.9141 --75.9297 --75.9156 --75.9203 --75.9234 --75.9313 --75.9344 --75.9187 --75.9172 --75.9219 --75.9078 --75.9187 --75.9172 --75.9281 --75.9297 --75.9203 --75.9281 --75.925 --75.9313 --75.9141 --75.9062 --75.9375 --75.9203 --75.9109 --75.9313 --75.9281 --75.9328 --75.925 --75.9156 --75.9297 --75.925 --75.9266 --75.9391 --75.9297 --75.9328 --75.9281 --75.9172 --75.9359 --75.9313 --75.9437 --75.9281 --75.9219 --75.9281 --75.9156 --75.925 --75.9281 --75.9313 --75.9078 --75.9016 --75.9219 --75.9266 --75.9297 --75.9187 --75.9234 --75.9078 --75.9172 --75.9219 --75.9156 --75.9156 --75.9172 --75.9203 --75.9172 --75.9109 --75.9125 --75.925 --75.9141 --75.9125 --75.9109 --75.9297 --75.9078 --75.9094 --75.9047 --75.9125 --75.9141 --75.9234 --75.9203 --75.9156 --75.9047 --75.9031 --75.9109 --75.9062 --75.9281 --75.9266 --75.9031 --75.9047 --75.9125 --75.9062 --75.9094 --75.9234 --75.9219 --75.9328 --75.9078 --75.9156 --75.9109 --75.9203 --75.9156 --75.9141 --75.9234 --75.9031 --75.9172 --75.9094 --75.9 --75.9125 --75.9234 --75.9125 --75.9156 --75.9172 --75.9156 --75.9234 --75.9031 --75.9078 --75.9172 --75.9156 --75.9219 --75.9156 --75.9141 --75.9062 --75.9078 --75.9141 --75.9 --75.9187 --75.9156 --75.9328 --75.9109 --75.9156 --75.9234 --75.9016 --75.9187 --75.9187 --75.9125 --75.9172 --75.9078 --75.9125 --75.9187 --75.9156 --75.9187 --75.925 --75.9313 --75.9187 --75.9109 --75.9141 --75.9313 --75.9187 --75.9219 --75.9234 --75.9203 --75.9297 --75.9313 --75.9187 --75.9219 --75.9187 --75.9172 --75.9094 --75.9187 --75.9234 --75.9172 --75.9109 --75.9172 --75.9078 --75.9219 --75.9203 --75.9187 --75.925 --75.9141 --75.9156 --75.9187 --75.9172 --75.9266 --75.9297 --75.9219 --75.9219 --75.9297 --75.9297 --75.9141 --75.9203 --75.9094 --75.925 --75.9047 --75.9156 --75.9219 --75.9281 --75.9219 --75.925 --75.9406 --75.9187 --75.9234 --75.9172 --75.9141 --75.9234 --75.9328 --75.9281 --75.9187 --75.9234 --75.9109 --75.9187 --75.9234 --75.9156 --75.9187 --75.9125 --75.9297 --75.9203 --75.9344 --75.9297 --75.9187 --75.925 --75.9328 --75.9313 --75.9359 --75.9297 --75.9187 --75.9219 --75.9359 --75.9359 --75.9281 --75.9344 --75.9266 --75.9344 --75.9359 --75.9344 --75.9266 --75.9234 --75.9297 --75.9328 --75.9313 --75.9266 --75.9469 --75.9422 --75.9313 --75.9375 --75.9313 --75.9437 --75.9406 --75.9375 --75.9297 --75.9422 --75.9359 --75.9484 --75.95 --75.9469 --75.9453 --75.9328 --75.9406 --75.9359 --75.9391 --75.9422 --75.9391 --75.9297 --75.9437 --75.9297 --75.9328 --75.9359 --75.95 --75.9281 --75.9422 --75.9359 --75.9281 --75.9313 --75.9406 --75.9531 --75.9313 --75.9313 --75.95 --75.9391 --75.9469 --75.9328 --75.9344 --75.9375 --75.9313 --75.9516 --75.9375 --75.9313 --75.9344 --75.9313 --75.9359 --75.9266 --75.9281 --75.925 --75.9172 --75.9313 --75.9344 --75.9344 --75.9219 --75.9313 --75.9297 --75.9266 --75.9313 --75.9281 --75.9297 --75.9359 --75.9219 --75.9375 --75.9375 --75.9422 --75.9375 --75.9359 --75.9375 --75.9297 --75.9297 --75.9266 --75.9313 --75.9313 --75.9219 --75.9344 --75.9281 --75.9375 --75.9375 --75.9203 --75.9297 --75.9391 --75.9281 --75.9453 --75.9344 --75.9297 --75.9219 --75.9172 --75.9422 --75.9125 --75.9281 --75.9281 --75.9266 --75.9359 --75.9219 --75.9187 --75.9328 --75.9266 --75.9297 --75.9313 --75.9531 --75.9344 --75.9281 --75.9328 --75.9313 --75.9328 --75.9453 --75.9234 --75.9406 --75.9266 --75.9297 --75.9344 --75.9141 --75.9281 --75.9219 --75.9187 --75.9234 --75.9172 --75.9219 --75.9203 --75.9375 --75.925 --75.925 --75.9313 --75.9219 --75.9141 --75.9219 --75.9313 --75.9328 --75.9375 --75.9234 --75.9281 --75.925 --75.925 --75.9297 --75.9219 --75.9313 --75.9313 --75.9328 --75.9297 --75.9391 --75.9219 --75.9187 --75.9375 --75.9391 --75.9406 --75.925 --75.9297 --75.9328 --75.925 --75.9375 --75.9313 --75.9422 --75.925 --75.9266 --75.9203 --75.9219 --75.9297 --75.9109 --75.9359 --75.9281 --75.9359 --75.9297 --75.9266 --75.9313 --75.925 --75.9266 --75.9297 --75.9203 --75.9266 --75.9313 --75.9344 --75.925 --75.925 --75.9156 --75.9219 --75.9313 --75.9297 --75.9156 --75.9219 --75.9359 --75.9359 --75.9234 --75.9328 --75.9172 --75.9297 --75.9359 --75.9234 --75.9172 --75.9109 --75.9109 --75.9297 --75.9313 --75.9297 --75.9359 --75.9234 --75.9328 --75.925 --75.9125 --75.9219 --75.9203 --75.9313 --75.925 --75.9187 --75.9281 --75.9281 --75.9266 --75.9172 --75.9141 --75.9328 --75.9344 --75.925 --75.9328 --75.925 --75.9313 --75.925 --75.9297 --75.925 --75.9203 --75.9203 --75.9219 --75.9313 --75.9172 --75.9266 --75.9234 --75.925 --75.9141 --75.9281 --75.9281 --75.9266 --75.9313 --75.9375 --75.9266 --75.9219 --75.9406 --75.9313 --75.9328 --75.95 --75.9437 --75.9344 --75.9391 --75.9344 --75.9437 --75.9437 --75.9375 --75.9437 --75.9281 --75.9516 --75.9469 --75.9266 --75.9391 --75.9281 --75.9359 --75.925 --75.9266 --75.9437 --75.9203 --75.9391 --75.9422 --75.925 --75.9313 --75.9406 --75.9391 --75.9266 --75.9281 --75.9266 --75.9219 --75.9203 --75.9281 --75.9172 --75.9219 --75.9375 --75.9344 --75.9109 --75.9172 --75.9281 --75.9203 --75.9141 --75.9344 --75.9266 --75.9219 --75.9141 --75.9313 --75.9219 --75.9156 --75.9234 --75.9313 --75.9172 --75.9406 --75.9375 --75.925 --75.9187 --75.9297 --75.9281 --75.9328 --75.9375 --75.9266 --75.9266 --75.9313 --75.9297 --75.9125 --75.9141 --75.9219 --75.9156 --75.9359 --75.9219 --75.9219 --75.9172 --75.925 --75.9469 --75.9375 --75.9313 --75.9375 --75.9406 --75.9266 --75.9234 --75.9281 --75.9219 --75.9375 --75.9094 --75.9141 --75.9281 --75.9328 --75.9359 --75.9234 --75.9281 --75.9453 --75.9219 --75.9313 --75.9344 --75.9234 --75.9187 --75.9187 --75.9375 --75.9297 --75.9375 --75.9344 --75.9234 --75.9281 --75.9344 --75.9266 --75.9234 --75.9281 --75.9359 --75.9281 --75.9187 --75.925 --75.9375 --75.9344 --75.9266 --75.9266 --75.9281 --75.9266 --75.9281 --75.9156 --75.9219 --75.9266 --75.9297 --75.9406 --75.9219 --75.9359 --75.9266 --75.9469 --75.9359 --75.9422 --75.9375 --75.9219 --75.9234 --75.9391 --75.9406 --75.9328 --75.9297 --75.9375 --75.9375 --75.9328 --75.925 --75.9375 --75.9281 --75.9266 --75.9422 --75.9234 --75.9234 --75.9266 --75.9453 --75.925 --75.9156 --75.9172 --75.9219 --75.9203 --75.9281 --75.9281 --75.9016 --75.9125 --75.9141 --75.9031 --75.9234 --75.9062 --75.9187 --75.9156 --75.9125 --75.925 --75.9109 --75.9219 --75.9234 --75.9187 --75.9047 --75.925 --75.9187 --75.925 --75.9344 --75.9094 --75.9125 --75.9219 --75.9266 --75.9172 --75.9125 --75.9234 --75.9406 --75.9219 --75.9359 --75.925 --75.9219 --75.9313 --75.9281 --75.9266 --75.9203 --75.9219 --75.9297 --75.9203 --75.9281 --75.925 --75.9266 --75.9313 --75.9437 --75.9266 --75.9359 --75.9328 --75.9375 --75.925 --75.9375 --75.9266 --75.9297 --75.9437 --75.9187 --75.9219 --75.9281 --75.9297 --75.9266 --75.9219 --75.9359 --75.9391 --75.9453 --75.9281 --75.9266 --75.9375 --75.9281 --75.9281 --75.9266 --75.9359 --75.9344 --75.9375 --75.9344 --75.9156 --75.9297 --75.9313 --75.9328 --75.9172 --75.9281 --75.9344 --75.925 --75.9203 --75.9266 --75.9313 --75.9297 --75.9313 --75.9203 --75.9266 --75.9281 --75.9234 --75.9297 --75.9172 --75.9391 --75.9313 --75.9281 --75.925 --75.9391 --75.9313 --75.9297 --75.9219 --75.9391 --75.9344 --75.9141 --75.9187 --75.9234 --75.9281 --75.9328 --75.9359 --75.9344 --75.9141 --75.925 --75.9219 --75.9297 --75.925 --75.9234 --75.9187 --75.9313 --75.9313 --75.9234 --75.9203 --75.9187 --75.9266 --75.9297 --75.9203 --75.9219 --75.9141 --75.9141 --75.9344 --75.9141 --75.9187 --75.9297 --75.9219 --75.9156 --75.9203 --75.9125 --75.9313 --75.9281 --75.9297 --75.9266 --75.9266 --75.9187 --75.9266 --75.925 --75.9391 --75.925 --75.9344 --75.9328 --75.9313 --75.9266 --75.9234 --75.9219 --75.9156 --75.9219 --75.9125 --75.9219 --75.9172 --75.9281 --75.9219 --75.9203 --75.9234 --75.9109 --75.9375 --75.9094 --75.9297 --75.9125 --75.925 --75.9187 --75.9234 --75.9109 --75.9109 --75.9281 --75.9172 --75.9391 --75.9156 --75.9281 --75.9172 --75.9187 --75.9219 --75.925 --75.9219 --75.9141 --75.9234 --75.9187 --75.9219 --75.9172 --75.9234 --75.9328 --75.925 --75.9219 --75.9219 --75.9297 --75.9156 --75.9031 --75.9203 --75.9141 --75.925 --75.9094 --75.9109 --75.9031 --75.9016 --75.9203 --75.9141 --75.9156 --75.925 --75.925 --75.9187 --75.9125 --75.9094 --75.925 --75.9156 --75.9219 --75.9219 --75.9219 --75.9297 --75.9234 --75.9125 --75.9266 --75.9156 --75.9109 --75.9125 --75.9156 --75.9203 --75.9203 --75.9094 --75.9203 --75.9078 --75.9281 --75.9219 --75.9203 --75.9203 --75.9203 --75.9234 --75.9172 --75.9172 --75.9156 --75.9234 --75.9109 --75.9234 --75.9172 --75.9031 --75.9062 --75.9062 --75.9156 --75.9187 --75.9031 --75.9078 --75.9156 --75.9141 --75.9219 --75.9234 --75.9281 --75.9297 --75.9094 --75.9219 --75.9062 --75.9156 --75.9313 --75.9078 --75.9203 --75.9094 --75.9187 --75.9281 --75.8984 --75.9141 --75.9109 --75.9094 --75.9187 --75.9141 --75.9219 --75.9156 --75.8984 --75.9078 --75.9141 --75.9047 --75.9094 --75.9094 --75.9203 --75.9016 --75.9047 --75.9187 --75.9016 --75.9062 --75.9141 --75.9172 --75.9078 --75.9094 --75.9062 --75.9234 --75.9172 --75.9031 --75.9187 --75.9344 --75.9187 --75.9281 --75.9156 --75.9187 --75.9203 --75.9203 --75.9172 --75.9109 --75.9187 --75.9172 --75.9203 --75.9156 --75.925 --75.9203 --75.9281 --75.9156 --75.9156 --75.9219 --75.9187 --75.9313 --75.9234 --75.9141 --75.9094 --75.925 --75.9203 --75.9156 --75.9203 --75.9172 --75.9031 --75.9187 --75.9203 --75.9203 --75.9219 --75.9187 --75.9281 --75.9172 --75.9141 --75.9187 --75.9187 --75.9297 --75.9281 --75.9391 --75.9328 --75.9156 --75.9172 --75.9125 --75.9219 --75.9281 --75.9203 --75.9156 --75.9172 --75.9281 --75.9219 --75.9156 --75.9266 --75.9016 --75.9219 --75.9281 --75.9172 --75.9203 --75.9266 --75.9234 --75.9359 --75.9297 --75.9297 --75.9313 --75.9313 --75.9359 --75.9328 --75.9234 --75.925 --75.9266 --75.9234 --75.9187 --75.9172 --75.9187 --75.9203 --75.9125 --75.9156 --75.9187 --75.9078 --75.9172 --75.9156 --75.925 --75.9219 --75.9094 --75.9203 --75.9187 --75.9172 --75.9187 --75.9187 --75.9234 --75.9219 --75.9203 --75.9109 --75.9141 --75.9094 --75.9078 --75.9234 --75.9187 --75.9062 --75.9266 --75.9172 --75.9266 --75.9156 --75.9281 --75.9109 --75.9062 --75.9062 --75.9219 --75.9172 --75.925 --75.9281 --75.9203 --75.9281 --75.9266 --75.9313 --75.9281 --75.9313 --75.9156 --75.9234 --75.9109 --75.9078 --75.9156 --75.9219 --75.9203 --75.9109 --75.9297 --75.9078 --75.9313 --75.9328 --75.9187 --75.9281 --75.925 --75.9266 --75.9281 --75.9156 --75.9187 --75.9219 --75.9266 --75.9203 --75.9234 --75.9281 --75.9203 --75.9313 --75.9234 --75.9172 --75.9359 --75.9266 --75.9203 --75.9219 --75.9141 --75.9219 --75.9203 --75.9203 --75.9281 --75.9156 --75.9156 --75.9281 --75.9141 --75.9094 --75.9391 --75.9141 --75.9281 --75.9281 --75.9125 --75.9266 --75.9203 --75.9156 --75.9313 --75.9094 --75.9062 --75.9187 --75.9203 --75.9078 --75.9234 --75.9031 --75.9375 --75.9219 --75.9219 --75.9156 --75.9344 --75.9187 --75.9172 --75.9141 --75.9359 --75.9047 --75.9187 --75.9187 --75.9203 --75.9344 --75.9281 --75.9219 --75.9203 --75.9187 --75.9219 --75.9344 --75.9219 --75.9266 --75.9281 --75.9172 --75.9047 --75.9141 --75.9109 --75.9062 --75.9187 --75.9219 --75.9172 --75.9016 --75.9016 --75.9187 --75.9156 --75.9141 --75.9156 --75.9172 --75.9187 --75.9172 --75.9125 --75.9141 --75.9187 --75.9062 --75.9141 --75.9203 --75.9141 --75.9109 --75.9219 --75.9187 --75.9172 --75.9156 --75.9125 --75.9219 --75.9234 --75.9297 --75.9031 --75.9203 --75.9234 --75.9234 --75.9016 --75.9078 --75.9172 --75.9203 --75.9234 --75.9047 --75.9203 --75.9062 --75.9109 --75.9172 --75.9109 --75.9156 --75.9172 --75.9 --75.9 --75.9109 --75.9125 --75.9187 --75.9297 --75.9109 --75.9203 --75.9141 --75.9141 --75.9328 --75.9203 --75.9156 --75.9219 --75.9125 --75.9156 --75.9187 --75.9156 --75.9125 --75.9141 --75.9219 --75.9156 --75.9359 --75.9078 --75.9313 --75.9109 --75.9078 --75.9203 --75.9313 --75.9266 --75.9313 --75.9062 --75.9109 --75.9266 --75.9125 --75.9234 --75.9187 --75.9156 --75.9281 --75.9266 --75.9109 --75.925 --75.9125 --75.9313 --75.9172 --75.9062 --75.9141 --75.925 --75.9219 --75.925 --75.9156 --75.9375 --75.9266 --75.9203 --75.9125 --75.9109 --75.9078 --75.9062 --75.9156 --75.9203 --75.9187 --75.9125 --75.9125 --75.9172 --75.9047 --75.9141 --75.9141 --75.9172 --75.9078 --75.9109 --75.9109 --75.9078 --75.9141 --75.9172 --75.9297 --75.9219 --75.9109 --75.9234 --75.9187 --75.9297 --75.9266 --75.9234 --75.9219 --75.9141 --75.9172 --75.9344 --75.9328 --75.9297 --75.9297 --75.9203 --75.9172 --75.9172 --75.9313 --75.9313 --75.9234 --75.925 --75.9141 --75.9141 --75.9187 --75.9297 --75.9156 --75.9313 --75.9344 --75.9219 --75.925 --75.9219 --75.9047 --75.9125 --75.9203 --75.9141 --75.925 --75.9406 --75.9297 --75.9313 --75.9219 --75.9172 --75.9375 --75.9187 --75.9187 --75.9031 --75.9172 --75.9391 --75.9297 --75.9297 --75.9078 --75.9187 --75.9203 --75.9344 --75.9203 --75.9281 --75.925 --75.9156 --75.9187 --75.9219 --75.9047 --75.9297 --75.9219 --75.9328 --75.9234 --75.9141 --75.9281 --75.9125 --75.9344 --75.925 --75.9266 --75.9187 --75.9172 --75.9328 --75.9094 --75.9156 --75.9281 --75.9219 --75.9297 --75.9203 --75.9234 --75.9203 --75.9359 --75.9125 --75.9172 --75.8938 --75.9203 --75.9109 --75.9281 --75.9078 --75.9062 --75.9172 --75.9203 --75.9187 --75.9281 --75.9172 --75.9234 --75.9234 --75.9187 --75.9187 --75.9266 --75.9422 --75.9125 --75.9297 --75.9172 --75.9203 --75.9344 --75.9187 --75.9203 --75.9125 --75.9203 --75.9172 --75.9172 --75.9109 --75.9187 --75.9125 --75.9156 --75.9328 --75.9109 --75.9109 --75.9 --75.9156 --75.9047 --75.9109 --75.9062 --75.9078 --75.9172 --75.9047 --75.9 --75.9125 --75.9016 --75.9172 --75.9062 --75.8984 --75.9094 --75.9047 --75.9 --75.9125 --75.9125 --75.8984 --75.9016 --75.9125 --75.9125 --75.9031 --75.9047 --75.9016 --75.9141 --75.9281 --75.9078 --75.9125 --75.9156 --75.9125 --75.9031 --75.9094 --75.925 --75.9172 --75.9078 --75.9062 --75.8984 --75.9219 --75.9109 --75.9125 --75.9125 --75.9031 --75.9187 --75.9141 --75.9141 --75.9203 --75.9156 --75.9187 --75.9219 --75.9109 --75.9016 --75.9078 --75.9156 --75.9281 --75.9125 --75.9219 --75.9219 --75.9234 --75.9187 --75.925 --75.9187 --75.9203 --75.9125 --75.9125 --75.9094 --75.9109 --75.9156 --75.925 --75.9219 --75.9187 --75.9203 --75.9141 --75.9156 --75.9125 --75.9203 --75.925 --75.9187 --75.9172 --75.9297 --75.9172 --75.9203 --75.9078 --75.9094 --75.9203 --75.9297 --75.9234 --75.9141 --75.9094 --75.9172 --75.9141 --75.9062 --75.9141 --75.9078 --75.9078 --75.9203 --75.9094 --75.9047 --75.9172 --75.9187 --75.9172 --75.9266 --75.9078 --75.9031 --75.9203 --75.9203 --75.9187 --75.9156 --75.9156 --75.9141 --75.9141 --75.925 --75.9422 --75.9219 --75.9172 --75.9313 --75.9234 --75.9187 --75.9109 --75.9234 --75.9281 --75.9141 --75.9266 --75.9234 --75.9125 --75.9172 --75.9109 --75.9219 --75.9047 --75.9062 --75.9219 --75.9078 --75.9156 --75.9125 --75.9156 --75.925 --75.9156 --75.9078 --75.9172 --75.8984 --75.9078 --75.9062 --75.8969 --75.9078 --75.8969 --75.9141 --75.9016 --75.9078 --75.9172 --75.9062 --75.9062 --75.9062 --75.9109 --75.9156 --75.9156 --75.9156 --75.8969 --75.9297 --75.9094 --75.9125 --75.9125 --75.9047 --75.9078 --75.9172 --75.9141 --75.9109 --75.9172 --75.9078 --75.9031 --75.9047 --75.9094 --75.9141 --75.9109 --75.8938 --75.9016 --75.9187 --75.9094 --75.925 --75.9156 --75.8922 --75.9141 --75.9156 --75.9156 --75.9078 --75.9109 --75.9141 --75.9094 --75.9141 --75.9047 --75.9016 --75.9109 --75.9094 --75.8922 --75.9 --75.9078 --75.8906 --75.9031 --75.9094 --75.9047 --75.9047 --75.9078 --75.8906 --75.9047 --75.9016 --75.9078 --75.8984 --75.8984 --75.9078 --75.9094 --75.9078 --75.9 --75.9094 --75.8844 --75.8938 --75.8922 --75.9031 --75.8984 --75.9094 --75.9078 --75.9172 --75.9266 --75.8891 --75.9062 --75.8969 --75.8969 --75.9016 --75.9016 --75.9 --75.8984 --75.8906 --75.8875 --75.8922 --75.8906 --75.9109 --75.8875 --75.8984 --75.8922 --75.8922 --75.8922 --75.8953 --75.9062 --75.8828 --75.9 --75.8906 --75.8984 --75.8938 --75.9031 --75.8938 --75.8953 --75.9047 --75.9062 --75.8891 --75.9062 --75.9016 --75.8906 --75.9047 --75.8969 --75.9 --75.9109 --75.9047 --75.9031 --75.9016 --75.9125 --75.9047 --75.9187 --75.9047 --75.9031 --75.8953 --75.8984 --75.9 --75.9062 --75.8953 --75.8906 --75.9 --75.8844 --75.8891 --75.8922 --75.8938 --75.8766 --75.8859 --75.9016 --75.8922 --75.8969 --75.8922 --75.9016 --75.8703 --75.8938 --75.9062 --75.8984 --75.8922 --75.8938 --75.9109 --75.8953 --75.8891 --75.9047 --75.8906 --75.9 --75.8812 --75.8953 --75.9078 --75.8828 --75.9 --75.9047 --75.9125 --75.8938 --75.9125 --75.9109 --75.8969 --75.8922 --75.9031 --75.9109 --75.8984 --75.9047 --75.9016 --75.9141 --75.8906 --75.9078 --75.9094 --75.8953 --75.8969 --75.9172 --75.9109 --75.9078 --75.9094 --75.9047 --75.9172 --75.9062 --75.9094 --75.9031 --75.8969 --75.9 --75.8984 --75.9078 --75.8969 --75.9109 --75.8969 --75.8922 --75.9016 --75.9047 --75.9078 --75.8969 --75.8984 --75.9 --75.9078 --75.9016 --75.9062 --75.9031 --75.9031 --75.9109 --75.9016 --75.9094 --75.8984 --75.9016 --75.8812 --75.8969 --75.9016 --75.9016 --75.8938 --75.8969 --75.8906 --75.8844 --75.8984 --75.9125 --75.9078 --75.8969 --75.8891 --75.9016 --75.8875 --75.8922 --75.9016 --75.9047 --75.9 --75.8938 --75.8922 --75.875 --75.8875 --75.8922 --75.8891 --75.8969 --75.8938 --75.8891 --75.8984 --75.9078 --75.9 --75.8922 --75.8922 --75.8891 --75.8953 --75.8922 --75.8969 --75.8922 --75.8766 --75.9047 --75.9047 --75.9078 --75.8984 --75.9016 --75.9094 --75.9094 --75.9062 --75.9094 --75.8797 --75.9078 --75.9141 --75.9 --75.8969 --75.9047 --75.8875 --75.8844 --75.9047 --75.8953 --75.8969 --75.8906 --75.8953 --75.9062 --75.9062 --75.8969 --75.9047 --75.9125 --75.9141 --75.9047 --75.9109 --75.9094 --75.9078 --75.9094 --75.9156 --75.9203 --75.9031 --75.9109 --75.9125 --75.9094 --75.9 --75.9125 --75.9156 --75.8969 --75.8984 --75.8938 --75.9 --75.9 --75.9078 --75.9156 --75.9016 --75.9141 --75.9203 --75.9062 --75.8969 --75.9047 --75.9094 --75.9156 --75.9156 --75.9094 --75.8922 --75.9016 --75.9 --75.9047 --75.8938 --75.9031 --75.8984 --75.9078 --75.9016 --75.8891 --75.9062 --75.9172 --75.8922 --75.8969 --75.8938 --75.8938 --75.8953 --75.9 --75.9094 --75.9094 --75.8969 --75.8984 --75.8953 --75.9 --75.9047 --75.9047 --75.8938 --75.8891 --75.9047 --75.8984 --75.9016 --75.8969 --75.9031 --75.9094 --75.9031 --75.9078 --75.8984 --75.8984 --75.9016 --75.9125 --75.9 --75.8875 --75.8891 --75.9109 --75.8844 --75.9094 --75.8953 --75.8953 --75.9062 --75.9 --75.9078 --75.9016 --75.9109 --75.9078 --75.9156 --75.9078 --75.9156 --75.9109 --75.9156 --75.9094 --75.9125 --75.9031 --75.9172 --75.9187 --75.9109 --75.9125 --75.9109 --75.9 --75.9047 --75.9078 --75.9094 --75.9047 --75.9078 --75.8953 --75.9187 --75.9016 --75.9062 --75.8938 --75.9047 --75.9219 --75.9016 --75.9203 --75.9141 --75.8953 --75.9062 --75.9172 --75.9141 --75.9109 --75.9234 --75.9047 --75.9141 --75.9156 --75.9016 --75.9203 --75.9125 --75.9109 --75.9219 --75.9219 --75.9187 --75.9047 --75.9078 --75.9078 --75.9031 --75.9094 --75.9078 --75.9109 --75.9156 --75.9125 --75.9109 --75.9109 --75.9094 --75.9109 --75.925 --75.9094 --75.9141 --75.9078 --75.9297 --75.9234 --75.9156 --75.9156 --75.9094 --75.9062 --75.9062 --75.9156 --75.9156 --75.9062 --75.9031 --75.9078 --75.9125 --75.9141 --75.9 --75.9094 --75.9187 --75.9187 --75.9094 --75.8984 --75.8984 --75.9078 --75.9031 --75.9047 --75.8953 --75.8891 --75.9016 --75.9047 --75.9 --75.8969 --75.8906 --75.9062 --75.9062 --75.8984 --75.9094 --75.9031 --75.9031 --75.9078 --75.9 --75.8953 --75.8984 --75.8969 --75.9062 --75.9 --75.8938 --75.8844 --75.8984 --75.8938 --75.8922 --75.8859 --75.8969 --75.9141 --75.8953 --75.9 --75.8953 --75.8938 --75.8953 --75.8938 --75.9078 --75.8953 --75.9094 --75.9047 --75.8953 --75.9094 --75.9031 --75.9031 --75.9078 --75.9156 --75.9094 --75.9 --75.9219 --75.9094 --75.9234 --75.9203 --75.9031 --75.8938 --75.9031 --75.8938 --75.8984 --75.9125 --75.9031 --75.9062 --75.9047 --75.8969 --75.8938 --75.9141 --75.9125 --75.9016 --75.9062 --75.8969 --75.9109 --75.8938 --75.9141 --75.9125 --75.9187 --75.9016 --75.9016 --75.9094 --75.9062 --75.8938 --75.9 --75.9031 --75.9156 --75.9125 --75.9094 --75.9047 --75.9047 --75.9156 --75.9031 --75.9172 --75.9094 --75.9094 --75.9062 --75.9203 --75.9109 --75.9094 --75.9 --75.9109 --75.9062 --75.9187 --75.8922 --75.9125 --75.9109 --75.9094 --75.9 --75.8938 --75.9016 --75.9062 --75.9172 --75.9016 --75.9203 --75.9109 --75.9062 --75.9047 --75.9109 --75.9094 --75.9016 --75.8844 --75.8906 --75.9078 --75.8906 --75.9062 --75.9031 --75.9109 --75.9 --75.9109 --75.9125 --75.9 --75.8922 --75.9016 --75.8984 --75.9016 --75.8969 --75.9078 --75.9031 --75.9281 --75.9078 --75.9172 --75.8922 --75.8984 --75.9062 --75.8953 --75.9062 --75.8984 --75.9094 --75.9062 --75.8922 --75.9047 --75.9031 --75.9078 --75.9031 --75.9062 --75.8906 --75.9016 --75.9031 --75.9016 --75.9016 --75.9031 --75.9 --75.8906 --75.9125 --75.9094 --75.9047 --75.9172 --75.9062 --75.8938 --75.9047 --75.9047 --75.8812 --75.8984 --75.9062 --75.9109 --75.9016 --75.8922 --75.9078 --75.8969 --75.9062 --75.9016 --75.8969 --75.8953 --75.9 --75.8984 --75.9016 --75.8984 --75.8891 --75.9047 --75.8969 --75.8922 --75.9047 --75.8953 --75.9094 --75.8969 --75.9219 --75.9125 --75.9016 --75.9109 --75.9172 --75.9078 --75.9141 --75.9094 --75.9094 --75.8969 --75.9047 --75.9094 --75.9109 --75.9031 --75.9 --75.9016 --75.9062 --75.8984 --75.8984 --75.8953 --75.8984 --75.8891 --75.9109 --75.9016 --75.9047 --75.9 --75.9062 --75.8938 --75.9062 --75.9016 --75.8906 --75.9062 --75.9 --75.8984 --75.9031 --75.8922 --75.8844 --75.9016 --75.9031 --75.8953 --75.9 --75.9141 --75.8984 --75.9078 --75.8953 --75.8969 --75.9047 --75.8953 --75.8953 --75.8953 --75.9125 --75.8891 --75.8969 --75.8922 --75.9 --75.8922 --75.8984 --75.8828 --75.8891 --75.8938 --75.8953 --75.9156 --75.8969 --75.8984 --75.9047 --75.8922 --75.8938 --75.9094 --75.9078 --75.8922 --75.8875 --75.9 --75.9016 --75.9016 --75.8969 --75.9094 --75.8969 --75.9078 --75.9078 --75.8953 --75.9 --75.9031 --75.9 --75.8969 --75.9047 --75.9141 --75.9031 --75.8906 --75.9141 --75.8938 --75.9016 --75.8938 --75.8969 --75.8953 --75.8953 --75.8922 --75.9062 --75.8938 --75.9094 --75.9047 --75.9047 --75.9047 --75.9 --75.9109 --75.9125 --75.9125 --75.9 --75.9047 --75.9031 --75.9109 --75.9031 --75.9109 --75.9062 --75.9156 --75.9156 --75.9281 --75.9062 --75.9 --75.9141 --75.9141 --75.9156 --75.9078 --75.9172 --75.925 --75.9281 --75.9141 --75.925 --75.9172 --75.9172 --75.9172 --75.9031 --75.9172 --75.9047 --75.9141 --75.9109 --75.9156 --75.9141 --75.9109 --75.9141 --75.9219 --75.9 --75.8969 --75.9156 --75.9047 --75.9094 --75.9141 --75.9062 --75.9047 --75.9016 --75.8984 --75.9141 --75.9016 --75.9203 --75.9156 --75.9109 --75.9094 --75.9094 --75.9109 --75.9031 --75.9031 --75.9078 --75.9016 --75.9125 --75.9141 --75.8984 --75.9031 --75.8984 --75.9016 --75.9156 --75.9031 --75.9062 --75.9203 --75.9 --75.9297 --75.9094 --75.9234 --75.9078 --75.9125 --75.9203 --75.9125 --75.9094 --75.9187 --75.9125 --75.9219 --75.9156 --75.9187 --75.9094 --75.9203 --75.9094 --75.9141 --75.9141 --75.9078 --75.9 --75.8953 --75.9062 --75.8969 --75.8906 --75.9016 --75.9094 --75.8953 --75.8875 --75.8984 --75.9141 --75.8953 --75.9031 --75.9125 --75.9047 --75.9016 --75.8953 --75.9047 --75.9094 --75.9141 --75.8984 --75.9141 --75.9 --75.9031 --75.9047 --75.9031 --75.9125 --75.9125 --75.8922 --75.9141 --75.9047 --75.9109 --75.9016 --75.9141 --75.9031 --75.9109 --75.8953 --75.9047 --75.9125 --75.9062 --75.8938 --75.9031 --75.9031 --75.9047 --75.8938 --75.9078 --75.9047 --75.9047 --75.9125 --75.9156 --75.9078 --75.9047 --75.8969 --75.9047 --75.9 --75.8984 --75.9125 --75.9109 --75.9125 --75.9094 --75.9125 --75.9156 --75.9125 --75.9219 --75.9156 --75.9125 --75.9203 --75.9062 --75.9016 --75.9031 --75.9016 --75.9062 --75.9047 --75.9016 --75.9047 --75.8938 --75.8953 --75.9062 --75.9125 --75.9109 --75.9125 --75.8984 --75.9 --75.9141 --75.9141 --75.9203 --75.9109 --75.9016 --75.9047 --75.9078 --75.9062 --75.8984 --75.9094 --75.8984 --75.9094 --75.9156 --75.8953 --75.8953 --75.9172 --75.9125 --75.9172 --75.9234 --75.9016 --75.9141 --75.9125 --75.9094 --75.9234 --75.9062 --75.9156 --75.9125 --75.8875 --75.8984 --75.8938 --75.9109 --75.8969 --75.9109 --75.9016 --75.8938 --75.8984 --75.8938 --75.9062 --75.8953 --75.8828 --75.9047 --75.8969 --75.9 --75.9141 --75.9078 --75.9047 --75.8891 --75.9109 --75.9047 --75.9016 --75.9 --75.8938 --75.9156 --75.9 --75.9094 --75.9031 --75.8875 --75.8922 --75.8984 --75.9031 --75.9047 --75.9125 --75.9031 --75.9016 --75.8906 --75.9109 --75.8812 --75.8953 --75.8922 --75.9047 --75.9031 --75.8812 --75.8984 --75.8969 --75.8844 --75.8969 --75.8938 --75.9047 --75.8969 --75.9 --75.9031 --75.9094 --75.9062 --75.9 --75.8953 --75.9047 --75.9 --75.8953 --75.8938 --75.9031 --75.9062 --75.9109 --75.8984 --75.8984 --75.9047 --75.9031 --75.8938 --75.9062 --75.8953 --75.9047 --75.9 --75.8938 --75.8906 --75.9109 --75.9047 --75.9016 --75.9125 --75.9 --75.9125 --75.9094 --75.8969 --75.9031 --75.9016 --75.9078 --75.9078 --75.8969 --75.8953 --75.8859 --75.8938 --75.9062 --75.9047 --75.9016 --75.8859 --75.9062 --75.8953 --75.9078 --75.9094 --75.8938 --75.9016 --75.9203 --75.8891 --75.8984 --75.8953 --75.8938 --75.9047 --75.9047 --75.9 --75.8922 --75.8969 --75.9047 --75.8938 --75.9094 --75.8938 --75.9031 --75.8844 --75.8984 --75.8844 --75.8922 --75.8969 --75.9016 --75.9031 --75.8953 --75.8922 --75.9109 --75.8938 --75.9 --75.8953 --75.9047 --75.8938 --75.8922 --75.8844 --75.9 --75.8891 --75.8953 --75.8891 --75.8922 --75.9047 --75.8953 --75.9 --75.9031 --75.9078 --75.9156 --75.8922 --75.8984 --75.9016 --75.8938 --75.9 --75.8938 --75.9062 --75.8906 --75.8969 --75.8984 --75.8922 --75.8969 --75.9016 --75.9078 --75.8938 --75.8938 --75.9094 --75.9 --75.8875 --75.9016 --75.8938 --75.9016 --75.8969 --75.9078 --75.9031 --75.8984 --75.9047 --75.9 --75.9078 --75.9 --75.8984 --75.9031 --75.9203 --75.9047 --75.9062 --75.8953 --75.9047 --75.9187 --75.9187 --75.9062 --75.9047 --75.9078 --75.9 --75.8922 --75.9016 --75.9016 --75.9016 --75.9 --75.9016 --75.8984 --75.9 --75.9125 --75.8906 --75.9 --75.8953 --75.8875 --75.9141 --75.8969 --75.9109 --75.8938 --75.9 --75.9016 --75.9016 --75.8875 --75.9016 --75.9 --75.9 --75.8984 --75.9 --75.8953 --75.9016 --75.9016 --75.9078 --75.9 --75.9094 --75.9094 --75.9062 --75.8953 --75.9062 --75.8969 --75.8859 --75.9109 --75.8984 --75.9031 --75.9031 --75.8938 --75.8781 --75.8938 --75.9078 --75.8906 --75.8969 --75.8938 --75.8875 --75.8984 --75.8969 --75.8891 --75.9016 --75.9047 --75.9094 --75.8891 --75.9125 --75.9062 --75.9094 --75.9125 --75.9031 --75.9141 --75.9016 --75.9094 --75.9094 --75.9094 --75.9 --75.8922 --75.9141 --75.9 --75.8906 --75.8984 --75.9062 --75.9062 --75.9125 --75.9 --75.9047 --75.9016 --75.9109 --75.8891 --75.8953 --75.8922 --75.9094 --75.8969 --75.9094 --75.9156 --75.9109 --75.9 --75.9031 --75.9078 --75.9125 --75.9094 --75.9125 --75.9078 --75.9125 --75.9078 --75.9062 --75.9125 --75.9016 --75.8938 --75.9016 --75.9219 --75.9062 --75.9094 --75.9187 --75.8953 --75.9 --75.9062 --75.9016 --75.9094 --75.8969 --75.9156 --75.9016 --75.9031 --75.9031 --75.9062 --75.9047 --75.9062 --75.9109 --75.8984 --75.9062 --75.9047 --75.8969 --75.8922 --75.9016 --75.9125 --75.8953 --75.8953 --75.8969 --75.9109 --75.8984 --75.9062 --75.9031 --75.9047 --75.9031 --75.8969 --75.9094 --75.9031 --75.9109 --75.8938 --75.8984 --75.9156 --75.9078 --75.9078 --75.8859 --75.8859 --75.8891 --75.9 --75.9016 --75.9 --75.8984 --75.8812 --75.8906 --75.9016 --75.9 --75.8922 --75.9031 --75.9078 --75.9 --75.9047 --75.9031 --75.9 --75.9062 --75.9125 --75.9 --75.8969 --75.8953 --75.8859 --75.9016 --75.8859 --75.8922 --75.8938 --75.8984 --75.8953 --75.8969 --75.8953 --75.8906 --75.8953 --75.8984 --75.9 --75.8938 --75.8969 --75.8859 --75.9078 --75.9187 --75.9062 --75.9156 --75.9016 --75.8984 --75.9047 --75.9062 --75.8953 --75.8969 --75.9031 --75.9047 --75.9078 --75.9031 --75.9047 --75.9109 --75.9047 --75.8969 --75.8984 --75.9031 --75.9031 --75.9016 --75.9016 --75.8922 --75.9016 --75.9047 --75.9047 --75.9109 --75.9047 --75.9078 --75.9 --75.9094 --75.9141 --75.9234 --75.9109 --75.9094 --75.9047 --75.9078 --75.9047 --75.9078 --75.9031 --75.9094 --75.8969 --75.9141 --75.9172 --75.9141 --75.9016 --75.8812 --75.8969 --75.9016 --75.8906 --75.9047 --75.8922 --75.9078 --75.8844 --75.9031 --75.9016 --75.9 --75.9016 --75.8953 --75.9078 --75.8984 --75.8891 --75.9109 --75.8984 --75.9078 --75.8859 --75.9031 --75.8875 --75.8875 --75.8844 --75.8906 --75.8906 --75.8906 --75.8906 --75.8891 --75.8938 --75.8953 --75.8859 --75.8953 --75.8859 --75.8969 --75.9 --75.8938 --75.8875 --75.9047 --75.8891 --75.8969 --75.9062 --75.9016 --75.9031 --75.9047 --75.9031 --75.9172 --75.8844 --75.9047 --75.8891 --75.8984 --75.8938 --75.8828 --75.8844 --75.8828 --75.8906 --75.8969 --75.8859 --75.8797 --75.8969 --75.8906 --75.8906 --75.9 --75.8969 --75.8844 --75.8812 --75.8891 --75.8891 --75.8875 --75.8969 --75.8891 --75.8969 --75.9062 --75.9016 --75.8953 --75.9 --75.8953 --75.9 --75.9094 --75.8953 --75.8938 --75.9016 --75.9 --75.9 --75.8938 --75.8875 --75.9047 --75.9031 --75.9062 --75.9078 --75.8969 --75.9109 --75.8984 --75.8953 --75.9 --75.9031 --75.9109 --75.8844 --75.8906 --75.8984 --75.8875 --75.8953 --75.8984 --75.9 --75.8953 --75.9094 --75.8938 --75.9031 --75.8938 --75.9047 --75.9 --75.8922 --75.9172 --75.9016 --75.9016 --75.9 --75.9094 --75.9109 --75.9062 --75.9016 --75.8953 --75.9062 --75.9094 --75.9266 --75.9109 --75.8953 --75.9047 --75.9062 --75.8875 --75.9 --75.9078 --75.9125 --75.8969 --75.8969 --75.9062 --75.9094 --75.8891 --75.8938 --75.8938 --75.9094 --75.8844 --75.8906 --75.8953 --75.9 --75.9078 --75.9016 --75.9016 --75.9109 --75.8922 --75.9109 --75.9031 --75.9078 --75.9016 --75.9078 --75.8984 --75.9078 --75.9016 --75.9078 --75.8938 --75.9078 --75.8984 --75.8938 --75.8938 --75.8922 --75.9 --75.8875 --75.9 --75.8922 --75.8859 --75.9109 --75.9047 --75.8984 --75.8953 --75.8984 --75.8844 --75.8938 --75.8953 --75.8938 --75.8844 --75.9094 --75.8859 --75.9125 --75.8906 --75.8906 --75.8969 --75.9016 --75.8953 --75.8906 --75.9047 --75.8938 --75.8953 --75.9125 --75.8938 --75.9031 --75.8938 --75.9016 --75.9094 --75.9031 --75.9031 --75.9031 --75.9062 --75.9156 --75.9125 --75.9 --75.9062 --75.8984 --75.9047 --75.9094 --75.9234 --75.9031 --75.9016 --75.9141 --75.9062 --75.8906 --75.8969 --75.8938 --75.9062 --75.8969 --75.9047 --75.8906 --75.9078 --75.9094 --75.8984 --75.9125 --75.9266 --75.9109 --75.8969 --75.8938 --75.9234 --75.9016 --75.9047 --75.8953 --75.9141 --75.9062 --75.9 --75.8969 --75.8984 --75.8875 --75.8906 --75.8891 --75.8906 --75.8906 --75.8891 --75.8906 --75.8844 --75.9 --75.9172 --75.8922 --75.8953 --75.9031 --75.9094 --75.9047 --75.9016 --75.8922 --75.9031 --75.8969 --75.9 --75.8969 --75.9062 --75.9016 --75.9031 --75.8844 --75.9031 --75.8953 --75.8906 --75.8906 --75.8922 --75.8906 --75.9 --75.8938 --75.8891 --75.8938 --75.9 --75.9031 --75.9047 --75.8984 --75.8969 --75.9031 --75.9031 --75.8938 --75.9016 --75.9031 --75.8984 --75.9125 --75.9109 --75.9031 --75.8984 --75.8984 --75.9016 --75.9047 --75.9 --75.9 --75.8938 --75.8984 --75.8953 --75.8953 --75.9203 --75.8969 --75.8953 --75.9016 --75.9078 --75.9109 --75.8984 --75.8875 --75.9109 --75.9047 --75.8891 --75.9094 --75.9031 --75.8922 --75.8953 --75.8984 --75.9156 --75.8953 --75.8953 --75.8922 --75.8984 --75.8969 --75.8891 --75.8922 --75.8922 --75.8922 --75.8781 --75.8969 --75.8891 --75.9078 --75.8938 --75.9031 --75.9078 --75.8984 --75.9016 --75.9016 --75.9047 --75.9 --75.9187 --75.8984 --75.8969 --75.8969 --75.9 --75.9031 --75.8891 --75.8906 --75.8984 --75.8984 --75.8922 --75.8969 --75.8953 --75.9078 --75.9016 --75.8875 --75.8828 --75.8984 --75.8906 --75.8906 --75.8906 --75.8875 --75.8938 --75.8906 --75.8781 --75.8922 --75.8891 --75.9031 --75.8828 --75.8844 --75.8969 --75.9078 --75.8984 --75.9 --75.8922 --75.9031 --75.9 --75.9 --75.9109 --75.8922 --75.8969 --75.9109 --75.9 --75.9141 --75.9016 --75.9094 --75.9094 --75.9094 --75.9141 --75.9047 --75.9109 --75.9 --75.9141 --75.8891 --75.9062 --75.9078 --75.9016 --75.9047 --75.9062 --75.9187 --75.9141 --75.9094 --75.9156 --75.9 --75.9078 --75.9125 --75.9031 --75.9203 --75.9187 --75.9141 --75.9125 --75.9047 --75.9031 --75.8969 --75.9062 --75.9094 --75.9094 --75.9062 --75.9031 --75.9047 --75.9 --75.9078 --75.9062 --75.9062 --75.9 --75.9047 --75.9047 --75.9078 --75.9047 --75.9094 --75.9062 --75.8906 --75.8953 --75.9094 --75.8938 --75.8938 --75.8922 --75.8906 --75.9 --75.8859 --75.8875 --75.8797 --75.8922 --75.8906 --75.8875 --75.8859 --75.9016 --75.9047 --75.8891 --75.8969 --75.8938 --75.8906 --75.8938 --75.875 --75.9 --75.8766 --75.8828 --75.8875 --75.9 --75.8938 --75.8844 --75.8922 --75.8969 --75.8938 --75.8891 --75.8969 --75.8922 --75.8969 --75.8891 --75.8859 --75.9016 --75.9 --75.8969 --75.9078 --75.9 --75.9031 --75.9062 --75.9047 --75.8938 --75.8875 --75.8891 --75.9094 --75.9031 --75.9031 --75.8938 --75.8938 --75.9 --75.8922 --75.8984 --75.8969 --75.9031 --75.9156 --75.9016 --75.8906 --75.9016 --75.9078 --75.8938 --75.8969 --75.9141 --75.9031 --75.8922 --75.8922 --75.9094 --75.9016 --75.9062 --75.9016 --75.9078 --75.8984 --75.9062 --75.9094 --75.9078 --75.9 --75.9156 --75.9016 --75.8984 --75.9156 --75.9047 --75.9062 --75.9094 --75.9062 --75.9016 --75.9078 --75.8969 --75.9156 --75.9 --75.9062 --75.9047 --75.9203 --75.9047 --75.9156 --75.9109 --75.9141 --75.9141 --75.9156 --75.9187 --75.9234 --75.9203 --75.9203 --75.9297 --75.9109 --75.9375 --75.9031 --75.9031 --75.9187 --75.9219 --75.9078 --75.9125 --75.9125 --75.9187 --75.9219 --75.9094 --75.9203 --75.9016 --75.9094 --75.9047 --75.9047 --75.9 --75.9172 --75.9016 --75.8953 --75.9062 --75.8984 --75.8938 --75.8969 --75.9031 --75.9016 --75.8984 --75.8922 --75.9 --75.8984 --75.8953 --75.9047 --75.8984 --75.8969 --75.9016 --75.9094 --75.9031 --75.9062 --75.9047 --75.9031 --75.9016 --75.9062 --75.9016 --75.9 --75.9094 --75.9031 --75.8984 --75.9016 --75.9047 --75.8953 --75.8969 --75.9047 --75.8984 --75.8906 --75.8984 --75.8859 --75.8859 --75.8969 --75.8891 --75.8766 --75.8797 --75.8828 --75.8969 --75.8984 --75.8766 --75.8906 --75.8875 --75.9016 --75.8922 --75.8938 --75.8969 --75.8844 --75.9016 --75.9016 --75.8953 --75.8875 --75.9109 --75.9016 --75.8953 --75.8906 --75.9078 --75.9031 --75.8953 --75.9062 --75.8859 --75.9078 --75.8938 --75.9078 --75.9 --75.8953 --75.9062 --75.8953 --75.8984 --75.9047 --75.9016 --75.8891 --75.9 --75.8906 --75.8906 --75.8922 --75.8938 --75.8922 --75.8891 --75.8766 --75.8906 --75.8922 --75.9016 --75.8922 --75.8922 --75.8969 --75.8906 --75.8859 --75.8938 --75.8828 --75.8891 --75.8875 --75.8906 --75.8812 --75.9031 --75.8953 --75.8812 --75.9016 --75.8812 --75.8812 --75.8844 --75.8953 --75.9016 --75.8906 --75.9062 --75.9 --75.8953 --75.9062 --75.8984 --75.8922 --75.9031 --75.8922 --75.8766 --75.8906 --75.8875 --75.8922 --75.9047 --75.8844 --75.8938 --75.9 --75.8891 --75.9 --75.8781 --75.9016 --75.8906 --75.8969 --75.8938 --75.8906 --75.8922 --75.9 --75.8953 --75.8922 --75.8938 --75.9078 --75.8938 --75.9031 --75.8984 --75.9078 --75.8969 --75.8859 --75.8781 --75.8922 --75.8859 --75.8797 --75.8812 --75.8938 --75.8953 --75.9031 --75.8781 --75.8969 --75.8844 --75.9031 --75.8812 --75.8891 --75.8984 --75.8891 --75.8844 --75.8891 --75.8766 --75.8891 --75.8844 --75.8781 --75.8859 --75.8734 --75.8844 --75.8859 --75.8812 --75.8812 --75.8781 --75.8766 --75.8766 --75.8797 --75.8781 --75.8766 --75.8797 --75.8844 --75.8781 --75.8828 --75.8875 --75.8766 --75.8859 --75.8859 --75.875 --75.8781 --75.8812 --75.8734 --75.8703 --75.8828 --75.8734 --75.8828 --75.8906 --75.8844 --75.8609 --75.875 --75.8734 --75.8734 --75.8688 --75.8781 --75.8781 --75.8703 --75.8719 --75.8844 --75.8766 --75.8828 --75.8812 --75.8656 --75.8766 --75.8766 --75.8922 --75.875 --75.8953 --75.8766 --75.8906 --75.8812 --75.8891 --75.8766 --75.8703 --75.875 --75.8828 --75.8891 --75.8734 --75.8766 --75.8891 --75.8797 --75.8797 --75.8828 --75.8969 --75.8828 --75.8672 --75.8906 --75.8984 --75.8703 --75.8812 --75.8922 --75.875 --75.8766 --75.8703 --75.8844 --75.8984 --75.8797 --75.8797 --75.8797 --75.8812 --75.8906 --75.8875 --75.8828 --75.8906 --75.8906 --75.8906 --75.8906 --75.8859 --75.8844 --75.9016 --75.8844 --75.8922 --75.8953 --75.8844 --75.875 --75.8734 --75.9016 --75.8938 --75.8922 --75.8891 --75.8891 --75.9016 --75.8953 --75.9 --75.9 --75.8938 --75.8734 --75.9031 --75.9047 --75.8953 --75.8844 --75.8984 --75.9031 --75.9016 --75.9016 --75.9047 --75.8922 --75.9031 --75.9016 --75.8984 --75.9109 --75.8906 --75.8859 --75.8984 --75.8766 --75.8891 --75.8922 --75.8891 --75.8844 --75.8906 --75.8938 --75.9 --75.8953 --75.8859 --75.8969 --75.8891 --75.8984 --75.8953 --75.9078 --75.8906 --75.9047 --75.8797 --75.8844 --75.9016 --75.9047 --75.8984 --75.8938 --75.8922 --75.8828 --75.8984 --75.8984 --75.8938 --75.8906 --75.8984 --75.8938 --75.8891 --75.8922 --75.8797 --75.8828 --75.8969 --75.8969 --75.8953 --75.8891 --75.9 --75.8891 --75.8953 --75.8844 --75.8906 --75.8906 --75.8922 --75.8906 --75.8938 --75.9062 --75.8969 --75.9016 --75.9016 --75.9031 --75.9062 --75.9 --75.8922 --75.8984 --75.8969 --75.8984 --75.9109 --75.9062 --75.9 --75.9141 --75.8984 --75.9062 --75.9031 --75.8891 --75.9125 --75.8891 --75.9031 --75.9016 --75.9047 --75.9 --75.8969 --75.8969 --75.8922 --75.8844 --75.8906 --75.9047 --75.8875 --75.8953 --75.8859 --75.8984 --75.8859 --75.8828 --75.8922 --75.8969 --75.9031 --75.8984 --75.8812 --75.8781 --75.8906 --75.8906 --75.8953 --75.8859 --75.8969 --75.8922 --75.8891 --75.8875 --75.9047 --75.8906 --75.8953 --75.8906 --75.8953 --75.8922 --75.8953 --75.8859 --75.8859 --75.9016 --75.8953 --75.8953 --75.8906 --75.9016 --75.8828 --75.8922 --75.8812 --75.8953 --75.8984 --75.8969 --75.8922 --75.8953 --75.8891 --75.8891 --75.8922 --75.8797 --75.8906 --75.8891 --75.8828 --75.8844 --75.8922 --75.8891 --75.8875 --75.8906 --75.9016 --75.8812 --75.8891 --75.8797 --75.9016 --75.8875 --75.8859 --75.8875 --75.8906 --75.8906 --75.8734 --75.8953 --75.8859 --75.8906 --75.8844 --75.9 --75.8828 --75.8859 --75.8891 --75.8844 --75.8875 --75.8922 --75.875 --75.9016 --75.8859 --75.8859 --75.8922 --75.8828 --75.8844 --75.8859 --75.8797 --75.8859 --75.8781 --75.8953 --75.8906 --75.875 --75.8891 --75.8875 --75.8906 --75.8844 --75.8859 --75.8859 --75.8781 --75.8812 --75.8734 --75.8812 --75.8828 --75.9031 --75.9047 --75.8922 --75.8922 --75.8891 --75.8953 --75.9047 --75.8953 --75.8906 --75.8953 --75.8844 --75.8969 --75.9 --75.8906 --75.8844 --75.8969 --75.8969 --75.8953 --75.9031 --75.9 --75.8969 --75.8969 --75.8875 --75.9047 --75.8891 --75.9047 --75.9031 --75.8938 --75.8969 --75.9016 --75.8984 --75.8953 --75.8875 --75.8812 --75.9062 --75.8859 --75.8844 --75.8875 --75.9 --75.8875 --75.8781 --75.8781 --75.8891 --75.8891 --75.8797 --75.8688 --75.8797 --75.8875 --75.8734 --75.8859 --75.8844 --75.8766 --75.8812 --75.8781 --75.8812 --75.8812 --75.8672 --75.8891 --75.875 --75.8812 --75.8766 --75.8734 --75.8844 --75.8828 --75.8781 --75.8844 --75.8938 --75.8797 --75.8781 --75.8891 --75.8906 --75.8891 --75.8844 --75.8781 --75.8812 --75.8891 --75.9047 --75.8844 --75.9078 --75.8734 --75.8906 --75.8906 --75.8859 --75.8906 --75.8656 --75.8812 --75.9031 --75.8922 --75.8859 --75.8922 --75.8875 --75.8828 --75.9 --75.8922 --75.9 --75.8859 --75.8969 --75.8828 --75.8953 --75.8844 --75.9062 --75.8922 --75.8953 --75.8984 --75.8969 --75.8984 --75.8922 --75.8984 --75.8844 --75.8875 --75.9 --75.8781 --75.8953 --75.9 --75.8922 --75.8844 --75.8891 --75.8844 --75.9062 --75.9109 --75.8891 --75.9031 --75.9016 --75.9047 --75.8969 --75.9 --75.8938 --75.8969 --75.9062 --75.8812 --75.9016 --75.8969 --75.8891 --75.9016 --75.9016 --75.8938 --75.9062 --75.8953 --75.8984 --75.8828 --75.9047 --75.8953 --75.9031 --75.8906 --75.9 --75.9031 --75.8922 --75.8906 --75.9047 --75.8969 --75.9 --75.8922 --75.8828 --75.8984 --75.8922 --75.8875 --75.9016 --75.9 --75.9031 --75.8891 --75.8891 --75.8984 --75.8859 --75.8891 --75.8812 --75.8781 --75.8953 --75.8781 --75.8875 --75.8828 --75.8938 --75.8844 --75.9094 --75.8844 --75.8875 --75.9 --75.8953 --75.8906 --75.8969 --75.8906 --75.8891 --75.9047 --75.9031 --75.8922 --75.8859 --75.9047 --75.8953 --75.8859 --75.8875 --75.8844 --75.8891 --75.8781 --75.8984 --75.8938 --75.8938 --75.8844 --75.8922 --75.8844 --75.8859 --75.9078 --75.9031 --75.8812 --75.8953 --75.8984 --75.8891 --75.875 --75.9062 --75.9062 --75.8953 --75.8953 --75.9047 --75.8969 --75.9 --75.8984 --75.9062 --75.9 --75.8953 --75.8938 --75.8969 --75.8938 --75.9016 --75.8984 --75.8969 --75.8969 --75.8953 --75.8906 --75.9031 --75.8984 --75.9016 --75.8969 --75.8859 --75.8922 --75.8938 --75.8875 --75.8828 --75.9047 --75.8859 --75.8984 --75.9078 --75.8969 --75.9109 --75.9 --75.8938 --75.8906 --75.8969 --75.8938 --75.9078 --75.8922 --75.8938 --75.9 --75.9078 --75.9109 --75.8891 --75.9094 --75.8922 --75.9156 --75.8828 --75.9062 --75.8906 --75.8984 --75.9031 --75.8891 --75.8969 --75.8953 --75.9062 --75.9047 --75.8938 --75.8875 --75.9078 --75.8953 --75.8922 --75.9031 --75.8984 --75.9031 --75.9047 --75.9125 --75.9031 --75.8906 --75.8938 --75.8953 --75.8953 --75.9047 --75.9016 --75.9016 --75.9125 --75.8938 --75.9125 --75.8984 --75.9125 --75.9156 --75.8938 --75.9031 --75.8984 --75.8844 --75.9 --75.9047 --75.8859 --75.8953 --75.8891 --75.8984 --75.9125 --75.8844 --75.9047 --75.8984 --75.9031 --75.9 --75.8844 --75.8984 --75.8875 --75.9 --75.8953 --75.9062 --75.8938 --75.9 --75.8953 --75.9 --75.8938 --75.8969 --75.8875 --75.8922 --75.8828 --75.8953 --75.9094 --75.9031 --75.9016 --75.8797 --75.8953 --75.8969 --75.9047 --75.8938 --75.8922 --75.9078 --75.8984 --75.9109 --75.8938 --75.8984 --75.9047 --75.8844 --75.9016 --75.8922 --75.9094 --75.8797 --75.8984 --75.9062 --75.9031 --75.8922 --75.8969 --75.8984 --75.8984 --75.8969 --75.8938 --75.9016 --75.9031 --75.8859 --75.8906 --75.8938 --75.8906 --75.8969 --75.8906 --75.9 --75.8875 --75.8891 --75.8859 --75.8969 --75.8891 --75.8938 --75.8875 --75.9047 --75.9016 --75.8969 --75.8953 --75.8969 --75.9062 --75.8891 --75.8938 --75.8922 --75.8984 --75.9031 --75.9031 --75.8797 --75.8938 --75.8891 --75.9 --75.9 --75.8953 --75.8938 --75.8891 --75.8906 --75.8859 --75.8828 --75.8891 --75.8875 --75.8953 --75.8969 --75.8766 --75.8828 --75.8984 --75.9094 --75.8734 --75.8875 --75.8875 --75.8844 --75.8797 --75.8719 --75.8812 --75.8812 --75.8891 --75.8953 --75.8953 --75.8844 --75.8922 --75.8844 --75.8891 --75.8922 --75.8953 --75.8906 --75.8781 --75.8875 --75.8844 --75.8766 --75.8828 --75.8953 --75.8797 --75.8859 --75.8906 --75.8859 --75.8984 --75.8938 --75.8875 --75.8875 --75.8906 --75.9094 --75.8844 --75.9 --75.8828 --75.8984 --75.8891 --75.8844 --75.8812 --75.8922 --75.9031 --75.8797 --75.8844 --75.8844 --75.8969 --75.8734 --75.8844 --75.8938 --75.8844 --75.9 --75.8891 --75.8953 --75.8828 --75.8938 --75.8781 --75.8797 --75.9016 --75.8781 --75.8828 --75.8828 --75.9031 --75.8984 --75.9062 --75.8875 --75.8875 --75.8875 --75.8953 --75.8906 --75.8812 --75.8672 --75.8891 --75.8875 --75.8859 --75.875 --75.8828 --75.8844 --75.8891 --75.8844 --75.8844 --75.8891 --75.8828 --75.875 --75.8672 --75.8797 --75.8875 --75.8875 --75.8922 --75.8656 --75.8844 --75.8906 --75.875 --75.8859 --75.8797 --75.8828 --75.8656 --75.8875 --75.8781 --75.875 --75.8734 --75.8844 --75.8734 --75.8828 --75.8719 --75.8766 --75.8703 --75.8703 --75.8703 --75.8719 --75.875 --75.875 --75.8875 --75.8766 --75.8844 --75.8828 --75.8812 --75.8703 --75.8844 --75.8625 --75.8922 --75.8844 --75.8719 --75.8766 --75.8891 --75.8922 --75.8766 --75.8922 --75.8828 --75.8812 --75.8781 --75.8938 --75.8828 --75.8844 --75.8844 --75.8953 --75.8844 --75.8859 --75.8875 --75.8875 --75.8906 --75.8781 --75.8766 --75.8719 --75.8875 --75.8797 --75.8812 --75.8844 --75.8781 --75.8938 --75.8859 --75.8812 --75.8688 --75.8844 --75.8734 --75.8844 --75.8781 --75.875 --75.8812 --75.8766 --75.8797 --75.8859 --75.8844 --75.875 --75.8781 --75.8797 --75.8625 --75.8797 --75.8797 --75.8812 --75.8828 --75.8828 --75.8812 --75.8859 --75.8844 --75.8891 --75.8844 --75.8797 --75.8703 --75.8797 --75.8859 --75.8953 --75.8859 --75.8656 --75.8844 --75.8906 --75.8797 --75.8719 --75.8781 --75.8781 --75.8844 --75.8859 --75.8906 --75.8766 --75.8859 --75.8719 --75.8797 --75.8688 --75.8734 --75.8797 --75.8781 --75.8906 --75.8938 --75.8844 --75.8828 --75.8734 --75.8812 --75.8578 --75.8828 --75.8703 --75.8797 --75.8797 --75.8797 --75.8906 --75.8891 --75.8797 --75.8797 --75.8641 --75.8781 --75.8781 --75.8719 --75.8766 --75.8766 --75.8812 --75.8875 --75.8797 --75.8859 --75.8875 --75.8875 --75.8812 --75.8766 --75.8938 --75.9016 --75.8906 --75.8859 --75.8875 --75.8812 --75.8906 --75.8859 --75.8844 --75.8781 --75.8875 --75.8906 --75.8812 --75.8969 --75.8719 --75.8875 --75.8828 --75.8906 --75.8828 --75.8875 --75.8984 --75.8719 --75.8797 --75.8766 --75.8797 --75.8859 --75.8859 --75.8859 --75.8688 --75.8953 --75.8969 --75.8828 --75.8828 --75.8828 --75.875 --75.8781 --75.8875 --75.8781 --75.8703 --75.8953 --75.8844 --75.8859 --75.8906 --75.8922 --75.8953 --75.8953 --75.8953 --75.8703 --75.8859 --75.8812 --75.8828 --75.8812 --75.8828 --75.8797 --75.8734 --75.8859 --75.8891 --75.8875 --75.8891 --75.8844 --75.8703 --75.8844 --75.8844 --75.8812 --75.8766 --75.8719 --75.8766 --75.875 --75.8625 --75.8766 --75.8812 --75.8656 --75.8766 --75.8766 --75.8781 --75.875 --75.8641 --75.8688 --75.8641 --75.8797 --75.8859 --75.8719 --75.8828 --75.875 --75.8719 --75.875 --75.8797 --75.8812 --75.8828 --75.8688 --75.8766 --75.8734 --75.8844 --75.8703 --75.8844 --75.8734 --75.8859 --75.8734 --75.8688 --75.8797 --75.8859 --75.8828 --75.8875 --75.8906 --75.8859 --75.8891 --75.8844 --75.8922 --75.8828 --75.875 --75.8812 --75.8719 --75.8844 --75.8891 --75.8891 --75.8875 --75.8812 --75.8906 --75.8984 --75.8781 --75.8766 --75.8703 --75.8922 --75.8906 --75.8781 --75.8812 --75.8859 --75.8859 --75.8969 --75.9031 --75.8844 --75.8719 --75.8812 --75.8891 --75.8922 --75.8969 --75.8922 --75.8844 --75.8953 --75.875 --75.8766 --75.8797 --75.8891 --75.8797 --75.9016 --75.8953 --75.8859 --75.8922 --75.8906 --75.8938 --75.9016 --75.8859 --75.8891 --75.9031 --75.9062 --75.9 --75.8984 --75.8969 --75.8703 --75.8797 --75.9016 --75.9016 --75.8906 --75.8984 --75.8844 --75.875 --75.8938 --75.8859 --75.8906 --75.8875 --75.8891 --75.8734 --75.8797 --75.8766 --75.8734 --75.8797 --75.8828 --75.8828 --75.8828 --75.8828 --75.8906 --75.8703 --75.8844 --75.8875 --75.8703 --75.8812 --75.8891 --75.8891 --75.8766 --75.8922 --75.8719 --75.8891 --75.8812 --75.8844 --75.8719 --75.8828 --75.8906 --75.8859 --75.8922 --75.8906 --75.8891 --75.8938 --75.8844 --75.8969 --75.8906 --75.8969 --75.8766 --75.8859 --75.8906 --75.8812 --75.8922 --75.8828 --75.8875 --75.8734 --75.8844 --75.8797 --75.8969 --75.9 --75.9031 --75.8828 --75.9062 --75.8938 --75.8953 --75.9156 --75.8875 --75.8938 --75.9062 --75.8859 --75.8953 --75.9 --75.8844 --75.8891 --75.9125 --75.8953 --75.8922 --75.9094 --75.8875 --75.8922 --75.8984 --75.9047 --75.8891 --75.8906 --75.8875 --75.8906 --75.8969 --75.8766 --75.8953 --75.8969 --75.8953 --75.8828 --75.9047 --75.8859 --75.8953 --75.8938 --75.8969 --75.8984 --75.8781 --75.8953 --75.8922 --75.8969 --75.8891 --75.8922 --75.9016 --75.8828 --75.9047 --75.9047 --75.8906 --75.8969 --75.8828 --75.8875 --75.8766 --75.8859 --75.8969 --75.8797 --75.8844 --75.8859 --75.8891 --75.9047 --75.9016 --75.9 --75.8891 --75.8969 --75.8766 --75.8891 --75.9062 --75.8844 --75.8828 --75.9062 --75.8922 --75.8906 --75.9047 --75.9078 --75.8922 --75.9062 --75.8875 --75.8953 --75.8875 --75.8859 --75.8828 --75.9047 --75.8953 --75.8891 --75.8844 --75.8891 --75.8891 --75.8922 --75.9109 --75.8797 --75.8984 --75.8953 --75.9016 --75.8922 --75.8844 --75.9016 --75.8859 --75.9031 --75.8984 --75.9016 --75.8984 --75.8875 --75.9031 --75.8875 --75.8953 --75.8906 --75.9 --75.8922 --75.8875 --75.9 --75.8953 --75.8953 --75.8812 --75.8844 --75.8859 --75.8922 --75.8812 --75.8812 --75.8938 --75.8922 --75.8844 --75.8859 --75.9 --75.9 --75.8875 --75.9016 --75.8875 --75.8969 --75.8969 --75.8875 --75.8938 --75.8969 --75.8906 --75.8828 --75.8875 --75.8922 --75.8844 --75.8938 --75.8906 --75.8984 --75.8938 --75.8828 --75.8859 --75.8922 --75.8859 --75.9047 --75.8906 --75.9 --75.9172 --75.9 --75.9 --75.8906 --75.8906 --75.8953 --75.8844 --75.9031 --75.8859 --75.8969 --75.8828 --75.8922 --75.8906 --75.9094 --75.8891 --75.9016 --75.8906 --75.9078 --75.8953 --75.9 --75.8969 --75.8812 --75.8969 --75.8938 --75.9062 --75.8969 --75.9031 --75.8984 --75.9062 --75.8906 --75.8984 --75.9047 --75.8969 --75.9 --75.8922 --75.8938 --75.8891 --75.8953 --75.8844 --75.9 --75.8875 --75.8844 --75.8875 --75.8938 --75.8859 --75.8812 --75.8812 --75.8797 --75.8719 --75.8891 --75.8969 --75.8812 --75.8922 --75.8906 --75.8875 --75.8875 --75.9031 --75.9031 --75.8828 --75.9016 --75.8984 --75.8672 --75.8844 --75.8938 --75.8891 --75.9 --75.8953 --75.9031 --75.9031 --75.8828 --75.8969 --75.8969 --75.8906 --75.9016 --75.9016 --75.8969 --75.8828 --75.8812 --75.8953 --75.8875 --75.8969 --75.8859 --75.8922 --75.8859 --75.8828 --75.8922 --75.875 --75.8906 --75.8703 --75.8953 --75.8812 --75.8797 --75.8781 --75.8812 --75.8891 --75.8891 --75.8844 --75.8859 --75.8828 --75.8828 --75.8891 --75.8859 --75.8797 --75.875 --75.8812 --75.8891 --75.8844 --75.8969 --75.8828 --75.8953 --75.875 --75.9047 --75.8875 --75.8906 --75.8969 --75.8734 --75.8844 --75.8875 --75.8938 --75.8891 --75.8938 --75.8891 --75.8828 --75.8969 --75.8875 --75.8969 --75.8906 --75.8922 --75.8875 --75.8906 --75.8891 --75.8828 --75.8906 --75.8781 --75.9047 --75.8891 --75.8781 --75.8953 --75.8781 --75.9 --75.8844 --75.8812 --75.8859 --75.8984 --75.8828 --75.8875 --75.8891 --75.8891 --75.8938 --75.8906 --75.8875 --75.9031 --75.8859 --75.8922 --75.9031 --75.8922 --75.8969 --75.9016 --75.8984 --75.8906 --75.8922 --75.8812 --75.8875 --75.8891 --75.8953 --75.875 --75.8969 --75.8953 --75.8906 --75.8844 --75.8766 --75.8938 --75.8906 --75.8922 --75.8844 --75.8891 --75.8953 --75.8891 --75.8891 --75.8875 --75.8859 --75.8859 --75.8969 --75.8766 --75.8766 --75.8812 --75.8922 --75.8938 --75.9016 --75.8891 --75.8953 --75.8953 --75.8891 --75.8859 --75.8891 --75.8891 --75.8922 --75.8953 --75.8812 --75.8797 --75.8922 --75.8812 --75.8812 --75.875 --75.8812 --75.8875 --75.8719 --75.8734 --75.8812 --75.8891 --75.8906 --75.8688 --75.8906 --75.8906 --75.8953 --75.8859 --75.8906 --75.8875 --75.8766 --75.8828 --75.8781 --75.8875 --75.8969 --75.8766 --75.8875 --75.8844 --75.8844 --75.8938 --75.8844 --75.8828 --75.8922 --75.8844 --75.8812 --75.8859 --75.8828 --75.8812 --75.8953 --75.8828 --75.8938 --75.8844 --75.8859 --75.8844 --75.8828 --75.8922 --75.8812 --75.8922 --75.8812 --75.8875 --75.8906 --75.8812 --75.8828 --75.8766 --75.8812 --75.8812 --75.8719 --75.8672 --75.8766 --75.8688 --75.8797 --75.875 --75.8797 --75.8766 --75.8938 --75.8797 --75.8828 --75.8609 --75.8828 --75.8703 --75.8688 --75.8812 --75.8812 --75.8812 --75.8766 --75.8844 --75.8969 --75.8828 --75.8891 --75.8844 --75.8844 --75.8984 --75.8984 --75.8781 --75.8875 --75.8828 --75.8891 --75.8688 --75.875 --75.8781 --75.8672 --75.8703 --75.8766 --75.875 --75.8703 --75.8953 --75.8766 --75.8688 --75.8656 --75.8844 --75.8734 --75.8781 --75.8766 --75.8812 --75.8844 --75.8859 --75.8719 --75.8859 --75.875 --75.8766 --75.8672 --75.8797 --75.8828 --75.8781 --75.8781 --75.8734 --75.8859 --75.8703 --75.8672 --75.8844 --75.8891 --75.8641 --75.8828 --75.8828 --75.8812 --75.8781 --75.8719 --75.8703 --75.8922 --75.8828 --75.8781 --75.8781 --75.8703 --75.8797 --75.8688 --75.8828 --75.8766 --75.8953 --75.8781 --75.8812 --75.8844 --75.8875 --75.8828 --75.8875 --75.8812 --75.8844 --75.8766 --75.8766 --75.8797 --75.8703 --75.8703 --75.8688 --75.8812 --75.8703 --75.8688 --75.8703 --75.8781 --75.8703 --75.8734 --75.8766 --75.8781 --75.8734 --75.8828 --75.875 --75.8703 --75.8766 --75.8703 --75.8781 --75.8797 --75.8766 --75.8688 --75.8703 --75.8656 --75.8672 --75.8859 --75.8766 --75.8922 --75.8688 --75.8703 --75.8656 --75.8703 --75.8703 --75.8812 --75.8859 --75.8703 --75.8719 --75.875 --75.8734 --75.8672 --75.8812 --75.8797 --75.8828 --75.8625 --75.8859 --75.8594 --75.8812 --75.8891 --75.8828 --75.8891 --75.8797 --75.8891 --75.8828 --75.8844 --75.8781 --75.8891 --75.8781 --75.8766 --75.8844 --75.8734 --75.8797 --75.8828 --75.8875 --75.8844 --75.8812 --75.8797 --75.8625 --75.8875 --75.8891 --75.8828 --75.8906 --75.8734 --75.8812 --75.9 --75.8844 --75.8922 --75.875 --75.8875 --75.8891 --75.8922 --75.8875 --75.8797 --75.8812 --75.8828 --75.8891 --75.8844 --75.8719 --75.8875 --75.8797 --75.8953 --75.8859 --75.8969 --75.8797 --75.8812 --75.8781 --75.8859 --75.8844 --75.8859 --75.8781 --75.8922 --75.8859 --75.8797 --75.8875 --75.8781 --75.8938 --75.8875 --75.8906 --75.8875 --75.8891 --75.8891 --75.8922 --75.8969 --75.9047 --75.8797 --75.8891 --75.8938 --75.8969 --75.8922 --75.8922 --75.8906 --75.8891 --75.8781 --75.8828 --75.8766 --75.8875 --75.8703 --75.8797 --75.8984 --75.8781 --75.8984 --75.8797 --75.8781 --75.8844 --75.8859 --75.8625 --75.8734 --75.8703 --75.8953 --75.8625 --75.8828 --75.8828 --75.8734 --75.8875 --75.8891 --75.8969 --75.8875 --75.8719 --75.8719 --75.8734 --75.8781 --75.8719 --75.8516 --75.8719 --75.8828 --75.8906 --75.8781 --75.8922 --75.8859 --75.8812 --75.8781 --75.8812 --75.8812 --75.8812 --75.8859 --75.8828 --75.8812 --75.8875 --75.8812 --75.8797 --75.8641 --75.8734 --75.8797 --75.8844 --75.8812 --75.8891 --75.8906 --75.8906 --75.8953 --75.8844 --75.8922 --75.9 --75.8938 --75.8891 --75.8797 --75.8953 --75.8781 --75.8844 --75.8922 --75.8875 --75.8906 --75.8938 --75.8953 --75.8953 --75.9 --75.8922 --75.8938 --75.8797 --75.8812 --75.8953 --75.8906 --75.8828 --75.8797 --75.8844 --75.9 --75.8828 --75.8891 --75.8953 --75.9 --75.8906 --75.8984 --75.8844 --75.8969 --75.8844 --75.8984 --75.8844 --75.8953 --75.8969 --75.8891 --75.9031 --75.8969 --75.8984 --75.9016 --75.8891 --75.8828 --75.8812 --75.8797 --75.8719 --75.8672 --75.8844 --75.8812 --75.8906 --75.875 --75.875 --75.8781 --75.875 --75.8781 --75.8812 --75.875 --75.8594 --75.8719 --75.8781 --75.8766 --75.875 --75.8703 --75.8781 --75.8969 --75.8844 --75.8859 --75.8875 --75.8766 --75.8906 --75.8922 --75.8812 --75.8844 --75.875 --75.8844 --75.8609 --75.8859 --75.8719 --75.8828 --75.8797 --75.8859 --75.8812 --75.8766 --75.8781 --75.8797 --75.875 --75.875 --75.8734 --75.8672 --75.8781 --75.8875 --75.8797 --75.8859 --75.8734 --75.8797 --75.8828 --75.8859 --75.8719 --75.9016 --75.8891 --75.8828 --75.8906 --75.8922 --75.8875 --75.8891 --75.8766 --75.8875 --75.8734 --75.8734 --75.875 --75.8844 --75.8859 --75.8797 --75.8828 --75.8922 --75.8734 --75.8734 --75.8766 --75.8766 --75.8906 --75.8906 --75.8922 --75.8781 --75.875 --75.8797 --75.8844 --75.8828 --75.8906 --75.8828 --75.8797 --75.875 --75.8828 --75.8734 --75.8812 --75.8688 --75.875 --75.8734 --75.8672 --75.8781 --75.8797 --75.8812 --75.8734 --75.8688 --75.8734 --75.8906 --75.8781 --75.8906 --75.8812 --75.8797 --75.8953 --75.8844 --75.8797 --75.8844 --75.8672 --75.8844 --75.8797 --75.8844 --75.8719 --75.8844 --75.8781 --75.8688 --75.8641 --75.8844 --75.8906 --75.8875 --75.875 --75.875 --75.8844 --75.8781 --75.8766 --75.8781 --75.8875 --75.8797 --75.8797 --75.8766 --75.8891 --75.8844 --75.8844 --75.8891 --75.8828 --75.8906 --75.8828 --75.8703 --75.8766 --75.8688 --75.8844 --75.8844 --75.8891 --75.8812 --75.8906 --75.8734 --75.8875 --75.8734 --75.8812 --75.8781 --75.8906 --75.8812 --75.8844 --75.8672 --75.8797 --75.8656 --75.8797 --75.8844 --75.8844 --75.8766 --75.8797 --75.8844 --75.8844 --75.8828 --75.8609 --75.8828 --75.8812 --75.8906 --75.8844 --75.8734 --75.8625 --75.8734 --75.8891 --75.8875 --75.8766 --75.8906 --75.8672 --75.8719 --75.8844 --75.8812 --75.8656 --75.8844 --75.8719 --75.8766 --75.8734 --75.8859 --75.8844 --75.8703 --75.8828 --75.8781 --75.8812 --75.8828 --75.8703 --75.8719 --75.8828 --75.8766 --75.8703 --75.8609 --75.8719 --75.8734 --75.8672 --75.8641 --75.8703 --75.8797 --75.8672 --75.8656 --75.8797 --75.8594 --75.8703 --75.8734 --75.8828 --75.8734 --75.8656 --75.875 --75.8812 --75.8766 --75.8812 --75.8922 --75.8734 --75.8828 --75.8812 --75.8844 --75.8781 --75.8812 --75.8875 --75.8703 --75.8844 --75.8828 --75.8766 --75.875 --75.8719 --75.8781 --75.8875 --75.8781 --75.8844 --75.8781 --75.8875 --75.8812 --75.8812 --75.8797 --75.8797 --75.8797 --75.8812 --75.8688 --75.8812 --75.8844 --75.875 --75.8719 --75.8859 --75.8703 --75.875 --75.8781 --75.8656 --75.8625 --75.8734 --75.8688 --75.8609 --75.8688 --75.8656 --75.8703 --75.8781 --75.8734 --75.8781 --75.8734 --75.8859 --75.8688 --75.8719 --75.875 --75.8812 --75.8781 --75.8812 --75.8734 --75.8781 --75.8797 --75.8656 --75.875 --75.8656 --75.875 --75.8641 --75.8625 --75.8734 --75.875 --75.8672 --75.8719 --75.8672 --75.8812 --75.8531 --75.8719 --75.8656 --75.8781 --75.8625 --75.875 --75.8766 --75.8688 --75.875 --75.8766 --75.8719 --75.8641 --75.8656 --75.8672 --75.8781 --75.8766 --75.875 --75.875 --75.8859 --75.8625 --75.8859 --75.8766 --75.8703 --75.8797 --75.8797 --75.8797 --75.8797 --75.8797 --75.8828 --75.8828 --75.8766 --75.8812 --75.8844 --75.8656 --75.8906 --75.8641 --75.8828 --75.8641 --75.8828 --75.8641 --75.8922 --75.8828 --75.8766 --75.8766 --75.8938 --75.8688 --75.8797 --75.8734 --75.8812 --75.8672 --75.8656 --75.8766 --75.8828 --75.8719 --75.8719 --75.8734 --75.8766 --75.8719 --75.8734 --75.8906 --75.9016 --75.8859 --75.8734 --75.8938 --75.8812 --75.8703 --75.8859 --75.8812 --75.8781 --75.8906 --75.8844 --75.8734 --75.8875 --75.8859 --75.8859 --75.8844 --75.8688 --75.8812 --75.8656 --75.8766 --75.8859 --75.8719 --75.8734 --75.8781 --75.8797 --75.8906 --75.8781 --75.8797 --75.8828 --75.8922 --75.8766 --75.8828 --75.8891 --75.8797 --75.8828 --75.8953 --75.8891 --75.8859 --75.8766 --75.8688 --75.8875 --75.8828 --75.8812 --75.8859 --75.8828 --75.8891 --75.8938 --75.8906 --75.8844 --75.8922 --75.8969 --75.8734 --75.8906 --75.8828 --75.8844 --75.8844 --75.8812 --75.875 --75.8891 --75.8719 --75.8797 --75.8781 --75.8625 --75.8812 --75.8828 --75.8812 --75.8719 --75.8812 --75.8844 --75.8859 --75.875 --75.8781 --75.8828 --75.8906 --75.8797 --75.8797 --75.8859 --75.8812 --75.8828 --75.8812 --75.8797 --75.8797 --75.875 --75.8703 --75.8812 --75.8844 --75.8828 --75.8797 --75.8766 --75.875 --75.875 --75.8734 --75.8719 --75.8656 --75.8844 --75.8609 --75.8578 --75.8797 --75.8719 --75.8828 --75.8766 --75.8719 --75.8797 --75.8688 --75.8797 --75.8844 --75.8875 --75.8734 --75.875 --75.8734 --75.875 --75.8625 --75.875 --75.8562 --75.8594 --75.8797 --75.8766 --75.875 --75.8891 --75.8625 --75.8688 --75.8766 --75.8812 --75.875 --75.875 --75.8828 --75.8656 --75.8734 --75.8781 --75.8594 --75.8688 --75.8766 --75.8812 --75.8719 --75.8734 --75.8797 --75.8656 --75.8672 --75.8672 --75.8703 --75.8672 --75.875 --75.8844 --75.8797 --75.8703 --75.8703 --75.8797 --75.8594 --75.8672 --75.8578 --75.8641 --75.8766 --75.8656 --75.8797 --75.875 --75.8891 --75.8812 --75.8766 --75.8812 --75.8641 --75.8672 --75.8688 --75.8656 --75.8719 --75.8828 --75.8578 --75.875 --75.8828 --75.8812 --75.8797 --75.8703 --75.875 --75.8719 --75.8703 --75.8656 --75.8797 --75.8797 --75.8797 --75.8891 --75.8812 --75.8953 --75.8875 --75.8891 --75.8844 --75.8719 --75.8859 --75.8875 --75.8875 --75.8781 --75.8812 --75.8938 --75.8906 --75.8844 --75.8828 --75.8766 --75.8812 --75.8812 --75.8781 --75.8797 --75.8781 --75.8844 --75.8672 --75.8875 --75.8797 --75.8828 --75.8688 --75.8844 --75.8828 --75.8766 --75.8812 --75.8828 --75.8719 --75.8672 --75.8641 --75.875 --75.8688 --75.8797 --75.8797 --75.8875 --75.8781 --75.8719 --75.8797 --75.8703 --75.8672 --75.875 --75.8734 --75.8672 --75.8703 --75.8766 --75.8672 --75.8766 --75.8703 --75.8797 --75.8734 --75.8719 --75.8734 --75.8797 --75.8656 --75.8719 --75.8703 --75.8641 --75.8828 --75.8828 --75.8797 --75.8734 --75.8812 --75.8734 --75.8734 --75.8734 --75.8734 --75.8734 --75.8734 --75.8719 --75.8703 --75.8797 --75.8719 --75.8875 --75.8688 --75.8781 --75.8703 --75.8781 --75.8766 --75.8641 --75.8688 --75.8703 --75.8781 --75.8812 --75.875 --75.8766 --75.8766 --75.8688 --75.8703 --75.8797 --75.8844 --75.8812 --75.8812 --75.8797 --75.8828 --75.8797 --75.875 --75.8609 --75.8781 --75.8812 --75.8812 --75.8734 --75.8781 --75.8859 --75.8781 --75.8828 --75.8781 --75.8781 --75.8828 --75.8703 --75.8625 --75.8719 --75.8688 --75.8719 --75.8734 --75.8859 --75.8781 --75.8656 --75.875 --75.8688 --75.8703 --75.875 --75.8828 --75.8828 --75.8672 --75.8656 --75.8719 --75.875 --75.8672 --75.875 --75.8797 --75.8859 --75.8828 --75.875 --75.8844 --75.8766 --75.8812 --75.8859 --75.8781 --75.8812 --75.8703 --75.8719 --75.875 --75.8797 --75.8766 --75.8672 --75.8656 --75.8859 --75.8812 --75.8781 --75.8656 --75.875 --75.8859 --75.8672 --75.8781 --75.8859 --75.8766 --75.875 --75.8672 --75.8797 --75.8781 --75.8734 --75.8656 --75.8781 --75.8703 --75.8609 --75.8781 --75.8781 --75.8688 --75.8859 --75.8656 --75.8656 --75.8688 --75.8766 --75.8781 --75.8766 --75.8859 --75.8688 --75.8797 --75.8828 --75.8734 --75.8766 --75.8828 --75.8828 --75.8688 --75.8766 --75.8812 --75.8906 --75.8906 --75.8859 --75.875 --75.8734 --75.875 --75.8625 --75.8734 --75.8562 --75.8719 --75.875 --75.8703 --75.8719 --75.8688 --75.8781 --75.875 --75.8672 --75.8688 --75.8703 --75.8766 --75.8625 --75.8859 --75.875 --75.8812 --75.8828 --75.8828 --75.8859 --75.8859 --75.8719 --75.8812 --75.8766 --75.8781 --75.8812 --75.8703 --75.8766 --75.8828 --75.8812 --75.8812 --75.8859 --75.8703 --75.8734 --75.8844 --75.8766 --75.8859 --75.8828 --75.8734 --75.8766 --75.8625 --75.8688 --75.8781 --75.8906 --75.8719 --75.8828 --75.8734 --75.8797 --75.8703 --75.8828 --75.8688 --75.8688 --75.875 --75.8688 --75.8703 --75.8766 --75.8672 --75.8766 --75.8812 --75.8734 --75.8766 --75.8719 --75.8703 --75.8812 --75.8906 --75.8719 --75.8828 --75.8672 --75.8891 --75.8922 --75.8969 --75.8812 --75.8828 --75.8781 --75.8781 --75.8703 --75.8781 --75.8812 --75.8906 --75.8797 --75.8844 --75.8891 --75.8719 --75.8797 --75.8609 --75.8859 --75.8656 --75.8812 --75.8797 --75.875 --75.875 --75.8703 --75.8703 --75.8797 --75.8812 --75.8812 --75.8875 --75.8781 --75.8859 --75.8828 --75.8844 --75.8812 --75.8797 --75.8734 --75.8859 --75.8891 --75.8797 --75.8844 --75.8609 --75.8781 --75.8688 --75.8969 --75.8797 --75.8781 --75.8781 --75.8734 --75.8766 --75.8844 --75.8781 --75.8891 --75.8797 --75.8922 --75.8719 --75.8828 --75.8766 --75.8766 --75.875 --75.8641 --75.8766 --75.8734 --75.875 --75.8641 --75.8609 --75.8781 --75.8797 --75.8781 --75.8703 --75.8844 --75.8766 --75.8875 --75.8734 --75.8875 --75.8641 --75.875 --75.8578 --75.8734 --75.8734 --75.8766 --75.8656 --75.8766 --75.8766 --75.8719 --75.8781 --75.8891 --75.8656 --75.8844 --75.8734 --75.875 --75.8891 --75.8688 --75.8891 --75.8844 --75.8766 --75.8719 --75.8859 --75.8703 --75.8719 --75.8859 --75.8656 --75.8734 --75.8781 --75.8812 --75.8781 --75.8703 --75.8688 --75.8734 --75.8797 --75.8766 --75.8891 --75.8859 --75.8922 --75.8781 --75.8922 --75.8781 --75.8922 --75.8922 --75.8844 --75.8797 --75.8969 --75.8766 --75.9 --75.8703 --75.8719 --75.8797 --75.8688 --75.8938 --75.8625 --75.8734 --75.875 --75.8625 --75.8734 --75.8703 --75.8797 --75.8766 --75.875 --75.8688 --75.8688 --75.8891 --75.8672 --75.8688 --75.8734 --75.8703 --75.8844 --75.8859 --75.8859 --75.8672 --75.8797 --75.8797 --75.8656 --75.8875 --75.8906 --75.8812 --75.8797 --75.8641 --75.8828 --75.8656 --75.8828 --75.8906 --75.8828 --75.8688 --75.8844 --75.8766 --75.8875 --75.8859 --75.8812 --75.8844 --75.8781 --75.8766 --75.8906 --75.8719 --75.8812 --75.8609 --75.8781 --75.8719 --75.8578 --75.8812 --75.8547 --75.8781 --75.8625 --75.8656 --75.8672 --75.8906 --75.8766 --75.8812 --75.8859 --75.8719 --75.8719 --75.8812 --75.8734 --75.8719 --75.8672 --75.8766 --75.8922 --75.875 --75.8828 --75.8812 --75.8766 --75.8781 --75.8766 --75.8828 --75.8719 --75.875 --75.8703 --75.8797 --75.8922 --75.8781 --75.8875 --75.8891 --75.8953 --75.8766 --75.875 --75.8938 --75.8906 --75.8875 --75.8797 --75.8844 --75.8828 --75.8969 --75.8891 --75.9016 --75.8844 --75.875 --75.8875 --75.8859 --75.8953 --75.8812 --75.8797 --75.8891 --75.8812 --75.8859 --75.8812 --75.8766 --75.8797 --75.8875 --75.875 --75.9 --75.9 --75.8875 --75.8781 --75.8953 --75.8953 --75.8859 --75.8859 --75.875 --75.8859 --75.8797 --75.8875 --75.8734 --75.8719 --75.8719 --75.875 --75.8922 --75.8781 --75.8844 --75.8891 --75.8688 --75.8641 --75.8984 --75.8609 --75.8734 --75.8828 --75.8688 --75.8766 --75.8719 --75.8719 --75.8812 --75.8734 --75.8766 --75.8859 --75.8797 --75.8812 --75.8656 --75.8719 --75.875 --75.8812 --75.8828 --75.8828 --75.8734 --75.8922 --75.8766 --75.8781 --75.8844 --75.8844 --75.8672 --75.8875 --75.8906 --75.8828 --75.8797 --75.8734 --75.8766 --75.8719 --75.8828 --75.8781 --75.8672 --75.8766 --75.875 --75.8609 --75.8672 --75.8734 --75.8672 --75.8656 --75.8688 --75.8766 --75.8703 --75.875 --75.8688 --75.8734 --75.8703 --75.8703 --75.8797 --75.8734 --75.8656 --75.875 --75.8859 --75.8828 --75.8812 --75.8828 --75.8703 --75.8703 --75.8812 --75.8641 --75.8703 --75.8812 --75.8766 --75.8688 --75.8719 --75.8766 --75.8594 --75.8609 --75.8688 --75.8781 --75.8625 --75.8656 --75.8812 --75.875 --75.8609 --75.8844 --75.8641 --75.8797 --75.8734 --75.8828 --75.8734 --75.8797 --75.8594 --75.8609 --75.8734 --75.875 --75.8547 --75.8766 --75.8781 --75.8703 --75.8719 --75.8672 --75.8703 --75.8797 --75.8719 --75.8766 --75.8719 --75.8797 --75.8828 --75.8656 --75.8828 --75.8828 --75.8859 --75.8812 --75.875 --75.8703 --75.8672 --75.8875 --75.8688 --75.8859 --75.8734 --75.8734 --75.8812 --75.8859 --75.8766 --75.8797 --75.8781 --75.8672 --75.8719 --75.8734 --75.8781 --75.8766 --75.8719 --75.8625 --75.8625 --75.8625 --75.8781 --75.875 --75.8828 --75.8562 --75.8703 --75.875 --75.8766 --75.8688 --75.8719 --75.8719 --75.8688 --75.8828 --75.875 --75.8734 --75.8703 --75.8656 --75.8672 --75.8734 --75.8656 --75.8672 --75.8625 --75.8812 --75.8656 --75.8656 --75.8609 --75.8734 --75.8672 --75.8625 --75.8766 --75.8969 --75.8891 --75.8859 --75.8766 --75.8906 --75.8797 --75.875 --75.8766 --75.8875 --75.8828 --75.8797 --75.8734 --75.8641 --75.8875 --75.8875 --75.8828 --75.8781 --75.8875 --75.8844 --75.8859 --75.875 --75.8781 --75.8703 --75.8812 --75.8641 --75.8812 --75.8859 --75.8781 --75.8797 --75.8781 --75.8875 --75.8797 --75.8875 --75.8828 --75.875 --75.875 --75.8906 --75.8734 --75.8688 --75.875 --75.8891 --75.8688 --75.875 --75.8719 --75.8781 --75.8719 --75.8688 --75.8703 --75.8719 --75.8688 --75.8688 --75.8625 --75.875 --75.8656 --75.875 --75.8797 --75.8703 --75.8875 --75.8781 --75.8906 --75.8641 --75.8672 --75.8812 --75.8641 --75.8844 --75.8703 --75.9 --75.8906 --75.8875 --75.8812 --75.8906 --75.8688 --75.8828 --75.8719 --75.875 --75.8641 --75.8859 --75.8922 --75.8828 --75.8859 --75.8844 --75.8797 --75.8781 --75.8688 --75.8719 --75.8828 --75.8625 --75.875 --75.8688 --75.8844 --75.8828 --75.8734 --75.8734 --75.8719 --75.8844 --75.8734 --75.8797 --75.8641 --75.8625 --75.8562 --75.8719 --75.8734 --75.8734 --75.8828 --75.8641 --75.8859 --75.875 --75.8797 --75.8672 --75.8672 --75.8719 --75.8719 --75.8594 --75.875 --75.8797 --75.8797 --75.8641 --75.8641 --75.8688 --75.8734 --75.8719 --75.8656 --75.8766 --75.8703 --75.8781 --75.8656 --75.8797 --75.875 --75.8688 --75.8688 --75.8641 --75.8812 --75.8734 --75.8812 --75.8719 --75.8844 --75.8797 --75.8719 --75.8766 --75.8766 --75.8703 --75.8812 --75.875 --75.8672 --75.8844 --75.8766 --75.8844 --75.8672 --75.8719 --75.8672 --75.8594 --75.8719 --75.875 --75.8703 --75.8734 --75.875 --75.8672 --75.875 --75.8828 --75.8719 --75.8688 --75.8719 --75.8641 --75.8688 --75.8641 --75.8641 --75.8578 --75.8672 --75.8641 --75.8578 --75.8562 --75.8719 --75.8562 --75.8594 --75.8594 --75.8625 --75.8609 --75.8484 --75.8719 --75.8656 --75.8641 --75.8625 --75.8516 --75.8609 --75.875 --75.875 --75.8734 --75.8688 --75.8688 --75.85 --75.8578 --75.8703 --75.8594 --75.8719 --75.8641 --75.8719 --75.8766 --75.8828 --75.8656 --75.8859 --75.8781 --75.8625 --75.8734 --75.8625 --75.8641 --75.8703 --75.8828 --75.8516 --75.8516 --75.8625 --75.8547 --75.8656 --75.875 --75.8672 --75.8578 --75.8656 --75.8672 --75.8625 --75.8734 --75.8766 --75.8734 --75.8625 --75.8719 --75.875 --75.8828 --75.8781 --75.8766 --75.8688 --75.8719 --75.8734 --75.875 --75.8781 --75.8703 --75.875 --75.8656 --75.875 --75.8719 --75.8703 --75.8656 --75.8625 --75.8672 --75.8781 --75.8703 --75.875 --75.8812 --75.8797 --75.8781 --75.8688 --75.8672 --75.8781 --75.8703 --75.875 --75.8812 --75.8828 --75.8781 --75.8828 --75.8781 --75.8891 --75.8766 --75.8859 --75.8859 --75.8906 --75.8719 --75.8875 --75.8844 --75.875 --75.9 --75.8891 --75.8688 --75.8828 --75.8688 --75.8766 --75.8766 --75.8719 --75.8766 --75.8766 --75.8875 --75.8906 --75.875 --75.8859 --75.8891 --75.8859 --75.8766 --75.8828 --75.8703 --75.875 --75.8812 --75.9016 --75.8641 --75.8844 --75.8625 --75.8781 --75.8797 --75.8688 --75.8625 --75.8688 --75.8734 --75.8875 --75.8828 --75.8828 --75.8703 --75.8797 --75.875 --75.8781 --75.8734 --75.8703 --75.8781 --75.875 --75.8641 --75.8703 --75.8766 --75.8984 --75.8906 --75.8859 --75.8797 --75.8891 --75.8828 --75.8797 --75.8844 --75.8734 --75.8844 --75.8922 --75.8906 --75.8922 --75.8906 --75.8812 --75.9 --75.8703 --75.8875 --75.8891 --75.9 --75.8812 --75.8891 --75.8812 --75.8812 --75.9 --75.8906 --75.8938 --75.8844 --75.8828 --75.8797 --75.8781 --75.8781 --75.8781 --75.8906 --75.8859 --75.8781 --75.8922 --75.8859 --75.8859 --75.8797 --75.8812 --75.8781 --75.8734 --75.8875 --75.8859 --75.8781 --75.8812 --75.8922 --75.8859 --75.8828 --75.8906 --75.8656 --75.8781 --75.8703 --75.8688 --75.8906 --75.875 --75.8875 --75.8766 --75.8844 --75.8594 --75.875 --75.8859 --75.8844 --75.8828 --75.8859 --75.8875 --75.8828 --75.8922 --75.8812 --75.8797 --75.8844 --75.8703 --75.8734 --75.8922 --75.8781 --75.8828 --75.8859 --75.8953 --75.8781 --75.8812 --75.8781 --75.8719 --75.8812 --75.8703 --75.8609 --75.8797 --75.8828 --75.8688 --75.8766 --75.8766 --75.8781 --75.8875 --75.8734 --75.8766 --75.875 --75.8812 --75.8891 --75.8781 --75.8812 --75.8719 --75.8766 --75.8797 --75.8844 --75.8812 --75.8703 --75.8734 --75.8656 --75.8688 --75.8797 --75.8703 --75.8719 --75.8828 --75.8797 --75.8703 --75.8734 --75.8719 --75.8734 --75.8672 --75.8578 --75.8688 --75.8797 --75.8516 --75.8672 --75.8656 --75.8703 --75.875 --75.8641 --75.8703 --75.8797 --75.8531 --75.8766 --75.8797 --75.8734 --75.8719 --75.8672 --75.8781 --75.8641 --75.8703 --75.8688 --75.8844 --75.8938 --75.8844 --75.8766 --75.8688 --75.8734 --75.8766 --75.8688 --75.8703 --75.8844 --75.8797 --75.8812 --75.8734 --75.8797 --75.8812 --75.8797 --75.8938 --75.8828 --75.8859 --75.875 --75.8859 --75.8797 --75.875 --75.8828 --75.8906 --75.8781 --75.8828 --75.8891 --75.8844 --75.8891 --75.8828 --75.8578 --75.8844 --75.875 --75.875 --75.8844 --75.8734 --75.8734 --75.8766 --75.8719 --75.8797 --75.8812 --75.8719 --75.8703 --75.8844 --75.8656 --75.8781 --75.8781 --75.8719 --75.8672 --75.8781 --75.8828 --75.8859 --75.8656 --75.8781 --75.8891 --75.8672 --75.8719 --75.8812 --75.8719 --75.8703 --75.8844 --75.8719 --75.8766 --75.8844 --75.8734 --75.8781 --75.8781 --75.8734 --75.8766 --75.8859 --75.8812 --75.8688 --75.8766 --75.8781 --75.8734 --75.8875 --75.8891 --75.8984 --75.8875 --75.8828 --75.8797 --75.8625 --75.8719 --75.8641 --75.8812 --75.8906 --75.8781 --75.8875 --75.8703 --75.8906 --75.8891 --75.8906 --75.875 --75.8859 --75.8734 --75.8781 --75.8797 --75.8891 --75.8797 --75.8906 --75.8859 --75.8859 --75.8922 --75.8859 --75.8766 --75.8938 --75.8906 --75.8766 --75.8859 --75.8719 --75.8969 --75.8906 --75.8969 --75.8938 --75.8891 --75.8984 --75.8891 --75.8859 --75.8953 --75.8875 --75.8859 --75.8859 --75.8922 --75.8859 --75.8984 --75.8891 --75.8938 --75.9016 --75.9031 --75.8875 --75.8891 --75.8938 --75.9016 --75.8891 --75.8906 --75.8844 --75.8938 --75.8812 --75.8859 --75.8859 --75.8812 --75.8781 --75.8812 --75.8797 --75.8984 --75.8812 --75.8797 --75.8828 --75.8953 --75.8859 --75.8781 --75.8812 --75.8844 --75.8844 --75.8859 --75.8875 --75.8906 --75.8938 --75.8844 --75.8797 --75.8828 --75.8906 --75.8797 --75.8891 --75.8906 --75.8828 --75.8703 --75.8844 --75.8891 --75.8875 --75.8781 --75.8922 --75.8766 --75.8766 --75.8672 --75.8766 --75.8672 --75.875 --75.8953 --75.8703 --75.8906 --75.8734 --75.8781 --75.8719 --75.8797 --75.8828 --75.8844 --75.8781 --75.8828 --75.8828 --75.8656 --75.8969 --75.8828 --75.8656 --75.8719 --75.8812 --75.8766 --75.8766 --75.8922 --75.8891 --75.8828 --75.8828 --75.8859 --75.8781 --75.9016 --75.8875 --75.8812 --75.8891 --75.8844 --75.8938 --75.8797 --75.8891 --75.8734 --75.875 --75.8938 --75.8797 --75.8859 --75.875 --75.8906 --75.8719 --75.8766 --75.8828 --75.8797 --75.8734 --75.8812 --75.8906 --75.8859 --75.8797 --75.9062 --75.8656 --75.8859 --75.8828 --75.8781 --75.8859 --75.8844 --75.8891 --75.8859 --75.8844 --75.8875 --75.8844 --75.8922 --75.8969 --75.8906 --75.8797 --75.8781 --75.8844 --75.9016 --75.8844 --75.8812 --75.8781 --75.8891 --75.8859 --75.8875 --75.8906 --75.8938 --75.8812 --75.8922 --75.8922 --75.8797 --75.8953 --75.8812 --75.9 --75.8891 --75.8844 --75.9031 --75.8969 --75.9109 --75.8969 --75.8953 --75.8969 --75.8875 --75.8953 --75.9078 --75.8844 --75.8859 --75.8906 --75.8875 --75.9031 --75.8875 --75.8875 --75.8859 --75.9047 --75.8953 --75.8859 --75.8953 --75.8891 --75.8797 --75.8859 --75.8797 --75.8875 --75.8844 --75.8953 --75.8766 --75.8875 --75.8828 --75.9 --75.8812 --75.8828 --75.8984 --75.8875 --75.8891 --75.8844 --75.8844 --75.8969 --75.8844 --75.8875 --75.8906 --75.8906 --75.8828 --75.8922 --75.8922 --75.8812 --75.8953 --75.875 --75.8781 --75.8828 --75.8828 --75.8906 --75.8875 --75.875 --75.8812 --75.8812 --75.8891 --75.8844 --75.8812 --75.8844 --75.8781 --75.8938 --75.8844 --75.8891 --75.8797 --75.8844 --75.8766 --75.8766 --75.8859 --75.8781 --75.8875 --75.8844 --75.8766 --75.8844 --75.8766 --75.8828 --75.8906 --75.8812 --75.8953 --75.8891 --75.9047 --75.8984 --75.9016 --75.8906 --75.8938 --75.8828 --75.8859 --75.8812 --75.8828 --75.8828 --75.8828 --75.8906 --75.8859 --75.8766 --75.875 --75.8766 --75.8781 --75.8859 --75.8891 --75.8891 --75.8797 --75.8906 --75.8969 --75.8703 --75.8859 --75.8844 --75.9031 --75.8812 --75.9078 --75.8953 --75.8797 --75.8812 --75.8938 --75.9078 --75.8891 --75.8922 --75.9031 --75.8828 --75.8953 --75.8891 --75.8672 --75.8906 --75.8828 --75.8844 --75.8891 --75.8891 --75.8844 --75.8875 --75.8922 --75.8891 --75.8688 --75.8797 --75.8953 --75.8875 --75.8828 --75.8766 --75.8797 --75.8859 --75.8906 --75.8938 --75.8938 --75.8922 --75.8938 --75.8938 --75.9047 --75.8922 --75.8953 --75.8922 --75.8844 --75.8969 --75.8891 --75.8922 --75.8938 --75.9 --75.8766 --75.8953 --75.8953 --75.8891 --75.8969 --75.8875 --75.8906 --75.9 --75.9047 --75.8969 --75.8844 --75.8938 --75.9031 --75.8859 --75.9 --75.8891 --75.9016 --75.8938 --75.8859 --75.8797 --75.8797 --75.8875 --75.8953 --75.8922 --75.8812 --75.8844 --75.8891 --75.8891 --75.8828 --75.8969 --75.8797 --75.8891 --75.8891 --75.8859 --75.8875 --75.8906 --75.8844 --75.8891 --75.8922 --75.8938 --75.8953 --75.8953 --75.8953 --75.8922 --75.8938 --75.9016 --75.8797 --75.8906 --75.8938 --75.8922 --75.8938 --75.8891 --75.8906 --75.8906 --75.8906 --75.8719 --75.8844 --75.8906 --75.8828 --75.8844 --75.8875 --75.8797 --75.875 --75.8875 --75.8922 --75.8828 --75.8891 --75.8969 --75.8812 --75.8922 --75.8969 --75.8844 --75.8828 --75.8812 --75.8844 --75.875 --75.8797 --75.8828 --75.8781 --75.8938 --75.8719 --75.8891 --75.8844 --75.8891 --75.8719 --75.8828 --75.8875 --75.8672 --75.8734 --75.8859 --75.8797 --75.8938 --75.8969 --75.8766 --75.8859 --75.8766 --75.8688 --75.8797 --75.8781 --75.8812 --75.8891 --75.8906 --75.8703 --75.8781 --75.8906 --75.8969 --75.8859 --75.8906 --75.8797 --75.8875 --75.8953 --75.8781 --75.8781 --75.8781 --75.8719 --75.8797 --75.8859 --75.8797 --75.8844 --75.8688 --75.8703 --75.8766 --75.8766 --75.8812 --75.8844 --75.8875 --75.8812 --75.8828 --75.8734 --75.8891 --75.8828 --75.8922 --75.8922 --75.9 --75.8844 --75.8844 --75.8922 --75.8859 --75.8703 --75.8766 --75.8719 --75.875 --75.8781 --75.8797 --75.8781 --75.8781 --75.8828 --75.8875 --75.8797 --75.8719 --75.8781 --75.8812 --75.875 --75.8844 --75.8875 --75.8828 --75.8969 --75.8828 --75.8875 --75.8906 --75.8875 --75.8969 --75.8844 --75.8891 --75.8812 --75.8938 --75.8922 --75.8969 --75.8875 --75.8828 --75.8891 --75.8969 --75.875 --75.8875 --75.8797 --75.8781 --75.8875 --75.8828 --75.8875 --75.8938 --75.8781 --75.875 --75.8828 --75.8859 --75.8828 --75.8891 --75.8766 --75.8859 --75.8891 --75.8844 --75.8922 --75.8969 --75.8797 --75.9031 --75.8812 --75.8812 --75.8797 --75.8781 --75.8844 --75.8734 --75.8922 --75.8844 --75.8859 --75.8875 --75.8969 --75.9016 --75.8797 --75.8891 --75.8969 --75.8938 --75.8938 --75.8875 --75.8891 --75.8938 --75.8766 --75.8969 --75.9078 --75.8906 --75.9016 --75.8922 --75.8828 --75.9031 --75.8922 --75.8859 --75.8875 --75.8953 --75.8891 --75.8875 --75.8906 --75.8891 --75.8938 --75.9 --75.8891 --75.9047 --75.9 --75.8875 --75.8812 --75.9016 --75.8875 --75.8922 --75.9 --75.8938 --75.8969 --75.8891 --75.8875 --75.8922 --75.9016 --75.8812 --75.8891 --75.8938 --75.8828 --75.8891 --75.8891 --75.8812 --75.8781 --75.8953 --75.8875 --75.8688 --75.8953 --75.8875 --75.8719 --75.8734 --75.8828 --75.8781 --75.8719 --75.8828 --75.8766 --75.8781 --75.8781 --75.8781 --75.8781 --75.8688 --75.8781 --75.8859 --75.8828 --75.8891 --75.9 --75.8766 --75.8906 --75.8906 --75.8797 --75.8734 --75.8781 --75.8844 --75.8766 --75.8781 --75.8812 --75.8641 --75.8844 --75.8703 --75.8672 --75.8766 --75.8828 --75.8641 --75.8859 --75.8672 --75.8859 --75.8625 --75.8812 --75.8766 --75.8812 --75.8922 --75.8859 --75.8688 --75.8891 --75.8828 --75.8891 --75.8906 --75.8734 --75.8859 --75.8844 --75.8828 --75.8766 --75.8891 --75.8703 --75.8875 --75.8875 --75.8734 --75.8828 --75.8922 --75.8797 --75.8797 --75.8875 --75.8891 --75.8844 --75.8969 --75.8922 --75.8828 --75.8734 --75.8844 --75.8891 --75.8891 --75.8969 --75.8938 --75.8828 --75.8906 --75.9031 --75.8891 --75.8859 --75.8906 --75.8938 --75.8891 --75.8781 --75.8922 --75.8766 --75.8797 --75.8891 --75.8734 --75.8844 --75.8906 --75.8766 --75.8797 --75.8812 --75.8844 --75.8906 --75.8938 --75.8844 --75.8828 --75.8734 --75.8844 --75.8812 --75.8719 --75.8891 --75.8828 --75.8766 --75.8594 --75.8969 --75.8734 --75.8766 --75.8969 --75.8828 --75.8812 --75.8656 --75.8812 --75.8984 --75.8859 --75.8812 --75.875 --75.875 --75.8891 --75.8891 --75.8797 --75.8891 --75.8781 --75.8891 --75.8734 --75.8906 --75.8875 --75.8938 --75.8953 --75.8781 --75.8875 --75.8859 --75.8938 --75.8875 --75.8969 --75.8953 --75.8828 --75.9031 --75.8875 --75.8875 --75.8766 --75.8922 --75.8781 --75.8906 --75.8922 --75.8812 --75.8938 --75.8953 --75.9016 --75.9031 --75.9031 --75.8797 --75.8828 --75.9016 --75.9047 --75.8922 --75.8844 --75.8781 --75.875 --75.8844 --75.8969 --75.8938 --75.8953 --75.8938 --75.8891 --75.8828 --75.8922 --75.8828 --75.8906 --75.9 --75.8828 --75.8797 --75.8844 --75.8891 --75.8875 --75.8844 --75.8797 --75.8922 --75.8953 --75.9 --75.9 --75.8891 --75.9 --75.9047 --75.8938 --75.8969 --75.8969 --75.9 --75.8828 --75.8922 --75.8781 --75.8812 --75.8828 --75.8938 --75.8891 --75.8938 --75.8859 --75.8891 --75.8969 --75.8922 --75.8859 --75.8875 --75.8891 --75.8797 --75.8875 --75.8859 --75.8922 --75.8969 --75.8828 --75.8953 --75.8859 --75.8922 --75.8922 --75.8906 --75.8891 --75.8922 --75.9016 --75.8844 --75.8984 --75.9078 --75.9078 --75.8938 --75.8953 --75.9 --75.8969 --75.8922 --75.8906 --75.9016 --75.9 --75.8969 --75.8906 --75.9031 --75.9031 --75.8984 --75.9016 --75.8891 --75.8938 --75.8906 --75.9016 --75.9016 --75.9062 --75.8938 --75.8953 --75.8984 --75.8859 --75.9 --75.9016 --75.8938 --75.8922 --75.8922 --75.8891 --75.8875 --75.8984 --75.8938 --75.8953 --75.9047 --75.8969 --75.8859 --75.9 --75.8953 --75.9 --75.9109 --75.8891 --75.8938 --75.9047 --75.8953 --75.9016 --75.8906 --75.8969 --75.8906 --75.8953 --75.8969 --75.8781 --75.8938 --75.8922 --75.8969 --75.8875 --75.8859 --75.8906 --75.8859 --75.8859 --75.8766 --75.8906 --75.8828 --75.8906 --75.8922 --75.8984 --75.8781 --75.9 --75.8891 --75.8875 --75.8969 --75.8891 --75.8828 --75.8812 --75.8844 --75.8891 --75.8938 --75.8797 --75.8828 --75.9031 --75.8859 --75.8984 --75.8953 --75.8797 --75.875 --75.8797 --75.8844 --75.8906 --75.8812 --75.8891 --75.8844 --75.8891 --75.8797 --75.9 --75.8938 --75.8938 --75.8953 --75.8891 --75.8812 --75.8844 --75.8953 --75.875 --75.8844 --75.8906 --75.8828 --75.8875 --75.8797 --75.8844 --75.8875 --75.8875 --75.8953 --75.8922 --75.8781 --75.8891 --75.8938 --75.8734 --75.8891 --75.8875 --75.9 --75.8922 --75.9047 --75.8859 --75.8891 --75.8844 --75.8891 --75.9062 --75.8984 --75.8906 --75.9016 --75.8938 --75.8859 --75.8938 --75.8797 --75.8812 --75.9078 --75.8797 --75.9 --75.8953 --75.8891 --75.9 --75.8844 --75.8875 --75.9125 --75.9094 --75.8953 --75.8812 --75.8844 --75.9016 --75.9 --75.8938 --75.9 --75.8984 --75.9125 --75.8906 --75.8984 --75.9031 --75.8859 --75.8891 --75.8828 --75.8797 --75.8797 --75.8891 --75.8984 --75.8984 --75.9016 --75.9047 --75.8969 --75.8875 --75.8969 --75.9 --75.8891 --75.8969 --75.8781 --75.8859 --75.8797 --75.9 --75.8906 --75.8906 --75.8984 --75.8766 --75.9062 --75.8953 --75.8766 --75.8859 --75.8844 --75.9 --75.9 --75.8906 --75.875 --75.8953 --75.8703 --75.8891 --75.8891 --75.9 --75.875 --75.875 --75.8875 --75.8844 --75.8969 --75.8844 --75.8875 --75.8844 --75.8891 --75.8797 --75.8812 --75.8719 --75.8766 --75.8797 --75.8812 --75.8891 --75.8797 --75.9031 --75.8766 --75.8844 --75.8906 --75.8828 --75.8984 --75.8828 --75.8891 --75.8844 --75.8828 --75.8812 --75.8812 --75.8906 --75.8969 --75.9 --75.8766 --75.8812 --75.8781 --75.8859 --75.8891 --75.8844 --75.8844 --75.8797 --75.8875 --75.8766 --75.8906 --75.8906 --75.8938 --75.8797 --75.8891 --75.8969 --75.8812 --75.8828 --75.8844 --75.8828 --75.8828 --75.8922 --75.8953 --75.8859 --75.8875 --75.8828 --75.8906 --75.8875 --75.8828 --75.8766 --75.8922 --75.8828 --75.875 --75.8922 --75.8938 --75.8828 --75.8922 --75.8922 --75.8781 --75.8969 --75.9047 --75.8922 --75.9047 --75.8953 --75.8859 --75.8953 --75.8969 --75.8984 --75.8828 --75.8766 --75.8719 --75.8891 --75.9016 --75.8938 --75.8906 --75.8859 --75.8859 --75.8969 --75.9 --75.8859 --75.8953 --75.8922 --75.875 --75.8906 --75.8891 --75.8953 --75.8906 --75.8781 --75.8734 --75.8828 --75.8797 --75.8797 --75.8938 --75.8766 --75.8766 --75.8812 --75.8781 --75.8922 --75.8906 --75.875 --75.8938 --75.8828 --75.8844 --75.8875 --75.875 --75.8969 --75.8781 --75.8891 --75.8906 --75.8938 --75.8781 --75.8875 --75.8953 --75.8984 --75.8891 --75.8953 --75.8953 --75.8844 --75.8938 --75.8938 --75.8844 --75.8906 --75.8906 --75.8781 --75.8828 --75.8906 --75.8828 --75.8922 --75.8859 --75.8938 --75.8844 --75.8875 --75.8812 --75.8719 --75.8922 --75.8891 --75.8953 --75.8891 --75.8969 --75.8766 --75.8828 --75.8781 --75.8781 --75.8797 --75.8953 --75.8828 --75.8859 --75.8922 --75.8656 --75.8672 --75.8859 --75.8922 --75.8781 --75.8766 --75.8859 --75.8859 --75.8906 --75.8844 --75.8844 --75.8781 --75.8891 --75.8812 --75.8766 --75.8688 --75.8719 --75.8812 --75.8719 --75.8766 --75.8875 --75.8953 --75.8906 --75.8766 --75.8922 --75.8922 --75.8906 --75.8906 --75.8906 --75.8984 --75.8906 --75.8984 --75.9062 --75.9047 --75.8922 --75.8906 --75.8844 --75.8891 --75.9 --75.8969 --75.8906 --75.8891 --75.8812 --75.8812 --75.8891 --75.8672 --75.8844 --75.8797 --75.8781 --75.8938 --75.8828 --75.8844 --75.8891 --75.8922 --75.8766 --75.8797 --75.8812 --75.8828 --75.8922 --75.8859 --75.9016 --75.8969 --75.8922 --75.8906 --75.8828 --75.8969 --75.8875 --75.8891 --75.8734 --75.9031 --75.8984 --75.8906 --75.8984 --75.8922 --75.8844 --75.8891 --75.8875 --75.8922 --75.8859 --75.8922 --75.8734 --75.8797 --75.8828 --75.8688 --75.8844 --75.8766 --75.8891 --75.8859 --75.8688 --75.875 --75.8922 --75.8797 --75.8797 --75.8906 --75.8719 --75.8812 --75.8875 --75.8734 --75.8812 --75.8953 --75.8906 --75.8859 --75.8797 --75.9031 --75.8984 --75.8922 --75.8828 --75.8703 --75.8969 --75.8891 --75.8906 --75.8953 --75.8812 --75.8922 --75.9031 --75.8938 --75.9078 --75.8844 --75.8766 --75.8844 --75.8828 --75.8969 --75.8953 --75.8844 --75.8859 --75.8984 --75.9062 --75.8766 --75.9 --75.9016 --75.8797 --75.8922 --75.8828 --75.8891 --75.8703 --75.8891 --75.8891 --75.8938 --75.8969 --75.8906 --75.8891 --75.8953 --75.8891 --75.8922 --75.8969 --75.8953 --75.8953 --75.9031 --75.8984 --75.8953 --75.8984 --75.9 --75.8891 --75.8875 --75.8875 --75.8922 --75.8859 --75.8766 --75.8922 --75.8859 --75.8984 --75.8906 --75.8875 --75.8875 --75.8922 --75.8875 --75.8828 --75.8875 --75.8875 --75.8938 --75.8953 --75.8797 --75.8906 --75.9 --75.8906 --75.8953 --75.8984 --75.8859 --75.8906 --75.9078 --75.8922 --75.8906 --75.8922 --75.8797 --75.8953 --75.8812 --75.8859 --75.8938 --75.8953 --75.9062 --75.8953 --75.9 --75.8844 --75.8875 --75.9062 --75.9031 --75.8812 --75.8953 --75.9 --75.8891 --75.8984 --75.8969 --75.8891 --75.8969 --75.8875 --75.8891 --75.8969 --75.8906 --75.8953 --75.8938 --75.8953 --75.8812 --75.9031 --75.8875 --75.8844 --75.8938 --75.8906 --75.9047 --75.8906 --75.8812 --75.8922 --75.8891 --75.8938 --75.8938 --75.8984 --75.8906 --75.8922 --75.8969 --75.9 --75.8906 --75.9 --75.8969 --75.9016 --75.8969 --75.8844 --75.8969 --75.8922 --75.8953 --75.8891 --75.9078 --75.8938 --75.8922 --75.9031 --75.9047 --75.8984 --75.9047 --75.9062 --75.8953 --75.9047 --75.9031 --75.8938 --75.9031 --75.8859 --75.8891 --75.8891 --75.8859 --75.8984 --75.9016 --75.9062 --75.9047 --75.8969 --75.8812 --75.8953 --75.8984 --75.8844 --75.8922 --75.8875 --75.9 --75.8922 --75.8891 --75.8953 --75.8984 --75.9031 --75.8984 --75.9 --75.8953 --75.8859 --75.9062 --75.8922 --75.8922 --75.8953 --75.9016 --75.9031 --75.8938 --75.8891 --75.9047 --75.8844 --75.8969 --75.8969 --75.9062 --75.9047 --75.9047 --75.8984 --75.9031 --75.8891 --75.9062 --75.9047 --75.9 --75.8875 --75.8938 --75.9016 --75.8984 --75.8969 --75.8891 --75.9 --75.8859 --75.8906 --75.8922 --75.8891 --75.8922 --75.8922 --75.8812 --75.8906 --75.8828 --75.8859 --75.8953 --75.8984 --75.8984 --75.8938 --75.8938 --75.8875 --75.9016 --75.8891 --75.8844 --75.8969 --75.9031 --75.9047 --75.8906 --75.8984 --75.8922 --75.8969 --75.8891 --75.9031 --75.8984 --75.8812 --75.8875 --75.8984 --75.8875 --75.8906 --75.8875 --75.8938 --75.8891 --75.8891 --75.8906 --75.8859 --75.8859 --75.9062 --75.8906 --75.8828 --75.8891 --75.8953 --75.8922 --75.9016 --75.8891 --75.8969 --75.8906 --75.8922 --75.875 --75.8938 --75.8938 --75.8875 --75.8859 --75.8969 --75.9 --75.8891 --75.8984 --75.8891 --75.8938 --75.8891 --75.8891 --75.8953 --75.8859 --75.8859 --75.8828 --75.8969 --75.8812 --75.9 --75.8891 --75.8766 --75.8859 --75.8906 --75.9016 --75.8906 --75.8844 --75.8906 --75.8844 --75.8953 --75.8844 --75.8859 --75.8953 --75.8953 --75.8922 --75.8984 --75.8875 --75.8938 --75.8922 --75.8766 --75.8891 --75.8938 --75.8781 --75.8859 --75.8828 --75.8938 --75.8859 --75.8891 --75.8938 --75.9031 --75.8859 --75.8812 --75.8844 --75.8875 --75.8859 --75.8812 --75.8812 --75.8766 --75.8875 --75.8781 --75.8938 --75.8938 --75.8844 --75.8875 --75.8984 --75.8984 --75.8922 --75.8875 --75.8812 --75.8797 --75.8859 --75.8859 --75.8844 --75.8828 --75.8922 --75.8891 --75.8906 --75.8938 --75.8891 --75.8828 --75.8844 --75.8859 --75.8828 --75.8766 --75.8984 --75.8875 --75.8828 --75.8969 --75.8953 --75.8922 --75.8969 --75.8969 --75.8906 --75.8875 --75.8734 --75.8797 --75.8891 --75.8906 --75.8797 --75.8906 --75.8844 --75.8828 --75.8781 --75.9 --75.8797 --75.8828 --75.8781 --75.8844 --75.8781 --75.8859 --75.8766 --75.8875 --75.8781 --75.8797 --75.8766 --75.8922 --75.8969 --75.8828 --75.8719 --75.8938 --75.8812 --75.8891 --75.8922 --75.8766 --75.8953 --75.8844 --75.8984 --75.8953 --75.8953 --75.8953 --75.8906 --75.9016 --75.8797 --75.8812 --75.8906 --75.8969 --75.8812 --75.8891 --75.8938 --75.8922 --75.8922 --75.8953 --75.9047 --75.8922 --75.8922 --75.8719 --75.8875 --75.8922 --75.8891 --75.8875 --75.9016 --75.8953 --75.8938 --75.8891 --75.9141 --75.9 --75.9031 --75.8984 --75.9141 --75.8938 --75.8938 --75.9016 --75.9 --75.8953 --75.9016 --75.8891 --75.8875 --75.9047 --75.8906 --75.9062 --75.8969 --75.8891 --75.9 --75.8891 --75.8953 --75.8891 --75.8703 --75.8906 --75.8922 --75.8812 --75.8875 --75.8875 --75.8953 --75.8984 --75.8906 --75.8891 --75.8938 --75.8859 --75.8953 --75.9016 --75.9016 --75.8922 --75.8984 --75.8891 --75.9 --75.9 --75.8953 --75.8922 --75.8969 --75.8984 --75.8859 --75.8922 --75.8984 --75.8984 --75.8797 --75.8812 --75.9 --75.8938 --75.8953 --75.8859 --75.8844 --75.8906 --75.8906 --75.8797 --75.8844 --75.8953 --75.8844 --75.8875 --75.8891 --75.8891 --75.8906 --75.8953 --75.8875 --75.9062 --75.9047 --75.9016 --75.8938 --75.9 --75.8969 --75.8906 --75.8938 --75.8812 --75.9 --75.8875 --75.8969 --75.8891 --75.8875 --75.8922 --75.9 --75.8922 --75.8938 --75.8828 --75.8953 --75.8953 --75.8875 --75.9 --75.9062 --75.9016 --75.9078 --75.9 --75.8891 --75.9 --75.8953 --75.9078 --75.8969 --75.9031 --75.9016 --75.9 --75.8859 --75.8844 --75.9031 --75.9 --75.8938 --75.8922 --75.9109 --75.8938 --75.8844 --75.9141 --75.8984 --75.8953 --75.9 --75.9031 --75.8984 --75.8984 --75.9047 --75.9016 --75.9078 --75.9047 --75.9062 --75.9078 --75.9172 --75.9047 --75.9078 --75.8812 --75.8922 --75.9047 --75.9078 --75.8984 --75.8922 --75.9031 --75.9109 --75.9031 --75.9047 --75.9016 --75.8953 --75.9062 --75.8969 --75.8969 --75.8953 --75.9 --75.8984 --75.8969 --75.9141 --75.9125 --75.9031 --75.925 --75.9 --75.8984 --75.9047 --75.9031 --75.9016 --75.9078 --75.9062 --75.9125 --75.9094 --75.9094 --75.9047 --75.9016 --75.9187 --75.9109 --75.9094 --75.8984 --75.9016 --75.9094 --75.9 --75.9094 --75.9016 --75.8953 --75.8953 --75.8891 --75.8922 --75.8969 --75.9125 --75.8969 --75.9094 --75.9031 --75.9141 --75.9016 --75.8984 --75.8953 --75.9031 --75.8922 --75.9 --75.8891 --75.9062 --75.8844 --75.8875 --75.8969 --75.8875 --75.8875 --75.8984 --75.8891 --75.8969 --75.8969 --75.9031 --75.8875 --75.8859 --75.8891 --75.8984 --75.9016 --75.8906 --75.8859 --75.8859 --75.8938 --75.8859 --75.8969 --75.8938 --75.8906 --75.8969 --75.8969 --75.8781 --75.9016 --75.9078 --75.8859 --75.9 --75.8969 --75.8891 --75.8891 --75.8922 --75.8891 --75.8859 --75.8969 --75.8938 --75.8906 --75.9 --75.9016 --75.8953 --75.9 --75.8984 --75.8922 --75.8953 --75.8906 --75.9 --75.8859 --75.8922 --75.8953 --75.8938 --75.9016 --75.8938 --75.8828 --75.8969 --75.9062 --75.8969 --75.8938 --75.8938 --75.8844 --75.9094 --75.8984 --75.8953 --75.8984 --75.9 --75.9031 --75.9062 --75.8812 --75.8906 --75.8969 --75.9094 --75.8906 --75.8922 --75.8969 --75.9031 --75.9016 --75.9031 --75.8953 --75.8859 --75.9 --75.8953 --75.8969 --75.8906 --75.9078 --75.9 --75.9031 --75.8953 --75.8922 --75.9016 --75.9109 --75.9031 --75.9 --75.9062 --75.8953 --75.8953 --75.9078 --75.8969 --75.8953 --75.8969 --75.8812 --75.8922 --75.8875 --75.8938 --75.8953 --75.8969 --75.8938 --75.8906 --75.9125 --75.8969 --75.8844 --75.8859 --75.8906 --75.9062 --75.8984 --75.9047 --75.8938 --75.8969 --75.8953 --75.8938 --75.8938 --75.9 --75.875 --75.9016 --75.8938 --75.8828 --75.8844 --75.8891 --75.8906 --75.8953 --75.8859 --75.8984 --75.8797 --75.8969 --75.8875 --75.8875 --75.8797 --75.8859 --75.8906 --75.8828 --75.8828 --75.8781 --75.9016 --75.8797 --75.8891 --75.8797 --75.8922 --75.8828 --75.8891 --75.8969 --75.8828 --75.8938 --75.8734 --75.8891 --75.8844 --75.875 --75.8906 --75.875 --75.8859 --75.8859 --75.8828 --75.8812 --75.9 --75.8844 --75.8906 --75.8969 --75.875 --75.8844 --75.8969 --75.8781 --75.9094 --75.8969 --75.8922 --75.8844 --75.8969 --75.9 --75.9062 --75.8969 --75.8891 --75.9047 --75.8891 --75.8828 --75.9109 --75.8938 --75.8891 --75.8969 --75.8938 --75.8812 --75.8875 --75.8812 --75.8938 --75.8828 --75.9016 --75.8844 --75.8984 --75.8922 --75.8844 --75.8938 --75.8938 --75.8938 --75.8844 --75.8922 --75.8844 --75.9016 --75.8953 --75.8906 --75.8953 --75.8953 --75.8984 --75.8812 --75.8969 --75.8906 --75.8844 --75.8844 --75.8812 --75.8797 --75.8984 --75.8938 --75.8984 --75.8984 --75.9266 --75.9 --75.8906 --75.9062 --75.8953 --75.9062 --75.9047 --75.8812 --75.8875 --75.8969 --75.8844 --75.8906 --75.8969 --75.9031 --75.8906 --75.8891 --75.8812 --75.8969 --75.8969 --75.8859 --75.8797 --75.8828 --75.8953 --75.9047 --75.9141 --75.8969 --75.8906 --75.8844 --75.9 --75.9031 --75.9 --75.8953 --75.9 --75.8844 --75.8953 --75.9031 --75.9062 --75.8781 --75.8844 --75.9031 --75.8953 --75.9062 --75.8969 --75.8953 --75.9062 --75.9047 --75.9031 --75.8953 --75.9047 --75.8938 --75.9 --75.8922 --75.8969 --75.8844 --75.8938 --75.8922 --75.8844 --75.8828 --75.8859 --75.8906 --75.8875 --75.8953 --75.9016 --75.9172 --75.8906 --75.8969 --75.8844 --75.8969 --75.8891 --75.8891 --75.8922 --75.9 --75.9016 --75.9109 --75.8922 --75.8984 --75.9125 --75.9047 --75.9078 --75.8953 --75.9 --75.9047 --75.9047 --75.9 --75.8984 --75.9078 --75.9031 --75.9016 --75.9031 --75.9031 --75.9 --75.9031 --75.9187 --75.8859 --75.8906 --75.9 --75.8906 --75.9125 --75.8859 --75.8969 --75.9109 --75.8938 --75.9078 --75.9 --75.9016 --75.8906 --75.8953 --75.9047 --75.8734 --75.9078 --75.8844 --75.9078 --75.9 --75.9187 --75.9031 --75.9156 --75.9062 --75.8922 --75.9047 --75.9016 --75.9094 --75.9 --75.9031 --75.9062 --75.9109 --75.8922 --75.9031 --75.8984 --75.8922 --75.8891 --75.8906 --75.9047 --75.8891 --75.8953 --75.8922 --75.8953 --75.9016 --75.8969 --75.8938 --75.8984 --75.8922 --75.8984 --75.9078 --75.8906 --75.8953 --75.9031 --75.9016 --75.8875 --75.8938 --75.875 --75.8969 --75.8922 --75.8828 --75.8859 --75.8875 --75.875 --75.8922 --75.8906 --75.8734 --75.8875 --75.8797 --75.8859 --75.8781 --75.8891 --75.8859 --75.875 --75.8891 --75.8906 --75.8906 --75.8859 --75.8875 --75.8984 --75.8859 --75.8875 --75.8859 --75.875 --75.8766 --75.8797 --75.8984 --75.8812 --75.8938 --75.8922 --75.8797 --75.8984 --75.8859 --75.8781 --75.8906 --75.8828 --75.8875 --75.8953 --75.875 --75.8891 --75.8953 --75.9016 --75.8859 --75.9016 --75.8828 --75.8859 --75.8719 --75.8891 --75.8891 --75.8859 --75.8875 --75.8812 --75.8734 --75.8906 --75.8875 --75.8844 --75.9062 --75.8797 --75.8891 --75.8938 --75.8953 --75.9031 --75.8906 --75.9016 --75.8844 --75.8891 --75.9016 --75.8875 --75.9047 --75.8891 --75.8922 --75.8844 --75.8812 --75.8984 --75.8844 --75.8781 --75.8875 --75.8828 --75.8859 --75.8938 --75.8859 --75.8781 --75.8906 --75.9031 --75.8828 --75.8891 --75.8891 --75.8859 --75.8828 --75.8953 --75.9 --75.9031 --75.8891 --75.8766 --75.8938 --75.8875 --75.9016 --75.8906 --75.8781 --75.8891 --75.9016 --75.8953 --75.9 --75.8844 --75.8891 --75.8875 --75.8984 --75.8906 --75.9031 --75.8984 --75.8953 --75.8953 --75.9 --75.8875 --75.9031 --75.8906 --75.8875 --75.8875 --75.8969 --75.8891 --75.8922 --75.9062 --75.8734 --75.9 --75.9125 --75.8969 --75.9141 --75.8875 --75.8938 --75.8938 --75.9031 --75.8969 --75.9 --75.8969 --75.8984 --75.8922 --75.8969 --75.8906 --75.9094 --75.9125 --75.9047 --75.8922 --75.9094 --75.9125 --75.9016 --75.8984 --75.9031 --75.8969 --75.9109 --75.8906 --75.9062 --75.9016 --75.9 --75.9 --75.8969 --75.9 --75.9 --75.8891 --75.8969 --75.8906 --75.8859 --75.8969 --75.9094 --75.8953 --75.8969 --75.8891 --75.8922 --75.8859 --75.8906 --75.9 --75.8938 --75.8953 --75.8984 --75.9047 --75.8906 --75.8812 --75.9031 --75.9 --75.9016 --75.8969 --75.8984 --75.8984 --75.8844 --75.8766 --75.9016 --75.8953 --75.9031 --75.8859 --75.9031 --75.8984 --75.8953 --75.8969 --75.8969 --75.8891 --75.8859 --75.8953 --75.8906 --75.8984 --75.8875 --75.8828 --75.8875 --75.8922 --75.8844 --75.9047 --75.8891 --75.8859 --75.9 --75.8969 --75.8812 --75.8953 --75.8984 --75.8906 --75.9062 --75.8859 --75.8891 --75.9094 --75.8875 --75.8938 --75.8875 --75.8859 --75.8891 --75.8938 --75.8859 --75.8906 --75.8922 --75.8688 --75.8844 --75.8844 --75.8891 --75.8766 --75.8875 --75.8844 --75.8781 --75.8859 --75.8906 --75.9047 --75.8922 --75.8766 --75.8797 --75.8812 --75.8906 --75.8891 --75.9 --75.8812 --75.8953 --75.8828 --75.875 --75.8859 --75.8953 --75.8906 --75.8984 --75.8859 --75.8828 --75.9031 --75.8906 --75.8953 --75.9031 --75.8891 --75.8922 --75.8828 --75.8922 --75.8984 --75.8891 --75.9 --75.8828 --75.8891 --75.8781 --75.8906 --75.9016 --75.8922 --75.8953 --75.9047 --75.9047 --75.8984 --75.8984 --75.9031 --75.9016 --75.9016 --75.8891 --75.8875 --75.9109 --75.8859 --75.8906 --75.8812 --75.8844 --75.9031 --75.8906 --75.8938 --75.9016 --75.8984 --75.8938 --75.8984 --75.9031 --75.8922 --75.9031 --75.8922 --75.8922 --75.9031 --75.8922 --75.9031 --75.9016 --75.9062 --75.8938 --75.9109 --75.9 --75.9 --75.9016 --75.8969 --75.9016 --75.8953 --75.8812 --75.8828 --75.8938 --75.8938 --75.8984 --75.8969 --75.8906 --75.9 --75.9 --75.9031 --75.9031 --75.8984 --75.9 --75.9062 --75.8969 --75.8891 --75.8922 --75.8875 --75.8984 --75.9031 --75.9047 --75.8953 --75.8891 --75.8828 --75.9016 --75.8891 --75.8984 --75.9 --75.8875 --75.8938 --75.8875 --75.8859 --75.8859 --75.8875 --75.9 --75.9 --75.8891 --75.8984 --75.8922 --75.8875 --75.8953 --75.8984 --75.8891 --75.8953 --75.8906 --75.9047 --75.8906 --75.8906 --75.8969 --75.875 --75.8969 --75.8984 --75.8797 --75.8906 --75.8922 --75.9016 --75.8859 --75.8938 --75.8875 --75.8875 --75.8953 --75.9 --75.9031 --75.8906 --75.8922 --75.8859 --75.8875 --75.8797 --75.8969 --75.8938 --75.8938 --75.8891 --75.8984 --75.9062 --75.8859 --75.8812 --75.8984 --75.8828 --75.8969 --75.8875 --75.8906 --75.9031 --75.8953 --75.9016 --75.9016 --75.8969 --75.9125 --75.9031 --75.8938 --75.9109 --75.8906 --75.8938 --75.9109 --75.9062 --75.9 --75.8969 --75.8984 --75.9062 --75.9125 --75.9047 --75.8984 --75.8922 --75.9062 --75.9078 --75.9016 --75.9016 --75.9125 --75.9094 --75.9062 --75.9031 --75.9047 --75.9 --75.8969 --75.8828 --75.8984 --75.8875 --75.9109 --75.8984 --75.8891 --75.9016 --75.8969 --75.9047 --75.8891 --75.9062 --75.9047 --75.9016 --75.8922 --75.9 --75.8969 --75.9062 --75.9078 --75.9016 --75.8953 --75.8922 --75.9047 --75.9141 --75.9 --75.8891 --75.9062 --75.9078 --75.9 --75.9047 --75.9109 --75.9062 --75.9078 --75.8984 --75.9109 --75.9094 --75.8984 --75.8938 --75.9047 --75.9047 --75.9047 --75.8953 --75.9 --75.8969 --75.8922 --75.9016 --75.9016 --75.9031 --75.9 --75.9 --75.8969 --75.8984 --75.9016 --75.8969 --75.9047 --75.8984 --75.8875 --75.9078 --75.8969 --75.9031 --75.9062 --75.9109 --75.8891 --75.9078 --75.9016 --75.9031 --75.8984 --75.8938 --75.9109 --75.8953 --75.9062 --75.9109 --75.9016 --75.8953 --75.9078 --75.9016 --75.8984 --75.9031 --75.9156 --75.9016 --75.9109 --75.9125 --75.8984 --75.9141 --75.9109 --75.9062 --75.9156 --75.9172 --75.9016 --75.9016 --75.9047 --75.9109 --75.8938 --75.8766 --75.9031 --75.8953 --75.8875 --75.9078 --75.8828 --75.9047 --75.8844 --75.9031 --75.8891 --75.8969 --75.8922 --75.8906 --75.8984 --75.9031 --75.9047 --75.8984 --75.8938 --75.9062 --75.9109 --75.9078 --75.9141 --75.9156 --75.9062 --75.9062 --75.9078 --75.9156 --75.9 --75.9109 --75.9062 --75.9 --75.8984 --75.9125 --75.9062 --75.9109 --75.9 --75.9 --75.9109 --75.8922 --75.9 --75.8984 --75.9078 --75.9078 --75.8906 --75.9109 --75.8984 --75.9109 --75.9141 --75.9047 --75.8984 --75.8938 --75.8984 --75.8906 --75.9031 --75.9094 --75.8984 --75.8984 --75.9016 --75.9094 --75.9062 --75.8891 --75.9062 --75.8984 --75.9109 --75.8984 --75.9078 --75.9016 --75.8906 --75.9062 --75.9062 --75.9 --75.9156 --75.8891 --75.8828 --75.9078 --75.8906 --75.8953 --75.8984 --75.9016 --75.9 --75.9047 --75.9125 --75.9109 --75.9016 --75.9 --75.9016 --75.9047 --75.9094 --75.9078 --75.9062 --75.9094 --75.8969 --75.9016 --75.9109 --75.9219 --75.9016 --75.9109 --75.9094 --75.9141 --75.9109 --75.9 --75.9109 --75.9219 --75.8984 --75.8969 --75.8969 --75.8844 --75.8938 --75.8953 --75.9047 --75.9062 --75.9031 --75.8875 --75.8984 --75.9 --75.9031 --75.8969 --75.8984 --75.8734 --75.8859 --75.9031 --75.9062 --75.8922 --75.9 --75.9 --75.8875 --75.8891 --75.8922 --75.8875 --75.8906 --75.9047 --75.8891 --75.8844 --75.9016 --75.8938 --75.8875 --75.8953 --75.8922 --75.8922 --75.8984 --75.9062 --75.8859 --75.8953 --75.8953 --75.8953 --75.8922 --75.8906 --75.8984 --75.8891 --75.8938 --75.8922 --75.8969 --75.8922 --75.8891 --75.9047 --75.8844 --75.8953 --75.9062 --75.8844 --75.9 --75.8938 --75.8906 --75.9078 --75.8828 --75.8938 --75.8938 --75.9016 --75.8906 --75.8938 --75.8844 --75.9016 --75.8969 --75.8859 --75.8953 --75.8953 --75.8938 --75.9125 --75.8922 --75.9062 --75.8922 --75.8984 --75.8812 --75.8938 --75.8891 --75.9109 --75.8844 --75.9047 --75.8906 --75.9016 --75.8891 --75.8922 --75.8859 --75.9 --75.8938 --75.8906 --75.9016 --75.9016 --75.9016 --75.9094 --75.8984 --75.9016 --75.8922 --75.8938 --75.9031 --75.9109 --75.9125 --75.9031 --75.9 --75.9062 --75.9078 --75.9172 --75.9 --75.9047 --75.9078 --75.9047 --75.9047 --75.9141 --75.9062 --75.9031 --75.9109 --75.8922 --75.8906 --75.9078 --75.9047 --75.9219 --75.9109 --75.8953 --75.8984 --75.8969 --75.8953 --75.9047 --75.9016 --75.9 --75.9016 --75.9047 --75.9078 --75.9 --75.9141 --75.9109 --75.8984 --75.9031 --75.9031 --75.9031 --75.9094 --75.8984 --75.9187 --75.9125 --75.9172 --75.9062 --75.9234 --75.9125 --75.9156 --75.9094 --75.9187 --75.9078 --75.9062 --75.9094 --75.9203 --75.9156 --75.9234 --75.9047 --75.9031 --75.9219 --75.9016 --75.9172 --75.9156 --75.9203 --75.9187 --75.9078 --75.9094 --75.9141 --75.9031 --75.9172 --75.9094 --75.9141 --75.9203 --75.9125 --75.9125 --75.9156 --75.9109 --75.9156 --75.9109 --75.9031 --75.9031 --75.9203 --75.9125 --75.9141 --75.8953 --75.8953 --75.9078 --75.8938 --75.8953 --75.9047 --75.9125 --75.9047 --75.8938 --75.8953 --75.9016 --75.9 --75.8922 --75.9062 --75.9047 --75.8938 --75.8969 --75.9125 --75.9062 --75.9141 --75.9094 --75.9156 --75.9016 --75.9156 --75.9203 --75.9062 --75.9078 --75.9094 --75.9016 --75.9125 --75.9031 --75.8953 --75.9 --75.9078 --75.8969 --75.8984 --75.8938 --75.8969 --75.8969 --75.8922 --75.9016 --75.8969 --75.9141 --75.8875 --75.9156 --75.9156 --75.8984 --75.9016 --75.9062 --75.9016 --75.8984 --75.9 --75.9094 --75.8969 --75.9062 --75.9 --75.8891 --75.9156 --75.8953 --75.9016 --75.9141 --75.9062 --75.9062 --75.9031 --75.9109 --75.9125 --75.9109 --75.9 --75.9031 --75.9078 --75.8984 --75.9125 --75.9031 --75.9203 --75.9094 --75.9047 --75.9016 --75.8844 --75.9109 --75.8844 --75.9125 --75.9109 --75.8938 --75.8984 --75.8938 --75.9031 --75.9203 --75.9 --75.9078 --75.9047 --75.9078 --75.8953 --75.9219 --75.9 --75.9156 --75.9047 --75.9 --75.8953 --75.8984 --75.8984 --75.9078 --75.9094 --75.9 --75.8984 --75.8922 --75.8859 --75.8969 --75.8938 --75.9 --75.9203 --75.9078 --75.9 --75.9047 --75.9094 --75.9125 --75.9062 --75.9125 --75.9219 --75.9047 --75.9109 --75.9203 --75.9141 --75.9203 --75.9125 --75.9141 --75.9234 --75.9125 --75.9031 --75.9016 --75.8922 --75.9125 --75.9141 --75.9047 --75.8922 --75.9203 --75.9109 --75.9141 --75.9094 --75.8953 --75.9109 --75.8984 --75.9281 --75.9109 --75.9016 --75.9078 --75.9016 --75.8891 --75.9219 --75.9109 --75.8969 --75.9062 --75.9141 --75.9094 --75.9125 --75.9156 --75.9016 --75.9219 --75.9109 --75.9156 --75.9203 --75.9016 --75.9016 --75.9094 --75.9156 --75.9047 --75.8969 --75.9031 --75.9187 --75.9156 --75.9141 --75.9156 --75.9078 --75.9047 --75.9187 --75.9125 --75.9156 --75.9062 --75.9141 --75.9172 --75.9203 --75.9078 --75.9203 --75.9125 --75.9125 --75.9172 --75.9078 --75.9125 --75.9031 --75.9078 --75.9156 --75.8984 --75.9203 --75.9094 --75.9172 --75.9141 --75.9219 --75.9109 --75.9172 --75.9141 --75.9109 --75.9203 --75.9125 --75.9172 --75.9172 --75.9125 --75.9156 --75.9094 --75.9156 --75.9172 --75.9141 --75.9187 --75.9125 --75.9109 --75.9172 --75.9219 --75.9234 --75.9187 --75.9187 --75.9234 --75.9219 --75.9266 --75.9141 --75.9187 --75.9187 --75.9109 --75.9266 --75.9297 --75.9187 --75.9187 --75.9125 --75.9234 --75.9234 --75.9219 --75.9141 --75.9125 --75.9 --75.9297 --75.9078 --75.9187 --75.9234 --75.9125 --75.9187 --75.9203 --75.9141 --75.9172 --75.9141 --75.9109 --75.8938 --75.9109 --75.9109 --75.9125 --75.8984 --75.9016 --75.9172 --75.9141 --75.9094 --75.9125 --75.9078 --75.9203 --75.9062 --75.9109 --75.9078 --75.9125 --75.9016 --75.9156 --75.9187 --75.9156 --75.9016 --75.9125 --75.9047 --75.9047 --75.9047 --75.9156 --75.9078 --75.9078 --75.9266 --75.9031 --75.9016 --75.9062 --75.9156 --75.9156 --75.9031 --75.9156 --75.9 --75.9062 --75.9016 --75.9156 --75.9094 --75.9031 --75.9156 --75.9187 --75.9109 --75.9094 --75.9109 --75.9109 --75.9109 --75.9328 --75.9031 --75.9187 --75.9047 --75.9047 --75.9047 --75.8891 --75.9 --75.9078 --75.9125 --75.8891 --75.8922 --75.9016 --75.9 --75.8922 --75.8953 --75.8969 --75.9125 --75.9 --75.9094 --75.9094 --75.9062 --75.9078 --75.9187 --75.9047 --75.9094 --75.9109 --75.9125 --75.9141 --75.9016 --75.9047 --75.9109 --75.9031 --75.8984 --75.9203 --75.9031 --75.9203 --75.9141 --75.9031 --75.9062 --75.9297 --75.9094 --75.9297 --75.9016 --75.9078 --75.9062 --75.9156 --75.9062 --75.9156 --75.9141 --75.9141 --75.9078 --75.8984 --75.9047 --75.8953 --75.8984 --75.9 --75.9141 --75.9125 --75.8922 --75.9109 --75.8969 --75.9125 --75.8922 --75.9 --75.9125 --75.9047 --75.9031 --75.9031 --75.9047 --75.9141 --75.9078 --75.9094 --75.9047 --75.9109 --75.9125 --75.9062 --75.9047 --75.9094 --75.9094 --75.9047 --75.8953 --75.9094 --75.9094 --75.9078 --75.9281 --75.9016 --75.9141 --75.9187 --75.9094 --75.9078 --75.9062 --75.8969 --75.9062 --75.9078 --75.9219 --75.9109 --75.9047 --75.9187 --75.9156 --75.8938 --75.9109 --75.9062 --75.9078 --75.9078 --75.8969 --75.8984 --75.9031 --75.9 --75.8969 --75.9047 --75.9094 --75.8906 --75.9016 --75.9078 --75.8984 --75.8953 --75.9 --75.9156 --75.9078 --75.8969 --75.9031 --75.9156 --75.9094 --75.9062 --75.8938 --75.9156 --75.8984 --75.8984 --75.9047 --75.8891 --75.9 --75.8938 --75.8906 --75.9031 --75.8922 --75.9 --75.8922 --75.9078 --75.8969 --75.9109 --75.8875 --75.8922 --75.8984 --75.9047 --75.9047 --75.8922 --75.8969 --75.9094 --75.9156 --75.8938 --75.9078 --75.8953 --75.8891 --75.8906 --75.8797 --75.8906 --75.8844 --75.8859 --75.9031 --75.8859 --75.8906 --75.8906 --75.9078 --75.8969 --75.8984 --75.8906 --75.8953 --75.8781 --75.8984 --75.8906 --75.8969 --75.8969 --75.8875 --75.9047 --75.9156 --75.9016 --75.8953 --75.8953 --75.9078 --75.9062 --75.8969 --75.8969 --75.9016 --75.8953 --75.8984 --75.9 --75.8906 --75.8938 --75.8953 --75.8969 --75.8984 --75.8984 --75.8906 --75.9078 --75.9031 --75.8938 --75.8906 --75.8922 --75.8938 --75.8922 --75.8984 --75.8953 --75.8969 --75.8922 --75.8891 --75.8844 --75.9 --75.8891 --75.8938 --75.8891 --75.8938 --75.9016 --75.9016 --75.8969 --75.9016 --75.8906 --75.8938 --75.8891 --75.9016 --75.9031 --75.9016 --75.8922 --75.8875 --75.9016 --75.8984 --75.8938 --75.8891 --75.9125 --75.8953 --75.8969 --75.8906 --75.8859 --75.8891 --75.8891 --75.8875 --75.8891 --75.8906 --75.8797 --75.8969 --75.8938 --75.8953 --75.8922 --75.8875 --75.8797 --75.8938 --75.9 --75.875 --75.8984 --75.8812 --75.8875 --75.8938 --75.8906 --75.8984 --75.8922 --75.9109 --75.8922 --75.8859 --75.8922 --75.9 --75.9031 --75.8984 --75.9031 --75.8953 --75.9047 --75.9 --75.8969 --75.9016 --75.8938 --75.9016 --75.8906 --75.9125 --75.8938 --75.9078 --75.8953 --75.9031 --75.8969 --75.8984 --75.8953 --75.9 --75.8969 --75.9094 --75.8859 --75.8891 --75.8922 --75.8938 --75.8984 --75.8969 --75.9 --75.8906 --75.9109 --75.8969 --75.9094 --75.8859 --75.8906 --75.8828 --75.9031 --75.8969 --75.8953 --75.9016 --75.9078 --75.9016 --75.9031 --75.8891 --75.9 --75.9125 --75.9078 --75.9016 --75.9 --75.9094 --75.9203 --75.8953 --75.8984 --75.8969 --75.9109 --75.9109 --75.8969 --75.8953 --75.9062 --75.8984 --75.8969 --75.9016 --75.8859 --75.9047 --75.8969 --75.8906 --75.8859 --75.8938 --75.8891 --75.8969 --75.8812 --75.8953 --75.9016 --75.9047 --75.9016 --75.9062 --75.9 --75.8984 --75.8984 --75.9016 --75.8734 --75.8984 --75.8953 --75.9078 --75.8828 --75.8953 --75.9016 --75.8906 --75.9047 --75.8891 --75.9016 --75.9016 --75.8828 --75.9031 --75.9031 --75.9 --75.8828 --75.8969 --75.9 --75.8938 --75.9031 --75.8984 --75.8922 --75.8828 --75.9062 --75.9047 --75.8922 --75.9047 --75.9016 --75.8984 --75.9172 --75.9016 --75.8953 --75.8969 --75.8938 --75.9 --75.8922 --75.8906 --75.8922 --75.8812 --75.8938 --75.8984 --75.8984 --75.8984 --75.8859 --75.8984 --75.8812 --75.9109 --75.9156 --75.9094 --75.8891 --75.9172 --75.9187 --75.9187 --75.9156 --75.9094 --75.8922 --75.9172 --75.9 --75.9156 --75.9172 --75.9062 --75.9078 --75.9031 --75.9203 --75.9062 --75.9078 --75.9094 --75.9031 --75.9156 --75.9016 --75.9031 --75.8969 --75.9031 --75.9 --75.8984 --75.8953 --75.9094 --75.9078 --75.9172 --75.9203 --75.9109 --75.9109 --75.9078 --75.9047 --75.9156 --75.9297 --75.9109 --75.9062 --75.9187 --75.9078 --75.9016 --75.9047 --75.9109 --75.9047 --75.9141 --75.9266 --75.8922 --75.9125 --75.9187 --75.9047 --75.9219 --75.9031 --75.9078 --75.9141 --75.9078 --75.9141 --75.9047 --75.9203 --75.9109 --75.9031 --75.8984 --75.9031 --75.9078 --75.9109 --75.9047 --75.9 --75.9109 --75.9109 --75.9156 --75.925 --75.9078 --75.9094 --75.9016 --75.8891 --75.9109 --75.9156 --75.9109 --75.9203 --75.9031 --75.9078 --75.9031 --75.8969 --75.9141 --75.9031 --75.9156 --75.9125 --75.9187 --75.9047 --75.8984 --75.9078 --75.9062 --75.9031 --75.925 --75.9125 --75.9094 --75.9062 --75.9109 --75.9094 --75.9109 --75.8984 --75.9031 --75.8953 --75.9109 --75.9141 --75.8938 --75.9016 --75.9094 --75.9078 --75.9109 --75.925 --75.9281 --75.8922 --75.9156 --75.9062 --75.9047 --75.9141 --75.9109 --75.9094 --75.8922 --75.9016 --75.9031 --75.9062 --75.9062 --75.9156 --75.9094 --75.9141 --75.9219 --75.9172 --75.9094 --75.9031 --75.9062 --75.9094 --75.9 --75.9062 --75.9125 --75.9109 --75.8938 --75.9109 --75.9047 --75.9078 --75.9141 --75.9 --75.9094 --75.9094 --75.9 --75.9141 --75.8969 --75.9094 --75.9 --75.9 --75.9203 --75.9016 --75.8953 --75.9016 --75.9141 --75.8969 --75.9031 --75.9047 --75.9219 --75.9078 --75.9125 --75.925 --75.9078 --75.9219 --75.9094 --75.9094 --75.925 --75.9109 --75.9187 --75.925 --75.9172 --75.9219 --75.9094 --75.9094 --75.9156 --75.9109 --75.9156 --75.9219 --75.9078 --75.9109 --75.9078 --75.8953 --75.9094 --75.9187 --75.9 --75.9047 --75.9125 --75.9141 --75.9187 --75.9141 --75.9109 --75.9062 --75.9094 --75.9234 --75.9125 --75.9187 --75.9078 --75.9094 --75.9078 --75.9141 --75.9156 --75.9187 --75.9141 --75.9234 --75.9062 --75.9141 --75.9156 --75.9203 --75.9172 --75.9187 --75.925 --75.9266 --75.9266 --75.9141 --75.9187 --75.9281 --75.9313 --75.9078 --75.9203 --75.9187 --75.9406 --75.9125 --75.9141 --75.9187 --75.9219 --75.9062 --75.9266 --75.9266 --75.9172 --75.9062 --75.9187 --75.9203 --75.9328 --75.9172 --75.9375 --75.9219 --75.9141 --75.9203 --75.9125 --75.9141 --75.9203 --75.9328 --75.9172 --75.9281 --75.9187 --75.9187 --75.9328 --75.9156 --75.9219 --75.9109 --75.9219 --75.9141 --75.9187 --75.9172 --75.9172 --75.9172 --75.9156 --75.9125 --75.9203 --75.9062 --75.9109 --75.9031 --75.9047 --75.9172 --75.9078 --75.9172 --75.9031 --75.9234 --75.9313 --75.9156 --75.9031 --75.9125 --75.9219 --75.9078 --75.9313 --75.9203 --75.9187 --75.9172 --75.9203 --75.925 --75.9094 --75.8984 --75.9156 --75.9219 --75.925 --75.9125 --75.9187 --75.9141 --75.9109 --75.9141 --75.9219 --75.9125 --75.9125 --75.9219 --75.9125 --75.925 --75.9281 --75.9328 --75.9094 --75.9266 --75.9234 --75.925 --75.9313 --75.9234 --75.9156 --75.9266 --75.9219 --75.9266 --75.9328 --75.9219 --75.9328 --75.9156 --75.9297 --75.9172 --75.9109 --75.9094 --75.9031 --75.9328 --75.9281 --75.925 --75.9062 --75.925 --75.9172 --75.9016 --75.9125 --75.9094 --75.9234 --75.9203 --75.9203 --75.9078 --75.925 --75.9281 --75.9266 --75.9344 --75.9156 --75.9344 --75.9359 --75.9219 --75.9156 --75.9203 --75.9109 --75.9203 --75.9297 --75.9203 --75.9187 --75.9281 --75.9375 --75.9203 --75.9328 --75.9266 --75.9375 --75.9172 --75.9344 --75.9187 --75.9266 --75.9266 --75.9406 --75.9313 --75.9313 --75.9172 --75.9281 --75.9156 --75.925 --75.9297 --75.9297 --75.9266 --75.9344 --75.9344 --75.9344 --75.9266 --75.9266 --75.9359 --75.9375 --75.9234 --75.9234 --75.9219 --75.9328 --75.9344 --75.9219 --75.9328 --75.9141 --75.9391 --75.9203 --75.9266 --75.9375 --75.9156 --75.9266 --75.9156 --75.9297 --75.925 --75.9141 --75.9219 --75.9359 --75.9266 --75.9203 --75.9125 --75.9266 --75.9375 --75.9234 --75.9203 --75.925 --75.925 --75.9266 --75.9266 --75.9297 --75.925 --75.9187 --75.9156 --75.9234 --75.9328 --75.9172 --75.925 --75.9062 --75.9297 --75.9328 --75.925 --75.9187 --75.9344 --75.9266 --75.9328 --75.9125 --75.9172 --75.9234 --75.9187 --75.925 --75.9266 --75.9297 --75.9141 --75.9172 --75.9344 --75.9219 --75.9328 --75.9219 --75.9125 --75.925 --75.9313 --75.9391 --75.9219 --75.9359 --75.9344 --75.9313 --75.9375 --75.9234 --75.9375 --75.9359 --75.9234 --75.9297 --75.9203 --75.9266 --75.9281 --75.9234 --75.9281 --75.9328 --75.9266 --75.9406 --75.9203 --75.9281 --75.9391 --75.9281 --75.9062 --75.925 --75.9109 --75.9156 --75.9094 --75.9313 --75.9187 --75.9328 --75.9375 --75.9234 --75.9141 --75.9141 --75.9234 --75.9313 --75.9281 --75.9297 --75.9375 --75.9313 --75.9297 --75.9297 --75.9141 --75.9344 --75.9313 --75.9422 --75.9344 --75.9328 --75.9313 --75.9359 --75.9187 --75.9172 --75.9266 --75.9156 --75.9234 --75.9313 --75.9281 --75.9281 --75.925 --75.9125 --75.9172 --75.9156 --75.925 --75.9141 --75.9203 --75.9187 --75.9203 --75.925 --75.9391 --75.9172 --75.9328 --75.9172 --75.9187 --75.925 --75.9266 --75.9203 --75.9313 --75.9281 --75.9281 --75.9344 --75.9281 --75.9172 --75.9266 --75.9234 --75.9234 --75.9203 --75.9172 --75.9297 --75.9281 --75.9203 --75.9328 --75.9344 --75.9187 --75.9359 --75.9234 --75.9156 --75.9266 --75.9156 --75.9313 --75.9344 --75.9203 --75.9266 --75.9172 --75.9313 --75.925 --75.925 --75.9266 --75.9281 --75.9203 --75.9141 --75.9281 --75.9219 --75.9172 --75.9203 --75.9172 --75.9219 --75.9141 --75.9219 --75.9172 --75.9187 --75.9344 --75.9156 --75.9187 --75.9234 --75.9281 --75.9234 --75.9344 --75.9344 --75.9344 --75.9297 --75.9203 --75.9422 --75.9313 --75.9234 --75.9344 --75.9313 --75.9313 --75.9484 --75.925 --75.9266 --75.9109 --75.9281 --75.9313 --75.9344 --75.925 --75.9375 --75.9281 --75.9328 --75.9234 --75.9219 --75.9375 --75.925 --75.9281 --75.9234 --75.9203 --75.9234 --75.9219 --75.9234 --75.9266 --75.9297 --75.9187 --75.9203 --75.9234 --75.9281 --75.9156 --75.9313 --75.9281 --75.9125 --75.9187 --75.925 --75.9297 --75.9219 --75.9359 --75.9297 --75.9187 --75.9187 --75.9266 --75.9313 --75.9219 --75.9359 --75.9266 --75.9297 --75.9172 --75.9375 --75.9328 --75.925 --75.925 --75.9156 --75.9219 --75.9281 --75.9156 --75.925 --75.9203 --75.9141 --75.9234 --75.9125 --75.925 --75.9266 --75.925 --75.925 --75.9219 --75.9266 --75.9266 --75.9156 --75.9281 --75.9297 --75.9391 --75.9313 --75.9062 --75.9266 --75.9109 --75.9125 --75.9141 --75.9281 --75.9219 --75.925 --75.9281 --75.9406 --75.9266 --75.9141 --75.9219 --75.9297 --75.9313 --75.9172 --75.9187 --75.9422 --75.9313 --75.9313 --75.9297 --75.9313 --75.9266 --75.9328 --75.9313 --75.9297 --75.9281 --75.9453 --75.9344 --75.9234 --75.9234 --75.9266 --75.9281 --75.9266 --75.9422 --75.9313 --75.9281 --75.9344 --75.9297 --75.9281 --75.9328 --75.9484 --75.9203 --75.9281 --75.9375 --75.9375 --75.9375 --75.9328 --75.9219 --75.9313 --75.9266 --75.9391 --75.9313 --75.9313 --75.9313 --75.9406 --75.9297 --75.9297 --75.9328 --75.9313 --75.9406 --75.9359 --75.9313 --75.9391 --75.9375 --75.9297 --75.9234 --75.9297 --75.9266 --75.925 --75.9281 --75.9266 --75.9391 --75.9297 --75.9313 --75.925 --75.925 --75.9266 --75.9313 --75.9234 --75.925 --75.9156 --75.9219 --75.9313 --75.9078 --75.9187 --75.9313 --75.9281 --75.9187 --75.9359 --75.9109 --75.9094 --75.9203 --75.9344 --75.9141 --75.9125 --75.9062 --75.925 --75.9203 --75.9156 --75.9172 --75.9203 --75.9156 --75.9109 --75.9219 --75.9187 --75.925 --75.9344 --75.925 --75.9125 --75.9313 --75.9344 --75.9219 --75.9359 --75.9266 --75.9187 --75.9156 --75.9297 --75.9187 --75.9297 --75.9156 --75.9375 --75.9344 --75.925 --75.9344 --75.9344 --75.9234 --75.9281 --75.9187 --75.925 --75.9406 --75.9328 --75.9141 --75.9328 --75.9266 --75.9203 --75.9281 --75.9328 --75.925 --75.9422 --75.925 --75.9437 --75.9281 --75.9344 --75.9297 --75.925 --75.9266 --75.9344 --75.9313 --75.9156 --75.9172 --75.9422 --75.9281 --75.9281 --75.9344 --75.9453 --75.9344 --75.9453 --75.9203 --75.9375 --75.9328 --75.9375 --75.9281 --75.9281 --75.9187 --75.9281 --75.9437 --75.9234 --75.9281 --75.9344 --75.9313 --75.9281 --75.9234 --75.9281 --75.925 --75.9281 --75.9187 --75.9453 --75.9187 --75.9156 --75.9187 --75.9187 --75.9187 --75.9266 --75.9078 --75.9141 --75.9234 --75.9313 --75.9266 --75.9359 --75.9219 --75.9172 --75.9203 --75.9172 --75.9172 --75.9156 --75.9172 --75.9219 --75.9031 --75.9203 --75.9156 --75.9266 --75.9187 --75.9141 --75.9094 --75.925 --75.9266 --75.9234 --75.9187 --75.925 --75.9125 --75.9187 --75.9281 --75.9125 --75.9266 --75.9109 --75.9203 --75.9203 --75.9219 --75.9359 --75.9344 --75.9234 --75.9156 --75.9266 --75.9078 --75.9172 --75.9313 --75.9203 --75.9203 --75.9313 --75.9125 --75.9047 --75.9172 --75.9156 --75.9141 --75.9141 --75.9078 --75.9109 --75.9094 --75.9187 --75.9125 --75.9141 --75.9062 --75.9172 --75.9156 --75.9187 --75.9141 --75.9141 --75.9141 --75.9266 --75.9141 --75.9281 --75.925 --75.9109 --75.9234 --75.925 --75.9156 --75.9141 --75.9234 --75.925 --75.9359 --75.9203 --75.9031 --75.9219 --75.9234 --75.9266 --75.9062 --75.9234 --75.9078 --75.9062 --75.9031 --75.8953 --75.8938 --75.9203 --75.9109 --75.8984 --75.9156 --75.9141 --75.8953 --75.9125 --75.9297 --75.9078 --75.9031 --75.9078 --75.9156 --75.9031 --75.9078 --75.9078 --75.9078 --75.9109 --75.9187 --75.9141 --75.9187 --75.9234 --75.9156 --75.9203 --75.9125 --75.9109 --75.9 --75.9125 --75.9094 --75.9125 --75.9156 --75.9219 --75.9094 --75.9313 --75.9109 --75.9406 --75.9187 --75.925 --75.9297 --75.9234 --75.9156 --75.9078 --75.9078 --75.9141 --75.9156 --75.9094 --75.9156 --75.9062 --75.9203 --75.9187 --75.9109 --75.9109 --75.9031 --75.9125 --75.9187 --75.9234 --75.9141 --75.9016 --75.9266 --75.9234 --75.9172 --75.9141 --75.9141 --75.9219 --75.9062 --75.9156 --75.9156 --75.9094 --75.9141 --75.9141 --75.925 --75.9094 --75.9219 --75.9219 --75.9234 --75.9141 --75.9078 --75.9219 --75.9156 --75.9172 --75.9187 --75.9156 --75.925 --75.9141 --75.9266 --75.9219 --75.925 --75.9281 --75.925 --75.9313 --75.9391 --75.9328 --75.9313 --75.9234 --75.925 --75.9281 --75.9281 --75.9344 --75.9297 --75.9219 --75.9391 --75.9203 --75.9187 --75.9344 --75.9141 --75.9313 --75.9297 --75.9297 --75.9328 --75.9234 --75.9219 --75.9266 --75.9078 --75.925 --75.9234 --75.9187 --75.9266 --75.925 --75.9359 --75.9281 --75.9203 --75.9187 --75.9203 --75.9156 --75.9203 --75.9109 --75.9062 --75.9266 --75.9125 --75.9172 --75.9266 --75.9 --75.9172 --75.9297 --75.9094 --75.9031 --75.9109 --75.9172 --75.9141 --75.9125 --75.9109 --75.9 --75.9109 --75.9031 --75.9109 --75.9047 --75.9094 --75.9078 --75.9219 --75.9172 --75.9062 --75.9266 --75.9156 --75.9203 --75.9156 --75.9141 --75.9281 --75.9234 --75.9187 --75.9203 --75.9219 --75.9016 --75.9141 --75.925 --75.9094 --75.9344 --75.9156 --75.9172 --75.9187 --75.9203 --75.9078 --75.9187 --75.9266 --75.9203 --75.9094 --75.9266 --75.9344 --75.9172 --75.9156 --75.9219 --75.9266 --75.9219 --75.925 --75.9234 --75.9141 --75.9219 --75.9281 --75.9297 --75.9297 --75.9359 --75.9297 --75.9313 --75.9297 --75.9266 --75.9344 --75.9219 --75.925 --75.9281 --75.9141 --75.9375 --75.9344 --75.9187 --75.9156 --75.9187 --75.925 --75.9203 --75.9219 --75.9172 --75.9172 --75.9281 --75.9266 --75.9172 --75.9266 --75.9141 --75.9281 --75.9234 --75.9344 --75.9172 --75.9297 --75.9172 --75.9297 --75.9172 --75.9234 --75.9234 --75.9203 --75.9266 --75.9125 --75.9125 --75.9281 --75.9156 --75.9172 --75.9156 --75.9266 --75.9125 --75.9266 --75.9266 --75.9125 --75.925 --75.9281 --75.9266 --75.9203 --75.9203 --75.9125 --75.925 --75.9016 --75.9172 --75.9266 --75.925 --75.9297 --75.9344 --75.9219 --75.925 --75.9109 --75.9078 --75.9313 --75.9172 --75.9125 --75.9078 --75.9156 --75.9203 --75.9062 --75.9172 --75.9172 --75.9141 --75.9156 --75.9109 --75.9125 --75.9047 --75.9125 --75.9031 --75.8969 --75.9078 --75.9016 --75.9094 --75.9094 --75.9062 --75.9062 --75.9141 --75.9094 --75.9062 --75.9156 --75.9031 --75.9172 --75.9094 --75.9031 --75.8969 --75.9078 --75.9141 --75.9125 --75.9031 --75.9031 --75.8969 --75.8922 --75.9141 --75.8953 --75.9062 --75.9234 --75.9172 --75.9187 --75.9094 --75.8922 --75.9156 --75.9 --75.9094 --75.9156 --75.9078 --75.9203 --75.9125 --75.9109 --75.9141 --75.9109 --75.9094 --75.9 --75.9125 --75.9187 --75.9172 --75.9172 --75.9281 --75.9078 --75.9062 --75.9125 --75.9094 --75.9094 --75.9203 --75.9156 --75.9203 --75.9219 --75.9172 --75.9297 --75.9297 --75.9187 --75.9219 --75.9078 --75.9 --75.9125 --75.9187 --75.9234 --75.9281 --75.9219 --75.9156 --75.9266 --75.9203 --75.8953 --75.925 --75.9094 --75.9234 --75.9187 --75.9219 --75.9156 --75.9109 --75.9125 --75.9156 --75.9078 --75.9219 --75.9203 --75.9094 --75.9125 --75.9156 --75.9109 --75.9234 --75.9281 --75.9281 --75.925 --75.9156 --75.9328 --75.9219 --75.9281 --75.9156 --75.9203 --75.9281 --75.9234 --75.9156 --75.9187 --75.9031 --75.9172 --75.9109 --75.9125 --75.9297 --75.9172 --75.9156 --75.9203 --75.9156 --75.9187 --75.9219 --75.9234 --75.9141 --75.9375 --75.9156 --75.9125 --75.9172 --75.9203 --75.9297 --75.925 --75.9297 --75.9281 --75.9172 --75.9078 --75.9125 --75.9156 --75.9094 --75.9109 --75.9203 --75.9109 --75.9031 --75.9234 --75.9078 --75.9125 --75.9125 --75.9156 --75.9172 --75.9109 --75.9141 --75.9203 --75.9297 --75.9172 --75.9219 --75.9187 --75.925 --75.9234 --75.9141 --75.9234 --75.9062 --75.9172 --75.9125 --75.9219 --75.9281 --75.9094 --75.9219 --75.9031 --75.9219 --75.9266 --75.9172 --75.9062 --75.9125 --75.9078 --75.9328 --75.9344 --75.9109 --75.9187 --75.925 --75.925 --75.9266 --75.9297 --75.9281 --75.9266 --75.9187 --75.9172 --75.9187 --75.9125 --75.9219 --75.9281 --75.9281 --75.9219 --75.9375 --75.9297 --75.9313 --75.9203 --75.9234 --75.9203 --75.9266 --75.9313 --75.9297 --75.9344 --75.9281 --75.9078 --75.9391 --75.9219 --75.9203 --75.9219 --75.9187 --75.9219 --75.9219 --75.9297 --75.9313 --75.9281 --75.9141 --75.9266 --75.9313 --75.9297 --75.9344 --75.9406 --75.9313 --75.925 --75.9344 --75.9406 --75.9406 --75.9203 --75.9219 --75.9187 --75.9172 --75.9281 --75.9156 --75.9016 --75.9094 --75.9125 --75.9125 --75.9094 --75.9 --75.9125 --75.9047 --75.9094 --75.9094 --75.9 --75.9156 --75.9203 --75.9062 --75.9016 --75.9109 --75.9156 --75.8969 --75.9078 --75.9016 --75.8953 --75.9156 --75.9109 --75.9031 --75.9047 --75.9094 --75.9172 --75.9094 --75.9 --75.9031 --75.8984 --75.9094 --75.9109 --75.9094 --75.9156 --75.9141 --75.9156 --75.925 --75.9094 --75.9109 --75.9125 --75.9141 --75.9094 --75.9234 --75.9281 --75.9203 --75.9187 --75.9172 --75.9094 --75.9219 --75.9141 --75.9203 --75.9109 --75.9141 --75.9078 --75.9187 --75.9062 --75.9078 --75.9062 --75.9156 --75.9016 --75.9094 --75.9125 --75.8906 --75.9047 --75.9109 --75.925 --75.9109 --75.9187 --75.9 --75.9156 --75.9047 --75.9234 --75.9172 --75.9172 --75.9203 --75.9219 --75.9187 --75.9187 --75.9156 --75.9094 --75.9141 --75.9344 --75.9156 --75.9125 --75.9156 --75.9203 --75.9125 --75.9109 --75.9141 --75.9109 --75.9078 --75.9141 --75.9125 --75.9156 --75.9062 --75.925 --75.9203 --75.9234 --75.9109 --75.9172 --75.9141 --75.9156 --75.9156 --75.9094 --75.9031 --75.9172 --75.9078 --75.9172 --75.9125 --75.9281 --75.9219 --75.9234 --75.9187 --75.9187 --75.9125 --75.9203 --75.9313 --75.9156 --75.9219 --75.925 --75.9141 --75.9156 --75.9219 --75.9047 --75.9 --75.9094 --75.9062 --75.9125 --75.9078 --75.9 --75.9031 --75.9109 --75.9125 --75.9047 --75.9187 --75.9125 --75.9094 --75.9187 --75.9172 --75.9 --75.9141 --75.9234 --75.9125 --75.9344 --75.9266 --75.9219 --75.925 --75.9266 --75.9141 --75.9094 --75.9266 --75.9031 --75.925 --75.9094 --75.9094 --75.9313 --75.9172 --75.9266 --75.9344 --75.9344 --75.925 --75.9297 --75.9266 --75.9172 --75.9187 --75.9187 --75.9187 --75.9281 --75.9359 --75.9062 --75.925 --75.9172 --75.9266 --75.9266 --75.9125 --75.9125 --75.9203 --75.9141 --75.9156 --75.9125 --75.9047 --75.9234 --75.9219 --75.9313 --75.925 --75.9172 --75.9219 --75.9219 --75.9281 --75.9141 --75.9156 --75.9297 --75.9297 --75.925 --75.9281 --75.9219 --75.9328 --75.9266 --75.9359 --75.9344 --75.925 --75.9109 --75.9234 --75.9125 --75.9187 --75.9266 --75.9266 --75.9172 --75.925 --75.9359 --75.9219 --75.9297 --75.9281 --75.9281 --75.9172 --75.9125 --75.9297 --75.9313 --75.9203 --75.9266 --75.9328 --75.9266 --75.9172 --75.9297 --75.9359 --75.9375 --75.9187 --75.9281 --75.9281 --75.9219 --75.9344 --75.925 --75.925 --75.9234 --75.8984 --75.925 --75.9172 --75.925 --75.9344 --75.9219 --75.9187 --75.9281 --75.9187 --75.9172 --75.9156 --75.9172 --75.9156 --75.9359 --75.9172 --75.9359 --75.9406 --75.9297 --75.9203 --75.9375 --75.9187 --75.9219 --75.9219 --75.9203 --75.9141 --75.9109 --75.9062 --75.9219 --75.9016 --75.9172 --75.9141 --75.9125 --75.9313 --75.9141 --75.9094 --75.9156 --75.9078 --75.9109 --75.9172 --75.9125 --75.9109 --75.9156 --75.9187 --75.9156 --75.9141 --75.9281 --75.9172 --75.9328 --75.925 --75.9141 --75.9234 --75.9156 --75.9219 --75.9141 --75.9125 --75.9078 --75.9297 --75.925 --75.9047 --75.9062 --75.9203 --75.9219 --75.9109 --75.9266 --75.9094 --75.9172 --75.9297 --75.9172 --75.9125 --75.9266 --75.9047 --75.8953 --75.9313 --75.9203 --75.9187 --75.9047 --75.9141 --75.9328 --75.9125 --75.9047 --75.9141 --75.9281 --75.9187 --75.9156 --75.9047 --75.9187 --75.9281 --75.9156 --75.9187 --75.9219 --75.8953 --75.9094 --75.9203 --75.9125 --75.9 --75.9203 --75.9281 --75.9109 --75.9219 --75.925 --75.925 --75.925 --75.9281 --75.9109 --75.9297 --75.9031 --75.9109 --75.9344 --75.9203 --75.9297 --75.9203 --75.9219 --75.9281 --75.9313 --75.9203 --75.9234 --75.9297 --75.9187 --75.9203 --75.925 --75.9266 --75.9281 --75.9187 --75.9297 --75.925 --75.9203 --75.9172 --75.9156 --75.925 --75.925 --75.9187 --75.9219 --75.9203 --75.9266 --75.925 --75.9266 --75.9203 --75.9203 --75.9172 --75.9203 --75.9156 --75.9109 --75.9078 --75.9313 --75.9203 --75.9234 --75.9109 --75.9203 --75.9234 --75.9266 --75.9203 --75.9234 --75.9219 --75.9328 --75.925 --75.9266 --75.9141 --75.9187 --75.9344 --75.9266 --75.9313 --75.9344 --75.9281 --75.9297 --75.9234 --75.9359 --75.9281 --75.9281 --75.9156 --75.9094 --75.9172 --75.9219 --75.9281 --75.9187 --75.9203 --75.9391 --75.9281 --75.9156 --75.9125 --75.9375 --75.9125 --75.9266 --75.9344 --75.9344 --75.9328 --75.9297 --75.9375 --75.9281 --75.925 --75.9453 --75.9406 --75.9328 --75.9406 --75.9172 --75.925 --75.9344 --75.9344 --75.9359 --75.9125 --75.9219 --75.9125 --75.9219 --75.9141 --75.9344 --75.9156 --75.9234 --75.9203 --75.9187 --75.9187 --75.9156 --75.9266 --75.9172 --75.9156 --75.9141 --75.9234 --75.9266 --75.9297 --75.925 --75.9234 --75.9281 --75.9172 --75.9156 --75.9109 --75.9 --75.9297 --75.9125 --75.9078 --75.9313 --75.9172 --75.9187 --75.9172 --75.9422 --75.9297 --75.9203 --75.9266 --75.9281 --75.9375 --75.9313 --75.9297 --75.9313 --75.9234 --75.9187 --75.9297 --75.9359 --75.9344 --75.925 --75.9297 --75.9297 --75.9281 --75.925 --75.9313 --75.925 --75.9172 --75.9219 --75.9125 --75.9141 --75.9234 --75.9297 --75.9266 --75.925 --75.9172 --75.9156 --75.9109 --75.9281 --75.925 --75.9172 --75.9 --75.9187 --75.9234 --75.9219 --75.9281 --75.9109 --75.9109 --75.9141 --75.9203 --75.9109 --75.925 --75.9328 --75.9187 --75.9375 --75.9141 --75.9328 --75.9094 --75.9344 --75.9266 --75.9281 --75.9203 --75.9313 --75.9359 --75.9281 --75.925 --75.9422 --75.9328 --75.9328 --75.9359 --75.9344 --75.9156 --75.9203 --75.925 --75.9219 --75.9094 --75.9266 --75.9187 --75.9234 --75.925 --75.9125 --75.9187 --75.9094 --75.9172 --75.9281 --75.9156 --75.9297 --75.9172 --75.9172 --75.9125 --75.9328 --75.925 --75.9172 --75.925 --75.9203 --75.9125 --75.9203 --75.9031 --75.9281 --75.9141 --75.9094 --75.9219 --75.9234 --75.9141 --75.9187 --75.9187 --75.9234 --75.9141 --75.9187 --75.9172 --75.9313 --75.9203 --75.9109 --75.9328 --75.9313 --75.925 --75.9328 --75.9172 --75.9125 --75.9266 --75.9313 --75.9187 --75.9156 --75.9234 --75.9125 --75.9156 --75.9078 --75.9141 --75.9156 --75.925 --75.9125 --75.9203 --75.9062 --75.9266 --75.925 --75.9219 --75.9359 --75.9297 --75.9297 --75.9297 --75.9172 --75.9203 --75.925 --75.925 --75.9328 --75.925 --75.9391 --75.9359 --75.9234 --75.9313 --75.9359 --75.9313 --75.9313 --75.9281 --75.9203 --75.9313 --75.9281 --75.9266 --75.9328 --75.9297 --75.9219 --75.9313 --75.9297 --75.9375 --75.9313 --75.9359 --75.9234 --75.9328 --75.9344 --75.9391 --75.9453 --75.9297 --75.9359 --75.9328 --75.9313 --75.9406 --75.9469 --75.9313 --75.9266 --75.9234 --75.95 --75.9219 --75.9359 --75.9359 --75.9344 --75.9437 --75.9406 --75.9375 --75.9297 --75.9328 --75.9297 --75.925 --75.9203 --75.9203 --75.9219 --75.9203 --75.925 --75.9141 --75.9234 --75.9219 --75.9281 --75.9281 --75.9172 --75.9328 --75.925 --75.9141 --75.9203 --75.9203 --75.9266 --75.925 --75.9313 --75.925 --75.925 --75.9234 --75.925 --75.9187 --75.9281 --75.9313 --75.9266 --75.9344 --75.9328 --75.9344 --75.9266 --75.9437 --75.9172 --75.9328 --75.9203 --75.9313 --75.9406 --75.9375 --75.9266 --75.9266 --75.9344 --75.9156 --75.9344 --75.9297 --75.9516 --75.9328 --75.9297 --75.9422 --75.9266 --75.9109 --75.925 --75.9359 --75.9391 --75.9375 --75.925 --75.925 --75.9156 --75.9266 --75.9187 --75.9187 --75.9359 --75.9344 --75.9359 --75.9203 --75.9172 --75.9391 --75.925 --75.9266 --75.9313 --75.9375 --75.925 --75.9422 --75.9313 --75.9375 --75.9328 --75.9359 --75.9281 --75.9219 --75.9406 --75.9297 --75.9344 --75.9391 --75.9281 --75.9187 --75.9437 --75.9344 --75.9406 --75.9266 --75.9344 --75.9313 --75.9313 --75.9328 --75.9328 --75.9328 --75.9344 --75.9375 --75.9406 --75.9344 --75.9281 --75.9344 --75.9313 --75.9313 --75.9156 --75.9313 --75.925 --75.9391 --75.9328 --75.9328 --75.9359 --75.9406 --75.9484 --75.9359 --75.9313 --75.9234 --75.9313 --75.9297 --75.925 --75.9172 --75.9266 --75.925 --75.9266 --75.9172 --75.9266 --75.9219 --75.9172 --75.9297 --75.9375 --75.9313 --75.9234 --75.9203 --75.9125 --75.9391 --75.9219 --75.9172 --75.9281 --75.9297 --75.9328 --75.9437 --75.9344 --75.9234 --75.9156 --75.9297 --75.9375 --75.9359 --75.9313 --75.9281 --75.9422 --75.9219 --75.925 --75.9281 --75.9344 --75.9219 --75.9422 --75.9297 --75.9172 --75.9359 --75.9187 --75.9391 --75.9266 --75.9266 --75.925 --75.9203 --75.9453 --75.9406 --75.9313 --75.9297 --75.9437 --75.9422 --75.9344 --75.9203 --75.9406 --75.9328 --75.9375 --75.9422 --75.9469 --75.9313 --75.9359 --75.9437 --75.9484 --75.9266 --75.9406 --75.9359 --75.9344 --75.9453 --75.9391 --75.9469 --75.9469 --75.9547 --75.9688 --75.9531 --75.9625 --75.9531 --75.9516 --75.9406 --75.9437 --75.9453 --75.9484 --75.9391 --75.9328 --75.9422 --75.9328 --75.9313 --75.9328 --75.9313 --75.95 --75.9375 --75.9406 --75.9297 --75.9297 --75.9406 --75.9219 --75.9391 --75.9422 --75.9313 --75.9406 --75.9531 --75.9313 --75.9391 --75.9453 --75.9391 --75.925 --75.9516 --75.9437 --75.9328 --75.9219 --75.9344 --75.9297 --75.9266 --75.9281 --75.9234 --75.9219 --75.925 --75.9313 --75.9297 --75.925 --75.9328 --75.9297 --75.9266 --75.9187 --75.9172 --75.925 --75.9234 --75.9187 --75.9328 --75.9344 --75.9187 --75.9344 --75.9187 --75.9375 --75.9281 --75.9437 --75.9359 --75.9297 --75.9469 --75.9375 --75.9328 --75.9359 --75.9422 --75.9266 --75.9344 --75.9469 --75.9453 --75.9266 --75.9406 --75.9359 --75.9359 --75.9359 --75.9344 --75.9375 --75.9422 --75.925 --75.9328 --75.9391 --75.9391 --75.9375 --75.9391 --75.9422 --75.9328 --75.9297 --75.9328 --75.9328 --75.9344 --75.9437 --75.9313 --75.9453 --75.9344 --75.9375 --75.9328 --75.9375 --75.9406 --75.9313 --75.9391 --75.9484 --75.9391 --75.9469 --75.9313 --75.9531 --75.9469 --75.9469 --75.9422 --75.9391 --75.9406 --75.9281 --75.9437 --75.9375 --75.9328 --75.9359 --75.9266 --75.9391 --75.9375 --75.9422 --75.9281 --75.9422 --75.9344 --75.9437 --75.9406 --75.9375 --75.9391 --75.925 --75.9328 --75.9328 --75.9422 --75.9344 --75.9297 --75.925 --75.9437 --75.9359 --75.9266 --75.9328 --75.9453 --75.9375 --75.9469 --75.9344 --75.9469 --75.9422 --75.9297 --75.9406 --75.9344 --75.9406 --75.9516 --75.9437 --75.9453 --75.9516 --75.9484 --75.9406 --75.9469 --75.9297 --75.9453 --75.9313 --75.9391 --75.9344 --75.9266 --75.9437 --75.9328 --75.925 --75.9359 --75.9187 --75.9266 --75.9234 --75.9234 --75.9156 --75.9062 --75.9344 --75.9391 --75.9219 --75.9313 --75.9281 --75.9234 --75.9328 --75.9156 --75.9297 --75.9109 --75.9281 --75.9141 --75.925 --75.9234 --75.9156 --75.9219 --75.9359 --75.9375 --75.9313 --75.9125 --75.9297 --75.9219 --75.9109 --75.9172 --75.925 --75.9047 --75.9297 --75.9281 --75.9359 --75.9266 --75.9156 --75.9344 --75.9328 --75.925 --75.9297 --75.9297 --75.9328 --75.9328 --75.9359 --75.9234 --75.9266 --75.9359 --75.9266 --75.9266 --75.9234 --75.9219 --75.9313 --75.9203 --75.9344 --75.9234 --75.9203 --75.925 --75.9187 --75.9187 --75.9094 --75.9187 --75.9172 --75.9203 --75.9219 --75.9156 --75.9281 --75.925 --75.9234 --75.9125 --75.9156 --75.9141 --75.9109 --75.9313 --75.9234 --75.9203 --75.9375 --75.9281 --75.9297 --75.9391 --75.9266 --75.9219 --75.9328 --75.9375 --75.9219 --75.9391 --75.9313 --75.9406 --75.9172 --75.925 --75.9141 --75.9234 --75.9187 --75.9203 --75.9203 --75.925 --75.8891 --75.9 --75.9125 --75.9219 --75.9172 --75.9109 --75.9141 --75.9234 --75.9062 --75.9203 --75.9219 --75.9094 --75.9187 --75.9172 --75.9281 --75.9125 --75.9156 --75.9359 --75.9234 --75.9344 --75.9266 --75.9141 --75.9297 --75.9172 --75.9344 --75.9297 --75.925 --75.9266 --75.9234 --75.9344 --75.9266 --75.9281 --75.9375 --75.9266 --75.9219 --75.9328 --75.9219 --75.9313 --75.9172 --75.9266 --75.9344 --75.9328 --75.9141 --75.9344 --75.9281 --75.9328 --75.925 --75.9234 --75.925 --75.9328 --75.9281 --75.9359 --75.9219 --75.9328 --75.9359 --75.9313 --75.9266 --75.9141 --75.9297 --75.9328 --75.9406 --75.9313 --75.9328 --75.9297 --75.9313 --75.9484 --75.9422 --75.9469 --75.9422 --75.9281 --75.9313 --75.925 --75.9281 --75.9266 --75.9406 --75.9281 --75.9219 --75.9328 --75.9453 --75.9219 --75.925 --75.9297 --75.9313 --75.9344 --75.9281 --75.9109 --75.925 --75.9203 --75.9328 --75.9234 --75.9172 --75.9156 --75.9109 --75.9359 --75.9219 --75.9297 --75.9281 --75.9281 --75.9328 --75.9172 --75.9203 --75.9187 --75.925 --75.9281 --75.9328 --75.9047 --75.9391 --75.9406 --75.9125 --75.925 --75.9328 --75.9313 --75.925 --75.9203 --75.9359 --75.9344 --75.9375 --75.9344 --75.9187 --75.9156 --75.9281 --75.9375 --75.9391 --75.9344 --75.925 --75.9328 --75.9234 --75.9484 --75.9266 --75.9437 --75.9219 --75.9281 --75.9344 --75.9406 --75.9375 --75.9281 --75.9422 --75.9359 --75.9328 --75.9234 --75.9328 --75.9313 --75.9281 --75.9359 --75.9359 --75.9406 --75.9313 --75.9469 --75.9406 --75.925 --75.9266 --75.9266 --75.9469 --75.9328 --75.9203 --75.9297 --75.9266 --75.9469 --75.9328 --75.925 --75.9234 --75.9359 --75.9234 --75.9313 --75.9187 --75.9359 --75.9391 --75.9313 --75.9281 --75.9266 --75.9266 --75.9281 --75.9219 --75.9313 --75.9172 --75.9266 --75.9219 --75.9313 --75.9203 --75.9219 --75.9234 --75.9172 --75.9141 --75.9187 --75.9281 --75.9109 --75.9203 --75.9172 --75.9266 --75.9344 --75.9313 --75.9109 --75.9266 --75.9141 --75.9109 --75.9172 --75.9375 --75.9141 --75.9328 --75.9187 --75.9281 --75.9328 --75.9125 --75.9187 --75.9078 --75.9203 --75.9125 --75.9062 --75.9219 --75.925 --75.9203 --75.9156 --75.9172 --75.9281 --75.9078 --75.925 --75.9172 --75.9219 --75.9187 --75.9266 --75.9422 --75.925 --75.9266 --75.9266 --75.9266 --75.9281 --75.9313 --75.9156 --75.9297 --75.9297 --75.9187 --75.9375 --75.9313 --75.9234 --75.9391 --75.9313 --75.9187 --75.9328 --75.9234 --75.925 --75.9203 --75.9313 --75.9297 --75.9281 --75.9328 --75.9359 --75.9375 --75.9391 --75.9281 --75.9234 --75.9281 --75.9422 --75.9469 --75.9281 --75.9375 --75.9359 --75.9422 --75.9313 --75.9281 --75.9344 --75.9187 --75.9391 --75.9344 --75.925 --75.9344 --75.9375 --75.9406 --75.9406 --75.9313 --75.9422 --75.9391 --75.9328 --75.9531 --75.925 --75.9328 --75.9344 --75.9203 --75.9328 --75.9391 --75.9297 --75.9391 --75.9328 --75.9344 --75.9344 --75.9203 --75.9313 --75.9328 --75.9344 --75.9422 --75.9344 --75.9344 --75.9453 --75.9406 --75.9359 --75.9328 --75.9422 --75.9594 --75.9391 --75.9297 --75.9406 --75.9406 --75.9266 --75.9297 --75.925 --75.95 --75.9313 --75.9469 --75.9344 --75.925 --75.9328 --75.9453 --75.95 --75.9547 --75.9484 --75.9328 --75.9453 --75.9422 --75.9453 --75.9297 --75.9344 --75.9344 --75.9297 --75.9437 --75.9297 --75.9266 --75.9391 --75.9391 --75.9375 --75.925 --75.9234 --75.9391 --75.9328 --75.9266 --75.9297 --75.9313 --75.9406 --75.9266 --75.9234 --75.9344 --75.9375 --75.9375 --75.9297 --75.9297 --75.9328 --75.9328 --75.9297 --75.9219 --75.925 --75.9234 --75.9297 --75.9234 --75.9281 --75.9234 --75.9219 --75.9172 --75.9422 --75.9156 --75.9328 --75.9266 --75.9437 --75.9109 --75.9281 --75.9406 --75.9328 --75.9313 --75.9328 --75.9219 --75.9281 --75.9234 --75.9203 --75.9125 --75.9266 --75.925 --75.9141 --75.9375 --75.9234 --75.9187 --75.9094 --75.9359 --75.9234 --75.9156 --75.9172 --75.925 --75.9281 --75.9234 --75.9125 --75.9156 --75.9234 --75.9328 --75.9234 --75.9328 --75.9297 --75.9187 --75.9094 --75.9187 --75.9094 --75.9203 --75.9234 --75.9344 --75.9172 --75.9344 --75.9016 --75.9078 --75.9078 --75.9109 --75.9234 --75.9234 --75.9266 --75.9219 --75.9234 --75.9297 --75.9234 --75.9234 --75.9328 --75.9234 --75.9266 --75.9172 --75.9359 --75.9187 --75.9141 --75.9359 --75.9313 --75.9187 --75.9437 --75.9328 --75.9266 --75.9406 --75.925 --75.9219 --75.9297 --75.9422 --75.925 --75.9406 --75.9328 --75.9266 --75.9359 --75.9344 --75.9375 --75.9297 --75.9281 --75.925 --75.9297 --75.9359 --75.9172 --75.9391 --75.9406 --75.9187 --75.9344 --75.9219 --75.9234 --75.9313 --75.9203 --75.9141 --75.9297 --75.9391 --75.9219 --75.9141 --75.9297 --75.9156 --75.9391 --75.9344 --75.9437 --75.9344 --75.9203 --75.9359 --75.9266 --75.9203 --75.9141 --75.9422 --75.9234 --75.9328 --75.9125 --75.9141 --75.9328 --75.9234 --75.9203 --75.9203 --75.925 --75.9156 --75.9359 --75.9141 --75.9094 --75.9078 --75.9203 --75.9141 --75.9094 --75.9141 --75.9141 --75.9266 --75.9281 --75.9219 --75.9094 --75.9047 --75.925 --75.9141 --75.9078 --75.9266 --75.9187 --75.9203 --75.9359 --75.9297 --75.9328 --75.9078 --75.9437 --75.9359 --75.9453 --75.9187 --75.9297 --75.9281 --75.9203 --75.9187 --75.9234 --75.9297 --75.9125 --75.9234 --75.9234 --75.9156 --75.9391 --75.9172 --75.9391 --75.9297 --75.9344 --75.9297 --75.9313 --75.9422 --75.9344 --75.9219 --75.9313 --75.9437 --75.9187 --75.9359 --75.925 --75.9266 --75.9313 --75.9313 --75.9141 --75.9281 --75.9297 --75.9234 --75.925 --75.9297 --75.9266 --75.925 --75.9078 --75.9344 --75.9375 --75.9172 --75.9391 --75.9359 --75.9234 --75.9328 --75.9313 --75.9297 --75.9437 --75.9187 --75.9219 --75.9344 --75.9437 --75.9266 --75.9281 --75.95 --75.9359 --75.9375 --75.9187 --75.9453 --75.925 --75.9266 --75.9297 --75.9422 --75.9391 --75.9344 --75.9359 --75.9313 --75.9328 --75.9344 --75.9203 --75.9359 --75.9281 --75.9266 --75.9328 --75.9344 --75.9328 --75.9234 --75.9328 --75.9234 --75.9437 --75.9313 --75.9344 --75.9297 --75.925 --75.9313 --75.9328 --75.9297 --75.9266 --75.9109 --75.9141 --75.9234 --75.9219 --75.925 --75.9187 --75.9234 --75.9406 --75.9344 --75.9281 --75.9313 --75.9422 --75.9203 --75.9344 --75.95 --75.9234 --75.9453 --75.9406 --75.9328 --75.9328 --75.9391 --75.9234 --75.9203 --75.925 --75.9531 --75.9328 --75.9359 --75.9234 --75.9281 --75.9297 --75.9266 --75.9359 --75.9344 --75.9281 --75.9328 --75.9328 --75.9234 --75.9297 --75.9313 --75.9375 --75.9359 --75.9422 --75.9469 --75.9313 --75.9313 --75.9375 --75.9266 --75.9359 --75.9375 --75.9375 --75.9391 --75.9328 --75.9359 --75.9422 --75.9406 --75.9266 --75.9422 --75.9344 --75.9328 --75.9297 --75.9375 --75.9375 --75.9328 --75.9297 --75.9422 --75.925 --75.9422 --75.9328 --75.9156 --75.925 --75.9359 --75.9344 --75.9375 --75.9313 --75.9422 --75.9313 --75.925 --75.9297 --75.9359 --75.9313 --75.9125 --75.9297 --75.9281 --75.9469 --75.9406 --75.9484 --75.9406 --75.9281 --75.9313 --75.9281 --75.9219 --75.9359 --75.9328 --75.9219 --75.9344 --75.925 --75.9375 --75.9437 --75.9281 --75.9266 --75.9375 --75.9344 --75.925 --75.9406 --75.9266 --75.9328 --75.9406 --75.9297 --75.9391 --75.9406 --75.9469 --75.9406 --75.9297 --75.9437 --75.9375 --75.9422 --75.9391 --75.9422 --75.9297 --75.9344 --75.9422 --75.9547 --75.9484 --75.9359 --75.9344 --75.9359 --75.9328 --75.9359 --75.9297 --75.9313 --75.9297 --75.9297 --75.9172 --75.9266 --75.9344 --75.9266 --75.9266 --75.9406 --75.9391 --75.9422 --75.95 --75.9281 --75.9313 --75.9375 --75.9437 --75.9297 --75.9359 --75.9437 --75.9344 --75.9328 --75.9406 --75.9422 --75.9328 --75.9344 --75.9453 --75.9328 --75.9328 --75.9375 --75.9359 --75.9359 --75.9422 --75.9547 --75.925 --75.9359 --75.9422 --75.9375 --75.9375 --75.9203 --75.9391 --75.9437 --75.9391 --75.9313 --75.925 --75.9328 --75.9266 --75.9344 --75.9313 --75.9328 --75.9266 --75.9375 --75.9406 --75.9359 --75.9359 --75.9328 --75.9469 --75.9266 --75.9297 --75.9328 --75.9281 --75.9266 --75.9453 --75.9469 --75.9391 --75.9422 --75.9219 --75.9359 --75.9375 --75.9437 --75.9344 --75.9297 --75.9344 --75.9469 --75.9297 --75.9422 --75.9281 --75.9422 --75.9406 --75.9313 --75.9359 --75.9219 --75.9219 --75.9297 --75.9187 --75.9391 --75.9328 --75.9391 --75.9437 --75.9297 --75.9375 --75.9313 --75.9375 --75.9437 --75.9406 --75.9406 --75.9344 --75.9375 --75.95 --75.9359 --75.9313 --75.9406 --75.9313 --75.9359 --75.9375 --75.9281 --75.9344 --75.9469 --75.9437 --75.9422 --75.9406 --75.9406 --75.9344 --75.9469 --75.9422 --75.9422 --75.9375 --75.9453 --75.9344 --75.9547 --75.9375 --75.9469 --75.9344 --75.9359 --75.9344 --75.9563 --75.9391 --75.9422 --75.9531 --75.9484 --75.95 --75.9563 --75.9281 --75.9375 --75.9469 --75.9375 --75.9406 --75.9297 --75.9578 --75.9375 --75.9484 --75.9531 --75.9594 --75.9391 --75.9422 --75.95 --75.9437 --75.9422 --75.9547 --75.9469 --75.95 --75.9375 --75.9375 --75.9469 --75.9578 --75.95 --75.9547 --75.9531 --75.9453 --75.9406 --75.9484 --75.9453 --75.9406 --75.95 --75.9469 --75.9453 --75.9469 --75.95 --75.9656 --75.9422 --75.9453 --75.9422 --75.9406 --75.9469 --75.9313 --75.9313 --75.9547 --75.9469 --75.9359 --75.9328 --75.9516 --75.9531 --75.9469 --75.9484 --75.9531 --75.9437 --75.9437 --75.9422 --75.9219 --75.9484 --75.95 --75.9344 --75.9297 --75.9391 --75.9375 --75.9391 --75.9422 --75.9453 --75.9469 --75.9453 --75.9359 --75.9563 --75.9422 --75.9437 --75.9484 --75.9453 --75.9422 --75.9531 --75.9484 --75.9406 --75.9328 --75.9547 --75.9422 --75.9406 --75.9359 --75.9328 --75.9391 --75.9422 --75.9437 --75.9547 --75.9516 --75.9422 --75.9453 --75.9437 --75.9422 --75.95 --75.9531 --75.9453 --75.9406 --75.9422 --75.9297 --75.9484 --75.9328 --75.9422 --75.9375 --75.9437 --75.9359 --75.9563 --75.9359 --75.95 --75.9437 --75.9375 --75.9391 --75.9281 --75.9281 --75.9453 --75.9344 --75.9406 --75.9484 --75.9234 --75.9328 --75.9344 --75.9469 --75.9375 --75.9266 --75.9297 --75.9359 --75.9328 --75.95 --75.9578 --75.95 --75.9422 --75.9453 --75.9422 --75.9406 --75.9641 --75.9437 --75.9484 --75.9344 --75.9375 --75.9406 --75.9469 --75.9313 --75.9406 --75.9391 --75.9375 --75.9422 --75.9453 --75.9313 --75.9469 --75.9422 --75.9359 --75.9344 --75.9266 --75.9375 --75.9406 --75.9359 --75.9313 --75.9391 --75.9313 --75.9328 --75.9281 --75.9406 --75.9344 --75.9344 --75.9375 --75.9359 --75.9406 --75.9344 --75.9344 --75.9313 --75.9313 --75.9297 --75.9359 --75.9359 --75.9328 --75.9453 --75.9453 --75.9391 --75.9422 --75.9422 --75.9359 --75.9375 --75.9437 --75.9313 --75.9187 --75.9328 --75.9422 --75.9359 --75.9375 --75.9531 --75.9437 --75.9406 --75.9437 --75.9484 --75.9422 --75.9453 --75.9375 --75.9406 --75.9359 --75.9313 --75.9391 --75.9453 --75.9484 --75.9609 --75.9391 --75.9469 --75.9375 --75.9453 --75.9313 --75.9531 --75.9359 --75.9344 --75.9406 --75.9328 --75.9391 --75.9469 --75.9453 --75.95 --75.9484 --75.9359 --75.9547 --75.9391 --75.9422 --75.9422 --75.9453 --75.9234 --75.9437 --75.9313 --75.9422 --75.9453 --75.9422 --75.9469 --75.9375 --75.95 --75.9422 --75.9281 --75.9516 --75.9422 --75.9406 --75.925 --75.95 --75.9453 --75.9469 --75.9453 --75.9297 --75.9391 --75.9406 --75.9328 --75.9297 --75.9313 --75.9297 --75.9359 --75.9313 --75.9375 --75.9187 --75.9359 --75.9391 --75.9391 --75.9469 --75.9313 --75.9406 --75.9359 --75.9422 --75.9172 --75.9406 --75.9422 --75.9297 --75.9391 --75.9406 --75.9328 --75.9437 --75.9453 --75.9453 --75.9531 --75.9359 --75.9297 --75.9437 --75.9391 --75.9219 --75.9328 --75.9281 --75.9297 --75.9484 --75.9266 --75.9453 --75.9266 --75.9437 --75.9313 --75.9484 --75.9422 --75.9359 --75.9406 --75.9422 --75.9359 --75.9359 --75.9406 --75.9328 --75.9328 --75.9313 --75.9328 --75.9422 --75.9313 --75.9406 --75.9328 --75.9391 --75.9344 --75.9313 --75.9422 --75.9281 --75.9313 --75.9359 --75.9359 --75.9344 --75.9344 --75.9406 --75.9375 --75.9375 --75.9453 --75.9328 --75.9281 --75.9359 --75.9391 --75.9422 --75.9469 --75.9344 --75.9437 --75.9234 --75.9313 --75.9375 --75.9297 --75.925 --75.9266 --75.9266 --75.9422 --75.9391 --75.9422 --75.9422 --75.9359 --75.9344 --75.9453 --75.9547 --75.9391 --75.9422 --75.9344 --75.9313 --75.9375 --75.9281 --75.9313 --75.9328 --75.9437 --75.9328 --75.9437 --75.925 --75.9328 --75.9313 --75.95 --75.9437 --75.9391 --75.9328 --75.9281 --75.9547 --75.9375 --75.9266 --75.9375 --75.9313 --75.9391 --75.9328 --75.9391 --75.9344 --75.9375 --75.9234 --75.9297 --75.9359 --75.9281 --75.9266 --75.9266 --75.9313 --75.9328 --75.9281 --75.9344 --75.9313 --75.95 --75.9328 --75.9547 --75.9375 --75.9406 --75.9437 --75.9422 --75.9391 --75.9328 --75.9531 --75.9406 --75.95 --75.9375 --75.9578 --75.9406 --75.9469 --75.9391 --75.9516 --75.9437 --75.9469 --75.9516 --75.9328 --75.9313 --75.9484 --75.9391 --75.9437 --75.9344 --75.9344 --75.9469 --75.9391 --75.9516 --75.9484 --75.9547 --75.9375 --75.95 --75.9313 --75.9328 --75.95 --75.9375 --75.9344 --75.9547 --75.9313 --75.9359 --75.9344 --75.9422 --75.9422 --75.9313 --75.9313 --75.95 --75.9469 --75.9234 --75.9391 --75.9406 --75.9297 --75.9375 --75.9391 --75.9422 --75.9422 --75.9422 --75.9484 --75.9406 --75.9328 --75.9359 --75.9328 --75.9281 --75.9375 --75.9391 --75.9437 --75.9453 --75.9453 --75.9344 --75.9313 --75.9547 --75.9406 --75.9406 --75.9437 --75.9281 --75.9359 --75.9469 --75.9266 --75.9359 --75.9359 --75.9297 --75.9328 --75.9406 --75.9375 --75.95 --75.9359 --75.9469 --75.9313 --75.9359 --75.9484 --75.9422 --75.9313 --75.9437 --75.95 --75.9281 --75.9437 --75.9437 --75.9391 --75.9375 --75.9516 --75.9344 --75.9313 --75.9437 --75.9406 --75.9406 --75.9437 --75.9391 --75.9375 --75.9422 --75.9359 --75.9469 --75.9391 --75.9531 --75.9422 --75.925 --75.9375 --75.9297 --75.9359 --75.9328 --75.9234 --75.9406 --75.9375 --75.9406 --75.9391 --75.9406 --75.9313 --75.9406 --75.9453 --75.9437 --75.9391 --75.95 --75.9406 --75.9422 --75.9297 --75.9391 --75.9281 --75.9281 --75.9234 --75.9359 --75.9328 --75.9422 --75.9375 --75.9313 --75.9219 --75.95 --75.9344 --75.9484 --75.9437 --75.9313 --75.9344 --75.9375 --75.9453 --75.9516 --75.9375 --75.9391 --75.9344 --75.9406 --75.9375 --75.9422 --75.9391 --75.9344 --75.9375 --75.9406 --75.95 --75.9328 --75.9437 --75.9484 --75.9391 --75.9469 --75.9516 --75.9406 --75.9484 --75.9453 --75.9406 --75.9453 --75.9484 --75.9594 --75.9594 --75.9531 --75.9406 --75.9578 --75.9406 --75.9406 --75.95 --75.9453 --75.9469 --75.9422 --75.9469 --75.9344 --75.9453 --75.9453 --75.9437 --75.9453 --75.9547 --75.9328 --75.9422 --75.9375 --75.9437 --75.9359 --75.9391 --75.9391 --75.9469 --75.9422 --75.9344 --75.95 --75.9437 --75.9422 --75.9406 --75.9453 --75.9469 --75.9437 --75.9469 --75.9406 --75.9344 --75.9375 --75.9375 --75.9359 --75.9422 --75.9375 --75.9422 --75.9328 --75.9219 --75.9328 --75.9187 --75.9266 --75.9297 --75.9266 --75.9297 --75.9391 --75.9344 --75.9219 --75.9281 --75.9313 --75.9375 --75.9375 --75.9391 --75.9328 --75.9328 --75.9375 --75.9437 --75.925 --75.9281 --75.9391 --75.9297 --75.9359 --75.9203 --75.9344 --75.9328 --75.9344 --75.9437 --75.9422 --75.9313 --75.9281 --75.9453 --75.9453 --75.9453 --75.925 --75.9359 --75.9422 --75.9172 --75.925 --75.9328 --75.9469 --75.9391 --75.9359 --75.9359 --75.9406 --75.9297 --75.9437 --75.9219 --75.9313 --75.9234 --75.9297 --75.9234 --75.9219 --75.9281 --75.9313 --75.9297 --75.9297 --75.9234 --75.9266 --75.9375 --75.9391 --75.9375 --75.9375 --75.9422 --75.95 --75.9594 --75.9484 --75.9344 --75.9391 --75.95 --75.9359 --75.9484 --75.9484 --75.95 --75.9453 --75.9344 --75.9422 --75.9391 --75.9469 --75.9531 --75.9453 --75.9359 --75.9375 --75.9375 --75.9406 --75.9406 --75.9531 --75.9484 --75.9437 --75.9437 --75.9266 --75.9437 --75.9422 --75.9484 --75.9281 --75.9391 --75.9547 --75.9516 --75.9391 --75.9391 --75.9406 --75.9453 --75.9359 --75.9375 --75.9453 --75.9297 --75.9406 --75.95 --75.9563 --75.9484 --75.9391 --75.9406 --75.95 --75.9578 --75.9453 --75.9484 --75.9641 --75.9469 --75.9516 --75.9609 --75.9469 --75.9391 --75.9406 --75.9453 --75.9516 --75.95 --75.9594 --75.9625 --75.9484 --75.9469 --75.9266 --75.9531 --75.9422 --75.9391 --75.9531 --75.9453 --75.9469 --75.9297 --75.9469 --75.9422 --75.9297 --75.9344 --75.9281 --75.9313 --75.925 --75.9344 --75.9328 --75.9328 --75.9484 --75.9344 --75.9406 --75.9469 --75.9422 --75.9531 --75.9375 --75.9484 --75.95 --75.9375 --75.9391 --75.9516 --75.9281 --75.9344 --75.9422 --75.9422 --75.9234 --75.9578 --75.9406 --75.9391 --75.9484 --75.9344 --75.9422 --75.9453 --75.9531 --75.9422 --75.95 --75.9625 --75.9422 --75.9437 --75.95 --75.9437 --75.9328 --75.9391 --75.9375 --75.9234 --75.9359 --75.9313 --75.9453 --75.9375 --75.9391 --75.9359 --75.9359 --75.9484 --75.9359 --75.9266 --75.9422 --75.9344 --75.9437 --75.9344 --75.9391 --75.9531 --75.9516 --75.9453 --75.9328 --75.9406 --75.9391 --75.9453 --75.9422 --75.9422 --75.9453 --75.9437 --75.9484 --75.9453 --75.9516 --75.9406 --75.95 --75.9469 --75.9516 --75.9453 --75.9313 --75.9453 --75.9422 --75.9437 --75.9516 --75.95 --75.9484 --75.9422 --75.9484 --75.9609 --75.9422 --75.9437 --75.9437 --75.9406 --75.9437 --75.9422 --75.9422 --75.9359 --75.9391 --75.9359 --75.9578 --75.9453 --75.9313 --75.9297 --75.9391 --75.9406 --75.9297 --75.9391 --75.9313 --75.925 --75.9344 --75.9469 --75.9344 --75.9437 --75.9375 --75.9453 --75.9313 --75.9219 --75.9422 --75.9484 --75.9359 --75.9344 --75.9437 --75.9391 --75.9469 --75.9531 --75.9453 --75.9437 --75.9578 --75.9609 --75.9406 --75.9328 --75.9422 --75.9422 --75.9422 --75.9453 --75.9406 --75.95 --75.95 --75.9469 --75.9437 --75.95 --75.9547 --75.95 --75.9437 --75.9547 --75.9453 --75.9469 --75.9422 --75.9484 --75.9578 --75.9453 --75.9344 --75.9313 --75.9406 --75.9437 --75.9328 --75.9422 --75.9406 --75.9375 --75.9297 --75.9406 --75.9406 --75.9344 --75.9422 --75.9453 --75.9484 --75.9484 --75.9422 --75.9375 --75.9281 --75.9516 --75.9453 --75.9344 --75.9375 --75.95 --75.9375 --75.9437 --75.9437 --75.9453 --75.9578 --75.9453 --75.9484 --75.9453 --75.9359 --75.9375 --75.9328 --75.9469 --75.9453 --75.9563 --75.9391 --75.9484 --75.9469 --75.9516 --75.9344 --75.95 --75.9563 --75.9531 --75.9359 --75.9437 --75.9531 --75.9453 --75.9609 --75.95 --75.9547 --75.9484 --75.9563 --75.9484 --75.9484 --75.95 --75.9531 --75.95 --75.9344 --75.9484 --75.9422 --75.9531 --75.9484 --75.9531 --75.9563 --75.9484 --75.9484 --75.9547 --75.9531 --75.9578 --75.9516 --75.9609 --75.9437 --75.9469 --75.9422 --75.9531 --75.9484 --75.9437 --75.9672 --75.9437 --75.9625 --75.9547 --75.9484 --75.9531 --75.9422 --75.9547 --75.9531 --75.9594 --75.9516 --75.9516 --75.9641 --75.9531 --75.9531 --75.9406 --75.9469 --75.9547 --75.9484 --75.9563 --75.9375 --75.9516 --75.9328 --75.9453 --75.9437 --75.9453 --75.9484 --75.9359 --75.9375 --75.9437 --75.9516 --75.9297 --75.9437 --75.9453 --75.9359 --75.9469 --75.9391 --75.95 --75.9344 --75.9531 --75.9422 --75.9328 --75.9484 --75.9453 --75.9359 --75.9453 --75.9437 --75.9453 --75.9375 --75.9437 --75.9391 --75.9578 --75.9453 --75.9516 --75.9547 --75.9375 --75.9422 --75.9375 --75.9469 --75.9484 --75.9609 --75.9547 --75.9578 --75.9609 --75.9563 --75.9641 --75.9453 --75.9578 --75.9547 --75.9437 --75.9359 --75.9484 --75.9437 --75.9422 --75.9344 --75.9375 --75.9344 --75.9391 --75.9531 --75.9344 --75.9406 --75.9578 --75.9437 --75.9531 --75.9578 --75.9453 --75.9656 --75.9563 --75.9469 --75.9547 --75.9563 --75.9516 --75.95 --75.9453 --75.9594 --75.9672 --75.9484 --75.9609 --75.9547 --75.9563 --75.9531 --75.9578 --75.9469 --75.9469 --75.9578 --75.9484 --75.9563 --75.9375 --75.9609 --75.9578 --75.95 --75.9531 --75.9656 --75.9656 --75.9594 --75.9437 --75.9469 --75.9547 --75.9469 --75.9531 --75.9609 --75.9609 --75.9547 --75.9547 --75.9578 --75.9516 --75.9469 --75.9609 --75.9437 --75.9578 --75.9563 --75.95 --75.9594 --75.9453 --75.9578 --75.95 --75.9547 --75.9625 --75.9516 --75.9516 --75.9578 --75.9547 --75.9531 --75.9594 --75.9563 --75.9609 --75.9469 --75.9422 --75.9547 --75.9453 --75.9547 --75.9531 --75.9453 --75.9625 --75.9516 --75.9516 --75.9547 --75.9484 --75.9547 --75.95 --75.9469 --75.9437 --75.9297 --75.95 --75.9469 --75.9469 --75.9531 --75.9656 --75.9641 --75.9437 --75.9391 --75.9484 --75.9484 --75.9281 --75.9422 --75.95 --75.9406 --75.9437 --75.9422 --75.9437 --75.925 --75.9453 --75.9328 --75.9375 --75.9297 --75.9328 --75.9344 --75.9422 --75.9375 --75.9437 --75.9469 --75.9391 --75.9391 --75.9422 --75.9313 --75.9531 --75.9406 --75.9469 --75.9391 --75.925 --75.9391 --75.95 --75.9281 --75.9469 --75.9328 --75.9453 --75.9313 --75.9359 --75.9391 --75.9359 --75.9391 --75.9422 --75.9313 --75.9484 --75.9344 --75.9297 --75.9469 --75.9375 --75.9359 --75.9266 --75.9484 --75.9375 --75.9422 --75.9328 --75.9375 --75.9437 --75.9469 --75.9313 --75.9187 --75.9437 --75.9484 --75.95 --75.9297 --75.9375 --75.9547 --75.9453 --75.9469 --75.9359 --75.9406 --75.9547 --75.9359 --75.9359 --75.9531 --75.9437 --75.9578 --75.9437 --75.9391 --75.9484 --75.9453 --75.9453 --75.9484 --75.9484 --75.9359 --75.9391 --75.9344 --75.9375 --75.9344 --75.9359 --75.9359 --75.9453 --75.9313 --75.9422 --75.9344 --75.9406 --75.9516 --75.9516 --75.9359 --75.9328 --75.9547 --75.9453 --75.9156 --75.9453 --75.95 --75.9313 --75.9469 --75.9406 --75.9281 --75.9313 --75.9406 --75.9531 --75.9484 --75.9469 --75.9406 --75.9422 --75.9375 --75.9422 --75.9359 --75.9328 --75.9328 --75.9391 --75.9344 --75.9437 --75.9313 --75.9203 --75.9313 --75.9297 --75.9297 --75.9328 --75.9391 --75.9375 --75.9359 --75.9359 --75.9313 --75.9297 --75.9359 --75.9375 --75.9375 --75.9344 --75.9344 --75.9328 --75.9422 --75.9391 --75.9437 --75.9469 --75.9453 --75.9484 --75.9516 --75.9375 --75.9391 --75.9375 --75.9328 --75.9422 --75.95 --75.9344 --75.9469 --75.9375 --75.9391 --75.9516 --75.9359 --75.95 --75.9437 --75.9328 --75.9375 --75.9422 --75.9313 --75.9344 --75.9313 --75.9313 --75.9391 --75.9391 --75.9437 --75.9563 --75.9484 --75.9516 --75.9453 --75.9563 --75.9391 --75.9625 --75.9484 --75.9516 --75.95 --75.9375 --75.9453 --75.9578 --75.9531 --75.9594 --75.9547 --75.9484 --75.9422 --75.95 --75.95 --75.9516 --75.9563 --75.9547 --75.9484 --75.9469 --75.9609 --75.9437 --75.9469 --75.9516 --75.9375 --75.9609 --75.9406 --75.9453 --75.9469 --75.9531 --75.9437 --75.9375 --75.9469 --75.9516 --75.9453 --75.9375 --75.9531 --75.9531 --75.9437 --75.9563 --75.9484 --75.9594 --75.9391 --75.9484 --75.9516 --75.9359 --75.9344 --75.9547 --75.9469 --75.9375 --75.9437 --75.9375 --75.9406 --75.95 --75.9437 --75.9437 --75.9422 --75.9406 --75.9453 --75.9484 --75.9437 --75.9344 --75.9297 --75.9297 --75.9297 --75.9234 --75.9281 --75.9453 --75.9328 --75.9328 --75.9359 --75.9328 --75.9328 --75.9453 --75.9391 --75.9234 --75.9375 --75.9563 --75.9328 --75.9375 --75.9359 --75.9469 --75.9422 --75.9375 --75.9328 --75.9406 --75.9437 --75.9281 --75.9375 --75.9406 --75.9313 --75.9281 --75.925 --75.9313 --75.9375 --75.95 --75.9422 --75.9531 --75.9469 --75.9531 --75.9344 --75.9516 --75.9437 --75.9266 --75.9375 --75.9391 --75.9516 --75.9344 --75.9391 --75.9469 --75.9406 --75.9406 --75.9484 --75.9313 --75.9422 --75.9391 --75.9484 --75.9359 --75.9609 --75.9406 --75.9516 --75.9469 --75.9453 --75.9422 --75.9359 --75.9453 --75.9484 --75.9437 --75.9391 --75.95 --75.95 --75.9469 --75.9422 --75.9437 --75.9313 --75.9437 --75.9484 --75.9359 --75.9313 --75.9391 --75.9422 --75.9422 --75.9266 --75.9344 --75.9328 --75.9313 --75.9453 --75.9406 --75.9406 --75.9266 --75.9375 --75.9359 --75.9344 --75.9313 --75.9375 --75.9328 --75.9391 --75.9344 --75.9484 --75.9437 --75.9406 --75.9453 --75.9391 --75.9328 --75.9437 --75.9422 --75.9391 --75.9422 --75.9281 --75.9516 --75.9359 --75.9344 --75.9406 --75.9437 --75.9437 --75.9437 --75.9359 --75.9437 --75.9391 --75.9422 --75.9422 --75.9516 --75.9531 --75.9437 --75.95 --75.9453 --75.9375 --75.9391 --75.9406 --75.9516 --75.9406 --75.9437 --75.9484 --75.9469 --75.9594 --75.9484 --75.9516 --75.9328 --75.9453 --75.9297 --75.9391 --75.9437 --75.9406 --75.9313 --75.9359 --75.9359 --75.9344 --75.9281 --75.9437 --75.9531 --75.9391 --75.9531 --75.9422 --75.9469 --75.9344 --75.9406 --75.9469 --75.9594 --75.9344 --75.9281 --75.9484 --75.9516 --75.9406 --75.9422 --75.9359 --75.9422 --75.9375 --75.9297 --75.9437 --75.9328 --75.9266 --75.9453 --75.9313 --75.9375 --75.9453 --75.9266 --75.9297 --75.9281 --75.9406 --75.9406 --75.9266 --75.9453 --75.9437 --75.9422 --75.9422 --75.95 --75.9406 --75.9469 --75.9344 --75.9344 --75.9344 --75.9297 --75.9297 --75.9313 --75.9344 --75.9437 --75.9469 --75.9281 --75.9359 --75.9344 --75.9359 --75.9422 --75.9422 --75.9344 --75.9391 --75.9516 --75.95 --75.9359 --75.9437 --75.9344 --75.9328 --75.9391 --75.9375 --75.9469 --75.9391 --75.9313 --75.9484 --75.9578 --75.9453 --75.9406 --75.9609 --75.9484 --75.9453 --75.9594 --75.9531 --75.9375 --75.9484 --75.95 --75.9531 --75.9563 --75.9531 --75.9516 --75.9344 --75.9516 --75.9422 --75.9453 --75.9437 --75.9437 --75.9422 --75.9516 --75.9469 --75.9328 --75.9469 --75.9437 --75.9391 --75.9453 --75.9391 --75.9391 --75.9406 --75.9391 --75.9469 --75.9328 --75.9391 --75.9406 --75.9422 --75.9313 --75.9422 --75.9453 --75.9375 --75.9359 --75.9453 --75.9437 --75.9297 --75.9313 --75.9391 --75.9422 --75.9375 --75.9359 --75.9563 --75.9406 --75.9422 --75.9406 --75.9359 --75.9484 --75.9391 --75.9422 --75.925 --75.9469 --75.9281 --75.9469 --75.9453 --75.9422 --75.9516 --75.9328 --75.9531 --75.9359 --75.9422 --75.9391 --75.9547 --75.9469 --75.9313 --75.9547 --75.9453 --75.9422 --75.9469 --75.9547 --75.9297 --75.9484 --75.9469 --75.9437 --75.95 --75.95 --75.9531 --75.9453 --75.95 --75.9391 --75.9484 --75.9531 --75.9609 --75.9469 --75.9422 --75.9516 --75.9578 --75.9469 --75.9516 --75.9375 --75.9328 --75.9344 --75.9563 --75.9437 --75.9437 --75.9453 --75.9391 --75.9484 --75.9437 --75.9422 --75.95 --75.9516 --75.9531 --75.9328 --75.9594 --75.9437 --75.9453 --75.9484 --75.9422 --75.9406 --75.9453 --75.9375 --75.9328 --75.9484 --75.9469 --75.9391 --75.9391 --75.95 --75.9437 --75.9422 --75.95 --75.9516 --75.9516 --75.9516 --75.9422 --75.9469 --75.9578 --75.9375 --75.9406 --75.9516 --75.9469 --75.9469 --75.9375 --75.9516 --75.9516 --75.9406 --75.9437 --75.9344 --75.9375 --75.9453 --75.9297 --75.9609 --75.95 --75.9437 --75.9406 --75.9594 --75.9453 --75.9484 --75.9406 --75.9453 --75.9375 --75.9453 --75.9484 --75.95 --75.9437 --75.95 --75.9391 --75.9484 --75.9547 --75.9281 --75.9609 --75.9391 --75.9359 --75.9469 --75.9344 --75.9297 --75.9453 --75.9391 --75.9469 --75.9547 --75.9391 --75.9531 --75.9453 --75.9328 --75.9406 --75.9437 --75.9344 --75.9391 --75.9406 --75.9563 --75.9359 --75.9422 --75.9422 --75.95 --75.9516 --75.9469 --75.9484 --75.9406 --75.9531 --75.9578 --75.9453 --75.9531 --75.9484 --75.9469 --75.9297 --75.9531 --75.9391 --75.95 --75.9437 --75.9375 --75.9375 --75.9453 --75.95 --75.9422 --75.9516 --75.9469 --75.9375 --75.95 --75.95 --75.9453 --75.9469 --75.95 --75.9516 --75.9406 --75.9328 --75.9547 --75.9375 --75.9406 --75.9563 --75.9391 --75.9453 --75.9516 --75.9656 --75.9437 --75.9484 --75.9609 --75.9547 --75.9547 --75.9437 --75.9625 --75.9594 --75.9422 --75.9297 --75.9578 --75.9703 --75.9359 --75.9344 --75.9516 --75.9437 --75.9422 --75.9547 --75.9422 --75.9578 --75.9359 --75.9422 --75.9406 --75.9484 --75.9203 --75.9406 --75.9453 --75.9453 --75.9375 --75.9437 --75.9594 --75.9719 --75.95 --75.9547 --75.9531 --75.9578 --75.9359 --75.9469 --75.9437 --75.95 --75.9375 --75.9578 --75.9297 --75.9422 --75.9359 --75.9516 --75.95 --75.9422 --75.9344 --75.9297 --75.9375 --75.9406 --75.9344 --75.9422 --75.9328 --75.9375 --75.9328 --75.9266 --75.9391 --75.9516 --75.95 --75.9453 --75.9375 --75.9437 --75.9406 --75.9531 --75.9453 --75.9406 --75.9484 --75.9453 --75.9469 --75.9437 --75.95 --75.9531 --75.9531 --75.9594 --75.9453 --75.9437 --75.9563 --75.9469 --75.9563 --75.9469 --75.9563 --75.9469 --75.9516 --75.9406 --75.9422 --75.9484 --75.9328 --75.9484 --75.9406 --75.9469 --75.9375 --75.9437 --75.9469 --75.9469 --75.9516 --75.9406 --75.9391 --75.9531 --75.9516 --75.9422 --75.9594 --75.9641 --75.9625 --75.9391 --75.95 --75.9484 --75.95 --75.9609 --75.9641 --75.9484 --75.9516 --75.9547 --75.9484 --75.9516 --75.9375 --75.9391 --75.9422 --75.9391 --75.9547 --75.9422 --75.9297 --75.9422 --75.9531 --75.9469 --75.9437 --75.9703 --75.9578 --75.9422 --75.9484 --75.9406 --75.9422 --75.9516 --75.9406 --75.9516 --75.9484 --75.9516 --75.9469 --75.9406 --75.95 --75.9422 --75.9563 --75.9422 --75.9578 --75.9344 --75.9406 --75.9391 --75.9531 --75.9391 --75.9547 --75.9578 --75.95 --75.9484 --75.9594 --75.9406 --75.9422 --75.9344 --75.9516 --75.9484 --75.9391 --75.9437 --75.9469 --75.9328 --75.9453 --75.9453 --75.9469 --75.9453 --75.9422 --75.9375 --75.9578 --75.9469 --75.9328 --75.9297 --75.9375 --75.9516 --75.9469 --75.9469 --75.9516 --75.9391 --75.9469 --75.9531 --75.9375 --75.9437 --75.9328 --75.9516 --75.9313 --75.9453 --75.9422 --75.9453 --75.9469 --75.9453 --75.9594 --75.9469 --75.95 --75.9469 --75.9484 --75.9516 --75.9359 --75.9469 --75.9422 --75.9484 --75.9422 --75.9469 --75.9594 --75.95 --75.9391 --75.9328 --75.9469 --75.9437 --75.9313 --75.9531 --75.9547 --75.9563 --75.9437 --75.9484 --75.95 --75.95 --75.9313 --75.9406 --75.9437 --75.9453 --75.9328 --75.9328 --75.9437 --75.9391 --75.9422 --75.9375 --75.9359 --75.9359 --75.9328 --75.9563 --75.9437 --75.9422 --75.9437 --75.9469 --75.95 --75.9469 --75.9391 --75.9375 --75.9375 --75.9344 --75.9422 --75.9437 --75.9437 --75.9484 --75.9453 --75.9375 --75.9516 --75.9328 --75.95 --75.9328 --75.9484 --75.9469 --75.9516 --75.9453 --75.9484 --75.9484 --75.9531 --75.9563 --75.9406 --75.9563 --75.9516 --75.9531 --75.9437 --75.9469 --75.9531 --75.95 --75.9516 --75.9531 --75.9578 --75.9437 --75.9469 --75.9453 --75.95 --75.9516 --75.95 --75.9531 --75.9484 --75.9469 --75.9578 --75.9641 --75.95 --75.9344 --75.9422 --75.9516 --75.9422 --75.9484 --75.9609 --75.9547 --75.9422 --75.95 --75.9516 --75.9453 --75.9578 --75.9609 --75.9578 --75.9563 --75.9484 --75.9531 --75.9547 --75.9594 --75.9578 --75.9594 --75.9563 --75.9547 --75.9625 --75.9641 --75.9609 --75.9656 --75.9531 --75.9641 --75.9547 --75.9422 --75.9516 --75.9563 --75.9453 --75.9453 --75.9547 --75.9484 --75.9625 --75.9547 --75.9609 --75.9422 --75.9437 --75.9578 --75.9547 --75.95 --75.9516 --75.9641 --75.9453 --75.9531 --75.9469 --75.9531 --75.9422 --75.9453 --75.9391 --75.9594 --75.9359 --75.9437 --75.9594 --75.9297 --75.9547 --75.9484 --75.9609 --75.9547 --75.9766 --75.9531 --75.9453 --75.9734 --75.9594 --75.9531 --75.9547 --75.9375 --75.9594 --75.9641 --75.9531 --75.9641 --75.9531 --75.9625 --75.9516 --75.9391 --75.9531 --75.9547 --75.9656 --75.9469 --75.9516 --75.9437 --75.9469 --75.9484 --75.9563 --75.95 --75.9469 --75.9609 --75.9547 --75.9422 --75.9625 --75.9516 --75.9609 --75.95 --75.9484 --75.9578 --75.9531 --75.9453 --75.9531 --75.9625 --75.9406 --75.9516 --75.9516 --75.95 --75.9469 --75.9531 --75.9578 --75.9641 --75.95 --75.9578 --75.9484 --75.9641 --75.9516 --75.9516 --75.9766 --75.9469 --75.9453 --75.9484 --75.9484 --75.9531 --75.9594 --75.9641 --75.95 --75.9484 --75.9484 --75.9547 --75.95 --75.9719 --75.9453 --75.9484 --75.9422 --75.9516 --75.9656 --75.9516 --75.9594 --75.9625 --75.9594 --75.9625 --75.9594 --75.9578 --75.9563 --75.9734 --75.9563 --75.9656 --75.9641 --75.9516 --75.9703 --75.9531 --75.9547 --75.9594 --75.9594 --75.9656 --75.9609 --75.9625 --75.9672 --75.9719 --75.9641 --75.9484 --75.9688 --75.9594 --75.95 --75.9609 --75.95 --75.9422 --75.9547 --75.9563 --75.9625 --75.9547 --75.9484 --75.9531 --75.9563 --75.9531 --75.9563 --75.95 --75.9547 --75.9625 --75.9609 --75.9563 --75.9609 --75.9625 --75.9531 --75.9531 --75.9688 --75.9641 --75.9594 --75.9625 --75.9563 --75.9672 --75.975 --75.9656 --75.9641 --75.9578 --75.9547 --75.9609 --75.9469 --75.975 --75.9469 --75.9563 --75.9641 --75.9563 --75.9703 --75.9625 --75.9625 --75.9703 --75.9656 --75.9563 --75.9703 --75.9547 --75.9719 --75.9641 --75.9719 --75.9516 --75.9625 --75.9578 --75.9688 --75.9469 --75.9547 --75.9391 --75.9734 --75.9484 --75.9531 --75.9484 --75.9531 --75.9531 --75.9547 --75.9484 --75.9609 --75.95 --75.9594 --75.975 --75.9594 --75.9625 --75.9391 --75.9516 --75.95 --75.9563 --75.9656 --75.9578 --75.9578 --75.9594 --75.9625 --75.9594 --75.9469 --75.9484 --75.9531 --75.9625 --75.9656 --75.9516 --75.9578 --75.9578 --75.9594 --75.9453 --75.9516 --75.9453 --75.9641 --75.9391 --75.9484 --75.9453 --75.9422 --75.9609 --75.9563 --75.9688 --75.9609 --75.9328 --75.9437 --75.9594 --75.9453 --75.9531 --75.9688 --75.9516 --75.9469 --75.9594 --75.9625 --75.9516 --75.9547 --75.9469 --75.9563 --75.9375 --75.9422 --75.9516 --75.9453 --75.9516 --75.9531 --75.95 --75.9313 --75.9406 --75.9422 --75.9391 --75.9516 --75.9547 --75.9453 --75.9547 --75.9422 --75.95 --75.9531 --75.9375 --75.9375 --75.9453 --75.9594 --75.9437 --75.95 --75.9453 --75.9437 --75.9484 --75.9391 --75.9422 --75.9484 --75.9484 --75.9375 --75.9453 --75.9547 --75.9328 --75.9359 --75.9484 --75.9531 --75.9437 --75.95 --75.9563 --75.9516 --75.9609 --75.9516 --75.9516 --75.9328 --75.9641 --75.9469 --75.9437 --75.9391 --75.95 --75.9484 --75.9625 --75.9437 --75.95 --75.9531 --75.9453 --75.9547 --75.9547 --75.9313 --75.9469 --75.9469 --75.9531 --75.9437 --75.9406 --75.9437 --75.9469 --75.9437 --75.9313 --75.9625 --75.9422 --75.9484 --75.9391 --75.9516 --75.9375 --75.9391 --75.9437 --75.9344 --75.95 --75.9422 --75.9469 --75.9516 --75.9391 --75.95 --75.9437 --75.9453 --75.9547 --75.95 --75.9516 --75.9609 --75.9391 --75.9516 --75.9344 --75.9547 --75.9688 --75.9531 --75.9609 --75.9641 --75.9484 --75.9516 --75.9547 --75.9484 --75.9594 --75.9484 --75.9391 --75.9469 --75.95 --75.9391 --75.9594 --75.9484 --75.9516 --75.9422 --75.9594 --75.9625 --75.9531 --75.9516 --75.9547 --75.9453 --75.95 --75.9391 --75.9563 --75.9547 --75.9484 --75.9453 --75.9516 --75.9625 --75.9547 --75.9547 --75.9469 --75.9391 --75.9625 --75.9547 --75.9437 --75.9547 --75.9391 --75.9609 --75.9594 --75.9516 --75.95 --75.9594 --75.9406 --75.9578 --75.9516 --75.9422 --75.9547 --75.95 --75.9641 --75.9531 --75.9594 --75.9563 --75.95 --75.9516 --75.9516 --75.9484 --75.9547 --75.9422 --75.9547 --75.9594 --75.9484 --75.9641 --75.9422 --75.9594 --75.95 --75.9531 --75.9547 --75.95 --75.9656 --75.9469 --75.9469 --75.9625 --75.9625 --75.9625 --75.9672 --75.9563 --75.9609 --75.9516 --75.9625 --75.9609 --75.9609 --75.9719 --75.9641 --75.9563 --75.95 --75.9547 --75.9672 --75.9547 --75.9641 --75.9594 --75.9516 --75.9609 --75.9594 --75.9469 --75.9594 --75.9609 --75.9563 --75.9641 --75.9578 --75.9719 --75.9594 --75.9594 --75.9672 --75.9609 --75.9563 --75.9641 --75.9672 --75.9516 --75.9578 --75.9547 --75.9563 --75.9734 --75.9609 --75.9672 --75.9516 --75.9563 --75.9688 --75.9563 --75.9578 --75.9594 --75.9578 --75.9594 --75.9734 --75.9484 --75.9625 --75.95 --75.9688 --75.9484 --75.9641 --75.9594 --75.9672 --75.9594 --75.9797 --75.9734 --75.9828 --75.9578 --75.9656 --75.9594 --75.9641 --75.9609 --75.9594 --75.9625 --75.9437 --75.9641 --75.9609 --75.9609 --75.9703 --75.975 --75.9656 --75.9703 --75.9688 --75.9781 --75.9656 --75.9547 --75.9688 --75.9578 --75.9656 --75.975 --75.9672 --75.9469 --75.9688 --75.9781 --75.9812 --75.9609 --75.9766 --75.9625 --75.9688 --75.9844 --75.9922 --75.9734 --75.9719 --75.9688 --75.9906 --75.9812 --75.9703 --75.975 --75.9672 --75.9844 --75.9734 --75.9703 --75.9688 --75.9719 --75.9719 --75.9734 --75.9734 --75.9594 --75.9609 --75.9672 --75.9656 --75.9563 --75.9688 --75.9688 --75.9563 --75.9531 --75.9672 --75.9672 --75.9703 --75.9641 --75.9703 --75.9578 --75.9734 --75.9641 --75.9656 --75.9609 --75.9734 --75.9594 --75.9656 --75.975 --75.9625 --75.9578 --75.9672 --75.9797 --75.9688 --75.9656 --75.9547 --75.9656 --75.9469 --75.9547 --75.9547 --75.9594 --75.9516 --75.9625 --75.9625 --75.9563 --75.9656 --75.9578 --75.9766 --75.9734 --75.975 --75.9609 --75.9641 --75.9703 --75.9672 --75.9609 --75.9797 --75.9703 --75.9766 --75.9797 --75.9812 --75.9781 --75.9703 --75.9906 --75.9656 --75.9688 --75.9703 --75.9734 --75.9766 --75.9797 --75.9688 --75.975 --75.975 --75.9641 --75.9781 --75.9797 --75.9812 --75.9672 --75.9641 --75.975 --75.9672 --75.9781 --75.9781 --75.9781 --75.9797 --75.9781 --75.9797 --75.9719 --75.9703 --75.975 --75.9703 --75.9781 --75.9656 --75.9688 --75.9656 --75.9797 --75.9703 --75.975 --75.9719 --75.9688 --75.9578 --75.9703 --75.9563 --75.9437 --75.9563 --75.9688 --75.9594 --75.9578 --75.9672 --75.9547 --75.9578 --75.9578 --75.9578 --75.9578 --75.9578 --75.9531 --75.9578 --75.9672 --75.9609 --75.9484 --75.9484 --75.9547 --75.9578 --75.9703 --75.9703 --75.9531 --75.9688 --75.9563 --75.95 --75.9609 --75.9703 --75.9703 --75.9516 --75.9688 --75.9703 --75.9703 --75.9578 --75.9766 --75.9609 --75.9703 --75.9594 --75.9734 --75.9797 --75.9641 --75.9781 --75.9812 --75.975 --75.9625 --75.9828 --75.9672 --75.9797 --75.9641 --75.9609 --75.9734 --75.9781 --75.9672 --75.9625 --75.9672 --75.9703 --75.9578 --75.9641 --75.9672 --75.9547 --75.9594 --75.9594 --75.9547 --75.9531 --75.9609 --75.9609 --75.9484 --75.9437 --75.9625 --75.9547 --75.9563 --75.9656 --75.9656 --75.9453 --75.9609 --75.9516 --75.9531 --75.9516 --75.9484 --75.95 --75.9625 --75.9437 --75.9453 --75.9672 --75.975 --75.9594 --75.9656 --75.9641 --75.9531 --75.9609 --75.9516 --75.9516 --75.9656 --75.9484 --75.9719 --75.9594 --75.9437 --75.95 --75.9453 --75.9406 --75.9375 --75.9391 --75.95 --75.95 --75.9594 --75.9516 --75.9328 --75.9484 --75.9594 --75.9625 --75.9563 --75.9531 --75.9469 --75.95 --75.9469 --75.9547 --75.9484 --75.9563 --75.9625 --75.9547 --75.9641 --75.975 --75.975 --75.9703 --75.9563 --75.9625 --75.9563 --75.9625 --75.9656 --75.9594 --75.9563 --75.9516 --75.9594 --75.9516 --75.9672 --75.9578 --75.9563 --75.9625 --75.9594 --75.9578 --75.9531 --75.9484 --75.9516 --75.9656 --75.9484 --75.9547 --75.9563 --75.9609 --75.9781 --75.9609 --75.9672 --75.9656 --75.9672 --75.9641 --75.9563 --75.9547 --75.9609 --75.9484 --75.9609 --75.9672 --75.9578 --75.9719 --75.9766 --75.9812 --75.9578 --75.9688 --75.9766 --75.9594 --75.9547 --75.9641 --75.9688 --75.9656 --75.9563 --75.9641 --75.9766 --75.975 --75.9625 --75.9625 --75.9766 --75.9563 --75.9609 --75.9594 --75.9734 --75.9734 --75.9812 --75.9578 --75.9688 --75.9594 --75.9703 --75.9703 --75.9641 --75.9719 --75.9797 --75.9719 --75.9781 --75.9656 --75.9516 --75.9656 --75.9594 --75.9719 --75.9609 --75.9609 --75.975 --75.9703 --75.9625 --75.9609 --75.9703 --75.975 --75.9656 --75.9875 --75.9672 --75.975 --75.9766 --75.9594 --75.9609 --75.975 --75.975 --75.9609 --75.9547 --75.9719 --75.9547 --75.9672 --75.9594 --75.9578 --75.9594 --75.9797 --75.9656 --75.9812 --75.9703 --75.9672 --75.9656 --75.9609 --75.9688 --75.9609 --75.9563 --75.9719 --75.9766 --75.9641 --75.9672 --75.9641 --75.9766 --75.9625 --75.9812 --75.9672 --75.975 --75.9781 --75.9703 --75.9703 --75.9641 --75.9766 --75.9625 --75.9625 --75.9594 --75.9719 --75.9688 --75.9672 --75.9531 --75.9703 --75.9594 --75.9594 --75.9688 --75.9672 --75.9734 --75.9688 --75.9656 --75.9781 --75.9703 --75.9641 --75.9656 --75.9609 --75.9625 --75.975 --75.9781 --75.975 --75.9812 --75.9672 --75.9672 --75.9672 --75.9625 --75.9797 --75.9719 --75.9672 --75.975 --75.9734 --75.9719 --75.9719 --75.9672 --75.9766 --75.9734 --75.9781 --75.9734 --75.9734 --75.9766 --75.9781 --75.9781 --75.9672 --75.9734 --75.9797 --75.9781 --75.9719 --75.9719 --75.975 --75.9766 --75.9625 --75.9734 --75.9719 --75.9641 --75.9609 --75.9578 --75.9594 --75.9703 --75.9844 --75.9719 --75.9719 --75.9734 --75.9719 --75.9734 --75.975 --75.9688 --75.9781 --75.9594 --75.9641 --75.9703 --75.9688 --75.9641 --75.9766 --75.9828 --75.9719 --75.9719 --75.9734 --75.9719 --75.9828 --75.9812 --75.9781 --75.975 --75.9641 --75.9797 --75.9688 --75.9781 --75.9828 --75.9906 --75.9859 --75.9719 --75.9734 --75.9828 --75.9875 --75.9938 --75.9734 --75.9875 --75.9766 --75.9766 --75.9719 --75.9859 --75.9672 --75.9797 --75.9844 --75.9781 --75.9906 --75.9875 --75.9859 --75.9797 --75.9859 --75.9547 --75.9719 --75.9641 --75.9656 --75.9812 --75.975 --75.9812 --75.9828 --75.9828 --75.9766 --75.9734 --75.9859 --75.9641 --75.9609 --75.9641 --75.9641 --75.9703 --75.9812 --75.9641 --75.9578 --75.9812 --75.9781 --75.9609 --75.9656 --75.9688 --75.9719 --75.9625 --75.9563 --75.9688 --75.9734 --75.975 --75.9781 --75.9656 --75.9672 --75.9641 --75.9734 --75.9703 --75.9781 --75.9688 --75.9641 --75.9641 --75.9609 --75.9672 --75.9641 --75.9656 --75.9625 --75.9672 --75.9578 --75.9625 --75.9734 --75.9656 --75.9563 --75.9625 --75.9563 --75.9703 --75.9531 --75.9594 --75.9734 --75.9672 --75.9859 --75.9688 --75.9594 --75.9563 --75.9609 --75.9547 --75.9625 --75.9781 --75.9578 --75.9844 --75.9766 --75.9719 --75.9688 --75.9719 --75.9844 --75.9781 --75.9734 --75.9594 --75.9719 --75.9781 --75.9703 --75.9703 --75.9656 --75.9656 --75.975 --75.9672 --75.9641 --75.9703 --75.975 --75.9688 --75.975 --75.9688 --75.9578 --75.9594 --75.9688 --75.9812 --75.9797 --75.9828 --75.9875 --75.9703 --75.975 --75.9516 --75.9703 --75.9594 --75.9625 --75.9641 --75.9672 --75.9828 --75.9844 --75.9766 --75.9734 --75.9781 --75.9797 --75.9656 --75.975 --75.9734 --75.9828 --75.9703 --75.9547 --75.9703 --75.9594 --75.9578 --75.9594 --75.9672 --75.9859 --75.9734 --75.9719 --75.9734 --75.9688 --75.9688 --75.9766 --75.9703 --75.975 --75.975 --75.9797 --75.9766 --75.9734 --75.9875 --75.9703 --75.9797 --75.9906 --75.9828 --75.9797 --75.9812 --75.975 --75.9734 --75.9672 --75.975 --75.9688 --75.9547 --75.9719 --75.9859 --75.9828 --75.9672 --75.9688 --75.9859 --75.9734 --75.9828 --75.9844 --75.9672 --75.9797 --75.975 --75.9859 --75.9922 --75.9891 --75.9766 --75.9828 --75.9734 --75.9609 --75.9828 --75.9859 --75.9859 --75.9844 --76 --75.9766 --75.9797 --75.9672 --75.9812 --75.9781 --75.975 --75.975 --75.9703 --75.9812 --75.9891 --75.9875 --75.9797 --75.9906 --75.9828 --75.9844 --75.9844 --75.9938 --75.9766 --75.9797 --75.9859 --75.9906 --75.9797 --75.9875 --75.9797 --75.9703 --75.9844 --75.9859 --75.9875 --75.9875 --75.975 --75.9969 --75.9734 --75.9906 --75.9891 --75.9859 --75.9844 --75.9812 --75.975 --75.9812 --75.9781 --75.9812 --75.9781 --75.9766 --75.9859 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.9828 --75.9703 --75.975 --75.9641 --75.9641 --75.9547 --75.9719 --75.95 --75.9625 --75.975 --75.9563 --75.9672 --75.9594 --75.9672 --75.9594 --75.9672 --75.9734 --75.95 --75.9734 --75.9766 --75.95 --75.9766 --75.9719 --75.9531 --75.9547 --75.9625 --75.9672 --75.9625 --75.9703 --75.9812 --75.9766 --75.9547 --75.9641 --75.9578 --75.9672 --75.9578 --75.9797 --75.9703 --75.9578 --75.9609 --75.9625 --75.9563 --75.9688 --75.9609 --75.9656 --75.9672 --75.9625 --75.9484 --75.9547 --75.9547 --75.9484 --75.9656 --75.9625 --75.9609 --75.9578 --75.9688 --75.9547 --75.9703 --75.9563 --75.9563 --75.9609 --75.9437 --75.9703 --75.9672 --75.9578 --75.9578 --75.9641 --75.9563 --75.9656 --75.95 --75.9547 --75.9688 --75.95 --75.9656 --75.9625 --75.9563 --75.9563 --75.9547 --75.9484 --75.9609 --75.9594 --75.9609 --75.9578 --75.9531 --75.9672 --75.9609 --75.9469 --75.9656 --75.9625 --75.9578 --75.9531 --75.9484 --75.9703 --75.9656 --75.9672 --75.9656 --75.9656 --75.9437 --75.9594 --75.95 --75.9516 --75.9641 --75.9641 --75.9656 --75.9703 --75.975 --75.9672 --75.9594 --75.9703 --75.9578 --75.9844 --75.9719 --75.9672 --75.9656 --75.95 --75.9656 --75.9766 --75.9656 --75.9688 --75.9812 --75.9672 --75.9656 --75.9734 --75.9672 --75.9516 --75.9656 --75.9641 --75.9625 --75.9688 --75.9719 --75.9578 --75.9656 --75.975 --75.9688 --75.9688 --75.9672 --75.9781 --75.9516 --75.9547 --75.9625 --75.975 --75.9547 --75.9656 --75.9594 --75.9672 --75.9766 --75.9719 --75.9766 --75.9641 --75.9703 --75.9688 --75.9547 --75.9672 --75.9609 --75.9656 --75.9625 --75.975 --75.9703 --75.9625 --75.9641 --75.9609 --75.9703 --75.9688 --75.9672 --75.9672 --75.975 --75.9828 --75.9688 --75.9641 --75.9578 --75.9719 --75.9734 --75.9656 --75.9703 --75.9609 --75.9734 --75.9578 --75.9703 --75.9688 --75.9734 --75.9625 --75.9688 --75.9734 --75.9703 --75.9719 --75.9594 --75.9609 --75.9609 --75.9641 --75.9625 --75.9703 --75.9563 --75.9594 --75.9531 --75.9734 --75.9547 --75.9688 --75.9734 --75.9766 --75.9641 --75.9672 --75.9797 --75.9703 --75.9688 --75.9531 --75.9578 --75.9609 --75.9594 --75.9437 --75.9578 --75.9688 --75.9578 --75.9594 --75.9641 --75.9656 --75.9578 --75.9453 --75.9641 --75.9578 --75.9484 --75.9625 --75.9578 --75.9484 --75.9594 --75.9484 --75.9578 --75.9547 --75.95 --75.9531 --75.9391 --75.9563 --75.9609 --75.9594 --75.9656 --75.9672 --75.9594 --75.9625 --75.9641 --75.9703 --75.9609 --75.9688 --75.9547 --75.9547 --75.9547 --75.9469 --75.9578 --75.9625 --75.9531 --75.9484 --75.95 --75.9688 --75.9547 --75.9484 --75.9547 --75.9641 --75.9422 --75.9422 --75.9594 --75.9656 --75.9563 --75.9453 --75.9516 --75.9641 --75.9656 --75.9547 --75.9547 --75.9516 --75.9641 --75.9609 --75.9516 --75.9563 --75.95 --75.9453 --75.9484 --75.9484 --75.9359 --75.9406 --75.9578 --75.9359 --75.9516 --75.9516 --75.9547 --75.9531 --75.9641 --75.9531 --75.9578 --75.9563 --75.95 --75.9547 --75.9641 --75.9391 --75.95 --75.9547 --75.9469 --75.9516 --75.9484 --75.9328 --75.9563 --75.9391 --75.9516 --75.9437 --75.9313 --75.9516 --75.9578 --75.9516 --75.9578 --75.9531 --75.9641 --75.9516 --75.9641 --75.9578 --75.9703 --75.9641 --75.9625 --75.9641 --75.9656 --75.9594 --75.9578 --75.9594 --75.95 --75.9703 --75.9547 --75.9656 --75.9563 --75.9625 --75.9672 --75.9531 --75.9469 --75.9688 --75.9594 --75.9594 --75.9469 --75.9609 --75.9516 --75.95 --75.9437 --75.9609 --75.9672 --75.9484 --75.9531 --75.9563 --75.9469 --75.9516 --75.95 --75.9656 --75.9484 --75.9688 --75.9531 --75.9672 --75.9516 --75.9531 --75.9656 --75.9578 --75.9625 --75.9609 --75.95 --75.9563 --75.9547 --75.9484 --75.9594 --75.9531 --75.9594 --75.9531 --75.9469 --75.9594 --75.9578 --75.9469 --75.9531 --75.9563 --75.9547 --75.9516 --75.9516 --75.9516 --75.9453 --75.9469 --75.9563 --75.9625 --75.9484 --75.9641 --75.9563 --75.9484 --75.9516 --75.9484 --75.9547 --75.9672 --75.95 --75.9453 --75.9453 --75.9625 --75.9641 --75.9609 --75.9547 --75.9625 --75.9594 --75.9688 --75.9547 --75.9703 --75.9578 --75.9672 --75.9484 --75.9453 --75.9609 --75.9453 --75.9563 --75.9578 --75.95 --75.95 --75.9531 --75.9547 --75.9531 --75.9563 --75.9516 --75.9625 --75.9484 --75.95 --75.9641 --75.9406 --75.9391 --75.9484 --75.9484 --75.9344 --75.9437 --75.9391 --75.9406 --75.95 --75.9531 --75.9484 --75.9422 --75.9391 --75.9516 --75.9484 --75.95 --75.9625 --75.9531 --75.9422 --75.9609 --75.9375 --75.9344 --75.9266 --75.9625 --75.9375 --75.9484 --75.9578 --75.9391 --75.95 --75.9484 --75.95 --75.9531 --75.9688 --75.9469 --75.9484 --75.9437 --75.9516 --75.9437 --75.9609 --75.9484 --75.9484 --75.9609 --75.9406 --75.9563 --75.9469 --75.9453 --75.9406 --75.9625 --75.9531 --75.9547 --75.9391 --75.9422 --75.9578 --75.9484 --75.9547 --75.9516 --75.9547 --75.9531 --75.9547 --75.9609 --75.9484 --75.9516 --75.9594 --75.9469 --75.9453 --75.9516 --75.9578 --75.9391 --75.9547 --75.9578 --75.9484 --75.9484 --75.95 --75.9547 --75.9547 --75.9484 --75.9422 --75.9563 --75.9547 --75.9375 --75.9469 --75.9547 --75.9563 --75.9563 --75.9469 --75.95 --75.9609 --75.9594 --75.9437 --75.9453 --75.9609 --75.9328 --75.9406 --75.9266 --75.9516 --75.9484 --75.9453 --75.9437 --75.9453 --75.9359 --75.9297 --75.9328 --75.925 --75.9359 --75.9422 --75.9359 --75.9484 --75.9531 --75.9484 --75.9297 --75.9531 --75.9359 --75.95 --75.9437 --75.9484 --75.9453 --75.9406 --75.9422 --75.9437 --75.9484 --75.9437 --75.9375 --75.9391 --75.95 --75.9453 --75.9516 --75.95 --75.9531 --75.9516 --75.9547 --75.9563 --75.9484 --75.9641 --75.9469 --75.9484 --75.9422 --75.9484 --75.9516 --75.9625 --75.95 --75.9437 --75.9469 --75.9578 --75.9516 --75.9563 --75.9594 --75.9578 --75.9578 --75.9266 --75.9469 --75.9563 --75.9469 --75.9625 --75.9547 --75.9578 --75.9516 --75.9578 --75.9406 --75.9516 --75.9594 --75.9641 --75.9578 --75.9656 --75.9734 --75.9625 --75.9656 --75.9547 --75.9563 --75.9578 --75.9656 --75.9531 --75.9547 --75.9516 --75.9531 --75.9406 --75.95 --75.95 --75.9437 --75.9484 --75.9516 --75.9563 --75.9391 --75.9422 --75.9453 --75.9469 --75.9594 --75.9422 --75.9484 --75.9609 --75.9531 --75.9547 --75.9563 --75.9547 --75.9547 --75.9484 --75.9609 --75.9594 --75.9547 --75.9609 --75.9609 --75.9516 --75.9437 --75.9453 --75.9437 --75.9453 --75.9422 --75.9484 --75.9469 --75.9594 --75.9406 --75.9609 --75.9484 --75.9437 --75.95 --75.9625 --75.9594 --75.9531 --75.9531 --75.9578 --75.9641 --75.9469 --75.9563 --75.9594 --75.9656 --75.9609 --75.9453 --75.9422 --75.9422 --75.9469 --75.9578 --75.95 --75.9578 --75.9625 --75.9578 --75.9547 --75.9719 --75.9594 --75.9578 --75.9656 --75.9609 --75.9641 --75.9547 --75.9484 --75.9594 --75.9625 --75.9641 --75.9484 --75.9437 --75.9422 --75.9563 --75.9469 --75.9453 --75.9563 --75.9578 --75.9469 --75.95 --75.9391 --75.9453 --75.9563 --75.9563 --75.9672 --75.9578 --75.9359 --75.9594 --75.9516 --75.9469 --75.9406 --75.9594 --75.9531 --75.95 --75.9453 --75.9656 --75.9672 --75.9484 --75.9484 --75.95 --75.9578 --75.9375 --75.9422 --75.9516 --75.9484 --75.95 --75.9453 --75.9578 --75.9484 --75.9484 --75.9484 --75.9484 --75.9469 --75.9359 --75.9391 --75.9344 --75.9406 --75.9453 --75.9563 --75.95 --75.9406 --75.9547 --75.95 --75.9469 --75.9313 --75.9484 --75.9453 --75.9313 --75.9344 --75.9422 --75.9578 --75.9422 --75.9531 --75.9516 --75.9531 --75.9547 --75.9625 --75.9531 --75.9469 --75.9453 --75.9531 --75.9547 --75.9516 --75.9594 --75.9563 --75.9391 --75.9453 --75.9563 --75.9578 --75.9375 --75.9531 --75.9469 --75.9453 --75.9453 --75.9531 --75.9531 --75.9328 --75.9359 --75.9437 --75.9344 --75.9563 --75.9359 --75.9422 --75.9469 --75.9422 --75.9313 --75.9375 --75.9313 --75.9344 --75.9422 --75.9391 --75.9359 --75.9391 --75.9406 --75.9453 --75.9313 --75.9391 --75.9469 --75.9437 --75.9297 --75.9406 --75.9437 --75.9469 --75.9375 --75.9484 --75.9563 --75.9391 --75.9453 --75.925 --75.9344 --75.9406 --75.9391 --75.9547 --75.9359 --75.9516 --75.9484 --75.9531 --75.9641 --75.9484 --75.9609 --75.9422 --75.9469 --75.9375 --75.9453 --75.9484 --75.95 --75.9641 --75.9359 --75.9422 --75.9453 --75.9516 --75.9297 --75.9531 --75.9469 --75.9609 --75.9391 --75.9484 --75.9344 --75.9563 --75.9547 --75.9594 --75.9484 --75.9547 --75.9422 --75.9453 --75.9734 --75.9625 --75.9563 --75.9547 --75.9578 --75.9656 --75.9609 --75.9422 --75.9531 --75.9609 --75.9563 --75.9484 --75.9516 --75.95 --75.9656 --75.9484 --75.9437 --75.9625 --75.9422 --75.9531 --75.9406 --75.9563 --75.9422 --75.9437 --75.9453 --75.9453 --75.9453 --75.9422 --75.9359 --75.9469 --75.9359 --75.9406 --75.9453 --75.9359 --75.9469 --75.9609 --75.9344 --75.9359 --75.9516 --75.9437 --75.9344 --75.9531 --75.9328 --75.9437 --75.9406 --75.95 --75.9469 --75.9547 --75.9469 --75.9375 --75.9594 --75.95 --75.9469 --75.95 --75.9484 --75.9516 --75.95 --75.9422 --75.9437 --75.9469 --75.9484 --75.9469 --75.9531 --75.9578 --75.9688 --75.95 --75.9516 --75.9422 --75.9484 --75.9547 --75.9313 --75.9422 --75.9484 --75.9266 --75.9281 --75.9547 --75.9563 --75.9328 --75.9375 --75.9422 --75.9328 --75.9313 --75.9484 --75.9437 --75.9375 --75.9375 --75.9391 --75.9359 --75.9391 --75.9328 --75.9469 --75.9344 --75.9344 --75.9484 --75.9328 --75.9344 --75.9437 --75.9313 --75.9453 --75.9391 --75.9406 --75.9547 --75.9375 --75.9437 --75.9469 --75.9328 --75.9266 --75.9359 --75.9437 --75.9328 --75.9359 --75.9391 --75.9375 --75.9484 --75.9375 --75.9391 --75.9453 --75.9422 --75.9375 --75.9375 --75.9266 --75.9422 --75.9422 --75.9422 --75.9563 --75.9359 --75.9313 --75.9344 --75.9391 --75.925 --75.9344 --75.9344 --75.9297 --75.9375 --75.9453 --75.9516 --75.9375 --75.9391 --75.9406 --75.9203 --75.9344 --75.9422 --75.9406 --75.9375 --75.9391 --75.9375 --75.9344 --75.9266 --75.9281 --75.9344 --75.9422 --75.9359 --75.9406 --75.9484 --75.9359 --75.9516 --75.9437 --75.9469 --75.95 --75.9547 --75.95 --75.9469 --75.9422 --75.95 --75.9484 --75.9531 --75.9531 --75.9469 --75.9531 --75.95 --75.9453 --75.9531 --75.9484 --75.9469 --75.9516 --75.9672 --75.9281 --75.9453 --75.9563 --75.9422 --75.9609 --75.9453 --75.9516 --75.9422 --75.9625 --75.9406 --75.9437 --75.9344 --75.9375 --75.9375 --75.9359 --75.9453 --75.9437 --75.9391 --75.9437 --75.9375 --75.9328 --75.9453 --75.9437 --75.9516 --75.9453 --75.9453 --75.9344 --75.9344 --75.9406 --75.95 --75.9547 --75.9469 --75.9563 --75.9578 --75.9484 --75.9578 --75.9484 --75.9516 --75.9328 --75.9578 --75.9375 --75.9531 --75.9578 --75.9437 --75.9531 --75.9625 --75.9484 --75.925 --75.9391 --75.9484 --75.9578 --75.9547 --75.9422 --75.9422 --75.95 --75.9469 --75.9453 --75.9437 --75.9422 --75.9531 --75.9453 --75.9547 --75.9516 --75.9359 --75.9391 --75.9406 --75.9406 --75.9406 --75.9453 --75.9375 --75.9563 --75.9391 --75.9516 --75.9437 --75.9484 --75.9547 --75.9313 --75.9531 --75.9563 --75.9375 --75.9375 --75.925 --75.9172 --75.9453 --75.9422 --75.9437 --75.9422 --75.9437 --75.9344 --75.9328 --75.9437 --75.9422 --75.9359 --75.9406 --75.9375 --75.9375 --75.9406 --75.9375 --75.9594 --75.9484 --75.9516 --75.9359 --75.9391 --75.9484 --75.9313 --75.9344 --75.9359 --75.9281 --75.9391 --75.9359 --75.9328 --75.9328 --75.9406 --75.9484 --75.9359 --75.9344 --75.9297 --75.9297 --75.9328 --75.9313 --75.9422 --75.9234 --75.9219 --75.9281 --75.9234 --75.9328 --75.925 --75.9234 --75.9266 --75.9359 --75.9359 --75.9281 --75.9422 --75.9328 --75.9531 --75.9313 --75.9344 --75.9422 --75.9219 --75.9297 --75.9437 --75.9437 --75.9375 --75.9375 --75.9328 --75.9391 --75.9281 --75.9328 --75.9344 --75.9328 --75.9422 --75.9297 --75.9453 --75.9328 --75.9313 --75.9453 --75.9391 --75.9422 --75.9391 --75.9391 --75.9359 --75.9516 --75.9453 --75.9406 --75.9547 --75.9406 --75.9406 --75.9313 --75.9453 --75.9453 --75.9516 --75.9375 --75.95 --75.9578 --75.9547 --75.9625 --75.9531 --75.9422 --75.9563 --75.9406 --75.9453 --75.95 --75.9516 --75.9531 --75.9469 --75.9469 --75.9453 --75.9516 --75.9547 --75.9437 --75.9437 --75.9406 --75.9422 --75.9234 --75.9391 --75.9391 --75.9516 --75.9422 --75.9484 --75.95 --75.9266 --75.95 --75.9484 --75.9437 --75.95 --75.9578 --75.9453 --75.9563 --75.95 --75.9453 --75.9484 --75.9469 --75.9453 --75.9313 --75.9391 --75.9453 --75.9359 --75.9422 --75.925 --75.9453 --75.9375 --75.9344 --75.9344 --75.95 --75.9328 --75.9422 --75.9375 --75.9266 --75.9406 --75.9406 --75.9516 --75.9406 --75.9531 --75.9453 --75.9375 --75.9281 --75.9453 --75.9437 --75.9187 --75.9406 --75.9266 --75.9219 --75.9187 --75.9328 --75.9422 --75.9328 --75.9422 --75.9359 --75.9422 --75.9266 --75.9406 --75.925 --75.95 --75.9422 --75.95 --75.9391 --75.9266 --75.9328 --75.9297 --75.9344 --75.9359 --75.9422 --75.9313 --75.9422 --75.9484 --75.9281 --75.9422 --75.9203 --75.9344 --75.9359 --75.9547 --75.9313 --75.9484 --75.9469 --75.9469 --75.9437 --75.9453 --75.9328 --75.9391 --75.9516 --75.9469 --75.9406 --75.9375 --75.9328 --75.9328 --75.9375 --75.9406 --75.9328 --75.9469 --75.9344 --75.95 --75.9375 --75.9406 --75.9391 --75.9453 --75.9484 --75.9266 --75.9453 --75.9375 --75.9484 --75.9391 --75.9422 --75.9437 --75.9484 --75.9516 --75.9484 --75.9313 --75.9391 --75.9391 --75.925 --75.9344 --75.9406 --75.9469 --75.9328 --75.9484 --75.9422 --75.9453 --75.9594 --75.9484 --75.9484 --75.9578 --75.9422 --75.9625 --75.9641 --75.9469 --75.9547 --75.9406 --75.9578 --75.9484 --75.9516 --75.9422 --75.9391 --75.9484 --75.9375 --75.9484 --75.9484 --75.9406 --75.9531 --75.9375 --75.9406 --75.95 --75.9656 --75.9313 --75.9484 --75.9484 --75.9422 --75.9391 --75.9547 --75.9437 --75.9406 --75.9437 --75.9594 --75.9484 --75.9391 --75.9641 --75.9531 --75.9437 --75.9391 --75.9531 --75.9391 --75.9578 --75.9375 --75.9359 --75.9516 --75.9266 --75.9453 --75.9359 --75.9375 --75.9359 --75.9344 --75.9375 --75.9484 --75.9359 --75.9297 --75.9344 --75.9172 --75.9359 --75.9359 --75.9234 --75.9375 --75.9313 --75.9172 --75.9234 --75.9187 --75.925 --75.9344 --75.9281 --75.9281 --75.9187 --75.9266 --75.9359 --75.925 --75.9266 --75.9484 --75.9297 --75.9344 --75.9453 --75.9406 --75.9359 --75.9344 --75.9313 --75.9219 --75.9344 --75.9281 --75.9313 --75.9297 --75.9313 --75.9313 --75.9094 --75.9437 --75.9281 --75.9281 --75.9281 --75.9344 --75.925 --75.9328 --75.9313 --75.9297 --75.9281 --75.9187 --75.9391 --75.9281 --75.9406 --75.9375 --75.9328 --75.9344 --75.9437 --75.925 --75.9437 --75.9297 --75.9406 --75.9281 --75.9422 --75.9469 --75.9406 --75.9266 --75.9281 --75.9281 --75.9297 --75.9266 --75.9328 --75.9375 --75.9344 --75.9313 --75.9453 --75.9359 --75.9313 --75.9391 --75.9484 --75.9375 --75.9313 --75.9203 --75.9375 --75.9313 --75.9375 --75.9469 --75.9344 --75.9375 --75.9297 --75.9422 --75.9422 --75.9563 --75.9375 --75.9266 --75.9391 --75.9359 --75.9375 --75.9422 --75.9453 --75.9437 --75.9328 --75.9422 --75.9391 --75.9406 --75.9484 --75.9359 --75.9437 --75.9281 --75.9437 --75.9563 --75.9281 --75.95 --75.9406 --75.9406 --75.9437 --75.9297 --75.9453 --75.9344 --75.9359 --75.9328 --75.9328 --75.9359 --75.9406 --75.9328 --75.9359 --75.9344 --75.9359 --75.9359 --75.9344 --75.9297 --75.9359 --75.9297 --75.9344 --75.9203 --75.9359 --75.9203 --75.9203 --75.9234 --75.9234 --75.9266 --75.9484 --75.9313 --75.9391 --75.9406 --75.9437 --75.9406 --75.9281 --75.9359 --75.9406 --75.9531 --75.9484 --75.9406 --75.9422 --75.9391 --75.925 --75.9437 --75.9406 --75.9453 --75.9313 --75.9422 --75.9422 --75.9313 --75.9484 --75.9281 --75.9266 --75.9359 --75.9391 --75.9375 --75.9375 --75.9125 --75.9313 --75.925 --75.9219 --75.9187 --75.9297 --75.9156 --75.9422 --75.925 --75.9281 --75.9172 --75.9328 --75.925 --75.9156 --75.9172 --75.9281 --75.9281 --75.9203 --75.9266 --75.9172 --75.9328 --75.925 --75.9344 --75.9187 --75.9281 --75.9125 --75.9187 --75.9453 --75.9172 --75.9219 --75.9141 --75.9094 --75.9141 --75.9313 --75.9313 --75.9328 --75.9234 --75.9203 --75.9234 --75.9203 --75.9187 --75.9297 --75.9203 --75.9297 --75.9187 --75.9172 --75.9234 --75.9219 --75.9156 --75.9187 --75.9203 --75.925 --75.9109 --75.9219 --75.9125 --75.9375 --75.9266 --75.9203 --75.925 --75.9172 --75.9187 --75.9219 --75.9344 --75.925 --75.9313 --75.9266 --75.925 --75.925 --75.9266 --75.9203 --75.925 --75.9203 --75.9203 --75.9219 --75.9437 --75.9328 --75.925 --75.9187 --75.9281 --75.9234 --75.9266 --75.9281 --75.9266 --75.9328 --75.9375 --75.9406 --75.9328 --75.9328 --75.9203 --75.9375 --75.9344 --75.9266 --75.9391 --75.9297 --75.9297 --75.9328 --75.9469 --75.9344 --75.9313 --75.9234 --75.9281 --75.9453 --75.9281 --75.925 --75.9297 --75.9281 --75.9187 --75.9328 --75.925 --75.9281 --75.9328 --75.9516 --75.9391 --75.9469 --75.9391 --75.9359 --75.9391 --75.9344 --75.9406 --75.9297 --75.9359 --75.9203 --75.9219 --75.9359 --75.9266 --75.9219 --75.9281 --75.9391 --75.9234 --75.9359 --75.9437 --75.9328 --75.9313 --75.9281 --75.9281 --75.9328 --75.9297 --75.9234 --75.9359 --75.925 --75.925 --75.9344 --75.9344 --75.9391 --75.9219 --75.9313 --75.925 --75.9359 --75.9359 --75.9313 --75.9344 --75.9266 --75.9313 --75.9281 --75.9234 --75.9219 --75.925 --75.9375 --75.9281 --75.9266 --75.9344 --75.9484 --75.9234 --75.9328 --75.9297 --75.9328 --75.9375 --75.9328 --75.9266 --75.9313 --75.9328 --75.925 --75.9328 --75.9281 --75.925 --75.9094 --75.9422 --75.9234 --75.9234 --75.9281 --75.9406 --75.9328 --75.925 --75.9141 --75.9391 --75.9297 --75.9203 --75.9391 --75.9219 --75.9344 --75.9328 --75.9266 --75.9297 --75.9344 --75.9328 --75.9469 --75.925 --75.9234 --75.9297 --75.95 --75.9484 --75.9453 --75.9375 --75.9453 --75.9484 --75.9422 --75.9391 --75.9328 --75.9375 --75.9344 --75.9344 --75.9359 --75.9422 --75.9328 --75.9281 --75.9203 --75.925 --75.9313 --75.9359 --75.9437 --75.9297 --75.9437 --75.9266 --75.9406 --75.9469 --75.9391 --75.9359 --75.9172 --75.9375 --75.9406 --75.9406 --75.9328 --75.9344 --75.9297 --75.9344 --75.9375 --75.9391 --75.9391 --75.9453 --75.9375 --75.9203 --75.9406 --75.9406 --75.9281 --75.925 --75.9328 --75.9297 --75.9281 --75.9359 --75.9437 --75.9313 --75.9375 --75.9391 --75.9516 --75.9281 --75.9375 --75.9391 --75.9469 --75.9313 --75.9391 --75.9469 --75.9516 --75.9469 --75.9406 --75.9328 --75.9375 --75.9453 --75.9344 --75.9578 --75.9484 --75.9422 --75.9344 --75.9328 --75.9297 --75.9219 --75.9547 --75.9313 --75.9437 --75.9203 --75.9391 --75.9297 --75.9297 --75.9437 --75.95 --75.9375 --75.9281 --75.9344 --75.9328 --75.9266 --75.9203 --75.9297 --75.9297 --75.9297 --75.9266 --75.925 --75.9281 --75.9344 --75.9234 --75.9313 --75.9391 --75.9313 --75.9375 --75.95 --75.9437 --75.9359 --75.9391 --75.9234 --75.9344 --75.9313 --75.9484 --75.9344 --75.9406 --75.9187 --75.9328 --75.9297 --75.9375 --75.9437 --75.9344 --75.9266 --75.9281 --75.9437 --75.9359 --75.9313 --75.9313 --75.9266 --75.9219 --75.9391 --75.9281 --75.9297 --75.9219 --75.9266 --75.9406 --75.925 --75.9297 --75.9406 --75.9391 --75.9172 --75.9391 --75.9359 --75.9344 --75.9234 --75.925 --75.9313 --75.9172 --75.9219 --75.9266 --75.925 --75.9344 --75.9172 --75.9203 --75.9187 --75.9281 --75.9219 --75.925 --75.9156 --75.9297 --75.9313 --75.9234 --75.9234 --75.9125 --75.9297 --75.9281 --75.9187 --75.9266 --75.9281 --75.9406 --75.9406 --75.9375 --75.9219 --75.9328 --75.9313 --75.9219 --75.9172 --75.9297 --75.9203 --75.9219 --75.9172 --75.9156 --75.9172 --75.9062 --75.9203 --75.9109 --75.9016 --75.9094 --75.9031 --75.9219 --75.9141 --75.9219 --75.9281 --75.9187 --75.9078 --75.9156 --75.9219 --75.9281 --75.9328 --75.9156 --75.9187 --75.9375 --75.9078 --75.9172 --75.9297 --75.9406 --75.9203 --75.9234 --75.9234 --75.9156 --75.9078 --75.9062 --75.9047 --75.9219 --75.9234 --75.9062 --75.9141 --75.9219 --75.9172 --75.9234 --75.9031 --75.9219 --75.9281 --75.9156 --75.9156 --75.9125 --75.9125 --75.9125 --75.9078 --75.9203 --75.9016 --75.9109 --75.9187 --75.9141 --75.9031 --75.9109 --75.9234 --75.9391 --75.9156 --75.9125 --75.9219 --75.9219 --75.9062 --75.9266 --75.9125 --75.9172 --75.925 --75.9031 --75.9203 --75.9141 --75.9297 --75.9094 --75.9187 --75.9203 --75.9187 --75.9172 --75.925 --75.9109 --75.9297 --75.9172 --75.9031 --75.9125 --75.925 --75.9359 --75.9203 --75.9156 --75.9219 --75.9172 --75.9437 --75.9203 --75.9266 --75.9125 --75.9172 --75.9141 --75.9359 --75.9234 --75.9266 --75.9016 --75.9141 --75.9156 --75.9109 --75.9156 --75.9172 --75.9141 --75.9203 --75.9141 --75.9203 --75.9172 --75.9156 --75.9219 --75.9219 --75.9187 --75.9187 --75.9187 --75.9234 --75.9266 --75.9234 --75.9125 --75.9281 --75.9078 --75.9062 --75.9219 --75.9125 --75.9156 --75.9125 --75.9109 --75.9219 --75.9156 --75.9172 --75.9094 --75.9172 --75.9109 --75.9156 --75.9125 --75.9172 --75.9141 --75.9094 --75.9187 --75.9062 --75.9266 --75.9234 --75.9234 --75.9172 --75.9187 --75.9266 --75.9375 --75.9281 --75.9219 --75.9219 --75.9344 --75.9297 --75.9234 --75.925 --75.9172 --75.9219 --75.9219 --75.9187 --75.9094 --75.9328 --75.9203 --75.9234 --75.9203 --75.9203 --75.9109 --75.9141 --75.9078 --75.9109 --75.9187 --75.9062 --75.9109 --75.9203 --75.9078 --75.925 --75.9234 --75.9281 --75.9313 --75.9281 --75.9219 --75.9266 --75.9172 --75.9297 --75.9156 --75.9281 --75.9297 --75.9234 --75.9359 --75.9344 --75.9219 --75.9109 --75.925 --75.9203 --75.9328 --75.9203 --75.9328 --75.9234 --75.9281 --75.9266 --75.9375 --75.9219 --75.9328 --75.9328 --75.9313 --75.9437 --75.9281 --75.9359 --75.9406 --75.9266 --75.9156 --75.925 --75.9313 --75.9187 --75.9109 --75.9297 --75.9219 --75.9203 --75.9203 --75.9141 --75.925 --75.9203 --75.9203 --75.9234 --75.9203 --75.9375 --75.925 --75.9344 --75.9203 --75.9234 --75.9297 --75.9266 --75.9203 --75.9187 --75.9234 --75.9234 --75.9234 --75.9234 --75.9078 --75.9422 --75.9 --75.9359 --75.925 --75.9172 --75.9266 --75.9219 --75.925 --75.9141 --75.9297 --75.9156 --75.9266 --75.9156 --75.9328 --75.9297 --75.9219 --75.9219 --75.9313 --75.9156 --75.9125 --75.925 --75.9391 --75.9344 --75.9297 --75.9187 --75.9109 --75.9266 --75.9219 --75.9281 --75.9203 --75.9297 --75.9141 --75.9109 --75.9219 --75.9156 --75.9219 --75.9156 --75.9234 --75.9219 --75.9234 --75.9187 --75.9109 --75.9031 --75.9266 --75.9172 --75.9172 --75.9234 --75.9187 --75.9219 --75.9078 --75.925 --75.9187 --75.9234 --75.9281 --75.9125 --75.925 --75.9156 --75.9266 --75.9187 --75.9297 --75.9234 --75.9281 --75.9328 --75.9281 --75.9297 --75.9281 --75.9203 --75.9203 --75.9266 --75.9234 --75.9391 --75.9219 --75.9313 --75.9375 --75.9203 --75.9359 --75.9422 --75.9125 --75.9328 --75.9297 --75.925 --75.9266 --75.9203 --75.9266 --75.9187 --75.9266 --75.9281 --75.9187 --75.9281 --75.9266 --75.9141 --75.9375 --75.9187 --75.9297 --75.9203 --75.9313 --75.9281 --75.9187 --75.9344 --75.9359 --75.9359 --75.9219 --75.9281 --75.9141 --75.9391 --75.9281 --75.9156 --75.9344 --75.9219 --75.9453 --75.9344 --75.9313 --75.9328 --75.925 --75.9359 --75.9141 --75.9203 --75.9203 --75.9141 --75.9141 --75.9281 --75.925 --75.9141 --75.9344 --75.9359 --75.9219 --75.9344 --75.9313 --75.9406 --75.9328 --75.9234 --75.9281 --75.9219 --75.9266 --75.9359 --75.9359 --75.9313 --75.9219 --75.9297 --75.9391 --75.9234 --75.9406 --75.9453 --75.9531 --75.925 --75.9437 --75.9437 --75.9219 --75.9328 --75.9234 --75.9266 --75.9234 --75.9375 --75.925 --75.9172 --75.9203 --75.9266 --75.9281 --75.9313 --75.9359 --75.9266 --75.9234 --75.9328 --75.9281 --75.9109 --75.9328 --75.925 --75.9219 --75.9219 --75.925 --75.9359 --75.9281 --75.9234 --75.9219 --75.9203 --75.9469 --75.9234 --75.9313 --75.9344 --75.925 --75.9328 --75.9359 --75.9234 --75.9328 --75.9141 --75.9266 --75.9156 --75.9375 --75.9187 --75.9219 --75.9187 --75.9219 --75.9187 --75.9219 --75.9203 --75.9375 --75.9344 --75.9313 --75.9219 --75.9313 --75.9281 --75.9234 --75.9187 --75.9281 --75.9297 --75.9172 --75.9266 --75.9219 --75.9359 --75.9281 --75.9281 --75.9328 --75.9281 --75.9234 --75.9375 --75.9406 --75.9313 --75.9281 --75.9234 --75.9328 --75.9234 --75.9219 --75.9219 --75.9187 --75.9281 --75.925 --75.9344 --75.9203 --75.925 --75.9141 --75.9172 --75.9328 --75.9156 --75.9187 --75.9156 --75.9203 --75.9219 --75.9281 --75.9281 --75.9313 --75.9141 --75.9266 --75.9328 --75.925 --75.9359 --75.9234 --75.9203 --75.9344 --75.9266 --75.9219 --75.9328 --75.9219 --75.925 --75.9328 --75.9297 --75.9328 --75.925 --75.9281 --75.925 --75.925 --75.9234 --75.9203 --75.9297 --75.9281 --75.9375 --75.9078 --75.9172 --75.9391 --75.9187 --75.9313 --75.9391 --75.9172 --75.9328 --75.9359 --75.9344 --75.9437 --75.9375 --75.9359 --75.9422 --75.9359 --75.9172 --75.9328 --75.9297 --75.9328 --75.9234 --75.9203 --75.9203 --75.9187 --75.925 --75.9187 --75.9203 --75.9297 --75.9141 --75.9266 --75.9203 --75.8969 --75.9156 --75.9078 --75.9141 --75.9156 --75.9203 --75.9172 --75.9094 --75.925 --75.9187 --75.9203 --75.9156 --75.9203 --75.9281 --75.9234 --75.9203 --75.9187 --75.9187 --75.9172 --75.9219 --75.9172 --75.9313 --75.925 --75.9156 --75.9234 --75.9391 --75.9359 --75.9141 --75.9359 --75.9203 --75.9078 --75.9234 --75.9047 --75.9172 --75.9172 --75.9219 --75.9266 --75.925 --75.9172 --75.925 --75.9297 --75.9156 --75.9109 --75.9172 --75.9297 --75.9172 --75.9156 --75.9172 --75.9125 --75.925 --75.9125 --75.9313 --75.9203 --75.9172 --75.9047 --75.9109 --75.9187 --75.9062 --75.9094 --75.9344 --75.9187 --75.9187 --75.9141 --75.9172 --75.9203 --75.9266 --75.9156 --75.9172 --75.9219 --75.9062 --75.9062 --75.9016 --75.9078 --75.9203 --75.9172 --75.9172 --75.9062 --75.9203 --75.9266 --75.9281 --75.9187 --75.9109 --75.9234 --75.9156 --75.9172 --75.9219 --75.9234 --75.9141 --75.9141 --75.9172 --75.9016 --75.9141 --75.9062 --75.9 --75.9 --75.9094 --75.9094 --75.9094 --75.9031 --75.9078 --75.9203 --75.9062 --75.9172 --75.9047 --75.8984 --75.9125 --75.9078 --75.8969 --75.9109 --75.9047 --75.9094 --75.9031 --75.9094 --75.9062 --75.9047 --75.9062 --75.9141 --75.9031 --75.9031 --75.9156 --75.9 --75.8953 --75.9047 --75.8828 --75.9078 --75.9016 --75.9172 --75.9031 --75.9125 --75.9172 --75.9047 --75.9062 --75.9125 --75.9156 --75.9156 --75.9187 --75.9187 --75.8938 --75.9125 --75.9203 --75.9078 --75.9109 --75.9266 --75.9062 --75.9125 --75.9031 --75.9141 --75.9141 --75.8969 --75.9094 --75.9141 --75.9062 --75.9062 --75.9109 --75.9156 --75.9094 --75.9078 --75.9031 --75.9 --75.9016 --75.9047 --75.9016 --75.9031 --75.9187 --75.8859 --75.8922 --75.9109 --75.9172 --75.9078 --75.9125 --75.8969 --75.9016 --75.9125 --75.8984 --75.8984 --75.8969 --75.8891 --75.9078 --75.9016 --75.9062 --75.8891 --75.9141 --75.9031 --75.9094 --75.9047 --75.8938 --75.9031 --75.9125 --75.8922 --75.9094 --75.9016 --75.8891 --75.9125 --75.8938 --75.9094 --75.9078 --75.9031 --75.8938 --75.9094 --75.9094 --75.9 --75.9031 --75.9047 --75.9 --75.8969 --75.9062 --75.8984 --75.8922 --75.8859 --75.9062 --75.8891 --75.9141 --75.9156 --75.9031 --75.9125 --75.9094 --75.9016 --75.8953 --75.9078 --75.8984 --75.8938 --75.9109 --75.8938 --75.8906 --75.9172 --75.8969 --75.9141 --75.9 --75.8984 --75.8953 --75.9016 --75.8953 --75.8922 --75.9 --75.9047 --75.9078 --75.8984 --75.9078 --75.9219 --75.9016 --75.9094 --75.9109 --75.9187 --75.9031 --75.9172 --75.9109 --75.9141 --75.9047 --75.8938 --75.9078 --75.9203 --75.9094 --75.9187 --75.9094 --75.9047 --75.9234 --75.9109 --75.9297 --75.9172 --75.9125 --75.9125 --75.8969 --75.9016 --75.9047 --75.8906 --75.9 --75.9078 --75.9047 --75.8891 --75.9062 --75.9187 --75.9141 --75.9062 --75.9078 --75.9109 --75.9047 --75.9187 --75.9141 --75.9 --75.9062 --75.9172 --75.9109 --75.9078 --75.8953 --75.9125 --75.9109 --75.9 --75.9203 --75.9016 --75.9016 --75.9016 --75.9031 --75.9109 --75.9141 --75.9141 --75.8969 --75.9031 --75.9203 --75.8984 --75.8922 --75.8969 --75.9062 --75.8875 --75.9094 --75.9016 --75.8953 --75.9078 --75.9078 --75.8984 --75.9016 --75.9109 --75.9 --75.9 --75.8906 --75.9094 --75.8984 --75.8922 --75.9031 --75.9031 --75.9016 --75.9094 --75.8891 --75.9 --75.9031 --75.9141 --75.9016 --75.9078 --75.8922 --75.9031 --75.8859 --75.8984 --75.8922 --75.8891 --75.8922 --75.8922 --75.9031 --75.8969 --75.8984 --75.9031 --75.8953 --75.9078 --75.9 --75.9078 --75.8875 --75.9094 --75.8922 --75.8938 --75.9 --75.8953 --75.9016 --75.9047 --75.8984 --75.9047 --75.8984 --75.8891 --75.9125 --75.9094 --75.9094 --75.8984 --75.9062 --75.9047 --75.8906 --75.8984 --75.9031 --75.8953 --75.9078 --75.9 --75.9109 --75.9 --75.9094 --75.8906 --75.9109 --75.9094 --75.8922 --75.8984 --75.8922 --75.8984 --75.8953 --75.9047 --75.9047 --75.9016 --75.8969 --75.9172 --75.8984 --75.9094 --75.9 --75.9016 --75.9016 --75.9109 --75.8984 --75.9109 --75.9094 --75.9125 --75.9078 --75.8984 --75.9172 --75.9234 --75.9109 --75.9172 --75.9016 --75.9109 --75.9094 --75.9109 --75.9109 --75.9187 --75.9125 --75.9141 --75.9187 --75.9062 --75.9203 --75.9109 --75.9219 --75.8984 --75.9031 --75.9141 --75.8984 --75.9031 --75.9047 --75.9109 --75.9047 --75.9078 --75.8891 --75.9031 --75.9187 --75.9219 --75.9219 --75.9094 --75.8984 --75.9156 --75.9094 --75.9078 --75.9203 --75.9187 --75.9078 --75.9109 --75.9 --75.9 --75.9109 --75.9031 --75.9062 --75.9078 --75.9156 --75.9016 --75.9109 --75.9078 --75.8953 --75.9047 --75.8922 --75.9062 --75.9016 --75.9016 --75.9016 --75.9016 --75.9047 --75.9031 --75.8953 --75.9031 --75.8891 --75.9078 --75.9062 --75.8906 --75.9141 --75.9 --75.8984 --75.8875 --75.8969 --75.9016 --75.8844 --75.9125 --75.9125 --75.9234 --75.9078 --75.9109 --75.9094 --75.8984 --75.9187 --75.8953 --75.9062 --75.9078 --75.9094 --75.9 --75.8922 --75.9016 --75.9031 --75.9031 --75.9047 --75.9047 --75.9094 --75.9187 --75.9109 --75.9078 --75.925 --75.9125 --75.9141 --75.9187 --75.9109 --75.9125 --75.9281 --75.9219 --75.9172 --75.9172 --75.9297 --75.9047 --75.9203 --75.9109 --75.9109 --75.8969 --75.9187 --75.9141 --75.9156 --75.9094 --75.9234 --75.9172 --75.9219 --75.9297 --75.9187 --75.9172 --75.925 --75.9172 --75.9062 --75.9094 --75.9078 --75.9062 --75.925 --75.9156 --75.9234 --75.925 --75.9203 --75.9187 --75.9062 --75.9078 --75.925 --75.9078 --75.9125 --75.9031 --75.9203 --75.9094 --75.9141 --75.9187 --75.9094 --75.9047 --75.9094 --75.9187 --75.9047 --75.9062 --75.9031 --75.9125 --75.9078 --75.9078 --75.9172 --75.9187 --75.9187 --75.925 --75.9141 --75.9078 --75.9125 --75.9359 --75.9187 --75.9313 --75.925 --75.9141 --75.9266 --75.9328 --75.9156 --75.9156 --75.9266 --75.925 --75.9156 --75.9109 --75.9047 --75.9047 --75.9234 --75.8969 --75.9187 --75.9125 --75.9156 --75.9156 --75.9172 --75.9203 --75.9187 --75.925 --75.8953 --75.9125 --75.9156 --75.9187 --75.9078 --75.9141 --75.9219 --75.9219 --75.9187 --75.9172 --75.9125 --75.9234 --75.9141 --75.9156 --75.9109 --75.9125 --75.9187 --75.9172 --75.9078 --75.9266 --75.9266 --75.9094 --75.9109 --75.9219 --75.9094 --75.9281 --75.9266 --75.9125 --75.9141 --75.9266 --75.9187 --75.9156 --75.9062 --75.9125 --75.9172 --75.9047 --75.9094 --75.9031 --75.9047 --75.9234 --75.9078 --75.9156 --75.9125 --75.9109 --75.9109 --75.9203 --75.9172 --75.9297 --75.9078 --75.9266 --75.9094 --75.9078 --75.9141 --75.9156 --75.9047 --75.9219 --75.9125 --75.9187 --75.9172 --75.9172 --75.9031 --75.9078 --75.9078 --75.9 --75.9094 --75.8984 --75.9094 --75.9219 --75.9187 --75.9125 --75.9156 --75.9078 --75.9109 --75.9 --75.9047 --75.8922 --75.9047 --75.9109 --75.8969 --75.8969 --75.9125 --75.8953 --75.8938 --75.9 --75.9078 --75.9109 --75.9047 --75.9047 --75.9078 --75.9125 --75.9125 --75.9047 --75.9094 --75.9031 --75.8969 --75.9031 --75.9078 --75.9078 --75.9125 --75.9016 --75.8984 --75.9 --75.8984 --75.925 --75.9047 --75.9 --75.8875 --75.8891 --75.9141 --75.8922 --75.8969 --75.8953 --75.9047 --75.8938 --75.8984 --75.8953 --75.9094 --75.8969 --75.8953 --75.9 --75.9031 --75.9 --75.9016 --75.9031 --75.8875 --75.9141 --75.8938 --75.8953 --75.9094 --75.9 --75.9031 --75.9203 --75.9016 --75.8953 --75.9031 --75.9219 --75.9047 --75.9031 --75.9016 --75.8984 --75.8938 --75.9109 --75.9031 --75.9 --75.9078 --75.9109 --75.9031 --75.8984 --75.9109 --75.9078 --75.9109 --75.9062 --75.8969 --75.9062 --75.8938 --75.9109 --75.8953 --75.9 --75.8953 --75.9016 --75.9062 --75.9 --75.9047 --75.9047 --75.8922 --75.9172 --75.9125 --75.9031 --75.9 --75.8953 --75.9125 --75.9172 --75.9203 --75.9125 --75.9078 --75.9156 --75.9203 --75.8953 --75.9125 --75.9031 --75.9156 --75.9062 --75.8953 --75.8953 --75.9031 --75.9125 --75.9141 --75.9031 --75.9062 --75.9047 --75.8969 --75.8938 --75.9016 --75.9062 --75.9 --75.9094 --75.9125 --75.9016 --75.8969 --75.9062 --75.9078 --75.9016 --75.9016 --75.9031 --75.8938 --75.9172 --75.9109 --75.8781 --75.9 --75.8859 --75.9078 --75.9125 --75.9156 --75.9016 --75.8906 --75.9078 --75.8984 --75.9 --75.9016 --75.9062 --75.9016 --75.8953 --75.9094 --75.9047 --75.9094 --75.9047 --75.8984 --75.8906 --75.9 --75.9125 --75.9047 --75.9047 --75.8969 --75.9031 --75.8969 --75.8984 --75.9016 --75.9031 --75.9031 --75.9062 --75.9141 --75.9078 --75.9062 --75.9016 --75.9 --75.9094 --75.8984 --75.9109 --75.9094 --75.9141 --75.925 --75.9062 --75.9062 --75.8953 --75.9078 --75.8969 --75.9156 --75.9078 --75.8938 --75.9172 --75.9031 --75.9 --75.9031 --75.9031 --75.9047 --75.8969 --75.9109 --75.9047 --75.9047 --75.8938 --75.9078 --75.8984 --75.9141 --75.8969 --75.9031 --75.9062 --75.9078 --75.9125 --75.9062 --75.9109 --75.9016 --75.9031 --75.9047 --75.9062 --75.9047 --75.9203 --75.9 --75.9062 --75.9031 --75.9062 --75.8984 --75.9047 --75.9031 --75.8938 --75.9062 --75.8984 --75.9219 --75.9031 --75.9062 --75.9047 --75.9 --75.9062 --75.9187 --75.9016 --75.9313 --75.9141 --75.9125 --75.9078 --75.9031 --75.9047 --75.9047 --75.9109 --75.9172 --75.9141 --75.9125 --75.925 --75.9172 --75.9187 --75.9328 --75.9234 --75.9203 --75.9125 --75.9172 --75.9109 --75.9203 --75.9094 --75.9234 --75.9094 --75.9047 --75.9125 --75.9109 --75.9016 --75.9094 --75.8984 --75.9062 --75.8938 --75.9078 --75.9047 --75.9234 --75.8938 --75.9047 --75.9172 --75.8984 --75.9094 --75.9109 --75.9156 --75.9141 --75.925 --75.9125 --75.9125 --75.9156 --75.9125 --75.9109 --75.9094 --75.9062 --75.9172 --75.925 --75.9094 --75.9156 --75.9219 --75.9016 --75.9219 --75.925 --75.9062 --75.9047 --75.9156 --75.9062 --75.9078 --75.9109 --75.8953 --75.9031 --75.9094 --75.8969 --75.9047 --75.9031 --75.9031 --75.9062 --75.8922 --75.8953 --75.9062 --75.9 --75.9 --75.8969 --75.8812 --75.8938 --75.8953 --75.9 --75.8891 --75.9016 --75.8953 --75.8938 --75.8906 --75.8938 --75.9 --75.9 --75.8969 --75.8984 --75.8625 --75.8969 --75.8953 --75.8844 --75.875 --75.8812 --75.8859 --75.8969 --75.9 --75.8844 --75.8906 --75.9109 --75.8844 --75.8938 --75.8875 --75.8938 --75.8969 --75.8891 --75.8938 --75.9 --75.8938 --75.8812 --75.8922 --75.9031 --75.8938 --75.8969 --75.8859 --75.8922 --75.8875 --75.8906 --75.8922 --75.8891 --75.8875 --75.8719 --75.8766 --75.8953 --75.8953 --75.8891 --75.8797 --75.8969 --75.8781 --75.8766 --75.8828 --75.8812 --75.8797 --75.8938 --75.8859 --75.8922 --75.8922 --75.8812 --75.8703 --75.8938 --75.875 --75.8844 --75.8922 --75.8703 --75.8984 --75.8812 --75.8781 --75.8891 --75.8906 --75.8828 --75.8812 --75.8828 --75.8875 --75.8688 --75.8938 --75.8938 --75.8812 --75.8828 --75.8812 --75.8938 --75.8859 --75.8891 --75.9 --75.8719 --75.9 --75.8859 --75.8922 --75.8953 --75.8922 --75.8938 --75.8922 --75.8984 --75.9016 --75.8984 --75.9078 --75.9062 --75.8969 --75.8906 --75.8984 --75.8953 --75.8906 --75.8938 --75.9016 --75.9031 --75.9 --75.8984 --75.8844 --75.9 --75.9016 --75.8859 --75.8953 --75.8828 --75.8984 --75.9 --75.8953 --75.8906 --75.8859 --75.8922 --75.8953 --75.9031 --75.8844 --75.8875 --75.8875 --75.8906 --75.8922 --75.8922 --75.8969 --75.8906 --75.8938 --75.8938 --75.8906 --75.8984 --75.8938 --75.9047 --75.9047 --75.9047 --75.8984 --75.9 --75.8953 --75.9031 --75.9047 --75.8875 --75.9125 --75.8953 --75.9109 --75.9062 --75.9 --75.9094 --75.9 --75.8859 --75.8938 --75.9047 --75.8969 --75.9016 --75.9016 --75.9031 --75.8891 --75.9078 --75.8922 --75.8938 --75.9031 --75.9109 --75.8938 --75.8984 --75.9031 --75.8938 --75.9016 --75.9 --75.9078 --75.8953 --75.8906 --75.9141 --75.9047 --75.8969 --75.9078 --75.8984 --75.9062 --75.8969 --75.8922 --75.8938 --75.9031 --75.8906 --75.8906 --75.8953 --75.8906 --75.8984 --75.8938 --75.8969 --75.9016 --75.8969 --75.8984 --75.9 --75.9125 --75.9 --75.8969 --75.9 --75.9062 --75.9016 --75.8828 --75.8969 --75.8953 --75.9016 --75.9031 --75.8984 --75.9031 --75.9031 --75.9016 --75.9031 --75.9047 --75.9047 --75.9047 --75.9 --75.9016 --75.8938 --75.9094 --75.8969 --75.9187 --75.9156 --75.9078 --75.8984 --75.9016 --75.8938 --75.9062 --75.9 --75.8953 --75.8938 --75.8984 --75.9078 --75.9 --75.9031 --75.8922 --75.8969 --75.9031 --75.9172 --75.9094 --75.8938 --75.9031 --75.9 --75.8906 --75.9016 --75.8906 --75.9094 --75.8984 --75.8953 --75.9172 --75.9016 --75.9 --75.8984 --75.9016 --75.9109 --75.9 --75.8984 --75.9 --75.9031 --75.9047 --75.9 --75.9016 --75.9125 --75.9016 --75.9125 --75.9016 --75.9172 --75.8891 --75.9078 --75.8922 --75.9047 --75.8922 --75.8984 --75.9047 --75.9 --75.9 --75.9062 --75.9062 --75.9031 --75.9062 --75.9047 --75.8906 --75.8969 --75.8938 --75.8859 --75.8844 --75.8938 --75.9016 --75.8828 --75.9078 --75.9016 --75.8969 --75.9016 --75.8906 --75.8844 --75.9078 --75.8812 --75.8906 --75.8938 --75.8844 --75.8922 --75.8984 --75.8766 --75.8828 --75.8922 --75.8844 --75.8859 --75.8875 --75.8891 --75.8844 --75.9016 --75.8969 --75.8828 --75.8906 --75.8969 --75.8906 --75.8891 --75.8812 --75.8906 --75.8859 --75.8844 --75.8766 --75.8984 --75.8984 --75.9016 --75.8891 --75.8891 --75.8969 --75.8922 --75.8984 --75.8891 --75.8875 --75.8828 --75.8875 --75.8859 --75.8844 --75.9031 --75.8969 --75.8859 --75.9094 --75.8859 --75.8906 --75.8812 --75.8906 --75.8828 --75.9016 --75.8906 --75.8844 --75.8922 --75.8922 --75.8922 --75.8953 --75.9 --75.9 --75.8984 --75.8984 --75.8984 --75.8938 --75.8906 --75.9 --75.9 --75.8859 --75.9 --75.8891 --75.8922 --75.8875 --75.8859 --75.8938 --75.8938 --75.8922 --75.8969 --75.8859 --75.8938 --75.8922 --75.9031 --75.8828 --75.8969 --75.8859 --75.8891 --75.8828 --75.8812 --75.8828 --75.8859 --75.8641 --75.8906 --75.8766 --75.8766 --75.8953 --75.8969 --75.8906 --75.8828 --75.8828 --75.8953 --75.8812 --75.8828 --75.8875 --75.8812 --75.8859 --75.8719 --75.8828 --75.8797 --75.8844 --75.8844 --75.8969 --75.8781 --75.8828 --75.8766 --75.8797 --75.8688 --75.8734 --75.8875 --75.8734 --75.8828 --75.8984 --75.875 --75.8781 --75.8859 --75.8734 --75.8812 --75.8828 --75.8875 --75.8828 --75.8812 --75.8891 --75.8891 --75.8781 --75.9 --75.875 --75.8922 --75.9016 --75.8875 --75.8984 --75.8922 --75.8938 --75.8906 --75.8922 --75.9016 --75.8812 --75.8859 --75.9016 --75.8891 --75.8844 --75.8953 --75.8812 --75.8859 --75.8828 --75.8766 --75.8828 --75.8859 --75.8891 --75.8969 --75.8859 --75.8766 --75.8812 --75.8969 --75.8828 --75.8875 --75.8953 --75.8797 --75.8891 --75.9047 --75.8812 --75.8953 --75.8828 --75.8844 --75.8969 --75.8734 --75.8828 --75.8922 --75.8906 --75.8844 --75.8906 --75.8797 --75.875 --75.8719 --75.8922 --75.8922 --75.9062 --75.8812 --75.8906 --75.8906 --75.8812 --75.8812 --75.8953 --75.8703 --75.8812 --75.8875 --75.8922 --75.8875 --75.8891 --75.8781 --75.8938 --75.8922 --75.8828 --75.8812 --75.8766 --75.8828 --75.8828 --75.8844 --75.8844 --75.8875 --75.8766 --75.8844 --75.8812 --75.8891 --75.8781 --75.8906 --75.8859 --75.8797 --75.8891 --75.8938 --75.8906 --75.8828 --75.8953 --75.8812 --75.8812 --75.8812 --75.8906 --75.8969 --75.8922 --75.8781 --75.8781 --75.8891 --75.8891 --75.8828 --75.8938 --75.8969 --75.8938 --75.8953 --75.8984 --75.8969 --75.8875 --75.8969 --75.8891 --75.8828 --75.8953 --75.9 --75.8938 --75.8891 --75.8812 --75.9141 --75.9141 --75.9078 --75.9031 --75.8969 --75.9062 --75.9031 --75.9016 --75.8906 --75.9141 --75.8953 --75.9047 --75.8922 --75.8953 --75.8828 --75.8891 --75.8938 --75.8891 --75.8953 --75.8922 --75.8875 --75.8969 --75.9031 --75.8859 --75.8984 --75.9 --75.8875 --75.8891 --75.9031 --75.8875 --75.9141 --75.8984 --75.8953 --75.8891 --75.8938 --75.8984 --75.8953 --75.8938 --75.8906 --75.9 --75.8906 --75.8922 --75.9156 --75.8906 --75.9078 --75.9 --75.9078 --75.9016 --75.8875 --75.8953 --75.9062 --75.9078 --75.9062 --75.9 --75.9047 --75.8938 --75.9031 --75.8906 --75.9016 --75.9078 --75.9078 --75.9094 --75.9031 --75.9094 --75.9156 --75.9062 --75.9047 --75.9062 --75.9016 --75.9125 --75.925 --75.9031 --75.9187 --75.9078 --75.9016 --75.9062 --75.8953 --75.9094 --75.8984 --75.8953 --75.9109 --75.9094 --75.9047 --75.8906 --75.9031 --75.9047 --75.8984 --75.9031 --75.8953 --75.9 --75.9016 --75.9078 --75.8969 --75.9047 --75.9 --75.8984 --75.9031 --75.9109 --75.9031 --75.8984 --75.9125 --75.8938 --75.8906 --75.8938 --75.9094 --75.9062 --75.9016 --75.9016 --75.9109 --75.8938 --75.8984 --75.8844 --75.8969 --75.8969 --75.8953 --75.8938 --75.8922 --75.9047 --75.9094 --75.9062 --75.8922 --75.9047 --75.8906 --75.9031 --75.9016 --75.9125 --75.9062 --75.8984 --75.9078 --75.9 --75.9016 --75.8984 --75.9031 --75.9016 --75.8969 --75.9016 --75.9062 --75.8984 --75.9 --75.9156 --75.9 --75.8969 --75.8953 --75.9109 --75.9016 --75.9141 --75.9031 --75.9031 --75.9062 --75.9078 --75.8969 --75.9078 --75.8984 --75.9031 --75.9031 --75.9031 --75.8984 --75.8984 --75.9016 --75.9062 --75.9109 --75.9016 --75.9 --75.9109 --75.9016 --75.9078 --75.9094 --75.9047 --75.9109 --75.9141 --75.8969 --75.9219 --75.9094 --75.9062 --75.9031 --75.9094 --75.925 --75.9203 --75.9344 --75.9297 --75.9109 --75.9047 --75.9094 --75.9125 --75.9078 --75.9172 --75.9297 --75.9313 --75.9125 --75.9203 --75.9016 --75.9219 --75.9094 --75.9109 --75.9203 --75.9219 --75.9094 --75.9281 --75.9234 --75.9141 --75.9203 --75.8953 --75.9094 --75.9156 --75.9078 --75.9125 --75.9313 --75.925 --75.9203 --75.9141 --75.9187 --75.9266 --75.925 --75.9328 --75.9219 --75.9109 --75.9281 --75.9219 --75.9016 --75.9187 --75.9172 --75.9141 --75.9234 --75.9156 --75.9219 --75.9156 --75.9172 --75.9203 --75.9016 --75.9266 --75.9234 --75.9203 --75.9219 --75.9328 --75.9266 --75.9156 --75.9156 --75.9109 --75.9156 --75.9078 --75.9 --75.9203 --75.9062 --75.9109 --75.9078 --75.9016 --75.9156 --75.9094 --75.9156 --75.9203 --75.9187 --75.9 --75.9078 --75.9047 --75.9203 --75.9109 --75.9141 --75.9125 --75.9109 --75.9078 --75.9203 --75.9234 --75.9047 --75.9125 --75.9125 --75.9078 --75.9141 --75.9141 --75.9219 --75.925 --75.9125 --75.925 --75.9297 --75.9109 --75.9234 --75.9156 --75.9203 --75.9078 --75.9187 --75.9094 --75.9156 --75.9187 --75.9187 --75.9156 --75.9141 --75.9297 --75.9094 --75.9062 --75.9047 --75.925 --75.9172 --75.9109 --75.8969 --75.9078 --75.9156 --75.9094 --75.9141 --75.9094 --75.9047 --75.9187 --75.9016 --75.9016 --75.925 --75.9156 --75.9 --75.9078 --75.9234 --75.9203 --75.9094 --75.9203 --75.9094 --75.9187 --75.9156 --75.9187 --75.9141 --75.9156 --75.9078 --75.8969 --75.9062 --75.9109 --75.9078 --75.9031 --75.9031 --75.9094 --75.9016 --75.9203 --75.9094 --75.9 --75.9172 --75.9047 --75.9141 --75.9078 --75.9125 --75.9156 --75.9094 --75.9078 --75.9203 --75.9031 --75.9156 --75.9094 --75.9234 --75.925 --75.9062 --75.9125 --75.9187 --75.9125 --75.9187 --75.9109 --75.9203 --75.9094 --75.9187 --75.9047 --75.9156 --75.9078 --75.9062 --75.9016 --75.9094 --75.9031 --75.9031 --75.9031 --75.9062 --75.9187 --75.9 --75.9187 --75.9156 --75.9 --75.9203 --75.9078 --75.9125 --75.9094 --75.9 --75.9141 --75.9094 --75.9 --75.9187 --75.9047 --75.9156 --75.8984 --75.9078 --75.9078 --75.9094 --75.9125 --75.8969 --75.9047 --75.8875 --75.9062 --75.8969 --75.9047 --75.9094 --75.9031 --75.9062 --75.8922 --75.9047 --75.8875 --75.9078 --75.9078 --75.9 --75.9109 --75.8969 --75.9047 --75.9031 --75.8984 --75.9078 --75.8984 --75.9062 --75.9047 --75.9203 --75.9016 --75.9031 --75.9047 --75.9141 --75.9156 --75.9031 --75.9062 --75.8906 --75.9078 --75.9047 --75.8984 --75.9062 --75.9156 --75.9 --75.9016 --75.9031 --75.9047 --75.9 --75.8969 --75.8922 --75.9047 --75.9 --75.9031 --75.9172 --75.9094 --75.9109 --75.9031 --75.9172 --75.9031 --75.8984 --75.8969 --75.9125 --75.8891 --75.8969 --75.9125 --75.8891 --75.9062 --75.8984 --75.8953 --75.8938 --75.9016 --75.8953 --75.8953 --75.9031 --75.9016 --75.8812 --75.8984 --75.8984 --75.9 --75.8969 --75.9094 --75.8953 --75.8922 --75.9125 --75.8984 --75.8969 --75.8969 --75.8922 --75.8891 --75.9031 --75.8938 --75.9047 --75.9125 --75.9031 --75.9078 --75.8938 --75.9047 --75.9016 --75.8922 --75.9031 --75.8766 --75.8922 --75.8922 --75.8953 --75.8984 --75.8953 --75.8891 --75.9031 --75.8938 --75.9062 --75.8969 --75.8922 --75.9 --75.8953 --75.8938 --75.8875 --75.8797 --75.8688 --75.9078 --75.8906 --75.8891 --75.8984 --75.8906 --75.8766 --75.8688 --75.8828 --75.8922 --75.8844 --75.8906 --75.8984 --75.8891 --75.8797 --75.8969 --75.8953 --75.8906 --75.8938 --75.9062 --75.8906 --75.8922 --75.8859 --75.8797 --75.8875 --75.8797 --75.8828 --75.8891 --75.8812 --75.8844 --75.8875 --75.8891 --75.8922 --75.8953 --75.8734 --75.8906 --75.8938 --75.9 --75.8875 --75.8922 --75.9016 --75.8891 --75.8859 --75.8891 --75.9 --75.8938 --75.9031 --75.8844 --75.8812 --75.8844 --75.9016 --75.8922 --75.9094 --75.8953 --75.8938 --75.9062 --75.9125 --75.9031 --75.8984 --75.8953 --75.8812 --75.8797 --75.8938 --75.8797 --75.8828 --75.8969 --75.8844 --75.8859 --75.8969 --75.8984 --75.8969 --75.8984 --75.8922 --75.8906 --75.8875 --75.8984 --75.8859 --75.8828 --75.8906 --75.8891 --75.8953 --75.8844 --75.8906 --75.8875 --75.8688 --75.8797 --75.8812 --75.8844 --75.8828 --75.8906 --75.8922 --75.8875 --75.875 --75.8766 --75.8922 --75.9031 --75.8812 --75.8812 --75.8875 --75.8891 --75.8922 --75.8891 --75.8938 --75.8766 --75.8922 --75.875 --75.8875 --75.8969 --75.8781 --75.8844 --75.8766 --75.8781 --75.8828 --75.8938 --75.8875 --75.8969 --75.8875 --75.8859 --75.8984 --75.8797 --75.8891 --75.8844 --75.8984 --75.9 --75.8984 --75.8891 --75.8984 --75.9 --75.8953 --75.8984 --75.8938 --75.9 --75.9031 --75.8844 --75.8859 --75.8859 --75.9062 --75.9 --75.8953 --75.8953 --75.8875 --75.8922 --75.8875 --75.8781 --75.8859 --75.8859 --75.8828 --75.8906 --75.8938 --75.8938 --75.8891 --75.8938 --75.8781 --75.8844 --75.8781 --75.8922 --75.8859 --75.8906 --75.8891 --75.8781 --75.8859 --75.8844 --75.875 --75.8938 --75.8984 --75.8859 --75.9031 --75.8938 --75.8859 --75.8938 --75.8844 --75.8828 --75.8797 --75.8797 --75.8812 --75.8891 --75.8953 --75.8938 --75.8781 --75.8703 --75.8781 --75.8688 --75.8875 --75.8703 --75.8781 --75.8797 --75.8703 --75.8688 --75.8625 --75.8656 --75.8641 --75.8781 --75.8594 --75.8625 --75.8688 --75.8672 --75.8719 --75.8688 --75.8625 --75.8703 --75.8656 --75.8734 --75.8703 --75.8625 --75.8641 --75.8859 --75.8797 --75.8781 --75.8734 --75.8812 --75.8797 --75.8781 --75.8781 --75.8891 --75.8891 --75.8891 --75.8844 --75.8828 --75.8906 --75.8812 --75.8844 --75.8703 --75.8922 --75.8797 --75.8828 --75.9 --75.8828 --75.9 --75.8828 --75.8812 --75.8859 --75.875 --75.8766 --75.875 --75.8906 --75.8734 --75.8766 --75.8828 --75.9031 --75.875 --75.8891 --75.8703 --75.8844 --75.8828 --75.8828 --75.8844 --75.8844 --75.8875 --75.8812 --75.8672 --75.8734 --75.8578 --75.8875 --75.8812 --75.8797 --75.8766 --75.8766 --75.8719 --75.8688 --75.8656 --75.8734 --75.8641 --75.8688 --75.8672 --75.8703 --75.8875 --75.8578 --75.8656 --75.8797 --75.8797 --75.8688 --75.8828 --75.8797 --75.8844 --75.8734 --75.8766 --75.8844 --75.8859 --75.875 --75.8781 --75.875 --75.8719 --75.8688 --75.8688 --75.8719 --75.8672 --75.8688 --75.8672 --75.8781 --75.8922 --75.8688 --75.8906 --75.8844 --75.8812 --75.8734 --75.8812 --75.8781 --75.8688 --75.8906 --75.8812 --75.8828 --75.8781 --75.8734 --75.875 --75.8781 --75.8797 --75.875 --75.8719 --75.8766 --75.8656 --75.8891 --75.8859 --75.8875 --75.8672 --75.8812 --75.8781 --75.8688 --75.875 --75.8797 --75.8797 --75.8812 --75.8906 --75.8781 --75.8766 --75.8719 --75.8703 --75.8656 --75.8719 --75.8875 --75.8656 --75.8828 --75.8688 --75.8812 --75.8688 --75.8844 --75.8766 --75.8625 --75.8766 --75.8766 --75.8828 --75.8953 --75.875 --75.8781 --75.8859 --75.8828 --75.8719 --75.8703 --75.8891 --75.8703 --75.8578 --75.8656 --75.8656 --75.875 --75.8766 --75.8719 --75.8766 --75.8812 --75.8625 --75.8703 --75.8875 --75.8734 --75.8734 --75.8672 --75.8672 --75.8844 --75.875 --75.8688 --75.8891 --75.8922 --75.8797 --75.8656 --75.8844 --75.8906 --75.8891 --75.8703 --75.8828 --75.8734 --75.8703 --75.8812 --75.8828 --75.8688 --75.8656 --75.8734 --75.8734 --75.8797 --75.8734 --75.8812 --75.8812 --75.8734 --75.8766 --75.8844 --75.8734 --75.8766 --75.8672 --75.8812 --75.8719 --75.8828 --75.8672 --75.8766 --75.875 --75.8688 --75.8703 --75.8703 --75.8828 --75.8703 --75.8734 --75.8703 --75.8734 --75.8641 --75.8703 --75.8906 --75.8703 --75.8781 --75.8734 --75.8938 --75.8891 --75.8812 --75.8828 --75.8875 --75.8812 --75.8875 --75.8953 --75.8812 --75.8703 --75.8797 --75.8859 --75.8875 --75.8875 --75.8781 --75.875 --75.8719 --75.8766 --75.8984 --75.8719 --75.8844 --75.8828 --75.8906 --75.8875 --75.8766 --75.8719 --75.8797 --75.8938 --75.8875 --75.8938 --75.8891 --75.8859 --75.8891 --75.8859 --75.8906 --75.8797 --75.8969 --75.8797 --75.8844 --75.8844 --75.8859 --75.8797 --75.8844 --75.8797 --75.8938 --75.8906 --75.8953 --75.8797 --75.8812 --75.8859 --75.8922 --75.8875 --75.8828 --75.8891 --75.8812 --75.8594 --75.8797 --75.875 --75.8781 --75.8703 --75.8766 --75.875 --75.8719 --75.8812 --75.8859 --75.8719 --75.8812 --75.8891 --75.8828 --75.8797 --75.8781 --75.8844 --75.875 --75.8672 --75.8922 --75.8797 --75.8859 --75.8703 --75.8844 --75.8906 --75.8812 --75.8875 --75.8766 --75.8859 --75.8828 --75.8766 --75.8906 --75.8906 --75.8703 --75.8922 --75.8844 --75.8859 --75.8766 --75.8781 --75.8766 --75.8766 --75.8969 --75.8812 --75.8891 --75.8922 --75.9 --75.8891 --75.8906 --75.8922 --75.8906 --75.8938 --75.8859 --75.8891 --75.8938 --75.8812 --75.8859 --75.8875 --75.8844 --75.8875 --75.8953 --75.8906 --75.8922 --75.9031 --75.9047 --75.8875 --75.9047 --75.9 --75.8953 --75.8984 --75.8875 --75.8844 --75.8953 --75.8922 --75.8875 --75.8906 --75.8875 --75.8812 --75.8891 --75.9016 --75.8969 --75.9062 --75.9016 --75.8859 --75.8859 --75.9016 --75.875 --75.8859 --75.8781 --75.9 --75.8766 --75.8734 --75.8969 --75.8859 --75.8844 --75.8734 --75.8938 --75.8953 --75.8984 --75.9016 --75.9 --75.8797 --75.8875 --75.9031 --75.8891 --75.8828 --75.8922 --75.8891 --75.8938 --75.8859 --75.8672 --75.8891 --75.8875 --75.8844 --75.8922 --75.8906 --75.8797 --75.8812 --75.8906 --75.8953 --75.8875 --75.8844 --75.8766 --75.8984 --75.8812 --75.8906 --75.8953 --75.8891 --75.8875 --75.8875 --75.8828 --75.8828 --75.8828 --75.8672 --75.8828 --75.8875 --75.8828 --75.8812 --75.8766 --75.875 --75.8844 --75.8875 --75.875 --75.8859 --75.8859 --75.8672 --75.8969 --75.8859 --75.8812 --75.8828 --75.8781 --75.8672 --75.8828 --75.8719 --75.875 --75.8828 --75.8688 --75.8797 --75.8797 --75.8781 --75.8734 --75.8703 --75.8781 --75.8844 --75.8688 --75.8891 --75.8859 --75.8828 --75.875 --75.8844 --75.8922 --75.8797 --75.8812 --75.8875 --75.8844 --75.8969 --75.8859 --75.8812 --75.8906 --75.8906 --75.8766 --75.8797 --75.8828 --75.8797 --75.875 --75.8844 --75.8719 --75.8797 --75.8766 --75.8875 --75.8688 --75.8828 --75.8766 --75.8766 --75.8797 --75.8703 --75.8828 --75.8625 --75.8625 --75.8812 --75.8719 --75.8844 --75.8766 --75.8656 --75.8812 --75.8672 --75.8734 --75.8719 --75.8844 --75.8734 --75.875 --75.8594 --75.8875 --75.8766 --75.8766 --75.8766 --75.8844 --75.8781 --75.8844 --75.8891 --75.9031 --75.8859 --75.8828 --75.8859 --75.8859 --75.8688 --75.8781 --75.8766 --75.8766 --75.8844 --75.8812 --75.8891 --75.8797 --75.8891 --75.875 --75.8766 --75.8703 --75.8703 --75.8688 --75.8719 --75.8688 --75.8781 --75.8688 --75.8828 --75.8625 --75.8656 --75.8797 --75.8781 --75.8656 --75.8844 --75.8766 --75.8859 --75.8812 --75.8812 --75.8781 --75.8859 --75.8875 --75.8891 --75.8891 --75.8875 --75.8875 --75.8797 --75.8859 --75.8906 --75.8906 --75.8922 --75.9 --75.8969 --75.8969 --75.8906 --75.8938 --75.8828 --75.8953 --75.8891 --75.8984 --75.8828 --75.8859 --75.8938 --75.8828 --75.8703 --75.8891 --75.8906 --75.9047 --75.9 --75.9078 --75.8859 --75.8953 --75.8922 --75.8953 --75.8844 --75.8922 --75.9016 --75.8891 --75.8891 --75.8969 --75.8734 --75.8859 --75.8891 --75.8859 --75.8953 --75.8812 --75.8875 --75.8828 --75.8953 --75.8734 --75.8938 --75.8859 --75.8922 --75.8859 --75.9 --75.9016 --75.9109 --75.8828 --75.8766 --75.8969 --75.8953 --75.8844 --75.9016 --75.8953 --75.8922 --75.8812 --75.9047 --75.8906 --75.9031 --75.8969 --75.8844 --75.8875 --75.8984 --75.8828 --75.8875 --75.8812 --75.8828 --75.8812 --75.8719 --75.8812 --75.8922 --75.8844 --75.8875 --75.8953 --75.8938 --75.9 --75.8688 --75.8969 --75.8797 --75.8906 --75.8938 --75.8906 --75.8953 --75.8859 --75.8922 --75.8828 --75.8969 --75.8891 --75.9 --75.8875 --75.8797 --75.8938 --75.8938 --75.8875 --75.8969 --75.8859 --75.8984 --75.875 --75.8844 --75.8953 --75.8703 --75.8906 --75.8781 --75.9031 --75.8891 --75.8891 --75.8891 --75.8859 --75.8844 --75.8828 --75.8734 --75.8812 --75.8781 --75.9016 --75.8828 --75.8906 --75.8859 --75.8906 --75.8984 --75.8891 --75.8969 --75.8953 --75.8875 --75.8953 --75.9031 --75.8953 --75.8906 --75.8969 --75.8828 --75.8969 --75.9047 --75.9031 --75.8984 --75.8938 --75.9 --75.8984 --75.8891 --75.8938 --75.8844 --75.8922 --75.8766 --75.8875 --75.8875 --75.8906 --75.8875 --75.8828 --75.8922 --75.8938 --75.8891 --75.8844 --75.8891 --75.8859 --75.8984 --75.8812 --75.8812 --75.8812 --75.8844 --75.8875 --75.8828 --75.8953 --75.8922 --75.8969 --75.8891 --75.9016 --75.8969 --75.8953 --75.9016 --75.8891 --75.8812 --75.8891 --75.9062 --75.8969 --75.8953 --75.8906 --75.8891 --75.8797 --75.8969 --75.9062 --75.8969 --75.8953 --75.8969 --75.8797 --75.8875 --75.8875 --75.8938 --75.8938 --75.8953 --75.8969 --75.8891 --75.8938 --75.8953 --75.8766 --75.8828 --75.8891 --75.8797 --75.8734 --75.8891 --75.9016 --75.8859 --75.8984 --75.8922 --75.8703 --75.8891 --75.8844 --75.8859 --75.8891 --75.8828 --75.8812 --75.8766 --75.8844 --75.8859 --75.8875 --75.8922 --75.8781 --75.8891 --75.8859 --75.8906 --75.8859 --75.8844 --75.8828 --75.8906 --75.8781 --75.8828 --75.8891 --75.8734 --75.8781 --75.8828 --75.8891 --75.8922 --75.8688 --75.8828 --75.8906 --75.8781 --75.875 --75.8844 --75.8922 --75.8766 --75.875 --75.8734 --75.8719 --75.8703 --75.8828 --75.8828 --75.8719 --75.8781 --75.8906 --75.8734 --75.8953 --75.8953 --75.8797 --75.8922 --75.8781 --75.8891 --75.8828 --75.8859 --75.8703 --75.875 --75.8984 --75.8906 --75.8766 --75.8938 --75.8906 --75.8875 --75.8859 --75.8797 --75.8812 --75.8906 --75.8828 --75.8922 --75.8922 --75.8875 --75.8922 --75.9 --75.8875 --75.8984 --75.8906 --75.9109 --75.9016 --75.8938 --75.8938 --75.8938 --75.8766 --75.8906 --75.8766 --75.8984 --75.8938 --75.8922 --75.8891 --75.8828 --75.9016 --75.9031 --75.8859 --75.8875 --75.8891 --75.8797 --75.8891 --75.8891 --75.8797 --75.8891 --75.8797 --75.8922 --75.8906 --75.9 --75.8891 --75.8953 --75.8875 --75.8891 --75.8906 --75.8906 --75.8953 --75.8969 --75.8875 --75.8891 --75.8797 --75.8797 --75.8875 --75.8781 --75.8781 --75.8938 --75.875 --75.8844 --75.8844 --75.8844 --75.8891 --75.8844 --75.8672 --75.8766 --75.8688 --75.8797 --75.8688 --75.875 --75.8734 --75.8672 --75.8594 --75.8734 --75.8703 --75.8859 --75.8766 --75.8812 --75.8719 --75.8797 --75.8828 --75.8828 --75.8781 --75.8609 --75.8766 --75.8859 --75.8766 --75.8719 --75.875 --75.8828 --75.8625 --75.8688 --75.8844 --75.8781 --75.8766 --75.8766 --75.8672 --75.8844 --75.8812 --75.8859 --75.8938 --75.8828 --75.8844 --75.8922 --75.875 --75.8812 --75.8891 --75.8891 --75.8719 --75.8844 --75.8906 --75.8844 --75.8812 --75.8734 --75.8797 --75.8844 --75.8781 --75.8891 --75.8844 --75.8812 --75.8906 --75.8891 --75.8859 --75.875 --75.8859 --75.8859 --75.8875 --75.9031 --75.8875 --75.8828 --75.8688 --75.8812 --75.8703 --75.8703 --75.8656 --75.8734 --75.8781 --75.8625 --75.875 --75.8719 --75.8703 --75.8719 --75.8812 --75.8719 --75.8688 --75.8688 --75.8672 --75.8844 --75.8766 --75.8875 --75.8844 --75.8812 --75.8781 --75.8938 --75.8844 --75.8812 --75.8844 --75.8797 --75.875 --75.8812 --75.8922 --75.8766 --75.8891 --75.8953 --75.8922 --75.8828 --75.875 --75.8703 --75.8719 --75.8781 --75.8812 --75.8812 --75.8703 --75.8891 --75.875 --75.8703 --75.8781 --75.875 --75.8734 --75.8766 --75.8844 --75.8781 --75.8781 --75.8766 --75.8781 --75.8766 --75.8844 --75.8766 --75.875 --75.8844 --75.8906 --75.8672 --75.8875 --75.8953 --75.8891 --75.8875 --75.8891 --75.8875 --75.8875 --75.8781 --75.8906 --75.8844 --75.8891 --75.8656 --75.8906 --75.8797 --75.8781 --75.8859 --75.8797 --75.8812 --75.8922 --75.8625 --75.875 --75.8828 --75.8719 --75.875 --75.8812 --75.8781 --75.8797 --75.8938 --75.8734 --75.8703 --75.8875 --75.8766 --75.8734 --75.8828 --75.8719 --75.875 --75.8844 --75.8797 --75.8828 --75.8781 --75.8672 --75.8688 --75.8781 --75.8828 --75.8781 --75.8812 --75.8812 --75.8844 --75.875 --75.8734 --75.8828 --75.8828 --75.8781 --75.8938 --75.8859 --75.8938 --75.8828 --75.8781 --75.8766 --75.8734 --75.8875 --75.8828 --75.8828 --75.8766 --75.8812 --75.8672 --75.8875 --75.875 --75.8719 --75.8844 --75.8844 --75.8875 --75.8719 --75.8797 --75.875 --75.8797 --75.8828 --75.875 --75.8859 --75.8719 --75.8891 --75.8953 --75.8781 --75.8656 --75.8766 --75.8844 --75.8828 --75.875 --75.8688 --75.875 --75.8859 --75.8625 --75.8781 --75.8812 --75.8641 --75.8656 --75.8953 --75.8844 --75.8828 --75.875 --75.8797 --75.8734 --75.8797 --75.8766 --75.8844 --75.8859 --75.8781 --75.8688 --75.8859 --75.8828 --75.8938 --75.8828 --75.8797 --75.8969 --75.8781 --75.8953 --75.8781 --75.8859 --75.8891 --75.8875 --75.8875 --75.9031 --75.8859 --75.8984 --75.8875 --75.8828 --75.8844 --75.8812 --75.8984 --75.8891 --75.8828 --75.8812 --75.8891 --75.8797 --75.8703 --75.8953 --75.8828 --75.8875 --75.8875 --75.8734 --75.8828 --75.8953 --75.8812 --75.8922 --75.8844 --75.8891 --75.8922 --75.8859 --75.8859 --75.8781 --75.8875 --75.8938 --75.8844 --75.8891 --75.8812 --75.8969 --75.8828 --75.8812 --75.8906 --75.9094 --75.8891 --75.8828 --75.8938 --75.8859 --75.9016 --75.8953 --75.8844 --75.9047 --75.8766 --75.8969 --75.8766 --75.8797 --75.8891 --75.8844 --75.8969 --75.8844 --75.8734 --75.8984 --75.8812 --75.8859 --75.8766 --75.8938 --75.8922 --75.8797 --75.8875 --75.8875 --75.8906 --75.8922 --75.8875 --75.8844 --75.8891 --75.8688 --75.8672 --75.8938 --75.9016 --75.8906 --75.8984 --75.9 --75.8906 --75.8906 --75.9 --75.8984 --75.8766 --75.8875 --75.8891 --75.8844 --75.9 --75.8984 --75.8969 --75.8922 --75.8875 --75.9031 --75.8844 --75.8797 --75.8812 --75.8984 --75.8953 --75.8969 --75.9031 --75.8875 --75.8906 --75.9 --75.8922 --75.8938 --75.8844 --75.8969 --75.9 --75.8938 --75.8922 --75.8859 --75.8891 --75.8969 --75.8984 --75.8844 --75.8891 --75.8969 --75.9 --75.8859 --75.8938 --75.9047 --75.8891 --75.8891 --75.8844 --75.8891 --75.8953 --75.8859 --75.8922 --75.8844 --75.8812 --75.8906 --75.8844 --75.8938 --75.8938 --75.8922 --75.8984 --75.8922 --75.8812 --75.9 --75.8922 --75.9016 --75.9047 --75.9094 --75.8922 --75.9062 --75.8891 --75.9062 --75.8969 --75.8938 --75.8969 --75.8828 --75.8984 --75.8984 --75.8797 --75.8906 --75.8922 --75.8859 --75.8812 --75.8953 --75.8891 --75.8984 --75.8969 --75.8953 --75.8859 --75.8766 --75.8875 --75.8875 --75.8906 --75.8875 --75.8875 --75.8938 --75.8812 --75.9141 --75.8953 --75.8938 --75.9016 --75.9031 --75.9016 --75.9141 --75.9094 --75.9062 --75.9094 --75.9062 --75.8969 --75.9094 --75.9219 --75.9078 --75.8969 --75.9062 --75.9109 --75.9047 --75.8938 --75.8953 --75.9016 --75.8938 --75.8969 --75.9 --75.9031 --75.9094 --75.8969 --75.9094 --75.8938 --75.9125 --75.9016 --75.8984 --75.8938 --75.8938 --75.8859 --75.8922 --75.9016 --75.9 --75.8906 --75.8859 --75.8906 --75.9094 --75.9 --75.9016 --75.9016 --75.8984 --75.8969 --75.9219 --75.8859 --75.9094 --75.9047 --75.9094 --75.8984 --75.8844 --75.8984 --75.9031 --75.8984 --75.8969 --75.8984 --75.8906 --75.9031 --75.8969 --75.9047 --75.8953 --75.8906 --75.8953 --75.8766 --75.9031 --75.8906 --75.9047 --75.9094 --75.8844 --75.8969 --75.9062 --75.8875 --75.9141 --75.9031 --75.9031 --75.9141 --75.9 --75.9062 --75.8859 --75.9047 --75.9016 --75.9047 --75.8906 --75.8828 --75.8922 --75.9047 --75.8828 --75.8984 --75.8891 --75.9031 --75.9047 --75.9062 --75.8875 --75.9047 --75.9 --75.8984 --75.9078 --75.8969 --75.9 --75.8969 --75.8938 --75.8938 --75.9109 --75.9109 --75.8984 --75.9 --75.9062 --75.9016 --75.9016 --75.8875 --75.9047 --75.8969 --75.9031 --75.8797 --75.9062 --75.9062 --75.8953 --75.8984 --75.9047 --75.8984 --75.8844 --75.9031 --75.9031 --75.8984 --75.9 --75.9078 --75.8969 --75.8984 --75.8891 --75.9031 --75.9016 --75.8984 --75.9047 --75.9 --75.9 --75.8984 --75.8953 --75.8922 --75.8984 --75.9141 --75.8922 --75.9 --75.8938 --75.8938 --75.9031 --75.8953 --75.9047 --75.8891 --75.9125 --75.9125 --75.9062 --75.8938 --75.9094 --75.8984 --75.8969 --75.8844 --75.8922 --75.9016 --75.9062 --75.9078 --75.8969 --75.9031 --75.9062 --75.8922 --75.8906 --75.8984 --75.9078 --75.9062 --75.9016 --75.9094 --75.9125 --75.8938 --75.8969 --75.8953 --75.9062 --75.9094 --75.9047 --75.9109 --75.9062 --75.8844 --75.9031 --75.9 --75.8891 --75.8906 --75.8938 --75.9078 --75.8969 --75.8953 --75.8938 --75.8875 --75.9031 --75.8984 --75.8953 --75.9016 --75.9031 --75.9 --75.9031 --75.8875 --75.8938 --75.9 --75.9141 --75.8844 --75.8984 --75.9031 --75.9062 --75.9062 --75.9078 --75.8844 --75.9062 --75.9062 --75.9 --75.8969 --75.8891 --75.8938 --75.8922 --75.8891 --75.8891 --75.8938 --75.8891 --75.8922 --75.9016 --75.8922 --75.9078 --75.8906 --75.9016 --75.8969 --75.9156 --75.9047 --75.8922 --75.9031 --75.9078 --75.9125 --75.8938 --75.8906 --75.9047 --75.8984 --75.9031 --75.8969 --75.8844 --75.9031 --75.8906 --75.9062 --75.8812 --75.8875 --75.9031 --75.8922 --75.8953 --75.9078 --75.8875 --75.8969 --75.9141 --75.9047 --75.9109 --75.9062 --75.9047 --75.9078 --75.9047 --75.9016 --75.9016 --75.9 --75.9078 --75.9031 --75.9062 --75.9 --75.9016 --75.9047 --75.9203 --75.9 --75.9 --75.9219 --75.9156 --75.9328 --75.9078 --75.9062 --75.9172 --75.9313 --75.9141 --75.9281 --75.9219 --75.9234 --75.9094 --75.9172 --75.9094 --75.9109 --75.9141 --75.9297 --75.9266 --75.9078 --75.9078 --75.9094 --75.8984 --75.9156 --75.9141 --75.8906 --75.9 --75.9047 --75.9016 --75.9078 --75.9141 --75.9047 --75.9156 --75.9141 --75.9156 --75.9016 --75.9109 --75.9141 --75.8984 --75.9062 --75.9016 --75.8875 --75.9016 --75.8906 --75.9047 --75.8969 --75.9031 --75.9031 --75.9047 --75.8859 --75.8953 --75.9078 --75.9109 --75.8969 --75.9031 --75.8984 --75.8938 --75.9016 --75.8859 --75.8953 --75.8938 --75.8922 --75.9047 --75.9125 --75.9016 --75.9094 --75.8969 --75.9234 --75.8969 --75.9031 --75.9094 --75.8984 --75.9016 --75.9094 --75.9078 --75.8969 --75.9 --75.9047 --75.8922 --75.9031 --75.9078 --75.9234 --75.9031 --75.9219 --75.9141 --75.9141 --75.8969 --75.9016 --75.8984 --75.9125 --75.9 --75.8984 --75.9016 --75.9125 --75.9 --75.9047 --75.8953 --75.9062 --75.9234 --75.9141 --75.9047 --75.8938 --75.9156 --75.9187 --75.8953 --75.9094 --75.9078 --75.9047 --75.9047 --75.9109 --75.9016 --75.9141 --75.9 --75.9094 --75.9062 --75.9125 --75.9141 --75.9031 --75.9156 --75.9219 --75.8953 --75.8984 --75.9141 --75.9031 --75.8953 --75.9094 --75.9 --75.8969 --75.9047 --75.8984 --75.8906 --75.9062 --75.9094 --75.8875 --75.8922 --75.9078 --75.9172 --75.9109 --75.9109 --75.8953 --75.8906 --75.9031 --75.9078 --75.9062 --75.8938 --75.8953 --75.9016 --75.9156 --75.9109 --75.9156 --75.9094 --75.9172 --75.9172 --75.9016 --75.9047 --75.9078 --75.9031 --75.9094 --75.9016 --75.8953 --75.8875 --75.9016 --75.9047 --75.8938 --75.8953 --75.8938 --75.9 --75.9031 --75.9094 --75.9047 --75.9016 --75.9187 --75.9156 --75.9125 --75.9125 --75.9125 --75.9047 --75.9109 --75.8984 --75.9187 --75.925 --75.8969 --75.9172 --75.9078 --75.9141 --75.9094 --75.9172 --75.9156 --75.9125 --75.9 --75.9062 --75.9094 --75.9109 --75.9078 --75.9 --75.8906 --75.9156 --75.9031 --75.9094 --75.9156 --75.9156 --75.9141 --75.9219 --75.9141 --75.9078 --75.9062 --75.9094 --75.9 --75.9156 --75.9187 --75.9078 --75.9187 --75.9062 --75.9016 --75.8938 --75.8922 --75.8906 --75.9078 --75.9016 --75.9141 --75.9125 --75.8984 --75.9031 --75.9031 --75.9016 --75.9109 --75.8906 --75.9094 --75.9047 --75.8938 --75.9 --75.8906 --75.8891 --75.8969 --75.8797 --75.9016 --75.8984 --75.9062 --75.9 --75.9047 --75.9125 --75.9141 --75.8891 --75.9109 --75.9172 --75.9016 --75.9172 --75.9047 --75.9125 --75.9109 --75.9172 --75.9203 --75.9125 --75.9016 --75.8938 --75.9125 --75.9016 --75.9109 --75.9 --75.8906 --75.9 --75.9047 --75.9094 --75.925 --75.9219 --75.9141 --75.9234 --75.9094 --75.9234 --75.9016 --75.8953 --75.9078 --75.8969 --75.8969 --75.9313 --75.9094 --75.9109 --75.9141 --75.9078 --75.8969 --75.9156 --75.9078 --75.9125 --75.9062 --75.9031 --75.9203 --75.9078 --75.9187 --75.8938 --75.9047 --75.9016 --75.9031 --75.9125 --75.8984 --75.9094 --75.9094 --75.9047 --75.8953 --75.8984 --75.9047 --75.9094 --75.9047 --75.9125 --75.9078 --75.9016 --75.9047 --75.9031 --75.9047 --75.9109 --75.9078 --75.9047 --75.8969 --75.8922 --75.9078 --75.9062 --75.9109 --75.9062 --75.9047 --75.9125 --75.9156 --75.9062 --75.8953 --75.9047 --75.9047 --75.9172 --75.9187 --75.9078 --75.9078 --75.8984 --75.9094 --75.9047 --75.9109 --75.9141 --75.9094 --75.9109 --75.9141 --75.9141 --75.9156 --75.9141 --75.9031 --75.9219 --75.9219 --75.9344 --75.9234 --75.9156 --75.9281 --75.9266 --75.8953 --75.9172 --75.9141 --75.9359 --75.9219 --75.9328 --75.9234 --75.9203 --75.9187 --75.9187 --75.9156 --75.9031 --75.9219 --75.9203 --75.9 --75.9 --75.9172 --75.9219 --75.9266 --75.9109 --75.9281 --75.925 --75.9141 --75.925 --75.9172 --75.9187 --75.9219 --75.925 --75.9172 --75.925 --75.9313 --75.9328 --75.9109 --75.9266 --75.9313 --75.9156 --75.9203 --75.9047 --75.9313 --75.9187 --75.9172 --75.9297 --75.9125 --75.9359 --75.9078 --75.9187 --75.9187 --75.9375 --75.9203 --75.9281 --75.9187 --75.9094 --75.9109 --75.9094 --75.9094 --75.9156 --75.9266 --75.9109 --75.9187 --75.9281 --75.9109 --75.9172 --75.9156 --75.9172 --75.9062 --75.925 --75.9109 --75.9187 --75.9203 --75.9172 --75.9203 --75.9234 --75.9266 --75.9172 --75.9281 --75.9109 --75.9109 --75.9125 --75.9203 --75.9187 --75.9094 --75.8969 --75.9156 --75.9109 --75.9141 --75.9062 --75.9047 --75.9109 --75.8953 --75.9125 --75.9141 --75.9125 --75.9 --75.9141 --75.9187 --75.9031 --75.9062 --75.9078 --75.9094 --75.9141 --75.9125 --75.8984 --75.9094 --75.9109 --75.8969 --75.9187 --75.9141 --75.9141 --75.9172 --75.9187 --75.9094 --75.9078 --75.9172 --75.9094 --75.9062 --75.9141 --75.9031 --75.9219 --75.9219 --75.9109 --75.9187 --75.9266 --75.9187 --75.9156 --75.9219 --75.9062 --75.9156 --75.9156 --75.9266 --75.9156 --75.9172 --75.9187 --75.9203 --75.9172 --75.9266 --75.9187 --75.9141 --75.9313 --75.9234 --75.925 --75.9234 --75.9219 --75.9234 --75.9281 --75.9156 --75.9187 --75.9141 --75.9031 --75.9219 --75.9172 --75.9219 --75.9234 --75.9281 --75.9234 --75.9297 --75.925 --75.9266 --75.9234 --75.9266 --75.925 --75.9203 --75.9219 --75.9344 --75.9281 --75.9219 --75.925 --75.9187 --75.9266 --75.9281 --75.9313 --75.9406 --75.9234 --75.9297 --75.9313 --75.9422 --75.9359 --75.9203 --75.9406 --75.9281 --75.9391 --75.9391 --75.9313 --75.9359 --75.9422 --75.9297 --75.9281 --75.9281 --75.9375 --75.9344 --75.9375 --75.9469 --75.9359 --75.9484 --75.9359 --75.9375 --75.9281 --75.925 --75.9422 --75.9344 --75.9281 --75.9391 --75.9453 --75.9187 --75.9297 --75.9234 --75.9219 --75.9328 --75.9109 --75.9219 --75.9203 --75.9297 --75.9141 --75.9266 --75.9234 --75.9109 --75.9141 --75.9266 --75.9391 --75.9187 --75.9266 --75.9187 --75.9187 --75.9203 --75.9313 --75.9313 --75.9156 --75.9156 --75.9281 --75.9234 --75.9203 --75.9109 --75.9266 --75.9187 --75.9313 --75.925 --75.9141 --75.9344 --75.925 --75.9187 --75.9266 --75.9234 --75.9391 --75.9297 --75.9297 --75.9172 --75.9219 --75.9328 --75.9375 --75.9219 --75.9281 --75.9109 --75.9203 --75.9266 --75.9297 --75.9078 --75.925 --75.925 --75.9234 --75.9172 --75.9172 --75.9313 --75.9281 --75.9422 --75.9281 --75.9375 --75.9313 --75.9219 --75.9313 --75.9375 --75.9125 --75.9328 --75.9344 --75.9297 --75.9328 --75.9313 --75.9375 --75.9359 --75.9328 --75.9234 --75.9344 --75.9437 --75.9313 --75.9328 --75.9281 --75.9359 --75.9297 --75.925 --75.9297 --75.9359 --75.9344 --75.9391 --75.9359 --75.9156 --75.9281 --75.925 --75.9313 --75.9234 --75.9344 --75.925 --75.9297 --75.9313 --75.9344 --75.9313 --75.9344 --75.9313 --75.9266 --75.9266 --75.9266 --75.9297 --75.9297 --75.9234 --75.9359 --75.9281 --75.9234 --75.9375 --75.925 --75.9219 --75.9234 --75.9234 --75.9203 --75.9187 --75.9219 --75.925 --75.925 --75.9109 --75.9234 --75.9281 --75.9359 --75.9266 --75.9281 --75.9344 --75.9219 --75.9313 --75.9187 --75.9203 --75.9266 --75.9297 --75.9187 --75.9219 --75.9266 --75.9266 --75.9281 --75.9391 --75.925 --75.9266 --75.9172 --75.9281 --75.9156 --75.9328 --75.9156 --75.9297 --75.9375 --75.925 --75.9422 --75.9453 --75.9313 --75.925 --75.9266 --75.9344 --75.9297 --75.9125 --75.9313 --75.9328 --75.9391 --75.9141 --75.925 --75.9187 --75.9203 --75.9313 --75.9313 --75.9344 --75.9234 --75.9109 --75.9203 --75.9172 --75.9234 --75.9203 --75.925 --75.9297 --75.9328 --75.9297 --75.9297 --75.9422 --75.9328 --75.9313 --75.9297 --75.9297 --75.9281 --75.9094 --75.9375 --75.9375 --75.9422 --75.9297 --75.9328 --75.9344 --75.9375 --75.925 --75.9266 --75.9297 --75.9359 --75.9266 --75.95 --75.9375 --75.9172 --75.9219 --75.9313 --75.9234 --75.9375 --75.925 --75.9281 --75.9156 --75.9344 --75.9437 --75.9359 --75.9437 --75.9359 --75.9422 --75.9359 --75.9516 --75.9406 --75.9328 --75.9391 --75.925 --75.9328 --75.9359 --75.9344 --75.9516 --75.9344 --75.9406 --75.9375 --75.9406 --75.9328 --75.9234 --75.9391 --75.9344 --75.9313 --75.9344 --75.9375 --75.9422 --75.9344 --75.95 --75.9266 --75.9406 --75.9328 --75.9453 --75.9375 --75.9281 --75.9453 --75.9391 --75.9437 --75.9266 --75.9359 --75.9391 --75.9297 --75.9281 --75.925 --75.9391 --75.9375 --75.9344 --75.9328 --75.9203 --75.9313 --75.9359 --75.9328 --75.9641 --75.9375 --75.9281 --75.9391 --75.9375 --75.9313 --75.9297 --75.9391 --75.9359 --75.9359 --75.9391 --75.9172 --75.9437 --75.9344 --75.9516 --75.9328 --75.9359 --75.9406 --75.9297 --75.9328 --75.9328 --75.9281 --75.9266 --75.9406 --75.9359 --75.9219 --75.9297 --75.9344 --75.9187 --75.9359 --75.9141 --75.925 --75.925 --75.9266 --75.9297 --75.9313 --75.9094 --75.9344 --75.9328 --75.9375 --75.9234 --75.9234 --75.9297 --75.925 --75.9359 --75.925 --75.9391 --75.9266 --75.925 --75.9281 --75.9359 --75.9344 --75.9328 --75.9156 --75.9344 --75.9234 --75.9203 --75.9219 --75.9359 --75.9328 --75.9281 --75.925 --75.9172 --75.9406 --75.9391 --75.9281 --75.9344 --75.9328 --75.9391 --75.9359 --75.9234 --75.9313 --75.925 --75.9203 --75.9453 --75.9187 --75.9359 --75.9344 --75.9266 --75.9328 --75.9328 --75.9172 --75.9344 --75.9391 --75.9297 --75.9266 --75.9297 --75.9313 --75.9469 --75.9484 --75.925 --75.9266 --75.9375 --75.9391 --75.9344 --75.9359 --75.9375 --75.9297 --75.9281 --75.95 --75.9437 --75.9375 --75.95 --75.9469 --75.9422 --75.9406 --75.9406 --75.9437 --75.9344 --75.9359 --75.9328 --75.9359 --75.9391 --75.9281 --75.9375 --75.9437 --75.9344 --75.925 --75.9297 --75.9422 --75.9391 --75.9484 --75.9219 --75.9406 --75.9453 --75.9375 --75.9344 --75.9391 --75.9453 --75.9422 --75.9437 --75.9516 --75.9406 --75.9391 --75.9469 --75.9313 --75.9469 --75.9453 --75.9516 --75.9625 --75.9453 --75.9422 --75.9437 --75.9359 --75.9453 --75.9578 --75.9359 --75.9437 --75.9359 --75.9406 --75.9422 --75.9344 --75.9437 --75.9344 --75.9453 --75.9406 --75.9437 --75.9391 --75.9375 --75.9406 --75.9469 --75.9359 --75.95 --75.9406 --75.9516 --75.9437 --75.9578 --75.9531 --75.9469 --75.9406 --75.9437 --75.9531 --75.9422 --75.9422 --75.9328 --75.9437 --75.9344 --75.9656 --75.9375 --75.9484 --75.9484 --75.9359 --75.9313 --75.9594 --75.9484 --75.9375 --75.9391 --75.9453 --75.9469 --75.9563 --75.9406 --75.9547 --75.9344 --75.9391 --75.9469 --75.9531 --75.9516 --75.9406 --75.9453 --75.9563 --75.9422 --75.9469 --75.9437 --75.9594 --75.9594 --75.9641 --75.9484 --75.9531 --75.9563 --75.95 --75.9547 --75.9453 --75.9625 --75.9484 --75.9547 --75.9594 --75.9422 --75.9375 --75.9531 --75.9469 --75.9469 --75.95 --75.9547 --75.9469 --75.9437 --75.9422 --75.95 --75.9406 --75.9578 --75.9406 --75.9406 --75.9516 --75.9344 --75.9422 --75.9547 --75.95 --75.9406 --75.9391 --75.9375 --75.9469 --75.9453 --75.9422 --75.9297 --75.9344 --75.9437 --75.9469 --75.9391 --75.9516 --75.9422 --75.9453 --75.9437 --75.9406 --75.9437 --75.9578 --75.9375 --75.9453 --75.9453 --75.9422 --75.95 --75.9547 --75.9422 --75.9328 --75.9641 --75.9672 --75.95 --75.9563 --75.9469 --75.9578 --75.9516 --75.9469 --75.9328 --75.9453 --75.9406 --75.95 --75.9563 --75.9578 --75.9484 --75.9547 --75.9578 --75.9563 --75.9469 --75.95 --75.9422 --75.9359 --75.9594 --75.9484 --75.9453 --75.95 --75.9609 --75.9422 --75.9578 --75.9516 --75.9594 --75.9516 --75.9531 --75.9469 --75.9422 --75.9453 --75.95 --75.9437 --75.9391 --75.9453 --75.9484 --75.9375 --75.9469 --75.9437 --75.95 --75.9469 --75.9453 --75.95 --75.9406 --75.9484 --75.9563 --75.9578 --75.9406 --75.9437 --75.95 --75.9484 --75.9516 --75.9422 --75.9531 --75.9437 --75.9484 --75.9578 --75.9672 --75.95 --75.9531 --75.9656 --75.9453 --75.9641 --75.9453 --75.9531 --75.9484 --75.9516 --75.9484 --75.9531 --75.9563 --75.9469 --75.9484 --75.9625 --75.9437 --75.9609 --75.9516 --75.9609 --75.9484 --75.9625 --75.9563 --75.9625 --75.9437 --75.9516 --75.9656 --75.9437 --75.9641 --75.9578 --75.9563 --75.9547 --75.9344 --75.9453 --75.9578 --75.9453 --75.9516 --75.9391 --75.9453 --75.9484 --75.9437 --75.9344 --75.9375 --75.9437 --75.9422 --75.9469 --75.9422 --75.9516 --75.9328 --75.9437 --75.9375 --75.9266 --75.9422 --75.9422 --75.9406 --75.9516 --75.9406 --75.9453 --75.9484 --75.9328 --75.9422 --75.9531 --75.9437 --75.9406 --75.9281 --75.9281 --75.9313 --75.9375 --75.9281 --75.9391 --75.9437 --75.9422 --75.9328 --75.9469 --75.9344 --75.9453 --75.95 --75.9484 --75.9281 --75.9547 --75.9328 --75.9437 --75.9563 --75.9484 --75.9328 --75.9578 --75.9344 --75.9297 --75.9313 --75.9484 --75.95 --75.9469 --75.9484 --75.9437 --75.9266 --75.9406 --75.9453 --75.9422 --75.9516 --75.9328 --75.9437 --75.9469 --75.9344 --75.9437 --75.9437 --75.9375 --75.9391 --75.9406 --75.9547 --75.9453 --75.9563 --75.9578 --75.9484 --75.9437 --75.9359 --75.9422 --75.9391 --75.9578 --75.9516 --75.95 --75.9531 --75.9563 --75.9563 --75.9578 --75.9594 --75.9609 --75.9594 --75.9516 --75.9563 --75.9578 --75.9609 --75.9672 --75.9547 --75.9563 --75.9625 --75.9656 --75.95 --75.9563 --75.9656 --75.9469 --75.9484 --75.9547 --75.9453 --75.95 --75.95 --75.9609 --75.9531 --75.9484 --75.9344 --75.9328 --75.95 --75.9484 --75.9531 --75.9391 --75.9516 --75.9344 --75.9531 --75.9469 --75.9484 --75.9469 --75.9469 --75.9578 --75.9547 --75.9547 --75.9437 --75.9469 --75.95 --75.95 --75.9578 --75.9437 --75.9531 --75.9563 --75.9453 --75.9453 --75.9453 --75.9422 --75.95 --75.9531 --75.9609 --75.9531 --75.9328 --75.9328 --75.9547 --75.9406 --75.9531 --75.9516 --75.9547 --75.9391 --75.9609 --75.95 --75.9531 --75.9406 --75.9297 --75.9313 --75.9406 --75.9484 --75.9469 --75.9625 --75.9406 --75.9578 --75.9563 --75.9641 --75.9484 --75.9625 --75.9641 --75.9594 --75.9672 --75.95 --75.9563 --75.9484 --75.9563 --75.95 --75.9531 --75.9563 --75.9391 --75.95 --75.9516 --75.9563 --75.9516 --75.9484 --75.95 --75.9688 --75.9656 --75.9578 --75.95 --75.9375 --75.9609 --75.9516 --75.9547 --75.9406 --75.9344 --75.9609 --75.9547 --75.9563 --75.9406 --75.9594 --75.9656 --75.9391 --75.9609 --75.9578 --75.9469 --75.9609 --75.9578 --75.9422 --75.9563 --75.9672 --75.9547 --75.9625 --75.9594 --75.9516 --75.9688 --75.9594 --75.9563 --75.9594 --75.9594 --75.9672 --75.9625 --75.9563 --75.9594 --75.9656 --75.9578 --75.9656 --75.9688 --75.9734 --75.9563 --75.9609 --75.9625 --75.9641 --75.9641 --75.9594 --75.9609 --75.9547 --75.9656 --75.9563 --75.9656 --75.9688 --75.9609 --75.9563 --75.9641 --75.9734 --75.9609 --75.9609 --75.9703 --75.9547 --75.9594 --75.9594 --75.9781 --75.9625 --75.9578 --75.9563 --75.9594 --75.9531 --75.9516 --75.9594 --75.95 --75.9469 --75.9563 --75.9531 --75.9594 --75.9547 --75.9422 --75.9453 --75.9531 --75.95 --75.9531 --75.9563 --75.9547 --75.9672 --75.9703 --75.9547 --75.9594 --75.9516 --75.9547 --75.9578 --75.9578 --75.9609 --75.9703 --75.9531 --75.9594 --75.9563 --75.9609 --75.9563 --75.9688 --75.9422 --75.9531 --75.9594 --75.9641 --75.9563 --75.9656 --75.9469 --75.9688 --75.9672 --75.9563 --75.9625 --75.9609 --75.9594 --75.9578 --75.9672 --75.9656 --75.9656 --75.95 --75.9656 --75.9688 --75.9656 --75.9766 --75.9719 --75.9688 --75.9812 --75.9719 --75.9719 --75.9703 --75.9672 --75.9641 --75.9719 --75.9781 --75.9766 --75.9672 --75.9656 --75.9656 --75.9609 --75.9688 --75.9625 --75.9688 --75.9625 --75.9656 --75.9781 --75.9766 --75.9781 --75.9703 --75.975 --75.9734 --75.9719 --75.9609 --75.9766 --75.9609 --75.9812 --75.9828 --75.9828 --75.9812 --75.9672 --75.9719 --75.9797 --75.975 --75.9797 --75.9719 --75.9719 --75.9812 --75.9625 --75.9766 --75.9812 --75.9797 --75.9719 --75.9766 --75.975 --75.9703 --75.9797 --75.9688 --75.9703 --75.9766 --75.9859 --75.975 --75.9812 --75.9641 --75.9797 --75.9781 --75.9609 --75.9812 --75.9891 --75.9719 --75.975 --75.9688 --75.9641 --75.9656 --75.9766 --75.9797 --75.9891 --75.9781 --75.9672 --75.9703 --75.9703 --75.9766 --75.9625 --75.9734 --75.9688 --75.9812 --75.975 --75.9734 --75.9688 --75.9766 --75.9812 --75.9703 --75.9703 --75.9797 --75.9797 --75.9828 --75.9781 --75.9703 --75.9781 --75.975 --75.9719 --75.9719 --75.9625 --75.9875 --75.9719 --75.9734 --75.9734 --75.9688 --75.9688 --75.9656 --75.9781 --75.9672 --75.9703 --75.9766 --75.9719 --75.9656 --75.9797 --75.9688 --75.9672 --75.9641 --75.9781 --75.9844 --75.9641 --75.9719 --75.9844 --75.9781 --75.9703 --75.9703 --75.9797 --75.9656 --75.9641 --75.9734 --75.9578 --75.9734 --75.9563 --75.9688 --75.9516 --75.9609 --75.9563 --75.9594 --75.9594 --75.9578 --75.9547 --75.9594 --75.9672 --75.9703 --75.9703 --75.9609 --75.9609 --75.9641 --75.975 --75.9609 --75.9609 --75.9531 --75.9578 --75.9516 --75.9531 --75.9703 --75.9641 --75.9656 --75.9703 --75.9469 --75.9641 --75.9563 --75.9688 --75.9625 --75.9578 --75.9641 --75.9656 --75.9641 --75.9672 --75.9578 --75.9547 --75.9688 --75.9672 --75.9609 --75.9625 --75.9625 --75.9609 --75.9594 --75.9516 --75.9594 --75.9703 --75.9594 --75.9656 --75.9719 --75.9625 --75.9578 --75.9563 --75.9625 --75.9766 --75.9734 --75.9563 --75.9766 --75.9656 --75.9641 --75.9891 --75.9563 --75.9812 --75.9656 --75.9781 --75.975 --75.9781 --75.9688 --75.9672 --75.9641 --75.9609 --75.9734 --75.9719 --75.9516 --75.9734 --75.9531 --75.9719 --75.9641 --75.9563 --75.9625 --75.9547 --75.9578 --75.9688 --75.9766 --75.9641 --75.9812 --75.9609 --75.9766 --75.9766 --75.9609 --75.9719 --75.9688 --75.9641 --75.975 --75.9672 --75.9609 --75.9656 --75.9594 --75.9734 --75.9766 --75.9531 --75.9641 --75.9703 --75.9625 --75.9688 --75.9563 --75.9656 --75.9594 --75.9484 --75.9641 --75.9563 --75.9469 --75.9547 --75.9703 --75.9641 --75.9609 --75.9563 --75.9688 --75.9563 --75.9547 --75.9594 --75.9484 --75.9578 --75.9594 --75.9437 --75.9625 --75.9719 --75.9672 --75.9437 --75.9719 --75.9609 --75.9625 --75.9797 --75.9547 --75.9563 --75.9484 --75.9609 --75.9484 --75.9641 --75.9625 --75.9656 --75.9688 --75.9688 --75.9609 --75.9563 --75.9625 --75.9641 --75.9672 --75.9719 --75.9672 --75.9656 --75.9531 --75.9563 --75.9609 --75.9656 --75.9563 --75.9625 --75.9656 --75.9578 --75.9469 --75.9781 --75.9594 --75.9578 --75.9672 --75.9641 --75.9641 --75.9703 --75.9578 --75.9609 --75.9672 --75.9641 --75.9594 --75.9656 --75.9656 --75.9641 --75.9578 --75.9719 --75.95 --75.9641 --75.9531 --75.9656 --75.9578 --75.9563 --75.95 --75.9563 --75.9594 --75.9578 --75.9594 --75.9609 --75.9484 --75.9625 --75.9391 --75.9578 --75.9672 --75.9563 --75.9453 --75.9516 --75.9531 --75.9594 --75.9484 --75.9516 --75.9531 --75.9531 --75.9672 --75.9516 --75.9625 --75.9547 - -2 -4.0025 -100.002 - -0 -1 - -0 -RegionFitness xdat ydat boundary weight (lines=81008) 1 -|| -40500 -0 -0.005 -0.01 -0.015 -0.02 -0.025 -0.03 -0.035 -0.04 -0.045 -0.05 -0.055 -0.06 -0.065 -0.07 -0.075 -0.08 -0.085 -0.09 -0.095 -0.1 -0.105 -0.11 -0.115 -0.12 -0.125 -0.13 -0.135 -0.14 -0.145 -0.15 -0.155 -0.16 -0.165 -0.17 -0.175 -0.18 -0.185 -0.19 -0.195 -0.2 -0.205 -0.21 -0.215 -0.22 -0.225 -0.23 -0.235 -0.24 -0.245 -0.25 -0.255 -0.26 -0.265 -0.27 -0.275 -0.28 -0.285 -0.29 -0.295 -0.3 -0.305 -0.31 -0.315 -0.32 -0.325 -0.33 -0.335 -0.34 -0.345 -0.35 -0.355 -0.36 -0.365 -0.37 -0.375 -0.38 -0.385 -0.39 -0.395 -0.4 -0.405 -0.41 -0.415 -0.42 -0.425 -0.43 -0.435 -0.44 -0.445 -0.45 -0.455 -0.46 -0.465 -0.47 -0.475 -0.48 -0.485 -0.49 -0.495 -0.5 -0.505 -0.51 -0.515 -0.52 -0.525 -0.53 -0.535 -0.54 -0.545 -0.55 -0.555 -0.56 -0.565 -0.57 -0.575 -0.58 -0.585 -0.59 -0.595 -0.6 -0.605 -0.61 -0.615 -0.62 -0.625 -0.63 -0.635 -0.64 -0.645 -0.65 -0.655 -0.66 -0.665 -0.67 -0.675 -0.68 -0.685 -0.69 -0.695 -0.7 -0.705 -0.71 -0.715 -0.72 -0.725 -0.73 -0.735 -0.74 -0.745 -0.75 -0.755 -0.76 -0.765 -0.77 -0.775 -0.78 -0.785 -0.79 -0.795 -0.8 -0.805 -0.81 -0.815 -0.82 -0.825 -0.83 -0.835 -0.84 -0.845 -0.85 -0.855 -0.86 -0.865 -0.87 -0.875 -0.88 -0.885 -0.89 -0.895 -0.9 -0.905 -0.91 -0.915 -0.92 -0.925 -0.93 -0.935 -0.94 -0.945 -0.95 -0.955 -0.96 -0.965 -0.97 -0.975 -0.98 -0.985 -0.99 -0.995 -1 -1.005 -1.01 -1.015 -1.02 -1.025 -1.03 -1.035 -1.04 -1.045 -1.05 -1.055 -1.06 -1.065 -1.07 -1.075 -1.08 -1.085 -1.09 -1.095 -1.1 -1.105 -1.11 -1.115 -1.12 -1.125 -1.13 -1.135 -1.14 -1.145 -1.15 -1.155 -1.16 -1.165 -1.17 -1.175 -1.18 -1.185 -1.19 -1.195 -1.2 -1.205 -1.21 -1.215 -1.22 -1.225 -1.23 -1.235 -1.24 -1.245 -1.25 -1.255 -1.26 -1.265 -1.27 -1.275 -1.28 -1.285 -1.29 -1.295 -1.3 -1.305 -1.31 -1.315 -1.32 -1.325 -1.33 -1.335 -1.34 -1.345 -1.35 -1.355 -1.36 -1.365 -1.37 -1.375 -1.38 -1.385 -1.39 -1.395 -1.4 -1.405 -1.41 -1.415 -1.42 -1.425 -1.43 -1.435 -1.44 -1.445 -1.45 -1.455 -1.46 -1.465 -1.47 -1.475 -1.48 -1.485 -1.49 -1.495 -1.5 -1.505 -1.51 -1.515 -1.52 -1.525 -1.53 -1.535 -1.54 -1.545 -1.55 -1.555 -1.56 -1.565 -1.57 -1.575 -1.58 -1.585 -1.59 -1.595 -1.6 -1.605 -1.61 -1.615 -1.62 -1.625 -1.63 -1.635 -1.64 -1.645 -1.65 -1.655 -1.66 -1.665 -1.67 -1.675 -1.68 -1.685 -1.69 -1.695 -1.7 -1.705 -1.71 -1.715 -1.72 -1.725 -1.73 -1.735 -1.74 -1.745 -1.75 -1.755 -1.76 -1.765 -1.77 -1.775 -1.78 -1.785 -1.79 -1.795 -1.8 -1.805 -1.81 -1.815 -1.82 -1.825 -1.83 -1.835 -1.84 -1.845 -1.85 -1.855 -1.86 -1.865 -1.87 -1.875 -1.88 -1.885 -1.89 -1.895 -1.9 -1.905 -1.91 -1.915 -1.92 -1.925 -1.93 -1.935 -1.94 -1.945 -1.95 -1.955 -1.96 -1.965 -1.97 -1.975 -1.98 -1.985 -1.99 -1.995 -2 -2.005 -2.01 -2.015 -2.02 -2.025 -2.03 -2.035 -2.04 -2.045 -2.05 -2.055 -2.06 -2.065 -2.07 -2.075 -2.08 -2.085 -2.09 -2.095 -2.1 -2.105 -2.11 -2.115 -2.12 -2.125 -2.13 -2.135 -2.14 -2.145 -2.15 -2.155 -2.16 -2.165 -2.17 -2.175 -2.18 -2.185 -2.19 -2.195 -2.2 -2.205 -2.21 -2.215 -2.22 -2.225 -2.23 -2.235 -2.24 -2.245 -2.25 -2.255 -2.26 -2.265 -2.27 -2.275 -2.28 -2.285 -2.29 -2.295 -2.3 -2.305 -2.31 -2.315 -2.32 -2.325 -2.33 -2.335 -2.34 -2.345 -2.35 -2.355 -2.36 -2.365 -2.37 -2.375 -2.38 -2.385 -2.39 -2.395 -2.4 -2.405 -2.41 -2.415 -2.42 -2.425 -2.43 -2.435 -2.44 -2.445 -2.45 -2.455 -2.46 -2.465 -2.47 -2.475 -2.48 -2.485 -2.49 -2.495 -2.5 -2.505 -2.51 -2.515 -2.52 -2.525 -2.53 -2.535 -2.54 -2.545 -2.55 -2.555 -2.56 -2.565 -2.57 -2.575 -2.58 -2.585 -2.59 -2.595 -2.6 -2.605 -2.61 -2.615 -2.62 -2.625 -2.63 -2.635 -2.64 -2.645 -2.65 -2.655 -2.66 -2.665 -2.67 -2.675 -2.68 -2.685 -2.69 -2.695 -2.7 -2.705 -2.71 -2.715 -2.72 -2.725 -2.73 -2.735 -2.74 -2.745 -2.75 -2.755 -2.76 -2.765 -2.77 -2.775 -2.78 -2.785 -2.79 -2.795 -2.8 -2.805 -2.81 -2.815 -2.82 -2.825 -2.83 -2.835 -2.84 -2.845 -2.85 -2.855 -2.86 -2.865 -2.87 -2.875 -2.88 -2.885 -2.89 -2.895 -2.9 -2.905 -2.91 -2.915 -2.92 -2.925 -2.93 -2.935 -2.94 -2.945 -2.95 -2.955 -2.96 -2.965 -2.97 -2.975 -2.98 -2.985 -2.99 -2.995 -3 -3.005 -3.01 -3.015 -3.02 -3.025 -3.03 -3.035 -3.04 -3.045 -3.05 -3.055 -3.06 -3.065 -3.07 -3.075 -3.08 -3.085 -3.09 -3.095 -3.1 -3.105 -3.11 -3.115 -3.12 -3.125 -3.13 -3.135 -3.14 -3.145 -3.15 -3.155 -3.16 -3.165 -3.17 -3.175 -3.18 -3.185 -3.19 -3.195 -3.2 -3.205 -3.21 -3.215 -3.22 -3.225 -3.23 -3.235 -3.24 -3.245 -3.25 -3.255 -3.26 -3.265 -3.27 -3.275 -3.28 -3.285 -3.29 -3.295 -3.3 -3.305 -3.31 -3.315 -3.32 -3.325 -3.33 -3.335 -3.34 -3.345 -3.35 -3.355 -3.36 -3.365 -3.37 -3.375 -3.38 -3.385 -3.39 -3.395 -3.4 -3.405 -3.41 -3.415 -3.42 -3.425 -3.43 -3.435 -3.44 -3.445 -3.45 -3.455 -3.46 -3.465 -3.47 -3.475 -3.48 -3.485 -3.49 -3.495 -3.5 -3.505 -3.51 -3.515 -3.52 -3.525 -3.53 -3.535 -3.54 -3.545 -3.55 -3.555 -3.56 -3.565 -3.57 -3.575 -3.58 -3.585 -3.59 -3.595 -3.6 -3.605 -3.61 -3.615 -3.62 -3.625 -3.63 -3.635 -3.64 -3.645 -3.65 -3.655 -3.66 -3.665 -3.67 -3.675 -3.68 -3.685 -3.69 -3.695 -3.7 -3.705 -3.71 -3.715 -3.72 -3.725 -3.73 -3.735 -3.74 -3.745 -3.75 -3.755 -3.76 -3.765 -3.77 -3.775 -3.78 -3.785 -3.79 -3.795 -3.8 -3.805 -3.81 -3.815 -3.82 -3.825 -3.83 -3.835 -3.84 -3.845 -3.85 -3.855 -3.86 -3.865 -3.87 -3.875 -3.88 -3.885 -3.89 -3.895 -3.9 -3.905 -3.91 -3.915 -3.92 -3.925 -3.93 -3.935 -3.94 -3.945 -3.95 -3.955 -3.96 -3.965 -3.97 -3.975 -3.98 -3.985 -3.99 -3.995 -4 -4.005 -4.01 -4.015 -4.02 -4.025 -4.03 -4.035 -4.04 -4.045 -4.05 -4.055 -4.06 -4.065 -4.07 -4.075 -4.08 -4.085 -4.09 -4.095 -4.1 -4.105 -4.11 -4.115 -4.12 -4.125 -4.13 -4.135 -4.14 -4.145 -4.15 -4.155 -4.16 -4.165 -4.17 -4.175 -4.18 -4.185 -4.19 -4.195 -4.2 -4.205 -4.21 -4.215 -4.22 -4.225 -4.23 -4.235 -4.24 -4.245 -4.25 -4.255 -4.26 -4.265 -4.27 -4.275 -4.28 -4.285 -4.29 -4.295 -4.3 -4.305 -4.31 -4.315 -4.32 -4.325 -4.33 -4.335 -4.34 -4.345 -4.35 -4.355 -4.36 -4.365 -4.37 -4.375 -4.38 -4.385 -4.39 -4.395 -4.4 -4.405 -4.41 -4.415 -4.42 -4.425 -4.43 -4.435 -4.44 -4.445 -4.45 -4.455 -4.46 -4.465 -4.47 -4.475 -4.48 -4.485 -4.49 -4.495 -4.5 -4.505 -4.51 -4.515 -4.52 -4.525 -4.53 -4.535 -4.54 -4.545 -4.55 -4.555 -4.56 -4.565 -4.57 -4.575 -4.58 -4.585 -4.59 -4.595 -4.6 -4.605 -4.61 -4.615 -4.62 -4.625 -4.63 -4.635 -4.64 -4.645 -4.65 -4.655 -4.66 -4.665 -4.67 -4.675 -4.68 -4.685 -4.69 -4.695 -4.7 -4.705 -4.71 -4.715 -4.72 -4.725 -4.73 -4.735 -4.74 -4.745 -4.75 -4.755 -4.76 -4.765 -4.77 -4.775 -4.78 -4.785 -4.79 -4.795 -4.8 -4.805 -4.81 -4.815 -4.82 -4.825 -4.83 -4.835 -4.84 -4.845 -4.85 -4.855 -4.86 -4.865 -4.87 -4.875 -4.88 -4.885 -4.89 -4.895 -4.9 -4.905 -4.91 -4.915 -4.92 -4.925 -4.93 -4.935 -4.94 -4.945 -4.95 -4.955 -4.96 -4.965 -4.97 -4.975 -4.98 -4.985 -4.99 -4.995 -5 -5.005 -5.01 -5.015 -5.02 -5.025 -5.03 -5.035 -5.04 -5.045 -5.05 -5.055 -5.06 -5.065 -5.07 -5.075 -5.08 -5.085 -5.09 -5.095 -5.1 -5.105 -5.11 -5.115 -5.12 -5.125 -5.13 -5.135 -5.14 -5.145 -5.15 -5.155 -5.16 -5.165 -5.17 -5.175 -5.18 -5.185 -5.19 -5.195 -5.2 -5.205 -5.21 -5.215 -5.22 -5.225 -5.23 -5.235 -5.24 -5.245 -5.25 -5.255 -5.26 -5.265 -5.27 -5.275 -5.28 -5.285 -5.29 -5.295 -5.3 -5.305 -5.31 -5.315 -5.32 -5.325 -5.33 -5.335 -5.34 -5.345 -5.35 -5.355 -5.36 -5.365 -5.37 -5.375 -5.38 -5.385 -5.39 -5.395 -5.4 -5.405 -5.41 -5.415 -5.42 -5.425 -5.43 -5.435 -5.44 -5.445 -5.45 -5.455 -5.46 -5.465 -5.47 -5.475 -5.48 -5.485 -5.49 -5.495 -5.5 -5.505 -5.51 -5.515 -5.52 -5.525 -5.53 -5.535 -5.54 -5.545 -5.55 -5.555 -5.56 -5.565 -5.57 -5.575 -5.58 -5.585 -5.59 -5.595 -5.6 -5.605 -5.61 -5.615 -5.62 -5.625 -5.63 -5.635 -5.64 -5.645 -5.65 -5.655 -5.66 -5.665 -5.67 -5.675 -5.68 -5.685 -5.69 -5.695 -5.7 -5.705 -5.71 -5.715 -5.72 -5.725 -5.73 -5.735 -5.74 -5.745 -5.75 -5.755 -5.76 -5.765 -5.77 -5.775 -5.78 -5.785 -5.79 -5.795 -5.8 -5.805 -5.81 -5.815 -5.82 -5.825 -5.83 -5.835 -5.84 -5.845 -5.85 -5.855 -5.86 -5.865 -5.87 -5.875 -5.88 -5.885 -5.89 -5.895 -5.9 -5.905 -5.91 -5.915 -5.92 -5.925 -5.93 -5.935 -5.94 -5.945 -5.95 -5.955 -5.96 -5.965 -5.97 -5.975 -5.98 -5.985 -5.99 -5.995 -6 -6.005 -6.01 -6.015 -6.02 -6.025 -6.03 -6.035 -6.04 -6.045 -6.05 -6.055 -6.06 -6.065 -6.07 -6.075 -6.08 -6.085 -6.09 -6.095 -6.1 -6.105 -6.11 -6.115 -6.12 -6.125 -6.13 -6.135 -6.14 -6.145 -6.15 -6.155 -6.16 -6.165 -6.17 -6.175 -6.18 -6.185 -6.19 -6.195 -6.2 -6.205 -6.21 -6.215 -6.22 -6.225 -6.23 -6.235 -6.24 -6.245 -6.25 -6.255 -6.26 -6.265 -6.27 -6.275 -6.28 -6.285 -6.29 -6.295 -6.3 -6.305 -6.31 -6.315 -6.32 -6.325 -6.33 -6.335 -6.34 -6.345 -6.35 -6.355 -6.36 -6.365 -6.37 -6.375 -6.38 -6.385 -6.39 -6.395 -6.4 -6.405 -6.41 -6.415 -6.42 -6.425 -6.43 -6.435 -6.44 -6.445 -6.45 -6.455 -6.46 -6.465 -6.47 -6.475 -6.48 -6.485 -6.49 -6.495 -6.5 -6.505 -6.51 -6.515 -6.52 -6.525 -6.53 -6.535 -6.54 -6.545 -6.55 -6.555 -6.56 -6.565 -6.57 -6.575 -6.58 -6.585 -6.59 -6.595 -6.6 -6.605 -6.61 -6.615 -6.62 -6.625 -6.63 -6.635 -6.64 -6.645 -6.65 -6.655 -6.66 -6.665 -6.67 -6.675 -6.68 -6.685 -6.69 -6.695 -6.7 -6.705 -6.71 -6.715 -6.72 -6.725 -6.73 -6.735 -6.74 -6.745 -6.75 -6.755 -6.76 -6.765 -6.77 -6.775 -6.78 -6.785 -6.79 -6.795 -6.8 -6.805 -6.81 -6.815 -6.82 -6.825 -6.83 -6.835 -6.84 -6.845 -6.85 -6.855 -6.86 -6.865 -6.87 -6.875 -6.88 -6.885 -6.89 -6.895 -6.9 -6.905 -6.91 -6.915 -6.92 -6.925 -6.93 -6.935 -6.94 -6.945 -6.95 -6.955 -6.96 -6.965 -6.97 -6.975 -6.98 -6.985 -6.99 -6.995 -7 -7.005 -7.01 -7.015 -7.02 -7.025 -7.03 -7.035 -7.04 -7.045 -7.05 -7.055 -7.06 -7.065 -7.07 -7.075 -7.08 -7.085 -7.09 -7.095 -7.1 -7.105 -7.11 -7.115 -7.12 -7.125 -7.13 -7.135 -7.14 -7.145 -7.15 -7.155 -7.16 -7.165 -7.17 -7.175 -7.18 -7.185 -7.19 -7.195 -7.2 -7.205 -7.21 -7.215 -7.22 -7.225 -7.23 -7.235 -7.24 -7.245 -7.25 -7.255 -7.26 -7.265 -7.27 -7.275 -7.28 -7.285 -7.29 -7.295 -7.3 -7.305 -7.31 -7.315 -7.32 -7.325 -7.33 -7.335 -7.34 -7.345 -7.35 -7.355 -7.36 -7.365 -7.37 -7.375 -7.38 -7.385 -7.39 -7.395 -7.4 -7.405 -7.41 -7.415 -7.42 -7.425 -7.43 -7.435 -7.44 -7.445 -7.45 -7.455 -7.46 -7.465 -7.47 -7.475 -7.48 -7.485 -7.49 -7.495 -7.5 -7.505 -7.51 -7.515 -7.52 -7.525 -7.53 -7.535 -7.54 -7.545 -7.55 -7.555 -7.56 -7.565 -7.57 -7.575 -7.58 -7.585 -7.59 -7.595 -7.6 -7.605 -7.61 -7.615 -7.62 -7.625 -7.63 -7.635 -7.64 -7.645 -7.65 -7.655 -7.66 -7.665 -7.67 -7.675 -7.68 -7.685 -7.69 -7.695 -7.7 -7.705 -7.71 -7.715 -7.72 -7.725 -7.73 -7.735 -7.74 -7.745 -7.75 -7.755 -7.76 -7.765 -7.77 -7.775 -7.78 -7.785 -7.79 -7.795 -7.8 -7.805 -7.81 -7.815 -7.82 -7.825 -7.83 -7.835 -7.84 -7.845 -7.85 -7.855 -7.86 -7.865 -7.87 -7.875 -7.88 -7.885 -7.89 -7.895 -7.9 -7.905 -7.91 -7.915 -7.92 -7.925 -7.93 -7.935 -7.94 -7.945 -7.95 -7.955 -7.96 -7.965 -7.97 -7.975 -7.98 -7.985 -7.99 -7.995 -8 -8.005 -8.01 -8.015 -8.02 -8.025 -8.03 -8.035 -8.04 -8.045 -8.05 -8.055 -8.06 -8.065 -8.07 -8.075 -8.08 -8.085 -8.09 -8.095 -8.1 -8.105 -8.11 -8.115 -8.12 -8.125 -8.13 -8.135 -8.14 -8.145 -8.15 -8.155 -8.16 -8.165 -8.17 -8.175 -8.18 -8.185 -8.19 -8.195 -8.2 -8.205 -8.21 -8.215 -8.22 -8.225 -8.23 -8.235 -8.24 -8.245 -8.25 -8.255 -8.26 -8.265 -8.27 -8.275 -8.28 -8.285 -8.29 -8.295 -8.3 -8.305 -8.31 -8.315 -8.32 -8.325 -8.33 -8.335 -8.34 -8.345 -8.35 -8.355 -8.36 -8.365 -8.37 -8.375 -8.38 -8.385 -8.39 -8.395 -8.4 -8.405 -8.41 -8.415 -8.42 -8.425 -8.43 -8.435 -8.44 -8.445 -8.45 -8.455 -8.46 -8.465 -8.47 -8.475 -8.48 -8.485 -8.49 -8.495 -8.5 -8.505 -8.51 -8.515 -8.52 -8.525 -8.53 -8.535 -8.54 -8.545 -8.55 -8.555 -8.56 -8.565 -8.57 -8.575 -8.58 -8.585 -8.59 -8.595 -8.6 -8.605 -8.61 -8.615 -8.62 -8.625 -8.63 -8.635 -8.64 -8.645 -8.65 -8.655 -8.66 -8.665 -8.67 -8.675 -8.68 -8.685 -8.69 -8.695 -8.7 -8.705 -8.71 -8.715 -8.72 -8.725 -8.73 -8.735 -8.74 -8.745 -8.75 -8.755 -8.76 -8.765 -8.77 -8.775 -8.78 -8.785 -8.79 -8.795 -8.8 -8.805 -8.81 -8.815 -8.82 -8.825 -8.83 -8.835 -8.84 -8.845 -8.85 -8.855 -8.86 -8.865 -8.87 -8.875 -8.88 -8.885 -8.89 -8.895 -8.9 -8.905 -8.91 -8.915 -8.92 -8.925 -8.93 -8.935 -8.94 -8.945 -8.95 -8.955 -8.96 -8.965 -8.97 -8.975 -8.98 -8.985 -8.99 -8.995 -9 -9.005 -9.01 -9.015 -9.02 -9.025 -9.03 -9.035 -9.04 -9.045 -9.05 -9.055 -9.06 -9.065 -9.07 -9.075 -9.08 -9.085 -9.09 -9.095 -9.1 -9.105 -9.11 -9.115 -9.12 -9.125 -9.13 -9.135 -9.14 -9.145 -9.15 -9.155 -9.16 -9.165 -9.17 -9.175 -9.18 -9.185 -9.19 -9.195 -9.2 -9.205 -9.21 -9.215 -9.22 -9.225 -9.23 -9.235 -9.24 -9.245 -9.25 -9.255 -9.26 -9.265 -9.27 -9.275 -9.28 -9.285 -9.29 -9.295 -9.3 -9.305 -9.31 -9.315 -9.32 -9.325 -9.33 -9.335 -9.34 -9.345 -9.35 -9.355 -9.36 -9.365 -9.37 -9.375 -9.38 -9.385 -9.39 -9.395 -9.4 -9.405 -9.41 -9.415 -9.42 -9.425 -9.43 -9.435 -9.44 -9.445 -9.45 -9.455 -9.46 -9.465 -9.47 -9.475 -9.48 -9.485 -9.49 -9.495 -9.5 -9.505 -9.51 -9.515 -9.52 -9.525 -9.53 -9.535 -9.54 -9.545 -9.55 -9.555 -9.56 -9.565 -9.57 -9.575 -9.58 -9.585 -9.59 -9.595 -9.6 -9.605 -9.61 -9.615 -9.62 -9.625 -9.63 -9.635 -9.64 -9.645 -9.65 -9.655 -9.66 -9.665 -9.67 -9.675 -9.68 -9.685 -9.69 -9.695 -9.7 -9.705 -9.71 -9.715 -9.72 -9.725 -9.73 -9.735 -9.74 -9.745 -9.75 -9.755 -9.76 -9.765 -9.77 -9.775 -9.78 -9.785 -9.79 -9.795 -9.8 -9.805 -9.81 -9.815 -9.82 -9.825 -9.83 -9.835 -9.84 -9.845 -9.85 -9.855 -9.86 -9.865 -9.87 -9.875 -9.88 -9.885 -9.89 -9.895 -9.9 -9.905 -9.91 -9.915 -9.92 -9.925 -9.93 -9.935 -9.94 -9.945 -9.95 -9.955 -9.96 -9.965 -9.97 -9.975 -9.98 -9.985 -9.99 -9.995 -10 -10.005 -10.01 -10.015 -10.02 -10.025 -10.03 -10.035 -10.04 -10.045 -10.05 -10.055 -10.06 -10.065 -10.07 -10.075 -10.08 -10.085 -10.09 -10.095 -10.1 -10.105 -10.11 -10.115 -10.12 -10.125 -10.13 -10.135 -10.14 -10.145 -10.15 -10.155 -10.16 -10.165 -10.17 -10.175 -10.18 -10.185 -10.19 -10.195 -10.2 -10.205 -10.21 -10.215 -10.22 -10.225 -10.23 -10.235 -10.24 -10.245 -10.25 -10.255 -10.26 -10.265 -10.27 -10.275 -10.28 -10.285 -10.29 -10.295 -10.3 -10.305 -10.31 -10.315 -10.32 -10.325 -10.33 -10.335 -10.34 -10.345 -10.35 -10.355 -10.36 -10.365 -10.37 -10.375 -10.38 -10.385 -10.39 -10.395 -10.4 -10.405 -10.41 -10.415 -10.42 -10.425 -10.43 -10.435 -10.44 -10.445 -10.45 -10.455 -10.46 -10.465 -10.47 -10.475 -10.48 -10.485 -10.49 -10.495 -10.5 -10.505 -10.51 -10.515 -10.52 -10.525 -10.53 -10.535 -10.54 -10.545 -10.55 -10.555 -10.56 -10.565 -10.57 -10.575 -10.58 -10.585 -10.59 -10.595 -10.6 -10.605 -10.61 -10.615 -10.62 -10.625 -10.63 -10.635 -10.64 -10.645 -10.65 -10.655 -10.66 -10.665 -10.67 -10.675 -10.68 -10.685 -10.69 -10.695 -10.7 -10.705 -10.71 -10.715 -10.72 -10.725 -10.73 -10.735 -10.74 -10.745 -10.75 -10.755 -10.76 -10.765 -10.77 -10.775 -10.78 -10.785 -10.79 -10.795 -10.8 -10.805 -10.81 -10.815 -10.82 -10.825 -10.83 -10.835 -10.84 -10.845 -10.85 -10.855 -10.86 -10.865 -10.87 -10.875 -10.88 -10.885 -10.89 -10.895 -10.9 -10.905 -10.91 -10.915 -10.92 -10.925 -10.93 -10.935 -10.94 -10.945 -10.95 -10.955 -10.96 -10.965 -10.97 -10.975 -10.98 -10.985 -10.99 -10.995 -11 -11.005 -11.01 -11.015 -11.02 -11.025 -11.03 -11.035 -11.04 -11.045 -11.05 -11.055 -11.06 -11.065 -11.07 -11.075 -11.08 -11.085 -11.09 -11.095 -11.1 -11.105 -11.11 -11.115 -11.12 -11.125 -11.13 -11.135 -11.14 -11.145 -11.15 -11.155 -11.16 -11.165 -11.17 -11.175 -11.18 -11.185 -11.19 -11.195 -11.2 -11.205 -11.21 -11.215 -11.22 -11.225 -11.23 -11.235 -11.24 -11.245 -11.25 -11.255 -11.26 -11.265 -11.27 -11.275 -11.28 -11.285 -11.29 -11.295 -11.3 -11.305 -11.31 -11.315 -11.32 -11.325 -11.33 -11.335 -11.34 -11.345 -11.35 -11.355 -11.36 -11.365 -11.37 -11.375 -11.38 -11.385 -11.39 -11.395 -11.4 -11.405 -11.41 -11.415 -11.42 -11.425 -11.43 -11.435 -11.44 -11.445 -11.45 -11.455 -11.46 -11.465 -11.47 -11.475 -11.48 -11.485 -11.49 -11.495 -11.5 -11.505 -11.51 -11.515 -11.52 -11.525 -11.53 -11.535 -11.54 -11.545 -11.55 -11.555 -11.56 -11.565 -11.57 -11.575 -11.58 -11.585 -11.59 -11.595 -11.6 -11.605 -11.61 -11.615 -11.62 -11.625 -11.63 -11.635 -11.64 -11.645 -11.65 -11.655 -11.66 -11.665 -11.67 -11.675 -11.68 -11.685 -11.69 -11.695 -11.7 -11.705 -11.71 -11.715 -11.72 -11.725 -11.73 -11.735 -11.74 -11.745 -11.75 -11.755 -11.76 -11.765 -11.77 -11.775 -11.78 -11.785 -11.79 -11.795 -11.8 -11.805 -11.81 -11.815 -11.82 -11.825 -11.83 -11.835 -11.84 -11.845 -11.85 -11.855 -11.86 -11.865 -11.87 -11.875 -11.88 -11.885 -11.89 -11.895 -11.9 -11.905 -11.91 -11.915 -11.92 -11.925 -11.93 -11.935 -11.94 -11.945 -11.95 -11.955 -11.96 -11.965 -11.97 -11.975 -11.98 -11.985 -11.99 -11.995 -12 -12.005 -12.01 -12.015 -12.02 -12.025 -12.03 -12.035 -12.04 -12.045 -12.05 -12.055 -12.06 -12.065 -12.07 -12.075 -12.08 -12.085 -12.09 -12.095 -12.1 -12.105 -12.11 -12.115 -12.12 -12.125 -12.13 -12.135 -12.14 -12.145 -12.15 -12.155 -12.16 -12.165 -12.17 -12.175 -12.18 -12.185 -12.19 -12.195 -12.2 -12.205 -12.21 -12.215 -12.22 -12.225 -12.23 -12.235 -12.24 -12.245 -12.25 -12.255 -12.26 -12.265 -12.27 -12.275 -12.28 -12.285 -12.29 -12.295 -12.3 -12.305 -12.31 -12.315 -12.32 -12.325 -12.33 -12.335 -12.34 -12.345 -12.35 -12.355 -12.36 -12.365 -12.37 -12.375 -12.38 -12.385 -12.39 -12.395 -12.4 -12.405 -12.41 -12.415 -12.42 -12.425 -12.43 -12.435 -12.44 -12.445 -12.45 -12.455 -12.46 -12.465 -12.47 -12.475 -12.48 -12.485 -12.49 -12.495 -12.5 -12.505 -12.51 -12.515 -12.52 -12.525 -12.53 -12.535 -12.54 -12.545 -12.55 -12.555 -12.56 -12.565 -12.57 -12.575 -12.58 -12.585 -12.59 -12.595 -12.6 -12.605 -12.61 -12.615 -12.62 -12.625 -12.63 -12.635 -12.64 -12.645 -12.65 -12.655 -12.66 -12.665 -12.67 -12.675 -12.68 -12.685 -12.69 -12.695 -12.7 -12.705 -12.71 -12.715 -12.72 -12.725 -12.73 -12.735 -12.74 -12.745 -12.75 -12.755 -12.76 -12.765 -12.77 -12.775 -12.78 -12.785 -12.79 -12.795 -12.8 -12.805 -12.81 -12.815 -12.82 -12.825 -12.83 -12.835 -12.84 -12.845 -12.85 -12.855 -12.86 -12.865 -12.87 -12.875 -12.88 -12.885 -12.89 -12.895 -12.9 -12.905 -12.91 -12.915 -12.92 -12.925 -12.93 -12.935 -12.94 -12.945 -12.95 -12.955 -12.96 -12.965 -12.97 -12.975 -12.98 -12.985 -12.99 -12.995 -13 -13.005 -13.01 -13.015 -13.02 -13.025 -13.03 -13.035 -13.04 -13.045 -13.05 -13.055 -13.06 -13.065 -13.07 -13.075 -13.08 -13.085 -13.09 -13.095 -13.1 -13.105 -13.11 -13.115 -13.12 -13.125 -13.13 -13.135 -13.14 -13.145 -13.15 -13.155 -13.16 -13.165 -13.17 -13.175 -13.18 -13.185 -13.19 -13.195 -13.2 -13.205 -13.21 -13.215 -13.22 -13.225 -13.23 -13.235 -13.24 -13.245 -13.25 -13.255 -13.26 -13.265 -13.27 -13.275 -13.28 -13.285 -13.29 -13.295 -13.3 -13.305 -13.31 -13.315 -13.32 -13.325 -13.33 -13.335 -13.34 -13.345 -13.35 -13.355 -13.36 -13.365 -13.37 -13.375 -13.38 -13.385 -13.39 -13.395 -13.4 -13.405 -13.41 -13.415 -13.42 -13.425 -13.43 -13.435 -13.44 -13.445 -13.45 -13.455 -13.46 -13.465 -13.47 -13.475 -13.48 -13.485 -13.49 -13.495 -13.5 -13.505 -13.51 -13.515 -13.52 -13.525 -13.53 -13.535 -13.54 -13.545 -13.55 -13.555 -13.56 -13.565 -13.57 -13.575 -13.58 -13.585 -13.59 -13.595 -13.6 -13.605 -13.61 -13.615 -13.62 -13.625 -13.63 -13.635 -13.64 -13.645 -13.65 -13.655 -13.66 -13.665 -13.67 -13.675 -13.68 -13.685 -13.69 -13.695 -13.7 -13.705 -13.71 -13.715 -13.72 -13.725 -13.73 -13.735 -13.74 -13.745 -13.75 -13.755 -13.76 -13.765 -13.77 -13.775 -13.78 -13.785 -13.79 -13.795 -13.8 -13.805 -13.81 -13.815 -13.82 -13.825 -13.83 -13.835 -13.84 -13.845 -13.85 -13.855 -13.86 -13.865 -13.87 -13.875 -13.88 -13.885 -13.89 -13.895 -13.9 -13.905 -13.91 -13.915 -13.92 -13.925 -13.93 -13.935 -13.94 -13.945 -13.95 -13.955 -13.96 -13.965 -13.97 -13.975 -13.98 -13.985 -13.99 -13.995 -14 -14.005 -14.01 -14.015 -14.02 -14.025 -14.03 -14.035 -14.04 -14.045 -14.05 -14.055 -14.06 -14.065 -14.07 -14.075 -14.08 -14.085 -14.09 -14.095 -14.1 -14.105 -14.11 -14.115 -14.12 -14.125 -14.13 -14.135 -14.14 -14.145 -14.15 -14.155 -14.16 -14.165 -14.17 -14.175 -14.18 -14.185 -14.19 -14.195 -14.2 -14.205 -14.21 -14.215 -14.22 -14.225 -14.23 -14.235 -14.24 -14.245 -14.25 -14.255 -14.26 -14.265 -14.27 -14.275 -14.28 -14.285 -14.29 -14.295 -14.3 -14.305 -14.31 -14.315 -14.32 -14.325 -14.33 -14.335 -14.34 -14.345 -14.35 -14.355 -14.36 -14.365 -14.37 -14.375 -14.38 -14.385 -14.39 -14.395 -14.4 -14.405 -14.41 -14.415 -14.42 -14.425 -14.43 -14.435 -14.44 -14.445 -14.45 -14.455 -14.46 -14.465 -14.47 -14.475 -14.48 -14.485 -14.49 -14.495 -14.5 -14.505 -14.51 -14.515 -14.52 -14.525 -14.53 -14.535 -14.54 -14.545 -14.55 -14.555 -14.56 -14.565 -14.57 -14.575 -14.58 -14.585 -14.59 -14.595 -14.6 -14.605 -14.61 -14.615 -14.62 -14.625 -14.63 -14.635 -14.64 -14.645 -14.65 -14.655 -14.66 -14.665 -14.67 -14.675 -14.68 -14.685 -14.69 -14.695 -14.7 -14.705 -14.71 -14.715 -14.72 -14.725 -14.73 -14.735 -14.74 -14.745 -14.75 -14.755 -14.76 -14.765 -14.77 -14.775 -14.78 -14.785 -14.79 -14.795 -14.8 -14.805 -14.81 -14.815 -14.82 -14.825 -14.83 -14.835 -14.84 -14.845 -14.85 -14.855 -14.86 -14.865 -14.87 -14.875 -14.88 -14.885 -14.89 -14.895 -14.9 -14.905 -14.91 -14.915 -14.92 -14.925 -14.93 -14.935 -14.94 -14.945 -14.95 -14.955 -14.96 -14.965 -14.97 -14.975 -14.98 -14.985 -14.99 -14.995 -15 -15.005 -15.01 -15.015 -15.02 -15.025 -15.03 -15.035 -15.04 -15.045 -15.05 -15.055 -15.06 -15.065 -15.07 -15.075 -15.08 -15.085 -15.09 -15.095 -15.1 -15.105 -15.11 -15.115 -15.12 -15.125 -15.13 -15.135 -15.14 -15.145 -15.15 -15.155 -15.16 -15.165 -15.17 -15.175 -15.18 -15.185 -15.19 -15.195 -15.2 -15.205 -15.21 -15.215 -15.22 -15.225 -15.23 -15.235 -15.24 -15.245 -15.25 -15.255 -15.26 -15.265 -15.27 -15.275 -15.28 -15.285 -15.29 -15.295 -15.3 -15.305 -15.31 -15.315 -15.32 -15.325 -15.33 -15.335 -15.34 -15.345 -15.35 -15.355 -15.36 -15.365 -15.37 -15.375 -15.38 -15.385 -15.39 -15.395 -15.4 -15.405 -15.41 -15.415 -15.42 -15.425 -15.43 -15.435 -15.44 -15.445 -15.45 -15.455 -15.46 -15.465 -15.47 -15.475 -15.48 -15.485 -15.49 -15.495 -15.5 -15.505 -15.51 -15.515 -15.52 -15.525 -15.53 -15.535 -15.54 -15.545 -15.55 -15.555 -15.56 -15.565 -15.57 -15.575 -15.58 -15.585 -15.59 -15.595 -15.6 -15.605 -15.61 -15.615 -15.62 -15.625 -15.63 -15.635 -15.64 -15.645 -15.65 -15.655 -15.66 -15.665 -15.67 -15.675 -15.68 -15.685 -15.69 -15.695 -15.7 -15.705 -15.71 -15.715 -15.72 -15.725 -15.73 -15.735 -15.74 -15.745 -15.75 -15.755 -15.76 -15.765 -15.77 -15.775 -15.78 -15.785 -15.79 -15.795 -15.8 -15.805 -15.81 -15.815 -15.82 -15.825 -15.83 -15.835 -15.84 -15.845 -15.85 -15.855 -15.86 -15.865 -15.87 -15.875 -15.88 -15.885 -15.89 -15.895 -15.9 -15.905 -15.91 -15.915 -15.92 -15.925 -15.93 -15.935 -15.94 -15.945 -15.95 -15.955 -15.96 -15.965 -15.97 -15.975 -15.98 -15.985 -15.99 -15.995 -16 -16.005 -16.01 -16.015 -16.02 -16.025 -16.03 -16.035 -16.04 -16.045 -16.05 -16.055 -16.06 -16.065 -16.07 -16.075 -16.08 -16.085 -16.09 -16.095 -16.1 -16.105 -16.11 -16.115 -16.12 -16.125 -16.13 -16.135 -16.14 -16.145 -16.15 -16.155 -16.16 -16.165 -16.17 -16.175 -16.18 -16.185 -16.19 -16.195 -16.2 -16.205 -16.21 -16.215 -16.22 -16.225 -16.23 -16.235 -16.24 -16.245 -16.25 -16.255 -16.26 -16.265 -16.27 -16.275 -16.28 -16.285 -16.29 -16.295 -16.3 -16.305 -16.31 -16.315 -16.32 -16.325 -16.33 -16.335 -16.34 -16.345 -16.35 -16.355 -16.36 -16.365 -16.37 -16.375 -16.38 -16.385 -16.39 -16.395 -16.4 -16.405 -16.41 -16.415 -16.42 -16.425 -16.43 -16.435 -16.44 -16.445 -16.45 -16.455 -16.46 -16.465 -16.47 -16.475 -16.48 -16.485 -16.49 -16.495 -16.5 -16.505 -16.51 -16.515 -16.52 -16.525 -16.53 -16.535 -16.54 -16.545 -16.55 -16.555 -16.56 -16.565 -16.57 -16.575 -16.58 -16.585 -16.59 -16.595 -16.6 -16.605 -16.61 -16.615 -16.62 -16.625 -16.63 -16.635 -16.64 -16.645 -16.65 -16.655 -16.66 -16.665 -16.67 -16.675 -16.68 -16.685 -16.69 -16.695 -16.7 -16.705 -16.71 -16.715 -16.72 -16.725 -16.73 -16.735 -16.74 -16.745 -16.75 -16.755 -16.76 -16.765 -16.77 -16.775 -16.78 -16.785 -16.79 -16.795 -16.8 -16.805 -16.81 -16.815 -16.82 -16.825 -16.83 -16.835 -16.84 -16.845 -16.85 -16.855 -16.86 -16.865 -16.87 -16.875 -16.88 -16.885 -16.89 -16.895 -16.9 -16.905 -16.91 -16.915 -16.92 -16.925 -16.93 -16.935 -16.94 -16.945 -16.95 -16.955 -16.96 -16.965 -16.97 -16.975 -16.98 -16.985 -16.99 -16.995 -17 -17.005 -17.01 -17.015 -17.02 -17.025 -17.03 -17.035 -17.04 -17.045 -17.05 -17.055 -17.06 -17.065 -17.07 -17.075 -17.08 -17.085 -17.09 -17.095 -17.1 -17.105 -17.11 -17.115 -17.12 -17.125 -17.13 -17.135 -17.14 -17.145 -17.15 -17.155 -17.16 -17.165 -17.17 -17.175 -17.18 -17.185 -17.19 -17.195 -17.2 -17.205 -17.21 -17.215 -17.22 -17.225 -17.23 -17.235 -17.24 -17.245 -17.25 -17.255 -17.26 -17.265 -17.27 -17.275 -17.28 -17.285 -17.29 -17.295 -17.3 -17.305 -17.31 -17.315 -17.32 -17.325 -17.33 -17.335 -17.34 -17.345 -17.35 -17.355 -17.36 -17.365 -17.37 -17.375 -17.38 -17.385 -17.39 -17.395 -17.4 -17.405 -17.41 -17.415 -17.42 -17.425 -17.43 -17.435 -17.44 -17.445 -17.45 -17.455 -17.46 -17.465 -17.47 -17.475 -17.48 -17.485 -17.49 -17.495 -17.5 -17.505 -17.51 -17.515 -17.52 -17.525 -17.53 -17.535 -17.54 -17.545 -17.55 -17.555 -17.56 -17.565 -17.57 -17.575 -17.58 -17.585 -17.59 -17.595 -17.6 -17.605 -17.61 -17.615 -17.62 -17.625 -17.63 -17.635 -17.64 -17.645 -17.65 -17.655 -17.66 -17.665 -17.67 -17.675 -17.68 -17.685 -17.69 -17.695 -17.7 -17.705 -17.71 -17.715 -17.72 -17.725 -17.73 -17.735 -17.74 -17.745 -17.75 -17.755 -17.76 -17.765 -17.77 -17.775 -17.78 -17.785 -17.79 -17.795 -17.8 -17.805 -17.81 -17.815 -17.82 -17.825 -17.83 -17.835 -17.84 -17.845 -17.85 -17.855 -17.86 -17.865 -17.87 -17.875 -17.88 -17.885 -17.89 -17.895 -17.9 -17.905 -17.91 -17.915 -17.92 -17.925 -17.93 -17.935 -17.94 -17.945 -17.95 -17.955 -17.96 -17.965 -17.97 -17.975 -17.98 -17.985 -17.99 -17.995 -18 -18.005 -18.01 -18.015 -18.02 -18.025 -18.03 -18.035 -18.04 -18.045 -18.05 -18.055 -18.06 -18.065 -18.07 -18.075 -18.08 -18.085 -18.09 -18.095 -18.1 -18.105 -18.11 -18.115 -18.12 -18.125 -18.13 -18.135 -18.14 -18.145 -18.15 -18.155 -18.16 -18.165 -18.17 -18.175 -18.18 -18.185 -18.19 -18.195 -18.2 -18.205 -18.21 -18.215 -18.22 -18.225 -18.23 -18.235 -18.24 -18.245 -18.25 -18.255 -18.26 -18.265 -18.27 -18.275 -18.28 -18.285 -18.29 -18.295 -18.3 -18.305 -18.31 -18.315 -18.32 -18.325 -18.33 -18.335 -18.34 -18.345 -18.35 -18.355 -18.36 -18.365 -18.37 -18.375 -18.38 -18.385 -18.39 -18.395 -18.4 -18.405 -18.41 -18.415 -18.42 -18.425 -18.43 -18.435 -18.44 -18.445 -18.45 -18.455 -18.46 -18.465 -18.47 -18.475 -18.48 -18.485 -18.49 -18.495 -18.5 -18.505 -18.51 -18.515 -18.52 -18.525 -18.53 -18.535 -18.54 -18.545 -18.55 -18.555 -18.56 -18.565 -18.57 -18.575 -18.58 -18.585 -18.59 -18.595 -18.6 -18.605 -18.61 -18.615 -18.62 -18.625 -18.63 -18.635 -18.64 -18.645 -18.65 -18.655 -18.66 -18.665 -18.67 -18.675 -18.68 -18.685 -18.69 -18.695 -18.7 -18.705 -18.71 -18.715 -18.72 -18.725 -18.73 -18.735 -18.74 -18.745 -18.75 -18.755 -18.76 -18.765 -18.77 -18.775 -18.78 -18.785 -18.79 -18.795 -18.8 -18.805 -18.81 -18.815 -18.82 -18.825 -18.83 -18.835 -18.84 -18.845 -18.85 -18.855 -18.86 -18.865 -18.87 -18.875 -18.88 -18.885 -18.89 -18.895 -18.9 -18.905 -18.91 -18.915 -18.92 -18.925 -18.93 -18.935 -18.94 -18.945 -18.95 -18.955 -18.96 -18.965 -18.97 -18.975 -18.98 -18.985 -18.99 -18.995 -19 -19.005 -19.01 -19.015 -19.02 -19.025 -19.03 -19.035 -19.04 -19.045 -19.05 -19.055 -19.06 -19.065 -19.07 -19.075 -19.08 -19.085 -19.09 -19.095 -19.1 -19.105 -19.11 -19.115 -19.12 -19.125 -19.13 -19.135 -19.14 -19.145 -19.15 -19.155 -19.16 -19.165 -19.17 -19.175 -19.18 -19.185 -19.19 -19.195 -19.2 -19.205 -19.21 -19.215 -19.22 -19.225 -19.23 -19.235 -19.24 -19.245 -19.25 -19.255 -19.26 -19.265 -19.27 -19.275 -19.28 -19.285 -19.29 -19.295 -19.3 -19.305 -19.31 -19.315 -19.32 -19.325 -19.33 -19.335 -19.34 -19.345 -19.35 -19.355 -19.36 -19.365 -19.37 -19.375 -19.38 -19.385 -19.39 -19.395 -19.4 -19.405 -19.41 -19.415 -19.42 -19.425 -19.43 -19.435 -19.44 -19.445 -19.45 -19.455 -19.46 -19.465 -19.47 -19.475 -19.48 -19.485 -19.49 -19.495 -19.5 -19.505 -19.51 -19.515 -19.52 -19.525 -19.53 -19.535 -19.54 -19.545 -19.55 -19.555 -19.56 -19.565 -19.57 -19.575 -19.58 -19.585 -19.59 -19.595 -19.6 -19.605 -19.61 -19.615 -19.62 -19.625 -19.63 -19.635 -19.64 -19.645 -19.65 -19.655 -19.66 -19.665 -19.67 -19.675 -19.68 -19.685 -19.69 -19.695 -19.7 -19.705 -19.71 -19.715 -19.72 -19.725 -19.73 -19.735 -19.74 -19.745 -19.75 -19.755 -19.76 -19.765 -19.77 -19.775 -19.78 -19.785 -19.79 -19.795 -19.8 -19.805 -19.81 -19.815 -19.82 -19.825 -19.83 -19.835 -19.84 -19.845 -19.85 -19.855 -19.86 -19.865 -19.87 -19.875 -19.88 -19.885 -19.89 -19.895 -19.9 -19.905 -19.91 -19.915 -19.92 -19.925 -19.93 -19.935 -19.94 -19.945 -19.95 -19.955 -19.96 -19.965 -19.97 -19.975 -19.98 -19.985 -19.99 -19.995 -20 -20.005 -20.01 -20.015 -20.02 -20.025 -20.03 -20.035 -20.04 -20.045 -20.05 -20.055 -20.06 -20.065 -20.07 -20.075 -20.08 -20.085 -20.09 -20.095 -20.1 -20.105 -20.11 -20.115 -20.12 -20.125 -20.13 -20.135 -20.14 -20.145 -20.15 -20.155 -20.16 -20.165 -20.17 -20.175 -20.18 -20.185 -20.19 -20.195 -20.2 -20.205 -20.21 -20.215 -20.22 -20.225 -20.23 -20.235 -20.24 -20.245 -20.25 -20.255 -20.26 -20.265 -20.27 -20.275 -20.28 -20.285 -20.29 -20.295 -20.3 -20.305 -20.31 -20.315 -20.32 -20.325 -20.33 -20.335 -20.34 -20.345 -20.35 -20.355 -20.36 -20.365 -20.37 -20.375 -20.38 -20.385 -20.39 -20.395 -20.4 -20.405 -20.41 -20.415 -20.42 -20.425 -20.43 -20.435 -20.44 -20.445 -20.45 -20.455 -20.46 -20.465 -20.47 -20.475 -20.48 -20.485 -20.49 -20.495 -20.5 -20.505 -20.51 -20.515 -20.52 -20.525 -20.53 -20.535 -20.54 -20.545 -20.55 -20.555 -20.56 -20.565 -20.57 -20.575 -20.58 -20.585 -20.59 -20.595 -20.6 -20.605 -20.61 -20.615 -20.62 -20.625 -20.63 -20.635 -20.64 -20.645 -20.65 -20.655 -20.66 -20.665 -20.67 -20.675 -20.68 -20.685 -20.69 -20.695 -20.7 -20.705 -20.71 -20.715 -20.72 -20.725 -20.73 -20.735 -20.74 -20.745 -20.75 -20.755 -20.76 -20.765 -20.77 -20.775 -20.78 -20.785 -20.79 -20.795 -20.8 -20.805 -20.81 -20.815 -20.82 -20.825 -20.83 -20.835 -20.84 -20.845 -20.85 -20.855 -20.86 -20.865 -20.87 -20.875 -20.88 -20.885 -20.89 -20.895 -20.9 -20.905 -20.91 -20.915 -20.92 -20.925 -20.93 -20.935 -20.94 -20.945 -20.95 -20.955 -20.96 -20.965 -20.97 -20.975 -20.98 -20.985 -20.99 -20.995 -21 -21.005 -21.01 -21.015 -21.02 -21.025 -21.03 -21.035 -21.04 -21.045 -21.05 -21.055 -21.06 -21.065 -21.07 -21.075 -21.08 -21.085 -21.09 -21.095 -21.1 -21.105 -21.11 -21.115 -21.12 -21.125 -21.13 -21.135 -21.14 -21.145 -21.15 -21.155 -21.16 -21.165 -21.17 -21.175 -21.18 -21.185 -21.19 -21.195 -21.2 -21.205 -21.21 -21.215 -21.22 -21.225 -21.23 -21.235 -21.24 -21.245 -21.25 -21.255 -21.26 -21.265 -21.27 -21.275 -21.28 -21.285 -21.29 -21.295 -21.3 -21.305 -21.31 -21.315 -21.32 -21.325 -21.33 -21.335 -21.34 -21.345 -21.35 -21.355 -21.36 -21.365 -21.37 -21.375 -21.38 -21.385 -21.39 -21.395 -21.4 -21.405 -21.41 -21.415 -21.42 -21.425 -21.43 -21.435 -21.44 -21.445 -21.45 -21.455 -21.46 -21.465 -21.47 -21.475 -21.48 -21.485 -21.49 -21.495 -21.5 -21.505 -21.51 -21.515 -21.52 -21.525 -21.53 -21.535 -21.54 -21.545 -21.55 -21.555 -21.56 -21.565 -21.57 -21.575 -21.58 -21.585 -21.59 -21.595 -21.6 -21.605 -21.61 -21.615 -21.62 -21.625 -21.63 -21.635 -21.64 -21.645 -21.65 -21.655 -21.66 -21.665 -21.67 -21.675 -21.68 -21.685 -21.69 -21.695 -21.7 -21.705 -21.71 -21.715 -21.72 -21.725 -21.73 -21.735 -21.74 -21.745 -21.75 -21.755 -21.76 -21.765 -21.77 -21.775 -21.78 -21.785 -21.79 -21.795 -21.8 -21.805 -21.81 -21.815 -21.82 -21.825 -21.83 -21.835 -21.84 -21.845 -21.85 -21.855 -21.86 -21.865 -21.87 -21.875 -21.88 -21.885 -21.89 -21.895 -21.9 -21.905 -21.91 -21.915 -21.92 -21.925 -21.93 -21.935 -21.94 -21.945 -21.95 -21.955 -21.96 -21.965 -21.97 -21.975 -21.98 -21.985 -21.99 -21.995 -22 -22.005 -22.01 -22.015 -22.02 -22.025 -22.03 -22.035 -22.04 -22.045 -22.05 -22.055 -22.06 -22.065 -22.07 -22.075 -22.08 -22.085 -22.09 -22.095 -22.1 -22.105 -22.11 -22.115 -22.12 -22.125 -22.13 -22.135 -22.14 -22.145 -22.15 -22.155 -22.16 -22.165 -22.17 -22.175 -22.18 -22.185 -22.19 -22.195 -22.2 -22.205 -22.21 -22.215 -22.22 -22.225 -22.23 -22.235 -22.24 -22.245 -22.25 -22.255 -22.26 -22.265 -22.27 -22.275 -22.28 -22.285 -22.29 -22.295 -22.3 -22.305 -22.31 -22.315 -22.32 -22.325 -22.33 -22.335 -22.34 -22.345 -22.35 -22.355 -22.36 -22.365 -22.37 -22.375 -22.38 -22.385 -22.39 -22.395 -22.4 -22.405 -22.41 -22.415 -22.42 -22.425 -22.43 -22.435 -22.44 -22.445 -22.45 -22.455 -22.46 -22.465 -22.47 -22.475 -22.48 -22.485 -22.49 -22.495 -22.5 -22.505 -22.51 -22.515 -22.52 -22.525 -22.53 -22.535 -22.54 -22.545 -22.55 -22.555 -22.56 -22.565 -22.57 -22.575 -22.58 -22.585 -22.59 -22.595 -22.6 -22.605 -22.61 -22.615 -22.62 -22.625 -22.63 -22.635 -22.64 -22.645 -22.65 -22.655 -22.66 -22.665 -22.67 -22.675 -22.68 -22.685 -22.69 -22.695 -22.7 -22.705 -22.71 -22.715 -22.72 -22.725 -22.73 -22.735 -22.74 -22.745 -22.75 -22.755 -22.76 -22.765 -22.77 -22.775 -22.78 -22.785 -22.79 -22.795 -22.8 -22.805 -22.81 -22.815 -22.82 -22.825 -22.83 -22.835 -22.84 -22.845 -22.85 -22.855 -22.86 -22.865 -22.87 -22.875 -22.88 -22.885 -22.89 -22.895 -22.9 -22.905 -22.91 -22.915 -22.92 -22.925 -22.93 -22.935 -22.94 -22.945 -22.95 -22.955 -22.96 -22.965 -22.97 -22.975 -22.98 -22.985 -22.99 -22.995 -23 -23.005 -23.01 -23.015 -23.02 -23.025 -23.03 -23.035 -23.04 -23.045 -23.05 -23.055 -23.06 -23.065 -23.07 -23.075 -23.08 -23.085 -23.09 -23.095 -23.1 -23.105 -23.11 -23.115 -23.12 -23.125 -23.13 -23.135 -23.14 -23.145 -23.15 -23.155 -23.16 -23.165 -23.17 -23.175 -23.18 -23.185 -23.19 -23.195 -23.2 -23.205 -23.21 -23.215 -23.22 -23.225 -23.23 -23.235 -23.24 -23.245 -23.25 -23.255 -23.26 -23.265 -23.27 -23.275 -23.28 -23.285 -23.29 -23.295 -23.3 -23.305 -23.31 -23.315 -23.32 -23.325 -23.33 -23.335 -23.34 -23.345 -23.35 -23.355 -23.36 -23.365 -23.37 -23.375 -23.38 -23.385 -23.39 -23.395 -23.4 -23.405 -23.41 -23.415 -23.42 -23.425 -23.43 -23.435 -23.44 -23.445 -23.45 -23.455 -23.46 -23.465 -23.47 -23.475 -23.48 -23.485 -23.49 -23.495 -23.5 -23.505 -23.51 -23.515 -23.52 -23.525 -23.53 -23.535 -23.54 -23.545 -23.55 -23.555 -23.56 -23.565 -23.57 -23.575 -23.58 -23.585 -23.59 -23.595 -23.6 -23.605 -23.61 -23.615 -23.62 -23.625 -23.63 -23.635 -23.64 -23.645 -23.65 -23.655 -23.66 -23.665 -23.67 -23.675 -23.68 -23.685 -23.69 -23.695 -23.7 -23.705 -23.71 -23.715 -23.72 -23.725 -23.73 -23.735 -23.74 -23.745 -23.75 -23.755 -23.76 -23.765 -23.77 -23.775 -23.78 -23.785 -23.79 -23.795 -23.8 -23.805 -23.81 -23.815 -23.82 -23.825 -23.83 -23.835 -23.84 -23.845 -23.85 -23.855 -23.86 -23.865 -23.87 -23.875 -23.88 -23.885 -23.89 -23.895 -23.9 -23.905 -23.91 -23.915 -23.92 -23.925 -23.93 -23.935 -23.94 -23.945 -23.95 -23.955 -23.96 -23.965 -23.97 -23.975 -23.98 -23.985 -23.99 -23.995 -24 -24.005 -24.01 -24.015 -24.02 -24.025 -24.03 -24.035 -24.04 -24.045 -24.05 -24.055 -24.06 -24.065 -24.07 -24.075 -24.08 -24.085 -24.09 -24.095 -24.1 -24.105 -24.11 -24.115 -24.12 -24.125 -24.13 -24.135 -24.14 -24.145 -24.15 -24.155 -24.16 -24.165 -24.17 -24.175 -24.18 -24.185 -24.19 -24.195 -24.2 -24.205 -24.21 -24.215 -24.22 -24.225 -24.23 -24.235 -24.24 -24.245 -24.25 -24.255 -24.26 -24.265 -24.27 -24.275 -24.28 -24.285 -24.29 -24.295 -24.3 -24.305 -24.31 -24.315 -24.32 -24.325 -24.33 -24.335 -24.34 -24.345 -24.35 -24.355 -24.36 -24.365 -24.37 -24.375 -24.38 -24.385 -24.39 -24.395 -24.4 -24.405 -24.41 -24.415 -24.42 -24.425 -24.43 -24.435 -24.44 -24.445 -24.45 -24.455 -24.46 -24.465 -24.47 -24.475 -24.48 -24.485 -24.49 -24.495 -24.5 -24.505 -24.51 -24.515 -24.52 -24.525 -24.53 -24.535 -24.54 -24.545 -24.55 -24.555 -24.56 -24.565 -24.57 -24.575 -24.58 -24.585 -24.59 -24.595 -24.6 -24.605 -24.61 -24.615 -24.62 -24.625 -24.63 -24.635 -24.64 -24.645 -24.65 -24.655 -24.66 -24.665 -24.67 -24.675 -24.68 -24.685 -24.69 -24.695 -24.7 -24.705 -24.71 -24.715 -24.72 -24.725 -24.73 -24.735 -24.74 -24.745 -24.75 -24.755 -24.76 -24.765 -24.77 -24.775 -24.78 -24.785 -24.79 -24.795 -24.8 -24.805 -24.81 -24.815 -24.82 -24.825 -24.83 -24.835 -24.84 -24.845 -24.85 -24.855 -24.86 -24.865 -24.87 -24.875 -24.88 -24.885 -24.89 -24.895 -24.9 -24.905 -24.91 -24.915 -24.92 -24.925 -24.93 -24.935 -24.94 -24.945 -24.95 -24.955 -24.96 -24.965 -24.97 -24.975 -24.98 -24.985 -24.99 -24.995 -25 -25.005 -25.01 -25.015 -25.02 -25.025 -25.03 -25.035 -25.04 -25.045 -25.05 -25.055 -25.06 -25.065 -25.07 -25.075 -25.08 -25.085 -25.09 -25.095 -25.1 -25.105 -25.11 -25.115 -25.12 -25.125 -25.13 -25.135 -25.14 -25.145 -25.15 -25.155 -25.16 -25.165 -25.17 -25.175 -25.18 -25.185 -25.19 -25.195 -25.2 -25.205 -25.21 -25.215 -25.22 -25.225 -25.23 -25.235 -25.24 -25.245 -25.25 -25.255 -25.26 -25.265 -25.27 -25.275 -25.28 -25.285 -25.29 -25.295 -25.3 -25.305 -25.31 -25.315 -25.32 -25.325 -25.33 -25.335 -25.34 -25.345 -25.35 -25.355 -25.36 -25.365 -25.37 -25.375 -25.38 -25.385 -25.39 -25.395 -25.4 -25.405 -25.41 -25.415 -25.42 -25.425 -25.43 -25.435 -25.44 -25.445 -25.45 -25.455 -25.46 -25.465 -25.47 -25.475 -25.48 -25.485 -25.49 -25.495 -25.5 -25.505 -25.51 -25.515 -25.52 -25.525 -25.53 -25.535 -25.54 -25.545 -25.55 -25.555 -25.56 -25.565 -25.57 -25.575 -25.58 -25.585 -25.59 -25.595 -25.6 -25.605 -25.61 -25.615 -25.62 -25.625 -25.63 -25.635 -25.64 -25.645 -25.65 -25.655 -25.66 -25.665 -25.67 -25.675 -25.68 -25.685 -25.69 -25.695 -25.7 -25.705 -25.71 -25.715 -25.72 -25.725 -25.73 -25.735 -25.74 -25.745 -25.75 -25.755 -25.76 -25.765 -25.77 -25.775 -25.78 -25.785 -25.79 -25.795 -25.8 -25.805 -25.81 -25.815 -25.82 -25.825 -25.83 -25.835 -25.84 -25.845 -25.85 -25.855 -25.86 -25.865 -25.87 -25.875 -25.88 -25.885 -25.89 -25.895 -25.9 -25.905 -25.91 -25.915 -25.92 -25.925 -25.93 -25.935 -25.94 -25.945 -25.95 -25.955 -25.96 -25.965 -25.97 -25.975 -25.98 -25.985 -25.99 -25.995 -26 -26.005 -26.01 -26.015 -26.02 -26.025 -26.03 -26.035 -26.04 -26.045 -26.05 -26.055 -26.06 -26.065 -26.07 -26.075 -26.08 -26.085 -26.09 -26.095 -26.1 -26.105 -26.11 -26.115 -26.12 -26.125 -26.13 -26.135 -26.14 -26.145 -26.15 -26.155 -26.16 -26.165 -26.17 -26.175 -26.18 -26.185 -26.19 -26.195 -26.2 -26.205 -26.21 -26.215 -26.22 -26.225 -26.23 -26.235 -26.24 -26.245 -26.25 -26.255 -26.26 -26.265 -26.27 -26.275 -26.28 -26.285 -26.29 -26.295 -26.3 -26.305 -26.31 -26.315 -26.32 -26.325 -26.33 -26.335 -26.34 -26.345 -26.35 -26.355 -26.36 -26.365 -26.37 -26.375 -26.38 -26.385 -26.39 -26.395 -26.4 -26.405 -26.41 -26.415 -26.42 -26.425 -26.43 -26.435 -26.44 -26.445 -26.45 -26.455 -26.46 -26.465 -26.47 -26.475 -26.48 -26.485 -26.49 -26.495 -26.5 -26.505 -26.51 -26.515 -26.52 -26.525 -26.53 -26.535 -26.54 -26.545 -26.55 -26.555 -26.56 -26.565 -26.57 -26.575 -26.58 -26.585 -26.59 -26.595 -26.6 -26.605 -26.61 -26.615 -26.62 -26.625 -26.63 -26.635 -26.64 -26.645 -26.65 -26.655 -26.66 -26.665 -26.67 -26.675 -26.68 -26.685 -26.69 -26.695 -26.7 -26.705 -26.71 -26.715 -26.72 -26.725 -26.73 -26.735 -26.74 -26.745 -26.75 -26.755 -26.76 -26.765 -26.77 -26.775 -26.78 -26.785 -26.79 -26.795 -26.8 -26.805 -26.81 -26.815 -26.82 -26.825 -26.83 -26.835 -26.84 -26.845 -26.85 -26.855 -26.86 -26.865 -26.87 -26.875 -26.88 -26.885 -26.89 -26.895 -26.9 -26.905 -26.91 -26.915 -26.92 -26.925 -26.93 -26.935 -26.94 -26.945 -26.95 -26.955 -26.96 -26.965 -26.97 -26.975 -26.98 -26.985 -26.99 -26.995 -27 -27.005 -27.01 -27.015 -27.02 -27.025 -27.03 -27.035 -27.04 -27.045 -27.05 -27.055 -27.06 -27.065 -27.07 -27.075 -27.08 -27.085 -27.09 -27.095 -27.1 -27.105 -27.11 -27.115 -27.12 -27.125 -27.13 -27.135 -27.14 -27.145 -27.15 -27.155 -27.16 -27.165 -27.17 -27.175 -27.18 -27.185 -27.19 -27.195 -27.2 -27.205 -27.21 -27.215 -27.22 -27.225 -27.23 -27.235 -27.24 -27.245 -27.25 -27.255 -27.26 -27.265 -27.27 -27.275 -27.28 -27.285 -27.29 -27.295 -27.3 -27.305 -27.31 -27.315 -27.32 -27.325 -27.33 -27.335 -27.34 -27.345 -27.35 -27.355 -27.36 -27.365 -27.37 -27.375 -27.38 -27.385 -27.39 -27.395 -27.4 -27.405 -27.41 -27.415 -27.42 -27.425 -27.43 -27.435 -27.44 -27.445 -27.45 -27.455 -27.46 -27.465 -27.47 -27.475 -27.48 -27.485 -27.49 -27.495 -27.5 -27.505 -27.51 -27.515 -27.52 -27.525 -27.53 -27.535 -27.54 -27.545 -27.55 -27.555 -27.56 -27.565 -27.57 -27.575 -27.58 -27.585 -27.59 -27.595 -27.6 -27.605 -27.61 -27.615 -27.62 -27.625 -27.63 -27.635 -27.64 -27.645 -27.65 -27.655 -27.66 -27.665 -27.67 -27.675 -27.68 -27.685 -27.69 -27.695 -27.7 -27.705 -27.71 -27.715 -27.72 -27.725 -27.73 -27.735 -27.74 -27.745 -27.75 -27.755 -27.76 -27.765 -27.77 -27.775 -27.78 -27.785 -27.79 -27.795 -27.8 -27.805 -27.81 -27.815 -27.82 -27.825 -27.83 -27.835 -27.84 -27.845 -27.85 -27.855 -27.86 -27.865 -27.87 -27.875 -27.88 -27.885 -27.89 -27.895 -27.9 -27.905 -27.91 -27.915 -27.92 -27.925 -27.93 -27.935 -27.94 -27.945 -27.95 -27.955 -27.96 -27.965 -27.97 -27.975 -27.98 -27.985 -27.99 -27.995 -28 -28.005 -28.01 -28.015 -28.02 -28.025 -28.03 -28.035 -28.04 -28.045 -28.05 -28.055 -28.06 -28.065 -28.07 -28.075 -28.08 -28.085 -28.09 -28.095 -28.1 -28.105 -28.11 -28.115 -28.12 -28.125 -28.13 -28.135 -28.14 -28.145 -28.15 -28.155 -28.16 -28.165 -28.17 -28.175 -28.18 -28.185 -28.19 -28.195 -28.2 -28.205 -28.21 -28.215 -28.22 -28.225 -28.23 -28.235 -28.24 -28.245 -28.25 -28.255 -28.26 -28.265 -28.27 -28.275 -28.28 -28.285 -28.29 -28.295 -28.3 -28.305 -28.31 -28.315 -28.32 -28.325 -28.33 -28.335 -28.34 -28.345 -28.35 -28.355 -28.36 -28.365 -28.37 -28.375 -28.38 -28.385 -28.39 -28.395 -28.4 -28.405 -28.41 -28.415 -28.42 -28.425 -28.43 -28.435 -28.44 -28.445 -28.45 -28.455 -28.46 -28.465 -28.47 -28.475 -28.48 -28.485 -28.49 -28.495 -28.5 -28.505 -28.51 -28.515 -28.52 -28.525 -28.53 -28.535 -28.54 -28.545 -28.55 -28.555 -28.56 -28.565 -28.57 -28.575 -28.58 -28.585 -28.59 -28.595 -28.6 -28.605 -28.61 -28.615 -28.62 -28.625 -28.63 -28.635 -28.64 -28.645 -28.65 -28.655 -28.66 -28.665 -28.67 -28.675 -28.68 -28.685 -28.69 -28.695 -28.7 -28.705 -28.71 -28.715 -28.72 -28.725 -28.73 -28.735 -28.74 -28.745 -28.75 -28.755 -28.76 -28.765 -28.77 -28.775 -28.78 -28.785 -28.79 -28.795 -28.8 -28.805 -28.81 -28.815 -28.82 -28.825 -28.83 -28.835 -28.84 -28.845 -28.85 -28.855 -28.86 -28.865 -28.87 -28.875 -28.88 -28.885 -28.89 -28.895 -28.9 -28.905 -28.91 -28.915 -28.92 -28.925 -28.93 -28.935 -28.94 -28.945 -28.95 -28.955 -28.96 -28.965 -28.97 -28.975 -28.98 -28.985 -28.99 -28.995 -29 -29.005 -29.01 -29.015 -29.02 -29.025 -29.03 -29.035 -29.04 -29.045 -29.05 -29.055 -29.06 -29.065 -29.07 -29.075 -29.08 -29.085 -29.09 -29.095 -29.1 -29.105 -29.11 -29.115 -29.12 -29.125 -29.13 -29.135 -29.14 -29.145 -29.15 -29.155 -29.16 -29.165 -29.17 -29.175 -29.18 -29.185 -29.19 -29.195 -29.2 -29.205 -29.21 -29.215 -29.22 -29.225 -29.23 -29.235 -29.24 -29.245 -29.25 -29.255 -29.26 -29.265 -29.27 -29.275 -29.28 -29.285 -29.29 -29.295 -29.3 -29.305 -29.31 -29.315 -29.32 -29.325 -29.33 -29.335 -29.34 -29.345 -29.35 -29.355 -29.36 -29.365 -29.37 -29.375 -29.38 -29.385 -29.39 -29.395 -29.4 -29.405 -29.41 -29.415 -29.42 -29.425 -29.43 -29.435 -29.44 -29.445 -29.45 -29.455 -29.46 -29.465 -29.47 -29.475 -29.48 -29.485 -29.49 -29.495 -29.5 -29.505 -29.51 -29.515 -29.52 -29.525 -29.53 -29.535 -29.54 -29.545 -29.55 -29.555 -29.56 -29.565 -29.57 -29.575 -29.58 -29.585 -29.59 -29.595 -29.6 -29.605 -29.61 -29.615 -29.62 -29.625 -29.63 -29.635 -29.64 -29.645 -29.65 -29.655 -29.66 -29.665 -29.67 -29.675 -29.68 -29.685 -29.69 -29.695 -29.7 -29.705 -29.71 -29.715 -29.72 -29.725 -29.73 -29.735 -29.74 -29.745 -29.75 -29.755 -29.76 -29.765 -29.77 -29.775 -29.78 -29.785 -29.79 -29.795 -29.8 -29.805 -29.81 -29.815 -29.82 -29.825 -29.83 -29.835 -29.84 -29.845 -29.85 -29.855 -29.86 -29.865 -29.87 -29.875 -29.88 -29.885 -29.89 -29.895 -29.9 -29.905 -29.91 -29.915 -29.92 -29.925 -29.93 -29.935 -29.94 -29.945 -29.95 -29.955 -29.96 -29.965 -29.97 -29.975 -29.98 -29.985 -29.99 -29.995 -30 -30.005 -30.01 -30.015 -30.02 -30.025 -30.03 -30.035 -30.04 -30.045 -30.05 -30.055 -30.06 -30.065 -30.07 -30.075 -30.08 -30.085 -30.09 -30.095 -30.1 -30.105 -30.11 -30.115 -30.12 -30.125 -30.13 -30.135 -30.14 -30.145 -30.15 -30.155 -30.16 -30.165 -30.17 -30.175 -30.18 -30.185 -30.19 -30.195 -30.2 -30.205 -30.21 -30.215 -30.22 -30.225 -30.23 -30.235 -30.24 -30.245 -30.25 -30.255 -30.26 -30.265 -30.27 -30.275 -30.28 -30.285 -30.29 -30.295 -30.3 -30.305 -30.31 -30.315 -30.32 -30.325 -30.33 -30.335 -30.34 -30.345 -30.35 -30.355 -30.36 -30.365 -30.37 -30.375 -30.38 -30.385 -30.39 -30.395 -30.4 -30.405 -30.41 -30.415 -30.42 -30.425 -30.43 -30.435 -30.44 -30.445 -30.45 -30.455 -30.46 -30.465 -30.47 -30.475 -30.48 -30.485 -30.49 -30.495 -30.5 -30.505 -30.51 -30.515 -30.52 -30.525 -30.53 -30.535 -30.54 -30.545 -30.55 -30.555 -30.56 -30.565 -30.57 -30.575 -30.58 -30.585 -30.59 -30.595 -30.6 -30.605 -30.61 -30.615 -30.62 -30.625 -30.63 -30.635 -30.64 -30.645 -30.65 -30.655 -30.66 -30.665 -30.67 -30.675 -30.68 -30.685 -30.69 -30.695 -30.7 -30.705 -30.71 -30.715 -30.72 -30.725 -30.73 -30.735 -30.74 -30.745 -30.75 -30.755 -30.76 -30.765 -30.77 -30.775 -30.78 -30.785 -30.79 -30.795 -30.8 -30.805 -30.81 -30.815 -30.82 -30.825 -30.83 -30.835 -30.84 -30.845 -30.85 -30.855 -30.86 -30.865 -30.87 -30.875 -30.88 -30.885 -30.89 -30.895 -30.9 -30.905 -30.91 -30.915 -30.92 -30.925 -30.93 -30.935 -30.94 -30.945 -30.95 -30.955 -30.96 -30.965 -30.97 -30.975 -30.98 -30.985 -30.99 -30.995 -31 -31.005 -31.01 -31.015 -31.02 -31.025 -31.03 -31.035 -31.04 -31.045 -31.05 -31.055 -31.06 -31.065 -31.07 -31.075 -31.08 -31.085 -31.09 -31.095 -31.1 -31.105 -31.11 -31.115 -31.12 -31.125 -31.13 -31.135 -31.14 -31.145 -31.15 -31.155 -31.16 -31.165 -31.17 -31.175 -31.18 -31.185 -31.19 -31.195 -31.2 -31.205 -31.21 -31.215 -31.22 -31.225 -31.23 -31.235 -31.24 -31.245 -31.25 -31.255 -31.26 -31.265 -31.27 -31.275 -31.28 -31.285 -31.29 -31.295 -31.3 -31.305 -31.31 -31.315 -31.32 -31.325 -31.33 -31.335 -31.34 -31.345 -31.35 -31.355 -31.36 -31.365 -31.37 -31.375 -31.38 -31.385 -31.39 -31.395 -31.4 -31.405 -31.41 -31.415 -31.42 -31.425 -31.43 -31.435 -31.44 -31.445 -31.45 -31.455 -31.46 -31.465 -31.47 -31.475 -31.48 -31.485 -31.49 -31.495 -31.5 -31.505 -31.51 -31.515 -31.52 -31.525 -31.53 -31.535 -31.54 -31.545 -31.55 -31.555 -31.56 -31.565 -31.57 -31.575 -31.58 -31.585 -31.59 -31.595 -31.6 -31.605 -31.61 -31.615 -31.62 -31.625 -31.63 -31.635 -31.64 -31.645 -31.65 -31.655 -31.66 -31.665 -31.67 -31.675 -31.68 -31.685 -31.69 -31.695 -31.7 -31.705 -31.71 -31.715 -31.72 -31.725 -31.73 -31.735 -31.74 -31.745 -31.75 -31.755 -31.76 -31.765 -31.77 -31.775 -31.78 -31.785 -31.79 -31.795 -31.8 -31.805 -31.81 -31.815 -31.82 -31.825 -31.83 -31.835 -31.84 -31.845 -31.85 -31.855 -31.86 -31.865 -31.87 -31.875 -31.88 -31.885 -31.89 -31.895 -31.9 -31.905 -31.91 -31.915 -31.92 -31.925 -31.93 -31.935 -31.94 -31.945 -31.95 -31.955 -31.96 -31.965 -31.97 -31.975 -31.98 -31.985 -31.99 -31.995 -32 -32.005 -32.01 -32.015 -32.02 -32.025 -32.03 -32.035 -32.04 -32.045 -32.05 -32.055 -32.06 -32.065 -32.07 -32.075 -32.08 -32.085 -32.09 -32.095 -32.1 -32.105 -32.11 -32.115 -32.12 -32.125 -32.13 -32.135 -32.14 -32.145 -32.15 -32.155 -32.16 -32.165 -32.17 -32.175 -32.18 -32.185 -32.19 -32.195 -32.2 -32.205 -32.21 -32.215 -32.22 -32.225 -32.23 -32.235 -32.24 -32.245 -32.25 -32.255 -32.26 -32.265 -32.27 -32.275 -32.28 -32.285 -32.29 -32.295 -32.3 -32.305 -32.31 -32.315 -32.32 -32.325 -32.33 -32.335 -32.34 -32.345 -32.35 -32.355 -32.36 -32.365 -32.37 -32.375 -32.38 -32.385 -32.39 -32.395 -32.4 -32.405 -32.41 -32.415 -32.42 -32.425 -32.43 -32.435 -32.44 -32.445 -32.45 -32.455 -32.46 -32.465 -32.47 -32.475 -32.48 -32.485 -32.49 -32.495 -32.5 -32.505 -32.51 -32.515 -32.52 -32.525 -32.53 -32.535 -32.54 -32.545 -32.55 -32.555 -32.56 -32.565 -32.57 -32.575 -32.58 -32.585 -32.59 -32.595 -32.6 -32.605 -32.61 -32.615 -32.62 -32.625 -32.63 -32.635 -32.64 -32.645 -32.65 -32.655 -32.66 -32.665 -32.67 -32.675 -32.68 -32.685 -32.69 -32.695 -32.7 -32.705 -32.71 -32.715 -32.72 -32.725 -32.73 -32.735 -32.74 -32.745 -32.75 -32.755 -32.76 -32.765 -32.77 -32.775 -32.78 -32.785 -32.79 -32.795 -32.8 -32.805 -32.81 -32.815 -32.82 -32.825 -32.83 -32.835 -32.84 -32.845 -32.85 -32.855 -32.86 -32.865 -32.87 -32.875 -32.88 -32.885 -32.89 -32.895 -32.9 -32.905 -32.91 -32.915 -32.92 -32.925 -32.93 -32.935 -32.94 -32.945 -32.95 -32.955 -32.96 -32.965 -32.97 -32.975 -32.98 -32.985 -32.99 -32.995 -33 -33.005 -33.01 -33.015 -33.02 -33.025 -33.03 -33.035 -33.04 -33.045 -33.05 -33.055 -33.06 -33.065 -33.07 -33.075 -33.08 -33.085 -33.09 -33.095 -33.1 -33.105 -33.11 -33.115 -33.12 -33.125 -33.13 -33.135 -33.14 -33.145 -33.15 -33.155 -33.16 -33.165 -33.17 -33.175 -33.18 -33.185 -33.19 -33.195 -33.2 -33.205 -33.21 -33.215 -33.22 -33.225 -33.23 -33.235 -33.24 -33.245 -33.25 -33.255 -33.26 -33.265 -33.27 -33.275 -33.28 -33.285 -33.29 -33.295 -33.3 -33.305 -33.31 -33.315 -33.32 -33.325 -33.33 -33.335 -33.34 -33.345 -33.35 -33.355 -33.36 -33.365 -33.37 -33.375 -33.38 -33.385 -33.39 -33.395 -33.4 -33.405 -33.41 -33.415 -33.42 -33.425 -33.43 -33.435 -33.44 -33.445 -33.45 -33.455 -33.46 -33.465 -33.47 -33.475 -33.48 -33.485 -33.49 -33.495 -33.5 -33.505 -33.51 -33.515 -33.52 -33.525 -33.53 -33.535 -33.54 -33.545 -33.55 -33.555 -33.56 -33.565 -33.57 -33.575 -33.58 -33.585 -33.59 -33.595 -33.6 -33.605 -33.61 -33.615 -33.62 -33.625 -33.63 -33.635 -33.64 -33.645 -33.65 -33.655 -33.66 -33.665 -33.67 -33.675 -33.68 -33.685 -33.69 -33.695 -33.7 -33.705 -33.71 -33.715 -33.72 -33.725 -33.73 -33.735 -33.74 -33.745 -33.75 -33.755 -33.76 -33.765 -33.77 -33.775 -33.78 -33.785 -33.79 -33.795 -33.8 -33.805 -33.81 -33.815 -33.82 -33.825 -33.83 -33.835 -33.84 -33.845 -33.85 -33.855 -33.86 -33.865 -33.87 -33.875 -33.88 -33.885 -33.89 -33.895 -33.9 -33.905 -33.91 -33.915 -33.92 -33.925 -33.93 -33.935 -33.94 -33.945 -33.95 -33.955 -33.96 -33.965 -33.97 -33.975 -33.98 -33.985 -33.99 -33.995 -34 -34.005 -34.01 -34.015 -34.02 -34.025 -34.03 -34.035 -34.04 -34.045 -34.05 -34.055 -34.06 -34.065 -34.07 -34.075 -34.08 -34.085 -34.09 -34.095 -34.1 -34.105 -34.11 -34.115 -34.12 -34.125 -34.13 -34.135 -34.14 -34.145 -34.15 -34.155 -34.16 -34.165 -34.17 -34.175 -34.18 -34.185 -34.19 -34.195 -34.2 -34.205 -34.21 -34.215 -34.22 -34.225 -34.23 -34.235 -34.24 -34.245 -34.25 -34.255 -34.26 -34.265 -34.27 -34.275 -34.28 -34.285 -34.29 -34.295 -34.3 -34.305 -34.31 -34.315 -34.32 -34.325 -34.33 -34.335 -34.34 -34.345 -34.35 -34.355 -34.36 -34.365 -34.37 -34.375 -34.38 -34.385 -34.39 -34.395 -34.4 -34.405 -34.41 -34.415 -34.42 -34.425 -34.43 -34.435 -34.44 -34.445 -34.45 -34.455 -34.46 -34.465 -34.47 -34.475 -34.48 -34.485 -34.49 -34.495 -34.5 -34.505 -34.51 -34.515 -34.52 -34.525 -34.53 -34.535 -34.54 -34.545 -34.55 -34.555 -34.56 -34.565 -34.57 -34.575 -34.58 -34.585 -34.59 -34.595 -34.6 -34.605 -34.61 -34.615 -34.62 -34.625 -34.63 -34.635 -34.64 -34.645 -34.65 -34.655 -34.66 -34.665 -34.67 -34.675 -34.68 -34.685 -34.69 -34.695 -34.7 -34.705 -34.71 -34.715 -34.72 -34.725 -34.73 -34.735 -34.74 -34.745 -34.75 -34.755 -34.76 -34.765 -34.77 -34.775 -34.78 -34.785 -34.79 -34.795 -34.8 -34.805 -34.81 -34.815 -34.82 -34.825 -34.83 -34.835 -34.84 -34.845 -34.85 -34.855 -34.86 -34.865 -34.87 -34.875 -34.88 -34.885 -34.89 -34.895 -34.9 -34.905 -34.91 -34.915 -34.92 -34.925 -34.93 -34.935 -34.94 -34.945 -34.95 -34.955 -34.96 -34.965 -34.97 -34.975 -34.98 -34.985 -34.99 -34.995 -35 -35.005 -35.01 -35.015 -35.02 -35.025 -35.03 -35.035 -35.04 -35.045 -35.05 -35.055 -35.06 -35.065 -35.07 -35.075 -35.08 -35.085 -35.09 -35.095 -35.1 -35.105 -35.11 -35.115 -35.12 -35.125 -35.13 -35.135 -35.14 -35.145 -35.15 -35.155 -35.16 -35.165 -35.17 -35.175 -35.18 -35.185 -35.19 -35.195 -35.2 -35.205 -35.21 -35.215 -35.22 -35.225 -35.23 -35.235 -35.24 -35.245 -35.25 -35.255 -35.26 -35.265 -35.27 -35.275 -35.28 -35.285 -35.29 -35.295 -35.3 -35.305 -35.31 -35.315 -35.32 -35.325 -35.33 -35.335 -35.34 -35.345 -35.35 -35.355 -35.36 -35.365 -35.37 -35.375 -35.38 -35.385 -35.39 -35.395 -35.4 -35.405 -35.41 -35.415 -35.42 -35.425 -35.43 -35.435 -35.44 -35.445 -35.45 -35.455 -35.46 -35.465 -35.47 -35.475 -35.48 -35.485 -35.49 -35.495 -35.5 -35.505 -35.51 -35.515 -35.52 -35.525 -35.53 -35.535 -35.54 -35.545 -35.55 -35.555 -35.56 -35.565 -35.57 -35.575 -35.58 -35.585 -35.59 -35.595 -35.6 -35.605 -35.61 -35.615 -35.62 -35.625 -35.63 -35.635 -35.64 -35.645 -35.65 -35.655 -35.66 -35.665 -35.67 -35.675 -35.68 -35.685 -35.69 -35.695 -35.7 -35.705 -35.71 -35.715 -35.72 -35.725 -35.73 -35.735 -35.74 -35.745 -35.75 -35.755 -35.76 -35.765 -35.77 -35.775 -35.78 -35.785 -35.79 -35.795 -35.8 -35.805 -35.81 -35.815 -35.82 -35.825 -35.83 -35.835 -35.84 -35.845 -35.85 -35.855 -35.86 -35.865 -35.87 -35.875 -35.88 -35.885 -35.89 -35.895 -35.9 -35.905 -35.91 -35.915 -35.92 -35.925 -35.93 -35.935 -35.94 -35.945 -35.95 -35.955 -35.96 -35.965 -35.97 -35.975 -35.98 -35.985 -35.99 -35.995 -36 -36.005 -36.01 -36.015 -36.02 -36.025 -36.03 -36.035 -36.04 -36.045 -36.05 -36.055 -36.06 -36.065 -36.07 -36.075 -36.08 -36.085 -36.09 -36.095 -36.1 -36.105 -36.11 -36.115 -36.12 -36.125 -36.13 -36.135 -36.14 -36.145 -36.15 -36.155 -36.16 -36.165 -36.17 -36.175 -36.18 -36.185 -36.19 -36.195 -36.2 -36.205 -36.21 -36.215 -36.22 -36.225 -36.23 -36.235 -36.24 -36.245 -36.25 -36.255 -36.26 -36.265 -36.27 -36.275 -36.28 -36.285 -36.29 -36.295 -36.3 -36.305 -36.31 -36.315 -36.32 -36.325 -36.33 -36.335 -36.34 -36.345 -36.35 -36.355 -36.36 -36.365 -36.37 -36.375 -36.38 -36.385 -36.39 -36.395 -36.4 -36.405 -36.41 -36.415 -36.42 -36.425 -36.43 -36.435 -36.44 -36.445 -36.45 -36.455 -36.46 -36.465 -36.47 -36.475 -36.48 -36.485 -36.49 -36.495 -36.5 -36.505 -36.51 -36.515 -36.52 -36.525 -36.53 -36.535 -36.54 -36.545 -36.55 -36.555 -36.56 -36.565 -36.57 -36.575 -36.58 -36.585 -36.59 -36.595 -36.6 -36.605 -36.61 -36.615 -36.62 -36.625 -36.63 -36.635 -36.64 -36.645 -36.65 -36.655 -36.66 -36.665 -36.67 -36.675 -36.68 -36.685 -36.69 -36.695 -36.7 -36.705 -36.71 -36.715 -36.72 -36.725 -36.73 -36.735 -36.74 -36.745 -36.75 -36.755 -36.76 -36.765 -36.77 -36.775 -36.78 -36.785 -36.79 -36.795 -36.8 -36.805 -36.81 -36.815 -36.82 -36.825 -36.83 -36.835 -36.84 -36.845 -36.85 -36.855 -36.86 -36.865 -36.87 -36.875 -36.88 -36.885 -36.89 -36.895 -36.9 -36.905 -36.91 -36.915 -36.92 -36.925 -36.93 -36.935 -36.94 -36.945 -36.95 -36.955 -36.96 -36.965 -36.97 -36.975 -36.98 -36.985 -36.99 -36.995 -37 -37.005 -37.01 -37.015 -37.02 -37.025 -37.03 -37.035 -37.04 -37.045 -37.05 -37.055 -37.06 -37.065 -37.07 -37.075 -37.08 -37.085 -37.09 -37.095 -37.1 -37.105 -37.11 -37.115 -37.12 -37.125 -37.13 -37.135 -37.14 -37.145 -37.15 -37.155 -37.16 -37.165 -37.17 -37.175 -37.18 -37.185 -37.19 -37.195 -37.2 -37.205 -37.21 -37.215 -37.22 -37.225 -37.23 -37.235 -37.24 -37.245 -37.25 -37.255 -37.26 -37.265 -37.27 -37.275 -37.28 -37.285 -37.29 -37.295 -37.3 -37.305 -37.31 -37.315 -37.32 -37.325 -37.33 -37.335 -37.34 -37.345 -37.35 -37.355 -37.36 -37.365 -37.37 -37.375 -37.38 -37.385 -37.39 -37.395 -37.4 -37.405 -37.41 -37.415 -37.42 -37.425 -37.43 -37.435 -37.44 -37.445 -37.45 -37.455 -37.46 -37.465 -37.47 -37.475 -37.48 -37.485 -37.49 -37.495 -37.5 -37.505 -37.51 -37.515 -37.52 -37.525 -37.53 -37.535 -37.54 -37.545 -37.55 -37.555 -37.56 -37.565 -37.57 -37.575 -37.58 -37.585 -37.59 -37.595 -37.6 -37.605 -37.61 -37.615 -37.62 -37.625 -37.63 -37.635 -37.64 -37.645 -37.65 -37.655 -37.66 -37.665 -37.67 -37.675 -37.68 -37.685 -37.69 -37.695 -37.7 -37.705 -37.71 -37.715 -37.72 -37.725 -37.73 -37.735 -37.74 -37.745 -37.75 -37.755 -37.76 -37.765 -37.77 -37.775 -37.78 -37.785 -37.79 -37.795 -37.8 -37.805 -37.81 -37.815 -37.82 -37.825 -37.83 -37.835 -37.84 -37.845 -37.85 -37.855 -37.86 -37.865 -37.87 -37.875 -37.88 -37.885 -37.89 -37.895 -37.9 -37.905 -37.91 -37.915 -37.92 -37.925 -37.93 -37.935 -37.94 -37.945 -37.95 -37.955 -37.96 -37.965 -37.97 -37.975 -37.98 -37.985 -37.99 -37.995 -38 -38.005 -38.01 -38.015 -38.02 -38.025 -38.03 -38.035 -38.04 -38.045 -38.05 -38.055 -38.06 -38.065 -38.07 -38.075 -38.08 -38.085 -38.09 -38.095 -38.1 -38.105 -38.11 -38.115 -38.12 -38.125 -38.13 -38.135 -38.14 -38.145 -38.15 -38.155 -38.16 -38.165 -38.17 -38.175 -38.18 -38.185 -38.19 -38.195 -38.2 -38.205 -38.21 -38.215 -38.22 -38.225 -38.23 -38.235 -38.24 -38.245 -38.25 -38.255 -38.26 -38.265 -38.27 -38.275 -38.28 -38.285 -38.29 -38.295 -38.3 -38.305 -38.31 -38.315 -38.32 -38.325 -38.33 -38.335 -38.34 -38.345 -38.35 -38.355 -38.36 -38.365 -38.37 -38.375 -38.38 -38.385 -38.39 -38.395 -38.4 -38.405 -38.41 -38.415 -38.42 -38.425 -38.43 -38.435 -38.44 -38.445 -38.45 -38.455 -38.46 -38.465 -38.47 -38.475 -38.48 -38.485 -38.49 -38.495 -38.5 -38.505 -38.51 -38.515 -38.52 -38.525 -38.53 -38.535 -38.54 -38.545 -38.55 -38.555 -38.56 -38.565 -38.57 -38.575 -38.58 -38.585 -38.59 -38.595 -38.6 -38.605 -38.61 -38.615 -38.62 -38.625 -38.63 -38.635 -38.64 -38.645 -38.65 -38.655 -38.66 -38.665 -38.67 -38.675 -38.68 -38.685 -38.69 -38.695 -38.7 -38.705 -38.71 -38.715 -38.72 -38.725 -38.73 -38.735 -38.74 -38.745 -38.75 -38.755 -38.76 -38.765 -38.77 -38.775 -38.78 -38.785 -38.79 -38.795 -38.8 -38.805 -38.81 -38.815 -38.82 -38.825 -38.83 -38.835 -38.84 -38.845 -38.85 -38.855 -38.86 -38.865 -38.87 -38.875 -38.88 -38.885 -38.89 -38.895 -38.9 -38.905 -38.91 -38.915 -38.92 -38.925 -38.93 -38.935 -38.94 -38.945 -38.95 -38.955 -38.96 -38.965 -38.97 -38.975 -38.98 -38.985 -38.99 -38.995 -39 -39.005 -39.01 -39.015 -39.02 -39.025 -39.03 -39.035 -39.04 -39.045 -39.05 -39.055 -39.06 -39.065 -39.07 -39.075 -39.08 -39.085 -39.09 -39.095 -39.1 -39.105 -39.11 -39.115 -39.12 -39.125 -39.13 -39.135 -39.14 -39.145 -39.15 -39.155 -39.16 -39.165 -39.17 -39.175 -39.18 -39.185 -39.19 -39.195 -39.2 -39.205 -39.21 -39.215 -39.22 -39.225 -39.23 -39.235 -39.24 -39.245 -39.25 -39.255 -39.26 -39.265 -39.27 -39.275 -39.28 -39.285 -39.29 -39.295 -39.3 -39.305 -39.31 -39.315 -39.32 -39.325 -39.33 -39.335 -39.34 -39.345 -39.35 -39.355 -39.36 -39.365 -39.37 -39.375 -39.38 -39.385 -39.39 -39.395 -39.4 -39.405 -39.41 -39.415 -39.42 -39.425 -39.43 -39.435 -39.44 -39.445 -39.45 -39.455 -39.46 -39.465 -39.47 -39.475 -39.48 -39.485 -39.49 -39.495 -39.5 -39.505 -39.51 -39.515 -39.52 -39.525 -39.53 -39.535 -39.54 -39.545 -39.55 -39.555 -39.56 -39.565 -39.57 -39.575 -39.58 -39.585 -39.59 -39.595 -39.6 -39.605 -39.61 -39.615 -39.62 -39.625 -39.63 -39.635 -39.64 -39.645 -39.65 -39.655 -39.66 -39.665 -39.67 -39.675 -39.68 -39.685 -39.69 -39.695 -39.7 -39.705 -39.71 -39.715 -39.72 -39.725 -39.73 -39.735 -39.74 -39.745 -39.75 -39.755 -39.76 -39.765 -39.77 -39.775 -39.78 -39.785 -39.79 -39.795 -39.8 -39.805 -39.81 -39.815 -39.82 -39.825 -39.83 -39.835 -39.84 -39.845 -39.85 -39.855 -39.86 -39.865 -39.87 -39.875 -39.88 -39.885 -39.89 -39.895 -39.9 -39.905 -39.91 -39.915 -39.92 -39.925 -39.93 -39.935 -39.94 -39.945 -39.95 -39.955 -39.96 -39.965 -39.97 -39.975 -39.98 -39.985 -39.99 -39.995 -40 -40.005 -40.01 -40.015 -40.02 -40.025 -40.03 -40.035 -40.04 -40.045 -40.05 -40.055 -40.06 -40.065 -40.07 -40.075 -40.08 -40.085 -40.09 -40.095 -40.1 -40.105 -40.11 -40.115 -40.12 -40.125 -40.13 -40.135 -40.14 -40.145 -40.15 -40.155 -40.16 -40.165 -40.17 -40.175 -40.18 -40.185 -40.19 -40.195 -40.2 -40.205 -40.21 -40.215 -40.22 -40.225 -40.23 -40.235 -40.24 -40.245 -40.25 -40.255 -40.26 -40.265 -40.27 -40.275 -40.28 -40.285 -40.29 -40.295 -40.3 -40.305 -40.31 -40.315 -40.32 -40.325 -40.33 -40.335 -40.34 -40.345 -40.35 -40.355 -40.36 -40.365 -40.37 -40.375 -40.38 -40.385 -40.39 -40.395 -40.4 -40.405 -40.41 -40.415 -40.42 -40.425 -40.43 -40.435 -40.44 -40.445 -40.45 -40.455 -40.46 -40.465 -40.47 -40.475 -40.48 -40.485 -40.49 -40.495 -40.5 -40.505 -40.51 -40.515 -40.52 -40.525 -40.53 -40.535 -40.54 -40.545 -40.55 -40.555 -40.56 -40.565 -40.57 -40.575 -40.58 -40.585 -40.59 -40.595 -40.6 -40.605 -40.61 -40.615 -40.62 -40.625 -40.63 -40.635 -40.64 -40.645 -40.65 -40.655 -40.66 -40.665 -40.67 -40.675 -40.68 -40.685 -40.69 -40.695 -40.7 -40.705 -40.71 -40.715 -40.72 -40.725 -40.73 -40.735 -40.74 -40.745 -40.75 -40.755 -40.76 -40.765 -40.77 -40.775 -40.78 -40.785 -40.79 -40.795 -40.8 -40.805 -40.81 -40.815 -40.82 -40.825 -40.83 -40.835 -40.84 -40.845 -40.85 -40.855 -40.86 -40.865 -40.87 -40.875 -40.88 -40.885 -40.89 -40.895 -40.9 -40.905 -40.91 -40.915 -40.92 -40.925 -40.93 -40.935 -40.94 -40.945 -40.95 -40.955 -40.96 -40.965 -40.97 -40.975 -40.98 -40.985 -40.99 -40.995 -41 -41.005 -41.01 -41.015 -41.02 -41.025 -41.03 -41.035 -41.04 -41.045 -41.05 -41.055 -41.06 -41.065 -41.07 -41.075 -41.08 -41.085 -41.09 -41.095 -41.1 -41.105 -41.11 -41.115 -41.12 -41.125 -41.13 -41.135 -41.14 -41.145 -41.15 -41.155 -41.16 -41.165 -41.17 -41.175 -41.18 -41.185 -41.19 -41.195 -41.2 -41.205 -41.21 -41.215 -41.22 -41.225 -41.23 -41.235 -41.24 -41.245 -41.25 -41.255 -41.26 -41.265 -41.27 -41.275 -41.28 -41.285 -41.29 -41.295 -41.3 -41.305 -41.31 -41.315 -41.32 -41.325 -41.33 -41.335 -41.34 -41.345 -41.35 -41.355 -41.36 -41.365 -41.37 -41.375 -41.38 -41.385 -41.39 -41.395 -41.4 -41.405 -41.41 -41.415 -41.42 -41.425 -41.43 -41.435 -41.44 -41.445 -41.45 -41.455 -41.46 -41.465 -41.47 -41.475 -41.48 -41.485 -41.49 -41.495 -41.5 -41.505 -41.51 -41.515 -41.52 -41.525 -41.53 -41.535 -41.54 -41.545 -41.55 -41.555 -41.56 -41.565 -41.57 -41.575 -41.58 -41.585 -41.59 -41.595 -41.6 -41.605 -41.61 -41.615 -41.62 -41.625 -41.63 -41.635 -41.64 -41.645 -41.65 -41.655 -41.66 -41.665 -41.67 -41.675 -41.68 -41.685 -41.69 -41.695 -41.7 -41.705 -41.71 -41.715 -41.72 -41.725 -41.73 -41.735 -41.74 -41.745 -41.75 -41.755 -41.76 -41.765 -41.77 -41.775 -41.78 -41.785 -41.79 -41.795 -41.8 -41.805 -41.81 -41.815 -41.82 -41.825 -41.83 -41.835 -41.84 -41.845 -41.85 -41.855 -41.86 -41.865 -41.87 -41.875 -41.88 -41.885 -41.89 -41.895 -41.9 -41.905 -41.91 -41.915 -41.92 -41.925 -41.93 -41.935 -41.94 -41.945 -41.95 -41.955 -41.96 -41.965 -41.97 -41.975 -41.98 -41.985 -41.99 -41.995 -42 -42.005 -42.01 -42.015 -42.02 -42.025 -42.03 -42.035 -42.04 -42.045 -42.05 -42.055 -42.06 -42.065 -42.07 -42.075 -42.08 -42.085 -42.09 -42.095 -42.1 -42.105 -42.11 -42.115 -42.12 -42.125 -42.13 -42.135 -42.14 -42.145 -42.15 -42.155 -42.16 -42.165 -42.17 -42.175 -42.18 -42.185 -42.19 -42.195 -42.2 -42.205 -42.21 -42.215 -42.22 -42.225 -42.23 -42.235 -42.24 -42.245 -42.25 -42.255 -42.26 -42.265 -42.27 -42.275 -42.28 -42.285 -42.29 -42.295 -42.3 -42.305 -42.31 -42.315 -42.32 -42.325 -42.33 -42.335 -42.34 -42.345 -42.35 -42.355 -42.36 -42.365 -42.37 -42.375 -42.38 -42.385 -42.39 -42.395 -42.4 -42.405 -42.41 -42.415 -42.42 -42.425 -42.43 -42.435 -42.44 -42.445 -42.45 -42.455 -42.46 -42.465 -42.47 -42.475 -42.48 -42.485 -42.49 -42.495 -42.5 -42.505 -42.51 -42.515 -42.52 -42.525 -42.53 -42.535 -42.54 -42.545 -42.55 -42.555 -42.56 -42.565 -42.57 -42.575 -42.58 -42.585 -42.59 -42.595 -42.6 -42.605 -42.61 -42.615 -42.62 -42.625 -42.63 -42.635 -42.64 -42.645 -42.65 -42.655 -42.66 -42.665 -42.67 -42.675 -42.68 -42.685 -42.69 -42.695 -42.7 -42.705 -42.71 -42.715 -42.72 -42.725 -42.73 -42.735 -42.74 -42.745 -42.75 -42.755 -42.76 -42.765 -42.77 -42.775 -42.78 -42.785 -42.79 -42.795 -42.8 -42.805 -42.81 -42.815 -42.82 -42.825 -42.83 -42.835 -42.84 -42.845 -42.85 -42.855 -42.86 -42.865 -42.87 -42.875 -42.88 -42.885 -42.89 -42.895 -42.9 -42.905 -42.91 -42.915 -42.92 -42.925 -42.93 -42.935 -42.94 -42.945 -42.95 -42.955 -42.96 -42.965 -42.97 -42.975 -42.98 -42.985 -42.99 -42.995 -43 -43.005 -43.01 -43.015 -43.02 -43.025 -43.03 -43.035 -43.04 -43.045 -43.05 -43.055 -43.06 -43.065 -43.07 -43.075 -43.08 -43.085 -43.09 -43.095 -43.1 -43.105 -43.11 -43.115 -43.12 -43.125 -43.13 -43.135 -43.14 -43.145 -43.15 -43.155 -43.16 -43.165 -43.17 -43.175 -43.18 -43.185 -43.19 -43.195 -43.2 -43.205 -43.21 -43.215 -43.22 -43.225 -43.23 -43.235 -43.24 -43.245 -43.25 -43.255 -43.26 -43.265 -43.27 -43.275 -43.28 -43.285 -43.29 -43.295 -43.3 -43.305 -43.31 -43.315 -43.32 -43.325 -43.33 -43.335 -43.34 -43.345 -43.35 -43.355 -43.36 -43.365 -43.37 -43.375 -43.38 -43.385 -43.39 -43.395 -43.4 -43.405 -43.41 -43.415 -43.42 -43.425 -43.43 -43.435 -43.44 -43.445 -43.45 -43.455 -43.46 -43.465 -43.47 -43.475 -43.48 -43.485 -43.49 -43.495 -43.5 -43.505 -43.51 -43.515 -43.52 -43.525 -43.53 -43.535 -43.54 -43.545 -43.55 -43.555 -43.56 -43.565 -43.57 -43.575 -43.58 -43.585 -43.59 -43.595 -43.6 -43.605 -43.61 -43.615 -43.62 -43.625 -43.63 -43.635 -43.64 -43.645 -43.65 -43.655 -43.66 -43.665 -43.67 -43.675 -43.68 -43.685 -43.69 -43.695 -43.7 -43.705 -43.71 -43.715 -43.72 -43.725 -43.73 -43.735 -43.74 -43.745 -43.75 -43.755 -43.76 -43.765 -43.77 -43.775 -43.78 -43.785 -43.79 -43.795 -43.8 -43.805 -43.81 -43.815 -43.82 -43.825 -43.83 -43.835 -43.84 -43.845 -43.85 -43.855 -43.86 -43.865 -43.87 -43.875 -43.88 -43.885 -43.89 -43.895 -43.9 -43.905 -43.91 -43.915 -43.92 -43.925 -43.93 -43.935 -43.94 -43.945 -43.95 -43.955 -43.96 -43.965 -43.97 -43.975 -43.98 -43.985 -43.99 -43.995 -44 -44.005 -44.01 -44.015 -44.02 -44.025 -44.03 -44.035 -44.04 -44.045 -44.05 -44.055 -44.06 -44.065 -44.07 -44.075 -44.08 -44.085 -44.09 -44.095 -44.1 -44.105 -44.11 -44.115 -44.12 -44.125 -44.13 -44.135 -44.14 -44.145 -44.15 -44.155 -44.16 -44.165 -44.17 -44.175 -44.18 -44.185 -44.19 -44.195 -44.2 -44.205 -44.21 -44.215 -44.22 -44.225 -44.23 -44.235 -44.24 -44.245 -44.25 -44.255 -44.26 -44.265 -44.27 -44.275 -44.28 -44.285 -44.29 -44.295 -44.3 -44.305 -44.31 -44.315 -44.32 -44.325 -44.33 -44.335 -44.34 -44.345 -44.35 -44.355 -44.36 -44.365 -44.37 -44.375 -44.38 -44.385 -44.39 -44.395 -44.4 -44.405 -44.41 -44.415 -44.42 -44.425 -44.43 -44.435 -44.44 -44.445 -44.45 -44.455 -44.46 -44.465 -44.47 -44.475 -44.48 -44.485 -44.49 -44.495 -44.5 -44.505 -44.51 -44.515 -44.52 -44.525 -44.53 -44.535 -44.54 -44.545 -44.55 -44.555 -44.56 -44.565 -44.57 -44.575 -44.58 -44.585 -44.59 -44.595 -44.6 -44.605 -44.61 -44.615 -44.62 -44.625 -44.63 -44.635 -44.64 -44.645 -44.65 -44.655 -44.66 -44.665 -44.67 -44.675 -44.68 -44.685 -44.69 -44.695 -44.7 -44.705 -44.71 -44.715 -44.72 -44.725 -44.73 -44.735 -44.74 -44.745 -44.75 -44.755 -44.76 -44.765 -44.77 -44.775 -44.78 -44.785 -44.79 -44.795 -44.8 -44.805 -44.81 -44.815 -44.82 -44.825 -44.83 -44.835 -44.84 -44.845 -44.85 -44.855 -44.86 -44.865 -44.87 -44.875 -44.88 -44.885 -44.89 -44.895 -44.9 -44.905 -44.91 -44.915 -44.92 -44.925 -44.93 -44.935 -44.94 -44.945 -44.95 -44.955 -44.96 -44.965 -44.97 -44.975 -44.98 -44.985 -44.99 -44.995 -45 -45.005 -45.01 -45.015 -45.02 -45.025 -45.03 -45.035 -45.04 -45.045 -45.05 -45.055 -45.06 -45.065 -45.07 -45.075 -45.08 -45.085 -45.09 -45.095 -45.1 -45.105 -45.11 -45.115 -45.12 -45.125 -45.13 -45.135 -45.14 -45.145 -45.15 -45.155 -45.16 -45.165 -45.17 -45.175 -45.18 -45.185 -45.19 -45.195 -45.2 -45.205 -45.21 -45.215 -45.22 -45.225 -45.23 -45.235 -45.24 -45.245 -45.25 -45.255 -45.26 -45.265 -45.27 -45.275 -45.28 -45.285 -45.29 -45.295 -45.3 -45.305 -45.31 -45.315 -45.32 -45.325 -45.33 -45.335 -45.34 -45.345 -45.35 -45.355 -45.36 -45.365 -45.37 -45.375 -45.38 -45.385 -45.39 -45.395 -45.4 -45.405 -45.41 -45.415 -45.42 -45.425 -45.43 -45.435 -45.44 -45.445 -45.45 -45.455 -45.46 -45.465 -45.47 -45.475 -45.48 -45.485 -45.49 -45.495 -45.5 -45.505 -45.51 -45.515 -45.52 -45.525 -45.53 -45.535 -45.54 -45.545 -45.55 -45.555 -45.56 -45.565 -45.57 -45.575 -45.58 -45.585 -45.59 -45.595 -45.6 -45.605 -45.61 -45.615 -45.62 -45.625 -45.63 -45.635 -45.64 -45.645 -45.65 -45.655 -45.66 -45.665 -45.67 -45.675 -45.68 -45.685 -45.69 -45.695 -45.7 -45.705 -45.71 -45.715 -45.72 -45.725 -45.73 -45.735 -45.74 -45.745 -45.75 -45.755 -45.76 -45.765 -45.77 -45.775 -45.78 -45.785 -45.79 -45.795 -45.8 -45.805 -45.81 -45.815 -45.82 -45.825 -45.83 -45.835 -45.84 -45.845 -45.85 -45.855 -45.86 -45.865 -45.87 -45.875 -45.88 -45.885 -45.89 -45.895 -45.9 -45.905 -45.91 -45.915 -45.92 -45.925 -45.93 -45.935 -45.94 -45.945 -45.95 -45.955 -45.96 -45.965 -45.97 -45.975 -45.98 -45.985 -45.99 -45.995 -46 -46.005 -46.01 -46.015 -46.02 -46.025 -46.03 -46.035 -46.04 -46.045 -46.05 -46.055 -46.06 -46.065 -46.07 -46.075 -46.08 -46.085 -46.09 -46.095 -46.1 -46.105 -46.11 -46.115 -46.12 -46.125 -46.13 -46.135 -46.14 -46.145 -46.15 -46.155 -46.16 -46.165 -46.17 -46.175 -46.18 -46.185 -46.19 -46.195 -46.2 -46.205 -46.21 -46.215 -46.22 -46.225 -46.23 -46.235 -46.24 -46.245 -46.25 -46.255 -46.26 -46.265 -46.27 -46.275 -46.28 -46.285 -46.29 -46.295 -46.3 -46.305 -46.31 -46.315 -46.32 -46.325 -46.33 -46.335 -46.34 -46.345 -46.35 -46.355 -46.36 -46.365 -46.37 -46.375 -46.38 -46.385 -46.39 -46.395 -46.4 -46.405 -46.41 -46.415 -46.42 -46.425 -46.43 -46.435 -46.44 -46.445 -46.45 -46.455 -46.46 -46.465 -46.47 -46.475 -46.48 -46.485 -46.49 -46.495 -46.5 -46.505 -46.51 -46.515 -46.52 -46.525 -46.53 -46.535 -46.54 -46.545 -46.55 -46.555 -46.56 -46.565 -46.57 -46.575 -46.58 -46.585 -46.59 -46.595 -46.6 -46.605 -46.61 -46.615 -46.62 -46.625 -46.63 -46.635 -46.64 -46.645 -46.65 -46.655 -46.66 -46.665 -46.67 -46.675 -46.68 -46.685 -46.69 -46.695 -46.7 -46.705 -46.71 -46.715 -46.72 -46.725 -46.73 -46.735 -46.74 -46.745 -46.75 -46.755 -46.76 -46.765 -46.77 -46.775 -46.78 -46.785 -46.79 -46.795 -46.8 -46.805 -46.81 -46.815 -46.82 -46.825 -46.83 -46.835 -46.84 -46.845 -46.85 -46.855 -46.86 -46.865 -46.87 -46.875 -46.88 -46.885 -46.89 -46.895 -46.9 -46.905 -46.91 -46.915 -46.92 -46.925 -46.93 -46.935 -46.94 -46.945 -46.95 -46.955 -46.96 -46.965 -46.97 -46.975 -46.98 -46.985 -46.99 -46.995 -47 -47.005 -47.01 -47.015 -47.02 -47.025 -47.03 -47.035 -47.04 -47.045 -47.05 -47.055 -47.06 -47.065 -47.07 -47.075 -47.08 -47.085 -47.09 -47.095 -47.1 -47.105 -47.11 -47.115 -47.12 -47.125 -47.13 -47.135 -47.14 -47.145 -47.15 -47.155 -47.16 -47.165 -47.17 -47.175 -47.18 -47.185 -47.19 -47.195 -47.2 -47.205 -47.21 -47.215 -47.22 -47.225 -47.23 -47.235 -47.24 -47.245 -47.25 -47.255 -47.26 -47.265 -47.27 -47.275 -47.28 -47.285 -47.29 -47.295 -47.3 -47.305 -47.31 -47.315 -47.32 -47.325 -47.33 -47.335 -47.34 -47.345 -47.35 -47.355 -47.36 -47.365 -47.37 -47.375 -47.38 -47.385 -47.39 -47.395 -47.4 -47.405 -47.41 -47.415 -47.42 -47.425 -47.43 -47.435 -47.44 -47.445 -47.45 -47.455 -47.46 -47.465 -47.47 -47.475 -47.48 -47.485 -47.49 -47.495 -47.5 -47.505 -47.51 -47.515 -47.52 -47.525 -47.53 -47.535 -47.54 -47.545 -47.55 -47.555 -47.56 -47.565 -47.57 -47.575 -47.58 -47.585 -47.59 -47.595 -47.6 -47.605 -47.61 -47.615 -47.62 -47.625 -47.63 -47.635 -47.64 -47.645 -47.65 -47.655 -47.66 -47.665 -47.67 -47.675 -47.68 -47.685 -47.69 -47.695 -47.7 -47.705 -47.71 -47.715 -47.72 -47.725 -47.73 -47.735 -47.74 -47.745 -47.75 -47.755 -47.76 -47.765 -47.77 -47.775 -47.78 -47.785 -47.79 -47.795 -47.8 -47.805 -47.81 -47.815 -47.82 -47.825 -47.83 -47.835 -47.84 -47.845 -47.85 -47.855 -47.86 -47.865 -47.87 -47.875 -47.88 -47.885 -47.89 -47.895 -47.9 -47.905 -47.91 -47.915 -47.92 -47.925 -47.93 -47.935 -47.94 -47.945 -47.95 -47.955 -47.96 -47.965 -47.97 -47.975 -47.98 -47.985 -47.99 -47.995 -48 -48.005 -48.01 -48.015 -48.02 -48.025 -48.03 -48.035 -48.04 -48.045 -48.05 -48.055 -48.06 -48.065 -48.07 -48.075 -48.08 -48.085 -48.09 -48.095 -48.1 -48.105 -48.11 -48.115 -48.12 -48.125 -48.13 -48.135 -48.14 -48.145 -48.15 -48.155 -48.16 -48.165 -48.17 -48.175 -48.18 -48.185 -48.19 -48.195 -48.2 -48.205 -48.21 -48.215 -48.22 -48.225 -48.23 -48.235 -48.24 -48.245 -48.25 -48.255 -48.26 -48.265 -48.27 -48.275 -48.28 -48.285 -48.29 -48.295 -48.3 -48.305 -48.31 -48.315 -48.32 -48.325 -48.33 -48.335 -48.34 -48.345 -48.35 -48.355 -48.36 -48.365 -48.37 -48.375 -48.38 -48.385 -48.39 -48.395 -48.4 -48.405 -48.41 -48.415 -48.42 -48.425 -48.43 -48.435 -48.44 -48.445 -48.45 -48.455 -48.46 -48.465 -48.47 -48.475 -48.48 -48.485 -48.49 -48.495 -48.5 -48.505 -48.51 -48.515 -48.52 -48.525 -48.53 -48.535 -48.54 -48.545 -48.55 -48.555 -48.56 -48.565 -48.57 -48.575 -48.58 -48.585 -48.59 -48.595 -48.6 -48.605 -48.61 -48.615 -48.62 -48.625 -48.63 -48.635 -48.64 -48.645 -48.65 -48.655 -48.66 -48.665 -48.67 -48.675 -48.68 -48.685 -48.69 -48.695 -48.7 -48.705 -48.71 -48.715 -48.72 -48.725 -48.73 -48.735 -48.74 -48.745 -48.75 -48.755 -48.76 -48.765 -48.77 -48.775 -48.78 -48.785 -48.79 -48.795 -48.8 -48.805 -48.81 -48.815 -48.82 -48.825 -48.83 -48.835 -48.84 -48.845 -48.85 -48.855 -48.86 -48.865 -48.87 -48.875 -48.88 -48.885 -48.89 -48.895 -48.9 -48.905 -48.91 -48.915 -48.92 -48.925 -48.93 -48.935 -48.94 -48.945 -48.95 -48.955 -48.96 -48.965 -48.97 -48.975 -48.98 -48.985 -48.99 -48.995 -49 -49.005 -49.01 -49.015 -49.02 -49.025 -49.03 -49.035 -49.04 -49.045 -49.05 -49.055 -49.06 -49.065 -49.07 -49.075 -49.08 -49.085 -49.09 -49.095 -49.1 -49.105 -49.11 -49.115 -49.12 -49.125 -49.13 -49.135 -49.14 -49.145 -49.15 -49.155 -49.16 -49.165 -49.17 -49.175 -49.18 -49.185 -49.19 -49.195 -49.2 -49.205 -49.21 -49.215 -49.22 -49.225 -49.23 -49.235 -49.24 -49.245 -49.25 -49.255 -49.26 -49.265 -49.27 -49.275 -49.28 -49.285 -49.29 -49.295 -49.3 -49.305 -49.31 -49.315 -49.32 -49.325 -49.33 -49.335 -49.34 -49.345 -49.35 -49.355 -49.36 -49.365 -49.37 -49.375 -49.38 -49.385 -49.39 -49.395 -49.4 -49.405 -49.41 -49.415 -49.42 -49.425 -49.43 -49.435 -49.44 -49.445 -49.45 -49.455 -49.46 -49.465 -49.47 -49.475 -49.48 -49.485 -49.49 -49.495 -49.5 -49.505 -49.51 -49.515 -49.52 -49.525 -49.53 -49.535 -49.54 -49.545 -49.55 -49.555 -49.56 -49.565 -49.57 -49.575 -49.58 -49.585 -49.59 -49.595 -49.6 -49.605 -49.61 -49.615 -49.62 -49.625 -49.63 -49.635 -49.64 -49.645 -49.65 -49.655 -49.66 -49.665 -49.67 -49.675 -49.68 -49.685 -49.69 -49.695 -49.7 -49.705 -49.71 -49.715 -49.72 -49.725 -49.73 -49.735 -49.74 -49.745 -49.75 -49.755 -49.76 -49.765 -49.77 -49.775 -49.78 -49.785 -49.79 -49.795 -49.8 -49.805 -49.81 -49.815 -49.82 -49.825 -49.83 -49.835 -49.84 -49.845 -49.85 -49.855 -49.86 -49.865 -49.87 -49.875 -49.88 -49.885 -49.89 -49.895 -49.9 -49.905 -49.91 -49.915 -49.92 -49.925 -49.93 -49.935 -49.94 -49.945 -49.95 -49.955 -49.96 -49.965 -49.97 -49.975 -49.98 -49.985 -49.99 -49.995 -50 -50.005 -50.01 -50.015 -50.02 -50.025 -50.03 -50.035 -50.04 -50.045 -50.05 -50.055 -50.06 -50.065 -50.07 -50.075 -50.08 -50.085 -50.09 -50.095 -50.1 -50.105 -50.11 -50.115 -50.12 -50.125 -50.13 -50.135 -50.14 -50.145 -50.15 -50.155 -50.16 -50.165 -50.17 -50.175 -50.18 -50.185 -50.19 -50.195 -50.2 -50.205 -50.21 -50.215 -50.22 -50.225 -50.23 -50.235 -50.24 -50.245 -50.25 -50.255 -50.26 -50.265 -50.27 -50.275 -50.28 -50.285 -50.29 -50.295 -50.3 -50.305 -50.31 -50.315 -50.32 -50.325 -50.33 -50.335 -50.34 -50.345 -50.35 -50.355 -50.36 -50.365 -50.37 -50.375 -50.38 -50.385 -50.39 -50.395 -50.4 -50.405 -50.41 -50.415 -50.42 -50.425 -50.43 -50.435 -50.44 -50.445 -50.45 -50.455 -50.46 -50.465 -50.47 -50.475 -50.48 -50.485 -50.49 -50.495 -50.5 -50.505 -50.51 -50.515 -50.52 -50.525 -50.53 -50.535 -50.54 -50.545 -50.55 -50.555 -50.56 -50.565 -50.57 -50.575 -50.58 -50.585 -50.59 -50.595 -50.6 -50.605 -50.61 -50.615 -50.62 -50.625 -50.63 -50.635 -50.64 -50.645 -50.65 -50.655 -50.66 -50.665 -50.67 -50.675 -50.68 -50.685 -50.69 -50.695 -50.7 -50.705 -50.71 -50.715 -50.72 -50.725 -50.73 -50.735 -50.74 -50.745 -50.75 -50.755 -50.76 -50.765 -50.77 -50.775 -50.78 -50.785 -50.79 -50.795 -50.8 -50.805 -50.81 -50.815 -50.82 -50.825 -50.83 -50.835 -50.84 -50.845 -50.85 -50.855 -50.86 -50.865 -50.87 -50.875 -50.88 -50.885 -50.89 -50.895 -50.9 -50.905 -50.91 -50.915 -50.92 -50.925 -50.93 -50.935 -50.94 -50.945 -50.95 -50.955 -50.96 -50.965 -50.97 -50.975 -50.98 -50.985 -50.99 -50.995 -51 -51.005 -51.01 -51.015 -51.02 -51.025 -51.03 -51.035 -51.04 -51.045 -51.05 -51.055 -51.06 -51.065 -51.07 -51.075 -51.08 -51.085 -51.09 -51.095 -51.1 -51.105 -51.11 -51.115 -51.12 -51.125 -51.13 -51.135 -51.14 -51.145 -51.15 -51.155 -51.16 -51.165 -51.17 -51.175 -51.18 -51.185 -51.19 -51.195 -51.2 -51.205 -51.21 -51.215 -51.22 -51.225 -51.23 -51.235 -51.24 -51.245 -51.25 -51.255 -51.26 -51.265 -51.27 -51.275 -51.28 -51.285 -51.29 -51.295 -51.3 -51.305 -51.31 -51.315 -51.32 -51.325 -51.33 -51.335 -51.34 -51.345 -51.35 -51.355 -51.36 -51.365 -51.37 -51.375 -51.38 -51.385 -51.39 -51.395 -51.4 -51.405 -51.41 -51.415 -51.42 -51.425 -51.43 -51.435 -51.44 -51.445 -51.45 -51.455 -51.46 -51.465 -51.47 -51.475 -51.48 -51.485 -51.49 -51.495 -51.5 -51.505 -51.51 -51.515 -51.52 -51.525 -51.53 -51.535 -51.54 -51.545 -51.55 -51.555 -51.56 -51.565 -51.57 -51.575 -51.58 -51.585 -51.59 -51.595 -51.6 -51.605 -51.61 -51.615 -51.62 -51.625 -51.63 -51.635 -51.64 -51.645 -51.65 -51.655 -51.66 -51.665 -51.67 -51.675 -51.68 -51.685 -51.69 -51.695 -51.7 -51.705 -51.71 -51.715 -51.72 -51.725 -51.73 -51.735 -51.74 -51.745 -51.75 -51.755 -51.76 -51.765 -51.77 -51.775 -51.78 -51.785 -51.79 -51.795 -51.8 -51.805 -51.81 -51.815 -51.82 -51.825 -51.83 -51.835 -51.84 -51.845 -51.85 -51.855 -51.86 -51.865 -51.87 -51.875 -51.88 -51.885 -51.89 -51.895 -51.9 -51.905 -51.91 -51.915 -51.92 -51.925 -51.93 -51.935 -51.94 -51.945 -51.95 -51.955 -51.96 -51.965 -51.97 -51.975 -51.98 -51.985 -51.99 -51.995 -52 -52.005 -52.01 -52.015 -52.02 -52.025 -52.03 -52.035 -52.04 -52.045 -52.05 -52.055 -52.06 -52.065 -52.07 -52.075 -52.08 -52.085 -52.09 -52.095 -52.1 -52.105 -52.11 -52.115 -52.12 -52.125 -52.13 -52.135 -52.14 -52.145 -52.15 -52.155 -52.16 -52.165 -52.17 -52.175 -52.18 -52.185 -52.19 -52.195 -52.2 -52.205 -52.21 -52.215 -52.22 -52.225 -52.23 -52.235 -52.24 -52.245 -52.25 -52.255 -52.26 -52.265 -52.27 -52.275 -52.28 -52.285 -52.29 -52.295 -52.3 -52.305 -52.31 -52.315 -52.32 -52.325 -52.33 -52.335 -52.34 -52.345 -52.35 -52.355 -52.36 -52.365 -52.37 -52.375 -52.38 -52.385 -52.39 -52.395 -52.4 -52.405 -52.41 -52.415 -52.42 -52.425 -52.43 -52.435 -52.44 -52.445 -52.45 -52.455 -52.46 -52.465 -52.47 -52.475 -52.48 -52.485 -52.49 -52.495 -52.5 -52.505 -52.51 -52.515 -52.52 -52.525 -52.53 -52.535 -52.54 -52.545 -52.55 -52.555 -52.56 -52.565 -52.57 -52.575 -52.58 -52.585 -52.59 -52.595 -52.6 -52.605 -52.61 -52.615 -52.62 -52.625 -52.63 -52.635 -52.64 -52.645 -52.65 -52.655 -52.66 -52.665 -52.67 -52.675 -52.68 -52.685 -52.69 -52.695 -52.7 -52.705 -52.71 -52.715 -52.72 -52.725 -52.73 -52.735 -52.74 -52.745 -52.75 -52.755 -52.76 -52.765 -52.77 -52.775 -52.78 -52.785 -52.79 -52.795 -52.8 -52.805 -52.81 -52.815 -52.82 -52.825 -52.83 -52.835 -52.84 -52.845 -52.85 -52.855 -52.86 -52.865 -52.87 -52.875 -52.88 -52.885 -52.89 -52.895 -52.9 -52.905 -52.91 -52.915 -52.92 -52.925 -52.93 -52.935 -52.94 -52.945 -52.95 -52.955 -52.96 -52.965 -52.97 -52.975 -52.98 -52.985 -52.99 -52.995 -53 -53.005 -53.01 -53.015 -53.02 -53.025 -53.03 -53.035 -53.04 -53.045 -53.05 -53.055 -53.06 -53.065 -53.07 -53.075 -53.08 -53.085 -53.09 -53.095 -53.1 -53.105 -53.11 -53.115 -53.12 -53.125 -53.13 -53.135 -53.14 -53.145 -53.15 -53.155 -53.16 -53.165 -53.17 -53.175 -53.18 -53.185 -53.19 -53.195 -53.2 -53.205 -53.21 -53.215 -53.22 -53.225 -53.23 -53.235 -53.24 -53.245 -53.25 -53.255 -53.26 -53.265 -53.27 -53.275 -53.28 -53.285 -53.29 -53.295 -53.3 -53.305 -53.31 -53.315 -53.32 -53.325 -53.33 -53.335 -53.34 -53.345 -53.35 -53.355 -53.36 -53.365 -53.37 -53.375 -53.38 -53.385 -53.39 -53.395 -53.4 -53.405 -53.41 -53.415 -53.42 -53.425 -53.43 -53.435 -53.44 -53.445 -53.45 -53.455 -53.46 -53.465 -53.47 -53.475 -53.48 -53.485 -53.49 -53.495 -53.5 -53.505 -53.51 -53.515 -53.52 -53.525 -53.53 -53.535 -53.54 -53.545 -53.55 -53.555 -53.56 -53.565 -53.57 -53.575 -53.58 -53.585 -53.59 -53.595 -53.6 -53.605 -53.61 -53.615 -53.62 -53.625 -53.63 -53.635 -53.64 -53.645 -53.65 -53.655 -53.66 -53.665 -53.67 -53.675 -53.68 -53.685 -53.69 -53.695 -53.7 -53.705 -53.71 -53.715 -53.72 -53.725 -53.73 -53.735 -53.74 -53.745 -53.75 -53.755 -53.76 -53.765 -53.77 -53.775 -53.78 -53.785 -53.79 -53.795 -53.8 -53.805 -53.81 -53.815 -53.82 -53.825 -53.83 -53.835 -53.84 -53.845 -53.85 -53.855 -53.86 -53.865 -53.87 -53.875 -53.88 -53.885 -53.89 -53.895 -53.9 -53.905 -53.91 -53.915 -53.92 -53.925 -53.93 -53.935 -53.94 -53.945 -53.95 -53.955 -53.96 -53.965 -53.97 -53.975 -53.98 -53.985 -53.99 -53.995 -54 -54.005 -54.01 -54.015 -54.02 -54.025 -54.03 -54.035 -54.04 -54.045 -54.05 -54.055 -54.06 -54.065 -54.07 -54.075 -54.08 -54.085 -54.09 -54.095 -54.1 -54.105 -54.11 -54.115 -54.12 -54.125 -54.13 -54.135 -54.14 -54.145 -54.15 -54.155 -54.16 -54.165 -54.17 -54.175 -54.18 -54.185 -54.19 -54.195 -54.2 -54.205 -54.21 -54.215 -54.22 -54.225 -54.23 -54.235 -54.24 -54.245 -54.25 -54.255 -54.26 -54.265 -54.27 -54.275 -54.28 -54.285 -54.29 -54.295 -54.3 -54.305 -54.31 -54.315 -54.32 -54.325 -54.33 -54.335 -54.34 -54.345 -54.35 -54.355 -54.36 -54.365 -54.37 -54.375 -54.38 -54.385 -54.39 -54.395 -54.4 -54.405 -54.41 -54.415 -54.42 -54.425 -54.43 -54.435 -54.44 -54.445 -54.45 -54.455 -54.46 -54.465 -54.47 -54.475 -54.48 -54.485 -54.49 -54.495 -54.5 -54.505 -54.51 -54.515 -54.52 -54.525 -54.53 -54.535 -54.54 -54.545 -54.55 -54.555 -54.56 -54.565 -54.57 -54.575 -54.58 -54.585 -54.59 -54.595 -54.6 -54.605 -54.61 -54.615 -54.62 -54.625 -54.63 -54.635 -54.64 -54.645 -54.65 -54.655 -54.66 -54.665 -54.67 -54.675 -54.68 -54.685 -54.69 -54.695 -54.7 -54.705 -54.71 -54.715 -54.72 -54.725 -54.73 -54.735 -54.74 -54.745 -54.75 -54.755 -54.76 -54.765 -54.77 -54.775 -54.78 -54.785 -54.79 -54.795 -54.8 -54.805 -54.81 -54.815 -54.82 -54.825 -54.83 -54.835 -54.84 -54.845 -54.85 -54.855 -54.86 -54.865 -54.87 -54.875 -54.88 -54.885 -54.89 -54.895 -54.9 -54.905 -54.91 -54.915 -54.92 -54.925 -54.93 -54.935 -54.94 -54.945 -54.95 -54.955 -54.96 -54.965 -54.97 -54.975 -54.98 -54.985 -54.99 -54.995 -55 -55.005 -55.01 -55.015 -55.02 -55.025 -55.03 -55.035 -55.04 -55.045 -55.05 -55.055 -55.06 -55.065 -55.07 -55.075 -55.08 -55.085 -55.09 -55.095 -55.1 -55.105 -55.11 -55.115 -55.12 -55.125 -55.13 -55.135 -55.14 -55.145 -55.15 -55.155 -55.16 -55.165 -55.17 -55.175 -55.18 -55.185 -55.19 -55.195 -55.2 -55.205 -55.21 -55.215 -55.22 -55.225 -55.23 -55.235 -55.24 -55.245 -55.25 -55.255 -55.26 -55.265 -55.27 -55.275 -55.28 -55.285 -55.29 -55.295 -55.3 -55.305 -55.31 -55.315 -55.32 -55.325 -55.33 -55.335 -55.34 -55.345 -55.35 -55.355 -55.36 -55.365 -55.37 -55.375 -55.38 -55.385 -55.39 -55.395 -55.4 -55.405 -55.41 -55.415 -55.42 -55.425 -55.43 -55.435 -55.44 -55.445 -55.45 -55.455 -55.46 -55.465 -55.47 -55.475 -55.48 -55.485 -55.49 -55.495 -55.5 -55.505 -55.51 -55.515 -55.52 -55.525 -55.53 -55.535 -55.54 -55.545 -55.55 -55.555 -55.56 -55.565 -55.57 -55.575 -55.58 -55.585 -55.59 -55.595 -55.6 -55.605 -55.61 -55.615 -55.62 -55.625 -55.63 -55.635 -55.64 -55.645 -55.65 -55.655 -55.66 -55.665 -55.67 -55.675 -55.68 -55.685 -55.69 -55.695 -55.7 -55.705 -55.71 -55.715 -55.72 -55.725 -55.73 -55.735 -55.74 -55.745 -55.75 -55.755 -55.76 -55.765 -55.77 -55.775 -55.78 -55.785 -55.79 -55.795 -55.8 -55.805 -55.81 -55.815 -55.82 -55.825 -55.83 -55.835 -55.84 -55.845 -55.85 -55.855 -55.86 -55.865 -55.87 -55.875 -55.88 -55.885 -55.89 -55.895 -55.9 -55.905 -55.91 -55.915 -55.92 -55.925 -55.93 -55.935 -55.94 -55.945 -55.95 -55.955 -55.96 -55.965 -55.97 -55.975 -55.98 -55.985 -55.99 -55.995 -56 -56.005 -56.01 -56.015 -56.02 -56.025 -56.03 -56.035 -56.04 -56.045 -56.05 -56.055 -56.06 -56.065 -56.07 -56.075 -56.08 -56.085 -56.09 -56.095 -56.1 -56.105 -56.11 -56.115 -56.12 -56.125 -56.13 -56.135 -56.14 -56.145 -56.15 -56.155 -56.16 -56.165 -56.17 -56.175 -56.18 -56.185 -56.19 -56.195 -56.2 -56.205 -56.21 -56.215 -56.22 -56.225 -56.23 -56.235 -56.24 -56.245 -56.25 -56.255 -56.26 -56.265 -56.27 -56.275 -56.28 -56.285 -56.29 -56.295 -56.3 -56.305 -56.31 -56.315 -56.32 -56.325 -56.33 -56.335 -56.34 -56.345 -56.35 -56.355 -56.36 -56.365 -56.37 -56.375 -56.38 -56.385 -56.39 -56.395 -56.4 -56.405 -56.41 -56.415 -56.42 -56.425 -56.43 -56.435 -56.44 -56.445 -56.45 -56.455 -56.46 -56.465 -56.47 -56.475 -56.48 -56.485 -56.49 -56.495 -56.5 -56.505 -56.51 -56.515 -56.52 -56.525 -56.53 -56.535 -56.54 -56.545 -56.55 -56.555 -56.56 -56.565 -56.57 -56.575 -56.58 -56.585 -56.59 -56.595 -56.6 -56.605 -56.61 -56.615 -56.62 -56.625 -56.63 -56.635 -56.64 -56.645 -56.65 -56.655 -56.66 -56.665 -56.67 -56.675 -56.68 -56.685 -56.69 -56.695 -56.7 -56.705 -56.71 -56.715 -56.72 -56.725 -56.73 -56.735 -56.74 -56.745 -56.75 -56.755 -56.76 -56.765 -56.77 -56.775 -56.78 -56.785 -56.79 -56.795 -56.8 -56.805 -56.81 -56.815 -56.82 -56.825 -56.83 -56.835 -56.84 -56.845 -56.85 -56.855 -56.86 -56.865 -56.87 -56.875 -56.88 -56.885 -56.89 -56.895 -56.9 -56.905 -56.91 -56.915 -56.92 -56.925 -56.93 -56.935 -56.94 -56.945 -56.95 -56.955 -56.96 -56.965 -56.97 -56.975 -56.98 -56.985 -56.99 -56.995 -57 -57.005 -57.01 -57.015 -57.02 -57.025 -57.03 -57.035 -57.04 -57.045 -57.05 -57.055 -57.06 -57.065 -57.07 -57.075 -57.08 -57.085 -57.09 -57.095 -57.1 -57.105 -57.11 -57.115 -57.12 -57.125 -57.13 -57.135 -57.14 -57.145 -57.15 -57.155 -57.16 -57.165 -57.17 -57.175 -57.18 -57.185 -57.19 -57.195 -57.2 -57.205 -57.21 -57.215 -57.22 -57.225 -57.23 -57.235 -57.24 -57.245 -57.25 -57.255 -57.26 -57.265 -57.27 -57.275 -57.28 -57.285 -57.29 -57.295 -57.3 -57.305 -57.31 -57.315 -57.32 -57.325 -57.33 -57.335 -57.34 -57.345 -57.35 -57.355 -57.36 -57.365 -57.37 -57.375 -57.38 -57.385 -57.39 -57.395 -57.4 -57.405 -57.41 -57.415 -57.42 -57.425 -57.43 -57.435 -57.44 -57.445 -57.45 -57.455 -57.46 -57.465 -57.47 -57.475 -57.48 -57.485 -57.49 -57.495 -57.5 -57.505 -57.51 -57.515 -57.52 -57.525 -57.53 -57.535 -57.54 -57.545 -57.55 -57.555 -57.56 -57.565 -57.57 -57.575 -57.58 -57.585 -57.59 -57.595 -57.6 -57.605 -57.61 -57.615 -57.62 -57.625 -57.63 -57.635 -57.64 -57.645 -57.65 -57.655 -57.66 -57.665 -57.67 -57.675 -57.68 -57.685 -57.69 -57.695 -57.7 -57.705 -57.71 -57.715 -57.72 -57.725 -57.73 -57.735 -57.74 -57.745 -57.75 -57.755 -57.76 -57.765 -57.77 -57.775 -57.78 -57.785 -57.79 -57.795 -57.8 -57.805 -57.81 -57.815 -57.82 -57.825 -57.83 -57.835 -57.84 -57.845 -57.85 -57.855 -57.86 -57.865 -57.87 -57.875 -57.88 -57.885 -57.89 -57.895 -57.9 -57.905 -57.91 -57.915 -57.92 -57.925 -57.93 -57.935 -57.94 -57.945 -57.95 -57.955 -57.96 -57.965 -57.97 -57.975 -57.98 -57.985 -57.99 -57.995 -58 -58.005 -58.01 -58.015 -58.02 -58.025 -58.03 -58.035 -58.04 -58.045 -58.05 -58.055 -58.06 -58.065 -58.07 -58.075 -58.08 -58.085 -58.09 -58.095 -58.1 -58.105 -58.11 -58.115 -58.12 -58.125 -58.13 -58.135 -58.14 -58.145 -58.15 -58.155 -58.16 -58.165 -58.17 -58.175 -58.18 -58.185 -58.19 -58.195 -58.2 -58.205 -58.21 -58.215 -58.22 -58.225 -58.23 -58.235 -58.24 -58.245 -58.25 -58.255 -58.26 -58.265 -58.27 -58.275 -58.28 -58.285 -58.29 -58.295 -58.3 -58.305 -58.31 -58.315 -58.32 -58.325 -58.33 -58.335 -58.34 -58.345 -58.35 -58.355 -58.36 -58.365 -58.37 -58.375 -58.38 -58.385 -58.39 -58.395 -58.4 -58.405 -58.41 -58.415 -58.42 -58.425 -58.43 -58.435 -58.44 -58.445 -58.45 -58.455 -58.46 -58.465 -58.47 -58.475 -58.48 -58.485 -58.49 -58.495 -58.5 -58.505 -58.51 -58.515 -58.52 -58.525 -58.53 -58.535 -58.54 -58.545 -58.55 -58.555 -58.56 -58.565 -58.57 -58.575 -58.58 -58.585 -58.59 -58.595 -58.6 -58.605 -58.61 -58.615 -58.62 -58.625 -58.63 -58.635 -58.64 -58.645 -58.65 -58.655 -58.66 -58.665 -58.67 -58.675 -58.68 -58.685 -58.69 -58.695 -58.7 -58.705 -58.71 -58.715 -58.72 -58.725 -58.73 -58.735 -58.74 -58.745 -58.75 -58.755 -58.76 -58.765 -58.77 -58.775 -58.78 -58.785 -58.79 -58.795 -58.8 -58.805 -58.81 -58.815 -58.82 -58.825 -58.83 -58.835 -58.84 -58.845 -58.85 -58.855 -58.86 -58.865 -58.87 -58.875 -58.88 -58.885 -58.89 -58.895 -58.9 -58.905 -58.91 -58.915 -58.92 -58.925 -58.93 -58.935 -58.94 -58.945 -58.95 -58.955 -58.96 -58.965 -58.97 -58.975 -58.98 -58.985 -58.99 -58.995 -59 -59.005 -59.01 -59.015 -59.02 -59.025 -59.03 -59.035 -59.04 -59.045 -59.05 -59.055 -59.06 -59.065 -59.07 -59.075 -59.08 -59.085 -59.09 -59.095 -59.1 -59.105 -59.11 -59.115 -59.12 -59.125 -59.13 -59.135 -59.14 -59.145 -59.15 -59.155 -59.16 -59.165 -59.17 -59.175 -59.18 -59.185 -59.19 -59.195 -59.2 -59.205 -59.21 -59.215 -59.22 -59.225 -59.23 -59.235 -59.24 -59.245 -59.25 -59.255 -59.26 -59.265 -59.27 -59.275 -59.28 -59.285 -59.29 -59.295 -59.3 -59.305 -59.31 -59.315 -59.32 -59.325 -59.33 -59.335 -59.34 -59.345 -59.35 -59.355 -59.36 -59.365 -59.37 -59.375 -59.38 -59.385 -59.39 -59.395 -59.4 -59.405 -59.41 -59.415 -59.42 -59.425 -59.43 -59.435 -59.44 -59.445 -59.45 -59.455 -59.46 -59.465 -59.47 -59.475 -59.48 -59.485 -59.49 -59.495 -59.5 -59.505 -59.51 -59.515 -59.52 -59.525 -59.53 -59.535 -59.54 -59.545 -59.55 -59.555 -59.56 -59.565 -59.57 -59.575 -59.58 -59.585 -59.59 -59.595 -59.6 -59.605 -59.61 -59.615 -59.62 -59.625 -59.63 -59.635 -59.64 -59.645 -59.65 -59.655 -59.66 -59.665 -59.67 -59.675 -59.68 -59.685 -59.69 -59.695 -59.7 -59.705 -59.71 -59.715 -59.72 -59.725 -59.73 -59.735 -59.74 -59.745 -59.75 -59.755 -59.76 -59.765 -59.77 -59.775 -59.78 -59.785 -59.79 -59.795 -59.8 -59.805 -59.81 -59.815 -59.82 -59.825 -59.83 -59.835 -59.84 -59.845 -59.85 -59.855 -59.86 -59.865 -59.87 -59.875 -59.88 -59.885 -59.89 -59.895 -59.9 -59.905 -59.91 -59.915 -59.92 -59.925 -59.93 -59.935 -59.94 -59.945 -59.95 -59.955 -59.96 -59.965 -59.97 -59.975 -59.98 -59.985 -59.99 -59.995 -60 -60.005 -60.01 -60.015 -60.02 -60.025 -60.03 -60.035 -60.04 -60.045 -60.05 -60.055 -60.06 -60.065 -60.07 -60.075 -60.08 -60.085 -60.09 -60.095 -60.1 -60.105 -60.11 -60.115 -60.12 -60.125 -60.13 -60.135 -60.14 -60.145 -60.15 -60.155 -60.16 -60.165 -60.17 -60.175 -60.18 -60.185 -60.19 -60.195 -60.2 -60.205 -60.21 -60.215 -60.22 -60.225 -60.23 -60.235 -60.24 -60.245 -60.25 -60.255 -60.26 -60.265 -60.27 -60.275 -60.28 -60.285 -60.29 -60.295 -60.3 -60.305 -60.31 -60.315 -60.32 -60.325 -60.33 -60.335 -60.34 -60.345 -60.35 -60.355 -60.36 -60.365 -60.37 -60.375 -60.38 -60.385 -60.39 -60.395 -60.4 -60.405 -60.41 -60.415 -60.42 -60.425 -60.43 -60.435 -60.44 -60.445 -60.45 -60.455 -60.46 -60.465 -60.47 -60.475 -60.48 -60.485 -60.49 -60.495 -60.5 -60.505 -60.51 -60.515 -60.52 -60.525 -60.53 -60.535 -60.54 -60.545 -60.55 -60.555 -60.56 -60.565 -60.57 -60.575 -60.58 -60.585 -60.59 -60.595 -60.6 -60.605 -60.61 -60.615 -60.62 -60.625 -60.63 -60.635 -60.64 -60.645 -60.65 -60.655 -60.66 -60.665 -60.67 -60.675 -60.68 -60.685 -60.69 -60.695 -60.7 -60.705 -60.71 -60.715 -60.72 -60.725 -60.73 -60.735 -60.74 -60.745 -60.75 -60.755 -60.76 -60.765 -60.77 -60.775 -60.78 -60.785 -60.79 -60.795 -60.8 -60.805 -60.81 -60.815 -60.82 -60.825 -60.83 -60.835 -60.84 -60.845 -60.85 -60.855 -60.86 -60.865 -60.87 -60.875 -60.88 -60.885 -60.89 -60.895 -60.9 -60.905 -60.91 -60.915 -60.92 -60.925 -60.93 -60.935 -60.94 -60.945 -60.95 -60.955 -60.96 -60.965 -60.97 -60.975 -60.98 -60.985 -60.99 -60.995 -61 -61.005 -61.01 -61.015 -61.02 -61.025 -61.03 -61.035 -61.04 -61.045 -61.05 -61.055 -61.06 -61.065 -61.07 -61.075 -61.08 -61.085 -61.09 -61.095 -61.1 -61.105 -61.11 -61.115 -61.12 -61.125 -61.13 -61.135 -61.14 -61.145 -61.15 -61.155 -61.16 -61.165 -61.17 -61.175 -61.18 -61.185 -61.19 -61.195 -61.2 -61.205 -61.21 -61.215 -61.22 -61.225 -61.23 -61.235 -61.24 -61.245 -61.25 -61.255 -61.26 -61.265 -61.27 -61.275 -61.28 -61.285 -61.29 -61.295 -61.3 -61.305 -61.31 -61.315 -61.32 -61.325 -61.33 -61.335 -61.34 -61.345 -61.35 -61.355 -61.36 -61.365 -61.37 -61.375 -61.38 -61.385 -61.39 -61.395 -61.4 -61.405 -61.41 -61.415 -61.42 -61.425 -61.43 -61.435 -61.44 -61.445 -61.45 -61.455 -61.46 -61.465 -61.47 -61.475 -61.48 -61.485 -61.49 -61.495 -61.5 -61.505 -61.51 -61.515 -61.52 -61.525 -61.53 -61.535 -61.54 -61.545 -61.55 -61.555 -61.56 -61.565 -61.57 -61.575 -61.58 -61.585 -61.59 -61.595 -61.6 -61.605 -61.61 -61.615 -61.62 -61.625 -61.63 -61.635 -61.64 -61.645 -61.65 -61.655 -61.66 -61.665 -61.67 -61.675 -61.68 -61.685 -61.69 -61.695 -61.7 -61.705 -61.71 -61.715 -61.72 -61.725 -61.73 -61.735 -61.74 -61.745 -61.75 -61.755 -61.76 -61.765 -61.77 -61.775 -61.78 -61.785 -61.79 -61.795 -61.8 -61.805 -61.81 -61.815 -61.82 -61.825 -61.83 -61.835 -61.84 -61.845 -61.85 -61.855 -61.86 -61.865 -61.87 -61.875 -61.88 -61.885 -61.89 -61.895 -61.9 -61.905 -61.91 -61.915 -61.92 -61.925 -61.93 -61.935 -61.94 -61.945 -61.95 -61.955 -61.96 -61.965 -61.97 -61.975 -61.98 -61.985 -61.99 -61.995 -62 -62.005 -62.01 -62.015 -62.02 -62.025 -62.03 -62.035 -62.04 -62.045 -62.05 -62.055 -62.06 -62.065 -62.07 -62.075 -62.08 -62.085 -62.09 -62.095 -62.1 -62.105 -62.11 -62.115 -62.12 -62.125 -62.13 -62.135 -62.14 -62.145 -62.15 -62.155 -62.16 -62.165 -62.17 -62.175 -62.18 -62.185 -62.19 -62.195 -62.2 -62.205 -62.21 -62.215 -62.22 -62.225 -62.23 -62.235 -62.24 -62.245 -62.25 -62.255 -62.26 -62.265 -62.27 -62.275 -62.28 -62.285 -62.29 -62.295 -62.3 -62.305 -62.31 -62.315 -62.32 -62.325 -62.33 -62.335 -62.34 -62.345 -62.35 -62.355 -62.36 -62.365 -62.37 -62.375 -62.38 -62.385 -62.39 -62.395 -62.4 -62.405 -62.41 -62.415 -62.42 -62.425 -62.43 -62.435 -62.44 -62.445 -62.45 -62.455 -62.46 -62.465 -62.47 -62.475 -62.48 -62.485 -62.49 -62.495 -62.5 -62.505 -62.51 -62.515 -62.52 -62.525 -62.53 -62.535 -62.54 -62.545 -62.55 -62.555 -62.56 -62.565 -62.57 -62.575 -62.58 -62.585 -62.59 -62.595 -62.6 -62.605 -62.61 -62.615 -62.62 -62.625 -62.63 -62.635 -62.64 -62.645 -62.65 -62.655 -62.66 -62.665 -62.67 -62.675 -62.68 -62.685 -62.69 -62.695 -62.7 -62.705 -62.71 -62.715 -62.72 -62.725 -62.73 -62.735 -62.74 -62.745 -62.75 -62.755 -62.76 -62.765 -62.77 -62.775 -62.78 -62.785 -62.79 -62.795 -62.8 -62.805 -62.81 -62.815 -62.82 -62.825 -62.83 -62.835 -62.84 -62.845 -62.85 -62.855 -62.86 -62.865 -62.87 -62.875 -62.88 -62.885 -62.89 -62.895 -62.9 -62.905 -62.91 -62.915 -62.92 -62.925 -62.93 -62.935 -62.94 -62.945 -62.95 -62.955 -62.96 -62.965 -62.97 -62.975 -62.98 -62.985 -62.99 -62.995 -63 -63.005 -63.01 -63.015 -63.02 -63.025 -63.03 -63.035 -63.04 -63.045 -63.05 -63.055 -63.06 -63.065 -63.07 -63.075 -63.08 -63.085 -63.09 -63.095 -63.1 -63.105 -63.11 -63.115 -63.12 -63.125 -63.13 -63.135 -63.14 -63.145 -63.15 -63.155 -63.16 -63.165 -63.17 -63.175 -63.18 -63.185 -63.19 -63.195 -63.2 -63.205 -63.21 -63.215 -63.22 -63.225 -63.23 -63.235 -63.24 -63.245 -63.25 -63.255 -63.26 -63.265 -63.27 -63.275 -63.28 -63.285 -63.29 -63.295 -63.3 -63.305 -63.31 -63.315 -63.32 -63.325 -63.33 -63.335 -63.34 -63.345 -63.35 -63.355 -63.36 -63.365 -63.37 -63.375 -63.38 -63.385 -63.39 -63.395 -63.4 -63.405 -63.41 -63.415 -63.42 -63.425 -63.43 -63.435 -63.44 -63.445 -63.45 -63.455 -63.46 -63.465 -63.47 -63.475 -63.48 -63.485 -63.49 -63.495 -63.5 -63.505 -63.51 -63.515 -63.52 -63.525 -63.53 -63.535 -63.54 -63.545 -63.55 -63.555 -63.56 -63.565 -63.57 -63.575 -63.58 -63.585 -63.59 -63.595 -63.6 -63.605 -63.61 -63.615 -63.62 -63.625 -63.63 -63.635 -63.64 -63.645 -63.65 -63.655 -63.66 -63.665 -63.67 -63.675 -63.68 -63.685 -63.69 -63.695 -63.7 -63.705 -63.71 -63.715 -63.72 -63.725 -63.73 -63.735 -63.74 -63.745 -63.75 -63.755 -63.76 -63.765 -63.77 -63.775 -63.78 -63.785 -63.79 -63.795 -63.8 -63.805 -63.81 -63.815 -63.82 -63.825 -63.83 -63.835 -63.84 -63.845 -63.85 -63.855 -63.86 -63.865 -63.87 -63.875 -63.88 -63.885 -63.89 -63.895 -63.9 -63.905 -63.91 -63.915 -63.92 -63.925 -63.93 -63.935 -63.94 -63.945 -63.95 -63.955 -63.96 -63.965 -63.97 -63.975 -63.98 -63.985 -63.99 -63.995 -64 -64.005 -64.01 -64.015 -64.02 -64.025 -64.03 -64.035 -64.04 -64.045 -64.05 -64.055 -64.06 -64.065 -64.07 -64.075 -64.08 -64.085 -64.09 -64.095 -64.1 -64.105 -64.11 -64.115 -64.12 -64.125 -64.13 -64.135 -64.14 -64.145 -64.15 -64.155 -64.16 -64.165 -64.17 -64.175 -64.18 -64.185 -64.19 -64.195 -64.2 -64.205 -64.21 -64.215 -64.22 -64.225 -64.23 -64.235 -64.24 -64.245 -64.25 -64.255 -64.26 -64.265 -64.27 -64.275 -64.28 -64.285 -64.29 -64.295 -64.3 -64.305 -64.31 -64.315 -64.32 -64.325 -64.33 -64.335 -64.34 -64.345 -64.35 -64.355 -64.36 -64.365 -64.37 -64.375 -64.38 -64.385 -64.39 -64.395 -64.4 -64.405 -64.41 -64.415 -64.42 -64.425 -64.43 -64.435 -64.44 -64.445 -64.45 -64.455 -64.46 -64.465 -64.47 -64.475 -64.48 -64.485 -64.49 -64.495 -64.5 -64.505 -64.51 -64.515 -64.52 -64.525 -64.53 -64.535 -64.54 -64.545 -64.55 -64.555 -64.56 -64.565 -64.57 -64.575 -64.58 -64.585 -64.59 -64.595 -64.6 -64.605 -64.61 -64.615 -64.62 -64.625 -64.63 -64.635 -64.64 -64.645 -64.65 -64.655 -64.66 -64.665 -64.67 -64.675 -64.68 -64.685 -64.69 -64.695 -64.7 -64.705 -64.71 -64.715 -64.72 -64.725 -64.73 -64.735 -64.74 -64.745 -64.75 -64.755 -64.76 -64.765 -64.77 -64.775 -64.78 -64.785 -64.79 -64.795 -64.8 -64.805 -64.81 -64.815 -64.82 -64.825 -64.83 -64.835 -64.84 -64.845 -64.85 -64.855 -64.86 -64.865 -64.87 -64.875 -64.88 -64.885 -64.89 -64.895 -64.9 -64.905 -64.91 -64.915 -64.92 -64.925 -64.93 -64.935 -64.94 -64.945 -64.95 -64.955 -64.96 -64.965 -64.97 -64.975 -64.98 -64.985 -64.99 -64.995 -65 -65.005 -65.01 -65.015 -65.02 -65.025 -65.03 -65.035 -65.04 -65.045 -65.05 -65.055 -65.06 -65.065 -65.07 -65.075 -65.08 -65.085 -65.09 -65.095 -65.1 -65.105 -65.11 -65.115 -65.12 -65.125 -65.13 -65.135 -65.14 -65.145 -65.15 -65.155 -65.16 -65.165 -65.17 -65.175 -65.18 -65.185 -65.19 -65.195 -65.2 -65.205 -65.21 -65.215 -65.22 -65.225 -65.23 -65.235 -65.24 -65.245 -65.25 -65.255 -65.26 -65.265 -65.27 -65.275 -65.28 -65.285 -65.29 -65.295 -65.3 -65.305 -65.31 -65.315 -65.32 -65.325 -65.33 -65.335 -65.34 -65.345 -65.35 -65.355 -65.36 -65.365 -65.37 -65.375 -65.38 -65.385 -65.39 -65.395 -65.4 -65.405 -65.41 -65.415 -65.42 -65.425 -65.43 -65.435 -65.44 -65.445 -65.45 -65.455 -65.46 -65.465 -65.47 -65.475 -65.48 -65.485 -65.49 -65.495 -65.5 -65.505 -65.51 -65.515 -65.52 -65.525 -65.53 -65.535 -65.54 -65.545 -65.55 -65.555 -65.56 -65.565 -65.57 -65.575 -65.58 -65.585 -65.59 -65.595 -65.6 -65.605 -65.61 -65.615 -65.62 -65.625 -65.63 -65.635 -65.64 -65.645 -65.65 -65.655 -65.66 -65.665 -65.67 -65.675 -65.68 -65.685 -65.69 -65.695 -65.7 -65.705 -65.71 -65.715 -65.72 -65.725 -65.73 -65.735 -65.74 -65.745 -65.75 -65.755 -65.76 -65.765 -65.77 -65.775 -65.78 -65.785 -65.79 -65.795 -65.8 -65.805 -65.81 -65.815 -65.82 -65.825 -65.83 -65.835 -65.84 -65.845 -65.85 -65.855 -65.86 -65.865 -65.87 -65.875 -65.88 -65.885 -65.89 -65.895 -65.9 -65.905 -65.91 -65.915 -65.92 -65.925 -65.93 -65.935 -65.94 -65.945 -65.95 -65.955 -65.96 -65.965 -65.97 -65.975 -65.98 -65.985 -65.99 -65.995 -66 -66.005 -66.01 -66.015 -66.02 -66.025 -66.03 -66.035 -66.04 -66.045 -66.05 -66.055 -66.06 -66.065 -66.07 -66.075 -66.08 -66.085 -66.09 -66.095 -66.1 -66.105 -66.11 -66.115 -66.12 -66.125 -66.13 -66.135 -66.14 -66.145 -66.15 -66.155 -66.16 -66.165 -66.17 -66.175 -66.18 -66.185 -66.19 -66.195 -66.2 -66.205 -66.21 -66.215 -66.22 -66.225 -66.23 -66.235 -66.24 -66.245 -66.25 -66.255 -66.26 -66.265 -66.27 -66.275 -66.28 -66.285 -66.29 -66.295 -66.3 -66.305 -66.31 -66.315 -66.32 -66.325 -66.33 -66.335 -66.34 -66.345 -66.35 -66.355 -66.36 -66.365 -66.37 -66.375 -66.38 -66.385 -66.39 -66.395 -66.4 -66.405 -66.41 -66.415 -66.42 -66.425 -66.43 -66.435 -66.44 -66.445 -66.45 -66.455 -66.46 -66.465 -66.47 -66.475 -66.48 -66.485 -66.49 -66.495 -66.5 -66.505 -66.51 -66.515 -66.52 -66.525 -66.53 -66.535 -66.54 -66.545 -66.55 -66.555 -66.56 -66.565 -66.57 -66.575 -66.58 -66.585 -66.59 -66.595 -66.6 -66.605 -66.61 -66.615 -66.62 -66.625 -66.63 -66.635 -66.64 -66.645 -66.65 -66.655 -66.66 -66.665 -66.67 -66.675 -66.68 -66.685 -66.69 -66.695 -66.7 -66.705 -66.71 -66.715 -66.72 -66.725 -66.73 -66.735 -66.74 -66.745 -66.75 -66.755 -66.76 -66.765 -66.77 -66.775 -66.78 -66.785 -66.79 -66.795 -66.8 -66.805 -66.81 -66.815 -66.82 -66.825 -66.83 -66.835 -66.84 -66.845 -66.85 -66.855 -66.86 -66.865 -66.87 -66.875 -66.88 -66.885 -66.89 -66.895 -66.9 -66.905 -66.91 -66.915 -66.92 -66.925 -66.93 -66.935 -66.94 -66.945 -66.95 -66.955 -66.96 -66.965 -66.97 -66.975 -66.98 -66.985 -66.99 -66.995 -67 -67.005 -67.01 -67.015 -67.02 -67.025 -67.03 -67.035 -67.04 -67.045 -67.05 -67.055 -67.06 -67.065 -67.07 -67.075 -67.08 -67.085 -67.09 -67.095 -67.1 -67.105 -67.11 -67.115 -67.12 -67.125 -67.13 -67.135 -67.14 -67.145 -67.15 -67.155 -67.16 -67.165 -67.17 -67.175 -67.18 -67.185 -67.19 -67.195 -67.2 -67.205 -67.21 -67.215 -67.22 -67.225 -67.23 -67.235 -67.24 -67.245 -67.25 -67.255 -67.26 -67.265 -67.27 -67.275 -67.28 -67.285 -67.29 -67.295 -67.3 -67.305 -67.31 -67.315 -67.32 -67.325 -67.33 -67.335 -67.34 -67.345 -67.35 -67.355 -67.36 -67.365 -67.37 -67.375 -67.38 -67.385 -67.39 -67.395 -67.4 -67.405 -67.41 -67.415 -67.42 -67.425 -67.43 -67.435 -67.44 -67.445 -67.45 -67.455 -67.46 -67.465 -67.47 -67.475 -67.48 -67.485 -67.49 -67.495 -67.5 -67.505 -67.51 -67.515 -67.52 -67.525 -67.53 -67.535 -67.54 -67.545 -67.55 -67.555 -67.56 -67.565 -67.57 -67.575 -67.58 -67.585 -67.59 -67.595 -67.6 -67.605 -67.61 -67.615 -67.62 -67.625 -67.63 -67.635 -67.64 -67.645 -67.65 -67.655 -67.66 -67.665 -67.67 -67.675 -67.68 -67.685 -67.69 -67.695 -67.7 -67.705 -67.71 -67.715 -67.72 -67.725 -67.73 -67.735 -67.74 -67.745 -67.75 -67.755 -67.76 -67.765 -67.77 -67.775 -67.78 -67.785 -67.79 -67.795 -67.8 -67.805 -67.81 -67.815 -67.82 -67.825 -67.83 -67.835 -67.84 -67.845 -67.85 -67.855 -67.86 -67.865 -67.87 -67.875 -67.88 -67.885 -67.89 -67.895 -67.9 -67.905 -67.91 -67.915 -67.92 -67.925 -67.93 -67.935 -67.94 -67.945 -67.95 -67.955 -67.96 -67.965 -67.97 -67.975 -67.98 -67.985 -67.99 -67.995 -68 -68.005 -68.01 -68.015 -68.02 -68.025 -68.03 -68.035 -68.04 -68.045 -68.05 -68.055 -68.06 -68.065 -68.07 -68.075 -68.08 -68.085 -68.09 -68.095 -68.1 -68.105 -68.11 -68.115 -68.12 -68.125 -68.13 -68.135 -68.14 -68.145 -68.15 -68.155 -68.16 -68.165 -68.17 -68.175 -68.18 -68.185 -68.19 -68.195 -68.2 -68.205 -68.21 -68.215 -68.22 -68.225 -68.23 -68.235 -68.24 -68.245 -68.25 -68.255 -68.26 -68.265 -68.27 -68.275 -68.28 -68.285 -68.29 -68.295 -68.3 -68.305 -68.31 -68.315 -68.32 -68.325 -68.33 -68.335 -68.34 -68.345 -68.35 -68.355 -68.36 -68.365 -68.37 -68.375 -68.38 -68.385 -68.39 -68.395 -68.4 -68.405 -68.41 -68.415 -68.42 -68.425 -68.43 -68.435 -68.44 -68.445 -68.45 -68.455 -68.46 -68.465 -68.47 -68.475 -68.48 -68.485 -68.49 -68.495 -68.5 -68.505 -68.51 -68.515 -68.52 -68.525 -68.53 -68.535 -68.54 -68.545 -68.55 -68.555 -68.56 -68.565 -68.57 -68.575 -68.58 -68.585 -68.59 -68.595 -68.6 -68.605 -68.61 -68.615 -68.62 -68.625 -68.63 -68.635 -68.64 -68.645 -68.65 -68.655 -68.66 -68.665 -68.67 -68.675 -68.68 -68.685 -68.69 -68.695 -68.7 -68.705 -68.71 -68.715 -68.72 -68.725 -68.73 -68.735 -68.74 -68.745 -68.75 -68.755 -68.76 -68.765 -68.77 -68.775 -68.78 -68.785 -68.79 -68.795 -68.8 -68.805 -68.81 -68.815 -68.82 -68.825 -68.83 -68.835 -68.84 -68.845 -68.85 -68.855 -68.86 -68.865 -68.87 -68.875 -68.88 -68.885 -68.89 -68.895 -68.9 -68.905 -68.91 -68.915 -68.92 -68.925 -68.93 -68.935 -68.94 -68.945 -68.95 -68.955 -68.96 -68.965 -68.97 -68.975 -68.98 -68.985 -68.99 -68.995 -69 -69.005 -69.01 -69.015 -69.02 -69.025 -69.03 -69.035 -69.04 -69.045 -69.05 -69.055 -69.06 -69.065 -69.07 -69.075 -69.08 -69.085 -69.09 -69.095 -69.1 -69.105 -69.11 -69.115 -69.12 -69.125 -69.13 -69.135 -69.14 -69.145 -69.15 -69.155 -69.16 -69.165 -69.17 -69.175 -69.18 -69.185 -69.19 -69.195 -69.2 -69.205 -69.21 -69.215 -69.22 -69.225 -69.23 -69.235 -69.24 -69.245 -69.25 -69.255 -69.26 -69.265 -69.27 -69.275 -69.28 -69.285 -69.29 -69.295 -69.3 -69.305 -69.31 -69.315 -69.32 -69.325 -69.33 -69.335 -69.34 -69.345 -69.35 -69.355 -69.36 -69.365 -69.37 -69.375 -69.38 -69.385 -69.39 -69.395 -69.4 -69.405 -69.41 -69.415 -69.42 -69.425 -69.43 -69.435 -69.44 -69.445 -69.45 -69.455 -69.46 -69.465 -69.47 -69.475 -69.48 -69.485 -69.49 -69.495 -69.5 -69.505 -69.51 -69.515 -69.52 -69.525 -69.53 -69.535 -69.54 -69.545 -69.55 -69.555 -69.56 -69.565 -69.57 -69.575 -69.58 -69.585 -69.59 -69.595 -69.6 -69.605 -69.61 -69.615 -69.62 -69.625 -69.63 -69.635 -69.64 -69.645 -69.65 -69.655 -69.66 -69.665 -69.67 -69.675 -69.68 -69.685 -69.69 -69.695 -69.7 -69.705 -69.71 -69.715 -69.72 -69.725 -69.73 -69.735 -69.74 -69.745 -69.75 -69.755 -69.76 -69.765 -69.77 -69.775 -69.78 -69.785 -69.79 -69.795 -69.8 -69.805 -69.81 -69.815 -69.82 -69.825 -69.83 -69.835 -69.84 -69.845 -69.85 -69.855 -69.86 -69.865 -69.87 -69.875 -69.88 -69.885 -69.89 -69.895 -69.9 -69.905 -69.91 -69.915 -69.92 -69.925 -69.93 -69.935 -69.94 -69.945 -69.95 -69.955 -69.96 -69.965 -69.97 -69.975 -69.98 -69.985 -69.99 -69.995 -70 -70.005 -70.01 -70.015 -70.02 -70.025 -70.03 -70.035 -70.04 -70.045 -70.05 -70.055 -70.06 -70.065 -70.07 -70.075 -70.08 -70.085 -70.09 -70.095 -70.1 -70.105 -70.11 -70.115 -70.12 -70.125 -70.13 -70.135 -70.14 -70.145 -70.15 -70.155 -70.16 -70.165 -70.17 -70.175 -70.18 -70.185 -70.19 -70.195 -70.2 -70.205 -70.21 -70.215 -70.22 -70.225 -70.23 -70.235 -70.24 -70.245 -70.25 -70.255 -70.26 -70.265 -70.27 -70.275 -70.28 -70.285 -70.29 -70.295 -70.3 -70.305 -70.31 -70.315 -70.32 -70.325 -70.33 -70.335 -70.34 -70.345 -70.35 -70.355 -70.36 -70.365 -70.37 -70.375 -70.38 -70.385 -70.39 -70.395 -70.4 -70.405 -70.41 -70.415 -70.42 -70.425 -70.43 -70.435 -70.44 -70.445 -70.45 -70.455 -70.46 -70.465 -70.47 -70.475 -70.48 -70.485 -70.49 -70.495 -70.5 -70.505 -70.51 -70.515 -70.52 -70.525 -70.53 -70.535 -70.54 -70.545 -70.55 -70.555 -70.56 -70.565 -70.57 -70.575 -70.58 -70.585 -70.59 -70.595 -70.6 -70.605 -70.61 -70.615 -70.62 -70.625 -70.63 -70.635 -70.64 -70.645 -70.65 -70.655 -70.66 -70.665 -70.67 -70.675 -70.68 -70.685 -70.69 -70.695 -70.7 -70.705 -70.71 -70.715 -70.72 -70.725 -70.73 -70.735 -70.74 -70.745 -70.75 -70.755 -70.76 -70.765 -70.77 -70.775 -70.78 -70.785 -70.79 -70.795 -70.8 -70.805 -70.81 -70.815 -70.82 -70.825 -70.83 -70.835 -70.84 -70.845 -70.85 -70.855 -70.86 -70.865 -70.87 -70.875 -70.88 -70.885 -70.89 -70.895 -70.9 -70.905 -70.91 -70.915 -70.92 -70.925 -70.93 -70.935 -70.94 -70.945 -70.95 -70.955 -70.96 -70.965 -70.97 -70.975 -70.98 -70.985 -70.99 -70.995 -71 -71.005 -71.01 -71.015 -71.02 -71.025 -71.03 -71.035 -71.04 -71.045 -71.05 -71.055 -71.06 -71.065 -71.07 -71.075 -71.08 -71.085 -71.09 -71.095 -71.1 -71.105 -71.11 -71.115 -71.12 -71.125 -71.13 -71.135 -71.14 -71.145 -71.15 -71.155 -71.16 -71.165 -71.17 -71.175 -71.18 -71.185 -71.19 -71.195 -71.2 -71.205 -71.21 -71.215 -71.22 -71.225 -71.23 -71.235 -71.24 -71.245 -71.25 -71.255 -71.26 -71.265 -71.27 -71.275 -71.28 -71.285 -71.29 -71.295 -71.3 -71.305 -71.31 -71.315 -71.32 -71.325 -71.33 -71.335 -71.34 -71.345 -71.35 -71.355 -71.36 -71.365 -71.37 -71.375 -71.38 -71.385 -71.39 -71.395 -71.4 -71.405 -71.41 -71.415 -71.42 -71.425 -71.43 -71.435 -71.44 -71.445 -71.45 -71.455 -71.46 -71.465 -71.47 -71.475 -71.48 -71.485 -71.49 -71.495 -71.5 -71.505 -71.51 -71.515 -71.52 -71.525 -71.53 -71.535 -71.54 -71.545 -71.55 -71.555 -71.56 -71.565 -71.57 -71.575 -71.58 -71.585 -71.59 -71.595 -71.6 -71.605 -71.61 -71.615 -71.62 -71.625 -71.63 -71.635 -71.64 -71.645 -71.65 -71.655 -71.66 -71.665 -71.67 -71.675 -71.68 -71.685 -71.69 -71.695 -71.7 -71.705 -71.71 -71.715 -71.72 -71.725 -71.73 -71.735 -71.74 -71.745 -71.75 -71.755 -71.76 -71.765 -71.77 -71.775 -71.78 -71.785 -71.79 -71.795 -71.8 -71.805 -71.81 -71.815 -71.82 -71.825 -71.83 -71.835 -71.84 -71.845 -71.85 -71.855 -71.86 -71.865 -71.87 -71.875 -71.88 -71.885 -71.89 -71.895 -71.9 -71.905 -71.91 -71.915 -71.92 -71.925 -71.93 -71.935 -71.94 -71.945 -71.95 -71.955 -71.96 -71.965 -71.97 -71.975 -71.98 -71.985 -71.99 -71.995 -72 -72.005 -72.01 -72.015 -72.02 -72.025 -72.03 -72.035 -72.04 -72.045 -72.05 -72.055 -72.06 -72.065 -72.07 -72.075 -72.08 -72.085 -72.09 -72.095 -72.1 -72.105 -72.11 -72.115 -72.12 -72.125 -72.13 -72.135 -72.14 -72.145 -72.15 -72.155 -72.16 -72.165 -72.17 -72.175 -72.18 -72.185 -72.19 -72.195 -72.2 -72.205 -72.21 -72.215 -72.22 -72.225 -72.23 -72.235 -72.24 -72.245 -72.25 -72.255 -72.26 -72.265 -72.27 -72.275 -72.28 -72.285 -72.29 -72.295 -72.3 -72.305 -72.31 -72.315 -72.32 -72.325 -72.33 -72.335 -72.34 -72.345 -72.35 -72.355 -72.36 -72.365 -72.37 -72.375 -72.38 -72.385 -72.39 -72.395 -72.4 -72.405 -72.41 -72.415 -72.42 -72.425 -72.43 -72.435 -72.44 -72.445 -72.45 -72.455 -72.46 -72.465 -72.47 -72.475 -72.48 -72.485 -72.49 -72.495 -72.5 -72.505 -72.51 -72.515 -72.52 -72.525 -72.53 -72.535 -72.54 -72.545 -72.55 -72.555 -72.56 -72.565 -72.57 -72.575 -72.58 -72.585 -72.59 -72.595 -72.6 -72.605 -72.61 -72.615 -72.62 -72.625 -72.63 -72.635 -72.64 -72.645 -72.65 -72.655 -72.66 -72.665 -72.67 -72.675 -72.68 -72.685 -72.69 -72.695 -72.7 -72.705 -72.71 -72.715 -72.72 -72.725 -72.73 -72.735 -72.74 -72.745 -72.75 -72.755 -72.76 -72.765 -72.77 -72.775 -72.78 -72.785 -72.79 -72.795 -72.8 -72.805 -72.81 -72.815 -72.82 -72.825 -72.83 -72.835 -72.84 -72.845 -72.85 -72.855 -72.86 -72.865 -72.87 -72.875 -72.88 -72.885 -72.89 -72.895 -72.9 -72.905 -72.91 -72.915 -72.92 -72.925 -72.93 -72.935 -72.94 -72.945 -72.95 -72.955 -72.96 -72.965 -72.97 -72.975 -72.98 -72.985 -72.99 -72.995 -73 -73.005 -73.01 -73.015 -73.02 -73.025 -73.03 -73.035 -73.04 -73.045 -73.05 -73.055 -73.06 -73.065 -73.07 -73.075 -73.08 -73.085 -73.09 -73.095 -73.1 -73.105 -73.11 -73.115 -73.12 -73.125 -73.13 -73.135 -73.14 -73.145 -73.15 -73.155 -73.16 -73.165 -73.17 -73.175 -73.18 -73.185 -73.19 -73.195 -73.2 -73.205 -73.21 -73.215 -73.22 -73.225 -73.23 -73.235 -73.24 -73.245 -73.25 -73.255 -73.26 -73.265 -73.27 -73.275 -73.28 -73.285 -73.29 -73.295 -73.3 -73.305 -73.31 -73.315 -73.32 -73.325 -73.33 -73.335 -73.34 -73.345 -73.35 -73.355 -73.36 -73.365 -73.37 -73.375 -73.38 -73.385 -73.39 -73.395 -73.4 -73.405 -73.41 -73.415 -73.42 -73.425 -73.43 -73.435 -73.44 -73.445 -73.45 -73.455 -73.46 -73.465 -73.47 -73.475 -73.48 -73.485 -73.49 -73.495 -73.5 -73.505 -73.51 -73.515 -73.52 -73.525 -73.53 -73.535 -73.54 -73.545 -73.55 -73.555 -73.56 -73.565 -73.57 -73.575 -73.58 -73.585 -73.59 -73.595 -73.6 -73.605 -73.61 -73.615 -73.62 -73.625 -73.63 -73.635 -73.64 -73.645 -73.65 -73.655 -73.66 -73.665 -73.67 -73.675 -73.68 -73.685 -73.69 -73.695 -73.7 -73.705 -73.71 -73.715 -73.72 -73.725 -73.73 -73.735 -73.74 -73.745 -73.75 -73.755 -73.76 -73.765 -73.77 -73.775 -73.78 -73.785 -73.79 -73.795 -73.8 -73.805 -73.81 -73.815 -73.82 -73.825 -73.83 -73.835 -73.84 -73.845 -73.85 -73.855 -73.86 -73.865 -73.87 -73.875 -73.88 -73.885 -73.89 -73.895 -73.9 -73.905 -73.91 -73.915 -73.92 -73.925 -73.93 -73.935 -73.94 -73.945 -73.95 -73.955 -73.96 -73.965 -73.97 -73.975 -73.98 -73.985 -73.99 -73.995 -74 -74.005 -74.01 -74.015 -74.02 -74.025 -74.03 -74.035 -74.04 -74.045 -74.05 -74.055 -74.06 -74.065 -74.07 -74.075 -74.08 -74.085 -74.09 -74.095 -74.1 -74.105 -74.11 -74.115 -74.12 -74.125 -74.13 -74.135 -74.14 -74.145 -74.15 -74.155 -74.16 -74.165 -74.17 -74.175 -74.18 -74.185 -74.19 -74.195 -74.2 -74.205 -74.21 -74.215 -74.22 -74.225 -74.23 -74.235 -74.24 -74.245 -74.25 -74.255 -74.26 -74.265 -74.27 -74.275 -74.28 -74.285 -74.29 -74.295 -74.3 -74.305 -74.31 -74.315 -74.32 -74.325 -74.33 -74.335 -74.34 -74.345 -74.35 -74.355 -74.36 -74.365 -74.37 -74.375 -74.38 -74.385 -74.39 -74.395 -74.4 -74.405 -74.41 -74.415 -74.42 -74.425 -74.43 -74.435 -74.44 -74.445 -74.45 -74.455 -74.46 -74.465 -74.47 -74.475 -74.48 -74.485 -74.49 -74.495 -74.5 -74.505 -74.51 -74.515 -74.52 -74.525 -74.53 -74.535 -74.54 -74.545 -74.55 -74.555 -74.56 -74.565 -74.57 -74.575 -74.58 -74.585 -74.59 -74.595 -74.6 -74.605 -74.61 -74.615 -74.62 -74.625 -74.63 -74.635 -74.64 -74.645 -74.65 -74.655 -74.66 -74.665 -74.67 -74.675 -74.68 -74.685 -74.69 -74.695 -74.7 -74.705 -74.71 -74.715 -74.72 -74.725 -74.73 -74.735 -74.74 -74.745 -74.75 -74.755 -74.76 -74.765 -74.77 -74.775 -74.78 -74.785 -74.79 -74.795 -74.8 -74.805 -74.81 -74.815 -74.82 -74.825 -74.83 -74.835 -74.84 -74.845 -74.85 -74.855 -74.86 -74.865 -74.87 -74.875 -74.88 -74.885 -74.89 -74.895 -74.9 -74.905 -74.91 -74.915 -74.92 -74.925 -74.93 -74.935 -74.94 -74.945 -74.95 -74.955 -74.96 -74.965 -74.97 -74.975 -74.98 -74.985 -74.99 -74.995 -75 -75.005 -75.01 -75.015 -75.02 -75.025 -75.03 -75.035 -75.04 -75.045 -75.05 -75.055 -75.06 -75.065 -75.07 -75.075 -75.08 -75.085 -75.09 -75.095 -75.1 -75.105 -75.11 -75.115 -75.12 -75.125 -75.13 -75.135 -75.14 -75.145 -75.15 -75.155 -75.16 -75.165 -75.17 -75.175 -75.18 -75.185 -75.19 -75.195 -75.2 -75.205 -75.21 -75.215 -75.22 -75.225 -75.23 -75.235 -75.24 -75.245 -75.25 -75.255 -75.26 -75.265 -75.27 -75.275 -75.28 -75.285 -75.29 -75.295 -75.3 -75.305 -75.31 -75.315 -75.32 -75.325 -75.33 -75.335 -75.34 -75.345 -75.35 -75.355 -75.36 -75.365 -75.37 -75.375 -75.38 -75.385 -75.39 -75.395 -75.4 -75.405 -75.41 -75.415 -75.42 -75.425 -75.43 -75.435 -75.44 -75.445 -75.45 -75.455 -75.46 -75.465 -75.47 -75.475 -75.48 -75.485 -75.49 -75.495 -75.5 -75.505 -75.51 -75.515 -75.52 -75.525 -75.53 -75.535 -75.54 -75.545 -75.55 -75.555 -75.56 -75.565 -75.57 -75.575 -75.58 -75.585 -75.59 -75.595 -75.6 -75.605 -75.61 -75.615 -75.62 -75.625 -75.63 -75.635 -75.64 -75.645 -75.65 -75.655 -75.66 -75.665 -75.67 -75.675 -75.68 -75.685 -75.69 -75.695 -75.7 -75.705 -75.71 -75.715 -75.72 -75.725 -75.73 -75.735 -75.74 -75.745 -75.75 -75.755 -75.76 -75.765 -75.77 -75.775 -75.78 -75.785 -75.79 -75.795 -75.8 -75.805 -75.81 -75.815 -75.82 -75.825 -75.83 -75.835 -75.84 -75.845 -75.85 -75.855 -75.86 -75.865 -75.87 -75.875 -75.88 -75.885 -75.89 -75.895 -75.9 -75.905 -75.91 -75.915 -75.92 -75.925 -75.93 -75.935 -75.94 -75.945 -75.95 -75.955 -75.96 -75.965 -75.97 -75.975 -75.98 -75.985 -75.99 -75.995 -76 -76.005 -76.01 -76.015 -76.02 -76.025 -76.03 -76.035 -76.04 -76.045 -76.05 -76.055 -76.06 -76.065 -76.07 -76.075 -76.08 -76.085 -76.09 -76.095 -76.1 -76.105 -76.11 -76.115 -76.12 -76.125 -76.13 -76.135 -76.14 -76.145 -76.15 -76.155 -76.16 -76.165 -76.17 -76.175 -76.18 -76.185 -76.19 -76.195 -76.2 -76.205 -76.21 -76.215 -76.22 -76.225 -76.23 -76.235 -76.24 -76.245 -76.25 -76.255 -76.26 -76.265 -76.27 -76.275 -76.28 -76.285 -76.29 -76.295 -76.3 -76.305 -76.31 -76.315 -76.32 -76.325 -76.33 -76.335 -76.34 -76.345 -76.35 -76.355 -76.36 -76.365 -76.37 -76.375 -76.38 -76.385 -76.39 -76.395 -76.4 -76.405 -76.41 -76.415 -76.42 -76.425 -76.43 -76.435 -76.44 -76.445 -76.45 -76.455 -76.46 -76.465 -76.47 -76.475 -76.48 -76.485 -76.49 -76.495 -76.5 -76.505 -76.51 -76.515 -76.52 -76.525 -76.53 -76.535 -76.54 -76.545 -76.55 -76.555 -76.56 -76.565 -76.57 -76.575 -76.58 -76.585 -76.59 -76.595 -76.6 -76.605 -76.61 -76.615 -76.62 -76.625 -76.63 -76.635 -76.64 -76.645 -76.65 -76.655 -76.66 -76.665 -76.67 -76.675 -76.68 -76.685 -76.69 -76.695 -76.7 -76.705 -76.71 -76.715 -76.72 -76.725 -76.73 -76.735 -76.74 -76.745 -76.75 -76.755 -76.76 -76.765 -76.77 -76.775 -76.78 -76.785 -76.79 -76.795 -76.8 -76.805 -76.81 -76.815 -76.82 -76.825 -76.83 -76.835 -76.84 -76.845 -76.85 -76.855 -76.86 -76.865 -76.87 -76.875 -76.88 -76.885 -76.89 -76.895 -76.9 -76.905 -76.91 -76.915 -76.92 -76.925 -76.93 -76.935 -76.94 -76.945 -76.95 -76.955 -76.96 -76.965 -76.97 -76.975 -76.98 -76.985 -76.99 -76.995 -77 -77.005 -77.01 -77.015 -77.02 -77.025 -77.03 -77.035 -77.04 -77.045 -77.05 -77.055 -77.06 -77.065 -77.07 -77.075 -77.08 -77.085 -77.09 -77.095 -77.1 -77.105 -77.11 -77.115 -77.12 -77.125 -77.13 -77.135 -77.14 -77.145 -77.15 -77.155 -77.16 -77.165 -77.17 -77.175 -77.18 -77.185 -77.19 -77.195 -77.2 -77.205 -77.21 -77.215 -77.22 -77.225 -77.23 -77.235 -77.24 -77.245 -77.25 -77.255 -77.26 -77.265 -77.27 -77.275 -77.28 -77.285 -77.29 -77.295 -77.3 -77.305 -77.31 -77.315 -77.32 -77.325 -77.33 -77.335 -77.34 -77.345 -77.35 -77.355 -77.36 -77.365 -77.37 -77.375 -77.38 -77.385 -77.39 -77.395 -77.4 -77.405 -77.41 -77.415 -77.42 -77.425 -77.43 -77.435 -77.44 -77.445 -77.45 -77.455 -77.46 -77.465 -77.47 -77.475 -77.48 -77.485 -77.49 -77.495 -77.5 -77.505 -77.51 -77.515 -77.52 -77.525 -77.53 -77.535 -77.54 -77.545 -77.55 -77.555 -77.56 -77.565 -77.57 -77.575 -77.58 -77.585 -77.59 -77.595 -77.6 -77.605 -77.61 -77.615 -77.62 -77.625 -77.63 -77.635 -77.64 -77.645 -77.65 -77.655 -77.66 -77.665 -77.67 -77.675 -77.68 -77.685 -77.69 -77.695 -77.7 -77.705 -77.71 -77.715 -77.72 -77.725 -77.73 -77.735 -77.74 -77.745 -77.75 -77.755 -77.76 -77.765 -77.77 -77.775 -77.78 -77.785 -77.79 -77.795 -77.8 -77.805 -77.81 -77.815 -77.82 -77.825 -77.83 -77.835 -77.84 -77.845 -77.85 -77.855 -77.86 -77.865 -77.87 -77.875 -77.88 -77.885 -77.89 -77.895 -77.9 -77.905 -77.91 -77.915 -77.92 -77.925 -77.93 -77.935 -77.94 -77.945 -77.95 -77.955 -77.96 -77.965 -77.97 -77.975 -77.98 -77.985 -77.99 -77.995 -78 -78.005 -78.01 -78.015 -78.02 -78.025 -78.03 -78.035 -78.04 -78.045 -78.05 -78.055 -78.06 -78.065 -78.07 -78.075 -78.08 -78.085 -78.09 -78.095 -78.1 -78.105 -78.11 -78.115 -78.12 -78.125 -78.13 -78.135 -78.14 -78.145 -78.15 -78.155 -78.16 -78.165 -78.17 -78.175 -78.18 -78.185 -78.19 -78.195 -78.2 -78.205 -78.21 -78.215 -78.22 -78.225 -78.23 -78.235 -78.24 -78.245 -78.25 -78.255 -78.26 -78.265 -78.27 -78.275 -78.28 -78.285 -78.29 -78.295 -78.3 -78.305 -78.31 -78.315 -78.32 -78.325 -78.33 -78.335 -78.34 -78.345 -78.35 -78.355 -78.36 -78.365 -78.37 -78.375 -78.38 -78.385 -78.39 -78.395 -78.4 -78.405 -78.41 -78.415 -78.42 -78.425 -78.43 -78.435 -78.44 -78.445 -78.45 -78.455 -78.46 -78.465 -78.47 -78.475 -78.48 -78.485 -78.49 -78.495 -78.5 -78.505 -78.51 -78.515 -78.52 -78.525 -78.53 -78.535 -78.54 -78.545 -78.55 -78.555 -78.56 -78.565 -78.57 -78.575 -78.58 -78.585 -78.59 -78.595 -78.6 -78.605 -78.61 -78.615 -78.62 -78.625 -78.63 -78.635 -78.64 -78.645 -78.65 -78.655 -78.66 -78.665 -78.67 -78.675 -78.68 -78.685 -78.69 -78.695 -78.7 -78.705 -78.71 -78.715 -78.72 -78.725 -78.73 -78.735 -78.74 -78.745 -78.75 -78.755 -78.76 -78.765 -78.77 -78.775 -78.78 -78.785 -78.79 -78.795 -78.8 -78.805 -78.81 -78.815 -78.82 -78.825 -78.83 -78.835 -78.84 -78.845 -78.85 -78.855 -78.86 -78.865 -78.87 -78.875 -78.88 -78.885 -78.89 -78.895 -78.9 -78.905 -78.91 -78.915 -78.92 -78.925 -78.93 -78.935 -78.94 -78.945 -78.95 -78.955 -78.96 -78.965 -78.97 -78.975 -78.98 -78.985 -78.99 -78.995 -79 -79.005 -79.01 -79.015 -79.02 -79.025 -79.03 -79.035 -79.04 -79.045 -79.05 -79.055 -79.06 -79.065 -79.07 -79.075 -79.08 -79.085 -79.09 -79.095 -79.1 -79.105 -79.11 -79.115 -79.12 -79.125 -79.13 -79.135 -79.14 -79.145 -79.15 -79.155 -79.16 -79.165 -79.17 -79.175 -79.18 -79.185 -79.19 -79.195 -79.2 -79.205 -79.21 -79.215 -79.22 -79.225 -79.23 -79.235 -79.24 -79.245 -79.25 -79.255 -79.26 -79.265 -79.27 -79.275 -79.28 -79.285 -79.29 -79.295 -79.3 -79.305 -79.31 -79.315 -79.32 -79.325 -79.33 -79.335 -79.34 -79.345 -79.35 -79.355 -79.36 -79.365 -79.37 -79.375 -79.38 -79.385 -79.39 -79.395 -79.4 -79.405 -79.41 -79.415 -79.42 -79.425 -79.43 -79.435 -79.44 -79.445 -79.45 -79.455 -79.46 -79.465 -79.47 -79.475 -79.48 -79.485 -79.49 -79.495 -79.5 -79.505 -79.51 -79.515 -79.52 -79.525 -79.53 -79.535 -79.54 -79.545 -79.55 -79.555 -79.56 -79.565 -79.57 -79.575 -79.58 -79.585 -79.59 -79.595 -79.6 -79.605 -79.61 -79.615 -79.62 -79.625 -79.63 -79.635 -79.64 -79.645 -79.65 -79.655 -79.66 -79.665 -79.67 -79.675 -79.68 -79.685 -79.69 -79.695 -79.7 -79.705 -79.71 -79.715 -79.72 -79.725 -79.73 -79.735 -79.74 -79.745 -79.75 -79.755 -79.76 -79.765 -79.77 -79.775 -79.78 -79.785 -79.79 -79.795 -79.8 -79.805 -79.81 -79.815 -79.82 -79.825 -79.83 -79.835 -79.84 -79.845 -79.85 -79.855 -79.86 -79.865 -79.87 -79.875 -79.88 -79.885 -79.89 -79.895 -79.9 -79.905 -79.91 -79.915 -79.92 -79.925 -79.93 -79.935 -79.94 -79.945 -79.95 -79.955 -79.96 -79.965 -79.97 -79.975 -79.98 -79.985 -79.99 -79.995 -80 -80.005 -80.01 -80.015 -80.02 -80.025 -80.03 -80.035 -80.04 -80.045 -80.05 -80.055 -80.06 -80.065 -80.07 -80.075 -80.08 -80.085 -80.09 -80.095 -80.1 -80.105 -80.11 -80.115 -80.12 -80.125 -80.13 -80.135 -80.14 -80.145 -80.15 -80.155 -80.16 -80.165 -80.17 -80.175 -80.18 -80.185 -80.19 -80.195 -80.2 -80.205 -80.21 -80.215 -80.22 -80.225 -80.23 -80.235 -80.24 -80.245 -80.25 -80.255 -80.26 -80.265 -80.27 -80.275 -80.28 -80.285 -80.29 -80.295 -80.3 -80.305 -80.31 -80.315 -80.32 -80.325 -80.33 -80.335 -80.34 -80.345 -80.35 -80.355 -80.36 -80.365 -80.37 -80.375 -80.38 -80.385 -80.39 -80.395 -80.4 -80.405 -80.41 -80.415 -80.42 -80.425 -80.43 -80.435 -80.44 -80.445 -80.45 -80.455 -80.46 -80.465 -80.47 -80.475 -80.48 -80.485 -80.49 -80.495 -80.5 -80.505 -80.51 -80.515 -80.52 -80.525 -80.53 -80.535 -80.54 -80.545 -80.55 -80.555 -80.56 -80.565 -80.57 -80.575 -80.58 -80.585 -80.59 -80.595 -80.6 -80.605 -80.61 -80.615 -80.62 -80.625 -80.63 -80.635 -80.64 -80.645 -80.65 -80.655 -80.66 -80.665 -80.67 -80.675 -80.68 -80.685 -80.69 -80.695 -80.7 -80.705 -80.71 -80.715 -80.72 -80.725 -80.73 -80.735 -80.74 -80.745 -80.75 -80.755 -80.76 -80.765 -80.77 -80.775 -80.78 -80.785 -80.79 -80.795 -80.8 -80.805 -80.81 -80.815 -80.82 -80.825 -80.83 -80.835 -80.84 -80.845 -80.85 -80.855 -80.86 -80.865 -80.87 -80.875 -80.88 -80.885 -80.89 -80.895 -80.9 -80.905 -80.91 -80.915 -80.92 -80.925 -80.93 -80.935 -80.94 -80.945 -80.95 -80.955 -80.96 -80.965 -80.97 -80.975 -80.98 -80.985 -80.99 -80.995 -81 -81.005 -81.01 -81.015 -81.02 -81.025 -81.03 -81.035 -81.04 -81.045 -81.05 -81.055 -81.06 -81.065 -81.07 -81.075 -81.08 -81.085 -81.09 -81.095 -81.1 -81.105 -81.11 -81.115 -81.12 -81.125 -81.13 -81.135 -81.14 -81.145 -81.15 -81.155 -81.16 -81.165 -81.17 -81.175 -81.18 -81.185 -81.19 -81.195 -81.2 -81.205 -81.21 -81.215 -81.22 -81.225 -81.23 -81.235 -81.24 -81.245 -81.25 -81.255 -81.26 -81.265 -81.27 -81.275 -81.28 -81.285 -81.29 -81.295 -81.3 -81.305 -81.31 -81.315 -81.32 -81.325 -81.33 -81.335 -81.34 -81.345 -81.35 -81.355 -81.36 -81.365 -81.37 -81.375 -81.38 -81.385 -81.39 -81.395 -81.4 -81.405 -81.41 -81.415 -81.42 -81.425 -81.43 -81.435 -81.44 -81.445 -81.45 -81.455 -81.46 -81.465 -81.47 -81.475 -81.48 -81.485 -81.49 -81.495 -81.5 -81.505 -81.51 -81.515 -81.52 -81.525 -81.53 -81.535 -81.54 -81.545 -81.55 -81.555 -81.56 -81.565 -81.57 -81.575 -81.58 -81.585 -81.59 -81.595 -81.6 -81.605 -81.61 -81.615 -81.62 -81.625 -81.63 -81.635 -81.64 -81.645 -81.65 -81.655 -81.66 -81.665 -81.67 -81.675 -81.68 -81.685 -81.69 -81.695 -81.7 -81.705 -81.71 -81.715 -81.72 -81.725 -81.73 -81.735 -81.74 -81.745 -81.75 -81.755 -81.76 -81.765 -81.77 -81.775 -81.78 -81.785 -81.79 -81.795 -81.8 -81.805 -81.81 -81.815 -81.82 -81.825 -81.83 -81.835 -81.84 -81.845 -81.85 -81.855 -81.86 -81.865 -81.87 -81.875 -81.88 -81.885 -81.89 -81.895 -81.9 -81.905 -81.91 -81.915 -81.92 -81.925 -81.93 -81.935 -81.94 -81.945 -81.95 -81.955 -81.96 -81.965 -81.97 -81.975 -81.98 -81.985 -81.99 -81.995 -82 -82.005 -82.01 -82.015 -82.02 -82.025 -82.03 -82.035 -82.04 -82.045 -82.05 -82.055 -82.06 -82.065 -82.07 -82.075 -82.08 -82.085 -82.09 -82.095 -82.1 -82.105 -82.11 -82.115 -82.12 -82.125 -82.13 -82.135 -82.14 -82.145 -82.15 -82.155 -82.16 -82.165 -82.17 -82.175 -82.18 -82.185 -82.19 -82.195 -82.2 -82.205 -82.21 -82.215 -82.22 -82.225 -82.23 -82.235 -82.24 -82.245 -82.25 -82.255 -82.26 -82.265 -82.27 -82.275 -82.28 -82.285 -82.29 -82.295 -82.3 -82.305 -82.31 -82.315 -82.32 -82.325 -82.33 -82.335 -82.34 -82.345 -82.35 -82.355 -82.36 -82.365 -82.37 -82.375 -82.38 -82.385 -82.39 -82.395 -82.4 -82.405 -82.41 -82.415 -82.42 -82.425 -82.43 -82.435 -82.44 -82.445 -82.45 -82.455 -82.46 -82.465 -82.47 -82.475 -82.48 -82.485 -82.49 -82.495 -82.5 -82.505 -82.51 -82.515 -82.52 -82.525 -82.53 -82.535 -82.54 -82.545 -82.55 -82.555 -82.56 -82.565 -82.57 -82.575 -82.58 -82.585 -82.59 -82.595 -82.6 -82.605 -82.61 -82.615 -82.62 -82.625 -82.63 -82.635 -82.64 -82.645 -82.65 -82.655 -82.66 -82.665 -82.67 -82.675 -82.68 -82.685 -82.69 -82.695 -82.7 -82.705 -82.71 -82.715 -82.72 -82.725 -82.73 -82.735 -82.74 -82.745 -82.75 -82.755 -82.76 -82.765 -82.77 -82.775 -82.78 -82.785 -82.79 -82.795 -82.8 -82.805 -82.81 -82.815 -82.82 -82.825 -82.83 -82.835 -82.84 -82.845 -82.85 -82.855 -82.86 -82.865 -82.87 -82.875 -82.88 -82.885 -82.89 -82.895 -82.9 -82.905 -82.91 -82.915 -82.92 -82.925 -82.93 -82.935 -82.94 -82.945 -82.95 -82.955 -82.96 -82.965 -82.97 -82.975 -82.98 -82.985 -82.99 -82.995 -83 -83.005 -83.01 -83.015 -83.02 -83.025 -83.03 -83.035 -83.04 -83.045 -83.05 -83.055 -83.06 -83.065 -83.07 -83.075 -83.08 -83.085 -83.09 -83.095 -83.1 -83.105 -83.11 -83.115 -83.12 -83.125 -83.13 -83.135 -83.14 -83.145 -83.15 -83.155 -83.16 -83.165 -83.17 -83.175 -83.18 -83.185 -83.19 -83.195 -83.2 -83.205 -83.21 -83.215 -83.22 -83.225 -83.23 -83.235 -83.24 -83.245 -83.25 -83.255 -83.26 -83.265 -83.27 -83.275 -83.28 -83.285 -83.29 -83.295 -83.3 -83.305 -83.31 -83.315 -83.32 -83.325 -83.33 -83.335 -83.34 -83.345 -83.35 -83.355 -83.36 -83.365 -83.37 -83.375 -83.38 -83.385 -83.39 -83.395 -83.4 -83.405 -83.41 -83.415 -83.42 -83.425 -83.43 -83.435 -83.44 -83.445 -83.45 -83.455 -83.46 -83.465 -83.47 -83.475 -83.48 -83.485 -83.49 -83.495 -83.5 -83.505 -83.51 -83.515 -83.52 -83.525 -83.53 -83.535 -83.54 -83.545 -83.55 -83.555 -83.56 -83.565 -83.57 -83.575 -83.58 -83.585 -83.59 -83.595 -83.6 -83.605 -83.61 -83.615 -83.62 -83.625 -83.63 -83.635 -83.64 -83.645 -83.65 -83.655 -83.66 -83.665 -83.67 -83.675 -83.68 -83.685 -83.69 -83.695 -83.7 -83.705 -83.71 -83.715 -83.72 -83.725 -83.73 -83.735 -83.74 -83.745 -83.75 -83.755 -83.76 -83.765 -83.77 -83.775 -83.78 -83.785 -83.79 -83.795 -83.8 -83.805 -83.81 -83.815 -83.82 -83.825 -83.83 -83.835 -83.84 -83.845 -83.85 -83.855 -83.86 -83.865 -83.87 -83.875 -83.88 -83.885 -83.89 -83.895 -83.9 -83.905 -83.91 -83.915 -83.92 -83.925 -83.93 -83.935 -83.94 -83.945 -83.95 -83.955 -83.96 -83.965 -83.97 -83.975 -83.98 -83.985 -83.99 -83.995 -84 -84.005 -84.01 -84.015 -84.02 -84.025 -84.03 -84.035 -84.04 -84.045 -84.05 -84.055 -84.06 -84.065 -84.07 -84.075 -84.08 -84.085 -84.09 -84.095 -84.1 -84.105 -84.11 -84.115 -84.12 -84.125 -84.13 -84.135 -84.14 -84.145 -84.15 -84.155 -84.16 -84.165 -84.17 -84.175 -84.18 -84.185 -84.19 -84.195 -84.2 -84.205 -84.21 -84.215 -84.22 -84.225 -84.23 -84.235 -84.24 -84.245 -84.25 -84.255 -84.26 -84.265 -84.27 -84.275 -84.28 -84.285 -84.29 -84.295 -84.3 -84.305 -84.31 -84.315 -84.32 -84.325 -84.33 -84.335 -84.34 -84.345 -84.35 -84.355 -84.36 -84.365 -84.37 -84.375 -84.38 -84.385 -84.39 -84.395 -84.4 -84.405 -84.41 -84.415 -84.42 -84.425 -84.43 -84.435 -84.44 -84.445 -84.45 -84.455 -84.46 -84.465 -84.47 -84.475 -84.48 -84.485 -84.49 -84.495 -84.5 -84.505 -84.51 -84.515 -84.52 -84.525 -84.53 -84.535 -84.54 -84.545 -84.55 -84.555 -84.56 -84.565 -84.57 -84.575 -84.58 -84.585 -84.59 -84.595 -84.6 -84.605 -84.61 -84.615 -84.62 -84.625 -84.63 -84.635 -84.64 -84.645 -84.65 -84.655 -84.66 -84.665 -84.67 -84.675 -84.68 -84.685 -84.69 -84.695 -84.7 -84.705 -84.71 -84.715 -84.72 -84.725 -84.73 -84.735 -84.74 -84.745 -84.75 -84.755 -84.76 -84.765 -84.77 -84.775 -84.78 -84.785 -84.79 -84.795 -84.8 -84.805 -84.81 -84.815 -84.82 -84.825 -84.83 -84.835 -84.84 -84.845 -84.85 -84.855 -84.86 -84.865 -84.87 -84.875 -84.88 -84.885 -84.89 -84.895 -84.9 -84.905 -84.91 -84.915 -84.92 -84.925 -84.93 -84.935 -84.94 -84.945 -84.95 -84.955 -84.96 -84.965 -84.97 -84.975 -84.98 -84.985 -84.99 -84.995 -85 -85.005 -85.01 -85.015 -85.02 -85.025 -85.03 -85.035 -85.04 -85.045 -85.05 -85.055 -85.06 -85.065 -85.07 -85.075 -85.08 -85.085 -85.09 -85.095 -85.1 -85.105 -85.11 -85.115 -85.12 -85.125 -85.13 -85.135 -85.14 -85.145 -85.15 -85.155 -85.16 -85.165 -85.17 -85.175 -85.18 -85.185 -85.19 -85.195 -85.2 -85.205 -85.21 -85.215 -85.22 -85.225 -85.23 -85.235 -85.24 -85.245 -85.25 -85.255 -85.26 -85.265 -85.27 -85.275 -85.28 -85.285 -85.29 -85.295 -85.3 -85.305 -85.31 -85.315 -85.32 -85.325 -85.33 -85.335 -85.34 -85.345 -85.35 -85.355 -85.36 -85.365 -85.37 -85.375 -85.38 -85.385 -85.39 -85.395 -85.4 -85.405 -85.41 -85.415 -85.42 -85.425 -85.43 -85.435 -85.44 -85.445 -85.45 -85.455 -85.46 -85.465 -85.47 -85.475 -85.48 -85.485 -85.49 -85.495 -85.5 -85.505 -85.51 -85.515 -85.52 -85.525 -85.53 -85.535 -85.54 -85.545 -85.55 -85.555 -85.56 -85.565 -85.57 -85.575 -85.58 -85.585 -85.59 -85.595 -85.6 -85.605 -85.61 -85.615 -85.62 -85.625 -85.63 -85.635 -85.64 -85.645 -85.65 -85.655 -85.66 -85.665 -85.67 -85.675 -85.68 -85.685 -85.69 -85.695 -85.7 -85.705 -85.71 -85.715 -85.72 -85.725 -85.73 -85.735 -85.74 -85.745 -85.75 -85.755 -85.76 -85.765 -85.77 -85.775 -85.78 -85.785 -85.79 -85.795 -85.8 -85.805 -85.81 -85.815 -85.82 -85.825 -85.83 -85.835 -85.84 -85.845 -85.85 -85.855 -85.86 -85.865 -85.87 -85.875 -85.88 -85.885 -85.89 -85.895 -85.9 -85.905 -85.91 -85.915 -85.92 -85.925 -85.93 -85.935 -85.94 -85.945 -85.95 -85.955 -85.96 -85.965 -85.97 -85.975 -85.98 -85.985 -85.99 -85.995 -86 -86.005 -86.01 -86.015 -86.02 -86.025 -86.03 -86.035 -86.04 -86.045 -86.05 -86.055 -86.06 -86.065 -86.07 -86.075 -86.08 -86.085 -86.09 -86.095 -86.1 -86.105 -86.11 -86.115 -86.12 -86.125 -86.13 -86.135 -86.14 -86.145 -86.15 -86.155 -86.16 -86.165 -86.17 -86.175 -86.18 -86.185 -86.19 -86.195 -86.2 -86.205 -86.21 -86.215 -86.22 -86.225 -86.23 -86.235 -86.24 -86.245 -86.25 -86.255 -86.26 -86.265 -86.27 -86.275 -86.28 -86.285 -86.29 -86.295 -86.3 -86.305 -86.31 -86.315 -86.32 -86.325 -86.33 -86.335 -86.34 -86.345 -86.35 -86.355 -86.36 -86.365 -86.37 -86.375 -86.38 -86.385 -86.39 -86.395 -86.4 -86.405 -86.41 -86.415 -86.42 -86.425 -86.43 -86.435 -86.44 -86.445 -86.45 -86.455 -86.46 -86.465 -86.47 -86.475 -86.48 -86.485 -86.49 -86.495 -86.5 -86.505 -86.51 -86.515 -86.52 -86.525 -86.53 -86.535 -86.54 -86.545 -86.55 -86.555 -86.56 -86.565 -86.57 -86.575 -86.58 -86.585 -86.59 -86.595 -86.6 -86.605 -86.61 -86.615 -86.62 -86.625 -86.63 -86.635 -86.64 -86.645 -86.65 -86.655 -86.66 -86.665 -86.67 -86.675 -86.68 -86.685 -86.69 -86.695 -86.7 -86.705 -86.71 -86.715 -86.72 -86.725 -86.73 -86.735 -86.74 -86.745 -86.75 -86.755 -86.76 -86.765 -86.77 -86.775 -86.78 -86.785 -86.79 -86.795 -86.8 -86.805 -86.81 -86.815 -86.82 -86.825 -86.83 -86.835 -86.84 -86.845 -86.85 -86.855 -86.86 -86.865 -86.87 -86.875 -86.88 -86.885 -86.89 -86.895 -86.9 -86.905 -86.91 -86.915 -86.92 -86.925 -86.93 -86.935 -86.94 -86.945 -86.95 -86.955 -86.96 -86.965 -86.97 -86.975 -86.98 -86.985 -86.99 -86.995 -87 -87.005 -87.01 -87.015 -87.02 -87.025 -87.03 -87.035 -87.04 -87.045 -87.05 -87.055 -87.06 -87.065 -87.07 -87.075 -87.08 -87.085 -87.09 -87.095 -87.1 -87.105 -87.11 -87.115 -87.12 -87.125 -87.13 -87.135 -87.14 -87.145 -87.15 -87.155 -87.16 -87.165 -87.17 -87.175 -87.18 -87.185 -87.19 -87.195 -87.2 -87.205 -87.21 -87.215 -87.22 -87.225 -87.23 -87.235 -87.24 -87.245 -87.25 -87.255 -87.26 -87.265 -87.27 -87.275 -87.28 -87.285 -87.29 -87.295 -87.3 -87.305 -87.31 -87.315 -87.32 -87.325 -87.33 -87.335 -87.34 -87.345 -87.35 -87.355 -87.36 -87.365 -87.37 -87.375 -87.38 -87.385 -87.39 -87.395 -87.4 -87.405 -87.41 -87.415 -87.42 -87.425 -87.43 -87.435 -87.44 -87.445 -87.45 -87.455 -87.46 -87.465 -87.47 -87.475 -87.48 -87.485 -87.49 -87.495 -87.5 -87.505 -87.51 -87.515 -87.52 -87.525 -87.53 -87.535 -87.54 -87.545 -87.55 -87.555 -87.56 -87.565 -87.57 -87.575 -87.58 -87.585 -87.59 -87.595 -87.6 -87.605 -87.61 -87.615 -87.62 -87.625 -87.63 -87.635 -87.64 -87.645 -87.65 -87.655 -87.66 -87.665 -87.67 -87.675 -87.68 -87.685 -87.69 -87.695 -87.7 -87.705 -87.71 -87.715 -87.72 -87.725 -87.73 -87.735 -87.74 -87.745 -87.75 -87.755 -87.76 -87.765 -87.77 -87.775 -87.78 -87.785 -87.79 -87.795 -87.8 -87.805 -87.81 -87.815 -87.82 -87.825 -87.83 -87.835 -87.84 -87.845 -87.85 -87.855 -87.86 -87.865 -87.87 -87.875 -87.88 -87.885 -87.89 -87.895 -87.9 -87.905 -87.91 -87.915 -87.92 -87.925 -87.93 -87.935 -87.94 -87.945 -87.95 -87.955 -87.96 -87.965 -87.97 -87.975 -87.98 -87.985 -87.99 -87.995 -88 -88.005 -88.01 -88.015 -88.02 -88.025 -88.03 -88.035 -88.04 -88.045 -88.05 -88.055 -88.06 -88.065 -88.07 -88.075 -88.08 -88.085 -88.09 -88.095 -88.1 -88.105 -88.11 -88.115 -88.12 -88.125 -88.13 -88.135 -88.14 -88.145 -88.15 -88.155 -88.16 -88.165 -88.17 -88.175 -88.18 -88.185 -88.19 -88.195 -88.2 -88.205 -88.21 -88.215 -88.22 -88.225 -88.23 -88.235 -88.24 -88.245 -88.25 -88.255 -88.26 -88.265 -88.27 -88.275 -88.28 -88.285 -88.29 -88.295 -88.3 -88.305 -88.31 -88.315 -88.32 -88.325 -88.33 -88.335 -88.34 -88.345 -88.35 -88.355 -88.36 -88.365 -88.37 -88.375 -88.38 -88.385 -88.39 -88.395 -88.4 -88.405 -88.41 -88.415 -88.42 -88.425 -88.43 -88.435 -88.44 -88.445 -88.45 -88.455 -88.46 -88.465 -88.47 -88.475 -88.48 -88.485 -88.49 -88.495 -88.5 -88.505 -88.51 -88.515 -88.52 -88.525 -88.53 -88.535 -88.54 -88.545 -88.55 -88.555 -88.56 -88.565 -88.57 -88.575 -88.58 -88.585 -88.59 -88.595 -88.6 -88.605 -88.61 -88.615 -88.62 -88.625 -88.63 -88.635 -88.64 -88.645 -88.65 -88.655 -88.66 -88.665 -88.67 -88.675 -88.68 -88.685 -88.69 -88.695 -88.7 -88.705 -88.71 -88.715 -88.72 -88.725 -88.73 -88.735 -88.74 -88.745 -88.75 -88.755 -88.76 -88.765 -88.77 -88.775 -88.78 -88.785 -88.79 -88.795 -88.8 -88.805 -88.81 -88.815 -88.82 -88.825 -88.83 -88.835 -88.84 -88.845 -88.85 -88.855 -88.86 -88.865 -88.87 -88.875 -88.88 -88.885 -88.89 -88.895 -88.9 -88.905 -88.91 -88.915 -88.92 -88.925 -88.93 -88.935 -88.94 -88.945 -88.95 -88.955 -88.96 -88.965 -88.97 -88.975 -88.98 -88.985 -88.99 -88.995 -89 -89.005 -89.01 -89.015 -89.02 -89.025 -89.03 -89.035 -89.04 -89.045 -89.05 -89.055 -89.06 -89.065 -89.07 -89.075 -89.08 -89.085 -89.09 -89.095 -89.1 -89.105 -89.11 -89.115 -89.12 -89.125 -89.13 -89.135 -89.14 -89.145 -89.15 -89.155 -89.16 -89.165 -89.17 -89.175 -89.18 -89.185 -89.19 -89.195 -89.2 -89.205 -89.21 -89.215 -89.22 -89.225 -89.23 -89.235 -89.24 -89.245 -89.25 -89.255 -89.26 -89.265 -89.27 -89.275 -89.28 -89.285 -89.29 -89.295 -89.3 -89.305 -89.31 -89.315 -89.32 -89.325 -89.33 -89.335 -89.34 -89.345 -89.35 -89.355 -89.36 -89.365 -89.37 -89.375 -89.38 -89.385 -89.39 -89.395 -89.4 -89.405 -89.41 -89.415 -89.42 -89.425 -89.43 -89.435 -89.44 -89.445 -89.45 -89.455 -89.46 -89.465 -89.47 -89.475 -89.48 -89.485 -89.49 -89.495 -89.5 -89.505 -89.51 -89.515 -89.52 -89.525 -89.53 -89.535 -89.54 -89.545 -89.55 -89.555 -89.56 -89.565 -89.57 -89.575 -89.58 -89.585 -89.59 -89.595 -89.6 -89.605 -89.61 -89.615 -89.62 -89.625 -89.63 -89.635 -89.64 -89.645 -89.65 -89.655 -89.66 -89.665 -89.67 -89.675 -89.68 -89.685 -89.69 -89.695 -89.7 -89.705 -89.71 -89.715 -89.72 -89.725 -89.73 -89.735 -89.74 -89.745 -89.75 -89.755 -89.76 -89.765 -89.77 -89.775 -89.78 -89.785 -89.79 -89.795 -89.8 -89.805 -89.81 -89.815 -89.82 -89.825 -89.83 -89.835 -89.84 -89.845 -89.85 -89.855 -89.86 -89.865 -89.87 -89.875 -89.88 -89.885 -89.89 -89.895 -89.9 -89.905 -89.91 -89.915 -89.92 -89.925 -89.93 -89.935 -89.94 -89.945 -89.95 -89.955 -89.96 -89.965 -89.97 -89.975 -89.98 -89.985 -89.99 -89.995 -90 -90.005 -90.01 -90.015 -90.02 -90.025 -90.03 -90.035 -90.04 -90.045 -90.05 -90.055 -90.06 -90.065 -90.07 -90.075 -90.08 -90.085 -90.09 -90.095 -90.1 -90.105 -90.11 -90.115 -90.12 -90.125 -90.13 -90.135 -90.14 -90.145 -90.15 -90.155 -90.16 -90.165 -90.17 -90.175 -90.18 -90.185 -90.19 -90.195 -90.2 -90.205 -90.21 -90.215 -90.22 -90.225 -90.23 -90.235 -90.24 -90.245 -90.25 -90.255 -90.26 -90.265 -90.27 -90.275 -90.28 -90.285 -90.29 -90.295 -90.3 -90.305 -90.31 -90.315 -90.32 -90.325 -90.33 -90.335 -90.34 -90.345 -90.35 -90.355 -90.36 -90.365 -90.37 -90.375 -90.38 -90.385 -90.39 -90.395 -90.4 -90.405 -90.41 -90.415 -90.42 -90.425 -90.43 -90.435 -90.44 -90.445 -90.45 -90.455 -90.46 -90.465 -90.47 -90.475 -90.48 -90.485 -90.49 -90.495 -90.5 -90.505 -90.51 -90.515 -90.52 -90.525 -90.53 -90.535 -90.54 -90.545 -90.55 -90.555 -90.56 -90.565 -90.57 -90.575 -90.58 -90.585 -90.59 -90.595 -90.6 -90.605 -90.61 -90.615 -90.62 -90.625 -90.63 -90.635 -90.64 -90.645 -90.65 -90.655 -90.66 -90.665 -90.67 -90.675 -90.68 -90.685 -90.69 -90.695 -90.7 -90.705 -90.71 -90.715 -90.72 -90.725 -90.73 -90.735 -90.74 -90.745 -90.75 -90.755 -90.76 -90.765 -90.77 -90.775 -90.78 -90.785 -90.79 -90.795 -90.8 -90.805 -90.81 -90.815 -90.82 -90.825 -90.83 -90.835 -90.84 -90.845 -90.85 -90.855 -90.86 -90.865 -90.87 -90.875 -90.88 -90.885 -90.89 -90.895 -90.9 -90.905 -90.91 -90.915 -90.92 -90.925 -90.93 -90.935 -90.94 -90.945 -90.95 -90.955 -90.96 -90.965 -90.97 -90.975 -90.98 -90.985 -90.99 -90.995 -91 -91.005 -91.01 -91.015 -91.02 -91.025 -91.03 -91.035 -91.04 -91.045 -91.05 -91.055 -91.06 -91.065 -91.07 -91.075 -91.08 -91.085 -91.09 -91.095 -91.1 -91.105 -91.11 -91.115 -91.12 -91.125 -91.13 -91.135 -91.14 -91.145 -91.15 -91.155 -91.16 -91.165 -91.17 -91.175 -91.18 -91.185 -91.19 -91.195 -91.2 -91.205 -91.21 -91.215 -91.22 -91.225 -91.23 -91.235 -91.24 -91.245 -91.25 -91.255 -91.26 -91.265 -91.27 -91.275 -91.28 -91.285 -91.29 -91.295 -91.3 -91.305 -91.31 -91.315 -91.32 -91.325 -91.33 -91.335 -91.34 -91.345 -91.35 -91.355 -91.36 -91.365 -91.37 -91.375 -91.38 -91.385 -91.39 -91.395 -91.4 -91.405 -91.41 -91.415 -91.42 -91.425 -91.43 -91.435 -91.44 -91.445 -91.45 -91.455 -91.46 -91.465 -91.47 -91.475 -91.48 -91.485 -91.49 -91.495 -91.5 -91.505 -91.51 -91.515 -91.52 -91.525 -91.53 -91.535 -91.54 -91.545 -91.55 -91.555 -91.56 -91.565 -91.57 -91.575 -91.58 -91.585 -91.59 -91.595 -91.6 -91.605 -91.61 -91.615 -91.62 -91.625 -91.63 -91.635 -91.64 -91.645 -91.65 -91.655 -91.66 -91.665 -91.67 -91.675 -91.68 -91.685 -91.69 -91.695 -91.7 -91.705 -91.71 -91.715 -91.72 -91.725 -91.73 -91.735 -91.74 -91.745 -91.75 -91.755 -91.76 -91.765 -91.77 -91.775 -91.78 -91.785 -91.79 -91.795 -91.8 -91.805 -91.81 -91.815 -91.82 -91.825 -91.83 -91.835 -91.84 -91.845 -91.85 -91.855 -91.86 -91.865 -91.87 -91.875 -91.88 -91.885 -91.89 -91.895 -91.9 -91.905 -91.91 -91.915 -91.92 -91.925 -91.93 -91.935 -91.94 -91.945 -91.95 -91.955 -91.96 -91.965 -91.97 -91.975 -91.98 -91.985 -91.99 -91.995 -92 -92.005 -92.01 -92.015 -92.02 -92.025 -92.03 -92.035 -92.04 -92.045 -92.05 -92.055 -92.06 -92.065 -92.07 -92.075 -92.08 -92.085 -92.09 -92.095 -92.1 -92.105 -92.11 -92.115 -92.12 -92.125 -92.13 -92.135 -92.14 -92.145 -92.15 -92.155 -92.16 -92.165 -92.17 -92.175 -92.18 -92.185 -92.19 -92.195 -92.2 -92.205 -92.21 -92.215 -92.22 -92.225 -92.23 -92.235 -92.24 -92.245 -92.25 -92.255 -92.26 -92.265 -92.27 -92.275 -92.28 -92.285 -92.29 -92.295 -92.3 -92.305 -92.31 -92.315 -92.32 -92.325 -92.33 -92.335 -92.34 -92.345 -92.35 -92.355 -92.36 -92.365 -92.37 -92.375 -92.38 -92.385 -92.39 -92.395 -92.4 -92.405 -92.41 -92.415 -92.42 -92.425 -92.43 -92.435 -92.44 -92.445 -92.45 -92.455 -92.46 -92.465 -92.47 -92.475 -92.48 -92.485 -92.49 -92.495 -92.5 -92.505 -92.51 -92.515 -92.52 -92.525 -92.53 -92.535 -92.54 -92.545 -92.55 -92.555 -92.56 -92.565 -92.57 -92.575 -92.58 -92.585 -92.59 -92.595 -92.6 -92.605 -92.61 -92.615 -92.62 -92.625 -92.63 -92.635 -92.64 -92.645 -92.65 -92.655 -92.66 -92.665 -92.67 -92.675 -92.68 -92.685 -92.69 -92.695 -92.7 -92.705 -92.71 -92.715 -92.72 -92.725 -92.73 -92.735 -92.74 -92.745 -92.75 -92.755 -92.76 -92.765 -92.77 -92.775 -92.78 -92.785 -92.79 -92.795 -92.8 -92.805 -92.81 -92.815 -92.82 -92.825 -92.83 -92.835 -92.84 -92.845 -92.85 -92.855 -92.86 -92.865 -92.87 -92.875 -92.88 -92.885 -92.89 -92.895 -92.9 -92.905 -92.91 -92.915 -92.92 -92.925 -92.93 -92.935 -92.94 -92.945 -92.95 -92.955 -92.96 -92.965 -92.97 -92.975 -92.98 -92.985 -92.99 -92.995 -93 -93.005 -93.01 -93.015 -93.02 -93.025 -93.03 -93.035 -93.04 -93.045 -93.05 -93.055 -93.06 -93.065 -93.07 -93.075 -93.08 -93.085 -93.09 -93.095 -93.1 -93.105 -93.11 -93.115 -93.12 -93.125 -93.13 -93.135 -93.14 -93.145 -93.15 -93.155 -93.16 -93.165 -93.17 -93.175 -93.18 -93.185 -93.19 -93.195 -93.2 -93.205 -93.21 -93.215 -93.22 -93.225 -93.23 -93.235 -93.24 -93.245 -93.25 -93.255 -93.26 -93.265 -93.27 -93.275 -93.28 -93.285 -93.29 -93.295 -93.3 -93.305 -93.31 -93.315 -93.32 -93.325 -93.33 -93.335 -93.34 -93.345 -93.35 -93.355 -93.36 -93.365 -93.37 -93.375 -93.38 -93.385 -93.39 -93.395 -93.4 -93.405 -93.41 -93.415 -93.42 -93.425 -93.43 -93.435 -93.44 -93.445 -93.45 -93.455 -93.46 -93.465 -93.47 -93.475 -93.48 -93.485 -93.49 -93.495 -93.5 -93.505 -93.51 -93.515 -93.52 -93.525 -93.53 -93.535 -93.54 -93.545 -93.55 -93.555 -93.56 -93.565 -93.57 -93.575 -93.58 -93.585 -93.59 -93.595 -93.6 -93.605 -93.61 -93.615 -93.62 -93.625 -93.63 -93.635 -93.64 -93.645 -93.65 -93.655 -93.66 -93.665 -93.67 -93.675 -93.68 -93.685 -93.69 -93.695 -93.7 -93.705 -93.71 -93.715 -93.72 -93.725 -93.73 -93.735 -93.74 -93.745 -93.75 -93.755 -93.76 -93.765 -93.77 -93.775 -93.78 -93.785 -93.79 -93.795 -93.8 -93.805 -93.81 -93.815 -93.82 -93.825 -93.83 -93.835 -93.84 -93.845 -93.85 -93.855 -93.86 -93.865 -93.87 -93.875 -93.88 -93.885 -93.89 -93.895 -93.9 -93.905 -93.91 -93.915 -93.92 -93.925 -93.93 -93.935 -93.94 -93.945 -93.95 -93.955 -93.96 -93.965 -93.97 -93.975 -93.98 -93.985 -93.99 -93.995 -94 -94.005 -94.01 -94.015 -94.02 -94.025 -94.03 -94.035 -94.04 -94.045 -94.05 -94.055 -94.06 -94.065 -94.07 -94.075 -94.08 -94.085 -94.09 -94.095 -94.1 -94.105 -94.11 -94.115 -94.12 -94.125 -94.13 -94.135 -94.14 -94.145 -94.15 -94.155 -94.16 -94.165 -94.17 -94.175 -94.18 -94.185 -94.19 -94.195 -94.2 -94.205 -94.21 -94.215 -94.22 -94.225 -94.23 -94.235 -94.24 -94.245 -94.25 -94.255 -94.26 -94.265 -94.27 -94.275 -94.28 -94.285 -94.29 -94.295 -94.3 -94.305 -94.31 -94.315 -94.32 -94.325 -94.33 -94.335 -94.34 -94.345 -94.35 -94.355 -94.36 -94.365 -94.37 -94.375 -94.38 -94.385 -94.39 -94.395 -94.4 -94.405 -94.41 -94.415 -94.42 -94.425 -94.43 -94.435 -94.44 -94.445 -94.45 -94.455 -94.46 -94.465 -94.47 -94.475 -94.48 -94.485 -94.49 -94.495 -94.5 -94.505 -94.51 -94.515 -94.52 -94.525 -94.53 -94.535 -94.54 -94.545 -94.55 -94.555 -94.56 -94.565 -94.57 -94.575 -94.58 -94.585 -94.59 -94.595 -94.6 -94.605 -94.61 -94.615 -94.62 -94.625 -94.63 -94.635 -94.64 -94.645 -94.65 -94.655 -94.66 -94.665 -94.67 -94.675 -94.68 -94.685 -94.69 -94.695 -94.7 -94.705 -94.71 -94.715 -94.72 -94.725 -94.73 -94.735 -94.74 -94.745 -94.75 -94.755 -94.76 -94.765 -94.77 -94.775 -94.78 -94.785 -94.79 -94.795 -94.8 -94.805 -94.81 -94.815 -94.82 -94.825 -94.83 -94.835 -94.84 -94.845 -94.85 -94.855 -94.86 -94.865 -94.87 -94.875 -94.88 -94.885 -94.89 -94.895 -94.9 -94.905 -94.91 -94.915 -94.92 -94.925 -94.93 -94.935 -94.94 -94.945 -94.95 -94.955 -94.96 -94.965 -94.97 -94.975 -94.98 -94.985 -94.99 -94.995 -95 -95.005 -95.01 -95.015 -95.02 -95.025 -95.03 -95.035 -95.04 -95.045 -95.05 -95.055 -95.06 -95.065 -95.07 -95.075 -95.08 -95.085 -95.09 -95.095 -95.1 -95.105 -95.11 -95.115 -95.12 -95.125 -95.13 -95.135 -95.14 -95.145 -95.15 -95.155 -95.16 -95.165 -95.17 -95.175 -95.18 -95.185 -95.19 -95.195 -95.2 -95.205 -95.21 -95.215 -95.22 -95.225 -95.23 -95.235 -95.24 -95.245 -95.25 -95.255 -95.26 -95.265 -95.27 -95.275 -95.28 -95.285 -95.29 -95.295 -95.3 -95.305 -95.31 -95.315 -95.32 -95.325 -95.33 -95.335 -95.34 -95.345 -95.35 -95.355 -95.36 -95.365 -95.37 -95.375 -95.38 -95.385 -95.39 -95.395 -95.4 -95.405 -95.41 -95.415 -95.42 -95.425 -95.43 -95.435 -95.44 -95.445 -95.45 -95.455 -95.46 -95.465 -95.47 -95.475 -95.48 -95.485 -95.49 -95.495 -95.5 -95.505 -95.51 -95.515 -95.52 -95.525 -95.53 -95.535 -95.54 -95.545 -95.55 -95.555 -95.56 -95.565 -95.57 -95.575 -95.58 -95.585 -95.59 -95.595 -95.6 -95.605 -95.61 -95.615 -95.62 -95.625 -95.63 -95.635 -95.64 -95.645 -95.65 -95.655 -95.66 -95.665 -95.67 -95.675 -95.68 -95.685 -95.69 -95.695 -95.7 -95.705 -95.71 -95.715 -95.72 -95.725 -95.73 -95.735 -95.74 -95.745 -95.75 -95.755 -95.76 -95.765 -95.77 -95.775 -95.78 -95.785 -95.79 -95.795 -95.8 -95.805 -95.81 -95.815 -95.82 -95.825 -95.83 -95.835 -95.84 -95.845 -95.85 -95.855 -95.86 -95.865 -95.87 -95.875 -95.88 -95.885 -95.89 -95.895 -95.9 -95.905 -95.91 -95.915 -95.92 -95.925 -95.93 -95.935 -95.94 -95.945 -95.95 -95.955 -95.96 -95.965 -95.97 -95.975 -95.98 -95.985 -95.99 -95.995 -96 -96.005 -96.01 -96.015 -96.02 -96.025 -96.03 -96.035 -96.04 -96.045 -96.05 -96.055 -96.06 -96.065 -96.07 -96.075 -96.08 -96.085 -96.09 -96.095 -96.1 -96.105 -96.11 -96.115 -96.12 -96.125 -96.13 -96.135 -96.14 -96.145 -96.15 -96.155 -96.16 -96.165 -96.17 -96.175 -96.18 -96.185 -96.19 -96.195 -96.2 -96.205 -96.21 -96.215 -96.22 -96.225 -96.23 -96.235 -96.24 -96.245 -96.25 -96.255 -96.26 -96.265 -96.27 -96.275 -96.28 -96.285 -96.29 -96.295 -96.3 -96.305 -96.31 -96.315 -96.32 -96.325 -96.33 -96.335 -96.34 -96.345 -96.35 -96.355 -96.36 -96.365 -96.37 -96.375 -96.38 -96.385 -96.39 -96.395 -96.4 -96.405 -96.41 -96.415 -96.42 -96.425 -96.43 -96.435 -96.44 -96.445 -96.45 -96.455 -96.46 -96.465 -96.47 -96.475 -96.48 -96.485 -96.49 -96.495 -96.5 -96.505 -96.51 -96.515 -96.52 -96.525 -96.53 -96.535 -96.54 -96.545 -96.55 -96.555 -96.56 -96.565 -96.57 -96.575 -96.58 -96.585 -96.59 -96.595 -96.6 -96.605 -96.61 -96.615 -96.62 -96.625 -96.63 -96.635 -96.64 -96.645 -96.65 -96.655 -96.66 -96.665 -96.67 -96.675 -96.68 -96.685 -96.69 -96.695 -96.7 -96.705 -96.71 -96.715 -96.72 -96.725 -96.73 -96.735 -96.74 -96.745 -96.75 -96.755 -96.76 -96.765 -96.77 -96.775 -96.78 -96.785 -96.79 -96.795 -96.8 -96.805 -96.81 -96.815 -96.82 -96.825 -96.83 -96.835 -96.84 -96.845 -96.85 -96.855 -96.86 -96.865 -96.87 -96.875 -96.88 -96.885 -96.89 -96.895 -96.9 -96.905 -96.91 -96.915 -96.92 -96.925 -96.93 -96.935 -96.94 -96.945 -96.95 -96.955 -96.96 -96.965 -96.97 -96.975 -96.98 -96.985 -96.99 -96.995 -97 -97.005 -97.01 -97.015 -97.02 -97.025 -97.03 -97.035 -97.04 -97.045 -97.05 -97.055 -97.06 -97.065 -97.07 -97.075 -97.08 -97.085 -97.09 -97.095 -97.1 -97.105 -97.11 -97.115 -97.12 -97.125 -97.13 -97.135 -97.14 -97.145 -97.15 -97.155 -97.16 -97.165 -97.17 -97.175 -97.18 -97.185 -97.19 -97.195 -97.2 -97.205 -97.21 -97.215 -97.22 -97.225 -97.23 -97.235 -97.24 -97.245 -97.25 -97.255 -97.26 -97.265 -97.27 -97.275 -97.28 -97.285 -97.29 -97.295 -97.3 -97.305 -97.31 -97.315 -97.32 -97.325 -97.33 -97.335 -97.34 -97.345 -97.35 -97.355 -97.36 -97.365 -97.37 -97.375 -97.38 -97.385 -97.39 -97.395 -97.4 -97.405 -97.41 -97.415 -97.42 -97.425 -97.43 -97.435 -97.44 -97.445 -97.45 -97.455 -97.46 -97.465 -97.47 -97.475 -97.48 -97.485 -97.49 -97.495 -97.5 -97.505 -97.51 -97.515 -97.52 -97.525 -97.53 -97.535 -97.54 -97.545 -97.55 -97.555 -97.56 -97.565 -97.57 -97.575 -97.58 -97.585 -97.59 -97.595 -97.6 -97.605 -97.61 -97.615 -97.62 -97.625 -97.63 -97.635 -97.64 -97.645 -97.65 -97.655 -97.66 -97.665 -97.67 -97.675 -97.68 -97.685 -97.69 -97.695 -97.7 -97.705 -97.71 -97.715 -97.72 -97.725 -97.73 -97.735 -97.74 -97.745 -97.75 -97.755 -97.76 -97.765 -97.77 -97.775 -97.78 -97.785 -97.79 -97.795 -97.8 -97.805 -97.81 -97.815 -97.82 -97.825 -97.83 -97.835 -97.84 -97.845 -97.85 -97.855 -97.86 -97.865 -97.87 -97.875 -97.88 -97.885 -97.89 -97.895 -97.9 -97.905 -97.91 -97.915 -97.92 -97.925 -97.93 -97.935 -97.94 -97.945 -97.95 -97.955 -97.96 -97.965 -97.97 -97.975 -97.98 -97.985 -97.99 -97.995 -98 -98.005 -98.01 -98.015 -98.02 -98.025 -98.03 -98.035 -98.04 -98.045 -98.05 -98.055 -98.06 -98.065 -98.07 -98.075 -98.08 -98.085 -98.09 -98.095 -98.1 -98.105 -98.11 -98.115 -98.12 -98.125 -98.13 -98.135 -98.14 -98.145 -98.15 -98.155 -98.16 -98.165 -98.17 -98.175 -98.18 -98.185 -98.19 -98.195 -98.2 -98.205 -98.21 -98.215 -98.22 -98.225 -98.23 -98.235 -98.24 -98.245 -98.25 -98.255 -98.26 -98.265 -98.27 -98.275 -98.28 -98.285 -98.29 -98.295 -98.3 -98.305 -98.31 -98.315 -98.32 -98.325 -98.33 -98.335 -98.34 -98.345 -98.35 -98.355 -98.36 -98.365 -98.37 -98.375 -98.38 -98.385 -98.39 -98.395 -98.4 -98.405 -98.41 -98.415 -98.42 -98.425 -98.43 -98.435 -98.44 -98.445 -98.45 -98.455 -98.46 -98.465 -98.47 -98.475 -98.48 -98.485 -98.49 -98.495 -98.5 -98.505 -98.51 -98.515 -98.52 -98.525 -98.53 -98.535 -98.54 -98.545 -98.55 -98.555 -98.56 -98.565 -98.57 -98.575 -98.58 -98.585 -98.59 -98.595 -98.6 -98.605 -98.61 -98.615 -98.62 -98.625 -98.63 -98.635 -98.64 -98.645 -98.65 -98.655 -98.66 -98.665 -98.67 -98.675 -98.68 -98.685 -98.69 -98.695 -98.7 -98.705 -98.71 -98.715 -98.72 -98.725 -98.73 -98.735 -98.74 -98.745 -98.75 -98.755 -98.76 -98.765 -98.77 -98.775 -98.78 -98.785 -98.79 -98.795 -98.8 -98.805 -98.81 -98.815 -98.82 -98.825 -98.83 -98.835 -98.84 -98.845 -98.85 -98.855 -98.86 -98.865 -98.87 -98.875 -98.88 -98.885 -98.89 -98.895 -98.9 -98.905 -98.91 -98.915 -98.92 -98.925 -98.93 -98.935 -98.94 -98.945 -98.95 -98.955 -98.96 -98.965 -98.97 -98.975 -98.98 -98.985 -98.99 -98.995 -99 -99.005 -99.01 -99.015 -99.02 -99.025 -99.03 -99.035 -99.04 -99.045 -99.05 -99.055 -99.06 -99.065 -99.07 -99.075 -99.08 -99.085 -99.09 -99.095 -99.1 -99.105 -99.11 -99.115 -99.12 -99.125 -99.13 -99.135 -99.14 -99.145 -99.15 -99.155 -99.16 -99.165 -99.17 -99.175 -99.18 -99.185 -99.19 -99.195 -99.2 -99.205 -99.21 -99.215 -99.22 -99.225 -99.23 -99.235 -99.24 -99.245 -99.25 -99.255 -99.26 -99.265 -99.27 -99.275 -99.28 -99.285 -99.29 -99.295 -99.3 -99.305 -99.31 -99.315 -99.32 -99.325 -99.33 -99.335 -99.34 -99.345 -99.35 -99.355 -99.36 -99.365 -99.37 -99.375 -99.38 -99.385 -99.39 -99.395 -99.4 -99.405 -99.41 -99.415 -99.42 -99.425 -99.43 -99.435 -99.44 -99.445 -99.45 -99.455 -99.46 -99.465 -99.47 -99.475 -99.48 -99.485 -99.49 -99.495 -99.5 -99.505 -99.51 -99.515 -99.52 -99.525 -99.53 -99.535 -99.54 -99.545 -99.55 -99.555 -99.56 -99.565 -99.57 -99.575 -99.58 -99.585 -99.59 -99.595 -99.6 -99.605 -99.61 -99.615 -99.62 -99.625 -99.63 -99.635 -99.64 -99.645 -99.65 -99.655 -99.66 -99.665 -99.67 -99.675 -99.68 -99.685 -99.69 -99.695 -99.7 -99.705 -99.71 -99.715 -99.72 -99.725 -99.73 -99.735 -99.74 -99.745 -99.75 -99.755 -99.76 -99.765 -99.77 -99.775 -99.78 -99.785 -99.79 -99.795 -99.8 -99.805 -99.81 -99.815 -99.82 -99.825 -99.83 -99.835 -99.84 -99.845 -99.85 -99.855 -99.86 -99.865 -99.87 -99.875 -99.88 -99.885 -99.89 -99.895 -99.9 -99.905 -99.91 -99.915 -99.92 -99.925 -99.93 -99.935 -99.94 -99.945 -99.95 -99.955 -99.96 -99.965 -99.97 -99.975 -99.98 -99.985 -99.99 -99.995 -100 -100.005 -100.01 -100.015 -100.02 -100.025 -100.03 -100.035 -100.04 -100.045 -100.05 -100.055 -100.06 -100.065 -100.07 -100.075 -100.08 -100.085 -100.09 -100.095 -100.1 -100.105 -100.11 -100.115 -100.12 -100.125 -100.13 -100.135 -100.14 -100.145 -100.15 -100.155 -100.16 -100.165 -100.17 -100.175 -100.18 -100.185 -100.19 -100.195 -100.2 -100.205 -100.21 -100.215 -100.22 -100.225 -100.23 -100.235 -100.24 -100.245 -100.25 -100.255 -100.26 -100.265 -100.27 -100.275 -100.28 -100.285 -100.29 -100.295 -100.3 -100.305 -100.31 -100.315 -100.32 -100.325 -100.33 -100.335 -100.34 -100.345 -100.35 -100.355 -100.36 -100.365 -100.37 -100.375 -100.38 -100.385 -100.39 -100.395 -100.4 -100.405 -100.41 -100.415 -100.42 -100.425 -100.43 -100.435 -100.44 -100.445 -100.45 -100.455 -100.46 -100.465 -100.47 -100.475 -100.48 -100.485 -100.49 -100.495 -100.5 -100.505 -100.51 -100.515 -100.52 -100.525 -100.53 -100.535 -100.54 -100.545 -100.55 -100.555 -100.56 -100.565 -100.57 -100.575 -100.58 -100.585 -100.59 -100.595 -100.6 -100.605 -100.61 -100.615 -100.62 -100.625 -100.63 -100.635 -100.64 -100.645 -100.65 -100.655 -100.66 -100.665 -100.67 -100.675 -100.68 -100.685 -100.69 -100.695 -100.7 -100.705 -100.71 -100.715 -100.72 -100.725 -100.73 -100.735 -100.74 -100.745 -100.75 -100.755 -100.76 -100.765 -100.77 -100.775 -100.78 -100.785 -100.79 -100.795 -100.8 -100.805 -100.81 -100.815 -100.82 -100.825 -100.83 -100.835 -100.84 -100.845 -100.85 -100.855 -100.86 -100.865 -100.87 -100.875 -100.88 -100.885 -100.89 -100.895 -100.9 -100.905 -100.91 -100.915 -100.92 -100.925 -100.93 -100.935 -100.94 -100.945 -100.95 -100.955 -100.96 -100.965 -100.97 -100.975 -100.98 -100.985 -100.99 -100.995 -101 -101.005 -101.01 -101.015 -101.02 -101.025 -101.03 -101.035 -101.04 -101.045 -101.05 -101.055 -101.06 -101.065 -101.07 -101.075 -101.08 -101.085 -101.09 -101.095 -101.1 -101.105 -101.11 -101.115 -101.12 -101.125 -101.13 -101.135 -101.14 -101.145 -101.15 -101.155 -101.16 -101.165 -101.17 -101.175 -101.18 -101.185 -101.19 -101.195 -101.2 -101.205 -101.21 -101.215 -101.22 -101.225 -101.23 -101.235 -101.24 -101.245 -101.25 -101.255 -101.26 -101.265 -101.27 -101.275 -101.28 -101.285 -101.29 -101.295 -101.3 -101.305 -101.31 -101.315 -101.32 -101.325 -101.33 -101.335 -101.34 -101.345 -101.35 -101.355 -101.36 -101.365 -101.37 -101.375 -101.38 -101.385 -101.39 -101.395 -101.4 -101.405 -101.41 -101.415 -101.42 -101.425 -101.43 -101.435 -101.44 -101.445 -101.45 -101.455 -101.46 -101.465 -101.47 -101.475 -101.48 -101.485 -101.49 -101.495 -101.5 -101.505 -101.51 -101.515 -101.52 -101.525 -101.53 -101.535 -101.54 -101.545 -101.55 -101.555 -101.56 -101.565 -101.57 -101.575 -101.58 -101.585 -101.59 -101.595 -101.6 -101.605 -101.61 -101.615 -101.62 -101.625 -101.63 -101.635 -101.64 -101.645 -101.65 -101.655 -101.66 -101.665 -101.67 -101.675 -101.68 -101.685 -101.69 -101.695 -101.7 -101.705 -101.71 -101.715 -101.72 -101.725 -101.73 -101.735 -101.74 -101.745 -101.75 -101.755 -101.76 -101.765 -101.77 -101.775 -101.78 -101.785 -101.79 -101.795 -101.8 -101.805 -101.81 -101.815 -101.82 -101.825 -101.83 -101.835 -101.84 -101.845 -101.85 -101.855 -101.86 -101.865 -101.87 -101.875 -101.88 -101.885 -101.89 -101.895 -101.9 -101.905 -101.91 -101.915 -101.92 -101.925 -101.93 -101.935 -101.94 -101.945 -101.95 -101.955 -101.96 -101.965 -101.97 -101.975 -101.98 -101.985 -101.99 -101.995 -102 -102.005 -102.01 -102.015 -102.02 -102.025 -102.03 -102.035 -102.04 -102.045 -102.05 -102.055 -102.06 -102.065 -102.07 -102.075 -102.08 -102.085 -102.09 -102.095 -102.1 -102.105 -102.11 -102.115 -102.12 -102.125 -102.13 -102.135 -102.14 -102.145 -102.15 -102.155 -102.16 -102.165 -102.17 -102.175 -102.18 -102.185 -102.19 -102.195 -102.2 -102.205 -102.21 -102.215 -102.22 -102.225 -102.23 -102.235 -102.24 -102.245 -102.25 -102.255 -102.26 -102.265 -102.27 -102.275 -102.28 -102.285 -102.29 -102.295 -102.3 -102.305 -102.31 -102.315 -102.32 -102.325 -102.33 -102.335 -102.34 -102.345 -102.35 -102.355 -102.36 -102.365 -102.37 -102.375 -102.38 -102.385 -102.39 -102.395 -102.4 -102.405 -102.41 -102.415 -102.42 -102.425 -102.43 -102.435 -102.44 -102.445 -102.45 -102.455 -102.46 -102.465 -102.47 -102.475 -102.48 -102.485 -102.49 -102.495 -102.5 -102.505 -102.51 -102.515 -102.52 -102.525 -102.53 -102.535 -102.54 -102.545 -102.55 -102.555 -102.56 -102.565 -102.57 -102.575 -102.58 -102.585 -102.59 -102.595 -102.6 -102.605 -102.61 -102.615 -102.62 -102.625 -102.63 -102.635 -102.64 -102.645 -102.65 -102.655 -102.66 -102.665 -102.67 -102.675 -102.68 -102.685 -102.69 -102.695 -102.7 -102.705 -102.71 -102.715 -102.72 -102.725 -102.73 -102.735 -102.74 -102.745 -102.75 -102.755 -102.76 -102.765 -102.77 -102.775 -102.78 -102.785 -102.79 -102.795 -102.8 -102.805 -102.81 -102.815 -102.82 -102.825 -102.83 -102.835 -102.84 -102.845 -102.85 -102.855 -102.86 -102.865 -102.87 -102.875 -102.88 -102.885 -102.89 -102.895 -102.9 -102.905 -102.91 -102.915 -102.92 -102.925 -102.93 -102.935 -102.94 -102.945 -102.95 -102.955 -102.96 -102.965 -102.97 -102.975 -102.98 -102.985 -102.99 -102.995 -103 -103.005 -103.01 -103.015 -103.02 -103.025 -103.03 -103.035 -103.04 -103.045 -103.05 -103.055 -103.06 -103.065 -103.07 -103.075 -103.08 -103.085 -103.09 -103.095 -103.1 -103.105 -103.11 -103.115 -103.12 -103.125 -103.13 -103.135 -103.14 -103.145 -103.15 -103.155 -103.16 -103.165 -103.17 -103.175 -103.18 -103.185 -103.19 -103.195 -103.2 -103.205 -103.21 -103.215 -103.22 -103.225 -103.23 -103.235 -103.24 -103.245 -103.25 -103.255 -103.26 -103.265 -103.27 -103.275 -103.28 -103.285 -103.29 -103.295 -103.3 -103.305 -103.31 -103.315 -103.32 -103.325 -103.33 -103.335 -103.34 -103.345 -103.35 -103.355 -103.36 -103.365 -103.37 -103.375 -103.38 -103.385 -103.39 -103.395 -103.4 -103.405 -103.41 -103.415 -103.42 -103.425 -103.43 -103.435 -103.44 -103.445 -103.45 -103.455 -103.46 -103.465 -103.47 -103.475 -103.48 -103.485 -103.49 -103.495 -103.5 -103.505 -103.51 -103.515 -103.52 -103.525 -103.53 -103.535 -103.54 -103.545 -103.55 -103.555 -103.56 -103.565 -103.57 -103.575 -103.58 -103.585 -103.59 -103.595 -103.6 -103.605 -103.61 -103.615 -103.62 -103.625 -103.63 -103.635 -103.64 -103.645 -103.65 -103.655 -103.66 -103.665 -103.67 -103.675 -103.68 -103.685 -103.69 -103.695 -103.7 -103.705 -103.71 -103.715 -103.72 -103.725 -103.73 -103.735 -103.74 -103.745 -103.75 -103.755 -103.76 -103.765 -103.77 -103.775 -103.78 -103.785 -103.79 -103.795 -103.8 -103.805 -103.81 -103.815 -103.82 -103.825 -103.83 -103.835 -103.84 -103.845 -103.85 -103.855 -103.86 -103.865 -103.87 -103.875 -103.88 -103.885 -103.89 -103.895 -103.9 -103.905 -103.91 -103.915 -103.92 -103.925 -103.93 -103.935 -103.94 -103.945 -103.95 -103.955 -103.96 -103.965 -103.97 -103.975 -103.98 -103.985 -103.99 -103.995 -104 -104.005 -104.01 -104.015 -104.02 -104.025 -104.03 -104.035 -104.04 -104.045 -104.05 -104.055 -104.06 -104.065 -104.07 -104.075 -104.08 -104.085 -104.09 -104.095 -104.1 -104.105 -104.11 -104.115 -104.12 -104.125 -104.13 -104.135 -104.14 -104.145 -104.15 -104.155 -104.16 -104.165 -104.17 -104.175 -104.18 -104.185 -104.19 -104.195 -104.2 -104.205 -104.21 -104.215 -104.22 -104.225 -104.23 -104.235 -104.24 -104.245 -104.25 -104.255 -104.26 -104.265 -104.27 -104.275 -104.28 -104.285 -104.29 -104.295 -104.3 -104.305 -104.31 -104.315 -104.32 -104.325 -104.33 -104.335 -104.34 -104.345 -104.35 -104.355 -104.36 -104.365 -104.37 -104.375 -104.38 -104.385 -104.39 -104.395 -104.4 -104.405 -104.41 -104.415 -104.42 -104.425 -104.43 -104.435 -104.44 -104.445 -104.45 -104.455 -104.46 -104.465 -104.47 -104.475 -104.48 -104.485 -104.49 -104.495 -104.5 -104.505 -104.51 -104.515 -104.52 -104.525 -104.53 -104.535 -104.54 -104.545 -104.55 -104.555 -104.56 -104.565 -104.57 -104.575 -104.58 -104.585 -104.59 -104.595 -104.6 -104.605 -104.61 -104.615 -104.62 -104.625 -104.63 -104.635 -104.64 -104.645 -104.65 -104.655 -104.66 -104.665 -104.67 -104.675 -104.68 -104.685 -104.69 -104.695 -104.7 -104.705 -104.71 -104.715 -104.72 -104.725 -104.73 -104.735 -104.74 -104.745 -104.75 -104.755 -104.76 -104.765 -104.77 -104.775 -104.78 -104.785 -104.79 -104.795 -104.8 -104.805 -104.81 -104.815 -104.82 -104.825 -104.83 -104.835 -104.84 -104.845 -104.85 -104.855 -104.86 -104.865 -104.87 -104.875 -104.88 -104.885 -104.89 -104.895 -104.9 -104.905 -104.91 -104.915 -104.92 -104.925 -104.93 -104.935 -104.94 -104.945 -104.95 -104.955 -104.96 -104.965 -104.97 -104.975 -104.98 -104.985 -104.99 -104.995 -105 -105.005 -105.01 -105.015 -105.02 -105.025 -105.03 -105.035 -105.04 -105.045 -105.05 -105.055 -105.06 -105.065 -105.07 -105.075 -105.08 -105.085 -105.09 -105.095 -105.1 -105.105 -105.11 -105.115 -105.12 -105.125 -105.13 -105.135 -105.14 -105.145 -105.15 -105.155 -105.16 -105.165 -105.17 -105.175 -105.18 -105.185 -105.19 -105.195 -105.2 -105.205 -105.21 -105.215 -105.22 -105.225 -105.23 -105.235 -105.24 -105.245 -105.25 -105.255 -105.26 -105.265 -105.27 -105.275 -105.28 -105.285 -105.29 -105.295 -105.3 -105.305 -105.31 -105.315 -105.32 -105.325 -105.33 -105.335 -105.34 -105.345 -105.35 -105.355 -105.36 -105.365 -105.37 -105.375 -105.38 -105.385 -105.39 -105.395 -105.4 -105.405 -105.41 -105.415 -105.42 -105.425 -105.43 -105.435 -105.44 -105.445 -105.45 -105.455 -105.46 -105.465 -105.47 -105.475 -105.48 -105.485 -105.49 -105.495 -105.5 -105.505 -105.51 -105.515 -105.52 -105.525 -105.53 -105.535 -105.54 -105.545 -105.55 -105.555 -105.56 -105.565 -105.57 -105.575 -105.58 -105.585 -105.59 -105.595 -105.6 -105.605 -105.61 -105.615 -105.62 -105.625 -105.63 -105.635 -105.64 -105.645 -105.65 -105.655 -105.66 -105.665 -105.67 -105.675 -105.68 -105.685 -105.69 -105.695 -105.7 -105.705 -105.71 -105.715 -105.72 -105.725 -105.73 -105.735 -105.74 -105.745 -105.75 -105.755 -105.76 -105.765 -105.77 -105.775 -105.78 -105.785 -105.79 -105.795 -105.8 -105.805 -105.81 -105.815 -105.82 -105.825 -105.83 -105.835 -105.84 -105.845 -105.85 -105.855 -105.86 -105.865 -105.87 -105.875 -105.88 -105.885 -105.89 -105.895 -105.9 -105.905 -105.91 -105.915 -105.92 -105.925 -105.93 -105.935 -105.94 -105.945 -105.95 -105.955 -105.96 -105.965 -105.97 -105.975 -105.98 -105.985 -105.99 -105.995 -106 -106.005 -106.01 -106.015 -106.02 -106.025 -106.03 -106.035 -106.04 -106.045 -106.05 -106.055 -106.06 -106.065 -106.07 -106.075 -106.08 -106.085 -106.09 -106.095 -106.1 -106.105 -106.11 -106.115 -106.12 -106.125 -106.13 -106.135 -106.14 -106.145 -106.15 -106.155 -106.16 -106.165 -106.17 -106.175 -106.18 -106.185 -106.19 -106.195 -106.2 -106.205 -106.21 -106.215 -106.22 -106.225 -106.23 -106.235 -106.24 -106.245 -106.25 -106.255 -106.26 -106.265 -106.27 -106.275 -106.28 -106.285 -106.29 -106.295 -106.3 -106.305 -106.31 -106.315 -106.32 -106.325 -106.33 -106.335 -106.34 -106.345 -106.35 -106.355 -106.36 -106.365 -106.37 -106.375 -106.38 -106.385 -106.39 -106.395 -106.4 -106.405 -106.41 -106.415 -106.42 -106.425 -106.43 -106.435 -106.44 -106.445 -106.45 -106.455 -106.46 -106.465 -106.47 -106.475 -106.48 -106.485 -106.49 -106.495 -106.5 -106.505 -106.51 -106.515 -106.52 -106.525 -106.53 -106.535 -106.54 -106.545 -106.55 -106.555 -106.56 -106.565 -106.57 -106.575 -106.58 -106.585 -106.59 -106.595 -106.6 -106.605 -106.61 -106.615 -106.62 -106.625 -106.63 -106.635 -106.64 -106.645 -106.65 -106.655 -106.66 -106.665 -106.67 -106.675 -106.68 -106.685 -106.69 -106.695 -106.7 -106.705 -106.71 -106.715 -106.72 -106.725 -106.73 -106.735 -106.74 -106.745 -106.75 -106.755 -106.76 -106.765 -106.77 -106.775 -106.78 -106.785 -106.79 -106.795 -106.8 -106.805 -106.81 -106.815 -106.82 -106.825 -106.83 -106.835 -106.84 -106.845 -106.85 -106.855 -106.86 -106.865 -106.87 -106.875 -106.88 -106.885 -106.89 -106.895 -106.9 -106.905 -106.91 -106.915 -106.92 -106.925 -106.93 -106.935 -106.94 -106.945 -106.95 -106.955 -106.96 -106.965 -106.97 -106.975 -106.98 -106.985 -106.99 -106.995 -107 -107.005 -107.01 -107.015 -107.02 -107.025 -107.03 -107.035 -107.04 -107.045 -107.05 -107.055 -107.06 -107.065 -107.07 -107.075 -107.08 -107.085 -107.09 -107.095 -107.1 -107.105 -107.11 -107.115 -107.12 -107.125 -107.13 -107.135 -107.14 -107.145 -107.15 -107.155 -107.16 -107.165 -107.17 -107.175 -107.18 -107.185 -107.19 -107.195 -107.2 -107.205 -107.21 -107.215 -107.22 -107.225 -107.23 -107.235 -107.24 -107.245 -107.25 -107.255 -107.26 -107.265 -107.27 -107.275 -107.28 -107.285 -107.29 -107.295 -107.3 -107.305 -107.31 -107.315 -107.32 -107.325 -107.33 -107.335 -107.34 -107.345 -107.35 -107.355 -107.36 -107.365 -107.37 -107.375 -107.38 -107.385 -107.39 -107.395 -107.4 -107.405 -107.41 -107.415 -107.42 -107.425 -107.43 -107.435 -107.44 -107.445 -107.45 -107.455 -107.46 -107.465 -107.47 -107.475 -107.48 -107.485 -107.49 -107.495 -107.5 -107.505 -107.51 -107.515 -107.52 -107.525 -107.53 -107.535 -107.54 -107.545 -107.55 -107.555 -107.56 -107.565 -107.57 -107.575 -107.58 -107.585 -107.59 -107.595 -107.6 -107.605 -107.61 -107.615 -107.62 -107.625 -107.63 -107.635 -107.64 -107.645 -107.65 -107.655 -107.66 -107.665 -107.67 -107.675 -107.68 -107.685 -107.69 -107.695 -107.7 -107.705 -107.71 -107.715 -107.72 -107.725 -107.73 -107.735 -107.74 -107.745 -107.75 -107.755 -107.76 -107.765 -107.77 -107.775 -107.78 -107.785 -107.79 -107.795 -107.8 -107.805 -107.81 -107.815 -107.82 -107.825 -107.83 -107.835 -107.84 -107.845 -107.85 -107.855 -107.86 -107.865 -107.87 -107.875 -107.88 -107.885 -107.89 -107.895 -107.9 -107.905 -107.91 -107.915 -107.92 -107.925 -107.93 -107.935 -107.94 -107.945 -107.95 -107.955 -107.96 -107.965 -107.97 -107.975 -107.98 -107.985 -107.99 -107.995 -108 -108.005 -108.01 -108.015 -108.02 -108.025 -108.03 -108.035 -108.04 -108.045 -108.05 -108.055 -108.06 -108.065 -108.07 -108.075 -108.08 -108.085 -108.09 -108.095 -108.1 -108.105 -108.11 -108.115 -108.12 -108.125 -108.13 -108.135 -108.14 -108.145 -108.15 -108.155 -108.16 -108.165 -108.17 -108.175 -108.18 -108.185 -108.19 -108.195 -108.2 -108.205 -108.21 -108.215 -108.22 -108.225 -108.23 -108.235 -108.24 -108.245 -108.25 -108.255 -108.26 -108.265 -108.27 -108.275 -108.28 -108.285 -108.29 -108.295 -108.3 -108.305 -108.31 -108.315 -108.32 -108.325 -108.33 -108.335 -108.34 -108.345 -108.35 -108.355 -108.36 -108.365 -108.37 -108.375 -108.38 -108.385 -108.39 -108.395 -108.4 -108.405 -108.41 -108.415 -108.42 -108.425 -108.43 -108.435 -108.44 -108.445 -108.45 -108.455 -108.46 -108.465 -108.47 -108.475 -108.48 -108.485 -108.49 -108.495 -108.5 -108.505 -108.51 -108.515 -108.52 -108.525 -108.53 -108.535 -108.54 -108.545 -108.55 -108.555 -108.56 -108.565 -108.57 -108.575 -108.58 -108.585 -108.59 -108.595 -108.6 -108.605 -108.61 -108.615 -108.62 -108.625 -108.63 -108.635 -108.64 -108.645 -108.65 -108.655 -108.66 -108.665 -108.67 -108.675 -108.68 -108.685 -108.69 -108.695 -108.7 -108.705 -108.71 -108.715 -108.72 -108.725 -108.73 -108.735 -108.74 -108.745 -108.75 -108.755 -108.76 -108.765 -108.77 -108.775 -108.78 -108.785 -108.79 -108.795 -108.8 -108.805 -108.81 -108.815 -108.82 -108.825 -108.83 -108.835 -108.84 -108.845 -108.85 -108.855 -108.86 -108.865 -108.87 -108.875 -108.88 -108.885 -108.89 -108.895 -108.9 -108.905 -108.91 -108.915 -108.92 -108.925 -108.93 -108.935 -108.94 -108.945 -108.95 -108.955 -108.96 -108.965 -108.97 -108.975 -108.98 -108.985 -108.99 -108.995 -109 -109.005 -109.01 -109.015 -109.02 -109.025 -109.03 -109.035 -109.04 -109.045 -109.05 -109.055 -109.06 -109.065 -109.07 -109.075 -109.08 -109.085 -109.09 -109.095 -109.1 -109.105 -109.11 -109.115 -109.12 -109.125 -109.13 -109.135 -109.14 -109.145 -109.15 -109.155 -109.16 -109.165 -109.17 -109.175 -109.18 -109.185 -109.19 -109.195 -109.2 -109.205 -109.21 -109.215 -109.22 -109.225 -109.23 -109.235 -109.24 -109.245 -109.25 -109.255 -109.26 -109.265 -109.27 -109.275 -109.28 -109.285 -109.29 -109.295 -109.3 -109.305 -109.31 -109.315 -109.32 -109.325 -109.33 -109.335 -109.34 -109.345 -109.35 -109.355 -109.36 -109.365 -109.37 -109.375 -109.38 -109.385 -109.39 -109.395 -109.4 -109.405 -109.41 -109.415 -109.42 -109.425 -109.43 -109.435 -109.44 -109.445 -109.45 -109.455 -109.46 -109.465 -109.47 -109.475 -109.48 -109.485 -109.49 -109.495 -109.5 -109.505 -109.51 -109.515 -109.52 -109.525 -109.53 -109.535 -109.54 -109.545 -109.55 -109.555 -109.56 -109.565 -109.57 -109.575 -109.58 -109.585 -109.59 -109.595 -109.6 -109.605 -109.61 -109.615 -109.62 -109.625 -109.63 -109.635 -109.64 -109.645 -109.65 -109.655 -109.66 -109.665 -109.67 -109.675 -109.68 -109.685 -109.69 -109.695 -109.7 -109.705 -109.71 -109.715 -109.72 -109.725 -109.73 -109.735 -109.74 -109.745 -109.75 -109.755 -109.76 -109.765 -109.77 -109.775 -109.78 -109.785 -109.79 -109.795 -109.8 -109.805 -109.81 -109.815 -109.82 -109.825 -109.83 -109.835 -109.84 -109.845 -109.85 -109.855 -109.86 -109.865 -109.87 -109.875 -109.88 -109.885 -109.89 -109.895 -109.9 -109.905 -109.91 -109.915 -109.92 -109.925 -109.93 -109.935 -109.94 -109.945 -109.95 -109.955 -109.96 -109.965 -109.97 -109.975 -109.98 -109.985 -109.99 -109.995 -110 -110.005 -110.01 -110.015 -110.02 -110.025 -110.03 -110.035 -110.04 -110.045 -110.05 -110.055 -110.06 -110.065 -110.07 -110.075 -110.08 -110.085 -110.09 -110.095 -110.1 -110.105 -110.11 -110.115 -110.12 -110.125 -110.13 -110.135 -110.14 -110.145 -110.15 -110.155 -110.16 -110.165 -110.17 -110.175 -110.18 -110.185 -110.19 -110.195 -110.2 -110.205 -110.21 -110.215 -110.22 -110.225 -110.23 -110.235 -110.24 -110.245 -110.25 -110.255 -110.26 -110.265 -110.27 -110.275 -110.28 -110.285 -110.29 -110.295 -110.3 -110.305 -110.31 -110.315 -110.32 -110.325 -110.33 -110.335 -110.34 -110.345 -110.35 -110.355 -110.36 -110.365 -110.37 -110.375 -110.38 -110.385 -110.39 -110.395 -110.4 -110.405 -110.41 -110.415 -110.42 -110.425 -110.43 -110.435 -110.44 -110.445 -110.45 -110.455 -110.46 -110.465 -110.47 -110.475 -110.48 -110.485 -110.49 -110.495 -110.5 -110.505 -110.51 -110.515 -110.52 -110.525 -110.53 -110.535 -110.54 -110.545 -110.55 -110.555 -110.56 -110.565 -110.57 -110.575 -110.58 -110.585 -110.59 -110.595 -110.6 -110.605 -110.61 -110.615 -110.62 -110.625 -110.63 -110.635 -110.64 -110.645 -110.65 -110.655 -110.66 -110.665 -110.67 -110.675 -110.68 -110.685 -110.69 -110.695 -110.7 -110.705 -110.71 -110.715 -110.72 -110.725 -110.73 -110.735 -110.74 -110.745 -110.75 -110.755 -110.76 -110.765 -110.77 -110.775 -110.78 -110.785 -110.79 -110.795 -110.8 -110.805 -110.81 -110.815 -110.82 -110.825 -110.83 -110.835 -110.84 -110.845 -110.85 -110.855 -110.86 -110.865 -110.87 -110.875 -110.88 -110.885 -110.89 -110.895 -110.9 -110.905 -110.91 -110.915 -110.92 -110.925 -110.93 -110.935 -110.94 -110.945 -110.95 -110.955 -110.96 -110.965 -110.97 -110.975 -110.98 -110.985 -110.99 -110.995 -111 -111.005 -111.01 -111.015 -111.02 -111.025 -111.03 -111.035 -111.04 -111.045 -111.05 -111.055 -111.06 -111.065 -111.07 -111.075 -111.08 -111.085 -111.09 -111.095 -111.1 -111.105 -111.11 -111.115 -111.12 -111.125 -111.13 -111.135 -111.14 -111.145 -111.15 -111.155 -111.16 -111.165 -111.17 -111.175 -111.18 -111.185 -111.19 -111.195 -111.2 -111.205 -111.21 -111.215 -111.22 -111.225 -111.23 -111.235 -111.24 -111.245 -111.25 -111.255 -111.26 -111.265 -111.27 -111.275 -111.28 -111.285 -111.29 -111.295 -111.3 -111.305 -111.31 -111.315 -111.32 -111.325 -111.33 -111.335 -111.34 -111.345 -111.35 -111.355 -111.36 -111.365 -111.37 -111.375 -111.38 -111.385 -111.39 -111.395 -111.4 -111.405 -111.41 -111.415 -111.42 -111.425 -111.43 -111.435 -111.44 -111.445 -111.45 -111.455 -111.46 -111.465 -111.47 -111.475 -111.48 -111.485 -111.49 -111.495 -111.5 -111.505 -111.51 -111.515 -111.52 -111.525 -111.53 -111.535 -111.54 -111.545 -111.55 -111.555 -111.56 -111.565 -111.57 -111.575 -111.58 -111.585 -111.59 -111.595 -111.6 -111.605 -111.61 -111.615 -111.62 -111.625 -111.63 -111.635 -111.64 -111.645 -111.65 -111.655 -111.66 -111.665 -111.67 -111.675 -111.68 -111.685 -111.69 -111.695 -111.7 -111.705 -111.71 -111.715 -111.72 -111.725 -111.73 -111.735 -111.74 -111.745 -111.75 -111.755 -111.76 -111.765 -111.77 -111.775 -111.78 -111.785 -111.79 -111.795 -111.8 -111.805 -111.81 -111.815 -111.82 -111.825 -111.83 -111.835 -111.84 -111.845 -111.85 -111.855 -111.86 -111.865 -111.87 -111.875 -111.88 -111.885 -111.89 -111.895 -111.9 -111.905 -111.91 -111.915 -111.92 -111.925 -111.93 -111.935 -111.94 -111.945 -111.95 -111.955 -111.96 -111.965 -111.97 -111.975 -111.98 -111.985 -111.99 -111.995 -112 -112.005 -112.01 -112.015 -112.02 -112.025 -112.03 -112.035 -112.04 -112.045 -112.05 -112.055 -112.06 -112.065 -112.07 -112.075 -112.08 -112.085 -112.09 -112.095 -112.1 -112.105 -112.11 -112.115 -112.12 -112.125 -112.13 -112.135 -112.14 -112.145 -112.15 -112.155 -112.16 -112.165 -112.17 -112.175 -112.18 -112.185 -112.19 -112.195 -112.2 -112.205 -112.21 -112.215 -112.22 -112.225 -112.23 -112.235 -112.24 -112.245 -112.25 -112.255 -112.26 -112.265 -112.27 -112.275 -112.28 -112.285 -112.29 -112.295 -112.3 -112.305 -112.31 -112.315 -112.32 -112.325 -112.33 -112.335 -112.34 -112.345 -112.35 -112.355 -112.36 -112.365 -112.37 -112.375 -112.38 -112.385 -112.39 -112.395 -112.4 -112.405 -112.41 -112.415 -112.42 -112.425 -112.43 -112.435 -112.44 -112.445 -112.45 -112.455 -112.46 -112.465 -112.47 -112.475 -112.48 -112.485 -112.49 -112.495 -112.5 -112.505 -112.51 -112.515 -112.52 -112.525 -112.53 -112.535 -112.54 -112.545 -112.55 -112.555 -112.56 -112.565 -112.57 -112.575 -112.58 -112.585 -112.59 -112.595 -112.6 -112.605 -112.61 -112.615 -112.62 -112.625 -112.63 -112.635 -112.64 -112.645 -112.65 -112.655 -112.66 -112.665 -112.67 -112.675 -112.68 -112.685 -112.69 -112.695 -112.7 -112.705 -112.71 -112.715 -112.72 -112.725 -112.73 -112.735 -112.74 -112.745 -112.75 -112.755 -112.76 -112.765 -112.77 -112.775 -112.78 -112.785 -112.79 -112.795 -112.8 -112.805 -112.81 -112.815 -112.82 -112.825 -112.83 -112.835 -112.84 -112.845 -112.85 -112.855 -112.86 -112.865 -112.87 -112.875 -112.88 -112.885 -112.89 -112.895 -112.9 -112.905 -112.91 -112.915 -112.92 -112.925 -112.93 -112.935 -112.94 -112.945 -112.95 -112.955 -112.96 -112.965 -112.97 -112.975 -112.98 -112.985 -112.99 -112.995 -113 -113.005 -113.01 -113.015 -113.02 -113.025 -113.03 -113.035 -113.04 -113.045 -113.05 -113.055 -113.06 -113.065 -113.07 -113.075 -113.08 -113.085 -113.09 -113.095 -113.1 -113.105 -113.11 -113.115 -113.12 -113.125 -113.13 -113.135 -113.14 -113.145 -113.15 -113.155 -113.16 -113.165 -113.17 -113.175 -113.18 -113.185 -113.19 -113.195 -113.2 -113.205 -113.21 -113.215 -113.22 -113.225 -113.23 -113.235 -113.24 -113.245 -113.25 -113.255 -113.26 -113.265 -113.27 -113.275 -113.28 -113.285 -113.29 -113.295 -113.3 -113.305 -113.31 -113.315 -113.32 -113.325 -113.33 -113.335 -113.34 -113.345 -113.35 -113.355 -113.36 -113.365 -113.37 -113.375 -113.38 -113.385 -113.39 -113.395 -113.4 -113.405 -113.41 -113.415 -113.42 -113.425 -113.43 -113.435 -113.44 -113.445 -113.45 -113.455 -113.46 -113.465 -113.47 -113.475 -113.48 -113.485 -113.49 -113.495 -113.5 -113.505 -113.51 -113.515 -113.52 -113.525 -113.53 -113.535 -113.54 -113.545 -113.55 -113.555 -113.56 -113.565 -113.57 -113.575 -113.58 -113.585 -113.59 -113.595 -113.6 -113.605 -113.61 -113.615 -113.62 -113.625 -113.63 -113.635 -113.64 -113.645 -113.65 -113.655 -113.66 -113.665 -113.67 -113.675 -113.68 -113.685 -113.69 -113.695 -113.7 -113.705 -113.71 -113.715 -113.72 -113.725 -113.73 -113.735 -113.74 -113.745 -113.75 -113.755 -113.76 -113.765 -113.77 -113.775 -113.78 -113.785 -113.79 -113.795 -113.8 -113.805 -113.81 -113.815 -113.82 -113.825 -113.83 -113.835 -113.84 -113.845 -113.85 -113.855 -113.86 -113.865 -113.87 -113.875 -113.88 -113.885 -113.89 -113.895 -113.9 -113.905 -113.91 -113.915 -113.92 -113.925 -113.93 -113.935 -113.94 -113.945 -113.95 -113.955 -113.96 -113.965 -113.97 -113.975 -113.98 -113.985 -113.99 -113.995 -114 -114.005 -114.01 -114.015 -114.02 -114.025 -114.03 -114.035 -114.04 -114.045 -114.05 -114.055 -114.06 -114.065 -114.07 -114.075 -114.08 -114.085 -114.09 -114.095 -114.1 -114.105 -114.11 -114.115 -114.12 -114.125 -114.13 -114.135 -114.14 -114.145 -114.15 -114.155 -114.16 -114.165 -114.17 -114.175 -114.18 -114.185 -114.19 -114.195 -114.2 -114.205 -114.21 -114.215 -114.22 -114.225 -114.23 -114.235 -114.24 -114.245 -114.25 -114.255 -114.26 -114.265 -114.27 -114.275 -114.28 -114.285 -114.29 -114.295 -114.3 -114.305 -114.31 -114.315 -114.32 -114.325 -114.33 -114.335 -114.34 -114.345 -114.35 -114.355 -114.36 -114.365 -114.37 -114.375 -114.38 -114.385 -114.39 -114.395 -114.4 -114.405 -114.41 -114.415 -114.42 -114.425 -114.43 -114.435 -114.44 -114.445 -114.45 -114.455 -114.46 -114.465 -114.47 -114.475 -114.48 -114.485 -114.49 -114.495 -114.5 -114.505 -114.51 -114.515 -114.52 -114.525 -114.53 -114.535 -114.54 -114.545 -114.55 -114.555 -114.56 -114.565 -114.57 -114.575 -114.58 -114.585 -114.59 -114.595 -114.6 -114.605 -114.61 -114.615 -114.62 -114.625 -114.63 -114.635 -114.64 -114.645 -114.65 -114.655 -114.66 -114.665 -114.67 -114.675 -114.68 -114.685 -114.69 -114.695 -114.7 -114.705 -114.71 -114.715 -114.72 -114.725 -114.73 -114.735 -114.74 -114.745 -114.75 -114.755 -114.76 -114.765 -114.77 -114.775 -114.78 -114.785 -114.79 -114.795 -114.8 -114.805 -114.81 -114.815 -114.82 -114.825 -114.83 -114.835 -114.84 -114.845 -114.85 -114.855 -114.86 -114.865 -114.87 -114.875 -114.88 -114.885 -114.89 -114.895 -114.9 -114.905 -114.91 -114.915 -114.92 -114.925 -114.93 -114.935 -114.94 -114.945 -114.95 -114.955 -114.96 -114.965 -114.97 -114.975 -114.98 -114.985 -114.99 -114.995 -115 -115.005 -115.01 -115.015 -115.02 -115.025 -115.03 -115.035 -115.04 -115.045 -115.05 -115.055 -115.06 -115.065 -115.07 -115.075 -115.08 -115.085 -115.09 -115.095 -115.1 -115.105 -115.11 -115.115 -115.12 -115.125 -115.13 -115.135 -115.14 -115.145 -115.15 -115.155 -115.16 -115.165 -115.17 -115.175 -115.18 -115.185 -115.19 -115.195 -115.2 -115.205 -115.21 -115.215 -115.22 -115.225 -115.23 -115.235 -115.24 -115.245 -115.25 -115.255 -115.26 -115.265 -115.27 -115.275 -115.28 -115.285 -115.29 -115.295 -115.3 -115.305 -115.31 -115.315 -115.32 -115.325 -115.33 -115.335 -115.34 -115.345 -115.35 -115.355 -115.36 -115.365 -115.37 -115.375 -115.38 -115.385 -115.39 -115.395 -115.4 -115.405 -115.41 -115.415 -115.42 -115.425 -115.43 -115.435 -115.44 -115.445 -115.45 -115.455 -115.46 -115.465 -115.47 -115.475 -115.48 -115.485 -115.49 -115.495 -115.5 -115.505 -115.51 -115.515 -115.52 -115.525 -115.53 -115.535 -115.54 -115.545 -115.55 -115.555 -115.56 -115.565 -115.57 -115.575 -115.58 -115.585 -115.59 -115.595 -115.6 -115.605 -115.61 -115.615 -115.62 -115.625 -115.63 -115.635 -115.64 -115.645 -115.65 -115.655 -115.66 -115.665 -115.67 -115.675 -115.68 -115.685 -115.69 -115.695 -115.7 -115.705 -115.71 -115.715 -115.72 -115.725 -115.73 -115.735 -115.74 -115.745 -115.75 -115.755 -115.76 -115.765 -115.77 -115.775 -115.78 -115.785 -115.79 -115.795 -115.8 -115.805 -115.81 -115.815 -115.82 -115.825 -115.83 -115.835 -115.84 -115.845 -115.85 -115.855 -115.86 -115.865 -115.87 -115.875 -115.88 -115.885 -115.89 -115.895 -115.9 -115.905 -115.91 -115.915 -115.92 -115.925 -115.93 -115.935 -115.94 -115.945 -115.95 -115.955 -115.96 -115.965 -115.97 -115.975 -115.98 -115.985 -115.99 -115.995 -116 -116.005 -116.01 -116.015 -116.02 -116.025 -116.03 -116.035 -116.04 -116.045 -116.05 -116.055 -116.06 -116.065 -116.07 -116.075 -116.08 -116.085 -116.09 -116.095 -116.1 -116.105 -116.11 -116.115 -116.12 -116.125 -116.13 -116.135 -116.14 -116.145 -116.15 -116.155 -116.16 -116.165 -116.17 -116.175 -116.18 -116.185 -116.19 -116.195 -116.2 -116.205 -116.21 -116.215 -116.22 -116.225 -116.23 -116.235 -116.24 -116.245 -116.25 -116.255 -116.26 -116.265 -116.27 -116.275 -116.28 -116.285 -116.29 -116.295 -116.3 -116.305 -116.31 -116.315 -116.32 -116.325 -116.33 -116.335 -116.34 -116.345 -116.35 -116.355 -116.36 -116.365 -116.37 -116.375 -116.38 -116.385 -116.39 -116.395 -116.4 -116.405 -116.41 -116.415 -116.42 -116.425 -116.43 -116.435 -116.44 -116.445 -116.45 -116.455 -116.46 -116.465 -116.47 -116.475 -116.48 -116.485 -116.49 -116.495 -116.5 -116.505 -116.51 -116.515 -116.52 -116.525 -116.53 -116.535 -116.54 -116.545 -116.55 -116.555 -116.56 -116.565 -116.57 -116.575 -116.58 -116.585 -116.59 -116.595 -116.6 -116.605 -116.61 -116.615 -116.62 -116.625 -116.63 -116.635 -116.64 -116.645 -116.65 -116.655 -116.66 -116.665 -116.67 -116.675 -116.68 -116.685 -116.69 -116.695 -116.7 -116.705 -116.71 -116.715 -116.72 -116.725 -116.73 -116.735 -116.74 -116.745 -116.75 -116.755 -116.76 -116.765 -116.77 -116.775 -116.78 -116.785 -116.79 -116.795 -116.8 -116.805 -116.81 -116.815 -116.82 -116.825 -116.83 -116.835 -116.84 -116.845 -116.85 -116.855 -116.86 -116.865 -116.87 -116.875 -116.88 -116.885 -116.89 -116.895 -116.9 -116.905 -116.91 -116.915 -116.92 -116.925 -116.93 -116.935 -116.94 -116.945 -116.95 -116.955 -116.96 -116.965 -116.97 -116.975 -116.98 -116.985 -116.99 -116.995 -117 -117.005 -117.01 -117.015 -117.02 -117.025 -117.03 -117.035 -117.04 -117.045 -117.05 -117.055 -117.06 -117.065 -117.07 -117.075 -117.08 -117.085 -117.09 -117.095 -117.1 -117.105 -117.11 -117.115 -117.12 -117.125 -117.13 -117.135 -117.14 -117.145 -117.15 -117.155 -117.16 -117.165 -117.17 -117.175 -117.18 -117.185 -117.19 -117.195 -117.2 -117.205 -117.21 -117.215 -117.22 -117.225 -117.23 -117.235 -117.24 -117.245 -117.25 -117.255 -117.26 -117.265 -117.27 -117.275 -117.28 -117.285 -117.29 -117.295 -117.3 -117.305 -117.31 -117.315 -117.32 -117.325 -117.33 -117.335 -117.34 -117.345 -117.35 -117.355 -117.36 -117.365 -117.37 -117.375 -117.38 -117.385 -117.39 -117.395 -117.4 -117.405 -117.41 -117.415 -117.42 -117.425 -117.43 -117.435 -117.44 -117.445 -117.45 -117.455 -117.46 -117.465 -117.47 -117.475 -117.48 -117.485 -117.49 -117.495 -117.5 -117.505 -117.51 -117.515 -117.52 -117.525 -117.53 -117.535 -117.54 -117.545 -117.55 -117.555 -117.56 -117.565 -117.57 -117.575 -117.58 -117.585 -117.59 -117.595 -117.6 -117.605 -117.61 -117.615 -117.62 -117.625 -117.63 -117.635 -117.64 -117.645 -117.65 -117.655 -117.66 -117.665 -117.67 -117.675 -117.68 -117.685 -117.69 -117.695 -117.7 -117.705 -117.71 -117.715 -117.72 -117.725 -117.73 -117.735 -117.74 -117.745 -117.75 -117.755 -117.76 -117.765 -117.77 -117.775 -117.78 -117.785 -117.79 -117.795 -117.8 -117.805 -117.81 -117.815 -117.82 -117.825 -117.83 -117.835 -117.84 -117.845 -117.85 -117.855 -117.86 -117.865 -117.87 -117.875 -117.88 -117.885 -117.89 -117.895 -117.9 -117.905 -117.91 -117.915 -117.92 -117.925 -117.93 -117.935 -117.94 -117.945 -117.95 -117.955 -117.96 -117.965 -117.97 -117.975 -117.98 -117.985 -117.99 -117.995 -118 -118.005 -118.01 -118.015 -118.02 -118.025 -118.03 -118.035 -118.04 -118.045 -118.05 -118.055 -118.06 -118.065 -118.07 -118.075 -118.08 -118.085 -118.09 -118.095 -118.1 -118.105 -118.11 -118.115 -118.12 -118.125 -118.13 -118.135 -118.14 -118.145 -118.15 -118.155 -118.16 -118.165 -118.17 -118.175 -118.18 -118.185 -118.19 -118.195 -118.2 -118.205 -118.21 -118.215 -118.22 -118.225 -118.23 -118.235 -118.24 -118.245 -118.25 -118.255 -118.26 -118.265 -118.27 -118.275 -118.28 -118.285 -118.29 -118.295 -118.3 -118.305 -118.31 -118.315 -118.32 -118.325 -118.33 -118.335 -118.34 -118.345 -118.35 -118.355 -118.36 -118.365 -118.37 -118.375 -118.38 -118.385 -118.39 -118.395 -118.4 -118.405 -118.41 -118.415 -118.42 -118.425 -118.43 -118.435 -118.44 -118.445 -118.45 -118.455 -118.46 -118.465 -118.47 -118.475 -118.48 -118.485 -118.49 -118.495 -118.5 -118.505 -118.51 -118.515 -118.52 -118.525 -118.53 -118.535 -118.54 -118.545 -118.55 -118.555 -118.56 -118.565 -118.57 -118.575 -118.58 -118.585 -118.59 -118.595 -118.6 -118.605 -118.61 -118.615 -118.62 -118.625 -118.63 -118.635 -118.64 -118.645 -118.65 -118.655 -118.66 -118.665 -118.67 -118.675 -118.68 -118.685 -118.69 -118.695 -118.7 -118.705 -118.71 -118.715 -118.72 -118.725 -118.73 -118.735 -118.74 -118.745 -118.75 -118.755 -118.76 -118.765 -118.77 -118.775 -118.78 -118.785 -118.79 -118.795 -118.8 -118.805 -118.81 -118.815 -118.82 -118.825 -118.83 -118.835 -118.84 -118.845 -118.85 -118.855 -118.86 -118.865 -118.87 -118.875 -118.88 -118.885 -118.89 -118.895 -118.9 -118.905 -118.91 -118.915 -118.92 -118.925 -118.93 -118.935 -118.94 -118.945 -118.95 -118.955 -118.96 -118.965 -118.97 -118.975 -118.98 -118.985 -118.99 -118.995 -119 -119.005 -119.01 -119.015 -119.02 -119.025 -119.03 -119.035 -119.04 -119.045 -119.05 -119.055 -119.06 -119.065 -119.07 -119.075 -119.08 -119.085 -119.09 -119.095 -119.1 -119.105 -119.11 -119.115 -119.12 -119.125 -119.13 -119.135 -119.14 -119.145 -119.15 -119.155 -119.16 -119.165 -119.17 -119.175 -119.18 -119.185 -119.19 -119.195 -119.2 -119.205 -119.21 -119.215 -119.22 -119.225 -119.23 -119.235 -119.24 -119.245 -119.25 -119.255 -119.26 -119.265 -119.27 -119.275 -119.28 -119.285 -119.29 -119.295 -119.3 -119.305 -119.31 -119.315 -119.32 -119.325 -119.33 -119.335 -119.34 -119.345 -119.35 -119.355 -119.36 -119.365 -119.37 -119.375 -119.38 -119.385 -119.39 -119.395 -119.4 -119.405 -119.41 -119.415 -119.42 -119.425 -119.43 -119.435 -119.44 -119.445 -119.45 -119.455 -119.46 -119.465 -119.47 -119.475 -119.48 -119.485 -119.49 -119.495 -119.5 -119.505 -119.51 -119.515 -119.52 -119.525 -119.53 -119.535 -119.54 -119.545 -119.55 -119.555 -119.56 -119.565 -119.57 -119.575 -119.58 -119.585 -119.59 -119.595 -119.6 -119.605 -119.61 -119.615 -119.62 -119.625 -119.63 -119.635 -119.64 -119.645 -119.65 -119.655 -119.66 -119.665 -119.67 -119.675 -119.68 -119.685 -119.69 -119.695 -119.7 -119.705 -119.71 -119.715 -119.72 -119.725 -119.73 -119.735 -119.74 -119.745 -119.75 -119.755 -119.76 -119.765 -119.77 -119.775 -119.78 -119.785 -119.79 -119.795 -119.8 -119.805 -119.81 -119.815 -119.82 -119.825 -119.83 -119.835 -119.84 -119.845 -119.85 -119.855 -119.86 -119.865 -119.87 -119.875 -119.88 -119.885 -119.89 -119.895 -119.9 -119.905 -119.91 -119.915 -119.92 -119.925 -119.93 -119.935 -119.94 -119.945 -119.95 -119.955 -119.96 -119.965 -119.97 -119.975 -119.98 -119.985 -119.99 -119.995 -120 -120.005 -120.01 -120.015 -120.02 -120.025 -120.03 -120.035 -120.04 -120.045 -120.05 -120.055 -120.06 -120.065 -120.07 -120.075 -120.08 -120.085 -120.09 -120.095 -120.1 -120.105 -120.11 -120.115 -120.12 -120.125 -120.13 -120.135 -120.14 -120.145 -120.15 -120.155 -120.16 -120.165 -120.17 -120.175 -120.18 -120.185 -120.19 -120.195 -120.2 -120.205 -120.21 -120.215 -120.22 -120.225 -120.23 -120.235 -120.24 -120.245 -120.25 -120.255 -120.26 -120.265 -120.27 -120.275 -120.28 -120.285 -120.29 -120.295 -120.3 -120.305 -120.31 -120.315 -120.32 -120.325 -120.33 -120.335 -120.34 -120.345 -120.35 -120.355 -120.36 -120.365 -120.37 -120.375 -120.38 -120.385 -120.39 -120.395 -120.4 -120.405 -120.41 -120.415 -120.42 -120.425 -120.43 -120.435 -120.44 -120.445 -120.45 -120.455 -120.46 -120.465 -120.47 -120.475 -120.48 -120.485 -120.49 -120.495 -120.5 -120.505 -120.51 -120.515 -120.52 -120.525 -120.53 -120.535 -120.54 -120.545 -120.55 -120.555 -120.56 -120.565 -120.57 -120.575 -120.58 -120.585 -120.59 -120.595 -120.6 -120.605 -120.61 -120.615 -120.62 -120.625 -120.63 -120.635 -120.64 -120.645 -120.65 -120.655 -120.66 -120.665 -120.67 -120.675 -120.68 -120.685 -120.69 -120.695 -120.7 -120.705 -120.71 -120.715 -120.72 -120.725 -120.73 -120.735 -120.74 -120.745 -120.75 -120.755 -120.76 -120.765 -120.77 -120.775 -120.78 -120.785 -120.79 -120.795 -120.8 -120.805 -120.81 -120.815 -120.82 -120.825 -120.83 -120.835 -120.84 -120.845 -120.85 -120.855 -120.86 -120.865 -120.87 -120.875 -120.88 -120.885 -120.89 -120.895 -120.9 -120.905 -120.91 -120.915 -120.92 -120.925 -120.93 -120.935 -120.94 -120.945 -120.95 -120.955 -120.96 -120.965 -120.97 -120.975 -120.98 -120.985 -120.99 -120.995 -121 -121.005 -121.01 -121.015 -121.02 -121.025 -121.03 -121.035 -121.04 -121.045 -121.05 -121.055 -121.06 -121.065 -121.07 -121.075 -121.08 -121.085 -121.09 -121.095 -121.1 -121.105 -121.11 -121.115 -121.12 -121.125 -121.13 -121.135 -121.14 -121.145 -121.15 -121.155 -121.16 -121.165 -121.17 -121.175 -121.18 -121.185 -121.19 -121.195 -121.2 -121.205 -121.21 -121.215 -121.22 -121.225 -121.23 -121.235 -121.24 -121.245 -121.25 -121.255 -121.26 -121.265 -121.27 -121.275 -121.28 -121.285 -121.29 -121.295 -121.3 -121.305 -121.31 -121.315 -121.32 -121.325 -121.33 -121.335 -121.34 -121.345 -121.35 -121.355 -121.36 -121.365 -121.37 -121.375 -121.38 -121.385 -121.39 -121.395 -121.4 -121.405 -121.41 -121.415 -121.42 -121.425 -121.43 -121.435 -121.44 -121.445 -121.45 -121.455 -121.46 -121.465 -121.47 -121.475 -121.48 -121.485 -121.49 -121.495 -121.5 -121.505 -121.51 -121.515 -121.52 -121.525 -121.53 -121.535 -121.54 -121.545 -121.55 -121.555 -121.56 -121.565 -121.57 -121.575 -121.58 -121.585 -121.59 -121.595 -121.6 -121.605 -121.61 -121.615 -121.62 -121.625 -121.63 -121.635 -121.64 -121.645 -121.65 -121.655 -121.66 -121.665 -121.67 -121.675 -121.68 -121.685 -121.69 -121.695 -121.7 -121.705 -121.71 -121.715 -121.72 -121.725 -121.73 -121.735 -121.74 -121.745 -121.75 -121.755 -121.76 -121.765 -121.77 -121.775 -121.78 -121.785 -121.79 -121.795 -121.8 -121.805 -121.81 -121.815 -121.82 -121.825 -121.83 -121.835 -121.84 -121.845 -121.85 -121.855 -121.86 -121.865 -121.87 -121.875 -121.88 -121.885 -121.89 -121.895 -121.9 -121.905 -121.91 -121.915 -121.92 -121.925 -121.93 -121.935 -121.94 -121.945 -121.95 -121.955 -121.96 -121.965 -121.97 -121.975 -121.98 -121.985 -121.99 -121.995 -122 -122.005 -122.01 -122.015 -122.02 -122.025 -122.03 -122.035 -122.04 -122.045 -122.05 -122.055 -122.06 -122.065 -122.07 -122.075 -122.08 -122.085 -122.09 -122.095 -122.1 -122.105 -122.11 -122.115 -122.12 -122.125 -122.13 -122.135 -122.14 -122.145 -122.15 -122.155 -122.16 -122.165 -122.17 -122.175 -122.18 -122.185 -122.19 -122.195 -122.2 -122.205 -122.21 -122.215 -122.22 -122.225 -122.23 -122.235 -122.24 -122.245 -122.25 -122.255 -122.26 -122.265 -122.27 -122.275 -122.28 -122.285 -122.29 -122.295 -122.3 -122.305 -122.31 -122.315 -122.32 -122.325 -122.33 -122.335 -122.34 -122.345 -122.35 -122.355 -122.36 -122.365 -122.37 -122.375 -122.38 -122.385 -122.39 -122.395 -122.4 -122.405 -122.41 -122.415 -122.42 -122.425 -122.43 -122.435 -122.44 -122.445 -122.45 -122.455 -122.46 -122.465 -122.47 -122.475 -122.48 -122.485 -122.49 -122.495 -122.5 -122.505 -122.51 -122.515 -122.52 -122.525 -122.53 -122.535 -122.54 -122.545 -122.55 -122.555 -122.56 -122.565 -122.57 -122.575 -122.58 -122.585 -122.59 -122.595 -122.6 -122.605 -122.61 -122.615 -122.62 -122.625 -122.63 -122.635 -122.64 -122.645 -122.65 -122.655 -122.66 -122.665 -122.67 -122.675 -122.68 -122.685 -122.69 -122.695 -122.7 -122.705 -122.71 -122.715 -122.72 -122.725 -122.73 -122.735 -122.74 -122.745 -122.75 -122.755 -122.76 -122.765 -122.77 -122.775 -122.78 -122.785 -122.79 -122.795 -122.8 -122.805 -122.81 -122.815 -122.82 -122.825 -122.83 -122.835 -122.84 -122.845 -122.85 -122.855 -122.86 -122.865 -122.87 -122.875 -122.88 -122.885 -122.89 -122.895 -122.9 -122.905 -122.91 -122.915 -122.92 -122.925 -122.93 -122.935 -122.94 -122.945 -122.95 -122.955 -122.96 -122.965 -122.97 -122.975 -122.98 -122.985 -122.99 -122.995 -123 -123.005 -123.01 -123.015 -123.02 -123.025 -123.03 -123.035 -123.04 -123.045 -123.05 -123.055 -123.06 -123.065 -123.07 -123.075 -123.08 -123.085 -123.09 -123.095 -123.1 -123.105 -123.11 -123.115 -123.12 -123.125 -123.13 -123.135 -123.14 -123.145 -123.15 -123.155 -123.16 -123.165 -123.17 -123.175 -123.18 -123.185 -123.19 -123.195 -123.2 -123.205 -123.21 -123.215 -123.22 -123.225 -123.23 -123.235 -123.24 -123.245 -123.25 -123.255 -123.26 -123.265 -123.27 -123.275 -123.28 -123.285 -123.29 -123.295 -123.3 -123.305 -123.31 -123.315 -123.32 -123.325 -123.33 -123.335 -123.34 -123.345 -123.35 -123.355 -123.36 -123.365 -123.37 -123.375 -123.38 -123.385 -123.39 -123.395 -123.4 -123.405 -123.41 -123.415 -123.42 -123.425 -123.43 -123.435 -123.44 -123.445 -123.45 -123.455 -123.46 -123.465 -123.47 -123.475 -123.48 -123.485 -123.49 -123.495 -123.5 -123.505 -123.51 -123.515 -123.52 -123.525 -123.53 -123.535 -123.54 -123.545 -123.55 -123.555 -123.56 -123.565 -123.57 -123.575 -123.58 -123.585 -123.59 -123.595 -123.6 -123.605 -123.61 -123.615 -123.62 -123.625 -123.63 -123.635 -123.64 -123.645 -123.65 -123.655 -123.66 -123.665 -123.67 -123.675 -123.68 -123.685 -123.69 -123.695 -123.7 -123.705 -123.71 -123.715 -123.72 -123.725 -123.73 -123.735 -123.74 -123.745 -123.75 -123.755 -123.76 -123.765 -123.77 -123.775 -123.78 -123.785 -123.79 -123.795 -123.8 -123.805 -123.81 -123.815 -123.82 -123.825 -123.83 -123.835 -123.84 -123.845 -123.85 -123.855 -123.86 -123.865 -123.87 -123.875 -123.88 -123.885 -123.89 -123.895 -123.9 -123.905 -123.91 -123.915 -123.92 -123.925 -123.93 -123.935 -123.94 -123.945 -123.95 -123.955 -123.96 -123.965 -123.97 -123.975 -123.98 -123.985 -123.99 -123.995 -124 -124.005 -124.01 -124.015 -124.02 -124.025 -124.03 -124.035 -124.04 -124.045 -124.05 -124.055 -124.06 -124.065 -124.07 -124.075 -124.08 -124.085 -124.09 -124.095 -124.1 -124.105 -124.11 -124.115 -124.12 -124.125 -124.13 -124.135 -124.14 -124.145 -124.15 -124.155 -124.16 -124.165 -124.17 -124.175 -124.18 -124.185 -124.19 -124.195 -124.2 -124.205 -124.21 -124.215 -124.22 -124.225 -124.23 -124.235 -124.24 -124.245 -124.25 -124.255 -124.26 -124.265 -124.27 -124.275 -124.28 -124.285 -124.29 -124.295 -124.3 -124.305 -124.31 -124.315 -124.32 -124.325 -124.33 -124.335 -124.34 -124.345 -124.35 -124.355 -124.36 -124.365 -124.37 -124.375 -124.38 -124.385 -124.39 -124.395 -124.4 -124.405 -124.41 -124.415 -124.42 -124.425 -124.43 -124.435 -124.44 -124.445 -124.45 -124.455 -124.46 -124.465 -124.47 -124.475 -124.48 -124.485 -124.49 -124.495 -124.5 -124.505 -124.51 -124.515 -124.52 -124.525 -124.53 -124.535 -124.54 -124.545 -124.55 -124.555 -124.56 -124.565 -124.57 -124.575 -124.58 -124.585 -124.59 -124.595 -124.6 -124.605 -124.61 -124.615 -124.62 -124.625 -124.63 -124.635 -124.64 -124.645 -124.65 -124.655 -124.66 -124.665 -124.67 -124.675 -124.68 -124.685 -124.69 -124.695 -124.7 -124.705 -124.71 -124.715 -124.72 -124.725 -124.73 -124.735 -124.74 -124.745 -124.75 -124.755 -124.76 -124.765 -124.77 -124.775 -124.78 -124.785 -124.79 -124.795 -124.8 -124.805 -124.81 -124.815 -124.82 -124.825 -124.83 -124.835 -124.84 -124.845 -124.85 -124.855 -124.86 -124.865 -124.87 -124.875 -124.88 -124.885 -124.89 -124.895 -124.9 -124.905 -124.91 -124.915 -124.92 -124.925 -124.93 -124.935 -124.94 -124.945 -124.95 -124.955 -124.96 -124.965 -124.97 -124.975 -124.98 -124.985 -124.99 -124.995 -125 -125.005 -125.01 -125.015 -125.02 -125.025 -125.03 -125.035 -125.04 -125.045 -125.05 -125.055 -125.06 -125.065 -125.07 -125.075 -125.08 -125.085 -125.09 -125.095 -125.1 -125.105 -125.11 -125.115 -125.12 -125.125 -125.13 -125.135 -125.14 -125.145 -125.15 -125.155 -125.16 -125.165 -125.17 -125.175 -125.18 -125.185 -125.19 -125.195 -125.2 -125.205 -125.21 -125.215 -125.22 -125.225 -125.23 -125.235 -125.24 -125.245 -125.25 -125.255 -125.26 -125.265 -125.27 -125.275 -125.28 -125.285 -125.29 -125.295 -125.3 -125.305 -125.31 -125.315 -125.32 -125.325 -125.33 -125.335 -125.34 -125.345 -125.35 -125.355 -125.36 -125.365 -125.37 -125.375 -125.38 -125.385 -125.39 -125.395 -125.4 -125.405 -125.41 -125.415 -125.42 -125.425 -125.43 -125.435 -125.44 -125.445 -125.45 -125.455 -125.46 -125.465 -125.47 -125.475 -125.48 -125.485 -125.49 -125.495 -125.5 -125.505 -125.51 -125.515 -125.52 -125.525 -125.53 -125.535 -125.54 -125.545 -125.55 -125.555 -125.56 -125.565 -125.57 -125.575 -125.58 -125.585 -125.59 -125.595 -125.6 -125.605 -125.61 -125.615 -125.62 -125.625 -125.63 -125.635 -125.64 -125.645 -125.65 -125.655 -125.66 -125.665 -125.67 -125.675 -125.68 -125.685 -125.69 -125.695 -125.7 -125.705 -125.71 -125.715 -125.72 -125.725 -125.73 -125.735 -125.74 -125.745 -125.75 -125.755 -125.76 -125.765 -125.77 -125.775 -125.78 -125.785 -125.79 -125.795 -125.8 -125.805 -125.81 -125.815 -125.82 -125.825 -125.83 -125.835 -125.84 -125.845 -125.85 -125.855 -125.86 -125.865 -125.87 -125.875 -125.88 -125.885 -125.89 -125.895 -125.9 -125.905 -125.91 -125.915 -125.92 -125.925 -125.93 -125.935 -125.94 -125.945 -125.95 -125.955 -125.96 -125.965 -125.97 -125.975 -125.98 -125.985 -125.99 -125.995 -126 -126.005 -126.01 -126.015 -126.02 -126.025 -126.03 -126.035 -126.04 -126.045 -126.05 -126.055 -126.06 -126.065 -126.07 -126.075 -126.08 -126.085 -126.09 -126.095 -126.1 -126.105 -126.11 -126.115 -126.12 -126.125 -126.13 -126.135 -126.14 -126.145 -126.15 -126.155 -126.16 -126.165 -126.17 -126.175 -126.18 -126.185 -126.19 -126.195 -126.2 -126.205 -126.21 -126.215 -126.22 -126.225 -126.23 -126.235 -126.24 -126.245 -126.25 -126.255 -126.26 -126.265 -126.27 -126.275 -126.28 -126.285 -126.29 -126.295 -126.3 -126.305 -126.31 -126.315 -126.32 -126.325 -126.33 -126.335 -126.34 -126.345 -126.35 -126.355 -126.36 -126.365 -126.37 -126.375 -126.38 -126.385 -126.39 -126.395 -126.4 -126.405 -126.41 -126.415 -126.42 -126.425 -126.43 -126.435 -126.44 -126.445 -126.45 -126.455 -126.46 -126.465 -126.47 -126.475 -126.48 -126.485 -126.49 -126.495 -126.5 -126.505 -126.51 -126.515 -126.52 -126.525 -126.53 -126.535 -126.54 -126.545 -126.55 -126.555 -126.56 -126.565 -126.57 -126.575 -126.58 -126.585 -126.59 -126.595 -126.6 -126.605 -126.61 -126.615 -126.62 -126.625 -126.63 -126.635 -126.64 -126.645 -126.65 -126.655 -126.66 -126.665 -126.67 -126.675 -126.68 -126.685 -126.69 -126.695 -126.7 -126.705 -126.71 -126.715 -126.72 -126.725 -126.73 -126.735 -126.74 -126.745 -126.75 -126.755 -126.76 -126.765 -126.77 -126.775 -126.78 -126.785 -126.79 -126.795 -126.8 -126.805 -126.81 -126.815 -126.82 -126.825 -126.83 -126.835 -126.84 -126.845 -126.85 -126.855 -126.86 -126.865 -126.87 -126.875 -126.88 -126.885 -126.89 -126.895 -126.9 -126.905 -126.91 -126.915 -126.92 -126.925 -126.93 -126.935 -126.94 -126.945 -126.95 -126.955 -126.96 -126.965 -126.97 -126.975 -126.98 -126.985 -126.99 -126.995 -127 -127.005 -127.01 -127.015 -127.02 -127.025 -127.03 -127.035 -127.04 -127.045 -127.05 -127.055 -127.06 -127.065 -127.07 -127.075 -127.08 -127.085 -127.09 -127.095 -127.1 -127.105 -127.11 -127.115 -127.12 -127.125 -127.13 -127.135 -127.14 -127.145 -127.15 -127.155 -127.16 -127.165 -127.17 -127.175 -127.18 -127.185 -127.19 -127.195 -127.2 -127.205 -127.21 -127.215 -127.22 -127.225 -127.23 -127.235 -127.24 -127.245 -127.25 -127.255 -127.26 -127.265 -127.27 -127.275 -127.28 -127.285 -127.29 -127.295 -127.3 -127.305 -127.31 -127.315 -127.32 -127.325 -127.33 -127.335 -127.34 -127.345 -127.35 -127.355 -127.36 -127.365 -127.37 -127.375 -127.38 -127.385 -127.39 -127.395 -127.4 -127.405 -127.41 -127.415 -127.42 -127.425 -127.43 -127.435 -127.44 -127.445 -127.45 -127.455 -127.46 -127.465 -127.47 -127.475 -127.48 -127.485 -127.49 -127.495 -127.5 -127.505 -127.51 -127.515 -127.52 -127.525 -127.53 -127.535 -127.54 -127.545 -127.55 -127.555 -127.56 -127.565 -127.57 -127.575 -127.58 -127.585 -127.59 -127.595 -127.6 -127.605 -127.61 -127.615 -127.62 -127.625 -127.63 -127.635 -127.64 -127.645 -127.65 -127.655 -127.66 -127.665 -127.67 -127.675 -127.68 -127.685 -127.69 -127.695 -127.7 -127.705 -127.71 -127.715 -127.72 -127.725 -127.73 -127.735 -127.74 -127.745 -127.75 -127.755 -127.76 -127.765 -127.77 -127.775 -127.78 -127.785 -127.79 -127.795 -127.8 -127.805 -127.81 -127.815 -127.82 -127.825 -127.83 -127.835 -127.84 -127.845 -127.85 -127.855 -127.86 -127.865 -127.87 -127.875 -127.88 -127.885 -127.89 -127.895 -127.9 -127.905 -127.91 -127.915 -127.92 -127.925 -127.93 -127.935 -127.94 -127.945 -127.95 -127.955 -127.96 -127.965 -127.97 -127.975 -127.98 -127.985 -127.99 -127.995 -128 -128.005 -128.01 -128.015 -128.02 -128.025 -128.03 -128.035 -128.04 -128.045 -128.05 -128.055 -128.06 -128.065 -128.07 -128.075 -128.08 -128.085 -128.09 -128.095 -128.1 -128.105 -128.11 -128.115 -128.12 -128.125 -128.13 -128.135 -128.14 -128.145 -128.15 -128.155 -128.16 -128.165 -128.17 -128.175 -128.18 -128.185 -128.19 -128.195 -128.2 -128.205 -128.21 -128.215 -128.22 -128.225 -128.23 -128.235 -128.24 -128.245 -128.25 -128.255 -128.26 -128.265 -128.27 -128.275 -128.28 -128.285 -128.29 -128.295 -128.3 -128.305 -128.31 -128.315 -128.32 -128.325 -128.33 -128.335 -128.34 -128.345 -128.35 -128.355 -128.36 -128.365 -128.37 -128.375 -128.38 -128.385 -128.39 -128.395 -128.4 -128.405 -128.41 -128.415 -128.42 -128.425 -128.43 -128.435 -128.44 -128.445 -128.45 -128.455 -128.46 -128.465 -128.47 -128.475 -128.48 -128.485 -128.49 -128.495 -128.5 -128.505 -128.51 -128.515 -128.52 -128.525 -128.53 -128.535 -128.54 -128.545 -128.55 -128.555 -128.56 -128.565 -128.57 -128.575 -128.58 -128.585 -128.59 -128.595 -128.6 -128.605 -128.61 -128.615 -128.62 -128.625 -128.63 -128.635 -128.64 -128.645 -128.65 -128.655 -128.66 -128.665 -128.67 -128.675 -128.68 -128.685 -128.69 -128.695 -128.7 -128.705 -128.71 -128.715 -128.72 -128.725 -128.73 -128.735 -128.74 -128.745 -128.75 -128.755 -128.76 -128.765 -128.77 -128.775 -128.78 -128.785 -128.79 -128.795 -128.8 -128.805 -128.81 -128.815 -128.82 -128.825 -128.83 -128.835 -128.84 -128.845 -128.85 -128.855 -128.86 -128.865 -128.87 -128.875 -128.88 -128.885 -128.89 -128.895 -128.9 -128.905 -128.91 -128.915 -128.92 -128.925 -128.93 -128.935 -128.94 -128.945 -128.95 -128.955 -128.96 -128.965 -128.97 -128.975 -128.98 -128.985 -128.99 -128.995 -129 -129.005 -129.01 -129.015 -129.02 -129.025 -129.03 -129.035 -129.04 -129.045 -129.05 -129.055 -129.06 -129.065 -129.07 -129.075 -129.08 -129.085 -129.09 -129.095 -129.1 -129.105 -129.11 -129.115 -129.12 -129.125 -129.13 -129.135 -129.14 -129.145 -129.15 -129.155 -129.16 -129.165 -129.17 -129.175 -129.18 -129.185 -129.19 -129.195 -129.2 -129.205 -129.21 -129.215 -129.22 -129.225 -129.23 -129.235 -129.24 -129.245 -129.25 -129.255 -129.26 -129.265 -129.27 -129.275 -129.28 -129.285 -129.29 -129.295 -129.3 -129.305 -129.31 -129.315 -129.32 -129.325 -129.33 -129.335 -129.34 -129.345 -129.35 -129.355 -129.36 -129.365 -129.37 -129.375 -129.38 -129.385 -129.39 -129.395 -129.4 -129.405 -129.41 -129.415 -129.42 -129.425 -129.43 -129.435 -129.44 -129.445 -129.45 -129.455 -129.46 -129.465 -129.47 -129.475 -129.48 -129.485 -129.49 -129.495 -129.5 -129.505 -129.51 -129.515 -129.52 -129.525 -129.53 -129.535 -129.54 -129.545 -129.55 -129.555 -129.56 -129.565 -129.57 -129.575 -129.58 -129.585 -129.59 -129.595 -129.6 -129.605 -129.61 -129.615 -129.62 -129.625 -129.63 -129.635 -129.64 -129.645 -129.65 -129.655 -129.66 -129.665 -129.67 -129.675 -129.68 -129.685 -129.69 -129.695 -129.7 -129.705 -129.71 -129.715 -129.72 -129.725 -129.73 -129.735 -129.74 -129.745 -129.75 -129.755 -129.76 -129.765 -129.77 -129.775 -129.78 -129.785 -129.79 -129.795 -129.8 -129.805 -129.81 -129.815 -129.82 -129.825 -129.83 -129.835 -129.84 -129.845 -129.85 -129.855 -129.86 -129.865 -129.87 -129.875 -129.88 -129.885 -129.89 -129.895 -129.9 -129.905 -129.91 -129.915 -129.92 -129.925 -129.93 -129.935 -129.94 -129.945 -129.95 -129.955 -129.96 -129.965 -129.97 -129.975 -129.98 -129.985 -129.99 -129.995 -130 -130.005 -130.01 -130.015 -130.02 -130.025 -130.03 -130.035 -130.04 -130.045 -130.05 -130.055 -130.06 -130.065 -130.07 -130.075 -130.08 -130.085 -130.09 -130.095 -130.1 -130.105 -130.11 -130.115 -130.12 -130.125 -130.13 -130.135 -130.14 -130.145 -130.15 -130.155 -130.16 -130.165 -130.17 -130.175 -130.18 -130.185 -130.19 -130.195 -130.2 -130.205 -130.21 -130.215 -130.22 -130.225 -130.23 -130.235 -130.24 -130.245 -130.25 -130.255 -130.26 -130.265 -130.27 -130.275 -130.28 -130.285 -130.29 -130.295 -130.3 -130.305 -130.31 -130.315 -130.32 -130.325 -130.33 -130.335 -130.34 -130.345 -130.35 -130.355 -130.36 -130.365 -130.37 -130.375 -130.38 -130.385 -130.39 -130.395 -130.4 -130.405 -130.41 -130.415 -130.42 -130.425 -130.43 -130.435 -130.44 -130.445 -130.45 -130.455 -130.46 -130.465 -130.47 -130.475 -130.48 -130.485 -130.49 -130.495 -130.5 -130.505 -130.51 -130.515 -130.52 -130.525 -130.53 -130.535 -130.54 -130.545 -130.55 -130.555 -130.56 -130.565 -130.57 -130.575 -130.58 -130.585 -130.59 -130.595 -130.6 -130.605 -130.61 -130.615 -130.62 -130.625 -130.63 -130.635 -130.64 -130.645 -130.65 -130.655 -130.66 -130.665 -130.67 -130.675 -130.68 -130.685 -130.69 -130.695 -130.7 -130.705 -130.71 -130.715 -130.72 -130.725 -130.73 -130.735 -130.74 -130.745 -130.75 -130.755 -130.76 -130.765 -130.77 -130.775 -130.78 -130.785 -130.79 -130.795 -130.8 -130.805 -130.81 -130.815 -130.82 -130.825 -130.83 -130.835 -130.84 -130.845 -130.85 -130.855 -130.86 -130.865 -130.87 -130.875 -130.88 -130.885 -130.89 -130.895 -130.9 -130.905 -130.91 -130.915 -130.92 -130.925 -130.93 -130.935 -130.94 -130.945 -130.95 -130.955 -130.96 -130.965 -130.97 -130.975 -130.98 -130.985 -130.99 -130.995 -131 -131.005 -131.01 -131.015 -131.02 -131.025 -131.03 -131.035 -131.04 -131.045 -131.05 -131.055 -131.06 -131.065 -131.07 -131.075 -131.08 -131.085 -131.09 -131.095 -131.1 -131.105 -131.11 -131.115 -131.12 -131.125 -131.13 -131.135 -131.14 -131.145 -131.15 -131.155 -131.16 -131.165 -131.17 -131.175 -131.18 -131.185 -131.19 -131.195 -131.2 -131.205 -131.21 -131.215 -131.22 -131.225 -131.23 -131.235 -131.24 -131.245 -131.25 -131.255 -131.26 -131.265 -131.27 -131.275 -131.28 -131.285 -131.29 -131.295 -131.3 -131.305 -131.31 -131.315 -131.32 -131.325 -131.33 -131.335 -131.34 -131.345 -131.35 -131.355 -131.36 -131.365 -131.37 -131.375 -131.38 -131.385 -131.39 -131.395 -131.4 -131.405 -131.41 -131.415 -131.42 -131.425 -131.43 -131.435 -131.44 -131.445 -131.45 -131.455 -131.46 -131.465 -131.47 -131.475 -131.48 -131.485 -131.49 -131.495 -131.5 -131.505 -131.51 -131.515 -131.52 -131.525 -131.53 -131.535 -131.54 -131.545 -131.55 -131.555 -131.56 -131.565 -131.57 -131.575 -131.58 -131.585 -131.59 -131.595 -131.6 -131.605 -131.61 -131.615 -131.62 -131.625 -131.63 -131.635 -131.64 -131.645 -131.65 -131.655 -131.66 -131.665 -131.67 -131.675 -131.68 -131.685 -131.69 -131.695 -131.7 -131.705 -131.71 -131.715 -131.72 -131.725 -131.73 -131.735 -131.74 -131.745 -131.75 -131.755 -131.76 -131.765 -131.77 -131.775 -131.78 -131.785 -131.79 -131.795 -131.8 -131.805 -131.81 -131.815 -131.82 -131.825 -131.83 -131.835 -131.84 -131.845 -131.85 -131.855 -131.86 -131.865 -131.87 -131.875 -131.88 -131.885 -131.89 -131.895 -131.9 -131.905 -131.91 -131.915 -131.92 -131.925 -131.93 -131.935 -131.94 -131.945 -131.95 -131.955 -131.96 -131.965 -131.97 -131.975 -131.98 -131.985 -131.99 -131.995 -132 -132.005 -132.01 -132.015 -132.02 -132.025 -132.03 -132.035 -132.04 -132.045 -132.05 -132.055 -132.06 -132.065 -132.07 -132.075 -132.08 -132.085 -132.09 -132.095 -132.1 -132.105 -132.11 -132.115 -132.12 -132.125 -132.13 -132.135 -132.14 -132.145 -132.15 -132.155 -132.16 -132.165 -132.17 -132.175 -132.18 -132.185 -132.19 -132.195 -132.2 -132.205 -132.21 -132.215 -132.22 -132.225 -132.23 -132.235 -132.24 -132.245 -132.25 -132.255 -132.26 -132.265 -132.27 -132.275 -132.28 -132.285 -132.29 -132.295 -132.3 -132.305 -132.31 -132.315 -132.32 -132.325 -132.33 -132.335 -132.34 -132.345 -132.35 -132.355 -132.36 -132.365 -132.37 -132.375 -132.38 -132.385 -132.39 -132.395 -132.4 -132.405 -132.41 -132.415 -132.42 -132.425 -132.43 -132.435 -132.44 -132.445 -132.45 -132.455 -132.46 -132.465 -132.47 -132.475 -132.48 -132.485 -132.49 -132.495 -132.5 -132.505 -132.51 -132.515 -132.52 -132.525 -132.53 -132.535 -132.54 -132.545 -132.55 -132.555 -132.56 -132.565 -132.57 -132.575 -132.58 -132.585 -132.59 -132.595 -132.6 -132.605 -132.61 -132.615 -132.62 -132.625 -132.63 -132.635 -132.64 -132.645 -132.65 -132.655 -132.66 -132.665 -132.67 -132.675 -132.68 -132.685 -132.69 -132.695 -132.7 -132.705 -132.71 -132.715 -132.72 -132.725 -132.73 -132.735 -132.74 -132.745 -132.75 -132.755 -132.76 -132.765 -132.77 -132.775 -132.78 -132.785 -132.79 -132.795 -132.8 -132.805 -132.81 -132.815 -132.82 -132.825 -132.83 -132.835 -132.84 -132.845 -132.85 -132.855 -132.86 -132.865 -132.87 -132.875 -132.88 -132.885 -132.89 -132.895 -132.9 -132.905 -132.91 -132.915 -132.92 -132.925 -132.93 -132.935 -132.94 -132.945 -132.95 -132.955 -132.96 -132.965 -132.97 -132.975 -132.98 -132.985 -132.99 -132.995 -133 -133.005 -133.01 -133.015 -133.02 -133.025 -133.03 -133.035 -133.04 -133.045 -133.05 -133.055 -133.06 -133.065 -133.07 -133.075 -133.08 -133.085 -133.09 -133.095 -133.1 -133.105 -133.11 -133.115 -133.12 -133.125 -133.13 -133.135 -133.14 -133.145 -133.15 -133.155 -133.16 -133.165 -133.17 -133.175 -133.18 -133.185 -133.19 -133.195 -133.2 -133.205 -133.21 -133.215 -133.22 -133.225 -133.23 -133.235 -133.24 -133.245 -133.25 -133.255 -133.26 -133.265 -133.27 -133.275 -133.28 -133.285 -133.29 -133.295 -133.3 -133.305 -133.31 -133.315 -133.32 -133.325 -133.33 -133.335 -133.34 -133.345 -133.35 -133.355 -133.36 -133.365 -133.37 -133.375 -133.38 -133.385 -133.39 -133.395 -133.4 -133.405 -133.41 -133.415 -133.42 -133.425 -133.43 -133.435 -133.44 -133.445 -133.45 -133.455 -133.46 -133.465 -133.47 -133.475 -133.48 -133.485 -133.49 -133.495 -133.5 -133.505 -133.51 -133.515 -133.52 -133.525 -133.53 -133.535 -133.54 -133.545 -133.55 -133.555 -133.56 -133.565 -133.57 -133.575 -133.58 -133.585 -133.59 -133.595 -133.6 -133.605 -133.61 -133.615 -133.62 -133.625 -133.63 -133.635 -133.64 -133.645 -133.65 -133.655 -133.66 -133.665 -133.67 -133.675 -133.68 -133.685 -133.69 -133.695 -133.7 -133.705 -133.71 -133.715 -133.72 -133.725 -133.73 -133.735 -133.74 -133.745 -133.75 -133.755 -133.76 -133.765 -133.77 -133.775 -133.78 -133.785 -133.79 -133.795 -133.8 -133.805 -133.81 -133.815 -133.82 -133.825 -133.83 -133.835 -133.84 -133.845 -133.85 -133.855 -133.86 -133.865 -133.87 -133.875 -133.88 -133.885 -133.89 -133.895 -133.9 -133.905 -133.91 -133.915 -133.92 -133.925 -133.93 -133.935 -133.94 -133.945 -133.95 -133.955 -133.96 -133.965 -133.97 -133.975 -133.98 -133.985 -133.99 -133.995 -134 -134.005 -134.01 -134.015 -134.02 -134.025 -134.03 -134.035 -134.04 -134.045 -134.05 -134.055 -134.06 -134.065 -134.07 -134.075 -134.08 -134.085 -134.09 -134.095 -134.1 -134.105 -134.11 -134.115 -134.12 -134.125 -134.13 -134.135 -134.14 -134.145 -134.15 -134.155 -134.16 -134.165 -134.17 -134.175 -134.18 -134.185 -134.19 -134.195 -134.2 -134.205 -134.21 -134.215 -134.22 -134.225 -134.23 -134.235 -134.24 -134.245 -134.25 -134.255 -134.26 -134.265 -134.27 -134.275 -134.28 -134.285 -134.29 -134.295 -134.3 -134.305 -134.31 -134.315 -134.32 -134.325 -134.33 -134.335 -134.34 -134.345 -134.35 -134.355 -134.36 -134.365 -134.37 -134.375 -134.38 -134.385 -134.39 -134.395 -134.4 -134.405 -134.41 -134.415 -134.42 -134.425 -134.43 -134.435 -134.44 -134.445 -134.45 -134.455 -134.46 -134.465 -134.47 -134.475 -134.48 -134.485 -134.49 -134.495 -134.5 -134.505 -134.51 -134.515 -134.52 -134.525 -134.53 -134.535 -134.54 -134.545 -134.55 -134.555 -134.56 -134.565 -134.57 -134.575 -134.58 -134.585 -134.59 -134.595 -134.6 -134.605 -134.61 -134.615 -134.62 -134.625 -134.63 -134.635 -134.64 -134.645 -134.65 -134.655 -134.66 -134.665 -134.67 -134.675 -134.68 -134.685 -134.69 -134.695 -134.7 -134.705 -134.71 -134.715 -134.72 -134.725 -134.73 -134.735 -134.74 -134.745 -134.75 -134.755 -134.76 -134.765 -134.77 -134.775 -134.78 -134.785 -134.79 -134.795 -134.8 -134.805 -134.81 -134.815 -134.82 -134.825 -134.83 -134.835 -134.84 -134.845 -134.85 -134.855 -134.86 -134.865 -134.87 -134.875 -134.88 -134.885 -134.89 -134.895 -134.9 -134.905 -134.91 -134.915 -134.92 -134.925 -134.93 -134.935 -134.94 -134.945 -134.95 -134.955 -134.96 -134.965 -134.97 -134.975 -134.98 -134.985 -134.99 -134.995 -135 -135.005 -135.01 -135.015 -135.02 -135.025 -135.03 -135.035 -135.04 -135.045 -135.05 -135.055 -135.06 -135.065 -135.07 -135.075 -135.08 -135.085 -135.09 -135.095 -135.1 -135.105 -135.11 -135.115 -135.12 -135.125 -135.13 -135.135 -135.14 -135.145 -135.15 -135.155 -135.16 -135.165 -135.17 -135.175 -135.18 -135.185 -135.19 -135.195 -135.2 -135.205 -135.21 -135.215 -135.22 -135.225 -135.23 -135.235 -135.24 -135.245 -135.25 -135.255 -135.26 -135.265 -135.27 -135.275 -135.28 -135.285 -135.29 -135.295 -135.3 -135.305 -135.31 -135.315 -135.32 -135.325 -135.33 -135.335 -135.34 -135.345 -135.35 -135.355 -135.36 -135.365 -135.37 -135.375 -135.38 -135.385 -135.39 -135.395 -135.4 -135.405 -135.41 -135.415 -135.42 -135.425 -135.43 -135.435 -135.44 -135.445 -135.45 -135.455 -135.46 -135.465 -135.47 -135.475 -135.48 -135.485 -135.49 -135.495 -135.5 -135.505 -135.51 -135.515 -135.52 -135.525 -135.53 -135.535 -135.54 -135.545 -135.55 -135.555 -135.56 -135.565 -135.57 -135.575 -135.58 -135.585 -135.59 -135.595 -135.6 -135.605 -135.61 -135.615 -135.62 -135.625 -135.63 -135.635 -135.64 -135.645 -135.65 -135.655 -135.66 -135.665 -135.67 -135.675 -135.68 -135.685 -135.69 -135.695 -135.7 -135.705 -135.71 -135.715 -135.72 -135.725 -135.73 -135.735 -135.74 -135.745 -135.75 -135.755 -135.76 -135.765 -135.77 -135.775 -135.78 -135.785 -135.79 -135.795 -135.8 -135.805 -135.81 -135.815 -135.82 -135.825 -135.83 -135.835 -135.84 -135.845 -135.85 -135.855 -135.86 -135.865 -135.87 -135.875 -135.88 -135.885 -135.89 -135.895 -135.9 -135.905 -135.91 -135.915 -135.92 -135.925 -135.93 -135.935 -135.94 -135.945 -135.95 -135.955 -135.96 -135.965 -135.97 -135.975 -135.98 -135.985 -135.99 -135.995 -136 -136.005 -136.01 -136.015 -136.02 -136.025 -136.03 -136.035 -136.04 -136.045 -136.05 -136.055 -136.06 -136.065 -136.07 -136.075 -136.08 -136.085 -136.09 -136.095 -136.1 -136.105 -136.11 -136.115 -136.12 -136.125 -136.13 -136.135 -136.14 -136.145 -136.15 -136.155 -136.16 -136.165 -136.17 -136.175 -136.18 -136.185 -136.19 -136.195 -136.2 -136.205 -136.21 -136.215 -136.22 -136.225 -136.23 -136.235 -136.24 -136.245 -136.25 -136.255 -136.26 -136.265 -136.27 -136.275 -136.28 -136.285 -136.29 -136.295 -136.3 -136.305 -136.31 -136.315 -136.32 -136.325 -136.33 -136.335 -136.34 -136.345 -136.35 -136.355 -136.36 -136.365 -136.37 -136.375 -136.38 -136.385 -136.39 -136.395 -136.4 -136.405 -136.41 -136.415 -136.42 -136.425 -136.43 -136.435 -136.44 -136.445 -136.45 -136.455 -136.46 -136.465 -136.47 -136.475 -136.48 -136.485 -136.49 -136.495 -136.5 -136.505 -136.51 -136.515 -136.52 -136.525 -136.53 -136.535 -136.54 -136.545 -136.55 -136.555 -136.56 -136.565 -136.57 -136.575 -136.58 -136.585 -136.59 -136.595 -136.6 -136.605 -136.61 -136.615 -136.62 -136.625 -136.63 -136.635 -136.64 -136.645 -136.65 -136.655 -136.66 -136.665 -136.67 -136.675 -136.68 -136.685 -136.69 -136.695 -136.7 -136.705 -136.71 -136.715 -136.72 -136.725 -136.73 -136.735 -136.74 -136.745 -136.75 -136.755 -136.76 -136.765 -136.77 -136.775 -136.78 -136.785 -136.79 -136.795 -136.8 -136.805 -136.81 -136.815 -136.82 -136.825 -136.83 -136.835 -136.84 -136.845 -136.85 -136.855 -136.86 -136.865 -136.87 -136.875 -136.88 -136.885 -136.89 -136.895 -136.9 -136.905 -136.91 -136.915 -136.92 -136.925 -136.93 -136.935 -136.94 -136.945 -136.95 -136.955 -136.96 -136.965 -136.97 -136.975 -136.98 -136.985 -136.99 -136.995 -137 -137.005 -137.01 -137.015 -137.02 -137.025 -137.03 -137.035 -137.04 -137.045 -137.05 -137.055 -137.06 -137.065 -137.07 -137.075 -137.08 -137.085 -137.09 -137.095 -137.1 -137.105 -137.11 -137.115 -137.12 -137.125 -137.13 -137.135 -137.14 -137.145 -137.15 -137.155 -137.16 -137.165 -137.17 -137.175 -137.18 -137.185 -137.19 -137.195 -137.2 -137.205 -137.21 -137.215 -137.22 -137.225 -137.23 -137.235 -137.24 -137.245 -137.25 -137.255 -137.26 -137.265 -137.27 -137.275 -137.28 -137.285 -137.29 -137.295 -137.3 -137.305 -137.31 -137.315 -137.32 -137.325 -137.33 -137.335 -137.34 -137.345 -137.35 -137.355 -137.36 -137.365 -137.37 -137.375 -137.38 -137.385 -137.39 -137.395 -137.4 -137.405 -137.41 -137.415 -137.42 -137.425 -137.43 -137.435 -137.44 -137.445 -137.45 -137.455 -137.46 -137.465 -137.47 -137.475 -137.48 -137.485 -137.49 -137.495 -137.5 -137.505 -137.51 -137.515 -137.52 -137.525 -137.53 -137.535 -137.54 -137.545 -137.55 -137.555 -137.56 -137.565 -137.57 -137.575 -137.58 -137.585 -137.59 -137.595 -137.6 -137.605 -137.61 -137.615 -137.62 -137.625 -137.63 -137.635 -137.64 -137.645 -137.65 -137.655 -137.66 -137.665 -137.67 -137.675 -137.68 -137.685 -137.69 -137.695 -137.7 -137.705 -137.71 -137.715 -137.72 -137.725 -137.73 -137.735 -137.74 -137.745 -137.75 -137.755 -137.76 -137.765 -137.77 -137.775 -137.78 -137.785 -137.79 -137.795 -137.8 -137.805 -137.81 -137.815 -137.82 -137.825 -137.83 -137.835 -137.84 -137.845 -137.85 -137.855 -137.86 -137.865 -137.87 -137.875 -137.88 -137.885 -137.89 -137.895 -137.9 -137.905 -137.91 -137.915 -137.92 -137.925 -137.93 -137.935 -137.94 -137.945 -137.95 -137.955 -137.96 -137.965 -137.97 -137.975 -137.98 -137.985 -137.99 -137.995 -138 -138.005 -138.01 -138.015 -138.02 -138.025 -138.03 -138.035 -138.04 -138.045 -138.05 -138.055 -138.06 -138.065 -138.07 -138.075 -138.08 -138.085 -138.09 -138.095 -138.1 -138.105 -138.11 -138.115 -138.12 -138.125 -138.13 -138.135 -138.14 -138.145 -138.15 -138.155 -138.16 -138.165 -138.17 -138.175 -138.18 -138.185 -138.19 -138.195 -138.2 -138.205 -138.21 -138.215 -138.22 -138.225 -138.23 -138.235 -138.24 -138.245 -138.25 -138.255 -138.26 -138.265 -138.27 -138.275 -138.28 -138.285 -138.29 -138.295 -138.3 -138.305 -138.31 -138.315 -138.32 -138.325 -138.33 -138.335 -138.34 -138.345 -138.35 -138.355 -138.36 -138.365 -138.37 -138.375 -138.38 -138.385 -138.39 -138.395 -138.4 -138.405 -138.41 -138.415 -138.42 -138.425 -138.43 -138.435 -138.44 -138.445 -138.45 -138.455 -138.46 -138.465 -138.47 -138.475 -138.48 -138.485 -138.49 -138.495 -138.5 -138.505 -138.51 -138.515 -138.52 -138.525 -138.53 -138.535 -138.54 -138.545 -138.55 -138.555 -138.56 -138.565 -138.57 -138.575 -138.58 -138.585 -138.59 -138.595 -138.6 -138.605 -138.61 -138.615 -138.62 -138.625 -138.63 -138.635 -138.64 -138.645 -138.65 -138.655 -138.66 -138.665 -138.67 -138.675 -138.68 -138.685 -138.69 -138.695 -138.7 -138.705 -138.71 -138.715 -138.72 -138.725 -138.73 -138.735 -138.74 -138.745 -138.75 -138.755 -138.76 -138.765 -138.77 -138.775 -138.78 -138.785 -138.79 -138.795 -138.8 -138.805 -138.81 -138.815 -138.82 -138.825 -138.83 -138.835 -138.84 -138.845 -138.85 -138.855 -138.86 -138.865 -138.87 -138.875 -138.88 -138.885 -138.89 -138.895 -138.9 -138.905 -138.91 -138.915 -138.92 -138.925 -138.93 -138.935 -138.94 -138.945 -138.95 -138.955 -138.96 -138.965 -138.97 -138.975 -138.98 -138.985 -138.99 -138.995 -139 -139.005 -139.01 -139.015 -139.02 -139.025 -139.03 -139.035 -139.04 -139.045 -139.05 -139.055 -139.06 -139.065 -139.07 -139.075 -139.08 -139.085 -139.09 -139.095 -139.1 -139.105 -139.11 -139.115 -139.12 -139.125 -139.13 -139.135 -139.14 -139.145 -139.15 -139.155 -139.16 -139.165 -139.17 -139.175 -139.18 -139.185 -139.19 -139.195 -139.2 -139.205 -139.21 -139.215 -139.22 -139.225 -139.23 -139.235 -139.24 -139.245 -139.25 -139.255 -139.26 -139.265 -139.27 -139.275 -139.28 -139.285 -139.29 -139.295 -139.3 -139.305 -139.31 -139.315 -139.32 -139.325 -139.33 -139.335 -139.34 -139.345 -139.35 -139.355 -139.36 -139.365 -139.37 -139.375 -139.38 -139.385 -139.39 -139.395 -139.4 -139.405 -139.41 -139.415 -139.42 -139.425 -139.43 -139.435 -139.44 -139.445 -139.45 -139.455 -139.46 -139.465 -139.47 -139.475 -139.48 -139.485 -139.49 -139.495 -139.5 -139.505 -139.51 -139.515 -139.52 -139.525 -139.53 -139.535 -139.54 -139.545 -139.55 -139.555 -139.56 -139.565 -139.57 -139.575 -139.58 -139.585 -139.59 -139.595 -139.6 -139.605 -139.61 -139.615 -139.62 -139.625 -139.63 -139.635 -139.64 -139.645 -139.65 -139.655 -139.66 -139.665 -139.67 -139.675 -139.68 -139.685 -139.69 -139.695 -139.7 -139.705 -139.71 -139.715 -139.72 -139.725 -139.73 -139.735 -139.74 -139.745 -139.75 -139.755 -139.76 -139.765 -139.77 -139.775 -139.78 -139.785 -139.79 -139.795 -139.8 -139.805 -139.81 -139.815 -139.82 -139.825 -139.83 -139.835 -139.84 -139.845 -139.85 -139.855 -139.86 -139.865 -139.87 -139.875 -139.88 -139.885 -139.89 -139.895 -139.9 -139.905 -139.91 -139.915 -139.92 -139.925 -139.93 -139.935 -139.94 -139.945 -139.95 -139.955 -139.96 -139.965 -139.97 -139.975 -139.98 -139.985 -139.99 -139.995 -140 -140.005 -140.01 -140.015 -140.02 -140.025 -140.03 -140.035 -140.04 -140.045 -140.05 -140.055 -140.06 -140.065 -140.07 -140.075 -140.08 -140.085 -140.09 -140.095 -140.1 -140.105 -140.11 -140.115 -140.12 -140.125 -140.13 -140.135 -140.14 -140.145 -140.15 -140.155 -140.16 -140.165 -140.17 -140.175 -140.18 -140.185 -140.19 -140.195 -140.2 -140.205 -140.21 -140.215 -140.22 -140.225 -140.23 -140.235 -140.24 -140.245 -140.25 -140.255 -140.26 -140.265 -140.27 -140.275 -140.28 -140.285 -140.29 -140.295 -140.3 -140.305 -140.31 -140.315 -140.32 -140.325 -140.33 -140.335 -140.34 -140.345 -140.35 -140.355 -140.36 -140.365 -140.37 -140.375 -140.38 -140.385 -140.39 -140.395 -140.4 -140.405 -140.41 -140.415 -140.42 -140.425 -140.43 -140.435 -140.44 -140.445 -140.45 -140.455 -140.46 -140.465 -140.47 -140.475 -140.48 -140.485 -140.49 -140.495 -140.5 -140.505 -140.51 -140.515 -140.52 -140.525 -140.53 -140.535 -140.54 -140.545 -140.55 -140.555 -140.56 -140.565 -140.57 -140.575 -140.58 -140.585 -140.59 -140.595 -140.6 -140.605 -140.61 -140.615 -140.62 -140.625 -140.63 -140.635 -140.64 -140.645 -140.65 -140.655 -140.66 -140.665 -140.67 -140.675 -140.68 -140.685 -140.69 -140.695 -140.7 -140.705 -140.71 -140.715 -140.72 -140.725 -140.73 -140.735 -140.74 -140.745 -140.75 -140.755 -140.76 -140.765 -140.77 -140.775 -140.78 -140.785 -140.79 -140.795 -140.8 -140.805 -140.81 -140.815 -140.82 -140.825 -140.83 -140.835 -140.84 -140.845 -140.85 -140.855 -140.86 -140.865 -140.87 -140.875 -140.88 -140.885 -140.89 -140.895 -140.9 -140.905 -140.91 -140.915 -140.92 -140.925 -140.93 -140.935 -140.94 -140.945 -140.95 -140.955 -140.96 -140.965 -140.97 -140.975 -140.98 -140.985 -140.99 -140.995 -141 -141.005 -141.01 -141.015 -141.02 -141.025 -141.03 -141.035 -141.04 -141.045 -141.05 -141.055 -141.06 -141.065 -141.07 -141.075 -141.08 -141.085 -141.09 -141.095 -141.1 -141.105 -141.11 -141.115 -141.12 -141.125 -141.13 -141.135 -141.14 -141.145 -141.15 -141.155 -141.16 -141.165 -141.17 -141.175 -141.18 -141.185 -141.19 -141.195 -141.2 -141.205 -141.21 -141.215 -141.22 -141.225 -141.23 -141.235 -141.24 -141.245 -141.25 -141.255 -141.26 -141.265 -141.27 -141.275 -141.28 -141.285 -141.29 -141.295 -141.3 -141.305 -141.31 -141.315 -141.32 -141.325 -141.33 -141.335 -141.34 -141.345 -141.35 -141.355 -141.36 -141.365 -141.37 -141.375 -141.38 -141.385 -141.39 -141.395 -141.4 -141.405 -141.41 -141.415 -141.42 -141.425 -141.43 -141.435 -141.44 -141.445 -141.45 -141.455 -141.46 -141.465 -141.47 -141.475 -141.48 -141.485 -141.49 -141.495 -141.5 -141.505 -141.51 -141.515 -141.52 -141.525 -141.53 -141.535 -141.54 -141.545 -141.55 -141.555 -141.56 -141.565 -141.57 -141.575 -141.58 -141.585 -141.59 -141.595 -141.6 -141.605 -141.61 -141.615 -141.62 -141.625 -141.63 -141.635 -141.64 -141.645 -141.65 -141.655 -141.66 -141.665 -141.67 -141.675 -141.68 -141.685 -141.69 -141.695 -141.7 -141.705 -141.71 -141.715 -141.72 -141.725 -141.73 -141.735 -141.74 -141.745 -141.75 -141.755 -141.76 -141.765 -141.77 -141.775 -141.78 -141.785 -141.79 -141.795 -141.8 -141.805 -141.81 -141.815 -141.82 -141.825 -141.83 -141.835 -141.84 -141.845 -141.85 -141.855 -141.86 -141.865 -141.87 -141.875 -141.88 -141.885 -141.89 -141.895 -141.9 -141.905 -141.91 -141.915 -141.92 -141.925 -141.93 -141.935 -141.94 -141.945 -141.95 -141.955 -141.96 -141.965 -141.97 -141.975 -141.98 -141.985 -141.99 -141.995 -142 -142.005 -142.01 -142.015 -142.02 -142.025 -142.03 -142.035 -142.04 -142.045 -142.05 -142.055 -142.06 -142.065 -142.07 -142.075 -142.08 -142.085 -142.09 -142.095 -142.1 -142.105 -142.11 -142.115 -142.12 -142.125 -142.13 -142.135 -142.14 -142.145 -142.15 -142.155 -142.16 -142.165 -142.17 -142.175 -142.18 -142.185 -142.19 -142.195 -142.2 -142.205 -142.21 -142.215 -142.22 -142.225 -142.23 -142.235 -142.24 -142.245 -142.25 -142.255 -142.26 -142.265 -142.27 -142.275 -142.28 -142.285 -142.29 -142.295 -142.3 -142.305 -142.31 -142.315 -142.32 -142.325 -142.33 -142.335 -142.34 -142.345 -142.35 -142.355 -142.36 -142.365 -142.37 -142.375 -142.38 -142.385 -142.39 -142.395 -142.4 -142.405 -142.41 -142.415 -142.42 -142.425 -142.43 -142.435 -142.44 -142.445 -142.45 -142.455 -142.46 -142.465 -142.47 -142.475 -142.48 -142.485 -142.49 -142.495 -142.5 -142.505 -142.51 -142.515 -142.52 -142.525 -142.53 -142.535 -142.54 -142.545 -142.55 -142.555 -142.56 -142.565 -142.57 -142.575 -142.58 -142.585 -142.59 -142.595 -142.6 -142.605 -142.61 -142.615 -142.62 -142.625 -142.63 -142.635 -142.64 -142.645 -142.65 -142.655 -142.66 -142.665 -142.67 -142.675 -142.68 -142.685 -142.69 -142.695 -142.7 -142.705 -142.71 -142.715 -142.72 -142.725 -142.73 -142.735 -142.74 -142.745 -142.75 -142.755 -142.76 -142.765 -142.77 -142.775 -142.78 -142.785 -142.79 -142.795 -142.8 -142.805 -142.81 -142.815 -142.82 -142.825 -142.83 -142.835 -142.84 -142.845 -142.85 -142.855 -142.86 -142.865 -142.87 -142.875 -142.88 -142.885 -142.89 -142.895 -142.9 -142.905 -142.91 -142.915 -142.92 -142.925 -142.93 -142.935 -142.94 -142.945 -142.95 -142.955 -142.96 -142.965 -142.97 -142.975 -142.98 -142.985 -142.99 -142.995 -143 -143.005 -143.01 -143.015 -143.02 -143.025 -143.03 -143.035 -143.04 -143.045 -143.05 -143.055 -143.06 -143.065 -143.07 -143.075 -143.08 -143.085 -143.09 -143.095 -143.1 -143.105 -143.11 -143.115 -143.12 -143.125 -143.13 -143.135 -143.14 -143.145 -143.15 -143.155 -143.16 -143.165 -143.17 -143.175 -143.18 -143.185 -143.19 -143.195 -143.2 -143.205 -143.21 -143.215 -143.22 -143.225 -143.23 -143.235 -143.24 -143.245 -143.25 -143.255 -143.26 -143.265 -143.27 -143.275 -143.28 -143.285 -143.29 -143.295 -143.3 -143.305 -143.31 -143.315 -143.32 -143.325 -143.33 -143.335 -143.34 -143.345 -143.35 -143.355 -143.36 -143.365 -143.37 -143.375 -143.38 -143.385 -143.39 -143.395 -143.4 -143.405 -143.41 -143.415 -143.42 -143.425 -143.43 -143.435 -143.44 -143.445 -143.45 -143.455 -143.46 -143.465 -143.47 -143.475 -143.48 -143.485 -143.49 -143.495 -143.5 -143.505 -143.51 -143.515 -143.52 -143.525 -143.53 -143.535 -143.54 -143.545 -143.55 -143.555 -143.56 -143.565 -143.57 -143.575 -143.58 -143.585 -143.59 -143.595 -143.6 -143.605 -143.61 -143.615 -143.62 -143.625 -143.63 -143.635 -143.64 -143.645 -143.65 -143.655 -143.66 -143.665 -143.67 -143.675 -143.68 -143.685 -143.69 -143.695 -143.7 -143.705 -143.71 -143.715 -143.72 -143.725 -143.73 -143.735 -143.74 -143.745 -143.75 -143.755 -143.76 -143.765 -143.77 -143.775 -143.78 -143.785 -143.79 -143.795 -143.8 -143.805 -143.81 -143.815 -143.82 -143.825 -143.83 -143.835 -143.84 -143.845 -143.85 -143.855 -143.86 -143.865 -143.87 -143.875 -143.88 -143.885 -143.89 -143.895 -143.9 -143.905 -143.91 -143.915 -143.92 -143.925 -143.93 -143.935 -143.94 -143.945 -143.95 -143.955 -143.96 -143.965 -143.97 -143.975 -143.98 -143.985 -143.99 -143.995 -144 -144.005 -144.01 -144.015 -144.02 -144.025 -144.03 -144.035 -144.04 -144.045 -144.05 -144.055 -144.06 -144.065 -144.07 -144.075 -144.08 -144.085 -144.09 -144.095 -144.1 -144.105 -144.11 -144.115 -144.12 -144.125 -144.13 -144.135 -144.14 -144.145 -144.15 -144.155 -144.16 -144.165 -144.17 -144.175 -144.18 -144.185 -144.19 -144.195 -144.2 -144.205 -144.21 -144.215 -144.22 -144.225 -144.23 -144.235 -144.24 -144.245 -144.25 -144.255 -144.26 -144.265 -144.27 -144.275 -144.28 -144.285 -144.29 -144.295 -144.3 -144.305 -144.31 -144.315 -144.32 -144.325 -144.33 -144.335 -144.34 -144.345 -144.35 -144.355 -144.36 -144.365 -144.37 -144.375 -144.38 -144.385 -144.39 -144.395 -144.4 -144.405 -144.41 -144.415 -144.42 -144.425 -144.43 -144.435 -144.44 -144.445 -144.45 -144.455 -144.46 -144.465 -144.47 -144.475 -144.48 -144.485 -144.49 -144.495 -144.5 -144.505 -144.51 -144.515 -144.52 -144.525 -144.53 -144.535 -144.54 -144.545 -144.55 -144.555 -144.56 -144.565 -144.57 -144.575 -144.58 -144.585 -144.59 -144.595 -144.6 -144.605 -144.61 -144.615 -144.62 -144.625 -144.63 -144.635 -144.64 -144.645 -144.65 -144.655 -144.66 -144.665 -144.67 -144.675 -144.68 -144.685 -144.69 -144.695 -144.7 -144.705 -144.71 -144.715 -144.72 -144.725 -144.73 -144.735 -144.74 -144.745 -144.75 -144.755 -144.76 -144.765 -144.77 -144.775 -144.78 -144.785 -144.79 -144.795 -144.8 -144.805 -144.81 -144.815 -144.82 -144.825 -144.83 -144.835 -144.84 -144.845 -144.85 -144.855 -144.86 -144.865 -144.87 -144.875 -144.88 -144.885 -144.89 -144.895 -144.9 -144.905 -144.91 -144.915 -144.92 -144.925 -144.93 -144.935 -144.94 -144.945 -144.95 -144.955 -144.96 -144.965 -144.97 -144.975 -144.98 -144.985 -144.99 -144.995 -145 -145.005 -145.01 -145.015 -145.02 -145.025 -145.03 -145.035 -145.04 -145.045 -145.05 -145.055 -145.06 -145.065 -145.07 -145.075 -145.08 -145.085 -145.09 -145.095 -145.1 -145.105 -145.11 -145.115 -145.12 -145.125 -145.13 -145.135 -145.14 -145.145 -145.15 -145.155 -145.16 -145.165 -145.17 -145.175 -145.18 -145.185 -145.19 -145.195 -145.2 -145.205 -145.21 -145.215 -145.22 -145.225 -145.23 -145.235 -145.24 -145.245 -145.25 -145.255 -145.26 -145.265 -145.27 -145.275 -145.28 -145.285 -145.29 -145.295 -145.3 -145.305 -145.31 -145.315 -145.32 -145.325 -145.33 -145.335 -145.34 -145.345 -145.35 -145.355 -145.36 -145.365 -145.37 -145.375 -145.38 -145.385 -145.39 -145.395 -145.4 -145.405 -145.41 -145.415 -145.42 -145.425 -145.43 -145.435 -145.44 -145.445 -145.45 -145.455 -145.46 -145.465 -145.47 -145.475 -145.48 -145.485 -145.49 -145.495 -145.5 -145.505 -145.51 -145.515 -145.52 -145.525 -145.53 -145.535 -145.54 -145.545 -145.55 -145.555 -145.56 -145.565 -145.57 -145.575 -145.58 -145.585 -145.59 -145.595 -145.6 -145.605 -145.61 -145.615 -145.62 -145.625 -145.63 -145.635 -145.64 -145.645 -145.65 -145.655 -145.66 -145.665 -145.67 -145.675 -145.68 -145.685 -145.69 -145.695 -145.7 -145.705 -145.71 -145.715 -145.72 -145.725 -145.73 -145.735 -145.74 -145.745 -145.75 -145.755 -145.76 -145.765 -145.77 -145.775 -145.78 -145.785 -145.79 -145.795 -145.8 -145.805 -145.81 -145.815 -145.82 -145.825 -145.83 -145.835 -145.84 -145.845 -145.85 -145.855 -145.86 -145.865 -145.87 -145.875 -145.88 -145.885 -145.89 -145.895 -145.9 -145.905 -145.91 -145.915 -145.92 -145.925 -145.93 -145.935 -145.94 -145.945 -145.95 -145.955 -145.96 -145.965 -145.97 -145.975 -145.98 -145.985 -145.99 -145.995 -146 -146.005 -146.01 -146.015 -146.02 -146.025 -146.03 -146.035 -146.04 -146.045 -146.05 -146.055 -146.06 -146.065 -146.07 -146.075 -146.08 -146.085 -146.09 -146.095 -146.1 -146.105 -146.11 -146.115 -146.12 -146.125 -146.13 -146.135 -146.14 -146.145 -146.15 -146.155 -146.16 -146.165 -146.17 -146.175 -146.18 -146.185 -146.19 -146.195 -146.2 -146.205 -146.21 -146.215 -146.22 -146.225 -146.23 -146.235 -146.24 -146.245 -146.25 -146.255 -146.26 -146.265 -146.27 -146.275 -146.28 -146.285 -146.29 -146.295 -146.3 -146.305 -146.31 -146.315 -146.32 -146.325 -146.33 -146.335 -146.34 -146.345 -146.35 -146.355 -146.36 -146.365 -146.37 -146.375 -146.38 -146.385 -146.39 -146.395 -146.4 -146.405 -146.41 -146.415 -146.42 -146.425 -146.43 -146.435 -146.44 -146.445 -146.45 -146.455 -146.46 -146.465 -146.47 -146.475 -146.48 -146.485 -146.49 -146.495 -146.5 -146.505 -146.51 -146.515 -146.52 -146.525 -146.53 -146.535 -146.54 -146.545 -146.55 -146.555 -146.56 -146.565 -146.57 -146.575 -146.58 -146.585 -146.59 -146.595 -146.6 -146.605 -146.61 -146.615 -146.62 -146.625 -146.63 -146.635 -146.64 -146.645 -146.65 -146.655 -146.66 -146.665 -146.67 -146.675 -146.68 -146.685 -146.69 -146.695 -146.7 -146.705 -146.71 -146.715 -146.72 -146.725 -146.73 -146.735 -146.74 -146.745 -146.75 -146.755 -146.76 -146.765 -146.77 -146.775 -146.78 -146.785 -146.79 -146.795 -146.8 -146.805 -146.81 -146.815 -146.82 -146.825 -146.83 -146.835 -146.84 -146.845 -146.85 -146.855 -146.86 -146.865 -146.87 -146.875 -146.88 -146.885 -146.89 -146.895 -146.9 -146.905 -146.91 -146.915 -146.92 -146.925 -146.93 -146.935 -146.94 -146.945 -146.95 -146.955 -146.96 -146.965 -146.97 -146.975 -146.98 -146.985 -146.99 -146.995 -147 -147.005 -147.01 -147.015 -147.02 -147.025 -147.03 -147.035 -147.04 -147.045 -147.05 -147.055 -147.06 -147.065 -147.07 -147.075 -147.08 -147.085 -147.09 -147.095 -147.1 -147.105 -147.11 -147.115 -147.12 -147.125 -147.13 -147.135 -147.14 -147.145 -147.15 -147.155 -147.16 -147.165 -147.17 -147.175 -147.18 -147.185 -147.19 -147.195 -147.2 -147.205 -147.21 -147.215 -147.22 -147.225 -147.23 -147.235 -147.24 -147.245 -147.25 -147.255 -147.26 -147.265 -147.27 -147.275 -147.28 -147.285 -147.29 -147.295 -147.3 -147.305 -147.31 -147.315 -147.32 -147.325 -147.33 -147.335 -147.34 -147.345 -147.35 -147.355 -147.36 -147.365 -147.37 -147.375 -147.38 -147.385 -147.39 -147.395 -147.4 -147.405 -147.41 -147.415 -147.42 -147.425 -147.43 -147.435 -147.44 -147.445 -147.45 -147.455 -147.46 -147.465 -147.47 -147.475 -147.48 -147.485 -147.49 -147.495 -147.5 -147.505 -147.51 -147.515 -147.52 -147.525 -147.53 -147.535 -147.54 -147.545 -147.55 -147.555 -147.56 -147.565 -147.57 -147.575 -147.58 -147.585 -147.59 -147.595 -147.6 -147.605 -147.61 -147.615 -147.62 -147.625 -147.63 -147.635 -147.64 -147.645 -147.65 -147.655 -147.66 -147.665 -147.67 -147.675 -147.68 -147.685 -147.69 -147.695 -147.7 -147.705 -147.71 -147.715 -147.72 -147.725 -147.73 -147.735 -147.74 -147.745 -147.75 -147.755 -147.76 -147.765 -147.77 -147.775 -147.78 -147.785 -147.79 -147.795 -147.8 -147.805 -147.81 -147.815 -147.82 -147.825 -147.83 -147.835 -147.84 -147.845 -147.85 -147.855 -147.86 -147.865 -147.87 -147.875 -147.88 -147.885 -147.89 -147.895 -147.9 -147.905 -147.91 -147.915 -147.92 -147.925 -147.93 -147.935 -147.94 -147.945 -147.95 -147.955 -147.96 -147.965 -147.97 -147.975 -147.98 -147.985 -147.99 -147.995 -148 -148.005 -148.01 -148.015 -148.02 -148.025 -148.03 -148.035 -148.04 -148.045 -148.05 -148.055 -148.06 -148.065 -148.07 -148.075 -148.08 -148.085 -148.09 -148.095 -148.1 -148.105 -148.11 -148.115 -148.12 -148.125 -148.13 -148.135 -148.14 -148.145 -148.15 -148.155 -148.16 -148.165 -148.17 -148.175 -148.18 -148.185 -148.19 -148.195 -148.2 -148.205 -148.21 -148.215 -148.22 -148.225 -148.23 -148.235 -148.24 -148.245 -148.25 -148.255 -148.26 -148.265 -148.27 -148.275 -148.28 -148.285 -148.29 -148.295 -148.3 -148.305 -148.31 -148.315 -148.32 -148.325 -148.33 -148.335 -148.34 -148.345 -148.35 -148.355 -148.36 -148.365 -148.37 -148.375 -148.38 -148.385 -148.39 -148.395 -148.4 -148.405 -148.41 -148.415 -148.42 -148.425 -148.43 -148.435 -148.44 -148.445 -148.45 -148.455 -148.46 -148.465 -148.47 -148.475 -148.48 -148.485 -148.49 -148.495 -148.5 -148.505 -148.51 -148.515 -148.52 -148.525 -148.53 -148.535 -148.54 -148.545 -148.55 -148.555 -148.56 -148.565 -148.57 -148.575 -148.58 -148.585 -148.59 -148.595 -148.6 -148.605 -148.61 -148.615 -148.62 -148.625 -148.63 -148.635 -148.64 -148.645 -148.65 -148.655 -148.66 -148.665 -148.67 -148.675 -148.68 -148.685 -148.69 -148.695 -148.7 -148.705 -148.71 -148.715 -148.72 -148.725 -148.73 -148.735 -148.74 -148.745 -148.75 -148.755 -148.76 -148.765 -148.77 -148.775 -148.78 -148.785 -148.79 -148.795 -148.8 -148.805 -148.81 -148.815 -148.82 -148.825 -148.83 -148.835 -148.84 -148.845 -148.85 -148.855 -148.86 -148.865 -148.87 -148.875 -148.88 -148.885 -148.89 -148.895 -148.9 -148.905 -148.91 -148.915 -148.92 -148.925 -148.93 -148.935 -148.94 -148.945 -148.95 -148.955 -148.96 -148.965 -148.97 -148.975 -148.98 -148.985 -148.99 -148.995 -149 -149.005 -149.01 -149.015 -149.02 -149.025 -149.03 -149.035 -149.04 -149.045 -149.05 -149.055 -149.06 -149.065 -149.07 -149.075 -149.08 -149.085 -149.09 -149.095 -149.1 -149.105 -149.11 -149.115 -149.12 -149.125 -149.13 -149.135 -149.14 -149.145 -149.15 -149.155 -149.16 -149.165 -149.17 -149.175 -149.18 -149.185 -149.19 -149.195 -149.2 -149.205 -149.21 -149.215 -149.22 -149.225 -149.23 -149.235 -149.24 -149.245 -149.25 -149.255 -149.26 -149.265 -149.27 -149.275 -149.28 -149.285 -149.29 -149.295 -149.3 -149.305 -149.31 -149.315 -149.32 -149.325 -149.33 -149.335 -149.34 -149.345 -149.35 -149.355 -149.36 -149.365 -149.37 -149.375 -149.38 -149.385 -149.39 -149.395 -149.4 -149.405 -149.41 -149.415 -149.42 -149.425 -149.43 -149.435 -149.44 -149.445 -149.45 -149.455 -149.46 -149.465 -149.47 -149.475 -149.48 -149.485 -149.49 -149.495 -149.5 -149.505 -149.51 -149.515 -149.52 -149.525 -149.53 -149.535 -149.54 -149.545 -149.55 -149.555 -149.56 -149.565 -149.57 -149.575 -149.58 -149.585 -149.59 -149.595 -149.6 -149.605 -149.61 -149.615 -149.62 -149.625 -149.63 -149.635 -149.64 -149.645 -149.65 -149.655 -149.66 -149.665 -149.67 -149.675 -149.68 -149.685 -149.69 -149.695 -149.7 -149.705 -149.71 -149.715 -149.72 -149.725 -149.73 -149.735 -149.74 -149.745 -149.75 -149.755 -149.76 -149.765 -149.77 -149.775 -149.78 -149.785 -149.79 -149.795 -149.8 -149.805 -149.81 -149.815 -149.82 -149.825 -149.83 -149.835 -149.84 -149.845 -149.85 -149.855 -149.86 -149.865 -149.87 -149.875 -149.88 -149.885 -149.89 -149.895 -149.9 -149.905 -149.91 -149.915 -149.92 -149.925 -149.93 -149.935 -149.94 -149.945 -149.95 -149.955 -149.96 -149.965 -149.97 -149.975 -149.98 -149.985 -149.99 -149.995 -150 -150.005 -150.01 -150.015 -150.02 -150.025 -150.03 -150.035 -150.04 -150.045 -150.05 -150.055 -150.06 -150.065 -150.07 -150.075 -150.08 -150.085 -150.09 -150.095 -150.1 -150.105 -150.11 -150.115 -150.12 -150.125 -150.13 -150.135 -150.14 -150.145 -150.15 -150.155 -150.16 -150.165 -150.17 -150.175 -150.18 -150.185 -150.19 -150.195 -150.2 -150.205 -150.21 -150.215 -150.22 -150.225 -150.23 -150.235 -150.24 -150.245 -150.25 -150.255 -150.26 -150.265 -150.27 -150.275 -150.28 -150.285 -150.29 -150.295 -150.3 -150.305 -150.31 -150.315 -150.32 -150.325 -150.33 -150.335 -150.34 -150.345 -150.35 -150.355 -150.36 -150.365 -150.37 -150.375 -150.38 -150.385 -150.39 -150.395 -150.4 -150.405 -150.41 -150.415 -150.42 -150.425 -150.43 -150.435 -150.44 -150.445 -150.45 -150.455 -150.46 -150.465 -150.47 -150.475 -150.48 -150.485 -150.49 -150.495 -150.5 -150.505 -150.51 -150.515 -150.52 -150.525 -150.53 -150.535 -150.54 -150.545 -150.55 -150.555 -150.56 -150.565 -150.57 -150.575 -150.58 -150.585 -150.59 -150.595 -150.6 -150.605 -150.61 -150.615 -150.62 -150.625 -150.63 -150.635 -150.64 -150.645 -150.65 -150.655 -150.66 -150.665 -150.67 -150.675 -150.68 -150.685 -150.69 -150.695 -150.7 -150.705 -150.71 -150.715 -150.72 -150.725 -150.73 -150.735 -150.74 -150.745 -150.75 -150.755 -150.76 -150.765 -150.77 -150.775 -150.78 -150.785 -150.79 -150.795 -150.8 -150.805 -150.81 -150.815 -150.82 -150.825 -150.83 -150.835 -150.84 -150.845 -150.85 -150.855 -150.86 -150.865 -150.87 -150.875 -150.88 -150.885 -150.89 -150.895 -150.9 -150.905 -150.91 -150.915 -150.92 -150.925 -150.93 -150.935 -150.94 -150.945 -150.95 -150.955 -150.96 -150.965 -150.97 -150.975 -150.98 -150.985 -150.99 -150.995 -151 -151.005 -151.01 -151.015 -151.02 -151.025 -151.03 -151.035 -151.04 -151.045 -151.05 -151.055 -151.06 -151.065 -151.07 -151.075 -151.08 -151.085 -151.09 -151.095 -151.1 -151.105 -151.11 -151.115 -151.12 -151.125 -151.13 -151.135 -151.14 -151.145 -151.15 -151.155 -151.16 -151.165 -151.17 -151.175 -151.18 -151.185 -151.19 -151.195 -151.2 -151.205 -151.21 -151.215 -151.22 -151.225 -151.23 -151.235 -151.24 -151.245 -151.25 -151.255 -151.26 -151.265 -151.27 -151.275 -151.28 -151.285 -151.29 -151.295 -151.3 -151.305 -151.31 -151.315 -151.32 -151.325 -151.33 -151.335 -151.34 -151.345 -151.35 -151.355 -151.36 -151.365 -151.37 -151.375 -151.38 -151.385 -151.39 -151.395 -151.4 -151.405 -151.41 -151.415 -151.42 -151.425 -151.43 -151.435 -151.44 -151.445 -151.45 -151.455 -151.46 -151.465 -151.47 -151.475 -151.48 -151.485 -151.49 -151.495 -151.5 -151.505 -151.51 -151.515 -151.52 -151.525 -151.53 -151.535 -151.54 -151.545 -151.55 -151.555 -151.56 -151.565 -151.57 -151.575 -151.58 -151.585 -151.59 -151.595 -151.6 -151.605 -151.61 -151.615 -151.62 -151.625 -151.63 -151.635 -151.64 -151.645 -151.65 -151.655 -151.66 -151.665 -151.67 -151.675 -151.68 -151.685 -151.69 -151.695 -151.7 -151.705 -151.71 -151.715 -151.72 -151.725 -151.73 -151.735 -151.74 -151.745 -151.75 -151.755 -151.76 -151.765 -151.77 -151.775 -151.78 -151.785 -151.79 -151.795 -151.8 -151.805 -151.81 -151.815 -151.82 -151.825 -151.83 -151.835 -151.84 -151.845 -151.85 -151.855 -151.86 -151.865 -151.87 -151.875 -151.88 -151.885 -151.89 -151.895 -151.9 -151.905 -151.91 -151.915 -151.92 -151.925 -151.93 -151.935 -151.94 -151.945 -151.95 -151.955 -151.96 -151.965 -151.97 -151.975 -151.98 -151.985 -151.99 -151.995 -152 -152.005 -152.01 -152.015 -152.02 -152.025 -152.03 -152.035 -152.04 -152.045 -152.05 -152.055 -152.06 -152.065 -152.07 -152.075 -152.08 -152.085 -152.09 -152.095 -152.1 -152.105 -152.11 -152.115 -152.12 -152.125 -152.13 -152.135 -152.14 -152.145 -152.15 -152.155 -152.16 -152.165 -152.17 -152.175 -152.18 -152.185 -152.19 -152.195 -152.2 -152.205 -152.21 -152.215 -152.22 -152.225 -152.23 -152.235 -152.24 -152.245 -152.25 -152.255 -152.26 -152.265 -152.27 -152.275 -152.28 -152.285 -152.29 -152.295 -152.3 -152.305 -152.31 -152.315 -152.32 -152.325 -152.33 -152.335 -152.34 -152.345 -152.35 -152.355 -152.36 -152.365 -152.37 -152.375 -152.38 -152.385 -152.39 -152.395 -152.4 -152.405 -152.41 -152.415 -152.42 -152.425 -152.43 -152.435 -152.44 -152.445 -152.45 -152.455 -152.46 -152.465 -152.47 -152.475 -152.48 -152.485 -152.49 -152.495 -152.5 -152.505 -152.51 -152.515 -152.52 -152.525 -152.53 -152.535 -152.54 -152.545 -152.55 -152.555 -152.56 -152.565 -152.57 -152.575 -152.58 -152.585 -152.59 -152.595 -152.6 -152.605 -152.61 -152.615 -152.62 -152.625 -152.63 -152.635 -152.64 -152.645 -152.65 -152.655 -152.66 -152.665 -152.67 -152.675 -152.68 -152.685 -152.69 -152.695 -152.7 -152.705 -152.71 -152.715 -152.72 -152.725 -152.73 -152.735 -152.74 -152.745 -152.75 -152.755 -152.76 -152.765 -152.77 -152.775 -152.78 -152.785 -152.79 -152.795 -152.8 -152.805 -152.81 -152.815 -152.82 -152.825 -152.83 -152.835 -152.84 -152.845 -152.85 -152.855 -152.86 -152.865 -152.87 -152.875 -152.88 -152.885 -152.89 -152.895 -152.9 -152.905 -152.91 -152.915 -152.92 -152.925 -152.93 -152.935 -152.94 -152.945 -152.95 -152.955 -152.96 -152.965 -152.97 -152.975 -152.98 -152.985 -152.99 -152.995 -153 -153.005 -153.01 -153.015 -153.02 -153.025 -153.03 -153.035 -153.04 -153.045 -153.05 -153.055 -153.06 -153.065 -153.07 -153.075 -153.08 -153.085 -153.09 -153.095 -153.1 -153.105 -153.11 -153.115 -153.12 -153.125 -153.13 -153.135 -153.14 -153.145 -153.15 -153.155 -153.16 -153.165 -153.17 -153.175 -153.18 -153.185 -153.19 -153.195 -153.2 -153.205 -153.21 -153.215 -153.22 -153.225 -153.23 -153.235 -153.24 -153.245 -153.25 -153.255 -153.26 -153.265 -153.27 -153.275 -153.28 -153.285 -153.29 -153.295 -153.3 -153.305 -153.31 -153.315 -153.32 -153.325 -153.33 -153.335 -153.34 -153.345 -153.35 -153.355 -153.36 -153.365 -153.37 -153.375 -153.38 -153.385 -153.39 -153.395 -153.4 -153.405 -153.41 -153.415 -153.42 -153.425 -153.43 -153.435 -153.44 -153.445 -153.45 -153.455 -153.46 -153.465 -153.47 -153.475 -153.48 -153.485 -153.49 -153.495 -153.5 -153.505 -153.51 -153.515 -153.52 -153.525 -153.53 -153.535 -153.54 -153.545 -153.55 -153.555 -153.56 -153.565 -153.57 -153.575 -153.58 -153.585 -153.59 -153.595 -153.6 -153.605 -153.61 -153.615 -153.62 -153.625 -153.63 -153.635 -153.64 -153.645 -153.65 -153.655 -153.66 -153.665 -153.67 -153.675 -153.68 -153.685 -153.69 -153.695 -153.7 -153.705 -153.71 -153.715 -153.72 -153.725 -153.73 -153.735 -153.74 -153.745 -153.75 -153.755 -153.76 -153.765 -153.77 -153.775 -153.78 -153.785 -153.79 -153.795 -153.8 -153.805 -153.81 -153.815 -153.82 -153.825 -153.83 -153.835 -153.84 -153.845 -153.85 -153.855 -153.86 -153.865 -153.87 -153.875 -153.88 -153.885 -153.89 -153.895 -153.9 -153.905 -153.91 -153.915 -153.92 -153.925 -153.93 -153.935 -153.94 -153.945 -153.95 -153.955 -153.96 -153.965 -153.97 -153.975 -153.98 -153.985 -153.99 -153.995 -154 -154.005 -154.01 -154.015 -154.02 -154.025 -154.03 -154.035 -154.04 -154.045 -154.05 -154.055 -154.06 -154.065 -154.07 -154.075 -154.08 -154.085 -154.09 -154.095 -154.1 -154.105 -154.11 -154.115 -154.12 -154.125 -154.13 -154.135 -154.14 -154.145 -154.15 -154.155 -154.16 -154.165 -154.17 -154.175 -154.18 -154.185 -154.19 -154.195 -154.2 -154.205 -154.21 -154.215 -154.22 -154.225 -154.23 -154.235 -154.24 -154.245 -154.25 -154.255 -154.26 -154.265 -154.27 -154.275 -154.28 -154.285 -154.29 -154.295 -154.3 -154.305 -154.31 -154.315 -154.32 -154.325 -154.33 -154.335 -154.34 -154.345 -154.35 -154.355 -154.36 -154.365 -154.37 -154.375 -154.38 -154.385 -154.39 -154.395 -154.4 -154.405 -154.41 -154.415 -154.42 -154.425 -154.43 -154.435 -154.44 -154.445 -154.45 -154.455 -154.46 -154.465 -154.47 -154.475 -154.48 -154.485 -154.49 -154.495 -154.5 -154.505 -154.51 -154.515 -154.52 -154.525 -154.53 -154.535 -154.54 -154.545 -154.55 -154.555 -154.56 -154.565 -154.57 -154.575 -154.58 -154.585 -154.59 -154.595 -154.6 -154.605 -154.61 -154.615 -154.62 -154.625 -154.63 -154.635 -154.64 -154.645 -154.65 -154.655 -154.66 -154.665 -154.67 -154.675 -154.68 -154.685 -154.69 -154.695 -154.7 -154.705 -154.71 -154.715 -154.72 -154.725 -154.73 -154.735 -154.74 -154.745 -154.75 -154.755 -154.76 -154.765 -154.77 -154.775 -154.78 -154.785 -154.79 -154.795 -154.8 -154.805 -154.81 -154.815 -154.82 -154.825 -154.83 -154.835 -154.84 -154.845 -154.85 -154.855 -154.86 -154.865 -154.87 -154.875 -154.88 -154.885 -154.89 -154.895 -154.9 -154.905 -154.91 -154.915 -154.92 -154.925 -154.93 -154.935 -154.94 -154.945 -154.95 -154.955 -154.96 -154.965 -154.97 -154.975 -154.98 -154.985 -154.99 -154.995 -155 -155.005 -155.01 -155.015 -155.02 -155.025 -155.03 -155.035 -155.04 -155.045 -155.05 -155.055 -155.06 -155.065 -155.07 -155.075 -155.08 -155.085 -155.09 -155.095 -155.1 -155.105 -155.11 -155.115 -155.12 -155.125 -155.13 -155.135 -155.14 -155.145 -155.15 -155.155 -155.16 -155.165 -155.17 -155.175 -155.18 -155.185 -155.19 -155.195 -155.2 -155.205 -155.21 -155.215 -155.22 -155.225 -155.23 -155.235 -155.24 -155.245 -155.25 -155.255 -155.26 -155.265 -155.27 -155.275 -155.28 -155.285 -155.29 -155.295 -155.3 -155.305 -155.31 -155.315 -155.32 -155.325 -155.33 -155.335 -155.34 -155.345 -155.35 -155.355 -155.36 -155.365 -155.37 -155.375 -155.38 -155.385 -155.39 -155.395 -155.4 -155.405 -155.41 -155.415 -155.42 -155.425 -155.43 -155.435 -155.44 -155.445 -155.45 -155.455 -155.46 -155.465 -155.47 -155.475 -155.48 -155.485 -155.49 -155.495 -155.5 -155.505 -155.51 -155.515 -155.52 -155.525 -155.53 -155.535 -155.54 -155.545 -155.55 -155.555 -155.56 -155.565 -155.57 -155.575 -155.58 -155.585 -155.59 -155.595 -155.6 -155.605 -155.61 -155.615 -155.62 -155.625 -155.63 -155.635 -155.64 -155.645 -155.65 -155.655 -155.66 -155.665 -155.67 -155.675 -155.68 -155.685 -155.69 -155.695 -155.7 -155.705 -155.71 -155.715 -155.72 -155.725 -155.73 -155.735 -155.74 -155.745 -155.75 -155.755 -155.76 -155.765 -155.77 -155.775 -155.78 -155.785 -155.79 -155.795 -155.8 -155.805 -155.81 -155.815 -155.82 -155.825 -155.83 -155.835 -155.84 -155.845 -155.85 -155.855 -155.86 -155.865 -155.87 -155.875 -155.88 -155.885 -155.89 -155.895 -155.9 -155.905 -155.91 -155.915 -155.92 -155.925 -155.93 -155.935 -155.94 -155.945 -155.95 -155.955 -155.96 -155.965 -155.97 -155.975 -155.98 -155.985 -155.99 -155.995 -156 -156.005 -156.01 -156.015 -156.02 -156.025 -156.03 -156.035 -156.04 -156.045 -156.05 -156.055 -156.06 -156.065 -156.07 -156.075 -156.08 -156.085 -156.09 -156.095 -156.1 -156.105 -156.11 -156.115 -156.12 -156.125 -156.13 -156.135 -156.14 -156.145 -156.15 -156.155 -156.16 -156.165 -156.17 -156.175 -156.18 -156.185 -156.19 -156.195 -156.2 -156.205 -156.21 -156.215 -156.22 -156.225 -156.23 -156.235 -156.24 -156.245 -156.25 -156.255 -156.26 -156.265 -156.27 -156.275 -156.28 -156.285 -156.29 -156.295 -156.3 -156.305 -156.31 -156.315 -156.32 -156.325 -156.33 -156.335 -156.34 -156.345 -156.35 -156.355 -156.36 -156.365 -156.37 -156.375 -156.38 -156.385 -156.39 -156.395 -156.4 -156.405 -156.41 -156.415 -156.42 -156.425 -156.43 -156.435 -156.44 -156.445 -156.45 -156.455 -156.46 -156.465 -156.47 -156.475 -156.48 -156.485 -156.49 -156.495 -156.5 -156.505 -156.51 -156.515 -156.52 -156.525 -156.53 -156.535 -156.54 -156.545 -156.55 -156.555 -156.56 -156.565 -156.57 -156.575 -156.58 -156.585 -156.59 -156.595 -156.6 -156.605 -156.61 -156.615 -156.62 -156.625 -156.63 -156.635 -156.64 -156.645 -156.65 -156.655 -156.66 -156.665 -156.67 -156.675 -156.68 -156.685 -156.69 -156.695 -156.7 -156.705 -156.71 -156.715 -156.72 -156.725 -156.73 -156.735 -156.74 -156.745 -156.75 -156.755 -156.76 -156.765 -156.77 -156.775 -156.78 -156.785 -156.79 -156.795 -156.8 -156.805 -156.81 -156.815 -156.82 -156.825 -156.83 -156.835 -156.84 -156.845 -156.85 -156.855 -156.86 -156.865 -156.87 -156.875 -156.88 -156.885 -156.89 -156.895 -156.9 -156.905 -156.91 -156.915 -156.92 -156.925 -156.93 -156.935 -156.94 -156.945 -156.95 -156.955 -156.96 -156.965 -156.97 -156.975 -156.98 -156.985 -156.99 -156.995 -157 -157.005 -157.01 -157.015 -157.02 -157.025 -157.03 -157.035 -157.04 -157.045 -157.05 -157.055 -157.06 -157.065 -157.07 -157.075 -157.08 -157.085 -157.09 -157.095 -157.1 -157.105 -157.11 -157.115 -157.12 -157.125 -157.13 -157.135 -157.14 -157.145 -157.15 -157.155 -157.16 -157.165 -157.17 -157.175 -157.18 -157.185 -157.19 -157.195 -157.2 -157.205 -157.21 -157.215 -157.22 -157.225 -157.23 -157.235 -157.24 -157.245 -157.25 -157.255 -157.26 -157.265 -157.27 -157.275 -157.28 -157.285 -157.29 -157.295 -157.3 -157.305 -157.31 -157.315 -157.32 -157.325 -157.33 -157.335 -157.34 -157.345 -157.35 -157.355 -157.36 -157.365 -157.37 -157.375 -157.38 -157.385 -157.39 -157.395 -157.4 -157.405 -157.41 -157.415 -157.42 -157.425 -157.43 -157.435 -157.44 -157.445 -157.45 -157.455 -157.46 -157.465 -157.47 -157.475 -157.48 -157.485 -157.49 -157.495 -157.5 -157.505 -157.51 -157.515 -157.52 -157.525 -157.53 -157.535 -157.54 -157.545 -157.55 -157.555 -157.56 -157.565 -157.57 -157.575 -157.58 -157.585 -157.59 -157.595 -157.6 -157.605 -157.61 -157.615 -157.62 -157.625 -157.63 -157.635 -157.64 -157.645 -157.65 -157.655 -157.66 -157.665 -157.67 -157.675 -157.68 -157.685 -157.69 -157.695 -157.7 -157.705 -157.71 -157.715 -157.72 -157.725 -157.73 -157.735 -157.74 -157.745 -157.75 -157.755 -157.76 -157.765 -157.77 -157.775 -157.78 -157.785 -157.79 -157.795 -157.8 -157.805 -157.81 -157.815 -157.82 -157.825 -157.83 -157.835 -157.84 -157.845 -157.85 -157.855 -157.86 -157.865 -157.87 -157.875 -157.88 -157.885 -157.89 -157.895 -157.9 -157.905 -157.91 -157.915 -157.92 -157.925 -157.93 -157.935 -157.94 -157.945 -157.95 -157.955 -157.96 -157.965 -157.97 -157.975 -157.98 -157.985 -157.99 -157.995 -158 -158.005 -158.01 -158.015 -158.02 -158.025 -158.03 -158.035 -158.04 -158.045 -158.05 -158.055 -158.06 -158.065 -158.07 -158.075 -158.08 -158.085 -158.09 -158.095 -158.1 -158.105 -158.11 -158.115 -158.12 -158.125 -158.13 -158.135 -158.14 -158.145 -158.15 -158.155 -158.16 -158.165 -158.17 -158.175 -158.18 -158.185 -158.19 -158.195 -158.2 -158.205 -158.21 -158.215 -158.22 -158.225 -158.23 -158.235 -158.24 -158.245 -158.25 -158.255 -158.26 -158.265 -158.27 -158.275 -158.28 -158.285 -158.29 -158.295 -158.3 -158.305 -158.31 -158.315 -158.32 -158.325 -158.33 -158.335 -158.34 -158.345 -158.35 -158.355 -158.36 -158.365 -158.37 -158.375 -158.38 -158.385 -158.39 -158.395 -158.4 -158.405 -158.41 -158.415 -158.42 -158.425 -158.43 -158.435 -158.44 -158.445 -158.45 -158.455 -158.46 -158.465 -158.47 -158.475 -158.48 -158.485 -158.49 -158.495 -158.5 -158.505 -158.51 -158.515 -158.52 -158.525 -158.53 -158.535 -158.54 -158.545 -158.55 -158.555 -158.56 -158.565 -158.57 -158.575 -158.58 -158.585 -158.59 -158.595 -158.6 -158.605 -158.61 -158.615 -158.62 -158.625 -158.63 -158.635 -158.64 -158.645 -158.65 -158.655 -158.66 -158.665 -158.67 -158.675 -158.68 -158.685 -158.69 -158.695 -158.7 -158.705 -158.71 -158.715 -158.72 -158.725 -158.73 -158.735 -158.74 -158.745 -158.75 -158.755 -158.76 -158.765 -158.77 -158.775 -158.78 -158.785 -158.79 -158.795 -158.8 -158.805 -158.81 -158.815 -158.82 -158.825 -158.83 -158.835 -158.84 -158.845 -158.85 -158.855 -158.86 -158.865 -158.87 -158.875 -158.88 -158.885 -158.89 -158.895 -158.9 -158.905 -158.91 -158.915 -158.92 -158.925 -158.93 -158.935 -158.94 -158.945 -158.95 -158.955 -158.96 -158.965 -158.97 -158.975 -158.98 -158.985 -158.99 -158.995 -159 -159.005 -159.01 -159.015 -159.02 -159.025 -159.03 -159.035 -159.04 -159.045 -159.05 -159.055 -159.06 -159.065 -159.07 -159.075 -159.08 -159.085 -159.09 -159.095 -159.1 -159.105 -159.11 -159.115 -159.12 -159.125 -159.13 -159.135 -159.14 -159.145 -159.15 -159.155 -159.16 -159.165 -159.17 -159.175 -159.18 -159.185 -159.19 -159.195 -159.2 -159.205 -159.21 -159.215 -159.22 -159.225 -159.23 -159.235 -159.24 -159.245 -159.25 -159.255 -159.26 -159.265 -159.27 -159.275 -159.28 -159.285 -159.29 -159.295 -159.3 -159.305 -159.31 -159.315 -159.32 -159.325 -159.33 -159.335 -159.34 -159.345 -159.35 -159.355 -159.36 -159.365 -159.37 -159.375 -159.38 -159.385 -159.39 -159.395 -159.4 -159.405 -159.41 -159.415 -159.42 -159.425 -159.43 -159.435 -159.44 -159.445 -159.45 -159.455 -159.46 -159.465 -159.47 -159.475 -159.48 -159.485 -159.49 -159.495 -159.5 -159.505 -159.51 -159.515 -159.52 -159.525 -159.53 -159.535 -159.54 -159.545 -159.55 -159.555 -159.56 -159.565 -159.57 -159.575 -159.58 -159.585 -159.59 -159.595 -159.6 -159.605 -159.61 -159.615 -159.62 -159.625 -159.63 -159.635 -159.64 -159.645 -159.65 -159.655 -159.66 -159.665 -159.67 -159.675 -159.68 -159.685 -159.69 -159.695 -159.7 -159.705 -159.71 -159.715 -159.72 -159.725 -159.73 -159.735 -159.74 -159.745 -159.75 -159.755 -159.76 -159.765 -159.77 -159.775 -159.78 -159.785 -159.79 -159.795 -159.8 -159.805 -159.81 -159.815 -159.82 -159.825 -159.83 -159.835 -159.84 -159.845 -159.85 -159.855 -159.86 -159.865 -159.87 -159.875 -159.88 -159.885 -159.89 -159.895 -159.9 -159.905 -159.91 -159.915 -159.92 -159.925 -159.93 -159.935 -159.94 -159.945 -159.95 -159.955 -159.96 -159.965 -159.97 -159.975 -159.98 -159.985 -159.99 -159.995 -160 -160.005 -160.01 -160.015 -160.02 -160.025 -160.03 -160.035 -160.04 -160.045 -160.05 -160.055 -160.06 -160.065 -160.07 -160.075 -160.08 -160.085 -160.09 -160.095 -160.1 -160.105 -160.11 -160.115 -160.12 -160.125 -160.13 -160.135 -160.14 -160.145 -160.15 -160.155 -160.16 -160.165 -160.17 -160.175 -160.18 -160.185 -160.19 -160.195 -160.2 -160.205 -160.21 -160.215 -160.22 -160.225 -160.23 -160.235 -160.24 -160.245 -160.25 -160.255 -160.26 -160.265 -160.27 -160.275 -160.28 -160.285 -160.29 -160.295 -160.3 -160.305 -160.31 -160.315 -160.32 -160.325 -160.33 -160.335 -160.34 -160.345 -160.35 -160.355 -160.36 -160.365 -160.37 -160.375 -160.38 -160.385 -160.39 -160.395 -160.4 -160.405 -160.41 -160.415 -160.42 -160.425 -160.43 -160.435 -160.44 -160.445 -160.45 -160.455 -160.46 -160.465 -160.47 -160.475 -160.48 -160.485 -160.49 -160.495 -160.5 -160.505 -160.51 -160.515 -160.52 -160.525 -160.53 -160.535 -160.54 -160.545 -160.55 -160.555 -160.56 -160.565 -160.57 -160.575 -160.58 -160.585 -160.59 -160.595 -160.6 -160.605 -160.61 -160.615 -160.62 -160.625 -160.63 -160.635 -160.64 -160.645 -160.65 -160.655 -160.66 -160.665 -160.67 -160.675 -160.68 -160.685 -160.69 -160.695 -160.7 -160.705 -160.71 -160.715 -160.72 -160.725 -160.73 -160.735 -160.74 -160.745 -160.75 -160.755 -160.76 -160.765 -160.77 -160.775 -160.78 -160.785 -160.79 -160.795 -160.8 -160.805 -160.81 -160.815 -160.82 -160.825 -160.83 -160.835 -160.84 -160.845 -160.85 -160.855 -160.86 -160.865 -160.87 -160.875 -160.88 -160.885 -160.89 -160.895 -160.9 -160.905 -160.91 -160.915 -160.92 -160.925 -160.93 -160.935 -160.94 -160.945 -160.95 -160.955 -160.96 -160.965 -160.97 -160.975 -160.98 -160.985 -160.99 -160.995 -161 -161.005 -161.01 -161.015 -161.02 -161.025 -161.03 -161.035 -161.04 -161.045 -161.05 -161.055 -161.06 -161.065 -161.07 -161.075 -161.08 -161.085 -161.09 -161.095 -161.1 -161.105 -161.11 -161.115 -161.12 -161.125 -161.13 -161.135 -161.14 -161.145 -161.15 -161.155 -161.16 -161.165 -161.17 -161.175 -161.18 -161.185 -161.19 -161.195 -161.2 -161.205 -161.21 -161.215 -161.22 -161.225 -161.23 -161.235 -161.24 -161.245 -161.25 -161.255 -161.26 -161.265 -161.27 -161.275 -161.28 -161.285 -161.29 -161.295 -161.3 -161.305 -161.31 -161.315 -161.32 -161.325 -161.33 -161.335 -161.34 -161.345 -161.35 -161.355 -161.36 -161.365 -161.37 -161.375 -161.38 -161.385 -161.39 -161.395 -161.4 -161.405 -161.41 -161.415 -161.42 -161.425 -161.43 -161.435 -161.44 -161.445 -161.45 -161.455 -161.46 -161.465 -161.47 -161.475 -161.48 -161.485 -161.49 -161.495 -161.5 -161.505 -161.51 -161.515 -161.52 -161.525 -161.53 -161.535 -161.54 -161.545 -161.55 -161.555 -161.56 -161.565 -161.57 -161.575 -161.58 -161.585 -161.59 -161.595 -161.6 -161.605 -161.61 -161.615 -161.62 -161.625 -161.63 -161.635 -161.64 -161.645 -161.65 -161.655 -161.66 -161.665 -161.67 -161.675 -161.68 -161.685 -161.69 -161.695 -161.7 -161.705 -161.71 -161.715 -161.72 -161.725 -161.73 -161.735 -161.74 -161.745 -161.75 -161.755 -161.76 -161.765 -161.77 -161.775 -161.78 -161.785 -161.79 -161.795 -161.8 -161.805 -161.81 -161.815 -161.82 -161.825 -161.83 -161.835 -161.84 -161.845 -161.85 -161.855 -161.86 -161.865 -161.87 -161.875 -161.88 -161.885 -161.89 -161.895 -161.9 -161.905 -161.91 -161.915 -161.92 -161.925 -161.93 -161.935 -161.94 -161.945 -161.95 -161.955 -161.96 -161.965 -161.97 -161.975 -161.98 -161.985 -161.99 -161.995 -162 -162.005 -162.01 -162.015 -162.02 -162.025 -162.03 -162.035 -162.04 -162.045 -162.05 -162.055 -162.06 -162.065 -162.07 -162.075 -162.08 -162.085 -162.09 -162.095 -162.1 -162.105 -162.11 -162.115 -162.12 -162.125 -162.13 -162.135 -162.14 -162.145 -162.15 -162.155 -162.16 -162.165 -162.17 -162.175 -162.18 -162.185 -162.19 -162.195 -162.2 -162.205 -162.21 -162.215 -162.22 -162.225 -162.23 -162.235 -162.24 -162.245 -162.25 -162.255 -162.26 -162.265 -162.27 -162.275 -162.28 -162.285 -162.29 -162.295 -162.3 -162.305 -162.31 -162.315 -162.32 -162.325 -162.33 -162.335 -162.34 -162.345 -162.35 -162.355 -162.36 -162.365 -162.37 -162.375 -162.38 -162.385 -162.39 -162.395 -162.4 -162.405 -162.41 -162.415 -162.42 -162.425 -162.43 -162.435 -162.44 -162.445 -162.45 -162.455 -162.46 -162.465 -162.47 -162.475 -162.48 -162.485 -162.49 -162.495 -162.5 -162.505 -162.51 -162.515 -162.52 -162.525 -162.53 -162.535 -162.54 -162.545 -162.55 -162.555 -162.56 -162.565 -162.57 -162.575 -162.58 -162.585 -162.59 -162.595 -162.6 -162.605 -162.61 -162.615 -162.62 -162.625 -162.63 -162.635 -162.64 -162.645 -162.65 -162.655 -162.66 -162.665 -162.67 -162.675 -162.68 -162.685 -162.69 -162.695 -162.7 -162.705 -162.71 -162.715 -162.72 -162.725 -162.73 -162.735 -162.74 -162.745 -162.75 -162.755 -162.76 -162.765 -162.77 -162.775 -162.78 -162.785 -162.79 -162.795 -162.8 -162.805 -162.81 -162.815 -162.82 -162.825 -162.83 -162.835 -162.84 -162.845 -162.85 -162.855 -162.86 -162.865 -162.87 -162.875 -162.88 -162.885 -162.89 -162.895 -162.9 -162.905 -162.91 -162.915 -162.92 -162.925 -162.93 -162.935 -162.94 -162.945 -162.95 -162.955 -162.96 -162.965 -162.97 -162.975 -162.98 -162.985 -162.99 -162.995 -163 -163.005 -163.01 -163.015 -163.02 -163.025 -163.03 -163.035 -163.04 -163.045 -163.05 -163.055 -163.06 -163.065 -163.07 -163.075 -163.08 -163.085 -163.09 -163.095 -163.1 -163.105 -163.11 -163.115 -163.12 -163.125 -163.13 -163.135 -163.14 -163.145 -163.15 -163.155 -163.16 -163.165 -163.17 -163.175 -163.18 -163.185 -163.19 -163.195 -163.2 -163.205 -163.21 -163.215 -163.22 -163.225 -163.23 -163.235 -163.24 -163.245 -163.25 -163.255 -163.26 -163.265 -163.27 -163.275 -163.28 -163.285 -163.29 -163.295 -163.3 -163.305 -163.31 -163.315 -163.32 -163.325 -163.33 -163.335 -163.34 -163.345 -163.35 -163.355 -163.36 -163.365 -163.37 -163.375 -163.38 -163.385 -163.39 -163.395 -163.4 -163.405 -163.41 -163.415 -163.42 -163.425 -163.43 -163.435 -163.44 -163.445 -163.45 -163.455 -163.46 -163.465 -163.47 -163.475 -163.48 -163.485 -163.49 -163.495 -163.5 -163.505 -163.51 -163.515 -163.52 -163.525 -163.53 -163.535 -163.54 -163.545 -163.55 -163.555 -163.56 -163.565 -163.57 -163.575 -163.58 -163.585 -163.59 -163.595 -163.6 -163.605 -163.61 -163.615 -163.62 -163.625 -163.63 -163.635 -163.64 -163.645 -163.65 -163.655 -163.66 -163.665 -163.67 -163.675 -163.68 -163.685 -163.69 -163.695 -163.7 -163.705 -163.71 -163.715 -163.72 -163.725 -163.73 -163.735 -163.74 -163.745 -163.75 -163.755 -163.76 -163.765 -163.77 -163.775 -163.78 -163.785 -163.79 -163.795 -163.8 -163.805 -163.81 -163.815 -163.82 -163.825 -163.83 -163.835 -163.84 -163.845 -163.85 -163.855 -163.86 -163.865 -163.87 -163.875 -163.88 -163.885 -163.89 -163.895 -163.9 -163.905 -163.91 -163.915 -163.92 -163.925 -163.93 -163.935 -163.94 -163.945 -163.95 -163.955 -163.96 -163.965 -163.97 -163.975 -163.98 -163.985 -163.99 -163.995 -164 -164.005 -164.01 -164.015 -164.02 -164.025 -164.03 -164.035 -164.04 -164.045 -164.05 -164.055 -164.06 -164.065 -164.07 -164.075 -164.08 -164.085 -164.09 -164.095 -164.1 -164.105 -164.11 -164.115 -164.12 -164.125 -164.13 -164.135 -164.14 -164.145 -164.15 -164.155 -164.16 -164.165 -164.17 -164.175 -164.18 -164.185 -164.19 -164.195 -164.2 -164.205 -164.21 -164.215 -164.22 -164.225 -164.23 -164.235 -164.24 -164.245 -164.25 -164.255 -164.26 -164.265 -164.27 -164.275 -164.28 -164.285 -164.29 -164.295 -164.3 -164.305 -164.31 -164.315 -164.32 -164.325 -164.33 -164.335 -164.34 -164.345 -164.35 -164.355 -164.36 -164.365 -164.37 -164.375 -164.38 -164.385 -164.39 -164.395 -164.4 -164.405 -164.41 -164.415 -164.42 -164.425 -164.43 -164.435 -164.44 -164.445 -164.45 -164.455 -164.46 -164.465 -164.47 -164.475 -164.48 -164.485 -164.49 -164.495 -164.5 -164.505 -164.51 -164.515 -164.52 -164.525 -164.53 -164.535 -164.54 -164.545 -164.55 -164.555 -164.56 -164.565 -164.57 -164.575 -164.58 -164.585 -164.59 -164.595 -164.6 -164.605 -164.61 -164.615 -164.62 -164.625 -164.63 -164.635 -164.64 -164.645 -164.65 -164.655 -164.66 -164.665 -164.67 -164.675 -164.68 -164.685 -164.69 -164.695 -164.7 -164.705 -164.71 -164.715 -164.72 -164.725 -164.73 -164.735 -164.74 -164.745 -164.75 -164.755 -164.76 -164.765 -164.77 -164.775 -164.78 -164.785 -164.79 -164.795 -164.8 -164.805 -164.81 -164.815 -164.82 -164.825 -164.83 -164.835 -164.84 -164.845 -164.85 -164.855 -164.86 -164.865 -164.87 -164.875 -164.88 -164.885 -164.89 -164.895 -164.9 -164.905 -164.91 -164.915 -164.92 -164.925 -164.93 -164.935 -164.94 -164.945 -164.95 -164.955 -164.96 -164.965 -164.97 -164.975 -164.98 -164.985 -164.99 -164.995 -165 -165.005 -165.01 -165.015 -165.02 -165.025 -165.03 -165.035 -165.04 -165.045 -165.05 -165.055 -165.06 -165.065 -165.07 -165.075 -165.08 -165.085 -165.09 -165.095 -165.1 -165.105 -165.11 -165.115 -165.12 -165.125 -165.13 -165.135 -165.14 -165.145 -165.15 -165.155 -165.16 -165.165 -165.17 -165.175 -165.18 -165.185 -165.19 -165.195 -165.2 -165.205 -165.21 -165.215 -165.22 -165.225 -165.23 -165.235 -165.24 -165.245 -165.25 -165.255 -165.26 -165.265 -165.27 -165.275 -165.28 -165.285 -165.29 -165.295 -165.3 -165.305 -165.31 -165.315 -165.32 -165.325 -165.33 -165.335 -165.34 -165.345 -165.35 -165.355 -165.36 -165.365 -165.37 -165.375 -165.38 -165.385 -165.39 -165.395 -165.4 -165.405 -165.41 -165.415 -165.42 -165.425 -165.43 -165.435 -165.44 -165.445 -165.45 -165.455 -165.46 -165.465 -165.47 -165.475 -165.48 -165.485 -165.49 -165.495 -165.5 -165.505 -165.51 -165.515 -165.52 -165.525 -165.53 -165.535 -165.54 -165.545 -165.55 -165.555 -165.56 -165.565 -165.57 -165.575 -165.58 -165.585 -165.59 -165.595 -165.6 -165.605 -165.61 -165.615 -165.62 -165.625 -165.63 -165.635 -165.64 -165.645 -165.65 -165.655 -165.66 -165.665 -165.67 -165.675 -165.68 -165.685 -165.69 -165.695 -165.7 -165.705 -165.71 -165.715 -165.72 -165.725 -165.73 -165.735 -165.74 -165.745 -165.75 -165.755 -165.76 -165.765 -165.77 -165.775 -165.78 -165.785 -165.79 -165.795 -165.8 -165.805 -165.81 -165.815 -165.82 -165.825 -165.83 -165.835 -165.84 -165.845 -165.85 -165.855 -165.86 -165.865 -165.87 -165.875 -165.88 -165.885 -165.89 -165.895 -165.9 -165.905 -165.91 -165.915 -165.92 -165.925 -165.93 -165.935 -165.94 -165.945 -165.95 -165.955 -165.96 -165.965 -165.97 -165.975 -165.98 -165.985 -165.99 -165.995 -166 -166.005 -166.01 -166.015 -166.02 -166.025 -166.03 -166.035 -166.04 -166.045 -166.05 -166.055 -166.06 -166.065 -166.07 -166.075 -166.08 -166.085 -166.09 -166.095 -166.1 -166.105 -166.11 -166.115 -166.12 -166.125 -166.13 -166.135 -166.14 -166.145 -166.15 -166.155 -166.16 -166.165 -166.17 -166.175 -166.18 -166.185 -166.19 -166.195 -166.2 -166.205 -166.21 -166.215 -166.22 -166.225 -166.23 -166.235 -166.24 -166.245 -166.25 -166.255 -166.26 -166.265 -166.27 -166.275 -166.28 -166.285 -166.29 -166.295 -166.3 -166.305 -166.31 -166.315 -166.32 -166.325 -166.33 -166.335 -166.34 -166.345 -166.35 -166.355 -166.36 -166.365 -166.37 -166.375 -166.38 -166.385 -166.39 -166.395 -166.4 -166.405 -166.41 -166.415 -166.42 -166.425 -166.43 -166.435 -166.44 -166.445 -166.45 -166.455 -166.46 -166.465 -166.47 -166.475 -166.48 -166.485 -166.49 -166.495 -166.5 -166.505 -166.51 -166.515 -166.52 -166.525 -166.53 -166.535 -166.54 -166.545 -166.55 -166.555 -166.56 -166.565 -166.57 -166.575 -166.58 -166.585 -166.59 -166.595 -166.6 -166.605 -166.61 -166.615 -166.62 -166.625 -166.63 -166.635 -166.64 -166.645 -166.65 -166.655 -166.66 -166.665 -166.67 -166.675 -166.68 -166.685 -166.69 -166.695 -166.7 -166.705 -166.71 -166.715 -166.72 -166.725 -166.73 -166.735 -166.74 -166.745 -166.75 -166.755 -166.76 -166.765 -166.77 -166.775 -166.78 -166.785 -166.79 -166.795 -166.8 -166.805 -166.81 -166.815 -166.82 -166.825 -166.83 -166.835 -166.84 -166.845 -166.85 -166.855 -166.86 -166.865 -166.87 -166.875 -166.88 -166.885 -166.89 -166.895 -166.9 -166.905 -166.91 -166.915 -166.92 -166.925 -166.93 -166.935 -166.94 -166.945 -166.95 -166.955 -166.96 -166.965 -166.97 -166.975 -166.98 -166.985 -166.99 -166.995 -167 -167.005 -167.01 -167.015 -167.02 -167.025 -167.03 -167.035 -167.04 -167.045 -167.05 -167.055 -167.06 -167.065 -167.07 -167.075 -167.08 -167.085 -167.09 -167.095 -167.1 -167.105 -167.11 -167.115 -167.12 -167.125 -167.13 -167.135 -167.14 -167.145 -167.15 -167.155 -167.16 -167.165 -167.17 -167.175 -167.18 -167.185 -167.19 -167.195 -167.2 -167.205 -167.21 -167.215 -167.22 -167.225 -167.23 -167.235 -167.24 -167.245 -167.25 -167.255 -167.26 -167.265 -167.27 -167.275 -167.28 -167.285 -167.29 -167.295 -167.3 -167.305 -167.31 -167.315 -167.32 -167.325 -167.33 -167.335 -167.34 -167.345 -167.35 -167.355 -167.36 -167.365 -167.37 -167.375 -167.38 -167.385 -167.39 -167.395 -167.4 -167.405 -167.41 -167.415 -167.42 -167.425 -167.43 -167.435 -167.44 -167.445 -167.45 -167.455 -167.46 -167.465 -167.47 -167.475 -167.48 -167.485 -167.49 -167.495 -167.5 -167.505 -167.51 -167.515 -167.52 -167.525 -167.53 -167.535 -167.54 -167.545 -167.55 -167.555 -167.56 -167.565 -167.57 -167.575 -167.58 -167.585 -167.59 -167.595 -167.6 -167.605 -167.61 -167.615 -167.62 -167.625 -167.63 -167.635 -167.64 -167.645 -167.65 -167.655 -167.66 -167.665 -167.67 -167.675 -167.68 -167.685 -167.69 -167.695 -167.7 -167.705 -167.71 -167.715 -167.72 -167.725 -167.73 -167.735 -167.74 -167.745 -167.75 -167.755 -167.76 -167.765 -167.77 -167.775 -167.78 -167.785 -167.79 -167.795 -167.8 -167.805 -167.81 -167.815 -167.82 -167.825 -167.83 -167.835 -167.84 -167.845 -167.85 -167.855 -167.86 -167.865 -167.87 -167.875 -167.88 -167.885 -167.89 -167.895 -167.9 -167.905 -167.91 -167.915 -167.92 -167.925 -167.93 -167.935 -167.94 -167.945 -167.95 -167.955 -167.96 -167.965 -167.97 -167.975 -167.98 -167.985 -167.99 -167.995 -168 -168.005 -168.01 -168.015 -168.02 -168.025 -168.03 -168.035 -168.04 -168.045 -168.05 -168.055 -168.06 -168.065 -168.07 -168.075 -168.08 -168.085 -168.09 -168.095 -168.1 -168.105 -168.11 -168.115 -168.12 -168.125 -168.13 -168.135 -168.14 -168.145 -168.15 -168.155 -168.16 -168.165 -168.17 -168.175 -168.18 -168.185 -168.19 -168.195 -168.2 -168.205 -168.21 -168.215 -168.22 -168.225 -168.23 -168.235 -168.24 -168.245 -168.25 -168.255 -168.26 -168.265 -168.27 -168.275 -168.28 -168.285 -168.29 -168.295 -168.3 -168.305 -168.31 -168.315 -168.32 -168.325 -168.33 -168.335 -168.34 -168.345 -168.35 -168.355 -168.36 -168.365 -168.37 -168.375 -168.38 -168.385 -168.39 -168.395 -168.4 -168.405 -168.41 -168.415 -168.42 -168.425 -168.43 -168.435 -168.44 -168.445 -168.45 -168.455 -168.46 -168.465 -168.47 -168.475 -168.48 -168.485 -168.49 -168.495 -168.5 -168.505 -168.51 -168.515 -168.52 -168.525 -168.53 -168.535 -168.54 -168.545 -168.55 -168.555 -168.56 -168.565 -168.57 -168.575 -168.58 -168.585 -168.59 -168.595 -168.6 -168.605 -168.61 -168.615 -168.62 -168.625 -168.63 -168.635 -168.64 -168.645 -168.65 -168.655 -168.66 -168.665 -168.67 -168.675 -168.68 -168.685 -168.69 -168.695 -168.7 -168.705 -168.71 -168.715 -168.72 -168.725 -168.73 -168.735 -168.74 -168.745 -168.75 -168.755 -168.76 -168.765 -168.77 -168.775 -168.78 -168.785 -168.79 -168.795 -168.8 -168.805 -168.81 -168.815 -168.82 -168.825 -168.83 -168.835 -168.84 -168.845 -168.85 -168.855 -168.86 -168.865 -168.87 -168.875 -168.88 -168.885 -168.89 -168.895 -168.9 -168.905 -168.91 -168.915 -168.92 -168.925 -168.93 -168.935 -168.94 -168.945 -168.95 -168.955 -168.96 -168.965 -168.97 -168.975 -168.98 -168.985 -168.99 -168.995 -169 -169.005 -169.01 -169.015 -169.02 -169.025 -169.03 -169.035 -169.04 -169.045 -169.05 -169.055 -169.06 -169.065 -169.07 -169.075 -169.08 -169.085 -169.09 -169.095 -169.1 -169.105 -169.11 -169.115 -169.12 -169.125 -169.13 -169.135 -169.14 -169.145 -169.15 -169.155 -169.16 -169.165 -169.17 -169.175 -169.18 -169.185 -169.19 -169.195 -169.2 -169.205 -169.21 -169.215 -169.22 -169.225 -169.23 -169.235 -169.24 -169.245 -169.25 -169.255 -169.26 -169.265 -169.27 -169.275 -169.28 -169.285 -169.29 -169.295 -169.3 -169.305 -169.31 -169.315 -169.32 -169.325 -169.33 -169.335 -169.34 -169.345 -169.35 -169.355 -169.36 -169.365 -169.37 -169.375 -169.38 -169.385 -169.39 -169.395 -169.4 -169.405 -169.41 -169.415 -169.42 -169.425 -169.43 -169.435 -169.44 -169.445 -169.45 -169.455 -169.46 -169.465 -169.47 -169.475 -169.48 -169.485 -169.49 -169.495 -169.5 -169.505 -169.51 -169.515 -169.52 -169.525 -169.53 -169.535 -169.54 -169.545 -169.55 -169.555 -169.56 -169.565 -169.57 -169.575 -169.58 -169.585 -169.59 -169.595 -169.6 -169.605 -169.61 -169.615 -169.62 -169.625 -169.63 -169.635 -169.64 -169.645 -169.65 -169.655 -169.66 -169.665 -169.67 -169.675 -169.68 -169.685 -169.69 -169.695 -169.7 -169.705 -169.71 -169.715 -169.72 -169.725 -169.73 -169.735 -169.74 -169.745 -169.75 -169.755 -169.76 -169.765 -169.77 -169.775 -169.78 -169.785 -169.79 -169.795 -169.8 -169.805 -169.81 -169.815 -169.82 -169.825 -169.83 -169.835 -169.84 -169.845 -169.85 -169.855 -169.86 -169.865 -169.87 -169.875 -169.88 -169.885 -169.89 -169.895 -169.9 -169.905 -169.91 -169.915 -169.92 -169.925 -169.93 -169.935 -169.94 -169.945 -169.95 -169.955 -169.96 -169.965 -169.97 -169.975 -169.98 -169.985 -169.99 -169.995 -170 -170.005 -170.01 -170.015 -170.02 -170.025 -170.03 -170.035 -170.04 -170.045 -170.05 -170.055 -170.06 -170.065 -170.07 -170.075 -170.08 -170.085 -170.09 -170.095 -170.1 -170.105 -170.11 -170.115 -170.12 -170.125 -170.13 -170.135 -170.14 -170.145 -170.15 -170.155 -170.16 -170.165 -170.17 -170.175 -170.18 -170.185 -170.19 -170.195 -170.2 -170.205 -170.21 -170.215 -170.22 -170.225 -170.23 -170.235 -170.24 -170.245 -170.25 -170.255 -170.26 -170.265 -170.27 -170.275 -170.28 -170.285 -170.29 -170.295 -170.3 -170.305 -170.31 -170.315 -170.32 -170.325 -170.33 -170.335 -170.34 -170.345 -170.35 -170.355 -170.36 -170.365 -170.37 -170.375 -170.38 -170.385 -170.39 -170.395 -170.4 -170.405 -170.41 -170.415 -170.42 -170.425 -170.43 -170.435 -170.44 -170.445 -170.45 -170.455 -170.46 -170.465 -170.47 -170.475 -170.48 -170.485 -170.49 -170.495 -170.5 -170.505 -170.51 -170.515 -170.52 -170.525 -170.53 -170.535 -170.54 -170.545 -170.55 -170.555 -170.56 -170.565 -170.57 -170.575 -170.58 -170.585 -170.59 -170.595 -170.6 -170.605 -170.61 -170.615 -170.62 -170.625 -170.63 -170.635 -170.64 -170.645 -170.65 -170.655 -170.66 -170.665 -170.67 -170.675 -170.68 -170.685 -170.69 -170.695 -170.7 -170.705 -170.71 -170.715 -170.72 -170.725 -170.73 -170.735 -170.74 -170.745 -170.75 -170.755 -170.76 -170.765 -170.77 -170.775 -170.78 -170.785 -170.79 -170.795 -170.8 -170.805 -170.81 -170.815 -170.82 -170.825 -170.83 -170.835 -170.84 -170.845 -170.85 -170.855 -170.86 -170.865 -170.87 -170.875 -170.88 -170.885 -170.89 -170.895 -170.9 -170.905 -170.91 -170.915 -170.92 -170.925 -170.93 -170.935 -170.94 -170.945 -170.95 -170.955 -170.96 -170.965 -170.97 -170.975 -170.98 -170.985 -170.99 -170.995 -171 -171.005 -171.01 -171.015 -171.02 -171.025 -171.03 -171.035 -171.04 -171.045 -171.05 -171.055 -171.06 -171.065 -171.07 -171.075 -171.08 -171.085 -171.09 -171.095 -171.1 -171.105 -171.11 -171.115 -171.12 -171.125 -171.13 -171.135 -171.14 -171.145 -171.15 -171.155 -171.16 -171.165 -171.17 -171.175 -171.18 -171.185 -171.19 -171.195 -171.2 -171.205 -171.21 -171.215 -171.22 -171.225 -171.23 -171.235 -171.24 -171.245 -171.25 -171.255 -171.26 -171.265 -171.27 -171.275 -171.28 -171.285 -171.29 -171.295 -171.3 -171.305 -171.31 -171.315 -171.32 -171.325 -171.33 -171.335 -171.34 -171.345 -171.35 -171.355 -171.36 -171.365 -171.37 -171.375 -171.38 -171.385 -171.39 -171.395 -171.4 -171.405 -171.41 -171.415 -171.42 -171.425 -171.43 -171.435 -171.44 -171.445 -171.45 -171.455 -171.46 -171.465 -171.47 -171.475 -171.48 -171.485 -171.49 -171.495 -171.5 -171.505 -171.51 -171.515 -171.52 -171.525 -171.53 -171.535 -171.54 -171.545 -171.55 -171.555 -171.56 -171.565 -171.57 -171.575 -171.58 -171.585 -171.59 -171.595 -171.6 -171.605 -171.61 -171.615 -171.62 -171.625 -171.63 -171.635 -171.64 -171.645 -171.65 -171.655 -171.66 -171.665 -171.67 -171.675 -171.68 -171.685 -171.69 -171.695 -171.7 -171.705 -171.71 -171.715 -171.72 -171.725 -171.73 -171.735 -171.74 -171.745 -171.75 -171.755 -171.76 -171.765 -171.77 -171.775 -171.78 -171.785 -171.79 -171.795 -171.8 -171.805 -171.81 -171.815 -171.82 -171.825 -171.83 -171.835 -171.84 -171.845 -171.85 -171.855 -171.86 -171.865 -171.87 -171.875 -171.88 -171.885 -171.89 -171.895 -171.9 -171.905 -171.91 -171.915 -171.92 -171.925 -171.93 -171.935 -171.94 -171.945 -171.95 -171.955 -171.96 -171.965 -171.97 -171.975 -171.98 -171.985 -171.99 -171.995 -172 -172.005 -172.01 -172.015 -172.02 -172.025 -172.03 -172.035 -172.04 -172.045 -172.05 -172.055 -172.06 -172.065 -172.07 -172.075 -172.08 -172.085 -172.09 -172.095 -172.1 -172.105 -172.11 -172.115 -172.12 -172.125 -172.13 -172.135 -172.14 -172.145 -172.15 -172.155 -172.16 -172.165 -172.17 -172.175 -172.18 -172.185 -172.19 -172.195 -172.2 -172.205 -172.21 -172.215 -172.22 -172.225 -172.23 -172.235 -172.24 -172.245 -172.25 -172.255 -172.26 -172.265 -172.27 -172.275 -172.28 -172.285 -172.29 -172.295 -172.3 -172.305 -172.31 -172.315 -172.32 -172.325 -172.33 -172.335 -172.34 -172.345 -172.35 -172.355 -172.36 -172.365 -172.37 -172.375 -172.38 -172.385 -172.39 -172.395 -172.4 -172.405 -172.41 -172.415 -172.42 -172.425 -172.43 -172.435 -172.44 -172.445 -172.45 -172.455 -172.46 -172.465 -172.47 -172.475 -172.48 -172.485 -172.49 -172.495 -172.5 -172.505 -172.51 -172.515 -172.52 -172.525 -172.53 -172.535 -172.54 -172.545 -172.55 -172.555 -172.56 -172.565 -172.57 -172.575 -172.58 -172.585 -172.59 -172.595 -172.6 -172.605 -172.61 -172.615 -172.62 -172.625 -172.63 -172.635 -172.64 -172.645 -172.65 -172.655 -172.66 -172.665 -172.67 -172.675 -172.68 -172.685 -172.69 -172.695 -172.7 -172.705 -172.71 -172.715 -172.72 -172.725 -172.73 -172.735 -172.74 -172.745 -172.75 -172.755 -172.76 -172.765 -172.77 -172.775 -172.78 -172.785 -172.79 -172.795 -172.8 -172.805 -172.81 -172.815 -172.82 -172.825 -172.83 -172.835 -172.84 -172.845 -172.85 -172.855 -172.86 -172.865 -172.87 -172.875 -172.88 -172.885 -172.89 -172.895 -172.9 -172.905 -172.91 -172.915 -172.92 -172.925 -172.93 -172.935 -172.94 -172.945 -172.95 -172.955 -172.96 -172.965 -172.97 -172.975 -172.98 -172.985 -172.99 -172.995 -173 -173.005 -173.01 -173.015 -173.02 -173.025 -173.03 -173.035 -173.04 -173.045 -173.05 -173.055 -173.06 -173.065 -173.07 -173.075 -173.08 -173.085 -173.09 -173.095 -173.1 -173.105 -173.11 -173.115 -173.12 -173.125 -173.13 -173.135 -173.14 -173.145 -173.15 -173.155 -173.16 -173.165 -173.17 -173.175 -173.18 -173.185 -173.19 -173.195 -173.2 -173.205 -173.21 -173.215 -173.22 -173.225 -173.23 -173.235 -173.24 -173.245 -173.25 -173.255 -173.26 -173.265 -173.27 -173.275 -173.28 -173.285 -173.29 -173.295 -173.3 -173.305 -173.31 -173.315 -173.32 -173.325 -173.33 -173.335 -173.34 -173.345 -173.35 -173.355 -173.36 -173.365 -173.37 -173.375 -173.38 -173.385 -173.39 -173.395 -173.4 -173.405 -173.41 -173.415 -173.42 -173.425 -173.43 -173.435 -173.44 -173.445 -173.45 -173.455 -173.46 -173.465 -173.47 -173.475 -173.48 -173.485 -173.49 -173.495 -173.5 -173.505 -173.51 -173.515 -173.52 -173.525 -173.53 -173.535 -173.54 -173.545 -173.55 -173.555 -173.56 -173.565 -173.57 -173.575 -173.58 -173.585 -173.59 -173.595 -173.6 -173.605 -173.61 -173.615 -173.62 -173.625 -173.63 -173.635 -173.64 -173.645 -173.65 -173.655 -173.66 -173.665 -173.67 -173.675 -173.68 -173.685 -173.69 -173.695 -173.7 -173.705 -173.71 -173.715 -173.72 -173.725 -173.73 -173.735 -173.74 -173.745 -173.75 -173.755 -173.76 -173.765 -173.77 -173.775 -173.78 -173.785 -173.79 -173.795 -173.8 -173.805 -173.81 -173.815 -173.82 -173.825 -173.83 -173.835 -173.84 -173.845 -173.85 -173.855 -173.86 -173.865 -173.87 -173.875 -173.88 -173.885 -173.89 -173.895 -173.9 -173.905 -173.91 -173.915 -173.92 -173.925 -173.93 -173.935 -173.94 -173.945 -173.95 -173.955 -173.96 -173.965 -173.97 -173.975 -173.98 -173.985 -173.99 -173.995 -174 -174.005 -174.01 -174.015 -174.02 -174.025 -174.03 -174.035 -174.04 -174.045 -174.05 -174.055 -174.06 -174.065 -174.07 -174.075 -174.08 -174.085 -174.09 -174.095 -174.1 -174.105 -174.11 -174.115 -174.12 -174.125 -174.13 -174.135 -174.14 -174.145 -174.15 -174.155 -174.16 -174.165 -174.17 -174.175 -174.18 -174.185 -174.19 -174.195 -174.2 -174.205 -174.21 -174.215 -174.22 -174.225 -174.23 -174.235 -174.24 -174.245 -174.25 -174.255 -174.26 -174.265 -174.27 -174.275 -174.28 -174.285 -174.29 -174.295 -174.3 -174.305 -174.31 -174.315 -174.32 -174.325 -174.33 -174.335 -174.34 -174.345 -174.35 -174.355 -174.36 -174.365 -174.37 -174.375 -174.38 -174.385 -174.39 -174.395 -174.4 -174.405 -174.41 -174.415 -174.42 -174.425 -174.43 -174.435 -174.44 -174.445 -174.45 -174.455 -174.46 -174.465 -174.47 -174.475 -174.48 -174.485 -174.49 -174.495 -174.5 -174.505 -174.51 -174.515 -174.52 -174.525 -174.53 -174.535 -174.54 -174.545 -174.55 -174.555 -174.56 -174.565 -174.57 -174.575 -174.58 -174.585 -174.59 -174.595 -174.6 -174.605 -174.61 -174.615 -174.62 -174.625 -174.63 -174.635 -174.64 -174.645 -174.65 -174.655 -174.66 -174.665 -174.67 -174.675 -174.68 -174.685 -174.69 -174.695 -174.7 -174.705 -174.71 -174.715 -174.72 -174.725 -174.73 -174.735 -174.74 -174.745 -174.75 -174.755 -174.76 -174.765 -174.77 -174.775 -174.78 -174.785 -174.79 -174.795 -174.8 -174.805 -174.81 -174.815 -174.82 -174.825 -174.83 -174.835 -174.84 -174.845 -174.85 -174.855 -174.86 -174.865 -174.87 -174.875 -174.88 -174.885 -174.89 -174.895 -174.9 -174.905 -174.91 -174.915 -174.92 -174.925 -174.93 -174.935 -174.94 -174.945 -174.95 -174.955 -174.96 -174.965 -174.97 -174.975 -174.98 -174.985 -174.99 -174.995 -175 -175.005 -175.01 -175.015 -175.02 -175.025 -175.03 -175.035 -175.04 -175.045 -175.05 -175.055 -175.06 -175.065 -175.07 -175.075 -175.08 -175.085 -175.09 -175.095 -175.1 -175.105 -175.11 -175.115 -175.12 -175.125 -175.13 -175.135 -175.14 -175.145 -175.15 -175.155 -175.16 -175.165 -175.17 -175.175 -175.18 -175.185 -175.19 -175.195 -175.2 -175.205 -175.21 -175.215 -175.22 -175.225 -175.23 -175.235 -175.24 -175.245 -175.25 -175.255 -175.26 -175.265 -175.27 -175.275 -175.28 -175.285 -175.29 -175.295 -175.3 -175.305 -175.31 -175.315 -175.32 -175.325 -175.33 -175.335 -175.34 -175.345 -175.35 -175.355 -175.36 -175.365 -175.37 -175.375 -175.38 -175.385 -175.39 -175.395 -175.4 -175.405 -175.41 -175.415 -175.42 -175.425 -175.43 -175.435 -175.44 -175.445 -175.45 -175.455 -175.46 -175.465 -175.47 -175.475 -175.48 -175.485 -175.49 -175.495 -175.5 -175.505 -175.51 -175.515 -175.52 -175.525 -175.53 -175.535 -175.54 -175.545 -175.55 -175.555 -175.56 -175.565 -175.57 -175.575 -175.58 -175.585 -175.59 -175.595 -175.6 -175.605 -175.61 -175.615 -175.62 -175.625 -175.63 -175.635 -175.64 -175.645 -175.65 -175.655 -175.66 -175.665 -175.67 -175.675 -175.68 -175.685 -175.69 -175.695 -175.7 -175.705 -175.71 -175.715 -175.72 -175.725 -175.73 -175.735 -175.74 -175.745 -175.75 -175.755 -175.76 -175.765 -175.77 -175.775 -175.78 -175.785 -175.79 -175.795 -175.8 -175.805 -175.81 -175.815 -175.82 -175.825 -175.83 -175.835 -175.84 -175.845 -175.85 -175.855 -175.86 -175.865 -175.87 -175.875 -175.88 -175.885 -175.89 -175.895 -175.9 -175.905 -175.91 -175.915 -175.92 -175.925 -175.93 -175.935 -175.94 -175.945 -175.95 -175.955 -175.96 -175.965 -175.97 -175.975 -175.98 -175.985 -175.99 -175.995 -176 -176.005 -176.01 -176.015 -176.02 -176.025 -176.03 -176.035 -176.04 -176.045 -176.05 -176.055 -176.06 -176.065 -176.07 -176.075 -176.08 -176.085 -176.09 -176.095 -176.1 -176.105 -176.11 -176.115 -176.12 -176.125 -176.13 -176.135 -176.14 -176.145 -176.15 -176.155 -176.16 -176.165 -176.17 -176.175 -176.18 -176.185 -176.19 -176.195 -176.2 -176.205 -176.21 -176.215 -176.22 -176.225 -176.23 -176.235 -176.24 -176.245 -176.25 -176.255 -176.26 -176.265 -176.27 -176.275 -176.28 -176.285 -176.29 -176.295 -176.3 -176.305 -176.31 -176.315 -176.32 -176.325 -176.33 -176.335 -176.34 -176.345 -176.35 -176.355 -176.36 -176.365 -176.37 -176.375 -176.38 -176.385 -176.39 -176.395 -176.4 -176.405 -176.41 -176.415 -176.42 -176.425 -176.43 -176.435 -176.44 -176.445 -176.45 -176.455 -176.46 -176.465 -176.47 -176.475 -176.48 -176.485 -176.49 -176.495 -176.5 -176.505 -176.51 -176.515 -176.52 -176.525 -176.53 -176.535 -176.54 -176.545 -176.55 -176.555 -176.56 -176.565 -176.57 -176.575 -176.58 -176.585 -176.59 -176.595 -176.6 -176.605 -176.61 -176.615 -176.62 -176.625 -176.63 -176.635 -176.64 -176.645 -176.65 -176.655 -176.66 -176.665 -176.67 -176.675 -176.68 -176.685 -176.69 -176.695 -176.7 -176.705 -176.71 -176.715 -176.72 -176.725 -176.73 -176.735 -176.74 -176.745 -176.75 -176.755 -176.76 -176.765 -176.77 -176.775 -176.78 -176.785 -176.79 -176.795 -176.8 -176.805 -176.81 -176.815 -176.82 -176.825 -176.83 -176.835 -176.84 -176.845 -176.85 -176.855 -176.86 -176.865 -176.87 -176.875 -176.88 -176.885 -176.89 -176.895 -176.9 -176.905 -176.91 -176.915 -176.92 -176.925 -176.93 -176.935 -176.94 -176.945 -176.95 -176.955 -176.96 -176.965 -176.97 -176.975 -176.98 -176.985 -176.99 -176.995 -177 -177.005 -177.01 -177.015 -177.02 -177.025 -177.03 -177.035 -177.04 -177.045 -177.05 -177.055 -177.06 -177.065 -177.07 -177.075 -177.08 -177.085 -177.09 -177.095 -177.1 -177.105 -177.11 -177.115 -177.12 -177.125 -177.13 -177.135 -177.14 -177.145 -177.15 -177.155 -177.16 -177.165 -177.17 -177.175 -177.18 -177.185 -177.19 -177.195 -177.2 -177.205 -177.21 -177.215 -177.22 -177.225 -177.23 -177.235 -177.24 -177.245 -177.25 -177.255 -177.26 -177.265 -177.27 -177.275 -177.28 -177.285 -177.29 -177.295 -177.3 -177.305 -177.31 -177.315 -177.32 -177.325 -177.33 -177.335 -177.34 -177.345 -177.35 -177.355 -177.36 -177.365 -177.37 -177.375 -177.38 -177.385 -177.39 -177.395 -177.4 -177.405 -177.41 -177.415 -177.42 -177.425 -177.43 -177.435 -177.44 -177.445 -177.45 -177.455 -177.46 -177.465 -177.47 -177.475 -177.48 -177.485 -177.49 -177.495 -177.5 -177.505 -177.51 -177.515 -177.52 -177.525 -177.53 -177.535 -177.54 -177.545 -177.55 -177.555 -177.56 -177.565 -177.57 -177.575 -177.58 -177.585 -177.59 -177.595 -177.6 -177.605 -177.61 -177.615 -177.62 -177.625 -177.63 -177.635 -177.64 -177.645 -177.65 -177.655 -177.66 -177.665 -177.67 -177.675 -177.68 -177.685 -177.69 -177.695 -177.7 -177.705 -177.71 -177.715 -177.72 -177.725 -177.73 -177.735 -177.74 -177.745 -177.75 -177.755 -177.76 -177.765 -177.77 -177.775 -177.78 -177.785 -177.79 -177.795 -177.8 -177.805 -177.81 -177.815 -177.82 -177.825 -177.83 -177.835 -177.84 -177.845 -177.85 -177.855 -177.86 -177.865 -177.87 -177.875 -177.88 -177.885 -177.89 -177.895 -177.9 -177.905 -177.91 -177.915 -177.92 -177.925 -177.93 -177.935 -177.94 -177.945 -177.95 -177.955 -177.96 -177.965 -177.97 -177.975 -177.98 -177.985 -177.99 -177.995 -178 -178.005 -178.01 -178.015 -178.02 -178.025 -178.03 -178.035 -178.04 -178.045 -178.05 -178.055 -178.06 -178.065 -178.07 -178.075 -178.08 -178.085 -178.09 -178.095 -178.1 -178.105 -178.11 -178.115 -178.12 -178.125 -178.13 -178.135 -178.14 -178.145 -178.15 -178.155 -178.16 -178.165 -178.17 -178.175 -178.18 -178.185 -178.19 -178.195 -178.2 -178.205 -178.21 -178.215 -178.22 -178.225 -178.23 -178.235 -178.24 -178.245 -178.25 -178.255 -178.26 -178.265 -178.27 -178.275 -178.28 -178.285 -178.29 -178.295 -178.3 -178.305 -178.31 -178.315 -178.32 -178.325 -178.33 -178.335 -178.34 -178.345 -178.35 -178.355 -178.36 -178.365 -178.37 -178.375 -178.38 -178.385 -178.39 -178.395 -178.4 -178.405 -178.41 -178.415 -178.42 -178.425 -178.43 -178.435 -178.44 -178.445 -178.45 -178.455 -178.46 -178.465 -178.47 -178.475 -178.48 -178.485 -178.49 -178.495 -178.5 -178.505 -178.51 -178.515 -178.52 -178.525 -178.53 -178.535 -178.54 -178.545 -178.55 -178.555 -178.56 -178.565 -178.57 -178.575 -178.58 -178.585 -178.59 -178.595 -178.6 -178.605 -178.61 -178.615 -178.62 -178.625 -178.63 -178.635 -178.64 -178.645 -178.65 -178.655 -178.66 -178.665 -178.67 -178.675 -178.68 -178.685 -178.69 -178.695 -178.7 -178.705 -178.71 -178.715 -178.72 -178.725 -178.73 -178.735 -178.74 -178.745 -178.75 -178.755 -178.76 -178.765 -178.77 -178.775 -178.78 -178.785 -178.79 -178.795 -178.8 -178.805 -178.81 -178.815 -178.82 -178.825 -178.83 -178.835 -178.84 -178.845 -178.85 -178.855 -178.86 -178.865 -178.87 -178.875 -178.88 -178.885 -178.89 -178.895 -178.9 -178.905 -178.91 -178.915 -178.92 -178.925 -178.93 -178.935 -178.94 -178.945 -178.95 -178.955 -178.96 -178.965 -178.97 -178.975 -178.98 -178.985 -178.99 -178.995 -179 -179.005 -179.01 -179.015 -179.02 -179.025 -179.03 -179.035 -179.04 -179.045 -179.05 -179.055 -179.06 -179.065 -179.07 -179.075 -179.08 -179.085 -179.09 -179.095 -179.1 -179.105 -179.11 -179.115 -179.12 -179.125 -179.13 -179.135 -179.14 -179.145 -179.15 -179.155 -179.16 -179.165 -179.17 -179.175 -179.18 -179.185 -179.19 -179.195 -179.2 -179.205 -179.21 -179.215 -179.22 -179.225 -179.23 -179.235 -179.24 -179.245 -179.25 -179.255 -179.26 -179.265 -179.27 -179.275 -179.28 -179.285 -179.29 -179.295 -179.3 -179.305 -179.31 -179.315 -179.32 -179.325 -179.33 -179.335 -179.34 -179.345 -179.35 -179.355 -179.36 -179.365 -179.37 -179.375 -179.38 -179.385 -179.39 -179.395 -179.4 -179.405 -179.41 -179.415 -179.42 -179.425 -179.43 -179.435 -179.44 -179.445 -179.45 -179.455 -179.46 -179.465 -179.47 -179.475 -179.48 -179.485 -179.49 -179.495 -179.5 -179.505 -179.51 -179.515 -179.52 -179.525 -179.53 -179.535 -179.54 -179.545 -179.55 -179.555 -179.56 -179.565 -179.57 -179.575 -179.58 -179.585 -179.59 -179.595 -179.6 -179.605 -179.61 -179.615 -179.62 -179.625 -179.63 -179.635 -179.64 -179.645 -179.65 -179.655 -179.66 -179.665 -179.67 -179.675 -179.68 -179.685 -179.69 -179.695 -179.7 -179.705 -179.71 -179.715 -179.72 -179.725 -179.73 -179.735 -179.74 -179.745 -179.75 -179.755 -179.76 -179.765 -179.77 -179.775 -179.78 -179.785 -179.79 -179.795 -179.8 -179.805 -179.81 -179.815 -179.82 -179.825 -179.83 -179.835 -179.84 -179.845 -179.85 -179.855 -179.86 -179.865 -179.87 -179.875 -179.88 -179.885 -179.89 -179.895 -179.9 -179.905 -179.91 -179.915 -179.92 -179.925 -179.93 -179.935 -179.94 -179.945 -179.95 -179.955 -179.96 -179.965 -179.97 -179.975 -179.98 -179.985 -179.99 -179.995 -180 -180.005 -180.01 -180.015 -180.02 -180.025 -180.03 -180.035 -180.04 -180.045 -180.05 -180.055 -180.06 -180.065 -180.07 -180.075 -180.08 -180.085 -180.09 -180.095 -180.1 -180.105 -180.11 -180.115 -180.12 -180.125 -180.13 -180.135 -180.14 -180.145 -180.15 -180.155 -180.16 -180.165 -180.17 -180.175 -180.18 -180.185 -180.19 -180.195 -180.2 -180.205 -180.21 -180.215 -180.22 -180.225 -180.23 -180.235 -180.24 -180.245 -180.25 -180.255 -180.26 -180.265 -180.27 -180.275 -180.28 -180.285 -180.29 -180.295 -180.3 -180.305 -180.31 -180.315 -180.32 -180.325 -180.33 -180.335 -180.34 -180.345 -180.35 -180.355 -180.36 -180.365 -180.37 -180.375 -180.38 -180.385 -180.39 -180.395 -180.4 -180.405 -180.41 -180.415 -180.42 -180.425 -180.43 -180.435 -180.44 -180.445 -180.45 -180.455 -180.46 -180.465 -180.47 -180.475 -180.48 -180.485 -180.49 -180.495 -180.5 -180.505 -180.51 -180.515 -180.52 -180.525 -180.53 -180.535 -180.54 -180.545 -180.55 -180.555 -180.56 -180.565 -180.57 -180.575 -180.58 -180.585 -180.59 -180.595 -180.6 -180.605 -180.61 -180.615 -180.62 -180.625 -180.63 -180.635 -180.64 -180.645 -180.65 -180.655 -180.66 -180.665 -180.67 -180.675 -180.68 -180.685 -180.69 -180.695 -180.7 -180.705 -180.71 -180.715 -180.72 -180.725 -180.73 -180.735 -180.74 -180.745 -180.75 -180.755 -180.76 -180.765 -180.77 -180.775 -180.78 -180.785 -180.79 -180.795 -180.8 -180.805 -180.81 -180.815 -180.82 -180.825 -180.83 -180.835 -180.84 -180.845 -180.85 -180.855 -180.86 -180.865 -180.87 -180.875 -180.88 -180.885 -180.89 -180.895 -180.9 -180.905 -180.91 -180.915 -180.92 -180.925 -180.93 -180.935 -180.94 -180.945 -180.95 -180.955 -180.96 -180.965 -180.97 -180.975 -180.98 -180.985 -180.99 -180.995 -181 -181.005 -181.01 -181.015 -181.02 -181.025 -181.03 -181.035 -181.04 -181.045 -181.05 -181.055 -181.06 -181.065 -181.07 -181.075 -181.08 -181.085 -181.09 -181.095 -181.1 -181.105 -181.11 -181.115 -181.12 -181.125 -181.13 -181.135 -181.14 -181.145 -181.15 -181.155 -181.16 -181.165 -181.17 -181.175 -181.18 -181.185 -181.19 -181.195 -181.2 -181.205 -181.21 -181.215 -181.22 -181.225 -181.23 -181.235 -181.24 -181.245 -181.25 -181.255 -181.26 -181.265 -181.27 -181.275 -181.28 -181.285 -181.29 -181.295 -181.3 -181.305 -181.31 -181.315 -181.32 -181.325 -181.33 -181.335 -181.34 -181.345 -181.35 -181.355 -181.36 -181.365 -181.37 -181.375 -181.38 -181.385 -181.39 -181.395 -181.4 -181.405 -181.41 -181.415 -181.42 -181.425 -181.43 -181.435 -181.44 -181.445 -181.45 -181.455 -181.46 -181.465 -181.47 -181.475 -181.48 -181.485 -181.49 -181.495 -181.5 -181.505 -181.51 -181.515 -181.52 -181.525 -181.53 -181.535 -181.54 -181.545 -181.55 -181.555 -181.56 -181.565 -181.57 -181.575 -181.58 -181.585 -181.59 -181.595 -181.6 -181.605 -181.61 -181.615 -181.62 -181.625 -181.63 -181.635 -181.64 -181.645 -181.65 -181.655 -181.66 -181.665 -181.67 -181.675 -181.68 -181.685 -181.69 -181.695 -181.7 -181.705 -181.71 -181.715 -181.72 -181.725 -181.73 -181.735 -181.74 -181.745 -181.75 -181.755 -181.76 -181.765 -181.77 -181.775 -181.78 -181.785 -181.79 -181.795 -181.8 -181.805 -181.81 -181.815 -181.82 -181.825 -181.83 -181.835 -181.84 -181.845 -181.85 -181.855 -181.86 -181.865 -181.87 -181.875 -181.88 -181.885 -181.89 -181.895 -181.9 -181.905 -181.91 -181.915 -181.92 -181.925 -181.93 -181.935 -181.94 -181.945 -181.95 -181.955 -181.96 -181.965 -181.97 -181.975 -181.98 -181.985 -181.99 -181.995 -182 -182.005 -182.01 -182.015 -182.02 -182.025 -182.03 -182.035 -182.04 -182.045 -182.05 -182.055 -182.06 -182.065 -182.07 -182.075 -182.08 -182.085 -182.09 -182.095 -182.1 -182.105 -182.11 -182.115 -182.12 -182.125 -182.13 -182.135 -182.14 -182.145 -182.15 -182.155 -182.16 -182.165 -182.17 -182.175 -182.18 -182.185 -182.19 -182.195 -182.2 -182.205 -182.21 -182.215 -182.22 -182.225 -182.23 -182.235 -182.24 -182.245 -182.25 -182.255 -182.26 -182.265 -182.27 -182.275 -182.28 -182.285 -182.29 -182.295 -182.3 -182.305 -182.31 -182.315 -182.32 -182.325 -182.33 -182.335 -182.34 -182.345 -182.35 -182.355 -182.36 -182.365 -182.37 -182.375 -182.38 -182.385 -182.39 -182.395 -182.4 -182.405 -182.41 -182.415 -182.42 -182.425 -182.43 -182.435 -182.44 -182.445 -182.45 -182.455 -182.46 -182.465 -182.47 -182.475 -182.48 -182.485 -182.49 -182.495 -182.5 -182.505 -182.51 -182.515 -182.52 -182.525 -182.53 -182.535 -182.54 -182.545 -182.55 -182.555 -182.56 -182.565 -182.57 -182.575 -182.58 -182.585 -182.59 -182.595 -182.6 -182.605 -182.61 -182.615 -182.62 -182.625 -182.63 -182.635 -182.64 -182.645 -182.65 -182.655 -182.66 -182.665 -182.67 -182.675 -182.68 -182.685 -182.69 -182.695 -182.7 -182.705 -182.71 -182.715 -182.72 -182.725 -182.73 -182.735 -182.74 -182.745 -182.75 -182.755 -182.76 -182.765 -182.77 -182.775 -182.78 -182.785 -182.79 -182.795 -182.8 -182.805 -182.81 -182.815 -182.82 -182.825 -182.83 -182.835 -182.84 -182.845 -182.85 -182.855 -182.86 -182.865 -182.87 -182.875 -182.88 -182.885 -182.89 -182.895 -182.9 -182.905 -182.91 -182.915 -182.92 -182.925 -182.93 -182.935 -182.94 -182.945 -182.95 -182.955 -182.96 -182.965 -182.97 -182.975 -182.98 -182.985 -182.99 -182.995 -183 -183.005 -183.01 -183.015 -183.02 -183.025 -183.03 -183.035 -183.04 -183.045 -183.05 -183.055 -183.06 -183.065 -183.07 -183.075 -183.08 -183.085 -183.09 -183.095 -183.1 -183.105 -183.11 -183.115 -183.12 -183.125 -183.13 -183.135 -183.14 -183.145 -183.15 -183.155 -183.16 -183.165 -183.17 -183.175 -183.18 -183.185 -183.19 -183.195 -183.2 -183.205 -183.21 -183.215 -183.22 -183.225 -183.23 -183.235 -183.24 -183.245 -183.25 -183.255 -183.26 -183.265 -183.27 -183.275 -183.28 -183.285 -183.29 -183.295 -183.3 -183.305 -183.31 -183.315 -183.32 -183.325 -183.33 -183.335 -183.34 -183.345 -183.35 -183.355 -183.36 -183.365 -183.37 -183.375 -183.38 -183.385 -183.39 -183.395 -183.4 -183.405 -183.41 -183.415 -183.42 -183.425 -183.43 -183.435 -183.44 -183.445 -183.45 -183.455 -183.46 -183.465 -183.47 -183.475 -183.48 -183.485 -183.49 -183.495 -183.5 -183.505 -183.51 -183.515 -183.52 -183.525 -183.53 -183.535 -183.54 -183.545 -183.55 -183.555 -183.56 -183.565 -183.57 -183.575 -183.58 -183.585 -183.59 -183.595 -183.6 -183.605 -183.61 -183.615 -183.62 -183.625 -183.63 -183.635 -183.64 -183.645 -183.65 -183.655 -183.66 -183.665 -183.67 -183.675 -183.68 -183.685 -183.69 -183.695 -183.7 -183.705 -183.71 -183.715 -183.72 -183.725 -183.73 -183.735 -183.74 -183.745 -183.75 -183.755 -183.76 -183.765 -183.77 -183.775 -183.78 -183.785 -183.79 -183.795 -183.8 -183.805 -183.81 -183.815 -183.82 -183.825 -183.83 -183.835 -183.84 -183.845 -183.85 -183.855 -183.86 -183.865 -183.87 -183.875 -183.88 -183.885 -183.89 -183.895 -183.9 -183.905 -183.91 -183.915 -183.92 -183.925 -183.93 -183.935 -183.94 -183.945 -183.95 -183.955 -183.96 -183.965 -183.97 -183.975 -183.98 -183.985 -183.99 -183.995 -184 -184.005 -184.01 -184.015 -184.02 -184.025 -184.03 -184.035 -184.04 -184.045 -184.05 -184.055 -184.06 -184.065 -184.07 -184.075 -184.08 -184.085 -184.09 -184.095 -184.1 -184.105 -184.11 -184.115 -184.12 -184.125 -184.13 -184.135 -184.14 -184.145 -184.15 -184.155 -184.16 -184.165 -184.17 -184.175 -184.18 -184.185 -184.19 -184.195 -184.2 -184.205 -184.21 -184.215 -184.22 -184.225 -184.23 -184.235 -184.24 -184.245 -184.25 -184.255 -184.26 -184.265 -184.27 -184.275 -184.28 -184.285 -184.29 -184.295 -184.3 -184.305 -184.31 -184.315 -184.32 -184.325 -184.33 -184.335 -184.34 -184.345 -184.35 -184.355 -184.36 -184.365 -184.37 -184.375 -184.38 -184.385 -184.39 -184.395 -184.4 -184.405 -184.41 -184.415 -184.42 -184.425 -184.43 -184.435 -184.44 -184.445 -184.45 -184.455 -184.46 -184.465 -184.47 -184.475 -184.48 -184.485 -184.49 -184.495 -184.5 -184.505 -184.51 -184.515 -184.52 -184.525 -184.53 -184.535 -184.54 -184.545 -184.55 -184.555 -184.56 -184.565 -184.57 -184.575 -184.58 -184.585 -184.59 -184.595 -184.6 -184.605 -184.61 -184.615 -184.62 -184.625 -184.63 -184.635 -184.64 -184.645 -184.65 -184.655 -184.66 -184.665 -184.67 -184.675 -184.68 -184.685 -184.69 -184.695 -184.7 -184.705 -184.71 -184.715 -184.72 -184.725 -184.73 -184.735 -184.74 -184.745 -184.75 -184.755 -184.76 -184.765 -184.77 -184.775 -184.78 -184.785 -184.79 -184.795 -184.8 -184.805 -184.81 -184.815 -184.82 -184.825 -184.83 -184.835 -184.84 -184.845 -184.85 -184.855 -184.86 -184.865 -184.87 -184.875 -184.88 -184.885 -184.89 -184.895 -184.9 -184.905 -184.91 -184.915 -184.92 -184.925 -184.93 -184.935 -184.94 -184.945 -184.95 -184.955 -184.96 -184.965 -184.97 -184.975 -184.98 -184.985 -184.99 -184.995 -185 -185.005 -185.01 -185.015 -185.02 -185.025 -185.03 -185.035 -185.04 -185.045 -185.05 -185.055 -185.06 -185.065 -185.07 -185.075 -185.08 -185.085 -185.09 -185.095 -185.1 -185.105 -185.11 -185.115 -185.12 -185.125 -185.13 -185.135 -185.14 -185.145 -185.15 -185.155 -185.16 -185.165 -185.17 -185.175 -185.18 -185.185 -185.19 -185.195 -185.2 -185.205 -185.21 -185.215 -185.22 -185.225 -185.23 -185.235 -185.24 -185.245 -185.25 -185.255 -185.26 -185.265 -185.27 -185.275 -185.28 -185.285 -185.29 -185.295 -185.3 -185.305 -185.31 -185.315 -185.32 -185.325 -185.33 -185.335 -185.34 -185.345 -185.35 -185.355 -185.36 -185.365 -185.37 -185.375 -185.38 -185.385 -185.39 -185.395 -185.4 -185.405 -185.41 -185.415 -185.42 -185.425 -185.43 -185.435 -185.44 -185.445 -185.45 -185.455 -185.46 -185.465 -185.47 -185.475 -185.48 -185.485 -185.49 -185.495 -185.5 -185.505 -185.51 -185.515 -185.52 -185.525 -185.53 -185.535 -185.54 -185.545 -185.55 -185.555 -185.56 -185.565 -185.57 -185.575 -185.58 -185.585 -185.59 -185.595 -185.6 -185.605 -185.61 -185.615 -185.62 -185.625 -185.63 -185.635 -185.64 -185.645 -185.65 -185.655 -185.66 -185.665 -185.67 -185.675 -185.68 -185.685 -185.69 -185.695 -185.7 -185.705 -185.71 -185.715 -185.72 -185.725 -185.73 -185.735 -185.74 -185.745 -185.75 -185.755 -185.76 -185.765 -185.77 -185.775 -185.78 -185.785 -185.79 -185.795 -185.8 -185.805 -185.81 -185.815 -185.82 -185.825 -185.83 -185.835 -185.84 -185.845 -185.85 -185.855 -185.86 -185.865 -185.87 -185.875 -185.88 -185.885 -185.89 -185.895 -185.9 -185.905 -185.91 -185.915 -185.92 -185.925 -185.93 -185.935 -185.94 -185.945 -185.95 -185.955 -185.96 -185.965 -185.97 -185.975 -185.98 -185.985 -185.99 -185.995 -186 -186.005 -186.01 -186.015 -186.02 -186.025 -186.03 -186.035 -186.04 -186.045 -186.05 -186.055 -186.06 -186.065 -186.07 -186.075 -186.08 -186.085 -186.09 -186.095 -186.1 -186.105 -186.11 -186.115 -186.12 -186.125 -186.13 -186.135 -186.14 -186.145 -186.15 -186.155 -186.16 -186.165 -186.17 -186.175 -186.18 -186.185 -186.19 -186.195 -186.2 -186.205 -186.21 -186.215 -186.22 -186.225 -186.23 -186.235 -186.24 -186.245 -186.25 -186.255 -186.26 -186.265 -186.27 -186.275 -186.28 -186.285 -186.29 -186.295 -186.3 -186.305 -186.31 -186.315 -186.32 -186.325 -186.33 -186.335 -186.34 -186.345 -186.35 -186.355 -186.36 -186.365 -186.37 -186.375 -186.38 -186.385 -186.39 -186.395 -186.4 -186.405 -186.41 -186.415 -186.42 -186.425 -186.43 -186.435 -186.44 -186.445 -186.45 -186.455 -186.46 -186.465 -186.47 -186.475 -186.48 -186.485 -186.49 -186.495 -186.5 -186.505 -186.51 -186.515 -186.52 -186.525 -186.53 -186.535 -186.54 -186.545 -186.55 -186.555 -186.56 -186.565 -186.57 -186.575 -186.58 -186.585 -186.59 -186.595 -186.6 -186.605 -186.61 -186.615 -186.62 -186.625 -186.63 -186.635 -186.64 -186.645 -186.65 -186.655 -186.66 -186.665 -186.67 -186.675 -186.68 -186.685 -186.69 -186.695 -186.7 -186.705 -186.71 -186.715 -186.72 -186.725 -186.73 -186.735 -186.74 -186.745 -186.75 -186.755 -186.76 -186.765 -186.77 -186.775 -186.78 -186.785 -186.79 -186.795 -186.8 -186.805 -186.81 -186.815 -186.82 -186.825 -186.83 -186.835 -186.84 -186.845 -186.85 -186.855 -186.86 -186.865 -186.87 -186.875 -186.88 -186.885 -186.89 -186.895 -186.9 -186.905 -186.91 -186.915 -186.92 -186.925 -186.93 -186.935 -186.94 -186.945 -186.95 -186.955 -186.96 -186.965 -186.97 -186.975 -186.98 -186.985 -186.99 -186.995 -187 -187.005 -187.01 -187.015 -187.02 -187.025 -187.03 -187.035 -187.04 -187.045 -187.05 -187.055 -187.06 -187.065 -187.07 -187.075 -187.08 -187.085 -187.09 -187.095 -187.1 -187.105 -187.11 -187.115 -187.12 -187.125 -187.13 -187.135 -187.14 -187.145 -187.15 -187.155 -187.16 -187.165 -187.17 -187.175 -187.18 -187.185 -187.19 -187.195 -187.2 -187.205 -187.21 -187.215 -187.22 -187.225 -187.23 -187.235 -187.24 -187.245 -187.25 -187.255 -187.26 -187.265 -187.27 -187.275 -187.28 -187.285 -187.29 -187.295 -187.3 -187.305 -187.31 -187.315 -187.32 -187.325 -187.33 -187.335 -187.34 -187.345 -187.35 -187.355 -187.36 -187.365 -187.37 -187.375 -187.38 -187.385 -187.39 -187.395 -187.4 -187.405 -187.41 -187.415 -187.42 -187.425 -187.43 -187.435 -187.44 -187.445 -187.45 -187.455 -187.46 -187.465 -187.47 -187.475 -187.48 -187.485 -187.49 -187.495 -187.5 -187.505 -187.51 -187.515 -187.52 -187.525 -187.53 -187.535 -187.54 -187.545 -187.55 -187.555 -187.56 -187.565 -187.57 -187.575 -187.58 -187.585 -187.59 -187.595 -187.6 -187.605 -187.61 -187.615 -187.62 -187.625 -187.63 -187.635 -187.64 -187.645 -187.65 -187.655 -187.66 -187.665 -187.67 -187.675 -187.68 -187.685 -187.69 -187.695 -187.7 -187.705 -187.71 -187.715 -187.72 -187.725 -187.73 -187.735 -187.74 -187.745 -187.75 -187.755 -187.76 -187.765 -187.77 -187.775 -187.78 -187.785 -187.79 -187.795 -187.8 -187.805 -187.81 -187.815 -187.82 -187.825 -187.83 -187.835 -187.84 -187.845 -187.85 -187.855 -187.86 -187.865 -187.87 -187.875 -187.88 -187.885 -187.89 -187.895 -187.9 -187.905 -187.91 -187.915 -187.92 -187.925 -187.93 -187.935 -187.94 -187.945 -187.95 -187.955 -187.96 -187.965 -187.97 -187.975 -187.98 -187.985 -187.99 -187.995 -188 -188.005 -188.01 -188.015 -188.02 -188.025 -188.03 -188.035 -188.04 -188.045 -188.05 -188.055 -188.06 -188.065 -188.07 -188.075 -188.08 -188.085 -188.09 -188.095 -188.1 -188.105 -188.11 -188.115 -188.12 -188.125 -188.13 -188.135 -188.14 -188.145 -188.15 -188.155 -188.16 -188.165 -188.17 -188.175 -188.18 -188.185 -188.19 -188.195 -188.2 -188.205 -188.21 -188.215 -188.22 -188.225 -188.23 -188.235 -188.24 -188.245 -188.25 -188.255 -188.26 -188.265 -188.27 -188.275 -188.28 -188.285 -188.29 -188.295 -188.3 -188.305 -188.31 -188.315 -188.32 -188.325 -188.33 -188.335 -188.34 -188.345 -188.35 -188.355 -188.36 -188.365 -188.37 -188.375 -188.38 -188.385 -188.39 -188.395 -188.4 -188.405 -188.41 -188.415 -188.42 -188.425 -188.43 -188.435 -188.44 -188.445 -188.45 -188.455 -188.46 -188.465 -188.47 -188.475 -188.48 -188.485 -188.49 -188.495 -188.5 -188.505 -188.51 -188.515 -188.52 -188.525 -188.53 -188.535 -188.54 -188.545 -188.55 -188.555 -188.56 -188.565 -188.57 -188.575 -188.58 -188.585 -188.59 -188.595 -188.6 -188.605 -188.61 -188.615 -188.62 -188.625 -188.63 -188.635 -188.64 -188.645 -188.65 -188.655 -188.66 -188.665 -188.67 -188.675 -188.68 -188.685 -188.69 -188.695 -188.7 -188.705 -188.71 -188.715 -188.72 -188.725 -188.73 -188.735 -188.74 -188.745 -188.75 -188.755 -188.76 -188.765 -188.77 -188.775 -188.78 -188.785 -188.79 -188.795 -188.8 -188.805 -188.81 -188.815 -188.82 -188.825 -188.83 -188.835 -188.84 -188.845 -188.85 -188.855 -188.86 -188.865 -188.87 -188.875 -188.88 -188.885 -188.89 -188.895 -188.9 -188.905 -188.91 -188.915 -188.92 -188.925 -188.93 -188.935 -188.94 -188.945 -188.95 -188.955 -188.96 -188.965 -188.97 -188.975 -188.98 -188.985 -188.99 -188.995 -189 -189.005 -189.01 -189.015 -189.02 -189.025 -189.03 -189.035 -189.04 -189.045 -189.05 -189.055 -189.06 -189.065 -189.07 -189.075 -189.08 -189.085 -189.09 -189.095 -189.1 -189.105 -189.11 -189.115 -189.12 -189.125 -189.13 -189.135 -189.14 -189.145 -189.15 -189.155 -189.16 -189.165 -189.17 -189.175 -189.18 -189.185 -189.19 -189.195 -189.2 -189.205 -189.21 -189.215 -189.22 -189.225 -189.23 -189.235 -189.24 -189.245 -189.25 -189.255 -189.26 -189.265 -189.27 -189.275 -189.28 -189.285 -189.29 -189.295 -189.3 -189.305 -189.31 -189.315 -189.32 -189.325 -189.33 -189.335 -189.34 -189.345 -189.35 -189.355 -189.36 -189.365 -189.37 -189.375 -189.38 -189.385 -189.39 -189.395 -189.4 -189.405 -189.41 -189.415 -189.42 -189.425 -189.43 -189.435 -189.44 -189.445 -189.45 -189.455 -189.46 -189.465 -189.47 -189.475 -189.48 -189.485 -189.49 -189.495 -189.5 -189.505 -189.51 -189.515 -189.52 -189.525 -189.53 -189.535 -189.54 -189.545 -189.55 -189.555 -189.56 -189.565 -189.57 -189.575 -189.58 -189.585 -189.59 -189.595 -189.6 -189.605 -189.61 -189.615 -189.62 -189.625 -189.63 -189.635 -189.64 -189.645 -189.65 -189.655 -189.66 -189.665 -189.67 -189.675 -189.68 -189.685 -189.69 -189.695 -189.7 -189.705 -189.71 -189.715 -189.72 -189.725 -189.73 -189.735 -189.74 -189.745 -189.75 -189.755 -189.76 -189.765 -189.77 -189.775 -189.78 -189.785 -189.79 -189.795 -189.8 -189.805 -189.81 -189.815 -189.82 -189.825 -189.83 -189.835 -189.84 -189.845 -189.85 -189.855 -189.86 -189.865 -189.87 -189.875 -189.88 -189.885 -189.89 -189.895 -189.9 -189.905 -189.91 -189.915 -189.92 -189.925 -189.93 -189.935 -189.94 -189.945 -189.95 -189.955 -189.96 -189.965 -189.97 -189.975 -189.98 -189.985 -189.99 -189.995 -190 -190.005 -190.01 -190.015 -190.02 -190.025 -190.03 -190.035 -190.04 -190.045 -190.05 -190.055 -190.06 -190.065 -190.07 -190.075 -190.08 -190.085 -190.09 -190.095 -190.1 -190.105 -190.11 -190.115 -190.12 -190.125 -190.13 -190.135 -190.14 -190.145 -190.15 -190.155 -190.16 -190.165 -190.17 -190.175 -190.18 -190.185 -190.19 -190.195 -190.2 -190.205 -190.21 -190.215 -190.22 -190.225 -190.23 -190.235 -190.24 -190.245 -190.25 -190.255 -190.26 -190.265 -190.27 -190.275 -190.28 -190.285 -190.29 -190.295 -190.3 -190.305 -190.31 -190.315 -190.32 -190.325 -190.33 -190.335 -190.34 -190.345 -190.35 -190.355 -190.36 -190.365 -190.37 -190.375 -190.38 -190.385 -190.39 -190.395 -190.4 -190.405 -190.41 -190.415 -190.42 -190.425 -190.43 -190.435 -190.44 -190.445 -190.45 -190.455 -190.46 -190.465 -190.47 -190.475 -190.48 -190.485 -190.49 -190.495 -190.5 -190.505 -190.51 -190.515 -190.52 -190.525 -190.53 -190.535 -190.54 -190.545 -190.55 -190.555 -190.56 -190.565 -190.57 -190.575 -190.58 -190.585 -190.59 -190.595 -190.6 -190.605 -190.61 -190.615 -190.62 -190.625 -190.63 -190.635 -190.64 -190.645 -190.65 -190.655 -190.66 -190.665 -190.67 -190.675 -190.68 -190.685 -190.69 -190.695 -190.7 -190.705 -190.71 -190.715 -190.72 -190.725 -190.73 -190.735 -190.74 -190.745 -190.75 -190.755 -190.76 -190.765 -190.77 -190.775 -190.78 -190.785 -190.79 -190.795 -190.8 -190.805 -190.81 -190.815 -190.82 -190.825 -190.83 -190.835 -190.84 -190.845 -190.85 -190.855 -190.86 -190.865 -190.87 -190.875 -190.88 -190.885 -190.89 -190.895 -190.9 -190.905 -190.91 -190.915 -190.92 -190.925 -190.93 -190.935 -190.94 -190.945 -190.95 -190.955 -190.96 -190.965 -190.97 -190.975 -190.98 -190.985 -190.99 -190.995 -191 -191.005 -191.01 -191.015 -191.02 -191.025 -191.03 -191.035 -191.04 -191.045 -191.05 -191.055 -191.06 -191.065 -191.07 -191.075 -191.08 -191.085 -191.09 -191.095 -191.1 -191.105 -191.11 -191.115 -191.12 -191.125 -191.13 -191.135 -191.14 -191.145 -191.15 -191.155 -191.16 -191.165 -191.17 -191.175 -191.18 -191.185 -191.19 -191.195 -191.2 -191.205 -191.21 -191.215 -191.22 -191.225 -191.23 -191.235 -191.24 -191.245 -191.25 -191.255 -191.26 -191.265 -191.27 -191.275 -191.28 -191.285 -191.29 -191.295 -191.3 -191.305 -191.31 -191.315 -191.32 -191.325 -191.33 -191.335 -191.34 -191.345 -191.35 -191.355 -191.36 -191.365 -191.37 -191.375 -191.38 -191.385 -191.39 -191.395 -191.4 -191.405 -191.41 -191.415 -191.42 -191.425 -191.43 -191.435 -191.44 -191.445 -191.45 -191.455 -191.46 -191.465 -191.47 -191.475 -191.48 -191.485 -191.49 -191.495 -191.5 -191.505 -191.51 -191.515 -191.52 -191.525 -191.53 -191.535 -191.54 -191.545 -191.55 -191.555 -191.56 -191.565 -191.57 -191.575 -191.58 -191.585 -191.59 -191.595 -191.6 -191.605 -191.61 -191.615 -191.62 -191.625 -191.63 -191.635 -191.64 -191.645 -191.65 -191.655 -191.66 -191.665 -191.67 -191.675 -191.68 -191.685 -191.69 -191.695 -191.7 -191.705 -191.71 -191.715 -191.72 -191.725 -191.73 -191.735 -191.74 -191.745 -191.75 -191.755 -191.76 -191.765 -191.77 -191.775 -191.78 -191.785 -191.79 -191.795 -191.8 -191.805 -191.81 -191.815 -191.82 -191.825 -191.83 -191.835 -191.84 -191.845 -191.85 -191.855 -191.86 -191.865 -191.87 -191.875 -191.88 -191.885 -191.89 -191.895 -191.9 -191.905 -191.91 -191.915 -191.92 -191.925 -191.93 -191.935 -191.94 -191.945 -191.95 -191.955 -191.96 -191.965 -191.97 -191.975 -191.98 -191.985 -191.99 -191.995 -192 -192.005 -192.01 -192.015 -192.02 -192.025 -192.03 -192.035 -192.04 -192.045 -192.05 -192.055 -192.06 -192.065 -192.07 -192.075 -192.08 -192.085 -192.09 -192.095 -192.1 -192.105 -192.11 -192.115 -192.12 -192.125 -192.13 -192.135 -192.14 -192.145 -192.15 -192.155 -192.16 -192.165 -192.17 -192.175 -192.18 -192.185 -192.19 -192.195 -192.2 -192.205 -192.21 -192.215 -192.22 -192.225 -192.23 -192.235 -192.24 -192.245 -192.25 -192.255 -192.26 -192.265 -192.27 -192.275 -192.28 -192.285 -192.29 -192.295 -192.3 -192.305 -192.31 -192.315 -192.32 -192.325 -192.33 -192.335 -192.34 -192.345 -192.35 -192.355 -192.36 -192.365 -192.37 -192.375 -192.38 -192.385 -192.39 -192.395 -192.4 -192.405 -192.41 -192.415 -192.42 -192.425 -192.43 -192.435 -192.44 -192.445 -192.45 -192.455 -192.46 -192.465 -192.47 -192.475 -192.48 -192.485 -192.49 -192.495 -192.5 -192.505 -192.51 -192.515 -192.52 -192.525 -192.53 -192.535 -192.54 -192.545 -192.55 -192.555 -192.56 -192.565 -192.57 -192.575 -192.58 -192.585 -192.59 -192.595 -192.6 -192.605 -192.61 -192.615 -192.62 -192.625 -192.63 -192.635 -192.64 -192.645 -192.65 -192.655 -192.66 -192.665 -192.67 -192.675 -192.68 -192.685 -192.69 -192.695 -192.7 -192.705 -192.71 -192.715 -192.72 -192.725 -192.73 -192.735 -192.74 -192.745 -192.75 -192.755 -192.76 -192.765 -192.77 -192.775 -192.78 -192.785 -192.79 -192.795 -192.8 -192.805 -192.81 -192.815 -192.82 -192.825 -192.83 -192.835 -192.84 -192.845 -192.85 -192.855 -192.86 -192.865 -192.87 -192.875 -192.88 -192.885 -192.89 -192.895 -192.9 -192.905 -192.91 -192.915 -192.92 -192.925 -192.93 -192.935 -192.94 -192.945 -192.95 -192.955 -192.96 -192.965 -192.97 -192.975 -192.98 -192.985 -192.99 -192.995 -193 -193.005 -193.01 -193.015 -193.02 -193.025 -193.03 -193.035 -193.04 -193.045 -193.05 -193.055 -193.06 -193.065 -193.07 -193.075 -193.08 -193.085 -193.09 -193.095 -193.1 -193.105 -193.11 -193.115 -193.12 -193.125 -193.13 -193.135 -193.14 -193.145 -193.15 -193.155 -193.16 -193.165 -193.17 -193.175 -193.18 -193.185 -193.19 -193.195 -193.2 -193.205 -193.21 -193.215 -193.22 -193.225 -193.23 -193.235 -193.24 -193.245 -193.25 -193.255 -193.26 -193.265 -193.27 -193.275 -193.28 -193.285 -193.29 -193.295 -193.3 -193.305 -193.31 -193.315 -193.32 -193.325 -193.33 -193.335 -193.34 -193.345 -193.35 -193.355 -193.36 -193.365 -193.37 -193.375 -193.38 -193.385 -193.39 -193.395 -193.4 -193.405 -193.41 -193.415 -193.42 -193.425 -193.43 -193.435 -193.44 -193.445 -193.45 -193.455 -193.46 -193.465 -193.47 -193.475 -193.48 -193.485 -193.49 -193.495 -193.5 -193.505 -193.51 -193.515 -193.52 -193.525 -193.53 -193.535 -193.54 -193.545 -193.55 -193.555 -193.56 -193.565 -193.57 -193.575 -193.58 -193.585 -193.59 -193.595 -193.6 -193.605 -193.61 -193.615 -193.62 -193.625 -193.63 -193.635 -193.64 -193.645 -193.65 -193.655 -193.66 -193.665 -193.67 -193.675 -193.68 -193.685 -193.69 -193.695 -193.7 -193.705 -193.71 -193.715 -193.72 -193.725 -193.73 -193.735 -193.74 -193.745 -193.75 -193.755 -193.76 -193.765 -193.77 -193.775 -193.78 -193.785 -193.79 -193.795 -193.8 -193.805 -193.81 -193.815 -193.82 -193.825 -193.83 -193.835 -193.84 -193.845 -193.85 -193.855 -193.86 -193.865 -193.87 -193.875 -193.88 -193.885 -193.89 -193.895 -193.9 -193.905 -193.91 -193.915 -193.92 -193.925 -193.93 -193.935 -193.94 -193.945 -193.95 -193.955 -193.96 -193.965 -193.97 -193.975 -193.98 -193.985 -193.99 -193.995 -194 -194.005 -194.01 -194.015 -194.02 -194.025 -194.03 -194.035 -194.04 -194.045 -194.05 -194.055 -194.06 -194.065 -194.07 -194.075 -194.08 -194.085 -194.09 -194.095 -194.1 -194.105 -194.11 -194.115 -194.12 -194.125 -194.13 -194.135 -194.14 -194.145 -194.15 -194.155 -194.16 -194.165 -194.17 -194.175 -194.18 -194.185 -194.19 -194.195 -194.2 -194.205 -194.21 -194.215 -194.22 -194.225 -194.23 -194.235 -194.24 -194.245 -194.25 -194.255 -194.26 -194.265 -194.27 -194.275 -194.28 -194.285 -194.29 -194.295 -194.3 -194.305 -194.31 -194.315 -194.32 -194.325 -194.33 -194.335 -194.34 -194.345 -194.35 -194.355 -194.36 -194.365 -194.37 -194.375 -194.38 -194.385 -194.39 -194.395 -194.4 -194.405 -194.41 -194.415 -194.42 -194.425 -194.43 -194.435 -194.44 -194.445 -194.45 -194.455 -194.46 -194.465 -194.47 -194.475 -194.48 -194.485 -194.49 -194.495 -194.5 -194.505 -194.51 -194.515 -194.52 -194.525 -194.53 -194.535 -194.54 -194.545 -194.55 -194.555 -194.56 -194.565 -194.57 -194.575 -194.58 -194.585 -194.59 -194.595 -194.6 -194.605 -194.61 -194.615 -194.62 -194.625 -194.63 -194.635 -194.64 -194.645 -194.65 -194.655 -194.66 -194.665 -194.67 -194.675 -194.68 -194.685 -194.69 -194.695 -194.7 -194.705 -194.71 -194.715 -194.72 -194.725 -194.73 -194.735 -194.74 -194.745 -194.75 -194.755 -194.76 -194.765 -194.77 -194.775 -194.78 -194.785 -194.79 -194.795 -194.8 -194.805 -194.81 -194.815 -194.82 -194.825 -194.83 -194.835 -194.84 -194.845 -194.85 -194.855 -194.86 -194.865 -194.87 -194.875 -194.88 -194.885 -194.89 -194.895 -194.9 -194.905 -194.91 -194.915 -194.92 -194.925 -194.93 -194.935 -194.94 -194.945 -194.95 -194.955 -194.96 -194.965 -194.97 -194.975 -194.98 -194.985 -194.99 -194.995 -195 -195.005 -195.01 -195.015 -195.02 -195.025 -195.03 -195.035 -195.04 -195.045 -195.05 -195.055 -195.06 -195.065 -195.07 -195.075 -195.08 -195.085 -195.09 -195.095 -195.1 -195.105 -195.11 -195.115 -195.12 -195.125 -195.13 -195.135 -195.14 -195.145 -195.15 -195.155 -195.16 -195.165 -195.17 -195.175 -195.18 -195.185 -195.19 -195.195 -195.2 -195.205 -195.21 -195.215 -195.22 -195.225 -195.23 -195.235 -195.24 -195.245 -195.25 -195.255 -195.26 -195.265 -195.27 -195.275 -195.28 -195.285 -195.29 -195.295 -195.3 -195.305 -195.31 -195.315 -195.32 -195.325 -195.33 -195.335 -195.34 -195.345 -195.35 -195.355 -195.36 -195.365 -195.37 -195.375 -195.38 -195.385 -195.39 -195.395 -195.4 -195.405 -195.41 -195.415 -195.42 -195.425 -195.43 -195.435 -195.44 -195.445 -195.45 -195.455 -195.46 -195.465 -195.47 -195.475 -195.48 -195.485 -195.49 -195.495 -195.5 -195.505 -195.51 -195.515 -195.52 -195.525 -195.53 -195.535 -195.54 -195.545 -195.55 -195.555 -195.56 -195.565 -195.57 -195.575 -195.58 -195.585 -195.59 -195.595 -195.6 -195.605 -195.61 -195.615 -195.62 -195.625 -195.63 -195.635 -195.64 -195.645 -195.65 -195.655 -195.66 -195.665 -195.67 -195.675 -195.68 -195.685 -195.69 -195.695 -195.7 -195.705 -195.71 -195.715 -195.72 -195.725 -195.73 -195.735 -195.74 -195.745 -195.75 -195.755 -195.76 -195.765 -195.77 -195.775 -195.78 -195.785 -195.79 -195.795 -195.8 -195.805 -195.81 -195.815 -195.82 -195.825 -195.83 -195.835 -195.84 -195.845 -195.85 -195.855 -195.86 -195.865 -195.87 -195.875 -195.88 -195.885 -195.89 -195.895 -195.9 -195.905 -195.91 -195.915 -195.92 -195.925 -195.93 -195.935 -195.94 -195.945 -195.95 -195.955 -195.96 -195.965 -195.97 -195.975 -195.98 -195.985 -195.99 -195.995 -196 -196.005 -196.01 -196.015 -196.02 -196.025 -196.03 -196.035 -196.04 -196.045 -196.05 -196.055 -196.06 -196.065 -196.07 -196.075 -196.08 -196.085 -196.09 -196.095 -196.1 -196.105 -196.11 -196.115 -196.12 -196.125 -196.13 -196.135 -196.14 -196.145 -196.15 -196.155 -196.16 -196.165 -196.17 -196.175 -196.18 -196.185 -196.19 -196.195 -196.2 -196.205 -196.21 -196.215 -196.22 -196.225 -196.23 -196.235 -196.24 -196.245 -196.25 -196.255 -196.26 -196.265 -196.27 -196.275 -196.28 -196.285 -196.29 -196.295 -196.3 -196.305 -196.31 -196.315 -196.32 -196.325 -196.33 -196.335 -196.34 -196.345 -196.35 -196.355 -196.36 -196.365 -196.37 -196.375 -196.38 -196.385 -196.39 -196.395 -196.4 -196.405 -196.41 -196.415 -196.42 -196.425 -196.43 -196.435 -196.44 -196.445 -196.45 -196.455 -196.46 -196.465 -196.47 -196.475 -196.48 -196.485 -196.49 -196.495 -196.5 -196.505 -196.51 -196.515 -196.52 -196.525 -196.53 -196.535 -196.54 -196.545 -196.55 -196.555 -196.56 -196.565 -196.57 -196.575 -196.58 -196.585 -196.59 -196.595 -196.6 -196.605 -196.61 -196.615 -196.62 -196.625 -196.63 -196.635 -196.64 -196.645 -196.65 -196.655 -196.66 -196.665 -196.67 -196.675 -196.68 -196.685 -196.69 -196.695 -196.7 -196.705 -196.71 -196.715 -196.72 -196.725 -196.73 -196.735 -196.74 -196.745 -196.75 -196.755 -196.76 -196.765 -196.77 -196.775 -196.78 -196.785 -196.79 -196.795 -196.8 -196.805 -196.81 -196.815 -196.82 -196.825 -196.83 -196.835 -196.84 -196.845 -196.85 -196.855 -196.86 -196.865 -196.87 -196.875 -196.88 -196.885 -196.89 -196.895 -196.9 -196.905 -196.91 -196.915 -196.92 -196.925 -196.93 -196.935 -196.94 -196.945 -196.95 -196.955 -196.96 -196.965 -196.97 -196.975 -196.98 -196.985 -196.99 -196.995 -197 -197.005 -197.01 -197.015 -197.02 -197.025 -197.03 -197.035 -197.04 -197.045 -197.05 -197.055 -197.06 -197.065 -197.07 -197.075 -197.08 -197.085 -197.09 -197.095 -197.1 -197.105 -197.11 -197.115 -197.12 -197.125 -197.13 -197.135 -197.14 -197.145 -197.15 -197.155 -197.16 -197.165 -197.17 -197.175 -197.18 -197.185 -197.19 -197.195 -197.2 -197.205 -197.21 -197.215 -197.22 -197.225 -197.23 -197.235 -197.24 -197.245 -197.25 -197.255 -197.26 -197.265 -197.27 -197.275 -197.28 -197.285 -197.29 -197.295 -197.3 -197.305 -197.31 -197.315 -197.32 -197.325 -197.33 -197.335 -197.34 -197.345 -197.35 -197.355 -197.36 -197.365 -197.37 -197.375 -197.38 -197.385 -197.39 -197.395 -197.4 -197.405 -197.41 -197.415 -197.42 -197.425 -197.43 -197.435 -197.44 -197.445 -197.45 -197.455 -197.46 -197.465 -197.47 -197.475 -197.48 -197.485 -197.49 -197.495 -197.5 -197.505 -197.51 -197.515 -197.52 -197.525 -197.53 -197.535 -197.54 -197.545 -197.55 -197.555 -197.56 -197.565 -197.57 -197.575 -197.58 -197.585 -197.59 -197.595 -197.6 -197.605 -197.61 -197.615 -197.62 -197.625 -197.63 -197.635 -197.64 -197.645 -197.65 -197.655 -197.66 -197.665 -197.67 -197.675 -197.68 -197.685 -197.69 -197.695 -197.7 -197.705 -197.71 -197.715 -197.72 -197.725 -197.73 -197.735 -197.74 -197.745 -197.75 -197.755 -197.76 -197.765 -197.77 -197.775 -197.78 -197.785 -197.79 -197.795 -197.8 -197.805 -197.81 -197.815 -197.82 -197.825 -197.83 -197.835 -197.84 -197.845 -197.85 -197.855 -197.86 -197.865 -197.87 -197.875 -197.88 -197.885 -197.89 -197.895 -197.9 -197.905 -197.91 -197.915 -197.92 -197.925 -197.93 -197.935 -197.94 -197.945 -197.95 -197.955 -197.96 -197.965 -197.97 -197.975 -197.98 -197.985 -197.99 -197.995 -198 -198.005 -198.01 -198.015 -198.02 -198.025 -198.03 -198.035 -198.04 -198.045 -198.05 -198.055 -198.06 -198.065 -198.07 -198.075 -198.08 -198.085 -198.09 -198.095 -198.1 -198.105 -198.11 -198.115 -198.12 -198.125 -198.13 -198.135 -198.14 -198.145 -198.15 -198.155 -198.16 -198.165 -198.17 -198.175 -198.18 -198.185 -198.19 -198.195 -198.2 -198.205 -198.21 -198.215 -198.22 -198.225 -198.23 -198.235 -198.24 -198.245 -198.25 -198.255 -198.26 -198.265 -198.27 -198.275 -198.28 -198.285 -198.29 -198.295 -198.3 -198.305 -198.31 -198.315 -198.32 -198.325 -198.33 -198.335 -198.34 -198.345 -198.35 -198.355 -198.36 -198.365 -198.37 -198.375 -198.38 -198.385 -198.39 -198.395 -198.4 -198.405 -198.41 -198.415 -198.42 -198.425 -198.43 -198.435 -198.44 -198.445 -198.45 -198.455 -198.46 -198.465 -198.47 -198.475 -198.48 -198.485 -198.49 -198.495 -198.5 -198.505 -198.51 -198.515 -198.52 -198.525 -198.53 -198.535 -198.54 -198.545 -198.55 -198.555 -198.56 -198.565 -198.57 -198.575 -198.58 -198.585 -198.59 -198.595 -198.6 -198.605 -198.61 -198.615 -198.62 -198.625 -198.63 -198.635 -198.64 -198.645 -198.65 -198.655 -198.66 -198.665 -198.67 -198.675 -198.68 -198.685 -198.69 -198.695 -198.7 -198.705 -198.71 -198.715 -198.72 -198.725 -198.73 -198.735 -198.74 -198.745 -198.75 -198.755 -198.76 -198.765 -198.77 -198.775 -198.78 -198.785 -198.79 -198.795 -198.8 -198.805 -198.81 -198.815 -198.82 -198.825 -198.83 -198.835 -198.84 -198.845 -198.85 -198.855 -198.86 -198.865 -198.87 -198.875 -198.88 -198.885 -198.89 -198.895 -198.9 -198.905 -198.91 -198.915 -198.92 -198.925 -198.93 -198.935 -198.94 -198.945 -198.95 -198.955 -198.96 -198.965 -198.97 -198.975 -198.98 -198.985 -198.99 -198.995 -199 -199.005 -199.01 -199.015 -199.02 -199.025 -199.03 -199.035 -199.04 -199.045 -199.05 -199.055 -199.06 -199.065 -199.07 -199.075 -199.08 -199.085 -199.09 -199.095 -199.1 -199.105 -199.11 -199.115 -199.12 -199.125 -199.13 -199.135 -199.14 -199.145 -199.15 -199.155 -199.16 -199.165 -199.17 -199.175 -199.18 -199.185 -199.19 -199.195 -199.2 -199.205 -199.21 -199.215 -199.22 -199.225 -199.23 -199.235 -199.24 -199.245 -199.25 -199.255 -199.26 -199.265 -199.27 -199.275 -199.28 -199.285 -199.29 -199.295 -199.3 -199.305 -199.31 -199.315 -199.32 -199.325 -199.33 -199.335 -199.34 -199.345 -199.35 -199.355 -199.36 -199.365 -199.37 -199.375 -199.38 -199.385 -199.39 -199.395 -199.4 -199.405 -199.41 -199.415 -199.42 -199.425 -199.43 -199.435 -199.44 -199.445 -199.45 -199.455 -199.46 -199.465 -199.47 -199.475 -199.48 -199.485 -199.49 -199.495 -199.5 -199.505 -199.51 -199.515 -199.52 -199.525 -199.53 -199.535 -199.54 -199.545 -199.55 -199.555 -199.56 -199.565 -199.57 -199.575 -199.58 -199.585 -199.59 -199.595 -199.6 -199.605 -199.61 -199.615 -199.62 -199.625 -199.63 -199.635 -199.64 -199.645 -199.65 -199.655 -199.66 -199.665 -199.67 -199.675 -199.68 -199.685 -199.69 -199.695 -199.7 -199.705 -199.71 -199.715 -199.72 -199.725 -199.73 -199.735 -199.74 -199.745 -199.75 -199.755 -199.76 -199.765 -199.77 -199.775 -199.78 -199.785 -199.79 -199.795 -199.8 -199.805 -199.81 -199.815 -199.82 -199.825 -199.83 -199.835 -199.84 -199.845 -199.85 -199.855 -199.86 -199.865 -199.87 -199.875 -199.88 -199.885 -199.89 -199.895 -199.9 -199.905 -199.91 -199.915 -199.92 -199.925 -199.93 -199.935 -199.94 -199.945 -199.95 -199.955 -199.96 -199.965 -199.97 -199.975 -199.98 -199.985 -199.99 -199.995 -200 -200.005 -200.01 -200.015 -200.02 -200.025 -200.03 -200.035 -200.04 -200.045 -200.05 -200.055 -200.06 -200.065 -200.07 -200.075 -200.08 -200.085 -200.09 -200.095 -200.1 -200.105 -200.11 -200.115 -200.12 -200.125 -200.13 -200.135 -200.14 -200.145 -200.15 -200.155 -200.16 -200.165 -200.17 -200.175 -200.18 -200.185 -200.19 -200.195 -200.2 -200.205 -200.21 -200.215 -200.22 -200.225 -200.23 -200.235 -200.24 -200.245 -200.25 -200.255 -200.26 -200.265 -200.27 -200.275 -200.28 -200.285 -200.29 -200.295 -200.3 -200.305 -200.31 -200.315 -200.32 -200.325 -200.33 -200.335 -200.34 -200.345 -200.35 -200.355 -200.36 -200.365 -200.37 -200.375 -200.38 -200.385 -200.39 -200.395 -200.4 -200.405 -200.41 -200.415 -200.42 -200.425 -200.43 -200.435 -200.44 -200.445 -200.45 -200.455 -200.46 -200.465 -200.47 -200.475 -200.48 -200.485 -200.49 -200.495 -200.5 -200.505 -200.51 -200.515 -200.52 -200.525 -200.53 -200.535 -200.54 -200.545 -200.55 -200.555 -200.56 -200.565 -200.57 -200.575 -200.58 -200.585 -200.59 -200.595 -200.6 -200.605 -200.61 -200.615 -200.62 -200.625 -200.63 -200.635 -200.64 -200.645 -200.65 -200.655 -200.66 -200.665 -200.67 -200.675 -200.68 -200.685 -200.69 -200.695 -200.7 -200.705 -200.71 -200.715 -200.72 -200.725 -200.73 -200.735 -200.74 -200.745 -200.75 -200.755 -200.76 -200.765 -200.77 -200.775 -200.78 -200.785 -200.79 -200.795 -200.8 -200.805 -200.81 -200.815 -200.82 -200.825 -200.83 -200.835 -200.84 -200.845 -200.85 -200.855 -200.86 -200.865 -200.87 -200.875 -200.88 -200.885 -200.89 -200.895 -200.9 -200.905 -200.91 -200.915 -200.92 -200.925 -200.93 -200.935 -200.94 -200.945 -200.95 -200.955 -200.96 -200.965 -200.97 -200.975 -200.98 -200.985 -200.99 -200.995 -201 -201.005 -201.01 -201.015 -201.02 -201.025 -201.03 -201.035 -201.04 -201.045 -201.05 -201.055 -201.06 -201.065 -201.07 -201.075 -201.08 -201.085 -201.09 -201.095 -201.1 -201.105 -201.11 -201.115 -201.12 -201.125 -201.13 -201.135 -201.14 -201.145 -201.15 -201.155 -201.16 -201.165 -201.17 -201.175 -201.18 -201.185 -201.19 -201.195 -201.2 -201.205 -201.21 -201.215 -201.22 -201.225 -201.23 -201.235 -201.24 -201.245 -201.25 -201.255 -201.26 -201.265 -201.27 -201.275 -201.28 -201.285 -201.29 -201.295 -201.3 -201.305 -201.31 -201.315 -201.32 -201.325 -201.33 -201.335 -201.34 -201.345 -201.35 -201.355 -201.36 -201.365 -201.37 -201.375 -201.38 -201.385 -201.39 -201.395 -201.4 -201.405 -201.41 -201.415 -201.42 -201.425 -201.43 -201.435 -201.44 -201.445 -201.45 -201.455 -201.46 -201.465 -201.47 -201.475 -201.48 -201.485 -201.49 -201.495 -201.5 -201.505 -201.51 -201.515 -201.52 -201.525 -201.53 -201.535 -201.54 -201.545 -201.55 -201.555 -201.56 -201.565 -201.57 -201.575 -201.58 -201.585 -201.59 -201.595 -201.6 -201.605 -201.61 -201.615 -201.62 -201.625 -201.63 -201.635 -201.64 -201.645 -201.65 -201.655 -201.66 -201.665 -201.67 -201.675 -201.68 -201.685 -201.69 -201.695 -201.7 -201.705 -201.71 -201.715 -201.72 -201.725 -201.73 -201.735 -201.74 -201.745 -201.75 -201.755 -201.76 -201.765 -201.77 -201.775 -201.78 -201.785 -201.79 -201.795 -201.8 -201.805 -201.81 -201.815 -201.82 -201.825 -201.83 -201.835 -201.84 -201.845 -201.85 -201.855 -201.86 -201.865 -201.87 -201.875 -201.88 -201.885 -201.89 -201.895 -201.9 -201.905 -201.91 -201.915 -201.92 -201.925 -201.93 -201.935 -201.94 -201.945 -201.95 -201.955 -201.96 -201.965 -201.97 -201.975 -201.98 -201.985 -201.99 -201.995 -202 -202.005 -202.01 -202.015 -202.02 -202.025 -202.03 -202.035 -202.04 -202.045 -202.05 -202.055 -202.06 -202.065 -202.07 -202.075 -202.08 -202.085 -202.09 -202.095 -202.1 -202.105 -202.11 -202.115 -202.12 -202.125 -202.13 -202.135 -202.14 -202.145 -202.15 -202.155 -202.16 -202.165 -202.17 -202.175 -202.18 -202.185 -202.19 -202.195 -202.2 -202.205 -202.21 -202.215 -202.22 -202.225 -202.23 -202.235 -202.24 -202.245 -202.25 -202.255 -202.26 -202.265 -202.27 -202.275 -202.28 -202.285 -202.29 -202.295 -202.3 -202.305 -202.31 -202.315 -202.32 -202.325 -202.33 -202.335 -202.34 -202.345 -202.35 -202.355 -202.36 -202.365 -202.37 -202.375 -202.38 -202.385 -202.39 -202.395 -202.4 -202.405 -202.41 -202.415 -202.42 -202.425 -202.43 -202.435 -202.44 -202.445 -202.45 -202.455 -202.46 -202.465 -202.47 -202.475 -202.48 -202.485 -202.49 -202.495 - --75.9281 --75.9125 --75.9203 --75.9203 --75.9375 --75.9203 --75.9172 --75.9141 --75.9187 --75.9141 --75.9156 --75.9172 --75.9078 --75.9062 --75.9172 --75.9125 --75.9172 --75.9141 --75.9 --75.9094 --75.9141 --75.9125 --75.9156 --75.9172 --75.9172 --75.9313 --75.9328 --75.9187 --75.9203 --75.9172 --75.9125 --75.9203 --75.9187 --75.9234 --75.9297 --75.9156 --75.9203 --75.9187 --75.9187 --75.9187 --75.9281 --75.9 --75.9109 --75.9156 --75.9187 --75.9156 --75.9234 --75.9109 --75.9313 --75.9313 --75.9141 --75.9203 --75.9203 --75.9203 --75.9203 --75.9328 --75.9266 --75.9266 --75.9141 --75.9234 --75.9313 --75.9297 --75.9375 --75.9359 --75.9266 --75.9453 --75.9313 --75.9359 --75.9313 --75.925 --75.9203 --75.9344 --75.9391 --75.9391 --75.925 --75.9266 --75.9219 --75.9219 --75.9297 --75.9219 --75.9266 --75.9219 --75.9266 --75.9344 --75.9328 --75.9391 --75.9313 --75.9344 --75.9375 --75.9328 --75.9219 --75.9391 --75.9187 --75.9406 --75.9406 --75.9422 --75.9437 --75.9313 --75.9328 --75.9391 --75.9391 --75.9437 --75.9328 --75.9344 --75.9453 --75.925 --75.9344 --75.9422 --75.9359 --75.9328 --75.9391 --75.9359 --75.9328 --75.9453 --75.9344 --75.9328 --75.9344 --75.9469 --75.9344 --75.9406 --75.9203 --75.9391 --75.9359 --75.9219 --75.9391 --75.9469 --75.9313 --75.9344 --75.9219 --75.9203 --75.9219 --75.9359 --75.9344 --75.9469 --75.9359 --75.9234 --75.9313 --75.9266 --75.9344 --75.9219 --75.9328 --75.9297 --75.9406 --75.9359 --75.9328 --75.9281 --75.9391 --75.9406 --75.9297 --75.9266 --75.9391 --75.9391 --75.9406 --75.9391 --75.9313 --75.9406 --75.9344 --75.9313 --75.9328 --75.9203 --75.9437 --75.9313 --75.9328 --75.9328 --75.9281 --75.9281 --75.9266 --75.9328 --75.9266 --75.925 --75.9344 --75.9328 --75.925 --75.9391 --75.9281 --75.9266 --75.9234 --75.9406 --75.9437 --75.925 --75.9344 --75.9422 --75.9375 --75.9297 --75.9297 --75.9375 --75.9234 --75.9203 --75.9344 --75.9156 --75.9359 --75.9172 --75.9266 --75.9109 --75.9172 --75.9125 --75.9203 --75.9172 --75.9156 --75.9125 --75.9172 --75.9281 --75.9297 --75.9281 --75.9141 --75.9187 --75.9203 --75.9297 --75.9187 --75.9187 --75.9094 --75.9125 --75.9047 --75.9141 --75.9266 --75.9234 --75.9203 --75.9266 --75.9094 --75.9219 --75.9094 --75.9266 --75.9219 --75.9156 --75.9234 --75.9219 --75.925 --75.925 --75.9187 --75.9141 --75.9234 --75.9234 --75.9141 --75.9187 --75.9141 --75.9203 --75.9156 --75.9125 --75.9219 --75.9297 --75.9156 --75.9234 --75.9313 --75.925 --75.9172 --75.9141 --75.9234 --75.9359 --75.9328 --75.9187 --75.9375 --75.9234 --75.9281 --75.95 --75.9187 --75.9437 --75.9297 --75.9437 --75.9375 --75.9422 --75.9281 --75.9297 --75.9281 --75.925 --75.9328 --75.9359 --75.9172 --75.9406 --75.9172 --75.9359 --75.925 --75.9219 --75.925 --75.9156 --75.9187 --75.9313 --75.9328 --75.9266 --75.9422 --75.925 --75.9391 --75.9359 --75.9266 --75.9359 --75.9266 --75.925 --75.9375 --75.9313 --75.9266 --75.9281 --75.9219 --75.9344 --75.9406 --75.9219 --75.9281 --75.9344 --75.9297 --75.9313 --75.9219 --75.9266 --75.925 --75.9094 --75.9297 --75.9219 --75.9094 --75.9172 --75.9297 --75.9313 --75.925 --75.9203 --75.9328 --75.9203 --75.9156 --75.9203 --75.9094 --75.9203 --75.9203 --75.9094 --75.925 --75.9344 --75.9234 --75.9078 --75.9328 --75.9203 --75.9266 --75.9406 --75.9156 --75.9141 --75.9109 --75.9266 --75.9109 --75.925 --75.9281 --75.9281 --75.9344 --75.9313 --75.9297 --75.9187 --75.9266 --75.925 --75.9281 --75.9344 --75.9328 --75.9266 --75.9187 --75.9219 --75.9266 --75.9281 --75.9203 --75.9234 --75.9234 --75.9234 --75.9109 --75.9359 --75.9234 --75.9187 --75.925 --75.9281 --75.9219 --75.9328 --75.9203 --75.925 --75.9281 --75.9281 --75.9234 --75.9281 --75.9266 --75.925 --75.9187 --75.9359 --75.9094 --75.9234 --75.9141 --75.9281 --75.9187 --75.9203 --75.9125 --75.9156 --75.925 --75.9187 --75.9234 --75.925 --75.9109 --75.9266 --75.9031 --75.9203 --75.9313 --75.9187 --75.9125 --75.9172 --75.9156 --75.9234 --75.9094 --75.9203 --75.9203 --75.9141 --75.9297 --75.9141 --75.9281 --75.9203 --75.9156 --75.9141 --75.9313 --75.9141 --75.9281 --75.9219 --75.8938 --75.8609 --75.8016 --75.7453 --75.7063 --75.7156 --75.775 --75.8844 --76.0297 --76.1625 --76.2937 --76.3969 --76.4859 --76.5531 --76.6203 --76.6734 --76.7094 --76.7562 --76.8 --76.8562 --76.9 --76.9313 --76.975 --77.0297 --77.0656 --77.1141 --77.1453 --77.1937 --77.2266 --77.2734 --77.3203 --77.3578 --77.375 --77.4359 --77.4625 --77.5078 --77.5406 --77.5875 --77.6234 --77.6531 --77.6984 --77.7234 --77.75 --77.7797 --77.8281 --77.8516 --77.9 --77.9219 --77.9625 --77.9953 --78.0422 --78.075 --78.1094 --78.1328 --78.1703 --78.1969 --78.2281 --78.2422 --78.2797 --78.3016 --78.3641 --78.3625 --78.4016 --78.4375 --78.4672 --78.4938 --78.5297 --78.5609 --78.5859 --78.6141 --78.6359 --78.6609 --78.7016 --78.7109 --78.7391 --78.7562 --78.7906 --78.7891 --78.8531 --78.8547 --78.9062 --78.9156 --78.9297 --78.9688 --78.9766 --79.0047 --79.0234 --79.0531 --79.0813 --79.0906 --79.1234 --79.1562 --79.1547 --79.1937 --79.2016 --79.2234 --79.2547 --79.2766 --79.3016 --79.3281 --79.3781 --79.4391 --79.5344 --79.6062 --79.6594 --79.675 --79.6281 --79.5391 --79.4156 --79.2891 --79.1781 --79.0938 --79.025 --78.9594 --78.9172 --78.8984 --78.8672 --78.8531 --78.8313 --78.8047 --78.7922 --78.7484 --78.7344 --78.7031 --78.6781 --78.6484 --78.6156 --78.5953 --78.575 --78.5484 --78.5297 --78.5172 --78.4938 --78.4906 --78.4453 --78.4219 --78.4094 --78.3844 --78.3625 --78.3469 --78.325 --78.3078 --78.2797 --78.2719 --78.2438 --78.225 --78.2031 --78.1937 --78.1828 --78.1516 --78.125 --78.1234 --78.1 --78.0953 --78.0687 --78.0531 --78.0359 --78.0375 --78.0094 --77.9938 --77.9828 --77.9688 --77.9516 --77.9359 --77.9141 --77.9125 --77.8891 --77.8734 --77.8516 --77.8531 --77.8422 --77.8328 --77.8047 --77.8031 --77.8031 --77.7844 --77.7672 --77.7672 --77.7312 --77.7312 --77.7312 --77.7141 --77.6984 --77.6875 --77.6719 --77.6547 --77.6547 --77.6438 --77.65 --77.625 --77.6172 --77.6031 --77.6109 --77.5828 --77.5813 --77.5734 --77.5531 --77.5625 --77.5406 --77.5297 --77.5188 --77.5062 --77.5016 --77.4938 --77.4859 --77.4781 --77.4875 --77.4703 --77.4609 --77.4469 --77.4437 --77.4328 --77.4328 --77.4313 --77.425 --77.4344 --77.4078 --77.3828 --77.3922 --77.375 --77.3766 --77.3812 --77.3734 --77.3562 --77.3578 --77.3531 --77.3469 --77.3266 --77.3453 --77.3172 --77.3406 --77.3375 --77.3125 --77.3172 --77.3156 --77.2969 --77.2859 --77.2828 --77.2797 --77.2734 --77.275 --77.2688 --77.2547 --77.2625 --77.2547 --77.2562 --77.2438 --77.2562 --77.2438 --77.2281 --77.2172 --77.2156 --77.2172 --77.2266 --77.2156 --77.2109 --77.2047 --77.1937 --77.1969 --77.2078 --77.1859 --77.1875 --77.1813 --77.1797 --77.1703 --77.175 --77.1734 --77.1687 --77.1672 --77.1641 --77.1547 --77.1469 --77.15 --77.1516 --77.15 --77.1328 --77.1297 --77.1328 --77.1359 --77.1281 --77.1125 --77.1297 --77.1078 --77.1203 --77.1047 --77.1062 --77.1156 --77.1109 --77.1 --77.0984 --77.0969 --77.0906 --77.0938 --77.0844 --77.0813 --77.0734 --77.0828 --77.075 --77.0734 --77.0531 --77.0672 --77.0578 --77.0578 --77.0563 --77.0656 --77.05 --77.0469 --77.0516 --77.0437 --77.0547 --77.0406 --77.0266 --77.0437 --77.0359 --77.0312 --77.0281 --77.0234 --77.0328 --77.0156 --77.0219 --77.0234 --77.0219 --77.0062 --77.0203 --77.0031 --77.0094 --76.9984 --76.9984 --76.9875 --76.9859 --76.9953 --76.9781 --76.9734 --76.9812 --76.9859 --76.9797 --76.9891 --76.9812 --76.9625 --76.9734 --76.9734 --76.9766 --76.9594 --76.9672 --76.9594 --76.9594 --76.9656 --76.9563 --76.9734 --76.95 --76.9563 --76.9469 --76.9422 --76.9516 --76.9516 --76.9453 --76.9516 --76.9516 --76.9375 --76.9531 --76.9672 --76.9406 --76.9422 --76.9391 --76.95 --76.9484 --76.9375 --76.9391 --76.9484 --76.9406 --76.95 --76.9328 --76.9375 --76.9391 --76.9328 --76.9219 --76.9359 --76.9297 --76.925 --76.9203 --76.9234 --76.9234 --76.9094 --76.925 --76.9047 --76.9047 --76.9234 --76.9125 --76.9078 --76.9109 --76.9062 --76.9078 --76.9172 --76.9 --76.8906 --76.8953 --76.8984 --76.8969 --76.8844 --76.9 --76.9062 --76.8891 --76.8859 --76.8938 --76.8812 --76.8734 --76.8781 --76.8781 --76.8703 --76.875 --76.8719 --76.8781 --76.8828 --76.8703 --76.8766 --76.8703 --76.8734 --76.8734 --76.8641 --76.8734 --76.8594 --76.8688 --76.8609 --76.8672 --76.8656 --76.8516 --76.8656 --76.8625 --76.8406 --76.8484 --76.8578 --76.8625 --76.8406 --76.8578 --76.8719 --76.85 --76.8516 --76.85 --76.8547 --76.8562 --76.8516 --76.8578 --76.8531 --76.8562 --76.8516 --76.8469 --76.8438 --76.8516 --76.8359 --76.8594 --76.8453 --76.85 --76.85 --76.8484 --76.8516 --76.8328 --76.8375 --76.8422 --76.8453 --76.8359 --76.8406 --76.8344 --76.8406 --76.8422 --76.8469 --76.8438 --76.8391 --76.8281 --76.8453 --76.8422 --76.825 --76.8484 --76.8406 --76.8203 --76.8422 --76.8313 --76.8328 --76.8281 --76.8344 --76.8141 --76.8219 --76.8375 --76.8187 --76.8219 --76.8281 --76.825 --76.8156 --76.8344 --76.8266 --76.8219 --76.825 --76.8344 --76.8281 --76.825 --76.8187 --76.8266 --76.825 --76.8219 --76.8281 --76.8125 --76.8266 --76.8109 --76.8203 --76.8281 --76.8078 --76.8219 --76.8219 --76.8297 --76.8078 --76.8047 --76.7984 --76.8109 --76.8094 --76.8078 --76.8375 --76.825 --76.8125 --76.8172 --76.8172 --76.8156 --76.8156 --76.8031 --76.8047 --76.8031 --76.8031 --76.8031 --76.8016 --76.8172 --76.8109 --76.8125 --76.8109 --76.7984 --76.8047 --76.7984 --76.8156 --76.7922 --76.8094 --76.7969 --76.8172 --76.8016 --76.8203 --76.8031 --76.8109 --76.8078 --76.8078 --76.8047 --76.7953 --76.7875 --76.8016 --76.7766 --76.8094 --76.8047 --76.7891 --76.8031 --76.7922 --76.7953 --76.7906 --76.7937 --76.7859 --76.7891 --76.7766 --76.7844 --76.7937 --76.7844 --76.775 --76.7828 --76.7937 --76.7875 --76.7953 --76.7828 --76.7844 --76.7859 --76.7781 --76.7734 --76.7766 --76.7734 --76.7781 --76.775 --76.7891 --76.7906 --76.7844 --76.7719 --76.7781 --76.7797 --76.7734 --76.7766 --76.7922 --76.7812 --76.7875 --76.7734 --76.7828 --76.7766 --76.7766 --76.7906 --76.7906 --76.7781 --76.7703 --76.7812 --76.7844 --76.775 --76.7703 --76.7703 --76.7703 --76.7875 --76.7766 --76.7859 --76.7844 --76.7906 --76.7844 --76.7734 --76.7844 --76.7906 --76.7812 --76.7578 --76.7656 --76.7766 --76.7734 --76.7656 --76.7719 --76.7703 --76.7594 --76.7766 --76.7781 --76.7812 --76.775 --76.7672 --76.7703 --76.7656 --76.7781 --76.7828 --76.7625 --76.7688 --76.7641 --76.7766 --76.7656 --76.7641 --76.7516 --76.7609 --76.7766 --76.7641 --76.7531 --76.7672 --76.7672 --76.7578 --76.7656 --76.7578 --76.7578 --76.7609 --76.7719 --76.7625 --76.7484 --76.7609 --76.75 --76.7625 --76.7781 --76.7609 --76.7656 --76.7609 --76.7672 --76.7656 --76.7516 --76.7609 --76.7578 --76.7625 --76.7547 --76.7453 --76.7609 --76.7469 --76.7609 --76.7531 --76.7391 --76.7594 --76.7562 --76.7562 --76.7609 --76.7484 --76.7484 --76.7453 --76.7531 --76.7531 --76.75 --76.7469 --76.7375 --76.75 --76.7531 --76.7453 --76.7453 --76.7453 --76.7281 --76.7438 --76.7406 --76.7219 --76.7406 --76.7391 --76.7375 --76.7453 --76.75 --76.7328 --76.7406 --76.7391 --76.7297 --76.7328 --76.7234 --76.725 --76.7469 --76.725 --76.7422 --76.7312 --76.7359 --76.7266 --76.7328 --76.7391 --76.7375 --76.7172 --76.7344 --76.7375 --76.7297 --76.725 --76.7125 --76.7141 --76.7094 --76.7266 --76.725 --76.7328 --76.7156 --76.7172 --76.7141 --76.7125 --76.7109 --76.7281 --76.7188 --76.7219 --76.7172 --76.7203 --76.7281 --76.7312 --76.7188 --76.7266 --76.7344 --76.7328 --76.7219 --76.7234 --76.7172 --76.7281 --76.7141 --76.7297 --76.7219 --76.7266 --76.7141 --76.7203 --76.7312 --76.7391 --76.7219 --76.7188 --76.725 --76.7219 --76.7063 --76.7172 --76.7359 --76.7188 --76.7109 --76.7312 --76.7172 --76.7125 --76.7047 --76.7047 --76.7234 --76.7266 --76.7203 --76.7156 --76.7172 --76.7281 --76.7234 --76.7297 --76.725 --76.7172 --76.7203 --76.7203 --76.7047 --76.725 --76.7219 --76.7125 --76.7156 --76.7078 --76.7156 --76.6984 --76.7094 --76.7078 --76.7078 --76.7219 --76.7141 --76.7078 --76.7094 --76.7094 --76.7094 --76.7125 --76.7109 --76.7219 --76.7141 --76.7141 --76.7047 --76.7141 --76.7063 --76.7078 --76.7063 --76.7125 --76.7188 --76.7078 --76.6984 --76.7078 --76.6984 --76.7109 --76.7094 --76.7078 --76.7016 --76.6984 --76.7047 --76.7203 --76.6953 --76.7016 --76.7094 --76.6937 --76.6953 --76.7016 --76.7063 --76.7031 --76.7016 --76.6953 --76.7031 --76.7219 --76.7047 --76.7109 --76.7125 --76.6953 --76.7016 --76.6969 --76.7031 --76.7 --76.6844 --76.6969 --76.7031 --76.7047 --76.6922 --76.6922 --76.6984 --76.6969 --76.6844 --76.6859 --76.6969 --76.6875 --76.6797 --76.675 --76.6813 --76.6922 --76.6906 --76.6844 --76.6828 --76.6922 --76.6891 --76.6937 --76.6875 --76.6875 --76.6859 --76.6781 --76.6906 --76.6734 --76.6891 --76.6891 --76.6906 --76.6937 --76.6875 --76.6625 --76.6797 --76.6875 --76.6813 --76.6797 --76.6781 --76.6828 --76.6828 --76.6797 --76.6781 --76.6813 --76.6797 --76.6937 --76.675 --76.6844 --76.6906 --76.6813 --76.6828 --76.6813 --76.6859 --76.6813 --76.6875 --76.6766 --76.6844 --76.6828 --76.6594 --76.6719 --76.6687 --76.6703 --76.6687 --76.6734 --76.6844 --76.6813 --76.6766 --76.6781 --76.6891 --76.6844 --76.6672 --76.6687 --76.6734 --76.6766 --76.6719 --76.675 --76.675 --76.6672 --76.675 --76.6797 --76.6797 --76.6734 --76.6891 --76.6766 --76.6719 --76.6703 --76.6813 --76.675 --76.6875 --76.6766 --76.6906 --76.6859 --76.6797 --76.6797 --76.6734 --76.6734 --76.675 --76.6703 --76.6891 --76.6656 --76.6844 --76.6922 --76.6766 --76.6828 --76.675 --76.6734 --76.675 --76.6734 --76.6594 --76.6703 --76.6797 --76.6703 --76.6813 --76.6844 --76.675 --76.6687 --76.6641 --76.6766 --76.6531 --76.6734 --76.6672 --76.6625 --76.6516 --76.6781 --76.6672 --76.6672 --76.6719 --76.6609 --76.6594 --76.6766 --76.6594 --76.6516 --76.65 --76.6594 --76.6625 --76.675 --76.6656 --76.6672 --76.675 --76.6672 --76.675 --76.6703 --76.6656 --76.6719 --76.6641 --76.6531 --76.6562 --76.6531 --76.6516 --76.6562 --76.6703 --76.6594 --76.6516 --76.6609 --76.6734 --76.6531 --76.6594 --76.6656 --76.6578 --76.6609 --76.6547 --76.6578 --76.6672 --76.6578 --76.6531 --76.6562 --76.6547 --76.6562 --76.6609 --76.6578 --76.6594 --76.6625 --76.6453 --76.6562 --76.6656 --76.6719 --76.6641 --76.6516 --76.6672 --76.6531 --76.6562 --76.6547 --76.6625 --76.6656 --76.6594 --76.6734 --76.6547 --76.6578 --76.6547 --76.6531 --76.6578 --76.6578 --76.6469 --76.6469 --76.65 --76.6516 --76.65 --76.6687 --76.6547 --76.6438 --76.6516 --76.65 --76.6547 --76.6516 --76.6547 --76.6438 --76.6469 --76.6406 --76.6578 --76.6531 --76.6469 --76.6484 --76.65 --76.6391 --76.6547 --76.6453 --76.6469 --76.6609 --76.6547 --76.6625 --76.6422 --76.6406 --76.6281 --76.65 --76.6547 --76.6422 --76.65 --76.6453 --76.6484 --76.6328 --76.6406 --76.6406 --76.6578 --76.6453 --76.6562 --76.6359 --76.6484 --76.6531 --76.6391 --76.6438 --76.6484 --76.6344 --76.6469 --76.6422 --76.65 --76.6406 --76.6406 --76.6453 --76.6484 --76.6531 --76.6359 --76.6453 --76.6375 --76.65 --76.6469 --76.6438 --76.6328 --76.6422 --76.65 --76.6344 --76.6406 --76.6312 --76.6312 --76.6516 --76.6391 --76.6484 --76.6453 --76.6359 --76.6531 --76.6406 --76.6312 --76.6453 --76.6328 --76.6406 --76.6438 --76.6344 --76.6391 --76.6281 --76.6266 --76.6312 --76.6375 --76.6375 --76.6406 --76.6406 --76.6484 --76.6469 --76.6438 --76.6469 --76.6266 --76.6453 --76.6375 --76.6422 --76.6469 --76.6406 --76.6438 --76.6516 --76.6328 --76.6266 --76.6344 --76.6234 --76.6328 --76.6438 --76.6359 --76.6344 --76.6453 --76.6344 --76.6344 --76.6281 --76.6469 --76.6266 --76.6203 --76.6422 --76.6469 --76.6391 --76.6406 --76.6312 --76.6375 --76.6391 --76.6281 --76.6188 --76.6328 --76.6406 --76.6266 --76.6297 --76.6188 --76.6328 --76.6375 --76.6281 --76.6453 --76.625 --76.6344 --76.6297 --76.6219 --76.6312 --76.6406 --76.6375 --76.6328 --76.6328 --76.6328 --76.6453 --76.625 --76.6312 --76.6422 --76.6344 --76.6391 --76.6406 --76.6453 --76.6312 --76.6125 --76.625 --76.625 --76.6266 --76.6 --76.625 --76.6219 --76.6375 --76.6281 --76.6203 --76.6328 --76.6109 --76.6297 --76.6281 --76.6297 --76.6016 --76.6359 --76.6344 --76.6266 --76.6406 --76.6203 --76.6203 --76.6172 --76.6047 --76.6234 --76.6234 --76.6234 --76.625 --76.6281 --76.6281 --76.6234 --76.6219 --76.6312 --76.6266 --76.6172 --76.6125 --76.6109 --76.6062 --76.6266 --76.6141 --76.6188 --76.6203 --76.6016 --76.6188 --76.6062 --76.6062 --76.5969 --76.6062 --76.6203 --76.6141 --76.6125 --76.6094 --76.5984 --76.6234 --76.6125 --76.6094 --76.6125 --76.6016 --76.6219 --76.6062 --76.6047 --76.6094 --76.6141 --76.6109 --76.6281 --76.6062 --76.6062 --76.6219 --76.6156 --76.6141 --76.6047 --76.6234 --76.6016 --76.6062 --76.6031 --76.6016 --76.6172 --76.6109 --76.6094 --76.6047 --76.6141 --76.6062 --76.6047 --76.6109 --76.6031 --76.6094 --76.6094 --76.6047 --76.5906 --76.6141 --76.5938 --76.6094 --76.6109 --76.6078 --76.6062 --76.6 --76.6062 --76.6266 --76.6062 --76.6141 --76.6141 --76.6062 --76.6125 --76.6078 --76.6172 --76.6078 --76.6109 --76.6062 --76.6094 --76.6109 --76.6109 --76.6078 --76.6156 --76.6203 --76.6078 --76.6062 --76.6 --76.6109 --76.6016 --76.6094 --76.6078 --76.6047 --76.6125 --76.6156 --76.6141 --76.6062 --76.6062 --76.6078 --76.6031 --76.6203 --76.6062 --76.6109 --76.6047 --76.6062 --76.6172 --76.6125 --76.6 --76.6078 --76.6094 --76.6031 --76.6062 --76.5984 --76.5984 --76.6172 --76.5969 --76.6172 --76.6031 --76.6109 --76.6016 --76.5984 --76.6109 --76.5922 --76.6062 --76.5922 --76.5938 --76.6 --76.5953 --76.6047 --76.5938 --76.5984 --76.6 --76.6031 --76.6078 --76.5922 --76.5906 --76.6016 --76.6125 --76.5953 --76.6062 --76.5922 --76.6062 --76.6031 --76.6078 --76.5906 --76.6188 --76.6031 --76.6016 --76.6172 --76.5938 --76.6 --76.5938 --76.5938 --76.6016 --76.6062 --76.5984 --76.5922 --76.6062 --76.6031 --76.6109 --76.6109 --76.6094 --76.6156 --76.6047 --76.5953 --76.5984 --76.6016 --76.6125 --76.6094 --76.5969 --76.6062 --76.6062 --76.6109 --76.5938 --76.6094 --76.5969 --76.5938 --76.6047 --76.6094 --76.6078 --76.6094 --76.5984 --76.6031 --76.6125 --76.6031 --76.6141 --76.6 --76.5922 --76.6 --76.6109 --76.6016 --76.6078 --76.6016 --76.6 --76.5984 --76.6109 --76.6078 --76.5984 --76.5938 --76.6031 --76.6016 --76.5984 --76.5906 --76.6062 --76.6062 --76.6125 --76.6094 --76.6016 --76.5984 --76.6016 --76.6062 --76.6 --76.6219 --76.5969 --76.6109 --76.6047 --76.6 --76.6047 --76.6078 --76.6 --76.6125 --76.6125 --76.6062 --76.5906 --76.5906 --76.6125 --76.6094 --76.6 --76.5984 --76.5969 --76.5938 --76.5797 --76.5953 --76.5922 --76.6 --76.6016 --76.5953 --76.5875 --76.5969 --76.575 --76.5938 --76.6016 --76.5875 --76.6062 --76.5891 --76.5859 --76.5906 --76.6031 --76.5984 --76.5922 --76.5922 --76.5922 --76.5797 --76.5938 --76.5938 --76.5859 --76.5891 --76.6016 --76.5953 --76.5813 --76.5906 --76.5938 --76.5891 --76.6109 --76.5938 --76.5953 --76.5922 --76.6 --76.5938 --76.6047 --76.6 --76.5938 --76.5922 --76.5844 --76.5969 --76.5891 --76.5969 --76.5922 --76.5922 --76.5813 --76.5891 --76.5906 --76.5813 --76.5828 --76.5969 --76.5859 --76.5984 --76.5953 --76.5875 --76.5969 --76.575 --76.5844 --76.5891 --76.5781 --76.5844 --76.5859 --76.5766 --76.5797 --76.5844 --76.5781 --76.5656 --76.5687 --76.5891 --76.575 --76.5719 --76.5656 --76.5766 --76.5703 --76.5891 --76.5797 --76.5687 --76.5703 --76.5797 --76.5781 --76.5797 --76.5781 --76.5859 --76.5781 --76.5703 --76.5781 --76.5797 --76.5672 --76.5703 --76.5781 --76.5719 --76.5906 --76.5813 --76.5734 --76.5813 --76.5766 --76.5922 --76.5797 --76.5719 --76.5625 --76.5797 --76.5703 --76.5687 --76.5797 --76.5625 --76.5687 --76.5766 --76.5797 --76.55 --76.5766 --76.5766 --76.5563 --76.5641 --76.5703 --76.5781 --76.5844 --76.5656 --76.5703 --76.5687 --76.5719 --76.5703 --76.5734 --76.5594 --76.5594 --76.575 --76.5719 --76.5828 --76.5734 --76.5781 --76.5641 --76.5719 --76.5953 --76.5875 --76.575 --76.5766 --76.5703 --76.5844 --76.5781 --76.5813 --76.5672 --76.5734 --76.5828 --76.5859 --76.5734 --76.5734 --76.5672 --76.5734 --76.5797 --76.5734 --76.5641 --76.575 --76.5891 --76.5641 --76.5734 --76.5687 --76.5563 --76.5719 --76.5781 --76.5781 --76.5859 --76.5687 --76.5813 --76.575 --76.5719 --76.5859 --76.5719 --76.5875 --76.5859 --76.5797 --76.5797 --76.5687 --76.5813 --76.5609 --76.5813 --76.5766 --76.5766 --76.5687 --76.575 --76.5656 --76.5656 --76.5578 --76.5594 --76.5625 --76.5703 --76.5703 --76.5703 --76.5641 --76.5625 --76.5641 --76.5687 --76.5609 --76.5687 --76.5625 --76.5703 --76.5656 --76.5578 --76.5578 --76.5625 --76.5656 --76.575 --76.5734 --76.5766 --76.5813 --76.5547 --76.575 --76.5687 --76.575 --76.5797 --76.5672 --76.5703 --76.5578 --76.575 --76.5813 --76.5719 --76.5563 --76.575 --76.5609 --76.5797 --76.5641 --76.5672 --76.5828 --76.5672 --76.5734 --76.5828 --76.5922 --76.5734 --76.5703 --76.5703 --76.5766 --76.5703 --76.5719 --76.575 --76.5734 --76.5734 --76.5734 --76.5563 --76.5797 --76.5547 --76.5828 --76.5609 --76.5766 --76.5797 --76.5766 --76.5656 --76.5797 --76.5672 --76.5719 --76.5672 --76.5656 --76.5594 --76.5828 --76.5844 --76.5734 --76.5719 --76.5719 --76.5641 --76.5656 --76.5672 --76.5891 --76.5719 --76.5687 --76.5703 --76.5547 --76.5703 --76.5609 --76.5578 --76.5656 --76.5563 --76.5516 --76.5719 --76.5406 --76.5547 --76.5406 --76.5563 --76.5469 --76.5609 --76.55 --76.55 --76.5578 --76.5609 --76.5531 --76.5641 --76.5563 --76.5609 --76.5719 --76.5703 --76.5516 --76.5594 --76.5609 --76.5578 --76.5469 --76.5687 --76.5594 --76.5719 --76.5687 --76.5547 --76.5516 --76.5578 --76.5672 --76.5391 --76.5578 --76.5578 --76.5453 --76.55 --76.5578 --76.5609 --76.5422 --76.5484 --76.5578 --76.5609 --76.5516 --76.5672 --76.5484 --76.5703 --76.5516 --76.5578 --76.5672 --76.5563 --76.5625 --76.5563 --76.5703 --76.5406 --76.5625 --76.5656 --76.5641 --76.5625 --76.5656 --76.5547 --76.5578 --76.5547 --76.5578 --76.5766 --76.5656 --76.5578 --76.5516 --76.5641 --76.5594 --76.5687 --76.5563 --76.55 --76.5531 --76.5578 --76.5437 --76.5516 --76.5469 --76.5422 --76.5437 --76.5531 --76.5484 --76.5516 --76.5469 --76.5453 --76.5531 --76.5531 --76.5453 --76.5516 --76.5531 --76.5437 --76.5484 --76.5484 --76.5406 --76.5516 --76.5297 --76.5406 --76.5531 --76.5344 --76.55 --76.5328 --76.5469 --76.5422 --76.5484 --76.5328 --76.5516 --76.5469 --76.5453 --76.5359 --76.5484 --76.55 --76.55 --76.5437 --76.5437 --76.5547 --76.5453 --76.55 --76.5563 --76.5547 --76.5406 --76.5516 --76.5516 --76.5406 --76.5594 --76.5547 --76.5297 --76.5406 --76.5312 --76.525 --76.5359 --76.55 --76.5391 --76.5406 --76.5328 --76.5406 --76.5344 --76.55 --76.5453 --76.55 --76.5375 --76.5437 --76.5422 --76.5516 --76.5594 --76.5547 --76.55 --76.5375 --76.5453 --76.5484 --76.5453 --76.5437 --76.5406 --76.55 --76.5578 --76.5422 --76.5547 --76.5484 --76.5469 --76.5344 --76.5391 --76.5375 --76.55 --76.5563 --76.5375 --76.5328 --76.5422 --76.5453 --76.5344 --76.5422 --76.5531 --76.5359 --76.5266 --76.5344 --76.5406 --76.5328 --76.5531 --76.5453 --76.5469 --76.55 --76.5391 --76.5453 --76.5328 --76.5422 --76.5312 --76.5375 --76.5406 --76.5437 --76.5375 --76.5344 --76.5375 --76.5391 --76.5453 --76.5391 --76.5328 --76.5328 --76.5359 --76.5391 --76.5188 --76.5328 --76.5469 --76.5328 --76.5203 --76.5344 --76.5422 --76.5266 --76.5359 --76.5266 --76.5281 --76.5297 --76.5234 --76.5328 --76.525 --76.5375 --76.5297 --76.5312 --76.5359 --76.5234 --76.5312 --76.5359 --76.5281 --76.5281 --76.5344 --76.5297 --76.5219 --76.5203 --76.5281 --76.5359 --76.5172 --76.5328 --76.5234 --76.5531 --76.5297 --76.5172 --76.5359 --76.5281 --76.5344 --76.5281 --76.525 --76.5203 --76.5344 --76.525 --76.5437 --76.5359 --76.5406 --76.5328 --76.5281 --76.5344 --76.5125 --76.5234 --76.5188 --76.5188 --76.5297 --76.5281 --76.5125 --76.5266 --76.5141 --76.5141 --76.5188 --76.525 --76.5141 --76.5219 --76.5125 --76.5203 --76.5266 --76.5234 --76.5375 --76.5328 --76.5328 --76.5312 --76.5297 --76.5328 --76.5516 --76.5391 --76.5312 --76.5297 --76.5344 --76.5391 --76.525 --76.5406 --76.5406 --76.5312 --76.5297 --76.5172 --76.5328 --76.55 --76.5297 --76.525 --76.5188 --76.5328 --76.5141 --76.525 --76.5359 --76.5391 --76.525 --76.5297 --76.5266 --76.5234 --76.5109 --76.5219 --76.5188 --76.5125 --76.5156 --76.5312 --76.5375 --76.5219 --76.5219 --76.5188 --76.5266 --76.5234 --76.5203 --76.525 --76.525 --76.5328 --76.5266 --76.5203 --76.5281 --76.5375 --76.5203 --76.5328 --76.525 --76.5281 --76.5172 --76.5359 --76.5312 --76.5172 --76.5359 --76.5266 --76.5141 --76.5266 --76.5219 --76.5297 --76.5203 --76.5328 --76.5266 --76.5375 --76.5281 --76.5297 --76.5312 --76.5141 --76.5281 --76.5219 --76.5203 --76.525 --76.5078 --76.5203 --76.5125 --76.5141 --76.5188 --76.5094 --76.5234 --76.5156 --76.5016 --76.5109 --76.5141 --76.5062 --76.5016 --76.5062 --76.5078 --76.5297 --76.5125 --76.5062 --76.5172 --76.5156 --76.5125 --76.4984 --76.5172 --76.5016 --76.5172 --76.5047 --76.5203 --76.5062 --76.5078 --76.5 --76.5141 --76.5047 --76.5156 --76.5109 --76.5062 --76.5078 --76.5062 --76.5016 --76.5047 --76.5125 --76.5094 --76.5188 --76.5109 --76.5031 --76.5094 --76.5312 --76.5219 --76.5031 --76.5094 --76.5016 --76.5031 --76.5016 --76.5016 --76.5109 --76.5 --76.5125 --76.5109 --76.5234 --76.5156 --76.5 --76.5328 --76.5219 --76.5078 --76.4938 --76.5047 --76.5125 --76.5078 --76.5266 --76.5219 --76.5156 --76.5266 --76.5141 --76.525 --76.5188 --76.5219 --76.5188 --76.5094 --76.5203 --76.5 --76.5172 --76.5047 --76.5156 --76.5016 --76.4984 --76.5172 --76.5078 --76.5062 --76.5062 --76.5109 --76.5172 --76.5078 --76.5031 --76.5078 --76.5031 --76.4859 --76.5172 --76.5062 --76.5109 --76.5078 --76.4984 --76.5094 --76.5062 --76.4969 --76.5141 --76.4969 --76.5047 --76.5109 --76.5016 --76.5094 --76.5188 --76.5188 --76.5031 --76.5141 --76.4953 --76.5062 --76.5047 --76.4984 --76.5016 --76.4969 --76.5 --76.5172 --76.4922 --76.5031 --76.5094 --76.4844 --76.5016 --76.4812 --76.5 --76.5016 --76.5031 --76.4922 --76.5062 --76.5062 --76.4844 --76.4969 --76.5234 --76.4969 --76.5094 --76.5125 --76.5062 --76.5078 --76.5109 --76.5156 --76.5219 --76.5141 --76.5094 --76.5125 --76.5047 --76.5172 --76.4859 --76.5078 --76.4984 --76.5 --76.5172 --76.5156 --76.5125 --76.5094 --76.5141 --76.4953 --76.5109 --76.5078 --76.5203 --76.5062 --76.5 --76.5078 --76.5 --76.5016 --76.5031 --76.4891 --76.5031 --76.4969 --76.5062 --76.5 --76.4906 --76.4953 --76.5016 --76.5016 --76.5094 --76.5125 --76.4953 --76.5094 --76.5016 --76.5141 --76.5 --76.5125 --76.4969 --76.4984 --76.4875 --76.5031 --76.4938 --76.4953 --76.4922 --76.4891 --76.5016 --76.4922 --76.5016 --76.4797 --76.4922 --76.5109 --76.4984 --76.4906 --76.4984 --76.4922 --76.5109 --76.5109 --76.5016 --76.5062 --76.4844 --76.5062 --76.4969 --76.5078 --76.5016 --76.5141 --76.5 --76.4953 --76.4922 --76.4875 --76.4953 --76.4984 --76.4969 --76.4953 --76.4938 --76.4891 --76.4953 --76.4906 --76.4922 --76.5047 --76.4984 --76.4969 --76.4906 --76.5031 --76.5016 --76.5047 --76.5156 --76.5 --76.4891 --76.5016 --76.5094 --76.4906 --76.4953 --76.4984 --76.4875 --76.5109 --76.4984 --76.4953 --76.4859 --76.4844 --76.4875 --76.4875 --76.475 --76.4969 --76.4859 --76.4766 --76.4781 --76.4969 --76.4781 --76.4844 --76.4859 --76.4922 --76.4797 --76.4844 --76.4828 --76.475 --76.4891 --76.4938 --76.4781 --76.475 --76.4812 --76.4828 --76.4859 --76.4859 --76.4969 --76.4891 --76.4922 --76.475 --76.4734 --76.4875 --76.4844 --76.4906 --76.4969 --76.4984 --76.4906 --76.4938 --76.4875 --76.4859 --76.5 --76.4984 --76.4953 --76.4859 --76.4828 --76.5016 --76.4953 --76.4781 --76.4844 --76.4828 --76.5016 --76.4797 --76.4906 --76.4781 --76.4812 --76.4797 --76.4891 --76.4938 --76.4922 --76.4906 --76.4859 --76.4828 --76.4844 --76.4766 --76.4922 --76.4812 --76.4781 --76.4781 --76.5031 --76.4938 --76.4688 --76.4766 --76.4875 --76.4734 --76.4781 --76.4844 --76.475 --76.4891 --76.4734 --76.4859 --76.4797 --76.4688 --76.4797 --76.4797 --76.4969 --76.4844 --76.4719 --76.4859 --76.4891 --76.4906 --76.4766 --76.4766 --76.475 --76.4844 --76.4766 --76.4891 --76.4812 --76.4891 --76.4812 --76.4703 --76.4859 --76.5 --76.4859 --76.4797 --76.4859 --76.4938 --76.475 --76.4875 --76.4859 --76.4922 --76.4578 --76.5 --76.4891 --76.4891 --76.4984 --76.4922 --76.4922 --76.4812 --76.4875 --76.4875 --76.4859 --76.4938 --76.4828 --76.4906 --76.4969 --76.4703 --76.475 --76.4859 --76.4828 --76.4766 --76.4719 --76.4812 --76.4781 --76.4719 --76.4641 --76.4734 --76.4797 --76.4828 --76.4766 --76.475 --76.4797 --76.4734 --76.4672 --76.475 --76.4625 --76.4656 --76.4734 --76.4781 --76.4766 --76.4828 --76.4766 --76.4781 --76.4812 --76.4859 --76.4703 --76.4688 --76.475 --76.4734 --76.4797 --76.4734 --76.4844 --76.4781 --76.4688 --76.4906 --76.4828 --76.4781 --76.4703 --76.4641 --76.4844 --76.4844 --76.4781 --76.475 --76.4766 --76.4781 --76.4875 --76.4672 --76.4781 --76.4688 --76.4844 --76.4781 --76.4656 --76.4625 --76.4641 --76.4719 --76.4578 --76.4609 --76.4781 --76.4641 --76.4688 --76.4641 --76.4828 --76.4734 --76.4781 --76.4547 --76.4672 --76.4719 --76.475 --76.4672 --76.4812 --76.4734 --76.4625 --76.4766 --76.4688 --76.4844 --76.4656 --76.4703 --76.4703 --76.4703 --76.4719 --76.4734 --76.4703 --76.4594 --76.4797 --76.4766 --76.4703 --76.4797 --76.4703 --76.4719 --76.4828 --76.4734 --76.4734 --76.4734 --76.4703 --76.4859 --76.4812 --76.4703 --76.4797 --76.4766 --76.4625 --76.4688 --76.4844 --76.475 --76.4797 --76.475 --76.4891 --76.4797 --76.475 --76.4734 --76.4703 --76.4688 --76.475 --76.4781 --76.4719 --76.4656 --76.4797 --76.4609 --76.4703 --76.4656 --76.4734 --76.4719 --76.4641 --76.4641 --76.4766 --76.4672 --76.4609 --76.4563 --76.4625 --76.4609 --76.4844 --76.4594 --76.4578 --76.4656 --76.4672 --76.4641 --76.4609 --76.4719 --76.4672 --76.4766 --76.4828 --76.4641 --76.4703 --76.4578 --76.4594 --76.4656 --76.4703 --76.4656 --76.4734 --76.4688 --76.4563 --76.4609 --76.4625 --76.4688 --76.4734 --76.4625 --76.4422 --76.4578 --76.475 --76.4719 --76.4703 --76.4563 --76.4547 --76.4625 --76.4703 --76.4578 --76.4703 --76.4563 --76.4594 --76.4578 --76.4734 --76.4656 --76.4625 --76.4625 --76.4578 --76.4531 --76.4563 --76.45 --76.4641 --76.45 --76.4641 --76.45 --76.4594 --76.4734 --76.4734 --76.4656 --76.4703 --76.4563 --76.4703 --76.475 --76.4609 --76.4531 --76.4547 --76.4766 --76.4672 --76.4734 --76.4641 --76.4734 --76.4578 --76.4641 --76.4688 --76.4688 --76.4672 --76.4734 --76.4641 --76.4703 --76.4672 --76.4781 --76.4516 --76.4625 --76.4609 --76.4578 --76.4453 --76.4531 --76.4609 --76.4594 --76.4516 --76.4531 --76.4469 --76.4531 --76.4531 --76.4453 --76.4469 --76.4641 --76.45 --76.4469 --76.4641 --76.45 --76.4516 --76.4484 --76.4453 --76.45 --76.4531 --76.45 --76.4484 --76.4437 --76.4594 --76.4516 --76.4609 --76.4531 --76.4547 --76.4578 --76.4672 --76.4484 --76.4563 --76.4437 --76.4469 --76.4578 --76.4484 --76.4672 --76.4641 --76.4516 --76.4359 --76.4344 --76.4547 --76.4391 --76.4406 --76.4469 --76.4328 --76.4406 --76.4453 --76.4359 --76.4406 --76.4406 --76.4469 --76.4391 --76.4375 --76.4437 --76.4406 --76.4453 --76.4422 --76.4375 --76.45 --76.4266 --76.4375 --76.4469 --76.4328 --76.4375 --76.4422 --76.4344 --76.4281 --76.4469 --76.4266 --76.4359 --76.4344 --76.4297 --76.4313 --76.4359 --76.4141 --76.4359 --76.4219 --76.425 --76.4453 --76.4297 --76.4344 --76.4375 --76.4313 --76.4547 --76.4219 --76.4281 --76.4328 --76.4344 --76.4375 --76.4203 --76.4281 --76.4266 --76.4313 --76.4375 --76.4391 --76.4266 --76.4219 --76.4375 --76.4313 --76.4406 --76.4391 --76.4469 --76.4344 --76.4313 --76.4406 --76.4437 --76.4187 --76.4328 --76.4453 --76.4375 --76.425 --76.4313 --76.4328 --76.4328 --76.4281 --76.4422 --76.4344 --76.4313 --76.4437 --76.4313 --76.4375 --76.4328 --76.4422 --76.4391 --76.4437 --76.4359 --76.4359 --76.4406 --76.4313 --76.4422 --76.4328 --76.4359 --76.4437 --76.4281 --76.4359 --76.4391 --76.4437 --76.4437 --76.4406 --76.4375 --76.4391 --76.4375 --76.4391 --76.4297 --76.425 --76.4187 --76.4297 --76.4328 --76.4313 --76.4391 --76.4219 --76.4281 --76.4313 --76.4391 --76.4516 --76.4453 --76.4375 --76.4359 --76.4391 --76.4406 --76.4313 --76.4313 --76.4469 --76.4281 --76.4406 --76.4453 --76.4437 --76.4469 --76.4391 --76.4484 --76.4375 --76.4406 --76.4328 --76.4344 --76.4375 --76.4469 --76.4406 --76.4375 --76.4406 --76.4391 --76.4391 --76.4437 --76.4406 --76.4453 --76.4422 --76.4469 --76.4375 --76.4422 --76.4453 --76.4484 --76.4391 --76.4516 --76.4391 --76.4375 --76.4422 --76.4469 --76.4469 --76.4375 --76.4359 --76.4281 --76.4359 --76.4469 --76.4453 --76.4516 --76.4484 --76.4437 --76.4391 --76.4469 --76.4406 --76.4344 --76.4594 --76.4547 --76.4484 --76.4187 --76.4469 --76.4422 --76.4375 --76.45 --76.4516 --76.4375 --76.4344 --76.4453 --76.4359 --76.4391 --76.4328 --76.4328 --76.4266 --76.4391 --76.4281 --76.4266 --76.4297 --76.4375 --76.425 --76.4422 --76.4313 --76.4313 --76.4469 --76.4281 --76.4297 --76.4391 --76.4234 --76.4266 --76.4344 --76.4328 --76.4328 --76.4203 --76.4281 --76.4422 --76.4422 --76.4359 --76.425 --76.4203 --76.4172 --76.4281 --76.4328 --76.4281 --76.4375 --76.4203 --76.4328 --76.4234 --76.4234 --76.425 --76.4313 --76.4203 --76.4297 --76.4172 --76.4281 --76.4297 --76.4391 --76.4203 --76.4187 --76.4359 --76.4219 --76.4344 --76.4297 --76.4234 --76.4187 --76.4281 --76.4203 --76.4344 --76.425 --76.4172 --76.4156 --76.4172 --76.4094 --76.4203 --76.4234 --76.4156 --76.4266 --76.4172 --76.4266 --76.4187 --76.4219 --76.4281 --76.4281 --76.4172 --76.4281 --76.4234 --76.4219 --76.4281 --76.4344 --76.4359 --76.4187 --76.4437 --76.4172 --76.4297 --76.4297 --76.4266 --76.4328 --76.4266 --76.4375 --76.4375 --76.4266 --76.4391 --76.4391 --76.4281 --76.4437 --76.4203 --76.4359 --76.4344 --76.4313 --76.4281 --76.4375 --76.4297 --76.4437 --76.4187 --76.4266 --76.4313 --76.4219 --76.4156 --76.4172 --76.425 --76.4281 --76.4234 --76.4203 --76.4313 --76.4313 --76.4281 --76.4031 --76.4234 --76.4156 --76.4313 --76.4234 --76.4187 --76.4344 --76.4141 --76.4141 --76.4125 --76.4266 --76.425 --76.4328 --76.4375 --76.4203 --76.4172 --76.4141 --76.4219 --76.425 --76.4203 --76.4406 --76.4109 --76.425 --76.4281 --76.4156 --76.4297 --76.4141 --76.4125 --76.4156 --76.4141 --76.4172 --76.4156 --76.425 --76.4047 --76.4187 --76.4109 --76.4219 --76.4078 --76.4156 --76.4078 --76.4016 --76.4125 --76.4187 --76.4109 --76.4109 --76.4172 --76.4141 --76.425 --76.425 --76.4203 --76.4234 --76.4297 --76.4187 --76.425 --76.4187 --76.4156 --76.4297 --76.4203 --76.4141 --76.4125 --76.4203 --76.4187 --76.4078 --76.4359 --76.4094 --76.4141 --76.4266 --76.4187 --76.4203 --76.4219 --76.4141 --76.4172 --76.4047 --76.4062 --76.4125 --76.4234 --76.4172 --76.4125 --76.4141 --76.4172 --76.4219 --76.4219 --76.4219 --76.4187 --76.4156 --76.4266 --76.4203 --76.4141 --76.4156 --76.4203 --76.4172 --76.4094 --76.4156 --76.4141 --76.4156 --76.4203 --76.3969 --76.4109 --76.4094 --76.3953 --76.4125 --76.4078 --76.3984 --76.4062 --76.4062 --76.4062 --76.3984 --76.4062 --76.4 --76.4047 --76.4078 --76.4125 --76.4094 --76.4016 --76.4125 --76.3844 --76.4031 --76.4125 --76.4031 --76.4062 --76.4016 --76.4062 --76.3875 --76.4 --76.4047 --76.4187 --76.3906 --76.4125 --76.4047 --76.3953 --76.4062 --76.4078 --76.3984 --76.4141 --76.4109 --76.4031 --76.4172 --76.4172 --76.4094 --76.4062 --76.4 --76.3938 --76.4078 --76.4062 --76.4094 --76.4 --76.3969 --76.3984 --76.4031 --76.4234 --76.4016 --76.4078 --76.4 --76.4016 --76.4016 --76.4078 --76.4141 --76.4094 --76.4 --76.4031 --76.4031 --76.4062 --76.3922 --76.4062 --76.4094 --76.3938 --76.4016 --76.4109 --76.4016 --76.3984 --76.4125 --76.4141 --76.4156 --76.4187 --76.4219 --76.4141 --76.4141 --76.4094 --76.4047 --76.4094 --76.4109 --76.4 --76.3969 --76.3953 --76.3906 --76.4047 --76.4016 --76.4109 --76.4078 --76.3922 --76.4109 --76.4047 --76.4 --76.4047 --76.4109 --76.4047 --76.3875 --76.4109 --76.3953 --76.3984 --76.4047 --76.3938 --76.3938 --76.4 --76.4031 --76.3953 --76.3797 --76.3953 --76.4016 --76.3984 --76.3938 --76.3922 --76.3859 --76.4094 --76.3922 --76.3828 --76.3859 --76.3891 --76.3906 --76.3891 --76.3859 --76.4 --76.3797 --76.3984 --76.4016 --76.4047 --76.3938 --76.3984 --76.3938 --76.3969 --76.3859 --76.3984 --76.3859 --76.4 --76.3891 --76.3969 --76.3922 --76.3969 --76.3984 --76.3859 --76.3953 --76.4047 --76.3891 --76.3922 --76.3891 --76.3938 --76.3922 --76.3969 --76.3875 --76.3953 --76.4078 --76.4016 --76.4062 --76.4 --76.3922 --76.3953 --76.3891 --76.3922 --76.3906 --76.3938 --76.3891 --76.3875 --76.3906 --76.4047 --76.3859 --76.3984 --76.3969 --76.3766 --76.3984 --76.3891 --76.4016 --76.4109 --76.3906 --76.3969 --76.3938 --76.3953 --76.3859 --76.4 --76.3938 --76.3922 --76.3906 --76.3984 --76.4062 --76.3969 --76.3922 --76.3875 --76.3906 --76.3875 --76.3844 --76.3938 --76.3938 --76.4047 --76.4 --76.3844 --76.3766 --76.3906 --76.3984 --76.3891 --76.3969 --76.3984 --76.3953 --76.3812 --76.3969 --76.4016 --76.3891 --76.4 --76.3984 --76.3969 --76.3906 --76.4047 --76.4 --76.4 --76.3969 --76.4 --76.3875 --76.4031 --76.4016 --76.4031 --76.3953 --76.3891 --76.3984 --76.3984 --76.4031 --76.4125 --76.4 --76.3953 --76.3984 --76.4031 --76.3938 --76.3922 --76.4109 --76.4094 --76.4156 --76.3906 --76.3953 --76.3891 --76.3984 --76.3875 --76.3953 --76.3922 --76.4094 --76.3984 --76.4141 --76.4062 --76.3953 --76.4 --76.4109 --76.3875 --76.3969 --76.3922 --76.4031 --76.3969 --76.3812 --76.3906 --76.3953 --76.3953 --76.3953 --76.4094 --76.4031 --76.4047 --76.4062 --76.3984 --76.3953 --76.3984 --76.3969 --76.4 --76.3984 --76.4 --76.4125 --76.4078 --76.3891 --76.3875 --76.4031 --76.4062 --76.3828 --76.3938 --76.3953 --76.3984 --76.4 --76.4109 --76.3984 --76.3938 --76.3844 --76.3922 --76.3922 --76.3828 --76.3797 --76.3844 --76.3844 --76.3766 --76.3906 --76.3938 --76.3906 --76.3969 --76.4062 --76.375 --76.3906 --76.3922 --76.3891 --76.3953 --76.3844 --76.3859 --76.3891 --76.375 --76.3875 --76.4 --76.3891 --76.4 --76.3953 --76.3891 --76.3875 --76.4031 --76.3844 --76.3938 --76.3922 --76.3891 --76.3953 --76.4 --76.3906 --76.3891 --76.3984 --76.3859 --76.3828 --76.3812 --76.3984 --76.3984 --76.3906 --76.3953 --76.3891 --76.3984 --76.3984 --76.3969 --76.3953 --76.3891 --76.3938 --76.3969 --76.4047 --76.3906 --76.3828 --76.4 --76.3953 --76.4047 --76.3969 --76.3953 --76.4 --76.3844 --76.4 --76.3922 --76.3859 --76.3844 --76.3859 --76.3859 --76.3922 --76.3844 --76.3938 --76.3875 --76.3922 --76.3734 --76.3812 --76.3859 --76.3797 --76.3906 --76.3969 --76.3734 --76.3828 --76.4031 --76.375 --76.375 --76.3641 --76.3844 --76.3828 --76.3859 --76.3938 --76.3812 --76.375 --76.3719 --76.3812 --76.3781 --76.3703 --76.3938 --76.3734 --76.3703 --76.3812 --76.3828 --76.3797 --76.3797 --76.3828 --76.3828 --76.375 --76.3781 --76.3781 --76.3875 --76.3594 --76.3781 --76.3781 --76.3578 --76.3578 --76.3766 --76.3656 --76.3875 --76.3766 --76.3859 --76.375 --76.3766 --76.3594 --76.3766 --76.375 --76.3781 --76.3672 --76.3797 --76.3766 --76.3688 --76.3641 --76.3906 --76.3766 --76.3719 --76.3812 --76.3688 --76.3859 --76.3906 --76.3906 --76.3844 --76.3828 --76.3844 --76.3766 --76.3781 --76.3781 --76.3812 --76.3844 --76.3828 --76.3766 --76.3938 --76.3828 --76.3875 --76.3938 --76.3922 --76.3828 --76.3828 --76.3797 --76.3891 --76.3953 --76.3875 --76.3734 --76.3906 --76.3766 --76.3812 --76.3859 --76.3859 --76.3797 --76.3719 --76.3844 --76.375 --76.3781 --76.3891 --76.3703 --76.3734 --76.375 --76.3875 --76.3797 --76.3781 --76.3688 --76.3781 --76.375 --76.3875 --76.3703 --76.3812 --76.3828 --76.3766 --76.3734 --76.3781 --76.3812 --76.3797 --76.3812 --76.3875 --76.3703 --76.3719 --76.375 --76.3828 --76.3719 --76.3656 --76.3484 --76.3516 --76.3625 --76.3891 --76.375 --76.3766 --76.3766 --76.3906 --76.3625 --76.3734 --76.375 --76.3766 --76.3812 --76.3797 --76.3812 --76.3812 --76.3703 --76.3781 --76.375 --76.3844 --76.3688 --76.3766 --76.3766 --76.3719 --76.3734 --76.375 --76.3719 --76.3656 --76.3781 --76.3719 --76.3688 --76.3719 --76.3797 --76.3781 --76.375 --76.375 --76.3719 --76.3688 --76.375 --76.3781 --76.3656 --76.3656 --76.3766 --76.3641 --76.3688 --76.3828 --76.3625 --76.3703 --76.3641 --76.3797 --76.3703 --76.3719 --76.3578 --76.3719 --76.3656 --76.3609 --76.3656 --76.3703 --76.3641 --76.3734 --76.3625 --76.375 --76.3641 --76.3703 --76.3656 --76.3688 --76.3703 --76.3625 --76.3625 --76.3703 --76.3703 --76.3703 --76.3719 --76.3641 --76.3609 --76.3672 --76.3688 --76.3672 --76.3625 --76.375 --76.3688 --76.3766 --76.3672 --76.3641 --76.3688 --76.3781 --76.3828 --76.3547 --76.3625 --76.3672 --76.3672 --76.3609 --76.375 --76.3469 --76.3719 --76.3656 --76.3609 --76.3672 --76.3719 --76.3641 --76.3656 --76.3641 --76.3484 --76.3594 --76.3594 --76.3672 --76.3594 --76.3516 --76.3656 --76.3578 --76.3656 --76.3641 --76.3734 --76.3672 --76.3641 --76.3625 --76.3703 --76.3625 --76.3625 --76.3594 --76.3625 --76.3688 --76.3703 --76.3688 --76.3594 --76.3641 --76.3688 --76.3531 --76.3672 --76.3469 --76.3594 --76.3516 --76.3656 --76.3578 --76.3766 --76.3672 --76.3578 --76.3656 --76.3578 --76.3641 --76.3594 --76.3594 --76.3688 --76.3672 --76.3547 --76.3547 --76.3719 --76.3641 --76.3703 --76.3641 --76.3641 --76.35 --76.3609 --76.3672 --76.3656 --76.3641 --76.3672 --76.3609 --76.3703 --76.3688 --76.3531 --76.3656 --76.3609 --76.3531 --76.3609 --76.3547 --76.3703 --76.3625 --76.3797 --76.3719 --76.3562 --76.3578 --76.3688 --76.3547 --76.3719 --76.3688 --76.3734 --76.3703 --76.3812 --76.3656 --76.3656 --76.3656 --76.375 --76.3641 --76.3562 --76.3547 --76.3578 --76.3688 --76.35 --76.3562 --76.3578 --76.3688 --76.3609 --76.3578 --76.3625 --76.3453 --76.3578 --76.3531 --76.3469 --76.3516 --76.3594 --76.3672 --76.35 --76.3594 --76.3641 --76.3453 --76.3562 --76.3594 --76.3578 --76.3625 --76.3594 --76.3594 --76.3547 --76.3641 --76.3688 --76.3594 --76.3688 --76.3578 --76.3656 --76.3625 --76.3594 --76.3484 --76.3562 --76.3641 --76.3531 --76.3594 --76.3734 --76.3578 --76.3688 --76.3578 --76.3609 --76.3672 --76.3484 --76.3609 --76.3625 --76.3641 --76.35 --76.3625 --76.3625 --76.3625 --76.35 --76.3703 --76.3656 --76.3594 --76.3594 --76.3688 --76.3625 --76.3516 --76.3641 --76.3719 --76.35 --76.3625 --76.3609 --76.3766 --76.3656 --76.3641 --76.3609 --76.3656 --76.3562 --76.3562 --76.3656 --76.3641 --76.3625 --76.3719 --76.3641 --76.3766 --76.3688 --76.3656 --76.3625 --76.3547 --76.3391 --76.3625 --76.3547 --76.3641 --76.3578 --76.35 --76.3422 --76.3547 --76.35 --76.3438 --76.3672 --76.3625 --76.3656 --76.3688 --76.3547 --76.3531 --76.3484 --76.3562 --76.3578 --76.3562 --76.3531 --76.3484 --76.3625 --76.35 --76.3531 --76.3641 --76.3438 --76.3453 --76.3422 --76.3484 --76.3531 --76.3438 --76.3484 --76.35 --76.3672 --76.3562 --76.3578 --76.3562 --76.3562 --76.3641 --76.3516 --76.3547 --76.3625 --76.3469 --76.3531 --76.3625 --76.35 --76.3641 --76.3531 --76.3688 --76.3531 --76.3703 --76.3688 --76.3672 --76.3828 --76.3469 --76.3578 --76.3672 --76.3609 --76.3547 --76.3594 --76.3531 --76.35 --76.3516 --76.3422 --76.3594 --76.3531 --76.3547 --76.3484 --76.3406 --76.3422 --76.3578 --76.3469 --76.3516 --76.3453 --76.3453 --76.3594 --76.3422 --76.3375 --76.3391 --76.3453 --76.3453 --76.35 --76.3438 --76.3406 --76.3484 --76.3469 --76.3359 --76.3422 --76.3516 --76.3562 --76.3547 --76.3391 --76.3516 --76.3453 --76.3453 --76.3594 --76.3594 --76.3578 --76.3344 --76.3562 --76.3531 --76.3547 --76.3594 --76.35 --76.3547 --76.3438 --76.3562 --76.35 --76.3406 --76.3375 --76.3594 --76.3484 --76.3531 --76.3406 --76.35 --76.3453 --76.3578 --76.3438 --76.3422 --76.3453 --76.3375 --76.3422 --76.3422 --76.3422 --76.3516 --76.35 --76.3422 --76.3516 --76.3422 --76.3297 --76.3375 --76.3453 --76.3453 --76.3422 --76.3453 --76.3484 --76.3422 --76.3484 --76.35 --76.3469 --76.3469 --76.35 --76.3438 --76.35 --76.3531 --76.3531 --76.3469 --76.3516 --76.3469 --76.3562 --76.3438 --76.3484 --76.3531 --76.3578 --76.3516 --76.3562 --76.3328 --76.3453 --76.3594 --76.3562 --76.3469 --76.35 --76.3484 --76.3531 --76.35 --76.3484 --76.3453 --76.3469 --76.3578 --76.3438 --76.3359 --76.3375 --76.3438 --76.3562 --76.3625 --76.3438 --76.3391 --76.3375 --76.35 --76.3438 --76.3531 --76.3391 --76.3375 --76.3266 --76.35 --76.3406 --76.35 --76.3328 --76.3344 --76.3375 --76.3359 --76.3391 --76.3344 --76.3453 --76.3422 --76.3406 --76.35 --76.3359 --76.3344 --76.3391 --76.3422 --76.3391 --76.35 --76.35 --76.3422 --76.3297 --76.3266 --76.3391 --76.3453 --76.3484 --76.3406 --76.3406 --76.325 --76.3484 --76.3375 --76.3344 --76.3391 --76.3484 --76.3297 --76.3328 --76.3391 --76.3391 --76.3391 --76.3469 --76.3375 --76.3297 --76.3313 --76.3359 --76.3187 --76.3313 --76.3406 --76.3297 --76.3141 --76.3234 --76.3406 --76.3219 --76.3313 --76.3344 --76.3328 --76.3219 --76.3281 --76.3281 --76.3203 --76.3297 --76.3281 --76.3281 --76.3266 --76.3219 --76.3313 --76.3203 --76.3156 --76.3219 --76.3094 --76.3281 --76.325 --76.3203 --76.3344 --76.3328 --76.325 --76.3281 --76.3297 --76.3281 --76.3297 --76.3219 --76.3172 --76.3172 --76.3203 --76.3125 --76.3203 --76.3156 --76.3219 --76.3313 --76.3187 --76.3172 --76.3187 --76.3203 --76.3328 --76.3438 --76.3234 --76.3297 --76.3266 --76.3156 --76.3219 --76.3172 --76.3297 --76.3219 --76.3125 --76.3313 --76.3172 --76.3187 --76.325 --76.3125 --76.3203 --76.3125 --76.3281 --76.3469 --76.3328 --76.325 --76.3219 --76.3219 --76.3141 --76.3359 --76.3203 --76.3203 --76.3203 --76.3219 --76.3234 --76.325 --76.3344 --76.3281 --76.3344 --76.3328 --76.3344 --76.3328 --76.3203 --76.3313 --76.3422 --76.3297 --76.3391 --76.3438 --76.3406 --76.3469 --76.3375 --76.3344 --76.3328 --76.3344 --76.3453 --76.3266 --76.3328 --76.3234 --76.3469 --76.3469 --76.3438 --76.3344 --76.3344 --76.3359 --76.3344 --76.3281 --76.3297 --76.3203 --76.3344 --76.325 --76.3281 --76.3391 --76.3438 --76.3234 --76.3313 --76.3297 --76.3344 --76.3375 --76.3281 --76.325 --76.3203 --76.3328 --76.3359 --76.3328 --76.3406 --76.325 --76.3297 --76.3344 --76.3297 --76.3359 --76.3281 --76.3422 --76.325 --76.3328 --76.3391 --76.3531 --76.3359 --76.3297 --76.3344 --76.3391 --76.3391 --76.3234 --76.3219 --76.3297 --76.3219 --76.3297 --76.3219 --76.3281 --76.3281 --76.3078 --76.3203 --76.3344 --76.3266 --76.3078 --76.3203 --76.3203 --76.3172 --76.3187 --76.3094 --76.3078 --76.3219 --76.3203 --76.3109 --76.3266 --76.3266 --76.3297 --76.3219 --76.3141 --76.3281 --76.3234 --76.3094 --76.325 --76.3172 --76.3281 --76.325 --76.3344 --76.3344 --76.3344 --76.3266 --76.3297 --76.3297 --76.3234 --76.3156 --76.3172 --76.3187 --76.3187 --76.325 --76.325 --76.3422 --76.3109 --76.3187 --76.3125 --76.3141 --76.3078 --76.3141 --76.3219 --76.3172 --76.3063 --76.3219 --76.3094 --76.3141 --76.3187 --76.3172 --76.3125 --76.3203 --76.3187 --76.3297 --76.3156 --76.325 --76.3266 --76.3172 --76.3031 --76.3281 --76.3266 --76.3234 --76.3078 --76.3094 --76.3172 --76.3094 --76.3078 --76.3187 --76.3281 --76.3109 --76.3 --76.3172 --76.3063 --76.3125 --76.3266 --76.3156 --76.3094 --76.3109 --76.3187 --76.3047 --76.3187 --76.3109 --76.3063 --76.3047 --76.3078 --76.3156 --76.3031 --76.3125 --76.3141 --76.3047 --76.3 --76.3172 --76.3094 --76.3078 --76.3156 --76.3125 --76.3172 --76.3172 --76.3078 --76.3141 --76.3141 --76.3141 --76.3172 --76.3031 --76.3187 --76.325 --76.3063 --76.3063 --76.3 --76.3047 --76.3281 --76.3078 --76.3016 --76.3203 --76.3078 --76.3031 --76.3016 --76.3031 --76.3141 --76.3016 --76.3063 --76.3 --76.3125 --76.2953 --76.2984 --76.3047 --76.3 --76.2969 --76.3156 --76.2953 --76.3141 --76.3063 --76.3031 --76.3187 --76.3094 --76.2969 --76.2969 --76.3094 --76.3047 --76.3 --76.3172 --76.2984 --76.3 --76.3016 --76.3047 --76.3 --76.3047 --76.3016 --76.2953 --76.3 --76.3047 --76.3109 --76.3047 --76.3125 --76.3172 --76.3172 --76.2984 --76.3 --76.3109 --76.3094 --76.3156 --76.2953 --76.2953 --76.2906 --76.3031 --76.2953 --76.2984 --76.2922 --76.3141 --76.3 --76.3047 --76.2984 --76.2891 --76.2969 --76.3078 --76.3125 --76.3047 --76.2859 --76.3141 --76.2953 --76.3078 --76.3172 --76.3094 --76.3156 --76.2984 --76.3078 --76.3109 --76.3 --76.3047 --76.2937 --76.2969 --76.3 --76.3078 --76.3109 --76.3016 --76.3 --76.3016 --76.2969 --76.2859 --76.2969 --76.2937 --76.2922 --76.2969 --76.2969 --76.2984 --76.3016 --76.3172 --76.2969 --76.3016 --76.3047 --76.2766 --76.2859 --76.3016 --76.2891 --76.3 --76.2828 --76.2844 --76.2937 --76.2922 --76.2937 --76.2906 --76.2969 --76.2922 --76.2891 --76.2859 --76.3063 --76.2891 --76.275 --76.2953 --76.3031 --76.2859 --76.2969 --76.2891 --76.2969 --76.2969 --76.2937 --76.2906 --76.3 --76.3 --76.3 --76.2859 --76.2875 --76.2937 --76.2969 --76.2828 --76.2953 --76.2844 --76.2891 --76.2984 --76.2937 --76.3109 --76.2953 --76.2984 --76.2937 --76.3031 --76.2922 --76.3063 --76.3016 --76.3016 --76.2969 --76.3109 --76.2953 --76.3016 --76.2969 --76.3 --76.2797 --76.3047 --76.3078 --76.2953 --76.2953 --76.2969 --76.3078 --76.3109 --76.2984 --76.3125 --76.2984 --76.3047 --76.2875 --76.2984 --76.3031 --76.2891 --76.2984 --76.2922 --76.2906 --76.2906 --76.2812 --76.2953 --76.3031 --76.2984 --76.2906 --76.2937 --76.2953 --76.2969 --76.2781 --76.2875 --76.2875 --76.2937 --76.2953 --76.2797 --76.2828 --76.2875 --76.2859 --76.2859 --76.2828 --76.2875 --76.2766 --76.2953 --76.2875 --76.2922 --76.2891 --76.2812 --76.2766 --76.2859 --76.2953 --76.2766 --76.2937 --76.2891 --76.2828 --76.3 --76.2906 --76.2937 --76.2656 --76.2969 --76.2969 --76.2844 --76.3063 --76.2844 --76.2812 --76.2797 --76.2812 --76.2906 --76.2688 --76.2766 --76.2844 --76.2844 --76.2906 --76.2797 --76.2797 --76.2656 --76.2766 --76.2828 --76.2859 --76.2875 --76.2734 --76.2688 --76.2812 --76.2641 --76.2719 --76.2672 --76.2766 --76.2797 --76.2766 --76.2922 --76.275 --76.2906 --76.2797 --76.2797 --76.2625 --76.2875 --76.2891 --76.2953 --76.2891 --76.2859 --76.2797 --76.2953 --76.2922 --76.2797 --76.2953 --76.275 --76.2969 --76.2844 --76.2812 --76.2906 --76.2891 --76.2844 --76.2875 --76.2937 --76.2859 --76.2781 --76.2984 --76.2984 --76.2797 --76.2781 --76.2828 --76.275 --76.2891 --76.2703 --76.2734 --76.2859 --76.3 --76.2937 --76.3 --76.3016 --76.2844 --76.2812 --76.2984 --76.2953 --76.275 --76.2953 --76.2859 --76.2781 --76.2781 --76.2906 --76.2812 --76.2781 --76.2859 --76.2828 --76.2797 --76.2672 --76.2859 --76.2672 --76.275 --76.2766 --76.2891 --76.2906 --76.2812 --76.2891 --76.2812 --76.2844 --76.275 --76.2734 --76.2703 --76.2875 --76.2781 --76.2797 --76.2859 --76.2844 --76.2766 --76.2859 --76.2891 --76.2875 --76.2875 --76.2766 --76.2875 --76.2891 --76.2812 --76.2688 --76.2891 --76.2906 --76.2937 --76.2797 --76.2703 --76.2734 --76.2844 --76.2781 --76.275 --76.2625 --76.2703 --76.2844 --76.2656 --76.2828 --76.2859 --76.2891 --76.2734 --76.2891 --76.2844 --76.275 --76.2656 --76.2781 --76.2844 --76.2812 --76.2734 --76.2719 --76.2781 --76.2578 --76.2625 --76.2625 --76.2703 --76.2609 --76.2688 --76.2734 --76.2625 --76.2641 --76.2766 --76.2859 --76.2594 --76.2547 --76.2641 --76.2703 --76.2641 --76.2828 --76.2719 --76.2625 --76.2672 --76.275 --76.2703 --76.2719 --76.2688 --76.2703 --76.2609 --76.2656 --76.2719 --76.2703 --76.275 --76.2672 --76.2688 --76.2672 --76.2688 --76.2625 --76.2734 --76.275 --76.2656 --76.2734 --76.2688 --76.2609 --76.2688 --76.2719 --76.2734 --76.2719 --76.2625 --76.2688 --76.2719 --76.2656 --76.2672 --76.2672 --76.275 --76.2562 --76.275 --76.2656 --76.2672 --76.2641 --76.2703 --76.2734 --76.275 --76.2641 --76.275 --76.2547 --76.2703 --76.2578 --76.2516 --76.2641 --76.2672 --76.2656 --76.2688 --76.2641 --76.2594 --76.2672 --76.275 --76.2516 --76.2609 --76.2672 --76.2703 --76.2656 --76.2594 --76.2547 --76.2594 --76.2562 --76.2688 --76.2594 --76.2719 --76.2641 --76.2719 --76.2781 --76.2562 --76.2594 --76.2625 --76.2688 --76.2641 --76.2812 --76.2781 --76.2781 --76.2781 --76.2766 --76.2734 --76.2656 --76.2672 --76.2703 --76.2828 --76.2719 --76.2766 --76.275 --76.2719 --76.2656 --76.2703 --76.2766 --76.275 --76.2828 --76.2766 --76.2875 --76.275 --76.2828 --76.2719 --76.2578 --76.2781 --76.2766 --76.2781 --76.2688 --76.2672 --76.2594 --76.2734 --76.2672 --76.2719 --76.2781 --76.2641 --76.275 --76.2688 --76.2672 --76.2766 --76.2844 --76.2875 --76.2766 --76.2719 --76.2734 --76.2641 --76.2672 --76.2641 --76.2875 --76.2875 --76.2828 --76.2719 --76.2812 --76.275 --76.2844 --76.2797 --76.2766 --76.2719 --76.2922 --76.2828 --76.2672 --76.2844 --76.2766 --76.2797 --76.2766 --76.2781 --76.2797 --76.2672 --76.2688 --76.2609 --76.2625 --76.2781 --76.2609 --76.2734 --76.2656 --76.2703 --76.2656 --76.2641 --76.2703 --76.2641 --76.2688 --76.2578 --76.2547 --76.2656 --76.2688 --76.2625 --76.2625 --76.2594 --76.2641 --76.2688 --76.2641 --76.2578 --76.2594 --76.2641 --76.2656 --76.2672 --76.2641 --76.2578 --76.2641 --76.2672 --76.2812 --76.2641 --76.2516 --76.2703 --76.25 --76.275 --76.2641 --76.2609 --76.2641 --76.2641 --76.2719 --76.2672 --76.2562 --76.2594 --76.2688 --76.2672 --76.2641 --76.2625 --76.275 --76.2688 --76.2484 --76.2688 --76.2609 --76.2656 --76.2719 --76.2719 --76.2641 --76.2703 --76.2656 --76.2641 --76.2625 --76.2703 --76.2719 --76.2703 --76.2703 --76.2609 --76.275 --76.2625 --76.2703 --76.2641 --76.2719 --76.2703 --76.2656 --76.2625 --76.2719 --76.2734 --76.2703 --76.275 --76.2703 --76.2688 --76.2781 --76.2781 --76.2641 --76.2703 --76.2812 --76.2781 --76.2688 --76.2688 --76.275 --76.2734 --76.275 --76.2812 --76.2781 --76.2844 --76.2625 --76.2734 --76.2719 --76.2656 --76.2641 --76.2797 --76.2812 --76.2719 --76.2672 --76.2797 --76.2812 --76.2828 --76.2781 --76.2672 --76.2656 --76.2734 --76.2641 --76.2703 --76.2703 --76.2734 --76.2578 --76.2734 --76.2484 --76.2703 --76.2688 --76.2703 --76.2734 --76.2719 --76.2688 --76.2656 --76.2703 --76.2562 --76.2703 --76.2828 --76.2609 --76.2531 --76.2609 --76.2703 --76.2719 --76.2766 --76.2484 --76.2594 --76.275 --76.2766 --76.2688 --76.2438 --76.2594 --76.2734 --76.2641 --76.2641 --76.2594 --76.2641 --76.2641 --76.2656 --76.2734 --76.2609 --76.2672 --76.2688 --76.2734 --76.2625 --76.2734 --76.2656 --76.2656 --76.2734 --76.2719 --76.2734 --76.2703 --76.2797 --76.2734 --76.2609 --76.2594 --76.2703 --76.2656 --76.2578 --76.2703 --76.2734 --76.2562 --76.2781 --76.2594 --76.2688 --76.2656 --76.2609 --76.2594 --76.2703 --76.2766 --76.2562 --76.2719 --76.2547 --76.2547 --76.2578 --76.2688 --76.2641 --76.2578 --76.2641 --76.2672 --76.2688 --76.2547 --76.2578 --76.2328 --76.2422 --76.2594 --76.2594 --76.2547 --76.25 --76.2641 --76.2625 --76.2719 --76.2719 --76.2594 --76.2641 --76.2562 --76.2625 --76.2641 --76.2547 --76.2609 --76.2562 --76.2547 --76.2562 --76.2531 --76.2469 --76.2688 --76.2516 --76.2578 --76.2625 --76.2516 --76.2625 --76.2531 --76.2578 --76.2641 --76.2688 --76.2672 --76.2625 --76.2719 --76.2672 --76.2688 --76.25 --76.2562 --76.2688 --76.2641 --76.2625 --76.2734 --76.2594 --76.2688 --76.2531 --76.2562 --76.2656 --76.2688 --76.2531 --76.2656 --76.2562 --76.2672 --76.2766 --76.2531 --76.2562 --76.2562 --76.2672 --76.2562 --76.2766 --76.2688 --76.2516 --76.275 --76.2594 --76.2578 --76.2516 --76.2641 --76.2625 --76.2453 --76.2609 --76.2578 --76.2562 --76.2531 --76.2609 --76.2531 --76.25 --76.2531 --76.2531 --76.2547 --76.2688 --76.2516 --76.2578 --76.2578 --76.2594 --76.2594 --76.2344 --76.25 --76.2625 --76.2453 --76.2469 --76.2734 --76.2531 --76.2547 --76.2531 --76.2531 --76.2641 --76.2578 --76.25 --76.2547 --76.2641 --76.2609 --76.2484 --76.2641 --76.25 --76.2406 --76.2516 --76.2312 --76.2438 --76.2484 --76.2516 --76.2547 --76.2594 --76.2531 --76.2609 --76.2531 --76.2578 --76.2453 --76.2547 --76.2484 --76.2578 --76.2406 --76.2469 --76.25 --76.2469 --76.2422 --76.2531 --76.2625 --76.2422 --76.2516 --76.2359 --76.2547 --76.25 --76.2594 --76.2547 --76.2547 --76.2578 --76.2516 --76.25 --76.2531 --76.2516 --76.2438 --76.2578 --76.2453 --76.2438 --76.2531 --76.2562 --76.2438 --76.2484 --76.2422 --76.2609 --76.2422 --76.25 --76.2469 --76.2391 --76.2516 --76.2609 --76.2469 --76.2391 --76.2609 --76.2297 --76.2453 --76.25 --76.2438 --76.2516 --76.2672 --76.2625 --76.2469 --76.2469 --76.2484 --76.25 --76.2656 --76.2547 --76.2516 --76.2562 --76.2594 --76.2484 --76.2484 --76.2422 --76.2562 --76.2531 --76.2422 --76.2594 --76.2594 --76.2406 --76.2484 --76.2641 --76.2453 --76.2344 --76.2594 --76.25 --76.2469 --76.2438 --76.2516 --76.2375 --76.2594 --76.2438 --76.2438 --76.2625 --76.2562 --76.25 --76.2547 --76.2562 --76.2359 --76.25 --76.2422 --76.2453 --76.2344 --76.2375 --76.2375 --76.2453 --76.2422 --76.2344 --76.2375 --76.2375 --76.2344 --76.2469 --76.2312 --76.2391 --76.2375 --76.2281 --76.2344 --76.2359 --76.2406 --76.2375 --76.2359 --76.2469 --76.2375 --76.2422 --76.2422 --76.2531 --76.2391 --76.2328 --76.2375 --76.2422 --76.2375 --76.2438 --76.2297 --76.2438 --76.2406 --76.2391 --76.2375 --76.2469 --76.2359 --76.2219 --76.2422 --76.2422 --76.2422 --76.2312 --76.2172 --76.2453 --76.2406 --76.25 --76.2422 --76.2359 --76.2391 --76.2359 --76.2438 --76.2281 --76.225 --76.2344 --76.2375 --76.2344 --76.2281 --76.2344 --76.2484 --76.25 --76.2375 --76.2406 --76.2344 --76.2312 --76.2406 --76.225 --76.2375 --76.2328 --76.2203 --76.2422 --76.2328 --76.2172 --76.2391 --76.2391 --76.2281 --76.2328 --76.2281 --76.2312 --76.2406 --76.2422 --76.2422 --76.2484 --76.2281 --76.2562 --76.2438 --76.2328 --76.2531 --76.2375 --76.2203 --76.2516 --76.2406 --76.2391 --76.2297 --76.2391 --76.2438 --76.2484 --76.2375 --76.2453 --76.2375 --76.2344 --76.2359 --76.2438 --76.2328 --76.2422 --76.2438 --76.2438 --76.2391 --76.2469 --76.2547 --76.2453 --76.2375 --76.2359 --76.2438 --76.2328 --76.2453 --76.2391 --76.2422 --76.2406 --76.2375 --76.2359 --76.2531 --76.2469 --76.2484 --76.2609 --76.2469 --76.2469 --76.2484 --76.2438 --76.2484 --76.2609 --76.2234 --76.2375 --76.2266 --76.2438 --76.2438 --76.2562 --76.2406 --76.2344 --76.2453 --76.2406 --76.2422 --76.2469 --76.2391 --76.2562 --76.2438 --76.2391 --76.2359 --76.2438 --76.2375 --76.2453 --76.2344 --76.2359 --76.2344 --76.2406 --76.2281 --76.2125 --76.25 --76.2438 --76.2406 --76.2406 --76.2391 --76.2375 --76.2297 --76.2359 --76.2359 --76.2516 --76.25 --76.2359 --76.2406 --76.2438 --76.2422 --76.25 --76.2344 --76.2391 --76.2281 --76.2359 --76.2391 --76.2234 --76.2266 --76.2266 --76.2344 --76.2234 --76.2406 --76.225 --76.225 --76.2312 --76.2312 --76.2359 --76.2281 --76.2375 --76.2188 --76.2438 --76.2344 --76.2375 --76.2312 --76.2344 --76.2172 --76.2406 --76.2422 --76.2422 --76.225 --76.2359 --76.2375 --76.2344 --76.2484 --76.2234 --76.2391 --76.2297 --76.2328 --76.2375 --76.2328 --76.2469 --76.2281 --76.2484 --76.2422 --76.2344 --76.2422 --76.2312 --76.2422 --76.2391 --76.2484 --76.2391 --76.2484 --76.25 --76.2312 --76.2516 --76.2484 --76.2391 --76.2422 --76.2375 --76.2562 --76.2453 --76.2484 --76.2438 --76.2406 --76.2438 --76.2422 --76.2453 --76.2359 --76.25 --76.2391 --76.2359 --76.2359 --76.2234 --76.25 --76.2391 --76.2438 --76.2438 --76.2453 --76.2531 --76.2422 --76.2406 --76.2469 --76.2312 --76.2438 --76.2438 --76.2422 --76.2484 --76.2438 --76.2422 --76.2281 --76.2391 --76.2375 --76.2453 --76.2281 --76.2344 --76.2281 --76.2391 --76.2359 --76.2281 --76.2234 --76.2375 --76.2328 --76.2312 --76.2344 --76.2375 --76.2234 --76.2375 --76.2312 --76.2438 --76.2234 --76.2219 --76.2125 --76.225 --76.2281 --76.2312 --76.2375 --76.225 --76.2344 --76.2125 --76.2375 --76.2359 --76.225 --76.2391 --76.2391 --76.2266 --76.2359 --76.2266 --76.2406 --76.2344 --76.2219 --76.2234 --76.2391 --76.2344 --76.225 --76.2219 --76.2375 --76.225 --76.2297 --76.2297 --76.2312 --76.225 --76.2203 --76.2422 --76.2125 --76.2188 --76.2203 --76.2172 --76.225 --76.2234 --76.2219 --76.2266 --76.2312 --76.2281 --76.2281 --76.2297 --76.2234 --76.2359 --76.2188 --76.2297 --76.2344 --76.2234 --76.2125 --76.2391 --76.2203 --76.2188 --76.2172 --76.2266 --76.2219 --76.2406 --76.2266 --76.2203 --76.2391 --76.2219 --76.2328 --76.2188 --76.2359 --76.2328 --76.2266 --76.2234 --76.2281 --76.2266 --76.2188 --76.2266 --76.2234 --76.2188 --76.2219 --76.2328 --76.2422 --76.2234 --76.2312 --76.2266 --76.2234 --76.2156 --76.2359 --76.2281 --76.2297 --76.2266 --76.2203 --76.2328 --76.2141 --76.2188 --76.225 --76.2219 --76.2234 --76.2312 --76.2141 --76.2297 --76.2328 --76.2172 --76.2109 --76.225 --76.2125 --76.2156 --76.2234 --76.2094 --76.2109 --76.2297 --76.2281 --76.2125 --76.2188 --76.2172 --76.2219 --76.225 --76.2297 --76.2312 --76.2266 --76.225 --76.2297 --76.2219 --76.2328 --76.2328 --76.2266 --76.2188 --76.2219 --76.2266 --76.2219 --76.2312 --76.2328 --76.2188 --76.2281 --76.225 --76.2297 --76.2203 --76.2219 --76.225 --76.2172 --76.2266 --76.2297 --76.2312 --76.2312 --76.2156 --76.2422 --76.2375 --76.2219 --76.2234 --76.2188 --76.2297 --76.2219 --76.2312 --76.2406 --76.2344 --76.2219 --76.2266 --76.2203 --76.2406 --76.2297 --76.2156 --76.2375 --76.225 --76.2328 --76.2312 --76.2203 --76.2094 --76.2375 --76.2172 --76.2156 --76.2109 --76.2188 --76.2328 --76.2203 --76.2203 --76.2203 --76.2281 --76.2234 --76.2312 --76.2281 --76.2234 --76.2281 --76.2297 --76.2375 --76.2203 --76.2203 --76.2219 --76.2109 --76.225 --76.2188 --76.2297 --76.2141 --76.2141 --76.2203 --76.2094 --76.2078 --76.2234 --76.2063 --76.2141 --76.2109 --76.2094 --76.2125 --76.2109 --76.2203 --76.2125 --76.225 --76.2141 --76.2172 --76.225 --76.2234 --76.2156 --76.2172 --76.2172 --76.2203 --76.2031 --76.2188 --76.2219 --76.2281 --76.2281 --76.2094 --76.2172 --76.2266 --76.2141 --76.2063 --76.2281 --76.225 --76.2125 --76.2094 --76.2094 --76.2266 --76.2156 --76.2094 --76.2328 --76.2203 --76.2203 --76.2234 --76.2078 --76.2172 --76.2234 --76.2094 --76.2172 --76.2063 --76.2078 --76.2234 --76.2203 --76.2234 --76.2219 --76.2188 --76.2234 --76.2219 --76.2281 --76.2266 --76.2234 --76.2234 --76.2266 --76.225 --76.2297 --76.2156 --76.2156 --76.225 --76.2109 --76.2297 --76.2203 --76.2312 --76.2141 --76.2141 --76.2219 --76.2125 --76.2078 --76.2297 --76.2141 --76.225 --76.2234 --76.2219 --76.2156 --76.2063 --76.2094 --76.2141 --76.2219 --76.1984 --76.2016 --76.2141 --76.2172 --76.2219 --76.2094 --76.2109 --76.2203 --76.2141 --76.2219 --76.2188 --76.2156 --76.2203 --76.2203 --76.2172 --76.2109 --76.2188 --76.2234 --76.2219 --76.2063 --76.2 --76.2063 --76.2078 --76.2266 --76.2125 --76.2281 --76.2109 --76.225 --76.2172 --76.2141 --76.225 --76.2109 --76.2109 --76.2141 --76.2031 --76.2203 --76.2141 --76.2063 --76.2094 --76.2047 --76.2156 --76.1891 --76.2078 --76.2188 --76.2031 --76.2203 --76.1969 --76.2047 --76.2094 --76.2031 --76.2016 --76.1984 --76.2047 --76.2094 --76.2156 --76.2016 --76.2094 --76.2141 --76.2047 --76.2078 --76.2109 --76.2156 --76.1984 --76.2109 --76.2188 --76.2031 --76.2188 --76.2078 --76.2094 --76.2031 --76.2094 --76.2094 --76.2094 --76.225 --76.2344 --76.2063 --76.2156 --76.2156 --76.2094 --76.2078 --76.2094 --76.2203 --76.2141 --76.2094 --76.2063 --76.2125 --76.2141 --76.2344 --76.1969 --76.2125 --76.1984 --76.2078 --76.1984 --76.1953 --76.2063 --76.2141 --76.2016 --76.2063 --76.2109 --76.2063 --76.2094 --76.2031 --76.2125 --76.1875 --76.2141 --76.2141 --76.2109 --76.2016 --76.2016 --76.2141 --76.2172 --76.2094 --76.2125 --76.2031 --76.2094 --76.2109 --76.2156 --76.2094 --76.2016 --76.2125 --76.2031 --76.1984 --76.2047 --76.2141 --76.2094 --76.2109 --76.2188 --76.2 --76.2094 --76.2156 --76.2141 --76.2078 --76.2031 --76.2031 --76.2156 --76.2156 --76.2109 --76.2141 --76.2016 --76.2156 --76.2078 --76.2078 --76.2 --76.2172 --76.2156 --76.1937 --76.2031 --76.2203 --76.2141 --76.1969 --76.2047 --76.2078 --76.2203 --76.2063 --76.2031 --76.2109 --76.2047 --76.2047 --76.2188 --76.2172 --76.2094 --76.2047 --76.2016 --76.2047 --76.2156 --76.2094 --76.2141 --76.2141 --76.2188 --76.225 --76.2156 --76.2203 --76.2 --76.2281 --76.2188 --76.2266 --76.2203 --76.2016 --76.2063 --76.2109 --76.2188 --76.2141 --76.2047 --76.2047 --76.1984 --76.2156 --76.2047 --76.2094 --76.2063 --76.1922 --76.2063 --76.1922 --76.1984 --76.2172 --76.1953 --76.2 --76.1984 --76.2156 --76.2047 --76.2094 --76.2094 --76.2 --76.1922 --76.2172 --76.2094 --76.2219 --76.2125 --76.2063 --76.2031 --76.2094 --76.2078 --76.2078 --76.2188 --76.1984 --76.2078 --76.2141 --76.2047 --76.2 --76.2109 --76.2 --76.2125 --76.2031 --76.2125 --76.2094 --76.1984 --76.2063 --76.2094 --76.1969 --76.2016 --76.2188 --76.2109 --76.2078 --76.2063 --76.2156 --76.1937 --76.2047 --76.1969 --76.2109 --76.2156 --76.2016 --76.1953 --76.2047 --76.2203 --76.2141 --76.2078 --76.2047 --76.2109 --76.1984 --76.2078 --76.2188 --76.2188 --76.2328 --76.2047 --76.2203 --76.2125 --76.2047 --76.2219 --76.2234 --76.2016 --76.2141 --76.2031 --76.2109 --76.2047 --76.2031 --76.2125 --76.2172 --76.1937 --76.2125 --76.2172 --76.2172 --76.2047 --76.2031 --76.2063 --76.2109 --76.2016 --76.2047 --76.1937 --76.1969 --76.2016 --76.2063 --76.1922 --76.1969 --76.2109 --76.2109 --76.2 --76.1922 --76.2063 --76.1984 --76.2047 --76.2109 --76.2063 --76.225 --76.1922 --76.2141 --76.2141 --76.2156 --76.1953 --76.2031 --76.2125 --76.2078 --76.2016 --76.2219 --76.2156 --76.2078 --76.2078 --76.2063 --76.2094 --76.1922 --76.2016 --76.1969 --76.2063 --76.2109 --76.2141 --76.2 --76.2109 --76.1828 --76.2047 --76.2031 --76.2031 --76.2156 --76.1969 --76.2141 --76.2047 --76.2172 --76.2047 --76.2063 --76.2031 --76.2141 --76.1984 --76.2063 --76.2016 --76.1953 --76.1891 --76.1984 --76.1953 --76.1969 --76.2109 --76.2094 --76.1937 --76.2031 --76.2109 --76.2125 --76.2219 --76.2219 --76.2047 --76.2078 --76.2063 --76.2 --76.2047 --76.2031 --76.2047 --76.1969 --76.2141 --76.2063 --76.1875 --76.1906 --76.2078 --76.1781 --76.1891 --76.1922 --76.1953 --76.1859 --76.1875 --76.1906 --76.2 --76.2125 --76.1969 --76.1922 --76.2109 --76.2109 --76.1984 --76.2 --76.2063 --76.2031 --76.2 --76.2172 --76.2 --76.2078 --76.2109 --76.1969 --76.1922 --76.1937 --76.1922 --76.1906 --76.1906 --76.1984 --76.2031 --76.1891 --76.2094 --76.1859 --76.1922 --76.1922 --76.1953 --76.2016 --76.2 --76.1859 --76.2016 --76.1953 --76.1937 --76.1922 --76.1891 --76.1859 --76.1922 --76.2016 --76.2094 --76.1969 --76.2078 --76.1891 --76.2063 --76.1937 --76.2047 --76.2031 --76.1984 --76.1984 --76.1984 --76.1969 --76.2094 --76.1969 --76.1969 --76.2172 --76.1922 --76.2031 --76.2063 --76.2078 --76.1969 --76.2156 --76.2016 --76.1906 --76.2 --76.1969 --76.2 --76.1953 --76.2016 --76.1922 --76.2016 --76.1937 --76.1875 --76.1875 --76.1953 --76.1906 --76.1953 --76.1969 --76.1969 --76.1969 --76.2016 --76.1969 --76.2078 --76.1984 --76.1922 --76.1937 --76.1969 --76.2047 --76.1906 --76.1906 --76.1937 --76.2016 --76.2031 --76.1984 --76.1984 --76.1906 --76.1984 --76.1953 --76.1984 --76.1937 --76.1891 --76.1953 --76.1953 --76.2078 --76.1906 --76.2016 --76.1922 --76.2172 --76.1922 --76.1969 --76.1984 --76.2063 --76.1953 --76.1984 --76.2063 --76.2016 --76.1937 --76.1906 --76.1953 --76.1937 --76.2047 --76.1906 --76.2016 --76.2109 --76.1953 --76.1969 --76.2016 --76.2016 --76.1969 --76.1906 --76.2047 --76.1969 --76.2109 --76.2141 --76.1922 --76.2047 --76.2016 --76.2078 --76.1953 --76.2047 --76.2109 --76.1984 --76.1937 --76.2031 --76.1891 --76.2031 --76.2078 --76.2031 --76.2047 --76.2156 --76.1953 --76.2078 --76.1953 --76.2 --76.2094 --76.2016 --76.2063 --76.1953 --76.2094 --76.2047 --76.1969 --76.1953 --76.2063 --76.1984 --76.1984 --76.1906 --76.1891 --76.1922 --76.1875 --76.1937 --76.1875 --76.1844 --76.2047 --76.1922 --76.1859 --76.1906 --76.1906 --76.1766 --76.1922 --76.1844 --76.175 --76.1875 --76.2 --76.1937 --76.1844 --76.1953 --76.175 --76.2031 --76.2031 --76.1984 --76.1891 --76.2016 --76.2016 --76.1953 --76.2016 --76.1937 --76.1891 --76.1859 --76.1906 --76.1937 --76.2 --76.1922 --76.1953 --76.1891 --76.1891 --76.1766 --76.1875 --76.2 --76.1797 --76.1875 --76.1875 --76.1906 --76.1859 --76.1797 --76.1844 --76.1891 --76.2031 --76.1953 --76.1953 --76.1859 --76.2031 --76.1875 --76.1922 --76.1984 --76.1937 --76.2016 --76.1922 --76.1859 --76.1969 --76.1953 --76.1953 --76.2063 --76.2094 --76.2141 --76.2094 --76.1922 --76.1984 --76.1969 --76.2063 --76.1969 --76.1891 --76.1984 --76.1953 --76.1906 --76.1937 --76.1875 --76.1922 --76.1922 --76.1937 --76.2 --76.1797 --76.1937 --76.2 --76.1906 --76.2 --76.1875 --76.1906 --76.1984 --76.2 --76.2031 --76.1844 --76.2 --76.1828 --76.1953 --76.2094 --76.1969 --76.2078 --76.1953 --76.1984 --76.2141 --76.2047 --76.1969 --76.1937 --76.2125 --76.2 --76.2031 --76.2063 --76.2063 --76.2 --76.2 --76.1922 --76.2031 --76.1969 --76.2047 --76.2047 --76.1984 --76.1922 --76.1906 --76.1828 --76.1844 --76.2016 --76.1922 --76.2109 --76.2188 --76.1906 --76.1984 --76.1922 --76.2031 --76.1906 --76.2063 --76.2016 --76.2094 --76.2031 --76.1875 --76.2031 --76.1969 --76.1828 --76.2078 --76.1906 --76.1813 --76.1766 --76.1875 --76.2016 --76.1891 --76.1953 --76.1875 --76.2078 --76.1922 --76.1937 --76.1953 --76.1906 --76.1875 --76.1922 --76.1906 --76.1844 --76.1859 --76.1906 --76.1969 --76.1891 --76.1875 --76.1781 --76.1937 --76.2016 --76.1922 --76.1969 --76.1813 --76.2078 --76.1797 --76.1984 --76.1875 --76.1875 --76.2016 --76.1797 --76.1797 --76.1813 --76.1891 --76.1891 --76.175 --76.1922 --76.1766 --76.1734 --76.1906 --76.1844 --76.1734 --76.1844 --76.1875 --76.1984 --76.1906 --76.1922 --76.2 --76.1969 --76.1922 --76.2109 --76.1969 --76.2094 --76.2031 --76.1906 --76.2016 --76.1922 --76.1875 --76.2016 --76.1859 --76.1813 --76.1891 --76.1766 --76.1687 --76.1906 --76.1828 --76.1922 --76.2047 --76.1984 --76.2047 --76.1891 --76.1953 --76.1937 --76.1891 --76.1844 --76.1984 --76.1828 --76.1891 --76.1953 --76.2016 --76.2 --76.1984 --76.2125 --76.2109 --76.2 --76.2094 --76.2 --76.1937 --76.1984 --76.1984 --76.2078 --76.1984 --76.2047 --76.2063 --76.2047 --76.2031 --76.1906 --76.1953 --76.1891 --76.2031 --76.1922 --76.2109 --76.1891 --76.1906 --76.2 --76.2031 --76.1859 --76.1922 --76.1828 --76.2125 --76.2094 --76.1969 --76.2 --76.1969 --76.1859 --76.2 --76.2063 --76.1953 --76.2047 --76.2109 --76.2031 --76.1922 --76.2063 --76.2016 --76.2078 --76.1984 --76.1922 --76.1969 --76.1937 --76.2078 --76.1813 --76.2047 --76.1953 --76.2016 --76.1937 --76.1891 --76.1969 --76.1781 --76.1969 --76.1891 --76.1813 --76.1813 --76.2141 --76.2078 --76.1937 --76.1891 --76.2031 --76.2016 --76.1984 --76.1937 --76.1984 --76.1953 --76.1953 --76.1953 --76.2016 --76.1922 --76.1953 --76.2016 --76.1969 --76.1922 --76.1953 --76.2031 --76.2078 --76.2078 --76.2094 --76.2031 --76.2016 --76.1969 --76.1953 --76.1906 --76.1906 --76.2063 --76.1969 --76.2063 --76.2078 --76.2109 --76.2188 --76.1969 --76.2094 --76.1844 --76.1922 --76.1922 --76.1922 --76.2047 --76.2016 --76.2031 --76.1922 --76.1984 --76.1813 --76.1984 --76.1922 --76.1766 --76.1813 --76.2016 --76.1922 --76.2 --76.1906 --76.2047 --76.1969 --76.1969 --76.2047 --76.2063 --76.2016 --76.2078 --76.1984 --76.2031 --76.1875 --76.2 --76.1984 --76.1906 --76.1984 --76.1953 --76.1875 --76.1969 --76.2 --76.1969 --76.1891 --76.1969 --76.1922 --76.2063 --76.1797 --76.1891 --76.1844 --76.1922 --76.1922 --76.1891 --76.1969 --76.1797 --76.2016 --76.1937 --76.1875 --76.1969 --76.1906 --76.2 --76.1766 --76.1891 --76.1906 --76.2047 --76.1922 --76.1953 --76.1875 --76.1781 --76.1844 --76.2063 --76.1969 --76.1906 --76.2016 --76.1984 --76.2094 --76.2 --76.1984 --76.2078 --76.2063 --76.2141 --76.2047 --76.1844 --76.1906 --76.1859 --76.1969 --76.1844 --76.1937 --76.1813 --76.1937 --76.2 --76.1984 --76.1844 --76.1969 --76.1891 --76.1922 --76.1844 --76.2078 --76.1828 --76.1953 --76.1922 --76.1937 --76.1984 --76.1906 --76.1984 --76.1891 --76.2 --76.2031 --76.1984 --76.2 --76.1969 --76.1766 --76.1906 --76.1797 --76.1984 --76.1797 --76.1922 --76.1937 --76.1859 --76.1859 --76.1844 --76.1859 --76.2016 --76.1906 --76.1859 --76.1969 --76.1891 --76.1891 --76.2016 --76.2031 --76.1875 --76.2016 --76.1859 --76.1906 --76.1984 --76.2016 --76.1859 --76.1937 --76.1922 --76.2078 --76.1813 --76.1906 --76.1906 --76.2 --76.1828 --76.1906 --76.1984 --76.1875 --76.1875 --76.1906 --76.1969 --76.1922 --76.175 --76.1844 --76.1734 --76.1828 --76.1781 --76.1766 --76.1734 --76.1719 --76.1984 --76.2 --76.1969 --76.1797 --76.1891 --76.1922 --76.1875 --76.1891 --76.1875 --76.1859 --76.2031 --76.1766 --76.1875 --76.1969 --76.1766 --76.1875 --76.1953 --76.1937 --76.1875 --76.2031 --76.1937 --76.1891 --76.1922 --76.1797 --76.2 --76.1937 --76.1797 --76.1844 --76.1875 --76.1844 --76.1859 --76.1906 --76.2016 --76.1797 --76.1953 --76.1859 --76.1859 --76.1766 --76.1813 --76.1859 --76.1766 --76.1922 --76.1813 --76.2063 --76.1813 --76.1844 --76.1875 --76.2 --76.1875 --76.2016 --76.2031 --76.1797 --76.2047 --76.2047 --76.2172 --76.1969 --76.1953 --76.1937 --76.1875 --76.2063 --76.1813 --76.1875 --76.2016 --76.1797 --76.1969 --76.1844 --76.1922 --76.1766 --76.1953 --76.1781 --76.1719 --76.1969 --76.1641 --76.1797 --76.175 --76.1703 --76.1906 --76.1844 --76.1922 --76.175 --76.1969 --76.1906 --76.1937 --76.175 --76.1953 --76.1734 --76.1719 --76.1906 --76.1844 --76.1828 --76.1984 --76.1797 --76.1844 --76.1859 --76.175 --76.1891 --76.1781 --76.1875 --76.1937 --76.1875 --76.1875 --76.1875 --76.1906 --76.1937 --76.1906 --76.1875 --76.1875 --76.1984 --76.1969 --76.1953 --76.1859 --76.2078 --76.1953 --76.1797 --76.2031 --76.1875 --76.1906 --76.1922 --76.2016 --76.1875 --76.1797 --76.1984 --76.1891 --76.1859 --76.1953 --76.1906 --76.1922 --76.2 --76.1906 --76.2109 --76.1875 --76.1906 --76.1953 --76.1937 --76.1969 --76.1922 --76.1984 --76.2156 --76.1984 --76.2016 --76.2047 --76.2063 --76.2078 --76.1828 --76.2016 --76.1969 --76.1875 --76.1875 --76.1891 --76.1875 --76.2078 --76.1891 --76.2016 --76.2031 --76.1953 --76.1875 --76.2016 --76.1953 --76.1953 --76.2047 --76.2031 --76.2 --76.2031 --76.1891 --76.1922 --76.2016 --76.2031 --76.1969 --76.1937 --76.1922 --76.2 --76.1813 --76.1859 --76.1906 --76.1937 --76.1937 --76.1813 --76.1766 --76.1937 --76.2063 --76.1922 --76.1937 --76.1859 --76.1891 --76.1891 --76.2047 --76.1906 --76.1984 --76.1922 --76.2094 --76.2 --76.2031 --76.1906 --76.1984 --76.2109 --76.1969 --76.2047 --76.1969 --76.2031 --76.1906 --76.2125 --76.2 --76.1906 --76.2125 --76.2156 --76.2031 --76.2063 --76.2172 --76.1953 --76.2047 --76.2 --76.2016 --76.1984 --76.1922 --76.1937 --76.1828 --76.1875 --76.2063 --76.1922 --76.2016 --76.1922 --76.2031 --76.1953 --76.1969 --76.2078 --76.1953 --76.1922 --76.1875 --76.1891 --76.2016 --76.1813 --76.1984 --76.2031 --76.1875 --76.1891 --76.1984 --76.1922 --76.1859 --76.2031 --76.1984 --76.1906 --76.2016 --76.1922 --76.1844 --76.1937 --76.1844 --76.1859 --76.1813 --76.1875 --76.1953 --76.1937 --76.1953 --76.2016 --76.1937 --76.2125 --76.1844 --76.1922 --76.1953 --76.1859 --76.1891 --76.2 --76.2 --76.2 --76.1953 --76.1922 --76.1828 --76.1906 --76.1984 --76.1844 --76.1797 --76.1859 --76.1766 --76.1797 --76.1891 --76.1891 --76.1937 --76.1844 --76.1859 --76.1875 --76.1859 --76.1937 --76.2 --76.1953 --76.1844 --76.1875 --76.1969 --76.1953 --76.2 --76.2031 --76.1922 --76.1937 --76.1844 --76.2031 --76.1937 --76.1813 --76.1813 --76.1875 --76.1813 --76.1969 --76.1859 --76.1875 --76.1906 --76.1859 --76.1984 --76.1922 --76.1984 --76.1953 --76.1844 --76.1937 --76.1859 --76.2 --76.1766 --76.1844 --76.1797 --76.1844 --76.1844 --76.2016 --76.1969 --76.1922 --76.2031 --76.1859 --76.1937 --76.2063 --76.1906 --76.1781 --76.1937 --76.1937 --76.1984 --76.2016 --76.1906 --76.1969 --76.1844 --76.1984 --76.1859 --76.1875 --76.1875 --76.1953 --76.2078 --76.2016 --76.2 --76.1859 --76.1937 --76.1953 --76.2016 --76.1953 --76.1859 --76.1937 --76.1969 --76.1781 --76.1875 --76.2016 --76.1984 --76.1937 --76.2016 --76.1953 --76.1969 --76.1859 --76.1813 --76.1922 --76.1828 --76.1953 --76.1953 --76.2063 --76.1813 --76.1875 --76.2031 --76.1813 --76.1781 --76.1703 --76.1844 --76.2016 --76.1813 --76.1781 --76.1875 --76.1891 --76.1875 --76.1844 --76.1844 --76.1859 --76.1891 --76.1906 --76.1906 --76.1906 --76.1891 --76.1859 --76.1781 --76.1844 --76.1969 --76.1844 --76.1937 --76.1969 --76.1813 --76.1844 --76.1875 --76.1813 --76.175 --76.1828 --76.1859 --76.1844 --76.2016 --76.1797 --76.1922 --76.1797 --76.1734 --76.1922 --76.1906 --76.2047 --76.1813 --76.1984 --76.1891 --76.1922 --76.1672 --76.1906 --76.1953 --76.1891 --76.1859 --76.1953 --76.1891 --76.1781 --76.1984 --76.1969 --76.1797 --76.1953 --76.1906 --76.1859 --76.1891 --76.1797 --76.1766 --76.1859 --76.1969 --76.1859 --76.1844 --76.1922 --76.1813 --76.1844 --76.1703 --76.1813 --76.1906 --76.1859 --76.1781 --76.1922 --76.1875 --76.1922 --76.175 --76.2016 --76.1891 --76.1922 --76.1969 --76.1813 --76.1844 --76.1828 --76.1906 --76.1828 --76.1719 --76.1766 --76.1781 --76.1828 --76.1844 --76.1922 --76.2094 --76.1906 --76.2 --76.2031 --76.2031 --76.1891 --76.1953 --76.1906 --76.175 --76.1969 --76.1828 --76.1891 --76.175 --76.1828 --76.1969 --76.1953 --76.1953 --76.1734 --76.1875 --76.1813 --76.1844 --76.2 --76.1953 --76.1922 --76.1969 --76.1859 --76.2078 --76.2094 --76.2 --76.2031 --76.1937 --76.2016 --76.2 --76.2047 --76.1969 --76.1844 --76.1953 --76.1891 --76.1813 --76.1766 --76.1922 --76.1922 --76.1859 --76.1891 --76.1828 --76.1781 --76.1844 --76.1937 --76.1953 --76.1969 --76.1922 --76.1766 --76.1766 --76.1906 --76.1859 --76.1906 --76.1813 --76.1891 --76.1984 --76.1875 --76.1875 --76.1859 --76.1906 --76.1797 --76.1906 --76.1844 --76.1891 --76.1844 --76.1766 --76.1813 --76.1828 --76.1859 --76.1969 --76.1781 --76.1828 --76.1906 --76.1859 --76.1859 --76.1797 --76.1859 --76.1781 --76.1734 --76.1828 --76.1781 --76.1875 --76.1781 --76.1906 --76.1828 --76.1828 --76.1875 --76.1813 --76.1906 --76.1906 --76.1781 --76.1844 --76.1906 --76.1766 --76.1875 --76.1813 --76.1766 --76.1766 --76.1859 --76.1828 --76.1781 --76.1672 --76.1828 --76.1859 --76.1844 --76.1906 --76.1797 --76.1781 --76.1844 --76.1922 --76.1891 --76.1828 --76.1797 --76.1719 --76.1844 --76.1813 --76.1875 --76.1734 --76.1813 --76.1875 --76.1766 --76.1859 --76.1813 --76.1656 --76.175 --76.1781 --76.175 --76.1656 --76.1875 --76.1641 --76.1687 --76.1734 --76.1625 --76.1719 --76.1531 --76.1547 --76.1578 --76.1656 --76.1609 --76.1609 --76.1797 --76.1719 --76.175 --76.1703 --76.1672 --76.1703 --76.1859 --76.1703 --76.1781 --76.1813 --76.1797 --76.1891 --76.1719 --76.1766 --76.1781 --76.175 --76.1641 --76.175 --76.1828 --76.1734 --76.1922 --76.1797 --76.1844 --76.1813 --76.1719 --76.1828 --76.1859 --76.1766 --76.1859 --76.1656 --76.175 --76.1828 --76.1672 --76.1687 --76.1719 --76.1844 --76.1609 --76.1672 --76.175 --76.1781 --76.1703 --76.1766 --76.1734 --76.1734 --76.1719 --76.1813 --76.1719 --76.1562 --76.1766 --76.1734 --76.1625 --76.1687 --76.1656 --76.1719 --76.1687 --76.1656 --76.1672 --76.1703 --76.1813 --76.1734 --76.1625 --76.1797 --76.1797 --76.1719 --76.1703 --76.1719 --76.1562 --76.1656 --76.1625 --76.1734 --76.1656 --76.1594 --76.1594 --76.1562 --76.1672 --76.1734 --76.1562 --76.1687 --76.1672 --76.1594 --76.1797 --76.1781 --76.175 --76.1734 --76.1703 --76.1844 --76.1781 --76.1781 --76.1672 --76.1766 --76.1766 --76.1781 --76.1766 --76.1719 --76.1703 --76.1687 --76.1797 --76.1734 --76.1625 --76.1672 --76.1609 --76.1766 --76.1562 --76.1703 --76.1703 --76.1844 --76.1797 --76.1672 --76.1641 --76.1656 --76.175 --76.1734 --76.1672 --76.1781 --76.1797 --76.1813 --76.1828 --76.1781 --76.1781 --76.1828 --76.1828 --76.1953 --76.1797 --76.1766 --76.1766 --76.1672 --76.1766 --76.1875 --76.1719 --76.1703 --76.1797 --76.1844 --76.1891 --76.1828 --76.1766 --76.1875 --76.1891 --76.1906 --76.1844 --76.1891 --76.1891 --76.1781 --76.1781 --76.1859 --76.1719 --76.1828 --76.1719 --76.175 --76.1813 --76.1641 --76.1875 --76.1797 --76.1766 --76.1859 --76.1781 --76.1687 --76.1672 --76.1891 --76.1766 --76.1844 --76.1797 --76.1891 --76.1891 --76.1734 --76.1703 --76.1906 --76.1766 --76.175 --76.1891 --76.1703 --76.1844 --76.1719 --76.1766 --76.1734 --76.1656 --76.1719 --76.1797 --76.1766 --76.1578 --76.1641 --76.1859 --76.1734 --76.1859 --76.1734 --76.1641 --76.1766 --76.1719 --76.1797 --76.1781 --76.1797 --76.1719 --76.1797 --76.1906 --76.1781 --76.1719 --76.1875 --76.1781 --76.1875 --76.1875 --76.175 --76.1797 --76.1797 --76.1891 --76.1859 --76.1891 --76.1719 --76.1781 --76.1781 --76.1844 --76.1703 --76.1844 --76.1828 --76.1734 --76.1859 --76.1797 --76.175 --76.1828 --76.1656 --76.1906 --76.1687 --76.1828 --76.1656 --76.1703 --76.1844 --76.175 --76.1687 --76.1609 --76.1813 --76.1594 --76.1625 --76.1781 --76.1813 --76.1844 --76.1734 --76.1641 --76.1844 --76.1734 --76.1828 --76.1859 --76.1844 --76.1719 --76.1859 --76.1906 --76.1813 --76.1766 --76.1906 --76.1672 --76.1813 --76.175 --76.1766 --76.1813 --76.1766 --76.1813 --76.1813 --76.1813 --76.1781 --76.1687 --76.1719 --76.1797 --76.1734 --76.1766 --76.175 --76.1734 --76.1703 --76.1641 --76.1719 --76.1781 --76.1719 --76.1891 --76.175 --76.1766 --76.1781 --76.1766 --76.1766 --76.1641 --76.1734 --76.1734 --76.1766 --76.1813 --76.1687 --76.1734 --76.1844 --76.1734 --76.1734 --76.1625 --76.1797 --76.1578 --76.175 --76.1813 --76.1734 --76.1766 --76.175 --76.1859 --76.1828 --76.1859 --76.1859 --76.1687 --76.1719 --76.175 --76.1719 --76.1734 --76.1656 --76.175 --76.1719 --76.175 --76.175 --76.1719 --76.1766 --76.175 --76.1734 --76.1781 --76.1719 --76.1828 --76.1609 --76.175 --76.1672 --76.1625 --76.175 --76.1797 --76.1828 --76.1625 --76.1719 --76.1719 --76.175 --76.1703 --76.1734 --76.1656 --76.1844 --76.1734 --76.1703 --76.1547 --76.1703 --76.1703 --76.1844 --76.1687 --76.1719 --76.175 --76.175 --76.1766 --76.1875 --76.1766 --76.1828 --76.1562 --76.1859 --76.1875 --76.1828 --76.1734 --76.1766 --76.1828 --76.1703 --76.1562 --76.1641 --76.1719 --76.1734 --76.1844 --76.1672 --76.1719 --76.1687 --76.1687 --76.1672 --76.1672 --76.1687 --76.1469 --76.175 --76.1797 --76.1672 --76.1687 --76.1703 --76.1766 --76.1703 --76.1703 --76.1797 --76.1687 --76.1734 --76.1719 --76.175 --76.1625 --76.1719 --76.175 --76.1781 --76.1641 --76.1813 --76.1703 --76.1703 --76.1797 --76.1734 --76.1813 --76.1766 --76.1687 --76.1547 --76.1703 --76.1641 --76.1781 --76.1781 --76.1734 --76.1687 --76.1672 --76.1766 --76.1781 --76.1781 --76.175 --76.1766 --76.1609 --76.1641 --76.175 --76.1656 --76.1781 --76.1609 --76.1562 --76.1672 --76.1797 --76.1891 --76.1781 --76.1844 --76.1937 --76.1828 --76.1891 --76.1766 --76.1687 --76.1813 --76.1813 --76.1687 --76.1687 --76.175 --76.175 --76.1703 --76.1687 --76.1656 --76.1813 --76.1609 --76.1734 --76.1625 --76.1734 --76.1687 --76.1781 --76.1766 --76.1656 --76.1703 --76.1875 --76.1656 --76.1781 --76.1719 --76.1703 --76.1734 --76.175 --76.175 --76.1672 --76.1672 --76.1687 --76.175 --76.1781 --76.175 --76.1656 --76.1594 --76.1562 --76.1609 --76.1719 --76.1672 --76.175 --76.1625 --76.1687 --76.1828 --76.1703 --76.175 --76.1719 --76.1797 --76.175 --76.1766 --76.1703 --76.1625 --76.1609 --76.1672 --76.1687 --76.1625 --76.1641 --76.1594 --76.1672 --76.1703 --76.1766 --76.1656 --76.1687 --76.1781 --76.1781 --76.1625 --76.1719 --76.1813 --76.1953 --76.1844 --76.1922 --76.1891 --76.1828 --76.1891 --76.1719 --76.1641 --76.1828 --76.1672 --76.1672 --76.1703 --76.1703 --76.1813 --76.1719 --76.1828 --76.1734 --76.1813 --76.1797 --76.1687 --76.1641 --76.1703 --76.1719 --76.1578 --76.1609 --76.1625 --76.1687 --76.1578 --76.175 --76.1734 --76.175 --76.1578 --76.1641 --76.1687 --76.1719 --76.1641 --76.1562 --76.1687 --76.1672 --76.1672 --76.1703 --76.1641 --76.1672 --76.1797 --76.1578 --76.1734 --76.1516 --76.1891 --76.1625 --76.1672 --76.1547 --76.1562 --76.1813 --76.1781 --76.1766 --76.1672 --76.1891 --76.1703 --76.1562 --76.1687 --76.1672 --76.1562 --76.1609 --76.1687 --76.1609 --76.1672 --76.1609 --76.1562 --76.1656 --76.1703 --76.1703 --76.1672 --76.1656 --76.1641 --76.1703 --76.1578 --76.1687 --76.1781 --76.1766 --76.1844 --76.1797 --76.1641 --76.1875 --76.1781 --76.1734 --76.1609 --76.1687 --76.1625 --76.1844 --76.1656 --76.1719 --76.1672 --76.15 --76.1766 --76.1797 --76.1672 --76.1813 --76.1734 --76.1672 --76.1844 --76.1875 --76.1719 --76.1781 --76.1766 --76.1781 --76.1734 --76.1609 --76.175 --76.1734 --76.1609 --76.1766 --76.1656 --76.175 --76.1719 --76.1734 --76.1875 --76.1844 --76.1672 --76.1734 --76.1844 --76.1656 --76.1719 --76.1703 --76.15 --76.1703 --76.1609 --76.1594 --76.1734 --76.1672 --76.1547 --76.1687 --76.1687 --76.1609 --76.1656 --76.1844 --76.1562 --76.1547 --76.1641 --76.1562 --76.1687 --76.1609 --76.1734 --76.1703 --76.1547 --76.1625 --76.1703 --76.1547 --76.1625 --76.1734 --76.1531 --76.1656 --76.1609 --76.1687 --76.1641 --76.1641 --76.1578 --76.1547 --76.1547 --76.1734 --76.1641 --76.1594 --76.1656 --76.1766 --76.1766 --76.1781 --76.1656 --76.175 --76.1734 --76.1719 --76.1703 --76.1813 --76.1609 --76.1641 --76.1813 --76.1859 --76.1734 --76.1687 --76.1656 --76.1813 --76.1609 --76.1719 --76.1609 --76.1484 --76.1781 --76.1609 --76.175 --76.1609 --76.1766 --76.1734 --76.1656 --76.1734 --76.1766 --76.1781 --76.1734 --76.1766 --76.1625 --76.1672 --76.1734 --76.1719 --76.1734 --76.1766 --76.1781 --76.1828 --76.1766 --76.1719 --76.1719 --76.1719 --76.1687 --76.1625 --76.175 --76.1656 --76.1703 --76.1547 --76.1594 --76.1672 --76.1656 --76.1656 --76.1656 --76.1641 --76.1516 --76.1641 --76.1516 --76.1547 --76.1609 --76.1562 --76.1516 --76.1578 --76.1625 --76.1766 --76.1656 --76.1734 --76.1687 --76.1766 --76.1531 --76.1641 --76.1656 --76.1625 --76.1641 --76.1641 --76.1625 --76.1687 --76.1562 --76.1656 --76.1672 --76.1625 --76.1719 --76.1562 --76.1562 --76.1609 --76.1516 --76.1531 --76.1625 --76.1703 --76.1594 --76.1687 --76.1703 --76.1703 --76.1719 --76.1656 --76.1594 --76.1672 --76.1578 --76.1656 --76.1531 --76.1719 --76.1719 --76.1672 --76.1766 --76.1547 --76.1609 --76.1547 --76.1562 --76.1562 --76.1578 --76.1578 --76.1562 --76.1531 --76.1578 --76.1641 --76.1703 --76.1734 --76.1547 --76.1531 --76.1625 --76.1672 --76.1578 --76.15 --76.15 --76.1562 --76.1594 --76.1516 --76.1766 --76.1594 --76.1734 --76.15 --76.1656 --76.1687 --76.1672 --76.1641 --76.1547 --76.1641 --76.15 --76.1453 --76.1594 --76.175 --76.1687 --76.1562 --76.1641 --76.1609 --76.1547 --76.1656 --76.175 --76.1531 --76.1562 --76.1578 --76.1516 --76.1719 --76.1656 --76.1781 --76.1562 --76.1578 --76.1687 --76.1578 --76.1641 --76.1656 --76.1562 --76.1641 --76.1703 --76.1719 --76.1672 --76.1703 --76.1734 --76.1859 --76.175 --76.1625 --76.1781 --76.1484 --76.1578 --76.1625 --76.1687 --76.175 --76.1484 --76.1703 --76.1656 --76.1562 --76.1781 --76.1547 --76.1484 --76.1734 --76.1609 --76.1578 --76.1687 --76.1719 --76.1656 --76.1625 --76.1641 --76.1625 --76.1656 --76.1578 --76.1687 --76.1625 --76.1672 --76.175 --76.1672 --76.1641 --76.1703 --76.1609 --76.1594 --76.1641 --76.1594 --76.1641 --76.1656 --76.1578 --76.1813 --76.1547 --76.1516 --76.1625 --76.1766 --76.1734 --76.1547 --76.1797 --76.1656 --76.1672 --76.1609 --76.1609 --76.1609 --76.1719 --76.1672 --76.1641 --76.1594 --76.1719 --76.1687 --76.1594 --76.1734 --76.1625 --76.1797 --76.1562 --76.1781 --76.1641 --76.1531 --76.15 --76.1594 --76.1547 --76.1609 --76.1609 --76.1484 --76.1687 --76.1609 --76.1516 --76.1625 --76.1594 --76.1484 --76.1438 --76.1625 --76.1562 --76.1531 --76.1641 --76.1484 --76.1594 --76.1547 --76.1672 --76.1547 --76.1656 --76.1562 --76.1562 --76.1547 --76.1641 --76.1562 --76.1438 --76.1734 --76.1562 --76.1594 --76.1719 --76.1547 --76.1562 --76.1656 --76.15 --76.1484 --76.1609 --76.1656 --76.1641 --76.1594 --76.15 --76.1531 --76.1516 --76.1484 --76.1578 --76.1484 --76.1641 --76.1641 --76.1547 --76.1703 --76.1547 --76.1625 --76.1609 --76.15 --76.1672 --76.1516 --76.1719 --76.1609 --76.1594 --76.1609 --76.1703 --76.15 --76.1609 --76.1531 --76.1625 --76.175 --76.1734 --76.1672 --76.1656 --76.1687 --76.1625 --76.1656 --76.1766 --76.1594 --76.1703 --76.1625 --76.175 --76.1703 --76.1859 --76.1781 --76.1719 --76.1766 --76.1797 --76.1656 --76.1656 --76.1734 --76.1547 --76.1625 --76.1656 --76.1672 --76.1641 --76.175 --76.1687 --76.1766 --76.1687 --76.1734 --76.1578 --76.1516 --76.1609 --76.1594 --76.1641 --76.1578 --76.1531 --76.1656 --76.1578 --76.1656 --76.1641 --76.1625 --76.1578 --76.1562 --76.15 --76.1672 --76.1703 --76.1594 --76.1625 --76.1578 --76.1594 --76.1672 --76.1781 --76.1578 --76.1531 --76.1594 --76.1656 --76.1562 --76.1594 --76.1562 --76.1656 --76.1656 --76.1625 --76.1625 --76.1672 --76.1625 --76.1578 --76.1625 --76.1578 --76.1578 --76.1625 --76.1531 --76.1578 --76.1547 --76.1719 --76.1438 --76.1562 --76.1562 --76.1594 --76.1687 --76.1609 --76.1547 --76.1656 --76.1687 --76.1656 --76.1578 --76.1625 --76.1625 --76.15 --76.1562 --76.1547 --76.1562 --76.1734 --76.1687 --76.1438 --76.1516 --76.1516 --76.1687 --76.1609 --76.1516 --76.1656 --76.1625 --76.1609 --76.1766 --76.1578 --76.1609 --76.1609 --76.1719 --76.1625 --76.1578 --76.1656 --76.1516 --76.1703 --76.1687 --76.1625 --76.1531 --76.1641 --76.1516 --76.1609 --76.1406 --76.1562 --76.1594 --76.1531 --76.1516 --76.1578 --76.1453 --76.1438 --76.1422 --76.1578 --76.1531 --76.1406 --76.15 --76.1625 --76.1547 --76.1547 --76.1516 --76.1562 --76.1484 --76.1547 --76.1516 --76.1594 --76.1641 --76.1422 --76.1547 --76.1578 --76.1531 --76.1438 --76.1406 --76.1453 --76.1422 --76.1453 --76.1328 --76.1344 --76.15 --76.1453 --76.1531 --76.1344 --76.1531 --76.1375 --76.1359 --76.1484 --76.1531 --76.1547 --76.1531 --76.1625 --76.1516 --76.1516 --76.1516 --76.15 --76.1531 --76.1438 --76.125 --76.15 --76.1328 --76.1391 --76.125 --76.15 --76.1422 --76.1609 --76.1469 --76.1469 --76.15 --76.1547 --76.1641 --76.1406 --76.1531 --76.1406 --76.1531 --76.1484 --76.15 --76.1547 --76.1484 --76.1703 --76.1547 --76.1469 --76.1609 --76.1562 --76.1578 --76.1547 --76.1562 --76.1562 --76.1547 --76.1531 --76.1609 --76.1578 --76.1562 --76.1687 --76.1672 --76.1578 --76.1516 --76.1734 --76.1609 --76.1781 --76.1766 --76.1672 --76.1687 --76.1484 --76.1609 --76.1562 --76.1594 --76.1641 --76.1641 --76.1687 --76.1719 --76.1687 --76.1547 --76.1625 --76.1672 --76.1656 --76.1578 --76.1687 --76.1734 --76.1578 --76.1578 --76.1687 --76.1672 --76.1734 --76.1719 --76.1719 --76.1547 --76.1594 --76.1625 --76.1766 --76.1547 --76.1734 --76.1672 --76.1766 --76.1641 --76.1594 --76.1578 --76.1594 --76.1531 --76.1547 --76.1547 --76.1609 --76.1562 --76.1484 --76.1672 --76.1594 --76.1672 --76.1578 --76.1781 --76.1609 --76.1719 --76.15 --76.1578 --76.1516 --76.1547 --76.1641 --76.1687 --76.1484 --76.1625 --76.1703 --76.1484 --76.1484 --76.1734 --76.1594 --76.1734 --76.1578 --76.1547 --76.1656 --76.1734 --76.1609 --76.1672 --76.1469 --76.1672 --76.1609 --76.1516 --76.1547 --76.175 --76.1734 --76.1609 --76.1562 --76.1578 --76.1625 --76.1547 --76.1609 --76.1687 --76.1484 --76.1656 --76.1438 --76.1672 --76.1531 --76.1516 --76.1578 --76.1687 --76.1484 --76.1547 --76.1531 --76.1594 --76.1656 --76.1562 --76.1516 --76.1766 --76.1562 --76.1578 --76.1766 --76.1578 --76.1484 --76.1547 --76.15 --76.1594 --76.1594 --76.1594 --76.1656 --76.15 --76.15 --76.1531 --76.1641 --76.1562 --76.1672 --76.15 --76.1687 --76.1578 --76.1562 --76.175 --76.1797 --76.1547 --76.1703 --76.1625 --76.1687 --76.1562 --76.1469 --76.1516 --76.1641 --76.1594 --76.1687 --76.1531 --76.1609 --76.1484 --76.1438 --76.1469 --76.1531 --76.1578 --76.1641 --76.1609 --76.1516 --76.1391 --76.1562 --76.1406 --76.1531 --76.1625 --76.1656 --76.1516 --76.1484 --76.1531 --76.1547 --76.1484 --76.1453 --76.1672 --76.1609 --76.1484 --76.1656 --76.1672 --76.1438 --76.1562 --76.1656 --76.15 --76.1656 --76.1469 --76.1484 --76.1562 --76.1562 --76.1516 --76.1641 --76.1562 --76.1547 --76.1531 --76.1594 --76.15 --76.1656 --76.1672 --76.1609 --76.1547 --76.1656 --76.1562 --76.1594 --76.1547 --76.1609 --76.1578 --76.1516 --76.1531 --76.1562 --76.1516 --76.1609 --76.1531 --76.1562 --76.1687 --76.1656 --76.1719 --76.1516 --76.1578 --76.1609 --76.1547 --76.1594 --76.1547 --76.1547 --76.1562 --76.1516 --76.1687 --76.1562 --76.1609 --76.1641 --76.1609 --76.1687 --76.15 --76.1625 --76.1578 --76.1547 --76.1562 --76.1719 --76.1547 --76.1516 --76.1703 --76.1547 --76.1656 --76.1516 --76.1531 --76.1578 --76.1531 --76.1609 --76.1609 --76.1547 --76.1641 --76.1578 --76.1703 --76.1656 --76.1516 --76.1516 --76.1469 --76.1422 --76.15 --76.1547 --76.1438 --76.1531 --76.1641 --76.15 --76.1547 --76.1562 --76.1641 --76.1594 --76.1578 --76.1687 --76.1469 --76.1484 --76.175 --76.1516 --76.1344 --76.1453 --76.1531 --76.1562 --76.1547 --76.1609 --76.1469 --76.1594 --76.1531 --76.1594 --76.15 --76.1625 --76.1484 --76.1484 --76.1578 --76.1438 --76.1516 --76.1719 --76.1719 --76.1594 --76.1391 --76.1484 --76.15 --76.1516 --76.1516 --76.1578 --76.1375 --76.1453 --76.15 --76.1562 --76.1531 --76.1516 --76.1547 --76.1609 --76.1547 --76.1516 --76.1531 --76.1672 --76.1484 --76.15 --76.1578 --76.1641 --76.1656 --76.1469 --76.1625 --76.1516 --76.1594 --76.1578 --76.1531 --76.1453 --76.1578 --76.1406 --76.1531 --76.1625 --76.1516 --76.1594 --76.1609 --76.1609 --76.1578 --76.1562 --76.1531 --76.1531 --76.15 --76.1469 --76.175 --76.1562 --76.1609 --76.1422 --76.1641 --76.1469 --76.1484 --76.1531 --76.1594 --76.1672 --76.1531 --76.1562 --76.1625 --76.1641 --76.1453 --76.1578 --76.1484 --76.1516 --76.15 --76.1406 --76.1359 --76.1344 --76.1453 --76.1422 --76.1578 --76.1531 --76.1469 --76.1438 --76.1547 --76.1562 --76.1438 --76.1484 --76.1594 --76.1484 --76.1547 --76.1469 --76.1562 --76.1531 --76.1469 --76.1453 --76.1578 --76.15 --76.1609 --76.1547 --76.1734 --76.1516 --76.1594 --76.1484 --76.1516 --76.1484 --76.1422 --76.1375 --76.1328 --76.1562 --76.1484 --76.1484 --76.1562 --76.1578 --76.1594 --76.1531 --76.1484 --76.1422 --76.1469 --76.1625 --76.15 --76.1453 --76.1422 --76.1625 --76.1531 --76.1578 --76.1719 --76.1594 --76.1516 --76.1594 --76.1562 --76.1391 --76.1594 --76.1469 --76.1391 --76.1594 --76.1469 --76.15 --76.1562 --76.1687 --76.1453 --76.15 --76.1547 --76.1531 --76.1484 --76.1531 --76.1641 --76.1547 --76.1516 --76.1406 --76.1438 --76.1453 --76.1516 --76.1453 --76.1641 --76.1453 --76.1578 --76.1656 --76.1531 --76.1422 --76.1562 --76.1469 --76.1438 --76.1531 --76.1547 --76.1453 --76.1531 --76.1594 --76.1484 --76.1562 --76.1547 --76.1516 --76.1469 --76.15 --76.1547 --76.1469 --76.1531 --76.1484 --76.1469 --76.1375 --76.1531 --76.1469 --76.1484 --76.1438 --76.1438 --76.1484 --76.1391 --76.1328 --76.15 --76.1531 --76.1406 --76.1422 --76.1406 --76.1438 --76.1484 --76.1375 --76.1453 --76.1453 --76.1484 --76.1469 --76.1469 --76.1562 --76.1422 --76.1391 --76.1391 --76.1453 --76.1453 --76.1453 --76.1328 --76.1578 --76.1562 --76.1703 --76.1469 --76.1531 --76.1656 --76.1594 --76.15 --76.1672 --76.1469 --76.1609 --76.1562 --76.1516 --76.1547 --76.1453 --76.1562 --76.1672 --76.15 --76.1469 --76.1578 --76.1531 --76.1641 --76.1625 --76.1531 --76.1641 --76.1562 --76.1547 --76.1547 --76.1625 --76.1484 --76.1578 --76.15 --76.1422 --76.1609 --76.1562 --76.1578 --76.1703 --76.1562 --76.1453 --76.15 --76.1547 --76.1578 --76.1531 --76.1531 --76.1656 --76.1562 --76.1625 --76.1594 --76.1594 --76.1687 --76.1594 --76.1656 --76.1609 --76.1656 --76.1516 --76.1484 --76.1453 --76.1438 --76.1531 --76.1578 --76.1453 --76.1687 --76.1594 --76.1609 --76.1672 --76.1625 --76.1641 --76.1562 --76.1516 --76.1484 --76.1469 --76.1578 --76.1578 --76.15 --76.1562 --76.15 --76.1594 --76.1562 --76.1672 --76.1641 --76.1562 --76.1609 --76.1312 --76.1641 --76.1531 --76.1516 --76.1641 --76.1438 --76.1406 --76.1516 --76.1578 --76.1547 --76.1469 --76.1531 --76.1547 --76.1578 --76.1375 --76.1609 --76.1531 --76.1438 --76.1562 --76.1531 --76.1484 --76.1469 --76.1547 --76.1578 --76.1516 --76.15 --76.15 --76.1547 --76.1484 --76.1516 --76.1547 --76.1516 --76.1484 --76.1547 --76.1578 --76.1609 --76.1422 --76.1516 --76.1625 --76.1531 --76.1531 --76.1469 --76.15 --76.1469 --76.15 --76.1609 --76.1516 --76.1562 --76.1656 --76.1531 --76.15 --76.1672 --76.1562 --76.1547 --76.1594 --76.1687 --76.1719 --76.1672 --76.1578 --76.1578 --76.1609 --76.1531 --76.1547 --76.1609 --76.1609 --76.1562 --76.1641 --76.1594 --76.1672 --76.1719 --76.1562 --76.1641 --76.1547 --76.1547 --76.1547 --76.1641 --76.1625 --76.15 --76.1562 --76.1453 --76.1469 --76.1406 --76.1422 --76.1609 --76.1469 --76.1578 --76.1609 --76.1547 --76.1578 --76.1641 --76.15 --76.1609 --76.15 --76.1672 --76.1547 --76.1484 --76.1578 --76.1484 --76.1562 --76.1406 --76.1484 --76.1578 --76.1469 --76.1516 --76.1438 --76.15 --76.1484 --76.1453 --76.1438 --76.1359 --76.1406 --76.1453 --76.1516 --76.1453 --76.1406 --76.15 --76.1547 --76.1422 --76.1641 --76.15 --76.1438 --76.1359 --76.1609 --76.1422 --76.1422 --76.1453 --76.1422 --76.1422 --76.1344 --76.1531 --76.1359 --76.1391 --76.1641 --76.1375 --76.1453 --76.1375 --76.1578 --76.1641 --76.1438 --76.1359 --76.1578 --76.1469 --76.1484 --76.1469 --76.1516 --76.1453 --76.1516 --76.1438 --76.1531 --76.1438 --76.1453 --76.1625 --76.1641 --76.1438 --76.1516 --76.1625 --76.1656 --76.1453 --76.1594 --76.1703 --76.1594 --76.1625 --76.1672 --76.1813 --76.1766 --76.1609 --76.1703 --76.1531 --76.1578 --76.1469 --76.15 --76.1562 --76.1438 --76.15 --76.15 --76.1562 --76.1609 --76.1484 --76.1516 --76.1484 --76.1469 --76.1641 --76.1578 --76.1422 --76.1656 --76.1438 --76.1531 --76.1438 --76.1531 --76.1469 --76.1547 --76.1562 --76.1406 --76.1562 --76.1453 --76.1406 --76.1344 --76.1453 --76.1531 --76.1562 --76.1484 --76.1406 --76.1344 --76.1375 --76.1484 --76.1469 --76.15 --76.1359 --76.1531 --76.1328 --76.1312 --76.1484 --76.1531 --76.1328 --76.1406 --76.1344 --76.1438 --76.1359 --76.1453 --76.1406 --76.1469 --76.1266 --76.1391 --76.1219 --76.1484 --76.1516 --76.1375 --76.1406 --76.1422 --76.1234 --76.1297 --76.1469 --76.1359 --76.1375 --76.1312 --76.1375 --76.1281 --76.1375 --76.1281 --76.1359 --76.1406 --76.1188 --76.1375 --76.1422 --76.1531 --76.1453 --76.1312 --76.1234 --76.1547 --76.1312 --76.1281 --76.1312 --76.1375 --76.1344 --76.1406 --76.1484 --76.1344 --76.1438 --76.1438 --76.1312 --76.1344 --76.1578 --76.1422 --76.1344 --76.1469 --76.1328 --76.1453 --76.1391 --76.1547 --76.1531 --76.1422 --76.1375 --76.1328 --76.125 --76.1328 --76.1422 --76.1375 --76.1297 --76.1406 --76.1438 --76.1406 --76.1359 --76.1359 --76.1266 --76.1438 --76.1391 --76.1391 --76.1531 --76.1406 --76.1406 --76.1406 --76.1438 --76.1359 --76.1484 --76.1422 --76.1312 --76.1516 --76.1297 --76.125 --76.1312 --76.1422 --76.1312 --76.1406 --76.1328 --76.1375 --76.1438 --76.1359 --76.1328 --76.1391 --76.1391 --76.1328 --76.1438 --76.1375 --76.1594 --76.1391 --76.1562 --76.1453 --76.1484 --76.1453 --76.1406 --76.1375 --76.1469 --76.1609 --76.1484 --76.1375 --76.15 --76.1594 --76.1344 --76.1359 --76.1391 --76.1516 --76.1391 --76.1484 --76.1438 --76.1344 --76.1391 --76.1484 --76.1406 --76.1453 --76.1375 --76.1344 --76.1453 --76.1375 --76.1328 --76.1406 --76.1453 --76.15 --76.1312 --76.1328 --76.1266 --76.1359 --76.125 --76.1312 --76.1328 --76.1453 --76.1312 --76.1297 --76.1312 --76.1375 --76.1422 --76.1125 --76.1391 --76.1391 --76.1422 --76.1359 --76.1312 --76.1312 --76.1344 --76.1406 --76.1297 --76.1391 --76.1266 --76.1438 --76.1453 --76.1391 --76.1344 --76.1266 --76.1375 --76.1516 --76.1484 --76.1312 --76.1406 --76.15 --76.1359 --76.1328 --76.1391 --76.1438 --76.1359 --76.1453 --76.1438 --76.15 --76.1234 --76.1391 --76.1422 --76.1422 --76.1469 --76.1422 --76.1609 --76.1328 --76.1484 --76.1422 --76.1562 --76.1438 --76.1375 --76.15 --76.1516 --76.1391 --76.1547 --76.1406 --76.1469 --76.1328 --76.1359 --76.1516 --76.1344 --76.1422 --76.1406 --76.1328 --76.1672 --76.1469 --76.1516 --76.1406 --76.1359 --76.1516 --76.1328 --76.1297 --76.1312 --76.1422 --76.1578 --76.1453 --76.1484 --76.1453 --76.1453 --76.1422 --76.1453 --76.1406 --76.1312 --76.1344 --76.1375 --76.1203 --76.1406 --76.1391 --76.1438 --76.1406 --76.1516 --76.1422 --76.1422 --76.1297 --76.1391 --76.1391 --76.1484 --76.1453 --76.1344 --76.1375 --76.1516 --76.1375 --76.1453 --76.1422 --76.1406 --76.1266 --76.1484 --76.1266 --76.1453 --76.1516 --76.1344 --76.1406 --76.1422 --76.1484 --76.1406 --76.1391 --76.15 --76.1469 --76.1484 --76.1594 --76.15 --76.1469 --76.1469 --76.1469 --76.1375 --76.1422 --76.15 --76.1422 --76.1469 --76.1516 --76.1484 --76.1406 --76.15 --76.1438 --76.1469 --76.1469 --76.1469 --76.1453 --76.1562 --76.1422 --76.1219 --76.1453 --76.1375 --76.1438 --76.1438 --76.1375 --76.1484 --76.1422 --76.1469 --76.1422 --76.1359 --76.1344 --76.1422 --76.1516 --76.1609 --76.1328 --76.1359 --76.1594 --76.1422 --76.1516 --76.1469 --76.1359 --76.1406 --76.1562 --76.1469 --76.1484 --76.1422 --76.1422 --76.1453 --76.1422 --76.1438 --76.1344 --76.1516 --76.1406 --76.1484 --76.1422 --76.1516 --76.1484 --76.1484 --76.15 --76.1484 --76.1516 --76.1438 --76.1516 --76.1562 --76.1344 --76.1422 --76.1391 --76.1406 --76.1625 --76.1469 --76.1375 --76.1406 --76.1406 --76.1359 --76.15 --76.1469 --76.15 --76.1516 --76.1422 --76.1391 --76.1422 --76.1312 --76.1453 --76.1406 --76.1469 --76.1375 --76.1375 --76.1297 --76.1422 --76.1391 --76.1484 --76.1328 --76.1422 --76.1359 --76.1375 --76.1375 --76.1484 --76.15 --76.1438 --76.1359 --76.1219 --76.1422 --76.1438 --76.1391 --76.1375 --76.1406 --76.1312 --76.1344 --76.1391 --76.1359 --76.1406 --76.1453 --76.1312 --76.1297 --76.1391 --76.1453 --76.1359 --76.1422 --76.1406 --76.1359 --76.1422 --76.1312 --76.1344 --76.1312 --76.1531 --76.1406 --76.1328 --76.1281 --76.1359 --76.1359 --76.125 --76.1438 --76.1359 --76.1469 --76.1359 --76.1391 --76.1328 --76.1438 --76.1469 --76.1344 --76.1391 --76.1328 --76.1344 --76.1438 --76.1281 --76.1547 --76.1375 --76.1453 --76.1453 --76.1375 --76.1391 --76.1453 --76.1344 --76.1484 --76.1328 --76.1281 --76.1453 --76.1422 --76.1438 --76.1422 --76.15 --76.1328 --76.1453 --76.1359 --76.1391 --76.1359 --76.1359 --76.1359 --76.1469 --76.1469 --76.1422 --76.1344 --76.1312 --76.1328 --76.1266 --76.1422 --76.125 --76.1453 --76.1422 --76.1406 --76.1469 --76.1406 --76.1375 --76.1438 --76.1375 --76.1328 --76.1375 --76.1391 --76.1344 --76.1484 --76.1375 --76.1438 --76.1422 --76.1359 --76.1438 --76.1516 --76.1375 --76.1438 --76.1344 --76.1312 --76.1453 --76.1438 --76.1406 --76.1438 --76.1406 --76.1391 --76.1438 --76.1516 --76.1375 --76.1453 --76.1391 --76.1469 --76.15 --76.1406 --76.1375 --76.1281 --76.1391 --76.1391 --76.1344 --76.1359 --76.1375 --76.1406 --76.1391 --76.1328 --76.1328 --76.1359 --76.1375 --76.1484 --76.1438 --76.1469 --76.1469 --76.1469 --76.15 --76.1312 --76.1406 --76.1297 --76.1453 --76.1562 --76.1562 --76.1422 --76.1547 --76.1484 --76.1531 --76.1453 --76.15 --76.1547 --76.1469 --76.1469 --76.1422 --76.1469 --76.1594 --76.1641 --76.1625 --76.1625 --76.1484 --76.1516 --76.1578 --76.1578 --76.1609 --76.1516 --76.1641 --76.1578 --76.1672 --76.1703 --76.1656 --76.1578 --76.1687 --76.1781 --76.1516 --76.1562 --76.1641 --76.1578 --76.1625 --76.1578 --76.1672 --76.1625 --76.1687 --76.1547 --76.1547 --76.1547 --76.1438 --76.1609 --76.1547 --76.1625 --76.1438 --76.1484 --76.1547 --76.1562 --76.1375 --76.1453 --76.1516 --76.1578 --76.1516 --76.1516 --76.1516 --76.1547 --76.1422 --76.1422 --76.1609 --76.1547 --76.1375 --76.1516 --76.1594 --76.1578 --76.1438 --76.1547 --76.1516 --76.1578 --76.1562 --76.1562 --76.1516 --76.1516 --76.1609 --76.1594 --76.1516 --76.1484 --76.1531 --76.1531 --76.1609 --76.1484 --76.1578 --76.1578 --76.1438 --76.1578 --76.1422 --76.1359 --76.15 --76.1438 --76.1344 --76.1375 --76.1359 --76.1281 --76.1375 --76.1391 --76.15 --76.1391 --76.1578 --76.1406 --76.1594 --76.1328 --76.1406 --76.1422 --76.1375 --76.1453 --76.1406 --76.1453 --76.1531 --76.1344 --76.1594 --76.15 --76.1687 --76.1547 --76.1516 --76.1547 --76.1562 --76.1484 --76.1391 --76.1547 --76.1391 --76.1375 --76.15 --76.1484 --76.1641 --76.1562 --76.1438 --76.1594 --76.1484 --76.1453 --76.1484 --76.1438 --76.1562 --76.1516 --76.15 --76.1453 --76.1391 --76.1406 --76.1453 --76.1484 --76.1406 --76.1484 --76.1438 --76.1531 --76.1438 --76.1469 --76.1375 --76.1406 --76.1422 --76.1422 --76.15 --76.1391 --76.1359 --76.1562 --76.1406 --76.15 --76.1438 --76.15 --76.1453 --76.1562 --76.1641 --76.1438 --76.1484 --76.1469 --76.1516 --76.1516 --76.15 --76.1422 --76.1453 --76.1375 --76.1359 --76.1281 --76.1438 --76.1297 --76.1406 --76.15 --76.1469 --76.1344 --76.1359 --76.1406 --76.1328 --76.1344 --76.1297 --76.1344 --76.1375 --76.1172 --76.1422 --76.1328 --76.1312 --76.1297 --76.1344 --76.1375 --76.1422 --76.1188 --76.1359 --76.1312 --76.1297 --76.1328 --76.1375 --76.1312 --76.15 --76.1344 --76.1344 --76.1312 --76.15 --76.1375 --76.1438 --76.1469 --76.1266 --76.1344 --76.1297 --76.1344 --76.1438 --76.1391 --76.1266 --76.1453 --76.1344 --76.1484 --76.1359 --76.1297 --76.15 --76.1484 --76.1344 --76.1391 --76.1453 --76.1406 --76.1438 --76.1516 --76.1391 --76.1531 --76.1484 --76.1484 --76.1469 --76.1375 --76.1344 --76.1359 --76.1562 --76.1406 --76.1406 --76.1328 --76.1375 --76.1359 --76.1359 --76.1391 --76.1203 --76.1375 --76.1203 --76.1422 --76.1156 --76.1297 --76.1266 --76.1453 --76.1484 --76.1406 --76.1453 --76.1328 --76.1531 --76.1359 --76.1406 --76.1484 --76.1406 --76.1391 --76.1344 --76.1406 --76.1281 --76.1359 --76.1469 --76.15 --76.1469 --76.1406 --76.1641 --76.1391 --76.1578 --76.1359 --76.1344 --76.1359 --76.1375 --76.1516 --76.1344 --76.1406 --76.1266 --76.1469 --76.1422 --76.1203 --76.1312 --76.1312 --76.1328 --76.1391 --76.1266 --76.1406 --76.1234 --76.1203 --76.1328 --76.1234 --76.1312 --76.1188 --76.1234 --76.1234 --76.1469 --76.1359 --76.1406 --76.1359 --76.1391 --76.1438 --76.1359 --76.1422 --76.1281 --76.1453 --76.1391 --76.1312 --76.1266 --76.1344 --76.1344 --76.1391 --76.1156 --76.1297 --76.1328 --76.1281 --76.1281 --76.1312 --76.1359 --76.1141 --76.1219 --76.1344 --76.1328 --76.1297 --76.1359 --76.1188 --76.1344 --76.1328 --76.1312 --76.1312 --76.1406 --76.1344 --76.1312 --76.1312 --76.1125 --76.1297 --76.1344 --76.1359 --76.1391 --76.1281 --76.1234 --76.1297 --76.1312 --76.15 --76.1328 --76.1547 --76.1406 --76.1359 --76.1453 --76.1406 --76.1281 --76.15 --76.1359 --76.1516 --76.1469 --76.1375 --76.1453 --76.1453 --76.1469 --76.1359 --76.1344 --76.1281 --76.1375 --76.1391 --76.1188 --76.1328 --76.1406 --76.1344 --76.1484 --76.1359 --76.1156 --76.1281 --76.1281 --76.125 --76.1203 --76.125 --76.1312 --76.1281 --76.1344 --76.1438 --76.1328 --76.1344 --76.1406 --76.1297 --76.1359 --76.1359 --76.1266 --76.1422 --76.1359 --76.1328 --76.1359 --76.1469 --76.1453 --76.1297 --76.1328 --76.1391 --76.1438 --76.1344 --76.1375 --76.1359 --76.1312 --76.1328 --76.1266 --76.1312 --76.1422 --76.1469 --76.1266 --76.1453 --76.1562 --76.1266 --76.1422 --76.1297 --76.1266 --76.1375 --76.125 --76.1344 --76.1359 --76.1234 --76.15 --76.1516 --76.1406 --76.1219 --76.1312 --76.1391 --76.1281 --76.15 --76.1422 --76.1312 --76.1391 --76.1344 --76.1375 --76.1484 --76.1406 --76.1234 --76.1328 --76.1391 --76.1359 --76.1203 --76.1219 --76.1172 --76.1234 --76.1359 --76.1359 --76.1344 --76.1359 --76.1219 --76.1391 --76.1406 --76.1203 --76.1453 --76.1328 --76.1391 --76.1391 --76.1531 --76.1438 --76.1469 --76.1375 --76.1438 --76.1422 --76.1422 --76.1484 --76.1391 --76.1547 --76.1438 --76.1406 --76.1469 --76.125 --76.1516 --76.1547 --76.1375 --76.1469 --76.1406 --76.1422 --76.1484 --76.1266 --76.1328 --76.1281 --76.1359 --76.1453 --76.1422 --76.1375 --76.1484 --76.1453 --76.1344 --76.1312 --76.1375 --76.1469 --76.1375 --76.1375 --76.1453 --76.1297 --76.1359 --76.1375 --76.1406 --76.1531 --76.1375 --76.1547 --76.1578 --76.1516 --76.1422 --76.1375 --76.1484 --76.1516 --76.1234 --76.1406 --76.1375 --76.1344 --76.1438 --76.1281 --76.1297 --76.1578 --76.1375 --76.1312 --76.1453 --76.1422 --76.1516 --76.1391 --76.1484 --76.1375 --76.1453 --76.1344 --76.1328 --76.1297 --76.1422 --76.1375 --76.1531 --76.1406 --76.1453 --76.1422 --76.1312 --76.1344 --76.1359 --76.15 --76.1375 --76.1438 --76.1281 --76.125 --76.1297 --76.1453 --76.1234 --76.1297 --76.1531 --76.1391 --76.1328 --76.15 --76.1547 --76.1469 --76.1375 --76.1484 --76.1391 --76.1375 --76.1391 --76.1375 --76.1328 --76.1406 --76.1422 --76.1422 --76.1422 --76.1422 --76.1453 --76.1406 --76.1406 --76.1359 --76.1406 --76.1234 --76.1422 --76.1391 --76.1328 --76.1453 --76.1438 --76.1438 --76.1391 --76.1453 --76.1469 --76.1281 --76.1328 --76.1344 --76.125 --76.1391 --76.1375 --76.1359 --76.1484 --76.1219 --76.1297 --76.1484 --76.1438 --76.1281 --76.1422 --76.1328 --76.1281 --76.1375 --76.125 --76.1375 --76.1484 --76.1328 --76.1359 --76.1344 --76.1438 --76.1375 --76.1391 --76.1422 --76.1328 --76.125 --76.1359 --76.1312 --76.1469 --76.1344 --76.1297 --76.1406 --76.1469 --76.1438 --76.1375 --76.1375 --76.1438 --76.1391 --76.15 --76.1297 --76.1297 --76.1266 --76.1328 --76.1359 --76.1422 --76.1422 --76.1406 --76.1391 --76.1391 --76.1312 --76.1469 --76.1453 --76.1422 --76.1406 --76.1375 --76.1484 --76.1547 --76.1406 --76.1438 --76.1469 --76.1422 --76.1344 --76.15 --76.1391 --76.1438 --76.1469 --76.1406 --76.1469 --76.1547 --76.1453 --76.1422 --76.1297 --76.1453 --76.1484 --76.1562 --76.1406 --76.1453 --76.15 --76.1469 --76.1438 --76.125 --76.1469 --76.1438 --76.1516 --76.1484 --76.1516 --76.1531 --76.1375 --76.1469 --76.1438 --76.1531 --76.1469 --76.1531 --76.1469 --76.1453 --76.1562 --76.1469 --76.1453 --76.1484 --76.1422 --76.1359 --76.1453 --76.1469 --76.1594 --76.1422 --76.1359 --76.1516 --76.1359 --76.1438 --76.1281 --76.1328 --76.1438 --76.1422 --76.1453 --76.1438 --76.1281 --76.1391 --76.1297 --76.1344 --76.1312 --76.1297 --76.1234 --76.1391 --76.1375 --76.1359 --76.125 --76.1344 --76.1344 --76.1312 --76.1375 --76.1359 --76.1297 --76.1266 --76.125 --76.1359 --76.1422 --76.1312 --76.1375 --76.1391 --76.1391 --76.1359 --76.1312 --76.1312 --76.1359 --76.1281 --76.1344 --76.1391 --76.1391 --76.1328 --76.1297 --76.1312 --76.1359 --76.1312 --76.1344 --76.1281 --76.1391 --76.1328 --76.1172 --76.1141 --76.1172 --76.1281 --76.1281 --76.1203 --76.1125 --76.1203 --76.1219 --76.1141 --76.1359 --76.1125 --76.1312 --76.1109 --76.125 --76.0969 --76.125 --76.1203 --76.1125 --76.1281 --76.1203 --76.1281 --76.1359 --76.1234 --76.125 --76.1094 --76.1109 --76.1141 --76.1266 --76.1234 --76.1297 --76.1328 --76.1219 --76.1328 --76.1203 --76.1109 --76.1469 --76.1297 --76.1219 --76.1281 --76.1312 --76.1297 --76.1203 --76.125 --76.1219 --76.1312 --76.1281 --76.1234 --76.1234 --76.1203 --76.1203 --76.1203 --76.1312 --76.1312 --76.1203 --76.1312 --76.1344 --76.1281 --76.125 --76.1266 --76.1078 --76.1156 --76.1094 --76.1188 --76.1188 --76.1172 --76.1125 --76.125 --76.1125 --76.1297 --76.1344 --76.1312 --76.1281 --76.125 --76.1297 --76.1281 --76.1297 --76.1312 --76.125 --76.1281 --76.1531 --76.1312 --76.1375 --76.1312 --76.1328 --76.1453 --76.1203 --76.1266 --76.1266 --76.1172 --76.1266 --76.1344 --76.1328 --76.1516 --76.1312 --76.1281 --76.1328 --76.1516 --76.1406 --76.1406 --76.1281 --76.1328 --76.1328 --76.1203 --76.1375 --76.1375 --76.1266 --76.1312 --76.1406 --76.1328 --76.1266 --76.1359 --76.1328 --76.1281 --76.1266 --76.1422 --76.1344 --76.1391 --76.1438 --76.1312 --76.1391 --76.1266 --76.1203 --76.1234 --76.1359 --76.1281 --76.1156 --76.1375 --76.1328 --76.1328 --76.1234 --76.1406 --76.1312 --76.1438 --76.1281 --76.1297 --76.1312 --76.1328 --76.1297 --76.1266 --76.1203 --76.1188 --76.1266 --76.1141 --76.1172 --76.1203 --76.1234 --76.1234 --76.1266 --76.1172 --76.1047 --76.1203 --76.1188 --76.1203 --76.1312 --76.1234 --76.1188 --76.1203 --76.1219 --76.1234 --76.1203 --76.1219 --76.1078 --76.1141 --76.125 --76.1297 --76.1156 --76.1234 --76.1234 --76.1234 --76.1188 --76.125 --76.1359 --76.1312 --76.1328 --76.1141 --76.1219 --76.1219 --76.1219 --76.1125 --76.125 --76.1156 --76.1328 --76.1359 --76.1266 --76.1234 --76.1188 --76.1156 --76.1266 --76.1281 --76.1203 --76.1375 --76.1172 --76.1219 --76.1344 --76.1234 --76.1281 --76.1281 --76.1406 --76.1312 --76.1266 --76.1328 --76.1125 --76.1234 --76.1375 --76.1344 --76.1297 --76.1219 --76.125 --76.125 --76.1297 --76.1297 --76.1484 --76.1328 --76.1234 --76.1422 --76.1281 --76.1234 --76.1297 --76.1188 --76.125 --76.125 --76.1234 --76.1203 --76.1375 --76.1141 --76.1156 --76.125 --76.1156 --76.1312 --76.1219 --76.1281 --76.1266 --76.1203 --76.1219 --76.1172 --76.125 --76.1219 --76.1234 --76.1094 --76.1312 --76.125 --76.1094 --76.125 --76.125 --76.1219 --76.1141 --76.1219 --76.125 --76.1109 --76.125 --76.1172 --76.1281 --76.1234 --76.1219 --76.1172 --76.1266 --76.1312 --76.1109 --76.125 --76.1188 --76.1219 --76.1219 --76.1172 --76.1344 --76.1094 --76.1266 --76.1219 --76.1234 --76.1281 --76.1188 --76.1375 --76.1297 --76.1266 --76.1422 --76.1328 --76.1375 --76.1281 --76.1406 --76.1547 --76.1375 --76.1359 --76.1422 --76.1406 --76.1438 --76.1234 --76.1156 --76.1422 --76.1453 --76.1234 --76.1359 --76.1391 --76.1219 --76.1453 --76.1422 --76.1391 --76.1328 --76.1469 --76.1297 --76.1344 --76.1297 --76.1422 --76.1344 --76.1375 --76.1453 --76.1234 --76.1297 --76.1359 --76.1406 --76.1469 --76.1266 --76.1359 --76.1328 --76.125 --76.1234 --76.1406 --76.1344 --76.1359 --76.1281 --76.1328 --76.1391 --76.1312 --76.1281 --76.1219 --76.1266 --76.125 --76.1312 --76.1219 --76.1344 --76.1172 --76.1125 --76.1156 --76.1156 --76.1141 --76.1094 --76.1094 --76.1281 --76.1203 --76.1109 --76.1234 --76.1234 --76.1156 --76.1266 --76.1312 --76.1234 --76.1312 --76.1312 --76.1281 --76.1312 --76.1359 --76.1312 --76.1172 --76.125 --76.1281 --76.125 --76.1281 --76.1344 --76.1234 --76.1266 --76.1344 --76.1359 --76.1297 --76.1328 --76.1266 --76.1203 --76.125 --76.125 --76.1359 --76.1375 --76.1281 --76.15 --76.1312 --76.125 --76.125 --76.1266 --76.1172 --76.1281 --76.1219 --76.1312 --76.1312 --76.1453 --76.1344 --76.1328 --76.1375 --76.1297 --76.1453 --76.125 --76.1375 --76.1328 --76.1312 --76.1188 --76.1297 --76.15 --76.1219 --76.1359 --76.1422 --76.1344 --76.15 --76.1281 --76.1297 --76.1422 --76.1328 --76.1266 --76.1297 --76.1281 --76.1422 --76.1484 --76.1219 --76.1281 --76.1266 --76.1266 --76.1266 --76.1234 --76.1219 --76.1297 --76.1219 --76.1266 --76.1312 --76.125 --76.1156 --76.1266 --76.1203 --76.1297 --76.1109 --76.1422 --76.1156 --76.1156 --76.1141 --76.1156 --76.1109 --76.1266 --76.1203 --76.1219 --76.1203 --76.1375 --76.1312 --76.125 --76.1312 --76.1234 --76.1297 --76.1266 --76.1312 --76.1359 --76.1344 --76.1344 --76.1344 --76.1391 --76.1359 --76.1375 --76.1172 --76.1453 --76.1344 --76.1297 --76.1281 --76.1562 --76.1281 --76.1344 --76.1312 --76.1312 --76.1172 --76.1234 --76.1234 --76.1359 --76.1359 --76.1203 --76.1391 --76.1266 --76.1281 --76.1281 --76.1266 --76.1266 --76.1297 --76.1297 --76.1297 --76.1344 --76.1391 --76.1375 --76.1281 --76.1266 --76.1281 --76.125 --76.1219 --76.1234 --76.1266 --76.1297 --76.1188 --76.125 --76.1266 --76.1266 --76.1281 --76.1297 --76.1172 --76.1109 --76.1172 --76.1203 --76.1125 --76.1266 --76.1234 --76.1078 --76.1297 --76.1188 --76.1297 --76.1312 --76.1234 --76.1203 --76.1203 --76.1078 --76.1094 --76.1297 --76.1375 --76.1297 --76.1234 --76.1203 --76.1297 --76.1422 --76.1312 --76.1172 --76.1156 --76.1156 --76.1156 --76.1172 --76.1156 --76.1156 --76.1141 --76.1297 --76.1281 --76.1188 --76.1219 --76.1188 --76.1219 --76.1297 --76.1266 --76.1266 --76.1125 --76.1125 --76.1078 --76.1297 --76.1203 --76.1297 --76.1219 --76.1172 --76.1266 --76.1156 --76.1328 --76.1281 --76.1328 --76.1266 --76.1375 --76.1312 --76.1234 --76.1281 --76.1234 --76.1281 --76.1391 --76.1328 --76.1344 --76.1359 --76.1375 --76.1172 --76.1359 --76.1281 --76.1344 --76.1234 --76.1344 --76.1312 --76.1281 --76.1281 --76.1422 --76.1359 --76.125 --76.1234 --76.15 --76.1203 --76.1219 --76.1375 --76.1375 --76.1406 --76.1484 --76.1281 --76.1234 --76.1406 --76.1312 --76.1484 --76.1422 --76.1422 --76.1266 --76.1359 --76.1359 --76.1406 --76.1422 --76.1422 --76.1375 --76.1438 --76.1281 --76.1453 --76.1375 --76.1375 --76.1438 --76.1359 --76.1297 --76.1219 --76.1312 --76.1438 --76.1297 --76.1391 --76.1375 --76.1219 --76.1281 --76.1375 --76.1203 --76.1141 --76.1219 --76.125 --76.1141 --76.1266 --76.1188 --76.1422 --76.1219 --76.1156 --76.1188 --76.1234 --76.1172 --76.1203 --76.1047 --76.1172 --76.1312 --76.1344 --76.1266 --76.1344 --76.1281 --76.1297 --76.1297 --76.1266 --76.1344 --76.1203 --76.1188 --76.1125 --76.1172 --76.1141 --76.1109 --76.1094 --76.1125 --76.125 --76.1375 --76.1219 --76.125 --76.1266 --76.1078 --76.1359 --76.1266 --76.1266 --76.1297 --76.1109 --76.1391 --76.125 --76.125 --76.1328 --76.1219 --76.1297 --76.1234 --76.1266 --76.1219 --76.1203 --76.125 --76.1172 --76.1094 --76.1375 --76.1156 --76.1281 --76.1172 --76.1203 --76.1172 --76.1141 --76.1078 --76.1094 --76.1078 --76.1203 --76.1125 --76.1219 --76.1141 --76.1141 --76.1281 --76.1141 --76.1219 --76.1094 --76.1062 --76.1281 --76.1078 --76.1156 --76.1234 --76.1188 --76.1078 --76.1234 --76.1156 --76.1156 --76.1125 --76.1094 --76.1109 --76.1109 --76.1156 --76.1203 --76.1297 --76.1172 --76.1172 --76.1141 --76.1141 --76.1125 --76.1234 --76.125 --76.1109 --76.1047 --76.1141 --76.1094 --76.1094 --76.1141 --76.1172 --76.125 --76.1312 --76.1219 --76.1188 --76.125 --76.1188 --76.1156 --76.1188 --76.1266 --76.1203 --76.1188 --76.1094 --76.1109 --76.1 --76.1156 --76.1203 --76.1078 --76.1078 --76.1125 --76.1109 --76.1062 --76.1172 --76.1031 --76.1062 --76.1203 --76.1219 --76.1031 --76.1203 --76.1109 --76.1031 --76.1094 --76.1188 --76.1125 --76.1109 --76.1094 --76.1156 --76.1078 --76.1016 --76.1141 --76.1016 --76.1219 --76.1203 --76.1125 --76.1016 --76.1219 --76.1109 --76.1219 --76.1156 --76.1234 --76.1203 --76.125 --76.1391 --76.1359 --76.1312 --76.1328 --76.125 --76.1188 --76.1188 --76.1219 --76.1219 --76.1156 --76.125 --76.1188 --76.1344 --76.1328 --76.125 --76.1094 --76.1156 --76.1172 --76.1109 --76.1203 --76.1219 --76.1047 --76.1219 --76.1125 --76.1109 --76.1078 --76.1109 --76.1047 --76.1219 --76.1062 --76.1062 --76.1109 --76.1156 --76.1156 --76.1203 --76.0984 --76.1094 --76.1188 --76.1281 --76.1297 --76.1172 --76.1312 --76.1172 --76.1156 --76.1266 --76.1219 --76.125 --76.1156 --76.1281 --76.1047 --76.1156 --76.1234 --76.1328 --76.1234 --76.1219 --76.1266 --76.1141 --76.1141 --76.1203 --76.1312 --76.1266 --76.1188 --76.125 --76.1328 --76.1188 --76.1266 --76.1172 --76.1188 --76.1234 --76.1219 --76.1078 --76.1172 --76.1234 --76.1203 --76.1203 --76.1125 --76.1094 --76.1141 --76.1297 --76.1188 --76.1297 --76.1219 --76.1141 --76.1109 --76.1188 --76.1156 --76.1203 --76.1062 --76.1062 --76.1125 --76.1188 --76.1141 --76.1094 --76.1125 --76.1219 --76.1406 --76.1328 --76.125 --76.1188 --76.1141 --76.125 --76.125 --76.1 --76.125 --76.1312 --76.1141 --76.1172 --76.1062 --76.1344 --76.1109 --76.1141 --76.1219 --76.1172 --76.1219 --76.1 --76.1141 --76.1109 --76.1188 --76.1172 --76.1172 --76.1328 --76.1156 --76.1172 --76.1188 --76.1219 --76.1109 --76.1172 --76.1266 --76.1188 --76.1234 --76.1188 --76.125 --76.1141 --76.1141 --76.1172 --76.125 --76.0953 --76.1094 --76.1109 --76.1188 --76.1125 --76.125 --76.1125 --76.1219 --76.1141 --76.1312 --76.1203 --76.1125 --76.1234 --76.1125 --76.1219 --76.1188 --76.1234 --76.1047 --76.1234 --76.1297 --76.1281 --76.1266 --76.1156 --76.1141 --76.1219 --76.1141 --76.1297 --76.1234 --76.1203 --76.1234 --76.1016 --76.1156 --76.1234 --76.1109 --76.1172 --76.1188 --76.1078 --76.1078 --76.1156 --76.1203 --76.1172 --76.1297 --76.1219 --76.1281 --76.1234 --76.1375 --76.1094 --76.1281 --76.1266 --76.1219 --76.1141 --76.1031 --76.1266 --76.1219 --76.1062 --76.1234 --76.1141 --76.1109 --76.1016 --76.1109 --76.125 --76.1125 --76.1266 --76.1141 --76.1141 --76.1234 --76.1203 --76.1156 --76.1094 --76.1312 --76.1125 --76.1141 --76.1359 --76.1188 --76.1188 --76.1109 --76.1188 --76.1094 --76.1078 --76.1281 --76.1375 --76.1078 --76.1219 --76.125 --76.1141 --76.1172 --76.1 --76.1203 --76.1156 --76.1281 --76.1219 --76.125 --76.125 --76.125 --76.1266 --76.1172 --76.1078 --76.1141 --76.1156 --76.1203 --76.1172 --76.1109 --76.1094 --76.1094 --76.1234 --76.125 --76.1203 --76.1156 --76.1125 --76.1172 --76.1047 --76.1078 --76.1266 --76.1219 --76.1156 --76.1094 --76.1078 --76.1109 --76.1047 --76.1219 --76.1203 --76.1062 --76.1203 --76.1125 --76.1234 --76.1156 --76.1188 --76.1078 --76.1109 --76.1109 --76.1125 --76.1203 --76.1125 --76.1047 --76.1156 --76.1109 --76.1062 --76.1141 --76.1109 --76.1078 --76.1062 --76.1078 --76.1031 --76.1281 --76.1062 --76.1047 --76.1125 --76.1172 --76.1156 --76.1125 --76.1062 --76.1188 --76.1078 --76.1125 --76.0938 --76.1234 --76.1266 --76.1188 --76.1234 --76.1031 --76.1078 --76.125 --76.1281 --76.1219 --76.1156 --76.1234 --76.1172 --76.1234 --76.1234 --76.1109 --76.1156 --76.1156 --76.125 --76.1234 --76.1031 --76.1203 --76.1203 --76.1266 --76.1156 --76.1359 --76.1172 --76.1188 --76.1203 --76.1141 --76.125 --76.1219 --76.1406 --76.1203 --76.1078 --76.1125 --76.1094 --76.1172 --76.1219 --76.1188 --76.1078 --76.1234 --76.1219 --76.1125 --76.1109 --76.125 --76.1125 --76.1156 --76.0984 --76.1156 --76.1156 --76.1141 --76.1125 --76.125 --76.1031 --76.1062 --76.1172 --76.1078 --76.1078 --76.1172 --76.1172 --76.0969 --76.1078 --76.1266 --76.1141 --76.1266 --76.1 --76.1125 --76.1156 --76.1141 --76.1172 --76.1156 --76.1125 --76.1234 --76.1062 --76.1062 --76.0984 --76.1078 --76.1125 --76.1078 --76.1219 --76.1234 --76.1219 --76.1188 --76.1156 --76.1234 --76.1188 --76.1219 --76.1094 --76.1203 --76.1219 --76.1156 --76.1234 --76.1188 --76.1141 --76.1156 --76.1141 --76.0938 --76.1172 --76.1094 --76.1219 --76.1172 --76.1094 --76.1078 --76.1016 --76.1172 --76.1172 --76.1203 --76.1234 --76.1109 --76.1219 --76.125 --76.1094 --76.1234 --76.1312 --76.1156 --76.1281 --76.1109 --76.1266 --76.1281 --76.1203 --76.1281 --76.1391 --76.1234 --76.1281 --76.1344 --76.1172 --76.1297 --76.1328 --76.1234 --76.1203 --76.1281 --76.1219 --76.1312 --76.1172 --76.1297 --76.1281 --76.1188 --76.1234 --76.125 --76.125 --76.1188 --76.1219 --76.1281 --76.1172 --76.1234 --76.1188 --76.1109 --76.1031 --76.1125 --76.1141 --76.1266 --76.1062 --76.1109 --76.1109 --76.1188 --76.1188 --76.125 --76.1234 --76.1156 --76.1109 --76.1172 --76.1234 --76.1109 --76.1266 --76.1125 --76.1078 --76.125 --76.125 --76.1141 --76.1156 --76.1203 --76.1234 --76.1062 --76.125 --76.1141 --76.1125 --76.1203 --76.1125 --76.1266 --76.1047 --76.1203 --76.1062 --76.1359 --76.1281 --76.1266 --76.1188 --76.1297 --76.1266 --76.1266 --76.1203 --76.1344 --76.125 --76.1203 --76.1359 --76.1172 --76.1203 --76.1078 --76.1188 --76.1297 --76.1297 --76.125 --76.1188 --76.1188 --76.1297 --76.125 --76.1188 --76.1125 --76.1219 --76.1312 --76.1344 --76.1359 --76.1328 --76.1172 --76.1234 --76.1359 --76.1156 --76.1141 --76.1312 --76.1219 --76.1156 --76.1234 --76.1219 --76.1328 --76.125 --76.1297 --76.1156 --76.1344 --76.125 --76.1359 --76.1359 --76.1266 --76.1297 --76.1266 --76.1312 --76.1188 --76.1203 --76.1219 --76.1172 --76.125 --76.1344 --76.1266 --76.1406 --76.1172 --76.1188 --76.1328 --76.1219 --76.1297 --76.1281 --76.1219 --76.1188 --76.1266 --76.1297 --76.1297 --76.1219 --76.1234 --76.1188 --76.1281 --76.1172 --76.1234 --76.1203 --76.1172 --76.1219 --76.1281 --76.1141 --76.1219 --76.1219 --76.1344 --76.1188 --76.1156 --76.1188 --76.1125 --76.1219 --76.1203 --76.1453 --76.1297 --76.1219 --76.1234 --76.1266 --76.1281 --76.1156 --76.1188 --76.1094 --76.1281 --76.1203 --76.1109 --76.1094 --76.1094 --76.1094 --76.1125 --76.1156 --76.1125 --76.1203 --76.1188 --76.1094 --76.1203 --76.1047 --76.1172 --76.1203 --76.1172 --76.1109 --76.1078 --76.1094 --76.1188 --76.1172 --76.1188 --76.1109 --76.1266 --76.125 --76.1109 --76.1141 --76.1234 --76.1156 --76.1203 --76.1312 --76.1219 --76.1172 --76.1 --76.1203 --76.1156 --76.1141 --76.1234 --76.1172 --76.1078 --76.1188 --76.1188 --76.1062 --76.1094 --76.1172 --76.1125 --76.1188 --76.1203 --76.1125 --76.1156 --76.1234 --76.1109 --76.1172 --76.1172 --76.1219 --76.125 --76.1219 --76.1266 --76.1281 --76.1156 --76.125 --76.1188 --76.1188 --76.1297 --76.1 --76.125 --76.1062 --76.1203 --76.1109 --76.1219 --76.1219 --76.1156 --76.1281 --76.1297 --76.1188 --76.125 --76.1047 --76.1172 --76.1234 --76.1188 --76.1328 --76.1172 --76.125 --76.1312 --76.1344 --76.1172 --76.1156 --76.1359 --76.1047 --76.1172 --76.1234 --76.1234 --76.1172 --76.1219 --76.1234 --76.1234 --76.0969 --76.1094 --76.0984 --76.1094 --76.1094 --76.1156 --76.1188 --76.1188 --76.1141 --76.1109 --76.1188 --76.1172 --76.1172 --76.1344 --76.1234 --76.1047 --76.1219 --76.1203 --76.1156 --76.1156 --76.1094 --76.1188 --76.1156 --76.1219 --76.1219 --76.1172 --76.1234 --76.125 --76.1344 --76.1359 --76.1266 --76.1281 --76.1406 --76.1266 --76.125 --76.1281 --76.125 --76.1406 --76.125 --76.1375 --76.1406 --76.1328 --76.1359 --76.1328 --76.125 --76.1188 --76.1391 --76.1344 --76.1219 --76.1188 --76.1203 --76.1219 --76.125 --76.1219 --76.1234 --76.1328 --76.1266 --76.1141 --76.1312 --76.1125 --76.1203 --76.1312 --76.1188 --76.1125 --76.1188 --76.1234 --76.125 --76.1281 --76.1125 --76.1156 --76.1125 --76.1172 --76.1203 --76.1172 --76.1234 --76.1156 --76.1141 --76.125 --76.1188 --76.1203 --76.1219 --76.1172 --76.1 --76.1156 --76.1172 --76.1062 --76.1203 --76.1109 --76.1109 --76.1219 --76.1141 --76.1203 --76.1234 --76.125 --76.1172 --76.1172 --76.1047 --76.1234 --76.1203 --76.1266 --76.1156 --76.1188 --76.1281 --76.1188 --76.1328 --76.1359 --76.1266 --76.1188 --76.125 --76.1141 --76.1188 --76.1234 --76.1297 --76.1172 --76.1312 --76.1203 --76.1156 --76.1188 --76.1219 --76.1141 --76.1172 --76.1125 --76.1125 --76.1297 --76.1125 --76.1078 --76.1203 --76.1172 --76.1266 --76.1141 --76.1219 --76.1172 --76.1156 --76.1094 --76.1234 --76.1078 --76.1078 --76.1172 --76.1203 --76.0969 --76.1156 --76.1109 --76.1156 --76.1156 --76.1094 --76.1156 --76.1188 --76.1156 --76.1219 --76.1203 --76.1141 --76.1156 --76.1188 --76.1203 --76.1172 --76.1219 --76.1203 --76.1281 --76.1141 --76.1328 --76.125 --76.1234 --76.1047 --76.1094 --76.1031 --76.1219 --76.1344 --76.1203 --76.1125 --76.1125 --76.1141 --76.1156 --76.1125 --76.1125 --76.1141 --76.1031 --76.1125 --76.1375 --76.1109 --76.1203 --76.1094 --76.125 --76.1094 --76.1062 --76.1125 --76.1016 --76.1094 --76.1062 --76.1188 --76.1094 --76.1219 --76.1203 --76.1125 --76.1172 --76.1203 --76.1234 --76.1219 --76.1078 --76.1094 --76.1 --76.1062 --76.1 --76.1094 --76.1203 --76.1078 --76.1062 --76.1078 --76.1234 --76.1094 --76.1094 --76.1047 --76.1031 --76.1094 --76.1156 --76.1047 --76.1 --76.1172 --76.1188 --76.1094 --76.0984 --76.1141 --76.1094 --76.1125 --76.1 --76.1 --76.1078 --76.1109 --76.1 --76.1078 --76.1062 --76.1141 --76.1094 --76.1156 --76.1047 --76.1016 --76.0875 --76.0984 --76.0953 --76.1 --76.0984 --76.1047 --76.1156 --76.1078 --76.0969 --76.1125 --76.1125 --76.1125 --76.0922 --76.1125 --76.1172 --76.1047 --76.1016 --76.1031 --76.0969 --76.0922 --76.1047 --76.0969 --76.1078 --76.1109 --76.1 --76.1125 --76.1031 --76.1031 --76.1203 --76.1156 --76.1234 --76.1094 --76.1156 --76.1125 --76.1031 --76.125 --76.1047 --76.1109 --76.1109 --76.1 --76.1047 --76.1125 --76.1109 --76.1109 --76.1219 --76.1094 --76.0984 --76.1203 --76.1125 --76.1141 --76.1016 --76.1047 --76.1188 --76.1125 --76.1203 --76.1234 --76.1156 --76.1203 --76.1172 --76.1281 --76.1125 --76.1141 --76.1016 --76.1125 --76.1062 --76.1062 --76.0984 --76.1188 --76.1062 --76.1125 --76.1062 --76.0969 --76.1203 --76.1125 --76.1109 --76.1188 --76.0984 --76.1031 --76.1125 --76.1297 --76.1094 --76.1078 --76.1031 --76.1156 --76.1031 --76.1234 --76.0984 --76.1109 --76.1156 --76.1281 --76.1297 --76.1281 --76.1172 --76.1172 --76.1188 --76.1297 --76.1281 --76.1219 --76.1125 --76.1109 --76.1188 --76.1078 --76.1094 --76.1078 --76.1172 --76.1094 --76.1 --76.1172 --76.1109 --76.1125 --76.1188 --76.1172 --76.1203 --76.1188 --76.1156 --76.1297 --76.1094 --76.1219 --76.1172 --76.1234 --76.1141 --76.1141 --76.1156 --76.1047 --76.1141 --76.1219 --76.0984 --76.1094 --76.1219 --76.1219 --76.1141 --76.1094 --76.1078 --76.1094 --76.1109 --76.1125 --76.1047 --76.1156 --76.1031 --76.1141 --76.1125 --76.1125 --76.1281 --76.1109 --76.1062 --76.1219 --76.1188 --76.1109 --76.0953 --76.1031 --76.1125 --76.1156 --76.1125 --76.1141 --76.1219 --76.1094 --76.1047 --76.1172 --76.1141 --76.1141 --76.1156 --76.1047 --76.1141 --76.0938 --76.1094 --76.1031 --76.1094 --76.1266 --76.1078 --76.1062 --76.1 --76.1062 --76.1125 --76.1078 --76.0969 --76.1094 --76.0906 --76.1078 --76.1094 --76.0828 --76.0969 --76.0891 --76.0969 --76.1031 --76.1016 --76.1031 --76.0969 --76.1031 --76.1156 --76.1 --76.1 --76.0984 --76.1078 --76.0922 --76.1156 --76.0906 --76.0891 --76.1047 --76.1109 --76.1062 --76.1 --76.1047 --76.1047 --76.0984 --76.1 --76.1062 --76.1078 --76.1031 --76.1047 --76.1172 --76.1234 --76.1125 --76.1219 --76.0969 --76.0984 --76.1031 --76.1109 --76.1078 --76.1078 --76.1094 --76.1062 --76.1 --76.1125 --76.1203 --76.1062 --76.1125 --76.1172 --76.1125 --76.1094 --76.1109 --76.1047 --76.1125 --76.1141 --76.1062 --76.1188 --76.1141 --76.1203 --76.1203 --76.1094 --76.1188 --76.1125 --76.1141 --76.1219 --76.125 --76.1016 --76.1172 --76.125 --76.1125 --76.1062 --76.1234 --76.1203 --76.1062 --76.1156 --76.1047 --76.1 --76.1062 --76.1219 --76.1094 --76.1047 --76.1016 --76.1172 --76.1016 --76.1047 --76.1047 --76.1172 --76.1031 --76.1016 --76.0938 --76.1078 --76.1062 --76.1016 --76.1047 --76.0938 --76.1125 --76.1047 --76.1047 --76.1062 --76.1016 --76.1172 --76.0906 --76.0938 --76.1094 --76.1031 --76.0969 --76.0984 --76.1047 --76.0969 --76.0969 --76.1047 --76.1062 --76.1047 --76.1016 --76.1016 --76.0969 --76.0813 --76.1188 --76.1156 --76.1047 --76.1031 --76.1172 --76.0953 --76.1078 --76.1109 --76.1125 --76.1047 --76.1047 --76.1094 --76.1078 --76.1156 --76.1047 --76.1062 --76.1109 --76.1125 --76.0953 --76.1062 --76.0969 --76.0938 --76.0969 --76.1047 --76.0938 --76.0953 --76.1125 --76.0828 --76.0969 --76.0984 --76.0984 --76.0984 --76.0922 --76.0875 --76.0969 --76.0875 --76.1 --76.0938 --76.0906 --76.0953 --76.0906 --76.0953 --76.0828 --76.0969 --76.0906 --76.0891 --76.0859 --76.0953 --76.0828 --76.0938 --76.0922 --76.1078 --76.0984 --76.0953 --76.0938 --76.1 --76.0984 --76.0953 --76.0922 --76.0953 --76.1031 --76.0875 --76.1031 --76.0984 --76.0922 --76.0906 --76.1047 --76.1031 --76.1094 --76.1016 --76.0984 --76.0938 --76.1062 --76.1109 --76.1 --76.0922 --76.1031 --76.0969 --76.1 --76.1094 --76.1016 --76.1094 --76.0984 --76.1016 --76.1188 --76.1 --76.0922 --76.1141 --76.0813 --76.0859 --76.0953 --76.1 --76.0922 --76.1 --76.1016 --76.1031 --76.0875 --76.0938 --76.0922 --76.1 --76.0969 --76.1062 --76.0906 --76.1016 --76.0984 --76.0875 --76.0938 --76.1047 --76.1 --76.0813 --76.0906 --76.1141 --76.0953 --76.1062 --76.0938 --76.0969 --76.0797 --76.0938 --76.0859 --76.0813 --76.1 --76.0859 --76.0844 --76.0953 --76.0797 --76.0828 --76.0906 --76.0969 --76.0922 --76.0969 --76.0875 --76.0828 --76.0922 --76.0922 --76.0781 --76.0859 --76.0813 --76.0984 --76.0844 --76.1078 --76.0953 --76.0922 --76.0891 --76.0938 --76.0781 --76.0875 --76.0969 --76.0813 --76.1094 --76.0859 --76.0906 --76.0938 --76.1078 --76.0969 --76.0906 --76.1016 --76.0922 --76.0969 --76.0891 --76.0766 --76.1016 --76.0906 --76.0875 --76.0938 --76.0766 --76.0953 --76.0875 --76.0813 --76.0938 --76.0797 --76.0891 --76.0797 --76.0875 --76.1 --76.0922 --76.0938 --76.0984 --76.0906 --76.0938 --76.0813 --76.1062 --76.0891 --76.0922 --76.0922 --76.0953 --76.0797 --76.0766 --76.0828 --76.0828 --76.0719 --76.0828 --76.075 --76.0891 --76.0781 --76.0859 --76.0875 --76.0953 --76.0844 --76.0891 --76.0891 --76.0938 --76.0984 --76.0891 --76.0906 --76.0922 --76.1 --76.0938 --76.0953 --76.0875 --76.0891 --76.1125 --76.1 --76.1 --76.1078 --76.1094 --76.0984 --76.1047 --76.1016 --76.1109 --76.1016 --76.0953 --76.1078 --76.1078 --76.0922 --76.1 --76.1156 --76.0969 --76.1078 --76.1 --76.1141 --76.1031 --76.1188 --76.1203 --76.1234 --76.1141 --76.1156 --76.0984 --76.1172 --76.1047 --76.1078 --76.1141 --76.1141 --76.1031 --76.1078 --76.1125 --76.1188 --76.1031 --76.0984 --76.1016 --76.1141 --76.0938 --76.1094 --76.1016 --76.1125 --76.1172 --76.1188 --76.1094 --76.1094 --76.1016 --76.1 --76.1203 --76.1141 --76.1109 --76.1078 --76.1031 --76.1078 --76.1109 --76.1078 --76.1047 --76.1 --76.1094 --76.1031 --76.0969 --76.0984 --76.0922 --76.1062 --76.1125 --76.0984 --76.0875 --76.1094 --76.0938 --76.0953 --76.0969 --76.1 --76.0859 --76.1016 --76.0922 --76.0969 --76.0969 --76.0969 --76.0953 --76.0844 --76.0891 --76.0984 --76.1016 --76.0906 --76.0734 --76.0922 --76.0813 --76.0922 --76.0844 --76.0922 --76.0953 --76.0953 --76.0891 --76.0984 --76.1047 --76.0844 --76.1094 --76.0922 --76.0922 --76.1 --76.0984 --76.0969 --76.1016 --76.0953 --76.0969 --76.0875 --76.1031 --76.0891 --76.0844 --76.1109 --76.0844 --76.0875 --76.0859 --76.0891 --76.0891 --76.0984 --76.1031 --76.0859 --76.0922 --76.0906 --76.0891 --76.0953 --76.0766 --76.0953 --76.0703 --76.1078 --76.0891 --76.0875 --76.1031 --76.0828 --76.0844 --76.0953 --76.0891 --76.0875 --76.0844 --76.0969 --76.0875 --76.0953 --76.0891 --76.0891 --76.0844 --76.0813 --76.0984 --76.0844 --76.0891 --76.0813 --76.0844 --76.0766 --76.0859 --76.0781 --76.0844 --76.0719 --76.0781 --76.0844 --76.0719 --76.0922 --76.0906 --76.1 --76.0859 --76.0828 --76.0938 --76.1047 --76.0859 --76.0906 --76.1062 --76.1078 --76.1031 --76.1016 --76.0969 --76.0891 --76.1062 --76.0922 --76.1078 --76.0906 --76.1062 --76.0922 --76.1016 --76.1062 --76.1016 --76.0938 --76.1062 --76.0969 --76.0813 --76.0938 --76.0906 --76.0984 --76.1016 --76.0984 --76.0969 --76.0938 --76.1047 --76.0938 --76.1 --76.0938 --76.1031 --76.0922 --76.1188 --76.0969 --76.1109 --76.0891 --76.0953 --76.0938 --76.0859 --76.0922 --76.0969 --76.0891 --76.0813 --76.1 --76.0953 --76.0984 --76.0938 --76.0828 --76.1 --76.0828 --76.0922 --76.0828 --76.0922 --76.0922 --76.0938 --76.1016 --76.0781 --76.0844 --76.1031 --76.0938 --76.0938 --76.0969 --76.0922 --76.0984 --76.1031 --76.0984 --76.0969 --76.0938 --76.0938 --76.0969 --76.0969 --76.0703 --76.0891 --76.0891 --76.0797 --76.0984 --76.0891 --76.0938 --76.0672 --76.0859 --76.0844 --76.0906 --76.1031 --76.0922 --76.1047 --76.0922 --76.1062 --76.1047 --76.0969 --76.1016 --76.1016 --76.0953 --76.0891 --76.1031 --76.0969 --76.0922 --76.0891 --76.0922 --76.0922 --76.0844 --76.1 --76.0984 --76.0891 --76.0828 --76.0953 --76.0828 --76.0875 --76.0766 --76.0859 --76.1 --76.075 --76.0797 --76.0922 --76.1062 --76.0828 --76.0922 --76.1016 --76.0734 --76.1094 --76.0938 --76.0891 --76.0875 --76.0797 --76.0828 --76.0766 --76.0938 --76.0859 --76.1016 --76.1 --76.0891 --76.0906 --76.0969 --76.0984 --76.0891 --76.1016 --76.1109 --76.0844 --76.1047 --76.0844 --76.1031 --76.0953 --76.0938 --76.0891 --76.0844 --76.0953 --76.0953 --76.0813 --76.0844 --76.0859 --76.0797 --76.0953 --76.0813 --76.0766 --76.0859 --76.1 --76.0906 --76.0813 --76.0875 --76.0922 --76.0828 --76.0859 --76.075 --76.0734 --76.0891 --76.0766 --76.0875 --76.0719 --76.1062 --76.0875 --76.0844 --76.0875 --76.0859 --76.1031 --76.0938 --76.0938 --76.0906 --76.0938 --76.0828 --76.0859 --76.0969 --76.0891 --76.0875 --76.0906 --76.0922 --76.0828 --76.0953 --76.0953 --76.0922 --76.0641 --76.0953 --76.0859 --76.0953 --76.0813 --76.0875 --76.0797 --76.0781 --76.0781 --76.0875 --76.0766 --76.1031 --76.0953 --76.0797 --76.0984 --76.0953 --76.0906 --76.1031 --76.0875 --76.0938 --76.0844 --76.0938 --76.0953 --76.0859 --76.0891 --76.0797 --76.0844 --76.0875 --76.0844 --76.0828 --76.0938 --76.075 --76.0875 --76.0813 --76.0984 --76.0875 --76.0969 --76.0875 --76.0875 --76.0938 --76.0984 --76.0969 --76.0859 --76.1016 --76.0922 --76.0891 --76.0984 --76.0922 --76.0766 --76.0891 --76.0797 --76.0797 --76.0891 --76.0891 --76.0859 --76.0859 --76.0813 --76.0906 --76.0953 --76.0797 --76.0813 --76.1 --76.0891 --76.1 --76.1 --76.0953 --76.0953 --76.0875 --76.1062 --76.0953 --76.0891 --76.0906 --76.0938 --76.1031 --76.0813 --76.0984 --76.0938 --76.0859 --76.1062 --76.0969 --76.0969 --76.1031 --76.1172 --76.0969 --76.1078 --76.1047 --76.0875 --76.1 --76.1031 --76.0906 --76.1062 --76.0891 --76.1047 --76.1062 --76.1047 --76.0922 --76.0906 --76.0844 --76.0859 --76.0891 --76.0797 --76.0844 --76.1016 --76.0969 --76.0984 --76.1031 --76.0875 --76.0781 --76.0828 --76.0922 --76.0922 --76.0922 --76.0906 --76.0859 --76.0859 --76.1 --76.0891 --76.0922 --76.0766 --76.0906 --76.0828 --76.1031 --76.0813 --76.0875 --76.1 --76.0922 --76.0938 --76.0859 --76.0875 --76.0906 --76.0953 --76.0906 --76.0969 --76.1078 --76.0938 --76.0922 --76.0938 --76.0844 --76.0813 --76.0906 --76.0953 --76.1 --76.1016 --76.1016 --76.1109 --76.0828 --76.0906 --76.0813 --76.0875 --76.0844 --76.1 --76.0922 --76.0875 --76.1047 --76.1094 --76.1031 --76.0938 --76.0891 --76.0859 --76.0906 --76.0938 --76.0969 --76.0938 --76.0875 --76.0891 --76.0906 --76.0906 --76.0797 --76.0953 --76.0875 --76.0844 --76.0922 --76.0891 --76.0891 --76.1 --76.0891 --76.1094 --76.0953 --76.1047 --76.0891 --76.1016 --76.1031 --76.1062 --76.0938 --76.0828 --76.0844 --76.1078 --76.0969 --76.0984 --76.0953 --76.1 --76.1016 --76.1078 --76.0984 --76.1 --76.0969 --76.1016 --76.0906 --76.0828 --76.0813 --76.0906 --76.0984 --76.0922 --76.0891 --76.0906 --76.0938 --76.0906 --76.0969 --76.0984 --76.0859 --76.1 --76.0953 --76.1 --76.0922 --76.0891 --76.1062 --76.0875 --76.0953 --76.0906 --76.0953 --76.0938 --76.0859 --76.0891 --76.0938 --76.1078 --76.0828 --76.0766 --76.0844 --76.0938 --76.1 --76.0891 --76.0969 --76.1062 --76.1016 --76.1062 --76.0891 --76.1 --76.1047 --76.0875 --76.0906 --76.0906 --76.0984 --76.0906 --76.0938 --76.0938 --76.0828 --76.0922 --76.0953 --76.0875 --76.0797 --76.1016 --76.0859 --76.0906 --76.0813 --76.0844 --76.0844 --76.0859 --76.0969 --76.0984 --76.0953 --76.0969 --76.0906 --76.1062 --76.0813 --76.0984 --76.0938 --76.0906 --76.0922 --76.0813 --76.0922 --76.0953 --76.0875 --76.0938 --76.1016 --76.0938 --76.0844 --76.0844 --76.0969 --76.0781 --76.0875 --76.0969 --76.1016 --76.0922 --76.0906 --76.0969 --76.1 --76.0938 --76.0984 --76.0844 --76.0984 --76.0984 --76.0953 --76.0891 --76.0938 --76.0922 --76.0922 --76.0984 --76.0953 --76.0703 --76.0891 --76.1031 --76.0922 --76.0922 --76.1031 --76.1 --76.1 --76.1031 --76.0891 --76.1031 --76.0953 --76.0875 --76.1031 --76.1047 --76.1031 --76.1016 --76.1 --76.1031 --76.0938 --76.1016 --76.1031 --76.0844 --76.0984 --76.0844 --76.1016 --76.0938 --76.1078 --76.1 --76.1031 --76.1234 --76.0922 --76.0969 --76.0891 --76.0813 --76.1094 --76.0953 --76.1 --76.1062 --76.0891 --76.0969 --76.1078 --76.1031 --76.1047 --76.0953 --76.1031 --76.0969 --76.0938 --76.1031 --76.0938 --76.0938 --76.0859 --76.0953 --76.0938 --76.0859 --76.0969 --76.0969 --76.0984 --76.0953 --76.0922 --76.0844 --76.1156 --76.1016 --76.125 --76.1047 --76.0891 --76.0984 --76.1016 --76.1062 --76.1 --76.1078 --76.0953 --76.1031 --76.0922 --76.0875 --76.1 --76.1016 --76.0906 --76.0922 --76.1156 --76.0797 --76.0984 --76.0969 --76.1016 --76.0875 --76.0828 --76.0984 --76.0875 --76.0984 --76.0984 --76.0984 --76.0828 --76.0969 --76.1047 --76.0875 --76.0953 --76.0953 --76.1062 --76.0906 --76.0906 --76.0875 --76.0891 --76.0984 --76.1047 --76.1078 --76.1016 --76.0938 --76.1 --76.1 --76.1094 --76.0922 --76.1016 --76.0891 --76.0906 --76.0844 --76.1156 --76.1016 --76.1062 --76.0953 --76.0984 --76.1125 --76.0984 --76.1031 --76.0906 --76.1062 --76.0984 --76.1172 --76.1062 --76.0844 --76.1125 --76.0922 --76.1094 --76.0906 --76.0984 --76.0875 --76.0984 --76.0891 --76.0891 --76.1 --76.0813 --76.1109 --76.1094 --76.1062 --76.0875 --76.0859 --76.0828 --76.1062 --76.0891 --76.0984 --76.0984 --76.0984 --76.0891 --76.1016 --76.0766 --76.0953 --76.0938 --76.0891 --76.0906 --76.1094 --76.0859 --76.0891 --76.1078 --76.0969 --76.1 --76.1 --76.0969 --76.1047 --76.0906 --76.0813 --76.0875 --76.0813 --76.1016 --76.0875 --76.1125 --76.1125 --76.1 --76.0906 --76.0984 --76.1047 --76.0984 --76.0969 --76.0891 --76.1062 --76.0906 --76.1016 --76.0906 --76.0953 --76.1 --76.1031 --76.1109 --76.0906 --76.0906 --76.1141 --76.0938 --76.1062 --76.1109 --76.0922 --76.0969 --76.1031 --76.1188 --76.0891 --76.0953 --76.1156 --76.1062 --76.0922 --76.1047 --76.0859 --76.0813 --76.0891 --76.0922 --76.1094 --76.0938 --76.0938 --76.1094 --76.1031 --76.0875 --76.0906 --76.1 --76.0922 --76.0984 --76.0938 --76.0844 --76.0922 --76.0906 --76.0969 --76.0953 --76.1 --76.0984 --76.0938 --76.1047 --76.0969 --76.0891 --76.0922 --76.0813 --76.1 --76.0953 --76.0938 --76.0938 --76.0938 --76.1078 --76.0953 --76.075 --76.0906 --76.0891 --76.0875 --76.1031 --76.0891 --76.1016 --76.0766 --76.0844 --76.0719 --76.0922 --76.1031 --76.0844 --76.0891 --76.0984 --76.0922 --76.0953 --76.0844 --76.0891 --76.0875 --76.0922 --76.0797 --76.0891 --76.0891 --76.1 --76.0984 --76.1016 --76.0938 --76.0938 --76.0984 --76.1031 --76.0969 --76.1 --76.0906 --76.1031 --76.1125 --76.0859 --76.0938 --76.1031 --76.0938 --76.0938 --76.0984 --76.0953 --76.0875 --76.0922 --76.0875 --76.1031 --76.0953 --76.0922 --76.1 --76.1031 --76.0938 --76.0984 --76.0766 --76.1109 --76.0938 --76.0969 --76.0797 --76.0969 --76.0953 --76.0953 --76.1047 --76.0891 --76.0922 --76.0984 --76.0844 --76.0953 --76.0984 --76.0922 --76.0859 --76.1 --76.0969 --76.0969 --76.0922 --76.0922 --76.1109 --76.0969 --76.0938 --76.0984 --76.1062 --76.1078 --76.0875 --76.1047 --76.0969 --76.0938 --76.1172 --76.0906 --76.0859 --76.1078 --76.0906 --76.1016 --76.0922 --76.1094 --76.0906 --76.1047 --76.0906 --76.1016 --76.0969 --76.0984 --76.0938 --76.1031 --76.1125 --76.0953 --76.0984 --76.0922 --76.0969 --76.1172 --76.0922 --76.0875 --76.1078 --76.1 --76.0969 --76.1 --76.0969 --76.0953 --76.1 --76.0906 --76.0969 --76.0969 --76.0687 --76.0969 --76.0859 --76.0859 --76.0938 --76.0953 --76.0906 --76.0891 --76.0969 --76.0969 --76.0938 --76.0797 --76.0875 --76.0875 --76.0859 --76.1047 --76.0813 --76.0906 --76.0922 --76.0844 --76.0984 --76.0953 --76.0891 --76.0906 --76.0906 --76.0859 --76.0844 --76.0922 --76.0922 --76.0984 --76.1 --76.1016 --76.1109 --76.1125 --76.1 --76.0906 --76.0875 --76.0859 --76.0906 --76.0844 --76.0813 --76.0906 --76.0828 --76.0938 --76.0891 --76.0859 --76.0828 --76.0906 --76.0875 --76.0969 --76.0828 --76.0953 --76.0875 --76.0922 --76.0984 --76.1 --76.0781 --76.075 --76.0875 --76.0813 --76.0813 --76.0891 --76.0813 --76.0766 --76.0859 --76.0891 --76.0953 --76.0797 --76.0797 --76.0766 --76.0906 --76.0984 --76.0906 --76.0969 --76.0938 --76.0891 --76.0953 --76.0859 --76.1016 --76.0953 --76.1031 --76.0891 --76.0891 --76.1031 --76.0906 --76.0891 --76.0984 --76.0828 --76.0969 --76.0813 --76.0938 --76.0938 --76.1031 --76.0969 --76.0938 --76.1 --76.0859 --76.0813 --76.0797 --76.0844 --76.0953 --76.0891 --76.0844 --76.075 --76.0938 --76.0953 --76.0953 --76.0828 --76.0797 --76.0938 --76.0891 --76.0906 --76.0891 --76.0766 --76.0969 --76.0859 --76.0797 --76.1016 --76.0906 --76.0781 --76.0875 --76.0938 --76.0813 --76.0766 --76.0766 --76.0891 --76.0844 --76.0891 --76.0797 --76.0969 --76.0859 --76.1062 --76.0906 --76.0906 --76.1 --76.0891 --76.0828 --76.0906 --76.0844 --76.0906 --76.0844 --76.0906 --76.0953 --76.0844 --76.0891 --76.0906 --76.0859 --76.0813 --76.0797 --76.0781 --76.0859 --76.1016 --76.0828 --76.0875 --76.1016 --76.0828 --76.0922 --76.0969 --76.0891 --76.0734 --76.0734 --76.0938 --76.1031 --76.0969 --76.0703 --76.0875 --76.0844 --76.0766 --76.0906 --76.0875 --76.1 --76.0859 --76.0891 --76.0938 --76.0781 --76.0813 --76.0969 --76.0781 --76.1016 --76.0969 --76.0891 --76.0813 --76.0859 --76.0781 --76.0969 --76.1031 --76.075 --76.0828 --76.0859 --76.0813 --76.1016 --76.1016 --76.0813 --76.0859 --76.0781 --76.0844 --76.0969 --76.0859 --76.0859 --76.0922 --76.0813 --76.0891 --76.0891 --76.0875 --76.0766 --76.0844 --76.0906 --76.0859 --76.0891 --76.0844 --76.0844 --76.0859 --76.0828 --76.0859 --76.0844 --76.0953 --76.0797 --76.0797 --76.0844 --76.0844 --76.0781 --76.0625 --76.0781 --76.0687 --76.0938 --76.0766 --76.0813 --76.075 --76.0797 --76.0797 --76.0938 --76.0703 --76.0891 --76.0844 --76.0687 --76.0969 --76.075 --76.0953 --76.0875 --76.0781 --76.0875 --76.0734 --76.0953 --76.0906 --76.0953 --76.0906 --76.0953 --76.0813 --76.0656 --76.0953 --76.0766 --76.0703 --76.0984 --76.0859 --76.0922 --76.0844 --76.0859 --76.0813 --76.0828 --76.0875 --76.0844 --76.0922 --76.0844 --76.0859 --76.0922 --76.0875 --76.0906 --76.0859 --76.0922 --76.0844 --76.0859 --76.0922 --76.0859 --76.0938 --76.0797 --76.0875 --76.0859 --76.0859 --76.0797 --76.0906 --76.0797 --76.0797 --76.0797 --76.0828 --76.0844 --76.0766 --76.0797 --76.0656 --76.0844 --76.0766 --76.0641 --76.0875 --76.0797 --76.0797 --76.0766 --76.0781 --76.0734 --76.0844 --76.075 --76.0891 --76.0703 --76.0828 --76.0703 --76.0719 --76.0984 --76.0734 --76.0766 --76.0703 --76.0734 --76.0672 --76.0734 --76.0656 --76.0766 --76.075 --76.0672 --76.0781 --76.0656 --76.0687 --76.0719 --76.0859 --76.0766 --76.0656 --76.0656 --76.075 --76.0687 --76.0828 --76.0781 --76.0734 --76.0828 --76.0828 --76.075 --76.0781 --76.0891 --76.0828 --76.0719 --76.0797 --76.0734 --76.0719 --76.0813 --76.0656 --76.0844 --76.0844 --76.0891 --76.0609 --76.0734 --76.0813 --76.0719 --76.0781 --76.0703 --76.0813 --76.0875 --76.075 --76.0766 --76.0906 --76.0797 --76.0703 --76.0906 --76.075 --76.0781 --76.0672 --76.0875 --76.0797 --76.0656 --76.0734 --76.0922 --76.0875 --76.0828 --76.0703 --76.0734 --76.0813 --76.0844 --76.0781 --76.0875 --76.0891 --76.0953 --76.0828 --76.0703 --76.0734 --76.0828 --76.0828 --76.0687 --76.0922 --76.0813 --76.0813 --76.0766 --76.0859 --76.0875 --76.0781 --76.075 --76.0672 --76.0828 --76.0641 --76.0797 --76.0703 --76.0797 --76.0703 --76.0813 --76.0734 --76.0734 --76.0781 --76.0828 --76.0844 --76.0844 --76.0734 --76.0766 --76.0844 --76.0594 --76.0781 --76.0719 --76.0609 --76.0641 --76.0641 --76.0641 --76.0703 --76.0687 --76.075 --76.0734 --76.0672 --76.0719 --76.0609 --76.0797 --76.0734 --76.0656 --76.0672 --76.0563 --76.0594 --76.0625 --76.075 --76.0797 --76.0766 --76.0813 --76.0672 --76.0687 --76.075 --76.0797 --76.0687 --76.0766 --76.0656 --76.0656 --76.0578 --76.0641 --76.0734 --76.0719 --76.0672 --76.0813 --76.0656 --76.0641 --76.0656 --76.0625 --76.0609 --76.0734 --76.0813 --76.0672 --76.0625 --76.075 --76.0641 --76.0734 --76.0734 --76.0703 --76.0625 --76.0781 --76.0687 --76.0703 --76.0641 --76.0703 --76.0828 --76.0687 --76.0969 --76.0641 --76.0656 --76.0781 --76.0656 --76.075 --76.0781 --76.0719 --76.0781 --76.0672 --76.0828 --76.075 --76.0703 --76.075 --76.0672 --76.0797 --76.0656 --76.0672 --76.0578 --76.0625 --76.0641 --76.075 --76.0781 --76.0781 --76.0703 --76.0844 --76.0734 --76.0734 --76.0703 --76.0625 --76.0781 --76.0719 --76.0672 --76.0469 --76.0766 --76.0531 --76.0594 --76.0703 --76.0719 --76.0531 --76.0625 --76.0625 --76.0609 --76.0469 --76.05 --76.0703 --76.0672 --76.0687 --76.0656 --76.0453 --76.0641 --76.0609 --76.0594 --76.0703 --76.0719 --76.0687 --76.0609 --76.0609 --76.0703 --76.0641 --76.0672 --76.0734 --76.0672 --76.0734 --76.075 --76.0578 --76.0547 --76.0656 --76.0766 --76.0641 --76.0656 --76.0719 --76.0641 --76.0703 --76.0719 --76.0813 --76.0734 --76.0734 --76.0672 --76.0781 --76.0859 --76.0703 --76.0672 --76.0687 --76.0656 --76.0797 --76.0594 --76.0687 --76.0641 --76.0609 --76.0766 --76.0797 --76.0719 --76.0656 --76.0656 --76.0672 --76.0578 --76.0453 --76.0625 --76.0609 --76.0641 --76.0703 --76.0813 --76.0687 --76.0547 --76.0547 --76.0578 --76.0516 --76.075 --76.0609 --76.0734 --76.0687 --76.0734 --76.0781 --76.0703 --76.0641 --76.0703 --76.0719 --76.0578 --76.0734 --76.0578 --76.0625 --76.0641 --76.0563 --76.0563 --76.0766 --76.0516 --76.05 --76.0609 --76.0641 --76.0516 --76.0656 --76.0641 --76.0625 --76.0687 --76.0594 --76.0594 --76.0672 --76.0594 --76.0625 --76.075 --76.0672 --76.0563 --76.0625 --76.0609 --76.0531 --76.0547 --76.0672 --76.0563 --76.0406 --76.0437 --76.0719 --76.0641 --76.0437 --76.0453 --76.0641 --76.0563 --76.0672 --76.0547 --76.0578 --76.0563 --76.0547 --76.0703 --76.05 --76.0719 --76.0781 --76.0703 --76.075 --76.0578 --76.0609 --76.0656 --76.0391 --76.0594 --76.0578 --76.0578 --76.0563 --76.0625 --76.0563 --76.0625 --76.0609 --76.0563 --76.0672 --76.0531 --76.0625 --76.0547 --76.0641 --76.0609 --76.0719 --76.0547 --76.0484 --76.075 --76.0563 --76.0703 --76.075 --76.0594 --76.0516 --76.0719 --76.0547 --76.0563 --76.0641 --76.0766 --76.0687 --76.0625 --76.05 --76.0531 --76.0547 --76.0594 --76.05 --76.0734 --76.0656 --76.0609 --76.0563 --76.0563 --76.0641 --76.0625 --76.0672 --76.0547 --76.0563 --76.0641 --76.0594 --76.0672 --76.0594 --76.0641 --76.0609 --76.0437 --76.0609 --76.0547 --76.0578 --76.0656 --76.0734 --76.0391 --76.0547 --76.0594 --76.0547 --76.0703 --76.0609 --76.0594 --76.0578 --76.0547 --76.0594 --76.0609 --76.0703 --76.0656 --76.0609 --76.0484 --76.0594 --76.0516 --76.0578 --76.0453 --76.0531 --76.0687 --76.0578 --76.0656 --76.0609 --76.0563 --76.0625 --76.0609 --76.075 --76.0563 --76.0641 --76.0484 --76.0656 --76.0516 --76.0406 --76.0453 --76.0422 --76.05 --76.0437 --76.0516 --76.0422 --76.05 --76.0625 --76.0563 --76.0625 --76.0563 --76.05 --76.0516 --76.0609 --76.0594 --76.0531 --76.0484 --76.0469 --76.0437 --76.0406 --76.0453 --76.0516 --76.0531 --76.0484 --76.0547 --76.0547 --76.0453 --76.0531 --76.0469 --76.0469 --76.0594 --76.0453 --76.0578 --76.0437 --76.0547 --76.0703 --76.0578 --76.0609 --76.0437 --76.0625 --76.05 --76.0453 --76.0578 --76.05 --76.0578 --76.0641 --76.0656 --76.0656 --76.0625 --76.0672 --76.0563 --76.0531 --76.0547 --76.0422 --76.0641 --76.0594 --76.0547 --76.0531 --76.0516 --76.0578 --76.0641 --76.0469 --76.0609 --76.0531 --76.0609 --76.05 --76.0469 --76.05 --76.0484 --76.0453 --76.0469 --76.0531 --76.0609 --76.0578 --76.0516 --76.0484 --76.0641 --76.0516 --76.05 --76.0453 --76.0578 --76.0547 --76.0563 --76.0703 --76.0563 --76.0672 --76.0563 --76.0641 --76.0641 --76.0641 --76.0609 --76.075 --76.0531 --76.0672 --76.0625 --76.0563 --76.0656 --76.0516 --76.0453 --76.0563 --76.0656 --76.0609 --76.0703 --76.0625 --76.0594 --76.0625 --76.0516 --76.0672 --76.0563 --76.0563 --76.075 --76.0672 --76.0578 --76.0625 --76.0547 --76.0578 --76.0625 --76.0625 --76.0516 --76.0625 --76.0672 --76.0609 --76.0594 --76.05 --76.0531 --76.0672 --76.0453 --76.0578 --76.0594 --76.05 --76.0625 --76.0437 --76.0516 --76.0609 --76.0563 --76.0437 --76.0453 --76.0594 --76.0547 --76.0578 --76.0563 --76.0437 --76.0578 --76.0531 --76.0625 --76.0469 --76.0531 --76.0656 --76.0516 --76.0625 --76.0437 --76.0687 --76.0406 --76.0484 --76.0719 --76.0547 --76.0531 --76.0516 --76.0484 --76.0594 --76.05 --76.0547 --76.0484 --76.0687 --76.0531 --76.0656 --76.0594 --76.0609 --76.0516 --76.0719 --76.05 --76.0578 --76.0625 --76.0625 --76.0484 --76.0594 --76.0563 --76.0766 --76.0656 --76.0578 --76.0531 --76.0625 --76.0609 --76.0625 --76.0703 --76.0469 --76.0563 --76.0453 --76.0516 --76.0516 --76.0531 --76.0609 --76.0625 --76.0469 --76.0531 --76.0547 --76.0563 --76.0687 --76.0656 --76.0687 --76.0563 --76.0609 --76.0516 --76.0656 --76.0594 --76.0672 --76.0609 --76.0734 --76.0672 --76.0609 --76.0687 --76.0766 --76.0687 --76.0625 --76.0797 --76.075 --76.0672 --76.0672 --76.0687 --76.0609 --76.0531 --76.0531 --76.0578 --76.0687 --76.0625 --76.0687 --76.0703 --76.0547 --76.0594 --76.0641 --76.0516 --76.0672 --76.0516 --76.0578 --76.0563 --76.0625 --76.0594 --76.0641 --76.0406 --76.0687 --76.0578 --76.0578 --76.0719 --76.0531 --76.0703 --76.0609 --76.0672 --76.0578 --76.0594 --76.0531 --76.0719 --76.0703 --76.0734 --76.0547 --76.0594 --76.0703 --76.0687 --76.0687 --76.0687 --76.0625 --76.0687 --76.0594 --76.0766 --76.0594 --76.0656 --76.0641 --76.0469 --76.0625 --76.0563 --76.0625 --76.0563 --76.0703 --76.0594 --76.0719 --76.0547 --76.0703 --76.0531 --76.0594 --76.0578 --76.0437 --76.0797 --76.0625 --76.0563 --76.05 --76.0563 --76.0656 --76.0578 --76.0687 --76.0578 --76.0437 --76.0656 --76.0547 --76.0609 --76.0625 --76.0625 --76.0578 --76.0734 --76.0531 --76.05 --76.0734 --76.0625 --76.0609 --76.075 --76.0609 --76.0656 --76.0687 --76.0687 --76.0594 --76.0594 --76.0625 --76.0641 --76.0656 --76.0609 --76.0453 --76.0641 --76.0734 --76.0766 --76.075 --76.0828 --76.075 --76.0703 --76.0672 --76.0641 --76.0734 --76.0672 --76.0641 --76.0672 --76.0672 --76.0672 --76.0594 --76.0625 --76.0594 --76.0641 --76.0625 --76.0766 --76.0687 --76.0531 --76.0594 --76.0563 --76.0719 --76.0656 --76.0437 --76.0547 --76.0469 --76.0734 --76.0406 --76.0609 --76.0656 --76.0641 --76.0625 --76.0469 --76.0672 --76.0703 --76.0687 --76.0687 --76.0766 --76.05 --76.0734 --76.0828 --76.0672 --76.0687 --76.0672 --76.0641 --76.0719 --76.0625 --76.0484 --76.0703 --76.0687 --76.0703 --76.0672 --76.075 --76.0516 --76.0672 --76.0703 --76.0609 --76.0578 --76.0672 --76.0594 --76.0687 --76.0687 --76.0703 --76.0859 --76.0687 --76.0734 --76.0609 --76.0719 --76.0828 --76.0625 --76.075 --76.0641 --76.075 --76.0734 --76.0547 --76.0703 --76.0734 --76.0734 --76.0703 --76.0875 --76.0719 --76.0781 --76.0563 --76.0734 --76.0672 --76.0813 --76.0813 --76.0687 --76.0734 --76.0656 --76.0891 --76.075 --76.0563 --76.075 --76.0672 --76.0781 --76.0734 --76.075 --76.075 --76.0609 --76.0703 --76.0813 --76.0578 --76.0687 --76.0641 --76.0813 --76.0703 --76.0609 --76.0719 --76.0547 --76.0609 --76.0594 --76.0719 --76.0625 --76.0547 --76.0578 --76.0656 --76.05 --76.0609 --76.0719 --76.0687 --76.0625 --76.0781 --76.0563 --76.0656 --76.0609 --76.0484 --76.0844 --76.0578 --76.0656 --76.0687 --76.0516 --76.0531 --76.0531 --76.05 --76.0609 --76.0531 --76.0484 --76.0453 --76.0531 --76.0594 --76.0656 --76.0516 --76.0516 --76.0609 --76.0625 --76.0563 --76.0531 --76.0484 --76.0516 --76.0516 --76.0469 --76.0547 --76.0484 --76.0594 --76.0484 --76.0453 --76.0516 --76.0625 --76.0641 --76.0625 --76.0531 --76.05 --76.0594 --76.0609 --76.0547 --76.0516 --76.0578 --76.0531 --76.0687 --76.0531 --76.0594 --76.0563 --76.0625 --76.0594 --76.0609 --76.0625 --76.0531 --76.0437 --76.05 --76.0547 --76.0609 --76.0656 --76.0594 --76.0734 --76.0719 --76.0547 --76.0672 --76.0641 --76.0516 --76.0766 --76.0656 --76.0578 --76.0516 --76.0594 --76.0687 --76.0766 --76.0609 --76.0734 --76.0734 --76.0719 --76.0625 --76.0734 --76.0672 --76.0594 --76.0703 --76.0531 --76.0625 --76.0656 --76.0781 --76.0797 --76.0781 --76.0687 --76.0672 --76.0656 --76.0719 --76.0734 --76.0609 --76.0563 --76.0781 --76.0656 --76.0578 --76.0719 --76.0703 --76.0563 --76.0625 --76.0625 --76.0719 --76.0531 --76.0625 --76.0687 --76.0578 --76.075 --76.0656 --76.0563 --76.0531 --76.0594 --76.0594 --76.0594 --76.0563 --76.0594 --76.0578 --76.0594 --76.0766 --76.0609 --76.0766 --76.0656 --76.0578 --76.0547 --76.0609 --76.0641 --76.05 --76.0797 --76.0766 --76.0703 --76.05 --76.0656 --76.0594 --76.0578 --76.0594 --76.0531 --76.0687 --76.0563 --76.0641 --76.0656 --76.0594 --76.0609 --76.05 --76.0641 --76.0578 --76.0547 --76.0578 --76.0625 --76.0625 --76.0547 --76.05 --76.0484 --76.0547 --76.0547 --76.0547 --76.0594 --76.075 --76.0828 --76.0672 --76.0547 --76.0609 --76.0734 --76.075 --76.0687 --76.0703 --76.0719 --76.0766 --76.0578 --76.0531 --76.0703 --76.0703 --76.0594 --76.0625 --76.0578 --76.0547 --76.0437 --76.0563 --76.0594 --76.075 --76.0531 --76.0641 --76.075 --76.0609 --76.0656 --76.0641 --76.0641 --76.0719 --76.0641 --76.0656 --76.0578 --76.0687 --76.0578 --76.0672 --76.0625 --76.0734 --76.0578 --76.0531 --76.0719 --76.0656 --76.0516 --76.0625 --76.0672 --76.075 --76.0797 --76.0672 --76.0531 --76.0656 --76.0672 --76.0766 --76.0578 --76.0578 --76.0734 --76.0719 --76.0687 --76.0609 --76.0859 --76.0531 --76.0656 --76.0781 --76.0656 --76.0781 --76.0734 --76.0672 --76.0656 --76.0563 --76.0563 --76.0703 --76.0516 --76.0734 --76.0781 --76.0797 --76.0609 --76.0719 --76.0578 --76.0797 --76.0609 --76.0703 --76.0844 --76.0891 --76.0781 --76.0953 --76.0797 --76.0797 --76.0781 --76.0703 --76.0609 --76.0797 --76.0672 --76.0813 --76.0609 --76.0766 --76.0641 --76.0797 --76.0797 --76.0687 --76.0687 --76.075 --76.0844 --76.0828 --76.0656 --76.0844 --76.075 --76.0766 --76.075 --76.0719 --76.0875 --76.0703 --76.0609 --76.0656 --76.0625 --76.0625 --76.0641 --76.0687 --76.0641 --76.0625 --76.0672 --76.0625 --76.0563 --76.0531 --76.0703 --76.0547 --76.05 --76.0609 --76.0594 --76.0703 --76.0578 --76.0594 --76.0547 --76.0547 --76.0766 --76.0656 --76.0625 --76.0687 --76.0594 --76.0609 --76.0531 --76.0609 --76.0641 --76.0703 --76.0625 --76.0531 --76.0594 --76.0703 --76.0609 --76.0469 --76.0641 --76.0672 --76.0484 --76.0625 --76.0594 --76.0516 --76.0594 --76.0594 --76.0547 --76.0656 --76.0531 --76.0609 --76.0578 --76.0563 --76.075 --76.0516 --76.0547 --76.05 --76.0516 --76.0516 --76.0703 --76.0641 --76.0734 --76.0609 --76.0625 --76.075 --76.0625 --76.0563 --76.0625 --76.0594 --76.075 --76.0609 --76.0656 --76.0703 --76.0719 --76.0594 --76.0797 --76.0719 --76.0781 --76.0625 --76.0703 --76.0641 --76.0641 --76.0547 --76.0563 --76.0625 --76.05 --76.0641 --76.0687 --76.0594 --76.0594 --76.05 --76.0719 --76.0656 --76.0375 --76.0687 --76.0797 --76.0609 --76.0656 --76.0563 --76.0687 --76.0641 --76.0625 --76.0641 --76.0594 --76.0641 --76.0594 --76.0641 --76.0547 --76.05 --76.0563 --76.0563 --76.0672 --76.0703 --76.0687 --76.075 --76.0594 --76.0672 --76.0594 --76.0703 --76.0625 --76.0609 --76.0422 --76.0484 --76.0609 --76.0687 --76.0578 --76.0656 --76.0625 --76.0703 --76.0734 --76.0563 --76.0609 --76.0656 --76.0531 --76.0594 --76.0609 --76.0609 --76.0531 --76.0641 --76.0609 --76.0719 --76.0563 --76.0578 --76.0625 --76.0719 --76.0672 --76.0547 --76.0578 --76.0563 --76.0672 --76.0563 --76.0578 --76.075 --76.0641 --76.0672 --76.0687 --76.0594 --76.0563 --76.0625 --76.0656 --76.0563 --76.0594 --76.0719 --76.0594 --76.0734 --76.0547 --76.0594 --76.0531 --76.0625 --76.0703 --76.0531 --76.0578 --76.0594 --76.0641 --76.0547 --76.0609 --76.0594 --76.0656 --76.0625 --76.0703 --76.0531 --76.0516 --76.0531 --76.0516 --76.0563 --76.0547 --76.0453 --76.0781 --76.0531 --76.0703 --76.0516 --76.0609 --76.0531 --76.0406 --76.0594 --76.0531 --76.0531 --76.0641 --76.0547 --76.0516 --76.0547 --76.0641 --76.0641 --76.0484 --76.0656 --76.0672 --76.0672 --76.0672 --76.0766 --76.0531 --76.0609 --76.0703 --76.0672 --76.0719 --76.0844 --76.0766 --76.0687 --76.0844 --76.0828 --76.0781 --76.0766 --76.0828 --76.075 --76.0703 --76.0719 --76.0734 --76.0672 --76.0656 --76.0703 --76.0672 --76.0734 --76.0734 --76.0641 --76.0828 --76.0875 --76.0656 --76.0625 --76.0734 --76.0813 --76.0687 --76.0844 --76.0719 --76.0609 --76.0687 --76.0641 --76.0672 --76.0656 --76.0641 --76.0687 --76.0703 --76.0578 --76.0578 --76.0797 --76.0609 --76.0734 --76.075 --76.0687 --76.0813 --76.0797 --76.0672 --76.0859 --76.0766 --76.0578 --76.0625 --76.0734 --76.0687 --76.0734 --76.0766 --76.0609 --76.0625 --76.0687 --76.0672 --76.0563 --76.0563 --76.0531 --76.0781 --76.0516 --76.0563 --76.0594 --76.0625 --76.0594 --76.0516 --76.0641 --76.0594 --76.0563 --76.0547 --76.0719 --76.0687 --76.0672 --76.0641 --76.0531 --76.0687 --76.0563 --76.0563 --76.0703 --76.0625 --76.0781 --76.0578 --76.0641 --76.0578 --76.0687 --76.0578 --76.0594 --76.0703 --76.0609 --76.0719 --76.0703 --76.0609 --76.0656 --76.0656 --76.0656 --76.0609 --76.0672 --76.0656 --76.0734 --76.0734 --76.0719 --76.0687 --76.0547 --76.0703 --76.075 --76.0656 --76.0719 --76.0703 --76.0531 --76.0703 --76.0672 --76.0656 --76.0563 --76.0656 --76.0656 --76.0641 --76.0687 --76.0578 --76.0641 --76.0734 --76.0625 --76.0594 --76.0656 --76.0547 --76.0594 --76.0531 --76.0563 --76.0672 --76.0594 --76.0516 --76.05 --76.0719 --76.0516 --76.0547 --76.0781 --76.0563 --76.0734 --76.0609 --76.0609 --76.0719 --76.0547 --76.0516 --76.0625 --76.0578 --76.0672 --76.0656 --76.0687 --76.0531 --76.0672 --76.0719 --76.0578 --76.0531 --76.0516 --76.0594 --76.0563 --76.0563 --76.0609 --76.0781 --76.0625 --76.0703 --76.0734 --76.0656 --76.0563 --76.0672 --76.0625 --76.0609 --76.0641 --76.0828 --76.0641 --76.0609 --76.0687 --76.0672 --76.0609 --76.0641 --76.0609 --76.0625 --76.0563 --76.0656 --76.0625 --76.0578 --76.0578 --76.0484 --76.0453 --76.0672 --76.0547 --76.0563 --76.0687 --76.0578 --76.0641 --76.0578 --76.0672 --76.0625 --76.0469 --76.0594 --76.0641 --76.0594 --76.0516 --76.0703 --76.0547 --76.0516 --76.0531 --76.0547 --76.0672 --76.0563 --76.0656 --76.0563 --76.0437 --76.0453 --76.0531 --76.0484 --76.0703 --76.0609 --76.0578 --76.0672 --76.0484 --76.0547 --76.0563 --76.0516 --76.0609 --76.0609 --76.0578 --76.0609 --76.0625 --76.0547 --76.0641 --76.0641 --76.0656 --76.0656 --76.075 --76.075 --76.0734 --76.075 --76.0484 --76.0719 --76.0516 --76.0625 --76.0625 --76.0609 --76.0641 --76.0703 --76.0828 --76.0734 --76.0609 --76.0703 --76.0734 --76.0719 --76.0641 --76.0625 --76.0703 --76.0625 --76.0625 --76.0656 --76.0563 --76.0719 --76.0578 --76.0437 --76.0531 --76.0672 --76.0672 --76.0531 --76.0578 --76.0375 --76.0734 --76.0531 --76.0672 --76.0687 --76.0484 --76.0672 --76.0594 --76.0656 --76.0547 --76.0484 --76.0578 --76.0547 --76.0563 --76.0703 --76.0609 --76.0703 --76.0656 --76.0719 --76.0703 --76.0625 --76.0781 --76.0641 --76.0641 --76.0625 --76.0469 --76.0547 --76.0578 --76.0437 --76.0719 --76.0672 --76.0531 --76.0609 --76.0781 --76.0609 --76.0563 --76.075 --76.0531 --76.0563 --76.0453 --76.0609 --76.0609 --76.0719 --76.0578 --76.0687 --76.0641 --76.0594 --76.0547 --76.0641 --76.0687 --76.0391 --76.0672 --76.0594 --76.0625 --76.0672 --76.0687 --76.0734 --76.0578 --76.0719 --76.0594 --76.05 --76.0656 --76.0687 --76.0547 --76.0563 --76.0594 --76.0609 --76.0656 --76.0516 --76.0594 --76.0641 --76.0484 --76.0703 --76.0719 --76.0672 --76.0625 --76.0641 --76.0609 --76.0563 --76.0687 --76.0531 --76.0531 --76.0625 --76.0437 --76.0578 --76.0563 --76.0609 --76.0563 --76.0422 --76.0469 --76.0531 --76.0594 --76.0594 --76.0703 --76.0609 --76.0594 --76.0656 --76.0578 --76.0672 --76.0656 --76.0563 --76.075 --76.0422 --76.0641 --76.0547 --76.0516 --76.0563 --76.0547 --76.0484 --76.0578 --76.0703 --76.0656 --76.0547 --76.075 --76.0656 --76.0672 --76.0641 --76.0547 --76.0531 --76.0625 --76.0641 --76.0687 --76.0594 --76.0563 --76.0469 --76.0516 --76.0563 --76.0531 --76.0672 --76.0641 --76.0594 --76.0703 --76.0437 --76.0625 --76.05 --76.0359 --76.0547 --76.0578 --76.0656 --76.0766 --76.0578 --76.0469 --76.0703 --76.0563 --76.0594 --76.0547 --76.0563 --76.0578 --76.0563 --76.0625 --76.0656 --76.0594 --76.0516 --76.0625 --76.0453 --76.0469 --76.0531 --76.0594 --76.0531 --76.0547 --76.0656 --76.0609 --76.0531 --76.0609 --76.0609 --76.0656 --76.0516 --76.0609 --76.0641 --76.0531 --76.0609 --76.0578 --76.0578 --76.0625 --76.0719 --76.0531 --76.0625 --76.0641 --76.05 --76.0672 --76.0531 --76.0563 --76.0469 --76.0594 --76.0609 --76.0594 --76.05 --76.05 --76.0609 --76.0563 --76.0516 --76.0437 --76.0422 --76.0484 --76.0563 --76.0656 --76.0547 --76.0516 --76.0547 --76.0719 --76.0594 --76.0531 --76.0547 --76.0547 --76.0563 --76.05 --76.0609 --76.0531 --76.0563 --76.0578 --76.0484 --76.0594 --76.0484 --76.0516 --76.0578 --76.05 --76.0563 --76.0578 --76.0687 --76.0672 --76.0703 --76.0641 --76.0719 --76.0703 --76.0672 --76.0594 --76.0656 --76.0656 --76.0656 --76.0672 --76.0734 --76.0625 --76.0516 --76.0703 --76.0641 --76.0563 --76.0703 --76.0687 --76.0719 --76.0641 --76.0531 --76.0563 --76.0594 --76.0578 --76.0531 --76.0734 --76.0672 --76.0531 --76.0563 --76.0609 --76.0734 --76.0687 --76.0641 --76.0531 --76.0531 --76.0594 --76.05 --76.0531 --76.0422 --76.0563 --76.0625 --76.05 --76.0484 --76.0531 --76.0578 --76.0453 --76.0547 --76.05 --76.0531 --76.0516 --76.0344 --76.0437 --76.0563 --76.05 --76.0563 --76.0563 --76.0547 --76.0531 --76.0531 --76.0641 --76.0563 --76.0609 --76.0672 --76.0563 --76.0625 --76.0609 --76.0531 --76.0578 --76.0609 --76.05 --76.0547 --76.0641 --76.0609 --76.0594 --76.0563 --76.05 --76.0484 --76.0656 --76.0594 --76.0594 --76.0766 --76.0578 --76.0609 --76.0672 --76.0641 --76.0641 --76.0563 --76.0687 --76.0641 --76.0703 --76.0703 --76.0469 --76.0563 --76.0609 --76.0594 --76.0656 --76.0625 --76.0625 --76.0578 --76.0547 --76.0734 --76.0609 --76.0703 --76.0687 --76.0813 --76.0687 --76.0719 --76.0687 --76.0641 --76.0844 --76.0672 --76.0875 --76.0766 --76.0719 --76.0766 --76.0563 --76.0719 --76.0687 --76.0813 --76.075 --76.0687 --76.0938 --76.0828 --76.0797 --76.0703 --76.075 --76.0656 --76.0781 --76.0734 --76.0719 --76.0906 --76.0781 --76.0781 --76.0828 --76.0594 --76.0609 --76.0719 --76.0813 --76.0781 --76.0766 --76.0844 --76.0844 --76.0672 --76.0563 --76.0828 --76.0922 --76.0734 --76.0641 --76.075 --76.0859 --76.0672 --76.075 --76.0734 --76.0484 --76.0891 --76.0859 --76.0844 --76.0734 --76.0906 --76.0828 --76.0719 --76.0813 --76.0766 --76.0703 --76.075 --76.0578 --76.0781 --76.0594 --76.075 --76.0781 --76.0734 --76.0547 --76.0594 --76.0719 --76.0734 --76.0656 --76.0594 --76.0672 --76.0719 --76.0563 --76.0734 --76.0641 --76.0797 --76.0687 --76.0719 --76.0578 --76.0656 --76.0547 --76.0469 --76.0453 --76.0594 --76.0594 --76.0484 --76.0578 --76.0609 --76.0484 --76.0656 --76.0625 --76.05 --76.0625 --76.0578 --76.0531 --76.0594 --76.0531 --76.0687 --76.0516 --76.0625 --76.0687 --76.0687 --76.0766 --76.0703 --76.0703 --76.0625 --76.0687 --76.0625 --76.0563 --76.0656 --76.0641 --76.0656 --76.0547 --76.0547 --76.0625 --76.0734 --76.0563 --76.075 --76.0547 --76.0547 --76.0641 --76.0656 --76.0687 --76.0578 --76.0656 --76.0609 --76.0531 --76.0641 --76.0563 --76.0437 --76.0625 --76.05 --76.0609 --76.0594 --76.0531 --76.0547 --76.0625 --76.0641 --76.0641 --76.0547 --76.0609 --76.0531 --76.0484 --76.0531 --76.0437 --76.0578 --76.0531 --76.0547 --76.0547 --76.0609 --76.0563 --76.0469 --76.0563 --76.0641 --76.0563 --76.0484 --76.0594 --76.0594 --76.0469 --76.0594 --76.05 --76.0484 --76.0578 --76.05 --76.0703 --76.0563 --76.0594 --76.0563 --76.0609 --76.0578 --76.0437 --76.0484 --76.0469 --76.0422 --76.0734 --76.0594 --76.0578 --76.0594 --76.0609 --76.075 --76.0625 --76.0594 --76.0625 --76.0625 --76.0641 --76.0687 --76.0609 --76.0594 --76.0719 --76.0516 --76.0625 --76.0672 --76.0563 --76.0453 --76.0563 --76.0641 --76.0469 --76.0484 --76.0594 --76.0609 --76.0687 --76.0516 --76.0547 --76.0516 --76.0641 --76.0672 --76.0469 --76.0625 --76.0609 --76.0734 --76.0672 --76.0672 --76.0734 --76.0625 --76.0813 --76.0734 --76.0656 --76.0703 --76.0641 --76.0703 --76.0578 --76.0656 --76.0531 --76.0641 --76.0703 --76.0609 --76.0719 --76.0641 --76.0687 --76.0641 --76.0656 --76.0672 --76.0672 --76.0656 --76.0813 --76.0687 --76.075 --76.0656 --76.0578 --76.0687 --76.0578 --76.0719 --76.0625 --76.0781 --76.0625 --76.0641 --76.0734 --76.0625 --76.0672 --76.0719 --76.0516 --76.05 --76.0609 --76.0531 --76.0563 --76.0625 --76.0594 --76.0563 --76.0641 --76.0766 --76.0625 --76.0547 --76.0641 --76.0547 --76.0609 --76.0609 --76.0672 --76.0766 --76.0609 --76.0703 --76.0687 --76.075 --76.0687 --76.0594 --76.0687 --76.0766 --76.0578 --76.0672 --76.0656 --76.0469 --76.0719 --76.0672 --76.0781 --76.0687 --76.0578 --76.0641 --76.0578 --76.0641 --76.0641 --76.0656 --76.0687 --76.0703 --76.0594 --76.0703 --76.0703 --76.0734 --76.075 --76.075 --76.0641 --76.0781 --76.0641 --76.0656 --76.0594 --76.0578 --76.0531 --76.0625 --76.0609 --76.0609 --76.0531 --76.0578 --76.0578 --76.0656 --76.0453 --76.0859 --76.0734 --76.0687 --76.0547 --76.0578 --76.0578 --76.0687 --76.0656 --76.0469 --76.0672 --76.0609 --76.0469 --76.0609 --76.0484 --76.0672 --76.0625 --76.0594 --76.0609 --76.0578 --76.0641 --76.0453 --76.0687 --76.0625 --76.0609 --76.0703 --76.0594 --76.0641 --76.0719 --76.0547 --76.0625 --76.0656 --76.0594 --76.0563 --76.0594 --76.0672 --76.0672 --76.0703 --76.0719 --76.0578 --76.0594 --76.0703 --76.0687 --76.0547 --76.075 --76.0625 --76.0797 --76.0547 --76.0672 --76.0781 --76.0734 --76.0703 --76.0609 --76.0469 --76.0578 --76.0797 --76.0609 --76.0609 --76.0703 --76.0563 --76.0703 --76.0734 --76.0563 --76.0703 --76.0594 --76.0687 --76.0719 --76.0766 --76.0453 --76.0719 --76.0469 --76.0594 --76.0516 --76.0641 --76.0609 --76.0609 --76.0625 --76.0531 --76.0719 --76.0594 --76.0594 --76.0672 --76.0578 --76.0609 --76.0594 --76.0594 --76.0609 --76.0672 --76.0516 --76.0703 --76.0609 --76.0547 --76.0641 --76.0547 --76.075 --76.0625 --76.0687 --76.075 --76.0672 --76.0656 --76.0594 --76.0594 --76.0594 --76.0703 --76.0797 --76.0703 --76.05 --76.0656 --76.0719 --76.0578 --76.0578 --76.0625 --76.0656 --76.0734 --76.0719 --76.0594 --76.0547 --76.0578 --76.0625 --76.0563 --76.0531 --76.0547 --76.0547 --76.0531 --76.0594 --76.0625 --76.0531 --76.05 --76.0516 --76.0578 --76.0578 --76.0563 --76.05 --76.0687 --76.0672 --76.0531 --76.0734 --76.0578 --76.0594 --76.0531 --76.0563 --76.0453 --76.0672 --76.0703 --76.0641 --76.0594 --76.05 --76.0563 --76.0531 --76.0484 --76.0609 --76.0609 --76.0594 --76.0641 --76.0641 --76.0687 --76.0563 --76.0625 --76.0594 --76.0703 --76.05 --76.0547 --76.0516 --76.0656 --76.0594 --76.05 --76.0609 --76.0641 --76.0547 --76.0766 --76.0594 --76.0563 --76.0578 --76.0484 --76.0484 --76.0563 --76.0641 --76.0563 --76.0594 --76.0469 --76.0563 --76.0469 --76.0672 --76.0563 --76.0609 --76.0625 --76.0719 --76.0547 --76.0719 --76.0453 --76.0594 --76.0391 --76.05 --76.0641 --76.0594 --76.0469 --76.0656 --76.0656 --76.0547 --76.0516 --76.0656 --76.0469 --76.0563 --76.0453 --76.0703 --76.0656 --76.0656 --76.0609 --76.0609 --76.0719 --76.0734 --76.0687 --76.075 --76.0578 --76.0813 --76.0703 --76.0766 --76.0625 --76.0609 --76.0656 --76.0734 --76.075 --76.0672 --76.0719 --76.0672 --76.0563 --76.0656 --76.0656 --76.0563 --76.0625 --76.0687 --76.0531 --76.0625 --76.0578 --76.0563 --76.0703 --76.0656 --76.0672 --76.0516 --76.0594 --76.0531 --76.0656 --76.0578 --76.0625 --76.0578 --76.0734 --76.0656 --76.0656 --76.0578 --76.0656 --76.0625 --76.0484 --76.0609 --76.0484 --76.0547 --76.0656 --76.0641 --76.0672 --76.0703 --76.0734 --76.0781 --76.0734 --76.0625 --76.0641 --76.0797 --76.0531 --76.0625 --76.0578 --76.0547 --76.0594 --76.0719 --76.0516 --76.0422 --76.0625 --76.0547 --76.05 --76.0563 --76.0547 --76.0531 --76.0531 --76.0516 --76.0656 --76.0484 --76.0625 --76.0516 --76.0594 --76.0531 --76.0734 --76.0594 --76.0625 --76.0594 --76.0656 --76.0719 --76.0484 --76.0594 --76.0469 --76.0484 --76.0641 --76.0563 --76.0563 --76.05 --76.0516 --76.0672 --76.0594 --76.0719 --76.0469 --76.0625 --76.0594 --76.0641 --76.0719 --76.0703 --76.0703 --76.0672 --76.0563 --76.0656 --76.0813 --76.0703 --76.0578 --76.0813 --76.0563 --76.0797 --76.0656 --76.0625 --76.0672 --76.0625 --76.0687 --76.0531 --76.0563 --76.0703 --76.0734 --76.0734 --76.0609 --76.05 --76.0625 --76.0547 --76.0672 --76.0687 --76.0672 --76.0531 --76.0656 --76.0625 --76.0594 --76.0641 --76.0531 --76.0594 --76.0484 --76.0625 --76.0609 --76.0609 --76.0547 --76.0641 --76.0781 --76.0672 --76.0641 --76.0719 --76.0672 --76.0609 --76.0547 --76.075 --76.0703 --76.0672 --76.0516 --76.0594 --76.0609 --76.0484 --76.0609 --76.0578 --76.075 --76.0609 --76.0672 --76.0687 --76.0594 --76.0594 --76.0687 --76.0578 --76.05 --76.0547 --76.0484 --76.0547 --76.0641 --76.0625 --76.0484 --76.0594 --76.0625 --76.0578 --76.0531 --76.0594 --76.0453 --76.0531 --76.0578 --76.0687 --76.0594 --76.0437 --76.0547 --76.0437 --76.0641 --76.0547 --76.0516 --76.0563 --76.0547 --76.0516 --76.0594 --76.0531 --76.0672 --76.0594 --76.0641 --76.0687 --76.0609 --76.0703 --76.0672 --76.0563 --76.0797 --76.0703 --76.0656 --76.0766 --76.0656 --76.0656 --76.0656 --76.0687 --76.0594 --76.0719 --76.0687 --76.0797 --76.0719 --76.0547 --76.0625 --76.0766 --76.0641 --76.0687 --76.0625 --76.0594 --76.0563 --76.0563 --76.0594 --76.0719 --76.0563 --76.0563 --76.0672 --76.0563 --76.0609 --76.0609 --76.0656 --76.0547 --76.0563 --76.0563 --76.0656 --76.0687 --76.0625 --76.0641 --76.0609 --76.0656 --76.0625 --76.0656 --76.0609 --76.0484 --76.0656 --76.0437 --76.0609 --76.0594 --76.0516 --76.0578 --76.0516 --76.0609 --76.0703 --76.0609 --76.05 --76.0672 --76.0547 --76.0672 --76.0766 --76.075 --76.0687 --76.0734 --76.0734 --76.0734 --76.0672 --76.0578 --76.0797 --76.0594 --76.0594 --76.0578 --76.0641 --76.0766 --76.075 --76.0531 --76.0719 --76.0594 --76.0594 --76.0609 --76.0703 --76.0578 --76.0516 --76.0641 --76.0516 --76.0703 --76.0687 --76.0781 --76.0453 --76.0672 --76.0703 --76.0703 --76.0672 --76.0703 --76.0609 --76.0641 --76.0734 --76.0672 --76.0641 --76.0594 --76.0484 --76.0594 --76.0766 --76.0672 --76.0656 --76.0656 --76.0687 --76.0516 --76.0578 --76.0766 --76.075 --76.0563 --76.05 --76.0578 --76.0641 --76.075 --76.0656 --76.0531 --76.05 --76.0516 --76.0516 --76.0453 --76.05 --76.0641 --76.0531 --76.0531 --76.0547 --76.0719 --76.0469 --76.0578 --76.0531 --76.05 --76.0531 --76.0625 --76.0531 --76.0609 --76.0641 --76.0687 --76.0641 --76.0547 --76.0625 --76.0719 --76.0516 --76.0563 --76.0672 --76.0609 --76.0687 --76.05 --76.0516 --76.0516 --76.0547 --76.0672 --76.0437 --76.0625 --76.05 --76.0563 --76.0469 --76.0609 --76.0469 --76.0578 --76.0406 --76.0453 --76.0531 --76.0531 --76.0453 --76.0531 --76.0437 --76.0531 --76.0516 --76.0453 --76.0672 --76.05 --76.0563 --76.075 --76.0563 --76.0609 --76.0641 --76.0625 --76.0656 --76.0531 --76.0578 --76.0563 --76.0391 --76.0453 --76.0641 --76.0547 --76.0516 --76.0469 --76.0453 --76.0531 --76.0625 --76.0516 --76.0625 --76.0687 --76.0687 --76.0641 --76.0594 --76.0734 --76.0484 --76.0625 --76.0719 --76.0547 --76.0781 --76.0656 --76.0641 --76.0734 --76.0672 --76.0625 --76.0672 --76.0547 --76.0797 --76.0625 --76.0516 --76.0609 --76.0766 --76.0719 --76.0687 --76.0656 --76.05 --76.0656 --76.0641 --76.0656 --76.0687 --76.0594 --76.0641 --76.0844 --76.0641 --76.0625 --76.0703 --76.0422 --76.0656 --76.0594 --76.0563 --76.0719 --76.0734 --76.0797 --76.0703 --76.0516 --76.0672 --76.0578 --76.0563 --76.0828 --76.0516 --76.0375 --76.0641 --76.0641 --76.0609 --76.0609 --76.0516 --76.05 --76.0656 --76.0594 --76.0672 --76.0625 --76.0625 --76.0594 --76.0531 --76.0547 --76.0703 --76.05 --76.0484 --76.0484 --76.0594 --76.0484 --76.0656 --76.05 --76.0578 --76.0406 --76.0656 --76.0484 --76.0641 --76.05 --76.0703 --76.0609 --76.0594 --76.0797 --76.0609 --76.0609 --76.0797 --76.0531 --76.0656 --76.0687 --76.0719 --76.0641 --76.0641 --76.0563 --76.0563 --76.0703 --76.0594 --76.0609 --76.0531 --76.0656 --76.0609 --76.0563 --76.0437 --76.0766 --76.0453 --76.0422 --76.05 --76.0641 --76.0547 --76.0609 --76.0594 --76.0594 --76.0625 --76.0531 --76.0453 --76.0578 --76.0531 --76.0531 --76.0437 --76.0391 --76.0563 --76.0609 --76.0563 --76.0609 --76.0516 --76.0437 --76.0406 --76.0641 --76.0437 --76.0563 --76.0656 --76.0531 --76.0672 --76.0516 --76.0547 --76.0594 --76.0453 --76.0469 --76.0547 --76.0531 --76.0359 --76.0672 --76.0578 --76.0656 --76.0563 --76.05 --76.0578 --76.0609 --76.0672 --76.0672 --76.0563 --76.0687 --76.0609 --76.0609 --76.0641 --76.0531 --76.0656 --76.0547 --76.0656 --76.0547 --76.0516 --76.0563 --76.0672 --76.0547 --76.0813 --76.0563 --76.0625 --76.0563 --76.0578 --76.05 --76.0563 --76.0672 --76.0609 --76.0687 --76.0531 --76.0547 --76.0516 --76.0547 --76.0563 --76.0578 --76.0547 --76.0594 --76.0625 --76.0625 --76.0625 --76.0547 --76.0484 --76.0594 --76.0547 --76.0609 --76.0687 --76.0609 --76.0625 --76.0703 --76.0547 --76.0609 --76.075 --76.0719 --76.0687 --76.0656 --76.0594 --76.0656 --76.0641 --76.0641 --76.0781 --76.0719 --76.0641 --76.0672 --76.0609 --76.0656 --76.0656 --76.0531 --76.0703 --76.0766 --76.0719 --76.0703 --76.0719 --76.0703 --76.0687 --76.0766 --76.0734 --76.0484 --76.0531 --76.05 --76.0734 --76.0625 --76.0719 --76.0594 --76.0719 --76.0719 --76.0703 --76.0578 --76.0656 --76.0531 --76.0625 --76.0687 --76.0625 --76.0641 --76.0734 --76.0578 --76.0656 --76.0656 --76.0609 --76.0703 --76.0687 --76.0625 --76.0625 --76.0609 --76.0641 --76.0766 --76.0641 --76.0641 --76.0594 --76.0641 --76.0656 --76.0625 --76.0594 --76.0703 --76.0656 --76.0625 --76.0641 --76.0594 --76.0531 --76.0609 --76.0594 --76.0594 --76.0687 --76.0703 --76.0703 --76.0781 --76.0687 --76.0766 --76.0609 --76.0703 --76.0609 --76.0625 --76.0641 --76.0578 --76.0703 --76.0563 --76.0578 --76.0609 --76.0719 --76.0672 --76.0578 --76.0672 --76.0703 --76.0719 --76.0687 --76.0641 --76.0609 --76.0625 --76.0672 --76.0672 --76.0594 --76.0609 --76.0531 --76.0484 --76.0531 --76.0641 --76.0484 --76.0531 --76.0422 --76.0406 --76.0563 --76.0531 --76.05 --76.0578 --76.0563 --76.0422 --76.0625 --76.0547 --76.0516 --76.0641 --76.0563 --76.0484 --76.05 --76.0531 --76.0484 --76.0641 --76.0406 --76.075 --76.0609 --76.0469 --76.0687 --76.0547 --76.0656 --76.0516 --76.0656 --76.05 --76.0531 --76.0656 --76.0578 --76.0484 --76.0594 --76.0594 --76.0469 --76.0625 --76.0578 --76.0547 --76.0422 --76.0469 --76.0578 --76.0609 --76.0531 --76.0422 --76.0609 --76.0547 --76.0516 --76.05 --76.0578 --76.0484 --76.0391 --76.0531 --76.0516 --76.0547 --76.0594 --76.0547 --76.0563 --76.0563 --76.0516 --76.0516 --76.0516 --76.0594 --76.0594 --76.0437 --76.0594 --76.0609 --76.0578 --76.0563 --76.0578 --76.0547 --76.0578 --76.0578 --76.0563 --76.05 --76.0609 --76.0547 --76.0531 --76.0531 --76.0469 --76.0234 --76.0328 --76.0422 --76.0375 --76.0406 --76.0406 --76.0469 --76.0437 --76.0531 --76.0422 --76.0563 --76.0469 --76.0422 --76.0437 --76.0531 --76.0547 --76.05 --76.0625 --76.0687 --76.0547 --76.0609 --76.0484 --76.0672 --76.0578 --76.0484 --76.0469 --76.05 --76.0469 --76.0563 --76.0469 --76.05 --76.0469 --76.0437 --76.0422 --76.0578 --76.0594 --76.0453 --76.0687 --76.0531 --76.0516 --76.0594 --76.0469 --76.0469 --76.0531 --76.0609 --76.0625 --76.0516 --76.0625 --76.0484 --76.0687 --76.0516 --76.0719 --76.0734 --76.0781 --76.0594 --76.0516 --76.0656 --76.0625 --76.0578 --76.0641 --76.0578 --76.0641 --76.0563 --76.0563 --76.0641 --76.0687 --76.0594 --76.0578 --76.0687 --76.0672 --76.0672 --76.0703 --76.0484 --76.0609 --76.0547 --76.0578 --76.0563 --76.0609 --76.0687 --76.0703 --76.0609 --76.0625 --76.0578 --76.0703 --76.0641 --76.075 --76.0687 --76.0609 --76.0687 --76.0578 --76.0594 --76.0641 --76.0719 --76.0656 --76.0578 --76.0687 --76.0734 --76.0609 --76.0531 --76.0625 --76.0672 --76.0609 --76.0703 --76.0563 --76.0547 --76.0703 --76.0625 --76.0625 --76.0594 --76.0641 --76.0734 --76.0656 --76.0656 --76.0875 --76.0531 --76.0625 --76.0563 --76.0687 --76.075 --76.0672 --76.0453 --76.0625 --76.0594 --76.0594 --76.0594 --76.0609 --76.0734 --76.0563 --76.0547 --76.0609 --76.0609 --76.0625 --76.05 --76.0484 --76.0656 --76.0609 --76.0641 --76.0563 --76.0531 --76.0594 --76.0609 --76.0625 --76.0609 --76.0656 --76.05 --76.0703 --76.0594 --76.0453 --76.0578 --76.0484 --76.0547 --76.0641 --76.0703 --76.0734 --76.0547 --76.0703 --76.0609 --76.05 --76.0609 --76.0578 --76.0625 --76.0625 --76.0484 --76.0531 --76.0531 --76.0391 --76.0703 --76.0641 --76.0625 --76.0672 --76.0563 --76.0687 --76.0719 --76.0609 --76.0578 --76.0672 --76.0563 --76.0547 --76.0734 --76.0625 --76.0594 --76.0703 --76.0672 --76.0656 --76.0609 --76.0625 --76.0547 --76.0531 --76.0594 --76.0563 --76.0719 --76.0625 --76.0563 --76.0656 --76.0594 --76.0578 --76.0687 --76.0547 --76.0609 --76.0609 --76.0578 --76.0719 --76.0672 --76.0719 --76.0797 --76.0547 --76.0531 --76.0641 --76.0563 --76.0594 --76.0437 --76.0531 --76.0578 --76.0516 --76.0422 --76.0453 --76.0484 --76.0531 --76.0594 --76.0437 --76.0516 --76.0594 --76.0531 --76.0531 --76.0625 --76.0594 --76.0578 --76.0641 --76.0781 --76.0672 --76.0734 --76.0656 --76.0641 --76.0609 --76.0719 --76.0672 --76.0625 --76.0672 --76.0578 --76.0531 --76.0703 --76.0656 --76.0703 --76.0656 --76.0719 --76.0547 --76.0516 --76.0594 --76.0531 --76.075 --76.0516 --76.0641 --76.0687 --76.0594 --76.0609 --76.0672 --76.0563 --76.0687 --76.0531 --76.0656 --76.0687 --76.075 --76.0672 --76.0625 --76.0578 --76.075 --76.0734 --76.0594 --76.0703 --76.0703 --76.0687 --76.0625 --76.0703 --76.0672 --76.0687 --76.0734 --76.0641 --76.0813 --76.0656 --76.0719 --76.0859 --76.0719 --76.0734 --76.0719 --76.0719 --76.0641 --76.0859 --76.0687 --76.0734 --76.0641 --76.0766 --76.0641 --76.0672 --76.0687 --76.0656 --76.0719 --76.0703 --76.0641 --76.0656 --76.0609 --76.0734 --76.0563 --76.0656 --76.0766 --76.0609 --76.0703 --76.0766 --76.075 --76.0734 --76.0703 --76.0859 --76.0641 --76.075 --76.0625 --76.0594 --76.0641 --76.0594 --76.075 --76.0578 --76.0656 --76.0641 --76.0687 --76.0672 --76.0563 --76.0656 --76.0672 --76.0719 --76.0531 --76.0687 --76.0563 --76.0594 --76.0687 --76.0672 --76.0687 --76.0672 --76.0641 --76.0625 --76.0813 --76.0687 --76.0625 --76.0797 --76.0641 --76.0609 --76.0719 --76.0656 --76.0766 --76.0781 --76.075 --76.0813 --76.0813 --76.0781 --76.0734 --76.0703 --76.0719 --76.0672 --76.075 --76.0609 --76.0687 --76.0703 --76.0703 --76.0797 --76.0719 --76.0687 --76.0813 --76.0703 --76.0719 --76.0687 --76.0687 --76.075 --76.0781 --76.0703 --76.075 --76.0687 --76.0625 --76.0875 --76.0687 --76.0734 --76.0781 --76.0813 --76.0687 --76.075 --76.075 --76.0719 --76.0625 --76.0734 --76.0734 --76.0641 --76.0813 --76.0781 --76.0844 --76.0797 --76.0734 --76.0891 --76.0594 --76.0703 --76.0734 --76.0687 --76.0609 --76.0781 --76.0687 --76.0781 --76.075 --76.0547 --76.0844 --76.0687 --76.0484 --76.075 --76.0563 --76.0563 --76.0813 --76.0625 --76.0563 --76.0719 --76.0563 --76.0609 --76.0875 --76.0766 --76.0687 --76.0734 --76.0687 --76.0641 --76.0687 --76.075 --76.0625 --76.075 --76.0687 --76.0656 --76.0625 --76.0672 --76.0813 --76.075 --76.0703 --76.0594 --76.0563 --76.0781 --76.0703 --76.0766 --76.0781 --76.0766 --76.0687 --76.0656 --76.0578 --76.0641 --76.0687 --76.0844 --76.0687 --76.0516 --76.0687 --76.0687 --76.0641 --76.0625 --76.0734 --76.0656 --76.0734 --76.0609 --76.0672 --76.0609 --76.0625 --76.0547 --76.0484 --76.0703 --76.0578 --76.0672 --76.0687 --76.0719 --76.0656 --76.0719 --76.0656 --76.0594 --76.0734 --76.0641 --76.0531 --76.0609 --76.0594 --76.0609 --76.0766 --76.0563 --76.0719 --76.0625 --76.0672 --76.0781 --76.0516 --76.0625 --76.075 --76.0781 --76.0703 --76.0656 --76.0719 --76.0781 --76.0781 --76.0625 --76.0813 --76.0687 --76.0781 --76.0687 --76.0656 --76.0781 --76.0781 --76.075 --76.0797 --76.0891 --76.0797 --76.0828 --76.0875 --76.0641 --76.0641 --76.0734 --76.0813 --76.0719 --76.0781 --76.0781 --76.0656 --76.0656 --76.0703 --76.0797 --76.0625 --76.0687 --76.0734 --76.0813 --76.0531 --76.0734 --76.0672 --76.0734 --76.0703 --76.0687 --76.0719 --76.0734 --76.0813 --76.0687 --76.0797 --76.0734 --76.0719 --76.0828 --76.0906 --76.075 --76.0594 --76.0813 --76.0797 --76.0938 --76.0687 --76.0687 --76.0828 --76.0891 --76.075 --76.0828 --76.0875 --76.0969 --76.1031 --76.0922 --76.075 --76.0719 --76.0844 --76.075 --76.0797 --76.0672 --76.0922 --76.0813 --76.0734 --76.075 --76.075 --76.0813 --76.0766 --76.0719 --76.0797 --76.0703 --76.0734 --76.0734 --76.0703 --76.0703 --76.0703 --76.0797 --76.0641 --76.0719 --76.0797 --76.0797 --76.0797 --76.0875 --76.0906 --76.075 --76.0844 --76.0734 --76.0781 --76.0875 --76.0938 --76.0828 --76.0891 --76.0797 --76.0828 --76.0844 --76.0781 --76.0859 --76.0672 --76.0844 --76.0797 --76.075 --76.075 --76.0672 --76.0766 --76.0609 --76.0766 --76.0687 --76.0719 --76.0813 --76.0859 --76.0781 --76.0703 --76.0719 --76.0656 --76.0687 --76.0719 --76.0703 --76.075 --76.0719 --76.0687 --76.0781 --76.0813 --76.075 --76.0813 --76.0813 --76.0766 --76.0813 --76.0797 --76.0828 --76.0687 --76.0828 --76.0828 --76.0656 --76.0844 --76.0672 --76.0547 --76.0625 --76.0656 --76.0734 --76.0609 --76.0766 --76.0594 --76.0719 --76.0781 --76.0531 --76.0656 --76.0531 --76.0703 --76.0594 --76.0641 --76.0484 --76.0578 --76.0594 --76.0547 --76.0578 --76.0625 --76.0641 --76.0563 --76.0625 --76.0625 --76.075 --76.0531 --76.0625 --76.0453 --76.0578 --76.0641 --76.0672 --76.0766 --76.0625 --76.0687 --76.0547 --76.0547 --76.0672 --76.0672 --76.0641 --76.0687 --76.0641 --76.0656 --76.0687 --76.0766 --76.0594 --76.0625 --76.0719 --76.0719 --76.0609 --76.0656 --76.0687 --76.0687 --76.0781 --76.0719 --76.0703 --76.0625 --76.0828 --76.0594 --76.075 --76.0641 --76.0594 --76.0781 --76.0609 --76.0781 --76.0703 --76.0672 --76.075 --76.0703 --76.0719 --76.0734 --76.0656 --76.0641 --76.0781 --76.0687 --76.0672 --76.075 --76.0703 --76.0766 --76.0594 --76.0703 --76.0703 --76.0766 --76.075 --76.0672 --76.0641 --76.0516 --76.0656 --76.0687 --76.0672 --76.0641 --76.0766 --76.0641 --76.0703 --76.0781 --76.0719 --76.0672 --76.0719 --76.0641 --76.0687 --76.0641 --76.0766 --76.0656 --76.0625 --76.0719 --76.0703 --76.0672 --76.0672 --76.0734 --76.0672 --76.0625 --76.0687 --76.0625 --76.0687 --76.0609 --76.0797 --76.0719 --76.0734 --76.0703 --76.0766 --76.0656 --76.075 --76.0828 --76.0859 --76.0844 --76.0703 --76.075 --76.0734 --76.0594 --76.0766 --76.0625 --76.0844 --76.0781 --76.0781 --76.0719 --76.0797 --76.0938 --76.0828 --76.0609 --76.0906 --76.0687 --76.0906 --76.0828 --76.0641 --76.0781 --76.0781 --76.0766 --76.0797 --76.075 --76.0578 --76.0734 --76.0687 --76.0687 --76.0734 --76.0656 --76.0781 --76.0641 --76.0719 --76.0734 --76.0687 --76.0844 --76.0766 --76.0766 --76.0719 --76.0641 --76.0609 --76.0547 --76.0563 --76.0641 --76.0578 --76.075 --76.0672 --76.0813 --76.0734 --76.0672 --76.0687 --76.0734 --76.0656 --76.075 --76.0734 --76.0687 --76.0719 --76.0625 --76.0625 --76.0797 --76.0656 --76.0563 --76.0734 --76.0703 --76.0719 --76.0719 --76.0703 --76.0734 --76.0656 --76.0719 --76.0641 --76.0813 --76.0625 --76.0781 --76.0703 --76.0797 --76.0734 --76.0766 --76.0672 --76.0641 --76.0828 --76.0719 --76.0703 --76.0875 --76.0797 --76.0766 --76.0703 --76.0813 --76.0766 --76.0687 --76.0672 --76.0719 --76.0797 --76.075 --76.0813 --76.0859 --76.0813 --76.0875 --76.0969 --76.0844 --76.0781 --76.0687 --76.0734 --76.0734 --76.0703 --76.0781 --76.0734 --76.075 --76.0844 --76.0734 --76.0813 --76.0656 --76.0828 --76.0813 --76.0828 --76.0984 --76.0813 --76.0797 --76.0766 --76.0797 --76.075 --76.0781 --76.0594 --76.0687 --76.0875 --76.0734 --76.0781 --76.0734 --76.0687 --76.0734 --76.0875 --76.0797 --76.075 --76.0687 --76.0719 --76.0875 --76.0734 --76.0703 --76.0719 --76.0781 --76.0734 --76.0734 --76.0906 --76.0766 --76.0719 --76.0672 --76.0844 --76.0656 --76.0984 --76.0734 --76.0719 --76.0797 --76.0687 --76.0609 --76.0703 --76.0687 --76.0625 --76.075 --76.0687 --76.075 --76.0703 --76.0609 --76.0719 --76.0797 --76.0641 --76.0781 --76.0703 --76.0766 --76.0563 --76.0656 --76.0578 --76.0687 --76.0656 --76.0594 --76.0563 --76.0703 --76.0703 --76.0734 --76.0672 --76.0703 --76.0781 --76.0703 --76.0797 --76.0672 --76.0703 --76.0687 --76.0656 --76.0719 --76.0641 --76.0687 --76.0719 --76.0797 --76.0766 --76.0734 --76.0609 --76.0844 --76.0672 --76.0672 --76.0656 --76.0766 --76.0687 --76.0797 --76.0734 --76.0766 --76.0813 --76.0719 --76.0672 --76.0687 --76.0781 --76.0656 --76.0828 --76.0875 --76.0813 --76.0797 --76.0766 --76.1 --76.0953 --76.075 --76.0781 --76.0781 --76.0734 --76.0875 --76.0703 --76.0656 --76.0672 --76.0781 --76.0656 --76.0875 --76.0813 --76.0625 --76.0703 --76.0687 --76.0766 --76.0797 --76.0859 --76.0844 --76.0719 --76.0891 --76.0703 --76.0828 --76.0719 --76.0828 --76.0906 --76.0641 --76.0625 --76.0734 --76.0625 --76.0813 --76.0719 --76.0563 --76.0813 --76.0766 --76.0547 --76.0641 --76.0813 --76.0781 --76.0875 --76.0625 --76.0625 --76.0766 --76.075 --76.0703 --76.075 --76.0734 --76.0656 --76.0781 --76.075 --76.0641 --76.075 --76.0781 --76.075 --76.0703 --76.0563 --76.0625 --76.0766 --76.0687 --76.0703 --76.0578 --76.0641 --76.0719 --76.0859 --76.0797 --76.0828 --76.0563 --76.075 --76.0641 --76.0687 --76.075 --76.0875 --76.0578 --76.0687 --76.0656 --76.0734 --76.0719 --76.0625 --76.0797 --76.0563 --76.0734 --76.0641 --76.0703 --76.0609 --76.0531 --76.0594 --76.0703 --76.0563 --76.0891 --76.0687 --76.0672 --76.0687 --76.0719 --76.0813 --76.0703 --76.0672 --76.0578 --76.0734 --76.0641 --76.0687 --76.0703 --76.0625 --76.0656 --76.0781 --76.0656 --76.0578 --76.0703 --76.0531 --76.0609 --76.0687 --76.0531 --76.0656 --76.0578 --76.0578 --76.0781 --76.0687 --76.0781 --76.0609 --76.0719 --76.0656 --76.0734 --76.0641 --76.0734 --76.0828 --76.0656 --76.0687 --76.0734 --76.0594 --76.0641 --76.0531 --76.0656 --76.0625 --76.0734 --76.0609 --76.0656 --76.0516 --76.0703 --76.0578 --76.0734 --76.0656 --76.0578 --76.0594 --76.0578 --76.0625 --76.0594 --76.0687 --76.0797 --76.0641 --76.0656 --76.0781 --76.0656 --76.0625 --76.0625 --76.0609 --76.0719 --76.0609 --76.0672 --76.0609 --76.075 --76.0781 --76.0578 --76.0781 --76.0609 --76.0906 --76.0734 --76.0625 --76.0813 --76.0625 --76.0734 --76.0687 --76.0687 --76.0703 --76.0781 --76.0594 --76.0734 --76.075 --76.0734 --76.0656 --76.0672 --76.0578 --76.0656 --76.0672 --76.0687 --76.0703 --76.0641 --76.0687 --76.0563 --76.0656 --76.0594 --76.0813 --76.0719 --76.0641 --76.0672 --76.0609 --76.0609 --76.0734 --76.0656 --76.075 --76.0844 --76.0609 --76.0719 --76.0719 --76.0687 --76.075 --76.0734 --76.0734 --76.0641 --76.0703 --76.0797 --76.0547 --76.0734 --76.0734 --76.0703 --76.0859 --76.0578 --76.0672 --76.0625 --76.0656 --76.0766 --76.0813 --76.0672 --76.0734 --76.0484 --76.0766 --76.0703 --76.0734 --76.0594 --76.075 --76.0609 --76.0594 --76.0844 --76.0656 --76.0656 --76.0594 --76.0656 --76.0516 --76.0656 --76.0844 --76.0609 --76.0781 --76.0828 --76.0656 --76.0766 --76.0781 --76.0766 --76.0703 --76.0719 --76.0828 --76.0719 --76.075 --76.0813 --76.0828 --76.0687 --76.0687 --76.0813 --76.0578 --76.0844 --76.0672 --76.0625 --76.0719 --76.0594 --76.0687 --76.0797 --76.0734 --76.0703 --76.0734 --76.0875 --76.0687 --76.0828 --76.0687 --76.0828 --76.0672 --76.0656 --76.0547 --76.0687 --76.0734 --76.0609 --76.0719 --76.075 --76.0766 --76.0797 --76.0813 --76.0687 --76.0672 --76.0687 --76.0578 --76.0828 --76.0641 --76.0828 --76.0625 --76.0672 --76.0813 --76.0828 --76.0719 --76.0672 --76.0703 --76.0641 --76.0625 --76.0656 --76.0734 --76.0641 --76.0625 --76.0641 --76.0766 --76.0703 --76.0781 --76.0609 --76.0656 --76.0672 --76.0656 --76.0625 --76.0703 --76.0719 --76.0687 --76.0625 --76.0594 --76.075 --76.0656 --76.0625 --76.0687 --76.0625 --76.0734 --76.0687 --76.0734 --76.0813 --76.0609 --76.0594 --76.0563 --76.0625 --76.0687 --76.0734 --76.0766 --76.0609 --76.0766 --76.0828 --76.0797 --76.0578 --76.0687 --76.0703 --76.0703 --76.0625 --76.0766 --76.0703 --76.0672 --76.0766 --76.0703 --76.0734 --76.0734 --76.0766 --76.0859 --76.0672 --76.0703 --76.0813 --76.0656 --76.0875 --76.075 --76.0609 --76.0734 --76.0828 --76.0875 --76.0781 --76.0828 --76.0781 --76.0828 --76.0813 --76.0813 --76.0844 --76.0828 --76.0703 --76.0875 --76.0922 --76.0766 --76.0859 --76.0719 --76.075 --76.0656 --76.0687 --76.0797 --76.0672 --76.0578 --76.0781 --76.075 --76.0656 --76.0672 --76.0594 --76.0859 --76.0594 --76.0672 --76.0781 --76.0859 --76.0813 --76.0766 --76.0781 --76.0687 --76.0797 --76.0656 --76.0672 --76.0703 --76.0734 --76.0687 --76.0687 --76.0828 --76.0781 --76.0719 --76.0766 --76.0594 --76.0719 --76.0781 --76.0828 --76.0641 --76.0766 --76.0797 --76.0703 --76.0797 --76.0734 --76.0766 --76.0656 --76.0859 --76.0844 --76.0687 --76.0578 --76.075 --76.0719 --76.0734 --76.0687 --76.0719 --76.0766 --76.075 --76.0594 --76.0734 --76.075 --76.0844 --76.0828 --76.0984 --76.0828 --76.0703 --76.0781 --76.0703 --76.0687 --76.0672 --76.0719 --76.0734 --76.0719 --76.0781 --76.0781 --76.0687 --76.0766 --76.0672 --76.0687 --76.0906 --76.0797 --76.075 --76.0656 --76.0875 --76.0594 --76.0625 --76.0609 --76.0813 --76.0797 --76.0609 --76.0766 --76.0609 --76.0672 --76.0797 --76.0828 --76.0719 --76.0781 --76.0687 --76.0672 --76.0734 --76.0687 --76.0656 --76.0766 --76.075 --76.0703 --76.0687 --76.0719 --76.0719 --76.0797 --76.0891 --76.0719 --76.0656 --76.0719 --76.075 --76.0781 --76.0828 --76.0687 --76.0891 --76.0766 --76.0625 --76.0734 --76.0813 --76.0563 --76.0719 --76.0687 --76.0813 --76.0719 --76.0719 --76.0844 --76.0844 --76.0703 --76.0781 --76.0641 --76.0719 --76.0625 --76.0703 --76.0703 --76.075 --76.0734 --76.0687 --76.0766 --76.075 --76.0719 --76.0734 --76.0797 --76.0859 --76.0797 --76.0703 --76.0797 --76.0797 --76.075 --76.0687 --76.0813 --76.0734 --76.0844 --76.0797 --76.0797 --76.0687 --76.0719 --76.0781 --76.0641 --76.0797 --76.0781 --76.0797 --76.0859 --76.0813 --76.0828 --76.0859 --76.0938 --76.0766 --76.0734 --76.0656 --76.0703 --76.0766 --76.0687 --76.0813 --76.0641 --76.0797 --76.0844 --76.0719 --76.075 --76.0781 --76.0672 --76.0813 --76.0797 --76.0641 --76.0859 --76.0766 --76.075 --76.0734 --76.0813 --76.0719 --76.0656 --76.0875 --76.0813 --76.0891 --76.0828 --76.0766 --76.075 --76.0813 --76.0656 --76.075 --76.0891 --76.0844 --76.0969 --76.0859 --76.0766 --76.0797 --76.0891 --76.0859 --76.0922 --76.0781 --76.0875 --76.0781 --76.0859 --76.0844 --76.075 --76.0797 --76.0797 --76.0844 --76.0813 --76.0859 --76.0781 --76.0891 --76.0656 --76.0859 --76.0609 --76.0922 --76.0844 --76.0797 --76.0719 --76.0891 --76.0875 --76.0781 --76.0859 --76.0844 --76.0687 --76.0797 --76.0844 --76.0875 --76.0766 --76.0828 --76.0859 --76.075 --76.0844 --76.0797 --76.0922 --76.0875 --76.0844 --76.0734 --76.0828 --76.0875 --76.0797 --76.0875 --76.075 --76.0813 --76.0797 --76.0781 --76.075 --76.0844 --76.0672 --76.0766 --76.0641 --76.0813 --76.0797 --76.0766 --76.0875 --76.0797 --76.0844 --76.0922 --76.0844 --76.0906 --76.0813 --76.0938 --76.075 --76.0922 --76.0938 --76.0781 --76.0891 --76.0875 --76.0781 --76.0734 --76.0906 --76.0813 --76.0766 --76.0781 --76.0844 --76.075 --76.0828 --76.0797 --76.0891 --76.0766 --76.0734 --76.0813 --76.0875 --76.0891 --76.0766 --76.0797 --76.0844 --76.0719 --76.0859 --76.0766 --76.0734 --76.0766 --76.0719 --76.0641 --76.0797 --76.0875 --76.0875 --76.0844 --76.0797 --76.0781 --76.0891 --76.0625 --76.0656 --76.0781 --76.0859 --76.075 --76.0859 --76.0828 --76.0766 --76.0672 --76.0641 --76.0609 --76.0687 --76.0781 --76.0687 --76.0687 --76.0828 --76.0734 --76.0687 --76.0734 --76.0687 --76.0891 --76.0719 --76.0719 --76.0687 --76.0719 --76.0672 --76.0687 --76.0656 --76.0547 --76.0625 --76.0625 --76.0656 --76.0625 --76.0703 --76.0703 --76.075 --76.0625 --76.0781 --76.0766 --76.0703 --76.0828 --76.0828 --76.0734 --76.0687 --76.0687 --76.0609 --76.0859 --76.0563 --76.0641 --76.075 --76.0656 --76.0766 --76.0609 --76.0609 --76.075 --76.0609 --76.0625 --76.0656 --76.0609 --76.0703 --76.0641 --76.0766 --76.0578 --76.0656 --76.0734 --76.0547 --76.0609 --76.0719 --76.0719 --76.0531 --76.0687 --76.0766 --76.0687 --76.0687 --76.0766 --76.0656 --76.0672 --76.0734 --76.0766 --76.0734 --76.0594 --76.0781 --76.0766 --76.0578 --76.0703 --76.0625 --76.0687 --76.0547 --76.0625 --76.0625 --76.0563 --76.075 --76.0609 --76.0813 --76.0703 --76.0687 --76.0734 --76.0609 --76.0672 --76.0656 --76.0609 --76.0672 --76.0656 --76.0703 --76.075 --76.0797 --76.0672 --76.0641 --76.0625 --76.0734 --76.0719 --76.0656 --76.0516 --76.0703 --76.0781 --76.0703 --76.0641 --76.075 --76.0797 --76.0703 --76.0656 --76.0625 --76.075 --76.0703 --76.0687 --76.0797 --76.0703 --76.0594 --76.0719 --76.0828 --76.0672 --76.0578 --76.0813 --76.0734 --76.0922 --76.0828 --76.075 --76.0797 --76.0625 --76.0687 --76.0734 --76.0672 --76.0781 --76.0781 --76.0594 --76.0687 --76.0656 --76.075 --76.0813 --76.0781 --76.0859 --76.075 --76.0609 --76.075 --76.0859 --76.0719 --76.0719 --76.0797 --76.0797 --76.0844 --76.0766 --76.075 --76.0813 --76.0719 --76.0687 --76.0719 --76.0859 --76.0766 --76.0797 --76.0672 --76.0859 --76.0625 --76.0609 --76.0813 --76.0734 --76.0844 --76.0766 --76.0734 --76.0734 --76.0672 --76.075 --76.0797 --76.0687 --76.0828 --76.0844 --76.0687 --76.0828 --76.0922 --76.0906 --76.0781 --76.0938 --76.0922 --76.075 --76.075 --76.0781 --76.075 --76.0703 --76.0766 --76.0813 --76.0703 --76.0656 --76.0734 --76.075 --76.0672 --76.0891 --76.0687 --76.0844 --76.075 --76.0828 --76.0703 --76.0719 --76.0719 --76.0719 --76.075 --76.0734 --76.0781 --76.0813 --76.0734 --76.0672 --76.0672 --76.0719 --76.0672 --76.0719 --76.0703 --76.0719 --76.0656 --76.0687 --76.075 --76.0734 --76.0703 --76.0766 --76.0734 --76.075 --76.0781 --76.0687 --76.0719 --76.0766 --76.0719 --76.0734 --76.0656 --76.0547 --76.0672 --76.0828 --76.0563 --76.0672 --76.0719 --76.0672 --76.0641 --76.0719 --76.0625 --76.0703 --76.075 --76.0781 --76.0766 --76.0797 --76.0797 --76.0859 --76.0844 --76.0578 --76.0844 --76.0687 --76.0781 --76.0719 --76.0734 --76.0594 --76.075 --76.0672 --76.0797 --76.0687 --76.0703 --76.0547 --76.0797 --76.0687 --76.0656 --76.0797 --76.0734 --76.0766 --76.0719 --76.075 --76.0891 --76.0844 --76.0672 --76.0687 --76.0687 --76.0813 --76.075 --76.0828 --76.0922 --76.0875 --76.0703 --76.0641 --76.075 --76.0766 --76.0656 --76.0703 --76.0719 --76.0703 --76.0656 --76.0719 --76.0703 --76.0672 --76.0703 --76.0703 --76.0687 --76.0719 --76.0672 --76.0672 --76.0687 --76.0781 --76.0609 --76.0578 --76.0766 --76.075 --76.0594 --76.0719 --76.0844 --76.0672 --76.0656 --76.0594 --76.0578 --76.0687 --76.0672 --76.0625 --76.0625 --76.0578 --76.0687 --76.0656 --76.0719 --76.0641 --76.0594 --76.0719 --76.0656 --76.0656 --76.0641 --76.0578 --76.0656 --76.0625 --76.0531 --76.0656 --76.0609 --76.0797 --76.0625 --76.0641 --76.0672 --76.0625 --76.0734 --76.0563 --76.0516 --76.0719 --76.0625 --76.075 --76.0734 --76.0766 --76.0703 --76.0766 --76.0797 --76.0953 --76.0672 --76.0797 --76.0813 --76.0687 --76.0828 --76.0781 --76.0687 --76.0672 --76.0703 --76.0594 --76.0766 --76.0641 --76.0563 --76.0672 --76.0766 --76.0641 --76.0609 --76.0641 --76.0547 --76.0625 --76.0734 --76.0609 --76.0609 --76.0687 --76.0734 --76.0703 --76.0828 --76.0687 --76.0875 --76.0797 --76.075 --76.0641 --76.0734 --76.0656 --76.0641 --76.075 --76.0641 --76.0906 --76.0625 --76.0719 --76.0703 --76.0734 --76.0578 --76.0656 --76.0734 --76.0734 --76.0703 --76.0578 --76.0641 --76.0719 --76.0625 --76.0703 --76.0766 --76.0766 --76.0672 --76.0703 --76.0734 --76.0734 --76.0641 --76.0563 --76.0656 --76.0672 --76.0734 --76.0625 --76.0687 --76.0609 --76.0594 --76.0703 --76.0453 --76.0641 --76.0516 --76.0484 --76.0719 --76.0703 --76.0469 --76.0625 --76.0563 --76.0641 --76.0672 --76.0609 --76.0547 --76.0609 --76.0547 --76.0531 --76.0469 --76.0547 --76.0563 --76.0609 --76.05 --76.0766 --76.0531 --76.0609 --76.0609 --76.0625 --76.0469 --76.0594 --76.0437 --76.0672 --76.0516 --76.0531 --76.0578 --76.0563 --76.0422 --76.0656 --76.0578 --76.0531 --76.0516 --76.0625 --76.075 --76.0594 --76.0625 --76.0672 --76.0672 --76.0469 --76.0594 --76.0609 --76.0359 --76.0656 --76.0547 --76.0437 --76.0469 --76.0672 --76.0547 --76.0578 --76.0516 --76.0563 --76.05 --76.0609 --76.0437 --76.0594 --76.0484 --76.0641 --76.0594 --76.0594 --76.0687 --76.0594 --76.0672 --76.0672 --76.0734 --76.0625 --76.0531 --76.0578 --76.0578 --76.0656 --76.0516 --76.0594 --76.05 --76.0609 --76.0687 --76.0719 --76.0547 --76.0719 --76.0656 --76.0687 --76.0594 --76.0625 --76.0672 --76.0719 --76.0703 --76.0609 --76.0922 --76.0609 --76.0734 --76.0703 --76.0719 --76.0687 --76.0719 --76.0719 --76.0672 --76.0563 --76.0563 --76.0766 --76.0703 --76.0781 --76.0766 --76.0641 --76.0719 --76.0719 --76.0734 --76.0672 --76.0734 --76.0656 --76.0641 --76.0609 --76.0641 --76.075 --76.0656 --76.0734 --76.0687 --76.0734 --76.0656 --76.0687 --76.0609 --76.0687 --76.0641 --76.0625 --76.0625 --76.0797 --76.0687 --76.0656 --76.0625 --76.0766 --76.0797 --76.0563 --76.0734 --76.0547 --76.0625 --76.0687 --76.0484 --76.0625 --76.0641 --76.0578 --76.0594 --76.0687 --76.0625 --76.0766 --76.0734 --76.0656 --76.0563 --76.0578 --76.0641 --76.0672 --76.0656 --76.0625 --76.0625 --76.0641 --76.0625 --76.0625 --76.0625 --76.075 --76.0719 --76.0563 --76.0703 --76.0531 --76.0578 --76.0578 --76.0641 --76.0578 --76.0594 --76.0641 --76.0578 --76.05 --76.0687 --76.0656 --76.0531 --76.0547 --76.0531 --76.0656 --76.0516 --76.0578 --76.0484 --76.0516 --76.0469 --76.05 --76.0641 --76.0578 --76.0594 --76.0578 --76.0578 --76.0531 --76.0594 --76.0656 --76.0563 --76.0609 --76.0484 --76.05 --76.0484 --76.0625 --76.0531 --76.0516 --76.0484 --76.0578 --76.05 --76.0578 --76.0578 --76.0516 --76.05 --76.0594 --76.0547 --76.0563 --76.0563 --76.0594 --76.0609 --76.0469 --76.0563 --76.0641 --76.0516 --76.0516 --76.0516 --76.05 --76.05 --76.0453 --76.0469 --76.0672 --76.0406 --76.0516 --76.0391 --76.0484 --76.0563 --76.0406 --76.0578 --76.05 --76.0484 --76.0453 --76.05 --76.0469 --76.0563 --76.0516 --76.0375 --76.0422 --76.0469 --76.0359 --76.0516 --76.0469 --76.0312 --76.0484 --76.0437 --76.0594 --76.0437 --76.0437 --76.0578 --76.0422 --76.0437 --76.0406 --76.0531 --76.0563 --76.05 --76.0531 --76.0375 --76.0484 --76.0547 --76.0422 --76.0609 --76.0469 --76.0594 --76.0469 --76.0563 --76.0469 --76.0609 --76.0672 --76.0422 --76.0484 --76.05 --76.0437 --76.0359 --76.0344 --76.0344 --76.0375 --76.0437 --76.05 --76.0406 --76.0547 --76.0469 --76.0422 --76.0484 --76.0297 --76.0469 --76.0453 --76.0344 --76.0422 --76.05 --76.0437 --76.0469 --76.0484 --76.0422 --76.0422 --76.0484 --76.0484 --76.0656 --76.0484 --76.0312 --76.0437 --76.0328 --76.0453 --76.0687 --76.0328 --76.0391 --76.0422 --76.0391 --76.0469 --76.0391 --76.0625 --76.05 --76.0359 --76.0563 --76.0516 --76.0531 --76.05 --76.0469 --76.0406 --76.0484 --76.0484 --76.0422 --76.0453 --76.0375 --76.0328 --76.0422 --76.0375 --76.0563 --76.0563 --76.0406 --76.0422 --76.0453 --76.0641 --76.0344 --76.0578 --76.0594 --76.0484 --76.0516 --76.0469 --76.0609 --76.0594 --76.0484 --76.0391 --76.0437 --76.0531 --76.0547 --76.0469 --76.0437 --76.0563 --76.0531 --76.0547 --76.0406 --76.0469 --76.0484 --76.0391 --76.0437 --76.0547 --76.0531 --76.0547 --76.05 --76.0469 --76.0406 --76.0469 --76.0547 --76.0312 --76.0406 --76.0406 --76.0484 --76.0437 --76.0422 --76.0578 --76.0437 --76.0516 --76.0531 --76.0375 --76.0406 --76.0453 --76.0469 --76.0516 --76.0625 --76.0422 --76.0484 --76.0469 --76.0594 --76.0531 --76.0453 --76.0422 --76.0469 --76.0547 --76.0594 --76.0609 --76.0609 --76.0563 --76.0594 --76.0469 --76.0453 --76.0453 --76.0344 --76.0641 --76.0484 --76.0516 --76.05 --76.0469 --76.0547 --76.0594 --76.0453 --76.0641 --76.0453 --76.0703 --76.0453 --76.0312 --76.0406 --76.0563 --76.0563 --76.05 --76.0531 --76.0422 --76.0578 --76.0531 --76.0391 --76.0406 --76.0516 --76.0516 --76.0578 --76.0594 --76.0531 --76.0453 --76.0453 --76.0266 --76.0609 --76.0484 --76.0516 --76.0453 --76.0484 --76.0375 --76.0406 --76.0422 --76.0437 --76.0469 --76.0453 --76.0328 --76.0594 --76.05 --76.0406 --76.0375 --76.05 --76.0312 --76.0437 --76.0531 --76.0563 --76.0359 --76.0422 --76.0469 --76.0391 --76.0422 --76.0375 --76.0484 --76.0391 --76.05 --76.0437 --76.0531 --76.0344 --76.0453 --76.0563 --76.05 --76.0344 --76.0406 --76.0484 --76.0422 --76.0578 --76.0531 --76.0437 --76.0375 --76.0563 --76.0484 --76.0531 --76.0469 --76.0484 --76.0563 --76.0516 --76.0516 --76.0375 --76.0563 --76.0578 --76.0437 --76.05 --76.0484 --76.0375 --76.0359 --76.0297 --76.0453 --76.0531 --76.0391 --76.0516 --76.0437 --76.0328 --76.0484 --76.0578 --76.0359 --76.0391 --76.0406 --76.0312 --76.0297 --76.0359 --76.0328 --76.0312 --76.0281 --76.0359 --76.0422 --76.0469 --76.0469 --76.0344 --76.0328 --76.0297 --76.0312 --76.0234 --76.0219 --76.0281 --76.0312 --76.0344 --76.025 --76.0406 --76.0156 --76.0359 --76.0469 --76.0359 --76.0328 --76.0328 --76.0406 --76.0328 --76.0281 --76.0391 --76.0344 --76.0406 --76.0375 --76.0391 --76.0531 --76.0484 --76.0422 --76.0391 --76.0406 --76.0281 --76.0516 --76.0422 --76.0312 --76.0391 --76.0406 --76.0266 --76.0406 --76.0281 --76.0359 --76.0391 --76.0391 --76.0516 --76.0344 --76.0406 --76.0391 --76.0453 --76.0359 --76.0391 --76.0234 --76.0453 --76.0281 --76.0469 --76.0437 --76.0359 --76.0422 --76.0437 --76.0359 --76.0391 --76.0344 --76.0375 --76.025 --76.0156 --76.0391 --76.0391 --76.0469 --76.0375 --76.0437 --76.0406 --76.0359 --76.0328 --76.0266 --76.0328 --76.0344 --76.0422 --76.0281 --76.0312 --76.0344 --76.0453 --76.0266 --76.0453 --76.0391 --76.0406 --76.0219 --76.0391 --76.0406 --76.0328 --76.0453 --76.05 --76.0391 --76.0391 --76.0312 --76.025 --76.0266 --76.0328 --76.0375 --76.0312 --76.0312 --76.0281 --76.025 --76.0266 --76.025 --76.0266 --76.0375 --76.0453 --76.0406 --76.0281 --76.0406 --76.0328 --76.0328 --76.0297 --76.0234 --76.0328 --76.0297 --76.0234 --76.0344 --76.0391 --76.0266 --76.0391 --76.0188 --76.0266 --76.0344 --76.0359 --76.0328 --76.0328 --76.0281 --76.0375 --76.0297 --76.0281 --76.0297 --76.0297 --76.0312 --76.0453 --76.0359 --76.0359 --76.0391 --76.0328 --76.0188 --76.0219 --76.0375 --76.0281 --76.0312 --76.0234 --76.0312 --76.0391 --76.0281 --76.0359 --76.0328 --76.0234 --76.0344 --76.0188 --76.0219 --76.0359 --76.0328 --76.0312 --76.0375 --76.0359 --76.0234 --76.0422 --76.0266 --76.0344 --76.0266 --76.0328 --76.0406 --76.0234 --76.0203 --76.0297 --76.0266 --76.0359 --76.0219 --76.0281 --76.0375 --76.0281 --76.0391 --76.0344 --76.0453 --76.0219 --76.0344 --76.0328 --76.0375 --76.0391 --76.0297 --76.0406 --76.0266 --76.0469 --76.0359 --76.0344 --76.0219 --76.0375 --76.0406 --76.0328 --76.0406 --76.0312 --76.0375 --76.0312 --76.0328 --76.0422 --76.0547 --76.0437 --76.05 --76.0406 --76.0359 --76.0219 --76.0188 --76.0312 --76.0281 --76.0297 --76.0188 --76.0375 --76.0125 --76.0172 --76.0156 --76.0391 --76.0297 --76.025 --76.0234 --76.0344 --76.0172 --76.0188 --76.0281 --76.0234 --76.0312 --76.0328 --76.0172 --76.0375 --76.0281 --76.0312 --76.0312 --76.0266 --76.0344 --76.0359 --76.0297 --76.0312 --76.0406 --76.0422 --76.0359 --76.0437 --76.0359 --76.0453 --76.0453 --76.0281 --76.0344 --76.0469 --76.0563 --76.0422 --76.0453 --76.0391 --76.0312 --76.0312 --76.0437 --76.0422 --76.0391 --76.0609 --76.0234 --76.0391 --76.0406 --76.0328 --76.0234 --76.025 --76.0359 --76.0266 --76.0219 --76.0469 --76.0547 --76.0203 --76.0453 --76.0391 --76.0281 --76.0312 --76.0297 --76.0312 --76.0391 --76.0453 --76.0344 --76.0375 --76.0359 --76.0469 --76.0437 --76.0359 --76.0359 --76.0281 --76.0219 --76.0094 --76.0312 --76.0359 --76.0266 --76.0344 --76.0437 --76.0406 --76.0328 --76.0328 --76.0375 --76.0328 --76.0391 --76.0203 --76.0297 --76.0297 --76.0359 --76.0281 --76.0391 --76.0422 --76.0312 --76.0344 --76.0281 --76.025 --76.0359 --76.0484 --76.0516 --76.0484 --76.0234 --76.0531 --76.0625 --76.0344 --76.0453 --76.0609 --76.0422 --76.0563 --76.0437 --76.0469 --76.0422 --76.0453 --76.05 --76.05 --76.05 --76.0391 --76.0469 --76.0422 --76.0516 --76.0484 --76.05 --76.0422 --76.0469 --76.0484 --76.0437 --76.0453 --76.0406 --76.0406 --76.0312 --76.0359 --76.0469 --76.0516 --76.0359 --76.0453 --76.0563 --76.0516 --76.0484 --76.0531 --76.0531 --76.0516 --76.05 --76.0531 --76.0328 --76.0531 --76.0422 --76.0578 --76.0453 --76.0422 --76.05 --76.0406 --76.0453 --76.0469 --76.0609 --76.0359 --76.0391 --76.0281 --76.0406 --76.0391 --76.0375 --76.025 --76.0391 --76.0312 --76.0312 --76.0359 --76.0422 --76.0391 --76.0359 --76.0406 --76.0406 --76.0297 --76.0531 --76.0375 --76.0469 --76.0266 --76.0344 --76.0375 --76.0281 --76.0281 --76.0312 --76.0266 --76.0375 --76.0406 --76.0234 --76.0344 --76.0297 --76.0266 --76.0281 --76.0281 --76.0453 --76.0437 --76.0453 --76.0312 --76.0344 --76.0406 --76.0312 --76.0312 --76.0297 --76.0359 --76.0328 --76.0547 --76.0375 --76.0516 --76.0437 --76.0359 --76.0469 --76.0312 --76.0281 --76.0359 --76.0359 --76.0453 --76.0531 --76.0422 --76.05 --76.0328 --76.0453 --76.0437 --76.0266 --76.0453 --76.0328 --76.0297 --76.0453 --76.0297 --76.0422 --76.0375 --76.0312 --76.0516 --76.0297 --76.0359 --76.0437 --76.0422 --76.0406 --76.0375 --76.0406 --76.0422 --76.0344 --76.0406 --76.0516 --76.0422 --76.0484 --76.0422 --76.0406 --76.0359 --76.0453 --76.05 --76.0406 --76.0281 --76.0375 --76.0484 --76.0484 --76.0359 --76.0516 --76.0422 --76.0328 --76.0578 --76.0469 --76.0516 --76.05 --76.0656 --76.0609 --76.0437 --76.0516 --76.0437 --76.0453 --76.0375 --76.0625 --76.0516 --76.0484 --76.0484 --76.0375 --76.0406 --76.0453 --76.0375 --76.0547 --76.0375 --76.0437 --76.0547 --76.0531 --76.0375 --76.0422 --76.0469 --76.0578 --76.0422 --76.0516 --76.0391 --76.0469 --76.0469 --76.0375 --76.0422 --76.0469 --76.0547 --76.0422 --76.0437 --76.0406 --76.0375 --76.0344 --76.0391 --76.0359 --76.0375 --76.0281 --76.0422 --76.0203 --76.0266 --76.0406 --76.0312 --76.0375 --76.0219 --76.0359 --76.0266 --76.0281 --76.0422 --76.0203 --76.0406 --76.0297 --76.0406 --76.0484 --76.0469 --76.0312 --76.0469 --76.0375 --76.0406 --76.0391 --76.0344 --76.0484 --76.0484 --76.0328 --76.0328 --76.0422 --76.0344 --76.0422 --76.0344 --76.0344 --76.0344 --76.0453 --76.0453 --76.0359 --76.0406 --76.0375 --76.0375 --76.0281 --76.0391 --76.0344 --76.0266 --76.0469 --76.0188 --76.0312 --76.0359 --76.0359 --76.0266 --76.0188 --76.0297 --76.0297 --76.0312 --76.0359 --76.0297 --76.0266 --76.025 --76.0328 --76.0375 --76.0422 --76.0219 --76.0188 --76.0203 --76.0359 --76.0172 --76.0109 --76.0141 --76.0234 --76.0281 --76.0312 --76.0203 --76.0188 --76.025 --76.0078 --76.0344 --76.0281 --76.0281 --76.0344 --76.0359 --76.0281 --76.0375 --76.0219 --76.025 --76.0453 --76.0312 --76.0453 --76.0375 --76.0297 --76.0344 --76.0344 --76.0422 --76.0375 --76.025 --76.025 --76.0344 --76.0297 --76.0391 --76.0203 --76.025 --76.0406 --76.0359 --76.0328 --76.0234 --76.0297 --76.0422 --76.0234 --76.0437 --76.0391 --76.0344 --76.0453 --76.0437 --76.0359 --76.0328 --76.0234 --76.0406 --76.0266 --76.0328 --76.0391 --76.0312 --76.0281 --76.0328 --76.0266 --76.0219 --76.0188 --76.0328 --76.0234 --76.0344 --76.0203 --76.0328 --76.0266 --76.0375 --76.0359 --76.0297 --76.0219 --76.0234 --76.0328 --76.0281 --76.0406 --76.0344 --76.025 --76.0344 --76.0219 --76.0297 --76.0266 --76.0172 --76.0219 --76.0312 --76.0437 --76.0203 --76.0312 --76.0375 --76.0266 --76.0312 --76.0266 --76.025 --76.0219 --76.0234 --76.025 --76.0188 --76.0219 --76.0422 --76.0437 --76.0219 --76.0234 --76.0266 --76.025 --76.0062 --76.025 --76.0188 --76.0203 --76.0172 --76.0266 --76.0281 --76.0281 --76.0234 --76.0234 --76.0219 --76.0234 --76.0109 --76.025 --76.0312 --76.0203 --76.0188 --76.0156 --76.0219 --76.0375 --76.0234 --76.0047 --76.0312 --76.0328 --76.0109 --76.0391 --76.0281 --76.0328 --76.0188 --76.0266 --76.0141 --76.0203 --76.0266 --76.025 --76.0188 --76.0219 --76.0188 --76.0188 --76.0172 --76.0188 --76.0172 --76.0188 --76.0156 --76.0312 --75.9906 --76.0125 --76.0125 --76.0312 --76.0125 --76.0172 --76.0172 --76.0141 --76.0188 --76.0109 --76.0359 --76.0125 --76.0062 --76.0125 --76.0234 --76.0344 --76.0234 --76.0188 --76.0172 --76.0203 --76.0219 --76.0281 --76.0234 --76.0297 --76.0234 --76.0266 --76.0109 --76.0109 --76.0125 --76.0047 --76.0047 --76.0109 --76.0219 --76.0031 --76.0219 --76.0031 --76.0141 --76 --76.0125 --76.0125 --76.0172 --75.9969 --76.0031 --76.0109 --76.0188 --76.0094 --76.0125 --76.0078 --76.0141 --76.0094 --76.025 --76.025 --76.0156 --76.025 --76.0219 --76.0141 --76.0234 --76.0078 --76.0203 --76.0125 --76.0344 --76.0219 --76.0109 --76.0156 --76.0234 --76.0234 --76.0062 --76.0156 --76.0156 --76.0234 --76.0094 --76.0219 --76.0203 --76.0219 --76.0062 --76.025 --76.0266 --76.0172 --76.0109 --76.0156 --76.0219 --76.0078 --76.0219 --76.0188 --76.0328 --76.0172 --76.0062 --76.0156 --76.0172 --76.0156 --76.0078 --76.0188 --76.0094 --76.025 --76.0125 --76.0234 --76.0141 --76.0203 --76.0141 --76.0156 --76.0078 --76.0188 --76.0125 --76.025 --76.0109 --76.0109 --76.0141 --76.0156 --76.0188 --76.0172 --76.0328 --76.0281 --76.0203 --76.0297 --76.0297 --76.0266 --76.0109 --76.0219 --76.0312 --76.0234 --76.0219 --76.0188 --76.0219 --76.0344 --76.0156 --76.0266 --76.0328 --76.0281 --76.0078 --76.0203 --76.0188 --76.0203 --76.0109 --76.025 --76.0234 --76.0188 --76.0156 --76.0125 --76.0094 --76.0125 --76.0078 --76.0281 --76.0094 --76.0234 --76.0109 --76.0016 --76.0125 --76.0094 --76.0219 --76.0203 --76.0219 --76.0297 --76.0109 --76.0188 --76.025 --76.0062 --76.0125 --76.0172 --76.0266 --76.0047 --76.0234 --76.0203 --76.0312 --76.0219 --76.0062 --76.0234 --75.9984 --76.0219 --76.0219 --76 --76.0156 --76.0312 --76.0219 --76.0219 --76.0219 --76.0094 --76.0078 --76.0078 --76.0047 --76.0281 --76.0125 --76.0016 --76.0047 --76.0141 --76.0031 --76.0047 --76.0016 --76.0141 --76.0141 --76.0172 --76.0062 --76.0172 --76.0094 --76.0234 --75.9938 --76.0047 --76.0125 --76.0062 --75.9953 --76.0109 --75.9984 --76.0031 --76.0125 --76.0141 --76.0188 --76.0094 --76.0219 --76.0109 --76.0062 --75.9875 --76.0016 --76.0094 --76.025 --76.0141 --76.0156 --76.0188 --76.025 --76.0234 --76.0062 --76.0266 --76.0172 --76.0312 --76.0188 --76.0047 --76.0203 --76.0234 --76.0062 --76.0109 --76 --76.0062 --76.0141 --76.0078 --76.0188 --76.0156 --76.0172 --76.0188 --76.0141 --76.0062 --76.0172 --76.0188 --76.0172 --76.0156 --75.9969 --76.0172 --76.0172 --76.0172 --76.0016 --76.0188 --76.0125 --76.0094 --76.0016 --75.9984 --76.0078 --76.0047 --76.0156 --75.9891 --76.0047 --76.0109 --76.0031 --76.0016 --76.0062 --76.0047 --76.0125 --75.9953 --76.0094 --76.0062 --76.0031 --75.9922 --75.9984 --76.0062 --76.0047 --76.0125 --76 --75.9984 --76.0031 --76.0031 --75.9953 --76.0031 --75.9969 --76.0094 --76.0094 --76 --76.0094 --76.0203 --76.0031 --76.0016 --75.9984 --76.0125 --76.0141 --76.0094 --76.0062 --76.0062 --76.0031 --76.0141 --76.0219 --75.9875 --76.0109 --76.0062 --76.0094 --76.0141 --76.0078 --76.0125 --76.0156 --76.0125 --76.0125 --76.0016 --76.0062 --76.0172 --75.9953 --76.0141 --75.9953 --76.0016 --75.9969 --76.0125 --76.0047 --76.0031 --75.9984 --76.0062 --76.0062 --75.9922 --76.0031 --75.9922 --76 --75.9953 --76.0016 --76.0125 --76.0016 --76 --75.9969 --76.0031 --76.0156 --75.9922 --76.0109 --76.0016 --75.9984 --76.0047 --75.9969 --75.9953 --76.0078 --75.9922 --76.0031 --76.0047 --76.0125 --76.0141 --76.0047 --76.0156 --76.0078 --76 --75.9984 --76.0094 --76.0016 --76.0109 --76.0078 --76.0016 --75.9984 --75.9984 --76.0016 --76.0094 --76.0062 --75.9906 --76.0016 --76.0078 --75.9953 --76.0094 --76.0094 --76.0047 --75.9953 --75.9953 --76.0031 --76.0047 --75.9969 --76.0062 --76.0109 --75.9969 --76.0109 --76.0078 --76.0016 --75.9906 --76.0016 --75.9969 --76.0062 --75.9875 --75.9953 --76.0094 --76.0016 --76.0141 --75.9891 --75.9953 --76.0047 --76.0062 --76.0078 --76.0078 --75.9906 --75.9938 --75.9969 --75.9953 --75.9953 --75.9969 --76.0125 --76.0016 --75.9953 --76 --76.0031 --76.0141 --76.0016 --76.0078 --76.0031 --76.0078 --76.0156 --76.0031 --76.0047 --76.0078 --76.0141 --75.9969 --76.0031 --75.9984 --75.9938 --75.9969 --76 --76.0078 --76 --76 --76.0141 --75.9938 --75.9953 --76.0078 --76.0078 --76.0109 --76 --75.9906 --76.0062 --76.0078 --76.0156 --75.9969 --76.0078 --76.0141 --75.9922 --76.0078 --76.0062 --76.0125 --76.0062 --76.0203 --76.0172 --76.0141 --76.0203 --76.0172 --76.0141 --76.0188 --76.025 --76.0188 --76.0281 --76.0141 --76.0172 --76.0062 --76.0141 --76.0125 --76.0094 --76.0266 --76.0062 --76.0062 --76.0062 --76.0172 --76.0094 --76.0094 --76 --75.9969 --76.0016 --76.0094 --76.0047 --76.0266 --76.0203 --75.9969 --76.0078 --76.0047 --76.0062 --76.0094 --76.0203 --76.0031 --76.0078 --76.0062 --75.9969 --76.0062 --76.0094 --76.0094 --76.0047 --76.0078 --75.9844 --76.0156 --75.9953 --76.0141 --75.9969 --76.0031 --76.0172 --76 --76.0078 --76.0109 --76.0125 --76.0125 --75.9953 --76.0125 --76.0094 --76.0156 --76.0234 --76.0125 --76.0172 --76 --76.0047 --76.0172 --76.0141 --76.0234 --76.0219 --76.0078 --76.0109 --76.0062 --76.0047 --76.0203 --76 --76.0156 --76.0094 --76.0141 --76.0094 --76.0094 --76 --75.9922 --76.0047 --76.0078 --76.0031 --76.0047 --76.0062 --76.0125 --76 --76.0109 --76.0109 --76.0156 --76.0172 --76.0125 --76.0156 --76.0172 --76.0172 --76.0094 --76.0094 --76.0188 --76.0109 --76.0047 --76.0172 --76.0031 --76.0062 --76.0156 --76 --75.9938 --76.0094 --76.0109 --75.9922 --75.9922 --75.9922 --76.0125 --76.0109 --76.0047 --75.9969 --76.0188 --75.9922 --76.0078 --75.9984 --76.0016 --76.0016 --76.0031 --76.0094 --75.9969 --76.0172 --76.0062 --76.0156 --76.0062 --75.9938 --76.0219 --75.9969 --76.0062 --75.9984 --76.0016 --76.0062 --75.9922 --75.9891 --76.0062 --75.9969 --75.9969 --76.0047 --76.0109 --75.9969 --75.9969 --76.0078 --75.9938 --76.0078 --75.9938 --76.0125 --76.0094 --76.0141 --76.0234 --75.9938 --76.0109 --76.0078 --75.9969 --76.0016 --76.0172 --76.0109 --75.9922 --76.0156 --76.0094 --76.0078 --76.0109 --76.0078 --76.0078 --76 --76.0312 --76.0031 --76.0156 --76.0047 --75.9984 --76.0094 --76.0219 --76.0234 --76.0203 --76.0156 --76.0234 --76.0094 --76.0094 --76.0062 --76.0062 --75.9984 --75.9984 --75.9984 --75.9859 --75.9922 --76.0047 --75.9953 --76.0047 --75.9938 --75.9969 --75.9984 --75.9969 --75.9953 --76.0016 --75.9969 --75.9938 --75.9844 --75.9891 --75.9906 --75.9844 --75.9875 --75.9953 --75.9875 --75.9875 --75.9859 --75.9844 --75.9859 --75.9891 --75.9859 --75.9938 --75.9859 --75.9906 --75.9906 --75.9844 --75.9938 --75.975 --75.9938 --76 --76.0094 --75.9938 --75.9938 --76 --75.9906 --76.0031 --75.9844 --75.9953 --75.9891 --75.9812 --75.9906 --75.9766 --75.9812 --75.9891 --75.9938 --76.0016 --75.9938 --75.9844 --76 --75.9875 --75.975 --75.9844 --75.9984 --75.9859 --75.9859 --76 --75.9844 --75.9781 --75.9844 --75.9953 --75.9875 --75.9828 --75.9969 --75.9938 --75.9844 --75.9922 --75.9859 --75.9812 --75.9844 --75.9797 --75.9781 --75.9844 --75.9828 --75.9797 --75.9828 --75.9797 --75.9875 --75.9859 --75.9828 --75.9875 --75.9797 --75.9719 --75.9797 --75.9938 --75.9781 --75.9844 --75.9781 --75.9797 --75.9969 --75.9969 --75.9828 --75.9922 --75.9875 --75.9953 --75.9891 --75.9906 --75.9891 --75.9969 --75.9906 --75.9953 --76.0062 --75.9906 --75.9859 --75.9922 --76.0016 --75.9938 --75.9938 --75.9875 --75.9891 --75.9953 --75.9953 --75.9844 --76.0016 --75.9984 --75.9984 --75.9875 --75.9984 --75.9906 --75.9875 --75.9906 --75.9844 --75.9922 --75.9938 --75.9906 --75.9891 --75.9922 --75.9859 --75.9859 --75.9953 --75.9906 --75.9922 --75.9922 --75.9938 --75.9953 --76.0031 --75.9859 --76 --76 --76.0094 --75.9938 --75.9875 --75.9984 --75.9906 --75.9953 --75.9984 --76.0016 --75.9891 --75.9922 --75.9891 --76.0016 --75.9953 --76.0062 --75.9828 --76.0062 --76.0078 --76.0047 --75.9922 --75.9984 --76.0047 --76.0031 --75.9859 --75.9766 --75.9953 --75.9906 --75.975 --75.9953 --76.0016 --76.0031 --76 --76.0016 --75.9938 --75.9984 --76 --75.9969 --76.0016 --75.9922 --76.0062 --75.9953 --76.0016 --75.9953 --76.0172 --76.0078 --76 --75.9922 --75.9922 --75.9922 --75.9969 --76.0016 --76 --75.9953 --76.0031 --75.9922 --76.0078 --76.0031 --76.0062 --75.9922 --76.0016 --76.0078 --76.0125 --76.0031 --76.0016 --75.9922 --76.0203 --76.0016 --76.0109 --75.9953 --76.0062 --75.9984 --75.9875 --75.9938 --75.9906 --75.9875 --75.9984 --76.0109 --75.9953 --75.9891 --76 --76.0094 --75.9953 --75.9875 --76.0188 --75.9984 --76.0016 --75.9906 --75.9938 --75.9875 --75.9875 --75.9953 --75.9953 --76.0016 --76.0125 --75.9984 --75.9812 --75.9828 --75.9984 --76.0031 --75.9922 --76 --75.9875 --75.9875 --75.9891 --76.0047 --75.9844 --76.0078 --76.0062 --75.9969 --76.0062 --76.0047 --76.0031 --76.0141 --76.0062 --75.9844 --76.0031 --76.0031 --75.9953 --76.0016 --76 --76.0141 --76 --75.9984 --75.9891 --76.0156 --76.0141 --76.0094 --75.9969 --76.0031 --76.0016 --75.9953 --75.9953 --76 --76.0016 --76.0016 --75.9938 --76.0047 --75.9969 --75.9969 --75.9938 --76.0094 --76.0078 --75.9953 --75.9984 --76.0078 --75.9984 --75.9969 --75.9922 --75.9953 --75.9906 --75.9969 --76.0047 --76.0016 --76.0047 --76.0016 --76.0031 --75.9953 --76.0188 --76.0078 --76.0031 --75.9953 --76.0062 --75.9969 --76.0078 --75.9969 --75.9938 --75.9906 --76.0094 --75.9922 --76 --75.9984 --75.9891 --76 --76.0062 --76.0016 --76.0062 --76.0219 --75.9953 --75.9891 --76.0062 --76.0125 --75.9984 --76.0031 --75.9984 --75.9891 --75.9984 --76.0078 --76.0109 --76.0062 --76.0094 --76.0047 --76.0141 --76.0156 --76.0125 --76.0094 --76.0109 --76.0016 --75.9984 --76.0031 --76.0125 --76.0047 --76.0047 --75.9969 --76.0062 --76.0156 --76.0062 --76 --76.0031 --76.0047 --76.0031 --76.0016 --76.0094 --76.0141 --76.0047 --75.9984 --76.0094 --76.0125 --76.0125 --76.0172 --76.0031 --75.9984 --75.9984 --75.9953 --75.9875 --75.9969 --75.9953 --75.9969 --75.9984 --76.0109 --76.0094 --76.0094 --76.0141 --76.0031 --75.9969 --75.9984 --76.0031 --75.9969 --76.0016 --75.9969 --75.9859 --76.0031 --76.0031 --76.0141 --76.0062 --76.0172 --76.0047 --75.9984 --76.0047 --76.0094 --75.9859 --76 --75.9953 --76.0016 --75.9969 --75.9953 --76.0016 --76.0062 --75.975 --75.9922 --76.0047 --76.0016 --75.9953 --75.9953 --76.0016 --76.0172 --76.0047 --75.9969 --76.0062 --76 --76.0062 --76.0156 --76.0109 --76.0078 --75.9953 --76.0047 --76.0094 --76.0109 --76.0031 --76.0031 --76.0016 --76.0078 --76.0078 --76.0078 --75.9953 --76.0047 --76.0062 --76.0031 --76.0062 --75.9875 --75.9984 --75.9828 --75.9891 --76.0031 --75.9984 --75.9922 --76 --76.0109 --76.0062 --76.0062 --76.0031 --75.9984 --76.0141 --76.0078 --76.0062 --76 --76.0094 --76.0047 --76 --75.9891 --76 --75.9859 --76.0141 --76.0156 --76 --76.0125 --75.9828 --75.9891 --76 --75.9922 --76.0031 --76.0078 --76.0062 --75.9922 --76.0062 --76 --75.9922 --75.9953 --75.9953 --75.9938 --75.9922 --75.9859 --75.9828 --75.9984 --75.9922 --75.9812 --75.9906 --76 --75.9938 --75.9875 --76.0031 --75.9906 --75.9891 --75.9906 --75.9859 --75.9875 --75.9875 --75.9953 --75.9969 --76 --75.9875 --75.9922 --75.9922 --76.0031 --76.0078 --76.0156 --75.9875 --76.0016 --76.0031 --76.0031 --75.9969 --75.9984 --75.9953 --76.0094 --75.9859 --75.9969 --75.9984 --75.9984 --75.9984 --75.9781 --75.9938 --75.9875 --76.0125 --76.0016 --76.0031 --76.0031 --76.0141 --76 --76.0062 --76.0062 --76.0016 --76.0016 --76.0234 --75.9953 --76.0031 --76.0016 --76.0062 --76 --76.0141 --76.0125 --76.0094 --76.0203 --76.0031 --76.0109 --76.0109 --76.0094 --76.0109 --76.0094 --76 --76.0078 --76.0203 --76.0047 --76.0172 --76 --76.0031 --76.0062 --76.0094 --75.9984 --75.9969 --76.0125 --76.0141 --75.9953 --76.0125 --76.0172 --76.0047 --76.0094 --76.0031 --76.0094 --75.9938 --75.9906 --76.0094 --75.9938 --76.0031 --76.0094 --76 --75.9906 --76.0047 --76 --76.0078 --76.0078 --75.9938 --76.0031 --75.9969 --76.0172 --75.9953 --75.9891 --76.0016 --76.0047 --76.0078 --75.9953 --76.0219 --76 --76.0188 --75.9844 --76.0094 --75.9906 --76 --75.9906 --76.0031 --75.9922 --76.0031 --76 --75.9891 --75.9938 --76.0078 --76.0188 --76.0031 --75.9984 --75.9969 --76.0047 --76.0078 --75.9969 --76.0047 --75.9938 --76.0094 --76 --76.0125 --76 --75.9922 --75.9969 --75.9859 --75.9938 --75.9906 --75.9938 --76 --75.9891 --75.9984 --75.9969 --75.9938 --75.9984 --76.0031 --75.9969 --76.0062 --75.9906 --76.0016 --76.0141 --75.9859 --75.9875 --75.9906 --76.0031 --76.0047 --75.9969 --76 --75.9969 --75.9953 --75.9969 --75.9969 --76 --76 --76 --75.9953 --76 --76.0016 --75.9938 --75.9984 --75.9922 --76.0047 --75.9891 --76 --76.0031 --75.9953 --76.0047 --75.9922 --75.9984 --75.9922 --75.9938 --75.9875 --75.9938 --75.9969 --76 --75.9875 --76.0047 --75.9844 --75.9953 --75.9953 --76.0062 --75.9938 --75.9953 --76.0031 --75.9953 --76.0016 --76.0031 --76.0047 --76.0125 --76.0234 --76.0031 --76.0172 --76.0031 --76.0125 --76.0047 --75.9953 --76.0094 --76.0094 --76 --75.9969 --76.0109 --76.0094 --76.0062 --76.0047 --76.0031 --75.9953 --76.0109 --76.0031 --76.0031 --75.9938 --76.0031 --75.9969 --76 --75.9891 --75.9891 --76.0016 --75.9953 --75.9922 --75.9953 --76.0031 --75.9906 --76.0031 --75.9938 --76.0062 --76.0047 --75.9969 --76.0125 --75.9891 --76.0031 --75.9969 --76 --76.0047 --76.0016 --76.0109 --76.0094 --76.0078 --76.0031 --75.9984 --76 --75.9969 --76.0016 --75.9953 --76.0031 --76.0062 --75.9906 --76.0047 --75.9891 --76.0203 --76.0172 --75.9875 --76.0141 --75.9969 --75.9953 --75.9984 --76.0109 --76.0047 --75.9969 --76.0078 --75.9875 --76.0016 --75.9891 --76 --75.9875 --75.9953 --76.0016 --75.9969 --75.9906 --76.0062 --76.0062 --76.0016 --76 --75.9938 --75.9969 --75.9984 --76.0016 --75.9859 --75.9891 --75.9969 --75.9969 --75.9781 --76.0016 --75.9984 --75.9953 --75.9984 --75.9922 --76.0031 --75.9875 --75.9938 --76 --75.9953 --75.9828 --75.9953 --76 --76.0016 --75.9922 --75.9938 --76.0109 --75.9922 --75.9938 --75.9844 --75.9828 --75.9875 --75.9797 --75.9922 --75.9984 --75.9812 --76.0016 --75.9953 --76.0047 --75.9922 --75.9969 --75.9812 --75.9922 --75.9969 --75.9938 --75.9906 --76.0078 --75.9906 --75.9859 --76 --75.9844 --75.9891 --75.9953 --75.9984 --75.9922 --75.9906 --75.9906 --75.975 --75.9922 --75.9688 --75.9688 --75.9766 --75.9922 --75.9844 --75.9781 --75.9828 --75.9969 --75.9922 --75.9797 --75.9859 --75.9922 --75.9812 --75.9844 --75.9969 --75.9891 --75.9891 --75.9891 --76 --75.9891 --75.9844 --75.9859 --75.9922 --75.9984 --75.9781 --75.9922 --75.9891 --75.9922 --76.0094 --76 --75.9906 --75.9844 --75.9906 --75.9984 --76.0047 --75.9891 --75.9844 --75.9859 --75.9875 --75.9906 --75.9969 --75.9969 --75.9875 --76.0016 --76.0016 --76 --75.9906 --75.9875 --76.0031 --75.9891 --75.9781 --75.9922 --75.9938 --75.9828 --75.9844 --76.0031 --75.9844 --75.9812 --75.9859 --75.9781 --75.9844 --75.9906 --76 --75.9891 --75.9875 --75.9906 --75.9734 --75.9859 --75.9969 --75.9766 --75.9969 --75.975 --75.9969 --75.9938 --75.9859 --75.9812 --75.9812 --75.9938 --75.9734 --75.9891 --75.9828 --75.9922 --75.975 --75.9969 --75.9922 --76.0031 --76.0062 --75.9938 --75.9844 --76 --75.9781 --75.9719 --75.9812 --75.9844 --75.9938 --75.975 --75.9938 --75.9922 --75.9969 --76.0016 --75.9875 --75.9969 --75.9906 --75.9844 --75.9891 --75.9969 --75.9922 --75.9844 --75.9891 --75.9969 --75.9859 --76.0016 --75.9969 --75.9891 --75.9875 --75.9953 --76.0062 --76.0031 --75.9984 --75.9938 --75.9922 --75.9969 --76.0016 --76 --75.9906 --76.0031 --76.0062 --76.0016 --75.9859 --76.0062 --76.0109 --75.9844 --76.0125 --75.9938 --75.9984 --76.0031 --75.9953 --75.9984 --75.9938 --75.9859 --76 --76.0016 --75.9906 --76 --75.9984 --75.9938 --75.9922 --76.0094 --76.0016 --75.9969 --76 --75.9969 --76.0047 --75.9859 --76.0078 --75.9875 --76.0047 --75.9938 --75.9984 --75.9969 --75.9891 --75.9984 --75.9984 --76.0047 --76.0141 --76.0016 --76.0125 --75.9984 --75.9969 --75.9906 --75.9875 --75.9891 --75.9953 --75.9859 --76 --76.0016 --75.9938 --75.9953 --75.9953 --76.0109 --76.0016 --75.9906 --75.9984 --75.9906 --75.9938 --75.9797 --75.9875 --75.9984 --75.9891 --75.9922 --75.9969 --75.9828 --76.0016 --75.9859 --75.9922 --75.9938 --75.9938 --75.9953 --75.9891 --75.9922 --76.0062 --75.9891 --76 --75.9891 --75.9953 --76.0031 --75.9891 --75.9938 --76.0031 --76.0047 --75.9938 --75.9828 --75.9969 --75.9781 --75.9938 --75.9844 --76 --75.9938 --76.0094 --76 --75.9906 --75.9922 --75.9875 --76 --75.9953 --75.9891 --75.9734 --76.0031 --75.9797 --76.0031 --75.9938 --75.9984 --76.0031 --75.9969 --75.9984 --76.0062 --75.9938 --75.9938 --75.9922 --75.9828 --76.0016 --75.9922 --75.9875 --76.0047 --75.9828 --75.9891 --75.9906 --76.0016 --75.9891 --76.0047 --76 --76.0047 --76.0047 --76 --76.0078 --76.0109 --76.0156 --76.0094 --76.0125 --75.9969 --76.0062 --76.0047 --76.0062 --75.9906 --75.9938 --75.9938 --75.9922 --75.9922 --75.9984 --76.0047 --75.9859 --75.9922 --75.9781 --75.9859 --75.9875 --75.9922 --75.9781 --75.9938 --75.9938 --75.9984 --75.9922 --75.9875 --75.9875 --75.9844 --75.9875 --75.9844 --75.9844 --75.9875 --75.9984 --76 --75.9969 --75.9984 --76.0094 --75.9859 --75.9969 --75.9922 --75.9828 --75.9922 --75.9953 --75.9875 --75.9891 --76 --75.9984 --75.9969 --75.9984 --75.9922 --75.9953 --75.9797 --75.9891 --75.9812 --75.9938 --75.9797 --75.9906 --75.9906 --75.9891 --75.9844 --75.9969 --75.9984 --75.9938 --75.9875 --75.9922 --75.9797 --75.9906 --75.9828 --75.9984 --75.9938 --76 --75.9891 --76.0125 --76.0078 --76.0016 --75.9844 --75.9984 --75.9938 --75.9906 --75.9969 --75.9938 --75.9938 --76 --76 --75.9969 --75.9969 --75.9938 --75.9891 --75.9938 --76.0016 --75.9875 --76.0031 --75.9906 --75.9906 --75.9922 --76.0062 --75.9984 --75.9938 --76.0109 --76.0109 --76.0047 --75.9953 --76 --76.0031 --76.0094 --76.0016 --75.9953 --76.0062 --76.0031 --75.9938 --75.9938 --76.0078 --75.9969 --76.0047 --76.0078 --76.0094 --76.0031 --75.9938 --75.9938 --76.0078 --75.9906 --75.9938 --76.0062 --75.9969 --75.9906 --75.9969 --75.9984 --75.9938 --76.0016 --75.9906 --76.0047 --75.9969 --76.0156 --76 --76.0094 --76.0047 --76.0078 --76.0109 --75.9938 --75.9953 --75.9984 --75.9938 --75.9938 --75.9938 --75.9891 --75.9938 --75.9797 --76 --75.9859 --75.9984 --76.0016 --76 --75.9891 --76.0078 --75.9969 --75.9922 --76.0016 --76.0078 --75.9906 --76.0016 --76.0031 --75.9922 --75.9953 --76 --75.9953 --75.9906 --76.0031 --76.0078 --76.0062 --76.0062 --76.0109 --76.0141 --76.0016 --76.0094 --76.0172 --76.0094 --76.0078 --76 --76.0062 --76.0156 --76.0047 --76.0078 --76.0125 --76.0156 --75.9969 --76.0234 --76.0016 --76.0062 --76.0047 --76.0094 --75.9906 --75.9984 --75.9922 --76.0125 --76.0125 --75.9969 --75.9969 --76.0109 --76 --76.0047 --76.0172 --75.9953 --75.9875 --75.9922 --76.0094 --75.9984 --75.9969 --75.9906 --76.0062 --76.0062 --76.0031 --76.0031 --76.0047 --76.0031 --76.0234 --76.0016 --75.9984 --76.0141 --75.9812 --76.0172 --76.0078 --75.9984 --76.0016 --75.9875 --76.0031 --75.9922 --75.9891 --75.9953 --75.9828 --75.9922 --75.9922 --75.9797 --75.9938 --75.9828 --75.9984 --75.9891 --75.9953 --75.9938 --75.9859 --75.9953 --75.9906 --76.0031 --75.9922 --75.9953 --75.9906 --75.9875 --75.9875 --75.9891 --76 --75.9906 --75.9875 --75.9922 --76.0062 --75.9984 --75.9969 --76.0109 --75.9891 --76.0016 --75.9938 --75.9984 --75.9922 --76.0062 --76.0047 --75.9969 --75.9953 --75.9938 --76 --76.0016 --76.0047 --75.9875 --75.9938 --76.0016 --75.9906 --75.9906 --76.0047 --75.9953 --76.0016 --76.0062 --75.9859 --75.9953 --75.9938 --75.9969 --75.9984 --76.0125 --75.9969 --75.9844 --75.9875 --75.9953 --76.0047 --76.0016 --76.0031 --75.9922 --75.9922 --75.9984 --76 --76 --75.9906 --75.9969 --75.9969 --75.9953 --76.0094 --76.0125 --75.9906 --75.9969 --76 --75.9906 --75.9969 --75.9953 --76.0094 --75.9969 --75.9953 --75.9922 --76.0031 --76.0078 --75.9938 --76 --75.9969 --75.9812 --75.9906 --75.9844 --75.9844 --75.9906 --75.9797 --75.9906 --75.9875 --75.9875 --75.9969 --76.0016 --75.9922 --75.9938 --75.9984 --76.0078 --76 --76.0047 --75.9922 --75.9984 --76.0031 --75.9938 --75.9875 --76 --75.9922 --76 --76.0062 --76.0078 --75.9859 --75.9875 --75.9844 --75.9797 --75.9922 --75.9781 --75.9891 --75.9812 --75.9844 --75.9844 --75.9984 --75.9938 --75.9859 --75.9781 --75.9875 --75.9766 --75.9906 --75.9875 --75.9859 --75.9797 --75.9859 --75.9766 --76.0016 --75.9812 --75.9797 --75.9938 --76 --75.9875 --75.9906 --75.9984 --75.9984 --75.9875 --75.9984 --76.0016 --75.9953 --75.9953 --75.9984 --75.9969 --76.0031 --75.9969 --76.0031 --75.9844 --76.0016 --75.9953 --76.0047 --75.9984 --76.0062 --76.0109 --76.0016 --76.0094 --76.0047 --75.9906 --76.0016 --76.0094 --76.0141 --75.9844 --75.9969 --75.9953 --75.9984 --76.0016 --76 --76.0094 --76 --76.0062 --76.0016 --75.9781 --75.9922 --75.9812 --75.9922 --75.9906 --75.9969 --75.9969 --75.9906 --76.0062 --76 --76.0078 --75.9891 --75.9969 --76 --76.0031 --76.0094 --76.0062 --75.9906 --76.0047 --75.9922 --75.9922 --75.9812 --76.0031 --75.9969 --75.9953 --75.9938 --75.9984 --76.0078 --75.9938 --75.9969 --75.9906 --75.9766 --75.9844 --76.0016 --75.9875 --75.9938 --75.9891 --75.9938 --75.9969 --75.9984 --75.9812 --75.9859 --75.9906 --75.9891 --75.9875 --75.9844 --75.975 --75.9734 --75.9812 --75.9812 --75.9734 --75.9625 --75.9703 --75.9922 --75.9703 --75.9766 --75.9922 --75.9656 --75.9766 --75.9812 --75.9797 --75.9781 --75.9938 --75.9891 --75.975 --75.9828 --75.9906 --75.9906 --75.9875 --75.975 --75.9875 --75.975 --75.9781 --75.9875 --75.9875 --75.9906 --75.9922 --75.9906 --75.9922 --75.9969 --75.9859 --75.9906 --75.9891 --75.9875 --75.9781 --75.9891 --75.9859 --75.9859 --76.0062 --75.9828 --75.9828 --75.9969 --75.9891 --76.0047 --75.9812 --75.9922 --75.9891 --75.9906 --75.9891 --75.9859 --76.0094 --75.9828 --76 --76.0062 --75.9922 --75.9938 --75.9953 --75.9891 --75.9844 --75.9938 --75.9953 --75.9703 --75.9953 --75.9875 --76 --75.975 --75.9984 --75.9938 --76.0109 --75.9859 --75.9938 --75.9969 --76.0031 --76.0031 --76.0016 --76.0016 --75.975 --75.9922 --76.0016 --75.9875 --75.9875 --75.9953 --75.9875 --75.9969 --75.9859 --75.9766 --75.9922 --75.975 --75.9734 --75.9828 --75.9859 --75.9922 --75.9766 --75.9859 --75.9797 --75.975 --75.9812 --75.9766 --75.9719 --75.9766 --75.9844 --75.9781 --75.9766 --75.9922 --75.9828 --75.9969 --75.9844 --75.9953 --75.9828 --75.9812 --75.9922 --75.9859 --75.9797 --75.9781 --75.9906 --75.9828 --75.9734 --75.9891 --75.9688 --75.9797 --75.9766 --75.9781 --75.9969 --75.9797 --75.9797 --75.9938 --75.9953 --75.9812 --76.0031 --75.9922 --75.9875 --75.9906 --75.9922 --75.9859 --75.9953 --75.9875 --75.9922 --76.0016 --75.9922 --75.9984 --75.9844 --75.9953 --75.9938 --75.9844 --75.975 --75.9891 --75.9797 --75.9844 --75.9734 --75.9734 --76.0031 --75.9969 --75.9781 --75.9719 --75.9781 --75.9719 --75.9797 --75.9828 --75.9812 --75.9828 --75.975 --75.9766 --75.9812 --75.9906 --75.9875 --75.9797 --75.9812 --75.9797 --75.9891 --75.9953 --75.975 --75.9828 --75.9781 --75.975 --75.9812 --75.9797 --75.975 --75.9938 --75.9812 --75.9875 --75.9797 --75.9828 --75.9906 --75.9812 --75.9781 --75.9844 --75.9875 --75.9844 --75.9609 --75.9953 --75.9812 --75.9656 --75.9734 --75.975 --75.9875 --75.9797 --75.9828 --75.9625 --75.9875 --75.9797 --75.9938 --75.975 --75.9891 --75.9844 --75.9797 --75.9828 --75.975 --75.9781 --75.9828 --75.9766 --75.9922 --75.975 --75.9828 --75.9859 --75.9781 --75.9875 --75.9844 --75.9797 --75.9812 --75.9734 --75.9875 --75.9797 --75.9953 --75.9719 --75.9953 --75.9953 --75.9609 --75.9734 --75.9781 --75.9719 --75.9844 --75.9734 --75.9797 --75.9797 --75.9688 --75.9828 --75.9781 --75.9641 --75.9828 --75.975 --75.9797 --75.9703 --75.9812 --75.9766 --75.9766 --75.975 --75.975 --75.9734 --75.9781 --75.9781 --75.9844 --75.9844 --75.9656 --75.9719 --75.9766 --75.9703 --75.9703 --75.9781 --75.9797 --75.9672 --75.9812 --75.9844 --75.9812 --75.9703 --75.9828 --75.9766 --75.9828 --75.9797 --75.9922 --75.9781 --75.9906 --75.9734 --75.9797 --75.9844 --75.9812 --75.9766 --75.9891 --75.9828 --75.9875 --75.9766 --75.9812 --75.9859 --75.9688 --75.9922 --75.9844 --75.9844 --75.9891 --75.9719 --75.9797 --75.9609 --75.975 --75.9938 --75.9906 --75.9812 --76 --75.975 --75.9703 --75.9828 --75.9766 --75.975 --75.9703 --75.9688 --75.9734 --75.9781 --75.9719 --75.9703 --75.9719 --75.9594 --75.9516 --75.9688 --75.9563 --75.9844 --75.9656 --75.9734 --75.9641 --75.9812 --75.9844 --75.9844 --75.9766 --75.9812 --75.9812 --75.9812 --75.9656 --75.9672 --75.9719 --75.9734 --75.9844 --75.9906 --75.9797 --75.9719 --75.9859 --75.9781 --75.9797 --75.9781 --75.9828 --75.9781 --75.975 --75.9781 --75.9688 --75.9672 --75.9625 --75.9812 --75.9703 --75.9781 --75.9797 --75.9719 --75.9922 --75.9797 --75.9844 --75.9734 --75.9641 --75.9703 --75.9688 --75.975 --75.9828 --75.9703 --75.9703 --75.9766 --75.9656 --75.9703 --75.9797 --75.9828 --75.9797 --75.9938 --75.975 --75.9688 --75.9734 --75.9719 --75.9734 --75.9719 --75.9781 --75.9797 --75.9703 --75.9672 --75.9734 --75.9812 --75.9781 --75.9781 --75.975 --75.9812 --75.9781 --75.9641 --75.9703 --75.9734 --75.9844 --75.9875 --75.9719 --75.9703 --75.975 --75.9891 --75.9719 --75.9734 --75.9812 --75.9719 --75.9625 --75.9703 --75.9625 --75.9641 --75.9578 --75.9688 --75.9797 --75.9672 --75.9609 --75.9672 --75.9734 --75.9547 --75.9828 --75.9828 --75.9766 --75.9594 --75.9844 --75.9578 --75.9781 --75.9766 --75.9906 --75.9781 --75.9656 --75.9812 --75.975 --75.9734 --75.9703 --75.9672 --75.9703 --75.9609 --75.9625 --75.9672 --75.9688 --75.9609 --75.9625 --75.9734 --75.975 --75.9563 --75.9656 --75.9719 --75.9688 --75.9594 --75.9641 --75.9812 --75.975 --75.9641 --75.9812 --75.9797 --75.9688 --75.9656 --75.9719 --75.9656 --75.9703 --75.9625 --75.9656 --75.9578 --75.9781 --75.9625 --75.9453 --75.9672 --75.9625 --75.9812 --75.9531 --75.9578 --75.9563 --75.9578 --75.9672 --75.9609 --75.9672 --75.9594 --75.9734 --75.9625 --75.9766 --75.9766 --75.9812 --75.9766 --75.9719 --75.975 --75.9781 --75.9781 --75.9781 --75.9734 --75.9688 --75.9734 --75.9797 --75.9828 --75.9797 --75.9703 --75.9594 --75.9766 --75.975 --75.9656 --75.9703 --75.9672 --75.9688 --75.9781 --75.9703 --75.9844 --75.9875 --75.9828 --75.975 --75.9812 --75.9625 --75.9781 --75.9781 --75.9859 --75.9672 --75.9672 --75.9797 --75.9703 --75.975 --75.975 --75.9656 --75.9594 --75.9578 --75.9625 --75.9781 --75.9531 --75.9625 --75.9578 --75.9688 --75.9641 --75.9672 --75.9703 --75.9672 --75.9625 --75.9656 --75.9703 --75.9703 --75.9641 --75.9609 --75.9641 --75.9609 --75.95 --75.9797 --75.9563 --75.9734 --75.9719 --75.9719 --75.9625 --75.9766 --75.9781 --75.9656 --75.9812 --75.9531 --75.9594 --75.9703 --75.9609 --75.9781 --75.9797 --75.9688 --75.975 --75.975 --75.9656 --75.9797 --75.9703 --75.9625 --75.9812 --75.9609 --75.9641 --75.9656 --75.9672 --75.9578 --75.9625 --75.9578 --75.9641 --75.9563 --75.9781 --75.9656 --75.9781 --75.975 --75.9625 --75.9656 --75.9688 --75.9703 --75.9828 --75.9563 --75.9656 --75.9656 --75.9594 --75.9797 --75.9641 --75.9828 --75.9641 --75.9656 --75.9875 --75.9688 --75.9766 --75.9688 --75.9625 --75.9563 --75.9703 --75.9766 --75.9578 --75.9672 --75.9656 --75.9563 --75.9812 --75.9516 --75.9609 --75.95 --75.9563 --75.9609 --75.9766 --75.9766 --75.9625 --75.9547 --75.9609 --75.9703 --75.9703 --75.9688 --75.9672 --75.9797 --75.9719 --75.9625 --75.9563 --75.9609 --75.9703 --75.9719 --75.9609 --75.9781 --75.9625 --75.9797 --75.9828 --75.9812 --75.9734 --75.9594 --75.9609 --75.9609 --75.9578 --75.9578 --75.9641 --75.9656 --75.9672 --75.9672 --75.9625 --75.9625 --75.9609 --75.9781 --75.9609 --75.9563 --75.9656 --75.9578 --75.9781 --75.9734 --75.9609 --75.9641 --75.9609 --75.9516 --75.9703 --75.9734 --75.9766 --75.9719 --75.9703 --75.9688 --75.9625 --75.9688 --75.9703 --75.9719 --75.9766 --75.9531 --75.9766 --75.9531 --75.975 --75.9641 --75.9672 --75.9719 --75.9688 --75.95 --75.9563 --75.9609 --75.9625 --75.9781 --75.9656 --75.9703 --75.9563 --75.9609 --75.9828 --75.9656 --75.9719 --75.9625 --75.9703 --75.9719 --75.9672 --75.9688 --75.9609 --75.9609 --75.9563 --75.9688 --75.9547 --75.9609 --75.9516 --75.9578 --75.9656 --75.9594 --75.9641 --75.9578 --75.9484 --75.9547 --75.9594 --75.9672 --75.9625 --75.9781 --75.9578 --75.9719 --75.975 --75.9578 --75.9844 --75.9656 --75.9688 --75.9766 --75.9797 --75.9719 --75.9625 --75.9703 --75.9703 --75.9688 --75.9719 --75.9641 --75.9609 --75.9797 --75.975 --75.9672 --75.9703 --75.9625 --75.9688 --75.975 --75.9688 --75.975 --75.9766 --75.9797 --75.9594 --75.9766 --75.9656 --75.9609 --75.975 --75.9734 --75.9641 --75.9734 --75.9734 --75.9844 --75.9781 --75.9734 --75.9859 --75.9688 --75.9688 --75.975 --75.9734 --75.975 --75.9594 --75.9641 --75.9578 --75.9609 --75.9703 --75.9672 --75.9672 --75.9734 --75.9641 --75.975 --75.9719 --75.9734 --75.9609 --75.9734 --75.9688 --75.9719 --75.9672 --75.9469 --75.9641 --75.9484 --75.9578 --75.9703 --75.9766 --75.9625 --75.9641 --75.9688 --75.9609 --75.9859 --75.975 --75.9547 --75.9609 --75.9812 --75.9734 --75.9781 --75.9781 --75.9734 --75.9641 --75.9812 --75.9703 --75.9766 --75.9656 --75.975 --75.975 --75.9766 --75.975 --75.9766 --75.9844 --75.9844 --75.9875 --75.9828 --75.9875 --75.9734 --75.9906 --75.9734 --75.9766 --75.9891 --75.9859 --75.9625 --75.9766 --75.9781 --75.9781 --75.9891 --75.9781 --75.9781 --75.9766 --75.9781 --75.9781 --75.9609 --75.9641 --75.9766 --75.9734 --75.9594 --75.9688 --75.9766 --75.9719 --75.9563 --75.9609 --75.9641 --75.9609 --75.9719 --75.9516 --75.9766 --75.9563 --75.9656 --75.9609 --75.9719 --75.975 --75.9641 --75.9578 --75.9734 --75.9734 --75.9703 --75.975 --75.9688 --75.9656 --75.9641 --75.9797 --75.9672 --75.9797 --75.9672 --75.9906 --75.9797 --75.9703 --75.9828 --75.9672 --75.9641 --75.9594 --75.9672 --75.9812 --75.9688 --75.975 --75.9734 --75.9672 --75.9844 --75.9812 --75.9781 --75.9703 --75.9719 --75.9703 --75.9844 --75.9766 --75.9719 --75.9766 --75.9688 --75.9844 --75.9828 --75.9859 --75.9656 --75.9812 --75.9688 --75.9688 --75.9766 --75.9828 --75.9734 --75.9812 --75.9734 --75.9688 --75.9828 --75.9703 --75.9812 --75.975 --75.9875 --75.9719 --75.9812 --75.9656 --75.9844 --75.9656 --75.9703 --75.9719 --75.9656 --75.9766 --75.9797 --75.9797 --75.9734 --75.9844 --75.9641 --75.9656 --75.9641 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9922 --75.975 --75.9797 --75.9734 --75.9812 --75.9734 --75.9797 --75.9844 --75.9719 --75.9844 --75.9797 --75.9703 --75.975 --75.9641 --75.9688 --75.9734 --75.9781 --75.9812 --75.9625 --75.9641 --75.9703 --75.9766 --75.9766 --75.9812 --75.9859 --75.9688 --75.9797 --75.9703 --75.9641 --75.9844 --75.975 --75.9719 --75.9609 --75.9734 --75.9938 --75.9688 --75.9703 --75.9812 --75.9734 --75.9641 --75.9656 --75.975 --75.975 --75.9766 --75.9734 --75.9781 --75.9812 --75.9719 --75.9609 --75.9797 --75.9844 --75.9625 --75.9719 --75.9781 --75.9734 --75.975 --75.9609 --75.9781 --75.9766 --75.9766 --75.975 --75.9703 --75.9797 --75.9812 --75.9703 --75.9766 --75.9688 --75.9734 --75.975 --75.975 --75.9734 --75.9625 --75.9766 --75.9766 --75.9719 --75.9781 --75.9625 --75.9719 --75.9672 --75.9719 --75.9781 --75.9641 --75.9688 --75.9719 --75.9672 --75.9859 --75.975 --75.9797 --75.9672 --75.9609 --75.9828 --75.9766 --75.9766 --75.9781 --75.9719 --75.9859 --75.9703 --75.9703 --75.9641 --75.9766 --75.9812 --75.9719 --75.9781 --75.9656 --75.9703 --75.9625 --75.9766 --75.9672 --75.975 --75.9688 --75.9719 --75.9766 --75.9797 --75.9797 --75.9656 --75.975 --75.9734 --75.9594 --75.9578 --75.9781 --75.9672 --75.9609 --75.9688 --75.9578 --75.9703 --75.9672 --75.9594 --75.9703 --75.9688 --75.9703 --75.9766 --75.9844 --75.9625 --75.9547 --75.975 --75.9641 --75.9828 --75.9781 --75.9656 --75.9688 --75.9797 --75.9828 --75.9688 --75.9563 --75.9641 --75.9734 --75.9719 --75.9812 --75.9766 --75.9672 --75.9688 --75.9703 --75.9625 --75.9703 --75.9609 --75.9703 --75.9703 --75.9688 --75.9719 --75.9703 --75.9656 --75.9594 --75.9594 --75.9563 --75.9656 --75.9656 --75.9719 --75.9688 --75.9641 --75.9594 --75.9578 --75.9703 --75.9766 --75.9719 --75.9703 --75.9641 --75.9641 --75.9563 --75.9609 --75.9609 --75.9672 --75.95 --75.9734 --75.9688 --75.9734 --75.9609 --75.9656 --75.9672 --75.9625 --75.9719 --75.9625 --75.9641 --75.9531 --75.9672 --75.9703 --75.9719 --75.9547 --75.9594 --75.9531 --75.9672 --75.9563 --75.9516 --75.9688 --75.95 --75.9484 --75.9563 --75.9516 --75.9656 --75.95 --75.9594 --75.9812 --75.95 --75.9594 --75.9625 --75.9656 --75.9531 --75.9688 --75.9594 --75.9672 --75.9672 --75.9563 --75.9703 --75.9516 --75.9656 --75.9703 --75.9578 --75.9688 --75.9609 --75.9734 --75.9734 --75.9563 --75.9594 --75.95 --75.9563 --75.9578 --75.9453 --75.9703 --75.9594 --75.9531 --75.9516 --75.9672 --75.9344 --75.9469 --75.9547 --75.95 --75.95 --75.9641 --75.9578 --75.95 --75.9625 --75.9672 --75.9609 --75.9734 --75.9688 --75.9641 --75.9516 --75.9563 --75.9703 --75.9688 --75.9734 --75.9734 --75.9688 --75.9719 --75.9656 --75.9531 --75.9734 --75.9719 --75.9672 --75.9703 --75.9734 --75.9672 --75.9688 --75.9672 --75.9437 --75.9625 --75.9578 --75.9641 --75.9594 --75.9672 --75.9719 --75.9594 --75.9625 --75.95 --75.9484 --75.9625 --75.9625 --75.9609 --75.9719 --75.9609 --75.9641 --75.9719 --75.9641 --75.9563 --75.9672 --75.9672 --75.9719 --75.9672 --75.9641 --75.975 --75.975 --75.9828 --75.9594 --75.9594 --75.9609 --75.9719 --75.9578 --75.9484 --75.9594 --75.9734 --75.9703 --75.9578 --75.9578 --75.9656 --75.9672 --75.9734 --75.9641 --75.975 --75.9703 --75.9688 --75.9797 --75.9781 --75.9656 --75.9734 --75.9609 --75.9703 --75.9766 --75.975 --75.9766 --75.9781 --75.9828 --75.9656 --75.9703 --75.975 --75.9797 --75.975 --75.9688 --75.9688 --75.9563 --75.9859 --75.9594 --75.9688 --75.9578 --75.9594 --75.9594 --75.9656 --75.9812 --75.9719 --75.9547 --75.9719 --75.9688 --75.9703 --75.9703 --75.9594 --75.9594 --75.9672 --75.9484 --75.9688 --75.9437 --75.9594 --75.9625 --75.9672 --75.9547 --75.9672 --75.9563 --75.9563 --75.9656 --75.9719 --75.9688 --75.9531 --75.9656 --75.9609 --75.9688 --75.9531 --75.9672 --75.9578 --75.9563 --75.975 --75.9547 --75.9609 --75.9609 --75.9563 --75.9594 --75.9406 --75.9609 --75.9547 --75.9516 --75.9656 --75.9516 --75.9797 --75.9734 --75.9625 --75.9609 --75.9797 --75.9703 --75.9547 --75.9641 --75.9688 --75.9625 --75.9719 --75.9516 --75.9625 --75.9688 --75.9625 --75.9734 --75.9547 --75.9609 --75.9625 --75.9484 --75.9516 --75.9641 --75.9656 --75.9547 --75.9578 --75.9688 --75.9734 --75.9484 --75.9578 --75.9641 --75.9484 --75.9641 --75.95 --75.9531 --75.9547 --75.9531 --75.9563 --75.9594 --75.9688 --75.9641 --75.9594 --75.9703 --75.9563 --75.9688 --75.9625 --75.9594 --75.9578 --75.9437 --75.9609 --75.9594 --75.9625 --75.9578 --75.9688 --75.9641 --75.9672 --75.975 --75.9563 --75.9609 --75.9672 --75.9453 --75.9469 --75.9703 --75.9563 --75.95 --75.9734 --75.9594 --75.9594 --75.9578 --75.9719 --75.9719 --75.9594 --75.9609 --75.9625 --75.975 --75.9688 --75.9672 --75.9688 --75.9656 --75.9672 --75.9609 --75.9734 --75.9563 --75.9797 --75.9672 --75.9812 --75.9734 --75.9844 --75.975 --75.9844 --75.9812 --75.975 --75.9859 --75.9766 --75.9625 --75.9563 --75.9672 --75.9516 --75.9609 --75.9672 --75.9766 --75.9578 --75.9672 --75.9609 --75.9625 --75.9625 --75.9609 --75.9625 --75.9688 --75.9625 --75.9594 --75.9547 --75.9484 --75.9547 --75.9672 --75.9828 --75.9625 --75.9688 --75.9688 --75.9594 --75.9656 --75.9547 --75.9547 --75.9563 --75.9547 --75.9516 --75.9656 --75.9531 --75.9641 --75.9719 --75.9625 --75.9531 --75.9766 --75.9672 --75.9641 --75.9734 --75.9656 --75.9703 --75.9656 --75.9859 --75.9766 --75.9703 --75.9719 --75.9641 --75.9672 --75.9703 --75.9625 --75.9703 --75.9594 --75.9625 --75.9656 --75.9625 --75.9672 --75.9563 --75.9547 --75.9688 --75.9578 --75.9734 --75.9563 --75.9719 --75.975 --75.975 --75.9734 --75.9766 --75.9688 --75.9609 --75.9703 --75.9641 --75.9609 --75.9734 --75.9656 --75.9688 --75.9828 --75.975 --75.9781 --75.9734 --75.9922 --75.9609 --75.9734 --75.9812 --75.9766 --75.975 --75.9688 --75.9891 --75.9734 --75.9688 --75.9719 --75.9797 --75.9781 --75.975 --75.9719 --75.9641 --75.9719 --75.9672 --75.9609 --75.9719 --75.9625 --75.9656 --75.9531 --75.9625 --75.9516 --75.9781 --75.9641 --75.9812 --75.9656 --75.9688 --75.9672 --75.9719 --75.9672 --75.9688 --75.9609 --75.9641 --75.9734 --75.975 --75.9812 --75.9625 --75.9672 --75.9656 --75.9578 --75.9625 --75.9641 --75.9625 --75.9656 --75.9609 --75.9594 --75.9719 --75.9641 --75.9641 --75.9578 --75.9484 --75.975 --75.9688 --75.9609 --75.9609 --75.9672 --75.9641 --75.9547 --75.9672 --75.9625 --75.9688 --75.9672 --75.9688 --75.9656 --75.9672 --75.9719 --75.9703 --75.9688 --75.9734 --75.9563 --75.9656 --75.9656 --75.9672 --75.9656 --75.9703 --75.9766 --75.9609 --75.9781 --75.9625 --75.9563 --75.975 --75.9781 --75.9609 --75.9578 --75.9766 --75.9688 --75.9719 --75.9469 --75.975 --75.9688 --75.9594 --75.9656 --75.9672 --75.9688 --75.9766 --75.9688 --75.9703 --75.9641 --75.9781 --75.9703 --75.9766 --75.9672 --75.9719 --75.9703 --75.9703 --75.9766 --75.9609 --75.9734 --75.9719 --75.9672 --75.9641 --75.9609 --75.9641 --75.9844 --75.9734 --75.9781 --75.9844 --75.9844 --75.9625 --75.9672 --75.9688 --75.975 --75.9641 --75.9719 --75.9609 --75.9766 --75.9641 --75.9641 --75.9688 --75.9641 --75.9688 --75.9719 --75.9797 --75.975 --75.9484 --75.9766 --75.9594 --75.9547 --75.9656 --75.9719 --75.9906 --75.9672 --75.9828 --75.9719 --75.9625 --75.9672 --75.9734 --75.9703 --75.9656 --75.9797 --75.9625 --75.9625 --75.9563 --75.9594 --75.9766 --75.9781 --75.9672 --75.9812 --75.9719 --75.9812 --75.9656 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9734 --75.9625 --75.9781 --75.9734 --75.9547 --75.9766 --75.9625 --75.9703 --75.9609 --75.9703 --75.9719 --75.9703 --75.9766 --75.9734 --75.9703 --75.9797 --75.9563 --75.9609 --75.9641 --75.9703 --75.9641 --75.9578 --75.9688 --75.9641 --75.9688 --75.9781 --75.975 --75.9641 --75.9812 --75.9703 --75.9719 --75.9719 --75.9734 --75.975 --75.9828 --75.9641 --75.9719 --75.9734 --75.9672 --75.975 --75.9719 --75.9859 --75.9812 --75.975 --75.9797 --75.9828 --75.9875 --75.9828 --75.9766 --75.9734 --75.9766 --75.9656 --75.9703 --75.9766 --75.9703 --75.9844 --75.9812 --75.9812 --75.9797 --75.9703 --75.9797 --75.9688 --75.9859 --75.9781 --75.9844 --75.975 --75.9766 --75.9688 --75.9734 --75.9906 --75.9859 --75.9797 --75.9781 --75.9828 --75.9688 --75.9922 --75.9859 --75.9797 --75.9719 --75.9828 --75.9859 --75.9875 --75.975 --75.9688 --75.9828 --75.9703 --75.9656 --75.9781 --75.9781 --75.9609 --75.9719 --75.9938 --75.9766 --75.9719 --75.9703 --75.9703 --75.9797 --75.9766 --75.9672 --75.9766 --75.975 --75.9609 --75.9812 --75.9688 --75.9672 --75.9563 --75.9812 --75.975 --75.9953 --75.9766 --75.9781 --75.9812 --75.9828 --75.9734 --75.9719 --75.9844 --75.9703 --75.9734 --75.9734 --75.9828 --75.9656 --75.9672 --75.9719 --75.9672 --75.9828 --75.9781 --75.9766 --75.9844 --75.975 --75.9766 --75.9703 --75.9781 --75.9797 --75.9812 --75.9641 --75.975 --75.9672 --75.9734 --75.9656 --75.9719 --75.9703 --75.9703 --75.9688 --75.9828 --75.9969 --75.9719 --75.9781 --75.9781 --75.9734 --75.9781 --75.9844 --75.9812 --75.9875 --75.9781 --75.9781 --75.9766 --75.9641 --75.975 --75.9734 --75.9672 --75.9703 --75.9719 --75.9812 --75.9641 --75.9734 --75.9563 --75.975 --75.9844 --75.9766 --75.9719 --75.9719 --75.9719 --75.9609 --75.9688 --75.9641 --75.9625 --75.9719 --75.9859 --75.9766 --75.9766 --75.9766 --75.9688 --75.9922 --75.9672 --75.9844 --75.9609 --75.9563 --75.9703 --75.9594 --75.9672 --75.9625 --75.975 --75.9656 --75.9734 --75.9609 --75.9672 --75.975 --75.9688 --75.9703 --75.9656 --75.9719 --75.9703 --75.975 --75.9844 --75.9797 --75.9797 --75.9781 --75.9766 --75.9828 --75.9844 --75.9703 --75.9719 --75.9766 --75.9719 --75.9781 --75.9844 --75.9766 --75.9797 --75.9578 --75.9688 --75.9734 --75.9734 --75.9781 --75.9734 --75.9703 --75.9688 --75.9547 --75.9781 --75.9781 --75.9672 --75.9734 --75.975 --75.9781 --75.9766 --75.9734 --75.975 --75.9766 --75.9766 --75.9641 --75.975 --75.9734 --75.9766 --75.9703 --75.9688 --75.9766 --75.9797 --75.9719 --75.9719 --75.975 --75.975 --75.9625 --75.9812 --75.9688 --75.975 --75.9703 --75.9672 --75.9734 --75.9766 --75.975 --75.9812 --75.9859 --75.9781 --75.9828 --75.9766 --75.9844 --75.9828 --75.9828 --75.9828 --75.9781 --75.9922 --75.9859 --75.9906 --75.9859 --75.9766 --75.9734 --75.9859 --75.9828 --75.975 --75.9812 --75.9875 --75.9875 --75.9781 --75.9703 --75.9906 --75.9891 --75.9734 --75.9891 --75.9812 --75.9875 --75.9797 --75.975 --75.975 --75.9906 --75.975 --75.9781 --75.9828 --75.9766 --75.9844 --75.9859 --75.975 --75.9922 --75.9781 --75.9844 --75.9672 --75.9609 --75.9719 --75.9875 --75.9812 --75.9906 --75.9719 --75.9812 --75.9859 --75.9734 --75.9938 --75.9781 --75.9797 --75.9828 --75.9703 --75.9906 --75.9922 --75.9781 --75.975 --75.9703 --75.9719 --75.9797 --75.9781 --75.9844 --75.975 --75.9797 --75.9797 --75.9734 --75.9625 --75.9734 --75.9828 --75.9766 --75.9859 --75.9781 --75.975 --75.9797 --75.9672 --75.975 --75.9609 --75.9766 --75.9641 --75.9844 --75.9797 --75.9766 --75.9859 --75.9891 --75.9734 --75.9734 --75.975 --75.9641 --75.9594 --75.9734 --75.9719 --75.9703 --75.9734 --75.9781 --75.9688 --75.9766 --75.9719 --75.9609 --75.9578 --75.9719 --75.9656 --75.9688 --75.9688 --75.9781 --75.9719 --75.9625 --75.9734 --75.9672 --75.9797 --75.9859 --75.9734 --75.9797 --75.9719 --75.9781 --75.9859 --75.9906 --75.9797 --75.9812 --75.9734 --75.975 --75.9781 --75.9797 --75.9859 --75.9766 --75.9844 --75.9781 --75.9734 --75.9781 --75.9797 --75.9828 --75.9812 --75.9797 --75.9781 --75.9719 --75.975 --75.9922 --75.975 --75.9625 --75.9844 --75.9719 --75.9734 --75.9828 --75.9844 --75.9656 --75.9688 --75.9578 --75.9781 --75.9938 --75.9719 --75.9797 --75.9781 --75.9719 --75.9766 --75.9672 --75.9578 --75.9609 --75.9797 --75.9719 --75.9734 --75.9734 --75.9719 --75.9641 --75.9766 --75.9688 --75.975 --75.9719 --75.9797 --75.9828 --75.9891 --75.9812 --75.9766 --75.975 --75.9906 --75.9922 --75.9953 --75.9734 --75.9828 --75.9828 --75.9797 --75.9766 --75.9828 --75.975 --75.9703 --75.9875 --75.9766 --75.9828 --75.9891 --75.9703 --75.9797 --75.9766 --75.9859 --75.9797 --75.9719 --75.95 --75.9797 --75.9844 --75.9734 --75.9734 --75.9812 --75.9984 --75.9875 --75.9953 --75.9656 --75.9797 --75.9703 --75.9641 --75.9734 --75.9781 --75.9734 --75.9734 --75.9656 --75.975 --75.9797 --75.9703 --75.9734 --75.9563 --75.9734 --75.9688 --75.9656 --75.9781 --75.9641 --75.9609 --75.9672 --75.9719 --75.9844 --75.975 --75.9781 --75.9734 --75.9688 --75.9734 --75.9641 --75.9703 --75.9781 --75.9844 --75.9656 --75.9766 --75.975 --75.975 --75.9781 --75.9828 --75.9703 --75.9719 --75.9812 --75.9953 --75.9672 --75.9625 --75.9672 --75.9828 --75.9719 --75.9828 --75.9781 --75.975 --75.9875 --75.9812 --75.9766 --75.9875 --75.9656 --75.9781 --75.9969 --75.9734 --75.9766 --75.9797 --75.975 --75.9781 --75.9703 --75.975 --75.9609 --75.9828 --75.9812 --75.9797 --75.9797 --75.9594 --75.9781 --75.975 --75.9656 --75.9594 --75.9734 --75.9563 --75.9625 --75.9766 --75.9734 --75.9641 --75.9656 --75.9766 --75.9812 --75.9672 --75.9719 --75.9781 --75.9734 --75.975 --75.975 --75.9719 --75.9703 --75.9703 --75.9859 --75.9797 --75.9688 --75.9938 --75.975 --75.9688 --75.9859 --75.975 --75.9797 --75.9719 --75.9766 --75.9703 --75.9781 --75.9703 --75.9812 --75.9578 --75.9656 --75.9578 --75.9703 --75.9594 --75.9656 --75.9609 --75.9688 --75.9719 --75.9859 --75.9781 --75.9703 --75.9766 --75.9828 --75.9734 --75.9828 --75.9828 --75.9875 --75.9812 --75.9859 --75.9781 --75.9844 --75.9797 --75.9797 --75.9766 --75.975 --75.9719 --75.9875 --75.9719 --75.9781 --75.9797 --75.9953 --75.9906 --75.9891 --75.9766 --75.9891 --75.9984 --75.9859 --75.9703 --75.9891 --75.9797 --75.9844 --75.9922 --75.9891 --75.9781 --75.9828 --75.9672 --75.9797 --75.9766 --75.9578 --75.9703 --75.9641 --75.9719 --75.9609 --75.9656 --75.9703 --75.9766 --75.9594 --75.9734 --75.9812 --75.9719 --75.9797 --75.9688 --75.9656 --75.9703 --75.9703 --75.9672 --75.9703 --75.9719 --75.9625 --75.9734 --75.9766 --75.9797 --75.9672 --75.9922 --75.9906 --75.9797 --75.9781 --75.9734 --75.9844 --75.9828 --75.9656 --75.9828 --75.9812 --75.9672 --75.9781 --75.9859 --75.9859 --75.9688 --75.9797 --75.9828 --75.9656 --75.9688 --75.9906 --75.9781 --75.9719 --75.9734 --75.9812 --75.9625 --75.9812 --75.9719 --75.9844 --75.9766 --75.9828 --75.9812 --75.9812 --75.9781 --75.9641 --75.9906 --75.9781 --75.9719 --75.975 --75.975 --75.9812 --75.9844 --75.9688 --75.9641 --75.9656 --75.9734 --75.9563 --75.9641 --75.9625 --75.9625 --75.975 --75.9625 --75.9797 --75.9672 --75.9688 --75.9812 --75.9672 --75.9734 --75.975 --75.9766 --75.9719 --75.9625 --75.9844 --75.9703 --75.9734 --75.9672 --75.9734 --75.9891 --75.9719 --75.9812 --75.975 --75.9766 --75.9766 --75.9797 --75.9797 --75.9828 --75.9781 --75.9812 --75.9656 --75.9875 --75.9719 --75.9797 --75.9781 --75.9797 --75.9828 --75.9812 --75.9781 --75.9672 --75.975 --75.9719 --75.9828 --75.9781 --75.9828 --75.9734 --75.9656 --75.9672 --75.9766 --75.9844 --75.9812 --75.9875 --75.9891 --75.9766 --75.9781 --75.9828 --75.9781 --75.9672 --75.9828 --75.9797 --75.9922 --75.9938 --75.9875 --75.975 --75.9812 --75.9672 --75.9797 --75.975 --75.9891 --75.9938 --75.9703 --75.9781 --75.9812 --75.9875 --75.9734 --75.9922 --75.9781 --75.9844 --75.9781 --75.9844 --75.9844 --75.9688 --75.9781 --76.0078 --75.9844 --75.9953 --75.9891 --76 --75.9828 --75.9953 --75.9875 --75.9766 --75.9766 --75.9906 --75.9859 --75.9797 --75.9828 --75.975 --75.9828 --75.9969 --75.9859 --75.9734 --75.9953 --75.9844 --75.9906 --75.9844 --75.9766 --75.9875 --75.9797 --75.9828 --75.9844 --75.9812 --75.9922 --75.975 --75.9844 --75.9859 --75.9766 --75.9844 --75.9922 --75.9875 --75.9688 --75.9844 --75.9906 --75.9766 --75.9797 --75.9922 --75.9828 --75.9875 --75.9938 --75.9922 --75.9828 --75.9766 --75.9812 --75.9703 --75.9703 --75.9719 --75.9875 --75.9734 --75.9734 --75.9922 --75.9766 --75.9688 --75.9734 --75.975 --75.9875 --75.9719 --75.9812 --75.9797 --75.9875 --75.9688 --75.9859 --75.9797 --75.9797 --75.9922 --75.9594 --75.9781 --75.9891 --75.975 --75.9797 --75.9719 --75.9734 --75.9859 --75.9844 --75.9656 --75.9812 --75.9781 --75.975 --75.9906 --75.9891 --75.9797 --75.9703 --75.9906 --75.9734 --75.9922 --75.975 --75.9688 --75.9781 --75.9812 --75.9797 --75.9781 --75.9906 --75.9875 --75.9797 --75.9719 --75.9719 --75.975 --75.9781 --75.9828 --75.9719 --75.9875 --75.9797 --75.9828 --75.9766 --75.9672 --75.9875 --75.9812 --75.9859 --75.9781 --75.975 --75.9594 --75.9609 --75.975 --75.9734 --75.9734 --75.9797 --75.9875 --75.9578 --75.9797 --75.9672 --75.9703 --75.9812 --75.9672 --75.9719 --75.975 --75.9844 --75.9781 --75.9719 --75.975 --75.975 --75.9797 --75.9703 --75.9719 --75.9625 --75.9781 --75.9797 --75.9594 --75.9688 --75.9656 --75.975 --75.9547 --75.9781 --75.9688 --75.9719 --75.9656 --75.9656 --75.9719 --75.9828 --75.9688 --75.9906 --75.9781 --75.9828 --75.9734 --75.9828 --75.9781 --75.9844 --75.9938 --75.9875 --75.9781 --75.9828 --75.9812 --75.9688 --75.9766 --75.9781 --75.9891 --75.9844 --75.9766 --75.9766 --75.9641 --75.9703 --75.9781 --75.9875 --75.9859 --75.9719 --75.9766 --75.9734 --75.9766 --75.9844 --75.9688 --75.9594 --75.9781 --75.9781 --75.9844 --75.9797 --76.0047 --75.9734 --75.975 --75.9734 --75.9766 --75.9812 --75.9844 --75.9859 --75.9859 --75.9812 --75.9703 --75.9844 --75.9828 --75.9828 --75.9828 --75.9719 --75.9828 --75.975 --75.9812 --75.9734 --75.9734 --75.9781 --75.975 --75.9672 --75.9797 --75.9828 --75.9844 --75.9734 --75.9797 --75.975 --75.9766 --75.9781 --75.9641 --75.9766 --75.9672 --75.9594 --75.9656 --75.9594 --75.9656 --75.9594 --75.9609 --75.9688 --75.9734 --75.9547 --75.9703 --75.9641 --75.9688 --75.9703 --75.9719 --75.9844 --75.9672 --75.9688 --75.9719 --75.9641 --75.9828 --75.9812 --75.9531 --75.9688 --75.9609 --75.9812 --75.9609 --75.9656 --75.9766 --75.9797 --75.9641 --75.975 --75.9578 --75.975 --75.9594 --75.9719 --75.9812 --75.9766 --75.9766 --75.9828 --75.9766 --75.975 --75.975 --75.9859 --75.9594 --75.9703 --75.9781 --75.9719 --75.9781 --75.975 --75.9766 --75.9844 --75.975 --75.975 --75.9781 --75.975 --75.9719 --75.9875 --75.9766 --75.9781 --75.9781 --75.9828 --75.9938 --75.9906 --75.9781 --75.9828 --75.9781 --75.9906 --75.9906 --75.9828 --76 --75.9922 --75.9938 --75.9859 --75.9891 --76.0078 --75.975 --76 --76.0031 --75.9953 --75.9906 --75.9906 --75.9875 --75.9734 --75.9828 --75.9891 --75.9875 --75.9719 --75.9844 --75.9719 --75.9781 --75.975 --75.9797 --75.9797 --75.9766 --75.9828 --75.9812 --75.9875 --75.9688 --75.9766 --75.9859 --75.9875 --75.9922 --75.9875 --75.9781 --75.9781 --75.9891 --75.9875 --75.9859 --75.9672 --75.9906 --75.9891 --75.9859 --75.9797 --75.9828 --75.9672 --75.9766 --75.9766 --75.9781 --75.9812 --75.9906 --75.9938 --75.9859 --75.9984 --75.9766 --75.9891 --75.9922 --76.0016 --75.9984 --75.9844 --76.0031 --75.9891 --75.9906 --75.9891 --75.9906 --75.9766 --75.9891 --75.9844 --75.9828 --75.9812 --75.9672 --75.9781 --75.9875 --75.9844 --75.9703 --75.9766 --75.9641 --75.9875 --75.9797 --75.9797 --75.9875 --75.9922 --75.9828 --75.9844 --75.9922 --75.9734 --75.9625 --75.975 --75.9891 --75.9812 --75.9875 --75.9797 --75.9766 --75.9938 --75.9844 --75.9812 --75.9812 --75.9625 --75.975 --75.9625 --75.9859 --75.9766 --75.9781 --75.9688 --75.9672 --75.9906 --75.975 --75.9719 --75.9641 --75.9734 --75.9703 --75.9719 --75.9812 --75.9875 --75.9844 --75.9797 --75.9875 --75.9641 --75.9875 --75.9828 --75.9719 --75.975 --75.9703 --75.9797 --75.9812 --75.9875 --75.975 --75.9844 --75.9781 --75.9766 --75.9672 --75.9797 --75.9906 --75.9688 --75.9812 --75.975 --75.9859 --75.9812 --75.9812 --75.9984 --75.9953 --75.9844 --75.9844 --75.9781 --75.975 --75.9797 --75.9844 --75.9719 --75.9734 --75.9906 --75.9969 --75.9703 --75.9703 --75.9859 --75.9859 --75.9797 --75.9703 --75.9766 --75.9844 --75.9812 --75.9812 --75.9672 --75.9891 --75.9734 --75.9828 --75.9797 --75.9781 --75.9969 --75.9734 --75.9875 --75.9828 --75.9859 --75.9984 --75.9828 --75.9766 --75.9922 --75.9828 --75.9797 --75.9812 --75.9906 --75.9984 --75.9859 --76.0031 --75.9844 --75.9734 --75.9859 --75.9844 --75.9922 --75.9875 --76 --75.9922 --75.9766 --75.9812 --76 --75.9812 --75.9797 --75.9922 --75.9828 --75.975 --75.9891 --75.9891 --75.9906 --75.9859 --75.9797 --75.9969 --75.9719 --75.9953 --76.0016 --75.9891 --75.9953 --75.9953 --76 --75.9891 --75.9875 --75.975 --75.9891 --75.9984 --75.9938 --76.0031 --75.9891 --75.9828 --75.9828 --75.9922 --75.9828 --76 --75.9828 --75.9797 --75.9938 --75.9766 --75.9891 --75.9953 --75.9922 --75.9859 --75.9875 --75.9703 --75.9875 --75.9859 --75.9703 --75.9875 --75.9875 --76 --75.9922 --75.9938 --75.9812 --75.9922 --75.9766 --75.9688 --75.9766 --75.975 --75.9922 --75.9859 --75.9984 --75.9797 --75.9938 --75.9922 --75.9953 --75.9859 --75.9922 --75.9859 --75.9891 --75.9844 --75.9859 --75.9922 --75.9859 --75.9812 --75.9859 --75.9938 --75.9719 --75.9906 --75.9859 --75.9766 --75.9938 --76.0016 --75.9812 --75.9906 --75.9828 --75.9844 --75.9766 --75.9938 --75.9938 --75.9953 --75.9891 --75.9781 --75.9797 --75.9922 --75.9891 --75.9875 --75.9844 --75.9828 --75.9875 --75.9859 --75.9781 --75.9656 --75.9766 --75.9734 --75.9844 --75.9891 --75.9781 --75.9812 --75.9766 --75.9766 --75.9609 --75.9781 --75.9906 --75.975 --75.9703 --75.9688 --75.9875 --75.9891 --75.9859 --75.9828 --75.9609 --75.9766 --75.9828 --75.9703 --75.975 --75.9719 --75.9734 --75.9703 --75.9797 --75.9656 --75.9609 --75.9719 --75.9703 --75.9719 --75.975 --75.9734 --75.9734 --75.9688 --75.9578 --75.9734 --75.9594 --75.975 --75.9672 --75.9688 --75.9766 --75.9859 --75.975 --75.9688 --75.9906 --75.9781 --75.9828 --75.9891 --75.9844 --75.9719 --75.9891 --75.9828 --75.9734 --75.9703 --75.9875 --75.9719 --75.9734 --75.9766 --75.9797 --75.9734 --75.9844 --75.9766 --75.9797 --75.9766 --75.9766 --75.9812 --75.9781 --75.9781 --75.9781 --75.9672 --75.9891 --75.9781 --75.975 --75.975 --75.9672 --75.9859 --75.9891 --75.9672 --75.9688 --75.9781 --75.9719 --75.9781 --75.9703 --75.9875 --75.9828 --75.9797 --75.9766 --75.9797 --75.9844 --75.975 --75.9922 --75.9828 --75.9828 --75.975 --75.9812 --75.9719 --75.9672 --75.9859 --75.9922 --75.975 --75.975 --75.9734 --75.9734 --75.9859 --75.9688 --75.9891 --75.9719 --75.9859 --75.9797 --75.9766 --75.9906 --75.9766 --75.9797 --75.9797 --75.9891 --75.9844 --75.9906 --75.975 --75.9812 --75.9797 --75.9734 --75.9734 --75.9734 --75.9828 --75.9812 --75.975 --75.9812 --75.9875 --75.9812 --75.9688 --75.9719 --75.9656 --75.9734 --75.9797 --75.9688 --75.9766 --75.9812 --75.9719 --75.9625 --75.975 --75.9828 --75.9672 --75.9766 --75.9672 --75.9844 --75.9734 --75.9766 --75.9719 --75.9844 --75.9828 --75.975 --75.9812 --75.9766 --75.9719 --75.9703 --75.9594 --75.9891 --75.975 --75.9812 --75.9797 --75.9719 --75.9719 --75.9719 --75.9594 --75.9719 --75.9672 --75.9766 --75.9781 --75.9656 --75.9703 --75.9719 --75.9641 --75.9703 --75.9734 --75.9859 --75.975 --75.9609 --75.9734 --75.975 --75.9734 --75.9766 --75.9828 --75.975 --75.9703 --75.9844 --75.9859 --75.9703 --75.9891 --75.9781 --75.9844 --75.9812 --75.9859 --75.9906 --75.975 --75.9828 --75.9969 --75.9797 --75.9797 --75.975 --75.9609 --75.9828 --75.9891 --75.9859 --75.9766 --75.9781 --75.9766 --75.9703 --75.9734 --75.9859 --76.0031 --75.9766 --75.9953 --75.975 --75.9797 --75.9766 --75.9859 --75.975 --75.975 --75.9891 --75.9781 --75.9734 --75.9828 --75.9797 --75.9797 --75.9719 --75.9703 --75.9766 --75.9797 --75.9844 --75.9844 --75.9875 --75.9703 --75.9844 --75.9656 --75.9828 --75.9688 --75.9812 --75.9703 --75.9766 --75.9672 --75.9812 --75.9703 --75.9656 --75.9859 --75.9703 --75.9734 --75.9656 --75.975 --75.9859 --75.9828 --75.9734 --75.9844 --75.9875 --75.9734 --75.9844 --75.9828 --75.9781 --75.9672 --75.9703 --75.9766 --75.9828 --75.9781 --75.9609 --75.9719 --75.9734 --75.9672 --75.975 --75.975 --75.9734 --75.9688 --75.9719 --75.9641 --75.9781 --75.9781 --75.9703 --75.9594 --75.9578 --75.9672 --75.9797 --75.9734 --75.9797 --75.9781 --75.9609 --75.9797 --75.9688 --75.9766 --75.9703 --75.975 --75.9672 --75.9781 --75.9656 --75.9891 --75.9719 --75.9766 --75.9766 --75.9906 --75.9734 --75.9766 --75.9797 --75.9781 --75.9641 --75.9891 --75.9797 --75.9672 --75.9797 --75.9891 --75.9734 --75.9844 --75.9781 --75.9828 --75.9828 --75.9766 --75.9766 --75.9812 --75.9828 --75.9672 --75.9766 --75.975 --75.9812 --75.9734 --75.9672 --75.975 --75.9688 --75.9844 --75.9812 --75.9734 --75.9859 --75.9781 --75.9703 --75.9844 --75.9672 --75.9672 --75.9797 --75.9703 --75.9688 --75.975 --75.9641 --75.9578 --75.975 --75.9656 --75.9812 --75.9828 --75.9563 --75.9641 --75.9656 --75.9547 --75.9641 --75.9625 --75.9672 --75.9625 --75.9563 --75.9703 --75.9563 --75.9703 --75.9656 --75.9688 --75.9641 --75.9781 --75.9641 --75.9734 --75.9672 --75.9672 --75.9734 --75.9812 --75.9688 --75.9641 --75.9906 --75.9656 --75.9891 --75.9641 --75.9656 --75.9812 --75.9719 --75.9766 --75.9734 --75.975 --75.975 --75.9766 --75.9891 --75.9812 --75.9859 --75.9875 --75.9828 --75.9812 --75.9812 --75.9875 --75.9844 --75.9781 --75.9781 --75.9719 --75.9734 --75.9859 --75.9719 --75.9797 --75.9656 --75.9781 --75.9797 --75.9703 --75.975 --75.9656 --75.9719 --75.9828 --75.9859 --75.975 --75.9719 --75.9703 --75.9719 --75.9797 --75.9672 --75.9656 --75.975 --75.975 --75.9609 --75.9844 --75.9766 --75.9766 --75.975 --75.9859 --75.9563 --75.9672 --75.9672 --75.9719 --75.9578 --75.9766 --75.9594 --75.9656 --75.9609 --75.975 --75.9688 --75.9547 --75.9578 --75.9563 --75.9641 --75.9672 --75.9641 --75.9797 --75.9641 --75.9703 --75.9563 --75.9766 --75.9531 --75.9734 --75.9625 --75.9719 --75.9531 --75.9594 --75.9656 --75.9563 --75.95 --75.9563 --75.9625 --75.9641 --75.975 --75.9578 --75.9656 --75.9766 --75.9719 --75.9656 --75.9672 --75.9656 --75.9688 --75.9594 --75.9641 --75.9656 --75.9688 --75.9766 --75.9547 --75.9656 --75.9641 --75.9656 --75.9594 --75.9734 --75.9563 --75.975 --75.9625 --75.9688 --75.9734 --75.9688 --75.9656 --75.9703 --75.9719 --75.9766 --75.9812 --75.9734 --75.975 --75.9672 --75.9672 --75.9719 --75.9719 --75.9703 --75.9781 --75.9781 --75.9641 --75.9719 --75.9641 --75.9703 --75.9688 --75.9641 --75.9516 --75.9563 --75.9734 --75.9766 --75.9594 --75.9734 --75.9609 --75.9688 --75.9625 --75.9719 --75.9656 --75.9766 --75.9688 --75.9688 --75.975 --75.9766 --75.9781 --75.9781 --75.9672 --75.9828 --75.9734 --75.9688 --75.9719 --75.9734 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9781 --75.9812 --75.9563 --75.9672 --75.9672 --75.9578 --75.9703 --75.9703 --75.9781 --75.9641 --75.9672 --75.9703 --75.9719 --75.9828 --75.9875 --75.9656 --75.9781 --75.975 --75.975 --75.9703 --75.9719 --75.9578 --75.9547 --75.9734 --75.9734 --75.9766 --75.95 --75.9578 --75.9563 --75.9516 --75.9594 --75.9563 --75.9641 --75.9563 --75.9594 --75.9484 --75.9609 --75.9484 --75.9625 --75.95 --75.9563 --75.9609 --75.9516 --75.9688 --75.9531 --75.9453 --75.9609 --75.9609 --75.9469 --75.9594 --75.9422 --75.95 --75.9547 --75.9594 --75.9594 --75.9547 --75.9484 --75.9531 --75.9688 --75.9547 --75.9609 --75.9672 --75.9578 --75.9547 --75.95 --75.9672 --75.9641 --75.9578 --75.9406 --75.9734 --75.9531 --75.9516 --75.9594 --75.9484 --75.9547 --75.9547 --75.9469 --75.9391 --75.9594 --75.9625 --75.9453 --75.9563 --75.9516 --75.9594 --75.9547 --75.9703 --75.9563 --75.9578 --75.9375 --75.9547 --75.9641 --75.9547 --75.95 --75.9563 --75.9563 --75.9609 --75.9656 --75.9734 --75.9437 --75.9688 --75.9563 --75.9563 --75.9625 --75.9469 --75.9625 --75.9437 --75.9516 --75.95 --75.9516 --75.975 --75.9297 --75.9703 --75.9516 --75.9547 --75.9578 --75.9406 --75.9609 --75.9547 --75.9516 --75.9484 --75.9453 --75.9609 --75.9531 --75.9641 --75.9422 --75.9531 --75.9531 --75.9563 --75.9594 --75.9406 --75.9641 --75.9437 --75.9594 --75.9453 --75.9516 --75.9531 --75.9563 --75.95 --75.9437 --75.9469 --75.9484 --75.9641 --75.9641 --75.9516 --75.9484 --75.9563 --75.9531 --75.9594 --75.9437 --75.95 --75.9609 --75.9437 --75.9422 --75.9453 --75.9563 --75.9531 --75.9453 --75.9469 --75.9484 --75.9531 --75.9437 --75.9469 --75.9484 --75.9359 --75.9453 --75.9578 --75.9469 --75.9578 --75.9547 --75.9469 --75.9359 --75.9328 --75.95 --75.9344 --75.9422 --75.9609 --75.9437 --75.9453 --75.9484 --75.9469 --75.9375 --75.9406 --75.9516 --75.9422 --75.9453 --75.9406 --75.9594 --75.9453 --75.9375 --75.9391 --75.9406 --75.9484 --75.9297 --75.9484 --75.9484 --75.9437 --75.9641 --75.9531 --75.9344 --75.9375 --75.9375 --75.95 --75.9516 --75.9594 --75.9516 --75.9391 --75.9453 --75.9484 --75.9469 --75.9328 --75.9437 --75.9484 --75.9469 --75.9422 --75.9437 --75.9375 --75.9297 --75.9453 --75.9484 --75.9484 --75.9234 --75.9313 --75.9391 --75.9344 --75.9453 --75.9547 --75.9453 --75.9484 --75.9328 --75.95 --75.95 --75.9359 --75.9297 --75.9406 --75.9484 --75.9422 --75.9344 --75.9406 --75.9437 --75.9406 --75.9406 --75.95 --75.9484 --75.9453 --75.9422 --75.9328 --75.9437 --75.9406 --75.9391 --75.9297 --75.9359 --75.9391 --75.9313 --75.9344 --75.9359 --75.9281 --75.9344 --75.9453 --75.9313 --75.9344 --75.9359 --75.9406 --75.9266 --75.9203 --75.9266 --75.9203 --75.9437 --75.9375 --75.9375 --75.9266 --75.9266 --75.9281 --75.9422 --75.9234 --75.9391 --75.9359 --75.9437 --75.9266 --75.9266 --75.9422 --75.9375 --75.9437 --75.9375 --75.9406 --75.9359 --75.9422 --75.9516 --75.9344 --75.95 --75.9328 --75.9453 --75.95 --75.9313 --75.9234 --75.9313 --75.9406 --75.9281 --75.9469 --75.9328 --75.9406 --75.9375 --75.9422 --75.9359 --75.9391 --75.9297 --75.9328 --75.9203 --75.9406 --75.9359 --75.9469 --75.9313 --75.9547 --75.9406 --75.9313 --75.9266 --75.9359 --75.9406 --75.9297 --75.9328 --75.9313 --75.9344 --75.9281 --75.9406 --75.9391 --75.9516 --75.9297 --75.9359 --75.9391 --75.9359 --75.9406 --75.9391 --75.9328 --75.9234 --75.9422 --75.9422 --75.9484 --75.9328 --75.9391 --75.9391 --75.9437 --75.9406 --75.9313 --75.9453 --75.9359 --75.9359 --75.9375 --75.9375 --75.9453 --75.9422 --75.9234 --75.9531 --75.9422 --75.925 --75.925 --75.9391 --75.9266 --75.9422 --75.9437 --75.9437 --75.9406 --75.9437 --75.9484 --75.9391 --75.9453 --75.9453 --75.9437 --75.9453 --75.9437 --75.9422 --75.9391 --75.9422 --75.9313 --75.9328 --75.9375 --75.9359 --75.9266 --75.9375 --75.9266 --75.9391 --75.9391 --75.9359 --75.9531 --75.9391 --75.9344 --75.9406 --75.9313 --75.9375 --75.9437 --75.9484 --75.9547 --75.9469 --75.9516 --75.9406 --75.9531 --75.9391 --75.9391 --75.9422 --75.9422 --75.9313 --75.9359 --75.9375 --75.9484 --75.9437 --75.9266 --75.9453 --75.9359 --75.9422 --75.9359 --75.9563 --75.9359 --75.9516 --75.9453 --75.9344 --75.9406 --75.9453 --75.9344 --75.9297 --75.9344 --75.9484 --75.9297 --75.9359 --75.9344 --75.9484 --75.9359 --75.9359 --75.9219 --75.925 --75.9313 --75.9297 --75.9266 --75.9125 --75.9391 --75.9313 --75.9391 --75.9203 --75.9281 --75.9297 --75.9266 --75.9172 --75.9141 --75.9359 --75.9344 --75.9453 --75.9406 --75.9266 --75.9391 --75.925 --75.9266 --75.925 --75.9203 --75.925 --75.9281 --75.9313 --75.9313 --75.9391 --75.9281 --75.9344 --75.9484 --75.925 --75.9313 --75.9141 --75.9375 --75.9359 --75.9281 --75.9297 --75.9406 --75.9375 --75.9328 --75.9172 --75.9484 --75.9297 --75.9297 --75.9391 --75.9375 --75.9234 --75.9313 --75.9313 --75.9297 --75.9313 --75.9172 --75.9313 --75.9234 --75.9344 --75.9437 --75.9375 --75.9406 --75.925 --75.9313 --75.9375 --75.9344 --75.9359 --75.9422 --75.9328 --75.95 --75.9391 --75.9437 --75.9344 --75.9281 --75.9437 --75.9359 --75.9437 --75.9359 --75.9391 --75.9328 --75.9375 --75.9281 --75.9406 --75.9391 --75.925 --75.9297 --75.9344 --75.9328 --75.9281 --75.9344 --75.925 --75.9281 --75.9344 --75.9375 --75.9437 --75.9344 --75.9234 --75.95 --75.9437 --75.9375 --75.925 --75.9328 --75.9453 --75.9328 --75.9563 --75.9391 --75.9437 --75.9437 --75.9344 --75.9453 --75.9391 --75.9547 --75.9359 --75.9328 --75.95 --75.9484 --75.9266 --75.925 --75.9359 --75.9375 --75.9219 --75.9406 --75.9344 --75.9313 --75.9313 --75.9375 --75.9484 --75.9313 --75.9297 --75.9297 --75.9234 --75.9281 --75.9344 --75.9297 --75.9344 --75.9422 --75.9422 --75.9359 --75.9406 --75.9297 --75.9219 --75.925 --75.9391 --75.9391 --75.9391 --75.9203 --75.9203 --75.9266 --75.9187 --75.9391 --75.9219 --75.9266 --75.9437 --75.9281 --75.9281 --75.9406 --75.9328 --75.9266 --75.9297 --75.9297 --75.9266 --75.9297 --75.9406 --75.9266 --75.9359 --75.9391 --75.9266 --75.9437 --75.9328 --75.9266 --75.9281 --75.9328 --75.9375 --75.9313 --75.9406 --75.9266 --75.9391 --75.9281 --75.9281 --75.925 --75.9406 --75.9281 --75.9359 --75.9297 --75.9391 --75.9328 --75.9375 --75.9328 --75.9359 --75.9328 --75.9375 --75.9391 --75.9375 --75.9266 --75.9375 --75.9453 --75.9281 --75.9281 --75.9297 --75.9344 --75.9359 --75.9234 --75.9234 --75.9313 --75.9266 --75.9219 --75.9297 --75.9281 --75.9328 --75.9219 --75.9281 --75.9328 --75.9172 --75.9359 --75.9328 --75.9375 --75.9297 --75.9391 --75.9281 --75.9375 --75.9203 --75.9297 --75.9234 --75.9297 --75.95 --75.9344 --75.9328 --75.9375 --75.9297 --75.9391 --75.9344 --75.925 --75.9281 --75.9344 --75.9297 --75.9422 --75.95 --75.9578 --75.9469 --75.9391 --75.9422 --75.9453 --75.9281 --75.9203 --75.9219 --75.9422 --75.9391 --75.9469 --75.9328 --75.9391 --75.9297 --75.9344 --75.9375 --75.9281 --75.9297 --75.9359 --75.9203 --75.9344 --75.9406 --75.925 --75.9266 --75.9281 --75.9344 --75.9266 --75.9453 --75.9344 --75.9422 --75.9391 --75.9422 --75.925 --75.9281 --75.9281 --75.9297 --75.9391 --75.9469 --75.9203 --75.9313 --75.9344 --75.9219 --75.9281 --75.9406 --75.9297 --75.9344 --75.9313 --75.9344 --75.9187 --75.9234 --75.9391 --75.9328 --75.9328 --75.9266 --75.9406 --75.9422 --75.9156 --75.9313 --75.9297 --75.9281 --75.9172 --75.9187 --75.925 --75.9125 --75.9187 --75.9469 --75.9187 --75.9313 --75.9266 --75.9203 --75.9203 --75.9266 --75.9141 --75.9203 --75.9109 --75.925 --75.9313 --75.9344 --75.9266 --75.9328 --75.9281 --75.9234 --75.9297 --75.9187 --75.9266 --75.9187 --75.9422 --75.925 --75.9281 --75.9281 --75.9266 --75.9359 --75.9187 --75.9234 --75.925 --75.925 --75.9375 --75.9156 --75.9344 --75.9313 --75.9313 --75.9297 --75.9203 --75.9234 --75.9219 --75.9156 --75.9203 --75.925 --75.9094 --75.9094 --75.9203 --75.9187 --75.9109 --75.9062 --75.9094 --75.9141 --75.9156 --75.9203 --75.9234 --75.925 --75.9094 --75.9203 --75.9203 --75.9219 --75.9141 --75.9281 --75.925 --75.9172 --75.9172 --75.9094 --75.9203 --75.9172 --75.9219 --75.9266 --75.9344 --75.9266 --75.9187 --75.9234 --75.9203 --75.9125 --75.9141 --75.9281 --75.9328 --75.9375 --75.9297 --75.9187 --75.9172 --75.9219 --75.9359 --75.9094 --75.925 --75.9266 --75.9172 --75.9172 --75.9297 --75.9328 --75.9234 --75.925 --75.9234 --75.9328 --75.9109 --75.9281 --75.925 --75.9375 --75.9172 --75.9156 --75.9094 --75.9156 --75.9125 --75.9328 --75.925 --75.9203 --75.9234 --75.9234 --75.9281 --75.9203 --75.9172 --75.9203 --75.9187 --75.9313 --75.9266 --75.9359 --75.9328 --75.9141 --75.9219 --75.9187 --75.925 --75.9187 --75.9266 --75.9281 --75.9266 --75.9297 --75.9219 --75.9266 --75.9141 --75.9125 --75.9172 --75.9172 --75.925 --75.9125 --75.9219 --75.9172 --75.9234 --75.9234 --75.9391 --75.9094 --75.9187 --75.925 --75.9187 --75.9156 --75.9219 --75.9141 --75.9187 --75.9156 --75.9266 --75.9281 --75.9437 --75.9234 --75.9234 --75.9437 --75.9328 --75.9281 --75.9281 --75.9297 --75.9297 --75.9266 --75.9359 --75.9141 --75.9281 --75.9187 --75.9344 --75.9391 --75.9328 --75.9266 --75.9234 --75.9313 --75.9328 --75.9313 --75.925 --75.9422 --75.9172 --75.9422 --75.9328 --75.9313 --75.9359 --75.9297 --75.9234 --75.9375 --75.9203 --75.9281 --75.9281 --75.9266 --75.9391 --75.9344 --75.9328 --75.9328 --75.9219 --75.9172 --75.9266 --75.9187 --75.9203 --75.925 --75.9172 --75.9359 --75.9234 --75.9187 --75.9203 --75.9281 --75.925 --75.925 --75.9281 --75.9328 --75.9203 --75.9266 --75.9281 --75.9172 --75.9219 --75.9187 --75.9219 --75.9422 --75.9141 --75.9266 --75.925 --75.9375 --75.9344 --75.9297 --75.9375 --75.9297 --75.9156 --75.925 --75.9281 --75.925 --75.9313 --75.9156 --75.9359 --75.9187 --75.9297 --75.9328 --75.9234 --75.9266 --75.9344 --75.9391 --75.9203 --75.9203 --75.9359 --75.9203 --75.9266 --75.9234 --75.9313 --75.9187 --75.9219 --75.9234 --75.9125 --75.9156 --75.9297 --75.9344 --75.9125 --75.9266 --75.9266 --75.9422 --75.9297 --75.9328 --75.9156 --75.9141 --75.9172 --75.9219 --75.9141 --75.9313 --75.9344 --75.9187 --75.925 --75.9219 --75.9266 --75.9328 --75.9203 --75.9297 --75.9219 --75.9141 --75.9156 --75.9234 --75.9266 --75.9156 --75.9219 --75.9219 --75.9266 --75.9234 --75.9125 --75.9219 --75.9094 --75.9313 --75.9328 --75.9234 --75.9219 --75.9109 --75.9281 --75.9328 --75.9281 --75.9266 --75.9344 --75.9219 --75.9172 --75.9172 --75.9187 --75.9234 --75.9156 --75.9203 --75.9172 --75.9141 --75.9203 --75.9281 --75.9234 --75.9281 --75.9156 --75.9094 --75.9141 --75.9125 --75.9047 --75.9078 --75.9281 --75.9187 --75.9297 --75.9062 --75.9125 --75.9219 --75.9141 --75.9234 --75.9187 --75.9172 --75.9281 --75.9328 --75.9094 --75.9156 --75.9297 --75.9219 --75.9203 --75.9219 --75.9234 --75.9156 --75.9187 --75.9219 --75.9094 --75.9313 --75.9203 --75.9187 --75.925 --75.9172 --75.9281 --75.9219 --75.9156 --75.9297 --75.9281 --75.9187 --75.9156 --75.9125 --75.925 --75.9281 --75.925 --75.9203 --75.9203 --75.9078 --75.925 --75.9156 --75.9219 --75.9156 --75.9031 --75.9313 --75.9406 --75.925 --75.9187 --75.9156 --75.9203 --75.9203 --75.9328 --75.9281 --75.9266 --75.925 --75.9219 --75.9328 --75.9281 --75.9234 --75.9344 --75.9297 --75.9172 --75.9297 --75.9266 --75.9328 --75.925 --75.9234 --75.9234 --75.925 --75.9281 --75.9375 --75.9187 --75.9219 --75.9328 --75.9234 --75.9187 --75.9234 --75.9375 --75.925 --75.9234 --75.9219 --75.9281 --75.9234 --75.9219 --75.9047 --75.9187 --75.9078 --75.9109 --75.9125 --75.9109 --75.9062 --75.925 --75.9125 --75.9203 --75.9047 --75.9172 --75.9156 --75.9078 --75.9031 --75.9141 --75.9078 --75.9156 --75.9187 --75.9281 --75.9187 --75.9109 --75.9187 --75.9141 --75.9266 --75.9094 --75.9219 --75.9203 --75.9156 --75.9125 --75.9156 --75.9187 --75.9125 --75.9062 --75.9094 --75.9141 --75.9125 --75.9078 --75.9156 --75.9125 --75.9 --75.9062 --75.9187 --75.9094 --75.9203 --75.9187 --75.9094 --75.9109 --75.9094 --75.9187 --75.9234 --75.925 --75.9297 --75.9094 --75.9125 --75.9266 --75.9281 --75.9062 --75.9359 --75.9078 --75.9203 --75.9172 --75.925 --75.9125 --75.9297 --75.9203 --75.9172 --75.9266 --75.9219 --75.9234 --75.925 --75.9266 --75.9219 --75.9359 --75.9266 --75.9172 --75.925 --75.9172 --75.9156 --75.9141 --75.9203 --75.9313 --75.9094 --75.9344 --75.9328 --75.9187 --75.9281 --75.9297 --75.9328 --75.9187 --75.925 --75.9109 --75.9219 --75.9219 --75.9266 --75.9109 --75.9391 --75.9234 --75.9172 --75.9344 --75.9141 --75.9187 --75.9172 --75.9234 --75.9297 --75.9141 --75.9187 --75.9078 --75.9203 --75.9141 --75.9109 --75.9187 --75.9297 --75.9203 --75.9187 --75.9344 --75.9297 --75.9313 --75.9219 --75.9219 --75.925 --75.9125 --75.9281 --75.9359 --75.9203 --75.9234 --75.925 --75.9187 --75.9172 --75.9234 --75.9094 --75.8984 --75.9109 --75.9094 --75.9109 --75.9219 --75.9125 --75.9109 --75.9109 --75.9219 --75.925 --75.9234 --75.9094 --75.9172 --75.9219 --75.925 --75.9062 --75.9078 --75.9047 --75.9141 --75.9062 --75.9156 --75.8984 --75.9062 --75.9109 --75.9062 --75.9344 --75.9062 --75.9172 --75.9047 --75.9219 --75.9094 --75.9141 --75.9141 --75.9172 --75.9234 --75.9125 --75.9219 --75.9031 --75.9109 --75.8984 --75.9156 --75.9078 --75.8984 --75.9203 --75.9141 --75.8969 --75.9 --75.9078 --75.8875 --75.9094 --75.9078 --75.9109 --75.9125 --75.9016 --75.9109 --75.8969 --75.9078 --75.9031 --75.8875 --75.9047 --75.9 --75.8953 --75.9 --75.9062 --75.9094 --75.9125 --75.9016 --75.9125 --75.9141 --75.8969 --75.9016 --75.9016 --75.9047 --75.9047 --75.9047 --75.9047 --75.9016 --75.8906 --75.9016 --75.8984 --75.9141 --75.9047 --75.9047 --75.9 --75.9 --75.9094 --75.8922 --75.8984 --75.9047 --75.8906 --75.8984 --75.8953 --75.8938 --75.8984 --75.8906 --75.9016 --75.9062 --75.9016 --75.8984 --75.9047 --75.8938 --75.8875 --75.8906 --75.8891 --75.8875 --75.8969 --75.9016 --75.8891 --75.8953 --75.8953 --75.8953 --75.9078 --75.8938 --75.9031 --75.9062 --75.8891 --75.9062 --75.8906 --75.9172 --75.8922 --75.9078 --75.9078 --75.8938 --75.8969 --75.8922 --75.9094 --75.8969 --75.9031 --75.8969 --75.8984 --75.9016 --75.9062 --75.9031 --75.9031 --75.9078 --75.9 --75.8938 --75.9016 --75.8953 --75.9062 --75.9031 --75.9109 --75.8969 --75.9047 --75.8906 --75.8938 --75.9062 --75.8969 --75.9062 --75.9078 --75.9047 --75.9156 --75.9078 --75.9 --75.9125 --75.9219 --75.9234 --75.9141 --75.9219 --75.9141 --75.8953 --75.9031 --75.9016 --75.8938 --75.9031 --75.8969 --75.9125 --75.9 --75.8906 --75.8906 --75.9 --75.9 --75.9047 --75.9078 --75.9016 --75.8984 --75.9156 --75.9 --75.8828 --75.8969 --75.8969 --75.8969 --75.9 --75.9109 --75.9047 --75.8969 --75.8984 --75.9141 --75.9078 --75.9266 --75.9156 --75.9062 --75.9 --75.8984 --75.9172 --75.9078 --75.9062 --75.9062 --75.9 --75.9062 --75.9094 --75.8953 --75.9016 --75.8922 --75.9078 --75.9203 --75.9172 --75.9078 --75.8922 --75.8938 --75.9172 --75.9109 --75.9016 --75.9078 --75.9078 --75.9016 --75.9187 --75.9 --75.9187 --75.8969 --75.9172 --75.9125 --75.9094 --75.9109 --75.9016 --75.9031 --75.9125 --75.9141 --75.9125 --75.9078 --75.9031 --75.9125 --75.9156 --75.9094 --75.9172 --75.9031 --75.9078 --75.9266 --75.9062 --75.9234 --75.9125 --75.8984 --75.8953 --75.9156 --75.9234 --75.9156 --75.9219 --75.9281 --75.9234 --75.9141 --75.9141 --75.9187 --75.9156 --75.9172 --75.9094 --75.9047 --75.9062 --75.9109 --75.9219 --75.925 --75.9078 --75.9266 --75.9172 --75.9125 --75.9094 --75.9125 --75.9109 --75.9078 --75.9172 --75.8984 --75.9078 --75.8969 --75.9125 --75.9078 --75.8953 --75.9125 --75.9078 --75.9141 --75.9047 --75.9016 --75.9078 --75.8969 --75.9109 --75.9109 --75.9125 --75.9047 --75.9141 --75.9187 --75.9109 --75.925 --75.9125 --75.9094 --75.9047 --75.9203 --75.9156 --75.9078 --75.9078 --75.9062 --75.9016 --75.9031 --75.9016 --75.9125 --75.9141 --75.9031 --75.9031 --75.9047 --75.9078 --75.8938 --75.9125 --75.9047 --75.8875 --75.9 --75.9156 --75.9141 --75.9234 --75.925 --75.9156 --75.9313 --75.9219 --75.9141 --75.9281 --75.9141 --75.9141 --75.9125 --75.925 --75.9391 --75.9219 --75.9125 --75.9203 --75.9297 --75.9172 --75.925 --75.9125 --75.9359 --75.9266 --75.9234 --75.9219 --75.9375 --75.9266 --75.9313 --75.9187 --75.9203 --75.9047 --75.9125 --75.9141 --75.9062 --75.9187 --75.9313 --75.9203 --75.9094 --75.9219 --75.9156 --75.925 --75.925 --75.8984 --75.9062 --75.9297 --75.9187 --75.925 --75.9094 --75.9172 --75.9234 --75.9094 --75.9109 --75.9297 --75.9125 --75.9219 --75.9234 --75.9219 --75.9203 --75.9328 --75.9078 --75.9172 --75.9266 --75.9078 --75.9156 --75.9172 --75.9156 --75.9219 --75.9031 --75.9109 --75.9062 --75.9219 --75.9109 --75.9047 --75.9016 --75.9125 --75.9031 --75.9062 --75.9078 --75.8969 --75.9125 --75.9125 --75.9031 --75.9156 --75.9156 --75.9281 --75.9141 --75.9141 --75.925 --75.925 --75.9156 --75.9156 --75.9141 --75.9187 --75.9219 --75.9203 --75.9219 --75.9234 --75.9234 --75.9219 --75.9141 --75.9219 --75.9141 --75.9266 --75.9062 --75.9187 --75.9047 --75.9094 --75.9109 --75.9234 --75.9031 --75.8844 --75.8984 --75.9047 --75.8906 --75.9 --75.8938 --75.9109 --75.8969 --75.8953 --75.9125 --75.8906 --75.8938 --75.9125 --75.925 --75.8906 --75.9125 --75.9078 --75.9016 --75.9094 --75.9125 --75.9187 --75.9125 --75.9172 --75.9172 --75.9062 --75.9203 --75.9109 --75.9141 --75.9187 --75.9187 --75.9156 --75.9203 --75.9156 --75.9031 --75.9172 --75.9219 --75.9219 --75.9094 --75.9172 --75.9187 --75.9047 --75.9109 --75.9219 --75.9078 --75.9141 --75.9094 --75.9016 --75.9203 --75.925 --75.9125 --75.9156 --75.8953 --75.9 --75.9125 --75.9141 --75.9125 --75.9172 --75.9109 --75.9172 --75.9187 --75.9266 --75.9078 --75.9094 --75.9172 --75.8922 --75.9078 --75.9156 --75.9109 --75.9109 --75.9 --75.9 --75.9 --75.9047 --75.9 --75.9016 --75.9016 --75.8906 --75.9078 --75.9094 --75.8922 --75.9094 --75.9125 --75.9141 --75.9 --75.9094 --75.9094 --75.9031 --75.9062 --75.9047 --75.9 --75.9062 --75.9062 --75.9156 --75.9078 --75.8938 --75.9141 --75.9 --75.9031 --75.8984 --75.8906 --75.9109 --75.9062 --75.9062 --75.9109 --75.9031 --75.8875 --75.9094 --75.8984 --75.9078 --75.8844 --75.9047 --75.9094 --75.9109 --75.9 --75.8953 --75.9047 --75.8906 --75.8891 --75.8938 --75.9062 --75.8922 --75.8938 --75.9 --75.8938 --75.9047 --75.8844 --75.8969 --75.9062 --75.9219 --75.9109 --75.9109 --75.9016 --75.9062 --75.9016 --75.9047 --75.9047 --75.8922 --75.9062 --75.8953 --75.8953 --75.8938 --75.9031 --75.9016 --75.8969 --75.8969 --75.8984 --75.9094 --75.9125 --75.8969 --75.8969 --75.8984 --75.8969 --75.9078 --75.9094 --75.9016 --75.9062 --75.9047 --75.9016 --75.9094 --75.9016 --75.8969 --75.8938 --75.9078 --75.9109 --75.8953 --75.8906 --75.9187 --75.9047 --75.8984 --75.9078 --75.9109 --75.9094 --75.9031 --75.9125 --75.9031 --75.9172 --75.9016 --75.9187 --75.9062 --75.9141 --75.9047 --75.8984 --75.9187 --75.9078 --75.9141 --75.9047 --75.9062 --75.9016 --75.9078 --75.9109 --75.9125 --75.9062 --75.9094 --75.9062 --75.9031 --75.9078 --75.9172 --75.9031 --75.9109 --75.9016 --75.9 --75.9016 --75.8953 --75.9109 --75.8984 --75.8969 --75.8938 --75.8844 --75.8922 --75.8969 --75.8891 --75.8984 --75.9047 --75.9 --75.9 --75.8938 --75.9125 --75.8891 --75.8984 --75.8875 --75.8969 --75.9062 --75.9016 --75.9172 --75.9016 --75.8984 --75.8828 --75.9 --75.8891 --75.8828 --75.8922 --75.8891 --75.9062 --75.9016 --75.8969 --75.9 --75.9031 --75.9047 --75.9141 --75.9125 --75.9125 --75.9078 --75.8906 --75.8984 --75.9047 --75.8938 --75.9156 --75.8969 --75.9062 --75.8984 --75.9062 --75.9062 --75.8875 --75.9141 --75.9047 --75.9094 --75.9078 --75.9125 --75.9156 --75.9047 --75.9062 --75.9062 --75.9141 --75.9156 --75.9094 --75.9094 --75.9109 --75.9156 --75.9172 --75.9062 --75.9203 --75.9109 --75.9094 --75.9094 --75.9187 --75.9125 --75.9125 --75.9016 --75.9109 --75.9219 --75.9125 --75.9094 --75.9141 --75.8906 --75.9 --75.8984 --75.9141 --75.9 --75.9156 --75.9031 --75.9031 --75.9125 --75.9203 --75.9187 --75.9094 --75.9172 --75.9125 --75.9219 --75.9062 --75.9078 --75.9156 --75.9016 --75.9 --75.9016 --75.9062 --75.9062 --75.9031 --75.8984 --75.9203 --75.9109 --75.8938 --75.9047 --75.9094 --75.9031 --75.8984 --75.9047 --75.9109 --75.9062 --75.9047 --75.8969 --75.9 --75.9078 --75.9109 --75.9016 --75.9031 --75.9047 --75.9 --75.9219 --75.9062 --75.8938 --75.9047 --75.9062 --75.9094 --75.9109 --75.9125 --75.9016 --75.9219 --75.9078 --75.9016 --75.9031 --75.9062 --75.9094 --75.8984 --75.9109 --75.9109 --75.8984 --75.9 --75.9172 --75.9047 --75.9016 --75.9187 --75.9078 --75.9187 --75.9047 --75.9156 --75.9078 --75.9156 --75.9078 --75.9094 --75.9203 --75.9078 --75.9141 --75.9141 --75.9078 --75.9125 --75.9062 --75.9078 --75.9203 --75.9078 --75.9094 --75.9062 --75.9078 --75.9047 --75.9234 --75.9156 --75.9172 --75.9094 --75.9109 --75.9234 --75.9109 --75.9141 --75.9047 --75.9109 --75.9094 --75.9141 --75.9094 --75.9062 --75.9047 --75.9 --75.9094 --75.9156 --75.9187 --75.9016 --75.9094 --75.9031 --75.9125 --75.9047 --75.9047 --75.9016 --75.9062 --75.9156 --75.9016 --75.9172 --75.9125 --75.9062 --75.9031 --75.9203 --75.9047 --75.9172 --75.9109 --75.9156 --75.9 --75.8938 --75.9031 --75.9031 --75.9 --75.9031 --75.9047 --75.9047 --75.9047 --75.9234 --75.9047 --75.9016 --75.9094 --75.9031 --75.9016 --75.9141 --75.9109 --75.9016 --75.9078 --75.9062 --75.9219 --75.8922 --75.9203 --75.9031 --75.9078 --75.9094 --75.9078 --75.9062 --75.9187 --75.9109 --75.9109 --75.9062 --75.9266 --75.9141 --75.9187 --75.9172 --75.9156 --75.9234 --75.9219 --75.9203 --75.9203 --75.9156 --75.9141 --75.9172 --75.9203 --75.9187 --75.9141 --75.9234 --75.9141 --75.9109 --75.9109 --75.9125 --75.9031 --75.9094 --75.9094 --75.9062 --75.9109 --75.9062 --75.9078 --75.9141 --75.9156 --75.9156 --75.9047 --75.9187 --75.9078 --75.9078 --75.9172 --75.9141 --75.9172 --75.9172 --75.9141 --75.9 --75.9109 --75.9078 --75.9234 --75.8984 --75.9172 --75.9219 --75.9156 --75.9094 --75.9094 --75.9047 --75.9187 --75.9141 --75.9062 --75.9156 --75.9156 --75.9203 --75.9094 --75.9109 --75.9109 --75.9078 --75.9125 --75.9203 --75.9172 --75.8969 --75.9125 --75.9094 --75.9062 --75.9141 --75.9016 --75.9109 --75.8922 --75.9047 --75.9047 --75.9031 --75.9125 --75.9078 --75.9109 --75.9078 --75.9109 --75.9047 --75.9219 --75.9141 --75.9 --75.9187 --75.9 --75.9141 --75.9062 --75.9062 --75.8969 --75.9047 --75.9078 --75.9047 --75.9156 --75.9203 --75.9078 --75.9062 --75.9219 --75.9078 --75.8969 --75.9062 --75.9031 --75.9109 --75.9141 --75.9172 --75.9125 --75.9109 --75.9109 --75.9062 --75.9141 --75.9047 --75.9203 --75.9203 --75.9109 --75.9203 --75.9172 --75.9078 --75.9078 --75.8984 --75.9187 --75.9094 --75.9094 --75.9109 --75.9141 --75.8969 --75.925 --75.9141 --75.9109 --75.9062 --75.9047 --75.9156 --75.9031 --75.9062 --75.9094 --75.9125 --75.9047 --75.9062 --75.9156 --75.8922 --75.9109 --75.9016 --75.9109 --75.9078 --75.9078 --75.8953 --75.8938 --75.9031 --75.8859 --75.9094 --75.9062 --75.8953 --75.8969 --75.8953 --75.9 --75.9031 --75.9047 --75.9172 --75.9203 --75.9156 --75.9125 --75.9219 --75.925 --75.9047 --75.9187 --75.9203 --75.9078 --75.9109 --75.9062 --75.9109 --75.9156 --75.9078 --75.9078 --75.8969 --75.8969 --75.9078 --75.9094 --75.9016 --75.9125 --75.8953 --75.8938 --75.9 --75.8922 --75.8953 --75.9078 --75.8969 --75.8984 --75.9078 --75.8969 --75.9031 --75.8953 --75.8859 --75.9016 --75.8891 --75.9 --75.9031 --75.9062 --75.9078 --75.9062 --75.9031 --75.9141 --75.8875 --75.8922 --75.9 --75.8969 --75.9062 --75.8984 --75.9078 --75.9047 --75.9125 --75.8953 --75.8953 --75.8891 --75.8922 --75.9062 --75.9 --75.9 --75.9125 --75.9031 --75.8984 --75.9031 --75.9 --75.8891 --75.9062 --75.8984 --75.8859 --75.8969 --75.9016 --75.9 --75.8922 --75.8812 --75.8938 --75.8891 --75.8875 --75.8781 --75.8859 --75.8969 --75.8969 --75.9062 --75.8953 --75.8844 --75.9 --75.9125 --75.8844 --75.8984 --75.8891 --75.8969 --75.8844 --75.8953 --75.9016 --75.8891 --75.8828 --75.875 --75.8688 --75.8953 --75.8906 --75.8859 --75.8875 --75.8906 --75.8812 --75.8875 --75.8781 --75.8859 --75.8812 --75.8844 --75.8875 --75.8922 --75.8859 --75.8859 --75.8875 --75.8797 --75.8812 --75.8828 --75.8844 --75.8672 --75.8844 --75.8922 --75.8891 --75.8828 --75.8984 --75.8922 --75.8984 --75.8859 --75.8891 --75.8781 --75.8844 --75.8953 --75.8953 --75.8969 --75.8969 --75.8875 --75.9016 --75.8984 --75.9016 --75.9016 --75.8969 --75.8969 --75.8953 --75.9 --75.9016 --75.9 --75.8938 --75.8953 --75.8984 --75.9062 --75.8828 --75.9141 --75.8984 --75.9016 --75.8938 --75.8891 --75.8984 --75.9109 --75.8984 --75.9078 --75.9 --75.8969 --75.8906 --75.8969 --75.8969 --75.8875 --75.8828 --75.9016 --75.9094 --75.9016 --75.9109 --75.8984 --75.9047 --75.9062 --75.9047 --75.9031 --75.9125 --75.9031 --75.8984 --75.8969 --75.9031 --75.8984 --75.8891 --75.8906 --75.9031 --75.8969 --75.8984 --75.8969 --75.8938 --75.8984 --75.9 --75.8875 --75.9016 --75.9078 --75.8891 --75.9062 --75.9 --75.8875 --75.8938 --75.8844 --75.8953 --75.8969 --75.8906 --75.8953 --75.8953 --75.8922 --75.8938 --75.8875 --75.8938 --75.8891 --75.8969 --75.8969 --75.8922 --75.8828 --75.9031 --75.8812 --75.8953 --75.8953 --75.8906 --75.8875 --75.8938 --75.9 --75.8812 --75.8969 --75.8969 --75.9062 --75.9 --75.8797 --75.8938 --75.8859 --75.8844 --75.8984 --75.8922 --75.8766 --75.9031 --75.8938 --75.8984 --75.8922 --75.8984 --75.8875 --75.9047 --75.8828 --75.8828 --75.8875 --75.8891 --75.8891 --75.8797 --75.8984 --75.8891 --75.8859 --75.8891 --75.8906 --75.8875 --75.8922 --75.8953 --75.8938 --75.8953 --75.8922 --75.8922 --75.8953 --75.9016 --75.8859 --75.8812 --75.8906 --75.8812 --75.8844 --75.9047 --75.8844 --75.8969 --75.8969 --75.8953 --75.8953 --75.8969 --75.8781 --75.8953 --75.8953 --75.8797 --75.8719 --75.8922 --75.8859 --75.8953 --75.9031 --75.8906 --75.9031 --75.8922 --75.8953 --75.8969 --75.8984 --75.9 --75.9078 --75.8984 --75.8859 --75.9031 --75.8969 --75.9 --75.9031 --75.9047 --75.9016 --75.8938 --75.8953 --75.9031 --75.8969 --75.9031 --75.9016 --75.9 --75.9031 --75.8828 --75.8953 --75.9031 --75.8875 --75.8844 --75.8969 --75.8953 --75.8859 --75.8844 --75.8812 --75.8891 --75.8891 --75.8906 --75.8953 --75.8922 --75.8922 --75.8969 --75.9 --75.8922 --75.8984 --75.8828 --75.8906 --75.9016 --75.8891 --75.8891 --75.8922 --75.8984 --75.8828 --75.8953 --75.8891 --75.8812 --75.8969 --75.8812 --75.8938 --75.8812 --75.8969 --75.8844 --75.8938 --75.8719 --75.8875 --75.8844 --75.9016 --75.8891 --75.8859 --75.8812 --75.8906 --75.8922 --75.8812 --75.8875 --75.8922 --75.8844 --75.9 --75.8844 --75.8953 --75.8828 --75.9 --75.8891 --75.8812 --75.8984 --75.8797 --75.8875 --75.8859 --75.8859 --75.8922 --75.8906 --75.9 --75.8984 --75.8922 --75.8875 --75.8938 --75.8812 --75.8859 --75.8906 --75.8859 --75.8766 --75.8922 --75.8844 --75.8953 --75.8906 --75.8859 --75.8953 --75.8938 --75.8891 --75.8844 --75.8953 --75.8859 --75.8875 --75.875 --75.8859 --75.8844 --75.8703 --75.8734 --75.8891 --75.8828 --75.8859 --75.8828 --75.8781 --75.8906 --75.8844 --75.8844 --75.8797 --75.8938 --75.8766 --75.8953 --75.8922 --75.9 --75.8797 --75.8828 --75.8984 --75.8781 --75.8891 --75.8859 --75.8875 --75.8891 --75.8844 --75.8828 --75.8844 --75.8734 --75.8828 --75.8797 --75.9125 --75.8797 --75.8719 --75.8844 --75.8953 --75.8938 --75.8859 --75.8812 --75.8875 --75.9047 --75.8922 --75.8875 --75.8906 --75.8859 --75.8781 --75.8984 --75.9031 --75.8938 --75.9 --75.8906 --75.8875 --75.8938 --75.8953 --75.8969 --75.8891 --75.8859 --75.8953 --75.875 --75.8891 --75.8891 --75.8922 --75.9 --75.9 --75.8875 --75.8953 --75.8891 --75.8906 --75.8953 --75.8906 --75.8953 --75.9016 --75.9109 --75.9047 --75.8938 --75.8875 --75.8969 --75.8828 --75.8906 --75.8844 --75.8938 --75.8875 --75.8953 --75.8984 --75.8859 --75.8828 --75.8906 --75.9094 --75.9094 --75.9 --75.9062 --75.8922 --75.9062 --75.8828 --75.8953 --75.9 --75.8875 --75.8984 --75.8766 --75.8938 --75.8953 --75.8938 --75.9109 --75.9016 --75.8891 --75.8984 --75.8969 --75.8875 --75.8938 --75.8984 --75.9 --75.8938 --75.8875 --75.9031 --75.8875 --75.8828 --75.9 --75.8938 --75.8875 --75.8844 --75.8922 --75.8984 --75.8938 --75.8922 --75.8938 --75.9062 --75.8938 --75.9062 --75.8969 --75.9062 --75.8953 --75.8922 --75.9062 --75.9031 --75.8938 --75.8969 --75.8938 --75.9062 --75.8938 --75.9031 --75.8969 --75.9031 --75.9078 --75.8938 --75.9125 --75.9 --75.8969 --75.8891 --75.8922 --75.9172 --75.8906 --75.8969 --75.8953 --75.8984 --75.8938 --75.9031 --75.9016 --75.9078 --75.8938 --75.8875 --75.9047 --75.8891 --75.9125 --75.8781 --75.9 --75.8875 --75.8922 --75.9016 --75.8938 --75.9047 --75.8844 --75.8969 --75.9078 --75.8969 --75.8906 --75.9 --75.9062 --75.9016 --75.9141 --75.9016 --75.9031 --75.9109 --75.9078 --75.9125 --75.8859 --75.8984 --75.8953 --75.9172 --75.9109 --75.9172 --75.9047 --75.9062 --75.9016 --75.8969 --75.8984 --75.9141 --75.9078 --75.9 --75.9047 --75.8953 --75.9125 --75.9062 --75.8953 --75.9031 --75.9047 --75.9 --75.8953 --75.9016 --75.9094 --75.8938 --75.8984 --75.9156 --75.9 --75.9094 --75.9094 --75.8953 --75.8969 --75.9047 --75.9047 --75.9016 --75.8969 --75.9 --75.8969 --75.9062 --75.8984 --75.8938 --75.9031 --75.9 --75.8984 --75.8906 --75.8969 --75.9062 --75.9016 --75.9062 --75.9125 --75.9047 --75.9172 --75.9078 --75.8984 --75.8984 --75.9094 --75.9047 --75.9031 --75.9047 --75.9031 --75.8969 --75.9078 --75.9031 --75.8891 --75.9062 --75.9125 --75.8984 --75.9062 --75.9031 --75.9031 --75.9 --75.9078 --75.8969 --75.9078 --75.8922 --75.8938 --75.8969 --75.9078 --75.9094 --75.9016 --75.8859 --75.8984 --75.9062 --75.8969 --75.9016 --75.9031 --75.8891 --75.9016 --75.9062 --75.8953 --75.9 --75.9047 --75.8969 --75.8922 --75.8859 --75.8906 --75.9031 --75.9078 --75.8938 --75.9016 --75.8969 --75.9062 --75.8906 --75.9047 --75.8922 --75.9 --75.9078 --75.8984 --75.8859 --75.8969 --75.8812 --75.8906 --75.8875 --75.8906 --75.8969 --75.8953 --75.8906 --75.8953 --75.9047 --75.9016 --75.8969 --75.9 --75.9141 --75.8938 --75.9031 --75.9031 --75.8984 --75.8969 --75.8766 --75.9016 --75.8766 --75.9109 --75.9 --75.8938 --75.8969 --75.8875 --75.9031 --75.8906 --75.8891 --75.9 --75.9062 --75.9031 --75.9016 --75.9047 --75.8938 --75.8891 --75.8938 --75.8906 --75.8938 --75.8859 --75.8875 --75.9016 --75.8906 --75.8969 --75.9062 --75.8922 --75.8922 --75.8859 --75.8984 --75.8812 --75.9047 --75.8938 --75.9078 --75.8938 --75.8938 --75.8844 --75.9 --75.9016 --75.8969 --75.9078 --75.8844 --75.8891 --75.9062 --75.8984 --75.8875 --75.8828 --75.9031 --75.8781 --75.8781 --75.8875 --75.8906 --75.8906 --75.8734 --75.8891 --75.8891 --75.8875 --75.8875 --75.8781 --75.8828 --75.8891 --75.8875 --75.8906 --75.8781 --75.8859 --75.8891 --75.8875 --75.9 --75.8797 --75.875 --75.8781 --75.8906 --75.8922 --75.9 --75.8984 --75.8828 --75.8859 --75.9031 --75.8859 --75.8859 --75.8984 --75.8828 --75.8922 --75.8922 --75.9 --75.8781 --75.9031 --75.8719 --75.8875 --75.8844 --75.8844 --75.8828 --75.8906 --75.8859 --75.8844 --75.8875 --75.8891 --75.8828 --75.9047 --75.8812 --75.9016 --75.8953 --75.8922 --75.8922 --75.9031 --75.9 --75.8922 --75.8984 --75.9062 --75.9125 --75.9187 --75.9 --75.9031 --75.9031 --75.9125 --75.9047 --75.9016 --75.9094 --75.8922 --75.8875 --75.9078 --75.9062 --75.8891 --75.9031 --75.9062 --75.9016 --75.8938 --75.8906 --75.8938 --75.8969 --75.8906 --75.8906 --75.8891 --75.8953 --75.8891 --75.8984 --75.8984 --75.8844 --75.9 --75.9141 --75.8984 --75.8875 --75.8922 --75.8828 --75.8875 --75.8781 --75.9 --75.8953 --75.8922 --75.9047 --75.8922 --75.9016 --75.8906 --75.9094 --75.8875 --75.9031 --75.9031 --75.9047 --75.8875 --75.8812 --75.8969 --75.8875 --75.8828 --75.9047 --75.8875 --75.8859 --75.9 --75.8922 --75.8984 --75.8969 --75.9016 --75.9094 --75.8969 --75.8922 --75.8953 --75.9031 --75.8781 --75.9031 --75.8969 --75.875 --75.8844 --75.9031 --75.8969 --75.8969 --75.8875 --75.9016 --75.8922 --75.8906 --75.9094 --75.8797 --75.9 --75.8938 --75.8906 --75.8828 --75.8906 --75.8875 --75.8781 --75.8938 --75.8953 --75.8922 --75.9 --75.8781 --75.8984 --75.9031 --75.8969 --75.8984 --75.9016 --75.9031 --75.8859 --75.8891 --75.8922 --75.8969 --75.8969 --75.8812 --75.8938 --75.9 --75.8969 --75.9031 --75.8953 --75.8938 --75.8984 --75.8906 --75.9 --75.8797 --75.9078 --75.8969 --75.9078 --75.9 --75.8875 --75.8984 --75.9047 --75.8969 --75.8906 --75.8969 --75.9016 --75.9031 --75.9125 --75.9 --75.9047 --75.9031 --75.9062 --75.8875 --75.8812 --75.8906 --75.8781 --75.8953 --75.8891 --75.8938 --75.8953 --75.8875 --75.8953 --75.8922 --75.8844 --75.8828 --75.8812 --75.8891 --75.8906 --75.8938 --75.9016 --75.9047 --75.8922 --75.8828 --75.8891 --75.8938 --75.9031 --75.8859 --75.9031 --75.9078 --75.8922 --75.8906 --75.8719 --75.8969 --75.9094 --75.8859 --75.8953 --75.9047 --75.8922 --75.8969 --75.9078 --75.9 --75.9 --75.8922 --75.8969 --75.8891 --75.8984 --75.9 --75.9031 --75.8891 --75.9047 --75.8859 --75.8984 --75.8875 --75.8891 --75.9 --75.8984 --75.8922 --75.9016 --75.8953 --75.8938 --75.9016 --75.8984 --75.9047 --75.9 --75.9125 --75.8922 --75.8953 --75.8891 --75.8891 --75.9031 --75.9094 --75.9109 --75.9 --75.8938 --75.9 --75.9031 --75.9047 --75.8938 --75.8859 --75.8922 --75.9031 --75.8781 --75.8891 --75.8906 --75.8875 --75.8875 --75.8859 --75.8844 --75.8875 --75.8812 --75.8812 --75.8984 --75.8938 --75.8984 --75.9016 --75.8953 --75.8906 --75.8938 --75.8891 --75.8859 --75.8922 --75.9078 --75.8891 --75.8953 --75.8984 --75.8938 --75.9047 --75.8969 --75.8797 --75.8891 --75.8891 --75.8828 --75.8984 --75.8719 --75.8859 --75.8984 --75.8875 --75.8922 --75.8859 --75.9094 --75.9 --75.9 --75.9094 --75.9016 --75.8859 --75.8875 --75.9016 --75.8984 --75.8781 --75.9109 --75.8812 --75.8891 --75.8938 --75.8938 --75.8891 --75.8875 --75.8969 --75.8922 --75.8797 --75.8844 --75.8781 --75.8906 --75.8969 --75.8953 --75.8844 --75.8875 --75.8859 --75.8953 --75.8828 --75.8828 --75.8938 --75.8922 --75.8906 --75.9016 --75.8906 --75.9031 --75.9 --75.8922 --75.8953 --75.8844 --75.8922 --75.8906 --75.9031 --75.8891 --75.9016 --75.9078 --75.8969 --75.8969 --75.8844 --75.8859 --75.8938 --75.8875 --75.8922 --75.8859 --75.8734 --75.8828 --75.8953 --75.9 --75.8828 --75.8938 --75.8969 --75.9047 --75.9 --75.8844 --75.8938 --75.8938 --75.8922 --75.8938 --75.9125 --75.8984 --75.8938 --75.8969 --75.8984 --75.8891 --75.875 --75.8828 --75.8812 --75.8812 --75.8797 --75.8797 --75.8828 --75.8891 --75.8859 --75.8906 --75.8797 --75.8828 --75.8781 --75.8906 --75.8828 --75.8906 --75.8766 --75.8797 --75.8891 --75.8859 --75.8875 --75.8812 --75.8906 --75.8953 --75.8922 --75.8953 --75.8859 --75.9062 --75.8906 --75.8938 --75.8719 --75.8781 --75.8812 --75.8781 --75.8938 --75.8922 --75.8891 --75.8953 --75.8812 --75.8875 --75.8922 --75.8844 --75.8781 --75.8875 --75.8812 --75.8812 --75.8797 --75.8906 --75.8891 --75.8984 --75.8953 --75.8984 --75.8953 --75.8875 --75.8891 --75.8906 --75.9016 --75.9 --75.8859 --75.8906 --75.9047 --75.8938 --75.8875 --75.9016 --75.9016 --75.8844 --75.8844 --75.8953 --75.9 --75.8797 --75.8844 --75.8906 --75.8953 --75.8953 --75.8875 --75.8938 --75.8984 --75.8984 --75.8844 --75.9 --75.8938 --75.8828 --75.9047 --75.8891 --75.8859 --75.8906 --75.9 --75.8938 --75.8906 --75.8891 --75.8938 --75.9 --75.8922 --75.9062 --75.8906 --75.9078 --75.8953 --75.9 --75.9094 --75.9016 --75.8984 --75.9156 --75.9016 --75.9016 --75.9141 --75.8969 --75.9094 --75.9031 --75.9062 --75.8984 --75.8938 --75.8922 --75.9078 --75.8969 --75.9016 --75.8922 --75.8969 --75.8984 --75.9031 --75.8984 --75.8969 --75.9078 --75.9094 --75.9125 --75.9047 --75.9125 --75.9125 --75.9109 --75.9016 --75.8984 --75.9062 --75.9047 --75.9094 --75.8953 --75.8984 --75.9031 --75.9 --75.8906 --75.9094 --75.8953 --75.8969 --75.9141 --75.9 --75.9047 --75.9047 --75.9 --75.9016 --75.8953 --75.8797 --75.9 --75.9109 --75.8969 --75.8938 --75.8891 --75.9078 --75.9125 --75.9125 --75.9 --75.9156 --75.9125 --75.9047 --75.8969 --75.8938 --75.9031 --75.9109 --75.9141 --75.9062 --75.9062 --75.9172 --75.9078 --75.9172 --75.8984 --75.9094 --75.9094 --75.8922 --75.9 --75.9141 --75.9078 --75.8953 --75.8984 --75.9125 --75.9109 --75.9094 --75.9187 --75.9234 --75.9109 --75.9141 --75.9109 --75.925 --75.9297 --75.9062 --75.9047 --75.9031 --75.9078 --75.9141 --75.9062 --75.9016 --75.9 --75.8859 --75.9 --75.8984 --75.9 --75.9094 --75.9094 --75.8875 --75.9125 --75.8969 --75.9047 --75.8922 --75.8969 --75.8922 --75.8938 --75.9047 --75.9 --75.8844 --75.9109 --75.9016 --75.9031 --75.9 --75.8922 --75.9016 --75.8859 --75.8922 --75.8859 --75.8906 --75.8922 --75.8953 --75.9 --75.9016 --75.8953 --75.9016 --75.8984 --75.9031 --75.8969 --75.8969 --75.9 --75.8953 --75.8938 --75.9 --75.8906 --75.8891 --75.9 --75.9078 --75.8953 --75.9031 --75.8875 --75.9016 --75.8875 --75.8984 --75.8922 --75.9125 --75.9016 --75.9062 --75.8969 --75.9094 --75.9078 --75.9047 --75.9156 --75.9016 --75.8891 --75.9031 --75.8938 --75.9047 --75.8984 --75.8969 --75.8906 --75.8938 --75.8906 --75.8891 --75.8953 --75.8984 --75.8984 --75.8938 --75.8953 --75.9078 --75.8906 --75.8969 --75.8953 --75.9047 --75.9141 --75.8844 --75.8969 --75.8906 --75.9047 --75.9125 --75.8984 --75.9047 --75.9141 --75.9016 --75.9156 --75.9094 --75.9062 --75.9203 --75.8938 --75.9203 --75.9234 --75.9016 --75.9266 --75.925 --75.9141 --75.9094 --75.9172 --75.9203 --75.9125 --75.8953 --75.9109 --75.9203 --75.9078 --75.9141 --75.8938 --75.9 --75.8906 --75.9187 --75.9141 --75.9 --75.9047 --75.9109 --75.9203 --75.9141 --75.9062 --75.9094 --75.9141 --75.9 --75.9187 --75.9031 --75.9156 --75.9172 --75.9141 --75.9172 --75.8938 --75.9109 --75.9141 --75.9141 --75.9094 --75.9078 --75.9109 --75.9047 --75.9094 --75.9078 --75.8938 --75.9078 --75.9031 --75.9 --75.9141 --75.8984 --75.9031 --75.9094 --75.9094 --75.9047 --75.8984 --75.9062 --75.8969 --75.9 --75.8922 --75.8984 --75.8969 --75.8859 --75.8891 --75.8969 --75.8938 --75.8953 --75.9047 --75.8891 --75.9016 --75.9094 --75.9047 --75.9047 --75.9047 --75.8938 --75.8984 --75.8969 --75.9094 --75.9016 --75.8938 --75.8891 --75.8984 --75.8859 --75.8984 --75.8953 --75.9016 --75.9016 --75.8953 --75.8859 --75.8844 --75.8906 --75.8938 --75.8922 --75.9156 --75.9 --75.8781 --75.8859 --75.8891 --75.8938 --75.8953 --75.8969 --75.9078 --75.8906 --75.9078 --75.8969 --75.8922 --75.8984 --75.9031 --75.9062 --75.9062 --75.8906 --75.8984 --75.8953 --75.8969 --75.8891 --75.8891 --75.9016 --75.8906 --75.8922 --75.8828 --75.8938 --75.8891 --75.8969 --75.8984 --75.8859 --75.8906 --75.8922 --75.9 --75.8906 --75.8984 --75.8969 --75.8859 --75.8891 --75.8953 --75.9031 --75.8766 --75.8953 --75.8906 --75.8875 --75.8875 --75.8844 --75.8859 --75.8891 --75.8938 --75.8922 --75.8922 --75.8938 --75.8984 --75.9016 --75.9047 --75.8984 --75.9109 --75.8984 --75.9078 --75.9125 --75.8891 --75.8906 --75.9062 --75.9062 --75.8984 --75.9062 --75.8906 --75.8938 --75.8812 --75.9125 --75.9031 --75.8875 --75.8922 --75.8906 --75.8938 --75.8922 --75.8984 --75.9062 --75.9047 --75.8984 --75.8953 --75.9047 --75.9031 --75.9031 --75.9016 --75.9016 --75.9031 --75.8984 --75.8922 --75.8938 --75.9062 --75.8906 --75.9 --75.8938 --75.8922 --75.8938 --75.9078 --75.8906 --75.9 --75.8953 --75.8953 --75.8969 --75.8984 --75.8953 --75.8984 --75.8938 --75.8953 --75.8953 --75.8969 --75.9 --75.9016 --75.9062 --75.8969 --75.8984 --75.9062 --75.9031 --75.9047 --75.8969 --75.9062 --75.8969 --75.9094 --75.9109 --75.9078 --75.9047 --75.9047 --75.9016 --75.8984 --75.9094 --75.9031 --75.9125 --75.8969 --75.9062 --75.9016 --75.9094 --75.9031 --75.9156 --75.9125 --75.9141 --75.9156 --75.9125 --75.9047 --75.9094 --75.9156 --75.9047 --75.9109 --75.8984 --75.9031 --75.9078 --75.9047 --75.9141 --75.9172 --75.9 --75.9078 --75.9062 --75.9078 --75.9062 --75.9047 --75.8984 --75.9 --75.9 --75.9094 --75.9047 --75.9 --75.9219 --75.9031 --75.9031 --75.9 --75.9156 --75.9187 --75.8953 --75.9109 --75.9141 --75.9047 --75.9047 --75.9094 --75.9141 --75.9047 --75.9266 --75.9094 --75.9016 --75.9156 --75.9047 --75.9016 --75.9141 --75.9094 --75.8953 --75.9156 --75.9125 --75.9 --75.9031 --75.8875 --75.9062 --75.8953 --75.9062 --75.9031 --75.8922 --75.8984 --75.8875 --75.8953 --75.9 --75.9 --75.9047 --75.8922 --75.9031 --75.8953 --75.8906 --75.9 --75.9078 --75.9031 --75.9 --75.9141 --75.9062 --75.9016 --75.8891 --75.8812 --75.9062 --75.8969 --75.8922 --75.8969 --75.9031 --75.8953 --75.9047 --75.9047 --75.8828 --75.8781 --75.8984 --75.9016 --75.8953 --75.9172 --75.9125 --75.8984 --75.9172 --75.9219 --75.9094 --75.9141 --75.9141 --75.9062 --75.9062 --75.9094 --75.9031 --75.9062 --75.9109 --75.9094 --75.8969 --75.9156 --75.9062 --75.9094 --75.8984 --75.9094 --75.9109 --75.9031 --75.9047 --75.9094 --75.9047 --75.9094 --75.9094 --75.8844 --75.9031 --75.9 --75.9109 --75.9016 --75.9047 --75.9187 --75.8984 --75.9109 --75.9031 --75.9031 --75.8922 --75.9156 --75.8969 --75.9062 --75.8984 --75.9 --75.9094 --75.8922 --75.8938 --75.8938 --75.8969 --75.8969 --75.8984 --75.8891 --75.8844 --75.8906 --75.8844 --75.8938 --75.9062 --75.9062 --75.8906 --75.8938 --75.8906 --75.8984 --75.8953 --75.9016 --75.8859 --75.8984 --75.9047 --75.9016 --75.9016 --75.8875 --75.9062 --75.9047 --75.9047 --75.8938 --75.8938 --75.8812 --75.9062 --75.8984 --75.8922 --75.9062 --75.8906 --75.8938 --75.8859 --75.9 --75.8953 --75.8828 --75.8953 --75.9062 --75.8844 --75.8891 --75.8922 --75.8828 --75.8891 --75.8812 --75.8953 --75.8891 --75.9031 --75.8875 --75.8828 --75.8953 --75.8922 --75.8938 --75.8984 --75.8828 --75.8828 --75.8969 --75.8984 --75.9031 --75.8859 --75.9 --75.8969 --75.9047 --75.8969 --75.8875 --75.8891 --75.8969 --75.8938 --75.9078 --75.9109 --75.9016 --75.9078 --75.8906 --75.9016 --75.8969 --75.9047 --75.9047 --75.9047 --75.8953 --75.8984 --75.8938 --75.8969 --75.9078 --75.8969 --75.8875 --75.9 --75.8906 --75.8922 --75.8984 --75.8875 --75.9016 --75.8844 --75.8891 --75.8938 --75.8922 --75.9031 --75.8922 --75.8984 --75.8828 --75.8781 --75.8828 --75.9 --75.8953 --75.8938 --75.8984 --75.8906 --75.8969 --75.9094 --75.8891 --75.8969 --75.8906 --75.8922 --75.8859 --75.8969 --75.8969 --75.8891 --75.8828 --75.8812 --75.9016 --75.8938 --75.8906 --75.8922 --75.8875 --75.8797 --75.8953 --75.8906 --75.8953 --75.9016 --75.8922 --75.8938 --75.8859 --75.875 --75.9031 --75.8969 --75.8969 --75.8891 --75.8969 --75.8812 --75.8938 --75.8828 --75.8859 --75.8875 --75.8906 --75.8859 --75.8953 --75.9016 --75.8828 --75.8938 --75.8922 --75.8938 --75.875 --75.8875 --75.8922 --75.8875 --75.8766 --75.875 --75.8969 --75.8797 --75.8938 --75.9 --75.8875 --75.8984 --75.8875 --75.9016 --75.9016 --75.8844 --75.8922 --75.9031 --75.9 --75.8984 --75.8906 --75.8984 --75.8984 --75.8922 --75.8797 --75.9 --75.8984 --75.8859 --75.9078 --75.9094 --75.8891 --75.8922 --75.8906 --75.8969 --75.8922 --75.9016 --75.8969 --75.9016 --75.9125 --75.9062 --75.8953 --75.8969 --75.8906 --75.8984 --75.9047 --75.8844 --75.9125 --75.9 --75.8938 --75.9078 --75.9078 --75.9031 --75.8859 --75.9141 --75.8969 --75.9031 --75.8875 --75.8922 --75.8906 --75.8797 --75.9047 --75.8938 --75.9031 --75.9062 --75.9094 --75.8906 --75.8984 --75.8953 --75.9062 --75.8953 --75.8984 --75.8906 --75.8953 --75.9016 --75.8922 --75.8906 --75.8875 --75.8844 --75.8781 --75.8859 --75.8906 --75.8797 --75.8891 --75.8922 --75.9047 --75.8828 --75.8906 --75.9047 --75.8844 --75.8906 --75.8984 --75.9016 --75.8953 --75.8969 --75.9047 --75.9078 --75.8797 --75.9 --75.8891 --75.8891 --75.8906 --75.8922 --75.8844 --75.8938 --75.8875 --75.8906 --75.8906 --75.8859 --75.8891 --75.8859 --75.8969 --75.8719 --75.8844 --75.9047 --75.8984 --75.9094 --75.8828 --75.8797 --75.8922 --75.8953 --75.8844 --75.8969 --75.8938 --75.8828 --75.8953 --75.8844 --75.8906 --75.9047 --75.9047 --75.8875 --75.9 --75.9078 --75.9078 --75.8875 --75.8906 --75.8938 --75.8828 --75.8953 --75.8875 --75.8922 --75.8922 --75.8953 --75.8906 --75.8859 --75.8969 --75.8859 --75.9156 --75.8922 --75.8969 --75.9125 --75.8875 --75.9031 --75.9109 --75.8953 --75.9062 --75.9125 --75.8938 --75.8969 --75.9047 --75.9031 --75.8969 --75.8859 --75.8891 --75.8938 --75.8953 --75.8984 --75.8922 --75.9031 --75.8969 --75.9016 --75.8984 --75.9062 --75.8891 --75.9062 --75.8922 --75.9062 --75.9047 --75.8953 --75.8828 --75.8859 --75.8875 --75.9016 --75.9016 --75.8891 --75.8953 --75.9 --75.9 --75.8844 --75.9047 --75.9016 --75.8984 --75.9016 --75.9 --75.9156 --75.9141 --75.9031 --75.9203 --75.9016 --75.9141 --75.9141 --75.9156 --75.9125 --75.9187 --75.9109 --75.9062 --75.9078 --75.9078 --75.9062 --75.9 --75.9172 --75.9078 --75.8859 --75.9062 --75.9047 --75.8891 --75.8844 --75.8938 --75.8984 --75.8938 --75.9062 --75.9016 --75.9016 --75.8922 --75.8828 --75.9094 --75.9062 --75.9 --75.8953 --75.9031 --75.9016 --75.9016 --75.8969 --75.9031 --75.9031 --75.8984 --75.8875 --75.9 --75.9062 --75.8953 --75.8938 --75.8938 --75.8953 --75.8969 --75.9094 --75.9 --75.8875 --75.8875 --75.8844 --75.8938 --75.8953 --75.8891 --75.8984 --75.9 --75.9016 --75.8984 --75.9094 --75.8969 --75.9031 --75.8828 --75.9016 --75.8938 --75.9 --75.8828 --75.9031 --75.8984 --75.8922 --75.9 --75.8969 --75.9094 --75.8984 --75.8969 --75.8953 --75.8922 --75.8984 --75.8859 --75.9047 --75.9031 --75.8844 --75.8984 --75.9016 --75.9016 --75.8953 --75.8984 --75.9078 --75.9031 --75.8938 --75.8953 --75.8922 --75.8953 --75.8969 --75.9 --75.9078 --75.8922 --75.9078 --75.8953 --75.9 --75.8922 --75.8922 --75.9062 --75.8859 --75.8906 --75.8953 --75.8719 --75.8969 --75.8969 --75.8969 --75.8969 --75.8938 --75.8953 --75.9016 --75.8859 --75.8922 --75.8906 --75.8875 --75.8922 --75.8891 --75.8828 --75.8875 --75.9 --75.8938 --75.9047 --75.9109 --75.8969 --75.8984 --75.9 --75.8891 --75.8953 --75.9 --75.8984 --75.8844 --75.8984 --75.9 --75.8859 --75.8906 --75.8938 --75.9 --75.8922 --75.8969 --75.8859 --75.8875 --75.8984 --75.8906 --75.8891 --75.8844 --75.8812 --75.8766 --75.8781 --75.8891 --75.8906 --75.8984 --75.8875 --75.8844 --75.8953 --75.8828 --75.8859 --75.8734 --75.8906 --75.8781 --75.8781 --75.8953 --75.8906 --75.8781 --75.8828 --75.8906 --75.8844 --75.8844 --75.8953 --75.8891 --75.8953 --75.8812 --75.8938 --75.8828 --75.8875 --75.8938 --75.8938 --75.8922 --75.8812 --75.8891 --75.8891 --75.8875 --75.8984 --75.8969 --75.8938 --75.8922 --75.8906 --75.9062 --75.8844 --75.8922 --75.8797 --75.8828 --75.8875 --75.8891 --75.8906 --75.8906 --75.8688 --75.8891 --75.8969 --75.8812 --75.8875 --75.8891 --75.9 --75.8844 --75.8922 --75.8938 --75.8906 --75.8969 --75.8953 --75.8969 --75.9047 --75.8828 --75.8922 --75.8922 --75.8938 --75.8891 --75.8953 --75.8812 --75.8891 --75.8906 --75.9031 --75.8953 --75.8922 --75.8875 --75.8875 --75.9 --75.8906 --75.8906 --75.8953 --75.8828 --75.9047 --75.8797 --75.8953 --75.8969 --75.9 --75.8938 --75.8953 --75.8922 --75.8891 --75.8906 --75.9 --75.8891 --75.8859 --75.9 --75.8938 --75.8984 --75.8734 --75.8922 --75.8875 --75.8781 --75.8875 --75.8797 --75.8953 --75.8844 --75.8766 --75.9062 --75.9047 --75.8984 --75.9094 --75.8875 --75.9016 --75.9016 --75.8953 --75.8938 --75.9016 --75.8938 --75.9016 --75.9 --75.9047 --75.8969 --75.8891 --75.8969 --75.8953 --75.8844 --75.8844 --75.8859 --75.9047 --75.8984 --75.8984 --75.8859 --75.8906 --75.9031 --75.8938 --75.9047 --75.8969 --75.9047 --75.8922 --75.9078 --75.9031 --75.8953 --75.8984 --75.8969 --75.9094 --75.8812 --75.8953 --75.9016 --75.9078 --75.9047 --75.8953 --75.9125 --75.9203 --75.9047 --75.8953 --75.8984 --75.9078 --75.9172 --75.9016 --75.9141 --75.8922 --75.9094 --75.9109 --75.9062 --75.8875 --75.9 --75.8969 --75.8969 --75.8984 --75.9 --75.9047 --75.9 --75.8953 --75.8984 --75.8875 --75.9 --75.8938 --75.8969 --75.8953 --75.9031 --75.8953 --75.8953 --75.8953 --75.8906 --75.8938 --75.8875 --75.8953 --75.9031 --75.8875 --75.8953 --75.9016 --75.9016 --75.9 --75.9078 --75.8969 --75.9 --75.9016 --75.9141 --75.9 --75.8875 --75.8828 --75.8938 --75.9 --75.9 --75.9047 --75.8875 --75.8875 --75.9031 --75.9078 --75.8922 --75.9125 --75.8922 --75.9047 --75.8828 --75.8906 --75.8906 --75.8969 --75.8875 --75.8984 --75.8938 --75.8969 --75.9 --75.9109 --75.8875 --75.9 --75.8984 --75.8984 --75.9062 --75.8984 --75.8969 --75.8891 --75.9031 --75.8969 --75.8938 --75.9094 --75.9016 --75.9109 --75.8938 --75.9016 --75.9047 --75.8922 --75.9016 --75.9109 --75.8969 --75.9094 --75.8938 --75.9078 --75.8984 --75.9031 --75.8969 --75.9062 --75.9062 --75.9016 --75.9047 --75.9125 --75.9094 --75.8938 --75.9187 --75.9031 --75.9094 --75.9 --75.9109 --75.9094 --75.9078 --75.9203 --75.9047 --75.9047 --75.9109 --75.9 --75.8906 --75.8922 --75.9062 --75.9047 --75.8984 --75.9062 --75.9 --75.9062 --75.9047 --75.9031 --75.8859 --75.8984 --75.9031 --75.8859 --75.9 --75.9094 --75.9031 --75.8984 --75.8953 --75.9016 --75.9141 --75.9125 --75.9094 --75.9109 --75.9 --75.9141 --75.9062 --75.9094 --75.9047 --75.9 --75.9 --75.9078 --75.9078 --75.9094 --75.9 --75.9031 --75.9016 --75.8984 --75.8844 --75.9047 --75.9125 --75.9047 --75.8891 --75.8969 --75.9156 --75.9094 --75.8891 --75.9062 --75.9031 --75.8969 --75.8844 --75.8953 --75.9047 --75.9078 --75.8906 --75.8906 --75.9094 --75.8922 --75.9078 --75.8953 --75.8891 --75.8812 --75.8969 --75.8859 --75.8859 --75.8969 --75.8812 --75.8953 --75.8938 --75.8797 --75.8984 --75.8922 --75.8922 --75.8875 --75.9062 --75.8828 --75.8984 --75.8844 --75.8906 --75.9016 --75.8938 --75.8922 --75.9 --75.8891 --75.9094 --75.8984 --75.9031 --75.8859 --75.8859 --75.8922 --75.8891 --75.8812 --75.8938 --75.8969 --75.9016 --75.9016 --75.8953 --75.9031 --75.8953 --75.8953 --75.8938 --75.8953 --75.9 --75.8812 --75.8875 --75.9016 --75.9047 --75.9156 --75.8891 --75.9016 --75.8953 --75.8859 --75.8906 --75.8859 --75.8875 --75.9094 --75.9016 --75.8875 --75.8984 --75.8922 --75.8891 --75.8875 --75.8812 --75.8938 --75.8906 --75.8922 --75.8906 --75.8906 --75.8812 --75.8953 --75.8969 --75.8969 --75.8828 --75.9031 --75.9016 --75.9 --75.8953 --75.8969 --75.8969 --75.8938 --75.8922 --75.8938 --75.8953 --75.8875 --75.8984 --75.9016 --75.8953 --75.9062 --75.8906 --75.8875 --75.8922 --75.8812 --75.9016 --75.8938 --75.8969 --75.9031 --75.9047 --75.8984 --75.8953 --75.9062 --75.9109 --75.8953 --75.9031 --75.8984 --75.9 --75.9 --75.9078 --75.9109 --75.9016 --75.9094 --75.8984 --75.9094 --75.8938 --75.8984 --75.9062 --75.9047 --75.9062 --75.9047 --75.9078 --75.9016 --75.9219 --75.9094 --75.9094 --75.9062 --75.9016 --75.9062 --75.9156 --75.8938 --75.9094 --75.8984 --75.9109 --75.8891 --75.9125 --75.9141 --75.9062 --75.9187 --75.9109 --75.9 --75.9094 --75.9016 --75.8969 --75.9047 --75.8812 --75.9078 --75.9016 --75.9094 --75.9031 --75.9047 --75.9109 --75.9234 --75.9141 --75.9078 --75.9109 --75.9062 --75.9156 --75.8984 --75.925 --75.9156 --75.9031 --75.9187 --75.9078 --75.9047 --75.9156 --75.9141 --75.9187 --75.9078 --75.9 --75.9141 --75.9094 --75.9016 --75.9125 --75.8969 --75.9047 --75.9109 --75.9062 --75.8938 --75.9047 --75.8969 --75.9078 --75.9047 --75.9078 --75.9219 --75.9234 --75.9125 --75.9078 --75.9109 --75.9125 --75.9281 --75.9094 --75.9094 --75.9187 --75.9 --75.9016 --75.9031 --75.9141 --75.9094 --75.8969 --75.9078 --75.8969 --75.9047 --75.8969 --75.9016 --75.9047 --75.9156 --75.9172 --75.9031 --75.8922 --75.8875 --75.8922 --75.9078 --75.9016 --75.9 --75.9 --75.9062 --75.9 --75.9125 --75.9109 --75.9016 --75.9125 --75.9078 --75.9109 --75.9109 --75.9031 --75.8953 --75.9062 --75.9125 --75.9047 --75.9172 --75.9172 --75.9141 --75.8906 --75.9125 --75.925 --75.9078 --75.9016 --75.9156 --75.9125 --75.9078 --75.9172 --75.9047 --75.9219 --75.9172 --75.8938 --75.9172 --75.9016 --75.9016 --75.9062 --75.9203 --75.9156 --75.9172 --75.9172 --75.9094 --75.9109 --75.9031 --75.8953 --75.9187 --75.8891 --75.9125 --75.9109 --75.9078 --75.9031 --75.9078 --75.9062 --75.9047 --75.9078 --75.8938 --75.8938 --75.8906 --75.8875 --75.8938 --75.9062 --75.9 --75.9094 --75.9031 --75.8969 --75.9031 --75.9172 --75.9047 --75.8969 --75.9141 --75.9094 --75.9109 --75.9047 --75.9109 --75.9172 --75.9078 --75.9062 --75.9 --75.9016 --75.9031 --75.9172 --75.9 --75.8891 --75.8906 --75.8938 --75.8984 --75.9016 --75.9156 --75.8953 --75.8953 --75.9094 --75.9 --75.9 --75.9094 --75.9141 --75.9094 --75.8922 --75.8984 --75.8938 --75.9078 --75.9031 --75.9109 --75.8922 --75.9031 --75.9031 --75.8906 --75.9109 --75.9047 --75.8969 --75.9031 --75.8969 --75.9016 --75.9172 --75.9031 --75.9094 --75.8969 --75.8984 --75.8953 --75.9219 --75.9094 --75.9062 --75.9094 --75.9031 --75.9 --75.8891 --75.8953 --75.9 --75.9047 --75.8984 --75.8938 --75.9109 --75.8875 --75.8828 --75.9078 --75.8938 --75.8891 --75.8953 --75.8906 --75.9094 --75.9047 --75.9016 --75.9031 --75.8969 --75.8938 --75.9062 --75.9031 --75.9109 --75.9031 --75.9094 --75.9078 --75.9078 --75.8875 --75.9062 --75.9047 --75.9125 --75.8906 --75.9062 --75.9094 --75.9016 --75.8969 --75.9 --75.8922 --75.9031 --75.9172 --75.9 --75.8953 --75.8984 --75.8938 --75.9047 --75.9031 --75.9 --75.9094 --75.9062 --75.8875 --75.9125 --75.8938 --75.9094 --75.9078 --75.9016 --75.8984 --75.8875 --75.8984 --75.8984 --75.9047 --75.8953 --75.9 --75.9109 --75.8969 --75.9109 --75.8969 --75.8891 --75.9094 --75.8797 --75.8891 --75.8844 --75.9016 --75.8953 --75.8953 --75.9047 --75.8875 --75.8812 --75.8938 --75.8766 --75.8781 --75.8859 --75.8688 --75.8781 --75.875 --75.8875 --75.9031 --75.8844 --75.8812 --75.8875 --75.8906 --75.8844 --75.8938 --75.8875 --75.8875 --75.8859 --75.9062 --75.8781 --75.8844 --75.8906 --75.8812 --75.9062 --75.8828 --75.8922 --75.8797 --75.8969 --75.9078 --75.9016 --75.9031 --75.8938 --75.9109 --75.8828 --75.8969 --75.9031 --75.9125 --75.9031 --75.8922 --75.9031 --75.8938 --75.8859 --75.9109 --75.9078 --75.9031 --75.8938 --75.9016 --75.9 --75.9 --75.8734 --75.8906 --75.9062 --75.9031 --75.8797 --75.9094 --75.9016 --75.8844 --75.8875 --75.8938 --75.8875 --75.8969 --75.8938 --75.8906 --75.8906 --75.8922 --75.9031 --75.9047 --75.8938 --75.8969 --75.9 --75.8922 --75.9047 --75.8938 --75.9078 --75.9078 --75.8969 --75.8875 --75.9078 --75.8828 --75.8969 --75.9156 --75.8953 --75.9109 --75.9109 --75.8938 --75.8875 --75.9078 --75.9031 --75.8953 --75.9031 --75.8828 --75.9156 --75.9094 --75.9 --75.9109 --75.8984 --75.8938 --75.9062 --75.9094 --75.8906 --75.9078 --75.9125 --75.9031 --75.9 --75.9109 --75.9125 --75.9109 --75.9062 --75.9016 --75.9 --75.9203 --75.9187 --75.8984 --75.9125 --75.8969 --75.8938 --75.9016 --75.9219 --75.9031 --75.9219 --75.9156 --75.9172 --75.9031 --75.9031 --75.9156 --75.9094 --75.8984 --75.9016 --75.8953 --75.9047 --75.8906 --75.9156 --75.9109 --75.9031 --75.9062 --75.9 --75.9047 --75.9016 --75.9078 --75.9109 --75.8969 --75.9078 --75.9016 --75.9062 --75.9047 --75.8922 --75.8922 --75.9141 --75.9109 --75.8891 --75.8891 --75.8938 --75.9094 --75.9047 --75.8922 --75.8953 --75.9 --75.8984 --75.9031 --75.9234 --75.8969 --75.9031 --75.9078 --75.8922 --75.9 --75.9078 --75.9 --75.8984 --75.8922 --75.9047 --75.8969 --75.8984 --75.8969 --75.9031 --75.9062 --75.9141 --75.8969 --75.8953 --75.9031 --75.9031 --75.9047 --75.8984 --75.9047 --75.8922 --75.9016 --75.9125 --75.9 --75.9016 --75.8922 --75.9016 --75.9031 --75.9 --75.9047 --75.9078 --75.9078 --75.9 --75.9 --75.9203 --75.9 --75.9 --75.9078 --75.9172 --75.8969 --75.9047 --75.8906 --75.9156 --75.9 --75.9016 --75.9078 --75.9047 --75.8922 --75.9016 --75.9109 --75.9047 --75.9062 --75.9094 --75.9 --75.8969 --75.9078 --75.9047 --75.9031 --75.9094 --75.9078 --75.9125 --75.9125 --75.9078 --75.9203 --75.9125 --75.9234 --75.9172 --75.925 --75.9125 --75.9156 --75.9 --75.9219 --75.9156 --75.9156 --75.9156 --75.9203 --75.9328 --75.9219 --75.9031 --75.9172 --75.9203 --75.9219 --75.9016 --75.9141 --75.9078 --75.925 --75.9047 --75.9172 --75.9172 --75.9266 --75.9125 --75.9047 --75.9172 --75.9156 --75.9172 --75.9047 --75.9172 --75.9031 --75.9016 --75.9141 --75.9203 --75.9109 --75.8875 --75.9062 --75.9297 --75.9125 --75.9156 --75.9141 --75.9172 --75.9078 --75.9062 --75.9156 --75.9141 --75.9125 --75.9016 --75.9047 --75.9156 --75.9109 --75.8906 --75.9078 --75.9141 --75.9016 --75.9141 --75.9016 --75.9094 --75.9078 --75.9062 --75.8953 --75.9187 --75.8984 --75.9031 --75.9156 --75.9172 --75.9109 --75.9094 --75.9047 --75.9109 --75.9109 --75.9047 --75.9109 --75.9094 --75.8984 --75.9109 --75.9125 --75.9094 --75.9234 --75.9094 --75.9109 --75.9062 --75.9078 --75.9078 --75.9141 --75.9156 --75.9156 --75.8984 --75.9156 --75.9031 --75.9234 --75.9187 --75.8922 --75.9078 --75.9109 --75.8969 --75.8953 --75.9062 --75.9156 --75.9016 --75.8891 --75.9078 --75.9062 --75.9187 --75.9141 --75.8969 --75.8953 --75.9031 --75.9016 --75.9187 --75.9062 --75.9109 --75.9062 --75.9266 --75.9234 --75.9016 --75.9234 --75.9266 --75.9 --75.9062 --75.9141 --75.925 --75.8984 --75.9266 --75.9156 --75.9219 --75.9172 --75.9203 --75.9141 --75.9078 --75.9062 --75.9109 --75.9109 --75.9141 --75.9125 --75.9234 --75.9219 --75.925 --75.9219 --75.9156 --75.9125 --75.9062 --75.9062 --75.9266 --75.9109 --75.9 --75.9078 --75.9109 --75.9016 --75.9141 --75.9156 --75.9156 --75.8953 --75.8984 --75.8953 --75.8844 --75.8953 --75.8891 --75.9109 --75.9062 --75.8922 --75.9016 --75.9125 --75.9125 --75.9172 --75.9094 --75.925 --75.9109 --75.9094 --75.9141 --75.9016 --75.9047 --75.9031 --75.9016 --75.9203 --75.9094 --75.9141 --75.9094 --75.9156 --75.9203 --75.9062 --75.9016 --75.9078 --75.9047 --75.9125 --75.9172 --75.9141 --75.9031 --75.9078 --75.9172 --75.9156 --75.9094 --75.925 --75.9016 --75.9156 --75.9172 --75.9156 --75.9313 --75.9047 --75.925 --75.9109 --75.9094 --75.9172 --75.9234 --75.9234 --75.9156 --75.9141 --75.9234 --75.9281 --75.9109 --75.9375 --75.9141 --75.9219 --75.9234 --75.9172 --75.9172 --75.9234 --75.9359 --75.925 --75.9313 --75.9391 --75.9187 --75.9172 --75.9266 --75.9219 --75.9031 --75.9281 --75.9219 --75.9109 --75.9109 --75.9187 --75.9297 --75.9219 --75.925 --75.9203 --75.9203 --75.9219 --75.9203 --75.9047 --75.9125 --75.9187 --75.9328 --75.9266 --75.9313 --75.9203 --75.9016 --75.9172 --75.9109 --75.9094 --75.9 --75.9062 --75.9234 --75.9234 --75.9062 --75.9125 --75.9203 --75.9219 --75.9281 --75.9328 --75.9266 --75.9172 --75.9297 --75.9203 --75.9359 --75.9187 --75.9266 --75.9375 --75.9328 --75.9375 --75.9266 --75.925 --75.9141 --75.9219 --75.925 --75.9281 --75.9281 --75.9203 --75.9203 --75.9313 --75.9234 --75.9109 --75.9109 --75.9203 --75.9125 --75.9281 --75.9219 --75.9203 --75.9078 --75.9109 --75.9187 --75.9187 --75.9125 --75.925 --75.9203 --75.9328 --75.9297 --75.9328 --75.9344 --75.9172 --75.9219 --75.9219 --75.9203 --75.9281 --75.9172 --75.9266 --75.9234 --75.925 --75.9172 --75.9187 --75.9234 --75.9234 --75.9297 --75.9109 --75.9375 --75.9234 --75.9281 --75.925 --75.9344 --75.9203 --75.9109 --75.9187 --75.9187 --75.9234 --75.9172 --75.9125 --75.9297 --75.9156 --75.925 --75.9313 --75.9141 --75.95 --75.9219 --75.925 --75.9297 --75.9203 --75.9422 --75.9203 --75.9203 --75.9281 --75.925 --75.925 --75.9437 --75.9406 --75.9313 --75.925 --75.925 --75.9359 --75.9359 --75.9328 --75.9234 --75.9141 --75.9187 --75.9297 --75.9219 --75.9219 --75.9156 --75.9219 --75.9156 --75.9172 --75.9266 --75.9281 --75.9234 --75.9125 --75.9234 --75.9234 --75.9125 --75.9109 --75.9281 --75.9375 --75.925 --75.9281 --75.925 --75.9313 --75.9406 --75.9437 --75.925 --75.9094 --75.9187 --75.9359 --75.9234 --75.9344 --75.9281 --75.9406 --75.9375 --75.9281 --75.925 --75.9203 --75.9062 --75.9344 --75.9313 --75.9266 --75.9266 --75.9172 --75.9125 --75.9375 --75.925 --75.9234 --75.9281 --75.9281 --75.9203 --75.9328 --75.925 --75.9281 --75.9328 --75.9328 --75.9344 --75.9375 --75.9359 --75.9328 --75.9391 --75.9313 --75.9359 --75.9359 --75.9406 --75.9281 --75.9547 --75.9219 --75.9266 --75.9328 --75.9437 --75.9344 --75.9453 --75.9313 --75.9328 --75.9281 --75.9234 --75.9406 --75.9187 --75.9125 --75.9406 --75.9391 --75.9203 --75.9297 --75.9313 --75.9297 --75.9313 --75.9344 --75.9344 --75.9344 --75.9297 --75.9297 --75.9281 --75.9266 --75.9344 --75.9406 --75.9313 --75.9359 --75.9156 --75.9266 --75.9313 --75.9344 --75.9453 --75.9375 --75.9406 --75.9344 --75.9391 --75.9281 --75.9328 --75.9281 --75.9187 --75.9313 --75.9375 --75.9359 --75.9375 --75.9328 --75.9266 --75.9266 --75.9328 --75.9391 --75.9391 --75.925 --75.9359 --75.925 --75.9391 --75.9391 --75.9187 --75.9437 --75.9375 --75.925 --75.9281 --75.9297 --75.9313 --75.9328 --75.9359 --75.9281 --75.9266 --75.9406 --75.9344 --75.9437 --75.9437 --75.9328 --75.9297 --75.9281 --75.9469 --75.9484 --75.9375 --75.9391 --75.9484 --75.9422 --75.9406 --75.9437 --75.9453 --75.9453 --75.95 --75.9437 --75.9391 --75.9453 --75.9406 --75.9266 --75.9422 --75.9422 --75.9406 --75.9453 --75.9406 --75.95 --75.95 --75.9375 --75.9406 --75.9422 --75.9484 --75.9453 --75.9406 --75.9437 --75.9391 --75.9359 --75.9484 --75.9391 --75.9391 --75.9406 --75.9297 --75.9359 --75.9531 --75.9469 --75.9344 --75.9359 --75.9563 --75.9422 --75.9531 --75.9422 --75.9453 --75.9531 --75.95 --75.9422 --75.9469 --75.9313 --75.925 --75.9328 --75.9516 --75.925 --75.925 --75.9531 --75.9391 --75.9375 --75.9281 --75.9344 --75.9281 --75.9453 --75.9391 --75.9453 --75.9219 --75.9328 --75.9344 --75.9328 --75.9313 --75.9266 --75.9078 --75.9359 --75.9234 --75.9234 --75.9297 --75.9406 --75.9328 --75.9391 --75.9266 --75.9266 --75.9359 --75.9359 --75.9437 --75.9187 --75.9328 --75.9453 --75.9203 --75.9375 --75.9422 --75.9344 --75.9328 --75.9297 --75.9281 --75.9313 --75.9375 --75.9328 --75.9391 --75.9422 --75.9219 --75.9359 --75.9281 --75.9156 --75.9234 --75.9266 --75.9234 --75.9328 --75.9313 --75.9266 --75.9266 --75.9172 --75.9375 --75.9313 --75.9375 --75.9313 --75.9266 --75.9453 --75.9328 --75.9313 --75.9281 --75.925 --75.9406 --75.9391 --75.9391 --75.9281 --75.9375 --75.9313 --75.9437 --75.9281 --75.9359 --75.9297 --75.9375 --75.9391 --75.9266 --75.9375 --75.9391 --75.9391 --75.9406 --75.9313 --75.9375 --75.9375 --75.9375 --75.9344 --75.9344 --75.9406 --75.9453 --75.9547 --75.9406 --75.9469 --75.9484 --75.9422 --75.9453 --75.9484 --75.9484 --75.9516 --75.9313 --75.95 --75.9391 --75.9422 --75.9453 --75.9375 --75.9391 --75.9484 --75.95 --75.9437 --75.9531 --75.9453 --75.9359 --75.95 --75.9406 --75.9422 --75.9609 --75.9609 --75.9437 --75.9453 --75.9391 --75.9266 --75.9359 --75.9422 --75.9484 --75.9328 --75.95 --75.9625 --75.9406 --75.95 --75.95 --75.9422 --75.9531 --75.9406 --75.9453 --75.9469 --75.9422 --75.95 --75.9484 --75.9453 --75.9422 --75.9391 --75.9484 --75.9563 --75.9563 --75.9609 --75.9547 --75.9344 --75.9469 --75.9359 --75.9453 --75.9344 --75.9437 --75.9391 --75.9563 --75.9437 --75.9469 --75.9437 --75.9406 --75.9375 --75.9563 --75.9453 --75.9437 --75.9422 --75.9437 --75.9406 --75.9391 --75.9484 --75.9484 --75.9484 --75.9391 --75.9547 --75.9531 --75.95 --75.9422 --75.9453 --75.9437 --75.9453 --75.9469 --75.9484 --75.9453 --75.9437 --75.9297 --75.9375 --75.9391 --75.9516 --75.9422 --75.9375 --75.95 --75.9516 --75.9422 --75.9453 --75.9422 --75.9359 --75.9328 --75.9297 --75.9578 --75.9484 --75.9406 --75.9344 --75.9484 --75.9422 --75.9391 --75.9406 --75.9469 --75.9484 --75.9391 --75.9344 --75.9375 --75.9391 --75.9328 --75.9375 --75.9344 --75.9453 --75.95 --75.9375 --75.9516 --75.9344 --75.9406 --75.925 --75.9313 --75.9219 --75.9313 --75.9391 --75.9266 --75.925 --75.9391 --75.9297 --75.9297 --75.9328 --75.9391 --75.9422 --75.9297 --75.9297 --75.9484 --75.9375 --75.9406 --75.9437 --75.9359 --75.925 --75.9391 --75.9266 --75.9344 --75.9234 --75.9313 --75.9266 --75.9328 --75.9328 --75.9266 --75.9391 --75.925 --75.9391 --75.9266 --75.9406 --75.9375 --75.9328 --75.9359 --75.9406 --75.9266 --75.9391 --75.9391 --75.9359 --75.925 --75.9344 --75.9234 --75.925 --75.9422 --75.9484 --75.9297 --75.9281 --75.9328 --75.9391 --75.9391 --75.9406 --75.9422 --75.9437 --75.9375 --75.9437 --75.9344 --75.95 --75.9406 --75.9484 --75.9203 --75.9453 --75.9359 --75.9359 --75.9234 --75.9234 --75.9328 --75.9281 --75.9375 --75.9266 --75.9344 --75.9297 --75.9453 --75.9375 --75.9313 --75.9391 --75.9281 --75.9375 --75.9375 --75.9297 --75.95 --75.9359 --75.9437 --75.9422 --75.9437 --75.9344 --75.9234 --75.9453 --75.9406 --75.9422 --75.9437 --75.9297 --75.9375 --75.9281 --75.9281 --75.9422 --75.9203 --75.9313 --75.9406 --75.9344 --75.9359 --75.9437 --75.9266 --75.9297 --75.9281 --75.9359 --75.9328 --75.9203 --75.9328 --75.9406 --75.9266 --75.9266 --75.9422 --75.925 --75.9437 --75.9406 --75.9297 --75.9328 --75.9359 --75.9281 --75.9391 --75.9406 --75.9297 --75.9469 --75.9453 --75.9422 --75.9344 --75.9344 --75.9234 --75.9344 --75.9234 --75.9313 --75.9344 --75.9328 --75.9391 --75.9453 --75.9375 --75.9406 --75.9391 --75.9375 --75.9422 --75.9453 --75.9406 --75.95 --75.9547 --75.9422 --75.9531 --75.95 --75.9453 --75.9359 --75.9297 --75.9453 --75.9422 --75.95 --75.9469 --75.9344 --75.9391 --75.9422 --75.9406 --75.9406 --75.9422 --75.9344 --75.9359 --75.9125 --75.9391 --75.9344 --75.9359 --75.9484 --75.9328 --75.9266 --75.9406 --75.9547 --75.9375 --75.9469 --75.9516 --75.9422 --75.9422 --75.9406 --75.9484 --75.9313 --75.9594 --75.9391 --75.9422 --75.9437 --75.9437 --75.9422 --75.95 --75.9406 --75.9391 --75.9437 --75.9422 --75.95 --75.9469 --75.9359 --75.9422 --75.9375 --75.9469 --75.9563 --75.9391 --75.9484 --75.9313 --75.9313 --75.9406 --75.9469 --75.9375 --75.9359 --75.9203 --75.9375 --75.9375 --75.9406 --75.9406 --75.9453 --75.9437 --75.9422 --75.9437 --75.9406 --75.9516 --75.9375 --75.95 --75.9437 --75.9484 --75.9469 --75.9422 --75.9516 --75.9406 --75.9391 --75.9359 --75.95 --75.9422 --75.9375 --75.9453 --75.9328 --75.9359 --75.9359 --75.925 --75.9484 --75.9375 --75.9375 --75.9359 --75.9344 --75.9422 --75.9313 --75.9469 --75.9625 --75.9328 --75.9516 --75.9406 --75.9531 --75.9484 --75.9484 --75.9422 --75.9578 --75.95 --75.9422 --75.9453 --75.95 --75.9344 --75.9484 --75.9359 --75.9406 --75.9344 --75.9375 --75.9281 --75.9563 --75.9516 --75.9406 --75.9484 --75.9406 --75.9422 --75.9437 --75.9484 --75.9484 --75.9406 --75.9453 --75.9484 --75.9453 --75.9469 --75.9469 --75.9422 --75.9437 --75.9344 --75.9594 --75.9281 --75.9391 --75.9531 --75.9406 --75.9422 --75.9422 --75.9453 --75.9359 --75.9406 --75.9563 --75.9203 --75.9406 --75.9437 --75.9266 --75.9344 --75.9406 --75.9453 --75.9344 --75.9297 --75.9469 --75.9531 --75.9484 --75.9484 --75.9391 --75.9547 --75.9453 --75.9359 --75.9516 --75.9437 --75.9297 --75.95 --75.9484 --75.9328 --75.9531 --75.9437 --75.9266 --75.9469 --75.9406 --75.95 --75.9344 --75.9359 --75.9297 --75.9344 --75.9344 --75.9234 --75.9406 --75.9359 --75.9359 --75.9297 --75.9297 --75.9375 --75.9375 --75.9344 --75.9141 --75.9266 --75.9313 --75.9375 --75.9375 --75.9516 --75.9281 --75.9344 --75.9469 --75.9297 --75.9375 --75.9266 --75.9437 --75.9484 --75.9328 --75.9422 --75.9406 --75.9469 --75.9328 --75.9328 --75.9313 --75.9516 --75.95 --75.9437 --75.9437 --75.9531 --75.9531 --75.9453 --75.9594 --75.9422 --75.9281 --75.925 --75.9422 --75.9547 --75.9437 --75.9344 --75.9437 --75.95 --75.9531 --75.9484 --75.9359 --75.9391 --75.9422 --75.9469 --75.9578 --75.9516 --75.9578 --75.9406 --75.9469 --75.9531 --75.9406 --75.9375 --75.9391 --75.9406 --75.9281 --75.9469 --75.9422 --75.9625 --75.9344 --75.9375 --75.9375 --75.9328 --75.9359 --75.9297 --75.9453 --75.9484 --75.95 --75.9422 --75.9375 --75.9406 --75.9422 --75.95 --75.95 --75.9391 --75.9406 --75.9406 --75.9281 --75.9609 --75.9313 --75.9313 --75.9453 --75.9563 --75.9391 --75.9406 --75.9453 --75.9484 --75.9406 --75.9453 --75.9516 --75.95 --75.9391 --75.9391 --75.95 --75.9391 --75.9437 --75.9578 --75.9578 --75.95 --75.9422 --75.9594 --75.95 --75.95 --75.9406 --75.9484 --75.9547 --75.9391 --75.9469 --75.9484 --75.9453 --75.95 --75.9359 --75.9453 --75.9453 --75.9266 --75.9375 --75.9297 --75.9406 --75.9328 --75.9281 --75.9344 --75.9391 --75.9344 --75.9422 --75.9375 --75.9375 --75.9297 --75.9563 --75.9422 --75.9469 --75.9313 --75.9453 --75.9437 --75.9656 --75.9609 --75.95 --75.9578 --75.9391 --75.9484 --75.925 --75.9437 --75.9469 --75.9422 --75.9375 --75.9203 --75.9391 --75.9375 --75.9281 --75.9313 --75.9375 --75.9547 --75.9594 --75.9375 --75.9453 --75.9406 --75.9422 --75.9234 --75.9391 --75.9359 --75.9422 --75.9422 --75.9328 --75.9359 --75.9437 --75.9391 --75.9328 --75.9391 --75.9234 --75.9344 --75.9422 --75.9359 --75.925 --75.9313 --75.9391 --75.925 --75.9313 --75.9375 --75.9422 --75.9453 --75.9422 --75.9406 --75.9516 --75.9484 --75.9359 --75.9484 --75.9375 --75.9281 --75.9437 --75.9219 --75.95 --75.9422 --75.95 --75.9437 --75.9297 --75.9516 --75.9344 --75.9391 --75.9266 --75.9422 --75.9359 --75.9469 --75.9516 --75.9391 --75.95 --75.9359 --75.9469 --75.9469 --75.9516 --75.9359 --75.9344 --75.9469 --75.9406 --75.9391 --75.9422 --75.9375 --75.9406 --75.9547 --75.9406 --75.9359 --75.9531 --75.9328 --75.9391 --75.95 --75.9437 --75.9453 --75.9453 --75.9344 --75.9516 --75.9422 --75.9281 --75.9359 --75.9453 --75.9578 --75.9344 --75.9391 --75.9375 --75.9406 --75.9469 --75.9437 --75.9391 --75.9406 --75.9266 --75.9391 --75.9297 --75.9313 --75.9453 --75.9375 --75.9437 --75.9375 --75.9281 --75.9469 --75.9437 --75.95 --75.9469 --75.9453 --75.9437 --75.9453 --75.9422 --75.9437 --75.9219 --75.9359 --75.9391 --75.9547 --75.9453 --75.9453 --75.9516 --75.9453 --75.9422 --75.9422 --75.9531 --75.9531 --75.9609 --75.9625 --75.9328 --75.9453 --75.9375 --75.9531 --75.9469 --75.9422 --75.9531 --75.9422 --75.9609 --75.9328 --75.9469 --75.9406 --75.9359 --75.95 --75.9547 --75.9453 --75.9359 --75.9297 --75.9422 --75.95 --75.9484 --75.9453 --75.9469 --75.9594 --75.95 --75.9516 --75.9563 --75.9547 --75.9578 --75.9563 --75.9547 --75.95 --75.9656 --75.9531 --75.9516 --75.9563 --75.95 --75.9422 --75.95 --75.9375 --75.9594 --75.9594 --75.9391 --75.95 --75.9484 --75.95 --75.9578 --75.9484 --75.9453 --75.9406 --75.9516 --75.9406 --75.95 --75.95 --75.9453 --75.9547 --75.9469 --75.9594 --75.9516 --75.9563 --75.9547 --75.9516 --75.9469 --75.9469 --75.9547 --75.9484 --75.9516 --75.9469 --75.9547 --75.9328 --75.9328 --75.9406 --75.9484 --75.9578 --75.9531 --75.9547 --75.9594 --75.9469 --75.9437 --75.9359 --75.9437 --75.9391 --75.9359 --75.9328 --75.9313 --75.9375 --75.9375 --75.9359 --75.9437 --75.9234 --75.9484 --75.9422 --75.9297 --75.9375 --75.9219 --75.9469 --75.9375 --75.9391 --75.9469 --75.9391 --75.9266 --75.9344 --75.9406 --75.9281 --75.9391 --75.9453 --75.9406 --75.95 --75.9406 --75.9437 --75.9531 --75.9469 --75.9344 --75.9453 --75.9375 --75.9422 --75.9453 --75.9391 --75.9375 --75.925 --75.9437 --75.9141 --75.9375 --75.9313 --75.9234 --75.9313 --75.9281 --75.9391 --75.9297 --75.9234 --75.9437 --75.9391 --75.9406 --75.9406 --75.9234 --75.9391 --75.9469 --75.9469 --75.9406 --75.9422 --75.9344 --75.9359 --75.95 --75.9437 --75.9437 --75.9516 --75.9484 --75.9375 --75.9484 --75.9469 --75.9422 --75.95 --75.9578 --75.9547 --75.9469 --75.9563 --75.9375 --75.9563 --75.9391 --75.9625 --75.9453 --75.9297 --75.9344 --75.9516 --75.9453 --75.9578 --75.9375 --75.9484 --75.9391 --75.9406 --75.9406 --75.9484 --75.9484 --75.9437 --75.9359 --75.9422 --75.9437 --75.95 --75.9469 --75.9359 --75.9328 --75.9406 --75.9469 --75.9375 --75.9391 --75.9437 --75.9516 --75.9406 --75.9391 --75.9453 --75.95 --75.9531 --75.9484 --75.9391 --75.9484 --75.9578 --75.9328 --75.9406 --75.9359 --75.9313 --75.9531 --75.9453 --75.9516 --75.9297 --75.9375 --75.95 --75.9406 --75.9453 --75.9453 --75.95 --75.9437 --75.9453 --75.95 --75.9453 --75.95 --75.9484 --75.9406 --75.9406 --75.9484 --75.9391 --75.9359 --75.9359 --75.9406 --75.9469 --75.9563 --75.9578 --75.9469 --75.9469 --75.9531 --75.9422 --75.9437 --75.9391 --75.9406 --75.9391 --75.9422 --75.9359 --75.9469 --75.9531 --75.9563 --75.9328 --75.9453 --75.9375 --75.9531 --75.9328 --75.9375 --75.9406 --75.9469 --75.9469 --75.9375 --75.9406 --75.9422 --75.9547 --75.9375 --75.9437 --75.9469 --75.9391 --75.9563 --75.9391 --75.9531 --75.9437 --75.9469 --75.9391 --75.9453 --75.9609 --75.9609 --75.9594 --75.95 --75.9359 --75.9406 --75.9469 --75.9484 --75.9484 --75.9406 --75.9453 --75.9516 --75.9453 --75.9469 --75.9469 --75.9578 --75.9625 --75.9469 --75.9672 --75.9656 --75.9609 --75.9594 --75.9437 --75.9641 --75.9469 --75.9484 --75.9531 --75.9469 --75.9719 --75.9609 --75.9578 --75.95 --75.9609 --75.9531 --75.9437 --75.9563 --75.975 --75.9563 --75.9578 --75.9594 --75.9625 --75.9531 --75.9688 --75.9641 --75.9656 --75.9594 --75.9641 --75.9563 --75.9688 --75.9563 --75.975 --75.9625 --75.9531 --75.9516 --75.9672 --75.9781 --75.9563 --75.9422 --75.9547 --75.9719 --75.9656 --75.95 --75.9547 --75.9656 --75.9641 --75.9563 --75.9656 --75.9641 --75.9563 --75.9531 --75.975 --75.9594 --75.9688 --75.95 --75.9641 --75.9609 --75.9437 --75.9703 --75.95 --75.9641 --75.9547 --75.9469 --75.9406 --75.9641 --75.9563 --75.9516 --75.9578 --75.9531 --75.9531 --75.9406 --75.95 --75.9641 --75.9437 --75.9547 --75.9672 --75.9672 --75.9688 --75.9688 --75.9656 --75.9594 --75.9703 --75.9609 --75.9594 --75.9578 --75.9609 --75.9531 --75.9703 --75.9672 --75.9641 --75.9578 --75.9609 --75.9641 --75.9547 --75.9609 --75.9563 --75.9719 --75.9609 --75.9625 --75.9688 --75.9656 --75.9672 --75.9641 --75.9672 --75.9531 --75.9703 --75.9563 --75.9594 --75.9688 --75.9563 --75.9609 --75.9609 --75.9703 --75.9391 --75.9563 --75.9484 --75.9437 --75.9594 --75.9703 --75.9516 --75.9609 --75.9656 --75.9563 --75.9531 --75.9563 --75.9625 --75.9688 --75.9797 --75.9563 --75.9641 --75.9547 --75.9656 --75.9531 --75.9656 --75.95 --75.9531 --75.9656 --75.9656 --75.9563 --75.9547 --75.9641 --75.9594 --75.9656 --75.9594 --75.9609 --75.9688 --75.9703 --75.9531 --75.9391 --75.9563 --75.9703 --75.9594 --75.9734 --75.9641 --75.9688 --75.9672 --75.9734 --75.9766 --75.9703 --75.9578 --75.9609 --75.9594 --75.9688 --75.9609 --75.9625 --75.9531 --75.9547 --75.9656 --75.9734 --75.9797 --75.9688 --75.9688 --75.9563 --75.9766 --75.9656 --75.9453 --75.9672 --75.9641 --75.9672 --75.9656 --75.9656 --75.9594 --75.9719 --75.9734 --75.9656 --75.9703 --75.9719 --75.9516 --75.9531 --75.9563 --75.9563 --75.9672 --75.9484 --75.9688 --75.9641 --75.9516 --75.9422 --75.9547 --75.9594 --75.95 --75.9609 --75.9359 --75.9531 --75.9453 --75.9547 --75.95 --75.9578 --75.9516 --75.9547 --75.9547 --75.9484 --75.9641 --75.9578 --75.9547 --75.9516 --75.9531 --75.9641 --75.9609 --75.9375 --75.9547 --75.9469 --75.9672 --75.9484 --75.9547 --75.9422 --75.9375 --75.9437 --75.9563 --75.9594 --75.9469 --75.9406 --75.9563 --75.9437 --75.9641 --75.9672 --75.9656 --75.9625 --75.9719 --75.9453 --75.9578 --75.9469 --75.9563 --75.9469 --75.9484 --75.9547 --75.9453 --75.9594 --75.9469 --75.9437 --75.9625 --75.9359 --75.9516 --75.9594 --75.9484 --75.95 --75.9547 --75.95 --75.9641 --75.9594 --75.9516 --75.9469 --75.9484 --75.9547 --75.9469 --75.9563 --75.9625 --75.9391 --75.9547 --75.95 --75.9437 --75.9453 --75.9375 --75.9563 --75.9563 --75.9547 --75.9563 --75.9594 --75.95 --75.9656 --75.9547 --75.9609 --75.9578 --75.9672 --75.9516 --75.9609 --75.9547 --75.9547 --75.9656 --75.9625 --75.9578 --75.9563 --75.9609 --75.9688 --75.9625 --75.9641 --75.9563 --75.9437 --75.9563 --75.9625 --75.9672 --75.9578 --75.9609 --75.9656 --75.9609 --75.9516 --75.9609 --75.9656 --75.9609 --75.9734 --75.9641 --75.9688 --75.9563 --75.9531 --75.9594 --75.9609 --75.9437 --75.9688 --75.9609 --75.9563 --75.9563 --75.9391 --75.9656 --75.9484 --75.9531 --75.9594 --75.9531 --75.9734 --75.9594 --75.9531 --75.9531 --75.9594 --75.9578 --75.9594 --75.9609 --75.9531 --75.9625 --75.9594 --75.9609 --75.9594 --75.9516 --75.9672 --75.9437 --75.9609 --75.95 --75.9484 --75.9594 --75.9672 --75.9625 --75.9516 --75.9594 --75.9594 --75.9359 --75.9625 --75.9547 --75.95 --75.9609 --75.9516 --75.9578 --75.9484 --75.9578 --75.9422 --75.9594 --75.9406 --75.9391 --75.9453 --75.95 --75.9531 --75.9609 --75.9641 --75.9344 --75.9531 --75.9625 --75.9594 --75.9531 --75.9531 --75.9578 --75.9578 --75.9641 --75.9484 --75.9516 --75.9609 --75.9516 --75.9672 --75.9703 --75.9547 --75.9625 --75.9547 --75.9594 --75.9453 --75.9422 --75.9641 --75.9625 --75.9609 --75.9594 --75.9625 --75.975 --75.9609 --75.9688 --75.9531 --75.9656 --75.9453 --75.9719 --75.95 --75.9547 --75.9563 --75.9625 --75.9563 --75.95 --75.9563 --75.9484 --75.9375 --75.9656 --75.9563 --75.9609 --75.9609 --75.9531 --75.9547 --75.9703 --75.9547 --75.9531 --75.9391 --75.9563 --75.9469 --75.9484 --75.9656 --75.9578 --75.9594 --75.9563 --75.9609 --75.9609 --75.9625 --75.9531 --75.9656 --75.9625 --75.9609 --75.9609 --75.9656 --75.95 --75.9641 --75.9547 --75.9547 --75.9688 --75.975 --75.9609 --75.9609 --75.9516 --75.9563 --75.9609 --75.9656 --75.9609 --75.9578 --75.9641 --75.9734 --75.9656 --75.95 --75.9641 --75.9516 --75.9625 --75.9437 --75.9578 --75.9734 --75.9625 --75.9656 --75.9656 --75.9625 --75.9672 --75.9703 --75.9672 --75.975 --75.95 --75.9641 --75.9625 --75.9516 --75.9688 --75.9563 --75.9656 --75.9453 --75.9547 --75.9609 --75.9625 --75.9656 --75.9703 --75.9656 --75.9766 --75.9703 --75.9563 --75.9719 --75.9469 --75.9641 --75.9641 --75.9719 --75.9594 --75.9609 --75.9656 --75.9547 --75.9516 --75.9609 --75.9578 --75.9656 --75.9547 --75.9547 --75.95 --75.9594 --75.9672 --75.9484 --75.9578 --75.9625 --75.9719 --75.9563 --75.9516 --75.9531 --75.9578 --75.9688 --75.9391 --75.9437 --75.9563 --75.9594 --75.9484 --75.9531 --75.9375 --75.9547 --75.9469 --75.9656 --75.9516 --75.9594 --75.9516 --75.9484 --75.95 --75.9422 --75.9516 --75.9578 --75.9516 --75.9719 --75.9625 --75.9609 --75.9656 --75.9672 --75.9609 --75.9641 --75.9563 --75.9672 --75.9484 --75.9688 --75.9484 --75.95 --75.9516 --75.9453 --75.9516 --75.9531 --75.9625 --75.9516 --75.9563 --75.9625 --75.9531 --75.9578 --75.9563 --75.9547 --75.9437 --75.95 --75.95 --75.9609 --75.95 --75.9547 --75.9609 --75.9547 --75.9516 --75.9516 --75.9594 --75.9453 --75.9437 --75.9578 --75.9516 --75.9547 --75.9578 --75.9656 --75.9688 --75.9484 --75.9469 --75.9531 --75.9625 --75.9641 --75.9688 --75.9531 --75.9563 --75.9656 --75.9594 --75.9531 --75.9547 --75.9594 --75.9594 --75.9594 --75.975 --75.9547 --75.9547 --75.9688 --75.9594 --75.9719 --75.9609 --75.9672 --75.9609 --75.9656 --75.9531 --75.9734 --75.9703 --75.9594 --75.9469 --75.9563 --75.9484 --75.9484 --75.9641 --75.9625 --75.95 --75.9672 --75.9469 --75.9516 --75.9531 --75.9578 --75.9563 --75.9578 --75.9594 --75.95 --75.9594 --75.9688 --75.9578 --75.9672 --75.9516 --75.9531 --75.9578 --75.9641 --75.975 --75.9641 --75.9656 --75.9578 --75.9641 --75.9641 --75.9594 --75.9609 --75.9766 --75.9578 --75.9531 --75.9812 --75.9578 --75.975 --75.9703 --75.9703 --75.9609 --75.9625 --75.9609 --75.9547 --75.9781 --75.9688 --75.9688 --75.9703 --75.9734 --75.9719 --75.9781 --75.9609 --75.9688 --75.9688 --75.9547 --75.9609 --75.9563 --75.9703 --75.9672 --75.9547 --75.9828 --75.9594 --75.9625 --75.9672 --75.9531 --75.9531 --75.9734 --75.9578 --75.9594 --75.9563 --75.9609 --75.9656 --75.9453 --75.9641 --75.9719 --75.9578 --75.9719 --75.9641 --75.9641 --75.9688 --75.9641 --75.9703 --75.9703 --75.9625 --75.9656 --75.9938 --75.9609 --75.9609 --75.9766 --75.9719 --75.9688 --75.9641 --75.9859 --75.9734 --75.9719 --75.9719 --75.9719 --75.9594 --75.9781 --75.9812 --75.9766 --75.975 --75.9719 --75.9656 --75.9656 --75.975 --75.975 --75.9719 --75.9797 --75.9734 --75.9672 --75.9672 --75.9812 --75.9812 --75.9891 --75.9844 --75.9719 --75.9656 --75.9891 --75.9719 --75.975 --75.9672 --75.9672 --75.9719 --75.9609 --75.9875 --75.9859 --75.975 --75.9672 --75.9734 --75.9703 --75.9766 --75.9672 --75.9594 --75.9625 --75.9719 --75.9688 --75.9563 --75.9828 --75.9609 --75.9703 --75.9609 --75.9688 --75.9656 --75.9781 --75.9625 --75.9828 --75.9609 --75.9734 --75.9734 --75.9766 --75.9703 --75.9766 --75.9688 --75.9766 --75.9766 --75.9812 --75.9766 --75.9781 --75.9688 --75.9625 --75.9625 --75.9719 --75.9625 --75.9734 --75.9719 --75.9719 --75.975 --75.9734 --75.9672 --75.9594 --75.9563 --75.9625 --75.9828 --75.9563 --75.9609 --75.9672 --75.9563 --75.9688 --75.9656 --75.9797 --75.9672 --75.9641 --75.9766 --75.9484 --75.9656 --75.9688 --75.9828 --75.9672 --75.9719 --75.9656 --75.9891 --75.9688 --75.9656 --75.9719 --75.9594 --75.9656 --75.9703 --75.9578 --75.9719 --75.9688 --75.9641 --75.9672 --75.9656 --75.9563 --75.9719 --75.9625 --75.9656 --75.9625 --75.9656 --75.9656 --75.9641 --75.9859 --75.9672 --75.9703 --75.9781 --75.9719 --75.9688 --75.9781 --75.9734 --75.9734 --75.9812 --75.9688 --75.9516 --75.9672 --75.9672 --75.9688 --75.9766 --75.9578 --75.9703 --75.9594 --75.9625 --75.975 --75.9734 --75.9844 --75.975 --75.975 --75.9703 --75.9844 --75.9672 --75.9672 --75.9625 --75.975 --75.9781 --75.9734 --75.975 --75.9781 --75.9797 --75.9703 --75.9688 --75.9734 --75.9703 --75.9797 --75.9734 --75.9594 --75.9797 --75.9797 --75.9531 --75.975 --75.9766 --75.9734 --75.9609 --75.9703 --75.9703 --75.9609 --75.9844 --75.9609 --75.9625 --75.9641 --75.9563 --75.9641 --75.9656 --75.9594 --75.95 --75.9656 --75.9734 --75.9688 --75.9594 --75.9625 --75.9641 --75.9641 --75.9656 --75.9719 --75.9609 --75.9609 --75.9688 --75.9734 --75.9625 --75.9641 --75.9641 --75.9609 --75.9609 --75.9563 --75.9625 --75.9531 --75.9516 --75.9563 --75.9625 --75.9547 --75.9563 --75.9484 --75.9594 --75.9547 --75.9625 --75.9641 --75.9469 --75.9656 --75.95 --75.9641 --75.9766 --75.9734 --75.9672 --75.975 --75.9547 --75.9563 --75.9547 --75.9609 --75.9625 --75.9672 --75.9578 --75.9484 --75.9547 --75.9625 --75.9578 --75.9625 --75.9688 --75.9625 --75.9609 --75.9672 --75.9609 --75.9688 --75.9625 --75.9594 --75.9703 --75.9734 --75.9609 --75.9719 --75.9578 --75.9703 --75.9703 --75.9625 --75.9641 --75.9703 --75.9625 --75.9641 --75.9656 --75.9703 --75.9703 --75.9641 --75.9672 --75.9609 --75.9578 --75.9641 --75.9594 --75.9703 --75.9625 --75.9672 --75.9766 --75.9578 --75.9609 --75.9594 --75.9656 --75.9828 --75.9531 --75.9641 --75.9563 --75.95 --75.9641 --75.9703 --75.975 --75.9625 --75.9563 --75.9734 --75.975 --75.9672 --75.9703 --75.9594 --75.9609 --75.9563 --75.9594 --75.9578 --75.9578 --75.9594 --75.9594 --75.9563 --75.9547 --75.9703 --75.9656 --75.9547 --75.9688 --75.9641 --75.9688 --75.9563 --75.9703 --75.9641 --75.9594 --75.9594 --75.9672 --75.9703 --75.9688 --75.9563 --75.9563 --75.9516 --75.9625 --75.9422 --75.9516 --75.9547 --75.9609 --75.9578 --75.9578 --75.9656 --75.9734 --75.9703 --75.9719 --75.9719 --75.9625 --75.9469 --75.9594 --75.9516 --75.975 --75.9641 --75.9516 --75.9734 --75.9688 --75.975 --75.9688 --75.9609 --75.9719 --75.9641 --75.9625 --75.9734 --75.9594 --75.9641 --75.9656 --75.9625 --75.9563 --75.9484 --75.9641 --75.9641 --75.9688 --75.9734 --75.975 --75.9609 --75.9656 --75.9656 --75.9547 --75.9516 --75.9578 --75.9641 --75.9688 --75.9672 --75.9656 --75.9734 --75.9688 --75.9656 --75.9672 --75.9578 --75.9656 --75.9484 --75.9609 --75.9578 --75.9641 --75.9656 --75.9672 --75.9469 --75.9672 --75.9563 --75.9609 --75.9656 --75.9625 --75.9641 --75.9703 --75.9578 --75.9734 --75.9656 --75.9766 --75.9656 --75.9672 --75.975 --75.9594 --75.9547 --75.9516 --75.9734 --75.9688 --75.9563 --75.95 --75.9609 --75.9641 --75.9594 --75.9688 --75.9594 --75.9437 --75.9547 --75.9781 --75.9563 --75.9484 --75.9594 --75.9609 --75.9578 --75.9594 --75.9563 --75.9656 --75.9578 --75.9531 --75.9516 --75.9578 --75.9641 --75.9625 --75.9609 --75.9719 --75.9719 --75.9641 --75.9703 --75.9641 --75.9516 --75.9672 --75.9672 --75.9656 --75.9625 --75.9734 --75.9672 --75.9609 --75.9703 --75.9625 --75.9719 --75.9812 --75.9641 --75.9672 --75.9656 --75.9812 --75.9703 --75.9703 --75.9766 --75.9609 --75.9781 --75.9734 --75.975 --75.9688 --75.9766 --75.9672 --75.9766 --75.9703 --75.9734 --75.9625 --75.9688 --75.9625 --75.9672 --75.9703 --75.9563 --75.9656 --75.9563 --75.9672 --75.9781 --75.9703 --75.9625 --75.9734 --75.9625 --75.9594 --75.9672 --75.9563 --75.9688 --75.9766 --75.9672 --75.9781 --75.9781 --75.9781 --75.9797 --75.9688 --75.9688 --75.9719 --75.9766 --75.9734 --75.9641 --75.9656 --75.9656 --75.9797 --75.9594 --75.9688 --75.9625 --75.9766 --75.9688 --75.9734 --75.9656 --75.9688 --75.9688 --75.9766 --75.9672 --75.9797 --75.9703 --75.9797 --75.9547 --75.9719 --75.9672 --75.9812 --75.9688 --75.9797 --75.9703 --75.9703 --75.9891 --75.9812 --75.9484 --75.9578 --75.9734 --75.9688 --75.9547 --75.9688 --75.975 --75.9656 --75.9594 --75.975 --75.9656 --75.9625 --75.9688 --75.9703 --75.9703 --75.9766 --75.9703 --75.9656 --75.9656 --75.9875 --75.9578 --75.9641 --75.9781 --75.9672 --75.9828 --75.9703 --75.9547 --75.9578 --75.9578 --75.9594 --75.9625 --75.9594 --75.9703 --75.9609 --75.9516 --75.9625 --75.9547 --75.9453 --75.9578 --75.9609 --75.9641 --75.9781 --75.9672 --75.9672 --75.9719 --75.9547 --75.9688 --75.9625 --75.9703 --75.9609 --75.9625 --75.9625 --75.9688 --75.9641 --75.9641 --75.9719 --75.9578 --75.9578 --75.9672 --75.9703 --75.9625 --75.9719 --75.9672 --75.9719 --75.9625 --75.9656 --75.9625 --75.9563 --75.9656 --75.9703 --75.9625 --75.9688 --75.9688 --75.9563 --75.9578 --75.9453 --75.9688 --75.9609 --75.9734 --75.9656 --75.9547 --75.9422 --75.9578 --75.9531 --75.9437 --75.9656 --75.9547 --75.9547 --75.9563 --75.9547 --75.9453 --75.9672 --75.9609 --75.9672 --75.9563 --75.975 --75.9578 --75.9719 --75.9656 --75.9594 --75.9672 --75.9563 --75.9719 --75.9625 --75.9656 --75.9656 --75.9516 --75.9625 --75.9641 --75.9563 --75.9703 --75.9609 --75.9547 --75.9563 --75.9563 --75.9656 --75.95 --75.9547 --75.9391 --75.9578 --75.9641 --75.9453 --75.9703 --75.9734 --75.9516 --75.95 --75.9594 --75.9594 --75.9578 --75.9578 --75.9609 --75.9641 --75.9625 --75.9625 --75.9531 --75.9703 --75.9703 --75.9688 --75.9734 --75.9703 --75.9656 --75.975 --75.9703 --75.9641 --75.9719 --75.9578 --75.9531 --75.9656 --75.9594 --75.9641 --75.9609 --75.9641 --75.9719 --75.975 --75.9578 --75.9672 --75.9594 --75.9656 --75.9547 --75.9531 --75.9563 --75.9719 --75.9688 --75.9625 --75.9719 --75.9688 --75.9625 --75.9609 --75.9734 --75.9781 --75.9797 --75.9641 --75.9797 --75.9734 --75.9703 --75.9609 --75.9719 --75.9766 --75.9703 --75.975 --75.9703 --75.9609 --75.9672 --75.9719 --75.9625 --75.9703 --75.9641 --75.9797 --75.9719 --75.9734 --75.9656 --75.9703 --75.9672 --75.9672 --75.9641 --75.9734 --75.9609 --75.9719 --75.9672 --75.9656 --75.9625 --75.9609 --75.975 --75.9656 --75.9625 --75.9625 --75.9672 --75.9656 --75.9609 --75.9797 --75.9609 --75.9672 --75.9609 --75.9609 --75.9703 --75.9594 --75.9859 --75.9625 --75.9781 --75.9688 --75.9688 --75.9688 --75.9578 --75.9625 --75.9578 --75.9688 --75.9609 --75.9531 --75.9641 --75.9531 --75.9625 --75.9672 --75.9563 --75.9656 --75.9609 --75.9578 --75.975 --75.9641 --75.9578 --75.9547 --75.9563 --75.9484 --75.9578 --75.9578 --75.9547 --75.9516 --75.9625 --75.9688 --75.9531 --75.9672 --75.9578 --75.9703 --75.9516 --75.9625 --75.9594 --75.9516 --75.9625 --75.9563 --75.9563 --75.9641 --75.9578 --75.9469 --75.9609 --75.9469 --75.9547 --75.9578 --75.9484 --75.9547 --75.9609 --75.9547 --75.9609 --75.9594 --75.9703 --75.9625 --75.9703 --75.9609 --75.9797 --75.9547 --75.9641 --75.95 --75.9656 --75.9609 --75.9672 --75.9797 --75.9672 --75.9625 --75.9672 --75.9609 --75.9578 --75.9641 --75.9469 --75.9672 --75.9641 --75.9547 --75.9469 --75.9594 --75.975 --75.9703 --75.9547 --75.975 --75.9688 --75.9641 --75.9625 --75.9594 --75.9609 --75.9531 --75.9672 --75.9609 --75.9484 --75.9547 --75.9625 --75.9594 --75.9641 --75.9547 --75.9531 --75.9547 --75.9516 --75.9594 --75.9641 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9656 --75.9625 --75.9563 --75.9609 --75.9672 --75.9578 --75.9625 --75.9703 --75.9766 --75.9703 --75.9547 --75.9594 --75.9688 --75.9641 --75.95 --75.9766 --75.9609 --75.95 --75.9641 --75.9578 --75.9516 --75.9547 --75.9609 --75.9734 --75.9734 --75.95 --75.9609 --75.9656 --75.9672 --75.9703 --75.9703 --75.9609 --75.9641 --75.9844 --75.9594 --75.9797 --75.9734 --75.9766 --75.9734 --75.9656 --75.9719 --75.9844 --75.9656 --75.9891 --75.9859 --75.9781 --75.975 --75.9734 --75.9812 --75.9844 --75.9797 --75.9922 --75.9844 --75.9891 --75.975 --75.975 --75.9797 --75.9812 --75.9688 --75.9703 --75.9656 --75.9812 --75.9703 --75.9719 --75.9781 --75.975 --75.9844 --75.9641 --75.9688 --75.9641 --75.9547 --75.9578 --75.9688 --75.9703 --75.9703 --75.9531 --75.9688 --75.9703 --75.975 --75.9688 --75.9766 --75.9625 --75.9781 --75.9703 --75.9734 --75.9609 --75.9641 --75.9578 --75.975 --75.9719 --75.9578 --75.9719 --75.9797 --75.9656 --75.975 --75.9703 --75.9828 --75.9625 --75.9578 --75.9625 --75.9547 --75.9719 --75.9688 --75.9516 --75.9609 --75.9641 --75.9734 --75.9594 --75.9688 --75.9703 --75.9703 --75.975 --75.9828 --75.9719 --75.9609 --75.9688 --75.9672 --75.975 --75.9609 --75.9641 --75.9703 --75.9625 --75.9531 --75.9703 --75.9641 --75.9656 --75.9609 --75.9766 --75.9484 --75.9672 --75.9625 --75.9781 --75.9781 --75.9641 --75.9656 --75.975 --75.9797 --75.9688 --75.9781 --75.9656 --75.9703 --75.9578 --75.9797 --75.9625 --75.9672 --75.9594 --75.9641 --75.9703 --75.9656 --75.9719 --75.9656 --75.9781 --75.9656 --75.9734 --75.9672 --75.9594 --75.9609 --75.9781 --75.9672 --75.9797 --75.9578 --75.9828 --75.9594 --75.9672 --75.9766 --75.9688 --75.9734 --75.9688 --75.9719 --75.9625 --75.9703 --75.9641 --75.975 --75.9656 --75.9656 --75.9609 --75.9672 --75.9688 --75.9609 --75.9719 --75.9625 --75.9609 --75.9406 --75.9719 --75.9703 --75.9672 --75.9719 --75.9734 --75.9766 --75.9563 --75.9563 --75.9688 --75.9797 --75.9641 --75.9578 --75.9672 --75.9578 --75.9578 --75.9609 --75.9531 --75.9641 --75.9609 --75.9594 --75.9672 --75.9625 --75.9578 --75.9578 --75.9688 --75.9594 --75.9531 --75.9719 --75.9625 --75.9594 --75.9594 --75.9828 --75.9656 --75.9688 --75.9703 --75.9688 --75.9625 --75.9672 --75.9594 --75.9578 --75.9578 --75.9672 --75.9641 --75.9656 --75.9578 --75.9703 --75.9672 --75.9641 --75.9609 --75.95 --75.9656 --75.9594 --75.9594 --75.9656 --75.9594 --75.9719 --75.9656 --75.9703 --75.9641 --75.9781 --75.9625 --75.9797 --75.9703 --75.9641 --75.9734 --75.9781 --75.9625 --75.9672 --75.9734 --75.9734 --75.9625 --75.9688 --75.9688 --75.9703 --75.9625 --75.975 --75.9688 --75.9672 --75.9656 --75.9719 --75.9641 --75.9703 --75.9828 --75.9797 --75.9891 --75.9688 --75.9656 --75.9703 --75.9703 --75.975 --75.9859 --75.9766 --75.9688 --75.9672 --75.9672 --75.9844 --75.9828 --75.9703 --75.9703 --75.9719 --75.9812 --75.9766 --75.9625 --75.9828 --75.9812 --75.9578 --75.9688 --75.9797 --75.9656 --75.9891 --75.9703 --75.9719 --75.9781 --75.9781 --75.9719 --75.975 --75.9688 --75.9641 --75.9656 --75.9672 --75.9766 --75.95 --75.9641 --75.9484 --75.9594 --75.9609 --75.9578 --75.9625 --75.9672 --75.9563 --75.95 --75.9656 --75.9672 --75.9609 --75.9516 --75.9719 --75.9625 --75.9672 --75.9641 --75.9734 --75.9656 --75.9719 --75.9578 --75.9688 --75.9719 --75.9625 --75.975 --75.9656 --75.9594 --75.9688 --75.9594 --75.9672 --75.9734 --75.9688 --75.9766 --75.9578 --75.975 --75.9609 --75.9719 --75.95 --75.9609 --75.9703 --75.975 --75.9656 --75.9578 --75.9688 --75.9625 --75.9641 --75.9672 --75.9453 --75.9609 --75.9531 --75.9609 --75.9578 --75.9625 --75.9641 --75.9688 --75.9578 --75.9609 --75.9531 --75.9563 --75.9734 --75.9672 --75.9578 --75.9625 --75.9641 --75.9641 --75.9844 --75.9828 --75.9781 --75.9688 --75.9766 --75.9797 --75.9766 --75.9625 --75.9672 --75.9734 --75.9734 --75.9672 --75.9781 --75.9656 --75.9703 --75.9672 --75.9688 --75.9563 --75.9609 --75.9656 --75.9688 --75.9656 --75.9578 --75.9641 --75.9563 --75.9531 --75.9531 --75.9547 --75.975 --75.95 --75.95 --75.9578 --75.9672 --75.9609 --75.9578 --75.9516 --75.9563 --75.9656 --75.9563 --75.9719 --75.9516 --75.9531 --75.9469 --75.9594 --75.9563 --75.9594 --75.9531 --75.9391 --75.975 --75.9547 --75.9719 --75.9516 --75.9625 --75.9641 --75.9625 --75.9547 --75.9547 --75.9563 --75.9594 --75.975 --75.9531 --75.9625 --75.9625 --75.9703 --75.9734 --75.9641 --75.9688 --75.9625 --75.9625 --75.9594 --75.9594 --75.9625 --75.9531 --75.9437 --75.9625 --75.9563 --75.9594 --75.9531 --75.9578 --75.9563 --75.9453 --75.9609 --75.9453 --75.9516 --75.9563 --75.9672 --75.9594 --75.9688 --75.9594 --75.9625 --75.9734 --75.9672 --75.9656 --75.9656 --75.9703 --75.9625 --75.9516 --75.9609 --75.9594 --75.9594 --75.9688 --75.9437 --75.9563 --75.9484 --75.9563 --75.9609 --75.9594 --75.9484 --75.9625 --75.9484 --75.9531 --75.9578 --75.9625 --75.9547 --75.9656 --75.9516 --75.9641 --75.9578 --75.9484 --75.9703 --75.9703 --75.9516 --75.9625 --75.9609 --75.9563 --75.9656 --75.9703 --75.9625 --75.9625 --75.9703 --75.9609 --75.9625 --75.9609 --75.9656 --75.9672 --75.9719 --75.9594 --75.9688 --75.9625 --75.9531 --75.9734 --75.975 --75.9547 --75.9703 --75.9672 --75.9672 --75.9656 --75.9547 --75.9516 --75.9578 --75.9531 --75.9516 --75.9469 --75.9656 --75.9578 --75.9641 --75.9563 --75.9703 --75.9625 --75.9688 --75.9672 --75.9656 --75.9484 --75.9672 --75.9563 --75.9656 --75.9703 --75.9656 --75.9625 --75.9625 --75.9625 --75.9547 --75.9547 --75.9578 --75.9547 --75.9484 --75.9688 --75.9547 --75.9453 --75.9578 --75.9703 --75.9609 --75.9828 --75.9578 --75.9625 --75.9703 --75.9547 --75.9484 --75.9672 --75.9563 --75.9594 --75.9609 --75.9422 --75.9656 --75.95 --75.9625 --75.9594 --75.9578 --75.9563 --75.9469 --75.9734 --75.9625 --75.9703 --75.9594 --75.9578 --75.9719 --75.9719 --75.9781 --75.9672 --75.9781 --75.9656 --75.9703 --75.9688 --75.9672 --75.9688 --75.9703 --75.9625 --75.9812 --75.975 --75.9844 --75.9703 --75.9734 --75.9563 --75.9688 --75.9797 --75.9656 --75.9641 --75.9563 --75.9625 --75.9734 --75.9641 --75.9563 --75.9484 --75.9578 --75.9672 --75.9734 --75.9625 --75.9703 --75.9719 --75.9641 --75.9703 --75.9766 --75.9781 --75.9859 --75.975 --75.9797 --75.975 --75.975 --75.9812 --75.9844 --75.9719 --75.9891 --75.9719 --75.9828 --75.9719 --75.9719 --75.9688 --75.9812 --75.9797 --75.9734 --75.9844 --75.9688 --75.9594 --75.9891 --75.9641 --75.9781 --75.9812 --75.9578 --75.9781 --75.9766 --75.9688 --75.9828 --75.9766 --75.9797 --75.9844 --75.9734 --75.9828 --75.9734 --75.9891 --75.9625 --75.9875 --75.9734 --75.9891 --75.9812 --75.9828 --75.9812 --75.9672 --75.9797 --75.9781 --75.9812 --75.975 --75.9828 --75.975 --75.9734 --75.9625 --75.9719 --75.9734 --75.975 --75.9703 --75.9875 --75.9828 --75.9844 --75.9797 --75.9812 --75.9797 --75.9812 --75.9891 --75.9859 --75.9812 --75.9766 --75.9875 --75.9859 --75.9672 --75.9953 --75.9656 --75.9844 --75.9828 --75.9797 --75.9906 --75.9797 --75.9797 --75.9719 --75.9891 --75.9844 --75.9859 --75.9844 --75.9625 --75.9766 --75.9594 --75.9625 --75.9609 --75.9672 --75.9688 --75.9719 --75.9812 --75.9656 --75.9781 --75.9781 --75.9859 --75.9734 --75.9719 --75.975 --75.9719 --75.9656 --75.9719 --75.9891 --75.9719 --75.9625 --75.9688 --75.9797 --75.9719 --75.975 --75.9719 --75.9703 --75.9766 --75.9609 --75.9672 --75.9688 --75.9672 --75.9766 --75.9891 --75.9641 --75.9703 --75.9641 --75.9734 --75.9672 --75.9688 --75.9766 --75.9656 --75.9781 --75.9672 --75.9703 --75.9641 --75.9609 --75.9734 --75.9469 --75.9547 --75.9656 --75.9703 --75.9688 --75.9609 --75.9656 --75.9625 --75.975 --75.9563 --75.9578 --75.9484 --75.9719 --75.9734 --75.9688 --75.9531 --75.9766 --75.975 --75.9594 --75.9594 --75.9625 --75.9641 --75.9547 --75.9688 --75.9531 --75.9563 --75.9609 --75.9688 --75.9609 --75.9625 --75.9656 --75.9656 --75.9578 --75.9547 --75.9734 --75.9656 --75.9578 --75.9641 --75.9656 --75.9625 --75.9688 --75.9625 --75.9469 --75.9516 --75.9531 --75.9563 --75.9563 --75.9641 --75.9703 --75.9688 --75.9594 --75.9594 --75.9641 --75.9703 --75.9609 --75.9672 --75.9563 --75.9609 --75.9688 --75.9656 --75.9656 --75.9609 --75.9688 --75.9734 --75.9672 --75.9578 --75.9734 --75.9656 --75.9563 --75.9609 --75.9578 --75.9641 --75.9672 --75.9734 --75.9672 --75.9734 --75.9641 --75.9797 --75.9594 --75.9688 --75.9875 --75.9656 --75.9719 --75.9766 --75.9578 --75.9859 --75.9719 --75.9734 --75.9578 --75.9734 --75.9641 --75.975 --75.9766 --75.9688 --75.9578 --75.9563 --75.9625 --75.9594 --75.9609 --75.9531 --75.9594 --75.9641 --75.9531 --75.9672 --75.9672 --75.9625 --75.9688 --75.9734 --75.9516 --75.9625 --75.975 --75.9703 --75.9641 --75.9484 --75.9688 --75.9688 --75.9594 --75.9641 --75.9516 --75.9656 --75.9625 --75.9641 --75.9688 --75.9734 --75.9844 --75.9656 --75.9641 --75.9703 --75.9594 --75.9734 --75.9812 --75.9641 --75.9797 --75.9625 --75.9812 --75.9625 --75.9781 --75.9594 --75.9641 --75.9688 --75.9563 --75.9641 --75.9656 --75.9766 --75.9672 --75.9703 --75.9672 --75.9625 --75.9672 --75.975 --75.9688 --75.9828 --75.9703 --75.9828 --75.9594 --75.9812 --75.9766 --75.9812 --75.9828 --75.9656 --75.9578 --75.9688 --75.9656 --75.9688 --75.9734 --75.9812 --75.9734 --75.9672 --75.9734 --75.9672 --75.9688 --75.9766 --75.9734 --75.9656 --75.9703 --75.9672 --75.9625 --75.9547 --75.9688 --75.9672 --75.975 --75.9703 --75.9656 --75.9828 --75.9703 --75.9719 --75.9719 --75.9641 --75.9766 --75.9672 --75.9719 --75.9719 --75.9656 --75.9672 --75.9578 --75.9703 --75.9828 --75.9703 --75.9672 --75.9781 --75.9656 --75.9703 --75.9656 --75.9641 --75.9781 --75.9688 --75.9828 --75.9719 --75.9688 --75.9734 --75.975 --75.9844 --75.9656 --75.9906 --75.9766 --75.9766 --75.9719 --75.9859 --75.9641 --75.9828 --75.9797 --75.9797 --75.9703 --75.9688 --75.9812 --75.9844 --75.975 --75.9656 --75.9672 --75.9703 --75.9688 --75.9734 --75.9828 --75.9641 --75.9781 --75.9672 --75.9625 --75.9781 --75.9688 --75.9594 --75.9719 --75.9766 --75.9703 --75.9656 --75.975 --75.9719 --75.9609 --75.9641 --75.9812 --75.9719 --75.9672 --75.975 --75.9875 --75.975 --75.9797 --75.9734 --75.9891 --75.9781 --75.9828 --75.9859 --75.9828 --75.9781 --75.9719 --75.9781 --75.9781 --75.9766 --75.9672 --75.9672 --75.9656 --75.9672 --75.9672 --75.9688 --75.9719 --75.9688 --75.9719 --75.9703 --75.9641 --75.9641 --75.9672 --75.975 --75.9641 --75.9734 --75.9797 --75.9672 --75.975 --75.975 --75.9688 --75.9703 --75.9859 --75.9563 --75.9625 --75.9719 --75.9812 --75.9734 --75.9578 --75.9781 --75.9703 --75.9734 --75.9734 --75.9844 --75.9688 --75.9781 --75.9734 --75.9703 --75.9734 --75.9766 --75.9766 --75.975 --75.9844 --75.9734 --75.9719 --75.9688 --75.9734 --75.9797 --75.9672 --75.9625 --75.9625 --75.9625 --75.9672 --75.975 --75.9625 --75.9656 --75.9516 --75.9688 --75.9781 --75.9578 --75.9719 --75.9641 --75.9766 --75.9766 --75.9781 --75.9781 --75.9672 --75.9625 --75.9641 --75.9656 --75.9594 --75.9578 --75.9734 --75.9703 --75.9656 --75.9609 --75.9656 --75.9594 --75.9719 --75.9641 --75.975 --75.9641 --75.9734 --75.9547 --75.9547 --75.9594 --75.9719 --75.9688 --75.9625 --75.9656 --75.9609 --75.975 --75.9672 --75.9563 --75.9578 --75.9625 --75.9719 --75.9688 --75.9547 --75.9641 --75.9797 --75.9734 --75.9688 --75.975 --75.9719 --75.9625 --75.9766 --75.9656 --75.9672 --75.9703 --75.9672 --75.9531 --75.9656 --75.9703 --75.9625 --75.9563 --75.9656 --75.9609 --75.9656 --75.9797 --75.9812 --75.9781 --75.9719 --75.9625 --75.9688 --75.9672 --75.9781 --75.9672 --75.9672 --75.9703 --75.9781 --75.9609 --75.975 --75.9734 --75.9734 --75.9734 --75.9688 --75.9703 --75.9766 --75.9813 --75.9688 --75.9812 --75.9797 --75.9797 --75.975 --75.9859 --75.9719 --75.9734 --75.9719 --75.9906 --75.9641 --75.9781 --75.9734 --75.9656 --75.9719 --75.9688 --75.9734 --75.9766 --75.9906 --75.9875 --75.9594 --75.9625 --75.9688 --75.9719 --75.9766 --75.9609 --75.9641 --75.9656 --75.9812 --75.9641 --75.9641 --75.9656 --75.9703 --75.9641 --75.9781 --75.9719 --75.9688 --75.9578 --75.9672 --75.9656 --75.9516 --75.9609 --75.9625 --75.9672 --75.9578 --75.9781 --75.9719 --75.9594 --75.9703 --75.9766 --75.9766 --75.9578 --75.9734 --75.9766 --75.9547 --75.9781 --75.9656 --75.9641 --75.9688 --75.9781 --75.9672 --75.9656 --75.9625 --75.975 --75.9688 --75.9641 --75.9766 --75.9641 --75.9563 --75.9781 --75.9703 --75.9563 --75.9656 --75.9641 --75.9672 --75.9781 --75.9766 --75.9766 --75.9844 --75.9703 --75.9734 --75.9766 --75.9672 --75.9797 --75.9781 --75.9781 --75.975 --75.9766 --75.9797 --75.9703 --75.9812 --75.9688 --75.975 --75.9703 --75.9672 --75.9766 --75.9781 --75.9875 --75.9844 --75.9844 --75.975 --75.9797 --75.9781 --75.9734 --75.9672 --75.9672 --75.975 --75.9641 --75.9797 --75.975 --75.9672 --75.9578 --75.9734 --75.9797 --75.9828 --75.9672 --75.9672 --75.9766 --75.9797 --75.9922 --75.9781 --75.9812 --75.9844 --75.9906 --75.975 --75.9812 --75.9969 --75.9703 --75.9797 --75.9734 --75.9859 --75.9922 --75.9797 --75.9953 --75.9734 --75.9797 --75.9891 --75.9891 --75.9719 --75.975 --75.9828 --75.9859 --75.9719 --75.9844 --75.9656 --75.9656 --75.9828 --75.9781 --75.9734 --75.9844 --75.9844 --75.9781 --75.9828 --75.9797 --75.9812 --75.975 --75.9797 --75.9766 --75.9828 --75.9672 --75.9734 --75.9734 --75.9719 --75.9766 --75.9688 --75.9766 --75.9672 --75.9766 --75.9812 --75.9828 --75.9766 --75.975 --75.9797 --75.9828 --75.9703 --75.975 --75.9734 --75.9734 --75.9609 --75.9641 --75.9781 --75.9594 --75.9734 --75.9719 --75.9672 --75.9781 --75.9672 --75.9781 --75.9656 --75.9812 --75.9672 --75.9781 --75.9828 --75.9594 --75.9516 --75.9812 --75.9797 --75.9594 --75.9719 --75.9703 --75.9734 --75.9781 --75.9812 --75.9672 --75.9703 --75.9688 --75.9688 --75.9812 --75.9672 --75.9734 --75.9781 --75.9688 --75.9766 --75.9656 --75.9828 --75.9688 --75.975 --75.975 --75.9766 --75.9891 --75.9781 --75.9781 --75.9766 --75.9656 --75.9766 --75.9797 --75.9781 --75.9688 --75.9797 --75.9812 --75.9812 --75.9672 --75.9703 --75.9766 --75.9734 --75.9828 --75.9844 --75.9906 --75.9859 --75.9703 --75.975 --75.9859 --75.9844 --75.9844 --75.9812 --75.9734 --75.9766 --75.9766 --75.9703 --75.9641 --75.9828 --75.9672 --75.9734 --75.9641 --75.9672 --75.9781 --75.9781 --75.9641 --75.9906 --75.9797 --75.975 --75.9812 --75.9734 --75.9625 --75.9734 --75.9906 --75.9734 --75.9828 --75.975 --75.9797 --75.9938 --75.9656 --75.9828 --75.9797 --75.9781 --75.9844 --75.9703 --75.975 --75.9734 --75.9797 --75.9828 --75.975 --75.9703 --75.9641 --75.9734 --75.9781 --75.9734 --75.9641 --75.9656 --75.9828 --75.9797 --75.975 --75.9797 --75.9672 --75.9766 --75.9797 --75.9688 --75.975 --75.9703 --75.975 --75.9781 --75.9703 --75.9812 --75.9688 --75.9906 --75.9703 --75.9844 --75.9766 --75.9703 --75.9828 --75.9656 --75.9844 --75.9812 --75.9766 --75.9703 --75.9672 --75.9734 --75.9672 --75.9781 --75.9734 --75.975 --75.9719 --75.9922 --75.9797 --75.9797 --75.9875 --75.9875 --75.9875 --75.9812 --75.9766 --75.9672 --75.9859 --75.9797 --75.9859 --75.9859 --75.9828 --75.9797 --75.9797 --75.9734 --75.9797 --75.9844 --75.9875 --75.9719 --75.9672 --75.9781 --75.9875 --75.9828 --75.975 --75.9688 --75.9859 --75.9953 --75.9906 --75.9875 --75.9859 --75.975 --75.975 --75.9781 --75.9891 --75.9688 --75.9969 --75.9797 --75.9688 --75.9672 --75.9797 --75.9766 --75.9703 --75.9844 --75.975 --75.9828 --75.9719 --75.9828 --75.9812 --75.9703 --75.9656 --75.9781 --75.9812 --75.9781 --75.9781 --75.9812 --75.9812 --75.9672 --75.9844 --75.9781 --75.9703 --75.9703 --75.9656 --75.975 --75.9625 --75.9656 --75.9625 --75.9797 --75.9703 --75.9703 --75.9719 --75.9656 --75.9609 --75.9703 --75.9703 --75.9641 --75.9672 --75.9766 --75.9609 --75.9688 --75.9766 --75.9703 --75.9875 --75.9797 --75.9719 --75.9688 --75.9641 --75.9672 --75.975 --75.9656 --75.9578 --75.9688 --75.9656 --75.9797 --75.9641 --75.9594 --75.9781 --75.9563 --75.9609 --75.9734 --75.9672 --75.9656 --75.9766 --75.9672 --75.9625 --75.9547 --75.9625 --75.9734 --75.9734 --75.9594 --75.9594 --75.9641 --75.9656 --75.9625 --75.9625 --75.9484 --75.9797 --75.9766 --75.9688 --75.9672 --75.9656 --75.9625 --75.9672 --75.9625 --75.9625 --75.9625 --75.9766 --75.9703 --75.9516 --75.9672 --75.9609 --75.975 --75.9563 --75.9578 --75.9578 --75.9703 --75.9547 --75.9656 --75.9656 --75.9625 --75.95 --75.975 --75.9719 --75.9625 --75.9672 --75.975 --75.9578 --75.95 --75.9578 --75.9594 --75.9578 --75.9625 --75.95 --75.9672 --75.9672 --75.9625 --75.9641 --75.9844 --75.9641 --75.9594 --75.9734 --75.9766 --75.9672 --75.9609 --75.9516 --75.9672 --75.9719 --75.9688 --75.9578 --75.9703 --75.9609 --75.9594 --75.95 --75.9672 --75.9766 --75.9547 --75.9656 --75.9469 --75.9719 --75.9781 --75.9594 --75.9641 --75.9734 --75.9672 --75.9531 --75.9734 --75.9641 --75.9672 --75.9703 --75.9688 --75.9594 --75.9656 --75.9719 --75.9703 --75.9719 --75.9656 --75.9656 --75.9797 --75.9891 --75.9766 --75.9625 --75.9734 --75.9766 --75.9656 --75.9719 --75.9625 --75.9578 --75.9672 --75.9672 --75.9719 --75.975 --75.9656 --75.9891 --75.9812 --75.9734 --75.9625 --75.975 --75.9656 --75.9688 --75.975 --75.9563 --75.9609 --75.9594 --75.9563 --75.9609 --75.9594 --75.9656 --75.9672 --75.9656 --75.9594 --75.9688 --75.9641 --75.9641 --75.975 --75.9766 --75.9672 --75.9656 --75.9672 --75.9766 --75.9625 --75.9672 --75.9703 --75.9672 --75.9734 --75.9656 --75.9891 --75.9656 --75.9609 --75.9688 --75.9656 --75.9625 --75.9672 --75.9594 --75.9688 --75.9703 --75.9828 --75.9719 --75.9547 --75.9609 --75.9672 --75.9672 --75.9828 --75.9547 --75.9812 --75.9766 --75.9672 --75.9703 --75.9844 --75.9719 --75.9719 --75.9641 --75.9563 --75.9625 --75.9531 --75.9703 --75.9672 --75.9672 --75.9703 --75.9594 --75.9578 --75.9609 --75.9688 --75.9672 --75.9703 --75.9656 --75.9578 --75.9656 --75.9703 --75.9672 --75.9672 --75.9641 --75.9672 --75.9656 --75.9719 --75.9594 --75.9625 --75.9641 --75.9797 --75.975 --75.9781 --75.9672 --75.9656 --75.9703 --75.9688 --75.9672 --75.9531 --75.9859 --75.9766 --75.975 --75.9594 --75.9625 --75.9594 --75.9688 --75.9578 --75.9719 --75.9484 --75.9547 --75.9703 --75.9641 --75.9797 --75.9734 --75.9766 --75.9688 --75.9734 --75.9656 --75.9797 --75.9672 --75.9609 --75.9563 --75.9672 --75.9766 --75.9609 --75.9688 --75.9672 --75.9656 --75.9594 --75.9609 --75.9672 --75.9656 --75.9563 --75.9703 --75.9578 --75.9641 --75.9547 --75.9594 --75.9594 --75.9656 --75.9672 --75.9719 --75.9625 --75.9609 --75.9516 --75.9531 --75.9578 --75.9563 --75.9672 --75.9484 --75.9672 --75.9609 --75.9563 --75.9547 --75.9609 --75.9531 --75.9547 --75.9484 --75.9484 --75.9469 --75.9484 --75.9531 --75.9484 --75.95 --75.9422 --75.9453 --75.9437 --75.9609 --75.9547 --75.9609 --75.9516 --75.9563 --75.9641 --75.9578 --75.9578 --75.9641 --75.9656 --75.9625 --75.9578 --75.9516 --75.9688 --75.9516 --75.9594 --75.9531 --75.9656 --75.9516 --75.9594 --75.9625 --75.9578 --75.9656 --75.9547 --75.9594 --75.9547 --75.9531 --75.9641 --75.9703 --75.9531 --75.9578 --75.95 --75.9453 --75.9531 --75.9672 --75.9641 --75.9656 --75.9547 --75.9609 --75.9609 --75.9672 --75.9609 --75.9594 --75.95 --75.9625 --75.9766 --75.9703 --75.9563 --75.9578 --75.95 --75.9578 --75.9531 --75.9719 --75.9656 --75.9547 --75.9656 --75.9625 --75.9516 --75.9578 --75.9594 --75.9719 --75.9703 --75.9594 --75.9609 --75.9609 --75.9625 --75.9578 --75.9563 --75.9547 --75.9625 --75.9625 --75.9703 --75.9609 --75.9641 --75.9625 --75.9656 --75.95 --75.9656 --75.9563 --75.9609 --75.9609 --75.9625 --75.9594 --75.9531 --75.9547 --75.9484 --75.9406 --75.9641 --75.9453 --75.9516 --75.9672 --75.9578 --75.9609 --75.9406 --75.95 --75.9406 --75.95 --75.9594 --75.9422 --75.9422 --75.9609 --75.9453 --75.9547 --75.9453 --75.95 --75.9469 --75.9437 --75.9469 --75.9406 --75.9547 --75.9406 --75.9594 --75.9375 --75.9453 --75.9469 --75.9516 --75.9469 --75.9453 --75.9531 --75.9422 --75.9422 --75.9656 --75.9563 --75.9594 --75.9578 --75.9563 --75.9484 --75.9531 --75.9563 --75.9516 --75.9547 --75.9578 --75.9625 --75.95 --75.9437 --75.9672 --75.9547 --75.95 --75.9531 --75.9563 --75.9547 --75.9531 --75.9578 --75.9563 --75.9453 --75.9578 --75.9719 --75.9516 --75.9656 --75.9531 --75.9516 --75.9531 --75.9828 --75.9656 --75.9641 --75.9891 --75.9656 --75.9516 --75.9656 --75.9484 --75.9672 --75.9609 --75.9641 --75.9563 --75.9609 --75.9672 --75.9547 --75.9531 --75.9656 --75.9516 --75.9484 --75.9609 --75.9547 --75.9563 --75.95 --75.9609 --75.9656 --75.9531 --75.9547 --75.9625 --75.9563 --75.9563 --75.95 --75.9563 --75.9469 --75.9578 --75.9453 --75.9453 --75.9531 --75.9437 --75.9531 --75.9391 --75.9563 --75.9406 --75.9531 --75.9406 --75.9516 --75.9375 --75.9578 --75.9563 --75.9484 --75.9547 --75.9422 --75.9469 --75.9609 --75.95 --75.9516 --75.95 --75.9531 --75.9563 --75.9437 --75.9391 --75.9531 --75.9563 --75.95 --75.95 --75.9656 --75.9563 --75.9437 --75.9547 --75.9641 --75.9594 --75.95 --75.9547 --75.9672 --75.9578 --75.9422 --75.9703 --75.9656 --75.9563 --75.9656 --75.9594 --75.9688 --75.9516 --75.9719 --75.9563 --75.9516 --75.9719 --75.9734 --75.9609 --75.9672 --75.9656 --75.9766 --75.9672 --75.9578 --75.9547 --75.9625 --75.9594 --75.9609 --75.9828 --75.9703 --75.9781 --75.9719 --75.9625 --75.9734 --75.9797 --75.9844 --75.9656 --75.9656 --75.95 --75.9688 --75.9563 --75.9812 --75.9656 --75.9625 --75.9578 --75.9703 --75.9625 --75.9516 --75.9578 --75.9469 --75.9563 --75.9531 --75.9641 --75.9563 --75.9609 --75.9656 --75.9703 --75.9656 --75.9656 --75.9609 --75.9641 --75.9594 --75.9547 --75.9625 --75.9797 --75.9734 --75.9625 --75.9609 --75.9719 --75.9594 --75.9672 --75.9672 --75.975 --75.9703 --75.9719 --75.9734 --75.9703 --75.9797 --75.9656 --75.9563 --75.9641 --75.9656 --75.9719 --75.9609 --75.9641 --75.9625 --75.9516 --75.9641 --75.9688 --75.9625 --75.9703 --75.9437 --75.9563 --75.9453 --75.975 --75.9609 --75.9672 --75.9672 --75.9656 --75.9625 --75.9703 --75.9672 --75.9688 --75.9781 --75.9531 --75.9641 --75.9609 --75.9688 --75.9719 --75.9625 --75.9563 --75.9672 --75.9656 --75.9641 --75.9437 --75.9797 --75.9484 --75.9625 --75.9469 --75.9656 --75.9656 --75.9688 --75.9781 --75.9703 --75.9688 --75.9563 --75.9672 --75.9672 --75.9672 --75.9656 --75.9625 --75.9641 --75.9625 --75.95 --75.9594 --75.9719 --75.9656 --75.9594 --75.9688 --75.9641 --75.9719 --75.9547 --75.9672 --75.9563 --75.9594 --75.9688 --75.9516 --75.9578 --75.9766 --75.9594 --75.9672 --75.9703 --75.9719 --75.9781 --75.9625 --75.9641 --75.9688 --75.9531 --75.95 --75.9625 --75.9437 --75.9703 --75.95 --75.9578 --75.9484 --75.95 --75.9609 --75.9563 --75.9453 --75.9563 --75.9469 --75.9609 --75.9453 --75.9547 --75.9516 --75.9594 --75.9391 --75.9594 --75.9563 --75.9609 --75.9563 --75.9656 --75.9625 --75.9516 --75.9719 --75.9563 --75.9531 --75.9578 --75.9609 --75.9563 --75.9563 --75.9609 --75.9703 --75.9516 --75.9531 --75.9625 --75.9516 --75.9688 --75.9609 --75.9656 --75.9625 --75.9594 --75.9531 --75.9563 --75.9563 --75.9641 --75.9578 --75.9625 --75.9531 --75.9531 --75.95 --75.9594 --75.9625 --75.9578 --75.9609 --75.9547 --75.9672 --75.9437 --75.9625 --75.9531 --75.95 --75.9609 --75.9453 --75.9625 --75.9453 --75.9625 --75.95 --75.9594 --75.9609 --75.9641 --75.9578 --75.9703 --75.9719 --75.9688 --75.9688 --75.9609 --75.9609 --75.9578 --75.9578 --75.9547 --75.9672 --75.9609 --75.9656 --75.9625 --75.9734 --75.9703 --75.9563 --75.9609 --75.9437 --75.9531 --75.95 --75.9391 --75.9422 --75.95 --75.9422 --75.9484 --75.9516 --75.9641 --75.9609 --75.9547 --75.9437 --75.9516 --75.9594 --75.9734 --75.9437 --75.9484 --75.95 --75.9547 --75.9484 --75.9719 --75.9547 --75.9734 --75.9594 --75.9578 --75.9531 --75.9609 --75.9594 --75.9688 --75.9609 --75.9641 --75.9688 --75.9625 --75.9641 --75.9625 --75.9734 --75.9609 --75.9516 --75.9641 --75.9609 --75.9531 --75.9563 --75.9609 --75.9609 --75.9609 --75.9516 --75.9563 --75.9531 --75.9594 --75.9625 --75.9672 --75.9516 --75.9516 --75.9656 --75.9703 --75.9703 --75.975 --75.9703 --75.9578 --75.9719 --75.9688 --75.9625 --75.9516 --75.9563 --75.95 --75.9516 --75.9531 --75.9469 --75.9469 --75.9594 --75.9609 --75.9563 --75.9563 --75.9656 --75.9703 --75.9469 --75.9625 --75.9484 --75.9578 --75.9406 --75.9609 --75.9547 --75.9625 --75.9563 --75.9547 --75.9516 --75.9594 --75.9516 --75.9703 --75.9688 --75.9609 --75.9609 --75.9563 --75.9531 --75.9453 --75.9484 --75.9625 --75.9406 --75.9469 --75.9453 --75.9375 --75.9609 --75.9469 --75.9437 --75.95 --75.9547 --75.9516 --75.9484 --75.95 --75.9516 --75.9547 --75.9563 --75.9781 --75.9547 --75.95 --75.9719 --75.9547 --75.9516 --75.9547 --75.9609 --75.95 --75.9641 --75.9469 --75.95 --75.9609 --75.9594 --75.9469 --75.9641 --75.9469 --75.9578 --75.9609 --75.9563 --75.9422 --75.9594 --75.95 --75.9594 --75.9688 --75.9563 --75.9578 --75.9641 --75.9609 --75.9734 --75.9563 --75.9609 --75.9516 --75.95 --75.9531 --75.9437 --75.9625 --75.9547 --75.9437 --75.9516 --75.9531 --75.9609 --75.9516 --75.9594 --75.9594 --75.9531 --75.9578 --75.9547 --75.9578 --75.9734 --75.9609 --75.9766 --75.9672 --75.9609 --75.9594 --75.9594 --75.95 --75.9578 --75.9672 --75.9578 --75.9594 --75.9563 --75.9672 --75.9641 --75.9563 --75.9703 --75.9625 --75.9563 --75.9563 --75.9719 --75.9625 --75.9625 --75.9656 --75.9625 --75.9641 --75.9516 --75.9641 --75.9563 --75.9469 --75.9656 --75.9547 --75.9578 --75.9594 --75.95 --75.9578 --75.9641 --75.9453 --75.9484 --75.9531 --75.9578 --75.9422 --75.95 --75.9672 --75.9547 --75.9656 --75.9609 --75.9609 --75.9437 --75.9578 --75.9563 --75.9531 --75.9594 --75.9625 --75.9594 --75.9469 --75.9531 --75.9516 --75.9422 --75.9547 --75.9594 --75.9453 --75.95 --75.9563 --75.9625 --75.9516 --75.9578 --75.9531 --75.9437 --75.9594 --75.9641 --75.9531 --75.9516 --75.9484 --75.9641 --75.9547 --75.9578 --75.9594 --75.9672 --75.9641 --75.9609 --75.9531 --75.9688 --75.9547 --75.9656 --75.9625 --75.9719 --75.9688 --75.9531 --75.9547 --75.9484 --75.9656 --75.9531 --75.9672 --75.9531 --75.9719 --75.9531 --75.9469 --75.9437 --75.9578 --75.9484 --75.9406 --75.9453 --75.9531 --75.9578 --75.9531 --75.9484 --75.9406 --75.9578 --75.9594 --75.9422 --75.9516 --75.9469 --75.9531 --75.9453 --75.9531 --75.9531 --75.9656 --75.9594 --75.9703 --75.9625 --75.9563 --75.9609 --75.9734 --75.9531 --75.9672 --75.9578 --75.9594 --75.9531 --75.9406 --75.9625 --75.9688 --75.9625 --75.9656 --75.9656 --75.9516 --75.9625 --75.9641 --75.9609 --75.9563 --75.9578 --75.9609 --75.9531 --75.9563 --75.9516 --75.9703 --75.95 --75.9609 --75.9594 --75.9578 --75.9563 --75.9516 --75.9484 --75.9625 --75.9563 --75.95 --75.9609 --75.9641 --75.9578 --75.9656 --75.9578 --75.9547 --75.9547 --75.9578 --75.9516 --75.9656 --75.95 --75.9688 --75.9688 --75.9594 --75.9625 --75.9609 --75.9625 --75.9484 --75.9516 --75.9563 --75.9563 --75.9656 --75.9484 --75.9516 --75.9641 --75.9688 --75.9563 --75.9594 --75.9609 --75.9641 --75.9609 --75.9625 --75.9703 --75.9641 --75.9844 --75.9625 --75.975 --75.9594 --75.9734 --75.9766 --75.9719 --75.9734 --75.9672 --75.975 --75.9781 --75.9719 --75.9641 --75.9656 --75.9547 --75.9609 --75.9656 --75.9547 --75.9656 --75.9563 --75.9641 --75.9594 --75.9719 --75.9563 --75.9734 --75.9703 --75.9688 --75.9656 --75.9688 --75.9719 --75.9828 --75.9719 --75.95 --75.9688 --75.9656 --75.9547 --75.9703 --75.9609 --75.9656 --75.9578 --75.9453 --75.9656 --75.9469 --75.9422 --75.9547 --75.9625 --75.9563 --75.9609 --75.9563 --75.9734 --75.9563 --75.9594 --75.9625 --75.9641 --75.9641 --75.9703 --75.9703 --75.9484 --75.9578 --75.9656 --75.9609 --75.9609 --75.9484 --75.9656 --75.9531 --75.9531 --75.9672 --75.9609 --75.9547 --75.9547 --75.9469 --75.9453 --75.95 --75.9531 --75.9578 --75.9453 --75.95 --75.9531 --75.9375 --75.9406 --75.9437 --75.9375 --75.95 --75.9437 --75.9531 --75.9484 --75.9375 --75.9391 --75.9453 --75.9313 --75.9641 --75.9547 --75.9672 --75.9609 --75.9641 --75.9469 --75.9469 --75.9469 --75.9516 --75.9422 --75.9391 --75.9563 --75.9516 --75.9359 --75.9469 --75.9516 --75.9406 --75.95 --75.9422 --75.9422 --75.9453 --75.9594 --75.9484 --75.9469 --75.9391 --75.9453 --75.9297 --75.9422 --75.9422 --75.9531 --75.9391 --75.9469 --75.95 --75.9422 --75.9344 --75.9375 --75.9453 --75.9297 --75.9406 --75.9453 --75.9406 --75.9531 --75.9531 --75.9406 --75.9406 --75.9375 --75.9406 --75.9484 --75.9391 --75.9469 --75.95 --75.95 --75.9453 --75.9453 --75.9313 --75.9437 --75.9469 --75.9422 --75.9422 --75.9422 --75.9375 --75.9437 --75.9281 --75.9469 --75.9531 --75.95 --75.9609 --75.9563 --75.9625 --75.9484 --75.9547 --75.9469 --75.9453 --75.9406 --75.95 --75.9469 --75.9422 --75.9563 --75.9578 --75.9437 --75.9563 --75.9406 --75.9547 --75.9469 --75.95 --75.9563 --75.9563 --75.9437 --75.9594 --75.9484 --75.95 --75.9656 --75.95 --75.9563 --75.9563 --75.9547 --75.9563 --75.9406 --75.9563 --75.9641 --75.9375 --75.9453 --75.9641 --75.9688 --75.9547 --75.9484 --75.9578 --75.9547 --75.9375 --75.9563 --75.9422 --75.95 --75.9453 --75.9578 --75.9625 --75.9422 --75.9391 --75.9641 --75.9516 --75.9578 --75.9484 --75.9656 --75.9469 --75.95 --75.95 --75.9625 --75.9547 --75.9688 --75.9578 --75.9641 --75.9578 --75.9563 --75.9406 --75.9563 --75.9531 --75.9484 --75.9672 --75.9531 --75.95 --75.9766 --75.9703 --75.9547 --75.9531 --75.9563 --75.9391 --75.9563 --75.9375 --75.9375 --75.9391 --75.9578 --75.9437 --75.9328 --75.9406 --75.9437 --75.9531 --75.9437 --75.9625 --75.9359 --75.9469 --75.9281 --75.9391 --75.9391 --75.9391 --75.9391 --75.9281 --75.9453 --75.9469 --75.9516 --75.9516 --75.9406 --75.9422 --75.9578 --75.9531 --75.95 --75.9484 --75.9531 --75.9422 --75.9484 --75.9625 --75.9469 --75.9531 --75.9484 --75.95 --75.9531 --75.9625 --75.9563 --75.9469 --75.9578 --75.9609 --75.9594 --75.9578 --75.9453 --75.9547 --75.9594 --75.9531 --75.9547 --75.9594 --75.9703 --75.9578 --75.9563 --75.9594 --75.9563 --75.9547 --75.9578 --75.9531 --75.9469 --75.9484 --75.9484 --75.9453 --75.9625 --75.9594 --75.9531 --75.9578 --75.9547 --75.9406 --75.9609 --75.9531 --75.9688 --75.9547 --75.9484 --75.9406 --75.9609 --75.9625 --75.9547 --75.95 --75.9406 --75.9453 --75.95 --75.9625 --75.9453 --75.95 --75.9531 --75.9516 --75.9688 --75.9641 --75.9625 --75.9641 --75.9563 --75.9547 --75.9703 --75.9688 --75.9641 --75.9656 --75.9547 --75.9766 --75.9734 --75.9656 --75.9812 --75.9641 --75.9594 --75.9734 --75.9594 --75.9641 --75.9656 --75.9547 --75.9594 --75.9531 --75.9688 --75.9625 --75.9719 --75.9641 --75.9547 --75.95 --75.9656 --75.9594 --75.9594 --75.9578 --75.9641 --75.9641 --75.9578 --75.9469 --75.9547 --75.9547 --75.9484 --75.9547 --75.9469 --75.9594 --75.9516 --75.9641 --75.9781 --75.9719 --75.9578 --75.9656 --75.9594 --75.9656 --75.9563 --75.9531 --75.9703 --75.9719 --75.9547 --75.9672 --75.9578 --75.9531 --75.9594 --75.9375 --75.9625 --75.9437 --75.9578 --75.9609 --75.95 --75.9531 --75.95 --75.9531 --75.9344 --75.9531 --75.9469 --75.9547 --75.9578 --75.9422 --75.9563 --75.9563 --75.9547 --75.9563 --75.9531 --75.9484 --75.9688 --75.9516 --75.9563 --75.9531 --75.9688 --75.9609 --75.9484 --75.9531 --75.975 --75.9531 --75.9547 --75.95 --75.9516 --75.9563 --75.9484 --75.9422 --75.9547 --75.9531 --75.9594 --75.9422 --75.9609 --75.9437 --75.9422 --75.9469 --75.9391 --75.95 --75.9422 --75.9516 --75.9625 --75.9422 --75.9453 --75.9516 --75.9625 --75.9422 --75.9437 --75.9594 --75.9563 --75.9641 --75.9563 --75.9422 --75.9547 --75.9437 --75.95 --75.9609 --75.9594 --75.9531 --75.9547 --75.9406 --75.9531 --75.95 --75.9609 --75.9437 --75.9437 --75.9516 --75.9484 --75.9484 --75.9516 --75.9547 --75.9516 --75.9547 --75.9391 --75.9422 --75.9391 --75.9391 --75.9563 --75.9469 --75.9547 --75.9375 --75.9437 --75.95 --75.9313 --75.9547 --75.95 --75.9437 --75.9328 --75.9469 --75.9469 --75.95 --75.9422 --75.9453 --75.9516 --75.9578 --75.9594 --75.9547 --75.9578 --75.9437 --75.9594 --75.9531 --75.9578 --75.9469 --75.9437 --75.9437 --75.9594 --75.9469 --75.9516 --75.9531 --75.9484 --75.9391 --75.9516 --75.9609 --75.9484 --75.9547 --75.9406 --75.9531 --75.9547 --75.9453 --75.9516 --75.9328 --75.9563 --75.9406 --75.9422 --75.9547 --75.9531 --75.9578 --75.9578 --75.9437 --75.9437 --75.95 --75.9563 --75.9469 --75.9437 --75.9391 --75.9547 --75.9594 --75.9656 --75.9453 --75.9437 --75.9484 --75.9516 --75.9453 --75.9484 --75.9516 --75.9359 --75.9484 --75.9422 --75.9359 --75.9484 --75.9453 --75.9375 --75.9297 --75.9422 --75.9313 --75.9406 --75.9437 --75.9391 --75.9375 --75.9375 --75.95 --75.9547 --75.9547 --75.9563 --75.9469 --75.95 --75.9453 --75.9391 --75.9406 --75.9469 --75.9484 --75.9484 --75.9516 --75.9422 --75.9406 --75.9422 --75.9422 --75.9453 --75.9453 --75.9313 --75.9281 --75.9484 --75.9422 --75.9422 --75.9375 --75.9375 --75.9516 --75.9391 --75.9281 --75.9391 --75.9344 --75.9375 --75.9391 --75.9406 --75.9453 --75.9406 --75.9328 --75.9375 --75.9375 --75.9281 --75.9406 --75.9359 --75.9531 --75.95 --75.9547 --75.9406 --75.9406 --75.9422 --75.9297 --75.9453 --75.9313 --75.9344 --75.9422 --75.9469 --75.9391 --75.9484 --75.9391 --75.9359 --75.9437 --75.9344 --75.95 --75.9453 --75.9406 --75.9406 --75.9437 --75.9297 --75.9531 --75.9406 --75.9422 --75.9328 --75.9453 --75.9406 --75.9344 --75.9422 --75.9578 --75.9531 --75.95 --75.9578 --75.9547 --75.9656 --75.9359 --75.9641 --75.9688 --75.9422 --75.9391 --75.9453 --75.9453 --75.9453 --75.9578 --75.9437 --75.9437 --75.9469 --75.9344 --75.9437 --75.9625 --75.9437 --75.9359 --75.95 --75.9406 --75.9453 --75.9594 --75.9437 --75.9516 --75.9516 --75.95 --75.9437 --75.9422 --75.9391 --75.9453 --75.9469 --75.9469 --75.9391 --75.9297 --75.9437 --75.9453 --75.9406 --75.9391 --75.9484 --75.9422 --75.9359 --75.9531 --75.9406 --75.9484 --75.9406 --75.9391 --75.9453 --75.9359 --75.9516 --75.9422 --75.9547 --75.9516 --75.9578 --75.9609 --75.9547 --75.9422 --75.9531 --75.9453 --75.9578 --75.9359 --75.9484 --75.9391 --75.9437 --75.9516 --75.9375 --75.9391 --75.9594 --75.9516 --75.9313 --75.95 --75.9563 --75.9406 --75.9437 --75.9516 --75.9641 --75.9406 --75.9656 --75.9578 --75.9469 --75.9437 --75.9594 --75.9516 --75.9531 --75.9469 --75.9609 --75.9437 --75.9563 --75.9563 --75.9609 --75.9531 --75.9594 --75.9469 --75.9609 --75.9484 --75.9531 --75.9453 --75.9453 --75.9516 --75.9656 --75.9578 --75.9656 --75.9547 --75.9563 --75.95 --75.9375 --75.9563 --75.9375 --75.95 --75.9422 --75.9344 --75.9344 --75.95 --75.9437 --75.9422 --75.9578 --75.9359 --75.9531 --75.9437 --75.9469 --75.9547 --75.9469 --75.9469 --75.9484 --75.9547 --75.9594 --75.95 --75.9531 --75.9516 --75.9344 --75.9531 --75.9375 --75.9547 --75.9469 --75.9437 --75.9359 --75.9453 --75.9469 --75.9437 --75.9359 --75.9281 --75.9344 --75.9469 --75.9484 --75.9344 --75.9391 --75.9359 --75.9391 --75.9391 --75.9547 --75.925 --75.9437 --75.9453 --75.9437 --75.9281 --75.9359 --75.9313 --75.9359 --75.9469 --75.9484 --75.9281 --75.9328 --75.9391 --75.9344 --75.9531 --75.9422 --75.9328 --75.9531 --75.9547 --75.9422 --75.9453 --75.9375 --75.9516 --75.9344 --75.9453 --75.9328 --75.9609 --75.9469 --75.9547 --75.9313 --75.9391 --75.9406 --75.9391 --75.9422 --75.9453 --75.9453 --75.9219 --75.9453 --75.9563 --75.9406 --75.9375 --75.9453 --75.9375 --75.9563 --75.9391 --75.9406 --75.9375 --75.9469 --75.95 --75.9437 --75.9516 --75.9422 --75.9469 --75.9344 --75.9359 --75.9531 --75.9422 --75.9375 --75.9453 --75.9437 --75.9547 --75.9453 --75.9484 --75.9422 --75.9437 --75.9375 --75.9344 --75.9469 --75.9547 --75.9406 --75.9594 --75.9297 --75.9313 --75.9406 --75.9391 --75.9469 --75.9469 --75.9313 --75.9406 --75.9437 --75.9594 --75.9609 --75.9469 --75.9547 --75.9484 --75.9453 --75.9484 --75.9563 --75.9547 --75.9531 --75.9547 --75.9563 --75.9547 --75.9531 --75.9437 --75.9563 --75.9516 --75.9609 --75.9656 --75.9609 --75.9641 --75.9531 --75.9531 --75.9625 --75.9437 --75.9594 --75.9688 --75.95 --75.9688 --75.9453 --75.9484 --75.9625 --75.9422 --75.9437 --75.9516 --75.9516 --75.9453 --75.9469 --75.9437 --75.9469 --75.9609 --75.9531 --75.9547 --75.9547 --75.95 --75.9531 --75.9594 --75.9578 --75.9578 --75.9531 --75.9469 --75.9594 --75.9547 --75.9391 --75.9516 --75.9437 --75.95 --75.9359 --75.9531 --75.9594 --75.9516 --75.9437 --75.9391 --75.9422 --75.9437 --75.9516 --75.9516 --75.95 --75.9688 --75.9578 --75.9531 --75.9703 --75.9641 --75.9609 --75.9578 --75.9594 --75.9469 --75.9563 --75.9625 --75.9469 --75.9469 --75.9641 --75.9422 --75.9625 --75.95 --75.9703 --75.9563 --75.9594 --75.9609 --75.9516 --75.9516 --75.9641 --75.9609 --75.9563 --75.9656 --75.95 --75.9578 --75.9391 --75.9516 --75.9594 --75.9453 --75.95 --75.9547 --75.9406 --75.9703 --75.9625 --75.9453 --75.9609 --75.9578 --75.9609 --75.9531 --75.9625 --75.9547 --75.9531 --75.9625 --75.9531 --75.9625 --75.9484 --75.9781 --75.9531 --75.9625 --75.9688 --75.9656 --75.9563 --75.9531 --75.9703 --75.9547 --75.9563 --75.95 --75.9531 --75.9547 --75.9531 --75.9594 --75.9594 --75.9625 --75.9578 --75.9734 --75.9688 --75.9688 --75.9688 --75.9484 --75.9531 --75.9563 --75.9563 --75.9641 --75.9625 --75.9656 --75.9563 --75.9703 --75.9734 --75.9656 --75.9578 --75.9547 --75.9656 --75.9484 --75.95 --75.9688 --75.9563 --75.9563 --75.9656 --75.9625 --75.9719 --75.9688 --75.95 --75.9609 --75.9594 --75.9625 --75.9516 --75.9734 --75.9516 --75.9641 --75.9641 --75.9484 --75.9781 --75.9672 --75.9672 --75.9719 --75.9656 --75.9563 --75.9703 --75.9484 --75.9594 --75.9563 --75.9578 --75.9594 --75.9812 --75.9609 --75.9719 --75.9641 --75.9672 --75.95 --75.9703 --75.9547 --75.9688 --75.9641 --75.9609 --75.9578 --75.9625 --75.9578 --75.9563 --75.9609 --75.9672 --75.9672 --75.9672 --75.9641 --75.9531 --75.9516 --75.9609 --75.9688 --75.95 --75.9672 --75.9641 --75.9594 --75.9609 --75.9609 --75.9531 --75.9594 --75.9672 --75.9609 --75.9656 --75.9531 --75.9484 --75.9625 --75.95 --75.9578 --75.9625 --75.9781 --75.9547 --75.9578 --75.9641 --75.9547 --75.9516 --75.95 --75.9531 --75.9563 --75.9688 --75.9391 --75.9469 --75.9453 --75.9484 --75.9547 --75.9719 --75.9531 --75.9437 --75.9625 --75.95 --75.9578 --75.9375 --75.9563 --75.9578 --75.9547 --75.9578 --75.9594 --75.9422 --75.9531 --75.9469 --75.9563 --75.9578 --75.9563 --75.9453 --75.9484 --75.9547 --75.9641 --75.9531 --75.9578 --75.9656 --75.9594 --75.9672 --75.9453 --75.9578 --75.95 --75.9656 --75.9641 --75.9531 --75.9625 --75.975 --75.9719 --75.9672 --75.9656 --75.9719 --75.9656 --75.9609 --75.9484 --75.9531 --75.9641 --75.9641 --75.9469 --75.9656 --75.9594 --75.95 --75.9594 --75.9594 --75.9531 --75.9563 --75.9641 --75.9625 --75.9641 --75.9594 --75.9688 --75.9641 --75.9703 --75.9797 --75.9453 --75.9625 --75.9578 --75.9656 --75.9516 --75.9516 --75.9516 --75.9625 --75.9734 --75.9563 --75.9453 --75.9578 --75.9641 --75.9578 --75.95 --75.9578 --75.9594 --75.9578 --75.9609 --75.9672 --75.9547 --75.9641 --75.9625 --75.9594 --75.9547 --75.95 --75.9563 --75.9609 --75.9594 --75.9734 --75.95 --75.9609 --75.9625 --75.9625 --75.9594 --75.9594 --75.9609 --75.9656 --75.9547 --75.9594 --75.9688 --75.9703 --75.9703 --75.9672 --75.9641 --75.9625 --75.9578 --75.9563 --75.9547 --75.9656 --75.9688 --75.9547 --75.9516 --75.9672 --75.975 --75.9656 --75.9547 --75.9578 --75.9547 --75.9563 --75.9641 --75.9609 --75.9625 --75.9531 --75.9594 --75.9781 --75.9578 --75.9609 --75.9531 --75.9594 --75.9719 --75.9594 --75.9609 --75.9641 --75.9531 --75.9688 --75.9594 --75.9594 --75.9578 --75.9531 --75.9672 --75.9563 --75.9578 --75.9703 --75.975 --75.9734 --75.9594 --75.9563 --75.9578 --75.9563 --75.9766 --75.95 --75.9516 --75.9641 --75.9578 --75.9609 --75.9578 --75.9547 --75.9563 --75.9391 --75.9578 --75.9516 --75.9422 --75.9656 --75.9656 --75.9594 --75.9516 --75.9563 --75.9609 --75.9672 --75.9625 --75.9547 --75.9453 --75.9641 --75.9656 --75.9656 --75.9719 --75.9641 --75.9391 --75.9578 --75.9672 --75.9641 --75.9594 --75.9469 --75.9484 --75.9563 --75.9656 --75.9531 --75.9609 --75.9547 --75.9578 --75.9406 --75.95 --75.9609 --75.9656 --75.95 --75.9547 --75.9594 --75.9734 --75.9531 --75.9641 --75.9578 --75.9688 --75.9688 --75.9609 --75.9672 --75.9516 --75.9688 --75.9641 --75.9578 --75.9516 --75.9641 --75.95 --75.95 --75.9688 --75.9625 --75.9484 --75.9594 --75.9563 --75.9656 --75.9609 --75.9563 --75.9625 --75.9672 --75.9469 --75.9547 --75.975 --75.9484 --75.9719 --75.9641 --75.9484 --75.9594 --75.9609 --75.9688 --75.9594 --75.9594 --75.9625 --75.9703 --75.9672 --75.9563 --75.9437 --75.9563 --75.95 --75.9672 --75.9594 --75.9656 --75.9703 --75.9375 --75.9625 --75.9625 --75.9656 --75.9578 --75.9672 --75.9594 --75.9469 --75.9688 --75.9609 --75.9656 --75.9547 --75.9563 --75.9656 --75.9469 --75.9672 --75.9703 --75.9531 --75.9516 --75.95 --75.9641 --75.9578 --75.9563 --75.9734 --75.9563 --75.9594 --75.975 --75.9609 --75.9609 --75.9594 --75.9844 --75.9625 --75.9688 --75.9781 --75.9625 --75.975 --75.9578 --75.9563 --75.9547 --75.9531 --75.9625 --75.9641 --75.9578 --75.9563 --75.9625 --75.9531 --75.9641 --75.9656 --75.9563 --75.9641 --75.9547 --75.9703 --75.9766 --75.9641 --75.9672 --75.9578 --75.9641 --75.9547 --75.9656 --75.9672 --75.9688 --75.9672 --75.9641 --75.9672 --75.9672 --75.9641 --75.9688 --75.9672 --75.9609 --75.9672 --75.9766 --75.9594 --75.9641 --75.9578 --75.9531 --75.9609 --75.9641 --75.9516 --75.9625 --75.9469 --75.9594 --75.9609 --75.9703 --75.9594 --75.9656 --75.9609 --75.9703 --75.9609 --75.9688 --75.9656 --75.975 --75.9703 --75.9641 --75.9734 --75.9641 --75.9672 --75.9563 --75.9609 --75.9656 --75.9625 --75.9531 --75.9594 --75.9578 --75.9625 --75.95 --75.9531 --75.9578 --75.9609 --75.9578 --75.9453 --75.9563 --75.9453 --75.9578 --75.9594 --75.9547 --75.9516 --75.9422 --75.9422 --75.9688 --75.9531 --75.9641 --75.9531 --75.95 --75.9641 --75.9547 --75.9547 --75.9531 --75.9578 --75.9531 --75.9531 --75.9531 --75.9578 --75.9656 --75.9578 --75.9469 --75.9531 --75.9484 --75.9437 --75.9625 --75.9516 --75.9641 --75.9437 --75.9484 --75.95 --75.9625 --75.9422 --75.9563 --75.9594 --75.9547 --75.9594 --75.9641 --75.9469 --75.9531 --75.9641 --75.95 --75.9547 --75.95 --75.9484 --75.9547 --75.9625 --75.9578 --75.9469 --75.9516 --75.9578 --75.9641 --75.95 --75.9531 --75.9484 --75.9516 --75.9563 --75.9391 --75.9469 --75.9563 --75.9484 --75.9437 --75.9516 --75.9484 --75.9359 --75.9469 --75.9313 --75.9547 --75.95 --75.9578 --75.9547 --75.9641 --75.9516 --75.9609 --75.9531 --75.9453 --75.9484 --75.9484 --75.9375 --75.9594 --75.9656 --75.9453 --75.95 --75.9594 --75.9641 --75.9609 --75.9656 --75.9531 --75.9484 --75.9688 --75.9563 --75.9453 --75.9516 --75.9578 --75.9531 --75.9641 --75.9531 --75.9484 --75.9594 --75.9688 --75.9469 --75.9688 --75.9594 --75.9547 --75.9672 --75.9578 --75.9594 --75.9484 --75.9688 --75.9578 --75.9672 --75.9625 --75.9625 --75.9594 --75.95 --75.9484 --75.9625 --75.9641 --75.9594 --75.9484 --75.9703 --75.9641 --75.9594 --75.9734 --75.9719 --75.9766 --75.9688 --75.9609 --75.975 --75.9547 --75.9594 --75.975 --75.9578 --75.9578 --75.9625 --75.975 --75.9672 --75.9578 --75.9672 --75.9766 --75.9594 --75.9625 --75.9672 --75.9781 --75.9734 --75.9781 --75.9703 --75.9734 --75.9578 --75.9703 --75.9688 --75.9688 --75.9688 --75.9703 --75.9641 --75.9734 --75.9812 --75.9703 --75.9594 --75.9641 --75.9656 --75.9641 --75.9641 --75.9766 --75.9609 --75.9688 --75.9625 --75.9469 --75.9641 --75.9641 --75.9688 --75.9734 --75.9703 --75.9656 --75.9625 --75.9594 --75.9688 --75.9734 --75.9812 --75.9609 --75.9766 --75.9609 --75.9656 --75.9641 --75.9828 --75.9688 --75.9734 --75.9531 --75.9875 --75.9719 --75.9828 --75.9594 --75.9688 --75.9703 --75.9828 --75.9906 --75.9734 --75.9719 --75.9641 --75.9781 --75.9641 --75.9797 --75.9703 --75.9828 --75.9703 --75.9766 --75.9781 --75.975 --75.9812 --75.9578 --75.9688 --75.9828 --75.9656 --75.9656 --75.9797 --75.9781 --75.9563 --75.9531 --75.9688 --75.9641 --75.9672 --75.9797 --75.9688 --75.9656 --75.9609 --75.9594 --75.9656 --75.9641 --75.9578 --75.9516 --75.9672 --75.9688 --75.95 --75.9688 --75.9594 --75.9656 --75.9641 --75.9672 --75.9688 --75.9641 --75.9719 --75.9594 --75.9719 --75.9734 --75.9625 --75.9844 --75.9688 --75.9719 --75.9641 --75.9688 --75.9703 --75.9734 --75.9641 --75.9672 --75.975 --75.9703 --75.9453 --75.9578 --75.9719 --75.9641 --75.9734 --75.9828 --75.9734 --75.9766 --75.975 --75.9703 --75.9828 --75.9594 --75.9734 --75.9688 --75.9766 --75.9641 --75.9703 --75.9625 --75.9656 --75.9734 --75.9688 --75.9828 --75.9781 --75.9703 --75.9766 --75.9672 --75.9812 --75.975 --75.9688 --75.9641 --75.9688 --75.9734 --75.9594 --75.9781 --75.9844 --75.9781 --75.9891 --75.975 --75.9719 --75.9578 --75.9812 --75.9688 --75.9703 --75.9688 --75.9734 --75.9578 --75.9703 --75.9766 --75.9641 --75.9656 --75.9625 --75.9531 --75.9578 --75.9594 --75.9672 --75.9703 --75.9594 --75.9703 --75.9719 --75.9609 --75.9734 --75.9781 --75.9859 --75.9797 --75.9812 --75.9688 --75.9703 --75.9781 --75.9578 --75.9828 --75.9828 --75.9781 --75.9734 --75.9938 --75.9641 --75.9641 --75.975 --75.9766 --75.9719 --75.9812 --75.9625 --75.9656 --75.9734 --75.9719 --75.9719 --75.9719 --75.9812 --75.9797 --75.9812 --75.9656 --75.975 --75.9734 --75.9719 --75.9688 --75.9734 --75.9609 --75.9578 --75.9641 --75.975 --75.9609 --75.9781 --75.9781 --75.9875 --75.9781 --75.9703 --75.9516 --75.9656 --75.9656 --75.9578 --75.9688 --75.9734 --75.9766 --75.9656 --75.9594 --75.975 --75.9766 --75.9656 --75.9703 --75.9625 --75.9688 --75.9609 --75.9688 --75.975 --75.9594 --75.9547 --75.9578 --75.9609 --75.9688 --75.9781 --75.9594 --75.9594 --75.9656 --75.9609 --75.9625 --75.9656 --75.9656 --75.9656 --75.9641 --75.975 --75.9672 --75.9672 --75.9656 --75.9656 --75.9625 --75.9625 --75.9812 --75.975 --75.9781 --75.9703 --75.975 --75.9719 --75.9578 --75.9906 --75.9812 --75.975 --75.9594 --75.9797 --75.9672 --75.9672 --75.9625 --75.9672 --75.9859 --75.9672 --75.9828 --75.9563 --75.9734 --75.9719 --75.9609 --75.9703 --75.9688 --75.975 --75.9781 --75.9719 --75.975 --75.9828 --75.9797 --75.9766 --75.9953 --75.9859 --75.9828 --75.9859 --75.9734 --75.9719 --75.9734 --75.9766 --75.9828 --75.9703 --75.9656 --75.9734 --75.9734 --75.9781 --75.975 --75.9797 --75.9766 --75.9656 --75.9641 --75.9844 --75.9688 --75.9688 --75.9703 --75.9688 --75.9609 --75.9766 --75.9766 --75.9719 --75.9797 --75.9688 --75.9594 --75.9812 --75.9766 --75.9828 --75.975 --75.9703 --75.9844 --75.9672 --75.9953 --75.975 --75.9828 --75.9719 --75.9719 --75.9703 --75.9672 --75.975 --75.9781 --75.9844 --75.9828 --75.975 --75.9578 --75.9656 --75.9734 --75.975 --75.9578 --75.9812 --75.9703 --75.9719 --75.9703 --75.9719 --75.9609 --75.9656 --75.9672 --75.9891 --75.9719 --75.9875 --75.9688 --75.9703 --75.9641 --75.9578 --75.9688 --75.9688 --75.9703 --75.9734 --75.9766 --75.9703 --75.975 --75.9734 --75.9688 --75.9797 --75.9594 --75.9641 --75.975 --75.9656 --75.9844 --75.9672 --75.9641 --75.9656 --75.9609 --75.9609 --75.9672 --75.9625 --75.9719 --75.9734 --75.9734 --75.9547 --75.9672 --75.9641 --75.9734 --75.9625 --75.9734 --75.9703 --75.975 --75.9922 --75.9672 --75.9625 --75.9812 --75.9703 --75.9672 --75.9703 --75.9672 --75.9703 --75.9703 --75.975 --75.9766 --75.9906 --75.975 --75.9719 --75.9859 --75.9594 --75.9719 --75.9547 --75.9719 --75.9703 --75.9703 --75.9594 --75.9688 --75.9641 --75.9594 --75.9844 --75.9547 --75.9688 --75.975 --75.9719 --75.9609 --75.9703 --75.9688 --75.9578 --75.9641 --75.9594 --75.9578 --75.975 --75.9656 --75.9688 --75.9625 --75.9531 --75.9563 --75.9641 --75.9594 --75.9641 --75.9609 --75.9578 --75.9719 --75.9547 --75.9563 --75.9703 --75.9672 --75.9578 --75.9734 --75.9734 --75.9594 --75.9656 --75.9578 --75.9516 --75.9578 --75.9563 --75.9563 --75.9609 --75.9516 --75.9688 --75.9422 --75.9516 --75.9688 --75.9656 --75.9641 --75.9547 --75.9531 --75.9734 --75.9578 --75.9469 --75.9625 --75.9594 --75.9375 --75.9594 --75.9641 --75.9625 --75.9531 --75.9422 --75.95 --75.95 --75.9578 --75.9547 --75.9609 --75.9484 --75.9484 --75.9547 --75.9469 --75.9641 --75.9563 --75.9328 --75.9547 --75.95 --75.9578 --75.9563 --75.9531 --75.9563 --75.9359 --75.9594 --75.95 --75.9609 --75.9531 --75.9594 --75.9547 --75.9656 --75.9594 --75.9578 --75.9516 --75.9516 --75.9484 --75.9516 --75.9563 --75.9547 --75.9531 --75.9453 --75.9531 --75.9688 --75.9516 --75.9594 --75.9516 --75.95 --75.9578 --75.9625 --75.9563 --75.9594 --75.9609 --75.9703 --75.9734 --75.9609 --75.9672 --75.9531 --75.9625 --75.9625 --75.9563 --75.9734 --75.9656 --75.9641 --75.9578 --75.9656 --75.9563 --75.9656 --75.9672 --75.9625 --75.9688 --75.9594 --75.9641 --75.9688 --75.9656 --75.9625 --75.9812 --75.9594 --75.9672 --75.9656 --75.9547 --75.9563 --75.9594 --75.9703 --75.9641 --75.9688 --75.9531 --75.95 --75.9594 --75.9469 --75.9547 --75.9563 --75.9609 --75.9672 --75.9563 --75.9578 --75.9547 --75.9609 --75.9469 --75.9594 --75.9594 --75.9484 --75.9625 --75.9641 --75.9547 --75.9531 --75.9484 --75.9547 --75.9484 --75.9422 --75.9594 --75.9516 --75.9609 --75.9672 --75.9672 --75.9609 --75.9516 --75.9594 --75.9781 --75.9563 --75.9688 --75.9703 --75.9625 --75.9563 --75.9437 --75.9578 --75.9547 --75.9609 --75.9688 --75.9609 --75.9594 --75.9609 --75.9547 --75.9719 --75.9656 --75.9578 --75.9688 --75.975 --75.9594 --75.9609 --75.9609 --75.9563 --75.9656 --75.9563 --75.9563 --75.9719 --75.9578 --75.9609 --75.9625 --75.9578 --75.9563 --75.9578 --75.9563 --75.95 --75.9594 --75.9594 --75.9594 --75.975 --75.9641 --75.9703 --75.9578 --75.9594 --75.9734 --75.9656 --75.9516 --75.9766 --75.9656 --75.9656 --75.9594 --75.9688 --75.9656 --75.9609 --75.9766 --75.9656 --75.9734 --75.9516 --75.9609 --75.9547 --75.9453 --75.9672 --75.9625 --75.9594 --75.9609 --75.9656 --75.9609 --75.9656 --75.9656 --75.9578 --75.9625 --75.9453 --75.9531 --75.9719 --75.9734 --75.9656 --75.9516 --75.9609 --75.9688 --75.9594 --75.9719 --75.9641 --75.9641 --75.9531 --75.95 --75.9437 --75.9437 --75.9594 --75.9516 --75.9359 --75.9609 --75.9469 --75.9453 --75.9391 --75.9437 --75.9531 --75.9531 --75.9563 --75.9547 --75.9547 --75.9719 --75.9672 --75.9641 --75.9609 --75.9766 --75.9484 --75.9563 --75.9594 --75.9547 --75.9578 --75.9609 --75.9516 --75.9547 --75.9594 --75.9578 --75.9656 --75.9516 --75.9531 --75.9422 --75.9516 --75.9453 --75.95 --75.9625 --75.95 --75.9531 --75.9641 --75.9703 --75.9594 --75.9531 --75.9563 --75.9594 --75.9516 --75.9719 --75.9672 --75.9531 --75.9703 --75.9547 --75.9641 --75.9688 --75.9547 --75.9547 --75.9625 --75.9641 --75.9656 --75.9609 --75.95 --75.9547 --75.9531 --75.9531 --75.9547 --75.9609 --75.9641 --75.9594 --75.9594 --75.9547 --75.9469 --75.9625 --75.9734 --75.9609 --75.9516 --75.975 --75.9672 --75.9594 --75.9609 --75.9609 --75.95 --75.9609 --75.9766 --75.9609 --75.9563 --75.95 --75.9625 --75.9641 --75.9656 --75.9516 --75.9594 --75.9594 --75.9563 --75.9641 --75.9672 --75.9609 - -2 -4.0025 -100.002 - -0 -1 - -0 diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.ft1 b/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.ft1 deleted file mode 100644 index 4c447e75e7..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/mrf3.ses.ft1 +++ /dev/null @@ -1,14 +0,0 @@ -ParmFitness: Unnamed multiple run protocol - FitnessGenerator: iclamp_up - RunStatement: 2, LinearCircuit[0].I6_amp1 = 0.2 - RegionFitness: LinearCircuit[0].Ve - - FitnessGenerator: iclamp_down - RunStatement: 2, LinearCircuit[0].I6_amp1 = -0.2 - RegionFitness: LinearCircuit[0].Ve - - Parameters: - "Ri", 100, 1e+01, 1e+03, 1, 1 - "Cm", 1, 1e-09, 1e+09, 1, 1 - "Rm", 10000, 1e-09, 1e+09, 1, 1 -End ParmFitness diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/params.hoc b/allensdk/internal/model/biophysical/passive_fitting/passive/params.hoc deleted file mode 100644 index 8403a0e1bb..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/params.hoc +++ /dev/null @@ -1,44 +0,0 @@ -Ri = 100 -Cm = 1 -Rm = 10000 - -proc init() { - forall { - Ra = Ri - cm = Cm - g_pas = 1 / Rm - } - finitialize(v_init) - if (cvode.active()) { - cvode.re_init() - } else { - fcurrent() - } - frecord_init() -} - -proc region_areas() { local _sum - _sum = 0 - - forsec "soma" for(x) { - _sum += area(x) - } - - forsec "axon" for(x) { - _sum += area(x) - } - - print("A1 ", _sum) - - _sum = 0 - - forsec "dend" for(x) { - _sum += area(x) - } - - forsec "apic" for(x) { - _sum += area(x) - } - - print("A2 ", _sum) -} \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/pyr_params.hoc b/allensdk/internal/model/biophysical/passive_fitting/passive/pyr_params.hoc deleted file mode 100644 index 620813a92f..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/pyr_params.hoc +++ /dev/null @@ -1,28 +0,0 @@ -Ri = 100 -CmD = 2 -CmS = 1 -Rm = 10000 - -proc init() { - forall { - Ra = Ri - cm = CmS - g_pas = 1 / Rm - } - - forsec "dend" { - cm = CmD - } - - forsec "apic" { - cm = CmD - } - - finitialize(v_init) - if (cvode.active()) { - cvode.re_init() - } else { - fcurrent() - } - frecord_init() -} diff --git a/allensdk/internal/model/biophysical/passive_fitting/passive/setup.hoc b/allensdk/internal/model/biophysical/passive_fitting/passive/setup.hoc deleted file mode 100644 index 82202e9b99..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/passive/setup.hoc +++ /dev/null @@ -1,3 +0,0 @@ -load_file("iclamp.ses") -load_file("params.hoc") -load_file("mrf.ses") diff --git a/allensdk/internal/model/biophysical/passive_fitting/preprocess.py b/allensdk/internal/model/biophysical/passive_fitting/preprocess.py deleted file mode 100644 index 08cc1fe644..0000000000 --- a/allensdk/internal/model/biophysical/passive_fitting/preprocess.py +++ /dev/null @@ -1,80 +0,0 @@ -import allensdk.internal.model.biophysical.ephys_utils as ephys_utils -import logging -import numpy as np -import pandas as pd - -_passive_fit_log = logging.getLogger( - 'allensdk.model.biophysical.passive_fitting.preprocess') - -def get_passive_fit_data(cap_check_sweeps, data_set): - bridge_balances = [s['bridge_balance_mohm'] for s in cap_check_sweeps] - bridge_avg = np.array(bridge_balances).mean() - _passive_fit_log.debug("bridge avg {:.2f}".format(bridge_avg)) - - initialized = False - for idx, s in enumerate(cap_check_sweeps): - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, - s['sweep_number']) - if v is None: - continue - up_idxs, down_idxs = get_cap_check_indices(i) - - down_idx_interval = down_idxs[1] - down_idxs[0] - skip_count = 0 - for j in range(len(up_idxs)): - if j == 0: - avg_up = v[(up_idxs[j] - 400):down_idxs[j + 1]] - avg_down = v[(down_idxs[j] - 400):up_idxs[j]] - elif j == len(up_idxs) - 1: - avg_up = avg_up + v[(up_idxs[j] - 400):-2] - avg_down = avg_down + v[(down_idxs[j] - 400):up_idxs[j]] - else: - avg_up = avg_up + v[(up_idxs[j] - 400):down_idxs[j + 1]] - avg_down = avg_down + v[(down_idxs[j] - 400):up_idxs[j]] - avg_up /= len(up_idxs) - skip_count - avg_down /= len(up_idxs) - skip_count - if not initialized: - grand_up = avg_up - avg_up[0:400].mean() - grand_down = avg_down - avg_down[0:400].mean() - initialized = True - else: - grand_up = grand_up + (avg_up - avg_up[0:400].mean()) - grand_down = grand_down + (avg_down - avg_down[0:400].mean()) - grand_up /= len(cap_check_sweeps) - grand_down /= len(cap_check_sweeps) - - t = 0.005 * np.arange(len(grand_up)) # in ms, assumes 200kHz sampling rate] - - grand_up_data = np.column_stack((t, grand_up)) - grand_down_data = np.column_stack((t, grand_down)) - - grand_diff = (grand_up + grand_down) / grand_up - avg_grand_diff = pd.rolling_mean(pd.Series(grand_diff, index=t), 100) - threshold = 0.2 - start_index = np.flatnonzero(t >= 4.0)[0] - escape_indexes = np.flatnonzero(np.abs(avg_grand_diff.values[start_index:]) > threshold) + start_index - if len(escape_indexes) < 1: - escape_index = len(t) - 1 - else: - escape_index = escape_indexes[0] - escape_t = t[escape_index] - - return { - 'grand_up': grand_up_data, - 'grand_down': grand_down_data, - 'escape_t': escape_t, - 'bridge_avg': bridge_avg - } - -def get_cap_check_indices(i): - # Assumes that there is a test pulse followed by the stimulus pulses (downward first) - di = np.diff(i) - up_idx = np.flatnonzero(di > 0) - down_idx = np.flatnonzero(di < 0) - - return up_idx[2::2], down_idx[1::2] - - -def main(): - pass -if __name__ == "__main__": main() diff --git a/allensdk/internal/model/biophysical/run_optimize.py b/allensdk/internal/model/biophysical/run_optimize.py deleted file mode 100755 index 6d16845116..0000000000 --- a/allensdk/internal/model/biophysical/run_optimize.py +++ /dev/null @@ -1,233 +0,0 @@ -import os -import shutil -import subprocess -import logging -import logging.config as lc -import allensdk.core.json_utilities as ju -from allensdk.core.nwb_data_set import NwbDataSet -from pkg_resources import resource_filename # @UnresolvedImport -from allensdk.internal.api.queries.optimize_config_reader import OptimizeConfigReader -from allensdk.model.biophys_sim.config import Config -from allensdk.internal.model.biophysical.make_deap_fit_json import Report -from allensdk.internal.api.queries.biophysical_module_api import BiophysicalModuleApi -import allensdk.model.biophysical as hoc_location -from six.moves import reduce - - -class RunOptimize(object): - _log = logging.getLogger('allensdk.internal.model.biophysical.run_optimize') - - def __init__(self, - input_json, - output_json): - self.input_json = input_json - self.output_json = output_json - self.app_config = None - self.manifest = None - self.data_set = None - - - def load_manifest(self): - self.app_config = Config().load(self.input_json) - self.manifest = self.app_config.manifest - self.data_set = NwbDataSet(self.manifest.get_path('stimulus_path')) - - - def nrnivmodl(self): - RunOptimize._log.debug("nrnivmodl") - - subprocess.call(['nrnivmodl', './modfiles']) - - - def info(self, lims_json_path): - ''' return a string that a bash script can use - to find the working directory, etc. to clean up. - ''' - ocr = OptimizeConfigReader() - ocr.read_lims_file(lims_json_path) - - print(self.app_config.data['runs'][0]['specimen_id']) - print(self.manifest.get_path('BASEDIR')) - - - def copy_local(self): - ''' - Note - ---- - For files that aren't needed for local debugging, use write_manifest instead. - ''' - self.load_manifest() - - modfile_dir = self.manifest.get_path('MODFILE_DIR') - - if not os.path.exists(modfile_dir): - os.mkdir(modfile_dir) - - output_dir = self.manifest.get_path('WORKDIR') - if not os.path.exists(output_dir): - os.mkdir(output_dir) - - modfiles = [self.manifest.get_path(key) for key,info - in self.manifest.path_info.items() - if 'format' in info and info['format'] == 'MODFILE'] - for from_file in modfiles: - RunOptimize._log.debug("copying %s to %s" % (from_file, modfile_dir)) - shutil.copy(from_file, modfile_dir) - - shutil.copy(resource_filename(hoc_location.__name__, - 'cell.hoc'), - self.manifest.get_path('BASEDIR')) - - - def generate_manifest_rma(self, - neuronal_model_id, - manifest_path, - api_url=None): - ''' - Note - ---- - Other necessary files are also written. - ''' - import json - from allensdk.api.api import Api - - bma = BiophysicalModuleApi(api_url) - data = bma.get_neuronal_models(neuronal_model_id) - - ocr = OptimizeConfigReader() - ocr.read_lims_message(data, 'lims_message.json') - - with open('lims_message.json', 'w') as f: - f.write(json.dumps(data[0], sort_keys=True, indent=2)) - - ocr.to_manifest(manifest_path) - - - def generate_manifest_lims(self, - lims_json_path, - manifest_path): - ''' - Note - ---- - Other necessary files are also written. - ''' - ocr = OptimizeConfigReader() - ocr.read_lims_file(lims_json_path) - - ocr.to_manifest(manifest_path) - - - def start_specimen(self): - import allensdk.internal.model.biophysical.run_passive_fit as run_passive_fit - import allensdk.internal.model.biophysical.fit_stage_1 as fit_stage_1 - import allensdk.internal.model.biophysical.fit_stage_2 as fit_stage_2 - - self.load_manifest() - - self.passive_fit_data = \ - run_passive_fit.run_passive_fit(self.app_config) - - ju.write(self.manifest.get_path('passive_fit_data'), - self.passive_fit_data) - - self.stage_1_jobs = \ - fit_stage_1.prepare_stage_1(self.app_config, - self.passive_fit_data) - - ju.write(self.manifest.get_path('stage_1_jobs'), - self.stage_1_jobs) - fit_stage_1.run_stage_1(self.stage_1_jobs) - - output_directory = self.manifest.get_path('WORKDIR') - stage_2_jobs = fit_stage_2.prepare_stage_2(output_directory) - fit_stage_2.run_stage_2(stage_2_jobs) - - - def make_fit(self): - self.load_manifest() - - fit_types = ["f9", "f13"] - - best_fit_values = { fit_type: None for fit_type in fit_types } - - specimen_id = self.app_config.data['runs'][0]['specimen_id'] - - for fit_type in fit_types: - fit_type_dir = self.manifest.get_path('fit_type_path', fit_type) - - if os.path.exists(fit_type_dir): - report = Report(self.app_config, - fit_type) - report.generate_fit_file() - if fit_type in best_fit_values.keys(): - best_fit_values[fit_type] = report.best_fit_value() - - best_fit_type, min_fit_value = reduce(lambda a, b: a if (a[1] < b[1]) else b, - (i for i in best_fit_values.items() if i[1] is not None)) - best_fit_file = self.manifest.get_path('output_fit_file', - specimen_id, - best_fit_type) - - lims_upload_config = OptimizeConfigReader() - lims_upload_config.read_json(self.manifest.get_path('neuronal_model_data')) - - lims_upload_config.update_well_known_file(best_fit_file, - well_known_file_type_id=OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) - lims_upload_config.write_file(output_json) - - -def main(command, input_json, output_json): - ''' Entry point for module. - :param command: select behavior, nrnivmodl or simulate - :type command: string - :param lims_strategy_json: path to json file output from lims. - :type lims_strategy_json: string - :param lims_response_json: path to json file returned to lims. - :type lims_response_json: string - ''' - - o = RunOptimize(input_json, - output_json) - - if 'LOG_CFG' in os.environ: - log_config = os.environ['LOG_CFG'] - else: - log_config = resource_filename('allensdk.model.biophysical', - 'logging.conf') - os.environ['LOG_CFG'] = log_config - lc.fileConfig(log_config) - - if 'nrnivmodl' == command: - o.nrnivmodl() - elif 'info' == command: - o.info(input_json) - elif 'generate_manifest_rma' == command: - o.generate_manifest_rma(input_json, output_json) - elif 'generate_manifest_lims' == command: - o.generate_manifest_lims(input_json, output_json) - elif 'write_manifest' == command: - o.write_manifest() - elif 'copy_local' == command: - o.copy_local() - elif 'start_specimen' == command: - o.start_specimen() - elif 'make_fit' == command: - o.make_fit() - else: - RunOptimize._log.error("no command") - - print('done') - - -if __name__ == '__main__': - import sys - - command, input_json, output_json = sys.argv[-3:] - - RunOptimize._log.debug("command: %s" % (command)) - RunOptimize._log.debug("input json: %s" % (input_json)) - RunOptimize._log.debug("output json: %s" % (output_json)) - - main(command, input_json, output_json) - - RunOptimize._log.debug("success") diff --git a/allensdk/internal/model/biophysical/run_optimize.sh b/allensdk/internal/model/biophysical/run_optimize.sh deleted file mode 100755 index bc4fbdbeea..0000000000 --- a/allensdk/internal/model/biophysical/run_optimize.sh +++ /dev/null @@ -1,33 +0,0 @@ -set -x -set -o errexit - -export ALLENSDK_PATH=/shared/bioapps/infoapps/lims2_modules/lib/allensdk - -NEURON_HOME=/shared/utils.x86_64/nrn-7.4-1370 -export PYTHONPATH=${NEURON_HOME}/lib/python:${ALLENSDK_PATH}:${PYTHONPATH} - -export PYTHON_HOME=/shared/utils.x86_64/python-2.7 -export PYTHON=${PYTHON_HOME}/bin/python -export PATH=${PYTHON_HOME}/bin:${NEURON_HOME}/x86_64/bin:${PATH} - -IN_JSON=$1 -OUT_JSON=$2 - -IN_JSON_ABSOLUTE=$(readlink -f ${IN_JSON}) -BASEDIR=$(dirname ${IN_JSON_ABSOLUTE}) -cd ${BASEDIR} -echo 'Directory changed to ' `pwd` - -export RUN_OPTIMIZE="${PYTHON} -W ignore -m allensdk.internal.model.biophysical.run_optimize" -MANIFEST=manifest_sdk.json - -rm -rf x86_64 modfiles work cell.hoc ${MANIFEST} - -${RUN_OPTIMIZE} generate_manifest_lims ${IN_JSON} ${MANIFEST} -${RUN_OPTIMIZE} copy_local ${MANIFEST} ${OUT_JSON} -${RUN_OPTIMIZE} nrnivmodl ${MANIFEST} ${OUT_JSON} -${RUN_OPTIMIZE} start_specimen ${MANIFEST} ${OUT_JSON} -${RUN_OPTIMIZE} make_fit ${MANIFEST} ${OUT_JSON} - -# clean up -rm -rf x86_64 modfiles work cell.hoc debug.log ${MANIFEST} diff --git a/allensdk/internal/model/biophysical/run_optimize_workflow.py b/allensdk/internal/model/biophysical/run_optimize_workflow.py deleted file mode 100644 index e2270437e5..0000000000 --- a/allensdk/internal/model/biophysical/run_optimize_workflow.py +++ /dev/null @@ -1,12 +0,0 @@ -import sys -from subprocess import call -from pkg_resources import resource_filename #@UnresolvedImport - -the_script = resource_filename(__name__, 'run_optimize.sh') - -cmd = ['/bin/bash', the_script] -cmd.extend(sys.argv[1:]) - -print(' '.join(cmd)) - -call(cmd) \ No newline at end of file diff --git a/allensdk/internal/model/biophysical/run_passive_fit.py b/allensdk/internal/model/biophysical/run_passive_fit.py deleted file mode 100644 index b92c29b4ce..0000000000 --- a/allensdk/internal/model/biophysical/run_passive_fit.py +++ /dev/null @@ -1,144 +0,0 @@ -import os -import sys -import subprocess -import numpy as np -import allensdk.internal.model.biophysical.ephys_utils as ephys_utils -from .passive_fitting import preprocess as passive_prep -import allensdk.core.json_utilities as ju -from allensdk.model.biophys_sim.config import Config -from allensdk.core.nwb_data_set import NwbDataSet -from allensdk.internal.model.biophysical.passive_fitting import neuron_passive_fit -from allensdk.internal.model.biophysical.passive_fitting import neuron_passive_fit2 -from allensdk.internal.model.biophysical.passive_fitting import neuron_passive_fit_elec -from pkg_resources import resource_filename #@UnresolvedImport -import logging -import logging.config as lc - - -_run_passive_fit_log = logging.getLogger('allensdk.internal.model.biophysical.run_passive_fit') - - -def run_passive_fit(description): - output_directory = description.manifest.get_path('WORKDIR') - neuronal_model = ju.read(description.manifest.get_path('neuronal_model_data')) - specimen_data = neuronal_model['specimen'] - - is_spiny = not any(t['name'] == u'dendrite type - aspiny' for t in specimen_data['specimen_tags']) - - all_sweeps = specimen_data['ephys_sweeps'] - if not os.path.exists(output_directory): - os.makedirs(output_directory) - - cap_check_sweeps, _, _ = \ - ephys_utils.get_sweeps_of_type('C1SQCAPCHK', - all_sweeps) - - passive_fit_data = {} - - if len(cap_check_sweeps) > 0: - data_set = NwbDataSet(description.manifest.get_path('stimulus_path')) - d = passive_prep.get_passive_fit_data(cap_check_sweeps, data_set); - - grand_up_file = os.path.join(output_directory, 'upbase.dat') - np.savetxt(grand_up_file, d['grand_up']) - - grand_down_file = os.path.join(output_directory, 'downbase.dat') - np.savetxt(grand_down_file, d['grand_down']) - - passive_fit_data["bridge"] = d['bridge_avg'] - passive_fit_data["escape_time"] = d['escape_t'] - - fit_1_file = description.manifest.get_path('fit_1_file') - fit_1_params = subprocess.check_output([sys.executable, - '-m', neuron_passive_fit.__name__, - str(d['escape_t']), - os.path.realpath(description.manifest.get_path('manifest')) ]) - passive_fit_data['fit_1'] = ju.read(fit_1_file) - - fit_2_file = description.manifest.get_path('fit_2_file') - - fit_2_params = subprocess.check_output([sys.executable, - '-m', neuron_passive_fit2.__name__, - str(d['escape_t']), - os.path.realpath(description.manifest.get_path('manifest')) ]) - passive_fit_data['fit_2'] = ju.read(fit_2_file) - - fit_3_file = description.manifest.get_path('fit_3_file') - fit_3_params = subprocess.check_output([sys.executable, - '-m', neuron_passive_fit_elec.__name__, - str(d['escape_t']), - str(d['bridge_avg']), - str(1.0), - os.path.realpath(description.manifest.get_path('manifest')) ]) - passive_fit_data['fit_3'] = ju.read(fit_3_file) - - # Check for potentially problematic outcomes - cm_rel_delta = (passive_fit_data["fit_1"]["Cm"] - passive_fit_data["fit_3"]["Cm"]) / passive_fit_data["fit_1"]["Cm"] - if passive_fit_data["fit_2"]["err"] < passive_fit_data["fit_1"]["err"]: - _run_passive_fit_log.debug("Fixed Ri gave better results than original") - if passive_fit_data["fit_2"]["err"] < passive_fit_data["fit_3"]["err"]: - _run_passive_fit_log.debug("Using fixed Ri results") - passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_2"] - else: - _run_passive_fit_log.debug("Using electrode results") - passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_3"] - elif abs(cm_rel_delta) > 0.1: - _run_passive_fit_log.debug("Original and electrode fits not in sync:") - _run_passive_fit_log.debug("original Cm: " + str(passive_fit_data["fit_1"]["Cm"])) - _run_passive_fit_log.debug("w/ electrode Cm: " + str(passive_fit_data["fit_3"]["Cm"])) - if passive_fit_data["fit_1"]["err"] < passive_fit_data["fit_3"]["err"]: - _run_passive_fit_log.debug("Original has lower error") - passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_1"] - else: - _run_passive_fit_log.debug("Electrode has lower error") - passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_3"] - else: - passive_fit_data["fit_for_next_step"] = passive_fit_data["fit_1"] - - ra = passive_fit_data["fit_for_next_step"]["Ri"] - if is_spiny: - combo_cm = passive_fit_data["fit_for_next_step"]["Cm"] - a1 = passive_fit_data["fit_for_next_step"]["A1"] - a2 = passive_fit_data["fit_for_next_step"]["A2"] - cm1 = 1.0 - cm2 = (combo_cm * (a1 + a2) - a1) / a2 - else: - cm1 = passive_fit_data["fit_for_next_step"]["Cm"] - cm2 = passive_fit_data["fit_for_next_step"]["Cm"] - else: - _run_passive_fit_log.debug("No cap check trace found") - ra = 100.0 - cm1 = 1.0 - if is_spiny: - cm2 = 2.0 - else: - cm2 = 1.0 - - passive_fit_data['ra'] = ra - passive_fit_data['cm1'] = cm1 - passive_fit_data['cm2'] = cm2 - - return passive_fit_data - - -def main(limit, manifest_path): - app_config = Config() - description = app_config.load(manifest_path) - - if 'LOG_CFG' in os.environ: - log_config = os.environ['LOG_CFG'] - else: - log_config = resource_filename('allensdk.model.biophysical', - 'logging.conf') - os.environ['LOG_CFG'] = log_config - lc.fileConfig(log_config) - - run_passive_fit(description) - - -if __name__ == "__main__": - limit = sys.argv[-2] - manifest_path = sys.argv[-1] - - main(limit, manifest_path) - diff --git a/allensdk/internal/model/biophysical/run_simulate.sh b/allensdk/internal/model/biophysical/run_simulate.sh deleted file mode 100755 index 99b0fce1e7..0000000000 --- a/allensdk/internal/model/biophysical/run_simulate.sh +++ /dev/null @@ -1,31 +0,0 @@ -set -o errexit - -export ALLENSDK_PATH=/shared/bioapps/infoapps/lims2_modules/lib/allensdk - -NEURON_HOME=/shared/utils.x86_64/nrn-7.4-1370 -export PYTHONPATH=${NEURON_HOME}/lib/python:${ALLENSDK_PATH}:${PYTHONPATH} - -export PYTHON_HOME=/shared/utils.x86_64/python-2.7 -export PYTHON=${PYTHON_HOME}/bin/python -export PATH=${PYTHON_HOME}/bin:${NEURON_HOME}/x86_64/bin:${PATH} - -IN_JSON=$1 -OUT_JSON=$2 - -IN_JSON_ABSOLUTE=$(readlink -f ${IN_JSON}) -BASEDIR=$(dirname ${IN_JSON_ABSOLUTE}) -cd ${BASEDIR} -echo 'Directory changed to ' `pwd` - -export SIMULATE="${PYTHON} -W ignore -m allensdk.internal.model.biophysical.run_simulate_lims" -MANIFEST=manifest_sdk.json - -rm -rf x86_64 modfiles cell.hoc work ${MANIFEST} - -${SIMULATE} generate_manifest_lims ${IN_JSON} ${MANIFEST} -${SIMULATE} copy_local ${MANIFEST} ${OUT_JSON} -${SIMULATE} nrnivmodl ${MANIFEST} ${OUT_JSON} -${SIMULATE} start_specimen ${MANIFEST} ${OUT_JSON} - -# clean up -rm -rf x86_64 modfiles cell.hoc work ${MANIFEST} diff --git a/allensdk/internal/model/biophysical/run_simulate_lims.py b/allensdk/internal/model/biophysical/run_simulate_lims.py deleted file mode 100644 index 318ee373fe..0000000000 --- a/allensdk/internal/model/biophysical/run_simulate_lims.py +++ /dev/null @@ -1,137 +0,0 @@ -import logging -import os -import sys -import traceback -import logging.config as lc -import shutil -from pkg_resources import resource_filename #@UnresolvedImport -from allensdk.model.biophysical.run_simulate import RunSimulate - - -class RunSimulateLims(RunSimulate): - _log = logging.getLogger('allensdk.internal.model.biophysical.run_simulate_lims') - - def __init__(self, - input_json, - output_json): - super(RunSimulateLims, self).__init__(input_json, output_json) - - def generate_manifest_rma(self, - neuronal_model_run_id, - manifest_path, - api_url=None): - ''' - Note - ---- - Other necessary files are also written. - ''' - import json - from allensdk.internal.api.queries.biophysical_module_api import BiophysicalModuleApi - from allensdk.internal.api.queries.biophysical_module_reader import BiophysicalModuleReader - - bma = BiophysicalModuleApi(api_url) - data = bma.get_neuronal_model_runs(neuronal_model_run_id) - - lr = BiophysicalModuleReader() - lr.read_lims_message(data, 'lims_message.json') - - with open('lims_message.json', 'w') as f: - f.write(json.dumps(data[0], sort_keys=True, indent=2)) - - lr.to_manifest(manifest_path) - - def generate_manifest_lims(self, - lims_data_path, - manifest_path): - ''' - Note - ---- - Other necessary files are also written. - ''' - from allensdk.internal.api.queries.biophysical_module_reader import BiophysicalModuleReader - - self.lims_json = lims_data_path - - lr = BiophysicalModuleReader() - lr.read_lims_file(self.lims_json) - - lr.to_manifest(manifest_path) - - def copy_local(self): - import allensdk.model.biophysical.run_simulate - - self.load_manifest() - - modfile_dir = self.manifest.get_path('MODFILE_DIR') - - if not os.path.exists(modfile_dir): - os.mkdir(modfile_dir) - - workdir = self.manifest.get_path('WORKDIR') - - if not os.path.exists(workdir): - os.mkdir(workdir) - - modfiles = [self.manifest.get_path(key) for key,info - in self.manifest.path_info.items() - if 'format' in info and info['format'] == 'MODFILE'] - - for from_file in modfiles: - RunSimulate._log.debug("copying %s to %s" % (from_file, modfile_dir)) - shutil.copy(from_file, modfile_dir) - - shutil.copy(self.manifest.get_path('fit_parameters'), - workdir) - - shutil.copyfile(self.manifest.get_path('stimulus_path'), - self.manifest.get_path('output_path')) - - shutil.copy(resource_filename(allensdk.model.biophysical.run_simulate.__name__, - 'cell.hoc'), - os.curdir) - - -def main(command, lims_strategy_json, lims_response_json): - ''' Entry point for module. - :param command: select behavior, nrnivmodl or simulate - :type command: string - :param lims_strategy_json: path to json file output from lims. - :type lims_strategy_json: string - :param lims_response_json: path to json file returned to lims. - :type lims_response_json: string - ''' - rs = RunSimulateLims(lims_strategy_json, - lims_response_json) - - RunSimulateLims._log.debug("command: %s" % (command)) - RunSimulateLims._log.debug("lims strategy json: %s" % (lims_strategy_json)) - RunSimulateLims._log.debug("lims upload json: %s" % (lims_response_json)) - - log_config = resource_filename('allensdk.model.biophysical.run_simulate', - 'logging.conf') - lc.fileConfig(log_config) - os.environ['LOG_CFG'] = log_config - - if 'nrnivmodl' == command: - rs.nrnivmodl() - elif 'copy_local' == command: - rs.copy_local() - elif 'generate_manifest_rma' == command: - rs.generate_manifest_rma(input_json, output_json) - elif 'generate_manifest_lims' == command: - rs.generate_manifest_lims(input_json, output_json) - elif 'generate_manifest_lims' == command: - rs.generate_manifest_lims(input_json, output_json) - else: - rs.simulate() - - -if __name__ == '__main__': - command, input_json, output_json = sys.argv[-3:] - - try: - main(command, input_json, output_json) - RunSimulateLims._log.debug("success") - except Exception as e: - RunSimulate._log.error(traceback.format_exc()) - exit(1) diff --git a/allensdk/internal/model/biophysical/run_simulate_workflow.py b/allensdk/internal/model/biophysical/run_simulate_workflow.py deleted file mode 100644 index a030ade7a8..0000000000 --- a/allensdk/internal/model/biophysical/run_simulate_workflow.py +++ /dev/null @@ -1,12 +0,0 @@ -import sys -from subprocess import call -from pkg_resources import resource_filename #@UnresolvedImport - -the_script = resource_filename(__name__, 'run_simulate.sh') - -cmd = ['/bin/bash', the_script] -cmd.extend(sys.argv[1:]) - -print(' '.join(cmd)) - -call(cmd) \ No newline at end of file diff --git a/allensdk/internal/model/data_access.py b/allensdk/internal/model/data_access.py deleted file mode 100644 index f42999d371..0000000000 --- a/allensdk/internal/model/data_access.py +++ /dev/null @@ -1,104 +0,0 @@ -from allensdk.core.nwb_data_set import NwbDataSet -from scipy import signal -import numpy as np - -def load_sweep(file_name, sweep_number, desired_dt=None, cut=0, bessel=False): - '''load a data sweep and do specified data processing. - Inputs: - file_name: string - name of .nwb data file - sweep_number: - number specifying the sweep to be loaded - desired_dt: - the size of the time step the data should be subsampled to - cut: - indicie of which to start reporting data (i.e. cut off data before this indicie) - bessel: dictionary - contains parameters 'N' and 'Wn' to implement standard python bessel filtering - Returns: - dictionary containing - voltage: array - current: array - dt: time step of the returned data - start_idx: the index at which the first stimulus starts (excluding the test pulse) - ''' - ds = NwbDataSet(file_name) - data = ds.get_sweep(sweep_number) - - data["dt"] = 1.0 / data["sampling_rate"] - - if cut > 0: - data["response"] = data["response"][cut:] - data["stimulus"] = data["stimulus"][cut:] - - if bessel: - sample_freq = 1. / data["dt"] - filt_coeff = (bessel["freq"]) / (sample_freq / 2.) # filter fraction of Nyquist frequency - b, a = signal.bessel(bessel["N"], filt_coeff, "low") - data['response'] = signal.filtfilt(b, a, data['response'], axis=0) - - if desired_dt is not None: - if data["dt"] != desired_dt: - data["response"] = subsample_data(data["response"], "mean", data["dt"], desired_dt) - data["stimulus"] = subsample_data(data["stimulus"], "mean", data["dt"], desired_dt) - data["start_idx"] = int(data["index_range"][0] / (desired_dt / data["dt"])) - data["dt"] = desired_dt - - if "start_idx" not in data: - data["start_idx"] = data["index_range"][0] - - return { - "voltage": data["response"], - "current": data["stimulus"], - "dt": data["dt"], - "start_idx": data["start_idx"] - } - - -def load_sweeps(file_name, sweep_numbers, dt=None, cut=0, bessel=False): - '''load sweeps and do specified data processing. - Inputs: - file_name: string - name of .nwb data file - sweep_numbers: - sweep numbers to be loaded - desired_dt: - the size of the time step the data should be subsampled to - cut: - indicie of which to start reporting data (i.e. cut off data before this indicie) - bessel: dictionary - contains parameters 'N' and 'Wn' to implement standard python bessel filtering - Returns: - dictionary containing - voltage: list of voltage trace arrays - current: list of current trace arrays - dt: list of time step corresponding to each array of the returned data - start_idx: list of the indicies at which the first stimulus starts (excluding - the test pulse) in each returned sweep - ''' - data = [ load_sweep(file_name, sweep_number, dt, cut, bessel) for sweep_number in sweep_numbers ] - - return { - 'voltage': [ d['voltage'] for d in data ], - 'current': [ d['current'] for d in data ], - 'dt': [ d['dt'] for d in data ], - 'start_idx': [ d['start_idx'] for d in data ], - } - - -def subsample_data(data, method, present_time_step, desired_time_step): - if present_time_step > desired_time_step: - raise Exception("you desired time step is smaller than your present time step") - - # number of elements to average over - n = int(desired_time_step / present_time_step) - - data_subsampled = None - - if method == "mean": - # if n does not divide evenly into the length of the array, crop off the end - end = n * int(len(data) / n) - - return np.mean(data[:end].reshape(-1,n), 1) - - raise Exception("unknown subsample method: %s" % (method)) \ No newline at end of file diff --git a/allensdk/internal/model/glif/ASGLM.py b/allensdk/internal/model/glif/ASGLM.py deleted file mode 100644 index 4f26275e0f..0000000000 --- a/allensdk/internal/model/glif/ASGLM.py +++ /dev/null @@ -1,249 +0,0 @@ -import numpy as np -import itertools -import allensdk.internal.model.GLM as GLM -import logging -import statsmodels.api as sm -import matplotlib.pyplot as plt - -def ASGLM_pairwise(ks_int, I_stim, voltage, spike_ind, cinit, tauinit, SCL, dt, resting_potential, - SHORT_RUN=False, MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False): - '''Calculate the resistance and amplitude of the afterspike currents for - Parameters - ---------- - ks_int: list - initial possible k's (k=1/tau, where tau is the time constant of the exponential decay) - I_stim: list of arrays - input stimulus traces of sweeps - voltage: list of arrays - voltage of cell as a result of I_stim - spike_ind: list of arrays - each array contains the index of the spikes - cinit: float - membrane capacitance - tauinit: float - time constant of membrane - SCL: float - number of indicies that should be cut after a spike - dt: float - size of time step of injected current - Returns - ''' - - #Initialize post-spike filter parameters (MOST OF THESE ARE HARD-CODED currently) - nkt = 8000 # arbitrary length of filter WANT FILTER TO COVER A LENGTH OF TIME, WANT FILTER TO BE LONGER THAN LONGEST LENGTH ASC - DTsim = dt #DTsim = dt means filter is nkt*dt = 100 ms long in this case THIS SHOULD INDEED BE THE SAMPLE WIDTH - neye = 0 #no of identity basis vectors DELTA - f = 1e-3/dt #pre-factor for getting time units correct for bases - - taus_int=[1000./kk for kk in ks_int] #converting to ms - taus_filter = [f*j for j in taus_int] #convert ms time to filter time units 1/(dt*ks) - ks_list = [(1.0/(i)) for i in taus_filter] #use peak positions of rcos bumps as time-scales for exponential bases - ncos = 2 #no of bases!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - flag_exp = 1 #flag_exp = 1 means use exponential bases, else use raised-cosine bumps - vL = resting_potential - - # GLM fit with post-spike currents - tst = 0 #190000#355000 #time-step to start - npcut = int(SCL) # no of points to cut after each spike-initiation - - # Collect spikes between tst and tend - t0_list = [] - for mm in range(len(I_stim)): - tend = len(I_stim[mm]) - t0=[] - for jj in range(len(spike_ind[mm])): - if spike_ind[mm][jj]>tst and spike_ind[mm][jj]<tend: - t0.append(spike_ind[mm][jj]) - - t0_list.append(t0) - - #Create a list of pairs of ks - ks_pairs = list(itertools.combinations(ks_list,ncos)) - ks_pairs_in_SI_units= list(itertools.combinations(ks_int, ncos)) - if len(ks_pairs)!=10: - raise Exception('figure subplots will need to be changed as there is a different number than 10 ks_pairs.') - - #Initialize list to hold charge dump values and amp-vectors - fitprs_list = [] - llf_list = [] - R_list = [] - #Iterate over all pairs - if SHORT_RUN: - logging.warning("You are not doing all the ks pairs in ASGLM_pairwise") - ks_pairs=[ks_pairs[0]] - - R_for_all_ks_pairs=[] - asc_amp_for_all_ks_pairs=[] - El_for_all_ks_pairs=[] - C_for_all_ks_pairs=[] - llh_for_all_ks_pairs=[] - for ks_ind, (ks_fit_units, ks_SI_units) in enumerate(zip(ks_pairs, ks_pairs_in_SI_units)): - print('ks_fit_units', ks_fit_units) - #Create basis IPSPs - if MAKE_PLOT: - plotting_colors=['r', 'b', 'g', 'm', 'c'] - plt.figure(78, figsize=(20,10)) - basis_IPSP_list = [] - for rr in range(len(I_stim)): #loop over repeats - #find the basis of the entire trace - basis_IPSP, gg0 = GLM.create_basis_IPSP(neye,ncos,taus_filter,ks_fit_units,DTsim,t0_list[rr],I_stim[rr],nkt,flag_exp,npcut) - basis_IPSP_list.append(basis_IPSP) - #--Plot basis IPSPs between si and se - si = t0_list[0][0]-10 #plot start_ind - se = si+nkt+10 #plot end_ind - tvec = dt*np.arange(si-tst,se-tst) #convert time-steps to real time (in sec) - if MAKE_PLOT: - plt.figure(78) - plt.subplot(5,2, ks_ind+1) - plt.plot(1e3*tvec,basis_IPSP[si:se,:], lw=2, label=str(rr)) #1e3 plots time on x-axis in ms - plt.xlabel('time (ms)') - plt.title("k's "+str(ks_SI_units)) - if MAKE_PLOT: - plt.annotate('ASGLM (fit asc and R): AScurrent basis', - xy=(.4, .985), - xycoords='figure fraction', - horizontalalignment='left', verticalalignment='top', - fontsize=20) - plt.legend() - plt.tight_layout() - - if SHOW_PLOT: - plt.show(block=BLOCK) - - # cut spikes out of dv, v, i, and b_ipsp and put the different sweeps in lists - i_all_swps_list = [] - b_ipsp_all_swps_list = [] - v_all_swps_list = [] - dv_all_swps_list = [] - for ss in range(len(I_stim)): #loop over repeats - tend = len(I_stim[ss]) - i = I_stim[ss][tst:tend-1] - b_ipsp = basis_IPSP_list[ss][tst:tend-1] - - v = voltage[ss][tst:tend-1] - vs = voltage[ss][tst+1:tend] - dv = (vs-v)/dt #derivative of voltage - - #delete npcut points after spike from each qty - delpts = [] - for kk in range(len(t0_list[ss])): - delpts.append(range(int(t0_list[ss][kk])-tst,int(t0_list[ss][kk])-tst+npcut)) - - dv = np.delete(dv,delpts,0) - v = np.delete(v,delpts,0) - i = np.delete(i,delpts,0) - b_ipsp = np.delete(b_ipsp,delpts,0) - - v_all_swps_list.append(v) - dv_all_swps_list.append(dv) - i_all_swps_list.append(i) - b_ipsp_all_swps_list.append(b_ipsp) - - tvec = dt*np.arange(len(v)) - - # Compute amplitude each basis AS current using a GLM - if MAKE_PLOT: - plt.figure(79, figsize=(20, 12)) - plt.figure(80, figsize=(20, 12)) - R_for_each_sweep=[] - asc_amp_for_each_sweep=[] - llh_for_each_sweep=[] - for kkk, (v_spike_deleted, dv_spike_deleted, i_spike_deleted, b_ipsp_spikes_deleted) in \ - enumerate(zip(v_all_swps_list, dv_all_swps_list, i_all_swps_list, b_ipsp_all_swps_list)): - - #--fitting afterspike current amplitudes and resistance - inp = np.zeros((len(i_spike_deleted),ncos+1)) - inp[:,range(0,ncos)] = (1/cinit)*b_ipsp_spikes_deleted[:,range(ncos)] - inp[:,ncos] = -(v_spike_deleted-vL)/tauinit - out = dv_spike_deleted -i_spike_deleted/cinit#+ (v-vL)/tauinit - i/cinit - - try: - glm_fit = sm.GLM(out,inp,family=sm.families.Gaussian(sm.families.links.identity)) - res = glm_fit.fit() - fitprs = res.params #fitprs has [AMP OF ASC, TAU] - - llh=res.llf - fit_R=tauinit/(fitprs[ncos]*cinit) - fit_asc_amp=fitprs[:ncos] - #Compute and plot post-spike current (essentially multiply basis functions with correct amplitudes from GLM fit) - ipsc = np.sum(b_ipsp_spikes_deleted[:,0:ncos]*fit_asc_amp,1) #THIS IS TOTAL POSTSPIKE CURRENT - except Exception as e: - logging.warning("fit didn't work: " + str(e)) - llh=np.nan - fit_R=np.NAN - fit_asc_amp=np.ones(ncos)*np.NAN - ipsc=np.ones(len(b_ipsp_spikes_deleted[:,0]))*np.NAN - - R_for_each_sweep.append(fit_R) - asc_amp_for_each_sweep.append(fit_asc_amp) - llh_for_each_sweep.append(llh) - - #Plot a single instance of AS current as function of time (in ms) - if MAKE_PLOT: - plt.figure(79) - plt.subplot(5,2, ks_ind+1) - plot_inds = np.arange(int(t0_list[0][0])-tst,int(t0_list[0][0])-tst+nkt) #plot just after first spike - tvec = dt*plot_inds - plt.plot(tvec,ipsc[plot_inds], lw=2, label='llh='+str(llh)) - plt.xlabel('time (s)') - plt.ylabel('current (A)') - plt.title("k's "+str(ks_SI_units)) - - plt.figure(80) - plt.subplot(5,2,ks_ind+1) - for ASC, KS in zip(fit_asc_amp, np.array(ks_SI_units)): - #TODO: MAKE SURE I SHOULD BE USING SI UNITS HERE {I think this is correct as it is what I am returning from the function] - #TODO: MAKE SURE THE SIGNS OF K ARE OK - t_plot=np.arange(10000)*dt - single_asc_trace=ASC*np.exp(-KS*t_plot) - plt.plot(t_plot, single_asc_trace, lw=2, label='sweep '+str(kkk)) - plt.xlabel('time (s)') - plt.ylabel('current (A)') - plt.title("k's "+str(ks_SI_units)) - - if MAKE_PLOT: - plt.figure(79) - plt.tight_layout() - plt.annotate('ASGLM (fit asc and R): Sum fit after spike currents', - xy=(.3, .985), - xycoords='figure fraction', - horizontalalignment='left', verticalalignment='top', - fontsize=20) - plt.legend() - - plt.figure(80) - plt.tight_layout() - plt.annotate('ASGLM (fit asc and R): Individual Currents', - xy=(.3, .985), - xycoords='figure fraction', - horizontalalignment='left', verticalalignment='top', - fontsize=20) - plt.legend() - if SHOW_PLOT: - plt.show(block=False) - - -# #BELOW IS OVER EVERY PAIR - R_for_all_ks_pairs.append(R_for_each_sweep) - asc_amp_for_all_ks_pairs.append(asc_amp_for_each_sweep) - llh_for_all_ks_pairs.append(llh_for_each_sweep) - - #!!!!!!!!!!!!!we multiplied ks by dt for SI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ave_llh_for_each_pair=np.mean(llh_for_all_ks_pairs, axis=1) - best_ks_pair_ind = np.where(np.max(ave_llh_for_each_pair)==ave_llh_for_each_pair)[0][0] - - best_k_pair=np.array(ks_pairs[best_ks_pair_ind])/dt - best_asc_amp=np.array(asc_amp_for_all_ks_pairs[best_ks_pair_ind]) - best_R=np.array(R_for_all_ks_pairs[best_ks_pair_ind]) - best_llh=np.array(llh_for_all_ks_pairs[best_ks_pair_ind]) - - print('**********from ASGLM_pairwise******************************************') - print('best_ks_pair_ind', best_ks_pair_ind) - print('best_asc_amp', best_asc_amp) - print('best_k_pair', best_k_pair) - print('best_R', best_R) - print('best_llh', best_llh) - - print('**********done with ASGLM_pairwise***********************************') - - return best_k_pair, best_asc_amp, best_R, best_llh diff --git a/allensdk/internal/model/glif/MLIN.py b/allensdk/internal/model/glif/MLIN.py deleted file mode 100644 index d42c657045..0000000000 --- a/allensdk/internal/model/glif/MLIN.py +++ /dev/null @@ -1,143 +0,0 @@ -import numpy as np -from allensdk.ephys.extract_cell_features import get_square_stim_characteristics -from scipy import stats -from scipy.optimize import curve_fit -import matplotlib.pyplot as plt - -def MLIN(voltage, current, res, cap, dt, MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False, PUBLICATION_PLOT=False): - '''voltage, current - input: - voltage: numpy array of voltage with test pulse cut out - current: numpy array of stimulus with test pulse cut out ''' - t = np.arange(0, len(current)) * dt - (_, _, _, start_idx, end_idx) = get_square_stim_characteristics(current, t, no_test_pulse=True) - stim_len = end_idx - start_idx - - distribution_start_ind=start_idx + int(.5/dt) - distribution_end_ind=start_idx + stim_len - - v_section=voltage[distribution_start_ind:distribution_end_ind] - if MAKE_PLOT: - times=np.arange(0, len(voltage))*dt - plt.figure(figsize=(15, 11)) - plt.subplot2grid((7,2), (0,0), colspan=2) - plt.plot(times[distribution_start_ind:distribution_end_ind], v_section) - plt.title('voltage for histogram') - - print(v_section) - v_section=v_section-np.mean(v_section) - var_of_section=np.var(v_section) - sv_for_expsymm=np.std(v_section)/np.sqrt(2) - subthreshold_long_square_voltage_distribution=stats.norm(loc=0, scale=np.sqrt(var_of_section)) - - #--autocorrelation - tau_4AC=res*cap - AC=autocorr(v_section-np.mean(v_section)) - ACtime=np.arange(0,len(AC))*dt - - #--fit autocorrelation with decaying exponential - (popt, pcov)= curve_fit(exp_decay, ACtime, AC, p0=[AC[0],tau_4AC]) - tau_from_AC=popt[1] - - if MAKE_PLOT: - plt.subplot2grid((7,2), (1,0), rowspan=3) - plt.hist(v_section, bins=50, normed=True, label='data') - data_grid=np.arange(min(v_section), max(v_section), abs(min(v_section)-max(v_section))/100.) - plt.plot(data_grid, subthreshold_long_square_voltage_distribution.pdf(data_grid), 'r', label='gauss with\nmeasured var') - plt.plot(data_grid, expsymm_pdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm function') - plt.xlabel('voltage (mV)') - plt.title('Mean subtracted voltage hist') - plt.legend() - - #--cumulative density function - (h, edges)=np.histogram(v_section, bins=50) - centers=find_bin_center(edges) - - CDFx=centers - CDFy=np.cumsum(h)/float(len(v_section)) - - plt.subplot2grid((7,2), (4,0), rowspan=3) - plt.plot(CDFx, CDFy, label='data') -# plt.plot(CDFx, sig(CDFx, popt[0], popt[1]), label='fit') - plt.plot(data_grid, subthreshold_long_square_voltage_distribution.cdf(data_grid), 'r', label='gauss with\nmeasured var') - plt.plot(data_grid, expsymm_cdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm func') - plt.title('Normalized cumulative sum') - plt.xlabel('v-mean(v)') - plt.legend() - - plt.subplot2grid((7,2), (1,1), rowspan=3) - plt.plot(ACtime, AC, label='data') - plt.xlabel('shift (s)') - plt.title('Auto correlation') - plt.plot(ACtime, exp_decay(ACtime, AC[0], tau_4AC), label='RC') - plt.plot(ACtime, exp_decay(ACtime, popt[0], tau_from_AC), label='fit') - plt.legend() - - plt.tight_layout() - if SHOW_PLOT: - plt.show(block=BLOCK) - - if PUBLICATION_PLOT: - times=np.arange(0, len(voltage))*dt - plt.figure(figsize=(14, 7)) - plt.subplot2grid((3,3), (0,0), colspan=3) - plt.xlabel('time (s)', fontsize=14) - plt.ylabel('(mV)', fontsize=14) - plt.plot(times[distribution_start_ind:distribution_end_ind], v_section*1.e3) - plt.title('Voltage for histogram', fontsize=16) - - plt.subplot2grid((3,3), (1,0), rowspan=2) - plt.hist(v_section*1.e3, bins=50, normed=True, label='data') - data_grid=np.arange(min(v_section), max(v_section), abs(min(v_section)-max(v_section))/100.) -# plt.plot(data_grid, subthreshold_long_square_voltage_distribution.pdf(data_grid), 'r', label='gauss with\nmeasured var') - plt.plot(data_grid*1.e3, 1.e-3*expsymm_pdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm ') - plt.xlabel('voltage (mV)', fontsize=14) - plt.title('Mean subtracted voltage hist', fontsize=16) - plt.legend(loc=1) - - #--cumulative density function - (h, edges)=np.histogram(v_section, bins=50) - centers=find_bin_center(edges) - - CDFx=centers - CDFy=np.cumsum(h)/float(len(v_section)) - - plt.subplot2grid((3,3), (1,1), rowspan=2) - plt.plot(CDFx*1e3, CDFy, label='data') - # plt.plot(CDFx, sig(CDFx, popt[0], popt[1]), label='fit') -# plt.plot(data_grid, subthreshold_long_square_voltage_distribution.cdf(data_grid), 'r', label='gauss with\nmeasured var') - plt.plot(data_grid*1.e3, expsymm_cdf(data_grid, sv_for_expsymm), 'm', lw=3, label='expsymm') - plt.title('Normalized cumulative sum', fontsize=16) - plt.xlabel('V-mean(V) (mV)', fontsize=16) - plt.legend(loc=2, fontsize=14) - - plt.subplot2grid((3,3), (1,2), rowspan=2) - plt.plot(ACtime, AC*1.e3, label='data') - plt.xlabel('shift (s)', fontsize=14) - plt.title('Auto correlation', fontsize=16) -# plt.plot(ACtime, exp_decay(ACtime, AC[0], tau_4AC), label='RC') - plt.plot(ACtime, exp_decay(ACtime, popt[0]*1.e3, tau_from_AC), lw=3, label='fit') - plt.legend(loc=1) - plt.tight_layout() - - return var_of_section, sv_for_expsymm, tau_from_AC - -def expsymm_pdf(v, dv): - return 1./(2.*dv)*np.exp(-np.absolute(v)/dv) - -def expsymm_cdf(v, dv): - return 1./2.+(v*(1-np.exp(-np.absolute(v)/dv)))/(2.*np.absolute(v)) - -def exp_decay(time, amp, tau): - return amp*np.exp(-time/tau) - -def find_bin_center(edges): - centers=np.zeros(len(edges)-1) - for ii in range(0, len(edges)-1): - centers[ii]=np.mean([edges[ii], edges[ii+1]]) - return centers - -def autocorr(x): - result = np.correlate(x, x, mode='full') -# return result - return result[result.size/2:] diff --git a/allensdk/internal/model/glif/__init__.py b/allensdk/internal/model/glif/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/model/glif/are_two_lists_of_arrays_the_same.py b/allensdk/internal/model/glif/are_two_lists_of_arrays_the_same.py deleted file mode 100644 index dd3b81548a..0000000000 --- a/allensdk/internal/model/glif/are_two_lists_of_arrays_the_same.py +++ /dev/null @@ -1,16 +0,0 @@ -import numpy as np - -def are_two_lists_of_arrays_the_same(data1, data2): - '''returns False if to lists of arrays are different. - otherwise the function returns True. - ''' - - if len(data1) != len(data2): - return False - for a,b in zip(data1,data2): - if np.any(a != b): - return False - - return True - - \ No newline at end of file diff --git a/allensdk/internal/model/glif/configure_model.py b/allensdk/internal/model/glif/configure_model.py deleted file mode 100644 index e585991078..0000000000 --- a/allensdk/internal/model/glif/configure_model.py +++ /dev/null @@ -1,411 +0,0 @@ -#going to need to take preprocessed dictionaries and model configuration and create -#a preprocessed model configuration and preprocessed_config file -# -#something will have to tell it what parameters to take out of the preprocessed dict -import os -import sys -import logging -import time -import numpy as np -import argparse -import allensdk.core.json_utilities as ju -import find_sweeps as fs -from six import iteritems - -class ModelConfigurationException( Exception ): pass - -DEFAULT_NEURON_PARAMETERS = { - "type": "GLIF", - "dt": 5e-05, - "El": 0, - "asc_tau_array": [ 1, 1 ], - "asc_amp_array": [ 0, 0 ], - "init_AScurrents": [ 0.0, 0.0 ], - "init_threshold": 0.02, - "init_voltage": 0.0, - "extrapolation_method_name": "endpoints", - "dt_multiplier": 1 - } - -DEFAULT_OPTIMIZER_PARAMETERS = { - "xtol": 1e-05, - "ftol": 1e-05, - "sigma_outer": 0.3, - "sigma_inner": 0.01, - "inner_iterations": 3, - "outer_iterations": 3, - "internal_iterations": 10000000, - "iteration_info": [], - "param_fit_names": [], - "cut": 0, - "bessel": { 'N': 4, 'freq': 10000 } - } - - -def specify_parameter_groups(dictionary, dict_specifer, neuron_type): - '''Specifies which values from the preprocessor will be used in the model configuration. - This is helpful if the preprocessor calculates many different values. - - Parameters - ---------- - dictionary: dict - dictionary from preprocessor - dict_specifier: string - The following are available model levels - 'LIF' (GLIF1) - 'LIF_R' (GLIF2) - 'LIF_ASC' (GLIF3) - 'LIF_R_ASC' (GLIF_4) - 'LIF_R_ASC_AT' (GLIF_5) - neuron_type: string - 'simple_neuron' is the only available option however here would be a good place for - the user to implement their own configurations. - - Returns - ------- - output_dict: dict - dictionary containing model configuration - ''' - - output_dict={'El_reference':dictionary['El']['El_noise']['measured']['mean'], - 'El':0., - 'dt':dictionary['dt_used_for_preprocessor_calculations'], - 'spike_cut_length':dictionary['spike_cutting']['NOdeltaV']['cut_length'], - 'spike_cutting_intercept':dictionary['spike_cutting']['NOdeltaV']['intercept'], - 'spike_cutting_slope':dictionary['spike_cutting']['NOdeltaV']['slope'], - 'asc_amp_array':dictionary['asc']['amp'], - 'asc_tau_array':(1./np.array(dictionary['asc']['k'])).tolist(), - 'th_inf': dictionary['th_inf']['via_Vmeasure']['from_zero'], - 'deltaV': None, - 'threshold_adaptation': {'a_spike_component_of_threshold': dictionary['threshold_adaptation']['a_spike_component_of_threshold'], - 'b_spike_component_of_threshold':dictionary['threshold_adaptation']['b_spike_component_of_threshold'], - 'a_voltage_component_of_threshold':dictionary['threshold_adaptation']['a_voltage_comp_of_thr_from_fitab'], - 'b_voltage_component_of_threshold': dictionary['threshold_adaptation']['b_voltage_comp_of_thr_from_fitab']}, - 'MLIN': dictionary['MLIN'], - 'spike_inds': { - 'noise1': [ ], - 'noise2': [ ] - } - } - - # specify specific values different for different levels. Although there is only one neuron - # type here, this would be a good place to add other user defined neuron types - if neuron_type=='simple_neuron': - output_dict['C']=dictionary['capacitance']['C_test_list']['mean'] - if dict_specifer in ['LIF', 'LIF_R']: - output_dict['R_input']=dictionary['resistance']['R_test_list']['mean'] - elif dict_specifer in ['LIF_ASC', 'LIF_R_ASC', 'LIF_R_ASC_AT']: - output_dict['R_input']=dictionary['resistance']['R_fit_ASC_and_R']['mean'] - - for k,v in iteritems(dictionary['sweep_properties']['noise1']): - output_dict['spike_inds']['noise1'].append( v['spike_ind'] ) - output_dict['spike_inds']['noise2'].append( v['spike_ind'] ) - - return output_dict - - -def validate_method_requirements(method_config_name, has_mss): - '''Confirm that the neuron has the specific sweeps required for the specified configuration - - Parameters - ---------- - method_config_name: string - Specifies the model level. Options are: - 'LIF' (GLIF1) - 'LIF_R' (GLIF2) - 'LIF_ASC' (GLIF3) - 'LIF_R_ASC' (GLIF_4) - 'LIF_R_ASC_AT' (GLIF_5) - has_mss: boolean - Specifies if the neuron has a multi short square sweep (for fitting spike component of threshold). - ''' - if not has_mss: - valid_configs = ['LIF', 'LIF_ASC'] - else: - valid_configs = ['LIF', 'LIF_ASC','LIF_R', 'LIF_R_ASC', 'LIF_R_ASC_AT'] - - if method_config_name not in valid_configs: - raise ModelConfigurationException("Model type %s cannot be configured due to missing data (mss: %s)" % ( method_config_name, str(has_mss))) - -def update_neuron_method(method_type, arg_method_name, neuron_config): - #TODO: documentation - neuron_config[method_type] = { 'name': arg_method_name, 'params': None } - - -def configure_model(method_config, preprocessor_values): - '''Configures the model from the specified method configuration and preprocessor values. - - Parameters - ---------- - method_config: dictionary - contains values needed to configure the methods for the specified level within the dictionary - preprocessor_values: dictionary - dictionary from preprocessor - ''' - - preprocessor_values = specify_parameter_groups(preprocessor_values, method_config['name'], 'simple_neuron') - - neuron_config = {} - neuron_config.update(DEFAULT_NEURON_PARAMETERS) - optimizer_config = {} - optimizer_config.update(DEFAULT_OPTIMIZER_PARAMETERS) - - #a) select values want to use out of the preprocessor_values via specifying parameter_gropus - #b) look what levels are available via the levels available in the preprocessor_values. - - # Skip trace if subthreshold noise has a spike in it. - noise1_ind = [ n1i for n1i in preprocessor_values['spike_inds']['noise1'] if n1i is not None ] - noise1_ind = np.concatenate(noise1_ind) - if np.any(noise1_ind * preprocessor_values['dt'] < 8.0): - raise ModelConfigurationException("Subthreshold region of noise1 stimulus contains spikes.") - - # check if there is a short square triple - if preprocessor_values['threshold_adaptation']['b_spike_component_of_threshold'] and preprocessor_values['threshold_adaptation']['a_spike_component_of_threshold']: - has_mss=True - else: - has_mss=False - - # make sure that the requested method config meets minimum requirements - validate_method_requirements(method_config['name'], has_mss) - - update_neuron_method('AScurrent_dynamics_method', method_config['AScurrent_dynamics_method'], neuron_config) - update_neuron_method('voltage_dynamics_method', method_config['voltage_dynamics_method'], neuron_config) - update_neuron_method('threshold_dynamics_method', method_config['threshold_dynamics_method'], neuron_config) - update_neuron_method('AScurrent_reset_method', method_config['AScurrent_reset_method'], neuron_config) - update_neuron_method('voltage_reset_method', method_config['voltage_reset_method'], neuron_config) - update_neuron_method('threshold_reset_method', method_config['threshold_reset_method'], neuron_config) - - neuron_config['El_reference'] = preprocessor_values['El_reference'] - neuron_config['C'] = preprocessor_values['C'] - neuron_config['El'] = preprocessor_values['El'] - neuron_config['spike_cut_length'] = preprocessor_values['spike_cut_length'] - neuron_config['asc_amp_array'] = preprocessor_values['asc_amp_array'] - neuron_config['asc_tau_array'] = preprocessor_values['asc_tau_array'] - neuron_config['R_input'] = preprocessor_values['R_input'] - neuron_config['th_inf'] = preprocessor_values['th_inf'] - - optimizer_config['error_function'] = method_config['error_function'] - optimizer_config['param_fit_names'] = method_config['param_fit_names'] - - #b) choose the sets want from the preprocessor_values - configure_method_parameters(neuron_config, - optimizer_config, - preprocessor_values['spike_cutting_slope'], - preprocessor_values['spike_cutting_intercept'], - preprocessor_values['threshold_adaptation']['a_spike_component_of_threshold'], - preprocessor_values['threshold_adaptation']['b_spike_component_of_threshold'], - preprocessor_values['threshold_adaptation']['a_voltage_component_of_threshold'], - preprocessor_values['threshold_adaptation']['b_voltage_component_of_threshold'], - preprocessor_values['MLIN']['var_of_section'], - preprocessor_values['MLIN']['sv_for_expsymm'], - preprocessor_values['MLIN']['tau_from_AC']) - - return { - 'neuron': neuron_config, - 'optimizer': optimizer_config - } - -def configure_method_parameters(neuron_config, - optimizer_config, - v_reset_slope, - v_reset_intercept, - a_spike_component_of_threshold, - b_spike_component_of_threshold, - a_voltage_component_of_threshold, - b_voltage_component_of_threshold, - var_of_section, - sv_for_expsymm, - tau_from_AC): - '''Configures the methods used to run the models - - Parameters - ---------- - neuron_config: dict - contains neuron parameters - optimizer_config: dict - contains parameters for optimizaton - v_reset_slope: float - slope of the line in voltage reset - v_reset_intercept: float - intercept of the line in voltage reset - a_spike_component_of_threshold: float or None - amplitude of spike component of the threshold - b_spike_component_of_threshold: float or None - time course of spike component of the threshold - a_voltage_component_of_threshold: float or None - a parameter in voltage component of threshold - b_voltage_component_of_threshold: float or None - b parameter in voltage component of threshold - var_of_section: float - variance in noise of highest amplitude subthreshold long square pulse - sv_for_expsymm: float - parameter in MLIN optimization - tau_from_AC: float - time course of exponential fit to the autocorrelation - ''' - - # configure voltage reset rules - method_config = neuron_config['voltage_reset_method'] - if method_config.get('params', None) is None: - if method_config['name'] == 'zero': - method_config['params'] = {} - elif method_config['name'] == 'v_before': - method_config['params'] = { - 'a': v_reset_slope, - 'b': v_reset_intercept - } - - elif method_config['name'] == 'i_v_before': - method_config['params'] = { - 'a': 1, - 'b': 2, - 'c': 3 - } - raise ModelConfigurationException('i_v_before of voltage reset method is not yet implemented') - elif method_config['name'] == 'fixed': - raise ModelConfigurationException('cannot use fixed voltage reset method in preprocessor') - else: - method_config['params'] = {} - - # configure threshold reset rules - method_config = neuron_config['threshold_reset_method'] - if method_config.get('params', None) is None: - coeff_th_inf = neuron_config.get('coeffs', {}).get('th_inf',1.0) - adjusted_th_inf = neuron_config['th_inf'] * coeff_th_inf - - if method_config['name'] == 'max_v_th': - raise ModelConfigurationException('max_v_th threshold reset rule is not currently in use') - - elif method_config['name'] == 'th_before': - raise ModelConfigurationException('th_before is not currently in use') - - elif method_config['name'] == 'inf': - method_config['params'] = {} - neuron_config['init_threshold'] = adjusted_th_inf - - elif method_config['name'] == 'three_components': - method_config['params'] = { 'a_spike': a_spike_component_of_threshold, - 'b_spike': b_spike_component_of_threshold } - neuron_config['init_threshold'] = adjusted_th_inf - - elif method_config['name'] == 'fixed': - raise ModelConfigurationException("cannot use fixed threshold reset method in preprocessor") - else: - raise ModelConfigurationException("unknown threshold reset method: ", method_config['name']) - - # configure voltage dynamics rules - - method_config = neuron_config['voltage_dynamics_method'] - if method_config.get('params', None) is None: - if method_config['name'] == 'quadratic_i_of_v': - raise ModelConfigurationException('quadraticIofV of voltage_dynamics_method preprocessing is not yet implemented') - elif method_config['name'] == 'linear_forward_euler': - method_config['params'] = {} - elif method_config['name'] == 'linear_exact': - method_config['params'] = {} - - else: - raise ModelConfigurationException("unknown voltage dynamics method: ", method_config['name']) - - # configure threshold dynamics rules - method_config = neuron_config['threshold_dynamics_method'] - - if method_config.get('params', None) is None: - if method_config['name'] == 'three_components_forward': - method_config['params'] = { - 'a_spike': a_spike_component_of_threshold, - 'b_spike': b_spike_component_of_threshold, - 'a_voltage': a_voltage_component_of_threshold, - 'b_voltage': b_voltage_component_of_threshold - } - - elif method_config['name'] == 'three_components_exact': - method_config['params'] = { - 'a_spike': a_spike_component_of_threshold, - 'b_spike': b_spike_component_of_threshold, - 'a_voltage': a_voltage_component_of_threshold, - 'b_voltage': b_voltage_component_of_threshold - } - - elif method_config['name'] == 'spike_component': - method_config['params'] = { - 'a_spike': a_spike_component_of_threshold, - 'b_spike': b_spike_component_of_threshold, - 'a_voltage': 0, - 'b_voltage': 0 - } - - elif method_config['name'] == 'inf': - method_config['params'] = {} - - else: - raise ModelConfigurationException("unknown threshold dynamics method: ", method_config['name']) - - # configure ascurrent dynamics rules - method_config = neuron_config['AScurrent_dynamics_method'] - if method_config.get('params', None) is None: - # TODO: rename 'vector' to something more specific - if method_config['name'] == 'vector': - method_config['params'] = { - 'vector': [1, 2, 3] - } - raise ModelConfigurationException('vector of AScurrent_dynamics_method is not yet implemented') - elif method_config['name'] == 'none': - method_config['params'] = {} - elif method_config['name'] == 'exp': - method_config['params'] = {} - else: - raise ModelConfigurationException("unknown AScurrent dynamics method: ", method_config['name']) - - # configure ascurrent reset rule - # this is down here because it depends on numbers computed for the AScurrent_dynamics_method - method_config = neuron_config['AScurrent_reset_method'] - if method_config.get('params', None) is None: - if method_config['name'] == 'sum': - method_config['params'] = { - 'r': np.ones(len(neuron_config['asc_tau_array'])) - } - elif method_config['name'] == 'none': - method_config['params'] = {} - else: - raise ModelConfigurationException("unknown AScurrent reset method: ", method_config['name']) - - # configure parameters for MLIN optimization - if optimizer_config['error_function']=='MLIN': - optimizer_config['error_function_data'] = { - 'subthreshold_long_square_voltage_variance': var_of_section, - 'sv_for_expsymm': sv_for_expsymm, - 'tau_from_AC': tau_from_AC - } - - # validation - - # make sure that the initial ascurrents have the correct size - if len(neuron_config['init_AScurrents']) != len(neuron_config['asc_tau_array']): - raise ModelConfigurationException("init_AScurrents have incorrect length.") - - spike_cut_length = neuron_config.get('spike_cut_length', None) - - if spike_cut_length is None: - raise ModelConfigurationException("Spike cut length must be set, but it is not.") - - if spike_cut_length < 0: - raise ModelConfigurationException("Spike cut length must be non-negative.") - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('preprocessor_values_path', help='path to preprocessor values json') - parser.add_argument('method_config_path', help='path to method configuration json') - parser.add_argument('output_path', help='path to store final model configuration') - - args = parser.parse_args() - - preprocessor_values = ju.read(args.preprocessor_values_path) - method_config = ju.read(args.method_config_path) - out_config = configure_model(method_config, preprocessor_values) - - ju.write(args.output_path, out_config) - - -if __name__ == "__main__": main() diff --git a/allensdk/internal/model/glif/error_functions.py b/allensdk/internal/model/glif/error_functions.py deleted file mode 100644 index a5f6e8cfcc..0000000000 --- a/allensdk/internal/model/glif/error_functions.py +++ /dev/null @@ -1,241 +0,0 @@ -import logging -import sys -import os - -from scipy.stats import norm - -import numpy as np - -from allensdk.internal.model.glif.glif_optimizer_neuron import GlifNeuronException -from allensdk.internal.model.glif.glif_optimizer_neuron import GlifBadInitializationException -from allensdk.model.glif.glif_neuron import GlifBadResetException - -# TODO: clean up -# TODO: license - -def MLIN_list_error(param_guess, experiment, input_data): - #TODO: binning is now done in preprocessor so perhaps should take it out of here. - voltage_variance = input_data['subthreshold_long_square_voltage_variance'] -# voltage_distribution=norm(loc=0, scale=np.sqrt(voltage_variance)*10.) - sv=input_data['sv_for_expsymm'] #used in the expsymm function -# tau_4AC=experiment.neuron.R_input*experiment.neuron.C - tau_from_AC=input_data['tau_from_AC'] - spike_length=int(experiment.neuron.spike_cut_length) - noSpike_bin_size_ind=int(tau_from_AC/experiment.neuron.dt) - spike_bin_size_time=.005 #TODO: PLAY WITH THIS VALUE. 1 MS, 2, 4, 8 - spike_bin_size_ind=int(spike_bin_size_time/experiment.neuron.dt) - - logging.info('running parameter guess: %s' % param_guess) - - dataSpikeTimes=experiment.grid_spike_times - - MLIN_list = [] - try: - run_data = experiment.run(param_guess) - - except GlifNeuronException as e: - out=e.data - raise e - modelSpikeISI=[e.data['interpolated_ISI']] - - except GlifBadInitializationException as e: - logging.error('voltage STARTS above threshold: setting error to be large.Difference between thresh and voltage is: %f' % e.dv) - raise Exception() - except GlifBadResetException as e: - logging.error('THIS REALLY SHOULDNT HAPPEN WITH NEW INITIALIZATION EXCEPTION: voltage is above threshold at reset: setting error to be large. Difference between thresh and voltage is: %f' % e.dv) - raise Exception() - - v_model_list=[] - th_model_list=[] - non_spike_bin_ind_edges_list=[] - spike_edges_list_list=[] - spike_bins_list=[] - noSpike_bins_list=[] - spike_prob_list=[] - noSpike_prob_list=[] - - for stim_list_index in range(0,len(experiment.stim_list)): - #TODO: the following line is a hack to take care of the case when there are no spikes in a sweep - if len(experiment.spike_time_steps[stim_list_index])==0: - MLIN=0 - raise Exception('there are no spikes in the sweep') - else: - bio_spike_ind=experiment.spike_time_steps[stim_list_index] - v_model=run_data['voltage'][stim_list_index] - th_model=run_data['threshold'][stim_list_index] - #------------------------------------------------------------------------------------ - #---------------make all the bins---------------------------------------------------- - #------------------------------------------------------------------------------------ - - #--for every spike define a region for making non spiking bins - between_spike_edges_list=[] - between_spike_edges_list.append([0, bio_spike_ind[0]-spike_bin_size_ind]) #edges to first spike - for ii in range(0, len(bio_spike_ind)-1): - between_spike_edges_list.append([bio_spike_ind[ii]+spike_length, bio_spike_ind[ii+1]-spike_bin_size_ind]) - - - #--define no spike bin edges - non_spike_bin_ind_edges_in_ISI=[] - for btw_spike_edges in between_spike_edges_list: - temp=range(btw_spike_edges[0], btw_spike_edges[1], noSpike_bin_size_ind) - temp.append(btw_spike_edges[1]) - non_spike_bin_ind_edges_in_ISI.append(temp) - - #--define spike bin edges - spike_edges_list=[] - for spike in bio_spike_ind: - spike_edges_list.append([spike-spike_bin_size_ind, spike]) - - #--nonspike bin edges need to be arranged correctly because they are just all the edges for a given ISI - non_spike_bin_ind_edges=[] - for edges_in_1_spike in non_spike_bin_ind_edges_in_ISI: - for ii in range(0,len(edges_in_1_spike)-1): - non_spike_bin_ind_edges.append([edges_in_1_spike[ii], edges_in_1_spike[ii+1]]) - - #----------------------------------------------------------------------------- - #-------------finding values in bins------------------------------------------ - #----------------------------------------------------------------------------- - - spike_bins={} -# spike_bins['vmax']=[] - spike_bins['th']=[] - spike_bins['v']=[] - spike_bins['v_th_diff']=[] -# spike_bins['ind_of_max_v']=[] - spike_bins['ind_of_max_diff_btw_v_th']=[] - - for bin_edges in spike_edges_list: - bin_ind=range(bin_edges[0], bin_edges[1]) - #vmax_in_bin=max(v_model[bin_ind]) - diff_vector=th_model[bin_ind]-v_model[bin_ind] - #the_ind=bin_ind[np.where(v_model[bin_ind]==vmax_in_bin)[0]] this is used to use in where v is at a max (as opposed to the difference between v and th) -# print("***********************************************************") -# print('th_model[bin_ind]', th_model[bin_ind]) -# print('v_model[bin_ind]',v_model[bin_ind]) -# print('diff_vector', diff_vector) -# print('np.where(diff_vector==min(diff_vector))[0]', np.where(diff_vector==min(diff_vector))[0]) - the_ind=bin_ind[np.where(diff_vector==min(diff_vector[~np.isnan(diff_vector)]))[0][0]] - th_in_bin=th_model[the_ind] - v_in_bin=v_model[the_ind] -# diffV=th_in_bin-vmax_in_bin - diffV=th_model[the_ind]-v_model[the_ind] - spike_bins['v'].append(v_in_bin) - spike_bins['th'].append(th_in_bin) - spike_bins['v_th_diff'].append(diffV) - spike_bins['ind_of_max_diff_btw_v_th'].append(the_ind) - - - noSpike_bins={} -# noSpike_bins['vmax']=[] - noSpike_bins['th']=[] - noSpike_bins['v']=[] - noSpike_bins['v_th_diff']=[] - noSpike_bins['ind_of_max_diff_btw_v_th']=[] - for bin_edges in non_spike_bin_ind_edges: - bin_ind=range(bin_edges[0], bin_edges[1]) -# vmax_in_bin=max(v_model[bin_ind]) - diff_vector=th_model[bin_ind]-v_model[bin_ind] -# max_indicies=np.where(v_model[bin_ind]==vmax_in_bin)[0] - min_indicies=np.where(diff_vector==min(diff_vector))[0] -# if len(max_indicies)>1: -# print('there is more than one maximum indicie in a bin at', max_indicies, 'choosing last value for computation') -# print('all voltages in the bin are', v_model[bin_ind]) - the_ind=bin_ind[min_indicies[-1]] #this is here just incase there is more than one value at max voltage in a bin - th_in_bin=th_model[the_ind] - v_in_bin=v_model[the_ind] - diffV=th_model[the_ind]-v_model[the_ind] - noSpike_bins['v'].append(v_in_bin) - noSpike_bins['th'].append(th_in_bin) - noSpike_bins['v_th_diff'].append(diffV) - noSpike_bins['ind_of_max_diff_btw_v_th'].append(the_ind) - - #----------------------------------------------------------------------------- - #-------------calculate MLIN-------------------------------------------------- - #----------------------------------------------------------------------------- - -# this was the version with the normal distribution -# noSpike_prob=np.log(np.spacing(1)+voltage_distribution.cdf(noSpike_bins['v_th_diff'])) -# spike_prob=np.log(1+np.spacing(1)-voltage_distribution.cdf(spike_bins['v_th_diff'])) - #version with the expsymm function - - #---OPTION ONE-------- -# noSpike_prob=np.log(np.spacing(1)+expsymm_cdf(noSpike_bins['v_th_diff'], sv)) -# spike_prob=np.log(1+np.spacing(1)-expsymm_cdf(spike_bins['v_th_diff'], sv)) -# #---OPTION TWO-------- -# N_spike=np.float(len(spike_bins['v_th_diff'])) -# N_noSpike=np.float(len(noSpike_bins['v_th_diff'])) -# noSpike_prob=(N_spike/(N_noSpike+N_spike))*np.log(np.spacing(1)+expsymm_cdf(noSpike_bins['v_th_diff'], sv)) -# spike_prob=(N_noSpike/(N_noSpike+N_spike))*np.log(1+np.spacing(1)-expsymm_cdf(spike_bins['v_th_diff'], sv)) - #---OPTION THREE - noSpike_negDiff=(-np.log(2.)+np.array(noSpike_bins['v_th_diff'])/sv)[np.array(noSpike_bins['v_th_diff'])<=0.0] - noSpike_posDiff=(np.log(1.-0.5*np.exp(-np.array(noSpike_bins['v_th_diff'])/sv)))[np.array(noSpike_bins['v_th_diff'])>0.0] - noSpike_prob=np.append(noSpike_negDiff, noSpike_posDiff) #!!NOTE: this may not line up correctly in outputs of MLIN HACK - - spike_negDiff=(np.log(1.-0.5*np.exp(np.array(spike_bins['v_th_diff'])/sv)))[np.array(spike_bins['v_th_diff'])<=0.0] - spike_posDiff=(-np.log(2.)-np.array(spike_bins['v_th_diff'])/sv)[np.array(spike_bins['v_th_diff'])>0.0] - spike_prob=np.append(spike_negDiff, spike_posDiff) - - MLIN=-(sum(noSpike_prob)+sum(spike_prob)) - logging.info('MLIN: %f', MLIN) - - MLIN_list.append([MLIN]) - v_model_list.append(v_model) - th_model_list.append(th_model) - non_spike_bin_ind_edges_list.append(non_spike_bin_ind_edges) - spike_edges_list_list.append(spike_edges_list) - spike_bins_list.append(spike_bins) - noSpike_bins_list.append(noSpike_bins) - spike_prob_list.append(spike_prob) - noSpike_prob_list.append(noSpike_prob) - - concatenateMLINList=np.concatenate(MLIN_list) - experiment.spike_errors.append(concatenateMLINList) - -# print('param Guess', param_guess, 'TRD', np.mean(concatenateTRDList)) - out =np.mean(concatenateMLINList) - logging.info('MLIN: %f', np.mean(concatenateMLINList)) - -#------------------------------------------------------------------- -#--------------------------plotting------------------------------------ -#--------------------------------------------------------------------- - time=np.arange(0, len(v_model))*experiment.neuron.dt -# plt.subplot(2,1,1) -# plt.title('Model', fontsize=16) -# plt.plot(time, v_model, 'b-', label='voltage') -# plt.plot(time, th_model, 'b--', label='threshold') -# plt.plot(np.concatenate(non_spike_bin_ind_edges)*experiment.neuron.dt, v_model[np.concatenate(non_spike_bin_ind_edges)], 'k|', ms=16) -# plt.plot(np.concatenate(spike_edges_list)*experiment.neuron.dt, v_model[np.concatenate(spike_edges_list)], 'r|', ms=16) -# plt.plot(np.array(spike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, v_model[spike_bins['ind_of_max_diff_btw_v_th']], 'r.', ms=6) -# plt.plot(np.array(spike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, th_model[spike_bins['ind_of_max_diff_btw_v_th']], 'r.', ms=6) -# plt.plot(np.array(noSpike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, v_model[noSpike_bins['ind_of_max_diff_btw_v_th']], 'k.', ms=6) -# plt.plot(np.array(noSpike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, th_model[noSpike_bins['ind_of_max_diff_btw_v_th']], '.', ms=6) -# plt.title(' MLIN='+ str(MLIN)+' : sv='+str(sv)+' : ac_tau='+str(tau_from_AC)+' : spike bin size='+str(spike_bin_size_time)+'!!!!!! !!!!!', fontsize=20) -# plt.xlim([0, time[-1]]) -# -# plt.subplot(2,1,2) -# plt.plot(np.array(spike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, spike_prob, 'r.', ms=16, label='spike probablility') -# plt.plot(np.array(noSpike_bins['ind_of_max_diff_btw_v_th'])*experiment.neuron.dt, noSpike_prob, 'b.', ms=16, label='no spike probablility') -# plt.legend() -# -# print("coming out of function", out) -# -# plt.show() - - - #converted to list 4_11_15 - experiment.MLIN_HACK={ - 'v_model': v_model_list, - 'th_model': th_model_list, - 'non_spike_bin_ind_edges': non_spike_bin_ind_edges_list, - 'spike_edges_list': spike_edges_list_list, #TODO Corinne: why was this originally a list but nothing else a list - 'spike_bins': spike_bins_list, - 'noSpike_bins': noSpike_bins_list, - 'tau_from_AC': tau_from_AC, - 'spike_prob': spike_prob_list, - 'noSpike_prob': noSpike_prob_list, - 'spike_bin_size_time' : spike_bin_size_time, - 'sv': sv - - } -# - return out diff --git a/allensdk/internal/model/glif/find_spikes.py b/allensdk/internal/model/glif/find_spikes.py deleted file mode 100644 index 9c5a3b5471..0000000000 --- a/allensdk/internal/model/glif/find_spikes.py +++ /dev/null @@ -1,122 +0,0 @@ -import numpy as np -from allensdk.ephys.feature_extractor import EphysFeatureExtractor -import allensdk.ephys.ephys_extractor as efex -import allensdk.ephys.ephys_features as ft - -ALIGN_CUT_WINDOW = np.array([ 0.002, 0.015 ]) - -def find_spikes_list_old(voltage_list, dt): - out_idx = [] - out_v = [] - - for v in voltage_list: - idx, v = find_spikes_old(v, dt) - out_idx.append(idx) - out_v.append(v) - - return out_idx, out_v - -def find_spikes_list(voltage_list, dt): - v_set = [ v * 1e3 for v in voltage_list ] - t_set = [ np.arange(0, len(v)) * dt for v in voltage_list ] - i_set = [ np.zeros(len(v)) for v in voltage_list ] - - ext = efex.EphysSweepSetFeatureExtractor(t_set, v_set, i_set, filter=None) - ext.process_spikes() - sweep_spikes = [ s.spikes() for s in ext.sweeps() ] - - out_idx = [ np.array([ int(s['threshold_index']) for s in spikes ]) for spikes in sweep_spikes ] - out_v = [ np.array([ s['threshold_v'] for s in spikes ]) for spikes in sweep_spikes ] - - return out_idx, out_v - -SHORT_SQUARE_MAX_THRESH_FRAC = 0.1 - -def find_spikes_ssq_list(voltage_list, dt, dv_cutoff, thresh_frac): - v_set = [ v * 1e3 for v in voltage_list ] - t_set = [ np.arange(0, len(v)) * dt for v in voltage_list ] - i_set = [ np.zeros(len(v)) for v in voltage_list ] - - thresh_frac = max(SHORT_SQUARE_MAX_THRESH_FRAC, thresh_frac) - - ext = efex.EphysSweepSetFeatureExtractor(t_set, v_set, i_set, - dv_cutoff=dv_cutoff, - thresh_frac=thresh_frac, - filter=None) - ext.process_spikes() - sweep_spikes = [ e.spikes() for e in ext.sweeps() ] - - out_idx = [ np.array([ int(s['threshold_index']) for s in spikes ]) for spikes in sweep_spikes ] - out_v = [ np.array([ s['threshold_v'] for s in spikes ]) for spikes in sweep_spikes ] - - return out_idx, out_v - -def find_spikes_old(v, dt): - v = v * 1e3 # convert V => mV - t = np.arange(0, len(v)) * dt - i = np.zeros(t.shape) - - - - fx = efex.EphysSweepFeatureExtractor(t=t, v=v, i=i) - fx.process_spikes() - feature_data = fx.spikes() - - #fx = EphysFeatureExtractor() - #fx.process_instance("", v, i ,t, 0, t[-1], "") - #feature_data = fx.feature_list[0].mean - - ids = np.array([ s["threshold_idx"] for s in feature_data ]) - vs = np.array([ s["threshold_v"] for s in feature_data ]) - - vs /= 1e3 # mV => V - - return ids, vs - - -def align_and_cut_spikes(voltage_list, current_list, dt, spike_window = None): - ''' This function aligns the spikes to some criteria and returns a current and voltage trace of - of the spike over a time window. Also returns zero crossing,and threshold - in reference to the aligned spikes. - ''' - if spike_window is None: - spike_window = ALIGN_CUT_WINDOW - - spike_shapes = [] - current_shapes = [] - index_before_spike = int(spike_window[0] / dt) - index_after_spike = int(spike_window[1] / dt) - aligned_spike_ind = np.array([]) - spike_sweeps = [] - spikes_per_trace = np.array([]) - - spike_ind_list, _ = find_spikes_list(voltage_list, dt) - - for jj, voltage_and_current_and_spike in enumerate(zip(voltage_list, current_list, spike_ind_list)): - voltage, current, whole_trace_spike_ind = voltage_and_current_and_spike - - spikes_per_trace = np.append(spikes_per_trace, len(whole_trace_spike_ind)) - - alignment_ind = whole_trace_spike_ind - aligned_spike_ind = np.append(aligned_spike_ind, np.ones(len(whole_trace_spike_ind)) * index_before_spike) - - # print('alignment_ind', alignment_ind) - spike_delimiters = [(ind - index_before_spike, ind + index_after_spike) for ind in alignment_ind] - for d in spike_delimiters: - # this 'if' statement makes sure we don't cause a ValueError - if min(d) > 0 and max(d) < len(voltage) - 1: - spike_trace = voltage[d[0]:d[1]] - current_trace = current[d[0]:d[1]] - spike_shapes.append(spike_trace) - current_shapes.append(current_trace) - spike_sweeps.append(jj) - - - # note: that depending on how things were aligned, all of one of the values will be the same. - print("spikes_per_trace", spikes_per_trace) - temp = np.append(0, np.cumsum(spikes_per_trace)) - print('temp', temp) - wave_index_of_first_spikes = [int(ii) for ii in list(temp[range(0, len(temp) - 1)])] - print("in cut spikes: wave_index_of_first_spikes ", wave_index_of_first_spikes) - - return spike_shapes, current_shapes, aligned_spike_ind, wave_index_of_first_spikes, spike_sweeps diff --git a/allensdk/internal/model/glif/find_sweeps.py b/allensdk/internal/model/glif/find_sweeps.py deleted file mode 100644 index 88d294fb98..0000000000 --- a/allensdk/internal/model/glif/find_sweeps.py +++ /dev/null @@ -1,201 +0,0 @@ -import json, sys, os -import logging -import argparse -from six import iteritems -from six.moves import xrange -import allensdk.core.json_utilities as ju - - -SHORT_SQUARE = 'Short Square' -SHORT_SQUARE_60 = 'Short Square - Hold -60mv' -SHORT_SQUARE_80 = 'Short Square - Hold -80mv' -LONG_SQUARE = 'Long Square' -RAMP = 'Ramp' -NOISE1 = 'Noise 1' -NOISE2 = 'Noise 2' -SHORT_SQUARE_TRIPLE = 'Short Square - Triple' -RAMP_TO_RHEO = 'Ramp to Rheobase' - - -class MissingSweepException( Exception ): pass - -def get_sweep_numbers(sweep_list): - return [ s['sweep_number'] for s in sweep_list] - - -def get_sweeps_by_name(sweeps, sweep_type): - if isinstance(sweeps, dict): - return [ s for sn,s in iteritems(sweeps) if s[u'ephys_stimulus'][u'ephys_stimulus_type'][u'name'] == sweep_type ] - else: - return [ s for s in sweeps if s[u'ephys_stimulus'][u'ephys_stimulus_type'][u'name'] == sweep_type ] - - -def find_ranked_sweep(sweep_list, key, reverse=False): - if sweep_list: - sorted_sweep_list = sorted(sweep_list, key=lambda x: x[key], reverse=reverse) - - out_sweeps = [ sorted_sweep_list[0] ] - - for i in xrange(1,len(sweep_list)): - if sorted_sweep_list[i][key] == out_sweeps[0][key]: - out_sweeps.append(sorted_sweep_list[i]) - else: - break - - return get_sweep_numbers(out_sweeps) - else: - return [] - - -def organize_sweeps_by_name(sweeps, name): - sweep_list = sorted(get_sweeps_by_name(sweeps, name), key=lambda x: x['sweep_number']) - - subthreshold_list = [ s for s in sweep_list if s.get('num_spikes',None) in [0, None] ] - suprathreshold_list = [ s for s in sweep_list if s.get('num_spikes',None) > 0 ] - - return { - 'all': get_sweep_numbers(sweep_list), - 'subthreshold': get_sweep_numbers(subthreshold_list), - 'suprathreshold': get_sweep_numbers(suprathreshold_list), - 'maximum_subthreshold': find_ranked_sweep(subthreshold_list, 'stimulus_amplitude', reverse=True), - 'minimum_suprathreshold': find_ranked_sweep(suprathreshold_list, 'stimulus_amplitude') - #'maximum_subthreshold': find_ranked_sweep(subthreshold_list, 'stimulus_absolute_amplitude', reverse=True), - #'minimum_suprathreshold': find_ranked_sweep(suprathreshold_list, 'stimulus_absolute_amplitude') - } - -def find_long_square_sweeps(sweeps): - out = organize_sweeps_by_name(sweeps, LONG_SQUARE) - return out - - -def find_ramp_to_rheo_sweeps(sweeps): - out = organize_sweeps_by_name(sweeps, RAMP_TO_RHEO) - return out - - -def find_short_square_sweeps(sweeps): - ''' - Find 1) all of the subthreshold short square sweeps - 2) all of the superthreshold short square sweeps - 3) the subthresholds short square sweep with maximum stimulus amplitude - ''' - - out = organize_sweeps_by_name(sweeps, SHORT_SQUARE) - out60 = organize_sweeps_by_name(sweeps, SHORT_SQUARE_60) - out80 = organize_sweeps_by_name(sweeps, SHORT_SQUARE_80) - out_triple = organize_sweeps_by_name(sweeps, SHORT_SQUARE_TRIPLE) - - out['all_60'] = out60['all'] - out['all_80'] = out80['all'] - out['triple'] = out_triple['all'] - - if len(out['maximum_subthreshold']) == 0: - raise MissingSweepException("No maximum subthreshold short square") - - if len(out['minimum_suprathreshold']) == 0: - raise MissingSweepException("No minimum suprathreshold short square") - - return out - - -def find_ramp_sweeps(sweeps): - ''' - Find 1) all ramp sweeps - 2) all subthreshold ramps - 3) all superthreshold ramps - ''' - out = organize_sweeps_by_name(sweeps, RAMP) - - return out - - -def find_noise_sweeps(sweeps): - ''' - Find 1) the noise1 sweeps - 2) the noise2 sweeps - 4) all noise sweeps - ''' - - noise1 = organize_sweeps_by_name(sweeps, NOISE1) - noise2 = organize_sweeps_by_name(sweeps, NOISE2) - - all_noise_sweeps = sorted(noise1['all'] + noise2['all']) - - out = { - 'all': all_noise_sweeps, - 'noise1': noise1['all'], - 'noise2': noise2['all'] - } - - num_noise1_sweeps = len(out['noise1']) - num_noise2_sweeps = len(out['noise2']) - - required_noise1_sweeps = 2 - required_noise2_sweeps = 2 - - if num_noise1_sweeps < required_noise1_sweeps: - raise MissingSweepException("not enough noise1 sweeps (%d/%d)" % (num_noise1_sweeps, required_noise1_sweeps)) - - if num_noise2_sweeps < required_noise2_sweeps: - raise MissingSweepException("not enough noise2 sweeps (%d/%d)" % (num_noise2_sweeps, required_noise2_sweeps)) - - return out - - -def find_sweeps(sweep_list): - - sweep_index = { s['sweep_number']: s for s in sweep_list } - - data = {} - ssq_data = find_short_square_sweeps(sweep_index) - data.update(ssq_data) - - lsq_data = find_long_square_sweeps(sweep_index) - data.update(lsq_data) - - ramp_data = find_ramp_sweeps(sweep_index) - data.update(ramp_data) - - r2r_data = find_ramp_to_rheo_sweeps(sweep_index) - data.update(r2r_data) - - noise_data = find_noise_sweeps(sweep_index) - data.update(noise_data) - - return data, sweep_index - - -def parse_arguments(): - parser = argparse.ArgumentParser(description='find relevant sweeps from a sweep catalog') - - parser.add_argument('sweep_list_file', help='json file containing a list of sweeps for a cell') - parser.add_argument('output_file', help='output json data config file') - - args = parser.parse_args() - - try: - if not os.path.exists(args.sweep_list_file): - raise Exception("sweep list file (%s) does not exist" % args.sweep_file) - - except Exception as e: - parser.print_help() - sys.exit(1) - - return args - - -def main(): - args = parse_arguments() - - sweep_list = ju.read(args.sweep_list_file) - - data = find_sweeps(sweep_list) - - ju.write(args.output_file, data) - - if len(errs > 0): - for err in errs: - logging.error(err) - sys.exit(1) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/model/glif/glif_experiment.py b/allensdk/internal/model/glif/glif_experiment.py deleted file mode 100644 index fec4e15440..0000000000 --- a/allensdk/internal/model/glif/glif_experiment.py +++ /dev/null @@ -1,162 +0,0 @@ -import logging -from six.moves import xrange -import numpy as np - -# TODO: license -# TODO: document - -class GlifExperiment( object ): - def __init__(self, neuron, dt, stim_list, resp_list, - spike_time_steps, grid_spike_times, grid_spike_voltages, - param_fit_names, - **kwargs): - - self.neuron = neuron - self.dt = dt - self.stim_list = stim_list - self.resp_list = resp_list - self.spike_time_steps = spike_time_steps - self.grid_spike_times = grid_spike_times - self.grid_spike_voltages = grid_spike_voltages - self.param_fit_names = param_fit_names - - self.spike_errors = [] - - - def run(self, param_guess): - '''This code will run the loaded neuron model in reference to the target neuron spikes. - inputs: - self: is the instance of the neuron model and parameters alone with the values of the target spikes. - NOTE the values in each array of the self.gridSpikeIndexTarge_list and the self.interpolated_spike_times - are in reference to the time start of of the stim in each induvidual array (not the universal time) - param_guess: array of scalars of the values that will be inserted into the mapping function below. - returns: - voltage_list: list of array of voltage values. NOTE: IF THE MODEL NEURON SPIKES BEFORE THE TARGET THE VOLTAGE WILL - NOT BE CALCULATED THEREFORE THE RESULTING VECTOR WILL NOT BE AS LONG AS THE TARGET AND ALSO WILL NOT - MAKE SENSE WITH THE STIMULUS UNLESS YOU CUT IT AND OUTPUT IT TOO. - grid_spike_times_list: - interpolated_spike_time_list: an array of the actual times of the spikes. NOTE: THESE TIMES ARE CALCULATED BY ADDING THE - TIME OF THE INDIVIDUAL SPIKE TO THE TIME OF THE LAST SPIKE. - gridISIFromLastTargSpike_list: list of arrays of spike times of the model in reference to the last target (biological) - spike (not in reference to sweep start) - interpolatedISIFromLastTargSpike_list: list of arrays of spike times of the model in reference to the last target (biological) - spike (not in reference to sweep start) - voltageOfModelAtGridBioSpike_list: list of arrays of scalars that contain the voltage of the model neuron when the target or bio neuron spikes. - theshOfModelAtGridBioSpike_list: list of arrays of scalars that contain the threshold of the model neuron when the target or bio neuron spikes.''' - - self.set_neuron_parameters(param_guess) - self.spike_errors = [] - - run_data = [] - - for stim_list_index in xrange(len(self.stim_list)): - run_data.append(self.neuron.run_with_biological_spikes(self.stim_list[stim_list_index], - self.resp_list[stim_list_index], - self.spike_time_steps[stim_list_index])) - - return { - 'voltage': [ rd['voltage'] for rd in run_data ], - 'threshold': [ rd['threshold'] for rd in run_data ], - 'AScurrent_matrix': [ rd['AScurrent_matrix'] for rd in run_data ], - - 'grid_ISI': [ rd['grid_ISI'] for rd in run_data ], - 'interpolated_ISI': [ rd['interpolated_ISI'] for rd in run_data ], - - 'grid_model_spike_times': [ rd['grid_model_spike_times'] for rd in run_data ], - 'interpolated_model_spike_times': [ rd['interpolated_model_spike_times'] for rd in run_data ], - - 'grid_model_spike_voltages': [ rd['grid_model_spike_voltages'] for rd in run_data ], - 'interpolated_model_spike_voltages': [ rd['interpolated_model_spike_voltages'] for rd in run_data ], - - 'grid_bio_spike_model_voltage': [ rd['grid_bio_spike_model_voltage'] for rd in run_data ], - 'grid_bio_spike_model_threshold': [ rd['grid_bio_spike_model_threshold'] for rd in run_data ] - } - - - def run_base_model(self, param_guess): - '''This code will run the loaded neuron model. - inputs: - self: is the instance of the neuron model and parameters alone with the values of the target spikes. - NOTE the values in each array of the self.gridSpikeIndexTarge_list and the self.interpolated_spike_times - are in reference to the time start of of the stim in each induvidual array (not the universal time) - param_guess: array of scalars of the values that will be inserted into the mapping function below. - returns: - voltage_list: list of array of voltage values. NOTE: IF THE MODEL NEURON SPIKES BEFORE THE TARGET THE VOLTAGE WILL - NOT BE CALCULATED THEREFORE THE RESULTING VECTOR WILL NOT BE AS LONG AS THE TARGET AND ALSO WILL NOT - MAKE SENSE WITH THE STIMULUS UNLESS YOU CUT IT AND OUTPUT IT TOO. - gridTime_list: - interpolatedTime_list: an array of the actual times of the spikes. NOTE: THESE TIMES ARE CALCULATED BY ADDING THE - TIME OF THE INDIVIDUAL SPIKE TO THE TIME OF THE LAST SPIKE. - grid_ISI_list: list of arrays of spike times of the model in reference to the last target (biological) - spike (not in reference to sweep start) - interpolated_ISI_list: list of arrays of spike times of the model in reference to the last target (biological) - spike (not in reference to sweep start) - grid_spike_voltage_list: list of arrays of scalars that contain the voltage of the model neuron when the target or bio neuron spikes. - grid_spike_threshold_list: list of arrays of scalars that contain the threshold of the model neuron when the target or bio neuron spikes.''' - - - stim_list = self.stim_list - - self.set_neuron_parameters(param_guess) - self.spike_errors = [] - - run_data = [] - - for stim_list_index in xrange(len(stim_list)): - run_data.append(self.neuron.run(stim_list[stim_list_index])) - - - return { - 'voltage': [ rd['voltage'] for rd in run_data ], - 'threshold': [ rd['threshold'] for rd in run_data ], - 'AScurrents': [ rd['AScurrents'] for rd in run_data ], - - 'spike_time_steps': [ rd['spike_time_steps'] for rd in run_data ], - 'grid_spike_times': [ rd['grid_spike_times'] for rd in run_data ], - 'interpolated_spike_times': [ rd['interpolated_spike_times'] for rd in run_data ], - - 'interpolated_spike_voltage': [ rd['interpolated_spike_voltage'] for rd in run_data ], - 'interpolated_spike_threshold': [ rd['interpolated_spike_threshold'] for rd in run_data ] - } - - def neuron_parameter_count(self): - count = 0 - for fit_name in self.param_fit_names: - try: - coeff = self.neuron.coeffs[fit_name] - except KeyError: - logging.error("Neuron coefficient %s does not exist" % fit_name) - raise - - # is it a list? - try: - # this will throw a type error if 'coeff' is a scalar - coeff_size = len(coeff) - count += coeff_size - except TypeError: - count += 1 - return count - - def set_neuron_parameters(self, param_guess): - '''Maps the parameter guesses to the coefficients of the model. - input: - param_guess is vector of values. It is assumed that the length will be ''' - - index = 0 - for fit_name in self.param_fit_names: - try: - coeff = self.neuron.coeffs[fit_name] - except KeyError: - logging.error("Neuron coefficient %s does not exist" % fit_name) - raise - - # is it a list? - try: - # this will throw a type error if 'coeff' is a scalar - coeff_size = len(coeff) - self.neuron.coeffs[fit_name] = param_guess[index:index+coeff_size] - index += coeff_size - except TypeError: - self.neuron.coeffs[fit_name] = param_guess[index] - index += 1 - diff --git a/allensdk/internal/model/glif/glif_optimizer.py b/allensdk/internal/model/glif/glif_optimizer.py deleted file mode 100644 index bd019f17b9..0000000000 --- a/allensdk/internal/model/glif/glif_optimizer.py +++ /dev/null @@ -1,296 +0,0 @@ -import logging - -import numpy as np - -import time - -from scipy.optimize import fminbound, fmin -from scipy.optimize import minimize - -import json - -from uuid import uuid4 - -import allensdk.internal.model.glif.error_functions as error_functions - -# TODO: clean up -# TODO: license -# TODO: document - -class GlifOptimizer(object): - def __init__(self, experiment, dt, - outer_iterations, inner_iterations, - sigma_outer, sigma_inner, - param_fit_names, stim, - xtol, ftol, - internal_iterations, - bessel, - error_function = None, - error_function_data = None, - init_params = None): - - self.start_time = None - self.rng = np.random.RandomState() - - self.experiment = experiment - self.dt = dt - self.outer_iterations = outer_iterations - self.inner_iterations = inner_iterations - self.init_params = init_params - self.sigma_outer = sigma_outer - self.sigma_inner = sigma_inner - self.param_fit_names = param_fit_names - self.stim = stim - - # use MLIN by default - if error_function is None: - error_function = error_functions.MLIN_list_error - - self.error_function = error_function - self.error_function_data = error_function_data - - self.xtol = xtol - self.ftol = ftol - - self.internal_iterations = internal_iterations - - self.bessel = bessel - - logging.info('internal_iterations: %s' % internal_iterations) - logging.info('outer_iterations: %s' % outer_iterations) - logging.info('inner_iterations: %s' % inner_iterations) - - self.iteration_info = []; - - expected_param_count = experiment.neuron_parameter_count() - - if self.init_params is None: - self.init_params = np.ones(expected_param_count) - elif len(self.init_params) != expected_param_count: - self.init_params = np.ones(expected_param_count) - logging.warning('optimizer init_params has wrong length (given %d, expected %d). settings to all ones' % (len(self.init_params), expected_param_count)) - - def to_dict(self): - return { - 'outer_iterations': self.outer_iterations, - 'inner_iterations': self.inner_iterations, - 'init_params': self.init_params, - 'sigma_outer': self.sigma_outer, - 'sigma_inner': self.sigma_inner, - 'param_fit_names': self.param_fit_names, - 'xtol': self.xtol, - 'ftol': self.ftol, - 'internal_iterations': self.internal_iterations, - 'iteration_info': self.iteration_info, - 'bessel': self.bessel - } - - def randomize_parameter_values(self, values, sigma): - values = np.array(self.rng.normal(values, sigma)) - - # values might not have a shape if it's a single element long, depending on your numpy version - if not values.shape: - values = np.array([values]) - return values - - def initiate_unique_seed(self, seed=None): - - if seed == None: - x1=str(int(uuid4())) #get a uuid, turn it into int then turn it into string - x2=[x1[ii:ii+8]for ii in range(0,40,8)] #break it up into chunks - x3=[int(ii) for ii in x2]#turn string chunks back into integers - print('seed', x3) - self.rng.seed(x3) - else: - self.rng.seed(seed) - - def evaluate(self, x, dt_multiplier=100): - - self.experiment.neuron.dt_multiplier = dt_multiplier - return self.error_function([x], self.experiment, self.error_function_data) - - def run_many(self, iteration_finished_callback=None, seed=None): - self.initiate_unique_seed(seed=seed) - params_start = self.init_params - self.start_time = time.time() - params=params_start -# params=self.randomize_parameter_values(params_start, self.sigma_outer) - print('actual starting parameters', params) - - stop_flag=False - - # TODO: unhardcode this - dt_multiplier_list = [100, 32, 10] - #Note the following line may be useful when there are more iteration but is hasnt been tested -# dt_multiplier_list = np.ceil(np.logspace(1,2,self.inner_iterations))[::-1].astype(int) - print(dt_multiplier_list) -# dt_multiplier_list = [10,10,10] - #TODO: figure out the implications of this being an int versus float - #TODO: make this so that dt multiplier actually gets set - for outer in range(0, self.outer_iterations): #outerloop - for inner in range(0, self.inner_iterations): #innerloop - iteration_start_time = time.time() - - # run the optimizer once. first time is always the passed initial conditions. -# print('dt_multiplier_list[inner]', dt_multiplier_list[inner]) - #--set this equal to 1 if want to do it slow - self.experiment.neuron.dt_multiplier = dt_multiplier_list[inner] - #self.experiment.neuron.dt_multiplier = 10 - - - opt = self.run_once(params) - xopt, fopt = opt[0], opt[1] - - logging.info('fmin took %f secs, %f mins, %f hours' % (time.time() - iteration_start_time, (time.time() - iteration_start_time)/60, (time.time() - iteration_start_time)/60/60)) - - self.iteration_info.append({ - 'in_params': np.array(params).tolist(), - 'out_params': xopt.tolist(), - 'error': float(fopt), - 'dt_multiplier': self.experiment.neuron.dt_multiplier - }) - -# ER=self.iteration_info['error'] -# ETOL=1.e-4 -# if len(ER) >=3: -# #!!!!!!!!!!!!!!!fix this to use that actual parameters!!!!!!!!!!!!!!!!!!!!!! -# if np.abs(ER[-1]-ER[-2])<ETOL and np.abs(ER[-1]-ER[-3])<ETOL and np.abs(ER[-2]-ER[-3])<ETOL: -# stop_flag=True - - - - if iteration_finished_callback is not None: - iteration_finished_callback(self, outer, inner) - - if stop_flag is True: - break - - # randomize the best fit parameters - params = self.randomize_parameter_values(xopt, self.sigma_inner) - #params = xtol*(1-self.eps/2+self.eps*np.random.random(len(params),)) - - #---Calculate the other fitness functions - - '''Add other fitness functions here - first gotta calculate the spike trains again - also look and see what the difference between - the size of a pickle file and a text file is to - decide how to save stimulus and traces''' - - #Take the current best values and run the program again. - #tempTimeIterStart=time.time() - #(voltage_list, threshold_list, AScurrentMatrix_list, gridSpikeTime_list, interpolatedSpikeTime_list, \ - # gridSpikeIndex_list, interpolatedSpikeVoltage_list, interpolatedSpikeThreshold_list) = \ - # self.experiment.run_base_model(xtol) - - #timeFor1Iter=time.time()-tempTimeIterStart - - # outer loop uses the outer standard deviation to randomize the initial values - - if stop_flag is True: - break - - params = self.randomize_parameter_values(self.init_params, self.sigma_outer) - - - # get the best one! - min_error = float("inf") - min_i = -1 - min_dt_multiplier = float("inf") - - for i, info in enumerate(self.iteration_info): - if info['dt_multiplier'] < min_dt_multiplier: - min_dt_multiplier = info['dt_multiplier'] - - for i, info in enumerate(self.iteration_info): - if info['error'] < min_error and info['dt_multiplier'] == min_dt_multiplier: - min_error = info['error'] - min_i = i - - best_params = self.iteration_info[min_i]['out_params'] - - self.experiment.set_neuron_parameters(best_params) - - logging.info('done optimizing') - return best_params, self.init_params - - def run_once_bound(self, low_bound, high_bound): - ''' - @param low_bound: a scalar initial guess for the optimizer - @param high_bound: a scalar high bound for the optimizer - @return: tuple including parameters that optimize function and value - see fmin docs - ''' - return fminbound(self.error_function, low_bound, high_bound, args=(self.experiment,self.error_function_data), maxfun=200, full_output=True ) - #Note is defined in the top level script - - - def run_once(self, param0): - ''' - @param param0: a list of the initial guesses for the optimizer - @return: tuple including parameters that optimize function and value - see fmin docs - ''' -# fmin(func, x0, args=(), xtol=1e-4, ftol=1e-4, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None): - - print('self.error_function_data', self.error_function_data) - xopt, fopt, _, _, _, _ = fmin(self.error_function, param0, args=(self.experiment,self.error_function_data),xtol=self.xtol, ftol=self.ftol, maxiter=self.internal_iterations, maxfun=self.internal_iterations, retall=1,full_output=1, disp=1) - - return xopt, fopt -# res = minimize(self.error_function, param0, -# method='Nelder-Mead', -# args=(self.experiment,self.error_function_data), -# options={ -# 'maxiter':self.internal_iterations, -# 'xtol':self.xtol, -# 'ftol':self.ftol, -# 'maxfun':self.internal_iterations, -# 'retall':1, -# 'full_output':1, -# 'disp':1} -# ) - -# res = minimize(self.error_function, param0, -# jac=False, -# method='BFGS', -# args=(self.experiment,self.error_function_data), -# options={ -# 'maxiter':self.internal_iterations, -# 'epsilon':1e-8, -# 'gtol':1e-5, -# 'full_output':1, -# 'disp':1} -# ) -# -# -# print(res) -# return res.x, res.fun - - -# #Note is defined in the top level script -# def mycallback_ncg(xk): -# print('Using Newton-CG method, xk: ', xk) -# def mycallback_nm(xk): -# print('Using Nelder-Mead method, xk: ', xk) -# eps=1e-15 -# options={} -# # options['avextox']=eps -# options['maxiter']=500 -## options['full_output']=True -## options['disp']=True -## options['retall']=True -# -# print('Using Newton-CG method') -# iteration_start_time = time.time() -# xopt = minimize(self.error_function, param0, args=(self.experiment,), method='Newton-CG', jac=f_prime_constructor(self.error_function), callback=mycallback_ncg, options=options, tol=eps) -# print('Newton-CG method took', (time.time()-iteration_start_time)/60., 'seconds') -# -## print('Using Nelder-Mead method') -## iteration_start_time = time.time() -## xopt = minimize(self.error_function, param0, args=(self.experiment,), method='Nelder-Mead', callback=mycallback_nm, options=options, tol=eps) -## print('Nelder-Mead method took', (time.time()-iteration_start_time)/60., 'seconds') -# -# print(xopt) -# return xopt, fopt - - - - diff --git a/allensdk/internal/model/glif/glif_optimizer_neuron.py b/allensdk/internal/model/glif/glif_optimizer_neuron.py deleted file mode 100644 index eccfeb4f5b..0000000000 --- a/allensdk/internal/model/glif/glif_optimizer_neuron.py +++ /dev/null @@ -1,632 +0,0 @@ -import logging -import numpy as np -from six.moves import xrange -import scipy.interpolate as spi - -import allensdk.model.glif.glif_neuron as glif_neuron - -# TODO: license -# TODO: document - -class GlifNeuronException( Exception ): - """ Exception for catching simulation errors and reporting intermediate data. """ - def __init__(self, message, data): - super(Exception, self).__init__(message) - self.data = data - -class GlifBadInitializationException( Exception ): - """ Exception raised when voltage is above threshold at the beginning of a sweep. i.e. probably caused by the optimizer. """ - def __init__(self, message, dv, step): - super(Exception, self).__init__(message) - self.dv = dv - self.step=step - -class GlifOptimizerNeuron( glif_neuron.GlifNeuron ): - '''Contains methods for running the neuron model in a "forced-spike" paradigm - used during optimization. - ''' - - TYPE = "GLIF" - - def __init__(self, *args, **kwargs): - - super(GlifOptimizerNeuron, self).__init__(*args, **kwargs) - - self.extrapolation_method_name = kwargs.get('extrapolation_method_name', 'endpoints') - if self.extrapolation_method_name == 'endpoints': - self.extrapolation_method = extrapolate_model_spike_from_endpoints - elif self.extrapolation_method_name == 'endpoints_single_tau': - self.extrapolation_method = extrapolate_model_spike_from_endpoints_single_tau - else: - raise Exception('unknown extrapolation method: %s' % self.extrapolation_method_name) - - #TODO: what is this where is it comming from? - self.dt_multiplier = kwargs.get('dt_multiplier', 1) - self.El_reference = kwargs.get('El_reference',None) - - - @classmethod - def from_dict(cls, d): - - return cls(El = d['El'], - dt = d['dt'], -# tau = d['tau'], - asc_tau_array=d['asc_tau_array'], - R_input = d['R_input'], - C = d['C'], - asc_amp_array = d['asc_amp_array'], - spike_cut_length = d['spike_cut_length'], - th_inf = d['th_inf'], - th_adapt=None, - coeffs = d.get('coeffs', {}), - AScurrent_dynamics_method = d['AScurrent_dynamics_method'], - voltage_dynamics_method = d['voltage_dynamics_method'], - threshold_dynamics_method = d['threshold_dynamics_method'], - voltage_reset_method = d['voltage_reset_method'], - AScurrent_reset_method = d['AScurrent_reset_method'], - threshold_reset_method = d['threshold_reset_method'], - init_voltage = d['init_voltage'], - init_threshold = d['init_threshold'], - init_AScurrents = d['init_AScurrents'], - extrapolation_method_name = d.get('extrapolation_method_name', 'endpoints'), - dt_multiplier = d.get('dt_multiplier',1), - El_reference = d['El_reference'] - ) - - @classmethod - def from_dict_legacy(cls, d): - - return cls(El = d['El'], - dt = d['dt'], -# tau = d['tau'], - asc_tau_array=d['asc_tau_array'], - R_input = d['R_input'], - C = d['C'], - asc_amp_array = d['asc_amp_array'], - spike_cut_length = d['spike_cut_length'], - th_inf = d['th_inf'], - th_adapt=d['th_adapt'], - coeffs = d.get('coeffs', {}), - AScurrent_dynamics_method = d['AScurrent_dynamics_method'], - voltage_dynamics_method = d['voltage_dynamics_method'], - threshold_dynamics_method = d['threshold_dynamics_method'], - voltage_reset_method = d['voltage_reset_method'], - AScurrent_reset_method = d['AScurrent_reset_method'], - threshold_reset_method = d['threshold_reset_method'], - init_voltage = d['init_voltage'], - init_threshold = d['init_threshold'], - init_AScurrents = d['init_AScurrents'], - extrapolation_method_name = d.get('extrapolation_method_name', 'endpoints'), - dt_multiplier = d.get('dt_multiplier',1) - ) - - def to_dict(self): - - curr_dict = super(GlifOptimizerNeuron, self).to_dict() - curr_dict.update({'extrapolation_method_name':self.extrapolation_method_name, - 'dt_multiplier':self.dt_multiplier, - 'El_reference':self.El_reference}) - - return curr_dict - - def run_with_biological_spikes(self, stimulus, response, bio_spike_time_steps): - """ Run the neuron simulation over a stimulus, but do not allow the model to spike on its own. Rather, - force the simulation to spike and reset at a given set of spike indices. Dynamics rules are applied - between spikes regardless of the simulated voltage and threshold values. Reset rules are applied only - at input spike times. This is used during optimization to force the model to follow the spikes of biological data. - The model is optimized in this way so that history effects due to spiking can be adequately modeled. For example, - every time the model spikes a new set of afterspike currents will be initiated. To ensure that afterspike currents - can be optimized, we force them to be initiated at the time of the biological spike. - - Parameters - ---------- - stimulus : np.ndarray - vector of scalar current values - respones : np.ndarray - vector of scalar voltage values - bio_spike_time_steps : list - spike time step indices - - Returns - ------- - dict - a dictionary containing: - 'voltage': simulated voltage values, - 'threshold': simulated threshold values, - 'AScurrent_matrix': afterspike currents during the simulation, - 'grid_model_spike_times': spike times of the model aligned to the simulation grid (when it would have spiked), - 'interpolated_model_spike_times': spike times of the model linearly interpolated between time steps, - 'grid_ISI': interspike interval between grid model spike times, - 'interpolated_ISI': interspike interval between interpolated model spike times, - 'grid_bio_spike_model_voltage': voltage of the model at biological/input spike times, - 'grid_bio_spike_model_threshold': voltage of the model at biological/input spike times interpolated between time steps - """ - - self.threshold_components = None #get rid of lingering threshold components - - voltage_t0 = self.init_voltage - threshold_t0 = self.init_threshold - AScurrents_t0 = self.init_AScurrents - - if voltage_t0>threshold_t0: - raise GlifBadInitializationException("Voltage STARTS above threshold: voltage_t0 (%f) threshold_t0 (%f)" % ( voltage_t0, threshold_t0, voltage_t0 - threshold_t0, 10000000.0)) - - start_index = 0 - end_index = 0 - - try: - num_spikes = len(bio_spike_time_steps) - - # if there are no target spikes, just run until the model spikes - if num_spikes == 0: - - start_index = 0 - end_index = len(stimulus) - - # evaluate the model starting from the beginning until the model spikes - run_data = self.run_until_biological_spike(voltage_t0, threshold_t0, AScurrents_t0, - stimulus, response, start_index, end_index, - []) - - voltage = run_data['voltage'] - threshold = run_data['threshold'] - AScurrent_matrix = run_data['AScurrent_matrix'] - - if len(voltage) != len(stimulus): - logging.warning('Your voltage output is not the same length as your stimulus') - if len(threshold) != len(stimulus): - logging.warning('Your threshold output is not the same length as your stimulus') - if len(AScurrent_matrix) != len(stimulus): - logging.warning('Your AScurrent_matrix output is not the same length as your stimulus') - - # do not keep track of the spikes in the model that spike if the target doesn't spike. - grid_ISI = np.array([]) - interpolated_ISI = np.array([]) - - grid_model_spike_times = np.array([]) - interpolated_model_spike_times = np.array([]) - - grid_model_spike_voltages = np.array([]) - interpolated_model_spike_voltages = np.array([]) - - grid_bio_spike_model_voltage = np.array([]) - grid_bio_spike_model_threshold = np.array([]) - else: - # initialize the output arrays - grid_ISI = np.empty(num_spikes) - interpolated_ISI = np.empty(num_spikes) - - grid_model_spike_times = np.empty(num_spikes) - interpolated_model_spike_times = np.empty(num_spikes) - - grid_model_spike_voltages = np.empty(num_spikes) - interpolated_model_spike_voltages = np.empty(num_spikes) - - grid_bio_spike_model_voltage = np.empty(num_spikes) - grid_bio_spike_model_threshold = np.empty(num_spikes) - - spikeIndStart = 0 - - voltage = np.empty(len(stimulus)) - voltage[:] = np.nan - threshold = np.empty(len(stimulus)) - threshold[:] = np.nan - AScurrent_matrix = np.empty(shape=(len(stimulus), len(AScurrents_t0))) - AScurrent_matrix[:] = np.nan - - # run the simulation over the interspike intervals (starting at the beginning of the simulation). - start_index = 0 - for spike_num in range(num_spikes): - - if spike_num % 10 == 0: - logging.debug("spike %d / %d" % (spike_num, num_spikes)) - - end_index = int(bio_spike_time_steps[spike_num]) - - assert start_index < end_index, Exception("start_index > end_index: this is probably because spike_cut_length is longer than the previous inter-spike interval") - - # run the simulation over this interspike interval -# t0 = time.time() - run_data = self.run_until_biological_spike(voltage_t0, threshold_t0, AScurrents_t0, - stimulus, response, start_index, end_index, - bio_spike_time_steps) -# print('fast', time.time() - t0) - -# curr_voltage = run_data_fast['voltage'] -# curr_threshold = run_data_fast['threshold'] -# voltage_scrubbed = curr_voltage[np.logical_not(np.isnan(curr_voltage))] -# threshold_scrubbed = curr_threshold[np.logical_not(np.isnan(curr_threshold))] -# -# tmp_t = np.linspace(0,1,len(voltage_scrubbed)) -# print(voltage_scrubbed) -# plt.plot(tmp_t, voltage_scrubbed) -# plt.plot(tmp_t, threshold_scrubbed) -# -# plt.show() -# sys.exit() - -# for key, val in run_data.items(): -# print(key, val) -# sys.exit() - - - # assign the simulated data to the correct locations in the output arrays - voltage[start_index:end_index] = run_data['voltage'] - threshold[start_index:end_index] = run_data['threshold'] - AScurrent_matrix[start_index:end_index,:] = run_data['AScurrent_matrix'] - - grid_ISI[spike_num] = run_data['grid_model_spike_time'] - interpolated_ISI[spike_num] = run_data['interpolated_model_spike_time'] - - grid_model_spike_times[spike_num] = run_data['grid_model_spike_time'] + start_index * self.dt - interpolated_model_spike_times[spike_num] = run_data['interpolated_model_spike_time'] + start_index * self.dt - - grid_model_spike_voltages[spike_num] = run_data['grid_model_spike_voltage'] - interpolated_model_spike_voltages[spike_num] = run_data['interpolated_model_spike_voltage'] - - grid_bio_spike_model_voltage[spike_num] = run_data['grid_bio_spike_model_voltage'] - grid_bio_spike_model_threshold[spike_num] = run_data['grid_bio_spike_model_threshold'] - - # update the voltage, threshold, and afterspike currents for the next interval - voltage_t0 = run_data['voltage_t0'] - threshold_t0 = run_data['threshold_t0'] - AScurrents_t0 = run_data['AScurrents_t0'] - - start_index = end_index - - # if cutting spikes, jump forward the appropriate amount of time - if self.spike_cut_length > 0: - start_index += self.spike_cut_length - - # simulate the portion of the stimulus between the last spike and the end of the array. - # no spikes are recorded from this time! - run_data = self.run_until_biological_spike(voltage_t0, threshold_t0, AScurrents_t0, - stimulus, response, start_index, len(stimulus), - bio_spike_time_steps) - - voltage[start_index:] = run_data['voltage'] - threshold[start_index:] = run_data['threshold'] - AScurrent_matrix[start_index:,:] = run_data['AScurrent_matrix'] - - # make sure that the output data has the correct number of spikes in it - if ( len(interpolated_model_spike_times) != num_spikes or - len(grid_model_spike_times) != num_spikes or - len(grid_ISI) != num_spikes or - len(interpolated_ISI) != num_spikes or - len(grid_bio_spike_model_voltage) != num_spikes or - len(grid_bio_spike_model_threshold) != num_spikes): - raise Exception('The number of spikes in your output does not match your target') - - except GlifNeuronException as e: - - # if an exception was raised during run_until_spike, record any simulated data before exiting - voltage[start_index:end_index] = e.data['voltage'] - threshold[start_index:end_index] = e.data['threshold'] - AScurrent_matrix[start_index:end_index,:] = e.data['AScurrent_matrix'] - - out = { - 'voltage': voltage, - 'threshold': threshold, - 'AScurrent_matrix': AScurrent_matrix, - - 'grid_ISI': grid_ISI, - 'interpolated_ISI': interpolated_ISI, - - 'grid_model_spike_times': grid_model_spike_times, - 'interpolated_model_spike_times': interpolated_model_spike_times, - - 'grid_model_spike_voltages': grid_model_spike_voltages, - 'interpolated_model_spike_voltages': interpolated_model_spike_voltages, - - 'grid_bio_spike_model_voltage': grid_bio_spike_model_voltage, - 'grid_bio_spike_model_threshold': grid_bio_spike_model_threshold - } - - raise GlifNeuronException(e.message, out) - - return { - 'voltage': voltage, - 'threshold': threshold, - 'AScurrent_matrix': AScurrent_matrix, - - 'grid_model_spike_times': grid_model_spike_times, - 'interpolated_model_spike_times': interpolated_model_spike_times, - - 'grid_model_spike_voltages': grid_model_spike_voltages, - 'interpolated_model_spike_voltages': interpolated_model_spike_voltages, - - 'grid_ISI': grid_ISI, - 'interpolated_ISI': interpolated_ISI, - - 'grid_bio_spike_model_voltage': grid_bio_spike_model_voltage, - 'grid_bio_spike_model_threshold': grid_bio_spike_model_threshold - } - - def run_until_biological_spike(self, voltage_t0, threshold_t0, AScurrents_t0, - stimulus, response, start_index, after_end_index, - bio_spike_time_steps): - """ Run the neuron simulation over a segment of a stimulus given initial conditions for use in the "forced spike" - optimization paradigm. [Note: the section of stimulus - is meant to be between two biological neuron spikes. Thus the stimulus is during the interspike interval (ISI)]. The - model is simulated until either the model spikes or the end of the segment is reached. If the model does not spike, a - spike time is extrapolated past the end of the simulation segment. - - This function also returns the initial conditions for the subsequent stimulus segment. In the forced spike paradigm - there are several ways - - Parameters - ---------- - voltage_t0 : float - the current voltage of the neuron - threshold_t0 : float - the current spike threshold level of the neuron - AScurrents_t0 : np.ndarray - the current state of the afterspike currents in the neuron - stimulus : np.ndarray - the full stimulus array (not just the segment of data being simulated) - response : np.ndarray - the full response array (not just the segment of data being simulated) - start_index : int - index of global stimulus at which to start simulation - after_end_index : int - index of global stimulus *after* the last index to be simulated - bio_spike_time_steps : list - time steps of input spikes - - Returns - ------- - dict - a dictionary containing: - 'voltage': simulated voltage value - 'threshold': simulated threshold values - 'AScurrent_matrix': afterspike current values during the simulation - 'grid_model_spike_time': model spike time (in units of dt) - 'interpolated_model_spike_time': model spike time (in units of dt) interpolated between time steps - 'voltage_t0': reset voltage value to be used in subsequent simulation interval - 'threshold_t0': reset threshold value to be used in subsequent simulation interval - 'AScurrents_t0': reset afterspike current value to be used in subsequent simulation interval - 'grid_bio_spike_model_voltage': model voltage at the time of the input spike - 'grid_bio_spike_model_threshold': model threshold at the time of the input spike - """ - - grid_model_spike_time = None - grid_model_spike_voltage = None - interpolated_model_spike_time = None - interpolated_model_spike_voltage = None - - # preallocate arrays and matricies - num_time_steps_fine = after_end_index - start_index - t_fine_grid = np.arange(num_time_steps_fine)*self.dt - - #-------------------------------------------------------------------------------- - #---Apply refinement factor to integrate over larger time steps (assumes--------- - #---current within the steps can be averaged):---------------------------------- - #-------------------------------------------------------------------------------- - dt_old = self.dt - self.dt = self.dt*self.dt_multiplier - - # define the local course grain indicies note the last graining will be shorter and is appended to the end - local_coarse_indicies=np.append(np.arange(num_time_steps_fine)[::self.dt_multiplier], after_end_index - start_index) #the last indicie in this array is still one longer than the last simulated index - # convert the local coarse grained indicies into global incidies - global_coarse_indicies=local_coarse_indicies+start_index - - # TODO: I dont think this does anything. - if len(local_coarse_indicies)==2: - pass - - num_time_steps_coarse = len(local_coarse_indicies) - voltage_out_coarse_grid = np.empty(num_time_steps_coarse) - voltage_out_coarse_grid[:] = np.nan - threshold_out_coarse_grid = np.empty(num_time_steps_coarse) - threshold_out_coarse_grid[:] = np.nan - AScurrent_matrix_coarse_grid = np.empty(shape=(num_time_steps_coarse, len(AScurrents_t0))) - AScurrent_matrix_coarse_grid[:] = np.nan - # these grid times are in the local frame of reference - t_coarse_grid = np.arange(num_time_steps_coarse-1)*self.dt #subtracting the one off here because appending the actual last time that is not the same dt. - t_coarse_grid = np.append(t_coarse_grid, t_fine_grid[-1]) - dt_vector=t_coarse_grid[1:]-t_coarse_grid[:-1] #note that this vector is one index shorter than the t_course_grid - - # Define the coarse grain stimulus by taking the stimulus average between indicies. Note that since the initial input voltage is recorded in - # the output vectors the stimulus average is indeed the input to the correct time step (i.e. current being fed in is the average current before the step) - stimulus_coarse=[stimulus[global_coarse_indicies[ii]:global_coarse_indicies[ii+1]].mean() for ii in range(len(global_coarse_indicies)-1)] - - # step though time steps and calculate voltage values - for time_step in range(len(local_coarse_indicies)-1): #minus 1 is needed to match vector sizes because initial inputs are recorded in output vectors. - # update output values (Note: in general one can update values before or after the first time step. - # Here the input starting value of voltage is recorded before a time step. This means the last value is not recorded.) - voltage_out_coarse_grid[time_step] = voltage_t0 - threshold_out_coarse_grid[time_step] = threshold_t0 - AScurrent_matrix_coarse_grid[time_step,:] = np.matrix(AScurrents_t0) - - # record error in optimization if they are happening - if np.isnan(voltage_t0) or np.isinf(voltage_t0) or np.isnan(threshold_t0) or np.isinf(threshold_t0) or any(np.isnan(AScurrents_t0)) or any(np.isinf(AScurrents_t0)): - logging.error(self) - logging.error('time step: %d / %d' % (time_step, num_time_steps_coarse)) - logging.error(' voltage_t0: %f' % voltage_t0) - logging.error(' voltage started the run at: %f' % voltage_out_coarse_grid[0]) - logging.error(' voltage before: %s' % voltage_out_coarse_grid[time_step-20:time_step]) - logging.error(' threshold_t0: %f' % threshold_t0) - logging.error(' threshold started the run at: %f' % threshold_out_coarse_grid[0]) - logging.error(' threshold before: %s' % threshold_out_coarse_grid[time_step-20:time_step]) - logging.error(' AScurrents_t0: %s' % AScurrents_t0) - if 'a_spike' in self.threshold_dynamics_method.params: - logging.error(' a_spike: %s' % self.threshold_dynamics_method.params['a_spike']) - if 'b_spike' in self.threshold_dynamics_method.params: - logging.error(' b_spike: %s' % self.threshold_dynamics_method.params['b_spike']) - - # plot output in original index space - temp_fine_grid_for_intp=np.arange(0,t_coarse_grid[time_step-1], dt_old) - voltage_out_fine_grid = np.empty(num_time_steps_fine) - voltage_out_fine_grid[:] = np.nan - threshold_out_fine_grid = np.empty(num_time_steps_fine) - threshold_out_fine_grid[:] = np.nan - - fv = spi.interp1d(t_coarse_grid[:time_step], voltage_out_coarse_grid[:time_step], assume_sorted=True, bounds_error=False, fill_value=voltage_out_coarse_grid[-1]) - ft = spi.interp1d(t_coarse_grid[:time_step], threshold_out_coarse_grid[:time_step], assume_sorted=True, bounds_error=False, fill_value=threshold_out_coarse_grid[-1]) - - voltage_with_error = fv(temp_fine_grid_for_intp) - threshold_with_error = ft(temp_fine_grid_for_intp) - voltage_out_fine_grid[:len(voltage_with_error)]=voltage_with_error - threshold_out_fine_grid[:len(threshold_with_error)]=threshold_with_error - - AScurrent_matrix = np.empty(shape=(num_time_steps_fine, len(AScurrents_t0))) - AScurrent_matrix[:] = np.nan - for ii in range(len(AScurrents_t0)): - curr_fASc = spi.interp1d(t_coarse_grid[:time_step], AScurrent_matrix_coarse_grid[:time_step,ii], assume_sorted=True, bounds_error=False, fill_value=AScurrent_matrix_coarse_grid[-1,ii]) - temp_asc=curr_fASc(temp_fine_grid_for_intp) - AScurrent_matrix[:len(temp_asc),ii] = temp_asc - - raise GlifNeuronException('Invalid threshold, voltage, or after-spike current encountered.', { - 'voltage': voltage_out_fine_grid, - 'threshold': threshold_out_fine_grid, - 'AScurrent_matrix': AScurrent_matrix - }) - - # changing dt be the dt of the coarse bin (which is variable for the last bin) - self.dt=dt_vector[time_step] - (voltage_t1, threshold_t1, AScurrents_t1) = self.dynamics(voltage_t0, threshold_t0, AScurrents_t0, stimulus_coarse[time_step], time_step+start_index, bio_spike_time_steps) #TODO fix list versus array - - # updating the input values - voltage_t0=voltage_t1 - threshold_t0=threshold_t1 - AScurrents_t0=AScurrents_t1 - - # Inserting the last values into the nan at the end of the matricies so that when do the interpolation the end of the vector will not be nans - # Note this should not mess with any of the outputs because is the interploated values that are the output. - voltage_out_coarse_grid[time_step+1] = voltage_t0 - threshold_out_coarse_grid[time_step+1] = threshold_t0 - AScurrent_matrix_coarse_grid[time_step+1,:] = np.matrix(AScurrents_t0) - - # Reset dt to previous value: - self.dt = dt_old - - fv = spi.interp1d(t_coarse_grid, voltage_out_coarse_grid, assume_sorted=True, bounds_error=False, fill_value=voltage_out_coarse_grid[-1]) - ft = spi.interp1d(t_coarse_grid, threshold_out_coarse_grid, assume_sorted=True, bounds_error=False, fill_value=threshold_out_coarse_grid[-1]) - voltage_out = fv(t_fine_grid) - threshold_out = ft(t_fine_grid) - - # initalize after spike current matrix - AScurrent_matrix = np.empty(shape=(num_time_steps_fine, len(AScurrents_t0))) - AScurrent_matrix[:] = np.nan - for ii in range(len(AScurrents_t0)): - curr_fASc = spi.interp1d(t_coarse_grid, AScurrent_matrix_coarse_grid[:,ii], assume_sorted=True, bounds_error=False, fill_value=AScurrent_matrix_coarse_grid[-1,ii]) - AScurrent_matrix[:,ii] = curr_fASc(t_fine_grid) - - # find where model voltage crosses model threshold - grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage = find_first_model_spike(voltage_out, threshold_out, voltage_t1, threshold_t1, self.dt) - # if the model never spiked, extrapolate to guess when it would have spiked - if grid_model_spike_time is None: - grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage = self.extrapolation_method(self, voltage_out, threshold_out, voltage_t1, threshold_t1, self.dt) - - # when the target spikes, reset so that next round will start at reset but not recording it in the voltage here. - # note that at the last section of the stimulus where there is no current injected the model will be reset even if - # the biological neuron doesn't spike. However, this doesnt matter as it won't be recorded. - num_spikes = len(bio_spike_time_steps) - if num_spikes > 0: - if after_end_index<len(stimulus): - - #TODO: ????????????????????????????????WHAT IS THIS????????????????????????????????????????????????????????????? - #I CANT FIGURE OUT WHY THIS WOULD HAVE BEEN HERE - if self.threshold_reset_method.name == 'adapt_sum_slow_fast': - voltage_t1 = threshold_t1 - #--------------------------------------------------------------------------------------------------------------------- - #---------below is an option you choose for reseting based on values of model at the biological spike----------------- - #---------or at the time where model voltage crosses model threshold-------------------------------------------------- - #--------------------------------------------------------------------------------------------------------------------- - #(voltage_t0, threshold_t0, AScurrents_t0) = self.reset(interpolated_model_spike_voltage, interpolated_model_spike_voltage, AScurrents_t1) #USE THIS IF YOU WANT TO USE USE MODEL VALUES AT MODEL SPIKE - (voltage_t0, threshold_t0, AScurrents_t0, bad_reset_flag) = self.reset(voltage_t1, threshold_t1, AScurrents_t1) #USE THIS IF YOU WANT TO USE MODEL VALUES AT TIME OF BIOLOGICAL SPIKE - #--------------------------------------------------------------------------------------------------------------------- - else: - (voltage_t0, threshold_t0, AScurrents_t0) = None, None, None - - return { - 'voltage': voltage_out, - 'threshold': threshold_out, - 'AScurrent_matrix': AScurrent_matrix, - - 'grid_model_spike_time': grid_model_spike_time, - 'interpolated_model_spike_time': interpolated_model_spike_time, - - 'grid_model_spike_voltage': grid_model_spike_voltage, - 'interpolated_model_spike_voltage': interpolated_model_spike_voltage, - - 'voltage_t0': voltage_t0, - 'threshold_t0': threshold_t0, - 'AScurrents_t0': AScurrents_t0, - - 'grid_bio_spike_model_voltage': voltage_t1, - 'grid_bio_spike_model_threshold': threshold_t1 - } - -def find_first_model_spike(voltage, threshold, voltage_t1, threshold_t1, dt): - num_time_steps = len(voltage) - - for time_step in xrange(num_time_steps): - if voltage[time_step] > threshold[time_step]: - grid_model_spike_time = dt * (time_step-1) - grid_model_spike_voltage = voltage[time_step-1] - - interpolated_model_spike_time = glif_neuron.interpolate_spike_time(dt, time_step-1, - threshold[time_step-1], threshold[time_step], - voltage[time_step-1], voltage[time_step]) - - interpolated_model_spike_voltage = interpolate_spike_voltage(dt, time_step-1, - threshold[time_step-1], threshold[time_step], - voltage[time_step-1], voltage[time_step]) - - return grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage - - # if the last voltage is above threshold and there hasn't already been a spike - if voltage_t1 > threshold_t1: - grid_model_spike_time = dt * ( num_time_steps - 1 ) - grid_model_spike_voltage = voltage_t1 - - interpolated_model_spike_time = glif_neuron.interpolate_spike_time(dt, num_time_steps - 1, threshold[num_time_steps-1], threshold_t1, voltage[num_time_steps-1], voltage_t1) - interpolated_model_spike_voltage = interpolate_spike_voltage(dt, num_time_steps, threshold[-1], threshold_t1, voltage[-1], voltage_t1) - - return grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage - - - return None, None, None, None - -def extrapolate_model_spike_from_endpoints(neuron, voltage, threshold, voltage_t1, threshold_t1, dt): - - #--extrapolate using first point in ISI and last point in ISI - num_time_steps = len(voltage) - - interpolated_model_spike_time = extrapolate_spike_time(dt, num_time_steps, threshold[0], threshold_t1, voltage[0], voltage_t1) - interpolated_model_spike_voltage = extrapolate_spike_voltage(dt, num_time_steps, threshold[0], threshold_t1, voltage[0], voltage_t1) - - grid_model_spike_time = np.ceil(interpolated_model_spike_time / dt) * dt # grid spike time based off extrapolated spike time - grid_model_spike_voltage = interpolated_model_spike_voltage - - result = grid_model_spike_time, grid_model_spike_voltage, interpolated_model_spike_time, interpolated_model_spike_voltage - - - return result - - - -def extrapolate_model_spike_from_endpoints_single_tau(neuron, voltage, threshold, voltage_t1, threshold_t1, dt): - tau_m = neuron.tau_m - num_time_steps = len(voltage) - ii = np.floor(tau_m/dt) - starting_ind = max(0,(num_time_steps - ii)) - result = extrapolate_model_spike_from_endpoints(neuron, voltage[starting_ind:], threshold[starting_ind:], voltage_t1, threshold_t1, dt) - - return result - -def extrapolate_spike_time(dt, num_time_steps, threshold_t0, threshold_t1, voltage_t0, voltage_t1): - """ Given two voltage and threshold values and an interval between them, extrapolate a spike time - by intersecting lines the thresholds and voltages. """ - return glif_neuron.line_crossing_x(dt * num_time_steps, voltage_t0, voltage_t1, threshold_t0, threshold_t1) - -def extrapolate_spike_voltage(dt, num_time_steps, threshold_t0, threshold_t1, voltage_t0, voltage_t1): - """ Given two voltage and threshold values and an interval between them, extrapolate a spike time - by intersecting lines the thresholds and voltages. """ - return glif_neuron.line_crossing_y(dt * num_time_steps, voltage_t0, voltage_t1, threshold_t0, threshold_t1) - -def interpolate_spike_voltage(dt, time_step, threshold_t0, threshold_t1, voltage_t0, voltage_t1): - """ Given two voltage and threshold values, the dt between them and the initial time step, interpolate - a spike time within the dt interval by intersecting the two lines. """ - return time_step*dt + glif_neuron.line_crossing_y(dt, voltage_t0, voltage_t1, threshold_t0, threshold_t1) diff --git a/allensdk/internal/model/glif/optimize_neuron.py b/allensdk/internal/model/glif/optimize_neuron.py deleted file mode 100644 index f37edabc53..0000000000 --- a/allensdk/internal/model/glif/optimize_neuron.py +++ /dev/null @@ -1,128 +0,0 @@ -import argparse, sys, logging - -import allensdk.core.json_utilities as ju -import allensdk.internal.model.glif.find_sweeps as fs - -from allensdk.internal.model.glif.glif_optimizer_neuron import GlifOptimizerNeuron -from allensdk.internal.model.glif.glif_experiment import GlifExperiment -from allensdk.internal.model.glif.glif_optimizer import GlifOptimizer - -from allensdk.internal.model.data_access import load_sweeps -from allensdk.internal.model.glif.find_spikes import find_spikes_list -import allensdk.core.json_utilities as ju -import allensdk.internal.model.glif.preprocess_neuron as pn - -def get_optimize_sweep_numbers(sweep_index): - #TODO: why is this here--why are sweep indicies being fed to a find_noise_sweeps sweeps and specifying - #noise?--shouldn't the sweeps already be provided? - return fs.find_noise_sweeps(sweep_index)['noise1'] - -def optimize_neuron(model_config, sweep_index, nwb_file, save_callback=None): - '''Optimizes a neuron. - 1. Loads optimizer and neuron configuration data. - 2. Loads the voltage trace sweeps that will be optimized - 3. Configures the experiment and optimizer - 4. Runs the optimizer - 5. TODO: where is data saved - - Parameters - ---------- - model_config : dictionary - contains values of neuron and optimizer parameters - sweep_index : list of integers - indices (as labeled in the data configuration file) of sweeps that will be optimized - save_callback : module - saves output - ''' - # define the neuron and optimizer dictionaries from the model configuration - neuron_config = model_config['neuron'] - optimizer_config = model_config['optimizer'] - - # load the neuron with along with the methods needed for optimization - neuron = GlifOptimizerNeuron.from_dict(neuron_config) - - # TODO: not sure what this is doing - optimize_sweeps = get_optimize_sweep_numbers(sweep_index) - - # load the sweeps to be optimized - optimize_data = load_sweeps(nwb_file, optimize_sweeps, neuron.dt, - optimizer_config["cut"], optimizer_config["bessel"]) - - # needed to offset all voltages by El_reference - El_reference = neuron_config['El_reference'] - - # get indicies of spikes and voltage at those spikes - spike_ind, spike_v = find_spikes_list(optimize_data['voltage'], neuron_config['dt']) - - # get times of spikes - grid_spike_times = [ si*neuron_config['dt'] for si in spike_ind ] - - # convert voltage at spikes into reference frame of El - grid_spike_voltages_in_ref_to_zero = [ sv - El_reference for sv in spike_v ] - - # convert voltage into reference frame of El - resp_list = [ d - El_reference for d in optimize_data['voltage'] ] - - # configure experiment - experiment = GlifExperiment(neuron = neuron, - dt = neuron.dt, - stim_list = optimize_data['current'], - resp_list = resp_list, - spike_time_steps = spike_ind, - grid_spike_times = grid_spike_times, - grid_spike_voltages = grid_spike_voltages_in_ref_to_zero, - param_fit_names = optimizer_config['param_fit_names']) - - # configure optimizer - optimizer = GlifOptimizer(experiment = experiment, - dt = neuron.dt, - outer_iterations = optimizer_config['outer_iterations'], - inner_iterations = optimizer_config['inner_iterations'], - sigma_inner = optimizer_config['sigma_inner'], - sigma_outer = optimizer_config['sigma_outer'], - param_fit_names = optimizer_config['param_fit_names'], - stim = optimize_data['current'], - error_function_data = optimizer_config['error_function_data'], - xtol = optimizer_config['xtol'], - ftol = optimizer_config['ftol'], - internal_iterations = optimizer_config['internal_iterations'], - init_params = optimizer_config.get('init_params', None), - bessel = optimizer_config['bessel']) - - def save(optimizer, outer, inner): - logging.info('finished outer: %d inner: %d' % (outer, inner)) - if save_callback: - save_callback(optimizer, outer, inner) - - # run the optimizer - best_param, begin_param = optimizer.run_many(save) - - # over write the the initial experiment parameters with the best found parameters - # TODO: but why do this since it is not being returned - experiment.set_neuron_parameters(best_param) - - return optimizer, best_param, begin_param - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('model_config_file') - parser.add_argument('sweeps_file') - parser.add_argument('output_file') - parser.add_argument("--dt", default=pn.DEFAULT_DT) - parser.add_argument("--bessel", default=pn.DEFAULT_BESSEL) - parser.add_argument("--cut", default=pn.DEFAULT_CUT) - - args = parser.parse_args() - - model_config = ju.read(args.model_config_file) - sweep_list = ju.read(args.sweeps_file) - - sweep_index = { s['sweep_number']:s for s in sweep_list } - - try: - neuron, best_param, begin_param = optimize_neuron(model_config, sweep_index, dt, cut, bessel) - ju.write(args.output_file, neuron.to_dict()) - except Exception as e: - logging.error(e.message) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/model/glif/plotting.py b/allensdk/internal/model/glif/plotting.py deleted file mode 100644 index 645c583544..0000000000 --- a/allensdk/internal/model/glif/plotting.py +++ /dev/null @@ -1,107 +0,0 @@ -'''Written by Corinne Teeter 3-31-14 -''' - -import matplotlib -import matplotlib.pyplot as plt -import numpy as np - - -def checkPreprocess(originalStim_list, processedStim_list, originalVoltage_list, processedVoltage_list, config, blockME=False): - - timeOriginal=np.arange(len(np.concatenate(originalStim_list)))*config.neuron['dt'] - if 'subSample' in config.dictOfPreprocessMethods.keys(): - timeProcessed=np.arange(len(np.concatenate(processedStim_list)))*config.dictOfPreprocessMethods['subSample']['desired_time_step'] - else: - timeProcessed=timeOriginal - - plt.figure(figsize=(20,10)) - plt.subplot(4,1,1) - plt.plot(timeOriginal, np.concatenate(originalStim_list), 'b') - plt.title('original stimulation') - - plt.subplot(4,1,2) - plt.plot(timeProcessed, np.concatenate(processedStim_list), 'r') - plt.title('processed stimulation') - - plt.subplot(4,1,3) - plt.plot(timeOriginal, np.concatenate(originalVoltage_list), 'b') - plt.title('original voltage') - - plt.subplot(4,1,4) - plt.plot(timeProcessed, np.concatenate(processedVoltage_list), 'r') - plt.title('processed voltage') - - plt.annotate(config.cellName+': View result of preprocessing', xy=(.4, .975), - xycoords='figure fraction', - horizontalalignment='left', verticalalignment='top', - fontsize=20) - -# plt.show(block=blockME) - -def plotSpikes(voltage_list, spike_ind_list, dt, blockME=False, method=False): - - converted_spike_ind_list=[] - time=np.arange(len(np.concatenate(voltage_list)))*dt - #--find the length of each vector - thelength=0 - for ii, voltage in enumerate(voltage_list): - converted_spike_ind_list.append(spike_ind_list[ii]+thelength) - thelength=thelength+len(voltage) - - subsampled_time=[time[ii] for ii in np.concatenate(converted_spike_ind_list)] - - plt.figure(figsize=(20, 5)) - plt.plot(time, np.concatenate(voltage_list), 'b') - plt.plot(subsampled_time, [np.concatenate(voltage_list)[ii] for ii in np.concatenate(converted_spike_ind_list)], 'r.', ms=16) - if method==False: - plt.title('Spikes') - else: - plt.title('Spikes. Method used: '+method) - - plt.ylabel('voltage (V)') - plt.xlabel('time (s)') -# plt.show(block=blockME) - -def checkSpikeCutting(originalStim_list, cutStim_list, originalVoltage_list, cutVoltage_list, allindOfNonSpiking_list, config, blockME=False): - - if len(originalStim_list)!=len(cutStim_list) or \ - len(originalStim_list)!=len(originalVoltage_list) or \ - len(originalStim_list)!=len(cutVoltage_list) or \ - len(originalStim_list)!=len(allindOfNonSpiking_list): - raise Exception('lists are not the same length') - - - lengthGoingToAdd=0 - whole_ind=np.array([]) - whole_v=np.array([]) - for trace, ind_array in zip(originalVoltage_list, allindOfNonSpiking_list): - ind=np.arange(0, len(trace))+lengthGoingToAdd - whole_ind=np.append(whole_ind, [ind[ii] for ii in ind_array]) - whole_v=np.append(whole_v, [trace[ii] for ii in ind_array]) - lengthGoingToAdd=lengthGoingToAdd+len(trace) - - - time=np.arange(len(np.concatenate(originalStim_list)))*config.neuron['dt'] - plt.figure(figsize=(20,10)) - - plt.subplot(1,1,1) - plt.plot(time, np.concatenate(originalVoltage_list)) - plt.title('voltage') - - plt.plot(whole_ind*config.neuron['dt'], whole_v, '--r', lw=2) - - plt.annotate(config.cellName+': check spike cutting', xy=(.4, .975), - xycoords='figure fraction', - horizontalalignment='left', verticalalignment='top', - fontsize=20) -# plt.show(block=blockME) - -def plotLineRegress1(slope, intercept, r,xlim): - y=slope*xlim+intercept - print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) - plt.plot(xlim, y, '-k', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) - -def plotLineRegressRed(slope, intercept, r,xlim): - y=slope*xlim+intercept - print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) - plt.plot(xlim, y, '-r', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) diff --git a/allensdk/internal/model/glif/preprocess_neuron.py b/allensdk/internal/model/glif/preprocess_neuron.py deleted file mode 100644 index 73f1267888..0000000000 --- a/allensdk/internal/model/glif/preprocess_neuron.py +++ /dev/null @@ -1,494 +0,0 @@ -import argparse, logging -import itertools -from scipy.optimize import fmin -import numpy as np -import os -import allensdk.core.json_utilities as ju -import allensdk.internal.model.glif.find_sweeps as fs -from allensdk.internal.model.data_access import load_sweeps -from allensdk.internal.model.glif.MLIN import MLIN -from allensdk.internal.model.glif.ASGLM import ASGLM_pairwise -from allensdk.internal.model.glif.rc import least_squares_RCEl_calc_tested -from allensdk.internal.model.glif.threshold_adaptation import calc_spike_component_of_threshold_from_multiblip -from allensdk.internal.model.glif.spike_cutting import calc_spike_cut_and_v_reset_via_expvar_residuals -from allensdk.internal.model.glif.find_spikes import find_spikes_list, find_spikes_ssq_list -from allensdk.internal.model.glif.threshold_adaptation import fit_avoltage_bvoltage_th, fit_avoltage_bvoltage -import allensdk.ephys.ephys_extractor as efex -import allensdk.ephys.ephys_features as ft -from allensdk.model.glif.glif_neuron_methods import spike_component_of_threshold_exact -import matplotlib.pyplot as plt -import allensdk.internal.model.glif.plotting as plotting - -RESTING_POTENTIAL = 'slow_vm_mv' -DEFAULT_DT = 5e-05 -DEFAULT_CUT = 0 -DEFAULT_BESSEL = { 'N': 4, 'freq': 10000 } -MAKE_PLOT = True -SHOW_PLOT = False -SAVE_FIG =True -SHORT_RUN = False - -class MissingSpikeException(Exception): pass - -RESTING_POTENTIAL = 'slow_vm_mv' - -def find_first_spike_voltage(voltage, dt, ssq=False, MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False, - dv_cutoff=20.0, thresh_frac=0.05): - '''calculate voltage at threshold of first spike - Parameters - ---------- - voltage: numpy array - voltage trace - dt: float - sampling time step - ssq: Boolean - whether there is or is not a subrathreshold short square pulse (note that if thes - MAKE_PLOT: Boolean - specifies whether or not a plot should be made - SHOW_PLOT: Boolean - specifies if a visualization should be made - BLOCK: Boolean - if a plot is made this specifies weather to stop the code until the plot is closed - dv_cutoff: float - specifies cut off of the derivative of the voltage - thresh_frac: float - variable that goes into feature extractor - - Returns - ------- - :float - voltage of threshold of first spike - ''' - - if ssq: - spike_time_steps, _ = find_spikes_ssq_list([voltage], dt, dv_cutoff=dv_cutoff, thresh_frac=thresh_frac) - else: - spike_time_steps, _ = find_spikes_list([voltage], dt) - - if MAKE_PLOT: - plotting.plotSpikes([voltage], spike_time_steps, dt, blockME=False, method='dvdt_v2') - if SHOW_PLOT: - plt.show(block=BLOCK) - - if len(spike_time_steps[0]) == 0: - raise MissingSpikeException('No spike detected.') - - return voltage[spike_time_steps[0][0]] - -def tag_plot(tag, fs=9): - plt.annotate(tag, xy=(0.98, .01), - xycoords='figure fraction', - horizontalalignment='right', - verticalalignment='bottom', - fontsize=fs) - -def estimate_dv_cutoff(voltage_list, dt, start_t, end_t): - v_set = [ v * 1e3 for v in voltage_list ] - t_set = [ np.arange(0, len(v)) * dt for v in voltage_list ] - - dv_cutoff, thresh_frac = ft.estimate_adjusted_detection_parameters(v_set, t_set, - start_t, end_t, - filter=None) - - return dv_cutoff, thresh_frac - -def preprocess_neuron(nwb_file, sweep_list, cell_properties=None, - dt=None, cut=None, bessel=None, save_figure_path=None): - if dt is None: - dt = DEFAULT_DT - if cut is None: - cut = DEFAULT_CUT - if bessel is None: - bessel = DEFAULT_BESSEL - - sweep_index = { s['sweep_number']: s for s in sweep_list } - - noise_sweeps = fs.find_noise_sweeps(sweep_index) - noise1_sweeps = noise_sweeps['noise1'] - noise2_sweeps = noise_sweeps['noise2'] - - ssq_sweeps = fs.find_short_square_sweeps(sweep_index) - all_ssq_data = load_sweeps(nwb_file, ssq_sweeps['all'], dt, cut, bessel) - ssq_dv_cutoff, ssq_thresh_frac = estimate_dv_cutoff(all_ssq_data['voltage'], dt, - efex.SHORT_SQUARES_WINDOW_START, - efex.SHORT_SQUARES_WINDOW_END) - - ssq_triple_sweeps = ssq_sweeps['triple'] - - ramp_sweeps = fs.find_ramp_sweeps(sweep_index)['suprathreshold'] - R2R_sweeps = fs.find_ramp_to_rheo_sweeps(sweep_index)['all'] - - noise1_data = load_sweeps(nwb_file, noise1_sweeps, dt, cut, bessel) - noise2_data = load_sweeps(nwb_file, noise2_sweeps, dt, cut, bessel) - - maximum_subthreshold_short_square_sweeps = ssq_sweeps['maximum_subthreshold'] - maximum_subthreshold_short_square_data = load_sweeps(nwb_file, [maximum_subthreshold_short_square_sweeps[0]], dt, cut, bessel) - minimum_suprathreshold_short_square_sweeps = ssq_sweeps['minimum_suprathreshold'] - minimum_suprathreshold_short_square_data = load_sweeps(nwb_file, [minimum_suprathreshold_short_square_sweeps[0]], dt, cut, bessel) - - dt = noise1_data['dt'][0] #getting subsampled dt returned for ease of use - - subthresh_noise_current_list=[] - subthresh_noise_voltage_list=[] - noise_El_list=[] - for ss in range(0, len(noise1_data['current'])): - #--subthreshold noise has first epoch of noise with a region of no stimulation before and after (note the selection of end point is hard coded) - subthresh_noise_current_list.append(noise1_data['current'][ss][noise1_data['start_idx'][ss]:int(6./dt)]) - subthresh_noise_voltage_list.append(noise1_data['voltage'][ss][noise1_data['start_idx'][ss]:int(6./dt)]) - noise_El_list.append(sweep_index[noise1_sweeps[ss]][RESTING_POTENTIAL]*1e-3) - - # Els calculated from QC - El_noise=np.mean(noise_El_list) - El_subthreshold_blip=sweep_index[maximum_subthreshold_short_square_sweeps[0]][RESTING_POTENTIAL]*1e-3 - El_suprathreshold_blip=sweep_index[minimum_suprathreshold_short_square_sweeps[0]][RESTING_POTENTIAL]*1e-3 - - if len(ramp_sweeps): - logging.info('has ramp') - ramp_data = load_sweeps(nwb_file, ramp_sweeps, dt, cut, bessel) - El_ramp=sweep_index[ramp_sweeps[0]][RESTING_POTENTIAL]*1e-3 - else: - ramp_sweeps=None - ramp_data=None - El_ramp=None - logging.info("No ramp") - - if len(ssq_triple_sweeps): - logging.info('has multi ss') - multi_ssq_data = load_sweeps(nwb_file, ssq_triple_sweeps, dt, cut, bessel) - El_multi_ssq_data=sweep_index[ssq_triple_sweeps[0]][RESTING_POTENTIAL]*1e-3 - multi_ssq_dv_cutoff, multi_ssq_thresh_frac = estimate_dv_cutoff(multi_ssq_data['voltage'], dt, - efex.SHORT_SQUARE_TRIPLE_WINDOW_START, - efex.SHORT_SQUARE_TRIPLE_WINDOW_END) - print("*************************") - print("ssq", ssq_dv_cutoff, ssq_thresh_frac) - print("triple",multi_ssq_dv_cutoff, multi_ssq_thresh_frac) - else: - ssq_triple_sweeps=None - multi_ssq_data = None - El_multi_ssq_data = None - logging.info("No multi short square") - - # Needed for MLIN - long_square_config = fs.find_long_square_sweeps(sweep_index) - long_square_sweeps = long_square_config['all'] - subthreshold_long_square_sweeps = long_square_config['subthreshold'] - maximum_subthreshold_long_square_sweeps = long_square_config['maximum_subthreshold'] - #TODO: Here you are loading just one sweep: probably should load all - maximum_subthreshold_long_square_data = load_sweeps(nwb_file, [maximum_subthreshold_long_square_sweeps[0]], dt, cut, bessel) - El_max_subth_long_square=sweep_index[maximum_subthreshold_long_square_sweeps[0]][RESTING_POTENTIAL]*1e-3 - - #--------------------------------------------------------------- - #---------find spiking indicies of spikes in noise-------------- - #--------------------------------------------------------------- - - # note that when using find_spikes_list without removing the testpulse a warning will result from calculating feature_data['base_v'] in the feature extractor (line 375) this not relavent here - noise1_ind_wo_test_pulse_removed, _ = find_spikes_list(noise1_data['voltage'], dt) - noise2_ind_wo_test_pulse_removed, _ = find_spikes_list(noise2_data['voltage'], dt) - #Put all ISI ind in a - ISI_length=np.array([]) - for ii in range(len(noise1_ind_wo_test_pulse_removed)): - ISI_length=np.append(ISI_length,noise1_ind_wo_test_pulse_removed[ii][1:]-noise1_ind_wo_test_pulse_removed[ii][:-1]) - for ii in range(len(noise2_ind_wo_test_pulse_removed)): - ISI_length=np.append(ISI_length,noise2_ind_wo_test_pulse_removed[ii][1:]-noise2_ind_wo_test_pulse_removed[ii][:-1]) - min_ISI_len=np.min(ISI_length) - - - #------------------------------------------------------------------------------------------------------------------- - #---------------------Compute R, C and EL via least squares------------------------------------------------- - #------------------------------------------------------------------------------------------------------------------- - - #--compute R, C, and El via least squares tested in verify_RCEl_GLM_vs_lssq_and_smooth.py - (R_test_list, C_test_list, El_test_list)=least_squares_RCEl_calc_tested(subthresh_noise_voltage_list, subthresh_noise_current_list, dt) - R_test_list_mean=np.mean(R_test_list) - C_test_list_mean=np.mean(C_test_list) - El_test_list_mean=np.mean(El_test_list) - - #----------------------------------------------------------------------------------------- - #------------------------ compute spike cut length---------------------------------------- - #----------------------------------------------------------------------------------------- - - #TODO: I should disentangle this function so I can get rid of the deltaV dependency - (spike_cut_length_NODELTAV, slope_at_min_expVar_list_NODELTAV, intercept_at_min_expVar_list_NODELTAV) \ - = calc_spike_cut_and_v_reset_via_expvar_residuals(noise1_data['current'], noise1_data['voltage'], - dt, El_noise, 0, - max_spike_cut_time=min_ISI_len*dt, - MAKE_PLOT=MAKE_PLOT, - SHOW_PLOT=SHOW_PLOT, - BLOCK=False) - if SAVE_FIG: - tag='spikeCutting_noDeltaV_regression.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path,tag), format='png') - plt.close() - tag='spikeCutting_noDeltaV_spike_wave_form.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path,tag), format='png') - plt.close() - logging.info('spike cut length: %d', spike_cut_length_NODELTAV) - - #----------------------------------------------------------------------------------------- - #------------------------ compute ASC amplitudes------------------------------------------ - #----------------------------------------------------------------------------------------- - - #***Hack: k's are being hard coded into this function and are not necessarily consistent with what is in the setting of AS currents!!! - k_asc_possible=np.array([3, 10., 30., 100., 300.]) - if SHORT_RUN: #THIS IS JUST FOR DEBUGGING SO THAT YOU DONT HAVE TO WAIT FOR THE ENTIRE MODULE TO RUN - (best_k_pair_fit_ascR, best_asc_amp_fit_ascR, best_R_fit_ascR, best_llh_fit_ascR)=ASGLM_pairwise(k_asc_possible, - noise1_data['current'], noise1_data['voltage'], noise1_ind_wo_test_pulse_removed, - C_test_list_mean, C_test_list_mean*R_test_list_mean, spike_cut_length_NODELTAV, dt, El_noise, - SHORT_RUN=True, MAKE_PLOT=MAKE_PLOT, SHOW_PLOT=SHOW_PLOT, BLOCK=False) - asc_amp_from_ASGLM=np.mean(best_asc_amp_fit_ascR, axis=0) - R_from_ASGLM=np.mean(best_R_fit_ascR) - - else: - (best_k_pair_fit_ascR, best_asc_amp_fit_ascR, best_R_fit_ascR, best_llh_fit_ascR)=ASGLM_pairwise(k_asc_possible, - noise1_data['current'], noise1_data['voltage'], noise1_ind_wo_test_pulse_removed, - C_test_list_mean, C_test_list_mean*R_test_list_mean, spike_cut_length_NODELTAV, dt, El_noise, - SHORT_RUN=False, MAKE_PLOT=MAKE_PLOT, SHOW_PLOT=SHOW_PLOT, BLOCK=False) - asc_amp_from_ASGLM=np.mean(best_asc_amp_fit_ascR, axis=0) - R_from_ASGLM=np.mean(best_R_fit_ascR) - - if SAVE_FIG: - tag='GLM_fit_ascR_basis.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path,tag), format='png') - plt.close() - tag='GLM_fit_ascR_sumASC.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path,tag), format='png') - plt.close() - tag='GLM_fit_ascR_individualASC.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path,tag), format='png') - plt.close() - - logging.info('Output of ASC fitting GLM') - logging.info('R out_of_GLM_Rfit_Cfixed %f %s', R_from_ASGLM/1e6, "MOhms") - logging.info('ASC amplitudes at the time of cut spike %s', str(asc_amp_from_ASGLM*1e12)) - logging.info("ks used %s", str(best_k_pair_fit_ascR)) - - #----------------------------------------------------------------------------------------- - #------------------------ calculate thresholds----------------------------------------- - #----------------------------------------------------------------------------------------- - - # ---extract instantaneous threshold from suprathreshold blip - try: - th_inf_via_Vmeasure = find_first_spike_voltage(minimum_suprathreshold_short_square_data['voltage'][0][minimum_suprathreshold_short_square_data['start_idx'][0]:], - dt, - ssq=True, - MAKE_PLOT=MAKE_PLOT, - SHOW_PLOT=SHOW_PLOT, - BLOCK=False, - dv_cutoff=ssq_dv_cutoff, - thresh_frac=ssq_thresh_frac) - th_inf_via_Vmeasure_from0=th_inf_via_Vmeasure-El_suprathreshold_blip - if SAVE_FIG: - tag='th_inf_from_blip.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path, tag), format='png') - plt.close() - except MissingSpikeException as e: - raise MissingSpikeException("The suprathreshold short square sweep must have a spike, but no spike was detected. This means that feature extraction and GLIF spike detection are inconsistent.") - - #----------------------------------------------------------------------------------------------------- - #-----------------find spike and voltage component of the threshold--------------------------- - #----------------------------------------------------------------------------------------------------- - - # If a multishort square stimulus exists calculate spike component of threshold.. - if multi_ssq_data: - (a_spike_component_of_threshold, b_spike_component_of_threshold, - mean_voltage_first_spike_of_blip) = calc_spike_component_of_threshold_from_multiblip(multi_ssq_data, - dt, - multi_ssq_dv_cutoff, - multi_ssq_thresh_frac, - MAKE_PLOT=MAKE_PLOT, - SHOW_PLOT=False, - BLOCK=False, - PUBLICATION_PLOT=False) - #adjust values to be after spike cutting - if a_spike_component_of_threshold is not None and b_spike_component_of_threshold is not None: - a_spike_component_of_threshold=spike_component_of_threshold_exact(a_spike_component_of_threshold, b_spike_component_of_threshold, spike_cut_length_NODELTAV*dt) - - if SAVE_FIG: - tag='multiblip_fit.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path, tag), format='png') - plt.close() - - tag='multiblip_data.png' - tag_plot(tag, fs=9) - plt.savefig(os.path.join(save_figure_path,tag), format='png') - plt.close() - - #---calculate voltage componet of threshold - if a_spike_component_of_threshold is None or b_spike_component_of_threshold is None: - logging.warning("spike component of threshold could not be calculated from the multiblip data") - a_voltage_comp_of_thr_from_fitab=None - b_voltage_comp_of_thr_from_fitab=None - a_voltage_comp_of_thr_from_fitabth=None - b_voltage_comp_of_thr_from_fitabth=None - th_inf_fit_w_v_comp_of_th=None - th_inf_fit_w_v_comp_of_th_from0=None - else: - #TODO:this function needs to be changed to use experimental change of reference - b_voltage_guess = 5.0 - a_voltage_guess = 0.1*b_voltage_guess - fit_ab_vcomp_from_noise = fmin(func=fit_avoltage_bvoltage, - args=(noise1_data['voltage'], - noise_El_list, - spike_cut_length_NODELTAV, - noise1_ind_wo_test_pulse_removed, #NOTE THAT IF YOU WANT TO USE THIS TO GET A VOLTAGE WITHIN THE FUNCTION YOU NEED TO SUBTRACT OFF AND INDICIE BECAUSE THIS IS THE VALUE SET TO NAN AS THE SPIKE WAS INITIATED IN THE PREVIOUS TIME STEP. - th_inf_via_Vmeasure, - dt, - a_spike_component_of_threshold, - b_spike_component_of_threshold), - x0=[a_voltage_guess,b_voltage_guess]) - - a_voltage_comp_of_thr_from_fitab=fit_ab_vcomp_from_noise[0] - b_voltage_comp_of_thr_from_fitab=fit_ab_vcomp_from_noise[1] - - logging.info("spike components %s %s", str(a_spike_component_of_threshold), str(b_spike_component_of_threshold)) - logging.info("voltage components %s %s", str(a_voltage_comp_of_thr_from_fitab), str(b_voltage_comp_of_thr_from_fitab)) - - fit_ab_vcomp_th_from_thr_from_noise = fmin(func=fit_avoltage_bvoltage_th, - args=(noise1_data['voltage'], - noise_El_list, - spike_cut_length_NODELTAV, - noise1_ind_wo_test_pulse_removed, #NOTE THAT IF YOU WANT TO USE THIS TO GET A VOLTAGE WITHIN THE FUNCTION YOU NEED TO SUBTRACT OFF AND INDICIE BECAUSE THIS IS THE VALUE SET TO NAN AS THE SPIKE WAS INITIATED IN THE PREVIOUS TIME STEP. - dt, - a_spike_component_of_threshold, - b_spike_component_of_threshold), - x0=[a_voltage_guess,b_voltage_guess, th_inf_via_Vmeasure]) - - a_voltage_comp_of_thr_from_fitabth=fit_ab_vcomp_th_from_thr_from_noise[0] - b_voltage_comp_of_thr_from_fitabth=fit_ab_vcomp_th_from_thr_from_noise[1] - th_inf_fit_w_v_comp_of_th=fit_ab_vcomp_th_from_thr_from_noise[2] - th_inf_fit_w_v_comp_of_th_from0=th_inf_fit_w_v_comp_of_th-El_noise - logging.info("spike components %s %s", str(a_spike_component_of_threshold), str(b_spike_component_of_threshold)) - logging.info("voltage components %s %s %s %s", str(a_voltage_comp_of_thr_from_fitabth), str(b_voltage_comp_of_thr_from_fitabth), 'fit threshold', str(th_inf_fit_w_v_comp_of_th)) - - - else: - a_spike_component_of_threshold=None - b_spike_component_of_threshold=None - a_voltage_comp_of_thr_from_fitab=None - b_voltage_comp_of_thr_from_fitab=None - a_voltage_comp_of_thr_from_fitabth=None - b_voltage_comp_of_thr_from_fitabth=None - th_inf_fit_w_v_comp_of_th_from0=None - th_inf_fit_w_v_comp_of_th=None - - #-------------------------------------------------------------------------- - #------------------------ MLIN calculations-------------------------------- - #-------------------------------------------------------------------------- - - #TODO: probably want to use more than just one square pulse for this distribution - STLS_voltage=maximum_subthreshold_long_square_data['voltage'][0][maximum_subthreshold_long_square_data['start_idx'][0]:] - STLS_current=maximum_subthreshold_long_square_data['current'][0][maximum_subthreshold_long_square_data['start_idx'][0]:] - (var_of_section, sv_for_expsymm, tau_from_AC)=MLIN(STLS_voltage, STLS_current, R_test_list_mean, C_test_list_mean, dt, - MAKE_PLOT=MAKE_PLOT, - SHOW_PLOT=SHOW_PLOT, - BLOCK=False, - PUBLICATION_PLOT=False) - if SAVE_FIG: - tag='MLIN.png' - tag_plot(tag) - plt.savefig(os.path.join(save_figure_path,tag), format='png') - plt.close() - - #-------------------------------------------------------------------------- - #------------------------ make output dictionaries------------------------- - #-------------------------------------------------------------------------- - - #TODO: find out how many are the max number of all_passing_sweeps. - El_noise_1=[None, None, None, None, None] - WFS_noise_1=[None, None, None, None, None] - RTP_noise_1=[None, None, None, None, None] - sweep_noise_1=[None, None, None, None, None] - spike_ind_noise_1=[None, None, None, None, None] - - def fill_in_lists(out_list, data_list): - '''note since the input is a list shouldnt need to return anything (pass by reference)''' - for ii in range(len(data_list)): - out_list[ii]=data_list[ii] - fill_in_lists(El_noise_1, noise_El_list) - fill_in_lists(sweep_noise_1, noise1_sweeps) - fill_in_lists(spike_ind_noise_1, noise1_ind_wo_test_pulse_removed) - - #--initialize output dictionaries - for_reference_dict={} - for_use_dict={} - - for_reference_dict['dt_used_for_preprocessor_calculations']=dt - #for_reference_dict['optional_methods']=self.optional_methods - for_reference_dict['sweep_properties']={'noise1': - {'1':{'El': El_noise_1[0], 'sweep_num':sweep_noise_1[0], 'spike_ind': spike_ind_noise_1[0]}, - '2':{'El': El_noise_1[1], 'sweep_num':sweep_noise_1[1], 'spike_ind': spike_ind_noise_1[1]}, - '3':{'El': El_noise_1[2], 'sweep_num':sweep_noise_1[2], 'spike_ind': spike_ind_noise_1[2]}, - '4':{'El': El_noise_1[3], 'sweep_num':sweep_noise_1[3], 'spike_ind': spike_ind_noise_1[3]}, - '5':{'El': El_noise_1[4], 'sweep_num':sweep_noise_1[4], 'spike_ind': spike_ind_noise_1[4]}}, - 'ramp': {'sweep_num':ramp_sweeps}, - 'subthreshold_short_square': {'sweep_num':maximum_subthreshold_short_square_sweeps}, - 'suprathreshold_short_square': {'R_testpulsesweep_num':minimum_suprathreshold_short_square_sweeps}, - 'max_subthresh_long_square': {'sweep_num':maximum_subthreshold_long_square_sweeps}, - 'multi_short_square': {'sweep_num':ssq_triple_sweeps}} - - for_reference_dict['El']={'El_noise': {'measured': {'mean':El_noise, 'list':noise_El_list, 'dependencies':None}}, - 'El_ramp': {'value':El_ramp, 'dependencies': None}, - 'El_subthreshold_blip': {'value':El_subthreshold_blip, 'dependencies':None}, - 'El_suprathreshold_blip': {'value':El_suprathreshold_blip, 'dependencies':None}, - 'El_max_subth_long_square': {'value':El_max_subth_long_square, 'dependencies':None}} - - for_reference_dict['resistance']={#'R_lssq_Wrest':{'mean': R_lssq_wrest_mean, 'list': R_lssq_wrest_list, 'dependencies': 'from subthreshold (no spike cutting) noise'}, - 'R_from_lims':{'value':cell_properties['ri']*1e6}, - 'R_test_list': {'mean':R_test_list_mean, 'list': R_test_list}, - 'R_fit_ASC_and_R':{'mean':R_from_ASGLM, 'list': best_R_fit_ascR}} - - for_reference_dict['capacitance']={#'C_lssq_Wrest': {'mean':C_lssq_wrest_mean, 'list':C_lssq_wrest_list, 'dependencies': 'from subthreshold (no spike cutting) noise'}, - 'C_from_lims':{'value': (cell_properties['tau']*1e-3)/(cell_properties['ri']*1e6)}, - 'C_test_list': {'mean':C_test_list_mean, 'list': C_test_list}} - - for_reference_dict['spike_cut_length']={'no deltaV shift':{'length':spike_cut_length_NODELTAV, - 'slope':slope_at_min_expVar_list_NODELTAV, - 'intercept':intercept_at_min_expVar_list_NODELTAV, - 'dependencies':None}} - - for_reference_dict['spike_cutting']={'NOdeltaV': {'cut_length':spike_cut_length_NODELTAV, 'slope':slope_at_min_expVar_list_NODELTAV, 'intercept':intercept_at_min_expVar_list_NODELTAV, 'dependencies': None}} - - for_reference_dict['asc']={'k': best_k_pair_fit_ascR, 'amp':asc_amp_from_ASGLM, 'dependencies': 'Cap and res from least squares'} - - for_reference_dict['th_inf']={'via_Vmeasure':{'value':th_inf_via_Vmeasure, 'from_zero':th_inf_via_Vmeasure_from0, 'dependencies':'measured from suprathreshold blip'}, - 'fit_with_v_comp_of_th':{'value':th_inf_fit_w_v_comp_of_th, 'from_zero':th_inf_fit_w_v_comp_of_th_from0}} - - for_reference_dict['threshold_adaptation']={'a_spike_component_of_threshold':a_spike_component_of_threshold, - 'b_spike_component_of_threshold':b_spike_component_of_threshold, - 'a_voltage_comp_of_thr_from_fitab':a_voltage_comp_of_thr_from_fitab, - 'b_voltage_comp_of_thr_from_fitab':b_voltage_comp_of_thr_from_fitab, - 'a_voltage_comp_of_thr_from_fitabth':a_voltage_comp_of_thr_from_fitabth, - 'b_voltage_comp_of_thr_from_fitabth':b_voltage_comp_of_thr_from_fitabth} - for_reference_dict['MLIN']={'var_of_section':var_of_section, - 'sv_for_expsymm':sv_for_expsymm, - 'tau_from_AC':tau_from_AC} - logging.info("finished") - - return for_reference_dict - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("nwb_file") - parser.add_argument("sweep_list_file") - parser.add_argument("output_json") - parser.add_argument("--dt", default=DEFAULT_DT) - parser.add_argument("--bessel", default=DEFAULT_BESSEL) - parser.add_argument("--cut", default=DEFAULT_CUT) - - args = parser.parse_args() - - sweep_list = ju.read(args.sweep_list_file) - - values = preprocess_neuron(args.nwb_file, sweep_list) - - ju.write(args.output_json, values) - - -if __name__ == "__main__": main() diff --git a/allensdk/internal/model/glif/rc.py b/allensdk/internal/model/glif/rc.py deleted file mode 100644 index ab21fb0def..0000000000 --- a/allensdk/internal/model/glif/rc.py +++ /dev/null @@ -1,50 +0,0 @@ -import numpy as np -import logging - -from allensdk.internal.model.glif.find_spikes import find_spikes_list - -from allensdk.ephys.extract_cell_features import get_stim_characteristics - -def least_squares_RCEl_calc_tested(voltage_list, current_list, dt): - '''Calculate resistance, capacitance and resting potential by performing - least squares on current and voltage. - - Parameters - ---------- - voltage_list: list of arrays - voltage responses for several sweep repeats - current_list: list of arrays - current injections for several sweep repeats - dt: float - time step size in voltage and current traces - - Returns - ------- - r_list: list of floats - each value corresponds to the resistance of a sweep - c_list: list of floats - each value corresponds to the capacitance of a sweep - el_list: list of floats - each value corresponds to the resting potential of a sweep - ''' - - r_list=[] - c_list=[] - el_list=[] - for voltage, current in zip(voltage_list, current_list): - matrix=np.ones((len(voltage)-1, 3)) - matrix[:,0]=voltage[0:len(voltage)-1] - matrix[:,1]=current[0:len(current)-1] - lsq_non_der_raw=np.linalg.lstsq(matrix, voltage[1:])[0] -# (r_lsq_non_der_raw, c_lsq_non_der_raw, El_lsq_non_der_raw)=RCEL_from_standard_space(lsq_non_der_raw) - - c_lsq_non_der_raw=dt/lsq_non_der_raw[1] - r_lsq_non_der_raw=-lsq_non_der_raw[1]/(lsq_non_der_raw[0]-1) - El_lsq_non_der_raw=-lsq_non_der_raw[2]/(lsq_non_der_raw[0]-1) - r_list.append(r_lsq_non_der_raw) - c_list.append(c_lsq_non_der_raw) - el_list.append(El_lsq_non_der_raw) - - return r_list, c_list, el_list - - diff --git a/allensdk/internal/model/glif/spike_cutting.py b/allensdk/internal/model/glif/spike_cutting.py deleted file mode 100644 index b7ada151c9..0000000000 --- a/allensdk/internal/model/glif/spike_cutting.py +++ /dev/null @@ -1,219 +0,0 @@ -import numpy as np -from scipy import stats -from scipy.optimize import curve_fit, fmin -from allensdk.internal.model.glif.find_spikes import align_and_cut_spikes, ALIGN_CUT_WINDOW -import logging - -import matplotlib.pyplot as plt - -def calc_spike_cut_and_v_reset_via_expvar_residuals(all_current_list, - all_voltage_list, dt, El_reference, deltaV, - max_spike_cut_time=False, - MAKE_PLOT=False, SHOW_PLOT=False, PUBLICATION_PLOT=False, BLOCK=False): - '''This function calculates where the spike should be cut based on explained variance. - The goal is to find a model where the voltage after a spike maximally explains the - voltage before a spike. This will also specify the voltage reset rule - inputs: - spike_determination_method: string specifing the method used to find threshold - all_current_list: list of current (list of current traces injected into neuron) - all_voltage_list: list of voltages (list of voltage trace) - The change is that if the slope is greater than one or intercept is greater than zero it forces it. - Regardless of required force the residuals are used. - ''' - - #--find the region of the spike needed for calculation of explained variance - (temp_v_spike_shape_list, all_i_spike_shape_list, all_thresholdInd, waveIndOfFirstSpikes, spikeFromWhichSweep) \ - = align_and_cut_spikes(all_voltage_list, all_current_list, dt) - - #--At this point it is unclear how this calculation should be done. - #--the slope should be fine no matter what, but the intercept dependency - #--will depend on the El, and deltaV - - #--change reference - all_v_spike_shape_list=[shape-El_reference-deltaV for shape in temp_v_spike_shape_list] - - # --setting limits to find explained variance - if max_spike_cut_time and max_spike_cut_time < .010: - expVarIndRangeAfterSpike = range(int(.001 / dt), int(max_spike_cut_time / dt)) #NOTE: THIS IS USED IN REFERENCE TO SPIKE TIME - - else: - expVarIndRangeAfterSpike = range(int(.001 / dt), int(.010 / dt)) #NOTE: THIS IS USED IN REFERENCE TO SPIKE TIME - vectorIndex_of_max_explained_var = expVarIndRangeAfterSpike[0] # this is just here for the title of the plot - list_of_endPointArrays = [] # this should end up a list of numpy arrays where each numpy array contains the indices of the v_spike_shape_list that are a certain time after the threshold - for ii in expVarIndRangeAfterSpike: - list_of_endPointArrays.append(np.array(all_thresholdInd) + ii) - - def line_force_slope_to_1(x,c): - return x+c - - def line_force_int_to_0(x, m): #TODO: CHANGE THIS TO REST TOD DISCONNECT EVERYTHING. - return m*x - -# HERE YOU GET THE SLOPE AND INTERCEPT AT EACH POINT - linRegress_error_4_each_time_end = [] - slope_at_each_time_end=[] - intercept_at_each_time_end=[] - varData_4_each_time_end = [] - varModel_4_each_time_end = [] - chi2 = [] - sum_residuals_4_each_time_end=[] - xdata = np.array([v[all_thresholdInd[ii]] for ii, v in enumerate(all_v_spike_shape_list)]) - var_of_Vdata_beforeSpike = np.var(xdata) - for jj, vectorOfIndAcrossWaves in enumerate(list_of_endPointArrays): # these indices should be in terms of the spike waveforms -# print('jj', jj) - # TODO: Teeter get rid of the nonblipness - v_at_specificEndPoint = [all_v_spike_shape_list[ii][index] for ii, index in enumerate(vectorOfIndAcrossWaves)] # this is calculating variance at certain time points - # --currently the model of voltage reset is a linear regression between voltage before the spike and the voltage after the spike but it could be more complicated (for example as a function of current) - ydata = np.array(v_at_specificEndPoint) # this is the voltage at the specified end point - slope, intercept, r_value, p_value, std_err = stats.linregress(xdata, ydata) - -# print(slope, intercept, r_value, p_value, std_err) - -# if slope>1.0: -# logging.warning('linear regression slope is bigger than one: forcing slope to 1 and refitting intercept.') -# slope=1.0 -# (intercept, nothing)=curve_fit(line_force_slope_to_1, xdata, ydata) -# #print("NEW INTERCEPT:", intercept) -# if intercept>0.0: -# #warnings.warn('/t ... and intercept is bigger than zero: forcing intercept to 0') -# intercept=0.0 -# -# if intercept>0.0: -# logging.warning('Intercept is bigger than zero: forcing intercept to 0 and refitting slope.') -# intercept=0.0 -# (slope, nothing)=curve_fit(line_force_int_to_0,xdata, ydata) -# #print("NEW SLOPE: ", slope) -# if slope>1.0: -# logging.warning('/t ... and linear regression slope is bigger than one: forcing slope to 1.') -# slope=1.0 - - slope_at_each_time_end.append(slope) - intercept_at_each_time_end.append(intercept) - ymodel = slope * xdata + intercept - residuals = ydata - ymodel - sum_residuals=sum(abs(residuals)) - sum_residuals_4_each_time_end.append(sum_residuals) - chi2.append(np.var(residuals)) # how well the model describes the data - linRegress_error_4_each_time_end.append(std_err) - varData_4_each_time_end.append(np.var(v_at_specificEndPoint)) - varModel_4_each_time_end.append(np.var(ymodel)) - - # --these will line up with how many arrays there are in the list - vectorIndex_of_min_sum_residuals = sum_residuals_4_each_time_end.index(min(sum_residuals_4_each_time_end)) - - #----NOTE THIS ISNT ACTUALLY CALCULATING EXPLAINED VARIANCE!!!!!!!!!!!!!!!!!! - vectorIndex_of_max_explained_var=vectorIndex_of_min_sum_residuals - - - all_v_spike_init_list = [v[all_thresholdInd[ii]] for ii, v in enumerate(all_v_spike_shape_list)] -# USE THIS WHEN MUTIPLE VECTORS all_v_at_min_expVar_list=[v[list_of_endPointArrays[vectorIndex_of_max_explained_var][ii]] for ii, v in enumerate(all_v_spike_shape_list)] - all_v_at_min_expVar_list = [v[list_of_endPointArrays[vectorIndex_of_max_explained_var][ii]] for ii, v in enumerate(all_v_spike_shape_list)] - time_at_minExpVar=list_of_endPointArrays[vectorIndex_of_max_explained_var]*dt - if MAKE_PLOT: - truncatedTime = np.arange(0, len(all_v_spike_shape_list[0])) * dt - plt.figure(figsize=(20, 10)) - for ii in range(0, len(all_v_spike_shape_list)): - plt.subplot(2,1,1) - plt.plot(truncatedTime, temp_v_spike_shape_list[ii]) - # plt.plot(truncatedTime[aligned_peakInd[ii]],spikewave[aligned_peakInd[ii]], '.k' - plt.plot(truncatedTime[all_thresholdInd[ii]], temp_v_spike_shape_list[ii][all_thresholdInd[ii]], '*k') - plt.title('Non adusted spikes') - - plt.subplot(2,1,2) - plt.plot(truncatedTime, all_v_spike_shape_list[ii]) - plt.plot(time_at_minExpVar, all_v_at_min_expVar_list, '*k') - plt.xlabel('time (s)', fontsize=20) - plt.ylabel('voltage (mV)', fontsize=20) - plt.title("Adjusted spikes (RP=%.3g, deltaV=%.3g)" % (El_reference,deltaV)) - - if PUBLICATION_PLOT: - truncatedTime = np.arange(0, len(all_v_spike_shape_list[0])) * dt - plt.figure(figsize=(20, 5)) - for ii in range(0, len(all_v_spike_shape_list)): - plt.plot(truncatedTime*1000, temp_v_spike_shape_list[ii]*1e3, lw=2) - # plt.plot(truncatedTime[aligned_peakInd[ii]],spikewave[aligned_peakInd[ii]], '.k' - plt.plot(truncatedTime[all_thresholdInd[ii]]*1000, temp_v_spike_shape_list[ii][all_thresholdInd[ii]]*1e3, '.k', ms=10) -# plt.title('Spike Cutting', fontsize=20) -# plt.subplot(2,1,2) -# plt.plot(truncatedTime, all_v_spike_shape_list[ii]) - plt.plot(time_at_minExpVar*1000, (np.array(all_v_at_min_expVar_list)+El_reference+deltaV)*1.e3, '.k', ms=10) - plt.xlabel('Time (ms)', fontsize=16) - plt.ylabel('Voltage (mV)', fontsize=16) - plt.xlim([0,12]) - plt.tight_layout() -# plt.title("Adjusted spikes (RP=%.3g, deltaV=%.3g)" % (El_reference,deltaV)) - - if SHOW_PLOT: - plt.show(block=BLOCK) - - -# indNotExcluded_In_regress=list(np.setdiff1d(np.array([theInd for theInd in spikeIndDict['nonblip']]), np.array(waveIndOfFirstSpikes))) -# something is wrong with all_v_at_min_expVar_list--look at the difference between starting at .003 and .005 after thresh - if MAKE_PLOT: - plt.figure(figsize=(20, 10)) - plt.plot(all_v_spike_init_list, all_v_at_min_expVar_list, 'b.', ms=16, label='noise') # list of voltage traces for blip - plt.xlabel('voltage at spike initiation (V)', fontsize=20) - plt.ylabel('voltage after spike (V)', fontsize=20) -# plt.title(cellTitle, fontsize=20) - - slope_at_min_expVar_list, intercept_at_min_expVar_list, r_value_at_min_expVar_list, p_value_at_min_expVar_list, std_err_at_min_expVar_list = \ - stats.linregress(np.array(all_v_spike_init_list), np.array(all_v_at_min_expVar_list)) - - print('mean of voltage before spike', np.mean(all_v_spike_init_list)) - print('mean of voltage after spike', np.mean(all_v_at_min_expVar_list)) - - - spike_cut_length= (list_of_endPointArrays[vectorIndex_of_max_explained_var][0])-int(ALIGN_CUT_WINDOW[0]/dt) #note this is dangerous if they arent' all at the same ind - - - if MAKE_PLOT: - xlim = np.array([min(all_v_spike_init_list), max(all_v_spike_init_list)]) - plotLineRegress1(slope_at_min_expVar_list, intercept_at_min_expVar_list, r_value_at_min_expVar_list, xlim) - plt.legend(loc=2, fontsize=20) - - - if MAKE_PLOT: - xlim = np.array([min(all_v_spike_init_list), max(all_v_spike_init_list)]) - plotLineRegressRed(slope_at_each_time_end[vectorIndex_of_max_explained_var], intercept_at_each_time_end[vectorIndex_of_max_explained_var], np.NAN, xlim) - plt.legend(loc=2, fontsize=20) - if SHOW_PLOT: - plt.show(block=BLOCK) - - if PUBLICATION_PLOT: - - plt.figure(figsize=(7, 5)) - plt.plot(np.array(all_v_spike_init_list)*1e3, np.array(all_v_at_min_expVar_list)*1e3, 'b.', ms=16) # list of voltage traces for blip - plt.xlabel('Voltage at spike initiation (mV)', fontsize=16) - plt.ylabel('Voltage after spike (mV)', fontsize=16) -# plt.title('Voltage reset rules', fontsize=20) - xlim = np.array([min(all_v_spike_init_list), max(all_v_spike_init_list)]) - - def plot_hack(slope, intercept, r,xlim): - y=slope*xlim+intercept - plt.plot(xlim, y, '-k', lw=4)# label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept) - - plot_hack(slope_at_min_expVar_list, intercept_at_min_expVar_list*1e3, r_value_at_min_expVar_list, xlim*1e3) - plt.legend(loc=2, fontsize=16) - plt.tight_layout() - plt.show(block=BLOCK) - - #TODO: Corinne look to see if these were calculated with zeroed out El if not does is matter? - if isinstance(slope_at_min_expVar_list, np.ndarray): - slope_at_min_expVar_list=float(slope_at_min_expVar_list[0]) - if isinstance(intercept_at_min_expVar_list, np.ndarray): - intercept_at_min_expVar_list=float(intercept_at_min_expVar_list[0]) - - if type(intercept_at_min_expVar_list)==list or type(intercept_at_min_expVar_list)==np.ndarray: - intercept_at_min_expVar_list=intercept_at_min_expVar_list[0] - - return spike_cut_length, slope_at_min_expVar_list, intercept_at_min_expVar_list - -def plotLineRegress1(slope, intercept, r,xlim): - y=slope*xlim+intercept - print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) - plt.plot(xlim, y, '-k', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) - -def plotLineRegressRed(slope, intercept, r,xlim): - y=slope*xlim+intercept - print('slope=', slope, 'intercept=', intercept, 'xlim', xlim) - plt.plot(xlim, y, '-r', lw=4, label='slope='+"%.2f"%slope+', intercept='+"%.3f"%intercept+', r='+"%.2f"%r) diff --git a/allensdk/internal/model/glif/threshold_adaptation.py b/allensdk/internal/model/glif/threshold_adaptation.py deleted file mode 100644 index 43fdf401f0..0000000000 --- a/allensdk/internal/model/glif/threshold_adaptation.py +++ /dev/null @@ -1,649 +0,0 @@ -import numpy as np -import copy -from scipy.interpolate import interp1d -from scipy.optimize import curve_fit -import matplotlib.pyplot as plt -import logging -THRESH_PCT_MULTIBLIP = 0.05 - -from allensdk.model.glif.glif_neuron_methods import spike_component_of_threshold_exact -from allensdk.internal.model.glif.find_spikes import find_spikes_ssq_list - -def calc_spike_component_of_threshold_from_multiblip(multi_SS, dt, dv_cutoff, thresh_frac, - MAKE_PLOT=False, SHOW_PLOT=False, BLOCK=False, PUBLICATION_PLOT=False): - '''Calculate the spike components of the threshold by fitting a decaying exponential function to data to threshold versus time - since last spike in the multiblip data. The exponential is forced to decay to the local th_inf (calculated as the mean all of the - threshold values of the first spikes in each individual triblip stimulus). For each multiblip stimulus in a stimulus set if there - is more than one spike the difference in voltages from the first and second spike are plotted versus the separation in time. Note that - this algorithm should only be implemented on multiblips sweeps where the neuron spike on the first and second blip. Since there is - no easy way to do this, this erroneous data should not be provided to this algorithm (i.e is should be visually checked and eliminated - the preprocessor should hold back this data manually for now.) - - #TODO: check to see if this is still true. Notes: The standard SDK spike detection algorithm does not work with the multiblip stimulus - due to artifacts when the stimulus turns on and off. Please see the find_multiblip_spikes module for more information. - - Input: - - multi_SS: dictionary - contains multiblip information such as current and stimulus - dt: float - time step in seconds - - Returns: - - const_to_add_to_thresh_for_reset: float - amplitude of the exponential fit otherwise known as a_spike. Note that this is without any spike cutting - decay_const: float - decay constant of exponential. Note the function fit is a negative exponential which will mean this value will - either have to be negated when it is used or the functions used will have to have to include the negative. - thresh_inf: float - - ''' - multi_SS_v=multi_SS['voltage'] - multi_SS_i=multi_SS['current'] - - # --get indicies of spikes - spike_ind, _=find_spikes_ssq_list(multi_SS_v, dt, dv_cutoff, thresh_frac) -# spike_ind=find_multiblip_spikes(multi_SS_i, multi_SS_v, dt) can depricate find_multiblip_spikes - - - # eliminate spurious spikes that may exist - spike_lt=[np.where(SI<int(2.0/dt))[0] for SI in spike_ind] - if len(np.concatenate(spike_lt))>0: - logging.warning('there is a spike before the stimulus in the multiblip') - spike_ind=[np.delete(SI,ind)for SI, ind in zip(spike_ind, spike_lt)] - spike_gt=[np.where(SI>int(3.0/dt))[0] for SI in spike_ind] - if len(np.concatenate(spike_gt))>0: - logging.warning('there is a spike after the stimulus in the multiblip') - spike_ind=[np.delete(SI,ind)for SI, ind in zip(spike_ind, spike_gt)] - - # intialize output lists - time_previous_spike=[] - threshold=[] - thresh_first_spike=[] #will set constant to this - - if MAKE_PLOT: - plt.figure(figsize=(20,24)) - - # Loop though each tri blip stimulus in muliblip stimulus - for k in range(0, len(multi_SS_v)): - thresh=[multi_SS_v[k][j] for j in spike_ind[k]] # voltage at all spikes in a single tri blip - if thresh!=[] and len(thresh)>1:# there needs to be more than one spike so that we can find the time difference - thresh_first_spike.append(thresh[0]) #Note that this finds the first spike (it might not be at the first stimulus blip) - threshold.append(thresh[1]) - time_previous_spike.append((spike_ind[k][1]-spike_ind[k][0])*dt) -# Old way when looked at all the spikes instead of just the first two (can be depricated; just here for record keeping) -# threshold.append(thresh[1:]) -# time_before_temp=[] -# for j in range(1,len(thresh)): -# time_before_temp.append((spike_ind[k][j]-spike_ind[k][j-1])*dt) -# #for each spike calculate the time from the previous spike -# time_previous_spike.append(time_before_temp) - if MAKE_PLOT: - plt.subplot(len(multi_SS_v)+1,1,1) - plt.plot(np.arange(0, len(multi_SS_i[k]))*dt, multi_SS_i[k]*1e12, lw=2) - plt.ylabel('current (pA)', fontsize=16) - plt.xlim([2., 2.12]) - plt.title('Triple Short Square', fontsize=20) - plt.subplot(len(multi_SS_v)+1,1,k+2) - plt.plot(np.arange(0, len(multi_SS_v[k]))*dt, multi_SS_v[k], lw=2) - plt.plot(spike_ind[k]*dt, thresh, '.k', ms=16) - plt.xlim([2., 2.12]) - - if MAKE_PLOT: - plt.ylabel('voltage (V)', fontsize=16) - plt.xlabel('time (s)', fontsize=16) - - if SHOW_PLOT: - plt.show(block=False) - - # put numbers into one vector for fitting of exponential function - thresh_inf=np.mean(thresh_first_spike) #note this threshold infinity isnt the one coming from single blip - try: #this try here because sometimes even though have the traces there isnt more than one trace with two spikes -#--these two lines no longer needed because all single values now (depricate with lines up above) instead converst them to arrays -# threshold=np.concatenate(threshold) -# time_previous_spike=np.concatenate(time_previous_spike) #note that this will have nans in it - threshold=np.array(threshold) - time_previous_spike=np.array(time_previous_spike) #note that this will have nans in it - - if MAKE_PLOT: - plt.figure() - plt.plot(time_previous_spike, threshold, '.k', ms=16) - plt.ylabel('threshold (mV)') - plt.xlabel('time since last spike (s)') - - # calculate values of exponential function both if force function to local threshold infinity and not forcing to a value - # (not forcing to a value seems less valid unless a bunch of points are added corresponding to the threshold of the - # first spike at time equal infinity (because the first spike is a spike that happens where the spike before it was an - # infinite time away)). Therefore, the values that are obtained from forcing are the ones that are used. - p0_force=[.002, -100.] - p0_fit=[.002, -100., thresh_inf] - - #TODO: THIS WOULD BE BETTER IF IT CALLED THE ACTUAL FUNCTION IN THE NEURON METHODS THAT WAY THEY WOULD HAVE TO BE THE SAME - (popt_force, pcov_force)= curve_fit(exp_force_c, (time_previous_spike, thresh_inf), threshold, p0=p0_force, maxfev=100000) - (popt_fit, pcov_fit)= curve_fit(exp_fit_c, time_previous_spike, threshold, p0=p0_fit, maxfev=100000) - - # viewing fit functions - time_previous_spike.sort() #since time is not in order, making new time vector so that obtained fit curve can be plotted - fit_force=exp_force_c((time_previous_spike, thresh_inf), popt_force[0], popt_force[1]) - fit_fit=exp_fit_c(time_previous_spike, popt_fit[0], popt_fit[1], popt_fit[2]) - if MAKE_PLOT: - plt.plot(time_previous_spike, fit_force, 'r', lw=4, label="exp fit (force const to thesh first spike)\n k=%.3g, amp=%.3g" % (popt_force[1], popt_force[0])) - plt.plot(time_previous_spike, fit_fit, 'b', lw=4, label="exp fit (fit constant)\n k=%.3g, amp=%.3g" % (popt_fit[1], popt_fit[0])) - plt.legend() - if SHOW_PLOT: - plt.show(block=False) - - if PUBLICATION_PLOT: - plt.figure(figsize=[14, 5]) - ax1=plt.subplot2grid((2, 2), (0,0)) - ax2=plt.subplot2grid((2, 2), (1,0)) - ax3=plt.subplot2grid((2, 2), (0,1), rowspan=2) - for k in range(0, len(multi_SS_v)): - thresh=[multi_SS_v[k][j] for j in spike_ind[k]] - - ax1.plot(np.arange(0, len(multi_SS_i[k]))*dt, multi_SS_i[k]*1.e12, lw=2) - ax1.set_ylabel('Current (pA)', fontsize=16) - ax1.set_xlim([2., 2.12]) - ax1.axes.xaxis.set_ticklabels([]) - #ax1.set_title('Triple Short Square', fontsize=20) - - ax2.plot(np.arange(0, len(multi_SS_v[k]))*dt, multi_SS_v[k]*1.e3, lw=2) - ax2.plot(spike_ind[k]*dt, np.array(thresh)*1.e3, '.k', ms=16) - ax2.set_ylabel('Voltage (mV)', fontsize=16) - ax2.set_xlabel('Time (ms)', fontsize=16) - ax2.set_xlim([2., 2.12]) - - - ax3.plot(time_previous_spike, np.array(threshold)*1.e3, '.k', ms=16) - ax3.set_ylabel('Threshold (mV)', fontsize=16) - ax3.set_xlabel('Time since last spike (s)', fontsize=16) -# ax3.set_title('Spiking component of threshold', fontsize=20) - ax3.plot(time_previous_spike, fit_force*1.e3, 'r', lw=4)#, label="exp fit: k=%.3g, amp=%.3g" % (popt_force[1], popt_force[0])) - ax3.legend() - plt.tight_layout() - plt.show() - - const_to_add_to_thresh_for_reset=popt_force[0] - decay_const=popt_force[1] - - if decay_const >0: - logging.critical('This neuron has an increasing decay value for the spike component of the threshold') - if const_to_add_to_thresh_for_reset<0: - logging.critical('This neuron has a negative amplitude for the spike component of the threshold') - - #if the decay constant is positive, or the amplitute is negative set the amplitude to 0 so that there - #will be no spike component of the threshold - if decay_const >0 or const_to_add_to_thresh_for_reset < 0: - const_to_add_to_thresh_for_reset=0 - decay=-1.0 #note that this number doesnt matter since the amplitude is set to zero - - # This decay constant was originally forced to be positive (i.e. decay_const=abs(popt_force[1])) - # and then it is negated everywhere it is utilized elsewhere in the code. Now things are forced in - # a different way above. However the decay constant still needs to be negated here for use in the - # rest of the code. - decay_const=-decay_const - - - except Exception as e: - logging.error(e.message) - const_to_add_to_thresh_for_reset=None - decay_const=None - - return const_to_add_to_thresh_for_reset, decay_const, thresh_inf - -def fit_avoltage_bvoltage(x, v_trace_list, El_list, spike_cut_length, all_spikeInd_list, th_inf, dt, a_spike, - b_spike, fake=False): - '''This is a version of fit_avoltage_bvoltage_debug that does not require the th_trace, - v_component_of_thresh_trace, and spike_component_of_thresh_trace needed for debugging. A - test should be run to make sure the same output comes out from this and the debug function - - This function returns the squared error for the difference between the 'known' voltage - component of the threshold obtained from the biological neuron and the voltage component - of the threshold of the model obtained with the input parameters (so that the minimum can be - searched for via fmin). The overall threshold is the sum of threshold infinity the spike component - of the threshold and the voltage component of the threshold. Therefore threshold infinity and - the spike component of the threshold must be subtracted from the threshold of the neuron in order - to isolate the voltage component of the threshold. In the evaluation of the model the actual - voltage of the neuron is used so that any errors in the other components of the model will not - influence the fits here (for example, if a afterspike current was estimated incorrectly) - - Notes: - * The spike component of the threshold is subtracted from the - voltage which means that the voltage component of the threshold should only be added to rules. - * b_spike was fit using a negative value in the function therefore the negative is placed in the - equation. - * values in this function are in 'real' voltage as opposed to voltage - relative to resting potential. - * current injection during the spike is not taken into account. This seems reasonable as the - ion channels are open during this time and injected current may not greatly influence the neuron. - - x: numpy array - x[0]=a_voltage input, x[1] is b_voltage_input, x[2] is th_inf - v_trace_list: list of numpy arrays - voltage traces (v_trace, El, and th_inf must be in the same frame of reference) - El_list: list of floats - reversal potential (v_trace, El, and th_inf must be in the same frame of reference) - spike_cut_length: int - number of indicies removed after initiation of a spike - all_spikeInd_list: list of numpy arrays - indicies of spike trains - th_inf: float - threshold infinity (v_trace, El, and th_inf must be in the same frame of reference) - dt: float - size of time step (SI units) - a_spike: float - amplitude of spike component of threshold. - b_spike: float - decay constant in spike component of the threshold - fake: Boolean - if True makes uses the voltage value of spike step-1 because there is not a voltage value at the spike - step because it is set to nan in the simulator. - ''' - a_voltage=x[0] - b_voltage=x[1] - - total_err=0 - for v_trace, El, all_spikeInd in zip(v_trace_list, El_list, all_spikeInd_list): - # Calculate values along the whole trace and then take the values at the spike ind - internal_sp_comp_array=np.zeros(all_spikeInd[0]+spike_cut_length) - left_over=0 - #vector of spike component of of the threshold from each spike and previous spikes; note at first spike there is no spike component of threshold so initialized at zero - #Note that care has to be taken here to get make sure the right amount of decay is left over - for spike_number in range(1,len(all_spikeInd)): #skipping first spike since no residual spike component of threshold - integration_length=all_spikeInd[spike_number]-all_spikeInd[spike_number-1]+1 #this is the amount of time that needs to be integrated over note that it is one longer than the interval because of the last value is added to the aspike for the next ISI - local_spike_comp_of_threshold=spike_component_of_threshold_exact(a_spike+left_over, b_spike, np.arange(integration_length)*dt) - internal_sp_comp_array=np.append(internal_sp_comp_array, local_spike_comp_of_threshold[:-1]) - left_over=local_spike_comp_of_threshold[-1] - - # Compute voltage component of threshold at biological spike (subtract th_inf and spike component of threshold - # from biological voltage values at spike initiation) - #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # NOTE THAT THERE IS AN ISSUE HERE USING FAKE DATA. THE -1 IS HERE BECAUSE THE NEURON CROSSES THRESHOLD SOMETIME BETWEEN TWO INDICIES. - # FOR THE FAKE DATA THE TIME OF THE SPIKE (THE POINT FOLLOWING WHEN THE VOLTAGE CROSSES THRESHOLD) IS SET TO NAN. - # THE INTERPOLATED VOLTAGE CAN BE USED BUT THEN THE INTERPOLATED VOLTAGE MUST BE CALCULATED FOR THE TRUE VOLTAGE - # TRACE AND POSSIBLY IN THE INTEGRATION. - if fake: - v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd-1]-internal_sp_comp_array[all_spikeInd-1]-th_inf #USE THIS FOR FAKE DATA - else: - v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd]-internal_sp_comp_array[all_spikeInd]-th_inf #USE THIS FOR REAL DATA (although probably not necessary) - #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - # For each ISI, calculate the difference between the voltage dependent component of the threshold - # and the value that would be determined via a model that uses the actual voltage of neuron. - sq_err = [] #list to store squared error between the model and biological threshold - for spike_number in range(1, len(all_spikeInd)): #loop over all ISI's in data - v_start_ind = all_spikeInd[spike_number-1]+int(spike_cut_length) #dont want to use voltage during a spike - end_ind = all_spikeInd[spike_number] - v_in_ISI=v_trace[v_start_ind:end_ind] - #voltage component of threshold at the beginning and end of the ISI - #With fake data if go from one before fake data to fake data this should be exact - theta0=v_comp_of_th_at_each_spike_via_data[spike_number-1] #this assumes that the voltage component of the threshold does not change over the time period of the spike - # not sure this makes sense any moretheta0=v_comp_of_th_at_each_spike_via_data[spike_number-1]+sp_comp_of_offset_at_spike_list[spike_number-1] #use this is you want to add the biological component back on - theta1=v_comp_of_th_at_each_spike_via_data[spike_number] - tvec=np.arange(len(v_in_ISI))*dt - - #analytical solution should be exact with fake data--small differences could be because of the differences in the voltage at - #spike indicies are off by one - model=+theta0*np.exp(-b_voltage*dt*(end_ind-v_start_ind))+a_voltage*np.exp(-b_voltage*tvec[-1])*np.sum(dt*(v_in_ISI-El)*np.exp(b_voltage*tvec)) - err = (theta1-model)**2 - if ~np.isnan(err): - sq_err.append(err) - - total_err+=np.sum(sq_err) - return total_err - -def fit_avoltage_bvoltage_th(x, v_trace_list, El_list, spike_cut_length, all_spikeInd_list, dt, a_spike, - b_spike, fake=False): - '''This is a version of fit_avoltage_bvoltage_th_debug that does not require the th_trace, - v_component_of_thresh_trace, and spike_component_of_thresh_trace needed for debugging. A - test should be run to make sure the same output comes out from this and the debug function - - This function returns the squared error for the difference between the 'known' voltage - component of the threshold obtained from the biological neuron and the voltage component - of the threshold of the model obtained with the input parameters (so that the minimum can be - searched for via fmin). The overall threshold is the sum of threshold infinity the spike component - of the threshold and the voltage component of the threshold. Therefore threshold infinity and - the spike component of the threshold must be subtracted from the threshold of the neuron in order - to isolate the voltage component of the threshold. In the evaluation of the model the actual - voltage of the neuron is used so that any errors in the other components of the model will not - influence the fits here (for example, if a afterspike current was estimated incorrectly) - - Notes: - * The spike component of the threshold is subtracted from the - voltage which means that the voltage component of the threshold should only be added to rules. - * b_spike was fit using a negative value in the function therefore the negative is placed in the - equation. - * values in this function are in 'real' voltage as opposed to voltage - relative to resting potential. - * current injection during the spike is not taken into account. This seems reasonable as the - ion channels are open during this time and injected current may not greatly influence the neuron. - - x: numpy array - x[0]=a_voltage input, x[1] is b_voltage_input, x[2] is th_inf - v_trace_list: list of numpy arrays - voltage traces (v_trace, El, and th_inf must be in the same frame of reference) - El_list: list of floats - reversal potential (v_trace, El, and th_inf must be in the same frame of reference) - spike_cut_length: int - number of indicies removed after initiation of a spike - all_spikeInd_list: list of numpy arrays - indicies of spike trains - dt: float - size of time step (SI units) - a_spike: float - amplitude of spike component of threshold. - b_spike: float - decay constant in spike component of the threshold - fake: Boolean - if True makes uses the voltage value of spike step-1 because there is not a voltage value at the spike - step because it is set to nan in the simulator. - ''' - a_voltage=x[0] - b_voltage=x[1] - th_inf=x[2] - - total_err=0 - for v_trace, El, all_spikeInd in zip(v_trace_list, El_list, all_spikeInd_list): - # Calculate values along the whole trace and then take the values at the spike ind - internal_sp_comp_array=np.zeros(all_spikeInd[0]+spike_cut_length) - left_over=0 - #vector of spike component of of the threshold from each spike and previous spikes; note at first spike there is no spike component of threshold so initialized at zero - #Note that care has to be taken here to get make sure the right amount of decay is left over - for spike_number in range(1,len(all_spikeInd)): #skipping first spike since no residual spike component of threshold - integration_length=all_spikeInd[spike_number]-all_spikeInd[spike_number-1]+1 #this is the amount of time that needs to be integrated over note that it is one longer than the interval because of the last value is added to the aspike for the next ISI - local_spike_comp_of_threshold=spike_component_of_threshold_exact(a_spike+left_over, b_spike, np.arange(integration_length)*dt) - internal_sp_comp_array=np.append(internal_sp_comp_array, local_spike_comp_of_threshold[:-1]) - left_over=local_spike_comp_of_threshold[-1] - - # Compute voltage component of threshold at biological spike (subtract th_inf and spike component of threshold - # from biological voltage values at spike initiation) - #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - # NOTE THAT THERE IS AN ISSUE HERE USING FAKE DATA. THE -1 IS HERE BECAUSE THE NEURON CROSSES THRESHOLD SOMETIME BETWEEN TWO INDICIES. - # FOR THE FAKE DATA THE TIME OF THE SPIKE (THE POINT FOLLOWING WHEN THE VOLTAGE CROSSES THRESHOLD) IS SET TO NAN. - # THE INTERPOLATED VOLTAGE CAN BE USED BUT THEN THE INTERPOLATED VOLTAGE MUST BE CALCULATED FOR THE TRUE VOLTAGE - # TRACE AND POSSIBLY IN THE INTEGRATION. - if fake: - v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd-1]-internal_sp_comp_array[all_spikeInd-1]-th_inf #USE THIS FOR FAKE DATA - else: - v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd]-internal_sp_comp_array[all_spikeInd]-th_inf #USE THIS FOR REAL DATA (although probably not necessary) - #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - # For each ISI, calculate the difference between the voltage dependent component of the threshold - # and the value that would be determined via a model that uses the actual voltage of neuron. - sq_err = [] #list to store squared error between the model and biological threshold - for spike_number in range(1, len(all_spikeInd)): #loop over all ISI's in data - v_start_ind = all_spikeInd[spike_number-1]+int(spike_cut_length) #dont want to use voltage during a spike - end_ind = all_spikeInd[spike_number] - v_in_ISI=v_trace[v_start_ind:end_ind] - #voltage component of threshold at the beginning and end of the ISI - #With fake data if go from one before fake data to fake data this should be exact - theta0=v_comp_of_th_at_each_spike_via_data[spike_number-1] #this assumes that the voltage component of the threshold does not change over the time period of the spike - # not sure this makes sense any moretheta0=v_comp_of_th_at_each_spike_via_data[spike_number-1]+sp_comp_of_offset_at_spike_list[spike_number-1] #use this is you want to add the biological component back on - theta1=v_comp_of_th_at_each_spike_via_data[spike_number] - tvec=np.arange(len(v_in_ISI))*dt - - #analytical solution should be exact with fake data--small differences could be because of the differences in the voltage at - #spike indicies are off by one - model=+theta0*np.exp(-b_voltage*dt*(end_ind-v_start_ind))+a_voltage*np.exp(-b_voltage*tvec[-1])*np.sum(dt*(v_in_ISI-El)*np.exp(b_voltage*tvec)) - err = (theta1-model)**2 - if ~np.isnan(err): - sq_err.append(err) - - total_err+=np.sum(sq_err) - return total_err - - -#TODO: depricate confirmed use of fit_avoltage_bvoltage_th -#def err_fix_th(x, v_trace, El, spike_cut_length, all_spikeInd, th_inf, dt, a_spike, b_spike): -# '''This function returns the squared error for the difference between the 'known' voltage -# component of the threshold obtained from the biological neuron and the voltage component -# of the threshold of the model obtained with the input parameters (so that the minimum can be -# searched for via fmin). The overall threshold is the sum of threshold infinity the spike component -# of the threshold and the voltage component of the threshold. Therefore threshold infinity and -# the spike component of the threshold must be subtracted from the threshold of the neuron in order -# to isolate the voltage component of the threshold. In the evaluation of the model the actual -# voltage of the neuron is used so that any errors in the other components of the model will not -# influence the fits here (for example if a afterspike current was estimated incorrectly) -# -# Notes: -# * The spike component of the threshold is subtracted from the -# voltage which means that the voltage component of the threshold should only be added to rules. -# * b_spike was fit using a negative value in the function therefore the negative is placed in the -# equation. -# * values in this function are in 'real' voltage as opposed to voltage -# relative to resting potential. -# * current injection during the spike is not taken into account. This seems reasonable as the -# ion channels are open during this time and injected current may not greatly influence the neuron. -# -# x: numpy array -# x[0]=a_voltage input, x[1] is b_voltage_input -# voltage: numpy array -# voltage trace (voltage, El, and th_inf must be in the same frame of reference) -# El: float -# reversal potential (voltage, El, and th_inf must be in the same frame of reference) -# spike_cut_length: int -# number of indicies removed after initiation of a spike -# all_spikeInd: numpy array -# indicies of spike train -# th_inf: float -# threshold infinity (voltage, El, and th_inf must be in the same frame of reference) -# dt: float -# size of time step (SI units) -# a_spike: float -# amplitude of spike component of threshold. -# b_spike: float -# decay constant in spike component of the threshold -# ''' -# a_voltage=x[0] -# b_voltage=x[1] -# # effect of the spike component of the threshold from each spike and previous spikes -# sp_comp_of_offset_sum_vector=[0] #vector of spike component of of the threshold from each spike and previous spikes; note at first spike there is no spike component of threshold so initialized at zero -# for spike_number in range(1,len(all_spikeInd)): #skipping first spike since no residual spike component of threshold -# t=(all_spikeInd[spike_number]-all_spikeInd[spike_number-1]-spike_cut_length)*dt #spike ISI -# sp_comp_of_th_offset_local = spike_component_of_threshold_exact(a_spike, b_spike, t) #spike component of threshold at each ISI for each individual spike -# #I THINK THE LINE BELOW MIGHT JUST BE WRONG BECAUSE THE OLD OFF SET WOULD DECAY AND I DONT THINK IT IS HERE:THIS IS WHAT IS BEING USED -## sp_comp_of_offset_sum_vector.append(sp_comp_of_offset_sum_vector[-1] + sp_comp_of_th_offset_local) #keeping track of residual spike component of threshold at each spike -# left_over_decay=spike_component_of_threshold_exact(sp_comp_of_offset_sum_vector[-1], b_spike, t) -# sp_comp_of_offset_sum_vector.append(left_over_decay + sp_comp_of_th_offset_local) #keeping track of spike component of threshold with residuals at each spike -# -# -# # Compute v_trace component of threshold at biological spike (subtract th_inf and spike component of threshold -# # from biological v_trace values at spike initiation) -# #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# # NOTE THAT THERE IS AN ISSUE HERE USING FAKE DATA. THE -1 IS HERE BECAUSE THE NEURON CROSSES THRESHOLD SOMETIME BETWEEN TWO INDICIES. -# # FOR THE FAKE DATA THE TIME OF THE SPIKE (THE POINT FOLLOWING WHEN THE VOLTAGE CROSSES THRESHOLD) IS SET TO NAN. -# # THE INTERPOLATED VOLTAGE CAN BE USED BUT THEN THE INTERPOLATED VOLTAGE MUST BE CALCULATED FOR THE TRUE VOLTAGE -# # TRACE AND POSSIBLY IN THE INTEGRATION. -# v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd-1]-np.array(sp_comp_of_offset_sum_vector)-th_inf #USE THIS FOR FAKE DATA -## v_comp_of_th_at_each_spike_via_data=v_trace[all_spikeInd]-np.array(sp_comp_of_offset_sum_vector)-th_inf #THIS IS PROBABLY APPROPRIATE FOR REAL DATA -# #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# -# # For each ISI, calculate the difference between the v_trace dependent component of the threshold -# # and the value that would be determined via a model that uses the actual v_trace of neuron. -# sq_err = [] #list to store squared error between the model and biological threshold -# for spike_number in range(1, len(all_spikeInd)): #loop over all ISI's in data -# v_start_ind = all_spikeInd[spike_number-1]+int(spike_cut_length) #dont want to use voltage during a spike -# end_ind = all_spikeInd[spike_number] -# v_in_ISI=v_trace[v_start_ind:end_ind] -# #v_trace component of threshold at the beginning and end of the ISI -# -# theta0=v_comp_of_th_at_each_spike_via_data[spike_number-1] #this assumes that the voltage component of the threshold does not change over the time period of the spike -# # not sure this makes sense any moretheta0=v_comp_of_th_at_each_spike_via_data[spike_number-1]+sp_comp_of_offset_sum_vector[spike_number-1] #use this is you want to add the biological component back on -# theta1=v_comp_of_th_at_each_spike_via_data[spike_number] -# tvec=np.arange(len(v_in_ISI))*dt -# -# #need to prove this--NOTE THAT THIS SHOULD BE EXACT DURING FAKE DATA--DIFFERENCES COULD BE DUE TO GETTING VALUES AT DIFFERENT INDICIES -# model=+theta0*np.exp(-b_voltage*dt*(end_ind-v_start_ind))+a_voltage*np.exp(-b_voltage*tvec[-1])*np.sum(dt*(v_in_ISI-El)*np.exp(b_voltage*tvec)) -# err = (theta1-model)**2 -# if ~np.isnan(err): -# sq_err.append(err) -# -# return np.sum(sq_err) - -# TODO: can depricate, using sdk now -#def find_multiblip_spikes(multi_SS_i, multi_SS_v, dt): -# '''artifacts caused by turning stimulus on and off created artifacts that -# created problems for the standard spike detection algorithm. Several alterations -# were made so that the algorithm would detect spikes appropriately. Please see multiblip -# spike cutting documentation for more information on how the code differs from the SDK -# version and what was needed to solve specific issues. -# input: -# multi_SS_i: list of arrays -# each array corresponds to the current stimulation of one triblip stimulus -# multi_SS_v: list of arrays -# each array corresponds to the voltage trace of triblip simulus -# dt: float -# ''' -# artifact_ave_window_time_s=0.0003 # -# window_indicies_to_ave_len=int(artifact_ave_window_time_s/dt) -# out_spk_idxs_list=[] -# for current, voltage in zip(multi_SS_i, multi_SS_v): -# #--Find the beginning and end of stimuli so that we can average the voltage traces at that time -# up_blip_index=np.where(np.diff(np.greater_equal(current, 1e-10).astype(int)) == 1)[0]#Note 1e-10 is larger than test pulse so it will not pick up test pulse -# down_blip_index=np.where(np.diff(np.less_equal(current, 1e-10).astype(int)) == 1)[0] -# potential_artifact_indexes=np.sort(np.append(up_blip_index, down_blip_index)) -# artifact_removed_voltage=copy.deepcopy(voltage) -# window_boarders_index=[] -# #--remove artifacts -# for index in potential_artifact_indexes: -# smooth_window=range(index,index+window_indicies_to_ave_len+1) -# -# # interpolate in the smoothing window -# blah=interp1d([smooth_window[0], smooth_window[-1]], [artifact_removed_voltage[smooth_window[0]], artifact_removed_voltage[smooth_window[-1]]]) -# artifact_removed_voltage[smooth_window]=blah(smooth_window) -# -# #windows boarders are just for plotting -## window_boarders_index.append(smooth_window[0]) -## window_boarders_index.append(smooth_window[-1]) -## plt.figure() -## plt.plot(voltage, 'b', lw=4) -## plt.plot(artifact_removed_voltage, 'r', lw=2) -## plt.plot(window_boarders_index, artifact_removed_voltage[window_boarders_index], '|g', ms=10) -## plt.xlim([40400, 41000]) -## plt.show() -## -## t = np.arange(0, len()) * dt -# -# # keeping the smooth_v convention of the SDK find spike code. However in the SDK code -# # this is used to name data potentially smoothed by a bessel filter -# smooth_v = artifact_removed_voltage -# dv = np.diff(smooth_v) -# dvdt = dv / dt -# dvv = np.diff(dvdt) -# -# v=smooth_v[:-1] #truncating the end of v so it has the same dimensions as dvdt for time plotting -# -# spikes = [] -# out_spk_idxs = [] -# -# peaks=get_peaks(v) # find potential spikes by finding peak over zero mv -# -# # Etay defines spike as time of threshold crossing. Threshold is defined as the time at which dvdt is some percent of maximum threshold. -# # TODO: figure out how maximum threshold is defined in original code so I can say why I don't use it -# for spk_n, peak_idx in enumerate(peaks): -# #---------find spike peak---------------------------- -# spk = {} -# -# spk["peak_idx"] = peak_idx -# upstroke_idx = np.argmax(dvdt[peak_idx-int(.001/dt):peak_idx]) + peak_idx-int(.001/dt) -# spk["upstroke"] = dvdt[upstroke_idx] -# spk["upstroke_idx"] = upstroke_idx -# spk["upstroke_v"] = v[upstroke_idx] -# -# # Define threshold where dvdt = 5% * max upstroke -# dvdt_thr_target = THRESH_PCT_MULTIBLIP * spk["upstroke"] -# #print 'spk[upstroke]', spk["upstroke"], 'dvdt_thr_target', dvdt_thr_target -# prev_idx = peak_idx-int(.0035/dt) -# #check to make sure prev_idx is not before or in a window where the stimulus blip comes on because -# #it will errorniously trip the threshold dvdt -# for index in up_blip_index: -# if prev_idx<=index+int(.0005/dt) and prev_idx>= index-int(.0035/dt): -# prev_idx=index+int(.0005/dt) -# -# mean_dvv= [np.mean(dvv[pv-2:pv+3]) for pv in range(prev_idx,upstroke_idx)] #makes sure dv2/dt2 isnt spuriously going down by averaging 5 points -# find_thresh_idxs = np.where(np.logical_and(dvdt[prev_idx:upstroke_idx] >= dvdt_thr_target, np.greater(mean_dvv,0)))[0] -# -# if len(find_thresh_idxs) < 1: # Can't find a good threshold value - probably a bad simulation case -# # Fall back to the upstroke value -# threshold_idx = upstroke_idx -# else: -# threshold_idx = find_thresh_idxs[0] + prev_idx -# -# spk["threshold_idx"] = threshold_idx -# spk["threshold_v"] = v[threshold_idx] -# -# # Check for things that are probably not spikes: -# -# # if the "spike" is less than 2 mV from threshold to peak, don't count it -# if v[peak_idx] - v[threshold_idx] < 0.002: -# print("\tnot counting spike is closer to peak than 2 mV") -# continue -# -# #NOTE: because threshold doesnt decay to zero in the multiblip this doesnt get rid of the situation that usually is only in the first spike of a stimulus -# # if the spike is less the -30mV, don't count it -# if v[peak_idx] < -0.04: -# print("\tnot counting spike: peak is too small") -# continue -# -# spikes.append(spk) -# -# #----figure out if I should still find a global threshold and then do it all again -# # # find global threshold which is an average of the individual thresholds -# # if len(spikes) > 0: -# # dvdt_thr_target = np.array([spk["upstroke"] for spk in spikes]).mean() * THRESH_PCT_MULTIBLIP -# # else: # if there weren't any spikes, move along -# # return np.array([]) -# -# out_spk_idxs.append(spk["threshold_idx"]) -# -# out_spk_idxs_list.append(np.array(out_spk_idxs)) -# -## time_vector=np.arange(len(v))*dt -## plt.figure() -## # plt.subplot(3,1,1) -## # plt.plot(time_vector, ddv) -## # plt.plot(time_vector[out_spk_idxs], ddv[out_spk_idxs], '.r', ms=16) -## # plt.xlim([40300, 42000]) -## # plt.ylabel('ddv') -## plt.subplot(2,1,1) -## plt.plot(time_vector, dvdt) -## plt.plot(time_vector[out_spk_idxs], dvdt[out_spk_idxs], '.r', ms=16) -## plt.plot(time_vector[potential_artifact_indexes], dvdt[potential_artifact_indexes], 'b|', ms=24, lw=4) -## plt.xlim([40300*dt, 42000*dt]) -## plt.ylabel('dvdt') -## plt.subplot(2,1,2) -## plt.plot(time_vector, v) -## plt.plot(time_vector[out_spk_idxs], v[out_spk_idxs], 'r.', ms=16, label='threshold') -## plt.xlim([40300*dt, 42000*dt]) -## plt.ylabel('voltage (V)') -## plt.plot(time_vector[peaks], v[peaks], '.g', ms=16, label='peaks') -## plt.plot(time_vector[[spikes[ii]['upstroke_idx'] for ii in range(len(spikes))]], [spikes[ii]['upstroke_v'] for ii in range(len(spikes))], '.c', ms=16, label = 'max upstroke') -## plt.plot(time_vector[potential_artifact_indexes], v[potential_artifact_indexes], 'b|', ms=24, lw=4) -## plt.legend() -## plt.show() -# -# return out_spk_idxs_list - -def get_peaks(voltage, aboveValue=0): - '''This function was written by Corinne Teeter and calculates the action potential peaks of a voltage equation" - inputs - voltage: numpy array of voltages - aboveValue: scalar voltage value over which voltage is considered a spike. - outputs: - peakInd: array of indicies of peaks''' - VshiftR=np.concatenate(([0], voltage[0:voltage.size-2])) - VshiftL=voltage[1:voltage.size] - IndShiftR=np.where(voltage[0:voltage.size-1]>VshiftR) - IndShiftL=np.where(voltage[0:voltage.size-1]>VshiftL) - greatThanThresh=np.where(voltage>aboveValue) #finds indicies greater than the value provided - peakInd=np.intersect1d(np.intersect1d(IndShiftL[0], IndShiftR[0]), greatThanThresh[0]) #find the indicies of the peak - return peakInd - -def exp_force_c(t_const, a1, k1): - (t, const) = t_const - return a1*(np.exp(k1*t))+const - -def exp_fit_c(t, a1, k1, const): - return a1*(np.exp(k1*t))+const - diff --git a/allensdk/internal/morphology/__init__.py b/allensdk/internal/morphology/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/morphology/compartment.py b/allensdk/internal/morphology/compartment.py deleted file mode 100644 index 2a88781a80..0000000000 --- a/allensdk/internal/morphology/compartment.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2016 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - -import allensdk.internal.morphology.node as node - -class Compartment(object): - def __init__(self, node1, node2): - if not isinstance(node1, node.Node) or not isinstance(node2, node.Node): - raise TypeError("Must supply Node objects to Compartment constructor") - self.length = node.euclidean_distance(node1, node2) - self.center = node.midpoint(node1, node2) - self.node1 = node1 - self.node2 = node2 - - def __str__(self): - s = "%s %f" % (str(self.center), self.length) - s += "\n\t" + self.node1.short_string() + "\n\t" + self.node2.short_string() - return s - diff --git a/allensdk/internal/morphology/morphology.py b/allensdk/internal/morphology/morphology.py deleted file mode 100644 index 84491ebdd4..0000000000 --- a/allensdk/internal/morphology/morphology.py +++ /dev/null @@ -1,1001 +0,0 @@ -# Copyright 2015-2016 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - -import copy -import math -import numpy as np -from allensdk.internal.morphology.node import Node -from allensdk.internal.morphology.compartment import Compartment - - -class Morphology( object ): - """ - Keep track of the list of nodes in a morphology and provide - a few helper methods (soma, tree information, pruning, etc). - """ - - SOMA = 1 - AXON = 2 - BASAL_DENDRITE = 3 - APICAL_DENDRITE = 4 - - NODE_TYPES = [ SOMA, AXON, BASAL_DENDRITE, APICAL_DENDRITE ] - - def __init__(self, node_list=None): - """ - Try to initialize from a list of nodes first, then from - a dictionary indexed by node id if that fails, and finally just - leave everything empty. - - Parameters - ---------- - node_list: list - list of Node objects - """ - self._node_list = [] # list of morphology node IDs - self._compartment_list = [] # list of morphology compartment IDs - - ############################################## - # define tree list here for clarity, even though it's reset below - # when nodes are assigned - self._tree_list = [] - - ############################################## - # dimensions of morphology, including min and max values on xyz - # this is cached value - # NOTE: if morphology is manually manipulated, this value can - # become incorrect - self.dims = None - - ############################################## - # construct the node list - # first try to do so using the node list, then try using - # the node index and if that fails then complain - if node_list: - self.node_list = node_list - ############################################## - # verify morphology is consistent with morphology rules (e.g., - # no dendrite branching from an axon) - num_errors = self._check_consistency() - if num_errors > 0: - raise ValueError("Morphology appears to be inconsistent") - ############################################## - # restructure morphology as necessary (eg, renumber nodes) - # and construct internal associations - self._reconstruct() - - - #################################################################### - #################################################################### - # class properties, and helper functions for them - - @property - def node_list(self): - """ Return the node list. This is a property to ensure that the - node list and node index are in sync. """ - return self._node_list - - @node_list.setter - def node_list(self, node_list): - """ Update the node list. """ - self._set_nodes(node_list) - - @property - def compartment_list(self): - return self._compartment_list - - @property - def num_trees(self): - """ Return the number of trees in the morphology. A tree is - defined as everything following from a single root node. """ - return len(self._tree_list) - - @property - def num_nodes(self): - """ - Return the number of nodes in the morphology. - """ - return len(self.node_list) - - # internal function - def _set_nodes(self, node_list): - """ - take a list of SWC node objects and turn those into morphology - nodes need to be able to initialize from a list supplied by an SWC - file while also being able to initialize from the node list - of an existing Morphology object. As nodes in a morphology object - contain reference to nodes in that object, make a shallow copy - of input nodes and overwrite known references (ie, the - 'children' array) - """ - self._node_list = [] - for obj in node_list: - seg = copy.copy(obj) - seg.tree_id = -1 - seg.children = [] - self._node_list.append(seg) - # list data now set. remove holes in sequence and re-index - self._reconstruct() - - # removed old 'soma' and 'root' calls as these were ambiguous - # a soma can consist of multiple compartments, and there can - # be multiple roots - # replaced those calls with new soma_root(), which returns the - # same thing as the old soma() when only a single soma node is - # present - def soma_root(self): - """ Returns root node of soma, if present""" - if len(self._tree_list) > 0 and self._tree_list[0][0].t == 1: - return self._tree_list[0][0] - return None - - #################################################################### - #################################################################### - # tree and node access - - def tree(self, n): - """ - Returns a list of all Morphology nodes within the specified - tree. A tree is defined as a fully connected graph of nodes. - Each tree has exactly one root. - - Parameters - ---------- - n: integer - ID of desired tree - - Returns - ------- - A list of all morphology objects in the specified tree, or None - if the tree doesn't exist - """ - if n < 0 or n >= len(self._tree_list): - return None - return self._tree_list[n] - - - def node(self, n): - """ - Returns the morphology node having the specified ID. - - Parameters - ---------- - n: integer - ID of desired node - - Returns - ------- - A morphology node having the specified ID, or None if such a - node doesn't exist - """ - # undocumented feature -- if a node is supplied instead of a - # node ID, the node is returned and no error is - # triggered - return self._resolve_node_type(n) - - - def compartment(self, n): - """ - Returns the morphology Compartment having the specified ID. - - Parameters - ---------- - n: integer - ID of desired compartment - - Returns - ------- - A morphology object having the specified ID, or None if such a - node doesn't exist - """ - if n < 0 or n >= len(self.compartment_list): - return None - return self._compartment_list[n] - - - def parent_of(self, seg): - """ Returns parent of the specified node. - - Parameters - ---------- - seg: integer or Morphology Object - The ID of the child node, or the child node itself - - Returns - ------- - A morphology object, or None if no parent exists or if the - specified node ID doesn't exist - """ - # if ID passed in, make sure it's converted to a node - # don't trap for exception here -- if supplied segment is - # incorrect, make sure the user knows about it - seg = self._resolve_node_type(seg) - # return parent of specified node - if seg is not None and seg.parent >= 0: - return self._node_list[seg.parent] - return None - - - def children_of(self, seg): - """ Returns a list of the children of the specified node - - Parameters - ---------- - seg: integer or Morphology Object - The ID of the parent node, or the parent node itself - - Returns - ------- - A list of the child morphology objects. If the ID of the parent - node is invalid, None is returned. - """ - seg = self._resolve_node_type(seg) - return [ self._node_list[c] for c in seg.children ] - - - def to_dict(self): - """ - Returns a dictionary of Node objects. These Nodes are a copy - of the Morphology. Modifying them will not modify anything in - the Morphology itself. - """ - return { c.n: c.to_dict() for c in self._node_list } - - - ################################################################### - ################################################################### - # Information querying and data manipulation - - # internal function. takes an integer and returns the node having - # that ID. IF a node is passed in instead, it is returned - def _resolve_node_type(self, seg): - # if node passed then we don't need to convert anything - # if node not passed, try converting value to int - # and using that as an index - if not isinstance(seg, Node): - try: - seg = int(seg) - if seg < 0 or seg >= len(self._node_list): - return None - seg = self._node_list[seg] - except ValueError: - raise TypeError("Object not recognized as morphology Node or index") - return seg - - - def change_parent(self, child, parent): - """ Change the parent of a node. The child node is adjusted to - point to the new parent, the child is taken off of the previous - parent's child list, and it is added to the new parent's child list. - - Parameters - ---------- - child: integer or Morphology Object - The ID of the child node, or the child node itself - - parent: integer or Morphology Object - The ID of the parent node, or the parent node itself - - Returns - ------- - Nothing - """ - child_seg = self._resolve_node_type(child) - parent_seg = self._resolve_node_type(parent) - # if child has former parent, remove it from parent's child list - if child_seg.parent >= 0: - old_par = self.node(child_seg.parent) - old_par.children.remove(child_seg.n) - parent_seg.children.append(child_seg.n) - child_seg.parent = parent_seg.n - - def get_dimensions(self): - """ Returns tuple of overall width, height and depth of - morphology. - WARNING: if locations of nodes in morphology are manipulated - then this value can become incorrect. It can be reset and - recalculated by programmitcally setting self.dims to None. - - Returns - ------- - 3 real arrays: [width, height, depth], [min_x, min_y, min_z], - [max_x, max_y, max_z] - """ - if self.dims is None: - min_x = self.node_list[0].x - max_x = self.node_list[0].x - min_y = self.node_list[0].y - max_y = self.node_list[0].y - min_z = self.node_list[0].z - max_z = self.node_list[0].z - for node in self.node_list: - max_x = max(node.x, max_x) - max_y = max(node.y, max_y) - max_z = max(node.z, max_z) - # - min_x = min(node.x, min_x) - min_y = min(node.y, min_y) - min_z = min(node.z, min_z) - self.dims = [(max_x-min_x), (max_y-min_y), (max_z-min_z)], [min_x, min_y, min_z], [max_x, max_y, max_z] - return self.dims - - # returns a list of node located within dist of x,y,z - def find(self, x, y, z, dist, node_type=None): - """ Returns a list of Morphology Objects located within 'dist' - of coordinate (x,y,z). If node_type is specified, the search - will be constrained to return only nodes of that type. - - Parameters - ---------- - x, y, z: float - The x,y,z coordinates from which to search around - - dist: float - The search radius - - node_type: enum (optional) - One of the following constants: SOMA, AXON, - BASAL_DENDRITE or APICAL_DENDRITE - - Returns - ------- - A list of all Morphology Objects matching the search criteria - """ - found = [] - for seg in self.node_list: - dx = seg.x - x - dy = seg.y - y - dz = seg.z - z - if math.sqrt(dx*dx + dy*dy + dz*dz) <= dist: - if node_type is None or seg.t == node_type: - found.append(seg) - return found - - - def node_list_by_type(self, node_type): - """ Return an list of all nodes having the specified - node type. - - Parameters - ---------- - node_type: int - Desired node type - - Returns - ------- - A list of of Morphology Objects - """ - return [x for x in self._node_list if x.t == node_type] - - - def save(self, file_name): - """ Write this morphology out to an SWC file - - Parameters - ---------- - file_name: string - desired name of your SWC file - """ - f = open(file_name, "w") - f.write("#n,type,x,y,z,radius,parent\n") - for seg in self.node_list: - f.write("%d %d " % (seg.n, seg.t)) - f.write("%0.4f " % seg.x) - f.write("%0.4f " % seg.y) - f.write("%0.4f " % seg.z) - f.write("%0.4f " % seg.radius) - f.write("%d\n" % seg.parent) - f.close() - - - # keep for backward compatibility, but don't publish in docs - def write(self, file_name): - self.save(file_name) - - - def sparsify(self, modulo): - """ Return a new Morphology object that has a given number of non-leaf, - non-root nodes removed. - - Parameters - ---------- - modulo: int - keep 1 out of every modulo nodes. - - Returns - ------- - Morphology - A new morphology instance - """ - # create and return a new morphology instance. make a copy of - # this morphology's node list and manipulate that - nodes = copy.deepcopy(self.node_list) - # figure out which nodes to toss - keep = {} - ctr = 0 # mod counter -- keep every modulo element (starting w/ 1st) - for seg in nodes: - nid = seg.n - if (seg.parent < 0 or - len(seg.children) != 1 or - nodes[seg.parent].t == Morphology.SOMA or - seg.t == Morphology.SOMA): - keep[nid] = True - else: - if ctr % modulo == 0: - keep[nid] = True - else: - keep[nid] = False - ctr += 1 - # hook children up to their new parents - for seg in nodes: - if keep[seg.n] is False: - parent_id = seg.parent - while keep[parent_id] is False: - parent_id = nodes[parent_id].parent - for child_id in seg.children: - nodes[child_id].parent = parent_id - # filter out orphans - sparse = [] - for seg in nodes: - if keep[seg.n] is True: - sparse.append(seg) - return Morphology(sparse) - - - #################################################################### - #################################################################### - - def _reconstruct(self): - """ - Internal function. - Restructures data and establishes appropriate internal linking. - Data is re-order, removing 'holes' in the ID sequence so that - each object ID corresponds to its position in node list. - Dictionaries mapping IDs to objects are no longer necessary. - Trees are (re)calculated - Parent-child indices are recalculated - A new compartment list is created - """ - remap = {} - # everything defaults to root. this way if a parent was deleted - # the child will become a new root - for i in range(len(self.node_list)): - remap[i] = -1 - # map old old node numbers to new ones. reset n to the new ID - # and put node in new list - new_id = 0 - tmp_list = [] - for node in self.node_list: - if node is not None: - remap[node.n] = new_id - node.n = new_id - tmp_list.append(node) - new_id += 1 - # use map to reset parent values. copy objs to new list - for node in tmp_list: - if node.parent >= 0: - node.parent = remap[node.parent] - # replace node list with newly created node list - self._node_list = tmp_list - # reconstruct parent/child relationship links - ############################ - # node list is complete and sequential so don't need index - # to resolve relationships - # for each node, reset children array - # for each node, add self to parent's child list - for node in self._node_list: - node.children = [] - node.compartment = -1 - for node in self._node_list: - if node.parent >= 0: - self._node_list[node.parent].children.append(node.n) - # update tree lists - self._separate_trees() - # verify that each node ID is the same as its position in the - # node list - for i in range(len(self.node_list)): - if i != self.node(i).n: - raise RuntimeError("Internal error detected -- node list not properly formed") - # construct compartment list - # (a compartment spans the distance between two nodes) - self._compartment_list = [] - for node in self.node_list: - node.compartment_id = -1 - for node in self.node_list: - for child_id in node.children: - endpoint = self.node(child_id) - compartment = Compartment(node, endpoint) - endpoint.compartment_id = len(self._compartment_list) - self._compartment_list.append(compartment) - - - def append(self, nodes): - """ Add additional nodes to this Morphology. Those nodes must - originate from another morphology object. - - Parameters - ---------- - nodes: list of Morphology nodes - """ - # construct a map between new and old IDs of added nodes - remap = {} - for i in range(len(nodes)): - remap[i] = -1 - # map old old node numbers to new ones. reset n to the new ID - # append new nodes to existing node list - old_count = len(self.node_list) - new_id = old_count - for node in nodes: - if node is not None: - remap[node.n] = new_id - node.n = new_id - self._node_list.append(node) - new_id += 1 - # use map to reset parent values. copy objs to new list - for i in range(old_count, len(self.node_list)): - node = self.node_list[i] - if node.parent >= 0: - node.parent = remap[node.parent] - self._reconstruct() - - - def convert_type(self, from_type, to_type): - """ Convert all nodes in morphology from one type to another - - Parameters - ---------- - from_type: enum - The node type that will be eliminated and replaced. - Use one of the following constants: SOMA, AXON, - BASAL_DENDRITE, or APICAL_DENDRITE - - to_type: enum - The new type that will replace it. - Use one of the following constants: SOMA, AXON, - BASAL_DENDRITE, or APICAL_DENDRITE - """ - for node in self.node_list: - if node.t == from_type: - node.t = to_type - - - def stumpify_axon(self, count=10): - """ Remove all axon nodes except the first 'count' - nodes, as counted from the connected axon root. - - Parameters - ---------- - count: Integer - The length of the axon 'stump', in number of nodes - """ - # find connected axon root - axon_root = None - for seg in self.node_list: - if seg.t == Morphology.AXON: - par_id = seg.parent - if par_id >= 0: - par = self.node_list[par_id] - if par.t != Morphology.AXON: - axon_root = seg - break - if axon_root is None: - return - # flag the first 'count' nodes from the axon root - ax = axon_root - for node in self.node_list: - node.flag = None - for i in range(count): - # ignore bifurcations -- go 'count' deep on one line only - ax.flag = i - #ax["flag"] = i - children = ax.children - if len(children) > 0: - ax = self.node(children[0]) - # strip out all axons that aren't flagged - for i in range(len(self.node_list)): - seg = self.node_list[i] - if seg.t == Morphology.AXON: - #if "flag" not in seg: - if seg.flag is None: - self.node_list[i] = None - self._reconstruct() - - - def _strip(self, flagged_for_removal): - """ Internal function with code common between - strip_all_other_types() and strip_type() - """ - # if parent will be stripped and node will remain, convert - # parent to this type so it becomes root (otherwise root - # will move) - root = self.soma_root() - for node_id in self._node_list: - node = self.node(node_id) - if node.parent >= 0: - parent = self.node(node.parent) - parent_flag = flagged_for_removal[parent.n] - node_flag = flagged_for_removal[node.n] - if parent_flag and not node_flag: - # don't do this for soma root - if parent.n != root.n: - parent.t = node.t - flagged_for_removal[parent.n] = False - # removed flagged items - for i in range(len(self.node_list)): - seg = self.node_list[i] - if flagged_for_removal[seg.n]: - # eliminate node - self.node_list[i] = None - elif seg.parent >= 0 and flagged_for_removal[seg.parent]: - # parent was eliminated. make this a new root - seg.parent = -1 - self._reconstruct() - - - # strip out everything but the soma and the specified SWC type - def strip_all_other_types(self, node_type, keep_soma=True): - """ Strips everything from the morphology except for the - specified type. - Parent and child relationships are updated accordingly, creating - new roots when necessary. - - Parameters - ---------- - node_type: enum - The node type to keep in the morphology. - Use one of the following constants: SOMA, AXON, - BASAL_DENDRITE, or APICAL_DENDRITE - - keep_soma: Boolean (optional) - True (default) if soma nodes should remain in the - morpyhology, and False if the soma should also be stripped - """ - flagged_for_removal = {} - # scan nodes and see which ones should be removed. keep a record - # of them - for seg in self.node_list: - if seg.t == node_type: - remove = False - elif seg.t == 1 and keep_soma: - remove = False - else: - remove = True - if remove: - flagged_for_removal[seg.n] = True - else: - flagged_for_removal[seg.n] = False - self._strip(flagged_for_removal) - - - # strip out the specified SWC type - def strip_type(self, node_type): - """ Strips all nodes of the specified type from the - morphology. - Parent and child relationships are updated accordingly, creating - new roots when necessary. - - Parameters - ---------- - node_type: enum - The node type to strip from the morphology. - Use one of the following constants: SOMA, AXON, - BASAL_DENDRITE, or APICAL_DENDRITE - """ - flagged_for_removal = {} - for seg in self.node_list: - if seg.t == node_type: - remove = True - else: - remove = False - if remove: - flagged_for_removal[seg.n] = True - else: - flagged_for_removal[seg.n] = False - self._strip(flagged_for_removal) - - - def clone(self): - """ Create a clone (deep copy) of this morphology - """ - return copy.deepcopy(self) - - - def apply_affine_only_rotation(self, aff): - """ Apply an affine transform to all nodes in this - morphology. Only the rotation element of the transform is - performed (i.e., although the entire transformation and - translation matrix is supplied, only the rotation element - is used). The morphology is translated to the point where - the soma root is at 0,0,0. - - Format of the affine matrix is: - - [x0 y0 z0] [tx] - [x1 y1 z1] [ty] - [x2 y2 z2] [tz] - - where the left 3x3 the matrix defines the affine rotation - and scaling, and the right column is the translation - vector. - - The matrix must be collapsed and stored in a list as follows: - - [x0 y0, z0, x1, y1, z1, x2, y2, z2, tx, ty, tz] - - Parameters - ---------- - aff: 3x4 array of floats (python 2D list, or numpy 2D array) - the transformation matrix - """ - affine = np.copy(aff) - # remove scale on each axis - scale_x = abs(affine[0] + affine[3] + affine[6]) - if scale_x != 0.0: - affine[0] /= scale_x - affine[3] /= scale_x - affine[6] /= scale_x - scale_y = abs(affine[1] + affine[4] + affine[7]) - if scale_y != 0.0: - affine[1] /= scale_y - affine[4] /= scale_y - affine[7] /= scale_y - scale_z = abs(affine[2] + affine[5] + affine[8]) - if scale_z != 0.0: - affine[2] /= scale_z - affine[5] /= scale_z - affine[8] /= scale_z - # apply rotation - for seg in self.node_list: - x = seg.x*affine[0] + seg.y*affine[1] + seg.z*affine[2] - y = seg.x*affine[3] + seg.y*affine[4] + seg.z*affine[5] - z = seg.x*affine[6] + seg.y*affine[7] + seg.z*affine[8] - seg.x = x - seg.y = y - seg.z = z -# # relocate back to zero -# soma = self.soma_root() -# if soma is not None: -# for seg in self.node_list: -# seg.x -= soma.x -# seg.y -= soma.y -# seg.z -= soma.z - - - def apply_affine(self, aff, scale=None): - """ Apply an affine transform to all nodes in this - morphology. Compartment radius is adjusted as well. - - Format of the affine matrix is: - - [x0 y0 z0] [tx] - [x1 y1 z1] [ty] - [x2 y2 z2] [tz] - - where the left 3x3 the matrix defines the affine rotation - and scaling, and the right column is the translation - vector. - - The matrix must be collapsed and stored in a list as follows: - - [x0 y0, z0, x1, y1, z1, x2, y2, z2, tx, ty, tz] - - Parameters - ---------- - aff: 3x4 array of floats (python 2D list, or numpy 2D array) - the transformation matrix - """ - # In addition to transforming the locations of the morphology - # nodes, the radius of each node must be adjusted. - # There are 2 ways to measure scale from a transform. Assuming - # an isotropic transform, the scale is the cube root of the - # matrix determinant. The other ways is to measure scale - # independently along each axis. - # For now, the node radius is only updated based on the average - # scale along all 3 axes (eg, isotropic assumption), so calculate - # scale using the determinant - # - if scale is None: - # calculate the determinant - determinant = np.linalg.det(np.reshape(aff[0:9], (3, 3))) - # determinant is change of volume that occurred during transform - # assume equal scaling along all axes. take 3rd root to get - # scale factor - det_scale = np.power(abs(determinant), 1.0 / 3.0) - ## measure scale along each axis - ## keep this code here in case - #scale_x = abs(aff[0] + aff[3] + aff[6]) - #scale_y = abs(aff[1] + aff[4] + aff[7]) - #scale_z = abs(aff[2] + aff[5] + aff[8]) - #avg_scale = (scale_x + scale_y + scale_z) / 3.0; - # - # use determinant for scaling for now as it's most simple - scale = det_scale - for seg in self.node_list: - x = seg.x*aff[0] + seg.y*aff[1] + seg.z*aff[2] + aff[9] - y = seg.x*aff[3] + seg.y*aff[4] + seg.z*aff[5] + aff[10] - z = seg.x*aff[6] + seg.y*aff[7] + seg.z*aff[8] + aff[11] - seg.x = x - seg.y = y - seg.z = z - seg.radius *= scale - - - def _separate_trees(self): - """ - Construct list of independent trees (each tree has a root of -1). - The soma root, if it exists, is in tree 0. - """ - trees = [] - # reset each node's tree ID to indicate that it's not assigned - for seg in self.node_list: - seg.tree_id = -1 - # construct trees for each node - # if a node is adjacent an existing tree, merge to it - # if a node is adjacent multiple trees, merge all - for seg in self.node_list: - # see what trees this node is adjacent to - local_trees = [] - if seg.parent >= 0 and self.node_list[seg.parent].tree_id >= 0: - local_trees.append(self.node_list[seg.parent].tree_id) - for child_id in seg.children: - child = self.node_list[child_id] - if child.tree_id >= 0: - local_trees.append(child.tree_id) - # figure out which tree to put node into - # if there are muliple possibilities, merge all of them - if len(local_trees) == 0: - tree_num = len(trees) # create new tree - elif len(local_trees) == 1: - tree_num = local_trees[0] # use existing tree - elif len(local_trees) > 1: - # this node is an intersection of multiple trees - # merge all trees into the first one found - tree_num = local_trees[0] - for j in range(1,len(local_trees)): - dead_tree = local_trees[j] - trees[dead_tree] = [] - for node in self.node_list: - if node.tree_id == dead_tree: - node.tree_id = tree_num - # merge node into tree - # ensure there's space - while len(trees) <= tree_num: - trees.append([]) - trees[tree_num].append(seg) - seg.tree_id = tree_num - # consolidate tree lists into class's tree list object - self._tree_list = [] - for tree in trees: - if len(tree) > 0: - self._tree_list.append(tree) - # make soma's tree be the first tree, if soma present - # this should be the case if the file is properly ordered, but - # don't assume that - soma_tree = -1 - for seg in self.node_list: - if seg.t == 1: - soma_tree = seg.tree_id - break - if soma_tree > 0: - # swap soma tree for first tree in list - tmp = self._tree_list[soma_tree] - self._tree_list[soma_tree] = self._tree_list[0] - self._tree_list[0] = tmp - # reset node tree_id to correct tree number - self._reset_tree_ids() - - - def _reset_tree_ids(self): - """ - reset each node's tree_id value to the correct tree number - """ - for i in range(len(self._tree_list)): - for j in range(len(self._tree_list[i])): - self._tree_list[i][j].tree_id = i - - - def _check_consistency(self): - """ - internal function -- don't publish in the docs - TODO? print warning if unrecognized types are present - Return value: number of errors detected in file - """ - errs = 0 - # Make sure that the parents are of proper ID range - n = self.num_nodes - for seg in self.node_list: - if seg.parent >= 0: - if seg.parent >= n: - print("Parent for node %d is invalid (%d)" % (seg.n, seg.parent)) - errs += 1 - # make sure that each tree has exactly one root - for i in range(self.num_trees): - tree = self.tree(i) - root = -1 - for j in range(len(tree)): - if tree[j].parent == -1: - if root >= 0: - print("Too many roots in tree %d" % i) - errs += 1 - root = j - if root == -1: - print("No root present in tree %d" % i) - errs += 1 - # make sure each axon has at most one root - # find type boundaries. at each axon boundary, walk back up - # tree to root and make sure another axon segment not - # encountered - adoptees = self._find_type_boundary() - for child in adoptees: - if child.t == Morphology.AXON: - par_id = child.parent - while par_id >= 0: - par = self.node_list[par_id] - if par.t == Morphology.AXON: - print("Branch has multiple axon roots") - print(child) - print(par) - errs += 1 - break - par_id = par.parent - if errs > 0: - print("Failed consistency check: %d errors encountered" % errs) - return errs - - - def _find_type_boundary(self): - """ - return a list of segments who have parents that are a different type - """ - adoptees = [] - for node in self.node_list: - par = self.parent_of(node) - if par is None: - continue - if node.t != par.t: - adoptees.append(node) - return adoptees - - - # remove tree from swc's "forest" - def delete_tree(self, n): - """ Delete tree, and all of its nodes, from the morphology. - - Parameters - ---------- - n: Integer - The tree number to delete - """ - if n < 0: - return - if n >= self.num_trees: - print("Error -- attempted to delete non-existing tree (%d)" % n) - raise ValueError - tree = self.tree(n) - for i in range(len(tree)): - self.node_list[tree[i].n] = None - del self._tree_list[n] - self._reconstruct() - # reset node tree_id to correct tree number - self._reset_tree_ids() - - - def _print_all_nodes(self): - """ - debugging function. prints all nodes - """ - for node in self.node_list: - print(node.short_string()) - diff --git a/allensdk/internal/morphology/morphvis.py b/allensdk/internal/morphology/morphvis.py deleted file mode 100644 index 2df3c30267..0000000000 --- a/allensdk/internal/morphology/morphvis.py +++ /dev/null @@ -1,385 +0,0 @@ -from PIL import Image, ImageDraw -import numpy as np - -class MorphologyColors(object): - def __init__(self): - self.soma = (0, 0, 0) - self.axon = (70, 130, 180) - self.basal = (178, 34, 34) - self.apical = (255, 127, 80) - - def set_soma_color(self, r, g, b): - self.soma = (r, g, b) - - def set_axon_color(self, r, g, b): - self.axon = (r, g, b) - - def set_basal_color(self, r, g, b): - self.basal = (r, g, b) - - def set_apical_color(self, r, g, b): - self.apical = (r, g, b) - - -# create empty image -def create_image(w, h, color=None, alpha=False): - if alpha: - mode = 'RGBA' - else: - mode = 'RGB' - if color is not None: - return Image.new(mode, (w,h), color) - else: - return Image.new(mode, (w,h)) - - -def calculate_scale(morph, pix_width, pix_height): - """ Calculates scaling factor and x,y insets required to auto-scale - and center morphology into box with specified numbers of pixels - - Parameters - ---------- - - morph: AISDK Morphology object - - pix_width: int - Number of image pixels on X axis - - pix_height: int - Number of image pixels on Y axis - - Returns - ------- - real, real, real - First return value is the scaling factor. Second is the - number of pixels needed to adjust x-coordinates so that the - morphology is horizontally centered. Third is the number of - pixels needed to adjust the y-coordinates so that the morphology - is vertically centered. - """ - dims, low, high = morph.get_dimensions() - # get boundaries of morphology - xlow = low[0] - xhigh = high[0] - ylow = low[1] - yhigh = high[1] - # determine scale on X and Y to make morphology fit in image area - hscale = pix_width / (xhigh - xlow) - vscale = pix_height / (yhigh - ylow) - # select lowest scaling factor so morphology is stretched to - # maximum width/height along axis that is tightest fit - # and adjust inset on other axis so morphology is centered - scale_factor = min(hscale, vscale) - if hscale < vscale: - # image constrained on horizontal axis - scale_factor = hscale - # center image vertically - v_center = (ylow + yhigh) / 2.0 - scale_inset_x = -low[0] * scale_factor - # invert y coordinates for conversion to pixel space - scale_inset_y = pix_height/2 + scale_factor*v_center - else: - # image constrained on vertical axis - scale_factor = vscale - # center image horizontally - h_center = (xlow + xhigh) / 2.0 - scale_inset_x = pix_width/2 - scale_factor*h_center - scale_inset_y = -low[1] * scale_factor - return scale_factor, scale_inset_x, scale_inset_y - - -# draw morphology on image -- takes image and morphology, modifies image -# options: scale to fit | linear scaling -def draw_morphology(img, morph, - inset_left=0, inset_right=0, inset_top=0, inset_bottom=0, - scale_to_fit=False, scale_factor=1.0, colors=None): - """ Draws morphology onto image - When no scaling is applied, and no insets are provided, the - coordinates of the morphology are used directly -- i.e., 100 in - morphology coordinates is equal to 100 pixels. - - The scale factor is multiplied to morphology coordinates before - being drawn. If scale_factor=2 then 50 in morphology coordinates - is 100 pixels. Left and top insets shift the coordinate axes - for drawing. E.g., if left=10 and top=5 then 0,0 in morphology - coordinates is 10,5 in pixel space. Bottom and right insets are - ignored. - - If scale_to_fit is set then scale factor is ignored. The - morphology is scaled to be the maximum size that fits in - the image, taking into account insets. In a 100x100 image, if - all insets=10, then the image is scaled to fit into the center - 80x80 pixel area, and nothing is drawn in the inset border areas. - - Axons are drawn before soma and dendrite compartments. - - - Parameters - ---------- - - img: PIL image object - - morph: AISDK Morphology object - - inset_*: real - This is the number of pixels to use as border on top/bottom/ - right/left. If scale_to_fit is false then only the top/left - values are used, as the scale_factor will determine how - large the morphology is (it can be drawn beyond insets and even - beyond image boundaries) - - scale_to_fit: boolean - If true then morphology is scaled to the inset area of the - image and scale_factor is ignored. Morphology is centered - in the image in the sense that the top/bottom and left/right - edges of the morphology are equidistant from image borders. - - scale_factor: real - A scalar amount that is multiplied to morphology coordinates - before drawing - - colors: MorphologyColors object - This is the color scheme used to draw the morphology. If - colors=None then default coloring is used - - Returns - ------- - - 2-dimensional array, the pixel coordinates of the soma root [x,y] - """ - # determine drawing area, scaling factor, offset to origin - # if scaling to fit, find value that scales morphology so height - # or width matches image area. adjust scale_factor and insets - # as necessary so morphology can be drawn normally - dims, low, high = morph.get_dimensions() - if scale_to_fit: - # get image area based on requested insets - width, height = img.size - pix_width = (width - inset_right) - inset_left - pix_height = (height - inset_bottom) - inset_top - # get scale and x,y insets from auto-scaling - scale_factor, scale_inset_x, scale_inset_y = calculate_scale(morph, pix_width, pix_height) - else: - # no implicit inset necessary due to scaling - scale_inset_x = 0 - scale_inset_y = 0 - - # order compartments by depth to approximate 3D rendering - sorted(morph.compartment_list, key=lambda x: x.node1.y) - - # if color not specified, select default - if colors is None: - colors = MorphologyColors() - - canvas = ImageDraw.Draw(img) - - for i in range(3): - for comp in morph.compartment_list: - if comp.node2.t == 1: - if i != 2: # soma drawn last - # NOTE: there are unlikely to be soma compartments - # additional soma-drawing code is below - continue - color = colors.soma - elif comp.node2.t == 2: - if i != 0: # axon drawn first - continue - color = colors.axon - elif comp.node2.t == 3: - if i != 1: # dendrite drawn second - continue - color = colors.basal - elif comp.node2.t == 4: - if i != 1: # dendrite drawn second - continue - color = colors.apical - x0 = scale_inset_x + inset_left + scale_factor * comp.node1.x - x1 = scale_inset_x + inset_left + scale_factor * comp.node2.x - # y coordinate inverted because morphology values are - # increasing going 'up while pixel values increase - # going down - y0 = scale_inset_y + inset_top - scale_factor * comp.node1.y - y1 = scale_inset_y + inset_top - scale_factor * comp.node2.y - canvas.line((x0, y0, x1, y1), color) - - # a compartment type is defined by the type of the 2nd node defining - # the compartment. if there is a single soma node, there can be - # no soma compartments. draw the root soma node - root = morph.soma_root() - x = scale_inset_x + inset_left + scale_factor * root.x - y = scale_inset_y + inset_top - scale_factor * root.y - rad = scale_factor * root.radius - x0 = int(x - rad) - y0 = int(y - rad) - x1 = int(x0 + 2*rad) - y1 = int(y0 + 2*rad) - canvas.ellipse((x0,y0,x1,y1), fill=colors.soma, outline=colors.soma) - - # return soma root coordinate, in unit of pixels - return [x, y] - - -def draw_density_hist(img, morph, vert_scale, - inset_left=0, inset_right=0, inset_top=0, inset_bottom=0, - num_bins=None, colors=None): - """ Draws density histogram onto image - When no scaling is applied, and no insets are provided, the - coordinates of the morphology are used directly -- i.e., 100 in - morphology coordinates is equal to 100 pixels. - - The scale factor is multiplied to morphology coordinates before - being drawn. If scale_factor=2 then 50 in morphology coordinates - is 100 pixels. Left and top insets shift the coordinate axes - for drawing. E.g., if left=10 and top=5 then 0,0 in morphology - coordinates is 10,5 in pixel space. Bottom and right insets are - ignored. - - If scale_to_fit is set then scale factor is ignored. The - morphology is scaled to be the maximum size that fits in - the image, taking into account insets. In a 100x100 image, if - all insets=10, then the image is scaled to fit into the center - 80x80 pixel area, and nothing is drawn in the inset border areas. - - Axons are drawn before soma and dendrite compartments. - - - Parameters - ---------- - - img: PIL image object - - morph: AISDK Morphology object - - vert_scale: real - This is the amout required to multiply to a moprhology - y-coordinate to convert it to relative cortical depth (on [0,1]). - This is the inverse of the cortical thickness. - - inset_*: real - This is the number of pixels to use as border on top/bottom/ - right/left. If scale_to_fit is false then only the top/left - values are used, as the scale_factor will determine how - large the morphology is (it can be drawn beyond insets and even - beyond image boundaries) - - num_bins: int - The number of bins in the histogram - - colors: MorphologyColors object - This is the color scheme used to draw the morphology. If - colors=None then default coloring is used - - Returns - ------- - - Histogram arrays: [hist, hist2, hist3, hist4] - where hist is the histgram of all neurites, and hist[234] are - the histograms of SWC types 2,3,4 - """ - # if number of bins not specified, default to vertical size of - # drawing area in image - img_width, img_height = img.size - draw_width = img_width - (inset_left + inset_right) - draw_height = img_height - (inset_top + inset_bottom) - if num_bins is None: - num_bins = draw_height - # histograms for each analyzed SWC type - hist_2 = np.zeros(num_bins) - hist_3 = np.zeros(num_bins) - hist_4 = np.zeros(num_bins) - # total response in a bin - hist = np.zeros(num_bins) - - print("Vert scale", vert_scale) - - # if color not specified, select default - if colors is None: - colors = MorphologyColors() - - canvas = ImageDraw.Draw(img) - - # for each compartment, split its length (weight) between bins for - # start and end nodes - for seg in morph.compartment_list: - wt = seg.length / 2.0 - # node 1 - bin1 = int(-vert_scale * seg.node1.y * num_bins) - if bin1 == num_bins: - bin1 = num_bins-1 - # only include parts of the histogram that are in the viewable - # range (ie, exclude parts that extend to pia and/or wm) - if bin1 >= 0 and bin1 < num_bins: - if seg.node1.t == 2: - hist_2[bin1] += wt - elif seg.node1.t == 3: - hist_3[bin1] += wt - elif seg.node1.t == 4: - hist_4[bin1] += wt - hist[bin1] += wt - # node 2 - bin2 = int(-vert_scale * seg.node1.y * num_bins) - if bin2 == num_bins: - bin2 = num_bins-1 - if bin2 >= 0 and bin2 < num_bins: - if seg.node2.t == 2: - hist_2[bin2] += wt - elif seg.node2.t == 3: - hist_3[bin2] += wt - elif seg.node2.t == 4: - hist_4[bin2] += wt - hist[bin2] += wt - - # draw axis line - col = (128, 128, 128, 256) - x0 = inset_left - x1 = x0 - y0 = inset_top - y1 = img_height-inset_bottom - canvas.line((x0, y0, x1, y1), col) - - hist_step = 1.0 * draw_height / num_bins; - hist_scale = (draw_width-1) / hist.max() - for seg in morph.compartment_list: - ypos = 1.0 * inset_top - for i in range(num_bins): - y0 = int(ypos) - y1 = int(ypos + hist_step) - x0 = int(1 + inset_left) - x1 = int(1 + inset_left + hist_2[i] * hist_scale + 0.99) - if x0 != x1: - ytmp = ypos - while ytmp < y1: - canvas.line((x0, int(ytmp), x1, int(ytmp)), colors.axon) - ytmp += hist_step - x0 = x1 - x1 += int(hist_3[i] * hist_scale + 0.99) - if x0 != x1: - ytmp = ypos - while ytmp < y1: - canvas.line((x0, int(ytmp), x1, int(ytmp)), colors.basal) - ytmp += hist_step - x0 = x1 - x1 += int(hist_4[i] * hist_scale + 0.99) - if x0 < x1: - ytmp = ypos - while ytmp < y1: - canvas.line((x0, int(ytmp), x1, int(ytmp)), colors.apical) - ytmp += hist_step - ypos += hist_step - - return hist, hist_2, hist_3, hist_4 - -# TODO -# draw path on image -- takes image and path, modifies image -#def draw_path(img, path, color): - # path is in units of pixels - # foreach vertex, draw line in specified color - -# refine section boundaries -- takes labeled regions and generates labeled mask -# -> need constraints on input. lookup of points is easy. categorizing -# what pixel is part of what ask is not without expanding masks laterally - -# label morphology -- takes morpholgoy and labeled mask and adds lables -# to each compartment - - diff --git a/allensdk/internal/morphology/node.py b/allensdk/internal/morphology/node.py deleted file mode 100644 index b85f21c153..0000000000 --- a/allensdk/internal/morphology/node.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright 2016 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - -import json -import math - -def euclidean_distance(node1, node2): - dx = node1.x - node2.x - dy = node1.y - node2.y - dz = node1.z - node2.z - return math.sqrt(dx*dx + dy*dy + dz*dz) - - -def midpoint(node1, node2): - px = (node1.x + node2.x) * 0.5 - py = (node1.y + node2.y) * 0.5 - pz = (node1.z + node2.z) * 0.5 - return [px, py, pz] - - -class Node(object): - """ - Represents node in SWC morphology file - """ - - def __init__(self, n, t, x, y, z, r, pn, **kwargs): - """ - Parameters - ---------- - n: integer - node ID - - t: integer - node type (SOMA, AXON, BASAL_DENDRITE or APICAL_DENDRITE) - - x: float - x position of node - - y: float - y position of node - - z: float - z position of node - - r: float - radius of node - - pn: integer - ID of parent node (-1 if no parent) - """ - # these values correspond to columns in an SWC file - self.n = n - self.t = t - self.x = x - self.y = y - self.z = z - self.radius = r - self.parent = pn - # - self.children = [] # IDs of child nodes - self.tree_id = -1 # which unconnected graph this node belongs to - # number of compartment that has this node as its endpoint - # all nodes except root nodes have a compartment - self.compartment_id = -1 - - def to_dict(self): - """ Convert the node into a serializable dictionary """ - return { - "id": self.n, - "type": self.t, - "x": self.x, - "y": self.y, - "z": self.z, - "radius": self.radius, - "parent": self.parent, - "children": self.children, - "tree_id": self.tree_id, - "compartment_id": self.compartment_id - } - - @classmethod - def from_dict(cls, d): - return cls( - n = d["id"], - t = d["type"], - x = d["x"], - y = d["y"], - z = d["z"], - r = d["radius"], - pn = d["parent"], - ) - - def __getitem__(self, item): - return self.to_dict()[item] - - def __str__(self): - return self.short_string() - return json.dumps(self.to_dict()) - - def short_string(self): - """ create string with node information in succinct, - single-line form """ - return "%d %d %.4f %.4f %.4f %.4f %d %s %d" % (self.n, self.t, self.x, self.y, self.z, self.radius, self.parent, - str(self.children), self.tree_id); - -# Morphology nodes have the following fields. These allow dictionary access -# to node fields (this is for backward compatibility) -NODE_ID = 'id' -NODE_TYPE = 'type' -NODE_X = 'x' -NODE_Y = 'y' -NODE_Z = 'z' -NODE_R = 'radius' -NODE_PN = 'parent' -NODE_TREE_ID = 'tree_id' -NODE_CHILDREN = 'children' - diff --git a/allensdk/internal/morphology/validate_swc.py b/allensdk/internal/morphology/validate_swc.py deleted file mode 100755 index de0999ab09..0000000000 --- a/allensdk/internal/morphology/validate_swc.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/python -import os, sys -from six.moves import xrange -import allensdk.internal.core.swc as swc - - -def resave_swc(orig_swc, new_file): - """ Reads SWC file into AllenSDK Morphology object and resaves - it. This can fix some problems in an SWC file that may disrupt - other software tools reading the file (e.g., NEURON) - - Parameters - ---------- - orig_swc: string - Name of SWC file to read - - new_file: string - Name of output SWC file - """ - try: - morphology = swc.read_swc(orig_swc) - except: - print("Failed to read SWC file '%s'" % orig_swc) - raise - try: - morphology.save(new_file) - except: - print("Failed to save SWC file '%s'" % new_file) - - -class TestNode(object): - def __init__(self, n, t, x, y, z, r, pn): - # these values correspond to columns in an SWC file - self.n = n - self.t = t - self.x = x - self.y = y - self.z = z - self.r = r - self.pn = pn - self.children = [] # IDs of child nodes - - def __str__(self): - """ create string with node information in succinct, - single-line form """ - return "%d %d %.4f %.4f %.4f %.4f %d %s" % (self.n, self.t, self.x, self.y, self.z, self.r, self.pn, str(self.children)) - - - -def validate_swc(swc_file): - """ - Tests SWC files for compatibility with AllenSDK - - To be compatible with NEURON, SWC files must have the following properties: - 1) a single root node with parent ID '-1' - 2) sequentially increasing ID numbers - 3) immediate children of the soma cannot branch - - To be compatible with feature analysis, SWC files can only have node - types in the range 1-4: - 1 = soma - 2 = axon - 3 = [basal] dendrite - 4 = apical dendrite - """ - success = True # be optimistic - - # see if SWC file is readable by internal tools - print("Validating " + swc_file) - try: - morphology = swc.read_swc(swc_file) - except: - print("Fatal error reading SWC file") - return False - - for node in morphology.node_list: - if node.t < 1 or node.t > 4: - print("Expecting type between 1 and 4, but found %d" % node.t) - print("File has unrecognized node type(s)") - print("----------------------------------") - success = False - break - - # make sure all dendrite nodes are in tree 0 - # this is because modeling requires a full dendrite morphology - for node in morphology.node_list: - if (node.t == 3 or node.t == 4) and node.tree_id != 0: - print("Dendrite node(s) exist in disconnected trees") - print("This breaks an SDK modeling requirement") - print("----------------------------------") - success = False - break - - # if we've made it here, file is OK for using Morphology class, and - # should be valid with internal processing. It may also be able - # to be convertable for NEURON use by resaving it - - nodes = [] - node_table = [] # lookup table by node num - line_num = 1 - try: - with open(swc_file, "r") as f: - for line in f: - # remove comments - if line.lstrip().startswith('#'): - continue - # read values. expected SWC format is: - # ID, type, x, y, z, rad, parent - # x, y, z and rad are floats. the others are ints - toks = line.split() - vals = TestNode( - n = int(toks[0]), - t = int(toks[1]), - x = float(toks[2]), - y = float(toks[3]), - z = float(toks[4]), - r = float(toks[5]), - pn = int(toks[6].rstrip()), - ) - # store this node - while len(nodes) <= vals.n: - nodes.append(None) - nodes[vals.n] = vals - #nodes.append(vals) - # - if vals.n < 0: - print("Negative node ID not allowed") - print("Node: " + str(vals)) - return False - while vals.n >= len(node_table): - node_table.append(None) - node_table[vals.n] = vals - # increment line number (used for error reporting only) - line_num += 1 - except: - err = "File not recognized as valid SWC file.\n" - err += "Problem parsing line %d\n" % line_num - if line is not None: - err += "Content: '%s'\n" % line - raise IOError(err) - - try: - for node in nodes: - if node is None: - continue - par = None - if node.pn >= 0: - par = node_table[node.pn] - par.children.append(node.n) - except: - print("Error reading SWC file -- fail to link child to parent") - print("Node: %s" % str(node)) - print("----------------------------------") - success = False - - # verify presence and number of soma and root nodes - num_soma_nodes = sum([ int(c is not None and c.t == 1) for c in nodes ]) - if num_soma_nodes == 0: - print("SWC must have at least one soma node. Found: %d" % num_soma_nodes) - print("----------------------------------") - success = False - elif num_soma_nodes > 1: - print("Warning: File has multiple soma nodes. This can interfere with feature analysis in some external software (e.g., vaa3d)") - print("----------------------------------") - - num_root_nodes = sum([ int(c is not None and c.pn == -1) for c in nodes ]) - # case of no root nodes covered by rule below that ID of child must - # be greater than that of parent - if num_root_nodes > 1: - print("Warning: File has multiple root nodes. This can interfere with feature analysis in some external software (e.g., vaa3d)") - print("----------------------------------") - - # get a list of all of the ids, make sure they are unique while we're at it - all_ids = set() - for node in nodes: - if node is None: - continue - iid = int(node.n) - if iid in all_ids: - print("Node ID %s is not unique." % node.n) - print("----------------------------------") - success = False - break - pid = int(node.pn) - if iid < pid: - print("Node (%d) has a smaller ID that its parent (%d)" % (iid, pid)) - print("----------------------------------") - success = False - break - all_ids.add(iid) - - # make sure that first root node is soma - for n in nodes: - if n is not None: - root = n - break - #root = nodes[0] - if root.t != 1: - # see if soma has a root - if sum([int(c is not None and c.t == 2 and c.pn == -1) for c in nodes]) == 0: - print("No soma root found in file") - print("----------------------------------") - success = False - print("First root node is not soma") - print("This should be fixable by calling resave_swc() on the file if there is a soma root in the file") - print("----------------------------------") - success = False - - # verify that children of the root have max one child - for root_child_id in root.children: - root_child = nodes[root_child_id] - num_grand_children = len(root_child.children) - if num_grand_children > 1: - print("Child of root (%s) has more than one child (%d)" % ( root_child_id, num_grand_children )) - print("----------------------------------") - success = False - - # sort the ids and make sure there are no gaps - sorted_ids = sorted(all_ids) - for i in xrange(1, len(sorted_ids)): - if sorted_ids[i] - sorted_ids[i-1] != 1: - print("Node IDs are not sequential") - print("This can be fixed by calling resave_swc() on the file") - print("----------------------------------") - success = False - return success - - - -def main(): - argc = len(sys.argv) - if argc < 1: - print("usage: python %s <swc_file> [<swc_file ...]") - print("") - print("Validate an SWC file for use with NEURON") - sys.exit(1) - try: - for i in range(1, argc): - if validate_swc(sys.argv[i]) == True: - print(" PASS") - else: - print(" FAIL") - exit(1) - except Exception as e: - print(" FAIL") - print(str(e)) - exit(1) -if __name__ == "__main__": main() diff --git a/allensdk/internal/mouse_connectivity/__init__.py b/allensdk/internal/mouse_connectivity/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/__init__.py b/allensdk/internal/mouse_connectivity/interval_unionize/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionize.py b/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionize.py deleted file mode 100644 index 5b4881764d..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionize.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import division - -import numpy as np - -from unionize_record import Unionize - - -class CavUnionize(Unionize): - - __slots__ = ['sum_pixels', 'sum_cav_pixels'] - - def __init__(self, *args, **kwargs): - for key in self.__slots__: - setattr(self, key, 0) - - - def calculate(self, low, high, data_arrays): - data_arrays = self.slice_arrays(low, high, data_arrays) - - self.sum_pixels = data_arrays['sum_pixels'].sum() - self.sum_cav_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['cav_density']).sum() - - - def propagate(self, ancestor): - ancestor.sum_pixels += self.sum_pixels - ancestor.sum_cav_pixels += self.sum_cav_pixels - return ancestor - - - def output(self, volume_scale, max_pixels): - return {'structure_volume': self.sum_pixels * volume_scale / max_pixels, - 'signal_volume': self.sum_cav_pixels * volume_scale / max_pixels, - 'signal_density': self.sum_cav_pixels / self.sum_pixels if self.sum_pixels > 0 else 0} - diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionizer.py b/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionizer.py deleted file mode 100755 index 55959e7dd1..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionizer.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import division -import logging -import functools -from collections import defaultdict -from six import iteritems - -import numpy as np - -from interval_unionizer import IntervalUnionizer -from cav_unionize import CavUnionize - - -class CavUnionizer(IntervalUnionizer): - - - @classmethod - def record_cb(cls): - return CavUnionize() - - - @classmethod - def propagate_record(cls, child_record, ancestor_record, copy_all=False): - return child_record.propagate(ancestor_record) - - - def extract_data(self, data_arrays, low, high): - '''As parent - ''' - - unionize = self.__class__.record_cb() - unionize.calculate(low, high, data_arrays) - - return unionize - - - def postprocess_unionizes(self, raw_unionizes, image_series_id, volume_scale, max_pixels): - - unionizes = [] - - logging.info('getting formatted unionize output') - for sid, un in iteritems(raw_unionizes): - - if sid < 0: - hemisphere = 'left' - else: - hemisphere = 'right' - sid = abs(sid) - - out = un.output(volume_scale, max_pixels) - out['structure_id'] = sid - out['hemisphere'] = hemisphere - out['image_series_id'] = image_series_id - - unionizes.append(out) - - return unionizes diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/data_utilities.py b/allensdk/internal/mouse_connectivity/interval_unionize/data_utilities.py deleted file mode 100755 index 89e5c123c8..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/data_utilities.py +++ /dev/null @@ -1,104 +0,0 @@ -import logging - -#import SimpleITK as sitk -import nrrd -import numpy as np - -#def read(path): -# return np.swapaxes(sitk.GetArrayFromImage(sitk.ReadImage(str(path))), 0, 2) - -def read(path): - return np.ascontiguousarray(nrrd.read(path)[0]) - - - -def load_annotation(annotation_path, data_mask_path=None): - '''Read data files segmenting the reference space into regions of valid - and invalid data, then further among brain structures - ''' - - logging.info('getting annotation') - annotation = read(annotation_path) - - logging.info('casting to signed') - # It shouldn't matter now, but there may be future structures with ids - # sufficiently large that we need that extra bit - logging.debug('max annotated value: {0}'.format(np.amax(annotation))) - annotation = annotation.astype(np.int32) - logging.debug('max annotated value: {0}'.format(np.amax(annotation))) - - logging.info('negating left hemisphere') - logging.debug('min annotated value: {0}'.format(np.amin(annotation))) - lr_mid = int( np.round(annotation.shape[2] / 2) ) - annotation[:, :, :lr_mid] = annotation[:, :, :lr_mid] * -1 - logging.debug('min annotated value: {0}'.format(np.amin(annotation))) - - if data_mask_path is not None: - logging.info('getting_data_mask') - data_mask =read(data_mask_path) - - logging.info('applying data mask') - annotation[np.logical_not(data_mask)] = 0 - - return annotation - - -def get_sum_pixels(sum_pixels_path): - logging.info('getting sum_pixels') - return {'sum_pixels': read(sum_pixels_path)} - - -def get_sum_pixel_intensities(sum_pixel_intensities_path, injection_sum_pixel_intensities_path): - logging.info('getting sum pixel intensities') - return {'sum_pixel_intensities': read(sum_pixel_intensities_path), - 'injection_sum_pixel_intensities': read(injection_sum_pixel_intensities_path)} - - -def get_cav_density(cav_density_path): - logging.info('getting cav density') - return {'cav_density': read(cav_density_path)} - - -def get_injection_data(injection_fraction_path, injection_density_path, - injection_energy_path): - '''Read nrrd files containing injection signal data - ''' - - logging.info('getting injection_fraction') - injection_fraction = read(injection_fraction_path) - - logging.info('getting injection_sum_projecting_pixels') - injection_density = read(injection_density_path) - - logging.info('getting injection_energy') - injection_energy = read(injection_energy_path) - - return {'injection_fraction': injection_fraction, - 'injection_density': injection_density, - 'injection_energy': injection_energy} - - -def get_projection_data(projection_density_path, projection_energy_path, - aav_exclusion_fraction_path=None): - '''Read nrrd files containing global signal data - ''' - - logging.info('getting projection density') - projection_density = read(projection_density_path) - - logging.info('getting projection energy') - projection_energy = read(projection_energy_path) - - try: - logging.info('getting aav exclusion fraction') - aav_exclusion_fraction = read(aav_exclusion_fraction_path) - aav_exclusion_fraction[aav_exclusion_fraction > 0] = 1 - aav_exclusion_fraction = aav_exclusion_fraction.astype(np.bool_, order='C') - - except (IOError, OSError, RuntimeError): - logging.info('skipping aav exclusion fraction') - aav_exclusion_fraction = np.zeros(projection_density.shape, dtype=np.bool_, order='C') - - return {'projection_density': projection_density, - 'projection_energy': projection_energy, - 'aav_exclusion_fraction': aav_exclusion_fraction} diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/interval_unionizer.py b/allensdk/internal/mouse_connectivity/interval_unionize/interval_unionizer.py deleted file mode 100755 index 121454c8ea..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/interval_unionizer.py +++ /dev/null @@ -1,222 +0,0 @@ -from __future__ import division -import logging -import functools -from collections import defaultdict -import copy as cp - -import numpy as np -from six import iteritems - - - -class IntervalUnionizer(object): - - - @classmethod - def record_cb(cls): - return defaultdict(lambda *a, **k: 0, {}) - - - def __init__(self, exclude_structure_ids=None): - '''Builds unionize records from grid data. Unionize records are - summaries of experimental observations occuring in a particular - spatial domain. Domains are generally specified by the intersection of - - 1. a brain structure - 2. an injection polygon (or its inverse) - 3. the left or right side of the brain - - Parameters - ---------- - exclude_structure_ids : list of int, optional - Don't generate records for these structures. Defaults to [0], - which excludes everything not in the brain. - - ''' - - if exclude_structure_ids is None: - exclude_structure_ids = [0] - self.exclude_structure_ids = exclude_structure_ids - - - def setup_interval_map(self, annotation): - '''Build a map from structure ids to intervals in the sorted flattened - reference space. - - Parameters - ---------- - annotation : np.ndarray - Segmentation label array. - - ''' - - logging.info('getting flat annotation') - flat_annot = annotation.flat - - logging.info('finding sort') - self.sort = np.argsort(flat_annot) - - logging.info('sorting flat annotation') - flat_annot = flat_annot[self.sort] - - logging.info('finding bounds') - diff = np.diff(flat_annot) - bounds = np.nonzero(diff)[0] - uniques = [ flat_annot[ii] for ii in bounds ] + [flat_annot[-1]] - - logging.info('building map') - lower_bounds = [0] + (bounds + 1).tolist() - upper_bounds = (bounds + 1).tolist() + [len(flat_annot)] - self.interval_map = {sid: item for sid, item - in zip(uniques, zip(lower_bounds, upper_bounds)) - if sid not in self.exclude_structure_ids} - - - def extract_data(self, data_arrays, low, high, **kwargs): - '''Given flattened data arrays and a specified interval, generate - summary data - - Parameters - ---------- - data_arrays : dict - Keys identify types of data volume. Values are flattened, sorted - arrays. - low : int - Index at which interval of interest begins. Inclusive. - high : int - Index at which interval of interest ends. Exclusive. - - ''' - - raise NotImplementedError('specify in subclass!') - - - @classmethod - def propagate_record(cls, child_record, ancestor_record, copy_all=False): - '''Updates one unionize corresponding to a rootward structure with - information from a unionize corresponding to a leafward structure - - Parameters - ---------- - child_record : unionize - Data will be drawn from this record - ancestor_record : unionize - This record will be updated - - ''' - - raise NotImplementedError('specify in subclass!') - - - @classmethod - def propagate_unionizes(cls, direct_unionizes, ancestor_id_map): - '''Structures are arranged in a tree, whose leafward-oriented edges - indicate physical containment. This method updates rootward unionize - records with information from leafward ones. - - Parameters - ---------- - direct_unionizes : list of unionizes - Each entry is a unionize record produced from a collection of - directly labeled voxels in the segmentation volume. - ancestor_id_map : dict - Keys are structure ids. Values are ids of all structures rootward in - the tree, including the key node - - Returns - ------- - output_unionizes : list of unionizes - Contains completed unionize records at all depths in the structure - tree - - ''' - - - output_unionizes = defaultdict(cls.record_cb, cp.deepcopy(direct_unionizes)) - for k, v in iteritems(direct_unionizes): - for aid in ancestor_id_map[k]: - - if k == aid: - continue - - logging.debug('propagating data from {0} to {1}'.format(k, aid)) - output_unionizes[aid] = cls.propagate_record(v, output_unionizes[aid]) - - return output_unionizes - - - @classmethod - def propagate_to_bilateral(cls, lateral_unionizes): - - bilateral = defaultdict(cls.record_cb, {}) - for sid in list(lateral_unionizes.keys()): - unionize = lateral_unionizes[sid] - other_id = -1 * sid - - if (sid in bilateral) or (other_id in bilateral): - continue - - logging.debug('bilateralizing structure {0}'.format(sid)) - other = lateral_unionizes[other_id] - - bilateral[sid] = cls.propagate_record(unionize, bilateral[sid], True) - bilateral[sid] = cls.propagate_record(other, bilateral[sid], True) - - return bilateral - - - - def postprocess_unionizes(self, raw_unionizes, **kwargs): - '''Carry out additional calculations/formatting derivative of core - unionization. - - Parameters - ---------- - raw_unionizes : list of unionizes - Each entry is a unionize record. - - ''' - raise NotImplementedError('specify in subclass!') - - - def sort_data_arrays(self, data_arrays): - '''Apply the precomputed sort to flattened data arrays - - Parameters - ---------- - data_arrays : dict - Keys identify types of data volume. Values are flattened, unsorted - arrays. - - Returns - ------- - dict : - As input, but values are sorted - - ''' - - logging.info('sorting data arrays') - return {k: v[self.sort] for k, v in iteritems(data_arrays)} - - - def direct_unionize(self, data_arrays, pre_sorted=False, **kwargs): - '''Obtain unionize records from directly annotated regions. - - Parameters - ---------- - data_arrays : dict - Keys identify types of data volume. Values are flattened arrays. - sorted : bool, optional - If False, data arrays will be sorted. - - ''' - - if not pre_sorted: - data_arrays = self.sort_data_arrays(data_arrays) - - unionizes = {} - for sid, (low, high) in iteritems(self.interval_map): - logging.debug( 'unionizing structure {0} :: voxel_count={1}'.format(sid, high - low) ) - unionizes[sid] = self.extract_data(data_arrays, low, high, **kwargs) - - return unionizes diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py b/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py deleted file mode 100755 index 7735b59042..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import division -import logging -from six import iteritems - -import numpy as np - -from allensdk.core.simple_tree import SimpleTree - -from run_tissuecyte_unionize_classic import get_ancestor_id_map, get_volume_scale -from allensdk.internal.mouse_connectivity.interval_unionize.cav_unionizer import CavUnionizer -import data_utilities as du - - -def run(input_data): - - logging.info('making ancestor id map') - ancestor_id_map = get_ancestor_id_map(input_data['structures']) - - logging.info('computing volume scale factor') - volume_scale = (input_data['reference_spacing'] / 10 ** 3) ** 3 # mum3 -> mm3 - logging.info('volume scale factor : {0}'.format(volume_scale)) - - logging.info('reference shape : {0}'.format(input_data['reference_shape'])) - logging.info('reference spacing : {0}'.format(input_data['reference_spacing'])) - logging.info('image_series_id : {0}'.format(input_data['image_series_id'])) - - annotation = du.load_annotation(input_data['annotation_path'], input_data['grid_paths']['data_mask']) - - unionizer = CavUnionizer() - unionizer.setup_interval_map(annotation) - del annotation - - signal_arrays = du.get_cav_density(input_data['grid_paths']['cav_density']) - signal_arrays.update(du.get_sum_pixels(input_data['grid_paths']['sum_pixels'])) - - max_pixels = float(np.amax(signal_arrays['sum_pixels'])) - logging.info('max pixels per voxel: {}'.format(max_pixels)) - - for k, v in iteritems(signal_arrays): - logging.info('sorting {0} array'.format(k)) - signal_arrays[k] = v.flat[unionizer.sort] - - logging.info('computing unionizes from directly annotated voxels') - raw_unionizes = unionizer.direct_unionize(signal_arrays, pre_sorted=True) - - logging.info('propagating data to ancestor structures') - raw_unionizes = CavUnionizer.propagate_unionizes(raw_unionizes, ancestor_id_map) - - logging.info('propagating data to bilateral unionizes') - bilateral = CavUnionizer.propagate_to_bilateral(raw_unionizes) - - cooked_unionizes = list(unionizer.postprocess_unionizes( - raw_unionizes, - image_series_id=input_data['image_series_id'], - volume_scale=volume_scale, - max_pixels=max_pixels - )) - cooked_bilateral = list(unionizer.postprocess_unionizes( - bilateral, - image_series_id=input_data['image_series_id'], - volume_scale=volume_scale, - max_pixels=max_pixels - )) - - for item in cooked_bilateral: - item['hemisphere'] = '(none)' - cooked_unionizes.append(item) - - logging.info('computed {0} unionize records'.format(len(cooked_unionizes))) - return cooked_unionizes diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py b/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py deleted file mode 100755 index fd601f32ff..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py +++ /dev/null @@ -1,92 +0,0 @@ -import logging - -from allensdk.core.simple_tree import SimpleTree - -from allensdk.internal.mouse_connectivity.interval_unionize.tissuecyte_unionizer import TissuecyteUnionizer -import allensdk.internal.mouse_connectivity.interval_unionize.data_utilities as du - - -def get_ancestor_id_map(structures): - - - tree = SimpleTree( structures, - lambda st: int(st['id']), - lambda st: st['parent_structure_id']) - ancestor_id_map = tree.value_map( lambda st: st['id'], - lambda st: tree.ancestor_ids([st['id']])[0] ) - for k in list(ancestor_id_map): - ancestor_id_map[-k] = map(lambda x: -x, ancestor_id_map[k]) - - return ancestor_id_map - - -def get_volume_scale(image_resolution, voxel_depth): - return image_resolution ** 2 * 10 ** -9 * voxel_depth - - -def run(input_data): - - logging.info('making ancestor id map') - ancestor_id_map = get_ancestor_id_map(input_data['structures']) - - logging.info('computing volume scale factor') - volume_scale = get_volume_scale(input_data['image_resolution'], input_data['reference_spacing']) - logging.info('volume scale factor : {0}'.format(volume_scale)) - - logging.info('reference shape : {0}'.format(input_data['reference_shape'])) - logging.info('reference spacing : {0}'.format(input_data['reference_spacing'])) - logging.info('image_series_id : {0}'.format(input_data['image_series_id'])) - - annotation = du.load_annotation(input_data['annotation_path'], input_data['grid_paths']['data_mask']) - - unionizer = TissuecyteUnionizer() - unionizer.setup_interval_map(annotation) - del annotation - - signal_arrays = du.get_injection_data(input_data['grid_paths']['injection_fraction'], - input_data['grid_paths']['injection_density'], - input_data['grid_paths']['injection_energy']) - signal_arrays.update(du.get_projection_data(input_data['grid_paths']['projection_density'], - input_data['grid_paths']['projection_energy'], - input_data['grid_paths']['aav_exclusion_fraction'])) - signal_arrays.update(du.get_sum_pixels(input_data['grid_paths']['sum_pixels'])) - signal_arrays.update(du.get_sum_pixel_intensities(input_data['grid_paths']['sum_pixel_intensities'], - input_data['grid_paths']['injection_sum_pixel_intensities'])) - - for k, v in signal_arrays.items(): - logging.info('sorting {0} array'.format(k)) - signal_arrays[k] = v.flat[unionizer.sort] - - logging.info('computing unionizes from directly annotated voxels') - raw_unionizes = unionizer.direct_unionize(signal_arrays, pre_sorted=True) - - logging.info('propagating data to ancestor structures') - raw_unionizes = TissuecyteUnionizer.propagate_unionizes(raw_unionizes, - ancestor_id_map) - - logging.info('propagating data to bilateral unionizes') - bilateral = TissuecyteUnionizer.propagate_to_bilateral(raw_unionizes) - - cooked_unionizes = list(unionizer.postprocess_unionizes( - raw_unionizes, - image_series_id=input_data['image_series_id'], - output_spacing_iso=input_data['reference_spacing'], - volume_scale=volume_scale, - target_shape=input_data['reference_shape'], - sort=unionizer.sort - )) - - cooked_bilateral = list(unionizer.postprocess_unionizes( - bilateral, - image_series_id=input_data['image_series_id'], - output_spacing_iso=input_data['reference_spacing'], - volume_scale=volume_scale, - target_shape=input_data['reference_shape'], - sort=unionizer.sort - )) - for item in cooked_bilateral: - item['hemisphere_id'] = 3 - cooked_unionizes.append(item) - - logging.info('computed {0} unionize records'.format(len(cooked_unionizes))) - return cooked_unionizes diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py b/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py deleted file mode 100755 index d9e4de96a8..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py +++ /dev/null @@ -1,155 +0,0 @@ -from __future__ import division -import logging - -import numpy as np - -from .unionize_record import Unionize - - -class TissuecyteBaseUnionize(Unionize): - - __slots__ = ['sum_pixels', 'sum_projection_pixels', 'sum_projection_pixel_intensity', - 'max_voxel_index', 'max_voxel_density', 'projection_density', - 'projection_energy', 'projection_intensity', 'direct_sum_projection_pixels', - 'sum_pixel_intensity'] - - - def __init__(self): - '''A unionize record summarizing observations from a tissuecyte - projection experiment - ''' - - for key in self.__slots__: - setattr(self, key, 0) - - - def propagate(self, ancestor, copy_all=False): - '''Update a rootward unionize with data from this unionize record - - Parameters - ---------- - ancestor : TissuecyteBaseUnionize - will be updated - - Returns - ------- - ancestor : TissuecyteBaseUnionize - - ''' - - ancestor.sum_pixels += self.sum_pixels - ancestor.sum_projection_pixels += self.sum_projection_pixels - ancestor.sum_projection_pixel_intensity += self.sum_projection_pixel_intensity - ancestor.sum_pixel_intensity += self.sum_pixel_intensity - - if ancestor.max_voxel_density <= self.max_voxel_density: - ancestor.max_voxel_density = self.max_voxel_density - ancestor.max_voxel_index = self.max_voxel_index - - if copy_all: - ancestor.direct_sum_projection_pixels += self.direct_sum_projection_pixels - - return ancestor - - - def set_max_voxel(self, density_array, low): - '''Find the voxel of greatest density in this unionizes spatial domain - - Parameters - ---------- - density_array : ndarray - Float values are densities per voxel - low : int - index in full flattened, sorted array of starting voxel - - ''' - - if self.sum_projection_pixels > 0: - - self.max_voxel_index = np.argmax(density_array) - self.max_voxel_density = density_array[self.max_voxel_index] - - self.max_voxel_index += low - - - def output(self, output_spacing_iso, volume_scale, target_shape, sort): - '''Generate derived data for this unionize - - Parameters - ---------- - output_spacing_iso : numeric - Isometric spacing of reference space in microns - volume_scale : numeric - Scale factor mapping pixels to microns^3 - target_shape : array-like of numeric - Shape of reference space - - ''' - - if self.sum_pixels > 0: - self.projection_density = self.sum_projection_pixels / self.sum_pixels - self.projection_energy = self.sum_projection_pixel_intensity / self.sum_pixels - - if self.sum_projection_pixels > 0: - self.projection_intensity = self.sum_projection_pixel_intensity / self.sum_projection_pixels - - output = {k: getattr(self, k) for k in self.__slots__} - - output['volume'] = self.sum_pixels * volume_scale - output['direct_projection_volume'] = self.direct_sum_projection_pixels * volume_scale - output['projection_volume'] = self.sum_projection_pixels * volume_scale - output['sum_pixel_intensity'] = self.sum_pixel_intensity - - if self.max_voxel_index > 0: - self.max_voxel_index = sort[self.max_voxel_index] - mv_pos = np.unravel_index([self.max_voxel_index], dims=target_shape, order='C') - if len(mv_pos[0]) == 0: - mv_pos = [[0], [0], [0]] - else: - mv_pos = [[0], [0], [0]] - - output['max_voxel_x'] = mv_pos[0][0] * output_spacing_iso - output['max_voxel_y'] = mv_pos[1][0] * output_spacing_iso - output['max_voxel_z'] = mv_pos[2][0] * output_spacing_iso - del output['max_voxel_index'] - - return output - - -class TissuecyteInjectionUnionize(TissuecyteBaseUnionize): - - def calculate(self, low, high, data_arrays): - data_arrays = self.slice_arrays(low, high, data_arrays) - - self.sum_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['injection_fraction']).sum() - self.sum_projection_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['injection_density']).sum() - self.direct_sum_projection_pixels = self.sum_projection_pixels - self.sum_projection_pixel_intensity = np.multiply(data_arrays['sum_pixels'], data_arrays['injection_energy']).sum() - self.sum_pixel_intensity = data_arrays['injection_sum_pixel_intensities'].sum() - - self.set_max_voxel(data_arrays['injection_density'], low) - - -class TissuecyteProjectionUnionize(TissuecyteBaseUnionize): - - def calculate(self, low, high, data_arrays, ij_record): - data_arrays = self.slice_arrays(low, high, data_arrays) - - nex = np.logical_or(data_arrays['injection_fraction'], np.logical_not(data_arrays['aav_exclusion_fraction'])) - - self.sum_pixels = data_arrays['sum_pixels'][nex].sum() - self.sum_pixels -= ij_record.sum_pixels - - self.sum_projection_pixels = np.multiply(data_arrays['sum_pixels'], data_arrays['projection_density'])[nex].sum() - self.sum_projection_pixels -= ij_record.sum_projection_pixels - self.direct_sum_projection_pixels = self.sum_projection_pixels - - self.sum_projection_pixel_intensity = np.multiply(data_arrays['sum_pixels'], data_arrays['projection_energy'])[nex].sum() - self.sum_projection_pixel_intensity -= ij_record.sum_projection_pixel_intensity - - self.sum_pixel_intensity = float(data_arrays['sum_pixel_intensities'][nex].sum()) - self.sum_pixel_intensity -= ij_record.sum_pixel_intensity - - valid_density = np.multiply(nex, data_arrays['projection_density']) - valid_density = np.multiply(valid_density, 1 - data_arrays['injection_fraction']) - self.set_max_voxel(valid_density, low) diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py b/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py deleted file mode 100755 index c6d0a3050b..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py +++ /dev/null @@ -1,108 +0,0 @@ -from __future__ import division -import logging - -import numpy as np -from six import iteritems - -from .interval_unionizer import IntervalUnionizer -from .tissuecyte_unionize_record import TissuecyteInjectionUnionize, \ - TissuecyteProjectionUnionize - - -class TissuecyteUnionizer(IntervalUnionizer): - '''A specialization of the IntervalUnionizer set up for unionizing - Tissuecyte-derived projection data. - ''' - - - @classmethod - def record_cb(cls): - return {'injection': TissuecyteInjectionUnionize(), - 'projection': TissuecyteProjectionUnionize()} - - - def extract_data(self, data_arrays, low, high): - '''As parent - ''' - - unionize = self.__class__.record_cb() - - unionize['injection'].calculate(low, high, data_arrays) - unionize['projection'].calculate(low, high, data_arrays, unionize['injection']) - - return unionize - - - @classmethod - def propagate_record(cls, child_record, ancestor_record, copy_all=False): - '''As parent - ''' - - for k, v in iteritems(child_record): - v.propagate(ancestor_record[k], copy_all) - - return ancestor_record - - - def postprocess_unionizes(self, raw_unionizes, image_series_id, - output_spacing_iso, volume_scale, target_shape, sort): - '''As parent - - New Parameters - -------------- - output_spacing_iso : numeric - Isometric spacing of reference space in microns - volume_scale : numeric - Scale factor mapping pixels to microns^3 - target_shape : array-like of numeric - Shape of reference space - - ''' - - unionizes = [] - total_injection_volume = 0 - - logging.info('getting formatted unionize output') - for sid, un in iteritems(raw_unionizes): - - if sid < 0: - hemisphere = 1 - else: - hemisphere = 2 - - current = [] - for ij, item in iteritems(un): - - v = item.output(output_spacing_iso, volume_scale, target_shape, sort) - injection = True if ij == 'injection' else False - - if injection and hemisphere != 3: - total_injection_volume += v['direct_projection_volume'] - - del v['direct_projection_volume'] - del v['direct_sum_projection_pixels'] - - v.update({'is_injection': injection, - 'hemisphere_id': hemisphere, - 'structure_id': abs(sid), - 'image_series_id': image_series_id}) - - current.append(v) - - unionizes.extend(current) - - if total_injection_volume > 0: - logging.info('computing normalized projection volume') - for un in unionizes: - un['normalized_projection_volume'] = un['projection_volume'] / total_injection_volume - else: - logging.warning('no injection found!') - for un in unionizes: - un['normalized_projection_volume'] = 0 - - return filter(lambda x: x['sum_pixels'] > 0, unionizes) - - - - - diff --git a/allensdk/internal/mouse_connectivity/interval_unionize/unionize_record.py b/allensdk/internal/mouse_connectivity/interval_unionize/unionize_record.py deleted file mode 100755 index 3e340d9cf4..0000000000 --- a/allensdk/internal/mouse_connectivity/interval_unionize/unionize_record.py +++ /dev/null @@ -1,39 +0,0 @@ -from six import iteritems - - -class Unionize(object): - '''Abstract base class for unionize records. - ''' - - def __init__(self, *args, **kwargs): - raise NotImplementedError() - - - def calculate(self, *args, **kwargs): - raise NotImplementedError() - - - def propagate(self, ancestor, copy_all, *args, **kwargs): - raise NotImplementedError() - - - def output(self, *args, **kwargs): - raise NotImplementedError() - - - def slice_arrays(self, low, high, data_arrays): - '''Extract a slice from several aligned arrays - - Parameters - ---------- - low : int - start of slice, inclusive - high : int - end of slice, exclusive - data_arrays : dict - keys are varieties of data. values are sorted, flattened - data arrays - - ''' - - return {k: v[low:high] for k, v in iteritems(data_arrays)} diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/.volume_utilities.py.swp b/allensdk/internal/mouse_connectivity/projection_thumbnail/.volume_utilities.py.swp deleted file mode 100644 index 1e91f82bb07a606881dba1bf4e11a1cb934a7bd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&1(}u7{;gG1gpi5-h{C#BsIylsZgySpa)A3wHhmUS|{1bcI@u#x;q;iFJ1*N zBKU`>pdP&H)w3rBuZn+x;4_=u(DVb(mUrP{*>|3OKYo)OLZ&l!uXTejHqJ6!Q;dE5 z^6dVf{jJ4#nlY^c>D%}}F4alvxwoEe%s0AG5;sH;NUd~gl*x>2M2XGg<WWb!?}WlQ zH<5qYQMwl;cvRig@nl~HQ5;HbhUU~;cRPvD-8GpyD_7g~=KOi58)+@OM)j2$xMnR2 zJ6fn<w{SlSvQWC2QGqf_rj2;;k9laB2<$lmnd#NfO|C99=jZHfCudIZBZpV_+?X^F z5g-CYfCvx)B0vO)01+SpyAv?+1bd3*eT8MFxKC`k7msu!0z`la5CI}U1c(3;AOb{y z2oM1xKm`6n0>WeL(E-MeO`>`H|6l(8|9*(EZ_sDxE%XL@4Lye*Ko_A4&=PbU`f-r4 z572w)9rOx%0X>8+Lr0-0=r`*8f__4upqEev-GOdHE6^-74cVSfL#LoK&;;}qz0ySl zhyW2F0z`la5CI}U1c(3;7$?ASCDLSx=1pGbVne0OlRcg)v+n9Fj0bKv!Ye!Zc8YC# zSNCONT$|Tj@GACRT^i4)<3^yg2>gb|5$6hyMEhnft>z_*2Yv|+J&}Btr?KcN?dOX& zR4XGj?!x6u<L0f$A`zi9GD$1Lqs`TPtkHT9X<w$s^_1`<6fa%qjpxY=C|hboiSm`U zhTJrKL|x1vl0*!OG>v6xZspcWbvQ`T_s-V#aHx^jj=E#cHdad4_&nR^-9ovN1FZ95 z%T@01O4-vaZx&6C1078_qPD#XK-euGIl4HME|X0(H^T&_^s$J=hD<9tt{R`KmBsS_ z#<tsM`CYL*uO(5~3WYDrjCnQf<z}~s)!}vz_qa6K(N!2niQ)N2n2QuUREFAE3S{f< dbsM(T7_*7E>-I8y5v1$#;$;tq=TjAF_7~r6axwq_ diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/__init__.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py deleted file mode 100644 index 5150985411..0000000000 --- a/allensdk/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py +++ /dev/null @@ -1,109 +0,0 @@ -import functools -import logging -from six.moves import xrange - -import numpy as np -import SimpleITK as sitk -from scipy.ndimage.interpolation import zoom - -from .image_sheet import ImageSheet -from .projection_functions import max_projection -from .volume_projector import VolumeProjector -from . import visualization_utilities as vis - - -def max_cb(max_sheet, depth_sheet, volume, axis, *a, **k): - m, d = max_projection(volume, axis) - max_sheet.append(m.T) - depth_sheet.append(d.T) - - -def apply_colormap(image, colormap): - color_image = colormap(image) - color_image[:, :, -1] = image - return color_image - - -def blend_with_background(image, background): - - for ii in xrange(3): - image[:, :, ii] = np.multiply(np.squeeze(image[:, :, ii]), - np.squeeze(image[:, :, -1])) - image[:, :, ii] += np.multiply(np.squeeze(background), - np.squeeze(1.0 - image[:, :, -1])) - - image[:, :, -1] = 1 - return image - - -def do_blur(image, blur): - - for ii in xrange(3): - im = sitk.GetImageFromArray(image[:, :, ii]) - im = sitk.DiscreteGaussian(im, blur) - image[:, :, ii] = sitk.GetArrayFromImage(im) - - return image - - -def handle_output_image(sheet, out_image, colormap, nsteps): - - sheet = sheet.copy() - whole_sheet = sheet.get_output(-1) - - if out_image['blur'] > 0.0: - logging.info('applying a gaussian blur with variance: {0:2.2f}'.format(out_image['blur'])) - whole_sheet = sitk.GetImageFromArray(whole_sheet) - whole_sheet = sitk.DiscreteGaussian(whole_sheet, out_image['blur']) - whole_sheet = sitk.GetArrayFromImage(whole_sheet) - - if out_image['scale'] != 1: - whole_sheet = zoom(whole_sheet, zoom=out_image['scale'], order=1) - - whole_sheet = apply_colormap(whole_sheet, colormap) - - if out_image['background'] is not None: - whole_sheet = blend_with_background(whole_sheet, out_image['background']) - else: - whole_sheet = blend_with_background(whole_sheet, np.zeros_like(whole_sheet)[:, :, -1]) - - whole_sheet = np.around(whole_sheet * 255).astype(np.uint8) - out_image['write'](whole_sheet[:, :, :-1]) - - -def simple_rotation(from_axis, to_axis, start, end, nsteps): - - angles = np.linspace(start * np.pi, end * np.pi, nsteps, endpoint=False) - from_axes = [from_axis] * nsteps - to_axes = [to_axis] * nsteps - - return from_axes, to_axes, angles - - -def run(volume, imin, imax, rotations, colormap): - - volume = vis.sitk_safe_ln(volume) - - ln_imin = np.log(imin) if imin != 0 else -np.inf - ln_imax = np.log(imax) if imax != 0 else np.inf - - volume = sitk.IntensityWindowing(volume, ln_imin, ln_imax, 0.0, 1.0) - - for rotation in rotations: - - max_sheet = ImageSheet() - depth_sheet = ImageSheet() - - vp = VolumeProjector.fixed_factory(volume, rotation['window_size']) - callback = functools.partial(max_cb, max_sheet, depth_sheet, **rotation['projection_parameters']) - - rot = rotation['rotation_parameters'] - from_axes, to_axes, angles = simple_rotation(**rot) - - for response in vp.rotate_and_extract(from_axes, to_axes, angles, callback): - pass - - rotation['write_depth_sheet'](depth_sheet.get_output(-1)) - - for out_image in rotation['output_images']: - handle_output_image(max_sheet, out_image, colormap, rot['nsteps']) diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/image_sheet.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/image_sheet.py deleted file mode 100644 index 9c489263b5..0000000000 --- a/allensdk/internal/mouse_connectivity/projection_thumbnail/image_sheet.py +++ /dev/null @@ -1,44 +0,0 @@ -import functools -import copy as cp -import logging - -import numpy as np - - -class ImageSheet(object): - - - def append(self, new_cell): - - if not hasattr(self, 'images'): - self.images = [new_cell] - else: - self.images.append(new_cell) - - - def apply(self, fn, *args, **kwargs): - fn = functools.partial(fn, *args, **kwargs) - self.images = map(fn, self.images) - - - def copy(self): - new_sheet = ImageSheet() - new_sheet.images = cp.deepcopy(self.images) - return new_sheet - - - def get_output(self, axis): - output = np.concatenate(self.images, axis=axis) - logging.info('concatenated sheet has size: {0}'.format(output.shape)) - return output - - - @staticmethod - def build_from_image(image, n, axis): - - images = np.split(image, n, axis) - - sheet = ImageSheet() - sheet.images = images - - return sheet diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/projection_functions.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/projection_functions.py deleted file mode 100644 index 4f88714c44..0000000000 --- a/allensdk/internal/mouse_connectivity/projection_thumbnail/projection_functions.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import division - -import SimpleITK as sitk -from six.moves import xrange -import numpy as np - - -def convert_axis(axis): - return 2 - axis - - -def max_projection(volume, axis, *a, **k): - volume = sitk.GetArrayFromImage(volume) - axis = convert_axis(axis) - - return np.amax(volume, axis), np.argmax(volume, axis) - - -def template_projection(volume, axis, gain=2, maxv=1, *a, **k): - volume = sitk.GetArrayFromImage(volume) - axis = convert_axis(axis) - - output_shape = list(volume.shape) - del output_shape[axis] - output = np.zeros(output_shape, dtype=float) - - for ii in xrange(volume.shape[axis]): - current = volume.take(ii, axis) - - output = np.multiply(output, (maxv - current) / maxv) - output += gain * np.multiply(current, current) / maxv - - return output - - - diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py deleted file mode 100644 index 8d179da6cf..0000000000 --- a/allensdk/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py +++ /dev/null @@ -1,100 +0,0 @@ -from __future__ import division - -import logging - - -import matplotlib as mpl -import SimpleITK as sitk -import numpy as np - - -def convert_discrete_colormap(data, cm_name='custom', color_names=None): - '''Generates a matplotlib continuous colormap on [0, 1] from a discrete - colormap at N evenly spaced points. - - Parameters - ---------- - data : list of list - Sublists are [r, g, b]. - - Returns - ------- - matplotlib.colors.LinearSegmentedColormap - Gamma is 1. Output space is 3 X [0, 1] - - ''' - - if color_names is None: - color_names = ['red', 'green', 'blue'] - - data = np.array(data) - npoints = data.shape[0] - - domain = np.linspace(0, 1.0, npoints) - color_arrays = {} - - for col, name in enumerate(color_names): - color_array = np.zeros((npoints, 3)) - - color_array[:, 0] = domain - color_array[:, 1] = minmax_norm(data[:, col]) - color_array[:, 2] = color_array[:, 1] - - color_arrays[name] = color_array - - return mpl.colors.LinearSegmentedColormap(cm_name, color_arrays, npoints, gamma=1.0) - - - -def minmax_norm(data): - - rng = np.amax(data) - np.amin(data) - if rng == 0: - return data - - return (data - np.amin(data)) / rng - - - -def sitk_safe_ln(data, minimum=10**-10): - - logging.info('thresholding below at {0}'.format(minimum)) - minimum = float(minimum) - data = sitk.Threshold(data, minimum, np.inf, minimum) - - logging.info('taking natural log') - return sitk.Log(data) - - -def normalize_intensity(data, in_min, in_max, out_min=0.0, out_max=0.0): - - logging.info('setting input range: [{0:2.3f}, {1:2.3f}]'.format(in_min, in_max)) - data = sitk.ShiftScale(data, -in_min, 1.0 / (in_max - in_min)) - data = sitk.Threshold(data, 0.0, np.inf, 0.0) - data = sitk.Threshold(data, 0.0, 1.0, 1.0) - - logging.info('setting output range: [{0:2.3f}, {1:2.3f}]'.format(out_min, out_max)) - data = sitk.ShiftScale(data, 0.0, out_max - out_min) # want to scale first - return sitk.ShiftScale(data, out_min, 1) # then shift - - -def blend(image_stack, weight_stack): - ''' - - Parameters - ---------- - image_stack :: list of np.ndarray - The images to be blended. Shapes cannot differ - weight_stack :: list of np.ndarray - The weight of each image at each pixel. Will be normalized. - - ''' - - image_stack = np.array(image_stack) - weight_stack = np.array(weight_stack) - - weight_stack = weight_stack - np.amin(weight_stack, axis=0) / (np.amax(weight_stack, axis=0) - np.amin(weight_stack, axis=0)) - weight_stack[np.isnan(weight_stack)] = 0.5 - weight_stack[np.isinf(weight_stack)] = 0.5 - - return np.multiply(image_stack, weight_stack).sum(axis=0) diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_projector.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_projector.py deleted file mode 100644 index 429dd9511b..0000000000 --- a/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_projector.py +++ /dev/null @@ -1,83 +0,0 @@ -import logging - -import SimpleITK as sitk -from six.moves import xrange -import numpy as np - -from . import volume_utilities as vol - - -class VolumeProjector(object): - - def __init__(self, view_volume): - logging.info('initializing volume projector') - self.view_volume = view_volume - - - def build_rotation_transform(self, from_axis, to_axis, angle): - logging.info('constructing rotation') - - transform = sitk.AffineTransform(3) - transform.SetCenter((vol.sitk_get_center(self.view_volume)).tolist()) - transform.Rotate(to_axis, from_axis, angle, True) - - logging.info(transform.__str__()) - return transform - - - def rotate(self, from_axis, to_axis, angle): - logging.info('rotating from axis {0} to axis {1} ' - 'by {2:2.2f} radians'.format(from_axis, to_axis, angle)) - - transform = self.build_rotation_transform(from_axis, to_axis, angle) - rotated = sitk.Resample(self.view_volume, transform, sitk.sitkLinear, - 0.0, self.view_volume.GetPixelID()) - - return rotated - - - def extract(self, cb, volume=None): - logging.info('extracting projection') - - if volume is None: - volume=self.view_volume - - return cb(volume) - - - def rotate_and_extract(self, from_axes, to_axes, angles, cb): - - for fax, tax, angle in zip(from_axes, to_axes, angles): - - rotated = self.rotate(fax, tax, angle) - yield self.extract(cb, rotated) - - - @classmethod - def fixed_factory(cls, volume, size): - - view_volume = sitk.Image(int(size[0]), int(size[1]), int(size[2]), volume.GetPixelID()) - view_volume = vol.sitk_paste_into_center(volume, view_volume) - - return cls(view_volume) - - - @classmethod - def safe_factory(cls, volume): - - max_extent = vol.sitk_get_diagonal_length(volume) - max_extent = [np.ceil(max_extent).astype(int)] * 3 - - vpar = vol.sitk_get_size_parity(volume) - lpar = np.mod(max_extent, 2) - - for ax in xrange(volume.GetDimension()): - if vpar[ax] != lpar[ax]: - max_extent[ax] += 1 - - return cls.fixed_factory(volume, max_extent) - - - - - diff --git a/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py deleted file mode 100644 index b5cc19c545..0000000000 --- a/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import division - -import logging - -import SimpleITK as sitk -import numpy as np - - -def sitk_get_image_parameters(volume): - return (np.array(volume.GetSpacing()), - np.array(volume.GetSize()), - np.array(volume.GetOrigin())) - - -def sitk_get_center(volume): - _, size, _ = sitk_get_image_parameters(volume) - return (size - 1) / 2 - - -def sitk_get_size_parity(volume): - _, size, _ = sitk_get_image_parameters(volume) - return np.mod(size, 2) - - -def sitk_get_diagonal_length(volume): - _, size, _ = sitk_get_image_parameters(volume) - return np.linalg.norm(size) - - -def sitk_paste_into_center(smaller, larger): - - smaller_parities = sitk_get_size_parity(smaller) - larger_parities = sitk_get_size_parity(larger) - if not np.allclose(smaller_parities, larger_parities): - logging.warn('parities differ, result will not be centered : {0}, {1}'.format(smaller_parities, larger_parities)) - - smaller_center = sitk_get_center(smaller) - larger_center = sitk_get_center(larger) - - offset = np.around(larger_center - smaller_center).astype(int).tolist() - return sitk.Paste(larger, smaller, smaller.GetSize(), [0, 0, 0,], offset) diff --git a/allensdk/internal/mouse_connectivity/tissuecyte_stitching/__init__.py b/allensdk/internal/mouse_connectivity/tissuecyte_stitching/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py b/allensdk/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py deleted file mode 100644 index 90137aed22..0000000000 --- a/allensdk/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py +++ /dev/null @@ -1,145 +0,0 @@ -import logging -import operator as op -from collections import defaultdict -from six.moves import reduce - -import numpy as np - - - -class Stitcher(object): - - - def __init__(self, image_dimensions, tiles, average_tiles, channels): - - logging.info('image_dimensions: {0}'.format(image_dimensions)) - self.image_dimensions = image_dimensions - - self.average_tiles = defaultdict(lambda *a, **k: None, average_tiles) - - self.tiles = tiles - self.channels = channels - - - def run(self, cb=np.array): - - slice_image, stitched_indicator = initialize_images(self.image_dimensions, len(self.channels)) - missing_tiles = {} - - for tile in self.tiles: - - if tile.is_missing: - - missing_tiles[tile.index] = tile.get_missing_path() - tile.initialize_image() - - else: - - tile.apply_average_tile_to_self(self.average_tiles[tile.channel]) - tile.trim_self() - - self.stitch(slice_image, stitched_indicator, tile, cb) - - return slice_image, missing_tiles - - - def stitch(self, slice_image, stitched_indicator, tile, cb=np.array): - - region = tile.get_image_region() - - current_region = slice_image[region] - indicator_region = stitched_indicator[region] - - stup = (tile.size['row'], tile.size['column']) - blend = get_blend(indicator_region, stup, cb) - blend = make_blended_tile(blend, tile.image, current_region) - logging.info('obtained blend') - - slice_image[region] = blend - stitched_indicator[region] = 1 - logging.info('updated image region with tile data') - - -def initialize_image(dimensions, nchannels, dtype, order='C'): - return np.zeros((dimensions['row'], dimensions['column'], nchannels), dtype=dtype, order=order) - - -def initialize_images(dimensions, nchannels): - return initialize_image(dimensions, nchannels, np.uint16), initialize_image(dimensions, nchannels, np.int8) - - -def make_blended_tile(blend, tile, current_region): - return np.multiply((1 - blend), tile) + np.multiply(blend, current_region) - - -def get_indicator_bound_point(indicator, lg, axis): - '''Finds the index of first change in a binary mask - along a specified axis in a specified direction - ''' - - delta = np.diff(indicator, axis=axis) - points = np.where(lg(delta, 0)) - del delta - - points = np.unique(points[axis]) - size = indicator.shape[axis] - points = points[lg(points, size / 2.0)] - - if len(points) > 0: - return points[-1] - return None - - -def blend_component_from_point(point, mesh, lg): - '''Obtains a normalized component of the blend, which describes depth of - overlap along a specified axis in a specified direction - ''' - - # this has the effect that the shallowest part of the blend - # is always 0 - symmetric with the deepest after normalization. - blend = point - mesh + 1 - blend[lg(blend, 0)] = 0 - - blend = np.fabs(blend) - mx = np.amax(blend) - mx = mx if mx > 0.0 else 1.0 - - return blend / mx - - -def get_blend_component(indicator, lg, axis, meshes): - ''' - ''' - - point = get_indicator_bound_point(indicator, lg, axis) - if point is None: - return [] - - return [blend_component_from_point(point, meshes[axis], lg)] - - -def get_overall_blend(indicator, meshes): - ''' - ''' - - blends = [] - - for lg in (op.lt, op.gt): - for axis in (0, 1): - blends.extend(get_blend_component(indicator, lg, axis, meshes)) - - if len(blends) == 0: - return np.zeros_like(indicator) - return reduce(np.maximum, blends) - - -def get_blend(indicator_region, stup, cb=np.array): - ''' - ''' - - meshes = np.meshgrid(*map(np.arange, stup), indexing='ij') - blend = get_overall_blend(indicator_region, meshes) - - return cb(np.multiply(blend, indicator_region)) - - diff --git a/allensdk/internal/mouse_connectivity/tissuecyte_stitching/tile.py b/allensdk/internal/mouse_connectivity/tissuecyte_stitching/tile.py deleted file mode 100644 index 02772f28f2..0000000000 --- a/allensdk/internal/mouse_connectivity/tissuecyte_stitching/tile.py +++ /dev/null @@ -1,92 +0,0 @@ -import logging - -import numpy as np - - -class Tile(object): - - def __init__(self, index, image, is_missing, bounds, channel, size, margins, *args, **kwargs): - - # identifier - self.index = index - - # actual image data - self.image = image - self.is_missing = is_missing - - # parameters related to the position of the tile within a larger image - self.bounds = bounds - self.channel = channel - - # parameters related to the valid portion of the tile - self.size = size - self.margins = margins - - logging.info('tile {index} on channel {channel} starts at ({0}, {1})'.format(self.bounds['row']['start'], - self.bounds['column']['start'], - index=self.index, - channel=self.channel)) - - - def trim_self(self): - logging.info('trimming tile') - self.image = self.trim(self.image) - - - def trim(self, image): - logging.info('trimming with margins ({row}, {column})'.format(**self.margins)) - - return image[self.margins['row']: self.margins['row'] + self.size['row'], - self.margins['column']: self.margins['column'] + self.size['column']] - - - def average_tile_is_untrimmed(self, average_tile): - return average_tile.shape[0] > self.image.shape[0] \ - or average_tile.shape[1] > self.image.shape[1] - - - def apply_average_tile(self, average_tile): - - if average_tile is None: - logging.info('no average tile found for tile with index {index} on channel {channel}'.format(**self.__dict__)) - return self.image - - if self.average_tile_is_untrimmed(average_tile): - logging.info('trimming average tile') - average_tile = self.trim(average_tile) - - logging.info('applying flatfield correction to tile with index {index} on channel {channel}'.format(**self.__dict__)) - return np.multiply(self.image, average_tile) - - - def apply_average_tile_to_self(self, average_tile): - self.image = self.apply_average_tile(average_tile) - - - def get_image_region(self): - - row = self.bounds['row'] - col = self.bounds['column'] - - return [slice(row['start'], row['end']), - slice(col['start'], col['end']), - self.channel] - - - def get_missing_path(self): - - row = self.bounds['row'] - col = self.bounds['column'] - - path = [row['start'], col['start'], - row['end'], col['start'], - row['end'], col['end'], - row['start'], col['end']] - - logging.info('missing tile starts at: ({0}, {1})'.format(*path)) - return path - - - def initialize_image(self): - logging.info('initializing tile image to 0') - self.image = np.zeros((self.size['row'], self.size['column'])) diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py deleted file mode 100755 index e35ab27b0f..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/python -import os -import h5py -import sys -import shutil -import traceback -import subprocess -from six import iteritems - -import nwb -from allensdk.internal.core.lims_pipeline_module import PipelineModule - -# development/debugging code -#infile = "Ndnf-IRES2-dgCre_Ai14-256189.05.01-compressed.nwb" -#outfile = "foo.nwb" -#if len(sys.argv) == 1: -# sys.argv.append(infile) -# sys.argv.append(outfile) - -# this script is meant to clone the core functionality of the -# existing (Igor) Hdf5->Nwb converter. -# the previous converter performed two distinct tasks. In this iteration, -# those tasks will be split into separate modules. This module will -# perform the file conversion. A second module will analyze the file -# and extract sweep data - -# window for leading test pulse, in seconds -PULSE_LEN = 0.1 -EXPERIMENT_START_TIME = 0.75 - - -def main(): - module = PipelineModule() - jin = module.input_data() - - infile = jin["input_nwb"] - outfile = jin["output_nwb"] - - # a temporary nwb file must be created. this is that file's name - tmpfile = outfile + ".tmp" - - # create temp file and make modifications to it using h5py - shutil.copy2(infile, tmpfile) - f = h5py.File(tmpfile, "a") - # change dataset names in acquisition time series to match that - # of existing ephys NWB files - # also rescale the contents of 'data' fields to match the scaling - # in original files - acq = f["acquisition/timeseries"] - sweep_nums = [] - for k, v in iteritems(acq): - # parse out sweep number - try: - num = int(k[5:10]) - except: - print("Error - unexpected sweep name encountered in IGOR nwb file") - print("Sweep called: '%s'" % k) - print("Expecting 5-digit sweep number between chars 5 and 9") - sys.exit(1) - swp = "Sweep_%d" % num - # rename objects - try: - acq.move(k, swp) - ts = acq[swp] - ts.move("stimulus_description", "aibs_stimulus_description") - except: - print("*** Error renaming HDF5 object in %s" % swp) - type_, value_, traceback_ = sys.exc_info() - print(traceback.print_tb(traceback_)) - sys.exit(1) - # rescale contents of data so conversion is 1.0 - try: - data = ts["data"] - scale = float(data.attrs["conversion"]) - data[...] = data.value * scale - data.attrs["conversion"] = 1.0 - except: - print("*** Error rescaling data in %s" % swp) - type_, value_, traceback_ = sys.exc_info() - print(traceback.print_tb(traceback_)) - sys.exit(1) - # keep track of sweep numbers - sweep_nums.append("%d"%num) - - ################################### - #... ditto for stimulus time series - stim = f["stimulus/presentation"] - for k, v in iteritems(stim): - # parse out sweep number - try: - num = int(k[5:10]) - except: - print("Error - unexpected sweep name encountered in IGOR nwb file") - print("Sweep called: '%s'" % k) - print("Expecting 5-digit sweep number between chars 5 and 9") - sys.exit(1) - swp = "Sweep_%d" % num - try: - stim.move(k, swp) - except: - print("Error renaming HDF5 group from %s to %s" % (k, swp)) - sys.exit(1) - # rescale contents of data so conversion is 1.0 - try: - ts = stim[swp] - data = ts["data"] - scale = float(data.attrs["conversion"]) - data[...] = data.value * scale - data.attrs["conversion"] = 1.0 - except: - print("*** Error rescaling data in %s" % swp) - type_, value_, traceback_ = sys.exc_info() - print(traceback.print_tb(traceback_)) - sys.exit(1) - - f.close() - - #################################################################### - # re-open file w/ nwb library and add indexing (epochs) - nd = nwb.NWB(filename=tmpfile, modify=True) - for num in sweep_nums: - ts = nd.file_pointer["acquisition/timeseries/Sweep_" + num] - # sweep epoch - t0 = ts["starting_time"].value - rate = float(ts["starting_time"].attrs["rate"]) - n = float(ts["num_samples"].value) - t1 = t0 + (n-1) * rate - ep = nd.create_epoch("Sweep_" + num, t0, t1) - ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_"+num) - ep.add_timeseries("response", "acquisition/timeseries/Sweep_"+num) - ep.finalize() - if "CurrentClampSeries" in ts.attrs["ancestry"]: - # test pulse epoch - t0 = ts["starting_time"].value - t1 = t0 + PULSE_LEN - ep = nd.create_epoch("TestPulse_" + num, t0, t1) - ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_"+num) - ep.add_timeseries("response", "acquisition/timeseries/Sweep_"+num) - ep.finalize() - # experiment epoch - t0 = ts["starting_time"].value - t1 = t0 + (n-1) * rate - t0 += EXPERIMENT_START_TIME - ep = nd.create_epoch("Experiment_" + num, t0, t1) - ep.add_timeseries("stimulus", "stimulus/presentation/Sweep_"+num) - ep.add_timeseries("response", "acquisition/timeseries/Sweep_"+num) - ep.finalize() - nd.close() - - # rescaling the contents of the data arrays causes the file to grow - # execute hdf5-repack to get it back to its original size - try: - print("Repacking hdf5 file with compression") - process = subprocess.Popen(["h5repack", "-f", "GZIP=4", tmpfile, outfile], stdout=subprocess.PIPE) - process.wait() - except: - print("Unable to run h5repack on temporary nwb file") - print("--------------------------------------------") - raise - - try: - print("Removing temporary file") - os.remove(tmpfile) - except: - print("Unable to delete temporary file ('%s')" % tmpfile) - raise - - # done (nothing to return) - module.write_output_data({}) - - - -if __name__=='__main__': main() - diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py deleted file mode 100644 index f317aa07e3..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py +++ /dev/null @@ -1,524 +0,0 @@ -import logging -import sys -import numpy as np -import h5py -from six import iteritems - -from qc_support import * -from lab_notebook_reader import * - -from allensdk.internal.core.lims_pipeline_module import PipelineModule -from allensdk.core.nwb_data_set import NwbDataSet - - -# manual keys are values that can be passed in through input.json. -# these values are used if the particular value cannot be computed. -# a better name might be 'DEFAULT_VALUE_KEYS' -MANUAL_KEYS = ['manual_seal_gohm', 'manual_initial_access_resistance_mohm', 'manual_initial_input_mohm' ] - -# names of blocks used in output.json -# for sweep-specific data: -JSON_BLOCK_SWEEP_DATA = "sweep_data" -# for data that applies to the entire experiment: -JSON_BLOCK_EXPERIMENT_DATA = "experiment_data" - -######################################################################## -# bootstrapping code -# this module doesn't know anything about what's in the supplied NWB -# file and simply assumes that it's an IVSCC file. it must find and -# fetch data as appropriate -# processing requires being able to pull out sweeps of specific types. -# create an index of those types here, and provide accessor functions -# for the indexed data - - -# local globals used to avoid having to pass parameters to functions that -# can be several calls deep before they're needed -# consider refactoring into QC class to avoid this approach -sweep_stim_map = None -stim_sweep_map = None -sweep_list = None -nwb_file_name = None - -# reads the NWB file and generates a mapping between sweep name and -# stimulus code, and vice versa -def build_sweep_stim_map(): - global sweep_stim_map, stim_sweep_map, nwb_file_name, sweep_list - try: - nwb_file = h5py.File(nwb_file_name, "r") - except: - raise Exception ("Unable to open input NWB file '%s'" % str(nwb_file_name)) - print("Opened '%s'" % str(nwb_file_name)) - sweep_stim_map = {} - stim_sweep_map = {} - sweep_list = [] - acq = nwb_file["acquisition/timeseries"] - for sweep in acq: - # if string storage is variable length, data appears to be stored - # or retrieved as an array of strings, so we need to take the - # first element. this happens with Igor-generated files. - # if the string is stored with fixed length, data appears to be - # stored as a string, so we must take the entire value - stim = acq[sweep]["aibs_stimulus_description"].value[0] - if len(stim) == 1: - stim = acq[sweep]["aibs_stimulus_description"].value - stim_sweep_map[stim] = sweep - #print "%s (%s) : %s (%s)" % (sweep, type(sweep), stim, type(stim)) - sweep_stim_map[sweep] = stim - sweep_list.append(sweep) - nwb_file.close() - -# fetches stimulus code for a given sweep name, or None if no stimulus -# was found for the specified sweep -def get_sweep_name_by_stimulus_code(stim_name): - """ Returns the first sweep name that uses the specified stimulus - type. 'First' does not mean lowest sweep number, only the first - one found using a [random] dictionary search. - - Input: stimulus name (string) - - Output: sweep name (string), or None if no sweep found for this stim - """ - global sweep_stim_map - for k,v in iteritems(stim_sweep_map): - if k.startswith(stim_name): - return v - return None - - -# returns True if stimulus name for specified sweep indicates the sweep -# is a ramp and False otherwise -def sweep_is_ramp(sweep_name): - """ Input: sweep name (string) - - Output: boolean (True if sweep is ramp, False otherwise) - """ - global sweep_stim_map - return sweep_stim_map[sweep_name].startswith('C1RP') - - -# old code based on using NwbDataSet objects. provide a way to -# create them in order to leverage old code as much as possible -def get_sweep_data(sweep_name): - """ Input: sweep name (string) - - Output: NwbDataSet object - """ - global nwb_file_name - try: - num = int(sweep_name.split('_')[-1]) - except: - print("Unable to parse sweep number from '%s'" % str(sweep_name)) - raise - return NwbDataSet(nwb_file_name).get_sweep(num) - - -# functions to lookup a sweep having the desired stimulus code -# NOTE: if multiple instance exist then only one instance is returned -def get_blowout_sweep(): - """ Returns NwbDataSet for the blowout sweep, or None if it's absent - """ - sweep_name = get_sweep_name_by_stimulus_code('EXTPBLWOUT') - if sweep_name is None: - return None - return get_sweep_data(sweep_name) - -def get_bath_sweep(): - """ Returns NwbDataSet for the bath sweep, or None if it's absent - """ - sweep_name = get_sweep_name_by_stimulus_code('EXTPINBATH') - if sweep_name is None: - return None - return get_sweep_data(sweep_name) - -def get_seal_sweep(): - """ Returns NwbDataSet for the seal sweep, or None if it's absent - """ - sweep_name = get_sweep_name_by_stimulus_code('EXTPCllATT') - if sweep_name is None: - return None - return get_sweep_data(sweep_name) - -def get_breakin_sweep(): - """ Returns NwbDataSet for the breakin sweep, or None if it's absent - """ - sweep_name = get_sweep_name_by_stimulus_code('EXTPBREAKN') - if sweep_name is None: - return None - return get_sweep_data(sweep_name) - - -######################################################################## - - -######################################################################## -# QC-relevant feature extraction code - -# cell-level values (for ephys_roi_results) -def cell_level_features(jin, jout, sweep_tag_list, manual_values): - """ - """ - output_data = {} - jout[JSON_BLOCK_EXPERIMENT_DATA] = output_data - # measure blowout voltage - try: - blowout_data = get_blowout_sweep() - blowout = measure_blowout(blowout_data['response'], - blowout_data['index_range'][0]) - output_data['blowout_mv'] = blowout - except: - msg = "Blowout is not available" - sweep_tag_list.append(msg) - logging.warning(msg) - output_data['blowout_mv'] = None - - - # measure "electrode 0" - try: - bath_data = get_bath_sweep() - e0 = measure_electrode_0(bath_data['response'], - bath_data['sampling_rate']) - output_data['electrode_0_pa'] = e0 - except: - msg = "Electrode 0 is not available" - sweep_tag_list.append(msg) - logging.warning(msg) - output_data['electrode_0_pa'] = None - - - # measure clamp seal - try: - seal_data = get_seal_sweep() - seal = measure_seal(seal_data['stimulus'], - seal_data['response'], - seal_data['sampling_rate']) - # error may arise in computing seal, which falls through to - # exception handler. if seal computation didn't fail but - # computation generated invalid value, trigger same - # exception handler with different error - if seal is None or not np.isfinite(seal): - raise Exception("Could not compute seal") - except: - # seal is not available, for whatever reason. log error - msg = "Seal is not available" - sweep_tag_list.append(msg) - logging.warning(msg) - # look for manual seal value and use it if it's available - seal = manual_values.get('manual_seal_gohm', None) - if seal is not None: - logging.info("using manual seal value: %f" % seal) - sweep_tag_list.append("Seal set using manual value") - output_data["seal_gohm"] = seal - - - # measure input and series resistance - # this requires two steps -- finding the breakin sweep, and then - # analyzing it - # if the value is unavailable then check to see if it was set manually - breakin_data = None - try: - breakin_data = get_breakin_sweep() - except: - logging.warning("Error reading breakin sweep.") - sweep_tag_list.append("Breakin sweep not found") - - ir = None # input resistance - sr = None # series resistance - if breakin_data is not None: - ########################### - # input resistance - try: - ir = measure_input_resistance(breakin_data['stimulus'], - breakin_data['response'], - breakin_data['sampling_rate']) - except: - logging.warning("Error reading input resistance.") - # apply manual value if it's available - if ir is None: - sweep_tag_list.append("Input resistance is not available") - ir = manual_values.get('manual_initial_input_mohm', None) - if ir is not None: - msg = "Using manual value for input resistance" - logging.info(msg) - sweep_tag_list.append(msg); - ########################### - # initial access resistance - try: - sr = measure_initial_access_resistance(breakin_data['stimulus'], - breakin_data['response'], - breakin_data['sampling_rate']) - except: - logging.warning("Error reading initial access resistance.") - # apply manual value if it's available - if sr is None: - sweep_tag_list.append("Initial access resistance is not available") - sr = manual_values.get('manual_initial_access_resistance_mohm', None) - if sr is not None: - msg = "Using manual initial access resistance" - logging.info(msg) - sweep_tag_list.append(msg) - # - output_data['input_resistance_mohm'] = ir - output_data["initial_access_resistance_mohm"] = sr - - sr_ratio = None # input access resistance ratio - if ir is not None and sr is not None: - try: - sr_ratio = sr / ir - except: - pass # let sr_ratio stay as None - output_data['input_access_resistance_ratio'] = sr_ratio - - -############################## -def sweep_level_features(jin, jout, sweep_tag_list): - """ - """ - global sweep_list - # pull out features from each sweep (for ephys_sweeps) - cnt = 0 - jout[JSON_BLOCK_SWEEP_DATA] = {} - for sweep_name in sweep_list: - # pull data streams from file - sweep_num = int(sweep_name.split('_')[-1]) - try: - sweep_data = NwbDataSet(nwb_file_name).get_sweep(sweep_num) - except: - logging.warning("Error reading sweep %d" % sweep_num) - continue - sweep = {} - jout[JSON_BLOCK_SWEEP_DATA][sweep_name] = sweep - - # don't process voltage clamp sweeps - if sweep_data["stimulus_unit"] == "Volts": - continue # voltage-clamp - - volts = sweep_data['response'] - current = sweep_data['stimulus'] - hz = sweep_data['sampling_rate'] - idx_start, idx_stop = sweep_data['index_range'] - - # measure Vm and noise before stimulus - idx0, idx1 = get_first_vm_noise_epoch(idx_start, current, hz) - _, rms0 = measure_vm(1e3 * volts[idx0:idx1]) - - sweep["pre_noise_rms_mv"] = float(rms0) - - # measure Vm and noise at end of recording - # only do so if acquisition not truncated - # do not check for ramps, because they do not have enough time to recover - mean1 = None - sweep_not_truncated = ( idx_stop == len(current) - 1 ) - if sweep_not_truncated and not sweep_is_ramp(sweep_name): - idx0, idx1 = get_last_vm_epoch(idx_stop, current, hz) - mean1, _ = measure_vm(1e3 * volts[idx0:idx1]) - idx0, idx1 = get_last_vm_noise_epoch(idx_stop, current, hz) - _, rms1 = measure_vm(1e3 * volts[idx0:idx1]) - sweep["post_vm_mv"] = float(mean1) - sweep["post_noise_rms_mv"] = float(rms1) - - # measure Vm and noise over extended interval, to check stability - stim_start = find_stim_start(idx_start, current) - sweep['stimulus_start_time'] = stim_start / sweep_data['sampling_rate'] - - idx0, idx1 = get_stability_vm_epoch(idx_start, stim_start, hz) - mean2, rms2 = measure_vm(1000 * volts[idx0:idx1]) - - slow_noise = float(rms2) - sweep["slow_vm_mv"] = float(mean2) - sweep["slow_noise_rms_mv"] = float(rms2) - - # for now (mid-feb 15), make vm_mv the same for pre and slow - mean0 = mean2 - sweep["pre_vm_mv"] = float(mean0) - if mean1 is not None: - delta = abs(mean0 - mean1) - sweep["vm_delta_mv"] = float(delta) - else: - # Use None as 'nan' still breaks the ruby strategies - sweep["vm_delta_mv"] = None - - # compute stimulus duration, amplitude, interal - stim_amp, stim_dur = find_stim_amplitude_and_duration(idx_start, current, hz) - stim_int = find_stim_interval(idx_start, current, hz) - - sweep['stimulus_amplitude'] = stim_amp * 1e12 - sweep['stimulus_duration'] = stim_dur - sweep['stimulus_interval'] = stim_int - - tag_list = [] - for i in range(len(sweep_tag_list)): - tag = {} - tag["name"] = sweep_tag_list[i] - tag_list.append(tag) - sweep["ephys_sweep_tags"] = tag_list - - -# create a summary table of sweeps and stimuli -def summarize_sweeps(jin, jout): - global nwb_file_name - # build stimulus name map - stim_type_name_map = {} - for group_name, raw_names in iteritems(jin["ephys_raw_stimulus_names"]): - for n in raw_names: - stim_type_name_map[n] = group_name - - h5_file_name = jin.get("input_h5", None) - notebook = create_lab_notebook_reader(nwb_file_name, h5_file_name) - borg = h5py.File(nwb_file_name, 'r') - - # two json blocks to store data in - exp_data = jout[JSON_BLOCK_EXPERIMENT_DATA] - swp_data = jout[JSON_BLOCK_SWEEP_DATA] - #jout["sweep_summary"] = output_data - -# # verify input file generated by Igor -# generated_by = borg["general/generated_by"].value -# igor = False -# for row in generated_by: -# if row[0] == "Program" and row[1].startswith('Igor'): -# igor = True -# break -# if not igor: -# print("Error -- File not recognized as Igor-generated NWB file") -# return -1 - - # validated nwb files can have different types of string storage - # problem seems to be related to h5py and if string is stored as - # fixed- or variable-width. assume that string is more than one - # character and try to auto-correct for this issue - session_date = borg["session_start_time"].value - if len(session_date) == 1: - session_date = session_date[0] - exp_data['recording_date'] = session_date - - # get sampling rate - # use same output strategy as h5-nwb converter - # pick the sampling rate from the first iclamp sweep - # TODO: figure this out for multipatch - sampling_rate = None - for sweep_name in borg["acquisition/timeseries"]: - sweep_ts = borg["acquisition/timeseries"][sweep_name] - ancestry = sweep_ts.attrs["ancestry"] - if "CurrentClamp" in ancestry[-1]: - if sampling_rate is None: - sampling_rate = sweep_ts["starting_time"].attrs["rate"] - break - if sampling_rate is None: - raise Exception("Unable to determine sampling rate from current clamp sweep.") - exp_data['sampling_rate'] = sampling_rate -# sweep_data = [] -# output_data["sweep_summary"] = sweep_data - - # read sweep-specific data - for sweep_name in borg["acquisition/timeseries"]: - # get h5 timeseries object, and the sweep number - sweep_ts = borg["acquisition/timeseries"][sweep_name] - sweep_num = int(sweep_name.split('_')[-1]) - #sweep_num = int(sweep_name[:-4].split('_')[-1]) # for reading igor nwb - # fetch stim name from lab notebook - stim_name = notebook.get_value("Stim Wave Name", sweep_num, "") - if len(stim_name) == 0: - raise Exception("Could not read stimulus wave name from lab notebook for sweep %d" % sweep_num) - - # stim units are based on timeseries type - ancestry = sweep_ts.attrs["ancestry"] - if "CurrentClamp" in ancestry[-1]: - stim_units = 'pA' - elif "VoltageClamp" in ancestry[-1]: - stim_units = 'mV' - else: - # it's probably OK to skip this sweep and put a 'continue' - # here instead of an exception, but wait until there's - # an actual error and investigate the data before doing so - raise Exception("Unable to determine clamp mode in " + sweep_name) - - # stim name stored in database as, eg, C2SSTRIPLE150429 - # stim name in igor nwb stored as C2SSTRIPLE150429_DA_0 - # -> need to strip last 5 chars off to make match for lookup - stim_type_name = stim_type_name_map.get(stim_name[:-5], None) - if stim_type_name is None: - raise Exception("Could not find stimulus raw name (\"%s\") for sweep %d." % (stim_name, sweep_num)) - - # voltage-clamp sweeps shouldn't have a record yet -- make one - if sweep_name not in swp_data: - swp_data[sweep_name] = {} - info = swp_data[sweep_name] - - # sweep number - info["sweep_number"] = sweep_num - # bridge balance - bridge_balance = notebook.get_value("Bridge Bal Value", sweep_num, None) - # IT-14677 - # if bridge_balance is None, that's OK. do NOT change it to NaN - - info["bridge_balance_mohm"] = bridge_balance - # stimulus units - info["stimulus_units"] = stim_units - # leak_pa (bias current) - bias_current = notebook.get_value("I-Clamp Holding Level", sweep_num, None) - # IT-14677 - # if bias_current is None, that's OK. do NOT change it to NaN - - info["leak_pa"] = bias_current - # - # ephys stim info - scale_factor = notebook.get_value("Scale Factor", sweep_num, None) - if scale_factor is None: - raise Exception("Unable to read scale factor for " + sweep_name) - # PBS-229 change stim name by appending set_sweep_count - cnt = notebook.get_value("Set Sweep Count", sweep_num, 0) - stim_name_ext = stim_name.split('_')[0] + "[%d]" % int(cnt) - info["ephys_stimulus"] = { - #'description': stim_name, - 'description': stim_name_ext, - 'amplitude': scale_factor, - 'ephys_stimulus_type': { 'name': stim_type_name } - } - # - borg.close() - - -######################################################################## -######################################################################## - - -def main(jin): - # to avoid passing arguments amongs the many functions and procedures, - # set a global value 'nwb_file_name' that each function can read - global nwb_file_name - nwb_file_name = jin["input_nwb"] - - # initialize index of stimuli and sweeps - build_sweep_stim_map() - - # TODO Document manual keys, and what they're for - manual_values = {} - for k in MANUAL_KEYS: - if k in jin: - manual_values[k] = jin[k] - - # dictionary for json output - jout = {} - - # list of messages (tags) that log information about this sweep set - # (eg, 'Seal not available') - sweep_tag_list = [] - - cell_level_features(jin, jout, sweep_tag_list, manual_values) - # sweep level data. first pull out QC-relevant metrics, then store - # stimulus info with that data - sweep_level_features(jin, jout, sweep_tag_list) - summarize_sweeps(jin, jout) - - return jout - - - -if __name__ == "__main__": - # read module input. PipelineModule object automatically parses the - # command line to pull out input.json and output.json file names - module = PipelineModule() - jin = module.input_data() # loads input.json - jout = main(jin) - module.write_output_data(jout) # writes output.json diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py deleted file mode 100755 index 07b1102e4b..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/python -import sys, logging -import os -import json -import shutil -import argparse -import copy -import numpy as np -import shutil - -from allensdk.config.manifest import Manifest - -import allensdk.internal.core.lims_utilities as lims_utilities -import allensdk.core.json_utilities as json_utilities - -from allensdk.internal.ephys.core_feature_extract import * -from allensdk.ephys.ephys_features import FeatureError - - -def parse_args(): - parser = argparse.ArgumentParser() - parser.add_argument('input_json') - parser.add_argument('output_json') - parser.add_argument('--log_level') - parser.add_argument('--output_directory') - - args = parser.parse_args() - - if args.log_level: - logging.getLogger().setLevel(args.log_level) - - return args - -def main(): - args = parse_args() - - input_data = json_utilities.read(args.input_json) - input_err, stim_types = input_data - - output_data = copy.deepcopy(input_err) - - err_wkfs = output_data['well_known_files'] - nwb_file = lims_utilities.get_well_known_file_by_type(err_wkfs, lims_utilities.NWB_FILE_TYPE_ID) - storage_directory = args.output_directory or output_data['storage_directory'] - # move code to help make data extraction compatible with ephys qc tool - try: - sweep_list, sweep_features = extract_data(output_data, nwb_file) - except FeatureError as e: - logging.error("Error computing cell features, auto-failing cell: %s" % e.message) - output_data["workflow_state"] = "auto_failed" - json_utilities.write(args.output_json, output_data) - return - # - - # embed spike times in NWB file - logging.debug("Embedding spike times") - tmp_nwb_file = os.path.join(storage_directory, os.path.basename(nwb_file) + '.tmp') - out_nwb_file = os.path.join(storage_directory, os.path.basename(nwb_file)) - - shutil.copy(nwb_file, tmp_nwb_file) - for sweep in sweep_list: - sweep_num = sweep['sweep_number'] - - if sweep_num not in sweep_features: - continue - - try: - spikes = sweep_features[sweep_num]['spikes'] - spike_times = [ s['threshold_t'] for s in spikes ] - NwbDataSet(tmp_nwb_file).set_spike_times(sweep_num, spike_times) - except Exception as e: - logging.info("sweep %d has no sweep features. %s", sweep_num, e.message) - - try: - shutil.move(tmp_nwb_file, out_nwb_file) - except OSError as e: - logging.error("Problem renaming file: %s -> %s" % (tmp_nwb_file, out_nwb_file)) - raise e - - qc_fig_dir = os.path.join(storage_directory, 'qc_figures') - save_qc_figures(qc_fig_dir, nwb_file, output_data, True) - - # regenerating this file - features_json = os.path.join(storage_directory, "%d_ephys_features.json" % output_data['id']) - json_utilities.write(features_json, output_data) - lims_utilities.append_well_known_file(output_data['well_known_files'], features_json) - - # write output json files - json_utilities.write(args.output_json, output_data) - - -if __name__ == "__main__": - main() diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py deleted file mode 100644 index 951eced637..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py +++ /dev/null @@ -1,181 +0,0 @@ -import h5py -import math - -class LabNotebookReader(object): - def __init__(self): - self.register_enabled_names() - - # mapping of notebook keys to keys representing if that value is - # enabled - # move this to subclasses if/when key names diverge - def register_enabled_names(self): - self.enabled = {} - self.enabled["V-Clamp Holding Level"] = "V-Clamp Holding Enable" - self.enabled["RsComp Bandwidth"] = "RsComp Enable" - self.enabled["RsComp Correction"] = "RsComp Enable" - self.enabled["RsComp Prediction"] = "RsComp Enable" - self.enabled["Whole Cell Comp Cap"] = "Whole Cell Comp Enable" - self.enabled["Whole Cell Comp Resist"] = "Whole Cell Comp Enable" - self.enabled["I-Clamp Holding Level"] = "I-Clamp Holding Enable" - self.enabled["Neut Cap Value"] = "Neut Cap Enable" - self.enabled["Bridge Bal Value"] = "Bridge Bal Enable" - - - # lab notebook has two sections, one for numeric data and the other - # for text data. this is an internal function to fetch data from - # the numeric part of the notebook - def get_numeric_value(self, name, data_col, sweep_col, enable_col, sweep_num, default_val): - data = self.val_number - # val_number has 3 dimensions -- the first has a shape of - # (#fields * 9). there are many hundreds of elements in this - # dimension. they look to represent the full array of values - # (for each field for each multipatch) for a given point in - # time, and thus given sweep - # according to Thomas Braun (igor nwb dev), the first 8 pages are - # for headstage data, and the 9th is for headstage-independent - # data - # return value is last non-empty entry in specified column - # for specified sweep number - return_val = default_val - for sample in data: - swp = sample[sweep_col][0] - if math.isnan(swp): - continue - if int(swp) == sweep_num: - if enable_col is not None and sample[enable_col][0] != 1.0: - continue # 'enable' flag present and it's turned off - val = sample[data_col][0] - if not math.isnan(val): - return_val = val - return return_val - - # internal function for fetching data from the text part of the notebook - def get_text_value(self, name, data_col, sweep_col, enable_col, sweep_num, default_val): - data = self.val_text - # algorithm mirrors get_numeric_value - # return value is last non-empty entry in specified column - # for specified sweep number - return_val = default_val - for sample in data: - swp = sample[sweep_col][0] - if len(swp) == 0: - continue - if int(swp) == int(sweep_num): - if enable_col is not None: # and sample[enable_col][0] != 1.0: - # this shouldn't happen, but if it does then bitch - # as this situation hasn't been tested (eg, is - # enabled indicated by 1.0, or "1.0" or "true" or ??) - Exception("Enable flag not expected for text values") - #continue # 'enable' flag present and it's turned off - val = sample[data_col][0] - if len(val) > 0: - return_val = val - return return_val - - # looks for key in lab notebook and returns the value associated with - # the specified sweep, or the default value if no value is found - # (NaN and empty strings are considered to be non-values) - def get_value(self, name, sweep_num, default_val): - # name_number has 3 dimensions -- the first has shape - # (#fields * 9) and stores the key names. the second looks - # to store units for those keys. The third is numeric text - # but it's role isn't clear - numeric_fields = self.colname_number[0] - text_fields = self.colname_text[0] - # val_number has 3 dimensions -- the first has a shape of - # (#fields * 9). there are many hundreds of elements in this - # dimension. they look to represent the full array of values - # (for each field for each multipatch) for a given point in - # time, and thus given sweep - if name in numeric_fields: - sweep_idx = numeric_fields.tolist().index("SweepNum") - enable_idx = None - if name in self.enabled: - enable_col = self.enabled[name] - enable_idx = numeric_fields.tolist().index(enable_col) - field_idx = numeric_fields.tolist().index(name) - return self.get_numeric_value(name, field_idx, sweep_idx, enable_idx, sweep_num, default_val) - elif name in text_fields: - # first check to see if file includes old version of column name - if "Sweep #" in text_fields: - sweep_idx = text_fields.tolist().index("Sweep #") - else: - sweep_idx = text_fields.tolist().index("SweepNum") - enable_idx = None - if name in self.enabled: - enable_col = self.enabled[name] - enable_idx = text_fields.tolist().index(enable_col) - field_idx = text_fields.tolist().index(name) - return self.get_text_value(name, field_idx, sweep_idx, enable_idx, sweep_num, default_val) - else: - return default_val - - - -""" Loads lab notebook data out of a first-generation IVSCC NWB file, - that was manually translated from the IGOR h5 dump. - Notebook data can be read through get_value() function -""" -class LabNotebookReaderIvscc(LabNotebookReader): - def __init__(self, nwb_file, h5_file): - LabNotebookReader.__init__(self) - # for lab notebook, select first group - h5 = h5py.File(h5_file, "r") - # - # TODO FIXME check notebook version... but how? - # - notebook = h5["MIES/LabNoteBook/ITC18USB/Device0"] - # load column data into memory - self.colname_number = notebook["KeyWave/keyWave"].value - self.val_number = notebook["settingsHistory/settingsHistory"].value - self.colname_text = notebook["TextDocKeyWave/txtDocKeyWave"].value - self.val_text = notebook["textDocumentation/txtDocWave"].value - h5.close() - - - -######################################################################## -######################################################################## -""" Loads lab notebook data out of an Igor-generated NWB file. - Module input is the name of the nwb file. - Notebook data can be read through get_value() function -""" -class LabNotebookReaderIgorNwb(LabNotebookReader): - def __init__(self, nwb_file): - LabNotebookReader.__init__(self) - # for lab notebook, select first group - # NOTE this probably won't work for multipatch - h5 = h5py.File(nwb_file, "r") - # - # TODO FIXME check notebook version - # - for k in h5["general/labnotebook"]: - notebook = h5["general/labnotebook"][k] - break - # load column data into memory - self.val_text = notebook["textualValues"].value - self.colname_text = notebook["textualKeys"].value - self.val_number = notebook["numericalValues"].value - self.colname_number = notebook["numericalKeys"].value - h5.close() - # - self.register_enabled_names() - - - -# creates LabNotebookReader appropriate to ivscc-NWB file version -def create_lab_notebook_reader(nwb_file, h5_file=None): - pass - h5 = h5py.File(nwb_file, "r") - if "general/labnotebook" in h5: - version = "IgorNwb" - else: - version = "IgorH5" - h5.close() - if version == "IgorNwb": - return LabNotebookReaderIgorNwb(nwb_file) - elif version == "IgorH5": - return LabNotebookReaderIvscc(nwb_file, h5_file) - else: - Exception("Unable to determine NWB input type") - diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_metadata.yml b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_metadata.yml deleted file mode 100644 index 67abc15cb5..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_metadata.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- - general: - # identifier is a unique string between files - # <ID> is ephys_roi_results_id - identifier: "Allen Institute for Brain Science, Ephys Result <ID>" - electrode_description: "Borosilicate glass with a resistance of 3-7 MOhm. See http://help.brain-map.org/display/celltypes/Documentation" - electrode_resistance: "3-7 MOhm" - electrode_filtering: "Bessel filter at 10KHz" - electrode_device: "please see http://help.brain-map.org/display/celltypes/Documentation" - electrode_slice: "please see http://help.brain-map.org/display/celltypes/Documentation" - institution: "Allen Institute for Brain Science" - institution_url: "http://alleninstitute.org" - - experiment_description: "Current-clamp recording from Allen Institute cell types project" - - session_id_details: "session_id value corresponds to ephys_result_id" - - citation_policy: "Please see http://www.alleninstitute.org/legal/citation-policy/" - protocol: "please see http://help.brain-map.org/display/celltypes/Documentation" - - subject: "Mus musculus In Vitro" - - sweep_data: - voltage_clamp_recording_description: "Voltage-clamp recording" - current_clamp_recording_description: "Current-clamp recording" - - # MODE is 'Voltage' or 'Current', STIM is stimulus short name (eg, 'short square') - patch_clamp_stimulus_description: "<MODE> clamp stimulus using <STIM> stimulus" - - epochs: - # STIM is stimulus long name - # SWEEP is sweep name - # AMP is stimulus amplitude - # UNIT is stimulus units - epoch_sweep_description: "Full recording interval for one stimulus, including test pulse and experiment interval. Stimulus was <STIM>, <AMP> <UNIT>" - epoch_testpulse_description: "Test pulse for <SWEEP>" - epoch_experiment_description: "Experiment stimulus and response for <SWEEP>. Stimulus was <STIM>, <AMP> <UNIT>" - diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py deleted file mode 100755 index ad50ec72c7..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py +++ /dev/null @@ -1,667 +0,0 @@ -import logging -import sys -import os -import h5py -import subprocess -import shutil -import numpy as np -import traceback -import nwb.nwb as nwb -import nwb.nwbco as nwbco -import resource_file -from collections import defaultdict -from six import iteritems - -from allensdk.core.nwb_data_set import NwbDataSet -import allensdk.ephys.extract_cell_features as extract_cell_features - -from allensdk.internal.core.lims_pipeline_module import PipelineModule - -# changes -""" -added to main block: - "nwb_file": "igor_converted_256189.05.01.nwb", - "publish_nwb": "to_publish.nwb", - "metadata_file": "nwb_metadata.yml", - - -""" - -local_dir = os.path.dirname(os.path.realpath(__file__)) -if not local_dir.endswith('/'): - local_dir += '/' - - -ELECTRODE_NAME = "Electrode 1" -ELECTRODE_PATH = "/general/intracellular_ephys/" + ELECTRODE_NAME - -PIPELINE_NAME = "IVSCC" -PIPELINE_VERSION = "1.0" - -def copy_val(old_ts, new_ts, name): - if name in old_ts: - val = old_ts[name].value - attrs = {} - for x in old_ts[name].attrs: - # these are handled by nwb-api natively, no need to copy manually - if x in [ "neurodata_type", "unit", "units" ]: - continue - attrs[x] = old_ts[name].attrs[x] - new_ts.set_value(name, val, **attrs) - -def copy_timeseries(timeseries, old_file, new_file, folder, metadata): - try: - name = "" - for name in timeseries: - old_ts = old_file[folder][name] - family = old_ts.attrs["ancestry"] - if family[-1] == "VoltageClampSeries": - family = family[-1] - category = "acquisition" - elif family[-1] == "CurrentClampSeries": - family = family[-1] - category = "acquisition" - elif family[-1] == "VoltageClampStimulusSeries": - family = family[-1] - category = "stimulus" - elif family[-1] == "CurrentClampStimulusSeries": - family = family[-1] - category = "stimulus" - else: - raise Exception("Time series '%s' is of unknown type" % name) - new_ts = new_file.create_timeseries(family, name, category) - # copy data - num_samples = old_ts["num_samples"].value - data = old_ts["data"].value - conversion = old_ts["data"].attrs["conversion"] - resolution = old_ts["data"].attrs["resolution"] - - # newer experiments use the "unit" attribute - if "unit" in old_ts["data"].attrs: - unit = old_ts["data"].attrs["unit"] - elif "units" in old_ts["data"].attrs: - # older experiments put this in "units" - unit = old_ts["data"].attrs["units"] - - new_ts.set_data(data, conversion=conversion, resolution=resolution, unit=unit) - - start_time = old_ts["starting_time"].value - sampling_rate = old_ts["starting_time"].attrs["rate"] - new_ts.set_time_by_rate(start_time, sampling_rate) - new_ts.set_value("num_samples", num_samples) - - description = old_ts.attrs["description"] - try: - comments = old_ts.attrs["comments"] - except: - comments = old_ts.attrs["comment"] - source = old_ts.attrs["source"] - new_ts.set_value("comments", comments) - new_ts.set_value("description", description) - new_ts.set_value("source", source) - - copy_val(old_ts, new_ts, "electrode_name") - copy_val(old_ts, new_ts, "capacitance_fast") - copy_val(old_ts, new_ts, "capacitance_slow") - copy_val(old_ts, new_ts, "resistance_comp_bandwidth") - copy_val(old_ts, new_ts, "resistance_comp_correction") - copy_val(old_ts, new_ts, "resistance_comp_prediction") - copy_val(old_ts, new_ts, "whole_cell_capaictance_comp") - copy_val(old_ts, new_ts, "whole_cell_series_resistance_comp") - copy_val(old_ts, new_ts, "bias_current") - copy_val(old_ts, new_ts, "bridge_balance") - copy_val(old_ts, new_ts, "capacitance_compensation") - copy_val(old_ts, new_ts, "stimulus_description") - # - new_ts.finalize() - except: - print("** Error copying timeseries data **") - print("** Timeseries: " + str(name)) - print("** Folder: " + folder) - print("-----------------------------------") - raise - -def copy_epochs(timeseries, old_file, new_file, folder): - try: - for name in timeseries: - anc = old_file["acquisition/timeseries/"+name].attrs["ancestry"] - if anc[-1] == "VoltageClampSeries": - continue - num = int(name.split('_')[-1]) - # experiment block - epname = "Experiment_%d" % num - ep = old_file["epochs/%s" % epname] - start = ep["start_time"].value - stop = ep["stop_time"].value - desc = ep["description"].value - ep = new_file.create_epoch(epname, start, stop) - ep.set_value("description", desc) - ep.add_timeseries("stimulus", "/stimulus/presentation/Sweep_%d" % num) - ep.add_timeseries("response", "/acquisition/timeseries/Sweep_%d" % num) - ep.finalize() - # test-pulse block - epname = "TestPulse_%d" % num - ep = old_file["epochs/%s" % epname] - start = ep["start_time"].value - stop = ep["stop_time"].value - desc = ep["description"].value - ep = new_file.create_epoch(epname, start, stop) - ep.set_value("description", desc) - ep.add_timeseries("stimulus", "/stimulus/presentation/Sweep_%d" % num) - ep.add_timeseries("response", "/acquisition/timeseries/Sweep_%d" % num) - ep.finalize() - # sweep block - epname = name - ep = old_file["epochs/%s" % epname] - start = ep["start_time"].value - stop = ep["stop_time"].value - desc = ep["description"].value - ep = new_file.create_epoch(epname, start, stop) - ep.set_value("description", desc) - ep.add_timeseries("stimulus", "/stimulus/presentation/Sweep_%d" % num) - ep.add_timeseries("response", "/acquisition/timeseries/Sweep_%d" % num) - ep.finalize() - - except: - print("** Error copying epoch data **") - print("------------------------------") - raise - - -def copy_file(infile, outfile, passing_sweeps, rsrc, metadata): - print("Opening '%s'" % infile) - old = h5py.File(infile, 'r') - # top-level data - try: - vargs = {} - vargs["identifier"] = old["identifier"].value[0] + ".edit" - vargs["start_time"] = old["session_start_time"].value[0] - vargs["description"] = old["session_description"].value[0] - vargs["overwrite"] = True - vargs["filename"] = outfile - vargs["auto_compress"] = True - except: - print("** Error extracting top-level metadata from input file **") - print("---------------------------------------------------------") - raise - - print("Creating '%s'" % outfile) - try: - out = nwb.NWB(**vargs) - except: - print("** Error creating output file '%s' **" % outfile) - print("---------------------------------------------------------") - raise - - # make list of time series - timeseries = [] - try: - acq = old["acquisition/timeseries"] - for ts in acq: - timeseries.append(ts) - except: - print("** Error extracting timeseries list **") - print("--------------------------------------") - raise - - ts_list = [] - # TODO remove items from list that are not to be copied - for num in passing_sweeps: - swp = "Sweep_%d" % num - for name in timeseries: - if name == swp: - ts_list.append(swp) - break - timeseries = ts_list - - # copy acquisition time series from source to destination files - copy_timeseries(timeseries, old, out, "acquisition/timeseries", metadata) - copy_timeseries(timeseries, old, out, "stimulus/presentation", metadata) - - copy_epochs(timeseries, old, out, "stimulus/presentation") - - write_metadata(out, rsrc, metadata) - - out.close() - -def organize_metadata(ephys_roi_result): - metadata = { 'sweeps': {} } - - cell_specimen = ephys_roi_result['specimens'][0] - slice_specimen = ephys_roi_result['specimen'] - - metadata['donor_id'] = cell_specimen['donor_id'] - metadata['specimen_name'] = cell_specimen['name'] - metadata['specimen_id'] = cell_specimen['id'] - try: - metadata['species'] = slice_specimen['donor']['organism']["name"] - except Exception as e: - logging.error("Unable to read organism name from input.json file") - raise - - # structure - try: - structure = cell_specimen['structure'] - except Exception as e: - logging.error("Cell has no structure association.") - raise - - soma_location = {} - - db_cell_soma_location = cell_specimen['cell_soma_locations'][0] - soma_location = {} - try: - soma_location['cell_soma_location_x'] = 1e-9 * db_cell_soma_location['x'] - soma_location['cell_soma_location_y'] = 1e-9 * db_cell_soma_location['y'] - soma_location['cell_soma_location_z'] = 1e-9 * db_cell_soma_location['z'] - nd = db_cell_soma_location['normalized_depth'] - if nd is not None: - soma_location['cell_soma_location_normalized_depth'] = nd - except Exception as e: - logging.error(e.message) - raise - - structure_info = {} - try: - structure_info['structure_id'] = structure['id'] - structure_info['structure_name'] = structure['name'] - structure_info['structure_acronym'] = structure['acronym'] - except Exception as e: - logging.error("Structure information is missing from input.json") - raise - - structure_info.update(soma_location) - metadata['location'] = structure_info - - - tags = cell_specimen["specimen_tags"] - - dend_trunc = None - dend_type = None - for i in range(len(tags)): - name = tags[i]["name"] - toks = name.split(" - ") - if len(toks) != 2: - continue - if name.startswith("apical"): - dend_trunc = toks[1] - elif name.startswith("dendrite type"): - dend_type = toks[1] - - if dend_trunc is None: - raise Exception("Cell has no dendrite truncation tag.") - - if dend_type is None: - raise Exception("Cell has no dendrite type tag.") - - metadata['dendrite_type'] = dend_type - metadata['dendrite_trunc'] = dend_trunc - - metadata['ephys_roi_result_id'] = ephys_roi_result['id'] - metadata['seal_gohm'] = ephys_roi_result['seal_gohm'] - metadata['initial_access_resistance_mohm'] = ephys_roi_result['initial_access_resistance_mohm'] - - slice_specimen = ephys_roi_result['specimen'] - donor = slice_specimen['donor'] - - # gender - try: - metadata['gender'] = donor['gender']['name'] - except Exception as e: - logging.error("Donor requires gender association.") - raise - - # age - try: - age = donor['age'] - except Exception as e: - logging.error("Donor requires age association.") - raise - - metadata['age'] = { - 'date_of_birth': donor['date_of_birth'], - 'name': age['name'] - } - - - # cre line and genotype are mouse-only - if metadata['species'] == 'Mus musculus': - genotypes = donor['genotypes'] - - try: - reporter_genotype = next( g for g in genotypes if g['genotype_type_id'] == 177835595 ) - metadata['cre_line'] = reporter_genotype['name'] - except Exception as e: - logging.error("Could not find reporter genotype for mouse cell") - raise - - metadata['genotype'] = { - 'description': [ g['description'] for g in genotypes ], - 'type': [ g['name'] for g in genotypes ] - } - else: - logging.info("non-mouse cells do not have cre line or genotypes") - - # subject - metadata['subject'] = { - 'subject_id': cell_specimen['donor_id'], - 'comments': 'subject_id value here corresponds to Allen Institute cell specimen "donor_id"' - } - - # sweeps - sweeps = cell_specimen['ephys_sweeps'] - for sweep in sweeps: - if "invalid" in sweep and sweep["invalid"]: - logging.debug("skipping sweep %d, invalid" % sweep['sweep_number']) - continue - wfs = sweep['workflow_state'] - if wfs not in [ 'manual_passed', 'auto_passed' ]: - logging.debug("skipping sweep %d, not passed" % sweep['sweep_number']) - continue - - stimulus = sweep['ephys_stimulus'] - stimulus_type = stimulus['ephys_stimulus_type'] - - - metadata['sweeps'][sweep['sweep_number']] = { - 'stimulus_name': stimulus['description'], - 'stimulus_interval': sweep['stimulus_interval'], - 'stimulus_amplitude': sweep['stimulus_amplitude'], - 'stimulus_type_name': stimulus_type['name'], - 'stimulus_units': sweep["stimulus_units"] - } - - # IT-12498 add additional metadata to NWB file - url = "http://help.brain-map.org/display/celltypes/Documentation" - metadata["data_collection"] = "please see " + url - metadata["protocol"] = "please see " + url - metadata["pharmacology"] = "please see " + url - metadata["citation_policy"] = "please see " + url - metadata["institution"] = "Allen Institute for Brain Science" - metadata["generated_by"] = ["pipeline", PIPELINE_NAME, "version", PIPELINE_VERSION] - - return metadata - - -def write_metadata(nwb_file, resources, metadata): - nwb_file.set_metadata(nwbco.SEX, metadata['gender']) - if 'cre_line' in metadata: - nwb_file.set_metadata("aibs_cre_line", metadata['cre_line']) - - if 'genotype' in metadata: - genotype = metadata['genotype'] - genotype_name = '; '.join(genotype['type']) - nwb_file.set_metadata(nwbco.GENOTYPE, genotype_name, **genotype) - - nwb_file.set_metadata('generated_by', metadata['generated_by']) - - subject = metadata['subject'] - nwb_file.set_metadata(nwbco.SUBJECT, resources.get("subject"), **subject) - - age = metadata['age'] - nwb_file.set_metadata(nwbco.AGE, age['name'], **age) - - trode = ELECTRODE_NAME - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_DESCRIPTION(trode), resources.get("electrode_description")) - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_FILTERING(trode), resources.get("electrode_filtering")) - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_DEVICE(trode), resources.get("electrode_device")) - - location = metadata['location'] - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_LOCATION(trode), location['structure_name'], **location) - - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_RESISTANCE(trode), resources.get("electrode_resistance")) - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_SLICE(trode), resources.get("electrode_slice")) - - seal_gohm = str(metadata['seal_gohm']) - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_SEAL(trode), seal_gohm + " GOhm") - - acc = str(metadata["initial_access_resistance_mohm"]) - nwb_file.set_metadata(nwbco.INTRA_ELECTRODE_INIT_ACCESS_RESISTANCE(trode), acc + " MOhm") - - session = { 'comments': 'session_id value corresponds to ephys_result_id' } - nwb_file.set_metadata(nwbco.SESSION_ID, str(metadata['ephys_roi_result_id']), **session) - - nwb_file.set_metadata("aibs_specimen_name", metadata['specimen_name']) - nwb_file.set_metadata("aibs_specimen_id", str(metadata['specimen_id'])) - - nwb_file.set_metadata("aibs_dendrite_type", metadata['dendrite_type']) - nwb_file.set_metadata("aibs_dendrite_trunc", metadata['dendrite_trunc']) - - # IT-12498 add additional metadata to NWB file - nwb_file.set_metadata(nwbco.DATA_COLLECTION, metadata["data_collection"]) - nwb_file.set_metadata(nwbco.INSTITUTION, metadata["institution"]) - nwb_file.set_metadata(nwbco.PROTOCOL, metadata["protocol"]) - nwb_file.set_metadata(nwbco.PHARMACOLOGY, metadata["pharmacology"]) - nwb_file.set_metadata("citation_policy", metadata["citation_policy"]) - nwb_file.set_metadata(nwbco.SPECIES, metadata['species']) - - - -def main(jin): - infile = jin[0]["nwb_file"] - outfile = jin[0]["publish_nwb"] - - tmpfile = outfile + ".working" - metafile = local_dir + jin[0]["metadata_file"] - # load metadata stored in YML file - metadata_desc_file = os.path.join(os.path.dirname(__file__), metafile) - rsrc = resource_file.ResourceFile() - rsrc.load(metadata_desc_file) - - # - metadata = organize_metadata(jin[0]) - - # TODO dig deeper here - # only fetching metadata for passing sweeps - passing_sweeps = metadata['sweeps'].keys() - - copy_file(infile, outfile, passing_sweeps, rsrc, metadata) - -# try: -# shutil.copyfile(infile, tmpfile) -# except: -# print("Unable to copy '%s' to %s" % (infile, tmpfile)) -# print("----------------------------") -# raise - -# # open NWB file so the modification date is updated -# # add metadata then close file and do remaining manipulations using -# # HDF5 library (except DF's legacy code that interfaces w/ nwb file -# # using nwb library) -# args = {} -# args["filename"] = tmpfile -# args["modify"] = True -# try: -# nwb_file = nwb.NWB(**args) -# except: -# print("Error opening NWB file '%s'" % args["filename"]) -# raise -# write_metadata(nwb_file, rsrc, metadata) -# nwb_file.close() - - - - # open publish file directlya using HDF5 library - # 1) remove hdf5 groups corresponding to failed sweeps - # 2) add sweep-specific metadata data to file to match original publish - # format. this includes (acquisition and stimulus): - # aibs_stimulus_amplitude_pa - # aibs_stimulus_interval - # aibs_stimulus_name - # initial_access_resistance - # seal - hdf = h5py.File(outfile, "r+") -# ################################ -# # delete epochs, stim, recordings for non-passed sweeps -# epochs = hdf["epochs/"] -# for grp in epochs: -# try: -# num = int(str(grp).split('_')[-1]) -# except: -# continue -# if num not in passing_sweeps: -# del epochs[str(grp)] -# stim = hdf["stimulus/presentation"] -# for grp in stim: -# try: -# num = int(str(grp).split('_')[-1]) -# except: -# continue -# if num not in passing_sweeps: -# del stim[str(grp)] -# acq = hdf["acquisition/timeseries"] -# for grp in acq: -# try: -# num = int(str(grp).split('_')[-1]) -# except: -# continue -# if num not in passing_sweeps: -# del acq[str(grp)] - ################################ - # add data - acq = hdf["acquisition/timeseries"] - stim = hdf["stimulus/presentation"] - sweeps = jin[0]["specimens"][0]["ephys_sweeps"] - for grp in acq: - try: - num = int(str(grp).split('_')[-1]) - except: - continue - try: - for sweep in sweeps: - if sweep["sweep_number"] == num: - break - if sweep["sweep_number"] != num: - print(sweep) - print(num) - raise Exception("WTF") - # stim amplitude - amp = sweep["stimulus_amplitude"] - if amp is None: - amp = float('nan') - else: - amp = float(amp) - ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_amplitude_pa", data=amp) - ds.attrs["neurodata_type"] = "Custom" - ds = stim["Sweep_%d" % num].create_dataset("aibs_stimulus_amplitude_pa", data=amp) - ds.attrs["neurodata_type"] = "Custom" - # stim interval - interval = sweep["stimulus_interval"] - if interval is None: - interval = float('nan') - else: - interval = float(interval) - ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_interval", data=interval) - ds.attrs["neurodata_type"] = "Custom" - ds = stim["Sweep_%d" % num].create_dataset("aibs_stimulus_interval", data=interval) - ds.attrs["neurodata_type"] = "Custom" - # stim name - name = sweep["ephys_stimulus"]["ephys_stimulus_type"]["name"] - ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_name", data=name) - ds.attrs["neurodata_type"] = "Custom" - ds = stim["Sweep_%d" % num].create_dataset("aibs_stimulus_name", data=name) - ds.attrs["neurodata_type"] = "Custom" - # seal - seal = jin[0]["seal_gohm"] - if seal is None: - seal = float('nan') - else: - seal = float(seal) - ds = acq["Sweep_%d" % num].create_dataset("seal", data=seal) - ds.attrs["neurodata_type"] = "Custom" - ds = stim["Sweep_%d" % num].create_dataset("seal", data=seal) - ds.attrs["neurodata_type"] = "Custom" - # initial access resistance - res = jin[0]["initial_access_resistance_mohm"] - if res is None: - res = float('nan') - else: - res = float(res) - ds = acq["Sweep_%d" % num].create_dataset("initial_access_resistance", data=res) - ds.attrs["neurodata_type"] = "Custom" - ds = stim["Sweep_%d" % num].create_dataset("initial_access_resistance", data=res) - ds.attrs["neurodata_type"] = "Custom" - # -# # recycle code from old publish module for custom sweep metadata -# if num in metadata['sweeps']: -# sweep_md = metadata['sweeps'][num] -# stimulus_interval = sweep_md['stimulus_interval'] -# if stimulus_interval is None: -# stimulus_interval = float('nan') -# ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_interval", data=stimulus_interval) -# ds.attrs["neurodata_type"] = "Custom" -# # -# ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_name", data=sweep_md['stimulus_type_name']) -# ds.attrs["neurodata_type"] = "Custom" -# # -# ds = acq["Sweep_%d" % num].create_dataset("aibs_stimulus_amplitude_%s" % stim_units, sweep_md['stimulus_amplitude']) -# ds.attrs["neurodata_type"] = "Custom" -# # -# ds = acq["Sweep_%d" % num].create_dataset("seal", sweep_md['seal_gohm']) -# ds.attrs["neurodata_type"] = "Custom" - except: - print("json parse error for sweep %d" % num) - raise - # all done - hdf.close() - - - # TODO describe what's happening here - sweeps_by_type = defaultdict(list) - for sweep_number, sweep_data in iteritems(metadata['sweeps']): - if sweep_data["stimulus_units"] in [ "pA", "Amps" ]: # only compute spikes for current clamp sweeps - sweeps_by_type[sweep_data['stimulus_type_name']].append(sweep_number) - - sweep_features = extract_cell_features.extract_sweep_features(NwbDataSet(outfile), sweeps_by_type) - - # TODO describe what's happening here - for sweep_num in passing_sweeps: - try: - spikes = sweep_features[sweep_num]['spikes'] - spike_times = [ s['threshold_t'] for s in spikes ] - NwbDataSet(outfile).set_spike_times(sweep_num, spike_times) - except Exception as e: - logging.info("sweep %d has no sweep features. %s" % (sweep_num, e.message) ) -# try: -# # remove spike times for non-passing sweeps -# spk = hdf["analysis/spike_times"] -# for grp in spk: -# try: -# num = int(str(grp).split('_')[-1]) -# except: -# continue -# if num not in passing_sweeps: -# del spk[str(grp)] -# except: -# - -# # rescaling the contents of the data arrays causes the file to grow -# # execute hdf5-repack to get it back to its original size -# try: -# print("Repacking hdf5 file with compression") -# process = subprocess.Popen(["h5repack", "-f", "GZIP=4", tmpfile, outfile], stdout=subprocess.PIPE) -# process.wait() -# except: -# print("Unable to run h5repack on temporary nwb file") -# print("--------------------------------------------") -# raise - -# try: -# print("Removing temporary file") -# os.remove(tmpfile) -# except: -# print("Unable to delete temporary file ('%s')" % tmpfile) -# raise - - empty = {} - return empty - - -if __name__ == "__main__": - # read module input. PipelineModule object automatically parses the - # command line to pull out input.json and output.json file names - module = PipelineModule() - jin = module.input_data() # loads input.json - jout = main(jin) - module.write_output_data(jout) # writes output.json - diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py deleted file mode 100755 index 7e7416e04f..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py +++ /dev/null @@ -1,254 +0,0 @@ -#!/usr/bin/python -import logging -import sys -import math -import os -import re -import copy -import json -import numpy as np -import argparse -import h5py -from six import iteritems - -from allensdk.internal.core.lims_pipeline_module import PipelineModule -from allensdk.core.nwb_data_set import NwbDataSet - - -def main(jin): - # load QC criteria and sweep table from input json file - try: - qc_criteria = jin['ephys_qc_criteria'] - experiment_data = jin['experiment_data'] - sweep_data = jin['sweep_data'] - nwb_file = jin["nwb_file"] - except: - raise IOError("Input json file is missing requisite data") - - jout = {} - - # PBS-333 - # C1NSSEED stimuli have many instances, but these instances aren't - # stored with the sweep. Ie, the sweep stores the stimulus value - # C1NSSEED while the stimulus table stores C1NSSEED_2150112. - # To address this, check the stimulus table for any instance of - # C1NSSEED, and if it exists, append a plain-jane "C1NSSEED" stimulus - # so later checks work - for name in jin["current_clamp_stimuli"]: - if name.startswith("C1NSSEED_"): - jin["current_clamp_stimuli"].append("C1NSSEED") - - # list of reasons to fail entire cell. if anything is added to this list, - # the cell will be tagged for failure (ie, this list also serves - # as a 'fail' flag) - exp_fail_tags = [] - - experiment_state = {} - jout["experiment_data"] = experiment_state - - # blowout voltage - experiment_state["failed_blowout"] = False - try: - blowout = experiment_data["blowout_mv"] - low = qc_criteria["blowout_mv_min"] - high = qc_criteria["blowout_mv_max"] - if blowout is None or math.isnan(blowout): - exp_fail_tags.append("Missing blowout value (%s)" % str(blowout)) - experiment_state["failed_blowout"] = True - if blowout < low or blowout > high: - exp_fail_tags.append("blowout outside of range") - experiment_state["failed_blowout"] = True - except Exception as e: - exp_fail_tags.append("Error analyzing blowout. " + e.message) - experiment_state["failed_blowout"] = True - - - # "electrode 0" - experiment_state["failed_electrode_0"] = False - try: - e0 = experiment_data["electrode_0_pa"] - if e0 is None or math.isnan(e0): - exp_fail_tags.append("e0 -- missing value (%s)" % str(e0)) - experiment_state["failed_electrode_0"] = True - if abs(e0) > qc_criteria["electrode_0_pa_max"]: - exp_fail_tags.append("e0 -- exceeds max") - experiment_state["failed_electrode_0"] = True - except Exception as e: - exp_fail_tags.append("Error analyzing blowout. " + e.message) - experiment_state["failed_electrode_0"] = True - - - # measure clamp seal - experiment_state["failed_seal"] = False - try: - seal = experiment_data["seal_gohm"] - if seal is None or math.isnan(seal): - exp_fail_tags.append("Invalid seal (%s)" % str(seal)) - experiment_state["failed_seal"] = True - if seal < qc_criteria["seal_gohm_min"]: - tgt = qc_criteria["seal_gohm_min"] - reason = "%f versus criteria=%f" % (seal, tgt) - exp_fail_tags.append("Seal (%s)" % reason) - experiment_state["failed_seal"] = True - except Exception as e: - seal = None - msg = "Seal 0 is not available. %s" % e.message - logging.warning(msg) - exp_fail_tags.append(msg) - experiment_state["failed_seal"] = True - - - # input and access resistance - sr_tags = [] - - try: - sir_ratio = experiment_data['input_access_resistance_ratio'] - #r = experiment_data['input_resistance_mohm'] - except: - sr_tags.append("Resistance ratio not available") - - try: - sr = experiment_data['initial_access_resistance_mohm'] - except: - sr_tags.append("Initial access resistance not available") - - try: - if len(sr_tags) == 0: - experiment_state["failed_bad_rs"] = False - - if sr < qc_criteria["access_resistance_mohm_min"]: - experiment_state["failed_bad_rs"] = True - tgt = qc_criteria["access_resistance_mohm_min"] - reason = "%f versus criteria=%f" % (sr, tgt) - sr_tags.append("access-resistance low (%s)" % reason) - elif sr > qc_criteria["access_resistance_mohm_max"]: - experiment_state["failed_bad_rs"] = True - tgt = qc_criteria["access_resistance_mohm_max"] - reason = "%f versus criteria=%f" % (sr, tgt) - sr_tags.append("access-resistance high (%s)" % reason) - - if sir_ratio > qc_criteria["input_vs_access_resistance_min"]: - experiment_state["failed_bad_rs"] = True - tgt = qc_criteria["input_vs_access_resistance_min"] - reason = "%f versus criteria=%f" % (sir_ratio, tgt) - sr_tags.append("input/access resistance (%s)" % reason) - except Exception as e: - exp_fail_tags.append("Error analyzing access resistance. " + e.message) - - if len(sr_tags) > 0: - exp_fail_tags.extend(sr_tags) - - - experiment_state["fail_tags"] = exp_fail_tags - - - #################################################################### - # check features for each sweep - sweep_state = {} - jout["sweep_state"] = sweep_state - for name, sweep in iteritems(jin["sweep_data"]): - try: - # keep track of failures - fail_tags = [] - - sweep_num = sweep["sweep_number"] - - stim = sweep["ephys_stimulus"]["description"] - if stim.endswith("_DA_0"): - stim = stim[:-5] - unit = sweep["stimulus_units"] - # determine if sweep is current or voltage clamp - # name may end in "[#]", so strip out section after open bracket - stim_short = stim.split('[')[0] - if stim_short in jin["voltage_clamp_stimuli"]: - if unit != "Volts" and unit != "mV": - msg = "%s (%s) in wrong mode -- expected voltage clamp" % (name, stim) - fail_tags.append(msg) - elif stim_short in jin["current_clamp_stimuli"]: - if unit != "Amps" and unit != "pA": - msg = "%s (%s) in wrong mode -- expected current clamp" % (name, stim) - fail_tags.append(msg) - else: - fail_tags.append("%s has unrecognized stimulus (%s)" % (name, stim)) - - if unit == "Volts" or unit == "mV": - continue # no QC on voltage clamp - - if len(fail_tags) > 0: - sweep_state[name] = {} - sweep_state[name]["state"] = "Fail" - sweep_state[name]["reasons"] = fail_tags - continue - - # pull data streams from file (this is for detecting truncated - # sweeps) - sweep_data = NwbDataSet(nwb_file).get_sweep(sweep_num) - volts = sweep_data['response'] - current = sweep_data['stimulus'] - hz = sweep_data['sampling_rate'] - idx_start, idx_stop = sweep_data['index_range'] - - if sweep["pre_noise_rms_mv"] > qc_criteria["pre_noise_rms_mv_max"]: - fail_tags.append("pre-noise") - - # check Vm and noise at end of recording - # only do so if acquisition not truncated - # do not check for ramps, because they do not have - # enough time to recover - is_ramp = stim.startswith('C1RP') - if is_ramp: - logging.info("sweep %d skipping vrest criteria on ramp", sweep_num) - else: - # measure post-stimulus noise - sweep_not_truncated = ( idx_stop == len(current) - 1 ) - if sweep_not_truncated: - post_noise_rms_mv = sweep["post_noise_rms_mv"] - if post_noise_rms_mv > qc_criteria["post_noise_rms_mv_max"]: - fail_tags.append("post-noise") - else: - fail_tags.append("Truncated sweep") - - if sweep["slow_noise_rms_mv"] > qc_criteria["slow_noise_rms_mv_max"]: - fail_tags.append("slow noise above threshold") - - if sweep["vm_delta_mv"] > qc_criteria["vm_delta_mv_max"]: - fail_tags.append("Vm delta") - - - # fail sweeps if stimulus duration is zero - # Uncomment out hte following 3 lines to have sweeps without stimulus - # faile QC - if sweep["stimulus_duration"] <= 0: - desc = sweep["ephys_stimulus"]["description"] - if not desc.startswith("EXTP"): - fail_tags.append("No stimulus detected") - - - sweep_state[name] = {} - if len(fail_tags) > 0: - sweep_state[name]["state"] = "Fail" - sweep_state[name]["reasons"] = fail_tags - else: - sweep_state[name]["state"] = "Pass" - - except: - print("Error processing sweep %s" % name) - raise - - #################################### - # done - prepare and deliver results - if len(exp_fail_tags) > 0: - jout["qc_result"] = "failed" - else: - jout["qc_result"] = "passed" - - return jout - -if __name__ == "__main__": - # read module input. PipelineModule object automatically parses the - # command line to pull out input.json and output.json file names - module = PipelineModule() - jin = module.input_data() # loads input.json - jout = main(jin) - module.write_output_data(jout) # writes output.json - diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py deleted file mode 100644 index 2c6fabfcb3..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py +++ /dev/null @@ -1,189 +0,0 @@ -import numpy as np - -def measure_vm(seg): - vals = np.copy(seg) - if len(vals) < 1: - return 0, 0 - mean = np.mean(vals) - vals -= mean - rms = np.sqrt(np.mean(np.square(vals))) - return mean, rms - -######################################################################## -# experiment-level metrics - -def measure_blowout(v, idx0): - return 1e3 * np.mean(v[idx0:]) - -def measure_electrode_0(curr, hz, t=0.005): - n_time_steps = int(t * hz) - # electrode 0 is the average current reading with zero voltage input - # (ie, the equivalent of resting potential in current-clamp mode) - return 1e12 * np.mean(curr[0:n_time_steps]) - -def measure_seal(v, curr, hz): - t = np.arange(len(v)) / hz - return 1e-9 * get_r_from_stable_pulse_response(v, curr, t) - -def measure_input_resistance(v, curr, hz): - t = np.arange(len(v)) / hz - return 1e-6 * get_r_from_stable_pulse_response(v, curr, t) - -def measure_initial_access_resistance(v, curr, hz): - t = np.arange(len(v)) / hz - return 1e-6 * get_r_from_peak_pulse_response(v, curr, t) - - -######################################################################## - -def get_r_from_stable_pulse_response(v, i, t): - dv = np.diff(v) - up_idx = np.flatnonzero(dv > 0) - down_idx = np.flatnonzero(dv < 0) -# print up_idx -# print down_idx -# print "-----" - dt = t[1] - t[0] - one_ms = int(0.001 / dt) - r = [] - for ii in range(len(up_idx)): - # take average v and i one ms before - end = up_idx[ii] - 1 - start = end - one_ms -# print "\tbase" -# print "base interval: %d -> %d" % (start, end) - avg_v_base = np.mean(v[start:end]) - avg_i_base = np.mean(i[start:end]) -# print "\tv: %g" % avg_v_base -# print "\ti: %g" % avg_i_base - # take average v and i one ms before end - end = down_idx[ii]-1 - start = end - one_ms -# print "\tsteady" -# print "steady interval: %d -> %d" % (start, end) - avg_v_steady = np.mean(v[start:end]) - avg_i_steady = np.mean(i[start:end]) -# print "\tv: %g" % avg_v_steady -# print "\ti: %g" % avg_i_steady - r_instance = (avg_v_steady-avg_v_base) / (avg_i_steady-avg_i_base) -# print 1e-6*r_instance - r.append(r_instance) - return np.mean(r) - -def get_r_from_peak_pulse_response(v, i, t): - dv = np.diff(v) - up_idx = np.flatnonzero(dv > 0) - down_idx = np.flatnonzero(dv < 0) - dt = t[1] - t[0] - one_ms = int(0.001 / dt) - r = [] - for ii in range(len(up_idx)): - # take average v and i one ms before - end = up_idx[ii] - 1 - start = end - one_ms - avg_v_base = np.mean(v[start:end]) - avg_i_base = np.mean(i[start:end]) - # take average v and i one ms before end - start = up_idx[ii] - end = down_idx[ii] - 1 - idx = start + np.argmax(i[start:end]) - avg_v_peak = v[idx] - avg_i_peak = i[idx] - r_instance = (avg_v_peak-avg_v_base) / (avg_i_peak-avg_i_base) - r.append(r_instance) - return np.mean(r) - - - - - -def get_last_vm_epoch(idx1, stim, hz): - return idx1-int(0.500 * hz), idx1 - -def get_first_vm_noise_epoch(idx0, stim, hz): - t0 = idx0 - t1 = t0 + int(0.0015 * hz) - return t0, t1 - -def get_last_vm_noise_epoch(idx1, stim, hz): - return idx1-int(0.0015 * hz), idx1 - -#def get_stability_vm_epoch(idx0, stim, hz): -def get_stability_vm_epoch(idx0, stim_start, hz): - dur = int(0.500 * hz) - #stim_start = find_stim_start(idx0, stim) - if dur > stim_start-1: - dur = stim_start-1 - elif dur <= 0: - return 0, 0 - return stim_start-1-dur, stim_start-1 - -def find_stim_start(idx0, stim): - # find stim start, using adaptation of nathan's numpy algorithm - di = np.diff(stim) - up_idx = np.flatnonzero(di > 0) - down_idx = np.flatnonzero(di < 0) - first = -1 - for i in range(len(up_idx)): - if up_idx[i] >= idx0: - first = up_idx[i] - break - for i in range(len(down_idx)): - if down_idx[i] >= idx0 and down_idx[i] < first: - first = down_idx[i] - break - # +1 to be first index of stim, not last index of pre-stim - return first + 1 - -def find_stim_amplitude_and_duration(idx0, stim, hz): - - if len(stim) < idx0: - idx0 = 0 - - stim = stim[idx0:] - - peak_high = max(stim) - peak_low = min(stim) - - # measure stimulus length - # find index of first non-zero value, and last return to zero - nzero = np.where(stim!=0)[0] - if len(nzero) > 0: - start = nzero[0] - end = nzero[-1] - dur = (end - start) / hz - else: - dur = 0 - - dur = float(dur) - - if abs(peak_high) > abs(peak_low): - amp = float(peak_high) - else: - amp = float(peak_low) - - return amp, dur - -def find_stim_interval(idx0, stim, hz): - stim = stim[idx0:] - - # indices where is the stimulus off - zero_idxs = np.where(stim == 0)[0] - - # derivative of off indices. when greater than one, indicates on period - dzero_idxs = np.diff(zero_idxs) - dzero_break_idxs = np.where(dzero_idxs[:] > 1)[0] - - # duration of breaks - break_durs = dzero_idxs[dzero_break_idxs] - - # indices of breaks - break_idxs = zero_idxs[dzero_break_idxs] + 1 - - # time between break onsets - dbreaks = np.diff(break_idxs) - - if len(np.unique(break_durs)) == 1 and len(np.unique(dbreaks)) == 1: - return dbreaks[0] / hz - - return None diff --git a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py deleted file mode 100644 index d535e7f7c3..0000000000 --- a/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py +++ /dev/null @@ -1,187 +0,0 @@ -import sys -import string -from six import iteritems - -class ResourceFile(object): - def __init__(self): - self.key_value = {} - self.accessed = {} - - def load(self, infile): - """ Reads in a json, yaml or toml resource file. If multiple files - are loaded, resources between them are merged. An error - occurs if the same key is loaded multiple times and different - values are defined for it - """ - if infile.endswith("json"): - self.load_json(infile) - elif infile.endswith("yml") or infile.endswith("yaml"): - self.load_yaml(infile) - elif infile.endswith("tml") or infile.endswith("toml"): - self.load_toml(infile) - else: - print("Unrecognized extension for file '%s'. Please use json, yaml or toml" % infile) - sys.exit(1) - - def get(self, key, default=None, replace_table=None): - """ Returns the resource value associated with the provided key. - - Arguments: - *key* (text) Name of resource - - *default* (text) Value to be returned if key isn't found - - *replace_table* (dict) Substrings that are to be replaced - in resource string. E.g., if replace_table = { foo: "bar" } - then all instances of "foo" in the resource string will be - replaced with "bar" - - Returns: - Resource string if found and default value if not, with - applied substitutions from replace_table - """ - self.accessed[key] = True - val = self.key_value.get(key, default) - if replace_table is not None: - for k,v in iteritems(replace_table): - val = string.replace(val, k, v) - return val - - def report(self): - """ Reports all resources that were defined but not used - """ - err = False - print("-------------------------------") - print("--- Resource report --") - for k,v in iteritems(self.accessed): - if not v: - if not err: - err = True - print("\t'%s' not used" % k) - if not err: - print("all defined resources were used") - print("-------------------------------") - - #################################################################### - # internal procedure to load json file - def load_json(self, infile): - """ Reads input json, yaml or toml file - """ - import json - try: - with open(infile, 'r') as f: - resources = json.load(f) - f.close() - except IOError: - print("Unable to open input json file '%s'" % infile) - sys.exit(1) - self.read_keys(resources) - - # internal procedure to load yaml - def load_yaml(self, infile): - try: - import yaml - try: - with open(infile, 'r') as f: - resources = yaml.load(f) - f.close() - except IOError: - print("Unable to open input yaml file '%s'" % infile) - sys.exit(1) - self.read_keys(resources) - except ImportError: - print("*** yaml not available -- please pip install pyyaml") - sys.exit(1) - - # internal procedure to load toml - def load_toml(self, infile): - try: - import toml - try: - with open(infile, 'r') as f: - resources = toml.load(f) - f.close() - except IOError: - print("Unable to open input toml file '%s'" % infile) - sys.exit(1) - self.read_keys(resources) - except ImportError: - print("*** toml not available -- please pip install toml") - sys.exit(1) - - - # internal procedure to read keys out of dictionary recursively - def read_keys(self, resources): - err = False - for k,v in iteritems(resources): - if isinstance(v, dict): - self.read_keys(v) - else: - if k in self.key_value and v != self.key_value[k]: - print("Error -- inconsistent values for key '%s'" % k) - err = True - self.key_value[k] = v - self.accessed[k] = False - if err: - sys.exit(1) - - -class ResourceFileTest(object): - def create_json(self, fname, rsrc): - import json - d = {} - d["jone"] = "json one" - d["jtwo"] = "json one" - d["jsub"] = {} - d["jsub"]["jthree"] = "json three" - with open(fname, 'w') as f: - json.dump(d, f, indent=2) - f.close() - rsrc.load(fname) - - def create_yaml(self, fname, rsrc): - try: - import yaml - d = {} - d["yone"] = "yaml one" - d["ytwo"] = "yaml one" - d["ysub"] = {} - d["ysub"]["ythree"] = "yaml three" - with open(fname, 'w') as f: - yaml.dump(d, f, indent=2) - f.close() - rsrc.load(fname) - except ImportError: - print("*** yaml not available -- please pip install pyyaml") - - def create_toml(self, fname, rsrc): - try: - import toml - d = {} - d["tone"] = "toml one" - d["ttwo"] = "toml one" - d["tsub"] = {} - d["tsub"]["tthree"] = "toml three" - with open(fname, 'w') as f: - toml.dump(d, f) - f.close() - rsrc.load(fname) - except ImportError: - print("*** toml not available -- please pip install toml") - - def run(self): - # create and load json, yaml and toml files - rsrc = ResourceFile() - self.create_json("tmp.json", rsrc) - self.create_yaml("tmp.yaml", rsrc) - self.create_toml("tmp.toml", rsrc) - # print resource from each - print(rsrc.get("jone", "json error")) - print(rsrc.get("yone", "** yaml error")) - print(rsrc.get("tone", "** toml error")) - print(rsrc.get("jthree", "json error")) - print(rsrc.get("ythree", "** yaml error")) - print(rsrc.get("tthree", "** toml error")) - # run report - rsrc.report() - diff --git a/allensdk/internal/pipeline_modules/__init__.py b/allensdk/internal/pipeline_modules/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/pipeline_modules/cell_types/morphology/calculate_features.py b/allensdk/internal/pipeline_modules/cell_types/morphology/calculate_features.py deleted file mode 100644 index 87fa94e0e1..0000000000 --- a/allensdk/internal/pipeline_modules/cell_types/morphology/calculate_features.py +++ /dev/null @@ -1,96 +0,0 @@ -import sys - -import neuron_morphology.swc as swc -import neuron_morphology.features.feature_extractor as feature_extractor -from allensdk.internal.core.lims_pipeline_module import PipelineModule - - -######################################################################## - -def main(jin): - try: - swc_file = jin["swc_file"] - xform = jin["pia_transform"] - depth = jin["relative_soma_depth"] - except: - print("** Unable to find requisite fields in input json"); - raise - - - #################################################################### - # calculate features - - try: - nrn = swc.read_swc(swc_file) - except: - print("** Error reading swc file") - raise - - try: - aff = [] - for i in range(12): - aff.append(xform["tvr_%02d" % i]) - nrn.apply_affine(aff) - except: - print("** Error applying affine transform") - raise - - #try: - # # save a copy of affine-corrected file - # tmp_swc_file = swc_file[:-4] + "_pia.swc" - # nrn.write(tmp_swc_file) - #except: - # # treat this as a soft error and print a warning - # print("Note: unable to write copy of affine corrected pia file") - - try: - features = feature_extractor.MorphologyFeatures(nrn, depth) - data = {} - data["axon"] = features.axon - data["cloud"] = features.axon_cloud - data["dendrite"] = features.dendrite - data["basal_dendrite"] = features.basal_dendrite - data["apical_dendrite"] = features.apical_dendrite - data["all_neurites"] = features.all_neurites - except: - print("** Error calculating morphology features") - raise - - # make output of new module backwards compatible with previous module - md = {} - feat = {} - feat["number_of_stems"] = data["dendrite"]["num_stems"] - feat["max_euclidean_distance"] = data["dendrite"]["max_euclidean_distance"] - feat["max_path_distance"] = data["dendrite"]["max_path_distance"] - feat["overall_depth"] = data["dendrite"]["depth"] - feat["total_volume"] = data["dendrite"]["total_volume"] - feat["average_parent_daughter_ratio"] = data["dendrite"]["mean_parent_daughter_ratio"] - feat["average_diameter"] = data["dendrite"]["average_diameter"] - feat["total_length"] = data["dendrite"]["total_length"] - feat["nodes_over_branches"] = data["dendrite"]["neurites_over_branches"] - feat["overall_width"] = data["dendrite"]["width"] - feat["number_of_nodes"] = data["dendrite"]["num_nodes"] - feat["average_bifurcation_angle_local"] = data["dendrite"]["bifurcation_angle_local"] - feat["number_of_bifurcations"] = data["dendrite"]["num_bifurcations"] - feat["average_fragmentation"] = data["dendrite"]["mean_fragmentation"] - feat["number_of_tips"] = data["dendrite"]["num_tips"] - feat["average_contraction"] = data["dendrite"]["contraction"] - feat["average_bifuraction_angle_remote"] = data["dendrite"]["bifurcation_angle_remote"] - feat["number_of_branches"] = data["dendrite"]["num_branches"] - feat["total_surface"] = data["dendrite"]["total_surface"] - feat["max_branch_order"] = data["dendrite"]["max_branch_order"] - feat["soma_surface"] = data["dendrite"]["soma_surface"] - feat["overall_height"] = data["dendrite"]["height"] - - - md["features"] = feat - data["morphology_data"] = md - - return data - - -if __name__=='__main__': - module = PipelineModule() - jin = module.input_data() - jout = main(jin) - module.write_output_data(jout) diff --git a/allensdk/internal/pipeline_modules/cell_types/morphology/cortical_layers.py b/allensdk/internal/pipeline_modules/cell_types/morphology/cortical_layers.py deleted file mode 100755 index 17299fa630..0000000000 --- a/allensdk/internal/pipeline_modules/cell_types/morphology/cortical_layers.py +++ /dev/null @@ -1,425 +0,0 @@ -#!/usr/bin/python -import json -import math -import cv2 -import numpy as np -import sys -import psycopg2 -import psycopg2.extras -import allensdk.core.json_utilities as json -from neuron_morphology import swc -from allensdk.internal.core.lims_pipeline_module import PipelineModule - -#from surrogate_strategy import prep_json - -# TODO update run_python.sh to include this path -twok_dir = "/shared/bioapps/itk/itk_shared/jp2/build" -print("WARNING: adding directory to PYTHONPATH") -print("=> %s" % twok_dir) -sys.path.append(twok_dir) -import jpeg_twok - -######################################################################## -# helper functions - -def calculate_centroid(x, y): - ''' Calculates the center of a polygon, using weighted averages - of vertex locations - ''' - assert len(x) == len(y), "Vertex arrays are of incorrect shape" - tot_len = 0.0 - tot_x = 0.0 - tot_y = 0.0 - for i in range(len(x)): - x0 = x[i-1] - y0 = y[i-1] - x1 = x[i] - y1 = y[i] - seg_len = math.sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)) - tot_len += seg_len - tot_x += seg_len * x0 - tot_x += seg_len * x1 - tot_y += seg_len * y0 - tot_y += seg_len * y1 - tot_x /= 2.0 * tot_len - tot_y /= 2.0 * tot_len - return tot_x, tot_y - -def convert_coords_str(coord_str): - vals = coord_str.split(',') - x = np.array(vals[0::2], dtype=float) - y = np.array(vals[1::2], dtype=float) - return x, y - - -color_table = [] -color_table.append((255, 77, 77)) -color_table.append((102, 102, 255)) -color_table.append(( 25, 255, 25)) -color_table.append((177, 166, 255)) -color_table.append(( 46, 230, 230)) -color_table.append((255, 77, 255)) -color_table.append((128, 230, 46)) -color_table.append((255, 166, 77)) -color_table.append((179, 179, 179)) -color_table.append(( 77, 255, 166)) -color_table.append((229, 229, 46)) -color_table.append((255, 51, 153)) -color_table.append((166, 77, 255)) -color_table.append((151, 166, 86)) - -color_table.append((153, 0, 0)) -color_table.append(( 0, 77, 153)) -color_table.append((153, 153, 0)) -color_table.append(( 77, 153, 0)) -color_table.append(( 0, 153, 153)) -color_table.append(( 13, 128, 13)) -color_table.append((153, 77, 0)) -color_table.append(( 0, 0, 153)) -color_table.append((153, 0, 153)) -color_table.append(( 0, 179, 89)) -color_table.append((102, 102, 102)) -color_table.append(( 77, 0, 153)) -color_table.append((153, 0, 77)) -color_table.append(( 78, 89, 30)) - -def color_by_index(i): - global color_table - # - return color_table[i % len(color_table)] - -def draw_morphology(nrn, img, somax, somay, color_by_layer=False): - global LINE_WIDTH, resolution - # - soma_col = (0, 0, 0) - axon_col = (70, 130, 180) - dend_col = (178, 34, 34) - apical_col = (255, 127, 80) - for c in nrn.compartment_list: - x0 = int(c.node1.x / resolution + somax) - x1 = int(c.node2.x / resolution + somax) - y0 = int(c.node1.y / resolution + somay) - y1 = int(c.node2.y / resolution + somay) - if color_by_layer: - color = color_table[c.node1.layer_num] - else: - color = soma_col - if c.node2.t == 2: - color = axon_col - elif c.node2.t == 3: - color = dend_col - elif c.node2.t == 4: - color = apical_col - cv2.line(img, (x0,y0), (x1,y1), color, LINE_WIDTH) - -def write_svg(svgname, jin, nrn): - resolution = jin["resolution"] - dx = jin["soma"]["position"][0] - nrn.soma_root().x / resolution - dy = jin["soma"]["position"][1] - nrn.soma_root().y / resolution - with open(svgname, "w") as f: - #f.write('<?xml version="1.0" encoding="UTF-8" ?>\n') - f.write('<svg xmlns="http://www.w3.org/2000/svg" version="1.1">\n') - # soma - soma = jin["soma"]["path"][0] - coords = soma.split(',') - f.write(' <polyline points="') - for i in range(0, len(coords), 2): - f.write('%f,%f ' % (float(coords[i]), float(coords[i+1]))) - f.write('" stroke="black" stoke-width="2" fill="none" />\n') - for layer in jin["layers"]: - f.write(' <polyline points="') - path = layer["path"] - coords = path.split(',') - for i in range(0, len(coords), 2): - f.write('%f,%f ' % (float(coords[i]), float(coords[i+1]))) - f.write('" stroke="black" stoke-width="2" fill="none" />\n') - for c in nrn.compartment_list: - try: - color = color_table[c.node1.layer_num] - except: - color = (45, 67, 89) - x0 = int(c.node1.x / resolution + dx) - x1 = int(c.node2.x / resolution + dx) - y0 = int(c.node1.y / resolution + dy) - y1 = int(c.node2.y / resolution + dy) - f.write(' <line x1="%f" y1="%f" x2="%f" y2="%f" style="stroke:rgb(%d,%d,%d)" />\n' % (x0, y0, x1, y1, color[0], color[1], color[2])) - f.write('</svg>\n') - -######################################################################## -######################################################################## -# -# global values, shared between functions -resolution = None # microns-per-pixel, from input.json -LINE_WIDTH = 1 # default pen width -DOWNSAMPLE_STEPS = 1 # default image pyramid level -# -def main(jin): - global resolution, LINE_WIDTH, DOWNSAMPLE_STEPS - jout = {} - spec_id = jin["specimen_id"] - - #################################################################### - if "line_width" in jin: - LINE_WIDTH = int(jin["line_width"]) - - # according to Staci, accuracy of 20x trace is approximately to the - # level of a cell soma (8-10um), which is approx 22 pixels - # downsampling by 2 won't significantly alter the accuracy of - # the annotations and is well within the stated margin of error. this - # lends itself to more efficient processing, and better thumbnails - if "downsample_steps" in jin: - DOWNSAMPLE_STEPS = int(jin["downsample_steps"]) - - ############################################ - # derived constants - RADS = [] - RADS.append(29) - RADS.append(15) - RADS.append(7) - RADS.append(3) - DOWNSAMPLE = 1 - for i in range(DOWNSAMPLE_STEPS): - DOWNSAMPLE *= 2 - GAUS_RAD = RADS[DOWNSAMPLE_STEPS] - - #################################################################### - - # calculate soma position and store in jin structure - soma_res = jin["soma"]["path"] - soma_path = soma_res[0].split(',') - soma_x = np.array(soma_path[0::2], dtype=float) - soma_y = np.array(soma_path[1::2], dtype=float) - soma_path = [] - for i in range(len(soma_x)): - soma_path.append([soma_x[i],soma_y[i]]) - soma_path = np.array(soma_path, np.int32) - soma_pos = calculate_centroid(soma_x, soma_y) - jin["soma"]["position"] = soma_pos - - resolution = jin["resolution"] - swc_name = jin["storage_directory"] + jin["swc_file"] - - ########################### - # before doing the heavy work, load external objects to make sure they're - # available - - # read morphology - morph = swc.read_swc(swc_name) - - # read 20x - fname_20x = jin["20x"]["img_path"] - image_20x = jpeg_twok.read(fname_20x, reduction_factor=DOWNSAMPLE_STEPS) - abs_width = image_20x.shape[1] - abs_height = image_20x.shape[0] - print("20x image size %dx%d at pyramid level %d" % (abs_width, abs_height, DOWNSAMPLE_STEPS)) - - # get soma position in 20x pixel space, at present downsample level - # resolution converts soma coords in microns to pixels - # (resolution is microns / pixel) - resolution *= DOWNSAMPLE # divide pixels by X means mult res by same - print("Image resolution (microns/pixel): %f" % resolution) - dx = jin["soma"]["position"][0] / DOWNSAMPLE - morph.soma_root().x / resolution - dy = jin["soma"]["position"][1] / DOWNSAMPLE - morph.soma_root().y / resolution - dx = int(dx) - dy = int(dy) - - ############################## - # no point in processing the entire image, as only a small part - # is relevant - # select min/max values for x,y of all polygons. restrict analysis - # to there - min_x = 1e10 - min_y = 1e10 - max_x = 0 - max_y = 0 - layers = jin["layers"] - for layer in layers: - path_array = np.array(layer["path"].split(',')) - x = np.array(path_array[0::2], dtype=float) - y = np.array(path_array[1::2], dtype=float) - min_x = min(min_x, x.min()) - min_y = min(min_y, y.min()) - max_x = max(max_x, x.max()) - max_y = max(max_y, y.max()) - - min_x /= DOWNSAMPLE - min_y /= DOWNSAMPLE - max_x /= DOWNSAMPLE - max_y /= DOWNSAMPLE - - # add a border around polygons to provide context - BORDER = 200 - BORDER /= DOWNSAMPLE - TOP = min_y - BORDER - LEFT = min_x - BORDER - RIGHT = max_x + BORDER - BOTTOM = max_y + BORDER - - # make sure border doesn't extend beyond image limits - TOP = max(TOP, 0) - LEFT = max(LEFT, 0) - RIGHT = min(RIGHT, abs_width-1) - BOTTOM = min(BOTTOM, abs_height-1) - WIDTH = int(RIGHT - LEFT) - HEIGHT = int(BOTTOM - TOP) - - # adjust soma location for top and left of visible image area - dx -= LEFT - dy -= TOP - #print "inset soma position", dx, dy - - - # make frame for each polygon and blur. blur radious should be - # approx the size of largest gap or overlap between polygons. this - # is for estimating which polygon each point is a best fit in - layers = jin["layers"] - for layer in layers: - path_array = np.array(layer["path"].split(',')) - x = np.array(path_array[0::2], dtype=float) - x /= DOWNSAMPLE - x -= LEFT - y = np.array(path_array[1::2], dtype=float) - y /= DOWNSAMPLE - y -= TOP - #print layer["label"] - #print x.min(), y.min() - #print x.max(), y.max() - xy = [] - for i in range(len(x)): - xy.append([x[i],y[i]]) - raw_frame = np.zeros((HEIGHT, WIDTH)) - path = np.array(xy) - cv2.fillPoly(raw_frame, np.int32([path]), 255) - frame = cv2.blur(raw_frame, (GAUS_RAD, GAUS_RAD)) - layer["frame"] = frame # blurred polygon - layer["raw_frame"] = raw_frame # raw polygon - - # collapse all polys into single array, with value at each position - # corresponding to the index of the polygon that the pixel falls - # into, or -1 if there's no match - master = np.zeros((HEIGHT, WIDTH, 3)) - master_idx = np.zeros((HEIGHT, WIDTH), dtype=int) - master_idx -= 1 - for y in range(HEIGHT): - for x in range(WIDTH): - peak = 0 - idx = -1 - for i in range(len(layers)): - frame = layers[i]["frame"] - val = frame[y][x] - if val > peak: - peak = val - idx = i - if idx >= 0: - master[y][x] = color_by_index(idx) - master_idx[y][x] = idx - - ################################################# - # draw standard morphology on colored layers - draw_morphology(morph, master, int(dx), int(dy)) - outfile = "layer_%d.png" % spec_id - print("saving " + outfile) - cv2.imwrite(outfile, master) - jout["morph_layers"] = outfile - - ################################################# - # draw standard morphology on 20x image - img = image_20x[TOP:BOTTOM,LEFT:RIGHT] - print(img.shape) - draw_morphology(morph, img, int(dx), int(dy)) - outfile = "blockface_%d.png" % spec_id - print("saving " + outfile) - cv2.imwrite(outfile, img) - jout["morph_20x"] = outfile - - ################################################# - # associate SWC nodes with morphology layers - jout["reconstruction_id"] = jin["reconstruction_id"] - reconstruction = {} - errs = 0 - for n in morph.node_list: - x = dx + int(n.x / resolution) - y = dy + int(n.y / resolution) - desc = n.to_dict() - idx = -1 - try: - idx = master_idx[y][x] - except: - errs += 1 - if idx >= 0: - desc["label"] = layers[idx]["label"] - n.layer_num = idx - else: - desc["label"] = "unknown" - n.layer_num = -1 - reconstruction[n.n] = desc - if errs > 0: - raise Exception("Unable to map %d nodes to a cortical layer" % errs) - jout["reconstruction"] = reconstruction - - ################################################# - # draw layer & morphology SVG - outfile = "outline_%d.svg" % spec_id - print("saving " + outfile) - jout["outline_svg"] = outfile - write_svg(outfile, jin, morph) - - ################################################# - # draw layer-colored morphology on 20x image - img = image_20x[TOP:BOTTOM,LEFT:RIGHT] - draw_morphology(morph, img, int(dx), int(dy), True) - outfile = "layered_blockface_%d.png" % spec_id - print("saving " + outfile) - cv2.imwrite(outfile, img) - jout["colored_morph_20x"] = outfile - - ################################################# - # draw layer-colored morphology on empty polygons - img = np.zeros((HEIGHT, WIDTH, 3)) - layers = jin["layers"] - for layer in layers: - path_array = np.array(layer["path"].split(',')) - x = np.array(path_array[0::2], dtype=float) - x /= DOWNSAMPLE - x -= LEFT - y = np.array(path_array[1::2], dtype=float) - y /= DOWNSAMPLE - y -= TOP - for i in range(1,len(x)): - cv2.line(img, (int(x[i-1]),int(y[i-1])), (int(x[i]),int(y[i])), (255, 255, 255), 1) - cv2.line(img, (int(x[-1]),int(y[-1])), (int(x[0]),int(y[0])), (255, 255, 255), 1) - draw_morphology(morph, img, int(dx), int(dy), True) - outfile = "outline_%d.png" % spec_id - print("saving " + outfile) - cv2.imwrite(outfile, img) - jout["colored_morph_poly"] = outfile - - return jout - - -# mouse -#ims_id = "489909914" -#spec_id = 488679042 - -#ims_id = "491762612" -#spec_id = 490387590 - -# human -#ims_id = "487992082" -#spec_id = 488386504 - -#ims_id = "488759189" -#spec_id = 488418027 - -#spec_id = 528015670 - -if __name__ == "__main__": - module = PipelineModule() - jin = module.input_data() # loads input.json - # "get" input json - #jin = prep_json(spec_id) - #json.write("in_%d.json" % spec_id, jin) - jout = main(jin) - module.write_output_data(jout) # writes output.json - #json.write("out_%d.json" % spec_id, jout) - diff --git a/allensdk/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py b/allensdk/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py deleted file mode 100755 index d60350adf9..0000000000 --- a/allensdk/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/python -import sys -import psycopg2 -import psycopg2.extras -sys.path.append("/home/keithg/allen/allensd") -import allensdk.core.json_utilities as json - - -def prep_json(spec_id): - jin = {} - - try: - conn_string = "host='limsdb2' dbname='lims2' user='atlasreader' password='atlasro'" - conn = psycopg2.connect(conn_string) - cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) - except: - print("unable to connect") - raise - - #################################################################### - # get polygons outlining layers in 20x image - layer_sql = """ - select st.acronym, poly.path, wkf.storage_directory, wkf.filename, ims.id from image_series ims - join sub_images si on si.image_series_id = ims.id - join avg_graphic_objects layer on layer.sub_image_id = si.id - join avg_graphic_objects poly on poly.parent_id = layer.id - join avg_group_labels layert on layert.id = layer.group_label_id - left join structures st on st.id = poly.structure_id - join specimens hemisl on hemisl.id = ims.specimen_id - join specimens cell on cell.parent_id = hemisl.id - join neuron_reconstructions nr on nr.specimen_id = cell.id - join well_known_files wkf on wkf.attachable_id = nr.id - JOIN well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id - where nr.superseded is false - and layert.name = 'Default' - AND wkft.name = '3DNeuronReconstruction' - and cell.id = %d - order by 1 - """ - cursor.execute(layer_sql % spec_id) - #print layer_sql % spec_id - poly_info = cursor.fetchall() - if len(poly_info) == 0: - print("Error -- cannot no polygon data for Specimen %d" % spec_id) - sys.exit(1) - poly = [] - for entry in poly_info: - label = entry[0] - path = entry[1] - block = {} - block["path"] = path - block["label"] = label - poly.append(block) - ## break down string path into two numeric arrays - #path_array = np.array(path.split(',')) - #path_x = np.array(path_array[0::2], dtype=float) - #path_y = np.array(path_array[1::2], dtype=float) - #block["path_array"] = path_array - #block["path_x"] = path_x - #block["path_y"] = path_y - #poly[label] = block - jin["layers"] = poly - jin["storage_directory"] = poly_info[0][2] - jin["swc_file"] = poly_info[0][3] - - # reconstruction ID - # steal this from file name - fname = jin["swc_file"].split("_m.swc")[0] - reconstruction_id = int(fname[-9:]) - jin["reconstruction_id"] = reconstruction_id - jin["resolution"] = 0.363 - - - # it appears that we need to restrict image query to use this ims_id - ims_id = poly_info[0][4] - - #################################################################### - # get soma outline - soma_sql = """ - SELECT poly.path - from image_series ims - join sub_images si on si.image_series_id = ims.id - join avg_graphic_objects layer on layer.sub_image_id = si.id - join avg_graphic_objects poly on poly.parent_id = layer.id - join avg_group_labels layert on layert.id = layer.group_label_id - left JOIN images im ON im.id=si.image_id - left JOIN scans sc ON sc.image_id=im.id - JOIN avg_group_labels agl ON layer.group_label_id=agl.id - left join structures st on st.id = poly.structure_id - join specimens hemisl on hemisl.id = ims.specimen_id - join specimens cell on cell.parent_id = hemisl.id - join neuron_reconstructions nr on nr.specimen_id = cell.id - join well_known_files wkf on wkf.attachable_id = nr.id - JOIN well_known_file_types wkft ON wkft.id = wkf.well_known_file_type_id AND wkft.name = '3DNeuronReconstruction' - where nr.superseded is false - and agl.name = 'Soma' - and cell.id = %d - """ - #print soma_sql % spec_id - cursor.execute(soma_sql % spec_id) - soma_res = cursor.fetchall() - som = {} - som["label"] = "Soma" - som["path"] = soma_res[0] - jin["soma"] = som - - #################################################################### - # get 20x image - img_sql = """ - SELECT ss.storage_directory, im.jp2 from image_series ims - join sub_images si on si.image_series_id = ims.id - left JOIN images im ON im.id=si.image_id - left JOIN specimens cell on ims.specimen_id = cell.id - join slides ss on ss.id = im.slide_id - where cell.id = %d - """ - - # get 20x image - img_sql = """ - SELECT ss.storage_directory, im.jp2 - from image_series ims - join sub_images si on si.image_series_id = ims.id - left JOIN images im ON im.id=si.image_id - join slides ss on ss.id = im.slide_id - and ims.id = %s - """ - try: - cursor.execute(img_sql % ims_id) - #cursor.execute(img_sql % spec_id) - img_res = cursor.fetchall() - img_path = img_res[0][0] + img_res[0][1] - #img_path = "%s-20x.jpeg" % str(spec_id) - except: - print("Error fetching path to 20x image from database") - print(img_sql % spec_id) - raise - - img = {} - #img["img_res"] = img_res - img["img_path"] = img_path - jin["20x"] = img - - return jin - -if __name__ == "__main__": - spec_id = 490387590 - jin = prep_json(spec_id) - print("Test mode: creating input.json for specimen.id=%d" % spec_id) - json.write("input.json", jin) - diff --git a/allensdk/internal/pipeline_modules/cell_types/morphology/upright_transform.py b/allensdk/internal/pipeline_modules/cell_types/morphology/upright_transform.py deleted file mode 100644 index 9797163782..0000000000 --- a/allensdk/internal/pipeline_modules/cell_types/morphology/upright_transform.py +++ /dev/null @@ -1,392 +0,0 @@ -######################################################################## -# library code -import math -import argparse -import sys -import numpy as np -from scipy.spatial.distance import euclidean -import skimage.draw - - - -def calculate_centroid(x, y): - ''' Calculates the center of a polygon, using weighted averages - of vertex locations - ''' - assert len(x) == len(y), "Vertex arrays are of incorrect shape" - tot_len = 0.0 - tot_x = 0.0 - tot_y = 0.0 - for i in range(len(x)): - x0 = x[i-1] - y0 = y[i-1] - x1 = x[i] - y1 = y[i] - seg_len = euclidean((x0, y0), (x1, y1)) - tot_len += seg_len - tot_x += seg_len * x0 - tot_x += seg_len * x1 - tot_y += seg_len * y0 - tot_y += seg_len * y1 - tot_x /= 2.0 * tot_len - tot_y /= 2.0 * tot_len - return tot_x, tot_y - - -def construct_affine(theta): - tr_rot = [np.cos(theta), np.sin(theta), 0, - -np.sin(theta), np.cos(theta), 0, - 0, 0, 1, - 0, 0, 0 - ] - return tr_rot - - -#def get_pia_wm_rotation_transform(soma_coords, wm_coords, pia_coords, resolution): -# # get soma position using weighted average of vertices -# sx, sy = convert_coords_str(soma_coords) -# soma_x, soma_y = calculate_centroid(sx, sy) -# -# #pia_proj = project_to_polyline(pia_coords, avg_soma_position) -# #wm_proj = project_to_polyline(wm_coords, avg_soma_position) -# px, py, wx, wy = calculate_shortest(soma_x, soma_y, pia_coords, wm_coords) -# theta = vector_angle((0, 1), np.asarray([px,py]) - np.asarray([wx,wy])) -# print theta -# -# depth = euclidean((soma_x, soma_y), (px, py)) -# height = euclidean((wx, wy), (px, py)) -# return theta, resolution*depth, resolution*height, [px, py, wx, wy] - - -def convert_coords_str(coord_str): - vals = coord_str.split(',') - x = np.array(vals[0::2], dtype=float) - y = np.array(vals[1::2], dtype=float) - return x, y - -def calculate_shortest(soma_x, soma_y, pia, wm): - """ Calculates shortest distance through a point on the polygon wm - through the soma coordinates (soma_x, soma_y) and - through a point on the polygon pia. - - Returns the x,y points in pia and wm that define the endpoints of this - shortest line. - """ - pia_xs, pia_ys = convert_coords_str(pia) - wm_xs, wm_ys = convert_coords_str(wm) - ################# - # calculate canvas size and make canvas - width = max(pia_xs) - width = int(max(width, max(wm_xs))) - height = max(pia_ys) - height = int(max(height, max(wm_ys))) - - canvas = np.zeros((height+10, width+10, 3), dtype=np.uint8) - - for i in range(1,len(pia_xs)): - lr, lc = skimage.draw.line(int(pia_ys[i-1]), int(pia_xs[i-1]), int(pia_ys[i]), int(pia_xs[i])) - canvas[lr,lc,2] = 255 - - for i in range(1,len(wm_xs)): - lr, lc = skimage.draw.line(int(wm_ys[i-1]), int(wm_xs[i-1]), int(wm_ys[i]), int(wm_xs[i])) - canvas[lr,lc,0] = 255 - - # get points in white matter trace - wp_y, wp_x = np.nonzero(canvas[:,:,0]) - - ################## - # draw an extended line from each wm pix through the soma - # (there are usually less WM pix than pia pix, so this should be - # faster than iterating through pia pix) - # make array of blue (pia) channel only to - pia = canvas[:,:,2] - # draw line from each wm pix through the soma and into infinity - # (line terminates if/when it intersects with pia trace) - min_dist = None - min_coord = None # stores [ pia_x, pia_y, wm_x, wm_y ] - for i in range(len(wp_x)): - x0 = wp_x[i] - y0 = wp_y[i] - x1 = soma_x - y1 = soma_y - ############################################# - # adapted from Bresenham's line algorithm, from rosetacode - dx = abs(x1 - x0) - dy = abs(y1 - y0) - x, y = x0, y0 - sx = -1 if x0 > x1 else 1 - sy = -1 if y0 > y1 else 1 - if dx > dy: - err = dx / 2.0 - while x >= 0 and x < width and y >= 0 and y < height: - if pia[y,x] > 0: - dist = euclidean((x0, y0), (x, y)) - if min_dist is None or min_dist > dist: - min_dist = dist - min_coord = [x, y, x0, y0] - break - err -= dy - if err < 0: - y += sy - err += dx - x += sx - else: - err = dy / 2.0 - while x >= 0 and x < width and y >= 0 and y < height: - if pia[y,x] > 0: - dist = euclidean((x0, y0), (x, y)) - if min_dist is None or min_dist > dist: - min_dist = dist - min_coord = [x, y, x0, y0] - break - err -= dx - if err < 0: - x += sx - err += dy - y += sy - - if min_dist is None: - print("Unable to connect pia to WM through soma") - px = None - py = None - wx = None - wy = None - else: - px = min_coord[0] - py = min_coord[1] - wx = min_coord[2] - wy = min_coord[3] - return px, py, wx, wy - - -def dist_proj_point_lineseg(p, q1, q2): - # based on c code from http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment - l2 = euclidean(q1, q2) ** 2 - if l2 == 0: - return euclidean(p, q1) # q1 == q2 case - t = max(0, min(1, np.dot(p - q1, q2 - q1) / l2)) - proj = q1 + t * (q2 - q1) - return euclidean(p, proj), proj - - -def project_to_polyline(boundary, soma): - x, y = convert_coords_str(boundary) - points = zip(x, y) - dists_projs = [dist_proj_point_lineseg(soma, np.array(q1), np.array(q2)) - for q1, q2 in zip(points[:-1], points[1:])] - min_idx = np.argmin(np.array([d[0] for d in dists_projs])) - return dists_projs[min_idx][1] - - -def vector_angle(v1, v2): - return np.arctan2(v2[1], v2[0]) - np.arctan2(v1[1], v1[0]) - - -######################################################################## -# pipeline code -import allensdk.internal.core.swc as swc -from allensdk.internal.core.lims_pipeline_module import PipelineModule - - -def main(jin): - # per IT-14567, blockface analysis is no longer required - ######################################################################### - ## analyze blockface image - #try: - # soma = jin["blockface"]["Soma"]["path"] - # pia = jin["blockface"]["Pia"]["path"] - # wm = jin["blockface"]["White Matter"]["path"] - # res = float(jin["blockface"]["Pia"]["resolution"]) - #except: - # print("** Error -- missing requisite blockface field(s) in input json") - # raise - # - ## get soma position using weighted average of vertices - #try: - # sx, sy = convert_coords_str(soma) - # soma_x, soma_y = calculate_centroid(sx, sy) - #except: - # print("** Error -- unable to calculate soma information (blockface)") - # raise - # - ## calculate shortest path - #try: - # px, py, wx, wy = calculate_shortest(soma_x, soma_y, pia, wm) - ## calculate theta and affine - # theta = vector_angle((0, 1), np.asarray([px,py]) - np.asarray([wx,wy])) - ## calculate soma depth and cortical thickness - # depth = res * euclidean((soma_x, soma_y), (px, py)) - # blk_thickness = res * euclidean((wx, wy), (px, py)) - #except: - # print("** Error calculating shortest path (blockface)") - # raise - # - #blockface = {} - #blockface["pia_intersect"] = [ px, py ] - #blockface["wm_intersect"] = [ wx, wy ] - #blockface["soma_center"] = [ soma_x, soma_y ] - #blockface["soma_depth_um"] = depth - #try: - # blockface["soma_depth_relative"] = depth / blk_thickness - #except: - # blockface["soma_depth_relative"] = -1.0 # NaN is not friendly to ruby - #blockface["cort_thickness_um"] = blk_thickness - #blockface["theta"] = theta - - ######################################################################## - # analyze primary (20x) image - try: - soma = jin["primary"]["Soma"]["path"] - pia = jin["primary"]["Pia"]["path"] - wm = jin["primary"]["White Matter"]["path"] - res = float(jin["primary"]["Pia"]["resolution"]) - except: - print("** Error -- missing requisite primary (20x) field(s) in input json") - raise - - # get soma position using weighted average of vertices - try: - sx, sy = convert_coords_str(soma) - soma_x, soma_y = calculate_centroid(sx, sy) - except: - print("** Error -- unable to calculate soma information (primary)") - raise - try: - # calculate shortest path - px, py, wx, wy = calculate_shortest(soma_x, soma_y, pia, wm) - # calculate theta and affine - theta = vector_angle((0, 1), np.asarray([px,py]) - np.asarray([wx,wy])) - tr_rot = construct_affine(theta) - inv_tr_rot = construct_affine(-theta) - # calculate soma depth and cortical thickness - depth = res * euclidean((soma_x, soma_y), (px, py)) - raw_thickness = res * euclidean((wx, wy), (px, py)) - except: - print("** Error calculating shortest path (primary)") - raise - - - primary = {} - primary["pia_intersect"] = [ px, py ] - primary["wm_intersect"] = [ wx, wy ] - primary["soma_center"] = [ soma_x, soma_y ] - primary["soma_depth_um"] = depth - try: - primary["soma_depth_relative"] = depth / raw_thickness - except: - primary["soma_depth_relative"] = -1.0 # NaN is not friendly to ruby - primary["cort_thickness_um"] = raw_thickness - primary["theta"] = theta - - try: - scale = raw_thickness / blk_thickness - except: - scale = -1.0 # NaN is not ruby-friendly - - soma_coords_avail = False - if "swc_file" in jin: - # if SWC file available, extract soma position from it - try: - nrn = swc.read_swc(jin["swc_file"]) - root = nrn.soma_root() - soma_x = root.x - soma_y = root.y - soma_z = root.z - soma_coords_avail = True - except: - # treat this as a fatal error -- if SWC was specified then - # it should be used - print("**** Error reading SWC file '%s'" % jin["swc_file"]) - raise - - if not soma_coords_avail: - # hope that the 63x data is available. As of May 2017, this seems - # to no longer be supplied to the module, but just in case... - # IT-14567 continue if 63x data not available - try: - info = jin["soma_63x"] - sx, sy = convert_coords_str(info["path_63x"]) - soma_x, soma_y = calculate_centroid(sx, sy) - soma_x *= float(info["resolution"]) - soma_y *= float(info["resolution"]) - soma_z = float(info["idx"]) * float(info["thickness"]) - soma_coords_avail = True - except: - print("** Error reading soma 63x info from input json") - print("** Translation component of affine matrix is invalid **") - - if not soma_coords_avail: - raise Exception("** Error: Unable to construct translation component of affine") - - try: - # apply affine rotation to soma position - translate_x = soma_x*tr_rot[0] + soma_y*tr_rot[1] + soma_z*tr_rot[2] - translate_y = soma_x*tr_rot[3] + soma_y*tr_rot[4] + soma_z*tr_rot[5] - translate_z = soma_x*tr_rot[6] + soma_y*tr_rot[7] + soma_z*tr_rot[8] - # apply translation vector to transform - tr_rot[ 9] = -translate_x - tr_rot[10] = -translate_y - depth - tr_rot[11] = -translate_z - except: - print("** Error calculating affine tranform (math fault?)") - raise - soma_x = -translate_x - soma_y = -translate_y - depth - soma_z = -translate_z - - # apply affine rotation to soma position - translate_x = soma_x*inv_tr_rot[0] + soma_y*inv_tr_rot[1] + soma_z*inv_tr_rot[2] - translate_y = soma_x*inv_tr_rot[3] + soma_y*inv_tr_rot[4] + soma_z*inv_tr_rot[5] - translate_z = soma_x*inv_tr_rot[6] + soma_y*inv_tr_rot[7] + soma_z*inv_tr_rot[8] - - inv_tr_rot[ 9] = -translate_x - inv_tr_rot[10] = -translate_y - inv_tr_rot[11] = -translate_z - - try: - # upright transform. based on rotation in 20x image - upright = {} - for i in range(12): - upright["tvr_%02d" % i] = tr_rot[i] - upright["trv_%02d" % i] = inv_tr_rot[i] - jout = {} - jout["primary"] = primary - #jout["blockface"] = blockface # per IT-14567, disable blockface - jout["upright"] = upright - alignment = {} - alignment["scale"] = scale - alignment["rotate_x"] = theta - alignment["rotate_y"] = theta - alignment["rotate_z"] = 0.0 - alignment["scale_x"] = 1.0 - alignment["scale_y"] = 1.0 - alignment["scale_z"] = 1.0 - alignment["skew_x"] = 0.0 - alignment["skew_y"] = 0.0 - alignment["skew_z"] = 0.0 - jout["alignment"] = alignment - except: - print("** Internal error **") - raise - - return jout - - # - # test transform -- bar.swc should match the source file - #print("source swc: " + jin["swc_file"]) - #print tr_rot - #morph2 = swc.read_swc(jin["swc_file"]) - #morph2.apply_affine(tr_rot) - #morph2.save("foo.swc") - #morph3 = swc.read_swc("foo.swc") - #morph3.apply_affine(inv_tr_rot) - #morph3.save("bar.swc") - -if __name__ == "__main__": - # read module input. PipelineModule object automatically parses the - # command line to pull out input.json and output.json file names - module = PipelineModule() - jin = module.input_data() # loads input.json - jout = main(jin) - module.write_output_data(jout) # writes output.json - diff --git a/allensdk/internal/pipeline_modules/gbm/__init__.py b/allensdk/internal/pipeline_modules/gbm/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py b/allensdk/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py deleted file mode 100644 index 30257be6ea..0000000000 --- a/allensdk/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py +++ /dev/null @@ -1,39 +0,0 @@ -### -# This program generates a json file containing the GBM analysis run records from an sql query - -# To Do: This will be done by the strategy and later removed from here. - -import psycopg2 -import json -import sys - - -def main(analysis_records_json_location, db_host, db_port, db_name, db_user, db_passwd): - - conn = psycopg2.connect(host=db_host, port=db_port, dbname=db_name, user=db_user, password=db_passwd) - cur = conn.cursor() - cur.execute("select distinct rna.id as rna_well_id, gen.storage_directory || gen.filename, trans.storage_directory " - "|| trans.filename from wells rna join rs_tubes t on t.sample_id = rna.id join rna_seq_experiments e " - "on e.rs_tube_id = t.id join rna_seq_analysis_runs_rna_seq_experiments ar2e on ar2e.rna_seq_experiment_id " - "= e.id join well_known_files gen on gen.attachable_id = ar2e.rna_seq_analysis_run_id and " - "gen.well_known_file_type_id = 267380639 join well_known_files trans on trans.attachable_id " - "= ar2e.rna_seq_analysis_run_id and trans.well_known_file_type_id = 267380638 where gen.published_at is " - "not null and gen.storage_directory ilike '%/gbm/%' order by rna.id;") - data = cur.fetchall() - analysis_run_records = {"analysis_run_records": []} - for item in data: - record = {"rna_well_id": item[0], "analysis_run_gene_path": item[1], "analysis_run_transcript_path": item[2]} - analysis_run_records["analysis_run_records"].append(record) - with open(analysis_records_json_location, 'w') as outfile: - json.dump(analysis_run_records, outfile) - - -if __name__ == '__main__': - - analysis_records_json_location = sys.argv[1] - db_host = sys.argv[2] - db_port = sys.argv[3] - db_name = sys.argv[4] - db_user = sys.argv[5] - db_passwd = sys.argv[6] - main(analysis_records_json_location, db_host, db_port, db_name, db_user, db_passwd) diff --git a/allensdk/internal/pipeline_modules/gbm/generate_gbm_heatmap.py b/allensdk/internal/pipeline_modules/gbm/generate_gbm_heatmap.py deleted file mode 100644 index 32a2d5e01d..0000000000 --- a/allensdk/internal/pipeline_modules/gbm/generate_gbm_heatmap.py +++ /dev/null @@ -1,143 +0,0 @@ -### -# Purpose: -# -# Generates the heatmap files for GBM analysis runs. The files are the following: -# transcripts_for_genes.csv, genes_for_transcripts.csv, gene_fpkm_table.csv, transcript_fpkm_table.csv -# -# Usage: -# -# python generate_gbm_heatmap.py input.json -# -# Input: -# -# input.json -# -# { -# "transcripts_for_genes_output":"/tmp/transcripts_for_genes.csv", -# "genes_for_transcripts_output":"/tmp/genes_for_transcripts.csv", -# "gene_fpkm_table_output":"/tmp/gene_fpkm_table.csv", -# "transcript_fpkm_table_output":"/tmp/transcript_fpkm_table.csv", -# "columns_samples_output":"/tmp/columns_samples.csv", -# "analysis_run_records":"/tmp/analysis_run_records.json", -# "sample_metadata_records":"/tmp/sample_metadata_records.json" -# } -# -# Output: -# -# Creates the specified csv files - -import json -import sys -import numpy as np -import pandas as pd - - -def create_transcripts_for_genes(analysis_run_gene_file): - - """ Creates a list that contains the associated transcript for each gene sorted by entrez_id """ - - transcripts_for_genes = np.genfromtxt(analysis_run_gene_file["analysis_run_gene_path"], usecols=[0, 1], skip_header=1, - dtype='str').tolist() - data = sorted(transcripts_for_genes, key=lambda row: int(row[0])) - header = ['gene_id', 'transcript_id(s)'] - data.insert(0, header) - data = pd.DataFrame(data) - return data - - -def create_genes_for_transcripts(analysis_run_transcript_file): - - """ Creates a list that contains the associated gene for each transcript sorted alphabetically """ - - genes_for_transcripts = np.genfromtxt(analysis_run_transcript_file["analysis_run_transcript_path"], usecols=[0, 1] - , skip_header=1, dtype='str').tolist() - data = sorted(genes_for_transcripts, key=lambda row: row[0].lower()) - header = ['transcript_id', 'gene_id'] - data.insert(0, header) - data = pd.DataFrame(data) - return data - - -def create_gene_fpkm_table(analysis_run_records): - - """ Creates a a matrix ("rows x columns = genes x samples") of fpkm gene expression values for each particular - (gene, sample) pair. Rows are sorted by entrez_id and columns are by rna_well_id """ - - gene_fpkm = [] - rna_well_ids = [] - - for record in analysis_run_records: - gene_fpkm.append(np.genfromtxt(record["analysis_run_gene_path"], usecols=[-1] - , skip_header=1, dtype='str')) - rna_well_ids.append(record["rna_well_id"]) - - entrez_ids = np.genfromtxt(analysis_run_records[0]["analysis_run_gene_path"], usecols=[0], skip_header=1 - , dtype='str').tolist() - entrez_ids_int = list(map(int, entrez_ids)) - gene_fpkm_table = np.column_stack(gene_fpkm) - df = pd.DataFrame(gene_fpkm_table, columns=rna_well_ids, index=entrez_ids_int) - df = df.sort_index() - rna_well_ids_sorted = sorted(list(map(int, rna_well_ids))) - data = df[rna_well_ids_sorted] - return data - - -def create_transcript_fpkm_table(analysis_run_records): - - """ Creates a a matrix ("rows x columns = transcripts x samples") of fpkm gene expression values for each particular - (transcript, sample) pair. Rows are sorted by transcript id and columns are by rna_well_id """ - - transcript_fpkm = [] - rna_well_ids = [] - - for record in analysis_run_records: - transcript_fpkm.append(np.genfromtxt(record["analysis_run_transcript_path"], usecols=[-1] - , skip_header=1, dtype='str')) - rna_well_ids.append(record["rna_well_id"]) - - transcript_ids = np.genfromtxt(analysis_run_records[0]["analysis_run_transcript_path"], usecols=[0], skip_header=1 - , dtype='str').tolist() - transcript_fpkm_table = np.column_stack(transcript_fpkm) - - df = pd.DataFrame(transcript_fpkm_table, columns=rna_well_ids, index=transcript_ids) - df = df.sort_index() - rna_well_ids_sorted = sorted(list(map(int, rna_well_ids))) - data = df[rna_well_ids_sorted] - return data - - -def create_sample_metadata(sample_metadata_records): - - """ Creates a table of sample metadata sorted by rna_well_id """ - - df = pd.DataFrame.from_dict(sample_metadata_records, orient='columns') - data = df.sort_values(by=['rna_well_id']).reset_index(drop=True) - rna_well_id = data['rna_well_id'] - data.drop(labels=['rna_well_id'], axis=1, inplace=True) - data.insert(0, 'rna_well_id', rna_well_id) - return data - - -def main(): - - input_file = sys.argv[1] - data = json.load(open(input_file)) - transcripts_for_genes_output = data["transcripts_for_genes_output"] - genes_for_transcripts_output = data["genes_for_transcripts_output"] - gene_fpkm_table_output = data["gene_fpkm_table_output"] - transcript_fpkm_table_output = data["transcript_fpkm_table_output"] - columns_samples_output = data["columns_samples_output"] - analysis_run_records = json.load(open(data["analysis_run_records"])) - sample_metadata_records = json.load(open(data["sample_metadata_records"])) - - create_transcripts_for_genes(analysis_run_records["analysis_run_records"][0]).to_csv(transcripts_for_genes_output, - index=False, header=False) - create_genes_for_transcripts(analysis_run_records["analysis_run_records"][0]).to_csv(genes_for_transcripts_output, - index=False, header=False) - create_gene_fpkm_table(analysis_run_records["analysis_run_records"]).to_csv(gene_fpkm_table_output) - create_transcript_fpkm_table(analysis_run_records["analysis_run_records"]).to_csv(transcript_fpkm_table_output) - create_sample_metadata(sample_metadata_records).to_csv(columns_samples_output, index=False) - - -if __name__ == '__main__': - main() diff --git a/allensdk/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py b/allensdk/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py deleted file mode 100644 index 0179dda6e3..0000000000 --- a/allensdk/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py +++ /dev/null @@ -1,43 +0,0 @@ -### -# This program generates a json file containing the GBM sample metadata records from an sql query - -# To Do: This will be done by the strategy and later removed from here. - -import psycopg2 -import json -import sys -from psycopg2.extras import RealDictCursor - - -def main(sample_metadata_json_location, db_host, db_port, db_name, db_user, db_passwd): - - conn = psycopg2.connect(host=db_host, port=db_port, dbname=db_name, user=db_user, password=db_passwd) - cur = conn.cursor(cursor_factory=RealDictCursor) - cur.execute("select distinct rna.id as rna_well_id, tumor.id as tumor_id, tumor.external_specimen_name as tumor_name" - ", block.id as block_id, block.external_specimen_name as block_name, sp.id as specimen_id" - ", sp.external_specimen_name as specimen_name, min(poly.id) as polygon_id, st.id as structure_id" - ", st.acronym as structure_abbreviation, to_hex(st.red) || to_hex(st.green) || to_hex(st.blue) as " - "structure_color, st.name as structure_name from wells rna join image_series mims on mims.id = " - "rna.image_series_id join specimens sp on sp.id = mims.specimen_id join specimens block on block.id = " - "sp.parent_id join specimens tumor on tumor.id = block.parent_id join avg_microarray_templates mt on " - "mt.image_series_id = mims.id join avg_graphic_objects poly on poly.id = mt.shape_id join structures st " - "on st.id = poly.structure_id join rs_tubes tube on tube.sample_id = rna.id join rna_seq_experiments exp " - "on exp.rs_tube_id = tube.id join rna_seq_analysis_runs_rna_seq_experiments ar2exp on " - "ar2exp.rna_seq_experiment_id = exp.id join analysis_runs ar on ar.id = ar2exp.rna_seq_analysis_run_id " - "join well_known_files fpkm on fpkm.attachable_id = ar.id where rna.sample_id_string like any (array " - "['366-___', '466-___']) and fpkm.published_at is not null group by tumor.id, " - "tumor.external_specimen_name, block.id, block.external_specimen_name, sp.id, sp.external_specimen_name, " - "rna.id, st.id, st.acronym, st.name, structure_color order by rna.id;") - with open(sample_metadata_json_location, 'w') as outfile: - json.dump(cur.fetchall(), outfile, indent=2) - - -if __name__ == '__main__': - - sample_metadata_json_location = sys.argv[1] - db_host = sys.argv[2] - db_port = sys.argv[3] - db_name = sys.argv[4] - db_user = sys.argv[5] - db_passwd = sys.argv[6] - main(sample_metadata_json_location, db_host, db_port, db_name, db_user, db_passwd) \ No newline at end of file diff --git a/allensdk/internal/pipeline_modules/run_annotated_region_metrics.py b/allensdk/internal/pipeline_modules/run_annotated_region_metrics.py deleted file mode 100644 index 6357cb6a6b..0000000000 --- a/allensdk/internal/pipeline_modules/run_annotated_region_metrics.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Run annotated region metrics calculations""" -import logging -import os -import h5py -from allensdk.internal.core.lims_utilities import get_input_json -from allensdk.internal.brain_observatory.annotated_region_metrics import get_metrics -from allensdk.internal.core.lims_pipeline_module import (PipelineModule, - run_module) - -SDK_PATH = "/data/informatics/CAM/isi_metrics/allensdk" -SCRIPT_PATH = ("/data/informatics/CAM/isi_metrics/allensdk/allensdk/internal" - "/pipeline_modules/run_annotated_region_metrics.py") - -def debug(region_id, storage_directory="./", local=True, - sdk_path=SDK_PATH, script_path=SCRIPT_PATH, lims_host="lims2"): - strategy_class = "AnnotatedRegionMetricsStrategy" - object_class = "AnnotatedRegion" - input_json = get_input_json(region_id, object_class, strategy_class, - lims_host) - exp_dir = os.path.join(storage_directory, str(region_id)) - run_module(script_path, - input_json, - exp_dir, - sdk_path=sdk_path, - pbs=dict(vmem=4, - job_name="isi_metrics_{}".format(region_id), - walltime="1:00:00"), - local=local) - - -def load_arrays(h5_file): - with h5py.File(h5_file, "r") as f: - altitude_phase = f['retinotopy_altitude'][:] - azimuth_phase = f['retinotopy_azimuth'][:] - return altitude_phase, azimuth_phase - - -def main(): - mod = PipelineModule() - data = mod.input_data() - - h5_file = data["processed_h5"] - altitude_phase, azimuth_phase = load_arrays(h5_file) - del data["processed_h5"] - - output_data = get_metrics(altitude_phase, azimuth_phase, **data) - - mod.write_output_data(output_data) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_demixing.py b/allensdk/internal/pipeline_modules/run_demixing.py deleted file mode 100644 index f1c2b3fa16..0000000000 --- a/allensdk/internal/pipeline_modules/run_demixing.py +++ /dev/null @@ -1,198 +0,0 @@ -import matplotlib -matplotlib.use('agg') -import matplotlib.pyplot as plt - -import allensdk.internal.core.lims_utilities as lu -from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module - -import argparse, os, logging, shutil -import h5py -import numpy as np -import shutil - -import allensdk.brain_observatory.demixer as demixer -from allensdk.config.manifest import Manifest - -import allensdk.core.json_utilities as ju -import logging - -EXCLUDE_LABELS = ["union", "duplicate", "motion_border", - "decrosstalk_ghost", - "decrosstalk_invalid_raw", - "decrosstalk_invalid_raw_active", - "decrosstalk_invalid_unmixed", - "decrosstalk_invalid_unmixed_active" ] - -def debug(experiment_id, local=False): - OUTPUT_DIRECTORY = "/data/informatics/CAM/demix" - SDK_PATH = "/data/informatics/CAM/analysis/allensdk" - SCRIPT = "/data/informatics/CAM/analysis/allensdk/allensdk/internal/pipeline_modules/run_demixing.py" - - sd = lu.query("select storage_directory from ophys_experiments where id = %d" % experiment_id)[0]['storage_directory'] - rois = lu.query("select * from cell_rois where ophys_experiment_id = %d" % experiment_id) - - exc_labels = lu.query(""" -select cr.id, rel.name as exclusion_label from cell_rois cr -join cell_rois_roi_exclusion_labels crrel on crrel.cell_roi_id = cr.id -join roi_exclusion_labels rel on crrel.roi_exclusion_label_id = rel.id -where cr.ophys_experiment_id = %d -""" % experiment_id) - - nrois = { roi['id']: dict(width=roi['width'], - height=roi['height'], - x=roi['x'], - y=roi['y'], - id=roi['id'], - valid=roi['valid_roi'], - mask=roi['mask_matrix'], - exclusion_labels=[]) - for roi in rois } - - for exc_label in exc_labels: - nrois[exc_label['id']]['exclusion_labels'].append(exc_label['exclusion_label']) - - movie_path_response = lu.query(''' - select wkf.filename, wkf.storage_directory from well_known_files wkf - join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id - where wkf.attachable_id = {} and wkf.attachable_type = 'OphysExperiment' - and wkft.name = 'MotionCorrectedImageStack' - '''.format(experiment_id)) - movie_h5_path = os.path.join(movie_path_response[0]['storage_directory'], movie_path_response[0]['filename']) - - exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) - - input_data = { - "movie_h5": movie_h5_path, - "traces_h5": os.path.join(sd, "processed", "roi_traces.h5"), - "roi_masks": nrois.values(), - "output_file": os.path.join(exp_dir, "demixed_traces.h5") - } - - run_module(SCRIPT, - input_data, - exp_dir, - sdk_path=SDK_PATH, - pbs=dict(vmem=160, - job_name="demix_%d"% experiment_id, - walltime="36:00:00"), - local=local, - optional_args=['--log-level','DEBUG']) - -def assert_exists(file_name): - if not os.path.exists(file_name): - raise IOError("file does not exist: %s" % file_name) - - -def get_path(obj, key, check_exists): - try: - path = obj[key] - except KeyError: - raise KeyError("required input field '%s' does not exist" % key) - - if check_exists: - assert_exists(path) - - return path - - -def parse_input(data, exclude_labels): - movie_h5 = get_path(data, "movie_h5", True) - traces_h5 = get_path(data, "traces_h5", True) - output_h5 = get_path(data, "output_file", False) - - with h5py.File(movie_h5, "r") as f: - movie_shape = f["data"].shape[1:] - - with h5py.File(traces_h5, "r") as f: - traces = f["data"][()] - trace_ids = [ int(rid) for rid in f["roi_names"][()] ] - - rois = get_path(data, "roi_masks", False) - masks = None - valid = None - - for roi in rois: - mask = np.zeros(movie_shape, dtype=bool) - mask_matrix = np.array(roi["mask"], dtype=bool) - mask[roi["y"]:roi["y"]+roi["height"],roi["x"]:roi["x"]+roi["width"]] = mask_matrix - - if masks is None: - masks = np.zeros((len(rois), mask.shape[0], mask.shape[1]), dtype=bool) - valid = np.zeros(len(rois), dtype=bool) - - rid = int(roi["id"]) - try: - ridx = trace_ids.index(rid) - except ValueError as e: - raise ValueError("Could not find cell roi id %d in roi traces file" % rid) - - masks[ridx,:,:] = mask - - valid[ridx] = len(set(exclude_labels) & set(roi.get("exclusion_labels",[]))) == 0 - - return traces, masks, valid, np.array(trace_ids), movie_h5, output_h5 - -def main(): - mod = PipelineModule() - mod.parser.add_argument("--exclude-labels", nargs="*", default=EXCLUDE_LABELS) - - data = mod.input_data() - logging.debug("reading input") - - traces, masks, valid, trace_ids, movie_h5, output_h5 = parse_input(data, mod.args.exclude_labels) - - logging.debug("excluded masks: %s", str(zip(np.where(~valid)[0], trace_ids[~valid]))) - output_dir = os.path.dirname(output_h5) - plot_dir = os.path.join(output_dir, "demix_plots") - if os.path.exists(plot_dir): - shutil.rmtree(plot_dir) - Manifest.safe_mkdir(plot_dir) - - logging.debug("reading movie") - with h5py.File(movie_h5, 'r') as f: - movie = f['data'][()] - - # only demix non-union, non-duplicate ROIs - valid_idxs = np.where(valid) - demix_traces = traces[valid_idxs] - demix_masks = masks[valid_idxs] - - logging.debug("demixing") - demixed_traces, drop_frames = demixer.demix_time_dep_masks(demix_traces, movie, demix_masks) - - nt_inds = demixer.plot_negative_transients(demix_traces, - demixed_traces, - valid[valid_idxs], - demix_masks, - trace_ids[valid_idxs], - plot_dir) - - logging.debug("rois with negative transients: %s", str(trace_ids[valid_idxs][nt_inds])) - - nb_inds = demixer.plot_negative_baselines(demix_traces, - demixed_traces, - demix_masks, - trace_ids[valid_idxs], - plot_dir) - - # negative baseline rois (and those that overlap with them) become nans - logging.debug("rois with negative baselines (or overlap with them): %s", str(trace_ids[valid_idxs][nb_inds])) - demixed_traces[nb_inds, :] = np.nan - - logging.info("Saving output") - out_traces = np.zeros(traces.shape, dtype=demix_traces.dtype) - out_traces[:] = np.nan - out_traces[valid_idxs] = demixed_traces - - with h5py.File(output_h5, 'w') as f: - f.create_dataset("data", data=out_traces, compression="gzip") - roi_names = np.array([str(rn) for rn in trace_ids]).astype(np.string_) - f.create_dataset("roi_names", data=roi_names) - - mod.write_output_data(dict( - negative_transient_roi_ids=trace_ids[valid_idxs][nt_inds], - negative_baseline_roi_ids=trace_ids[valid_idxs][nb_inds] - )) - - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_dff_computation.py b/allensdk/internal/pipeline_modules/run_dff_computation.py deleted file mode 100644 index 1bf1373a03..0000000000 --- a/allensdk/internal/pipeline_modules/run_dff_computation.py +++ /dev/null @@ -1,59 +0,0 @@ -import os -import argparse -import h5py -import logging -from allensdk.brain_observatory.dff import calculate_dff -import allensdk.core.json_utilities as ju - - -def parse_input(data): - input_file = data.get("input_file", None) - - if input_file is None: - raise IOError("input JSON missing required field 'input_file'") - if not os.path.exists(input_file): - raise IOError("input file does not exists: %s" % input_file) - - output_file = data.get("output_file", None) - - if output_file is None: - raise IOError("input JSON missing required field 'output_file'") - - return input_file, output_file - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("input_json") - parser.add_argument("output_json") - parser.add_argument("--log_level", default=logging.DEBUG) - parser.add_argument("--input_dataset", default="FC") - parser.add_argument("--roi_field", default="roi_names") - parser.add_argument("--output_dataset", default="data") - args = parser.parse_args() - - logging.getLogger().setLevel(args.log_level) - - input_data = ju.read(args.input_json) - input_file, output_file = parse_input(input_data) - - # read from "data" - input_h5 = h5py.File(input_file, "r") - traces = input_h5[args.input_dataset].value - roi_names = input_h5[args.roi_field][:] - input_h5.close() - - dff = calculate_dff(traces) - - # write to "data" - output_h5 = h5py.File(output_file, "w") - output_h5[args.output_dataset] = dff - output_h5[args.roi_field] = roi_names - output_h5.close() - - output_data = {} - - ju.write(args.output_json, output_data) - - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_eye_tracking.py b/allensdk/internal/pipeline_modules/run_eye_tracking.py deleted file mode 100755 index 5897df093f..0000000000 --- a/allensdk/internal/pipeline_modules/run_eye_tracking.py +++ /dev/null @@ -1,73 +0,0 @@ -import matplotlib -matplotlib.use('agg') - -import logging -import numpy as np -import os, sys - -from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module -from allensdk.internal.brain_observatory.run_itracker import (run_itracker, - compute_bounding_box, - DEFAULT_THRESHOLD_FACTOR, - get_experiment_info) - -def debug(experiment_id, num_frames=None, threshold_factor=None, local=False): - OUTPUT_DIR = "/data/informatics/CAM/eye_tracking/" - SDK_PATH = "/data/informatics/CAM/eye_tracking/allensdk" - SCRIPT_PATH = "/data/informatics/CAM/eye_tracking/allensdk/allensdk/internal/pipeline_modules/run_eye_tracking.py" - - experiment_dir = os.path.join(OUTPUT_DIR, str(experiment_id)) - - info = get_experiment_info(experiment_id) - info['output_directory'] = experiment_dir - - optional_args = [ ] - if num_frames is not None: - optional_args += ['--num_frames',str(num_frames)] - - run_module(SCRIPT_PATH, - info, - experiment_dir, - sdk_path=SDK_PATH, - pbs=dict(vmem=160, - job_name="itrack_%d"% experiment_id, - walltime="10:00:00"), - local=local, - optional_args=optional_args) - -def main(): - mod = PipelineModule() - mod.parser.add_argument("--num_frames", type=int, default=None) - mod.parser.add_argument("--threshold_factor", type=float, default=DEFAULT_THRESHOLD_FACTOR) - - data = mod.input_data() - args = dict( - movie_file=data['movie_file'], - metadata_file=data['metadata_file'], - output_directory=data['output_directory'], - threshold_factor=data.get('threshold_factor', mod.args.threshold_factor), - num_frames=mod.args.num_frames, - auto=True, - cache_input_frames=True, - input_block_size=None, - output_annotated_movie_block_size=None - ) - - if data.get('pupil_points', None): - args['bbox_pupil'] = compute_bounding_box(data['pupil_points']) - if data.get('corneal_reflection_points', None): - args['bbox_cr'] = compute_bounding_box(data['corneal_reflection_points']) - - tracker = run_itracker(**args) - - logging.debug("finished running itracker") - - output_data = dict( - pupil_file=tracker.pupil_file, - corneal_reflection_file=tracker.cr_file, - mean_frame_file=tracker.mean_frame_file - ) - - mod.write_output_data(output_data) - -if __name__=='__main__': main() diff --git a/allensdk/internal/pipeline_modules/run_neuropil_correction.py b/allensdk/internal/pipeline_modules/run_neuropil_correction.py deleted file mode 100755 index 008cfd3775..0000000000 --- a/allensdk/internal/pipeline_modules/run_neuropil_correction.py +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/python -import matplotlib -matplotlib.use('agg') -import matplotlib.pyplot as plt -import logging -import numpy as np -from allensdk.brain_observatory.r_neuropil import estimate_contamination_ratios -import allensdk.internal.core.lims_utilities as lu -import h5py -import json -import copy -import os -import sys -import argparse -import shutil - -from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module - -def debug(experiment_id, local=False): - OUTPUT_DIRECTORY = "/data/informatics/CAM/neuropil" - SDK_PATH = "/data/informatics/CAM/neuropil/allensdk" - SCRIPT = "/data/informatics/CAM/neuropil/allensdk/allensdk/internal/pipeline_modules/run_neuropil_correction.py" - - exp = lu.query("select * from ophys_experiments where id = %d" % experiment_id)[0] - sd = exp["storage_directory"] - - test_file = "/data/informatics/CAM/demix/%d/demixed_traces.h5" % experiment_id - if os.path.exists(test_file): - roi_trace_file = test_file - else: - roi_trace_file = os.path.join(sd, "demix", "%d_demixed_traces.h5" % experiment_id) - - exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) - input_data = dict( - roi_trace_file = roi_trace_file, - neuropil_trace_file = os.path.join(sd, "processed", "neuropil_traces.h5"), - storage_directory = exp_dir - ) - - run_module(SCRIPT, - input_data, - exp_dir, - sdk_path=SDK_PATH, - pbs=dict(vmem=160, - job_name="np_%d"% experiment_id, - walltime="36:00:00"), - local=local, - optional_args=['--log-level','DEBUG']) - - -def debug_plot(file_name, roi_trace, neuropil_trace, corrected_trace, r, r_vals=None, err_vals=None): - fig = plt.figure(figsize=(15,10)) - - ax = fig.add_subplot(211) - ax.plot(roi_trace,'r', label="raw") - ax.plot(corrected_trace,'b', label="fc") - ax.plot(neuropil_trace,'g', label="neuropil") - ax.set_xlim(0,roi_trace.size) - ax.set_title('raw(%.02f, %.02f) fc(%.02f, %.02f) r(%f)' % (roi_trace.min(), roi_trace.max(), corrected_trace.min(), corrected_trace.max(), r)) - ax.legend() - - if r_vals is not None: - ax = fig.add_subplot(212) - ax.plot(r_vals, err_vals, "o") - - plt.savefig(file_name) - plt.close() - -def adjust_r_for_negativity(r, F_C, F_M, F_N): - # this function is no longer used, but leaving it here just in case - # loop through all of the negative spots and pick r to fix them - neg_is = np.argwhere(F_C < 0) - if neg_is.size > 0: - logging.debug("Correcting for negative trace, starting with r = %f", r) - - for i in neg_is: - if F_C[i] >= 0: - continue - # r_new = (F_C[i] + r_old * F_N[i]) / F_N[i] - r = F_M[i] / F_N[i] - F_C = F_M - r * F_N - logging.debug(" updated r to %f", r) - - - # if there is still a negative spot, it's off by some tiny epsilon. - # step r down by delta_r increments until we find one that works. - delta_r = -1e-5 - while F_C.min() < 0 and r >= 0.0: - r += delta_r - F_C = F_M - r * F_N - logging.debug(" stepped r to %f", r) - - logging.debug(" finished with r = %f", r) - - return r - - -def main(): - module = PipelineModule() - args = module.args - - jin = module.input_data() - - ######################################################################## - # prelude -- get processing metadata - - trace_file = jin["roi_trace_file"] - neuropil_file = jin["neuropil_trace_file"] - storage_dir = jin["storage_directory"] - - plot_dir = os.path.join(storage_dir, "neuropil_subtraction_plots") - if os.path.exists(plot_dir): - shutil.rmtree(plot_dir) - - try: - os.makedirs(plot_dir) - except: - pass - - logging.info("Neuropil correcting '%s'", trace_file) - - ######################################################################## - # process data - - try: - roi_traces = h5py.File(trace_file, "r") - except: - logging.error("Error: unable to open ROI trace file '%s'", trace_file) - raise - - try: - neuropil_traces = h5py.File(neuropil_file, "r") - except: - logging.error("Error: unable to open neuropil trace file '%s'", neuropil_file) - raise - - ''' - get number of traces, length, etc. - ''' - num_traces, T = roi_traces['data'].shape - T_orig = T - T_cross_val = int(T/2) - if (T - T_cross_val > T_cross_val): - T = T - 1 - - # make sure that ROI and neuropil trace files are organized the same - n_id = neuropil_traces["roi_names"][:].astype(str) - r_id = roi_traces["roi_names"][:].astype(str) - logging.info("Processing %d traces", len(n_id)) - assert len(n_id) == len(r_id), "Input trace files are not aligned (ROI count)" - for i in range(len(n_id)): - assert n_id[i] == r_id[i], "Input trace files are not aligned (ROI IDs)" - ''' - initialize storage variables and analysis routine - ''' - r_list = [ None ] * num_traces - RMSE_list = [ -1 ] * num_traces - roi_names = n_id - corrected = np.zeros((num_traces, T_orig)) - r_vals = [ None ] * num_traces - - for n in range(num_traces): - roi = roi_traces['data'][n] - neuropil = neuropil_traces['data'][n] - - if np.any(np.isnan(neuropil)): - logging.warning("neuropil trace for roi %d contains NaNs, skipping", n) - continue - - if np.any(np.isnan(roi)): - logging.warning("roi trace for roi %d contains NaNs, skipping", n) - continue - - r = None - - logging.info("Correcting trace %d (roi %s)", n, str(n_id[n])) - results = estimate_contamination_ratios(roi, neuropil) - logging.info("r=%f err=%f it=%d", results["r"], results["err"], results["it"]) - - r = results["r"] - fc = roi - r * neuropil - RMSE_list[n] = results["err"] - r_vals[n] = results["r_vals"] - - debug_plot(os.path.join(plot_dir, "initial_%04d.png" % n), - roi, neuropil, fc, r, results["r_vals"], results["err_vals"]) - - # mean of the corrected trace must be positive - if fc.mean() > 0: - r_list[n] = r - corrected[n,:] = fc - else: - logging.warning("fc has negative baseline, skipping this r value") - - # compute mean valid r value - r_mean = np.array([r for r in r_list if r is not None ]).mean() - - # fill in empty r values - for n in range(num_traces): - roi = roi_traces['data'][n] - neuropil = neuropil_traces['data'][n] - - if r_list[n] is None: - logging.warning("Error estimated r for trace %d. Setting to zero.", n) - r_list[n] = 0 - corrected[n,:] = roi - - # save a debug plot - debug_plot(os.path.join(plot_dir, "final_%04d.png" % n), - roi, neuropil, corrected[n,:], r_list[n]) - - # one last sanity check - eps = -0.0001 - if np.mean(corrected[n,:]) < eps: - raise Exception("Trace %d baseline is still negative value after correction" % n) - - if r_list[n] < 0.0: - raise Exception("Trace %d ended with negative r" % n) - - - ######################################################################## - # write out processed data - - try: - savefile = os.path.join(storage_dir, "neuropil_correction.h5") - hf = h5py.File(savefile, 'w') - hf.create_dataset("r", data=r_list) - hf.create_dataset("RMSE", data=RMSE_list) - hf.create_dataset("FC", data=corrected, compression="gzip") - hf.create_dataset("roi_names", data=roi_names.astype(np.string_)) - - for n in range(num_traces): - r = r_vals[n] - if r is not None: - hf.create_dataset("r_vals/%d" % n, data=r) - hf.close() - except: - logging.error("Error creating output h5 file") - raise - - roi_traces.close() - neuropil_traces.close() - - jout = copy.copy(jin) - jout["neuropil_correction"] = savefile - module.write_output_data(jout) - - logging.info("finished") - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_observatory_analysis.py b/allensdk/internal/pipeline_modules/run_observatory_analysis.py deleted file mode 100644 index c4bc75311e..0000000000 --- a/allensdk/internal/pipeline_modules/run_observatory_analysis.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/python -# Copyright 2016 Allen Institute for Brain Science -# This file is part of Allen SDK. -# -# Allen SDK is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3 of the License. -# -# Allen SDK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>. - -import json, sys, traceback, logging -from allensdk.brain_observatory.session_analysis import run_session_analysis -import allensdk.brain_observatory.stimulus_info as si -import allensdk.core.json_utilities as json_util -from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module, SHARED_PYTHON -import allensdk.internal.core.lims_utilities as lu -from six import iteritems -import os -import logging - -def get_experiment_nwb_file(experiment_id): - res = lu.query(""" -select * from well_known_files wkf -join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id -where attachable_id = %d -and wkft.name = 'NWBOphys' -""" % experiment_id) - return os.path.join(res[0]['storage_directory'], res[0]['filename']) - -def get_experiment_session(experiment_id): - return lu.query(""" -select stimulus_name from ophys_sessions os -join ophys_experiments oe on oe.ophys_session_id = os.id -where oe.id = %d -""" % experiment_id)[0]['stimulus_name'] - -def debug(experiment_ids, local=False, - OUTPUT_DIR = "/data/informatics/CAM/analysis/", - SDK_PATH = "/data/informatics/CAM/analysis/allensdk/", - walltime="10:00:00", - python=SHARED_PYTHON, - queue='braintv'): - - input_data = {} - for eid in experiment_ids: - exp_dir = os.path.join(OUTPUT_DIR, str(eid)) - input_data[eid] = dict(nwb_file=get_experiment_nwb_file(eid), - output_file=os.path.join(exp_dir, "%d_analysis.h5" % eid), - session_name=get_experiment_session(eid)) - - run_module(os.path.abspath(__file__), - input_data, - exp_dir, - python=python, - sdk_path=SDK_PATH, - pbs=dict(vmem=32, - job_name="bobanalysis_%d"% eid, - walltime=walltime, - queue=queue), - local=local) - -def main(): - mod = PipelineModule() - jin = mod.input_data() - - results = {} - - for ident, experiment in iteritems(jin): - nwb_file = experiment['nwb_file'] - output_file = experiment['output_file'] - - if experiment["session_name"] not in si.SESSION_STIMULUS_MAP.keys(): - raise Exception("Could not run analysis for unknown session: %s" % experiment["session_name"]) - - logging.info("Running %s analysis", experiment["session_name"]) - logging.info("NWB file %s", nwb_file) - logging.info("Output file %s", output_file) - - results[ident] = run_session_analysis(nwb_file, output_file, - save_flag=True, plot_flag=False) - - logging.info("Generating output") - - jout = {} - for session_name, data in results.items(): - # results for this session - res = {} - # metric fields - names = {} - roi_id = None - for metric, values in data['cell'].items(): - if metric == "roi_id": - roi_id = values - else: - # convert dict to array - vals = [] - for i in range(len(values)): - vals.append(values[i]) # panda syntax - names[metric] = vals - # make an output record for each roi_id - if roi_id is not None: - for i in range(len(roi_id)): - name = roi_id[i] - roi = {} - for field, values in names.items(): - roi[field] = values[i] - res[name] = roi - - jout[session_name] = { - 'cell': res, - 'experiment': data['experiment'] - } - - logging.info("Saving output") - - mod.write_output_data(jout) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py b/allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py deleted file mode 100644 index 9de7891efa..0000000000 --- a/allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py +++ /dev/null @@ -1,67 +0,0 @@ -import json, os -import sys -import subprocess - -import run_observatory_thumbnails as robsth -import allensdk.internal.core.lims_utilities as lu -from allensdk.internal.core.lims_pipeline_module import run_module, PipelineModule -import allensdk.core.json_utilities as ju -from allensdk.config.manifest import Manifest - -def get_container_info(container_id): - res = lu.query(""" -select * from ophys_experiments oe -where experiment_container_id = %d -and oe.workflow_state != 'failed' -""" % container_id) - return res - -def debug(container_id, local=False, plots=None): - SCRIPT = "/data/informatics/CAM/analysis/allensdk/allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py" - SDK_PATH = "/data/informatics/CAM/analysis/allensdk/" - OUTPUT_DIR = "/data/informatics/CAM/analysis/containers" - - container_dir = os.path.join(OUTPUT_DIR, str(container_id)) - - input_data = [] - for exp in get_container_info(container_id): - exp_data = robsth.get_input_data(exp['id']) - exp_input_json = os.path.join(exp_data["output_directory"], "input.json") - input_data.append(dict( - input_json=exp_input_json, - output_json=os.path.join(exp_data["output_directory"], "output.json") - )) - - Manifest.safe_make_parent_dirs(exp_input_json) - ju.write(exp_input_json, exp_data) - - run_module(SCRIPT, - input_data, - container_dir, - sdk_path=SDK_PATH, - pbs=dict(vmem=32, - job_name="cthumbs_%d"% container_id, - walltime="10:00:00"), - local=local, - optional_args=['--types='+','.join(plots)] if plots else None) - -def main(): - mod = PipelineModule() - mod.parser.add_argument("--types", default=','.join(robsth.PLOT_TYPES)) - mod.parser.add_argument("--threads", default=4) - - data = mod.input_data() - types = mod.args.types.split(',') - - for input_file in data: - exp_input_json = input_file['input_json'] - exp_output_json = input_file['output_json'] - - exp_input_data = ju.read(exp_input_json) - - nwb_file, analysis_file, output_directory = robsth.parse_input(exp_input_data) - - robsth.build_experiment_thumbnails(nwb_file, analysis_file, output_directory, - types, mod.args.threads) - -if __name__=='__main__': main() diff --git a/allensdk/internal/pipeline_modules/run_observatory_thumbnails.py b/allensdk/internal/pipeline_modules/run_observatory_thumbnails.py deleted file mode 100644 index 8d77924f08..0000000000 --- a/allensdk/internal/pipeline_modules/run_observatory_thumbnails.py +++ /dev/null @@ -1,547 +0,0 @@ -import matplotlib -matplotlib.use('agg') - -import os, shutil -import allensdk.core.json_utilities as ju -import shutil -import numpy as np -import argparse -import scipy.misc -from scipy.stats import gaussian_kde - -import multiprocessing -import functools -import traceback -import logging - -from allensdk.brain_observatory.drifting_gratings import DriftingGratings -from allensdk.brain_observatory.static_gratings import StaticGratings -from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise -from allensdk.brain_observatory.natural_scenes import NaturalScenes -from allensdk.brain_observatory.natural_movie import NaturalMovie -from allensdk.brain_observatory import observatory_plots as oplots -from allensdk.core.brain_observatory_nwb_data_set import (BrainObservatoryNwbDataSet, - MissingStimulusException, - NoEyeTrackingException) -from allensdk.config.manifest import Manifest -from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module -import allensdk.internal.core.lims_utilities as lu -import allensdk.brain_observatory.stimulus_info as si -from contextlib import contextmanager - -LARGE_HEIGHT = 500 -SMALL_HEIGHT = 150 -SMALL_FONT = 4 -LARGE_FONT = 12 -PLOT_CONFIGS = { 'small': dict(height_px=SMALL_HEIGHT, pattern="%s_small.png", font_size=SMALL_FONT), - 'large': dict(height_px=LARGE_HEIGHT, pattern="%s_large.png", font_size=LARGE_FONT), - 'svg': dict(height_px=LARGE_HEIGHT, pattern="%s.svg", font_size=SMALL_FONT) } -PLOT_TYPES = ["dg", "sg", "ns", "lsn_on", - "lsn_off", "rf", - "nm1", "nm2", "nm3", "sp", - "corr", "eye"] - -def get_experiment_analysis_file(experiment_id): - res = lu.query(""" -select * from well_known_files wkf -join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id -where attachable_id = %d -and wkft.name = 'OphysExperimentCellRoiMetricsFile' -""" % experiment_id) - return os.path.join(res[0]['storage_directory'], res[0]['filename']) - -def get_experiment_nwb_file(experiment_id): - res = lu.query(""" -select * from well_known_files wkf -join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id -where attachable_id = %d -and wkft.name = 'NWBOphys' -""" % experiment_id) - return os.path.join(res[0]['storage_directory'], res[0]['filename']) - -def get_experiment_files(experiment_id): - nwb_file = get_experiment_nwb_file(experiment_id) - try: - analysis_file = get_experiment_analysis_file(experiment_id) - except: - analysis_file = None - - if not os.path.exists(nwb_file): - raise Exception("nwb file does not exist: %s" % nwb_file) - - #if not os.path.exists(analysis_file): - # raise Exception("analysis file does not exist: %s" % analysis_file) - - return nwb_file, analysis_file - -def get_input_data(experiment_id): - OUTPUT_DIR = "/data/informatics/CAM/analysis/" - - nwb_file, analysis_file = get_experiment_files(experiment_id) - output_directory = os.path.join(OUTPUT_DIR, str(experiment_id), "thumbnails") - - my_file = "/data/informatics/CAM/analysis/%d/%d_analysis.h5" % (experiment_id, experiment_id) - - if os.path.exists(my_file): - analysis_file = my_file - - input_data = { - 'nwb_file': nwb_file, - #'analysis_file': analysis_file, - 'analysis_file': analysis_file, - 'output_directory': output_directory - } - - return input_data - -def debug(experiment_id, plots=None, local=False): - SDK_PATH = "/data/informatics/CAM/analysis/allensdk/" - - input_data = get_input_data(experiment_id) - - run_module(os.path.abspath(__file__), - input_data, - input_data["output_directory"], - sdk_path=SDK_PATH, - pbs=dict(vmem=32, - job_name="bobthumbs_%d"% experiment_id, - walltime="10:00:00"), - local=local, - optional_args=['--types='+','.join(plots)] if plots else None) - -def build_plots(prefix, aspect, configs, output_dir, axes=None, transparent=False): - Manifest.safe_mkdir(output_dir) - - for config in configs: - h = config['height_px'] - w = int(h * aspect) - - file_name = os.path.join(output_dir, config["pattern"] % prefix) - - logging.debug("file: %s", file_name) - with oplots.figure_in_px(w, h, file_name, transparent=transparent) as fig: - matplotlib.rcParams.update({'font.size': config['font_size']}) - yield file_name - -def build_cell_plots(cell_specimen_ids, prefix, aspect, configs, output_dir, axes=None, transparent=False): - for i,csid in enumerate(cell_specimen_ids): - if np.isnan(csid): - cell_dir = os.path.join(output_dir, str(i)) - else: - cell_dir = os.path.join(output_dir, str(csid)) - - for fn in build_plots(prefix, aspect, configs, cell_dir, transparent=transparent): - yield fn, csid, i - -def build_drifting_gratings(dga, configs, output_dir): - for fn in build_plots("drifting_gratings_axes_pref_dir", 1.0, [configs['large'], configs['svg']], output_dir): - dga.plot_preferred_direction(include_labels=True) - oplots.finalize_no_axes() - - for fn in build_plots("drifting_gratings_pref_dir", 1.0, [configs['small']], output_dir): - dga.plot_preferred_direction(include_labels=False) - oplots.finalize_no_axes() - - for fn in build_plots("drifting_gratings_axes_pref_tf", 1.0, [configs['large'], configs['svg']], output_dir): - dga.plot_preferred_temporal_frequency() - oplots.finalize_with_axes() - - for fn in build_plots("drifting_gratings_pref_tf", 1.0, [configs['small']], output_dir): - dga.plot_preferred_temporal_frequency() - oplots.finalize_no_labels() - - for fn in build_plots("drifting_gratings_axes_dsi", 1.0, [configs['large'], configs['svg']], output_dir): - dga.plot_direction_selectivity() - oplots.finalize_with_axes() - - for fn in build_plots("drifting_gratings_dsi", 1.0, [configs['small']], output_dir): - dga.plot_direction_selectivity() - oplots.finalize_no_labels() - - for fn in build_plots("drifting_gratings_axes_osi", 1.0, [configs['large'], configs['svg']], output_dir): - dga.plot_orientation_selectivity() - oplots.finalize_with_axes() - - for fn in build_plots("drifting_gratings_osi", 1.0, [configs['small']], output_dir): - dga.plot_orientation_selectivity() - oplots.finalize_no_labels() - - csids = dga.data_set.get_cell_specimen_ids() - for fn, csid, i in build_cell_plots(csids, "drifting_gratings", 1.0, configs.values(), output_dir): - dga.open_star_plot(csid, include_labels=False, cell_index=i) - oplots.finalize_no_axes() - -def build_static_gratings(sga, configs, output_dir): - for fn in build_plots("static_gratings_axes_time_to_peak", 1.0, [configs['large'], configs['svg']], output_dir): - sga.plot_time_to_peak() - oplots.finalize_with_axes() - - for fn in build_plots("static_gratings_time_to_peak", 1.0, [configs['small']], output_dir): - sga.plot_time_to_peak() - oplots.finalize_no_labels() - - for fn in build_plots("static_gratings_axes_pref_ori", 1.5, [configs['large'], configs['svg']], output_dir): - sga.plot_preferred_orientation(include_labels=True) - oplots.finalize_no_axes() - - for fn in build_plots("static_gratings_pref_ori", 1.5, [configs['small']], output_dir): - sga.plot_preferred_orientation(include_labels=False) - oplots.finalize_no_axes() - - for fn in build_plots("static_gratings_axes_osi", 1.0, [configs['large'], configs['svg']], output_dir): - sga.plot_orientation_selectivity() - oplots.finalize_with_axes() - - for fn in build_plots("static_gratings_osi", 1.0, [configs['small']], output_dir): - sga.plot_orientation_selectivity() - oplots.finalize_no_labels() - - for fn in build_plots("static_gratings_axes_pref_sf", 1.0, [configs['large'], configs['svg']], output_dir): - sga.plot_preferred_spatial_frequency() - oplots.finalize_with_axes() - - for fn in build_plots("static_gratings_pref_sf", 1.0, [configs['small']], output_dir): - sga.plot_preferred_spatial_frequency() - oplots.finalize_no_labels() - - csids = sga.data_set.get_cell_specimen_ids() - for file_name, csid, i in build_cell_plots(csids, "static_gratings_all", 2.0, configs.values(), output_dir): - sga.open_fan_plot(csid, include_labels=False, cell_index=i) - oplots.finalize_no_axes() - -def build_natural_movie(nma, configs, output_dir, name): - csids = nma.data_set.get_cell_specimen_ids() - for file_name, csid, i in build_cell_plots(csids, name, 1.0, configs.values(), output_dir): - nma.open_track_plot(csid, cell_index=i) - oplots.finalize_no_axes() - -def build_natural_scenes(nsa, configs, output_dir): - for fn in build_plots("natural_scenes_axes_time_to_peak", 1.0, [configs['large'], configs['svg']], output_dir): - nsa.plot_time_to_peak() - oplots.finalize_with_axes() - - for fn in build_plots("natural_scenes_time_to_peak", 1.0, [configs['small']], output_dir): - nsa.plot_time_to_peak() - oplots.finalize_no_labels() - - csids = nsa.data_set.get_cell_specimen_ids() - for file_name, csid, i in build_cell_plots(csids, "natural_scenes", 1.0, configs.values(), output_dir): - nsa.open_corona_plot(csid, cell_index=i) - oplots.finalize_no_axes() - -def build_locally_sparse_noise(lsna, configs, output_dir, on): - prefix = "locally_sparse_noise_" + ("on" if on else "off") - - csids = lsna.data_set.get_cell_specimen_ids() - for file_name, csid, i in build_cell_plots(csids, prefix, 1.754, [configs['large'], configs['small']], output_dir): - lsna.open_pincushion_plot(on, cell_specimen_id=csid, cell_index=i) - oplots.finalize_no_axes() - -def build_receptive_field(lsna, configs, output_dir): - lsn_movie, lsn_mask = lsna.data_set.get_locally_sparse_noise_stimulus_template(lsna.stimulus, - mask_off_screen=False) - - if lsna.cell_index_receptive_field_analysis_data is None: - logging.warning("receptive field analysis not performed, so no receptive field plots will be made") - return - - clim = np.nanpercentile(lsna.receptive_field, [1.0,99.0], axis=None) - - for fn in build_plots("population_receptive_field", 1.754, [configs["large"]], output_dir, transparent=True): - lsna.plot_population_receptive_field(mask=lsn_mask, scalebar=True) - oplots.finalize_no_axes() - - for fn in build_plots("population_receptive_field", 1.754, [configs["small"]], output_dir, transparent=True): - lsna.plot_population_receptive_field(mask=lsn_mask, scalebar=False) - oplots.finalize_no_axes() - - csids = lsna.data_set.get_cell_specimen_ids() - for file_name, csid, i in build_cell_plots(csids, "receptive_field_on", 1.754, [configs["large"]], output_dir, transparent=True): - lsna.plot_cell_receptive_field(True, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=True) - oplots.finalize_no_axes() - - for file_name, csid, i in build_cell_plots(csids, "receptive_field_on", 1.754, [configs["small"]], output_dir, transparent=True): - lsna.plot_cell_receptive_field(True, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=False) - oplots.finalize_no_axes() - - for file_name, csid, i in build_cell_plots(csids, "receptive_field_off", 1.754, [configs["large"]], output_dir, transparent=True): - lsna.plot_cell_receptive_field(False, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=True) - oplots.finalize_no_axes() - - for file_name, csid, i in build_cell_plots(csids, "receptive_field_off", 1.754, [configs["small"]], output_dir, transparent=True): - lsna.plot_cell_receptive_field(False, cell_specimen_id=csid, clim=clim, mask=lsn_mask, cell_index=i, scalebar=False) - oplots.finalize_no_axes() - - -def build_speed_tuning(analysis, configs, output_dir): - csids = analysis.data_set.get_cell_specimen_ids() - - for fn in build_plots("running_speed", 1.0, [configs['large'], configs['svg']], output_dir): - analysis.plot_running_speed_histogram() - oplots.finalize_with_axes() - - for fn in build_plots("running_speed", 1.0, [configs['small']], output_dir): - analysis.plot_running_speed_histogram() - oplots.finalize_no_labels() - - for fn, csid, i in build_cell_plots(csids, "speed_tuning", 1.0, [configs['large'], configs['svg']], output_dir): - analysis.plot_speed_tuning(csid, cell_index=i) - oplots.finalize_with_axes() - - for fn, csid, i in build_cell_plots(csids, "speed_tuning", 1.0, [configs['small']], output_dir): - analysis.plot_speed_tuning(csid, cell_index=i) - oplots.finalize_no_axes() - -def build_correlation_plots(data_set, analysis_file, configs, output_dir): - sig_corrs = [] - noise_corrs = [] - - avail_stims = si.stimuli_in_session(data_set.get_session_type()) - ans = [] - labels = [] - colors = [] - if si.DRIFTING_GRATINGS in avail_stims: - dg = DriftingGratings.from_analysis_file(data_set, analysis_file) - - if hasattr(dg, 'representational_similarity'): - ans.append(dg) - labels.append(si.DRIFTING_GRATINGS_SHORT) - colors.append(si.DRIFTING_GRATINGS_COLOR) - setups = [ ( [configs['large']], True ), ( [configs['small']], False )] - for cfgs, show_labels in setups: - for fn in build_plots("drifting_gratings_representational_similarity", 1.0, cfgs, output_dir): - oplots.plot_representational_similarity(dg.representational_similarity, - dims=[dg.orivals, dg.tfvals[1:]], - dim_labels=["dir", "tf"], - dim_order=[1,0], - colors=['r','b'], - labels=show_labels) - - if si.STATIC_GRATINGS in avail_stims: - sg = StaticGratings.from_analysis_file(data_set, analysis_file) - if hasattr(sg, 'representational_similarity'): - ans.append(sg) - labels.append(si.STATIC_GRATINGS_SHORT) - colors.append(si.STATIC_GRATINGS_COLOR) - setups = [ ( [configs['large']], True ), ( [configs['small']], False )] - for cfgs, show_labels in setups: - for fn in build_plots("static_gratings_representational_similarity", 1.0, cfgs, output_dir): - oplots.plot_representational_similarity(sg.representational_similarity, - dims=[sg.orivals, sg.sfvals[1:], sg.phasevals], - dim_labels=["ori", "sf", "ph"], - dim_order=[1,0,2], - colors=['r','g','b'], - labels=show_labels) - - if si.NATURAL_SCENES in avail_stims: - ns = NaturalScenes.from_analysis_file(data_set, analysis_file) - if hasattr(ns, 'representational_similarity'): - ans.append(ns) - labels.append(si.NATURAL_SCENES_SHORT) - colors.append(si.NATURAL_SCENES_COLOR) - setups = [ ( [configs['large']], True ), ( [configs['small']], False )] - for cfgs, show_labels in setups: - for fn in build_plots("natural_scenes_representational_similarity", 1.0, cfgs, output_dir): - oplots.plot_representational_similarity(ns.representational_similarity, labels=show_labels) - - if len(ans): - for an in ans: - sig_corrs.append(an.signal_correlation) - extra_dims = range(2,len(an.noise_correlation.shape)) - noise_corrs.append(an.noise_correlation.mean(axis=tuple(extra_dims))) - - for fn in build_plots("correlation", 1.0, [configs['large'], configs['svg']], output_dir): - oplots.population_correlation_scatter(sig_corrs, noise_corrs, labels, colors, scale=16.0) - oplots.finalize_with_axes() - - for fn in build_plots("correlation", 1.0, [configs['small']], output_dir): - oplots.population_correlation_scatter(sig_corrs, noise_corrs, labels, colors, scale=4.0) - oplots.finalize_no_labels() - - csids = ans[0].data_set.get_cell_specimen_ids() - for fn, csid, i in build_cell_plots(csids, "signal_correlation", 1.0, [configs['large']], output_dir): - row = ans[0].row_from_cell_id(csid, i) - oplots.plot_cell_correlation([ np.delete(sig_corr[row],i) for sig_corr in sig_corrs ], - labels, colors) - oplots.finalize_with_axes() - - for fn, csid, i in build_cell_plots(csids, "signal_correlation", 1.0, [configs['small']], output_dir): - row = ans[0].row_from_cell_id(csid, i) - oplots.plot_cell_correlation([ np.delete(sig_corr[row],i) for sig_corr in sig_corrs ], - labels, colors) - oplots.finalize_no_labels() - - -def lsna_check_hvas(data_set, data_file): - avail_stims = si.stimuli_in_session(data_set.get_session_type()) - targeted_structure = data_set.get_metadata()['targeted_structure'] - - stim = None - - if targeted_structure == "VISp": - if si.LOCALLY_SPARSE_NOISE_4DEG in avail_stims: - stim = si.LOCALLY_SPARSE_NOISE_4DEG - elif si.LOCALLY_SPARSE_NOISE in avail_stims: - stim = si.LOCALLY_SPARSE_NOISE - else: - if si.LOCALLY_SPARSE_NOISE_8DEG in avail_stims: - stim = si.LOCALLY_SPARSE_NOISE_8DEG - elif si.LOCALLY_SPARSE_NOISE in avail_stims: - stim = si.LOCALLY_SPARSE_NOISE - - if stim is None: - raise MissingStimulusException("Could not find appropriate LSN stimulus for session %s", - data_set.get_session_type()) - else: - logging.debug("in structure %s, using %s stimulus for plots", targeted_structure, stim) - - - return LocallySparseNoise.from_analysis_file(data_set, data_file, stim) - - -def build_eye_tracking_plots(data_set, configs, output_dir): - try: - pupil_times, xy_deg = data_set.get_pupil_location() - xy_deg = xy_deg[np.isfinite(xy_deg).any(axis=1)] - if len(xy_deg) == 0: - logging.debug("Eye tracking had no finite data, should have been " - "failed") - return - elif len(xy_deg) < 3: - c = np.ones(len(xy_deg)) # not enough points for KDE, should probably be failed - else: - c = gaussian_kde(xy_deg.T)(xy_deg.T) - - for fn in build_plots("eye_tracking_gaze_axes", 1.0, - [configs['large'], configs['svg']], - output_dir): - oplots.plot_pupil_location(xy_deg, c=c, include_labels=True) - oplots.finalize_with_axes() - - for fn in build_plots("eye_tracking_gaze", 1.0, [configs['small']], - output_dir): - oplots.plot_pupil_location(xy_deg, c=c, include_labels=False) - oplots.finalize_no_axes() - except NoEyeTrackingException: - logging.debug("No eye tracking found.") - - -def build_type(nwb_file, data_file, configs, output_dir, type_name): - data_set = BrainObservatoryNwbDataSet(nwb_file) - try: - if type_name == "dg": - dga = DriftingGratings.from_analysis_file(data_set, data_file) - build_drifting_gratings(dga, configs, output_dir) - elif type_name == "sg": - sga = StaticGratings.from_analysis_file(data_set, data_file) - build_static_gratings(sga, configs, output_dir) - elif type_name == "nm1": - nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_ONE) - build_natural_movie(nma, configs, output_dir, si.NATURAL_MOVIE_ONE) - elif type_name == "nm2": - nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_TWO) - build_natural_movie(nma, configs, output_dir, si.NATURAL_MOVIE_TWO) - elif type_name == "nm3": - nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_THREE) - build_natural_movie(nma, configs, output_dir, si.NATURAL_MOVIE_THREE) - elif type_name == "ns": - nsa = NaturalScenes.from_analysis_file(data_set, data_file) - build_natural_scenes(nsa, configs, output_dir) - elif type_name == "sp": - nma = NaturalMovie.from_analysis_file(data_set, data_file, si.NATURAL_MOVIE_ONE) - build_speed_tuning(nma, configs, output_dir) - elif type_name == "lsn_on": - lsna = lsna_check_hvas(data_set, data_file) - build_locally_sparse_noise(lsna, configs, output_dir, True) - elif type_name == "lsn_off": - lsna = lsna_check_hvas(data_set, data_file) - build_locally_sparse_noise(lsna, configs, output_dir, False) - elif type_name == "rf": - lsna = lsna_check_hvas(data_set, data_file) - build_receptive_field(lsna, configs, output_dir) - elif type_name == "corr": - build_correlation_plots(data_set, data_file, configs, output_dir) - elif type_name == "eye": - build_eye_tracking_plots(data_set, configs, output_dir) - - except MissingStimulusException as e: - logging.warning("could not load stimulus (%s)", type_name) - except Exception as e: - traceback.print_exc() - logging.critical("error running stimulus (%s)", type_name) - raise e - -def parse_input(data): - nwb_file = data.get("nwb_file", None) - - if nwb_file is None: - raise IOError("input JSON missing required field 'nwb_file'") - if not os.path.exists(nwb_file): - raise IOError("nwb file does not exists: %s" % nwb_file) - - analysis_file = data.get("analysis_file", None) - - if analysis_file is None: - raise IOError("input JSON missing required field 'analysis_file'") - if not os.path.exists(analysis_file): - raise IOError("analysis file does not exists: %s" % analysis_file) - - - output_directory = data.get("output_directory", None) - - if output_directory is None: - raise IOError("input JSON missing required field 'output_directory'") - - Manifest.safe_mkdir(output_directory) - - return nwb_file, analysis_file, output_directory - -def build_experiment_thumbnails(nwb_file, analysis_file, output_directory, - types=None, threads=4): - if types is None: - types = PLOT_TYPES - - logging.info("nwb file: %s", nwb_file) - logging.info("analysis file: %s", analysis_file) - logging.info("output directory: %s", output_directory) - logging.info("types: %s", str(types)) - Manifest.safe_mkdir(output_directory) - - if len(types) == 1: - build_type(nwb_file, analysis_file, PLOT_CONFIGS, output_directory, types[0]) - elif threads == 1: - for type_name in types: - build_type(nwb_file, analysis_file, PLOT_CONFIGS, output_directory, type_name) - else: - p = multiprocessing.Pool(threads) - - func = functools.partial(build_type, nwb_file, analysis_file, PLOT_CONFIGS, output_directory) - results = p.map(func, types) - p.close() - p.join() - - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("-t", "--threads", type=int, default=4) - parser.add_argument("--log-level", default=logging.DEBUG) - parser.add_argument("--types", default=','.join(PLOT_TYPES)) - parser.add_argument("input_json") - parser.add_argument("output_json") - args = parser.parse_args() - - args.types = args.types.split(',') - - logging.getLogger().setLevel(args.log_level) - - input_data = ju.read(args.input_json) - - nwb_file, analysis_file, output_directory = parse_input(input_data) - - build_experiment_thumbnails(nwb_file, analysis_file, output_directory, - args.types, args.threads) - - ju.write(args.output_json, {}) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_ophys_eye_calibration.py b/allensdk/internal/pipeline_modules/run_ophys_eye_calibration.py deleted file mode 100644 index e6288084f6..0000000000 --- a/allensdk/internal/pipeline_modules/run_ophys_eye_calibration.py +++ /dev/null @@ -1,178 +0,0 @@ -import os -from allensdk.internal.core.lims_pipeline_module import (PipelineModule, - run_module) -from allensdk.internal.brain_observatory import (eye_calibration, - itracker_utils) -import allensdk.internal.core.lims_utilities as lu -import numpy as np -import h5py - -EYE_RADIUS = 0.1682 -CM_PER_PIXEL = 10.2/10000 - -def get_wkf(wkf_type, experiment_id): - wkf = lu.query(""" -select CONCAT(wkf.storage_directory, wkf.filename) as path -from well_known_files wkf -join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id -where wkft.name LIKE '{}' and wkf.attachable_id = {} -""".format(wkf_type, experiment_id))[0]["path"] - return wkf - -def debug(experiment_id, local=False): - OUTPUT_DIRECTORY = "/data/informatics/CAM/eye_calibration" - SDK_PATH = "/data/informatics/CAM/eye_calibration/allensdk" - SCRIPT = ("/data/informatics/CAM/eye_calibration/allensdk/allensdk" - "/internal/pipeline_modules/run_ophys_eye_calibration.py") - - frame_width = 640 - frame_height = 480 - - cr_file = get_wkf("EyeTracking Corneal Reflection", experiment_id) - pupil_file = get_wkf("EyeTracking Pupil", experiment_id) - - exp_info = lu.query(""" -select * -from ophys_sessions os -where os.id = {} -""".format(experiment_id))[0] - - exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) - # clear out missing values to let us get defaults - for key, value in list(exp_info.items()): - if value is None: - del exp_info[key] - - input_data = { - "cr_params_file": cr_file, - "pupil_params_file": pupil_file, - "frame_width": frame_width, - "frame_height": frame_height, - "output_file": os.path.join(exp_dir, - "eye_tracking_to_screen_mapping.h5"), - "monitor_position_x_mm": exp_info.get( - "screen_center_x_mm", eye_calibration.MONITOR_POSITION_OLD[0]*10), - "monitor_position_y_mm": exp_info.get( - "screen_center_y_mm", eye_calibration.MONITOR_POSITION_OLD[1]*10), - "monitor_position_z_mm": exp_info.get( - "screen_center_z_mm", eye_calibration.MONITOR_POSITION_OLD[2]*10), - "monitor_rotation_x_deg": exp_info.get("screen_rotation_x_deg", 0), - "monitor_rotation_y_deg": exp_info.get("screen_rotation_y_deg", 0), - "monitor_rotation_z_deg": exp_info.get("screen_rotation_z_deg", 0), - "camera_position_x_mm": exp_info.get( - "camera_center_x_mm", eye_calibration.CAMERA_POSITION_OLD[0]*10), - "camera_position_y_mm": exp_info.get( - "camera_center_y_mm", eye_calibration.CAMERA_POSITION_OLD[1]*10), - "camera_position_z_mm": exp_info.get( - "camera_center_z_mm", eye_calibration.CAMERA_POSITION_OLD[2]*10), - "camera_rotation_x_deg": exp_info.get( - "camera_rotation_x_deg", - eye_calibration.CAMERA_ROTATIONS_OLD[0]*180/np.pi), - "camera_rotation_y_deg": exp_info.get( - "camera_rotation_y_deg", - eye_calibration.CAMERA_ROTATIONS_OLD[1]*180/np.pi), - "camera_rotation_z_deg": exp_info.get( - "camera_rotation_z_deg", - eye_calibration.CAMERA_ROTATIONS_OLD[2]*180/np.pi), - "led_position_x_mm": exp_info.get( - "led_center_x_mm", eye_calibration.LED_POSITION_ORIGINAL[0]*10), - "led_position_y_mm": exp_info.get( - "led_center_y_mm", eye_calibration.LED_POSITION_ORIGINAL[1]*10), - "led_position_z_mm": exp_info.get( - "led_center_z_mm", eye_calibration.LED_POSITION_ORIGINAL[2]*10) - } - - # TEMPORARY HACKS TO DEAL WITH BAD DATA IN LIMS - # TODO: REMOVE WHEN DATAFIXES DONE - if input_data["monitor_position_x_mm"] == -86.2: - input_data["monitor_position_x_mm"] = \ - eye_calibration.MONITOR_POSITION_NEW[0]*10 - input_data["monitor_position_y_mm"] = \ - eye_calibration.MONITOR_POSITION_NEW[1]*10 - input_data["monitor_position_z_mm"] = \ - eye_calibration.MONITOR_POSITION_NEW[2]*10 - - run_module(SCRIPT, - input_data, - exp_dir, - sdk_path=SDK_PATH, - local=local) - - -def parse_input_data(data): - cr_params = np.load(data["cr_params_file"]) - pupil_params = np.load(data["pupil_params_file"]) - frame_width = data["frame_width"] - frame_height = data["frame_height"] - output_file = data["output_file"] - monitor_position = np.array([ - float(data['monitor_position_x_mm'])/10.0, - float(data['monitor_position_y_mm'])/10.0, - float(data['monitor_position_z_mm'])/10.0, - ]) - monitor_rotations = np.array([ - float(data['monitor_rotation_x_deg'])*np.pi/180, - float(data['monitor_rotation_y_deg'])*np.pi/180, - float(data['monitor_rotation_z_deg'])*np.pi/180, - ]) - camera_position = np.array([ - float(data['camera_position_x_mm'])/10.0, - float(data['camera_position_y_mm'])/10.0, - float(data['camera_position_z_mm'])/10.0, - ]) - camera_rotations = np.array([ - float(data['camera_rotation_x_deg'])*np.pi/180, - float(data['camera_rotation_y_deg'])*np.pi/180, - float(data['camera_rotation_z_deg'])*np.pi/180, - ]) - led_position = np.array([ - float(data['led_position_x_mm'])/10.0, - float(data['led_position_y_mm'])/10.0, - float(data['led_position_z_mm'])/10.0, - ]) - calibrator = eye_calibration.EyeCalibration( - monitor_position=monitor_position, - monitor_rotations=monitor_rotations, - led_position=led_position, - camera_position=camera_position, - camera_rotations=camera_rotations, - eye_radius=EYE_RADIUS, - cm_per_pixel=CM_PER_PIXEL) - - cr_params, _ = itracker_utils.post_process_cr(cr_params) - pupil_params = itracker_utils.post_process_pupil(pupil_params) - cr_params = itracker_utils.filter_bad_params(cr_params, frame_width, - frame_height) - pupil_params = itracker_utils.filter_bad_params(pupil_params, frame_width, - frame_height) - return calibrator, cr_params, pupil_params, output_file - - -def write_output(filename, position_degrees, position_cm, areas): - with h5py.File(filename, "w") as f: - f.create_dataset("screen_coordinates", data=position_cm) - f.create_dataset("screen_coordinates_spherical", - data=position_degrees) - f.create_dataset("pupil_areas", data=areas) - - -def main(): - mod = PipelineModule() - data = mod.input_data() - calibrator, cr_params, pupil_params, outfile = parse_input_data(data) - - pupil_areas = calibrator.compute_area(pupil_params) - pupil_on_monitor_deg = calibrator.pupil_position_on_monitor_in_degrees( - pupil_params, cr_params) - pupil_on_monitor_cm = calibrator.pupil_position_on_monitor_in_cm( - pupil_params, cr_params) - missing_index = np.isnan(pupil_areas) | np.isnan(pupil_on_monitor_deg.T[0]) - pupil_areas[missing_index] = np.nan - pupil_on_monitor_deg[missing_index,:] = np.nan - pupil_on_monitor_cm[missing_index,:] = np.nan - write_output(outfile, pupil_on_monitor_deg, pupil_on_monitor_cm, - pupil_areas) - - mod.write_output_data({"screen_mapping_file": outfile}) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_ophys_session_decomposition.py b/allensdk/internal/pipeline_modules/run_ophys_session_decomposition.py deleted file mode 100644 index 195b281d58..0000000000 --- a/allensdk/internal/pipeline_modules/run_ophys_session_decomposition.py +++ /dev/null @@ -1,115 +0,0 @@ -import logging -from allensdk.internal.core.lims_pipeline_module import (PipelineModule, - run_module) -import allensdk.core.json_utilities as ju -import allensdk.internal.core.lims_utilities as lu -from allensdk.internal.brain_observatory import ophys_session_decomposition as osd -from multiprocessing import Pool -import os - -DEBUG_CHANNELS = ["data", "piezo"] -DEBUG_WIDTH = 512 -DEBUG_HEIGHT = 256 -DEBUG_ITEMSIZE = 2 -DEBUG_N_PLANES = 6 - -def create_fake_metadata(exp_dir, raw_path, channels=None, - width=DEBUG_WIDTH, height=DEBUG_HEIGHT, - itemsize=DEBUG_ITEMSIZE, n_planes=DEBUG_N_PLANES): - metadata = [] - size = os.stat(raw_path).st_size - if channels is None: - channels = DEBUG_CHANNELS - n_frames = size/(itemsize*width*height) - frames_per_plane = n_frames/n_planes/len(channels) - for plane in range(n_planes): - experiment_id = plane - outfile = os.path.join(exp_dir, "plane_{}.h5".format(plane)) - frame_meta = [] - for i, channel in enumerate(channels): - byte_offset = width * height * itemsize * \ - (plane * len(channels) + i) - strides = [width*height*itemsize*n_planes*len(channels), - width*itemsize, - itemsize] - frame_meta.append({"byte_offset": byte_offset, - "channel": i+1, - "channel_description": channel, - "frame_description": "plane_{}".format(plane), - "dtype": ">u{}".format(itemsize), - "position_offset": [None, 0, 0], - "shape": [frames_per_plane, height, width], - "strides": strides}) - metadata.append({"output_file": outfile, - "experiment_id": experiment_id, - "frame_metadata": frame_meta}) - return metadata - - -def debug(experiment_id, local=False, raw_path=None): - OUTPUT_DIRECTORY = "/data/informatics/CAM/ophys_decomp" - SDK_PATH = "/data/informatics/CAM/ophys_decomp/allensdk" - SCRIPT = ("/data/informatics/CAM/ophys_decomp/allensdk/allensdk/" - "internal/pipeline_modules/run_ophys_session_decomposition.py") - - exp_dir = os.path.join(OUTPUT_DIRECTORY, str(experiment_id)) - - if raw_path is not None: - conversion_definitions = create_fake_metadata(exp_dir, raw_path) - input_data = {"raw_filename": raw_path, - "frame_metadata": conversion_definitions} - else: - raise NotImplementedError("No real examples exist yet") - - run_module(SCRIPT, - input_data, - exp_dir, - sdk_path=SDK_PATH, - pbs=dict(vmem=160, - job_name="ophys_decomp_%d"% experiment_id, - walltime="36:00:00"), - local=local) - - -def convert_frame(conversion_definition): - raw_filename = conversion_definition["input_file"] - ophys_hdf5_filename = conversion_definition["data_output_file"] - auxiliary_hdf5_filename = conversion_definition["auxiliary_output_file"] - experiment_id = conversion_definition["experiment_id"] - frame_metadata = conversion_definition["frame_metadata"] - osd.export_frame_to_hdf5(raw_filename, ophys_hdf5_filename, - auxiliary_hdf5_filename, frame_metadata) - return experiment_id, ophys_hdf5_filename, auxiliary_hdf5_filename - - -def parse_input(data): - '''Load all input data from the input json.''' - conversion_definitions = data["frame_metadata"] - for item in conversion_definitions: - item["input_file"] = data["raw_filename"] - return conversion_definitions - - -def main(): - mod = PipelineModule("Decompose ophys session into individual planes.") - mod.parser.add_argument("-t", "--threads", type=int, default=4) - - input_data = mod.input_data() - conversion_definitions = parse_input(input_data) - - if mod.args.threads > 1: - pool = Pool(processes=mod.args.threads) - output = pool.map(convert_frame, conversion_definitions) - else: - output= [] - for definition in conversion_definitions: - output.append(convert_frame(definition)) - - output_data = {} - for eid, ophys_file, auxiliary_file in output: - output_data[eid] = {"ophys_data": ophys_file, - "auxiliary_data": auxiliary_file} - - mod.write_output_data(output_data) - -if __name__ == "__main__": main() diff --git a/allensdk/internal/pipeline_modules/run_ophys_time_sync.py b/allensdk/internal/pipeline_modules/run_ophys_time_sync.py deleted file mode 100644 index 1d0227b49a..0000000000 --- a/allensdk/internal/pipeline_modules/run_ophys_time_sync.py +++ /dev/null @@ -1,268 +0,0 @@ -import logging -import argparse -import os -import datetime -import json -from typing import NamedTuple, Optional - -import numpy as np -import h5py - -import allensdk -from allensdk.internal.core.lims_pipeline_module import PipelineModule -from allensdk.internal.brain_observatory import time_sync as ts -from allensdk.brain_observatory.argschema_utilities import \ - check_write_access_overwrite - - -class TimeSyncOutputs(NamedTuple): - """ Schema for synchronization outputs - """ - - # unique identifier for the experiment being aligned - experiment_id: int - - # calculated monitor delay (s) - stimulus_delay: float - - # For each data stream, the count of "extra" timestamps (compared to the - # number of samples) - ophys_delta: int - stimulus_delta: int - eye_delta: int - behavior_delta: int - - # aligned timestamps for each data stream (s) - ophys_times: np.ndarray - stimulus_times: np.ndarray - eye_times: np.ndarray - behavior_times: np.ndarray - - # for non-ophys data streams, a mapping from samples to corresponding ophys - # frames - stimulus_alignment: np.ndarray - eye_alignment: np.ndarray - behavior_alignment: np.ndarray - - -class TimeSyncWriter: - - def __init__( - self, - output_h5_path: str, - output_json_path: Optional[str] = None - ): - """ Writes synchronization outputs to h5 and (optionally) json. - - Parameters - ---------- - output_h5_path : "heavy" outputs (e.g aligned timestamps and - ophy frame correspondances) will ONLY be stored here. Lightweight - outputs (e.g. stimulus delay) will also be written here as scalars. - output_json_path : if provided, lightweight outputs will be written - here, along with provenance information, such as the date and - allensdk version. - - """ - - self.output_h5_path: str = output_h5_path - self.output_json_path: Optional[str] = output_json_path - - def validate_paths(self): - """ Determines whether we can actually write to the specified paths, - allowing for creation of intermediate directories. It is a good idea - to run this beore doing any heavy calculations! - """ - - check_write_access_overwrite(self.output_h5_path) - - if self.output_json_path is not None: - check_write_access_overwrite(self.output_json_path) - - def write(self, outputs: TimeSyncOutputs): - """ Convenience for writing both an output h5 and (if applicable) an - output json. - - Parameters - ---------- - outputs : the data to be written - - """ - - self.write_output_h5(outputs) - - if self.output_json_path is not None: - self.write_output_json(outputs) - - def write_output_h5(self, outputs): - """ Write (mainly) heaviweight data to an h5 file. - - Parameters - ---------- - outputs : the data to be written - - """ - - os.makedirs(os.path.dirname(self.output_h5_path), exist_ok=True) - - with h5py.File(self.output_h5_path, "w") as output_h5: - output_h5["stimulus_alignment"] = outputs.stimulus_alignment - output_h5["eye_tracking_alignment"] = outputs.eye_alignment - output_h5["body_camera_alignment"] = outputs.behavior_alignment - output_h5["twop_vsync_fall"] = outputs.ophys_times - output_h5["ophys_delta"] = outputs.ophys_delta - output_h5["stim_delta"] = outputs.stimulus_delta - output_h5["stim_delay"] = outputs.stimulus_delay - output_h5["eye_delta"] = outputs.eye_delta - output_h5["behavior_delta"] = outputs.behavior_delta - - def write_output_json(self, outputs): - """ Write lightweight data to a json - - Parameters - ---------- - outputs : the data to be written - - """ - os.makedirs(os.path.dirname(self.output_json_path), exist_ok=True) - - with open(self.output_json_path, "w") as output_json: - json.dump({ - "allensdk_version": allensdk.__version__, - "date": str(datetime.datetime.now()), - "experiment_id": outputs.experiment_id, - "output_h5_path": self.output_h5_path, - "ophys_delta": outputs.ophys_delta, - "stim_delta": outputs.stimulus_delta, - "stim_delay": outputs.stimulus_delay, - "eye_delta": outputs.eye_delta, - "behavior_delta": outputs.behavior_delta - }, output_json, indent=2) - - -def check_stimulus_delay(obt_delay: float, min_delay: float, max_delay: float): - """ Raise an exception if the monitor delay is not within specified bounds - - Parameters - ---------- - obt_delay : obtained monitor delay (s) - min_delay : lower threshold (s) - max_delay : upper threshold (s) - - """ - - if obt_delay < min_delay or obt_delay > max_delay: - raise ValueError( - f"calculated monitor delay was {obt_delay:.3f}s " - f"(acceptable interval: [{min_delay:.3f}s, " - f"{max_delay:.3f}s])" - ) - - -def run_ophys_time_sync( - aligner: ts.OphysTimeAligner, - experiment_id: int, - min_stimulus_delay: float, - max_stimulus_delay: float -) -> TimeSyncOutputs: - """ Carry out synchronization of timestamps across the data streams of an - ophys experiment. - - Parameters - ---------- - aligner : drives alignment. See OphysTimeAligner for details of the - attributes and properties that must be implemented. - experiment_id : unique identifier for the experiment being aligned - min_stimulus_delay : reject alignment run (raise a ValueError) if the - calculated monitor delay is below this value (s). - max_stimulus_delay : reject alignment run (raise a ValueError) if the - calculated monitor delay is above this value (s). - - Returns - ------- - A TimeSyncOutputs (see definintion for more information) of output - parameters and arrays of aligned timestamps. - - """ - - stim_times, stim_delta, stim_delay = aligner.corrected_stim_timestamps - check_stimulus_delay(stim_delay, min_stimulus_delay, max_stimulus_delay) - - ophys_times, ophys_delta = aligner.corrected_ophys_timestamps - eye_times, eye_delta = aligner.corrected_eye_video_timestamps - beh_times, beh_delta = aligner.corrected_behavior_video_timestamps - - # stim array is index of ophys frame for each stim frame to match to - # so len(stim_times) - stim_alignment = ts.get_alignment_array(ophys_times, stim_times) - - # camera arrays are index of camera frame for each ophys frame ... - # cam_nwb_creator depends on this so keeping it that way even though - # it makes little sense... len(video_times) - eye_alignment = ts.get_alignment_array(eye_times, ophys_times, - int_method=np.ceil) - - behavior_alignment = ts.get_alignment_array(beh_times, ophys_times, - int_method=np.ceil) - - return TimeSyncOutputs( - experiment_id, - stim_delay, - ophys_delta, - stim_delta, - eye_delta, - beh_delta, - ophys_times, - stim_times, - eye_times, - beh_times, - stim_alignment, - eye_alignment, - behavior_alignment - ) - - -def main(): - parser = argparse.ArgumentParser("Generate brain observatory alignment.") - parser.add_argument("input_json", type=str, - help="path to input json" - ) - parser.add_argument("output_json", type=str, nargs="?", - help="path to which output json will be written" - ) - parser.add_argument("--log-level", default=logging.DEBUG) - parser.add_argument("--min-stimulus-delay", type=float, default=0.0, - help="reject results if monitor delay less than this value (s)" - ) - parser.add_argument("--max-stimulus-delay", type=float, default=0.07, - help="reject results if monitor delay greater than this value (s)" - ) - mod = PipelineModule("Generate brain observatory alignment.", parser) - - input_data = mod.input_data() - - writer = TimeSyncWriter(input_data.get("output_file"), mod.args.output_json) - writer.validate_paths() - - aligner = ts.OphysTimeAligner( - input_data.get("sync_file"), - scanner=input_data.get("scanner", None), - dff_file=input_data.get("dff_file", None), - stimulus_pkl=input_data.get("stimulus_pkl", None), - eye_video=input_data.get("eye_video", None), - behavior_video=input_data.get("behavior_video", None), - long_stim_threshold=input_data.get( - "long_stim_threshold", ts.LONG_STIM_THRESHOLD - ) - ) - - outputs = run_ophys_time_sync( - aligner, - input_data.get("ophys_experiment_id"), - mod.args.min_stimulus_delay, - mod.args.max_stimulus_delay - ) - writer.write(outputs) - - -if __name__ == "__main__": main() \ No newline at end of file diff --git a/allensdk/internal/pipeline_modules/run_roi_filter.py b/allensdk/internal/pipeline_modules/run_roi_filter.py deleted file mode 100644 index e83f2f38af..0000000000 --- a/allensdk/internal/pipeline_modules/run_roi_filter.py +++ /dev/null @@ -1,291 +0,0 @@ -import logging -import allensdk.internal.core.lims_utilities as lu -from allensdk.internal.core.lims_pipeline_module import ( - PipelineModule, run_module) -from allensdk.internal.brain_observatory import roi_filter, roi_filter_utils -from allensdk.brain_observatory.roi_masks import (RIGHT_SHIFT, LEFT_SHIFT, - DOWN_SHIFT, UP_SHIFT) -import pandas as pd -import os -import h5py - -DEPRECATED_MOTION_HEADER = ["index", "x", "y", "a", "b", "c", "d", "e", "f"] -MAX_SHIFT = 30 -OVERLAP_THRESHOLD = 0.9 -DEBUG_SDK_PATH = "/data/informatics/CAM/roi_filter/allensdk/" -DEBUG_SCRIPT = os.path.join(DEBUG_SDK_PATH, "allensdk", "internal", - "pipeline_modules", "run_roi_filter.py") -DEBUG_OUTPUT_DIRECTORY = "/data/informatics/CAM/roi_filter/" - - -def get_motion_filepath(experiment_id): - return lu.query(""" -select CONCAT(wkf.storage_directory, wkf.filename) as path -from well_known_files wkf -join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id -join ophys_experiments oe on oe.id = wkf.attachable_id -where oe.id = {} and -wkft.name like 'OphysMotionXyOffsetData'""".format(experiment_id))[0]["path"] - - -def get_segmentation_filepath(experiment_id, file_type): - return lu.query(""" -select CONCAT(wkf.storage_directory, wkf.filename) as path -from well_known_files wkf -join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id -join ophys_cell_segmentation_runs ocsr on ocsr.id = wkf.attachable_id -join ophys_experiments oe on oe.id = ocsr.ophys_experiment_id -where oe.id = {} and wkft.name like '{}' -and ocsr.current = 't'""".format(experiment_id, file_type))[0]["path"] - - -def get_model_info(experiment_id): - res = lu.query(""" -select CONCAT(wkf.storage_directory, wkf.filename) as path, wkf.id -from ophys_experiments oe -join ophys_sessions os on os.id = oe.ophys_session_id -join projects p on p.id = os.project_id -join well_known_files wkf on wkf.attachable_id = p.id -join well_known_file_types wkft on wkft.id = wkf.well_known_file_type_id -where oe.id = {} and -wkft.name = 'RoiLabelModel'""".format(experiment_id))[0] - return res["path"], res["id"] - - -def get_genotype_info(experiment_id, code): - res = lu.query(""" -select g.name -from ophys_experiments oe -join ophys_sessions os on os.id = oe.ophys_session_id -join specimens s on s.id = os.specimen_id -join donors d on d.id = s.donor_id -join donors_genotypes dg on dg.donor_id = d.id -join genotypes g on g.id = dg.genotype_id -join genotype_types gt on gt.id = g.genotype_type_id -where oe.id = {} and gt.code like '{}'""".format(experiment_id, code)) - output = set() - for line in res: - output.add(line["name"]) - return list(output) - - -def create_input_data(experiment_id): - data = {} - data["log_0"] = get_motion_filepath(experiment_id) - model, model_id = get_model_info(experiment_id) - data["roi_label_model"] = model - data["roi_label_model_id"] = model_id - data["targeted_structure_id"] = lu.query(""" -select targeted_structure_id -from ophys_experiments oe -where oe.id = {}""".format(experiment_id))[0]["targeted_structure_id"] - data["imaging_depth"] = lu.query(""" -select calculated_depth -from ophys_experiments oe -where oe.id = {}""".format(experiment_id))[0]["calculated_depth"] - data["drivers"] = get_genotype_info(experiment_id, "D") - data["reporters"] = get_genotype_info(experiment_id, "R") - data["max_int_file"] = get_segmentation_filepath( - experiment_id, "OphysSegmentationMaskData") - data["object_list"] = get_segmentation_filepath( - experiment_id, "OphysSegmentationObjects") - return data - - -def debug(experiment_id, local=False, sdk_path=DEBUG_SDK_PATH, - script=DEBUG_SCRIPT, output_directory=DEBUG_OUTPUT_DIRECTORY): - input_data = create_input_data(experiment_id) - exp_dir = os.path.join(output_directory, str(experiment_id)) - run_module(script, - input_data, - exp_dir, - sdk_path=sdk_path, - local=local) - - -def load_object_list(filename): - '''Load the object list file.''' - dataframe = pd.read_csv(filename) - dataframe.columns = [column.strip() for column in dataframe.columns] - return dataframe - - -def is_deprecated_motion_file(filename): - '''Check if a file is an old style motion correction file. - - By agreement, new-style files will always have a header and that - header will always contain at least 1 alpha character. - ''' - with open(filename, "r") as f: - return not any([c.isalpha() for c in f.readline()]) - - -def load_rigid_motion_transform(filename): - '''Load the rigid motion transform file.''' - if is_deprecated_motion_file(filename): - return pd.read_csv(filename, header=None, - names=DEPRECATED_MOTION_HEADER) - else: - return pd.read_csv(filename) - - -def load_all_input(data): - '''Load all input data from the input json.''' - try: - object_list_file = data["object_list"] - object_data = load_object_list(object_list_file) - except KeyError: - logging.error("Input json missing object_list") - raise - except IOError: - logging.error("Could not read object list file %s", object_list_file) - raise - - try: - # TODO: update name in LIMS and here - rigid_motion_transform_file = data["log_0"] - motion_data = load_rigid_motion_transform(rigid_motion_transform_file) - except KeyError: - # TODO: update name in LIMS and here - logging.error("Input json missing log_0") - raise - except IOError: - logging.error("Could not read rigid motion transform file %s", - rigid_motion_transform_file) - raise - - try: - maxint_file = data["max_int_file"] - with h5py.File(maxint_file, "r") as f: - segmentation_stack = f["data"][...] - except KeyError: - logging.error("Input json missing max_int_file") - raise - except IOError: - logging.error("Could not read max_int_file file %s", maxint_file) - raise - - try: - model_file = data["roi_label_model"] - classifier = roi_filter.ROIClassifier.from_file(model_file) - except KeyError: - logging.error("Input json missing roi_label_model") - raise - except IOError: - logging.error("Could not read roi_label_model file %s", model_file) - raise - - try: - depth = float(data["imaging_depth"]) - except KeyError: - logging.error("Input json missing imaging_depth") - raise - except ValueError: - logging.error("Invalid depth %s", data["imaging_depth"]) - raise - - try: - structure_id = str(data["targeted_structure_id"]) - except KeyError: - logging.error("Input json missing targeted_structure_id") - raise - - try: - model_id = data["roi_label_model_id"] - except KeyError: - logging.error("Input json missing roi_label_model_id") - raise - - try: - drivers = data["drivers"] - except KeyError: - logging.error("Input json drivers") - raise - - try: - reporters = data["reporters"] - except KeyError: - logging.error("Input json missing reporters") - raise - - border = roi_filter_utils.calculate_max_border(motion_data, MAX_SHIFT) - rois = roi_filter_utils.get_rois(segmentation_stack, border) - if len(rois) == 0: - raise ValueError(f"no ROIs were found from {maxint_file}") - rois = roi_filter_utils.order_rois_by_object_list(object_data, rois) - - result = {"model_id": model_id, - "classifier": classifier, - "object_data": object_data, - "depth": depth, - "structure_id": structure_id, - "drivers": drivers, - "reporters": reporters, - "border": border, - "rois": rois} - return result - - -def create_output_data(rois, model_id, border, excluded, - unexpected_features): - data = {} - data["motion_border"] = {"x0": border[RIGHT_SHIFT], - "y0": border[DOWN_SHIFT], - "x1": border[LEFT_SHIFT], - "y1": border[UP_SHIFT]} - data["roi_label_model_id"] = model_id - data["unexpected_features"] = unexpected_features - if rois: - data["image"] = {"width": rois[0].img_cols, - "height": rois[0].img_rows} - json_rois = {} - for i, roi in enumerate(rois): - json_roi = {} - json_roi["x"] = roi.x - json_roi["y"] = roi.y - json_roi["width"] = roi.width - json_roi["height"] = roi.height - json_roi["mask"] = roi.mask - json_roi["mask_page"] = roi.mask_group - json_roi["exclusion_labels"] = roi.labels - if roi.labels: - json_roi["valid"] = False - else: - json_roi["valid"] = True - # for backwards compatibility - json_roi["exclude_code"] = excluded[i] - json_rois[roi.label] = json_roi - data["rois"] = json_rois - return data - - -def main(): - mod = PipelineModule("Filter Ophys ROIs produced from cell segmentation.") - - input_data = mod.input_data() - data = load_all_input(input_data) - model_id = data["model_id"] - classifier = data["classifier"] - object_data = data["object_data"] - depth = data["depth"] - structure_id = data["structure_id"] - drivers = data["drivers"] - reporters = data["reporters"] - border = data["border"] - rois = data["rois"] - - label_array = classifier.get_labels(object_data, depth, structure_id, - drivers, reporters) - rois = roi_filter.apply_labels(rois, label_array, classifier.label_names) - - rois = roi_filter.label_unions_and_duplicates(rois, OVERLAP_THRESHOLD) - - output_data = create_output_data(rois, model_id, border, - object_data["eXcluded"], - classifier.unexpected_features) - - mod.write_output_data(output_data) - - -if __name__ == "__main__": - main() diff --git a/allensdk/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py deleted file mode 100644 index 86ab7ce2e9..0000000000 --- a/allensdk/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py +++ /dev/null @@ -1,96 +0,0 @@ -import logging -import os -import functools -import six - -import SimpleITK as sitk -from scipy.misc import imread, imsave -import numpy as np -import pandas as pd - -from allensdk.internal.core.lims_pipeline_module import PipelineModule - -from allensdk.internal.mouse_connectivity.projection_thumbnail.volume_utilities import sitk_get_diagonal_length -from allensdk.internal.mouse_connectivity.projection_thumbnail.generate_projection_strip import run, apply_colormap -from allensdk.internal.mouse_connectivity.projection_thumbnail.visualization_utilities import convert_discrete_colormap - - -PERMUTATION = [2, 1, 0] -FLIP = [True, False, False] - - -def write_depth_image(image, path): - image = sitk.GetImageFromArray(image) - sitk.WriteImage(image, str(path)) - - -def load_background_image(path): - background = sitk.ReadImage(str(path)) - background = sitk.GetArrayFromImage(background) - bg_split = np.split(background, 3, axis=-1) - return bg_split[0] / 255.0 - - -def no_pad(volume): - shape = [int(np.ceil(sitk_get_diagonal_length(volume))), 0, 0] - shape[1] = volume.GetSize()[1] - shape[2] = volume.GetSize()[2] - return shape - - -def pad(volume): - shape = [int(np.ceil(sitk_get_diagonal_length(volume))), 0, 0] - shape[1] = int(np.floor(np.linalg.norm([volume.GetSize()[1], volume.GetSize()[0]]))) - shape[2] = int(np.floor(np.linalg.norm([volume.GetSize()[2], volume.GetSize()[0]]))) - return shape - - -def main(): - - module = PipelineModule() - input_data = module.input_data() - - output_dir = os.path.dirname(module.args.output_json) - - logging.info('reading data volume from {0}'.format(input_data['volume_path'])) - volume = sitk.ReadImage(str(input_data['volume_path'])) - volume = sitk.PermuteAxes(volume, PERMUTATION) - volume = sitk.Flip(volume, FLIP) - - logging.info('reading colormap from {0}'.format(input_data['colormap_path'])) - colormap = pd.read_csv(input_data['colormap_path'], header=None, - names=['red', 'green', 'blue'], delim_whitespace=True) - colormap = convert_discrete_colormap(colormap.values, 'projection') - - output_data = {'output_file_paths': []} - for rot in input_data['rotations']: - - rot['write_depth_sheet'] = functools.partial(write_depth_image, - path=str(os.path.join(output_dir, rot['depth_path']))) - output_data['output_file_paths'].append(os.path.join(output_dir, rot['depth_path'])) - - if isinstance(rot['window_size'], six.string_types): - if rot['window_size'] == 'no_pad': - rot['window_size'] = no_pad(volume) - elif rot['window_size'] == 'pad': - rot['window_size'] = pad(volume) - else: - raise ValueError('did not understand window size option {0}'.format(rot['window_size'])) - logging.info('window_size: {0}'.format(rot['window_size'])) - - for out_image in rot['output_images']: - out_image['write'] = functools.partial(imsave, os.path.join(output_dir, out_image['path'])) - output_data['output_file_paths'].append(os.path.join(output_dir, out_image['path'])) - - if 'background_path' in out_image: - out_image['background'] = load_background_image(out_image['background_path']) - else: - out_image['background'] = None - - run(volume, input_data['min_threshold'], input_data['max_threshold'], - input_data['rotations'], colormap) - module.write_output_data(output_data) - - -if __name__ == '__main__': - main() diff --git a/allensdk/internal/pipeline_modules/run_tissuecyte_stitching_classic.py b/allensdk/internal/pipeline_modules/run_tissuecyte_stitching_classic.py deleted file mode 100644 index b1e8dca630..0000000000 --- a/allensdk/internal/pipeline_modules/run_tissuecyte_stitching_classic.py +++ /dev/null @@ -1,135 +0,0 @@ -import sys -import argparse -import logging -import os - -from xml.etree.ElementTree import Element, SubElement, Comment, tostring -from xml.dom import minidom - -import SimpleITK as sitk -import numpy as np -from six import iteritems - -from allensdk.internal.core.lims_pipeline_module import PipelineModule, run_module -from allensdk.internal.mouse_connectivity.tissuecyte_stitching.stitcher import Stitcher -from allensdk.internal.mouse_connectivity.tissuecyte_stitching.tile import Tile -import allensdk.core.json_utilities as ju - -# TODO this ought to be installed with the actual python build? -# need to consult with sysadmins/refactor jp2 project build -sys.path.append('/shared/bioapps/itk/itk_shared/jp2/build') -import jpeg_twok - - -logging.getLogger().setLevel(logging.INFO) -logging.captureWarnings(True) - - -def get_missing_tile_paths(missing_tiles): - - paths = [] - - for index, path in iteritems(missing_tiles): - spath = ','.join(map(str, path)) - logging.info('writing missing tile path for tile {0} as {1}'.format(index, spath)) - paths.append(spath) - - return paths - - -def read_image(file_name): - logging.info('reading image from {0}'.format(file_name)) - image = sitk.ReadImage(str(file_name)) - return np.flipud(sitk.GetArrayFromImage(image)).T - - -def normalize_image_by_median(image): - - median = np.median(image) - - if median != 0: - image = np.divide(median, image) - image[np.isnan(image)] = 0 - image[np.isinf(image)] = 0 - - return image - - -def load_average_tile(path): - tile = read_image(path) - return normalize_image_by_median(tile) - - -def get_average_tiles(average_tile_paths): - - average_tiles = {} - for key, path in iteritems(average_tile_paths): - key = int(key) - 1 - - try: - average_tiles[key] = load_average_tile(path) - logging.info('found average tile for channel {0} (zero-indexed)'.format(key)) - except(IOError, OSError, RuntimeError) as err: - average_tiles[key] = None - logging.info('did not find average tile for channel {0} (zero-indexed)'.format(key)) - - return average_tiles - - -def generate_tiles(tiles): - - for tile_params in tiles: - tile = tile_params.copy() - - try: - tile['image'] = read_image(tile['path']) - tile['is_missing'] = False - except (IOError, OSError, RuntimeError) as err: - tile['image'] = None - tile['is_missing'] = True - - tile['channel'] = tile['channel'] - 1 - - tile_obj = Tile(**tile) - del tile - yield tile_obj - - -def write_output(arr, spacing, path): - jpeg_twok.write(arr, path) - - -def main(): - - output_json = args.output_json - output_directory = os.path.dirname(output_json) - - slice_path = os.path.join(output_directory, data['slice_fname']) - - tiles = generate_tiles(data['tiles']) - average_tiles = get_average_tiles(data['average_tile_paths']) - - stitcher = Stitcher(data['image_dimensions'], tiles, average_tiles, data['channels']) - image, missing = stitcher.run() - del tiles - missing_tile_paths = get_missing_tile_paths(missing) - - write_output(np.ascontiguousarray(image), data['spacing'], slice_path) - - module_outputs = {'slice_fname': slice_path, - 'missing_tile_paths': missing_tile_paths} - ju.write(output_json, module_outputs) - - -if __name__ == '__main__': - - logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - parser = argparse.ArgumentParser() - parser.add_argument('input_json', type=str) - parser.add_argument('output_json', type=str) - args = parser.parse_args() - - data = ju.read(args.input_json) - - main() diff --git a/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py deleted file mode 100644 index 78f24909d8..0000000000 --- a/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py +++ /dev/null @@ -1,19 +0,0 @@ -import logging - -from allensdk.internal.core.lims_pipeline_module import PipelineModule -from allensdk.internal.mouse_connectivity.interval_unionize.run_tissuecyte_unionize_cav import run - - - - -def main(): - - module = PipelineModule() - - input_data = module.input_data() - output_data = run(input_data) - module.write_output_data(output_data) - - -if __name__ == '__main__': - main() diff --git a/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py deleted file mode 100644 index 1697655641..0000000000 --- a/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py +++ /dev/null @@ -1,17 +0,0 @@ -import logging - -from allensdk.internal.core.lims_pipeline_module import PipelineModule -from allensdk.internal.mouse_connectivity.interval_unionize.run_tissuecyte_unionize_classic_counts import run - - -def main(): - - module = PipelineModule() - - input_data = module.input_data() - output_data = run(input_data) - module.write_output_data(output_data) - - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py deleted file mode 100644 index 2f9bc6aec7..0000000000 --- a/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py +++ /dev/null @@ -1,19 +0,0 @@ -import logging - -from allensdk.internal.core.lims_pipeline_module import PipelineModule -from allensdk.internal.mouse_connectivity.interval_unionize.run_tissuecyte_unionize_classic import run - - - - -def main(): - - module = PipelineModule() - - input_data = module.input_data() - output_data = run(input_data) - module.write_output_data(output_data) - - -if __name__ == '__main__': - main() diff --git a/allensdk/model/__init__.py b/allensdk/model/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/model/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/model/biophys_sim/__init__.py b/allensdk/model/biophys_sim/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/model/biophys_sim/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/model/biophys_sim/bps_command.py b/allensdk/model/biophys_sim/bps_command.py deleted file mode 100644 index a10ed523ab..0000000000 --- a/allensdk/model/biophys_sim/bps_command.py +++ /dev/null @@ -1,97 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2014-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import subprocess as sp -import logging -from .config import Config - - -def choose_bps_command(command='bps_simple', conf_file=None): - log = logging.getLogger('allensdk.model.biophys_sim.bps_command') - - log.info("bps command: %s" % (command)) - - if conf_file: - conf_file = os.path.abspath(conf_file) - - if command == 'help': - print(Config().argparser.parse_args(['--help'])) - elif command == 'nrnivmodl': - sp.call(['nrnivmodl', 'modfiles']) - elif command == 'run_simple': - app_config = Config() - description = app_config.load(conf_file) - sys.path.insert(1, description.manifest.get_path('CODE_DIR')) - (module_name, function_name) = description.data[ - 'runs'][0]['main'].split('#') - run_module(description, module_name, function_name) - else: - raise Exception("unknown command %s" % (command)) - - -def run_module(description, module_name, function_name): - m = __import__(module_name, fromlist=[function_name]) - func = getattr(m, function_name) - - func(description) - - -# this module is designed to be called from the bps script, -# which may use nrniv which does not pass in command line arguments -# So the configuration file path must be set in an environment variable. -if __name__ == '__main__': - import sys - conf_file = None - argv = sys.argv - - if len(argv) > 1: - if argv[0] == 'nrniv': - command = 'run_simple' - else: - command = argv[1] - else: - command = 'run_simple' - - if len(argv) > 2 and (argv[-1].endswith('.conf') or - argv[-1].endswith('.json')): - conf_file = argv[-1] - else: - try: - conf_file = os.environ['CONF_FILE'] - except: - pass - - choose_bps_command(command, conf_file) diff --git a/allensdk/model/biophys_sim/config.py b/allensdk/model/biophys_sim/config.py deleted file mode 100644 index 896718693a..0000000000 --- a/allensdk/model/biophys_sim/config.py +++ /dev/null @@ -1,127 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import re -import logging -from pkg_resources import resource_filename # @UnresolvedImport -from allensdk.config.app.application_config import ApplicationConfig -from allensdk.config.model.description_parser import DescriptionParser -from allensdk.config.model.description import Description - - -class Config(ApplicationConfig): - _log = logging.getLogger(__name__) - - _DEFAULT_LOG_CONFIG = resource_filename(__name__, 'logging.conf') - - #: A structure that defines the available configuration parameters. - #: The default value and help strings may be seen by viewing the source. - _DEFAULTS = { - 'workdir': {'default': 'workdir', - 'help': 'writable directory where intermediate and output files are written.'}, - 'data_dir': {'default': '', - 'help': 'writable directory where intermediate and output files are written.'}, - 'model_file': {'default': 'config.json', - 'help': 'file where the model parameters are set.'}, - 'main': {'default': 'simulation#run', - 'help': 'module#function that runs the actual simulation'} - } - - def __init__(self): - super(Config, self).__init__(Config._DEFAULTS, - name='biophys', - halp='tools for biophysically detailed modeling at the Allen Institute.', - default_log_config=Config._DEFAULT_LOG_CONFIG) - - def load(self, config_path, - disable_existing_logs=False): - '''Parse the application configuration then immediately load - the model configuration files. - - Parameters - ---------- - disable_existing_logs : boolean, optional - If false (default) leave existing logs after configuration. - ''' - super(Config, self).load([config_path], disable_existing_logs) - description = self.read_model_description() - - return description - - def read_model_description(self): - '''parse the model_file field of the application configuration - and read the files. - - The model_file field of the application configuration is - first split at commas, since it may list more than one file. - - The files may be uris of the form :samp:`file:filename?section=name`, - in which case a bare configuration object is read from filename - into the configuration section with key 'name'. - - A simple filename without a section option - is treated as a standard multi-section configuration file. - - Returns - ------- - description : Description - Configuration object. - ''' - reader = DescriptionParser() - description = Description() - - Config._log.info("model file: %s" % self.model_file) - - # TODO: make space aware w/ regex - for model_file in self.model_file.split(','): - if not model_file.startswith("file:"): - model_file = 'file:' + model_file - - file_regex = re.compile(r"^file:([^?]*)(\?(.*)?)?") - m = file_regex.match(model_file) - model_file = m.group(1) - file_url_params = {} - if m.group(3): - file_url_params.update(((x[0], x[1]) - for x in (y.split('=') - for y in m.group(3).split('&')))) - if 'section' in file_url_params: - section = file_url_params['section'] - else: - section = None - Config._log.info("reading model file %s" % (model_file)) - reader.read(model_file, description, section) - - return description diff --git a/allensdk/model/biophys_sim/logging.conf b/allensdk/model/biophys_sim/logging.conf deleted file mode 100644 index a84a95a961..0000000000 --- a/allensdk/model/biophys_sim/logging.conf +++ /dev/null @@ -1,36 +0,0 @@ -# -# See http://docs.python.org/2/howto/logging.html for documentation -# -[loggers] -keys=root,allensdk - -[handlers] -keys=consoleHandler,logFileHandler - -[formatters] -keys=simpleFormatter - -[logger_root] -level=ERROR -handlers=consoleHandler,logFileHandler - -[logger_allensdk] -level=ERROR -#handlers=consoleHandler,logFileHandler -handlers=consoleHandler -qualname=allensdk -propagate=0 - -[handler_consoleHandler] -class=StreamHandler -formatter=simpleFormatter -args=(sys.stdout,) - -[handler_logFileHandler] -class=FileHandler -formatter=simpleFormatter -args=('biophys_sim.log', 'w') - -[formatter_simpleFormatter] -format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s -datefmt=%m-%d %H:%M \ No newline at end of file diff --git a/allensdk/model/biophys_sim/manifest_default.json b/allensdk/model/biophys_sim/manifest_default.json deleted file mode 100644 index 6c8283437f..0000000000 --- a/allensdk/model/biophys_sim/manifest_default.json +++ /dev/null @@ -1,88 +0,0 @@ -/* - * manifest_default.json - */ -{ - "manifest": [ - { "key": "BASEDIR", - "type": "dir", - "spec": "." - }, - { "key": "WORKDIR", - "type": "dir", - "spec": "/work", - "parent_key": "BASEDIR" - }, - { - "key": "connection_statistics_file_path", - "type": "file", - "spec": "connection-statistics.dat", - "parent_key": "WORKDIR" - }, - { - "key": "tuning_variable_connectivity_path", - "type": "file", - "spec": "tuning_variable_connectivity.dat", - "parent_key": "WORKDIR" - }, - { - "key": "total_firing_rate_file_path", - "type": "file", - "spec": "tot_f_rate.dat", - "parent_key": "WORKDIR" - }, - { - "key": "f_rate_dir", - "type": "file", - "spec": "f_rate-cells", - "parent_key": "WORKDIR" - }, - { - "key": "external_inputs_path_name", - "type": "file", - "spec": "external_inputs/cell-%d.dat", - "parent_key": "WORKDIR" - }, - { - "key": "spike_path_name", - "type": "file", - "spec": "spk.dat", - "parent_key": "WORKDIR" - }, - { - "key": "firing_rate_cell_path", - "type": "file", - "spec": "f_rate-cell-%d.dat", - "parent_key": "WORKDIR" - }, - { - "key": "connection_path", - "type": "file", - "spec": "connections.dat", - "parent_key": "WORKDIR" - }, - { - "key": "positions_path", - "type": "file", - "spec": "positions.dat", - "parent_key": "WORKDIR" - }, - { - "key": "voltage_out_cell_path", - "type": "file", - "spec": "v_out-cell-%d.dat", - "parent_key": "WORKDIR" - }, - { - "key": "cluster_error_file", - "type": "file", - "spec": "error.txt", - "parent_key": "WORKDIR" - }, - { - "key": "cluster_output_file", - "type": "file", - "spec": "out.txt", - "parent_key": "WORKDIR" - } - ] -} \ No newline at end of file diff --git a/allensdk/model/biophys_sim/neuron/__init__.py b/allensdk/model/biophys_sim/neuron/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/model/biophys_sim/neuron/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/model/biophys_sim/neuron/hoc_utils.py b/allensdk/model/biophys_sim/neuron/hoc_utils.py deleted file mode 100644 index 9cebec3186..0000000000 --- a/allensdk/model/biophys_sim/neuron/hoc_utils.py +++ /dev/null @@ -1,95 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging - - -class HocUtils(object): - '''A helper class for containing references to NEUORN. - - Attributes - ---------- - h : object - The NEURON hoc object. - nrn : object - The NEURON python object. - neuron : module - The NEURON module. - ''' - _log = logging.getLogger(__name__) - h = None - nrn = None - neuron = None - - def __init__(self, description): - import neuron - import nrn - - self.h = neuron.h - HocUtils.neuron = neuron - HocUtils.nrn = nrn - HocUtils.h = self.h - - self.description = description - self.manifest = description.manifest - - self.hoc_files = description.data['neuron'][0]['hoc'] - - self.initialize_hoc() - - def initialize_hoc(self): - '''Basic setup for NEURON.''' - h = self.h - params = self.description.data['conditions'][0] - - for hoc_file in self.hoc_files: - HocUtils._log.info("loading hoc file %s" % (hoc_file)) - HocUtils.h.load_file(str(hoc_file)) - - h('starttime = startsw()') - - if 'celsius' in params: - h.celsius = params['celsius'] - - if 'v_init' in params: - h.v_init = params['v_init'] - - if 'dt' in params: - h.dt = params['dt'] - h.steps_per_ms = 1.0 / h.dt - - if 'tstop' in params: - h.tstop = params['tstop'] - h.runStopAt = h.tstop diff --git a/allensdk/model/biophys_sim/scripts/__init__.py b/allensdk/model/biophys_sim/scripts/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/model/biophys_sim/scripts/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/model/biophys_sim/scripts/bps b/allensdk/model/biophys_sim/scripts/bps deleted file mode 100644 index 54587fb4e7..0000000000 --- a/allensdk/model/biophys_sim/scripts/bps +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python -m allensdk.model.biophys_sim.bps_command $1 $2 diff --git a/allensdk/model/biophysical/__init__.py b/allensdk/model/biophysical/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/model/biophysical/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/model/biophysical/cell.hoc b/allensdk/model/biophysical/cell.hoc deleted file mode 100644 index 27d784ab2a..0000000000 --- a/allensdk/model/biophysical/cell.hoc +++ /dev/null @@ -1,36 +0,0 @@ -begintemplate cell - -public init -public soma, dend, apic, axon -public all, somatic, basal, apical, axonal, dendritic, somatic_axonal - -objref all, somatic, basal, apical, axonal, dendritic, somatic_axonal -objref this - -proc init() {localobj nl, import - all = new SectionList() - somatic = new SectionList() - basal = new SectionList() - apical = new SectionList() - axonal = new SectionList() - dendritic = new SectionList() - somatic_axonal = new SectionList() - forall delete_section() -} - -proc simplify_axon() { - forsec axonal { delete_section() } - create axon[2] - forsec "axon" { - all.append() - axonal.append() - somatic_axonal.append() - } -} - -create soma[1] -create dend[1] -create apic[1] -create axon[1] - -endtemplate cell \ No newline at end of file diff --git a/allensdk/model/biophysical/logging.conf b/allensdk/model/biophysical/logging.conf deleted file mode 100644 index d280fcbc39..0000000000 --- a/allensdk/model/biophysical/logging.conf +++ /dev/null @@ -1,35 +0,0 @@ -[loggers] -keys=root,allensdk - -[handlers] -keys=consoleHandler,logFileHandler - -[formatters] -keys=simpleFormatter - -[logger_root] -level=DEBUG -handlers=logFileHandler -propagate=0 -disabled=1 - -[logger_allensdk] -level=DEBUG -handlers=logFileHandler -qualname=allensdk -propagate=0 - -[handler_consoleHandler] -class=StreamHandler -level=DEBUG -formatter=simpleFormatter -args=(sys.stdout,) - -[handler_logFileHandler] -class=FileHandler -formatter=simpleFormatter -args=('allen_sdk_biophysical_perisomatic.log', 'w') - -[formatter_simpleFormatter] -format=%(asctime)s {%(pathname)s:%(lineno)d} %(name)-12s %(levelname)-8s %(message)s -datefmt=%m-%d %H:%M diff --git a/allensdk/model/biophysical/run_simulate.py b/allensdk/model/biophysical/run_simulate.py deleted file mode 100644 index b04f9f684d..0000000000 --- a/allensdk/model/biophysical/run_simulate.py +++ /dev/null @@ -1,140 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from . import runner as single_cell -import logging -import os -import sys -import traceback -import subprocess -import logging.config as lc -from ..biophys_sim.config import Config -from pkg_resources import resource_filename # @UnresolvedImport - - -class RunSimulate(object): - _log = logging.getLogger('allensdk.model.biophysical.run_simulate') - - def __init__(self, - input_json, - output_json): - self.input_json = input_json - self.output_json = output_json - self.app_config = None - self.manifest = None - - def load_manifest(self): - self.app_config = Config().load(self.input_json) - self.manifest = self.app_config.manifest - fix_sections = ['passive', 'axon_morph,', 'conditions', 'fitting'] - self.app_config.fix_unary_sections(fix_sections) - - def nrnivmodl(self): - RunSimulate._log.debug("nrnivmodl") - - subprocess.call(['nrnivmodl', './modfiles']) - - def simulate(self): - from allensdk.internal.api.queries.biophysical_module_reader \ - import BiophysicalModuleReader - - self.load_manifest() - - try: - stimulus_path = self.manifest.get_path('stimulus_path') - RunSimulate._log.info("stimulus path: %s" % (stimulus_path)) - except: - raise Exception( - 'Could not read input stimulus path from input config.') - - try: - out_path = self.manifest.get_path('output_path') - RunSimulate._log.info("result NWB file: %s" % (out_path)) - except: - raise Exception('Could not read output path from input config.') - - try: - morphology_path = self.manifest.get_path('MORPHOLOGY') - RunSimulate._log.info("morphology path: %s" % (morphology_path)) - except: - raise Exception( - 'Could not read morphology path from input config.') - - single_cell.run(self.app_config) - - lims_upload_config = BiophysicalModuleReader() - lims_upload_config.read_json( - self.manifest.get_path('neuronal_model_run_data')) - lims_upload_config.update_well_known_file(out_path) - lims_upload_config.set_workflow_state('passed') - lims_upload_config.write_file(self.output_json) - - -def main(command, lims_strategy_json, lims_response_json): - ''' Entry point for module. - :param command: select behavior, nrnivmodl or simulate - :type command: string - :param lims_strategy_json: path to json file output from lims. - :type lims_strategy_json: string - :param lims_response_json: path to json file returned to lims. - :type lims_response_json: string - ''' - rs = RunSimulate(lims_strategy_json, - lims_response_json) - - RunSimulate._log.debug("command: %s" % (command)) - RunSimulate._log.debug("lims strategy json: %s" % (lims_strategy_json)) - RunSimulate._log.debug("lims upload json: %s" % (lims_response_json)) - - log_config = resource_filename('allensdk.model.biophysical.run_simulate', - 'logging.conf') - lc.fileConfig(log_config) - os.environ['LOG_CFG'] = log_config - - if 'nrnivmodl' == command: - rs.nrnivmodl() - else: - rs.simulate() - - -if __name__ == '__main__': - command, input_json, output_json = sys.argv[-3:] - - try: - main(command, input_json, output_json) - RunSimulate._log.debug("success") - except Exception as e: - RunSimulate._log.error(traceback.format_exc()) - exit(1) diff --git a/allensdk/model/biophysical/runner.py b/allensdk/model/biophysical/runner.py deleted file mode 100644 index 87ec93ef8b..0000000000 --- a/allensdk/model/biophysical/runner.py +++ /dev/null @@ -1,240 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from ..biophys_sim.config import Config -from .utils import create_utils -from allensdk.core.nwb_data_set import NwbDataSet -import allensdk.ephys.extract_cell_features as extract_cell_features -from shutil import copy -import numpy -import logging -import time -import os -import multiprocessing as mp -from functools import partial -import argschema as ags -import argparse - -_runner_log = logging.getLogger('allensdk.model.biophysical.runner') - -_lock = None - -def _init_lock(lock): - global _lock - _lock = lock - -def run(args, sweeps=None, procs=6): - '''Main function for simulating sweeps in a biophysical experiment. - - Parameters - ---------- - args : dict - Parsed arguments to run the experiment. - procs : int - number of sweeps to simulate simultaneously. - sweeps : list - list of experiment sweep numbers to simulate. If None, simulate all sweeps. - ''' - - description = load_description(args) - - prepare_nwb_output(description.manifest.get_path('stimulus_path'), - description.manifest.get_path('output_path')) - - if procs == 1: - run_sync(description, sweeps) - return - - if sweeps is None: - stimulus_path = description.manifest.get_path('stimulus_path') - run_params = description.data['runs'][0] - sweeps = run_params['sweeps'] - - lock = mp.Lock() - pool = mp.Pool(procs, initializer=_init_lock, initargs=(lock,)) - pool.map(partial(run_sync, description), [[sweep] for sweep in sweeps]) - pool.close() - pool.join() - - -def run_sync(description, sweeps=None): - '''Single-process main function for simulating sweeps in a biophysical experiment. - - Parameters - ---------- - description : Config - All information needed to run the experiment. - sweeps : list - list of experiment sweep numbers to simulate. If None, simulate all sweeps. - ''' - - # configure NEURON - utils = create_utils(description) - h = utils.h - - # configure model - manifest = description.manifest - morphology_path = description.manifest.get_path('MORPHOLOGY').encode('ascii', 'ignore') - morphology_path = morphology_path.decode("utf-8") - utils.generate_morphology(morphology_path) - utils.load_cell_parameters() - - # configure stimulus and recording - stimulus_path = description.manifest.get_path('stimulus_path') - run_params = description.data['runs'][0] - if sweeps is None: - sweeps = run_params['sweeps'] - sweeps_by_type = run_params['sweeps_by_type'] - - output_path = manifest.get_path("output_path") - - # run sweeps - for sweep in sweeps: - _runner_log.info("Loading sweep: %d" % (sweep)) - utils.setup_iclamp(stimulus_path, sweep=sweep) - - _runner_log.info("Simulating sweep: %d" % (sweep)) - vec = utils.record_values() - tstart = time.time() - h.finitialize() - h.run() - tstop = time.time() - _runner_log.info("Time: %f" % (tstop - tstart)) - - # write to an NWB File - _runner_log.info("Writing sweep: %d" % (sweep)) - recorded_data = utils.get_recorded_data(vec) - - if _lock is not None: - _lock.acquire() - save_nwb(output_path, recorded_data["v"], sweep, sweeps_by_type) - if _lock is not None: - _lock.release() - - -def prepare_nwb_output(nwb_stimulus_path, - nwb_result_path): - '''Copy the stimulus file, zero out the recorded voltages and spike times. - - Parameters - ---------- - nwb_stimulus_path : string - NWB file name - nwb_result_path : string - NWB file name - ''' - - output_dir = os.path.dirname(nwb_result_path) - if not os.path.exists(output_dir): - os.makedirs(output_dir) - - copy(nwb_stimulus_path, nwb_result_path) - data_set = NwbDataSet(nwb_result_path) - data_set.fill_sweep_responses(0.0, extend_experiment=True) - for sweep in data_set.get_sweep_numbers(): - data_set.set_spike_times(sweep, []) - - -def save_nwb(output_path, v, sweep, sweeps_by_type): - '''Save a single voltage output result into an existing sweep in a NWB file. - This is intended to overwrite a recorded trace with a simulated voltage. - - Parameters - ---------- - output_path : string - file name of a pre-existing NWB file. - v : numpy array - voltage - sweep : integer - which entry to overwrite in the file. - ''' - output = NwbDataSet(output_path) - output.set_sweep(sweep, None, v) - - sweep_by_type = {t: [sweep] - for t, ss in sweeps_by_type.items() if sweep in ss} - sweep_features = extract_cell_features.extract_sweep_features(output, - sweep_by_type) - try: - spikes = sweep_features[sweep]['spikes'] - spike_times = [s['threshold_t'] for s in spikes] - output.set_spike_times(sweep, spike_times) - except Exception as e: - logging.info("sweep %d has no sweep features. %s" % (sweep, e.args)) - - -def load_description(args_dict): - '''Read configurations. - - Parameters - ---------- - args_dict : dict - Parsed arguments dictionary with following keys. - - manifest_file : string - .json file with containing the experiment configuration - axon_type : string - Axon handling for the all-active models - - Returns - ------- - Config - Object with all information needed to run the experiment. - ''' - manifest_json_path = args_dict['manifest_file'] - - description = Config().load(manifest_json_path) - - # For newest all-active models update the axon replacement - axon_replacement_dict = {'axon_type': args_dict.get('axon_type', 'truncated')} - description.update_data(axon_replacement_dict, 'biophys') - - # fix nonstandard description sections - fix_sections = ['passive', 'axon_morph,', 'conditions', 'fitting'] - description.fix_unary_sections(fix_sections) - - return description - - -# Create the parser -sim_parser = argparse.ArgumentParser(description='Run simulation for biophysical models with the provided configuration') -sim_parser.add_argument('manifest_file', - help='.json configurations for running the simulations') -sim_parser.add_argument('--axon_type', default='truncated', choices=['stub', 'truncated'], - help='axon replacement for all-active models; truncated: truncate reconstructed axon after 60 micron, stub: replace reconstructed axon with a uniform stub 60 micron long and 1 micron in diameter') - -if '__main__' == __name__: - schema = sim_parser.parse_args() - run(vars(schema)) diff --git a/allensdk/model/biophysical/utils.py b/allensdk/model/biophysical/utils.py deleted file mode 100644 index aea22c90ec..0000000000 --- a/allensdk/model/biophysical/utils.py +++ /dev/null @@ -1,451 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -import os -from ..biophys_sim.neuron.hoc_utils import HocUtils -from allensdk.core.nwb_data_set import NwbDataSet -from fractions import gcd -from skimage.measure import block_reduce -import scipy.interpolate -import numpy as np -from pkg_resources import resource_filename #@UnresolvedImport - -PERISOMATIC_TYPE = "Biophysical - perisomatic" -ALL_ACTIVE_TYPE = "Biophysical - all active" - - -def create_utils(description, model_type=None): - ''' Factory method to create a Utils subclass. - - Parameters - ---------- - description : Config instance - used to initialize Utils subclass - - model_type : string - Must be one of [PERISOMATIC_TYPE, ALL_ACTIVE_TYPE]. If none, defaults to PERISOMATIC_TYPE - - Returns - ------- - Utils instance - ''' - - - - if model_type is None: - try: - model_type = description.data['biophys'][0]['model_type'] - except KeyError as e: - logging.error("Could not infer model type from description") - - axon_type = description.data['biophys'][1]['axon_type'] - - if model_type == PERISOMATIC_TYPE: - return Utils(description) - elif model_type == ALL_ACTIVE_TYPE: - return AllActiveUtils(description, axon_type) - - -class Utils(HocUtils): - '''A helper class for NEURON functionality needed for - biophysical simulations. - - Attributes - ---------- - h : object - The NEURON hoc object. - nrn : object - The NEURON python object. - neuron : module - The NEURON module. - ''' - - _log = logging.getLogger(__name__) - - def __init__(self, description): - self.update_default_cell_hoc(description) - - super(Utils, self).__init__(description) - self.stim = None - self.stim_curr = None - self.simulation_sampling_rate = None - self.stimulus_sampling_rate = None - - self.stim_vec_list = [] - - - def update_default_cell_hoc(self, description, default_cell_hoc='cell.hoc'): - ''' replace the default 'cell.hoc' path in the manifest with 'cell.hoc' packaged - within AllenSDK if it does not exist ''' - - hoc_files = description.data['neuron'][0]['hoc'] - try: - hfi = hoc_files.index(default_cell_hoc) - - if not os.path.exists(default_cell_hoc): - abspath_ch = resource_filename(__name__, - default_cell_hoc) - hoc_files[hfi] = abspath_ch - - if not os.path.exists(abspath_ch): - raise IOError("cell.hoc does not exist!") - - self._log.warning("Using cell.hoc from the following location: %s", abspath_ch) - except ValueError as e: - pass - - - def generate_morphology(self, morph_filename): - '''Load a swc-format cell morphology file. - - Parameters - ---------- - morph_filename : string - Path to swc. - ''' - h = self.h - - swc = self.h.Import3d_SWC_read() - swc.input(morph_filename) - imprt = self.h.Import3d_GUI(swc, 0) - - h("objref this") - imprt.instantiate(h.this) - - h("soma[0] area(0.5)") - for sec in h.allsec(): - sec.nseg = 1 + 2 * int(sec.L / 40.0) - if sec.name()[:4] == "axon": - h.delete_section(sec=sec) - h('create axon[2]') - for sec in h.axon: - sec.L = 30 - sec.diam = 1 - sec.nseg = 1 + 2 * int(sec.L / 40.0) - h.axon[0].connect(h.soma[0], 0.5, 0.0) - h.axon[1].connect(h.axon[0], 1.0, 0.0) - - h.define_shape() - - def load_cell_parameters(self): - '''Configure a neuron after the cell morphology has been loaded.''' - passive = self.description.data['passive'][0] - genome = self.description.data['genome'] - conditions = self.description.data['conditions'][0] - h = self.h - - h("access soma") - - # Set fixed passive properties - for sec in h.allsec(): - sec.Ra = passive['ra'] - sec.insert('pas') - for seg in sec: - seg.pas.e = passive["e_pas"] - - for c in passive["cm"]: - h('forsec "' + c["section"] + '" { cm = %g }' % c["cm"]) - - # Insert channels and set parameters - for p in genome: - if p["section"] == "glob": # global parameter - h(p["name"] + " = %g " % p["value"]) - else: - if p["mechanism"] != "": - h('forsec "' + p["section"] + - '" { insert ' + p["mechanism"] + ' }') - h('forsec "' + p["section"] + - '" { ' + p["name"] + ' = %g }' % p["value"]) - - # Set reversal potentials - for erev in conditions['erev']: - h('forsec "' + erev["section"] + '" { ek = %g }' % erev["ek"]) - h('forsec "' + erev["section"] + '" { ena = %g }' % erev["ena"]) - - def setup_iclamp(self, - stimulus_path, - sweep=0): - '''Assign a current waveform as input stimulus. - - Parameters - ---------- - stimulus_path : string - NWB file name - ''' - self.stim = self.h.IClamp(self.h.soma[0](0.5)) - self.stim.amp = 0 - self.stim.delay = 0 - # just set to be really big; doesn't need to match the waveform - self.stim.dur = 1e12 - - self.read_stimulus(stimulus_path, sweep=sweep) - - # NEURON's dt is in milliseconds - simulation_dt = 1.0e3 / self.simulation_sampling_rate - stimulus_dt = 1.0e3 / self.stimulus_sampling_rate - self._log.debug("Using simulation dt %f, stimulus dt %f", simulation_dt, stimulus_dt) - - self.h.dt = simulation_dt - stim_vec = self.h.Vector(self.stim_curr) - stim_vec.play(self.stim._ref_amp, stimulus_dt) - - stimulus_stop_index = len(self.stim_curr) - 1 - self.h.tstop = stimulus_stop_index * stimulus_dt - self.stim_vec_list.append(stim_vec) - - def read_stimulus(self, stimulus_path, sweep=0): - '''Load current values for a specific experiment sweep and setup simulation - and stimulus sampling rates. - - NOTE: NEURON only allows simulation timestamps of multiples of 40KHz. To - avoid aliasing, we set the simulation sampling rate to the least common - multiple of the stimulus sampling rate and 40KHz. - - Parameters - ---------- - stimulus path : string - NWB file name - sweep : integer, optional - sweep index - ''' - Utils._log.info( - "reading stimulus path: %s, sweep %s", - stimulus_path, - sweep) - - stimulus_data = NwbDataSet(stimulus_path) - sweep_data = stimulus_data.get_sweep(sweep) - - # convert to nA for NEURON - self.stim_curr = sweep_data['stimulus'] * 1.0e9 - - # convert from Hz - hz = int(sweep_data['sampling_rate']) - neuron_hz = Utils.nearest_neuron_sampling_rate(hz) - - self.simulation_sampling_rate = neuron_hz - self.stimulus_sampling_rate = hz - - if hz != neuron_hz: - Utils._log.debug("changing sampling rate from %d to %d to avoid NEURON aliasing", hz, neuron_hz) - - def record_values(self): - '''Set up output voltage recording.''' - vec = {"v": self.h.Vector(), - "t": self.h.Vector()} - - vec["v"].record(self.h.soma[0](0.5)._ref_v) - vec["t"].record(self.h._ref_t) - - return vec - - def get_recorded_data(self, vec): - '''Extract recorded voltages and timestamps given the recorded Vector instance. - If self.stimulus_sampling_rate is smaller than self.simulation_sampling_rate, - resample to self.stimulus_sampling_rate. - - Parameters - ---------- - vec : neuron.Vector - constructed by self.record_values - - Returns - ------- - dict with two keys: 'v' = numpy.ndarray with voltages, 't' = numpy.ndarray with timestamps - - ''' - junction_potential = self.description.data['fitting'][0]['junction_potential'] - - v = np.array(vec["v"]) - t = np.array(vec["t"]) - - if self.stimulus_sampling_rate < self.simulation_sampling_rate: - factor = self.simulation_sampling_rate / self.stimulus_sampling_rate - - Utils._log.debug("subsampling recorded traces by %dX", factor) - v = block_reduce(v, (factor,), np.mean)[:len(self.stim_curr)] - t = block_reduce(t, (factor,), np.min)[:len(self.stim_curr)] - - mV = 1.0e-3 - v = (v - junction_potential) * mV - - return { "v": v, "t": t } - - @staticmethod - def nearest_neuron_sampling_rate(hz, target_hz=40000): - div = gcd(hz, target_hz) - new_hz = hz * target_hz / div - return new_hz - - -class AllActiveUtils(Utils): - - def __init__(self, description, axon_type): - """ - Parameters - ---------- - description : Config - Configuration to run the simulation - axon_type : string - truncated - diameter of the axon segments is read from .swc (default) - stub - diameter of axon segments is 1 micron - How the axon is replaced within NEURON - - """ - super(AllActiveUtils, self).__init__(description) - self.axon_type = axon_type - - def generate_morphology(self, morph_filename): - '''Load a neurolucida or swc-format cell morphology file. - - Parameters - ---------- - morph_filename : string - Path to morphology. - ''' - if self.axon_type == 'stub': - self._log.info('Replacing axon with a stub : length 60 micron, diameter 1 micron') - super(AllActiveUtils, self).generate_morphology(morph_filename) - return - - self._log.info('Legacy model - Truncating reconstructed axon after 60 micron') - morph_basename = os.path.basename(morph_filename) - morph_extension = morph_basename.split('.')[-1] - if morph_extension.lower() == 'swc': - morph = self.h.Import3d_SWC_read() - elif morph_extension.lower() == 'asc': - morph = self.h.Import3d_Neurolucida3() - else: - raise Exception("Unknown filetype: %s" % morph_extension) - - morph.input(morph_filename) - imprt = self.h.Import3d_GUI(morph, 0) - - self.h("objref this") - imprt.instantiate(self.h.this) - - for sec in self.h.allsec(): - sec.nseg = 1 + 2 * int(sec.L / 40.0) - - self.h("soma[0] area(0.5)") - axon_diams = [self.h.axon[0].diam, self.h.axon[0].diam] - self.h.distance(sec=self.h.soma[0]) - for sec in self.h.allsec(): - if sec.name()[:4] == "axon": - if self.h.distance(0.5, sec=sec) > 60: - axon_diams[1] = sec.diam - break - for sec in self.h.allsec(): - if sec.name()[:4] == "axon": - self.h.delete_section(sec=sec) - self.h('create axon[2]') - for index, sec in enumerate(self.h.axon): - sec.L = 30 - sec.diam = axon_diams[index] - - for sec in self.h.allsec(): - sec.nseg = 1 + 2 * int(sec.L / 40.0) - - self.h.axon[0].connect(self.h.soma[0], 1.0, 0.0) - self.h.axon[1].connect(self.h.axon[0], 1.0, 0.0) - - # make sure diam reflects 3d points - self.h.area(.5, sec=self.h.soma[0]) - - def load_cell_parameters(self): - '''Configure a neuron after the cell morphology has been loaded.''' - passive = self.description.data['passive'][0] - genome = self.description.data['genome'] - conditions = self.description.data['conditions'][0] - h = self.h - - h("access soma") - - # Set fixed passive properties - for sec in h.allsec(): - sec.Ra = passive['ra'] - sec.insert('pas') - # for seg in sec: - # seg.pas.e = passive["e_pas"] - - # for c in passive["cm"]: - # h('forsec "' + c["section"] + '" { cm = %g }' % c["cm"]) - - # Insert channels and set parameters - for p in genome: - section_array = p["section"] - mechanism = p["mechanism"] - param_name = p["name"] - param_value = float(p["value"]) - if section_array == "glob": # global parameter - h(p["name"] + " = %g " % p["value"]) - else: - if hasattr(h, section_array): - if mechanism != "": - print('Adding mechanism %s to %s' - % (mechanism, section_array)) - for section in getattr(h, section_array): - if self.h.ismembrane(str(mechanism), - sec=section) != 1: - section.insert(mechanism) - - print('Setting %s to %.6g in %s' - % (param_name, param_value, section_array)) - for section in getattr(h, section_array): - setattr(section, param_name, param_value) - - # Set reversal potentials - for erev in conditions['erev']: - erev_section_array = erev["section"] - ek = float(erev["ek"]) - ena = float(erev["ena"]) - - print('Setting ek to %.6g and ena to %.6g in %s' - % (ek, ena, erev_section_array)) - - if hasattr(h, erev_section_array): - for section in getattr(h, erev_section_array): - if self.h.ismembrane("k_ion", sec=section) == 1: - setattr(section, 'ek', ek) - - if self.h.ismembrane("na_ion", sec=section) == 1: - setattr(section, 'ena', ena) - else: - print("Warning: can't set erev for %s, " - "section array doesn't exist" % erev_section_array) - - self.h.v_init = conditions['v_init'] - self.h.celsius = conditions['celsius'] diff --git a/allensdk/model/glif/__init__.py b/allensdk/model/glif/__init__.py deleted file mode 100644 index 6ef7424a26..0000000000 --- a/allensdk/model/glif/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -""" A Generalized Linear Integrate and Fire (GLIF) neuron modeling package. -Use this code to run the GLIF models available in the Allen Cell Types Atlas. -See :doc:`glif_models` for more details. -""" diff --git a/allensdk/model/glif/glif_neuron.py b/allensdk/model/glif/glif_neuron.py deleted file mode 100755 index c29c6343b5..0000000000 --- a/allensdk/model/glif/glif_neuron.py +++ /dev/null @@ -1,500 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging - -import numpy as np -import simplejson as json -import allensdk.core.json_utilities as ju -import copy - -try: - from glif_neuron_methods import GlifNeuronMethod, METHOD_LIBRARY -except: - from .glif_neuron_methods import GlifNeuronMethod, METHOD_LIBRARY - -class GlifBadResetException( Exception ): - """ Exception raised when voltage is still above threshold after a reset rule is applied. """ - def __init__(self, message, dv): - super(Exception, self).__init__(message) - self.dv = dv - -class GlifNeuron( object ): - """ Implements the current-based Mihalas Neiber GLIF neuron. Simulations model the voltage, - threshold, and afterspike currents of a neuron given an input stimulus. A set of modular dynamics - rules are applied until voltage crosses threshold, at which point a set of modular reset rules are - applied. See glif_neuron_methods.py for a list of what options there are for voltage, threshold, and - afterspike current dynamics and reset rules. - - Parameters - ---------- - El : float - resting potential - dt : float - duration between time steps - asc_tau_array: np.ndarray - TODO - R_input : float - input resistance - C : float - capacitance - asc_amp_arrap : np.ndarray - afterspike current vector. one element per element of asc_tau_array. - spike_cut_length : int - how many time steps to replace with NaNs when a spike occurs. - th_inf : float - instantaneous threshold - coeffs : dict - dictionary coefficients premultiplied to neuron properties during simulation. used for optimization. - AScurrent_dynamics_method : dict - dictionary containing the 'name' of the afterspike current dynamics method to use and a 'params' dictionary parameters to pass to that function. - voltage_dynamics_method : dict - dictionary containing the 'name' of the voltage dynamics method to use and a 'params' dictionary parameters to pass to that function. - threshold_dynamics_method : dict - dictionary containing the 'name' of the threshold dynamics method to use and a 'params' dictionary parameters to pass to that function. - AScurrent_reset_method : dict - dictionary containing the 'name' of the afterspike current dynamics method to use and a 'params' dictionary parameters to pass to that function. - voltage_reset_method : dict - dictionary containing the 'name' of the voltage dynamics method to use and a 'params' dictionary parameters to pass to that function. - threshold_reset_method : dict - dictionary containing the 'name' of the threshold dynamics method to use and a 'params' dictionary parameters to pass to that function. - init_voltage : float - initial voltage value - init_threshold : float - initial spike threshold value - init_AScurrents : np.ndarray - initial afterspike current vector. one element per element of asc_tau_array. - """ - - TYPE = "GLIF" - - def __init__(self, El, dt, asc_tau_array, R_input, C, asc_amp_array, spike_cut_length, th_inf, th_adapt, coeffs, - AScurrent_dynamics_method, voltage_dynamics_method, threshold_dynamics_method, - AScurrent_reset_method, voltage_reset_method, threshold_reset_method, - init_voltage, init_threshold, init_AScurrents, **kwargs): - - """ Initialize the neuron.""" - - self.type = GlifNeuron.TYPE - self.El = El - self.dt = dt - self.asc_tau_array = np.array(asc_tau_array) - - self.R_input = R_input - self.C = C - - self.asc_amp_array = np.array(asc_amp_array) - self.spike_cut_length = int(spike_cut_length) - self.th_inf = th_inf - self.th_adapt = th_adapt - - self.threshold_components = None - - self.init_voltage = init_voltage - self.init_threshold = init_threshold - self.init_AScurrents = init_AScurrents - - assert len(asc_tau_array) == len(asc_amp_array), Exception("After-spike current vector must have same length as asc_tau_array (%d vs %d)" % (asc_amp_array, asc_tau_array)) - assert len(self.init_AScurrents) == len(self.asc_tau_array), Exception("init_AScurrents length (%d) must have same length as asc_tau_array (%d)" % (len(self.init_AScurrents), len(self.asc_tau_array))) - - - # values computed based on inputs - self.k = 1.0 / self.asc_tau_array - self.G = 1.0 / self.R_input - - # Values that can be fit: They scale the input values. - # These are allowed to have default values because they are going to get optimized. - self.coeffs = { - 'th_inf': 1, - 'C': 1, - 'G': 1, - 'b': 1, - 'a': 1, - 'asc_amp_array': np.ones(len(self.asc_tau_array)) - } - - self.coeffs.update(coeffs) - - logging.debug('spike cut length: %d' % self.spike_cut_length) - - # initialize dynamics methods - self.AScurrent_dynamics_method = self.configure_library_method('AScurrent_dynamics_method', AScurrent_dynamics_method) - self.voltage_dynamics_method = self.configure_library_method('voltage_dynamics_method', voltage_dynamics_method) - self.threshold_dynamics_method = self.configure_library_method('threshold_dynamics_method', threshold_dynamics_method) - - # initialize reset methods - self.AScurrent_reset_method = self.configure_library_method('AScurrent_reset_method', AScurrent_reset_method) - self.voltage_reset_method = self.configure_library_method('voltage_reset_method', voltage_reset_method) - self.threshold_reset_method = self.configure_library_method('threshold_reset_method', threshold_reset_method) - - def __str__(self): - return json.dumps(self.to_dict(), default=ju.json_handler, indent=2) - - @property - def tau_m(self): - return self.R_input*self.C - - @classmethod - def from_dict(cls, d): - return cls(El = d['El'], - dt = d['dt'], - asc_tau_array = d['asc_tau_array'], - R_input = d['R_input'], - C = d['C'], - asc_amp_array = d['asc_amp_array'], - spike_cut_length = d['spike_cut_length'], - th_inf = d['th_inf'], - th_adapt = d['th_adapt'], - coeffs = d.get('coeffs', {}), - AScurrent_dynamics_method = d['AScurrent_dynamics_method'], - voltage_dynamics_method = d['voltage_dynamics_method'], - threshold_dynamics_method = d['threshold_dynamics_method'], - voltage_reset_method = d['voltage_reset_method'], - AScurrent_reset_method = d['AScurrent_reset_method'], - threshold_reset_method = d['threshold_reset_method'], - init_voltage = d['init_voltage'], - init_threshold = d['init_threshold'], - init_AScurrents = d['init_AScurrents']) - - def to_dict(self): - """ Convert the neuron to a serializable dictionary. """ - return { - 'type': self.type, - 'El': self.El, - 'dt': self.dt, - 'asc_tau_array': copy.deepcopy(self.asc_tau_array), - 'R_input': self.R_input, - 'C': self.C, - 'asc_amp_array': copy.deepcopy(self.asc_amp_array), - 'spike_cut_length': self.spike_cut_length, - 'th_inf': self.th_inf, - 'th_adapt': self.th_adapt, - 'coeffs': copy.deepcopy(self.coeffs), - 'AScurrent_dynamics_method': copy.deepcopy(self.AScurrent_dynamics_method), - 'voltage_dynamics_method': copy.deepcopy(self.voltage_dynamics_method), - 'threshold_dynamics_method': copy.deepcopy(self.threshold_dynamics_method), - 'AScurrent_reset_method': copy.deepcopy(self.AScurrent_reset_method), - 'voltage_reset_method': copy.deepcopy(self.voltage_reset_method), - 'threshold_reset_method': copy.deepcopy(self.threshold_reset_method), - 'init_voltage': self.init_voltage, - 'init_threshold': self.init_threshold, - 'init_AScurrents': copy.deepcopy(self.init_AScurrents), - 'El_reference': self.El - } - - @staticmethod - def configure_method(method_name, method, method_params): - """ Create a GlifNeuronMethod instance given a name, a function, and function parameters. - This is just a shortcut to the GlifNeuronMethod constructor. - - Parameters - ---------- - method_name : string - name for refering to this method later - method : function - a python function - method_parameters : dict - function arguments whose values should be fixed - - Returns - ------- - GlifNeuronMethod - a GlifNeuronMethod instance - """ - - return GlifNeuronMethod(method_name, method, method_params) - - @staticmethod - def configure_library_method(method_type, params): - """ Create a GlifNeuronMethod instance out of a library of functions organized by type name. - This refers to the METHOD_LIBRARY in glif_neuron_methods.py, which lays out the available functions - that can be used for dynamics and reset rules. - - Parameters - ---------- - method_type : string - the name of a function category (e.g. 'AScurrent_dynamics_method' for the afterspike current dynamics methods) - params : dict - a dictionary with two members. 'name': the string name of function you want, and 'params': parameters you want to pass to that function - - Returns - ------- - GlifNeuronMethod - a GlifNeuronMethod instance - """ - method_options = METHOD_LIBRARY.get(method_type, None) - - assert method_options is not None, Exception("Unknown method type (%s)" % method_type) - - method_name = params.get('name', None) - method_params = params.get('params', None) - - assert method_name is not None, Exception("Method configuration for %s has no 'name'" % (method_type)) - assert method_params is not None, Exception("Method configuration for %s has no 'params'" % (method_params)) - - method = method_options.get(method_name, None) - - assert method is not None, Exception("unknown method name %s of type %s" % (method_name, method_type)) - - return GlifNeuron.configure_method(method_name, method, method_params) - - def dynamics(self, voltage_t0, threshold_t0, AScurrents_t0, inj, time_step, spike_time_steps): - """ Update the voltage, threshold, and afterspike currents of the neuron for a single time step. - - Parameters - ---------- - voltage_t0 : float - the current voltage of the neuron - threshold_t0 : float - the current spike threshold level of the neuron - AScurrents_t0 : np.ndarray - the current state of the afterspike currents in the neuron - inj : float - the current value of the current injection into the neuron - time_step : int - the current time step of the neuron simulation - spike_time_steps : list - a list of all of the time steps of spikes in the neuron - - Returns - ------- - tuple - voltage_t1 (voltage at next time step), threshold_t1 (threshold at next time step), AScurrents_t1 (afterspike currents at next time step) - """ - - AScurrents_t1 = self.AScurrent_dynamics_method(self, AScurrents_t0, time_step, spike_time_steps) - voltage_t1 = self.voltage_dynamics_method(self, voltage_t0, AScurrents_t0, inj) - threshold_t1 = self.threshold_dynamics_method(self, threshold_t0, voltage_t0, AScurrents_t0, inj) - - return voltage_t1, threshold_t1, AScurrents_t1 - - def reset(self, voltage_t0, threshold_t0, AScurrents_t0): - """ Apply reset rules to the neuron's voltage, threshold, and afterspike currents assuming a spike has occurred (voltage is above threshold). - - Parameters - ---------- - voltage_t0 : float - the current voltage of the neuron - threshold_t0 : float - the current spike threshold level of the neuron - AScurrents_t0 : np.ndarray - the current state of the afterspike currents in the neuron - - Returns - ------- - tuple - voltage_t1 (voltage at next time step), threshold_t1 (threshold at next time step), AScurrents_t1 (afterspike currents at next time step) - """ - - AScurrents_t1 = self.AScurrent_reset_method(self, AScurrents_t0) - voltage_t1 = self.voltage_reset_method(self, voltage_t0) - threshold_t1 = self.threshold_reset_method(self, threshold_t0, voltage_t1) - bad_reset_flag=False - if voltage_t1 > threshold_t1: - bad_reset_flag=True - #TODO put this back in eventually but would rather debug right now -# raise GlifBadResetException("Voltage reset above threshold: voltage_t1 (%f) threshold_t1 (%f), voltage_t0 (%f) threshold_t0 (%f) AScurrents_t0 (%s)" % ( voltage_t1, threshold_t1, voltage_t0, threshold_t0, repr(AScurrents_t0)), voltage_t1 - threshold_t1) - - return voltage_t1, threshold_t1, AScurrents_t1, bad_reset_flag - - def run(self, stim): - """ Run neuron simulation over a given stimulus. This steps through the stimulus applying dynamics equations. - After each step it checks if voltage is above threshold. If so, self.spike_cut_length NaNs are inserted - into the output voltages, reset rules are applied to the voltage, threshold, and afterspike currents, and the - simulation resumes. - - Parameters - ---------- - stim : np.ndarray - vector of scalar current values - - Returns - ------- - dict - a dictionary containing: - 'voltage': simulated voltage values, - 'threshold': threshold values during the simulation, - 'AScurrents': afterspike current values during the simulation, - 'grid_spike_times': spike times (in uits of self.dt) aligned to simulation time steps, - 'interpolated_spike_times': spike times (in units of self.dt) linearly interpolated between time steps, - 'spike_time_steps': the indices of grid spike times, - 'interpolated_spike_voltage': voltage of the simulation at interpolated spike times, - 'interpolated_spike_threshold': threshold of the simulation at interpolated spike times - """ - bad_reset_flag=False - - # initialize the voltage, threshold, and afterspike current values - voltage_t0 = self.init_voltage - threshold_t0 = self.init_threshold - AScurrents_t0 = self.init_AScurrents - - self.threshold_components = None #get rid of lingering method data - - num_time_steps = len(stim) - num_AScurrents = len(AScurrents_t0) - - # pre-allocate the output voltages, thresholds, and after-spike currents - voltage_out=np.empty(num_time_steps) - voltage_out[:]=np.nan - threshold_out=np.empty(num_time_steps) - threshold_out[:]=np.nan - AScurrents_out=np.empty(shape=(num_time_steps, num_AScurrents)) - AScurrents_out[:]=np.nan - - # array that will hold spike indices - spike_time_steps = [] - grid_spike_times = [] - interpolated_spike_times = [] - interpolated_spike_voltage = [] - interpolated_spike_threshold = [] - - time_step = 0 - while time_step < num_time_steps: - if time_step % 10000 == 0: - logging.info("time step %d / %d" % (time_step, num_time_steps)) - - # compute voltage, threshold, and ascurrents at current time step - (voltage_t1, threshold_t1, AScurrents_t1) = self.dynamics(voltage_t0, threshold_t0, AScurrents_t0, stim[time_step], time_step, spike_time_steps) - - #if the voltage is bigger than the threshold record the spike and reset the values - if voltage_t1 > threshold_t1: - - # spike_time_steps are stimulus indices when voltage surpassed threshold - spike_time_steps.append(time_step) - grid_spike_times.append(time_step * self.dt) - - # compute higher fidelity spike time/voltage/threshold by linearly interpolating - interpolated_spike_times.append(interpolate_spike_time(self.dt, time_step, threshold_t0, threshold_t1, voltage_t0, voltage_t1)) - - interpolated_spike_time_offset = interpolated_spike_times[-1] - (time_step - 1) * self.dt - interpolated_spike_voltage.append(interpolate_spike_value(self.dt, interpolated_spike_time_offset, voltage_t0, voltage_t1)) - interpolated_spike_threshold.append(interpolate_spike_value(self.dt, interpolated_spike_time_offset, threshold_t0, threshold_t1)) - - # reset voltage, threshold, and afterspike currents - # Note that these values are not ever recorded unless the spike cut length doesnt happen (this doesnt seem quite right) - (voltage_t0, threshold_t0, AScurrents_t0, bad_reset_flag) = self.reset(voltage_t1, threshold_t1, AScurrents_t1) - - # if we are not integrating during the spike (which includes right now), insert nans then jump ahead - # TODO MAYBE ONE LAST NAN SHOULD BE INSERTED AND THIS VALUE SHOULD BE RECORDED FOR CONSISTANCY - if self.spike_cut_length > 0: - n = self.spike_cut_length - - cut_past_end = (time_step + n) >= len(voltage_out) - if cut_past_end: - n = len(voltage_out) - time_step - - voltage_out[time_step:time_step+n] = np.nan - threshold_out[time_step:time_step+n] = np.nan - AScurrents_out[time_step:time_step+n,:] = np.nan - - if not cut_past_end: - voltage_out[time_step+n] = voltage_t0 - threshold_out[time_step+n] = threshold_t0 - AScurrents_out[time_step+n,:] = AScurrents_t0 - - time_step += self.spike_cut_length+1 - else: - voltage_out[time_step] = voltage_t0 - threshold_out[time_step] = threshold_t0 - AScurrents_out[time_step,:] = AScurrents_t0 - time_step += 1 - - if bad_reset_flag: - voltage_out[time_step:time_step+5] = voltage_t0 - threshold_out[time_step:time_step+5] = threshold_t0 - AScurrents_out[time_step:time_step+5] = AScurrents_t0 - break - else: - # there was no spike, store the next voltages - voltage_out[time_step] = voltage_t1 - threshold_out[time_step] = threshold_t1 - AScurrents_out[time_step,:] = AScurrents_t1 - - voltage_t0 = voltage_t1 - threshold_t0 = threshold_t1 - AScurrents_t0 = AScurrents_t1 - - time_step += 1 - - return { - 'voltage': voltage_out, - 'threshold': threshold_out, - 'AScurrents': AScurrents_out, - 'grid_spike_times': np.array(grid_spike_times), - 'interpolated_spike_times': np.array(interpolated_spike_times), - 'spike_time_steps': np.array(spike_time_steps), - 'interpolated_spike_voltage': np.array(interpolated_spike_voltage), - 'interpolated_spike_threshold': np.array(interpolated_spike_threshold) - } - -# TODO: DEPRICATE -# def get_threshold_components(self): -# if self.threshold_components is None: -# self.threshold_components = { 'spike': [0], 'voltage': [0] } -# -# return self.threshold_components - - def append_threshold_components(self, spike, voltage): - self.threshold_components['spike'].append(spike) - self.threshold_components['voltage'].append(voltage) - -# TODO: DEPRICATE -# def reset_threshold_components(self): -# self.threshold_components = None - - - -def interpolate_spike_time(dt, time_step, threshold_t0, threshold_t1, voltage_t0, voltage_t1): - """ Given two voltage and threshold values, the dt between them and the initial time step, interpolate - a spike time within the dt interval by intersecting the two lines. """ - return time_step*dt + line_crossing_x(dt, voltage_t0, voltage_t1, threshold_t0, threshold_t1) - - -def interpolate_spike_value(dt, interpolated_spike_time_offset, v0, v1): - """ Take a value at two adjacent time steps and linearly interpolate what the value would be - at an offset between the two time steps. """ - return v0 + (v1 - v0) * interpolated_spike_time_offset / dt - - -def line_crossing_x(dx, a0, a1, b0, b1): - """ Find the x value of the intersection of two lines. """ - assert type(a0) != int and type(a1) != int and type(b0) != int and type(b1) != int, Exception("Do not pass integers into this function!") - return dx * (b0 - a0) / ( (a1 - a0) - (b1 - b0) ) - - -def line_crossing_y(dx, a0, a1, b0, b1): - """ Find the y value of the intersection of two lines. """ - return b0 + (b1 - b0) * (b0 - a0) / ((a1 - a0) - (b1 - b0)) - diff --git a/allensdk/model/glif/glif_neuron_methods.py b/allensdk/model/glif/glif_neuron_methods.py deleted file mode 100644 index 3b555270db..0000000000 --- a/allensdk/model/glif/glif_neuron_methods.py +++ /dev/null @@ -1,513 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -""" The methods in this module are used for configuring dynamics and reset rules for the GlifNeuron. -For more details on how to use these methods, see :doc:`glif_models`. -""" -import functools -import numpy as np - - -class GlifNeuronMethod( object ): - """ A simple class to keep track of the name and parameters associated with a neuron method. - This class is initialized with a name, function, and parameters to pass to the function. The - function then has those passed parameters fixed to a partial function using functools.partial. - This class then mimics a function itself using the __call__ convention. Parameters that are not - fixed in this way are assumed to be passed into the method when it is called. If the passed - parameters contain an argument that is not part of the function signature, an exception will - be raised. - - Parameters - ---------- - method_name : string - A shorthand name that will be used to reference this method in the `GlifNeuron`. - method : function - A python function to be called when this instance is called. - method_params : dict - A dictionary mapping function arguments to values for values that should be fixed. - """ - - def __init__(self, method_name, method, method_params): - self.name = method_name - self.params = method_params - self.method = functools.partial(method, **method_params) - - def __call__(self, *args, **kwargs): - """ Defining this method allows an instance to be called like a function """ - return self.method(*args, **kwargs) - - def to_dict(self): - return { - 'name': self.name, - 'params': self.params - } - - def modify_parameter(self, param, operator): - """ Modify a function parameter needs to be modified after initialization. - - Parameters - ---------- - param : string - the name of the parameter to modify - operator : callable - a function or lambda that returns the desired modified value - - Returns - ------- - type - the new value of the variable that was just modified. - """ - value = operator(self.method.keywords[param]) - self.method.keywords[param] = value - return value - - -def max_of_line_and_const(x,b,c,d): - #TODO: move to other library - """ Find the maximum of a value and a position on a line - - Parameters - ---------- - x: float - x position on line 1 - c: float - slope of line 1 - d: float - y-intercept of line 1 - b: float - y-intercept of line 2 - - Returns - ------- - float - the max of a line value and a constant - """ - - one = b - two = c*x+d - return np.maximum(one,two) - - -def min_of_line_and_zero(x,c,d): - #TODO: move to other library - """ Find the minimum of a value and a position on a line - - Parameters - ---------- - x: float - x position on line 1 - c: float - slope of line 1 - d: float - y-intercept of line 1 - b: float - y-intercept of line 2 - - Returns - ------- - float - the max of a line value and a constant - """ - - one = 0 - two = c*x+d - return np.minimum(one,two) - - -def dynamics_AScurrent_exp(neuron, AScurrents_t0, time_step, spike_time_steps): - """ Exponential afterspike current dynamics method takes a current at t0 and returns the current at - a time step later. - """ - - return AScurrents_t0*np.exp(-neuron.k*neuron.dt) - - -def dynamics_AScurrent_none(neuron, AScurrents_t0, time_step, spike_time_steps): - """ This method always returns zeros for the afterspike currents, regardless of input. """ - return np.zeros(len(AScurrents_t0)) - - -def dynamics_voltage_linear_forward_euler(neuron, voltage_t0, AScurrents_t0, inj): - """ (TODO) Linear voltage dynamics. """ - return voltage_t0 + (inj + np.sum(AScurrents_t0) - neuron.G * neuron.coeffs['G'] * (voltage_t0 - neuron.El)) * neuron.dt / (neuron.C * neuron.coeffs['C']) - -def dynamics_voltage_linear_exact(neuron, voltage_t0, AScurrents_t0, inj): - """ (TODO) Linear voltage dynamics. """ - - C = (neuron.C * neuron.coeffs['C']) - I = inj + np.sum(AScurrents_t0) - g = neuron.G * neuron.coeffs['G'] - tau = g/C - N = (I+ g*neuron.El)/C - - return voltage_t0*np.exp(-neuron.dt*tau) + N*(1-np.exp(-tau*neuron.dt))/tau - -def spike_component_of_threshold_forward_euler(th_t0, b_spike, dt): - '''Spike component of threshold modeled as an exponential decay. Implemented - here for forward Euler - - Parameters - ---------- - th_t0 : float - threshold input to function - b_spike : float - decay constant of exponential - dt : float - time step - ''' - b_spike=-b_spike #TODO: this is here because b_spike is always input as positive although it is negative - return th_t0 + th_t0*b_spike * dt - -def spike_component_of_threshold_exact(th0, b_spike, t): - '''Spike component of threshold modeled as an exponential decay. Implemented - here as exact analytical solution. - - Parameters - ---------- - th0 : float - threshold input to function - b_spike : float - decay constant of exponential - t : float or array - time step if used in an Euler setup - time if used analytically - ''' - b_spike=-b_spike - return th0*np.exp(b_spike * t) - -def voltage_component_of_threshold_forward_euler(th_t0, v_t0, dt, a_voltage, b_voltage, El): - '''Equation 2.1 of Mihalas and Nieber, 2009 implemented for use in forward Euler. Note - here all variables are in reference to threshold infinity. Therefore thr_inf is zero - here (replaced threshold_inf with 0 in the equation to be verbose). This is done so that - th_inf can be optimized without affecting this function. - - Parameters - ---------- - th_t0 : float - threshold input to function - v_t0 : float - voltage input to function - dt : float - time step - a_voltage : float - constant a - b_voltage : float - constant b - El : float - reversal potential - ''' - return th_t0 + (a_voltage*(v_t0-El)-b_voltage*(th_t0-0))*dt - -def voltage_component_of_threshold_exact(th0, v0, I, t, a_voltage, b_voltage, C, g, El): - '''Note this function is the exact formulation; however, dt is used because t0 is the initial time and dt - is the time the function is exactly evaluated at. Note: that here, this equation is in reference to th_inf. - Therefore th0 is the total threshold-thr_inf (threshold_inf replaced with 0 in the equation to be verbose). - This is done so that th_inf can be optimized without affecting this function. - - Parameters - ---------- - th0 : float - threshold input to function - v0 : float - voltage input to function - I : float - total current entering neuron (note if there are after spike currents these must be included in this value) - t : float or array - time step if used in an Euler setup - time if used analytically - a_voltage : float - constant a - b_voltage : float - constant b - C : float - capacitance - g : float - conductance (1/resistance) - El : float - reversal potential - ''' - beta=(I+g*El)/g - phi=a_voltage/(b_voltage-g/C) - return phi*(v0-beta)*np.exp(-g*t/C)+1/(np.exp(b_voltage*t))*(th0-phi*(v0-beta)- - (a_voltage/b_voltage)*(beta-El)-0) +(a_voltage/b_voltage)*(beta-El) +0 - - -def dynamics_threshold_three_components_exact(neuron, threshold_t0, voltage_t0, AScurrents_t0, inj, - a_spike, b_spike, a_voltage, b_voltage): - """Analytical solution for threshold dynamics. The threshold will adapt via two mechanisms: - 1. a voltage dependent adaptation. - 2. a component initiated by a spike which decays as an exponential. - These two component are in reference to threshold infinity and are recorded - in the neuron's threshold components. - The third component refers to th_inf which is added separately as opposed to being - included in the voltage component of the threshold as is done in equation 2.1 of - Mihalas and Nieber 2009. Threshold infinity is removed for simple optimization. - - Parameters - ---------- - neuron : class - threshold_t0 : float - threshold input to function - voltage_t0 : float - voltage input to function - AScurrents_t0 : vector - values of after spike currents - inj : float - current injected into the neuron - """ - #TODO: just having the get_threshold_components added an erroneous zero to the beginning of the list - if neuron.threshold_components is None: - neuron.threshold_components = { 'spike': [], 'voltage': [] } - th_spike = 0 - th_voltage = 0 - else: - tcs = neuron.threshold_components - th_spike = tcs['spike'][-1] - th_voltage = tcs['voltage'][-1] - - a_voltage = a_voltage * neuron.coeffs['a'] - b_voltage = b_voltage * neuron.coeffs['b'] - - I = inj + np.sum(AScurrents_t0) - C = neuron.C * neuron.coeffs['C'] - g = neuron.G * neuron.coeffs['G'] - - voltage_component=voltage_component_of_threshold_exact(th_voltage, voltage_t0, I, neuron.dt, a_voltage, b_voltage, C, g, neuron.El) - spike_component = spike_component_of_threshold_exact(th_spike, b_spike, neuron.dt) - - #------update the voltage and spiking values of the the - neuron.append_threshold_components(spike_component, voltage_component) - - return voltage_component+spike_component+neuron.th_inf * neuron.coeffs['th_inf'] - -def dynamics_threshold_spike_component(neuron, threshold_t0, voltage_t0, AScurrents_t0, inj, - a_spike, b_spike, a_voltage, b_voltage): - """Analytical solution for spike component of threshold. The threshold will adapt via - a component initiated by a spike which decays as an exponential. The component is in - reference to threshold infinity and are recorded in the neuron's threshold components. The voltage - component of the threshold is set to zero in the threshold components because it is zero here - The third component refers to th_inf which is added separately as opposed to being - included in the voltage component of the threshold as is done in equation 2.1 of - Mihalas and Nieber 2009. Threshold infinity is removed for simple optimization. - - Parameters - ---------- - neuron : class - threshold_t0 : float - threshold input to function - voltage_t0 : float - voltage input to function - AScurrents_t0 : vector - values of after spike currents - inj : float - current injected into the neuron - """ - - #TODO: just having the get_threshold_components added an erroneous zero to the beginning of the list - if neuron.threshold_components is None: - neuron.threshold_components = { 'spike': [], 'voltage': [] } - th_spike = 0 - th_voltage = 0 - else: - tcs = neuron.threshold_components - th_spike = tcs['spike'][-1] - th_voltage = tcs['voltage'][-1] - - spike_component = spike_component_of_threshold_exact(th_spike, b_spike, neuron.dt) - - #------update the voltage and spiking values of the the - neuron.append_threshold_components(spike_component, 0.0) - - return spike_component+neuron.th_inf * neuron.coeffs['th_inf'] - - -def dynamics_threshold_inf(neuron, threshold_t0, voltage_t0, AScurrents_t0, inj): - """ Set threshold to the neuron's instantaneous threshold. - - Parameters - ---------- - neuron : class - threshold_t0 : not used here - voltage_t0 : not used here - AScurrents_t0 : not used here - inj : not used here - AScurrents_t0 : not used here - inj : not used here - """ - return neuron.coeffs['th_inf'] * neuron.th_inf - - -def reset_AScurrent_sum(neuron, AScurrents_t0, r): - """ Reset afterspike currents by adding summed exponentials. Left over currents from last spikes as - well as newly initiated currents from current spike. Currents amplitudes in neuron.asc_amp_array need - to be the amplitudes advanced though the spike cutting. I.e. In the preprocessor if the after spike currents - are calculated via the GLM from spike initiation the amplitude at the time after the spike cutting needs to - be calculated and neuron.asc_amp_array needs to be set to this value. - - Parameters - ---------- - r : np.ndarray - a coefficient vector applied to the afterspike currents - """ - new_currents=neuron.asc_amp_array * neuron.coeffs['asc_amp_array'] #neuron.asc_amp_array are amplitudes initiating after the spike is cut - left_over_currents=AScurrents_t0 * r * np.exp(-(neuron.k * neuron.dt * neuron.spike_cut_length)) #advancing cut currents though the spike - - return new_currents+left_over_currents - - -def reset_AScurrent_none(neuron, AScurrents_t0): - """ Reset afterspike currents to zero. """ - - if np.sum(AScurrents_t0)!=0: - raise Exception('You are running a LIF but the AScurrents are not zero!') - return np.zeros(len(AScurrents_t0)) - - -def reset_voltage_v_before(neuron, voltage_t0, a, b): - """ Reset voltage to the previous value with a scale and offset applied. - - Parameters - ---------- - a : float - voltage scale constant - b : float - voltage offset constant - """ - - return a*(voltage_t0)+b - -def reset_voltage_zero(neuron, voltage_t0): - """ Reset voltage to zero. """ - return 0.0 - -def reset_threshold_inf(neuron, threshold_t0, voltage_v1): - """ Reset the threshold to instantaneous threshold. """ - return neuron.coeffs['th_inf'] * neuron.th_inf - -def reset_threshold_three_components(neuron, threshold_t0, voltage_v1, a_spike, b_spike): - '''This method calculates the two components of the threshold: a spike (fast) - component and a voltage (slow) component. The threshold_components vectors are then - updated so that the traces match the voltage, current, and total threshold traces. The - spike component of the threshold decays via an exponential fit specified by the amplitude - a_spike and the time constant b_spike fit via the multiblip data. The voltage component - does not change during the duration of the spike. The - spike component are threshold component are summed along with threshold infinity to - return the total threshold. Note that in the current implementation a_spike is added to - the last value of the threshold_components which means that a_spike is the amplitude after - spike cutting (if there is any). - - Inputs: - neuron: class - contains attributes of the neuron - threshold_t0, voltage_t0: float - are not used but are here for consistency with other methods - a_spike: float - amplitude of the exponential decay of spike component of threshold after spike - cutting has been implemented. - b_spike: float - amplitude of the exponential decay of spike component of threshold - - Outputs: - Returns: float - the total threshold which is the sum of the spike component of threshold, the voltage - component of threshold and threshold infinity (with it's corresponding coefficient) - neuron.threshold_components: dictionary containing - a spike: list - vector of spiking component of threshold that corresponds to the voltage, current, - and total threshold traces - b_spike: list - vector of voltage component of threshold that corresponds to the voltage, current, - and total threshold traces. - - Note that this function can be changed to use a_spike at the time of the spike and then have the - the spike component plus the residual decay thought the spike. There are benefits and drawbacks to - this. This potential change would be beneficial as it perhaps makes more biological sense for the - threshold to go up at the time of spike if the traces are ever used. Also this would mean that a_spike - would not have to be adjusted thought the spike cutting after the multiblip fit. However the current - implementation makes sense in that it is similar to how afterspike currents are implemented. - ''' - if neuron.threshold_components is None: - raise Exception('reset should never happen at the beginning of a trace') - - tcs = neuron.threshold_components #for ease of updating - - # note that these values are at the indicie of the time of the spike which is the index right after the voltage crosses - # threshold since the neuron.threshold_components are updated by the dynamics method which is called before the reset. - th_spike=tcs['spike'][-1] #this needs to decay through the spike must be very particular about how many indicies to decay - th_voltage= tcs['voltage'][-1] - - # calculate spike component decay though spike from time =1 (not zero because zero is already in neuron.threshold_components - # via the dynamics method) though the end of the spike cutting - spike_comp_decay=spike_component_of_threshold_exact(th_spike, b_spike, np.arange(1,neuron.spike_cut_length+1)*neuron.dt) #Note that the plus one is that one needs to know the decay and the inital condition for next starting point - - #update neuron.threshold_components via pass by reference. - [tcs['voltage'].append(value) for value in np.ones(neuron.spike_cut_length)*th_voltage] #note that here I don't need the plus one because I am starting from zero - [tcs['spike'].append(value) for value in spike_comp_decay] - - # add the amplitude of the spike component decay to last value of vector (reseting) - tcs['spike'][-1]=tcs['spike'][-1]+a_spike - - return tcs['spike'][-1] + tcs['voltage'][-1] + neuron.th_inf * neuron.coeffs['th_inf'] - - -#: The METHOD_LIBRARY constant groups dynamics and reset methods by group name (e.g. 'voltage_dynamics_method'). -#Those groups assign each method in this file a string name. This is used by the GlifNeuron when initializing -#its dynamics and reset methods. -METHOD_LIBRARY = { - 'AScurrent_dynamics_method': { - 'exp': dynamics_AScurrent_exp, - 'none': dynamics_AScurrent_none - }, - 'voltage_dynamics_method': { - 'linear_forward_euler': dynamics_voltage_linear_forward_euler - }, - 'threshold_dynamics_method': { - 'spike_component': dynamics_threshold_spike_component, - 'inf': dynamics_threshold_inf, - 'three_components_exact': dynamics_threshold_three_components_exact - }, - 'AScurrent_reset_method': { - 'sum': reset_AScurrent_sum, - 'none': reset_AScurrent_none - }, - 'voltage_reset_method': { - 'v_before': reset_voltage_v_before, - 'zero': reset_voltage_zero - }, - 'threshold_reset_method': { - 'inf': reset_threshold_inf, - 'three_components': reset_threshold_three_components - } -} diff --git a/allensdk/model/glif/simulate_neuron.py b/allensdk/model/glif/simulate_neuron.py deleted file mode 100644 index b9c378b373..0000000000 --- a/allensdk/model/glif/simulate_neuron.py +++ /dev/null @@ -1,187 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import logging -import time -import argparse -import os -import numpy as np -import allensdk.core.json_utilities as json_utilities -from allensdk.core.nwb_data_set import NwbDataSet -from allensdk.api.queries.glif_api import GlifApi -from allensdk.model.glif.glif_neuron import GlifNeuron - -DEFAULT_SPIKE_CUT_VALUE = 0.05 # 50mV - -def parse_arguments(): - ''' Use argparse to get required arguments from the command line ''' - parser = argparse.ArgumentParser(description='fit a neuron') - - parser.add_argument('--ephys_file', help='ephys file name') - parser.add_argument('--sweeps_file', help='JSON file listing sweep properties') - parser.add_argument('--neuron_config_file', help='neuron configuration JSON file ') - parser.add_argument('--neuronal_model_id', help='id of the neuronal model. Used when downloading sweep properties.', type=int) - parser.add_argument('--output_ephys_file', help='output file name') - parser.add_argument('--log_level', help='log level', default=logging.INFO) - parser.add_argument('--spike_cut_value', help='value to fill in for spike duration', default=DEFAULT_SPIKE_CUT_VALUE, type=float) - - return parser.parse_args() - - -def simulate_sweep(neuron, stimulus, spike_cut_value): - ''' Simulate a neuron given a stimulus and initial conditions. ''' - - start_time = time.time() - - logging.debug("simulating") - - data = neuron.run(stimulus) - - voltage = data['voltage'] - voltage[np.isnan(voltage)] = spike_cut_value - - logging.debug("simulation time %f" % (time.time() - start_time)) - - return data - - -def load_sweep(file_name, sweep_number): - ''' Load the stimulus for a sweep from file. ''' - logging.debug("loading sweep %d" % sweep_number) - - load_start_time = time.time() - data = NwbDataSet(file_name).get_sweep(sweep_number) - - logging.debug("load time %f" % (time.time() - load_start_time)) - - return data - - -def write_sweep_response(file_name, sweep_number, response, spike_times): - ''' Overwrite the response in a file. ''' - - logging.debug("writing sweep") - - write_start_time = time.time() - ephds = NwbDataSet(file_name) - - ephds.set_sweep(sweep_number, stimulus=None, response=response) - ephds.set_spike_times(sweep_number, spike_times) - - logging.debug("write time %f" % (time.time() - write_start_time)) - - -def simulate_sweep_from_file(neuron, sweep_number, input_file_name, output_file_name, spike_cut_value): - ''' Load a sweep stimulus, simulate the response, and write it out. ''' - - sweep_start_time = time.time() - - try: - data = load_sweep(input_file_name, sweep_number) - except Exception as e: - logging.warning("Failed to load sweep, skipping. (%s)" % str(e)) - raise - - # tell the neuron what dt should be for this sweep - neuron.dt = 1.0 / data['sampling_rate'] - - sim_data = simulate_sweep(neuron, data['stimulus'], spike_cut_value) - - write_sweep_response(output_file_name, sweep_number, sim_data['voltage'], sim_data['interpolated_spike_times']) - - logging.debug("total sweep time %f" % ( time.time() - sweep_start_time )) - -def simulate_neuron(neuron, sweep_numbers, input_file_name, output_file_name, spike_cut_value): - - start_time = time.time() - - for sweep_number in sweep_numbers: - simulate_sweep_from_file(neuron, sweep_number, input_file_name, output_file_name, spike_cut_value) - - logging.debug("total elapsed time %f" % (time.time() - start_time)) - -def main(): - args = parse_arguments() - - logging.getLogger().setLevel(args.log_level) - - glif_api = None - if (args.neuron_config_file is None or - args.sweeps_file is None or - args.ephys_file is None): - - assert args.neuronal_model_id is not None, Exception("A neuronal model id is required if no neuron config file, sweeps file, or ephys data file is provided.") - - glif_api = GlifApi() - glif_api.get_neuronal_model(args.neuronal_model_id) - - if args.neuron_config_file: - neuron_config = json_utilities.read(args.neuron_config_file) - else: - neuron_config = glif_api.get_neuron_config() - - if args.sweeps_file: - sweeps = json_utilities.read(args.sweeps_file) - else: - sweeps = glif_api.get_ephys_sweeps() - - if args.ephys_file: - ephys_file = args.ephys_file - else: - ephys_file = 'stimulus_%d.nwb' % args.neuronal_model_id - - if not os.path.exists(ephys_file): - logging.info("Downloading stimulus to %s." % ephys_file) - glif_api.cache_stimulus_file(ephys_file) - else: - logging.warning("Reusing %s because it already exists." % ephys_file) - - if args.output_ephys_file: - output_ephys_file = args.output_ephys_file - else: - logging.warning("Overwriting input file data with simulated data in place.") - output_ephys_file = ephys_file - - - neuron = GlifNeuron.from_dict(neuron_config) - - # filter out test sweeps - sweep_numbers = [ s['sweep_number'] for s in sweeps if s['stimulus_name'] != 'Test' ] - - simulate_neuron(neuron, sweep_numbers, ephys_file, output_ephys_file, args.spike_cut_value) - - - -if __name__ == "__main__": main() diff --git a/allensdk/morphology/__init__.py b/allensdk/morphology/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/morphology/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/morphology/validate_swc.py b/allensdk/morphology/validate_swc.py deleted file mode 100644 index 9c8e6889e0..0000000000 --- a/allensdk/morphology/validate_swc.py +++ /dev/null @@ -1,102 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import argparse -import allensdk.core.swc as swc -try: - xrange -except: - from past.builtins import xrange - - -def validate_swc(swc_file): - """ - To be compatible with NEURON, SWC files must have the following properties: - 1) a single root node with parent ID '-1' - 2) sequentially increasing ID numbers - 3) immediate children of the soma cannot branch - """ - soma_id = swc.Morphology.SOMA - morphology = swc.read_swc(swc_file) - # verify that there is a single root node - num_soma_nodes = sum([(int(c['type']) == soma_id) - for c in morphology.compartment_list]) - if num_soma_nodes != 1: - raise Exception( - "SWC must have single soma compartment. Found: %d" % num_soma_nodes) - # sanity check - root = morphology.root - if root is None: - raise Exception("Morphology has no root node") - # verify that children of the root have max one child - for root_child_id in root['children']: - root_child = morphology.compartment_index[root_child_id] - num_grand_children = len(root_child['children']) - if num_grand_children > 1: - raise Exception("Child of root (%s) has more than one child (%d)" % ( - root_child_id, num_grand_children)) - # get a list of all of the ids, make sure they are unique while we're at it - all_ids = set() - for compartment in morphology.compartment_list: - iid = int(compartment["id"]) - if iid in all_ids: - raise Exception("Compartment ID %s is not unique." % - compartment["id"]) - pid = int(compartment["parent"]) - if iid < pid: - raise Exception( - "Compartment (%d) has a smaller ID that its parent (%d)" % (iid, pid)) - all_ids.add(iid) - - # sort the ids and make sure there are no gaps - sorted_ids = sorted(all_ids) - for i in xrange(1, len(sorted_ids)): - if sorted_ids[i] - sorted_ids[i - 1] != 1: - raise Exception("Compartment IDs are not sequential") - return True - - -def main(): - try: - parser = argparse.ArgumentParser( - "validate an SWC file for use with NEURON") - parser.add_argument('swc_file') - args = parser.parse_args() - validate_swc(args.swc_file) - except Exception as e: - print(str(e)) - exit(1) -if __name__ == "__main__": - main() diff --git a/allensdk/mouse_connectivity/__init__.py b/allensdk/mouse_connectivity/__init__.py deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/allensdk/mouse_connectivity/grid/__init__.py b/allensdk/mouse_connectivity/grid/__init__.py deleted file mode 100755 index a968d7ab97..0000000000 --- a/allensdk/mouse_connectivity/grid/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ - -from .writers import classic_writer, count_writer, cav_writer -from .subimage import CavSubImage, CountSubImage, ClassicSubImage - - -cases = { - 'classic': { - 'writer': classic_writer, - 'subimage': ClassicSubImage - }, - 'count': { - 'writer': count_writer, - 'subimage': CountSubImage - }, - 'cav': { - 'writer': cav_writer, - 'subimage': CavSubImage - } -} \ No newline at end of file diff --git a/allensdk/mouse_connectivity/grid/__main__.py b/allensdk/mouse_connectivity/grid/__main__.py deleted file mode 100755 index a2c14804ca..0000000000 --- a/allensdk/mouse_connectivity/grid/__main__.py +++ /dev/null @@ -1,136 +0,0 @@ -import argparse -import logging -import os -import sys - -import argschema -import requests - -from allensdk.brain_observatory.argschema_utilities import \ - write_or_print_outputs -from . import cases -from ._schemas import InputParameters, OutputParameters -from .image_series_gridder import ImageSeriesGridder - - -def get_inputs_from_lims(host, image_series_id, output_root, job_queue, - strategy): - uri = ''.join(''' - {}/input_jsons? - object_id={}& - object_class=ImageSeries& - strategy_class={}& - job_queue_name={} - '''.format(host, image_series_id, strategy, job_queue).split()) - response = requests.get(uri) - data = response.json() - - if len(data) == 1 and 'error' in data: - raise ValueError('bad request uri: {} ({})'.format(uri, data['error'])) - - data['storage_directory'] = os.path.join(output_root, os.path.split( - data['storage_directory'])[-1]) - data['grid_prefix'] = os.path.join(output_root, - os.path.split(data['grid_prefix'])[-1]) - data['accumulator_prefix'] = os.path.join(output_root, os.path.split( - data['accumulator_prefix'])[-1]) - - return data - - -def run_grid(args): - try: - case = cases[args['case']] - except KeyError: - logging.error('unrecognized case: {}'.format(args['case'])) - raise - - sub_images = args['sub_images'] - - input_dimensions = [sub_images[0]['dimensions']['column'], - sub_images[0]['dimensions']['row'], - args['sub_image_count']] - - input_spacing = [sub_images[0]['spacing']['column'], - sub_images[0]['spacing']['row'], - args['image_series_slice_spacing']] - - for ii, si in enumerate(sub_images): - del si['dimensions'] - del si['spacing'] - si['polygon_info'] = si['polygons'] - del si['polygons'] - sub_images = sorted(sub_images, key=lambda si: si['specimen_tissue_index']) - logging.info('{} sub images with indices: {}'.format( - len(sub_images), [si['specimen_tissue_index'] for si in sub_images]) - ) - - output_dimensions = [args['reference_dimensions']['slice'], - args['reference_dimensions']['row'], - args['reference_dimensions']['column']] - - output_spacing = [args['reference_spacing']['slice'], - args['reference_spacing']['row'], - args['reference_spacing']['column']] - - subimage_kwargs = {'cls': case['subimage']} - if args['filter_bit'] is not None: - subimage_kwargs['filter_bit'] = args['filter_bit'] - - gridder = ImageSeriesGridder( - in_dims=input_dimensions, - in_spacing=input_spacing, - out_dims=output_dimensions, - out_spacing=output_spacing, - reduce_level=args['reduce_level'], - subimages=sub_images, - subimage_kwargs=subimage_kwargs, - nprocesses=args['nprocesses'], - affine_params=args['affine_params'], - dfmfld_path=args['deformation_field_path'] - ) - - gridder.setup_subimages() - gridder.build_coarse_grids() - - writer = case['writer'] - paths = writer(gridder, args['grid_prefix'], args['accumulator_prefix'], - target_spacings=args['target_spacings']) - - return {'output_file_paths': paths} - - -def main(): - logging.basicConfig( - format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') - - # TODO replace with argschema implementation of multisource parser - remaining_args = sys.argv[1:] - input_data = {} - if '--get_inputs_from_lims' in sys.argv: - lims_parser = argparse.ArgumentParser(add_help=False) - lims_parser.add_argument('--host', type=str, default='http://lims2') - lims_parser.add_argument('--job_queue', type=str, default=None) - lims_parser.add_argument('--strategy', type=str, default=None) - lims_parser.add_argument('--image_series_id', type=int, default=None) - lims_parser.add_argument('--output_root', type=str, default=None) - - lims_args, remaining_args = lims_parser.parse_known_args( - remaining_args) - remaining_args = [item for item in remaining_args if - item != '--get_inputs_from_lims'] - input_data = get_inputs_from_lims(**lims_args.__dict__) - - parser = argschema.ArgSchemaParser( - args=remaining_args, - input_data=input_data, - schema_type=InputParameters, - output_schema_type=OutputParameters, - ) - - output = run_grid(parser.args) - write_or_print_outputs(output, parser) - - -if __name__ == '__main__': - main() diff --git a/allensdk/mouse_connectivity/grid/_schemas.py b/allensdk/mouse_connectivity/grid/_schemas.py deleted file mode 100755 index 02228dd936..0000000000 --- a/allensdk/mouse_connectivity/grid/_schemas.py +++ /dev/null @@ -1,105 +0,0 @@ -from argschema import ArgSchema -from argschema.fields import Nested, String, Float, Dict, Int, List, LogLevel -from argschema.schemas import DefaultSchema -from marshmallow import RAISE - -VALID_CASES = ( - 'classic', - 'cav', - 'count' -) - - -class RaisingSchema(DefaultSchema): - class META: - unknown = RAISE - - -class ImageSpacing(RaisingSchema): - row = Float(required=True) - column = Float(required=True) - - -class ImageDimensions(RaisingSchema): - row = Int(required=True) - column = Int(required=True) - - -class ReferenceSpacing(RaisingSchema): - row = Float(required=True) - column = Float(required=True) - slice = Float(required=True) - - -class ReferenceDimensions(RaisingSchema): - row = Int(required=True) - column = Int(required=True) - slice = Int(required=True) - - -class SubImage(RaisingSchema): - specimen_tissue_index = Int() - dimensions = Nested(ImageDimensions) - spacing = Nested(ImageSpacing) - segmentation_paths = Dict() - intensity_paths = Dict() - polygons = Dict() - - -class InputParameters(ArgSchema): - class Meta: - unknown = RAISE - - log_level = LogLevel(default='INFO', - description="set the logging level of the module") - case = String(required=True, validate=lambda s: s in VALID_CASES, - help='select a use case to run') - sub_images = Nested(SubImage, required=True, many=True, - help='Sub images composing this image series') - affine_params = List(Float, - help='Parameters of affine image stack to reference ' - 'space transform.') - deformation_field_path = String(required=True, - help='Path to parameters of the ' - 'deformable local transform from ' - 'affine-transformed image stack to ' - 'reference space transform.' - ) - image_series_slice_spacing = Float(required=True, - help='Distance (microns) between ' - 'successive images in this ' - 'series.') - target_spacings = List(Float, required=True, - help='For each volume produced, downsample to ' - 'this isometric resolution') - reference_spacing = Nested(ReferenceSpacing, required=True, - help='Native spacing of reference space (' - 'microns).') - reference_dimensions = Nested(ReferenceDimensions, required=True, - help='Native dimensions of reference space.') - sub_image_count = Int(required=True, help='Expected number of sub images') - grid_prefix = String(required=True, help='Write output grid files here') - accumulator_prefix = String(required=True, - help='If this run produces accumulators, ' - 'write them here.') - storage_directory = String(required=False, - help='Storage directory for this image ' - 'series. Not used') - filter_bit = Int(default=None, allow_none=True, - help='if provided, signals that pixels with this bit ' - 'high have passed the optional post-filter stage') - nprocesses = Int(default=8, help='spawn this many worker subprocesses') - reduce_level = Int(default=0, - help='power of two by which to downsample each input ' - 'axis') - - -class OutputSchema(RaisingSchema): - input_parameters = Nested(InputParameters, - description=("Input parameters the module " - "was run with"), - required=True) - - -class OutputParameters(OutputSchema): - output_file_paths = List(String, required=True) diff --git a/allensdk/mouse_connectivity/grid/image_series_gridder.py b/allensdk/mouse_connectivity/grid/image_series_gridder.py deleted file mode 100755 index 8a850edc04..0000000000 --- a/allensdk/mouse_connectivity/grid/image_series_gridder.py +++ /dev/null @@ -1,157 +0,0 @@ -import multiprocessing as mp -import logging - -from six import iteritems -import SimpleITK as sitk -import numpy as np - -from .subimage import run_subimage -from .utilities import image_utilities as iu -from .utilities.downsampling_utilities import block_average, window_average - - -#============================================================================== - - -class ImageSeriesGridder(object): - - @property - def transform(self): - - if not hasattr(self, '_transform'): - dfmfld = sitk.ReadImage(str(self.dfmfld_path)) - self._transform = iu.build_composite_transform(dfmfld, self.affine_params) - del dfmfld - - return self._transform - - - def __init__(self, in_dims, in_spacing, - out_dims, out_spacing, - reduce_level, - subimages, - subimage_kwargs, - nprocesses, - affine_params, - dfmfld_path): - - self.in_dims = np.array(in_dims) - self.in_spacing = np.array(in_spacing) - - self.out_dims = np.array(out_dims) - self.out_spacing = np.array(out_spacing) - - self.reduce_level = reduce_level - - self.nprocesses = nprocesses - - self.affine_params = affine_params - self.dfmfld_path = dfmfld_path - - self.volumes = {} - - self.subimages = subimages - self.subimage_kwargs = subimage_kwargs - - - def set_coarse_grid_parameters(self): - - self.coarse_dims, self.coarse_spacing, self.coarse_grid_radius = \ - iu.compute_coarse_parameters(self.in_dims, self.in_spacing, - self.out_spacing[::-1], - self.reduce_level) - - self.coarse_dims[-1] = self.in_dims[-1] - self.coarse_spacing[-1] = self.in_spacing[-1] - self.coarse_grid_radius = self.coarse_grid_radius[0] - - - def setup_subimages(self): - - if not hasattr(self, 'coarse_grid_radius'): - self.set_coarse_grid_parameters() - - dc = {'in_dims': self.in_dims[:2], - 'in_spacing': self.in_spacing[:2], - 'coarse_dims': self.coarse_dims[:2], - 'coarse_spacing': self.coarse_spacing[:2], - 'reduce_level': self.reduce_level} - dc.update(self.subimage_kwargs) - - for si in self.subimages: - si.update(dc) - - - def initialize_coarse_volume(self, key, dtype): - logging.info('initializing {0} coarse grid volume'.format(key)) - self.volumes[key] = iu.new_image(self.coarse_dims, self.coarse_spacing, dtype, True) - - origin = list(self.volumes[key].GetOrigin()) - origin[2] = 0 - self.volumes[key].SetOrigin(origin) - - - def paste_slice(self, key, index, slice_array): - ''' - ''' - - if not key in self.volumes: - sitk_type = iu.np_sitk_convert(slice_array.dtype) - self.initialize_coarse_volume(key, sitk_type) - - logging.info('resampling data from index {0} into {1} coarse grid volume'.format(index, key)) - slice_image = iu.image_from_array(slice_array.T, self.coarse_spacing[:2], True) - self.volumes[key] = iu.resample_into_volume(slice_image, None, index, self.volumes[key]) - - - def paste_subimage(self, index, output): - '''Inserts planar accumulators into coarse grid volumes - ''' - - for key, array in iteritems(output): - self.paste_slice(key, index, array) - output[key] = None - - del output - - - def build_coarse_grids(self): - - pool = mp.Pool(processes=self.nprocesses) - mapper = pool.imap_unordered(run_subimage, self.subimages) - - logging.info('building coarse grids ({} processes)'.format(self.nprocesses)) - for index, output in mapper: - - logging.info('received coarse planar data from subimage at index {0}'.format(index)) - self.paste_subimage(index, output) - - - def resample_volume(self, key): - logging.info('resampling {0} volume'.format(key)) - self.volumes[key] = iu.resample_volume(self.volumes[key], self.out_dims, - self.out_spacing, None, - self.transform) - - - def consume_volume(self, key, cb): - logging.info('consuming {0} volume'.format(key)) - self.resample_volume(key) - cb(self.volumes[key]) - del self.volumes[key] - - - def accumulator_to_numpy(self, key, cb): - self.resample_volume(key) - cb(self.volumes[key]) - logging.info('converting {0} volume to ndarray'.format(key)) - self.volumes[key] = sitk.GetArrayFromImage(self.volumes[key]) - - - def make_ratio_volume(self, num_key, den_key, ratio_key): - '''assume parents numpified - ''' - - self.volumes[ratio_key] = np.divide(self.volumes[num_key], self.volumes[den_key]) - self.volumes[ratio_key][np.isnan(self.volumes[ratio_key])] = 0 - diff --git a/allensdk/mouse_connectivity/grid/subimage/__init__.py b/allensdk/mouse_connectivity/grid/subimage/__init__.py deleted file mode 100755 index 6d53ea20b8..0000000000 --- a/allensdk/mouse_connectivity/grid/subimage/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -import logging - -from .count_subimage import CountSubImage -from .cav_subimage import CavSubImage -from .classic_subimage import ClassicSubImage - - -def run_subimage(input_data): - - # TODO: remove or fix - logging.basicConfig(format='%(asctime)s - %(process)s - %(levelname)s - %(message)s') - logging.getLogger('').setLevel(logging.INFO) - - index = input_data.pop('specimen_tissue_index') - cls = input_data.pop('cls') - logging.info('handling {0} at index {1}'.format(cls.__name__, index)) - - si = cls(**input_data) - - try: - si.setup_images() - si.compute_coarse_planes() - except Exception as err: - logging.exception(err) - raise err - - return index, si.accumulators diff --git a/allensdk/mouse_connectivity/grid/subimage/base_subimage.py b/allensdk/mouse_connectivity/grid/subimage/base_subimage.py deleted file mode 100755 index 4cce80aa41..0000000000 --- a/allensdk/mouse_connectivity/grid/subimage/base_subimage.py +++ /dev/null @@ -1,270 +0,0 @@ -from __future__ import division -import logging -import sys -import functools - -import numpy as np -from scipy.ndimage.interpolation import zoom -from six import iteritems - -from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu - - -#============================================================================== - - -class SubImage(object): - - @property - def pixel_counter(self): - if not hasattr(self, '_pixel_counter'): - self._pixel_counter = self.make_pixel_counter() - return self._pixel_counter - - - def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, - *args, **kwargs): - - self.reduce_level = reduce_level - self.in_dims = np.around(in_dims / 2**reduce_level).astype(int) - self.in_spacing = in_spacing * 2**reduce_level - self.coarse_spacing = coarse_spacing - - self.blocks, self.coarse_dims = iu.grid_image_blocks( - self.in_dims, self.in_spacing, self.coarse_spacing) - - self.images = {} - self.accumulators = {} - - - def setup_images(self): - pass - - - def compute_coarse_planes(self): - raise NotImplementedError() - - - def binarize(self, image_name): - logging.info('binarizing {0}'.format(image_name)) - self.images[image_name][np.nonzero(self.images[image_name])] = 1 - - - def apply_mask(self, image_name, mask_name, positive=True): - logging.info('applying {0} mask to {1}'.format(mask_name, image_name)) - - mask = self.images[mask_name] - if not positive: - mask = np.logical_not(mask) - mask = mask.astype(np.uint8) - - self.images[image_name] = np.multiply(self.images[image_name], mask) - - - def make_pixel_counter(self): - fn = lambda x: np.sum(x) * 2 ** ( self.reduce_level + 1) # additional x2 <- is an area - return functools.partial(iu.block_apply, out_shape=self.coarse_dims, - dtype=np.float32, blocks=self.blocks, - fn=fn) - - - def apply_pixel_counter(self, accumulator_name, image): - self.accumulators[accumulator_name] = self.pixel_counter(image) - - -#============================================================================== - - -class SegmentationSubImage(SubImage): - - required_segmentations = [] - - - def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, - segmentation_paths, *args, **kwargs): - - super(SegmentationSubImage, self).__init__( - reduce_level, in_dims, in_spacing, coarse_spacing, *args, **kwargs) - - self.segmentation_paths = segmentation_paths - - if 'filter_bit' in kwargs and kwargs['filter_bit'] is not None: - self.filter = 2 ** kwargs['filter_bit'] - - - def setup_images(self): - super(SegmentationSubImage, self).setup_images() - self.get_segmentation() - - - def get_segmentation(self): - - for name in self.__class__.required_segmentations: - self.read_segmentation_image(name) - - self.process_segmentation() - - - def process_segmentation(self): - pass - - - def extract_signal_from_segmentation(self, segmentation_name='segmentation', - signal_name='signal'): - ''' - - Notes - ----- - Currently, the segmentation uses a series of codes to map 8-bit values - onto meaningful classifications. The code for signal pixels is a 1 in - the leftmost bit. - - In some cases, bit 5 indicates that the pixel was not removed in a - posfiltering process. Optionally, this postfilter can be applied in gridding. - - ''' - - logging.info('extracting {0} mask'.format(signal_name)) - self.images[signal_name] = np.right_shift(self.images[segmentation_name], 7) - - signal_count = np.count_nonzero(self.images[signal_name]) - logging.info('{0} signal pixels were detected'.format(signal_count)) - - if hasattr(self, 'filter'): - filter_mask = np.bitwise_and(self.images[segmentation_name], self.filter) - self.images[signal_name][filter_mask == 0] = 0 - - filter_count = np.count_nonzero(self.images[signal_name]) - logging.info('{0} / {1} pixels passed the signal filter'.format(filter_count, signal_count)) - - - - - def extract_injection_from_segmentation(self, segmentation_name='segmentation', - injection_name='injection'): - ''' - - Notes - ----- - Currently, the segmentation uses a series of codes to map 8-bit values - onto meaningful classifications. The code for signal pixels is a 1 in - at least one of of the 5 rightmost bits. - - ''' - - logging.info('extracting {0} mask'.format(injection_name)) - self.images[injection_name] = np.bitwise_and(self.images[segmentation_name], 31) - self.images[injection_name][self.images[injection_name] > 0] = 1 - - - def read_segmentation_image(self, segmentation_name='segmentation'): - ''' - - Notes - ----- - We downsample in memory rather than using the jp2 pyramid because the - segmentation is a label image. - - ''' - - path = self.segmentation_paths[segmentation_name] - logging.info('loading {} from {}'.format(segmentation_name, path)) - segmentation = iu.read_segmentation_image(path) - logging.info('{} shape: {}'.format(segmentation_name, segmentation.shape)) - - if self.reduce_level > 0: - logging.info('downsampling {0}'.format(segmentation_name)) - segmentation = zoom(segmentation, 1.0 / 2**self.reduce_level, order=0) - - self.images[segmentation_name] = segmentation - - -#============================================================================== - - -class IntensitySubImage(SubImage): - - required_intensities = [] - - - def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, intensity_paths, - *args, **kwargs): - - super(IntensitySubImage, self).__init__(reduce_level, in_dims, - in_spacing, coarse_spacing, *args, **kwargs) - - self.intensity_paths = intensity_paths - - - def get_intensity(self): - - for name in self.__class__.required_intensities: - info = self.intensity_paths[name] - logging.info('loading {} intensities from {}'.format(name, info['path'])) - - self.images[name] = iu.read_intensity_image(info['path'], self.reduce_level, info['channel']) - logging.info('loaded {} intensities to image of shape: {}'.format(name, self.images[name].shape)) - - - - def setup_images(self): - super(IntensitySubImage, self).setup_images() - self.get_intensity() - - -#============================================================================== - - -class PolygonSubImage(SubImage): - - required_polys = [] - optional_polys = [] - - def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, - polygon_info, *args, **kwargs): - - super(PolygonSubImage, self).__init__( - reduce_level, in_dims, in_spacing, coarse_spacing, *args, **kwargs) - - self.polygon_info = polygon_info - - - def setup_images(self): - super(PolygonSubImage, self).setup_images() - self.get_polygons() - - - def get_polygons(self): - - polygon_keys = [] - polygon_keys.extend(self.__class__.optional_polys) - polygon_keys.extend(self.__class__.required_polys) - - for key in polygon_keys: - logging.info('rasterizing {0} polygon'.format(key)) - - points = self.polygon_info[key] - self.images[key] = iu.rasterize_polygons(self.in_dims.astype(int)[::-1], - [1.0 / 2**self.reduce_level, - 1.0 / 2**self.reduce_level], - points).T - - -#============================================================================== - - -def run_subimage(input_data): - - # TODO: not propagating the log level from the calling thread - logging.getLogger('').setLevel(logging.INFO) - - index = input_data.pop('specimen_tissue_index') - cls = input_data.pop('cls') - logging.info('handling {0} at index {1}'.format(cls.__name__, index)) - - si = cls(**input_data) - - si.setup_images() - si.compute_coarse_planes() - - return index, si.accumulators diff --git a/allensdk/mouse_connectivity/grid/subimage/cav_subimage.py b/allensdk/mouse_connectivity/grid/subimage/cav_subimage.py deleted file mode 100755 index 4085a6e5d6..0000000000 --- a/allensdk/mouse_connectivity/grid/subimage/cav_subimage.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import division -import logging -import sys -import functools - -import numpy as np -from scipy.ndimage.interpolation import zoom -from six import iteritems - -from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu -from .base_subimage import PolygonSubImage, SegmentationSubImage, IntensitySubImage - - -#============================================================================== - - -class CavSubImage(PolygonSubImage): - - required_polys = ['missing_tile', 'cav_tracer'] - - - def compute_coarse_planes(self): - - nonmissing = np.logical_not(self.images['missing_tile']) - del self.images['missing_tile'] - - self.apply_pixel_counter('sum_pixels', nonmissing) - - cav_nonmissing = np.multiply(self.images['cav_tracer'], nonmissing) - del nonmissing - self.apply_pixel_counter('cav_tracer', cav_nonmissing) - del cav_nonmissing - - del self.images - - -#============================================================================== diff --git a/allensdk/mouse_connectivity/grid/subimage/classic_subimage.py b/allensdk/mouse_connectivity/grid/subimage/classic_subimage.py deleted file mode 100755 index a0ddd43c16..0000000000 --- a/allensdk/mouse_connectivity/grid/subimage/classic_subimage.py +++ /dev/null @@ -1,119 +0,0 @@ -from __future__ import division -import logging -import sys -import functools - -import numpy as np -from scipy.ndimage.interpolation import zoom -from six import iteritems - - -from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu -from .base_subimage import PolygonSubImage, SegmentationSubImage, IntensitySubImage - - -#============================================================================== - - -class ClassicSubImage(IntensitySubImage, SegmentationSubImage, PolygonSubImage): - - required_polys = ['missing_tile', 'no_signal', 'aav_exclusion'] - optional_polys = ['aav_tracer'] - required_segmentations = ['segmentation'] - required_intensities = ['green'] - - - def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, - polygon_info, segmentation_paths, intensity_paths, - injection_polygon_key='aav_tracer', - *args, **kwargs): - - super(ClassicSubImage, self).__init__( - reduce_level, in_dims, in_spacing, coarse_spacing, - polygon_info=polygon_info, - segmentation_paths=segmentation_paths, - intensity_paths=intensity_paths, - *args, **kwargs) - self.injection_polygon_key = injection_polygon_key - - - def process_segmentation(self): - - self.apply_mask('segmentation', 'missing_tile', False) - - self.extract_signal_from_segmentation(signal_name='projection') - - self.apply_mask('projection', 'no_signal', False) - del self.images['no_signal'] - - if self.injection_polygon_key in self.images: - logging.info('reading injection from rasterized {} polygon'.format(self.injection_polygon_key)) - self.images['injection'] = self.images[self.injection_polygon_key] - del self.images[self.injection_polygon_key] - else: - self.extract_injection_from_segmentation() - del self.images['segmentation'] - logging.info('injection pixel count: {}'.format(np.count_nonzero(self.images['injection']))) - - self.binarize('projection') - self.binarize('injection') - - - def compute_coarse_planes(self): - - # do these in batches to minimize peak memory usage - self.compute_intensity() - self.compute_injection() - self.compute_projection() - self.compute_sum_pixels() - - del self.images - - - def compute_intensity(self): - logging.info('computing green accumulators') - - self.apply_pixel_counter('sum_pixel_intensities', self.images['green']) - - injection_intensity = np.multiply(self.images['green'], self.images['injection']) - self.apply_pixel_counter('injection_sum_pixel_intensities', injection_intensity) - del injection_intensity - - self.images['green'][self.images['projection'] == 0] = 0 - self.apply_pixel_counter('sum_projecting_pixel_intensities', self.images['green']) - - self.images['green'][self.images['injection'] == 0] = 0 - self.apply_pixel_counter('injectionsum_projecting_pixel_intensities', self.images['green']) - - del self.images['green'] - - - def compute_injection(self): - logging.info('computing injection accumulators') - - self.apply_pixel_counter('injection_sum_pixels', self.images['injection']) - - injection_projecting_pixels = np.logical_and(self.images['injection'], self.images['projection']) - self.apply_pixel_counter('injection_sum_projecting_pixels', injection_projecting_pixels) - del injection_projecting_pixels - - del self.images['injection'] - - - def compute_projection(self): - logging.info('computing projection accumulators') - - self.apply_pixel_counter('sum_projecting_pixels', self.images['projection']) - del self.images['projection'] - - - def compute_sum_pixels(self): - logging.info('computing sum pixel accumulators') - - self.apply_pixel_counter('sum_pixels', np.logical_not(self.images['missing_tile'])) - - if 'aav_exclusion' in self.images: - self.apply_pixel_counter('aav_exclusion_sum_pixels', self.images['aav_exclusion']) - - -#============================================================================== diff --git a/allensdk/mouse_connectivity/grid/subimage/count_subimage.py b/allensdk/mouse_connectivity/grid/subimage/count_subimage.py deleted file mode 100755 index bf6c544dec..0000000000 --- a/allensdk/mouse_connectivity/grid/subimage/count_subimage.py +++ /dev/null @@ -1,84 +0,0 @@ -from __future__ import division -import logging -import sys -import functools - -import numpy as np -from scipy.ndimage.interpolation import zoom -from six import iteritems - -from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu -from .base_subimage import PolygonSubImage, SegmentationSubImage - - -class CountSubImage(SegmentationSubImage, PolygonSubImage): - - required_polys = ['missing_tile', 'no_signal', 'aav_exclusion'] - required_segmentations = ['segmentation'] - - def __init__(self, reduce_level, in_dims, in_spacing, coarse_spacing, - polygon_info, segmentation_paths, injection_polygon_key='aav_tracer', *args, **kwargs): - - super(CountSubImage, self).__init__(reduce_level, in_dims, in_spacing, - coarse_spacing, - polygon_info=polygon_info, - segmentation_paths=segmentation_paths, - *args, **kwargs) - self.injection_polygon_key = injection_polygon_key - - - def process_segmentation(self): - - self.apply_mask('segmentation', 'missing_tile', False) - - self.extract_signal_from_segmentation(signal_name='projection') - - self.apply_mask('projection', 'no_signal', False) - del self.images['no_signal'] - - if self.injection_polygon_key in self.images: - self.images['injection'] = self.images[self.injection_polygon_key] - del self.images[injection_polygon_key] - else: - self.extract_injection_from_segmentation() - del self.images['segmentation'] - - self.binarize('projection') - self.binarize('injection') - - - def compute_injection(self): - logging.info('computing injection accumulators') - - self.apply_pixel_counter('injection_sum_pixels', self.images['injection']) - - injection_projecting_pixels = np.logical_and(self.images['injection'], self.images['projection']) - self.apply_pixel_counter('injection_sum_projecting_pixels', injection_projecting_pixels) - del injection_projecting_pixels - - del self.images['injection'] - - - def compute_projection(self): - logging.info('computing projection accumulators') - - self.apply_pixel_counter('sum_projecting_pixels', self.images['projection']) - del self.images['projection'] - - - def compute_sum_pixels(self): - logging.info('computing sum pixel accumulators') - - self.apply_pixel_counter('sum_pixels', np.logical_not(self.images['missing_tile'])) - - if 'aav_exclusion' in self.images: - self.apply_pixel_counter('aav_exclusion_sum_pixels', self.images['aav_exclusion']) - - - def compute_coarse_planes(self): - - self.compute_injection() - self.compute_projection() - self.compute_sum_pixels() - - del self.images diff --git a/allensdk/mouse_connectivity/grid/utilities/__init__.py b/allensdk/mouse_connectivity/grid/utilities/__init__.py deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/allensdk/mouse_connectivity/grid/utilities/downsampling_utilities.py b/allensdk/mouse_connectivity/grid/utilities/downsampling_utilities.py deleted file mode 100755 index e618659be3..0000000000 --- a/allensdk/mouse_connectivity/grid/utilities/downsampling_utilities.py +++ /dev/null @@ -1,81 +0,0 @@ -from __future__ import division -import itertools as it -from six.moves import xrange -import logging - -from skimage.measure import block_reduce -from skimage.util import view_as_windows -from scipy.ndimage.filters import convolve -import numpy as np - - -def downsample_average(volume, current_spacing, target_spacing): - - factor = target_spacing / current_spacing - - if factor == 1: - return volume - - if factor - np.floor(factor) == 0: - volume = block_average(volume, factor) - elif factor - np.floor(factor) == 0.5: - volume = window_average(volume, factor) - else: - raise ValueError('voxels cannot be unevenly split!') - - return volume - - -def block_average(volume, factor): - logging.info('downsampling by block averaging with a factor of {0}'.format(factor)) - factor = np.around(factor).astype(int) - return block_reduce(volume, tuple([factor, factor, factor]), np.mean, 0) - - -def apply_divisions(image, window_size): - - for axis in xrange(image.ndim): - - slc = tuple([ - slice(window_size-1, None, window_size) - if ii == axis - else slice(0, None) - for ii in xrange(image.ndim) - ]) - - image[slc] = image[slc] / 2 - - -def window_average(volume, factor): - logging.info('downsampling by window averaging with a factor of {0}'.format(factor)) - volume = volume.copy() - - window_size = np.ceil(factor).astype(int) - window_step = 2 * window_size - 1 - output_size = np.ceil([sh / factor for sh in volume.shape]).astype(int) - - apply_divisions(volume, window_size) - volume = conv(volume, factor, window_size) - - return extract(volume, factor, window_size, window_step, output_size) - - -def conv(image, factor, window_size): - kernel = np.ones([window_size for ii in image.shape]) - return convolve(image, kernel, mode='constant', cval=0.0) / factor ** image.ndim - - -def extract(image, factor, window_size, window_step, output_shape): - - output = np.zeros( output_shape ) - - for case in it.product(*([[0, 1]] * image.ndim)): - - inp = tuple([slice(window_size - 2, None, window_step) - if not ii else slice(window_size, None, window_step) for ii in case]) - out = tuple([slice(0, None, 2) if not ii else slice(1, None, 2) for ii in case]) - - output[out] = image[inp] - - return output - diff --git a/allensdk/mouse_connectivity/grid/utilities/image_utilities.py b/allensdk/mouse_connectivity/grid/utilities/image_utilities.py deleted file mode 100755 index cc620649ad..0000000000 --- a/allensdk/mouse_connectivity/grid/utilities/image_utilities.py +++ /dev/null @@ -1,291 +0,0 @@ -from __future__ import division -import logging -import os -import sys - -from six import iteritems -import numpy as np -import SimpleITK as sitk -from skimage.draw import polygon - -from allensdk.config.manifest import Manifest - - -if sys.version_info[0] > 2: - failed_import = (ImportError, ModuleNotFoundError) -else: - failed_import = (ImportError,) - - -# use np_sitk_convert or sitk_np_convert to access -# TODO: check if this already exists. If not: add more dtypes -# it does not -NUMPY_SITK_TYPE_LOOKUP = {np.dtype(np.float32): sitk.sitkFloat32} -SITK_NUMPY_TYPE_LOOKUP = {v: k for k, v in iteritems(NUMPY_SITK_TYPE_LOOKUP)} - - -# ITK/Numpy - - -def set_image_spacing(image, spacing, origin=True): - ''' - ''' - - spacing = np.array(spacing) - - image.SetSpacing(spacing.tolist()) - - if origin: - image.SetOrigin((0.5 * spacing).tolist()) - - -def new_image(dims, spacing, dtype, origin=True): - ''' - ''' - - if len(dims) == 2: - image = sitk.Image(dims[0], dims[1], dtype) - elif len(dims) == 3: - image = sitk.Image(dims[0], dims[1], dims[2], dtype) - set_image_spacing(image, spacing, origin) - - return image - - -def image_from_array(array, spacing, origin=True): - ''' - ''' - - image = sitk.GetImageFromArray(array) - set_image_spacing(image, spacing, origin) - - return image - - -def np_sitk_convert(np_type): - ''' - ''' - - return NUMPY_SITK_TYPE_LOOKUP[np_type] - - -def sitk_np_convert(sitk_type): - ''' - ''' - - return SITK_NUMPY_TYPE_LOOKUP[sitk_type] - - -# Math - - -def compute_coarse_parameters(in_dims, in_spacing, out_spacing, reduce_level): - ''' - ''' - - reduce_factor = pow(2, reduce_level) - fradius = np.divide(out_spacing, in_spacing) / 2.0 / reduce_factor - - coarse_grid_radius = np.round(fradius) - coarse_grid_size = (coarse_grid_radius * 2 + 1) * reduce_factor - - coarse_grid_spacing = np.multiply(in_spacing, coarse_grid_size) - coarse_grid_dims = np.ceil( - np.divide(in_dims, coarse_grid_size) - ).astype(int) - - return coarse_grid_dims, coarse_grid_spacing, coarse_grid_radius - - -def block_apply(in_image, out_shape, dtype, blocks, fn): - ''' - ''' - - out_image = np.zeros(out_shape, dtype=dtype) - - for ii, row_block in enumerate(blocks[0]): - for jj, col_block in enumerate(blocks[1]): - - out_image[ii, jj] = fn(in_image[row_block[0]:row_block[1], - col_block[0]:col_block[1]]) - - return out_image - - -def grid_image_blocks(in_shape, in_spacing, out_spacing): - ''' - ''' - - blocks = [] - out_shape = [] - for dim in range(len(in_shape)): - in_px_centers = np.arange(in_spacing[dim]*0.5, - in_shape[dim]*in_spacing[dim], - in_spacing[dim]) - - out_px_edges = np.arange(out_spacing[dim], - (in_shape[dim]-0.5)*in_spacing[dim], - out_spacing[dim]) - - dig = np.digitize(in_px_centers, out_px_edges) - - inds = np.where(np.diff(dig) > 0)[0] + 1 - inds = [0] + inds.tolist() + [in_shape[dim]] - - dim_blocks = [ - (int(inds[i]), int(inds[i+1])) for i in range(len(inds)-1) - ] - - out_shape.append(len(dim_blocks)) - blocks.append(dim_blocks) - - return blocks, out_shape - - -# Polygons - - -def rasterize_polygons(shape, scale, polys): - - canvas = np.zeros(shape, dtype=np.uint8) - for points in polys: - - rpts = np.array([ - int(np.around(item[1] * scale[1])) for item in points - ]) - cpts = np.array([ - int(np.around(item[0] * scale[0])) for item in points - ]) - - poly = polygon(rpts, cpts) - canvas[poly] = 1 - - return canvas - - -# Transforms - - -def resample_into_volume(image, transform, z, vol, dtype=sitk.sitkFloat32): - ''' - ''' - - if transform is None: - transform = sitk.Transform() - - timage = sitk.Resample(image, transform, sitk.sitkLinear, 0.0, dtype) - tvol = sitk.JoinSeries(timage) - return sitk.Paste(vol, tvol, tvol.GetSize(), destinationIndex=[0, 0, z]) - - -def build_affine_transform(aff_params): - ''' - ''' - - xfm = sitk.AffineTransform(3) - xfm.SetParameters(aff_params) - - return xfm - - -def build_composite_transform(dfmfield=None, aff_params=None): - ''' - ''' - - if dfmfield is not None and \ - dfmfield.GetPixelIDValue() != sitk.sitkVectorFloat64: - dfmfield = sitk.Cast(dfmfield, sitk.sitkVectorFloat64) - - if dfmfield is None and aff_params is None: - transform = sitk.Transform() - elif dfmfield is not None and aff_params is None: - transform = sitk.DisplacementFieldTransform(dfmfield) - elif dfmfield is None and aff_params is not None: - transform = build_affine_transform(aff_params) - elif dfmfield is not None and aff_params is not None: - dfmxfm = sitk.DisplacementFieldTransform(dfmfield) - affxfm = build_affine_transform(aff_params) - - transform = sitk.CompositeTransform([affxfm, dfmxfm]) - - return transform - - -def resample_volume(volume, dims, spacing, interpolator=None, transform=None): - ''' - ''' - - if transform is None: - transform = sitk.Transform() - if interpolator is None: - interpolator = sitk.sitkLinear - - ref = new_image(dims, spacing, sitk.sitkFloat32, False) - return sitk.Resample(volume, ref, transform, interpolator) - - -def write_volume(volume, - name, - prefix=None, - specify_resolution=None, - extension='.nrrd', - paths=None): - - if prefix is None: - path = name - else: - path = os.path.join(prefix, name) - - if specify_resolution is not None: - if isinstance(specify_resolution, (float, np.floating)) and \ - specify_resolution % 1.0 == 0: - specify_resolution = int(specify_resolution) - path = path + '_{0}'.format(specify_resolution) - - path = path + extension - - logging.info('writing {0} volume to {1}'.format(name, path)) - Manifest.safe_make_parent_dirs(path) - volume.SetOrigin([0, 0, 0]) - sitk.WriteImage(volume, str(path), True) - - if paths is not None: - paths.append(path) - - -def __read_segmentation_image_with_kakadu(path): - if not os.path.exists(path): - raise OSError('file not found at {}'.format(path)) - return jpeg_twok.read(path).T - - -def __read_intensity_image_with_kakadu(path, reduce_level, channel): - if not os.path.exists(path): - raise OSError('file not found at {}'.format(path)) - return jpeg_twok.read(path, reduce_level, channel).T - - -def __read_segmentation_image_with_glymur(path): - return glymur.Jp2k(path)[:] - - -def __read_intensity_image_with_glymur(path): - return glymur.Jp2k(path)[:] - - -try: - # we use a proprietary library called kakadu internally - # (jpeg_twok is a python interface around that library) - # kakadu offers really good performance as well as support for - # advanced jp2 features - # however, since it is proprietary, we can't share it - # alongside the allensdk, - # so we default to glymur (a python openjpeg) for external users. - sys.path.append('/shared/bioapps/itk/itk_shared/jp2/build') - import jpeg_twok - read_segmentation_image = __read_segmentation_image_with_kakadu - read_intensity_image = __read_intensity_image_with_kakadu -except failed_import: - import glymur - read_segmentation_image = __read_segmentation_image_with_glymur - read_intensity_image = __read_intensity_image_with_glymur diff --git a/allensdk/mouse_connectivity/grid/writers/__init__.py b/allensdk/mouse_connectivity/grid/writers/__init__.py deleted file mode 100755 index aad37882e2..0000000000 --- a/allensdk/mouse_connectivity/grid/writers/__init__.py +++ /dev/null @@ -1,118 +0,0 @@ -import functools - -import numpy as np - -from ..utilities.image_utilities import write_volume, image_from_array -from ..utilities.downsampling_utilities import downsample_average - - -def count_writer(gridder, grid_prefix, accumulator_prefix, target_spacings, **kwargs): - paths = [] - - cb = functools.partial(write_volume, name='sum_pixels', prefix=accumulator_prefix, paths=paths) - gridder.accumulator_to_numpy('sum_pixels', cb) - - ratio_and_pyramid(gridder, 'sum_projecting_pixels', 'sum_pixels', 'projection_density', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'injection_sum_projecting_pixels', 'sum_pixels', 'injection_density', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'injection_sum_pixels', 'sum_pixels', 'injection_fraction', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'aav_exclusion_sum_pixels', 'sum_pixels', 'aav_exclusion_fraction', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - gridder.volumes['data_mask'] = gridder.volumes['sum_pixels'] / np.amax(gridder.volumes['sum_pixels']) - del gridder.volumes['sum_pixels'] - gridder.volumes['data_mask'] = gridder.volumes['data_mask'].round() - handle_pyramid(gridder, 'data_mask', target_spacings, grid_prefix, paths=paths) - - return paths - - -def cav_writer(gridder, grid_prefix, accumulator_prefix, **kwargs): - - paths = [] - - cb = functools.partial(write_volume, name='cav_tracer_10', prefix=accumulator_prefix, paths=paths) - gridder.accumulator_to_numpy('cav_tracer', cb) - - cb = functools.partial(write_volume, name='sum_pixels_10', prefix=accumulator_prefix, paths=paths) - gridder.accumulator_to_numpy('sum_pixels', cb) - - gridder.make_ratio_volume('cav_tracer', 'sum_pixels', 'cav_density') - gridder.volumes['cav_density'] = image_from_array(gridder.volumes['cav_density'], gridder.out_spacing) - write_volume(gridder.volumes['cav_density'], name='cav_density_10', prefix=grid_prefix, paths=paths) - del gridder.volumes['cav_density'] - - gridder.volumes['data_mask'] = gridder.volumes['sum_pixels'] / np.amax(gridder.volumes['sum_pixels']) - del gridder.volumes['sum_pixels'] - gridder.volumes['data_mask'] = gridder.volumes['data_mask'].round() - gridder.volumes['data_mask'] = image_from_array(gridder.volumes['data_mask'], gridder.out_spacing) - write_volume(gridder.volumes['data_mask'], name='data_mask_10', prefix=accumulator_prefix, paths=paths) - del gridder.volumes - - return paths - - -def classic_writer(gridder, grid_prefix, accumulator_prefix, target_spacings, **kwargs): - - paths = [] - - cb = functools.partial(write_volume, name='sum_pixel_intensities', prefix=accumulator_prefix, paths=paths) - gridder.consume_volume('sum_pixel_intensities', cb) - - cb = functools.partial(write_volume, name='injection_sum_pixel_intensities', prefix=accumulator_prefix, paths=paths) - gridder.consume_volume('injection_sum_pixel_intensities', cb) - - cb = functools.partial(write_volume, name='sum_pixels', prefix=accumulator_prefix, paths=paths) - gridder.accumulator_to_numpy('sum_pixels', cb) - - ratio_and_pyramid(gridder, 'sum_projecting_pixels', 'sum_pixels', 'projection_density', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'injection_sum_projecting_pixels', 'sum_pixels', 'injection_density', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'sum_projecting_pixel_intensities', 'sum_pixels', 'projection_energy', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'injectionsum_projecting_pixel_intensities', 'sum_pixels', 'injection_energy', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'injection_sum_pixels', 'sum_pixels', 'injection_fraction', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - ratio_and_pyramid(gridder, 'aav_exclusion_sum_pixels', 'sum_pixels', 'aav_exclusion_fraction', - accumulator_prefix, grid_prefix, target_spacings, paths=paths) - - gridder.volumes['data_mask'] = gridder.volumes['sum_pixels'] / np.amax(gridder.volumes['sum_pixels']) - del gridder.volumes['sum_pixels'] - gridder.volumes['data_mask'] = gridder.volumes['data_mask'].round() - handle_pyramid(gridder, 'data_mask', target_spacings, grid_prefix, paths=paths) - - return paths - - -def handle_pyramid(isg, key, target_spacings, prefix, paths): - - cspacing = isg.out_spacing[0] - for tspacing in target_spacings: - - downsampled = downsample_average(isg.volumes[key], cspacing, tspacing) - write_volume(image_from_array(downsampled, [tspacing] * 3), - key, prefix=prefix, specify_resolution=tspacing, paths=paths) - - del isg.volumes[key] - - -def ratio_and_pyramid(isg, num, den, out, accumulator_prefix, grid_prefix, target_spacings, paths): - - cb = functools.partial(write_volume, name=num, prefix=accumulator_prefix, paths=paths) - isg.accumulator_to_numpy(num, cb) - - isg.make_ratio_volume(num, den, out) - del isg.volumes[num] - handle_pyramid(isg, out, target_spacings, grid_prefix, paths) \ No newline at end of file diff --git a/allensdk/test/api/__init__.py b/allensdk/test/api/__init__.py deleted file mode 100644 index 07330c08c2..0000000000 --- a/allensdk/test/api/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -class SafeJsonMsg: - ''' Apes a paged query response from api.brain-map.org. - Safe to use with Pythons >= 3.7 (which implement pep 479, such that StopIteration errors in - generators are converted to RunTimeErrors). - ''' - - def __init__(self, data): - self.data = iter(data) - - def __call__(self, *a, **k): - try: - return next(self.data) - except StopIteration as err: - return {'msg': []} diff --git a/allensdk/test/api/cloud_cache/__init__.py b/allensdk/test/api/cloud_cache/__init__.py deleted file mode 100644 index 1bb8bf6d7f..0000000000 --- a/allensdk/test/api/cloud_cache/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# empty diff --git a/allensdk/test/api/cloud_cache/conftest.py b/allensdk/test/api/cloud_cache/conftest.py deleted file mode 100644 index dbdd900e7c..0000000000 --- a/allensdk/test/api/cloud_cache/conftest.py +++ /dev/null @@ -1,185 +0,0 @@ -import pytest -import copy - - -@pytest.fixture -def example_datasets(): - """ - A dict representing an example dataset that can - be used for testing the CloudCache api. - - The key of the dict is the name of each file. - The values of the dict are dicts in which - 'file_id' -> maps to the file_id used to describe the file - 'data' -> a bytestring representing the contents of the file - """ - datasets = {} - data = {} - data['f1.txt'] = {'data': b'1234567', - 'file_id': '1'} - data['f2.txt'] = {'data': b'4567890', - 'file_id': '2'} - data['f3.txt'] = {'data': b'11121314', - 'file_id': '3'} - datasets['1.0.0'] = data - - data = {} - data['f1.txt'] = {'data': b'abcdefg', - 'file_id': '1'} - data['f2.txt'] = {'data': b'4567890', - 'file_id': '2'} - data['f3.txt'] = {'data': b'11121314', - 'file_id': '3'} - - datasets['2.0.0'] = data - - data = {} - data['f1.txt'] = {'data': b'1234567', - 'file_id': '1'} - data['f2.txt'] = {'data': b'xyzabcde', - 'file_id': '2'} - data['f3.txt'] = {'data': b'hijklmnop', - 'file_id': '3'} - - datasets['3.0.0'] = data - return datasets - - -@pytest.fixture -def baseline_data_with_metadata(): - """ - Example dataset with example metadata for use in testing - CloudCache API - """ - data = {} - data['f1.txt'] = {'file_id': '1', 'data': b'1234'} - data['f2.txt'] = {'file_id': '2', 'data': b'2345'} - data['f3.txt'] = {'file_id': '3', 'data': b'6789'} - - metadata = {} - metadata['metadata_1.csv'] = b'abcdef' - metadata['metadata_2.csv'] = b'ghijklm' - metadata['metadata_3.csv'] = b'nopqrst' - return {'data': data, 'metadata': metadata} - - -@pytest.fixture -def example_datasets_with_metadata(baseline_data_with_metadata): - """ - Multiple versions of an example dataset that goes through - all possible mutations (adding/deleting files; renaming files; - changing existing files) for use in testing the CloudCache API - """ - - example = {} - example['data'] = {} - example['metadata'] = {} - - data = copy.deepcopy(baseline_data_with_metadata) - example['data']['1.0.0'] = data['data'] - example['metadata']['1.0.0'] = data['metadata'] - - # delete one data file - data = copy.deepcopy(baseline_data_with_metadata) - data['data'].pop('f2.txt') - example['data']['2.0.0'] = data['data'] - example['metadata']['2.0.0'] = data['metadata'] - - # rename one data file - data = copy.deepcopy(baseline_data_with_metadata) - old = data['data'].pop('f2.txt') - data['data']['f4.txt'] = {'file_id': '4', 'data': old['data']} - example['data']['3.0.0'] = data['data'] - example['metadata']['3.0.0'] = data['metadata'] - - # change one data file - data = copy.deepcopy(baseline_data_with_metadata) - data['data']['f3.txt'] = {'file_id': '3', 'data': b'44556677'} - example['data']['4.0.0'] = data['data'] - example['metadata']['4.0.0'] = data['metadata'] - - # add a data file - data = copy.deepcopy(baseline_data_with_metadata) - data['data']['f4.txt'] = {'file_id': '4', 'data': b'44556677'} - example['data']['5.0.0'] = data['data'] - example['metadata']['5.0.0'] = data['metadata'] - - # delete a data file and change another - data = copy.deepcopy(baseline_data_with_metadata) - data['data'].pop('f2.txt') - data['data']['f1.txt'] = {'file_id': '1', 'data': b'xxxxxx'} - example['data']['6.0.0'] = data['data'] - example['metadata']['6.0.0'] = data['metadata'] - - # delete a data file and rename another - data = copy.deepcopy(baseline_data_with_metadata) - data['data'].pop('f2.txt') - old = data['data'].pop('f3.txt') - data['data']['f5.txt'] = {'file_id': '5', 'data': old['data']} - example['data']['7.0.0'] = data['data'] - example['metadata']['7.0.0'] = data['metadata'] - - # delete a data file and add another - data = copy.deepcopy(baseline_data_with_metadata) - data['data'].pop('f2.txt') - data['data']['f5.txt'] = {'file_id': '5', 'data': b'yyyyy'} - example['data']['8.0.0'] = data['data'] - example['metadata']['8.0.0'] = data['metadata'] - - # rename a data file and add another - data = copy.deepcopy(baseline_data_with_metadata) - old = data['data'].pop('f3.txt') - data['data']['f4.txt'] = {'file_id': '4', 'data': old['data']} - data['data']['f5.txt'] = {'file_id': '5', 'data': b'wwwwww'} - example['data']['9.0.0'] = data['data'] - example['metadata']['9.0.0'] = data['metadata'] - - # delete a metadata file - data = copy.deepcopy(baseline_data_with_metadata) - data['metadata'].pop('metadata_2.csv') - example['data']['10.0.0'] = data['data'] - example['metadata']['10.0.0'] = data['metadata'] - - # rename a metadata file - data = copy.deepcopy(baseline_data_with_metadata) - old = data['metadata'].pop('metadata_2.csv') - data['metadata']['metadata_4.csv'] = old - example['data']['11.0.0'] = data['data'] - example['metadata']['11.0.0'] = data['metadata'] - - # change a metadata file - data = copy.deepcopy(baseline_data_with_metadata) - data['metadata']['metadata_3.csv'] = b'12345' - example['data']['12.0.0'] = data['data'] - example['metadata']['12.0.0'] = data['metadata'] - - # add a metadata file - data = copy.deepcopy(baseline_data_with_metadata) - data['metadata']['metadata_4.csv'] = b'12345' - example['data']['13.0.0'] = data['data'] - example['metadata']['13.0.0'] = data['metadata'] - - # delete a data file and change a metadata file - data = copy.deepcopy(baseline_data_with_metadata) - data['data'].pop('f2.txt') - old = data['metadata'].pop('metadata_3.csv') - data['metadata']['metadata_4.csv'] = old - example['data']['14.0.0'] = data['data'] - example['metadata']['14.0.0'] = data['metadata'] - - # rename a data file, add two data files - # rename a metadata file and delete two metadata files - data = copy.deepcopy(baseline_data_with_metadata) - old = data['data'].pop('f1.txt') - data['data']['f4.txt'] = old - data['data']['f5.txt'] = {'file_id': '5', 'data': b'babababa'} - data['data']['f6.txt'] = {'file_id': '6', 'data': b'neighneigh'} - old = data['metadata'].pop('metadata_2.csv') - data['metadata']['metadata_4.csv'] = old - data['metadata'].pop('metadata_1.csv') - data['metadata'].pop('metadata_3.csv') - - example['data']['15.0.0'] = data['data'] - example['metadata']['15.0.0'] = data['metadata'] - - return example diff --git a/allensdk/test/api/cloud_cache/test_cache.py b/allensdk/test/api/cloud_cache/test_cache.py deleted file mode 100644 index 8c40822b8b..0000000000 --- a/allensdk/test/api/cloud_cache/test_cache.py +++ /dev/null @@ -1,812 +0,0 @@ -import pytest -import json -import hashlib -import pathlib -import pandas as pd -import io -import boto3 -from moto import mock_s3 -from .utils import create_bucket -from allensdk.api.cloud_cache.cloud_cache import OutdatedManifestWarning -from allensdk.api.cloud_cache.cloud_cache import S3CloudCache # noqa: E501 -from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 - - -@mock_s3 -def test_list_all_manifests(tmpdir): - """ - Test that S3CloudCache.list_al_manifests() returns the correct result - """ - - test_bucket_name = 'list_manifest_bucket' - - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name) - - client = boto3.client('s3', region_name='us-east-1') - client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v1.0.0.json', - Body=b'123456') - client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v2.0.0.json', - Body=b'123456') - client.put_object(Bucket=test_bucket_name, - Key='junk.txt', - Body=b'123456') - - cache = S3CloudCache(tmpdir, test_bucket_name, 'proj') - - assert cache.manifest_file_names == ['manifest_v1.0.0.json', - 'manifest_v2.0.0.json'] - - -@mock_s3 -def test_list_all_manifests_many(tmpdir): - """ - Test the extreme case when there are more manifests than list_objects_v2 - can return at a time - """ - - test_bucket_name = 'list_manifest_bucket' - - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name) - - client = boto3.client('s3', region_name='us-east-1') - for ii in range(2000): - client.put_object(Bucket=test_bucket_name, - Key=f'proj/manifests/manifest_{ii}.json', - Body=b'123456') - - client.put_object(Bucket=test_bucket_name, - Key='junk.txt', - Body=b'123456') - - cache = S3CloudCache(tmpdir, test_bucket_name, 'proj') - - expected = list([f'manifest_{ii}.json' for ii in range(2000)]) - expected.sort() - assert cache.manifest_file_names == expected - - -@mock_s3 -def test_loading_manifest(tmpdir): - """ - Test loading manifests with S3CloudCache - """ - - test_bucket_name = 'list_manifest_bucket' - - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - client = boto3.client('s3', region_name='us-east-1') - - manifest_1 = {'manifest_version': '1', - 'metadata_file_id_column_name': 'file_id', - 'data_pipeline': 'placeholder', - 'project_name': 'sam-beckett', - 'data_files': {}, - 'metadata_files': {'a.csv': {'url': 'http://www.junk.com', - 'version_id': '1111', - 'file_hash': 'abcde'}, - 'b.csv': {'url': 'http://silly.com', - 'version_id': '2222', - 'file_hash': 'fghijk'}}} - - manifest_2 = {'manifest_version': '2', - 'metadata_file_id_column_name': 'file_id', - 'data_pipeline': 'placeholder', - 'project_name': 'al', - 'data_files': {}, - 'metadata_files': {'c.csv': {'url': 'http://www.absurd.com', - 'version_id': '3333', - 'file_hash': 'lmnop'}, - 'd.csv': {'url': 'http://nonsense.com', - 'version_id': '4444', - 'file_hash': 'qrstuv'}}} - - client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v1.0.0.json', - Body=bytes(json.dumps(manifest_1), 'utf-8')) - - client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v2.0.0.json', - Body=bytes(json.dumps(manifest_2), 'utf-8')) - - cache = S3CloudCache(pathlib.Path(tmpdir), test_bucket_name, 'proj') - assert cache.current_manifest is None - cache.load_manifest('manifest_v1.0.0.json') - assert cache._manifest._data == manifest_1 - assert cache.version == '1' - assert cache.file_id_column == 'file_id' - assert cache.metadata_file_names == ['a.csv', 'b.csv'] - assert cache.current_manifest == 'manifest_v1.0.0.json' - - cache.load_manifest('manifest_v2.0.0.json') - assert cache._manifest._data == manifest_2 - assert cache.version == '2' - assert cache.file_id_column == 'file_id' - assert cache.metadata_file_names == ['c.csv', 'd.csv'] - - with pytest.raises(ValueError) as context: - cache.load_manifest('manifest_v3.0.0.json') - msg = 'is not one of the valid manifest names' - assert msg in context.value.args[0] - - -@mock_s3 -def test_file_exists(tmpdir): - """ - Test that cache._file_exists behaves correctly - """ - - data = b'aakderasjklsafetss77123523asf' - hasher = hashlib.blake2b() - hasher.update(data) - true_checksum = hasher.hexdigest() - test_file_path = pathlib.Path(tmpdir)/'junk.txt' - with open(test_file_path, 'wb') as out_file: - out_file.write(data) - - # need to populate a bucket in order for - # S3CloudCache to be instantiated - test_bucket_name = 'silly_bucket' - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - cache = S3CloudCache(tmpdir, test_bucket_name, 'proj') - - # should be true - good_attribute = CacheFileAttributes('http://silly.url.com', - '12345', - true_checksum, - test_file_path) - assert cache._file_exists(good_attribute) - - # test when file path is wrong - bad_path = pathlib.Path('definitely/not/a/file.txt') - bad_attribute = CacheFileAttributes('http://silly.url.com', - '12345', - true_checksum, - bad_path) - - assert not cache._file_exists(bad_attribute) - - # test when path exists but is not a file - bad_attribute = CacheFileAttributes('http://silly.url.com', - '12345', - true_checksum, - pathlib.Path(tmpdir)) - with pytest.raises(RuntimeError) as context: - cache._file_exists(bad_attribute) - assert 'but is not a file' in context.value.args[0] - - -@mock_s3 -def test_download_file(tmpdir): - """ - Test that S3CloudCache._download_file behaves as expected - """ - - hasher = hashlib.blake2b() - data = b'11235813kjlssergwesvsdd' - hasher.update(data) - true_checksum = hasher.hexdigest() - - test_bucket_name = 'bucket_for_download' - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # turn on bucket versioning - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - client.put_object(Bucket=test_bucket_name, - Key='data/data_file.txt', - Body=data) - - response = client.list_object_versions(Bucket=test_bucket_name) - version_id = response['Versions'][0]['VersionId'] - - cache_dir = pathlib.Path(tmpdir) / 'download/test/cache' - cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') - - expected_path = cache_dir / true_checksum / 'data/data_file.txt' - - url = f'http://{test_bucket_name}.s3.amazonaws.com/data/data_file.txt' - good_attributes = CacheFileAttributes(url, - version_id, - true_checksum, - expected_path) - - assert not expected_path.exists() - cache._download_file(good_attributes) - assert expected_path.exists() - hasher = hashlib.blake2b() - with open(expected_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_checksum - - -@mock_s3 -def test_download_file_multiple_versions(tmpdir): - """ - Test that S3CloudCache._download_file behaves as expected - when there are multiple versions of the same file in the - bucket - - (This is really just testing that S3's versioning behaves the - way we think it does) - """ - - hasher = hashlib.blake2b() - data_1 = b'11235813kjlssergwesvsdd' - hasher.update(data_1) - true_checksum_1 = hasher.hexdigest() - - hasher = hashlib.blake2b() - data_2 = b'zzzzxxxxyyyywwwwjjjj' - hasher.update(data_2) - true_checksum_2 = hasher.hexdigest() - - assert true_checksum_2 != true_checksum_1 - - test_bucket_name = 'bucket_for_download_versions' - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # turn on bucket versioning - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - client.put_object(Bucket=test_bucket_name, - Key='data/data_file.txt', - Body=data_1) - - response = client.list_object_versions(Bucket=test_bucket_name) - version_id_1 = response['Versions'][0]['VersionId'] - - client = boto3.client('s3', region_name='us-east-1') - client.put_object(Bucket=test_bucket_name, - Key='data/data_file.txt', - Body=data_2) - - response = client.list_object_versions(Bucket=test_bucket_name) - version_id_2 = None - for v in response['Versions']: - if v['IsLatest']: - version_id_2 = v['VersionId'] - assert version_id_2 is not None - assert version_id_2 != version_id_1 - - cache_dir = pathlib.Path(tmpdir) / 'download/test/cache' - cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') - - url = f'http://{test_bucket_name}.s3.amazonaws.com/data/data_file.txt' - - # download first version of file - expected_path = cache_dir / true_checksum_1 / 'data/data_file.txt' - - good_attributes = CacheFileAttributes(url, - version_id_1, - true_checksum_1, - expected_path) - - assert not expected_path.exists() - cache._download_file(good_attributes) - assert expected_path.exists() - hasher = hashlib.blake2b() - with open(expected_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_checksum_1 - - # download second version of file - expected_path = cache_dir / true_checksum_2 / 'data/data_file.txt' - - good_attributes = CacheFileAttributes(url, - version_id_2, - true_checksum_2, - expected_path) - - assert not expected_path.exists() - cache._download_file(good_attributes) - assert expected_path.exists() - hasher = hashlib.blake2b() - with open(expected_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_checksum_2 - - -@mock_s3 -def test_re_download_file(tmpdir): - """ - Test that S3CloudCache._download_file will re-download a file - when it has been removed from the local system - """ - - hasher = hashlib.blake2b() - data = b'11235813kjlssergwesvsdd' - hasher.update(data) - true_checksum = hasher.hexdigest() - - test_bucket_name = 'bucket_for_re_download' - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # turn on bucket versioning - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - client.put_object(Bucket=test_bucket_name, - Key='data/data_file.txt', - Body=data) - - response = client.list_object_versions(Bucket=test_bucket_name) - version_id = response['Versions'][0]['VersionId'] - - cache_dir = pathlib.Path(tmpdir) / 'download/test/cache' - cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') - - expected_path = cache_dir / true_checksum / 'data/data_file.txt' - - url = f'http://{test_bucket_name}.s3.amazonaws.com/data/data_file.txt' - good_attributes = CacheFileAttributes(url, - version_id, - true_checksum, - expected_path) - - assert not expected_path.exists() - cache._download_file(good_attributes) - assert expected_path.exists() - hasher = hashlib.blake2b() - with open(expected_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_checksum - - # now, remove the file, and see if it gets re-downloaded - expected_path.unlink() - assert not expected_path.exists() - - cache._download_file(good_attributes) - assert expected_path.exists() - hasher = hashlib.blake2b() - with open(expected_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_checksum - - -@mock_s3 -def test_download_data(tmpdir): - """ - Test that S3CloudCache.download_data() correctly downloads files from S3 - """ - - hasher = hashlib.blake2b() - data = b'11235813kjlssergwesvsdd' - hasher.update(data) - true_checksum = hasher.hexdigest() - - test_bucket_name = 'bucket_for_download_data' - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # turn on bucket versioning - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - client.put_object(Bucket=test_bucket_name, - Key='data/data_file.txt', - Body=data) - - response = client.list_object_versions(Bucket=test_bucket_name) - version_id = response['Versions'][0]['VersionId'] - - manifest = {} - manifest['manifest_version'] = '1' - manifest['project_name'] = "project-z" - manifest['metadata_file_id_column_name'] = 'file_id' - manifest['metadata_files'] = {} - url = f'http://{test_bucket_name}.s3.amazonaws.com/project-z/data/data_file.txt' # noqa: E501 - data_file = {'url': url, - 'version_id': version_id, - 'file_hash': true_checksum} - - manifest['data_files'] = {'only_data_file': data_file} - manifest['data_pipeline'] = 'placeholder' - - client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v1.0.0.json', - Body=bytes(json.dumps(manifest), 'utf-8')) - - cache_dir = pathlib.Path(tmpdir) / "data/path/cache" - cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') - - cache.load_manifest('manifest_v1.0.0.json') - - expected_path = cache_dir / 'project-z-1' / 'data/data_file.txt' - assert not expected_path.exists() - - # test data_path - attr = cache.data_path('only_data_file') - assert attr['local_path'] == expected_path - assert not attr['exists'] - - # NOTE: commenting out because moto does not support - # list_object_versions and this is becoming difficult - - # result_path = cache.download_data('only_data_file') - # assert result_path == expected_path - # assert expected_path.exists() - # hasher = hashlib.blake2b() - # with open(expected_path, 'rb') as in_file: - # hasher.update(in_file.read()) - # assert hasher.hexdigest() == true_checksum - - # test that data_path detects that the file now exists - # attr = cache.data_path('only_data_file') - # assert attr['local_path'] == expected_path - # assert attr['exists'] - - -@mock_s3 -def test_download_metadata(tmpdir): - """ - Test that S3CloudCache.download_metadata() correctly - downloads files from S3 - """ - - hasher = hashlib.blake2b() - data = b'11235813kjlssergwesvsdd' - hasher.update(data) - true_checksum = hasher.hexdigest() - - test_bucket_name = 'bucket_for_download_metadata' - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # turn on bucket versioning - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - meta_version = client.put_object(Bucket=test_bucket_name, - Key='metadata_file.csv', - Body=data)["VersionId"] - - response = client.list_object_versions(Bucket=test_bucket_name) - version_id = response['Versions'][0]['VersionId'] - - manifest = {} - manifest['manifest_version'] = '1' - manifest['project_name'] = "project4" - manifest['metadata_file_id_column_name'] = 'file_id' - url = f'http://{test_bucket_name}.s3.amazonaws.com/project4/metadata_file.csv' # noqa: E501 - metadata_file = {'url': url, - 'version_id': version_id, - 'file_hash': true_checksum} - - manifest['metadata_files'] = {'metadata_file.csv': metadata_file} - manifest['data_files'] = {} - manifest['data_pipeline'] = 'placeholder' - - client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v1.0.0.json', - Body=bytes(json.dumps(manifest), 'utf-8')) - - cache_dir = pathlib.Path(tmpdir) / "metadata/path/cache" - cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') - - cache.load_manifest('manifest_v1.0.0.json') - - expected_path = cache_dir / "project4-1" / 'metadata_file.csv' - assert not expected_path.exists() - - # test that metadata_path also works - attr = cache.metadata_path('metadata_file.csv') - assert attr['local_path'] == expected_path - assert not attr['exists'] - - def response_fun(Bucket, Prefix): - # moto doesn't cover list_object_versions - return {"Versions": [{ - "VersionId": meta_version, - "Key": "metadata_file.csv", - "Size": 12}]} - # cache.s3_client.list_object_versions = response_fun - - # NOTE: commenting out because moto does not support - # list_object_versions and this is becoming difficult - - # result_path = cache.download_metadata('metadata_file.csv') - # assert result_path == expected_path - # assert expected_path.exists() - # hasher = hashlib.blake2b() - # with open(expected_path, 'rb') as in_file: - # hasher.update(in_file.read()) - # assert hasher.hexdigest() == true_checksum - - # # test that metadata_path detects that the file now exists - # attr = cache.metadata_path('metadata_file.csv') - # assert attr['local_path'] == expected_path - # assert attr['exists'] - - -@mock_s3 -def test_metadata(tmpdir): - """ - Test that S3CloudCache.metadata() returns the expected pandas DataFrame - """ - data = {} - data['mouse_id'] = [1, 4, 6, 8] - data['sex'] = ['F', 'F', 'M', 'M'] - data['age'] = ['P50', 'P46', 'P23', 'P40'] - true_df = pd.DataFrame(data) - - with io.StringIO() as stream: - true_df.to_csv(stream, index=False) - stream.seek(0) - data = bytes(stream.read(), 'utf-8') - - hasher = hashlib.blake2b() - hasher.update(data) - true_checksum = hasher.hexdigest() - - test_bucket_name = 'bucket_for_metadata' - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # turn on bucket versioning - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - client.put_object(Bucket=test_bucket_name, - Key='metadata_file.csv', - Body=data) - - response = client.list_object_versions(Bucket=test_bucket_name) - version_id = response['Versions'][0]['VersionId'] - - manifest = {} - manifest['manifest_version'] = '1' - manifest['project_name'] = "project-X" - manifest['metadata_file_id_column_name'] = 'file_id' - url = f'http://{test_bucket_name}.s3.amazonaws.com/metadata_file.csv' - metadata_file = {'url': url, - 'version_id': version_id, - 'file_hash': true_checksum} - - manifest['metadata_files'] = {'metadata_file.csv': metadata_file} - manifest['data_files'] = {} - manifest['data_pipeline'] = 'placeholder' - - client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v1.0.0.json', - Body=bytes(json.dumps(manifest), 'utf-8')) - - cache_dir = pathlib.Path(tmpdir) / "metadata/cache" - cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') - cache.load_manifest('manifest_v1.0.0.json') - - metadata_df = cache.get_metadata('metadata_file.csv') - assert true_df.equals(metadata_df) - - -@mock_s3 -def test_latest_manifest(tmpdir, example_datasets_with_metadata): - """ - Test that the methods which return the latest and latest downloaded - manifest file names work correctly - """ - bucket_name = 'latest_manifest_bucket' - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=example_datasets_with_metadata['metadata']) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - assert cache.latest_downloaded_manifest_file == '' - - cache.load_manifest('project-x_manifest_v7.0.0.json') - cache.load_manifest('project-x_manifest_v3.0.0.json') - cache.load_manifest('project-x_manifest_v2.0.0.json') - - assert cache.latest_manifest_file == 'project-x_manifest_v15.0.0.json' - - expected = 'project-x_manifest_v7.0.0.json' - assert cache.latest_downloaded_manifest_file == expected - - -@mock_s3 -def test_outdated_manifest_warning(tmpdir, example_datasets_with_metadata): - """ - Test that a warning is raised the first time you try to load an outdated - manifest - """ - - bucket_name = 'outdated_manifest_bucket' - metadatasets = example_datasets_with_metadata['metadata'] - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=metadatasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - m_warn_type = 'OutdatedManifestWarning' - - with pytest.warns(OutdatedManifestWarning) as warnings: - cache.load_manifest('project-x_manifest_v7.0.0.json') - ct = 0 - for w in warnings.list: - if w._category_name == m_warn_type: - msg = str(w.message) - assert 'is not the most up to date' in msg - assert 'S3CloudCache.compare_manifests' in msg - assert 'load_latest_manifest' in msg - ct += 1 - assert ct > 0 - - # assert no warning is raised the second time by catching - # any warnings that are emitted and making sure they are - # not OutdatedManifestWarnings - with pytest.warns(None) as warnings: - cache.load_manifest('project-x_manifest_v11.0.0.json') - if len(warnings) > 0: - for w in warnings.list: - assert w._category_name != 'OutdatedManifestWarning' - - -@mock_s3 -def test_list_all_downloaded(tmpdir, example_datasets_with_metadata): - """ - Test that list_all_downloaded_manifests works - """ - - bucket_name = 'outdated_manifest_bucket' - metadatasets = example_datasets_with_metadata['metadata'] - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=metadatasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - assert cache.list_all_downloaded_manifests() == [] - - cache.load_manifest('project-x_manifest_v5.0.0.json') - assert cache.current_manifest == 'project-x_manifest_v5.0.0.json' - cache.load_manifest('project-x_manifest_v2.0.0.json') - assert cache.current_manifest == 'project-x_manifest_v2.0.0.json' - cache.load_manifest('project-x_manifest_v3.0.0.json') - assert cache.current_manifest == 'project-x_manifest_v3.0.0.json' - - expected = {'project-x_manifest_v5.0.0.json', - 'project-x_manifest_v2.0.0.json', - 'project-x_manifest_v3.0.0.json'} - downloaded = set(cache.list_all_downloaded_manifests()) - assert downloaded == expected - - -@mock_s3 -def test_latest_manifest_warning(tmpdir, example_datasets_with_metadata): - """ - Test that the correct warning is emitted when the user tries - to load_latest_manifest but that has not been downloaded yet - """ - - bucket_name = 'outdated_manifest_bucket' - metadatasets = example_datasets_with_metadata['metadata'] - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=metadatasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - cache.load_manifest('project-x_manifest_v4.0.0.json') - - with pytest.warns(OutdatedManifestWarning) as warnings: - cache.load_latest_manifest() - assert len(warnings) == 1 - msg = str(warnings[0].message) - assert 'project-x_manifest_v4.0.0.json' in msg - assert 'project-x_manifest_v15.0.0.json' in msg - assert 'It is possible that some data files' in msg - cmd = "S3CloudCache.load_manifest('project-x_manifest_v4.0.0.json')" - assert cmd in msg - - -@mock_s3 -def test_load_last_manifest(tmpdir, example_datasets_with_metadata): - """ - Test that load_last_manifest works - """ - bucket_name = 'load_lst_manifest_bucket' - metadatasets = example_datasets_with_metadata['metadata'] - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=metadatasets) - - cache_dir = pathlib.Path(tmpdir) / 'load_last_cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - # check that load_last_manifest in a new cache loads the - # latest manifest without emitting a warning - with pytest.warns(None) as warnings: - cache.load_last_manifest() - ct = 0 - for w in warnings.list: - if w._category_name == 'OutdatedManifestWarning': - ct += 1 - assert ct == 0 - assert cache.current_manifest == 'project-x_manifest_v15.0.0.json' - - cache.load_manifest('project-x_manifest_v7.0.0.json') - - del cache - - # check that load_last_manifest on an old cache emits the - # expected warning and loads the correct manifest - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - expected = 'A more up to date version of the ' - expected += 'dataset -- project-x_manifest_v15.0.0.json ' - expected += '-- exists online' - with pytest.warns(OutdatedManifestWarning, - match=expected) as warnings: - cache.load_last_manifest() - - assert cache.current_manifest == 'project-x_manifest_v7.0.0.json' - cache.load_manifest('project-x_manifest_v4.0.0.json') - del cache - - # repeat the above test, making sure the correct manifest is - # loaded again - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - expected = 'A more up to date version of the ' - expected += 'dataset -- project-x_manifest_v15.0.0.json ' - expected += '-- exists online' - with pytest.warns(OutdatedManifestWarning, - match=expected) as warnings: - cache.load_last_manifest() - - assert cache.current_manifest == 'project-x_manifest_v4.0.0.json' - - -@mock_s3 -def test_corrupted_load_last_manifest(tmpdir, - example_datasets_with_metadata): - """ - Test that load_last_manifest works when the record of the last - manifest has been corrupted - """ - bucket_name = 'load_lst_manifest_bucket' - metadatasets = example_datasets_with_metadata['metadata'] - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=metadatasets) - - cache_dir = pathlib.Path(tmpdir) / 'load_last_cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - cache.load_manifest('project-x_manifest_v9.0.0.json') - fname = cache._manifest_last_used.resolve() - del cache - with open(fname, 'w') as out_file: - out_file.write('babababa') - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - expected = 'Loading latest version -- project-x_manifest_v15.0.0.json' - with pytest.warns(UserWarning, match=expected): - cache.load_last_manifest() - assert cache.current_manifest == 'project-x_manifest_v15.0.0.json' diff --git a/allensdk/test/api/cloud_cache/test_change_log.py b/allensdk/test/api/cloud_cache/test_change_log.py deleted file mode 100644 index 91adf1ce45..0000000000 --- a/allensdk/test/api/cloud_cache/test_change_log.py +++ /dev/null @@ -1,181 +0,0 @@ -import pathlib -from moto import mock_s3 -from .utils import create_bucket -from allensdk.api.cloud_cache.cloud_cache import S3CloudCache - - -@mock_s3 -def test_summarize_comparison(tmpdir, example_datasets_with_metadata): - """ - Test that CloudCacheBase.summarize_comparison reports the correct - changes when comparing two manifests - """ - bucket_name = 'summarizing_bucket' - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=example_datasets_with_metadata['metadata']) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v2.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 1 - assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v3.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 1 - assert ('data/f2.txt', - 'data/f2.txt renamed data/f4.txt') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v4.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 1 - assert ('data/f3.txt', 'data/f3.txt changed') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v5.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 1 - assert ('data/f4.txt', 'data/f4.txt created') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v6.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 2 - assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] - assert ('data/f1.txt', 'data/f1.txt changed') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v7.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 2 - assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] - assert ('data/f3.txt', 'data/f3.txt ' - 'renamed data/f5.txt') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v8.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 2 - assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] - assert ('data/f5.txt', 'data/f5.txt created') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v9.0.0.json') - - assert len(log['metadata_changes']) == 0 - assert len(log['data_changes']) == 2 - assert ('data/f3.txt', 'data/f3.txt renamed ' - 'data/f4.txt') in log['data_changes'] - assert ('data/f5.txt', 'data/f5.txt created') in log['data_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v10.0.0.json') - - assert len(log['data_changes']) == 0 - assert len(log['metadata_changes']) == 1 - assert ('project_metadata/metadata_2.csv', - 'project_metadata/metadata_2.csv ' - 'deleted') in log['metadata_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v11.0.0.json') - - assert len(log['data_changes']) == 0 - assert len(log['metadata_changes']) == 1 - assert ('project_metadata/metadata_2.csv', - 'project_metadata/metadata_2.csv renamed ' - 'project_metadata/metadata_4.csv') in log['metadata_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v12.0.0.json') - - assert len(log['data_changes']) == 0 - assert len(log['metadata_changes']) == 1 - assert ('project_metadata/metadata_3.csv', - 'project_metadata/metadata_3.csv ' - 'changed') in log['metadata_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v13.0.0.json') - - assert len(log['data_changes']) == 0 - assert len(log['metadata_changes']) == 1 - assert ('project_metadata/metadata_4.csv', - 'project_metadata/metadata_4.csv ' - 'created') in log['metadata_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v14.0.0.json') - assert len(log['data_changes']) == 1 - assert len(log['metadata_changes']) == 1 - assert ('data/f2.txt', 'data/f2.txt deleted') in log['data_changes'] - assert ('project_metadata/metadata_3.csv', - 'project_metadata/metadata_3.csv renamed ' - 'project_metadata/metadata_4.csv') in log['metadata_changes'] - - log = cache.summarize_comparison('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v15.0.0.json') - assert len(log['data_changes']) == 3 - assert len(log['metadata_changes']) == 3 - - ans1 = ('data/f1.txt', 'data/f1.txt renamed data/f4.txt') - ans2 = ('data/f5.txt', 'data/f5.txt created') - ans3 = ('data/f6.txt', 'data/f6.txt created') - - assert set(log['data_changes']) == {ans1, ans2, ans3} - - ans1 = ('project_metadata/metadata_2.csv', - 'project_metadata/metadata_2.csv renamed ' - 'project_metadata/metadata_4.csv') - ans2 = ('project_metadata/metadata_1.csv', - 'project_metadata/metadata_1.csv deleted') - ans3 = ('project_metadata/metadata_3.csv', - 'project_metadata/metadata_3.csv deleted') - - assert set(log['metadata_changes']) == {ans1, ans2, ans3} - - -@mock_s3 -@mock_s3 -def test_compare_manifesst_string(tmpdir, example_datasets_with_metadata): - """ - Test that CloudCacheBase.compare_manifests reports the correct - changes when comparing two manifests - """ - bucket_name = 'compare_manifest_bucket' - create_bucket(bucket_name, - example_datasets_with_metadata['data'], - metadatasets=example_datasets_with_metadata['metadata']) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - msg = cache.compare_manifests('project-x_manifest_v1.0.0.json', - 'project-x_manifest_v15.0.0.json') - - expected = 'Changes going from\n' - expected += 'project-x_manifest_v1.0.0.json\n' - expected += 'to\n' - expected += 'project-x_manifest_v15.0.0.json\n\n' - expected += 'project_metadata/metadata_1.csv deleted\n' - expected += 'project_metadata/metadata_2.csv renamed ' - expected += 'project_metadata/metadata_4.csv\n' - expected += 'project_metadata/metadata_3.csv deleted\n' - expected += 'data/f1.txt renamed data/f4.txt\n' - expected += 'data/f5.txt created\n' - expected += 'data/f6.txt created\n' - - assert msg == expected diff --git a/allensdk/test/api/cloud_cache/test_file_attributes.py b/allensdk/test/api/cloud_cache/test_file_attributes.py deleted file mode 100644 index f3af08221f..0000000000 --- a/allensdk/test/api/cloud_cache/test_file_attributes.py +++ /dev/null @@ -1,73 +0,0 @@ -import platform -import pytest -import pathlib -from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 - - -def test_cache_file_attributes(): - attr = CacheFileAttributes(url='http://my/url', - version_id='aaabbb', - file_hash='12345', - local_path=pathlib.Path('/my/local/path')) - - assert attr.url == 'http://my/url' - assert attr.version_id == 'aaabbb' - assert attr.file_hash == '12345' - assert attr.local_path == pathlib.Path('/my/local/path') - - # test that the correct ValueErrors are raised - # when you pass invalid arguments - - with pytest.raises(ValueError) as context: - attr = CacheFileAttributes(url=5.0, - version_id='aaabbb', - file_hash='12345', - local_path=pathlib.Path('/my/local/path')) - - msg = "url must be str; got <class 'float'>" - assert context.value.args[0] == msg - - with pytest.raises(ValueError) as context: - attr = CacheFileAttributes(url='http://my/url/', - version_id=5.0, - file_hash='12345', - local_path=pathlib.Path('/my/local/path')) - - msg = "version_id must be str; got <class 'float'>" - assert context.value.args[0] == msg - - with pytest.raises(ValueError) as context: - attr = CacheFileAttributes(url='http://my/url/', - version_id='aaabbb', - file_hash=5.0, - local_path=pathlib.Path('/my/local/path')) - - msg = "file_hash must be str; got <class 'float'>" - assert context.value.args[0] == msg - - with pytest.raises(ValueError) as context: - attr = CacheFileAttributes(url='http://my/url/', - version_id='aaabbb', - file_hash='12345', - local_path='/my/local/path') - - msg = "local_path must be pathlib.Path; got <class 'str'>" - assert context.value.args[0] == msg - - -def test_str(): - """ - Test the string representation of CacheFileParameters - """ - attr = CacheFileAttributes(url='http://my/url', - version_id='aaabbb', - file_hash='12345', - local_path=pathlib.Path('/my/local/path')) - - s = f'{attr}' - assert "CacheFileParameters{" in s - assert '"file_hash": "12345"' in s - assert '"url": "http://my/url"' in s - assert '"version_id": "aaabbb"' in s - if platform.system().lower() != 'windows': - assert '"local_path": "/my/local/path"' in s diff --git a/allensdk/test/api/cloud_cache/test_full_process.py b/allensdk/test/api/cloud_cache/test_full_process.py deleted file mode 100644 index 8f8be62f2d..0000000000 --- a/allensdk/test/api/cloud_cache/test_full_process.py +++ /dev/null @@ -1,261 +0,0 @@ -import pytest -import json -import pathlib -import hashlib -import pandas as pd -import io -import boto3 -from moto import mock_s3 -from allensdk.api.cloud_cache.cloud_cache import S3CloudCache - - -@mock_s3 -def test_full_cache_system(tmpdir): - """ - Test the process of loading different versions of the same dataset, - each of which involve different versions of files - """ - - test_bucket_name = 'full_cache_bucket' - - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # turn on bucket versioning - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - s3_client = boto3.client('s3', region_name='us-east-1') - - # generate data and expected hashes - - true_hashes = {} - version_id_lookup = {} - - data1_v1 = b'12345678' - data1_v2 = b'45678901' - data2_v1 = b'abcdefghijk' - data2_v2 = b'lmnopqrstuv' - data3_v1 = b'jklmnopqrst' - - metadata1_v1 = pd.DataFrame({'mouse': [1, 2, 3], - 'sex': ['F', 'F', 'M']}) - - metadata2_v1 = pd.DataFrame({'experiment': [5, 6, 7], - 'file_id': ['data1', 'data2', 'data3']}) - - metadata1_v2 = pd.DataFrame({'mouse': [8, 9, 0], - 'sex': ['M', 'F', 'M']}) - - v1_hashes = {} - for data, key in zip((data1_v1, data2_v1, data3_v1), - ('data1', 'data2', 'data3')): - - hasher = hashlib.blake2b() - hasher.update(data) - v1_hashes[key] = hasher.hexdigest() - s3_client.put_object(Bucket=test_bucket_name, - Key=f'proj/data/{key}', - Body=data) - - for df, key in zip((metadata1_v1, metadata2_v1), - ('proj/metadata1.csv', 'proj/metadata2.csv')): - - with io.StringIO() as stream: - df.to_csv(stream, index=False) - stream.seek(0) - data = bytes(stream.read(), 'utf-8') - - hasher = hashlib.blake2b() - hasher.update(data) - v1_hashes[key.replace('proj/', '')] = hasher.hexdigest() - s3_client.put_object(Bucket=test_bucket_name, - Key=key, - Body=data) - - true_hashes['v1'] = v1_hashes - v1_version_id = {} - response = s3_client.list_object_versions(Bucket=test_bucket_name) - for v in response['Versions']: - vkey = v['Key'].replace('proj/', '').replace('data/', '') - v1_version_id[vkey] = v['VersionId'] - - version_id_lookup['v1'] = v1_version_id - - v2_hashes = {} - v2_version_id = {} - for data, key in zip((data1_v2, data2_v2), - ('data1', 'data2')): - - hasher = hashlib.blake2b() - hasher.update(data) - v2_hashes[key] = hasher.hexdigest() - s3_client.put_object(Bucket=test_bucket_name, - Key=f'proj/data/{key}', - Body=data) - - s3_client.delete_object(Bucket=test_bucket_name, - Key='proj/data/data3') - - with io.StringIO() as stream: - metadata1_v2.to_csv(stream, index=False) - stream.seek(0) - data = bytes(stream.read(), 'utf-8') - - hasher = hashlib.blake2b() - hasher.update(data) - v2_hashes['metadata1.csv'] = hasher.hexdigest() - s3_client.put_object(Bucket=test_bucket_name, - Key='proj/metadata1.csv', - Body=data) - - s3_client.delete_object(Bucket=test_bucket_name, - Key='proj/metadata2.csv') - - true_hashes['v2'] = v2_hashes - v2_version_id = {} - response = s3_client.list_object_versions(Bucket=test_bucket_name) - for v in response['Versions']: - if not v['IsLatest']: - continue - vkey = v['Key'].replace('proj/', '').replace('data/', '') - v2_version_id[vkey] = v['VersionId'] - version_id_lookup['v2'] = v2_version_id - - # check thata data3 and metadata2.csv do not occur in v2 of - # the dataset, but other data/metadata files do - - assert 'data3' in version_id_lookup['v1'] - assert 'data3' not in version_id_lookup['v2'] - assert 'data1' in version_id_lookup['v1'] - assert 'data2' in version_id_lookup['v1'] - assert 'data1' in version_id_lookup['v2'] - assert 'data2' in version_id_lookup['v2'] - assert 'metadata1.csv' in version_id_lookup['v1'] - assert 'metadata2.csv' in version_id_lookup['v1'] - assert 'metadata1.csv' in version_id_lookup['v2'] - assert 'metadata2.csv' not in version_id_lookup['v2'] - - # build manifests - - manifest_1 = {} - manifest_1['manifest_version'] = 'A' - manifest_1['project_name'] = "project-A1" - manifest_1['metadata_file_id_column_name'] = 'file_id' - manifest_1['data_pipeline'] = 'placeholder' - data_files_1 = {} - for k in ('data1', 'data2', 'data3'): - obj = {} - obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/data/{k}' # noqa: E501 - obj['file_hash'] = true_hashes['v1'][k] - obj['version_id'] = version_id_lookup['v1'][k] - data_files_1[k] = obj - manifest_1['data_files'] = data_files_1 - metadata_files_1 = {} - for k in ('metadata1.csv', 'metadata2.csv'): - obj = {} - obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/{k}' - obj['file_hash'] = true_hashes['v1'][k] - obj['version_id'] = version_id_lookup['v1'][k] - metadata_files_1[k] = obj - manifest_1['metadata_files'] = metadata_files_1 - - manifest_2 = {} - manifest_2['manifest_version'] = 'B' - manifest_2['project_name'] = "project-B2" - manifest_2['metadata_file_id_column_name'] = 'file_id' - manifest_2['data_pipeline'] = 'placeholder' - data_files_2 = {} - for k in ('data1', 'data2'): - obj = {} - obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/data/{k}' # noqa: E501 - obj['file_hash'] = true_hashes['v2'][k] - obj['version_id'] = version_id_lookup['v2'][k] - data_files_2[k] = obj - manifest_2['data_files'] = data_files_2 - metadata_files_2 = {} - for k in ['metadata1.csv']: - obj = {} - obj['url'] = f'http://{test_bucket_name}.s3.amazonaws.com/proj/{k}' - obj['file_hash'] = true_hashes['v2'][k] - obj['version_id'] = version_id_lookup['v2'][k] - metadata_files_2[k] = obj - manifest_2['metadata_files'] = metadata_files_2 - - s3_client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v1.0.0.json', - Body=bytes(json.dumps(manifest_1), 'utf-8')) - - s3_client.put_object(Bucket=test_bucket_name, - Key='proj/manifests/manifest_v2.0.0.json', - Body=bytes(json.dumps(manifest_2), 'utf-8')) - - # Use S3CloudCache to interact with dataset - cache_dir = pathlib.Path(tmpdir) / 'my/test/cache' - cache = S3CloudCache(cache_dir, test_bucket_name, 'proj') - - # load the first version of the dataset - - cache.load_manifest('manifest_v1.0.0.json') - assert cache.version == 'A' - - # check that metadata dataframes have expected contents - m1 = cache.get_metadata('metadata1.csv') - assert metadata1_v1.equals(m1) - m2 = cache.get_metadata('metadata2.csv') - assert metadata2_v1.equals(m2) - - # check that data files have expected hashes - for k in ('data1', 'data2', 'data3'): - - attr = cache.data_path(k) - assert not attr['exists'] - - local_path = cache.download_data(k) - assert local_path.exists() - hasher = hashlib.blake2b() - with open(local_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_hashes['v1'][k] - - attr = cache.data_path(k) - assert attr['exists'] - - # now load the second version of the dataset - - cache.load_manifest('manifest_v2.0.0.json') - assert cache.version == 'B' - - # metadata2.csv should not exist in this version of the dataset - with pytest.raises(ValueError) as context: - cache.get_metadata('metadata2.csv') - assert 'is not in self.metadata_file_names' in context.value.args[0] - - # check that metadata1 has expected contents - m1 = cache.get_metadata('metadata1.csv') - assert metadata1_v2.equals(m1) - - # data3 should not exist in this version of the dataset - with pytest.raises(ValueError) as context: - _ = cache.download_data('data3') - assert 'not a data file listed' in context.value.args[0] - - with pytest.raises(ValueError) as context: - _ = cache.data_path('data3') - assert 'not a data file listed' in context.value.args[0] - - # check that data1, data2 have expected hashes - for k in ('data1', 'data2'): - attr = cache.data_path(k) - assert not attr['exists'] - - local_path = cache.download_data(k) - assert local_path.exists() - hasher = hashlib.blake2b() - with open(local_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_hashes['v2'][k] - - attr = cache.data_path(k) - assert attr['exists'] diff --git a/allensdk/test/api/cloud_cache/test_local_cache.py b/allensdk/test/api/cloud_cache/test_local_cache.py deleted file mode 100644 index 211c5c4641..0000000000 --- a/allensdk/test/api/cloud_cache/test_local_cache.py +++ /dev/null @@ -1,50 +0,0 @@ -import pathlib -from moto import mock_s3 -from .utils import create_bucket -from allensdk.api.cloud_cache.cloud_cache import S3CloudCache -from allensdk.api.cloud_cache.cloud_cache import LocalCache - - -@mock_s3 -def test_local_cache_file_access(tmpdir, example_datasets): - """ - Create a cache; download some, but not all of the files - with S3CloudCache; verify that we can access the files - with LocalCache - """ - - bucket_name = 'local_cache_bucket' - create_bucket(bucket_name, example_datasets) - cache_dir = pathlib.Path(tmpdir) / 'cache' - cloud_cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - cloud_cache.load_manifest('project-x_manifest_v1.0.0.json') - cloud_cache.download_data('1') - cloud_cache.download_data('3') - - cloud_cache.load_manifest('project-x_manifest_v3.0.0.json') - cloud_cache.download_data('2') - - del cloud_cache - - local_cache = LocalCache(cache_dir, 'project-x') - - manifest_set = set(local_cache.manifest_file_names) - assert manifest_set == {'project-x_manifest_v1.0.0.json', - 'project-x_manifest_v3.0.0.json'} - - local_cache.load_manifest('project-x_manifest_v1.0.0.json') - attr = local_cache.data_path('1') - assert attr['exists'] - attr = local_cache.data_path('2') - assert not attr['exists'] - attr = local_cache.data_path('3') - assert attr['exists'] - - local_cache.load_manifest('project-x_manifest_v3.0.0.json') - attr = local_cache.data_path('1') - assert attr['exists'] # because file 1 is the same in v1.0 and v3.0 - attr = local_cache.data_path('2') - assert attr['exists'] - attr = local_cache.data_path('3') - assert not attr['exists'] diff --git a/allensdk/test/api/cloud_cache/test_manifest.py b/allensdk/test/api/cloud_cache/test_manifest.py deleted file mode 100644 index b7f44a97d5..0000000000 --- a/allensdk/test/api/cloud_cache/test_manifest.py +++ /dev/null @@ -1,173 +0,0 @@ -import pytest -import json -import pathlib -from allensdk.internal.core.lims_utilities import safe_system_path -from allensdk.api.cloud_cache.manifest import Manifest -from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 - - -@pytest.fixture -def meta_json_path(tmpdir): - jpath = tmpdir / "somejson.json" - d = { - "project_name": "X", - "manifest_version": "Y", - "metadata_file_id_column_name": "Z", - "data_pipeline": "ZA", - "metadata_files": ["ZB", "ZC", "ZD"], - "data_files": {"AB": "ab", "BC": "bc", "CD": "cd"}} - with open(jpath, "w") as f: - json.dump(d, f) - yield jpath - - -def test_constructor(meta_json_path): - """ - Make sure that the Manifest class __init__ runs and - raises an error if you give it an unexpected cache_dir - """ - Manifest('my/cache/dir', meta_json_path) - Manifest(pathlib.Path('my/other/cache/dir'), meta_json_path) - with pytest.raises(ValueError, match=r"cache_dir must be either a str.*"): - Manifest(1234.2, meta_json_path) - - -def test_create_file_attributes(meta_json_path): - """ - Test that Manifest._create_file_attributes correctly - handles input parameters (this is mostly a test of - local_path generation) - """ - mfest = Manifest('/my/cache/dir', meta_json_path) - attr = mfest._create_file_attributes('http://my.url.com/path/to/file.txt', - '12345', - 'aaabbbcccddd') - - assert isinstance(attr, CacheFileAttributes) - assert attr.url == 'http://my.url.com/path/to/file.txt' - assert attr.version_id == '12345' - assert attr.file_hash == 'aaabbbcccddd' - expected_path = '/my/cache/dir/X-Y/to/file.txt' - assert attr.local_path == pathlib.Path(expected_path).resolve() - - -@pytest.fixture -def manifest_for_metadata(tmpdir): - jpath = tmpdir / "a_manifest.json" - manifest = {} - metadata_files = {} - metadata_files['a.txt'] = {'url': 'http://my.url.com/path/to/a.txt', - 'version_id': '12345', - 'file_hash': 'abcde'} - metadata_files['b.txt'] = {'url': 'http://my.other.url.com/different/path/to/b.txt', # noqa: E501 - 'version_id': '67890', - 'file_hash': 'fghijk'} - - manifest['metadata_files'] = metadata_files - manifest['data_files'] = {} - manifest['project_name'] = "some-project" - manifest['manifest_version'] = '000' - manifest['metadata_file_id_column_name'] = 'file_id' - manifest['data_pipeline'] = 'placeholder' - with open(jpath, "w") as f: - json.dump(manifest, f) - yield jpath - - -def test_metadata_file_attributes(manifest_for_metadata): - """ - Test that Manifest.metadata_file_attributes returns the - correct CacheFileAttributes object and raises the correct - error when you ask for a metadata file that does not exist - """ - - mfest = Manifest('/my/cache/dir/', manifest_for_metadata) - - a_obj = mfest.metadata_file_attributes('a.txt') - assert a_obj.url == 'http://my.url.com/path/to/a.txt' - assert a_obj.version_id == '12345' - assert a_obj.file_hash == 'abcde' - expected = safe_system_path('/my/cache/dir/some-project-000/to/a.txt') - expected = pathlib.Path(expected).resolve() - assert a_obj.local_path == expected - - b_obj = mfest.metadata_file_attributes('b.txt') - assert b_obj.url == 'http://my.other.url.com/different/path/to/b.txt' - assert b_obj.version_id == '67890' - assert b_obj.file_hash == 'fghijk' - expected = safe_system_path('/my/cache/dir/some-project-000/path/to/b.txt') - expected = pathlib.Path(expected).resolve() - assert b_obj.local_path == expected - - # test that the correct error is raised when you ask - # for a metadata file that does not exist - - with pytest.raises(ValueError) as context: - _ = mfest.metadata_file_attributes('c.txt') - msg = "c.txt\nis not in self.metadata_file_names" - assert msg in context.value.args[0] - - -@pytest.fixture -def manifest_with_data(tmpdir): - jpath = tmpdir / "manifest_with files.json" - manifest = {} - manifest['metadata_files'] = {} - manifest['manifest_version'] = '0' - manifest['project_name'] = "myproject" - manifest['metadata_file_id_column_name'] = 'file_id' - manifest['data_pipeline'] = 'placeholder' - data_files = {} - data_files['a'] = {'url': 'http://my.url.com/myproject/path/to/a.nwb', - 'version_id': '12345', - 'file_hash': 'abcde'} - data_files['b'] = {'url': 'http://my.other.url.com/different/path/b.nwb', - 'version_id': '67890', - 'file_hash': 'fghijk'} - manifest['data_files'] = data_files - with open(jpath, "w") as f: - json.dump(manifest, f) - yield jpath - - -def test_data_file_attributes(manifest_with_data): - """ - Test that Manifest.data_file_attributes returns the correct - CacheFileAttributes object and raises the correct error when - you ask for a data file that does not exist - """ - mfest = Manifest('/my/cache/dir', manifest_with_data) - - a_obj = mfest.data_file_attributes('a') - assert a_obj.url == 'http://my.url.com/myproject/path/to/a.nwb' - assert a_obj.version_id == '12345' - assert a_obj.file_hash == 'abcde' - expected = safe_system_path('/my/cache/dir/myproject-0/path/to/a.nwb') - assert a_obj.local_path == pathlib.Path(expected).resolve() - - b_obj = mfest.data_file_attributes('b') - assert b_obj.url == 'http://my.other.url.com/different/path/b.nwb' - assert b_obj.version_id == '67890' - assert b_obj.file_hash == 'fghijk' - expected = safe_system_path('/my/cache/dir/myproject-0/path/b.nwb') - assert b_obj.local_path == pathlib.Path(expected).resolve() - - with pytest.raises(ValueError) as context: - _ = mfest.data_file_attributes('c') - msg = "file_id: c\nIs not a data file listed in manifest:" - assert msg in context.value.args[0] - - -def test_file_attribute_errors(meta_json_path): - """ - Test that Manifest raises the correct error if you try to get file - attributes before loading a manifest.json - """ - mfest = Manifest("/my/cache/dir", meta_json_path) - with pytest.raises(ValueError, - match=r".* not in self.metadata_file_names"): - mfest.metadata_file_attributes('some_file.txt') - - with pytest.raises(ValueError, - match=r".* not a data file listed in manifest"): - mfest.data_file_attributes('other_file.txt') diff --git a/allensdk/test/api/cloud_cache/test_smart_download.py b/allensdk/test/api/cloud_cache/test_smart_download.py deleted file mode 100644 index ef6f939eaf..0000000000 --- a/allensdk/test/api/cloud_cache/test_smart_download.py +++ /dev/null @@ -1,523 +0,0 @@ -import pytest -import json -import hashlib -import pathlib -from moto import mock_s3 -from .utils import create_bucket -from allensdk.api.cloud_cache.cloud_cache import MissingLocalManifestWarning -from allensdk.api.cloud_cache.cloud_cache import S3CloudCache, LocalCache -from allensdk.api.cloud_cache.file_attributes import CacheFileAttributes # noqa: E501 - - -@mock_s3 -def test_smart_file_downloading(tmpdir, example_datasets): - """ - Test that the CloudCache is smart enough to build symlinks - where possible - """ - test_bucket_name = 'smart_download_bucket' - create_bucket(test_bucket_name, - example_datasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, test_bucket_name, 'project-x') - - # download all data files from all versions, keeping track - # of the paths to the downloaded data files - downloaded = {} - for version in ('1.0.0', '2.0.0', '3.0.0'): - downloaded[version] = {} - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in ('1', '2', '3'): - downloaded[version][file_id] = cache.download_data(file_id) - - # check that the version 1.0.0 of all files are actual files - for file_id in ('1', '2', '3'): - assert downloaded['1.0.0'][file_id].is_file() - assert not downloaded['1.0.0'][file_id].is_symlink() - - # check that v2.0.0 f1.txt is a new file - assert downloaded['2.0.0']['1'].is_file() - assert not downloaded['2.0.0']['1'].is_symlink() - - # check that v2.0.0 f2.txt and f3.txt are symlinks to - # the correct v1.0.0 files - for file_id in ('2', '3'): - assert downloaded['2.0.0'][file_id].is_file() - assert downloaded['2.0.0'][file_id].is_symlink() - - # check that symlink points to the correct file - test = downloaded['2.0.0'][file_id].resolve() - control = downloaded['1.0.0'][file_id].resolve() - if test != control: - test = downloaded['2.0.0'][file_id].resolve() - control = downloaded['1.0.0'][file_id].resolve() - raise RuntimeError(f'{test} != {control}\n' - 'even though the first is a symlink') - - # check that the absolute paths of the files are different, - # even though one is a symlink - test = downloaded['2.0.0'][file_id].absolute() - control = downloaded['1.0.0'][file_id].absolute() - if test == control: - test = downloaded['2.0.0'][file_id].absolute() - control = downloaded['1.0.0'][file_id].absolute() - raise RuntimeError(f'{test} == {control}\n' - 'even though they should be ' - 'different absolute paths') - - # repeat the above tests for v3.0.0, f1.txt - assert downloaded['3.0.0']['1'].is_file() - assert downloaded['3.0.0']['1'].is_symlink() - - res3 = downloaded['3.0.0']['1'].resolve() - res1 = downloaded['1.0.0']['1'].resolve() - if res3 != res1: - test = downloaded['3.0.0']['1'].resolve() - control = downloaded['1.0.0']['1'].resolve() - raise RuntimeError(f'{test} != {control}\n' - 'even though the first is a symlink') - - abs3 = downloaded['3.0.0']['1'].absolute() - abs1 = downloaded['1.0.0']['1'].absolute() - if abs3 == abs1: - test = downloaded['3.0.0']['1'].absolute() - control = downloaded['1.0.0']['1'].absolute() - raise RuntimeError(f'{test} == {control}\n' - 'even though they should be ' - 'different absolute paths') - - # check that v3 v2.txt and f3.txt are not symlinks - assert downloaded['3.0.0']['2'].is_file() - assert not downloaded['3.0.0']['2'].is_symlink() - assert downloaded['3.0.0']['3'].is_file() - assert not downloaded['3.0.0']['3'].is_symlink() - - -@mock_s3 -def test_on_corrupted_files(tmpdir, example_datasets): - """ - Test that the CloudCache re-downloads files when they have been - corrupted - """ - bucket_name = 'corruption_bucket' - create_bucket(bucket_name, - example_datasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - version_list = ('1.0.0', '2.0.0', '3.0.0') - file_id_list = ('1', '2', '3') - - for version in version_list: - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in file_id_list: - cache.download_data(file_id) - - # make sure that all files exist - for version in version_list: - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in file_id_list: - attr = cache.data_path(file_id) - assert attr['exists'] - - hasher = hashlib.blake2b() - hasher.update(b'4567890') - true_hash = hasher.hexdigest() - - # Check that, when a file on disk gets removed, - # all of the symlinks that point back to that file - # get marked as `not exists` - - cache.load_manifest('project-x_manifest_v1.0.0.json') - attr = cache.data_path('2') - attr['local_path'].unlink() - - attr = cache.data_path('2') - assert not attr['exists'] - - # note that v0.2.0/f2.txt is identical to v0.1.0/f2.txt - # in the example data set - cache.load_manifest('project-x_manifest_v2.0.0.json') - attr = cache.data_path('2') - assert not attr['exists'] - - # re-download one of the identical files, and verify - # that both datasets are restored - cache.download_data('2') - attr = cache.data_path('2') - assert attr['exists'] - redownloaded_path = attr['local_path'] - - cache.load_manifest('project-x_manifest_v1.0.0.json') - attr = cache.data_path('2') - assert attr['exists'] - other_path = attr['local_path'] - - hasher = hashlib.blake2b() - with open(other_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_hash - - # The file is downloaded to other_path because that was - # the first path originally downloaded and stored - # in CloudCache._downloaded_data_path - - assert other_path.resolve() == redownloaded_path.resolve() - assert other_path.absolute() != redownloaded_path.absolute() - - -@mock_s3 -def test_on_removed_files(tmpdir, example_datasets): - """ - Test that the CloudCache re-downloads files when the - the files at the root of the symlinks have been removed - """ - bucket_name = 'corruption_bucket' - create_bucket(bucket_name, - example_datasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - version_list = ('1.0.0', '2.0.0', '3.0.0') - file_id_list = ('1', '2', '3') - - for version in version_list: - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in file_id_list: - cache.download_data(file_id) - - # make sure that all files exist - for version in version_list: - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in file_id_list: - attr = cache.data_path(file_id) - assert attr['exists'] - - hasher = hashlib.blake2b() - hasher.update(b'4567890') - true_hash = hasher.hexdigest() - - p1 = cache_dir / 'project-x-1.0.0' / 'data' / 'f2.txt' - p2 = cache_dir / 'project-x-2.0.0' / 'data' / 'f2.txt' - - # note that f2.txt is identical between v 1.0.0 and 2.0.0 - assert p1.is_file() - assert not p1.is_symlink() - assert p2.is_symlink() - assert p1.resolve() == p2.resolve() - - # remove p1 - p1.unlink() - assert not p1.exists() - assert not p1.is_file() - assert not p2.is_file() - assert p2.is_symlink() - - # make sure that the file which has been moved is now - # marked as not existing - cache.load_manifest('project-x_manifest_v1.0.0.json') - test_path = cache.data_path('2') - assert not test_path['exists'] - - cache.load_manifest('project-x_manifest_v2.0.0.json') - test_path = cache.data_path('2') - assert not test_path['exists'] - - # now, re-download the data by way of manifest 2 - # and verify that the symlink relationship is - # re-established - p2 = cache.download_data('2') - assert p2.is_file() - assert p2.is_symlink() # because the symlink was not removed - - cache.load_manifest('project-x_manifest_v1.0.0.json') - p1 = cache.download_data('2') - - assert p1.is_file() - assert not p1.is_symlink() - assert p1.resolve() == p2.resolve() - assert p1.absolute() != p2.absolute() - - hasher = hashlib.blake2b() - with open(p2, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_hash - - -@mock_s3 -def test_on_removed_symlinks(tmpdir, example_datasets): - """ - Test that the CloudCache re-downloads files when the - the symlinks have been removed - """ - bucket_name = 'corruption_bucket' - create_bucket(bucket_name, - example_datasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - version_list = ('1.0.0', '2.0.0', '3.0.0') - file_id_list = ('1', '2', '3') - - for version in version_list: - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in file_id_list: - cache.download_data(file_id) - - # make sure that all files exist - for version in version_list: - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in file_id_list: - attr = cache.data_path(file_id) - assert attr['exists'] - - hasher = hashlib.blake2b() - hasher.update(b'4567890') - true_hash = hasher.hexdigest() - - p1 = cache_dir / 'project-x-1.0.0' / 'data' / 'f2.txt' - p2 = cache_dir / 'project-x-2.0.0' / 'data' / 'f2.txt' - - # note that f2.txt is identical between v 1.0.0 and 2.0.0 - assert p1.is_file() - assert not p1.is_symlink() - assert p2.is_symlink() - assert p1.resolve() == p2.resolve() - - # remove symlink at p2 and show that the file - # still exists (and that the symlink gets restored - # once you ask for the file path) - p2.unlink() - assert not p2.exists() - assert not p2.is_symlink() - assert p1.is_file() - - cache.load_manifest('project-x_manifest_v2.0.0.json') - test_path = cache.data_path('2') - assert test_path['exists'] - p2 = pathlib.Path(test_path['local_path']) - assert p2.is_symlink() - assert p2.exists() - assert p1.absolute() != p2.absolute() - assert p1.resolve() == p2.resolve() - - hasher = hashlib.blake2b() - with open(p2, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == true_hash - - -@mock_s3 -def test_corrupted_download_manifest(tmpdir, example_datasets): - """ - Test that CloudCache can handle the case where the - _downloaded_data_path dict gets corrupted - """ - bucket_name = 'manifest_corruption_bucket' - create_bucket(bucket_name, - example_datasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - cache = S3CloudCache(cache_dir, bucket_name, 'project-x') - - version_list = ('1.0.0', '2.0.0', '3.0.0') - file_id_list = ('1', '2', '3') - - for version in version_list: - cache.load_manifest(f'project-x_manifest_v{version}.json') - for file_id in file_id_list: - cache.download_data(file_id) - - with open(cache._downloaded_data_path, 'rb') as in_file: - src_data = json.load(in_file) - - # write a corrupted downloaded_data_path - for k in src_data: - src_data[k] = '' - with open(cache._downloaded_data_path, 'w') as out_file: - out_file.write(json.dumps(src_data, indent=2)) - - hasher = hashlib.blake2b() - hasher.update(b'4567890') - true_hash = hasher.hexdigest() - - cache.load_manifest('project-x_manifest_v1.0.0.json') - attr = cache.data_path('2') - - # assert below will pass; because file exists and is not yet corrupted, - # CloudCache won't consult _downloaded_data_path - assert attr['exists'] - - # now remove one of the data files - attr['local_path'].unlink() - - # now that the file is corrupted, 'exists' is False - attr = cache.data_path('2') - assert not attr['exists'] - - # note that v0.2.0/f2.txt is identical to v0.1.0/f2.txt - cache.load_manifest('project-x_manifest_v2.0.0.json') - attr = cache.data_path('2') - assert not attr['exists'] - - # re download the file - cache.download_data('2') - attr = cache.data_path('2') - downloaded_path = attr['local_path'] - - assert attr['exists'] - hasher = hashlib.blake2b() - with open(attr['local_path'], 'rb') as in_file: - hasher.update(in_file.read()) - test_hash = hasher.hexdigest() - assert test_hash == true_hash - - # check that the v0.1.0 version of the file, which should be - # identical to the v0.2.0 version of the file, is also - # fixed - cache.load_manifest('project-x_manifest_v1.0.0.json') - attr = cache.data_path('2') - assert attr['exists'] - assert attr['local_path'].resolve() == downloaded_path.resolve() - assert attr['local_path'].absolute() != downloaded_path.absolute() - - -@mock_s3 -def test_reconstruction_of_local_manifest(tmpdir): - """ - Test that, if _downloaded_data.json gets lost, it can be reconstructed - so that the CloudCache does not automatically download new copies of files - """ - - # define a cache class that cannot download from S3 - class DummyCache(S3CloudCache): - def _download_file(self, file_attributes: CacheFileAttributes): - if not self._file_exists(file_attributes): - raise RuntimeError("Cannot download files") - return True - - # first two versions of dataset are identical; - # third differs - example_data = {} - example_data['1.0.0'] = {} - example_data['1.0.0']['f1.txt'] = {'file_id': '1', 'data': b'abc'} - example_data['1.0.0']['f2.txt'] = {'file_id': '2', 'data': b'def'} - - example_data['2.0.0'] = {} - example_data['2.0.0']['f1.txt'] = {'file_id': '1', 'data': b'abc'} - example_data['2.0.0']['f2.txt'] = {'file_id': '2', 'data': b'def'} - - example_data['3.0.0'] = {} - example_data['3.0.0']['f1.txt'] = {'file_id': '1', 'data': b'tuv'} - example_data['3.0.0']['f2.txt'] = {'file_id': '2', 'data': b'wxy'} - - test_bucket_name = 'cache_from_scratch_bucket' - create_bucket(test_bucket_name, - example_data) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - - # read in v1.0.0 data files using normal S3 cache class - with pytest.warns(None) as warnings: - cache = S3CloudCache(cache_dir, test_bucket_name, 'project-x') - - # make sure no MissingLocalManifestWarnings were raised - w_type = 'MissingLocalManifestWarning' - for w in warnings.list: - if w._category_name == w_type: - msg = 'Raised MissingLocalManifestWarning on empty ' - msg += 'cache dir' - assert False, msg - - expected_hash = {} - cache.load_manifest('project-x_manifest_v1.0.0.json') - for file_id in ('1', '2'): - local_path = cache.download_data(file_id) - hasher = hashlib.blake2b() - with open(local_path, 'rb') as in_file: - hasher.update(in_file.read()) - expected_hash[file_id] = hasher.hexdigest() - - # load the other manifests, so DummyCache can get it - cache.load_manifest('project-x_manifest_v2.0.0.json') - cache.load_manifest('project-x_manifest_v3.0.0.json') - - # delete the JSON file that maps local path to file hash - lookup_path = cache._downloaded_data_path - assert lookup_path.exists() - lookup_path.unlink() - assert not lookup_path.exists() - - del cache - - # Reload the data using the cache class that cannot download - # files. Verify that paths to files with the correct hashes - # are returned. This will mean that the local manifest mapping - # filename to file hash was correctly reconstructed. - with pytest.warns(MissingLocalManifestWarning) as warnings: - dummy = DummyCache(cache_dir, test_bucket_name, 'project-x') - - dummy.construct_local_manifest() - - dummy.load_manifest('project-x_manifest_v2.0.0.json') - for file_id in ('1', '2'): - local_path = dummy.download_data(file_id) - hasher = hashlib.blake2b() - with open(local_path, 'rb') as in_file: - hasher.update(in_file.read()) - assert hasher.hexdigest() == expected_hash[file_id] - - # make sure that dummy really is unable to download by trying - # (and failing) to get data from v3.0.0 - dummy.load_manifest('project-x_manifest_v3.0.0.json') - with pytest.raises(RuntimeError): - dummy.download_data('1') - - -@mock_s3 -def test_local_cache_symlink(tmpdir, example_datasets): - """ - Test that a LocalCache is smart enough to construct - a symlink where appropriate - """ - test_bucket_name = 'local_cache_test_bucket' - create_bucket(test_bucket_name, - example_datasets) - - cache_dir = pathlib.Path(tmpdir) / 'cache' - - # create an online cache and download some data - online_cache = S3CloudCache(cache_dir, test_bucket_name, 'project-x') - online_cache.load_manifest('project-x_manifest_v1.0.0.json') - p0 = online_cache.download_data('1') - online_cache.load_manifest('project-x_manifest_v3.0.0.json') - - # path to file we intend to download - # (just making sure it wasn't accidentally created early - # by the online cache) - shld_be = cache_dir / 'project-x-3.0.0/data/f1.txt' - assert not shld_be.exists() - - del online_cache - - # create a local cache pointing to the same cache directory - # an try to access a data file that, while not downloaded, - # is identical to a file that has been downloaded - local_cache = LocalCache(cache_dir, test_bucket_name, 'project-x') - local_cache.load_manifest('project-x_manifest_v3.0.0.json') - attr = local_cache.data_path('1') - assert attr['exists'] - assert attr['local_path'].absolute() == shld_be.absolute() - assert attr['local_path'].is_symlink() - assert attr['local_path'].resolve() == p0.resolve() - - # test that LocalCache does not have access to data that - # has not been downloaded - attr = local_cache.data_path('2') - assert not attr['exists'] - with pytest.raises(NotImplementedError): - local_cache.download_data('2') diff --git a/allensdk/test/api/cloud_cache/test_static_local_cache.py b/allensdk/test/api/cloud_cache/test_static_local_cache.py deleted file mode 100644 index 484828f018..0000000000 --- a/allensdk/test/api/cloud_cache/test_static_local_cache.py +++ /dev/null @@ -1,203 +0,0 @@ -from pathlib import Path -from typing import Tuple -import json - -import pandas as pd -import pytest - -from allensdk.api.cloud_cache.utils import file_hash_from_path -from allensdk.api.cloud_cache.cloud_cache import StaticLocalCache - - -@pytest.fixture -def mounted_s3_dataset_fixture(tmp_path, request) -> Tuple[Path, str, dict]: - """A fixture which simulates a project s3 bucket that has been mounted - as a local directory. - """ - - # Get fixture parameters - project_name = request.param.get("project_name", "test_project_name_1") - dataset_version = request.param.get("dataset_version", "0.3.0") - metadata_file_id_column_name = request.param.get( - "metadata_file_id_column_name", "file_id" - ) - metadata_files_contents = request.param.get( - "metadata_files_contents", - # Each item in list is a tuple of: - # (metadata_filename, metadata_contents) - [ - ("metadata_1.csv", {"mouse": [1, 2, 3], "sex": ["F", "F", "M"]}), - ( - "metadata_2.csv", - { - "experiment": [4, 5, 6], - metadata_file_id_column_name: ["data1", "data2", "data3"] - } - ) - ] - ) - data_files_contents = request.param.get( - "data_files_contents", - # Each item in list is a tuple of: - # (data_filename, data_contents) - [ - ("data_1.nwb", "123456"), - ("data_2.nwb", "abcdef"), - ("data_3.nwb", "ghijkl") - ] - ) - - # Create mock mounted s3 directory structure - mock_mounted_base_dir = tmp_path / "mounted_remote_data" - mock_mounted_base_dir.mkdir() - mock_project_dir = mock_mounted_base_dir / project_name - mock_project_dir.mkdir() - - # Create metadata files and manifest entries - mock_metadata_dir = mock_project_dir / "project_metadata" - mock_metadata_dir.mkdir() - - manifest_meta_entries = dict() - for meta_fname, meta_contents in metadata_files_contents: - meta_save_path = mock_metadata_dir / meta_fname - df_to_save = pd.DataFrame(meta_contents) - df_to_save.to_csv(str(meta_save_path), index=False) - - manifest_meta_entries[meta_fname.rstrip(".csv")] = { - "url": ( - f"http://{project_name}.s3.amazonaws.com/{project_name}" - f"/project_metadata/{meta_fname}" - ), - "version_id": "test_placeholder", - "file_hash": file_hash_from_path(meta_save_path) - } - - # Create data files and manifest entries - mock_data_dir = mock_project_dir / "project_data" - mock_data_dir.mkdir() - - manifest_data_entries = dict() - for file_fname, file_contents in data_files_contents: - file_save_path = mock_data_dir / file_fname - with file_save_path.open('w') as f: - f.write(file_contents) - - manifest_data_entries[file_fname.rstrip(".nwb")] = { - "url": ( - f"http://{project_name}.s3.amazonaws.com/{project_name}" - f"/project_data/{file_fname}" - ), - "version_id": "test_placeholder", - "file_hash": file_hash_from_path(file_save_path) - } - - # Create manifest dir and manifest - mock_manifests_dir = mock_project_dir / "manifests" - mock_manifests_dir.mkdir() - manifest_fname = f"test_manifest_v{dataset_version}.json" - manifest_path = mock_manifests_dir / manifest_fname - - manifest_contents = { - "project_name": project_name, - "manifest_version": dataset_version, - "data_pipeline": [ - { - "name": "AllenSDK", - "version": "2.11.0", - "comment": "This is a test entry. NOT REAL." - } - ], - "metadata_file_id_column_name": metadata_file_id_column_name, - "metadata_files": manifest_meta_entries, - "data_files": manifest_data_entries - } - - with manifest_path.open('w') as f: - json.dump(manifest_contents, f, indent=4) - - expected = { - "expected_metadata": metadata_files_contents, - "expected_data": data_files_contents - } - - return mock_mounted_base_dir, project_name, expected - - -@pytest.mark.parametrize( - "mounted_s3_dataset_fixture", - [ - {"project_name": "visual-behavior-ophys"} - ], - indirect=["mounted_s3_dataset_fixture"] -) -def test_static_local_cache_access(mounted_s3_dataset_fixture): - local_static_cache_dir, proj_name, expected = mounted_s3_dataset_fixture - - cache = StaticLocalCache(local_static_cache_dir, proj_name) - cache.load_last_manifest() - - for exp_meta_fname, exp_meta_contents in expected["expected_metadata"]: - exp_df = pd.DataFrame(exp_meta_contents) - obt_df_path = cache.metadata_path(exp_meta_fname.rstrip(".csv")) - obt_df = pd.read_csv(obt_df_path["local_path"]) - pd.testing.assert_frame_equal(exp_df, obt_df) - - for exp_data_fname, exp_data_contents in expected["expected_data"]: - obt_data_path = cache.data_path(exp_data_fname.rstrip(".nwb")) - with open(obt_data_path["local_path"], "r") as f: - obt_data = f.read() - assert exp_data_contents == obt_data - - -@pytest.mark.parametrize( - "num_manifests, project_name, create_project_folders, expected", - [ - ( - 2, - "test_project", - True, - ['test_project_manifest_v0.1.0.json'] - ), - ( - 4, - "test_project_2", - True, - ['test_project_2_manifest_v0.3.0.json'] - ), - # This test case is expected to raise a RuntimeError - ( - None, # Not applicable - "test_project_2", - False, - None # Not applicable - ) - ] -) -def test_static_local_cache_list_all_manifests( - tmp_path, num_manifests, project_name, create_project_folders, expected -): - cache_dir = tmp_path / "cache_dir" - cache_dir.mkdir() - - if create_project_folders: - project_dir = cache_dir / project_name - project_dir.mkdir() - - manifests_dir = project_dir / "manifests" - manifests_dir.mkdir() - - for n in range(num_manifests): - manifest_path = ( - manifests_dir / f"{project_name}_manifest_v0.{n}.0.json" - ) - manifest_path.touch() - - cache = StaticLocalCache(cache_dir, project_name) - - assert cache._manifest_file_names == expected - - else: - with pytest.raises( - RuntimeError, match="Expected the provided cache_dir" - ): - _ = StaticLocalCache(cache_dir, project_name) diff --git a/allensdk/test/api/cloud_cache/test_utils.py b/allensdk/test/api/cloud_cache/test_utils.py deleted file mode 100644 index e0a6f86086..0000000000 --- a/allensdk/test/api/cloud_cache/test_utils.py +++ /dev/null @@ -1,53 +0,0 @@ -import pytest -import hashlib -import numpy as np -import allensdk.api.cloud_cache.utils as utils - - -def test_bucket_name_from_url(): - - url = 'https://dummy_bucket.s3.amazonaws.com/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 - bucket_name = utils.bucket_name_from_url(url) - assert bucket_name == "dummy_bucket" - - url = 'https://dummy_bucket2.s3-us-west-3.amazonaws.com/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 - bucket_name = utils.bucket_name_from_url(url) - assert bucket_name == "dummy_bucket2" - - url = 'https://dummy_bucket/txt_file.txt?versionId="jklaafdaerew"' - with pytest.warns(UserWarning): - bucket_name = utils.bucket_name_from_url(url) - assert bucket_name is None - - # make sure we are actualy detecting '.' in .amazonaws.com - url = 'https://dummy_bucket2.s3-us-west-3XamazonawsYcom/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 - with pytest.warns(UserWarning): - bucket_name = utils.bucket_name_from_url(url) - assert bucket_name is None - - -def test_relative_path_from_url(): - url = 'https://dummy_bucket.s3.amazonaws.com/my/dir/txt_file.txt?versionId="jklaafdaerew"' # noqa: E501 - relative_path = utils.relative_path_from_url(url) - assert relative_path == 'my/dir/txt_file.txt' - - -def test_file_hash_from_path(tmpdir): - - rng = np.random.RandomState(881) - alphabet = list('abcdefghijklmnopqrstuvwxyz') - fname = tmpdir / 'hash_dummy.txt' - with open(fname, 'w') as out_file: - for ii in range(10): - out_file.write(''.join(rng.choice(alphabet, size=10))) - out_file.write('\n') - - hasher = hashlib.blake2b() - with open(fname, 'rb') as in_file: - chunk = in_file.read(7) - while len(chunk) > 0: - hasher.update(chunk) - chunk = in_file.read(7) - - ans = utils.file_hash_from_path(fname) - assert ans == hasher.hexdigest() diff --git a/allensdk/test/api/cloud_cache/test_windows_isilon_paths.py b/allensdk/test/api/cloud_cache/test_windows_isilon_paths.py deleted file mode 100644 index ac656a0520..0000000000 --- a/allensdk/test/api/cloud_cache/test_windows_isilon_paths.py +++ /dev/null @@ -1,70 +0,0 @@ -import re -import json -from pathlib import Path - -from allensdk.api.cloud_cache.cloud_cache import CloudCacheBase -from allensdk.api.cloud_cache.manifest import Manifest - - -def test_windows_path_to_isilon(monkeypatch, tmpdir): - """ - This test is just meant to verify on Windows CI instances - that, if a path to the `/allen/` shared file store is used as - cache_dir, the path to files will come out useful (i.e. without any - spurious C:/ prepended as in AllenSDK issue #1964 - """ - - cache_dir = Path(tmpdir) - - manifest_1 = {'manifest_version': '1', - 'metadata_file_id_column_name': 'file_id', - 'data_pipeline': 'placeholder', - 'project_name': 'my-project', - 'metadata_files': {'a.csv': {'url': 'http://www.junk.com/path/to/a.csv', # noqa: E501 - 'version_id': '1111', - 'file_hash': 'abcde'}, - 'b.csv': {'url': 'http://silly.com/path/to/b.csv', # noqa: E501 - 'version_id': '2222', - 'file_hash': 'fghijk'}}, - 'data_files': {'data_1': {'url': 'http://www.junk.com/data/path/data.csv', # noqa: E501 - 'version_id': '1111', - 'file_hash': 'lmnopqrst'}} - } - manifest_path = tmpdir / "manifest.json" - with open(manifest_path, "w") as f: - json.dump(manifest_1, f) - - def dummy_file_exists(self, m): - return True - - # we do not want paths to `/allen` to be resolved to - # a local drive on the user's machine - bad_windows_pattern = re.compile('^[A-Z]\:') # noqa: W605 - - # make sure pattern is correctly formulated - m = bad_windows_pattern.search('C:\\a\windows\path') # noqa: W605 - assert m is not None - - with monkeypatch.context() as ctx: - class TestCloudCache(CloudCacheBase): - - def _download_file(self, m, o): - pass - - def _download_manifest(self, m, o): - pass - - def _list_all_manifests(self): - pass - - ctx.setattr(TestCloudCache, - '_file_exists', - dummy_file_exists) - - cache = TestCloudCache(cache_dir, 'proj') - cache._manifest = Manifest(cache_dir, json_input=manifest_path) - - m_path = cache.metadata_path('a.csv') - assert bad_windows_pattern.match(str(m_path)) is None - d_path = cache.data_path('data_1') - assert bad_windows_pattern.match(str(d_path)) is None diff --git a/allensdk/test/api/cloud_cache/utils.py b/allensdk/test/api/cloud_cache/utils.py deleted file mode 100644 index f58524bbab..0000000000 --- a/allensdk/test/api/cloud_cache/utils.py +++ /dev/null @@ -1,148 +0,0 @@ -from typing import Union, Optional -import boto3 -import json -import hashlib - - -def load_dataset(data_blobs: dict, - metadata_blobs: Union[dict, None], - manifest_version: str, - bucket_name: str, - client: boto3.client) -> None: - """ - Load a test dataset into moto's mocked S3 - - Parameters - ---------- - data_blobs: dict - Maps filename to a dict - 'data': the bytes in the data file - 'file_id': the file_id of the data file - - metadata_blobs: Union[dict, None] - A dict mapping metadata filename to bytes in the file - - manifest_version: str - The version of the manifest (manifest will be - uploaded to moto3 as manifest_{manifest_version}.json) - - bucket_name: str - - client: boto3.client - - Returns - ------- - None - Uploads the provided data, generates the manifest, - and uploads the manifest to moto3 - """ - - project_name = 'project-x' - - for fname in data_blobs: - client.put_object(Bucket=bucket_name, - Key=f'project-x/data/{fname}', - Body=data_blobs[fname]['data']) - - if metadata_blobs is not None: - for fname in metadata_blobs: - client.put_object(Bucket=bucket_name, - Key=f'project-x/project_metadata/{fname}', - Body=metadata_blobs[fname]) - - response = client.list_object_versions(Bucket=bucket_name) - fname_to_version = {} - for obj in response['Versions']: - if obj['IsLatest']: - fname = obj['Key'].split('/')[-1] - fname_to_version[fname] = obj['VersionId'] - - manifest = {} - manifest['manifest_version'] = manifest_version - manifest['project_name'] = project_name - manifest['metadata_file_id_column_name'] = 'file_id' - manifest['metadata_files'] = {} - manifest['data_pipeline'] = 'placeholder' - - data_file_dict = {} - url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/data' - for fname in data_blobs: - url = f'{url_root}/{fname}' - hasher = hashlib.blake2b() - hasher.update(data_blobs[fname]['data']) - checksum = hasher.hexdigest() - - data_file = {'url': url, - 'version_id': fname_to_version[fname], - 'file_hash': checksum} - - data_file_dict[data_blobs[fname]['file_id']] = data_file - - manifest['data_files'] = data_file_dict - - if metadata_blobs is not None: - url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/' - url_root += 'project_metadata' - - metadata_dict = {} - for fname in metadata_blobs: - url = f'{url_root}/{fname}' - hasher = hashlib.blake2b() - hasher.update(metadata_blobs[fname]) - metadata_dict[fname] = {'url': url, - 'file_hash': hasher.hexdigest(), - 'version_id': fname_to_version[fname]} - - manifest['metadata_files'] = metadata_dict - - manifest_k = f'{project_name}/manifests/' - manifest_k += f'{project_name}_manifest_v{manifest_version}.json' - client.put_object(Bucket=bucket_name, - Key=manifest_k, - Body=bytes(json.dumps(manifest), 'utf-8')) - - return None - - -def create_bucket(test_bucket_name: str, - datasets: dict, - metadatasets: Optional[dict] = None) -> None: - """ - Create a bucket and populate it with example datasets - - Parameters - ---------- - test_bucket_name: str - Name of the bucket - - datasets: dict - Keyed on version names; values are dicts of individual - data files to be loaded to the bucket - - metadatasets: Optional[dict] - Keyed on version names; values are dicts of individual - metadata files to be loaded to the bucket (default: None) - """ - - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - - # upload first dataset - for v in datasets.keys(): - if metadatasets is not None: - m = metadatasets[v] - else: - m = None - load_dataset(datasets[v], - m, - v, - test_bucket_name, - client) - - return None diff --git a/allensdk/test/api/response_test_data/472451419_response.json b/allensdk/test/api/response_test_data/472451419_response.json deleted file mode 100644 index 7679b260a3..0000000000 --- a/allensdk/test/api/response_test_data/472451419_response.json +++ /dev/null @@ -1,227 +0,0 @@ -{ - "total_rows": 9440, - "success": true, - "msg": [ - { - "name": "Biophysical - perisomatic_Nr5a1-Cre;Ai14-177334.05.01.01", - "specimen_id": 386049446, - "specimen": { - "rna_integrity_number": null, - "weight": 9000, - "parent_y_coord": 0, - "ephys_sweeps": [ - { - "stimulus_interval": null, - "stimulus_name": "Long Square", - "num_spikes": 2, - "id": 396429050, - "pre_vm_mv": -85.3548278808594, - "stimulus_duration": 0.999995, - "stimulus_start_time": 1.02, - "slow_noise_rms_mv": 0.0742162764072418, - "peak_deflection": null, - "stimulus_description": "C1LSFINEST150112[0]", - "stimulus_units": "Amps", - "specimen_id": 386049446, - "sweep_number": 42, - "vm_delta_mv": 0.374382019042969, - "leak_pa": -3.0070378780365, - "pre_noise_rms_mv": 0.0360921323299408, - "post_noise_rms_mv": 0.0375288389623165, - "bridge_balance_mohm": 18.0097675323486, - "post_vm_mv": -85.7292098999023, - "stimulus_absolute_amplitude": 110.000002162547, - "slow_vm_mv": -85.3548278808594, - "stimulus_relative_amplitude": 1.1 - } - ], - "parent_x_coord": 0, - "ephys_result_id": 386049444, - "is_cell_specimen": true, - "id": 386049446, - "neuron_reconstructions": [ - { - "max_euclidean_distance": 346.003240593379, - "number_tips": 22, - "max_path_distance": 377.118073486042, - "overall_depth": 70.56, - "neuron_reconstruction_type": "dendrite-only", - "number_bifurcations": 17, - "total_volume": 403.245425875963, - "scale_factor_z": 0.28, - "scale_factor_y": 0.1144, - "scale_factor_x": 0.1144, - "number_nodes": 1947, - "tags": "3D Neuron Reconstruction morphology", - "average_parent_daughter_ratio": 0.882944233914226, - "id": 491459171, - "average_diameter": 0.439679792761665, - "well_known_files": [ - { - "well_known_file_type": { - "id": 303941301, - "name": "3DNeuronReconstruction" - }, - "attachable_type": "NeuronReconstruction", - "download_link": "/api/v2/well_known_file_download/491459173", - "well_known_file_type_id": 303941301, - "path": "/external/mousecelltypes/prod256/specimen_386049446/Nr5a1-Cre_Ai14-177334.05.01.01_491459171_m.swc", - "attachable_id": 491459171, - "id": 491459173 - }, - { - "well_known_file_type": { - "id": 486753749, - "name": "3DNeuronMarker" - }, - "attachable_type": "NeuronReconstruction", - "download_link": "/api/v2/well_known_file_download/496607103", - "well_known_file_type_id": 486753749, - "path": "/external/mousecelltypes/prod256/specimen_386049446/Nr5a1-Cre_Ai14-177334.05.01.01_491459171_marker_m.swc", - "attachable_id": 491459171, - "id": 496607103 - } - ], - "specimen_id": 386049446, - "total_length": 2268.08172534129, - "overall_width": 271.753540218214, - "number_stems": 5, - "average_bifurcation_angle_local": 70.6136901015225, - "number_branches": 39, - "average_fragmentation": 53.3823529411765, - "average_contraction": 0.924610944456856, - "average_bifurcation_angle_remote": null, - "hausdorff_dimension": null, - "total_surface": 3133.71153328341, - "max_branch_order": 6.0, - "soma_surface": 290.085763487108, - "overall_height": 429.56158255954 - } - ], - "pinned_radius": null, - "sphinx_id": 256671, - "parent_id": 383680643, - "is_ish": false, - "cortex_layer_id": null, - "ephys_result": { - "failed": false, - "well_known_files": [ - { - "well_known_file_type": { - "id": 488673261, - "name": "EphysInstantaneousThresholdThumbnail" - }, - "attachable_type": "EphysResult", - "download_link": "/api/v2/well_known_file_download/491383263", - "well_known_file_type_id": 488673261, - "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/ephys_inst_threshold.png", - "attachable_id": 386049444, - "id": 491383263 - }, - { - "well_known_file_type": { - "id": 480715721, - "name": "MorphologyThumbnail" - }, - "attachable_type": "EphysResult", - "download_link": "/api/v2/well_known_file_download/487660477", - "well_known_file_type_id": 480715721, - "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/morphology_summary.png", - "attachable_id": 386049444, - "id": 487660477 - }, - { - "well_known_file_type": { - "id": 481007198, - "name": "NWBDownload" - }, - "attachable_type": "EphysResult", - "download_link": "/api/v2/well_known_file_download/491198851", - "well_known_file_type_id": 481007198, - "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/386049444_ephys.nwb", - "attachable_id": 386049444, - "id": 491198851 - }, - { - "well_known_file_type": { - "id": 478840678, - "name": "NWBUncompressed" - }, - "attachable_type": "EphysResult", - "download_link": "/api/v2/well_known_file_download/491198854", - "well_known_file_type_id": 478840678, - "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/386049444_uncompressed.nwb", - "attachable_id": 386049444, - "id": 491198854 - }, - { - "well_known_file_type": { - "id": 480715749, - "name": "EphysSummaryThumbnail" - }, - "attachable_type": "EphysResult", - "download_link": "/api/v2/well_known_file_download/487614229", - "well_known_file_type_id": 480715749, - "path": "/external/mousecelltypes/prod207/Ephys_Specimen_Roi_plan_386049444/ephys_summary.png", - "attachable_id": 386049444, - "id": 487614229 - } - ], - "id": 386049444, - "sampling_rate": 200000 - }, - "failed_facet": 734881840, - "treatment_id": 598634036, - "tissue_ph": null, - "hemisphere": "left", - "cell_reporter_id": 491913822, - "cell_prep_sample_id": null, - "data": null, - "structure_id": 721, - "parent_z_coord": 1, - "name": "Nr5a1-Cre;Ai14-177334.05.01.01", - "specimen_id_path": "/339692365/383309938/383680643/386049446/", - "donor_id": 339692362, - "external_specimen_name": null - }, - "neuronal_model_template": { - "well_known_files": [ - { - "well_known_file_type": { - "id": 292178729, - "name": "BiophysicalModelDescription" - }, - "attachable_type": "Product", - "download_link": "/api/v2/well_known_file_download/395337293", - "well_known_file_type_id": 292178729, - "path": "/external/mousecelltypes/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", - "attachable_id": 305094322, - "id": 395337293 - } - ], - "description": "Biophysical Neuronal Model Template", - "name": "Biophysical - perisomatic", - "id": 329230710 - }, - "neuronal_model_template_id": 329230710, - "well_known_files": [ - { - "well_known_file_type": { - "id": 329230374, - "name": "NeuronalModelParameters" - }, - "attachable_type": "NeuronalModel", - "download_link": "/api/v2/well_known_file_download/497235805", - "well_known_file_type_id": 329230374, - "path": "/external/mousecelltypes/prod297/neuronal_model_472451419/386049446_fit.json", - "attachable_id": 472451419, - "id": 497235805 - } - ], - "id": 472451419 - } - ], - "num_rows": 1, - "start_row": 0, - "id": 0 -} diff --git a/allensdk/test/api/test_annotated_section_data_set_api.py b/allensdk/test/api/test_annotated_section_data_set_api.py deleted file mode 100644 index 06462593e9..0000000000 --- a/allensdk/test/api/test_annotated_section_data_set_api.py +++ /dev/null @@ -1,97 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.api.queries.annotated_section_data_sets_api import \ - AnnotatedSectionDataSetsApi -import pytest -from mock import MagicMock - - -@pytest.fixture -def annotated(): - asdsa = AnnotatedSectionDataSetsApi() - - asdsa.json_msg_query = MagicMock(name='json_msg_query') - - return asdsa - - -def test_get_annotated_section_data_set(annotated): - annotated.get_annotated_section_data_sets( - structures=[112763676], - intensity_values=["High", "Low", "Medium"], - density_values=["High", "Low"], - pattern_values=["Full"], - age_names=["E11.5", "13.5"]) - - annotated.json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/annotated_section_data_sets.json" - "?structures=112763676&intensity_values='High','Low','Medium'" - "&density_values='High','Low'" - "&pattern_values='Full'&age_names='E11.5','13.5'") - - -def test_get_compound_annotated_section_data_set(annotated): - annotated.get_annotated_section_data_sets( - structures=[112763676], - intensity_values=["High", "Low", "Medium"], - density_values=["High", "Low"], - pattern_values=["Full"], - age_names=["E11.5", "13.5"]) - - annotated.json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/annotated_section_data_sets.json?" - "structures=112763676" - "&intensity_values='High','Low','Medium'&density_values='High','Low'" - "&pattern_values='Full'" - "&age_names='E11.5','13.5'") - - -def test_get_annotated_section_data_set_via_rma(annotated): - annotated.json_msg_query = \ - MagicMock(name='json_msg_query') - - annotated.get_compound_annotated_section_data_sets( - [{'structures': [112763676], - 'intensity_values': ['High', 'Low'], - 'link': 'or'}, - {'structures': [112763686], - 'intensity_values': ['Low']}]) - - annotated.json_msg_query.assert_called_once_with( - "http://api.brain-map.org" - "/api/v2/compound_annotated_section_data_sets.json" - "?query=[structures $in 112763676 : intensity_values $in 'High','Low']" - " or [structures $in 112763686 : intensity_values $in 'Low']") diff --git a/allensdk/test/api/test_api.py b/allensdk/test/api/test_api.py deleted file mode 100644 index bb92612021..0000000000 --- a/allensdk/test/api/test_api.py +++ /dev/null @@ -1,175 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import io -from six.moves import builtins -import zipfile -import os - -import numpy as np -import pytest -from mock import MagicMock, patch, mock_open -from requests.exceptions import HTTPError -import requests - -import allensdk.core.json_utilities as ju -from allensdk.api.api import Api, stream_file_over_http, stream_zip_directory_over_http - - -_msg = {'whatever': True} - -@pytest.fixture -def api(): - return Api() - - -@pytest.fixture -def response(): - - resp = MagicMock() - resp.iter_content = lambda *a, **k: iter([b'1', b'2', b'3']) - - return resp - - -@pytest.fixture -def zip_response(): - - flike = io.BytesIO() - data = '122333444455555' - - zipper = zipfile.ZipFile(flike, mode='w') - zipper.writestr('test.txt', data) - zipper.close() - - return flike.getvalue() - - -def test_failed_download(api): - with pytest.raises(HTTPError) as e_info: - api.retrieve_file_over_http('http://example.com/yo.jpg', - '/tmp/testfile') - - assert e_info.typename == 'HTTPError' - - -def test_request_timeout(api): - def raise_read_timeout(response, path=None): - raise requests.exceptions.ReadTimeout - - with patch('requests.get', return_value=MagicMock()) as get_mock: - response_mock = get_mock.return_value - response_mock.raise_for_status = MagicMock() - - with patch( - 'requests_toolbelt.downloadutils.stream.stream_response_to_file', - MagicMock(name='stream_response_to_file', - side_effect=raise_read_timeout)) as stream_mock: - - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - - with patch('os.remove', MagicMock()) as os_remove: - with pytest.raises(requests.exceptions.ReadTimeout) as e_info: - api.retrieve_file_over_http('http://example.com/yo.jpg', - '/tmp/testfile') - - assert e_info.typename == 'ReadTimeout' - stream_mock.assert_called_with(response_mock, path=open_mock.return_value) - get_mock.assert_called_once_with('http://example.com/yo.jpg', - stream=True, - timeout=(9.05, 31.1)) - open_mock.assert_called_once_with('/tmp/testfile', 'wb') - os_remove.assert_called_once_with('/tmp/testfile') - - -@patch("allensdk.core.json_utilities.read_url_post", return_value=_msg) -def test_do_query_post(ju_read_url_post, api): - api.do_query(lambda *a, **k: 'http://localhost/%s' % (a[0]), - lambda d: d, - "wow", - post=True) - - ju_read_url_post.assert_called_once_with('http://localhost/wow') - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_do_query_get(ju_read_url_get, api): - api.do_query(lambda *a, **k: 'http://localhost/%s' % (a[0]), - lambda d: d, - "wow", - post=False) - - ju_read_url_get.assert_called_once_with('http://localhost/wow') - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_load_api_schema(ju_read_url_get, api): - api.load_api_schema() - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/enumerate.json') - - -def test_stream_file_over_http(response, tmpdir_factory): - - path = tmpdir_factory.mktemp('file_stream_test').join('test.txt') - - with patch('requests.get', return_value=response) as get_mock: - stream_file_over_http('https://fish.gov', str(path)) - - with open(str(path), 'r') as fil: - data = fil.read() - - assert( data == '123' ) - - -def test_stream_zip_directory_over_http(zip_response, tmpdir_factory): - - path = tmpdir_factory.mktemp('zip_stream_test').join('test.txt') - - with patch('requests.get') as get_mock: - with patch('requests_toolbelt.downloadutils.stream.stream_response_to_file', - side_effect=lambda r, b: b.write(zip_response)): - - stream_zip_directory_over_http('https://fish.gov', os.path.dirname(str(path))) - - with open(str(path), 'r') as fil: - data = fil.read() - - assert(data == '122333444455555') - \ No newline at end of file diff --git a/allensdk/test/api/test_biophysical_api.py b/allensdk/test/api/test_biophysical_api.py deleted file mode 100644 index 927d69d0c2..0000000000 --- a/allensdk/test/api/test_biophysical_api.py +++ /dev/null @@ -1,79 +0,0 @@ -import os -import json - -import numpy as np -import pytest -from mock import patch -from allensdk.api.queries.biophysical_api import BiophysicalApi - - -@pytest.fixture -def neuronal_model_response(): - dirname = os.path.dirname(__file__) - path = os.path.join(dirname, 'response_test_data', '472451419_response.json') - - with open(path, 'r') as jf: - data = json.load(jf) - - return data - - -@pytest.fixture -def biophys_api(): - endpoint = 'http://twarehouse-backup' - return BiophysicalApi(endpoint) - - -@pytest.mark.parametrize('model_id', [3]) -@pytest.mark.parametrize('fmt', [None, 'json', 'xml']) -def test_build_rma(model_id, fmt, biophys_api): - if fmt is None: - fmt_exp = 'json' - obt = biophys_api.build_rma(model_id) - else: - fmt_exp = fmt - obt = biophys_api.build_rma(model_id, fmt_exp) - - exp = 'http://twarehouse-backup/api/v2/data/query.{}?'\ - 'q=model::NeuronalModel,'\ - 'rma::criteria,[id$eq{}],'\ - 'neuronal_model_template(well_known_files(well_known_file_type)),'\ - 'specimen(ephys_result(well_known_files(well_known_file_type)),'\ - 'neuron_reconstructions(well_known_files(well_known_file_type)),ephys_sweeps),'\ - 'well_known_files(well_known_file_type),'\ - 'rma::include,neuronal_model_template(well_known_files(well_known_file_type)),'\ - 'specimen(ephys_result(well_known_files(well_known_file_type)),'\ - 'neuron_reconstructions(well_known_files(well_known_file_type)),ephys_sweeps),'\ - 'well_known_files(well_known_file_type)' - exp = exp.format(fmt_exp, model_id) - - assert obt == exp - - -def test_is_well_known_file_type(biophys_api): - wkf = {'well_known_file_type': {'name': 'fish'}} - - assert(biophys_api.is_well_known_file_type(wkf, 'fish')) - assert(not biophys_api.is_well_known_file_type(wkf, 'fowl')) - - -@patch.object(BiophysicalApi, "json_msg_query") -def test_get_neuronal_models(mock_json_msg_query, biophys_api): - mck = biophys_api.get_neuronal_models([386049446,469753383]) - - mock_json_msg_query.assert_called_once_with( - "http://twarehouse-backup/api/v2/data/query.json?" - "q=model::NeuronalModel,rma::criteria,[neuronal_model_template_id$in491455321,329230710]," - "[specimen_id$in386049446,469753383],rma::options[num_rows$eq'all'][count$eqfalse]") - - -def test_read_json(biophys_api, neuronal_model_response): - - obt = biophys_api.read_json(neuronal_model_response) - - assert(obt['stimulus']['491198851'] == "386049444.nwb") - assert(obt['morphology']['491459173'] == "Nr5a1-Cre_Ai14-177334.05.01.01_491459171_m.swc") - assert(obt['fit']['497235805'] == '386049446_fit.json') - assert(obt['marker']['496607103'] == 'Nr5a1-Cre_Ai14-177334.05.01.01_491459171_marker_m.swc') - assert(obt['modfiles']['395337293'] == os.path.join('modfiles', 'SK.mod')) - assert(np.allclose(biophys_api.sweeps, [42])) diff --git a/allensdk/test/api/test_brain_observatory_api.py b/allensdk/test/api/test_brain_observatory_api.py deleted file mode 100644 index 41c66311eb..0000000000 --- a/allensdk/test/api/test_brain_observatory_api.py +++ /dev/null @@ -1,547 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import pytest -from mock import patch, MagicMock, call -from collections import Counter -import datetime -from allensdk.api.queries.brain_observatory_api import (BrainObservatoryApi, - find_container_tags, - find_specimen_cre_line, - find_specimen_reporter_line, - find_experiment_acquisition_age) -from . import SafeJsonMsg - - -_rows_per_message = 2000 -_msg = [{'whatever': True}] * _rows_per_message -_num_messages = 5 -_msg5 = [{'msg': _msg}] * _num_messages - -@pytest.fixture -def safe_msg5(): - return SafeJsonMsg(_msg5) - -@pytest.fixture() -def bo_api(): - endpoint = os.environ['TEST_API_ENDPOINT'] if 'TEST_API_ENDPOINT' in os.environ else 'http://twarehouse-backup' - return BrainObservatoryApi(endpoint) - - -@pytest.fixture -def mock_containers(): - containers = [ - { - 'targeted_structure': {'acronym': 'CBS'}, - 'imaging_depth': 100, - 'specimen': { - 'donor': {'transgenic_lines': [{ 'name': 'Shiny', - 'transgenic_line_type_name': 'driver' }]}} - }, - { - 'targeted_structure': {'acronym': 'ABC'}, - 'imaging_depth': 150, - 'specimen': { - 'donor': {'transgenic_lines': [{ 'name': 'ShinyCre', - 'transgenic_line_type_name': 'driver' }]}} - }, - { - 'targeted_structure': {'acronym': 'NBC'}, - 'imaging_depth': 200, - 'specimen': { - 'donor': {'transgenic_lines': [{ 'name': 'Don', - 'transgenic_line_type_name': 'reporter' }]}} - } - ] - - return containers - - -@pytest.fixture -def mock_ophys_experiments(): - experiments = [ - {'experiment_container_id': 1, - 'targeted_structure': {'acronym': 'CBS'}, - 'imaging_depth': 100, - 'specimen': {'donor': { - 'transgenic_lines': [{'name': 'Shiny'}]}}, - 'stimulus_name': 'three_session_B', - }, - {'experiment_container_id': 2, - 'targeted_structure': {'acronym': 'NBC'}, - 'imaging_depth': 200, - 'specimen': {'donor': { - 'transgenic_lines': [{'name': 'Don'}]}}, - 'stimulus_name': 'three_session_C', - 'experiment_container': { 'failed': False }, - 'fail_eye_tracking': False - }, - {'experiment_container_id': 2, - 'targeted_structure': {'acronym': 'NBC'}, - 'imaging_depth': 200, - 'specimen': {'donor': { - 'transgenic_lines': [{'name': 'Don'}]}}, - 'stimulus_name': 'three_session_C', - 'experiment_container': { 'failed': True }, - 'fail_eye_tracking': True - } - ] - - return experiments - - -@pytest.fixture -def mock_specimens(): - specimens = [ - {"experiment_container_id": 511498500, - "cell_specimen_id": 517394843 - }, - {"experiment_container_id": 511498742, - "cell_specimen_id": 517398740, - "failed_experiment_container": False - }, - {"experiment_container_id": 511498501, - "cell_specimen_id": 517394874, - "failed_experiment_container": True - } - ] - return specimens - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_list_isi_experiments(mock_json_msg_query, bo_api): - bo_api.list_isi_experiments() - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::IsiExperiment,rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_isi_experiments(mock_json_msg_query, bo_api): - isi_experiment_id = 503316697 - bo_api.get_isi_experiments(isi_experiment_id) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::IsiExperiment,rma::criteria,[id$in503316697]," - "rma::include," - "experiment_container(ophys_experiments,targeted_structure)," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_ophys_experiments_one_id(mock_json_msg_query, bo_api): - ophys_experiment_id = 502066273 - bo_api.get_ophys_experiments(ophys_experiment_id) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::OphysExperiment,rma::criteria,[id$in502066273]," - "rma::include,experiment_container," - "well_known_files(well_known_file_type),targeted_structure," - "specimen(donor(age,transgenic_lines))," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_experiment_container_metrics(mock_json_msg_query, bo_api): - tid = 511510627 - bo_api.get_experiment_container_metrics(tid) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiCamExperimentContainerMetric," - "rma::criteria,[id$in511510627]," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_experiment_containers(mock_json_msg_query, bo_api): - tid = 511510753 - bo_api.get_experiment_containers(tid) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ExperimentContainer,rma::criteria,[id$in511510753]," - "rma::include,ophys_experiments,isi_experiment," - "specimen(donor(conditions,age,transgenic_lines)),targeted_structure," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_column_definitions(mock_json_msg_query, bo_api): - api_class_name = bo_api.quote_string('ApiTbiDonorMetric') - bo_api.get_column_definitions(api_class_name=api_class_name) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiColumnDefinition," - "rma::criteria,[api_class_name$eq'ApiTbiDonorMetric']," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_list_column_definition_class_names(mock_json_msg_query, bo_api): - bo_api.list_column_definition_class_names() - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiColumnDefinition," - "rma::options" - "[only$eq'api_class_name'][num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_stimulus_mappings_no_ids(mock_json_msg_query, bo_api): - bo_api.get_stimulus_mappings() - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiCamStimulusMapping," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_stimulus_mappings_one_id(mock_json_msg_query, bo_api): - ids = 15 - bo_api.get_stimulus_mappings(stimulus_mapping_ids=ids) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiCamStimulusMapping," - "rma::criteria,[id$in15]," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_stimulus_mappings_two_ids(mock_json_msg_query, bo_api): - ids = [15, 43] - bo_api.get_stimulus_mappings(stimulus_mapping_ids=ids) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiCamStimulusMapping," - "rma::criteria,[id$in15,43]," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_cell_metrics_no_ids(mock_json_msg_query, bo_api): - list(bo_api.get_cell_metrics()) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiCamCellMetric," - "rma::options[num_rows$eq2000][start_row$eq0][order$eq\'cell_specimen_id\'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_cell_metrics_one_ids(mock_json_msg_query, bo_api): - tid = 517394843 - list(bo_api.get_cell_metrics(cell_specimen_ids=tid)) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiCamCellMetric," - "rma::criteria,[cell_specimen_id$in517394843]," - "rma::options[num_rows$eq2000][start_row$eq0][order$eq\'cell_specimen_id\'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_cell_metrics_two_ids(mock_json_msg_query, bo_api): - ids = [517394843, 517394850] - res = list(bo_api.get_cell_metrics(cell_specimen_ids=ids)) - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::ApiCamCellMetric," - "rma::criteria,[cell_specimen_id$in517394843,517394850]," - "rma::options[num_rows$eq2000][start_row$eq0][order$eq\'cell_specimen_id\'][count$eqfalse]") - - -def test_get_cell_metrics_five_messages(bo_api, safe_msg5): - with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_msg5) as ju_read_url_get: - ids = [517394843, 517394850] - list(bo_api.get_cell_metrics(cell_specimen_ids=ids)) - - base_query = \ - (bo_api.api_url + '/api/v2/data/query.json?q=' - 'model::ApiCamCellMetric,' - 'rma::criteria,%5Bcell_specimen_id$in517394843,517394850%5D,' - 'rma::options%5Bnum_rows$eq2000%5D%5Bstart_row$eq{}%5D%5Border$eq%27cell_specimen_id%27%5D%5Bcount$eqfalse%5D') - expected_calls = map(lambda c: call(base_query.format(c)), - [0, 2000, 4000, 6000, 8000, 10000]) - - assert ju_read_url_get.call_args_list == list(expected_calls) - - -def test_filter_experiment_containers_no_filters(bo_api, mock_containers): - containers = bo_api.filter_experiment_containers(mock_containers) - assert len(containers) == 3 - - -def test_filter_experiment_containers_depth_filter(bo_api, mock_containers): - containers = bo_api.filter_experiment_containers(mock_containers, - imaging_depths=[100]) - assert len(containers) == 1 - - -def test_filter_experiment_containers_structures_filter(bo_api, mock_containers): - containers = \ - bo_api.filter_experiment_containers( - mock_containers, - targeted_structures=['CBS']) - assert len(containers) == 1 - - -def test_filter_experiment_containers_lines_all_filters(bo_api, mock_containers): - containers = \ - bo_api.filter_experiment_containers(mock_containers, - imaging_depths=[200], - targeted_structures=['NBC'], - transgenic_lines=['Don']) - - assert len(containers) == 1 - - containers = \ - bo_api.filter_experiment_containers(mock_containers, - imaging_depths=[200], - targeted_structures=['NBC'], - reporter_lines=['don']) - - assert len(containers) == 1 - -def test_filter_experiment_containers_transgenic_lines(bo_api, mock_containers): - containers = \ - bo_api.filter_experiment_containers(mock_containers, - cre_lines=['Shiny']) - - assert len(containers) == 0 - - containers = \ - bo_api.filter_experiment_containers(mock_containers, - cre_lines=['ShinyCre']) - - assert len(containers) == 1 - - containers = \ - bo_api.filter_experiment_containers(mock_containers, transgenic_lines=['DON']) - - assert len(containers) == 1 - - - -def test_filter_ophys_experiments_no_filters(bo_api, mock_ophys_experiments): - experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments) - assert len(experiments) == 2 - - -def test_filter_ophys_experiments_container_id(bo_api, mock_ophys_experiments): - experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments, - experiment_container_ids=[1]) - assert len(experiments) == 1 - - -def test_filter_ophys_experiments_stimuli(bo_api, mock_ophys_experiments): - experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments, - stimuli=['static_gratings']) - assert len(experiments) == 1 - -def test_filter_ophys_experiments_eye_tracking(bo_api, mock_ophys_experiments): - experiments = bo_api.filter_ophys_experiments(mock_ophys_experiments, - require_eye_tracking=True) - assert len(experiments) == 1 - - -def test_filter_cell_specimens(bo_api, mock_specimens): - specimens = bo_api.filter_cell_specimens(mock_specimens, include_failed=True) - assert specimens == mock_specimens - - specimens = bo_api.filter_cell_specimens(mock_specimens) - assert len(specimens) == 2 - - specimens = bo_api.filter_cell_specimens( - mock_specimens, ids=[mock_specimens[0]['cell_specimen_id']]) - assert len(specimens) == 1 - assert specimens[0] == mock_specimens[0] - - cnt = Counter() - for sp in mock_specimens: - cnt[sp['experiment_container_id']] += 1 - - ecid = mock_specimens[0]['experiment_container_id'] - specimens = bo_api.filter_cell_specimens( - mock_specimens, experiment_container_ids=[ecid]) - assert len(specimens) == cnt[ecid] - assert specimens[0] == mock_specimens[0] - - -@patch.object(BrainObservatoryApi, "retrieve_file_over_http") -@patch.object(BrainObservatoryApi, "json_msg_query", return_value=[{'download_link': '/url/path/to/file'}]) -def test_save_ophys_experiment_data(mock_json_msg_query, - mock_retrieve_file_over_http, - bo_api): - with patch('allensdk.config.manifest.Manifest.safe_mkdir') as mkdir: - bo_api.save_ophys_experiment_data(1, '/path/to/filename') - - mkdir.assert_called_once_with('/path/to') - - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::WellKnownFile," - "rma::criteria," - "[attachable_id$eq1],well_known_file_type[name$eqNWBOphys]," - "rma::options[num_rows$eq'all'][count$eqfalse]") - mock_retrieve_file_over_http.assert_called_with( - bo_api.api_url + '/url/path/to/file', - '/path/to/filename') - - -@patch.object(BrainObservatoryApi, "retrieve_file_over_http") -@patch.object(BrainObservatoryApi, "json_msg_query", return_value=[{'download_link': '/url/path/to/file'}]) -def test_save_ophys_experiment_event_data(mock_json_msg_query, - mock_retrieve_file_over_http, - bo_api): - with patch('allensdk.config.manifest.Manifest.safe_mkdir') as mkdir: - bo_api.save_ophys_experiment_event_data(1, '/path/to/filename') - - mkdir.assert_called_once_with('/path/to') - - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::WellKnownFile," - "rma::criteria," - "[attachable_id$eq1],well_known_file_type[name$eqObservatoryEventsFile]," - "rma::options[num_rows$eq'all'][count$eqfalse]") - mock_retrieve_file_over_http.assert_called_with( - bo_api.api_url + '/url/path/to/file', - '/path/to/filename') - - -@patch.object(BrainObservatoryApi, "retrieve_file_over_http") -@patch.object(BrainObservatoryApi, "json_msg_query", return_value=[{'download_link': '/url/path/to/file'}]) -def test_get_cell_specimen_id_mapping(mock_json_msg_query, - mock_retrieve_file_over_http, - bo_api): - with patch('pandas.read_csv') as readcsv: - bo_api.get_cell_specimen_id_mapping('/path/to/filename', 1) - - readcsv.assert_called_once_with('/path/to/filename') - - mock_json_msg_query.assert_called_once_with( - bo_api.api_url + "/api/v2/data/query.json?q=" - "model::WellKnownFile," - "rma::criteria," - "[id$eq1],well_known_file_type[name$eqOphysCellSpecimenIdMapping]," - "rma::options[num_rows$eq'all'][count$eqfalse]") - mock_retrieve_file_over_http.assert_called_with( - bo_api.api_url + '/url/path/to/file', - '/path/to/filename') - - -def test_find_container_tags(): - # no conditions no tags - c = { "specimen": { "donor": { "conditions": [] } } } - tags = find_container_tags(c) - assert len(tags) == 0 - - # tissue tags are ignored - c = { "specimen": { "donor": { "conditions": [ { "name": "tissuecyte" } ] } } } - tags = find_container_tags(c) - assert len(tags) == 0 - - # no conditions is okay - c = { "specimen": { "donor": { } } } - tags = find_container_tags(c) - assert len(tags) == 0 - - # everything else goes through - c = { "specimen": { "donor": { "conditions": [ { "name": "fish" } ] } } } - tags = find_container_tags(c) - assert len(tags) == 1 - - -def test_find_specimen_cre_line(): - # None if no TLs - s = { "donor": { "transgenic_lines": [ ] } } - cre = find_specimen_cre_line(s) - assert cre is None - - # None if no 'Cre' - s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "driver", "name": "banana" } ] } } - cre = find_specimen_cre_line(s) - assert cre is None - - # None if no 'Cre' - s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "driver", "name": "bananaCre" } ] } } - cre = find_specimen_cre_line(s) - assert cre == "bananaCre" - - # None if no 'driver' - s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "reporter", "name": "bananaCre" } ] } } - cre = find_specimen_cre_line(s) - assert cre == None - -def test_find_specimen_reporter_line(): - # None if no TLs - s = { "donor": { "transgenic_lines": [ ] } } - cre = find_specimen_reporter_line(s) - assert cre is None - - s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "reporter", "name": "banana" } ] } } - cre = find_specimen_reporter_line(s) - assert cre == "banana" - - # None if no "reporter" - s = { "donor": { "transgenic_lines": [ { "transgenic_line_type_name": "driver", "name": "bananaCre" } ] } } - cre = find_specimen_reporter_line(s) - assert cre is None - -def test_find_experiment_acquisition_age(): - exp = {} - age = find_experiment_acquisition_age(exp) - assert age is None - - d2 = datetime.datetime.now() - d1 = d2 - datetime.timedelta(days=1) - - exp = { 'date_of_acquisition': str(d2), - 'specimen': { 'donor': { 'date_of_birth': str(d1) } } } - - age = find_experiment_acquisition_age(exp) - - assert age == 1 - -def test_dataframe_query(bo_api, mock_specimens): - res = bo_api.dataframe_query(mock_specimens, [], 'cell_specimen_id') - assert len(res) == len(mock_specimens) - - res = bo_api.dataframe_query(mock_specimens, - [ { 'field': 'experiment_container_id', - 'op': '=', - 'value': 511498500 } ], - 'cell_specimen_id') - - assert len(res) == 1 - diff --git a/allensdk/test/api/test_cache.py b/allensdk/test/api/test_cache.py deleted file mode 100755 index 902f92c465..0000000000 --- a/allensdk/test/api/test_cache.py +++ /dev/null @@ -1,233 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os - -import pandas as pd -import pandas.io.json as pj -import numpy as np -import time - -import pytest -from mock import MagicMock, mock_open, patch - -from allensdk.api.warehouse_cache.cache import Cache, memoize, get_default_manifest_file -from allensdk.api.queries.rma_api import RmaApi -import allensdk.core.json_utilities as ju -from allensdk.config.manifest import ManifestVersionError -from allensdk.config.manifest_builder import ManifestBuilder - -_msg = [{'whatever': True}] -_pd_msg = pd.DataFrame(_msg) - - -@pytest.fixture -def cache(): - return Cache() - - -@pytest.fixture -def rma(): - return RmaApi() - - -@pytest.fixture -def wavefront_obj(): - return ''' - -v 8578 5484.96 5227.57 -v 8509.2 5487.54 5237.07 -v 8564.38 5522.13 5220.41 -v 8631.93 5497.82 5228.33 -v 8517.88 5542.95 5234.53 -v 8615.26 5563.22 5224.48 - -# i'm a comment! - -vn -0.0247061 -0.352726 -0.935401 -vn -0.235489 -0.190095 -0.953105 -vn -0.0880336 -0.0323767 -0.995591 -vn 0.122706 -0.209891 -0.969994 -vn -0.343738 0.217978 -0.913416 -vn 0.0753706 0.16324 -0.983703 - -I should be a comment, but am not - -f 1//1 2//2 3//3 -f 4//4 1//1 3//3 -f 3//3 2//2 5//5 -f 6//6 3//3 5//5 - - ''' - - -@pytest.fixture -def dummy_cache(): - class DummyCache(Cache): - - VERSION = None - - def build_manifest(self, file_name): - manifest_builder = ManifestBuilder() - manifest_builder.set_version(DummyCache.VERSION) - manifest_builder.write_json_file(file_name) - - return DummyCache - - -def test_version_update(fn_temp_dir, dummy_cache): - - mpath = os.path.join(fn_temp_dir, 'manifest.json') - dc = dummy_cache(manifest=mpath) - - same_dc = dummy_cache(manifest=mpath) - - with pytest.raises(ManifestVersionError): - new_dc = dummy_cache(manifest=mpath, version=1.0) - - -def test_load_manifest(tmpdir_factory, dummy_cache): - - manifest = tmpdir_factory.mktemp('data').join('test_manifest.json') - cache = dummy_cache(manifest=str(manifest)) - - assert(cache.manifest_path == str(manifest)) - assert(os.path.exists(cache.manifest_path)) - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=pd.DataFrame(_msg)) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -def test_wrap_json(ju_read_url_get, ju_read, ju_write, rma, cache): - df = cache.wrap(rma.model_query, - 'example.txt', - cache=True, - model='Hemisphere') - - assert df.loc[:, 'whatever'][0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - ju_write.assert_called_once_with('example.txt', _msg) - ju_read.assert_called_once_with('example.txt') - - -@patch("pandas.io.json.read_json", return_value=_msg) -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -def test_wrap_dataframe(ju_read_url_get, ju_write, mock_read_json, rma, cache): - json_data = cache.wrap(rma.model_query, - 'example.txt', - cache=True, - return_dataframe=True, - model='Hemisphere') - - assert json_data[0]['whatever'] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - ju_write.assert_called_once_with('example.txt', _msg) - mock_read_json.assert_called_once_with('example.txt', orient='records') - - -def test_memoize_with_function(): - @memoize - def f(x): - time.sleep(0.1) - return x - - # Build cache - for i in range(3): - uncached_result = f(i) - assert uncached_result == i - assert f.cache_size() == 3 - - # Test cache was accessed - for i in range(3): - t0 = time.time() - result = f(i) - t1 = time.time() - assert result == i - assert t1 - t0 < 0.1 - - # Test cache clear - f.cache_clear() - assert f.cache_size() == 0 - - -def test_memoize_with_kwarg_function(): - @memoize - def f(x, *, y, z=1): - time.sleep(0.1) - return (x * y * z) - - # Build cache - f(2, y=1, z=2) - assert f.cache_size() == 1 - - # Test cache was accessed - t0 = time.time() - result = f(2, y=1, z=2) - t1 = time.time() - assert result == 4 - assert t1 - t0 < 0.1 - - -def test_memoize_with_instance_method(): - class FooBar(object): - @memoize - def f(self, x): - time.sleep(0.1) - return x - - fb = FooBar() - # Build cache - for i in range(3): - uncached_result = fb.f(i) - assert uncached_result == i - assert fb.f.cache_size() == 3 - - for i in range(3): - t0 = time.time() - result = fb.f(i) - t1 = time.time() - assert result == i - assert t1 - t0 < 0.1 - - -def test_get_default_manifest_file(): - assert get_default_manifest_file('brain_observatory') == 'brain_observatory/manifest.json' - assert get_default_manifest_file('cell_types') == 'cell_types/manifest.json' - assert get_default_manifest_file('mouse_connectivity') == 'mouse_connectivity/manifest.json' diff --git a/allensdk/test/api/test_cacheable.py b/allensdk/test/api/test_cacheable.py deleted file mode 100644 index 8afb1f590c..0000000000 --- a/allensdk/test/api/test_cacheable.py +++ /dev/null @@ -1,317 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import MagicMock, patch, mock_open -from allensdk.api.warehouse_cache.cache import Cache, cacheable -from allensdk.api.queries.rma_api import RmaApi -import pandas as pd -from six.moves import builtins -from allensdk.config.manifest import Manifest - -try: - import StringIO -except: - import io as StringIO -import os - - -_msg = [{'whatever': True}] -_pd_msg = pd.DataFrame(_msg) -_csv_msg = pd.read_csv(StringIO.StringIO(""",whatever -0,True -"""), index_col=0) - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch('csv.DictWriter') -@patch('pandas.read_csv', return_value=_csv_msg) -def test_cacheable_csv_dataframe(read_csv, dictwriter, ju_read_url_get, - ju_read, ju_write): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - with patch('allensdk.config.manifest.Manifest.safe_mkdir') as mkdir: - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - open_mock.return_value.write = MagicMock() - df = get_hemispheres(path='/xyz/abc/example.txt', - strategy='create', - **Cache.cache_csv_dataframe()) - - assert df.loc[:, 'whatever'][0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - read_csv.assert_called_once_with('/xyz/abc/example.txt', parse_dates=True) - assert not ju_write.called, 'write should not have been called' - assert not ju_read.called, 'read should not have been called' - mkdir.assert_called_once_with('/xyz/abc') - open_mock.assert_called_once_with('/xyz/abc/example.txt', 'w') - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch.object(Manifest, 'safe_mkdir') -@patch('pandas.read_csv', return_value=_csv_msg) -def test_cacheable_json(read_csv, mkdir, ju_read_url_get, ju_read, ju_write): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - df = get_hemispheres(path='/xyz/abc/example.json', - strategy='create', - **Cache.cache_json()) - - assert 'whatever' in df[0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - assert not read_csv.called, 'read_csv should not have been called' - ju_write.assert_called_once_with('/xyz/abc/example.json', - _msg) - ju_read.assert_called_once_with('/xyz/abc/example.json') - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch.object(Manifest, 'safe_mkdir') -def test_excpt(mkdir, ju_read_url_get, ju_read, ju_write): - @cacheable() - def get_hemispheres_excpt(): - return RmaApi().model_query(model='Hemisphere', - excpt=['symbol']) - - df = get_hemispheres_excpt(path='/xyz/abc/example.json', - strategy='create', - **Cache.cache_json()) - - assert 'whatever' in df[0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere,rma::options%5Bexcept$eqsymbol%5D') - ju_write.assert_called_once_with('/xyz/abc/example.json', _msg) - ju_read.assert_called_once_with('/xyz/abc/example.json') - mkdir.assert_called_once_with('/xyz/abc') - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch('pandas.read_csv', return_value=_csv_msg) -def test_cacheable_no_cache_csv(read_csv, ju_read_url_get, ju_read, ju_write): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - df = get_hemispheres(path='/xyz/abc/example.csv', - strategy='file', - **Cache.cache_csv()) - - assert df.loc[:, 'whatever'][0] - - assert not ju_read_url_get.called - read_csv.assert_called_once_with('/xyz/abc/example.csv', parse_dates=True) - assert not ju_write.called, 'json write should not have been called' - assert not ju_read.called, 'json read should not have been called' - - -@patch("pandas.io.json.read_json", return_value=_pd_msg) -@patch("pandas.read_csv", return_value=_csv_msg) -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch.object(Manifest, 'safe_mkdir') -def test_cacheable_json_dataframe(mkdir, ju_read_url_get, ju_read, ju_write, - read_csv, mock_read_json): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - df = get_hemispheres(path='/xyz/abc/example.json', - strategy='create', - **Cache.cache_json_dataframe()) - - assert df.loc[:, 'whatever'][0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - assert not read_csv.called, 'read_csv should not have been called' - mock_read_json.assert_called_once_with('/xyz/abc/example.json', - orient='records') - ju_write.assert_called_once_with('/xyz/abc/example.json', _msg) - assert not ju_read.called, 'json read should not have been called' - mkdir.assert_called_once_with('/xyz/abc') - - -@patch("pandas.io.json.read_json", return_value=_pd_msg) -@patch("pandas.read_csv", return_value=_csv_msg) -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch('csv.DictWriter') -@patch.object(Manifest, 'safe_mkdir') -def test_cacheable_csv_json(mkdir, dictwriter, ju_read_url_get, ju_read, - ju_write, read_csv, mock_read_json): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - open_mock.return_value.write = MagicMock() - df = get_hemispheres(path='/xyz/example.csv', - strategy='create', - **Cache.cache_csv_json()) - - assert 'whatever' in df[0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - read_csv.assert_called_once_with('/xyz/example.csv', parse_dates=True) - dictwriter.return_value.writerow.assert_called() - assert not mock_read_json.called, 'pj.read_json should not have been called' - assert not ju_write.called, 'ju.write should not have been called' - assert not ju_read.called, 'json read should not have been called' - mkdir.assert_called_once_with('/xyz') - open_mock.assert_called_once_with('/xyz/example.csv', 'w') - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch("pandas.read_csv") -@patch.object(pd.DataFrame, "to_csv") -def test_cacheable_no_save(to_csv, read_csv, ju_read_url_get, ju_read, - ju_write): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - data = get_hemispheres() - - assert 'whatever' in data[0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - assert not to_csv.called, 'to_csv should not have been called' - assert not read_csv.called, 'read_csv should not have been called' - assert not ju_write.called, 'json write should not have been called' - assert not ju_read.called, 'json read should not have been called' - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch("pandas.read_csv", return_value=_csv_msg) -@patch.object(pd.DataFrame, "to_csv") -def test_cacheable_no_save_dataframe(to_csv, read_csv, ju_read_url_get, - ju_read, ju_write): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - df = get_hemispheres(**Cache.nocache_dataframe()) - - assert df.loc[:, 'whatever'][0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - assert not to_csv.called, 'to_csv should not have been called' - assert not read_csv.called, 'read_csv should not have been called' - assert not ju_write.called, 'json write should not have been called' - assert not ju_read.called, 'json read should not have been called' - - -@patch("pandas.read_csv", return_value=_csv_msg) -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch('csv.DictWriter') -@patch.object(Manifest, 'safe_mkdir') -def test_cacheable_lazy_csv_no_file(mkdir, dictwriter, ju_read_url_get, - ju_read, ju_write, read_csv): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - with patch('os.path.exists', MagicMock(return_value=False)) as ope: - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - open_mock.return_value.write = MagicMock() - df = get_hemispheres(path='/xyz/abc/example.csv', - strategy='lazy', - **Cache.cache_csv()) - - assert df.loc[:, 'whatever'][0] - - ju_read_url_get.assert_called_once_with( - 'http://api.brain-map.org/api/v2/data/query.json?q=model::Hemisphere') - open_mock.assert_called_once_with('/xyz/abc/example.csv', 'w') - dictwriter.return_value.writerow.assert_called() - read_csv.assert_called_once_with('/xyz/abc/example.csv', parse_dates=True) - assert not ju_write.called, 'json write should not have been called' - assert not ju_read.called, 'json read should not have been called' - - -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.core.json_utilities.read", return_value=_msg) -@patch("allensdk.core.json_utilities.read_url_get", return_value={'msg': _msg}) -@patch("pandas.read_csv", return_value=_csv_msg) -def test_cacheable_lazy_csv_file_exists(read_csv, ju_read_url_get, ju_read, - ju_write): - @cacheable() - def get_hemispheres(): - return RmaApi().model_query(model='Hemisphere') - - with patch('os.path.exists', MagicMock(return_value=True)) as ope: - df = get_hemispheres(path='/xyz/abc/example.csv', - strategy='lazy', - **Cache.cache_csv()) - - assert df.loc[:, 'whatever'][0] - - assert not ju_read_url_get.called - read_csv.assert_called_once_with('/xyz/abc/example.csv', parse_dates=True) - assert not ju_write.called, 'json write should not have been called' - assert not ju_read.called, 'json read should not have been called' diff --git a/allensdk/test/api/test_caching_utilities.py b/allensdk/test/api/test_caching_utilities.py deleted file mode 100644 index 96fc5bdf7c..0000000000 --- a/allensdk/test/api/test_caching_utilities.py +++ /dev/null @@ -1,263 +0,0 @@ -from functools import partial -import re -import os - -import pytest -import pandas as pd - -from allensdk.api.warehouse_cache import caching_utilities as cu - - -def get_data(): - return pd.DataFrame( - {"a": [1, 2, 3, 4], "b": ["duck", "kangaroo", "walrus", "ibex"]} - ) - - -def swapped_data(): - return pd.DataFrame( - {"b": [1, 2, 3, 4], "a": ["duck", "kangaroo", "walrus", "ibex"]} - ) - - -def write_to_dict(dc, data): - dc["data"] = data - - -def read_from_dict(dc): - return dc["data"] - - -class InitiallyFailing: - def __init__(self, succeed_at): - self.succeed_at = succeed_at - self.count = 0 - - def __call__(self, fn): - self.count += 1 - - if self.count >= self.succeed_at: - return fn() - else: - raise ValueError("foo!") - - -class InitiallyFailingWriter(InitiallyFailing): - def __call__(self, dc, data): - super(InitiallyFailingWriter, self).__call__(partial(write_to_dict, dc, data)) - - -class InitiallyFailingReader(InitiallyFailing): - def __call__(self, dc): - return super(InitiallyFailingReader, self).__call__(partial(read_from_dict, dc)) - - -class CallCountingCleanup: - def __init__(self): - self.count = 0 - - def __call__(self, dc): - self.count += 1 - dc.pop("data", None) - - -class CallCountingFetch: - def __init__(self): - self.count = 0 - - def __call__(self): - self.count += 1 - return get_data() - - -def swap(data): - data = data.copy() - tmp = data["a"] - data["a"] = data["b"] - data["b"] = tmp - return data - - -@pytest.mark.parametrize( - "existing,fetch,write,read,pre_write,cleanup,lazy,num_tries,failure_message,expected,expected_fetches,expected_cleanups", - [ - pytest.param( - False, - CallCountingFetch(), - write_to_dict, - InitiallyFailingReader(2), - swap, - CallCountingCleanup(), - True, - 1, - "", - swapped_data(), - 1, - 0, - id="simple case" - ), - pytest.param( - False, - CallCountingFetch(), - write_to_dict, - read_from_dict, - swap, - CallCountingCleanup(), - False, - 0, - "", - swapped_data(), - 1, - 0, - id="eager success case" - ), - pytest.param( - False, - CallCountingFetch(), - write_to_dict, - InitiallyFailingReader(3), - swap, - CallCountingCleanup(), - True, - 1, - "", - "raise", - 1, - 1, - id="lazy failure case" - ), - pytest.param( - False, - CallCountingFetch(), - InitiallyFailingWriter(10), - read_from_dict, - swap, - CallCountingCleanup(), - True, - 12, - "", - swapped_data(), - 10, - 9, - id="repeated failure case" - ), - pytest.param( - False, - CallCountingFetch(), - InitiallyFailingWriter(10), - read_from_dict, - swap, - CallCountingCleanup(), - True, - 12, - "bad news", - "warn", - 10, - 9, - id="warning case" - ), - pytest.param( - False, - CallCountingFetch(), - write_to_dict, - InitiallyFailingReader(2), - swap, - CallCountingCleanup(), - False, - 1, - "", - "raise", - 1, - 1, - id="eager failure case" - ), - pytest.param( - True, - CallCountingFetch(), - write_to_dict, - read_from_dict, - None, - CallCountingCleanup(), - True, - 1, - "", - get_data(), - 0, - 0, - id="existing data case" - ), - ], -) -def test_call_caching( - existing, - fetch, - write, - read, - pre_write, - cleanup, - lazy, - num_tries, - failure_message, - expected, - expected_fetches, - expected_cleanups, -): - - dc = {} - if existing: - write(dc, fetch()) - write.count = 0 - fetch.count = 0 - - write_fn = partial(write, dc) - read_fn = partial(read, dc) - cleanup_fn = partial(cleanup, dc) - - fn = partial( - cu.call_caching, - fetch, - write_fn, - read_fn, - pre_write, - cleanup_fn, - lazy, - num_tries, - failure_message - ) - - if isinstance(expected, str) and expected == "raise": - with pytest.raises(ValueError): - fn() - assert not ("data" in dc) - elif isinstance(expected, str) and expected == "warn": - with pytest.warns(UserWarning) as warning: - fn() - assert re.match(f".*{failure_message}.*", str(warning.pop().message)) is not None - else: - pd.testing.assert_frame_equal(expected, fn(), check_like=True, check_dtype=False) - - assert expected_fetches == fetch.count - assert expected_cleanups == cleanup.count - - -@pytest.mark.parametrize("existing", [True, False]) -def test_one_file_call_caching(tmpdir_factory, existing): - tmpdir = str(tmpdir_factory.mktemp("foo")) - path = os.path.join(tmpdir, "baz.csv") - - getter = get_data - data = getter() - - if existing: - data.to_csv(path, index=False) - getter = lambda: "foo" - - obtained = cu.one_file_call_caching( - path, - getter, - lambda path, df: df.to_csv(path, index=False), - lambda path: pd.read_csv(path), - num_tries=2 - ) - - pd.testing.assert_frame_equal(get_data(), obtained, check_like=True, check_dtype=False) diff --git a/allensdk/test/api/test_cell_types_api.py b/allensdk/test/api/test_cell_types_api.py deleted file mode 100644 index dc520c3b08..0000000000 --- a/allensdk/test/api/test_cell_types_api.py +++ /dev/null @@ -1,151 +0,0 @@ -import pytest, os -from mock import patch, mock_open, MagicMock -from allensdk.api.queries.cell_types_api import CellTypesApi - -@pytest.fixture -def mock_cells_api(): - return [ - { - 'cell_reporter_status': "fish", - 'csl__x': 1, - 'csl__y': 2, - 'csl__z': 3, - 'donor__species': 'taco', - 'specimen__id': 10, - 'specimen__name': 'joe', - 'structure__layer': 'fifteen', - 'structure_parent__id': 2, - 'structure_parent__acronym': 'ASAP', - 'line_name': 'bezier', - 'tag__dendrite_type': 'spikey', - 'tag__apical': 'stumpy', - 'nr__reconstruction_type': 'fancy', - 'donor__disease_state': 'influenza', - 'donor__id': 1, - 'specimen__hemisphere': 'hi', - 'csl__normalized_depth': 1 - },{ - - 'cell_reporter_status': "nofish", - 'csl__x': 1, - 'csl__y': 2, - 'csl__z': 3, - 'donor__species': 'taco', - 'specimen__id': 10, - 'specimen__name': 'joe', - 'structure__layer': 'fifteen', - 'structure_parent__id': 2, - 'structure_parent__acronym': 'ASAP', - 'line_name': 'bezier', - 'tag__dendrite_type': 'spikey', - 'tag__apical': 'stumpy', - 'nr__reconstruction_type': None, - 'donor__disease_state': None, - 'donor__id': 1, - 'specimen__hemisphere': 'hi', - 'csl__normalized_depth': 1 - } - ] - - -@pytest.fixture -def mock_cells(): - return [ - { - 'specimen_tags': [], - 'neuron_reconstructions': [], - 'data_sets': [], - 'donor': { - 'transgenic_lines': [], - 'organism': { 'name': CellTypesApi.MOUSE }, - 'conditions': [ { 'name': 'disease categories - influenza' } ] - } - }, - { - 'specimen_tags': [], - 'neuron_reconstructions': [], - 'data_sets': [ {} ], - 'donor': { - 'transgenic_lines': [ { 'transgenic_line_type_name': 'driver', 'name': 'fish' } ], - 'organism': { 'name': 'fish' } - } - }, - { - 'specimen_tags': [], - 'neuron_reconstructions': [ {} ], - 'data_sets': [], - 'cell_reporter': { 'name': 'bob' }, - 'donor': { - 'transgenic_lines': [], - 'organism': { 'name': CellTypesApi.HUMAN }, - 'conditions': [ { 'name': 'disease categories - cheese' } ] - } - }, - ] - -@pytest.fixture -def cell_types_api(): - endpoint = None - - if 'TEST_API_ENDPOINT' in os.environ: - endpoint = os.environ['TEST_API_ENDPOINT'] - return CellTypesApi(endpoint) - else: - return None - - -@pytest.mark.requires_api_endpoint -def test_list_cells_unmocked(cell_types_api): - from allensdk.config import enable_console_log - enable_console_log() - - # this test will always require the latest warehouse - cells = cell_types_api.list_cells() - - -def test_list_cells_mocked(mock_cells): - with patch.object(CellTypesApi, "model_query", return_value=mock_cells): - ctapi = CellTypesApi() - - cells = ctapi.list_cells() - assert len(cells) == 3 - - flu_cells = [ cell for cell in cells if cell['disease_categories'] == [('influenza')] ] - assert len(flu_cells) == 1 - - cells = ctapi.list_cells(require_reconstruction=True) - assert len(cells) == 1 - - cells = ctapi.list_cells(require_morphology=True) - assert len(cells) == 1 - - cells = ctapi.list_cells(reporter_status=['bob']) - assert len(cells) == 1 - - cells = ctapi.list_cells(species=['HOMO SAPIENS']) - assert len(cells) == 1 - - cells = ctapi.list_cells(species=['mus musculus']) - assert len(cells) == 1 - -def test_list_cells_api_mocked(mock_cells_api): - with patch.object(CellTypesApi, "model_query", return_value=mock_cells_api): - ctapi = CellTypesApi() - - cells = ctapi.list_cells_api() - assert len(cells) == 2 - - fcells = ctapi.filter_cells_api(cells, require_reconstruction=True) - assert len(fcells) == 1 - - fcells = ctapi.filter_cells_api(cells, require_morphology=True) - assert len(fcells) == 1 - - fcells = ctapi.filter_cells_api(cells, species=['taco']) - assert len(fcells) == 2 - - fcells = ctapi.filter_cells_api(cells, reporter_status=['fish']) - assert len(fcells) == 1 - - - diff --git a/allensdk/test/api/test_file_download.py b/allensdk/test/api/test_file_download.py deleted file mode 100644 index 3241bba1be..0000000000 --- a/allensdk/test/api/test_file_download.py +++ /dev/null @@ -1,228 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import Mock, patch -from allensdk.api.warehouse_cache.cache import cacheable, Cache -from allensdk.config.manifest import Manifest -import allensdk.core.json_utilities as ju -import pandas.io.json as pj -import pandas as pd -from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi as MCA - - -try: - import StringIO -except: - import io as StringIO - - -@pytest.fixture -def mca(): - return MCA() - - -@pytest.fixture -def cache(): - return Cache() - - -@pytest.mark.parametrize("file_exists", (True, False)) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch.object(Manifest, 'safe_mkdir') -def test_file_download_lazy(nrrd_read, safe_mkdir, mca, cache, file_exists): - with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: - @cacheable(strategy='lazy', - reader=nrrd_read, - pathfinder=Cache.pathfinder(file_name_position=3, - secondary_file_name_position=1)) - def download_volumetric_data(data_path, - file_name, - voxel_resolution=None, - save_file_path=None, - release=None, - coordinate_framework=None): - url = mca.build_volumetric_data_download_url(data_path, - file_name, - voxel_resolution, - release, - coordinate_framework) - - mca.retrieve_file_over_http(url, save_file_path) - - with patch('os.path.exists', - Mock(name="os.path.exists", - return_value=file_exists)) as mkdir: - nrrd_read.reset_mock() - download_volumetric_data(MCA.AVERAGE_TEMPLATE, - 'annotation_10.nrrd', - MCA.VOXEL_RESOLUTION_10_MICRONS, - 'volumetric.nrrd', - MCA.CCF_2016, - strategy='lazy') - - if file_exists: - assert not mock_retrieve.called, 'server call not needed when file exists' - else: - mock_retrieve.assert_called_once_with( - 'http://download.alleninstitute.org/informatics-archive/annotation/ccf_2016/mouse_ccf/average_template/annotation_10.nrrd', - 'volumetric.nrrd') - assert not safe_mkdir.called, 'safe_mkdir should not have been called.' - nrrd_read.assert_called_once_with('volumetric.nrrd') - - -@pytest.mark.parametrize("file_exists", (True, False)) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch.object(Manifest, 'safe_mkdir') -def test_file_download_server(nrrd_read, safe_mkdir, mca, cache, file_exists): - with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: - @cacheable(reader=nrrd_read, - pathfinder=Cache.pathfinder(file_name_position=3, - secondary_file_name_position=1)) - def download_volumetric_data(data_path, - file_name, - voxel_resolution=None, - save_file_path=None, - release=None, - coordinate_framework=None): - url = mca.build_volumetric_data_download_url(data_path, - file_name, - voxel_resolution, - release, - coordinate_framework) - - mca.retrieve_file_over_http(url, save_file_path) - - with patch('os.path.exists', - Mock(name="os.path.exists", - return_value=file_exists)) as mkdir: - nrrd_read.reset_mock() - - download_volumetric_data(MCA.AVERAGE_TEMPLATE, - 'annotation_10.nrrd', - MCA.VOXEL_RESOLUTION_10_MICRONS, - 'volumetric.nrrd', - MCA.CCF_2016, - strategy='create') - - mock_retrieve.assert_called_once_with( - 'http://download.alleninstitute.org/informatics-archive/annotation/ccf_2016/mouse_ccf/average_template/annotation_10.nrrd', - 'volumetric.nrrd') - assert not safe_mkdir.called, 'safe_mkdir should not have been called.' - nrrd_read.assert_called_once_with('volumetric.nrrd') - - -@pytest.mark.parametrize("file_exists", (True, False)) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch.object(Manifest, 'safe_mkdir') -def test_file_download_cached_file(nrrd_read, safe_mkdir, mca, cache, file_exists): - with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: - @cacheable(reader=nrrd_read, - pathfinder=Cache.pathfinder(file_name_position=3, - secondary_file_name_position=1)) - def download_volumetric_data(data_path, - file_name, - voxel_resolution=None, - save_file_path=None, - release=None, - coordinate_framework=None): - url = mca.build_volumetric_data_download_url(data_path, - file_name, - voxel_resolution, - release, - coordinate_framework) - - mca.retrieve_file_over_http(url, save_file_path) - - with patch('os.path.exists', - Mock(name="os.path.exists", - return_value=file_exists)) as mkdir: - nrrd_read.reset_mock() - - download_volumetric_data(MCA.AVERAGE_TEMPLATE, - 'annotation_10.nrrd', - MCA.VOXEL_RESOLUTION_10_MICRONS, - 'volumetric.nrrd', - MCA.CCF_2016, - strategy='file') - - assert not mock_retrieve.called, 'server should not have been called' - assert not safe_mkdir.called, 'safe_mkdir should not have been called.' - nrrd_read.assert_called_once_with('volumetric.nrrd') - - -@pytest.mark.parametrize("file_exists", (True, False)) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch.object(Manifest, 'safe_mkdir') -def test_file_kwarg(nrrd_read, safe_mkdir, mca, cache, file_exists): - with patch.object(mca, "retrieve_file_over_http") as mock_retrieve: - @cacheable(reader=nrrd_read, - pathfinder=Cache.pathfinder(file_name_position=3, - secondary_file_name_position=1, - path_keyword='save_file_path')) - def download_volumetric_data(data_path, - file_name, - voxel_resolution=None, - save_file_path=None, - release=None, - coordinate_framework=None): - url = mca.build_volumetric_data_download_url(data_path, - file_name, - voxel_resolution, - release, - coordinate_framework) - - mca.retrieve_file_over_http(url, save_file_path) - - with patch('os.path.exists', - Mock(name="os.path.exists", - return_value=file_exists)) as mkdir: - nrrd_read.reset_mock() - - download_volumetric_data(MCA.AVERAGE_TEMPLATE, - 'annotation_10.nrrd', - MCA.VOXEL_RESOLUTION_10_MICRONS, - 'volumetric.nrrd', - MCA.CCF_2016, - strategy='file', - save_file_path='file.nrrd' ) - - assert not mock_retrieve.called, 'server should not have been called' - assert not safe_mkdir.called, 'safe_mkdir should not have been called.' - nrrd_read.assert_called_once_with('file.nrrd') diff --git a/allensdk/test/api/test_glif_api.py b/allensdk/test/api/test_glif_api.py deleted file mode 100644 index 1d464040de..0000000000 --- a/allensdk/test/api/test_glif_api.py +++ /dev/null @@ -1,131 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.api.queries.glif_api import GlifApi -import numpy as np -import pytest -import os - - -@pytest.fixture -def neuronal_model_id(): - return 566283950 - - -@pytest.fixture -def specimen_id(): - return 325464516 - - -@pytest.fixture -def glif_api(): - endpoint = None - - if 'TEST_API_ENDPOINT' in os.environ: - endpoint = os.environ['TEST_API_ENDPOINT'] - return GlifApi(endpoint) - else: - return None - - -@pytest.mark.requires_api_endpoint -@pytest.mark.todo_flaky -def test_get_neuronal_model_templates(glif_api): - - assert len(glif_api.get_neuronal_model_templates()) == 7 - - for template in glif_api.get_neuronal_model_templates(): - - if template['id'] == 329230710: - assert 'perisomatic' in template['name'] - elif template['id'] == 395310498: - assert '(LIF-R-ASC-A)' in template['name'] - elif template['id'] == 395310469: - assert '(LIF)' in template['name'] - elif template['id'] == 395310475: - assert '(LIF-ASC)' in template['name'] - elif template['id'] == 395310479: - assert '(LIF-R)' in template['name'] - elif template['id'] == 471355161: - assert '(LIF-R-ASC)' in template['name'] - elif template['id'] == 491455321: - assert 'Biophysical - all active' in template['name'] - else: - raise Exception('Unrecognized template: %s (%s)' % (template['id'], template['name'])) - - -@pytest.mark.requires_api_endpoint -def test_get_neuronal_models(glif_api, specimen_id): - - cells = glif_api.get_neuronal_models([specimen_id]) - - assert len(cells) == 1 - assert len(cells[0]['neuronal_models']) == 2 - -@pytest.mark.requires_api_endpoint -def test_get_neuronal_models_no_ids(glif_api): - cells = glif_api.get_neuronal_models() - assert len(cells) > 0 - - -@pytest.mark.requires_api_endpoint -def test_get_neuron_configs(glif_api, specimen_id): - model = glif_api.get_neuronal_models([specimen_id]) - - neuronal_model_ids = [nm['id'] for nm in model[0]['neuronal_models']] - assert set(neuronal_model_ids) == set((566283950, 566283946)) - - test_id = 566283950 - - np.testing.assert_almost_equal(glif_api.get_neuron_configs([test_id])[test_id]['th_inf'], 0.024561992461740227) - -@pytest.mark.requires_api_endpoint -@pytest.mark.todo_flaky -def test_deprecated(fn_temp_dir, glif_api, neuronal_model_id): - - # Exercising deprecated functionality - len(glif_api.list_neuronal_models()) - - glif_api.get_neuronal_model(neuronal_model_id) - - glif_api.get_neuronal_model(neuronal_model_id) - print(glif_api.get_ephys_sweeps()) - - glif_api.get_neuronal_model(neuronal_model_id) - x = glif_api.get_neuron_config() - - nwb_path = os.path.join(fn_temp_dir, 'tmp.nwb') - glif_api.get_neuronal_model(neuronal_model_id) - glif_api.cache_stimulus_file(nwb_path) diff --git a/allensdk/test/api/test_grid_data_api.py b/allensdk/test/api/test_grid_data_api.py deleted file mode 100644 index ad0f9078da..0000000000 --- a/allensdk/test/api/test_grid_data_api.py +++ /dev/null @@ -1,163 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import MagicMock, patch -from allensdk.api.queries.grid_data_api import GridDataApi - - -@pytest.fixture -def grid_data(): - gda = GridDataApi() - gda.retrieve_file_over_http = \ - MagicMock(name='retrieve_file_over_http') - - return gda - - -def test_download_gene_expression_grid_data(grid_data): - - path = '69816930/density.mhd' - section_data_set_id = 69816930 - volume_type = 'density' - - grid_data.download_gene_expression_grid_data(section_data_set_id, volume_type, path) - expected = 'http://api.brain-map.org/grid_data/download/69816930?include=density' - grid_data.retrieve_file_over_http.assert_called_once_with(expected, path, zipped=True) - - -def test_api_doc_url_download_expression_grid(grid_data): - '''Url to download the 200um density volume - for the Mouse Brain Atlas SectionDataSet 69816930. - - Notes - ----- - See `Downloading 3-D Expression Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DEXPRESSIONGRIDDATA>`_ - , example 'Download the 200um density volume for the Mouse Brain Atlas SectionDataSet 69816930'. - ''' - path = '69816930.zip' - section_data_set_id = 69816930 - grid_data.download_expression_grid_data(section_data_set_id) - expected = 'http://api.brain-map.org/grid_data/download/69816930' - grid_data.retrieve_file_over_http.assert_called_once_with(expected, path) - - -def test_api_doc_url_download_expression_grid_energy_intensity(grid_data): - '''Url to download the 200um energy and intensity volumes for Mouse Brain Atlas SectionDataSet 69816930. - - Notes - ----- - See `Downloading 3-D Expression Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DEXPRESSIONGRIDDATA>`_ - , example 'Download the 200um energy and intensity volumes for Mouse Brain Atlas SectionDataSet 69816930'. - - The id in the example url doesn't match the caption. - ''' - path = '183282970.zip' - section_data_set_id = 183282970 - include = ['energy', 'intensity'] - grid_data.download_expression_grid_data(section_data_set_id, - include=include) - - grid_data.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/grid_data/download/183282970" - "?include=energy,intensity", - path) - - -def test_api_doc_url_projection_grid(grid_data): - '''Url to download the 100um density volume for the Mouse Connectivity Atlas SectionDataSet 181777177. - - Notes - ----- - See `Downloading 3-D Projection Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DPROJECTIONGRIDDATA>`_ - , example 'Download the 100um density volume for the Mouse Connectivity Atlas SectionDataSet 181777177'. - ''' - path = '181777177.nrrd' - section_data_set_id = 181777177 - grid_data.download_projection_grid_data(section_data_set_id) - expected = 'http://api.brain-map.org/grid_data/download_file/181777177' - grid_data.retrieve_file_over_http.assert_called_once_with(expected, path) - - -def test_api_doc_url_projection_grid_injection_fraction_resolution(grid_data): - '''Url to download the 25um injection_fraction volume for Mouse Connectivity Atlas SectionDataSet 181777177. - - Notes - ----- - See `Downloading 3-D Projection Grid Data <http://help.brain-map.org/display/api/Downloading+3-D+Expression+Grid+Data#Downloading3-DExpressionGridData-DOWNLOADING3DPROJECTIONGRIDDATA>`_ - , example 'Download the 25um injection_fraction volume for Mouse Connectivity Atlas SectionDataSet 181777177'. - ''' - section_data_set_id = 181777177 - path = 'id.nrrd' - grid_data.download_projection_grid_data(section_data_set_id, - [grid_data.INJECTION_FRACTION], - resolution=25, - save_file_path=path) - - grid_data.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/grid_data/download_file/181777177" - "?image=injection_fraction&resolution=25", - path) - - -def test_download_deformation_field(grid_data): - grid_data.model_query = MagicMock( - name='model_query', - return_value=[ - {'well_known_file_type': {'name': 'DeformationFieldHeader'}, 'id': 123}, - {'well_known_file_type': {'name': 'DeformationFieldVoxels'}, 'id': 456} - ] - ) - - grid_data.download_deformation_field(789) - - grid_data.retrieve_file_over_http.assert_any_call('http://api.brain-map.org/api/v2/well_known_file_download/123', '789_dfmfld.mhd') - grid_data.retrieve_file_over_http.assert_any_call('http://api.brain-map.org/api/v2/well_known_file_download/456', '789_dfmfld.raw') - - -def test_download_alignment3d(grid_data): - grid_data.json_msg_query = MagicMock( - name='json_msg_query', - return_value=[{'alignment3d': 'foo'}] - ) - - obtained = grid_data.download_alignment3d(123) - assert 'foo' == obtained - grid_data.json_msg_query.assert_called_once_with(( - 'http://api.brain-map.org/api/v2/data/query.json?q=' - 'model::SectionDataSet[id$eq123],' - 'rma::include,alignment3d,' - 'rma::options[num_rows$eq\'all\'][count$eqfalse]' - )) diff --git a/allensdk/test/api/test_image_download_api.py b/allensdk/test/api/test_image_download_api.py deleted file mode 100644 index a5cee52ce7..0000000000 --- a/allensdk/test/api/test_image_download_api.py +++ /dev/null @@ -1,611 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import MagicMock -import numpy as np -from allensdk.api.queries.image_download_api import ImageDownloadApi - - -@pytest.fixture -def image_api(): - image_api = ImageDownloadApi() - - image_api.retrieve_file_over_http = \ - MagicMock(name='retrieve_file_over_http') - image_api.json_msg_query = MagicMock(name='json_msg_query') - - return image_api - -def test_get_section_image_ranges(image_api): - - section_image_ids = [126862575, 297225768] - image_api.get_section_image_ranges(section_image_ids) - - image_api.json_msg_query.assert_called_once_with('http://api.brain-map.org/api/v2/data/query.json?q=model::Equalization,' - 'rma::criteria,section_data_set(section_images[id$in126862575,297225768]),' - 'rma::options[only$eq\'blue_lower,blue_upper,red_lower,red_upper,green_lower,green_upper\']' - '[num_rows$eq\'all\'][count$eqfalse]') - -def test_get_section_data_sets_by_product(image_api): - - product_ids = [10, 22] - image_api.get_section_data_sets_by_product(product_ids) - - image_api.json_msg_query.assert_called_once_with('http://api.brain-map.org/api/v2/data/query.json?'\ - 'q=model::SectionDataSet,'\ - 'rma::criteria,[failed$in\'false\'],products[id$in10,22],'\ - 'rma::options[num_rows$eq\'all\'][count$eqfalse]') - -def test_get_section_data_sets_by_product_failedok(image_api): - - product_ids = [10, 22] - image_api.get_section_data_sets_by_product(product_ids, include_failed=True) - - image_api.json_msg_query.assert_called_once_with('http://api.brain-map.org/api/v2/data/query.json?'\ - 'q=model::SectionDataSet,'\ - 'rma::criteria,[failed$in\'false\',\'true\'],products[id$in10,22],'\ - 'rma::options[num_rows$eq\'all\'][count$eqfalse]') - -def test_get_section_image_ranges_as_list(image_api): - - image_api.template_query = MagicMock(return_value=[{'blue_lower': 0, 'blue_upper': 1, 'green_lower': 2, 'green_upper': 3, 'red_lower': 4, 'red_upper': 5}]) - obt = image_api.get_section_image_ranges([1]) - - assert(np.allclose( [4, 5, 2, 3, 0, 1], obt[0] )) - -def test_api_doc_url_download_section_image_downsampled(image_api): - ''' - Notes - ----- - See: `Experimental Overview and Metadata `<http://help.brain-map.org/display/mouseconnectivity/API#API-ExperimentalOverviewandMetadata>_ - , link labeled 'Download image downsampled by factor of 6 using default thresholds'. - ''' - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - range=[0, 932, 0, 1279, 0, 4095]) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&range=0,932,0,1279,0,4095", - path) - - -def test_api_doc_url_download_section_image_downsample_dimensions(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - downsample_dimensions=True) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&downsample_dimensions=true", - path) - - -def test_api_doc_url_download_section_image_full_res(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575", - path) - - -def test_api_doc_url_download_section_image_downsample_dimensions_false(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - downsample_dimensions=False) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&downsample_dimensions=false", - path) - - -def test_api_doc_url_download_section_image_downsampled_low_quality(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=3, - quality=50) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=3&quality=50", - path) - - -def test_api_doc_url_download_section_image_tumor_feature_annotation(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - tumor_feature_annotation=True) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&tumor_feature_annotation=true", - path) - - -def test_api_doc_url_download_section_image_tumor_feature_annotation_false(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - tumor_feature_annotation=False) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&tumor_feature_annotation=false", - path) - - -def test_api_doc_url_download_section_image_tumor_feature_boundary(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - tumor_feature_boundary=True) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&tumor_feature_boundary=true", - path) - - -def test_api_doc_url_download_section_image_tumor_feature_boundary_false(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - tumor_feature_boundary=False) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&tumor_feature_boundary=false", - path) - - -def test_api_doc_url_download_section_image_expression(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - expression=True) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&expression=true", - path) - - -def test_api_doc_url_download_section_image_expression_false(image_api): - path = '126862575.jpg' - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - downsample=6, - expression=False) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/126862575" - "?downsample=6&expression=false", - path) - - -def test_api_doc_url_download_atlas_image_downsampled(image_api): - path = '100883869.jpg' - - section_image_id = 100883869 - image_api.download_atlas_image(section_image_id, - downsample=4) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/atlas_image_download/100883869" - "?downsample=4", - path) - - -def test_api_doc_url_download_atlas_image_downsampled_low_quality(image_api): - path = '100883869.jpg' - - section_image_id = 100883869 - image_api.download_atlas_image(section_image_id, - downsample=4, - quality=50) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/atlas_image_download/100883869" - "?downsample=4&quality=50", - path) - - -def test_api_doc_url_download_atlas_image_annotation(image_api): - path = '100883869.jpg' - - section_image_id = 100883869 - image_api.download_atlas_image(section_image_id, - downsample=4, - annotation=True) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/atlas_image_download/100883869" - "?downsample=4&annotation=true", - path) - - -def test_api_doc_url_download_atlas_image_annotation_false(image_api): - path = '100883869.jpg' - - section_image_id = 100883869 - image_api.download_atlas_image(section_image_id, - downsample=4, - annotation=False) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/atlas_image_download/100883869" - "?downsample=4&annotation=false", - path) - - -def test_api_doc_url_download_atlas_image_atlas(image_api): - path = '100883869.jpg' - - section_image_id = 100883869 - image_api.download_atlas_image(section_image_id, - downsample=4, - annotation=True, - atlas=2) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/atlas_image_download/100883869" - "?downsample=4&annotation=true&atlas=2", - path) - - -def test_api_doc_url_download_atlas_full_resolution_region_of_interest(image_api): - path = '100883869.jpg' - - subimage_id = 100883869 - image_api.download_atlas_image(subimage_id, - left=6174, - top=2282, - width=1000, - height=1000) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/atlas_image_download/100883869" - "?left=6174&top=2282&width=1000&height=1000", - path) - - -def test_api_doc_url_download_projection_image_downsampled(image_api): - path = '126862583.jpg' - - section_image_id = 126862583 - image_api.download_projection_image(section_image_id, - downsample=4) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/projection_image_download/126862583" - "?downsample=4", - path) - - -def test_api_doc_url_download_projection_image_projection(image_api): - path = '126862583.jpg' - - section_image_id = 126862583 - image_api.download_projection_image(section_image_id, - downsample=4, - projection=True) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/projection_image_download/126862583" - "?downsample=4&projection=true", - path) - - -def test_api_doc_url_download_projection_image_projection_false(image_api): - path = '126862583.jpg' - - section_image_id = 126862583 - image_api.download_projection_image(section_image_id, - downsample=4, - projection=False) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/projection_image_download/126862583" - "?downsample=4&projection=false", - path) - - -def test_api_doc_url_download_projection_image_view(image_api): - path = '126862583.jpg' - - section_image_id = 126862583 - image_api.download_projection_image(section_image_id, - downsample=4, - view='projection') - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/projection_image_download/126862583" - "?downsample=4&view=projection", - path) - - -def test_api_doc_url_download_projection_image_view_exception(image_api): - path = '126862583.jpg' - - section_image_id = 126862583 - - with pytest.raises(ValueError) as excinfo: - image_api.download_projection_image(section_image_id, - downsample=4, - view='typo') - - assert excinfo.value.args[0] == "view argument should be 'expression', 'projection', 'tumor_feature_annotation' or 'tumor_feature_boundary'" - - -def test_api_doc_url_download_image_downsampled(image_api): - ''' - Notes - ----- - See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ - ''' - path = '69750516.jpg' - - subimage_id = 69750516 - image_api.download_image(subimage_id, - downsample=4) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/image_download/69750516" - "?downsample=4", - path) - - -def test_api_doc_url_download_image_downsampled_low_quality(image_api): - ''' - Notes - ----- - See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ - ''' - path = '69750516.jpg' - - subimage_id = 69750516 - image_api.download_image(subimage_id, - downsample=3, - quality=50) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/image_download/69750516" - "?downsample=3&quality=50", - path) - - -def test_api_doc_url_download_full_resolution_region_of_interest(image_api): - ''' - Notes - ----- - See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ - ''' - path = '69750516.jpg' - - subimage_id = 69750516 - image_api.download_image(subimage_id, - left=6174, - top=2282, - width=1000, - height=1000) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/image_download/69750516" - "?left=6174&top=2282&width=1000&height=1000", - path) - - -def test_api_doc_url_download_image_expression_mask(image_api): - ''' - Notes - ----- - See: `Image Download Service `<http://help.brain-map.org/display/api/Downloading+an+Image>_ - ''' - path = '69750516.jpg' - - subimage_id = 69750516 - image_api.download_image(subimage_id, - downsample=4, - view='expression') - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/image_download/69750516" - "?downsample=4&view=expression", - path) - - -def test_api_doc_url_download_image_full_resolution(image_api): - ''' - Notes - ----- - See: `Experimental Overview and Metadata `<http://help.brain-map.org/display/mouseconnectivity/API#API-ExperimentalOverviewandMetadata>_ - , link labeled 'Download a region of interest at full resolution using default thresholds'. - ''' - expected = 'http://api.brain-map.org/api/v2/section_image_download/126862575?range=0,932,0,1279,0,4095&left=19045&top=11684&width=1000&height=1000' - path = '126862575.jpg' - - image_api.retrieve_file_over_http = \ - MagicMock(name='retrieve_file_over_http') - - section_image_id = 126862575 - image_api.download_section_image(section_image_id, - left=19045, - top=11684, - width=1000, - height=1000, - range=[0, 932, 0, 1279, 0, 4095]) - - image_api.retrieve_file_over_http.assert_called_once_with(expected, path) - - -def test_colormap_filter(image_api): - ''' - ''' - path = '70636013.jpg' - - section_image_id = 70636013 - image_api.download_section_image(section_image_id, - downsample=4, - view='expression', - colormap=(0.9,"expression")) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/70636013" - "?downsample=4&colormap=0.5,0.9,0,256,4&view=expression", - path) - - -def test_colormap_filter_string(image_api): - ''' - ''' - path = '70636013.jpg' - - section_image_id = 70636013 - image_api.download_section_image(section_image_id, - downsample=4, - view='expression', - colormap="expression") - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/70636013" - "?downsample=4&colormap=expression&view=expression", - path) - - - -def test_rgb_filter(image_api): - ''' - ''' - path = '70636013.jpg' - - section_image_id = 70636013 - image_api.download_section_image(section_image_id, - downsample=4, - view='expression', - rgb=[0.25,0.5,1]) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/70636013" - "?downsample=4&rgb=0.25,0.5,1&view=expression", - path) - - -def test_contrast_filter(image_api): - ''' - ''' - path = '70636013.jpg' - - section_image_id = 70636013 - image_api.download_section_image(section_image_id, - downsample=4, - view='expression', - contrast=[0.5,1]) - - image_api.retrieve_file_over_http.assert_called_once_with( - "http://api.brain-map.org/api/v2/section_image_download/70636013" - "?downsample=4&contrast=0.5,1&view=expression", - path) - - -def test_atlas_image_query(image_api): - expected = "http://api.brain-map.org/api/v2/data/query.json?q=" + \ - "model::Atlas,rma::criteria,[id$eq1]," + \ - "rma::options[only$eqimage_type]," + \ - "pipe::list[type_name$is'image_type']," + \ - "model::AtlasImage,rma::criteria,[annotated$eqtrue]," + \ - "atlas_data_set(atlases[id$eq1])," + \ - "alternate_images[image_type$eq$type_name]," + \ - "rma::options[num_rows$eq'all']" + \ - "[order$eqsub_images.section_number]" - - adult_mouse_atlas_id = 1 - image_api.atlas_image_query(adult_mouse_atlas_id) - - image_api.json_msg_query.assert_called_once_with(expected) - - -def test_atlas_image_query_image_type_name(image_api): - expected = "http://api.brain-map.org/api/v2/data/query.json?q=" + \ - "model::AtlasImage,rma::criteria,[annotated$eqtrue]," + \ - "atlas_data_set(atlases[id$eq1])," + \ - "alternate_images[image_type$eq'Atlas - Adult Mouse']," + \ - "rma::options[num_rows$eq'all']" + \ - "[order$eqsub_images.section_number]" - - adult_mouse_atlas_id = 1 - adult_mouse_image_type_name = 'Atlas - Adult Mouse' - image_api.atlas_image_query(adult_mouse_atlas_id, - image_type_name=adult_mouse_image_type_name) - - image_api.json_msg_query.assert_called_once_with(expected) - - -def test_section_image_query(image_api): - - exp = 'http://api.brain-map.org/api/v2/data/query.json?'\ - 'q=model::SectionImage,'\ - 'rma::criteria,[data_set_id$eq70813257],'\ - 'rma::options[num_rows$eq\'all\'][count$eqfalse]' - - image_api.section_image_query(70813257) - image_api.json_msg_query.assert_called_once_with(exp) diff --git a/allensdk/test/api/test_mouse_atlas_api.py b/allensdk/test/api/test_mouse_atlas_api.py deleted file mode 100644 index 61f7992fa0..0000000000 --- a/allensdk/test/api/test_mouse_atlas_api.py +++ /dev/null @@ -1,103 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2018. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from mock import MagicMock, patch -import pytest - -from allensdk.api.queries.mouse_atlas_api import MouseAtlasApi as MAA - - - -@pytest.fixture -def atlas(): - maa = MAA() - return maa - - -@patch.object(MAA, "json_msg_query") -def test_get_genes(mock_query, atlas): - - expected = 'http://api.brain-map.org/api/v2/data/query.json?'\ - 'q=model::Gene,rma::criteria,[organism_id$in2],rma::include,chromosome,'\ - 'rma::options[num_rows$eq2000][start_row$eq0][order$eq\'id\'][count$eqfalse]' - - for result in atlas.get_genes(): - pass - - mock_query.assert_called_once_with(expected) - - -@patch.object(MAA, "json_msg_query") -def test_get_section_data_sets(mock_query, atlas): - - expected = 'http://api.brain-map.org/api/v2/data/query.json?'\ - 'q=model::SectionDataSet,rma::criteria,products[id$in1],rma::include,genes,'\ - 'rma::options[num_rows$eq2000][start_row$eq0][order$eq\'id\'][count$eqfalse]' - - for result in atlas.get_section_data_sets(): - pass - - mock_query.assert_called_once_with(expected) - - -def test_download_expression_density(atlas): - with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: - with pytest.raises(RuntimeError): - atlas.download_expression_density('file.name', 12345) - - gda.assert_called_once_with( - 'http://api.brain-map.org/grid_data/download/'\ - '12345?include=density') - - -def test_download_expression_intensity(atlas): - with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: - with pytest.raises(RuntimeError): - atlas.download_expression_intensity('file.name', 12345) - - gda.assert_called_once_with( - 'http://api.brain-map.org/grid_data/download/'\ - '12345?include=intensity') - - -def test_download_expression_energy(atlas): - with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: - with pytest.raises(RuntimeError): - atlas.download_expression_energy('file.name', 12345) - - gda.assert_called_once_with( - 'http://api.brain-map.org/grid_data/download/'\ - '12345?include=energy') diff --git a/allensdk/test/api/test_mouse_connectivity_api.py b/allensdk/test/api/test_mouse_connectivity_api.py deleted file mode 100644 index 8df26e1a6c..0000000000 --- a/allensdk/test/api/test_mouse_connectivity_api.py +++ /dev/null @@ -1,461 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import pytest -from mock import patch, Mock -import itertools as it -import numpy as np -from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi as MCA - -MOCK_ANNOTATION_DATA = 'mock_annotation_data' -MOCK_ANNOTATION_IMAGE = 'mock_annotation_image' -DOWNLOAD_LINK = '/path/to/link' - - -@pytest.fixture -def connectivity(): - mca = MCA() - - return mca - - -def CCF_VERSIONS(): - return [MCA.CCF_2015, - MCA.CCF_2016] - - -def DATA_PATHS(): - return [MCA.AVERAGE_TEMPLATE, - MCA.ARA_NISSL, - MCA.MOUSE_2011, - MCA.DEVMOUSE_2012, - MCA.CCF_2015, - MCA.CCF_2016] - - -def RESOLUTIONS(): - return [MCA.VOXEL_RESOLUTION_10_MICRONS, - MCA.VOXEL_RESOLUTION_25_MICRONS, - MCA.VOXEL_RESOLUTION_50_MICRONS, - MCA.VOXEL_RESOLUTION_100_MICRONS] - - -@pytest.mark.parametrize("data_path,resolution", - it.product(DATA_PATHS(), - RESOLUTIONS())) -@patch.object(MCA, "retrieve_file_over_http") -def test_download_volumetric_data(mock_retrieve, - connectivity, - data_path, - resolution): - cache_filename = "annotation_%d.nrrd" % (resolution) - - connectivity.download_volumetric_data(data_path, - cache_filename, - resolution) - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/%s/annotation_%d.nrrd" % - (data_path, - resolution), - cache_filename) - - -@pytest.mark.parametrize("ccf_version,resolution", - it.product(CCF_VERSIONS(), - RESOLUTIONS())) -@patch.object(MCA, "retrieve_file_over_http") -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_annotation_volume(os_makedirs, - nrrd_read, - mock_retrieve, - connectivity, - ccf_version, - resolution): - cache_file = '/path/to/annotation_%d.nrrd' % (resolution) - - connectivity.download_annotation_volume( - ccf_version, - resolution, - cache_file, - reader=nrrd_read) - - nrrd_read.assert_called_once_with(cache_file) - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/%s/annotation_%d.nrrd" % - (ccf_version, - resolution), - "/path/to/annotation_%d.nrrd" % (resolution)) - - os_makedirs.assert_any_call('/path/to') - - -@pytest.mark.parametrize("resolution", - RESOLUTIONS()) -@patch.object(MCA, "retrieve_file_over_http") -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_annotation_volume_default(os_makedirs, - nrrd_read, - mock_retrieve, - connectivity, - resolution): - a, b = connectivity.download_annotation_volume( - None, - resolution, - '/path/to/annotation_%d.nrrd' % (resolution), - reader=nrrd_read) - - assert a - assert b - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/%s/annotation_%d.nrrd" % - (MCA.CCF_VERSION_DEFAULT, - resolution), - "/path/to/annotation_%d.nrrd" % (resolution)) - - os_makedirs.assert_any_call('/path/to') - - -@pytest.mark.parametrize("resolution", - RESOLUTIONS()) -@patch.object(MCA, "retrieve_file_over_http") -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_structure_mask(os_makedirs, - nrrd_read, - mock_retrieve, - connectivity, - resolution): - - structure_id = 12 - - a, b = connectivity.download_structure_mask(structure_id, - None, - resolution,'/path/to/foo.nrrd', - reader=nrrd_read) - - assert a - assert b - - expected = 'http://download.alleninstitute.org/informatics-archive/'\ - 'current-release/mouse_ccf/{0}/structure_masks/'\ - 'structure_masks_{1}/structure_{2}.nrrd'.format(MCA.CCF_VERSION_DEFAULT, - resolution, - structure_id) - mock_retrieve.assert_called_once_with(expected, '/path/to/foo.nrrd') - os_makedirs.assert_any_call('/path/to') - - -@pytest.mark.parametrize("resolution", - RESOLUTIONS()) -@patch.object(MCA, "retrieve_file_over_http") -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_template_volume(os_makedirs, - nrrd_read, - mock_retrieve, - connectivity, - resolution): - connectivity.download_template_volume( - resolution, - '/path/to/average_template_%d.nrrd' % (resolution), - reader=nrrd_read) - - nrrd_read.assert_called_once_with('/path/to/average_template_%d.nrrd' % (resolution)) - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/average_template/average_template_%d.nrrd" % - (resolution), - "/path/to/average_template_%d.nrrd" % (resolution)) - - os_makedirs.assert_any_call('/path/to') - - -@patch.object(MCA, "json_msg_query") -def test_get_experiments_no_ids(mock_query, - connectivity): - connectivity.get_experiments(None) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::SectionDataSet,rma::criteria,[failed$eqfalse]," - "products[id$in5,31]") - - -@patch.object(MCA, "json_msg_query") -def test_get_experiments_one_id(mock_query, - connectivity): - connectivity.get_experiments(987) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::SectionDataSet,rma::criteria,[failed$eqfalse]," - "products[id$in5,31],[id$in987]") - - -@patch.object(MCA, "json_msg_query") -def test_get_experiments_ids(mock_query, - connectivity): - connectivity.get_experiments([9,8,7]) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::SectionDataSet,rma::criteria,[failed$eqfalse]," - "products[id$in5,31],[id$in9,8,7]") - - -@patch.object(MCA, "json_msg_query") -def test_get_manual_injection_summary(mock_query, - connectivity): - connectivity.get_manual_injection_summary(123) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::SectionDataSet,rma::criteria,[id$in123]," - "rma::include,specimen(donor(transgenic_mouse(transgenic_lines))," - "injections(structure,age)),equalization,products," - "rma::options[only$eqid,failed,storage_directory,red_lower,red_upper," - "green_lower,green_upper,blue_lower,blue_upper,products.id," - "specimen_id,structure_id,reference_space_id," - "primary_injection_structure_id,registration_point,coordinates_ap," - "coordinates_dv,coordinates_ml,angle,sex,strain,injection_materials," - "acronym,structures.name,days,transgenic_mice.name," - "transgenic_lines.name,transgenic_lines.description," - "transgenic_lines.id,donors.id]") - - -@patch.object(MCA, "json_msg_query") -def test_get_experiment_detail(mock_query, - connectivity): - connectivity.get_experiment_detail(123) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::SectionDataSet,rma::criteria,[id$eq123]," - "rma::include,specimen(stereotaxic_injections" - "(primary_injection_structure,structures," - "stereotaxic_injection_coordinates)),equalization,sub_images," - "rma::options[order$eq'sub_images.section_number$asc']") - - -@patch.object(MCA, "json_msg_query") -def test_get_projection_image_info(mock_query, - connectivity): - connectivity.get_projection_image_info(123, 456) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::SectionDataSet,rma::criteria,[id$eq123],rma::include," - "equalization,sub_images[section_number$eq456]") - - -def test_build_reference_aligned_channel_volumes_url(connectivity): - url = \ - connectivity.build_reference_aligned_image_channel_volumes_url(123456) - - assert url == ("http://api.brain-map.org/api/v2/data/query.json?q=" - "model::WellKnownFile,rma::criteria," - "well_known_file_type[name$eq'ImagesResampledTo25MicronARA']" - "[attachable_id$eq123456]") - - -@patch.object(MCA, "retrieve_file_over_http") -@patch.object(MCA, "do_query", return_value=DOWNLOAD_LINK) -def test_reference_aligned_channel_volumes(mock_query, - mock_retrieve, - connectivity): - connectivity.download_reference_aligned_image_channel_volumes(123456) - - mock_retrieve.assert_called_once_with( - "http://api.brain-map.org/path/to/link", - "123456.zip") - - -@patch.object(MCA, "json_msg_query") -def test_experiment_source_search(mock_query, - connectivity): - connectivity.experiment_source_search( - injection_structures='Isocortex', - primary_structure_only=True) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "service::mouse_connectivity_injection_structure" - "[injection_structures$eqIsocortex][primary_structure_only$eqtrue]") - - -@patch.object(MCA, "json_msg_query") -def test_experiment_spatial_search(mock_query, - connectivity): - connectivity.experiment_spatial_search( - seed_point=[6900,5050,6450]) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "service::mouse_connectivity_target_spatial" - "[seed_point$eq6900,5050,6450]") - - -@patch.object(MCA, "json_msg_query") -def test_injection_coordinate_search(mock_query, - connectivity): - connectivity.experiment_injection_coordinate_search( - seed_point=[6900,5050,6450]) - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "service::mouse_connectivity_injection_coordinate" - "[seed_point$eq6900,5050,6450]") - - -@patch.object(MCA, "json_msg_query") -def test_experiment_correlation_search(mock_query, - connectivity): - connectivity.experiment_correlation_search( - row=112670853, structure='TH') - - mock_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "service::mouse_connectivity_correlation" - "[row$eq112670853][structure$eqTH]") - - -@pytest.mark.parametrize("injection,hemisphere", - it.product([True, False,None], - [['left'],['right'],None])) -@patch.object(MCA, "json_msg_query") -def test_get_structure_unionizes(mock_query, - connectivity, - injection, - hemisphere): - connectivity.get_structure_unionizes( - experiment_ids=[126862385], - is_injection=injection, - hemisphere_ids=hemisphere, - include='structure') - - i = '' - - if injection is not None: - i = "[is_injection$eq%s]" % (str(injection).lower()) - - h = '' - - if hemisphere is not None: - h = "[hemisphere_id$in%s]" % (hemisphere[0]) - - mock_query.assert_called_once_with( - ("http://api.brain-map.org/api/v2/data/query.json?q=" - "model::ProjectionStructureUnionize,rma::criteria," - "[section_data_set_id$in126862385]%s%s," - "rma::include,structure,rma::options[num_rows$eq'all']" - "[count$eqfalse]") % (i, h)) - - -def test_download_injection_density(connectivity): - with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: - connectivity.download_injection_density( - 'file.name', 12345, 10) - - gda.assert_called_once_with( - "http://api.brain-map.org/grid_data/download_file/" - "12345" - "?image=injection_density&resolution=10", - "file.name") - - -def test_download_projection_density(connectivity): - with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: - connectivity.download_projection_density( - 'file.name', 12345, 10) - - gda.assert_called_once_with( - "http://api.brain-map.org/grid_data/download_file/" - "12345" - "?image=projection_density&resolution=10", - "file.name") - - -def test_download_data_mask_density(connectivity): - with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: - connectivity.download_data_mask( - 'file.name', 12345, 10) - - gda.assert_called_once_with( - "http://api.brain-map.org/grid_data/download_file/" - "12345" - "?image=data_mask&resolution=10", - "file.name") - - -def test_download_injection_fraction(connectivity): - with patch('allensdk.api.api.Api.retrieve_file_over_http') as gda: - connectivity.download_injection_fraction( - 'file.name', 12345, 10) - - gda.assert_called_once_with( - "http://api.brain-map.org/grid_data/download_file/" - "12345" - "?image=injection_fraction&resolution=10", - "file.name") - - -def test_calculate_injection_centroid(connectivity): - density = np.array(([1.0,1.0,1.0,1.0], - [1.0,1.0,1.0,1.0], - [1.0,1.0,1.0,1.0], - [1.0,1.0,1.0,1.0])) - fraction = np.array(([1.0,1.0,1.0,1.0], - [1.0,1.0,1.0,1.0], - [1.0,1.0,1.0,1.0], - [1.0,1.0,1.0,1.0])) - - centroid = connectivity.calculate_injection_centroid( - density, fraction, resolution=25) - - assert np.array_equal(centroid, [37.5, 37.5]) diff --git a/allensdk/test/api/test_ontologies_api.py b/allensdk/test/api/test_ontologies_api.py deleted file mode 100644 index bcf8bf4965..0000000000 --- a/allensdk/test/api/test_ontologies_api.py +++ /dev/null @@ -1,217 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.api.queries.ontologies_api import OntologiesApi -import pandas as pd -from numpy import allclose -import pytest -from mock import patch - - -@pytest.fixture -def ontologies(): - return OntologiesApi() - - -@patch.object(OntologiesApi, "json_msg_query") -def test_get_structure_graph(mock_json_msg_query, ontologies): - structure_graph_id = 1 - ontologies.get_structures(structure_graph_id) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria,[graph_id$in1]," - "rma::options" - "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_list_structure_graphs(mock_json_msg_query, ontologies): - ontologies.get_structure_graphs() - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::StructureGraph," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_list_structure_sets_noarg(mock_json_msg_query, ontologies): - ontologies.get_structure_sets() - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::StructureSet,rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_list_structure_sets_args(mock_json_msg_query, ontologies): - ontologies.get_structure_sets([2, 3]) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::StructureSet,rma::criteria,[id$in2,3]," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_list_atlases(mock_json_msg_query, ontologies): - ontologies.get_atlases() - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Atlas,rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_structure_graph_by_name(mock_json_msg_query, ontologies): - ontologies.get_structures(structure_graph_names="'Mouse Brain Atlas'") - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "graph[structure_graphs.name$in'Mouse Brain Atlas']," - "rma::options" - "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_structure_graphs_by_names(mock_json_msg_query, ontologies): - ontologies.get_structures(structure_graph_names=["'Mouse Brain Atlas'", - "'Human Brain Atlas'"]) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "graph[structure_graphs.name$in'Mouse Brain Atlas'," - "'Human Brain Atlas']," - "rma::options" - "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_structure_set_by_id(mock_json_msg_query, ontologies): - ontologies.get_structures(structure_set_ids=8) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria,[structure_set_id$in8]," - "rma::options" - "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_structure_sets_by_ids(mock_json_msg_query, ontologies): - ontologies.get_structures(structure_set_ids=[7, 8]) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria,[structure_set_id$in7,8]," - "rma::options" - "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_structure_set_by_name(mock_json_msg_query, ontologies): - ontologies.get_structures( - structure_set_names=ontologies.quote_string( - "Mouse Connectivity - Summary")) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "structure_sets[name$in'Mouse Connectivity - Summary']," - "rma::options" - "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_structure_set_by_names(mock_json_msg_query, ontologies): - ontologies.get_structures( - structure_set_names=[ - ontologies.quote_string("NHP - Coarse"), - ontologies.quote_string("Mouse Connectivity - Summary")]) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "structure_sets[name$in'NHP - Coarse','Mouse Connectivity - Summary']," - "rma::options" - "[num_rows$eq'all'][order$eqstructures.graph_order][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_structure_set_no_order(mock_json_msg_query, ontologies): - ontologies.get_structures(1, order=None) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "[graph_id$in1],rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_atlas_1(mock_json_msg_query, ontologies): - atlas_id = 1 - ontologies.get_atlases_table(atlas_id) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Atlas,rma::criteria," - "[id$in1],structure_graph(ontology),graphic_group_labels," - "rma::include,structure_graph(ontology),graphic_group_labels," - "rma::options[only$eq'atlases.id,atlases.name,atlases.image_type," - "ontologies.id,ontologies.name," - "structure_graphs.id,structure_graphs.name," - "graphic_group_labels.id,graphic_group_labels.name']" - "[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_atlas_verbose(mock_json_msg_query, ontologies): - ontologies.get_atlases_table(brief=False) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Atlas,rma::criteria," - "structure_graph(ontology),graphic_group_labels," - "rma::include,structure_graph(ontology),graphic_group_labels," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(OntologiesApi, "json_msg_query") -def test_get_structures_with_sets(mock_json_msg_query, ontologies): - ontologies.get_structures_with_sets(1) - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria,[graph_id$in1]," - "rma::include,structure_sets," - "rma::options[num_rows$eq'all'][order$eqstructures.graph_order]" - "[count$eqfalse]") - - -def test_unpack_structure_set_ancestors(ontologies): - - sdf = pd.DataFrame([{'structure_id_path': '/1/2/3/'}]) - ontologies.unpack_structure_set_ancestors(sdf) - - assert( 'structure_set_ancestor' in sdf.columns.values ) - assert( allclose(sdf['structure_set_ancestor'].values[0], [1, 2, 3]) ) diff --git a/allensdk/test/api/test_pager.py b/allensdk/test/api/test_pager.py deleted file mode 100644 index 68399e014a..0000000000 --- a/allensdk/test/api/test_pager.py +++ /dev/null @@ -1,272 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import MagicMock, call, patch, mock_open -from allensdk.api.queries.rma_pager import RmaPager, pageable -from allensdk.api.queries.rma_api import RmaApi -import allensdk.core.json_utilities as ju -import pandas.io.json as pj -import pandas as pd -from six.moves import builtins -import os -import simplejson as json -from allensdk.api.queries.rma_template import RmaTemplate -from allensdk.api.warehouse_cache.cache import cacheable, Cache -try: - import StringIO -except: - import io as StringIO -from . import SafeJsonMsg - - -@pytest.fixture -def pager(): - return RmaPager() - -_msg = [{'whatever': True}] -_pd_msg = pd.DataFrame(_msg) -_csv_msg = pd.read_csv(StringIO.StringIO(""",whatever -0,True -"""), index_col=0) - -_read_url_get_msg5 = [{'msg': _msg}, - {'msg': _msg}, - {'msg': _msg}, - {'msg': _msg}, - {'msg': _msg}] -_pj_msg5 = pd.DataFrame([{'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}]) -_read_msg5 = [{'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}] - - -@pytest.fixture -def safe_read_url_get_msg5(): - return SafeJsonMsg(_read_url_get_msg5) - -@pytest.fixture -def rma(): - return RmaApi() - -@patch("allensdk.core.json_utilities.read_url_get", - return_value={'msg': _msg}) -def test_pageable_json(ju_read_url_get, rma): - - @pageable() - def get_genes(**kwargs): - return rma.model_query(model='Gene', **kwargs) - - nr = 5 - pp = 1 - tr = nr*pp - - df = list(get_genes(num_rows=nr, total_rows=tr)) - - assert df == [{'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}] - - base_query = \ - ('http://api.brain-map.org/api/v2/data/query.json?q=model::Gene' - ',rma::options%5Bnum_rows$eq5%5D%5Bstart_row$eq{}%5D' - '%5Bcount$eqfalse%5D') - - expected_calls = map(lambda c: call(base_query.format(c)), - [0, 1, 2, 3, 4]) - - assert ju_read_url_get.call_args_list == list(expected_calls) - - -def test_all(safe_read_url_get_msg5, rma): - with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_read_url_get_msg5) as ju_read_url_get: - - @pageable() - def get_genes(**kwargs): - return rma.model_query(model='Gene', **kwargs) - - nr = 1 - - df = list(get_genes(num_rows=nr, total_rows='all')) - - assert df == [{'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}] - - base_query = \ - ('http://api.brain-map.org/api/v2/data/query.json?q=model::Gene' - ',rma::options%5Bnum_rows$eq1%5D%5Bstart_row$eq{}%5D' - '%5Bcount$eqfalse%5D') - - # we get one extra call if total_rows % num_rows == 0 with current implementation - expected_calls = map(lambda c: call(base_query.format(c)), - [0, 1, 2, 3, 4, 5]) - - assert ju_read_url_get.call_args_list == list(expected_calls) - - -@pytest.mark.parametrize("cache_style", - (Cache.cache_csv, - Cache.cache_csv_json, - Cache.cache_csv_dataframe)) -@patch("pandas.read_csv", return_value=_csv_msg) -@patch("os.makedirs") -def test_cacheable_pageable_csv(os_makedirs, read_csv, - cache_style, safe_read_url_get_msg5): - with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_read_url_get_msg5) as ju_read_url_get: - archive_templates = \ - {"cam_cell_queries": [ - {'name': 'cam_cell_metric', - 'description': 'see name', - 'model': 'ApiCamCellMetric', - 'num_rows': 1000, - 'count': False - } ] } - - rmat = RmaTemplate(query_manifest=archive_templates) - - @cacheable() - @pageable(num_rows=2000) - def get_cam_cell_metrics(*args, - **kwargs): - return rmat.template_query("cam_cell_queries", - 'cam_cell_metric', - *args, - **kwargs) - - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - with patch('csv.DictWriter.writerow') as csv_writerow: - cam_cell_metrics = \ - get_cam_cell_metrics(strategy='create', - path='/path/to/cam_cell_metrics.csv', - num_rows=1, - total_rows='all', - **cache_style()) - - os_makedirs.assert_called_with('/path/to') - - base_query = ('http://api.brain-map.org/api/v2/data/query.json?' - 'q=model::ApiCamCellMetric,' - 'rma::options%5Bnum_rows$eq1%5D%5Bstart_row$eq{}%5D' - '%5Bcount$eqfalse%5D') - - expected_calls = map(lambda c: call(base_query.format(c)), - [0, 1, 2, 3, 4, 5]) - - assert ju_read_url_get.call_args_list == list(expected_calls) - read_csv.assert_called_once_with('/path/to/cam_cell_metrics.csv', parse_dates=True) - - assert csv_writerow.call_args_list == [call({'whatever': 'whatever'}), - call({'whatever': True}), - call({'whatever': True}), - call({'whatever': True}), - call({'whatever': True}), - call({'whatever': True})] - - -@pytest.mark.parametrize("cache_style", - (Cache.cache_json, - Cache.cache_json_dataframe)) -@patch("allensdk.core.json_utilities.read", return_value=_read_msg5) -@patch("pandas.io.json.read_json", return_value=_pj_msg5) -@patch("os.makedirs") -def test_cacheable_pageable_json(os_makedirs, pj_read_json, - ju_read, cache_style, safe_read_url_get_msg5): - with patch("allensdk.core.json_utilities.read_url_get", side_effect=safe_read_url_get_msg5) as ju_read_url_get: - - archive_templates = \ - {"cam_cell_queries": [ - {'name': 'cam_cell_metric', - 'description': 'see name', - 'model': 'ApiCamCellMetric', - 'num_rows': 1000, - 'count': False - } ] } - - rmat = RmaTemplate(query_manifest=archive_templates) - - @cacheable() - @pageable(num_rows=2000) - def get_cam_cell_metrics(*args, - **kwargs): - return rmat.template_query("cam_cell_queries", - 'cam_cell_metric', - *args, - **kwargs) - - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - open_mock.return_value.read = \ - MagicMock(name='read', - return_value=[{'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}, - {'whatever': True}]) - cam_cell_metrics = \ - get_cam_cell_metrics(strategy='create', - path='/path/to/cam_cell_metrics.json', - num_rows=1, - total_rows='all', - **cache_style()) - - os_makedirs.assert_called_with('/path/to') - - base_query = \ - ('http://api.brain-map.org/api/v2/data/query.json?' - 'q=model::ApiCamCellMetric,' - 'rma::options%5Bnum_rows$eq1%5D%5Bstart_row$eq{}%5D' - '%5Bcount$eqfalse%5D') - - expected_calls = map(lambda c: call(base_query.format(c)), - [0, 1, 2, 3, 4, 5]) - - open_mock.assert_called_once_with('/path/to/cam_cell_metrics.json', 'wb') - open_mock.return_value.write.assert_called_once_with('[\n {\n "whatever": true\n },\n {\n "whatever": true\n },\n {\n "whatever": true\n },\n {\n "whatever": true\n },\n {\n "whatever": true\n }\n]') - assert ju_read_url_get.call_args_list == list(expected_calls) - assert len(cam_cell_metrics) == 5 diff --git a/allensdk/test/api/test_reference_space_api.py b/allensdk/test/api/test_reference_space_api.py deleted file mode 100644 index 3d4848b48f..0000000000 --- a/allensdk/test/api/test_reference_space_api.py +++ /dev/null @@ -1,256 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import pytest -from mock import patch, MagicMock -import itertools as it -import numpy as np -from allensdk.api.queries.reference_space_api import ReferenceSpaceApi as RSA - - -@pytest.fixture -def ref_space(): - rsa = RSA() - - return rsa - - -@pytest.fixture -def mock_nrrd(): - mocked_nrrd = MagicMock() - mocked_nrrd.read = MagicMock(return_value=('mock_annotation_data', - 'mock_annotation_image')) - return mocked_nrrd - - -def CCF_VERSIONS(): - return [RSA.CCF_2015, - RSA.CCF_2016, - RSA.CCF_2017] - - -def DATA_PATHS(): - return [RSA.AVERAGE_TEMPLATE, - RSA.ARA_NISSL, - RSA.MOUSE_2011, - RSA.DEVMOUSE_2012, - RSA.CCF_2015, - RSA.CCF_2016, - RSA.CCF_2017] - - -def RESOLUTIONS(): - return [RSA.VOXEL_RESOLUTION_10_MICRONS, - RSA.VOXEL_RESOLUTION_25_MICRONS, - RSA.VOXEL_RESOLUTION_50_MICRONS, - RSA.VOXEL_RESOLUTION_100_MICRONS] - -MOCK_ANNOTATION_DATA = 'mock_annotation_data' -MOCK_ANNOTATION_IMAGE = 'mock_annotation_image' - - - -def test_download_mouse_atlas_volume(ref_space): - - with patch.object(ref_space, 'retrieve_file_over_http') as mock_retrieve: - with pytest.raises(RuntimeError): - ref_space.download_mouse_atlas_volume('P56', 'Mouse_gridAnnotation', 'P56/gridAnnotation.mhd') - - mock_retrieve.assert_called_once_with( - 'http://download.alleninstitute.org/informatics-archive/'\ - 'current-release/mouse_annotation/'\ - 'P56_Mouse_gridAnnotation.zip', - 'P56/gridAnnotation.mhd', - zipped=True) - - -@pytest.mark.parametrize("data_path,resolution", - it.product(DATA_PATHS(), - RESOLUTIONS())) -def test_download_volumetric_data(ref_space, - data_path, - resolution): - cache_filename = "annotation_%d.nrrd" % (resolution) - - with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: - ref_space.download_volumetric_data(data_path, - cache_filename, - resolution) - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/%s/annotation_%d.nrrd" % - (data_path, - resolution), - cache_filename) - - -@pytest.mark.parametrize("resolution", - RESOLUTIONS()) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_structure_mask(os_makedirs, - nrrd_read, - ref_space, - resolution): - - structure_id = 12 - - with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: - a, b = ref_space.download_structure_mask(structure_id, - None, resolution, - '/path/to/foo.nrrd', - reader=nrrd_read) - - assert a - assert b - - expected = 'http://download.alleninstitute.org/informatics-archive/'\ - 'current-release/mouse_ccf/{0}/structure_masks/'\ - 'structure_masks_{1}/structure_{2}.nrrd'.format(RSA.CCF_VERSION_DEFAULT, - resolution, - structure_id) - mock_retrieve.assert_called_once_with(expected, '/path/to/foo.nrrd') - os_makedirs.assert_any_call('/path/to') - - -@patch('allensdk.core.obj_utilities.read_obj', return_value=('mock_obj')) -@patch('os.makedirs') -def test_download_structure_mesh(os_makedirs, - read_obj, - ref_space): - - structure_id = 12 - - with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: - a = ref_space.download_structure_mesh(structure_id, - None, '/path/to/foo.obj', - reader=read_obj) - - assert a == 'mock_obj' - - expected = 'http://download.alleninstitute.org/informatics-archive/'\ - 'current-release/mouse_ccf/{0}/structure_meshes/'\ - '{1}.obj'.format(RSA.CCF_VERSION_DEFAULT, structure_id) - - mock_retrieve.assert_called_once_with(expected, '/path/to/foo.obj') - os_makedirs.assert_any_call('/path/to') - - -@pytest.mark.parametrize("ccf_version,resolution", - it.product(CCF_VERSIONS(), - RESOLUTIONS())) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_annotation_volume(os_makedirs, - nrrd_read, - ref_space, - ccf_version, - resolution): - cache_file = '/path/to/annotation_%d.nrrd' % (resolution) - - with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: - ref_space.download_annotation_volume( - ccf_version, - resolution, - cache_file, - reader=nrrd_read) - - nrrd_read.assert_called_once_with(cache_file) - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/%s/annotation_%d.nrrd" % - (ccf_version, resolution), - "/path/to/annotation_%d.nrrd" % (resolution)) - - os_makedirs.assert_any_call('/path/to') - - -@pytest.mark.parametrize("resolution", - RESOLUTIONS()) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_annotation_volume_default(os_makedirs, - nrrd_read, - ref_space, - resolution): - with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: - a, b = ref_space.download_annotation_volume( - None, - resolution, - '/path/to/annotation_%d.nrrd' % (resolution), - reader=nrrd_read) - - assert a - assert b - - print(mock_retrieve.call_args_list) - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/%s/annotation_%d.nrrd" % - (RSA.CCF_VERSION_DEFAULT, resolution), - "/path/to/annotation_%d.nrrd" % (resolution)) - - os_makedirs.assert_any_call('/path/to') - - -@pytest.mark.parametrize("resolution", - RESOLUTIONS()) -@patch("nrrd.read", return_value=('mock_annotation_data', - 'mock_annotation_image')) -@patch('os.makedirs') -def test_download_template_volume(os_makedirs, - nrrd_read, - ref_space, - resolution): - with patch.object(ref_space, "retrieve_file_over_http") as mock_retrieve: - ref_space.download_template_volume( - resolution, - '/path/to/average_template_%d.nrrd' % (resolution), - reader=nrrd_read) - - mock_retrieve.assert_called_once_with( - "http://download.alleninstitute.org/informatics-archive/" - "current-release/mouse_ccf/average_template/average_template_%d.nrrd" % - (resolution), - "/path/to/average_template_%d.nrrd" % (resolution)) - - os_makedirs.assert_any_call('/path/to') diff --git a/allensdk/test/api/test_rma_template.py b/allensdk/test/api/test_rma_template.py deleted file mode 100644 index f315d0a82b..0000000000 --- a/allensdk/test/api/test_rma_template.py +++ /dev/null @@ -1,265 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import MagicMock, patch -import allensdk.core.json_utilities as ju -from allensdk.api.queries.rma_template import RmaTemplate - - -_msg = {'msg': [{'whatever': True}]} - - -@pytest.fixture -def rma(): - templates = \ - {"ontology_queries": [ - {'name': 'structures_by_graph_ids', - 'description': 'see name', - 'model': 'Structure', - 'criteria': '[graph_id$in{{ graph_ids }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['graph_ids'] - }, - {'name': 'structures_by_graph_names', - 'description': 'see name', - 'model': 'Structure', - 'criteria': 'graph[structure_graphs.name$in{{ graph_names }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['graph_names'] - }, - {'name': 'structures_by_set_ids', - 'description': 'see name', - 'model': 'Structure', - 'criteria': '[structure_set_id$in{{ set_ids }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['set_ids'] - }, - {'name': 'structures_by_set_names', - 'description': 'see name', - 'model': 'Structure', - 'criteria': 'structure_sets[name$in{{ set_names }}]', - 'order': ['structures.graph_order'], - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['set_names'] - }, - {'name': 'structure_graphs_list', - 'description': 'see name', - 'model': 'StructureGraph', - 'num_rows': 'all', - 'count': False - }, - {'name': 'structure_sets_list', - 'description': 'see name', - 'model': 'StructureSet', - 'num_rows': 'all', - 'count': False - }, - {'name': 'atlases_list', - 'description': 'see name', - 'model': 'Atlas', - 'num_rows': 'all', - 'count': False - }, - {'name': 'atlases_table', - 'description': 'see name', - 'model': 'Atlas', - 'criteria': '{% if graph_ids is defined %}[graph_id$in{{ graph_ids }}],{% endif %}structure_graph(ontology),graphic_group_labels', - 'include': '[structure_graph(ontology),graphic_group_labels', - 'num_rows': 'all', - 'count': False, - 'criteria_params': ['graph_ids'] - }, - {'name': 'atlases_table_brief', - 'description': 'see name', - 'model': 'Atlas', - 'criteria': 'structure_graph(ontology),graphic_group_labels', - 'include': 'structure_graph(ontology),graphic_group_labels', - 'only': ['atlases.id', - 'atlases.name', - 'atlases.image_type', - 'ontologies.id', - 'ontologies.name', - 'structure_graphs.id', - 'structure_graphs.name', - 'graphic_group_labels.id', - 'graphic_group_labels.name'], - 'num_rows': 'all', - 'count': False - } - ]} - rma = RmaTemplate(query_manifest=templates) - - return rma - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_atlases_list(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'atlases_list') - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Atlas,rma::options" - "%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_structure_graphs_list(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'structure_graphs_list') - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::StructureGraph,rma::options" - "%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_structure_sets_list(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'structure_sets_list') - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::StructureSet,rma::options" - "%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_structures_by_graph_ids(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'structures_by_graph_ids', - graph_ids='1') - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "%5Bgraph_id$in1%5D,rma::options" - "%5Bnum_rows$eq%27all%27%5D%5Border$eqstructures.graph_order%5D" - "%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_structures_by_two_graph_ids(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'structures_by_graph_ids', - graph_ids=[1, 2]) - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "%5Bgraph_id$in1,2%5D," - "rma::options" - "%5Bnum_rows$eq%27all%27%5D" - "%5Border$eqstructures.graph_order%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_structures_by_graph_names(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'structures_by_graph_names', - graph_names=rma.quote_string('Human+Brain+Atlas')) - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "graph%5Bstructure_graphs.name$in%27Human+Brain+Atlas%27%5D," - "rma::options" - "%5Bnum_rows$eq%27all%27%5D" - "%5Border$eqstructures.graph_order%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_structures_by_set_ids(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'structures_by_graph_ids', - graph_ids='1') - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Structure,rma::criteria," - "%5Bgraph_id$in1%5D,rma::options%5Bnum_rows$eq%27all%27%5D" - "%5Border$eqstructures.graph_order%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_atlases_table(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'atlases_table') - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Atlas,rma::criteria," - "structure_graph%28ontology%29,graphic_group_labels," - "rma::include,%5Bstructure_graph%28ontology%29,graphic_group_labels," - "rma::options%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_atlases_table_one_graph(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'atlases_table', - graph_ids=1) - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Atlas,rma::criteria," - "%5Bgraph_id$in1%5D,structure_graph%28ontology%29,graphic_group_labels," - "rma::include,%5Bstructure_graph%28ontology%29,graphic_group_labels," - "rma::options%5Bnum_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") - - -@patch("allensdk.core.json_utilities.read_url_get", return_value=_msg) -def test_atlases_table_brief(ju_read_url_get, rma): - rma.template_query('ontology_queries', - 'atlases_table_brief') - - ju_read_url_get.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::Atlas," - "rma::criteria,structure_graph%28ontology%29,graphic_group_labels," - "rma::include,structure_graph%28ontology%29,graphic_group_labels," - "rma::options%5Bonly$eq%27atlases.id,atlases.name,atlases.image_type," - "ontologies.id,ontologies.name,structure_graphs.id,structure_graphs.name," - "graphic_group_labels.id,graphic_group_labels.name%27%5D%5B" - "num_rows$eq%27all%27%5D%5Bcount$eqfalse%5D") diff --git a/allensdk/test/api/test_svg_api.py b/allensdk/test/api/test_svg_api.py deleted file mode 100644 index 68e1e40e34..0000000000 --- a/allensdk/test/api/test_svg_api.py +++ /dev/null @@ -1,109 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -#test AllenSDK svg api for download and show -from allensdk.api.queries.svg_api import SvgApi -import pytest -import json -from mock import MagicMock -import os - -@pytest.fixture -def svg(): - sa = SvgApi() - return sa - -def test_build_query(svg): - ####download true url - download = True - groups = None - section_image_id = 21889 - returned_url = svg.build_query(section_image_id, groups,download) - assert (returned_url == "http://api.brain-map.org/api/v2/svg_download/21889") - - ####download true with one group url - download = True - groups = [1] - section_image_id = 21889 - returned_url = svg.build_query(section_image_id, groups,download) - assert (returned_url == "http://api.brain-map.org/api/v2/svg_download/21889?groups=1") - - ####download true with groups url - download = True - groups = [1,2] - section_image_id = 21889 - returned_url = svg.build_query(section_image_id, groups,download) - assert (returned_url == "http://api.brain-map.org/api/v2/svg_download/21889?groups=1,2") - - ####download false url - download = False - groups = None - section_image_id = 21889 - returned_url = svg.build_query(section_image_id, groups,download) - assert (returned_url == "http://api.brain-map.org/api/v2/svg/21889") - - ####download false groups exist url - download = False - groups = [28] - section_image_id = 21889 - returned_url = svg.build_query(section_image_id, groups,download) - assert (returned_url == "http://api.brain-map.org/api/v2/svg/21889?groups=28") - -def test_download_svg(svg): - svg.retrieve_file_over_http = MagicMock(name='retrieve_file_over_http') - section_image_id = 21889 - groups = None - file_path = None - - svg.download_svg(section_image_id,groups,file_path) - svg.retrieve_file_over_http.assert_called_with('http://api.brain-map.org/api/v2/svg_download/21889', '21889.svg') - - -def test_get_svg(svg): - svg.retrieve_xml_over_http = MagicMock(name='retrieve_xml_over_http') - - ####groups None - section_image_id = 100960033 - groups = None - - svg.get_svg(section_image_id, groups) - svg.retrieve_xml_over_http.assert_called_with("http://api.brain-map.org/api/v2/svg/100960033") - - ####groups in 28 - section_image_id = 100960033 - groups = [28] - - svg.get_svg(section_image_id, groups) - svg.retrieve_xml_over_http.assert_called_with("http://api.brain-map.org/api/v2/svg/100960033?groups=28") diff --git a/allensdk/test/api/test_synchronization_api.py b/allensdk/test/api/test_synchronization_api.py deleted file mode 100644 index b99bb86698..0000000000 --- a/allensdk/test/api/test_synchronization_api.py +++ /dev/null @@ -1,130 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import MagicMock -from allensdk.api.queries.synchronization_api import SynchronizationApi - - -@pytest.fixture -def synch(): - sa = SynchronizationApi() - sa.json_msg_query = MagicMock(name='json_msg_query') - - return sa - - -def test_image_to_image(synch): - ''' - Notes - ----- - Expected link is slightly modified for json and float serialization of zeros. - - See: `Image Alignment `<http://help.brain-map.org/display/mouseconnectivity/API#API-ImageAlignment>_ - , link labeled 'Sync a VISp and VISal experiment to a location in a SCs SectionDataSet'. - ''' - section_image_id = 114754496 - (x, y) = (18232, 10704) - section_data_set_ids = [113887162, 116903968] - - _ = synch.get_image_to_image(section_image_id, - x, y, - section_data_set_ids) - expected = 'http://api.brain-map.org/api/v2/image_to_image/114754496.json?x=18232.000000&y=10704.000000§ion_data_set_ids=113887162,116903968' - synch.json_msg_query.assert_called_once_with(expected) - - -def test_image_to_image_2d(synch): - section_image_id = 68173101 - (x, y) = (6208, 2368) - section_image_ids = [68173103, 68173105, 68173107] - - _ = synch.get_image_to_image_2d(section_image_id, - x, y, - section_image_ids) - expected = 'http://api.brain-map.org/api/v2/image_to_image_2d/68173101.json?x=6208.000000&y=2368.000000§ion_image_ids=68173103,68173105,68173107' - synch.json_msg_query.assert_called_once_with(expected) - - -def test_reference_to_image(synch): - reference_space_id = 10 - (x, y, z) = (6085, 3670, 4883) - section_data_set_ids = [68545324, 67810540] - - _ = synch.get_reference_to_image(reference_space_id, - x, y, z, - section_data_set_ids) - expected = 'http://api.brain-map.org/api/v2/reference_to_image/10.json?x=6085.000000&y=3670.000000&z=4883.000000§ion_data_set_ids=68545324,67810540' - synch.json_msg_query.assert_called_once_with(expected) - - -def test_image_to_reference(synch): - section_image_id = 68173101 - (x, y) = (6208, 2368) - - _ = synch.get_image_to_reference(section_image_id, - x, y) - expected = 'http://api.brain-map.org/api/v2/image_to_reference/68173101.json?x=6208.000000&y=2368.000000' - synch.json_msg_query.assert_called_once_with(expected) - - -def test_structure_to_image(synch): - section_data_set_id = 68545324 - structure_ids = [315, 698, 1089, 703, 477, - 803, 512, 549, 1097, 313, 771, 354] - - _ = synch.get_structure_to_image(section_data_set_id, - structure_ids) - expected = 'http://api.brain-map.org/api/v2/structure_to_image/68545324.json?structure_ids=315,698,1089,703,477,803,512,549,1097,313,771,354' - synch.json_msg_query.assert_called_once_with(expected) - - -def test_image_to_atlas(synch): - ''' - Notes - ----- - Expected link is slightly modified for json and float serialization of zeros. - - See: `Image Alignment `<http://help.brain-map.org/display/mouseconnectivity/API#API-ImageAlignment>_ - , link labeled 'Sync the P56 coronal reference atlas to a location in the SCs SectionDataSet'. - ''' - section_image_id = 114754496 - (x, y) = (18232, 10704) - atlas_id = 1 - _ = synch.get_image_to_atlas(section_image_id, - x, y, - atlas_id) - expected = 'http://api.brain-map.org/api/v2/image_to_atlas/114754496.json?x=18232.000000&y=10704.000000&atlas_id=1' - synch.json_msg_query.assert_called_once_with(expected) diff --git a/allensdk/test/api/test_tree_search_api.py b/allensdk/test/api/test_tree_search_api.py deleted file mode 100644 index 8606fac81c..0000000000 --- a/allensdk/test/api/test_tree_search_api.py +++ /dev/null @@ -1,97 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -####test AllenSDK tree search api for Specimen and Structure -from allensdk.api.queries.tree_search_api import TreeSearchApi -import pytest -import json -from mock import MagicMock - -@pytest.fixture -def tree_search(): - tsa = TreeSearchApi() - tsa.json_msg_query = MagicMock(name='json_msg_query') - - return tsa - -def test_get_specimen_tree(tree_search): - ####ancestor true for Specimen - kind = 'Specimen' - db_id = 113817886 - ancestors = True - descendants = None - tree_search.get_tree(kind, db_id, ancestors, descendants) - tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Specimen/113817886.json?ancestors=true") - - ####ancestor true for Specimen - kind = 'Specimen' - db_id = 113817886 - ancestors = True - descendants = False - tree_search.get_tree(kind, db_id, ancestors, descendants) - tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Specimen/113817886.json?ancestors=true&descendants=false") - - ####ancestor false for Specimen - kind = 'Specimen' - db_id = 113817886 - ancestors = False - descendants = True - tree_search.get_tree(kind, db_id, ancestors, descendants) - tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Specimen/113817886.json?ancestors=false&descendants=true") - -def test_get_structure_tree(tree_search): - ####ancestor True for Structure - kind = 'Structure' - db_id = 12547 - ancestors = True - descendants = True - tree_search.get_tree(kind, db_id, ancestors, descendants) - tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Structure/12547.json?ancestors=true&descendants=true") - - ####ancestor False for Structure - kind = 'Structure' - db_id = 12547 - ancestors = False - descendants = True - tree_search.get_tree(kind, db_id, ancestors, descendants) - tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Structure/12547.json?ancestors=false&descendants=true") - - ####ancestor None for Structure - kind = 'Structure' - db_id = 12547 - ancestors = None - descendants = None - tree_search.get_tree(kind, db_id, ancestors, descendants) - tree_search.json_msg_query.assert_called_with("http://api.brain-map.org/api/v2/tree_search/Structure/12547.json") diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache/__init__.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/__init__.py deleted file mode 100644 index 1bb8bf6d7f..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# empty diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache/conftest.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/conftest.py deleted file mode 100644 index dbb70291e9..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache/conftest.py +++ /dev/null @@ -1,234 +0,0 @@ -import pytest -import pandas as pd -import io -import semver - -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.\ - data_io.behavior_project_cloud_api import MANIFEST_COMPATIBILITY - - -@pytest.fixture -def s3_cloud_cache_data(): - - all_versions = {} - all_versions['data'] = {} - all_versions['metadata'] = {} - - min_compat = semver.parse_version_info(MANIFEST_COMPATIBILITY[0]) - versions = [] - - version = str(min_compat) - versions.append(version) - data = {} - metadata = {} - - data['ophys_file_1.nwb'] = {'file_id': 1, - 'data': b'abcde'} - - data['ophys_file_2.nwb'] = {'file_id': 2, - 'data': b'fghijk'} - - data['behavior_file_3.nwb'] = {'file_id': 3, - 'data': b'12345'} - - data['behavior_file_4.nwb'] = {'file_id': 4, - 'data': b'67890'} - - o_session = [{'ophys_session_id': 111, - 'file_id': 1}, - {'ophys_session_id': 222, - 'file_id': 2}] - - o_session = pd.DataFrame(o_session) - buff = io.StringIO() - o_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_session_table'] = bytes(buff.read(), 'utf-8') - - b_session = [{'behavior_session_id': 333, - 'file_id': 3, - 'species': 'mouse'}, - {'behavior_session_id': 444, - 'file_id': 4, - 'species': 'mouse'}] - b_session = pd.DataFrame(b_session) - buff = io.StringIO() - b_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['behavior_session_table'] = bytes(buff.read(), 'utf-8') - - o_session = [{'ophys_experiment_id': 5111, - 'file_id': 1}, - {'ophys_experiment_id': 5222, - 'file_id': 2}] - - o_session = pd.DataFrame(o_session) - buff = io.StringIO() - o_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_experiment_table'] = bytes(buff.read(), 'utf-8') - - o_cells = { - 'cell_roi_id': {0: 9080884343, 1: 1080884173, 2: 1080883843}, - 'cell_specimen_id': {0: 1086496928, 1: 1086496914, 2: 1086496838}, - 'ophys_experiment_id': {0: 775614751, 1: 775614751, 2: 775614751}} - o_cells = pd.DataFrame(o_cells) - buff = io.StringIO() - o_cells.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_cells_table'] = bytes(buff.read(), 'utf-8') - - all_versions['data'][version] = data - all_versions['metadata'][version] = metadata - - version = str(min_compat.bump_minor()) - versions.append(version) - data = {} - metadata = {} - - data['ophys_file_1.nwb'] = {'file_id': 1, - 'data': b'lmnopqrs'} - - data['ophys_file_2.nwb'] = {'file_id': 2, - 'data': b'fghijk'} - - data['behavior_file_3.nwb'] = {'file_id': 3, - 'data': b'12345'} - - data['behavior_file_4.nwb'] = {'file_id': 4, - 'data': b'67890'} - - data['ophys_file_5.nwb'] = {'file_id': 5, - 'data': b'98765'} - - o_session = [{'ophys_session_id': 222, - 'file_id': 1}, - {'ophys_session_id': 333, - 'file_id': 2}] - - o_session = pd.DataFrame(o_session) - buff = io.StringIO() - o_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_session_table'] = bytes(buff.read(), 'utf-8') - - b_session = [{'behavior_session_id': 777, - 'file_id': 3, - 'species': 'mouse'}, - {'behavior_session_id': 888, - 'file_id': 4, - 'species': 'mouse'}] - b_session = pd.DataFrame(b_session) - buff = io.StringIO() - b_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['behavior_session_table'] = bytes(buff.read(), 'utf-8') - - o_session = [{'ophys_experiment_id': 5444, - 'file_id': 1}, - {'ophys_experiment_id': 5666, - 'file_id': 2}, - {'ophys_experiment_id': 5777, - 'file_id': 5}] - - o_session = pd.DataFrame(o_session) - buff = io.StringIO() - o_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_experiment_table'] = bytes(buff.read(), 'utf-8') - - o_cells = { - 'cell_roi_id': {0: 1080884343, 1: 1080884173, 2: 1080883843}, - 'cell_specimen_id': {0: 1086496928, 1: 1086496914, 2: 1086496838}, - 'ophys_experiment_id': {0: 775614751, 1: 775614751, 2: 775614751}} - o_cells = pd.DataFrame(o_cells) - buff = io.StringIO() - o_cells.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_cells_table'] = bytes(buff.read(), 'utf-8') - - all_versions['data'][version] = data - all_versions['metadata'][version] = metadata - - return all_versions, versions - - -@pytest.fixture -def data_update(): - data = {} - metadata = {} - - data['ophys_file_1.nwb'] = {'file_id': 1, - 'data': b'11235'} - - data['ophys_file_2.nwb'] = {'file_id': 2, - 'data': b'8132134'} - - data['behavior_file_3.nwb'] = {'file_id': 3, - 'data': b'04916'} - - data['behavior_file_4.nwb'] = {'file_id': 4, - 'data': b'253649'} - - data['ophys_file_5.nwb'] = {'file_id': 5, - 'data': b'98765'} - - o_session = [{'ophys_session_id': 1110, - 'file_id': 1}, - {'ophys_session_id': 2220, - 'file_id': 2}] - - o_session = pd.DataFrame(o_session) - buff = io.StringIO() - o_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_session_table'] = bytes(buff.read(), 'utf-8') - - b_session = [{'behavior_session_id': 3330, - 'file_id': 3, - 'species': 'mouse'}, - {'behavior_session_id': 4440, - 'file_id': 4, - 'species': 'mouse'}] - b_session = pd.DataFrame(b_session) - buff = io.StringIO() - b_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['behavior_session_table'] = bytes(buff.read(), 'utf-8') - - o_session = [{'ophys_experiment_id': 6111, - 'file_id': 1}, - {'ophys_experiment_id': 6222, - 'file_id': 2}, - {'ophys_experiment_id': 63456, - 'file_id': 5}] - - o_session = pd.DataFrame(o_session) - buff = io.StringIO() - o_session.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_experiment_table'] = bytes(buff.read(), 'utf-8') - - o_cells = { - 'cell_roi_id': {0: 9080884343, 1: 1080884173, 2: 1080883843}, - 'cell_specimen_id': {0: 1086496928, 1: 1086496914, 2: 1086496838}, - 'ophys_experiment_id': {0: 775614751, 1: 775614751, 2: 775614751}} - o_cells = pd.DataFrame(o_cells) - buff = io.StringIO() - o_cells.to_csv(buff, index=False) - buff.seek(0) - - metadata['ophys_cells_table'] = bytes(buff.read(), 'utf-8') - - return {'data': data, 'metadata': metadata} diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py deleted file mode 100644 index 96c37be370..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py +++ /dev/null @@ -1,237 +0,0 @@ -import pytest -import pandas as pd -from pathlib import Path -from unittest.mock import MagicMock, create_autospec - -from allensdk.api.cloud_cache.manifest import Manifest -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import behavior_project_cloud_api as cloudapi # noqa: E501 -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.\ - data_io.behavior_project_cloud_api import MANIFEST_COMPATIBILITY - - -class MockCache(): - def __init__(self, - behavior_session_table, - ophys_session_table, - ophys_experiment_table, - ophys_cells_table, - cachedir): - self.file_id_column = "file_id" - self.session_table_path = cachedir / "session.csv" - self.behavior_session_table_path = cachedir / "behavior_session.csv" - self.ophys_experiment_table_path = cachedir / "ophys_experiment.csv" - self.ophys_cells_table_path = cachedir / "ophys_cells.csv" - - ophys_session_table.to_csv(self.session_table_path, index=False) - ophys_cells_table.to_csv(self.ophys_cells_table_path, index=False) - behavior_session_table.to_csv(self.behavior_session_table_path, - index=False) - ophys_experiment_table.to_csv(self.ophys_experiment_table_path, - index=False) - - self._manifest = MagicMock() - self._manifest.metadata_file_names = ["behavior_session_table", - "ophys_session_table", - "ophys_experiment_table", - "ophys_cells_table"] - self._metadata_name_path_map = { - "behavior_session_table": self.behavior_session_table_path, - "ophys_session_table": self.session_table_path, - "ophys_experiment_table": self.ophys_experiment_table_path, - "ophys_cells_table": self.ophys_cells_table_path} - - def download_metadata(self, fname): - return self._metadata_name_path_map[fname] - - def download_data(self, file_id): - return file_id - - def metadata_path(self, fname): - local_path = self._metadata_name_path_map[fname] - return { - 'local_path': local_path, - 'exists': Path(local_path).exists() - } - - def data_path(self, file_id): - return { - 'local_path': file_id, - 'exists': True - } - - def load_last_manifest(self): - return None - - -@pytest.fixture -def mock_cache(request, tmpdir): - bst = request.param.get("behavior_session_table") - ost = request.param.get("ophys_session_table") - oet = request.param.get("ophys_experiment_table") - clt = request.param.get("ophys_cells_table") - - # round-trip the tables through csv to pick up - # pandas mods to lists - fname = tmpdir / "my.csv" - bst.to_csv(fname, index=False) - bst = pd.read_csv(fname) - ost.to_csv(fname, index=False) - ost = pd.read_csv(fname) - oet.to_csv(fname, index=False) - oet = pd.read_csv(fname) - clt.to_csv(fname, index=False) - clt = pd.read_csv(fname) - yield (MockCache(bst, ost, oet, clt, tmpdir), request.param) - - -@pytest.mark.parametrize( - "mock_cache", - [ - { - "behavior_session_table": pd.DataFrame({ - "behavior_session_id": [1, 2, 3, 4], - "ophys_experiment_id": [4, 5, 6, [7, 8, 9]], - "file_id": [4, 5, 6, None]}), - "ophys_session_table": pd.DataFrame({ - "ophys_session_id": [10, 11, 12, 13], - "ophys_experiment_id": [4, 5, 6, [7, 8, 9]]}), - "ophys_experiment_table": pd.DataFrame({ - "ophys_experiment_id": [4, 5, 6, 7, 8, 9], - "file_id": [4, 5, 6, 7, 8, 9]}), - "ophys_cells_table": pd.DataFrame({ - "cell_roi_id": [4, 5, 6], - "cell_specimen_id": [104, 105, 106], - "ophys_experiment_id": [4, 5, 6]})} - ], - indirect=["mock_cache"]) -@pytest.mark.parametrize("local", [True, False]) -def test_BehaviorProjectCloudApi(mock_cache, monkeypatch, local): - mocked_cache, expected = mock_cache - api = cloudapi.BehaviorProjectCloudApi(mocked_cache, - skip_version_check=True, - local=False) - if local: - api = cloudapi.BehaviorProjectCloudApi(mocked_cache, - skip_version_check=True, - local=True) - - # behavior session table as expected - bost = api.get_behavior_session_table() - assert bost.index.name == "behavior_session_id" - bost = bost.reset_index() - ebost = expected["behavior_session_table"] - for k in ["behavior_session_id", "file_id"]: - pd.testing.assert_series_equal(bost[k], ebost[k]) - for k in ["ophys_experiment_id"]: - assert all([i == j - for i, j in zip(bost[k].values, ebost[k].values)]) - - # ophys session table as expected - ost = api.get_ophys_session_table() - assert ost.index.name == "ophys_session_id" - ost = ost.reset_index() - eost = expected["ophys_session_table"] - for k in ["ophys_session_id"]: - pd.testing.assert_series_equal(ost[k], eost[k]) - for k in ["ophys_experiment_id"]: - assert all([i == j - for i, j in zip(ost[k].values, eost[k].values)]) - - # experiment table as expected - et = api.get_ophys_experiment_table() - assert et.index.name == "ophys_experiment_id" - et = et.reset_index() - pd.testing.assert_frame_equal(et, expected["ophys_experiment_table"]) - - # get_behavior_session returns expected value - # both directly and via experiment table - def mock_nwb(nwb_path): - return nwb_path - monkeypatch.setattr(cloudapi.BehaviorSession, "from_nwb_path", mock_nwb) - assert api.get_behavior_session(2) == "5" - assert api.get_behavior_session(4) == "7" - - # direct check only for ophys experiment - monkeypatch.setattr(cloudapi.BehaviorOphysExperiment, - "from_nwb_path", mock_nwb) - assert api.get_behavior_ophys_experiment(8) == "8" - - -@pytest.mark.parametrize( - "manifest_version, data_pipeline_version, cmin, cmax, exception", - [ - ("0.0.1", "2.9.0", "0.0.0", "1.0.0", False), - ("1.0.1", "2.9.0", "0.0.0", "1.0.0", True) - ]) -def test_version_check(manifest_version, data_pipeline_version, - cmin, cmax, exception): - if exception: - with pytest.raises(cloudapi.BehaviorCloudCacheVersionException, - match=f".*{data_pipeline_version}"): - cloudapi.version_check(manifest_version, data_pipeline_version, - cmin, cmax) - else: - cloudapi.version_check(manifest_version, data_pipeline_version, - cmin, cmax) - - -def test_from_local_cache(monkeypatch): - mock_manifest = create_autospec(Manifest) - mock_manifest.metadata_file_names = { - 'ophys_experiment_table', - 'ophys_session_table', - 'behavior_session_table', - 'ophys_cells_table' - } - mock_manifest._data_pipeline = [ - { - "name": "AllenSDK", - "version": "2.11.0", - "comment": "This is a test entry. NOT REAL." - } - ] - mock_manifest.version = MANIFEST_COMPATIBILITY[0] - - mock_local_cache = create_autospec(cloudapi.LocalCache) - type(mock_local_cache.return_value)._manifest = mock_manifest - - mock_static_local_cache = create_autospec(cloudapi.StaticLocalCache) - type(mock_static_local_cache.return_value)._manifest = mock_manifest - - with monkeypatch.context() as m: - m.setattr(cloudapi, "LocalCache", mock_local_cache) - m.setattr(cloudapi, "StaticLocalCache", mock_static_local_cache) - - # Test from_local_cache with use_static_cache=False - try: - cloudapi.BehaviorProjectCloudApi.from_local_cache( - "first_cache_dir", "project_1", "ui_1", use_static_cache=False - ) - # Because cache is a mock, the following calls in the load_manifest - # method of BehaviorProjectCloudApi will fail with TypeError: - # self._get_ophys_session_table() - # self._get_behavior_session_table() - # self._get_ophys_experiment_table() - except (TypeError, FileNotFoundError): - pass - - mock_local_cache.assert_called_once_with( - "first_cache_dir", "project_1", "ui_1" - ) - - # Test from_local_cache with use_static_cache=True - try: - cloudapi.BehaviorProjectCloudApi.from_local_cache( - "second_cache_dir", "project_2", "ui_2", use_static_cache=True - ) - # Because cache is a mock, the following calls in the load_manifest - # method of BehaviorProjectCloudApi will fail with TypeError: - # self._get_ophys_session_table() - # self._get_behavior_session_table() - # self._get_ophys_experiment_table() - except (TypeError, FileNotFoundError): - pass - - mock_static_local_cache.assert_called_once_with( - "second_cache_dir", "project_2", "ui_2" - ) diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py deleted file mode 100644 index a5f21c5a79..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py +++ /dev/null @@ -1,108 +0,0 @@ -import pytest - -from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io import BehaviorProjectLimsApi # noqa: E501 -from allensdk.test_utilities.custom_comparators import ( - WhitespaceStrippedString) - - -class MockQueryEngine: - def __init__(self, **kwargs): - pass - - def select(self, query): - return query - - def fetchall(self, query): - return query - - def stream(self, endpoint): - return endpoint - - -@pytest.fixture -def MockBehaviorProjectLimsApi(): - return BehaviorProjectLimsApi(MockQueryEngine(), MockQueryEngine(), - MockQueryEngine()) - - -@pytest.mark.parametrize( - "col,valid_list,operator,expected", [ - ("os.id", [1, 2, 3], "WHERE", "WHERE os.id IN (1,2,3)"), - ("id2", ["'a'", "'b'"], "AND", "AND id2 IN ('a','b')"), - ("id3", [1.0], "OR", "OR id3 IN (1.0)"), - ("id4", None, "WHERE", "")] -) -def test_build_in_list_selector_query( - col, valid_list, operator, expected, MockBehaviorProjectLimsApi): - assert (expected - == MockBehaviorProjectLimsApi._build_in_list_selector_query( - col, valid_list, operator)) - - -@pytest.mark.parametrize( - "behavior_session_ids,expected", [ - (None, - WhitespaceStrippedString(""" - SELECT foraging_id - FROM behavior_sessions - WHERE foraging_id IS NOT NULL - ; - """)), - (["'id1'", "'id2'"], - WhitespaceStrippedString(""" - SELECT foraging_id - FROM behavior_sessions - WHERE foraging_id IS NOT NULL - AND id IN ('id1','id2'); - """)) - ] -) -def test_get_foraging_ids_from_behavior_session( - behavior_session_ids, expected, MockBehaviorProjectLimsApi): - mock_api = MockBehaviorProjectLimsApi - assert expected == mock_api._get_foraging_ids_from_behavior_session( - behavior_session_ids) - - -def test_get_behavior_stage_table(MockBehaviorProjectLimsApi): - expected = WhitespaceStrippedString(""" - SELECT - stages.name as session_type, - bs.id AS foraging_id - FROM behavior_sessions bs - JOIN stages ON stages.id = bs.state_id - ; - """) - mock_api = MockBehaviorProjectLimsApi - actual = mock_api._get_behavior_stage_table() - assert expected == actual - - -@pytest.mark.parametrize( - "line,expected", [ - ("reporter", WhitespaceStrippedString( - """-- -- begin getting reporter line from donors -- -- - SELECT ARRAY_AGG (g.name) AS reporter_line, d.id AS donor_id - FROM donors d - LEFT JOIN donors_genotypes dg ON dg.donor_id=d.id - LEFT JOIN genotypes g ON g.id=dg.genotype_id - LEFT JOIN genotype_types gt ON gt.id=g.genotype_type_id - WHERE gt.name='reporter' - GROUP BY d.id - -- -- end getting reporter line from donors -- --""")), - ("driver", WhitespaceStrippedString( - """-- -- begin getting driver line from donors -- -- - SELECT ARRAY_AGG (g.name) AS driver_line, d.id AS donor_id - FROM donors d - LEFT JOIN donors_genotypes dg ON dg.donor_id=d.id - LEFT JOIN genotypes g ON g.id=dg.genotype_id - LEFT JOIN genotype_types gt ON gt.id=g.genotype_type_id - WHERE gt.name='driver' - GROUP BY d.id - -- -- end getting driver line from donors -- --""")) - ] -) -def test_build_line_from_donor_query(line, expected, - MockBehaviorProjectLimsApi): - mbp_api = MockBehaviorProjectLimsApi - assert expected == mbp_api._build_line_from_donor_query(line=line) diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py deleted file mode 100644 index 6fb60a107e..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py +++ /dev/null @@ -1,160 +0,0 @@ -import copy -import pandas as pd - -from allensdk.brain_observatory.behavior.behavior_project_cache.\ - tables.util.experiments_table_utils import ( - add_experience_level_to_experiment_table, - add_passive_flag_to_ophys_experiment_table, - add_image_set_to_experiment_table) - - -def test_add_experience_level(): - - input_data = [] - expected_data = [] - - datum = {'id': 0, - 'session_number': 1, - 'prior_exposures_to_image_set': 4} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'Familiar' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 1, - 'session_number': 2, - 'prior_exposures_to_image_set': 5} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'Familiar' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 2, - 'session_number': 3, - 'prior_exposures_to_image_set': 1772} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'Familiar' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 3, - 'session_number': 4, - 'prior_exposures_to_image_set': 0} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'Novel 1' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 4, - 'session_number': 5, - 'prior_exposures_to_image_set': 0} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'None' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 5, - 'session_number': 6, - 'prior_exposures_to_image_set': 0} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'None' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 7, - 'session_number': 4, - 'prior_exposures_to_image_set': 2} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'Novel >1' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 8, - 'session_number': 5, - 'prior_exposures_to_image_set': 1} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'Novel >1' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 9, - 'session_number': 6, - 'prior_exposures_to_image_set': 3} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'Novel >1' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 10, - 'session_number': 7, - 'prior_exposures_to_image_set': 3} - input_data.append(copy.deepcopy(datum)) - datum['experience_level'] = 'None' - expected_data.append(copy.deepcopy(datum)) - - input_df = pd.DataFrame(input_data) - expected_df = pd.DataFrame(expected_data) - output_df = add_experience_level_to_experiment_table(input_df) - assert not input_df.equals(output_df) - assert len(input_df.columns) != len(output_df.columns) - assert output_df.equals(expected_df) - - -def test_add_passive_flag(): - - input_data = [] - expected_data = [] - - datum = {'id': 0, 'session_number': 2} - input_data.append(copy.deepcopy(datum)) - datum['passive'] = True - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 1, 'session_number': 5} - input_data.append(copy.deepcopy(datum)) - datum['passive'] = True - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 2, 'session_number': 1} - input_data.append(copy.deepcopy(datum)) - datum['passive'] = False - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 3, 'session_number': 3} - input_data.append(copy.deepcopy(datum)) - datum['passive'] = False - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 4, 'session_number': 2} - input_data.append(copy.deepcopy(datum)) - datum['passive'] = True - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 5, 'session_number': 5} - input_data.append(copy.deepcopy(datum)) - datum['passive'] = True - expected_data.append(copy.deepcopy(datum)) - - input_df = pd.DataFrame(input_data) - expected_df = pd.DataFrame(expected_data) - assert not input_df.equals(expected_df) - output_df = add_passive_flag_to_ophys_experiment_table( - input_df) - assert not input_df.equals(output_df) - assert len(input_df.columns) != len(output_df.columns) - assert output_df.equals(expected_df) - - -def test_add_image_set_to_experiment_table(): - - input_data = [] - expected_data = [] - - datum = {'id': 0, 'session_type': 'ophys_5_images_x_passive'} - input_data.append(copy.deepcopy(datum)) - datum['image_set'] = 'x' - expected_data.append(copy.deepcopy(datum)) - - datum = {'id': 1, 'session_type': 'ophys_5'} - input_data.append(copy.deepcopy(datum)) - datum['image_set'] = 'N/A' - expected_data.append(copy.deepcopy(datum)) - - input_df = pd.DataFrame(input_data) - expected_df = pd.DataFrame(expected_data) - assert not expected_df.equals(input_df) - output_df = add_image_set_to_experiment_table(input_df) - assert not input_df.equals(output_df) - assert len(input_df.columns) != len(output_df.columns) - assert output_df.equals(expected_df) diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py deleted file mode 100644 index 11763ddeff..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py +++ /dev/null @@ -1,363 +0,0 @@ -from unittest.mock import create_autospec - -import pytest - -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ - BehaviorOphysExperiment -from allensdk.brain_observatory.behavior.behavior_session import \ - BehaviorSession -from .utils import create_bucket, load_dataset -import boto3 -from moto import mock_s3 -import pathlib -import json -import semver - -from allensdk.api.cloud_cache.cloud_cache import MissingLocalManifestWarning -from allensdk.api.cloud_cache.cloud_cache import OutdatedManifestWarning -from allensdk.brain_observatory.\ - behavior.behavior_project_cache.behavior_project_cache \ - import VisualBehaviorOphysProjectCache - - -@mock_s3 -def test_manifest_methods(tmpdir, s3_cloud_cache_data): - - data, versions = s3_cloud_cache_data - - cache_dir = pathlib.Path(tmpdir) / "test_manifest_list" - bucket_name = "vis-behav-test-bucket" - project_name = "vis-behav-test-proj" - create_bucket(bucket_name, - project_name, - data['data'], - data['metadata']) - - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] - m_list = cache.list_manifest_file_names() - - assert len(m_list) == 2 - assert all([i in m_list for i in v_names]) - cache.load_manifest(v_names[0]) - - # because the BehaviorProjectCloudApi automatically - # loads the latest manifest, so the latest manifest - # will always be the latest_downloaded_manifest - assert cache.latest_downloaded_manifest_file() == v_names[-1] - assert cache.latest_manifest_file() == v_names[-1] - - change_msg = cache.compare_manifests(v_names[0], v_names[-1]) - - for mname in ('behavior_session_table', - 'ophys_session_table', - 'ophys_experiment_table'): - assert f'project_metadata/{mname} changed' in change_msg - - assert 'ophys_file_1.nwb changed' in change_msg - assert 'ophys_file_5.nwb created' in change_msg - assert 'ophys_file_2.nwb' not in change_msg - assert 'behavior_file_3.nwb' not in change_msg - assert 'behavior_file_4.nwb' not in change_msg - - -@mock_s3 -def test_local_cache_construction(tmpdir, s3_cloud_cache_data, monkeypatch): - - data, versions = s3_cloud_cache_data - cache_dir = pathlib.Path(tmpdir) / "test_construction" - bucket_name = "vis-behav-test-bucket" - project_name = "vis-behav-test-proj" - create_bucket(bucket_name, - project_name, - data['data'], - data['metadata']) - - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] - cache.load_manifest(v_names[0]) - - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', - lambda path: create_autospec( - BehaviorOphysExperiment, instance=True)) - cache.get_behavior_ophys_experiment(ophys_experiment_id=5111) - assert cache.fetch_api.cache._downloaded_data_path.is_file() - cache.fetch_api.cache._downloaded_data_path.unlink() - assert not cache.fetch_api.cache._downloaded_data_path.is_file() - del cache - - with pytest.warns(MissingLocalManifestWarning) as warnings: - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - cmd = 'VisualBehaviorOphysProjectCache.construct_local_manifest()' - assert cmd in f'{warnings[0].message}' - - # Because, at the point where the cache was reconstitute, - # the metadata files already existed at their expected local paths, - # the file at _downloaded_data_path file will not have been created - manifest_path = cache.fetch_api.cache._downloaded_data_path - assert not manifest_path.exists() - - cache.construct_local_manifest() - assert cache.fetch_api.cache._downloaded_data_path.is_file() - - with open(manifest_path, 'rb') as in_file: - local_manifest = json.load(in_file) - fnames = set([pathlib.Path(k).name for k in local_manifest]) - assert 'ophys_file_1.nwb' in fnames - assert len(local_manifest) == 9 # 8 metadata files and 1 data file - - -@mock_s3 -def test_load_out_of_date_manifest(tmpdir, s3_cloud_cache_data, monkeypatch): - """ - Test that VisualBehaviorOphysProjectCache can load a - manifest other than the latest and download files - from that manifest. - """ - data, versions = s3_cloud_cache_data - - cache_dir = pathlib.Path(tmpdir) / "test_linkage" - bucket_name = "vis-behav-test-bucket" - project_name = "vis-behav-test-proj" - create_bucket(bucket_name, - project_name, - data['data'], - data['metadata']) - - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] - cache.load_manifest(v_names[0]) - for sess_id in (333, 444): - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorSession, 'from_nwb_path', - lambda path: create_autospec( - BehaviorSession, instance=True)) - cache.get_behavior_session(behavior_session_id=sess_id) - for exp_id in (5111, 5222): - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', - lambda path: create_autospec( - BehaviorOphysExperiment, instance=True)) - cache.get_behavior_ophys_experiment(ophys_experiment_id=exp_id) - - v1_dir = cache_dir / f'{project_name}-{versions[0]}/data' - - # Check that all expected file were downloaded - dir_glob = v1_dir.glob('*') - file_names = set() - file_contents = {} - for p in dir_glob: - file_names.add(p.name) - with open(p, 'rb') as in_file: - data = in_file.read() - file_contents[p.name] = data - expected = {'ophys_file_1.nwb', 'ophys_file_2.nwb', - 'behavior_file_3.nwb', 'behavior_file_4.nwb'} - - assert file_names == expected - - expected = {} - expected['ophys_file_1.nwb'] = b'abcde' - expected['ophys_file_2.nwb'] = b'fghijk' - expected['behavior_file_3.nwb'] = b'12345' - expected['behavior_file_4.nwb'] = b'67890' - - assert file_contents == expected - - -@mock_s3 -@pytest.mark.parametrize("delete_cache", [True, False]) -def test_file_linkage(tmpdir, s3_cloud_cache_data, delete_cache, monkeypatch): - """ - Test that symlinks are used where appropriate - - if delete_cache == True, will delete the local cache - file between loading v1 and v2 manifests, then run - construct_local_cache() to make sure that the symlinks - are still properly constructed - """ - data, versions = s3_cloud_cache_data - cache_dir = pathlib.Path(tmpdir) / "test_linkage" - bucket_name = "vis-behav-test-bucket" - project_name = "vis-behav-test-proj" - create_bucket(bucket_name, - project_name, - data['data'], - data['metadata']) - - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] - v_dirs = [cache_dir / f'{project_name}-{i}/data' for i in versions] - - assert cache.current_manifest() == v_names[-1] - assert cache.list_all_downloaded_manifests() == [v_names[-1]] - - cache.load_manifest(v_names[0]) - assert cache.current_manifest() == v_names[0] - assert cache.list_all_downloaded_manifests() == v_names - - for sess_id in (333, 444): - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorSession, 'from_nwb_path', - lambda path: create_autospec( - BehaviorSession, instance=True)) - cache.get_behavior_session(behavior_session_id=sess_id) - for exp_id in (5111, 5222): - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', - lambda path: create_autospec( - BehaviorOphysExperiment, instance=True)) - cache.get_behavior_ophys_experiment(ophys_experiment_id=exp_id) - - v1_glob = v_dirs[0].glob('*') - v1_paths = {} - for p in v1_glob: - v1_paths[p.name] = p - - if delete_cache: - local_cache = cache.fetch_api.cache._downloaded_data_path - assert local_cache.is_file() - local_cache.unlink() - assert not local_cache.is_file() - del cache - - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - cache.construct_local_manifest() - - cache.load_manifest(v_names[-1]) - assert cache.current_manifest() == v_names[-1] - for sess_id in (777, 888): - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorSession, 'from_nwb_path', - lambda path: create_autospec( - BehaviorSession, instance=True)) - cache.get_behavior_session(behavior_session_id=sess_id) - for exp_id in (5444, 5666, 5777): - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorOphysExperiment, 'from_nwb_path', - lambda path: create_autospec( - BehaviorOphysExperiment, instance=True)) - cache.get_behavior_ophys_experiment(ophys_experiment_id=exp_id) - - v2_glob = v_dirs[-1].glob('*') - v2_paths = {} - for p in v2_glob: - v2_paths[p.name] = p - - # check symlinks - for name in ('ophys_file_2.nwb', - 'behavior_file_3.nwb', - 'behavior_file_4.nwb'): - - assert v2_paths[name].is_symlink() - assert v2_paths[name].resolve() == v1_paths[name].resolve() - assert v2_paths[name].absolute() != v1_paths[name].absolute() - - name = 'ophys_file_1.nwb' - assert not v2_paths[name].is_symlink() - assert not v2_paths[name].absolute() == v1_paths[name].absolute() - - assert 'ophys_file_5.nwb' in v2_paths - - -@mock_s3 -def test_when_data_updated(tmpdir, s3_cloud_cache_data, data_update): - """ - Test that when a cache is instantiated after an update has - been loaded to the dataset, the correct warning is emitted - """ - data, versions = s3_cloud_cache_data - cache_dir = pathlib.Path(tmpdir) / "test_update" - bucket_name = "vis-behav-test-bucket" - project_name = "vis-behav-test-proj" - create_bucket(bucket_name, - project_name, - data['data'], - data['metadata']) - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - del cache - - client = boto3.client('s3', region_name='us-east-1') - - later_version = str(semver.parse_version_info(versions[-1]).bump_minor()) - load_dataset(data_update['data'], - data_update['metadata'], - later_version, - bucket_name, - project_name, - client) - - name3 = f'{project_name}_manifest_v{later_version}' - name2 = f'{project_name}_manifest_v{versions[-1]}' - - cmd = 'VisualBehaviorOphysProjectCache.load_manifest' - with pytest.warns(OutdatedManifestWarning, match=name3) as warnings: - VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - checked_msg = False - for w in warnings.list: - if w._category_name == 'OutdatedManifestWarning': - msg = str(w.message) - assert name3 in msg - assert name2 in msg - assert cmd in msg - checked_msg = True - assert checked_msg - - -@mock_s3 -def test_load_last(tmpdir, s3_cloud_cache_data, data_update): - """ - Test that, when a cache is instantiated over an old - cache_dir, it loads the most recently loaded manifest, - not the most up to date manifest - """ - data, versions = s3_cloud_cache_data - cache_dir = pathlib.Path(tmpdir) / "test_update" - bucket_name = "vis-behav-test-bucket" - project_name = "vis-behav-test-proj" - create_bucket(bucket_name, - project_name, - data['data'], - data['metadata']) - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - v_names = [f'{project_name}_manifest_v{i}.json' for i in versions] - - assert cache.current_manifest() == v_names[-1] - cache.load_manifest(v_names[0]) - assert cache.current_manifest() == v_names[0] - del cache - - msg = 'VisualBehaviorOphysProjectCache.compare_manifests' - with pytest.warns(OutdatedManifestWarning, match=msg): - cache = VisualBehaviorOphysProjectCache.from_s3_cache(cache_dir, - bucket_name, - project_name) - - assert cache.current_manifest() == v_names[0] diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache/utils.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/utils.py deleted file mode 100644 index 0a51ff20ad..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache/utils.py +++ /dev/null @@ -1,154 +0,0 @@ -from typing import Union -import boto3 -import json -import hashlib - - -def load_dataset(data_blobs: dict, - metadata_blobs: Union[dict, None], - manifest_version: str, - bucket_name: str, - project_name: str, - client: boto3.client) -> None: - """ - Load a test dataset into moto's mocked S3 - - Parameters - ---------- - data_blobs: dict - Maps filename to a dict - 'data': the bytes in the data file - 'file_id': the file_id of the data file - - metadata_blobs: Union[dict, None] - A dict mapping metadata filename to bytes in the file - - manifest_version: str - The version of the manifest (manifest will be - uploaded to moto3 as manifest_{manifest_version}.json) - - bucket_name: str - - project_name: str - - client: boto3.client - - Returns - ------- - None - Uploads the provided data, generates the manifest, - and uploads the manifest to moto3 - """ - - for fname in data_blobs: - client.put_object(Bucket=bucket_name, - Key=f'{project_name}/data/{fname}', - Body=data_blobs[fname]['data']) - - if metadata_blobs is not None: - for fname in metadata_blobs: - client.put_object(Bucket=bucket_name, - Key=f'{project_name}/project_metadata/{fname}', - Body=metadata_blobs[fname]) - - response = client.list_object_versions(Bucket=bucket_name) - fname_to_version = {} - for obj in response['Versions']: - if obj['IsLatest']: - fname = obj['Key'].split('/')[-1] - fname_to_version[fname] = obj['VersionId'] - - manifest = {} - manifest['manifest_version'] = manifest_version - manifest['project_name'] = project_name - manifest['metadata_file_id_column_name'] = 'file_id' - manifest['metadata_files'] = {} - manifest['data_pipeline'] = [{'name': 'AllenSDK', 'version': '1.1.1'}] - - data_file_dict = {} - url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/data' - for fname in data_blobs: - url = f'{url_root}/{fname}' - hasher = hashlib.blake2b() - hasher.update(data_blobs[fname]['data']) - checksum = hasher.hexdigest() - - data_file = {'url': url, - 'version_id': fname_to_version[fname], - 'file_hash': checksum} - - data_file_dict[data_blobs[fname]['file_id']] = data_file - - manifest['data_files'] = data_file_dict - - if metadata_blobs is not None: - url_root = f'http://{bucket_name}.s3.amazonaws.com/{project_name}/' - url_root += 'project_metadata' - - metadata_dict = {} - for fname in metadata_blobs: - url = f'{url_root}/{fname}' - hasher = hashlib.blake2b() - hasher.update(metadata_blobs[fname]) - metadata_dict[fname] = {'url': url, - 'file_hash': hasher.hexdigest(), - 'version_id': fname_to_version[fname]} - - manifest['metadata_files'] = metadata_dict - - manifest_k = f'{project_name}/manifests/' - manifest_k += f'{project_name}_manifest_v{manifest_version}.json' - client.put_object(Bucket=bucket_name, - Key=manifest_k, - Body=bytes(json.dumps(manifest), 'utf-8')) - - return None - - -def create_bucket(test_bucket_name: str, - project_name: str, - datasets: dict, - metadatasets: dict) -> None: - """ - Create a bucket and populate it with example datasets - - Parameters - ---------- - test_bucket_name: str - Name of the bucket - - project_name: str - Name of project - - datasets: dict - Keyed on version names; values are dicts of individual - data files to be loaded to the bucket - - metadatasets: dict - Keyed on version names; values are dicts of individual - metadata files to be loaded to the bucket (default: None) - """ - - conn = boto3.resource('s3', region_name='us-east-1') - conn.create_bucket(Bucket=test_bucket_name, ACL='public-read') - - # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucketversioning - bucket_versioning = conn.BucketVersioning(test_bucket_name) - bucket_versioning.enable() - - client = boto3.client('s3', region_name='us-east-1') - - # upload first dataset - for v in datasets.keys(): - if metadatasets is not None: - m = metadatasets[v] - else: - m = None - load_dataset(datasets[v], - m, - v, - test_bucket_name, - project_name, - client) - - return None diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py deleted file mode 100644 index b9fbd4808a..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py +++ /dev/null @@ -1,699 +0,0 @@ -import os -import copy -import numpy as np -import pytest -import pandas as pd -import tempfile - -from allensdk.brain_observatory.behavior.behavior_project_cache \ - import VisualBehaviorOphysProjectCache - -from allensdk.brain_observatory.behavior.behavior_project_cache.\ - tables.util.experiments_table_utils import ( - add_experience_level_to_experiment_table, - add_passive_flag_to_ophys_experiment_table, - add_image_set_to_experiment_table) - -from allensdk.brain_observatory.behavior.behavior_project_cache.tables \ - .util.prior_exposure_processing import \ - get_prior_exposures_to_session_type, \ - get_prior_exposures_to_image_set, \ - get_prior_exposures_to_omissions -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.full_genotype import \ - FullGenotype -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.reporter_line import \ - ReporterLine - - -@pytest.fixture(scope='session') -def behavior_session_id_list(): - """ - List of behavior_session_id; the most fundamental fixture - """ - return list(range(1, 9)) - - -@pytest.fixture(scope='session') -def session_name_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to session_name - """ - return {ii: f'session_{ii}' - for ii in behavior_session_id_list} - - -@pytest.fixture(scope='session') -def date_of_acquisition_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to date of acquisition - """ - return {ii: np.datetime64(f'2020-02-{ii:02d}') - for ii in behavior_session_id_list} - - -@pytest.fixture(scope='session') -def session_type_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to session_type - """ - rng = np.random.default_rng(871231) - possible = ('TRAINING_1_gratings', - 'OPHYS_1_images_A', - 'OPHYS_1_images_B') - - vals = rng.choice(possible, - size=len(behavior_session_id_list), - replace=True) - - return {ii: vv - for ii, vv in zip(behavior_session_id_list, - vals)} - - -@pytest.fixture(scope='session') -def project_code_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to project_code - """ - return {ii: 'code{ii}' - for ii in behavior_session_id_list} - - -@pytest.fixture(scope='session') -def specimen_id_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to specimen_id - """ - return {ii: 1111*ii - for ii in behavior_session_id_list} - - -@pytest.fixture(scope='session') -def genotype_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to full_genotype - """ - rng = np.random.default_rng(981232) - possible = ('foo-SlcCre', - 'Vip-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt', - 'bar', - 'foobar') - chosen = rng.choice(possible, - size=len(behavior_session_id_list), - replace=True) - return {ii: val - for ii, val in zip(behavior_session_id_list, chosen)} - - -@pytest.fixture(scope='session') -def reporter_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to reporter_line - """ - return {ii: f"Ai{90+ii}(TITL-GCaMP6f)" - for ii in behavior_session_id_list} - - -@pytest.fixture(scope='session') -def driver_lookup(behavior_session_id_list): - """ - Dict mapping behavior_session_id to driver_line. - Note: driver_line is a list of strings - """ - rng = np.random.default_rng(1723213) - possible = (["aa"], - ["aa", "bb"], - ["cc"], - ["cc", "dd"]) - chosen = rng.choice(possible, - size=len(behavior_session_id_list), - replace=True) - return {ii: val - for ii, val in zip(behavior_session_id_list, - chosen)} - - -@pytest.fixture(scope='session') -def behavior_session_data_fixture(behavior_session_id_list, - session_name_lookup, - date_of_acquisition_lookup, - session_type_lookup, - specimen_id_lookup, - genotype_lookup, - reporter_lookup, - driver_lookup): - """ - List of dicts. Each dict is an entry in the raw - behavior_session_table as would be returned by the - fetch_api - """ - - behavior_session_list = [] - for s_id in behavior_session_id_list: - - genotype = genotype_lookup[s_id] - driver = driver_lookup[s_id] - reporter = reporter_lookup[s_id] - date = date_of_acquisition_lookup[s_id] - specimen_id = specimen_id_lookup[s_id] - s_name = session_name_lookup[s_id] - s_type = session_type_lookup[s_id] - datum = {'behavior_session_id': s_id, - 'session_name': s_name, - 'date_of_acquisition': date, - 'specimen_id': specimen_id, - 'session_type': s_type, - 'equipment_name': 'MESO2.0', - 'donor_id': 20+s_id, - 'full_genotype': genotype, - 'sex': ['m', 'f'][s_id % 2], - 'age_in_days': s_id*7, - 'foraging_id': s_id+30, - 'mouse_id': s_id+40, - 'reporter_line': reporter, - 'driver_line': driver} - - behavior_session_list.append(datum) - - return behavior_session_list - - -@pytest.fixture() -def behavior_session_table(behavior_session_data_fixture): - """ - The behavior_session_table dataframe as returned by the - fetch_api - """ - data = [] - index = [] - for datum in behavior_session_data_fixture: - datum = copy.deepcopy(datum) - index.append(datum.pop('behavior_session_id')) - data.append(datum) - - df = pd.DataFrame( - data, - index=pd.Index(index, name='behavior_session_id')) - return df - - -@pytest.fixture(scope='session') -def behavior_session_to_ophys_session_map(behavior_session_id_list): - """ - Dict mapping behavior_session_id to ophys_session_id. - This is a one-to-one mapping, though not all behavior_sessions - have corresponding ophys_sessions - """ - lookup = dict() - ophys_id = 88 - for ii in range(0, len(behavior_session_id_list)): - if ii % 3 == 0: - continue - lookup[behavior_session_id_list[ii]] = ophys_id - ophys_id += 1 - return lookup - - -@pytest.fixture(scope='session') -def ophys_session_to_experiment_map(behavior_session_to_ophys_session_map): - """ - Dict mapping ophys_session_id to a list of ophys_experiment_ids - (this is a one-to-many relationship) - """ - lookup = dict() - i0 = 1000 - dd = 5 - ophys_vals = list(behavior_session_to_ophys_session_map.values()) - ophys_vals.sort() - for ii in ophys_vals: - lookup[ii] = list(range(i0, i0+dd)) - i0 += dd - - return lookup - - -@pytest.fixture(scope='session') -def ophys_experiment_to_container_map(ophys_session_to_experiment_map): - """ - Dict mapping ophys_experiment_id to a list of ophys_container_ids - (this is a one-to-many relationship) - """ - lookup = dict() - container_id = 4000 - key_list = list(ophys_session_to_experiment_map.keys()) - key_list.sort() - for key in key_list: - experiment_list = ophys_session_to_experiment_map[key] - for exp_id in experiment_list: - local_list = [] - for ii in range(7): - container_id += 1 - local_list.append(container_id) - lookup[exp_id] = local_list - return lookup - - -@pytest.fixture(scope='session') -def container_state_lookup(ophys_experiment_to_container_map): - """ - Dict mapping ophys_container_id to container_workflow_state - Note: each ophys_experiment_id can only be associated with - one 'published' ophys_container. - """ - rng = np.random.default_rng(66232) - exp_id_list = list(ophys_experiment_to_container_map.keys()) - exp_id_list.sort() - lookup = dict() - for exp_id in exp_id_list: - local_container_list = ophys_experiment_to_container_map[exp_id] - for container_id in local_container_list: - assert container_id not in lookup - lookup[container_id] = 'junk' - good_container = rng.choice(local_container_list) - lookup[good_container] = 'published' - return lookup - - -@pytest.fixture(scope='session') -def experiment_state_lookup(ophys_session_data_fixture): - """ - Dict mapping ophys_experiment_id to the experiment_workflow_state - """ - rng = np.random.default_rng(772312) - exp_id_list = [] - for datum in ophys_session_data_fixture: - for exp_id in datum['ophys_experiment_id']: - if exp_id not in exp_id_list: - exp_id_list.append(exp_id) - lookup = dict() - for exp_id in exp_id_list: - lookup[exp_id] = ['passed', 'failed'][rng.integers(0, 2)] - return lookup - - -@pytest.fixture(scope='session') -def ophys_session_data_fixture(project_code_lookup, - session_name_lookup, - date_of_acquisition_lookup, - specimen_id_lookup, - session_type_lookup, - ophys_session_to_experiment_map, - ophys_experiment_to_container_map, - behavior_session_to_ophys_session_map): - """ - List of dicts. - Each dict is one entry in the ophys_session_table as returned - by the fetch_api. - """ - - ophys_session_list = [] - ophys_session_id_list = list(ophys_session_to_experiment_map.keys()) - ophys_session_id_list.sort() - for beh in behavior_session_to_ophys_session_map: - o_session = behavior_session_to_ophys_session_map[beh] - container_list = [] - for exp_id in ophys_session_to_experiment_map[o_session]: - container_list += ophys_experiment_to_container_map[exp_id] - - datum = {'behavior_session_id': beh, - 'project_code': project_code_lookup[beh], - 'date_of_acquisition': date_of_acquisition_lookup[beh], - 'session_name': session_name_lookup[beh], - 'session_type': session_type_lookup[beh], - 'ophys_experiment_id': - ophys_session_to_experiment_map[o_session], - 'ophys_container_id': container_list, - 'specimen_id': 9*beh, - 'ophys_session_id': o_session} - - ophys_session_list.append(datum) - return ophys_session_list - - -@pytest.fixture() -def ophys_session_table(ophys_session_data_fixture): - """ - The ophys_session_table dataframe as returned by the fetch_api - """ - data = [] - index = [] - for datum in ophys_session_data_fixture: - datum = copy.deepcopy(datum) - index.append(datum.pop('ophys_session_id')) - data.append(datum) - - df = pd.DataFrame( - data, - index=pd.Index(index, name='ophys_session_id')) - return df - - -@pytest.fixture(scope='session') -def ophys_experiment_data_fixture(ophys_session_data_fixture, - experiment_state_lookup, - container_state_lookup, - ophys_experiment_to_container_map): - """ - List of dicts. - Each dict is an entry in the ophys_experiment_table as returned - by the fetch_api. - """ - rng = np.random.default_rng(182312) - - isi_id = 4000 - ophys_experiment_list = [] - for ophys_session in ophys_session_data_fixture: - for i_experiment in ophys_session['ophys_experiment_id']: - cntr_id_list = ophys_experiment_to_container_map[i_experiment] - for container_id in cntr_id_list: - datum = { - 'ophys_session_id': ophys_session['ophys_session_id'], - 'session_type': ophys_session['session_type'], - 'behavior_session_id': - ophys_session['behavior_session_id'], - 'ophys_container_id': container_id, - 'container_workflow_state': - container_state_lookup[container_id], - 'experiment_workflow_state': - experiment_state_lookup[i_experiment], - 'session_name': ophys_session['session_name'], - 'date_of_acquisition': - ophys_session['date_of_acquisition'], - 'isi_experiment_id': isi_id, - 'imaging_depth': rng.integers(50, 200), - 'targeted_tructure': 'VISp', - 'published_at': ophys_session['date_of_acquisition'], - 'ophys_experiment_id': i_experiment} - ophys_experiment_list.append(datum) - return ophys_experiment_list - - -@pytest.fixture() -def ophys_experiments_table(ophys_experiment_data_fixture): - """ - The ophys_experiments_table as returned by the fetch_api - (a dataframe) - """ - data = [] - index = [] - for datum in ophys_experiment_data_fixture: - datum = copy.deepcopy(datum) - index.append(datum.pop('ophys_experiment_id')) - data.append(datum) - - df = pd.DataFrame( - data, - index=pd.Index(index, name='ophys_experiment_id')) - return df - - -@pytest.fixture() -def intermediate_behavior_table(behavior_session_table, - mock_api): - """ - A dataframe created by adding/transfrming columns in - behavior_session_table. This table is used to produce the - expected experiments_table and ophys_session_table. - """ - df = behavior_session_table.copy(deep=True) - - df['reporter_line'] = df['reporter_line'].apply( - ReporterLine.parse) - df['cre_line'] = df['full_genotype'].apply( - lambda x: FullGenotype(full_genotype=x).parse_cre_line()) - df['indicator'] = df['reporter_line'].apply( - lambda x: ReporterLine(reporter_line=x).parse_indicator()) - - df['prior_exposures_to_session_type'] = \ - get_prior_exposures_to_session_type(df=df) - df['prior_exposures_to_image_set'] = \ - get_prior_exposures_to_image_set(df=df) - df['prior_exposures_to_omissions'] = \ - get_prior_exposures_to_omissions( - df=df, - fetch_api=mock_api) - return df - - -@pytest.fixture() -def expected_behavior_session_table(intermediate_behavior_table, - ophys_session_data_fixture, - mock_api, - container_state_lookup, - experiment_state_lookup, - ophys_experiment_to_container_map, - request): - """ - The behavior_session_table as returned by the user-facing methods - in behavior_project_cache. - - Note: request specifies whether the table was produced with - passed_only = True or False. The actual object returned by - this fixture is a dict. 'df' points to the dataframe. - 'passed_only' points to the value of passed_only used to - generate the dataframe. - """ - if hasattr(request, 'param'): - passed_only = request.param - else: - passed_only = True - - df = intermediate_behavior_table.copy(deep=True) - - df['session_name_behavior'] = df['session_name'] - df = df.drop(['session_name'], axis=1) - df['specimen_id_behavior'] = df['specimen_id'] - df = df.drop(['specimen_id'], axis=1) - - df['project_code'] = None - df['ophys_session_id'] = None - df['session_name_ophys'] = None - df['ophys_experiment_id'] = None - df['ophys_container_id'] = None - df['specimen_id_ophys'] = None - - session_number = [] - for v in df['session_type'].values: - if 'OPHYS' in v: - session_number.append(1) - else: - session_number.append(None) - df['session_number'] = session_number - - for ophys_session in ophys_session_data_fixture: - index = ophys_session['behavior_session_id'] - df.at[index, 'project_code'] = ophys_session['project_code'] - df.at[index, 'ophys_session_id'] = ophys_session['ophys_session_id'] - df.at[index, 'session_name_ophys'] = ophys_session['session_name'] - - container_id_list = set() - exp_id_list = set() - for exp_id in ophys_session['ophys_experiment_id']: - # because SessionsTable does not filter on experiment state - exp_id_list.add(exp_id) - if experiment_state_lookup[exp_id] != 'passed' and passed_only: - continue - for container_id in ophys_experiment_to_container_map[exp_id]: - is_published = (container_state_lookup[container_id] - == 'published') - if is_published or not passed_only: - container_id_list.add(container_id) - - exp_id_list = list(exp_id_list) - exp_id_list.sort() - container_id_list = list(container_id_list) - container_id_list.sort() - - df.at[index, 'ophys_container_id'] = container_id_list - df.at[index, 'ophys_experiment_id'] = exp_id_list - df.at[index, 'specimen_id_ophys'] = ophys_session['specimen_id'] - - df['ophys_session_id'] = df['ophys_session_id'].astype(float) - - return {'df': df, 'passed_only': passed_only} - - -@pytest.fixture() -def expected_experiments_table(ophys_experiments_table, - container_state_lookup, - experiment_state_lookup, - intermediate_behavior_table, - request): - """ - The experiments_table as returned by the user-facing methods - in the behavior_project_cache - - Note: request specifies whether the table was produced with - passed_only = True or False. The actual object returned by - this fixture is a dict. 'df' points to the dataframe. - 'passed_only' points to the value of passed_only used to - generate the dataframe. - """ - - if hasattr(request, 'param'): - passed_only = request.param - else: - passed_only = True - - behavior_table = intermediate_behavior_table.copy(deep=True) - expected = ophys_experiments_table.copy(deep=True) - - if passed_only: - expected = expected.query("experiment_workflow_state=='passed'") - expected = expected.query("container_workflow_state=='published'") - - expected = expected.join(behavior_table[ - ['equipment_name', - 'donor_id', - 'full_genotype', - 'mouse_id', - 'driver_line', - 'sex', - 'age_in_days', - 'foraging_id', - 'reporter_line', - 'specimen_id', - 'prior_exposures_to_session_type', - 'prior_exposures_to_image_set', - 'prior_exposures_to_omissions', - 'indicator', - 'cre_line']], - on='behavior_session_id') - - expected = expected.join(behavior_table[ - ['session_name']], - on='behavior_session_id', - rsuffix='_behavior') - - session_number = [] - for v in expected['session_type'].values: - if 'OPHYS' in v: - session_number.append(1) - else: - session_number.append(None) - expected['session_number'] = session_number - - expected = add_experience_level_to_experiment_table(expected) - expected = add_passive_flag_to_ophys_experiment_table(expected) - expected = add_image_set_to_experiment_table(expected) - - expected['session_name_ophys'] = expected['session_name'] - expected = expected.drop(['session_name'], axis=1) - - return {'df': expected, 'passed_only': passed_only} - - -@pytest.fixture() -def expected_ophys_session_table(ophys_session_table, - intermediate_behavior_table, - container_state_lookup, - experiment_state_lookup, - ophys_experiment_to_container_map, - request): - """ - The ophys_session_table as returned by the user-facing methods - in the behavior_project_cache. - - Note: request specifies whether the table was produced with - passed_only = True or False. The actual object returned by - this fixture is a dict. 'df' points to the dataframe. - 'passed_only' points to the value of passed_only used to - generate the dataframe. - """ - if hasattr(request, 'param'): - passed_only = request.param - else: - passed_only = True - expected = ophys_session_table.copy(deep=True) - - if passed_only: - valid_containers = set() - valid_experiments = set() - for exp_id in ophys_experiment_to_container_map: - if experiment_state_lookup[exp_id] != 'passed': - continue - for container_id in ophys_experiment_to_container_map[exp_id]: - if container_state_lookup[container_id] == 'published': - valid_containers.add(container_id) - valid_experiments.add(exp_id) - - # ophys_sessions_table does not appear to filter on - # whether or not an experiment is 'passed'; - # that is probably supposed to happen at the level - # of the LIMS query (?) - for index_val in expected.index.values: - raw_containers = expected.loc[index_val]['ophys_container_id'] - container_id = [c for c in raw_containers if c in valid_containers] - expected.at[index_val, 'ophys_container_id'] = container_id - - behavior_table = intermediate_behavior_table.copy(deep=True) - - expected = expected.join(behavior_table[ - ['equipment_name', - 'donor_id', - 'full_genotype', - 'mouse_id', - 'driver_line', - 'sex', - 'age_in_days', - 'foraging_id', - 'reporter_line', - 'prior_exposures_to_session_type', - 'prior_exposures_to_image_set', - 'prior_exposures_to_omissions', - 'indicator', - 'cre_line']], - on='behavior_session_id') - - expected = expected.join( - behavior_table[['specimen_id', 'session_name']], - on='behavior_session_id', - rsuffix='_behavior', - lsuffix='_ophys') - - session_number = [] - for v in expected['session_type'].values: - if 'OPHYS' in v: - session_number.append(1) - else: - session_number.append(None) - expected['session_number'] = session_number - - return {'df': expected, 'passed_only': passed_only} - - -@pytest.fixture -def mock_api(ophys_session_table, - behavior_session_table, - ophys_experiments_table): - - class MockApi: - - def get_ophys_session_table(self): - return ophys_session_table - - def get_behavior_session_table(self): - return behavior_session_table - - def get_ophys_experiment_table(self): - return ophys_experiments_table - - def get_session_data(self, ophys_session_id): - return ophys_session_id - - def get_behavior_stage_parameters(self, foraging_ids): - return {x: {} for x in foraging_ids} - - return MockApi - - -@pytest.fixture -def TempdirBehaviorCache(mock_api, request): - temp_dir = tempfile.TemporaryDirectory() - manifest = os.path.join(temp_dir.name, "manifest.json") - yield VisualBehaviorOphysProjectCache(fetch_api=mock_api(), - cache=request.param, - manifest=manifest) - temp_dir.cleanup() diff --git a/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py deleted file mode 100644 index 046ef94c9d..0000000000 --- a/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py +++ /dev/null @@ -1,173 +0,0 @@ -import pytest -import pandas as pd -import logging -import os - -from allensdk.test_utilities.custom_comparators import safe_df_comparison - - -@pytest.mark.parametrize("TempdirBehaviorCache, expected_ophys_session_table", - [(True, True), - (True, False), - (False, True), - (False, False)], indirect=True) -def test_get_ophys_session_table(TempdirBehaviorCache, - expected_ophys_session_table): - cache = TempdirBehaviorCache - obtained = cache.get_ophys_session_table( - passed_only=expected_ophys_session_table['passed_only']) - if cache.cache: - path = cache.manifest.path_info.get("ophys_sessions").get("spec") - assert os.path.exists(path) - - safe_df_comparison(expected_ophys_session_table['df'], - obtained) - - -@pytest.mark.parametrize("TempdirBehaviorCache, " - "expected_behavior_session_table", - [(True, True), - (True, False), - (False, True), - (False, False)], indirect=True) -def test_get_behavior_table(TempdirBehaviorCache, - expected_behavior_session_table, - container_state_lookup, - experiment_state_lookup, - ophys_experiment_to_container_map): - cache = TempdirBehaviorCache - obtained = cache.get_behavior_session_table( - passed_only=expected_behavior_session_table['passed_only']) - expected = expected_behavior_session_table['df'] - if cache.cache: - path = cache.manifest.path_info.get("behavior_sessions").get("spec") - assert os.path.exists(path) - - safe_df_comparison(expected, obtained) - - -@pytest.mark.parametrize("TempdirBehaviorCache, " - "expected_experiments_table", - [(True, True), - (True, False), - (False, True), - (False, False)], indirect=True) -def test_get_experiments_table(TempdirBehaviorCache, - expected_experiments_table): - cache = TempdirBehaviorCache - obtained = cache.get_ophys_experiment_table( - passed_only=expected_experiments_table['passed_only']) - if cache.cache: - path = cache.manifest.path_info.get("ophys_experiments").get("spec") - assert os.path.exists(path) - - safe_df_comparison(expected_experiments_table['df'], obtained) - - -@pytest.mark.parametrize("TempdirBehaviorCache", [True], indirect=True) -def test_session_table_reads_from_cache(TempdirBehaviorCache, - caplog): - caplog.set_level(logging.INFO, logger="call_caching") - cache = TempdirBehaviorCache - cache.get_ophys_session_table() - reading_tuple = ('call_caching', logging.INFO, 'Reading data from cache') - no_file_tuple = ('call_caching', logging.INFO, 'No cache file found.') - writing_tuple = ('call_caching', logging.INFO, 'Writing data to cache') - assert reading_tuple in caplog.record_tuples - assert no_file_tuple in caplog.record_tuples - assert writing_tuple in caplog.record_tuples - - caplog.clear() - cache.get_ophys_session_table() - assert reading_tuple in caplog.record_tuples - assert no_file_tuple not in caplog.record_tuples - assert writing_tuple not in caplog.record_tuples - - -@pytest.mark.parametrize("TempdirBehaviorCache", [True], indirect=True) -def test_behavior_table_reads_from_cache(TempdirBehaviorCache, - caplog): - caplog.set_level(logging.INFO, logger="call_caching") - cache = TempdirBehaviorCache - cache.get_behavior_session_table() - reading_tuple = ('call_caching', logging.INFO, 'Reading data from cache') - no_file_tuple = ('call_caching', logging.INFO, 'No cache file found.') - writing_tuple = ('call_caching', logging.INFO, 'Writing data to cache') - assert reading_tuple in caplog.record_tuples - assert no_file_tuple in caplog.record_tuples - assert writing_tuple in caplog.record_tuples - - caplog.clear() - cache.get_behavior_session_table() - assert reading_tuple in caplog.record_tuples - assert no_file_tuple not in caplog.record_tuples - assert writing_tuple not in caplog.record_tuples - - -@pytest.mark.parametrize("TempdirBehaviorCache", [True, False], indirect=True) -def test_get_ophys_session_table_by_experiment(TempdirBehaviorCache, - expected_ophys_session_table): - - raw = expected_ophys_session_table['df'][['ophys_experiment_id']] - data = [] - for session_id, exp_id_list in zip(raw.index.values, - raw.ophys_experiment_id.values): - for exp_id in exp_id_list: - data.append({'ophys_session_id': session_id, - 'ophys_experiment_id': exp_id}) - - expected = pd.DataFrame(data).set_index('ophys_experiment_id') - - actual = TempdirBehaviorCache.get_ophys_session_table( - index_column="ophys_experiment_id")[ - ["ophys_session_id"]] - - pd.testing.assert_frame_equal(expected, actual) - - -@pytest.mark.parametrize("TempdirBehaviorCache", [True], indirect=True) -def test_cloud_manifest_errors(TempdirBehaviorCache): - """ - Test that methods which should not exist for BehaviorProjectCaches - that are not backed by CloudCaches raise NotImplementedError - """ - msg = 'Method {mname} does not exist for this ' - msg += 'VisualBehaviorOphysProjectCache, which is based on MockApi' - with pytest.raises(NotImplementedError, - match=msg.format(mname='construct_local_manifest')): - TempdirBehaviorCache.construct_local_manifest() - - with pytest.raises(NotImplementedError, - match=msg.format(mname='compare_manifests')): - TempdirBehaviorCache.compare_manifests('a', 'b') - - with pytest.raises(NotImplementedError, - match=msg.format(mname='load_latest_manifest')): - TempdirBehaviorCache.load_latest_manifest() - - this_msg = msg.format(mname='latest_downloaded_manifest_file') - with pytest.raises(NotImplementedError, - match=this_msg): - TempdirBehaviorCache.latest_downloaded_manifest_file() - - with pytest.raises(NotImplementedError, - match=msg.format(mname='latest_manifest_file')): - TempdirBehaviorCache.latest_manifest_file() - - with pytest.raises(NotImplementedError, - match=msg.format(mname='load_manifest')): - TempdirBehaviorCache.load_manifest('a') - - with pytest.raises(NotImplementedError, - match=msg.format(mname='current_manifest')): - TempdirBehaviorCache.current_manifest() - - this_msg = msg.format(mname='list_all_downloaded_manifests') - with pytest.raises(NotImplementedError, - match=this_msg): - TempdirBehaviorCache.list_all_downloaded_manifests() - - this_msg = msg.format(mname='list_manifest_file_names') - with pytest.raises(NotImplementedError, - match=this_msg): - TempdirBehaviorCache.list_manifest_file_names() diff --git a/allensdk/test/brain_observatory/behavior/conftest.py b/allensdk/test/brain_observatory/behavior/conftest.py deleted file mode 100644 index 9617c4906a..0000000000 --- a/allensdk/test/brain_observatory/behavior/conftest.py +++ /dev/null @@ -1,94 +0,0 @@ -import os -import sys - -import pytest - -from allensdk.test_utilities.custom_comparators import WhitespaceStrippedString - - -def get_resources_dir(): - behavior_dir = os.path.dirname(__file__) - return os.path.join(behavior_dir, 'resources') - - -def pytest_assertrepr_compare(config, op, left, right): - if isinstance(left, WhitespaceStrippedString) and op == "==": - if isinstance(right, WhitespaceStrippedString): - right_compare = right.orig - else: - right_compare = right - return ["Comparing strings with whitespace stripped. ", - f"{left.orig} != {right_compare}.", "Diff:"] + left.diff - - -def pytest_ignore_collect(path, config): - ''' The brain_observatory.ecephys submodule uses - python 3.6 features that may not be backwards compatible! - ''' - - if sys.version_info < (3, 6): - return True - return False - - -@pytest.fixture() -def behavior_stimuli_data_fixture(request): - """ - This fixture mimicks the behavior experiment stimuli data logs and - allows parameterization for testing - """ - images_set_log = request.param.get("images_set_log", [ - ('Image', 'im065', 5.809, 0)]) - images_draw_log = request.param.get("images_draw_log", [ - ([0] + [1] * 3 + [0] * 3) - ]) - grating_set_log = request.param.get("grating_set_log", [ - ('Ori', 90, 3.585, 0) - ]) - grating_draw_log = request.param.get("grating_draw_log", [ - ([0] + [1] * 3 + [0] * 3) - ]) - omitted_flash_frame_log = request.param.get("omitted_flash_frame_log", { - "grating_0": [] - }) - grating_phase = request.param.get("grating_phase", None) - grating_spatial_frequency = request.param.get("grating_spatial_frequency", - None) - - has_images = request.param.get("has_images", True) - has_grating = request.param.get("has_grating", True) - - resources_dir = get_resources_dir() - - image_data = { - "set_log": images_set_log, - "draw_log": images_draw_log, - "image_path": os.path.join(resources_dir, - 'stimulus_template', - 'input', - 'test_image_set.pkl') - } - - grating_data = { - "set_log": grating_set_log, - "draw_log": grating_draw_log, - "phase": grating_phase, - "sf": grating_spatial_frequency - } - - data = { - "items": { - "behavior": { - "stimuli": {}, - "omitted_flash_frame_log": omitted_flash_frame_log - } - } - } - - if has_images: - data["items"]["behavior"]["stimuli"]["images"] = image_data - - if has_grating: - data["items"]["behavior"]["stimuli"]["grating"] = grating_data - - return data diff --git a/allensdk/test/brain_observatory/behavior/data_files/test_stimulus_file.py b/allensdk/test/brain_observatory/behavior/data_files/test_stimulus_file.py deleted file mode 100644 index 7fded55c65..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_files/test_stimulus_file.py +++ /dev/null @@ -1,82 +0,0 @@ -from typing import Tuple -from pathlib import Path -import pickle -from unittest.mock import create_autospec - -import pytest - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_files.stimulus_file import ( - STIMULUS_FILE_QUERY_TEMPLATE -) - - -@pytest.fixture -def stimulus_file_fixture(request, tmp_path) -> Tuple[Path, dict]: - default_stim_pkl_data = {"a": 1, "b": 2, "c": 3} - stim_pkl_data = request.param.get("pkl_data", default_stim_pkl_data) - stim_pkl_filename = request.param.get("filename", "test_stimulus_file.pkl") - - stim_pkl_path = tmp_path / stim_pkl_filename - with stim_pkl_path.open('wb') as f: - pickle.dump(stim_pkl_data, f) - - return (stim_pkl_path, stim_pkl_data) - - -@pytest.mark.parametrize("stimulus_file_fixture", [ - ({"pkl_data": {"a": 42, "b": 7}}), - ({"pkl_data": {"slightly_more_complex": [1, 2, 3, 4]}}) -], indirect=["stimulus_file_fixture"]) -def test_stimulus_file_from_json(stimulus_file_fixture): - stim_pkl_path, stim_pkl_data = stimulus_file_fixture - - # Basic test case - input_json_dict = {"behavior_stimulus_file": str(stim_pkl_path)} - stimulus_file = StimulusFile.from_json(input_json_dict) - assert stimulus_file.data == stim_pkl_data - - # Now test caching by deleting the stimulus_file - stim_pkl_path.unlink() - stimulus_file_cached = StimulusFile.from_json(input_json_dict) - assert stimulus_file_cached.data == stim_pkl_data - - -@pytest.mark.parametrize("stimulus_file_fixture, behavior_session_id", [ - ({"pkl_data": {"a": 42, "b": 7}}, 12), - ({"pkl_data": {"slightly_more_complex": [1, 2, 3, 4]}}, 8) -], indirect=["stimulus_file_fixture"]) -def test_stimulus_file_from_lims(stimulus_file_fixture, behavior_session_id): - stim_pkl_path, stim_pkl_data = stimulus_file_fixture - - mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) - - # Basic test case - mock_db_conn.fetchone.return_value = str(stim_pkl_path) - stimulus_file = StimulusFile.from_lims(mock_db_conn, behavior_session_id) - assert stimulus_file.data == stim_pkl_data - - # Now test caching by deleting stimulus_file and also asserting db - # `fetchone` called only once - stim_pkl_path.unlink() - stimfile_cached = StimulusFile.from_lims(mock_db_conn, behavior_session_id) - assert stimfile_cached.data == stim_pkl_data - - query = STIMULUS_FILE_QUERY_TEMPLATE.format( - behavior_session_id=behavior_session_id - ) - - mock_db_conn.fetchone.assert_called_once_with(query, strict=True) - - -@pytest.mark.parametrize("stimulus_file_fixture", [ - ({"filename": "test_stim_file_1.pkl"}), - ({"filename": "mock_stim_pkl_2.pkl"}) -], indirect=["stimulus_file_fixture"]) -def test_stimulus_file_to_json(stimulus_file_fixture): - stim_pkl_path, stim_pkl_data = stimulus_file_fixture - - stimulus_file = StimulusFile(filepath=stim_pkl_path) - obt_json = stimulus_file.to_json() - assert obt_json == {"behavior_stimulus_file": str(stim_pkl_path)} diff --git a/allensdk/test/brain_observatory/behavior/data_files/test_sync_file.py b/allensdk/test/brain_observatory/behavior/data_files/test_sync_file.py deleted file mode 100644 index 81b5631dfc..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_files/test_sync_file.py +++ /dev/null @@ -1,112 +0,0 @@ -from typing import Tuple -from pathlib import Path -import h5py -from unittest.mock import create_autospec -import numpy as np - -import pytest - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import SyncFile -from allensdk.brain_observatory.behavior.data_files.sync_file import ( - SYNC_FILE_QUERY_TEMPLATE -) - - -@pytest.fixture -def sync_file_fixture(request, tmp_path) -> Tuple[Path, dict]: - default_sync_data = [1, 2, 3, 4, 5] - sync_data = request.param.get("sync_data", default_sync_data) - sync_filename = request.param.get("filename", "test_sync_file.h5") - - sync_path = tmp_path / sync_filename - with h5py.File(sync_path, "w") as f: - f.create_dataset("data", data=sync_data) - - return (sync_path, sync_data) - - -def mock_get_sync_data(sync_path): - with h5py.File(sync_path, "r") as f: - data = f["data"][:] - return data - - -@pytest.mark.parametrize("sync_file_fixture", [ - ({"sync_data": [2, 3, 4, 5]}), -], indirect=["sync_file_fixture"]) -def test_sync_file_from_json(monkeypatch, sync_file_fixture): - sync_path, sync_data = sync_file_fixture - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_files" - ".sync_file.get_sync_data", - mock_get_sync_data - ) - - # Basic test case - input_json_dict = {"sync_file": str(sync_path)} - sync_file = SyncFile.from_json(input_json_dict) - assert np.allclose(sync_file.data, sync_data) - - # Now test caching by deleting the sync_file - sync_path.unlink() - sync_file_cached = SyncFile.from_json(input_json_dict) - assert np.allclose(sync_file_cached.data, sync_data) - - -@pytest.mark.parametrize("sync_file_fixture, ophys_experiment_id", [ - ({"sync_data": [2, 3, 4, 5]}, 12), - ({"sync_data": [2, 3, 4, 5]}, 8) -], indirect=["sync_file_fixture"]) -def test_sync_file_from_lims( - monkeypatch, - sync_file_fixture, - ophys_experiment_id -): - sync_path, sync_data = sync_file_fixture - - mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_files" - ".sync_file.get_sync_data", - mock_get_sync_data - ) - - # Basic test case - mock_db_conn.fetchone.return_value = str(sync_path) - sync_file = SyncFile.from_lims(mock_db_conn, ophys_experiment_id) - np.allclose(sync_file.data, sync_data) - - # Now test caching by deleting sync_file and also asserting db - # `fetchone` called only once - sync_path.unlink() - stimfile_cached = SyncFile.from_lims(mock_db_conn, ophys_experiment_id) - np.allclose(stimfile_cached.data, sync_data) - - query = SYNC_FILE_QUERY_TEMPLATE.format( - ophys_experiment_id=ophys_experiment_id - ) - - mock_db_conn.fetchone.assert_called_once_with(query, strict=True) - - -@pytest.mark.parametrize("sync_file_fixture", [ - ({"filename": "test_sync_file_1.h5"}), - ({"filename": "mock_sync_file_2.h5"}) -], indirect=["sync_file_fixture"]) -def test_sync_file_to_json(monkeypatch, sync_file_fixture): - sync_path, sync_data = sync_file_fixture - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_files" - ".sync_file.get_sync_data", - mock_get_sync_data - ) - sync_file = SyncFile(filepath=sync_path) - obt_json = sync_file.to_json() - assert obt_json == {"sync_file": str(sync_path)} diff --git a/allensdk/test/brain_observatory/behavior/data_objects/base/test_data_object.py b/allensdk/test/brain_observatory/behavior/data_objects/base/test_data_object.py deleted file mode 100644 index 1ebdc79533..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/base/test_data_object.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest - -from allensdk.brain_observatory.behavior.data_objects import DataObject - - -class TestDataObject: - def test_to_dict_simple(self): - class Simple(DataObject): - def __init__(self): - super().__init__(name='simple', value=1) - s = Simple() - assert s.to_dict() == {'simple': 1} - - def test_to_dict_nested(self): - class B(DataObject): - def __init__(self): - super().__init__(name='b', value='!') - - class A(DataObject): - def __init__(self, b: B): - super().__init__(name='a', value=self) - self._b = b - - @property - def prop1(self): - return self._b - - @property - def prop2(self): - return '@' - a = A(b=B()) - assert a.to_dict() == {'a': {'b': '!', 'prop2': '@'}} - - def test_to_dict_double_nested(self): - class C(DataObject): - def __init__(self): - super().__init__(name='c', value='!!!') - - class B(DataObject): - def __init__(self, c: C): - super().__init__(name='b', value=self) - self._c = c - - @property - def prop1(self): - return self._c - - @property - def prop2(self): - return '!!' - - class A(DataObject): - def __init__(self, b: B): - super().__init__(name='a', value=self) - self._b = b - - @property - def prop1(self): - return self._b - - @property - def prop2(self): - return '@' - - a = A(b=B(c=C())) - assert a.to_dict() == {'a': {'b': {'c': '!!!', 'prop2': '!!'}, - 'prop2': '@'}} - - def test_not_equals(self): - s1 = DataObject(name='s1', value=1) - s2 = DataObject(name='s1', value='1') - assert s1 != s2 - - def test_exclude_equals(self): - s1 = DataObject(name='s1', value=1, exclude_from_equals={'s1'}) - s2 = DataObject(name='s1', value='1') - assert s1 == s2 - - def test_cannot_compare(self): - with pytest.raises(NotImplementedError): - assert DataObject(name='foo', value=1) == 1 diff --git a/allensdk/test/brain_observatory/behavior/data_objects/conftest.py b/allensdk/test/brain_observatory/behavior/data_objects/conftest.py deleted file mode 100644 index 33a068bf77..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/conftest.py +++ /dev/null @@ -1,24 +0,0 @@ -import pynwb -import pytest - - -@pytest.fixture -def data_object_roundtrip_fixture(tmp_path): - def f(nwbfile, data_object_cls, **data_object_cls_kwargs): - tmp_dir = tmp_path / "data_object_nwb_roundtrip_tests" - tmp_dir.mkdir() - nwb_path = tmp_dir / "data_object_roundtrip_nwbfile.nwb" - - with pynwb.NWBHDF5IO(str(nwb_path), 'w') as write_io: - write_io.write(nwbfile) - - with pynwb.NWBHDF5IO(str(nwb_path), 'r') as read_io: - roundtripped_nwbfile = read_io.read() - - data_object_instance = data_object_cls.from_nwb( - roundtripped_nwbfile, **data_object_cls_kwargs - ) - - return data_object_instance - - return f diff --git a/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py b/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py deleted file mode 100644 index 6c54fba935..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py +++ /dev/null @@ -1,85 +0,0 @@ -from datetime import datetime -from pathlib import Path - -import numpy as np -import pandas as pd -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_files import \ - SyncFile -from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ - EyeTrackingFile -from allensdk.brain_observatory.behavior.data_objects.eye_tracking \ - .eye_tracking_table import \ - EyeTrackingTable -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest -from allensdk.test.brain_observatory.behavior.test_eye_tracking_processing \ - import \ - create_refined_eye_tracking_df - - -class TestFromDataFile(LimsTest): - @classmethod - def setup_class(cls): - cls.ophys_experiment_id = 994278291 - - dir = Path(__file__).parent.parent.resolve() - test_data_dir = dir / 'test_data' - - df = pd.read_pickle(str(test_data_dir / 'eye_tracking_table.pkl')) - cls.expected = EyeTrackingTable(eye_tracking=df) - - @pytest.mark.requires_bamboo - def test_from_data_file(self): - etf = EyeTrackingFile.from_lims( - ophys_experiment_id=self.ophys_experiment_id, db=self.dbconn) - sync_file = SyncFile.from_lims( - ophys_experiment_id=self.ophys_experiment_id, db=self.dbconn) - ett = EyeTrackingTable.from_data_file(data_file=etf, - sync_file=sync_file) - - # filter to first 100 values for testing - ett = EyeTrackingTable(eye_tracking=ett.value.iloc[:100]) - assert ett == self.expected - - -class TestNWB: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.parent.resolve() - cls.test_data_dir = dir / 'test_data' - - df = create_refined_eye_tracking_df( - np.array([[0.1, 12 * np.pi, 72 * np.pi, 196 * np.pi, False, - 196 * np.pi, 12 * np.pi, 72 * np.pi, - 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., - 13., 14., 15.], - [0.2, 20 * np.pi, 90 * np.pi, 225 * np.pi, False, - 225 * np.pi, 20 * np.pi, 90 * np.pi, - 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., - 14., 15., 16.]]) - ) - cls.eye_tracking_table = EyeTrackingTable(eye_tracking=df) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.eye_tracking_table.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=EyeTrackingTable) - else: - obt = EyeTrackingTable.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.eye_tracking_table diff --git a/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py b/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py deleted file mode 100644 index f04db161a5..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py +++ /dev/null @@ -1,127 +0,0 @@ -import json -import pandas as pd - -from datetime import datetime -from pathlib import Path - -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_objects.eye_tracking \ - .rig_geometry import \ - RigGeometry, Coordinates -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest - - -class TestFromLims(LimsTest): - @classmethod - def setup_class(cls): - cls.ophys_experiment_id = 994278291 - - dir = Path(__file__).parent.parent.resolve() - test_data_dir = dir / 'test_data' - - with open(test_data_dir / 'eye_tracking_rig_geometry.json') as f: - x = json.load(f) - x = x['rig_geometry'] - x = {'eye_tracking_rig_geometry': x} - cls.expected = RigGeometry.from_json(dict_repr=x) - - @pytest.mark.requires_bamboo - def test_from_lims(self): - rg = RigGeometry.from_lims( - ophys_experiment_id=self.ophys_experiment_id, lims_db=self.dbconn) - assert rg == self.expected - - @pytest.mark.requires_bamboo - def test_rig_geometry_newer_than_experiment(self): - """ - This test ensures that if the experiment date_of_acquisition - is before a rig activate_date that it is not returned as the rig - used for the experiment - """ - # This experiment has rig config more recent than the - # experiment date_of_acquisition - ophys_experiment_id = 521405260 - - rg = RigGeometry.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=self.dbconn) - expected = RigGeometry( - camera_position_mm=Coordinates(x=130.0, y=0.0, z=0.0), - led_position=Coordinates(x=265.1, y=-39.3, z=1.0), - monitor_position_mm=Coordinates(x=170.0, y=0.0, z=0.0), - camera_rotation_deg=Coordinates(x=0.0, y=0.0, z=13.1), - monitor_rotation_deg=Coordinates(x=0.0, y=0.0, z=0.0), - equipment='CAM2P.1' - ) - assert rg == expected - - def test_only_single_geometry_returned(self): - """Tests that when a rig contains multiple geometries, that only 1 is - returned""" - dir = Path(__file__).parent.parent.resolve() - test_data_dir = dir / 'test_data' - - # This example contains multiple geometries per config - df = pd.read_pickle( - str(test_data_dir / 'raw_eye_tracking_rig_geometry.pkl')) - - obtained = RigGeometry._select_most_recent_geometry(rig_geometry=df) - assert (obtained.groupby(obtained.index).size() == 1).all() - - -class TestFromJson(LimsTest): - @classmethod - def setup_class(cls): - cls.ophys_experiment_id = 994278291 - - dir = Path(__file__).parent.parent.resolve() - test_data_dir = dir / 'test_data' - - with open(test_data_dir / 'eye_tracking_rig_geometry.json') as f: - x = json.load(f) - x = x['rig_geometry'] - x = {'eye_tracking_rig_geometry': x} - cls.expected = RigGeometry.from_json(dict_repr=x) - - @pytest.mark.requires_bamboo - def test_from_json(self): - dict_repr = {'eye_tracking_rig_geometry': - self.expected.to_dict()['rig_geometry']} - rg = RigGeometry.from_json(dict_repr=dict_repr) - assert rg == self.expected - - -class TestNWB: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.parent.resolve() - cls.test_data_dir = dir / 'test_data' - - with open(cls.test_data_dir / 'eye_tracking_rig_geometry.json') as f: - x = json.load(f) - x = x['rig_geometry'] - x = {'eye_tracking_rig_geometry': x} - cls.rig_geometry = RigGeometry.from_json(dict_repr=x) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.rig_geometry.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=RigGeometry) - else: - obt = RigGeometry.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.rig_geometry diff --git a/allensdk/test/brain_observatory/behavior/data_objects/lims_util.py b/allensdk/test/brain_observatory/behavior/data_objects/lims_util.py deleted file mode 100644 index 0af3615f0e..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/lims_util.py +++ /dev/null @@ -1,16 +0,0 @@ -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.internal.api import db_connection_creator - - -class LimsTest: - """Helper class for testing LIMS. For each test, checks whether - bamboo is required and if so sets up a connection""" - def setup_method(self, method): - marks = getattr(method, 'pytestmark', None) - if marks: - marks = [m.name for m in marks] - - # Will only create a dbconn if the test requires_bamboo - if 'requires_bamboo' in marks: - self.dbconn = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py b/allensdk/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py deleted file mode 100644 index a4ecc0b457..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py +++ /dev/null @@ -1,307 +0,0 @@ -import datetime -import pickle -import uuid -from pathlib import Path - -import pynwb -import pytest -import pytz -from uuid import UUID - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import BehaviorSessionId -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.behavior_metadata import \ - BehaviorMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.behavior_session_uuid import \ - BehaviorSessionUUID -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.date_of_acquisition import \ - DateOfAcquisition -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.equipment import \ - Equipment -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.session_type import \ - SessionType -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.stimulus_frame_rate import \ - StimulusFrameRate -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.age import \ - Age -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.driver_line import \ - DriverLine -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.full_genotype import \ - FullGenotype -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.mouse_id import \ - MouseId -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.reporter_line import \ - ReporterLine -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.sex import \ - Sex -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .subject_metadata.subject_metadata import \ - SubjectMetadata -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest - - -class BehaviorMetaTestCase: - @classmethod - def setup_class(cls): - cls.meta = cls._get_meta() - - @staticmethod - def _get_meta(): - subject_meta = SubjectMetadata( - sex=Sex(sex='M'), - age=Age(age=139), - reporter_line=ReporterLine(reporter_line="Ai93(TITL-GCaMP6f)"), - full_genotype=FullGenotype( - full_genotype="Slc17a7-IRES2-Cre/wt;Camk2a-tTA/wt;" - "Ai93(TITL-GCaMP6f)/wt"), - driver_line=DriverLine( - driver_line=["Camk2a-tTA", "Slc17a7-IRES2-Cre"]), - mouse_id=MouseId(mouse_id=416369) - - ) - behavior_meta = BehaviorMetadata( - subject_metadata=subject_meta, - behavior_session_id=BehaviorSessionId(behavior_session_id=4242), - equipment=Equipment(equipment_name='my_device'), - stimulus_frame_rate=StimulusFrameRate(stimulus_frame_rate=60.0), - session_type=SessionType(session_type='Unknown'), - behavior_session_uuid=BehaviorSessionUUID( - behavior_session_uuid=uuid.uuid4()) - ) - return behavior_meta - - -class TestLims(LimsTest): - @pytest.mark.requires_bamboo - def test_behavior_session_uuid(self): - behavior_session_id = 823847007 - meta = BehaviorMetadata.from_lims( - behavior_session_id=BehaviorSessionId( - behavior_session_id=behavior_session_id), - lims_db=self.dbconn - ) - assert meta.behavior_session_uuid == \ - uuid.UUID('394a910e-94c7-4472-9838-5345aff59ed8') - - -class TestBehaviorMetadata(BehaviorMetaTestCase): - def test_cre_line(self): - """Tests that cre_line properly parsed from driver_line""" - fg = FullGenotype( - full_genotype='Sst-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt') - assert fg.parse_cre_line() == 'Sst-IRES-Cre' - - def test_cre_line_bad_full_genotype(self): - """Test that cre_line is None and no error raised""" - fg = FullGenotype(full_genotype='foo') - - with pytest.warns(UserWarning) as record: - cre_line = fg.parse_cre_line(warn=True) - assert cre_line is None - assert str(record[0].message) == 'Unable to parse cre_line from ' \ - 'full_genotype' - - def test_reporter_line(self): - """Test that reporter line properly parsed from list""" - reporter_line = ReporterLine.parse(reporter_line=['foo']) - assert reporter_line == 'foo' - - def test_reporter_line_str(self): - """Test that reporter line returns itself if str""" - reporter_line = ReporterLine.parse(reporter_line='foo') - assert reporter_line == 'foo' - - @pytest.mark.parametrize("input_reporter_line, warning_msg, expected", ( - (('foo', 'bar'), 'More than 1 reporter line. ' - 'Returning the first one', 'foo'), - (None, 'Error parsing reporter line. It is null.', None), - ([], 'Error parsing reporter line. The array is empty', None) - ) - ) - def test_reporter_edge_cases(self, input_reporter_line, warning_msg, - expected): - """Test reporter line edge cases""" - with pytest.warns(UserWarning) as record: - reporter_line = ReporterLine.parse( - reporter_line=input_reporter_line, - warn=True) - assert reporter_line == expected - assert str(record[0].message) == warning_msg - - def test_age_in_days(self): - """Test that age_in_days properly parsed from age""" - age = Age._age_code_to_days(age='P123') - assert age == 123 - - @pytest.mark.parametrize("input_age, warning_msg, expected", ( - ('unkown', 'Could not parse numeric age from age code ' - '(age code does not start with "P")', None), - ('P', 'Could not parse numeric age from age code ' - '(no numeric values found in age code)', None) - ) - ) - def test_age_in_days_edge_cases(self, monkeypatch, input_age, warning_msg, - expected): - """Test age in days edge cases""" - with pytest.warns(UserWarning) as record: - age_in_days = Age._age_code_to_days(age=input_age, warn=True) - - assert age_in_days is None - assert str(record[0].message) == warning_msg - - @pytest.mark.parametrize("test_params, expected_warn_msg", [ - # Vanilla test case - ({ - "extractor_expt_date": datetime.datetime.strptime( - "2021-03-14 03:14:15", - "%Y-%m-%d %H:%M:%S"), - "pkl_expt_date": datetime.datetime.strptime("2021-03-14 03:14:15", - "%Y-%m-%d %H:%M:%S"), - "behavior_session_id": 1 - }, None), - - # pkl expt date stored in unix format - ({ - "extractor_expt_date": datetime.datetime.strptime( - "2021-03-14 03:14:15", - "%Y-%m-%d %H:%M:%S"), - "pkl_expt_date": 1615716855.0, - "behavior_session_id": 2 - }, None), - - # Extractor and pkl dates differ significantly - ({ - "extractor_expt_date": datetime.datetime.strptime( - "2021-03-14 03:14:15", - "%Y-%m-%d %H:%M:%S"), - "pkl_expt_date": datetime.datetime.strptime("2021-03-14 20:14:15", - "%Y-%m-%d %H:%M:%S"), - "behavior_session_id": 3 - }, - "The `date_of_acquisition` field in LIMS *"), - - # pkl file contains an unparseable datetime - ({ - "extractor_expt_date": datetime.datetime.strptime( - "2021-03-14 03:14:15", - "%Y-%m-%d %H:%M:%S"), - "pkl_expt_date": None, - "behavior_session_id": 4 - }, - "Could not parse the acquisition datetime *"), - ]) - def test_get_date_of_acquisition(self, tmp_path, test_params, - expected_warn_msg): - mock_session_id = test_params["behavior_session_id"] - - pkl_save_path = tmp_path / f"mock_pkl_{mock_session_id}.pkl" - with open(pkl_save_path, 'wb') as handle: - pickle.dump({"start_time": test_params['pkl_expt_date']}, handle) - - tz = pytz.timezone("America/Los_Angeles") - extractor_expt_date = tz.localize( - test_params['extractor_expt_date']).astimezone(pytz.utc) - - stimulus_file = StimulusFile(filepath=pkl_save_path) - obt_date = DateOfAcquisition( - date_of_acquisition=extractor_expt_date) - - if expected_warn_msg: - with pytest.warns(Warning, match=expected_warn_msg): - obt_date.validate( - stimulus_file=stimulus_file, - behavior_session_id=test_params['behavior_session_id']) - - assert obt_date.value == extractor_expt_date - - def test_indicator(self): - """Test that indicator is parsed from full_genotype""" - reporter_line = ReporterLine( - reporter_line='Ai148(TIT2L-GC6f-ICL-tTA2)') - assert reporter_line.parse_indicator() == 'GCaMP6f' - - @pytest.mark.parametrize("input_reporter_line, warning_msg, expected", ( - (None, - 'Could not parse indicator from reporter because there is no ' - 'reporter', None), - ('foo', 'Could not parse indicator from reporter because none' - 'of the expected substrings were found in the reporter', - None) - ) - ) - def test_indicator_edge_cases(self, input_reporter_line, warning_msg, - expected): - """Test indicator parsing edge cases""" - with pytest.warns(UserWarning) as record: - reporter_line = ReporterLine(reporter_line=input_reporter_line) - indicator = reporter_line.parse_indicator(warn=True) - assert indicator is expected - assert str(record[0].message) == warning_msg - - -class TestStimulusFile: - """Tests properties read from stimulus file""" - def setup_class(cls): - dir = Path(__file__).parent.parent.parent.resolve() - test_data_dir = dir / 'test_data' - sf_path = test_data_dir / 'stimulus_file.pkl' - cls.stimulus_file = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(sf_path)}) - - def test_session_uuid(self): - uuid = BehaviorSessionUUID.from_stimulus_file( - stimulus_file=self.stimulus_file) - expected = UUID('138531ab-fe59-4523-9154-07c8d97bbe03') - assert expected == uuid.value - - def test_get_stimulus_frame_rate(self): - rate = StimulusFrameRate.from_stimulus_file( - stimulus_file=self.stimulus_file) - assert 62.0 == rate.value - - -def test_date_of_acquisition_utc(): - """Tests that when read from json (in Pacific time), that - date of acquisition is converted to utc""" - expected = DateOfAcquisition( - date_of_acquisition=datetime.datetime(2019, 9, 26, 16, - tzinfo=pytz.UTC)) - actual = DateOfAcquisition.from_json( - dict_repr={'date_of_acquisition': '2019-09-26 09:00:00'}) - assert expected == actual - - -class TestNWB(BehaviorMetaTestCase): - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='afile', - session_start_time=datetime.datetime.now() - ) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_add_behavior_only_metadata(self, roundtrip, - data_object_roundtrip_fixture): - self.meta.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - meta_obt = data_object_roundtrip_fixture( - self.nwbfile, BehaviorMetadata - ) - else: - meta_obt = BehaviorMetadata.from_nwb(nwbfile=self.nwbfile) - - assert self.meta == meta_obt diff --git a/allensdk/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py b/allensdk/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py deleted file mode 100644 index 7783b98fdf..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py +++ /dev/null @@ -1,198 +0,0 @@ -import datetime -import json -from pathlib import Path -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.equipment import \ - Equipment -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_ophys_metadata import \ - BehaviorOphysMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.experiment_container_id import \ - ExperimentContainerId -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.field_of_view_shape import \ - FieldOfViewShape -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.imaging_depth import \ - ImagingDepth -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.multi_plane_metadata\ - .imaging_plane_group import \ - ImagingPlaneGroup -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.multi_plane_metadata\ - .multi_plane_metadata import \ - MultiplaneMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.ophys_experiment_metadata import \ - OphysExperimentMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.ophys_session_id import \ - OphysSessionId -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.internal.api import db_connection_creator -from allensdk.test.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.test_behavior_metadata import \ - TestBehaviorMetadata - - -class TestBOM: - @classmethod - def setup_class(cls): - cls.meta = cls._get_meta() - - def setup_method(self, method): - self.meta = self._get_meta() - - @staticmethod - def _get_meta(): - ophys_meta = OphysExperimentMetadata( - ophys_experiment_id=1234, - ophys_session_id=OphysSessionId(session_id=999), - experiment_container_id=ExperimentContainerId( - experiment_container_id=5678), - field_of_view_shape=FieldOfViewShape(width=4, height=4), - imaging_depth=ImagingDepth(imaging_depth=375) - ) - - behavior_metadata = TestBehaviorMetadata() - behavior_metadata.setup_class() - return BehaviorOphysMetadata( - behavior_metadata=behavior_metadata.meta, - ophys_metadata=ophys_meta - ) - - def _get_multiplane_meta(self): - bo_meta = self.meta - bo_meta.behavior_metadata._equipment = \ - Equipment(equipment_name='MESO.1') - ophys_experiment_metadata = bo_meta.ophys_metadata - - imaging_plane_group = ImagingPlaneGroup(plane_group_count=5, - plane_group=0) - multiplane_meta = MultiplaneMetadata( - ophys_experiment_id=ophys_experiment_metadata.ophys_experiment_id, - ophys_session_id=ophys_experiment_metadata._ophys_session_id, - experiment_container_id=ophys_experiment_metadata._experiment_container_id, # noqa E501 - field_of_view_shape=ophys_experiment_metadata._field_of_view_shape, - imaging_depth=ophys_experiment_metadata._imaging_depth, - project_code=ophys_experiment_metadata._project_code, - imaging_plane_group=imaging_plane_group - ) - return BehaviorOphysMetadata( - behavior_metadata=bo_meta.behavior_metadata, - ophys_metadata=multiplane_meta - ) - - -class TestInternal(TestBOM): - @classmethod - def setup_method(self, method): - marks = getattr(method, 'pytestmark', None) - if marks: - marks = [m.name for m in marks] - - # Will only create a dbconn if the test requires_bamboo - if 'requires_bamboo' in marks: - self.dbconn = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP) - - @pytest.mark.requires_bamboo - @pytest.mark.parametrize('meso', [True, False]) - def test_from_lims(self, meso): - if meso: - ophys_experiment_id = 951980471 - else: - ophys_experiment_id = 994278291 - bom = BehaviorOphysMetadata.from_lims( - ophys_experiment_id=ophys_experiment_id, lims_db=self.dbconn, - is_multiplane=meso) - - if meso: - assert isinstance(bom.ophys_metadata, - MultiplaneMetadata) - assert bom.ophys_metadata.imaging_depth == 150 - assert bom.behavior_metadata.session_type == 'OPHYS_1_images_A' - assert bom.behavior_metadata.subject_metadata.reporter_line == \ - 'Ai148(TIT2L-GC6f-ICL-tTA2)' - assert bom.behavior_metadata.subject_metadata.driver_line == \ - ['Sst-IRES-Cre'] - assert bom.behavior_metadata.subject_metadata.mouse_id == 457841 - assert bom.behavior_metadata.subject_metadata.full_genotype == \ - 'Sst-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt' - assert bom.behavior_metadata.subject_metadata.age_in_days == 233 - assert bom.behavior_metadata.subject_metadata.sex == 'F' - else: - assert isinstance(bom.ophys_metadata, OphysExperimentMetadata) - assert bom.ophys_metadata.imaging_depth == 175 - assert bom.behavior_metadata.session_type == 'OPHYS_4_images_A' - assert bom.behavior_metadata.subject_metadata.reporter_line == \ - 'Ai93(TITL-GCaMP6f)' - assert bom.behavior_metadata.subject_metadata.driver_line == \ - ['Camk2a-tTA', 'Slc17a7-IRES2-Cre'] - assert bom.behavior_metadata.subject_metadata.mouse_id == 491060 - assert bom.behavior_metadata.subject_metadata.full_genotype == \ - 'Slc17a7-IRES2-Cre/wt;Camk2a-tTA/wt;Ai93(TITL-GCaMP6f)/wt' - assert bom.behavior_metadata.subject_metadata.age_in_days == 130 - assert bom.behavior_metadata.subject_metadata.sex == 'M' - - -class TestJson(TestBOM): - @classmethod - def setup_method(self, method): - dir = Path(__file__).parent.resolve() - test_data_dir = dir.parent / 'test_data' - with open(test_data_dir / 'test_input.json') as f: - dict_repr = json.load(f) - dict_repr = dict_repr['session_data'] - dict_repr['sync_file'] = str(test_data_dir / 'sync.h5') - dict_repr['behavior_stimulus_file'] = str(test_data_dir / - 'behavior_stimulus_file.pkl') - dict_repr['dff_file'] = str(test_data_dir / 'demix_file.h5') - self.dict_repr = dict_repr - - @pytest.mark.parametrize('meso', [True, False]) - def test_from_json(self, meso): - if meso: - self.dict_repr['rig_name'] = 'MESO.1' - bom = BehaviorOphysMetadata.from_json(dict_repr=self.dict_repr, - is_multiplane=meso) - - if meso: - assert isinstance(bom.ophys_metadata, MultiplaneMetadata) - else: - assert isinstance(bom.ophys_metadata, OphysExperimentMetadata) - - -class TestNWB(TestBOM): - def setup_method(self, method): - self.meta = self._get_meta() - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier=str(self.meta.ophys_metadata.ophys_experiment_id), - session_start_time=datetime.datetime.now() - ) - - @pytest.mark.parametrize('meso', [True, False]) - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture, meso): - if meso: - self.meta = self._get_multiplane_meta() - - self.meta.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=BehaviorOphysMetadata, - is_multiplane=meso) - else: - obt = self.meta.from_nwb(nwbfile=self.nwbfile, - is_multiplane=meso) - - assert obt == self.meta diff --git a/allensdk/test/brain_observatory/behavior/data_objects/nwb_input_json.py b/allensdk/test/brain_observatory/behavior/data_objects/nwb_input_json.py deleted file mode 100644 index ba5058f3dc..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/nwb_input_json.py +++ /dev/null @@ -1,23 +0,0 @@ -import json -from pathlib import Path - - -class NwbInputJson: - def __init__(self): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - with open(test_data_dir / 'test_input.json') as f: - dict_repr = json.load(f) - dict_repr = dict_repr['session_data'] - dict_repr['sync_file'] = str(test_data_dir / 'sync.h5') - dict_repr['behavior_stimulus_file'] = str(test_data_dir / - 'behavior_stimulus_file.pkl') - dict_repr['dff_file'] = str(test_data_dir / 'demix_file.h5') - dict_repr['demix_file'] = str(test_data_dir / 'demix_file.h5') - dict_repr['events_file'] = str(test_data_dir / 'events.h5') - - self._dict_repr = dict_repr - - @property - def dict_repr(self): - return self._dict_repr diff --git a/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py b/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py deleted file mode 100644 index fc93f1b9f6..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py +++ /dev/null @@ -1,312 +0,0 @@ -import pytest -from unittest.mock import create_autospec - -import pandas as pd - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 - get_running_df -) -from allensdk.brain_observatory.behavior.data_objects import ( - RunningAcquisition, StimulusTimestamps -) - - -@pytest.mark.parametrize( - "dict_repr, returned_running_acq_df, expected_running_acq_df", - [ - ( - # dict_repr - { - "behavior_stimulus_file": "mock_stimulus_file.pkl" - }, - # returned_running_acq_df - pd.DataFrame( - { - "timestamps": [1, 2], - "speed": [3, 4], - "dx": [5, 6], - "v_sig": [7, 8], - "v_in": [9, 10] - } - ).set_index("timestamps"), - # expected_running_acq_df - pd.DataFrame( - { - "timestamps": [1, 2], - "dx": [5, 6], - "v_sig": [7, 8], - "v_in": [9, 10] - } - ).set_index("timestamps") - ), - ] -) -def test_running_acquisition_from_json( - monkeypatch, dict_repr, returned_running_acq_df, expected_running_acq_df -): - mock_stimulus_file = create_autospec(StimulusFile) - mock_stimulus_timestamps = create_autospec(StimulusTimestamps) - mock_get_running_df = create_autospec(get_running_df) - - mock_get_running_df.return_value = returned_running_acq_df - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_acquisition.StimulusFile", - mock_stimulus_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_acquisition.StimulusTimestamps", - mock_stimulus_timestamps - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_acquisition.get_running_df", - mock_get_running_df - ) - obt = RunningAcquisition.from_json(dict_repr) - - mock_stimulus_file.from_json.assert_called_once_with(dict_repr) - mock_stimulus_file_instance = mock_stimulus_file.from_json(dict_repr) - assert obt._stimulus_file == mock_stimulus_file_instance - - mock_stimulus_timestamps.from_json.assert_called_once_with(dict_repr) - mock_stimulus_timestamps_instance = mock_stimulus_timestamps.from_json( - dict_repr - ) - assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance - - mock_get_running_df.assert_called_once_with( - data=mock_stimulus_file_instance.data, - time=mock_stimulus_timestamps_instance.value, - ) - - pd.testing.assert_frame_equal(obt.value, expected_running_acq_df) - - -@pytest.mark.parametrize( - "stimulus_file, stimulus_file_to_json_ret, " - "stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected", - [ - # Test to_json with both stimulus_file and sync_file - ( - # stimulus_file - create_autospec(StimulusFile, instance=True), - # stimulus_file_to_json_ret - {"behavior_stimulus_file": "stim.pkl"}, - # stimulus_timestamps - create_autospec(StimulusTimestamps, instance=True), - # stimulus_timestamps_to_json_ret - {"sync_file": "sync.h5"}, - # raises - False, - # expected - {"behavior_stimulus_file": "stim.pkl", "sync_file": "sync.h5"} - ), - # Test to_json without stimulus_file - ( - # stimulus_file - None, - # stimulus_file_to_json_ret - None, - # stimulus_timestamps - create_autospec(StimulusTimestamps, instance=True), - # stimulus_timestamps_to_json_ret - {"sync_file": "sync.h5"}, - # raises - "RunningAcquisition DataObject lacks information about", - # expected - None - ), - # Test to_json without stimulus_timestamps - ( - # stimulus_file - create_autospec(StimulusFile, instance=True), - # stimulus_file_to_json_ret - {"behavior_stimulus_file": "stim.pkl"}, - # stimulus_timestamps_to_json_ret - None, - # sync_file_to_json_ret - None, - # raises - "RunningAcquisition DataObject lacks information about", - # expected - None - ), - ] -) -def test_running_acquisition_to_json( - stimulus_file, stimulus_file_to_json_ret, - stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected -): - if stimulus_file is not None: - stimulus_file.to_json.return_value = stimulus_file_to_json_ret - if stimulus_timestamps is not None: - stimulus_timestamps.to_json.return_value = ( - stimulus_timestamps_to_json_ret - ) - - running_acq = RunningAcquisition( - running_acquisition=None, - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps - ) - - if raises: - with pytest.raises(RuntimeError, match=raises): - _ = running_acq.to_json() - else: - obt = running_acq.to_json() - assert obt == expected - - -@pytest.mark.parametrize( - "behavior_session_id, ophys_experiment_id, " - "returned_running_acq_df, expected_running_acq_df", - [ - ( - # behavior_session_id - 12345, - # ophys_experiment_id - None, - # returned_running_acq_df - pd.DataFrame( - { - "timestamps": [1, 2], - "speed": [3, 4], - "dx": [5, 6], - "v_sig": [7, 8], - "v_in": [9, 10] - } - ).set_index("timestamps"), - # expected_running_acq_df - pd.DataFrame( - { - "timestamps": [1, 2], - "dx": [5, 6], - "v_sig": [7, 8], - "v_in": [9, 10] - } - ).set_index("timestamps") - ), - ( - # behavior_session_id - 1234, - # ophys_experiment_id - 5678, - # returned_running_acq_df - pd.DataFrame( - { - "timestamps": [2, 4], - "speed": [6, 8], - "dx": [10, 12], - "v_sig": [14, 16], - "v_in": [18, 20] - } - ).set_index("timestamps"), - # expected_running_acq_df - pd.DataFrame( - { - "timestamps": [2, 4], - "dx": [10, 12], - "v_sig": [14, 16], - "v_in": [18, 20] - } - ).set_index("timestamps") - ) - ] -) -def test_running_acquisition_from_lims( - monkeypatch, behavior_session_id, ophys_experiment_id, - returned_running_acq_df, expected_running_acq_df -): - mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) - - mock_stimulus_file = create_autospec(StimulusFile) - mock_stimulus_timestamps = create_autospec(StimulusTimestamps) - mock_get_running_df = create_autospec(get_running_df) - - mock_get_running_df.return_value = returned_running_acq_df - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_acquisition.StimulusFile", - mock_stimulus_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_acquisition.StimulusTimestamps", - mock_stimulus_timestamps - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_acquisition.get_running_df", - mock_get_running_df - ) - obt = RunningAcquisition.from_lims( - mock_db_conn, behavior_session_id, ophys_experiment_id - ) - - mock_stimulus_file.from_lims.assert_called_once_with( - mock_db_conn, behavior_session_id - ) - mock_stimulus_file_instance = mock_stimulus_file.from_lims( - mock_db_conn, behavior_session_id - ) - assert obt._stimulus_file == mock_stimulus_file_instance - - mock_stimulus_timestamps.from_stimulus_file.assert_called_once_with( - mock_stimulus_file_instance - ) - mock_stimulus_timestamps_instance = mock_stimulus_timestamps.\ - from_stimulus_file(stimulus_file=mock_stimulus_file) - assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance - - mock_get_running_df.assert_called_once_with( - data=mock_stimulus_file_instance.data, - time=mock_stimulus_timestamps_instance.value, - ) - - pd.testing.assert_frame_equal( - obt.value, expected_running_acq_df, check_like=True - ) - - -# Fixtures: -# nwbfile: -# test/brain_observatory/behavior/conftest.py -# data_object_roundtrip_fixture: -# test/brain_observatory/behavior/data_objects/conftest.py -@pytest.mark.parametrize("roundtrip", [True, False]) -@pytest.mark.parametrize("running_acq_data", [ - ( - # expected_running_acq_df - pd.DataFrame( - { - "timestamps": [2.0, 4.0], - "dx": [10.0, 12.0], - "v_sig": [14.0, 16.0], - "v_in": [18.0, 20.0] - } - ).set_index("timestamps") - ), -]) -def test_running_acquisition_nwb_roundtrip( - nwbfile, data_object_roundtrip_fixture, roundtrip, running_acq_data -): - running_acq = RunningAcquisition(running_acquisition=running_acq_data) - nwbfile = running_acq.to_nwb(nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture(nwbfile, RunningAcquisition) - else: - obt = RunningAcquisition.from_nwb(nwbfile) - - pd.testing.assert_frame_equal( - obt.value, running_acq_data, check_like=True - ) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py b/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py deleted file mode 100644 index b06b263d7b..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py +++ /dev/null @@ -1,290 +0,0 @@ -import numpy as np -import pytest - -from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 - get_running_df, calc_deriv, deg_to_dist, _shift, _identify_wraps, - _unwrap_voltage_signal, _angular_change, _zscore_threshold_1d, - _clip_speed_wraps) - -import allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing as rp # noqa: E501 - - -@pytest.fixture -def timestamps(): - return np.arange(0., 10., 0.1) - - -@pytest.fixture -def running_data(): - rng = np.random.default_rng() - return { - "items": { - "behavior": { - "encoders": [ - { - "dx": rng.random((100,)), - "vsig": rng.uniform(low=0.0, high=5.1, size=(100,)), - "vin": rng.uniform(low=4.9, high=5.0, size=(100,)), - }]}}} - - -@pytest.mark.parametrize( - "x,time,expected", [ - ([1.0, 1.0], [1.0, 2.0], [np.nan, 0.0]), - ([1.0, 2.0, 3.0], [1.0, 2.0, 3.0], [np.nan, 1.0, 1.0]), - ([1.0, 2.0, 3.0], [1.0, 4.0, 6.0], [np.nan, 1.0/3.0, 1.0/2.0]) - ] -) -def test_calc_deriv(x, time, expected): - obtained = calc_deriv(x, time) - - # np.nan == np.nan returns False so filter out the first values - obtained = obtained[1:] - expected = expected[1:] - - assert np.all(obtained == expected) - - -@pytest.mark.parametrize( - "speed,expected", [ - (np.array([1.0]), [5.5033]), - (np.array([0., 2.0]), [0., 11.0066]) - ] -) -def test_deg_to_dist(speed, expected): - np.testing.assert_allclose(deg_to_dist(speed), expected, atol=0.0001) - - -@pytest.mark.parametrize( - "lowpass", [True, False] -) -def test_get_running_df(running_data, timestamps, lowpass): - actual = get_running_df(running_data, timestamps, lowpass=lowpass) - np.testing.assert_array_equal(actual.index, timestamps) - assert sorted(list(actual)) == ["dx", "speed", "v_in", "v_sig"] - # Should bring raw data through - np.testing.assert_array_equal( - actual["v_sig"].values, - running_data["items"]["behavior"]["encoders"][0]["vsig"]) - np.testing.assert_array_equal( - actual["v_in"].values, - running_data["items"]["behavior"]["encoders"][0]["vin"]) - np.testing.assert_array_equal( - actual["dx"].values, - running_data["items"]["behavior"]["encoders"][0]["dx"]) - if lowpass: - assert np.count_nonzero(np.isnan(actual["speed"])) == 0 - - -@pytest.mark.parametrize( - "lowpass", [True, False] -) -def test_get_running_df_one_fewer_timestamp_check_warning(running_data, - timestamps, - lowpass): - with pytest.warns( - UserWarning, - match="Time array is 1 value shorter than encoder array.*" - ): - # Call with one fewer timestamp, check for a warning - _ = get_running_df( - data=running_data, - time=timestamps[:-1], - lowpass=lowpass - ) - - -@pytest.mark.parametrize( - "lowpass", [True, False] -) -def test_get_running_df_one_fewer_timestamp_check_truncation(running_data, - timestamps, - lowpass): - # Call with one fewer timestamp - output = get_running_df( - data=running_data, - time=timestamps[:-1], - lowpass=lowpass - ) - - # Check that the output is actually trimmed, and the values are the same - assert len(output) == len(timestamps) - 1 - np.testing.assert_equal( - output["v_sig"], - running_data["items"]["behavior"]["encoders"][0]["vsig"][:-1] - ) - np.testing.assert_equal( - output["v_in"], - running_data["items"]["behavior"]["encoders"][0]["vin"][:-1] - ) - - -@pytest.mark.parametrize( - "arr, periods, fill, expected", - [ - ([1, 2, 3], 1, None, np.array([np.nan, 1., 2.])), - ([1, 2, 3], 2, 99., np.array([99., 99., 1.])), - ([1, 2, 3], 3, 99., np.array([99., 99., 99.])), - ([1, 2, 3], 4, 99., np.array([99., 99., 99.])), - ([], 2, 30, np.array([])) - ] -) -def test_shift(arr, periods, fill, expected): - actual = _shift(arr, periods, fill) - np.testing.assert_array_equal(actual, expected) - - -@pytest.mark.parametrize( - "periods", [0, -2] -) -def test_shift_raises_error_periods_zero(periods): - with pytest.raises(ValueError, match="Can only shift"): - _shift(np.ones((5,)), periods) - - -@pytest.mark.parametrize( - "arr, min_threshold, max_threshold, expected", - [ - (np.array( - [0, 2, 5, 0, # pos wrap 5-0 - 2, 0, 5 # neg wrap 0-5 - ]), 1.5, 3.5, (np.array([3]), np.array([6]))), - (np.array([0, 2, 5, 0, 2, 5]), 0, 5, (np.array([]), np.array([]))), - ] -) -def test_identify_wraps(arr, min_threshold, max_threshold, expected): - actual = _identify_wraps( - arr, min_threshold=min_threshold, max_threshold=max_threshold) - np.testing.assert_array_equal( - actual[0], expected[0], - f"error identifying positive wraps, got {actual[0]}, " - f"expected {expected[0]}") - np.testing.assert_array_equal( - actual[1], expected[1], - f"error identifying negative wraps, got {actual[1]}, " - f"expected {expected[1]}") - - -@pytest.mark.parametrize( - "vsig, pos_wrap_ix, neg_wrap_ix, vmax, max_threshold, max_diff, expected", - [ - ( # No artifacts or baseline - np.array([0, 1, 3, 5, 0.5, 1, 2.5, 5, 0, 1, 4, 3]), - np.array([4, 8]), np.array([10]), 5.0, 5.1, 3.0, - np.array([np.nan, 1, 3, 5, 5.5, 6, 7.5, 10, 10, 11, 9, 8]) - ), - ( # Some diff artifacts, baseline - np.array([1, 1, 3, 5, 0.5, 1, 2.5, 5, 0, 1, 4, 1.5]), - np.array([4, 8]), np.array([10]), 5.0, 5.1, 2.0, - np.array([np.nan, 1, 3, 5, 5.5, 6, 7.5, np.nan, 7.5, 8.5, 6.5, - np.nan]) - ), - ( # Max artifact -- use threshold instead - np.array([0, 7, 3, 5, 0.5, 1]), - np.array([2, 4]), np.array([]).astype(int), None, 5.1, 6.0, - np.array([np.nan, np.nan, 1, 3, 3.5, 4]) - ), - ( - # No wraps - np.ones(5,), np.array([]), np.array([]), 5.0, 5.1, 3.0, - np.array([np.nan, 1., 1., 1., 1.]) - ) - ] -) -def test_unwrap_voltage_signal( - vsig, pos_wrap_ix, neg_wrap_ix, vmax, max_threshold, max_diff, - expected): - actual = _unwrap_voltage_signal( - vsig, pos_wrap_ix, neg_wrap_ix, vmax=vmax, - max_threshold=max_threshold, max_diff=max_diff) - np.testing.assert_array_equal(actual, expected) - - -@pytest.mark.parametrize( - "vsig, vmax, expected", - [ - ( - np.array([1, 2, 3, 4, 5]), 2.0, - np.array([np.nan, np.pi, np.pi, np.pi, np.pi]) - ), - ( - np.array([np.nan, 1, 3, np.nan, 4]), - np.array([2.0, 2.0, 2.0, 2.0, 2.0]), - np.array([np.nan, np.nan, 2*np.pi, np.nan, np.nan]), - ) - ] -) -def test_angular_change(vsig, vmax, expected): - actual = _angular_change(vsig, vmax) - np.testing.assert_allclose(actual, expected, equal_nan=True) - - -@pytest.mark.parametrize( - "arr, threshold, expected", - [ - (np.ones(5,), 2.0, np.ones(5,)), - (np.array([99, 1, np.nan, 1, 1, 1]), 1.5, - np.array([np.nan, 1, np.nan, 1, 1, 1])), - (np.ones(1,), 2.0, np.ones(1,)) - ] -) -def test_zscore_threshold_1d(arr, threshold, expected): - actual = _zscore_threshold_1d(arr, threshold=threshold) - np.testing.assert_allclose(actual, expected, equal_nan=True) - - -@pytest.mark.parametrize( - "speed, time, wrap_indices, span, expected", - [ - ( # Clip bottom, then clip top, then no clip required - np.array([0, 0, -1, 5, 0, 99, 6, 1, 2, 3]), - np.array(range(10)).astype(float), - [2, 5, 8], - 1.0, - np.array([0, 0, 0, 5, 0, 6, 6, 1, 2, 3]) - ), - ] -) -def test_clip_speed_wraps( - speed, time, wrap_indices, span, expected, monkeypatch): - monkeypatch.setattr(rp, "_local_boundaries", lambda x, y, z: (y-1, y+1)) - actual = _clip_speed_wraps(speed, time, wrap_indices, span) - np.testing.assert_array_equal(actual, expected) - - -@pytest.mark.parametrize( - "time, index, span", - [ - (np.arange(10.), 0, 2.0), # no neighborhood before first point - (np.arange(10.), 9, 2.0), # no neighborhood after last point - (np.arange(10.), 4, 0.25), # data not sampled with enough frequency - ] -) -def test_local_boundaries_raises_warning(time, index, span): - with pytest.warns(UserWarning, match="Unable to find"): - rp._local_boundaries(time, index, span) - - -@pytest.mark.parametrize( - "time, index", - [ - (np.array([5., 4., 3., 4., 5.]), 2), - (np.array([1., 2., 3., 2., 1.]), 2), - (np.array([3., 3., 3., 2., 1.]), 2), - ] -) -def test_local_boundaries_raises_error_non_monotonic(time, index): - with pytest.raises(ValueError, match="Data do not monotonically"): - rp._local_boundaries(time, index, 1.0) - - -@pytest.mark.parametrize( - "time, index, span, expected", - [ - (np.arange(10.), 4, 2.0, (2.0, 6.0)), # Spans > 1 element +/- - (np.arange(10.), 2, 1.0, (1.0, 3.0)) # Spans = 1 element +/- - ] -) -def test_local_boundaries(time, index, span, expected): - actual = rp._local_boundaries(time, index, span) - assert expected == actual diff --git a/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py b/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py deleted file mode 100644 index 9e3bd110fa..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py +++ /dev/null @@ -1,349 +0,0 @@ -import pytest -from unittest.mock import create_autospec - -import pandas as pd - -from allensdk.core.exceptions import DataFrameIndexError -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 - get_running_df -) -from allensdk.brain_observatory.behavior.data_objects import ( - RunningSpeed, StimulusTimestamps -) - - -@pytest.mark.parametrize("filtered", [True, False]) -@pytest.mark.parametrize("zscore_threshold", [1.0, 4.2]) -@pytest.mark.parametrize("returned_running_df, expected_running_df, raises", [ - # Test basic case - ( - # returned_running_df - pd.DataFrame({ - "timestamps": [2, 4, 6, 8], - "speed": [1, 2, 3, 4] - }).set_index("timestamps"), - # expected_running_df - pd.DataFrame({ - "timestamps": [2, 4, 6, 8], - "speed": [1, 2, 3, 4] - }), - # raises - False - ), - # Test when returned dataframe lacks "timestamps" as index - ( - # returned_running_df - pd.DataFrame({ - "timestamps": [2, 4, 6, 8], - "speed": [1, 2, 3, 4] - }).set_index("speed"), - # expected_running_df - None, - # raises - "Expected running_data_df index to be named 'timestamps'" - ), -]) -def test_get_running_speed_df( - monkeypatch, returned_running_df, filtered, zscore_threshold, - expected_running_df, raises -): - - mock_stimulus_file_instance = create_autospec(StimulusFile, instance=True) - mock_stimulus_timestamps_instance = create_autospec( - StimulusTimestamps, instance=True - ) - mock_get_running_speed_df = create_autospec(get_running_df) - mock_get_running_speed_df.return_value = returned_running_df - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_speed.get_running_df", - mock_get_running_speed_df - ) - - if raises: - with pytest.raises(DataFrameIndexError, match=raises): - _ = RunningSpeed._get_running_speed_df( - mock_stimulus_file_instance, - mock_stimulus_timestamps_instance, - filtered, zscore_threshold - ) - else: - obt = RunningSpeed._get_running_speed_df( - mock_stimulus_file_instance, - mock_stimulus_timestamps_instance, - filtered, zscore_threshold - ) - - pd.testing.assert_frame_equal(obt, expected_running_df) - - mock_get_running_speed_df.assert_called_once_with( - data=mock_stimulus_file_instance.data, - time=mock_stimulus_timestamps_instance.value, - lowpass=filtered, - zscore_threshold=zscore_threshold - ) - - -@pytest.mark.parametrize("filtered", [True, False]) -@pytest.mark.parametrize("zscore_threshold", [1.0, 4.2]) -@pytest.mark.parametrize( - "dict_repr, returned_running_df, expected_running_df", - [ - ( - # dict_repr - { - "behavior_stimulus_file": "mock_stimulus_file.pkl" - }, - # returned_running_df - pd.DataFrame( - {"timestamps": [1, 2], "speed": [3, 4]} - ).set_index("timestamps"), - # expected_running_df - pd.DataFrame( - {"timestamps": [1, 2], "speed": [3, 4]} - ), - ), - ] -) -def test_running_speed_from_json( - monkeypatch, dict_repr, returned_running_df, expected_running_df, - filtered, zscore_threshold -): - mock_stimulus_file = create_autospec(StimulusFile) - mock_stimulus_timestamps = create_autospec(StimulusTimestamps) - mock_get_running_speed_df = create_autospec(get_running_df) - - mock_get_running_speed_df.return_value = returned_running_df - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_speed.StimulusFile", - mock_stimulus_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_speed.StimulusTimestamps", - mock_stimulus_timestamps - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_speed.get_running_df", - mock_get_running_speed_df - ) - obt = RunningSpeed.from_json(dict_repr, filtered, zscore_threshold) - - mock_stimulus_file.from_json.assert_called_once_with(dict_repr) - mock_stimulus_file_instance = mock_stimulus_file.from_json(dict_repr) - assert obt._stimulus_file == mock_stimulus_file_instance - - mock_stimulus_timestamps.from_json.assert_called_once_with(dict_repr) - mock_stimulus_timestamps_instance = mock_stimulus_timestamps.from_json( - dict_repr - ) - assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance - - mock_get_running_speed_df.assert_called_once_with( - data=mock_stimulus_file_instance.data, - time=mock_stimulus_timestamps_instance.value, - lowpass=filtered, - zscore_threshold=zscore_threshold - ) - - assert obt._filtered == filtered - pd.testing.assert_frame_equal(obt.value, expected_running_df) - - -@pytest.mark.parametrize( - "stimulus_file, stimulus_file_to_json_ret, " - "stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected", - [ - # Test to_json with both stimulus_file and sync_file - ( - # stimulus_file - create_autospec(StimulusFile, instance=True), - # stimulus_file_to_json_ret - {"behavior_stimulus_file": "stim.pkl"}, - # stimulus_timestamps - create_autospec(StimulusTimestamps, instance=True), - # stimulus_timestamps_to_json_ret - {"sync_file": "sync.h5"}, - # raises - False, - # expected - {"behavior_stimulus_file": "stim.pkl", "sync_file": "sync.h5"} - ), - # Test to_json without stimulus_file - ( - # stimulus_file - None, - # stimulus_file_to_json_ret - None, - # stimulus_timestamps - create_autospec(StimulusTimestamps, instance=True), - # stimulus_timestamps_to_json_ret - {"sync_file": "sync.h5"}, - # raises - "RunningSpeed DataObject lacks information about", - # expected - None - ), - # Test to_json without stimulus_timestamps - ( - # stimulus_file - create_autospec(StimulusFile, instance=True), - # stimulus_file_to_json_ret - {"behavior_stimulus_file": "stim.pkl"}, - # stimulus_timestamps_to_json_ret - None, - # sync_file_to_json_ret - None, - # raises - "RunningSpeed DataObject lacks information about", - # expected - None - ), - ] -) -def test_running_speed_to_json( - stimulus_file, stimulus_file_to_json_ret, - stimulus_timestamps, stimulus_timestamps_to_json_ret, raises, expected -): - if stimulus_file is not None: - stimulus_file.to_json.return_value = stimulus_file_to_json_ret - if stimulus_timestamps is not None: - stimulus_timestamps.to_json.return_value = ( - stimulus_timestamps_to_json_ret - ) - - running_speed = RunningSpeed( - running_speed=None, - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps - ) - - if raises: - with pytest.raises(RuntimeError, match=raises): - _ = running_speed.to_json() - else: - obt = running_speed.to_json() - assert obt == expected - - -@pytest.mark.parametrize("behavior_session_id", [12345, 1234]) -@pytest.mark.parametrize("filtered", [True, False]) -@pytest.mark.parametrize("zscore_threshold", [1.0, 4.2]) -@pytest.mark.parametrize( - "returned_running_df, expected_running_df", - [ - ( - # returned_running_df - pd.DataFrame( - {"timestamps": [1, 2], "speed": [3, 4]} - ).set_index("timestamps"), - # expected_running_df - pd.DataFrame( - {"timestamps": [1, 2], "speed": [3, 4]} - ), - ), - ( - # returned_running_df - pd.DataFrame( - {"timestamps": [1, 2], "speed": [3, 4]} - ).set_index("timestamps"), - # expected_running_df - pd.DataFrame( - {"timestamps": [1, 2], "speed": [3, 4]} - ), - ) - ] -) -def test_running_speed_from_lims( - monkeypatch, behavior_session_id, returned_running_df, - expected_running_df, filtered, zscore_threshold -): - mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) - - mock_stimulus_file = create_autospec(StimulusFile) - mock_stimulus_timestamps = create_autospec(StimulusTimestamps) - mock_get_running_speed_df = create_autospec(get_running_df) - mock_get_running_speed_df.return_value = returned_running_df - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_speed.StimulusFile", - mock_stimulus_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_speed.StimulusTimestamps", - mock_stimulus_timestamps - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".running_speed.running_speed.get_running_df", - mock_get_running_speed_df - ) - obt = RunningSpeed.from_lims( - mock_db_conn, behavior_session_id, filtered, - zscore_threshold - ) - - mock_stimulus_file.from_lims.assert_called_once_with( - mock_db_conn, behavior_session_id - ) - mock_stimulus_file_instance = mock_stimulus_file.from_lims( - mock_db_conn, behavior_session_id - ) - assert obt._stimulus_file == mock_stimulus_file_instance - - mock_stimulus_timestamps.from_stimulus_file.assert_called_once_with( - mock_stimulus_file_instance - ) - mock_stimulus_timestamps_instance = mock_stimulus_timestamps.\ - from_stimulus_file(stimulus_file=mock_stimulus_file) - assert obt._stimulus_timestamps == mock_stimulus_timestamps_instance - - mock_get_running_speed_df.assert_called_once_with( - data=mock_stimulus_file_instance.data, - time=mock_stimulus_timestamps_instance.value, - lowpass=filtered, - zscore_threshold=zscore_threshold - ) - - assert obt._filtered == filtered - pd.testing.assert_frame_equal(obt.value, expected_running_df) - - -# Fixtures: -# nwbfile: -# test/brain_observatory/behavior/conftest.py -# data_object_roundtrip_fixture: -# test/brain_observatory/behavior/data_objects/conftest.py -@pytest.mark.parametrize("roundtrip", [True, False]) -@pytest.mark.parametrize("filtered", [True, False]) -@pytest.mark.parametrize("running_speed_data", [ - (pd.DataFrame({"timestamps": [3.0, 4.0], "speed": [5.0, 6.0]})), -]) -def test_running_speed_nwb_roundtrip( - nwbfile, data_object_roundtrip_fixture, roundtrip, running_speed_data, - filtered -): - running_speed = RunningSpeed( - running_speed=running_speed_data, filtered=filtered - ) - nwbfile = running_speed.to_nwb(nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile, RunningSpeed, filtered=filtered - ) - else: - obt = RunningSpeed.from_nwb(nwbfile, filtered=filtered) - - pd.testing.assert_frame_equal(obt.value, running_speed_data) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py b/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py deleted file mode 100644 index 9eb01fdaf5..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py +++ /dev/null @@ -1,312 +0,0 @@ -from pathlib import Path - -import pytest -from unittest.mock import create_autospec - -import numpy as np - -from allensdk.internal.api import PostgresQueryMixin -from allensdk.brain_observatory.behavior.data_files import ( - StimulusFile, SyncFile -) -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .stimulus_timestamps.timestamps_processing import ( - get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps) -from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps - - -@pytest.mark.parametrize("dict_repr, has_pkl, has_sync", [ - # Test where input json only has "behavior_stimulus_file" - ( - # dict_repr - { - "behavior_stimulus_file": "mock_stimulus_file.pkl" - }, - # has_pkl - True, - # has_sync - False - ), - # Test where input json has both "behavior_stimulus_file" and "sync_file" - ( - # dict_repr - { - "behavior_stimulus_file": "mock_stimulus_file.pkl", - "sync_file": "mock_sync_file.h5" - }, - # has_pkl - True, - # has_sync - True - ), -]) -def test_stimulus_timestamps_from_json( - monkeypatch, dict_repr, has_pkl, has_sync -): - mock_stimulus_file = create_autospec(StimulusFile) - mock_sync_file = create_autospec(SyncFile) - - mock_get_behavior_stimulus_timestamps = create_autospec( - get_behavior_stimulus_timestamps - ) - mock_get_ophys_stimulus_timestamps = create_autospec( - get_ophys_stimulus_timestamps - ) - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps.StimulusFile", - mock_stimulus_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps.SyncFile", - mock_sync_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps" - ".get_behavior_stimulus_timestamps", - mock_get_behavior_stimulus_timestamps - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps" - ".get_ophys_stimulus_timestamps", - mock_get_ophys_stimulus_timestamps - ) - mock_stimulus_file_instance = mock_stimulus_file.from_json(dict_repr) - ts_from_stim = StimulusTimestamps.from_stimulus_file( - stimulus_file=mock_stimulus_file_instance) - - if has_pkl and has_sync: - mock_sync_file_instance = mock_sync_file.from_json(dict_repr) - ts_from_sync = StimulusTimestamps.from_sync_file( - sync_file=mock_sync_file_instance) - - if has_pkl and has_sync: - mock_get_ophys_stimulus_timestamps.assert_called_once_with( - sync_path=mock_sync_file_instance.filepath - ) - assert ts_from_sync._sync_file == mock_sync_file_instance - else: - assert ts_from_stim._stimulus_file == mock_stimulus_file_instance - mock_get_behavior_stimulus_timestamps.assert_called_once_with( - stimulus_pkl=mock_stimulus_file_instance.data - ) - - -def test_stimulus_timestamps_from_json2(): - dir = Path(__file__).parent.parent.resolve() - test_data_dir = dir / 'test_data' - sf_path = test_data_dir / 'stimulus_file.pkl' - - sf = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(sf_path)}) - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=sf) - expected = np.array([0.016 * i for i in range(11)]) - assert np.allclose(expected, stimulus_timestamps.value) - - -def test_stimulus_timestamps_from_json3(): - """ - Test that StimulusTimestamps.from_stimulus_file - just returns the sum of the intervalsms field in the - behavior stimulus pickle file, padded with a zero at the - first timestamp. - """ - dir = Path(__file__).parent.parent.resolve() - test_data_dir = dir / 'test_data' - sf_path = test_data_dir / 'stimulus_file.pkl' - - sf = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(sf_path)}) - - sf._data['items']['behavior']['intervalsms'] = [0.1, 0.2, 0.3, 0.4] - - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=sf) - - expected = np.array([0., 0.0001, 0.0003, 0.0006, 0.001]) - np.testing.assert_array_almost_equal(stimulus_timestamps.value, - expected, - decimal=10) - - -@pytest.mark.parametrize( - "stimulus_file, stimulus_file_to_json_ret, " - "sync_file, sync_file_to_json_ret, raises, expected", - [ - # Test to_json with both stimulus_file and sync_file - ( - # stimulus_file - create_autospec(StimulusFile, instance=True), - # stimulus_file_to_json_ret - {"behavior_stimulus_file": "stim.pkl"}, - # sync_file - create_autospec(SyncFile, instance=True), - # sync_file_to_json_ret - {"sync_file": "sync.h5"}, - # raises - False, - # expected - {"behavior_stimulus_file": "stim.pkl", "sync_file": "sync.h5"} - ), - # Test to_json with only stimulus_file - ( - # stimulus_file - create_autospec(StimulusFile, instance=True), - # stimulus_file_to_json_ret - {"behavior_stimulus_file": "stim.pkl"}, - # sync_file - None, - # sync_file_to_json_ret - None, - # raises - False, - # expected - {"behavior_stimulus_file": "stim.pkl"} - ), - # Test to_json without stimulus_file nor sync_file - ( - # stimulus_file - None, - # stimulus_file_to_json_ret - None, - # sync_file - None, - # sync_file_to_json_ret - None, - # raises - "StimulusTimestamps DataObject lacks information about", - # expected - None - ), - ] -) -def test_stimulus_timestamps_to_json( - stimulus_file, stimulus_file_to_json_ret, - sync_file, sync_file_to_json_ret, raises, expected -): - if stimulus_file is not None: - stimulus_file.to_json.return_value = stimulus_file_to_json_ret - if sync_file is not None: - sync_file.to_json.return_value = sync_file_to_json_ret - - stimulus_timestamps = StimulusTimestamps( - timestamps=None, - stimulus_file=stimulus_file, - sync_file=sync_file - ) - - if raises: - with pytest.raises(RuntimeError, match=raises): - _ = stimulus_timestamps.to_json() - else: - obt = stimulus_timestamps.to_json() - assert obt == expected - - -@pytest.mark.parametrize("behavior_session_id, ophys_experiment_id", [ - ( - 12345, - None - ), - ( - 1234, - 5678 - ) -]) -def test_stimulus_timestamps_from_lims( - monkeypatch, behavior_session_id, ophys_experiment_id -): - mock_db_conn = create_autospec(PostgresQueryMixin, instance=True) - - mock_stimulus_file = create_autospec(StimulusFile) - mock_sync_file = create_autospec(SyncFile) - - mock_get_behavior_stimulus_timestamps = create_autospec( - get_behavior_stimulus_timestamps - ) - mock_get_ophys_stimulus_timestamps = create_autospec( - get_ophys_stimulus_timestamps - ) - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps.StimulusFile", - mock_stimulus_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps.SyncFile", - mock_sync_file - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps" - ".get_behavior_stimulus_timestamps", - mock_get_behavior_stimulus_timestamps - ) - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.stimulus_timestamps" - ".get_ophys_stimulus_timestamps", - mock_get_ophys_stimulus_timestamps - ) - mock_stimulus_file_instance = mock_stimulus_file.from_lims( - mock_db_conn, behavior_session_id - ) - ts_from_stim = StimulusTimestamps.from_stimulus_file( - stimulus_file=mock_stimulus_file_instance) - assert ts_from_stim._stimulus_file == mock_stimulus_file_instance - - if behavior_session_id is not None and ophys_experiment_id is not None: - mock_sync_file_instance = mock_sync_file.from_lims( - mock_db_conn, ophys_experiment_id - ) - ts_from_sync = StimulusTimestamps.from_sync_file( - sync_file=mock_sync_file_instance) - - if behavior_session_id is not None and ophys_experiment_id is not None: - mock_get_ophys_stimulus_timestamps.assert_called_once_with( - sync_path=mock_sync_file_instance.filepath - ) - assert ts_from_sync._sync_file == mock_sync_file_instance - else: - mock_stimulus_file.from_lims.assert_called_with( - mock_db_conn, behavior_session_id - ) - mock_get_behavior_stimulus_timestamps.assert_called_once_with( - stimulus_pkl=mock_stimulus_file_instance.data - ) - - -# Fixtures: -# nwbfile: -# test/brain_observatory/behavior/conftest.py -# data_object_roundtrip_fixture: -# test/brain_observatory/behavior/data_objects/conftest.py -@pytest.mark.parametrize('roundtrip, stimulus_timestamps_data', [ - (True, np.array([1, 2, 3, 4, 5])), - (True, np.array([6, 7, 8, 9, 10])), - (False, np.array([11, 12, 13, 14, 15])), - (False, np.array([16, 17, 18, 19, 20])) -]) -def test_stimulus_timestamps_nwb_roundtrip( - nwbfile, data_object_roundtrip_fixture, roundtrip, stimulus_timestamps_data -): - stimulus_timestamps = StimulusTimestamps( - timestamps=stimulus_timestamps_data - ) - nwbfile = stimulus_timestamps.to_nwb(nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture(nwbfile, StimulusTimestamps) - else: - obt = StimulusTimestamps.from_nwb(nwbfile) - - assert np.allclose(obt.value, stimulus_timestamps_data) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py b/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py deleted file mode 100644 index 4e6d53dcab..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py +++ /dev/null @@ -1,80 +0,0 @@ -from unittest.mock import create_autospec, PropertyMock - -import numpy as np -import pytest - -from allensdk.brain_observatory.behavior.data_objects.timestamps \ - .stimulus_timestamps.timestamps_processing import ( - get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps) -from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner - - -@pytest.mark.parametrize("pkl_data, expected", [ - # Extremely basic test case - ( - # pkl_data - { - "items": { - "behavior": { - "intervalsms": np.array([ - 1000, 1001, 1002, 1003, 1004, 1005 - ]) - } - } - }, - # expected - np.array([ - 0.0, 1.0, 2.001, 3.003, 4.006, 5.01, 6.015 - ]) - ), - # More realistic test case - ( - # pkl_data - { - "items": { - "behavior": { - "intervalsms": np.array([ - 16.5429, 16.6685, 16.66580001, 16.70569999, - 16.6668, - 16.69619999, 16.655, 16.6805, 16.75940001, 16.6831 - ]) - } - } - }, - # expected - np.array([ - 0.0, 0.0165429, 0.0332114, 0.0498772, 0.0665829, 0.0832497, - 0.0999459, 0.1166009, 0.1332814, 0.1500408, 0.1667239 - ]) - ) -]) -def test_get_behavior_stimulus_timestamps(pkl_data, expected): - obt = get_behavior_stimulus_timestamps(pkl_data) - assert np.allclose(obt, expected) - - -@pytest.mark.parametrize("sync_path, expected_timestamps", [ - ("/tmp/mock_sync_file.h5", [1, 2, 3]), -]) -def test_get_ophys_stimulus_timestamps( - monkeypatch, sync_path, expected_timestamps -): - mock_ophys_time_aligner = create_autospec(OphysTimeAligner) - mock_aligner_instance = mock_ophys_time_aligner.return_value - property_mock = PropertyMock( - return_value=(expected_timestamps, "ignored_return_val") - ) - type(mock_aligner_instance).clipped_stim_timestamps = property_mock - - with monkeypatch.context() as m: - m.setattr( - "allensdk.brain_observatory.behavior.data_objects" - ".timestamps.stimulus_timestamps.timestamps_processing" - ".OphysTimeAligner", - mock_ophys_time_aligner - ) - obt = get_ophys_stimulus_timestamps(sync_path) - - mock_ophys_time_aligner.assert_called_with(sync_file=sync_path) - property_mock.assert_called_once() - assert np.allclose(obt, expected_timestamps) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_cell_specimens.py b/allensdk/test/brain_observatory/behavior/data_objects/test_cell_specimens.py deleted file mode 100644 index 41da57a8bc..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_cell_specimens.py +++ /dev/null @@ -1,273 +0,0 @@ -import json -from datetime import datetime -from pathlib import Path -import numpy as np -import pynwb -import pandas as pd - -import pytest - -from allensdk.brain_observatory.behavior.data_objects import DataObject -from allensdk.brain_observatory.behavior.data_objects.cell_specimens.\ - cell_specimens import CellSpecimens, CellSpecimenMeta -from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ - .rois_mixin import \ - RoisMixin -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.imaging_plane import \ - ImagingPlane -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .ophys_timestamps import \ - OphysTimestamps -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.internal.api import db_connection_creator -from allensdk.test.brain_observatory.behavior.data_objects.metadata\ - .test_behavior_ophys_metadata import \ - TestBOM - - -class TestLims: - @classmethod - def setup_class(cls): - cls.ophys_experiment_id = 994278291 - cls.expected_meta = CellSpecimenMeta( - emission_lambda=520.0, - imaging_plane=ImagingPlane( - excitation_lambda=910.0, - indicator='GCaMP6f', - ophys_frame_rate=10.0, - targeted_structure='VISp' - ) - ) - - def setup_method(self, method): - marks = getattr(method, 'pytestmark', None) - if marks: - marks = [m.name for m in marks] - - # Will only create a dbconn if the test requires_bamboo - if 'requires_bamboo' in marks: - self.dbconn = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP) - - @pytest.mark.requires_bamboo - def test_from_lims(self): - number_of_frames = 140296 - ots = OphysTimestamps(timestamps=np.linspace(start=.1, - stop=.1*number_of_frames, - num=number_of_frames)) - csp = CellSpecimens.from_lims( - ophys_experiment_id=self.ophys_experiment_id, lims_db=self.dbconn, - ophys_timestamps=ots, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) - assert not csp.table.empty - assert not csp.events.empty - assert not csp.dff_traces.empty - assert not csp.corrected_fluorescence_traces.empty - assert csp.meta == self.expected_meta - - -class TestJson: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - with open(test_data_dir / 'test_input.json') as f: - dict_repr = json.load(f) - dict_repr = dict_repr['session_data'] - dict_repr['sync_file'] = str(test_data_dir / 'sync.h5') - dict_repr['behavior_stimulus_file'] = str(test_data_dir / - 'behavior_stimulus_file.pkl') - dict_repr['dff_file'] = str(test_data_dir / 'demix_file.h5') - dict_repr['demix_file'] = str(test_data_dir / 'demix_file.h5') - dict_repr['events_file'] = str(test_data_dir / 'events.h5') - - cls.dict_repr = dict_repr - cls.expected_meta = CellSpecimenMeta( - emission_lambda=520.0, - imaging_plane=ImagingPlane( - excitation_lambda=910.0, - indicator='GCaMP6f', - ophys_frame_rate=10.0, - targeted_structure='VISp' - ) - ) - cls.ophys_timestamps = OphysTimestamps( - timestamps=np.array([.1, .2, .3])) - - def test_from_json(self): - csp = CellSpecimens.from_json( - dict_repr=self.dict_repr, - ophys_timestamps=self.ophys_timestamps, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) - assert not csp.table.empty - assert not csp.events.empty - assert not csp.dff_traces.empty - assert not csp.corrected_fluorescence_traces.empty - assert csp.meta == self.expected_meta - - @pytest.mark.parametrize('data', - ('dff_traces', - 'corrected_fluorescence_traces', - 'events')) - def test_roi_data_same_order_as_cell_specimen_table(self, data): - """tests that roi data are in same order as cell specimen table""" - csp = CellSpecimens.from_json( - dict_repr=self.dict_repr, - ophys_timestamps=self.ophys_timestamps, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) - private_attr = getattr(csp, f'_{data}') - public_attr = getattr(csp, data) - - # Events stores cell_roi_id as column whereas traces is index - data_cell_roi_ids = getattr( - private_attr.value, - 'cell_roi_id' if data == 'events' else 'index').values - - current_order = np.where(data_cell_roi_ids == - csp._cell_specimen_table['cell_roi_id'])[0] - - # make sure same order - private_attr._value = private_attr.value\ - .iloc[current_order] - - # rearrange - private_attr._value = private_attr._value.iloc[[1, 0]] - - # make sure same order - np.testing.assert_array_equal(public_attr.index, csp.table.index) - - @pytest.mark.parametrize('extra_in_trace', (True, False)) - @pytest.mark.parametrize('trace_type', - ('dff_traces', - 'corrected_fluorescence_traces')) - def test_trace_rois_different_than_cell_specimen_table(self, trace_type, - extra_in_trace): - """check that an exception is raised if there is a mismatch in rois - between cell specimen table and traces""" - csp = CellSpecimens.from_json( - dict_repr=self.dict_repr, - ophys_timestamps=self.ophys_timestamps, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) - private_trace_attr = getattr(csp, f'_{trace_type}') - - if extra_in_trace: - # Drop an roi from cell specimen table that is in trace - trace_rois = private_trace_attr.value.index - csp._cell_specimen_table = csp._cell_specimen_table[ - csp._cell_specimen_table['cell_roi_id'] != trace_rois[0]] - else: - # Drop an roi from trace that is in cell specimen table - csp_rois = csp._cell_specimen_table['cell_roi_id'] - private_trace_attr._value = private_trace_attr._value[ - private_trace_attr._value.index != csp_rois.iloc[0]] - - if trace_type == 'dff_traces': - trace_args = { - 'dff_traces': private_trace_attr, - 'corrected_fluorescence_traces': - csp._corrected_fluorescence_traces - } - else: - trace_args = { - 'dff_traces': csp._dff_traces, - 'corrected_fluorescence_traces': private_trace_attr - } - with pytest.raises(RuntimeError): - # construct it again using trace/table combo with different rois - CellSpecimens( - cell_specimen_table=csp._cell_specimen_table, - meta=csp._meta, - events=csp._events, - ophys_timestamps=self.ophys_timestamps, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3), - exclude_invalid_rois=False, - **trace_args - ) - - -class TestNWB: - @classmethod - def setup_class(cls): - cls.ophys_timestamps = OphysTimestamps( - timestamps=np.array([.1, .2, .3])) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - tj = TestJson() - tj.setup_class() - self.dict_repr = tj.dict_repr - - # Write metadata, since csp requires other metdata - tbom = TestBOM() - tbom.setup_class() - bom = tbom.meta - bom.to_nwb(nwbfile=self.nwbfile) - - @pytest.mark.parametrize('exclude_invalid_rois', [True, False]) - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture, - exclude_invalid_rois): - cell_specimens = CellSpecimens.from_json( - dict_repr=self.dict_repr, ophys_timestamps=self.ophys_timestamps, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3), - exclude_invalid_rois=exclude_invalid_rois) - - csp = cell_specimens._cell_specimen_table - - valid_roi_id = csp[csp['valid_roi']]['cell_roi_id'] - - cell_specimens.to_nwb(nwbfile=self.nwbfile, - ophys_timestamps=self.ophys_timestamps) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=CellSpecimens, - exclude_invalid_rois=exclude_invalid_rois, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) - else: - obt = cell_specimens.from_nwb( - nwbfile=self.nwbfile, - exclude_invalid_rois=exclude_invalid_rois, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) - - if exclude_invalid_rois: - cell_specimens._cell_specimen_table = \ - cell_specimens._cell_specimen_table[ - cell_specimens._cell_specimen_table['cell_roi_id'] - .isin(valid_roi_id)] - - assert obt == cell_specimens - - -class TestFilterAndReorder: - @pytest.mark.parametrize('raise_if_rois_missing', (True, False)) - def test_missing_rois(self, raise_if_rois_missing): - """Tests that when dataframe missing rois, that they are ignored""" - roi_ids = np.array([1, 2]) - df = pd.DataFrame({'cell_roi_id': [1], 'foo': [2]}) - - class Rois(DataObject, RoisMixin): - def __init__(self): - super().__init__(name='test', value=df) - - rois = Rois() - if raise_if_rois_missing: - with pytest.raises(RuntimeError): - rois.filter_and_reorder( - roi_ids=roi_ids, - raise_if_rois_missing=raise_if_rois_missing) - else: - rois.filter_and_reorder( - roi_ids=roi_ids, - raise_if_rois_missing=raise_if_rois_missing) - expected = pd.DataFrame({'cell_roi_id': [1], - 'foo': [2]}) - pd.testing.assert_frame_equal(rois._value, expected) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/avg_projection.png b/allensdk/test/brain_observatory/behavior/data_objects/test_data/avg_projection.png deleted file mode 100644 index e6d627dc95eef364733cac95532efc2196e5320a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39966 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 diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/behavior_stimulus_file.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/behavior_stimulus_file.pkl deleted file mode 100644 index 20d6103b210e7c812361c4037d68f3a8472f152e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 zcmb_Z+iuf95OuC?+ydne<<e3Lm`g%J8a0u40ObX-QmDeq_QA5&_O`Kb?3~?oq&!&S zC93#NJ_IICL3{x7uroX7%<Sx$@0A>u!)umhMMh3FN;%4Wldis;h<TJM5TokwZA!&a z@XgaQ(W%m?xv1yZ;9GwHIhTpi*mTiwSeeyXLuygLQDUT;i&#^CJ4mwWY|#o*C0o-h zHjz+DENoB7AWgJUSzv5ztyy*wu2F0=Yl$nvl8>twxHiU)!%ECv;`${qG>e(Eaf6p> zoU=Y|GK-ZiaBGa)4y*7IW#8k@Xf*o#i>x@9WpLO3F+3rRto@;I|H0#)!F``MsGm`h zh`l&H$F7S9PL7AXPU%aj9=UkzxY%<FmDXHsgfiGC0n5_G6X%~cG6`|ODy$-<&hd0Y z<%d-M%$e-7DytIx`6{fj8WChs7{uO8C_%cv$gy5CJ#a4ZlJC$QUrs)qe)T$DG^L#O zKH`<mbg^nJwT{xn%d#lMYko-NPPgCdc7)$Nlf6OnsQ0eh9CUg|&GvE74+qD-FWX(b o;Wkl=Pk1JpN;HE|7`Y1VzX4i9d*f$gccqYJ;q4ObF*;f6H}R^kIsgCw diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/demix_file.h5 b/allensdk/test/brain_observatory/behavior/data_objects/test_data/demix_file.h5 deleted file mode 100644 index 7ed6ecf0b058cba1ff798f9e4cc52f4b1475c431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 zcmeD5aB<`1lHy_j0S*oZ76t(@6Gr@pf&>nT2#gPtPk=HQp>zk7Ucm%mFfxE31A_!q zTo7tLy1I}cS62q0N|^aD8mf)KfCa)rbsbE0lpgLO;Nj{R0P<r5)T0Ve`UEtcLAeYm zi6x03c2Rz2d|qO1YB5v-mOd?D3W=l{8Q8$-7eatis0LUkBNN0#W~e#1X$i1aK?QpT zNEUKnFyUq}`482=3KRvI#KZ(KkOP`im>HqU89Y#2Dg+e<>EYYLn8?78fg(?9POzW9 z3nK#)%yA3~FpuM~7?xivSaB#Ap~9Hy3Q|HcGU7^C0^oEa08B)%bOZ`I-08;yq6}X0 zLIN5y{WL%%M#&Kw0y|5;*=&${ZQpTz@7ovqciZpXdA>p?=#~8pBkQX56+7(BYbBq` z+<kA~a<wAI;^{&ADIVp{8@P|#Z#l`E<N4))eT4qhl}B3M*e`L&bN~h5M<^}r2;l<& D@Xumt diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/events.h5 b/allensdk/test/brain_observatory/behavior/data_objects/test_data/events.h5 deleted file mode 100644 index 6b2e461e710748669c94239995010d99a17cab1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4368 zcmeD5aB<`1lHy_j0S*oZ76t(@6Gr@p0s%pY2#gPtPk=HQp>zk7Ucm%mFfxE31A_!q zTo7tLy1I}cS62q0N|^aD8mf)KfCa+RfC-G!BPs+uTpa^I9*%(e+5$?SfTlAjmm#$* zHLs+YfgvX`Hz_5tm?1Aevp6-rxFiKA1_DL-nelmvxv5YtIBkN&6+i?Qz{tP`Q3Flj zj0}(z$jAf{V20|!O-q3F3o6(%aDdf1Fqm*NnEZ!oU<HbTOk!e!7{~$5Da?#e<qRGu zt`dR@gY<0Qz?8_qkbxpkYfiAAzY8O<lz{jJ7;Z3+<FFW3npCjjPyiK%l@A?k_|<8^ zq+tfb_(P1wOjnQ)U}VIVuE<SC9?+<Qg)k(bFw;@RfQBIb!XsfwgvWqJ1{szgm@lP& zS7n?1zFJv}beDtna~CP^{L{Y0URp&gdcM&n`}*T4jtw`r*?-!?d9bH>qx}+xOb3uP zAEC6gBZN<e)uUQQLtr!nMnhmU1V%$(Gz3Tt0n*!D0^t6N0I(GWX-GMMZN%M=sUWhw L)j*=lX`>tfZgglh diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json b/allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json deleted file mode 100644 index ea748f3bbf..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json +++ /dev/null @@ -1 +0,0 @@ -{"rig_geometry": {"camera_position_mm": [102.8, 74.7, 31.6], "camera_rotation_deg": [0.0, 0.0, 2.8], "equipment": "CAM2P.3", "led_position": [246.0, 92.3, 52.6], "monitor_position_mm": [118.6, 86.2, 31.6], "monitor_rotation_deg": [0.0, 0.0, 0.0]}} \ No newline at end of file diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_table.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_table.pkl deleted file mode 100644 index 4814d9450299444faefaadd0acb891347b28fa25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19916 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�<Az} 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 diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/licks.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/licks.pkl deleted file mode 100644 index 91cd01df9e6d0edc8c0c364ea659e70f3642d26e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmah|L2J}N6yEG6Yr9&cV6nXvJSg!JEC>n~7FrQBG=<(vm?YDk)Xi*|nWzg^^w5g% zJna*&Ui}9iJoyv+1O5iDBIuiB7j{e0Ib>euz3;vEz4_*~`{B6Lsu!%5OlC|6=}7V5 zNU?$=EI(w1J*w>q-hP88=z|w$bcnDyAD>IZm1IL56il)KR~q5U&Ty1I-E01_#`}kq zV0{so@fTbN3DZ=s7fb#;ek|#X0OB%uGuu{no5E|dD#~%wXHgAJ&Xi(fsuwGsj-)oK zN)5rms{;`(5wALAf??|vcbx>^;sN@h6ShxLtbv!Aamg*Dy?>u#LZ|U}z<G&L6g~Mv ztNw(2gULI~qG$4gYr~3?sCv!3I61+Uc63p7MkT}wY+S@vF*&ew59~fiQTP#flvEk& z0$goIC59bqa59`aC#UM-nz(MMh>aN$C+wV|*o5}cIRe|~2(&DL-Syv}e}3OfKJ|aS zI{s=VU-}Pz?7#mgzx9#a|Hz&%WEb0u!<pu8H;QU?r~C4Bx4G-?SHxAiPqBJIA>wp{ z<|}S8+lW6K<NpD-<^lW!p?fFTx*KfOnspgz3`GyRiPfY=njv)n-DhlAS<gLKDh4Vh zC*9^!QspEoX)jg}^VBNCilUK4Wn0h0j^ILA1x-(RrKw|ZW0Dd*94pn?BZ>=dSgqYd Htdig_7IIR& diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/max_projection.png b/allensdk/test/brain_observatory/behavior/data_objects/test_data/max_projection.png deleted file mode 100644 index 142d20fe38019409cad3f1d6a2857acc58bf88a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74085 zcmV(vK<dAVP)<h;3K|Lk000e1NJLTq00G1R00ICA00000Ii*AV00961Nkl<Zc-oBp zA*^Lvk|hYPlFXzwaE>$w+zT#nm+ArkQaOkZK8TPyKqe?KC3S-wkYENBm<9v7L4zU# zhBPQJ0~&OJ8mSxPNR=Q#CP<J8Vx$Q0!4L4jcko7f58RRN1-qrafwg2N%>c8#&p!9P zA5pH#3jgl@-aGf~y=|K<TWi_B`2PX;7XbSI{!6fd0b>x{AgnNPkQ)F%l*s{r9Ds?q zA^sZx*x<x~Ik7o83{Y`WiT@M>cmdRnAqs;qsS}&Hi7P-%fWsUxFwDgOFkk=!N*q6` zEo=&LVsaC>LX-d~nA{u!b5Q?ECnpCi9+BfWAOLJ^z7!T17%G<kfJvPI08GkIA+UnL z<^bZ`DL~@p1UA4azMG0T0F6JL|1W+Mug?Gn!NtJjD)DXm(=oAH|M@Uq;3hi0NBnYP zbI3RRi%-?_&*DoU%DF=Qmx*|dF9Sg0(~5yyWHW813_ygSZUEc>N4^q()@6Nd`D1wh z*8N?Afu*5;+IUg%u21}m{c#AMPe<|Z$orG8P#r&Mc@nQ)!HfEhK~9XND8m3*tL`6< z$qh~b7^nNbCB*@Q10)P`K;y+T763ql<%1g&+z_wd7?4Z7gYpFcB<szwz|8>|n4IF# z4f8JsIZki|U@M@D;0nND9G})4n_#O&SuDTWLHlyW!V60S*r(SFZ?>=VI<}|*fU;U; z#71Hw2DJZM^>M5jZh~eE2U)J7F(A_5LJC;HFaDyjjGq68zL;YT`>(2Z1zHo@%1T(# zSmMYxahrBBB07Lb<Gb<r-to!E*#yf<Kp_#lnG>*h$yd%$0zkAvSri83>%PS4NB{6x zKj}4hCXW}}-$TCo_@qrBFlS@a{;0AM8ywIIs8%>^I%oOY*r=)i7L*L9<J3E*7p02} zdBiFQgw5lV8v}5`QW}u4fX7bldu=*_fI-gS+XX<wzDfiGIQA`YeSFychXKTvA=9b$ z6)*s}VPOzp?Y5tMikGNhV}pTW>Ebk#;o3iz6BrzE7vSxz2EAMz!ocR{CMzn$_LUe< zC$Wu}*vvvuasj0D*Jw6gL;neY6AUK2Al6>{J!MQH1cJlFV0lUu+>aqiZ1jDR8o^<3 zpSJ(lpafWx&D8Qq7+`2TiwcZ=!Rl%r8xary1cA`iEk7y~u>tM?1a*J$xhIYHKN!zo z^G-6}PqTsgKPM+)11TJOD+|C{8XE!PO)~nz0U6()roFSr=zY&p^JT0PG1Cf|8<?<~ z!kC;2fwgZ@2k@g#5roB!Uf|=Su;ry}92=GZ^viy{a~0Ncc?zpQ7hhcKzUBaVett;o zz5+lP4k(Y4$P`P&{Y!bfKqGW`zCJc{f<uYRLQ-R`6mHY?Hv)*k7v41PVt?I=zfr%4 zV%>epAmF*E3{$r8U<^=fAI5yka&B&Nb*0#^0>*ZN-j}<*57lO|cs=;_6vg8GF|2rH z5WG47k@(1PqBs;32Lt5sye(ED)^P)9RrtcDaA@D1On@^EnF<|p1@HUJ*5$mE1=s*n zpys+eC?Y!LKH#27<d-u{@=S2v7BHr>l;tA8s<CH$zNE+<>_wme!x@Zt6AWbqs~aQ2 z*^0QnY4NL1yN>{tts0n|$G7hLDIRb95}*E>2yi1{DQ*s8HiPaP9RL=b?nVyF57b{^ zK0aq2EII;#AC_AhurM~rErKV(eZJ6Opn1c?39u!;<1vRJ2sAzb$6?FeshPGBX?$eJ z=_1$^4gtw}L*3tkc^oC`(M&Y!hB$gE0LOY0lN(?HEGy8oYHUP+pd9asKwubJT!<98 zsr91{%PnFIzirJ7OdCTQ`X)y1UEw%o@fQ1~HzfjK084+-41fh$mh^jx_h6w==#6DT zqzdfu8>hp;%=?WXi2I1*I#4LEf>_1CvYayE@VG}AjtH;$A^VN*0MtQcHP}7sA8_PT zMw!9y|8zVAz{W0oi$Y~xF2V-5F~BC5Vy^pDV*qjPB&PfUh+8hQ>xeG>K4vSlRw{S3 zI02D^d5`Zs#Cuc<=JB8TaOxu?hu;APu|i!GH03OI+Z3{(X}|hMeK-C)<7}QFBbX5P z+!Xn6QF_H<I4Q`0(s$@X_#*E`Q~#TcdqQw02P$8%G$<`kENB&g8Iu8K5Z(Y)5X{(| z`lW3Q1EI3gIM*4am7DdQ>;3xWs4Zb05y3%VxvaFBDiMgqlvZ^eNr8>e;UKg9Vx}I2 zqC_xuSey$d<)TxrXGTk#Uq=MEDEQ~?)lZ4dE1^=NIEsjp@AEE;<V`Z&c9HGyu^=*b zVpCoKs5KBQ&yYZQs!JRM)xHt>6U4jScTncMv>*2#z=`R4A_Ce4MC0AZXIxJVLZLQY zZPrsyc2FD$x5!5N-rCbF7{dW~5{TyW1IiAfZKboiGC(Y}-E`5?zke3m1~ZrGGmMYK z-it_kSR$QvaeN6M3LgRk?&Fmk{P0cYf2fgY`E(v&!sgsJQNO+VLkB#-bgtC5lQlv! z-<KHcVPlc!^#p+7q)e94CvrdZe=zdUyv96BQDNY|shW8?!<ls~2evZ^Y@4cL6jyMN z(sW-cXEmCrz@aYb*RitzEwWXQ$hBfQ_oBpPmCr9$^E)Jt5<ms@GiiO>_E$yDc|>{S z{oap)jrWvk)~J1W4;zoWU_3H`Nfb*1@t#IF#SN-pu#;O~#XP~r24g4Cwx<iMtjYk) z+yvxU%}H%Sb2>OcFt@0WcvSm<1{7oNa>Nhv)^Zpe1%Q{RZ_V@Cmu>B7vA^zL>*M1a zOrZHEJsdG{fNbj1Tj_8oAObZQizpC<t^y>sATRQWyKKTd#pF1d8=7g)Zk?vJiF<Wy zRsxJD)=Fk5G7g%$y<5Eb%@9*$Xp4@F8F09WAoDglmMCEKHFa9uO`W0?AO+wOl{z_~ ziJws4^v0t;-oY{tG$8(v15i<k@1IeKBPZsTkR(}!u?F}Ea_4P}ZO`PJUIP~FIZMx- z+P;w!|D;?ik5#0^7@-nZ*a~a;xaHdygL(yA+UkJ2&+kM)Og%6=09h~hrL3x1Li)SZ zxUZtqbSbC|05t9?Q~zKAd0y815^+}=#S$?f#EB(1J3ctW2uw$H6z#G8+LKvhGY3U2 z)-$3AK=$x7dC2nSC#M6BkbBp9h*7vU*lKWg0?h2PGT;`UhD1H$pyfVy<zpm@Z^v;9 za;_nq2;^pw4l|YxVX2bi+o$;G1i(~lt^376tRRE*+LQr5VJRSi9<uoX64`X2c_1T+ z5a*v$zNq)FAHae*9}uN=Lj@e-L{1D=L_I1bZoPJ#K_hTa`3O!ei)k?QxXi|U1kBmq zM}+{U*#NQ$^OQuyDWHa4nD?xY0Iy)R{zF}493qf!xGSMU(@`|q!%OI)#I(arj;P^` z4NwS0g+0oMo7z)^ITEx|?juqHw8E6QzyDa7Z%?%WB<A$+cBZ?{7{<zQ0=Y3FDsyE0 ztZ@DyhDrcI0C-{XO^hv(rL4x_Fzy+n!`P<9=vTnNk7EZnd4JsF1hK<~`c?E%R3IjT z^Iolud!m1K<2*QfTqjfrDI46-Ojy{#!~%0bM5kQFKE6(PR6a~%JqNM=6D1<8+g>*U zpW}OJ^;fS07-w1+u1e!7%`bVOM1K*NojwGz8P@KdDu7|a<g6Wt^6^IVwJzIQq5&j` z6C2lssDsXeN=^<3LzQ75opUJcO)VR-AAms2Nr2YlfKSoO_MrHueg%e3J)L7?jC_Nq zZ^3YK0?H!Ha8+|!HZcHL*Z>x3OLITIt;h4f$1IL+WvsXN+@nIA?LJ-L3P9ijvQqrk z1_n#AoZ}A2XcA>TV2}Z3(MYxDw0P=p(Ec%<nH9asg$1rKkQm@B%Xazh`Nb7jfd$PB z<_>kiwtW8b^zz4_OQLMXkx$tJrue=_5y+BBBW2HRPiJ9MW%}{^w7A3)wV1Iz*S%um zQ4<(DF}W*Tq2>UyEKrCr#l~F}4@u1XXqrn17*9YI^<>suM9rqk9nkA40Z41r{$iL| zWW!cy$1JV)HatF`yHOr$<G8Tq7E1r*iGec=uBLDTR0ykCG%TEyx8?FAU#lt;uw_!O z3IKHa&8M@-S$?b|O}4pbb$AD(ITZNVBJixn7)Bic=lu@kUp|JO!It2o0*yay9dkb( zWrnDW!P^3ugB;rhmEGGCL73D{eWcOHRb-6xy=VRe+$Y?q?>fs{X7qM|LZZY#vHct} z;3_JFy%6J3^w|N}HZUGLuj3IZ=ok<<)D$c@R$43$0or}N2LFInG~yM(9iP4~pykA0 z%Cphv5%#!nh<Xg;@w|&d77-|<Sin9$IvhOR-|x;tu1fslC>3<7j+~nH|LmaEo}La! z*Yo<^P7Q%rFflF4ktgGTFHN`Z$O;*YaCLG}@7UyX8=UxXp*ny@`)!i63MjBB$TD2` zXwuOrtudoiA7uL+Xi-$N6zl_u9<+OPHwZC_!ciQh-UIA0gF^Bdx6PZh4X3Z|c8w~} z-_;bJ06LHJLEF=}%w}6W%0sN*Hz$8^L1nKYVCZPd1wb!5TF4!R*ioa7$9ANgNf|iZ zBbTEK?tmDu_(LR5c%vu%Okm>WDeeMFK8)tBiVw<uTt%Odv1kvm6TBK4N!vepJQ`De z1H&ki_>eHX%d?{7F?9&75Cy5L17cu+-4w2(YKjC%5+Q+X(G)&GzP{Y;(AY^P%8v0( z8+-jMU%mllqbr=0drdQPkf~e4htwvYc_>_E&59BC}&cfuZ?c-AMm2`9=x)^Jic& z#{z8d?MBD2Hb-^euRnpTCk9Y;MkHr&>{wjd*v;(y=^XBi)(L6gBQ$cUcRLhHAKWiC zvtLM*%^jeX0D>i;K>%FMfvTe{@ZRVGh%!RyN#)b)6(Fq8cx0FP=k?2kf)7ye3K(t? z%Cat*%d-9a5awdZ=2z_I=Eeh7-2o}?m0tWn1_M*)svp<-f-|rJ;6(%ts_{XI&EIuj zoB@!qM3<!4)$6|G(~0keR{!9ML6ApEZ*d<23Q`79q6E&Mtcr<8fjica02e*{oGJZh z2OqLn0Vsht>ZgwaP`AN8$Zw#)El$^36c7R#yyMmH?i2*nRw{GURt~T`?bjFE%*J67 z@kjh9ula<WNTj_h$0JxwHKZh7=rgCI$hYzYiFDlc)l0GmdpzWc)ZoT|&<co@a)klT z_V6+NxJ$s`sQ#H4tUiCwh-uN-m43!agI)77_mKkJS=_LwcetGZ(QL4EV6|^%he)UR z?N1osp6xf63PCr5H%Ea6ZIp@OkOnv%ui<fDN2l5ZtQ`#?QJ;H~!lTd@tTehd580{B z<&sG<K>|}6iQVH3?E@sV=x=Fz+5j}tTJ-0Vbdtm+>=3)edw(3lwZXBkGl)CC<H%y{ zH7qfq8TU`A7$pet0Jwx<;s%)cy99p$5qQ(qn{FiQT6O=2PUvKuXa!)<D}uIX<VXC) zuw*($%0-2ILBFqZ#hC{1wUaer0QrKJi%L!)>a8XNSb9Qf0V!Dfpib;z&H!)j2IU=` zm^e=q6+WwG1KsCFE*u3fl8{}irJod!F2|Hq_2xWo@FpTG`OLPr^CC0fZ!V5dZLmR3 z@rh8kgY22HimcWQYkiM;TRc4j!o^0J3Wgq+J0T;1sYMIa;bc3L#bzYj6fP^=)Bz%* z70y0xzSv*fZ~LC0d90Um2j}9YDRqd#I#DBu*X@Y>et;udr-1OtgmiDS5#YqMX#c}p z$#G1piWn43+K#0~mfVM<OcU_gqlYoz3~_7-P|dif+;xqpX~sTEXdTzBfoFhh6={Qq zI^kw)9H+_!psnP|ZB9v$Ih<MvOxMPa%vDSv?T|1k69`LjCtk3|ORBsC0ogfe5_|7C zavCFtENwKAD9gv7-v@@fUnr4PD)?g@_}!ndO>t`6jkGszKuk2CuMyoEDNocgj2o06 z?>u9mMwiAM<5Dzck<IDuHYeg<N4+lo`0%!804@RSR!a`rVdwVd1cwk}D{zCs$Q&{n z6WQ50ktqR|%->EUVG9reQ>MViK>5UsW-IXp8Z<p~CIKv4OZf=BIUikyPIk|lj}2h$ z^|9{@7)?83BgdclWuv{$7NI6sffP+MH$+ZJ;N?6n5{d?pxk7nwVfA`EUfg@M!2-Is z9ok3FP_$o@oQEv(BR0rHSsEX3=pYOPf+`#qJgk|fJrD{eC>D>?VNgaM(cY2{X^02= zn4Atsw0Gp(rhWsex~zijyujZ|FI%SiJiC76J&-9efFd@P{z`ySp7q|AHjefZK?HYy zz)#+_J|?)22hVXd#nma3IRH;sw4?xrHIRJr_fT#0)CS1J$@PmAm^%@yH!zKxp6}KY z3s4scx_)Qd9&w;YY}pfZc6%rXnRZgwNY<qFBN|u}2L8^3B1J$1xA@F~_0U|ulTRFP z{r1HK+eXm0=a<--iiJgw<@xAmFqlLYjW!QfjYkeh+>_9FPx&Do&a$bzkEb8UR_lGa z4qtheK~A2kB`I4;cIQeU^&pEffF4pGHcTu79gycF!)FPaX~S)QN|yMbHfOMX6>~r2 zA*YdZNa7Prteu%a9OOB0)Pewr1Lw-Uvm~{`dfuziW2PjI?>J)~3r?a{Zd<#7)=#d| ze*8H%x3TF#bU{9|6qy9<5L!3XYmd3qj}UWD@q2zuR<@?}L4!!L>5&z|xSk9wr_qwJ zEIm5-Vbq$rKpi5a0`F=R7fc;2!jvu9@yzp#ltf3ylL^ZVF!8byfPyw|9~_~N(di`6 zdXLZx-P0x#4K#M}Ba+L<AP~fSx-KEoNty=I5jyyx*UHq{kS;n7JNpd{7rkG9PND(` z>|IQ=Cvw?xhO;{nf#kA%`B7ea>)OEZv4kDEi7)aOw+Xf90|+<KhHPM_+ox6ZwRy0J z=}<`_)guU&oP)&L0Q|@wkZ%rh0S_E;Ku<lstmGQIH&p_%o<46Rm-VOLU3-h20vOo& zO>;XZNCCcU5zqn7-i{=|CC{UfFl4X0sH11v2?-HhX+La)y-humfxSfspwt`CtbcmG zNKx0Q(AZ$c<Z{N1S~8R!pYh7e1^@OxJiSe5UT-+;teByb*w;-u?Isx*fhJGs2l28= zkVxQa??QT(7oHpx0~0|#8!x`oSLh+2Ita|>JTG#`{5;79ENs%h^76g9+5jDF5(|t@ z3}p}hAUGPbzofr0Iox=#|42g-mVj)h!pD_wK{XPA63zT!?ueBUK&d<6OeXwJJA5sl zzQ37*oI+PTkean3`K$uK?aqJ2|HuD$snnu(W;{q77-C?5B<j!#RhubGN3fM4BJgtG zOttFVR6HzAWUHNK0XBt3FKisNSyDLyEJS<NK|`72v#yWb-LE&^d}%Kb-GQSiLGn4u zk>rKfn;fD{(b#5ST^uA$!6CFD0NT{Sp|9lu_^`z)s*7$Sw8pcNPX}Xxx|2%w5bPKi zI!OEJ`!94|%*gw`1sr-4?dM;OUtk5Nm#6aIKR<tCSlfXi-uab7E4KLbQ)t<HZ9Kp^ zm!9ppYg0o7$_S0Li<3jb2d6*?!O{7K4@|`v1_`~)T-uO8mEe(>@J`B|4yL1Nv{YF( zJJ(ipYW(w1H11nu=(<x3?+}3tt=T>nbdWR)E`zJK9qA|TP!gnLkt9Y$WFR;7%=8>g z>w-7HNoV$iJ#+y{R>B?F?ndq)*_s-h;B8lVM;_6>aoO<oH~-VOipAV`@5fB1#|bW2 zw5Qb2WhM?rj!zIc2Mo*__}Cp2_z&g|fosU|*BuG~*eJAMyP{ecXf*#Lz=<_8i{mcp znp?qil}Ys?P3=7&C<{mLIX+Dc#J+4#SiX5&FO3N5X4JJ0P|do`4_YDu11(;RX2L+R zrvkQu2-+l@;bXTg*Kpx&!ON_u2T7uSb^xvc)MtIV{)YbTfBaU}hfHxIxEaIY1YP2j z8N(cn_Ixki2W_$f1-FDLfg^n^d<$5J39eTUnrMCkN;1RzP8?8ls?b!;d1rzS4uVav z*uMS31cFfJ9L#%uI4-vFod;CR4v>lxe1K`@Xae(iB(qQ#r{H*BhN$zUF3kXU&0M0X z_4~mfP?X-+v?Gp@)hsc|dOCmB>kxmtHUex2PX?k6z`Q=+UisI2dC`iXUx5d#Gk9VE zn(ivgk#Uc@p3WDXHk5DYVxBb^VFk>Cj0+GmpI8iVT&@aeWF&0CgQr&GBMyS2tNLKg z_|%-=*J8YdUO4UnHj7-+@fGv6$*B>E<b`^-aX^pei(j{rAd7LrK>g}s!J)qt+y@6c zOV>si)SVcr)w^f~2B}lA;iF?P5kZ{6+vhKTdHN66lFB-Gkst~VF7d1)v2Sm!YueB# z*M(TgA&5jUE9X<ws)3ZyfmFmeUltMY_T`%xV9dmu03a>mUEQ~A(XoSIy9L);C@zZ3 zN<|Wxwn;zk(zh$YCo~pE0>`9Ruu1N`FW;0gO$WI<PcTnMDpkr?)dT4d90n(#c<kPM zotzoil*77%-6?)Z?M)RoHy?cgrgs5;5?Im?PyfZgyZu8Q4_U$9pV}v)kqg{Vpa0_z zKPDRO;YA~K@fRnNAo@ox!@N~<djLHEz|I#DxU=J=8qM*A!ae6)O1^7iu;%`uRSgJD zI;d}KcUJ;?Z)Dk;-EkRM7wyUI-r1oY)X2|A1Im2g5ub`rjMg3*jEQGZO7)n)PA(6r z7<M2rp&g8a56Uu-UO-Vo?cYrd*%cj%t^hzg!`QrB<-fo`k0LHHJ;S4e204@j?)L2p z*HFWxD*5TJ|MqlW)(fuJPD6FZBA&<CX@@Xj+li<+tstxyYyG$cdc9>y%$d?e29$;Z zh9#H-)u9Tt6m@bJ*E#VbPiVJ$SpH1K=42_<JKe-!^Mo~Q*DVjB!X!N0buttpcZOim zVgJ+L`b^#&zo~1#^@YGtp5pl4^tDL=z_20N!vphi2vr7)wJ84mzd8NxcWQnRG#}_7 z-cvFSJ$2}@`|F_3|K{>n|9*Meo^aAz7EncI6lYGY*2{_#oJ-Jhc}Z|W2?_zNj=b1C zb5{T|m@&z1L8%6I3M65;F>K3OK3$%k{}9!Y^LYIqabcOxgf}Gno?tQ>VuG&0!~Fjz z!;?sXg-JmZFNzKl-2*kD?vLQTG1%FuQ&Wm$bc(W$6bOP32lJgC%nvMky_(Z=J1|Yy z4)?)u4Dl|?w%(#}VBO@3pPVBcbS|IaTBT`st1@s$xt0r>8^oQ#+(e_(9Zf}I!7bo* zBaX8qO4je9D2=sv4L2N0$19{|T0Zob8=8?r$!Taxjv8ecmh)v(c?(f!kX0axl!?A4 zU3M)SfrP^6qEn6@1klH0W5M4D#efqW0vP$OP|Z7Uoq31RxZge#uG*@ltAV|vr^PDX zp{_dIh6cqo8#o{VoP&^3LlS-XRruxgkJZsso~_@0jJzOuaJ!Sob_UFx(&`HgbC^c( z&_zVGCMC%Y#t?AlXS)L6(uErY;sA%q+1%k3g>IK;T-n7SP!|c%(jLqL05D%Jn}SOP z0VdH)Sc1Gp`d;(CM?MntMv8aEx(j}>iK<h_#@M)tbrh(VJOn1nq=+t}O<};cefrl; zfBqec!9Qfyr<h6Ki1lIX4OT2eh!YJ2Ty6)d5ez8X^_9)_TCa<$LpUi#`@WeQMY%qU zdn)l+dj$xV)XoodnY1G(QIs`8qgc4$=XDPYjWu=vcL87(P(Wnaw(Gr2x8hEzm2Ck; zPEsrkU5H^L=XaxM=_X}%WJtmmelOWVGv+SS`&bTU+}#29+?edxkz<w6n*iYLf>PXI z?Fs<&-SeHye@Q@`akGmwc@7;Mn<iW`vX~IUZ7z8X3@a2>W}^x~woiDuXMZ6%aK<9l zNuV&?7O0~wDo()ZN&yV8jW)U)cU^!xwN4O8;Ra1K4l-gT2KU6#I0&~piGsHku)>e& zjj@Qe#f-3^ST^j4u|#-(Ph;;<iV0-K=~BV_>0AK#2gD+#sNcGA+ep;A?F&N;>PdHJ z=-YM=WV~Jf`T4g`KTibJU;33Mln<#;Fo%dZd#R)X5z(3`vUMJfb-tPd+i5*9AoorW zON2)D59`XSI)EYq0B2dQksXrdwr7ASnjK-_<Xy|&30x!L4wDP&RGO3rggdAb3<Y0R zcw%4fY)WD@bti&ci76x|=FDi};xfr_rhY30tS!2eHy8jfSj^th8G5qQzu)8%lyxj) z0aHk?ETeCYE}Wz2^?sSnklu^GY|o;1GWKx&1cO*od<REc2=eKzX1|4@Jz?kw!ufQ$ zu;~R*G-xvX&7eU-Aq8qVLmE^WwBZGE`fk0N?!7D%LW=?+R3?;iuE^_c(2SFw?Jf$- z_DAHYyvfB%s|vGP&sUxDj?UL5+5}<XBDg4tG?Y}k5_nv2ZhW8&F_ek78W^$d!B#O_ zi|r?5fOg*HBy#}=#<EEX*n)f3BC2TssD3SCUfteTuspXELTtF-T)QDFOOma2R{RoR z9#6EO{%y{u%V%P7T(szJ!5|JZaXsS(7@DjcoF!JM)e|<mLm?1I;N84;lK_I&E-t1i z=TF0!&^l+KoVt-^TY)WEGNn9Fypv`uTSg0Ff~|`{rIN%=$Y~6LbW7Vi&%_&uAT1(p zU)`|TdT+UqYAPQHtWi%Kd)ohbqx1EKiJCq(Z4i-kVwS(FVIUr1kZAsU-#;jIPrOVx zDUzr>^pge+09KL9cENRNIJ-A=N@Gv!f_rIoVOjvVEPyvJuK<dZ3*gZi@}TM@adR@2 zaHMC$)B+A^nh=vKj6v&mf*O;Y;C8I?I;ai6`Lf}z3SwgMMIy_m*t??T9qW;YjGnwx zGC4{G2St~XCK-<hmz>SI;n^@(NYR!%0Rj@7>L?h8=c)Bo)QN;O(`XY8(r)<JeGhoT zi)<nzQWSjdZY48grVdtd_mku8DJYgn)8(Dw;yMJJWff6?7x4<Sx9gK%vs=Kbw~P&J z*+2J@m{|{3y9htsm_gvhD@DR0Zf-6_Ck=uJ`BYkrPReB^4Pa#9(Z68Pa5*uWeXphl zq>_`|W~s{lKQfV^gQNyZ=w;#^$RJ_36TH~P%ONM}U8+t)vfVvtuQWP+^7Bo5NMP1U z-qLFWB}SwhtYk)NK1dxiteudv`1KMk7h$ov%>xZ89vEn^PqIP?u=~}a^b9u1BUN@N zOWD<Mu=ueDsdmp9mepJw8gd?JWjGeBmsjhrk7j}_K&z~m1utlTtdRStS;8m04NnLM zANcC3L={ff34RGVFvush{$Ord5;9=JL~F<a$pNd@$bI&(2`(Wyz#_-u!XADn{~EaN zS6ZOx<5h(k!;PbOGGeX@L*4QCq4tRl42M!t)lmNWOk@SH4i#p5!x@0r`>h&V_~(J3 z-aRzpuqS(qA64kY*(^iW%(9-e!ER0fvt*9Y7Hn5dJSY1yG<6`$S3Idhu?p!@0fJvI z;acaax+f%T2Yg&7w9P4RXQmGo?n%FyJct3NsBDRpU{L53ZU#QUiC{_X{p{VtocAK{ z4_|A>Oaqv^CHJ0iW+)d!Wd_9O_Zk=#cZ`bQFuiZ81hE|x9>1!1hy3ab#Mth)=KVF8 zO1SX);Ck4BuroMEob23j@gxr6VYMf{rnZ&SG03w!x+8P}-U+Z?q(G=cLa-}NOmMB5 z?)}-&omm}Bl5pPekS5m!DS_`6cFAkEK{lqTsl?tf7@PgC_K?4;p(Y9Q#Qo3QRMloy zvXRc>*6dq?Bpts*+1=Fod+;Iu?PToQZlnvXP~5Y2nRScG9HMiBzHAI@)qC^6lLkDB zc3Zmr5akA@S$o!dA4Y&cPU{c9)qi}xCcq}%U)Bx{q$p?6E(Iv{wt|RGDywa((4t_& z+agK2i-gSI%cd!Kjk`184g@(7Q?A^BpzhPP=-Azw4ynpcP@$D1OqgX~I(^s8FbK-z z2g2!L9hQ8(w@I5Upk|T%o9ZqQ_xWOXf|+{ToCvbeZjHfGCsU<vg?x`b0q=&PWIZGp zU}$vUiXH*Mu6-SUyfNgv`(4c85@LP9q(uM$%o^n0;1}w*KYj&dQ(0jsEd+TC_B#ze z1ZKtKIK@QdI`y@7%Dvh#uG*{(?ou~nH=k58^a#fYux#4}aC^BH`#{xmTus{hH1qTU zI|BG5fNOysE3Qzxv<w(dRTdQh=36satpUD0;Z~Y;kKiD+!=}zkcddNSxXws*WR%k6 zP~pZPWxw)Cc{wenP)W@QF(I(mi6rC7oTs?H{vH<+QLy62($aDc0vH>O-ttby8Z|#n zM#ST7DAQQOF{p$*uYnN~GV&PSQ4Hoaq;=aExH#};9~OuM?US|INc@<6*7fB5<#&Kc zfL7{zjGp)cT}oF_w6%zem@CAWQ$zFZ%U4{>^{V3#^>zu{fp^SPyVG{@3gdxNKQ+D6 z(~t~!E&8<y9ERphE5cY;_t>BIwZ1cw%Qt-gNdVmZr*BPD)z`gwa%#_e&kGQUL&KHR zEpnTgM$2v1JNs~e{{V*l@WdcJ0Q08$?8W?-Or99#x=f`hM>V>;<{B7GW@wwhYpVh5 z?Bo>(VZ-HBoyI+b3ka(9{z5FGbo%bs7d*Xf{2Hwd<$i!tG8ux#bS@vF`?R0p544Sb z6nq)j$<Xv0IKrWo%XYRV5V!lD7jox+QQtp)1F!)1dVjgbeh`HPQa_V(hs9rfJx}qE z`i<y0uqC;FIV*^IdGnEl#;j;Qtg;7u>I7_9zI)!iz~8F_VRr*{V<>?>S}#QAT0}1> zHC<p0%;egiUIi?tFn=URrRT4N_Ike=psw=uhbMr)Y_I?@d8eVreLkHy;)!Ks)BSg# zJPiDbxLe^m;Plh&^EKS!jTqu0imHc;JKyRaoXfXHp&1W#gaij36F@yB^xnM$LD@n! z98ASsw(vrpt|<Ix{+ewDgGAvQ!6B=D0o>YEKU4^2XyF(t1~W<p%*0-glI1m>a1aWV zr1yF72fi?%*K62zHN2duycH#AtMv6N1CCWcV|}SJ;F_%}<S}FdSSD1=ehDlb!q@l! zI{~415O&b+t1bYbZ>87xz5^1W^8{mq7VW53bhKvutJ8t?-RlV^I3+Kb57Z1SLJQO! z_6ySJ|LhfwR>4YE1?Ohs%ZlsATI-~R=IKyx$Df_HC9Ib9?b2eqa<8F8=;;#^R=miy zI*b%om3uM3aFwTv@)f{m$oi><;ph$~?adPFk!bW#nT@Tx4Id^T@T{%r%t|IWO3zx$ z%aZ}6lpBVB-odGcSo(67M|yS2*<~1!`R;|`lg2=L@$T8&wso1P*8UN@>99<H>M#Nh zUJ0r=<MhJBa?+c9@Napab4Ko?{u|cV{ZonA@h%=XfGyuWEe?RbKwgW(p>$0PTwjP9 zin{S1X<P7}-yD2wh|Tb%x7}be+~!<AxD*e)79R|L2v|u&Tu^=_fx23f0N~z-hy;K2 z^Xchw27bc*=Qm4z3m?h>KTyfLuN<e!o0wKr>dI|~0cQZsx~%KZ#Zh`lbjaygkLHk% zvdMbBZGx>-|6mn&If0FF1M@czV-7dZaWrVg$Zk<UCF|E87I<~6Cm};I#8kOdY_k>( z4?$s)?Mq_kY<qW$7{fBcY*!A8lpZV`_CdeglAXg&B47fGQ9+-4vM;j}W1yF807SOa z4}bZu0Q^_~pT7s*9uA6!f!gq9Bn%=AAZFIFed@IGxO6I`kApf~TK1<z?~@t#VV9~b z>5^YQ^LBF(UD~vWGvO;^n1h6xKMt%QCfVk8Tzvb4!+52q-+bEcmEAV^4rtNIv_5tc z=GD{<YKDbr-L&mx|86d?dhA*o19cs(xQVQG2ts}EqKE+C6Vr87N{DU3ihL&Z17KUm z-z`t~?XJ=F?p|)>@G*44f*08$>xq5fM7BV?PKS0jl$%WePbw8ZTt?ahP6w0rnKqHH zn6h4wY_s|lgnRp#Dm8kVqWh=lf5+Rl#<k&NoT?7jmh%svHY^1MobjD&c8hsIQ7~M~ z;->IL;i9w*UrpPQbJ~Db_MG0Lf3KDNJw`!C7oTwOad&cB)@5Cv*=VS^=*S%1?^|!c zA6~X?U4GCXe||IMoRaL`ddIcXOTv3~*cB-Noo^CVqWKt}<oYmwt~YJ<gLm)b#Izbs z(f2TZOe?`{f!QtX+!je2o|(+Mi*ff2r95}gLR~7!YN6w_F;^^r;!P_yEgNLrZZRa{ z`&Wcct;Y0&CW_ld&33Y_Xu6(k+h3mk@cjDdw=B!1SAX~EcjTMW>_*UnkWCx5(=}+d z1Wv4mx+qnHl94rsw-*>M0<>-(Gsoc32M)^RFz7ag#s$la1&%tC===as+i(ydKYELH zz<>m^d*8$P(l%anfiC)<Tr)0g8z{NY0VT~ByaFi6I$#4$Lj&Oc^8J0g7K4P6>$EXe zsgY*b<`u3YeFjGZgc~L^=Qwre?P(Rfj(U&*5j7Ff;vcnkqJUNg%l2vgg!@l-u(>;7 z-3oXAozU^bH7^_6Te__hm`>k4eF1*=tZhk8kq|TD(R_%94lb?0a>dMOWw1&c#D6*r zyJZ`abG(~6G>B6CODn^GXVK#o%@~c;{XK7yg@P_)5BJe@d3veiUg5oMk(YqHK#MsP ztwFXMAR9^1pV83U#<Xgznwqx=EwkxffqVr%y;L1E+Smg{*5CZT)eo3?-sJ<dd^-R2 ze~JG^eqR8qv>Hy@Erq=gHVt%~@agK_f-@fU%g?|ct+@I_>TAKDa|@Fa9${&ZTw&b6 zu%?MK*+bSnxnqA=GBQ4xfijaE9SYwHTmgeMCdUVBNQ3I#!SvJ<n)Cu$I@&X_8mH!x zKI5ro(5QlDTQw?Gi?LDzvEDA7S+DRKbBMUxn?wp*{{DLT`RdZLtYN@N(fEX?7gHR$ zU2~b`tOnrw>m>|V9LAKh>%!wd9#sV1NVgIj0E&D0>HHU;Re`&8L1fZ;qKq7v{Jf{T z;)Ouwt=$Du{g+tT<DGs`1llyI?!)BO2m)0T&7L$9yy}C!m3^e*@|+~dBW8~J*liMY z51o{ipY04V^GX{`mDa)<b0XbAZl)<RRMA$|cR-#~He>g8U7;~+qR((p7rbCm{x}Qk zSJw^rpMLyd`|b|}2O8M06*U4R`oW?GUbe7R!&W>5ZR#l3m%rTrB})N)4!Y^O&F-a- z-kppmSh#x5Eb?JbZu}k%HReB27mh)O_NPHOQvm}m5Wv;nw-YV&td`>}$&G`R!~6)h z?}JE3L75iE?bEg`bova`>lJ5ut5fyvkfsvc>ZZ0A(4Eh1F?6W)dZCX%FaZ9t@CT1g z`^;RRsN!_{TR7m2OjsKj3So)DWlYtKMEKrwBO%oK+V3ao6Z;&8=GX(lI!9hQKxzb1 z;$OmBhOz4;d>s1Q;hAs0R6SZuZGx6d(5M06_TV&kU^h}X$Lq}lV@zX9cwd#nS#SXC z#XiG7tpvaR;pOz(>-Gnqs&NX*ISa{Zt<t!!X3r}40~(b1O;yof;H#&lva;~y<wsqg zN-=or$~!q*(>`t_w}yj2TVaA@Sr;x_(Vk=YoDIm_f$HWoU9+4$YZ3+-g-y+e<AHY5 zY#X8(>Q;C(kwT9Va>|VefZnjB@CZM*>hBB1PTo!)^?2_#soCvV=zq`(Z7;VcgW&gn zxL&@;rNNF4Pc^hA=fz=4J9j2hhyyHo;1nA0IOu|>@*?k9A>h)!>h-0%!B#j7a)GLe zZ17@jxFfkQIplubL>Fwu4a1bZ)3YS|BlFoICKli#H&#K3yobbtb4dP+INQN%Msg}= z57Uq1wE7U8oI(~@zL(Pqg6pm9vco?9h4*gIZvEtTe3-`(HT)RW4GgtE%C|dydINs^ z;rB7}Rbzq{!#oCDi2>_9njq6CzM1qeYy@{B;682lxbZ0eAH%#5pITo56+qp=jR>+a zfK9^$rw^$RV{@`d-B{dOAF1@vf6MZlG^ZiTCvp8kYh7Pa2B(I{6XBQp7QONnsD+5` zquX#-P#hwjT3t_UErtm2-XNebwlEgz8Uhe2{9(Y!H0>w9;OOGhf1oLT#8vU~^t)Ob zkj`q1;o6{OEBx9u+;e|tq>%lhpZyMaAJ-Xr0Qf%9F?RCZsg&190(6b*RER59hPr@O zUSW%Qs9Z@v48LCCuod8??PWft-Tpzt7zVO*TDM9)sw%~Sl2sR0{j<)lQI-sgx?ngy zNZUr_PA7#(ml$rY#M-S3yKN9{>)zB5a<@T}o$o&5Vb0Foyn1FmclwDLqXZ}RieVrz z&J+XAuJ@R+Hgf8b?LMlAj32=HX|p;3Bu108U2hr#=r#0t?pOe8ON>4gA|e2*QsgBj zVgj#jj>=*_YQfH-n=%wLFtdpiy|2LiZjP(EhR77_r_Vn(h|$NY#D}6G4QcSPrZ~vc zJj+tYm8#^!`l)-FY@5)_yZm={nwmV=1j@$Y^f{T=I~@ao3Nh4J$7qs0w}C4q2T84G zF?@g*Z0LzCjZZnowjToyF&h)<>?r9qDqdGx;n7Ed5uD*}#)7u7k;E}<j8FgOQ@Q@b zHDA?m9mX^<e#A=iSXpWH<rN6?zOX}N&<4mI_NS`${j@oixpPncfk*n|j-JMW=6l%( zPo7h<-KlPTaJ#o|-D_zWV|*Y_?RnZXq|1FGjn4F@$gNtqu75PB^&z9*XC*T^9m-pi z`KyMnfP+)K6Rc|H7y%;H;)%+3x@V~c@(TmN7b-E5J_<yFBLw1|RmJ2G4e@GIH|>L? zq6sAcxX8;@2MhM_;rRVgv_mcLkFL<WX#)+&Z`n!fyCWA{dOoI<d30&$K{{oF?LyOB zVFDinVwk3obPwQnejxxDTX7=6FWer(B+mA7CT6uB&!UF!7glm}+b>5YiK!5-<^+|T z8LycIm(!_`$Cb)O{!!=&3f?NCL^qibGYZu@Ka#pBDU7A|QOFj)o^NCu6!de7oc3zk zj$84UYIzm<@c8oXTnWZ<(E<<_Kb{yE0WVT=Zen+xn4NOF$Fl7xj=f{r*;E|~VI7vO zHqDzOCx#nTWKl4OP4C0C8Vp75iC32#GJnXi1QQ@DthmbXjS}9xcB=qL*eTT^psFWj zD7mr{>zi!yM{I8#jEfc?=OkvSI35iwO((>qJH~<yvYqQjkQJ(F1m=_c{ZR$_%PnDI z3wzmdH&I|kBhOkz!UTcE)Mu@eql#5NV6~H#&KNp&jM!5mO>D}(CqhKLthnhI6VEfT z(7QP+o9HB?jIH8nb2j;aP`C0G)pwDXV~#b5E?z7S9sn%73FKCsB+54|VaX9=zg|{x zcxW|=w*~T9^{P<E0(OsFGc^)Cn7|PdhyXgFS-@<}a3g#^L9bV~_icLa<B>l~aC%oZ zPx<7I!<~0Hos?z`U>7Eb9=ZMsg|SeZ<Y5UQ&iD{NTA_L8Z|)`lA&!!DyKF!EWYW=x zRLRsCMNM<UZZb89vq$fv{y$3ZUXX{qn}o|^K~9cD!v;~T3T%K^$O2M#V`8WhQ2VSk zcE8zI2kvkspoDd5zoP^iW4G(N;7-nfd!x_4J>f^Z6|JyR(MX<7P}$zD!_Ia`T7;!e zN(WA9+ip49RS$>WRm`M2T%1kaoHFQ5K1E$MB}*7KCFn(aIyz+*wksJ&&A`f_weCd+ zxdID>4=K$-k`}CbBS!ZLqXYGskL=A}yH77?IN>Z1Cjk~wLh+t<X#-TTE==pKb(xQ3 zGuTyu@I_k9;rHL+cY^d<R+8j41p!WCqiiHV3n!@c^4q`qg1^LnyuHYcPiUa^B&%KY zkGR@ED<*VHT*AP#!$B1A`g9XI%|2HIBjV(i<l)tX1-;g=tRvkkAQzmTKI8U$H|!F> z54r`zXLh&u&4F~{JQpWdh)($S7#@;r!Q}C@W!TJm*M5ykB%HbYG1;CS-`PMAW?}*} zW3xJ{^s0c!MjM1)0N4Eq6*Ray1ZG%PlwtqH+^0PEJ4FB{IWKrAs33>P*Dt`o{Qv&? zAJ!(qpoPrc0RD<pg^#=k-p8jC+`4$<Fu<OG$5MYJ`1}awSdyg`oRC@)r<e0@|IeTP z*WdrmAB#@eP_$30+cd4DuOrW6R}PQ>gB1oTVG16)v+f~b0YtKdCu@@f)!TcAfdL9` zybg2yQE~8aXw1>n5FY-QJ`hI&i$F%f-hzsXAr)n;TP6jA*e~h?BdleD$xQ%~4YJ|I zQ5`GU-+lQ4=pSmW-UMwSt@Y-(+~`-o^Yn|y808hS1taYEICYN*@%!O~LA7{qIuyOq ziD_y8$(O$n0N=e-(P_L4fCbV<b~3!*2@$<*R5_q*{e>r2*0Iy|mfXNG9!&|x)Xkbe z0lu+h7mR6*&1fIBXn2wZN;;q^xmk;C$|fFe#L5okwL-IER~v@?av>HW;5i^IS-_$i zPB=`C=-t8V>aNNhKghT)&Hsm|U*TIR4zauWMyjH3a$SJ)73ASgoW%ymrXuS`2$N2D z8ry2`K>?zNwdJ|~^Bo;Aa^Rmg{bPCVI@dfyhP{8cs{jQ8sFBUi`&^Tj7=uPee{ame z>9bs|&y+tJin>L?yq<7ft23>%ars5&eyZG!SVWXKlptlFea4)AVzxUGx0YhwD3;}N zIulqH@M~dfyfB6Dty&l$1X8agCh!9LeD$i%CJpxT)9*fgm+D1d7Sj8vTtS<Fmf}RS zc*6)Vb)6jby4|My33P{n7_2hDm3=y~KQQy5D1ZFbe|TN-+TOERy^pPqH^L;mtcE*g z?8JBTzCH-HgMo&@s^YkQ0hkok13KXV2`}5zcQ1&7ZDo)&lA6qmgQl}Xxvna*W__ZE zK6>COq^x<tZKZYegW!<U<&<*DuiH-!EYf|d2MTW_!olibzn@+JSBr4rt<`T(Q{&1j z6I)SZFI&S_g5TU-w^f{=nAR{T1N6>D=y9h~;Qdjebo01Q@`z)$dm6hJkRbdToc3Wd zyW^_F?MuST_AsH^^8Gm&Xz06exZ>_7E^k$+y4fSa!m(_hzr*Qv1q@m?^BDX>0F(M7 z{M`xJvZ6xRcG8a%Gnkkp0<tkoE}Oh~xXChc_2u&?I86NpoWB2k30KXuEwL2HIAj|p z7HtEOSZ0|`D_E>iBRPT4*kK@%YwT*b$d7Vpmn+-*hSM*Gn)ov(rWMAfn$GCm9mgMV z0|QW%M0q&R;z-uwDPSw3sp;U6u;m<rfzC`mIX0$gp<8V_oY?1KfkWTu(E9Ut&(9%? zL&0taXCDIn0IZl0wuUVV;doE!A4I&A?hE4E`CLj6GPk9yl|PA+0u^N?d@hTG0bzze zr0dMaIX62AaWCekCfpRB>|ov;WGGn$Uaq29qwwr}WE1pF-6yqA{QCtU$61!Ogo7`- zr9D3O-!#A*X_QWfh8=dAm&duRVY7Nrv(~+&qz<k#Si!VbCiSD_S7+pc_p++2Z`bD% z?Kq3^I+Sxr6vKYxfgYv61rUC{$N2JafX24r#H1100L3>H5j8lGtlM+YjN#RRy4oVb z1QLb06V^K3f<Ps3xM&Km8rs>e_l?Qk#AU;pvrIS&r^$sOc~_4#2#5bEt<4xPq_y{= zjz?B}W|wkLF1XwK&&z1jMzX^wfVmha@52(E!C_)SpEI&{1S%2HLo0G%GOA$+5m%r( z4gQx8O=0&u*8OXOlYY_P`;G!EL>s4Dj6`eqZE;Vy;0gGnFpHsyD!YNf%jJycK1rhc ztoJ?^tx96>Yck`9EF@5!%%ajyn4|#$_t~qY>xJ<Fztri2!^ME8S2Spy+U9Xe-pd2J z=Lp+-3;IbmXdiLUXVNMsQ;gtCWX4-=7}i;2ZXc5lySGdXeAiv2KXezF;0T5JN2bH8 zlRC<q?rf`dUD(+NXrT(fRaXdCpuA8KwFQvYv!Ru?b;H-^94nCd56L~687C|Xw4YPl zY>NUW`TQy%ECHOM-_33hb2i>bOzNMP*gxtUGd6{4h~al5{~o0MgKXCNc%bPh@=mK; z6lT8&!JA|gBo9WQ@dS;Wz2QKD&(zCzCg*5&3=PxVTctyrgQVMS1vXx*fbm+giQ&Yu z(SYzQeS{1R2BEEB)BpYN8p9nin~oVOUgUz;Zcxu|AYNA2x^bb{jP2)UF2rH{){Owe zWg&05)k)h_YftXf#N>8pIQe8rWYggJ@oQaN%}3{vVZ@Lws+hH-bH|v5KyvEpryz^# zFI>LVyF#u`P8x7@h1<$8Zv=gyPM^y+xu0}CRF-}TMjSX1><1pFoA8hh2^#LEO*foh zoE*$_Y4AHl2ySp|sv$)r(z@lx+o}StH-MchP@(N*L(w!37Ayd21KLT@pbESc2Z6Uu zPS4tcPUt{e0Yam=9jlgUFwRj875qs*#+A;ZAf^Yf(+osL=0o(tfH*lpP`Yu>B;SZ> zt^7glX`T6Ae_{2yaQ{i)3c*SGWwC@eDu|9<$eq%P>BM)WmG+V_sU4!AS$C;G=aKW% zqFS!CU^~<2R{*wdSc<xZ(iEz0OH$MzC;%G%jw@Qo*26;fT9|517$YVzT+|>crYKv1 zmx~w}&P3bkhn1gMsgF*(ok1uN5kt9knqz0~jkV&WRCRN)SV`Y!a)=#y`ChQ0=Xu>R zk76bYwl;O{hgHrYhL2O;kv8>7xpeToicLfO^ch#e!~&+xQ&-DlI0y-V=0wVDhppho z?vW0Vcbj`Zu!u6fCf79Xb6GC1@^S@m#d+E8AVJx*8N4|~iPy(38OAV6T~+a2Dohqw zxkXLR6sir@1yF&gv9)FlT!mT&v>z_tKmDiYqy!q=Zy>(%MHU3yP9LdbLNTyf<0EeB z>7a=v5t`}rlzXob!rV(DMP}~)az2_wV_u#+*)*zkzG@x3>I!Qg=EMew*o%vf{wCWh zXbM?t&qV;*26{M1c?slq#d&Y$9kPPSxT4=94st9%EUGVe&sto<<@QPj5NeJMr7n@^ z+djNIuefZyDFC!<3#Wc}feD~iT#YsT{M`wx!xl=v|MV|`X9IaBag)KW!5<RsG{+;A ztxum1=VChMH|!!I%=v(Zvm0qsG!Q7K*>a4yw9&uMX$pMsRLstFyz=GKSzpi|$4m9V zy!t&157Qk%*Vr_)wV{0wfW3|l#BAQDH%0lN`wXKw+!6q6)`mNh5xGNtI2*2+VV3an zFyDjx@aIYkM5j>H#4USmPp3#&URxrS#JZS573vvnCkrv&R1K~#KYqd@5Cs{V^hulc zTF<beK6<<((CpTjU{OCTaA0JtL^v>3oj#<<0Zc1cfXka^UEU3aaGV7^N?m0LR#YZl znYK?a?H!LUaBX>s?3DoZ1;g}BoQ9a5Mc6_qsd3My4KO*8(@Ju;X-<W8z%^#!3PAyn z(JCG!3?jYvySj`eB={i4(4pHywqLwno=*&eXY<3PgQlwcz0s**SmX??&0zX_e0her zcXlPG$o`(uF98fT&{4r=J>jQr0^Z#`EU;DkMb*@lA4wpJ2Ec_5qo#Ji|A70Dtaz$- z+q`V|m>I-#5i)o^YAo<80FMkj{C_N6u*qqIY+uj6yD8KKl@lxPhfm}Lew~t1o&eG` zF6kC03V^n?5MI(p&KR|ezGMH{?rXYF{br28@y2!?V27JSMS;TBtTV&*sqi42FJE6? z?}gC#_x0tj-EcJ~o$+kRo0$anc1VhT;Oe7aOXz<Y08K!$zduA3za$ghiH*d>i@>3< zM&?8;AzD06pr0ywCb+DhK5zB80dy5nr-va{oZ|i>z)JUp&B(ECSJM!!^omcGRj~?w z`%kK9ri{93w~M53hwu{RBcZ*+gf(XU!CPGKSlO;>cMGq>a1>ay``~g+x(Nk{59b-n z*}i>YM=Q+94aSOQ2rK9uISar^)+(UjoOpr$s12scXWEoV_|_#SGmzmOXOi6PDt^2y zxw|9yZdLX%cbtQwL?T&(i37X{mw68Fthz!Ug#!Xmv@EWMij;BCL)Zn>d{M0&vgl2o zex7bsGl%J_RIdK3AD-{Ulp)aB8J?GO0TGi<l&Gwx296mD<pqEUS(Ug625cpe*2CaV zKCqq#Wm>b-L7~FN`z$$5ol-BlY_$BbHr{?Nx1uCs)KCYmy<QB&Ec^T?ap|qPand^D zO=rLp#B#*<86@~{f)Im|^9j^oTwMXC&)bdex)-K{N+X8B?`Vp4c`X_fxO_}=e)Qos zgBMeY8pvXfuI@S-C%=K}{qp(qwRDndw(bZ5-hL>{U7R3g8WTuN+L=?{lfD*tsG5(m zD0R>|$}G#KWh)xmwjhaY6*}lO=w_fwV+pCdVTXtN&Jc2_muHwNplc3`%$M-A(Vd{I z$R6){m{u|jooM84G=#Z42Ey6SL!rgXJFE6=5V0dTG^*YRxI8_*{G7bDNBhiS$IQ^{ z{WUWNA84wL@lkv43rY&CY5>Z53qYMXV<p@Pu6X_)-+O7sQ0kDXFIb<R{_6SV?-)MQ z+=4?ir)&^7h((|k?n-6P*OlQKX*URL%LUst27M3&wBqai2J*vE$mUrW>F4BIr6EG$ z6#09fD5AGBfK}lk<#~D9Dv?%%Fabg$W#=-adrq=>_A+{u-QBvuCQgRXFHE-aD43Ev z=Zs$iKhBlNXb$Z?au$tE=|^>>LX_yxk#^D;PMKCIq*yX>%Uo62;q5>Dn=Og)n@2*+ z@a^g8ufBf$zlm!YIwwxg(|y(zmk^K$nnrag(4Nn89@Kn0ayeI>axd2}5GfLw)J`oC z^9WSkWthNRW3+B!VhYl3!wF~stso<3gSr1Kjl71{;zX0q>~xYRQR3ZG#_Hpu=xt0h z==&aVz!0h&gElG$70vX2{BQnK@#Fd1tB3iA>4VTQIA(ncT2E_zVwE%4V9r8pVKYkM z4sG_0e^m_xtY=)U#{jwf8gExG3MZDuOCKdU5`7-bT4MHF<o+u1IKPb3)Crs4^xlbb zt_*zpq{=#3U@#nO2EmAGJ_tcVuvG5{zluj=PRmv#Ye<Kw8wIDm1))#(gZNnXIrW5g zANLhKRU1gEb{FHvLM~-@qz2!xG>4b%{~nzxe;7rdgg(?9_8yF?<L+1-<Q9!R-g`#- z3=}wA2_iIm2pOpS{CZahP$h3;1Io*n|JT#se5*zdUOv|VSBw@k>+#a}aAbPGJoe@q zvsxe`EXsE^pVU=#eF<ro4zdb`Y22r+lvW3A&}`f#8n!~Vb5>y>vsDRhPOWo6`_7j& z_k1rgW_JE)$GGRvq2m>{8zsJrrar#af#gwm`~>UNH}1Z@Ovp*H6D8YsX1c(^2Oore zV7)P*41(Gwj@Ddv)-l;#G-r>CB7~06>p!#~e|K{Sh&~Ihqu^Pz^|PV#d&r&csFM|B z+roU67%*#{QPde+mFMXsy@(3Wi_h|t&Qd&@5s#i(gceWSR3(O{ch;wR3jj_8R^H!d z^bqb24hY6ZIzw(B5Ev=R@&s0bc?nNrzpaO<F)5(u7z~r69DE+X+P|HV2pR!Pn`Sud zDegWMq4~nq56P^<(r8kdwX=ck`uE!{rY?O)dW-oOPysU+@)#64Dl7$)D6x5kw0$hB z)pf`{JO>VD#%EzI<XvdO7Sa&DsA_3+c`7eyJl;=s?@-6AhS6am1JINKS$b2M#uis$ z;n@z?_bDoq5Xc|6q&oi9VS3UK<&1Qs!xw#o7Atul>1=&0<oYDnSDmvcJbG5q5K9;) z>jvyY+lFRJ5h?uOO2sXbm9Pz!Ffp}eAdsvJTGv3jGi`vzTOp5I-ONb{U*%fW)`iRd ztO`jf8%-vA{r%JK6V#n*z*wc+PX=In?Zf=YJ)7eP3e#@I)NNCHpPaJxf`~IF!+AgE zqT?OWgHFPaFh7o6bnYRD7g0?Uzuv3xC{IR*)y+@x1$b?}aXdN+V}TH8GPAipqVD}U zZI8Y=*=4AxiTCH%x$zY;Gq}B7s;6x>RV*xj@%D;g8Jt+S3IUJ?U6ghuYnn!E&>3`| zI{{%#-G|M>7T@6YuKo>IUc#L%nt<a$*?4evvtY<t&w8VhWN>O>&18^i=s1Z6Ln*iq z_pr$}1Wvw>&e+@Z!~|^X_6gT(Y575{`;=up8?8p!uA;w^U*SrA5E^3uyWL(FvfLTQ zU0-Fh!aRoh7<sC|6LvN*L6|(~amJG=Znqm}xV@IH;B-{Q=a^vMp{$sz2*uAEuMOdD zJXo&UoWKN8H-9h=8?*2Lh$L>_B3)UofNUbbcE9Cr34sW0ji*mX=%ok2LJv+3GOP-W zspE4Gir(3K+he05g?hBBrM!2sE#;-3K7aYV;Hmu$+8$v=;VxYp?gY48m~YVUaZj(S zsiBuqFRbCf;Ds;Roqf6-nGfPRw(i>mX}MPzAaP|2?Emrpc7V0Qu}Ebz2b}M`;M6IL zVL_V}Tf5NZ+VL*}Ln<V|QBvh24r$!wNA3WYE%pUd1DIh;lTCye!cuB9uqA4t?h+GO z5`nw(j?%WRH?FFrLShpqZNiO?c?~{ju1r<kG5Y2xtysgaPj~~ib+66^q#QC6@1mme zS%7nUZ6#(T>^3s{Jxhx+sR<xNFck7xtHDD>VmV^lvP;ay7~H;rNE+ahUBqFM;#iRT z-vGJVxj<}!9D12mH!Qj}*7(l_s|I;Mp|ta!2OebtC}pMA)|hh}<Q0ZUzEe37YAU#* z%P19nkekMH%LTWhi+uf_?#myqH)0zQ3GMfg;4ndI+N=K2(IkIZTFOs>J}3V9+v|_| zI4a6%cA|N{m{&TVZ<l@Was=P*BE#nZk7N=0Y<Ih}??oCNB$L@LV+57Lf>p0PoNFXT zDG9|~Z134pOdDyP=nA^tF$VX|zMO>ON}an1#ZtkcT-EnoRRHYdPRs!5{j|PnbOn%R z)+@r>2pg&s8x6N%!M1)923~G%EZfsx{Odpd{f|XAjvM+$U<C;SHcgG<Q5?LNrXBmf zqc473?(Ql|<#ff{+x7X@bP~O%rS-uM8}<UazC3N`ik`~tF^STHA33&Yr41;(a>dk9 z84t-ixp^$x1+FMH+k}g_s{yhccytVLn^@v(F~f)QyV2;=5;N|`w7VJ=fjhgVB}h&N z<s%yHfu}A1y2#JGGzVl`e>TM9>0-uM&sS$}^8m6Zod2)%yT8TFuw8!m&GKJX{8$PW zw{m-PA`r_)!sV(15Z&>n<LdbPwd)PJX<S2&n=vpN{Sor_!FM+n?SacDrGUU7@iM%9 z<4<qN6W}4*Wy@-*ax)iEbz4uT=k-26lJWis-i{=^)7S3-^77N^#f<>=W)X2@qaX+c zBW7zK*uM-Lk8Tt!F;_F?Eua|X-VtO4jG3}Dn%bkIkGTG@;*X4Vy}8PE*?z)hgQ~Hz z8Ov6++bBgO_uKkwKz?|Y)|Tz{_kZ>OetW_8^`*Tme)En!;8AL{pF5{t)UeT<ztT|y z9#@oN%yo7!r0qH-KDtz9NpQof-ZkBAX0-+g?AlTuP&TY`od@p>)E-VuZa(Mur?1~F z3SjyEiZ{yJ#TZ1g@dmX1F*Ypq(JPeqYAhht4H_AJY|4=axPjd`szl-``m(VZvCyi; z7|MV2mzyti-d<bz{(QzW&bThcNJxQYyZ2Wra5JFz|8i0N5pMPdZ2wRFr=mZ|XT`nP zn(zH49rWSDLL5_6e@Ji$<PT#ZcU@pwgIf}_$!8a%-9wE)#@smsqIxUF0%FTB=GGhB zkc94(mFv$Ze7?MO5C_>TjxSlsrG(5m*uGESo%n8WVAD(S;Z4t+N2yz)g*0p5m$RXA zk5Lkn)7_l0;}R}ILnYqxC+fUDMjs|XFreZ`YbNLA*Vlh+zyFQi2!>5X^_Ze?ifR3A zyZ*PU)O&H*_5K1-Tfp11s(H!O*%~0yU-M%d?H7NIwnv|O)f*Z)+z3-{hVEf{$h{?z zNb%j65hNmlrbTJoufz*)H`lPfS@q@Vpa0^8mr5N%PgsYDjdYO_6_`aXUzd_+7^kww z86m=*){^ZICoeL<ZJ(4ghYm``(k13eney&nV1N_531}bE6zxTWp{|yHRx2Fk^{=-x z{;~aj<4x};+5oL=U@ZegbP4zDVk%G=5m>JPsJ=XTfEl2GYqN&t_Y`dZAkTVtFsb*N z2iQh24~Qqv+hf*a12#9IMae9*tqh?vz#;`V3`}*5nRGz8Lf)2tCR&R=$|N_gYHiUV zO?Zx|K!ZbLo<j}b+0)akOEom}rYQsPLn%4N9@Rp^3kq9oTJPP&9EKb(KPFm*gE=P+ zy=Y|7G2+ph{-0n!YH6pf$|4Iz?9|us(sdxgT*I?L7z9-(zDi7?VURl0wo18imrc2U z==9}B#LXWhHa?G@H`&C)*c9*jNJIMBrxDb35Tzt05E}!$Liak*40g4FNK~_`pRwIU zXOSJt=?QP;>K2N|Kpwp2$Rf4Em0TbkZ6Y(Qwws^$oB+@?A&-w$6?sENOq}-~V||HN z-pMpN>1CxO4od6`+}ufE`p-|7CSbeY3HT&f)Zlv4e3|<^lchzQha9?4aKK7ov%*YH za^#Km+S?u{ayiKVWMm~EJEu-?7MOlKvDAheF(qxPD5xWuyZ{wybu~VjF0E%a*Q3@B zTyVa@*?0B1JS~8Hy;3mxqKrDV+kM?AnzL|MVhE(}8d;BVn^W&?npBo)S<f|t&P#zX zniB#k;jloOj2nHwJ>W+2`F2Njz@S2$7v=45{_^(`1?&wtK@BKX6Zv8RVGUR6B_>ON zK#epIudu`-2!Y`D7O0fkT=3KEH{gGAc3TkPX(;P}N&{f#-Ft7)a%Y)h!q44KFgjy` z3g+$FJ06EJl~~M`-K*xj9yoyQ(@Fs3)9J^1nitUeD_o0}rFRITrz}l(L#(*FcoNf+ z1<>W@;3Oo{oC9R+oU@lO#H65MCJU+yM^;)tZC|eU*W%&wBTB}^rf>h$Od8;1Z|&OW zmG3`BHu;3I65JZZ?l&fAGZ9u^By3#>WRm1Kb~ZQu$S2?F103}O<ZV(A`oZCXhlp%v z)es|<;8QhYM5X|F6Jo-q_nduBGg`#U<=Ws@;X(Rz0<e8L$E3tnK6}tI;rb?OZBqtm zWC0D>m|p{K5cJvglO!tKUs%k+;lgBKegGnUP<v+JBR+<%5boAr0Fx~1#-A^UVP#d~ z{%1CQlQi85&d2O83Bw|CIsZW4{Y$jce*dGMYUFV$Ae@~FGl)UF^@7aI)4<fHOOW=H z_9vDwni%+~=H$Lx$-zmhQh+%-jLycSw0j*{SU`y{6XEWVa>;jSWoRrjz^-4QDu7j$ zi@th5W%hbj)N;`=<wq*8-B`P}ICmhm9^ySmyAmbSH}035f=7HPq<x|;@bID6Mb26} zs~?T8Oxy0;n<Q_I^jFEkdXM}O@B*Y>B6uv2@_dKE)Zk4R6_uq4aR3dP)86brbm>rU z=c;{pDelredN;aer%ViNW<wczf#qy(VT&L*&ad9d(Yl`!nZ&z4Kh@~SF+5vud|FY> zSl}We&4Q=qVH;336;n@seer4!HIz>%a5Q&>1ys6<7EaM@W^4r4(DX;6kG(f~bqL@k zd=wa9T5B<VS%je}w_svQuiiSNS6%ozdU4HF>$$!D1%Q8gE~*|@heRAHDuG3bb;acx zBplwk4by<(DPj9a_x70G%&Rzx!cd^dd4be>8hu^(3*Ov6;EglDOElqW*AP-ydy>k_ zeNgE<kLjAn8p0T^l>l1IriQ8;7?mB(tJ_SLJodsJEKohkg4MC0MR=m!{DvgS%#&g2 zp+?h|GlPhj07VnsBJ(j2pR{vT?T~B?sDDR-Z{?ea{QJ)+75B7Ybat3Pum<czkSbX2 z)=h-{y*~x*jJIEorxSA`U=SNcVs~sme_8GAM65Mp-KXuVzJY<VsE@hOp;(BvXZJqJ zmPBr%4YlA9Y8ft)mnxJADkhdgmkiJ=lw1L~R%x0UXB<p+^9kL~M8~BOh<IB|-Qzad z&FQ=Vr5~YG&>YA5)HGpd+W5A^Kh9wACvYFS&F;rGQ2JqYzN?wSRO%Z6A`6`E27r`x zlP6VWx?BnBZ5n2?C)fQ@d-m-K{-=H3qp2N9pg#HpgSPXRGqBwNp+*ib>n6Fk+t>>x zaAzXs5TztnfLsTu?!*9x%dY}Xob*EEwg(t$o0PT(@;f$$0_Li2U1rD~Zg5LT55$y^ z0&OC-0tESby|qx(dMNU4mOdT3ay<Lf{VlpWfkC|RKDi;cf;jDhhiR4yoFt5M`n#sR z`1aK1DXyIs`oxUY&cbB7t&%0AN!|U6d<M7wOraQ)pco|Zu<@P)C9zyKpp@2(`Q+Bj zZ}OTjrj6`}iJb=fEv2&YL6u;vBup%J54MdDPa0QSsemDJf(xH}jpKl^hL3DGIPVG| zhOxQ1jWn4F9$ue*TlgN9y10ZaiXfYq2G5*#dY>_IDpmSBGIL3rd=n<XxrQ@sr-<h( zCWZ07_<Ik0rl&#CeOjaS5*`tR&6lsZC52Ri)uiF5%xs1~i`hIbVSFNy)!fu3##`6~ zu{iFf6pJ_xzdhe?#V1$yM63l8m_zuyB<0A7oY*LY$vBm^i#j0yZp%iSvfz`j>Y_3$ z&{2|kaWLfJ1!~ylDIX->i-z_BuZ+81l$MG{01Iv8g-V}I#(A6a!ktiHPAnQ?0|&G% z_w;&l)4?{?;Z2pE$qrEZZ*>`c&veoh9AzsGRbX4T@2<7M1^j8ljReLjB<bbNFf8!7 z2l{yT`G<ERcb~8oeRgrTcjc(`NVSw|8MMxNy*8~6<JTNa;a6cGtu`6E2fVV9M2Jb- zTaO8i0`==<y)<lcS*|2^;+l7WF_U}Y4`!|@yNGPJ{ZqtLK*0hrfK~;yE0dpZT)V~? zYct^(YcGbyv4I>4W8%&3c|)3;6u8|YGIoC&&=zBQtVa;+OzpX`H_*TiHBbvNo67dp zgNP2p3D4xBfG)H&?RkUj?0D*zBc<N<mmD&8bg`}vGz?CZ?Y^{PVJV@!F<oA7@a&a# zwk!+_j08&Xsya}TUb2#~0kjlx&H2~55<^AXw;#@5S6nVHcrmCtm_clM%+?OxiVj_B z>!+yO$O%p?s3jhV{B~Y|Tkxx{1~wC>n3cr~*wz#7N@_6KK7ns;kraE2oRFLx>cr^+ zWfPy)Ecy=vx9k&cV`j`WUV>t#8(=qqmg?>VZw@1saO>0B*Sz_IvZ+%p$??lBr=zc? zAE4uF5oT*Zh%k*rn6!h}J44yY*QCp-&b)T&Gg%qtz6cMY0YQ}DQ1chrP9T8p&v!Bp z_ahPaKALQHTN%IZGKO!si+R{Y2*7I%z9ZTyqKrP3rh<DZ!6d+GUHDuZ3bf`VC|0px z=k1ivEcJ!Urn}FP_5ng98V13XZ7}Z!^0Bo<Bj~b2Uw7(EdF|XzvT&71)vfFzI?8h2 zDet{st}xj0vE&1}zNUDkkNMWg!`S9Nv;x3=*B~D*V&@)XmI6`4G;}L53lPs*zJ9vh z-hO;8;J8p!Y7QkE?%|Ioa^CHoT$A1hA^Ie}LA06^sxEOo3|R<cS%n2llh-Ryemt8l zU$?hs8@%*nWkxt~Uc3>@xIPBy7&5MG5yal?xSjXo8{>)F3l?Bml~Jznj(XRf>4$v@ zc?VBAPygdK)$Zu!cxRvK)gZX@(y%93UMGWzZ2K4kN>C>lFKC0Z?>Ul>$N+azG*8J5 z1IoSC@uIh<6+b`U;U)$p_-$6e%pGZ-NbHBnPZR}$8yKNG5>3%6%*q-B=1yZ|;@Gyd zoN=!J^pl)VUed4ECG5t>#EL32H!p%vPAAaJ&lkizZ0n8(4!|`%%;N&mRa6M%FPBOJ zQSq7%kWpgTEViIdHFf%vt&E&X1L1?2GMh1c+q7IykqBhu3TOHadGSR)!Kp!o$ObfU z=S&}eQge_<jhR{M$?b=kzAOMfZ$$x~>y!7GE)6ZFKQ?amxpG)ktvkMlt8o<&?Vs2T z29-s;8BS1?4gPw1t)7KDfaQXhv_Wz~+3E^#j@gRimVwnFpiQ*r+=rfYoRd)H5Cp{T zER5EOG}ODk*FO4aAvrkxzm(X}4wB38P?|cxa(cR=+=cp3c^F!Cr?s1Y!NN?lyZJ2N z0b2G5hndQfL(frzx2ZeyuF|l5S+85^GXb(T*>f8ko{D+(PmW}nId^$!Z2IOTuAO(x zVg}_!DGN^Wwt%z&E8n(aS_Id>2@`bMni+3j|JwiNC*7wLqlzaIyNR_4yCayal*67u zp&<4=O~=ru!ne!D7XnDxpej8zB^)?0p?9V!!SRpF#Ll*mu;S)JE@<0|^Bq>t)FQ0c zRcouDx`u;F%A$OT9=004x5OwD7E^}AFklKGU4GDSd2Q7A((UQ9Y(Gs0>v2*NC$9}< zA2WOO)$N*5%XV4r9u_D>mZq}y%RSmu8!0*HwEesk=*y|NZ5Jx;w5Ts%|N49U)9Mzo z0wn^sgvhq-(-kn+PCYX$66v8x11mWnEq@Jx_Nd<=W!s{-6~K$_z7JsE=eF1|bM1_% zkJr(&8!X`N$9uR`D;1F8CTWr&w`K}<lu#kYVbIYI@av_auz8p7ST<%&APVnSm~7xp zm3UhU-9cio?oBeYoBEBm_cm2hK-S|-r{D21{$s@g#cC@IWFiX)MCbKtmC+^U#M`Gx zKvv@Ko@0b6vry1>7<l=|%Uc0F033G}+DdB4HvU|W$mJ%BYh4^BW89vlu9x7JPB#V! zw<`d9BYcngvfYF<fI;J9{KDjL)#<Yz@oPXZV-@J^gOW>YcaM&>LWLF3L@y>cVBYN` z7|=HuoTvjfeNb_nw;+|6ik7#ns3jz#5HVbxaef}%fQWf!yAu_ywJY0psCY=p1T--1 zRRWL;w$8Gx^zF9c6RtXBtF|pCn1|um3FPkNWGH87cCqviSG*OI#SL&V=z5|n9PZ_1 zBiE6;08D&>gCa_ZE9b>aMox~FoWfXAz5A8vja-aBzp%3_9qxWQtfJGSC(2_t$^o)y z_+T;*hPlYLU0aTh^0Je=$C%m?c!z@P0U#R>Vx%G|25bcA_0<iqTZMqaq!O2C8jOLE zF=J<+8H*vyK&KeMJyR$GQy8JsCM+Jg6#?q&a%L@pMYQJZbPx%=2`=hFd^s13uCl&} z!N_=};xA|>TjVYVgEm~Q<WSsd5Lm<dl!*Zr^5Ql4v`gE^ToIJ^JdfcDGkDPSPyx}S ziHr|FSbJ#d|A`cJ>aX?ujwukq^?WUd;dy-kn(@(W+YWpUvB%xg7D&u_fGzMuF<pHF zE0m3uUd10NYUxA}m!j_00#RZ302D%LOC$~3vPRaSIY3ImFe&W{h$*LA(Z-<^L=`7& z=hj>43JMzWS`8w?S!Os}#p0}>FmxN&H!rI-S)RNGds1d1c4TDM?b*noVy;dkWCi7} z6l!7%EZKLV+j|D|pJPmoe-%cT!qwZImlY@q(g&xDU2Ja?JA8Z_8%oKY?Bjs(wqCAi zgr%^7ZGoFo_?vsXOP!Cf>^GjlqRvh^oAufl9!WVt*MMOJLe@$xjOu`}=+EE1s!C16 z#bCJxfw*jUYd9Bd%hOAkpd{<IEktmF$VnO$qM~fIr;9c|KDjLG;(U7g*X{RcVq&6R z``F;%A0NhZlJ(l%3kpnO#P0??2d~&3ORGQAl-ffh7$S`7l@@F<7H3j!|Kb-L?>7HF zgin#+qXJki=eljrt&y%qF?hR${*V_hS$cMbjqP@Y9L?`BXCv2;gJA^)T*CU9BSovl zlR?NL_PWKtJDDmVY_$qDKv5Kn-i)jG(+dFbs%C(@ZDC2fh;SY+WtauQv-2=4EFmB# zJZ*d_)A148C4iA^a&N#zlvJXZB_KEH1fjvINL|rraJhfX9DWa=?g_oF3rxM-IdFU& z?6_w}KM!M^&V9`WHxEuKWc#FV70c%zmgm3>R|tfy>99<MLPaC^9lSmQL+0To*KH$* zEXO;o$0Yl6THTYxrGy2gK+SI#VP%uEsk#<nb2V^t6s`^RRNNqtDE0hKfT=)a719QT zAFJ$?$L?9F!i4gNA8v0&Ejmfggl<=p%R{qwPN1fI#fBQ&kp{TPdpp?hXKAM&oTi@E zX!wqLl|?@qp)sW!95+XZSlqJl>9UF4GYX5yMXvh!Fa90=AOBFp<^s$M+(ex~t|;nT z+Q;urESk(#jw2CwdxyS>NL{g#0<NtXwn(=%rl*0qU7r@z?Fl!9kt$P8wrYxdhCiF> z{{n-Hd<URNNm%rtY3~uPuG)To6_n~QcGz&9jY-~pP#J}3S!e4RdF_%Shd{{(>A<pm zVSj$r9s}%vm#aV&R(w-p&0$~D`RhXy9Dr=AB5Era7F5?12PN(WY@dJl8~*iw1N`OR z-N~bZ0*Ka{)NJizDBULPT*BDIB&pK}t6Uj!*4*c2_eOxB71Qu7hePits$c@OmksOJ z-@Z^QaB>o^1}4-nhjX~0i6y-e1UjLiy^4Wo3mGy+%Ah;a7fbAh>$Z6~8Eb<F=Rk=; zYd|k<oTl%<2HZLe35q3pnG^*G`smSJRWo@fk$*(vKe~Qo%UjC^Y0#eCu}v&9n=3Wr zZ396NIu;R;O6tl(Q|$%qY5VKH^`HI%H{VN474|_64@9<w|5Bty47g;^w%BCxkzP@G z(Xd%>e!8(j(V%@KlfoC?TF}B9a9N_~Z4#q?9Ihooaf<Syc41=zgGu?iQZ!ad@75xS z0Ge7q3saN0(=C_{v=etx=aB^?72L{>Of?~q$SQo71<l4p(?v$_T84O#?T`E=N-B=Y z^YeYkW4!EsEH&wdqDH3;Z&gdoQO?Lyew1G~`w7~9zBz|EP+I^Y(cy3rIx5d5uK*H{ z47ku%z-t6--v<r*?la=TrcjW_5E@bvU}e&>su)C6;U_6SwVzcCsKNI_sctb;aoi@v zB9)<VR%NL%+)0;I^>d1_$oI>R0Qb89iWce5*7jM(!{kH+j0SRn=j<N_!Ijog(34uv z>ga=cYitJ+>OcT!&*?4pH5es_xVt^1GPBpPvGHZe>_zmxT_Nk&r~9*49nCNR^(U2f z_1Dk;sDheNM2y15E=UL|60*)3V91868#&Y~)`ek8;X%VQb=cD7#9}Z3?;F!AgYQ8x z2LU9GmlkH@8yVECRR_%BXgSn__Ev&bs6e1B0&HIM`-<)qnxud;#oe3MC$bI6r|)CC z2ngP_TWCiP<UP_4D)?-p58dX&{B3&tjUVJ}>^LAZAGC$i--J!Ua^4`glj7^?ukQc! zx5=*PKk*J$z3R6p%i(aBwm1g2f|z}xh8VG6+X%PffEUoxsWR+S*te0<wS9z*arn&% zshLo5C|J#y)vFeDbJ?E0zN+2Y(dMAXQYc(O<kq4D4{AB5)i()_#tg(FuueN?2c6JL z*LY=38{Wf$PE;iR(r)Pm$a?TZz!*aBIL>rt!_h19odwE6Tfq3wB}Pd*7iZZPfqT6_ z%U|MO{VV^UuOV-$4r4g0x>sFv_T=<2hKRDlj=~GQf<NKTNqAVH=3$g3bsC)@LrO3P z<D|Tkgk{xRpoS;_TQRPh^2!T6y?s;CcUpf3RHLocVq7AJ%fvkk0}x1PZ`{$S&P541 zT>84zDQ<BO`aY%>pEl}q${l3zeek(H;xpu)6;1EQ9RaavsLat8vCq^yPWCy-1$JW; zBGg3`vR>OCvHe&7+l4z{A!iyXYlP;?$?P{-CYGiNarl%P%s?z~`?hEnW((Y0?NFt1 zjM>^<9;jP0_V>DdzT#C#)3%aT1srGwen$17ZXEt)JjUPd^i(h^L$9?Y9CjG_$pj~u z>1L3a3INhbbE32e6_D-2pF&XAh~7GG5kuZ5CQLUle22H$P)c>Ry3c<#jhK|#%J3LK znWUT2N-DwxV20mO6tb4`EL*j1TIMMQzH7LVhdL*f6L9ZSMniJ0-Uajwpo!{EAy?le z=wlGyzNE(R-4_B5(k*Y!XyaIrx`i4*hVp!Q8D#wFvj@DP#(<`p$^a{24ZO=%&FR1w zw6X+CJfu!2*l9SET+=evSrbxYA5GwOGP(UwGeZx*rJW!CQLVrI`eisCJjiasX-((H zSK=`AziV8<?d|W^>#2BNV&t$3wwuD?q-Urs>I`wGnm~^S5l7RFXb_RK??vbNF*DT{ zowU^x`WGxNr~Bz=Ej-+P;v(AMl>uvBn{_DvUAtBC)H_EL&@EPtAYgNt`JO*fHk$iP z&loH)=5qN#HI~L@hDs_vcaMFbYfb}nd}j#F_UGXmFzB~G{N`^|Bh7LD(0XHJNrbwP z#F!mItp>%5e$vtzA~B`zR6LKr4gy<5DoNz6x5=S>%@k^B%t<5cGkK?<dmE6v9qymt z=<9+Kb9lJhHiC%-q8606PGj$<E5;YY5c4>9M|?Fj%8{#*xhCPDqVA0&2AgJg$-^MS zG34fZf*D6>2?GfaP7`sq4r!-?{pbFAv@PU%eeE9Qho2hvzNcB=5C=Lln+XiHTpP%Y z2A{Aypk8;68OqkI2Hnh(8rYfPF$Ky*yD=pj;JTqZ4y#Qgqd&q7dvdPBSYifyijbIr z&6tO`F}WR_dp$~2axw)PU@<KwuCG2Plma8h#lv(VNWN;`XAKbpLgYFPvD}+I#1MAT zU86Ta=kwzb9vb$0*LVN@5up?M)^?`Aql&ScnV*5A(c6uPg#p!aRdNS4Zk^AUySd-$ z2D8X99Y~@7nA>hM>v{Y|{9ox9h|fWl?IF+V`AMAV&@mCS)a<jW)NWtOu;c}>P|UC3 z4p<v60ke&9Owpqbs}NP2^w?OLFK@#bC_TPG0%eJOd@}j+Gz14gL@ZmWsi7GSj0cH6 z?=8Z2g#p|98#B2zl_a;LP15SaRyfP$buF1%6<;>s<|W1Sjw)%mdyvZWWB-!&(c2UB z9CBRl+@kbH$la=Y_GS#M>Hn2kWtUZU_NVvsRYE=nhHMw$r#5mKr8LUyh#FuFVTgfQ zhuqj(jK6>duf#|H#gJKy$DtiQIzer1oqFIY_k(QO44{HlYK6}H+BK@KNq8BZMSr{t z4fB|o53a>>-Z%Y&WGim7m4aE2%wg3#ENr)w93(5XNhEY2oCkS~b>|w|!@Ye0$v5s} zp3^p*BE8$6nhhXX7rz~gr{s`O$D>GNI7=U^jgvf`zW)7NYN9Qj#Uy;{V?13B+zywe z-owoq*2-}4;iSq?Pm3sH-zS9SL}cAfVo19wqUKdB#f$mi1$MMzukS(O5qvyFJRvX< zh(5kQD^uFzJZ3|gl{jASgK_RCBsq5{TD`g?-fup|Mg#M^t;4hxB<wBZz<E2}?NrdG z;_a|VzS{Us!NwQnr@Jb_Sv%(JP9f~#&~v-zC<k&F{N?-8SK#m8`j{RD*8!He6PXhN z9X#41%Sp9?45D*rXS19OO5^2AbR&eRh2emcQHs#W{hD8%CaY;t2;)WJQH#)FmgXU% z9_#rr-1UJhZ%}6c&~B_V1u9&-<4-11#wuN<ZzU#HPO;Ov<IN-c=e(fgJ)q>obvfP8 z`sUostxvNUn=gIk;V2ivRxT)NqBa`J`;$`xbb$~S<v`49Q!U%I9~ufHVNSFz*f233 zySsRbn8@YCFB+rt7Otuj$e{DPW~nh|%l7W*q5MlD6;L*=$Ml3g$ar`9n*06q4g$3l zTJm8KCId(=5d<-|<=us9$~m=}J3tb-dW`61fa@-|*&~JT6aS7@>D%`0Iu|h4dmj!& zT}C^&!pt+r#=y6AF~TObXyobrlVwGakj%28=AB93@GD&Oe(OJB34y9f3Q`QtoGx8` zI%TjH%tc6^HeG+Z>aazK!HiIIVj<;Cil-8wVp!>*JF>);!WO3PJRE$TprRBeAp0uP zq|G=)#SW?2J^*9yO(*~gPL1;~O<x}tXw#T7<|J1dr)2x6kLvJ>AF^T1QKz2&(hzkP zLDb_uw_ZeNAjxpSOd=cZq=FO0Gyvnh$Y6-Z&Nk|LEe5=P`**)>U7;#sUL*8t^3#Wv zEp#32YV%TY2a#+5<2!9I2%|=XOy5b_3_=@91%#mBh1Cr6$jV-m293Wv&dU5+hh=;A zqBwGkBfHv0LhmEDXY@&n8Vy1iXja%9y!@qi)2uV0!c~iuxQB@WERLYzo>P?Otx@0P zcI1*c6f6!9)Y8;rTEhc1jA?sytV_02W9mY}%<%3F;d+&O>g$Y3{fAF&-1e^NohjxE zH26)i`pIH9bC}a=#v$tR)3cL8WWAu`jT+R05wPJk_C|Py_~|0;722<o-i?ghOEUfw zuxz1jSI!wZqxUo_u5dgz`~nwaaO=xHYGfV;3O-aK#=A7U`-6q=OAK;kNQaNQv1m87 z@uSLuTnJEIZ5VF!qImm+tH%t*A^PM)Ka<JO*z~5**Xorru5fNYo-J#X8_40&z4ijS zo92j5f)HGdA>tajsL5K$7v<WkTtkI3Z>!*5UP5Hb3q6&FhGwyb_Ua0Clhb-S<M~z` zmv37^XR}#q{d{*^i@R&%UtLh{zt8p>B{I-6dIDID9;*Gs2CyFr+SbeKJ<6^=os9e! z+K8iPo$D*<!0+#4?>vHR_t=>fsJh6C7}DlBPTlGJ^hI9YZY>V)aliHJ-Pmz6G>7Yz z&3Dl$Pnlg}zM$wq$LJ5cja0*gA*Z_wfMwLg9IcZMyT;w&VgmW~Z_3|1n+E*30q{@l z#dg7U0n=&wKm5h^KRiWgU(~^#HY_1#MAzJnK=<|Ozx`jA|A2pb2YqwzeGuNa=fSiR zMw-RIMLs7yM#GMf^@B$6$ns|{swdQP0P)5NL`DdjO%D+>!sNUlz1@kNjhrq&eBCbJ z)%#B`cYP1~@}6sZ_}d7XD=g?8iJ17LW;PHJ65irt?(Qt7vqHs0G%*tz6cC<U#s+DZ z-)xt^{+l0N!DiQX<@%dn^MCv~X0PYRUAKSp^@4x<?~AFvm>bx{fDqyy_`#Wo`nLVo z_}}5LpV=aRnZ|ND0V3AA$IZta{`^fV7w~q^4uIk?{rmVDqa`}IXZX~T0nCl&iB2A3 zcHeQO!_W6+Rib1akpp!3;p=wBm&<hnuKqyHn{IbwXvieUM~gl?9D+0Snr1?busATV zN(J|;h?QWtJYAMQglDVwTmz7480sKb6#C=;{NF8KzvxfNYA(W;&sf$vO~iG>>*ZJ1 z|LLcyp6opyq{R#YWW(><iLCzocYnS8_;)X4$1~$yVimIk-c<{RLTo!F!0N&s3KsTm zi}4=UL1!oI?*A73?EGWbp{47<hV$^cddImd-@a&AQDxP$ef=u9J+1t!3);O4*kqP6 zvmJx{<1ki#Xu~B?;sn&RdV<p$Dbnq?DMeMCm<^Jk4Ku`|*8m0lpYh)blc+N}v7F1_ z;c`FnIrVM(`ycIhB}_*s1GGr%bX_+PlMQ<Xyy16uT(39utDxIbWdR)_Me#1Are$IG zSUO+6`?*7t*-X*FMVj9c3ynZZkfd5e`X%afIX|WsQqE0UrRr`N5c%oLS@%ATZC}1_ z4lVo%r!Na-8<j|)V*ak_a@@OFl(4HPWGieCT?ua98G(`cxG1WN8Jqv^%Qsc(scf40 z1x>=qm<R!-xT{0|@%e}AJ++xwm*v~vLF+#ChmE~n`9<&1k0uN~_Z~|)`^%DJ$n6C` zt}vfGGkc9Og1@748)Qxm1aoiv>-zmaa!&b3hi2IOyoQOrH_-*OGa-9*1qYLqca2Da z!8gI`)SWI6yypT2vqD^nmh<@nG-})1zr?m>c1kQ8TWKBzjlOHm*w~keYwIfXD||}< zmg$g+SyDTw7p!(G8cf!}M03klOr?4+ca6#4R9c)3vm2_`-GC?ueEFLw$%Ce8hyc2| zkIz1$jOz426z*RfqnHOjrEiCzJo-GtR9tuUtNO==8{t<iVYde9BM8XJl!Be$7N}-> zJj3BLm~xANM9hQrAGC~AFv_Pht^kU(<yTKUrP93S2)yA@@wm&n;T_=gdcI)&@^&p$ zJBUlEJGgvDxW5z&cq9y|+z#9#bq4H&V(>;vY;eh8A$J?IxSK|Wo&}DR8${EyKrGsa zvHt7gG1yp=qp1e%1|WIvACQm)+f=L@yX>N~!2_C-1VXtKt9#ezp>N%XXb>Yt^7c$~ zzz#t;Zxl1inEbt>E}n3S!y2~gAqsR00FW5I2w;_0zw^Jsc_|SdQ8wlI&SHEtM|TJG zovr|Ip=h`C<`fxUK5bv28@*kP0w?zl?a8qg;&(D6w#jQTS~|l~BWB%<N|puEx~c*! zfS7oUUIu|l3Set`Z|Z<`eDWx;u1n?F*E?<)I<gufdOYjTcc0XxJc*uS9F{R;Lv<hc z7mv{}0UR-(S~aYDBX!zR2?I&cz?d-xyYS$A0%&2+b3KXuZ@@a5`}alNMS1dKxA)c0 z>^OHbT~>%GuziQ;<o;ehZC{z>>(f7I4KtjWRu`?aS#oVC?Bo;{`hXc5ymc@?;m}~t zQo6u|*)D_4Oa@mc@0vE|(SwwT9P4Il^-4>77x2gjq1YeNQrjhe$2+Uwr_v|JKa%oN zjKQ=@x|d~YvY$3m5-`31Hx^<@m6%<SV>>x$s2!foJGFJ95v5tT6PN2s#8}v%iY*~y zR)=W3G6#%5X&IS&bj|7Aau%11sspku`1)Mq-LG;#(T30emw)^nYBSUTI4GwIlCoTC zDByJ(B0+EpwiIc&qUPK5!!U$cG7j5ClKdMdg=Iw4iLM3_lE&}!g#fWAjQcb>{UuV= z;g1N+-A%bm94rH9;>xrNp{DmieDH^f(~Dqbk`)SGP@HH?R~0y6<q_P8VQSuIc}8PQ z#r^gy7cA~rBLoUHat?qYI{qB7>T(_I6WR^;tzY~Mpim9<&HV|Qt0Z7+TrQ{e%MInF zP1iPIJNYgAkUOQ7nOu;%DIz8osilKjecsIggd?O#CAhl~g@U~E^=5TNKp<+}SB!Ry z*!pb9;D)U>0K`A7R^&B^&JgVVP&P2h`4(ewcv)dhcQ44mXrd47!9`F!%kmj&wuJ3e z;3niO?rmXYha;R*JgYGWIfTuK;Qox?Y=TvQs76*+VbrV-!V@Kka}RA!Ix?EwDRL$T z?7l3SVOA@Pmy=*UpX;S*Z$LrTD%+D9+)C^Y(HN4=V5o)Vkz8oC=hiU*exy<Zz_LM& z94f+!ci3YdS79R*C4}vg6KM3=B7F&zc%`kn(S#O!yn+@(J^|td*h(Kh!UlZCR=^;> z2w>((Wsy!@WQtKEWB|UIESF&Eq5+mSy$dlzi#$3AO=-9fkG*gB;Y_vw<?UKo0GyW= zw*38z9YvInU@aZ_ynX5q9OAAgeEDODuN+1A3OwHk_dZI|1uNEgSTn_tWOnbJ%=YE{ z>GGNI+-A`VjSGl`)ntWO%rgQ-8fP?|P{%(d*{s>#Uzn!$M3x$k<5stc3H!@yNPt-d z*swy@vWzL$4AgaX1<P`3(4x^)u%7)S|3wFVk=9V$3S0UHDFG@FxrL!O^=@V_PjU*Q zP=JP}&-xYH6I7pn1O?ku4>AJo^8Lg8y~F&|=miJh3vPpOp)nWy{>Ka9rQN)D2iU|L zKcj(3IT0EjjQQZJxNMj2e~WStZ<@ReqMfSbV1_^y)tSXBqEqe};&)XZS?Iy3^A(ek zl>PO9r#tdel&kBXWt~cwE1+yy8S`Y?u-sNU8_aLPR7vizK_Kdi!PrV#Q+4%bszOeo z_;j@`v(cc&5B?E(r-PYw(5ZcEi@XTDyeNzs%&I@|_5P$m{TS<!t!8z4T_ItDq7o9- zD|xvaT)`Xz`3MCt6M^fDijAUNsmLWYqD~O9DdSjFl6+V|FkzO;Jk2<gd7AS|Qm05F zeXO<{2y(!e+n9ay!IhX}*Fn(TWxnb?;PT#HX>7`}k$sC2-+9k^jKNAAF4z&%V~8!x zpklHvS5fcn9N&4RW;U={Ne<vXjKy9S5s4uu+>EbNtvfOCCO@6o*PxdghCTICsmj5z z$os&t+2tD5kwMG|kXoYKXNPpK*Vg0>SKt+IF^JuIIcZ}G<!GD;lLQvol8Ty#Sr#oq zOk`ZA9hbPO(O@U|?l_Z{9sZ$hO^)yEd1z47vq!-eLfryt+hVxaIP)^O=|}r0F<zg# zmPr)fPVm>f0LG9=>bxm+q||cE_V93xb5fOX(&bH6{e7=;7uK*nc)eh^PU&bei9k>) zz_pwc%_w+v5V<iM*kVjKJo@_myKdDFv`u|^IVXSkxYF!QQhP<rfUJwW0Y(AzfQ`(F zL?TFcb)4-q!ol*g*&-^gCx66EI#E?5G!&7+5cm0b`&tBu$SUdNlT_BJ(WEI8bbv$K z<K(VU&*Hvh3q@3IMvW!{LSKg7_)ljgWdLU(wnA_kN71^U+&<;l{*-=_+?}w=fB*a6 ztqLaiO&F{SV(-QSFo5D<oMQN9$`{VksqV=-k+s}{IyxLzKQM=(mE`=xr{6sPkIL>@ zC&y(`5ylS$+tm^F0fhLUr@|1CrNDZ!E@3N|Zd^O|;X<a1cty9b3VxUa;B}=I3bc6r zY>Ext)K*af7hv`7Xzo60$C$gl)zqhF_h;bfE@vUxfP25So#5e&#L4(f)}{e}A^|rO z`is+ljei7A(o~uVcN%1b5b>Q<8PO#|JPXNM0~HSf$>&cmFI|We#T?sE0Ce97SwH>u zcTd0lmCz4A7EP6<1)7@DKB9?PX`^We|C8(YIEIfQv>>W6HUMqejlVMA2_Fx*iSw=i zz!)4Ur*(n0o8~~X7*JEj9jj2w#-tCj#y*MwU^+|PN(`(_jhl|mb6J4cAWUKtwTpXd zJaopt{J|3?k<VC#7rC%(zt7@LEyu{m_cl}Ce|%_aNPHwWh>S?iW3*@VY&m8H<w#X> zxI?f$0eCK|iUcc?_^QMpVVYR+orm<NRu8}60?us-=|_A9eU!wp5YrtnZ^#};g7R@_ z<g}eZe#Q;TU~f*VSR=I2elZ{7dJpVs;@J>z{-jiL2%hM%p=;=K*p;XgqdWiF_9j2~ z*Yj}c+YXl7^+(<S==K?cr)L8(YbiWlBP1e{L!Q3n^^H|FXc#_qG4(Urt@G_^)K+A@ zZy4>{dVMLsqq;u7W<Jh@1v*<75+B+E4+MsJ>3kSyO+z>m2o-3$s%Ju_ouHC;O?<-b z7Cmk0e91wdl2iJKTmalc_u`k;irdVTqTK<K$Aua>DvN-dn`3dL`Q-FLy1PbFcWK8* zy7i)E3NPv(Nrbw}-WkvM?xn$BuwF`&yDyGw3CkyPfvsUN@9+yg)qwYi<i7N-Kol#k zKg!_!3=asM=Y#+teJhtsQM|PZV&n)PDdMDJ26Emb4zSh_Ne|=nb?WDyKc*00$T+N# z0$drLkECI(z`_cJG)t;q4C>NuZoCL`Hu_dSpI!<9?sa9|`}X2}KxZ;+`>P%)@*Sm0 z1E>%A7>YP>xSZ1n3(4b71w=O&aQ}rk<YfCeTYbJlL2G;a`SV3_Ere!l#_l4ZP)j-i z^_$c#g=Jo#6ZgZ3Jj}H1fqFNZayeSqwA@bm_I%9)Cp=u%%|VL9(S%P5x7D~Zbb>B? z_l=Gab{uIMcZu-MG8B}#c}oEJbirDSX!Mh5QtI`ZP2g^soIaf|cvgVCa60NIc+{`r zkjwPpYTnr+*QM2D$<PN?LYD}G&FCx^^Q>af?96544{TsE52J2_UV=Ylc)eKbBcQVB z0Ar0I$!xXe{)5SKSua<>uT^*2M0mCUwr@%YmQJuHW_9xN{B6NC&D(Mfqc@TuggCHV zE*EW7Uh<wW>@sX0lQ7A5Lh%?*HViU+ckh_ikfCzA{H5{FxN7&V%bJ6|Pq|A!UZ<V` ztqL%_5RIO(x4{=lk4f4StWbj1?A07nuR%@jR{sK*HEzTm5#RvV>6gHp$>5OT4dg~* zuG^1hG}MgLX$Cg+zWbA$zyI~G-u&gKKfIvDUys2T(l09pNL_YnOun5vAi<gQC9}L1 zBx8psje*Y>teg7xKkn7N?L2-Q_;&v2w7}E!9vVRPK;r0p0fV(^Xxmi+35Cvxkh*bf zO1<f|vc`BUdz>*A3NsNs&`zU~%w3j8J2h>rp^V5vLt`ooweI^Q-39Fk-s~UV*fpBq z#1;a6FB_y~E@XU|gh>f-34^?nMFSM)FZfv<)8ji-Kpu164C#I|k;H72ZDB^t2ECip z+Pl2bXTE&`;Pw6sY(4Vc%lsfY<*u-{cey~2*$Q3oTweP4Q1)Dkeuq0m;7$gH8P{Y+ z#kg>gllZ{F2qN%hwI!s8)KhVrXL{^B$A<>J8?S&^Rbhjy1_?nT`t(VMGwalDu-Q+; zVFCyVif9oS?qcL!JkN5-YB~GXA}lw21GN1t<y(1tzvL<dEV7P4<W?hh0kL`6U?Dsw zs7B8xQrSF-`s1pmooUB=muAi!#>{Ve2U%HQ)5+=?gM8QlRI<Nw9qk_m$r(47+AlNE zl3fS`!Bm@Z7}rqmGe*l+GRq_(!d9Xm;d`Mty4E2opq<?UQ{w+WYk$jYOO~V!f{#*W z(rdt7Y6s_l4ekXOL`d%iSs*~AGzsRF<^^xVCIf~vY|_7=$^3vJ)1X1q1~Z_*G)Pbd z3RHp^DFa*(0nSMGf<4mNz*}+$){+?*V79(|`#$$X)<l&uGw#PZ`}p#;mf2&^M-2HP zrhCrN$*@(*Oa|)|j{(kEQ+9Qp3SLqsxM0yF2cYT8iPVddQUDIkFci#k+3oh1zrx)1 z*L+7NE-AN#(Cw<>##6aymMAg+tdziYo<fm)05Xs-s@Qd9M4+elF$W!Kx1CN0{JUqN z4M9@{7`q8bn{Hp^S#Vhyn}`1cEo^0e>2P&*U{S3%5r1H)zPbu9!&KI1njs3=ePA_t zYVJ*N@PU*m{1W4a3gtA-VLJ^XhmwsF=+=brs0gtTN;y#=gb=yGArn}Q)C!@Ar{`C5 zhC!L;X|_*4%mB8(W?450o4OY>rxGFD4NZdQ$P+5!VNS|vjYPhZ6S)%zPd747v5nm| zj5y1|INtiZAQ>D!SnlS|&5#*X8%zoLle4h{Pcw=Ti;(%kR3mB#{P`ym?7x1wd1!H+ zUZ1n<(_x}ymCj0`$*!ZFMc~0YhOI?lxMgwNz&2!ZlYyliD=76$DIT2_q((E?-7rM} z)+FNL|67iAr3+Rt3>$cnk3W2zfE)htU)9~Xx;Ta`!M)w5<l&m)WB`BoQNP}5$cz)P zF7@5Y0!400iCl<9^gCP5W~uqMQ=g3CtzNgRy}9ta)VpkOZ$utrAy<<{He55RwX_-7 zAmqj(fJ$m9=Pg(f{P`dM3{iY|etq#38;l*-X-<Voq01G2)%<rs&OXTrvMgZIePgG} zi!<so|G1N{#{Uy0?{1XJU?+=0BCK;}b;9zBnFS)YwMq>#<CZ6yUhT(E&lA{yZx;;% z9gQKfHDQyXfv!lq*(U%uK*+xamMiAz>NRV9r^=s6kSG1$gnU^cIQZ9;y<Sy+9ZuKP zmRzS#2PYo4%G;q}qy@>uuT>7Q<r^i$k_JKU5+PDf{NW$}{OJk!{{p|@CHQ1uV5_5t zszR&f2Zwb<d4G7GSpdj%g(y~)Sxr=nzt&OX<uE2<F_rS#icxbcj)%7{D+?>M0wKm& zZtdq^Ut`~r0=8eV0PEM=YFC|X=c<%9FFnzog2MrtzVd1>kO}iz<$Z~{RezKkt|JrM z)2_4!i%1#OIWUkKWUeYzB8FFA`)FULy&sY{-j8Pkr3eZ%S%hDe18S29f?7m<jpCoM z<#<Q_^yg0k0P|(tmT!e*zl-%f9giK4NlK@Je@sLK7P`%<J1Gk!h^~R2nt`e%A1G$I zJc-;k6w@TO9_Mg!!A(B=r|n->b#*ppQ%sR1Tv~^h=M9Bfv&q+KUSIduRTYrr`3YSv z_;y`^Ns?|tRs0srFnoQDGjykLc~tJSpd8j(QR1mAGcNe5Zq`w34oN@F8Y`QFhHN^B zAzl1NWr0|tB^I<(%gD-u?ad}&z}K>+vUGM|o}S(RH?=Q5U2w}y<HzQ8<WqQh`hXT$ zouKRD6Q<|ox369#O&URLq2hBGN<MuKa3`6Y(+#zwuJjrkW0?g%{WHLBGnqMTrsuV_ zVfqU5a5QIZx0h$#ubXS;B@#e%x%~O_zx@0KB$<MRbf>b)o+kxpEg?`;ZlKJ_b7E-H zIiY5{Vb#vH6<rd6cQn4Lrf#WF2Au+S(F6H7JD-w`lT>TwN<K~sFDcCCwfbjES>>k- z@Tz!G*s6<AB(ukvKX>Ool>`sA==TXO(~tD+l?lGi({#aXt_G?3GC34Czw@Xf5zcJ# zpcz_9bMp-#z_3o6{;DROSTzgDh&gr*0&ENpUMAN~eRG355tx*ifBfm=dYxwI*Y#eU zWgL=BQQibl3kFY_Cn6stSGTRJ8`}<e^xY`_!hRR{<$XR*{mwfg%=t)uixR8kk=Mk+ zYN2ajsF*^rtPt`dBIJao`1*AHf?a`WUlx-!ct{;XkwW`o-g&7wvB88ez2=AAF@FUN zUX>;aDGEBSH$)aU4)|)ynXpRMUeDTQZQuS0YpRliY6-&SD}0*gR}_9jn18#iSL~{r zYnRCj;LEe%0tUUPR>P?r4<{|QlMQyU$lSFLdmM@T^vZ_E*)w&DacD8xQmXQi&}aoY zX?ajhffMHKVWL9mbP*U;jIIJrHNalJ><ZIVsf#*!xSnkl)@O5&570Hy4!te6tdlqV zmO~J&R36nnJJE`{1Nnq)3eh+?O-IMRIG(|#<f5*SG!bNp4r#(G1i-YC7lMJ_BD9rU zqvil$>lgg<UkL!7fwk8BY1ASm&8%UXqr;vTvZ{qw-`=DVhjzYGC(v8ezQK*C*avX+ zFE(!B%Z%cdQikf}Kyb)7kKugv^~<vD+pYj~0hng(-CG?HVRCL${z`Kt>{zQ`(>ABt z*1fS534SMEj%|ItL>hXgU8@a@s_u`98vDcsuw*ix?&V8gf>Z3_9Z4wr-a`+>BCqze ztJ4f#F5f6g%C$Z9*4+_6<P>|}YjNu2MwL;Oz7DN$Xf^s<tbMk}s*G-2UJ|OLm;s~o z3Y}{+d|yBjiJTM)QhoI`sZquEIRx_gvWY}mvQavvl%1lE)DuL%w+g8NJexXkc@@Y9 z*eOdA2W}ISm;h80JG-Ab-PIVTY*<Qw1Jg2Zk!1)so(Yph^p!|Z61JW`w|tsr?B)jI zC)~tpdV~|W4&bToEMj7&wIBgubzKFo7ED-gX@2jdNFBN?Is8qhGN*|N_ZaZYJ%8N* zU}H(!-Q6Jy=(?<N*IGmjDq|az^is!hHO{^#j@7(wwkV;%?hTgnLYA!g&}m&gg%=g- z<ZcB0gRPU&%<wc|!nSatn+iB@b0MmL+?A_Ar-kRpM8Iw!Ofthitgp#0B8QW8+5)cj zD{Z!wrl^QGLdwfW(YcD+*%IARz8T$B3qS;o-N4}xV@&~n+@k$_K0ehtQ?U~^DB!wU zC{P@}>U9pMyzWGk-rcepjW{`A9(aGg`d;;LrG4^YT-YR}4yb1I=y46J03<_HSPQbj zEZU8u2+-9CN@NVP63~+lkIV9Oy*+uew4SGx7?v77r_s0-VB%>8lw@zHPVukE&}Bd2 zS`OOFqn*B_op@UxX71<q^<gtHr|(g<<qDqd0YfKRm6*VxgYq<pi?T}8uoYX$!f{{| zN;w5NWaG+f0N|Usdod1zx^nffyQdMM=Uv0GN@2sF-4wzTypWtw95?CK`e?@*Kca>_ zb!U`R834R4aA?BT3dn>G6D9X9CnMaAd0MLO-n&Mg`cvnAA=%Ieo3oAD83sf`vmLDi zNoUyJG{h4N%r}jKW|Z`B&oN0N6=_XBynX#F&<S8ttWH~*5gAiO1@dJh*JOT|H^Y_5 zT_s@$1DKv)UG&a0-|jPvJsCdzl$aZrA-gn!L0KRY{&-g^tu(=%I3kMxhp%EK83+Jg zt}J3;xbE`A;8_$R>W0iU?`tjM2}_Vt-N$#2q_%Bm^-EILN-`f+Fd>}u(obx!2c+wn zYt$6aTQDRjl%|fWWS?^ZlseBZzdZ??6BDl2EQ`2EEge%XW6*ZV>WGnxxXKF_zMC`Q z5~hnKudW8uAEG0A-T>2RYSt(@(+&o!ZvvUX1mCLlKw9XdM%{*cj9W^XVLok>hZY#? zQhpZZC)R5_8^h6&cuH3Mw%RBXDJhwJ$5nJ1u<(eFi_c?Sn<?O}3$w%twSlFmUwQC? z=U&H=>>Ct19o4vySCUx(H@~i)M@M%Q>Ri~c!dyOF$L`niZh6iu*JYM#nP5wi{0cU~ zoz^t*VqxA6zZDbc?C2DJm1zRpblngDvlqmHGj+odU!~rGFjbvB-I7-ZCRJxlpXV=~ z|5YfiDS~vNdNUvHsy3#lM8Dc3<<Kn_t+oY!nkh+;{rsl3Fvt00x(Hwxgj=g6iW*_W zYm?-?GCdQZ*Xy-_i={=%r%BEbJn=@F0MiJMllz_pH&09LrmA1C$cK-3{TY+`kUkgB zV8U$E)}5u?*}E8Xxx2560(;B?^Mf+Ln7G!YWh7K=PrRP}0(DzKz$VYYr!S&CW^KIF zRYVa^DTkqa&pYi%DHi*oON%7Ve2d~ZBL$z&ls=}6UEqEiH84-Cw|(y#4C>r;2G>0} zV5?mH3H$YHaBpTcDfaETh9HJabBg`$>=z?8s^Jf|R*9YgFp<m0KY#uw`72~~np<T? za2J`L@#^!|7)xFuall=$IS6XHPr$7MU>PcGQVpv+@8l5nv29m;WOBtOj9Xkru5<F! z(NAWRKV$>X(CTCich25T!I-y4*pL?DLUFYQ;HJfQj0IGTMeL3V5Wm$k;jCbC>_pCO z7arlh6<D_tS2UAI=S-gtm7wPfVGn_WcFvj@4|zi~<8c7uK_I(){*V9h|N6!0`6?3m zBNT0_$nyFBvi#FO5!du%CwQ1~xdYhX7Mm`J!o^Ol5YLr&8yyi#)1wpVD$ATN^}4Rg zY=-svgyl6uSzDNi50y@@exh!ZRBArAgv2`G;#z*wpuQ|81+g@Wqjuxf(o*gB+;U-4 zr&3{}{qbsl5EGW&VY^mYpQP7ea(~Gf^!!9~M7kiW+ffh9wOHPdjfFus{6}DkhfZau z3PTCY=RY&>u>@us6%|2_x{HEhe!7-#N>x@IsYlk7C&ACr%IjrauhIYPy6u}gvFUYs zf)tpVYF@;U6$L&e%%r{KcnnqgcZk1ANvpvpForj`<-VLN*QUduU=qw3-DJa)<*3-S zI8O5&Wj98VaLv$%Rj|z;aLuxv3?!5W8P{Eb74y@|UUD;z091+Qil2553h(~q|NR-u z^H<#%f_XPMiMRta+220>vUlk+LF%VsGDKeNXG9CDGt0B`02f4HbRi<tai0p<uQ3?+ ztq5gFzwy#>B$&+^L{)2_76WI>nUMTjel|4M%|f^}KQ_kM^<`0A<|f`3G=+F426ngJ zVAKqAl@=G&Ly+-V%^Q;t<`(&-&E?Yqywu8VS6OtEeOp(R%WbCTY5q!%l0m1PUu?5S zGEQ`h#8qGZU(*~27^}QSniSOF`fa)WFYCHGA16^-)+w&%4eHci2yOn#Pq=m3X0KVs zFtFJ-+A(&i`qi#moXYc7p|LF4&P4`Y!4(#jd{A<`lk(xhGC#Y)yvGBI2tC}eDmGg$ zC^lawubvyZXQ-sH1&kT^z1D;dhsW`|WLTOdIR(0_PV*CPSU!CF_-lvDsnW5rX$J={ z^7-XA{TF<CQ8GAIC@aWl2P<LwtB~N<PvnyHS?JrruQBa6MOWbxo-Q+^a2D9qMlFzO z?;#ck-E~jFf=t*I;@FE#Kl~0tqJ9k-Op1HxqRLy#Pr?@FMttZf;#M1tb&3R#3nP`g zx@xCdJ|@9LWL@ig_6}Exw_ug$KmF>fbGUQ|6~f7tX6zd_gnf^>B^AigWk3yYF9DxF z0x$ZP&o67)vKG#?aXc)`5Aw^}9a_0t*uY*?KF5qnDhzUsaL*6e(tHmk+KAGE7fx(8 z8m(9v^ZT{{lfzRw5}og{7pF!pAP@`jW}}>KP&lDn1>rf9opq2b2qYbUllzuaRuK@% zZgWox;9k`lhF`PrZsUvONvEfzIr@6}fRDGe+gqB~=j-dLcv0-|7)ZKQTVoy|J}ROl zpK*Dax7*LfhQ?!B5NvKEApo-**OEAnVQm&%9t1M4B{#uIL|7FDyM6h5Q+AE!e}K%0 z;6mIyxx3(&z;@QTd3%I%*v^mB4u2L`Z++V7a5&=*YL1zM%_IVp3y3N3iej=mZ1%mF zfl#h`K7KjA%OZnGe<mn0z=c_?-<D-B<0nh?kC3ckbfDivjl2Tr>0bwp*?1~KBr<(i zfBo_6O#`e>;w7<=FYwhC-8cGz-Bc#<=505Q(NmPDyD_<uJ0OyIZ3f$aAuOw9i<n&R zu+FQ1k@iZA(f}!(TwJvU1lXNna-qfLA~6eN3W%rZXsC;Z3txIKBjc)tW+pHhl(nc{ z$Tx(lI<AgYrZ_cK7-U^3ns;4jXB``1vV#t$O?C>U^Oq0F>1tM-Jj?Q}hz_lP(2fpF zEuf1$F;;T})_=Ph%LZi=k?98I%OtCVFRu_@_v|c4Xsvpa?yNdG+jobZW+crbv=FvD zgsKrNHRtT;?Wsidw5!OS+`A<C5jpAy_g)*f39DADpx)AbFk)9?RssO!#kb{N6A_!- zZXF7zX)#TL&BxKjVD#W?C35Ekfs)C@)cp7LTU7Tg>`6o}AAb55FJJ1;@YrjrGXP8< zKkVxhu&;V+Rx?gdc)HnTdY0uIKzNm+s8K9S#2bqBfF6N-$$<F4N~^d5)wyhyX@>N) z368UzL9l%Z%5*k(+{{Ld4UOSh+<mzA^j><o;)<5ME(n*Zxfeqj8Ar~GX)+kCNfW7) zDu-RX0I(^tCMu`K4H=D-oZTe6arZ)~M9okX5cP}4WN}f0hc~Q%a|lKNHd#LXmmB^m zN+hQ{t77l#8Tt4Fun|M>YVdGDCz!6Xg6a8bUY8Ya^J{#1WkA=-xkF<zz1f~2m^5gk zRzpoRbzu&1iy%cF9TKfd2VN_of=3!5_bJus5#s55N^F3yRoq&`%Qs@WnR#C$Q=sxe z9S;gVQSv^@=Jt_-O(G-;hp4rD2JKP#<M~q$`X)WCQrnK4#5Cy+6P{F6AX?rLr)~WV zS|T4h#ObY`J`#nN4}Zezo^{=;lR=D_6uPf$BFjw6_Ns+VVIEXh4Yg#t=Va>qA|wpE zF8e?*Zjwr7C{#Jz4gJupWYZM<nP=VhV}wqxMK=a$7D2>=z5=9sEo=g4Q(5N?3S-N@ zm6|<;a%WR^8p%$jn+^S!5rR%XzFG~5FgEK<Hp+&p5+(1*pz&iAM8pIDt2PKk;Mf28 zzx~_4j@pA#GI@Cw^BI2l6G0*ke8w8=3?_!UEr83mco5?)Yw^gKA#M79E;pJGl))EV zcLz1F(0UV3hr9I@@*q|<yTlx22wZ94w;PIIQa+|xWa1?%kIli*lB#EgldT=(U(vtD zq`N0H=Ic^g*^+;&Ih(?M$foI3{oDeZ+ZfX1KBKRCQn?~6{4|VTs5>t0`hTBxHv%ca zJH0`kL|&MjzAT?$kx59RPuDmmChU;;`G=4H3;S32wIHj7Hb{hJM`Eum5oG41V%YIv z(#sX<Qo97ozDyeHr*}Fij%58)+-SBF8d{%`OEX}Y04$;k5)}pM5DAq;K@L}=GQd3Q z6P?bNG9CIHDh{4E7}*#n9o!7=PI{}J7Ih~kQ90Q-<2O$bvzUo^NyRjxT~s$syRX^> z_HdMlK(Rx9yx=<f^X9~O!oC6w+6_!kpFVy1KmRiXTXCl=E-bE6PX}iS+uibs=-Us1 zc^~dy>nZlb#a!la$uNOAk+HF_+BiNfGRByg(ho~OM!HWKcNe_}4PO7&>BwuZI0hQ< z{k*s}&<rT;P$(1AN4vUf;kj|2lum_^ahw%(g-pqOE7oGAK#RnI`ZqXCI`-fqDOHl| z5!PUcu!uTDA|yy5BrNMzf5QFx51(<FU$>ZDbBx*YS*%qEPauN3w*V>ZgvbHo2G}@7 zzIYjo4Jt0Gi7}~-G2^Ic^SSUib!xK%<;^g!y6yXDMCWCKY+do}eI;E<q>Z0)2c0?r zs%f4!gP&ii2J-Y5AKfoqx7o7LY8<+>&#PlCm#s|hDbHkb#qOrvdz>#~b_7ZKBRKHK zNkF{IZ16cvU(!j`fBrCU+bVEZ(7@OTf(eCMO=<#`Wva>Kz$_?XQ0+1@_3*~<Bg#@d z>;p*YL>62QHZM$?%ngxLcZBj~3x){MFpILotc~hmtTy{cRmn)Ia?689p(?0NPFG@a zzs;H>*S+gV$_jWO&&P;by)iDmUR+vj=Ibfzl)w_Dw8d?+%qF!B&eK8!OOB_pVEy^O z7T+Dv;LHwOPWR@YLl6n)M`gIcVe|B9erc-nm{pnsAbDP`IzkTAUOPBxlvdE7;zJ-s z7I9pp0>&mgb~b|KILvw25#))ZRNLy-PaaO#dPTan&d+t7T(|D|w~u6X{@XzhJ*u1i zL=h`;yG|+H_bU{iJ#9Xe+H!{fRiZq3s<`i@rkHkogTb*e^mSg>lnXlnB>FQZ1%%At zes4|{Kd#O&a!lG|EE5A4e68cWX!gmeQuN@28S4p;H8Ec1@)ZMS<(_5DdE9Xg(NHs( zr%zgd64nYyr|~jwMS5=(Rzx2J8h9V#!e(2!DxE>xVtX3*w0trflv7FBs85HOxTM+n zfqt@$BZR|=ozvPd?{FBz%?0ZV#IdaaiTclJ%gzqM{KJozpOJ=_t~%T=UT+Ov%F#nE z=AcP{b-{I=sc4y;T6bf(!XjF2meDUF-M)w$Ij{F1K!1c$yqZ>?D<Y49#E3#{-+7!G z4xMs2w`)vTWyp08tENO7h{*CpDWoAumt${#ihH_&9SHt4Jyxb!U^=Y{%%%{P7zXaT zsxIWcoTf2G6^L&&N?D-WdR>@ATmb#{ny%XpIMa{+_>ul9E1X34@E)yDK{cWP)<xi^ zS-q$9U<Lfi_i}1>#-g4Uc41cEG3*%<^xZyMCOYVD^$6mT=w&S^fVqs4XhTL1jiW}V z{@rV@V$ts>s6)~H5ZY`vX)9%gv_4^B%;v!6+#8G*jpBh0UROkxNmyXJ+)SO|qy%!3 zXIt4O@AAa5-!&d<Q=6Y0nu!BuEH^+ezNk+Ct~mpx$n5;^5C7r6xd|(<8%lna^i^|& z1nnYhdr)=+#gl+>vq%9v0yjlbGY}5rtPwyK-x`|dg~?kb+l8lr^15~F<RH-~g6WJe zdRKsEI9lRGRBdcg5RCW{U>0{hb|(f~s7+{|WWS<$c=M4}V`GmWrI)Y(Jb~?oEss}I z1;iPm>c-ZKIymb_ujDd7%&N_l0=$ADs=$|3D{tJPz<&V#yMOzu?NS4^ifp|y9tha5 zE}TqeBVdEPlzKZ!rFGv{<IBQ;8yj;n89*y8=t~8b)2UvHB++`46ff>O_e6^`_8?`D zk{1(={DCNWsT{MY2>fGgL#b;-BGW|~bUl|b_Prgq=5ChKi%j~oo05wN;QDo@^sC{{ z7dQ?d^mxCmfNJ&XcF1ZA<|pj7uWLP@f?4<1{|3OPFPZ|5m<q7O(IQ^=<EC)hVP!hA zYVwyt*~TO4LNP7&JIIn@#=C&$S1a&<=1a(3x9GKfP_~G^BXTLjVm)Zt?uj$h+0B8R zl3{d@<)Cu>nWY>YNp`Ft*|Lp*S|`=%<aET<Mv_A!#l*~RZe%1Nz&8fjK=f{QHu*yn zfgQF=$pDJ}fOhv~HSDXJ6Gw|d4%qc?|KooLd<>CysZAw{6-yW1^i8>~!PV1zbt);H zic%>{KZ(!}P{vu&c-j~MnOd#{SWDMh`u;>#TTeo9i*8lh>2h>YKqvAmpDMmv6;r_v z0dJ0~ziY3XRi>836iS&6`7metM;qA$^<O2T3MA>l9-~Gdzhym{s6;lfsX0`|({n<J z^wk#VzGb9iZB+I8&!7HJ{~w*=c@qE^BC(;RiV2<-Q}T?@3j<Fu?WG}O)<9xJSy34) z^($A(jcziPhFOaeEq{_){|#+9!`ZhIT(6EdvV*+;t8CREtnkhPb;@w7?l?3p*~3-} zQYeA}b>*=<8^xyOR4gxxHEp;<IR#3V{)OZ<nT+F{;lw&DT?x2gW4VLM=l9j6w6PhM zDlo?S<$u27=ZkJd#zjdqrP7h2N)9aKC!w|TiDA`b+6tu_V4n6EhiDV(%rM?+%f%~R z!+l$D!Vl|*B5dWVTmvjh4)E{#hf2j&8A7cT>z1)+U@Moj?iEbS<u>hIf_1b>-mhYB z4-ug~wbC^Jz7O1j3}v*On{Ye}^)691ryA5eK$B)MZ){+iBN72jP<{Cem9CM*Tr;yV zh4i63Z_1j8X#>c0hV5J^1rAUoi1Wmg6a$E$x~7SF0!y4yNT!IQbJ-~Uiw%vZ7jL35 z5j@0co~&0oq^92&IDU`A6WXs1{Uxl1SU2a>*109=B+a<E=Ek>3VeV|rJCaSAEHgcS zWh>0?f~2IMN*#SVCMMepjioF1quytW<P4Qruz@EQQEVzZ0ix^6R8t>Pg5$~rq5xmh zZy~;Mp-sa$5w<uwOEszxTbFPJ=(d4+4xGymzZ1_?U4^8pU;~J%fox2fL!hmJqlTWG zuVKCbe6GOEq!`q${_sYW#VUVKfmJq*L>8)C$()YzvBk(I&jocP+C{BJIuz-5&2Df> zGG)P=J;#Wlo{rQt&O4lKo+k52=7q46>#`ESwn2l@XAE{GKp;Y{n3Ulp4AK=2%fgH_ zd*hAl`SNuyPc7j{U0b`{CXMj`!>`Slm?+bKi|Kh^-Bx-a6Zh>)J<yJ!$b1Kb54)lq z3h1j-uLtu{7#$Q4(uk?@-IX=mCWvXYxH$V5WD+)S41gnh&5xIcSoM!KFnpgEhF^_` z`B?yyjoa)lmj!%fSte0nld5)hb4J*~PH8a<#uV?1JYRnJ{6Ap_VA;6DAO#!16BgXs ztRNd!^EOV6$w$&yDXH~LB|U_TYG)kr^im@aVV89k?QxX+mSIL`d*Fj9@%?DZa_Z^C zAeOyEQBlyP7!1$wx~w5P^<u_qbZo<#$kOqX^DYpgnh@;*X1vm~EU)d=w}uot2{g%c zAzqtgA(0iPMHQzWln9ilOIu=!Wd`U(%coEO!+*aAyx3(ED8SgU?j7x!gt5WAjrQV4 zV*z#$n5L~xi7DJ1^?=)S7mUZm#e2aw8~qN$nkKx=u6MXDkGE%41v3DdSPNoWD!b|p zT#Oz0P}$^vItMGEW2tu1j{^9qa}6mGTj%abCb+mY;hcuV+1&s35nmUc@o8490$*Nh zQCw}El6M}*iR-2YeE9f(qgvsWlP}^^RC5NLr{%&c*K@tt8G=o0C+`RUnRt<qlKT<S zM;b^*!{{A_3}mNG+THA>5`Ll-;+({e*LB#zj8!JV81obJl|f2nK){3kh8wM|KSa_1 zL!8}M+#G7V)@-YmO4$ttOn6%4wo3mDB>H?N1F^b*;bb8F3TBcYE<fF{vl3)wMkj=G z<`2AHSr^O%cQS{s{=fc<#+}C&-lEY$6C2Ep!$oL<gO-o$awQv>QyeNP3O-Vr0EP%x z03{PI!wMULtO$%y$2ctbgPgb}9orPYn-;5)h;Z-Ynqd7sZV(3nNm2Jzj;fSeeSi%I z6(0bz%`_y!&Fj#IfNBdJd%V^z0G3629}gY)a{#aim@*w>x%}5Z{PYvm@Qi3OgQh3b z<)?qVz^|@5fL#^zJiY$9tt`)rOd?*4-@HV3$H6jv6cU~bowRCV`y<7mIS7GU(=UUB z8ST$DXqDOQu!cCbJ>h#a+-V&9TXKAcKT6d$ZlIYvF*ZDnK+V`lbb7tMNX?GU-5I_> z)OVlN{KTtdFY&n!Z1e5{SuqR}a#G?%fHFg@>7wvo;Xja?`Q{Zy&HtrOpDr%|{B_2L z=I45yWs=W;{!%sG=r;^xhB$16UJ0Ea{@4l_Gynx>I0xs}PXuB2&=z&K4&8^#o&n-c zcF@$@T_s!2S`;2Z2+v|Gq`;3u?jMOw-L=)}Bx*ffKCA*}SOxp4#M-DG=*=1`DVc<@ z5^J%eBrfJ5Nm_F_WYgJ_GAE}0`+xY~6<Qs6I<qi?Cfg?5$r#UAC+H$7pD+LUhu{96 ze|c%yE1?XG({nQgeB0cNOQ1U+=GI&X>@_@^JjAwI!DKFQNEI39?CU7gyC+SZVyXSm zyqE}8Npb7h^3xP%aIZ6_j{a@TRcc&kqTFRL=NJY`s@sfBu{6#m*L_IN#O8u&Hz?$y zPrHpE1H3uck;6BZ1y{9@a((%Kd|v+&OllsDoCLQQeBBmCT<C7k#LH^SN6~Hl(=&ef z&p(4au~+Ud98#1afU$s7TkutxnJtt)zX73`hB$(w_vlq$gkDPHGEhdyPLZ_-u~!}S zjhbSy|C@=P)VW7`KiQbLY@LT+C82p8Y9Dx0N(SYX4a<V7))lT_lS~LaEqvMSih2Gd z^VjQ32h3T;Jwxf`4pFERMAQ^Nf7@>Az-9++?LKY4tT(WT*fm0NpP<42^53xhAMo-t zt<l7Wg54`AM_90#6I_I5%$pXzer`#cKk!wn8Mg=VBbrl9B%#Km9ZS^?`5)FH(RDU| zv&rba+iYkbsorlb4-E{J>dWDS0JTaCT7pVQPplK`l}vV0re}d{18Q2_$jKG~@x=UU z6MtMUJ2w-Fjxpo~O;Jr}V}>hVv4K3OxC32Tp_`LJz!5-ZHvoiRFW7ec6F$A})vmlV zBq46JT_U2H=2(NRBWufLE;wPS)5OD$0=r^hkJ)(V(qJ1%+^)ks)}8N`@vt|G(&3Pv z(W!8pkXdHguNE4iq9>D-{TP3JXfW8=3V+R#DK>2zhCJ>LkXfK$zU)tU{qh<3rZ#EE zuIvZfK8ou0DQWPk*115|8bQUk0LR=|QuvB>H@yA~xmrn*YWv<n5cQ1WbeTcRGq5UQ z?g6!xf-c;O91tcr@9XB8)rFnxqI9cnun;;Nl)~=I4Br{``vK`mL$+$Hz+S|JjlDg< zN2B{GH-D#|@Sn7q;xG-UsCM>H#%w_<Vs=1T_{l|Yf4xCh^|Om1xI=Kz+OtVR<Zd2v zl<snKf-rV?a!dgtmj$%LvEnb&{JO&X-nuft3pgzkWWFpju$n{G0!cvmRzllzM5rEt zR@izz)zNykDZ*)(EHw=hXBOREd3spI76nxl8+9|M7LPi)YuDWkOu81ZT}s=o4dFDe zs^3yo+{nWM-b`vG+%C~s>5o6(z6jK<BUqB(fxjVja9y7$ugW+H?D)DeSXXRNNQTHQ z0%5F*U2NUEFs62nwogsMz%+lvC)f_>7Fdccm_p=MCQof%Y#l^*qR6FVyHQ-+JZ;j# zO8f3WJ-VTmgcCaT*yQ#>QXUEK5^L;8QOlcQyaY-L88`85eZkl=$(7+O1hA;tCL}-o z^*XUeLOSPd)785Pl|}TR5pIjboY%Ebc&Qf}8yoy4RY=5($bwXFbKzMZn!AQUa^KVS zs~cTs@#)NJj%GC<&QUu7&kn0W1D!I_yW^;%H{>7BW`CH$FsQb;G*7KqIVc+)oyLu= zg9<xUlbaTpjtk2)eZUs%fVeKRV5cdru!yWcXEeyY@T7F1>ohAAYEDL^l>nbVrD_om zavqPo5EfVL0eN_z^XD|GXDGEen7+O44Q}l?ke2;3gNYZKc0Gf=Mh<XKWNg@JGS<?} z%a53i-?xu+Zm8EoGJKaw=m#CmU5Q+@q@BGj-xtP(U*yHD{`vBX9g6VmNiIA9_X)ed zS!wS=>rR~fHE_F)h)XDMGzBasuFKO$(2VT~^g<`9lrV79`tuqQL09m$Tak;Dd!XHN zq6`pE)3c@o#g6!vpOY{QAg%)mCO(EIexIp9_b2S#fHEu0=2<(0qz#JNj3(eZaq3L_ zJh0Bn$msE&%S6{*1^cY(cv7v7lG^qabqVQR&7(GZHrEsb<T7f5Os?kPDkMZAil^nH zEC$TJY?swxq|FeZO1xdlNvYyc59ytor<A^W5}1Qj97ZmH@bh9D(<xbn-du=s%0~Tc z4^f-@cJXc;HMEbN3z^-W?&GY&trf7AM#Z_;%5srA758f^VMPUB{rXvXQpDnQ%`2fZ zwLhq^({{{bm@D2C4Ap9LDb~yY896pK@D~2=LEBFbTNdY(3=nU_C^$QrQ%3fB@!~%` z$W)Tc*X8DRPar+ng-!<m8MQ-ad(Q$sY&D!tp}M!Xx536g<6anR)hr#o^<N9bvQRVl z{vyPsIJoUSB4HR53EW;<&n)APFHsGhVj9R#_(mD*4uxTz_x+Q8RlrwUlPD-K(Jm6r zsiBBqD1;WQ0J-&*G9v>B!~7fu_HF(fuWIi-2XT;3fJ7RF^ZQ?>c-#z5%e{ip_}wS- zX}Aql7h@i8!{PFcJP&%sQ>1A6F3@dLf%Z<n)SR=L%Q>RvsUhdp38t2s^cna~$-_Qb z;n<8{CioVP?QVtQPhe`?PwwkAf-MX1niVNG&&$s1j!2!%$){cYtra^fK&bgS7q_Y* z-s*cBarEUG#QcV{>C+qJk6I3KH~&AJ4LmY%QnKr`frNP>rERy4;8uZ*cIHqxPINtT zGL(gjop$k3ynT6Isvm~A1FpK}9L}SK;m|;`2skHIQR~!6EzN;#2LcGv-uf%rW8n-+ zu>E&3Ey_=1wcxFidVANE*tJDXm2rNE+i?|6)^E(u4F6-RD#hlZ(cWRFHm_n`SOvDL zt|_E$2~eF$y%(}D9ex&`p_%KM7n)+9*Vg7yR8h0WQ%kVhOdL!sJr5{I0qJhXPtUq4 zJV0yT+winFt+B^;V*NdLS?fa&Ey-C@%{$Iz8g(0^y~atv&|!a$OcJ(!x_DSWYnpa$ zhPv>b*dY@fo9=Y@vVOS#a{yx<LzMDlHdHM%U@v&}!JcZGgY5wqD4a}a-+{@YlUwG@ z_E(Yv^6B|?`wG?(y=)d&{qbUax)n3(;PFn(cC*to*t?HYbSz@(jBe@Fnc>JF2sz>1 z%63cNCXzf1uVU=TWe`tEcGyIAEx|GmN1{c<zxT;B>~M&C@7xCaRr2SuC`4TsnRwlF z(uld)W>E-WyaQ}fQ}?{MxPU%>`g|*ZH2J_<DU;EAm0!OFIL!3*d?SKnFU`17O5gl_ zn~{n>jz*WxYQcVXIUf3-v-hs)Oi5!D$(ac%-fdGRY3EXD`N-Ehz@8ifEXCR{X?1fj z>?F)KSo<~1ub7tDdO-*NmH(v{a^X~PQb<(tdcWej=G{&JMTT*c)`nS<pSIYooa56{ z(d$%*9Bjov_MLZPpmP-nYQE)7=G?=FHItU@dxa^tX-6}IBn~=K@zv+4Y((uF!P;In zvAXw(AKeZO#Zy*xK5(VmO|JnEunGvgtP1z*<S^*IHR5_5q<M<+7+!V`)Ba_ZO-Qxv z`LWiv^2QtAmwtvj1pM#>nP|A+4exIZT26tt83vVi@zKffjxXOc;Nn#kEVHe<HX`Iw zmO`eOI@MiJj1U{Gm)exbI|zbdz{J+1y9Q8KT7)tbfItj36P{K!&4w?=q{Xc-tw}TG zuX#i|0KIOm6Xcdhf?7LH3njQSx4s`D8XhJEQyA%$+N|H;VE_I`w3@wE>(VS}=-%O` zwC2C7YphgBT@dE_<(^$;s^&httUD|pxQ~WcK4JtR(#SArV%cQATmvo5lf%W!Hl`jI zWrI%OWpAWRGV;!op(C$fuokE>O%&OD!CJnqRqt8j{77#|DH<Q+yV$3}OzRu;u1m3O zey19GTMQc-mgD`m!0*`T{p24Tl*1TH*}%(8v%%Gvt4R#|(BRN<bXKqF<QWrBD)RYh z`4WVGki+JV&g#RZ!hkZ;EK4g%tn(NNMWhL4VSbIN78}UjL6`-X7wSVqa^a->?E}*M zeLST7Xxf`6Chzkd)c&qA=05bhZNm~!<nRA5C!l%xTN~%Y=kS{s3ctfZti*h@^1Cy< zqO!Fz3!y}v(dD8qWm%I~QkX!Mxu}6F>o%pwK^MIiLF1HZUIbx)X|g>49Og6y(v5ju zJ28u~^*N(_wiEe51Swb6Lp6T((VGVEfKTb9CqRFOQQ+0|))3|0SX{`2t>Yvx13cxr zYUh8B8nxpMq49t;oT?8=cojJG`Xeqcj6Fe*4G0_2K3QJb$RK94F4cOx!{x#3lDT?t zz+_S^*b-C<w^~~l9p<l5xf=W9nO+4&xvflPe-Kv#Z7LRM^afy#Hz4%x=5VT`4Gg=G z-a6~Q*GqPdKm}aZsK+9n&JER9vmyE2Ji6kO0hYQb0R(k&z5aZ;Vl?zL_+44yWTd|1 zrllW2ZdrzVBnAazfgSd$kPo=J0yIB;e7VBlx*iDb<$5`p@RZROv!=bRQ$j`Jpl~MQ zn#Y=aCa12re$O&ivRfN{bXRQNik>!BkI<WwgW|rE9VU_)!$7W*rKTZ*dy1VE8z1M# z@qx-l=FYO*X?@X^=CF&S{1SQ(;9JyDJ9Q9;FgP3`HCPd?TDRr%M*ugaW%-eQ&?|Bh zMOJhb_V|*i&9iqMhZ7AtM1c_PTm^f@VQ6fZ-m!|c80D<P4)h&rZc6m{N_@PABjVbh z+8eFQj;%D>eGQD7Y71(_HRAB`W)TwK!n@Sr`fBr>;znPB0&@0b^BtXo*bjh(NleUx zN01dt3=5wwm!D>(zp5?Ek4wbV<Q}iQb$&cz<>InmRhQa|P37?U_qd1)g{Zk5`58O$ zZ3Mjii{H(ND=1gZD^Kz9cb>2!wwK-Eu2?k<W!!zd@~ui7+8H}{M&<l`xnfO8jj!{9 zbqg0NnXs4f$+6`&CYcwQLN#dHEIS%)ix`Oa<mtz!&okut@;WaI0WW!6WC4Qj^b(x` zLL9)tq!Cua<c(aVT9OfH7$tpgbaiYr3s<!GzPDSkvIR0I_^^QVdutuyDG^kHgUq!k zyxZ34JLn#+0x&OFH*z@k2>=!pPvIa^a9$~GHy!&U@Pv7JQurooj5s8}b<`eOMBPt6 zK7E7&U+EdlzQO|AVtLv(ZI}vw_x-hgNSKFPj&;P8dV<B>RO$WG#O|9lQC2oX<-8q* zQ#3NR-dng*4R48TD^>!>RPSKJ(`l@#xTn)mI&NaNY_*|q)z<<OM(HZeERH&al~Vsm z;-Us8?b~ndSeQ=>{5L>&T20sGs}dQQWcl$*YYH-~QHo$E*Gm5{<#|RjNv%YB&R#o2 zGfl!l{yXc(JE!;llI~aWZtduO>!_lc!(3@oT3yhOo*T^{)R@?Kl9`|~r?az~?y_-h z>up84%$TJKSA(v)k__;0Mj=_QUP-=bk5pTK5yAFV6(Z03y4kj8YR~-R=g?R@K#y&l zOpuPFIZMMF2F$4Z)WvkRHi*<k*#4fQ&O0W87tKnyI)fd@=)d{yQ&o8{B*X;hNv8m# z>`^roq+}M%@?pmH)n9juo>42V%<y$KEhmX8S0zwpu%Qha3P{TPvFYi47#8Sms&LGo ze%?J{nMHp5FQARsANE;gn8yb`ZzEc3Oh+t2O1irSosFZPGEBeUXW)>nbuYmw*6-CU zm3lh!+iheq@8gOS1HiuQLT<XB{rL_)XO)cr{P0J7)0eMqT_qMK(_0@KQ{J&Vu--Tr zGRmaNu;Pf<X=S|_R;#%J>l|*J0C@V0<+||q5ELrk$xd5;?<r%AmlYwhE$;^OI|%}Q z=uyc#iU2vC4K>KSp+~nN`Rzu-y8mEcmAlBaVMLdAwZm-3Wu71(gm5*$-54J3?*qZ9 zVyO3TQ@Mo<PEKT<(@ZJn7{!#xa;AYPGNv(o{s%E#|MmJFCfkGIFbSt>8pQ^>gds8- zC#+w>cb=&J;1{aa&Dzb^)|Yx)vC1eUD@nrNKV%JTrb7EY`p?D#+X22qZ_D)Y2jCwB z*bM9rx|q7E&opnhy4%t}#<)w~h;$?>qrja0wrsVK@sTVV0Gj}^&zihc7{K$7m*uKI zU-$M-zIl__*&05}3Ulu~1-zSLP=BpCz5l8jZ_r_wUhTp<3*>Ir;oL@%9oyv8?)VL6 z72SayjUY8_;Oi@Yd%1jg_NUiW@-JZCCYU~j_huNFh1}cF+}Jut_44CbKhZ^og}6gp zR#V@ndEymjE8WP=%}wN0aoc_KGkNc$L3vkI5ew2kd6dd{^c`(%)B&Qur;j@jA<(}U z$G2)6^ElN^`rp?#vYj3TBXm>mQeznWb$k6f(@UH|3ll456|>v2mh>ZGVvsr)Z|*#~ z4aQ7tKFab(!kpa};$^khr%6I_4Gpo2F}8X8_UmnBCOsb3A-t$JTs^p}H(XI(n^<#m zxqGO?Gi<*5zxN*><`~Cjc_?#68xuc!Wq#*z)8B~Ip`&_yFvGCxDr~M`T9}~5AW_9@ zWi&CBQ9E)kb|WE9dKUZ+BTuALF96xT1{;VX;m}o$^~=Zgi>|~FsEu+N^ac@q<KD~< z2@IWlHTAPyGu~Fe?>>Cr!qWHF-2wXl%lER5*knOI8S6(^6=-_Nx@z;E<>3=CoMVhA zvbs<<=t4}uOuj}P6N}U+EgRNFL~(`8;pRB6D`3DTcGa7u4S7@VomS&_-p+Xi@0r1E z$L0>>i~&sdG=TS?tap{|gA4X(^hn<wS-xjWa!SU>ACl1tBg2W`Fay46)Lo@3<dQE^ z)HJ~vSa#x^SkfY(i!3i#6(kIq;A*5+qH}d6xMSbLn47gg-&cW}NPvAd^d)aT%^a+U zgdjZrT3%Y)y$m{1GI6g%{r&AmPn7sRqV~K0;iCvAJqoGbhG8asP!EulcW85X_$7I0 z|3`d;LY+f-H7Wpk{=kHpusBxjM4nZg<r`=<)>o2e1AN~Sm<Vjp6$ga`KOhTJs|(RX zbmb5Gv4k1^waokf?(=k5efNjRMAd(_1g*b!?%y9eY~;pgB@lJ_FJz)_WlklE4$don z<e}^i?Td)R@%$9%mnuy<IcLf-Xa~o<628G1rq|0?0b^4rH?tCpc)*SYeZLc9T<_FF zY7LwoSU;`DF2G+A!`Q$34jk&2apyF#Pyxx&DKr1xe+r$r{3v{&Z?Xk+9U<`1399u+ zdu&`eK<FOU)3#3lDVE9i8o5C_2XHDdOgn*CREwdK`*l$-dx)AiSi7>h0|yTggte^f z1`NFh&4&h}8`}E$v;V#O@J=L7mEF$|Yytlc0uG;!#kDa}hL8<#XIp2U{@K*Ij0b2Q zvcgJkL8N&wlR7!!i4CwwO@K>S{fpE*cr5$Yu#PLE1RzrJ%Ibmz3SBXcN5^;F8_Zm( zphx?U;k+g8_YXP!`_5AGvkvBDzB0y%z4ICz8^Pn{k|_1D?8^&_QjBbttW&TVQy*j4 z5r@KQ4}>{Wih$?pkjN0(AT+rUn}l}DpRiynRzAVhF@{0H_77HW&l*ezgK(Ik7vAdF zFH*~aJkX%WXGf#4S5rm({%fl9Yrk&*>v+iST1t9fHOxmBs{<`%9M1LI*3y54!w|v1 z3L&mlyme2tSolMBkV7(SiWViNotPZO797kXpj~!z0M|=1qV)J{Ww_T~wK&YV(iE9O zPEOrjQzwKS0!nRQLgN^??L-ty?*?K29ZQ&y+W7(*kHgD{Nc*F6KnO#6!^2h)RUpRJ zZpR!SCgD>v1Fe`Dw&`NfA>090@JvqTK0%0OnlqPDR*74dhzWbx&H0su8N6``#&f`{ zLwEUhBaWg{$7^;h4!ugtdNhQ_y#@gILrx&+-`#P$x8|koNe8?wD>L<+ob#_T{CCHW zh=PNd&zdVc&Q=S(wwigPxK;@<XW2=_5O4O?jEE(SZ!Vbf#n~BH3B(+s(qfWM7zUxK zKrSYd5nhz)28*Ahg~^djGl99}hp2+?-Si1#QgF9Ce&W6VhjzZX``x3Xzazt@{S60* zsQ)xzzORw*+eW{iYD#?#2&c;k&R?$qRq0I~dNCHF&d9DrYQ<@4>Fh?5Z0_)>Zf?@h zkZG(2@Ulo2nowq*F$u-18>v#&2PA%Vs}`md(*O8<spluPs~g=b>h9>Bh^c?JbuF2J zKOCQ_kB*-d%lNyd8aV9_%{prjqE->#@f_Reb7)xXuB&B!+&T_ANDHnhbL4iyh)C0w zb1h#h2&7zM`(UL|%zH7|9ebuqnH#Xfl1a+#DC)JN8D&#xG{VACHd&tG%vG5Lre+x4 z(kXivMIV2YF}9EX82O^#b1x3z?%vm?E%69=vkbm7!FFksl4d<^_l4{INWL52HTIKR zahD!ktXmbLS>&WQ?7sLF6U!6e)3WZXLWv{fspt+#g?(#SgH_X^2r35?PxFWMg|Zp6 zuK6j!V>3+an_h@6mD*h(@lN~#yFb#-%8mCkr~LkF(4m5Sf0f(61BE$PfMb6{Hgtz7 zcdc}1v}$Q8Q(En$(KH?zK?rFVMJjl?Oi_kh_g__Ev<V!l*i?%-ruiL1revuaFae7^ z<2Sbwk`?NMdP0dz%MEQ6i)=e*_;sw&3@)udLmQ-eo=f|?+6+JcyZN)w_rB~ymI&9v z_RhY{#{W2BI~>9!vV^tX>E776?bwW?%f8awuFEb2+1A|!8<bz46$&f9G*lkxV9>_| z(o)4JFY67B^1#NmG<9N<XFT1rMMl;IIh`DoKAf_T*5<u*4SGkn-hVzi!F@UeslYu} zs}@Ra?IBF*A&IOk5Ot2jTobfQ<(RFTQfgs6I{*cN$;|+)1Qx*-0zLu0Rt(fjCcNME zs;Qt1bIDg=vu3iNpDP#NoK$>N_|o|NL+(Z6^yhGNou8ckcefvdf8u-fI)2vZ7n`ur zV)||+-<o-JyW6^XUhfca)Vb{8cLXx^2?TfB5FU;J=S4~fH$;=PT!LYVz{y`o=Z5{x zE6qCXj^4y}J1Y-T*y6n+f{x98&kDeRw>tS-J@|LlgZjIH)Y<M78=&tU-%J2htYM+% z<LSxoAjErArac&Et)Xl~jDhi)#@4Qw&@j+EK}m3+OnQ1QSa0uOReH<0{k+TT?d>Rx zu5wDisFWyw<G#zb{Pd#ozkA*Kf6J-QaT4aITXX!D#r?5H^_u#b^UWK8Ip2?cPNEu* z{~9HQDOicqhKe&<7bYYN+-_?9?qXwvs)-uF<kYM5tX-LWjMXd6)Un8*B298aXIVF3 zr~ddE((fgOKm3El#}4v=gy((@6T~i^xBlI8vIj0A0lV^90bLp<mLleh8KiF_;ANKG zuxi5Vg&NlftMGB=7BZkAsFmv^M$g-WZp7Y}vzzR<J(|ELQJ?PZzo)Kwv#4>tU$Rr4 z8+G$AVrq}X(_QbRv4878wGtlv)^TfX4XTp6^c`+QLdfjsati9|Pry6_yy@QV)f)W4 zHXIW)L+|(qY@I_mn-csk)0Nx@a_4af+hCkx&pTkN|GuRoA5SRr``+LIJ91#(aY^hb z<`6?vD-V_G!^M0@n`(7r%P=M`i($<0)MYS{OR}l<cxHkhzCdo=fAnrHO|r+kaRH`P zQ)W-6EmT1&#&ztpW^{Hec86tg&pkO>{ohYVJGyc-r+_!VHVq@JJ9jg-a~r19-T2)Z zbL;x8?@dqw3S0mZwqgK?9s9<M00JyqD-4ICoI_M7&jJk#z0QGfD7AaXkmJvDJh6_} zAf+uMe+b(A-FFb(6%t(<H0baF?^dEZtqkLP8_L$P$3OGL;sdeZ!ThRA3=Eev@4^dI zBCFe3I%_w@PPPF%VJkl`hr_Uu^w1EXlxeppDi9lDWCpJ$?i(ID@-AqcQ<4>!ri140 ztC+u=m)h(5{D@^9->N~&NQokIMdghPP360X;&Cc`vRRKFF$aNhWk5*HoEI1ytHPpE zg#o*Ws+)?|SFWZvIHeldLRpO6e6&Tl!+2|&<jLV*imK8rww$4EFF2h+&;QPU?#h^w z-FoJ5b0$S<qbV>ww)e9)4^%$+eY@MOvyum1V=SQ`b(1zDNP)F6C#u3`3?(-YE8{3@ zBA#1u@R9Ugr4TKBe8~?^hOKL=#u@!N?KmD~EmE-S+kVfw^uYPUgV-}1^X^Yj_dY$? zR??lFZyf;-Q^~*Q3Rui<m?ot=GtcJT2LTg|+_nG8vBt`6Q;@NN&8&xQ1Ip$~U26eY zUDkCpIretfHZm_#6X{*-m%n*hwin_g>Xc4}HC02$<FLeg`1Z}xMkPwv(r!7OZ>O%l zVSC3hJ9+};FKPF|tvvBm*^_wMk(6}nMqvYtomi|L!{tzPLUJbEtGI)@3@kc%;f|;2 zfLIbLza^lc!gd?SNB+H@VQ56CLFgSs*S#>*unaUS5`JiBJ3RVuJCd5nL~lZ*_PuFT zeP{0?dW{C0zV;i50c0#0VNXx@!sRK3E2R@chG?|wzizt9-}bkvthS1c?(IV*k#qfl z?M5|C>5XR;=RxQ6)g(EUv|Ra-_xSq39+|*GdOy6qUrLX-<oI~oTLn$ALi=7rNG=Dj zJ4*Wq^?sX{E3Ie(6d>M%j956w#!O7u0}~FEzgk~e1=_z?eBGZB#$#dNW3$(Q@Zy7b zpcm7_Wu$u#`}^xMCP_3n`1X;z`9X!4{aqHeUJ5gFe~<IaiCFuv?e6Cw!NucZ`CLe< zL*%M^rodVz>Qp@(M2lNT4actMv2~~++e7T{bU4}{A3nHtISz*FWx4BS#W|i}kHIk< z-<tv#owf5}`@FoTKY)|vffeugn?;bl<2^r|4#tJ=9eWfm@alL?8S0uSN>Y5in|_3_ zs?;#l->Xd?iQ%oW?*Wu|FQK<lm!~TuosS%jGT-lyD9&q=YB<D)?P?wL@|L69aH>+* zKbU_nuZZ90)H;@>X-rYYes0x^N{*wymR(g?t@X-Mae>SVO}*SOfbOzf--N(&Mtm5T zQ^T_1bhMEnF6E;?*0$7iBYUe%KTQ`SoSW7bLW{ktU9jH8;deCpY<PQJ$*m($=b~u6 z!YMhx^~+o4bo6PReHaA;ln$0djz!tY)e)*6?y{Y?6WxjF1!X?LPH7Z(`(boEeqDm| zoiO_?RMj5g22Hs2_IoiXCAcRAy?xM+zx>w9d#sA&QE7MeA@!4FR7OV%%B`C($9G%6 zYbic!QBy|01;Z&C?z3rV^{E)zsSIkUPkaDXK&rnyK*@Uhx3^k-_d67?Bi!-bIas<Z zddPU{_*(Z92R^)~Z;qPyjo&^0>sdYqloRO?MB26Y$??~|5Mry9W9rJem-sj!26gj3 z6n-%NGJK~80QZx_)~}VV>qD2H5a}P{WgBKwMDN9F{O)bClg8x!ueCF*3zFgSe^D^z z57qfS`8&w^XOCiRV3^0R#o@HhOaKwPy7!kj7ip6N+JWmyISz}p-c-ushf)o@MfW>$ zvvt78cP|8oN5e)HC!iWX;vV@U@hkKPhSR`1eYh7bs>87ky?f(Zdn4n-@>t;zA6I7# zcybg!U=%qD^GO(woh_~%FW@_T2T8qZhH+)~C9ypD;MIx&@KF3)=WYWAgPA8`^G)m6 z;;?q-d*SX!3N)yh;THye@7_drj9fZaK#!L3jc8lDJJ~o>m(Olka!B0KZLDqgw_DzU zA;-R3Jic3$@4%yW{3T6bY+80bvL3B=)YZzSA3WZL?Xbn-YvEn=T!Oc+f^&$Y_UztT zdZ%I)OWpc`sC`<0)Wy?dMDBh?`&r+)$5$d;j7lgP@Jl-uwOYSi(y6O_x|`;*y;X(M zePwH`iJ2|SGJlQTrg6&Op{$gx1>4y>6V${=$g*O-!3XH)cTLaw=SywML=AWL9)PC4 zlPuK9^HuE3-s|vz&KA=1Wueo$#>3HrIVb&%ebYa*8h+QjX*hQGU1D+!j{u0<IS^~~ z2n}Z9u0J>G+F5?1$fM3Qp>jq`TvmGnyY*v%>3ui+Ahf5A6MT5${n~n;hjhQej=?T| zdZgDCJOFW&ni|gTj?S-y>T^)ujC%fb^A2i2v9#ZKI2fcyL}I@`va%5rFkYd3LacXL zZ2_Ih0SV*c6jo_Z8V#d0;%aW(a=FNPH~iqFrG6^p9pxgTfAXPIKi24<*%;G$Xg*KG z_w;aJ0-P(3%eOX0*eW-^^gZZ9*4o4LNn-fv$!Y8luS^4zj6_E(x^Ac|n;il(2S*e) z=92=&8gZZ%0;O%?9ztUn-)}@?<3~MiA2;KJ-DoReiWOMiiA5GpK6dvQa---?5Y7+3 zXeU2*J?6_JD(|k3#)$dFB;#ZTP=!d}Pds1<HUOXn$IPtMc$*s{`O+z~;t#KsF;`Y; z58Mo3OfJf4%gR6`a~>)L<F^P+wG$bWM$s%u{5Uf@gp>4J{xHl!N8q`K_ue374PS)4 zeSPSWpdE#e7v+i6z9ZtX^Z?7mB)xy~<(Vf#h8G6&dbbm-QZ*x3AUzpd!g`-I$7diB zAL5WAoR!<<%GS+b>2M?C0c-#8=m-Og&Z!#mk@vG*x}PLFos^_L@B;dfyTc#xZZi)Y zG!Jh(2HeOc)^KpYps;nWw*iAB@+zjTUOiUBW5!x@NOWU7T`pL^P5bz#t%;>NXqKxo zw60<trfruoRTpkMA4?C|Qzs)FeDoN^#=n=&9+zURN{jPw<D1*C;hpYlgwgPsx+~1P z*)blc%k<LNU@e&UGeF6rsoVD~j7hx-_fOS{y-#NQu?PfAmygprfB430*CTM9`(-85 zL7~JgpAn<~Er%+E-#<^W@r10G8xwzbK5U~$^}%&Jf8!4wpb}6)Uyh!}4h{B}UNNFh zuir%{GK(YyzAa&MCO``(;h`<8->ZKY(sJSS`4zb+z~SyAOpqB2Kt6u_APdQd5j_%- z?#>twOkxJi%ntQYL0}#nf}M$nbpQ-=kNl%k^_x1stAV7}5PJQOj1Qzfl$-BP)?Q50 zU3#O*j?)PgV1(QfB8k`?4h7CNQ@3F=DT5ehAhMK}I*%XgL28&4yBv-bby^e(V0pTL z6^v)~3JNgQ8rC>#%x0DpA1g6(F4u0KJ@6fj$lgNeYghoE&DX{OT5l#@ahx=n^6|<X z!Pn7oA%WN$&{lfQma%s>-*+&91tO$1`QA%<dU_Knu-~I+nF`vwueISh#*V)g_tj4k z5Mlr#kek6}k!{u;WKXZ&jsF`{cQ}p#lL*zye-$tD3-0W{`AwFWeg9t#5LbFI7{2H6 zXPa1w>8%|gddIY)8#Cvu#sdVP_^&?NyIrsZ2on>DtZP$2msbK{sGkk%%>)hu^>BX+ zN^RS^%RnwHKyJ7IEznyAXYV`A4La)xj~?5*L{oL};y+yreh+T;wm`&KAIYLmyo0Gb zP1Co4yyK}k-Pg`^2Bk8(9BA@;W2nyik3`b(0x2S4D={jb@&SE7xbVWUtrQm(0^4i@ zLN|&r$r)x+U48_<ZVr%`;_3nzNcO{c%F40PKlaWGkYiwRfT`aXas9qPulrR$*NyaP zYUO{%fk-wIW%!<1F<hH%V|Umdz!+@)2~09u%zQ<i4!kyk3jBN@_LX@Ru^Cht99Yz5 zCogZ5li9l%Amk2bH^vP8mhUmMz{ZIonB%lA<*GIQMctdmxU*DX``y8;Z_*K}1Kn5| z-<^?8U3*by8crujm3Ol$PYQPPxubh`X&;!V5Q&&cuo7I9Vb<g9?qu*c4KK)RydD|B zFoWTC@&mTnB*%Feu3$AzeJ!Pkc4K-#;B1{vx53(0bdRxJqwl=`koNn|&v*8L@$Qy) zqz^40Mu%<fh?|-9;e#|_C##<mhCKCXvY${e9L7#G2B6TfeK=djp3!auS0)0~bUo23 zFp8HIHAq@ii?$l+dFa}BrpDmec7P)xjfY<SI8aU^Dcf7>D%kH>&&Rcp4LjZG1Ron3 zb)w;+^TEp=Rg***ROV;sX+N0~Mm3#jd>Qg;as~S?Q@fuoGdoCSgWl}^RLhmrGQ@10 z4F*KX2{8$>oY^O>bOG%oESu~P$Sws*q7%Zv-BjtMi}*Y4OKUoVo|4l;WrvUh@*a)7 z-yGfj$DMWR8|K|~+@sxSy!$)$z8qR^^}OtGTm5cg%hn6XdNxV^2ufTs-qouQH^Pk# z^FlK=y4zd^E+;d0U_F1Qd+16`dq{+M$BA0sgMsK>;m*GNICjuB0NOM}N|_WcCHWn^ zevi)C(D(aeF2I|&iq$S2Ru~m_eA?-s=1FCeW_|8C>di;01L+C7K#2&LRI7J!v%IZS z+peMH2h#uha`g?0<*;2JO`;Ck_+f<`U%x+2{az^KgX0Dq;uJq#vg!Qjmv$Vvc96F| zoN9dcl!^S^rfc8<mE<E#VI5wV8qHmjiC~Ux;8ZA#brtM1)|w@YxKVq&5*6)TrDm~d z_`dM#exTU+pXp3~LP7Q39gEO8C!b9R>nlxGE0}1+zn5D=6zL(5g2ra8^Lr~et4-Z; zof(e^34?u%Cc{?!FwZuCU6nH*xb8weHV~ch$vr|g<N{Y@&QI>eGfx6Pn+tm%3g^u} z+N<+oX8~r99_e5PJ}wtUVeWXO>R=e$xjl8y<feezn0~*PP?69cG^9mWJ03Sa=Ica; z0wt1nKf>2C$gqlYTJ08%N2KF~8q%#TH}$A}r+BScA^F{Iw8S91_jdQ17d%WA{kz8B zPK}G)Ne;=`{4rEld=AJ3N^XYT0FiD8WZx_9?z`YKCpV54s$*t22s(AIVyk%4P2G-n zQd$_`_+|tLrVMyfT~j~(+2Zgx11R*pAq5?Gvu{?MMSV2>EoC}kIas`ha0r8a^j&Mw z6_eo;n10?~lIiHJ128DB;_AMuo6Owy=KC{Q>(!qm+mRMW%yJ+h!*SqmaEGyt{A8G= z)qMG*+_`ebpEm9*MXRmk14a2rV}E;#FvXviyPJU-+#a*1*EUraF%5Gq{NX{S;&>)y z1r$#2j+hhSVH8w&g*p^aGu^@{n@aKIZx?smc0rx=B_f74M`dOZ%Q7+XUCw5=Q?+}s zyLX5W-&*^y`+lu!ke_|Ov$d}8W{^lgl8={?L`dk~kKcwvy2w1eOrNqLuVhnt{J9R& zR6ej69+sMv^x#cg;c8Cc5Seq)AANrxQj`o<ABctAg_E-wYeEwUy2lDr({^$9z-_4H zc^E_`tX=*vQ_rO9nA~gzHtL$&gQ*HPvm`2<1;#_Y?y&L4g1fCEA1*bo6QJ5$oO^P0 zX0~2PF5c|bO1w4R^hxnF9@s5=3u&i+^eA@!Er%&6Qwf!cO+-wjY;4sWfjp*$tZDjV zJaGD&h_}#rx$%~GRD@UNj1aI}cS(=usq-N_-R}7tWFuFA4pD0-r(V{1k0t6cG9t<< zwVxCna-8}ha3h>j$^lqN95(nHelMc5$%%@UP?0GQkFY|5y(-QL=B4LOGPc3k;$7sD zSE-&(H-<CYt76tx_HP@~cO&3#yGndw9?o~`Su^+0svYq^3#MeCJSo(_m)3==3diqv zyiguD`!G}TF}>~0l^DE-^9&9}v1mU*^amD+R6#Fd%eg_xZW$dJxC;cp*p+EzB^jHQ zSacZWL?s;8J3?Hm5S_veFtQCXSi=~4U(Bu+G~-}~*l8cmk0ARoe}kP$`eINFB3Hrq zMBV|o7uS@E5pvy{4KMMd?cSZb<@?ZH*yh%=%IK}HH~etI1kZEM*;$MG1r=VJowrcN z+NX^4KV+#0%6sC(Agxv-Rt7c$ku`hu0p;rQ?<(Gw-h0MJb2Wa5%$$JN<<xfotXX`% zWtH3+yAu<XdpqKeL;U8hyT=lItcw5vTc>I8YCCko4sH&+B3r)M`$PzzW#bzAaR(=N zn}enJFSA*xO^wUr;aFN@xC;oQWr>#!rHSbezWc-R)|W9xV{bDYZ^^P@d#Ln{>sE6R zR)IS|o#I8FF{VyjQmd=I|71B3q)L{2lTO2j;IMA=M^Lc>es?&XKPpahyF9@Z#&Bcp zs$7l&Nyaa5((Y5u7pR5@C}B%HZu*SnE(yP}j5)h#5`mI%gRb_iz$`~JiShx(Y~6hv zx_&MO8`d*d&clZ49=?eWqLrenZ8AE~=pFf!>)nk?Py2|o$q=)3n=NCd9buegeqWZf z`?d|fc#lulDU1(H`yR-$BPv=<JGtl5$L3US3C>{njJgBLjpx)wzjTwCDAwEfm%Hl5 z;xQU0#LFFo>7kG`JX%6d@95&J8LCOX$F=iD%n)KhmxJX{AuK(sl^$%F-c^*O*-H;Z zU4qhJ{$F|lBdh*!e&>LD@Tt`r6Ymw4@=>mYhvtYJMr7qlbPoaALaYH=D1WIaQqyM? zRaRjPhP3zD4#SXgNq5qfyh1HAiN*Q>+X0JgPk_C;A=kuNzkl-F`Q8dMsSnKfQ!3*_ zXp&Gy?`~b08)}KIeE_faI@VpAetxLr(wcH(P+MMH-kV4~JWRPI@q$RX9H%@Ya%@JB zSpdkyq~E&czEE(v9JD}8`Rg~U*_YPcnXM>dG*VR{zuv;Qa3`RRnYlRmvEV5$ZLz0n zx;X;e*ja?NDx~)ua<+d&-=5h~;$dT)tB{DSS`r+{sJ906&JyQsm&<;kvi4^^x+2rb zj3*#%?*^TW$~&w26gR*ZX#&nCQK_5u_}+#ity>~`<-Y?}DDw-B&04k@XZ8Wl1P!)x z--D0p%z1O+X1`M<#O)<zCht-c6EIW=#7ak{cOP6Jel`c|SOmm{LsBjaCSqpHybt#t zjq1)f5@j1#?(pU~6?0_ENS+6kduztqfo+9U4{KhwJS~7ZF`Qi(&)23o;2y!IKBl65 z3%*Mh;)cw*<Q}F)Ov}~v2!IiY@`7y#YoVkMxR92+kfW%v5?^EMV&(6+;>7UjO}Ad6 zxTi8cK;y8ZaA%G7fB?AWsnpFs{WKXBo#;Eyv`S76=>d5S+4a-5iBGI(2P0F8wedQR z_vCUJV<J0T&iUpKb~n_OSzVJAk_j!_vKmH17U;k`KRe#`$uZ$FU7@0UcKn%0v=2rA zJ2djaz*r?NY<N)jSn-fIGhRRp;+FB%fN?lX3$RsH9C1yR27$g8w$Pp+^<s}2Zw<-r zLGSx&MrRkEV{U7a73B;ja)wTDa|nze0!`kU1H{?58#kNUAg>&Ku=>}9(kiTbUrA7G z6ZkRr+th_G%Ytj%re~&hJYnswNoz!qt`1ds_&sWI+0SN(G+zM-;7RB+gU5MAXhVET z-lBHB<SE_lp_x$|?E!48XRjD{pr2u&a@GGW%1$mt9h3ph%GoVuO)a_lNhfFoz?yBx z#~!K9X^V$Rjxy(BAKaJL!(Zf*WvKvr;ZPn!_?$5NYVqo#d?&P!&yZ^BLs;k><fKG} z=x#=>)JykMG-Lk#QPjiV;XF{|XLCOziZK=GZq6+P4z{*FsH7jGlnc6nox%2WcfnB+ ztTSg}=7+A$JAPoTo@eT-k!-gz0Orhdq7==#zdmm+N~GlXY$Aigjp82k;oNs>H10RE zbPnJ=1Moip&=LdK$1hqw<wo;Rcl*9D?-(N9BbZinn<dTnET)@4RZJ?$0_LU(!X%v$ zaNOgZ7v8GdAUg-K2sI{dZFZ=hVHwd}<unEZGc}C~7$mijdI*|8rfDKTU)9ob?2Lr6 z?#4n4Zyw6+GNY)A`OP&X8b-htkJ~_=^ls}=jNWXAiXo$)X&B!)P8n2->VB>?blE(n zaS7aNWEN${<Pf-8m?QCNy#qV9b>C`j>VcvWTmj$aQZBGb;$d9Ito6rcGdA$v!X)Eh z73^=byNGzw!fTD?_q$rn;M;88ZzX|}hLD<$mGZlI$HvLv80dFLzLRy$Tt{jqeD^Hn zH0kS(mE^2te?|j04}FJM229@l!O}WcZ)(yxO0aMh61cv46i*}>atP7*84bm-H?G2- zU(G$b$s-O-b*Iu}ZcUgqmLWmF)qXNaG;9p-Oo{+;Xgx|pHQ%tP`|osScSu=f^HhQY z`rkg!pm--Sohc>}<esTW9q`N`Ccz%3+`ajp^<?wjZYvBVE3zdJVFOr&;Mc3SS9}Ek zosspvN_`h5tmWl#s_0yI{AchQ2{N)9nsB{6s@jOwy3A3gME`zdRrxqqXBd%&1N=RP ze6kns_2HgW5K4x74{G{hcKbX3VF=9$7mJ~?9h!J^y6}p<K#kQx)`?j3@RR4zqY_Qx zSa#wVT1Kj}-nM#>`977W%YEiK!wN9Q4I}MeBdaOEG3@6Rx{1&ZL_+1MgxFk}l2SVl zHg5N1#EOHmvycL;ni_XIa=s2F@Exhd$)s4?Ms;gxcRwo98GqM5LJL<3k{{^o43cGj z5>xWKpO8hSeM`WLBFCW6j!FT^T<>ekCq5SDk;}!v43V{LA?saf&xf?!o}Eg7ZRR== zZ;39@IT_y>GiptvZPa`B{JS`6BaxLM=HbzP$TPdMx9!N&wc>RC0|-LSFwfKp8WmNe z=mrnRi1$_0%p_Su-ZApboaYNajWVXFtr#+WT==epj~a&u#-VpsdI?BytAzvTkw1QX z76Nwn-Q8iwI9ogRVeSwi2FzWZ;hTYFo<tN!OUPlS*)FMg$2c5WM&lMf@ZBJDpkk_b zvZT8U?m!r+$2Y(%0Gpl(NSPq6@8|-Lvo)b~Pl(aVUDajVCOrYB-UGHw{{Y*}*x2gS zwBu29IvR#Mm$50VkSiKhgB(A|2jG<*TN{d%zaD$odVDpr33BH~<G!z00JcpZ3u?Gn z^s2xi)_o5<^VekqjJDZy&Xe<`f1|rf6vz1)V1ICTCxKv7JBuVX2#Y-I3H`wul5p%l zKYsg~j<fIU&HXqjc2o7&Evmb0Tx}$Ba1mk?%+0c<>xE=}4Yqy5<sY8}M9oy8vWWBh z_mwIUFnjR&oGDggU3Ukr4-G|AmF`|~8Yvs6`4TYSf&A%+CLk92enir7Ou&UjurVe; zi{+<}F;7m9E3$`sk^v?Wz(X(66f|tj(n`P1YA2d!-R0Y~sud73t(v>ZaMcF)-(LDC z0Sg{5T*y^s{B+y7MUJrmT9h-rU~^g4-57J7;MFja-Jh_k_H~U9h@eS1*>x(^WUcwY zb`}@KFy%ci_~<qKEmaCz-}!a9o<>kNV=>i^MPb~9VFUs>*iPBo{irdK5W(X;ZgW_! zHC4>nbicpz4I5O=E9=(EaaSD`8ef|-+JZp>?YMqmqpXb9mmh_mUVV7a%Ou#i3rm;f zf(#u^rcLz^QCwrlQw`*f*Swok#9S&9r#%E0_}2iE{eFE^D*H)`QsGoJ)(PlFNst-H z98fn!9W7T6KQA@9c_-hdzI}h=b`*g|=J?qLX25JK+SLvc1H)~1m_y@A<r09#BjL9| z5E_Up-wmPTk?(Z<*H0T*y&da@A)OhO4F(}&9`qu4FKe}?9RC&@8=Ga;f_iqA=EV=Z zhJMeO_7P1f@wy6D(K0<DoLZ&|oI2Qq`<|N3oK&FH&)aQ0{M+=F1Z5`n=5Azu1`bAr zgGFnF)tQZa<cK<q2a6jzojms0C?YWI<<rM@l>{uVbHWzIi*y_e7Ml+Tt=N?zq5<j9 zpodOJ*ktTfO*l7_RLq~q4lQ|(@aRsMnXl2htbLPyj_;*!WCby8AUVeURL;`g8nuh9 zD#s~_umDQx+=Jt1bM7anb+7K~+`)H_EZ`%FrU0bPz*5MfJfwbz)fZ>PmRv2<=sRXn zvduv;_3+xuyS^BkvxB?g=<)U;!2Jq^%`#!%oHe7VDNH(5sL^G*d>T5i1lUQ%&~cW$ zP7UvXlbD*X<)C>p)(QqD?eWi&?@QKsrKHJJ*9-XAi@+fwAXVNR_5e!&j7%<*V=ong zsJB51$c-qCNkL31=Dl(WO3nGUhs`U7N-Uv5B#-hb8ttMoU;rw`<jVE7m~3}NHCs2% zi7$R503yr2T$M)Lmvn06jM#VL^>C?AmSg!Qg%7PhD<(hc@$*u%;vVsM8LeRCUd9Gx zVBXEV{IrP=p1ch<pfd^ly0M?tzMKb_GZB{Sz&=b$Pexw(0<19>&B8J+qk7skYUv>K ziqovG4EKou+E{g6`w>blFj-a0Cuk?P9XF!`q{P^smdmnEzokgWOHoCI`c(<(ZQfcV zf|II<z0U26h>mQHSvU{ka>?(_#G@~E_tM7$GXNx;wNFzD(Bg~VQ!$3ad>o;POtOe> zPd&qNY<<cJ`0c|iS`y|RlvD%@Yd)hb|FDrTHr4xv*pA(FAu+?)-KuGTGV4C+wy)mt zInk&x&{c}fviJO&45MwK%H#lU&&$Fyz6?N)!FOrIir!$JG)Z3}bsW<dtQZa;-M$L$ z*a}6ZT*D&3YkRc^v&n%Oa;>4IUeJ0PL5$wrxQW9%YiG&+axvRa?!m$`H2wDBx7)hH z+_Y5(Cg5UL>Gg5UG!FU;fLsg^>TWjn+9qkoHdn}I>aTTw8lN`F-kFzK4a6ayb}y;I z0HCkmL}ZzZCc?X6fDa>40x)UNtE8&4_*g=Qvss@=!F9e0nZI`3&j48ufpu{W&GvL7 z1t7eYXKq9sqw{-{)K+@7n3V;J>jJe0Bhto4e+6B!F>G%oy^%^qW|HfW9u3_@k7%~l z&mf9w1l-bNJb7KRV{>DNcPB!1At@xg6ZaGbCSG2L>CYARQwDYn55t(d=N%QqgvALS z7RPLNkqTTpe?FtDfEIjwDfQj~V;da?^6XSGwy+E}MyD0$6A)(1JZ&TmC4Hd0XYCTP z{7Mk)<Yg>b-*n0Yaj-n@ZK5z?xv36yv|%t(99SRh-3N*fE%g^@uy!2h-N6qa<;ZGi zukHQ<wtM1rFF{G2hy}%tX}uNiv>u}-?_}eAHv(s4UvO*Ouru#J>OAE(z-iuK26L3` z_!^LRC)aRv(d%)}GFPdazwMr2Wh8l2@YWiq#f7lSFpf3?X4b30+4`2;3Yi}@8>!fI zH?ouGt)C98G_?NJz>ZTT0rJ>f-c1~Zpf7WhIjRnGaB*tn0vEWj2;-*dHE`+?6;8}* z{R?Q|sP4>h>R4DcCEZ{~hOh%?Pq`o8@fwqL-;uvli9$|J{LV=Rlxt{FNl;)wNRR8j zmD0svhU<l7!K#^MQrawT@eJgsr{&l^lD5%&G0dW(Vv7^0Jjkf&-IPf*V<9ruk+Bsp zxt2;kzUx6!5t^~xo~8+luZK}~t2J8EKwZPKBlQ;0!sxYtQg0o;qB0rBm$lM5XA57p z`pMxjWJwuWhNSa5UD}LKxTPI=-U&uT>TxFK%cD0DJgspJv-W!4t^lUWPVEk?%5y<a zRwDG_K}B3c!lq#IZElOiar94KoqzbT&jc}J!iIfWc@etlD7ZW;uJ{;tlgi|Gx@@Tw z-ee`7xsmsUT6LaC$9}4+H)?07;9V{zg(hS?c#1UUjB(WnxDEBb;^pJCKiv#0g{v|= zm?DHsYybM<t6<Dw?0u1WpqvuR#6q~O&D+HZMB>Jl3Ev6~Im_+Gj<c0u%Z#hxHtj+m zarKb-G&HMS$n`)^!a|#)8s{xOCYlnTM${dAE#1RWiV;@ed@RT_@4LFd*XUL`iKafW zSLWWwn>(<C3Cz_qX=F?=h*iI?b~7iMmYI-rRkNY_@z^*+l$<6qq)Z|LAutPkH&suT zsU<s3M5ZU<r-isCsySo^rJ|dJ+xpUhaauB@*<N2Ao9^2tG>2(DS8p2PalqNYRxb}H zt`s8B(X&h&S778!6wr@36WfTAXk~Z4-YvPkt&3Cz#(NCDDp+>VXLApBU>t}DXa{`% zCIDETa~|K1vTJ9aA0>TS(Ak?fSj=nQSK6_(LI%P@Vchj(dn;^tCRmu<OH%X6ON1tO zo3VLl-e9cjf)!%ajmnG-`OVU8(yIO}>lkC0nZW%VbE|HD{Yj)#n;vJqONWE5Q(Bgb zytwgKS2t$L(B|*WhmFsh@A_+*<1Vnk=N&5LmKTS)Qhz#*n)fVaOFw7zRWT--L{%Ij zFmI<~`H%(1KU`Q8z&r`uCg^0fE-MxWUdI9~8w-pGyRmI-x2Juup)mj(kKt6MM)Vd+ z%u#6_b2_<sNgNJTEwy=_a+5Q;K;peAE+Oo&Vt+$j1fvmyh~O>%`g{Cj8%6!zz0ghg z+aKT+@>DlqUABf&HLtT4k<(RP)-!yBU4!YfPdN|m#$Z7>aSynxRFT9J6R8QyhJ6aN z9L}o4yI{g}6md&S+)$(4a3GtEoqxqBJRw}_0mi!qgJ?SGIs$KS>&SE*ntf0uWuNV? zZnEJVH-)+C8@+`czDAV#85389+^t|d;jTnkyDlr5p=|To@&qomWxw{{RwU0+5dvJ* z`)@&z8Z+BS4g|0`F_c3P5nu<CutKZZGI{U_$#VoP3L*^&QW4LQAI7!~rD&gDVAV|^ zd!CNRQij^x#RrVMvI@Y)w8m&0Jn?vD)u6c;AsGn1?eF6gx5|{Ya`WR&;^U=S>`IC@ zqqufcC;acD8~T_^9x7&;*r5u636y4N4)x-S62QT}&~zZgnkZ!6N*uF+m{>5$T3jf~ z(Ms(ACpbG4=9BEi#A3GtJX=3J_YE74`?f<@2_`lmJO}Hloc2>hLIfRGpx`^3k|LX{ z&?YOG%z_+qHc1@Gbi-`EF!B?Z8eMF<fDsmN^jc~L?d=cJP;nI)r#WX$1Y=dWgVca& zLkALASKozgSeu}1h{3)Qke<@S(~rMmC3JdRkHwdQVyH!!CjgS!=xOzP8#rKm)BMPr z?gBH7z#NR3a@CJ?ZUc-(NT<D)pg9h{8%Q|_j7b~<i}Pd?PmiBN%G4ujUGbY?t{#aw zlws@3GOLRlkH=Ey-XBG|>1vqn=<8OLPT)*=RneW|-K()Y$z~wHo`h6)Emsf0uz{E+ zIIsb_Is@_#6Fm8x&1Nk;YS=7f0aPwLVLan?QT0kyu;cwCP#R;lQVOee2Pw}K@MvLx z)~N#%r$!YL6qr;+IlRTq_e<ztOwZGrs(pfE@64&`9bznt7i*}$*kiosB;7hhaAMw_ z9lXOfG+O8eXK1c&#p{_}6SA^KPN}_4@q>dgb~fGX^q5%GO!Xom<M4eA14jjH(N1z( z*(6-x+S;S}J{f`CW8lh%d2IRQ(xSBj1neTl@=uWL<-QPEM6j>Lh-1+>LC6>ylM1Jv z$=<TT!%~cipC?|{U{KiGp(ON}WXx64rEG3+BH`x$6mmA=6L`e<FytQn#ygG$3>2oQ zC6Xqj$-W)BUkdz6S8~g+%h3F<h7C{K3@Bbx{lC6UI&eb@_C9d#^6erhc5(yv_LtUA zm$+kub{%J%9p>JxrQ<Bi2Zojd8$y%rV1uiM|AnCC{`B;yIx=RF1$!*6;@Ez^H{mMn zKEiL!LZhavaT+8m4IPt-26xe;&38%WIGVD@L?jANMa9Uim{FD}PUqAZSNdcIfWblf zjjqplt)-B?Vsm@C;s`Ivp{C|6Dz-VEwfPaOtD^^NnRwj+SkI$=6vQ+=|1cA<!g5`u z6nhi=UdTuXx+Rr^SLO`>$9!;TCf*mLV>J!iD~M3<g}mVg3pz(}n&l4kIV9*<f6)he zo{k(-QuM;w(=#)iP|N`d>@I+qR(h!WhB6ep8dLItEd4mRx50A2=15mHP#Wr2{9N-E zIGOc#8I+X`(GjN^!l@c97og0S4~qcG%dTnwwh0=uvmA-{)SLmy>>ro1randPVj<|A zJJQd-2bWMT4+UGy?85gGl&0GpUBQ&B_&g$q?@CPGv670HV7(K7(UQcSg6O{`+8R1d zoq5YmB@hAj00LGfaqy^7YGKz}g{j;Es)iKvLrzMiH#x{j>t{EH&@gNumZ#@W0Cs`s zv{Gmaz%CgU6wZM-#5&vHs{)XOOMo|8Xrt0TihMYUFbjO8-^or@G)RY`a+W=vZ3;7F zx(#fU7V*rjJt7BO@)Bc3aa$@WothJ!ST(4bfmuYNpk3Dd4kE&nUe#d6E-SEL>#jv3 zA6^U+Xx7eVoM!f3z+F4RA~9<v9~Go!!ki6HJ}7y5{sF$PP*Oavn}UIDuENjEs7ds` z<+Jprw}80{z@a|sV!G)~<KdGy9Z?r1AMGvTt*D-$KCEHTy-eW7j%_A>y81X1$m)%X z2qD{1l_EvR;E6gZE-i~rmZ+*TVV<5zfc>>%_6(NiKdwK2bFe`~R!~X-s52VL`3{kL ziu9Elv4>C1_&f6@&WMUg9dS%E31sUFkNI<6g-U|UEf!}h9+F;Opgv*U(u*+KvS@%* z1u!l!GQTCmVB<9YK9n`WHY;dxY<u5{a_>&UNJSgKoa6Xn9_EUfS@yOEJ32n~fiAJ% zh)WU(TVBKrb4k}A?6LyJq!OZK20@l9)N?Fg^AFF@>k4x=A&{<t&bf~|gwj}Zt)=2f zEGtMu0oFXR;9C+vobs>AJaKcEa|Z<pB5`c)9j~dQ<C1sK?ojqt8I76}U_|dRv6(3b zf``j|o}dsFOn{#7b8-zA&HAH^_`BxG*v@nQxNMA0J_^NTOdxTyTBQ~<bB2|(P#8}O zWEOIQ=mox}<Fmu{bqxr~yy#@9kKaHYOMprTUuKA&UDG}P$to7^U16&*5HT_BL2xD| z=b7~D#}Zj??lcUB3vNzSB{W>8<n2?2j$G<SHNOkk@@gm#CMFTa=Ct>GAzp~5T?5|3 z+ECB-Vg|jLrZuI}L@>3XveW3Fk6{K(eA<ZY<PdV}?1GtV@*J1uU8d!knBwJOxok;p z247(>FA9iC1grE3cow-2+2W?lMy#I5Y`zgh`FQXTaS4r02~8eF8PMnN??en$ns#Dy z#im|D^YS>g<bF}5>9k{xii;gN8Frp<=KtYcvPM4aLNkI4=$#RPhzY(fopC|O3}XX3 zJnod_|3p$=Yn5rR5$$N{<YqAOu}yLpoopv=<~V5~ANr&yh$p#xQb2bFCSdElg0ELK z2b*A~Jq-V;uSAN8S7kW_)g80^fL}I}MK|j#NUU=AxR@cQHCFMHg3eave+B~a40D|z z7GopZy3th!$jSr9%Vb0m0NaS;YsV=>r|$li_H=uYl9vuvwjHauU|#f9(J_0tv{#{c zsJ@L+IC@;LRiTig?oRF+VE%#)nOra&sQ`8u8JNU^{p|{(@E?pfa+k|Th?}gcq{Pqr zvS#{ty6pilog^Q&U{K-2Coi=`8FT#c!uUmHd4Boo<W>~m)<aIcw<N_Guh8(zutE@D zp75fH38?{VHHBjCI;t_Cwkr<JDKTR+taDaGnd?XAvJU}NodDwjK!feBA~FdD`QLjt zS*Cipb#t-Mx>L^syH5>{W!#qKhDJlOZtkdXC(gz@BCMd`RXPbU;J|I)ytqfXCUb%v zaB-N6ifJKTD*EKCC=>%;$P#P@o<Dq(%jZvjyQwNny$|gx_-|cCfxsu+RJH{GnI$cD zngMJRL*2+ay=Osg(~6V|9Ab@W;*B+xT8H$a@yCb^lR$V=x9~D03}Q0F4$+wx=(5sY z2LZ%F5J=2!#Ig&hhEJ#ApF>Gw<bY`J@X(^NJO<hI@fHimq61-bH}e%+{EVjAt#EDh zHZX8a<4|I-*6u3H*esxn#K^Y4{BgeSrk~}qeBEF5w&wS1qQYqHsZ6$r2@3O_MUq<` zfpY>}pM-5*A*||!c2kG3aW`u!B5b6(yY&ukTGWE)vQkT}3}fakESrdilg$X&d3qHH zZ&KhjW0EDl;<9SBQZ2mvk}NUKRYo|0!EVYz*3`Q(^`>Ncw6aWnnlD&QZ@Hah*#J1! zt-j(rUTsK*h+9I;15=YETzP0~y!ISvm`(unip7BS%TMxQ+NUeis<ZYXDT5gf!KNws z3mcwFGLI;Hy#ne?i(&(&8+y@WdndA$Itb$q4tySu=*|9uRX_~E7FqT_ddVq(4Z1L4 z@y56)pBN+$!0v-P7>(PI7)rX!c|>&v+ysoThKZkOp7z(LTg;7wmYcm^NM03ifk5f2 zI-HbhstU}BLW3nF9Ew6~5Zv&cN#F`xby;`$ZJvoqE>5zp9c`l7Jym-|4HrkkMhuz@ zdw<0OyMDS%AFc|#tlPl3;wpVCO;OLQEx**eq1bmIQezb_2)vW3^r3Scq(QmzBABXo z9Zj`9Aa;P1g#e8x3@$`Ow!=0Y4_2}Et(y9`J={EN9LkvGa-Dw5KfOiVFte;+vgarK zwy%EVs)HO<==Wmt>!~SBZO}nrY)~@QFQ4EJT;N_9VDVK%hq0-vswm)u)t@p_dspo6 zO}Ae!3;!ovzb?g_VW4Rc<qvN|#o!Oa8=0sKP6T%@0%k0f_&R5Y)~3A#Ri@1r0Ys~g zmy(sqq9BII;%m=Kc<7x>nKfLpzsh6gF{m_=FsQ-_-|&p5^@lC4P`?qduZv;XiG>`t zvLB98RKZF@$Fg@O8in&Qc@a*qD2cA5vgrCNb_HQ}v%N$|Fj!#0y~-bHV+bc$uwfDg zeBT_{ci<*pFCQmd@Y~kveMaYwL(&!NeV2HO`jMmwHq+UzRPTtaQX^i$pqUt=Izev& z!L-+^oXkPwkV#=OU#6YbMumTn-y3fQ48S59FhITW`ABc|JxE8czTFI1rK;8(`s+u6 z083!cf))Wc%!-U*SnZw|L{SFTp*;yiZjk}3uI8BNDafy73Zo>hRUnaFK6_kh+a?lx zkf8kQ^=E!s$X?g|u1n77DjzzGN+9eLce>7u;gX36=h49N?h4?&PrHar3|oCCY%0c1 z5H`3<9^1rFh0N0=&>3kfoGj^)rxFzxQzU-K4ED{lR5Mg|xEDO%82OSz9lm~^ZVu$K zg7k)GF$l!;rXZ3A^?A=xHz(L$2^!R~k)(!)d5^L~Srtk;LulTr1Th+&aeixV0#S#7 zcP)rQ+$cA_V)^prifT_~!yJGB33Kk`o;SB0IyuLP+(@-`u6*!Ub$Ez*(KQ$X5YzLD zHPyNTB^K&WWWu!ZJUvU=on-_Y?&<AuxY3WBt}#d7sx>)V%pX8d^<*b=qy96X`ty@p zV~;WPy3Q9;-fiDj%GQ{x#9P~pJVx3P8ii8O6TsX#_H46xD4kSU9cpmGvuk0wGu$0o z??i`_u^Y6cOtf)p2${Ek6I^fKzP14?H^9g9PUJ3Puvjb~yoOTjJ7H3X8{G+LYA<FC zfjLQM=*FgU!J<*SZETGBllf~Qz6Ik26R^To*D{viyYjTwTAxH-mn%fr=2>?0&bmn^ z_$sUNXn7|DEZDc};-YoNV9<TNPP2fp2K&hQz@COoPOGz#XWUTn6e+x2uk$_HvWZNO zmf`^KtdSDWA<(qqjok+VP@8XAZ*=r4o__i2gHl=2t)Vgo;lW587(BzzQP}bVX7PuE z!_w&6(a2Qwby0#isWRM`ClY=B+8MY&Sg}v5c^=3oT@5vEEhfDBJVBlXy6EfL{n*om zO|G+BGf5B-cmjY4whBoc!4yBRyQ#!OB#}^y_H%$~nW3sprG^2Ck9ll0;w0qcM8#$! zF;a0eV>6CjUi^?y2_v4VCX>Rl8P(E532wlz>un{95Nr=WRSyb(Ht|Z;;Qq)x9}za& zFcDN#A392Ncz<g@%r*j4!I-x!6lXA|>8~nQDhI|&?$`xtoi_B`tPbugeD$Y45wJQz z2y2k(47AZ@T7a);=`Sn<ofc?-81BHl)-^<Xs$ii#G@RO83VDG;G~EWLWqyr=QB1+a z+RCX6c_xRLD@hn4dyL;a>kb;AyDBZ{^nzM+(*&5PL9xq+Ie5z3>TnU-K_J=LX{g}a zz}L|mBKAG|^gz<qq%9;z;j1%TS4pE0c2iohhAn$&z$x$ni^c>-vau1<U`*JJ@bu=2 zr#~+rudlK@VRqf4Rq-AE@{@ehdfa7hw=lr&2C%lrsAZC$sZC3uxi)H9Zi20{hrwW0 z3R*HuAl5V13gnDcrY?-x0a4|M@C-}zEU?MRF;9_S8lAQ@GQRod*bJ9X4BPFAS73Fh zMd*NFCvq?ENBpOB_OEu2uqlHaWN%=au1t5`utWD6zC*?7+#yU{n9SL;*LIzqopjK% zwU48#i7cORv8zHE({t<xV?b|TW|Ne4MV-D*fJWEj#vDm8LlA|E09Y<hw_laJgdj0s zgJ~Tkg_ejQMgk}qLtM0rnuL%-L@lWb&ht8>^SJUXOFWax1K*wY9A$19AYd?xC*}U( zQdVXH_Tu&uK^!Hyq7jdaoyY^6O@XnSKIt;HyNlHru$A20ask~!=PjIxYPzM5eq{Qw z8{c(_1<GaPlBlNZy19~IDqM0HuZADBX~-h-oop4jxphc|w%KENkIIuwRdGjN4*RXN zRALUl3KD8c$+WOhtxw<+n6V`L2V$~_yqIeO)-`IuGD%jQ;7*>3dxKWSbRkqeT|{=< z6}v!43?LScYpN(Tsi((_21I|F6=+Rx|47wli4HbNS6D_ld36FUB(1_5&}}crfi~kB ze~X9Z4!_Ckb=_0Nrkx;Y|FyKJiVV<5C&@u}NA>o#nV<sfSZUgNuZ03{a()wo8}`W& zwpPp_fe2Jf$-4{q6LedJC(M8lbc<P#9fhP6FRe{xg+><5LJxIg5@5xyVL|z<8;HTg zwCGhqR#m|)(B2!_$|&RRWVAbBRt-bIV!Mr_2d0{t7NNKCboR;Fjn+j4ZoBGWPDaJJ zpm)%t15rhFTd%sC11gP%OO72C*rQRq8se8E#zcP?j8TKJ(+U{tJY#d#Y(Y9#EfMGw zzbZ`KVB+Qs5@lv$#@_3~bjQlmyoj3XtCnESo>WFPED5{7i3&nJkn#cM=R`CB=u<{m zkt{Q2yi{pI2AdUCqu)h!KUB<QAfki7A`|v$9amObdcC70C7EH5vt<QwIKWx&!P-D1 zJ3;vJ%dM*G3QZOhr>cV4eDC+A7ZydkswF0%o!5mkHpm8I{fV)y`&ZItFqQ+>-HSq7 zbIXuS0GrL2CMpbhhpbp(H#|K<l(BW$Iis6M_yQ^A_0V!Dhb5mT?4ClLDA<j`7YJb! zJu)*W0RczzHs~5{8jLe5voiyDg%)DD@&LQe#1;xiFZdGYwHu|3lfv)LZSKibhcRZ& zKv0VvXGnc-)x`QOU0mu{vfA;6%Vm%cL<{}T3{VrW{Pbsnf7PGAy*jaa(-#Cq<;oO) zk4**h0%#Pen0-h3uwn-Tc6;Fu0Io0By`|yu;5h3odbFZM?4!rHNEWS<w?nAtX2QNH zI}KdTNTYS)(Q&d+;XRYH4jV#5H6{w8!uugOV6X;@qQ(*%ingwW&000YXu2LYdqhok z+rn|itxGkr>ZVlycIpNbRNjjSf~vBb97vn%^B;eL0H1FE>2JTSvK~@0^NeCJOaYyi zCBQ^BVxA;Yjlc>B$n*xg;d<TnLqZS-jX^Sc+j{7x+R=?x%VJpCt4ty$Sg#t9eO^p5 z%((Yy?QOnOp?T;y;{2VXKyZR3qi7V!w?kJOlEdw+9Bw-5x*N~P(>qZ>`QdK!0)x4d zk-Jt&-Y`n5Yfwh~VaX#Bl~C3FM|tV;`Llv#UKmf$Usf@LlfVOQqk>y$5+FS{J`t1& zqzV__q8D(*3KiTo9tD==XG##=xX?w70TS8KSxH2ABu~H;h`_QMyNLL&%WkG{^6KkD zfQAl}?C3axGhJ|D#D^3j@cwm{Z4mFV$eueb(Ztqslr*)dt3upB9MDq3P)=t3iCfy0 z#Mv{)tC=1(lbde9?@)lMKL~h61Rt>W71SgOvwwKPK7F`c{<3EFs#_VAQz4rPDQ{5B zdn!J3T2_TZ#MDFQ>$I7ux=R62(_$;g#wjY}>eI&I6(PL@J>KjEPE3R;@-s*nw7RMK zF^-SQWovyG;mr{5fr7Mq<<$;Vyd2&8dk+P$1w%uGMT-xvmdin4c`Pvc*;qCpq}OMF zh?U?qC8;X@s#QX>)A1;KGf#0=-n?IK0E{b7@^7D%pZIe7$5&NQ)a{bYCG&jvETC2Q z`Eu=mV}NOzzQM`289`I<nseTMbe{G>gT~pKCjvT@6^h-3KHN;eSfIL@uM6O>Y_8M` zgWC}8PTfX#Q-r#qqSCQ$(lPuaB3!0}sBZ3c=t|BLiz$gPh`dtO1Agpd54eBfLXzOv zu`n1D6z-`#jVuHokLk2sZ*7bN^AFdXrX5Z-Ei~I<i~mB;A3o3rn|Dnw9~M`HV3)%K z>4VHyHwC8XeI+egHOmO!0G7?XkVOtXhFDEtsn?67quaFidq&r<pYY5ZeBx!rO&xwC z&X_$Ao!X@ize1hs$APEF!4VHv?{l4ma_Jdr{-gD*S$^Ve$@@w`)myw=>w$hA#jQ=v zu;iMmCIm{ucwvC^J3769CjJDvSslQ}`MoaKpJh_IegZC+RjhTO9$>3E2>9^vGwJ{O zMYRLbL%#H_z3(E}P?_HKMkip8bfJEd;3QPk@6%co%mzT$m!GCjx|##_<t0cDUS7UK zGF02hb|)deUq#L_DLv>R8NePe{-8gM)-Qgt`7$+#Psmj^@8nl>AL3QX5)44;CP6W? z81hl`*03(e)^IS^EIQt&wQBXq0jRDLO_u6}%crX<up3}&W!?rjc>9qS{Ad08DhkuY z@O3H~1k@y*1QuA~Iu4U4uF*&UFiSH-ksYY*mEB%0Kj9*)`RkW2wa+Tf{N*L$kQ&H? z5mQ-PK16eH8VA|~bGJCWBg?SoOP0y{yigHxIEX-#W33K%d^o_pdhFH!upJ9-Ah?Fj zZg=-Ez!O$@v?<2*2M3t3ii_IXiI)i;@Y;F_LMom=Op<u91HJc*^ZIZ2qh6n`*XQso zWw@y<c)phLsFQ1ipD{q#+g~>c`y?VPYwzh`S(1Zh^)T-U@b>yQ{ImkTe)*zcXR~4o zQ%%5;5lKQU+Yt0HHVfQmX@bE-T}yIu-dflQve}rQ6E;vzQ`SATFJ;zgwO;93#@%+u z{x$}|*R1<;jBeiAYMmUSja6iwj0JdIi8r;5=uUv@0^6_%p#K%{%wq^f>)p)Pzu8A~ z(dz_e5Zrbx;iHrmkG=^>%!YW{snXC?f)b=6lcr$H%ZLMP%q%;Fv?_)QFIYd3+n1l$ zYO%pKWQ5dh#-L?Ah1g1O)BEP*kQH#II)&=eG3SR`gN3nM0GI)uN!jj(Lx3ywmP2T1 z6J6m<vh47X6*0j<nVCK~iF0_^D`^Y6ENxA0QihWA1iWIIo^JiTgDdw1zJ9^_YE-kC z_ib_&g%d0G$;|=xsVX9-JrH-vjqPxOm;%l<xjj8;1hcYW&-YVoeZf~?e_fTm8EPAh zOO6y;2UJ&;#)Tv)4O)UI!m)f-%A|+?lw6lPArA4x6{#-q(1rTYJc<u?@D+;a2e;$^ z3r~9?_vEy#nY@p_%_V-pd)}?X$cYx=X}(;<b$>0}jtYk^trH0_z5SKkFYr}`%r}1q zpqlLPJ^z9LzBvd)ymk0YnPQ6WNp*sDuF}cPp*pW$e<6mca;L1z>6HZympbe@RT$MW zu(Ei1u7rT8(f!><<>%NFX3b5Mqy5Gm6=Z_CgH02})I)iBXn434D0blexyrIR?Tu&> za=0T>IHpC!p;Yfm|0oxl>G{d=?QdVcI+p5;>Q&T4fJ6xMv;0ZFeBA)}MSjAsw`<BX z%Cl5S+gbvN#;SI&<h8FI<Ds+U9JAo6u{*UL1@)fcCXj5-TCl@#@c^J%t?jx<4LwFz zpEW9Rjd#mTyle<(L(byRCDS8$NYEPRmvN3}mR$@dvKcWkVo``uly%LqzFwpGt&hr} zMhe~xlYE#lVg2>Xx0f8_GpuuIw;&|MS@01b7JS_S!5=^T^p~Gsi}OfHUUYKv;>)Ss zN$0_ER0``<<KU1)rk!pvG~VNd?MXR2YE1_ED)R`692$M68fj5A!Ntd^E*BlFa;4J< zP?hY)JO4?@l{tC5;AP7&Cbn>dt-5DpzQ@1Q_{2-ALs7_-lB<2XW|xw2U&OL(fJeNi z_PPrwT^IQTK=<pvy{PSL$l`fgwdP5Mn^Z6auaKv&i(S>t_CG)Wr{AQ3i}}1PXcSGi zPF?e~0TN^%2I6^8vDB>xgxwP*>e5LV2~Z~$J?+ZsFOk{VcBA&IJ`VkLB(O@m?c~!Z zyc&};2nt(l2e?|X=Xo9!ZoWUMjXk7-UBIY^UlEb@V)NXNo#C-FL1x&lZ3kBK-~GzV zFaO6)Ua!Br*lpX@#1=rXXflEFo}O*;4UX&2S6NpubYItJBZg@6<zZ_YC>5{rYsw1A zF^LFPrF7o`(H!`trH;SI;<=q6EuR;}=qA6twTX3>NZsJD4plikBAkrJ74@TmU;kC> zmNGD=Cjh!lB;l?V<D3Gx$XzlXjmj(zs$7KoCW=o+%EkMT(DEY2^9L~4<>FV^KAhD# zq<sDP(+0Pz?%Tc^SY`r*XH(4UrVcjWWC2KL18`kQ)XiaE|Kk5zo>i8++WQWKIS4Vz z^$$#OGB0||&-;m2OmH=A7PJuumm|fk0tU$@tLb`Z1Q0*rmet79_;V&`Q{E*0iI42D zd%S>K4R6MJ^;cEsbN0@zfGhTDR^pWbZjIDwwQ+|rm_Q8EbSwgtJ3%yQ3C=D&jgm?P zof!+g6l8jIC|RLbfp5C&N{neHfO%rPc6~-%UJQckrpo4E)xY}cKty^jboI)aWOH_k z;*ARnNua_E2Qgt<;Q&8ho?m~PfU6(98Ov0vQtPQ!&PQA;6Y+*Tt}@@yF6D*q(D5-9 z?a*pEC0DU}>*{s49qSwl+?#E#Feo+-uVXuZ67J9d03jerL_t(~sb&&LwHgjHMPdbe z&f}aSi^_xnHrct`Xw_287_K&-f)fD4ci#mYV^c7eyup?~U6)_4rqS**n-iGk4<BED zp*240?5{r;ssM>BxWZHAS7&2gP!xjKpF^l+k1lz}^Dn;vs`X)6*B7x&xbC?kp{<=( z@;10f3F`!4G?Jve&kl>@N;A`i;Vv4i5b=kwU7GV+N$XZ98}?P6CWm2lHHT|tn?iV6 zwR8t%?9pd252giFXSxkS0e2vX-{V4V?Nnf;7<0zD(z@D_wU_vTD!CLE6*(aM;ZOhN zw}1XM4Z6b9(+Tq7r)OM%TLe*0{5q4Sa_1Smtl4a5abzi<=q)ZhV#OJk7XWzu^5L7R z8WZB&Wf*E4iP00&<+_I`A&LIa<1nqO2aZ!GXFCMYdZkxU8)1&qh9iMzygtbs*q&}5 zu-()*&B~OCVN6(Veo~X6RVjdPELb*e-<ll9(I+=pE?*&%XSs;3deYc3aKT!pXJix? z^s;=y0NrfD0I}}RAM_RBRy4_6HYFTi7p(&m%l$#6KWlxLv6Ep+iIw|TY-Tm2chYe* z=<7ld1!OL;NKeP9(cb<*&3!m`w52_%mR~%XWVGs30@qaP{WAC8e)tB}oU%j+4uf^V zUcdz|`M=$6$_vi1UVv#0M`#ByF;rpWOPEsn0{ROBub(D?8{dV8kZ(b33^2pDIcn;E z#a~{on#5x>NxQqhL9gK1&4FE*m#dbe^Cl)GccJ;?2CAx5F-!x<_6cAtqObNVmm|gi zEPHd`H{*bH=1rD}O}F-H^sV3nX|A=9bVFkV&@l<P49@SDGhRpUqYxMd{I<YciCjxL z2T`*HV^)YI;8h~1a{k3zVHS{J1xr9F4l*Ckg^1v_u#DSQ!LpxVOkCN^UKytgLBA6I z@@4b-s*3O8WbSsGb~h~B4#y4R;zp$uV`HuHK5-+Gg!Oui4iamzv_{IQHhGv#vOzHI zU80`}Ex3`G6pu6}wvn=^Qu`VjJ=~77y)uAzC%D=psoMi>nxh4I8?KFA92bVeTyLQh zwp_K^G?wRBUWK)&Ze;;h^9d?$UPMiUl5$EL+I<&X*Pg!PU3n&r8rBFESM2LvY{Xq) zpkN!z26f{(jR(m)kCLDsT246&<PS~4q%@(*3{ldn<N?V{dGyaIWiKb1-^^igs)abu z`mE~^dn$PwHw|Px;gId~s%-*tdiv4>U;g8JZ!LPKHx#h;We2S=_q_8KP_f2a!NRs| zY&%_i-S!Tn3c`+)h-31i5+K%&;Mf8E9u())OlOfS{?ZjB)Wy5*1rTC5ZWo%M;6!uG zI-W=Z-y*9v080V52@{!mks5ZcT>?x2f5h<_Dd<|JE*u{2)Td<u+Rn!#CBp$1nirLn zhldNBWz6)rZgehPd^qRefsJTgW8U>jZ7I1^pcZNm&7frmeSG38Tx*dPYvnW(Bz!wU z)pAD`844&abOyz~FlJn-M76gp4;L-L4({dz+h%c1?x1`1CraA3gIKWWUWhdm;oRkO ziU-++J+K{~I7K{M2+T^A=VBD@2vk_7jbv?)mLh&*5z(!eOt?03*?0aCy36uInwDF4 z?beuuW**%&H+S6S1R~XV!J^I!Ut%~=jP~NapMy0x898@JjJ5J=;A10U)Kfwyn7KE0 zhxQ}QAo+pdqzg}5Jae<gL@;AfOG)w?h!@Aj2iYPhSXFu=1*n*S%2pzX*r3!qM@jzK zE{1SqV4N+AP8p*X&)<Si@XlZbDrSvi+d*uSCWK7nCF(4!(+e%74TRY`>giCHt&<Q$ zfBgy5)9cZ|Whv-maMJ3ep+dgYIO0Z~84MH~^DVMnWH9+fEe&!QN9?!7WMv>gU<X0O z%~)t!0q6~zZzdpFitb3j#8?$dy_sDVsyllbI*8`Kd9;u@4z~88s8+3mBBxDL$+0_3 z>!66rFqq#J#22wGz39!Dr^VNVl9;$CauYI&L@ukO>5kM~L18bnOTB)=Jn{M)7$SR4 z;E997t$CbrFg&eKHcWo|*(VM~6|ZqqQ?9>O!&q+~vvGuM%p8(uYT9DBk%s&~Y`kTj zF1WQxr|H@_MAjKbOr0+m1W*eTFoLKM3$#Q?pLpsQ=#DElI*K-ZZ6gKihUNTyYiX^R zK+DMEY5BDLQb0+T30Q|&A9=`jt<StFyNX+FNlw_;Wtyi?KmYQ>H;8%|lGCDVtYMS> z6w{l5%F`qS-jm)Pw&!TDzN#JoRP8Z?b1~_vWXhO!?<$KO3=XKoX%XI>A)saX`1MN; zsLXt=d!G$37Zm%34zVB*B`_K+FeYHqKSZe&B+i(}_K?4$20+Xt(kGrWe)m6W2Xzeb zB+tMn$*a#M=Ba1zdv$cJ&0?YYP|ra3DDQ9UK3%4t^tT!g1N!)JS<)fHMwGPr7q#|@ zkIG~Ulwwm=1*}-IxvO%rT+9pv!89*(xVD$iMik-*+Xfb|2q5qkD>QuF_I1tY!9x8o z)}ZPhQb1ws#hVwp1{mi%$wCrt66D8Gq9sW~LURnAO08x0LFCr^Jl`Kmk7^#C7I~ct zkp+x>!dlLMs{)XiRT+;YEg6kgL=3*mw|T;cFG-;T<nnoW`qzNZJ*g2Vl`_?lwKPr? zMSJFAn6Mk0Chsb^S>DDn1{g0)VXy&-y<0~&S($R$!5aYgSN!X?0z@f%2m@^{K0`v) zt9tViWTHYfT!3=^D{RySUOG+KX%L2?$-ZruJ~sBaX7<J^KCW9uM6OLnDz<i)Z0&uh znuKLZWl`G+lr>0*G|R<qwwr$agy(AwcG5Dzaae#~?u9x}y+ugPrA}X&pt{KBMG(to zo;+I{6d|=ZBr<b~sjee4lI!Ie-*Dq<oc~(eAa6cjMWI;UdlhWS>nU`&498t(NylvM z??jSWp08s96OOvGPHTv_(V6eH`T)$`btT^_VpOwJdIJ_74PV>oC!$a`W|HMXE?2Dj z4Ii)btyrh|?Qb8qWEHc+Bm=$#9`H@~mT{k$kR%CFuSv+>#vpmuh_ySbrM)nVsO?<J zTyfKWqVBL=1RB}l*2oZC2WEtQN>?&1Q9U{9OBZ;A7d@F{ZOxJF4tZjE;m$50DZgo` zNsJoJ(7A1yAE-<Z*YJK(w+$PUm%3B)^VV(c4*+#Wq*+S9={#QmV8*;{FUqSJ+}O!Y zZ`d^mfMw=w4o*h?q4hMXDUw1WaLd=;hFmTptrFPy_U;0mpiyB@a5FIp^In0-rqtTY zYM&EA8$*@bWg*MMR4|<b;{S!3kBa5rTqzX`0LXWKqUF;I3&|}sm86|#Ai5|yM$aJj zbEey2N8dvuq!7q{zmty>VM3>lsyqr}(4q<uP1~#<!(_dQS;@^~jai=(vl&FH1q0j3 zo8`VWh~9}T1x><H$|;J!WU_!G7%skANJELl3G5-9bO7?ae7$+@Uk3$*M(Fa_t@g|t z(6fQ-_%`oS;*2phi-|75V^Zto-B^G7VaL-hli*t`N{X3ZcfD2CTA&K{=2oP~2QBkO zwX*`{JMLp+3bnfhCF5A9)TOhlXJNi#vm|-+bW9jCAyNezRe%fZ($TrX;|Z=Q2rj~7 z0$h}V(-Q)=nZ`r5{J-p9`Lg_J`f{z{L7V_uqlh}*5Y5Zez9~n<bMBVNms7R?k_lq4 z2r=!rH?fKghHbw+sT0Zb^G%&vY+W``)W@ncI+=gxN_^BqGRp^<H&r|JP9-PSX5ZNv z+IyuMh)A`6&tNY2UZtFw;+MiKVvCJfCu$6cbH6323(d3SVG}@Htth*nT!}k+Vj-rg zcm|#1kN!#i0lFrIOUb=BlUT3}>d7Wg&zJ45U<nW<&ZwZOh)4KYk%3Fc^k~%PP$-ZF ziDXS6qng)di9rBcL)&o|D0<3V;UQb*NZsiy_uGbGh7qT^DB0n#&fQ@k*j7Ogi0Gsy z>Eu)E(lFI_a`vqCy7@&+b=a(^yP9iAl^-O8?u9u}rawC5NmiF{9kR0YWtk^l$~<|< z_pTiF)SAzqrUn1XBCl}HVTQL<oDkx4$|UYN@D!t_X`a}A^VRksxPXmAtX_hQl3vbs zg7Lh8fXmKyawm#j*=|nFbBKG@49D1^7fg&rDr}#E0HN9c$h;fMgjK;Ppj7<7Y<_oM zOHHk9Sca3agN+NZHEMqwvX(Nm!9fupSl?3~8d%rspX8_4eT@T>hw${V|Jq;wIKwVi zfv6FSH(^SdQD}YwB2+v+JypR1nSkX39KYBek>r$}300<4_Q+k973{R|9JiuiQtOa` z2E_TVY*jGEhv72Ku=4PXM@>MHB53iQh&(;O+}rO4WTCwmQc`fej4It))O))dDvyC$ zif)Ljo9cJGRJL?Rv}R~l{_gG9pXk#K*k-pdsfaLzlAqkXz}Ed4`(-T_ypk*$PVXab z8SD*a<%+I~OundG7KR#XsyyAPJM)k0sfz7EXJ|I3cMRJ&lL!O<F3V&v0b@+Mb7CC_ zOB;@2r<jOH84_<w(FX<6o;fMni>Cl4+AWx=j9ps3Z9VH$YVT$ZbMce%t;tSf|A}+@ zw~zokE4g03Wiv+PFbWIm`U<poR^NX%))$v~15ax}rCg2{Yh$w1XSIp8fx#r~%qGq$ z1mQ7q)Tx)IplfsMjQ*~p??UD`2EZbqLwKUIP1O>u2Lp_qtn?pRExs|xJist_K*c1^ z#C2_<Q?+}J2qV70)^ze9B^XcXX~h|R;R9!^xST5h-#g_vAIO0cY@9qpl^_kGCnrF^ z@S;KdP=GB)!Gku7Qg{6oKV0YAC(w1`WtI3)-JGF~zDl{#!hAsj{W{y%g|W$<mL`7! zqV~>$$WGCko;W3yh-wI1$cWf#t6{P<_p0L;^b`%3TKg2si!7lDQm?-QxR6KXe3^7# zls8XMfwK{Du*l>qxZhcE5OOa=@J2G=uJ0miHs0ipeL@#<3^szlJh?Hzg5651-_v@^ zTj%;!mkqD8rbiNy8`b(7#gYD?dCF342a`Ik>;JE@tL2j9*s*udk$^xZNYD)m*kFJS z7MK_;@sHkLuwWlpU;_giH0S{Zsz8EFARvJSQbZ`KYQ}Ha%ygfw&WsP~>V9l`J|do8 z!Nu~;|1b(>z-9V}Ri3|9&&8Qu$#fWIS}Rwc18-t#l+L}*Oir*H9tp#3D12GKLaekW zE4!~9A}rkGEO}%O3{%r@y82Nx#{eo6UFzOc>e8Lt+J!k`ja@tuE)m|VCm2pBa8>pD zo1PGWjJ2!7Ce2|Ff$MCyGl=>dcC|;tm8#<#$n>bf=o|MU4~}X4O^lxc;7v;&!CVlT zSRvr^<Nq?%ye47*d&J%3ZYg_<B+dX@fHNu8QgRt#Ht>^9`*1_I_H-H|IB>CQit3g` z_&CErr&G2Ys}L&$hvQJQjtF^j83}O~t<k-oV6}Ur@d?zm#Ht%(ju<eed|mzaGVHK5 z2mEuoiPW@`vX%Y2<eG`rZ^sL}Js)54I2SRUd^0DrGEZa0QRgz-enpe=^5DQYfNg=D z1Qsm7DGQEZe*`a@?lKWa$lD~-XWnWP^Uwf2^80vu4?-G2#agXlX)q)tsmH1Qt?4Lk zBoR}%Kw)SDFJ*XG<km3fB;U4j-ue_RWk{li11#8XC=O1ZYJ~X~dfgq`M2Eqn-bkM{ zH%9giw16Mh3IyRm%1vij#5%ff=KEer3Y^t>K5uok6|!K3FPmSxEgy$Q!3zD~=WFnp z4OhHllJ!a~SRx+|ww>W{9V<bINf_G!f9`gjgk)XLV>f2Fr!lxsQ>LflqliqMydS56 zl<Ycipc;HNs&!pJeTMAcnMc{vrRimOP;T5Q574G(Wy7I9XSAW4u3A<hcN_>7-Z-vj zW#S<Y9Gj^uCM*BV@X}X|(a5|RduDfWJuKF#rEPaPx+HtM+*REHV_L&w+L?UqK@+ts z6_NeIU-Wa=;s8NzWY4s+c>!3vRvu0(f~z?_)`AHTIeUssiXx;PsMA>BrPBCi$YE`~ z_<I7H$a4-=qL(s52t@9O>S#UMjor^xjU<TuU6~k2uWITX6mtS86+uyS<CYZChtHk4 z72{<H!8QEX)t2a_EtsQMCleuN66_9iUj}RDkM{8e*!VUF?>c>Ns?byoXo=bF;u!VW zOm9!Fv!l<gdN<wd9jNh`EUp@U;n<(^0)FTT?OT)MQMix+kVSCbKr)Dz4A6!%See;B z^TJ0kT>D~WHUh&VOMT_fTQxwaH&p$zG^t8=z^jN-duHSy7l1Fg9_jaaem$^mdo)>i z(~vWR9qUnk9tTq4aQ$#{+V-<nD#Z4E8exBneKu%p#>QF{!G#LmhQSVQZvEfvEJD3I zcjt|M&^CwtJ2a~S-~?G>-M;*<?J+U%kO&flk?u*&>`AcUq|=1cUo~cC5>yKsuDZrv z1X|Lv=!&x8928=DydR_&44(2gbrAC}UvGygs~HG>m_Vqzv5K7~;jmX2t{)q*K4b)i zl`z{&&)!;O5+yJ}#u+190XGk$@n||sGFWl2WhX?Z%TkAnR;9=F)7FCV%=QG?ee2yC z8<>_i{QSF|h?zEAL{!3{js`+REDP=jlqF6J1{-^zkIWG0DLN>(UHY)NY64=Nk5LPq z@#)xV)!Y@XFbDtiqu_diHDeCk7k0xDc|*jHL|jUi%?$$gqTGv-q~M%EV+e?;gIrO8 zYR7YC%cmjjASQAn2ghl^&Q`*(nzpl!RiC|Qp2|*ofbE{IQ*P%)deZFc?mIKmo6>?O zbP`s%X^MLsA|${jJ5+>XxMA)2IA}HBp*8}{J2$2wnjl~~VdO@cFiGwCa>zi+A(iWg zVOaJ!-3jDMt@)y?J`R9-E+~1;6N_bXQl(yXFJOVDC2{7m@FLL2Bud`i<S^8!I8_kF zosbE^dU(tj$9&Ce#hRs?p+~Rc*<*^IbjWP4aksg$4ZHZpDGZU8i}}HFa+6F7Lj`8U zen>}G*bM?97D}tHQG1uq-MDPR1a_-Xf<Kcw@+}ChZ$ILun=cN0J#Qyjz%Xb;NVeGQ zM2+><H82=}w$o&D7F+^z0U!&`j1Ztze%bF=DxF+RtfLy&>4B0LI$md_i+a(Ur-rW^ zA)*H&KED-vf;6WyLcdK7h%Q6yMsA%dL~UwI)&r&zY;+|!Z@b-kIpR1s5nzGq=gz|b zfyQe}$GQWMb}%(SYd$n)$Yfc+Y}*g-_OIJwJGS#9Jh58bHI0mTaJcjrg8xf2IBqN{ z-Ha^TPEarj*2@=cz8@0{(TWFGWT_@gm+D-CyiauvG~b7)QUJrhA<Kwks=vkX%XpEE zK?8vnKzCK$vb^^Yw?M2THy(zAmdR?1?S*H<cNPL%cM%`#zp<P>nUdlL?AgRL^Lnb? z5oeMwML5Nm1pv`+|8tXf$a?KIEWs1dJh_L1ZZYzrN4HhuY5%sqeiKo5V%jdeEgTH6 z!M>YHz`~7Y%fynN5Ht*;YbIZFu6SuL`<-`)`WBry`-TUO8%;^;r^ft&vYR0DMCOEH zCm7()n25meVUK&j-br^}9QXFyx30a9DtHmVZ^QrHiP`)Cbmr1a(i;>v^$ULczrR4{ zOIybx8r6=iXyzGOHvqln$#+xtPF;lF-_#Af@MZn=1Ey+|PZLi>_KE$(mhW)HAlFK1 z9Ojss<bNQ2x3TzqDS{ySuop!}32fxeHps*4hq*9{H`%8#gQwNO2--Ddcf#CqwOjC- zH%Y0BhyeP2^Fqs{-jPg$9L{tZsGPvZ@iTtH?|_}l`*FW|(ZiUFurm~TWcoteNKH=8 z6JQll)&Pn4AxiE?h(P%5$KQnh-s$r!u4hK=os^IpfZ}2+F2m_;+Ioj}*V99hg%^(f z-?-%F2mk?FO)W&EEZE+wi#+kvJLO~C;KJ+rk=wQ#?X@$cdF_V7^uB4b!-=Wpyg4~! ziz4p*<_~vyq>jMbU6K=ZCuT%W;(A%XTyFqfHUJ+r<lana)fP$E-2z*36B_xZf>uVp zZ10PHUG&<9MY8?+Ga&nZ+$Y8oQMsnMr<>a#epm@M4Kk!xtRpJaR8|@OSuotBfiz7x z49r}uZ<$sh(6;NSC%7%Mv|wQkpG+k>?j}tmLR{*hLG5vdIiwlQ(0d~C<2UKi1d)}_ z5P~|G9c&QcVxpVRT{e)y4EPXW`HRg3+YWNh2Nm5Sg$;D_=ee=e`~gWtYihtw>-*(5 z{qM6kW$X4|7qWf7>VCLQg$-Nf*&0)J039SBMOqRRsS<Ez2e^L6eP=%wE6}>!i7U;R zX(c#;`&(=hh(6Zax1iL+q1tc-BW}WyGeX)&x4Hz)gUv}qO9JNj0f%^oG@aq1znn)~ z2OP;A&TSYV5|ooL!sP2^`}ukW{`loXi7StSM*Y`F5~Z}E`V1#M{PGLo*MG?x9!=Q( z^T*}>`Tlvs!^J~tD8bYgrYJr?x4a~+>kmdv+K1F!kJD$_ZI3C8ppXY}hRxtyNSPuM z(;n)1GX-<Z^C5U15oyvCLSX6^25ETRr|@UTVfoGXW2e55(;S*SneiYahY=Pms!j6* zxHxn5Z{3s{2z_jZ%jGL!|HHiVDY9F1?}e_9biMYtW}iIoUXYicabA}XB&tU5s(<SB zuC9;u#KZh8rqs`~c7L8ZgwCDjdypo66+Km6Q1MrdNK(3z*S#(svDj`ifIhUn$C|uR zH;G4_fSiGK37&h5uX2;OyT}A2hcydheVB?3cV*vK?G>`eWQ@6WL+V05NUN?_0C)!! zx8@4pfGe*v;1L+xUZ(V>W3)4DfZji7-_I?J7~hWtpW??%#OCT>X|?9BXg%fQw1m{G z5A@?LmLM=2xB$&8ow5$~nWbtS!DLo8$ktTQ#FHLy=GkPzd;S_pHlfZK;my^a{DusG zp3rbjcwhWRJ-{#mtw{y!N%5v3p6Rz-9A5xri%4rY1h#K+JPb*)u~&USdrSEV8}(Fa zY|D76Y|eoGj>}bnH#-e5oFDJF`~h_?a9XqFo-q_tsaU8zB+ia{!KsHh&UD6Co0xjz z?DUPV%Y+nBurwN{8L;h-&SP!nr690plsGSXf}JyLnMwFqa#{DMXYtc*r?E8FR`Evl zISrg$N1H)|d@SKi1>ETp&XBMJxG!(-pOljDUV)`8Ng*S#XCjion<Ak3dD}Q0egFLi z7qoUlzsf}}A6Cd_fw_&8=g@mR)AH>RX{qOT!w9{47`+Z6Zc#-;6;K<K%sP?P&K9TY zt=t^74L{J$tvx7bUWDC<j2O#?6U3r2;mq9BT;77wo%fxjPxPCu5d)N}OKqvHH2UfY zjAOtLVGWD8m|~pRK7B?`UH~5}WY6AW&9>v=vPxjl_nBmV6Ra2gXkcO#`MiO2RHt0u zp3Q8P8S5Kz`lR5{3r6&)#Bw2bu)OvmeW@56vP$<xO7mApB4N)ctce2$FHCStf-9Rt zSa60ue*jlyu@vOi7_P`Djb>2ALCJX>6_<CJMFZgw$3kb@U~!U7Wd_Y8>@@Bn2CZ}& zHi15@(X?4_IDu<Yvl+ONi(GD60wq8+xg^@O44$SBo+Hp+i>7<vWBEekwUrlE=Wk9k zOf*_W6Qe8_qoWdrVDm<XV0%HK7Z?Gg9>(YpQ<y?rPcL>Rqw{aakHbC4MVmkk+C^uc z39mknfZO0*T$JE&-M3SCQ83E_)!Qd)m7vsZ*;{`H#IednuLp!SxfZ6vKxYB08PC?q zURMaP>PX%q_^u?+V+Nl9mGI5A>ACTMQhnZp^wb-*Tf6a(3lI6}+%+5u5NqSfa+!}b z^+D$hH0dq@)(k`;hJD)=;fm6znjy((VZdG&scy@<nLr&lbk}ARod47yY01J~01`x_ z2|#yy7iK^<huWWdjAeqC$)Qe%up8scn=gMKw!PgipFYj>+eh1exYN!y!X=;|tB}cH zEGT=1ABNhc6oE~_+zU_hijQ(Md-lXU?Hz3L=%R+D2^F9bM*Wm-tIhD4Si>h*z>3|6 z?rhR)z}etVL~z$OCrD!-$vhISV3P4eLk(HhWy!T5+}KL34G5eTB8)R_r<lh&bXJ_( zg_sz&+jUp(1pq%{9L+G0Rl}GDH!-~i4m=)i|NXX~SiTO^^PDZ)K!v%_kO!rhZEgzL z$eV{M<z(D@C*R|nU*e^WKUL{RKG0Uew_UiR$XeAjs(tMK%vvt440?zFoo3RAzfjSL zgP*SarjqMZQDPE68@GPDTenOhDMz74OJ}UaIRke<MX_UB2)ll&VotXmZXZnjS!6_@ z{w3Q=0KP7c&b@7BJ;sE$FZf%_a5mUrv*$qb+XfFFB{lAheLE9zWEAKV$5uM&?77e( z)U%OZQrx1oVbi=FOn_b0o{1bb8jdsZ^E9>X@5nUf`qrh0>2Ya1=Z`DY_h3_jg&eb& zj3|`5O-rnaqvfZlK(D3?a2L3xTMo7Ju?;Or3X%|B*ZZGe!f8tDn0bs?87s6lbx|cy z_U+9!)bd{A&h_`OpyRFu<hY=Nm+p0p<WD?Nu9tJ>`#o+s9#6u?=jKkl$>DR?ldHmy zZ>*&59pcJ4MNfHnk+*S4o03L@rYQr?UHz~oqL4nPrF1t`AZ-J~^3h$b?>VTzuJ;A} z!+KQ%OlUZ^_qR5RjZrx4AI$}I!a2L#;vKN|g2`Kymrm84fzhZ91s0<ai<5WjOf=CL zTQNK$gwb3dd7ukXyGVjZNyM1xVP!XVzDbWzavvL9Z5n=5X+&4Wi%K}a9?7fkju_1@ zoxw=8UpeC2@QRuvjXa{h-4Qy_DFdKk@t|5+LnmDT5;ez>zmX4H3%CwF&LGF{)NCi~ zE+1Nw9g%Iz54;wy3<?WxEwP?Mz*GWVNRk^ph==1y<b2uj<aMI`28FYyS>!G&wdez| z&`()LFhkvdoYPrHk(qi8W)Wh?V^1~*hX(p)OWG2o8RRfBFW%JgbKI1pVljZR;;^PY z<Bs4Fh}ftbcJ`8?48!kldMX(1)rMvW1qQV;p%I2w;KUyYYl$K|apg)j=99N@0&=4N z_-W6pu+!WI7A(_>O&>YQQk~{{#%EBcH~KdBS&{k`@Rr7W$c-Z=Xu2SU&2{d$NU*mr zkuXLjIBmEC3qwdw?PjE`lw$o}N-_1|QUY8Ez)2!atZ(3DySkkyYjKEc@~-i?_mfWI zJ&1Y(r7~1nTV2Wp0*jU(-i<?Q(1~UkT%6^GpY5tSsvj=*z1406EXMx>a@qL2UkB)G P00000NkvXXu0mjfOEjS? diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/presentations.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/presentations.pkl deleted file mode 100644 index a432f1b89a9019fe763669260ec422f2f5a80940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37441 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 RGtf7}OJ2b&Dsu6t{}0Nz;ne^D diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/raw_eye_tracking_rig_geometry.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/raw_eye_tracking_rig_geometry.pkl deleted file mode 100644 index 2f14c2acc7bd4836835416b471e78c5c8cda1c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2145 zcmc&$&2L*p5Px?3)y4^`+KBcN38aAg!J|ov!~rR$Mu_$iQ-a!tL-bfbuf31>eXws| z8doWTLsLbp)K=X}gaZPJHa&3T#wiDm?S&I({(<(ywan~$PVA&nKMw6!^6bpcZ)ay_ zJ>&0kw=a|oP4YlU{3eM^C*ag<apF-W_kBbJ`B<-SsiWVkE2<*%b`z9Jj`!QUzM$ME zoyhcvPui46N|sM|0%vhHk(I_*7T|!xgTN+Trjgko5%}A0`}C51#s?h$*s#p^*62Bx zI3Dw3FYG4w^x}?i3Fo8>{%lU2z>frv9RYBe*M>?KAuerlOIgNMRm(KgH8rOyR>m5= zs@Ry!H$^w32+4l-KG;~9WPeCzR#d%SKl>O+e_1m^HP$eStlLy_*r6D>y=;5lw$vSv zE^BF&2Z9JU@WHl8+e&ULx;qt@6GfSR6T6`Y9&GeA5i}yomxu^>*QU!M<*wd?kXvrs z#t5|CFmZ&tM6pVkQHN7lG;Jb4h(pvS!f+oDuCwjT$I?@XQ|9!t9<M^S*oZvxq{4CH zx6#iW^1f=ZQ+1h-1mOY_DszztLS+?kL1B^6XHrNcJH%ecs<0!yniQ<!s$%0Z+uBi! z4|deTz*?L>mq{M5QKi)u(%prs)>OZ$P9y#CW%Z|ZpqpW`Z-&YKrk`*yesCX1o*$Hd zpG(iHZEE~_eN&%z@Zy$TqMzAAel(-cEmy0We|mPy&Ui(n?>~JkiK|uE^F9hPySp$$ zy~4Nyg<+oz{zP<HYWIE^xmm$5Wy*g{`FhIlr2KBmH&Q-7H93yB=jHU@8`@uww^O;t z-BjMmpAzeAf2_G(u|i*}W&H?VG=79y#pBj$_Y7m<?-T!Be{2|E+?n`%<<PeLPw86p zSD(D{^Lv-R1v$~ruWvm3bK}jim&KnPeO6cc4c+L9Uf{dXbQE)C!GYeuiDF;Np$=^- zw#XJ`vG(EY)H!n+8tsd(u;1u*Fv4DgoU#MEpI-r*guW7ci@nV%>?k|Njw23QP1>UN z#13s?C)f%0&U2$o_AWd5jHv9EuSqu5kD*tTESxkaPnnZ?lI93ZKE?LSLIWpdq@W!_ z?6R;#Ix+6lWXWrD8#ZB_mKw1O!w%jW^wo~*;Jku2S4@Ugj7j^2)!DDR6Nkait<?_W zuL`M{Fr$=md;=+d9`L_e`>gW7sV%K7TcfF##t}ed4u=l>Nx-q(`@>*+R1iI<7gXFZ F{|B1M(0~8{ diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/rewards.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/rewards.pkl deleted file mode 100644 index 1b1876db5d7bc36519e7131e9ecce28016d3ce8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmeH}dr;I>6vua$U0G2OQn5`(69pli6%><_<P0P#JEEY(*huSdcYpBP+z0+1tOz8? zOY+D2l9HIP@?2agUo*+*_$t&HrBaA=(1c0Uq5`Axfp&k3%%IlvPc!}F{o{Af-h0kH z=X+=8eonfyY(Oq@4BjJ=FzE<JsWsE2GM*-kB;rTEO|V3`!!AXB87K|;@-np!FCu>G zNPoSFC2133V3bC}L?n<jgZQzb2D5g<ilN`g5$_v^4|w_MKpnY>WRx0$!TDU&Ceor_ zZo+FgfEvTghHW9UbSUve6K70J9;(yG8CX3*(?l}Pr>04**~G9kr)6<CFLO8|-Wlt1 zxRfH5C>w=|H7FNFBVUzR<&=%6iM&k5CMS|Yh-76D_ECw4_MLcfDvFGZjChQP<D&{; zktR=2F)GPy;DkGJVf99mVF_cRpqb!Ue18^#){#0yVrO1z60S0m%fTrrS6=aV>S@B1 zARHAf%p)XIev!NkpG~v4DqhO4=0v255eyO=V#k>zu7;XGO%kM0ieX_ARZI?|rt*^b zX9NX5BS<6&3SA`=iBcx)UwUIR8}e^+@@=00`M%VU7xRmI_&@#!k8i#zI_Sy3AxrQ( zSI#q#rcf31hq7>`xyIe&5)0#7H~ujvmV>V@mA$TKk|5J|&U_%%0;ghH<Ews1fpz06 zME1vNP+h5=o?G|<%yh}}Y3khqVPDUgdD%Au6f4>b9&}~E>OXguyS=p)mL;WU4R&q? z#l@G-9<0j(%k}Ox&c9|sRkx=%)shY823B{{5jl_^{mZtZ_8hSJeRDs4O)m6hez7Hj z*ap|u9{=)=IS*#rPoB$g{t%qkCtdYU*$$^4EvW72<{{?CX_E(z=0lTp+y*AK0FnyB zv~hKX(E4+i`+TAZx&mA79^GFA5AIB8+i|}L8YGWGrSZkEEO^T7mX2bm80}`bwzLE; zj9c<hQe6T~mJru7uBF)jwGe9*g4WZn>aMwEuxRI}%3X9Bd~b0ZXu4bmLEmcI`q%FO z|HhkC=iG8g==U$^QJ2HjO*ghX@BA3<o#^lAUB3(3ru7`PPpkl@UssTkTLA}}bM)<P z6|lEzZFA6}-SB()tQFcTyMgezb<At=C-Bgd>KHt|2Ue%8TySerCG>bIyz<_xge85V z;LIJBuqgYt`RI5hc#jzzFYc^_*zaPU@~W$#nm+uf?DHzvy(s<N>-VZ4@5b!bI#(-P zN|`JPudu?N<%{Jtfz@!=^QU?I<{DV6sGj1UUjs4Wy4x+*8i>8n-raks25g(ojFo59 z!YO-ZGeWgM+w)5MBI+SH%I`svt{!Y`)L!@edU(TYSzpi1da%cxT{mq;1N7c|<vr27 z2C$aA|IzJq8*~?5)@`h{!7+>VV%=dIY%D%3pXb&Hs}_d2AGy;A^Ut4{!QF3!T?<=| zaNhgi`ezLufvg?QC;OM5+-?ViU)JXzX7TXDtO*!N8p`Ww&N!asuo$s0h5-HFeTBjt z)NrN7VXjgh&sQnIESWBFj`F5_1dL%4Jt5dX#)zN9P_u{;0c0BDNBJuQ0+j)d_CZQu z+#||`AEgo60|wzFxCqQs!oUeTLA>0UK&$a4=BZr6=`rC=*px8_y;guU=Cfpo(40^` qNrh4Ilpe1+Jy|6=1{c6f)tKtIhY`Al;eJMKBw51IM#Ldbqx=hXm#qE( diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv b/allensdk/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv deleted file mode 100644 index 98647b066c..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv +++ /dev/null @@ -1,4 +0,0 @@ -,x,y -0,2,-3 -1,3,-4 -2,2,-4 diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/stimulus_file.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/stimulus_file.pkl deleted file mode 100644 index e2757a53c9722e706def9021bea62831c1e03433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmb`EOK;Oa5XbGj+PDP@<yl^RL6?W4gfwa*aX`wAl_HeWUM$OxDY0<u{&&}ra<IfD zs`#9I5ZE{c@d22_?(F=3Gdnx`y<Wm%qG?%HqG_&Rm#B$ta|~$~ERtNp5Dg}FO(;#G zZ@!{T<x-*Pp;cl_?EDdEL77(A_Rwa$##_8iDyZZn(<B!`s!V++%8L2bvJ>T!I`bmc zNg!pgbbLuso+&MhNITfsP)-(aRP1tVg<E4g#O-U`nPQJ|n>#Dqy#ZsrydnqpM9s8w zImAA<xP6WLQ#@e2E^HJ1h=-HO<nu3M)xs@}N8yk07o!>LeyX<ru;a1DlTfrxJuQ<U z_0#+-4m><%C7y|v3EzzBxrZ0b!%J38X~QZVNR2}?z#4ftV*iw(EXFaf^E#0#aWXUM zrzZUsn;r57Zy5ab+HLZt0jN;bpD9u*$uqwwk{D;=)ZE_d4+s5T5W1H%7`f+z4}Evk z8=Sk{i)a{+F2azyeK6q|wCcv!$(-;eiUUn+*ZJ$<?bzA+**;i5)w1wzh4)jqMdvrr CY@b8` diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/sync.h5 b/allensdk/test/brain_observatory/behavior/data_objects/test_data/sync.h5 deleted file mode 100644 index af448dd04c4c202e73bb742ffde67b50790603ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3448 zcmeH|O=uit9L8sNTMd<>Z9NoGSn)85W}Oeai7Q%D6N#d=*0!dUWI8+hW*xiP+0M*v zH-_k9sUM{k^i+yPX@#~TdMTm^Ev>W$4}ypX@zR3@FCM*k(dU`}jQOeuK|E;QygR@5 zd7uCL&inD-?3<&*kFQ;G+Zv6fuTNX0-I6r3$M0$Bu9colXa3%_kxThT$}@Rs<TU<i z+QzhhT{{2LxE<R^Ml?ib^Jh$lX~rsPEnZ#buJFHp0;3~C+qlQEbfZ~5&82yk?Z4*6 zF56Q|nC0c8S-{_9PP-w=UwJS??@ngO<z?ntI$ySorMiH8XC(7hQn;9mSgrLX{rS91 z)R%rk3ON`_DHeqCT%UGxt}EBR->Ye@h4#PJes1eC!#ORVEmB*&%H_+*zOUWY%f0_| z&+@#IYtQnvkmkn*bc`Xn{yJZZH_16NYQ8Mbmt*thN^9i=mYl$31s%w>M>dNwi(g~v z(WgYeMM8JBg80w0{#ns#m*|IggUG;_NcbBj#GfFcw@ixv3JJY&pZFdL{X``GArktI zuJ|<)`sp5s`45xO)*%q<nIWOK9|hsRO+wr6i2oW1z2~_2$4Th>-xL2J2|aOI{1YVf z&`07QCZW|i@jIW2-u$`vM@jhcMe)y*(8E{6cjrV0--!P)34hCX;vXZS5Bw<p7bNu9 zRS^3-M?xR`8N~iBlF-lp0>b}*gg)}C_+OLIJAV`ZBnka0e`YZL0tvn2MiBJ`3H|!b zAp9>$=-s!1sPB{XZwKLDBB96c1W`|u&`0h8;eSO!*GnMkCnWUAG6=taP;~qdh<cfX ze|acj@7>41yw>}HENH#%D45fF>z)*SYMc01N%-xZ;-4p>@7k46`*0k@`+g!Z|I1Yn z^;;79?291$Yb5;uM4cm{KRW=zpV6DXQ*-z0mEw$EQyt$^XzIhNW9s)6buVZ)V--3< zJ8rdOXEIcbG!2%Lfq=-JYBiJ-x-rKsFtU+VKaSwo7J^krHDl+`o>`8M-7t1ye=2#c zWmrbPY4w`}n5tqKl}&cZ7<kYeNEQ>tLF>AqX2mX7EW2deR(UW9ZTL;)G~B9c@a21S ztL1c}>88g$@e|>V*Xe1!5X3>v4{C}*uD9QbL%&{EVK$ER+$qyh-Bu8_!z2zJ)}oGu z(f?Gt;d}d>NHwD%)W@+39vN;W*&cOAg^?dLv0L3LnI-Gq`as#Rl~*lQZEJ9_%ylG} z<u~h2Jl#spoA=pPO>dg+q>qbSFpXKl71M}=*ljp+(|q3pn`|SwX?XJo?S#mlbP49{ EAIbSdCjbBd diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json b/allensdk/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json deleted file mode 100644 index cd7caa9ede..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "auto_reward_volume": 0.005, - "blank_duration_sec": [0.5, 0.5], - "n_stimulus_frames": 69195, - "omitted_flash_fraction": 0.05, - "response_window_sec": [0.15, 0.75], - "reward_volume": 0.007, - "session_type": "OPHYS_4_images_A", - "stimulus": "images", - "stimulus_distribution": "geometric", - "stimulus_duration_sec": 0.25, - "task_type": "change detection" -} \ No newline at end of file diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/templates.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/templates.pkl deleted file mode 100644 index d52342cf4afc2267c7ce3df305780bd30c74f10a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20736642 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%0A9Y*K)kgYOW2$- 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�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≥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�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�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�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 zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*fE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vH zAP3}t9FPNYKn}<OIUon*!2ieIzhz0TW@~yLn&wwkl1LpWiqvtC#g-JB7ENJOv@;f7 zTud9YVCE4kb7khUZ@%##0RvzUe0loZ!2u3%fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0Wz=3~S2hRV~*B{UCe|Kf=D;qD5YhLZAZ2p#K$8Fy?^Z4(t^Bs9E z?fPdP|K~sUdFkicAJ2vB;5z*63V04Y2c84p0}gP2103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aNy5$p!(MT z<JZsYd@gx3uR7Q<?^xRPZ`tv-@!8+}nfJVLo-gO!`Hy)|b-VA5SJyk|*S}@+*YQyY z+`O}T;j7NK_MP=Fb-*w6zE}P4OaIvC9P^q#^QDe>S=WAZe(hr%e`~*7m#)u}U8mNS z_x)I&7xkb2mCJvo%ijB*FVB~s|2e<`4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W@aH-(>JF<boOz5o!#TdS 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%0AR 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�I6 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%0DYVz39}8J-WSROA^|UBIk>y4<9-X)(CwkeCi=>`s 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ͤ*5}-rANY}azZa1@L6G`m>VljuIrOuC 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�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�#%*I-8;;jdnQW&M)rx2VtjqDDSZ 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�TUn@=yll+-EAXc`Ds@ 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 qTEt*s)KJ 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 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2|9?AmOauT30|879 zOo)01J*fW*ArTP|c)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 R@PG$A@ZSTqUhQ;l=L|`zVA=ox diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/test_input.json b/allensdk/test/brain_observatory/behavior/data_objects/test_data/test_input.json deleted file mode 100755 index c9de2233a5..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_data/test_input.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "log_level": "DEBUG", - "session_data": { - "behavior_stimulus_file": "stimulus_file.pkl", - "ophys_experiment_id": 1234, - "ophys_session_id": 999, - "behavior_session_id": 1071270468, - "foraging_id": "968ff5ae-e0d5-4661-bb6d-242bee28c7ac", - "full_genotype": "Vip-IRES-Cre/wt;Ai148(TIT2L-GC6f-ICL-tTA2)/wt", - "reporter_line": [ - "Ai148(TIT2L-GC6f-ICL-tTA2)" - ], - "driver_line": [ - "Vip-IRES-Cre" - ], - "ophys_cell_segmentation_run_id": 1080628312, - "rig_name": "CAM2P.4", - "movie_height": 512, - "movie_width": 451, - "container_id": 5678, - "surface_2p_pixel_size_um": 0.78125, - "max_projection_file": "max_projection.png", - "demix_file": "demix_file.h5", - "average_intensity_projection_image_file": "avg_projection.png", - "date_of_acquisition": "2020-12-17 10:01:12", - "external_specimen_name": 544261, - "targeted_structure": "VISp", - "targeted_depth": 175, - "stimulus_name": "OPHYS_6_images_B", - "sex": "F", - "age": "P156", - "eye_tracking_rig_geometry": { - "monitor_position_mm": [ - 118.6, - 86.2, - 31.6 - ], - "monitor_rotation_deg": [ - 0.0, - 0.0, - 0.0 - ], - "camera_position_mm": [ - 102.8, - 74.7, - 31.6 - ], - "camera_rotation_deg": [ - 0.0, - 0.0, - 2.8 - ], - "led_position": [ - 246.0, - 92.3, - 52.6 - ], - "equipment": "CAM2P.4" - }, - "eye_tracking_filepath": "/allen/programs/braintv/production/visualbehavior/prod4/specimen_1050612336/ophys_session_1071202230/eye_tracking/1071202230_ellipse.h5", - "events_file": "/allen/programs/braintv/production/visualbehavior/prod4/specimen_1050612336/ophys_session_1071202230/ophys_experiment_1071440875/1071440875_event.h5", - "imaging_plane_group": null, - "plane_group_count": 0, - "cell_specimen_table_dict": { - "cell_roi_id": { - "0": 1080639771, - "1": 1080639729, - "2": 1080639652 - }, - "cell_specimen_id": { - "0": 1086633380, - "1": 1086633339, - "2": 1086633332 - }, - "x": { - "0": 422, - "1": 185, - "2": 2 - }, - "y": { - "0": 147, - "1": 2, - "2": 336 - }, - "max_correction_up": { - "0": 20.0, - "1": 20.0, - "2": 20.0 - }, - "max_correction_right": { - "0": 10.0, - "1": 10.0, - "2": 10.0 - }, - "max_correction_down": { - "0": 10.0, - "1": 10.0, - "2": 10.0 - }, - "max_correction_left": { - "0": 0.0, - "1": 0.0, - "2": 0.0 - }, - "valid_roi": { - "0": true, - "1": true, - "2": false - }, - "height": { - "0": 1, - "1": 1, - "2": 1 - }, - "width": { - "0": 1, - "1": 1, - "2": 1 - }, - "mask_image_plane": { - "0": 0, - "1": 0, - "2": 0 - }, - "roi_mask": { - "0": [ - [ - true - ] - ], - "1": [ - [ - true - ] - ], - "2": [ - [ - true - ] - ] - } - } - } -} \ No newline at end of file diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_data/trials.pkl b/allensdk/test/brain_observatory/behavior/data_objects/test_data/trials.pkl deleted file mode 100644 index 8a87d8a2d99751175c66db5198f0eceec0533b63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78578 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 !E&1sBtaGG>FK z<iUYJq%z03BL2DAP$l-=P7hhy&!AC=G?FgP>O;=D(dntclnry2(0q<WW|mg({fNvO zek~%+oDI7ZIAem44|5`E+K|&f*E{Z<mkoh3`#TbmuP>{=`hnCP5~(;iKO5}L=8Bw0 z()G9Jv9n~uf%HwhPRPl}pIFN~gH|or!bwSM%9If%el#r_2$KFI6I0s%KO`jH8!E3; zV7l-w8>$N{UwuXzUvZ*yeV+{rzw>F8BRLXH*0X%b2LB;Ne+^{2WJ-N3GC$zWl}_YW z%WW&<yKoN3ez9;xetddCzZv;?{v8FukJ+%?adoyU(q%z+Y%?;dY!!#%r)+qx`<X5c zS(Ea;wFfEDn`L9%oeiv4e>7f4o~dTdHU69pwM%Zxzd=quXNdPkV)t%vTMpq2J5d!^ zhcqZw*sS|48~U!E<~oNwBg|(06-g(xd-ulSY!KP5ClH9_3A_~6f-Ei`{3bP$4YG^N zyCRT_K257?LDnn}7hV4yS3tMW%1C7AT<N6m$lLplh8*~j4c%^T-_9XZip(w9sB&QX zj&%lB$WNKv>d%nRgIu?ZQs+P<l|V%#vb4>vdL~T{M73LPJBeJPq#*qOIeB!%jnXG7 zbA$A>9I!o&`_CXJ*Cr<a?0DZ#z6&U65#t`SuKa=}PYxLL@H(DDCdtv}Zd{oIg`^wQ zo@DY2@4b(#5!V!A<IRD=_e)(4AoD(`9?3-Vk?iIAko#x1rS9O%0XNPOmq=vJa`V<M zq*Wo~%N_hV&|vJiArWcs6D;-vsmEl-dvFzIqBGO45a~8_`O8cJ?2n4d^dvHgS8-Pf zvV#9Zz36I6QB1iIiL_nhFEV^2mjiZ-9%%~7|B<OF`ymp(?^;i9?XiEo{V6;DHwlTD z>caKd?K>&OL}<mQr*BCfrlj?6cF}@)7XFNtOJOzqdFRCYkj8VF%;FZg_`M80T^pp2 z!``#AEOVha@R+$8Qi_JYEE?Iixsa_9$*f-aRlq72nvdBknj%@&FD|@`q;BG(rnk<8 z46PIThmq`}omy9s2~ihzaoFU7RdR&<X{1}kR*@ITH2Z+f5~p)PK}TV^3v&L~h=ona zfIBS_Th8P{==Iy*W01~NmUc9@xnL9awn!aWV!M4wE^_j#1F<M7=wGhjw95tk))JBn za%ydS#$2wpeJ=1wG89!KC)XyX!!()&vMi32wEn+N&NsBmG7RHe>T=@TENK!VGgxkB z$8GASRP>Ur%#ndE@k6rC=Fw-z&CIhiUFDxJjnSF8d^M#^F_DVS2?9~fN+D)$Wm=l0 zeTdK`$S7!iDX{1LopW}Lw{w>C<$mt_xvu-VulqSpWIEHoSNC>Q>^b>z+}S+rnY|UU zxO1-Wu`f>Ab8hM6lDw|CbFjR>ZN5Egr@h&;&7Qyge(vC9dmg>=&Bn5Aac9C0$DfSa z^Ns7XKJB&Vp0EG7qwtlub9Q%PWUD>5tRC@KuRSL%K6bHqyVdP6eNlVPzVcZ`pFNAd znsB0|JMMfr|GmQ-yfeRc;(2@SpOYIae>Lu0{r-jP8|*oyVb_*F?RoG*&qMV)?B{;I z`2Bb6nfVRUf7Se9(}mY>b?vW$!rrcsJ+IEq8}+$8gV!6jR_%;CkDULcW4k>Mg*UJK z)t+0<9KKe+EABj8vhceP?AhF0aJuNVxO3{p*<-8hnR#0J)2z9F?vaZJ;?9A<`u?eJ zWn&NdwUGYsp1;snpL;5sM0#NOL~W$$Qrx-LK7PTz%h}jN4jd9pyE%R1m(JSaM3(i3 zl=%N(ddb!e{cpecc*5EE<L;l1*mLO5;JJxQE?rufa30M)<nCJZU+gm<-&H!MKH(gB z_uJC>Ph?}KpP{HLu(o$`Hdgw3x<`9{?%uR4;r!hlSaRH+4~%|r)1Au`&W^oLP5;Pb z>mKw@u@TL!71cA{aAZ_YPO_NohTCjGNZw3$lV_zHZXcjkyWzDS&1+QmEGxAx-7Sfl znv_J98;*MLvjYJUTF5#)0176&c?=!Yp<bcB3>AfeeUjdohRT5X<P7FwLo-l8UMf&1 z;R!$w6=q1D3^D)|0`lAu7(@oZAb64jpadoO)(1s}Ozz3hlV>vS@Q0qJk%<fivOH@o ztP!|VkN~L9u1dWDciIgb=#c^V-bJ1P5MUa^K`EKR9V%p6h715QQUvZmDM7g-V2zPv zpp29<s7gJFROo;wlsiP_lsihiAPR-j=Ri(TCUB=2lv;}t6)jB$AQdQ-pa_sjS!7TG zD7^%h0T7ux0($V+5(i{-hzA97rXWM`7^Gee0zeraLA~<FojyxhqeEL_mmn1~M*5aP z9w{j7ffPJSGI(U51W-f~fPxp91Vxz+04PX-0+1nqC_FL(9Rzq}khP%5019*vd>hFm z4v<1wPU+ALb!a0fw1H|a06`9*P--nGj3fY%X<tMEBt<4`sAxF7pxmLSUP=IML<fOE z0w@WZhLom(`u2c=io77e9T_%g<Bn2u0Z;*u4Y}7wa?c&T1OSPW`IdnK82|x29a~aL zR8I$)Hob;2bszwbX;8?x!xeYz29PO$${(TxJqap^5+D=w25Qp_`R2+M89XTTYQan< zh59nR2AOQg8hY}K0CTaSX$XKy1qvlR0qCLP4GNX%50A+VIvyYq7$9Gaq6A<RJb4A6 z1SR+$02CE6`6ok9uF1H=A9|WbCNdPr@~pM6M&M3C0-!#-DiKww-LQck8G!Fy<QV`J zrZF6pk{R5gLZ)TN03ahp;0}}$lsf{}7)b`oNGXG=)RRbs4tPSjLsU+=qr?lMP$+#4 z<P>EBcbY+|wJ1^1(qsTqfkFw20GX6U1|@*fOJErQk+~zF2ahdrKt_jnP#|XtG6au7 z>eV0sl;IK7D}UVSvy?SDv?X>4QXylcZyDr~g2En1!J{ODM+Qm&MHB%jc#%m^l<5F~ zf)pqK83KsHBO}m3fJX*d3yKV&KnKCMkxb$MDU{`u4$V-9HiAMMsOAC?<Nyk#)`G%F z0sxuzMHE0%WU_{ehSLkm9eV1e1kgrw5EvwYlAviwX&R_+4=AX}3j*AcVS_gAC^Z)V z6#&_gdu=55+|f$_kSLjN87Pne5YW@HC8b35bdYJ&Yba9(0`Qmyg^W8~amQ`|nF6RM z6|z717h39;nF3R|-X3GkIR8&G<lBFUF{#tz+-)YCN>gQ~n;B-NsWvrUx4CaYbgR42 zy(xt<Q*Nf1d(2dGuL+oGrs5_Qy#E#?>7mrjGP4JFh1R>Vyox~Oj6kJpH;4@nt_ww6 zGb)zX*z$DK%7|;7d-r+m!Ir3pEQ*b6U9qOYg0{%G?Yz!8^Kz3v_mOi;>KvUq3sUEp z)LEE1i&E#<)OlO#^u9+Kwe!RK>}#8);r;fAjcklIx3o2{irDYFMOvDhLhcT?Zdl#u zy4;uSONzb%`oB$j&tXlDPtC}=J(Y|bJTw%I*x9k+4Q(B(-B|vzU|VqcnqX_l<_)c( NwxD-mA1B%v_y@gOW?cXP diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_licks.py b/allensdk/test/brain_observatory/behavior/data_objects/test_licks.py deleted file mode 100644 index cc97a936bd..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_licks.py +++ /dev/null @@ -1,182 +0,0 @@ -import pickle -from datetime import datetime -from pathlib import Path -import numpy as np -import pandas as pd -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.licks import Licks - - -class TestFromStimulusFile: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - cls.stimulus_file = StimulusFile( - filepath=test_data_dir / 'behavior_stimulus_file.pkl') - expected = pd.read_pickle(str(test_data_dir / 'licks.pkl')) - cls.expected = Licks(licks=expected) - - def test_from_stimulus_file(self): - st = StimulusTimestamps.from_stimulus_file( - stimulus_file=self.stimulus_file) - licks = Licks.from_stimulus_file(stimulus_file=self.stimulus_file, - stimulus_timestamps=st) - assert licks == self.expected - - def test_from_stimulus_file2(self, tmpdir): - """ - Test that Licks.from_stimulus_file returns a dataframe - of licks whose timestamps are based on their frame number - with respect to the stimulus_timestamps - """ - stimulus_filepath = self._create_test_stimulus_file( - lick_events=[12, 15, 90, 136], tmpdir=tmpdir) - stimulus_file = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) - timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) - licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, - stimulus_timestamps=timestamps) - - expected_dict = {'timestamps': [0.12, 0.15, 0.90, 1.36], - 'frame': [12, 15, 90, 136]} - expected_df = pd.DataFrame(expected_dict) - assert expected_df.columns.equals(licks.value.columns) - np.testing.assert_array_almost_equal( - expected_df.timestamps.to_numpy(), - licks.value['timestamps'].to_numpy(), - decimal=10) - np.testing.assert_array_almost_equal(expected_df.frame.to_numpy(), - licks.value['frame'].to_numpy(), - decimal=10) - - def test_empty_licks(self, tmpdir): - """ - Test that Licks.from_stimulus_file in the case where - there are no licks - """ - - stimulus_filepath = self._create_test_stimulus_file( - lick_events=[], tmpdir=tmpdir) - stimulus_file = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) - timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) - licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, - stimulus_timestamps=timestamps) - - expected_dict = {'timestamps': [], - 'frame': []} - expected_df = pd.DataFrame(expected_dict) - assert expected_df.columns.equals(licks.value.columns) - np.testing.assert_array_equal(expected_df.timestamps.to_numpy(), - licks.value['timestamps'].to_numpy()) - np.testing.assert_array_equal(expected_df.frame.to_numpy(), - licks.value['frame'].to_numpy()) - - def test_get_licks_excess(self, tmpdir): - """ - Test that Licks.from_stimulus_file - in the case where - there is an extra frame at the end of the trial log and the mouse - licked on that frame - - https://github.com/AllenInstitute/visual_behavior_analysis/blob - /master/visual_behavior/translator/foraging2/extract.py#L640-L647 - """ - stimulus_filepath = self._create_test_stimulus_file( - lick_events=[12, 15, 90, 136, 200], # len(timestamps) == 200, - tmpdir=tmpdir) - stimulus_file = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) - timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) - licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, - stimulus_timestamps=timestamps) - - expected_dict = {'timestamps': [0.12, 0.15, 0.90, 1.36], - 'frame': [12, 15, 90, 136]} - expected_df = pd.DataFrame(expected_dict) - assert expected_df.columns.equals(licks.value.columns) - np.testing.assert_array_almost_equal( - expected_df.timestamps.to_numpy(), - licks.value['timestamps'].to_numpy(), - decimal=10) - np.testing.assert_array_almost_equal(expected_df.frame.to_numpy(), - licks.value['frame'].to_numpy(), - decimal=10) - - def test_get_licks_failure(self, tmpdir): - stimulus_filepath = self._create_test_stimulus_file( - lick_events=[12, 15, 90, 136, 201], # len(timestamps) == 200, - tmpdir=tmpdir) - stimulus_file = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) - timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) - - with pytest.raises(IndexError): - Licks.from_stimulus_file(stimulus_file=stimulus_file, - stimulus_timestamps=timestamps) - - @staticmethod - def _create_test_stimulus_file(lick_events, tmpdir): - trial_log = [ - {'licks': [(-1.0, 100), (-1.0, 200)]}, - {'licks': [(-1.0, 300), (-1.0, 400)]}, - {'licks': [(-1.0, 500), (-1.0, 600)]} - ] - - lick_events = [{'lick_events': lick_events}] - - data = { - 'items': { - 'behavior': { - 'trial_log': trial_log, - 'lick_sensors': lick_events - } - }, - } - tmp_path = tmpdir / 'stimulus_file.pkl' - with open(tmp_path, 'wb') as f: - pickle.dump(data, f) - f.seek(0) - - return tmp_path - - -class TestNWB: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - stimulus_file = StimulusFile( - filepath=test_data_dir / 'behavior_stimulus_file.pkl') - ts = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file) - cls.licks = Licks.from_stimulus_file(stimulus_file=stimulus_file, - stimulus_timestamps=ts) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.licks.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=Licks) - else: - obt = self.licks.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.licks diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_motion_correction.py b/allensdk/test/brain_observatory/behavior/data_objects/test_motion_correction.py deleted file mode 100644 index 57994bc7fe..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_motion_correction.py +++ /dev/null @@ -1,116 +0,0 @@ -import json -from datetime import datetime -from pathlib import Path - -import numpy as np -import pandas as pd -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_files\ - .rigid_motion_transform_file import \ - RigidMotionTransformFile -from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ - .cell_specimens import \ - CellSpecimens -from allensdk.brain_observatory.behavior.data_objects.motion_correction \ - import \ - MotionCorrection -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .ophys_timestamps import \ - OphysTimestamps -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest -from allensdk.test.brain_observatory.behavior.data_objects.metadata\ - .test_behavior_ophys_metadata import \ - TestBOM -from allensdk.test.brain_observatory.behavior.data_objects.nwb_input_json \ - import \ - NwbInputJson - - -class TestFromDataFile(LimsTest): - @classmethod - def setup_class(cls): - cls.ophys_experiment_id = 994278291 - - @pytest.mark.requires_bamboo - def test_from_data_file(self): - motion_correction_file = RigidMotionTransformFile.from_lims( - ophys_experiment_id=self.ophys_experiment_id, db=self.dbconn) - mc = MotionCorrection.from_data_file( - rigid_motion_transform_file=motion_correction_file) - assert not mc.value.empty - expected_cols = ['x', 'y'] - assert len(mc.value.columns) == 2 - for c in expected_cols: - assert c in mc.value.columns - - -class TestJson: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - with open(test_data_dir / 'test_input.json') as f: - dict_repr = json.load(f) - dict_repr = dict_repr['session_data'] - dict_repr['rigid_motion_transform_file'] = \ - str(test_data_dir / 'rigid_motion_transform_file.csv') - cls.dict_repr = dict_repr - cls.motion_correction_file = \ - RigidMotionTransformFile.from_json(dict_repr=dict_repr) - expected = pd.DataFrame({'x': [2, 3, 2], 'y': [-3, -4, -4]}) - cls.expected = MotionCorrection(motion_correction=expected) - - def test_from_json(self): - mc = MotionCorrection.from_data_file( - rigid_motion_transform_file=self.motion_correction_file) - assert mc == self.expected - - -class TestNWB: - @classmethod - def setup_class(cls): - df = pd.DataFrame({'x': [2, 3, 2], 'y': [-3, -4, -4]}) - cls.motion_correction = MotionCorrection(motion_correction=df) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - def _write_cell_specimen(): - # write metadata - tbom = TestBOM() - tbom.setup_class() - bom = tbom.meta - bom.to_nwb(nwbfile=self.nwbfile) - - # write cell specimen - ij = NwbInputJson() - ophys_timestamps = OphysTimestamps( - timestamps=np.array([.1, .2, .3])) - csp = CellSpecimens.from_json( - dict_repr=ij.dict_repr, ophys_timestamps=ophys_timestamps, - segmentation_mask_image_spacing=(.78125e-3, .78125e-3)) - csp.to_nwb(nwbfile=self.nwbfile, ophys_timestamps=ophys_timestamps) - - # need to write cell specimen, since it is a dependency - _write_cell_specimen() - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.motion_correction.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=MotionCorrection) - else: - obt = self.motion_correction.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.motion_correction diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py b/allensdk/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py deleted file mode 100644 index bd1281e9bc..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py +++ /dev/null @@ -1,91 +0,0 @@ -from pathlib import Path - -import numpy as np -import pytest - -from allensdk.brain_observatory.behavior.data_files import SyncFile -from allensdk.brain_observatory.behavior.data_objects.timestamps \ - .ophys_timestamps import \ - OphysTimestamps, OphysTimestampsMultiplane -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest - - -class TestFromSyncFile(LimsTest): - def setup_method(self, method): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - self.sync_file = SyncFile(filepath=str(test_data_dir / 'sync.h5')) - - def test_from_sync_file(self): - self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} - ts = OphysTimestamps.from_sync_file(sync_file=self.sync_file)\ - .validate(number_of_frames=3) - expected = np.array([.1, .2, .3]) - np.testing.assert_equal(ts.value, expected) - - def test_too_long_single_plane(self): - """test that timestamps are truncated for single plane data""" - self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} - ts = OphysTimestamps.from_sync_file(sync_file=self.sync_file)\ - .validate(number_of_frames=2) - expected = np.array([.1, .2]) - np.testing.assert_equal(ts.value, expected) - - def test_too_long_multi_plane(self): - """test that exception raised when timestamps longer than # frames - for multiplane data""" - self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} - with pytest.raises(RuntimeError): - OphysTimestampsMultiplane.from_sync_file(sync_file=self.sync_file, - group_count=2, - plane_group=0)\ - .validate(number_of_frames=1) - - def test_too_short(self): - """test when timestamps shorter than # frames""" - self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3])} - with pytest.raises(RuntimeError): - OphysTimestamps.from_sync_file(sync_file=self.sync_file)\ - .validate(number_of_frames=4) - - def test_multiplane(self): - """test timestamps properly extracted when multiplane""" - self.sync_file._data = {'ophys_frames': np.array([.1, .2, .3, .4])} - ts = OphysTimestampsMultiplane.from_sync_file(sync_file=self.sync_file, - group_count=2, - plane_group=0)\ - .validate(number_of_frames=2) - expected = np.array([.1, .3]) - np.testing.assert_equal(ts.value, expected) - - @pytest.mark.parametrize( - "timestamps,plane_group,group_count,expected", - [ - (np.ones(10), 1, 0, np.ones(10)), - (np.ones(10), 1, 0, np.ones(10)), - # middle - (np.array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]), 1, 3, np.ones(4)), - # first - (np.array([1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]), 0, 4, np.ones(3)), - # last - (np.array([0, 1, 0, 1, 0, 1, 0, 1]), 1, 2, np.ones(4)), - # only one group - (np.ones(10), 0, 1, np.ones(10)) - ] - ) - def test_process_ophys_plane_timestamps( - self, timestamps, plane_group, group_count, expected): - """Various test cases""" - self.sync_file._data = {'ophys_frames': timestamps} - number_of_frames = len(timestamps) if group_count == 0 else \ - len(timestamps) / group_count - if group_count == 0: - ts = OphysTimestamps.from_sync_file(sync_file=self.sync_file) - else: - ts = OphysTimestampsMultiplane.from_sync_file( - sync_file=self.sync_file, group_count=group_count, - plane_group=plane_group) - ts = ts.validate(number_of_frames=number_of_frames) - np.testing.assert_array_equal(expected, ts.value) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_projections.py b/allensdk/test/brain_observatory/behavior/data_objects/test_projections.py deleted file mode 100644 index e9a2cf6aee..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_projections.py +++ /dev/null @@ -1,107 +0,0 @@ -import json -from datetime import datetime -from pathlib import Path - -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_objects.projections import \ - Projections -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.internal.api import db_connection_creator - - -class TestLims: - @classmethod - def setup_class(cls): - cls.ophys_experiment_id = 994278291 - - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - cls.expected_max = Projections._from_filepath( - filepath=str(test_data_dir / 'max_projection.png'), - pixel_size=.78125) - - cls.expected_avg = Projections._from_filepath( - filepath=str(test_data_dir / 'avg_projection.png'), - pixel_size=.78125) - - def setup_method(self, method): - marks = getattr(method, 'pytestmark', None) - if marks: - marks = [m.name for m in marks] - - # Will only create a dbconn if the test requires_bamboo - if 'requires_bamboo' in marks: - self.dbconn = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP) - - @pytest.mark.requires_bamboo - def test_from_lims(self): - projections = Projections.from_lims( - ophys_experiment_id=self.ophys_experiment_id, lims_db=self.dbconn) - - assert projections.max_projection == self.expected_max - assert projections.avg_projection == self.expected_avg - - -class TestJson: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - with open(test_data_dir / 'test_input.json') as f: - dict_repr = json.load(f) - dict_repr = dict_repr['session_data'] - dict_repr['max_projection_file'] = test_data_dir / \ - dict_repr['max_projection_file'] - dict_repr['average_intensity_projection_image_file'] = \ - test_data_dir / \ - dict_repr['average_intensity_projection_image_file'] - - cls.expected_max = Projections._from_filepath( - filepath=str(test_data_dir / 'max_projection.png'), - pixel_size=.78125) - - cls.expected_avg = Projections._from_filepath( - filepath=str(test_data_dir / 'avg_projection.png'), - pixel_size=.78125) - - cls.dict_repr = dict_repr - - def test_from_json(self): - projections = Projections.from_json(dict_repr=self.dict_repr) - - assert projections.max_projection == self.expected_max - assert projections.avg_projection == self.expected_avg - - -class TestNWB: - @classmethod - def setup_class(cls): - tj = TestJson() - tj.setup_class() - cls.projections = Projections.from_json( - dict_repr=tj.dict_repr) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.projections.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=Projections) - else: - obt = self.projections.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.projections diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_rewards.py b/allensdk/test/brain_observatory/behavior/data_objects/test_rewards.py deleted file mode 100644 index 08737eb20b..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_rewards.py +++ /dev/null @@ -1,110 +0,0 @@ -import pickle -from datetime import datetime -from pathlib import Path -import numpy as np -import pandas as pd -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest - - -class TestFromStimulusFile(LimsTest): - @classmethod - def setup_class(cls): - cls.behavior_session_id = 994174745 - - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - expected = pd.read_pickle(str(test_data_dir / 'rewards.pkl')) - cls.expected = Rewards(rewards=expected) - - @pytest.mark.requires_bamboo - def test_from_stimulus_file(self): - stimulus_file = StimulusFile.from_lims( - behavior_session_id=self.behavior_session_id, db=self.dbconn) - timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file) - rewards = Rewards.from_stimulus_file(stimulus_file=stimulus_file, - stimulus_timestamps=timestamps) - assert rewards == self.expected - - def test_from_stimulus_file2(self, tmpdir): - """ - Test that Rewards.from_stimulus_file returns - expected results (main nuance is that timestamps should be - determined by applying the reward frame as an index to - stimulus_timestamps) - """ - - def _create_dummy_stimulus_file(): - trial_log = [ - {'rewards': [(0.001, -1.0, 4)], - 'trial_params': {'auto_reward': True}}, - {'rewards': []}, - {'rewards': [(0.002, -1.0, 10)], - 'trial_params': {'auto_reward': False}} - ] - data = { - 'items': { - 'behavior': { - 'trial_log': trial_log - } - }, - } - tmp_path = tmpdir / 'stimulus_file.pkl' - with open(tmp_path, 'wb') as f: - pickle.dump(data, f) - f.seek(0) - - return tmp_path - - stimulus_filepath = _create_dummy_stimulus_file() - stimulus_file = StimulusFile.from_json( - dict_repr={'behavior_stimulus_file': str(stimulus_filepath)}) - timestamps = StimulusTimestamps(timestamps=np.arange(0, 2.0, 0.01)) - rewards = Rewards.from_stimulus_file(stimulus_file=stimulus_file, - stimulus_timestamps=timestamps) - - expected_dict = {'volume': [0.001, 0.002], - 'timestamps': [0.04, 0.1], - 'autorewarded': [True, False]} - expected_df = pd.DataFrame(expected_dict) - expected_df = expected_df - assert expected_df.equals(rewards.value) - - -class TestNWB: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - rewards = pd.read_pickle(str(test_data_dir / 'rewards.pkl')) - cls.rewards = Rewards(rewards=rewards) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.rewards.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=Rewards) - else: - obt = self.rewards.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.rewards diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_stimuli.py b/allensdk/test/brain_observatory/behavior/data_objects/test_stimuli.py deleted file mode 100644 index a094ec6ad0..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_stimuli.py +++ /dev/null @@ -1,125 +0,0 @@ -from datetime import datetime -from pathlib import Path - -import pandas as pd -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.stimuli.presentations \ - import \ - Presentations as StimulusPresentations -from allensdk.brain_observatory.behavior.data_objects.stimuli.stimuli import \ - Stimuli -from allensdk.brain_observatory.behavior.data_objects.stimuli.templates \ - import \ - Templates -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest - - -class TestFromStimulusFile(LimsTest): - @classmethod - def setup_class(cls): - cls.behavior_session_id = 994174745 - - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - presentations = \ - pd.read_pickle(str(test_data_dir / 'presentations.pkl')) - templates = \ - pd.read_pickle(str(test_data_dir / 'templates.pkl')) - cls.expected_presentations = StimulusPresentations( - presentations=presentations) - cls.expected_templates = Templates(templates=templates) - - @pytest.mark.requires_bamboo - def test_from_stimulus_file(self): - stimulus_file = StimulusFile.from_lims( - behavior_session_id=self.behavior_session_id, db=self.dbconn) - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file) - stimuli = Stimuli.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - limit_to_images=['im065']) - assert stimuli.presentations == self.expected_presentations - assert stimuli.templates == self.expected_templates - - -class TestNWB: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - cls.test_data_dir = dir / 'test_data' - - presentations = \ - pd.read_pickle(str(cls.test_data_dir / 'presentations.pkl')) - templates = \ - pd.read_pickle(str(cls.test_data_dir / 'templates.pkl')) - presentations = presentations.drop('is_change', axis=1) - p = StimulusPresentations(presentations=presentations) - t = Templates(templates=templates) - cls.stimuli = Stimuli(presentations=p, templates=t) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - # Need to write stimulus timestamps first - bsf = StimulusFile( - filepath=self.test_data_dir / 'behavior_stimulus_file.pkl') - ts = StimulusTimestamps.from_stimulus_file(stimulus_file=bsf) - ts.to_nwb(nwbfile=self.nwbfile) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.stimuli.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=Stimuli) - else: - obt = Stimuli.from_nwb(nwbfile=self.nwbfile) - - # is_change different due to limit_to_images - obt.presentations.value.drop('is_change', axis=1, inplace=True) - - assert obt == self.stimuli - - -@pytest.mark.parametrize("stimulus_table, expected_table_data", [ - ({'image_index': [8, 9], - 'image_name': ['omitted', 'not_omitted'], - 'image_set': ['omitted', 'not_omitted'], - 'index': [201, 202], - 'omitted': [True, False], - 'start_frame': [231060, 232340], - 'start_time': [0, 250], - 'stop_time': [None, 1340509], - 'duration': [None, 1340259]}, - {'image_index': [8, 9], - 'image_name': ['omitted', 'not_omitted'], - 'image_set': ['omitted', 'not_omitted'], - 'index': [201, 202], - 'omitted': [True, False], - 'start_frame': [231060, 232340], - 'start_time': [0, 250], - 'stop_time': [0.25, 1340509], - 'duration': [0.25, 1340259]} - ) -]) -def test_set_omitted_stop_time(stimulus_table, expected_table_data): - stimulus_table = pd.DataFrame.from_dict(data=stimulus_table) - expected_table = pd.DataFrame.from_dict(data=expected_table_data) - stimulus_table = \ - StimulusPresentations._fill_missing_values_for_omitted_flashes( - df=stimulus_table) - assert stimulus_table.equals(expected_table) diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_task_parameters.py b/allensdk/test/brain_observatory/behavior/data_objects/test_task_parameters.py deleted file mode 100644 index f73f827ea0..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_task_parameters.py +++ /dev/null @@ -1,67 +0,0 @@ -import json -from datetime import datetime -from pathlib import Path -import numpy as np -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects.task_parameters import \ - TaskParameters -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest - - -class TestFromStimulusFile(LimsTest): - @classmethod - def setup_class(cls): - cls.behavior_session_id = 994174745 - - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - with open(test_data_dir / 'task_parameters.json') as f: - tp = json.load(f) - cls.expected = TaskParameters(**tp) - - @pytest.mark.requires_bamboo - def test_from_stimulus_file(self): - stimulus_file = StimulusFile.from_lims( - behavior_session_id=self.behavior_session_id, db=self.dbconn) - tp = TaskParameters.from_stimulus_file(stimulus_file=stimulus_file) - assert tp == self.expected - - -class TestNWB: - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - dir = Path(__file__).parent.resolve() - self.test_data_dir = dir / 'test_data' - - with open(self.test_data_dir / 'task_parameters.json') as f: - tp = json.load(f) - self.task_parameters = TaskParameters(**tp) - - @pytest.mark.parametrize('is_stimulus_duration_sec_nan', [True, False]) - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture, - is_stimulus_duration_sec_nan): - if is_stimulus_duration_sec_nan: - self.task_parameters._stimulus_duration_sec = np.nan - - self.task_parameters.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=TaskParameters) - else: - obt = TaskParameters.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.task_parameters diff --git a/allensdk/test/brain_observatory/behavior/data_objects/test_trial_table.py b/allensdk/test/brain_observatory/behavior/data_objects/test_trial_table.py deleted file mode 100644 index c82fdb37c4..0000000000 --- a/allensdk/test/brain_observatory/behavior/data_objects/test_trial_table.py +++ /dev/null @@ -1,181 +0,0 @@ -from datetime import datetime -from pathlib import Path -from typing import Optional - -import pandas as pd -import pynwb -import pytest - -from allensdk.brain_observatory.behavior.data_files import StimulusFile, \ - SyncFile -from allensdk.brain_observatory.behavior.data_objects import StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.licks import Licks -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.equipment import \ - Equipment -from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards -from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ - calculate_monitor_delay -from allensdk.brain_observatory.behavior.data_objects.trials.trial_table \ - import TrialTable -from allensdk.internal.brain_observatory.time_sync import OphysTimeAligner -from allensdk.test.brain_observatory.behavior.data_objects.lims_util import \ - LimsTest - - -class TestFromStimulusFile(LimsTest): - @classmethod - def setup_class(cls): - cls.behavior_session_id = 994174745 - cls.ophys_experiment_id = 994278291 - - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - expected = pd.read_pickle(str(test_data_dir / 'trials.pkl')) - cls.expected = TrialTable(trials=expected) - - @pytest.mark.requires_bamboo - def test_from_stimulus_file(self): - stimulus_file, stimulus_timestamps, licks, rewards = \ - self._get_trial_table_data() - sync_file = SyncFile.from_lims( - db=self.dbconn, ophys_experiment_id=self.ophys_experiment_id) - equipment = Equipment.from_lims( - behavior_session_id=self.behavior_session_id, lims_db=self.dbconn) - monitor_delay = calculate_monitor_delay(sync_file=sync_file, - equipment=equipment) - trials = TrialTable.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - licks=licks, - rewards=rewards, - monitor_delay=monitor_delay - ) - assert trials == self.expected - - def test_from_stimulus_file2(self): - dir = Path(__file__).parent.parent.resolve() - stimulus_filepath = dir / 'resources' / 'example_stimulus.pkl.gz' - stimulus_file = StimulusFile(filepath=stimulus_filepath) - stimulus_file, stimulus_timestamps, licks, rewards = \ - self._get_trial_table_data(stimulus_file=stimulus_file) - TrialTable.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - monitor_delay=0.02115, - licks=licks, - rewards=rewards - ) - - def _get_trial_table_data(self, - stimulus_file: Optional[StimulusFile] = None): - """returns data required to instantiate a TrialTable""" - if stimulus_file is None: - stimulus_file = StimulusFile.from_lims( - behavior_session_id=self.behavior_session_id, db=self.dbconn) - stimulus_timestamps = StimulusTimestamps.from_stimulus_file( - stimulus_file=stimulus_file) - licks = Licks.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps) - rewards = Rewards.from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps) - return stimulus_file, stimulus_timestamps, licks, rewards - - -class TestMonitorDelay: - @classmethod - def setup_class(cls): - cls.lookup_table_expected_values = { - 'CAM2P.1': 0.020842, - 'CAM2P.2': 0.037566, - 'CAM2P.3': 0.021390, - 'CAM2P.4': 0.021102, - 'CAM2P.5': 0.021192, - 'MESO.1': 0.03613 - } - - def setup_method(self, method): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - trials = pd.read_pickle(str(test_data_dir / 'trials.pkl')) - self.sync_file = SyncFile(filepath=str(test_data_dir / 'sync.h5')) - self.trials = TrialTable(trials=trials) - - def test_monitor_delay(self, monkeypatch): - equipment = Equipment(equipment_name='CAM2P.1') - - def dummy_delay(self): - return 1.12 - - with monkeypatch.context() as ctx: - ctx.setattr(OphysTimeAligner, - '_get_monitor_delay', - dummy_delay) - md = calculate_monitor_delay(sync_file=self.sync_file, - equipment=equipment) - assert abs(md - 1.12) < 1.0e-6 - - def test_monitor_delay_lookup(self, monkeypatch): - def dummy_delay(self): - """force monitor delay calculation to fail""" - raise ValueError("that did not work") - - with monkeypatch.context() as ctx: - ctx.setattr(OphysTimeAligner, - '_get_monitor_delay', - dummy_delay) - for equipment, expected in \ - self.lookup_table_expected_values.items(): - equipment = Equipment(equipment_name=equipment) - md = calculate_monitor_delay( - sync_file=self.sync_file, equipment=equipment) - assert abs(md - expected) < 1e-6 - - def test_unkown_rig_name(self, monkeypatch): - def dummy_delay(self): - """force monitor delay calculation to fail""" - raise ValueError("that did not work") - - with monkeypatch.context() as ctx: - ctx.setattr(OphysTimeAligner, - '_get_monitor_delay', - dummy_delay) - equipment = Equipment(equipment_name='spam') - with pytest.raises(RuntimeError): - calculate_monitor_delay(sync_file=self.sync_file, - equipment=equipment) - - -class TestNWB: - @classmethod - def setup_class(cls): - dir = Path(__file__).parent.resolve() - test_data_dir = dir / 'test_data' - - trials = pd.read_pickle(str(test_data_dir / 'trials.pkl')) - cls.trials = TrialTable(trials=trials) - - def setup_method(self, method): - self.nwbfile = pynwb.NWBFile( - session_description='asession', - identifier='1234', - session_start_time=datetime.now() - ) - - @pytest.mark.parametrize('roundtrip', [True, False]) - def test_read_write_nwb(self, roundtrip, - data_object_roundtrip_fixture): - self.trials.to_nwb(nwbfile=self.nwbfile) - - if roundtrip: - obt = data_object_roundtrip_fixture( - nwbfile=self.nwbfile, - data_object_cls=TrialTable) - else: - obt = self.trials.from_nwb(nwbfile=self.nwbfile) - - assert obt == self.trials diff --git a/allensdk/test/brain_observatory/behavior/resources/example_stimulus.pkl.gz b/allensdk/test/brain_observatory/behavior/resources/example_stimulus.pkl.gz deleted file mode 100755 index 676120032ff33f582f9a3ed3d959aea5495d2e84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2970855 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ⅈqTiZ)7kELH*5zsOie(NMZ3)9g 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%0D!MYwK|Z^fG372Zq!?}Tj<y_c`p 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%0D=kw z#>+yT=`&>ZW_4hC2tQJb4O}TVJA8kKc7;%QLw*xRK6LUssPG_-K-m6i$s|Zd0_spr zt8@9-JN9p2xPhHGTkY?_|5x{V3BX%@`R%Q8evTl4N0ERICbos2OK7y~<NxTgu8|eH zwnAMzYg9p|wj$Oo@~o8V8mQ#L*(GfRq+(rsYc`a-v?!BG1%RzDybVHceeJ|_`8fAM zZP}e(%@6Hn{yr$%vhAL0XmfZSIA-<qf~M~V9nZR^l)9had!1v5bMHMk{Qh;9ZNW`W zx4!`-3cN5|Kb&y`p1r;MQUN1k{r<UYj~{@=4uwG{AG*<<<7_>fY3IN*KaqjScqE0Q zuN*!=F;wxYVKSF)f!D7yFVee;V0;zCUPD;^9*mh@=LSukuy=cj40?gx?tKN79=>`? zz8-<V`P<O4KyrSshQbOPKJ)7bF#o|Fr6mES{F(^km+q3y8HPs9^3|zHrOOVZv*g-4 z-T!25E(|wiP{9$;q7zx&1g6tfVNqXqsvys;<n~)IQKoxxVL1HWT9+$eA%wMaP1n2Z zn}k`UBemAcHkQ6aZ3Sc|X%Hk0jHY%IJd>Y6?9|I`U^NyKyR2$-ZNN?+_UjS$zQ+J- zb0-6E7uP4)L!osDLAC~<^QosShnjS|HT;Cpt}2Ro(KxU=3lp6%qx5PDM5HXQ9v)pw zw6jk>Tp*Xgpa6#D#!LA+7@zi?GD<>mEJaRw7ng@*RMww7Rx-$77W0-=C&2M9GJT`o zj{rJGo$T?CVbSSY49;`hAcjp5_Ms=3{dorskL09gt<eN_GS-vjS<B2LNTQrvsR!21 zI$?y-X$(EFK;=ZaU6OsG23A?5Eaa{zKD}&9SI^HqCh%nO40vOAt9u3J&bGr_t_{jc zBGiGbNVoh)PNSnefok_s9UN3&qQr02-34`N*snY3LZ?)B&cYuEF4%%b2=VIJ2Zggn z!y`GoCfcVVrd7)HfJpl-9vu?Y2S9bLc*YLA1HR%UxZ!*c^Ae28`M&p6JB>r&5x1of zY|*QTr$}0MYnK_7AN0f0S6ZE+oIbZ7&Nyl|zfphvno(tq)WQ~Vwy&wj{R}+edug!2 z#bUGAD;f_J&4{rZwufiL`dgtUmloV2s#cVHlP!sAJXVzj>}&1fe+Qf=VL7=W=AI2m z4YL1?Z!)Dd6Sk*w(*7pyf|1%)DM=SpOf>wMlgporcK<fyUw{pjSjr7*66%THe|UIO zKeY%>&_Y4`D+T6LW+^GLpeDJ5>}~Dws6xFaRsXLyl^G`utB6pP4A2%~MO*1c)sPsZ zW*K<h+|pGvTy!bJ+ejH>19&Va+2v@bk^M=C)6o!ITZ_iJM<b@p(WH>H&%xc^^?-u} zOaP=q0fNggT;74Ma`qnjhci9=0ZT=)xLV=UEn?UL7gnAn`Aylffp#m-f(pxzy8g#C z6sGn`9eXJ3CN&zJipA@?;HvO5GJ3lC`j$K∈%2@&_X{6|;$B!pweh4i~YGY-d2Z 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%0AG@xLPS(BgH#i3dpSMd; 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 z vt28*z+hIyfcsWMEIn?t>N6C<~kFaI4LRsigki#xKhtLf+yc%j-~E>DN0*S0X= zY!;LK?LSawYPLG&rD&ZB(~E=8U4i2nx?Lw<oxs5}dzPmxnfq>y&+*N|($K@*_b|3@ z5Ti2Yxgz8SH`QA^a(5G%e$f}*aGx{d`+K~AvHK~Pf0Nn-km5?q+4Qxc9vSuWs5gfE zYjAR!<ClgUaH<ScZ}lk}b-skz$cEZkAisE7;vfoTriua+^7kO?>)bDwLy!*1+qbX2 ze((XZMQkGVCp4A|g5CD)zC)P26THApxiX5J&6w5MB{tb;-rSMP8XIKuPiVFBN1tZg ztMP#D9<zBxwP_AxDj!@8K#d=-@J4LMS11MKJP4G-&$fu&8fJX$S|`sLT=d4qAsRHm z-ML@g;G-|4YLN3bgD))&6qN;W81sP}eV^mqK#{-6%HbQWNcdcP`$SSRa9Ee!TieN{ z4>bN2HggSdy~}R@UhuEbzrh*91fphn|G~*W>$llX6M`=pdFH>v=$1e2BwvRjZtqil zZ`7-N$1idjjjhX}@23#dA6=Cj_2@`sAkIGnmHEX7?a1BUISV$^YU%hLe5R{&&?8>4 zRqF-{UK{k@(9;t3utAEx4%kUwFIi6cV_8;jNE41>q}HuT_IJRln%6IQH)QNG+RarK z2VUFh%`#t>SgSEj#p);OxKpbQj0Tg_M_=sdTCbm3wSdZAF8fzwOHKC@VF8N%o`tX{ zK}t*)nM7tm(XblO#&?}7K*)USPnZ^5rpLe^?U6E8MVBp!2>>%d2^vqwm`K+k?sYN3 zDCS)M1RZ*fI7nWkPpx{$q1y}i!~2ZfUR2QWsBV$=?p?CBJYB}E*Dt^-|72subd8&h zOF5t?FVnfr(5cFoyh7)>rkz2l4ib*&u$&AMaAs&soGp>5&zhPQGTS9*MLvR&4C*l7 z=YRftMH)lE0w8E_Q(Koz5$9A!!zbDm;l~pNS;Hc)_+>}AIE;n9T^+_%GUki>(5YS7 z&;TCWs=DiR=0`>!hGmz3McL*(EH=>WH%99fb2Y+jZ?D5K6r<yZI}&;ULs@cy$6?%S ztdOkP9HvkZ_5wk>%|;dmuiyo<KiDYvFH=`hn_poor%MJ+cpEmG3O;Z$M}T2&^C?^M z(_UPT`;qv@geeAQLX9~o&)lOlWD**K2@!P*vpPmuCC4}cAz?hsUv}flCHwdrwbY}6 z0jYCNa(3OlgPaYr3vqbN17Xhn^%IP#8B>*|z8Wzyg0*->MKEc<J+>nZl_(BT103rx zfYS*dzh%EVDrGDgTv<30Mg(Bw>=hgrS&BRswt|OKB5Wu!s8G1$FoS6RUr$CJPgo$4 ze2_~r*xOsD_8vydlXW(UoK!|tSVRgS!gb7+gq^Xt@wZpyN?1Qa%E={ogtfD$JE+=? zwMQ5HdV6|BEetKJhQ&h&VV!1msCIm@f<~iq$VgwiE8KT0h>eMB>b`GaJwl)$f6+6} zgWT@yNVX$V<|==`qJH#JW-pQOEo@HNxr5Tvr%J#JrJW63BL-f>Qhf9)_io?=f_;w% zAs54hZOmQM16Ue})#opMGP4~flWnJ?2>o(pn!%vwEH_>~%Yd>6<~0SI3rcjlaf7Y5 ziFN<}J5yNqc$<3hA}lIY<CDWc$#GUbnaku0SS9S<1*@>77?sNxPS}JsBc2={<qx+) z9(^@&_wd~Y6UUH%7+Fkt`Q#r8Wbd-+(_LoMSk(FmycC&UzuCutF@ibZW%&t-2Qf%L zI2~FZ-!Y?=vZfJ~V;L$mqco(z$>`O43#?)^)B@r{U`z5lm%=T6Mv0h0X5=ruPCNRi zevaWMc;D=ZKcd{gz9(|ijw%rijeyA4O4!Vlm9Q`m?hO)Nu48|gS53+M1KqgPN*mw= zHV%LmM~H1RT4ZwR?VheSYu6c9?A+1b!33NwXHCFsg5EghzCOjLEy=(`KtV}%R94d$ z<s&}!lgcEehE3ue`Q$av3K(>sb;?0*S1<-YRvF?U`0~6uW80UA8+WQ70-b$D&PduQ z$68Xl88yRPGrsPopT78vexE0u$@9lk4?|sl!a@s_;pH&erE?&86x!}TJm}TC&+yVl zpkkAapYRRVdPw)x9o>XKOcd!$^(<wYza93PdYIG2C(j)ZiS}{iX2=EKD?qN>Td<FW z?hA&G0#V6^nw@REm7Go1ablG9TQ7P=W-F422C~VihpVDB`$FK;>J`9Je;Am;+3CkV z{}Cd~AwCWKf@FtAx48}T^(}K2tyrsKrLZY%Nxnc(&K|Z|lYMaD6)XVBqT4;M-5!1* zfU>t@LL`_N9{mfeev`1gugQKD!!oue3V`g(>qtd(;{-W;vq3hGV5{lRfnNpudWX&Q zaB)Z9ikURK%YlC2Qp?G9bqM?G8w`J?_?6FIJ%IpX5~egM#kSXzFx*%944cfjkGACV zPdj=7MZrJAjvts76nl~bZXI7g62mE|f{?TMmg??%-OhU!!@*&jMsxIFp!*|MQw!0@ z8v@fU=KfeJ$I>HG5^L*hN4ZRz{Tm1aGYbeEAzSO&0TlfG7>M@fj-K6MR4(~rxg<e+ z;(XvG2>w{fb_WwnRm6vRb6u*{e$uhCH>?{{3uuNM0Xe>~iIMT6v&HjWvP-wv=Qn`i z*#1k;B`MaVKYtf2g~Qkif_;j^u_|62V&IH3HUJ}OOA)lcOO0H+JRYCiWGr0f64H%B zkABf%!;1|H47)zbvRwZe^_C9;cjrZSLdXM3v;WXy4JV2q1PJQI+kHI4?78B}-uyf~ zsV*D;#A@2v9Uksyd-<9qD~xN(=@zzj)eUuw?_F-Ex7I9-U6K*iNMv`p)XU8D%pu<0 z8yA*R<0B_HU$P^c4&^C031mG&PWXj29k`Xg?6;uHgwqkRk3RMlh_v~LA1+M5XyO3y z9ocwE?yUZu2($kT9k6$+<MAoMSZ8j5oi}ls#MbmXRg$9f8`U99!Qn!(Sy(#b5?MMD zx}b()9D!jf9?01O13-}4r-PNY`;)DL*%o-9GlrF*ZgZ@OO!0O|F>h0M6gGnOO<rB4 zn0fUF3(Dxm7oA}6Y*V6u>jxrCx{~1w%-ENe6x-2n?!Z`byQag(EMtBO64Nj3uB_?e zT?f(khdbwv?p~OT4Cpw4_&K`#;MrjNl5Izc2#Y4YiYHtYNc<J$=`b#w(Pz-baN=l8 zm`piiX7`pfM#~p%0TLU7qrmo}i3h=uSUEJCMuGietyc8Etee!Q4hP$I`SvCqAUCG% zVYZVt9ly-F0`lKZAMZ%;?tXndKDk&fq!|Ahl`SfGHQOVySEt!1L=hto9Ij;a3$gcs z#Q(3SyXWBVmj2WCqi35O#hBYmPxh6oH+JksZrtXYq(83b4%Y??o-$alSd*88*%~77 z9_8_SPW?dNREraO=rw_W{!YIYY<kiywgs)fSm1|y*Z>#5Zz!-??t6h?(_98PZ04%( zf8CKQ&FIb{7F!GrzzHUB^hl;V<^kekA!_50*$*i>jV&9l?yx5g@XmgOsu^Go5UPZg z+#oMwBBYIQIH4>5!p6!FymU1S2yr~A=$v&3+XN{u6&a!TZP07N3efFWT9U^mVTQkC ztJWZ65L*Rny`AA?^PJoyfBA&wte1<E{@2T<v+Akyc;Eaj&042#$SBt^exIrn#0)|6 zS(5WgcjN?vZvCgw(^1QiXD5%V*RMlU?4Pd1w|3;Hzk0d7wj(EmVSowZ4%!YR>+?xl zzQ8lskRBfg*#w&d>~R!lK<j@FVd;AdtR($nXCVTToIZbfD6H$|bRtw;q*_f*OYBF{ zsD3|>R07-n;f#+dLzQeW9xe10+y@Rl65UsVUe`3@C1Z;x?&m!0v#Z0e`^x5Tf<{_) zHe;seq|j&yVN^L-JoZG(Sbz4FIiZ?Zb1~6`ZvdCy(^Tt10i=vez=lKZ#?kxP^2BRe z-K?JZ-8^lfd~=wiBtp-TvgSI`6@)11=B>jL0&I3Z+He1+4zP@zo(auN8o>4~-+*g* zR*EHghfaHP?b)^C$I6(^me6WuT<PL%%7aNVwR<SXl*=_Z8{ge44@kws|7v`ZOOTIo zVL&F8i)hxWVS92}!DK>rOxH{@b~?);18dAzzI~Gj?+D9Qf=WXj)0A|-{+#W>OFa~0 zHM^dC=LyQZ)J0ISRb!sLQ89toBZxsh@T-I4oOA0=k95IL-jo@UpEAfQT9Q~AMI{nM z1(uM*7M(E})!qsk%c&EF3p5};1CLyp!_AzT^@5<djgYF;)JJ3wCO)Gz5Oqg3@n+5a zxr2jFRnKE9lfQEc*ZH69L|i4X@m&xtpkuS>AddzPR=SevnVVKmTZ)VMr1EN%X+#ff zuEuax@WmJrsIz8_I~opVDQdadc*NhVXqh%q9e%jxaNdS#@!e}sKyIFe`*n0zyYY_> zna$}VI2iLshXHlFdBPiHFUH}2MXQz}3>eD`=*cyCWey*Q#l{PTGut=W2oye04Tt1( z(J~31mtJ|1PN@u*D;7W6=1mZ~v}Xnc3<-bN*gPA6Udj-~9$!fQ??4)b$*HQyq;luc zP?Vvb)q>7QI&?^x$d;xUy}+^P4Z~KuTJqiIA7x)y%=jq^{J#7IA~NA(QrNMavCC#B zb>4<W;I5+oTqJ@OfCJeseeWQQ);)UZgm=VJ36fb+|99TX@0IOith~rcZp@kcvAd7< z<mmhFjdL`CZoLDvIH^p50Bs2;t9Hy+b9mdzAB>tHMlad8X2D|wLBL<wg<*s&HhFMa ze+Z05uZ+|ZKNjyFP<ud6jm`>uE~cqKR&m?}7;CC%$Vm++0Ij!Ei$u1?ET7N<?8Vy} zGQ)+k7?EGS#BkGZu4amb2bu1$18Md`?MRnn$YaC`zsu+7`uEjn=P`top2NE<IsF8f znP&o1=nuIWMG%29)!?Q0ej_u7*2(>O8B=HeVzaKkBTRE<1kTjSM0EjL7`AX}jT%oX zA7{e#G&M@q5ZO=5Qm5VoDs&6)J^0QIVsa_p#@$TDCeptg5k~#ABSDhtusFpm5RTVs z5gM?Mr?6CmbBG8mjRXO!eRwkbe9Eg#9*ms67%2`Phba-n$<}+#(8WB)Gy?Q3t%U&q z_wCkXAmcC5?w<Z$q5@7LS+_!#1+s&pRy5kNWg*ujzO{d(jG#Nmv6iVRUjr>KR|r7c zs&#KhUVv1F#M5R^S1}wH=KPs3!3k+&u=yH7>B@n2b@a%Xy5D|EkNKF2&m>TtoX$?h zGaboIL&U*BThu4J``6BiN3Os|r9J&N9&!g8h4!p4elrI-F~7Z7(fISOBuXsz3r?B- zJFD{tbfRPh5r=`|{o*2Gj~Vf{Xo;j=%+L`X1*kG%;<p-cKwB0cW3BSX5_WAIeIruL z0aUL>+{MZkU+%ati)YL0_dYlw#{%t!7jh;i+fUQM@(dj0x8J|$0G6EcqaR+<pbkH~ zQIJ)D7cfePwX|<S@R1V<oy)#Xu(s&fAji;;V6kfdw5R#y&z#_9<K}B&sFqM3Z_~As ztg&rcb#E}~!g$igyjkgD8Rn3;(=co)D0h0eo)SPffYD|kHevm6z@gXIq(cyet)neH z>#8e|vyB2~rBG+HAv;2D(k;nwP`1D0=#LMAHm9Vd{VA9<D-Eo2??@-8ie<e|P`bZm z|3jFgtKB)4LJPkRRl_G|DtK_yr5(q1^;H#Q$@5bM5CiUB2+?|YE9{AVa*>i5L_=Ot z<S-==x-?4Z3Sc-9ZSvsX=tQ55;^Q%VXZ0MB3EcfHe@r6=voJ5A&W1E?XU^$KCxWJq zLflj*Rdg>*?6%m;wmPyrVm9k#r9+wM$eFp&uy!s%=tnX$jL7oG5W9|XEl{`9SPTzF zcxFXcDq=dS5RT(RC2tWmRTZJ%-cYzgCH3opi$|uBe#HFdP@n67K2aa&)a*Ff)CD+_ z<Jt%;a7jXQ%b_#CIj%Ht{v5Fnun4v|P#NxQ&ejW$lhdMBeExiUKwXU{_FXgIi5`Rl zN^%^k5YZ-v-U%O3sN9LIhnhJVD#6|0i8-EG6Z8V=+IB>4xO3#S?w0R5jYx>sq#9v4 zlit0n0~z<qB;&ppjV9_NBLc1cO7Bx73VF~5pxCqj9$Z57$r=vp+yV3&J`OyDgCU8B z3)eR-uqG<wi`H?bE`~(_6@}3$78RAc!}ZUWbIm7J=@lVd0h1EgrrN4LQgn<E;f-iY z8W3kK+OTjO25<>waxe<Blg94Qo4+F?S8U19h4@z{V2tUqrP$c<4ZjUP!6lxZi+we8 za*C~wq^V3ZgL($HiA2>y;i<tis3$k}J96}Ioj>yG{vFJUPMc)n@TR?H&a9ZjpvQ^& z!#L56?q&lr>bAL>1V-5xPVxGaQT4pkJE<+u5zbXp?MzNG_GGP1VROL(A6py7OE6K9 zEdB%sbH#F50b=`joX(MCV`}VE#g1AY*@%dYLrI&6a!76R!fnRH4Csff)}X!#nnMRm zE(<QVa24oRq&jhh_NTiLo5>IIC1(|rJK2T6%DRVGwHoRnM~p6DPf65<Rtjj5!Af^g zjZYc`4cPzv$p@?tot8FQc%`=0e#iyk;N3b`nzzz>gg|aofQX~%N3fyx$|ATOxj<Q0 zHTyy#z_a<Ki?FZw{eZ=4BTX^roKL<p;vPt{I6_UE@v0Un=2%-`qp4FMi4Vn``JPC| zo7G=C5+rWf3H0~yXZe9)XpQ_#%NYdy?9-`=i*ewG#UrWbKutfZH@%Bz*H1%{c)vDj zOLNzg7uaI@VYj==26oHc{p*U&JA8-#iZt-TafD`-dkr7t%mjR+XSpwS&npP(z<&&< z2*Z|+tx(8aSOU6t8T{CZFlQ#M86kN(1%bvm;l?M$R2^hy$|(bp$)`%H?ts#W<&<Lx zFQFu!4K?H*{Fjqq50Cx}9>Qpx%haoz15Qh}<)~ZT(8#!T0+mt}%oeG8t73wAbm471 zWt$Dd3=Cxd`tYZ|A>+!PtX*NGUK&19xG<gNP_uk<b3kb@00OcbbYDd~l*a~ng-kZ% zR{R97Ju2+F=H-SC;P~>)okASpiKuEIGfEuGM!(pxk*H$Rguu04t7dRL{Q~wy-QQAW zPoM(aX0QrzBjQq3Mc2n+^C$Hg$lOK^HU3gUBuL!|@#6dSZPo&A?cM3`Fsp?d6ZZLg z)%cWRm=*~m0u%okLBetLh1BjtHMGuqf0inI!;ePd+tBkSZcw!pbd&Oqco^v&D1K2$ z#)u!oO6W22JA*k|u_418Abtz;Q}TsAh1YJBV;t{*%+X@$DM}7BGQsaJt*D;Pqi{)z z`4BxJ2OU&DR-Dq=!zcpANcrjNTUzQrwUy1wAh9F&8p>MA21;pczvDQ-bIs-^-O7*^ z4nEniku4n30mmK=L*FOFi8&bo^QVUo$vWOp>(S>o4R;LckNed5t$i;WKI>F3|NJOm z`ejaE0&`cVK>)<vK>=_X8XBjK18o#qgjCJxF_y-2>uV#hprviKrSnMnwk&?H;4-~I z<;XR9aJuf|Bcx6GG0s18X4+x4=nOSa&^ahfED_kmwmHGaCu%iCd78Da)vD2)ywd89 zLP1;=8G|H>IZ858T7khxQV;zNx3$jJBsOU!9+f?_-Heh{-@=ZPdtfT6Y<@tFrq5_0 zZCdB0vY1Gv>2RD30`JK!#7kj&oNOl|ioQb*7vmq)&zLmd)z<m))nZC#QLw4gOf<FO zqa56P+YpWtM<0QjqqB&HP~WRLs#k=`n##JRqfaF3=8=<s?R`m4e$|GB^R;y(a)-@I zColACR=fu{dTzgmgFEj{R_Wg!0N#Ie^2r{4%zKDtJv!N5UR#==KjeTeEZxE3pX5ML z-65l7(%lcg_U+33E;(PiSyTJRUA!|9q<1p$AHZ+nbW^xO1F(hLaR+QafVkdPjh9+O z9B;SZJ{gc*vv8;h86NG(JsCntxsK`Eqf2l`G(T*W{Ck~7805`~rwY68!y;kIaI9=0 z(q&MkoQUW4`nH_#8eHOwCkiTcO+~8dPp0BA;Czp1=t4reY95@tH9*+?C=zZAphix% zB9#L{>LrQAeiH-^gs8p9e)C=v1qjJ4xaVN^?0$FeU%lZMX~#;?f4XtWK)!wUPeuO) z3{7pB38Z2N;nS8D*m&h@7mtDb2?iEX<8&={(_w>w&*4j1Fm7lM($H_<MWrc1Y6Q4g zDh9DR5iCp=#PNc$MnowQ=)$1VQ6xY;y=GS$UBv-OZ8)MvgEMNav(4c)<+K-V&NeA# z3o-UeKHez>$dZ?A&7JHfB%Sq6m{~)1FEVP;b~GPuRuk{1Cv8u&8HXF@4%S`55=dxT z6QPXq9C~k;8Vyz9x*9x4<6K0T8zuU3qLMNl82f9E4^H9Y!pN|q+u|vK#+P)Xi?g$v z0WKCN1aw`E58?expc{}0MoNY@75nNu@e*3}z{-TBW^gHIch<iNNH`jr*{*GX>r4}e z!7(m>vo7~49h{Hk8G0p6cZuL<7R4C1FJgB0N7NxylcU7;U#WuSo18aH*s20(Vh0G@ zpLgV@lWZdoDQ$Itm#<v}0x)-i8zNvl(d1j|cmU5CxTqyDc#bldWP@9t+cn`d5Ck%j z6F|VJO>T=4++~<o?K%2$51u#hpYHo-AhZ6=`?jGQ+zL3#VdCHeXEeY7KTitmud#~Z zFq-|U@$w=YKjIEjuW7wk=C*rnz<kM{!bIs%jiXvA3rOejrjyR}IJ(FeJq(9pAWDn# znw}<#L6eU^zr$Wz`gClnYKD0U<Am2tLZDpIMLrHqxP(N-8$@A)%NjykkBPNC2^7QF z>dxlCflwM;9dU6N62$6Z97EL}V|faeIueoD32r##+~2M!PWRs2@i{hvsE=KCBJh-Q zh5`;|FLe@Co5Hyj<N+tCEsaRnjE}2cT3CVD$-~bmO})FdKzQBf16YGr6pX6nEL6hq ztj+$|k*iEW0EA$Iw*U8l+~4Oez+kPUTVhe;Gk(`~GCqan%t@C~3}8z1ZT9r!wS60) zs$SGEX7(lJtdK@jZs`~VYR|fGmXtu|<km+<37QdFqoAFs6ykz$dV&y6swfeOYALC( zI^AK1f1z=BS#EX@n1bfMhajcpB$R6mLYhWn4SC9k5Eg|5a*fsbcqvjRar;|wcj(s- zzbaJk0N+zLbNLT&uvj%dF#+R0>)Gxmhu!AuNu9D#8plR(dS(CI7J*BG11FvzJw`W~ z^y%Sas8xHBJK=0yybPS(Qg>Rjx^fWG<*i&2Pu+QK@H+(H@n2vJHax)*uxlQJ2d4oS zo88Xq2<Cn&h4M&O|E>^bGmJ$`c8p-LpjdW!$N(s%I}a~>3YuLEoe>;=TJ$O091g2> zXPvt4J;2ss>f+8P7lT%Obs#c*(vSYLp=T_PUf7OL2vJ$K|I{8}M1Fn&0enF-cV(Qy zGsJ=v<#tS+qJTM&%D-7b9g@Oq!$B;})nh96u6W@G(o&NT9UUMGKNI`^3hYyGH2xe2 zFJg&{(PM8zy%9o9L0HNk-?=n284}EBwt;#>6D2k7!i!MJul0FM<*AE8Qj&+W#8L0U z$%B6kLmd&DaEs|k0mov|L%excDy9QOT9Ytfls^hX*S=xH_O*iKcVK?AlV@Oh!7`K$ zHOXbaed+G;3EL_)yj}m_F`p~L(7!y&PClpm#`>eJ<3!&?wq6>-lIePPOuaQmdDKig z$RVz9#~|$7=P!CT2$^B06L>h<BZoy}qtzCw4HTytCh2hNV!OntAtz1{u#}FnJw-rn zP^=Iy8QE6|j5N2Yiij8Q<idhfxMFK(l$Y?i!|Z^dKuQjlOJJ2n*gPux73lY(W&$GA zffG%036Noq|KK^!vhwH}Bba6q=yi;$EqQqBYHHd8jLTRO+Q6$pvI##&Vc<iK8GJAv z!Z4)v930_EJezbivp>kg_^v4?-d6=uvi#b5uaYEFGDShc;Y9fXn)|fxZ#T!|(@t7u zg~|k$J$fHxdCQB+;9UHRmY;OU+mQe+#^oO5K4g9iJgi@9(2{X(^P2=PxhYQg#QYbN z(AiKL>BIsR16S#BC!?pB_$eX-NI(9<t|vrt8+AgcKoB}-#==d%ea$RCd$CGnu-LRm zw-|&;`&)BiM`&G$86#jg6$Kv1*(Mfg&Veh=8JyU*@L*#}IP3yWXD_9Q=3nl^7z4<@ zpev!xMqJIwo+Wc8FlyhB>CyBntl5?O+xQh5_G>t<fRpL?<W0JUTXyn7WZm5v-j258 zgiRsm>TRW*p10WQ54qE1PnWph*SmLL+L4)>XrzX|q=uJnH!k-;P0$rKJ+l<$N+7Rb zT!6nX(_0N`85KgfyRU>ZeJ0EN>_kwwTCilR-2A=LeDtxbLQVKbO|wy%&4quvaY+Lz z%%RD2-aGg(u!k}ra38L0ge)l{P)>PSz#Sf!Inl@zZzDNySsrdwLWNOtX6LE5DtaSe zULtHs6Nwogca}-CEb$)17LlHcYtoTGlq{VpBu2>64uA}q9a;aBEy8x~Ri+W}r0I{` z>E(MpOG1ytx5Hn!_y_g-(F|T8!8%VV4zYf(nQgp8zOW<H($G~H<5<1V(s07-J47Jm zci6DV1|Z9+7pV>w3icp;?1{E^sGSMqVO&)l{eH=|KG$zvz?(Ctk&$@(T)ljY4O@kH zsC;o@cv{N_51{^T0I4U)j89?eA0ApS*7P<6mR>@ZLu@t*K{O5`&&&*lN`fXSJ>zWB z6h?On8a3NDGeV>$BUhOpk59TDD?Y(qVA#=nXqLZMk%SMljqZDJ^&4`pi9dtNgAv^D zCynltg`^)|#%^e^!EdX2$tIQ?O-*nhBI(8#34#_4Ev0j&NZ6*9$p3mW@B}s9JdcCb zwKiywWJduPSj<&uXls9$i7I;ns}v~^QP$IFI1KhnKNOt2unfj9eW>WIJJsaWQ}dI) zCwK4D%km1GJ9|7n(LNzBo`YXpsNb>XN#-x;LTrzpDr^|M!T+OIlP{&A0@^NayCSJ3 zR@l60z{f%g&=7}VM~`UM_0eVV0nf|{XRJdg<E}wb>!RTC=)UJL2moRvOv6B%xG{2= zZ$+n+-T9yVKX+1AUG*}M$PiXGi8LM@F^8Isa&>HyFl!6NTa(Q6#WtPsl{29*M~8!N zt5DVB!~1apGlXbl6w{)DEYgXrO2`lV?2T`%wZNIAQ_S$b(~FVwb<uN(S)ytZSvD;+ zzYiJvSGV+^z8k?UoMUHcM1Ep$DDQUury5~;gLcKRpaF;a_quDt+s%zHw$vL&0{ray zICr|bBZsHgOU+VB(Hw)g!#{^nKx$8tKqUS$&n&rbUS?Z5TU_X;v;r2xk);GWPNAsY z(u*SL*p7VB558qac)&CzEG|=XCoi$`z>ZVYLP5V|+;}jL*hMK`y21(?oAm+P;VGaS z_7Gji5hR*z0;@0`oYSO*3$}qUetxeh3Allzl_CZ+Db|=qO0CPF&8jeyo@IPFPAm$> zepts%n`bPwY<dk8o}$rFO8E>x)~mCfdx+$v1+irD5-9wm_ZVgFWZHg*?9yvjH-_J8 zd5-UX=uVUEo`-m3cwF9RetNU#-0oW6iE#jqShIP>nnj)#v4`Nu!5bxs;%U#E&Gy6~ z1)TH0m>w9W9#4A`!u%E>6tBtS9|!hw_D#r>OhjB}`;PMS!63w~f+2^yvSy&Wa{<G$ zQ5L~0D2hjWLx|A+0Ch{Xt2CX-#V%5uR^qtqXIt1xJrnU@^g9si(O2{z)Xsj8^F8}B zBOtk0b3^jD2LX*`Yy-#H6_}wnq7%{dlfQQ~+Rb2pSUbZ%ISkE46I+__!M896m$O~7 zevdbRFrE@5`iwCPt}@{w2oVFx88jZ37<ahTI&w8!y3jAWYI(7V&IHP*weEO&8oS52 z<W;Y@sYNB}N}Q1tQAD0M9Mi@4*{bnjQiODmX4h8dj6`vh)S1@EPvJ1b*wohVGP?CE zxacM$R%n=17WwY}2_x42Q&{8L`~=%l`94Qsz6c2C`y23c*KMT(UkT9-S5dpN4E>^K zM6-CXqdO`TyZQqS#V=Oo{>BE{hjd$Tt=$4Ve#FM3QfY(T;8js%Ag-`jSqC)JVlwa$ z9GCYlgM3>u1pgV8;l>s4pMpFMEXo$Q#Q4IyJ94#D)?02cXR`Il)g>)XrcXJmnZLlt zA<uTqCvOWmYekGrdzg8`bz`QBaIp1_=cz}#KBb+j=I)at;<#!9W(p?Ex&`{Apn;Ez z+`OgTUtGNV=$QV~85OiZYT_D!<R3K{$scDIS)YNEmx(gc;J=pY^2JZw&yDulA7VfK z0DMc^b0@q*hlpr6+$LWOXSS0=u0d{=Uz`kGPP2LC1cnoEh()^vHyNCr03PdZz5GaY zO?(cju%^Jk5esz>XAo4=mjLe!6ohS{q$V?oWpB3BtkBG)TF=QSARgd?z*_f}BgZ+e z7gEl}Y@8I6X7?f#dzBuYIN&}$IgH-T1|3ddT&(?0N|jpoVBkM+Y~+W!-odL*gb@7a zv%tW!P5j<SMQ=*#TCZWTkH74Aa31{#vy;tQKbSLj9xy=c6d{nCvY}|(XFP%7tKlsp zoEo1PRn{Nu=!PM=_Q??Vs}l~Cm#=|YYRxF!hFh_EpU^nU|AxZtS54$>UC4aEOD<-_ zbBYIIxNI17aK;~m>Pn~YO!*8Sr!pP7NOloISKoJ2Sy|?1T;H)2?)JB}n&2gYoKy6v zLPapKAVeaMsh@wftfZfot6#`P&zW-io&i*sI5QLdJan4z)`s7+a8%cOnhBQ{WM^X) zBssh1do~=#Q8O&~o})8lq8_qu1P0=;T{c^jG5Xa(l^Qw-fA5tO>j58kKO2x~MN%x^ z-jREw6EBc{zITeJowlAXZb1CVu%`c@YDd^`SYL%@`y;<`rHRf4WEk+YMc^#0M?uo3 zdR@sXyn>k*(nYaA(2q^-*fZX9hPVg=uRb-k=ku~e6lOx}MoL#2I!;GpC_8sLWBNyp z?@2iH2e#=Pj>MK-7MC;7;CcjDz9^53CsIkyDma1;=9!%s(fHAZRh0dI?0xy8)wC1u zzXGzTEOL6!*2-C~2!f)xeZ_@>bX8nX0c8>R+h0FPPSd1Wo1S~|z4t@!ZBMqzWM(p% zOeWDSIFQP5k77VSy<qU8`i)MyO;Jam&we5nz=+?P)ohMHOw(u=tG@odsdMQY3`Y1! zme@<G6lwt<)S`}9J0A3Njcf=~t)o)&S#Q}bC4%K}0Zg^qe5r^ltKrCcax*0%Vf{&w zmRy@E@aR0NO%GnLIo%H~TJZqEK{3e+GqlRtUN^rYl<aiXb|(UZO_H8guj#K;K-W<C zgY&D&K|-RD6=5Xct4$5dUri?#Qg$QqAWsrGJzhNTZ-@<pLqi7}1Hn5W*^z#He5iF4 z-P*or%5J<Gfi!E@QW192ci{B+B$PQv>)d$s9!mcVYpKP<y;^*;lQfH*pmZ>L%<5hU zE_~T)zb?VvJfYnp*C+s$gNzcY>KqaI3&&P=(%%`aJ<;{qdrU`h?4xi<Wm3~ycwL9r z99+Dc2-p33k?2m!SWnn^owX^U5S5?6MP>3&O73sKz8+4E;60hEgZFVV+>v4p_om!e zBU8CA6x0zX-!;&FultEMrh)YuVNi3QnXv!hDx@U)#D)tqqGEFM^0TUz72)04DLz8C z5$p?sO4!!6L_o99m_}J&TZ$RQki5HO{9f~W15D6}4R*`;3NfQE0`a=b84u?!3X?`G zndqu4|N2-JtYZR8C<1qu#VKsaUvA$h`|+Qv{11{faPk*cgSdt}s#hwcDt5fr5+aF* z6IOQ;9lQHchCl4uAc_n2aqJE@+8I!QR?`(Zn^ClA$_z(@*fg$Sj8~2(E+o=x(=NX` zL!m{C2FH8wkJq&6Ta8hMInF<B@iHG$Ss2f^KRx<j`;uOw(0r-hu-o+T$@cInN^Z#v z_E<>979FwCEVj>^ulUI}zi@>)ZB>h2q|V`3N!6j%v7=2aP(4z7*=P^7QYle1b3paG zB65JSC|NXyDs-gRG{!9PIzFHi0{^}&^^Sk2n>C=qb505EpuWC!zj9+@5Gv)$f-K#k zI2d&iXBcWbo%r_r2shFsY7lwBI3WK*G#zf}zn(toJG`v6J}$k12qF`)wLNvw4?<tn zSk#c7QGcIN1gE<d#m_}6ryC|U=CsVQUw%K^I@&_;ejm_s0v<VJju)G+Q|3#k$O_s; zg?Zhv5;v<2+$BJ6ax2x#G%#Ltfvxj1?{$8cC>XR3#Og=9W0Hmr!vgdz;SxVF>cw01 z{e|VGT5S6|gqt&WN8Oi)bN~)s;X(N;@zg3B9A=8Bm_uM~+3!5vWXX5bY#L|xNH;oV z+LTRh*Y)&6NzahFoi8b_ibo%$O=vvt?Whv>1W%UadL-<;7U#Cz5iJ&nR}?oVi6KEM z_DnYy>Atv9H6AGfi0|Xj5`2!M<Ybd)rk|ZQ8y4FQ>Z0BJMhQKce<+}{p8WIfR&gl- z(dJ=cooOtxZ~(x$mSVE$LTz$2(2!GvrCGN4wE20yIrrd$?b#>fl};qdG<};LSc^0A z`&}fw1Gl}nytutdXS)~%@)%6JJkPR6`3KUG8~Fgv?v1Z0jn^|s2QEq0D)|ypq=Tdf zDOrrgy^Bx11o=<};JZ15;)?!DX;Ac<juwSz-k@(%uS}hEX9e>F!j|x-J|Jz^)X^l0 zR{|QX7iUPgKqO=84}t-QsGYELJ`NLYRD5w_MgOHre?`YJ*}ULqbh^sXS1gcpIf9rV zagwrAD`9T?Cptv|S8<$e9&y1@)4-~2B=pR$(db@M`HtzY>|SN_sQE29(d{KKz{bzo zZX+mg4^mb+=u?_H2hqrxl<c3V$+1mbI}oC=(Xb(QMx!1&R)G=EsyzCE68MNx3pk0W ztE!SvvdW2gB1D<(H{yauiE2ex3?RF{c&=-@%~;5H{5`@{a%h}cI~AeP*~Jz8CsVPE zCb(&4@dZf4;&Uc9eEB(^{e^q|*4h@mxYSBLz5dxcoJ=vjvIAQf=%To&IM-QbFYt5L ze8Lr<_#-+&@{BGP2e~ji&N)s4uN`Nv9Zw^K=I-3bqH5>0DWv>Ow}!Jk=#-I-9LM&+ zm1hrg<sUw~ylNhmyh4(H$9r|S32Ju~c<<(@`oV=C#8sI&43gJ~miY-@ZB^WJ!Q@_T zu6`t@LYaX|G&ZjQx)NNBu&WeZR;e~FRkcvKFC50+2k@s)HPGfklhaRpO>I{89?+aY zQqFI=HH7{&C^BG=vbIb?hN+<y_$s9N%m!j_uHj>~5@;HBf^zL58wH?DN}I9H5$7WT zAQM&?Kn|jB40LqraLLoJTXfSazu&CrKL<v1)PamhAMU5+E50J=>{(``r+W4svRRq+ zJhhV-vHsrPjCc-Ql`#q9TK<3?9W6g*KhIZ_8FVrimx#K)zM}s$WKT1I8j6@5pyeOD z5>`5<Mv^jLe}i?Brc$v2-cM5*5%Q0zGZ?L){RkDnRvwqJHR^hY)viaD%M^h++z>h( zQ(oX3NNb>Sc<P#Ty2%qqO2D;;d^Cd{wAB`h`r(S$s9KszHuxgnk&5J}SUgYF0a)|^ zSRKn3*!WNdr*jI2dExQawm&4m0*eE-oRSzv7R%yWg>WBn|L5A>l!RL&{vyOy{DarL zoLU0*u$rehfcU*(xrhxW`0al0re^6Xq@6%q&}=z`=f~k74uiTG2EDqgylX?U8Hdda zF0VC+<9Nu$$f44b5c|pW$=t!*80G2PcUI7PaHKr%(f<cjDQfr?_gu#J`rPv<C8tnG zxJm5FR>^&2dWu4%;Mt~PvJ+lVZp1!i^YcR(M;B}Q55T>ek#iQBaA%>6*?(~I79Ly~ zbBYyX4K?o>yhO1tDVX@!q=>z#Jm0i$sp&w0A`z-onN*;+f*yq~cHT!_Sq6VI;=-EC zld*>LH}Rj;u1?N$NOFbW18>x*g`Rs&sd9sk%L=vB)2~)`$di<aW&LMG=?rheLY9?C zZA<H2L%pr`&fxL=WS(2xdtT>{$uIq!su?H3axcjYlioALLCf}Vq`@`>QFJ<G5t$7H zlRl$|iu|ls*yDkVi8@@gpbp%nIpd{+DD6G*O_T(qO=uMe?d>-K*~GOz{m4zEHO_X? zZS%Yg!rMMct?Z7*x*a6-)Vv!(z00Dp^muR%3AeJ>A!te4fB}IZ<U|R&{f&93-PQNW zadL6jE%p(-OB6Ih>J$JdjF9hvWY=saq6`|wqeG!6zuP_t^SnzQ1HL@@W3Pw_GAitk z^W?(Gbjg$xgl&bnmP&MOu?=0L;6Xg2oZW<%%!v|oAI^RVeZ+3HjS7wG)2R^7y>oh^ zw1MbRN}N65PMBjsf+IIJ-VzHzC2M{t@{UUO3{H`WsJgvKNpScA%O<jcx}?Bcbxd;6 zM#f6Yi5<P?*OYia!V%NYXkk}kg%tIgtLhK7uc1OtkBV0qX?VmezrnUeC@I?jP&Jt6 z2wp`l#E3s<09Qb$zsoCk!>M9rs^1^c29_kt1rkEECa};m6Fjaw_^6ny^(XH&0LcKz zpkfPy1fEt!AK{5!7;&gsTw4nwcS2KkZH{QcZEIeIw4tk0&MCC<ghg4%b?0o_4EUMn z#zycp{Q&&e9@ZJXol?#5h^v7(;N(K%y{d_0KVEY*@1{Xj)1q$e%tdu^4O6Vud|*0R zql&BB|LqClAf4IL&<qh7tWEb~B2xLB*v$B`f-T$%r%Vo)S5hLpNI)B3R;^0-PE4?O z2-D+~Mc3nXuG*&dy@wh4*uv+F`9FAo4Pop0hGrWkT1MT2^?NkE(@0jIP6l*}0cDY7 zaEygk=s<AKsTy2W>-Nn-AJR)lZ)>5zhR&JSUAALy<4j&+*T&)D&?m}H^A56)9$^|0 zIUIVEm>iB<S+^ZtlZPYpdvvQRT6U&|c3Q!jtu9u~q+T>7;)B!M>2FBcg9+UBl*BKt zpbz`-wj_N`HTuNqDlsn0{`VtqdhC7~^eQ8?ZQ|b9kM>??_T{)?`FxP298^U;y$#mn z9LW=c1YMoNb`{JDXkT?1=2#6n6Ybcp|AWXN2q|qHs-OQGYb{rj9iJRMI8DW}K4dgd z*t*KHH$`^IxwYA3lIN_;-g>K~V2T(t#skgk{YU5)@4aCr9DxPi^v7iu>Y3wQaOeMw zq75DQW1S7OQ;vS>6bM(BZL}%gFxvf^9Z6xRvz|&Gm^!XQdg!PMlHS{zc6{<<@4Cq` zsq>aKk8T1BZ+a9N<ww<T&g}CBPKTbd!z3gHIoBI^eP-uqXF7pDY%Sz%C>}mD8G$%% z3JAj3Aa-_G%bOe3(9S+r5H?cLX%!qMwb0s^q;(OIdRX_<x^Dd-mwq>;_v)xr=i}yv z|JvhX&{B<EN1p9(x{|bzp}a5xoQ`tL{VH(r`HlKZ5icF=9w9EvuGc~}S@O55CHk9` z-o@eA<Ka$cLEhJfn%WMmq^=Ba-D4Em4@E#6cL0R(Vjm;y!H$n&Ut9@8(yfMfveS3d z06LC=S1-pEL;jBp9AoIUsY79pGwo`Iu?LXD01vI&*pv@)k6@(TxmzyT<@SSi%y+(+ z$Fj7eV7yLAn6-L{xON;!zaeh{64iAL1!@V?qs8HJ@Bg;P(blFA;BXUDZt8c>e*Fs< z8e?QOhkHd#jtcs02w;da_rw7k9fDs`^Ii-&&13c&&ghwiV!66N<LK2hxlOK6>!Sw4 zW`g4n2fP9g_l~+5qas<+e`*OcTvMxPFJr(NkH9p%vOQ?00;F<Fj_%gB4$IXV+cYMI zqSD>f-La&Lq#w1iOYd`%#kJX!W=5^&N4~h{V9>V#WNucy=k)w`Qf*EXx#T5xY@s>C zI2~}j!qNX)aN%vwD7<=SwY}HmFJ6c@Ep;zoVuu+zsR+XQBZ#+iHrg1UJ4dMN=_gwn zWnogEQe`NzX!|+4MNbtvVCQM<#=7poLXD{Q3Y66-FDd@A+o^D`OROqalqZ{h9!N24 z`_<uG_4F-8q!f`Fs=NK#a13hxmMNaUCdmgmZ`9HY9EIa66Ly;p|K9WyVKzkIuZejY z3HH;P(xZn>GwqxBv#mm**#0aYd!8f2#gb{DoX{s#7{?QaOGF_+%!^&sen{Z0IV!^v zP`cX2rgdYpdN90-x!@+<T{o*jwwp7NVvNe-E*n5E!b1M`1f;px0oDB{(Yk%3t;H<7 zc-;FQFoyB`6NJjKLZcB3o}<Mnf753JF70S#0>}BG*g>GNj?<=Plv=UYMfrFJ<xr+G zcZ1WqL{LF64Q$h|nm{5S#Ay6yZKqs_#oIf`*qXLB9C61v2OWNok0?W*y#i-ku=wf^ zIDu8{Xt?Tr+XCIni7?L~5-Q~e#|b=W<}|8KdL?0;X~A7z9E2Dn(1Y>mzEq211ZJcm z)^ax6df5wmC-UPOH+4)AW|Cgbxw%8<%BJp&-gcEo#)@SaiP@24P>>@}q^K}t{uME% zUyZP5n8#l<FHn=9BY>55t%nK_TYe)d9DD1v1?$nEWh~^x;myi5>4zgo{qY(L8742W z;tPq_poovj>5t)Y$imMP8;0IfvK_`vwr1VwacsV|Jv$QiJSJj8fESgGN6)=o1Xb@G zrLl<~h6@4%`0fNa+I-^JdeG>O%Fn}R<Wc3MFW!%J?GR)h43PM5{$n5*Zz18hqzwmB zP9Lrl2I)TI=@Gu1>E5legqlw^$0u~ge!SH6@pd=%(rkAGJ#<8$V*1TYT)0?9WNn&~ zcyn>`va>uU7c`3<$**JkP}~;mI-lf=yD44Fc3S=F`Au>)a|1Li#v~<v+5AEMRo*O) z<B4jK+ei%f1x<$B@W=~0%q_S+F<PdN)-Py4$QH_DCUhgvW>MDmL{^|Z5OXpmu{U?v zfcHd|IgUqX@VX1E9j4uMP=Nw$fR9?(ixzE_dlmND6Ww3Uqaxr)vHj-u#9X<SW5sOc zZ_h%9PlltDsIL9!#v`<{;oLJ~H*7&HVG&=5c;3Tu)!bXf^i9NbO=WX|D2>nf+a9z& z(w1sBWe3A9%li}$bQ)?uL@sHe98km;@sjF5d(nY<Y($Ch@ZKm;CH$l>C$`|SWoa^! zhSe5;I2{G;g;LcTi!Uv>_!1iY);qt`A4o)dXz?>a4OeRC-3(cF6L;aD-Ghs`1c!Ne zU=Ka&oekXl@bzCdDyWwe#CY8g3s_l%HvT58O+(Ot%N`KcepjA<uT6d2E9!Z(#%46x z9DyD_equE~v%f27vgICEXiXNIeWTrIPtbra2-${b*NkuRdSsO0J>*X44vm-Q(spnM z9bp-JApCg5m3Exbq(>VYyi^KQ{RW8XBSQHedMe<Q3!~%i@SYHOJnF>$s3E9Z$D#rF zs(z#N)ob25Hi-s*WcZvlDZ^&iUA;zw!H8AwNe>9IE4rh8pHsDkrb9bnKK&G9B_<Bm z<`%BY^&n6$#do;XsRgT7QUI7|lltKSr@pEFgHzG*<j)c7)O5$ISkN$;+Jv(^4q-ZI zRz6q^>e@(^dxIGSmWEEX<Qu?-yiU!sz^kca!q)|QT{11)eym61kN?_ZJddD1DJ*k7 zuJVTQEt)G3$P*PJR1eTF1REgvwy8D#!wh|!#~pDFo${^Bh)yr`j_NLAz_k{)VwqPd z2_c}hhV0wUAmhqNJ#uDaVh6Dl7jl^a^XZ;W9yxT~T$yH1B#6J>M2{$66nYJ=2fiJd zD~MpaL>oqGd-B%QB0<D50!-uttF5e2sF;3!ySz?qU)_3WlLj6Hr5`Vje-j3JRcjGv zAXHyLpoHI9Bm_}=5TlPbABXY4QECca*!G%SjPt4)W{v(3j#n?3#%^q1N|~If=d`Yb z;~$Q*Tu5P$%H74%$iq8S544Y+qtZA?H8Y{h&;X;6!8$CtB4)YEe28EF*n=FjVK#_= z$5YyabW;(P-R}{Wn8rShJvzR?jc02ZzMva*2JmQ^PjRo|PW#$$cE9IQC1piDRW+3_ zBGtX6!s7c~dV@PTl2Lur{2pa%`fmU!XZaOULHj1xaReg59Y!%lg@}Daqg_K~iw}PN zztH($NN~N)yI>Hw{UKCnox}!S_$4Ji%T4aDQgRwTt9vJjWUv<Zo1w1O?HiMu{AU@= zMf&8YHTy4Q9-wXeJ^`!SKuCs9hSu7(sNNH^0j!&+e;U%@5rL{FM&aju!|>)}$B3={ zfvM+njW7u9m>*;5JLV?ZMj^_9v^oxn2MMD6$xD5rRdU~X!SDkA9W0Y4aXRS8=eYCI zo+Q#6B0(G(>FA&z1G@dd6d-Mm4%%k6_n7oYl8=_m<Ee6c)i^z{5j37hq~aV=Z;lUa zQ#Z!aCXR>@_JhPRM)Vz`@eyynyiy-$W0Ulpe(RbwvNDW-HH_jVGYYid4#S80Rsds@ zx$9|BOlZ7YofhG=R<@m-?Cl8q>5Zd~^P9==Z;p}Rm=NSRq4f=+;^htZ?%{-J=ZBBM zm9KQyc}N#~u(F(KVOp9#dMp-acZTq?;w2)xuXNSaQtORVYYTJv-L)Y+XPT<B>6-p? z86Q?)VC3k~XLz&m_syS*;fj82Ouc@Cc0(A-gK%@9A;0WPZ&0n|LF*NTxm%?}gaOBd zc{ueL>z4BvLdPK(-ZRGryA2%U)(9W<FuKxvbq2GmLzz*AJcI;1W?Kz3et{^wrTo6> zDAh9L(0M7Kzz{Jzko+CdJ)StBA@HhQ)C=~}$Fh|#y-~5ZaS7&ZeFg5+A2yx1cfn<v z4epPla<%tKPDNJM8RrPZ^|+4{@41XZ+w*ey$Cs`X$yhV5H*>1m|F1~V(bdYq4Z@a# zFq63?(5*x!fd`V&kJ2!l2{TPS{fbbKOqMRJuP6TD;Pw#G6D;1kt(ENTZMqRwfeWYV z4(|jm+eg$F2NJebOsH_CCySBLp${G>gcplv)b^7VJ?j$7Q6eOG4T}*O!UK4axnHz1 zF2=(jT)CVbB<uE#BAWlKDewlGMZGfXJGj>lyEgm0fqZ#0s2@RaJ63B%`9KtFDAE-| zZ_H_xrjZcn*bAp@`zDKl;~9jhJ+ZA9%^6{G@4(nH!i6vPE5P^bN??2%TE~86nTVe1 z&!2(*qvY$R7m3rPE~%gFmR`){8TNE8%c5*UUGtM@*8<|0P8NoX!9PP7(+0CS;+oFC zc+$C0uctt$FB|XOycgy4F48R9bU~*3$X6904`(|?Wx9_$=p=3c++0e@O~+A5ddRQ4 zZ?eUA5VCo<b@t$5^D@Ea7!;>!*~!~(*6otkIkwtJOdQbXg6LS+0Uz6ytI%Z8slxo$ z#i`KlIX&Wst8P#m%e;R`fX^vEHPz2GXCU^=OyfVg-qM>E;_8$_VDK{R%|VOM)2&hI z&X((6H#E*mw!|Pu(L0De)Y;yR4z}-u9-2})Aw4Szsd=~8JOF=&AAUE`f*_S>?oK)W zLkMT9r2p*K6!%yRsM!RQdz<WIE&SZ;|8Q8ws=&FoPUG$a4wjS^IIK{41+<B&#a}1X zG0?pxcY@r5(jjC9Yu7Qs<GsK1bbgH9lY4z=pV!^4d-O&_x>nxY+cj-mR1}yz;)m`I zDy+besdgX-cfs{z04v@#1)zdqdc(a4MfFn$J7OIDlpGT%C%df8OP+nXmGThZB^;H* z>fmK(nuC&DC!z}!Y+fn3q$0|N$x_hWb~RA7t}~As72>^`%i{X`*K7Juv%sVo{Oau@ z9zJ2k0jr&TsFb8`HZMh9z)wE?j>h05>eVbI7x7g6>(Yce?$G5$PVVr=3FOS+nRYaC zFQ{>^!VxZun<DCFuo1yg@a;`LIzq>YW7-hg1c46OTPm5mIAR<SXUi-MNnRDZ2K_st zx$g&e0_D@fcA8g6EEWZ!dTBteV7a~coUj4AvqZlpq|&NbJch*F&?DkW)ZYMTT1u8A zk5($1dw#kp98)CcW&5!fe)ePqL*m(QPML4l8Q$&~uxsiV2Q7xoKR5MZR~8{S48!A3 z)kghU*LO-*n9QXQhXD$EtoS#AW+W`mj6&5QNSA%hQOBj%=rE=Xn9N-2yhZiC*y2^< ziHRU%qU|ZzbwF{z-6PfF=ToWO7o*dZP}NWLO3*r6d4kJ7glZrZeCiBBnFxagpBzzm zQ;epuHaT(Ze(CAXfq6W{=9mVIQOVtFEZtiQBF<5<BkF#|{T)F2rzMH<wfyfjKJK{M ze127wJA&@V7TElZ5YKUCdlz=A7xL;Cj$ldhHP+S1b8LFaHfI?&b37e*8o>gqGEp4& z!+~?0uDYF(3x`=NO=!}$q>?cLjKv+S7FPRTTN_am#LT05-~@NmeW^oHuaZIgUc!f> zKL{yeB8z9%P=%v|oUmMdj2L7vFKtl!GJUvB-)@R8e>C0(s@(-QiYo9(e2-=+CV!p9 z+qWkh(Cq=(gsxqs+HZBRVx{T7V;>0xq7&RN0icV4q$Xu9>Tj@eT?<v~yWe7$<+e&G z1wzL&;n_0B2k$X(chuoop$Odo;t*=*;IKE<B&5KwIMufw^nFw-c$Rz%i!<8~PilrU z_JP=V(E;J@{=n%EFOSL)8eAB*_@NXL3%g3mg6B-RxV!n^H~;IaT#6qow+`Dlu~}wk zSZY^_k(bx2N4gNPa#Bo9xG~QA^A8HyD2Z-1oVdX~wwKCCu~^}W5MuWp@7kenLNp75 zOzf58KQvjOXlL(i=uQ^)QIeW)%am@M5ye3oWg~qXy{p_gMb8X29&*oVhUPq5z0EhL zDZ>@{>NYK%F9g<`kk!gWAvW9rGbCag5=M2h`>>z`RV~!Qf4FEGFj~gSWbQxKvjAQ* zbZ<gh{6w(-132Ja`dgg;z(&Md@X(S+ure5%HoTBJ(uApQS%-b=37|c1LkeT7ClSYN z=I4ky)tzG)Bls$c4g@ityVj0bC1~9#%8Ne-7IUR%3+cEIfy&sIKS)WubQkmF5W@CF zf&lFp&>aQPPPEvaICOL39jb~aWC0{>_bU{1N0W^x`xbO@Fiua~%6bSrqGp^+?nlz^ z`{~Im*sl%<CbT13WZ;{W1c&chQ;eu_$FNLuEkvWQ<~U5DCZRRr-ed7XxX)UzC(&pY z=qQXEV2XD&>+3aGetO5(;|&<c0<Bv1N@ic8HmuhwGBnByFs_{hI5t-yD<%34XGL8m z6U}n$?WXF9V(n{dH-S}qac<MTF>DFVwI8ewW1>$-41ilZVnT>J5Q@q=K#jWv@gPl8 z>OE@^EB=oG-r?F}F#V23Bi6AS6_OyT3Z+6%77z!_2l4=cVZ_+Zo+5o1)hm_!Zf1|V zDUp;g{w!(8gnY5N3W490X{7I?CPzeml#9Pleb5t)+mdXS5YwsqCQ?3WCb9Vsf*PqR zkdpgh%9?kRf3H0gL+L4O*V<Ir{X*{m{iS4vQ_uJ>>>w$jm1=gGRlwecA$Fu{1~$Wg z9=pN)K91qx9DDm0_Hc<dLf<xf!qV8rE+fTwj`%Q)4ktrbOr>NyrLK3%BK;6|xhhnQ z7hknReryxc4t%3ZRe#L!6J#aZ_cNYw9q7%dn2zK6PevdGZjn4VPlug-?0p}?X2vmU z7i&zhs~@~J&3uieQJm87_e<mLh*!2hHvbmicidV8#2e4CC1gQ*r}J|}f{Vx0&#;Px ztu#PX#@O&u?8s}@+YU-U)-LdFOjMq2JW)k&IQloEnj&nG{Cm|;6l?zR%Ei<_f}Q{> z4i%D97)!Y(U&XuE@*&;RZJKG{jzVxaH=7;&gji%M#Bv^y>gbd?vOOQ%VG0X`t{+F| z9AskxkIMKc*>XD0^!xEK^um1*dYq_HK6fZV$G;6zzCh9XVQ|c583xuXg`(4eHJl~t zC6)E0C1fCzA*`55{T`E%c<aq|L6WJ972b{qiMXRR5bnL|b;l=vLZ9*UK*xJXf}CN@ z<{1+VN%<ul6{&1VaJ39M;#;;KYw2gX>RmQ2RT_OQiFTaTR-%ywHmTdY$;pO^n0ibn zswgh9kB~kc$Cjht#g4gAZ3kHt5vr45v})VD;fipnLMxx)LT2XIC0(0EiNWQl9z%|2 zUv%W4=%p4EeVrQe#ey0K=kr+BV-;+t!?wQ!aqoebpwlrdBQ{@Zbp~=Q#5j}f(ajw$ zj-MphOOt|l+=(1gfH*dvczuZ-xX5weTXcJy3Wv|$|KJkhp)EhWEe1nN>FsporR|^1 zE8Hs)doYRbe`AZX5c=pDLFSS;`iN>(Bn1|sgf6bhK(*iNexhw=lAA5!yR0VmrXr3n zs4pr(R2hHz&F1-XqK~7n-$fYC_ka_p4jZ2%k+g%<=!{8&8+k<6(x5qVth~x%RKd8R zs#tCOqo>Jyd<w~H`VXmpH81dU?uQgrTdmfqDVT@K@!*@6AeQY%6dpn{If4LT%ras< zdh5@P=9mJxTrT^n&8f08MKnI)ZE8MBCcBcn#?LN3ZSt4XAHU@i0nRIvgQuM!PBdB* zf;hp|qKJe`@*ozn=|2D<e^*Ks@~LjyV~t7|=j}MVq{=`vQ=Jy;+1bpLlG7u+S-o!G z7;OXF^G{oS<4W^Z+mt)w4&vE&vBZJV4w}p~-Yov27Aq$W$dlEuevFG)m|QDKs)&6N zt^QL6YYe+xR>1|Qjy`n{qBCGZM7&r$ndzj41OEs--#^21z4<%4u-(P%SCCK!%_OhH zDf187VzJ!FB}Q<f(9dLEh8Xiw?h%f3zORomRLrOltn16+J+eJfM3s)5*wxz)c?OmV zPGc%(GEQke?;k9|O{7_J83)6Nz@MqR)H~Nu|BcM+_Kk57?Bxr#2?i_9?B`A*{cy2k zBM44)SvBv8i{EZ*oKNmSTA53mArjaJn`jAyuYwYKb6#7a(DP6N@qOGetr;MW*&`r- z-^bkkgFB=TWBQsoBF$XPd0SgkOyvRDWxX(c)QUBu=hCQ;&7wq40y{9H?LqIe`m%1a zw7{W?NYb5T;Zl3+YJW;)isCXQ7m-JZ@m}Wh8`j0*jB;e%Un%_w&)w_LPv#ezOopY@ zCWI^M360mEYm7x^0<+EIZRKlf^DkyQ53G?1tibAF$y&mx)Dr3)CYuqxy1F&fnNV!0 z+uHzcuqk}K+8a_qkh$Fu#`zs)N6h7%*BYYQ8QseEW8IdyER+^<n@C|jxR~POifj$n z=}Ig<WtEb+^@KwNZ4YZ$EJUIybfpZjm!jTEl6c71%;wXnyc@_@vHIGD@o+kx?`+Jn zksmyf8m)cPzA<eGn1+H`jcrvy=xE&kk@wbc&}osW5nhu6QBkwNAlE6T|J(dHJ+z5w zBV2lP7>o7jbTq7*du-tlF9Gb{b^bkMJGUMA%R-yo4|P{}q56x+FrUdOf2YJjy5X0v zX!sUVy0@|`4tnccENr4un##Kk@!Mozxi9k%RMXR|l*BHo4>qqLER=Z^WtyBq0mHDq zfH@47m~3wbQbddZ_KS$t$G?Mi3z+FkBkF0QEt|fWV@|hf5!a<&d_ZDZ957u(&t0yw zkd$Hr!YebDz_DR#)b?ZuS&_k_Y!oSADf}l|O(M}<d5}ICNqf@I{3Ox{hG(91c@oDi z5T~oyITt5%=8I<UcR#>4&aDmOCZp69!1AqG?uMbVF5mS~(|)gSJYg~IjYx6BgGbj6 zscn<8dmy@v1MTSb;Q+?)W<1y&%H@=Zn{sxER*gZ668!H8f#eH|mdGu-Ib>S-Vej&a zl4`X{)U*CxQGRtcO_)mE({0tE;BCYOFZF8r^fFb@>m~ig#cMUmn#r)Rhq$vpF+6l3 zP{?wPehjcO2-O%RjW5Ryhw140V16>HW1&{E{4_Na7w2|4g-y$GM#=YKWHw-G^AZkz zdqk}Fnzet6Y~OYv5^Az7x4A~+h!vUuf1GWt_@g=Lu(=n5B*2|a36|`z+`u)GaJyj} z`2yWZEGD)^bFnyp{T7lCzhFV45+ow>K5Ewc1#pUpg>c}<RHh=}&_^CK9GZjz8)uhI zW;_`zBT4bhmubIx1pe2*q`Mf07<Wom+WvcOhL+LC4E5N}C(hBTTUY%}Bfm#v<j)e7 zR-BqtGa5GXE0VEH4nEkfK&tcpKItd0@z=KS2cROXl*@!-gnv8iq8PV5v*{1)JaB&U z!ENk9PoD06@TV+R__C#%{i?+?h8xwkT2|o<@_elYbyQO=Z$nJ+Tvl_SN5?+^ct#iD z<z($MZ1L<f%3{Q2--l>)SaB|?ZiZor0pyIbk#OUUd822yf-OMOFcO#X<?aV<#+WF> zP%Y13hT42bO<GR7xkk9<%xIWI$zmIb{2MJzsVZI)|A+Qt1dZ^`***3)nI19Z1&;FV zaLztlbf%CshH>1D*b&LexY1}KCu4{9Izlo_i0N8`tH?Qf9i9+WjS9(Lyt0fE%zDWj zUGI<+!1GPJZ5PK+A!x;NeO1u>OAnv{f-cXlU@_D4)t8AWq6%bIuX!2anDYU>qADVx z+Rn1eM~SCq`(Xu7D5gzZ)0S$s`~w2B_%nE&8dc#TR<PnVdgOg0)JU5kU2$c=uRdG% zThR$QvoBwd`xpmbJ2n*Z-9VX8;Xw&rpqSbW#fmU|qp+C$Ia2My&_N;5Il_c~)JIs8 z?fdaER(N?{h)+9d`3>(EbaSCEb;?D~mMvxbAzH(P@jLhvZp>rH0f~w)P7Jua55*J$ z!X5i-Iu+r(!|tfSNNunl@zTmJ3#e^YXXLP|i&um{b_aTkcDvB)le-?>gWrPnfurCx z@?vIe03_%h4npBnpG76v{QVv~!~rvJg#tWEj3Ok>lam*>H^`Z}w>`bRO!}#6pUj4Y z;gW6a{RZ)Q5>cA4=lmQ5aaGM%j$Ar+S2A*v>guX}I~ujD1LMc1Ir<DR=&?*wdVQtH z7SuCi7o+*FECp|SxRG_>hzpoefMx6yFP0x%gR>S}ztE4h^z&X76=UUZ$h{^#G{EU# z@)48ZIPG@8&a7L_pYYs{uC3ZPS_l8RH&SldjKxMBKfif#OqF-+1%N9y2L@hp981Rq zx-$^4v%!Tu!**d^p8IG;|G5cpRzUpu?h7spR4Klug@H6ZoaX(}V4_=&Ve>$7v@tY= zK%f*H!_Y5KNGQ@>k)bBFVOoWVn*qpmMYbFGN}lOvAotcS8I=5E94R&;DQiU0NLUD^ zEF;;H*1h<^p|euwx?=E1Z8!fd!;vg&gEmUWMqN<jL8^~?<<=?2{s_DhTG=SmwUyl* zMb2nUcwE|~9x>Xk1*<Rqnyw^DJya_{Zx9V&YAGB#L_u5QW30XW>@~e9O-(8sFqP`B zs?`OXe1%Kje8ar?vX>scs$P*0O!e+JYFJF|;Vj%69dG@tCwcQq&70}>{REpbMqPIt zU+?$e>*>{aa8G1i)?Ko_Q6o4KbNdM%cXljs$tFed#|+T9a`pZu@wn4^&|ZzIlVTnh zB`}cw0_D|yOc!Q^ALRfa0|(2U)r^Di^S)skNonz;%(16-qp8H)DHr}6nQZ*9>>wrG zXM&)9jH>UBs8ccwjkYp2uqkV*rY<&du8;UWP%*0O>nr+Cp?Vv31HWzl6dx-l@g)BZ zHCg=#zPs_ss(GvmKYSh*BpZEOF{h8H^QK-1i}k=O1I|gsxWOr0x^R!(1XQfsH_ZxE z=mCegee*$_g$1lU%#bW$tDgS4r^$?uswTxn7IB;j#W)eobN$?JHZRhS`(j~Gu?x6q zJ%)SE1ZU!Js(SA1$LA<TgFNn2=FRZ#XOQ`g#F*5Yj*d~rk*-xl4p;ms8f0$@E|SY| z&_vZ)s>7Gu&9-edoYr~=7IPaTIU9aP13&)67>-1DJ#f;3Y>l>cYPzTxH{QB1)(iz2 z%s3*9Wz(C?$1CkYix#%AJ!26z$D#9B>G)EJm|GVb2#h1G>y?200)d0(su1x))v{8q z$M)taX}<Y4f?tKv2`h`p*{;o<h^bkf+@Gf8;CeH4+-`nPzU{?VrzeQYC8E%id{SgF zIEzN)xX;;b?{t$KW)Ql}Kh(9Y&*0$b<%0oAiu^dWLElzw?s3}*sn#s!7~EQ91#Luk zdep<zXu~t8zs|59`3Cg}gtQk7?QOi2L=w`8P^yg=_kWQW9s0pIR$m9-hjfkpbHnm~ z$`8f&DdR(i2D}}CpZEWN!k&SmTz-yDvW7m4UsXR3laj+RZabxJEa{$8POK0g9QW!Z zn_vIej9ME4-8l*<&S)i1R+m4aXPkOcY?mP=S4HDiz04(MftfZHa3Fm_I-*z-K$T5y zAb=FPUxo#P%vfYysQeYH7q=TF^Ial2g)p^(d+z&}d~JejR7q)Dmk1mYjf`mzp!$%- zZ_kABrtkX8I*n+oEW}}Za9$J@WIHoLOy5cDHdKyV>Y|sc_D#)HyqFaRtihJA253nm zPP8{rn!rHcyl+CJo#++&kdjaCLOTETCyA&y$cSC1{ctlRg+5-ikj>IGeYUJu{8dfG zex7LKSY=1p9}21*vG}lUm04U&W!#DN-hvt8^{QLlXaf;S8>0@~UdO^bHl}oAPgE^e z%vzR-C;t(YVZsEMewQ&%(0C>Ux-a9`y_wB)RGKICf&rhVHzF3;NUicuHi{bv-BqXF zQ!)EnrNSwv|6jgC{Lm5Pg!s^ESEky%TI+2C)Tc-TZXFr-VSQ8oJb=+Fb`cI8DqfAI z9ov?1JMiOesf{5(1bVc3{&$fXpgl1ZIv%cc8^Le_)Iil8xIq*-Ff4|Z;zC$Uhc}_W zns!aB(vuO|I>;VHP9ytE5NPPY9bu0BJHz5M=bK-f5{q4F?Y6lf_QiD%?oZiG8d#OV zLqCoUp)?eCkUCzrBzL@1>^Yr~lWf(#xsV4h=1)kDH3JNNGZM527)`DzNNDeHnGc+E z+Vu8Y<smF(4pHVFHsunfBaRSLs`!vzuQ0Ox^;t~1NdKwH+Jp%Te5kEG@abSs3s0vL zgT0#rMxCKqBc;38H`jAEB_V<vX(Ewxz(mPeMgyL<sR1Scgf=aSJd`IYQYChSRblyc z#m>+za`LkRc}~UJ536LdwC4BlX5~1SEzrR$!xvAK{Zeqi`VpP6DveLt(7tIf?S)DG z0F62zCgL<U>#<hS4!UlDEIl02Z|*uZu~&Vkk~U=o(XK;r2oH#L`sCm1zP^GOB6c&x zZaDe(YR?8Ucd!*YX;glC3H~~`d1y(UlgP=91${62Ue@<$6ilTo_rlnSX0q4pW{%3J z{ukI<slx8FQ51FsMSj|xKshg_`PmmmLN&%7=-apr0%-EZ1GE9hp%1Frw$~^b?eJV| zI=TSG$MxAWg5hq<qZ~paW~ZCfEc+14h;2Ur;+4*C{7p6nwlTGNmd7}4aYMY7tZRuZ zuop#w#iIlDrRJAf$e^L`UdqppSS1B^MU%;Hg@^@^YT@HS<4pnLsD~Z)=-?fy-1X<M z(=l5T8zw=I$h+Eh!XJ54(zkq3|Hiw@K90frz`z;$u}I0LUj+ZG#fDwRx6sgt;Q}f> zA*N)PnB3<vw;3ahi7<+gORgZP_{V-o!uF7R%@26{2w_jIl9~@AA>T*8<1V17JfPRa zP)RVug>H2xvi_gcAp)*8L}|fwTQeeZ`YoawxFhT`8=0tNw;D#UjP*i~L^L%Xa=Y@I z{@8S)4qD{Ir_UHpd{snIezk+T5{8%mELYGS9tYB8WMrcP8?PHF+ML;XEk^Gi3vm(_ zzp#`0ZM5x5Fd{0!$+)d8W>=k5z#RWjC{_;03sQZ=2Vxu6Xx#Z1CqFUwr=tB>QDP%1 z;LLV;g)bS4&m1?z9<1m;H-Q|a{#Urps@?^=n9v)28vw>*<CfTAIl;v}liihx1>LZ4 z5rOV=U0lAxh1L!oU^&$QxL4!*2+iu7F+w+%hsv##UZ+W#IY+rQ9x2)a@0zhIUexTR zS`QyW0pL-$c?b5+>kbC5%q~k5q44|EL9?3c_6Yt+KtuX%w4N79_XEf2G09dCv&rlu zsDp-MO{(Q2rle1rnsCE!vZa!{nEkrF{pTlJb~Wb-^x=Iu*nV6yl`q;{q`Qc@W&`j_ z|9YpsFN?gGHG;hpUUPaYN_MbWFeg!TpYFrGW~(Cl;UMdi$sg$6x_ujmvE7>$Q}o;K z%-xps)xZRbJGIK_eXQ~~e`Df$UrzP%2ukLsnim-3*c)x1|Lj<S8p$J7Gxp<UO5}Zr z^Do$N$$6ZvukcZBhYLXmuYnySN9C_mxR=$p;m5sY^G7@-<}H|i%I!LTOfr9n_1mZ0 zC)8mg!}_i)sg1XslWwkGZ|*g9&2Vx;FgOW|{v6kkH>$TbLpgoU>UTn;`Wm`aZI`2& zVU|-`<XDne6%de;Yqaa-Y}+0|#fC2o-cc>PQFzf>F}-|VUfsskjURgR(Y<RwkOSnW z&nuch2|>ER4zqkt=M~9G9<e>@?^EjS*t`v}UYGM1pKaA*ZD$b3f-k#s8hy5o>-kXX zCP>xqRQJy(_-%r13pfNVwsHD)lW`(Yk3=3S3$EFM>?}A&aQqEY;Ht?d+co{ire6~C zGuq6nt*S)xv#-lUMC?T$IrLPIBe@&o?k~_aJaLK6LnTs~J>F1ZHOcR&ZyUPO6Cri} zJ#6h8x+{pODMIHfoQ_#8w)EHwmdsfq)FM=#EKl87v-{pBLRLZ)AHt4<3>7f}{$*4d z5rC;)c3>hVw^FZ>sU{ksMr_0(CCfMZE$ya)*~`!NGcluP7YU>VK%{a+4JaM;Js=Mr zUc}R@>V9w9nq1_Rx(6KMQTJ{g@g+W9jCmKGk4LbpGEfae=hheHK36*r6DI#Y7x>^x zZ^~CmeuY`jNwY}ibbgb7p=Ds(yE6u>(3+0jyv;lG+t=`!B^n&Cen%$mP9FL%J(6t< zD;18(efr8bumRs_2&vk<z*_b<qq3jZ*Ww-Rwv^mx#*eomUB9HJLqeHZ@qE@>=uPgQ z;ELG#EvVkV^c1g4bh3!DP5UNmg=<<zbWl5m;y>zP{H=jCt_X#ZH~kvhy!!6f9oK(B z3$b~Zz$5|t%noz>+o<L`C}Ot4MtZhYrW{j_%)r|J|FhpGh>ix4hWl9uO)){hFkaQ9 z8bx!<=A1uw0Jm>83Pw5?eU@Ub=<=*a*(<@NECeXO);TV;WA1@j3psLp4a9WVFiDg) z9wNgwXEd`{Z+dg*Lr1=pEle#}u{RaAwR|gP(~y;#bu~qm(!xvQ2$ozU>o-aacV}Ls zUTR3}N;D(u=!!M^Bo3<3V{c#o!$*IwbHA%R2pR?r#X3-^*T&#~T1j$ZcrBh>huH=H zoEuCuJ&@3bOwYFbHVNg9rhPvHwH4cw#jv(B0meQ;o!`TT#6hRg(D=TGOsQYniaG0I zjsvWmd#p-`9?4R3j$4~u^I6}Z)_v4&c}L4V&j8-<!4yHO0iGNy<OPh=538-4+XhU2 zKpoE_oW;SuWfVVjQ}OjBy@BdfWn_tg9TV#GsY5_@Jo}X%$v4*_+RZ3h%#5zDt%o`d zxoF9w1G7n-a9pXEL>_ihhtVEU#P5ke$9{Zh&I|W;S+KvZIMCt|4Hlzv1%3n>B^MK9 zmVr~8Y1vT6(LXw*FswT+ZbK+{EK2sQ$(Y#}=A8gH&T#G%Sm?92;m{`z7@i<VG#Ix5 z7(^nrM-U_OWa%>D>m`(-DfwJe1|Jh3hP}OM1hy|(sMT(i$oAH){U1J>oLB=?s3VvM z^=?C=Khhk|3ty^sm~m<|sixbDPl@N}{pRoVrPisU?_$y9itc{Jx3Dz_l&d;@Qf=}V zCuGl0v9A}XUtTsPo?OdUolwXc*F)hHG>cb~^*v%W;k6V$Z+@Y!=@ZSB8@2~wVR4*d zsac-$bb-Dr%W*m!TOt8BA{!klq!$9Y)KeBz6Fb>BwosG;nb7yRP9MHrpMsz73H*W^ z04J}!X_yw<!@Mm&#liE`(b?YwlNXFao9tt40mU(!_;6j04+wn=)kZitJy}BtK&aja zaV|r!?p8RW_iJeFVcLX-Q&eLZq{T1-U?U|E;c&1A=vo1&ZBeD<3bn}ZiM-)d$uOuL z4<o;i!2mJ><!Py>e1?e(pW#t0874F!Kpu$$GMI9_S|4#RIAKlT<j)Qr8|TvA$S{TB zw?<Ey^axg%#`Vb3cxI=jI}yxO;n1kq#})xHkHOQtUN9BP2wPl#|9UMUQs^1U&_^zQ zPNkg$UG-Y970of7MpmVS<1xH#BW5*<v?DKZcF_``0@r$g95zEVsK$Zwdg3DDG!=4u zX<868?j9yul~s`lR|G5qbZW9eNL;=^wC8@F&cb5#FRyy|Oyw}#;-dvEuFjlf8g}z$ zQ{QCd^gB=gF+Q5mGhY%nm-JK<4zXp1y}Go!3>tnTPeM)-iU<2>eI)$Sl5(z!?ZYr` zQcS!KQHD-bp|&XO*v1Iq<q`vmXQqt_h2=zJH*%ao!fB~6nD^f2fiA25FngiW_GB|K z-^oq;MoHYzZ*4z)K^e6lUTh?gl#x<HoAvD$9}W*<3+#he;h@Z84{A_1y($|~j>tnd zeGOV%he*93&hy3-1z3jOqYW(vyx?RQT7SX<<@7K+DwaYCz-!Lu3dve+uLgl6IO}t= zv*gn*%{D)!<Q}j%>O?xYbPB#xTUMZEsu6;NMWtCEvv%Mus#(Y6=oft(ga3K8wt<f6 zZb)7Cq7Csn==!*f-(nLU{n!W)YdWH>#6yqo)?wxjeP{e1URhIlq1}nEV;nQ)<94L3 z#RL5^9kgRz?;Y@FC6(dC-2B1OeK@{r))!uGhhBoltFUnyg8)s4CJ^r~^@N2XQ?08J zTWEqkBC@N6J*<r7Btbo6mSO`n&nYBz5*GCL^Q+jt?0BWT_!2+J<wj=&+RPdO*`}v3 z#`LYX`&d(hO&zZ+Bj7cb9g>oE7_X>IA@Renw+a*9=Hryy${Ho=;1wi~Hu8hwk~uNS z64r}v_0nKC{olJs=pz<`Bd)}ND%fehg%i@O7KE53LHCeELvtXsg#d^lTenFePv=7s z>qnPWljkqY|Lg6|lpLCgmfIi5Zp*VO>5bl>5BN0$dc%f|e!P6DJ7WdmIGJvw1LW;L zEO)B>z3rKAP;T3dLy<rA!C}++W*8B^cak6S-|}5>W;9$j@?}ySVoF;eP6`6fk-$kX z2o(_~@v2Fk%zuVPwWZS^d5Fbmf`~g&e295t#&YaxYD&R`*_3bF=1Cf=P=<i&W<bd0 zsQ7?liPb6)EW*hY*%K$Saeb4SQp=)euLIwZ*7LUzuTmy~Z1Ip}=$i@T;b%W`Uk`Fo z(c^7#g#a+6(Pt=Kbw8rThRTM2A^jCm2}JLa!z&u}2WYrnGfqX_TL=S|^z>0pM1DSu z=|ua#TKP9zskTuK{|RO#2d!ZZ0Dp{zqa+E~A^XLX$ssE~nIEzruAR&d5i_yIFU8`; z=ZDl2E1CUv`11D;59tLQMRo(pxEy`@?C><r64i$_U3w5!+vV#vA%L>uJ1Y+~MZ3c< zRAMix`S~KfaHA}@<OGTY-EAzWR);+RXnnn&byFGJ9SU-dy5m4=jgrHiELa?Ng;!iq z)u~)kBln5J-zlY0WC_z<eI8J3+1|+fpc6d~!8wzYLKHH+&lcGwZ>Ik1ml1hF5tv3m zo_Tg{#b+nO$vYV4L#-GD|B!`iWVo~<h^d3rWn4a1k<j_&R~0(8(Qu(0>_;F`;nIyh zj!^dS@>~e=ZHD^M@;!wv>%Ofb(gQJ6eAb)Z^Y|957i`cIwgr@sS#d(FD2~%nN0mUY z2}Nh3j{N&I5-1G#0y$q^cX1)ca3rI0i$PROo=EYU<X%iBU#2v;8mDO0+weUp--jx0 zSJ&s6m4?KVi_^ESsrFX!yJ~6rAWaYP`(N~;u1ph+VAs}QC}o|~Fo`*F2A%1YY><+R zJ{puf(aF6FbjFEh@{G~f(qyr(nFFM_i)>vWFt29vq}44f6GV58!wpY(>KZz7HMxZu z2sYSiN?7V6QZv(gnp#x4P**Eb>tCr5?8#O~2f6&`vor`%7Hxl+qz@0zQ4X9e52sKV z3B2#adU8XUy<i1c))V~J6prKPhi#_j=j@Q~9>a8#%sZLT^J|otTT(h?_+c7JBY;Ho z2@@;VI6R~glVwnnvUT@E7ON_@`sD`@LT3g2IZEEzXvGQcWWbXYQrNAx{@F5jS)@+3 z|DcM$CCy!>_{vec6+B##P8vJ~<&@+mMTB`X*TJTgCy!Xu?9Ezd_n@vYU1}CYe36(i zqBzizHF)tX8Uz{H*Ki#5blTIw;v#^|Z(Y&A#YHmz^mpNh-P@}s{{gH^hc^*w9n2Bu zf8IL$5t{k^!%x|{j#$~kmsfXd-i%u4Dk4CjMG(~#@hPF6W<7=4#VQhK7eLJ01G<Tm z#WLO|yNhOLOvpoNjhB6Ol8!&Zu~+d&+skCPV~b@M)Qu@yR_BxVBn|QQ=K7X)po|~t zMpiZD@YJWTV0<C^^gqu!RPgF5G0kkBtpPeDPJs*3vg{>MfWCdjZ~(;~mjTDII0M1n zT%lEJN^LS0oynt11G_h@znI|TqfbR3`7uh)9`4Mv?;UEVJKY+I>tP+8URJZo4=0i3 z<hG$Km`w6a8SgTw{sIArJa?9c+|MK9T1~RQB$b}RxLi$UKX)Q!_mq~drifOH`AJ!W zQ7cMTnI@G_%BRc}fH%D&w7!n+m1+r?&+nYH>G2&YnZ5T`XDhLp0v_GzFG<ukpq<sF zVZvfM>#Gq|xRfMpvViXj;fZIReC6Z|O$hE@?<^>Hu{F2R<d>8h%6P+JXJqgLokFu> zBbtzPLAe!+Sp5g*Pjb-?SPiBPZct2tpKp*p`QhRrHCyI6miT%6A$A8u@lLqm4yo?x zbB&_Nf8#8|-$XqKYlIRfsj%G~PrmG_Ii_VzQT;?tN;dx}8L}T#`P6J++*=WKAa&K! zx|Yfs<=IGgj<xSr*p2fk@tcLsy(AyAM#n3syX6blId4(B=A=HPx-q!38JR~Y_ep0| zduBGlC>GPE8pWEc|MX`>1kcLeLW!%tx9GvaqLTBV>!>t>)g0W7U8wRvprw3q<Fsh@ z>VgH^P_=lgvl{C{m(QawI=w)&ujCX;E&hGTC$NfK`1ir#V`{>W4|=PDJpLI|FPryv zw0{=^@LE__kSUf3K9pLVUmbo%0ZVE&&j7X}66d1NF&8}{f(s@+q!KAOd!o`dwHEW% zLTe_&3s@}8RPs*iEw0I?VpkAz{*iVEP1t{^C^<A8h7?#b-AA_<)+$H&{KRhOWAS8H zh`(u-3hhSDr*wm;B$dOLn20zH#WAActDHkdqacp1X<0C=?nrHs67QZ0`e(+jx-64U z13!LE)XvuceAd5n!Du8Sg7)UBeM?8V*)v(3#L^Ih4H+=~j8<#i8V~?&^ks<WV)Oow zyUI-3jAAObrORTU1n8PkyyoRs%}4pAaR<K(rJV02^!tknZ7wKMlWnHzl>z5O41d_H zCmL+tyZ^&%>BR~Gg`367$EUCzBW6%+FlNg`vIjxs27WGMkvBElCv9E5-Ah5aC-aqx zS)Wn&Aks80j3xKEOyv%BK2&vSmLFW4h<GzzAmOH{2YGWCj@-Pa6HJ+`+BY?e5A@}i znbyP8BFjp$l4=(>K<oh-zK7CPp(*igj1#^@YDzpgwWV_-Ok7Qx$`r`*pKfYKC8Sx9 z6=>4Ve$tVnM)<x>XYSr@e@5>Y0Vh@dPkXzZaK>MbEg<_=UfF6k57Z~<;JdY;69yp> z+bC*1T}&cctZ`0F0h4L41Cq98TSsinHA2`ECj<xpyW_>!Pkl8b9q*7@M`%ObnoQk_ zLr#s@9{qhK8fqsd6X@=6nkrRfn&)Sk0SDX9P#a_1CYvAJxheA2_`P|v9yLNI>_{28 z!mcQ1Q&IG=O`Ct{>Lw$acSg75%34@1@%?Y@PEYd|U&jGEvVtKxZAZ`TPPH8cS>8}1 zGcYEHg3RmpiJ9^YqK)L5Js@(^Q^hPlFenh)VlM5ZR&+wh_(dU-Z-Ad8Q%WMAK<_BC z%^!Gs+*50jn14ulOg`=>j~}_6tA4!6m<>7;Wc-Hs41S={7;+2-*@8{51rq^^a<Tbo zd*-~bZOmXQC!Yc+ayjOKw6EMVEtrwecZaF4;Gfio(~B27mV?tN2^14yr2|T=vp-s8 zYXQ4|ac~mZv3@wXYuG45m1J4`<nRxgkdYh*6_E{`L?x}DCt8T-Vu5QE<ElYK6>VSz zi>ul}Mg%$EmdWq`9PMo}903?4?AA}Ed!4lQqpt1lHh7X`cmTy_%T#X|j;4n<QnIT( zi4N)32QltW4)6T$f@Vt@KIhB&t;3Ua&CC3W8hO#%3Kce-{;1N2f*@k2NL1F~>flpi zcWQT?cG7^@g6`15kGGigYO+Dn6$(Z4<$8;&=s|9U#UFUf=Fo`kzmR&lkmT^TL$T%d zs4uBMNFMLx-|k;ZZd4`}M#OCN9wbgg8*YA<y+kl-=xDU)&5tFWK`VHtK*7e%d{KWp zSy25-wo#sMUSrnyazh6@U${8M?}>sn*Rd!7%97_0ha0lae~77M^A72QaY0VpP@oyj z*FVz<rE1N%f0CcIpvn4pN9(wAeuhVs<}K;M%><fQr0^7zw|ggu+K^1PUEdO6N!2kL zYWz<Oei&)rE7pK?Ju0xkiKuY}(j<pAL8z|UTzHQ47*XhcINZ`%0dse<07B-!9qzbC zklN^eePR12UJn(krM||a9V3TnxMJKw18rPB1G%R^{sykA4n8q1jnNVWZ!Y2z`Q!U& zbcJH^C-gVihe@RI-ttnh+>{fEtvwc-ayeIoJ?RB+lYg7%DxWq`H)eS9&Nk}_LKlY1 zH62^uV>WGR=qJ^|`<wPnMNau|bpKIBXfeiV{=RE$e*ed~^5I0u*g`|3!pV9)nfOCD zl;)gg3x|0M3NvQ9WIn_^8&k7OqcmQnyF`j=dNRFP3>3sSeWQ`Lo33ESPw*|SAt34Q z!1vqt-(qeq9n&P;5$<e@9ekUz9W}_ZoH!>?3u%EpxrI0_NFSYTz?Asllilf_v!l3K z$AO`^N#@-!m&Dzx^Kl2wN$W4GN~-p`tcypciH<2h<R;=CoE<s+Hg+%0%N7H8PD2r^ zCq@}>a8J+w#E=UURJ6Rp2tU`v+w7B@v*{HNj&)Y&x45r&{(+1`o$hZiWX5zYTP&=6 z^38K54~&|YlQ*v6SROU&LK}_=wNHONl!w;&pqtuNzvEiXsDSd0LD8T(PhByCM5y>? zm94b%gI8<jO$kbcOeu-JgGpnZhMCTi^7{?b?wYq%?}u(rh+8cNvoMf@g(XD(IZt;# zidbVm2l~o$AE|NY?h<04>qGihB%*b5f+L1Se~(1BBd##Xkf?5$EoV$rN6}NkB%?h0 zmv-HA_>Nt>NX;i-UXo2OCSP%l2Qx3U+oX$j?t@cIBui$d#Tqn@J4@oOz=lsO2|Ph3 zw$%;HCR<{^IMv^h(=jkR`nkMKwv5{8He231B}+R;=iuI!oBtMr*LK<!=}2+U>#-}+ zc6e9#i^69Xb7NUMt{6L}UY`3Voe3MQqQ7>08(XgjeSZ|g`RSg(fRK$ys1f?c6jRmD zFH>TgDRCJ+EQ;vxvKBG=JEYi6KJL-%Yf$-y&b)PUb9<gDHc{D3{$GKWFkR26t6pxN z@6FqthQpmxI+>Izjgze0APQp#6`-GZ0*teUH{9|SgboR?I5%#t?BFfFc!gOm`RCIe zzV1?L$ZD9jVca7dEH&}4BfI-Jxs283eAClldp`(CI5jc-w?pISE;Mj1b<k<R&!3V) z-%#M1)W4AYLYG~}*S~b6oxDKhhivlI3})h?vw-qwU7XAH#Is)@JU8tdtxfZDs5+5X zXWm(3!kcKi4UH<U-&wbBspa5QhG0I~a`Wr;cNM+wlslPH-`rSln;CRNo%>=Lvf$tx z%FwqprEd5WPWqmjEKjeHW8-j$p8tS66Hw<lKTwbQ5jsTyUeg}*K;;OrR}41KqaSEy z_Mxe8-K|$<8X}A1b6(~wSEyTBc!Ng3-3&!6`!^YelUaP;ZD2HQYfPMd!MV_gk8<%D zVR4O(UReG%bxh*#*Z>3O1yR+P)KKhJ$tZH6|3p>#@DhUzuWR8aG57SvZCi6iaS~PF zpL%$-mG9c$uV5TVo8z-Viw6Z#ea1wIHg_%<&D>p9Ki=+nAocn-5K1SqJr)Mp{UoSf zQT07ZCL6MZzn`FSRwR$UOdoC7f6T=+F_^}>ZMfugXb=(7vgJ2mXsnb9iOlpZj?|^G z09`<$zn?B0upX&qVFrD-dqyV+cT=X(opRkGoThN>yO!Y)AJG6fG{}1)bk234M)e)( zj(^L3#_`z`9=j8Jk)5CP))Vu`b7IT+m^pc6+26#&t6kj-R*mk)%0qU7Cl{CE=YCXO z>f`q`b-0Ye{f|ht=AX4iK*efR0qEG^fPQ%6;)oOjJ2EUuBcaTzDuiu>r6lVpvU)u( zshfFmLN<xd!NBK0B_tc^;jREVRi1ygrsl9BUh+34Jk>vsJ6iTfmfWoK1FSHb-UU^| zuxKOcW5wW`_5__~Iqt`mZU!#Vhf#<JFYlEyHLbg{@Q{V8L+6JMsf+yeq+YWcIs|-j zU=LfDj@WcHcbhh?5gRo-NYvo5#PzUj)}O6|X=>E5@P9xId7&X}NF1{nmuLgW&wbga zZ*W9R`2FmD1W;~1BR=ve4H!svbC%@Tg}7M_&-q+j(kOz|S{Yy5X}f<VW%l>`SN6^Z zV_4iwS{Lt*D#dRK|NYd5YfU+QK0N?$+M_{8FhRVz7|?VGeu!{UiJ}41`zSDJ$(!SH z;Bjo4&U>g3J;TSV54)U4-4`)W!#<pgf{8Y`fbHo`JM~9b)^5Nn`|V>EafiAmjdVYl zD;h!WIu6LlRJn(a1yhny0oY$=y>CV|f6dN{;!P!2Dx7$X4&a$NSzL7!Ht;~N@(<T- zt-KkQWUI%4JT!HBNl6Z<FNtYt3P74>TwKtg=&5_p^w@K!xe<ob;4i!SMitiCX&I~W zTX4Wi{LeKF%`_<(A>0K#-MSDNEue2flOgPJSo_1bmY#R$c-i5ufaPL)pB;iHNpQ`b zkkjDI3v~IHyEAM$e*BG5gLjPmcmao#MOpRnx_t}PNJc;ihsiM~ZN|OWK!D_C#=;m0 zV|n>#h(~~#+zEz|6eQ?b`=Mr-H)6<r4$V2%luGBFLor;DQ~IBbGn}k4f|o~38af;` zQ3dQBdh5cCJD*yIrOESV$i6=4#{`-S)*KfAZzyty^!V7ira$$d&N(InS!xpGD9%B_ zN<zFq5Vj|pE^J0<YyW9A8bq@;KK<)+?9Lw`$jMw~gX&gNFK>VDu-FMRVi}=U^AUP6 zjzuMC8N#r*k?=Vjrce#l2Jrq`wiVW(YJaOh-B`7h<3$O3^eF&C`tHxW$qOsK8tz_e z_C30d^x@TxZ*Nq4y$kbI2zFGKig5ww#aAkf2pHH=+o;Zwdw4Ws>@4aC35^Md7eNPc zp`kJiD3cRG+-W+X`7;d+Sr$^*4RL$bvgfLBHnnOc-kkOwhMSy?p>M(CE%RXf@Zwri zwFUKJ(Q^JHJDydwA7&0zb<$xXgh4L<b_}|wHL+>L+xsb<`7eBMqVNi0zFwgQNo^ zA;%f1i~UhWkQ2>%lE+>EG;#|g<2{jxjfu29Q0ask)^R4&aS1{#$VMY$&tV|4RX@Bw zcn=$4Rj&q+GVRV7O)IO?K&g_{F4c{Lgh8F&|Fg%{6vI<jK#dE1a090>EQ}(Ef=I5X z@T$<;2(Q;HR0@dO%;yfIQHtz|ME}!=0FL(wo`wcDsQTH3*c>Ww(qtM^^bpD64{vZd zXAMHNk+1!PMLJmh(XJ*9i`mCCCQ-JOt^0ymo}2cYpHdbcf~}P6@&+s4$)&By+=Ki7 zySr{42Mvf^8aIE(WqetM#=5m&;MHECN8MvTDgeVVFa(N$RU0sDFK(C<jrG>iB}zLF z-)FxhOB(Vi>W45I(4&DWwZ1ohFYdB`d!5@=!o!`@MnlB^+fRp?*s%X{4S^AdGw&X~ zu3Y4gygqA~Z>=uJxo~tP=@@175S;lxd&Hef2b_-*95bAIMcjpyL^y9Ik@hVeCAMGC zu5=$M8b<Kckrcn_X5Q`=3+_L~$-AiN2Mtxnt;VgB@seDbiU{fTD+Er*xtOvhv9=%2 zw(5wZ3N3brrb{S|Ac6Y8gm{S#>R~nnFDi=bzfy7ujNg$G0YD=Fng+aj*z56<-WWq} zceh=-5!6!X!x|qi_E%7E3>SQQl99O1!jQ~UcB}AjSPi3WN#8nA1qBCA8f-XP)}V&? zHxS9XWesHDe4?c{nYTuece@emrwEH#PJ*;qUQ7pSHx9bv$s5(cXrzaprlf3)9~J%6 zbirNxDB{v;7W0ViT1{j1rnutvpaSPjO5CoC+xL>im)nm)K0o^{@@>y)got>!rvFr( zhlvMq&KG8J$tw^F3}<^`2-`Z>R(Oy5u>#o3z<%&Th%l|-79j9x>8(*YHmx7*(TBqk zA}e}*+m$2+qM_#t#~$s`yL1m-(<Hjg!xEt}B&~bgd4%-hGdjHikwld+=)2CjBW%dr zG*BK|2-HAx!2{3^v4`04W@=WzJO^k}y(l1%Ujs}%#%VH`dPd{<(5ELe+V72G2GmIy z$BsJAirVJ%z;8?p6GTG7sv;`iC9T1`^024rb+Y0R9B$#ltr}VJbyFzcva7FfJqx*? zMRoIc8LyfGGu!DBFS?f#OVm1j;_K}ZN6())@Ta+&Cp6@FRE2t>acD-x&CuSoZ{sZZ z(7Vx@-_iZ?1zkLoD`;eN5V*Qr%xFobi{nxJ8P<lA#$M3g1&B1zMQ~`<qaMN8-+7&& zgE*s_#BJRgNCMIjn=%9;(wI3EHv=bzHw72wXEa$o{3KV{ajJpMw$g?V$?-_%AUuao zEkTpM2a^fd=7L@tgkTOj?q?KT&~wO#(6q6_p1KgMKM2k3q^X>3*wI4sa?)qS#u$5- zO*~&39uGnnN*Tmhd;pGe4jDKAM@J!hnGroj=KiSZD8_Q2JT){uc*Zfbv9}@VEsI=5 zwR@AUO^kx5H)bhp&NlX`_+#R^(MQs&b@$ABmF7pWz8ssVC2NxG6fmquHvDUJw2mRm zBIfp@r^s+>SF0n6DfPJq@<IK_$koL)Vk`Ed2nc>B$>jXBf9thu9G_5UoG9CVe-@Xz z8=6;)T6Tw(k^56km#^H0L-t`oq&ng%qYNdjt=2GV4{@_b%-`0u9>sXML+!<ZtTp%A zgIFtq-{OQ_-p$(#?s9MizE2Nr<cERLV1_k+)bpl77<yxA7+S-7!RT%+QJ}fl;Fa{z zjZQGxIu<xuI0qwMbfVQ(6J=jvYEUo4Wlv0b4zT6-Re9q4!+(VhvTAboUyZC@TxKbF zV_Da7Xk&ymF8)<;t8st0leny2Vkf;RHkqYLYkUa}<K+;W5-lkM=RIxaFHY#)&V@!o zsZnefsL={}1IG6K?3y+&#w_EZA7*1VvF#2LcIC&jNbYZ7N8T3;0|wN6#Mtn{jxn)I z4g;KgM(tG>mWFjzl^Qu(&qx|U)?0^s%x<@e*X^4^_*I_d*B46exG>1`hVB3iB|qap z7*}2>SqNxN$&Fsg?1bD`TRdBxv(yi?73K0Si|EOx%v3?Y7}j>kpscf=ou#)Fj_xdG ztW2S9BoSR@FI8tB#OJq^+<ladalWL}>@PUf(EK_dVBZm-=O47NG1050P`P0oQNsub zYTS~RTWXG%_2{oloO*GK_ZnAnrX;STlZ^EZ#aG}&Q^E;;uT!I+7D)LJI{XX=AP15m zug1vO`eFujj^~Oi%s17OlT3KJp+M6`C+P~qT+cWso-S?j6|nP7cXmF0+({P{)c8Ym zfc~7OU_=ddKiqb)D%_KR3vja~l|m}c8ty@3OvKUIBtx_7?#CV^j%|w6i;h%UvKmE6 zs20-e!vQrqSF_De@3EmYB29*-JV@U@Eg!F3)^{+ct0sD0cjyU>b)TvN<kY<f;JW6s zuoKFt+a(>0{O=aQ+LujbHABDZ5>zw_5rQM-PUjW|kVRX+pb<s~#c7%7223}d+6T*5 z8_|Sf=#5%xO3&LL5{6~})yko21ZAAbI1<Lim?&-xIau&|*<PjTX*adjUHa=wDzs@Y zX>DcVWy~<c-uA<mu3#8-#h2$hgDRkJewI!MdC|=iG(H}gX`80I1PFMm!0qhv;2&|m zD)pUZAepccBo{c@h$-5hYv{~-+)YSeomMxCf(o@GY&y^umQ^8FYq-AH&#$TI?3M0F zw0A#iI=fWBVw5kwV=v+lO(pb>Luer8!j`3A7QffjRIGe3?P83IX~>`keZ!nv-ES3; zC#o!?tBqK*2e{YCnm4YfOomLzT+WI!3T81@xbG)AIKx_IZv(YfeZL2fqJcxcNJ+?+ zDpRqC9BM76|Eo;F0edBe;b3{qp)R-{iLv&IJ|pjhLe`PZ-(2tG>fHOgs_EPMXH0cJ z>et>X;T5w>X=n0PwbAtNrUw(zT=RfheyX{7_G$7@KV+r**$zns5@}`eg<XLIoIB3e z?VE$rQdR%b9ccT+qj*fsxHhY&VxQVIpgG7`7}{beJ63awyJ4nmtKGDHbx>X1ftH^< z`I(huZ>k2|0}>c9??z>Nf7D>$c38L}s!4i0@;c%t%;<DPBc^G_S1OI6#i`p2T9^!F z&VgY-ATwt7Nbty4tlbK0Hz*Mkg)E6-Mr>vW#56hJUCw6@?XwQ1KfEEfWR*}O4Jo5C zK<e*k&!>-4M8BXO#pUAe*ikKpSEd+$G4T!+9dRL;Jh3Jw0XPeW<o0__b7f`vcG?Ew z!<Tt^)HWlwDg10fLY!k$CmuFqv%(4`w9_@A2NGyr<7EKV)Z<REaq;C=n_NLVvht7z z31wZ6L#f`<nNj&ohuV?ttBy*U1A!ufCBnPoBnUxuL-2@i)MBgsR$)WVEVl%4n{{x| zey`=4Z8aHTwt!_8dhRgV2FB8dph5Q9=Jl#s#HM^4slh}!LE_4D#N4qpWLooV+>hif z{4{(;6vRxv4<9-;mk2{^?30z>Y(43An^&e<{)JGOmyEy>iXu|ZTjq97Tx+tbv`4fE z;ZZJDlC&2r@nvzZX}y&9Cdw#%gz*?KImF};AE~ta!5FxkC|&{t%;Y>L|6cbK{d_r~ zEZ6-u4^ndT6%9%4IiBXscTc0*HT{R$FFqx%7|qaI8XZx)=53lb;<NI%cT&qKj5V){ zzIj`28A1di8;%K9oBXp;ua{c$A55Y4=n`9ug$+^vNucD<2upWIO^h&Jqz^UC>wVG0 zoG0NgrV$+CiV-msA-k$xP8LZqHE;XL4=l2fqSZoPoGO>HXI`+j6+M%#^=jd<fly){ z9#b&-gfEQq?~M>FrVixZb0}@$!h25lN0LaOBEc6!!GOJ|I6+-y&Ftb$mA5HtR7=@U z%t#pp$O89?4Do%=m;dXbL(!=SQ>8TgYkCU+$hVluDxv}uUWZY_l#?H62MrXlL3Q;x z)d))iAk+qWo6OGHr0nKob%#|=v7?ykWCcY8f)AvTsO7}vOWvBXS0dgWMmnb+wUz3A zNspSl0J<}xN^|7HqOg|X=VlDNE?!V%_QR4M`Fu26@uA@oXXJUT(`m7_59&RJLM;%D zlxc2_a;9k7)An51Q=frSwr%7&4J?j$=#H^sG7<^EgtQ@OFf`4<A1rVT5IQ1<>q(PV zJa@_A3T3QfPWh>rdrjwKkgmJsWF%I0Cx~$LJ9ku7%tOAYID9zIYHH^cG(i3tdcR-b z9fxt!(Ox`YH<IW;VPndS-KlwUZu8IN4m&f6Q!qrv@DHPIB!6Jhha29K-cl+lew?T; z2fm_?qa&?3E;qj~SG)5$Qspd4&t!I^`JpsIm`!hEO`=%^(axH$GkfryE*@1%oQ&%# z`4XAe?Hj{pqtN62rCjv-=uK?hrVL|Dv#q<i1IYMmxM`%sbD%F6-P>S5xn-jj;^<yd zUJ!@Fr&qdOXz?glK<*k`5WuxScrcq{V4N7~7dn9^%e6WJ75j}`*0H#>?Q;^|Cd>GY zbgftO<NUWv!tpr#NEjVQ<7&Afc<x|RD_V34(BcVto8Q?oi)wa;H$s|xfDQVmQd|5C z9%RhH2KS1=dWyq$OE5ePmN;xQQ(Zw8Cto8xh+bYqa2U&T4RiM_uT#2c${dfusZOeu z%jrgIX(%;KzeDAE#SU$|JKANC$_Ia_7!yvmjCPaFD{7Fga+}d90Srw62?#ho6c~!E zcU<M&*BoJn*^6dd>vR7vW!p^VshU^t?unV8W!CVEtbbALC1~&|yUk|@FMg(&%o5s& zju13#s$l;d)~>2BqaEdDUx*y9Hu3c{%)Z-h&%T4g_#KC-No%_aa7yj|Suak5YTIHy z{X$JiF}qZ8R}KGO(_$+O+#w2Y-lMeKZ*dJ*o$8jV1*we8R~#@AkY?h}W62dq+q|m7 z2^FhZA}S}R!B{tq&d9_H2Pi+GfYs%<P0?5tn_%{YwZICj;OYDq!4*9=09ZkBWX5ZV zxX5qFT0nhp$f`Gj<U7eX${zfQHO|tgaFJ1mW6MN2dDyQ<Us{#Bvy^<u3z<8>>XCnT zgu)+P1@QyB!YJ6>IU7)N_1)Tfq5`}SEjAo8nntum)yk+rTXJl`r&pcYFMyaAg7ntl zdc^>-cHK1SaN?+{E332LDvN4}*G3S+h|!O=WgtDM?+gU_Ev8pYKH_y^8ZL9FHN^){ z$-v&Zz}k+IYgdUR{sR7xn@?zr9uRBq9Q_bR@*R>fSs;LK&rvn05x2iUNjO~5f1-%J zLq%_&Rt<qA1gIdltM^gq{YOnbIcAgz)1<K}0F5?@sh?`#+1`UYtbuBl-Lh@2h>5Vl zA0(-?F&$UeZ|N5w>%ZyRv?>kThIDb2#J%kXL%q#QgA|<pk*k(=2(DnFTzs*^<S^TY zyXTa(+Bv&sx(s#{Xlp_<-D;!cYAmC2t#4P_h=W59(3zDg@V}q*6$uM(iWQ;)O97Ei z@~7$BR@1Mw`_0D!cTQXH&Ld=%>AEjJf80~)RYvsqH86|{ds~k8FG2TJkR0^NdiklV zq!LU5EV@`;3ZCm(^y#M?Z9wZQyPF)byGuNSHq<pMnOz`PI3iRRc73ba=dg2ZXn4|? z+_T<k=W;X0<)mx2*x5=0pz7!7V0*v$eR9|h$MdM^WU)|VL{p~<h^lz+1GBj?JD|pq zWM-@=Ol0^!+2lMXjFblarXQDW#hNL70xyI9X-;1~NqDX{e^79wQ<XvLeAv@PkaFtk z7lQ4vOs;RJPh7PCrD7r3NRwj8kzybg15fg|f8l%%wZB8A4P$Vlz=ByH7Xlq`=^P%# zPqz2&K^5B4wKldeNLF&_v|=eS7U%VpXXRWZezX~?62g1gS_+}Y%1v}Wy3x5h?Cq>u zB(p{gk)4w2W=aepxYU5mjwN08=fyhv`kTwm1J=MROka(PR3r+?tS7wznOQSy*0xD< zgEGqa{^d`BZfIh12BKm@{p=sMCEDx<GR~A@kWv;gML?w28^jr{rXOyn%!z~%XOUAf zsl_wAYNb}}w$@9m104lJ81KpAHF#um;T)reF39Wr@%A2_kmCh09=}H@pHokljvDne z{d-FdKZxO3L|Zu!oIs8pGDbuHq$C_?M#y$SsVkWXmUApMfvRY>J$2DZMSPE(QeM5s z4lDZ~a-r=2!Hz8|)Z6JNAhKS`E>Prxkcs#KQ`Y1kqL)uF-Cv}sdW}Xi)lw*k+jNX) z1Dc;5$hFaIRrE{W3-&}x?kh<a>z8-2C7@Ab=TvBy$=cciUm$&r@Z(r{l*v20x=&Em zCF%Qn{X=D2Rv7yZHwoD03+SHY@H<(li`jm-cX3Mv0Dg!IZWI<FK2IsSsq5p@Y$YDF zE|N26WZUKHO0Y<l=RQ(n&ufkr3*UW#Nnzcs-A1|@VdHBnVFe@va-hH~VC}6gyd?VU zyN<blewee}!l++SaEO&V_2P1*fz@JZO$o|adWg&#|FL()G{A}hHw;l1DXy(OiFRd@ z#|wq<>+u+NR?4ry59YCRWck}v;Uw}#$GZyl^XJbd#l_2uw}1k2L>ML=i9j4>@k~_W zhtRoX;{n$3m=lN%N|4drk0($qZmp=YPC}cg_VmOyvnOAynn#T%c)(+eoou1;k6pP( zRKv*nbMj|s0{fB`ecMn~rYx}u$KKFnTSF?jumJ8E9CAN*QQFMF2#vIT9nV5%B_m#V z04N3)m$0Wv?9~ZuU145N)%ssdO&#><AaicaK2&lZH6rACb_8Tx+Pedy@0_WQfdk-= z6Q9}`r}VrY{2=HmPB{rj{*^bU{6_6dicR1z*h)_nmYWI-l#4=KY6vefpX53N7?wj< zro;t=7ySHXuSik;#r#CDgPoMjHAG_s5CLQELiyymFx!zR8_9Fkyd(E`MNbh`k*yeM zL@upu)Lq)BCLdap%tHvwMvNxY0TwF9*-q#y{yDJxa7pW{bea>fn>l~6+Wx>$<O>(E zx8g)uw)yEQH8l4cHJ*|)c1&*?mUBiib+{_P1~8$39^yzI3027{6)YJ8oqwBEnr~sJ z=^v1zKYLSvrnaBi?IY1Tq047lb^EbuGo-TX$P^i73Iu3Z#pyGseJgqQD8^=Y*4sNA zV^FgT5L~OLDfOJntU4WzX2V&xDTG&YX+;k-nTGR>sdz+0vOqweO<-s;7Omu};Cm96 zy+K0UqojX-2mKl4SccvY)Sf_F%CkRUW9W!vNUa$=bnm^wYYWQ)k+owbP+oynehVbG zX6~Um!$nV!V4g~L2<U!W1+%s<gX*Bh=dz;kc2FYBhMLmeYD532m=cimsohFQzEnU7 z);iYu2D~d6uYi*EG#G-odP*|LF2ze~>&wlYUb0;p5OB5XeyDlRaW<CcLa%K}gMhu7 zk|<_1G|nh_z;+0ja}u_M6If{ZhXT8f;@hZC^rpmyjV5FtdbNDQaBip?w}vK;JNQw~ z0*TDrgdxvwU494>3|LJ#KK;1O{umX4{WYf0$wDhLB3K?RkJ0dbx}#StsP>l3)7I-w zz1yKMyL4a_mTaJeh}UVW#<AKGn~n)PZ=kVy(RWx4vAq<>n=?2hpU|JN;>3<iQ5b8R z6hHAYVt9+?H()<M&#Nvz6hm1>-z(YvG1WwqMXyYoqQGu>20?*n2NzdZ#cs|b4`<Y% zx9b7wtCG!+RCy$rD%%g0mmbgd9IewGUP*`w+2lH;Vw%JrJ{(&!*6t2u7X>2fIfOiq zdw+T9Vf_ir7S_$MJbDm~ROSxynDc_6AMS)Xkb6$2WS=(4MU_n|P%NK<bJwOk_Dc1v z?l#!2WyTyuxO@_2iit7)t#UzRXlnbf5~mhQ7^9OTQMkv9<ThX)aJduuK*GP&e6=a< zhgC5eDE~t&jlN!2t|KLBB2bTrLyLXn{2vjf7f(dtus)NLqhEc78DO$Sa6fXy8CwJy zvC9{$JJdHM$u}%`K$H3k+m}$jRtt)g-0lJG*;5D2RM4bgDJ5Q6#O+&e2x&o2`x>?} zRFDWABB5oh-!K^$HL(S}=AQ0((SCTX;KY=7Q+mH`rILsG26%;11y*)gypz(~JF50W zHav)R+@pS-YFX4K4lkzbvc77!GP*p%5QZ{TM56tXvpno|bP=W}0{5P@L?TMIb9Yl} z<MK5iiO<=TdMINZgp>X7-zMh%LUh)oJa~YhYuC3Q!$P#~c~|ZNiN^8vBra2%+I@bz zF2sEQ5e0B4i3Il`e$CBlvffDr+rVeZ-&9=YrBJN>Sozc@4k)h!i|-$Atbe1MLwV_Y zKc9`tI=zq+eZb#SwT5cU@^iOOptQ1)M6;iQM{RE77=p~PA2R`UX-_jABbeTFZEEpk zG%m|?wNbCbTvo8#&PY?+_c@V`YG3rKOobr?p33`sb=^dpXm*^k{sS$!BajUDp(r_= z`{1(F5c<%q*;>=ydT#~O)Ywq4wY#X^4R{Q!7CH}!ZhD+MWuyeJ@nO_D&`vfE4ErF! z;p{5rG+}2Xj(UgcxdqOg;&?{JCY7CrD$XA@!URE4?s&M}K%teGHMw|tdz}TYtT#`P zW3s)0osZMV*kr;rhm#388TTEu*5TW$jvJnPFviLc@lAl?vs`sQ=r9P0WXVC+&Z%O( z{~K|cR*h{22bfs3ht5*e9n%-n<I9LYYfZZ@u>S+JKWlx4pN3;#SA#|v3f(bswmYIn z(1e|F<zKZPac)3pXxmNJ3P>_g`0!ydvW*@Wonr27dy#+}Hhsotq^^&u>>CPy_tp-r z^lhaT`>E$~G_M{+IHgEhhxaC2+G}O}Og=*T5pkck#MpW@;xZumXU9N=xD2RLnm8LE z>Il<nwLH1n+G0Z(hsVJT?fb;hd(3EFv>&#ZgT8IZm6b)Kh}0z59(_|2JbX+eV$xrI zaw%ok_Y9}raJc1kO+PwtcRvP*!hLr@fK;DIAvbo*Sd*>h@xbzJ$$<UmH%XoJ-_fi? z<j3ne9E0$BK_i|zj7^(!fHGhvwt+D4Vj-aIn~#Rq7q%y?!H(b0AyaWEB8AGa=&d^! zRtAykcuP<(1O)Zr2x(T&jy^ECikb1KGYkv+==EUCI+BJLvjz#CAts!WEI|(Qo4(rp za!UGa$&Q4UcCR9CmN=J^dk#yDOOXu*p-uiVw!CguFOOV>70-R#&h~?$CVtT~j!6Ek zSn>!%;N10g+*cL~uu)wcKWH)~avWa+AYL@&+B;*VdQNc=qw-+j=qn8jG<Hk22a$k@ zL%;nV&hvk!^vHSmuApi7X)~&j?Nf@V*zRZ~H`tbBi8w3?yT)t;XSs5D1&iQS`=-W_ zCfn|3<Nb>q^Prh2LBSak1C3&85JJ1dxxbCUH?-yv=~a;)6E8DJFn6A5M@b;_V_bbX zkWDz3I})KHw_nc$0l=&2)vF!_KVcJ!#c(>YqRUOjYI+hxpy3mNVz34ZHV=~VL-+m$ z-4hiyIyUxEN_6eZIP<qvS~wxBTOf|U+I`&4?({&=Q;iW1UKk#y4J)q)tl$UWb)VwN zL)7?A5lWEw8g@#zx9Vh!d3PXE%sQ+$YJ@|>T^&^1XFHG6H4}wmY*cT}&*PMw^rf)3 zA8T*rx!VP7fFiI$*>mUU!Tuf%GF6tV_D#`q)j|}$P*YN}`!TlC?4FrcJ|0-^HF?2g z>yX@%dwx}jfbxch4UPy;z5-!jZ+x2xqR;(x*jAZ=>Mo_^tQRf$=!$;69Cbu|i8pBa zb)*e5jLvv6w&uk!`;(LdF>)k`4s13^;JOcoZy)p`X!wjUp7ix1)1cweQvpkn`>6oH znA59YV}L3rk|?53ag~Npn6NTp8s>V}^(OQDvdWb!S$>W?X*SF!EV^vGtU^C9y~H)* z`Ncg9(VuN1m?56ICe_8dTP$e*XkZ)3G-BOBxH$yHja89nc_J&;&5XmOh{RKq?Sf16 zEG?;11BAIR8U%N18-O3L9(f5nTg~o}ILMyPc+ocpDHBY;zO-kArksAnTVfybra^DZ zL4k+^7MEbT>VC-RaEOm3WG?2H>6a>}S2F^D?!9rCk2*EWF@cx&G<En6sS({a=tCRx zd#=(+iLzV!vG#=7Yq)F=B0nSvmsI?Fy?<;OIm2sQ_xlVynWsI8$5?mlfFm|PG%rPX zC%!q{o|oQrCJQFWyMntnsdeXwL6h;A$TT8rgehHooYe?Nycj_Zn)AI{3Z-R@0?|Q& z?B-$u)nzglQQXJBetg`uV|_1;m=9V|dJ(!t&kkGBcCl&@l9n+X#8$^6K^zdTA8&EK z7|iO93oR#M#0#(trg5{+CD!Vkmkb`~9pEe0C=fNy1XbiB@<h$BVlj4EP?hwM(x$jk zm(ULez^Vmm0LA!`pL0JvSbJEVyS@v9Zb7Djvh_gt0Hv$bbCA6Ta8R4w?pD=fjjUuT zYO3PJ93k+qI(EU!v(p+y7vXEjWw@$A<B4uKAGI>y$JqGTz<4zF;nvYmW2keCI_#bH zGHD;{Sj)iW@wwf6BDK6%s?dXBt62c+NZBlCE6WJU5%SddL+L)$3bc6*$fyGlG(eq1 zX92U<LES5=g2>B@tIFuDog#TFB^MfwOwyrjuTOMCtpEuVdJe165fN}S6QUP488Pkw zrl5>J{Iu84Q2Ar)WTz#HWx0(3i!2df+9`2y?aBOJBViVT(<Pa+Eml>JHipsWUTN{D zxS$nxv?g38Uo0Oe2G;{XEjsttsr`vG4ReJ;KL$09F(mr#DsX9};IY;s`<W=lTPeAZ z!XA|B5oP+wkR3IeMg{g*(Q1TT5N!I@swSJ)A~vW~qJzbhMthW02I8@Gy=ky_*uWV3 zQgcm%l<iSUVoH|LMu-w7G_L+x?20}`o6}*IA@^^>Ibdc}J(<`|{)fyRyZ=uqxn`u+ zgsbzK^GNVb+(Wy&LbUzfgZpW}EBio?y$;tp+c#9xVqM0+7qjrH1xy<^VDtevit=Ow z3;7w_QedQk5wm#to|937NZcFiL=j^5ze>rK+O;b5lvlN`%?LNLdtxML+fm;;2P7IZ zi-|rR^n$^wuo+eQQEyWev&>$HL#`~UW=PnWNIeJu9f1lMP}42p_DBHYN~(zJ$r-lo zPik>^3}9fr$i}j<_=n+jf!l3%G&9_9N>5M$(nya$BN=q@Y-2fB@h35Ydp|r#P0kr2 z8+{)gzX_CT<qAyV7dc%sUg%xcY{8dt07Wr}kdyh8H1JFFXSr(Mb^>envl#(h#W70& z!=7AcSmpY$W^~`E8F1X7V9ath7Mj{9sJv=p4@O=7?AnyTCn5No_jtB;hRchk#)5ks zl#ZM2xE~R>TG}%rZoKh0mS$+DLC0<Pk3}l%xmnJpvZgwOj*oPw)t!hPfYIT>c&ChZ zlyL7lO!571ck=d?5rWM{pJ<zWH@E4fe08#F-`oH|ggQi{+vVrqD+xLQ8YsWjU9uuJ zMl_Qj3v`Cj=RF*+PHj!TZ5Z1W6Mz1AN3Vgn+9PK<<3XqshZEz1bEZH_t_@K1c&}1< zg+0&Q+nNd;k?%(e!NoM9%ZnEDK+t<Fql_uvp(KS?a6UDQ1lum|EUuyE_iuivsUbRx zc6WgCa?hHdOIAp<J~u5?6C!J_P-|m9PXO^xY54pJi3LR8#$8nN2KsPejfUH#<7f@b z{e)zb7s=f`UT_#!v%FfhFfuf&MVWaRx`;4#%CVTaNA9CJgaQTvC8u|l6E^&|x!#uU zVsf+$y^$3BDmP)&tE8McZql+jgQ>(m#3WMiONG1RDqamQW+t^^lu#7u+w8Sw4aY7$ zAA7(wy>cL(p`uJ!gy1mDf(=O3{oeEwhf;)QsQAx%h(_XF3!04`8yX|SlsRopINfV{ zF<&B*H0>>3W+{m+?00*WR|k9_0Y-hIMi6uh+cJCg(H-@^6LS>*K(v?(bbnLX?;ggJ z&-9c?E?4h}IYYnNHj&c@0Qo7KHgM)m)>wqi{3cJdV=tW>!HW+;k((>ek#9po&LBcy zl-%5Q)kNGPpFxA1{i42K?23H1z22q4x3kIoRP%zsJM4`uFWArZM=y@Rc#;?QUob9j z-T+H}wm}sREalmnvbHk3#{3b55;pbc1GaN^6@+(z)ieV4`Ss!72}2Z?9|*j;gMojq zyMzl#4nY!63~n;r=tx(#ilh$7y`&6EU?7qG(f(v}J%$s-h8YE-NJfl#dU%zlq&Qt~ zL9dB+0-*g~Z|{?q^xUvUnEWZ{qJAf(94aa2V822*3~caB7V>s5=H+Pehc^{`@dP8) zb4q5lnNuC>R{!kC-?S-BX7@gKtEsc^IRIt`;>9>+f00s0F;W2=)^FAiRUm$S^|kB; zBP$oit1(eyhN}za;&6Y{FkSV#%ESZvBWQNH?v{2?RkFneQcP?3Wf=x2z+$gj^r0yj zB{Gf3b)wUO6v1lqqC_uYxkpxY%ckm7a0NF0)OXA!n`($T1$Lq8Q5faubub8SB4GXC zQID_9<iLqu&M9oacUf%5kSq>Trr~27{26S83#D{w6K%S8rw&2*^#-u*rIZaiE+*y) z?&RekqBxMs7(|L5o82zi7<6C*jtE~HQ7`n>4Q<(ih7Z&6fWEtm;WgIGzt{3;$%N6( zX#;Sih2ntT>Znx9i=qrN5vCv9A#@e?Xb8@$m``s<=%5~Tj$+HV!GYT$?oQD9rH^tg z1cz%}6&`2o=VX3jYgjOOqO|IN%gSl!YCK1q3q;l(G8}DT+PF}eoG2Ft-e6ss#GCGi zbppNl_$N`@S0HhbKKW^gsbX;-_Uv{0HjdtDXl7VRHCUmff&AE=DMfX->SCH4gqhM+ zw|zyh&!KY1sR?K1NogE%5Zge1h3dW9@~q1lyY3We#Kf>c*cE&HH!GbNztA&P7Kb2e z0m`%8$r<`#??u{_PBf5`t3EM%Ri-mx@}w{aPb{!?pVYA`ptzL({ui)G_x%GX_abvt zi&gx}%w3Dkso9HuSaF^0sxKtYyrbOdIP=ap!j3h-D>Skg$t^ioVOgG)cNI{w6g8mw zVz#GKE!QvKYetBePpbzY$n@=XNE3P@MytCPc<azBa%vkQeXYn8*@3}ru!aMSfhZTG z#ocS#8cj6q%g0W5A&(I-bwUf2M}6)<wyg<E4K`MIr6jVE>yb{Cdh%O5`-RoY-qaH< zsds&~KeWwndd~Nf3B7uCZGA+Qy{wciE(jZ4W)Qa>&cerv2(xqmT}Dmaacu`z*&O>X zLZA`TvJMrbyN|GaY?dGj7D(v97eY#)qH;#JK>-=ZBK&`|DH}Yw4vb%%Q-mpo0{3lH zDk*P+U94AMPj5$==2ST`uo`VfrK*dI4UXT$1Lr*t+~^_dflDD;cZZLSSle}1w6|56 zd*Y4*R$;e*83|Ti_Up;eh6hJW*Af{6sCRvWmIiIi+hJDIco=Od!%(74vG&PB0QvMu zQ>-(o{(AjgD~g*uD2J@<)n`x)ZX80&&6GI%ma!NDf}(A55c4f%eWVEws22bGPTi9N zW|sLyW1<3OLNSl6l5U;GrU!!JUd*eSJwZ42qrt7$_!vps41ku%2KM94L0ZrTg^(EK z6EsEKY~c)9$oifvK;)*NbuH_Q>-LR7R6HWmMC)l5L!pkAvT-5GvpL+xqC0)N0af~l z1CS)9E|p&on5qiEIX_sdOUt<daCMMA+VEG38g0U^emi8mE371jVKK;gxGg+jMH193 z4vH7$*9=+o!$r<%p*<ob2+bJQId7dfST~OfoJ+fIvk~`RN1$$jQ(OqTZMD~<04QV{ z?i5!7sRhCaREK56e2!NkdE+YlF-Xx6#OT#mMr*ywEvR+xhp*Q{7zQ2jF~(rBri|p` z;h!NSI@7y<Hw6J>Avb#)A{!g2pfkUp`lDZW^P5#T>K7Ik)E029olJ*JR<xvCjqtO) zk7%QJG5vY^_H>OuZk73MS_0Dw%&O)=vWFAnz-1YGb2)aTs}BffntwKRadRsrkzh)q z2lBpqNs%5Y9$fi~$^GVSi~_VrPqt4tcC<$^tl4D(^)Y^)l52!q?$tD-boOae(@t4F zIG2)r4XeK#fm@J99K{;rt;{o3+YPxxJFID{bSKwd=8M4Jm$Xg~9OmZ;-i7|ss*Hj_ z;9w`=p{=wBQ~kwm*z`O3ZEccyWZF>ML)dXX!vX~u%&}C-^KY?=L0k*?O~(0_MGS>6 zXC=7L;4n9~7f2qmUHTdBX3ohzYV`R^K`~K$p5#z42@K%zYJCSyJ+XO+mgUK{tVdw8 z86$}!a}otS$!{P}^UpjTvV0Vp$<7bl00}D~?2|rC=~0V*FNapI_<6t#GgL>=0AcEd ze{JqVBbMtboFEFdy1^h_t6SNnI!N+vj}4Q^4%kO@Lx&K2S^lYN0zWInTQ#RkxhxT4 z8z4jhE}hLX$>Z(CTjWQ^hbalNkQ9q8)Ta2>R<eSY^OuXA2^4?h$DLMAHh?WyZ2>d| zSSHtGCdC1vY_|0>Z&)QEYpNNain@tJy-8pP4*h4SM4zDr-rSSD)#Ffc08U#R!ZWZY zVibfDk$qxDS~;BtNQziBMDGESc^~|G-37KL+gg(qNix*{Y01V)HHKQ-N=B>^Y=VRK zPOKu;+tiq`YO`X-)-{M(Q!JGj?mr1kjxz~Yyk7bS*@E$_*Dm^m<>>(0l_tK`aDa4O zYTqcFtbkemYtZ0nYVLJ;)~Gbmw08{2ad6u~FpNHHp?&L#E)ySHRR}HmhmnAO>^z!v z2$d#`|Nmj{TiD#Dm4^RH3k6!P@g~_g?IsILffmaB4lc!Z9OwZG^b}g4<+pzxNwzFm zml;XU_B`+R@R-JHX*73@MmGWlRv31cVY<2Uu8<LIX`0Q(nZEG@(;cuNxAlo{f>#yc zi+%diEMy3@>s85uh+!m9LtIh9BJROlX8X4pJKEo|ve&|L<<B<&_N@TjQn}2*Y%Gnm z59s>dbRQ@9mv&I<+EK}-zgc)SGMBD)|4V7kqEkIC$YMU5lo(oOjSN)SVFnnSk%xM* zM3T0X>tb0D#x8)0=wvacyOhe})TtCrIbbM$YpApqUG|B?+38_a)7hHW*P957Gk&z9 zx?Km%YL+7CX5n9*iSZenim>OYNp)x?&QfU6t=Au(iu^+TtLnbti0LEv>TtFOslghu z>J#%vhy+-eI@$z{t>(eT31-COvN2V&7jx2zuO>c{pnH86FT5dEvx7mF#5H4=dmw@c zqoL)7&~#%SDO|;a48tTJh}|5{p@AVREX&UuHm3!5cEj@7+HvuZpl5f_v592+tAK5C zG>$RQ#V>SLBC^)B1!xfWtzRwrxDqzGcUgQuV8gfW?SacHIHWf(+rK@4gz&JS`x&6r zLGaYM!584{c6v8TTU0lmDbNb{glw&yObP|HKb#+dwyDwP<PuZs*}Xy^du#i1_SKEo zd<&eULKMzvgLJeCtub^yt@3V=I;Bx+rwU2P22YOx|Ay3}1z>UxPY#e`*aMZ-B=6uH zQW;!?*-XU+L-WGYueh{upu^EBhUCM@2n>BpK--W;V8=(UxI^h~A+k`HT>E+eFz|xu zdUj+&Gko9jjm^9Ls{uJY)z$V&?31p(ic!&9LdV^crvmi!RO61@p|O;>0jFCjjnsg@ zqxTz?cK08C@!NX500qUnB|m{40Vu8uZHm8$=6A>c!2if0x+NVz@+O#AB}57qsXRs9 zW&*tlYQW3d$r1T4-`UHY>N@-69-FE@`x2plP>kxvO<<31f2q2N4~rL=!Hhn{N_B`c zcGUwQV~JPHu;^%a^jf)wG+(ONh*So)PiHxXUt#KCCq^J|FF=}$M2f<W9t9nY>=-;{ zoBkeFg^8`p(FPw#@6=C_hw9iVtkNfH!N_eGOYs<|G9DLXMfdEeMNP{)D|gJ)*9Z1Z zr{#9IzW5#sA%{bVlrtt(_5q`JtOU1bVo<c;tvSdMVtDyTMTL04FtSL^_7uABq;Mn~ za<5@AUMCw!i$B=>-bw_syXBoh8*nUf#n9!yM(TJ|Eco0FCLNx=yj0I(hY3aNK~#iG z1hVz@T%J$`XQ(u6->ZExgBn4No%+jS4W0O9=Ka(Usq2X9)ne`Ca1M06zV<wTsb9S# z{yBIkr8J%8&r1anFI!P!Vu_D^2iIC>H)=&Kss7OP%Ou1wJUi`hh^z;!u8vXFDoRoq zot#Dtl6?5JvGW6sj{8}`3_h#Le>sic>ls39IZR$|JS_fypgiysITvfvyitiwFR;{s zN)%i0m5EmD;YLE=p2p6?Ba0}=BXcG-<xjhGN?zqR?#OmhD4xkqibt+nqP-q^TFY=~ zq^W2GKg`tWRX`-0p=6>IDc|w4Z@DAuef4zlWm21XdN2tcQFxu2(Y|HxI+WmOpcA5x za?~b&z5iVczSb6m-s79f^W}J<C>)WtWL4gUBgppS!|Drl90$98V83l!6w1K<pXF#= zDsF=>_gir^<nl+(0oWx78+6;+zqbY1p}4^H6~762w>QlQFU1*2&<-2}-(+`{`^QFd zFwEn@CWP{XyYl`nfLN`bY&9mHom%QEi*nb0{AeDxst5J!DrG4)8e`j~ru+@|y=9<P z1DvxXg@Dt?e0L_RAa+|;^ZSAa7Dgep&fOJQi@}L0_0fd_H5e!Ljc!l4{4cC}-mYPO z{R#YS#?Ps59J@}o+SGP-{8jt?c%un*<oC@f5rltUXZ$AB6>J!iF9;W^Lv}(6{}_d^ z`mDdXxaDUY0`6TM2Oa<6XIssdZol0Z3kxwE?2rf$+i)`m7~vd#xCoE37%Fe3ehwHb zp8sQ0*<|a3Y3AsA3|i{+98_%V7Od9vS_{!>#d4KIbcDN%e-d>G>Cm7$PfTW+2;AW= z6Za!g(uy!9PiWwSJP35|9!qZI>~0e{NI?&A^5e@eLKuZbf4sqNu5Jecd$EMqgm_)@ zK?Ou+7_Q0kzBP(^&1}#2+}K(o^+ggGLPtq0S4|u5v&*UjbSPa*IwbeZ+X570<fiQ~ z^x<$bLapcm>Q)EW3x0sdSgQTUfP)?!nlx5R<j`aLL&5H_<JvwPR_ylI;M|*2rw4kk z9jD|OEeyEu8`Oz*e(i?}2D<HUa<dU&DcGB8ZiWqvH1iUqUY^-<wqhE=2|#JlO|OMb zrgqRAb?TzdZUtALhzW!#g)wXkRG1(J8sv^w!*MHiIQV)=hjBy~l0pgH_zPnsG}IP= z+=|h2vn#9?!o2MtN9{Bhq<rngwtw;+R1A8ZJu}`&rS(+n>_f<<!HV@=S;>qd%geX@ z1RSzd)!!G)>+A8+FEZm%)q4M!^R(%Hf1;!COu@EQ<VTzSSBR6efRTUJD=Z6k#8#PY zIcjibSu@wuVrm_qw`5mcv~cSYl?KMId8nEDPpQ>UY;ZM006Q#9?Nzs2=h)S*bNd+& z{K7%OWu-PdsQ=i+a*@l;%loVzb%ho?s0U<OKBHV4Sgjv`B9D%S@HiwkSb%dn;J88g zVs>>^vwRK_pXp%q?`8gKi$ClOuRr7K;KmIq*ih3cq5*`K4p4D{!J}et8Vf^XiBp;u z0r><#QUaQviV>Up@$dy%8R0eTB6MzlWT*SCVF-?$m3WtTYB?NE12-NuM|ZZv`IbS^ zEqD0k40oE>Xk-Qr&#%CYQrs$U<y5KiO<1hZyxhLSMAh2M+rA{#9V3FxX&*d|zN2_D zh&iAaKzOGlICxLNLrx14g*P3)v*qUb!hdpBXoHr{{;i8bXqG<NIVn7x{DoY~KEF1Y z-<7|9EZ7m*S$=wzXD;$a>EuQ1FuF5XrR96xa2}FKC5>(p4uzgA*iC8>>{oUFg0K<a z{Q|zHnejj^hm@*(5rfZi*WuJYa8~l#&Q}MuL`Wowx%t}Cw14Z$RwvC6I`lZ%u{Vfg zz&_vTK_l8pghMKx!fxJ?IzRiFa#PCB{b-uxV{%eW!Yg<x*?ah|=xh|}cs2HsmJTP{ zBAFP-4%<)6fT)&i*2#UGAtX?}NMGhann7YztRYh$tSu{Co>_axb2=F<U=f?6*s!0o zsE+7Nbxiag%GrH6yQ{&Nj~K>9Xuu<W`aYW~Q&XEuK4LNYZ5x0<QA|uO$spkDR#*zV zp3(FfNh*!>`<K|A&SS>~AKYg|^?-fcHup7WTRSV9IA8z%%C>zBE?I3z;%7Nq#)_sx zXXWStO+HdQo4{)0ujT%06L-d3bn%=JpB<VLHf!pY0_%<9Ovl9%XESK9qt4*riG<nA zo&%~8F|Q2<|8-LG-3Jxyxz4L^I-v4I{^MMH9rPd1{SB{r8nCYSqUe71xhOF37?7M; zfVfU!8tmv>IZ39Y$tIwV1S~f_SK$UQ*3t;bj)ytbvAT|Z$v2s=cPjeU$rAQ*`DKvU zDSuyQUvJ0j@Rdqurxz9*%&vh3E?!x)#Pf=;+@IAv|8l18Q)nq-x2uh&Gklp^Shod< zp$hJ&gB3C`C(-1v=Bh4#=9}=luk%)O*ENAL8;(`Z;p<bEYkm|o+`>k{c~iZ{Z|YI| zxhCfY%FL82=s!Bcgzc}7B|2&u{$=AW;8RFD0CJ1o3gQp=Z5md_0JLk@Aw`JDi^0uY zRc7RdC!}fMsv)CBBuKjt(7N9KYyyvVV4LWUJ5{>=tB&oNWj7MgF}4982OMS)&k=Rn zc>jCb?4H}lPAoTASKGJXj<<ES!R~arSg@M}))hO^6t?WZ#x*!#WL=9tD|u|V4GQMn z*Y#%jl7Rd@AXE#;4n3S~1WBTXl+lK@C%c7k_l8JCZ<)k59e5NO4z#U&*Bd0M2wv$; zc}J--9-N*sFgb((ulc--<o}5aI!T+7s-j}Df~dkj;iluD(CJg>j(5Y>`4?|ZMe(id zRItIzcu)=KhqzQb;pIM$m^nIflj>2+GPdIu0=eez&)xe8`+9f>MBSh`Yqqd@0RA!e zxdUidcmN7#tyc9v&q4%js&k`Y`z+SGP5;Z(wjfRcYG@w*zP7=z(Brh3zCnG~7CO(S zVTkK>UV+)y&)uQ#<9|f5#XtoF@er6m6PkA3d=~x;#tQ4y%^ZalA#XzmE$ofT6TI6k zKkAxMc&G@{GWOF1DKJ(CB!bvWKMQ5^P17nOkuN?Y@b-mo^D$-{{`~pc2+NITPY`(J zwU81lvMXnPTcOXzxSt1n2~~>&2)>*RJ@1(ww;|ob_Wos9+W-~dy?J%8HsM6vL<VEr zZ2uLguVakOFTTz5Ev#f%eh(Ph&w=y$vyVSL+P060$M8uXs%B@f9Mj~#y{#yq{^A4f z(zHBUGy<xv6ayf92+MN!qszZHNH`u{f>o!GaWAutV9cE7sdBB`>DlI~uD91Cvl%kf zUk^>*gvAC}>fJPK%2{LX$Ayt23nfZ81p_V~&P}-rMTx-$vvlB$dpvd_=E~CGz&?Bb zS<n7_!mBDvfvf%1$L1A9okKc$d9;3b@WKYO?XR_L$qtL(>HVvqAm>$qqx7K(+))R2 zKrP%8SlUay{*~csO<bKRzu-Ovwpgap7Cu1?IDcil<f{F#`1@2@9(8tl;|lnx?(Wie z`MADvU%7(FN3h)jM<3X;qpJQ4g#sNvEc<MBwsSmu3u%tTV$cd9yWz(NSJtMW#d>Cj zdVmIq0_3~eE_q1I2w*j#+~V{n9>sIIvfo)zSJ&V$oF!MX5`qCZew2TNU)$jy@MB(T zH=Gn$+DG!H|7FsXAq!I@VU&PuFl6o>VzY<E3*^3i^xP}hmB>JM|I;8tSfLI(!1zb- z9cA$Xw+@G_Exfn$+R6$|tBt%sO4?}$UW~1KTVMqW?DsaZ&uJep>}7+4-S+#}_-6BJ z_h%Q*Z{OylB%628_Pv11uD?1}y8!XeMc~xSa98Sae)*ISyz&M6!wOv0?zAxOy{V2r zd3ki)lW^r*?&hlbDBE+yDS+hg_$ui6KjS)DpHe|Cp%Pn>^7(79x>px`lfNy?3};)~ zPq1=aXsy$bMt*hJu7b5_jW|JYpF`NMuGvx47w%b6(2?y>N(}(d6g2=7a&>a(=2!1J zhm~qo88XcI#=&au?0EOpGcW5~!I~0M`f#XFJ^#7=+tS%SY^H-?0Y+|B^*W!Bua-XA zRkW|bT>0K0+uagID6?z+Zey5W>Y@3n=~f7`%Pi<S{UX~#x?t>9VAj`040OIU42BAa zO~L;I6RBOK`Kzd<$@UixXua?SL-`VRB+Lw7U<QqO*L>i$fD<rVG}E=G+5h>@)|y?c zR>ccjaeN+I5%558*bo8_%9<S9?(zqKm+BMxOxZ}xeO|`fqe&P_o&IIx0cB~IR?UKu zHhFSp;+!lK-Xb*$l2khRE{j>>lxHq(4V@jft-iLCG8`MuL_`AXIoOiZ9g&+hq`5G! z8Dxrq+beyL*4bI-doY6e`#H##C=Q|M(!FQ>FSkr}CkyYl`LumDJJmr8Cjmcgs)Ybi zK(4>zmq6XTC{R^Vix1+SY|BRgY}S873-k%~#|1lg#+H&cbjb>J7Ax9v0!AXb`iNoW zo9T0*3{dNA%vl}GUj+*=*5i)3|6=mX_G$=Am8elGJ4vxmQEQBn?;AW9hcA}SXjr&r zr;qLf*duD1xc=~(-<&-kqoF&g_OU1vCsG(9mfyuHAEOv3X%_WTnp!N0EH}EP)^8Oo zKQ~&<<{xb8dArr@8+`}~!St+t+ZVqLK3?c1f;U`1Wp_`Heez%=TnMqNHx1nrV|@0O zK^+x<0{}fbA^ql%7GG%tt<Z~y(1N8c5a1=~2~JhFtg*?VsgfsQvY}2N3b5SLWg8Bd z9u3r_GHy|ww15Q-)z&~2#ASThvT0n-hD|2TA5=r;z<+`juyeCTk6%V>W50qh^2({! z7`TGj;!kl9w{#CMRgxV6i1qpv;KAwU6VXTp2h6m^hwF^X*-Iidzt&z%6GQ5<gsc@* z4U;P3mqGO!?oDBGBwJjCu{>}uqxsSs4?uCQ@-^15h_`kpLd<$;#H0TOb<pThO@Pw0 zAeR5bdj=JpQg0X&*T;9o8VNRK^I5^i#@P78^5-E_?0$jF2iHeVfyF+&?B6Y38$oaX zW@07%adx8VfID^0Jr{)w6-F*|&69g9dv4$p9QXi`I-}N&oSh#9nVzGoFhaQtx<_4~ zY7uxyzkj`8%cskkLC;{)FPln)v!fX>(a>xKS5VX<4JckVeFYH$N_pMo-54*UfvRWU zi1G$Wku)?=J|QBZAcIb`*paClIFbbXjQEwt{z*8K`Vfh*g%sT@A|%qml&<{=UoXcN zr6SnjYXIzsFR$1PUkKy|qm~_s<sg<lZ}D8C;9!uxj-XOF90zBcQTB|b8!a-w%#~RE z5?{XD<>p{jA*d2pr*|$`a8vwU4i$IV)&5tQ)k`pzFF3F^Ffx+A$@5xl?U3sKHNu!8 zL;pLM)56*E^6;o8K5kgAF1~d79K?ZFv|D~Y`S>OE1jb{r#SKytmX?JfXOI4E$4@ZN zJX^>Fq*IyL+^RTk(xi!NcBt6Hf(_tEo?n010;T+~YmxhK1_-^yS3K3_M&lAW-qo0( z5G`I1=>rMIYw{BH{+Ie^4@Ew)IZ>gqgG4tn5eLV%*O{%2WV^P&Bnm_F0kOcYivW9r zd%0jI`Q{6$!rSj>fjrjR*;O~eJiJ<_%w6;t8O#$uNC`z{{D_(eX9437c6{)<ZKghc zyAZQ)vUN0PNqwms7;n=A#)6H#!m#g@#F|tQF97U`CsbUK0OFP0si5I%XT)BTYbD30 zIe3f|#m93cq2E9s5u>1*SDTJY*Z<m@LW&q%^~ZM$-kBav<y|&ox&0GzTQiY#RreSl zpRp3ki3!!ukdnr)zHy>Tr4!=poSnyL7mF-|QyOd=qml*OsEIkB*z<5WR5D28?hroO z>xA)@WV}g}&*?BL`e`C&+KXtHnoNntL(LM_eb!9^i?He|o|=OjRg4g0ya`272aL3k zee$4dng0q|#9-q*n$uC9hQyx%u4B#<J_^;h_&#YE>NF{vc3J7EfN(uC5C}^^VYJ>Q z5bDJxu?D1p8HN`Nz8bsXsKId}^$y|ivK1^3JG$2Y;!Kf$rV?QRqx{)PIEjT0;n}Ca z2rXo61^lRoRiqDhRPWfCTuvn)1#&O*d}N(n8%9aH8cqPLN25nyaHK!Tt-}F*BBAo% z9~A5+>8j$tNXtD&-S_rC0tOtK#pYGVM+HW;xaIS3Y`>6t$?Nvr9}B*~8@=+tbuzr+ z2(NtpFI)OQ2XAdUK8^Ye6yRTe^jE#=@}K#`*Nu4n&Q&{Koc_!gpXV!O!2|4xfz$nV zRZ9ZwjfG6=;v-h>oq{bbXxPGtMhvWvyK)lB5T3dXaJ^)Jlss$M*#dSMSBwMJ4=zB) zm4$gpDP&Q~W7Ty$S%7Z3H=g;7s)cdV!yy@~lR0n*16<9hp*$GE!7_mAM;(8s1j^k% zY#;DYrp;o`1bPiz_w%RMzXs3k9_GHzXP(Qs1vPNVFjKX7$gu+tz;m{2TLesLz%SU- zUGCn74aeOIQa&*K{^7tJHr0Pm$EOLNX)^*Ys-bJhK$)8pK0m!<XL|(9DL1=&uySW3 z-k`T@bODUGg;4Y!*a_lzG&nJ5T^dZHTEjUT-4tC<G)^<!56=ag+SF`Rtp-yAnFt9+ zIP@P+6ybp`tc??){EOE>_i&)W?!;2s4xX<J*;SIe&aNqHe$p8`xKn`8R3_yr-%p0> zF#-$ME#`tF*tE`nzJfVDT_+*Hs%A5t1x|jMeRO9|+HTFXs;k+*5BPxjS9uWMGE?Ee zkdvt_`_M24RQ@Ou?{I%&mOthz6a9f_58YfCLTT9JIrfheWCZLSA)%pu1W#8L{b^FV z!ymM%LqhJTIOAbpt{%&Q8OB#UEXc)SmGb>$Y;$Zy+md}8_WCN!hj1*mrB56<i@#xv zRf#3busX9lic7u&GmiKwfIN2-b`MS__TR--iKP^#;j`k%vhocWkDD%!Tk&-!0~lw9 zzN`VLSs^ydD@O)!(9{?Yz+5lbs*lE$pK*d!v7s7;EB~uB>kM4nIH22*k|8nD&DfYc zGtJzT%Hjx_epR_v7`CJF<FnoU>@c8$1*@=hrqvN{6K3`dI_6*7U$tPVVT<9QuO6b~ z<7Yiz3yUnXSH;oW?k--Ku#zyDy;sOX^vt%V1n7l+a{^D7u{~9}y-_odB)zH$%R0T+ zkzD8052OJ3v44d->~vRW?DB>r)8g00K%!j0(A=8(Hv!t|5-XVF;~qQzu-}Pd+yS8q zV8(-Bep>PTKCAF2*E3Hi0a*OSPikA2BZB)cr0zHnrn@s+h=ZopgVeVdk44W_3N@<X z#H#i3FLwN>i)oIw3U<O894J_3Qj<0}U+fNYC%UBF?v@~Urw1E3Tu}fs`GXdRF9^mD zprcVa>`WhLoWAghL}Ym9LmK<pQ<MgCb*S!~XYk6U;_+K0enF&&+(Q{Srte!QdD8zf zb^ijKHzpf2+f`98LE81mf?&ZLoKKVsfx=ekDz_i?Hmv;uOEk$PrLbC%9T+q^><BWL z?B)yh1>(#3Yoq*c{tTGEk|`VT{R-E%F>EKXcpU@!KjJyxz2_n%=}z9|Ia`)1PcUqz zVXLd#G0dB+muCA|@4uILikA~vX;fb+pDwbCecVLaN}D_`2@swelC}0a1hMuCrbj~# z(x_TwAy(CnNu@q;D(``fAD{4lyiWFm54&P7UbIP5K-B;I(q$z3RLU*TB)+166+8+Y z^%=4&Vx$#SIgpf|Q4!f)s));+otnbiVdvYH1Fbt5hW-2M16edm=|`;QkfDv^A3E`I zlrc^T$+tkMSQRQN2Om+`Yj@lM2#;{mGxbChA%^S|B=tz%B7GUz(_m^_w8TfJN!3jJ zi}P}5#`sJrxys{h8Bcq?{<z@bt6l-7ci0^Ra2kSqvDi%8PqNFMj8}W~A1z!RR))!7 zNQkw~-ukVxkTuK^b%x`Lq+uk_7X7T0&;*ie&2<Z*ZcaVVPmf?OQ9`#1r0%&ibl8}h zzNa4Wzn^wr1$3{}$F0~D21TR>sB*w_Gqs$ieDJzCu!QkP8yM@-@zi{ADuNSrYD*T6 zFre<i%HkLjjxOMu&z0SMj*<Se;HQh${mV%Y<IuZ}EZCjc=Y2j9NABd*j>{X7X^d1D z<*1gNVvRzQs!(&FPE<S8^lDaAsn~?5pARPNHs9@;%OPSn;Kf&B)`->YUkp><l0}NT zSlH@I&Ni@$sczIfAkS6q@{{o*H1iTmF(c+$e9HfzGXyR<o3UlhU0kCb|H)@*_)EQq zd7qhKeU?6-SBYF`E!?bpH!u|L_J*DF?4x`kSs^uhPV;d4&jJ0BQSd*9btF-}fe-|* zDWwubL`tF#%tZn4OSl(ek2yY^<O&b262=CG08@(Hj_3rGO@p|BLlKC{9&QMbq#;N$ zbujD%Pe!S&j@5MQ>YbYa1kQ7_@@hgQO(bgiqw-LA01Mv&BpIZchh(!)r_}E>{scHu z6o2%yo@4v1a&boha8sYaPdK#P>^JQ4!J>=Yca5jY1h>WI=oyIqe2Ya@l<%<1K1N}b zoYjV)5yJ2#?j%MLl-a+q-u<|16hgzf1$xBH_&BVE70j^keK$K9zHn|kKc=>Cr7`=* z12mqxF$ZOus=@*sw&u7=(4m}{^iY=`46L1sny%8ousyrQ$+VnS11>r2b~^DKgZ(A! z&N5!V5KWDJ%9x^T$6fC(b1XdvSJz#T6t@x2|A>}Ov^M3R)e5)7&Ipqh@9V!i0Nw3p zjki1Q0pieCkhJr{&`)&~NeYyvy?>^&+RNI*N!iJ%bih<j+jZvw&!4qr`d{Wa&dyRd zQbX(CRp0P=waDcYf%@ia#${3G{lux=pI0!>*v^eq%HZ@_lvH@v;9$N)RbNZHN^Qh| zZVJM%%yS6<<GK89*J}J!ZM3rq-%H@zaKcQ%-2q++GzVYDj{6}smKX;h1%T*UqtGBJ zMW7S{NsT()hkBF?94899a&mT)<k7bfAN$s)culY2LFA6UQs`Z{%{Kn3>A&7%t?Q|u z9xt+Xh0$SBkVF*X8?+)o3X*&>9~35|BBaIt!C0iI0JDzo6l@t$q}ma6!|MVhCc)x% z8kLT%;KS%%J4-P<rz7$7aoI_fUb(|w6MI4{c4@9tL7eW=IT3HmL|U%e{g->}-TI{e z#nEw2jYHPs=w()||K$s@$i2|bGjTS`V9=l;N!6v@u6^0BsbKtg>19X_NEs;R#@ji- zSP;b}3zF7z*4h0arDTD8KN)|Vu;cXN9i<BsVP{}p3e8Q2ZI2LQtgJ|01&GfEL>U;x z1QH~JLYaE5vh^fDq8J*-utW?>4kk)v@nC2(E$6I5c;01joEYogk}mx8RkoiXKlt*} zZ;&fy+mYG_;<ttUL`Texd@vye%dK}ad8H@2@d!>hnr|O|4O{cK_GzGB*-1zSGi;X6 zz>yvXB@$nzQG>2o(%mXo`LT@++h*IpoG5?xNH?jQW@jMpK?B9FfKhAgqv9x;f>r<< z080h_XDDigXjid;N=Y~Ys+v?aorjDlAK|<hIL3yFT)T~I4<~&RPNV2HA&hSoheY-} z;@}b}ar7rl@os++=gfM~-NvpY!4;!j7pmhn0QGypE?dghr>>Z7w|_@6-eEY9FQ~+7 zZ1sz;gA2-K{-@xxeo?z2eC{P-#A9GA9QL&H+&*m`i?OBbN05_EI>(EUMK=Gp;I~T! zFadUZ!-1oF)7Au%U$EOmwtm1ED-K4HdIqb^=2ul)5qHPHzRQ`Yl^?+#(BXMe?3Qj@ z>u_q+4hpc=UM|?-zm3CEL+sovF~U*Q5lNfYk+KsG7rLry?1dr_Tdhyu=BFu@a~T?m zGiua-*u+A$){ZGRoNkQtlLWnfpQD&9uxHKiqc!0qyxFnW89MR$fM1uLg;*|dI0L_D z>ZKHNvxdi_<-)NT^6veA$&*2fC~CenJu@BlxNlB558Nl^hKxj=&GsMD_-Xa|9Kx|* z)B)PmZJz(*WOz8RX_!SqmMuiA_)-OyItL4HYxcj?KYLo!NppTA(GgKuad2FJrx^Cw zv6VK1Zas?j2w-W<dmKkHPq_6%BIzy-twT#eXF|F9he5KouC%7??u38gM(M`X>rG`g ziS;f{n2Gcf?W?G&7FXG#DalApYe)yO(w+~9f$MqMzz|#Y3q^KngTtuNJzBSPap6s; zW7Gs<j8$51WA;u9EfR8@b^?P%YSU2B?^pvnZ-1qZeApG+Lc%bg&@7BX{)888;e7f{ zVIK|k05(172~tjWk#BhJ7t*KYay#coRg~^MFHAEoK)yw_zfbF*eYrIQ3rcbHO_m!f z%a1yPjTl;y(isYfz-4Z&nmf|~W|C|T_rE%1oqtB(Vyo1qiMqw#E}1~Gf-vwEv*tT} zEtGIQ%khxA1J$P5kp#BEuuRZKS@}TX<j6Bg^l*ymP<ymM^rnq$PM|1Ga)&IIL||eC z6KY7E#90mL;y>?-zO4Cyd19E=`doNorP4Yt?mvM)!g+$b<57+jZYo;*=#0!pczy#7 zv!#vv*GB$<LXy|u1ay1z9%#O<WVYZtI5W1=u75#>3vg$|EO++@Xsg+L&Cg`-S|2e+ zLDdIWBgM^f7ZcQ)imrIr<*>4zRG;q_4Td8P@75#oX%9jdeL%AOiYzQ%$lYv@2b)CS zKh`I4sg$whDfJI}zXX?Fl`A}L)W<o4DjUZ~`y;wE0@Mb7D%f2Iy7_*?mu&MomNGG1 z8ZcXF$|J)8KYFAPeHl`;4sQF|>S(in!GIlBLl$;3Dw)iDPw2#=_K{u6QHs8t9ZLX1 ztnvNIcM3M0&w6rpbNS-26SRBH$#*dMdSS!=;rxJuBzMQ6g%Po!d-X*#=hnN2JDuCk z3gROO1;*;T;(=w<>zqKf06|tFQP@?pDi@MmQlo)j(iXGHn*VZgcmg;}NIaPIGhd0@ zfExRnCs6SH>=rD;%%8c?tuB}?;1`_lxcGbf6?Cn|y=_}<J%0{b<i9rZ4}Li*3b<w# zbti?(q2S<q8g|O@9bacU6#`zaiUOWEQBXmSegyRC=nc@Cr;GwcMf8tSWugpa+6T!Z zbYOXIx?(7x$fmObB*91qAWhHG=;74B>?!P?fslr<&}Ly6p5$nrC1-lHJ0W946`R8w zjg*m$=J{!_|3SIo^CJk;QHR*b!8LfI1`m$FQ%vF0Dx*VN2R3X?9#Z}9`$w<RA1d;W z4g#jdBMjOB9rNT3k{Vb%=}NZ0{9#1;hqS^T(trDU<W^wKOTN0}PW<^Fc0NhP@+|u1 zhHCkI3U)vSX8)ZpqH#6|xt?|7{wQIzzv?+>$*e+T39;z&UkR2ujbzZ{9l`blY@P_u z=xUZP7%&0SL!xU(Ql0jXVrlWCqlB9^EdTuB_;Cpvoqfp>&6K&Vd=<F&WzD`_?E zK)gn4gJ8C$G^sg;f>AY$m(sVkattQWno0Nl|F1vx&eUOSis-B+Lz08t&pMj6E0>d; z!0<X`%Qm`Gj_zj+JnmpxG15WnO|zTp*j7?lex1#`k}jUb^F1tgjS>gdK7?)~`Ujgs zMUt6}o^)>XydPuFCM6Nb*pWoThu8Ec;dq6@Kjk7vceQ``X7h6A+aRudEHl2iwj3;| z-@*yT*<X&G`xgs-!axp-;8u5E)OFT}LOs9s(&o1-?MqGdjBe}w<>E`QB(MI7uPtJS zZuDsDO{ItfIsJA;j$ZHh3mkIsVj5I2E!nypiH9gRH9C042!syKsp&+OjKy$r`g-+^ zcWTvYyh($417v4mB&38#r^G*`eJoL!s%Pkk1y{@^t0jlNXurJmNN!q)%1cgq){_3z z<x459egrTgACU%NbOYWBqXPav;M+v9eZm%SEoR%#4NB(aSR$=EM}Xc6hnEl%WjJt* zE%C0&zUAx^Y#?<U#rYvW0)~Oc9IOSk*3EKo^wslxYihQ49`9A|9>YngTO|&MEy(q; zp<hHUK;K+`@Ie^o*=b$NV_aoXcw-%YD$u&po<>Ym1YzYNj?}jxVaDpUg+)=_U<dO} zzSO@oCC8mHLJkI(JI+(kE3Ego+8=vU(&$B4uDwzQoyKB!FsFhv2!@U5X+e)rwloJt zt(aJg!cWx<UU=?<jrp%s4bhrGA~*FjqD?BtL>QWc7yu&#HG=*eg6~Kw$Lgn*OD-}^ zRjus>+d>F8;<Plqo}Z%;hnP^0>JE16&S3xfYX6t`Tef<+5MKZLx04(RXiN~CAqMzQ z*W<AS{keJ6v627U%0Cd3Bue4kQE~4BfkR|xhf$^Ut)zbrn#1}3)6OVnkR}$KVAPr~ zuLlQ(96;Rp5gbG!4m%Mq8|}|-7?z8?#zo=6iCJ|Op+=&lcia^)$PhTVryuWMg3a7c zsUmPot$ZU|*53d#;U8=QrC{gIx4t@RI(gV8ezGcJCMzjpp9KcIXJ=`G1|8VH`o~E5 zWTOKCwdLS%P<;4z(;(FFKu_Gf2TU)&y=rQcMv;sk1zHF0CiKRH=9}cY@wi?cG+cs_ z!MXmW!Q2O#F6om^zlulAj-TF8R_s*%(J}Dw2X<i72QX*9fC~TJzVYz*6y_>m=Qy+v zh|J(13CMjk*^lDSRL9_6p#(uqd8Q5vu*;F|xBu}Od4v`^t-oO@(KGvaD{i65`9Fd{ zom%D3S{=dN?NzY&vu?D~iwjp-l@ZCwT1ePf6rgVr>ph%0=c0|K;j!KYDOpvRU-7ru zvNiAZZ2l$=6qMWyD<ES^ME6?dZwTqYp-k(VHSkmWwtB;i+j<6J-w2QYfvEq0ebJDC z3d6+9M*Fi4!6=n@#Omcz^csUM>x&mz|M5FNgs}Z}w<uoM=Vs)Tk=9wkQ(gb?Q~~)p zziGBy>nD7r&UC=hB-QG7j_i7U=O%#VBMpON)3fa)g<-2gp1rZ*|Ae8>0N{sh`sS$B z{Tm517ebJ{213Ly;aK}W(*UBUQIyuwnj7^27OqZogp;rX&HvbDlCsl=M)1~55_YK8 zxy+*UJt5L&4Vp+boOs#EQ>yK<-`TG_{FaH@bOLo%KH=-$y&+)-jsF@IFmWejIef6p z1DP~kGfA8EdT_iTCt_qO?-{sjAQ6Al^uHckNp0w{5<Z*_ILMF=Bw5(=w9t(i=Kha_ zQLY?XlRVHQF*cdnI4Q*IgegVn-Q2{lhoU9n?V}5GLUMrEH!XbF+OoskQ|VqkxQ7#A zE3w*5yd)Taso&pSez0jDXygZefpn%`-`Tti<LCFOxgv9Ue2NVE+{NSfH~gQc!%(00 zM=&e}7@>3kFnIXlf&0HC+2jb10IHU;0=H*d?ubUhi?u~zlC^LfNMSee@Lz#S6NTcT zX^vph(71>~vl?k~Mm<H62-WwIBf`_@o@Gz%e@9=?P9j=62<xDDfUx1m*RPkqZ3i)h zpW0oE3%lTcyawb&n3!c-G731?ot=u$ma6YpUwnuNOGg2P=UpRfIbMHirAomA)~~aZ zvrNnCVSWInE$W6tg2VjtBhyk>h$EYB^}2X56f0*CfSLe^FXz+6+R;MRw8ZnAT|VC7 zTc4Ck2a=6!CJO9CB1`?KgCw|wY4u^~Q6D{kL}8r?n{OYR%+^kosizTeAM;C&vL!gI z{>3zXJq1-(Hu7fRNQY*}lt7}UU>vzdg2EC^h6pJb3-unRW2?n5XsU&CNRi|CH}&J7 zqeZa8bMO-{Vof%BHKFhuMfII(E3nYZaIADfI`9^p@y61(YP3*4hY5$lU@~V0Mjl=H zNc8CTY}gv2!H+f@elya}dw>gO?WX4`n{Sq8?!uR;4K&;kd?#s8SCEh@m-9y-nF5~n z&*u|~4zT~KeajXhXiySg?ApR3MlGemR2<sy*=fBKbTtsyk#KT-Ay_zhOru=>L-+=y zG7Cq7mblKw-JYLs!^WllM7|;WZ!7v)`?mjVW0_hg*sXt1yfk0Od+`f!j^Gq$)-q4i z^F_<Y@{0}sCqy*_0P~*#;8ZQxTTH|gFG=SuJ8Mb_ydB(9566c`uAKPd7f$gnodmII z&nN|ObarHI@JjQ%#h6?@HU5>bR(AiY<OPOkuh5be@Jfy#%6O!#NH(jV@2Ne-r^g?i z-fcg_z-2L*YQD!K<9vDg9hhRykDfU@owq#*ToziN0?a$mO}LNfg}CLl%Vd-N{<GVg z_AyZx_Q_Nf)+O*mell?lu71`c-o{5x>H=3<cAVv?TK4Z{L<BsLlZR*%%hOj8p9oww zk^b6cR`cG~+ao*2Hqry}q8*`Uqh<n#8Ee?6zzCmk?%TwQpv0-z?g8kyRU0>yQvb9} znN?f<kJ;LK;aa+9gy4)I30i8dkj4V+u<2SsmuSA4U*7z2d>f~y!PL^t5n(ei1tRz@ zW#`pFv%xyr3h(grzu6o+n#d6I9_d$GXoEDjl#Y_fyHMBf5oC%8$Zx@tV_OlGEuk6l zOD~g>s|Nnq^AdX13S!OryU`^aM?8OC9$U_Ll^K$H#&a2EvjzBYO;t5WoMcBz7G)62 zvODkd)7!;85yDECz@WO?3;wZL_obdXhArUh-48(R47LP{Zj0@EgQ@zxDJ8vxOwaN5 zI)uuPw|pf60Lto(k-$;j)x<(`HA6_LeB3o_fi;Y)ceDQ#TCN;^!}i#DSFC^8SpGb2 z5ssFGwHO&JT97Zi8Rer+6>P<Cvb#zHdTVMOrC1An1ufk5JEyMX##Kk4qwA@?f&(`s z3HD+VoiS4fNN5bvVMOEZG;Gi);B|RV7>`qJ?cQzlv3j{BeWt9GhAsAMn0KlaD<1fW z3^KGA+F#B5?u)0d{?PJlxs|TK>RiC|*YkB(5z^AITxfyG(W)GJjf<(8ZQ(T8Pyf`} zPCYAAeZ<r-gHG#7W`8_HpaLm@UGvbOiQ)^cqp*Q_rL7J-oadva4SDVwJZqJ0|A4z5 z=Hq?OV-@H+qKcmu($-Z{;Bf!LLbRT4DS?j{_0eBkImVFI(5E~JXafn8gr}O-04Zfp z6gSu?FTMj;?KPE`Uxkkwr&1u*)c#@dxBTVfl<&Lygk!2jfqT0Bk8k2CuipFzXEaXK zlB%To{Qf*dMsD0~-j3SVty>rL2{E=vv;IeqN_;jt?E?Yj@#9gm{LeTwBw%l8t+@aF z1%p`}hVm)e9>FG=KoSY!s)ZSB>c{E0U==W|$YGt_=%eiPZi!J7bb8Gky5=XFVMpj} zl;DCMwFOq1asS-54Ifts2j+Y7{n!5nC?Hfjj5Gy;_yz~e?HQE@RXYw&fiep8fe%~_ zGz&R=cf=1egH(JVBAkDx-V?TYzF^1gF(c?UYg$f&v;LVy{PGX4{A9hL0S=IAOh)5- zN>~J#W4dk#kN3he8rQ+NAVon=N|UAVMyrNe*Yc1Le)A(m7hp>(6w21v^)cWqYazgT z&sQ+!LCd*@^$nKM9RK)iK;JolX<Z+o<L$&F5nhMjg^l(f_=WWQ@<i9>`g^VeAW}Ot zvve`7IjQnBK!^qVHh~nhs4Z+&$|#G!U`!04_v@3tKOR&5;dR-N%ICfw;Abgjf~Yh( z<`4xg|0j*tQrq<)iAP#3*@DXF&wBd_7hR;$go>9`qG1ClhU1DsR|<NydsgjKKZcH2 zs3q*Un^oVc{pUZB6N8n{tjoP}Ryy<FgO|(D;w4KL&e1D#nBC;5C-MLpGIr|)RJOZb zStd*qcW@XG)K!m@7>$BHE!b4YE(<vALVdn&D}ig7nY^THNwP}nZ8+LtG2*w#+BAEU zbt_%)j^mJ<HX^83RAoYlBYg{*7|~xWsb6Gm6$6;C$k!W8s5!>BgeU~OwB^)xhpN7H zk&oikuEM7ZV6EBF9Yo-&=HHH9h1452iL=3}DgS^%e5a2O;iwfjHmI4Y`04qczL-IA zK&v3x*R^UgL|H~^qNrm~<<<b!`{xlMh!ac_uoOll0;3S6Gmcc4)FB0m#HK+W7)~X& zGfuCT&!3pc4Tz8v$(&%UXMAh8#yB&b;R>V5M}tICH3A2zmC=49DNa6Cg)5iWC2nC> z?Z^Zj-=Xc+JkZOlL7$c#oeujnAP3r6@0~rXT}u%ia%jKpY!q)tAyL-<-V;78cz`r2 z2{}GV&-ZkKmF;%#6>N7ExyN#%p*N!!R+>FmY3ei!%-qWbU*Yz@%T9(BB+(}>xaUf{ z@3Ek1;|ldbA8tn218r@?Ekh-91p770%ZT9AYhN%Pn{^7&zi=)pA9q0IeDtEA1~1?J z*JPjxvXBZk1hMHKlOd=e<Wzut4HNKd(?Y^gQRJYw8z!0-WGT3SsMu-L^$EI5MXZ>a zbix{9D!6z!-;Yv`?XaMRP-agaSv#8<z9i^erhXL63A%rYN1Jtp7@Q0U{_7FcF^oKX z;&8z1Q8D+pHoUcJR0IeJQd6|jw7%y>UBcP&Y0dreTWVy?zQECE$Df^!vr{Z?Uj05Z z-+BcNwu-Ylk;@=wi?7<xjriQKm86gx+!PNWkM*^l1A?_+`-+utYMTC$oqMy=CwbI5 zkc*!4%(A+O%ph1M{58*Fj$|_=WAI`bEz82l?w)j*l>gC5v47tb;#j{CF9j3Wzb|b` zL`P9KWYVb39#uhuOJoED5mwCkkRU!%&=?q-I1Cv<ilWrcI6;GHcQE`n<mTZDo@Nzy zg`|s=xUu04xa9Mtz_YbS6Soq{{)H@14~s2@H$_pf3jvKr7ia#m5fW|=Tq6;(3&dYq zb`Gg~V?^X^Pd4F8lCoFb$?ZzHT5P3ny4_oK_L{za#ZG1r+wMJl1-4EcgKK361>b}q zi7hwazfR;IDALrQK?|vs%+Hgkl$QGb$8WC~gwRwk_0(~WdbJ&#@E-E=0bapZUZArP z5-ix2h8aY;pjh&y&<;2NtvmjnRqcQA7UZA3gqf=i{(J|f9Dzr5_RFB??qfbn;g}p0 zWfDw|P#=NnMnhWu*$n^}?ds5}YJnHhs3w}RsT01TI9qfi#zk3VZld$~ue&er@Zn^W zZ{v9r6+I;ky{KBijx~A3b}VWEN1MP3oRj{S-kHEaysTiNs(FJicxyGnF3O+bRL5{L zaX%6Pe`z-P)_T%4tO=Gc$_RAS7bwen`qs>-TjGm=v5BKgTwm=vhMMO?#*C%q^uQ<> zz>%>J$1hp_eEVyy*JjCt_f7><D|S%(S|C^MHm4_i@KVlv8A)}>GrV)uNs7)`mZ@HG zjdO)S*DpX?Jx%`|I6sM;&>eA{r?g=O8VHEZNB8e1Z^7-*>q;5H0-Jul2ZGTVrbiTp z@4Cer1fo9~>``aa7K&F;m#|_kWBT>6O-TI9bORvT@HM_^SWCFh;c&F(`mYw!niW4v zugn5Eex!47XF_{pE?jF6L)^NZm!B7WeQLSse@)Rz+Ewk)k5KKD2u(P@A+WWM0Yar< zF>u*WM<!<3U~cYUaW2Ax?tA~fAv%1!FbvGk_rJsBp<`I3FE?)goz<fIRiU+**Sl9? z;I@PdL+rH5?>^}Pgk3Hn$@fjnM^ZC1e%l=jXAkEhseyD%nAC1bg$F8N<)AuFAlcvV zaDoJ=BHOoCb{rtuFqM5tEz|c5EH^!7KFXaP_;kwc1}6N^Q!8X^lzrw*2rFNjdilla zMF?jh>V{$E5_ZF{<qWM7^=i9QO}`4)w2^(7+WxV8SBwY(xF#xFjtJS@d=?LyI=+Y8 zCWN(X`Vua?b9W)^Lr_6TzChtiKl{(>Y0DsoNp`{$g;V<T_#e<J@92Ru&mnYr0r3Yb zuOeJ8wk^AgSSol}uWAOxF7$O41CR26FW?$lqAxL{e}vH)I{}N~)gQ!H*L;A_mc!LU z=wfw9Q*S?0)?~9wVc@MCxTj}01U3ZRc~S=k8}OaZ?2LHe>@&F2AlIh1QcODED%jSx zwSTSILs;Ke&TQ-V5z<++h*Pq1@<nEoEpOrHmShGSb{I4)kF5BT%Bt4%iHZQW8U3Ty ztOLyZ9E>h-55Q^VnUqhyN8uyV=setTgsacNghRINxvtBHl+8*Z3u&c+GgtaD%Kl)J zIJ^|Fzi{uBue@3I))Mxx*{d9VeEk>Zm302~9f+OHu}KhoeqEQoZ)J0qo$)1EA%ike z`NRok==ihj2h)^<Q+eT}AlR6}4pFIx@6prdmv|<=^s8uJGKIm|o7F6VK<fP)uu8%? zH@Aba*Xxo9@v>?7PM_SAG_UvXvod_JrVe>Da88fY!EyKfFSLJNniK@&zOLBVlK(Qq zQtIGToc@!~%$hB~pXh}@`okt?{zdh2&^nx|JoXkmjZ>Nh{rC=uOQ&M%tTX&*VEKp{ z5|Zv<^X~=aUMJ+Bp#AG!$boHusYNjf-BBBjkpe@TZsh^^YJZ~fu%7+-#3c3ye8zOW zHpmKgdqS+nY{+uTK?%!WE1nfsLwk9eH~7H)Y&%F{Jmz^rb{wz1)%5Ii__Z5mz&~I8 z7Y;Z-)np7l5Dxt<SISG6Q;GtnYTK9mrG?beGFyHHC&Iu~>Jb|>y;AT)&n=({p-T^G zG<)k^Aphz|>Y!4B(${1uaL1e(4bYBwDy}r08aL3S*RLtJ)}9%XYfgzMA06$$2=LAq zruFb)xp9NBu!B;{&$x}jG7&h_w)8IffUR=*i%`-#i!vl9U;O*2ZsO`>fB8C~VhZLm zzB6dQmKN$-ySlgyi}V2yjB=X~;CSnLetKFMPTONA@T-U({|9;l<F@U#^ytKY`8R0Z za3u7;Jb7L73x>4By8fbtHN4nr_-mK{3@vVd2Mv1pRE!$d1GoweuzrON^Nkl}oBNw> z#gDaRM|F#3Df``3Q}1R?6B`du(&Y@WcRl9s7582~RZqs&mmr^BZ@<CddoS4qYqP4w zOO6B10m?17>R<y-A1<&g-`W1!mIZRM?dW`%F{8@*;}-0KIwq+1r?LgRb;z_6!s0SG zsh&CG%3o7{HxNarjLtmiFcky@>et?RNd<}nHQ<5(@XT+W);XPDTg)wihp$+KyMwFh z_S!M*$_t$02-!=EBO1T_#?Mb011%wXoC{D{bpbkut%dJ@h=T($9Xp(<x6V#2iyt`* z7%l+2YmwKg%a@^n4L7#zNPbbF-z?ZgCak3T<<f0ok68_?sb_8h^rcB%TD7h<vU+?l ztnnh>{<96i%nsOEl7_EVjSv?|7#7XK(W|xyeDX_6ee{8GtE6y~a#bNh8#RK4TY-;1 z=T&JqcyNN7j@Q+f*C>j3#+fIpDqWI&>OisoV!V|uZ-2~=KfdP69R2n1bbF=z@EV&t zupG}Oj9X{4B`n;P%vr(O(PLQ+E?LR5x6E7@A4iPqVdx{j9pnh=#n!3He{xSdR9%eK zyjSr3k|TQcMNI&_o`IXIUjIqBVY}w3QQw<z$491yUNF176j9}%o(K@{^C|z@bozM% z0dDoW!483a5dMOGLAO}W!I;Ga4y+V}u}d?*3QfTI8GBzHb+V~B6Lp++Apu_Xn}*)H z{ks8JhmfB1vQpq{U8$)T79Slm(;iVt07^Te%+@7X6y?fp<RK`hgQQBt$s^J%gpHw^ z)a}(QY!uAlf0jz?U`anx1DgX!%dR*oHNDy|_(W^X?iyI}Jk{QD^17P7f_zEI4jq65 z!W@3VS>Z6Dvme&Gd+SZp;MIipgHKKAkcN%V3tJ_FV5%$NYBo<`5$GETo#`qVBqvFJ z{ILiNbt^27zhkvs5ocLG2QJ@M+6r4$7G6xPdi#s~s!vgSS6}+7`e`v#8o+n@QoCot z@%GFlN{$Z<5a9%!wpVhA0oJy&F1xu3$$IGUbz%)pZ%|1K#ujbQ3AdaX97_-0=UGNQ z;-@^5-+uXoH{QXh+4@ZuLF~V32k@78JbOtEYr!^;x6Ck|I`0gue9vz2+ST?kQ4XKJ zx?^83!ln)O1J2Cfl7-oVZ6IT}9=;Uf9x}&A9mieyr~D{h48=$=eLaA$JS6B@8g!1? z%N9d@>Sxfn)udx_I#&Xz4^q8+8WXk5A$+kobv_>U+p)t_ppTT)I;lx&Sx(EDT34o{ zgbGZ-#K(rHmeV<65)Jsu2()AMghVFEzNSO-(6-^DG)moJ+ytW(9x9~lYw#_Z#zLkM z?2c#eyD-?z7s!;Y7*p;&C?4svNf1HRx5eM>Q%>v(ve}!b@4;T&@!Xqyxx^2QT@U8m z>fK*rtd}p?X_j+kq*p`Swql8FPtL4to<Q@Esax|^$+dS=x3{bN5YBICKh%a~WL3Qn z@HhRhknnW~CZuW07aS^fFm9!>qo!B}93%;K0am4;)&qdQ4x!nY5jkWCj8A-Gz>1QH zfKM0%R{R9%gw=-s6U|6FFAxGvrDA9#Ra9OV6K!KIJarNdr#+nC;rv(l?P}KKt%kiw z=fKVT!ejy74lT;*`v%LG0GLi%>|B6_Fz^>P>jLhPt;3YPo4V#?0JK}#GFagPt!4t$ zXiW>Gd0|ScHf<x*C&bv95RlmEzA5G3D%h5udQtdS9Mcr`G9S_9NA{j%%jdP&T)1(P zlHq@l;}l-z8Af)oS=GN>Q~o@}HtiOeVc)u2iKWI%v(?2uPVXigzc!YQLcQ~&gEbmQ zZStmYL_wO$zCmTD2xCN~v)su@`)n#+lF{2j_<7-QT7}vChTMSZ9d<KZh3F<6IKw&9 zpcP_@y{;ZJ4>wv7xb9A-R!`A9K5PF63-b2If5AR_eS74{o55KHFn_tccKeI=Pa!Ah zxgQR;VDlNG0g`{M#ML6@@klj$+)Y-5*2aJ&-GFOD9gwIZx?3AvVO-L`*K1hjwKE{) z;4i7LH975rF`#RHv(pW|nn7y@ZS#6G<>`46uJ{=0?R7XeOjJ-kC)VK1Us4-KC^i=C zWQD+;wgv-IZ6d`MX9Ve*cQUqahi<7&QBqvDOnrRnATd?#O-FOsZD~sc_N)(6IPzXw z`nZerkN*{&oE#IJox)*>+2vCn=I@VS)%KdLQp(Khw;eZ}!iP_<wjD7H4$J%zUvFjF zM&{eH@BY4pO#nM}JjhSRf>n!kiRjj%q911v3}GFcKwhef%8}-%sbz-m2J?fhXb>IM zYynRHGHP0Ig>Pp88>j{Iqr8^$qh$Fto&T`5urgk3%)dk>Lq;nFQ>OhAsfKgyq;uqL z%3&|~X>q&!n#J`!`N?E$s1(RIV`YU!QV)5mKs6-;RYu%C;=gul9e`OS11FtBdfAo8 z_Z@FF9Md^?#Ar+XE}W)JZG6BteZj8Jk>bQ86d&+@4wmcy$#7c=+qkk2Siu|<EJDgK z8OFY_h|sJ)J85bg-h1{C&O?}UH_H}TR>SvehL6_D*A&S}JP<IVv^Wr31hX|@Yz=g; z5(-BXagdHvlqRJ!YlLf3pZ|!ZtxQ+?m*}BEN}4vFj_0t?E20luSlFU@oPoRQYnr%g zE(TktA&hDu$1Gn`cLpZUYNtbo<QyU^I4isx(y3L`x&WAjWw-l{^^zzJm|ch8JJVTG z4qOoo)mxJ4OVt>cA<%TwMZK;~aY-|?`r<V(AV7BVX*8HSeg}?NFgW)7=z9yc5OvH% zBAmfkT^2ApXpoKH-_%11Q#26FBBuu+g>#Yx;+H}0D#^!rgE$?;!9e~+Y2MpgmIb?3 ztU12c|KfENX!b^vNPgJVNFqZ*97_03!S4OyCHogU9_H5UNP2D3jJIh;4pKDnIN))L zeeirkLNaJ^Acv<T+PKQ@(zdf_{!3kr=LAxWub<F2FtIe<-9k*hZ~1x(SiIH_Ug0K< zFCc9P2ZOM`9}fVnx0fBO?b0(xf3oJ8g0JtY-}nn==0@GdS8$BY*ah-G7XfFbSpZTW zJ)aD}Yq-yZVI<y8>|vQC;0bq26$sCkuvRiI>wm-?=B|ICCC~d7H-Z@w86<ZikK#lE zN8aR%P5IMmhih1%Mq;SI&z6|=QA(be!A;a7k(ZTO^bwiPQ8S+o+Kp!9OcSBKQD97; zeA?1be^IbAgxMmp#!PyFni=ptWqzCWOqbi=)o5LM9P}+;LZ9y<Q=Sw-MY-(W7@-$` zoAKrA-`hX$r3ct@Ho=MAnV4>r?|A2IIXPy#;rpB0hATdumn}~|DOhs9Y4o-Ew%`C( z$DFbS_p2@hX}!&wtuIn00afJmv$b^h0;~1*mkNG(*RFm`0T&pR?Dnq$*We${%z&wy zGaZS%{8?ZLqJdj%o1JONkjAn<etSjSXI~zjo?1>DbEMkJ2OpiZ56}TW@AHZ1(!c7U zFF8e*Eim#J72X03oep++EGQ&DD{Rd!9z4DSGojn5j|K*eVY3WO6nU3Gz>F)bO=JfM z`sTdy<>jw9bK#fiV9u~fF(~{q*w~jRzZHBloasEn`sgia6#hXN4{~0U8ezEI@msgM zvl(N$m8>dW_%<Zo`=@xo>cPLH+wKg)AFZi@t}XleMAI3nB}p(N@$xU6?&PgupnK<h z#Yt`b+@X#^#dBu6U391lb1ySEuydBdB8jyHp<x5i;jzO)EPfRh-R`T;I0wYbiF8Xt z^fzN#1|K~xML#RmiN{PltlL=6-uYZV)RSg^!E83>N|LQ{H@U2V(^C%R8D3A@csd*R z^IPXjp{f35(>qcNz7jD+M=C(Ugdsa3Ykb;x`~%B1>YXrM@nSg2*6vvxggUpMCh|N7 zb(c{@P@kxtlQbMXCjz4g_5xe+iA)w92KV{nhk-hAf^_hn7(*Z$OU-ncw1m47cI>9H z@*`94P1P?1S%yE^W2RVqqU~ONq?_wU1_2g}ZOwypl+l3Tn+k9czkCXApi{aGwF}UA zbJ$STrU5w74Sb2xzg;XIEDhryuFFbEK6KG{qxi7yjKV9n-b|@{ptnG^b+>=9`?YfU zb{A01?=#Q9QP80npc;upxav^mg>?mV>!d!;#%+?fNm>rRDY|@SaNPki5MZ#nV{gH{ zk57Ql>kk-g#d0t4+Yg)Cw}9LJq8>54grP1Z2lM8NfLkAZQ}9btc8~&IJnx*WMWt<Z zWFP%dz?C^?AO2}#+3N*6+?ijq(!b~;Rw1^a*Z}umvFK^nznDx=>}b${n(TnXb&J$O z2KB)-r9X;tNLF!B3YmIc(qL2L(f!w8SigOh&+S*GO((J=mS=_yL)F{-5{>^tZk}DG z{lzE`Z8$o>u2T27dgja1k1jz%Wc#xiNUwcUGHN7ui*H+DTXWUvsOR|El<UzoO=RcU zL)y;ZsHEA*3WqQCoVSU%hIaJaFW8JA>Y`v%#Aj_+e&m|&yQOrbZTVTz-vcXNsN+T| zLBMjBUNKEx*>P~7uI70Peo;zhwte~iM9VEnyrAa21x(B!0DAlXA-Q<+26%E*0ywWo zS0yhp=%59tVH}`73bpRS6orXkvd|$<4%5yNy!?>bqZUJ}c$7tlTR5TF7=cdYpWMv^ z^FBiBDcDbB!%mG>3!BeY*E>YL1GLkj&l=mKWmw}3hY;4LtIODtUzu1ho*>gE;VJ!5 zvw8xnF+f3%`H@m>f#D0TGlG*|*excDkuLWQP*p+y9?}LWF{d;jUy3dz*nLdHGCVsl zz4#Cl*zd}Ae1!DnR5WE{rtZPRlPDF?B@`Dd8pIm`BUnLG;6dUVN$t{`DF3qwT3>;{ zW{*-3&{sP8NXwqWIS%MTurR3x1!^`P2ZxeO(^`lTjxxzZKj_w&p}?H_I`HaBY~Lfr z8eR=NJsiGKT1<l=R3}~teX}3IvitQSWQ{hE-@IWl@Ik0DECxq-G`rWfe_n$m3iP=7 zhvL_)zG%~Q{>6l?H1YrPxt#9CGB*rsQ|V^NBb)&h@{lyaPegBOZo_n?u^Sr`V|!uf zd6NO>aRP~bd_E;=ax+2!B!@J`jZ&&0rb<+-Uoes15KIP_s5W9@8_adWMep2C^e@79 z@{&ID9eH<LH3Gk^o+K-O8%Re(f8f5%pxrYb)2NWcU%K#2q+F>K8133^x-l-vX8Y!r z9xIU>MRjOM7{dToH7RH06Ji^|PJq;p>6QJ=vU(Le9^ME78EEvy6b~R?3=0}3R}<<J z&;4Xh!R?YJ@+E<&P6LJ>MA1=e;Ar7>wSDkR!S=F@HeC!}U}pCDf-N3sYrM;rDGX+D zNBfZsGr2x=d=rc+OENwgT-V#z{wwBl<7S>Xn2|plLXWdB(SRMG1%sZ_!Zj)F3&h*s z`Mh9vjh2vTmoI?IO*nP4+PvB}we0>jreU|c)rtpsg1y>6@YskQfh}6i&59AxlGGv` zmrdBYxGYgOlyq9h=;8zG__~oq9EotV-1NVc*hsWHM9SHYop~e9E^ojI5Yz@#(aN2p zk`SL68?4G9J6dT9HyoC@=f&&YRvX^JjS`S;S+AXnI%;~(H|vzklm3^*VBtiM?xT2t z{Twx1Ho8_+W8(oudnAU|FSuqRx^y&`65<fpW-zKw<sFE*e{o<ODJd+4nhi+2)cMrx zlMeTH`E)L9or(|YrqK}JgObEV*dIv1Rw6@GG%#-5@>TMXlP?WPmf~Sss9VYA1e(3n zVYPr;sY}ere#DObw?;Iq8`MOF5Wgs}9EXlCc{`Vc)h)#(Gxaaw%ylEA0kcWMDzg;b zM8}kP1yU5oDiW+h<4SrPkN`!6>aC7U{_DhVLn9d8Mgj$&f`gHB1Mbt*+XwEiZ|cqP z1<}lCN^&-EfAR$p>AD=}qikM&2SjCj(sP|tTg#6{tZzxj$?pc<>6OFjQkwC}6HeWM zK9XzTm(V}GVh~<ly$ah=PISq=4~NxsNcJx$9!~4D*}o$yJ4N6u9Hsld!U_$LcxsyG zMFf!jBCLR<*v<yRwI!YXIMq8H4tNjdt*mHoFQrZI3icU~%9-L*@d#Jqq<Tnl;7NHM zg=V<d_1VqS(AD^GoJvUCzZb(S)P~q$I8pWWfFyUEu1BP*M17pGOxF0zdj03daVA;8 zHmcRL*WfDk_D}ojlCld-|D|No*fNtP?^%I%Xav%Rr8uz8JJYCVbbVyzNB@dBJX5g3 zKT^Rojkw!oW-`@bNqYl%4s$iYew}<Z@Lk>Pph<0hOYD;zRS0mUvh|a`weVuIqc6wk zdPt<2zKuVT%_tO(Ov0n0_VOo0w34D3)jK(9aDF5yU^*P}g%fm|q?R29Lm|)(W;#s| zXMzr?+@CS*TgS=HNy`xNCf<%zNFTle<6C`GU6gr{G@hiVomhLfu4mSx?2Cjq-sU@` zpB2|Vh+6|8jwxr^W~i*`96a96NH!2|o`HQ4wV80UfYSN#%SE3mZ(p_^R0DkwvYJz% z(E$i7+Goq&JDo-7qXh{LFfHOq1EFxcQPHq$qWtoifr`K>6irS(zV%3WhWW|x#Xx(~ ztHMaVqtfzv54VQE1lxY`UHfb0TP)yM%mMTC4@8VFe(^t-;)<L~jMU&DP&lZ&ZhR-; z5|)x^lBw4p13CPQc=4Uu*${i0a4}KyLHfrszt)zR367P|A8+295BRI`dsHAiJ`MfI zTR#~hK_K|0%iPgbJN_%WZGY*$A-7N^X8IS|oExHqU}uhiU~fX9$OO>>0fN-aA8tPQ zaDbtX%Gi3D?s-*MCz~!Y9P^`BBl!I3?dOE68Wn5Z3mgwrbt_Q&_Y=d%p?9KnD(IT( z$M1O8!~8Lv!v$Bnty5glwTGS*Ml|Kg@MWZk6<?FteNn;m9}%M>Qq<taZurs52RmtW zCORui@#r)l(2hbgj+-$p=`@Ger{)LPt?rGWNxqo7rKAjtQf#LgIt^ThROi14mj<C& z4sa@xmohk}bSX}E<<ARtGE7yU^uG|w7&Wx;6)x9*z=%P?E*d9Er+O54x4gIhnJ+Zf zUQGT0*$!3rEqFQk)4!x->yeRgEvJNU_YnFvsI15l_Ojo(;Uw8IUgTF}pA26Nc#>iZ z7%{W8=5V{1d@%|62|rzwORIkwF~(X9iKM}~!)XF}F7cA@)SYXw&wyR}t!fr_1afgq zbj~_4xG77$R4YtoQOWi=Pm0&L)EXEoeO)B%WQ*n2D}^x!%k^zY9&P$x6X>o@SFP-# z3UBl=87WxQ+b6pxxlU7JUh~8SgA^*2aNcdD-d|UPwy=?|Z(Nr&S*SnN(HGFnN&m~I zr3Met!LY6nS3r~UU>5X{So<CnRgrB-Fvyb7%+Dw4uTkyCFN?IO^QsuUNWCUup-K@s zM=Hgz)0x2zVW_>@$E}as3%u<r5CmE)wp)JLHUYj={IdA108~J$zZfMZan>0QLLUjo z7_r1(Gvtzme+tV~#>m>P(s)6W3=(O_iOfApdRYB)>1-k{23lDVIg@$V5Yz&7E4=AM ziWt~NBGWpAg{qIK2Mn_dq%T*WVJHVVOc(&v&}5TH6n2kGF|2gPixr}>Gmz5H1$vw) zI|$T7q$`nKsNpz)sGQ_PvFb$jtz)~JbDP=kx3{kp?7Zsu-23M|3*N?86qtjM=XqXh zotfm(e<a7s-xchT$a;Q)hav0qzYG>?!LTq43ZPDBhvc}QSKbs4_@u)aml52Y?<wnA zWS4ofnj=k;lu|gZK1yrPw*M>N+~E0!m!AR?C)PNXo;YKf8d-OFyQE`eg*AvkZBleM zOjijRQUzlNS9(KKhu;)MwD}tsWt3d61x1&rvHqlg**HCRyyw*XT__9DhT-E$<HO<8 zR$Y(ao+&7Nx9w+3OiZfBBBN%$=BG*4vy=W;its{$Z82>dhskVIirAqwXjBI|)o%*6 zFqGj@iZs49g1}t(eaugAtl2vM`cq^kOq3K<TdOI>WK+7vn2zHzM}`Uyl>{>!Ee5NX zI;)cJUUGQgH8KEvJSG72p&UXPbaWx5zF$}fr7EcpxO^WBdnnk)J<<H8bHM(cOx@yo zTdmnTdM(+B2wm=@*nSPS-7F1D>8iyi1q{Z1<VL=OTjAm2oh<9t6obPA^PlPFZ{HmX zgLHUlNf{gi_W`(J_qv#$ero>=>n@;2t3hMLN>cf*?C1eV;tY$rN+Vt0BikeQYOfUR z4kAud|FRj=;B3Q3Fzl%Xf#rLH`pJ)&_*BCL`b~HkWcgx-M3swsEHBZ}W;kKL^RBW` zt6)F1q9ko>z>R-yTmemQ{~;|vL$4YcAN&6z$Gf%O4@CFR1it>T;74lKuzlqAtqr$U zOeAQ%q|4%)49GXIdSDM;K=n|{>JC_8ydSw41K;3gZdh!~mIc+rcZhg09x&#O7X3cT zY95bu)l%z_gl{^y$J4k{SugDTn3|09epCSt-#3vwCh;7vM^1#3DoGUUbgO~h1me1` zFcgHtWcL0&b`Kv3nADsvNs)En3W8CxmXHu3ZBmJiTqrojop6l%<Bvvsbsk8(<;Pq> zOws~4;p6Un0e^0N_6%Gj+;`l}@4k2{W4Yl>PnN;n(j}sE+8w<Nr)C&<P_OU8s_O*H zBy4TyVZ-82ON0AWExu&cbpZ-bi1-o^@{Axsmznd2wb{QLjK+=-p3{LulE!l3c;nlg zNLUh#vzmgMV76tLh^EL1W;zY@dFBv~P!+@(5?T<L!WevzoJ3Ed^@IhG|MEV9HK+{j z^`h;^`+;uQ1`5Z$LBpdSJHHEqyiNZL(cPv+Hi9cE;9x*6f+9fb+PA#d(ZUcF*YZe9 z%NTbe(bTG$+a|$A@cNi*MBixtj@SSMK`iXeHx~9ivNCTu3RprLOr&HE<J6%@V;%UJ zmww~HON<NSc?KAItoLl4_+yAq$@3A`@4hV_Bd-J**EtM`3?h~v#VBc5SpTRrlkINs zxEtCKFBrDlv3aH)!BxczoBL-Hu(P@ozgR7EveC)5AZAEk<MEqz=y(kEkLkFqXa$l> zP8fJ*YR`k$U_L<Srjr<w<<v_N?JRuRz!7&Vek=nUtnR9>3U>RgI~>J~SZhAQ-|f{k zd;ojT=SKWdYG0UI)8Vh)DcCUzx$*v{{^LjyoYjWpA|yHBO(F#B)ewV`AvR7r+&b>z z5Q$?1?ear*C<764l+>MQP=)3cVz_RE>jD{Jmu;8uo(Y`g3&v%H@qxgXWTxiDA^YJu z1Nl>#ukU%5#Y4S_V2}V)%dA<ud({y_$|quzBHT6Hz@jcluvXs+fcEKk!(9C6_+@vC zzqb8uZoE~5f7v*7R@UxIW1G9mPaA2LWc%!EDxGt)d<L$=G<(ev!14}<ST*a9BoZ`X z@tP+T03;vlZ7l*CvNb*AgW+AJBVf8feqv5~D~JN-KYO`10*?UaqcSV+NlOziUULah zv8PN&F={2bL6He5rbqaUdewenM+xnoE7+=|wzRB=_g4s)8jY;2#Skoetl)5FxGkq| z1ge@TAqG^{3glT+-L(FQ%BucYnc9`MexcffDjTveC+#97v4Yozcyo$&CsD-d3g}<L zqY$ld$N%duk6c+$pcFX-n-ExldkX~^BQ4#T$#=ude&?T@3By40=)$mg%fJD;Q|-x9 z70H+o$23zHX+3jA2Nl%^#XSZ;5ZPU%<Sat32xethvP7h%=&`~TZz7@!?J`_gxjhs7 zl`kVYA@zOSeYy09$RW6!y3UjL?65BN)}AB2W4l>}*@&!v5)Vw@EgmO7jibKGaLv_h zfeQ4--_x~3Z8-`Pd*uM@O3EV@lj=U}CHX&wkc`x{PNba<gd#X0hktb7q?o^6vj2!! z5|Ie?D4kMq5@O~Xuh<Q8fjxJWDjHSKk5j@nr!>4M?Vk`6gNZv)Bl&ug$Mq3KNVy}7 z5W38@P%$bn{Yl!Hrv@H{jIVK0VN%!OfPDRd`s>7l2XZx%K{34TIujOYC8LCr(EN9j zLI=``6(X&6YBV7WJHrF2YNa-}R7&oG%%gPG^VSy&wm-UR-l_{R@%Hd*etHFz&fx^& zW^vO0(rsg_OrYRbvc^8c>4x%XZyZ)>gHJnWd{;^t;~r~x8!r0<V+N(~OcbxBoxwzV z*3FO_J#4^XK3x=-`f&tEE~C;#Nfp&}<1$jqsZB<~R56KIjlyH*4L7T6;CtD1)2~9M z(VgB#%Q!RN1Frq~yYF5+O-W4hblr`DomSBJ*DUoVCl~>p_Y*by<F0IHu*OhF8$TE9 z03UWM{7$JRq4#CLfwXZ5+;y^teYJ3-(EjLGsCv8Tw<l{ZUTGm5QJoomgBz`B8;`=9 zGIQc7Ruml3Smp9qrvp!_aye9U*h5MkH1&vftH8r>aw>({;mt76dZQc*K7K<Z5TV_{ zZGd~q7GeWL^Uh3G%i1m!R+E~2#_+o@e1&5K;QW&w^6tW~n_*Kvb16X)7jWvsHimzb zdkZWKtMn#<5o%X~{%wdPTuM{1`%^;ljtg;s<jj6yi7b;qBlHKX1FmdhT$L}DXuINh zr0%<XSJ1?)PS<E6^Nr+HT$sgTa;}Y~Ws@9}yxy34+;aBcf}OpB@@Ty9=-4oJLKNx> z_WF}SYx9fTi>nyHU=DV>?)T3A+IJAkdiPIfzwMv*Rd&ifGBmi;4qbuFSP#I(?$oku z)*L-{qU!Dwe$3fkjAjK|z}uD$buGWxaa6#ZXaFPP1_{&p#n6UI-tgVm`O>h{m856a ziJy0Pb5nV%QR726RG2AAb&7+gsvcSDm7zancfqne_Sc^a%T&|b9~W#Z(SCW-|1!}L zSIk;FpTmaUx!DPn%i;xDw0k?zKj@2U*ujN+$+P|XGu~f}x9@8u<-5sJIG7Wy*vK7f zFh@i+zak@?f#0MW5OVpTQ<T0($~3s<|4_4m_7G0ZMA$|)qZ>sDx!@&(Jdv6u5=0^n z1d9E9TX%_Z<mmABl}PauF*31Y69UlW!X<(U66T~f8LkXbQk_US&W(vM9)q()I{5P4 zj*0PPN*)TrZ-|fN`*w;r;eUZ$hklYd?t>`&;m|rTn(M`z_P|_xd<v#S9aGwJB&_5$ ziKA^lOfA<$8nfz;Gu?vBKWw-BaJqaUgxBze9Qo+bb<33w306$7!<pC-wkN|E1Rc{U zhygQSWfJCuX}lN)Ma{-QOR#9IYe~MFj;fyjJJ2HYN3R4wZ;JvJ>y!Rh;P5F%a3m(h zshlKOa|}tPOyY*`vB^@BqJPm(azH9W)Y!p}jYqT6*`8t%J{?PxF7_t0zJNp-<4ga` zK+34W=C&nW2L1p}f;T4K5KG8VNc%ZZwGZ4jvxf_UvLn%l%}rA2KU!RstFrohTd*a3 zZJU;Gzb{~xc|ueuIx?2;y@D?@(Z(%A49JeeL%x)0KqN3)Vlh;Za7>@7Al5+HbUcfK zOl?^KuImX269-LbJN3Yn)<cA&J{E5hrHxjY5j?zKu;aSh)@QKY!Dv#lUCEuoI2C1g z+-9AKKS#`t8&==Zl1iniL=U7JjH7ZI1wq1$>CdE*S(}S9y1%Z8L9ZQ=u~HTg(d|xt zC<>?2c0tYxCUhEzBX?q}lV{z>b6kjQ?Fj4)VD(Uk6PFj^!-mJY<pOAn_S1a1&<ISo zipV(f0DR!2Og4oqSE;z_7#np}kR%E{!;@?wi9#Y#k=^<gB#;>Fi~z0K>%6+#7RZY6 z70EuTvFmiL0#ce5FNlEyEWd)2T=VqDUlyYU60z`ev6f<|8i+%`E&6K_V7Q_LnEruP zIXQ*_7%AQ!7AKa=4ylIsUwP(Ct2zM=O2Pt`7W{0GPqy5A3F%$9aCkPlUfI6I%eVO} z)@(*LnsL}OOisvNISjd|#?=RXwpc8U3eHppL=6d3i$3+^>}J@)`I((lRmH7#=1x}y zbR<qCb4oX%Mz&A>eM_NwSvR8Zc4H3-&9zK)N+#>g(7+zjtYaHXy4_(?Z#YHFX20%z z!?*t8dlq|1{k*#u+E+M6W6<Ya<g4Z?=wi#`S74pz_6u0pJglD`=?KAYl59EWH<-fK zWp<zGd+<jAEPUn@&rw5a#Qpt`X9{*}g8#I;Gnj%ec$Pk52OW_*81?Ozk8n013P(?1 z_M{?YV{cP^e&=_GmoULmWuLW`7KrhWMQ7lHL{gEA{4*D=qIl-<g+NC~%+5p8#g4FM zU?+GcU($5<3UK?!k@~czyj}_~*6;%o;Es0<M+D4R0w!dD-Z!&NYHkxi*oTulRBn;_ zwFpJpKpJhdgCc?Wn%%y*zY+h6s6+h8A`Fv-v=3~h?6eW4JgX%D0g#J_G|%`ZTtwDZ zR>hBoWJhi*AREhZ_@+;CoZ_lK4&Hhu^go3H;t(P~Rs@_!(rBVX_jLn)*+gS!sX-5I zEb>esc%B}$RN1!49|K?IpOAMlrY+_W&RBo2avoWQgXf(?@MtTZvG%5AQ$`e^d=hLr zAYmTK$-7a1hjceFMi7XqP0Uu_`>{4SJ&KdHD+x+*qdO5FdG_y7Lc+Pp1mf~LyO1h0 zCBWF8t2ejtjsOB}6Dj<N7cr+pN5pc}_5#8~Ye0|;DV!OPA61kw_DP9kbvgCp1IJ_u zq?+Cq>ns=QWXN5hVXfwU#G!OYkTQF(OZq6aAf@?et!InuH!JG&=!5ri@d@OVlxU>+ zfUn}u7P^?CZKsDks;RX}5~_-zY(s$=-1I~gg@TP?T=YnG-fB+uTj88ZN<_Csc<IOu zl$@+K9G(k1!jWt;y0%)K^Tp5QD7GDC>kv8)kn-7Yq2}UYt$=PWDVtWC`s5BIH=#Fy z+jVEhI++GsEvzbcnTfKlG*KQSFfDXvJ9gHLT<(`3*I(V?>63zAMr2}$FCTBm-Sow) z4ZUmv&g63PJe6q7V4TThwwa(ZsgX%k0YL*8Y?-kJkT8Z?A!~cPS6R*4jsrJOQ{gqS z8Xw4T7eE~^x+oChw&;(tC$leu91lpCn)Rorz|KF>fI+PW_)&?Yh|8|MvGbVI;ix|S zC}4JUM*w7#L-oH~e(eBT=X9*RAo{(y=c5O(6l(;Q|2Z)9(;wi_tYaa6@zNpiLS{&Z z=<e5dMlV6lnZZAO>`nbB;?fPN{CdFLlxjILQQp!fyiE)5b(KOYWF+IdW&~1r1)v#% zg*bAn6!}D&bRhq|B=zDacvC!3H*&sdu{fGzTeo8q;;GN!IfREocy3!yBhgFIg#;@_ z!YHDpqnSaxGa56=%!cU~KW1{a|JS!RT>l8wDp=SCYvklh8vZ$fAFgG5;lKfKTd%Hv z*2f>In<dfYYiv^P4-DYb_SezRdYjV(Wap=DPcJ6nn5An;P__^Us@f>+znij%lVWyg z9tSv!^QKviO7HTE3}>q?9dg>)kN;!Ox%v(#GCqZKW`>?Bvh+vA{8Kn$e}HLg%OgD= znuiKapEKzJq>zQzt$4;O;n=7*5U{!OC+x2e_)K}ZH^!wGT0X-4b}Yww#6d)-;T&`A zE&Xs?#csL%oF7b?i3|1W^)1+gX&2YVylGNrcUkd+3$oHOW{M$<v<NC`VM&&<h;{|D zQn30yFZ@?XP(A&iP1i>+!XLGg&i^xQ>N>t3b5e`1Ox8NiomiX`DEnxp%g&Hqq7I3< z=+f~fZJY3G7M`V6LI~Pmg@I={iCIp?b#fLdtrRd+B$fWKg<RGq=m^e7DSV)^M&UqO z?N4%1PANg)wqD7P@_mAcAK5pN1WTFwaLBICD@*8e=qKHgyieQXOm14pc5WHwU(OuM zIX{C1cdgiA0vR@Z!t&Fyi9NW|P8cF4PHN~_7jhH!^f&y^aBNc!7PNml#%v=^=<)OF zJSS@cPc^{dZQ&62o5%c+y!C<jM&JVlSo9d<nV&l_{Febc66!i?lMcMnVHV9KCu*@q zIsn!iiH}!#_D1o*w|g-bv7|$_N%NCVRf$lINKB{#Na{wWeUww_KpA;=%JowDQ<T;r z`$;@w^?nthFQmdrMeM-Dk}I=15IolrMlzjeHu*wK8MRSY2<32UE{%%yr3i<OA=qMe zq$t*a3cBBMs<YE@l6FQ;g(SpJE=8Hnlar#TC<!2y9ph(Utd;ZoyvNXed+`P(m-BX5 z2V=ZyexI!;{_*t-r+hac+-bXR7IHTr+?ft1YUMR6(LGS0UYuSl*v;bQ&N&LzQOQ`w z<VD}11il9@i{J0BU?PeICt_CV=C8nT>U)IuzWSeUQ&Z@xX<;#eWp-Zl<Y3XW(jQKr zv4Qp<Uuw`%FB)gPVNr4uQpb(b@gKtGygsn^2>iF=A+puo7dQN$A!d*u%2t0t1_;tX z%Qr<^FgHA_zU|XTa14Eu?I24Ct^|&H-9NIWnSSOgU|3OQgRzb=97R{IJ|D5>0sMGv z!~coXUxeMk4(j?f@aEaaZ0EP$!IP%c1Wjhd2n5rNA^?EXYZG#QXP02geao-=$(NsP zwA%KQ;dXL|iwD<o{yA&podWKAGs%c*938}Gf5qq!yZy2J1jkrWI3TugmT#=5hS`-B zMu?ESXDfQQi+^~i;jyQdB_rH>Hr2BmVrfgm_cN_IY^uTz*+ghQ&<%_f=9vrZ!PTQu z=JhymNZfH|P!RFO(i!#DoW%mGS&C74p_o2g)L6q(BQ^};FQ)k1>>)-aU*n*LV=|bN zW4p>bQ35E`+4oov51OLa?lp(dGYI6{e>SgmEU5vn<+$#ktRZUPl{N!Nk|P2$Zwn6n z=LADf)f^dIZ4Y{+K*OdwBuAJLds8b937?!2G(xfS&04|94R;hckf+BN8MVZK5|)t^ zG%W;T0xTpi(MWrXZF)zbdIhq0?a~S-%VS@r;?|zZhpqm-Yjx{DfQX;N@S?4YYAn>p zE?l*w!HZ4deQ^A;6M@M^b_x)zQXW-Rau7I|)^Yv%16b7LyOFAfVMeJ9E&nQBVE28P z56<$%FoeO5pBi<bakhX!7w)y%m*Pf}W^u+BZ<$aLAH6qT-F)dG2T<?f@Gu72(3U>x z(SbU~W>K!%Bg5V5*N;uwCsF6WRBd{>Rp0XC5iX+WkZe1d;`dw(#q%v^n(pPcnwX?m zR9zA*A41eY8F;B)c!o!Q`~G{ZIW~-gpm+D^EB1#$()a}kv`t6Xz+vg@<%jIc3-B6t zOb)NQQ9!7&9kkQEjKhfzj2XNUGgHg-BF-QuF>we?1Lz-7B=PY0rhrBf9QHCT5Gx0k zNGvF#C+j&~=8v)lmfN+z8*OGHfjuI)l|bxqG77Rq7uF#HC6I6s0VePaZocXtZ5@G= znO4dPXr|Od>GKqqY@yXxEY5bUJwzN~Sh>+5(=Bb9o+CjOk3ysgC-6P&ftZlgZzhXr zqWec1T1vvVcSMDMvmVxDQuHHnkz0JD0jd=wzz7#WeXw0N1tn6BlT>-oMUK@JrIv)K z8I~8!gw1vfdz6gGJy_HOTY|PP^4a{nIu+;~u|M-AKvnhm2d8l9_J0R|v`^nQaG=kw zRGWhT!zJH<OF83v#<Q77F;@8rj<+xkUspGDd)JGRV2Z-AU>vCSF9}j4NNjDz(6_NV zX-~wms9aJa94s0Ys6kS*4Hg}UN)$|qT9h(JNlq_3Fn@h9n$=7au{fRe1u95VDcDUw zf08l{e>u1P#lBn72{420%=@<$6B*SJN$;{8efg+hr|Py}WbHRvBuY`5w*?E;>^EBI zi{2QJZV_zzY59BG`Bhu7T=v0x$EOy!Q2x!gZjJ=d{;e?P<=vAA&Xp`9wif(6kg{@| zz4vAd;`qiCK^up>;ra--B4%@ras#6ab3fUB%^QrayL}S}V<8IJhCtuim+Dk07{Fqb zT^ARKm$42QT5#ek$vSzK@9|EtCMhZo23h8{NtWWvB*Ou+daPIXZ)`wKRv6_9Cwl7V zpiIS+nG~&&2P~g}l^J>sQnPq!M1$l`l<OB@(`#C&rXbI3j^w-zJFCw-SDTJ|q;Qa@ ziCIp@Hi*{A6}twg>*0GZkBpO`HAi3}M)%BY*6TYr!$el)myl5`l+?QqXHL!xc3^FN z_<+<+y+8J0>~G5V=te3;D4<OqSdq3-;ZNpN@KypTQy@|hVm2cc_U63>bVT$fXn~$j zx;}zb={w`YkQS92FY$_XKn4Zs0sW!IsQM!%ql|tc5>>vjLXe!1{5827DRny*E;Sk@ zv?a#^rH(O+5H1&fw>0TuHkz(l_wB5!=T0`?Ux)5|4I3}oA^S`G$gdLCl&$N}*xxSv zDE?s2xu^*62F0-Z_%iH}fCS6&8^4Qx%zb5DzTY(j$IBhPw<(G%?I2dHfm>JW_k01( z?&uMIh)T*VrWTQr8hZ%Lxky%CJJ;GjACRyZ1fntp6HzCzA7J<W>}qFM-Pcj^bH_J| z+hk>86)*#w_F2Arb;JL0cOhw*au{)t+3)4BC=l)tQa_e-cIqtQsFV2~HiWO;!OXQc zC6gSAJ_Oa2Z+4x~5p+brZ1GDNy!p?EX1kYjJ(`v;8a4MGtpgI^>+H7Z-Q6|cY5!N> zGIFYISV2VxEPh#pNRpAACxP5maV3u3qSS}fDI#^Dqhly6XBbP!s~8|rWi+X|MQy=R zpBvxa3SApvDb_-KI-Lxi5rP!><R;cp`Dvgd07ggE_~&^GDh0uTq+pt|fR13`RIR4- zjy@XH{ao#jS+f>eg#i%3fI}$PWOfnBwv<A1S0->N(heMYo=7Z&4)H(^5it7r_rU<_ z==ED0{*O0XN0dw;4?U7mL(K<Q)*G^Rg{gdq%>?V@0bRwU;YOt0n}i)qjX&~AEzn8% z^|U<`yG<l$f_)#Rqame<4j6tq7?&dIM`IbG@d-yK;9D?F+6S;vyc2zk+RFrz5~ZsN zCx*g%+PHR!Dt3+@cM3a`u^s=lJz!jEQAmIF=J??_jW~`{gMz&TgdJ)u7?&ywB;+aL zQR2RPBCONIsUfXIk6R8TM~7U`G4*H0VnT!h#v5G}0va@_igzBj|7D6s54uhyUAPd7 zr=x>;%ADmypp%L!geqlWlYBAj=s{R;&iR;g60~*Q8&VP}^8tr)(#GEVfZf&<gMvUY zBu)vWU9F3Ro>;btvlUwQAvz(MCWA~&j1Bh;!*Ta;?7csr@a|AvJbr(}{|OxRa{!QR zYj&&T@yl%ho$IO$_lm6Z_vNnxx#^xu9o2fFo(pcOUnv=!_MeSG1V-Riv$l)Qh9s5B zaODV9reKUGYH;!f(rM=C%Ttq;^J<eQkj;KA*pbPdf!KH|jO`}ugMNSWaa(CN$Ys$a zYxXl<T=9ybj-@#2A$$(-0}~0-u7iF_la{dnv;<_kErIF?=n8;T|8#PsbJ<Dol)fUZ z#w1ec7zIC!+gG2!j5UJL)SQvXX<nNocDqX@Tcw?#<eGfw=iDO@GKUC4_ceucdPpZ1 z*XJj9T4@#vZtt{zfpew0D*~vtk5>c>zzVisuB8u<@7pM~8XdS|hKn11QRsf^T!2$` zNU^AkZOIm{B3*eR$CfbOvS^a7;1*8BjSHS?eH%sae7NOaW?&wYrK4ICmq;e@Q{`ak zSYyg&>Ca%**}KaR6e5{3ZGTq+KbT#CgK-hN*@lG;I^(5|qc7Of(}LNw-@FTRl_tB= zF&dD=>zJe<pxFypD)@G~A?0HsMxyga!4Czfc5OGf%OUTeB5UTP?a#4xVvlt!lvqRl z!Q5V}m!bpI7DYPG!nEV&IHy4zxjckxuZJwgU*P=7_53e(N6|17KA_WnsAhltyRkI; zb#_{~Z*qovkKo==c8#=yIbXpsonLL>Ub7=n+D^49fi?=ukH6mZzl3_pKgYUa1+4kw z6e9%-HBM{}{UE7V?Clna_N9<eF*qkX`1mcHjQjP-Qx3UGn@RTI>2wJ8j~o-YLm7T& zE9xfZP$f=LEJlnI@j4*Zjyk+y1U%YFCGu@UFazxxzF3q#wVT}^L;v!U*OYm&iTvF} zJ;pSw@G9BVXeP5YnhQvy?G^=2g-RliD7q(uJqEgpq%u})k<?5Y#yPOF^y>*UgoKpa zUAe#};yfN3>2;!P*~cDtFB7KKG`D!55Zx&VO0W^v<+*TLH$RFmuoMa!%vO3T10VR& z<`fQL7|C>qpi^lB>vS46O;;64;WU;P<*L0hrT|N%-r?#@;8+;1quh~C4bLMAJCM(v zgd=H!!Sf$znJM0CsM%AVY9??6iO6p^dP*|?{@W2xZ~y)6h<okd0)ys7@!&;K)zlaP zg7p|qR>BJj$U;>#(La8&<2ApqCi!WWRF)YC3$15oNJs-JDW*^EDqRuX#0Bepc|W{b zgiDv##_NKO6tsOIIO^>qTG?$J0<fT{k!i2Cv8b@42C%Vb!3clASGm9<1P>c`%;l}k zq17Erw$-qlgrP0jF3k}LGxt5sih7CwF$QO2s#6n!RFOuHk&So<I8r#DgD@&P2E56t z0|Lf$YixX#rSS6nC%EU07ZWcYm9VR;$>c^})xu>dB3w!TXL^6<bH9!ja1xL7-}aEe zC<7$bR8Q%Kfax=%U4gF^I~^o5GC522Z%9uc8<_dyZlvU#h*d{L(Wz1O?pr4mK1a-> zxI-Y6LOG2v$jT+730<k(b5X3xtNjN5gAE`f)IUlz4n;N)?C4G$2&2bPC`{vupb@6@ z1OX_ex0VD*xRAmWrA`GA3^g=djlzg-wkiFaM+2!3Hr`95eq-6%?^+Db40r-y>o~>Q zbr98+mIJZ0N*orZ!`-4G23icggM%247*gj`3Ec}aNk-~Ns69cXn3Co50(<08yS9sh zlwKpF7dG0k$`KKMMs+Ym1@NZ(NpW2|#8W?HOR(#q=;f#=OwlVQ(ZeJTAw(X5`<}z> z#vORwEbhO!f&U>xdpCxG(>Ng$FkxZP6t<<bZo?g&y-635hb9wU3Q3Bq!$%&TXw{cG z3rzXNU}#B$+PmNIF8&<N$1?xmbOMOzjWEGvVWZA>8Uv%JJ=_@(Co+f(CE9lor+Ymk zt7wU!)WRwZa=H=)%VUV>B#R>tNN1H3Y*f;PkYp#My8|X<Fg|L!6*zIpiI_?4w5xq0 z2J8pvLcQ1`{i}}{?0g1dIx}E36mE7n(0xXac>_YUGqEqZ*<Vp;D2C&{loJoZDQa5B zYxB2Z!xWTqk;FOZ``J$efyBjV9z#j78puYtdu0i-KZ%&C^4bDnRBU!s8@v@8b0s5( zMM_E&L_|s@V^xGKvV&x6)mB(G!){CoeJ#R0&`c4be+VKb&Y*gP6uJoMDN2`OxRNHz zg-xf@mSIhkl8&AccVs;S<Jp-02HD3ZFuBkioJ9mU&zt(0)Q!?2I%GKHegZNJX{~9} zp3&|=Xv-8LCKV_wh)!{Yk0me(@Q`dSCarT&g>ygYCU!zx;YdAcJ1H>wuCrEO%z|BQ zOn!ow?1q~Q$yfgm$6+aX8tV*=3Z@1*PJ2QQ3h-lxQ7+2Qjd8{&4lCj;J7HEl*~*l2 zRFIIN0Bv1H+$xR<hN-5KPWO-X!*NE2Uo;xH`Xvzer&G%(H5okc1actsllaxuBN2vA zUD6(M2!}Kp1Rv4a*sulaA=}I1d6`IT({A&kWu&8Ky%2g3m#vOHV{?M+=;6k{aY~j{ z7DP6r#hkDYIxLr(Dq$AE6aV~iVpkTkW{(UVJ#DB16V!|On{Lx~U_v%_?-jx!g{E<^ z`Ac68!-h}5A|y92qox_cKN2j?oXEjXIE3V~eCT<GWQUpiiz-a=3;1;~hSYm#;9_5Z zijNh;XY;6rKOXMl86LO=@Ia>NrQ9qV?DAx{`h?`J(^#9s23(q{KI2G$oK7?3`e>V9 zEgg(qQK`u)AIYI(80`GO0d@n7NVLry1x+)A?Hx&)i!n17okg$-*gx~`n6eC+!6Ba( z=3}{G311X%y~>dIIY@|RGLXqKV^0enUN!JV1mwf}XpeV411+Xav{_VV8gBE@`K;q0 z0H>ad641HnM__oR@AF0heQ-F(QjcFoyti1Fs;%yzhqmD$G)3Sfdu+m1i$sQvgyxc3 zL}cZp+1Z4l(R6)1AuC1Q>y8;urpVG$AK#vu$q}&eccQo``QX|5#TOnQ#4$(mYEnZb zRh}e25**WDwnR@iIE=NiZ1vJ$*vwzZr`H6UHm&2P%H<HrxukL>*+d+-NT;IU)q3I~ z)OmWlG5=y1WgTCb%p~O!3&+Y3Z8I0bVneC2^m~17XK+3aY1fHG9-|a3WrJ-%9G1+X zMJCqb%?rDpHBFq8Zoq+slyoUf1o~0uSt9mTkf*<g>jR`UdJ-(YK|ML8Pf)VJ$zJc) zlR#+k=VByu7b&JM<GUzw98OFu`!NVfm?qkO>9RR@%o4vWJ9N!Z^0}LkWSvj%2<uJ) z1(4EYjWc<eW$+33g+6WtKRM`73=-hzKs=%!N|FJxdw3MMkd8VL>j`k|;bB;^Gpgy) z^vfj2(RETq%sRWEVlB_gx=1+gEVHv!wDhn`3!+XeLwJO+ks?VK@s(pbc=84+-@+pF z=$!N<NPhb?!*%=-8n>WDTEQENogyDx<@wpQ;?b_*N`7{#UFX@%@4k2{{^?2Cntpj$ zU$vw+$9E8RQ6GKNBCy`}zXJSeTJx|X7^tQgd7c%I^7(VrQM?T`XVZOCGf;}``%M(* zdl=#uw8&e~U55k3VKD_4p+*}`p-8&_fBo@wL>-T%UPJ;!X{EKb2@@7lFI^7GR>!&W zMk+r75ot3RlfbdfXo!C94rJvdK|rVNw{BTH+yCsiaQgGMD_XPeXxyaIFV)9zmv!-| zJk~F%9%-|L{zLo!d9~sH=z=y>9bmcr<r#~y0FW93O@FfazTRkLWo_kZSsS3)UcUS8 z#nUeywk+Gj1>M<~Pfpu7Ww*<fPFw5NpL^UgZs`E3y{Pwox1!8j8I`QTay|yt1~}!8 z6?hFu%0UJ9&;P=SYIbjm7|3mAyebrvK!W|;sHeR6_AjBiUCxTKl~Gn3`bU*lE{yCS z-C7(bHvR<^!B*koOBdm5b+x6ef?qB7vwbVE4C27-GW+wZ*To;|ruBj4!bhaa_P^UI ztqNu{FN-ypyOxaR=s}9XLJusu_gI1-X{l)@2v9p56{YOiH)3p$if^o%!?*lF@}6|a z)q@Dj8ZJh)ZfngdYMPP1a_f&x`v7k6(;%Lb`_8T*Cv2NffGz<Z@KUqlfj*=I2M+G5 zoNu{-?^?=cbs)pqdh6pyxXMm_TelzbeFv!m{P>gNIzQ@@Hsh`V%a31qWIJlf?gan* znM(`UfrYTE-w_OjUv3-v<D|Gxoz@Pb+=|6!NaDGU-~_iM`+@)v(}uvD3H<Uwc!e1T z2n9>Q%0N~zP)H>MY%y{hnT?@GsF%eH5S-fwz^05EwEkbH)|RYBmf4Pd>OD}R_xKQ- zSNUIF>+M0i+i}9sKPoUaRBTNf3?Y_+k=)xlyQ9B0J<kl%$CQc6;CBsJ<?Cc+5*~S~ zsgG1JtJbQ<u5nH@rA&|s9w?L}=)-HA1B{&>4RMqdtxASrZMaY<vQDHjJ_PKNas*MN zHY^%+2#c{c?F<l6N<w0R%e%4EcqZ@?FE)RJXG4r8It8%78@H7Rl5C@hw22bw#pAh% zR4m#<(TNE5C9+5&lL%usCxVtRRtnqVDUbnNIM#TrReCmS#OQ-&>_lC0QmhSN)turL zh{0ZPcp`DP`}$NqIGKH+yc`7}YOFF`JFwed{5v`T(%S`S$B@t)g?x}}s{Yo+XBfIc zLT<nKd(;04LsEiqGMLS3?TdQ>Hq=$sqZXDhUR?kMzg;|9uNd$(llK@M6%2y+$DG4E z(>#FwG_%|Pcr~ng^PdEv32Tbad~JVYSzS}M-zoU4yjO@MGW)sFQCPMwKt9V*+S7I` zSoZTcL~D4>Xm=WpfCZr;zyX(<3?`5MNzi)*u|c<_4D23q+xl$tXu`Yw-TDLLgu$1W zMVfr1I_0;*uQc=36NDd8ADBMPp6F3+Gl$HUfF_gsMT!jgeVC8EaM;cCfg9G-KN-w= z&GOBr?I`#21OZFZBzfv*lynCrZ@_}YFQH(dT#J!PC}p~;Lt%lIHo3*2h>z}KZRfJC zKp=#u+fTNFI4NyM>sopW3CbR2IYZ_fr9<RR6!~`LLW(hvg4hSytdmhr#@QItD|_lO zUfkof!AOPbJd5H4JPlf`*U*zfhig|i)9ed?KDvPGMn&PRR!#m{nM&WUcnn;Q*4|`C zUtB$X7sxp}g+JZ9I$lMs&&zA5$d5@PfcE)KU`nkSrMJkn5&-!^i(sB@_&;PDeD4XX zO>)GprkqqNYcF8=U%6nd8#Jo_7(2ezbnJz;br^&&MPf6It#EJs2iEv(euB`P{h@kW zAPgD|i#0O72#B6@TXB`lkJLqrZ@_Aj3cD(euS>BlQ#;{{QJVQ+=K+whD7QRzvoB=p zpk!cgv;6(G=3)Q^R-P^)>IMj)!r*g`g->1|f4}_{mL^_mzn1xP?WYw^Sfa4k3^;Va z@?XBJQPgR}@}@aSVcYt{Ah!+HeS<*J4LE3@vF6JAlFIA|77@3+|9{+ld85=c_wZN2 z1s(yH>7A{GnT}jV1@{e9D$>;*7f=zE&;IL4(q=zNn$Csy{bTN(PLq?f=j3Dq?v!N) zPyWjc{nss~3%a5w)mL*mthPLP3_ZyNPDyR@hvSTYj<rftDpO{+dtR*bPpII^MgB!! zqJt#Ue*6aX^_B^#!4?p!Uja`sya}ZYI`0uI^mpZjT!QWb5ZJmp_?76Nd1Or1+W}%d z`vSF6)3xP)b{YfH1CGKCSn$S(u=tXqAr)3%q7f|GjH_Ay@&>f#HcNkQyV&5u)RWsD zVN{%!bB{1_lXr~u2C+M=GU{~tE)Rwmy+e%0Q4plas#ak|04WwHt*XV?z+P&K{~Rft zuJ7Hu4*Ype`;TTtz<x#})e3?pSc;pKFfFuG&@(8a|14(E%OEEgA>H|bKU0lMJkHiB z%(PM4K|2Z;*tUW(@r5Ehl?owPv%28gp*lAoW@Wmass3n8=q8T}EEIUGx}4@mwt4@+ z2Q`ZbMML}8*MEjKcOhQT-{@wIu288=#3@#|QNU5|1nG5DOKRn_>kfTek`#DU*dXXI zY^+-rSI8w5^N@lL6((dSk_y%bgpScrut+l!*e?sR;W@P|w2>%AP`w5@3}!396q0vY zv9PNC(By<d#~h)m@w7S^Kh>IVV1}Z4q^`vkFT=8@1<cFeEyN`x$UqGneIU`bJrQIX zZ3G#)WnklzlybL&e`cq}J{mLFGNr@mRxD$2|B)n?$D1!vgjQxD(yqYww{vG}lCCt7 zJ$gynI^s1A>|kD$e#=F-YLTTO*n}woNUpSN)9SAivTBTul6|ted!<;p?jKfn>95Ud zNkv$7g_hWvKE7^&?*4lZ43;|jm=iA_)RB9*o5ku4COxT*8P{IC`jOr-8_H2U!W`rT z&_Pbcix3I=$W0qP42TPn*kvgpBuB7hqO9kn#;p#XwLNJIm7GOA=43$z>se2V|2dZl zPO-5N{g|OLDxl*P4n@ntTGj9;irF+^pX{B3NtyW*g^W}g?=|g{By*^}$+!5m7{#x% z6OMrcQe@Q9lau}jqo0h9e+LRZ&rX7uE4tvEsCdQ1NP;!j+`8#ao89?LJtd{7```^$ zrQvo_DD%_in6B*Kr7g{dkdyt_ul8Tou7J-+?w|FjRwRnO)58abdY<GWCoRZPYEYTw zY#@Sf*Jw<A952vRzcDl{Rte2+uYvOH=s(v`!?Q(IZzpikRk>O;gf@nLxK%~9K3_-u ztbbJE2EJojfh@)JoHfUwbNljeDE><WT&GV3I8>|+AD`;qn%V0Ge_-tzBn+BkDC`LQ z2wp%c+?2ha-O^=`UimNuvn<VD(!%vX>`?^em(WT|nC=)NaJqK!M9wQ~1$dC@#mO${ zWA{3d;+@X0Gw&Kimzt4t_y->|8$xo>m)&40n+^<y>|g@R{7)9>s?1^KCO>?ygK`N3 zmgK<D6zano<aD(Yf=#ksxm$b=zX)K)<<78n7f#|#*Lh1Z5y}mSWOV8%BVKrX@KX;c z3oCzy@~}u8&XY`h)+wrup^i{MQ(9A1kjb@Dz#%k8+Acp})O+faJnBM=!S>UFZU9M+ zuu@wkZKhG~Or31t2P_6g4H;~N;17O-s3QflVOeZ%22WUH2rKQHgfj%rZh)~{q8|(w zq{!;aica3pX2yrT^z-%iFXg(3Q1a|EAF~dc(3if3UeFC5$t9**^kM21+6uHPy(T-c zy;5Mh57<L)<SKWB?BPrkIIwvrgA7?Rgf-Xcgcw=2uzmxAo*7oyYQCeTvw(zJ{s4UV zp+~Qewd#c_&Z_^k^>y^ko)^%5P;0!^zo;+e^q+@ULSsdVpa}DJqU%{Ygcd{?(o3o7 zQA~!+a!`H&Z9Ra^LDNSZdr93yqK>HYQ<mwAqK?SlOth|`i4TM2MP;0#dYl0AXJYwr z+VItU%>ho=X_OF)+Rjdo6)BhBafQb)4C<<{;AKs=*AgJ&sUb*!JC4{?sLAF>)?__C z?3ACwq>$3xy=J={U+$G+5!0z0rY8j`hA-3jqT1xv2x``JG#b?g^wJZYv40pX=M(N0 zWRp(S?A|WOc5M=JRpo#E+vUC};GoaTEFy!q4Phs<gZ{^?VJ8^CL|L`X|J*DN;?`?& zAq>2(?i}{j1NM$1AQXgG_X~2+f4bIyREtOb@7)1LGUp*bA%TJXMfMp?u*ruVD5qVY z9?liy9ED^f=UCL%Bz85`oBfmf8n!oJ`P%0}n=TEikTe&8W%f5LU}weTrGAj8-RxjJ z-5m?cS@RJG!XCiIu;F61o+13G)30^h3>Ja4In#_n-G01aD$%x_a8FzD>+=!u-gp7p z#u@SNKY(jcm(slW(<1bUEjW7;5=_7fhnHqp_l@`sGX+q$V6h|2vdhbiAJSR$f&KOo zzKJ#Fp36=Tv_3Yte+dTi%cC59pjg(ZW0qMzQ2|j|H*oJxTjopvuRwD4bB(9s`7Y`D zN<mJr&@PRs1q7g>ru$0Yw#o#q{;Z}a{WT~sfn}TO>m5Cu0+20yf)~)da$)G!qjG7X zA9BR&im?+8xrB#`Tq+qvjgq*o%bT3>0rsfBgv4Mur042)p9gylh#nq67}E_gCViEa z{u8@CA>pR)Z?kSce)I6zN%uUPN2x`-XzTnlHTr4bWpe8PE6zVQhXOnd;X%Qda8_xy zIDFT)zWK&{z1itOJ$7dQ<R55<UwT_+fA?TA8L1oJ_FpUMj@vd{t~^3iNcF-p{c^oG z*O8h3E=;*}DwiMvBr_u$AN{%k__rn<mZEG2Oti<f&GujZ5diM#KdtEJkI37|wY+dM zVzw~xe!51_{h4)9&GDA=klW%qB9vH~e}J=Kh*0Raod4k65y3sPWp)qM+|Z~>p4HvZ zPJYnMEv#=#$%aHYv$i&AE$(`612j0n$vCD_nkQ2|Fc?l_#~@952|5Y=HY8}^v)%a3 zrz6up<lec4_Cf%bKkpqcU6A}+=A`9cd@=x_-?Vmk0apuSYNpx#@-bzOBq138mo10p z8wY!MfE68+_Z^;E_(vEH>MJajbIt@QuigVY0a<i(?FsmC*ijVbX5e7tW~~|&ETe?Q z1#tM6*Q$ZB{1N=DjLbiuyiaA;i|9Vb(9>2!ouj|oJx0{JdN{C@e)DksVJi9jZ#Shd z!+ndOb<G5XnF$<$PF6J2hur$JWN@ItU~B_{{27K>CpUwgWxxu?OVr;~wcTUG_y9KW z)v4$1zhOW}c%(uj*97-(vn{%P5F)dBG0wRv76C`2mX<Zj@*tI#l>4T;^ax5F07{aO z<>NfK`Qq#RPHA?!qR`TBFp_y$%O^_Eyc2wj>n};r)iwIU!wbc@xzdyxF)t`OrIjES zN*3=H%19o0fL<1Eil20(=e-A{sVnJJ0O22bfk8_*_L2>$wJWgdE^{;yzeA}BPN9p? zBfK1IJ#>hHwT@uJS_=`NZ-3NYC!irLB^w*s87Q0D7n+(jbPKL?JwkOg$g(<e9rhK~ z<vQC)Uc913UYOLtjrTv)8Nw1Zq=NM`u-<>M!B6>lAJPi?t%QDqi+V-!9~-im>u&}K zVp+&&)|<Sd30Ih0fhDs}#-wx*(P}p$nf<C(U-7fk9aa7}gS3&nZ*F$VmZ2C$LVa_p z`g6#GSF4+@U>`bWlFaqq2;w@M=7jA*oM<Yjml3cHg=E%mc=+iCv~rcAU3Xx3yd5(U zC?0BM8;eCjyBb6hh``n%%zE)Bc<rm>H)?UJj0G9}4yg%XA>6B#EkXa1<YhWwtSV0O zw=8|Vq!5HMF5>rW;ofpWFBPUTBaX7%90&*vasY4uc<JMw0~n!x{=7t*qW?S)^+J5^ z(+XllYeX<eqy1K-4JzH0SEKaHlZ*aTPgK}IwjWDBrDn#5=v0eEjF#5I5(2)t+TSV1 zx~)NB+Vm|(r>QsJzXLO_S5?oT4O<~dgUDf>4-S(g;5dSC)O~d$A0`!`u8;?LpUyJ1 z;&2iPX_D170ziLbiAWkUQv*xKJWM8AeaE2FfUd8$x~fKyhsOlkS6^EYsk%R88c~y; z*H0a-8OE98_*&Gixg=N@FG|M2>#;z=R{AKQq}YB5qd3d0<oM?<sQ=a2p_#;Du8FQ{ z4Vm(11}MK|%gzj7exY?>utFG-va~##naQ#b3UZ+zc}X9xN<WK3Bw!lc>o-+Bf&w83 z7h(3E5XB$V4k8ET$motAAOiN$W+yj1GH}iZdx}!V^(NeYu~UYSaMkB_XI3)2d)rci zDs65Tj`)D>e3d>Kj8!AvIDz=t!!ZhAu$L-iNmHT_5QzGY^%NbItlE00_F<$U(xR_$ zo5%Jzsc4f$JI&5=XRn8(gXUR6wdpihxb7mySAGs3IaNvh`d*Zu;m~z1sBGsA?iJcZ zEu6zgpn4fdxxXu#OMG9_&69(&!6ibZgV7v}0j#g4ElDcRbR4C`jC4)slv3e3Z6qCw zrbh4oR*+a3pY;~{mk<A>=|#D}m4W_Dt7blzLZg%>*_-`S%D*v07xXaHa%;BybaA_{ zv4jbzo=vc+BUz|B?%^7OY;pNOQ?yxi4c34qR~XjDnJ<X3e}<HEPJ<Y@+^}+<<z09U zBJ3O9oeQ7)@f5ko%YEkZSQ5bSYLXg$ORX?nULC&yliz+k)T7_*)+`LO`hiqk=PE%# zQ`UwV3(k5=XfDbHzBebiIwU14Bth<`{W|i8j5&b?`|%sV;6JONK|s||EOHH)KcmcQ zh4RYvQF$o<lW6{(uCN-_iazYWhd}tBtMs4bFz~K`)sxz@YLY~t%P0|UpuNV3(X8wH zWYnc`-})~)vxSi>860#!P+eOMgd2<4D9rlQ!`4341F1E+{h0KQON*akf>sFerv{IZ zEdF6`8M@_mqbZ7klX5?ky!^P(#^3jMe}u{$mU+Oj(Y3yoUmBjm_PEtSW3*xIS57x~ zWy_25#jz#p*iN(^S;IGRu{2qN(*IrqlWJH#mR&l0LPyU1Z_=XUjB<g5D6plwDec`B zxl9yv&hlPjR^5{I7On`bT&{=K9o(KBpzAX<800+^1g5YE=0L%#Hr*A6LVB@8bi}X_ zq^n-{=%hWlE#c}3W4eTRYt(o6mp5SN0wz^HbLGRawGIIN5pa?3uf}#2javcz_g?|Z zO<z{a-wX4$Y>j;G`u{HI79ovm8W`)Q@9gAV7*Lov>5~b#M#WLC3~Cz0`dBS<ed_Kt z=<fF8H;a1IkFG)IQto&efkl?NBah`Bl89joQB_`(A`f8z_jU1*{Rms6(^9*M+H*;< zsuc_k-VlruJDHrkS-nP;Axc~km3su7%JjuI_P#z=v*5lBI8`_So#qb{m?A-vU%pOH z?yF5J5z&q_lsbQELis2_7O9za?4e}=VG0UbTJFV%39f!t=Y%p@cqz;fKP<>KGO`pH zk<--XOzj{*)zyzD6G9}77M``+F$&Y#7oe!b%1;0`ss)t9jByfqn3w_p`s=Plj$M6p z{sw5F9V{BPJsrR8U)ZCU3bHI%NDSGQ0WyCM=CFgNS^Fl`LD*kL_gISN9;?4KbTXVk zNq<B1)wAE3QIj!SwqtA3Y40cpJr|}TGghyeySNlwd#R7d$ADS0okh)6fju}i3Zmco zYiDThyWb0vZeRQYTxD5Da_~};52rt83<ep2ScahQ6y#v%;WTSGT?q-hj*)2y#?=p* ze*_?FGtcbhO?i-n3c6}tai>dXrDmdVL~#m&q@v-Oxd^3JV`>IF<Cz_5xi+>vqphxp z4`x2a#ag$2g=LmkBo_hu0_!RB?y;yz=9R7KvacG}3h)OC34Q6`Ol)#0s--gpMy7+d zRM+rzKkBCi9bT|?c(DvQD$V{hLN7=*8&7c`XGil4Cg>?$)8cDU?$f=Zy@4}TG`ns{ z%?{Y|0)0$I4*NIxL;o9Y07A<?OX-};Bx7eCS*Ake53DgbvBv=xna%3S7#|j&^e;A7 z$8QEb!C{W^j#D+T$Vfn?qeo*_`Uz>M%5prEcIH*V5j&HU!BBUR;w(Q($`io}I1Ft_ zdozy5%OKvW8meiFw*oj*MHWtfK~J+Fv+Yr1Q~7;LcM5i<b#+<xYhMJ8&wy23i`ved zjGQvJ%%7)sFDgg|9HikE6gfAzF?9v(ji0Wd-3@Oe2xd?lXyH(q+L;o?Bm`{tGGG$g zk53d{93DAX;u3m@Y}=2TYqH|gG?#~|WlK(TeB%JS??{S(9W&ByZ(lx0X&hLpvo7dz zoi2Iw1h!}ZrZA9O6~>jD@-W@;-s!C`-2e8fI-R*?=Xm*C@9Y_-2?0sk3QoIk-q4N1 zil3wz7Qad@8mi(b{zI4QnipEupIFEYP}EoM{&Y12R8pSrA4;~4da=Ck=`Uylti|Bi zM*^U}9096zCgN&jkh#SGPiBIHF+Lp22(0|Eu!}(igLel8T?jBt8Raiv;Ulb=ujsd{ z5`1ysfa`!n*F<($tFfl9N=VF)`5cyIC*9eOpK46hD9%D=)jpv`Fl8Z#<7o#Mw=DET zl(Bd}6LJoXfV11^s#!y?1N%KXNXc8$9H;qpdImmmys)1$P5-8)$w@jaZEWH-*-El{ z%P$ac1{Px+0QH}H&ji+)K5$9hx_(XmYyfFMmcNHhKPFPfm(Ix9dbXuZ>lmr9A4+<J zbWO%Rb9;I;rGr{0T2odPIomF1)Wl)O1e@>!e(I6e3e`9lJlGS^F8{hJGR-GVtr#O( z*<|Nbf)iWUu%S}D8X{l2j#!|(LXCXGGKGVGf;2!{n6@J*Lnc9&KcYJ^dTaZMZskuq zbz=f(Nxg;a;~R$+?4`RVTzgCQ6r8}$I&$u3+8NG%)OOZ2HQZ@a!vPAzS7yA5msF`p zx*rR&Ay7OF>>}MDQ85Ps_cN0tKgro>C$v+k6K!+HZw1Nv*6Uow!llCG;wW<U4$Mw% zK76zPx!$C7#;<Db{9Di+utDZN@<bXSj<7sbT&_b~fw{gc-8r`v@;cTQLqAp_hmB%I zUL$b)y(c^`U_o&Iu)HeTA+81L$M<fWgiRCo=5haDqL%9Q1d^r6hI&GG++=HM*G_r@ z=cljKUJ1$8-7e_eP%Fvzz*a4|)1+-Rj{ZvFwrmG9q!|fgEbB@bn5%Yx;XMW1s<0S# zVYlDGc4;z64$E7*-(i>Dp3cI<fosDXRJm05(rhmeJZb5#E!pKcKFG%CKdowkCjA`3 zkYg{s4N4V~J@OqS*i0FMlZ>fmtpBiZ6lWqY_F~SCW^sj1QH&#}H*ap{uh&;|$;JeA z{p3FMG|qVQL)wiQake}d+`8o@@i|XmM+7-MG$AiuSMGhI0RXvv9<F0av-2+rJvZ4% zzkpyNYY%KTp?Mi9rPp6q{TZM`0Kv{s*nJPHrpS)|78ZwnbgnQSe2vNis_p(O*x8D4 zdy7=)4<R;tZYP=h<Ke1+Xk{KD#etQ;SYJB9GFs_Bvm9myz$$1O|0l!OD2wU%c{VRL z0G({p4G$+Y1}_r?2@6oHkzlSO=HNlo+3O?*M&>Ym(9pL+6F4!RNz#O9i0VvAk{5z4 zkQ%O53E(g#+&ve<i;-B}eV`HR8p!zv1;a^+4I3PxI|7g+WS)F|5jbO>r1PIxb`A96 zvJm~BcJ+#;U5{v=M6OG~8)N|JzhF(k-p>#i9W^mDiLoM|)JkRh1VRMJ{chfWRpq5e zxH$<!Ow>{Q4b9rA@6*+9j2-^EIk&<b4?a0N3?f5v`-!U_S$MZ(M5Dv$WK9Rr1gzkl zo_n3uwxzf10Wq9-_m~|*X5a~&L`jl`4H{%a)9dRtFmF7%YU;>&g|Ps}Qf(4I%Pd0H z>m<|6lDqV4yDQTIDU?U*hvDJjFN3Xy9VpXec2Xo%r=x;v1${XKMO<e7Fa^|{qV0d) ziG1_uDxx~EN!$k{)x$xo+^}o?RAEydX}?Xgl%QT&@KEPI9r#ASX{GP6+0AYK2OYSV zmFn=cIhN+j9FAUK`=(3N6bFAv>!5{$rp-JPqY!68zJ}ap-`=Fy8(R++#R}Rv><W73 z``Q9lniz_T(0GH8s_xj)TtpkkXIarh$Q7W|Z>By)(tr`V>?$w-!OkEUDY1?x$tFv* z(uTqapjB!>l#>L5YZl5MKVK50us-}m!KkRqjG87RPr1*bD?uy@w&XdZmN|Giod6df zQ4I|n^O)ru#M>zjOrw8GOE%^H=6A2F%ru4WlO0r)xkoU@8xvI+YQiO;M^9Me0~G0{ zbeN!7i)l5Vm?T!&gBb0p86I=gj5M`1_}Rmv)j-Vteh!YocC<CSt`%0Jz*TVoxuC1A z8q(1X0yP;BAy(>lp#Xze)fZvsrHLCFCbW?qZy9A~=ttt(jQJ(khteO!iBK({HJOM9 z>vqT9t_M5k5w6lVA3N>j<Qv1@a@?F=0d9r`Rdh!dhK#iaY{RltaH}wXV9ro{*=?>| zo6rlVTXsl?jxAgrzOuk{X_xlC$8IMgNq&&ldyj~?x>!@9e_DKEN%46!D6!tj9GPmh zfb;MwQ4okQX|Ww9Hm;laxF<%%XE(qYw;MFig;rKy!g}#^{pN1`7HTNyx+~A*v#rjs zvXZXH$jay5I{XXXmK^QOzY#H?9$@$S>K9ms*}*N-6)d(`fB%+tlfjZoKFg$KWH42^ z=vX}oA;`BkOE`bEzFm-Il38ZjhFUHD-m&$nkeKqhvd$$+lIpM7f)Q|Y*-Jj>xoTkw zMGgLW#9*8PUfZM<JG$<uB_}w66UmIlywS7c;V}}>NDQ(+AK67^gzY>H@(Xc-M9B*( z9Q#olLq#7pYMnD4j6ypUxToyru##D2>%zN)&;>$0wk#b^Fd`G3b2QF@SsW;A0a(!^ zsH*n#!#`&jg2<m!Sb{V290|n}oIlLw7>ytr>D`F<tQi+qeK_5%UH`GO2W@7&ERjT^ zU)Z6lgscJ>hNj6Q7|bnMCnwkZvS2${v}%((#vo>T47;4;jS%PQ&{wM+oMFDfuGVt9 zCO<IQj&&56{=us7%Aiy7^P6xE=3hJd55?RRw@A7!ty+Uj#L5ov)T9v%7Z;5oC#p$! zOxJhQ3TPgdj}NAivw!r!$d}kS+JBIR?C&x8Clan6=%Fld^>%32$|SK<i83gl;Po6s zXcPk#-C2A7GjuD@SmXZ4dFZU56=shyVXz~A-k{q!$e7u4;1Wt<X#Hb^!Lv%`*ec~5 zEl;N|big(db-WmN;bSZ&qH;PRixwr%vzD(@-V>7*Cc~L^1pZV<*w2m;95su9V&<Ft zn_1!IBms{_ED@<WT6V3l3za|7cAg{tfE~kK`fo%rKb+?0`seB`;bLBT5<vQ-P{)%# zOAJ?ZBnnH-$-0E`dFMg%iXIX`3iAgKFEMejXgUH#9NWWg>4x0Qmn-aPm)~C!Zi0lv z_D&eT8gdf;tK@RykMjfFstuFsS(&rh0d2bA2YLZPx;)&y3v)ojuFuU!aNvX_oBpBh z%JbR|(c$SkYA@+F|BN1TTbmZj!(ni+<e=Q_?p^PHGR?UOthhr<ca4z`RK&2Hx!UIc z^^Mf8!9+*L?&^lE0l-Bv#g!huDd>&S+gv39c4;k6_E2~E6D&B;H{_dk=r14l-`bq2 zOI_1E2M{@^Pyh1sf}BA}RI(l)c0NBJ*&|M$L7TmC&H%Nf!Vr5lEaC!fho=#m`HaHv z9DDfGkNu|fFX5i@g5HQ%-=zaXqEU-AJ;sv0DIAM3%>Er_?H0c=Bx~BOKprsj6nJ%V z3o7qErmHwIvdA?CV33A|s^@_1_|0rW_~)k`uSu?)@1~@kXF=ucKP1utu?~yD>Q9-} z!>rjMSU6e@Tsb+YsQ&tWL4P*Gk;FUk!C?A$TuJd(VFvZ)CWKr}7}+HwV0HzB#s9kv zXJ&XrH}dD=E5JdMs|ry!ffJ*Jvrq&BWAX~q^}!Mdmp6&&amNXJjLCudQ3+I6%&O7K zz3weI5*KnqdvXjwLCy`X>hVF{wPX={XezORE+T_D6!y(rjTf`L@pN39p9aDlMjR@G z*pEbpgyyVy6$V)t?^F=>f<vt7x83>kjMKiSJ+a|rXR+Dl1Wv`?AS0%J=(&L9It%8a z#W0wx-h}{Ozm!~p@d1r}Q+A_q4W6ww1y!N5YY=Rct9YuN_%O{<QD8?+H%l$sUrxXT zg*;plViX^L>4NOXZIrvxO9`#u=m#S>j)v^Np(On#(Xsm-#>@RLYiEc0<By>IJNgg6 zDds_f{Dgsu(7T`Dc%>Sq!b>=Cmax-vohr<iZP}O}0PqLOD40#C2WnwcZ@Z)i{1vPW zL48f5xf%{WB$r$)E&Qn$=U|*HECzfJj#q*-*na$GCb`ZkcJp?qX$Xa-Hh9x+7)|w6 zUue7U8J%rScrb@Yk=$YE%AhAxjerpeBj*HnTc&V}&pw%<SM@~-6NSpJpf)`Vn>?Yn z7TI8gXpKc3Y{f!AAA{s$vQebXr4^oRR7PWuhc|rym2B)L<>MJ$rwBnZ6HdKt7IMPy z?f&Q0?tqbqF58Z^Onb9?dT<hLj|78_es0J3#>2E#p>dcJ4E}SSeGkX-8Fa)8ov#b% zc(eU~B?lhrZtM+l<U(P($~*ZID%0sAiq@uWJxGv#bM?3I{)GLQdGOXwnzMiQW+#_) zQoYGrV-FsyhAaX_CBYg+aW|{9Q+?3dE?Q8eJ=?%DW}DBLmu%ov-Qgs-fS}>V>A*Sq zO{?&v2iFlq$8RP?c`@r7Gkq27a$rVlJnEY~>u1!3q9Wz#lIKa(JQ-2^W5La{HBAa; z8uYggoI~>f6ZJm!gX;K{-V~jdCG&jcK<D@%f^n~^;S$qf2n|T<OE+}&q{q<K{h5Ap zkHDx~bkIp0NV%c=$tu&mg!sMi{N;}nG>zNf)tUjc%)u%*2(&PuN)BvZ__qgF_1Rna zz{&F)C<c=d?dEw4xWm4BAiZjm%O{6%(iz0j)K}C!b*5=?(t7&~Jwdi==r^Zp{qRE1 z)e|X#EyN2Ba;h;fx7~QzC&xhDrw@^5nxGS?TF($n4^<Y}Te(>5#Rs48hqu;KyZs2H zVA%a2HDGUjo_Gs&mcyMoVq9+-SQuW0`rTRS4vRuY4GdPt7!GSZGH9b|(Fs}Ok>ue_ znMHLMY-qX&4zrFdas;>(KUgh2f<55_p|<&fpz(Y`?&s{=6upCq`5vP$R69_U2%<e8 z8#<B)B{{8uqIWfj&^^J!KPxsjTVLa;O;LQ|4{BF1cT1tl5+pvk@?!9HdokDuBK1ty zrb+sOplPv6b8Izl$YIyZm^Ooby$vaA1tj|4(CD_;FUOJya$@a@Q-u!Kc;UTXGmPgq zHiRhpZ<-JVRQrCbYX($aDCp9nWIu9&N3j#pSNM544j4|^(%{9=j=|ccb~PbZS3G-C zNi?jQ+JHv@B-M1O1Hv+c1clOkGz9~47=Y_bMa`EQ_=_D_-_p%D3!s!gu<;D`GKky$ zIGKUNG%?(qwa^Jv>=Rf8iv!GPes_cDHKbRzjIQZcW6^*S0h8`z?-K;Vo3%ia9lOI< z@z#SRd+d)u%A6c>2~N@}{@~I7OWboc>*B6Ny}!OhnVToay-*u%35rqsGVnK6#{`xu zN<Lj-P%$10Vd?%xr45T%qKwt(CysCPLFy^dtvYbYpU&qUjw*b#G1b)wcH)XP71o^T zn%AH%TBXqrY=+=qCJmYBh-Yo)OeKtTh%t&7)ice?-5_qxB>o^XQT<Fn5^iQbqrd`a z^6u+m1&z8?GzNDm^Q>`8v_6X?JNv4$sMTQT`Zf8(XN_Ka9p-~gXKc3Oq##MQ-7n}x zvvaH^3Q>BwFzm&J7t8(lP5xO2(6T)}sVVUg`xzLsS9!!+HS=s%te&d37FZy^lH7<z zTvBdvRwX<3r|QiEPEuH~104ACl>G3(!{@&){D!Zx$Z0iG4j$#H1qfcrh^rm)KCmB} zQ5|JE40t=e$;3@{mTFQXu`>!&9gi2Lu4;2q^8ec>OaL*QL|xESJ>b^i=?~NoZs1SD z^+)x^Rzr)$3iU^UNIq2#%|Q6fE@W&0bH8@IoneF+1w5=VOD7hH13u-6t7?>X$f`Hp zDOkf$6V4`gcgBetsWD$BsCGJ!=Q5j1q+G47dj*}SI^y1H&e$X<mlLMx*!w-gzFCAN zqY}fh5uKmu%r{x+8?^AI+rqA5<2XXP=WRjL5v69VsK%fNCz!`Bs+<^t=w52m5NJdg z#U7SuB@avzl>zo~U79lSs!iK5F1K$FsskrPWH02We={Mq?20|2V}KXz(X0#%`~Bq+ zGW{AmlNnOjqj8~#`PHl$764Y$BUxy_vF$n6^LDY`Z(k<=)Y|mt<Ak=Rmi7S+a^CSy zhgXk*XSL-3a88CsA?Tq`p86AxM(AfUPBF?DkyZ?EeGV(u;?{<(J|qFg_+atZcIp^4 zmU$6D9S2t+J?!!7F%k-8NC3?fbX<$mPUtKGD8e&iN%597gQ~j8G&<%N`rpjD6$<HW zyg-aFwAWml(16dKVm2|vETCx$h<KstV51Eq%n42BhpC;>EJXRD@(iTS?04OwvFn(( z$2#`Mo3;Qo#B=>~5gu!2Gddo;V~&bS3^2|#Zt?@@3|%nxhtJy0I}DhE=DD<bva1nY z%dEa{vVcQBLDBV`Q3BR$OzT|rpieX7r!)5S2N5xzp2aYXu#TYE2*Y&=93}l=uQ0(| zPYMo$<Q6_UIff?3cVt!@jet2<Y(8@a^9<w>`#Jl8d5G-hQ8Vpzy8iV!ZNuLDUSY1W z-E=M-Gh))(vP4j^c?vg0vH1^mjc!#wVe4lB?=E{zyS{}yhzI{9Cx-=HkWA{a(|)A$ zw$=9G@|`66=M1K#+w7y_zA!g__z~vzye8kXFNUJzYw+;&gMyqSyjbSE(OEa6Qra+X zhS!*v|0Wi=ATZoy<(|kv0agf`{9zJ?dW<!3qJg@RMDn17pvRM!FLgnRIt!4nMv@=; zFQx;z=2hso3VKfNO3F92)2Xysr~pqjT9bm<nt!UR=tDo~%~WTvxR#eQtfX_fVcj42 zyUz(Oe*;&%E#d0Bsx-3Ave~D9s5eVu4cGeLH+>;ETEC$u`N_@vMz0F!n~|=_7K4Pg z>EKM{DPcINx{m@ewMo1jnw5rQdYeZ+OPl5=&xZaHIXFX;9v~+0%24GQQmAONxI*of zte6VTVn!oHb)1&0;5H9(E)2PU60U1qsN)Z~NgURMEn3Ar^nR%sY8VD2`dH@Qg6y7b z;55`NTz68j+A@Ogtf391KYjS&L!U5lNk@7K?7!s?^d;Oh0v>MxhtKi{b7zM4*`Cc% zN~USbS+t48B0a;^hJB(L0ZXIE{J;h=LvO*}tXYjb^v|o6cp(Q1;5h8{LBmt$=8Sho zT(m~!rq)ZmL4{|n9Hm&kT%Cd$vmLj8Js!axi>7DgCb|mT1<9_+Hpf<OpW}MY9uO-H z;+q7!UVc@u8w34R!y5-bFNgJavn~8KtFP$K5NM;atAJGHpWIzV6%LX^l%`U&!fQm? zovX09e>zTBV|9D}VWf|wXWc2pIKc=1LB05V)`>9TSaB|<nI3GL&|e4fFGi}E8Ca&N zI439f-Ug5ErB@Tea`VsOS{pu0m?ySIbWb`2Da4VeFx@hDG~jX-?y<T5Al{3u(>lZ` zK}qQXZ=E~h0L(~wRF5!y^lsPUfbm8Ui-J5yFkw-AoQ}&ZEC>*Wrpa&!>x$qqe)H*4 zt<~g7iY44(_P_)%sI|%1$i*&D84!DhJm!$g)T4Y3aAv#%yts%1W29EcPYi9>zZAm@ zm@e&%V!@C=8G#UHhY`qJn{G+fCbov@2BOCLCs<Ve0<eMhhrv7WkzP}L=g&hCsk3C$ zkqmSuuzqGa#gu2VtcftEDxf!irb<Ud&DFfG*R^^TUoK4Zonh!t<fQuH-cRuhlN2R{ zydb9$q~lXnQe6x&LzECTKJ>SNxp0`R!=8&2%)EVVkc;(${<*zm>i6gkpm3-!i34Ub z@2On)gT66LkQd~pV7RGp%+;UJ<5@BQlXb8fK!{)Zm)T|rmEdO9NuDS6gC=u1&ISTh zNI`{TKT>1UD^uhoU~r}joQmX=fjL_;j?L4f5*MUB@=Nb+>!Az^%HBm$i^}<F%N13B z{%krbJP`8$b(e1!KSKwJ$}vh~1jy<YIJ7T7b;G4qQL@lFC+LNZr`Dqf)%%x}KX7|p zRgk5(RWm+l?0C2T(<7SbN2HE#d}x<i`--Z1=78ymq3gpb2*UWRKc0*}BWh+6`%GYF z0_$1LqIXB){Qp~EpS6!&r0Pdq#JKsxy+ZzY*v+K=p6c#HJI2Xs@zw8I=X+)vh6Dgl zm%%}(9!WR+4ZzXNjH^@qahgc#kvfkc?Be=sZ|NgqIeO1wG5in!$?8)};>Nab>+N@7 z@RQU27p@kAYmocG|NDgeei8mYah-YW`jo34TB4n%Qm6f^7G9f^Vo&$;0c@B9mhQ)I z!6PIqj59*jRTUxSXsF8ze|sB(gSmC(@T7Qx_dJTocr}#{$c|RO2H~}*c9AZAH8ss_ zvTvvC?S8SzM+2j!2WzwbY%$Mi;uU<!Z7}Iyq!bok29`hUIkW+saqrZ#tApL4uvd%k z5-VXJSocKT;}wc*($MsEL(}Z%`d>0L*`b+_GAoGdOtQWBFnc!V)A}b9LSoJkm<b1- z149E(0=7W!e>S+fpxLGA{9$79AS{4Tw}2&t{iW~HCY+BW|5bnjHdGk1k`ve(!xGau zFNsQ?(yU_$+G6vlDZ5yu2*-dM$|3zFXNG+htjaK<jzUhr0zr%U&c?X_XAva?OFMyX zLvBD~utg)CV*rMVFNwa6%hx@4O2BR40UgrhHvBbUhQtsm?LhW>Ie>5uPUu8kA9+yM z{URf->G|hu?%qp4V_^+11xyFmg_J+a4o)h=K{+spV2*biX9DKTnhjz8OzJR`76oEs zBs2&HM@2Dh2HMnzm>Tu2J(o(TZ=N~=QHnGj4KzV8Q7JH@VGmBW_|fFFeUveXYqOiz zk=@s<>q?%AUOw9#pWv+gMaCd?G=LzaOa*J<q9>QmsJERgGf$Qw#^4|NaF=3z8Ja^3 zv&(18AS?!8337Y_q4~5Z66{Q(j{RucPW$f-yfY1uBP9E*1fWkh+?~l79AKs7c(?iz zP7sHq8Pkd--f4kT^(1HE{N}%lM``!oVLZIKgNeE}6%KjsN1Jf0<M;jVeY4FbzYFs? z=KurxZO?xQrIZ0M|7-$iXi;9@4d`zg`i4DduF;7$D{!ml&9Zn{%)e?H@!K9ejqv&- z!#QsxmZ>!YSP1cR+Q<+4XblPFRUBtsN6&W4*IL$2|IH%}DO;%c5>HHBD#!)4rD$!K zs{7iHr+)ZpUl2(iR~Ki{C2fe05g%0h%juUz{oGzJh9V$~_w$Q{!EUy&)|~9P_c{S6 zX5^?>{ofZb!<*C7amiFKIPlGZ{=l&U|J(fyygwA=2+O)}AgvE@0w!FDyf%KLP`Imy zTWh)#u)&<3oC$urtX->{)t4zu%Wgjhsvkm;*NzdZQ^<R<0biudp!|@ml8=kusi01& z02;8S<nuEK!~*;q<IYI7)8UL2rnAN=pCEdSN~8gGX@Qs24a}-bFcSEU2;9(-hxMLg z6a08ufcfx&hBSRn+Am)dH+mM^0f_)5hzdP=)Jzk=i<3v-4#7#31oz9=dwZB&n|uTv ztZxC+fG)lABG=#gtm@*=KR0?}29oKwN%_>$2Ja8MK4D1_=^CWDrLtzXx}^D^@9T%V zh#e03VLL3f$*)1+(y8N(W^?XifO7uE%Bj)+)T{m72mQC!V6Gv6^v_V6e%mWV%NX}m zCly&btWLKV>c-1Gh8TDaw=A48>mMc`xQTCW5_O1em)<<;YYtmAYJEqEQv8)sPZ zavu_u>7M@cF<Vvv4&KhzUTB_&<GbH0q->0Td$#sT6w|E!2wjg_cZ>JT?ZTV003h4q z%NaIJO9h#f+k;&psl_!F?8v^lKTS=_W{=D5;}An<(=@;C_cVxv32>zyK=I9AA*{^l zKj8=EUK9X?Hg4_-tCCq$mWvNF6xP@dlybRndK^~FSwjmaP$7HU?oT*B_MxRsOyoe! zI%;9Oing6B13IV(8Lm?S!aX9T34r{e#SDaLMLQ};q7=eK0-_1R`j8s3WF>Ns09C1) zfFtdE44gM#i#GIwZTi9C{AE@Swi+)MA0A-2?e`lP)Aj7Am!w%~l-O5qp^wp+W8g~F zTsg>|R^5Bs7YO!Ihu7ZPTdQWP8*h2GVk&B)V8WU)&L#ZH@17Ko;6P_1Mc$4wW0L_k z!k?g6K9tWG#;y+oVEWk%(Ai=zO2H`Dq%v8>G?c@|rT#q47&#@lyyJO=9yc*U3(&-1 zHE_}zVHOr-f*foB0Ta~@@oX_74%U%rl9&}@FfZL5jGzCXQORc4kI;|X5l!Ps><8~- zkpN^`=QJ(sKx0WE8tiD)*i=I3b{ht6zoQ`}9Q6gs<p!eQGCQ|X<3~s?ES6U#J^_%v zUY1=6PC6+fW?-P?b(rwK=@T09IwBs&UH5f??nz5lniR%2g<;%6iQ0>_;q6SVVE*|i z06Z!nL-=TX{Us$y#=zKMO|+DW)vow9oLUoJV3ZTLFv;)&wZ#C~V%Hv~Y-3miR-Q_J zJf(Nnmbxj(wUt^`7rV5k0;~cPm{Dm%iT2X`In3B18wWYFnN$SG34S1GKGDslDVh?) zfw@?MMJ$;1&hJ8I6u$>;UbIFSSukINlrEa3bMzGx#1v*nz9_2$2*{ML@DSXe=74$Y z`D`-KGLB!tTP&;t-lNffELXj{N2&#?N<=Ipng0{cg(FHjiZ|jg5RJi(I|7=2RN@)$ z8c<n(#pbfqH(8avYs!-JKT`~y1uPKl1)LRvo0LWO7A&*?0M+`YPj5Rv0mp|3q_Lje zk4Rp@^v1$%EteU^Q1$0_^Ah*Tvay6Biz|dHS0Al^mJ0p=W>?X4n*g8SUy#O4M|qIh z^xdtqayXhE8-0_l;EZ*0c7fYavYW9N3e#MSugmo(FIv8_pI`)L^IMVx*@L<~g5eb3 z)!DH2?cKEye-?x!YH0v5rLmyY&HQ15HYdzv85Md2`K@R(oEj?mw-D!trzq!<aC15g zXY;l=OHN|X)&&^>c={QQ*r>6yDOd^cNQhbATU_Bl=5mq2g7plS{JU=776X_VUc&;x zK*g!^N~{@z_POjKJjQled}K%#!xZIHz{#_<yoR=~*lkEUf-Xr<vJc1(MY`&`NnmFL zxo9VSa$w7?s=feO``W<v^e5_uM`1f;R<q3`i{z{R$I7_dk)o0=Vei9X^Z@{M`TGNa z*T9Z;*gh*Qv>0|tuD(xsS=heScJCc-eM|Od{!1@B>l;}lY-=b}$)Pq}9ke86`BIJd z-dQ<U?%NmY*C+3jz4{#9gC0osgW89nYfKQIM)?LzriTVB=mPK-@|evjXoJt;6A5eq zAtl*2vjXvAmN&Fo3L8>e{n+wf7VH26`DfTXyCh6%C>7;e<wn}SskiLVg9KLGte0Uz z0SL{OphdTZ5-sVguD><a6(Dof-1kf+#}^ygJ=He*3a`q(-8MV?+BeX(U~nYUeCMEY z;{2C=`9x#T3XJ8kpBsw(w6Gm&c`hHn74Eb=NTz9FJ5klxaiwoG-4QDUxx=%~$usO{ zA}^;mX?Lr~+9CQI;@<9?I*@HmEv0HX)LY*V|13=-D66iDH4R1KUdYl%Dq<xRd)H^+ z2i=jEY>DEH7N@D{;_H9*^q+Yoq=B#A_-Fsy1uxW8Sjpy9Qm@@y{l^f{3jF!$)*zvg zplQlEnXT4}XiOe8j+86=i_FD#6bUCZtpNL>+a@-j*1yTc0s*sb*n6!qs3BDHRL5Z5 z7n&ZLq6WZTQ#$ReGd8IBDFIvvmkg+h<2*#1z3nkMQY*xf4rH-Lq04@`w+b@zsyqk# z=HvvP1;^0-Eo$Yr+L*t)G-+56YD}F?*60y?1Sp(`CAmp6C@^7@UUqbZ35mtYIa3V{ ztIAq~2Ib28L!mmM+bf$T3thL}zx(l<MI~9W>aodvp?vXdA;{&`{g*xjAp~vPe+{0h zEq=duj+`y9u{3zx4{dpmAs|z<{*=k5$6I5u0h+mX48frg8B*q-c~!l@3B)mmPTV0? zMeZ6{V~s)k%qK&_@djW)1ReVj*)WoZAzryHiYtdNfXYUCA>}CGOWIzMPko?Sn zP`dvauCrWydJwmAWShU_EzrP*#h(Q^Y_F<6xJ~mJ#+j`i+@gL#?hwQZi2pjd(ifvC zn;y@!FI(?!6!bJG7(`b6aG`=7%1d>^2nd6n+kFL>mH%CkVRE|MkKYW4!IfX+EGy-< zM68b5E=P)@ZhybCH|U_v^}%t#s0qSeeQBpA2n+&Nf7v8gUNH0%Qk|g;R{{qHG8aOm ze+*ju**u-C{K3$}#S*P~U$AC4uV<OR2uBf^nsuE~BfLBhnOis~2ol|p|7|ob!k)G@ zOS-O1EFE9Y)PuL5^v%PmGPO7^a5V!5F;v?Z@N)ygu@y*HAyYg}wv4e${zxz%!?9f) zHC&PB6v<KLE09ssL!_v1<6A-)q_h-F!!#WX;47R`m3Vn9e`Sh9P^~Py^u{(y(_GY8 zJe<q@*&@dO{`mAzm`{%pLp!(>wqD=!Jc}v+tOwNxV=amMF1}BXma7{2ZO?y@7%5d! z8DXiTvcS+nfWfFA6eHKig7K$c5ey}tCl)0)GHuW2)&dS#6Vb9r%v{?h!8c%<5t7yr z_`?@CFpZc?M<*29X2&34X!#J}lwCAHPmQxkECxNHwIvO2s-@-1y__}=2PBpY{D>zw zS84%gaOCg6%&VyaT=kl+t{y)5<C~lwz6H~e?K+qI|MvB7WZ*yCzL3*d#V%u$+|Bjp z;80-J@znI#k5oI(-4w%)VDM!)v;jll;S0dvYL9`ZyBU`&@kL`!>g+f`Wh!u29a$kz z)O&y){i?)r6}pWPRz2}YU%NDKqMkUw1j!vOoRt(Zq)x*-u0VAT{UF>shSRV+Cef+k zy6RVF)*<ig>KuUpst^nzOms6TwzDe+w`9GUc2*rnl@sCI=;u(D;PVTn-Zs!85ZbM$ zEykI-Pmf{Nb4W>L3t)&xmlO86{T!XP)XAf7_Vxm(#0<4(O@Bq0NGM?$tb3&0h?ShU z7SfYfNd-yzmwz<H1JZ-MF!1CS0rDSRfmiBl?)>IVRJf2<gh`jQ+Fyf6+{b!d(h^{* zFL@jETP`;0Io)gUA5x3_fxd)`MIc^)bI_~$%Yqz8KD?Ytn8l@dlM}!*)QgDZ?Hr5< zwYmVD>~fCu3|_hv6G^s^8KSD;Ql0Pms*pnJG~2`0i|Y1xvmkS)Ei8Vm`mrxLH9S4s zp@Y`6CPUEvOKWV)K~K{aWV=0dk0dgNgNi}n>xsebSl>r_fsF+%@JM=!>a_S@&c9N& z+FhNi{R&pT_Tbaz2%Q!OZit=@J~mD=F`U<QCQ{5{z(atkFJpnnegx#s(L`0pE=qvV z0J2fd)--!MsInS@y3ma=##u!k<#Qy*2$f;^1iAOifC+!UlMGf}rU;X|YYT!nb?<)C z7hUJcC2p%~p{%>xf2rtVkkkCzPnl~*Laz1Ou!0fX_vU%MGz=sGTex~o+LfbuktN%e z(3&yh@ArCP^%gvIuL*DvR;kqNmJt3N)CWQ3%Re#NUD(TkX~M802w2m>K`^1`CQ0Ac z^BQug>6{Xx#u%uW4C<z0Y+)9HQ2`4r?pxvkf#8emngbz^Lz{%{8gK<n-OZ3$5r{nw zgKz}y0~s&L+u2@)!SqW8JWxM?+e1b7?-1E!+2xB+{zn>{(cc!7zgg>QM-FA~(I3)I zD>=TAi%CC+ip#ULP_S>_yU6yoz)4ypf6+WD=q-h%$&&}RCh$`NtE6wprGGCJ<f@Rm z^3ZK3ToZcs2JGCOET=djk3>0nfl6yuYAl)zDioB16KTU!h;}*aCCl#1iyos$Bmv>C z1W`h^3mpY}W-5xaZ%ejTYJT>w-Jq;wljcH=hw6&lS8dQ{!FkioPg?Dd3Niz&_-9iz zQ=fx{al#!^O7F`Gs8JPPXzUSRRol<xM$E&&uKJ0g412mDNUYaXarv{V|7gZeicI1A z_7#E$>`-`gM_psnUWPcM-D(^#vn<q^=Ock~poO+3#A6gWk9fn0k_ii|&<t@~L%qsk zbt!igQ={-Qf!)8G9FwS4Z4ir#GVAmZL)PHwRQ&4grwldCTmA(L`0p5y;H*H<8A&(A zX=Zs;%ikfj20vf_)hE<)eL&}F^QI+XW_6Y?i4{#0otPL5UZO%2i3N_g37SQtic|Ik zBTlHM`}i)?3Jj}wEzXZ~z$G^e0J*Qg%*nTN|D_+TcPoGE@%Mcbdd->)=7_7H-<<u- zbL}0own!AnFURz?+Ntp7RTDt9#h)d6mU78RY`__Qi{{7%Pp>Hhr+=i^UqV9d?Y~5+ z=s&Z!wu@v@(aBpwf5hObwRt-n?Zr1nA0Rd4;Ac|Or3v+F=ZHZxZwPHIhHzkf2-ej5 zuoSW&(;B7_I{<PdB#EG>heqf}K-=1Z2arBuznhs3l)X{1>J}$Hwwq+vIW_FTFg6I% z>vWx6a)kg<dKb$m`Lm#DDOz}Z*azXD?ur^2Y2j~_Sp`)NSSRHE2-IMfgldb;G%@wF zaMA8xf-suV+2}7l?J!CqqJV|FId8E=c@b1`r$TbL?+8oeyi<!gRMUlnzmgwSkLPYI z3b~^i#8ELjidGvIaA{qzx6#hpVH{O3Q|)>lRs=;TbMylKyqsVZ76j+xKrFVtgQdxx z(@|ABlv;=Vh74n(bj+d_XBSSzGtO1VsxVP_OdZ?LCg!86vwz_ugx?}-f2Ydn&ZJH! zH(K6>vO*mAu{JXD`uoJ#`hSoiEUy|<x#r}eDL7qz08Iw3e_p(3Ng>N=#+EMc?HhQj z|6A*B;)nhTrimAYGF+75inY-e?Fndg4g+?-S2Wqj=RR(NbNEU>;r4bxa@=Gp2&S|b z?N=&1H1(ap>bz{lzcD{D{_JVsK|&&DVGm6Ot@@3@eM+%=Abzq^fPULeXw{z;>GqGy zxdPXM+@6-Eibv`Nx)7;h_OKs`44N(p{R|}dY{c^3pJmf2E<p<@E6q$A6E)dObG@M% zD~y<<9y`d_YjfJbhfYwg92Qn|CM?Zji5ic|sHSWuhVdYo9i5_~X!T#p(jhxlolaoY z&m2n$Tpx5o7AMm6k(e+(cvvhXjmza_L#zzTa7bsQor@EIN-WbtNbx6aZo%5M*K{iK z30(p}I&L7YtE}8A=$u|f*VB(rJF(&<ula4?erxtP);8_P*y%SoGy!vseyIrs$LT_F zG-~Cg3iDQv(5e`(@_<vz>+R*-4&X=>yaR_nUiOGQC936;7@q#U8PdS4vh{Bip)$Y* zoCq=5tBPP}L6A9yDau$`!y5(5tHlTdH+?&5lK=3GTF?#5YPBkT2+-lIpR`~Xe^C0$ zHJs%OnG)Cx0lW9JwT53mx`OKzD$fZQ?X!ZThnfjNM8*z6GT<b>oFJ;QN?5O6Kbw%$ zl6CsQ%O1VA9UyzyMPfXwh@{GDVd16ZFK%^=jv&-rsQ60)!84HJD0cZ%?<d$G;74st z1%`IPzA6-tv;4XH`OBWU{aD`lk}o0fUGLB<3k#<<;3mb>Nudak+H2Ba&tv+0rn-sf zs&^XZs9yERiX4yqGelkZCm^CTur3yR|KSGON4d}lBvQ0W7B`0UkWu<DD+j0d7V4+T zuCSoCENRv1gmME8&4sza4A!Oddr;c!WB3i)ZH49ea9<W&>6bORHN4ONX2%F@<<ogn zdhtO9w^)`Z-_rQKs{5bdpaJr87`Ir$9j;KEWA`J>8o_$)jGcHY=lovp8v^XN`|%qT z<3IDgtnULgKprG}x>sMxu^L?32`FsE+YjiJykYX^eNcnE0T(I`1Ooh*l_(VkQzk9O zei}$is_oXfAep0(5lAUJ=q}aVe_sY}FEZMmV9@v3sl2JYVZSevJOLi>sN2wDsS98B z<;Y<w^c#4S=3{!u3K`99?hOSTOs<ok836W8CDPM%(*`*nI}vm<Y*hgkcUtZHf4w4a z=lZcAi3S}RK$G3|0FFS}<Rn$QS-+C^pTXNa_XT6(>Yd@Y5Z!CwlxKholIlwp3<&wk zd@yW4B6*eeYC#SM88oJ5H&zlcb5!74E}%K0zn2K%KZkl=g^jq+M+J`IFmj{!3UGBW z@d^+lkSmnkTkR*1EeJp+Vr-R~frN!n@+PITv}}4OCz&oid(LE&nX&A(x==QxnH4WU z5mCe);`Wt7kXBiQ=MUYpn&Mvt!GZyy-B=J?L_}>`HkFZf8Z<GxXmZdviw1d$Huf`7 zHS~|aea}y{TW!J>E84X5kJj*MF0smzyYg&*RyCQ!j3)Xtf7GThCQ4rJ%$;4Hj!xOv zeC)1fj%t1yXm8XInjJ&ZXrSSAR8nP6Gn+23C=U3WRHXG!rRJ#A9*+zKE!g9qoUq|V zTU{RBSg#RxeT2~<PZeFGIW7gX8u|O47<;`S!`zarUHG}6$N!oF5V?V|-7M>eN##bf z`Zs@tpLYrnp>#oR!-BVTw1rB6j>6yvHHuVFMqwb7tA}><CE5kN3_5R3Wn1V<MS)15 zX>r>Cpk95+I19_x;eMaYbUlE?=>!gu&U|iikgBOAB{1w^?|^<p({vCW3V8~3{t5o5 z#m8!8j$IUyN0m*GEMR$P+ZdAp^Y96!+fvNVWk#D}eYL$#5a;~`90WFKne<Gg1enY@ zNbG52W-pmM`q7f;vG;?Lo3@>5|0Wy(SHc8c^24izF%e|%dClFLoguF7B3qrODM;O< z-u>uRj}Zng^855G;hwwWH$#U8x5>ez7~zTx5IbeAUcFtAiv~z4l|C3Sl!~b@Te4u9 zyu1a*TIN=`D4Zyj4fR153PW-9?@Ze6Gtz)!M#tlbh7Gxg`Bhi$3q>esw*pf57dU1v zljmi)nx3P`CYuACkxE1DzVv$qne5CevNdh^jM<ih(&F&5wvSD%B{-Si=#Zi<)hQz~ zTMOZRiOe8NplB=Yrg#X04j6gRS?K;pm^dbMk&TTjI6m)H84n5Uzuzzjut^YjQTjx* z>IW{n1@BQR>uUaiyUk57CxkJf9|5QS3!p^3^N5qFlV?+0L=vdV2@n4j^!n8@2lm5k zd6qvc$Y!k!)DRA91&L5Lt3588W$Itbwo|<FV24Tpwpaljj>Xvh2TtTqf73=a9Dsol zl75ouvx3|e?_PP?z^0I2%rT%pB#qpj%Wz);VWNQDlN(ghPL-{ea5I@HTxhf9%G_<w zs;{s-8&;T<`r;JzIMIyKR8CniV}Cip1|^*N1BEo5AXhjQ#rJ^8QP=0<6GEN$!cbU5 zlw_;msEoCv0ALR}eLH*PJvM5>#UO_`Ryt544q@{>cnyxgh#`BslgeR;TiA;#spaL= zYH9|*?+udfhtTb1Gg^j)3n5xNQ$oY3Obk_nCb$~0(PD$>Z(Dv!)V04l&1X-0GPqKy z=~V6T9J?;k9qY}q)pv~CHoZ=MbA$saY{4c;n%RxGd;=hBcNmEcvWLC$^O2HjQen^t zi0@j4K!91RpBoU`wLW=bdxKbES9Ih-ddgIcDkF?|mLHpY+X|BLir#3!kapsE{;fv- zXY{z@-b%)AvAvddfG}@E2~y>woD~G{d<&Nmb_{pZ!&)R3l?{-)!bv+=?K~B;c?H>b zu)RhDK-pvg0JA&Y5>~IWZ?wPXKM(aj`<M8>{-4hvl~$6Ppn&ZN4-ILm{x5U7uFN0m z0GtMoRhE<!k(n@U_W@ZJzNC9q$=KA>^2qA<URNOxS&2*7{|EQek%R`cTip>dC!8|} zNK<6x;UFdp2lSJZ0~JC7t6x(z0|G<>Pf8)vg?D#~K{rf`%5rdhg?%7mkglK`KW<=Q zyE=)Ot}_lj$*#Xy42R{uiI3(l(UEhd4^YQ9&;lG=R+emTG)uID^BET9N05`qrD8vP z#eReA2f26!n4O$_PWXSPAjd8ZsH0Xp)PYIqZ&~s~4IN?cT6w~dZOQIc?E;0pj(J;A z38z&~4z7BANB>EzRw1$nRTId;VQV8z9H>s6S`G1lA{eAKN6#&=N}_-<KrcXcRQ%b~ zoj@;#Vxb~Gu*&)d;ix7My*W=wa4a}!yafPlrCn!E_XE*u=`E(s7LAwrF}~E)9|Mh# zYB)>@hS(I~whKmaMrx116u58`wh^cjWNxi9xrO7RhsHEvX^!3$>y4)GNb9BwbI1l` zhK<i+87Z28&2LGTo2~_<od?NkUnuCz1roHv!GrA;wVwoZDtdNdt#$Y?3$q}l)M*l} z8yXzYHfJ%;i~Zl~0P`;k8d!H6yfTGzpIyzlK3u*7$9kv{33N(L`m%lI1b7B9*OJth z$V(~9%kT^3fFh6xTxuuWt^}jGM;xGRUR%2DAz>Sc>?OO!3t7%P5UeQV=+iYrL{qE; z_SEQI`Mh=1F@=unDVHq{+NXJ+GAc?V=M9Mff3XDcKx|N|#vhn@dA}4aOi^0_$=8N` zQngfOeAqiQUJtRhrojjNtV+O83=Sv)D<MV;PK3m_3(XV#^dbO*iPP+NV}XJUydfA- zE%<s57?`rrMj#R{SAZvEo)zLq@C2QTKYgyjPgd{3gEC-%U5MaQ+t#3aC3uTQs|Hhs zo7SYPF2-|i*(WvZ994}kT~G%_ju5M@NC}PV(3=f8JBi%|IXvx@TAt*hVYZES7<EF& zwl;MBC=$Q|RuxLuFv``L=3;;!4N6-g&eG2U169C2oK|yFVd6mP^Z^i*;1ubRcn`qU zh)kfwT2CI7*|-&@uyW;g^-ce~>GI1Y%?6p$4%@k@jQBZ5NCLstLgRr{1`SGt=3$!m z9GJN2J|IgwQn4omIV3Mx?y`4HIwoNyV8Kd{trW)e+JJ(im;iUg2V}sJ^Z8k2A$@SV zUHh3cCZQ>m_}WJpS^l8xG-KN2r70ph7M(F*VBr%yz`p%OcTk5KV(-r$Sk@(5vfAvy z9xLpN{}p7P2ifaU`&G9zCP#l`8KLTLkS-Ntb+LaoH!-5OqsMw~JCm_l(9;4jd%z@> z{0p|r3!#%7Px2J)Z4l<lwuY{cb6T23OocQK9MB9gSY_<X`!8f0#Af6U@QGZOO-Fx~ z@4c7MSW3$fpA25F;`LEKi5e%lT>?bzycI!h6Ycie)rS(@cCbl#zjzq5mqnujSiCA& zj4M?e-?-T1K~mU<<D@PcC-m~y5{hqMzLNJJV4D@dR0i7co6Iu^Ao?$h6$wwmZc@5J z$BDF&@nJue8c+2wih}*8Bn&?VXa>m4enOu_DExo%O77sWui#KHqI{vzLKza^rZ7Vz zgjaSg6DuIH^i)%OF;C+;hIjGdm0FJ6Bzz+GF%lBE7$#z*RFjqc<gwg+(lTgo;NPk6 zj%_DZGvK>D==x=DN;_w8A@{cYdH>@JJ><=f{`2u-`Ex9_)6lF4;RBH=BzGH*2pAd3 z(?a%zAY$EY3q{D9WBno>=^Qp_c2gK)jr{$BEYGgQ1Tnppy``(o>W#cKA4q)#xOZU4 z!X_PZ?jAC={fN%5x1HLGF`R-i|2GU`nfyQ+>)T(x#F*cH0HaKDC>}H+=8@%9GM7Jt zi|xBYi;}X{cYxcz7alBV*V9^{AFFGmjMPF-r*A8E)Kj&*ch%1MLXTmx^cTibxz6_m zJ%Y-#RvjAA@UvI2B)-N9@Uy+PR1Cw?h?UC*`ob_%*H%pH>BChHS6wK>3P_E7)H^v) zCYUFxtQC-k6(O4VZCqfFia|oetR@zgxn|^e*Gr~_$qbcSu&5v<c3>;Mox0~qlQttj za;hC!ceCVJvIlvcn#4@=;Q;L${g*XyFjCcbiibBP_r*}<#EafbBi=E#lGhKhZg6l* z{8@v1AI9=zgd?^tx5jzQXmBBCp-Iiu+m#FQ`=rb1)RmHw$Cl(}=ZLBUt%t*sd*AnH zqiuTCPuPuu8{(F@0MJF2cIhZOti@si9uNP)dk7S5-Up!oU>z(ZhlYL(Q&hmmI_OaQ zH%Y@$7Px5$S;xlRxP5lo0@sd+;*(5*aqt<Fv!CEXG(jn?3C>^NCorpp?PNr<ELNgr zhQNs~hy)vIS0E)=6}S?dU-}YsRB8%|*H-b98nL`Yt$+twq@xu=LiUhbV?9-|WMb4g z>R#!)^$m0!tdTvksvu!c5b^VV?gCke18B&~e;Aw?LMZw3K3!qbnj9eHF3XIWuYHlJ z$D-ye`=FrLq#78fYdIaF=^BlUO@#HsKg+!zGFVX_n(dPw$VTmNo1bVZw^9z(hFtCz zIx(#RhBML06^wy$rOP~(Qq*no_TI$#yLaLK(~kYqLj$t(Vkzl8OFGxftHaO>0K)bV z+5x=Ce@43g{{Mn(0asW3$ldK1^o6YxgDVbe+O&0q)mmMeOBD?<E1CI#4BXNb7>_Sa zJxxc~l9QFgRZwAbFr<1RSeFK?;oJ7Aif2njrU!p=yXF`^Waty_eq?mUP-AZmI!sF- z#POr$rRKV<<4d_1hDSugf7aHK(XV|RH@V#~340Q1pD*?l=Z$Zb9!weQ2FMD_yV$M3 zuGr|J9g`Yi>Ws<>X=Zk!&VWmk?A$X6X4G&cpJKNHkK~kHrvlmQOd?s5J@$H2ysSt- zy?T*+`}4uj16VU`K3rfOj1UVwcqnx(r+T+#82G5o`6nebb>-trQ*7*3RG30YTRaE0 zm)gNF%&BLGTnyPeUD4hgW=jY1`14+WDUabwrrqu%R8)SBI2hz?2P;(z>M>nJJKcqa zZqzRrv;l4QA&G=@u>nr^*dY4S1dv&VC{}+)x)_HR4iY<}1`aOICCotKITg+i>~vYU z=!}w;ujPw6Hj&Z3O$DmKO!5h{VFwcels*uxsV-J`C;^7(*kM#I|8z{;!V#1(v{a5G zxCk4cWP8Zpq#HKVR$k)<8H;3TUK^)%l!h^@DeDXq?s|4kQ*iWU=tmOwgA4t)t!b7K z3-&`BMH6M7V~#?}Lg8(WCCv!SSxvI_nt=6A?b|QBhh6)yij?@OFh+^wCEH?fc*9qd z`;_RkvqxbEY$i-Ic8CpoP<0uXM5My_XCy@8EyPL!xb_z((;mdSWZ|n4D4%bFU)tee zxFQ%I*FsB@3^7~)zpz9=HQV&*V*#P|oPa0I!r7yv6*iQ%7yhmoV^4R$VoNsNFUEV} z>DOE&)yYQ*2R~=Qr5HNS5JZ5z^plDROkjdH1{hV-bqUoKS^vE=hGv+Cv3dYrb{*e4 zcp(W<720$J?0yd+auVa>{fDDjiG8Zii}G;+-qmWpXT_92+4$>2kP}5CaOg4NQjSW# ziWiohbQL44qLER$ddD(xDdm>PCU2OeUdVa2(}G+Jl9^7DLIZGQUi;)-wxm_|+c}#6 zJ_+^CHt2fEGGXUBn06!EFos)ZHgq19T!LBtNLl6M>seuEvH<S2FHMu@sNoFI--G#U ziK^3F!dfrj<F5wrE;2>v^0<rXnuLqQieK&yygYXv<|g4XiTV?-R!!tnaC?!VzC=tE zteqG1Tdu(6^@5sneHgvWQ(LvECA;_cWZ&SU-ZwZGewk7%yeaOgtqNvmKT5v@BZWos zFvx3M*5j6n#XubB4SX9{H?&-FEd;B*2A4@k7bOr+E4O-`o^7DR&FMaBnC}PQOz?%% zGnPir{2ru-24vyw$xp1DVOiWM+eBJ#K_4_&e-|X(l$io5I5G~_4_0sq34c(L*O~PD zX)c|(LKao7Om#hm#&&;J!&TI&K0v@|v;p|*>cBp!YX5Vt(msNNdMN)~ZONo@ZYu>q zgf?1*_EoNXF=0)k3UX3M<EacNuk7_Ko`Azub3aC{!I*(+ny1*LV%QpZjd+7heTkiH zg;N^vG%(<ENu3oq=&JgS?$#NaPS@n1QfXZrtjJ538YhI96i)3(7u3ad<Qy5JEl7h? z=oZKkQO=biCv;PFWjc^eYPu@#QD!Mke@kQkl%)sL?o(qiIDqgLp*{tVt&{LO+oh?X z{PyDkIr?qSf1rTW6@)<)+8L!*Lp_zmD0wa3NEU$MG>S|>Kr76}4QecW)!a@9vn{3V zXft8pvf~)4HpQxo@Jn`vYuX_`+Mo?4yikJ?YD?0Rm@lGkVY^%`jKwHWOC3}>oT9X1 zg{b3HwZVjf8WzG7mo-?DCZ3cAHKi$`rA5<QQLoUYEv}E$4Z%WrScPohJ#}kY^H$Ez zB;1%{5DPB}-|p}J2+K#j!}dc}VXH{2Ycj!WFW8DUwdo!JML@d0xk3p;7?r{5hLIt` zw0Fd?PdM8=Fe%Xp4QSw?@&1~yo{?yNY538s!X8Wvt7L0g#u<TNWx^bF237ZCdjOqw z<#uSEukk5hhHBF>Ms3$u6DJA91;fq~9~KzQ!Gej^J8%SS2JYnqyzOTOVOlK<^K{;o z;t`x?WAPfwWh|Mz<d)`8cAG$~Iu<fXqroz(v8vN9^ryNanUlVSLl_`+8X8c@%E1Pm zT2B-jKI~|aY?)s#$c2p^jGWu%%3JE<23UFw3CJGT`UX468Ojy<hM^8-=4_fk&e?|m zj%>?%@X(i4wB+8uf(3wt>y2-XSh|YR&BzB22D6gkTCIFOfJ6BXuI1vk)?D;h;Hb^9 z`{FdEW8jtcT}0{l`LoMJkildbz9V=O5LNhLj<ygk(X-D%I}mx}bH&=OKUbUj#{OqC zAM8TC4Yr|R!GwPV{)rkU4b|ul-+_1SYXpxm``5x8L<Ohx45=kZ<m!^mZxrPE)~X(l zJ}Pd4V*@^|GX8?|vMygPX!1*CES#pe*nCXe5sLl&mu5DQ1qbZ2rRq~PyR#2&8MVz@ zAPhMCIz3?!UHX97-PgBB=hOew^y*KVSW;Q?F3tKGSi&o)psqk()2%uT8Ks3Vb)rq> zVv7j*77VBwHcJU*{V+N&=J{i?DacI?9oc-nyv@$h>U`yAZc;BRv3GpfD_kdwH(=g* zA><Vul0g{DksH66U`(PRgdv<>lhjaGDnK69M6RxQf0l}+i)s2F(!He~MP+&i6!g-q zOcHZ7dvgC^f(grK&i6m8*tWoW!B*OIn+p^#9dT<hI|=Gk_3)6K9M0c-J*P{?y6n;c z{CD-$ft`uFc~iK+<dxfShHlpV+5;q=OY_4iT!PXxZ}9o1Bzc)8EdNKtXTmU7$5?M( z?^`HIJwjeKOvj)S<MSrvfG==zFJPfH1#hm<ZV*;K)Y{R-FmC|s=E&MPQ`bftDU>l2 zT>M^@*O+G02h)KZwD|!)sqKFXvMF?ESP&6iSkY|0p){4%Lq;cez+H8*|1H`72M0G? z(|F#umTcaG>h#+cUPHnGe@pkbz<oGm$`cY`aOz=}Xvbf`+l$mu*K*%3Km1pa3q;L3 zD`1qr5v*5vF6%chjr&<n5B+c}t1lg1%?LPtKcLh!m`z>7&v48GXhD{!WhBNglF#0N z0+8%jp9;;58V`&6;gH5UB`a%Q1?Cu*@0F{U-XSOSJYbQ4WRE2|q92?9IdXZ+Mw^3t zKVnN&pglOV5(;&RnXg0}K!*|rk!=5klc^SJ1<RpM^277l+hjT8BG;(e-v<6&rT>^e z3URS$KN--J2VEdKa&UQa5e@<;R&<#O767Ij(23QJYX?aIL=}>y|KRY&^Kfm`0vu=Z zx>U-Cuf-Su!^+u?oZeJ_ezQ;({lP+|<Uzr<i*t|j8BG^dtx9gwP!*{+(n0}9JdkU1 zv<fz4&C6O9YCi2>RmRK4$(zD>9;;>=DcL-CA1++YZWr`4RyZ)1SnIZ6I~uauc(8Lo zur>GRGqzHLIK%Nl8(TVXY*tLX@_~}f>18zeG@KhR*f`3E4`JUCxxL%?yIC-yAAyYJ zy#Xx!HVTRbdq4vanv$N4>+$=vA0CeGomIGSH$j^g*29$f`w5z&#g<!O=*DCV^o>fO zN1Lh|X>HbDLdO6Kw}yagv7RE=OKc$v1DXwMSXZ$a3m8gTJvQiCFRemvAf_glWuc-| z<!%>%;MxX*K@4Ol!u_g5mgoS2`4r={5(pj$Te$mF%ScW<fm>Zkh2c;>8Vf<eG=m#) z%M<9^+6?v=Z}U$IvSzVu^B1m>lg-&tSxLIPK$kAl8`;JO4FRc`G#P(FWtA8??g?E4 zW4b>`X~U#u5VDhNuH?cK@m4=0zi44{u?v_Qag!C@enRL{QIqH*1HYDqhz556!8vR@ z8Lr3U&!L8fsv{X8)rIvIzN$QB+ksSb(*|&~<W7W%7DJnInTfNtToi_xHdK`i9la&e zD#RqM-4}?@?kgV*jDxF~3??yMk!QBN0YPumRso_fl@Y|i?@-^28iyq~Mw3r+7=0kI z?G}c@v<vnen8}Tw|M$YK|CnVM(AxkU^|!xiDyMAb9n#TcGFd6xsLy*GkMSGS6VX$f zZ<0?_$|nJKsFF*(Emy7Z%{cTCDE4Y!f*)QTQ$o#mm!A-217rDtDVv~QWVrkArB`5x zynT+mrz7C9yiR`H(Anu$R8o>B>DCMg+=QHTG+-#pJ+(TQb2Rj4?HiA-?*1vrwcfNj zIBk)3eSffduSzw*toagdlZIvVuyWpTMYsFID^sNem<G|fY|IB0wW;|EM|JQMIiOav zzc=;qiY}l85#3Oi%3s@EVbK-W2wJXNUuVh!Yh@ufMl7I8zJSy`?wx7oq-zhm@ta>i z84zzJ>;=O;NU+nxx}YHls(hh+LIkS<fuU%J&{WXOMMFdauUH69`hhjualiE7jX!!p zlJ_*(W56&ux*)>*C8~*{8`7I5i#(zuk9YQB2tEfDLC!av<cpA7Annp`J1aeM_s`a? zP;<FS%a~Cxds&G_4wq?fh(8YVg?>Ii%=vmy=(PE1eUT?BD0wRL<-+<}($oCrcdt{p zQF8OwfGH9U;Qpw+(u0~=aY=C2zR#Cpm{n&>W`Jn2<2@OAGX<u~V!@c-`G5$t|F?7L zLx^bPntp6nTZdU9i22gmJ`6|4)i|r~T%!}lBs}Z8`EK(;VF**<>V#IA;CK&Q;5C!3 z(>FW1%?&(hBM_6VAw8QVe+tU(AFz#}<)0tY<q|zR--K)~EcM9q*WS=3)lTU6s;Tzl zH)oS34ftX}9_|iVoCZ5lT5TuRmP<#sz$ukH7zQobd`MVmVw{U9jGz(oFfLkOI{l8u zNCRi>5VX`~jHfaHvsk6tk_invbFRM2@&-;1T+s!6!|;ngqZwBZcMSuBbp7UT{AOmf zr5MuG!^9Lu`qp+!%LAhVrgO>fzxO6lA}Xp5^iQr6dyB!B<7au}7g~gV1RQU?I8aQ# z#SXs1bpYc6yoJk2vSja&j*YWcs{9dU6aRy}r|^k$+1gz3$aWWH^Yvq<XkByZEm{wD z>U1z<XGd!AXOGYgR{qw>^<7{!JUr}C+ld%zq7;3jr%IWeUh)-8H-ZZ#tN&{)%SB~| zE?%-MtD0%wxeqHBbg>plLVk{#;KZ{cYr0B#XcNM}H2E?((im&*M3`DJ2-RUKy4jE4 z3a<odeRBN^gDZfaO}PGA(EIfWRpWyu1J7bA6+gkE;oCc`0>hW%7m>2|#&WuL`q*+9 z3nZjzX@f8ItaBF3Itu~C@KAkukAg~Ju`P_sU`}7;9IBpCnlTrrcy#w-|J;yiZTf8| z4OcuFwB4F6qeGS`DC~tmqJvCch0b*wh6kwK_|INOm?Lc1xlT62(Lwy^cI1UoBZb8y z`6^RbE<%=IryPJZ1(joNUFGDk?CKWV0R!PkJ3b)y0{6W**$iFh<2U(d#{f$6!fNj( zlAsoD%6lK>*T2>X1h{=;aJm=?G2rG%nDZ?+dpdh8@K|0@t-dDfs`+ca_oN55X#P5| z&C@6O;gs5Rx`kKGZ~c#@8m{nzYn$=GpsOxRFWKtbbiI3{AWQSp%oU5NFMUt}wO9;s z?oKRbsU7N~EYKsIl{ad0dCNOANk%DHT`uTVzAk{QB(H4_IHHEk)B6u6yQ~Yv1hev3 zOcu00N$W}BwA3`)jo*NUmY>1Z-Yw|Ct1O$DX0TZWc6fE=r#Wm1CcC|~z=giq!6g{5 zhPTuS0>9ajLa<2*&Sx;K7_>7KwcLEz3^J_IT(Lbunr}e|Tb`}$uLCt%r4<tTo!=>u zDH*wybXP=O!6D+LC(G=kGRyc(TC^iLUIpv=<bBvm-j(;y%dcRL8x{ePQTh1b;Z_md zyYw}P5iV_5vURa~o`991|4gdG3S6eDQ>C*eEo0qefU6mqp@m6y<^+<04A@^|=^|(k zGJE8(w_*N)ZBA?ffoAjCP%Osz8Q3wmr&T`;bKvmF`E!84NHo_TV3Me70jgjT;C0CI zv}`EStOvH5b>GFX88z2nSg8NXYPQ;?&hLE=^H%x$lxZXifS2Upz+nUW;49MnwFiBf zlO6r%qc^OA`tu20;A`O1D?h&qa{KzcW+cwpKDLBBvz+n^^IvcvA_UpNlh!J56&Qcs ziG?RbctW#Z6eK1mt1s&D0bQ=@B3;D}w_*p;b~NNJO$lsH+0NZEdyR|<euW``@RpAl z*wCV()?7Di(@;WA%d~CzWs68Zf<I)R%uoHhtr|InvJkD@Y+x>h+@ja;r#Rt9v=Zf- z(aKf(Z$akl>8P7L>;f>GOhS-2w6Q~XPeD|xbdzDV-i_Z(I__D_yPCw$y8WE<CZap_ zYi)w`{P}E?y9ZDin+QNo?3X_f7x6BOfCCm<nl^!N>GiT5?9B!TNiu!gLeEdBcx1~P zAp89LbIebv1^l<Cpbj~hKgS$O<Bo1c_q`2^am(>EeOJFT!IN;{JG~{82U1NtSToK- zWp%fBd*iY}Tq;u{8g$SZD-PEO#bj2+^05yXjSrOZ=g_%G6b+n#A3PYo!8||AN_Tjk z=<|Xcqf*to@tZ0|WRsa2cQP|xvG562S3!a<^XZ2?C%OxFP8<JxNk=I4VmE&C@C-pQ z#j$gTlL-2R^|SJv!rsAz*pHfm;VQw@xq&66ra`s}$-kz|e%3?RE!)aNZx2w_Xo6H_ zGxf$!F3D4UBc6a7M_Q53kb@cap9HtF|Kbl`LB$$1Sk62dSG3)e`)~+l4u?~~^h0K3 zbf6A~ruBl<iZj@_+|bMdKOHm7&B@`JBwMZ-4)(}MQt|G-@9QjJ^JMHAMt@JN0kh9Z z_z|k=I;x!lC%HqErcM>vItf);M->B+BiigVryS6LE->aXcK)g!Wv*Np+S}151goJP zs3dW5{yvBVyHdAw6+pH4Dj#LHH*ilhdI;G_7{<gUtQoL6(h0{DKmr+vN&^*E(m{-< z>f}j5&vS&XVtHXuBh10ULQ6Q6h^UdgU)M`-Pc?M$j#%kuU_ufO{vm$QB30L@*=Go? zVRe^|>g%PZq2n8>dKnwLWMra$d<b>Mnh9|PF3`sM2F7nv0h0;v+Db8@MF|>j#HFYv z#MC+xXjo-Fbf%#;fp`5q_-@O&&7ZZxUtc5`E2C|&xNd088Nd3srWZzA3W99YW`Er< ze*jF^4}BjNWMwq1Iz{0`t?*wNW>*9)yTAH_xFhNC*5(c7h4?Ikye_Px;HVn|>{F?N z(FYXdX4-_DY7D1OLVm7hLvHpUYt-j7^Jk14OIR_M8c!wq379?rj+#o9@n>*%o@hyE z*wxMeBzC+Uk;5BkM36TW@u+oFDva&>4_4()dK7OyU6IV_jq2e|&|Io5o;s7Q=#sBm zzl#||(DgBEzFRV3tn|{?>FGK+It}Ja6;C8Z&b*9=o&`}S`+*nUwK+IFawO*vCG1il zd%CkwgU4^#iovx?q@6K^G7DqyUvVO}OJT$|bPz89)Jc(Ey66s&pTt|yvSjSw9LW>j z0}porz^E!+tKED6=lUO3FBf$6_UQ1)p?TeT{xf?3(B!!8PGy)`+^}o99fmPc27!tu zwhQrBM3>UI^uiaC6yHz_pWthsD$`KDXdI?mHNz4vl;-(VZaO48siFQ5;jmeMqB>NY zc1nk0p0SQa>0l_b5gj=1qp|w}{f)#wO!e$GEn8=DIAU$Vx>DQNkSte(ks1u1lX`bJ ze8Xz=t;51H?fwKA!^i9tkIk-o%hGGdezau-<XWdie&;n4ZNh_g6$bq9X+iJtSmoar zbk-I^WMC<DmklKM_yg4~@*kF}!1~H`3;QY-(@aDqMQBz{+e6+TmhE{Rml2{-QGNs; zuZ=jf!Wa!@d1c`6D3ZdE?|O|Ucbj%Me)HiyucqX$vgRD@BXH8r0a)Jv9=zE3zwR<$ zTYYD&7y9wUpny#J?~JD5D_~;foFK&CS^8YAU}i9*iv`q-$cf^aOzTuIBcZVlcqTef z9E_ayG>n-9Vs8!O<SeE;15aZY$okS{=fy;YK9ck%k~fpsq^vW$@XQ92zgHdi#MV)p zuz1e-j3o%ocqvab98_6C4e2Sd?kG-tdK=MUi+|I8b#O7xZu6dA&ReLt8eU>!v8MWh zNAGgA#f!olD^DQ`g$c!y4G+*rRt<aQ_mcCI@R9^T@!Ba(A(=-<2qA>m<AYBsCnSW& zEBg^Hr>gJJS;v%&1jJM|3INSZPt+P0t*o$V>qe-MeVba*?y1vG#tasX)d=KjFH^ac z3u%CC>9?@~wB7fd^-c*_V<;IY+CdDM-mE|M9%u=W-!AAWA4EUK2d%*=#ilb-Y~U&J zdlr5khXV*vo{XEfSpOyY_WYh69s@@$>%?pBa$Zfd7Yi~J3{2245;Y1O!O5y0ZqsM$ zH2gInylV(@{c|}GOj0v0f{0PAqj<QZiYtboC`c0pKbJ+theJWY{P`9T|A{fSG+Q#A zDGZF767uhV{hjMf0!KJ~Y}Dq{JsZ-~B<xS<#5gKSfqexO=@X}qlMw2x@(6H+6BTbB zBMji0x26Y)ZKi1O_~VMFpizAKTeHsa?kXzk^5p}D{j3PhB(*42b>RrNN5Wd?0T{Vb za{G;4{zr`oC-w-_*%f87d?bqxYdszCG3h#<YXSv=^%-O-PzvWtWxfR7163>N!Wq~> zlAc)P%fas4ZMZ&lk8s*?LBVlc^%hoV$l2!p546B8aV0Bq{iEC&awkFF#lJ8`-OJF9 zkfn0zVGz-lgpyARB53HN(I&3=a`hk+m1GJLM$ir+PEmvaPc*v<U4eP{!Sq$h2T3v1 zZ_G7xexaau?h>5G2mgR;adL+qY*V%N+EEyys6<7P@eW{C5qtJ}hOVH7wV|zccR(B1 zvwC{Tpk7Jh2zrkgV*BFks@mZS4PaN9Ps;1N6+{w?O3_3dP?)GdxiGYv=CeKwNIJE) zraQgJOe=p-vGX|HIbt;9ahke8siKA|LS%WH9<VzQjoOD4EOHnsM?%Ljb4+1t%HZ&< zz5@(Vmr;uka@A1@dt{j45GFcHGSdhNHFJX@q5Yv}=Na0~`h!7ut?V0+?q-n&J}4?t zW{iqR@}Dx-6&z&L$A=mFz-i-y3FE}+Y3b<+0slZiVzk=bpu$CjIof=#`(%{2=&@2R zkEDKP%_9iFT6Ut*%5`v#zsof6C8_Rk&0r6xH!$e21xB^{uP20^R?i+_MHyse`ftj_ zTAF>!O9w^!6Menw46opE!}<zrx!%!#g>ip#fE*b#^Uu?i3lX9L_W%bI5>PjrNBu9b z{9X1562Olh7i#p2Y$zPw(0i`bqv?lta4!D^xM>59wqJe^uQ&#Wf9b|^as?K93yT-C z#q;(%UJS@V8J8F$ybV2wZGughz<@9qK>kB4=wp9^5oQ%E$8K15CM&)Pj(CI{9#UNO z_iK=B!n(imlBcXVbQuY|)Q-+H4*+V%Qdge?@%i}8?C~^XSkcSUI&wG5_}~!|3N<C+ zG91&Tp^hBAEDK_X-Eb`oeQ<d{10<Zt5h19_vAaS&4gpk;54)(Q)Q{8#9qmDmDINMZ zn4?>gX6;=2<0_FW{a5G%UKghjdkHLzuvM=KSIal$^QLoaLgcRL>ugFRK$6^zD2V`y z?bST>F^G0gj8T0Qb>68&CQbFWAfdL0)r^IY5R1z1nQ74=1X7+Uz9dScM(iw9Wkkaa z)a^zUK3+?bAmCK0T5x4iXxU#Lfkvb<7w0zx*_P@HBbFOMK6!eV?c1L}OX9S%dV&^C z@B5;JGF^hPiZ-1F`6aiE*WP*#eA{{2fhiPt2!FZ`&Q#OILbR|<-Ou#Y#Vt80NaTnm z826_@(sGrhaD8IEd7i?AYf)gWm$77!Iz%}Dv?ZL24x2^`+nc48Jx4|U9>-;nQsF2L z&nk}j`~u1i7k5zB+GMAmM*TFqrYPY4))xfHWdlJp%o_AfcLLL$V<`1OmVj0c#l%k2 z*##SmzDaU%IU!(t@KDJpAqbGy9~Mggc<OOf_H=zXQiw61NTvsep`VC&Fc34B?Yn@- zQi@VCt7b>JlOVK%f+m@vW2h=Uph6BcmZLa3>-aoiO2;yVbG#Xtxsv~OjH5}K3xNHk z@%Pzk1LUF^+nl21XLj#3f5qn=#kxi)V$mkK0*83BQ@Rhg3UU@%s-1x<RR5=^q=DJd zbO9@N6BTn!gOkrlh32P6>Y|Od>5AVyTsbLcmV^xiQe^^&p@;_}0S(I^SeDW}DwIjM z$>99yJX>y0#o8c^V8o@d6y<kpCpVAs%>9A$_v<xV(ZVO3_tXX>2<`z`#xH3>Zkh!( z4qlt@LVyD|MOTiNLq9={1w{cU<TE8}Zs2FibD=QR=OBYc`YP^$&2MHHbf_N>-ymBK zV8683;4ynAe^TV%uTbO{tHM2ZZ<EHz{ZMYjjzEt63F(z$KQb>yvE*kGVnj4?1kE*o zY!;u=uNMk(2|IM4RXs5f3(`RYGHCs$5P}7vTo|VqoIX3)smDV617?uq@F)-O7~AT% zg4`QKwjyj{fv3GPIp%q7ao+5uh9@K_Hq2684d6UGrSo+?KSaG&VFq=knovey`w?%0 z<Cojucwt;|NkU?-e>Hz*PZtZqC3SXZ3b`Zy!YB~gZg1CCM`|=sOF}=W-B@%yI6TJ~ zCkSjlBa9&>jDx+4Dz_xfg9g*@_Mr!Kd&vw}+SsEFwd90EO<bINHUY(4AQ5(Xg$Z~b z;_0M>8fMeIKJeQCy#wDFm^}f6napXS`)tj}>G{zUj%JLc5uxWeWYXZ}$Z5g}Qhhcv zursF6O|FGzES&wXVYolH{^44My`O;0(IzI&+~*v(FMT>acGxFaHzz3bw0VwW^b5LS z7-u{}nwY`34V_1zg$8tpRxE>6F}RbRW)E&}>lYA4V8fgCO;R7nC(XmqXSv8T0`(Z? zf~c2Ixg*6)5$-$~&3R@646tCKd<oYL85S5GIqp67$LiZ0H|k~Sd$hb~f?}>g`D8_$ z$0{dC&|g7fY(?q3P6I}WGiYU~beTCFJ9!Zi;vG}Zd|SmLwrPrI38bD<7dP3MqQvub zuy{Ipbp+aNQud6|XPHYsZlH&V=(yn`(y;%ez*#ETY-7`>AWBy&=s<op6s_J_F7DG4 zM9_LRIy^%wQwgzRHD|U-lI6G<W_P&<ym^FVgAkTI8!ms&A|Y9*XG61(p!wsHDfZP$ z`*GH{ok0+Vj^zTD7CfbiHlLvR2rbPfVfPBKe)PVd?()uH#>v}8j*=pq*Tn?4GEaWc zmK^Y3)jP%Wn@x67c0EEWLE+mOIK&w^jendf6YWaREEqY4_dTMoh|n4Xy;!c<qxww# z*uw!$TBqjW)u*x@Y4r>=_XzqJH3AI+c8p}+Gr-Uz2K#3)en9j&OxWBs(K(&TlATpg zp8->yVhyy;H(wWz(gt^L(=&Nf!?-gaL-}fWTmo-GS298Jp(}+aG;st%A{F3lGORO( zWb=ZUbtB}nk-~f0pCfc~N7Tpw5V3LGJT7Dgjd<!xWXT(Zi(-1Z!*amP+%b`KJPaJX z1m|)N8Sw?%AGK)rZ_+gq{Wk-ui+B2ZC%bzWSb<PlB_uTHJrKA~q+I4Du;b5tf$jc( zt1nrSlWN$vMW>Q2A9eF@|5H1jg+mY3+42#ues&Mwvwjzj<ypPaS4or$L+G}$6b{wd z9A569PT(pVxYA=oZy4%-hC6!t0?kG)Edqfv?3#*IEt_x79TXB!rbVoYe;b5I0!R8y zE3mx>hvzouiULqAqz%^3{n#U$D6jj^`p$FCfSflhRzNYgt2P{#3TJD9Dr{gze+4Im z{UeDr+q@3!&*{}VS-O%gdy&{IoWcZ<*(vFZDhCGuhps1`;nEfX(4W+j$}Om6wE&Tl z^IYlHJ@Nntn5EkTTpF`^!hS0=Y5)X$Thdd<vW0Zh3|#$@!L`w~pg{5kHt=EhBx*-a zS?C3<D!4rgFk7*^wrcd`t01!u)7U3K-eyn#c?|8~X!~-rk@Hbcz`K2Lwxdegrkx~b zl*cA07vPZ?RX$z2wVIJLVlRg_B7Z&xx4AxuJMWvmA{<wgw33!F%Ubk0o0Q;R57a(O zu=Ryn6dd<~dhR3zcwl`Q)pAmm(<=E)0f^d1K+jfgOg6gy0bb?JTYE}!wte9plQ-E= z)-;uL%U}M+^&3$7zgr(lcR}SMQvmnHc0-tO>m6dL+<@7cZM<^QWB(9ZUaP(cjS>8n z*wlrKkl@x6!muXKAO0d+`4i~&6jFOqT6*zw(g>&38JuYX9c{K1uE&CZ%NI0CC4As~ zhjROshvBl4X5IA%vq<j|R~_yt0OusRV`_uG3GUQxyx6m>RnukNs(5$_pU(dJ@f|gr zKh(mhKq`{|jD++aBPQ8^<Wnu9#|nJ)3lM+!=~HUV$c?5s>!PwNsjOh2iz`F#e3Q1; zKo_pv#>Q+GP6H@6Y78B9StI`W_Dymx9o)ZI4cDQIVMMZgk6`qmFOYq7_ywF`$}Ixo zz6Asnwb*M*WPc8!fKUazDj}2K`mIH+5F{jJc6blG(NeqBu7c}edgx^*dpGc`a5g_c zZnif-*d`5r@!T)Lai#*0Jxnj=`UqgGceMFK7od&ABUXGF9zG`52STI||8v^=)sVX* z_h)ZDfr~G-GeO4yPWG&ZI1Yv}5L&iL{!0HXV`oL!Wdep(B``WA2ib0hb@0}a29RRX zNJAs#y9GUiqUoM{92_=5SJHQsaG1AAt=LOvO4}f}9vhR6jYy&zj3QN^{A%Plj65p6 zQTj6ll|rPmgmG?8FG1~A!yEdr|LT(#^<gau&;QX{sSXS$d7$4wAocHFvh|li{oFcJ zkRvH;dc=qr<)q!0Pc%XIF1k(60kSYwUf;{%;?C_kiapfWixm;(|3rNl5G)w58oa6i z?4VH!AvCK`05|rH!jNxsZ_hsm!@9bIF+MslvOkpR3vf4RwIstxc8*3)6(Vg;&@sQ< zhiz$iT<OO6GdmJTJK{HDSW~@4zZvbIro+_X7;hMZml?T4Z%Y*})f#j<P!7hi8BA-P z!{kU?I{>7%M^a@ZRDR>Y*hPW;{a!DOz6_&ADm+TgwHeQaJ*s3XP7*ayEeQlT#4{Ca zBwtV|hpG(DWN(~<nvpmxbSr<cINZt3{9AUW5E+B6XbjyDPgm3A7kSh4UXJY4%M53v z53UiC)&x;?NI()J?THdhoqPouLg?C7G~gw`1!wtv0XL4{KYUu<GxUxCG==82rqE)1 zX^BXVRQY@8&d;mi+}_ck`hnZyLF{e46CVoWjTS1lQKY#(0c1#O{wY<Bw(+<{V?Noa zg(ZoE@->uIt`FJ|2dPUCnL+A8=1X9Ny0C{afNggNGU-BK`T$1Tte!o7lEdTdV|dD! zKMwWC)Yk?0R)6(PPSMN=R(tV*#q8Ki*=L?mhYGV3<TjG=d8fZbo6*=6f)o0(&Hfu6 z)<jkhbG?wg`A`-F5#mxu7n&$0L6x<a4zil&BcfX`)1j1+nrit5)4yg*lgOl)CCN;F zUXreh4bdT(Nv{rhB5}%yq<dhvpX#ZG&mi}-lZq3gP5;)jMqRUmADY_?l+UO~)d6(0 z2|?`kQyM`KHrD4TUxODnz_de`Tx7#nAfAllJE_=%3k6BQ=@KhxIuG<ACX(h2&~HAs zR?iAeLOcbRlLA%yfh`xcfPps>!vh9A7aL^;&5@A$X?tr{i~=mwkE$6vQr_VC$6&0g zO|&XBX2fmrKbm8x+OeV&6>24W#a_^)w=t3)bA4%b>%{{&n5~5S>ET!K4&VepUT}qL z*5tCAc)xdX)i(bIjQGpkoIR{y^1os>&K^uRd5Oi6lNb8d)*7RC3-}qdyQMupBtHo0 zFqK$e&czm7YRek&$ybW#zzkY<a@m!uKw-$aK9TZ?)udvmsra|%&o8u^zg-RDRZrZu zN)(^=#0W(x;Dq`s6UuWGZvjt<@H_vqra3x6e4ePMp`W>AAEM9`!AvO@D))iw<2RH0 zpUt)`GWI9OQ@7ftxDR0>_*V!B!v*7-cW9S1DDQg{p1{o?_Ak1<rC$+yyt4V3;g^7m zZog2+j(9q{q{|6mxt_S<O=9Z-Sddvp=~H9IA6U1$-LGJ2*vo#}B7YcSn(jyl;{zIr zep@|`tDP?hTT%1^EZheTGlP&Kl>50aVUmEu`ETX-0Lnh?#ZP0WmySZlv}||NIgcoY zo6|<lhLI{3F^zHTsu|QP;Be>C%?SKswFs$a1MS<CMGu0&1u-$0GT|qaB~K+h1nqgE ztFyD>Bj}ln951h_ASwAcoO?|24uF=IQvd58wg?ZfsJdoB$YT547xpY!Ze5B#G`UUB z3oCC=--a0~XDwTF#KNa-LFf1yDn%jFxOo+R_LwpW`%tjZ+OIIhR(XV@(#x#+6aL_8 zI~(ppYu+V2#{)q`ApGFmRBKzgYbOyDAz8nsYCAA}TXJaZVUKY~;>OgCO>fZ+3A8D$ znA`-mcO_)CNny{)AGPKAHe!(pg@lcaG!fb3xw?3`Fo+>2)8YEm>DQn;wrv5f6PRH( zgJ@nX9=<$M5aQKbDIg=E9yV&GaQ4;1f$Sp}T=o?*GR=gogmZnW^o2p$Ll6v7LK)i^ zU?7ew_WnUZ_hvQx8*N7hr8Wh7EY`em5Jgdt10Y4>9QGN3@0Dik!fd&%kj#ET_PTbF z_MJ2r8OXMM{JG1cs@}lg&txTCd*7CFn2(V^tGvLT(57+d|GYqOFUaOXSjugyR<0MU zBy@_f5r>xSyGwHXN0!r7-LO_2N@)IT=q(q&5I8qK?|*`QeogaHet>1dQ0`S}!4%n_ z^<zPne5IYdwe?F_LR{PS!}ecb8)Uma!0zgkyYgNxL-d-qw+_+<v$}f#xb1nz4Ev=N zw!8|V%cmwOe(?!ihoT5ytN>9)x?CF^6Z}9nxYZ`VzoaW!2I%(pK4#+pChP6?myhil zo3$oV5bPwSeFZjbee4rEOXMl&M};bJagLqq(RA8Zp}SP!sWKncB^xTx1^n%)k0>_2 zFR|9AYQS`grolwGf*EQ6b7!~rAWoyAJVt{UV>C6N&n6sbWMn_rIyd`+S-BeK3#XWx zWr$^QMf7Ld`OKmEc(q{FcB!R^zUj@*g?o^5L-BMug#IC)Ze{k~$<6|Qi3W9do+|Ty z?0sj0+&0eeUrBMQQ)YIyNb%0BZ*xv@633|*$4VKMNpa%j9H*Dx{t6^jND(AJQnTxO zpAWKEBN7DB2!bH#BUYTq_y$}}rPWf}EY!fMgAe{JiS)HNuRCLYL~M$W9hkeDOv8vm z<WR&Ewu;M3w%f?9z!+{q1lLX@>u{Qa8Vo6GXWzSpoWfEhe&R_gA;D!IsWVo)Y%6Eq zupcRbp<`)4N--tI3n_ks4O^Sw&EYsC8`{BsopQ`r=mgFOnKlwTIOHZhVPv&B%f0To zLmN@He;?L6MoqeYJ69<J3@v7x>`Q9vkK0<AjS^y=zqHNf;1o0XD!VBGOqv_u_5}ur z5)RhFXEK(UXSQYcLz#&n;&XK_lNz>a`wn#-?@C*xe#<6wcg_ZAZXI-r!q9;Ht7Twz z2xr3NdQZpAjlesqPg_%86l;8~R7<FJtm|gq%HrgQLY!7NjZxf##0bGp`Iipi&-dRs z9rME!nU>Y}&90tro`S7sZ$m!^=o%qfu<&&P-C}VKQQ)D{sU)Wb{QDZ|jk5tt9ePiE z;|r+;N%oL_I_kLk?Y5UV42CG$`xMegy~Br34Q+|Zq;}pOE}TAGcnopYW(kZ2)F=Ap zBaV@UtvL0DV(xJ3iB@pPGtIbncCi0Ta(MXJK}dEtkbqn8U}LrNKDKzr8e%GlHh&q$ z9y`<GyJchAJ6|aNR@F_hn^6{8BRv>~H*SL(y2B8xiA<26Q9RQq2WM3MWw{#e*W<<E zLn4XI<$kj;<XeEYR_Y8phlLou4C8iyxpG*VL?bmmz)T$ve`%7#7d`yD0Md+ZYC6(- z5rJiz2IB^L26}O#?dmMUNGgYz=v+AMxa@*HkSf>SV}2NJg!>`%hNNaa+7XTxosa{% zL}NkdCNIZsPBRj!5g{VU_Gd#T91h{_cNFT?k0ju%+&uB$n*=r2vYEC!8Q}1{XG=IV zT=)P(+`?`UxX%a&U*V^&y^C)kSU;w6zA7Y^N07hl2o5RTN)o7-weho_y(>=Oe%0$; zK=R*>f7`sez7hS)zkU@STl?PzMazl3Q{ptVwQ8~4<UR<IajA6^-2hXc{B1;!6kR9b zO|u+_x~4ts`ebhlqX11_*q8zwJEc?$M0p|>vugN4Xr-Kr<h%1zLx=V9AGKe$s)9UF zx=<&goY<8gHderQd9li78aft-*+UX#rU5zMw6h&JSH5Ywa(CacH3L=!F02>8b!4A@ zPF2u<zIs<cm8XzwkF7CEGneyN1~a#CVU4qz`e-}%Z(L1Z!#sHFai#60d_+9klw=%< zu2DFG=}^&nH&9X@)eFZx!O>6vx5;7I<O$n|BuBQjgp^e_e7iD+q&LftP0XR~T&yoV zp~Sq8*4JoT>Sbg6>}1dYYN7yWH{g(`e3fZw8zaIXos6QKs%=;K0knQ}a4!=|R8Ged zBRG3tmGf3yszq0C(7FuvZ%#IN!=*{W?lcmvSX4XI`f%<%nG4=;OLbg8mUnsl$J@r? zKIhVtDw_=)4_UvU9S>I3ABj&Iu5h}TFkkmi;oydyav~t&0XQD#6B@q)C@&{+Ab%zd zUkV`%E)Hi>z)~YkOAp^I#PvWzhIUtnVu~gcK^Q;{Rb7tPh_;rKGHfWlC(nOt8E>k~ z;k&@IjXaNA#D;)5yTj+-(hd2qZvlfha=orOxT!=3F11>UKpMoec5oxiO3(Tq?;SwK zpVn~R{})`QP=EgBaHbR-t`C}8?lw0+?3C_64v1BK4bCDzIZ^|R*jHgaqU0&5x3K>a z79f}6HnBn+Csj7jwQu4yu2K$y&_oBOI(ZfDf@uz)KAniby+Uq)K3ex*^;X-TH|i7o zIY|~N#J+_3;M({_;-LdV;+)rILW#t6)R^6cpg#^!eUodganoiW{8q@7YT++<mQy5v zGP?ry%(?`eYs9x%IA5nGLyBboq_tj9t~o_W%uA8ZJE{TH{AgpMvjF$3Qg_;QZ|i?O z3pz3JX^-V-QmV@{^4<N3Wci3;g(3g5i_fHhtyL51sE@zM;X)XelG2C1!Zk&OapOaE zYyn`}1Wtkp$A-3bwC{iImBLY%d%WS;|E9M!<J!24dZo%kP@MF%u5!qS4^hMrf~1tK z9hwF>RJ~^c)*@RlowW9F38Q^rHKcQhrugY5mAth*yYdawL=6YFmg9|knh&^GiK9J^ zHn;vzh8*s~X}}viL}s0EkUSiov0Uh9x_>W=ih7_sU>gNQxC*DvU$-a^+)&w0tvCH& zk^<e&8WT6tf!-cmyP;;**}DG=3JgCR;6_A2%g70f_%bvkeQMajDt4lR3Ekf7n(JTI zZx{05R^3o!VoFwsdxeC%R)5_BJ(>uPg{KPcxcLe3hMvGJYdaft^>tC0%dXVc)6$TF zth@`Z={4oRy}VKRMWvxe<@UCm_%O~um?+$j?OP=<@Bi}I1h3MX&(KEu&k1;HQ(5S{ zEeX=m!1%eHYk?!MwvQld<wgV7l;-aiPZnaMFee?tVywli0z$*h?w8l6-p4&)#HQa| zY=H=B2M66|;QCk9>q?B;$>2t}0>8d!m9X1|IJLEH<#o6NNyNDZ4`0oItA$D#%<I=o zdjWO}g5|sA#Okzvz$IDvF#VZc9nqq`JNcJ>A7lOXtNMKq+7u-_I6r$8jL%P&8!6x~ z2)8c}#C=_GbL;|u!7lA=buKUe`RVLU$o1BDKkLit_aAEJa9}5B3`_v4)uujtSyIdq z?$f%_(^U&kXfI;+U%q;_`~3Xuid;Kse}C)kbIZMC((Es)hiAY!2w^N$iEMfLP<2`u zmgR_?V*fUB3o`IAtFE3&QwWEum)+&a<wE{k{tNb!SNT=-I~YLWYnL89@Y%x}j&DCv zGFmRd6i<($`b9<HvTOZcX45{EY|O%Tt^iG-oIq!}yQfCEQB+RE-|n7C5m@GLZtg$0 zql@kI8oBmUb`8QdVo_`PtmQL^*1yl>)I_F#DmV?~ev3#zz4})CK8h_sL`(!I{<&Sq zAP~#W;uJDf!2IZJM$K2?u<u2Mtlr6wg^Zc`1W1E4uIU^Vbx6-HI$FuUCi#ON!ubRl z@1zCqQOlB>K()VRB2ay3`qzVbmBbY{Z8YNg+R9FPO~V=)1S-{Z2O@*wo@pQftRTQ; z^ePngP|l8I(dP?shHFX6X07gkfUZTX>6t>@mRVLk1SrG-hkpmbJOR!hpAHk452YQ+ zrb`)GIBTrv%jTC(t!l}DW^!6QV7n5&_C``jIP6Qi=ndZiF~O<@p{IJaf$Q%V@}{|k zDW?tqW^3Vi^woT>U%q->(Pw+|?WB&=P&fueBrCvt{`^rcw3oH~D@w2^LLOr;=-#6F zak;tzbC}b<lV$-3Q^Kl6eY}3JvX+@pYWSgtKe0^XGB(0bT6t4Wvs!VuCnw8da%)?$ z*{W&i@unTOV9*!Pu;b#sdG!W3A*-ja>sow8nwI6E3V7EdmTx*e*>3eB6gd7b#I4Uz ziy#bNc|*b4f|oHpfu{LHoWZR^Zqh*)^Gw|et2>kB`tc`Vt#8?lGf@!K@j~En^^5i3 zs)_sG38(6-!ly>H?q@SW2fVQI*kTTe=&pMhg^`Cp^kVJo(qI8#mVKhA*POJonF<UY zLVM6lFy*UT)~NL-$YQ_xf+#LtO{2ywxMKMHRQ^X{i>i<SF@CWzmJZ`%LD5@aGB6@q zZNc>TypZWw)$#9E^%E<)_rbVqe*8j}K;ZiXR5<bnLx$Y&Zn3c9zVKaF7|zx@II^_H zviaci=PO9Rb2d#ZW`FNzETfJpfQW>;S`%xoUwox@jcRaACsf>!UB7ku#tGIfkHxCN z4#?f9@-OcY{6?Sds2Ux9=<)FiJOT6g0z=;x$NzcTLO^CmgNGGnhXzA_{AM8+&?+@r z?$r1>r9Fb9rGN*oF*|LrC{8Z5r!ZUlNZA)gD74oNl12}4dt>~CYrJ6DyQwyR!gzOE z5c>W#VfXHU`}FSSwVP@^m*-IHbD*+#=I*Kbzv$9p<WCR`-kz-czwBB&s%iET?n;NV zA!|sZnY5tw`0?VQ&6-YeVTkpO&pNE-U)Crr-hErYc#-g6r3~qcd;T!(l+XJ5o(`l# z9?&8^H+}T+LvYIGAb<qkgc1M~6b-Xcq3zLY3U}xwpqQ1DLKbdL)162-;UosfVEb%` z<6zl;5{A97S0B~rUkJpUFt#1di&GZ_pSO@zw}fSJV#`H~)QGuJKr^U11Xb_UiKK}H zsb_YAl9<>bH8#MF9CBbFFH6g22&aeLF;o1nRNu>AE-TCq{vcxu)<HoN(h*is`j1Gy z>Gs0f1Ozw4BnIz3Nsr!@t1RLk=ca$LOo=pT#EwL0EtRCXys1PL?cP|MdAy^%>tkb> zJ72Sd3KZj@h3TB(%*XrT7?i#IYKrNJF;A#7s575_nlx~JG}V5XLWWyb!ptv)&t!hw z{M=U0KDR~06<7aVh*baWu^W#0@z+8GHd{aZX_)bp7CnHRkUCdis>3^Sy{4>X1yCSJ zKiJyxgz!*_<>h?yWA&Pzr89nkU|)Xn^z`iSqkF&Vhlxv*wS!Ascip+;Fb#q;xKGYx z2CQ622Vh&7KC!LNeumgj3jyw=hO}G2d<!pC_B!O5p8Z><vDC)>*DzgtSAcuz8&R(B z5&X53nK3f{I)1m@IgxGOFXUSAMEwq76>6()mCWH3pK7`~G|rsLDmkU?8;%(+z>bK0 zK}hzC*_aRBP~NtCs&8zxm?(Jz*O_nO>eAsQpm%V$@9uc$jT4wddA^dFN_n-pt1=X_ z^>;EOSsX}J$=fHz4HW+KyR@493*m-XN8fwApyq(2-!4TNwXFJ9ppG|);^p^Yzg1L$ z)DDo8CgTP!#gafK_$HJ8L?m=elU(=n_-kNj)?j)5J-}qmvhAZ5QrVnB1q|VMp78l* z`j^do6Ro~Ya1NvyXgTqcw5`_51Yw!I-YSN{N(pRIDknPtN2_Gz`5R}4Qmm%sOz`4z zHSmN)uKjCjS${>72Zmz&p*FSb+}pSf1mGqU*a;x7jXs2c;mX_^Mqo41<?!trcLQ6# zC$Q@~>TPf!Nng7#rllJxCIT3Ae0WjH<@zXw>l54isi&q*RQtjUk?yE?GQ6nndLTI= zPkI;ZdHM=-A0D-EOrBDs`EK3+70?@}+BMk+;NdCvQB*m!<Eic{ny3&YTvlRix%zC! zSv@WN-^#N1$mZ13?dq4d1dL|tFD0ew=Z~ZxnjhNMTw1BCMbi5Emdu#wYBNaHH(=wy zxOJZyuwm@0!{T?>fOaNGPl8EDKT#G;kfeXH_)-H05Z+kSkU>KiO%u~YlY;(5Uzk8j z)5+q(Kc19MZFv`VN#>_xE!^#1RJb@JdR6v)`%kk$Lm(y=kn|(m42pvLo^Aefp$;bK zU)a$qxLylJ=jycoi#E78g$n;@%N#U3gHgZ6JOMbhQpgTL`EETa{<<QEC(3hu(o~_v zv}A=`W$I(wl^ctIp}5&P;(Ih;uF4u4pl6HaRjo%>?pTRcd-@@U*h3ld;04!MvgE~y zLrWd4o|$7p-6HBy6dvI`MVN<=5nQxVKWH}%E_=F>KwyVzny5mU65^8<Z>=>(uu~o4 zpWYFM<w!!LQ0NXaP=q(j6CQ|BK)^y|boVbnpkMEH2*|%qr$}o^>YyK!tI7Gny07gR zf$tRJ?3ijXVOsx%pc!sTjN1?=r+};-QzH)T%>Q8_LaY^#sycZ}4dO#Q)?)tTrj;x0 zpC#-P6~`I9DMLir0d|^%+Mxu!Yi9@5PTw{5xC|!N$h0F$RNT*Bg}5&?tJnQs1c^&K zS?qg15fp<iZWnhU1B6`%s@>Di0`JwqFA|2<$)Vk!)p0qsm%fxb{THpmqzhUx7Y6ar zQ5arc4*liuVxn+MnbEa_aNY2t6V%m!g9PC+6Vf+I9T$ffYK1oCfZ?Q!lTxJ&tr;(; z#Eubh#WkI-fngHrjH~#bs{XA7dt~ktnBaL-ku=!<u)Gco+oc>EceeX>x-w>MSDjhI zh15><e}%ceibX#D>9pE@JQ`J8t?NYTX^CHY$Lb400vuNafUHI&C|mS33ez=$$QU|} z^e<n0`;o%v;I7_n%Z!4>6{NpTWw8>KEEl5|17+#zHxRJG(*f4Mzg37k$fuxgzC85S z+?ShzZd8W$qRvuKI&_vyP&6~O!9)}jr(_}x^YV4*^zZF2aA08B$iHm+lhPoi3zJBE z7CUh*%1%`+yD}3_7;q58Gq6WNf<Wd{Y=S+N!4jy^Oz)AAYuDSO&(xkuI5#J&+|k{K zQrE?y7o+Iy5{_S(p4I;tY(<4rBl7A~*m7#l#$g2?7$7VVY>}+Duq_qtbc4*A?dZxL z0J13LNgIco#gA~JN4|wLj3aT1$_<$IZOXGJ^=bF`1d5JpDye3>5T{&xcg>vJZx7&X zjiuIh1Ab7p>b8&k7gi6x+{lD1kuPRTV$+}3f#5q+OGf}yfkI@Jh{GzI0H4n%lo7xb zg7QC#-y;*`AokWYr+9?g1(4glfp(L#+32jAK0{@Fu#G`ohw1um%WN?!Pvr=4DLCAV z61)^7(_#E3BL(6>u<1(A2z7`|mY)f!>;JM0#9mo4zE=m&7viEzVP)k@NCth68uBGf zoaoI&HJb=~42-z}Fqq03vye8{!AM7O3hVooLY}m0TYl7Kvw2%sI1A_#nFA(BHoVXr z&7|TtlX$Y+B#IH>dgBO8#5Q;_u&_FmQo+}vB$b0~cSp&l`pX<joOz!%VGrgBL&Sy! z7-Ntjnmc+^2+uZhe^ZmG@!qZf@#;6@LK02t8QTXv2s*hmqpZKH4r5r^)mDGLS5umW zrME0ME0#AJ6A}$*7yTqL=*c_}7Is7qSdk?AF-es@P-ena6oC{wU$k-d_(2ExuXaGl z=&n<=P_go-%m=q7POGXPfsx5TZw<%T!lBVH9*PrCt8=*<NehXfM{Vmbhp)miJ2!CV zWD=NA$UxnxsPym-ySwtXP$QT2-H!iK?B7|KqicY^n{5v7Yac>5f@Eh7aylW7){!H$ z!6~Gq(SUG0wRPit8NzE>-v0$S4?m+7WY-k)^>kiX>L_hzE$*6c!6}>og`?HV?kpKN ze@|Qn<K&jOZ2{t}BG9;%8_{-|?F1aPV+jg%VhZcx`QgnoRQcel7IDglj9C^U=WDBn zGPls#ttvA&8+}i`eO`61?qBvGU8x^98C~24<WW~dtCP*#vhtfkZYzp4YWsa;V&J;V z4-^4SB1!F_!ba`THi`U;K`oM=>IV)+7n<bpf6qQ2L^=|gC9f2+E9_5^0x6dUtm$^i zcV*)@mxl-!{q#&|)KMN;yvb59Gx;vuHHhD2Vk5~$u1IZ<(s5vbw@we-{WL%DM?6;t ze8WkC*@T<73+XAhq$IdlCf-quF!9nvW_X$SX9Ejp%(95LQ#wbTA{uqASl{Tpf*3Cc zv#KbjHK_Oz1l?z(y8EnZeX6IXgGL9DGf&OJYi-i_?$c^YXbEBK*xA&|LK%>3nBgv+ zC&pTqG)By$NuL%|s!wjqFjd*06)+lTd&6@T2lLPk_>#$Ke+jqG<RYT5mgIC&)rplx zK8VRRtAW9=It=?Ivd%W`4u_9;+^?=a1FB94axQcGOU7~GYNB4tvrhy}IPF;8tU@pl zLt#YTUBJxBT4D3!fFnT-8EAo=oQSUXe}#<=`uDeF?5&l34_F<{P_6%qJ^4@8BTX!l z(m(cL$tXr0BbIM=5U0*195~}1geG+N(GXUuJqean9{QV=OrTvLgYvBFwa$eSFxMwL zz$_%KV?222A78vX83w`+hq5IatJ8j9*Q*%n`}cLBF0xomPkzCDc2&bRL2d_9IM!uB z-Qqtyea!?D6yKv0#HBcTU%Bn{w0+_;CC^SbkI+*ba~`HT*Ccx01qsjIBRcN0v((f0 ztie?a)5ltYAd*1psZwpQF)3RxYe1LOcnDlk(Fg#WqG7i|XNQLOv90uIf|I0J2RQ~% z??Q~}Wa&-P%5J*!Cdtifj3dsL?Ulj>ER|74@x(t-bjXm1Ad*q(9wh;8af*?0CqY8l zhkHIOrLlWsV~>Gh3WA)wK!cT(yP@)zdN81uj}<#Erey1&@s^`CC{br6QZiP~O6^c1 z;Z#qQ6y%9Ladh<cFWB0!IFF*UpXTE|%QPbe(X~mYH&J?_Urk%yQ7u;0a|J7AvH9^G z5mtZu2MFD73R>3eD}^{WYB9~(?Y}^uhGNLizJ6-eSo1?7hAz@PatS`cbftr>4yu2m z=|aad3U9pGC@?c|ArQNncuu6<1#xmdmLx`V?*<G17$IX9$qtgi+3PryaDWKrd1y1? zW1owb#6cm6GW4xcC7sFoP=<}2&h6@nLeA_Ol=RD!fBqT%GGpHqt#HyURvL*cRXyDx zeMaE~37XNlasWj@y1#K3K*N6wo50r}-xV%yLDc#RX(h14dOZAPmI+WDaX4`$z{=#9 zs`k=c6;l$}*NL+;#-zhUz$D}d2QAg;WHHH;D$q0NP2vs3s0LytQ)^e+D9h(m2d9XP z^t5_XQI~j`V0HW?)ZcsxhgLm)cC8QxG>fTXwS3qX1X$vhfCHF-Z~hUt*4<wlU|5oa ztDuhEYlXZwbfuq41qV)xAI^>I5APS^-m7xq>~T6Jph(o~g}5tkvBT1G`vSAiR|izu z+DAYByq0za4(VJj*1Ip-Pe%oR6V(WY<zq9=H{2jU!x^}TUiLXR_bv~vz~O4PBkxbL zqCX7V*}oG0FCTQHka!8Ooq=GCOt;U0w(D>JKEolYA~rw&CfRrqagY(MG)HTnIH|_i zoYt;bd8-hLOvCx?OWAX)*U?I9b@+fgKVhX^gQ15M+~vjR>X}#K&>t4X_x<$92@U@A zf%;EqwhQl}o>8nhxl%}dRey1PR)ScNP#O0umQIQ?yul4efF%)uV1{bwlF{<;12vYJ ztqzvPk(?-xqkxRfC1nlKVF*5jr2PNV)Wg{(Z)E8qt*2lo*w^nXv4&Hqnxzc^ZU?-A zDe0166(Eq-L~NWrn(zxHq^&ix0f*@5M`nmdXr{-(ATrFZS4Q@PSE`%})6>V7OJn8J zK$$ScA<U<XnzxPdkXr9vLTnK}OT@o$S<ZX@^ZO4rJ~&T<*}~LsiJT~lmG%OPntFw` zvN-rc_1-8%g_aDh2tc0xk_i*qf&<k=1<4f=<_1WFW~5pjagYz0hQkKC?ex|I%L8U{ zfuO2BdYN+jp+H6cN1@{U6(Icag@gO@<JtmuqWlNNeIP+sg+;@`l5tRXH-IvQVZ#FG ziMQ6N@Et{;<pL(V%hNH<A`)a2uJ)fpa7O@|u7RR+bn`s`xEylVtrWN;Qvr>d6dqdJ zIB^|hizci%->K%pi7SgtMAEy|+wC|GHsq;q;p7dk|41f5BAsV|!M!Rweb#cz;_m1^ zUCN;(!M5zv8iZE3c%`vPfI`k~t9+KssbQgZWOf>+eGsuQA0*^6E1pi5jE3#nt&S<2 zK9^9dzbML`(Ep?r^GYKf{kc372lKEW5S0(4Tp%>3@d$>QnuG;5C{D~G+q1DVgP{#{ z?Fg|&HuT7QSmS6wnYB!Y#()kxJ<CKw?&cC5%<R*~OZB*gFP+LzkZ_7Zh(^#1ihG)a z$UQC_KJ-#lql1Ya^@vPJsu77MSri$YJ`odLavN0Iv0W&lBf@m0h&I_?8fXZI!*6%p zEruVh?`y&&vXQRk=6#58g_JlI4U&oAWFEMPQG`$R;iQEF``IixM;}Q5%iKoW{^L5N z7_l}Eja-tZQ#-hkV0%w-RKD1T^`Y3H%ao2q_t%s_1jWF1=yaZmT_Pv5mC$?MATL4^ zgdKDYqv(Z521`g2(L7M30_iuC;BcC$57l+KC(-~8?>vKM;VEa$*qPM{7oFr__P4ea zi2kF``}dDzaF@ilaY2?s3{Vgx?GT!**}Hn<dwji(BAr&4^^vty&LV&ljacfjsKc6a zFqkf-E&yf}U1J3+9RA#VLo{<^H`riqmN#2aCEI-br-o`%@3#GQN8zXYQP9!;bl&h7 zclojoN5bBv2~84pk<vOE4nTTNlm=eX*HBHOXgBO;z5EDHG0ryQI!OqW9AJ-YVZV!2 zb;J)*0~4O9ez~3qu{0G&qlnZZpVi<kPLE+aQK4$g^bxxp#7wx^zN6&Awx36t>cg+T zSu>r%M_5*7cvkY%^JV253%1QYDAw`&FTtC@0N}XYOB!j`=(2BQosAPeQVhy1kp8dN z@;?ik8LBac!Rs$->_SoTO1Y3-b_8_jp(fZ-vJp--#k!=DYwMv?!%-wA6BNlx%8ZQ2 zbPnZG3DTb0B%5Ssn^qHzOO5Bj7)l3-_saHARdnhlTL&fvH;B{^w*iP98Fv{|7c#Zu z*@csZPFf-<5u^q>1!7GgbSExc9^!)MtC>O_EtILtA3NM1hb+>sCs-N%^Y1u`^6=7F z9V!`|cyR~l6uyE>VFFb;9Ph!JSO<vIY#~ZaNU@m&DV&=ZImK~Upvactih9_+Snreo z$yxT?MBdgCWtyMZ7oI7ie38hE8Yhd}+yqJ02eLS69Jp+~ixMASXWU!gU1VWN?Y^ZN z@1{b2yDjVkQY<D>%KYe>CH+AyNot&<b~aPRo7|gp*reutI!*SqyjKyvq-yPJJmL_7 zFA8xn=~iUvL59oG0Jh4D0&YLue5%s^<{!OeOKW<A-U_OK{b%lcnXQJQ{fR-Bfj%3( z8PHF7j^FIWrAk{kK@k*PDEs-#ftH-2`X1SXt6vX@?NfuM58#rXV)KiL&&h^$Z72xC z*6;$;;rZo1kU5A)lz{0jCJ*2*N>9ST*y7cwgj|qSj}qaTTaO*2rbcWA_FgQ(=JXk6 zkfyZ!o!1FLu$|AxPGRlheT+ohNHso31K1<KW{~$t0JE!bs7%l4mt8#LRRJwU+kgT$ z!ey(+&Yo-kYsBPToeN)x;}EMuSV`M_{yF?0HS7Fr{3gJz%b(7Q`^Ru40qpV1pw-9D zEcX!fFXx+|{}ILY-Gc>wi0iT~wKy!Eu|zN!#`x>+i)XyL428UAOhD>NlEC84RL388 zf7UG(^PQq3>|x#3pV>O{O#v7AJ>&R<JI(7tZcsY5*PlKb9_l41-&HoM2Q;;w@YbE% z!quYhgnFBBDm^{8&xn4b-oA9Z{aSA1e+4)Hr|Z@JdcmhECID&h)9`7mDmWH2OFF*! z=r*Q%TjR#ZVsAztTc>~7SPjE6e_~+zs2wf|biA;ylMXmqZ1U!Fr|ePoF2L6N%4)XE zM>C*<L5vd(t0-tK5m%aR1A#Kr`4KR1LJVX1ce(nYr#bvN($-X+4I&1WEm0F4CmZ}& zz+nT+<Ii;tQLC%A6`NSb)oXbp`xV4KrBW8$M#>h7LsW;7QiBD|t;r*2GTg)HJr?|v z-9Dsgg`5x*;m#o+5lNeRF-BkQJ|4$w>>-dHBNPG|2Qr_jO(A^r`e-8>qv?Yr4sjUk z1e3ts4`!tK=vt=yXGBSY8+8y7=i^9#;+$NXK)KlB8>FK+K<;O}9Y`dV#A;*<FfSTz zW_EKf`hb=K+sVg%WbNi%`|x9Djk!CgAD+3%D0n0OTu07jd@&~*dSpi}%B!=>iF8Zj z_`wXzncqfJh5lvD5}0`6IHf15aH5u|u}qoMwe4b%n4i0OvHktvJIEP0`T!1gvjhg5 zXAwE&ej;egCm^@1tna=4oUQNeKwmF^hZetWA!W}Fqq1s$C_s?vR)TW4&T-;CY})2w zLAP4SgTmnJsF7>3?p8Iug!^BcXD8&BDC%>RzF&G&Yl@r#x<<io#wgif*qS%`<fD)( z?By!LEz6vNEGAWpaJhKSt0ku2v4FdH??x}Vd!~9+?D~>4YdL@gy{wLHvPo~#Qj&!Y z6)ZY^b+$IiPwIPYk&bXktR5@rVf6#2QX*n&V2IEY$>*L0DHxIu`#CyE(guz}BH}R< zPog4Qk(3T5SqgpKyUc6DG5oySDVSyTEqE2MB7E=}>@pZF>3<Jy*z*=ApjutKx|aVD z4HQ)Pv2AiuS;m&EdE--^o(6ZIfVG?p2ZbaBwV@TQJ+r8{09N7q$FHjY)}eJh+TrC0 zwSfLJ$}*oS>u#bHByXq3^2U{Q-lGuWH0U%|P5Vc=oCv25!w_m!CwfFeh)eIA0uYE^ zT<s}c;rK|nws}!ad@{UCUK)5AK7)u(dImF~Y(%PXqIsm5+FMT`m?;7<*nFx6lUNlM z*2q2z_^MJz6F0l0<+Du-Pz!1WfJ{`pV<EY_HcHt@lEU*1Z))NI=ml)V3Ll0i1-v!f z{)u&Hq|w3KvU6Br)&~E=?i)E<amGkAzi(SzhaAk!?dK3Rua00E{KC5b3n7l!)%l4~ z6M!m;soz^M=>M{cim0$2>N&%YM4(6`DCYPVy-$1{bMys43Z(?M=}`~xHVBmIgh0~} z6iaJq4&f0Z4HYnnFs)5r!9j>*#2++;WmW=PCkYar$flX1i9SWNaSRaCLK4~#T*$Q5 zFkp*mDm9AK3Ontbw#G?P5;}pML2xBbyu60UGj_#3NHejE&QX?Me;^>V6KKi5xaNTI zanT!NC(pP&7(`*g8TFY|WM#v2Y}XL7NUl>TqL_>b9^bCw)Sg*&upS|EED!G!YE1k? z^ijMNsle+O%#?p&F1Cx?h$Dm#ZSKze=pX7>a!zy@eGk1mxFYFa78ccZwHrv?cyBAp z&i!cEtcm5mAvb}D`605GPRk=0HtwCZHOuYMnYLc>9)LPI^H(SO4vxZ4Ja({dABsG^ zTz{a<Clo#6lNH+1B)Emh_I#WzDip`oIcq7_925@<UqIii3v>U~N9{k>%SWIuPT(VM z{rh1dF5ZHlLTRV4lb|*Rk+_KqCWRGJHj=PyMYNQl0QH~8JYK>USqR*A5(Bi)gkbYb zCQTsuY@-OIH_?duXsXTXgHHoHdBLY2NV}Fj%*38bjw;Doya8(I)`AJ|2gTO5F%oS> zD(^qsa(gXKoV29u#Z(THYN3<y1l&6snx3X+vGC>zY{Lv{+}Oz*rzI6J%m%S1LJhGB z=^Ts1qbZ7kuPD92*x<$>LU^0;1C#kPZVg%b;1I|l*#(Wyf9&|~Qd=i|I-1&5qc;l< zE9(_iwv|rliy=&9RJG`?Tab|vo$UoOP?sb|<koNbP@KFDn2om)YLV19yFn{1$^Rtc z*dR!^cns^4U{XLIVlj)x9gXOeFiWa=qc<ny$sZ`t;BM>P_I)VXSHP*G2MT^Ko>^&e zi)shyoGYY<@}tddaaD8bK=e461}6uOSKyq^mFc2t&<7+aKhwLURU4rMn}PE8oJ@+P zW+2Ag2K7hw%ce0fg@;L=xHP04<ujPhhct*Vh*&I&xQRrWr9LyMM}#`fhO<{?S)wtM zrUZgb#6}|0fvsWHdaa&}(Mi#9&*=}qwRul_3AY{&)9mVHs5mEsIlFnM3|KhjY+^&f zkRV`51UZdTcGb9Qk#?}!7f%CO66aCPW?0CM7jI6V+OOU`1yh36TK<<}Wby)Jx2P)E ze@+76h1Sw<-y8mlc2AKOEl+l*=-pLK6!Q8D__FE$DlB1w0dZ{w1qGULLKQ%>dI@*> zDVC|11j`K`@fvu6l7$2jNtE#ldbr$1cOAzljuf<FHVhDfB@;-)wLbYl2Sw!!Tb9|Z zoZn`#E3hGYsj`OxY!UZXnEb%TVg3s950UYsbZDmvhVhw<P_pJGnlPHh;NkBK6|hM` zC>Fy$Iz;YcqefisLqJim3K<agFmyW>JtAluN{}d?jHVNRR)=fz0Ha16w{2#d>B|d~ zs|(}}2-^irqc->2H^|It&J2U0WirAM{n;WLtx~iYHzMnf;sLZJ*Fy#MgS{N0`Z|OF zR^{8b6*JnuD0*a8@MS}p-_2!8RvrL&@MZZ9lzbl8d_tJi>kU5t#mTyTQYh4`lK)$E z{8HVvxjQ;G8+Go{w9s$#@!5yB)Wl^BTD`1|pMCfa)rckMm@Y(Pk0in|JLOEr@<FmO zC^eO$SVHHtvzb6nC1QAZClOBL%t}PuIjA(duCqF^-@cp0X3bbj{mewFxgY01x~D#c z3-9hw9@+xO(TJh6f8VsqpLRICAcpho#08D{L|R-rd2%*8nj4rO6Zw-CfgbxQ_(zKq zJaUu?{g#CZ6w2DC%1-pj9qNhGyJy2wf?bc%W6c#hT*<wn5o-XeRf|YxP9WlAZV%)_ zP)*&sRVWB}Tqwyd`;&-wR^Did@?+>oqqru;)pkGlbw0bdi(!n%Jr;`rA&M>$G3wo6 z{%6!Bg|!QsQzA^QQlK~UR7)a{!2?Jlr5c$}R5j*RJRdaYa84h-8DN9uZ@&`a4&Fep z&+=Ou#GTF=G9t&eNr`_lV4(8o9GU}%rWCj*bs2Dz7bvrHPXb1Rns*3yj%Z~153I%q z-9T}$b}QLP5W1>Bw$Mb+0atytuaZKKaS_M)OVnco;D!U5C`xfX59%pdgNVK|(W2mU zs`~J3=!JUOpyN)I-NZ<VxHjm(jl)grx&%1<{tCFu7&E@7LMOTyOIYVYf*U^I(%LQ7 zy#dyXq4Q3PJ)zEg$=oOT>ugy<6qYa%<vtpz!ud7p%+Ou(v*Nd9{Y!w0xI5ex6QgOz zV|kJdzFhmV{_}mC4e!3vI@bdY-3IL`oCv$28s%rFh;Ww#S(S+h;nkc}V4)TWGZ3}F zjt9~&u2>L9LD||z>#eWVz~0A!l~%#0q!iNlV9eC<glk1)@n!Wpg|>40!F@)J(WKUi z?M!Abs!bMo&8OMH34037x+?CsPR(=yw*?A!Y%Pz@Ecs>XNS&<u*>~Ln3v)P;V|#Sd z*5{YnuZOS5FTP{-Mu~>Y2R|3)2}46K#z1i(@b|yJM2O^m=neR_f<@Nt>YFYL6F=p2 zj2)?h{h&Q}u_<nK{;6s-TfwnA_11xz{A<l2B%aBLNEJTA(Zpp^Y>bps108bBkr-dc z0~2g9s&G&VQ4981DV31TWFO%W-45pj0&t8z4q$R>6>54q?XeI<hwx<kvU^K6ea`C9 z;t<~hlE9D^P!|vd4Y6hcgF?!FFqGWZkKU47$ZfUpuC^!6AKYu#)?Y51!oAzx6#&;C zI20?&yf`hN9&c*@sGC>TkI56gmtAF-{$<S-H7aFCe_b1k*SWbnMg-on({=yX9Og2= zBhb;qBoE{f$t|P*{iDLRS$*^T+0oD14xRI}uiFo>C8s=7CEEXvHbx<Jpxo<ld+PBS zT#(g1y9ekva()KwEpBLMk-=SiO(hA<J8-wGUpX_!+Whd%*NE0e)wX|OPoxwrzJfR* z*wR}5wKk-rX^SnEudn;RBnrdNzE<Iqcu23bJKuwpwQe|^$8S~X{N%|u<`6jvd7ZKW z0kD2;ZIOk%r5W5jUPBj$7rUw|#KI|o0H9Q}i0-5>H0U!k&IqZN+b`D?J=nGb#B#;E zvE#pOp}b?)zo4zx*YZEYz-&I{7Ov}AQ`$wN`+6}uDqI6)z`XbR`rRWSm4wrjw?W}y za9QS?8A9>yM@L8g<((rsi8j!-g)IxH&S@_`swGTKfj%O$c#9ONe05=2b$ytW2ES!R zo!mFz99YMAyEGD(bQ<uhs+nwoDezv~xp(VDl$T9UC<}H`B*ej%+rI}DS1%i*wV^iU zXL{QV-32<GoZ@7`a6^L}TEAH;D~9cr8pj<d_nKt-RN^$EtpH$;I>Pl&yKNA9H`*4L zHz$Jy+;+6O#%6&X+HSGCNicQDY~Pr>6wg6;cBB4BoS`y*%cjun&td9-0Ias}C>uFK z_p9p?!G2l+{|(&wu>GacF7`M-d;7oduC;>+#>~~vD_H$@+hPU0>YPKUt-IxC41Jfw zNmmn?-e}m@Fo9GZHCq!i-s%VYEm1I8)R?<H{s&a=>@S#s!Q}Gn{qmo)`;xou+whk> zt|0^HFdNGOsS?!UOj4*4!FNe=n6kBhRY%uhMh3sZ4*ce%1GhN3{`u#sP~Q9wOgZ~r z-cjGeyCrA!%k6ce&1DN@cL42PHxO7Hz>Ume_Sp8~WVZk@IFjt!?apK%MCerpK#xIs z-sr&}w|^~;A3~+9me0xVdQY?N>+`Ub^3HXM9n4>s`SqbgFnPLB+=ptw==#8<*yx2q z-%9>a?lh9-i`N7p<>bDC{x40+EMO1ZvbheB-neodmR7(&%C6sde0%+0zg)X6r^9vg zDv%Lqm}S@R0--(<MHGY_And9aKfEqP_Wb&HU`_AB=Oe&Nfc*8gYBXC(Az#+lfBqe2 zhGHfUTt7ZL1u1AN?=<OaC-^_<KcI#Oe+kKp16qNtK3b1oEbe%md-&kFH#L19=Hg=T zJ~H27;K{Cl!8XScv&YuhKp_u$gfybv*#60ZDL>i_q6SB*j0LaL&N1XOrJ!R0AIen_ zR|Me$nS{l=yc}zfP&rK|@t00oKZd-c)9ar~YqB`*Wa>mUt`u~@VfagHHWP6o!0TiO z6Swx4iM_I_BJk{WI8Ns5ty^G5b#jd9Fsk00F*rd#YZT&n{wsv}Mo0q5$B)6@d<&Ic z1oR;eR$2|a+kT8YGSVs8pg^+6b@aKG;!)S|^Wyy<OobdZ`V-t32uu;?^!?}0UXZNH zG6ai(L7HV-fJ1cxoIQh9cFNN4MC7nFpaZ3Ef!(-uU5=ntTWwig2a#w?E_Wk44(sVl zVU7m_3F34jYWxaJ5zWal4u*ls5DAMZ8sU8Xr6*y4%$lVVeGtqH1Vl*Z?nxWTh4z&& zv_UP1L*`&-{Ig*5`Cgg?5%|-;yjzI-NVAE7aIU&-n;!rVWn}UXCF#qGyk4=9UiI=2 z$OP^bNUuPm&cw*Kd2)&L6j>1hdzC#dBjd*EX7d?9q|IBMt%<=DJTagnSRXK3*-{HQ z|76PQWVA9I8AIZMEW7g0kvH{e@$ePvKzH))Un7^N@A8?F>Jmm%&3-7|?U4ON4!7A> zzt&Tmn5<wR-Z{?J3QmkrBk9o!JSuN&Zg~@KAhmx)2DS+{pip15-8q1M!&i{I<zr{X zLs>099<3$x?h=dz+oMb~x#u<mthc-ard*jQ!K-3?y>FT3Iim#2#q&>f;luK=vv(hR z=M0ug!0lM>ytX{g<qAewf(71zU>xewg!quR;in^Q4s?F@R56@WhY7-OpQzV<PL z|D2e<T6Vm=HJxsOM<ea9SSiqJ04EP}O6I97DUlwkX+INTa9g8;WmVI~Bk$HEwaMmU zv3++Wv&y||rbWl*a(66Mq+3%Q-n|*kFp`}pF;y>KYCSA%fug#8eC-Z^y8@*RIEKf_ z+LHVE;qPvZG=Ft7k?}uZ{cgN0scXhyvo-1p8+}*Iysj7vlyY4N0=wHD=0|eoCK|yF zEqLkMogPyHe93DRroGu7zRO=Fx#$PaVj?aCMD^Ad%o_*Zk$@Pu=*PJVb!^2r@Xy&* zm?(n}rDk09>K~Ak>`P%MR}X%&nMR08X1gQPl9nr>LK~Nk?3&j;q*|KSK1_H10r#Qf z83H*}Y{-(qkUpX;yO1!fzg<@4bZvR0Vwhk9<aJge<>!uYLYwDrw+_au|D3)1HzWX` z{iAHe?(DmBm?^;=>{y0AS~tPwgu+My=4oY4oIy$<N1&`n_Ht}FmnT;aZT=OW4YNJ^ zP`a{{P>D$(m|SEq&)d4EI3=94I!y;c{25%&U~Zgu?xt5B`_BFfr2ZZcDU-0Ww2;fC zhV7vjoj+g%{9!Hs<9Z}(Nn{AvEssK!m)`6IPYdD<#3pe3*w*!_jE+X$bd5H+Y+n3& z!mmDJw>|zL*WHb=E<u<%U;NeU;9aFyCCt^^nX8uPBpsS<xn51x?=NWdl~MUa$i4c* zGF9>EEI2(&xF@nP7Dv!Elif+@g|gi_|C8<R{6lf++hRn2o(2%c_}$_$g4kFA;)l)j zh$4t2@5!V^yag{xUI>YB4kwE58L{#^If+_?o+}iH(~BpfTKnG`rN=J&6MlyOa89v! zIJ3NS05}6ulocVLRhz&(d>XtY+?`Ve;OB2zLnao#)L+9_y&Ol<HZo~e-28h;sSN38 zOT?f;pcp35rg=6?Uj17EAX@)=38RH><|{yVJMrgW9T>K0Wy?`y;+}Le?Km5(gOD~% zkTdJHmHs1PmdsZF6G^meGPN|D<wDl_<O2rDB-{K6b287x!9mCJHTZWe|MN|j6gq`x zN7x#tpK2~8!AI@ly<mw84yH$+m00K$V+NkC?gfHj5O>-yuM*j$7m)xK>+D+LtLD@^ z1ZGys!G9|zbFiq>*8Z}EzfvY_k{~8BLZ%B|&%=&|Zpq2C_%H{TQ6pFfXg_3=lIyQm zGUN|sbkOq4DPG`;ycs1UT}smzUK`b{xTv=6C=qb60(Ij1^hZzXOo~N;*nKM15)mI^ zvZ;g<Y7jfOUz*@dH~TZx;Y#%g=&eHJeziba^4JF}5~d*?2q1#W*I9~t=+}m`2KlBU z5Ir#*$eetaee=PY2}G@Nz~U%ek(7^?F2+lS*33W^X=r}EcGj)cEwmO*de*yp@X6xe zLC_{&sAWlQNyeNG$nW*>T__AOzQfOpKE#Q;`;A(%ZH`Pso<m}Bb2Kp%?X&zwG=f)9 z1<b1Eu}u<Li-gb#GQ5vYar)@Fr_Fv_#BNk|3fDVQYmg7*(AbDv5b_#JxqHHm=L9q# zPbc2nN`}X#yo@5p2&_i}7~J(2#=lcyIR-E+CFq6rrz0E1CKOr9EQMxu`qQeATQuF; zu*x+<F`ZZ5R0@5#dC=C+ROu0N`Cs2bjB)YK=bIluiLMQ49gqeDE3Ubb(gIUc@Yu35 z*)j0yT3kPB6}Ys-?u)kT;L_FJDS^l1pV0qA=6GfGdi<iq09ISJa(Cr)SVQS*fy8Qd zQrLsW@O|QSaC)zY9!?~KFr09rCkPpr2P)HRik4Oqk|ZF5y+KqVJkIdh6#&ayb#yHR znNMB6HQ*hU8SU)!WSExCBI{hX&<&&^Z=bb{7MV!+Rc9bppZ_!q8(ht}1v`^rJ<(UK z6D;gBFvAO1B`kg<z48PtmHAE(&*`&-?JP$&e$wS?;>tNc_UmS5ogs<dLJr8xt}+{* zbi#RJ(GOpP$oE?P51sx?#$q9=>$moO;fc+?3F(a$Z13EHA%ix!d{VgKYff!ryIPRv zOX)u}$L<7#lW)~vtI-ESAXWC^Xcn?OIC~0`t{Qrr*-7!NmW!kLlIN3^G7nU2jfk}= zBOLSq7o&~Pe)t{(hp3?-u=2Y5XT|bzxD;e?$^3ZZo#z9Lcj{+$1RV`<xZp7BEuQY_ z!1oV84s3I8qE4A5QGgf#G6pPa4lgE+Gy*zKWM*kOM=$&wLZ!{^yAUl_PjL340csyj zYCCIcw#TgL1k2Eu*asPjX@sP+iP6KPS;Iq*5KA^_NQi|XQqwOu?nk0#8^pp`gZMua zon71qorUc`yYf>J#JvTsku{~_mWrWHY>-DwVnw*a$rl>T{$)cD?+S0Eay3Atnv+UC zl3J;tt($}3E`<twCD#G7BdHINz9BZ{Lb2uXJyqN5FQtAmnU#T&!%3bI+UC+dgaTka z^Wd~^U~M$zoB`_XN{yf>y?)nxOy}^A0Bq<LOJE1taH59NY|dhIW@}&u=s&(Rndn*k z3TGI@To;N^3`8U%<v)?Ktq~F;KNoNYgZ`IRz|D202^ewf*FtS?a?=o3em_yl<2PV) ztCp%(nEL>tn1mA|Des47LNp#Hj7E8!(qJN;gR!T1KG&yDUVbILy$7(jRS=vd3nNn? zZ3(g2aYSF2BBRre<BXkF%EH@?%lm3971rq_+V{Lrh}HfQVt8=QMkPeW!hmM^(L}~- zwHLAwSE%Q^PtB0r_UO5fusnn1%ZpJq!N<kJ^=M}hY+5SsZ2AbU*jNK=O($ATsW?8i zg^(k+yXynSPA0qN*1PE&aHC(aOA*T*9yNpddd}9It&e*2tz3f29oJhyyJxTiJrB%F zAGJ+v&IfaZj{0*X_k9~mQ6R5ntIlGWjOtMxW3gD*@D6PjJ~|V%eo^ZU3~&-$1Ly8m zD0vSd=>NjT<Q6lCV{L97N=1g;vEU#^ISI3QQS%_7@x&dHX&9yyp=?2f-ND5)D-!I= z1ENwZz@{txpsVS;)=T3tF;z=L54PKi#AGEU!@Jj0qmUv>X1rE}Z&=&}Oo%N@Q|Tg_ zXrxZdhIk>LS4rr!r<=M#a86^TC`!trD20wYsYh%^7i?C=f>{(19TK3LH>=NO@27q; zwWW);eJmod^wUw<HX_IBz?|zPmj`$hCalp5&iR5&q9zmD7d9iQ5a%OJq6T?YJoAY> z!K8R`BX<bHp@g~Z=u7j-cYnW#+-t7Atc&}<zGxR0XV;f-!cU&9`@ihu>x*@*wEw$3 zqc^VrF%o1XFfj~6D#`^9>;ZytQ(nb;nQq=-ZJo@ti99gYgw2oD@_R)d<csWGUcXnU zBfm8TJAw14>&eFWKK_Ph-O=;$h#$vnIJa!o7Y7_dT0iV@7+%6WA15&FV>o0}uHgNx z+b`LU_KEC`vv<D6SiRLNpM5I#pSA9x_=}tE;J{nctot%@DjNk7whu_4q^7e&jNa;A zW!IqyS}QD3!vkv{JCzBXO~gW+wEnSE)9MpgMlpv>9n1}}&QcP%ArEtx&t$b8GSF*L zAi=0)Bw>u3buz_+MtK4&6)*9E4mf=#zRSGe8JeSju1CPTpB{%57Ms|asKKI-xK{@# zIlKT5EZ}2#J|jpc#nXU{YJwr`7JgcO;?<gq2H}F9L~WzcbFwHZC)KIMZsv0z+%g78 zK@w#eb@oTKb`1~}f5F0F&5-vIGf0BxRcoCZ=%$T&Yeb$|r%gG}*B_OXyXdnc$czwY z%B~&=|9e;$?-$(FDmolt0G`M4*f_IXzrACOf;e7YFDwt7@7{*L%&PQLwANz#?K5!v zq|?8G3UD-5^9x}<>D0K1HIZP2hCNe=eaY$|^ZspZd<YJPyf1&T^wp!Rk@n0$KeYB5 zX9C_cN?N)PK~_9zn|<m#uo`FQ(2xEv8w6r^ae;D3GgrE~PpU{Bl?EQ-3w9BS%>qo) zLv(j^XO(OUFK#kE6n{Nb_nnN4m|oMz4LBqgj*n{m$I?SIbNL=_TlK7;e^g9<atI7| zx+<hn!9n)IudlxO7ViFBiu;(%R!r2yrvC$2?zPPl^VK0?dZED>>ac`&+g*qUFt!JO ze0^%b9bRMwC*r)v5KYy3_)6^vwaBqRp~9_(BQTITz*++~(wjBGXw~pyARDH6S6v)c znlRs91H%q=43T<74VW}%5m+LD=<Gr0isNGEs-U~8=VogocKMVgOcGMi12H>944jfr z*I>W2y1KwnT(<BAlG0PnCiX0iqH9>7@W(MS+>}PGgb_6buf}dLW*|uY?5P{!%A!gA zBSq?Tz6kG06y=HGusOUjNcA?j*<YW^|D<F_K=T(Kj37(Wto{|vqy`+L<&;ynSXJEM zImLT(OJMV%ym8r5p#MUn>~^{N3K<I8F9GgyXvd-?+vxNNhqvIKYFH<%<X?od6Idoh zkM*?;!M%xF+lHCpquoJdp`p*8RxeLi9^ZsGXT$5RtOKC>+TrX^Fp!gaZK14-4O6yk zDK1l5)J-Dc2-A4VLUq&{DJE$EAd3dpP9biNhg*uLs^CR`5Yg#ZCs>Wf`VBhb6wb=h zBiM}Hv|p=SN=OD_p*(l4Nq~F3eO0vc;a?<YT$T11zyZsy0#^vlbuW=P=-mg1V@L;p z^u^9aI#@awWN}IUy<C0JvboY@DOc|ewZSvUkG->Z*jt$|Y!hdCv@6eVS&!wOK3HoK z@kx3g41p)*sro7#I_0#-lC7>eXV-gNh@jM85?!PPYJbM;Wmun&esh>jXV(YBtfzUN zgOq)FD*u~|<po^aF633>{4MC@B={!|AwO{EnOfuztS0OtZ~G<TS_IexD8l1l6wA%W zg}9NXBPML-tqws~;P_3kK!B+7@SQiSF&cFCb<~DO%$#jtFk|qZb)stGc)r;zKR-3> zphGHJLD=O}0b4#%6c+Epec*iCG6?ije?l(e`YIf_xivN^{spjacbnJ$k?8}iMgHsj zwmKXijyl-F{*>XxHpY(|hArh;)eYV+d@|JGja9?P{O?a~w&nTa!I5p8x1Xje2F~Ic z|54v368#{g;k4y^J0-MVa?EDkrlT)x3%`0g!0Qm+!SM^Ubn>q|AtRdU+<?*D-f<gK zw5ewM*pbDIj_5UBOA+!w@D%A><<dUDzDNm9L3xkR>4nK{m@qY2b$%R}2Y+q2su-+# zb2BlK#b8k*iRp8)PKWe3XzrcU)=tBXFc!O%Oh%nZQEWtN_Rpa-bF>km{HzfOKTC#5 zSi8)6WH>E1gOxK7jDP%!v;!dulG+|Ry%#!RebFHLelKyzQ6)TIN~+RJGBJ89cB=I+ zYvgB-yp|Q*T4M`sO|Z=6cHwOfw~jW)nxLF--uXf%(u!GY^Ko}xe_M1>J+~QGpGd+} zu-fvr6o&HX9rZ`^H{=@MDvU{S12fmvZHR{fgi>^J5@$3EwD^?rlu-HCX86IB^|r3W zK#U|!M^Uuc#B8{#jZiXc5-^&uME2A6v%NyqKIKw1qF!tl0vKJuzuWwOiBvQlT}<?# zptq<vZaVt5G9G2|(woYA3NFqvC>0fozQrGne3a(>+_BTD!|by{T%VO^dH`b3am{?m zz*l`>pg}Zo1}NksZW+7S30}Zu9aZ-SYiSmqT2Cv?Ki^lDu%+?+0k93$Bppzz(OKxR znKjX6kD;!?pcBe532^hTMhWN!nNob}TB(UN>nD%1YZThJQ(s-sLs8L0q@_kkMl6r% zgcd0f9d#@%I3&X*gqthvuW<2}xG%T;>lBXNczfE)oinQo)51UbL5AXmhr(1Zq)&}u z$yk{u2yM+`tZ5fDVmg=_l&x?xGn}8>)Egp!%^}Rk9y2^m6(o|4(AYHi=GxB(e@zBF zlMoZQ?O>UoysH77jC@Ygqa&(=m_r@&ivh!V)-N{B63F14h@CvEF6k001V9_FEUTG> zbLwGXhyHQs#dxa-KH?D1KOT+6#@uE!<FlDeLp;u{g`8H<=_=spZ*YClVl0$dUWlpp zbVL7WCkis-#F+^zY2pO6dNbISesu?C?2D6|8V|+3shdjNPj<Pet1<OO*`wu=v3vAo zDcU(4^<1tVz&6vC5zoA+??^4~|MwHMwRQ6Ztopv=-kNm#xRB>XS(L?mws1;R)38-D z^#ey{g38tO$Q}Z~XDcmsarAPdfV`n+fWJ<N1HSGlQ>$jxaSx<_6E^MF;u*F-hSSMF zmobPFX>ar;3?fUTF(M7%wN9sMmEKSP<IRkMeVerkGj_cV;vJEaL`ASHWa|)ni`bMe zT(Q|yZRk{kj_FSHKqi!FzgLiUVi;1mm>Q;YJFiCs0o>=Hr0!cEKN!rN&sEG1-g;d2 zEGy;HbwN+|p%pWs!&YdRIc$wff8mya#Q;OECeh!>M8(}9R&4y;xGe#We}sI_Q2`4b z7cdTHPH)D`fvw5_ZyaX}9=`;8fz9-(j&mmX8<22C!D=MO!^mCVfaStb8kQLpZ`-Iu z@}KSOF-YWrjMLqjRnX7j-gL-F7qy+pmH7i`Y~BCmR4>Qz5<=Rp52syp7rVDa-&Hp^ z|A8AR;BxnRS-$|kXMc$wwC&G>+-cPK`hFqKkMv4$zWNhNPQJX+!p*J`9QL{ffxM<S zPp;iHABMd7Ku8oszXS~fSb42d{2Wfbv_{KDnsW$?F1zjc6C6y@s52OB%AG~v%GH+? z0(i%t>aIL^4G>c=*UUK+WPsJyi~ZC#hps0+i|NSE+9*k1nQCWJ%h#i!JfZsoYp(hE zq(L6lG*CZ>?%b7N1l+tixMl`paT!=o5utaPFzmU3p=>|~Z|Lh-pS<#hO8^{a`<kMz z`m5-tR!{)-28Mc*=0IcXSH>C&5&Y%BhX%jK6NgbH)#T^j$ic8I$Hq}7yDEAMvQ3(e zrWk`Sw0c~rbAI@>?0Z>%-o71y5H-!O>W+HToT$=kTRl^-vNymz-Q=gDrHAdyN*Iby zWXB8x56dq?NX7D*xY+%_lPib%``#6gkN>!HW*-~W(Zb@o#UtICeXW4(giM3ToSZr> zCtBmm_h5!MH88!t24ij^uYTX@BUS@HUp?!o57`cIA8NHQSJc5x-W|R^IT&*Jf^jV5 zHOQ)7jb`aL<dU`ksS6(*N}C_L16)7CnIfXL$2*7Uz^-*Mvg2#hkJZWhZLMv<>_gS0 zsjmL~26xbJXvadk+ZoUoNxGd=(`oCyC!yP#?kP!k(PTvA0f5VjnE)sILbms%wg8x{ z{$?{_rpMT60AP{=7M@1?Cw|<-9_wc|$Z*=B_4m{fYCG1rZuZ(Fn=r*3vV;?qgVgI+ zg*>+XCiGT=g;)SDb9%wk#C+ljxddK+ZWm%}!Pv0Ct%%~zP;qBoE`}(JI-DzUU;P7% zDc1~(*c^fFU2f#WGOu65&t2NwkUL34>2B)Lw!El@O2cV+axT_>U7ep<7ET5bW?zjn zd*K&7%YOZ{7}y@rT&eBB8*0>XPYy;vpMJe9IkoLiJT4pvgNG2fSgw#J9I+P#t*yMc zcim!o>chw6E->h%dYMRx9VM)^0d%4TuAVp{rK>qnq?S0QrJS_Zzpp*0IJ$o(C#KbE z<CHE<nvjnoQRfLEw(tC{ei#ci_&vF3N?8Fo5OisJFtBh6(IQ!_l77X`n8E{^TQR3- zo!hMKI_!#Ul?(j3;|>t`BaNkQ>r`HcG5?jRN0S}iQ!5JF+y5zK3K?TvSW#MRBiqXO zgjn_Po{?$7Y@ko}WXeN%VTS7vPIZ3hE`LLqssq@Y)a!`$rXz(;OYkoH#wb(4)jM$i zm{Q+nOZv*1e5nzxk#P+84cu*=IR}z2)zTgR|4Qa(Emp6X#riK2P=5F(B>|Qf#~2`e zFQ;DJ@FB*S>Z);y>+rHX(7&itTU$yrhw#_7d<j70u-e_~=o3<qs-;(uU{aASMJ0tu z`M9d6wLPkMTSn{i(Mg@_r|-j&9A#@7U~MrM#_F2X5IGN=5(9P?*4dZJX3{;qzNU4O zL4|3)SIUA`)AibuE?01^0!$!gVnG#px3%Fh(RpBXrl2o(|CBaM+_$4J8uukdmvJ&` zFi5!a?FP~s%RJBpfleiEKVlyY=dqMI?1m4)RuQkEGu*8HUA5p=haU<NL9Qm*MR2^g z^#57b&N3>x7Z*;3$?&)b%F6hg#sFBTWf2MIQQnK{{R!Mjv5)^!QwqIj-&I$^Rv*ZL zF55vaO%21{VK;TK&nlMNqvy_CNNNJ2e_6cS{tQvBs{Bs0iH`^lIK?-TsKU1^r41|( zEwnRPITVK2HOT%}IZ=(#oKt)nqgxtSv!;n4t1$lknx;xH_GY#<4+k&$>E!a@NfCSO z$No$>&(EG2)nS}n9>3t5QP!Cnkq&*D1>Q|2Zg!oJ!klo8VX_U~(9A8FgHSK*<}}cM z0${BZ4+pH(;Al9pWsNBVB&`j?$iaOAd&8jp_ys!fyA<VmvF`t(4RX!_Xj$JZAei62 z9ltI^a5}BLYsq#~=1%4K`%l#<45%`ML*S9qv?F+^(d*!Cn2B%NSwRKnpds5%mzjIM z5T}Tjs*$`4U4rmc&b}BmCw*DHsMh<Ncu92<YQXuF)d8nagww^RX9mLV$~_u3?2jN9 zvJf*Ufm8o(OHiurfHk*+d1e6O?TadXYMyiAA`r{|*;{ZCf=EIi7zdli)kwvh%Au{I zI;c;^Jg_H;s<F%hL%dyD(_LEgP9fGbAwnlNz81K3ZSwa-V$tB(egJ;Yb=~KYQ3*)7 z0%uVxuEp8g5ppM1QOqI3fy19aVo7)MOVpf3Gy26eG-e9~udaY^Ke0k&Y`ECs-`5Ff zLnSt?=K33XqD@Pm{x6!1^ig4EvPX9u2RK+R4@nq|PcLO1ef#bZ0|5c3YRV349nCn$ z%P6eyvJ8+TF!!YAy(~}rzt9m?twNTo)(q}o+eEdxuPmx*3?aM-SFFpd)syd30_>>F zAH!zmF{2;C81=Y`f@xpYJy3hsw`vMt&6D-<Q^Q?sr`jpQyR2?MruhktrzyM#0V@+H z;@Co%0N59a1=x3gQK<0ZdXnrD6VXF+<EHVlf8ly!zWzHj0}&>LKKSXC%0Py6gshqf zShQKtFhD;>H>3D8){-OuTjYQqD;b|-=HMd2L#sxd2aFX5h@2fhS#+Dk;e~aIwnh2C zt*ei(*iIOhUr?(!G8{b&td26sos?+By4rmif|H72J%+)?(rcQY`s?XaBO<p`n+U}= z9y~Ho9(@CA($f@@;fMDjweidh4B{Y7^hO_F{q5Rm`}kZ2>m>DtTphK~7{$i~YbgmA zW}vT@-)w!CMIF5ucYY|Q<Kt{k*OEY5Qn64c35e~(u>QKN*AvWcN>Obg^nXdfsshEU zya6w#r$5Uv#Da{6p95~?@)Nl(AUrquvUcLqHwtye7z7m?aM5BOt_qHJ0NP(__v}O& zkCifJDsZ_FXLJeI@eNgHS>DsP&ThUe#ClPcZC-q(c*e3Apjm@_@lof1zG2^h{6@da z87W{1(JlZxI9fveMKB^n7%ZQtgV7_7HNx&$I7E!N_Al$Nu5}05lyY7tPa8wqXBo}- z-eCo_MbzW}ylpbi3T{k{@(`9cDuQM3;$&8+8_0#K*8N{;gh#_35!s0@d6mmjU=B@T z_^Sc-03)sWMLS?&%p0E6;wt9ni%|xVl_=LEYFdYpuJ63lz0;b8lt{>H+;x|K>}2Ao zI3&@GPU5RwmH-0x!58it3%jLdSidL33t4Hw*4aRW?7N&66I(p%!Yt`aXQ-zg%#R;e zj9Q2sK6U1oa1wT-A*K3nq0VZuAJ%Si)`^FOuoHVff$^V*MSoh9)>H%3gU#S@K;7^{ zQv=m&b75=fzc+lM0DSS4*UH#tff}7ZZC?(b+gN&`8Zo#Ot1jkaa(zUF&99=(f4^A_ zQAVvcdWOIK{oEqEuwxib-nIKN=CME0-=v8A!E-=4jipqvK)+CiMlOsg@mi6ucDF`O z&==XecGg4qS9o?xVupABz@l1#)cHbW{bvxcXqGQ3%P<kz@`m`bxPoxN#}V^;vv>jG z=z7}UYc~<>d5;7$0yz008e%*FA|jvzHnftl8I;u46S0rM&h{xk`oN-?zWzbAiIyf8 zKl97jM^y^oCHH?JjZ<_{{zVA4*2hJm^my48*_9s>C}gLY*phg7^6|(Xjfd;%;KnC* z<CGmetG>Wr-U#)Nh1k_YJH1@nO50<QaK+<07}x)ED*t2CPU{O122w{MV(&1i4?SR2 z6=r&BouLyx9F7~!G3W?uhr+a?>!gSq3kESmSm-x83=8F!z%cZ@@{th#G20^P%rXu1 z?gaFoA=E7UmK15Ca+yWJ4{XFf23Y2U2J1WOJc=Rh;RG(fP%-6v`z#5AzNG9qy&9Jr zS#=8{EpU!jF1A+z_J0-+?@Ea(yO^Lly~C_tLH_a*`mFx48(EeNz?q1!JFe@z2H8DH z?6JXN5*l<?X0%Dh8>cEAW|SJ@ono=ItA-!p;bMaW2^RzQK|F*WEEt5s+FXBnNkHV< zLzLLlDU=9|Q}9BWmjIPS4s$yBCl-SZgZcQD%l_RRdOMM)Ny&N9_O=!Jjn6u`@-Iv0 zv{7)`4k-nJoTA(*KK%Vuz;@=sj7j>qKp#zg{PiJ7#zixf@Y0fMcSJe%#Q_i}w4IFV zf10gF{1d0uW0^!fblui~d)V`Q^Mk-r-oL9XrI~#L+2@dBk!``{Iy@5fV7JxrOR%{w zgEYG%p9VHkwIH){E6yx?2TtG4i|L|+H)KzX_ge@ATC+U*YMQws4^*&rqB(#Fds)3M zUDGVnKuP9`gXa$+5p?|`Bx-);GqV!LsM`32!0C{V;4rklL`^PP20I?1zPq;8aauU5 zamYbs3x`eAHpVdc;$e^g?=q1|U`$}LBhUerIVHD{gr!Vl=xmct3`BBH>HO82P9w1z zD~6Y7k1AMe_<Ej3cK8^DnNKPui0FkC3s)3}2%yrL&{0R)kmIQ7it2)%dT@yfHBuVr zd<nl^&O1=z)keP6%k5kF^{M>NEV}9aJ_!-#NwCZ#E=JXJzQ->b0PUq}2?FN;ERW9M zG=K%9fjbkw^K$X~shkACglY?$jq_vhxwo=pu1>Pp63@Zr4#dszKd@N6K8I~4UU`JA z(r{*PhmBrX!D#<G9T)YA9aKQu=XQwY`RUK~LZ*#~&h;-7Fj45bA4xhZRh`JfPT!BM zw^>XGO$0xEAmbcvCT`%cw&8_lI>{8Y2#>7~S^-@ukvOBHJ^!bKESLBzwX=vU!&M{7 zYXmp;s(viI80{K-Br1TTb-U`}7_lj%HQ*ItUwq~GMO6*{IwdKXU+m|wl?;mUD1>#% zp=(Kvyu)-R(qW275}OLdh=Kvl*y2tKRc@oCFpZ@N@U(bZ?Q+W;RI;HwUW{`{r*?bK zkqU&`S}^8bGD7>iy6s_WKQ0Ouwn}IUTG+xFCFRNA7A=KCli`Q0XzTYvoZvGJz^ZrH z3Vig3?QTZ-MK#bD(|$(kxQl)JRY$HCk3|DI09)SSa)_oQ51iEr-I$(c;lTixkoDQ8 z1N%oX26W_KHeY<`R*#r!UK|8F>adSO7-)$cVaCmxtJ3u4+<W@weBGl87Fp3*^y7v% z!VM!OkZC6cBEdSep1w{^VzG|Zx0%I<X#_%BOC(2wMHz;TXa&#}i69ABLj+8C#P(WP zt&Ft!F!-S6*8Nz9k0_lFHBqw~5*~0l2$>@iRk>nCb6;u|PgRXj4j+R!7=Q3y7mkD* ztd8a3FJ&Dzlurteac$thriF~Y_HsXH8@a_GLwQRk2IOM1CET?_h*uh&Q`OWLI8bu= zmsg8kD#Xn$qFp$Kpjp`R0CaD6{O(0kdeEmv9ZFDpt!}H3?vuE+K>h;v{^T`eOO!`H zZze|?d?{ntS$^98Ws*U**{JhvGv&6|aO7##C6i`v!3`p({a=b}wx4(M;QQ?YI(+~9 zpLP4dpZ)Jib59~5G5Uo5%xM0zLR`qv!Wbx_(P~VfiRvI&(TXuBielvNjE_0{s^gIu z`rsjf!GaMGvN>EEWED4SbuX}E9I|*M<y_TR4K}NPNqZpInKH#*-?VD77d1h~O^DQR z+YHzBh?X?$wbMDAx)!H52e58Bz1V;tql1ncUo=@U<&nWnjt-<SErGHWj-+1FPT#oh zp;AOKZzH>+#!e!*7^}ljra%r2osFW7+lTdfB$tbn;mvBD>M3P*CECNVMTO<qLZ{C~ zj1@_62ooG0UNpyUU*jZEs=^2r*w-M9;0P9ufGP7C%#tc`st)*n+umRol(cd80h4fz z9&AwDiUXJ*YyUaid{>B*LmHV1^^9CpX+*C4!D@AO{)*bvSfeM{z|s+{JY{g?upm)h zh?}uT+m{M)4zYpvgF+tWFN(e*=g_(B3~DF!7^2y?A-_!SEQI8%Y;xwbMZ$RqO0d&g zAYS-${q^I6`@~Y}=IFVhrg{mGLj*UZH9`Yhb<T6XwaDr4vGDJWpfkC_Yf7OljG2ns zp9`l3OH>9nY+n%c7<YM8&koLlAMxlZU9mHng;;hefFL09KOdV-d2GZHl%=?y6+(hj zp*DrM(OGBIGqVphE;G1l^w3IUd5#m@AKDe8>m}XnBD{8}S&zFeVZTb#)(Bk3<I+|n zcTP?Mnh*%N?A5SUJ|cU279zzuP;>wo5lJ>|5jIQ+5UQF&@UM6JAu5LBsk-2?__)IB z>WPkd76x~g+E53KuDw{gJ3A&n{S-gF7se4|9+6X`iQ;Ew(3ystHTJU{2dDlaAN@G= zmh{wVjLA^OCZ>e7nM~bz!G{1m&t;-c2Lu!NMvj<SWuBcbw(^1~<tA^;c;QG6EIb!0 z9hF4LdLPJE{-2i?m9mr{@PhAkZDp4H84&0T=y>f~$2F@@<$rcEbDt57hUT^VLwk2x zHaK#x2WQ+)Uin4y#~sitL^cZJ-{D-7{AI*lcOu|~=_^bCR6wi0L}=oH$S)>#1U01B z)Jk#*Ye=0G-B$1laZ%zfTg2uWH~oEob^qcEbdA)uRU&cvq5#mpOxi(<G3;_|Q^aC| z4&pcieeQ#UvdB67zY;K9)wqL{bI?kGH*01UrLTzCf#HKaWU^Z83P4`K0*=oN1Q>3F zea4gvIm(>jXihv%O|a##ST}>2IQO}5R6X-OaGcg**TYlD75K$ej)}2MtKz}ci0VAM z#>E>p%_r>9waeV7J21(*Z+a9&&l;kX;7{h_hAPGNK$0L`PR_{j{0(z-zx|~BZvoR2 zG2_lRV4lF^Eo=GLdh&ybkfi{Ue&bV8FJCN8MNEM#(3Zzn+rO6T+#_H(Nm_<#<`)x; zTN%*#I@glAX?(8`nQkrL?IcM()5KaQx26pYc`Hj|C$pI9pfDzeU@Vh5j2@$j>Gq>G zFnACjyCot<*hjI0fl}HWHajPgZSfL}lOjw~PLyRbz}{~yW4=0-|Cw~42_cXI2Il<W zbo^o=s*Q+!O#>{fnly;APpouv7py(FT*CA}Sj&Ctu<Rl=-GgPUo(1xpV8>X*-d|-! zac=LTqS_I*#|Nxe7Q@Zp2w^%NH)?;ISRTbc7SpI9L~k0A#%lUYHm#pW_V<B<-p2Ud zDGFX*C~Ige6FQ;$P^(tC&9r(UDO5OA^U0Y)<&@bYA6QsPhcUD@z$xX*Y<AR4I#IF= zf20b?DGVI$Bq1AHN&>{nE#b7z`-njjO}lo|70gsk{Ck`gx%dYsuU-<j&goQ)kF7>( zmZ_f`GonyfB*Zx^m|zjpkS#x*ym<GDIURh0Thob78a-$EY@@=6*@_vcS*Te_pJedh z7%;~W5-=cXeS*l-a`zy>Fw$*Lgdb(^5yLhRcoj7{2^kavy;wz7*tdA3CJAE4_>xFj z{IEAx%?fTC%a2d{zX-;KE<2Nc{8We?lx>5i`k<{(TBsh!2Y;k6g%dp?hB{tXd~V{= z5ukURtNHXc={!s*QHDT-GlIg*pr%oorwbZGAp-fHLNOx+jVM?=+Asx=CAG`#$F0%M z1_ql%N+)P^S`7lQ-2ON~S1*>Wk}Lys5e6rUM-GI^9iR*qA$6Rt%4n2+_(c03Y!j)E zVW~X#ZK~*kpn17jfZy`e8912Y_JNIB<6k~y-8|o%{POadcH!Rw)=D#;ivg>d;=tY0 z{x1;1;pdwz7Lf8*1-NLWru@qvV#^F{2ZgkZ;U!?)NE!{F4^127{7}w5Tmjx`vkZgr zs!ZLLHTxHWGHU&%7fvujaII6+@Dt5JMI&<t-SgHL0`np0ls{dBJk9P;^5@f;kUoqF zq<^1D=Uj!s{O@Fbaw8Vc$2id2wB$I@iSA4<ac*1S=AzKGk&v`8Dm)B2+HL~$?l>P| zFZyvB+tkQAjfPW-xGjyO?m(`#3b3#t1-8P9gFbmS7#+^w6e~FQPjq5<A&eMN-gsyn zHs10j1x6PMvnHh5H3tJPhxfHHB-SG0i<l&**lE0lWC=(i6(uhf5uHkX*)34&C#gkC zF6*<gWwNp`r~|*Tq?qmxSSpu#pOE#!=qMBD@U!GO>2xQG>wEV~`o<iiN_tE%rd}oo za@K)r47^aHjCf8aV;I7yDOFo-TVAmcmNlcjIEN}qufpg5T+!cOOM4agOXXQPB{o#3 zVn&x_Hovz86SLqNm_0=uMgbXV6FW|1$r^P(t+T=En<-w^!IhUbJR-ZbO9vIxX_gMB zGq=IQH?u0uM~<kLSoX_F5T`RRp8*dyxZzz*iX)3%iK6gEn;bQ#+Qh)vSX7^Ju=c(% z#3QBq&$jqTVRX1;(LSYM;EOABdM)XkVut8x#FuO5b@pYfs8F?QzQ9P*(Ss!eQK}qe zf@d4p6FVSDDU{AB-S=~;kaHLxG=7A`NYe*hP8xY;O6Qji?|WErXHhRd`lgV{P4hO3 zCMnVB3e@Vero7{s(M(-^F?B1<IezwGSApJ+r(K6zFp$IpBN3&Y9?FP5s7kG)@Ny1o z_H=@}$7_aETYRomF5jQXiiu6VdN2|$`7-eW2PulAT%x`aJo33Q^OaXRXmKjTB>`iK zk%HMZjmrCl5)xB#q!T#3$YzH%qhU#8Z2w8hhuB&q9oK9mU3xA~e*_i8g_+rekdTa= z=j>yUiG46*G26Hl${6Pf@Rx*~dl=SJA&A;hv(m^*G(RRA?=?lC(+aVR7fa$~GJ_Dw z7OCl(7tgGjy!6ZW%$neE(GSTrAjb~$hiHf|gT0P(gHX@eDN3m@_K=-4c~9xgM2K8^ z;M2JaBFy1_?YvvpE{T8ORS=eX5{37YIBV0#8Z;x0mNR$7F_mzR`hg;!NIX#;av~Y% z)&)9|vw(f<Em2JVXPOOa<RW-+*=yYijAo4$PU)nxBI(+bcO8*H|4?bigYhxsnF+g4 zFrMj(W|aJ)DZCx@3vWoeRAbE?&V|dw=q1SmaH{Cn_r?8}2zM7~dV<MMAZZgsw)W~i z;{lmKUdBG8U?!Qi-jH_Ev=V&84P3yA!jrl%NoH-3!*oe4<D8n5%1@3`o?wM#ID<3s z)*Cva{5*%hg;;uK=ZT&^X<7eb0^(G9nP2wHpuMgf6J_`^F3}{m%T}41dsc8+sOlj{ zsIz&|53bT^$^V5xKJ`pHD%B%ZS7;GzC+ZPyDXPI#)v$!T_AMCvgcysEJeq6D{5b_J zB%i`@4OIy93vor!{DS))(Xp(QTaYG#XrsK3c(XflzLM!yN-s$w!sRj?WNfem-<Y@t zDX$cneO*wrAx6Xbx2+OW(Y+bDDHhyfBXL|>C(NFmEsZ>tvEIiNEqJsg&1=TSRau8n zg=exlxwtVFJAD?M7IZ;+KwY8t8c4JD{$eNl4I82iFjD}^19?-mNN`HM416J*7-AvO z;;eH8H9|!7V%Ns^vj@a2dTGpO91iGW2sMgu8LZT7nLhJAllVwL#3g<L88|`QPf(gz zc<#-ScwxdBB<@A#Sy#2g$#p3blyKJ-$=x7tT#TR3rL=CB)OuY;P1M}L#p<7@d>QV6 zv?q;tv_<Aiw5{X<7Uk&1$v-37A9j@Jcj_6TgB~u#6Rb}?Ld%=J&JmLOyc&-W+m~{M zc(xVanPiOO70obZxDbzK_V|g*4PgyDq?OV{;RM>$fB$Llvki(2yH9Xo6U4mIZ*>SZ zjzO`7bhMc#L60<HhaC7q-kU_ER)DCwsiAEYZM|s)O*t&ik;PFuQQ}yNeRg5{&Gv3E z{PWzI7ruPuDF(yp^ge34b}mD%_=V0GlZ?R#y8@CGyq+N25V)L}8QGd3*E)0?tXnU` zSwYBd2#rd|gx8|fC(#ryp$dmD5?=BQUr+iuW$Dn<V^YQ(anb#Pi8+(|ua~5!6`Bua zXXWhMe=h&Cr(9xW48N4&tN4c<0i2!7D4pqDnJ+I-e`ZQS`Tt3&6NW8mS$Okyh?tx; z&!NaZ+Rn{OlE*-IP6?rc!1)$`NOuN62pPyuLpDc1ala2aClTrTBRG%-g{9{>`z&PU zPQz%v-8gvVJ$WId24~u$6_CK|6-H#qe1>B|E>T9tC16D2fFJsW9U2OW-6x2$&Hbd0 zZ6?KG-qj6a7$&|)-b@~c5EbYJ7%5g~i6R<kxdXF7X4tDe#}R-gWm6ms=`KuhGrSpr z;U1;ej|g^KLpegWu$o^?J-jS19mu=hWL5|{))`%l4LJyHw!`e0%Q@aOH(rKZ{PO7q z?F;_jduGh0+k;<{Y8ZWV=I3cvQ}_L_QkoGy={D=<E5eS+|B|~RvpJwn!XSqU;Nq{@ zUgvm<>{(!YuulAwxNA|_Yc}U^#^cN8+SEP2LSkVdS|Uygu8%~|ESW4+m-d+{g`O?& z(b1gbllOfjM~BVfV&r^|p?02)(4O3_d1AeZmZY3Uf`!9;F5Lc4Go!T`GK?n4xsUB0 zd-a%b--J1pG+VU}yObF|Vb7*>pvPy;SZ^=X89=AwnmojBR=Ffo_}C=m{V~H=lM@i! z6BTEwHq#!ky$1^{lUSmkv)9=^{~qCB%3etN9XClJVX}7evq@*-_9Zdau@7xVi*bRM zr~E%cGJ?P)@Q$(2z&`F5PqT|8#DUC@zG?r+3c0<rEm9u09}fd&nL}mEV3F_I#@mWb zDJu`}>lW;`yaGSJ+Wxgb063xJh3%|&_DgHY#Cz6QkJhrU53D{#2o%43y8TDPyCnwA zeVk|}jp@;Ks%byghr`FJ{r_Y)iYK(+^TV;5+5WaffTb2kBEh((Axb$};=~nfs#!2y z@t#TC2!_k36$)_d<(fSlA8Tyf=q<AP*ut%AVYNM-;aabBm3bYEtUN0)?vr$gOsbXK zXS#sanLWq00hd-rnFXqr?t8_XF@W`YYr0v1R&DO*(Gg__rYQ-!zY%n=CM-%XXT_ZE zms(1mgX?!$HWy#I{3CL@y#A0A6}H)JaKATT=59Z&llicCrv3RiOnPUe$?~c#@2B3~ zrD9v&=t|1J%;0D<>ugGqbs}N1TLIK^>wedq0&nSiRC~?Aw=LXi6O4Ua>+)H^a51qj zJUUs*AH5Zl=uP74y7ex0E5Kg<MaUbovlaQBV3-oF><=1AZ(ix^X-{XHFP22|opwxL zB~>`l1|c_g7$pW;DbW~yFhK;GH_YISFdC#MZ{)2TxlpHBL*L#kcQSx^=7jqTrjQar zP-$=qWujXJuw`vz?TvQpMbf|_D@18lo_6Pw<d;XUyoT(r^bqrsTpO@2LYq(cdeclx ziYSXO;=BgRY9cX7B7R|VziBOLmLwSjMnCeb``%W%liK?zx+U6~N>BE>@T`L9gPQ~9 zy-29Xq+R<lgY~=i*`82hmVIHf0~a7x+{e*Vb2`y_<`t}GW@`_DOoGgaWBSJELKNkN zN6%^bjWsZhIuT?X&)iG`YShMMJHSaFAz+BprDBrz=`nXtzqJl(b!P6p?}6o`@@Qb{ z@SfmUNQUWr9OAo!TQZ+`Bu$y&P2>h@7~(PXmN4vTM6JvAWvNILz2-GQHrRpi%3?8` z*mCW2RAnx2b&)d)>m1q}0b-w7wfoXP96NiVY)btkU0S$oPg<868NcIYV6TZaZW@iv zm08l)%|ItFb>Y1~s9bOfc&R2VP98ueR<rGp`MmvSJ2IXgNVs#OnO!%Z2SG&^5cWOX z8Y2kq1t9%kO}3~qs6mg>ZMx92=7kroyTM9u8Dcc1(}I5IE|clL;Lq(J2TE?{Hoo}0 z!r^msY;IC<#KunNoXw?%yvLxBZlU)%ABvbLCpAjsmM@(f(GQ_(V=#621TOYFyY6GB zLn--8y2M1E|G{J(8JAI4#@7y=3Hvq`EOEF*6Co!uL`%PC|KNXUO67STsaTa`y5p%C zB~3{eoI-SAz8D&-a@3kEo8Q4PBAvIQ){BMA0!G_NkY47DWV2f0$y>-;Sh@xi6V)Md z&czX*6hxvi@8V$$K||NV%#UFna8#rvd~rIw)BE$u!VP+aj>LD+2@Kc9C~b3hfMVZV zViz@fQ^^re`0zl{Ok8mzXn2Y~9K$mUqQ)lE?Q;V662WPwQ?6n~DUiGHoD$+4$k6i1 z-LKi~EB=wj>Wdh!_c{X7=V;;C9dSfPCl*Q5deW_BdetmO*rSA-F>rg(oM|l~cAHjI zw&>iUpr}mH{RKdxfU(5WDMU{9<wB!idrJ0TNdyCO@2bj@EYh*067zFiBL{UprZq(i zqEH9tIhW;TT|}pQSo^cyLDSQeu0`sHH-wr1l8yXHC(W1b*>B!VO7HAaCCSXUc1@q> zARlKitt_FTCSuT1)Vy7}G%40m*2}pj7rx9Mk#WU}Uj!~maoi<rE=^7n4Cm*bM#m^) zd6{-}@ho*x%yD2tDpbo-K<Gp*gwn%B`<9S-9S=`<IMph~oI%#084ZUtYd@WwOq*NN z9%+ellbs2CzflX9&Dviue(z682FB%CICnFrl&cG+VN{Y4eNKzBW~MoA@N$5IAi?KD zIKbejUBG5>-=xnS?(5#qEr*TZRCn&Aiqhz$v-v==pwr$t3A1z{ZLGpH88VHJz{o_5 zWsp1ljyL@K+BfRY8GXVvKF)^<$Y6|G`I!45jzS64WLDobB>E8Brr8HIYu&iE@=!Cz zqOzk=3ZzXM;65?x9yno5Y6&ki*1$mKf)pTSfSVeD_XQGWTXWj0@JC?2H(A)<IKt2b zr)DriYWo`t87+;2ro-V3wj5VZG%;PudYlf;F*XM7o^`E+ga(w*&A(2snYzma*>!55 zH}B5HIYZbHW?<%U%U=D2L{rAOpZOwXvtvKcEY<DTkdw0X2dU=SjrK^bh$Kqpi<JV? zls&qO2!XjHvHO$ok6~&(-&}<5;OI4@7CF6p$HK;btXS$TVa0FD_PtttM(q2ZW<&A9 z;P&+p7Vc+>eGeg>q;66oOCB-*;JByZv&>698o1}0l;h>-bfTPoLq9c(m=*6tBIVYS z|EVlw@56D2qNaTpwI9&+aZeME|9g@?7ptI`DgQGtX0X5PZ2TjoF(fFOa=I8u!HYe> zYOf;5X)G}A&htJzvH#HR4RbSXZob%Q6fhyY*o?KklFdn`K*0~(YT=jAiw&MK#WCp$ z0ngfA*nuf~ifATUHQ#RrI%kMVI=C|8JWMpXEjt;&1vcaI-abdonL>JmwfHD*?ESgO zNe32?4-6jdf9#r7cLrdDn<-g^ot4GGqAmUM>7ADAvi)U6NLqH%L2IDSr0nG<>+y>f zY|%2f{ZiGN-jHmLo`oMbMjtFM=VwOC+RJiv_l>r|a5p^EJA_%{iG`l(i-eKyzLbLq z2%LJEVXCGz!=m>^KV|dRfVq0H5U4%|2Ioi0uTgK8pg$~O*L&e)8ZIlN&YO)7l^lhL zvUHkKs^)bg!bFONqmPI<yPQPCzzn|7O(idr+loz&YwcWWm7nsfu#G7f5M<qzx7vRe z>;A74&Azp2p&YY~zN{9&&N!keY=_p>4_BW>%t^X!QEtQ)9!Orpm|FC9Qg7tC=qQz= zXQ&ib`FqNd$ub~kvuW#O+x9uu+@q1#^!ew{pTXloVDoqDEak1tK)e2vj1%R$w9bA0 zS&IgRnNe<Pa{}~|wo62R`}f%c@fu;<AC~tAG-kB>TC@F&%}7gxPRC{Ttq9?YgUH{c zPbL@a6)aqNv;zXhv#n&nQHZ^!dU&@iQ>JZwz5Tkwms~b?U>4T?wJ<4anQx|>8uK76 zWOyMv+O&pX3%}Sz{}E36Xy>&ROtDv98`qZvb`90EpE<nQ_Y^||*33`adfB!KF7Q$t z7AI0S9wui%t6YKjf}^k*zbH$#g4l*?y!xp4?PMoJy#GtmeJFNn)-gW1vBAT^v4{T< zh(N}9VBFf|qVaKV5#s5`z&?YTml$Uks{*_(C+i%AKYLEtGWnm~kWm7o1od?eY{RVC z4$Q1f*Gu!Glj>&Sz*G$POiYp71Q>Fz@$fU9f#F7NXw9&ac!O!@q>6HhP3DY7LLuxL zRFYyB;f@mwfwy(2(+u^?`Zwh^s);w~HcY;ksyjo4$-dFSq|;~&E!xFn)-fQpi#zLl z$!Q1l!ZgEj=^FGQ@aW84xq?Oa>sZ|;PE7+QdyJtqaHgiU@wEI^dPJU?8>3(3*<h$A z;lexNWP9jG-(d3K{LqFYIp(1p6{xNZ)`IzE)FQKm3y)|(d()W>RqoS~(0s;%l9e(i ztV3XUpA77H17m>HIx$+umF5UwsF`p`7mZNVcA12u3Pm{m`=}z|ISw%<=|PxX4pog2 zLwf6Sx<^ApB$Cwt$6y(%1mym>SxeUgI>EwqEl6D4^fk?DUaJ3*xDLx=1^R&jwh<G9 zaN0T>)LbT(Xa$;seYi}1$Rx$*{mj(UJtlVGgd%n&oyQ~}<)tMxr!x-%gV-jUWH`Iy zvu1Nlk%FY=LM1t!2_TArM>B{N8|i>HQ;8ugkMN0XrAMd}j+zvA%&jx{j9RjS?O4t; z(MmD?o2yMMK{D6FSj#*<U{Ud9#!8)^M)VjUThollz9Vq2Q8QpsAt|p?KS2TQfEBw~ zym;f6i@C`uXf%d@KV@PTMT7kC-e54*%Oyw|`2X#3k4|WshYzeT2OyyrZa(O8=S7oR zf9wm@82OE2@hkdcTNpJYrWH7&YrdfgBbU9?X)OPv_V~CPHQa}~De-a>Aty|si)BDk ze`<d;jg_nUlYIV{w3@XxF<%;h53Pj22?G(;+;c|9q^rvb*J`HULzC8638s3g*d?3n zB@H?7kfG(L<17nsdwGxDf1EMe$L#v3Fl`1N5#^!f_d0X3SQ*SSvUSf&#dQv6Or+gs zOoWcP-Ij!tf$Lmes{ItPqQ^2IaY0QUYGE@+WY?7w#;kjMST1>BsE@TGqtiArhLkjB zba^IWEZ|X#VeBD!-iHzaV{)B7YvOVN7tVm;$tl@UW6!)>FD}y%z3(S!=P?Tzv&)O# zrqBK5^#(nJgEbk#C^Fe=G`3g%N|#Eg*=~%tLVSTeD2{irnz#?sH4&$KHtr!~uM4xB zv3%cLn^kS7&NtJb@E%%(hm{VJ&i&Y<68feMr~;-BW-%uSaS1j7V+Uzsvk!Xx-@{|? zCDT6hJKf?;AajPg3*QW^e<ub8Q2#Pv8sL7q@11||RcJ}rnbm?rS!tKu=5*7XT9Y;v zhNHZ*64ZPgzBNT^Via|cv9&a7eAD@i1`V}xthmmsIk`y#WsF!BLjSO{rRE5!I0)g5 zMtGWX8qYZrYpJZbu<_{8dP0trnm*}fmwM%Sj%Q1v>KA!l98uY4A9!Y%e^X&xfUC`- z#YJoOCEb=VSFRYp<#g`wrAj*w&23_$&6538=@YYx6Zs7GIg&ZkN(I?zWRQzYo^+F> zSrh(a^)71KN||g%(bfIfqSUlN4oiUM+c(OSjF6c4o~0=&Yg2zN#sIlH7{h^c!cA%{ z;YrOq{Cj{6a{^0^c`6$=zc}g7Wk~vBQJ1zXm~=ej?jm5gS>#Bd6J}DcIYk0ZECuI_ zd!}1<+t-=^P2khb-!9Lw99-V%4-&q_hcose{4vtQ)sXp8l2|iJ{sx?6v14j9%hg~y zLFYbE2dc2dE}~lr_Kzhs03kz>HCV^)SU`?s^xAp2u!hhnaHXE$r-u)WZY3EG@#y~| z2xwGvEy}f^E|`bS=$tH=3sujIj3K0v9f&eBAtOmrNttyp(4YM*vZbIX_aRQCa8zSs zsuvj0OE5)CXQiDKX2c%D#Dp~Ljsa>80$fJdoSZv*nP62sc}5i1C{VdexGE_q<0hG8 zCY=1!Ok=v~5hm>^GvmU;7x;I!2}q;J4iQEsdtsZG13X%KR~Ta8yFrT~`2hfQ;u#LM z4jow)LC@G@ZC*_neX>gl!*jgo>F~ZHjQr=~FylENbFM=sJ+&k0LRj<&9m?JruKtS( zQ_L6cV@(X`AEWecK7mVW9+FFI(ykG+f6_%ZhL42B`G~+k{Ix@2SLt9_gj}B$b6tq} zUbi#9?Xlo39c<tg9U&Kw;gmzau&F}4pKIK7J-$;e2Ra_UYEcQtRdm{wV=((}-z%?| z-ohMir`~udr|A??;mjAUwQAe`k+)B?>9uDgsj}?uws+!gVmQ=<mcEkYsB$1y|8lDR z+yXrS7yGD%wmf)N;xzlI^-<At{X5dH;pZ!@WaNwF!4H(4>HFe=so19bM}fVT)ttD^ z*Gty0WbJhfK%O|vCwA0!(=iB#iF9I+5)Q$sjhc_P%qfjkw2#Z~a%w)}N<r*?a!E_0 z`eJ;mhGArQpKLUqod>9xCY^-@$vj<e(&`#YS$2iQ0ETX|E4Y|DVV2$5nV(!lK}g9& zkBImx(_LYQ*BLkt5w~0<)reW6dQP*L%E}othheIr{!XpIBOzFqYU(v<Cr;Guot@tt zMd?zSk(A=#ra+>C3A7-ICX}-^AI-u<?nnX*xsO*UlbQ)D2V*4C_mGI4vcY{wP!N@) zXWwimXgo`BxHinrl0+y_eQ^Eb$Y?|)Da}-x+NnUNjWBX`Owt&?ABCgh?!7OQ6@1)B z-^Ps0m%lt`Sw)$D#*=sgkbJ^TFh6k;72-S=w1~Es{EPxbat4qqsB7VJKwBDc*j!r| zXN%B!)FWav-Ma@EW5}FC;4nCZhfYaez-%O=@(hW?dqg}uBoe_EFVg9>B*82vg$VJ9 z5!LH`xO(wVbc`ZMH3F4CCHEbiO%ppI5+Z2n8^;hG)k7x6QPLkYZ%a1KN+hOH6ri>l ztZR|+F=X0C7q)bUYaeaweQHAQ<V+2we+GfcTUsucDv4;hlZ1sIDPjIlx(yjhW0A*_ zj7&J>L$n?dW|&XVx_9{cRf<78z$tPs_IVf8h%M4{Yy8g140Af4H{)O<&3EwkC60VP zlmm6uBSlW>Hq{4Lui0-$qSGmvM8&L9B@l2t$fQZ4lY!heN1AJXCAT^2iapg|iSdz= zBumXEm7YOkrlI*_Rto2S5=N2|xXPy7sT6<^BVUZIh4v-If+&k{mqBupPcsPdJDr<f zw~D*H=}eXNIWS#D$N<VH;Ea}ZX5(-8vyiDsT8j-UAQaAl*#j!+QsNWG)AVPKbVgR9 zN{Z<Zmn8dR1}1)~7M;S(T6AnVF0Vzy4c5;=L}*Kb7dXzdjjdDg!{Tbzq{=;}E+t#Z zCrR-fE1>hjWGm1gn?Veg@NIdMFedNM_$7?$CQVWIW-!NTYpU9@%cwX39O1KB6V&kO zMw5SYZH>?&IHe_|!${6@bl2l-9A8l<p0?Yw?j!wr2;M9?-?GgN%QSN=)Q5&noDL}+ zj1w$9xJ~U<V3c<bPa^Ri@>uo47?^OERtoPt(0~VzvC&W1i2=w#3pNYp>QlOifO7>R z`2t=-8E`3}{)L`<X-n2F+^)(jJhFfBdB}UuE=W8srr8XUs*O|$&rUf_v&=J-7DWtW zE;73u=u0&1pbEQ77Q1%W4IGC{*p7;Mx8z}N#^t|x;xCxogk>@#A2D<8-JBEXR{Ea( zw#I!BG=|)#FIuInc7?Hu@d&O+UbbhJwQ#yH7Ixi8n^@zNHge(lG62$^QgC>6G~CFS zbSp`ODMZ5FOvc?{e~rphn%hfaXgB3D2Ve)}!0zoqMDbjuStAcYo*{Vw2=C+t#3Y@K zC$$h!z=%m}^Yv!-Dd(PoYW~!Q*nEIFLcF}ky8~!^{N{FB4?Z3hF1|Z|nAXJR>Z82~ zS`G=P8L9}3gzuS_nJ@kc3>8iU(L(q~YQ8a}ZAGZX#qomnyG@_{?ysJGMUTx)J6Gn9 z)uu}i35>%cv5@G~I5?6X3ey%6xtPVreLr)ElYT6C;CYHX|A64TI9BWk%S8$E4p8w) zbaYyvs~wb_Zd(Q5_Ma86FR)26e``N&DK$EEE>r`PZ+)5V=)C<7`ONK~;hD>fX<&S> z!lj1MHDdUVGesgAn;DbTQ_}KMI*~Y|d?iE9@bF`RsJnJtFC(9!tp&X~Cbe#+3aa~9 znqzSR$wx&W>d4xjZ8H_A(6FhO<#V#k_E07<w>*^#yYO?r#A`OLN1R<jWt<XDL1+ry zM;VdDzEJ18P{k*98r_GNkw{nr?B3N1+c68%a1mlTbR^%9FD-v>wVc}_#@8u8X2;xo z_0V?^I9Zr}yA3X#x`!MrKCwAX>7*kHvcoty^Mnn$jjH|LeqOP+`Vdfc7`f-$AKL2K zZr%R{KM!WczD;E_#+7OuJT`JZabl?*dj`4ND#*i&%|bZQaIu~>Dlu5Eee4miwJ~64 z6l1l9NO~$sjueCJU^h(0)Qh%2QMNzjttqTZg-R|jP?HK{VO#%wJ+6E@g~YOkI1d9H zR^9M7^65GRmkDOux8NoJTcPelmHX(}zu3~H6ol{pQZjK^D+DyErp6|ab~Nepni7|Y zXdm&KG<ix&7WU9?sEuN+#2n%CsP~31pHv(efhDOBfb?vtfpwaEPLM{MD4w}_IG(&s zjHJ_axkN#$nSs^LR9A)<Sq+yC9d8$&Gcqs6-ZQM9MIu=v)T9T8f3{$Dn?Ioau2X}7 z4(OGEjk|RY{fP8psQ@-G?cdtcr6oYKM|9SP+;4vq%r8cV9y%rinj??eC*7nEbA*Fi z-CToDTxY6Xgc2sO@2spzr~K<5(Q^ZwK0~b3y1kPz7tET~0_=5l+W%#-?{PZtQ7cz6 zM)4h7f?d`2E`nI>;Id~WYr}h2@6;~HW3XLGXG=~MolpP0UQ1+QHzplr()W<mt|?W8 zD;OBiSypA;5)tJyN@^0KZxwOpC?g`Db*J0++5!tTSf&!8?dk#IDa^gT<>)wuu9M4q zom0-xS&J=XX=qxMN#;1IBF#wRB%KYTpZUAC9?}}Jy0V!9&F9h#tU5)h|Lt7=+FHaW z6CUPW2)4D~P6*=>_o>^#J!`rF|LwLX5YcKZbg#hktq)H7zX(RpYz=|oLo%dkejPXp zOprqT<%<Q*L7<QZx}P=XRey{ykT0jN{P3*ivrRhaV*eaG!eJm^!ud`|KfLKZnmJAf zoE?g_AAYv?LgnQ7{<st(sQWN-bM)N})8GshObkPbv>_IYQXs3@Ok?zTKVK@>i*81U zkfQr|*7E0A@TdQ426Kz|8|J5wrJNmZ#xK&X)A?J1leg1DeZ4Qi8NIpdMXoSfl)H!< zLR&tKt1=;=mr8cE=pX9Kv4{#$yj}Z}fqy@WD7sv87Oi}bGkoZ5X?grUxcBXsZ23}4 zpW{=Pz_9h|56Bu<V398%=;LDf(Ua|8s#EG^WBd$@?4azT!tkPWX8ciabUZ0TzL*Wz z#uj60hRd*`se~~Q*m<Iu+Yk+X8~24yoQYQ8#0pR`Iw$;<JJx^v3z$ulHWrPFQej8f zb2!e}XmG^FL4a9;WRNIdexQ`mEm)}hAz1fXRQ%BXm<ig+Ki7!9*@@0J2Pj#Fp3+TQ zVW!3n&^2R1Rw+Vv0wL*mIy-@r46~3UCYtyvrlPjhTD-6X-09kpZbS%%r1uh)1&fJT z=3jRd_`VRqcVhrdF!kQ=gVKRmY{ss;I1jc45<j!b!lmIOpg|RG-LOTuTlCq#(|&N% zwxi+<bMXo_<OydI;WmOS9FA&HgeE$?tuUYbC2X}e9iijF)^n!L?bqs&sdholYK+j$ zk%z9~f=vPw$o#OeVHVMv7fHGVaNLHOOak7F*9;{hM=)3ms^?;Wuz93`J#&rdBumL8 zKlcflsgzq4IRZr)UVOG9)U~nC#~`k-mAGd0I#`sHD<F}o)sM~O8a1l*@)1~0Q8ykK z^l6Pl@{pvqluak~?M9OKCwLkyjwhpd(cPDo%T^z}(EgL3E}u|8<j|F+plk8l3FIiY zt=E&CLmQURO`rOtH4b%U5p4CvXJjN<O4yCm%G)kqlWVdQmyKpv2+u@^nZW!%_TK;7 za@@EN{C)lk`<(blYdcRQ0D?d~(-X^H#k1?gUMF7f$v#W_y8Cr&Vo4*<jBI)1?BBjs zDDV;l2@qd-Z#&k}o!9T(DiA1qs!&xZfM;?D<-UGOYdwhP_OFD<DC_CF3|Q{xJHoZX za@+R+`r&nv%k7uVg)mXUjpOgFU)o=~7j14v5bWv-g{-MB98nY@iKtx3^!O)sAI-O% zg`<k5up-h8etE%xxpWaHTuq;t!^^d%xqaTWy#8|b*f4++0k!$__DHqeuzPDaYTsgU z><1oyJypSTq83nbI<5Ww{pbHDoylsFtnxqa)IW!SZBw4pn(Ge?Y9)JfYw(NB2;5(Y zCp^4BYxp&mJuj289-Ki}MS-(5IMToU9=)P7Ec09wax6cm8^KdM>j<;#XV#YyaU@Sz z6|lmCjN;Fq)~v8QanQAM9RIA|k2mcR#JUKrMPzwyy2@~bRW5fx4kn8gXM=?FnU9;s z<Yt@^#5~~IsID-Gsh#;EImEs^3(<N*H+?`^eaujo<N?%fH-$UsTc;}gRPA!rPC}vX z7h=8&rWp%Zjzx`&e_f!?m9kLr3uPH)Yv&mhbzqf$PEsR%1koNhavgHjvQTPOX212P z+(dsW-bSb1RXipT`2+)^EY(JaS0`V9cPe2+o}yG4(5kSgk<DzXyjc>ieR7z;VCyuj zud8SSe{LGw_MWb+=_^#}7wp%(HnaYIV5qZ*bEOfQ)tb05w-1ftZ~qfr@=uNAS&}iD z!Hs0thb5JkSA6Ox;et1%q<3<Y>`N4;?;rV{F88D&oWVp+JDcujI5*Q2#qZhnahUnc zOZ79r(cE*^V||N)r=oBrUq-({#`cz^9MQzHva#t)G(`T>>^{{&KSO}Z$qHr6Tw2OC z-LKsYY~799vbo`8ZSL~iJi3Qm+UD-VVR6kac9qxW>%e9M<j~JazOAp}OeG`g^|tMk zVEHp#^c-!<yYV~o6P}1F|NG2tZpM(cq!fBy=`nTrrpvW4b(5zbp9_1_$w1Z!H{D+f zKO-6+R42}A?P!?4Up}W%vwni(6=e2)e11+xf3`exQo>mpm=2#&{^P=Sf#aQ}Ac;05 znr?`+(K3Tu3iF&kT&~-V0`)|XA&Tel>?h&*T)WD*JUY#Gmbz~{+&wa=^i-<ygH_BI z6|O`xA5qhh6@*6idm1TPp?S*GpvX8*?u9S(PcPq`_P@^pNQC$SR_u#*xuQZjYplwi z_Z47`t!^#T?I(b(a8ajcb3(1fOjDL|Z;=`~vyB-sL6w~^?0flM;}wRi+`T)KWmL9j z#3gl((cXt_a-u?HF0G9wEAWhHTJw@3hDvkYHw{+a@AB&Fc7=yoI#{362%@Kv8{TO5 zsSy;~sYHX6*FE<6Gs;@aPAX>A&8F9JG_An>)ILqCO<I4_1Kg|$jZSdl)^TZZLyq}= z&1BxGfGtb;GkWcE7pt}IiM`1LPrGHUUrQCp$#M9%%?1mUvd-i;T24AZCjH?DJEv9l zDx8Uq3LqMlwgX?$F|U^U-R&kWR{;u7*_?gK58709BkKTC)4hgti8rcj&HecKluZ$N z`e=JcpoQ9&k(4aoOli4iTqK0b-JjNwifG^Id5E*tHmgMP0pma$2ZF20cQ#dzk^nLy ztD3xS>rd2WXys4T535tjk^lX5p>I<w(Bg3VrUTK5@4EYxF1Lc5SG(lk)t`PNYggNm z_1GRBM!)I4)I>it5PN_6!7=N}Ap~|_$pU@qZLQLM=zv_#790Q5Z++=>ZN?dKMjw0b zGK6zD{XCoW)#dPPY@&5<8Q7hDlJ>9D4w0V>*?)Fy(i)|KTGW%(COx~_@v5*ft7lo^ zQI-dnYLJ7G`(2JHH#_H5H7h+f`SSqZEU9t!Nx6C8tc^>3tbUo}^dj%XH8LFxjpLg1 z1YEm>YmVP^*H|c>zNs60?|V8LZCxbcuLc|b4#xU>ZedfFi+a)JHdPTpcz|8^lrELQ zzkVu&mzaO>*=kKwRVcpwq$dudN6d0Y+i#EPUi;Li5oT;FDRSPg*`7&?<?ZStlotzM zs^9rJjuS*yte+iHdW8p9Ba@j1@unVOmY;Rka-pnYb#1Ko$hMy=^M2)MxU^6>^^S|& zmaohorB8a(1WJXIUgLvZv|I2H!E$f`X*zK!PDl%$bX+Dj*yR?NKDUJB!K>SaLh1U@ zDlwOg+QiAt2(er#>Jd64|CXBGc=A#Eu|Bsv8<XVr6>k@nXS1RftZ+pAa?;%|VCXU8 z@+9b`{&E&<nmWrxr&@bfkVKUt19=6nhUzNI)GvGbt-U{4fkV`u=T1d>a8tY6U$O;} za^SxFM0w+@47zRPp0QQE(;_`r7!`Dnlw%ybect4n?%0&0srRSphE=J7NUT<g*$H30 za-p3or^LnNLAUs#b5nRDag{1vSHs)LZ;nn}0K*U9Y&5^CCmqlUb6FU0XQ8`vgY|+- z$FndN9)8j7Mg_Ob6n3vFdT;d1EQ``YXEty7zy|T{(8dQF-~U;o64~&e4;tU}Vg2Pm zNu!+Uy<fkNzOox%2!OKI^auQMeMVHOJ2mi{2@f*i9VOfEK~Xd!cX)IA*TFcpJU@D- zcLuzE{=3iSBKzgNBxhLN$lE7QlFj;P|5Xf6pgn38N#I>H$Nfx1(CN&qZ^F3s^H}%8 zuRQRT+8Oaln`fX2e}6Ep_&XWIUyzA?`yPzOyVvy@j<&&k%pZP=Z;g5XJ7!+jfp|!Z zqGHp_vw4gvX1a|zP~0$Ljwd4unmi3XG4T<@u}a*#EoLLs3@qk%-I?1}Il{e3>v1m9 z&n7Es4py@iHPH`MWZ-|S3T}PBOmh-~R`8pWX4`e+q+8?LpYMK2ZzI<fXC)N-5x0`{ zrBi&TZlojY1ZlaC&WI|HouSpdzM<gb1JZnOotYnhxiRZM{ps(28T6Rm{2?@q8P4&I z_qMB7X!qSfKe6rgcMM>Fd4P{P+HLiRwc+%?Y}Zn>!)L^~^O(^%Sf39tKT3UZ``78{ z)=8e9aB>Pf2Va(1;@ECC+@{EH>C8LwmsNB^G%UTZ^XKj_R~VW<B?sYH_HN1~w_BSr zz2Yw*CcNFsi0bxxLCfW~CCw!+Z~wsm-oPshAx)LO>xy~M_>a-WMijiYj^*n~pZck3 zmK<~KUst)7kNHfR?I4{#h6de?JlS3TBi1H)*=V#=*5F-^wV#b4E@v*V`lr~4tqNV2 zjIIlAwDIVdRo0~8m^My9tO)wkorfym-qA&?aml(aR*nFJN8201W%G=igc7n$(TToJ zTkonFh4|VGc+`~3ULuF4rocD;0a16){v;d1Ga$9?Ry%2K2AHEpRd~H)yn8o<?EIPe zr$zwfLjTk67opL=K5ywjG<Cl&)Yv<Nt;*Rhe^|D2Uc5v{r}7aOt%?~83Ta*Ys_`7n zzttGzzMtX<A<O-WYS*3cRjY(yg-S5A5$Pp6#3=x8J;;AqpJK1DR;-t<qjz1j|Me65 z9C&_bOjUL_3XS0dH9($XS%;$DX1t{~iGX%iyzBl-LN5AVfmi`1b3aWn+!P*F<;hvt z>6)i}oKWemv)ObcwIi#tEK%pOx6HSnoqf2#U}Q~PR>q@+Bi{ED%<Sd+|IJ2psmkYm znkrg&NiLUJ+R~GfS8VF7Jk-uvi8KoJ=%M4IyJpxk5D_pf$yI5Q)`An+;7*IgDwa#5 z^jgEybOSGsIWZfZ;4ze}%MZ01RbD)Dbx)%`ui8Fpsz4DJIEaYrHaW5kOS*)k`{yOw zKpBHR)zW0+o&}<GLwIRm+ZF3klN-grrDM!!?26K%15ueO<&V+)Wxr~&Fmv;)O|#v` z2RiuIZ72Am$6isld1*TB+N5&T)4JxzQhm|8P1L;#>4IOL+KT%G<LT~TEo3?hy=Nx! z)6K3o?M&N;-={P)Y7v`<6^{$FYc;o9wNXm+`^EFO&%b?{*J;h|f7R}1sb5`E?{pGU z)(QK-SGjAxrs;veDqY%s=_P4xhMr`yr0dgF;O@JKcM3o5{kenOKb`F7_RARHyT-{` zrKKGOaM#G=u|4#BE$W&a51kC!_4}&O>w)L4vh(T8$AiP$N8Y{IIe5h*?H_*c`S4u( zz0|(P=0aygyazt@f)||c4(_i5_~OH}xpc9_|JHm&=7@vitrnIcVYPVAf3i@11tZ|A z?nc;XET6}Q)Xv8A-gvL=`7${LTHwx7xS7yo+F6KAy@EgBos<5yWoF-;W{#mys5dM2 zZok~2p0DlaKsS6uIpWMwp%o!v^{ztx)t_i*3yWvc(0!^!5p}qk$uD9Cv%7nmY;|xE ze^H%sxD74sD%X1&gLaq<&x2LxoO$t?Blt`<*U=7@Yt$Qa>oGh=e}4PdJv{9|H`YG~ z8RBHk`jzVop4q(vC%yvh)-Jkeib8MuJ`|59g=RC*=>5SF>}7s=CXd&*7+}9_`mH6X ziN-%$HM;%&`TommA)o(oIv)<aKCv<RACq%%`j7X(jw~tAsnVePkG%Eg9jE(kgLkfy zx{#O`-ErAAX!`u!&p=-9v)wylYXHoqb5~^swt|f*U$oEu{A>iD;n^fhxNAXIqFMJx z({2seT=<U{?!Nt75Cz^K{mQ?_YoL!VlE%Cm{P_hX#=BqS`0roIp1plf|N3J6gWIE* z;X4=@ru*Kl1n`&X&GP4}xpLdweiM9c<52^5u$Wdb_6}E^OT1HhxjL49-^$PB35?a5 zj;lwMG86l;c3iZ=9qNXGb$&L})@xj`UFVJ+=>Iu0?qLmSH-lXTniuPnt^7O)(+}_d z$}y(&%jYK#sqV4ulusGGQZCuh)dHlcSxFuG0cZDBE{*eo#h_G3$u_Lewk~XCOJtlo zqF_7ks9vJ&j9%FFxGtj~n9fUs+Ngx1#>#K$LboOW%GQsGIc;G%R*yEv(rv7(Gd;)3 zdWmmVKD<E8)KXqeCOFOej3`eOwTVHSH}|JNaq(G*gRDS4nnQNJ{Er|@7~luKN%MZd z9E!w02T~um?>|2$J{_0aSoq5_x9lS8?Z5LQZyPq#8{f9{k!o;gO%{~x{UFj(R%fqt zjP^N8^t&gcKgDdf*I#yD9w+8e-1@(S#`(ot#7n`HWDU2xu>@rHn~17z<_h#>dj0`g z%7j2=6n_WUoi6aPn$B|9YO76SRzO6#2)2y}kvvV#8u2~+F6r+_o3Boj@xJan;F<n* z=;X$miVP!}F$}{B?B~r^WEjQ0yUo@c&#TGnTBl0tgT@Z0Btld$!DszXhEuDR{6s{x zfV>A_qk>yO=~<KD7tJ2s7TIl(k}Q8Ul2DfKaVHMn-D*r`2CBDD$^YW6XmuX;m(S0p ze^JwRo#|@o0(4W_hDzO0^ZJ?AVnJr1yk4oQpqToUpnH(MT6V-wdT5a4P*<$~c?j>- ziwXmGYjySLtra~U!Y25r=tr@O-VkmVy1XgsUpmqQY3DZ8P^ZfcMeQdj<5D%dL#&t~ z=nC|%ej@cM%WsUf+<N@U@(J$%Y|Po?q<}IdQxpkhScu~8oNSJCa&|KGrtgEg+m_ZH zPL*8s@)U2lO0Io8ixz8i|GZ@Kd{xLh{AK5ms#ri*ZB9JeC&R)=7yYvtZy&y1T20dw z-NhiyO4s%A{I0R2;q9tCJSVx>xzpJOv6scOxt|hS+fZ{Oo0BabxMX;JC-`pS@3Zfa zi|J;g2=D9G<EoG173)Kr^ldYBY&z(cjVFhCdH8P=IQ7!|M%&~W=*W{^bVARX%JKx$ zp_GtOX%<L??bJ1UK}`~%QGd{%q?P!nIP#+CEf1tu?JzfmV5yUyVcp6%jeGk6WqXLl z0J&~cw;86Z_Vml(oeKgV!5hobPUH`tG4em@hWVP^VSk=Rb5Fr<cG66*wQN!X(9LKh zmG6~Ln)gZHFv*zE@{PV0i)eap&UzPYG*AWbP>WO+{z{WJxt}`*_xD;TyX_PeKd9p# zK~-Z{?M_sTzn7kbyr%>^(h$0Lf@<s5uLEVD<XDv+{7Vd}t_Da%Mb1dWj@ZKo0*%tp z(U}d1>)9)wO>Z;cM!tRnUvP3{HzyzMF9|dG_QUgU^#|Lb&GBIW6lnHjiRIMk=l_PD zqf(lU_92S4=;7vkMEsUod(SrV4Lix%7n|w-3QrrUbw^m6JJim4TWAMgPvo3+*JukZ zU5AVh_tWfz^XQTFgnlR6H}~<cvH1-k$DP<Hyf+i1@QCAE0G#3cv;Tx`oZa%bd%z8} zZ`@97fw9sA4f!i^zwve8M$_OHzbHDx#Qp(pzguA?I3rF}^1!4gf@UMpbtXJPZ+U_z z*Q-3{b}7BwDbVu0)#q?NJ!<UV^l$~r@tP4awMu!Xgfn+3L~khLGvckmgr5ok^|Crz z>+eSeaPsGg9#XAdmB(SLZ)RKCxOnM~wzVJhBW~zChp?Z`=pFAr+Q*;EQxqM$^O5^a zYLFJ6s*jPoWOkFvxbr1w-@DM&WL5C!x<42<%g1xkE}N0tTWiUv8~x1M8Gu_Ma|PS& zUkA&7)fCo>qD$_yVxjC&X4(1^>TvSKYIX8TZ7t28$~gBLc~ISmuF11rpGd2ixoaWQ zR3pM)cK6U9{ZoPNq<Vv9qAe`VD925LWA|u#3}=JcbiPfscJX|6-4bXjs4emD{n65A z`q$@~n5h+LvA~nx<yto{wROYS1t#@LuHX=FzrBgp_Vi6%mCjtkQqUX3$um$<Z_wb1 zyQqvVQ|xw4pUN;j>DkP2Z0{pCMRLWI3(5nEjJ(y^Ct6XT+gMX$n`+V4<uxXk@?2c6 z6(o+$tD=$OAh)9X9fuR|RY%oqR41L)gKnYr^+}Oda(LjBLN{mgx?Fp57ayjGv#D%a z3^&7TFV@0l9(~Gy+iG0-%G++UElix-jog+q0N7WJvb>Mh3Am%(2>j*C-|iOC(51o+ zM_;iBUzo1y7Sy+^Ah>iBwzcL(X8j_|m=&m<3@<;~w7&0wzS_M1p<zwY*}Pm7t{x0B zt|k$D<mp>Kpg+K2z!C?lJX=R6c4=hcW7e%@@_0M6{Y-dSI$+z1&1v1XMx27||Kr(I zEWw{||H9_hKW}P$y*hm@{v`WY$H8)Mo3X#Vx>fP;cmDP{?G@_C^<J+6S%0tg<pNSV zXSKaQ8%iQs?x*Pyhs~^Q_KV&CyoPD1<i7pV;jQ<P0j*P1Jh^>LLnq{&+0gJYqS`Yh z5g??GX8-LwP}Nbd{aJs16B~NG1E=OK+Vn5~#wuc#DcPE{WD}WXzPc{2=_k-4S{FDQ za-wYh)P}#0Om$SjU9uN+Uqq*~KG7+wo1$`CSNx>3>CzIGu3`N0r@!MM$>VX>x?)&V zOjIIF68jxPy;J8|KD;|kby!OR2eXnrq<k^DMzksw*!t6G>y_qwm2%j!kwg!j#X=7? z$X4W$#=z>^+Q@hl-%6bY=<^Awa+Wh@GhiYrd*8LlrF7QQe6G@`1r1i;;d%jayJ#&{ zs$K^|S%9opqesH2#^F)BB9T&gdh&Y*syaZ>`YKM}lif`y;c+Lp!Dqy|pKbov4d-*8 z6z%5b%gu7*H&dU-OuW0LUu{*^gjel<`ovYQNIm=H9U+ROHXBtpUsxj%I2rY66ggI0 z4*98nTGZt=tMp2-OC3@X+fOVbQrr4L89^T48kFPSPwDRHls6VbQyJdpG(>H$o60}q zH0|YO5aG3<seEf7wRW-cl^jJ^GCyQFUTb(a&8%e&t7!$pmBq>(j*jGhx|!B|D^w2M zw7VUy6>Y(Lq1pw2XT;&}>&_y^A>l`s@8RdmY@S+n2)AtB?@}b@SJa%1^VW^v-5(8W z?u&)hE*a9I3x|i!)|G!#R@qd&vR>F&gQEVQ2G%(vy^%Yac`(nK)8brH|AQT^=eSfc zJG!x18g-{*O_w?NrQPi3=C+!vDrDy9wiA;2q?PH*R<2UvOda?IRqr^eBCh?kaY~xI zgo*1!fuG&Xn6~n*>eMx>mld+=+snt0?PIR~xu5z}Osm<rc1cdp)z)FTY9Bv!72jOs zezL!FxNqwd1@7~I&U;OEqI1w%Fy$H6UXD>zyqm&^NU2Y*j2`pwT+r={CQB}La$01f zE_4>M8Y``2Xf5+z`%DG51U7_6X;Wz^X%h?v-rCf#PN;5_%|@Mt=WdhQbdxRRhUr*j z^ta#H*^a(xy;N`yvX67`<W8^AG~9mM68k$Haq6-uUu&py-Ixk-U5lG0$!RAIR+;w7 z>Tc+=nDnC<{^$74nXFEw6Q9`dMmutsA+28#&RQD$d^?ICEETTlM$oTs4ddF+r8N=3 z=GOo|di3Km*YnbNtM*f#%83i5cHu4108T)$zoL5lCASbE?DvYbOQDcu8FQbM5lBBw zBBn~3wNSWbwY+0)sP(5^Y~ISNx>F$EYEvrdJkMiny|pQP=?K=s<94-=tr$`H3(EUf zYj~gXAh6f|ZC~hT%zDHT^JAM$j;l#(qMQ5uu!Tw)Gt;Z-gPCqqYnJ%pySje+-)?sF z!e6#t^zoJH<3wK|vYnf!^6t;N_9lqlpUZEW=y}sZWRCAG=ljiT*=<cxId|O(&27Bg zYrOv~eOjNYyGQ?ZCYpVMOH1LUjG@+(DI2bLiOoF7`jmWesdLZgr5$|qPpRwGR0wIe zP-W}{cAcVRA#}93_q7rEpNf^MaHx0fb0LJ>p++t$?mt}>5APRVd@Vx}a<Y|3zx}zl zgfqt7&vtY&;twXuPqf<&%};Zm?h4@CGbxnpRyHlI{8!-rHk3DsWWulMbo3ZR>LHUf zSiQOjXtu>T)$dhLe~CtTj5)_~4yudZeWX0$(VV88`3YX=9=+c)_mgo9CjHCsfPLbG z^jXHvM|gv&JbSkpSmXrJc}=8Wah5k##m#i69Nx&ppWH1m=|RG2x%5eBUDuqd^MU#B zOI=GfE_c|M=<2_P{(|XI=Dg!=+vDJJ=Q9<rn}onZv2VtCrB*mXDy{r1QIIb@b6<8j zb46WNhf_TVO22z*@{A=`^u-R|Ze9?OWoOdIe4vogmmK68sW4))`gmrn1FxdkWb{Y< ze)U}(_*{3gB+J}~B^R-KY47SNunci?8vDNX?O<n5s!gwynWMxB$(Xw6@^D}r)^2a! zx41!h6o6H;lB>Oum!0I;wm0<Fs5h~fM+HE91pRV%BCuDOq14ucEZi_Fdv#h<MGOEt zG1I#@Ln}fq+5n1nuQ)DQZD!y#R^d0w`PL#T@$}#`H}WZ!U++)WMEofbP1eH?JCbLj zh$={#&zt%(puhjW7d!6Wh8XqKHf4zGbGBsG?j*h;D8tXsxkD!1Ftr75Kp1XTD=7mQ zU5`Uz3A<#8Q9x7y0tU;~gRsfSbxm^Tv%tw}9U?@HX{~WOoXZyTU|*$3KMD+1KSj&( zR;^cB<)4O$57Gm<d7Gt!$LX)gYbev>tSTEACyuSj{>#!oX!tqiBk`8;Odo%{$okL- zr}=B)^)@*tT4A)3i$bFB8LqJj+5T>FU6kL^vn`0KL{ex*@>Z1cq*7{sb`I3Bzm*5D zXgALiB+&^hzIAnHKpVWRCfw7r<Y7>i`#7bAXDADD!V!(l15Lt<N3ya*mmS<{-FoWN zTiycSbVT1jAHLq8Js`92AN?|lw5&vUAjHiG#j8e{J6(lRL377``Qp3FRi1wIC7(WV zK+Ns7V=LCyxY%lZj6{GZthuFoqveWm2Ch!lYVV7#=IMCb`gy+@x9dRJ#%Do=PDDzD zyW&}P@tRHSC^-GWZN7|Djt7$))ZmYg<(>7W;kzAb52xH(%~DqRg#S50W<p{+(WYk& zBK+lU3KNUia^i@XnFvR68R24dTEYV=e>-}@MHRUf8mVATd33P6;4rJ6X}cp4M#Umo z6bZI-1fsS#fT&z6P>9m3H6#kL)M-3X=j(39y0T)d)u^I-L?v!ZGv^~!+6N+dovEM8 zl{@S2Uu3}JUSVuEi6&h-QyZHm_dZ=<VNs`b(P?aX6@26sj)`xJUjvfp<-INJln>`b z;nZF=Ss~_n809qP#D?)X>)Yil;ifZp=uEfOBm?AmrtE$}TWNyBVZ76&guOoxpVDsr zxz57*8I3M4#weZeN?mS-vy?CL0G72LHnr~!O>nX@KDM%LKL;C)S@JK=0`}LJG!OY~ zKv5_+%YinNhWBl`3s>(_G<pGUQ(wA5&gr3CyO6b;d)9Bot$4R)S*1x;ES5gB`}mIC zR+SX1dCA-2wx8g6=JIz`wDQ`D1FN<ZSEacd=I90588euXe)3s;cO38Bd4b=@*Y5Ab zY5>tlva9RLRFOb6Tm16hJpXocze&p}t&n@6gP3?xOX7<#{of-w?yjnO_Nj_wdw;@$ ze;~Id>tW$96WqFPL1<ZslRofT|2DVf)Y0E_6Rh{A{XR$Dr!Z{GQjpfTNJn(!fW>pp zRh-GkF3yUx_h*0q8~kTZN=F*Xgb=B<xYs^z`VjbYm^=O)5XO7F^+z09nN%r7rFJ@y zsyT?x$)y`n<re$x@F%N2*k2AVUW)YQHjSH^>#+W(mjTtvy4_qIh*G`$vla5@rjVoJ z+@qnOoyOuKtSNbc$nFF1e0Uo<rSeaIWJ^K)rpCAb9$4SgOxa(G6t0oC@cg#02is35 z#X!xQ(JoJN{&eB6&puU0p$k)I1y9N?<}Mdt)7{_KSzuWf61x%dMi&PKHjUf1a~I#* zPu*y5J&#-^crcfo=F+5!nkKQ1J<DO9mOj$IdMvQ(GdAD+&hNs1%~1#Xmsf}M>^$n7 zrSQ7xKqyDZ(V;fAAn9_vV6n`KHdi2ij=y~SY|pVom&EADosl@qEmDpr_Uv<GKAkS_ zG206P)^Yykj~1AoHAs}vBOy4P2eoM%ajcWI4*xd1S|e3qJJV-3;jx>?c(W3>aD6&h zK6!X1>Fr<J>9PMhMl905OjfVY9=H;dP?l%>j3SNY&sXo=WsO0P*l+Z_8$hOAwlA9H zxnSkl__kRBJp)O)7<$(eHXT-#;#4u$PIbF1a<rw*7^4EnlFpelswVl~pGyblKg=YG z-kB3{zlCpb3b!YBHaU|wKmF<Ne|eZu`SF+ZRfzG~ByeAF$N40slJ%MY`?EPf`1U>h z>(ofD3@r_LZh#$cEO991vTB(xi88-~f4ssU<_{@CN}iiUajj238)UqnZojIgdHa~e zw+Y0ao;6eDgWNnuVVE=-k#G84ID5za*s&#pH>tH8VP)$;n`dS$yY_*uh+gpvJY4Nv zE)l?7l^H!7meUs(J^rw&k(2wm4Yj?UIBxoEIOkJbGYu`YCTloZxLALA-WL<)Su!`r zbOyJOp2P%Qu{<W5hA1QxVV$nQU4u+#y*QcXJa3`?6G8L;M>#MO(CwGf`7VBMP~Ioq z8vNncE9JWv>akJ7x+&Nhzz1+SH<KK4z+$L9HXKPh*Kk=qUQx<jx`^@J&0Y6+BvpJd z%U&94l$qo(kbDalUF8nvxLLT-#a${6N16uA>64WaX{CcE-EnBAB!T%T4;wP4AmTdt zoQbYff>yT`X6<L=75onnfn4p)oeC)0>TK5TaQMpt=CjYni#$U~mvmYUOt<DJc{=Wr zma1O&3nPn|auuOI+^=}T<ZPL4)SZihg4pcjN537?LlLOvK;qn?Etk{<3Hb^s)i7rS zGy6}(@i<+0GIEx8pQrSBt4`B((65H>MT0ElrMNC#eR2{$=}Hn``twpn-9+BRbxQUC z@`Co9@IPz+COt*j6p`h-qXD(d${MEzcfn1*l<wxPB60cE?hSU$bEo_G(U~|yP?D4z zZC7N0=IW}2v#ytH?L>!rrmhuR#%V&x-H?kTwA)0KD$3cO!I=m{RSJn|*DOm^JYk74 zZQ`NlWGt$ZH=&Y{*l@ERkfH1Qp;n}ha`u+;`W)J1X=b^bcpCYclm@;?)?}Y-T_tKx z^Nd`|c3sD)u)zG}Nwupd)%tU<Y<%giZ~-tfc7@BIcIRoY-5TjXv+Y0UDYl$yr>I22 z#;H_aQr5U6IhWU!WGZBkA#0`21#-^>OoNnN`+B#tb+V|@%1O$FZdxy@JjOHJB!N2} zDwRkm>Roc>Ozw_r56Dza=2~WlqoV@6FQO(mI~81Jtxh*?QbWH++isbYRGRi_tcw|{ zkzkUupr74(`B-ansud1NJ&Zcef5~>I-(tm_XHHoaaaEy2s&a;xg@Sb?-$6`2C6iuz zSBuu`^sZ}TRpEAd%el6s{M=5Gp(uuL?p&mwvDvn?9uT;BDshn=M5Ar1r~(gcIdxeZ zJlE-Ch00tI6C6IUS)#x9=hHFSU3*rDnu_QtG4*@`pA2<AUDGp>nw^ZRo0D#)D*Y^F z*4e#w+dqYQ$wWw>Cs>c0Dww0qqe5GzKcTPS&$oY-*x};h;(pnyNB?9Q+$w*vpQh)H zv3GS}(bJ1t&)Vki3!dzKj^wSFtY-4|xUMZF%g>m!*iCJ}1=w^$AhT9DHqs=9^af6l zmN)mAjh!`qr}SjD%9m#^!iY*&?CcR$C;kI2e$f3czYioX%+@h!lSQ;R<FnmIdfr~& za0Zk_Ytt?%*IvVF1Y4z%+x)zQ&%5PCOR@7JY5U4yovn>Ra%Z6F^tN{xa`mj4+={G1 zMd?dm{A~ieuF0i3#5J1d(;cKv%R%9AihFZWO+S74<K6m{wh@*jl1`c#JlNM%2a1-e z%d+Gb=8`*AMrLmaH?+JtB4`_dw2Sj9?vwLI5KXgG?2J~rEsvuwQNPhAZt9_C<qh*b zwMAx4XP|3D5(fLB-D%^Gr4yG-X6uWF(?wQQke-W~_N9n-TcD4+(djb9zFjXV`Rb`i zXT7hvt?%km`-WrnL|%20`N~zO*kn}+KEuT2?nyM=#A=r)FTIGYdD5n~cKX6dC`aCz zH?Xx?3Cg?MHHVnh&0OXy&XjCFr;%&%<+1H1x9NOU&EJ(fH~B+ph@O*?T%SlUuAsku z@2rm_{J`PE<LB?%>>ehSh~}K?YM5f`TOM<DfkycoH1b+%Cazo+DS>ah$xWK<%*~fm zsI;gAEWb;<^!Co;LWtgo$$I$JuP#Z%X~#XT?p{G{%DKV=PTf=LbcOSM5`7sJ{G~-J zC-x<25?Ts344Hx*sI$*`30$@BRVMbwaYeHpmhokJt!^hpO&@3jDYm=sE({~zKR=R7 zt&0-x>Uo9LrQ0S&#gw(_y+f%d=R$jHYYW{<mrddX#OE#fX{DNxFlV9tfSTJ(4q+FI z^1{z8y;wV^nL@Tg2;||oP5nb*(&erP@ap@VSc_Mi_PuXLYx_C4NTJA(6eNgBv!9i* zOwt*H+!RO=Hv0moZG74_s}pCdxh6W_xhY0$p5E2v*m5M@ZXpW4RMMwxS~hqnxI{g! z(bU$_X8BD9(LQebaC$LLiu}$8UVe#9wk1r`qs$)0dz`TG-9x?VVy|=!$eWIO3)(lV z-ZMml%0}0Tq>s2_HlnrJEiaEO3^K0>M4BvB6-k)V%Chtgr&{~a?&w6+Zf~-7elx98 zH?`YU<=cc=0*lVje%=1|4?$9cc@F*ai}?=;eSdg^BmE)y^2vxz2yFg@xz}FQPhi{6 zkyJu^TUN67?(#(<A=P_9)!QvoZ=z8DAJ6u6rC-EOhx>}CXN!?#ZG9C1PXDtKH?U0M z##c1>R`)Ic78>GMsQ3c^V88pNCoH3}Fh0GL+~%9~j=#w_FWb-O&{zD2>JI1IldzlX zV*`I~`m~d&_rJs?Rq20D5$EPH@Q?S<?t27)hJTEsolgze*XsFue{o2d>Q@av$LC*t zvHr7#`TS#O?gMqm{_`lr4n5oXBDMei(CzQ=?R!v_!RSor8S#Oa?uhord;TX1jIAAc z2NwCm|BJ%_6Z7_EFW=nFy{0?jFK8#xFBNaxU(m|g?tbBPd-;>!ZXQYCtIJpENS9h- zb-Q>R!XZP{w<fYDyHw1L#8lR~^oO4zy$M#1W~gi)10HMGM&$N6KK_HAde77FkN3j# zeEH|`%5dSVq(V5Bjjk9>!zJrn{%QJ>zNVx~GHhP55!K4DA2zx6v(x}rbfZQcx1A`g z%53CIT>U8pWygsrdemtb)7PyEKvv1&I%mAxTgrn^<&&=)R>qW<`#*8n_42uktp94t zlcJ>%QQMK!OmLPuwNk|UyU_7e&FR#>@qXDP+FobOJO1xq{=xHaM@&DCn5=n6)GsC{ zfvKPw^LPqK-%sYx6EVIW-u&&~aD417?dN2D#Q%j{@8OphlhE9L`xP`O=(o4;Z@-+P zI>5I1b7x3aHCFMYLLptOu%SLj`;<Pk^Uqrj;GDi|J(0Oe+z?U$AvTxo32Y)GYNm)q z=((nA+qIHFcHB}Jfe)RG&FEYnB1`{V43~;|4?q1HC96kv@(8+EsH!>Zjq%I6*-_7f zxV~gM8)<4{v)4(zZi&rq&1VP{T_l>E`?-5H2x#S}b@x4@U_B9E_{%(Trt5mnl!T_h zZDXY=AIk?tMJ@2l@4}yfPuD@Z2}E<9kyOB@@B~NtZu}<`R}<kYmQ9#;;Fk}~?6B+$ zkkS>JnAgTO<vXvxp{|&xXSVr+ALBOn8+U_9e}MkKFR|VSL-fDgAvrLlwNPo_p*0U; z#p32g{4c2kKaQ4r`JG-Lm>`bh2OfnEXDvHl9?N30$h@(0mmu`?FL64wr0^)Yc~2r1 zQf|`72WhGp^1+w|);*T`ssow{EE&Qgzt`I@XLHhe$kBDKO88y3+5*~<U&))Sc+obt zpR&u5w+a$uJ1~KD!n~>CnWe3QT5BBl{%oM1G2J!BqV{vPyjD#>be%oxNnl}*N-JwL zsVn$a=iEij>0<H(NBz08{+Ev@-ty{{1{T?<-HCaRSr*-K9?C4|smNSg^=fyuXf<_z zf3usW1ec_0?aH!y<2$`#(EieTnQv`-yZU6UKM%bMmHXyda}?E%fKvJ1KsiXta1jMr z$4T9|L&dRlG`myV;imeRF6a0E4UE&PJ>c|u`vq$N-t+CslHg|N_R|eUGuEs#jSGJt zUNm2WdAwZ*iqVwx=!9K_gGWVOTi>M#e_s$GY@S?|3=4P{@eU<VMuziW3-nE&w#Tgs zQ!Z}ea&vmi%Iu3w+ZsyBJv(X9z<I!U1MBMY?f>fd;cio@fC<L1RUixd%&RDUs~>Yb zgA<jbz0n6|t&>@HpofiXV&a2O&suUDtuE;Z3UuJWRS1D5?3}skw0ll0Y`@U4|Es@P zbE`l8@}MiL<q}^7q#xZs!fHh{P$S3Rzy1%vA`4C#zd#?};ieZqP?Gh_9wKW0iG;Bv zAjC(ys1UO6{vKryVe7m10U@1s>c(szL(R64Xmt8&r!&5Pc`ThXp>8_tcPMK#xub2` zc-F&e)hKJPK5jIUrQciiqus135~@;(b^>yUgIgk}ZES43`}-F;5<G)Ur0f3`eq(=s zhceI)@BixAnrZqME$x>oaW71hP}3mLPH!TRsOeBfhuz1tmVLS6RvDYP#s*!Ds%JLs zaM5&idYQ=MeIh`*S;nvg?OY#QvcR9CxUN;2lr`zmM4kcIdTq#Rtk9x2T*8VSi`q|? zobDH+^y_A8RJX7OXV2{CRcAe^?RwjD(sC!UDuC+e&aaXBCiPIh=ige#>(Vym8HGzT z1bLsJcX2i`<*HZiB-f#{@{>NM*6Q9)gKM>~PG(+yGAo^zF2gfW<&L@O)V8xBUE!UJ zlYUF><9O*!WssPxI0L~|5&HFMxlg*Yi<5m4@m56D!F1_$8SN}=o+-~m?G9dN%?i!H znSi<m!rf6BcW;hWt79_R|1y1|g5rqGPrx6qStPF0>aY|WtiM%`?&Z5mEhCjG<5(Vw zbscj%ce7TyiHmhp#ptRiapG78xje+pKw-;0z;>E(HX{vFHh0_V{&W|Dt`5yTst_*q z(0T-$<$Y*3DP4nxPOf<r2s`4m(l@7#kAMEWZv3X%w=7@t(o(LjG5w_)m?8ah)oHic z*tHg>(FQ?<LiuM6;M=$FwuYn~_-kc*(Z1&cZ9UbiU7!f+Oo6JVqPovH7PDVHS;LG> zaZ9!HR6aGWeE3)_)55JRHwwLFd)=;B)v(If%C0%p>vH2+=B6}*QxjEG%~%$5zqEb^ zzV8uXx(9p1MebG0OD8?MbockVt>ZJ*YB=|e-G(YF*wpvznyt>ApspTcKTzMPXeN$G z_~Lb3G96{ss<nPqJlU&x!XCWfyJ6oxn^%=&iRNrrRm$l+X|08P-kt=@ctG;0g)G_U zA?Zr1+BL4e^kKa_e~%sfb}6)qsYrJHS}n4PwY||D!8VmlZC$IBJ{8wBS4~E)TvCS` zTM19~t=l@@dbHWnDNJ;Bi@_S&<={rnT|9yZ2TH1c7S2;7R<5P_rl*1}ID^%7J0YX7 zMw_w6CxxmyU0!~a6&AJYV^>eO-4b#3X&MT4O%Zh63$6WJm%1z$<0lYpG{wXjbD|-? zF5}i(I@usT^;eTml2@&MSAVXW;bhM>!=fkdVfF`C(^aV5jI?zCRt35Fk|}*k-(d?D zy?jy%RfUZQHnG92xJw1rar3j=buU*e-1)h)1K9>+#HO&zFs8*7|Lvyi0UXD60aDkD z;l0HY!BNjDfV^%OC-6d7WHsw|p;{IWH&Mx}(>J*wD$h|ib+$@Uz^T0{hhQ^>>XqWF z_YSifOW#~?k>XEOzzS$J6<?bZ)jhJ)y=;B6&6)CqT9xm7U5dA=v8zA1oxjTtefwdS zTf$2P*p9d^pkT-6-EuCDO7w}EDoc3PiVEd|Tz)VADHHj3RJ+SEF8ABI+J2HN@2>J; z9$++qHv2hMi4VLh#<DQiG*589g|1(>Yo-0^^eo!bbmHF5MargQytid`qHX5=xKO6+ z{3i;bbms1Kg?al=Bv+BVr&|8yS#PSGw_4HMDfUhuW``Y@s0_|Va<3ARG!vIQ59NC+ zN4?7x!UX|dQ+=qCUe%NCSD4h=;Pl(gYbu7S5|~|21KE<ZNiVza?oyR#m3b%*{>vBX zS|qoVTh*>yxj?G4@6zO0g{=%0c{KD`lfnDAc#QV6La!^=!SadUepz#sWj|-W_S4nT zt%6Te=BED3{bsZ4;*_`-9GRDvE_}b~@9NClX|K88I$Kyn(J!uPnt_Z0rB+*WRiNBU zzH5Y)rEE=5oU;^{yU-7vkId4)yh&(tMS64|Uf#k#AdVg1;~L}ozO|3Z{am-7@kzre z{Cxv!^th!5cZ{!^y#%DGyK|iY3Ksjb#_q9+|2R9l<>{g`xmJz2N`U?HidW5Rn|p%# z<>;y)+HS)$_euB5G(-i~Z=T}XU2wBd)m(O!XqCik8_x>i?Ri}MrKgYEZX3`MU7J#n zrs8gwAvv44`^ANcs#^uiyK3ikJ+1O-O0l%M?QO1aXqrL{gDt^QhIU%#?bQaChP~Ih zGG|XN=fA@?UXMVi-G=j}AUR_`9d^O>ZnaoyY6C8vitbYzym6)JE<&#Ww=l1L+1rG# zb4+tleO=0-ss3CSAfIZ^r;!Kmy3uvXR#KZw8FmkVf3GjcdM>`nz5NWNL%Qp>LGCch zo$}TJ)Lr!@&w{tOz&hp97Vn5~^t4QQNbpdb>gDN+T1Z^Cw3ddW{na2cjBYn7HjN6( z2iQPSUf}Z{XfzV*5Ae&|5-Z;)Hf~pRbJgyD@!M8<^x>|)cDs<_jJe;F&KfH(<f)kc zHYdd{&2b&M*jXJcRI-x2-73L2n@Z22*Bm$9Om3>eO_%LQcwtS`HU7E{^497Xk!dpz zDa-n`n$&}r|Mr$$?Oe7Cx$l=Hy>2Jx-m_IT@*Q*eo&2@q>Yn3j7XsH#Q5OEHe71)| zdRH;!KCI++-%f_{ajHiubha_`rOC70hhLfyFMSI{40IjhtA34bzYM;zq94}p?Mtr+ zc$HuN!SnuAyZ6g3ILyHp0Y@L$6q6-3y=i*-x-F&cr2=!jSRt#M72RlgV`h5ZYRlQ6 z1|rXK%-KxJ{q#d_yKSup3Z6dA_xP53|GC4;n%C>FdDr@a+)tCbsSf$^T)AATw%5fC zO?y`H<QA{|IH(0bgG5H_Im88?W9u@Oevs^qqI-`txAW0ye&|$ct?f^ZOg1rS_+(aC zYgey%(^P<=_?>Jen<y9Vvo>BAvYvd_*h6iWCC+1Hz}H+V-*r0MmB&<gx;a-E)w4Z& z7o9w(?$;mg*Z6sYW;aCSVW?S<Rt426^py;_b_@;H=B5Iy64<3x9#xIEet6f;74CV} z_W4dhYp(^P&srHa^KUl4{Pd^4|D~N4pw`PD-l^vw{5kx5<zM5kFRxO6N#BGTI-iQB z6~E~q>G1HXG>W(2{ut)yW&M|hi~QriI|9L9|8S-0D$b=}{|i9iEn#D?y0<TPlb=<q zvAPV=rya{;<8W+bn2{s2O&y2<<{>w2_I~)cYbWe4DYhpt<!NHbi_UU-V?~hKz2Ib4 zq=JIeQ}+o+(oy&Z0T<Gt6SDZ&PXrgx({h8<R>XH+1QMlnq)@xwC7a%SO*yLv-fCd7 z!lzHo9i}4Q*<y{ivbwtWk$DI&k{c8jjyM-YS5Na%H(Eq4*~(L9i<=MsxEpb0SP_(l zn4rA~Loq1cEGIM!{3@aEe33fOrp>B+B$Cso2b?3zy~_30TtI8v#UFWVMkhyXH}K2C zoZ67PmEa3Cv#>Zmku6Aemqqr>-1VLMTBk7Y>DlJwKq^P+gl>9uI91J#Zlp|21R@y( zUB$90dD-%s`}Ad{tCD_MdZkuy>mnWKO_h_|c3MubpXq0uXa15G;YMaUN4JlB&HF4K zZAV>`TFY}^_ldVQkxNqKk!QGr8nIt)4zwb%!`H-VO^w+lma!yx5b?7UR>q@mzSzOE z%%jYc!bOfn7_G5vYiQ}ZbLOG<=Wzbh^?f7J#1*;rQ|=d*FAjwp8=uIcdG)6v50Z?r zM&V^(k>9e#^Fv|ku4<B;g-RF6X=Byd@Pt9Nw8oheTA3^;+I~t7<f^7I)SL9&W*5au z#&}cTE#Pw(76?4lPHO7VTkLV=e$vxoX`$5}_sg%&hu`~?=sbT?s_^KaqSfUz|I^1A z+kW!n*|X2(k!3Jk%CJavn~x8sJ$rx!$I)VDf<ie$+TF!doK^1qxh{WpNoC;i^w(ub z(?^|B>viu5&z-|KeZc-FDra(`NwrivRZDcr?gUijq@ee7Wk1bE#Fm#&+H(tgrvX4l zgPuF(^pZCio7tYCT8DJgxvKx~{s%L%;fvCRvCw_(lO||2(FuF9S7R{mb5)g7VmW^| z^Ol$wdXQ4q)SA`f?f+JF!2YM)id9YBLoaLXszuM9v@2f7?P@G-csF0TT`9=_Y@bG^ zDlbD-;iR4BW$shURIOG`1soE1;wqcs99QS@S|3pejInKr*1eJ_pP1456nyW}ZWQ~L z4>hBXBl`!R|6PX;J!0)~fVgM}v@qhyNjHW?dQ^nk8!;VCA0Y6HSUB}in)5I1Q<SYw zSp6#t{e!n{T;<Rmxf3z%ZSRozpX8#6yXs5Q(87W|-Dfx%`_<~x`jdC^plL=VX(Ac` zq%iN0U8eTX%f_XhE2^SudqgmL(4@y5EqQ1Uqu+b%E3zv1BR2CceIFxz#jMZJ9qgf| zbS@>v_xe~2j^rKAdoFF^40wC<+q|4QZ)>=;e4@6<tkF@Nl;FH#vn?>);TbJYV-@Yh zrYml(N+gczE+s&%Kdoz9PC<NHR~PJI)_U<!eo+`uSwqizY;n=o=@h0M;SF3Cly`?v zyBiY%d)lFEFC*K3ja<c&GNoopSo=Bk8SbZ0rB`njo@ToGl8i+8W=~LjV=47<+2Kyw z<BDSV^uFXdz-LteskXkv<Gd_ER2L-oxGgN+<3uMny{7cB>{#E&`XNL-DO^w|Sy;Oh zn!7Ab3imTnHJcS_Cx(cZF6@Pm?VB@5?{ozY()_QQoMP=jTi1;yCEb%-d-PApvNp~0 z9~qOB^ILb5a^A+vNdh$6NhvNOD6bSPyn8OMpsLl?Sgop7+pJ&LVlVAN;`+HwFU+n? z|7Rzyqj5x|HKn?svGpfC4VbB1_bm@-d-eY5GLu?1oQT9;nXc&L8$i{w+I3gcb%sn< zYU-$uRl8`9Q%Tb<Mc2a*NJL!Lo>^OorLJPRnZFQr0@?gP0^M(?xURS|KbiM-t7h(b zqPv}lvP^F@YxAP#9lfoMMyF%*<#)Fv-KU#3c|jkst7*yH*$XzXRj+@UK3+`@wbKqT z6>7nM-f^JUB`VVRuJ&fH14~Nh<XX2xYt`jSzQpUbODhMG_q<xw<23?SimVe;dnLP2 zDcii^2D6u-+7rb|06x=-x<*pvv~xgO+;i3ZN{L1xZ+Js71K3TkQ@dz?DZB0<X%$Vo zl=~41!>YGY8W!6YR<smPUA&p(y>0gu&_D$bc#m)H)~|mJj2{jbK8GRJ$?6fDef|a- z;n3r^**Lm!_EE}K-K-kcb&su*_S((NNqK$wkMIwL=mzR{?^n+MDNvRyxAc@xTe;Qr z<OTlmR(`#KadwBp6Bp2v*rQgAZ5@@&IS!3-vwV4Q4!4os{Y0L4cLO3gfqhaxDpf0E z(McS;+ci5+6@YWwaAv)!!6=;6aBtEFUZ{CJOj`1z)1}Z}DmgZ-M2(~BfCTSeE%B@S z`<wmKmqph1{F6n{MEjeqaHYC;Cm*1ZgsMzlSlH$2mTE?W{%i<;iEDY8&AZ-W#GKs1 z4xCXoF=^FCxD3wm=)28?m4l$dE|iTpcWPS=?O*z*QIwrnF?3OHA2uVBsER&Yx~oz6 z04Ex{nd#?)#CkK4H`MhWt9FYeKIm^|Xc9d71rMC2EOs45TqT}%`qWsh8%HYZpI!SG zQKp<8<jz<7NG01lN^Gt1B=-$JGl9@nfQ<y)RN$R@e`Pn$!>@L2HcI)%9=Q7^u(UT< z+{OS{gT;*rO?6|+^V)rUoJQHAylSj)*b`i$Dps8mzqBMXeIn_G!Cr?1@0m!O?l|}K z0ur5^JM9-&7G`vc&XNQhR@JOH;slhdc?~>mXE$5U<lzQVa*v}vb%jne2F)3L>7IXg zkFj(5q<<V<C5M)fX*jy_RjzO|s019JM2vG$XjHTCH?>PyPxgt!nZc_3Qac;asioA- z)wbLGIX+B7Lv&G4*CwD%lwFmww%-@7-pp+j!?uug6$o<tp2P%tIB+aUBD7MSoGQ3p zlFyu(68x3}vA&9|Hsg>kjOy+DEc25d6lGYk9N}sHCQvTFw)y6HTRZ<wKR?@Q`&a(; z?|*s2KUQL)F5->wuSh8W(?7rYbNFQhZvN$0_!YML-sRZ!2q?xeP^LeqfA>2n-T;uL zC_Mks>jBw1So-&7@R7y%i?`S$(*N;aKYxF80s#m{@y~B=9sKYC{`rb0Cwz1D=BNMV zcQ$DN?1Q4S5#xu#h41#XH?EkeaSaW=o$bU$t<>wLC9jXK(8Svp+f2mz;_#k-t27XN zKrEe(|NW`7{70m7M+fMF&PT>NBVTyH^`Ewm)R))_iZG;o5c>VtjAfn4gPDyEG@uXo zXBvM7XcF+7F$2lSK9ENSm@`|>>+_-M`oYfu6DW^Y*CzUM_9f?_3FMq&4M;)W@^2Rt zWuKfPpV*M2tHuhPb?}L%If}HkU4z&&<==?bH#q_09#I3=-HRBo6ookMvTq?GE8_7m zzc?}HSu-BC1`)d$Tv2ysZfz}hH6vq{)%UZ3ryJRDzkTGc_C4NU*snM;61h`+HuB9% z79P^U%9d_x-`|9hvM|MjV~oi0cF6(ycEbriH*BB$QK#Cy;35!~#CHAOEDQ3R=kGVD z%3g+defkpq_--*^<iSRjJ`C@SSeq=iGaM`R-MY6EU#17VqB>|@<864d3%j>*Q<5=T z`$Z+Hn}P1W*(~<4I^B(OXBe*o$1y5{lVITH$N286(}j%`!;7LnjN_?~Xy?}^#-#{1 zB;UV)|GxY0Z-Ry@B{d7<c{lxTi(C)2l-=xxE%TZ20DSF3pldac4vgch*><}$7l}CX zn5<?SHIv-zhY>Sd?^5b}j%RKwd}=M)z*X>yJw0oGD&rYtz0H1XBPb**pfjx-v-}fW z{NAOjR&ymRYc_B8+s$^>&<hPiwLbg}EUxVN``vonqqA+Hdj0^%_=VY4hs=t?4|)nr z$aZ-{w+ntzocw!yQ|tSexM;6kq`I$dHO+Q(ZfeycdB7_W!(C|Zh;~9&A(EoK={1Y_ z1C1D)gs$~kc@iD6AXyxBMN2@|C-j6wP^62aT;zA~QbTM>D^kunSU1=<X1%<gEWt|u zKbVx=0iq!E+!2Q@K+gD5Ww_3K&WI{ztfv+vN+c4Y7DhzPy`W||zsobbKV#9tjkUVU zk?E9Y=={k`P9~!!BimCZ^a~TDcgUk=4Ei3Koy2CZ@NrTdx|-Q)>en~K^V;WQ!xtS! zmfLoZ%<?1bSOoiIu=aM5^zz%$CTX@)QR_5RnBKbBI^}f=Ya+KtNPUgFS+QmGFDh2* zq*|xV7UR3E9l!hLOu3wjyB<j&CS<6Z^r%_JHVX|6)%Z?m>5=JfI<$6|$Q3&5O$FZ! ziJbzpi0qHn=&M2AaxOAt|L{(6n`TQ(DK=kbCR>V(e|mnsQDl387jmx@LN`%#QG{z# z3fWJ~5=nm4n4eiZ)5gLbxqc#V2geo;Q3F3Iowy*@s`CPJp415R?Og9pNVvqW$`o4N z#P#cA)~B#=uW;6npVnh9{!=dg4Xi*}_UkZ?FZ3M?g`T_zUZD#Q=RRJO)GV2gz@S=$ zPY>dBw3~~ru<JL>ZmUz@J+;hFWo2jAxxGmJTS_qe<y}LHhAwGImLu3kmsCQtWM#%= zcJlupVI%nAl)c?hA7M|j$L2($fAMg;s%<ivrEu;SLT4xb9#FHK5mQ}k#!;PKNsrpk zBWw&d3NiZVa*J*2a2p|G-2D9GJ+`av<h(Xb^0pe}W<vk+e|!Gz_;PZ^OGN$d=h)@7 zd1<A@BkV^6j?9#TCU;cX?oaG#J$#6A-}AB!<mhl}$x<t*+Mu9BX4P^|?OxgnS2$}u z5A$5%m)C*r9_w3jOKrM!UAD0&0@HcgbgJu=bW)k3$Nb>4U(e%b-~W1MpS}I=<-7m< zgSW3gfBA>6zxnoOzkd1t=lCuE>_7hie~QoG+jrmm>ciI`Z{JPu-JkrsAN}RG-+cV` z<(Gf@^8L$?-o5<tyYIjL<&TK+NBHljcOO0?wZs-)e)Ih|Kl{zE-@knSihr9w`)U~R z@85s>^~*1Q_KR-}rTXlLzxeg6Kl|bPU#kJ0@%69Xzy21!P$Q6=e*ET_zxl<>_h0|R z>(9P@{l}MY-+zbSvi-OJ@XarN^Gke^;-CFwcrssOpMLX;-+cG8cRzpm)yG%ED)5PF zGGG7Z-MiQC%wHumXjp#n^}D|_f0+#(^zSEpkWcf#Mkxi;(+IzQ_SL9{k%2Uo{_N#8 zreD8+Y>-(GI3PX3fZn}){|+Un+42M<7a9xxoiB2sKK=~4jHA%vv#&sm@b`7tdcr<w zBi+}3c>UG)=8vYM+6YqX&z8P?_x;Pa-^14<JoM!w%;}362jfCAIV(AgYMeiN`D&as zh~(u3xW{2MGw}8I*udLgy!`6#Oatt*7kJ*UzJLAJ{K}oCCe8RD6rcQ-#AhED#@~KT z{g_t1d63i0^aw!l_$2h;*WbR{2{U}q%a5C<&YTTWXg%+qs_>~q?>=qflM+l#yYZs9 zZW#GTz}`3ih>six|B;G|fpb32qu=8ZW%l~=?Jxcb=JdN?fAg#FOs@ePj?@7?d{pzO zLGF`j!NAA1fO_}x_8Xe6QTU9SO)!L+O+Fv$B%<Y;-w>zV^cq-&P>QKpfqr?cGYHDk zlc44&0ECzr)4<D^AO=1z4C)4~*I&IiPt$8Z4f8Yz&Dk`KfasO^yBAP|kqw`HM2!ZV zf3&*$@usF9NhL>SzO{<@k@Rn53>9!>PawBR2r)9nN6t|JVLm_sM+T4k?jva2M~w}T zj*Kt@__uAt{z)P_2DjTY2R#6t)=Wq-Q@7`3X4z~pd=n}$h+&o>R5c2pL9Gmv!!S=u zj<XuMPp?<Fx)0Fv48q`(kRAgce0&=Qm>tFyW0UgfN1W!tf50dvt|rN+Y4RD^A(%nX zi_mB$Kzp@RwtqMemR-0=Mx(Idn!!|n4h(9Td`7wAkvj}Z2o6sh<&MDzFfj0$DQFs0 zb5PuNZCVh|ac&&U620c5hKF-8P7Xa`mTST+vzQ%M%)%pYs1;!9e+X9dmtfLx)B<HL zaG@OqV3)p;<{OUR7|aUs8FXQOnj~~zkCUDT18FJg>j@$4s{)7{RY5%sa-0P8dxj?{ z!={N1kU<mzh6>gdOosriMiQVkBx)g<z$}1ioWYhcO(cv+^g=R=Ne)Vbt(CZXjmUr$ z)38t|4HRJ2a8{`e8s9V$g?<{q$`8Z9B}|R!>pU6RprDBYI{^RVXkLvFW;qxNzEE(O zCxaU{%~BGHHY8#p5gOD?DNvaa9SxwEiDFtPBm)wKn4iIp7!r^xlE{SwFwMD!!9pJ= zL!pUcUMTdewNP>bs|rI$5*!thkX+gD1WGzc4dNGrrq1FzizIp>5nvk!Ju#4+=B6u( zn^xqokVsG!Xh6X-H&b7fFs;aOA%V_u0pNkQls1CH1rABrLZT(CS`76^fPFJ0l1NCl zY<z<C2DA&z&4>$}A%R61NyL#^1x5U!)c^zFna$u&Aa*qP9tg$R002h*a<jkE{!m-{ zJ90n=m^%iO!ud2?71Ya`BeiFLEd$72fC?-sexsiU&-_|?IchO8T<ksi(KEl69v7HN z02=)cf#<w6zr=uRG}w|!?>fXi^K0pum{3r9_UXlEJD1h0wX<VMjnNpDW?+B$z^Dzh z8@3H}ptc?+YQ&ZuRy)vT4H(?9<2t{Xe#aw158^fooOU&Vh@cHH(A31dG@)=BEImm{ zJ#ir>1uKS}<-~|#M!^sRdQiXo+W6tHlC6C;eDgH0iO&EspUsi3c@CgiA-UjaQ3s;e z>_(5${na-=LkHhHY1*+u_ZavuAQzukZdVUW4@(UgbS8yEPKyVa7PENp_~HTK#oo?C zNP)V^!A>x+0I1grbR8OjK^Z#%T1mQzj{^97T!M>_OEmEjO}d8gVNqPoR(}YH%nz~E zM+R%I1~+AxVObOlJT)%kMhMW-Rv#?`ES}(e*cia2m!3Xa`dMksX0C)!KYRK}^m<?* z2k>Nf^uD)m=~0CtR1>@YYfl|5JvI%vRML9@8-^oqh#|5Tk>MnPE!P5ktqJ^XY{ATu zZGkxs5gWM22o^<S57eGfcn%RUFov-VSSXqtmtpc8B4B{UYEY6hbehSS=>Z%k%iu%W z(1X_lDliMJ9C8C`HdsiDD5TkN0BJT5q^Bn-75V~Pq4R}^Mt9@;U$fD!eAAPX3Xs52 zhvhUG5;+=@aaoW?XGLP;3T*J1>4y(&0fq$DQKR6f%Vub^Rc<!!a82|OXQGcRN1uL& zYoZ557}00g(eH3==plXpuN?w3$$f?$u!(_70T=>x5I(~W*~9>TB19dq{`x~^$H-<5 zvdvt9833ON++!;=;~Y{88)P%?F)}oVLQ+KHvh8q9<Pg&1Dm_oT=j?DTpTLxZ=)iSW zn2Is<>NYYT)<h17W*B-4hn!%|EUc$Etl1H)8NnL-?HT<n=q&i4#!z$P^D%B=jqWzM zR~Y|uaA0Ob!nh$hhBbF!%?Z}rhqZhH=NldgEy0j9jSVdUiGuHNZ5TjqxN_tA>Cx|S zP4oiS>}k+D`W>!`UTO*8X7jE;J6IFF9>6Jw^<(zwcc?b>;15Ie$`IBbgE&UDa8PZg z3Os9!D}}OF6er8JutBxp9^(W7@~j4{unyY})kH2aZ37xU37=tyYKWy^(SnvB^dE$> z9TRL}@L^5#V4x=qoW$hN6Rw5DwT$Ch9N}6RT=U^cnIIgz!g(}-iWVlsVAF62+G$)t z3jv<_!9CDIBsQS@1&1lH>dVzKg_H0xOY|6uqE|i&pJDPrYZ$;1!?G;rdCwqy)Di=q zAix%EwhN`hF#E7223S}XD78>K2Ib?H7$7E95U<HSgFeKqT%|@+0j?1EW&`HLUhG^@ z19Eg>E1Aa!>i}p8beH>l+`}!=V;^UT?5q>u&<hW?90Ev&iA6L+1GgqZ;Ce$0(-yXt z9+oChfnn4RIiVKfMuXZpj#@b%pjMh(Jr_@)b`U#*X++Q<YNawxhSZ0sore{*5EGgo zY>QgxHv~LjWFahM;J%uEPfK{fOrYnY*3wS{$Z?(~=F<xgw3Z&j=;=1U4*ld|*3ipg z(3rc^i|KS2q=#9{fUYW-q{V_c46}z>%P>uV^9f?;-4oOyW@l%v%|uM#UIFfvB$?q% zPy=SS=Z0A|`g~x_3~C4AGcq5vhCzbS9A?HSx9HMyAGG2L99=mJ^rIDdYvATA<idlj zp@x_p7_?y8At%U!8XL%}IAoPPfGqxiN6b$U6oGS~1b9JmFz$g;#_Ls-SmKoR<KPlQ zus$h6p_!pLMzwZOtqIlIM>Y6fVBP?6uv#-x_E{{tt9PI#a)qh|evFM-9EKgL4TA#L zWQO=3Or_7TgEcY0OoCwrkxV|r4%Wml4-&!?!A75chianN6U?wQj=`4x7}VN9gPAHm z;tC^-=<QUQ2KeBDnmd7_<wN5-i_sbchi`{zLoYbSV)M*)&)H#GJ#l~#=$a6cTV>PZ zjot?}k;@s=<&u&}mfV1v4;Iuq3Tkw}ccA8j0ks&Ppz9dv4G>6ypYqvP5IK+N^K#Ul zC4T`XDU`pEYyJWxeuFa~NBZHzSv^724|W4J1u#m!g=Tj3!tAmKXkw58Q!LsVQHOqq zXQZEoVF0_RreR0FgEP^CQzu|CACynOLo?9}sV7)DmPuUccW5ShFnh2v?Yn;nX6~SX zrbr7tA(Us6n4>wO7T5;OPH<=#)c{fZgqb3v*c(P4&X!@GI6P09k!|RGI12{m4uW0y zkC<Q?n23S1g~7wKrJum0Fl(e2a>6sScs4MK0Gb^Enh~JEcEEp328-inFanwjOqO#- zRvJhY$1N`KX~4zNL^3Huax>G2_#3XdgKJK><{qwLaIj7d80dj3CbbpDvbBXh+2YzV zK;QvEFF3W_XYhed3?suJbsQ+OzG3i@Z5be_9?(n+pWa8drJv1i7sq`OkHLqwWdI|M zWcv;sW1BmOFta83jQd>18L+cO4Tuf2od}WmX7GAo$)5+|^X-sL^f>3^1c9ma8FtW? zPa}Y6gk?bD7Trt?^P;xGhc?keD8nJdH!H_NPS6$$w8uEK#SyfHf%Y^!feB;`@B%(O zM1SxIh#3&JLLI_Z=oPjQ44NOK2V3ko$OKkqT+FQwuLGT!4_jgY&6&ZBX`h_?pf%(W z6@p=$G~2f?e9#gDm%ua%A$<DD2QAS{29}*qa{mD7gO(UDgNdoVJ;Qv6T1=8znbAam zC}9y0n8P+L;8fTav<q7&KqN*1QI&w@k@<Xb^k8f0wU!v9s67MoU<(YeGEI|ErVxWn zisWjc=UdbgIjoc5SxUv2Lr$p0P|~1w*<NQWYR46{xZn80kIvRPgd%oRT}?&?U^%$i z)Z`HV!GkB51BD(Z$^pKB=jxHZ*9W`m9HPG;8a6N$u<lMALIW`xHjewye5M^&pup_0 zh7XJj)f7pDvF$TkNMH)UjZ#>sBJfE-Lgs&_9oI=d4PcW2{D2aPh7C!~ZZ@CALIOjD zh+~9UL@^qH*^}k-v`~PV9wyuf73d`+g(3>MP=F(ZWkXm1pvn2tW;ffwkw~B)fUyCV zSFC&h5@?iKQ45JePZ#_(SX(8!WI!?!iC#!F_@`j0aT6G~-hqM{3PrikX?_~#Sq$Th z0lAb!V)nba8W$2+W3l!KTt#hGO?a&7tYQlV*jR~KBM>icO(Drd&*2M+aTdUA>j@oR zq>w}*77FMg`c_~@v4R9CW??9-VAT^iYk(cF<s-+sAs|7cgCz3M5Sj>X*$_t*0WJYR z5Q%Cvk=U&`)Vd?iaf=Urn4oRgXffy(F54P3c~MHS*bhB=7SqxLBGDnGYPt;r^K7PN zz!9=RP(o<Kz&)Eu3_vXLe}nevg=aG@J;24x_vq74p2@WI5`0LhCEwAbiFJ0rjdtq+ zjH_0B>AoIs<nwOxn``BB<9?eGn3(a|^}2J-ErZD-0#HFTn#7CqY3Rk^?{ovbMn%E& z86T~qrkBliF*qCDVqk8+fK7q-Ffiz!oP9ojr+d;*Sk4H>0lfDCmuST4e51!%aksaL z9*aQ~ZgvjbXYkT=mVO4a0HKtrE4tAe^DPFOryF_9e1jV7eGW00Je?dtUuP_Xfb{|E zuiy#Xm>)6dH9QpK5DE{)8Xk&q%{+^d(GM^441<EjPEO#i!Gc6k!$JxxgVE1CTYA(k zaMgy{r}q=jL_cFSi;$+OXiM+soh?0tPgsIB$=w6|yt8FMajA)xRF~Y(I$LsB#byP{ zrMb^=m~|Fxl^9KtMuUdQOr!i}j;I0VW}O9NTRsd}OeGZa+5Dt4k&h#0)MqN{-O&3< zXQ0QzCK$?q1+El*ju_%u1`o}a9-KZbF(ad4$qCGC0kepLnH_<d5t#XthENX1Fv5B~ z8!!vwub5yIDZ~?Q0D@zP{YGELkl?~E_-!{uP@01<%^gg0!Zi0VE!h(~n}BMNn_`0% zg|u#&;6A7=1E?J=Ft9+)K7)^HVgR^dUC2y<n@jJb+R}>&f_f&|GMg)dk7~<cqAh8o z1ee~2wWWs`(ipR8H{@ej3rA>XvS4)whX|9OrU6sOWEv0~SPSO!LHrL3x0K`TGwy(G z7|^>K&_kMc3_E0-ZF>%`1Ndy{oe{%rY{Ex2(L<!cP!hxB&=a)90_`aZZE*x`LC^+g z6E}@v`IxD4l7WLgA#Q~}#O<`EG{7IDA6`lWI<7I125~q{0xgsf<=Qf2G5Hw{OOIOu zdK`D;em=vJ&k%g5X`o`64TGQ0unbyY5r<Mfxu4D;a+o?Tu|k#-XD)-E&aez%LX-j_ zjz0ZiIzvp(Oq*H2?ICdAAV?w9Ps<h}L?kX~<>)ag<b|ba-tqbQ3`-Bg!mSjkcMN_$ z0~kORpkInfOuiX<c^jJa(iw(afx8SgNZ{`9N=}HCOFBbF5i1X}8A6(DhEz`+7E~=T z5S}J-E#?8^38NYZkd<pXL(BvH@X{G_eqsYw$KtLVr$tTjWig%oWCoFgZ;7UfPm@pY zXEQ847*2sjVLN(1nPKU{nHzzQS(naX@Ut0)0W+!-o^?>W0r<%bOV4q?T2l4phW;>@ zA?DTFrfC49&cTR}+A1N=gKfdhWe7F+j5GQj*ahh^DnFS)3<_+sz<lJ6-p^$KJ%ru^ zgH;uea*(X&n_I8ETn3SkXpcuZyVQhOwWKoUC}P!gfLLW}`sWe+ZCEE@v<#vwg@C2q zJyQvC09aEvY5_~Zr0|1D=r&d*afs$68}!oeWde7>q@~CGF{R;a;WPNbq-D@xT=+29 z9Foi62b09W(F2+#lbrhuel%$rz(L~RhAu!@>HTQZ(!(TS2`JkQSsr3mujSD+5zsdV zK@=|4rUje|+k$d2>+B0!Ml1+sYT(nBZ!(dh3t6I{Cve&DD97m2j~--!9->f;TNEab zDHI)V8+;ROAa44D^q6or5$cWDKo(D%5M)&hvbaF)AUh3{fh>OlpGsjF9y2F_zQRmB zdc3BnhbT<;X~Y7Q$rQaIi83UIsGf!u)ze^5J&hi!XZ8dJQfZ7wl-&yfvuT&7Y4lM| z^qS3sLWjU7_c3kBF-Zdd=E|q{A#LdSfTjT!Kf5eD^gg1A9(+%ZRo!a#>3u|7dQ<YN zums9yIE3^xI*>LKrO`g3k8K(-Gi4ia5k0vGLOzhZhW|^ut~-2ehiIagre@aEZ*J*# zh~`hQcujb&7FG>KGs$lC$rJMtZRjP;2`q*-5MfSzGM+0SOzSA7*%780VH%b^m@QaC zAofxdhG+~NT?J5EO&3iF1Pku2#ogWAtvHlGahF2ShT^Wp-P=-JixhV#QfTquP+W?Z z_Rsgvyh%=W-kZFAo7}ti+}(3O;R73{Y=goErY$cx#o5qb+>;0Ks|nPbC19qY&^mHg z3A+Mg%`RuqAGbPb_}rv-)JrIeBIbCKEVuxO-W_=etcGCdGb))(#Cf18SZd-^L-Km{ zois8oZh>XOR$9*`X_fGLLExGKkp|14&C7-x+k*ZxY(wpyQdvJKmR<>3p(F&Z&0<N? z`IOWO*z&8L&$hz$!u=GcE5Ec1a-(t<?V{=A9PuP_s@4uVbd00$@EX>qz#K4jb)b;? z8gU3DFok_ो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�l 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 S#=*skKg>($DT3f-u2ZhB%{&#<Yn# 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΂fK$62F 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 `8lzO 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¬QT=eo$tcGIEnREd(q6*sPN%074rk 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�}c$E5!+In4O&n+ho#CT$iOc2(-!0bKWdC;R>m=@ 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�$by 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 QJs%_{3>u<hq zmZ%I@B$x_Gv?lRq4{!mU#2S<-c3fkljTZ+7nZBQsC%Aam_;De{aHhD7axJ-q9STJs zCxOuv3|SrE5`3yYb8nZ0&mwWwwE@y=ElJw?Jie{IL_Mk3D5LsY6zSc2oZV^i`j=V4 z`Wd(3vMzVOL<>T>`9!PAO}c6P5f%_}6~7s_YnF^^CJm0ocLe3$js~S3wdMw<SU2`n zyaz*l>s1B$W77%c>|^8rGWLbp$806MQl&a(V=`F;!kOY|XHm2VJkAwRi)Otmi-f>5 zq1_@D%sIZ^=U^o5OFJKj3D)?{;lH<oiAZvT3>0!hHAAmfp4GRlyEnl6`>x+GXJQ`v zm~MteB^F%yBo#x<op?2xNr@HBa>?P*A!Kw>@L0Z{XkD=%+Ox>kyo1_}U4_hd*B>6v z?+EW|8+1|~0vvXlate&7q-`{7{XatsQnX5XnfNTSACAOJ{d-QLX`}_i$v<a4Q*B0f z89}X?42bdKQaXvWR!_7?LjGYt()!=GERXlp-|Q<avJ9u{h4(kh{Vw0OVw9O3ckF2? zreBU+-@lpTDdeIYHcWA&I4&w=HsG)XUL-8okO2cNMW3?O^Ud8*Prv;Np>yÐ>yH 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"bm( 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�_SViy-hYKwdLb=Rd%5C0b1 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%0DRN7VbxC1^`l8;(Ik2tK<+Ncs-J-WIu%N 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 z�I;hZVKaCQ2AF(I?}Kxy~vKX~a+`Jy^sY>5zr3k+9ZW^UN(m;iE+LN;t0s0X)sO z-h=Tl^bCPNX+VsW2ez9eHv>Rw;CyXC57QWl*9m)!K&xdF#TNO72dXb0nwZS%X`Cfq z$6!buOEs@qi(tc~D7r(wYk5`3nqM<WfJ_eR9Wh5VhoGZtwzwf<FMmu(<l(#qY|+>r z^)T&aXdWx|4*HaJ6sN|k<G_wH85UtVf7Il6dP&hI?s<+!ZM#OJ9UPI4BCUHk`<%I) zK$ksHpnm($GClEVq$>`Ccl1Mg)bgs5-QjILh<w%?9AIXy`h7J}H{deyAOkjui$W-2 zZMkend)rKm4HVX+i>i^JyCB=%QY?ASoMRMp><rgaD%tZgAjC<OPN!CO&+nGbw5@@Z ztNBW9PF5**)G>+^>tI=9rha{A-oeN2RecV$|EGDmbWrPcU0L0l`?9%MUf2<r3`e9M zT!kO!o9fm4cK)q>Cl-+H!AjcP5GA}8IA+?@TI8GyW!K`dZZD!)%(Z7(LOmxEaVS`z z36K^J9AF(@p+4ris1x_)lep#$0fNndu@N5vsk;>Q;m|lk8;R+%mvRPth!drm!}HbH zS|-M@l9(LWmf=W?>Jr<cXDPkx`c0*wK!YQxI?+ZDpNLT=+!u?d{)DDua)a}0#m=Lk z)&hswtMEgKY&9R>o$HwU)As>}WMQ*VrW$rAH0W^fUJm==r(IYaxQ*xrGa#GDVvTS& z)KH-~a*it=IJklc;|UF-xDsAf8H1QGQ{q;i_wKZiet!9=oT#@ho?39YMz?yqqmXl9 z9g*Rbhnsw<Q0-auExSMh7i2&9W4U}ZN;^{goJ5A+ChV9gXcRIy-41_Pt?CmA{kt#_ zCE<(pVXVs{`!#2;h{`++drJa*x$p5%{ut6;cR>)S7@w1*W2pI$9dJXe1rhvzF)xhP zS$wi`LrM)<xTl5bmlKfacP2+HBpL|n56s~80SuxraWi82on6DzMdi6c;RRGOsq7wH zkZ1{64zFHLdx}oNp-cGps5u>zYwRUK>j7IYIMgL#sv>3ph?_u5`w|7oveS301dE#U z?oLGtp6-5r_@!Y?ona*`=Qo8U?MB4vfYaFm{L5Te1W_lJsdtCW?fB1OY6qj$o<Q;a z-^?X#&;kY8lIiQ$D}OU>xf4lAoslO5Vl>*XzZ_TIrH5j{kXuejn%HB`C8KsePVG^M zPuqdh`oUl#neVo!FnH4bFkL<v$!;UEF&NBZZa_fTX)mgm_<yW{V$;`(B8&#ixWj8> zBPvz_hL_Bb=&3!7!^_&8)?lp((@Ks0r$bM2CJOB49QCgM50H_)%%LD~R)LpXOoqwS zpytE#cDjMnsKBzMOzdA`#u-1sR@nRiVsVFvOb|K>14rjj4K}pjR`ji9e1SF1oKtIw zXBd;mS}czJOhH{LLD^)&h1|#2)_-spo~-%jyapKEYB|eY2?l@j(q`>5CJM_*=UIhk z{5Gz<`9Xp1*)lv!Jr2luSllN;o42qP-#Y6rqUFfN>=!p&Xm2AHUZU11Q`$K|4OOp? zw%U9zXuMh4mL7<(>d-^!vA&GXn?|4|DQArcuSgMG8l0*DeRR654=Fk{h!um5648{p zwxZEl374xszI4baf-c?xlg__zbC@Db{b%Xh5qe;}=YgyF>1ox>z9rt5jP5y^o;&@K z8_gkU{jJzvpc#_(n<6gck_Cvrut5X2r}kK_Zfm%Wuue7(W>oAS%?IfTNI;=NNRy@o zv)K|BYd$p3?Hanx_~8eoLzLS>jpwqp2SdLX_dO4<L8PkR9HWL3jfUua94PPu^!z04 zMxGBLQ#j|ODxa$dA1=`jTJ95|&)1UJwYA3G!7myQOR7WV{2uFe0ZlWUUClA0MN%KZ zAReO(SV<g^BuIF4#l4T4iDxEJqPl*A{tG?i$lt-1$C5*t@I`*V8P}*Rb1FAM6Zvsd zk|}IHmuNfnau3N=H!J{Z)8IM;a60klgGHE7e*0=Y3^M~wNf;KQm@eS5RV(xiAOE$0 z_<#GIRFm|j!T3pcPb4t|9t@31b%)Sl03Q$W4s~d1q7m6Z4)@VP##HBg12NS_1_<0Q z%Go2@|HW=nI~{N5T<&-n93zhKPA`r)LA{WLml}|D`|tFA3G<^pN3RR#K}!QyTG9~& zLuB$SCf+Puf{>HZve*$?K#A-~1K2W~#$!oM*5>d=i~oit66R}1$3*KJmSf%7AVTne zmr&1Me*ADwh{L^ZU%z)g!#y`=^V&w`Zu7-b@8!>NOe919L}p$jeoYL57#&=svslGA zUtjF72|Xo)43J?9)((Fgi@5p+(S<|evcEGA-!7@(c-WcNc|>o0Cna9mRmv}dcM`27 zy2b#sR0~Jx6tM_4(hxIb5Dy#-X370tXg(rOJed<=pdIgS*-|L3z^w->ju&VOXD0G? zq8Mhi!7*8JeoR19YH&)%s)7A!{QClCESXWdHOdw;h45Uek0#39I6h$g8r;5|#UXrZ z{8ji=bJ(y|!CE^1G+$cK^Wnyp2WMF?9)D%swchc4O@}&q-9JNt_ejSZ;`;R)Rr2Dy zQ{(_2M?Ug2CFO}GlqA5cOVTS!YDR;kv(Ash<n-2}E#rk_s@_FFk*H`T2f>l|3MZ+3 z6S!UHzt`2%KMv5*73x|>B8<rr8<h3qKP=NA7eL;|!lY>XLd-PA5>zFEOP$vd(5Fcl zaHxU@vj>HpI{BdH@=R>e2q(~Y=?8#HeZdfOK%Qk&GaFRiXx>Pn`D$+h3|zGWb;7Gj zK|{RjX%kzlIUve85Ne`GE5agqn=;{CxQ0UilIVS!x^+oha2B=mm{uMq5h%kSWwIZm zM|jQ}WkmNNwtXm|`HI6pD@$40R{|Mi?23$qYaMi~0!2F+J>rU_BbJ6H#(h)<J{FW{ z+hb!lXG<=XFEqA<JPJ!?2oHLkT5m0FIM-m!cD<h(9)ryyz5d~T)o0bLBmBjueG=S$ z_J*#+cP?OsgxG^STNb)YGFxtL;xNd|#Wa=@e)Nms9tVxKV;+LZ*3<Y}*IF*uWhnh1 zq~#$(*J2#UX1c0z!MMV}m<z;dnb<LSWKrkbO*hV*Sxkzg-a+UtNzkYB7hRK}m?E|N zeFX{T1$&&7vdE`HP`s(!&ABncBZO`4A%0*)nsA&c6{OKJv;7#Ss^jqQ#UvAlmjs&5 z)ans7YhT(B7f(j!k6XH8wKl#*vH2iztDc3(<{mZ)iY{b->3R{wBpeH>`JWr^*gXeo zpjCj(8x|-W;T>=C1c;3@@b<~E|GixDCh!>OjB}+WPC*(&|1Jn@x4ruG2?5~TClSgf zKhmB(ffS1v`(A2BS9(YhTU<PkgjHRLDFe)@3?G!B3_icd>jD~GPSI8f9kv|bg(t(D z?Zs0%;g$1}yx4!x_8Tx!c*YUQR(qf(0TCp#FD7VpZ4Ktd5|KzcUo$}usxx7i+OQoh zQ0Cs$2Y>(iWq*{&G;-TxeUS}L=hi*OM100W!2ASARF+=AkG7uSwgj=>wWhEPqhsJ= zR&2&}Mm_&=T-6X7r9H3a{NdCBCBS>khjGP8q=O1Pan<hoH~rE`4E^W;8EiU3O;n`^ zQ&8eyc-wS1{p*d<wOAqIuD3(C)}c?EdR_W5hsNI4w=THr5}fwVeH5pb{K}oPJWi3V zFVAT`p=(1y>CfB}om%PA=ths+7#4H0V?F{Stq?_o;9#xakbrH46^h=F`!S|u(nEH` zBcV=ty(}t>4nRuZG+~Ciau```KF)s#F&K6D^#&4=6|NajYH#Fud%rIUb%Vjec6xi2 zQ0W8ha{{LdR4?i?t4U2=v)gcp?zWv?>-yVsVs;dwP>QGrr{p|MSj^fKp}C8FYZFfu zR>+`ZGRImaIs!ul5_0r$jngwL>Jkt-*ojefWM$jx<x1Q(z3|eZbMo5I@%~ZLCF@4X z#tt#RM86#aLAa7=Ux=~rQ3KX3n3-rEW24)op_+#RJn|*P3B&bu{MCfO?7CC-FEhk? zDxpA3_p#t9m$WWItGxcg!#b%@_iIOx_}0gzT=u%g@$XtGf7&a0-c?zd%Q{#8X9`N& z?x%kd=H{HDm>7A5xnRO50CP|DL1=;L=4$^EyR*(_#MC#;l!I8J2<){lJdhLv*723` z`kSZWon<yWmC@0CXx$u^5w#r0UC>Ff6AT(Onghn_7@f-ti|Q8b{5ac|M*Fx>jB@bU zkH|tF!M)CD4SG3Yx$*f;jDftJVTu;PEe7NCuM1EUrC+ah$mBg5jfK_slbJLUwbzVP zi2@1NkcN&S1#CaY=8Nh`@X@R5%0Xn;crj>F9!%Q35m7E6X`w#0{z@g-V^!q{u`&_B zowA5E6=zSV-yvOGAJdKM8ex~)t4|P3cUJ*n2Wd0QYh>9y!;oBVJ7MNsIz(NvG2PvD z%>O+MCl%O#cG|72!hTSR&uruQ?&hz)%^}aqA3Gg{kkv04A(>CzT|>CKJR{oMI-QRP z!{LaPkb#T=I9%aa@yUdES{YbIg?iY^duY9^-<hez5jSbD!|`-mA6&qNnXcJISKCGe zrsQTWuR1@`!(WfPdQX91O?ecjC$Sq3G1Gj_83cA=w2Y_lA0^04>9I4m0>Aeak_#HB z<r#(E7K;4y(=>#W3F>lsrZ(gdqCq8*w5c$O<q)!*c*s_LSb1M$-yZrJ*|uRzT!A#@ zO*kza+n1cDhc|%?Y{4TE#yVA`aR{QXhu4N~`Zmm64UOr6WvyhRn7cmy!*r=2G>LRD zsW(-@9}WW>gZUGU^}sfT;@B!DNeg6wzP<MViu?M<)R3}dh!may<jU5jL8#3?mT<^t z1<@Wrrog@v_ca6&mHZ&l7{Pr0*BtpzYuLJ&`pLhcU=oU|*nJ*UpYzT1e|OiXPrqt} zt<D;Iqj8HxcA1R3dI~DmcDj$B|F}mTFl{*GE7kp=-rFi`kpi0MiAB3snW_Kd2dA+N z7=7MyZC`*ClCB)nRM_tP@a^T((t)|zupcV;v9zvRRFIi&E5V*-#3JwjeTGC#&w`oa z{5j9@n&{jg%Vq94^&1SP%F$|9Fx=o8V@-tDai~b|so+j^1)2ioQQSbWDfan{JuPe` z8C$?bWqhJ!ym`~FfhdR|qhr%^=#Hk4iSXHq|5q1{9}Ewb(j3Z290C+$dx82c{$Q+G zW5VqRsAbV6xo9;3Opz|Muw7q85HL#$+I>ZxMh7>YSC;$Igi2*?(4<4I*x>_wC1cz$ zU3q@ivGqL4M3Hp?>V-F0tRpzx)))Kc<nP$}NxS6~2`S6**=cu3;YmI`>DETwb4^13 z4PrY7dx=Pn(NE8hTx1cG3A@}M!vmrmc}DkK2CNao_K!+nWvck-UguZbJ6UY5W~i@Y zogj3RScEV`t=`GY7)H;o#;K&J3v?B^Tga7C5ye;*SuF=rgg)7cwQjbPKkHh_^Xmc8 zI>?UO9kR6*XK`0mA~<55sJ68!QR!u0<70<z?tjwD-WBl)wmU1_hgsGU00Mnp=u#Y> zUSO@3+Os>3B=HP!ZlegxXW0QX*|FfD-V`<<+81(F5OtC?dOL55o(?=0_*bp}+I3J+ z-Ud}IN2ZHVB&VcoC@AF@>&nl*2nA_C(f6g5lC6WCLE|jKAtK%an_SJyZ+Fv2miA<0 zj)6K@EYRt=<{4MOkZLmF&+;Q5Qw)$Gl`!iJxeRJq;f;F3O*V-BJ|$oB1~J9Ug^rE6 zX&?s;pP&@BfT!%E<ghX~CwshQAa|6-wHu)>S1haCFG96n<J2|kNbD=4us7_C$dFS` zM3mC051zCo9y5&PjPq6XA2t4rh*h@L(^c;o)RNXz_Al;SAX!?}T4-+<VLw~Ll9k#9 zP0Si0FlW-nSduF-8XPLL(=DRW{Y-$9q}o@{Vk~T*HdxalnYI^K9WF2NbC~htBa05= zEfh$>&JnWKvG}Dt1t33OedF(gF=Txu534v|$K$5iVAb<Wz0|I_{^fMAtm31IqdA%T zne`Cyqv{KJomSND&FRg4)Vlm3B?|b{rJ6vjDETsPtlE{>c9q><=3RT7bYoAOymZu{ zmk}j`5WSrDZs6sX4jRZjnXqD)SD><~!BkXIGaR3XMhk1=IFW%D2(sD`gu$`|2ITm` z_^H?)f2`t#DuVA1P+^`t*OZ>wSBzj@G^*q9{H4v<?3r16#}jh$*<o-IXI1=s!Pdf1 zP`_Eu(vZQr3p}Ms0fCV+!|gjnd7FeC>Qnp2NJ4jpJ1qo)8UxNI;Q`jV<#O#yFp&Pu zqd;r$^k92=NTm{SSI`x)?huv<>nw>UlIr}0(=P&CNM5@HI+FA-mkcKP5vbAHk3v1k z5VlSGZ+_Lb?j?)3u>W|L`Uv`tjr7Bl0$Qgh4p^jc#AO=^5i2?Tu9xXu?oPSo&%3Gi zUL6+(Q4_0OTaer!UT}cbXc5&Y3VLyxq00E7Pt3KHb{kt0#a!q`4AdlpL*s<Xb>J+? zM|zvg0>~MCKP;s(fpU~D;N~q(8_SIemlUB^N3p~p232F^B=%r2FP2@97_kBBq2TP3 zBebj|5hRHsCSn2w1LNb={@nwCMRs2pCk$Zh+8V&^Vk4t8`D-^?B}__r@cgo)lNx{y zTp&oKnJBjPngeo4%9RXqVCo<PFKiMbGn*Wp0gShM2D&_SC0$nAm?8BWHb{Lw*u`5i zS)*5?>n-uGW4P5oJ&5ck-r;7Md~!K~B{9Zv7nIO$f1J2CElD^I$vCvPn?I#J{=jcM zBxM~@mDj!3bWSt&yGnwJQPP&k<F;Q8I5gebo<%_jRg^=6^R*=pH$w)){NB2fb-yS< z`uAUE@aZ%L1)VSEAsfmd>4tA()39*%1#1$pn4?aE*Voqz>?&L!Hm(wZ+OIhL(($%* z^@x~>jy1ry<Np5iVkVHHoe0P09}>Py$Zmk?sUr3x$d}KR-@_#4nrVL25y2zKW<e$S zf*I&~Rf`N^;v8UXWO_@jT?ZsK!ha7ddd&bpm<AGTXEW`^-j0u(9GNL*l*I9(!q$Xa zKCPZgP_9FJh9aoAcajqe4(pm?KI`}-KA&OX_>UimuI%R-gSDwS;z=#Vz=NzD;8UX1 zdrI?VcTKo7gx2<joEebzjbc$GtQVVfemwYwz)(i*1WUZ*%&w3M+82U<J^+hgf)gE_ zx8S1SsOwe|v33V*+85%yZb>oXK=I?@+Z~-745-KH?}i54mZ0$|M|pUQFs7V2!`Z)x zE4F}`ve9fdVZ<r1g!IT!_+|Xg`=>ePzMyZweC^2kXi?^FPOiJ!>37pAip}ka9RyGV z2*R9h&tdvyE=2=Jl2@#CsZhT>nKBFb;)L16MDh%lykr{38p5c*m?hsdkPKo~ob>rw zikY`e(?nM9GMT9MKLVrzM6)6zyI9ys(q*qip2gm@DBU5{Q59RTFuTU+k!|5a1PxxR zsQ41Q4Olt4*<l>Xgl<v&rn0$ol0*=Z7(f7<j4<;vf5mp9I=r|@9iI5l(`%d}(s5!P z24%RFmJ{2!=(D9`1yUF;H0&V6=vXq=Z;C9!m<_fv6z*k7hyfsxWVoI5^Ep<FrZnSU zqAhVoQlO{DK$dxNP3(!}WxD1w2jM05Vg>`gMWcfz{Z-Z%Rz=!am*Kxca@eklkmlS# z|7IT-TV%t}N>JP2sx40`O}Gm%mBTyo_7^C5FhB|2u7`P1wEo}mMyjdCN96>aoUfdD zyTF$fE{tK3={<6<R5^n9*J21M{0|YXvG$;I<u*ke1)S}`R&>#suN}mzer$;4K~?>T zW?BKXB<IW)!JcDADmm0}IYqIE&@RsFTaS#vdk1y$21T6Pe|H9}@A_2+a}BN>h|w(^ z+nfhl?>5nyrFg{pK`lt%&GGfPEF!)cB=lnu2d~H;6xNeOkbJ&pnRBvcDMU_LMlqId zhWNqcj1V5sxBo*9^?_50DF&Q9^YcRkViBy5&rZTDu+bzt#X^MC0cAqrGSg;G1eS>q z<_MGLm;7lu;!@&3vGkR)4dbg<KraMJhJsc+{)_j(kO_)l!44i^BnQNB$}<~Cb96bM z0^Qzpqt<}B*bbtG%{pt4z#Yjr3OZL_YI)$05(_iPrA^T*v|?;@oyrI<EpTy~X2j)w zj`dal-TWcPgi;h}V4KIjrzU|fO9*mx^GkJbXDZ6BZq?)7>fzg6r<~<>8kF2g3_yZU z5x_u>#(b<J%q^jwNMF{kKP%t`(VF`=1ys8%J*?jl%d&P2%rv!8sl!FTRQ$PPl>Bxs z1kN+<D1m~5G%3INERgwn+(7#hwJQdMYQ|(5n$gilrDzS1poZ6=Xq;sxrXo-PER?UU zZR%-R`&S?yxV$<bNZ1METt8RuBZP7=WJlQa(U_Ogt_7yI&gXT~nydf2_j?6%8@?A@ z3|Sb0@gWyoV5BCW^4q?4PKN92IJB4D*m7x4Eto`aQ2dhHUH4?aFeZ(Ig;d5-jw9ag zW_bO5qORkpm_zt56zKhI1xrR7i6PSw-1D1)-U5>Ki5$Z+P!S>9`tX+R8sD8L`<qdR znY=h6i=bfrg-rym5(N%S%of5a2wjw1Foa7C-|WKMw3DqQdP%a_g=9vPoSugHJcqfo z7PjfwLjmYd4iEC5PDgJX4nSEGYvtqXCSxG)9u!vG8b6zRE~kuw?ahCb6Eik}T}Y5< z|FsgvfC7VRQ$tioC=u5xK3;fU8*>u-kbSL2=OA|?FFRRMZtIbKnm9&|tQe7dLMCcJ ztMSi~pE-ZIhZzP~gIoD1LPaTor%<)lXy$$yZds?2IxM}1DE7ek{k(Vkj6r|e>f1oM z-2j`xOu{&@QorDFo~GS~aK2qtL?N&{mI{Cg5s<aFln4X3$%v(tPy4fSLn5=!<(tfn zDTf2ECzq6=f}7KE;j20eXOT1!VB%__A~Ol`IOTL_%@wEjc><@<^d~R~Nd37`RI7di zK!@oq7!@)A!qX#Bz5$JGR2&LS7I@D|znAA@qVrGt>2EYn;|Uw+&o2*@PdCu?P0)f~ z%tFbxDA!cm@yq!Q-1Z*@fd`YMq3tUmYD%W5D*Ws_$;d_HD_oB~HnharmFiKz>RPJ1 z`?B;jv*0_xB`0n}p3lGpnOb<f&8#UICHu(J3(lXU$&Q@YtS;mtg?zR-@LB6^net-0 zN|yGe3kUU*=lRF_@`hLuhHO@b3?I~#onauui3TZTbx5dhtL1E@l1OWt^_|TolGP$% z6Rv(LEN^I3YU`10%o*E99tGO)_0*~ht-CImSdghjduRJgTC3XXw+_?VX;Kj92#0Zv zJ)Y|`V1m!HXj8+P^%)T?B>yDxqAm~w;pS<4{R17ikRyqNH<K7}paI*zT7Jeeg!``T za!KzF+@l^3e_zXkt3F9`=K^y9adq(^A;Q-!<53pFH2sjqi4`~dBI51d{8CM~$ldfr z8dvOvPAq<!XNXa6Ca!m$*cyZ&NBR&FhyW)?UftUId{U&bi8hEESc*)dFO)P`;3X(h zHNs#JGwT-FL7lM&)f*%FO!HREt!}8nO9S_#4VlLf0&AQpmn!}o7(SFCJBfmZDdD27 z4$Gx09qq}cBZ(j}?sCD-p>GTNb$(Cbch`)yJ;}g#cUhE*2r~l>rYJKJzeGAR&Y@=( zFc{2)QqP-(i$9^auzDPXWyseo^?Cf^ycFMr7Y=Rr`AcDMYWxkxLcy(Jm9Gv!MTrqC zk|Wvz^TLQ)KmOp`Soo1#b)1^XgC20+m=-2wBIG0<u64u<Dra$639K#Ut7CtaE7+@P zv2}&nzC^JA&{`J;F~+z0P3UA)rUemQtUz$mTGNE~+YoER%-XP_{)_@C4hQfN1KSsz z_BQ?iu4rYl#rEqNMltE^!=rG;8?Fg+EgU*$*G#J*Hz3+Z+{4R{Q@6XI12E+EfB>NQ z>qQeH8oRxCb(&pEE^hz*G=QL3HV!zn=hK(E^~SE}XWa3kepeSzF!Or7ss~P2J4Emo zsZF}8(P-B}zmm)lVPA-x^SC^TG)|gBF~U)c<xliDT~w|OwB43T8L+GBK=T1AB56yA z4n|I2qE-vB9<<xvesjcLmb0zHJ{$}bz$>Amg*5iXm4yXZWK@ay0E?8ojN5Xl-gw52 zX>Z;2MuMsl$E<;C>3t!2h}=(yFViL-2z0OC05Ik!!_8YLAwhb6l#a$3!ywVMAOZOI z=Wx|g-5<Uve~xz63=Fjm`$`vst-w8GhW=t$Zm<21vpyzZdkrn)EIOdmp8R?ZKK2q( zE}r0AJ;trU7SjJkq-~bSLYUbpwEsV6@82EEQDkd>mAcFP8ZhgvmX40p>*ATVXYd8j z8e8B2zd*8RsU-me9vTm}!E^Cvznxj-HQgD{6W!%Mq-7sT-PKi@kr6xg-jRfVDEIk9 z3+)lE4Hu7r6B3CsT9nZbHrs6B3*)kle6=zC7oRh4P7Atk@AJCQ_%BT+AE@1mzE?8> z_v+jeYVo!28?ZbBQJ<_$WNqnb5q4aLdIRp}cZleR61^xv(C4JmvVz1#DAkSNm)!>L zoG`>CaZ2<67MZoxLi41HmhRezB#WMmvnUZ~9Di7y(Yj~x*<mrRJEGWn&Qapbu<HUA zdbnqxe8c`c&zC?DVc1POHWC&eZtJHFoh}#jGHi=!B_5UAf^MgoY9Q7xAmfz*5z?*1 z(us+oOO!sj#c9NTxx<Vs2faAy0=6$K0TM5qNREKelFXw>!XNhB+fQQ>q~Nz6(s$QD z+C~mp7Fw0D4Kcye=Yf-C$-kVT3JnKN7tGxoJ9((?C++W$(dU9w52h@zO7_4ksox;3 zi{dC$YU9u6eR0aq9&e|2Ux)q4=NY#g)HyF4efyD~0xq^oVF3i?zZp?#hd|kj07D|( zZUbs!>=4E<yJf>ipaPkGPj=(Lg}wZ?4O_yGfPH~Q3=v6B7S8B&WKMVsHRldPN+VLV zIM<S2uc&B`S#BSRKg41#5nTcj3dHNfy{rr9RSB){&!@e<4nYvJ(ISGz_4w~^oF<VH z<>v;-BehK*$Cf@_Bs(vO^pReteX4klwwHgIA^Hv*5A*i!32}F6bj$QtLG9v7A<3g) zD-8wbBr$v-GzQMM1iZ;Q`8f2`n>51hG3VjKN2OvCP$wj-Yzr!ZRrw};72!Q_SGK6z zJsJ)R0SlWb`9x!;3MZ}zkp1zzxc`^|kkd1{W)-a%34`c(IBQQIP1^0fma={$Q4HoE z__Xw%3M}JLtZ>2cUF-5)MF(zSe;FT_der8`gUh;opni<W{L#MxmG4gOHXT><>!4qa zQG53_!|XHil8#R5o03~Dh-LT)Gp&^Dn+Yzs|I8$W$ZFyFGd(-wz9#(dme6iRD|nwS zmZ4eP&CjhbxNprIkp4Lk5$Abc#cg>6ZVbdBF)$X-ekVLO&FRbAec+K~HuGZdF?`;D z);3NmR#=xNsEkq_AUR45aOGd57SF5qwnKI|rclr!+uUd&e0)E~`jBq%9y?p@E4q*y zMsHfQ9+(A{k}S+-JN3dM9v@iTcPt2Kz?3Y^o~BKQ3xS8wud7zE&yrXQ^)P-&+BF+C zks0Zry+lipuWG*9x!hyD)fj@W=8*Whe<DG;092ZG@jY6xy`AsU>(h^3GB0v=XJ?M6 ziK*{@Htnz8mn+IzOyV(EBhz4O{R2NDVwSkDaB!9*SSwNEMViI}buPBxw7w=|i59MP za4t!si_9R+I01NCF`pe#rM^pGa`($Ec|$fZ7!ZIMHV)F@YS*_T^+!qL!JpR1dE1ZQ zjoY%%RZWi(j%`ry4UBRUtpLui#EX?HMk5B%;XEb<0njcsTx%I&`jRmx9`Ceh_dgI$ z#$wRI`!+3`xb4!;`?}Qr`S4#?tL{0h9)9_YORj_u@2{&wQ0M|_IzBQDdz*)q1cpO+ zD9fVr+pt$c8nd~LcII_cYnI-{#L+z!(SZ>?W9yBq!&4jCAxKI>v7*Ow%OJ1kcoY3t zzVgH9v~t?BqB@vAfFwJ9gxTG+h{xJHoK_%p_H>bCfV}-}n1*N(|Gr@tEk)a%+6X?@ zf3D55XvNUq7c`kzVAqH=40!^~Ug85d^1g`Mj?5?HY|C@w;W<hVpq_Dk!>8#`*ad1* zD@W^|Jg!t@o^N>+x6#NHV;t8t$c5O;v-Dbaay4&<fRzEQq=jXgvKxy~nFiy;TX#|% z=S3C=5BPByaZ0p_j)EIJc*DwPWMw&4w|~F8fZ=-EKT{`V2#ceAA#Fq_<^1uB(?AcG z;Z~FGR4$&aR*XE&7hbE*<1`j>NwQsXh|Pr>-oka|YjX{M`Ly3nI>Zads<i6*rXLVj z5JPb4m!yaxe^Hrcv!=W%p}kT6<92;|E>YpnO<!wXZ*EJl)en1%hG^}lC)Eh3(WJCh z_B{j?TRH9-X*r*#B1DG`vK_jKMH|NZ?-p=|7SFT4-mU7v7ZAqUs;W8FI^yMM*oqNh zC^E>yB1_Ff+7WYfzqf@(lh_H8@wCkV)0ukc+QmUbdTVO^Oz>yFf_cXiM&Sfk6r%-9 z)gMV=o!n+xw(S@`b~Nj|napZryXD}kH&^bv8Cj2fqKIa##~;;4bCs{Dq;t@tk2LV1 z{>SRw)8FGPPdL!BSRA{{4eNJL@AdI)R|8Zl2%?E%V9ukO!#a#$_|+=xH5HvL@?aO$ zw&}?121R`s&Y#N8%6A#BS0^|Ax3#qY)6s{&YO8KMd-FmSv1P)=A?R_5FMK(+b%(QS z;Ocl&V|WP$cnK*PfCDHZ%o+o7UG}2wbNM~Avj&4qeLS~$n4ru^Zq8iTtz%}9m7<wP zZz0zMA)GT4)Ut$ZQ0wEXxB9cmsx%bL_f^AOV7#I;TgcK&8v<FBW1M`XKExSQc?r4E zuR<%CZH$TWfZAA>coCKI{x4nC1iJ0jyc^s4=t3;EMiLXTXy}Iq^>|j~MVGTIDDTQu z0>m6d5ptBsw3i6uo#f^t&OCik95u!qO)<!0j~-*{IU=1Go+3WvoVK1fFIOdu8K1$L zr{A5XPbIPQe6DTndf4r{*t(fs{!|g={$NnSW+y=VY4C@SNW+AK-}I@GI5M@c^wL#X zn-%f3MSLP5Mll;~pzX%bzogL1p#Ei@e~9x5OCN%~v$5LqzM7%NP@clV<a7t+YrX=! zQH)5@o|t)P(9(0;!mUJyWAZ~~0b4y)(4fTSbUNS~l<XYHJ<gg(2FW6bCo+6AW1%4h zdA$Br=~x_gB85rRFdoO@8RMh_tNp#WGI)PKkN>MPy&I>Bq&7m1O9d*>r8ThRJO)Xl zu?qJLXmK}-;i<bheYnKg^|2<|?Re@=@^4j9Y#eC|CF}jvF>lN3xXyljv)>arQ3Tow zLa=NXj)oH1d0uFG;q>MqFL;=*G^%>NVeLJ8anrx6ph-_L4At2Eq$6(+{}=_q>Ebe` zq<xXiq(!d=Kizb;Yn!121F`!LV!!|}DneZMHD{_>aoqmuE*1Dy?8!;}FK;iQgbT`N zai$oNMN+?k0Sp5(OV}*3VhLWz^h&;i+DAnkHgkc8G7kiXsC{<59ZPm|S~wT_N{RdL z0{(4x;|~g$X2xYjmmXHm)`|n_L`alY#u~bNHuP>P&yG8H{rDsyztsPTy$KI{5j%Gd zlt85H3}7Xa`2D)-1H^NPDGaLa=ACHwB-*)+yYBoS82S@#H!WRpNnrJo1=Y5#dqhBD z7vqn{pJLiidrn~WB|<?`&w+FXJDBK`$X)pQjYR4J9fG<bBM!x`4#sW~B7!W(K?BBc z#Gagq5v=(U|6(T|P)dWuW08;0;oT$vSU{)0R1fomJLS@iucrvOKC@EUcPQaT`fxNR z61o{==E|c3`G__lg@|jO2zn68Sz->)d_QM>usxXiP)Ff~23!Q+Z0ZrD8Vn8UcyJ~v z6C~<(21L+wUl)8hEEGkxz?SoQ38gOD3{*wNb37Gu0vTmJO48Q^(7c5qjt=itOWKYm zzx}dwplFOcxZU_kqd$>DjUm}5YA*Pax5v{bGkX-3)wgMR@Z%|%yPXoH8cB~wtk!Qh z;pll<tDp4SAL+h6A_2IsewgW;>UbdcI4JLMD+~x!VW5RpsI$s)k9PVAB<D&riK<DR zIf8OO<FD1HdSjjas0-cvZidRb4rw%7&Rcs_pz3n;%)?Jv;TiZ#xxm}sr2QT8BHG{G zfW8!fXAoDlOGS5FZ!Tdw!!sb-YrK(+C|AEh1`YXV-gpR2pl}BJK-}=RT(Eevnq8tI zwcVD-vI#HeG#@m|4&%Sm4iipQp`i*!c{NNO>7;h;LYB$WNF;Rm7PPc#FiMIg&cs`D zEt)U`s2SClj~7j}#<^TN)0yL}Xf8av*LGKb_zYI+i_?fT5dxgyCpmvanX2tshNqG8 zQo=)#%E?VQyk3)f&`G+o2W1vfzx)<ZIqMg)Qp_$WJ4G=~hiWUImI2M2)qKx;5~~+( zk<*65ZLREQ?0S9J$02}7-My%*5H<-(aRE2tX*pO{qR-u)+U;IA7o!UJ^Fb1U`Nq+$ zp*|FP=;Lc9wj<n(9_RJccK6Xu;r_XCcMid`J%y`&1N+{|<Cz!Za`dw8mJc;=pT-qe zIC#z7?plm|nd`DZz9$7_Ky`T)qi>0j@VNP4X-saKZQ?3aW9f9!A#&m*P(az3%__jt z1@9Gb!tqp$`ZrFtpc1h2SJO3VAZ2EX&`cApDv=WfZxvF47=Y-!tD+N7dp}B<H$Gn9 zoJQpO4XWlEWdKfv29kNINs<G^aUs%?GoSAy#!Wd}S<-)k6vLHY9vX7BnAU9=HO+a* zv>J4L-5+lI%k<B^HXPiJhVKV*Mn1$H>IRSXQdzcl0T4r$X2?{j29k$7Ut!<W<S{XN z?#JaS(Nj#_>K&>D+TE@Og`+JqFM{^tej%WJg80ucb`{iG2{u?{6qpMJc=`YzL2;k~ z`URurftCASuc;$40y5Y**%x&O#uZX;Qbmbbo>%`h`l>kIV+NGtzs&O9;H%HZC@2XH zQEw<>sO_%e?Tme%V@zk3^Dv=o>yC2J?;v1Q<+w2Nb>fL*`3|ya7k9IXuSCU=1TuLE zJ2<1@sO^z;q{(ty#w~VC&_kI?VC&+c({p@7l7fo2NXlUHMv=nEUF`BfKY*HM4si}u zGKdz%Fht{gsk5V2{YP>@6SwoG;8-Dd6DD>FF{e{`1u2!N@g5o&DDdf(9X9tj#$DmZ zsZ}2Y&}}JQex02ySi3oNLi>qHpALLG&$4}CiJ31V+Wmft7&YJNmDybP0EO-UR)T!f zr-E_XEY9sop-q?x*eO{}jx$goA!K@h<Y0E}X8_E)zH3`EH>VfF)IZNTY%MXJrmobQ zY1ehU3qrQ)M$pi(t_Hh&R8AJz1&;T7^gM5fK41k9f;sf<YHnYh-r{{B+qU*@eW|f% z1PRY;LGxNffVOihWz|P*(d;-{qPEg58iloc_>c8<#g2}V1|+Aq<;i0$C@zXgt1laK z-5I9?H1^Yz{volac=or6yLId;q^a_TL;2*L)1|)uOPGP}D6kjpsDQu`O=Bc-vK#KQ zQ9?PbA~g0h6r3r7njBHgM5#FUh2$J^u?b>_L^<MlD8?ux(yYso?6~%>^2-wqt;Nd3 z?y8-vn<9#PN%dUQLS#nC2;5T6%ZP+c1&CLI8}N~DOIrG(5oV-CeqS0vI^b(+9!#xy zUit!jv3pA(R1m~7l!fL}Sxk$HPhC+w%ue<@9}&=0Xd?KB?iw~%1)RJR7P<`~#1twK zXamuHH~u}q4Y+EdccbRuu~Q)t+@Nx7Ai&F>f#(s;Za)QSn@_`VH(?{(m&=DIMXVMd zpmd>@w=O;Q;Gub6|9(y;I(p>)onGV^@&kA;$#{dQ0&lnMEI|`rvaI{Zc_{>P+3iaw zj<7wCqaMVMi)YXNq=4;P>+!7G3Hthi`(||Gnk|y;IUNU)UWyqE&WlvydwfEHB}T+> z!lk|OE3QjGZfrk_1&efTabRJVU@o&amuHC=GiDk_3!%~4g9R2P4s4+;z=kL+$dqM0 z3Y_U-N#dT2gkuyI7CfU{LlLtsyvbXZ*-*b}C^7&-o}Mgf*#d3NI62(wK!g|ZP4F=w zyOsRN+PayR$f@~8z1uG}#N1r;#JR+mjp1mn82SinA@wK;qnZo*9+^dV5&K6c8oP{F zK9)%mxg1WmC;YSAdfUu44XZawNm|<+9oZn~OlMKVm^j3pBZ#?Lvym%pM4ZbV+hfp3 zjm<;vC3vCho5W5y7=h9{Mz1<l>fSnC?F;L;_O|iNwsXf|5P>S>5VlvrY<LE`>vi7t z$>hU$^G2TsW=VK_(`3pw*zDon+c1v8yqCt@UC+DV80G%w`9^iX3KYoq^YQ=K6_6iO zRxGy5NZwND+NOiQRBhLZSQRCF0$7;QGQqpshixBY@5YDsO4p2WjgxIUe*We!Q5WLF zho`$s9zS&wsKc`b;mO6>eJZg7N+bdjHEl$Vvh5^fRw(dhp`_jCeuCbx?n@KgMefnf zO;=u*2o#|=TQo#mkAE#;xNI?|tfV<^VSz%1r6*{{D?%>TA+oI3q-JZ{gqxstu`rof z8qlvdO4oxaS;prN3OFD<ekJU@XzuZ)(p^B@_}t)i*)E~)tg(XM;ckOEIiHoG(0C=f zK9l1hjI*$hvyBBQ0BstFq038EUHwLmG4Xt8&-dzA{R)w;fl{)Hc&N8OLbomqY=PQk ztUTyc(iz2M0rfA5BnoB6^DITey$4Yo^q)-rd|r{@g$B%4H>IG|-(6la8T+3jzk_+8 zp7r}>qHs=iR<w7Q3S+`qT6BJ&1=PALS06_hy5OKV+OOnQz^nwceWukIV)W*%ITm+P zOttul&_ak*gTYdc$Z<TU#uG{AG+;RhgKTfCWC6INHurvvECX-r(BchiZX?-oAFp{$ z*wXe9i8u#Cyef+r<%kO*p0xEFj+kzvy=S&drx~e_K4R@{?9*NBZEc}ISTZwDQ-nCc zT@(e}aT`bH2wD(SNQRX5-vy+T7~s4Z%-32DEv;${S36t^>lS1Nn7RpGf=1~HYI}2m z*3NI0ri<-M1ecikk1VRb*wP?tpi<vF>P>k}64GvT9;UJ<LvY1WotUw;Clk+lM-S~M z;E*Vw9AX1d`0zuMfG2T&ii0&z?lpT9*5*sT4K|HpX@R&Dc0-UcX!Z0^L<6zhUCN1F zKB5)5T2TApApoekcRa9YlMR3i<odH7hI|}<5l}f_%-G>S{KwPl$*$lbJTF2s_Vsc* z=Ih+#f1W@3DGQZPY@r)GjQ=}AvztFrx3*p2^GAKYd^i58bLL`woN=l+aySFaW_A|r zP^12FQ=j37rJI|(8-Ft$VC#^F^0sK#83dsgN`;LzHezo(;W~jJU}W+dq$_Rk-(wW? zWSu~*wSZ?rDee8?+m1ea;|V<A%tPk0W{x!@<!jk4ERwGor#flWn1?pXwwZI*(^KLQ z7A%`xR%V3U<O~wOm<Xwl^JWue5J6pd7~yK>`yWJGBJSgb(_R;Wt3-2dR%XJp1p^i6 zVaohl>*Zo;w}4+RR{#c?iE>*$F?BN+xZBDrWBBv|KQ<!3cQ@39!TfYnQ1&QSr=P`m zU7$epjV#?RTkJy-LKN0DdlVX}MG3IZHkJf?kieTLNnDscTiiIX&(`!-aKnt+8}ypa zu&N(75`mrCYtW?0ruIT``uR+E>39M^Dq)P;z(@eJio8I^1{Jmt55Id8xID-Xl;hPg zujmjv*3zIozb?$Y-`+5fpKJmlQ~B`B*aN?a`HlEVH9@rG=Kg+u?V!UWkE`u!{_SH0 zM1O+9Bpr1h#TpN#UEbU~e1b5P=WrXzWIt=nyQ}?$Cd}Dl&n<g`cO7)NkO?v{)UK<* z-P3S2?IEl)0N-eSw*>|Xw6_hCD^5O;VGKG7p`qGQ0f=74tl$wt$y6_&03U#t#Owkw zI*D?AnMUK0CBfPr<BH}}jEK7!QX*CfBNC`7fy;q)<d7RM_X&j9KLeEO2eQu{QY{t; zQtLPL6Sv0zJLL=w`GOBG_3EXPrxB6R89{jUS---pBYo-2!exAnF!I<RP=TJ0ohH1= z-5Ay%67LI~Oye(aN1lCDy07~mg|-0pTww)dvS)QaW{QB=`J%l9B~3Iav%b;l&6w^@ zfv08!>p+5eSijM)8-xOtGLx~fMMu?xaA7)^h6_WlLbiTiAAIF$hof@!{6;w$y-_k% z!t<{F^C@gu@wrv2Gmjn-O4lMZ?jH3pmdZ>BJ#0eDD_+BW%V6q7gz|<XeJg&SJ3|hC z@??rU7BqdR`*ZAv`o-DGN=*4K9r?1Xodqci-tk`v%<T)3w(U2%q>b*-X3|$gGXvar zypDJ%43L+&m*8IFk}={xYp&zb6Z^$Lw{0u#xdd-NG@8b>kqtb-b`WmOeL?S7aQ<%Z z2|m^1pMv#KTXGRdYw+m9yljtmF}hmiYZex{7SqfvA&-aE_~twPp<_F?{>SRw(kTnZ z3PHAd@^l;y9|CGN25v$mPuf&6=TA%5R&+Zf^*!!~SdE|7$dyfNI4qpiT?s>ci}xma zi!8o@+34faob%i4f&h#>JpJzUBMet_kUm+O%IOD&6bjL&BBv?v104p<Be}%WUD{Ug z>v>6>4)d;`CX%~+qyu(0gWICgsjyF6Z}vYG7z*wqtiHO)meC#`t_A(3#)*en-{Gkb z2>&^SpS$C<9&je7&CfyTRl^s9b4EQ&dQH~2KwwHWfQ<f&mvCQUotme|Rx})Bhu?mA zRi>fy!DaU8;m`f!xf|ap!KX1{-9eNvLMWlb_lIEB_(FI2@6BJ>Noaw$0c;`6W1U@a zxcT8ff{U1{T}0OMSbw{{UzpR`LeI_V%OAG9&)W`maKrECSl=zv&!-r0%1rS7brBC{ zY5sEM9b*H^YBq1qInHs9pbziV){|AcpMpbg3A~>&JF)~W34^$9)i?&i*(LIHU&e3E zjFax9_~6g|^+?G)3d+(hhfNq5E2ukf_dLhefNe)Xi;Bb8%*M)z?f2%85weTjV+md0 zJyBWb=e2q}o+2$r>VG?(jn%xwn{eg)xwxNK*>ikjpx9Bk3iz}{a$xs8jDHMndQ8*b zBhza={^+ePnc>!+eE4GiO&H(y|Gw@E%*Ps$YcaeI?J5bq4QXGMZaQj0b0ob5rM*Me zlij`kv_Jn^Y`B{>e^GY;0QG&X^1e8IUc;|pL9lJ4`)T0j7wvFsP+d)MMo3Gprm*>V zAt~Kb=#ACo8SwS9r_)Qqt%Aml_0rcjEzJp(P|D*uKk)fQE;z(wM^E?0!FZSh+Ofm< zP@>Vq2Xmt&6cx{}15NUI{A_yFzC<i-RNnaN^e4kz%&Y5jezon_cw=s@`XOBRb9?qU z<sumZbc^qQH3KVgeDhrwy1z~&3S$}SE&IVo^}y(FBcNUGz%kD2wsm%6R(bWE{#_gC z<mtUoa7+bc4=SUa`kW*Vuq8`9hKc}xuRowz+=LbhHuA+f-T}Sa3;I(Usk82&btq0> zW{2j-3mYBEcZvLdgIeml!Z_hQG{VQ#@B38RPMeIEh3q6fiV}v{%k5KN(jj*T?gp0S z0hptkP;9E9oX0H!-UQ7?d#*806-ms(j?(!1ZJ+#!DBrSuoFx&7W^6?Tt>^j;P`W)f zG!si%pDY7rV+k{WYRHg-GWT||@-pK(xaw4<r($bbY@CIeYFKWNwPu!<<Vzg6aIuNE zmvR&xZ4#3y2Ke%zbJ0LskMJAoSY(rFER7mjFNFgZ4E~f28ETV_k#Z9g7QSj%2l*m* zGi=*1c~TPG5;Xb5uz)V!i#!Zh;|~i+$er+3KTicaY6R???tP}Vx7u20>b=WYjcw@9 zWA&xG%vG^N964<#{^s$`n4bRTt<wVs-Re0{%7kyN`gxoe+sVurG<=levVEG{2tV7B z-CG)NlXo=h_KCb=gpRFsiARG`A;<AQW?1NWJM?MmoNm6Fa<PaFLVf)({#$IHIpa`{ zcRQ_RSRSw;jeQ?{2F8Nf2%H7zyURw@kuAlg`x$R}z!rugli;+O0BHqKLffs3tz`2< zL5W&Cf|@l!>-P26WsM`sv$zM;i*ocx#ucK!t%Lpg@w&{XAibci=KI1{|HM1S*1b3n ztSaW)@V(<Vi>Rsu7&R&8Gn&eSG(AedG@*Ks*+1MQdLnql_X`yo(9==~h;tUL(fdQ3 z{EecKzHuO&g~714CW+9j*@1Lf#1ueW&PpPn!o9$QemRxS4R<*y&8V%$gpd*|8_Pq& zINZBF3_$9Bm*FNNK)~jbN|2dc%N#Hf`UrH*DI=(wi8uqfy~^wPxrZzeU46h0#1SMq zkOG5{XWwFRO;j>Xyc#I~_+^is?dEH1Z*tu16Y*2MGhg(8*Lti@Wb4513pz8RXzPyk zriGhnI!VPhC<?+xCV>`{H73<SU2w!iAbS^`Ld;`~Bo`h>gU$2yD|riyMJ5d-lW6#< zA!Ioe9ONU*n3cqy%zE|KzHp=^p8CXs&4f9YZfw366Qq*3wIhv%#e-J**A=*%wp~v$ z{=6G%!U~G^uzQp^8IO!-9j;WyHu+$e%nl^-p6cbak_CfxC1?~CwR0sQwetXNNxa?7 zspv7Nc}!wWMS{Q*ckN|52yYREy=}i}6Xhh8R`ET>wZn#%*dfg`5?8aw7Dz7W2MY+D z=7h}!HD%$jH?ZDRkk<AExUK+<?J#YPxnm#=1&VAyTuPvq2pGfE9KS4t3VR4aZ%#Wl zZ{{1-LA7x9DkdaGH%mRmw=o%~cuVMH_{{Yi_8vUTF%kq1#aLdnKz|dv<s9>Ee2O&O z5fr!015BU8vlw50TmUGAH<MB4IMj=`yVY$5uJpQv{YcWo7Nd6^@gj*Jh~7yC>D_)| z#Mzl6yK`Rz#%Aht{YITzno0#HC1r1i3v+uB?>aoL-#^W%p~8Hu)liuB9Xx<}R3fEt z^}W&3TaDMFw$7dV-Bk<+be2RZ>P<5{_sOC~t+&xsjfwBQAeOBMBleSs&iO3i$hEO< zrzM)IVFDCAsDc?*hZKMf`T2Lr&9<mX@QkahN|?n!h`l^y^o;B=Q+Q}hlVY8#<nyF} zUp@x#>1Ad#bneV??hDLnO0|dx6B;r%lsM?dDFt*fg~v5%d`68X?j@GdvulUWwXTT_ zVQh#W3u3dHU#B(fI_e^(hboT&Zw+ioVK8ks6-}vK1nj4?4zlO|W!v*N{hb--Jsz<U z?MVYe4Nt*2Ogx9e+2pcA!DhjI5m!o^*dq11qg4(awNZK3b2b+f$Y?u|_XZfMkTBJt z+UvS%PuZNS>%&J|ci7<Dt?hl&-~Es?N)IWl;o)E3?C%AI&5XIzo4GO`hIM9R4m`(t z^7*@;U6AKy^BE!kl@6tKBsTv|MU59x?L!7gt*@XqpO!EQde#cveq0l+qZl-wyEQHz z6KJ(lLZ1T0ZwRT6E%@lbg)G-mQ)zoyARMgnHwSM7yW+rkef(0}J6N=AvY$ta`fXvo zpUp!=PdIdlvZStve}kim!A?u_9l6W0IE20`-3g=^jMnQJMdFi02U@4{N#RTu)vDTv zN6clMmp&V#v2T{*9z*TncHy!gU&++Hg;sG6oO@<4{}fZF_KIxux@f4KF#!m;8LddS zr-z$G#$a$!?LH7@n@&N;yiddG0@LR9x;+;bSS>PQBzO3BI<rj<T;GJ`3-e7D(0UwS zm=1Ve84sJleT+a+1alUS_}-6Hb1lEc__lkMPk>Jq<%`oo0F7<Ggkk;3gTa#Tuqf|d zQwfGX7(N&_=*#NXd8dZYP(biZ11YWB3*G$cl<&&nbyY1oT95EpWdDs4MEg{j4=nK0 z@R;y+V#yAHG1L(_u&>WO;cQFCQ2&LhD2WNS^6OH5-60`Ei8jcbR!iO@X7o7bm}iPf ziX#cp8TDc;PhYC<Z#2^JGFMx3c%UKw*xSH<+>5oFhq1O<Z$IkyS+lBJwNmi-*6U;? zxMev4PR8z}N0YqJm-Avx76xoMo)wi2YBcsRcS=^`0Ul7Afl=Wxqhg^FpomW`POQkL zLLjNAT@akIlJ%P1BJvLK6#z`cm<-YZhHH5g@G>`GPu+Z!sZ%|LddhaUp(7CeWF6Og z82|cS|1ebbQR49QY!~_{8)xo%S=PR=SaJkK?jzEJYZQ10T+WyAv({(3umm~dblk6S z))p$mAGrzGe_`sHq=)W_DdoNm2mi}dv>qD>Z7Kr!w{l{v61tISofJKM?P%MSPu}eB zitzpIGc}0p)x7M((Oj$QrbvrYUhEj$jlb<gc4@I4YYR*r1UqD&UbN(~sStQsIXV(( ztBfQ9bsHR<+f7D@#(AJQZx`ojMs#U8SeSH80tYVWlq3WUTz-Hdsa=&tBNzs2u#y~W zd#q)>?vUI;P;=`C1Qh`#O+G;k**Kra+m;BF6FD_H^Wf)(GzGg@lIFQIFFR#K9&KYg zkaZ9##JP~1e_|AoO%YQjYgM)v2%|fOT?r08_XQmh&s55wNyILkn1=XNUfk|_+Unp? zyckH`sXZpP#sDuZ9$(mg+7p^7V8|@2$X6U9&%1pg&FQhy2cp-MKWTg#ETBN*1n_LK zB@S#S!0Qs*I*g+qQtjk~7&co#?S?E?J9D@tjo=&-ALP`_a`|lEfQM36e(c7-|GEEd zb{drqo})7DRJrM1od>_zz0JwSz{X3*e+n4ni$=y|wgC)J-#GlmF%x&vO}0LJT*1N} zj!-Y<%iaMqw2ApqDsV4o-|2#2KaR7Rc%T5EKVO)7gJeWI>WMeTN5v>5kHj9IT!9;q zaKiiVZM!E!Y)-HyLT3kWNFLrLOn==2X3f;ig|3k_Ah?KKaA;Xs&V#2er?xWcJDYXe z>w);R^EThbEe+uadN16j(GnWZU0UUa|AYWm5vN$L4<k+6wLF#J$wwBh9-^RxcY2uT zUdb)2AF{nvoQJ*ZoaQdwK1%U5%rh7u&B5~~mh!wL+lx0uHkc&`m$&*2v=G#1A+3$w zgg%QM4Rvn~^*ic)<mWhegxU!M6`2D+YUz$G@^<x4a~C*{(1~`#d6%3<Mby`-*>HV8 zp(=}$PuZIFVSM>>pX*B>P@OIMQ|WB7*~|6ozk@C3e7_>Urrj^-j0{DzHu#BXT$tpU z=Y*OtDZ70kxp}$`U7>jRkM+8?Rk}z2jp@4A=gYjhvVL9K*ooszayu8;HQq&<zS?c@ z41ku}toxRx9~uP-Ldjq_&YYD<YQ>J}_FRc21rUIeJRuvKZ$9nWlR>|g{=nK#qf?;0 z$sW<ioc?8YFhvR^-!D0DKp=Ap$@=tt3@+w+I4KL&qb_)t$v2j1pj`}vDE8^Fd%OQ7 zxDwWlFrR$EgoeAzcKZORv9ZEoc@4mBvF<Q43TfppnENVV83WRu1bFc*K}4ro<E85u zFHQLAV)k5t3pY~NC=zNM2joF8m(x+i;FT=X!r0-W?RH4b%<Q}c_LuqPLdr%uC`SCG zCUUBP5Z@w)k&ujS5#yi7vBm%HaQW8>b$bjM2~Ff{Ux0BiqU;?0=#844_9mf8#1d@5 zC@go$o?N!*XIUbQ#KG+(Y+5Ft@V{se5naV(A2@#|C&>dUVr4lB=h5-2eda!easK0_ z^wGfXj3m*z<mb{p7Gz@q|2i+#WP-8hbi0b-_p^<YQVU8J9K*pXZ+qg*e-T$j7%t*u z4$h0k-nr)shA?k%|Bp)WsRDh2Y=fMwKmm<!7xtDmt0_S}zT5ZT{J8&H_Xah|G^85d zFwI7UuWmYu4}rRS&L}J&hMRAfFwUVSwgtRSu!gpG?=epeXc{~iG5_odAON|`;bT!H z@Y3Z7IhUM9QYTv>hHQNM-Z#JX>VNLduj{Y;;k(_f5TSlOG8@!$>a54rHkL|U3ncS- z=??4*nyVk8%Ifaja<*|8&_MBfwxQ1vW5-Mojbo4$-kxb+$e^g9Z-8^d${Y=bj3`4X zD-KMFv_faE=LUH&SSB4;$&<JOaSYi`n2fkk&zN%qV-Y}sw}O!NB=uZ0E{Kxf!-eJ9 zIU}8z!j}&mb0wkJODEnartJoBk@pv;A$#o9Ak~g!3xKS7zrwl%?0{%lLYSC3Z}nFt z_?_-QE+F;KM(XhJp9QSLkPJ{x2nVPIpAe?UBF?dmr*a#P536pd<A@!i$Z^T!JB%Px zc5gC@IZ=Dn8E|f-pB~vzzM~D=O?*JX@1QUj2~bXgX=EEpv)-Dz#ucgGz|z30P^V1O ziFH3c0Oni8CLGI@u%$r3#fUZ30X~Q5i`3Ex$mAl8@Yj-D2-@~u3aKdy<B0@PNy8VV zn@BKPx3${Y8LKSL5f;G+bsAT^Pk5W_x65X|NNhJ$?y$_+2dRBQO0X>=f^JB`Q*dnX zxf9f(UOXKS`9RA|vL*2%pIFbP8AcqDi%TM1(CD{ehmYY&W?P(^X|P)y=?c}VnC0=I zBh51R)K8?%p;jP&8Ho_o<O6Ra<D|NyZD4s`JclimoLh(Yg{--x(Un2rOG=69j{^7I zAylM+%(uJez7HQwXKZgJhNGF2lneeD4TI)2*B9Q~g7enQtej|jy>bbdGpGVP{MNXu zzk1A>`BO;x<4`Wa3df;?L*~aNna?jM6SIKLj^3ESI(W2SLKI{1kH<4ykP<H4KY-hv z$dtAh847w1a^|Z>Cq2U(NP_+;?1t2DI&{>AByn$<%nc!*Nn$)EeLtH&&T*3RtvAYv z9##k+#Eq<{I~e*6#xb$Oe1V#Un)>xtqPdf&l6dRk7<1Kz(IZXkto=t66tx)g6s!S+ z^&M+#k4(9a4@Amt>3Ub=b=<j<B^&z0)t!_QQUWyR%-8)Kv?Al4+C}nMiRVXjePDI3 zvBBHp+)<)!TYEo7{X~}giu5KYyJ5vK7Vrjk?9F|X$Vb^Z<Cx77Q)9#GHUC7?M51jO zK`}Hyz_f(7`Eu`HX+Q;Kx*U7P|DhQWdO}Kn7u<Qo<wrH&hu41jtm1a3f#9a%=cf{_ zb|)ff`DOgpyx5|>)vGD6pAMk4K#N09_JzEW#Zkful9tttb}mT(T2-&7zVWSk2iJM| zJ>ZfCtzqM^W;$nhknH{ZF+%n7@Kir^p9FoIvd$&*1(~Ja8ll&9NgW*umyWRaV^aHj z$bQAcFj|gWUVq!;WtVqJF{MGIlN7DfDvm7H2y{+#WNc7#o64l583~ZLWUTZ4gM<l^ z?#!xFCgg^+N{%&o<`k!fLSqDMTnJTmaxcOshBL<9?{mB5`ukH#ee~hp>P%~e!oXcP z1Ahl06K3>x*HO3!6aYB3KJ2DJ_2Yg)WIhpy3>G;AqC!B6*4+Fc<1x(xI#96UO=x{> z>t4B+T;e;;@kat;u2>hZgav90WLIE2T=FzTb2opYkchT3g5c=b_(J0$GWj2*&awxo zF(&D4w7G>tKooXK*z&F)`f54#y-hE<?s<EM&)v|AtJ4Dv`b<pRiCF_pHn$ei*WnU^ z{(Z1UjWnb&Xy*gW*ziD>B$^5Df7}n(psp2{a2B6J6G>AEv3<(8jZkaTk~Y8LBAm|z z*Qa^~sGJ#PNJxFeB!cvI|F>!Jo{}@7bzZ_{dU~$$_qYytGYUV!s`z=j<)2)>p&iIr zNT1d1lO&Jy^7R|^thHz0=AOBGSFq{Y2!Eysan)ZwGmyjjiaqEkH82_sBn3cjKy5Ok zlnW0;^zYdtb<RR$I1zy@8M86g00;pCcbpvBX0jx0*8T*O)g&V!7aOD7_=Vn#QX^$P z0xAyK;c>_Wjh+z!tAi~;B4mOB%Ysx9yeIgnWJS`VQAF(vp@T%T&Sx!BR0biPAVT6; zw>={4gbjpYxg<>58;Ly>)CBD<B8(_j(Qy!Tq7kP=RSuV!Y!O@p_Mfe5|1wioju9Og zl~5A#zd;T%=_D{H%!)Qnjc{&$yE`Zh&pj!<8sYJF?WaB0V`KF``{Kbipv0?QL`B5v zx&HWY{&yKIZC}`?@t+9b-Fi>gH}OG%Z@le1ItY0{s~NykKN*!wB|4%I?Ja7G7W!hL z!j}(xZ2(ZMQH0EpKT$OEq%pbLjiNEF^@Y*vhI@1LkP8o~_F*Bh=6IYpY!3xEr;Yg| z8Qlt_i*w%{(ehVo1}ldE@KO)jV-2I~sa_6uZLE(w7+^ukB3xCbb{j5nfB5#A>WM4` z>C+o;4FvicpWiZTR%tA-?f~5N)X&JA@FLl?kplM5fOUZQ42g8q`D2Y1s?B87EbcM1 zcmbjEMR$5*X{;Z-ZL#-)dN6BGm@h2#m>yHl=h>@j$|=2^1C3+G_d$0Q9y$yg`f=K! z?IG+sI>2A&1Eu5XQ)OQl%=NU(j;*%tCzeial&`P)r^M7NQ&3Bj%K(?}e^5GO!q!N- zYW<Z9UBBwHdU~mK&uK+pdH?lXiIY0O2%>$auW+aH#KHPaPG&SxXshOSe)*^gMn%A` zz41)n4hr*HgtxP}lPSgeQpS5@&X!MkcpjflAJ?`-ey<-h?E8#SUp0B)?K7CLbYX{` zkE-?*Rx=cK6ISZ;{5rv2fX{uSR661l8q9$MeYx6OhavFg(z}<W<CoaAK!3}PVocxb zJ+ADwV*217;f-o}J^dt-FsaSW>qe&8ld-h`Ks{J+cpQZ9!sBl{2rA)iJ&D7(CQcf_ z@zx2n|I|#Wy3O~u0tPV#g1f#jtf<heyRWr(g^-Wn#Co|;Q{u7fDj}3>BT0uRU+W;Q zhxHo-@6gmYwv7;xp7gof7Z`O?4H0rhln{NzlZy+~+W*Y6;2nW{Q_3Qt%b>=gMlNU9 z{V*5}WDj+l0n1Z^s+!LJJ>IZ{=*A9f39wEjr})<_kkfgg3%&fj^2OOD29r&TsXLmY zT@8-^<W@h+)WoYiq(a+=ZEPXL&~2sgvaANF6KL|A@cLice{|{lAK$NQ_Vlwt!wH@( zvXA%mE(9HXTf#VI+z!)(2R%~Sgvsah^7U!<(Y2ZdM)y%{{_BGDG)G1p+sPL4wHjbn z(Zw<EIU#ASw;7WRLCjp(*v*Ysmt!U>jvA%+gt!%M<iTo6ZZ8xTtVLde76-Uu^U+{n zI%WAlNv!(U<Bw|G$+0MJaafDz{=EV+)chgyXUzw*m^i+7%jMQ!e#8J72_vN2=rBpz z$Hy;fnM&Rg$fApclZL#Yawj;05oi|+2-^j^>+CU!D%}K0Ja7qJas)e*R0r8)aKpmR z3eKm)lE$`C>0)B@jgYw6z=1^rck#4`EK&38|5X*(r*#!~f$$YDbjy*;rYxSPvU_F^ zUJuM#*kdyvEfDqv-D~7zlgQyDW?P-a%`0d8=P3Ok_UHEhOfA0WSOOn*+0*Wm{HcJ8 zwV!Kd?nxGL^&6t9ONLmcgzCszu2=R&f8;*YBEMbnMb2Kb8epFZAwT2cfgIKbkxwn# zx-0s%_xS3EhaVpY5+IG;&;JoBU*kgPaWIb8pY{2%%x6S9AfLDS^g?yU^6dq50c^dX zIsjE>>=1_7z_i<dolITBa3V1YZ(q<u)T=5A4A^Ev^YZpQdJ@bG#6A*w+U{_qb9h@F zW#(cE>xQ${*SRg*FiP+cTzMP}@�u2N0ob^7aPUA5>#MO)BWLrz{d|m&Q4WwIeZv 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 QyL<Bg0L=|8>jP%g0a_%?<NyEw diff --git a/allensdk/test/brain_observatory/behavior/resources/rig_geometry_multiple_rig_configs.pkl b/allensdk/test/brain_observatory/behavior/resources/rig_geometry_multiple_rig_configs.pkl deleted file mode 100644 index a6e1e41104d0c149791fbd474d7e202ac8266881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2237 zcmc&$&2Jk;6kj|3YU8A;nuzvN0#d;(?Y3!Ji33thT~*K}riz3phiDnE$DUQaADx{| z<0?gPXsSpfwV}fy2si<aM7h9?Qw|*43tTw!55S3Qd2e=|*l|*54=|SeoA>7Z=Ixs| z``&(>`|O93p@%#e62D0z(+M~=Tby`Q$$b}zAeZ#~zB>Mix}_>IZ#O}y<k5b6*B6xg zq!XDQ@kyKVNXhbrPT*XdOJt?_l?B+~@F1~CmuO@*NCf`&+djQvzwLt#2y9g5dvo-h zOB_%7u@`oe=k(%^a0%z63;t|QoxqO-j~xMYnb(F&79lQea$i}-ZB@%O)EzaiDptlC zzpdD$%r`|hq)5rW`#RWInPh!LW|mdGUcdYVhW@i=g=(x~6j`^a<fub2aC^!2yltsF zAl=l`I1dC7Zs3D$leU%IR&;kNZYGK{y&k)v2Oeznbu4H^lrIty@UBglLdspe1|hfH zwv7>JyHVl@cadV2@I)O>VbZjT03i-hn+T(QM0lKSXFjH$LYy+Er}cORPK%AnBfBMz z6Tgjq<`Mg{#m?1bJ`#irI8d33L=Y;gh!YBvjNX&NL9z+<0%nCB>E)zg6;~8HDzmK} zxp-qoE)2}Yg)5ol0vlCYZQ=NKp{h02534gce*B>N`8tfXFj+UlWPQ_55R4x`f+61< zlpoHg`_(ozf4#n`_dE3dmR+Ks-9!F!R_|M`RyDqJdCSiDpN4+^nG;D|t-_wqqu^wR z6Eo6Fj60AR_SWDlqSI2_SQ}fbV3?n#_(h6erubco4^#X;#i?IsUPRurBK`fI_SeI9 zD)-P$<(>EsvCj3!nj4B0>QXK1M{uL@C)5gVw_4jUjD=rL{&n|>VdN&(vda_O@^7U( z(a(MI@>l0?d<1f$zq<b5kDngAJo#VY?$Kv;reD&9?mz@3g!)rq5V=^ulpNL^qFp-W zK;7V^&u({ZxkH<MMo$-uwKwO^UNO%@5r6&})-qjc#@GSK7dtq7wF^*ybhzvl_A0Be z<Lm@`4S7(;((<<_cVvrujGbhso|$E`)9lQ@WM#K}O|!H89C}O1!Wnb=oH?z#bdEq* zRcya3G_VUt3Q8@+E(?pK6XQxvmb^B%VG&w&sS&%-NZ}qs&F;7k_CmPN#iS9&cxYd< zI{Rk$;4t|4)!JcvV{sG{FiI)n{Yv>)fxltxv&sXzwzRfvji*`~M?jG|Y-sQSf-S%I QF=BgE5d96XpyG!4H#r9PlmGw# diff --git a/allensdk/test/brain_observatory/behavior/resources/stimulus_template/expected/im065_unwarped.pkl b/allensdk/test/brain_observatory/behavior/resources/stimulus_template/expected/im065_unwarped.pkl deleted file mode 100644 index 50d9b6054e99f03b8ca9938ca4c839f796be21ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432165 zcmeF)yRvObb{62-ND4W)7`y?NYz&MYU^J*vb9n(mHv%HiC7PBYtEU4BBHB~&9y~%l z79Mn+ntvMqilLlq?R~0FSA7_a$dMy+tu<$^Z|<{u57qg*|NHNbZ~xz~|H)te&0qZW z-~Pd${?#x3{15)(Z~oga|LY(B;unAXw_pAGAOELc{P~~$)nESiU;g56{`8k${ry+J z{=H9yU;X;`|MJhiE&2Pees=tium06f{^YB_`|3Y__0N9xlRx@Dzxzk$@Bh!Q{>$(D z`uG0qmw)@$fBwy~fApXK`ETle_LFaGe&^Re`4?aP{O3Ra!~gf2|M%(t``Pi!um0qJ z{mbL+pZ?_Acl3XMC4O@STnFdCIq*H;00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G;J|OC1Lq&Uefz$DcEyaZnEAxxs>^s6Q$NKsubX{u#^c{!@3-PPjFazp z{L#1jJmj6{Z_kD6;5vMB1)Kxtz&Y?e-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02R^3*>2LivZ=bI7 zIm9D%>4UAhV;Cnt#k}4$-}%&cTy^z6AKrJ~f7R{!cJI!ouea-ypJM9A`RW5s-I;#j ztIs#%6_X$OfFJsOum0bMeC=~qUFthN^brs1vR~I{eAMet<A>{#>ode$r>sj{_hUFO z`agfg<<IG|=f3mheEIpG103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW4!*MaIgOkZKgqxuYcei~<8$L^1v z#;b4k>fg;c^%=i6X1~PVFZslt?{Vr9^Z7GQOg^#mJx<--c)ohy>RhDnbc*Ly-!b*c zr!O|K^Jn$ZW}Lp=jJI*<<DK?7-ub${Z}yvFK6l3>*KxRS5A*q6RDI6J!}+N`_%)w> zZpQOpzkTb{ll5yI*FUf8uCMF+%@uGCoCD{;_kaT&-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S>&|frmc8s~<7_ zgPBkNUt;o!$#+a2=#<a=E~c;WZcKk+$7AS2OkL)GTjK70XFf5XE91oEbA4BS>hHYr zslOY~VZUDAb!&XHKRD+yG3PmP%vV3|Lw{}c_n!5A>H5s?;<M}4=cxCa&($&YW9;kN z_o@1Wr~8$B&QIbxUpM=9clGJ#P3-#QJEpGl)A&fg@v||`WSyT^{Ji4lm3RNVqOaJ0 zU;Gm!Jmo1*dCCC}aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCFEO16RM{)IXShzMfBhig)`1Q+K5QZxd73@nN6zk5=E| z>htXW!_;r`Q~%+ae!Pn52ke;o&VOIy>HSRkywA)hcD}FIG*14#@vQsT<Lp1?>%8Qg z<$O)CzXz#%$ag<&jnk)_cn<TO&$!oRoS3?f$MrhT#{Qh+c(|@d<@>($c-_DHp7r_5 zIsD$^)t}q_zj<GszdL^K`ssC!^b>ddQl3}dho7JQ{Ospv4sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0Wz=1Es zfwTX6py}7G*!_KLT<cdp{eIb}`V7+_n0~;FAL7-&m%hI#u6?Thq5rSud%v#FICX2B ze%_(KaP<*Zzvwpq+tPP<z0dRs?&A4mefG<`#3`ToU0l~c?<e=MV(+uobzR-xb2Hwa zpFU5U^SaJuzHgiO@ckOTmmgkNpCjMb#OZS+pLo>uxjWw8m)y7E`<L@@<lKC4?0(tZ z>!d#Yv>7M%`s5RL^Q&&?FV6h4@#wza+JBl)KCjo~&S!qbFXVaazyIpL|N7}4K+dCo z2l{uQe+P1a103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4epn9t{O!}{Nx$wc9yjY(zi#??Yu&?q>MG{_q&~6pcl!#{ z7kD?OKX8g`pQ#Tq`Sf=V<MbQu`Ux|Cq^~ghZsM7~!mP{qopJTY)jm^x>JRMvZ`*iX z-|ISLyo<SyyO{glvCmD$iK)*x@yt1_nE7?CtM51Kdj70_-^?f9<IZP3G4qMZCr<gE z@AsQ^iL3s)4(s#RcwNVQfAW3X)#ZDU`i^y8j_jXxUr3z3&z;Zs)p!hjyV<W@NPddb ze!G0;JDxwio|pAL&lku2dDhs^SwF0wv)oVj^P4N+95@Hgf$sqaIKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0Wz=0o+16Mz7 z`f+#h+|;jr+Nw)Fv0rE9^WWo5|8DjBrY`Z=)c1V)^>#7qI!^1-|ChM>1*<PI`6*_7 z_YbCimrs9TV%KN9=DUw@7^nX<ePunK@>5;vpN;8{dv;yd@Alcv_kPcg&+gZ({>;p0 z-yU~9^BvO%+A;V4*_iV)#WQ`Z>Eo^OI^V<mnfw(W>TAC1r}4B;^1W{5^ZtkLajwJq z+*QBkhwoM2mmW{|Gx?*=QSwtv{r458@70vg`<&*J@7U{lKI7YUH~Vsrt8R*SUpMQ! zKJWLv@hoq$-^zFYxPKS;cY%Kw{CNId;QQ|T?)&ch&H)Z^fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<8B-43J=H?jL^d;H$I zyX*UPdwf=3Z_j7kbv@qIrM~0Q{la-a6(9NmYd-yfYrpDCT=PR8W9A?F2D4A~8?HXW zDW86=^ckjZ8YjPr=?CkWKE>pZp`Yw-e%I$V%_pCj*UNZ{sheWfy*fXw`{?{x*L{ua zzE1hv$0?rKXXtC4&SjtLj5|Jj59<3e)vtB=z6>#S&&Gb;9%sMgkInVTe6Hsdb07MC zW&Ba`sB`nV#=Gy)-Pg@NiMw^FOYHjOKU=*1`@YA`zTvy?qd&)Pd|vmtW7c)P$Ll;^ z4&>ZU`88kPhxI-2^S__}{rvy#pa1>$e}CnB<a^|M<ax>g4sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8e0~T1-P^b4?22dp zd$}3!=JVgh{mgOo+2;NImd1xZ;9R%r>rGwv^=6!Srcbff_x!3$ef23m^bux0{kxl( zzQVgP{aGE;&(*Q}!KU%?9rY9T>vZ2-&-Xa>ozFP)iOK)A#B=EPOMbe)$)D->?S8-N z=j-#9{=SZ>>wL!3`A>cq&wO9%`?Xt_`F<ar&wR(!t+=^9N502(U30w?r~8on6mx&? z#$z}q$$wP*zQ0Gi*Wb<OI;3tFQ-8d(?|1F<PFK(2K6k#))tVp9YwFK<QRlzEFVlE^ zf9m^t_V+r^S^qxq?-Tz%`TYMr@jdfB^F8xD;{XRZzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00(|Z4pg7+@#1*b|C>JCj#>9? z?0quseUk5(y3T*}_)Oo=i+#sgzl*DH_j<k5CqKpXDP?|*yMJluZ%Y5u)F0LPBYlLM zeyh|arcY~%>F4UW`oOA>?09Ei+N<l+f0y+c@8Yxd*>76c`HT~@J~8>v9nayuBtOO6 z_neQ66O&KubCvNF&pNl$INygUW?j!G-?8f+#`V53-}~&wM|~fAyslgIQ|9_U#O#;; z%1z9DJ?eY9%V$0@>%Y|a(eLx__cL{$D<0J^{886G*DG=Dn{ya1Hs`C)=Q_{z{h7We z`CdI6&w7q#oab%Fv!CDjxxv3X{JZ0a^zRPm*?D%J{XUHY9N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G_%S(9|GnL_`ghak znwb9H9(O+Ty<h4QGoSk8JFfZscWWyi>2n$KSwF>I-{Xh(S+AG+?4NPR^yhTG$9L<d zby@#vJgSeV_sM)>`jV#Dbw~9BPvi7crJu0JQ$GD!WBt(Yl|HduOdnb5GEPjNT*gyO z-4wGf^BE^j`Qz%ROYFKe9{TPwpP1K6?0m+%nDyUPJk#G-api|Tz|1G6|8JeEIzJEj z^aZ9a<BAXGx4suSzlr@lS^3_#_L<gY{S>El$Mt%NSwD_*oi}k^=k)RB`ej}66(82s z{XRDJ5A(zN)P3La{EpvWzSsS^lTXZik2~M<J?{F9KPsNNes#XqIm&sf`Fzj&oKNR} z<<rOe?DsU^<2;YEPvzJ1HFXv9bHZ8qjI(~l{`tngi~PIj$Mo+a=iPaC-u*t1103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9QYg#RNrp;XVbU(F#h*%-`<Dx|EAw#*eC0E@vMFF`W>@R>NB5w;+pS$uW{y&%y+&% zPwIEE_v`Vq>r<b7rg7&}|50)E`}FmyzM#C`s=wwR`h$91#@(lsex)I%PwIBe{?&(g z)OhVz{amY$YwGVxefq>cI8Oa;tG_LMxj((Wr`PLe-4u_k+r;%c^|_wiH?NntTi<ng zA6YkzlkeE;dVU(8xt{s_eZMoV^D*`Z_PNWt%1`Gr`E_2ebs1+qapmj#l>9EHuXk71 z^T+P<)OE}EEOD*R_1V=Ab?ZLVeeC->jc=ceoR7`xWWRpB<e!b%XSXhOiM#rq-+h02 zKI6pRFXPPbV(LFvJo~=oyj4EuDRG_G)aM-5`CoM}eqZxFOg!^_o}Q!0-;8;V=efO} z=k@$g-EKbn?CRG({=M_<&)Ken>+sDLa1NXU=fL-X103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2KMV(|Up0NOQ#{khkv`r{ z%syw;t^8)cRafh?-!z~6-PrqO-TJ(FpF>RD-FR&F$^5im<~w$M=9AC(yNatXXZXB% zAE~<=kE<VPis@_Wn7*gP^c!Zpi>Xgs{e{)1mHg`0N<Y^SANt0+U+fw`+qaf}xL()! z9;ZI}j>pySo0$2GSIp-a`h!>9FrR%BQ=joi$9(R@?4NPsl+XMwp1Cd+(+{|dIai5& z-X8M9`CRLUe!{czJ<j)~^BEt*`sAnB>r<D{l{n_Bk23WgkNQ6LeaU?CJx+d#N8R74 zF8S0?F?AhNpL~yZ`OGKw`iv91ZkNyeF5dlKr7m%|Z{|~<nEZR=dEMunk13|^tn-=r z<R8ZM{q65Z#vS|nxyI@H&Hr7Cj5p8Khv)6}T%VrXdA=v6ZW?z!^}E>XGEU6;X{=B3 zS3it@&-iz#`{?&mem}(l4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8e8CQ!>94Fl+4QmQ;<M}1FWd3B{yV=@KJ$rP_ulbw zeg4GkmvP6;C-!{Cxjws?`e$SI&AN<t@yLBoAI>Ir{YQ=SK40Ch`*X5S@`+P^&F8;U zSp7`r)aR7CO-x@^`lnW`zN}*ycVE})?;838xAW;YdokYae@oq~arM<zzwj}P^E%Uf z=To1U`HXil?=N*3Cr<gyzZ%cYeb4<*JgZ-@$J4o+^6NZr`g2qFYRv2R`sAmW`pow@ z`NX~+&yJ5=-+Z4kzGCJ(_I=EJ=QGZHV)BW{a4s_cUB&5rbUx$6bMyYYF5@pX_UFm_ z?0m+#uZd&6&evJzY>lVq$@IP5Jje3f8lQ(B)c>33^e(RFcK;lc_c7$NF7egZ*{&OY zo?7etyU@Q2zu<ot>TB26{^<+KDNb?9@3A?+0S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103MMXLI1}zK4v{-#hgsWWM@f(^q;op2Pa& zr#SWXKAZ3TkNRAh?|jCI4|RPV>vOK_KIAh$#k}q==6xl0{j~pk^G81a2gkgxkKRB1 zJ$K_#{lDGklyTRkFREku4ikI+q5p8|*Q)-m?hi|!SjS`Nr%V2B>^|0v6SGgo&&Ff( z-|x-*-FW`=?bGwMW7a31apIKEeB!xzzdfJp^SR<V-RGfCaP<e)e9mLXRX?21uK(!q zS^bL7?!Q}~&$o+5U9Z$9pO}1N@*VrWWxn&%_!#bc*Jt0<C#Ej*8NWA9`*%LC)A@|2 z*z2acFEyX{e>dj-O!2Je!y4E3b<FqoEC2T{vVQ0b9-oKlzpa?(@Opmcd0TP!b3pdl z#op&`{Z!ZceOKc%KX3VWvwt`Hck^face8$H{m!3&;Vfr4%UKR^fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00-XVK>q&!imM-B%BSCT zGe7l>Cg1&~YdrmTdh@y!vtP$)zp>x9`)Y@A_D#&|W}KM(ikr{1>gsiO`E|c)UFUn8 zeUnd2K5>`NeB#mPsNUDKZ`LPfpN^SN?D>xxr%&hhenUUf+NbB!_f+|##_5CV*!{lU zhnR8qGj=|GTZu>Ydu5z{vh=<6IQfr`>38jYlka#8|NY+1zq+pX$+-J_GwzuB#IyQ+ zlTYmV-MFvQG|oQLeDdd}4>ac^@vJ`9F`xdwidp|~ZgVcXpRmRc=lkY-UN7qtJD>5Z zaecnwI^}wG>~#<G*L~`I#<`Cf@8Yh$=QIAOIK98!{?oeTd;O8?Rxx$ceDZheQvYh4 zUMKm)?4R)z*Y(Kvs?Os%<g+g4|E%xt%4fgK=XuxT^aF2Vo_Fgxcs(ck`MSpWIi#Ma zd7gJ&=QBUWuFp6z>yEsBzn}j3xj)Y^pZ%wJ*1E2n=BIqGUt|C7^zY91{JYcnaeka1 zzrW-F2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N@sW4h($&`8)r__4oW$zvk1wdCfoMuleK?kL;KEis=KL;yKhO-+jCpC%#?% zwi#z#V)9*=@l?0+*ZVvAeO90E!~C?a_Q~rcu6^pdCO^g8kHoG^K5?2)K6M?}d_G5= zm((AX?{Vrn?&>n1nDy&@)$6YLO+NcgF?~K$>~-m1N?%Z~Tlt|M>Y)#6>ZiK$>CZ}h z=+8=@R{FiF-!uJQQy*F9kLsiAar#aZ*L?TE);?X|<F!xL)qbl!`TTc$Gp=}C<L@fw z{Uzpgdz^e?=I_Rb>y+y?#PiB`%(>{;b!X01owMW<v(FmmT;Ggq-S9d&_lc|i=Kfii znDq~__RD<MB_=<`qd!OPPv@_3>T`c{A67o=>V8i1$!DJ__Ulb`ujcbU5}(~?_x^VC z{d##Hi9Mh3v~Ti>U7!4`aoR8W#O#0e`Kj@muXCMq{1Efpy6Vr0d4456JP)t+nNRGx zhv#JV&*r(h>V`htRd@Xy(9i4LIO`Lq`poZQ)~D`aT%RNJQ#^;ym3(5a@BH|FYX8(F z`tP3l@1B182dRIT`~95X&-wiv2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N@qY+=2WZePaKe{(Hy$cmBO!=67-Iv#fsCRaf~l zeWS@&A8qE-x0`Wd`gSv)nE8x5zFn`A*z?o+<P)cLncu}DpS!L@)@45TVU4T4^BE_e z{W|I2$UfINue0K2-P%9<Rb2ZF`K(Wz>W|_5P5IqES@&w(eJ^`H<BmuAm(o9#KB)Bj zO!KK5V)tKV{Lr_R{;sM2Yv><LKUv50mrb$zRj0bn_qu6(R6lR(l24rSnNQ4r$2a4| z<U3}*W7lQeb$7?-@Hy}1`}*D;pVdd2arz=V_I&yZJ7!(yr*WU-uFHJ#87FqW$Emv; zv;J;8hVNU}-<{9(&AN`+Cv`nezGLb-?&`Ml^|^ch_l_T4zs_s+f2gbX)$`Lh`>mLM z?TXX-<c}xovo3L3zus3Iug{tJv*z!P^Zhu7e&5cgpLdGs`%O$;o|C)y@O;hB4SAmS z&mlv;e=eBzo$5N@<K8dhuFH5gpSmfYxeoRDr~1y{e*OHslIvPA`{ceR=6>rN);Ij= z7hFH^f8RUj&bf2`n=9aZ{^=OF4m{ui4>-U94sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14t&8541a&0zl-m`yMJ|jZvNiC=QGahW!$m*G&Ama zR^MpPXPmlSoce4#pK<of_^tlCz!@h_b;(b$*XMOR_WEhQ^BEuM(;Z^wJ7#@i&p$iP zd6?E^J~4F}Cmwx1^SLVD_1Q0R&2QGPy88YlpLo=K#=H5{B~IVx&aZLx&2;|AeD?|0 zxcg}y`mfTbl|HZ<ci-3Q534@9^qozy`_X!wKGn`o<J3>_82-Dxsn2}IiOD}3)4!W| zcm1>V+4uaO`hEL;oSSoy^D@OgU$2hScesn$f2zxT;#9ZGXZ=UTW7ChB`NZjUGymS0 z{h!^Z*JYfT{W4BWzGLPSd%njxugTwCx9Z<}-Z$&>{-!v+k13yhGM{+Xc}hO<VZNRV z)A>KIy3DU}o=e#$G5IHBo_~q`e9XAxv(Mwycg((>pT^JDPy5`>pPQdsrun=3->vJ< zo$*5)?*HlozUDK|xk~hV4!`H{dyX&o_Z<2<KOIj_af(x%;s6IYzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_?p$?=!uVVk*eEtspz4@%4 z_FMBqUqH{FLtXNT-FMmf%-@Y?`Zlkab;&=BH~)R$^x3ZU!++;DeY<yK_T9z2ZsJs* z`NX`BjCb*<>-Fq7`|sBE{mr;z_DMeD#D{#Hx6CIVna}wc#;d;Sl26S0$iB&U%zWZB zpM2`>#{Rypak<g?BlFc4v-)GIpJwILch!Ab)eqMFUm36du<BzwuJNn!z5T4cK7Fzu z9rHT9@9N|I>D#9t%X&WJRhRzVO?}oSX8oD<)#sf2svqj6`?S{Iyq~MTaH!9GV$M%u z&Q)UatAFt3xy<^G(>}>}yt}^ZcH^TyM_%{tx~$*D?3cRjb<cgP_t*Pmzr@TZCclea zKfS-*K6mH)^?F_A6MMeLdB2I7@A1mlbzS-Ey03LTzSd3kSvSS3OHADw*Z#>*@$Ao0 z&yRJUH~F)kKj+QoSJ$oa^&HIeFfq@|j(IM3ei~2p$tPxg#)--AV(L5gx}N{8$9X@~ z>t_CLJnH9|+}FfoIv;h8*7@sm+UHy!;<rDaxDKwvH&?(pa1NXU-vbVCfCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00(}64)ou%_us$w ze2>@Pxu;*@>R(J<?>CK~t)KQu{!AZb-p?kcZ!+sTX5X&Mc*VR<`ZO!1?!59nPChYx zwHYTSpP0Vd#N<1kH~;&<y{^aoKHh5IU47Ok9-Hel)pb7mbj<zie2-UM&QIT`%CGvW z%f6ZKc;uW^>~&LJ@0W4bXI*0E6Q_LU6Q}*M{%*|oJMl<=OvU6A(=XF8{WGiYDt*D# zKa=_HqscfiePG=uw))G`PuTrzl|O2{`cA7~HThTLG3>YUPxjwtUB}gzd+pcbslM|W zXMM&~OkHBvo!uXt_cvUZRX^RI%0Jx4YkoQpIX7#*`?IQlE9Wh7t>4tG`keEs&w0KZ zv)>eZpVS@0>yGnPpSl(M`c{2j@7Xxrk15~#r!Ma^^BE`RI<4{b{#SjUub!{Zn|<>7 zYoDrH`Rrf&W<K%U%s*R~`YArV|GLl9eD9aK6<_=u=WzWV?%(zOddTmdGecizo>x=s z=Ub2SJe=a$&(ZvxGR6G7UNQUhb3OUQqh4?2>-CcFxZD4%eY*am$9aF#zCFLjb^VTM zJe-@HhqKPx!?~;Z=^U@`$Mijm6MmoJ_ZdIH-)HFi{X+lm#_@(Xyz#%IaDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b2yVF#Z4`}zDm zd&m4e`$PWPf6C|Y=riBr<foYWSL2!YH^kmI^{d~p`Z>=U->u8Kj@=)dar$TzJAdZC z3q1Vye)Bq6pZbgwr+ns*O+RnX=XDc5YQFbd<LiE8-0`USHO}{9b3e0R)=lRn=O!_A zYn=BnoWs<0%<Cq9)cVXPrY<q{nO`xVe~1t3hq|@@&G~%Kv#!U<AJspTy6%VSar$Ty zr+%95t4SYC`pwcm)8my-|I8-t`b{&Rc%)w^eXTuCzGBuV9-H~8uGeKe_1|WGjOoXH zu@5<~n>fDC^?A>mak|dQCuYBl6VKe2y8oT;ai6D*JD%0om~qE(UG)V|b-iE4Q~mh8 z+4QAl-;Q@*XRNF1^iY@kQ~jR(J~Hn08E1Zqt1jnac)e9O%=iA&^-f*(OPunVPn_zK zPwe`Kd|ltvC+7TTJjJf-@w9H2KkIyCyo<T+9nYNep^r23iFpp)jc59Xhv#3Oi(R*# zkJq~0c<u8+^?7dh>vle``;f1nAF@yC#+aYqYW-Ay-mII}cRug4V?O7)Pjz1Io`=+} z^OW<q^F0m?@yPe~ZuIZ$fB4_ou8-^E_mO@d$pH><fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%fQIq>A)vG?DnXWW0!o^j7l<K&-> zd7WotUgzm`*Y!F#arH+I{hFCS(|3@%AwJX({j_)cZBw_4-FKV%bLbn+e8;2ui+euf zbv=g9mwh^B-7fCd<vQ<TUT3Pye9lSNC7*cIc}o4me4m%;`<rt#?3?`)^Ew^#zEan* z>v!X|-}JuUna}q+@kn3N&=2)6zv-_@|4heY(@!(?p{@Lj{Wa+;?U=rthy2vf`(j`1 zQTt__KHJ1+^I6w1`y}q>Q#Zw|ALl=~4><SbZd~W1`VXgm#qLK;UFV-2XP?B~`g|XD zb(x>)^Lif@^LmNBZ}N#fpK<0Blb=3E*JZqmYu};IclUa|fA&kh*JnO4byMv1shif{ z&39eK9q)cW&iejL>r(e>9Ir<`A68xZFEd}ypEL8x4>A3niRV-|JP-4{?3m|c;xym+ z9*^tu^GV)U#r}CA``+DeTAzIqyDsB1@9&*Imt?=hyl&!geePY%ea(GNT<0X`Wr*wC zl_#Cg_iTMnhM!M*{uugz&;B_f`wh=m|J_yp-PKROxSM`&A@BE^ey{2GnjGK&2ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14*Y-|$ltB6 zzc;`6ckI0`>tBuQ@7ssJpU-?^UZ=;qeC9uQJo`FM{g{<c-(=RWar!iexcXIVe&wrA z_N~Udy42r|=e2*wUcZ}9ed;pqcwDddY(DFD@$Bn*jr;y&{B+!$m+Y5wv0}fEe19rG zt?zus9nXCJdY|ikBtN`v_Dg-n9W%d+M?U9^F>Xxp*!0<?zb5@O>90xbe8!1K`fj?v zruxsizb1V&Q=Iy0cKP((>|**~yDs@><J4EX^3`vg{1o&0na?<J%4h!7cn<wZozHzp zKI3QOS^ZOMJe;4Lqr|h$UB=V7%=|7M!@j$9cju?~*RPxLtFhlt_UZgbjr(&=uh(^V zUq9<QKD+*Ieb?o6lkf4X`K+7bQQwEuC7<t2@`;(BV(Jo8x5k6-(|oSSE}qxEdCnvz ze_s8($tQL`<6Z3MU_UR{b9m^-?fM?C_4)as_DOx}GEPjsW9Fxr`kqhzONssdGCuD9 zd{X`0IS+~J+~mCGd}X}xe4YE@d9=P?!~D_tdXDbq`#Cy}{ocm!ZGJ$%x6${m@BPyk znrmF+n*Uvj103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103MM566M(*Gr$>nZL8In7?<=e8wLg^Y`no#(qE9=Wf31KKJ;n>%1H1K27n=eSI;e z&ozCr8BZ~F9aG==v-*BBpM1uN$tNbCcnp2LT|d=L`L}D|%y*owbKjS)%lyh;_dof> zoP$1pD_?!I$#=|tiJ8y%Zk*P2KI6n`|DMk{@xANTKDoY6#>tH%-`AV{HR+@2n7*2o zPe0Ag{+jgFBz7N7#@!$D>^S{09kWm8r}2@#o$A+3KC%06d;Cy$?YHV`oP5XQW?k0h zbvxdjKd;Z9^%*}KbKPH!=haWOi#b;v&+3=#`DxtiGESV<P5G?b#a^HK&c8a&epAf8 z)BKd*t()eLI5PC*P4mfj?Dw~wpI&!3H@$zx{W?8P-4u`EeRTa;*WZ)j{b&6Y^Ljm> z{1o$fGoSG;o_T(xuQTT%amcUd(5655%=*-&AGgPOKIXZby2|G{n|KU$({nfLrr7IJ zmwaOKyO{cCWA=S^-BiE!%k}K*R{10IxleT;b6+3MLC#IZoWpfK^L<OdZhc?2&zr0p z;`E&C=ipSA{E?qSDkk4C>k{=<>Z|<pi$K2*_4`o25B=f%KGgTw_u2Q^_n8A6-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G_!1o0^apl--I>4B zPv2<z+$v6gkN&yx>+jt2{wl8d{C#`HeqXCTpKDX!>v!X`-e1>eKC$OB&V0v*`<DCF z_j|~vkM*qij5D8@{9E<eX1?=1KC9pN>l&v%bv>Va>W*Q3&rjo5^I4bcaa`{sapmhi z95v4Ud^W#Zm-)o(KfSLppYuDs@9dwrUMJtDTEAW=_pRo$J~8!)D?jaD`}Mjb^P8B@ z(?0ChulhK0x38xAaH_v%^>HPi{+jBmIg+owne^Lqf6S}n)&Ej`GgJQPe%DRkZ|c)e zo7nk`6Ib1)pEvc#P}lj?Xa8MHeaEcpe8y+4({=yWxUO^V+nVqCzW=pv)=%-we%Yta zS?04o<BmCxiJ4#H+PCv(&U4juKI5!kar1r2`x)2Q>#lt(pM9qJ&ac<2_m@7p#MC7w z-!b!vJ^$?ZtoN0DJNCXk|Li#XWnIP{&+Gklei~=Ljz^uZ%qQP*H=p{{b?o<-`K(J^ z`P_$_pSQ0|#)*0THLmAQ_j{%fwCh*C)+c}D`8UO^8|Js`H|u(Rp4)joCno=D%sx}R zyKmM{^_jmLkL&s*=Ds9${>c5PxbFMSbC`3RnDg8*UUpsbM?Zh^9IE*A^DocAJWq$8 zL-L$n``5Z-7^gl_f3W`GPrm^3dqBSj{1Sc-=o~tS&Y}NZiUS<r00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h!1wMz`r8uIf7r3-*Z9f4zT>Jt zyZ^5G>8APQcYo)e`Kf;TJNUJ({{H<T-|si|`CQdskoE74XI^)@j&(oQ^{#yHv+DBx zyFRbC$**&9^=H0SUu&PMj8k{kx{Nz^ea~n7^|fEe%qPCp>-M<oj;lWT#J4M-`HVB4 znEWxkZt{uix=#0Dx^Kzn+|)SdAn~aAhjCuN>nfk~l(_a!UB%QTp4a>|&il&zHcs!i zU#IHwzB~5oWj^m~`Eu=-{1j84`8AFsS6|KD{+sT*Ija9FeKUz;e@*wx-0Z7K|4riR zXQ{rI<ahC?b<;R~H_y)Zx{MQhzm*^Qe=~nK9#8I*_cQIk=CA8^-i*0lug0^^$8MZ+ z*L5pD^jG$|&3MInAH843ug1LJtbZ8S``*>{{8{TWUUk=ekGrntAI9m++w8aY9UK{b zsrs=lufKUeS)cclxcgkG>zMsIrY`x6ckvkR+iqRYXP=H;mvQRWxUPHWd%Qkpu7Abu z?>w`A^?RnS=li*J+<dNOUE*4o^-sn;Ula43-Nn3a)+J_L<}*&5@@qanZ(N@v`%W?I z5+CX|`($0>F<igoJFffC_dTzhpHuq$<h%^A&*K`$g^FvwoL>%K`C}9FT<qs%ubb+U zpJMh+?7Gfp+%fBtU*mi}zfbe~G`~;#-hZE_UthoeCy02=V;=LE103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<700~~n4f%F&dV)_dc&+5yY#_4}M z)8AHobeW&xT9?0n&ptKox`)4auXWGP=kMU}#@+ter|YJC*X_n<U7yq^pX;4*$Gh{X zOFZjbjQOFTHS2fhG4nZ(8K2j_UtclfDW)#5>!y6yW&AdLt|^~&iCuRL`z4?2mDu@Q z|GP2g;K=tS_j4GhzGJ`M-TACb{Tk<elpkm1AIA9}Z0gqQ^yjQ~Q(f{M^Eo;md0%<G zCu5xGc%;83{W|Hhsd!XhPWrGq9_h~+`qhr^w@IJLi!uEw9lM_;^T{VB-*L_F{yTg_ ze{I$$PW`msS3d76alMbb{m@l+Rv+-%xAQOF=kA-@jnBN!blxi8=Q88f4>r{A=Ce=7 ztm`<|O`m6YU%k&7Z@!=XelouMz24PlpIyv8Q{1iZ`RtQ?#)-*y?D=!(Gt9co_qxm{ zW<D|bhj`uJ)O9>I^QnKfZmNHHe|4TRe<uHA%yVY9K6Q!b?s=8x*XDVb=i&66e8}gy zoag5d^ZZVH*r(QYUEWvcv(J?8`P3!u=DV)z*SOw)@`=YapP2iV@rt=mbw6_+a=#Ok zPdw`Tne(5RbKUXbd2xB0e8(dm53!$z+i`x5sOROhZhXGhb9q;n{Zp6N`HT}E>ij;* z?~`8meUiRbeXXCqIQ-xTKm6}f9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4UUuLd`XJwizQQS=zQW9Bd{%#4kGmi4)$y6X%iqNOefutE zzg^w4^Jo4p{>gs6XJ2QkKl8e|FT?ff`_Supej1<G>tsITUCjCEnDdo*4(BxaUHp1D z|5=y$#3`To#IDQuZhYIkugp*J$okyp+=n6G_apbKW6r@8Q{VHQ&v+Nlyzh$HKkHMM z*!k&tq`qU<_kLa9<J2ei{2JHyan;xN@~H9p{8?Wy&P;Lj-^8Qz^He`h`ffU=|0c2f za57FG&Wb~y&91*@H^2H+vVZl}bpJ}~6EnYyt8aGb6VCds%Q*9i$$wOw_Dy~l&zt>3 zsY}eh87J=U+q3g$?r-;D-Rz6a`t*b4T<*rHOH6%Y@`=eOc0S|8sV@1%u1~&W>Yk1H z-geAB$!DC{`HWwUz3;R8?AD*vr+Rn)UYBv!XPlV)6nAy`9N$-*-goEoIi@&0Ka$V7 zjNcp2>L(qacX{r8rnsKloBdOlnCEtnJOAu_>R*lP^>?4=nxC%w%GZ6$eVguo&Pn1? z{l6La_vP3;AM#w7;?d8W%{b4$DIR&w=6O~>uk^aqPx;Iz?&^9z<E&3i{%%~?$?xU- zUe533UjDtDK52c@p8(+~M>)z-4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14*aMb_&R-lSM2fImA@O0s?WG%_FMgJ)qmLe^t;`SXZqZ#A291P zKgC!7?){_I<?rVcd*3PlYF)3(_#FBPlh5^>;_bTWJ|&-Xx;ZE3HJ|gfi)Z#7V%C2> z%unl6KgDTX=d-@^8NXfctK)7y^+!HeUDwV(jB{VIuFlEb^ON(Dm~+(Q<P&qBd))cV z@8Vil*CXpP-*LPy!#>k~+x+BN@)dLa5|5gn#><uT?WE7Q`gGENlbAl7^xI5v>bvPa zob=bEA1C9))jx8xzh<iMewC@8CHcgx%eZ6r>F(z5)*tC7&VLthh^gy+pB?9YXI;jL zW4`*7QlEI%e2=I5bvJ*eU#ic?ll@)m{B72y?ruCc`{n&l`|aklZdcduBjd#ElbC$s z^nIT4S(mu0%ls63pQ&!jPwUSY`+oB}S)XxY@*Ok(YRu=@#iPz$>N}rt<`eV&*7({l z<BqAH;#t=@<K6RQ&FA@){?PP!RzCHKXX+~+!*lK-pXcKcQ=jMQvoY)QoPKtF*H8O& zzF#-<Q_So1eDaCe_hFp-RM&mgXTI)J?qBX_;yOP$2b=hCUhDgD)OdN?&y^R)dF~x~ zUZvl+V(O-NRQ<E#?Az;-@7Q%2@9Hw2&zqQh$0MK1@1=fJzn9Y2s;~9af%m=lz5nJ4 zI0w#wbKrZx0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%hm zV{_m?ynXuKe|`0%9W_3$eC9Kr;&Ii#rN6CW@`+vF`R;p5efQaAocbxA>2urlCk}m! zYkl_lpt%0-{hj;uK0TiP4!`r$c=!3&d|ki3A9w2>)@9$me;Mbz)p$BL$>-d4JnKA9 z^Qrs#s!vQlG5LJY5|i(`9(P^l-!|{F*G=`k-%;1|?CW3ixnHTvxZ}h9&;6>n+o$)< zc(*R|iM?*hPuC;)#H>$D{;jT8=6CU^>(b+_f5^v^+_#J?_Wd|&KI7#{_2Z=9rsI*i z>eG4X$4UQA_tRAW*w}B=>u&bjq@QHhXOg;IT>U6lUrPF4JEpGlJw9&s^Y*%o^E!#i zCmz)wJk_Os7qfnfXZm%9*z*}D9=Wbr-+fUx@B6ynS${M3`RnmH?9+7_r+yl*e4X#) zJ5Kv0pV;fB@wxf_W!+SleD`-IKgF)UJI;Pxe^wu9&)*&Q{@J(JcfQA|PrhU36EolA z>HTzmt*iT)eN(@U`F{02HSX8TxMN<g^BJE*e`fN#nCHwcPS366*K=%mo~16&$Ha$q z*ZMVoJ!jYW=6pYovwn)luy60vb>n{Z^TDoeH=oy?Vy{o#y6*M!#md+BKIi4AbJh8r z%Z|r&&O64{jz_*PPsa7U%k!k3duu+=!C`)?%X742*JqrV`W`3$5bOPCKI;>weC9jm zx+ecH&UMLk|FQjE$LIC?Y`@R;`)m$yfCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)hz;C4kUtj%ZiD&xHHgWZ-4eK+X*!w1*cwGBrJjK+l zezsv<>Q;QQKW^%mJM(w>H)H;ezGL?3{IlbSzkmP#?7dx<B)65Ni=o6&?4?9fFL$lJ z-73|Os-m)Qi==uGjiJO)Y$!35TN!>nbob}$ESN_`l9aUhve)?q41jHTX8NWxFZ2ld zKK`yh{dRf8=cYgLtH`=LAAg7BJ3h7l*dXWR(0Q6=gT%2<#qnQ7>e2av_;=WiLm!Yn z<R6+hHb@?bzr#U4bfg<(f7beYe|(-4rykt(;aresoB4y}-Sw~MB+p2larNQ3c%JHa zZ2ETN*pJQlYh1=_ko8#kHP7W|-WL)6Kxeb`IPejABXqse=M4PT;h?XPAH7be$N8x4 z#yXNtPeR@n(e0u`L7#)a(cO-V`PSjCI`v223*OZ!pE&)ncSyeRuFlWLy2wwTsd#6z zUm$tdpM}$UCiF#|+YNGl(T}Zun>z9zMfy`Wn{n*#>c}$=`l7d!-M+t@_uO^ZJDlpf z=4(ImZIE&3XC&TXmv28deXxy=V;gzij%V9^uTSmc>c=|SkInnR{^Q41J@dHh&pdoj z=pLE$BVRW0wGOVQf8$^G8gcHm%{}LPad6+duIabNCBM6uoA|n))xYyIKaf0Z<1S8q zm$&?y-{5(KYdy7Jt)KJ2zERhlk9AIn``mJVg?Bv3eefW1Ux9=7XmkIOH<~>AZLjgD z=W|Kf+kEAb-y!35NL?4Ve?9-j^}4HP{`vc@zskSg%I|*WcYxmxZr<O#zh74%=OE`G z=OFJvcpy9w9taPF2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;lT4}=H81L1-2KzJZL z5FQ8*ga^U{;eqhLUkMK!^?SYGSvs@N##w#ei-+n*+4zmbm(H#7?I*rNbZ_9~`}hr# zXLKFkbN{7reSf~u1rP_n)%@D^Xmp5P&(5ZA7w`PD#sxVq#$$8-W)sJMRvhg7#6k4B zJER{-y^;714?U0biI2(yJ3n!d^)?b8&3W)X-_@&*c-OD<QwNfV4X*iW9d>c*$OG|% z_(A;O&QJVN99~E99{jNOqu~|u7D}gserM@&(Dz7(Gi2ZCZ_w{Zk2CN~hcnRYJgB=t zKVn^o?SW2Yqcd4~<TrSyi$!<y8^h7)gRjp2>UubDYTcIItUvqsUYzvR`RV+O<9KIt zK0)W%j}3PD#Es<R$L?_D>Ajk=$?K4OkoOfE#D5j31F4(v0X)$l`5<*h;ya|yc~|`_ z??GK6<E?r<?~1c;7vlr|bRD+i@>6eQzl_WiB#wQD7uRX}d3DeD-r3pRJ!U`mUWe;* zIM2bose5+iac^#rdzd=o*wo+U^SNMC$GArK!*(9_ir08!gRFapL;LOXfPHtq>fG4R zxdcaZ?%`G9*x=B;va`AGz)|-hHfTR~hpy}LnBV362j@p$ka=Kt$h^QV?@_<|VK4kE z`TL;g-=c?o`wRS>*Zez1{v9L#ju9RR4}=H81L1-2KzJZL5FQ8*ga^U{;eqf#cpy9w z9taPF2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;lT4}=GPH6B3M3!)pu2JstDbZn&) zCXT;D=gsQV<>M#McvL+&WRp)EBoDmvqif?ih1SVg2lrlk@;!Nde}8?ieG@0|TOr@8 z2S0n9$#d8GFT3-zPoIqJFXsar#1C?QjI+)ScsA$Laq{f<`$HanqvO~h`Pkspym$7Y z=elYS)nOagx^phH-^9W3VBGoGkM<)U^mFX&L+gP}9d?K0f#hL>o!@buqr>5KZr;<o z_n5p5!ZYANKZM>%x|~OKI_PgebT-D>=s1^-qtW45FGBuRzw@w%bgZ@?)zMzfCy(*4 zzcn)6M{#Q1usdYG9>uBi@~FK#f9^-V{n*5f#6jY-(W4PJ-qrIyNZ(0cqx)ey4;ww5 zZT#T0ZWEj5>-2f@yAL*egMAeT^SFo}r>iH=$h<l~@eUc!=={65_MbTWW*o{VPMzb+ zul>UB`gw7^oyWT2$2QK*eMJ7slP<OMuX|7V_`%8jNS^Lj$2*(P^<CWltNG-0NZ(zY zyd4hK;UcpB#-V-X92kerq0b+2{NR9(8iZes1D<^lyZa9R;GU!}c7v|N2I+@wblkS{ zzm?5;ezbqr2mfWv-;?I=N%QxlzuMoEM)w}w`x^m;hr`3+;qY*HAUqHr2oHn@!UN%f z@IZJVJP;lT4}=H81L1-2KzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2f_p4f$+dD!~=(Z zzt=Xpza5^XM<Wk=hqLOsyj|RN<Qos>C&W)a_D~-7U0gcDPXC7AI=G!Z`CdNbl->FL zefX8<I{JPP`Ch%pwcX`)e%E79JqI>%(0=R=yL}+PjiYPiys%I9SDf<$&hoz(&!!%~ zk@pjH9Gke2_-w|-e<<!c;-m7gjl@CXvsvfm=UlT7&X>R4U(Or#P2a8_|C$$lgghVU zeEc0AwT{HGjZ^F0<?sBCd%oD?;yRPJ-Z$3yBElngxY7SwmxGP|2JG}Vvve=UrPDzd zvq5wu)_d5Gy~EMzZ$9|@zGG8Q9JJmSzp=}+e`ou-olo3;Y~nkdwZ6vP{yA=YHs`7H zuXBbTvZ-gBu8;lnz4LR98L!cyQU55;reEi$Kk*&%J{za>p2X>gZKMuAHrV-z@9@L* z@E>}^MxTgok@;YQ_G24|){(gV%Vxi+^SNsL?2D1Uqv^BatcUs&pTt=&@`PPJ^&snb z6({>99MY$fcjxc&_&noy*}gyNi+`vdztMHXyL$Z8ExWn@=?8ZC#KFOHvai^n{LW{+ zje|P&OXq}h01nO<dChykIR@clY$I`Sz}FX%`;0nl<LK_c=5q)6#;z}UT^#?_Jn}z^ z-FP4EyQ^nEcIZAU{}=lEr05`{gM9l7{G7M^J4XH;Bma&O9taPF2f_p4f$%_hAUqHr z2oHn@!UN%f@IZJVJP;lT4}=H81L1-2KzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2j0yC zhkke0dOqS;k@^$8nfl`gXXP2M_My)Gu)!`5KX^$0W_vK-(ybB4-=Xzx*x=H)HF~(o z_uO}JzJD)V{pllI{pIhzH;><S>wEO-)A{N1S;&0ei_C+1)@_GV`+^NpzwG9maeihK zKjc3-kA>LaY~s9M??w6>8P9&(<Q+9X=0Tq0*rW1~1|7!+z5dwXsC{Jr!JVJ}<aIdd z5AvRHe%LSK8(ib64*yYpY$Nfh^|VdiX!;R1l0Q|)I<QV#+v|kgAp5p>r}R7Mb&S^Q zV0XHmNA)>Vy33`@k?!U$kGe)rV?D=ZyL7sv(c_?Zy^4c=jsABR@5XW6oz46;K6zc= ztNwO<7+1*pFI`Q=?YF)1bsp^JeAwUF<QqAE_S+tuKh0~GN1Sm$`)!j4PIPb9Yhp96 zCXf0KyZ6}ncX`t1IgUNi?=|_1Lq6y_+bfUf_BiMb@i%#k=g1STamo)LG9PTver#~4 zKmHC^KJy3FXO!RTxopR6(@*|Y&+`jc{GzV2d(O_!x`O0kgOmOCJ;%J{=UxQw?nCsh zu2Vnijic^m`>}`nZ}O=#G7d=Gw*8LZ+0Fb0e%7Hu_QkmNiSxF@I*;9Z!1>$qsCbfm z<ACqE*Qne0sRP&jruz?ni`?Uk-yrovar}>BH*fmW&o=(|;(PlsUy$)T8$aV=Q`h0j z&)>7=?^*NrtndDN*67}&dw(O4@Mw56JQ^Mi4}=H81L1-2KzJZL5FQ8*ga^U{;eqf# zcpy9w9taPF2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;nZ$OA|7`@QJxx_IZO?z8Yj z7uM*6(T(kp`Owcu{HXEV5C3T5&c~+CICw7lq3>(-e0MsyP5sK}d-Fo#;8eV`ozM5; zzcqH>&wq4Wo{Ktc(9d`0_deCSt-2;Y?Qiy(ybd`xv-Y2Jg?*ME#D6sToO{r9*pB1B ziq!9resl92yZF%a9%bXdjLkl=-=NP4evml0{OZ5vCI7_Md2^ptU(ZY3q36d2owxk- z5fTTd;%C{!LGrLiljk^jAoJz<J7m4V!TN1*@eTSW>3GoX-07{P|3a4oqQ@DHj%-R# zgAQYd=rf$R{ODk$(;*Iy%Cn9C4mWz<`Mcxxc^uu&Cco3=zSmD3IGG2}+02JLkmt6& z^Ak5t#uv8xckx_I_P5FJ;yXX{avt_BPM**IdJi;j@`)QAZ~LN;)BEQ4vFo?(yV2({ z4miaR^vC}w!b2eSqnVfeuA?3#pFAUZpySvpu6Yp$oj0^zw#jE5i7$Jz@8pB4j(Ku^ zcJol)niqXk@Aw*D`OdSw)~)WRtNPQ)eYVl7u72EuLhi{&k-pu1{AfS&>4)9n;JF(l z-t{BSI@-STvu^B@kbPx8LHx#{bAk<Wj^Q=z!8sL@H^jr(k79Sf;paZ=Z2P<X<=4Hw z{JvkyCJxSb=D7}=^}+@_KXKzOe;23Uqj|&Y(R`kuZ-;CAi+>*#9b|NnZ+~FOdAa?$ zDeI7R___i)2RR2h2YC;|1L1-2KzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2f_p4f$%_h zAUqHr2oHn@!UN%f@IZJVJP;lT5B%Nnz|rV?e{KIx2k1ESwf`*rScg;b&OR#7@l$^C zjMUjbsvg|Mm#&R*(fz#>J6+tP{#klCkoskB^mKfW{#zsS0U58eJHP8zUhM<V|0quF zBlY%Ub8bNVK1Y-DBJA?c$}{qQ;qPqx;30iJ{toFsn|U~X=((utkbH1dJ;*v@8;OIX z+c(br#dG0vME^V7^mV@H|6cp3b$S%%gZo21;|%Q&exsiodo=6MdK(ApE1c+b%8!kn z$9PqzbEnIZ{svvn{Gk2@y+w!UG`cwcA^nH_E56as4s<y}bhO|uuZws7NBffB;pOLL z-FV)zsRt){4<h?_6**7Nf7I`KZ1=$i$y-?Go;c|9Pd;%Y`8%A9r}qtiS5N#Z@_u(n zAL3JbP<Vtmxbo0zO7};+!_`;yUH>lM{hf!s%Og&{am9H~_6^(XhF^I@e%2o(4&v{y z%foM^5B|w~E@D?_zt<0YqAx|?D%*NhY$Nv{er#hG#}B%0XTP_OzTETJ9WoBs<>4m} zT<gty_8{Kv8}*y>vd%-pb7SLQ@#b>}ybB*cirjOqyYn~qAonFmosqcFdA7;N&pemi z%!@cUDi6f}UUVPk1@8Ki2Ra`=NE~~ISM$jON3)*Mw?+5+_80W|cZ&QwMgE=Q@9y6z z!vEp_@c)0VK<>ZXf4Tqi9)t(N1L1-2KzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2f_p4 zf$%_hAUqHr2oHn@!UN%fzdIg4clRjHUs)GyU7+Xhxb3s_V#Y3SHu=;$e%0>sMvZrD zkUY@&OW#&~$ir`ZH12$lk4+vnh<{<D!$Y5E9UeB{)Bh~&`r_Xq^WCA>ADg<)#=pb0 zuG)XrADk86VfTKV^nXytOTR;Wg1<w?^L+6ekD8zTvw3dv!BKg(@ps7n4C#M6KY3S? zJ|K129Wr0y*gHJ54%pPqi|gsUv#E2Q?L&2)jen5e?8jOU;^=s#^EJ;bU61mXA6>A} zx}T-vDcuhG9OKf5p<C<lgTK3m?gB*Df&C~B>s+M&C611Epo10e;?$7`cK$9-{tl_% zVfTDp9r?y79Sr+oB+ve<_I&XCkPmj_5WkA_aX$Jp(D9w^I&9;V4i1|<>>al6@#cM} zZeG>%ZSuN4<{$DpzvJW?$peYo-ua2|aP@80VQ9VCH~X=P8;OICV-pAQgZM%G3!CSd zpXB#?&PMNxUKQ-}xcC0rk$ax!z%~*GR~-GcaL8sI!4*fxyTQSJk$3f6@VTLRAJ+LJ zZ-ZODee^!z^MdNQ*FGBu;|V<udG`NS?a{0se&&sB+{K;$S+>W;?vQaEk1i(qu(!Y9 z&%blz-#PN{9DjHJ&Jq3(|A+toa|Lq$<^Ie4m-iq%5FQ8*ga^U{;eqf#cpy9w9taPF z2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;lT5B$~gfc15qJ*C6z@_udqxTrHcOYdcz z=)e^3`gZxdzFnRDwnxqDXpne^)OB%mZXkKo;Ro;HH80kS^Dt{)PR`MPIo^2lXmFID z{Gok4_593ZG&<pVQLneYpD(@M*5Bv?8F$rderp|Fk1gz;4?q2OxYkSSc(8wspZHnv zN74I;z3bEE;RoGk);vMSkLEeZ2g%#vsD3-#?T_O_=VoVj_4eCl-kqN~c+~TPQ?~uY zjm|r@FIV%)qaS_ngT%qn?3>qt_u07K?+tG(9gy_C=z74V_i6My=)sKWa>h=VDBTD8 zh#gu#an&BurMhm#rTazy>iCfE_fea^AobWr;yawbyWMNfb3bhIutEIB6_*Zat<Pqi zz3#Sm`~T7SY|b5ika4g(d~e>>I*+^FE1qNXo{`Ucx_v*<=b@*Q{*FGzsXW`{;|J}x zz4D|V?DEL}Y(&Sn>+3w*)DPBKh#zFX-iy0F#KCSH;vjk0;MDW%>|NbjKlWef`)YDu zp<}hJd(ZbFwsDO^z3y4(U$x!Wb-OtE-2d1+r0)*Bp5)*8S?30Q4%m0&%G>bII)CKt zu=vt^iVYuMMc-St$AkA^mv2Az4rg;eQ`g1q?`-_v3fTwxV}tlX`>~DACvHFX4ygy7 zKQ`x}i$@O=UD(@SQ03n@-j*TnL*9qH5C6FW;e+tO*A>V)$T`S4$a@eT2oHn@!UN%f z@IZJVJP;lT4}=H81L1-2KzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2f_ot5Dy&aEgM8P zx68X4rysbhdo=IS{8KtI?AiFQ#+`RmKl+0B&t^RGjMQ~Fs-NTbW20lkc3o#r&6_;@ zcl%Mg-TD6>Z#;ke*Bg%icEhu9{NZNL!b3=${ImL;^aarm*ZDp*U+gt+=_orLAAY{q z58?;$8;S35H1iqt9Bbd4*VyEP^Z`3R>q8#))Hx%L|74!ZBhL9SQrBUZkDoeh5I;C; zUbYX-`)VF_Aa&Rs4#s2O%Ek}g?N8-%js`Y;K<nG_3)?<5ALh?|K>Qs}o=<)7cXjy5 zJJrX2$FbReBXQ$V;|$FgKS+G-OS8^vU8PGJJG;|KJ*eYBj{}ZIk29siK{xTOaHq#u z`U~{D(#=@!x@_r$(a91w67TS8{!ZUZfAZ+N{F?XGc$e3$AL~xsco#>{y20-J;NP7i z=PkR=D>gVZAN(CUADjF;yLnHXNBtdk_450@#0Gg^v9IEtevfgb2PSXn`ySMZQn&P= z@2p>am|w$l9>??F#Tf^5J?o3#=(@Z3W}V4roU2G3NF6q4|DCP<S#=vf>)PSeek~ha zZiDDyTm35cV1v|gpVH4r9CRFe8)qIoFZVwF4UUR~jJv~?&$x_JHtP+NKgjR$9M?IR zypQ<nd~>dhgY!=wJl*)=&9;vEPeSfDkoyn&QRF`8`h1$do}c-xzWRJb9Atjj9S-SX zsRO&Z&fnGH@6i3aJo~#k{8#hIqs}<APIvKN=<n~MGm7r=?Jv@D-rklW??c{)ybu4m z0^x)3!PgbYImkK4Immku9taPF2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;lT4}=H8 z1L1-2KzJZL5FQ8*ga`iWdEk()cglAB*RqH7nV&rm_diS51ri7G8;OI&v5mxyQ{!VB z59!d(vYpr2t{>{x)!{!Y|Ja<HS@DV9w)D57bh!umUUa;FJl^>A{HGhvf4<@IFNObl z!?VGGzv@QeS$zlikGDSPg_*}}^uqkEFwe_69IRXEC8u<I*x=F+pbH>>Q@`|^%EwRN zWz$dS_}1oJRiDB0%FjA<IH}Y7e9F&zf*-`s`h)gkQ)eV@bl$9a;qUUvJ6I3Zb$;rM z<b#90&HCTP+3)V0C_b@2h@2z(F)u$y=O=ISyoH^gyi@u3!9#KOk-8ny2Rziz{z1If z^KM<_Uvc(pgXn;G-<K`D&z-IZeU9`x=)2I@?DRTI|L{S*&7Cen{fMKdFcJreqjxn9 z>1SKJeuozwE_uckZ+^Ge`8#{{L$9;Jxp^MPu~{b&KZqZkjh<zl19aEj{>e|>Zxv_F zw?pRbIPZ^<yt_K--CTz~mA7o(=S`gVn>y?DR-As~2l9>7fyCh*Y{tcJB=4?|=hNsA z+kWU7d7e%EnuqH&kCjK?2G?`f{$PXadAoSCuhj35{zmHX+g|?extn#I%J;rtPu1V~ zeUC{GyL79%C-3e->MC!=ySfMcs~_{#c-+s-cjY(ZT#c{wV?4%ZU9p=u^&sot;oZLK zyc1vboP+LMQ%{`x!RH;n5IzOr)vL&TM*gy!dye=HM^ld<?D{+!C*MeaKOcT0_4eED z@)!qnU1!sex(=x)jt%19A^FDl*3oCx^Ev1uQg4hdCpyLP^}qZ(%iA(!9r8ZpeFz_f z2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;lT4}=H81L1-2KzJZL5FQ8*ga^U{;eqf# zcpy9w9taQoz4E|;{!%*4+4#x-C=QKxwI6jm{H%Uw>9suG&QH9<t{?dmo!Eou`s2ZR zk4t@rJjYr4dFpq1mtI!C*SqwzrSIi;dQWt>()Xh0o&R>c(e?T7H=NHmd@Vfw<7Ph> z&O-d;y^voxtKUI?bi$=8KG7M2HNQi8VV(>9@>&nphw}tBdOvi3;6xXI4zq0hAo<3r zaj?O=eDx<zK8SztJR9U3&B`;L8$WT*-AD0iKj&dz#aYjF==p5Z&-u>7HnK0^U_9+V z`$is!-$)#E9DBtzuKmo*$n(t2dUbjDLHdAa_3e=J)WvuH$#ZY!Kgi>K7OwTwd$`_n z_&|tG2pq)G`=DO~(c?6@^j_$38XWi=Jq|jEsrd3sAA=vX4g!0q4nIg7Y;~*~J?(gB z{HkuZ%Uko+_?^F-C;6cBmS6gmtA5tIL+>N|f&aILv(72V{IEg$ZIkyX@;-G)KjM@3 zufbg&?>X4@TXA%H4Nm#7LHdCBKMR-M5Z$Brj&aHB#w8ARdG^!4^*8(Eb@#rlzE$ry z_2hx}+a?d(#mO^H-6O>DvyNcrUvc(LIJnO`<lgM!<>#I>u6t8`c6rp1H#9!}N6~$$ zr+;VL@BFEC#a`>rdt7<=J7hn>q4U7G0$1GUna>IG58fN`Gkj<q^tp(>zo@r=XRrIs z_i6Kag?##AgZ5*C&a<C5NF40^SL5XEko7dWj=24{yFC2HuAV&NoxSrD9~bwX@pkBb zcXsrkZ+|cJ_xks^dG7o>*4qmZ9taP7U4fi~oP(T$ya(Zd@IZJVJP;lT4}=H81L1-2 zKzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2f_p4f$%_hAUqHr_?zH?DIM=A`zYJ!I&A0t zQub)(>G5}Yj@zame)L}0ApQ=!Jp4xYnH!xN`Q(B4jl>^C`Y_+a=cj(Jcj;bBzl$z* zmQI%6>pe<8%kTD%($}uv<^9v~_TC+($3>@$j`#V?Ek6GH4QJtN;nV+j^LKcXCp@d~ zQz7F$m429cJV`H%9(mNfd7cCPa;?W%I%jmj{NC}b^<;h7pQHAFfQ^3BIzeo3N>|v~ z<afBMBfjQa^Y(LK&x#uzKP%73dT}1H$-_22nooV#7k`JYpUrc3{zL0Xp8d8*)pf{z zeKvOEUG*QE^&t+P%C|i$jvr)SjJvq=JDWb>)I5)}!9o1udp^-6q3;zg-4A)_ozU^1 zOTrdfzk^Q4xO6<fkS=HGE71QmdK&Z;cRC5_GKiyd1&8#u-`aju|NH2Cc&@9+y6kXn z)}J{0h7IC>FHX+ERejec-~F(eA9jaV^SXNb(Yx)C_Yfq%v+;x7drcg4-p-!V|DhYi zZ`=MZ-sO?M!(Babkbc<4;pdd?{BAw*g9Bbg2T5OS(EhU5ye{UE-yzS@#qD4Dx?fn& z4rk?eh>o>G?!O&cSBw2wxEueMiVyC4J_pDq?)7GWT0iGZ`@8m?_|@~tIo+Un()PG` zA3U13?yZaW9{C-v@w?9@pEOQ4{#F0@<aw;;<~~+`;>-^lwBI&)#$BG{w&`boYwNkl z1Kkh5ai|Y=ht#il{yulS{g-vfI(%J$oP(T$oP)dv;eqf#cpy9w9taPF2f_p4f$%_h zAUqHr2oHn@!UN%f@IZJVJP;lT4}=H81L1-2KzJZL5FQ8*ga^U{zcLTZ(hr`}W#ZrA zQFTV@@Y}`@j;0Us9d`Bj!H@PiOJ_wtkiOVEq|ZdRRfwN@Y_RjwhdgW$KZt*a&Od6N zM*5Hs9y(t~>3vUr&li0wzlU4Dn>*@vbVuoB!K3Ww!m|*a?JIiQFUQ;cg1#3$@Aw}# z|8wD4IR1R|AB9ha_`%o8pTZ~lm45gr9EH#5jKAE*c_};!(F?!S^PpcoqzfLkPNUXs zHoD+b?-TnoIB(MRjz%|#zVp3t>f8srL*{wZd~HvjLr6aHv*I0g?-TwVy6>a;uD9)e zv!3VBb5rLyc{?2HhutCjHgt~gU&XHfd;LeVK2y(!eU=|&y|Lem^f~k%;@_diJ@j0* z2hZ2M$7`R^^9rq3>U2droez2+>$q%NpSE;r=sASw9Ihhz1!G%Z`iP}>*w{NA?8Exn z-`(y7bi5#aY~u%sgZM%FZFhP2!CAWI4xPt(l8+5e=~5oG*-z@QAH{i5??oQyaXP>A zu)BQx9r}H7zg->mkK!y{U5C8qjxYa4$G7qrhx`WNo2fW{&~a?y9g+u<H>Fp^53YR8 z3qLq24t9RxAnS__-ub12Bn}SNd6P#z=sNrzGQSR~BR)6lMx6CF&WrkA^0?PP-+$fx zh@X7yZ-tC=6-TGjm5!HwZ9eC{=|>&wX&l}UoqOWo+F#}QoUHSrbG-6&t_OMgd;wp= zqmSb5{vi$yeZH`N+00Y-B=zKh_(A(S+kV#*2X}Guz|YFx_37f?&o!^jy-%L8?Z>`0 z`{q8_L;H*0_-G#aApNjAyqdS_f91c&j2<(;Upv13mvi{G3|WV~4|yNL2jPM6KzJZL z5FQ8*ga^U{;eqf#cpy9w9taPF2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;lT4}=H) zc6eY~hgmj$@Q_}q^OHyXZ2A!=|D!l+9B|i<ydApFE}uAc*yy&f9mfxnKhbYp)T22c z+x-spC9m@nH<AxJe%3fVFUarI^1HR;562s=tl#x5z3*AS*E>qTJHFiVhJI%k`?car zS6g`#y)Am&!spWSz7(E?Pe0zqc`iH(M}yACrthr2&xPoPL3G2<HLp>KKKZGh<E5VO zto1<WY+dkKzlVJO@%9{tbiqgItk3^)i_dz0)_&=H3~cELr}cu0FMXl>)H!Z_DC1tm zgLxL7!r8>}`~AZP>33+o@H-E?L-%1G?niwWCw~_|>iLJ(0sjuYKeoI5v>zLsbv{7m z$9%AfcSxR*KE|o@acW(<IQs!o2jcJW(0xUn{cU|S&r$xP5F2FOhTcbP-b--seoGg0 z=SK(BpmjTU_C}BM+4`KNW01}RzY#q{=U?&fZhVRjE}d(|v3EG=C!~(}dv&|i8{2-G zhwE(5CV%<Sw~&WUW`o`b+t%THwms4D==?CwF77<+N0D*-e%#s2Q#v>DK>8Vp8z=of zh}P>ZTY69YJDg1&e)NRz#jej3|B=_>&^&i}<bz&+`>{diclKaEea_3j;@CU~bq((7 z);z1<osC{p@m<~|pZ#g{s$0D)b<Mp<J;*)T;mT8A@>g8r5eM76-M!7Y8(inw{jjyJ zclqA8#$N9u=cz&V+t{6F`#Faod^ddF;mvpAd+#OJ?d&yg-<v!S_pER<Hh$3K<L}V< z*yLk(=serh*>9UXkahZ{ka0oA#WoJ@$D?ub-KVoV|J~=aniu&UQfD0X`3`^n9U=dY zFuwj5UGCd5WF7K8<b4Pqga^U{;eqf#cpy9w9taPF2f_p4f$%_hAUqHr2oHn@!UN%f z@IZJVJP;lT4}=H81L1-2KzJZL5FQ8*bUZN8t2Ib`NDqh~JgVME9CZA*YM<z&8a>uT zPo?;fO&^{U8|?BsKXvpY5C5!rb@ndbb-R9DzQ-XC|G_$OuK1nb`hD7oKJ{OYH~K=y z`h>pq%gv7t_EkDw^s?YY*Nc9(^tR}5(eb|gc<T#}pKkW6{8KjhSF!6y-=q4UHBWGs zeF)cc);heDF8Hi<dS%`8d%^Qhx92-+o%y|BbipV4QM%yud(7-#A?M`az2N;R-02I^ z8G_`4!+q4BILJJ(XXT$l^6V!cygRq`+|+TNvB?KJKXuL{A0$pbh@U)gvR<r{=Ic0h zM)Hp8V;md5_m6zgacq!05dT%A?$A8(gHv&A@T@pCh~N8w%|3N_HLt73Pao#P{J^8; zKlGf~AnQ7;yOu6^mhK3hk#Xscqyt*|A9O+1`=INQehfX&on8kWix54<XXCu6!$1c? z{<6Qj@$J$((69XHA&l1Du6p|Y?$&qJm3>!79`TFg(g$4QsGc}Tp681nByQZsr9WZ4 zclhYJn2pY>^LPEp2fIA`clpFY>TTl(iC;z6p_2pMXZfZ3<bCeqQ~B7dZo?DKvwhdE z;iFmOEd61_SH!z~;vjk8;CVD2apPUS>d9~O;8(3P`Np+gsvC{XIk<~!o{Tej?grQR z)N9^%aq@&~{k@OaLgx?ev%+P&PI>D-yn1hL@_gT}c`z^6Yd+Mkc`1J9Z=TQNc6BRH zeWvWS-kgIb?mW&9$hiW2K9-+xI8X4rZTz3~Ib(M}5r=Qb=AI)?U5D?@>*_kc$A2`B z=kEH@ugjxu<?%U7*u`5v`_F#(T)4mDo-a1Yyp4`ygXG)B|0oWg&(9<O)x5jUbxq&9 zJU(AW4?5od%Q|EozOF#dLC!(WLEeM#KzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2f_p4 zf$%_hAUqHr2oHn@!UN%f@IZJVJP;lT4}=H81Ap^8aH9JvM8^xx@_!Z{)z3(O`+q5W z@chmEJP+r8Yx_i>RrA9JuZ~atlwJ*ghvZ+4li#7|d$9hE-glJVm*1y7{_S|<XMV@_ z`OD2l?|bljxPQL+UkYD^XW1Zebha-)R(;`XA-Z4i`01868zhhV4(S8B&h}aJ0bexV z$-L`1C(n=0xp0;)_*J@K|6cGYeefw=@KL`Te6UZ_1<%rNn^)L(&eg#==X^?Mi2krc z*AMlxP5xxO4W1P@a-Mk}5WkT)NSwadM&h93ww;IFA@z>WdhVlne#eLMsRN03=sfnD zd~BoR*pK3&`OmVA<k^2#KI>_8{DA*1-alQw$H8X24kz;!9%X}GZ|uQ)YF*LBwjKx_ z5c(bCR=*>?*+h?l&SIn6K_Bs6L`Tupuefv))-`nY_^$4mLhSLon}6Ak%SL|-x(@#i zKda7tY|rMo@mptN+j;DRkvja{KK|1F$@vvN>Sx~6?QrQcn{lb%^`#H_M&clGY;f{^ zqua#hy%xI8_2~RS^9#0d@e=dcAo=d|s68|ewvoO&|8_lCU&ht?Qg0kh9)8eu@3p&r ze*Vs8y}-3!JAG-z*S&?lc7xn|AbMM{^Ao>{^Z~m%;#ZMA&L4X2d2xNn+hUzV_NPPk z5ggR{9LrB0=kU(vec*f-FTz*gkRSWAko)N>`d*{X^T7|cb&Woge2_k1=O^A_SGV)8 z=hJ+5<IuN5*E0@&><*oW4GzthKEy%i;osq|t{cyN>9a%Xy1cv3XZpNH{81cy?#;hv zjJN-?4q1n<E0A-LbC7e8_aHnF9taPF2f_p4f$%_hAUqHr2oHn@!UN%f@IZJVJP;lT z4}=H81L1-2KzJZL5FQ8*ga^U{;eqhLUk?wIt`hy-QTB<R6#bF%h)?C&zl)Q9H2Nm$ z!7lH&;vda(cz)!8#Idg;x-If;@BGA#?t^Wdr2_+Zaq>XtGmpu+;@p*P^!&%;jbCT! zO3|Cn(x38swX^i9{J!syp7;3i)(2heYuO-vBRX4jxX(Y;d<t#9l>cmSmY+QEx%`Lf z@b8d1a8w`ac+OMn@LcvNL>J8Z@q589r3*e;=P$Q)7=`@a@>A{0C|&kZzZZP|Q|0q} z&40Mrv-bI@-wj3|3@;s=3!S?|`ouw;-ydz_T^;^OAEDzX{cC=lV<Yp&kKG}8k0SkC zcXgiB@%+>oiGyAIsP)<5P#!i&JvP|+(V>FmKZ^7Rr_MuXpUT5#e|~LbpF3Rh)xI3E zN7>+7Z{EKLb-?I{I^7U@Aap+Hd5qTSEd7pjI!h-eJtKOD&&H*DKo9hN@!>_Z-T^%W ze(bA=p7+uGt99gcczN9KYMlz_20L9z=VxDb_}S;d{U+z4Igeeu^Sgg%yB?eO1H^A6 z4myrayu+(`)KBzx*75P4HwZuM5MCh<+qmN+^2q}`zvJW?2hV*GyL|jtk##pxj~{z< z`_TBQH+Fq?dCX&KojSksu(_9}bilUByNVN??B@TEfzI~5_~<y~cetAeb%W;<ZsUz! znDyp80b76V`^v)>u6?#&=ah4}!^LOfb^Axd_mBFyzo^5$io3c|pHtkg^E>aVy_*Mp z$OG{khvseD`JL@LY>>KcKKMJNeuvcW@;)nmb-Z!$bL@NbcAxupaXxR7hrKZWjxpZ; z%Q|EozOF#dLC!(WLEeM#KzJZL5FQ8*ga^U{;eqf#cpy9w9taPF2f_p4f$%_hAUqHr z2oHn@!UN%f@IZJVJP;lT4}=H81HU*ApqsP47rVm~ot=>UE<TlSn>zd*9@PgV5Bt}` zQS$<s2R4Y`Nc_Es9&3m0zso019ky{w&-PK9{)hJasNaP>(fyWAbpGpc<5B5-pG$|z z@71DHMZfw~de#@=SvI;@Bf43T_{&eXd7MK0ukt(3Hu>O7)z3oP_@65d;y=m{5`QWG zP#y6@b*$G>>-1E3mY({lko7)G7d+4hf2no)k3#goVCjNK?JK|Ie6ruA_a3DWMi+dR zE_~|TaGp4q2j><2A$r7(ev!HzGR|53K+ZEZ$omD72jU0ugZSTz-8|fnJn�^_;}P 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ð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 L3`H!Lvo0N{{NwIibFga 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 Q|}@%xrIKZAF1KX}V?!9DU3`Wf{5 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±fY?(kUO$*eGZe8=iGKA^)K2f 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%0DE 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∈@U?eI0q$@-yF?Cf~pE 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 lxUSbrx!bSkzxUz&os?g&Fb*}?9G{?i>)DR& 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 gtq1WC$S7g?MY+SZK(m1^O%{aQ_ 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‘tX+M@ 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≻@V*z<IZmT2J@9~v%I_P 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 zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYpkOOi+4#)vHAP3}t9FPNYKn}<OIUon* zfE<tmazGBq0XZNC<bWKI19CtP$N@PZ2jqYp`2X9fV*&s`5CC92)*%!bh=P4NjNw9T z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< z10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b z4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw% zJm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5 z@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVK zzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_ z0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=> z9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kj zc)$Z5@PG$A-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A z-~kVKzyluefCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzylue zfCoI_0S|b<10L{z2Rz^b4|u=>9`Jw%Jm3Kjc)$Z5@PG$A-~kVKzyluefCoI_0S|b< a10L{z2Rz^b4|u=>9{BHpd!GE5p2`LOw6+8Q diff --git a/allensdk/test/brain_observatory/behavior/resources/stimulus_template/expected/im065_warped.pkl b/allensdk/test/brain_observatory/behavior/resources/stimulus_template/expected/im065_warped.pkl deleted file mode 100644 index b899ede1330bd6e3247969c58ed05cc0d2246d96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304165 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℞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∨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˃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]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�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�$p0<dNYt+UI*wt>ZdM{%Ht<MJa&GQc@+pAj#O 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%0DWQjO9Swk0G{wS&d{X=zj2}r zj{#gQ0r?K%hx3c56Sx8Rk|=al*eGfg6N=hpZ%&CBlwa2Ma#y9#X$NHy*`->Q^`lAu z4y;vEOGS*nubbLw1NK&Ii#OgD$!RcDGqWks69Tt}U&~fXS})-)O_erZ@g!N^vSemD zVXnF0jc+*L*56!f_*_ZVY~L=vH(pw=(k_y+rY5yet0z+*!-vW=tMiaPt4luej8w<w zLi{Egwwgr9PtpJkf*XHvz`7<T;o@%qJV7j_nKXA|bnXQg7F)hMeks-|*<r6*uZ_JE z_`+QiVYh5@2Ew*Et8mM7YT#{DvZ_z1Y_Tgv5oXc4Hs)_t57;~5FFG)~uT8&A=PfVj zwqU5|02if~1a@m0{zd~Xsy6(p_uAZ>iTK3;-SNx3wFR3)zKC8Edwl9M|M11Hf9Hqy z5&7z8KmR$y{yzA-|6<VJM<1W?*XYL!js0Bxe#75{zM{!=%S)SaDFRH6Er`C$KngVL zl4Ps>cV7j{jKvqP=!D%c?4<aKRhnJkE&wb19zX#;Ab!z|;Wqfy*erjeYVO&Kx7H34 zy060#a#@3aFy;gNg+=r~vd1oI8CK}<7yJgm+&rq~@@2-LQi1hA#w{kM2EBb%bcy1; zYscnwXvc{s4QCA{V$1dx;!fuaz@U%dSLbUxEsI~2Un685IDG0);`j6k&Cf>-g2mUw z9(47MnwK3cnNX1npM9Q2UChsZO5k>eS%5HJo7dYHYPojv#l$uNytF;r{2Ub=Y%i3* zgr)?*43qfeb4yom<Ym8%3v@*up|>-m96tQppMCA#+pdMb2$_7tQlp%wi;$HKnKJO# zu1Hoxw(@6v>w>ULE$7xc)!=Bq`e22|Z4YIo)iw3FD-0#2lrs~VBz0MGMUz#LSz)nz zHgVMf+?3z&HwtgOudqL>2(xyYzomlM;*347X(!Hd;y#fLv2Y^^0R{ZM{4I_Fe9d(? z+5^}a&>#7mcug?yV47t3s>Sb-{=av&5e?K?Nq%(8TM|pLfd$KjV>St31p}$Th#ZLd znXm7`4GZBA1{b<Hozlvb_Fshy@NN8sw5EtDMOPFDx5o+>8I(&Df9F*LFb>uUz=1je zf8S{U4%#FT^cV56jV>mD!_$%0JK}F;qxZt;K5qan6}Wzirv8rj%MYRgT>Nccdjo)* zLA1(Rn9_=!g?31-fX$q-eQMPda$8BA>@eBtVV>J<b&UzlEW87ar0ytn0GAHT6G`5D z+_hONUae5~!q(=2E)y5W`C6_Taq)%c%%UUkMZ6|1GPA>0Dwb6=ptT~KX^UAmHF1Zc zYh~D#hp~p6e9qxPb7r43YinBxf}D|;#1X-7TP{i9cR2j5IFw}(Mjx$#faNGflJeP7 zO0l-(DzRm`0mFPcCT|I@qFwOq=)D%r_uXo|!LI0i=R4aai@)*0dhadN!~!riiR9;Q z)jDfKrH<d2pNqfZ7XU-vB=MWhN1eHC=wE6+4Z%@+s}VTxZQ3vTFQ4j}%Gjn0173$x z2!0E<s=6$*AaC!X!x6aE?Rld95`P2y{`<FoaNqqu{&D#GiwAz=s0$A>!0i*X{ywGs znb=LwFRY;#=--pz&lMa|Q!UCQgYj&pNs<=dy?ZezGnc-v2ER1^ny04_O`f*u8ge7_ z4S^hqPsJA-?mkCaAf?}L;%?9>cqfie_*$WAa#C>aiP8m_bG)qjOYBQRPH)3<EVbk> z;KfkB3?E|ruZ$fDe{n9x3e0$Y+JX}%)36=uXwHSd^f00;?+&7IZO_Bdjf#(o^er;X z2c~X%8PVAoEm+l82Ji3-Lj1zs{b=n64xNI&@b}~~bYINRhZ!@GC?c=!+`0}8do}%) z2uc0I!snN*TF2MIF0Jn`@8aF;g6SJEGcQflOYR#b9mg+PpZQAIL`SEU#<3;@$1|8A z7C!s*<BvW53<Dt10coefqthiB9r^hMPyF%0AOG7ux4v6VXW(zinKxfn70>$C{>-I5 zrfyoVtCBY<1#uNt&HV~VhBp@fi@&bN$y!ln?QG{(ene13K!t`)5M|c*tJvxPM~E!> zGyqu0#`p{;f?>&9Y0Tf!xN<r~pgvg9eiesN^v2gGAN^PS;DFWms|OYy&?>;zHa}pk z9@LV1_}FFmU-)bLugyu}FP>F}-Poc_@dd)BGCnu{qWu<rs|m^;NO#PiZ{MJ-2!CO) zy7Qbe*CC}4T*#+6>IU#N$W=z&gn2Ijc8$`kQ<x)5-OeX}Q-E6oFabCWKsm+V?to<k ztaEJvmcW0GzfJXJr%J`&a)ajQ$fr;PurJs5ogbB70$N!h!e4}Z=Rom+lGla1#V$;w zR5{O#$yrlvpKPi^+Lrsb;;?xDFvT>bHP^|c>P5=_K%jw1?XE{Q=#*<8NZr>`MoKYn zMc8E@emYsG+nOrheMOdZQY0qo?6+SsYu3fQAl{ZVY*5V26g7QWRx^_GahkEN@zu3a zUU359V3G&tj8l`kRCaJuJLmMgFs{X$Y8T7TlK0!9P_{4}nxMM@x{7G<Ta%DhA{Tk3 zvrCP+<ZssGY>O{e8sU2_37tCdg}K4*RY_OM{OWm({(HS0k#24+z-4BtuiX$hb)oaO z&&&KgZyph9<`2!k066rG^||Z7Wr4=?8UEq{0(|WOY$9J7&Cj1;z@odI0o-hr$TgCY zs}vvw+6ix6c5S}zqx=fuPk#FEzxdT}e)oqz0>J<K=l}VOU;Ogd27bo;41kHa#K^cH znC>qxBmy##B8a_#0!-ttkRb4~-H*WUj$Ht9cgFFBzap1l&J1J3N|8)&B7tRJqftL# z9fyT4O{JP~?X^RW#6eB{CDIkHR_K~_DtwlV|18Ww7s?~fP#_Z5Wcf=dNBE1`nO;0E z5H-YZy|!E1X*s&P{9TO;vZFP@-%Xp)J$atB8#Zr$CE=LuMdiQ_2GXQ`7x0p{+gWPY zPPAVme4!I>HNqF)7r2Y*Eq370LG<4S;3J0)AI6A&V6USmg7gjA>NCg@5hkBsyn+zW zFX73}Cy8y~>C3!f-6}$x<U`@b@OQ%|jo@+jT4e`ihDv<usRfKlynrB-Pc2-!7IXNH z9XvE1TB|X+hrhqR?@M>jxmuZYR{m1E!{4go_2rxDIj+&EX-cpWf0Jjq1Y9;C+K^}* z*ekB8)x`zi2&U3Tr-V{1FjY@QE=`H7h@^qP=w}yPpnM0vOgnia@+bOlvv^A0O1fXE zdx_zU_Ap4lWJ>H^cp;6(HUPiv3PMm`bNx-X+<M#l=YQZs_Oz!0eS&Vle5ztzV(3r& zuXKQJU1|le24<KEWdX1gTA>2p7@pZw255Ff7+CuuuVaAQ{Hp?7<AFnS*z2DMa1K-0 zD|*W|7jYGV)%dG`D>s+OG4+Zxff<1#a;7Q31$ah_0Ms|>MT!S>>A&)~h9JcMYNFPj zq4thebnf<fBQVXtD8ZwjqHO!%rhe7XDFF6+k5Wd_v#7MBs2_><0l*f#8EIPM1ql?x z8M~Zqae608YEywHOz~ER;ycDuxGS3m088GMCIGgW3*stceO{XGQ0`_2z$tir;x@hk zXU*mv%{u3t*>9V5-i5p(q0ejass+h<Rp#4En<8SXdecZAG1k}X)3v(YPgbXQsV*`( zc~;bJnT~~mzfWGW>TmiWwJ;pvFAcJ^0OuRATW9=8Bu?thtdzJSH@t1r+F9`4ID&7X z7tL3VSKeNAWlMEU0F2vp+MKU{&rM#+x|f=knn{Jb-AZ+qB!1y;Cd^0bFVQ!Wx(<vJ zG#}mKmywQI3Ux6(kN6wdwuavkew+Fm6<C$G6yK)r)`vZ-`r54j^xyrDul&cizxRV5 z-FF}ESHJw_FUtJ<N4owx;yfeMGdO{xFD$nA4sn`r%mpXdM-v^9!F$pXR_zyXLd}3z zd?udcZdZ2T+RwK;LYvc5nm`-6FPYH{O;=(03%{cx(^!n<cSk5_$0oH#NQi4Rnl!zD zQB&!Ki)ZpCKLm6PTZ!k@B9OZz0|VjujQ^Egj~FyU&!!iduigkp)neDL-%P8q?bvF+ zemlI3zN`6}GXi~@XW=f!Zt+X}4;s2T&QXqyu=yGtn-A(PcJKhRV_Kh0r_g-?@IeM` z;@S4@-bs|^xQo-52p=qZ^<pmH`I@gP-y?WY;o`N1p&g8HvIPFptqbq3^ys3))2gLB z&vVZ_#g`Cn=+8d=<l|31yJXEKOyU~H4HU9MXR~L~fA9O3kKgjHE5IcchDwzB$DCSi zZDZ1Ex3i&^BMB$TdRBF<@pq7QgFqWHZ!-p#*C_c~{Jq$5#Ys|jgjuOum_+)xMJY6q zSxO|*guf2)3w`Bp=&QvuIoFl<Radw;kEfKtXkA=dNhya1*~rPgTwSDcmtcS<wq}LE zB8UZDkUsoTy7}omp_NGM5*6;FcRBpv5CK}eCRy#H`-Z>rIIA^0o5~E<tj|>aN)5n6 zo78O}+BRT&D<vtjlw5Nny+ChNU^RvaH-s3eL|nKW3B(B$LB09cO9^1kEPrnfe~o}e z!@<Y^ef}^4Fkl_w_H5Zg?=*mcH;zO3E&8v4{!41Vs=o!l1W-wvriBD^i{*^01ycZv zh?WrWRqST4^o;fHHY$N<>|QHsr|}tc`kZZyrQDBoBc<3((q*N#H~#8))%5uktrWGC zHrKOMMXJq;t*yXWtXsLu+sVY;E$S573(tSkxfh>z!NoC4StEyf*`ZrE<V(x@;)R(p zwRN>n(=aqgxKj>ko3pbYLDc)o`xA`l%VMn=4j-SmUYuXxSim$ukNE3ANJgf*DX`5~ zqvg0Mx-M72g~lnyp>Aot2G&sXjow=(XF98sAn#RIU70}-`-C-Y5Wr~yPROk}?E|#6 z`UJpd;cpp+<|oaA!?yqGf%U-;*zHK)XVl=<0zAQQ4gISHTHV+5H|Yk<B8qR?s&L05 z-xOh>tJ+&Fz@_!Zm=+9obyrg~3UJcBgqgqRQ=j|7zkU5%-+{kBy6-1H`^B$*`Kw?5 z*5+UM3xLJ%Qw_gM@Dc_f3`OARzc35+mp~S)SJNNI{-`LuA+3x==T*C7M%UOPDQ&qp zK6m;OcoB`3-bZM?@^>HoXK646zZrQDyR6AW7;fPey8n_&<%GXlunFL?V_Q^FiAXyr zH?(f811sQqCCP9m#%_xOEPe@5!OdfSwp-7tHR$W<OoaWpx&m+9yp5aT>aS_hE&v<e z!&}x}4D0ibZMaHdd*(nABQEe|fxR4E7u)l}gGWwu{+>K)g1`Gw>lwjm*A~2(No)0H z##3tP%JrzvukOV(fH~gB;F6ox(S|F3m(oLuQ7sbUW21y!&k%$17tbp~p*-tAM^8Sp zXyy7X+Zg|e12Iq=Z6x;RpZqKOFNWgk089m<8m2zI`BLLOV}(uybTaT)LD;KubQ0h_ zk!llBhw?jF-Ewbz3!O?yxdyrw@)rJHs!$S%C7L3iq+=y<*+dpAltmFzkxYMvzXBLt z7?BT{o7Ybla-1R;<GR9MAqjvR<a32g5QQZUS)#|s<!^cWI~aq|F&OlKW)LJ=fMYwd z%|`yl{TcoDgCCrqZ|Z2P@>TWMDWBi<2|n<*2t37Kb>Egs16CZ^FjcKpfiNee1z5dz z&>%E2qd~;uYLH+`vKaIt-=YGP**gGkS5e94>@-zNZX!@l8h}xN`DttbrukQ+vb_CE z{GIq;aX{05&6Nh+zlQit{0-%AKD0zr_$z>`kQ6w`r(`;t0pOwFg_agFcNj3*8QN?! zXB0<wuTwauxDH3wsj{6-Ayd%r=_eer7+1we1%bjXH2{|t+G0)e`C1x^bCtDxM~1sD zr;w&}yQ*cFH3j(Gb7ozD|8rH$HuXMyV<fXAv%Iu=Z+`VA=X9Kg-TTqQ#vHB$fbpJd zIKK;Zkv`AWh67uMmqzj}Lf~klWenB@OB@md3jm|tT0TuGy|n;oMKgbDyG#j~m7rEP zKwj9(0M+SXRE@o&x5#^?F=NDiOQ_u-I2!OZ*Xn|0FQi*+fT<ekS8oBh6F7FDs%%W> zsQ}Mc1&;r-1V#-8yv1K?|B#yYtG)|tNBDJ#1bb_M!88HK3N3ttUkIEeWLXi^Hr@ur zEzb-`Pxk!GKmF_1{?~WD`@J9h@JIJE@Zhh0mDpDT_+bD{_zluCj2*8ENf<>KjJdXg zLZNTk;EJvWezB)YTKUQ!Su|AFHTX)?>hvpCUwh5g;8$MRy&HxBU0YC5BjGQdfK`7r zSi2wAYBgQMZ|Jk+I^s^i-&c&u5hJodqzT%tytq=WARLt87)?v60hn7S{<5PUL0`Wf z^nX@m-m<~|%MNjXrxiflfAH|Z-4p)qAoP}>2|IV-XRR6zf7OhQvB?O6+MYS$$dMx` zza##hK1l>hVqoQYAoJc`FX3Nho9-sPnK3di*Vz3U&RGoVWEjqEoOjDc`UlHjhgKrK zG<UUr^?HU_uy+z&nV)0yL4J=Xo*@kMlQjeqdN_AOtM@8YXND+z{Gng}H0{4CItmt3 zsv1>J>z^7(sldVSKww1>wa=ZY*&aE_!ET18+EEpTB`cz-IB(6(x4Y6xBedFQrEpj& z)K_Hgiq2rOgHQ^88P-=P=&t_?UAz7kfX@$q&u7OB*x=Dgoxe!L;8y@oi$z7AmumZ8 zf+z0V-f`8tng=wEvwQ)6l$vGRO$<v!eWmsHL+O812I$*WDn)JQFZ0T>CR(rB?5z%u zR-z!(Rszf;Rpmzlu;{t~I1-}-$Q&F>s%baqjRfoRti+nKtphkJvYIl1KB7cd1gyGH z_*)8aMqs!`2dpdjEXxptyoFh_ssnHVSO~vflF{Kb6XzYka+n{5U!?&!9?-nx_EWbX z!Xj~Y0H<&c<&>pC#0QfuwlYRGIq6EaFS%Q-A5SN{x^`-hEaV(k4l*?fe<;IAllqZ6 z?~?*BOMcmrC|fCL=1G?7`tYdIRYkhznO6y~6~VI~E4m>Nfa3y&ALO!WC@=0eNan^m zeftgOqoq}Do?@KZ15DV;Mys_`XJgK$wzqS72@mS?9O7Xuv78s*UNZm&gxZ3yPM;w7 z3xMMjb@NSlCKrGUzc;hSP#Pw5U8hhtZqAUm{G8w2T&+}l%i{cwE4rr%VyBXJZ@8aE zV11x-IWRw`Dqy~UJASECR=oILS@Wz7oxk&f-%@~k*I)JDscuKj_-yy1;I^o1JOFiI z8i8%;we9zAV+P3Gg0H+qr7izWrX9Z%{x&rjyEOdO&E(#H_?LhG=C{B5o$rC)pZtv2 z&ksDvz`wuyJswzSz$jc#KV8OW!XnZ_naGn67>6ZQI;_yfKo-AcG1jP@M6X>NNKGu) zTrDyP-A%Wg%BA_2CR7?x;g!w6H2ebK;%{iq1czswjR<w6+Dp?fsxxiBcs!@&7f4}; zO*^Q;C07{70_7L}X5a-r9q=i}?5y#ekpow(T*EMlsIV{5c~%u3(&68{ivW@g8rbw- z+kW!^UJfs1DY-*W<*jPJ+qT=*&G<~*ww_kt_t4?vP5-4A@CgD@+5u_*zJo^&F$m$7 z^)xVJrH8+E=OwJ<M)<3#T?HSQ+uXd)C>o2GtUyCwPFOKpvp4vafC9W?DFHYDu-1sD zpL+7~$Dew3$*T3n`+RBJ=JhmSFJH0{{rC?L{Pe4zdfzoy6c!tSdj+&|6>;;0Z;h9k z)Vr#fRyy~+{PGB=R@a7^wLt#P(1BA!sm3{(BIMF&ziOY#q=^mKg+i_wQ=4^}q=aht zb?{#ata(%R_7v?mO^)HOvc9LfQY7J+zqwXjFz0vTLHyYRi4f56moXUTsy=>zI;abD z!!PZ>xL|yk&*M=8Fa);3=bJm3mM<a$!f2!57mM(1$b-lMflIw_N%q<pEPrXOB9+k^ zZ{<1fyH&Me2!J&u%Gltx4&XVJ=AwVAa|iie#x#Ha9XTzh)Bw#03^o8`fJOwD0vrb{ z5gMkRoxM#h7P_S(*S-UQr7vj&;Ap`0traZEswoq+g-sZkEILe6Op7N$W0klnyhYEH zN4BwLv`6-v!s}30UpF&3$8c3M0Z-kO5DEheywEnx4R`xO9<4oJV4Pw{DN9O;Bqwuw z>2%(UUb6PrV(aYL7hQD0|8xHAOZ{0!{7tnS@i6yRl{FTsdR@N2QR)xyI&<E2JFS_~ z?~v83>E|Dvva<D4O+Iy^0NXrUQLwZJhrrOawBSV1;5$);_dV|cwl~}$azQjp!EQXQ zMn>ndId_XQ1yxDYMUB6jU;i4u(Tz1hm&scNnDSqJ@u>o-OPN~jlKj*)(`uk~gVv;` z05|um;8z!{rvFC!g}pRK1-MP=H7|YTulUsnefK@psi;W&2^NFjwEOn#&;~4VdkT>; zMBn@0Z2bN1cfb3C;Fpn)9{BYG4Zsf(|4RNoy<nl%+zjHgY!&@w#jhS%x?pWc2;`lw zR4cD^tR`N~&w(%eZMk&dWgU7l5v^2?K`q^P&?2$o!mtDT_7SmBujxeJKw*Zn=+8Pl z16@tEWK3wqxL$4D#8~!>w}c&f^Cp{qV_jbHqU^N=n0~W3KnK6*#ir$GmxS*^-{m-u z-vkp0CixQGk@p`ua_q=~S2YIXdKHH+zZ@JI!qJxq?ZsuHH@lIW#9$70;qMWmJs+C1 z|DHZ|>eTUL$6337-=QOi_u*5$-sbZ4IBMgby=2jg+`)E3W25Y&&g))A59f`l#`IAp z6vwhvd=zZJ2inLcG*GWz&ZD6CK9Ph2^pnpnUa@8q{EgvV{g)Aw;O|eq`YHXNn-ZJq z(*<3sS66vmNWNPJ`TBKlCW^%A@7=LD8!AOx$q{djKvim8iUTKq`aU6dqkk%rls>UY zIvb_N<Guy~)%hFk7ybg^fxTqGv0OHxJv0I5`MC%>h&E_dkx2bq-m7Ob*ATpsfl5XG z5(4Y(^Z>>HO$aRbivq02qdw62w$=QM`xX41-z>U7?snXoin$%XMcgRBu}KGoMZ_|M zNn0wuAKvphQ{yi(0sba+{?5Uli@uSuKx<@1*)2O>wBBadgTJ-MoTQk)y&4$Lh^V;| z{hVATw3Y_w#$WBR*g-C}2hzab0JumiXUAz+4uIX*0Njkwg<tvW?^3^=Z#ch4ehW(h z01jJJuoV2`WXVY(m8)bXcx@|KLqT&}Hq~TY9w$^7ul@7+b~=iBuFX8`={Ht&W8g2; zC56J7GYNYsXgu3wA!V(~8wG60^wM1=(6VQuq*H`1x^UL{7tB8Y+>72!v%rAgRMbA{ zH`O31H}j_2ou}$m-aUPkyisRKoTq1b%1M@Eh8?_Ce+4s6@2NQ<yS`=ePUY{!2TK(= z1iqf67K~vy97fZ<Ar|HeBk5++;Nu*dGn((a1~=y`8KeuvcPwJ67*GiO{IBa4e_PlO z4bZ&_m>S@hEML<3?6qb!9a#R(YYCHc_}jYxQ@u%d+386BGU={Y5V$G4P5reMIP1vt zM&G9WYJ$dSmge8C{tnH&>bgnyPWYQ;Hhk_2U;g^HzWcrJCG<1eFM}`q>Q|0_gaT{? z4*2`bg6Ce)G75iDB8^rN`!n<<_7#z#Fb&(Ymxf+&wF@$Zu&n`CfN3n|FAcsrWySgo zoWU>3uJ&iFxF9U?8ZlvmUo~LBt)9ya{HpZQ+ZQ(|9HCW$x2wPE!%SZu1|Xyrl<xt? zB4A`h?YMEes^;ItOIL8uH2n(TmCVpSD{?b^rtIN^7ENcOJqM2*KYsMUE8#D}HMr^A zxyJO@UgjaeZ?tCgZbDph-&o8K6@S%#4<2p)&wo07`t+&e$B%*EJlKKPw&UkToK7qS zWY(#J6Fwv3O7Ojb$JbVTnYVA-yaxW#ZJFk425F%E7XoWtV7_+MvKJWr$d+H=``Dw8 z!QU5G5dbrWcLIAXS@is~Pe1mDU;p^uJ~{W@?@(fmK9Q|xRmXZQE^W0`;96I8jM~P5 zk#c4yRc?~&AEj+g4oFSroUm6prC3t(B7;g0IWvdg$wUd1G`%$Dug2&2U%}rnSQ(#H z<?RzOKb!<Ld&FOben6}ctb1Tjxlj;x&W+#!oiUKA0r)n$ATbI<x*Ygr3xla^x<B6u ze_^Iy(W&3zZ`q&=!2s9)=%Lz?8w%A&5d}#i*Xl2S&1!rGz5+N1uEWv*jK)fuQ^sX= z-PQ*fZK9d=SSg#c2m7THMlR~9I4{btZCn7Dd%~V=1F!)&hyYEwFaj1H&<3Eyq~8_b zH-)@49TC_S!^&C+ft`40H3|3&`Kcs<hYuX#lq9pts46=sY$+^4A{nK-DP^urQnXqj z?CYm?nUu!=f4N>c>JHkSwEJRaU9mJLasMgJ7VIJUl~*axNOoA^Y6@5ie&(Y|eVk;4 zWt~De`@A=ud(rI6=z3&j^hLFcXEwQ|epmIf!b9I$b}&O~FS7FeHG7(=v$Tc&%(+bM zlO6pXa)$AQLc?#DFCpLe+f_veV{jXY0ToysST*-OTA0bG=(-l<UL&C0!CZm2Y|c7c zb(^zBXVUPK)=!@sscTE%E8Y?QdOo`yYwW(oCg4;z3Vh*L_9j*R3w}!j*714Zul8qM zukPf-8~!%@MhgbQQFKFG`3rL!hARt#`A)Z?idl2U(sIT+5@a3lOE`g<;4K`p%V$3S zrLTSSJKz5S&d>M%RO>VCznY+9f2IZau_qaO;n{`o4E>kpUlhotI0!K)0V$?ud*-T; zLM!#%mmyP9YxZTGO6)6Gp54g-e*iBXU!}CYd7}WsUr2U{c*!K(pyV$OTp(Ncy<&SW z+|7tdJK}@|eqmvnKd}e{Vj@MV{w~AKndp-*m{2AQ!;JpNC&St`MA?ADcJ<w8v}*ZH zA73@ht-x^Kp<^db96Rue5jG5@>Boesyq^oNVk0KLR~mnbgoPuR-G1$5)cFgEkDSE! z*#v%1ojQ4xp3LrY_~4$Gw`io_v;nVc`fIITv79lGwlD$`!$Q%WnNCf#C)3c&K*5f` zK;jkSn7s*`I$gUqZln+J3I>w^z}lW4d+d=%pIoqL*(%3zun!d>y>Q)n7W*^&y(j#A z+gqbFR4ua3^?KMUob^0XF(1Bc4u7rPDfJ3!b3<Kty-fBlF`x;pWLA?{N~P!lT_P!X zTE0Zo3>qVzqC}O3Td*yqHzL0Aw`p3zX_sw^KV)J9Z}2}Q5ZmS0y(u7wK89duV-O|; zR=NP|18KecxPBFwpELXsAIuKFkW{AP!fxzd$y)8h-wxoc82DT8oj0!(U<q0Lh0gw$ zlO$cB=kP5rQ%!O>x~^7d@jEoDiC+Mmsh|JcL*x#p67#6pfjlR!9!T&P19Xc34S%r| zq=7y7E&X?(?1;XV1+{Hm6yS5*Un<LA9H1-l)0}r+K8!>RU?DXCH}iAIQqV2gpQ1Tt zMv77^eH6E0agrNW{pE7`dgZmP?~s|GiQB1K(lkNpNds`e>nEiE7Pq1Bbn&vNPp|O} zOefz=Qdale1#f!81(#7xf?xQX`dJvRn+rbcl}W+6Pc{uXGt+5O+b5qplP4YLnl#9l zQO?OLZdL(z%V}Aq;*30KFHcB@z*nX<wgzI5tMF9>%UfwnVu)a}0j`rN^u8-LXXz`; z1K-iF)_&{uU@m3j+plO1&(#EM94u;s{Iv=?u|}y0qx||;iE3db)bSZ#N+y{Xe)+)m zyL-@ngWnPZF+4{a$XuF##{`zUkoRsa(ZU!8172EuVQ{>zy4H)?dC+@@3<L(y_x|1g zr12NmtNZT5`RZps|3&bN2iEV@e$jvF@nYmFU`Cs&W6>K~*|?LqUO89+#$Vy6%{dLa zn3|z4#2UP=V6FaBbl1@e%{IVW7HQ1SdmWo$FTpDW*+H69HOb-&O<OVqPQx)r&;X0i zl_qGewbLPxi2Gz8AbF^-G7FfW32?DI!x&+APN-@CEP>VB_1Ff__-5G&N&Q#u(!&P> zFNbeu$cX)ikE666e3d>;oYvtDco_b4C8Pb>&OXIo%*8ty(Kx2(@b}2kLvZ%UG4$Wl zwgJoEKb<iCv-WAc%3giRK2k)KHc)j2`^5un>&{pA9^`4mUu@x9w{CDG!RWwCmf<4J zEfP>uJ(#f&S1o5W#j-#@4u2ni`UPy%8Ss$+SOm{nvS`5*kN)9-AAk81b1VJ^#Wf7I z1otX8k}VVdQV09?s&Z68=-v1`FnID^I;ka9NlJ2YY?^;n8jw)Ye??*$o+kiA`mivy ztUwZ{$|M0?{EhpSDzJY6u<Kn8q+@^{PJ{qd2QI}o60(a!b|FRPO-<B)Z2-RVU53CS z1~kUo`FA${e#|O`_m$C~^?pwHXRC5pX(O*LSXBGUuz?Mjda#+kPI4{hh8l9H(Q zW>kWs07p7-P7m(<4Tc+D1#g4z2*3s2(tsO(8-QbG)6Ctq_0|Jv(g2JBTK>+?ONFIC z6rh?$<egfmreC+ZSN1oL@;eRS{=@ha7Jx(GSf2$8|CQpM9G1%=QQAf+qP7X(p0_xU z(xeRjALNFzoRhT+R@ra2R;q8K5)`yBn^K;OyPd$jd|A2zUp6G)CR2sY1xt4(y{I$4 z2nG0!=UjZjtV;^_!Eb#RSEa1V>8;j%_IaUk^v<lV!xK$c={!^&&a}2=$|R|Qmcu<q z{YdU#=VM(h<n^omP5@kuu?d64B*;bOEd>`KgIt+=^(4`;*9F<z)ZW;fV|LCj?9b_i zymo(}+(+kcT))x_={l|5r2z8*YE2A&`Rwd=r-H9WXj_1!?|i>bD?wki->ARU_$!0s zc?E*Y_*~A;0W6JC^iHg9NNU3!zaTjHZ4S{k05`9zrsR%i1BhWSu>RC%|M@Hbk*-Jg z{ph|Q|MaKyK0^Ct{3ALbJ@m&vGSn=tR|^-?hWdixlL^p7N0(&`MsMJakZT(T;V8e@ zhIOcNNZUd$3no3ScEL;f5UEJ+ZUA-@hGzLo^hsET2NuDv;L&cCV!AQ0D<=ZOG$e~c z;A;r1S0E+C!tM-~;2{_e6~kZp;V?Gw;u>#oQG!n{Mi&l$(R<;qUeLttB3?)$JBvk> zPi}qp{)0zpvpsqc|10=Q_aa+;y&ku1k7I&hq8FFWz3pXo$M}rZ{K!#4O&(`{?1W=4 z#03lc^Pd=m@aR!GCdI3J_jb4oM@gFrn4y<8`t3G6zV`3mi)|a+%ioPCvIfoMqhaX^ z`gCokZ;@TBNe;1K3=X>fKFK)0_+c$vx{6**+!Xu70KMSxhkyUTkN@@V;%~}vDwNg8 z3PkD^uFw74ZWS`0xa`u(ed=0GJQHbT80si?JD_f-=JZOA5?2VU#=@w;;q3synK&E- z5=;$$8-iohEar}~y|<}Hb^eyjQ#4MJKvpoG!C&QIsB8%6E3TvmFd--%$DSaRbVAVZ z^f8-v2!4fGitfMgx7vRTz@4%NqSWvOJN;h}E-6qPMiNB7wf@iN4D(X?H4ZlbmwZrO z=+rfrGzSHkX$VUzZz;f0e${@v1-b*6dG=Qc&zHaajhNB0&Bp>tHI2wO5dr!ddjPi( zl-2%=OL<4HV4Y&_)WQVJ?j^4qe<d&)uu3rSHPx3<<1a7Xudpb<MwUovvwUe;c}tV- zS?=seNy>H#T$R2OyGUX(ZB1q=lfz_8)?wut84euQ^>cAGuG%m(T|;_lwnR?|oC1~) z%n@x_$<h>mXBKjbTot^=U=}pOTtxWi*%zSxUdAPc_#4*C$!+<L@@hsC*YOO_l9JCm z9qp9t@NCmhH!QJJKZ*0n;k7hu^Nsl{Q2UF(LocK_K?lNUyP+<KmAy`T3`xATNCF%9 z#>+WsZ!<bar1&f6IdU7rg>z4>`8kSrRA3cgyB(_lTM1GFqxdrE;H|kIyVO9iYu#)3 z)evpRBLN)sx2eFT{)*o;{sy!W27Ha{fK^EctdJMI*JR!)_!X=Z)i-)>NASI!zwGk~ z1|a;*KYZ!y)%8f{XU1Om<*$B8^ef!2eqW;>Jw@BEE==f<BpQI1FMAP9vJB5s1G{Ou z1)-8QcW1QIXu1*>eiAJb)p$EvGA*X1)w;S`hiT|l+l9Y00q>(T?LI?A?;*)>wP?26 ze;7UVWkO(-%k*v=OtHJ_`yBpCFUH|p#Sr$(;{5zP`Y$)V@HxhdSPXtOoa_Azf6;$= z09~FPWPu1%z?QLiU)y)^_=#i3<A0?_4U+kE@ZSBXun!deUN~8!#lm3u8;7yON70$l zni=r-*wFpg_TN9@fOU)(V8@a;xPSLfgL7@5J(rIbOy!2cTDyS|9DC9DcN@e@{@Rn5 z8#LJD3wT!vU}B0Ce`(!bLF`KS`_xka__0SGe{KmzY^>H>b<Z;V)iaMh^t%V{|Ki66 z{#rZVO7C0?a@DHN-I~kGfxl$3n>+L2X+3CZ5LrFbNUSVFpcQ}1g;W4XSSfcqfE81S zVu^<g3NeRFR&;?h3-~tux2eDwpBsMlg^u#eG(z5e>*$;_q>a8+0M0d4zYD;VJ<TEb zOw|BP58!uSiv!jihU;Y*LRx|3uLfuo;CNpdfJ0zfnf<sXg|Y%SU5$djwyI_t!kP!P z$Gm@@>5e;6_vg=_Kd<=PZQ9t$q5wnSIV7e7f9e0*_21A~TeMsrlGf)K!oy!b^y@R< zbBDh+0N>aQ(B%PL4$xBr01MW!0z5(PR4%*Kj)FKEF#L@NR^xBJpxO)O6>EwJfhlPg zx0J@ANT#r*z){wmTTGd;l)}Zz<S1xa*^8v}+M$)nT5b!kI~xwGV_hV9)!dx5VU)x# zsnIvYrA(VBR8A$X<;#?EmM^_5W|Bg7)`{#b`wcBL=low6%vSvszddmqyoub5Z^YMf zM)EEB&XU@5ke|7qC#iKgT~&D2OxCwk3^Vrbc@M07T|oX;N>i)`XmA>pR^B!PGxWVW z>zsEhv(c=??p35%oTKxWGF>0^?P=;}Cs*c?xan37*gw%f-bviL5rAU_Qv0=fo`GMg zg7qT&o!}S#7J$Rw=6+T5t-x10J8O3~kyR`V2`rm5J6FowwqF4J$tnC|XKwr*@LS=1 zK5_5g|Ie@f$G7SF`~C0#fUy@c^brow5B}yizt#7OuD?$+<_-#Q2L8n}C|!S{7wV%U z6NDQ20_!AP<N1J1vrT)Ivjm-_?G}Q)wzmb=0BNE)`Y-@O2P9Gy2&V7vZq!W-&wJo+ zT9XYQO<b%!sG$sbB;ip>jh8H~=(DRzDnjuQUc&$e%a-9HM(1A|e?jmfIYvS!rrmlO zaW_`3<ntj0Xo7X%xxLj0j{tbbtMn5(b>jHR6G!*GY^yNi6X~C=KF<@;3N3%RiYh6C zF>HT@fr>FKA3SvI<nfaykI~4B{u|vF^Yfo<{ylZ-#4*g$X(B$b=jCmN+LFIq&XAE9 z%hzqf>V1G1m2__A5sYcMVeLvhnV<KCuUL~1SW+8JUGK70%a*+GETK?HYQPH?FJHYW z5wJF5eqQ|iv(G&Chu=N$!!LYfPVCPSG4PT4Xa%CaS&v&4tXc85)kBJScFW!zMtw6$ z*w;zfP=@MMdQL>=Qe_A&j0&j;s);xvr!Z<19%Z5!D3N*sv6z`vsiIc3Y~feyGyh9~ z4Fu-grGY3Axw1mh2FR>Fs|fT?h8{>Lz_&22pk0vc2S~Srs&w#I^Hkb@8-K_6g|(&k zI_*^MaL$fVfKf&7VAusjfDTv)0{)~iNu-mM8lLOc-uT<`YW%8Zc!tBO!!rS#*53>S z5u=+IQPKeTd@P9cn{h-f12h2*C=mQU7@&s$91Xky@LytZ09;5mivc=afX~$fdH^uL z&E$uvl3=Nze3Y|&FN{sZrhr=3D1UFUBsKh6>|9yptO;lLt5lnN@nqfW6w~qQ+N+(Q z&vH?3&SY&cWuaV>qx|;b%;WSlDR3!$7+O-gS!k)1JC<5*GV>M9rtgsf$!ERk+zT(G zRbYhQ;WnsJubc9^#uH!U8GG|AZJm#mY-Yn!D*X5~<9vP_SMajxr|GXV{7rY<sI(%t zsl4Wda#A-lhq^tS6@FIJZqD^n)ZGvFn`=iXu_|}qwL5>knhnlFH{ihstKqj(IJK<4 zOXriS^ARXE{08n<A1d{?ysx0IQ760gIV!Ldt<EaM1AsrS0eVOX3zXqX0dSOFs5_9C z6~MP^zihbY?vH)^lb`$VU-|ks<?r{t=g@;cC-O7uul;{fe;;`QQIGSL_yuD)27zB9 z6N6uUmQ+1S3=Bk@tmfhB&kL~Z<SRtWgzQkis>ZwUSPFmDWgRo<HT7Y-+%ibteoW7f zVSuXpYT?%mC&kvxc^FU$sM7;j6E^3wfmY<&avOCN`Z`R#VK<C(wOHS09mcTZieDp7 zG9=+L#ywi~;&ScKYv@CT^R_UBrtp-$M@NsJICc8e(Y*wNgv!{YZLZEo0?uMKKd18% zMq&^e#TC`|F#7MYlc$cQ_4fqeEd<No(+tCqFqHae?d6k!d)%-g{hm<WjT*L=PEW7w zqrWqQNW`?wFof%P3asbPEnGwpECwIkgaVAN&dgzr?d1FPQ;dcIfFFP6`DLp&`2|Ga z4i8%J^rH{`{#W1o$2;G9^%bckNUTy$sW=pE3vuHwp*R#UR>4YE%kZ~$<zus|oI>r- z$u;pDRKF!Pd%|CY$tAYNc2U$bNT5L+O-m)^QSmnluFaFB@CL%<JB=HE8?@UAIVsr9 zB>YuHab2!I5qr})J+N#5rU#NSpu^w!A7mWhj{@M2QNxUW1%Nd_mpbY9^+?YJni_r! z!X3<0b2Qu7!W05`%$pB-Wp5_pcfw!QWzM7h8Rb{~R|hPV;Q$!)R!gunp4NaHe~tK2 zSMvPuw*YJhq&e?>&-K?g4`>X~oxihZ^$3(9FD<&jx3PFi>780=`?5~{hQQ~Vstb}9 zXn#mjUbU}(3cv+`ltYS~iGr3%``}|yQQM__Q+!!Wk<7Ld*0qoM$-aL@F1z<LIQM$q zhZSK0U~^G?D+6-<s>`$!xRo%ATT2CC7kKPRQS&8CmRhdf(M1={I``aJm(=isnxF>_ zxK+%mRxEgnGm>{+sa{~c%C^&)M@+Br{Ix5mAmfQ@8r0T#CsW>2B*gH##c#r3q0u%a zIBGD^4Sr*6F8FGuz7ow>7b_FyGqv9Qra52xX>&WnZMEm%o|IhNpFbAIaNV>3zY7g} z+63JifSdZ;DxPh>eBfHw=27n^-dAzM(ge-_?tLYA!{3ia0;uuQ=sQ@QJAc6~(qXFo zw-zLDGd*jDp5kxEuMEceeD}vb_KDAY{>xwgkN@>;@vHj#Ge=&)_Zjmut-ol$sK3uV z<Dl<2UoFx041U+HE$1cBm$ZeBv$X&6XDcwo++`mj{G9io!fH6)xdR->j4P5!a25XU z+lTYj-o0p%L}?@rMdDszZ)UB#nS*)6xDey~r6m?3;t8ei6)A34%xJ4Mf-`NqsE&Rn zIK+@23^Z6vVFm)`%R$fLCChQpqW=*e5o`FXu047=ZH2!y<l?@3`q&;~TqQV%L;G?Q zT+%NAnt#z-;qumvgpNf0JwWdxnty5hJ$dSQ^j{BeDlh;(eH#6j^=QWQ0Ct!}21$gZ zzBu#iurH%W^Ad0~<B@nATC~^WXT|+vH|LXKHG##5>a}*`Mmq!3eRvH6Ixz?XKZ_A4 zpIf}zCV1SsR^t}8Xu*?@{_zjL_||`$cjG(ZucftDpVTXT7_CF53We49Yh*0ho4ryK z$^9ArmaV8noma_q)UG{w39U<Q$^yPYAi9=ZR0>57wHY9u5=s$BL9qOdE>-*uh?{nW z@~em^Dd3xu<;hC|a_S}u6_-s4o<;bz3(Mcj-<lAV*BXN|U4V%~sS`%(TDt$<#qdY- zJI%0g1;9~zV`C-<g$v5XP|aZOl)s1p;i~}PG?gmDs%XC|z@DJ=UqfJpyujC#CScZd zGjsu%6()Dk{TVZO7dXlpEp62UI1bP^+7rYf81QwW2QVJc=)a`^hoMda)V~72p|J<Z z-b_jbwh1_?0XXltevc@OO#{B%M8Q<3_VU>Te-)-y@+@DjU|OQL%9&EQHbfZLUR4(V z+9?NmVpH8fZYh%xIQ3)TZ-8idjsi@Ea+T*v32UXT&r+gO1gog`0)Eya=r;-*&U?cf zFTV7W3om3iE-Q~0?#ZgkePwF>oRRwLb9Kx6R!JV1Ol_)FPKT5|Ci~<U>1S!LrJvq8 zuZly1!1~<L3@m?>;BTeanjx@bCnO1768!DWysho3ez;ts<cBxSB}Vt1dmTMRib3hW zQM==UMVF>Q0ZujGJGQ=fr<#D%<8Pk)Mdz*d-^?{Z7k@#o3EH-dL$4HnyUp2UKg&^j zRe00YNaC_I;P)Oo9_iQ&W4qNk#^;9L=)jCD&cNayzxVII`0wBNX88O4sK5XDpSVB& z`q#fk`+ew-M4o)YzQ4}~ze@?8jNS-;4PvZkPyzTQ+@DQ$E=nIEv{S%^E^M2vrrVf} z0hrcixe7{c72easP6A)(OE(-W(g2(GUNTsIZAQkI%hhq(0>o*H<^0;cQTyn3%pCqE z0y4&B;wRJhh?rLn6(N4ZUzK8@>?g!ZD4nn&bX79&BsjE_51oy6A3TElGJeZP<u95w z5xsQ4vKiW2*+F=WtpIcj4bAvX5qXjZYqj3PhmV~&bpp^HIo5k0H3KyKE&Ufato=Au zJCdN+<HolW_k)3l2|2xsARL4mp+OrvIxLN!6^_m?Fj(Spz7f{1r<>P?4R!|RwXda_ z_c;|{0Q}T5&n{Xm&f%}4I=rypiAVnU`=5RNGq+!V6^KN-Sg=zuGf54yOjp%Qd2jYW z3%&K5>d@*SJ6Ca6*v$}ZqZ%|^Cc**j7s(N=p#+wsMOwuHssUJu)Me8Ye;a-W6*vHH z7H5^;vThc8qb8RE(WJaGFBj{QaEiav7xEC{&0q6?zUp0ulfC&CVqnoi>*sJYKsEl_ z{kH-tgVfs_fCXj%+$OasLrGz8^x~2BJI~~2IB7m-OdD_qu(0O9xpT#-nlHJYK(D6f zvj8}I=mq8_o5AglE@tKt0*g<B3_++<su3vVuRVa_FCRHLV1ZC<$kMd4R}=Ib-Y})~ zp0VKmF+OX6CPf2o0PY%aewwra6tDu|2-Q~7x<I#>RuN61?GuWfB!HGqC#giY%dKEm zrZ3GXt!G)BoXRtk+D$oYW}!yFt^ubwOI=nB0H(n8($?q2S=U?ir;1&@jhRz+y5LR! z_qmr{aK8PIID1EL%^M~2rQ$298*R5dy7O%DL5iq3tUXj7&lNsgZSEqVt<8>gZck~h z=EIa1M&8#vyz}4}0-G`z18usExu7`hyh1k`F925O?I}N;zd_FLwY&pfJh#~Iu(0b5 zddu0tz3cMPfScoWYXa6PRNtXi1M8fB!`H2Kjz87ko-{s_X5csKuLu^sh1<d8JcVC9 zt;*xd4#4rnD&-gS#<97Xp4E0ce_f>s`jhCs_;TIzx&QuesK4K``Ip#Nn4jS<uFo2u zY5aY}*prSrNLwVPTf#<(F8llvN<sjugJPvszuln|G%dVPiZD?-F+tN%n?6aHjnyO3 zi?JsQGE`!Cx@QmFeK0#8*suE)dT^p%LAu=mt}3#y1;%h0b=WZ)a1@4xoKWi0S(XS@ z%_EBT)YUKIV)fz@y|3^RUWnV(h`+H!vxaenh^(v$UH-<g80)kAeR=PpBS%jdHsi?d z@Ryau$M9ZF_*=iUZ98N1;&6;|yq%}mz1NOK1h+bT?Dz@YpV5PD`mJ>O<O#Imj^Cq) z5A0^3z|ET-&zIKfZ3ObzghIQ1Q}K8AZqBc77frwpL&ziGZf<M)s<jTyw0?ao(FXWh zzU27@D8Le!peU=NPTQQka_RHWJn_gM9=!i6pM2l7SC#!)23uw=x$v}=<AJ}ZtgXza z2Bz#+<>L@`wu+?24VA8H5LIa+>)go;C>*Rm$_=DQ2`u{qbr6;*xXI+RNT$YLn|4X^ zHpm^gD}VjVW*f~${0-8*0GFGRiIIUb1ffbZ$1)*91277(V-TYMzBgTvjL0s4sec)L z@I$2O@Ea2V3%x{MmYya<KQ{!c64ODc_&cvP|ISOZFVp$JcODw5GNR;#y9dBHQ(=O} zAG_I~(Q##O5@N>I;4}qyI?tiu+BD*CHEw;NMc|lwixDW{FZwSLyy5R<@RuG)cwiMi z!{0YG<FhD!!(RaKO#Zfhz@-2;0M~B~fb+WqUPF0HiEL#o1!$5_iONL&QZy}u7UPzx z5VBAir^!#PnQS{-uAhpzH$u^!Bvjx?eG76o=TMwgfE$GiwiIj%7Nw019lv7Nr*=b6 z?Jd0C>>~Ofz2ObB&b{E0`f~NM<J17;9eSUkQM+MpJ3#Fl+F~krf1uhHiq)yIAx}73 zw)WN)>Q!*mDCIScUN^5)`>_fzTy6Y?wxcvLHP=r5My57vue~l-cQlP(`J0>MH)uEK z3#fB&O;u_fzi0zCyhlc2pqfx~qW(f)>(s=$WOXCS-}!-X!ME^R)!n#PEujOGQvaj+ zR;w@gr9}$$x2eEUg1ZgcIS?-2tHA~hc;#;)*jUfeh{5mQeB`bVfBdum{I9CN^ghD* z>c0Cj@-H2Ke<OY$e&o?dGxUPyXYfl<DRp0HfbSLjMFU0?Oy6GzCSv>mY|Ozg9gT31 zLd8V~))>v`x%B=`1ddp8MJ$cKdokb=JNe*#@ViIms%L`Tpt;630>Arc6W&7t(hShB zSD!7spy4m%wc8MyuN``DTf%Kv)pwcr)m?kB8gDZ{FNVJwqL-<^udc9}wqhGtiVnFb zyW3tNOyseX@b}~qSO^L+GBduB?B(WO)8Pw3s)E{JjN8<!uW32gyZH!C)2hGI`tQkO z$4|xkit`c(`e5-_=V@K5ckYPRx{e0mS9$i`ukF;0S#5mFrVXpP^F=Q#N_#s&yVlUp zn(>vn(@m(tD_>mnEDErGaRfzKkucUi|Ei_WJ^jQZ|MkERzWDJu@9zAiv|D6Tl`Q3{ zWvQ}NxGCY5^ZLH5YHO9?7-mjWVXQM<#xbYz6@OicWULGHbNd-vL7+=6DW+O8uyU#X z5JtjpDnY~$m8iG_e+T%MGMq)YD}p7c5aon94dPDe=a9b>Y1rf;+eVja7pgTFpy>k4 z7=(_&@ZJQWoCknu4~i*@I{4u`X(1YS|CMvvnYB3sTNcuETLiX2SQbVhbv>PmP1wJ5 zzl!qPTB5QhLjlJ}s~e!>0zDU<l};5vShd$om<xi_`0E1V#uN)QVuy5Fwg1}841fL3 zCkC{)5CvEVXv~78|I!1P=STll0XBuFPR`JD&$^;^uS46k0&xgnzmfbY+dB`4;sLF8 zM~O?RYvMhH#}Z1hBR`!aYYL*J&obDgw@B^F=1D1_sLHROa(v(H>AZtJH_sg;MeH-N z6n6l3{z732^N@VBGXUHO%+u$|$7RnI?XA>I12iqbZ#?gO#y^tsWAwIs)zMOchgUbb zRckd|t{2-Lp>M4k?*lcOjkcG**;cfN&s$($U&kc*s`}gSFR%f)FdXx8?96Q<mPaWE z`Kl{TUUip3-kmQyH_9!wM|PzxW5ZqNp7@bt`qt>(h9bP-M*1L8SI~f|1=ItIJpeYk zYbqa|?~A`wi+OgzNA2ypFJITy{5#;+?hoN_G+&Tg&Av==2uYH|SfH8c{jC05VX)|T z1c7Jv{vA|cRby<^ccc8?b=ODl{l_nTRrQzVUqVkB{7TO&JfDB>xJQqXv_FI27t-`g z{0c&D;4}<<;qQjTU8a)`UcvN1+K%G86YZBl5&&`VD}2Fj`s`|tR=LF_Ezb=2411v$ z;}h&dt=&z6%TR649-55}b;U_`2fDj8RENKSy7j{a`0x<ZE5>6?#o)(~$xBgj>AQoy zd=c~#zx4cNRhoboy+Dg<<8NBA<u84LVoBfe+I}3V=)ZgV<YBx2f^|kG+>ZU3JK_el zd1E#Pj%mSV!>c%s`2@u6qR(&?U7L@4I(_o!u~SeP|7ZIJA3Io7*JOaRH6{Z-Uhs!z z5F~?O^HmW|Uhk~Uo7R>Cw?=av$7lrhdx!6gO?>_kg=67@r_p{FKEIGYO6zP+=4%1{ z_t~fD{`-sX{L@`GUwviMf8XZlyd=vlg*e5x3iqVsyKHp1p4hSCIddcja5S=x8Wh>) z!cYat@t<8L6@&^Dp`|R5zx=5k@V_LF0;nWViRUh(nKvu~R{@Li>t8oIH~u=yX61Vh ziIi(#&qZ)TZQ`*&?A7`;BlA2m7x&ui;}{Gmz*k>${f(Hg!0G$ve-IZeYhylxKZ1V- z?$2ndNw=qJGYxzTdro`g4c03GLgNwybzJ#B2fbwpOM|ivz(|Sg$bqFf&yC?(?yB~t z^|vg~r2>~H*3D|gNStZ{4uB(bxY`|j=lh{Qk7T>D*6f>cfWFoUSQHI@ugi$g&HKat zEPtJJ0G}1NXRK^{pB=!lQSh4U$IVa9d)9Q@0NjgW%3~&!G>hHLWU)&jOvaK|dsqak zP-fXh5_?wRtZA)m)6srypQ;rWXfJJQH6R#BK`tDY=9}`&WMFS)d^!nSWsh}JWv!k) z#jYk<F<Rywame{^I)C=G`rEGT3!`eLQi-APDR)|gDm+QwqF1lO&V7t5x6G)D^SHIS zJ#~Nf$-KQ0w@*Ale21f#IsjG;m(*2WvThpf=~4B%J>PJ1jk(3$_5``<+_$%_Fv&BF zCjQ37U%kHYfyQ)&0$iV@jlWhv0Nj+|iQfe^d%jBWfZsSjGpXnss=u0^VXW$JbYJ4| zuxQq4)|WT5`2E=3#N0?9B>bro`dR$K;AV5~hUXE184-z2jUW2ZNACIiFMjpw-vGau zpHY7kdy=TnzwI4=pCCO+?5k+M%k4gkA(Sx$?6(7c(~k!1?vy0kw(r;he8sT7&_>HJ z;^ZzzP0%h4e(B5uc)=M4WnoINE0W_K?bFp6$nDuf+b>3DIxN*etlYm(k7$E5W~d;- zP|?(kvJI`aI`kk-rtpWJzs8Ls?1suO=JLgK_+5g+ix!#gzq($r==i@nU#-IR8U5FR zBQ`{V+_r0PLQftiYV(0z3GJbJZ-8d_i+@zSuWX%_gqya~UHH|#_-*?Q0e+9`W<^J% zlmBnWFCCEZr9R1q1K72(L?5C95(a3U#$VcoD_3<J+PGokOS*K^(#>mx?tT(%T8{ym z2l2~+Cwg%u=I4z@?trpu*Q{Q#_=V>dJoC(g=T(tctmQKZWHUhF5~5H3@wY$w=I7?W z=W3i>BdVtPYvE7LYc-&KXR7~>DrfDaG)&Gq*Q?#6_9e%J%HVEQJ*+CdP61%iTd4yv zB%IO!N<>3~;&0TZ;;%xys9V!vp>*F!_mc3QFn>B>VeGWU(WI=4nm3YnWCcU<*BM;U z1M7;W0N-+J@mCkDR7Pef!1!OK`4_mcJr!F3r;!&GIQ)HI)|gH04~N<Fw$gvg7zS?d zm}i=AO6yc?Wb9Qb9eL-L;Tf`)*%{HIbQx0Cs{p%40a(MEdU-Q;&sWOSEpu0mzt`)4 zg#tVbLFfn!w%d}<<nLclg(m<`Gq9)N&rp=nfV+i)_Z{REqy(@^<>ke@l&>~HJcqw5 zD&{+i72*LfWzF@q#MV~4MQ*LnW|!I)kIc7Xj>^_5#-rVHW>48}$YNY%D&e2|Wzx&> zC0d|)o+@88_3<XTde|y(mG8xUGH3m`L^4*$>~k{wU|tR!>WXl^tWYQz@}|7Q0`Yi# zgO~T;Q`>pO;l3pgYg<uXJ!|VHs7#->pT)P^eiGlCDesqQPaVTya9gNt<M*A@a5Hri z-W-ymzA^^>R)!7i)EWUQ-;Q!MvdU|h1=_C1SfFVF9-?rd|F-&fTdNL!;ik@sVXQ*) z<*$iqUBRzZfK%TwdeQVNer<Yc%+=hS?4(7wYrhUcs2Z&IRq(6f833#0_N2enr#~GF zv@O4OJJO`~;k!TgKfdw}wO{d@aeo>2s0V$1#6f?beDW!suND#W3jE@GWuxg@I>>0b zHI9V#UqT_H(J?TP_@#+7J%QsbOot<e&DHf;L-fmb2*!NOh<!LNCE8^8djRh42C*8X z9nXNyu)vN6V;D|stZEeo&bATnN#pO%otSSOdI1Y=thtWio3M@G3fC*{7~C#fDxL%w zU4iw*GP?vDdbR(qB>=|ibwp1#gvZvGcD{Dt$Z;@AU*02oc5qfq!QpRw#<(S|-XNdA z85n}?8@!ADN(Tw<eCROV&nH!MA@NB6EfAkPc1Zr(KD>_roPZMka{JpHNlAw*SWYl& zoxJ>vv4fH}amHr|e@lOVk$zH}h&4h-V0#U(VAHb;7CeiNzt}+<;4kOF{`~9{k3RI^ zkH7k<+pd3C)Zf$<B@+KF_N_`;hEpq@x}MYkTKVk9I%OM&<}Veh>XTX4IW4@qf6jrB zuvSF@rUiH+wNwvGW9d|8<Idj_NY$pR?Cws^BkHR9wp9G&n66<>_*>WLmqWRjh`ORR z$Bq-juVxTJTY#^>DIQqFz`_7s0A}zb0$|1b3@rtwh{IkiS*_^cHUK7fTL-YK`6Ia# zKGl^%+A)7S(%sw$jIB5+Xceyw!P=cC&A@GSHkTHhhA(d_mrATl<cuRA6@TA*vmVgb zzWZG`#$18P;?3y47h!)s9|c%!j^bdU>xR95(G=Yf%uEeBN&1GsT?NkD&(F?JQU&5{ z09LM-oVO@hWG#56l(yQ`mR(?TFwoeXE!nwp*<75c6&BWBdUNtxQP*Uf7d2UoCjbry zf#6V*^8}W#(s+9*%Zj0RPvAOT++Ff@^f_6Iuj?+p*x?6tewMwY%H&feoGLBQY^$)z z_T^zA)wfMtSy?l~LRQs-=84<h{n6_M^taJ}gL;Qf*)P+!#viArBClj@ns4^Wd#_{q zi{+Bu+yuYDZasKO5BE@rxMS_zZZpr}*#cn4VR)wmE*Gqun*BK+z!dw|7*iF(4`2D4 zMj7qT)A-c_P5W>78~k>ScOWs2m<8s7vCt)l={fkdDOeM955D2h3jjFYR`-7D-p_od z@mKuP^!vdN-1)J;#rF!=XXyL=AO7e^_x%*lE41JL`olwsI+;OcpSJJs3rp~OcJPAL zYK|~#&B~Q)HoyWD#2A6$2HZvUWdvKju&^`Roo1Vs=k43+iA2X)_>0BXrc?q<+U$Ge zXc=#@K7(Jeymyb<FRs8e74O)Y_F_6BrB&F&Z2KjQG^gCTbGtTgoSt<6Gxo+N8h^Du z16ld|Jj$>9dckpoVuRKQEr1yXX%$aG=ihbFf7Km12_r4MdVpAw#H%9uq@xew&_rks z8i30ITl=ulpHWcpg@V6qp!xTp9gvP5KY8i|Lq{AuKqQVK{s#C}7iNR@=VQkh)#0@? zD{CsifsCg}A1a)&wy6N`hQEAJ7?KMOcmq*1F_+V3{ephnKo%Q&RPS{RAyNE&P8<93 zRcpLYHRrW2KKJA!e|X@B|MKxU*It!6P?dz@3Pvr!R36e$s9j|dcRo(Fo7zY!n}?^w zQ<ZvMEB?ARHPW;CZ&HzLJ5y>6zM>;hr4Ul;L>Q6p6g3mKsz4S2Ubq#z6Y>rO&Vi#t zSw{6mFqY6WN4~Dq_Z7fn_6Eoo5%l2lx78qo8lY*frGZETbTnWGMY-!k>c2ME7J!AS zXf>(tnt-oOPi+C6GX!QQH$?_?HqNUwe?IytsT5-Y>{;loJ9iEQ4pqa~K0*7PLr31y zgZoO<-^O1)0#vlyMdopK6KCf(-`9o!zE=L)0f|B|IA9fk&mCY|__Z1M{{+B|zo5JT zT)$Xew!e(2^Vc8~$ki%~tx&e2$~p?v<*aO_uGTwEAvB{z_gM3$sT>7#SZS{I8x>qj zaILK!bGT>pqF&lrv*reb;&%Y>q!bs4C(9{sK4mLwnYm1AtA_k&o%WZDDCifChaVg; z+%VNq<YHCS+R&D=Fs{JlXRI3zoUz-m*q=NvpkBrBg7ZS#TlIbVo?OgykO&fSv@kh{ z{XAj2RPH2j?Oz$ZWmbyc_S`;J!*331&r(NPZag=aG78p}js=VY41oy)%@-=)q1J>M z_@!b5zw$Q-)&O1VFO5r4e>Fg-##h6y+OKLb*p<f)LrR8q1Afi4030a4QWy`cH2+2c z2EE<e`BV3n`s<ocd>q^J2j<Pc>(d6_!1Ed9_eb~LfB#SIcf^o`fA}K_->WC^uLZxf z{Vvw;S>>1TOZ;2E9xrH}f$-H$?;j1SpaV~=?GD6HF*vZMvP^Q!Ba~p*+Wxy|FO8-c zZ4Vtgs`2^I0hHR^dm!-MeS53pk&e$VqeM4*HT=a33;t?`_DmSK(T=g@+WJcZU<^(l z{K8j;J<2WPgax@+Ec}MQG3BmWNuQoo4jtjA1Z}6@`3^>GBA6s<D&2_oG5VlEAGNRZ zKy(k<OZT8x=|n{U4fISpE%D_6fA{eu#CA4h^s&SFrkLh0_&sG<tV2h^`l;gw_v|8k zM+Oxp+B27gzakgcYd=gFUP%QQgET#Q*E5=+cTNaR#+_Qcd<`yU3@@>M(<a*AR}r3) zagd$^%=|R+m($=iy?o(Q5C8s`-}%Bv-uvz=M<1anuc-l40;*1!YnfK*wWtr3aL8E0 z*jP2JO1lL<rM}fM(Q7qGHRKXhihQhAO|mjg_=}W60iK|-1oB8w!9gW8li<~UsVKmW zx)b)+)~*8A@j+-8a8vy4;*R;~QfKlv3UImr6N3`E0bqkf2EeJ4iGP*;M>=$fxL~#c zILwr_x8Hs%y_br}>~O2$Fj$*us((5}m;;XUDk&5?fZ?yALuaWuxRGdr9;Mb495*Zx zTz2P%-yD!{fX-i^U_J@Lzn}BUUxolq4<sC*-_CD!S!)139}9F^an)jha9VnWv6;U_ zVE3yuXuvT+8z{8>l>V*-;PBUvG60<7mqKQdERjlas$5n`NlVyYOw&g<{<ecX6K5H5 zA=!4FI&~dyd2fkqa8O8)z9jFON$I{RXFkZ7zbS81MXf$NhT=Eb!CaL|`Frt&=bdx@ zrI%ie9Y%{R$t#CStu|Rjt+AxK$06h5SyoS0W&atA!@8mB*TeHBvME1FUe5R@@Kv&0 z)BIE{&3v=9JiOTKJbAP2X6x}fZrc*Gfxq4_scxq7walvA1Q*~+H5M>l(6j+xb6s4p z1aNNxuG*SU-_RE$v{fSfRr}@dLpWAC&CtKLHzjFj?)(+MWp|d#1z)zJ{IX!vuYHd6 zzsm4~;5YVX4bU2!n+>|$pHYYJq3QRoI~n?H{>ML$_FEl~et6&gKl$G%zrV)uif%{J z_fgbe0K9-85RMyE_@%*=kWqw(Fe;Py6<zs@C0HLU)J3>SvNhAjU^^uN%?ucbmd7{? z)$Ds1hhTf}sQiLp9J2NkV-n>T{NgxG^bUhRGQb~r*8d3vY64cDhQBWx|EexcU);^> zS1(_>^hF0PK;3;o*XL!75rNeiB{(`{!|&o{I1|g?jNN1qFI=B_0KXb4`W4R4U~;>T z$Qx)JhL#wI_h<uuCH$qMZQ6hB8q8q9jIFTm;L&6JGs-i1?v(!fC)$9+UmA!R3rVos z^$7L%<(Kfl(w;4UGw`7w7pUDTvUpc-S-*NEfkfahjoBE_ml0(neTR)Qf&&)MN)M~W z2}VZyFJ_1>jJ^2c^H2TpxBvOA&wuE~cfG@J(R_|lQLGJCoRV~nk}1i>UhQou>XV9+ zdQ(N+N=9M#|5R-&{-&m}ck!1aA`Prk;V)7}^cH_h{*>$)1kiv+0X*Vw0azJ6;_tBC zOmx}d@RD^+)0$jKF^8;^0b(GjuGFTiQ2|a2tPFz0H}w17?{{+AhWskNi|^w&VAX&I zx8EL3)vs)m{B4QB7}y4KT{T+IstABV6wFhZuEd6>02hDL0cnnIoYMeC`?W2YX5b|G z3!njSntv5KwnB5IW`OnyK2VprJ^s%apfd!+I|)Gf_P3$pVVdB@!~!jN%aaP2b^sTD z{|W+gB!@9o2WFZ!V1B>+T6xWR?WF)i7n2HbD~}c){;Hr>E_nc~A^MC|yA(&=*bhn8 zB04#OP1#yh7)^(Zae>;Wqo>LI4u!f~roh%bWjUH|igW-xDr+68dEB8WPA}CyRSDQa z!Bhc0=S>&QN&slD(XZV<Wm7vFh3fXEr&FZLrh?UEuR3_LOm4J_7m!VP5oXQgCH8rH zN%bq$w%WN~b>4ZO)a$R!nYL@?67@*+jFSiTf&0T&ez?12`pvT7S^8Ze;i~IXoS?6B zDB!fwgum1UYXX(kS~mpW0Ka4Y7JW5!wbrJJJ*nFzkR{1nCM^v{X}TbhkL9`GYx{4s z-@>o_EemvS1$KT9o?O_TF-qO>;lKTtuQBRTY|r4AL62~JX23zM&yVQ(jOR1s9wi1- z$L|_sKP{1KThu6`NZ6T19kh(Nv}@YUH&HmWu#&V!hrc^DO3PE*d`S#RfCH9ozs9jZ zx!t#4<8xV?UnAHu_G&_88I@AUD}1s56kfwQB~7u>9iw;CrFP9qe4hz9X)7;QXIp!h zLStsq7aOka!J406#DKn%k&Af<f<LZVPwOuTrtun2Yla>?apLp|;$#?o68^45+uRI) z{XWp`3kPW0S=pk$H4!*=zQ(7-f&J<Hd-MniKj`W9-_xgPO~x%NaiLEh+5hTxUzdH4 zw%bsyM|IbKeZ26vx>Ic=l;#rb%f=DGjQ*k{0dK(Jd^1*a+OJnK*5C`zFIj;dox6nS z+jt4Y-+1bw-~8-9{%-ya?~MCZnS-oJy*81v02ggrPBpmmw^csNIHIrQBh@Wc%c?dd z!6tI9RW?sJ;V<%CVG<8$q?KZ8B$5z7O)iaQ#a|_MbSJ<Y&#Npr$rdM*<k2iKZD%aW z=5*=;oxj<YBXX{sh9fV=0F44nJa@Yw-7@D^hR~g_0t|TtaPhZ|KN!GjDh7C^?E>3M zt|E6k9>>g-0NKHfBmSyGhrLLLA~MTnrT}aoVhCJ(RSy=xcrh1!T^RTqtD9ywJ+PEI zAe{$L&PaLA>zPo1Z%7X$_)D|>4E~-0;856h;MWCk+tSG$en*w=0G|Gpe9wG~StgXc zgD6eeY$eDtR%O+kg|#h>q1u33Wih)oTI3iCX`7EXjS6ndW~X*puS2r@RvN>gZdm>f z0QNZmv8z(BQ`%}WD$TvL*Qy!&xR?#IXR838f6jS^-$<RALQ%-XO%;$@J#9BR+-&2L z`?xOqwvCx(#pqZcweM7~AiMRq;k>_|dY84O*0n9n`fjz)c$)qD9dM=6<(pNZ6@Zii zX<Lb%^49y#?Vg?GW;t8s>$l1cssSewWeY<|Ct$xz^+fbrwEQHkS$FukJC7=1qFP|x ziu#KM+Qy}rp1bPn-0&N~S8r!00dS^GEk+HNzGZ+eB{-q5y7t?2;4ynuehFs#;k!Pl zPsW}1e&H+Mu<iHzD8EL1rq}Op#qS^fi>S}w_t8h6cslr{u{8We(v#Nd0i*+x-E%UY zo)p#v8I%B)bT~>dEbv0KX7ygkg~p2V3w{~pw-TB!D2A<Qz2J2Z4$kPnD7oyW4y^YT z>M~t^O?Ldn0xY;7dbD3u$0XxLG3pT`4hFvjZUny=W>FuLSc@TAe=G=1^bNva5k1q< z4^|5`V2U13Zz6{NJ#peh+?0*eyn#J7VhLtghP@>HpIOZs_K$bg=9hNv*5-`S8aHQD zU?N?S#pXOogrGDmR&n`M^*}0DHEhk;3es;&cPwLN=L&Q%<{Eflt*4cjmfuB$p``cM zvQ=v{SmM^r-1aIoU<NT>iZ+i0J@@Dx6E*tzryl<8Prvrr_h0``MQmhN39k0ZN*sfT z8rx7(1uut}Bme%aweF<qP``rf@OO}dIc-gb8s{M%l;f)6P^pktSd;*8l3K$>7izvU zby`k|D;B!Q7LQSU<8w9Gon6~@seSACf@%pgPd+XAhHJ=Rj(2%DjcT+#W8VDMw_R~n zbwPr^;&MI;FsT$^YpdU_CO)Ypst88aomO-OVE$@-c6GTF;2d6)QhJ-R+SYS2<pvy` ziwSzJ$r%c6*c<-Z{ChJ!k66_KY@7}ck-re1bIwED@W(eqJfP+JTu!0^`WixDIRZl> zP&WOy8K6r8o&nq$i$&$GA!p+he^r6`(+N5XFh7=Wo4@=jl!O9s=PzYu5cQTJi&QIW zig!~=8O69~Cvx8+9@w^>*mKO@9O%TovhUQSHs=y4yG~lN2vdOD%tB0(wl%XnhrGQb za209Gbb~6-n>1dN{A9%>NBhUcv(BOWFBj#@#7mD=!^WSY(2S|~TlI|%=K2cfLz<kS zR`JYaYVW+&_UQF4crRI5?`L>RJ>$H#PfxSfGxUttYWLRPW!_^Ztm)4<Qum9~dGGDW ztZBDu-jjL}68BO3CHB_P3D}02RD@K{R0b=TpS$xKe&ugjpJ8w`-zogs%$w*}h2K(x zSyK?MMUh<ir2!ZvxHR9i{;Kw>{3ZZaH#^H=OwY9Z636xqzRu^}{rP|WTCC4Mbj+jw z{N=A6K=}=R8T2S!f1e=i2HNjRJf35HhP^1hjsov+@LTM0Y9I=ON5Ldpf^C<Djp9+w zS5!jGSM0Bg5n9_b3U2AYY4>HsBQ#$SOv3z(5gH{>{_^LDNp=L5%^bA9oUc4zt`TtA zgU65+gi&_z9}?YV7u)rBF>#}e1I;S%%MeK9=|;PJ>2iX1(S&Uz$LPQH1Zt%4SO4b| z#}2-V8cORgAul#<+<=++HEvA);=F9%Uku2G{6Oj4wR``*1A1TC)rc-gM-Cr9!~Bc_ ze3TTu_{8D8dO#bq3-|5qyqRrSzBOy3fA87LBkK{(M~zLu>c2cmEYL&}S-u)$xGmj& zHmqHTJKTyDFVZh*BO3XZZ79+j0hTR%@{!;E_$&9`c3tVe5k@7EEUi>J#4g1*MOY=6 z|4sL8vL_WWrQ3b#7*!CY9}Cbsa?FB{2kk`G<p?KMkE(PEtr34CuCRAD{vw=aNUA2V zkk?5uUY6lmIo_1tP`Lp(2ZW{V(9DqXo;Z9z;|j7syLFIIr?H(G0AJ!D3~y%?;CJK2 zQNsZ9&5Q;dw@6%|#V;NA14;lFSLd(}v_j3vbO7-CiqEjRwBkY4ZLp0{xc&A*y6X@Y z1AlL|2{_6xAM>{oh+_b-{3Wqb0HYAkVb@#cybrIfuKoJCKYt$S4!$AufabI|0P6wG zXy}B%!U2oYU<0rQX#ABY4ZtxamkGMD_I31M+1pc8UnkHvDV>mbwc0G&&lBE+TngYw z<dhZ)nnlY*0h%$-%B%ySZO<xfS($>^ay1jRlT-_#ZrgQC;I?0#&+^_XK`+7+cmx>@ zz);wyF!4p%6Hmu;<{8b5(ohO(W2Uv)tcP&iB^RAL>tdXg^IA#?CTq$~IG=G>tgqMC zL6z;Uaz$;bX)VrJIqXoiJdZxSSTd7$NN!kc8>VLc1a)+WqbKx6O!XK{>owM|-}&ph zY~T_5<JMs{^$qYp&sA@szVf|8eoWk4uDC+}Rv#pTa8M(vWoV%98T^g%D}?QRln?B9 zS~d;1tj-#r(S9@S=4a=wP%V!3YYTAHUliZ;KZ@D8aGM6;t^rG51Nk6AsHwNz^|>$p zd#ullxj@hjntmTF?e`C9|0V2|-F|6C1;4;e-z#D;ttA98V*xmDy&Yau1yKeC@fKK! zPjb_E8R>Vs2!_UtLg=u4DzkefY541K^m{v6u|R9zg}*pK>ubeKZ(~Mp0DR(iuSc>A zR%!VzgMqyX{?Z`Icfl&cJ`?SVF29buuxQbe7nkdKRf$#dmqCw~uSonZA43HgM`k}D z(sv5`Gp)45soK8_)3!qmq5gtkqEq3UjpsGWs^KG1^tWx}*-?xcfMMSO4mu5gPaekw z>&RsE!RWxJ-Esoo=i=|Fqx%W+yqTz$+6M6JdUYG)M)A_NZzohXk*#+Tpi%?%CgO{& ziiJ4<MxiHcCIe2fZL|H4)~$2=CjM5hcl1RdPB2UC&r26R@yKuQ|METWySDK+-~Fjd z))Gz1{82Sh-Qs>#*_7^~N~R8V{#LbW)zL^B%Cs~FGZ=QQu3a*%bEM{2u`WSoF-1r< zbwP<AiK7IXA*dp#VdI3qk>8U^-_#IYLTtvgol}`M2)@ZK@|P4Q1jPDzv4Z{|mui5% zN(1zbbU|_$V6;dz;OZ8rn}!i63&4c50KT{R=PX*QyiK-EqRG136o97`UQNRW<p_KM za66NRWT9FKX)-sOZ|jFt{M8g44S0@#o=f;i6kx8;`Mt+G=Cw3`J^=RqfcVYumjE1B zmjcX(mpxf+06vqyufyC%<O&Rpx;*ADdHD-@A#jC(2EcqmO#s|rWtk|M+=`q<C*rgf z)hbX~=w-|WM7knZOlSY>(DoXr>kdO2(Ux_!WwLGnOI^=tuLENOfCY+j@Nr3{dXAK2 zvd%N1oMqjNa$Uu*wz!F0t;$rh5CafWE-%X<D4L*oLB1bS?t|-(@Y`08YFc*ccYYT9 zT9pfi!%mY--ejJ<-h%Ir-0%vgmio@wTzmB_XUyyCryA%x;Fp)!QXb8Gz*{S`u08P3 z^S3>Iy#^PC`}R)qOA6qM!qNKx-_rO?%^PZ4>A&-u28{99*l=;YvfnQ~916X5K+^6E zVKqIY2%8_%w}7lw+Fd$+jk{qOj(A@case^^S4m{6&o7Qw@4pR0)SP+u{PS17@vZNC z2hV40&l&9~_<e}R--jQ5*uKAbUZHl;TL))h$Lb^Kq@xAU>zDqi1Ags&Yy2s?9T^5| z8=YG1Tq9q$>t>|aGYz>0!`gk|AQY9q7;Wj}D}U8&#qRFi)yAs&3ytA0qYm!gvuC&V zXLV!wOTVP(zB|xXWiRc^^at8NlQh;?;$Deg#s;$acTt?Nz_1;Xhz0#TGY1}oSiozY zMqBy2P7^xTXU~T+OF!NdM~}!~yZRVrWDR|53ABM9nBl47>`l9^c4!@-NBkvd2b7&@ zeYP*s>52aPr{nu~?~=d1EndzpMs(1kt|}ax`>q{ZP_Ik-#!YM~P1!2I{G*$%Mt|Db z^}kxTHhq}sMYZvz9r~H?+_@c(t>sIed;H<w{OC(}&%Krq3xk~b|2TUS|GkRqPV?WH zI5r@JgaHG#F(5!J5=fT7yW1akI+LWG&N6Lh(utGU@rH5I3D|&R<0W=%17Z={cR>4w zgg`rJK@0vL=6SxS>c02=Nq90-((f*H>u&W{)pO6OQ>UsbSz!62dQeRigAsmhZnEzl zg?ngzOvsVcy_^AdQ{MX`?Vxu+E(XdywCa&+W0OVI8dP?naQIv8jtx<^di&h5nzd4D z2syzo4S7$JjZq^u+N>6ih<5eX)<x!359%cp%4XsEn0qw->H`Y}Gy<?@lvqGBlxGRG zHDAcuKz~{QH~w0y7YSa0+g8fBs=Ou;4u3I$rV)^TkXX(t<z}Pyh=A$Fv0v#_KdVjd z0FEH6u33?H()%lbsmak&2f)g|-b_m`Klqm}<@wX=wWRa+?#5pPU<|O3w&I&4F0e`f zE;$zIx4=45HcxH-9|179?EubsWBv+Y{?mDY8oK|$_Wvf#>3r$!Y06L9)7JV|M76N; zv_X|3nKH-WD%E{yti`*9;kZS#>7F@cajh#PJ|u6kxgm>If~V;*4d8l*#?!3A)ai&( ziL6ZzUlM5qogdfCdjI=pT?2UmO-b2f8d;0rZz@$2ChI9HhHdL^3qxFwU|p}}kx^vZ z?C(9S$tJdYM!G%POLULOp_a0>B>i6GV?78<9-r6pC5GVJ<;%R92jbiNhQGBvoDaXV z-Q?-XbNev-j_}v1kkSK;1r`Gc@1y#rX7Y8MIv4eG6wpwY{@<GR$Uflcw;W(t@~>O5 zb{4IlZ^M02NUM=HNaKY6f=8@~zD@jvznDMU1&rgXZuAU%v#CE0U2c5plMgQTGx**` zpZU`N`uex9y<*CR8TkE=Uq8*93(J_;4(S)m=go1uLEkU1QY|Wcp)Y{454Z*TPwACq zaI0{FEmFlUU*%pT+RR~e<e2j;*#9ejj{{tUVfd@XvpQ#KOHz!nh*A(HLaErEUn%Y3 zXrI;GA_VK{1AC|)TN#wBIWU%2iobN0!e3$R{J-d<H?C(UKV~vuORrbhT<stPzgR9| zZ0s0cd|keA^yI0t7tt1<!1-0&T;ZPsCt3J_K5z&+I)@Vjfb)eBIT+7aNayOGk#fZ> zb0AH6e%ZQkf%xBEJj<|R98r4c+*?Oq-=_pEe^I0(&y!zV*YQVW6#Uhfq&}v(IrI7Q zE?7Y0&};R&&De}#=)7mAHgG(d-x9BEMLfr9iwrriXWPpg*S_@Zub%p+zxw=wTVrBV zjZ6~<tVRAeFs^7)j1y72L-UiwP?}>Daza|I;d;4bwQC+p0?r*yx4zhB^-9MFJyuvl zyOmaF(i*kqxv{lFR{q*aD}QUrI#f<?V&vq@wP(5RsHJ1y8%$r_i<fK`7TXBM2PFcq z0A?CsOskf_uZQ9w2N_uV=ZBgHN~?7VzxT)7xp7y>3SgwzEZmJEtmN9X1xmakQVv(s z04j4a<D;pDzo2v>{6zu|bzQa109gHVNyHvrND#pJ>gO5(a2)<T_+UO5me}E>0{Wi$ zcWHms70~dP&mnRq3g{7l<!_-?>RwJ19t7Yi07Ky@pR>>g+CfNq5gmRfAw)5NzmX?t zS;yrt&1sc3iyqpVp~Q*KR?Lc`y<nO!M_5>rTcV-h<`P7<^GC_OHoJ9GPi>)|XlVY! zijYHSbYq5VO6twBN;2=|+f`^U%+B!YioK(~NxT5Y{p9bXi<m>Tp{fix8tPF!O$fwO zv`jOyJ#5RxN|t5CRE@0VBza5i%6HCge|s~KZL_g5v~O2TMP{1=o>bfIN=D>z*8h4M zn}OuqK;PQWduB0#uL%j^aeJ3W-Ms1O4cM=nPxJToJNg);(m+r6n=jI`yb6BNW@&<j zddrbVy#rYBw{bSp6P5To@Ha-!^4E>RuOe{#Ua<hPU;JY8yCHiGu9c0WdtR~#`p&<5 z!9)M;%YXmP@5J=#`%nJpsi&U$2?LLQq3N@>&rW${-!FrCFj-pf2vfaIBKsPY!Nl)& z;HB)#2%QWwdY!SYm_(^s1;3C|hgVobYfbeg((N(S$l^DHf5oZR&hQt{&ss*)*{jn@ zrougb+;PB1_%li8FOix*b73v2F{y@H2VT?k>J>)nth1+gt%H9t7LLDX`hMy8g~*%M zOE5Ozuiiu2d&uqhw6HtZF}{b7y><GX^XJc>J@Gn9U`7FLr=yi|N_2HI)q*ZT_@L15 zCEhmWvr{ASVSsO|D4j1N{f=F4Ao!lAUl=f-!!pa^M}+gIj;Y)({_-M>v5FY4ZMXvP z>(M`}P@s1jn{Gt+Rjcr&i2%PAKO5zPg9qo6V>AB9cms^U=rqQ`*nz#<x2$LS!C(FO zdtd(Sy&t=|?61;(Rn4)gSY!>Y2So|Eg;biVjXg@966$Q0xt5FGmMQxVq18L;VXHAC z{!+^f#a~(}aHqsDYJ%Jhh80sAcO_<c%c7f06@N`z>1JFayECur1-*O^vX=`Rlz_cD zfmsMqZXy8R^07=qh(cEZxIU4orJv$!xo8$W@nTrHNM5=i$lR!*Yn8nmXh$S6fGy>4 z@wc}PVi-d6=S7?FyHNbLP;zeOVL<1M`q|}#zX7lWu3j(iQ|2b(mp)*x&x}m+_wM<3 zVt>{7>l8@EUwmK<DriMnkUQq@RB!M|5LV+{g0iBpq2aeS<Szi`j||UG69z$G5tA^W zWJX!DSlN)Ls9EF&fVLtzDwxxoDX>O$gjjBeQrb6iPRg<|rXZ$=29O4Td`Ql1(wb{A zYf)~iP&XxL0C2slg({)#x;-2jZ<GN1zN@ahI`+?9H&85cIiLukGP_k<`?pK2`{TOi z43qdmm6WCN!_Kf_0^|F;n`>-WJ{dV=d__$TCrwVvPvzF+hV__vl*{4Q-#$ek1!3}{ zZdJMH@64ll6+*p2J-FH6md^lyGy4*z8+xHs0(JyLRfa+QE&Ng=6n@b?rvq5`8|eVf z;9torX^XZ%whO#1hGD=^xAp&u-2^!ddKvwT(UsQEP39f&E0hs_9d-2a`|rDZ{#|$8 zz4!}%{<r`5?e8+<g39Nop87Gpzdy(F*}h*)ubzF5iFKI1Z%r{RV_aUP@dv(kmdanf zQ#d%*-qY%dMTHw{<S3vK$C}ScdUHcjNQ)RNu5@~ZPWc$Jt^AFsi|AMQ1%pSFdx^JG zm=sFB3c-lU^dkeo^qZz57!dB-E{!%9eb*uaJNQ?hlgRGtiACuQ#0XelZQK;`xB7gU zVi)flyba$B7(^Y!GTWY9X8%2d^U0{!CA$*@?}Wd~rhZPKgZ4$kU;2MF&z9O3E;7!S zsSA;JM}gSvV^w`NjDGjxS?2)m_{B8MIgj{a(KU%(-VO-Hm^}PN0HzCj)e6FDJFquy z;aPT}{?~rYPmcBScNfE>a0bSM?cK@rgUes|)sG(ezdn8UEjQz0fo8`h2Ae5Es!FS8 zRf^FOHI1`XCvm+JC9#W~+7`Lku&{w^SI*Vzn%3lAV_Ibry$Qu%8n4+idwy+=s)=T4 zV~yb3Fv(uJYwJKI8YLdLW0&9d6fe?)-0l3;_{v?*90cIfK$jP+0l<7Ae-h1AdRE0H z0lGrjwh+NYfzOJ}PI%0IOP7-dp;zR#og5Ip1ArG28hlwbMKj&KEns$q1$1HAWG1J* zsjmPYgeTP8)7EBb0eJBPUWEZj1>oqPQ9ySCtgG}`RW?{Ek;C3GfJe-o+HCO6%F{Z4 z+lKsA0#?sItG;rINCEJi$a%#Cn%5M$adD%>QkoJ|0BsztQaLG`o;W$LAGJ&x%Q1@V z<hbQG(S?>eM2t6UwIfKXM&D%>V@t5~C3N!gF1<(#R(I<4Mg_4V8h77=zkK`6b^e8` z6o0`F>=8sms7Fct$`ST^W$RR}Bz-Bd>t#Z(N<2PmIK3+C@Zx4(WvBU4Svi$^i8KWv zd0LxXujika&g17{@)7QfgsNFg?ev)8T`S!{-$vc>v$yNI;-)-A8v`6491vIu*xnie z+-uul{k+sK>cTJZC4|5B|2Dxl2yWfJ3c7Uj>h~()bM^@90?X(Dzu_-7&^6-dzox@C zi$93$TlB?#^T8#H?!R~bop;Q;^S)31_rLzyw}M|RpMUgY!c%yiEdDa|SLs*&Mvu!7 z7uZWs{0)8KFBVrjqKF2;(WSl?Qz!u}e^n3bzS+)S<XZhrBKl%Qg|8@sPNM)UY(@G# zqJJw!-yV(M4Fq9*P^zjH*y;97_b;4Ql6E!+VCC3g<UV|1$lsVg3ts|VrYu)8Uz7O7 zZ}ocPm4i2J34hVzLO6`LUk!f|+2t>aZroVC!|>meZxZ1LM&wMH$5acd&>^q`shoP4 zZxFTCKI#c3UqJDUm6cv7&rbnZ@%P=|qKEGMefJ!5Ffj7>fB`MR8;9*w)@KR%gn<{i z=mZVi9qVhxDQ{f6@}(7c)8wN91+=q8VEm>5_se*I#`EMWTX*g~sIM^iyJy!c>sP+` z{I7rX-M{?Q{EtrY*HUUxO%szwrfM*iCm+9-a*s{wp}VPysbp<oowWICAy=&WXH~6} zwW#j=r5aM5(q!3c4Q-Xp)ToJKGl*oBHrl3Isk8%_cm?3e8A&kN_53<>DsI^ESTLIl z+Tj}j7kV?qsR0-Z=$JrLhxLL*1xAo830N!1(F6>_v(U>ro5F8##8*-5PCw8RLS*Dp zC0`o_lDh9I!f*CDqb{K=yKn$-KpPdb&NqT!oKWJYS`j#kX;TNlUKHFHfAIiqhyc7; z|C646HyUUZ(Dwgg15g4m`8yVX8-QUbT#f!Yt10ldoyOnlEf&8W!0$&AhUoHF0{g); zE5Bgz2>u!rjfV1)a@k56#mS=9SWuCP;h_m>b}f08AgL?Sa5P_sIgm^BqrL2Qy13st zJ*fdh38o~63{s&UIZF$$rMZ@_30>N4J45ly{>%bjM>&T~Ap!X@>-VmleXTtLvZrw5 zUD<NC5w{M6K$UNGq#}l8MFxn8vtrK(IT&V=A~|n%_Avd$(({gW5?oj56K$U5S{%tO zazh`WHtG##;+G$OI@nJ5&c?dt<l!2_w%4!Avdoqb68<6r+XI}bfHB`tLlpi}5fb{~ zqov?C0rB^f_9$uIp>c;cmWsQCY(Q95&q%q7!41Ekr$e|rP;vy}R|fm1>noMdm&|&k z>iLVPo|!(4K}Sr1g89X5x8M1|7r*=u-+Wl<HzSY4?@t|h6!ABHCtqaF1@M~=U<RAk zxZmKH;XaCIve;?+?C=F82k98q6ISsT%`<$=0#{atL6p{3s*-iOq2G;@4(j!fd5`S% zb*vFuYOI`8Rhv*t>EoDP>3B*_bdF-E6<aRcQ*!k<$xunWr7WEVF8W#r|E^(y%!t+S z=1uy9b`HNyc)n7gg}+F>JM{kCyia2Pe26(APGO{c@xrO22i33d+8On;@~@Kst4QZ5 zku)*G!s^TS#{BB&5ya+Gr_Y?ba9$hdcix#{fK|fq#f$GW`S)F1aA0#~mYHk1CQ+r$ z)iv-ssAaXfZ$>mT$l6}*b;`ed3$2U*%+v5ZYNj{y&UDT*3C7;n`6dZ}cW&LZ>V;*$ z{_(?q@yWXw{yS}dl_m=SQ%$Ty)?R835h=@Vw@|e#>8x(nGLN`QNAJ*rrQK>LnV>FQ zSFSo!70Svcd}o)ifb8q`&^%=We%d;>g?qHuQc^u}@ppVeHRV0Vy&)!zd_R)r&4am4 zDVtF`H~vO2EB+RMv4H;2hi>|)u4M1L`<{CcD<PR5%vxy>KJj3|Ok$R-8OFL$#0@;{ z@y$*}NW+$PAa59KWFXEhvK<(E5?3hxb^y!YvUD!(vjo-+N7mIbyfDEJe(xgSn*gi~ ztbO%j9B^<E<zJ^DyoC|KA_xI^jz2|ufH7Mxgt~;RS;i9Ua_CK5=WhdWzd&iBgJ0*5 z)B-ENroW3gvIE%A@KSAQ6Ll?ct;iJ|Q}kF^#u8I0*q<u2Ew)asWeO*oDa7r#yv=1o zU?Lmkla^}GLpAj50RpLDsE5w7mu4wk_~o^HxBiN*hu}NUDDgRF>@4ep*>c5I%)b!q zNT7b#+AjQdE)$o>^O#568KJ2nee{I>M#GxKQ^*{ue)1qy-AqatXI=d&L#}&#CVuOV z!_)W@^#YZFwagDsW{%^A?Lu!(%EjvRdSBk3%XxKzM^ga&1>r9ySh2z4+u3=5)j*GC zJy~K!Fm(GXyM8g~$SmL3R`$_Hg<#RkR>!aWb+_ZU<X_lKh~}BmzfO9j_PKg|?eq<N z@k!}aM-MGU0Y%U6Jd7`Hzxxwk`sz2nqv_SZwvoS2;q^IVfB!?%=jUE{;RW~$e$m<@ zG$Q}f>Z5&*^owAqA{tHf4xJ#Ye73hYo}0p7=}SmoZ6+K{hc5CZ#C`iTlM&#uQM+gS zZ=hiYuJn6qr3HPD;$>N7vtFf&(Q${R+zb8?5b;Y{jyV)X>HO741|xqX_|oAEew`{2 zi{~}Y55(riEdUtdcLV&*7%C@E#NrA89-ke^^vLgfk#CvF_buF5LCTYd4}`xMKn2$r zKu1H2kp9N&`_V)rfiw7+mp<e)ihLVjwsk@O8+7wFGpmsfI-3{XfzY*e_GG!RMnymt zfph1nK>n4#2mFL_hG9N&c(Iq)^WDH30bs(4HR_wuIBy5QjHA-s^(Oph;yOBl`D=Vq zY+1W}*>8UQ?LYg(ogb<0-(qlTiY-{HLG`67iPMOc=-Vov70ykBqa3bt6JcaEfyH1C zC2^e~f2kL_ICaB{Lv5keqHYy`ZFp&h(i%-QM*=eZrBy1imt7G|h<13^#DZsN)FvBY zZUgU(ly%{DCBZ9nOY+SYo3+d7v$eoN0RGr*nFa|L7pcJv0tUe9svNTLV2Q9%G%psQ zaFb<cE|PD2U>E~=#|J~jpfJ(VRGS>ZSQaO6B~L8=-d_NY6Uxrt$h_KM$z;I{e{E_A zP}|GMUYA;XCe$|r9l!uM`sZ73y_GqD5rFx<1_AgA2MxjBhR}dj0E5~0lzww8DNQ7` zIoplmF9LA1&o1hRB$I=ifxp$d3J*(;Wv_)4!4$I;u3r8sW=NBha%=!bj&Y^n)vKgH z_sg<wDZSDVn{-)l#e{0z1Cma{D#oEN3#mJ1ZwmELB;6Z!e#eH%%#qnwU2)}X=3k)W zmcKBI+jV#~<W!x?(#K2QnQv_S%*GLj9_{C4Mhk!PIxKbTz~t@O8uEmV92iAp-)5m5 zVn6KWGHwo!;P07GKQC=S-lbM%AX~M}hVhAGEoj?WULj3L-Y9z}nDCcPAI9G?HqbZ6 z4K(u*G6q=lh%tYc!rxdvw?)3Gsn6wp0~xqP+{nPdH!9~w;f7@PO8KlvTtkn*FOv@{ z`<CBH2Oru0YY@at$)FK+sh;n<`>wm@-HM1lZ{ZidjO{b?{lZ`TUe(~EpZ)CTzrgVZ z-M`D8hrbR!(vFESJB>n!yjos?Uj#@3`|=nYWCp)P{8j#iWz6~O7+ojm6;WuAgDG^+ zC*H#6^C|F)(@BOQVFG<b<VO9hp1RVB-?#lQrehl|d=0p0)>MmWh21%@e;1CJ!PG{8 zOK0yI^v<g>6h_yKB)n$jawj3&xP?(XT9M&=12Zy*9>L!|7>(_Em3^n$1$rowkMnE@ zuNX+Z@!FWbYIx<Z7SNDVO*9g){H@81k${iCjp0>B`C?`@t$%JHzIg7P=9mM%AK}qo zqsLYOJ{`;K#{LRhEbh$cBL)|%Sl_aq?;j^~0>I0cuUL%*7C#2c2u-6muIIPe{PK23 zA)6%!UfatT!^V}*KmDU`{^>(^z~8a_o2G_3(kf2soi&CimR2;k^S@OtQd-ecAM3R2 zTo0iPX~#-)$5p*dg<QsZ)2oq{D}qDhgz%U4Xh!o?l(caUe_4oQ|026)#o~8{r1tc2 zDlcq^D6K4A{H=K%7#ZW>m?ARwDhsR|Z~6#^9GQmUKHXrI1{zHjLH;fY;&7;}c6#yR zraumUSpZMLO8iI+2C4?hNGQd$hE^f1*C7i0y2u3_$xFchqy%P*zS{s;;1Z&SUeLtj zh4|(OfW4lV$vse<FEvE*X0J8!FDaY)SpzH#<kMto0Ui0b$QuYN{x+m$Erl;1ngHxd z{u0<|_zi#4{aXs?d`VpjU>n_5AZbe*6fI4bF+<8`!+`s3(<Bx*3v5ozW*tncY=Q*K zXFF-M8ZKm9OBjJ}00|hOAd3SFu^*FQcTNTQOUQ~6mz^<l$J^r)*|*zq&g0~37=QG> zE3ds46F|L!%HO)7_in@qjfzPDsLxd!M4Eqf%*Y;{TpcfbOVSMpZpZ57vz+8bk4)x_ zqsQBoh|9RaBX~jY?lUB`tjjCqoy<Mnt(L>O@8)&eg7ZBidv&esxtY80rrww@EenMc zG1M5Od3W439|Fr?s{<7xy}wQI{16<r9{Wih{5I?7reba*ei;Ug9afoRP57%A40FYA z*F9&_LHP@Z1L2NeNc=^twLbq@r#kvL!mo-aK6^j<vH1`F@!x*)+uz0S#$%5?_V|;< z-=FIG*@=&SP46$#?}`;GwSQj6bOi<|gty7)MR!K}6~J0z;dn{>!e3R->ScAe!M+1^ zUOV{aF*M2Ymsx$mE^d&|o?*sZ0@`JSUFIA-B0l(2?|hWuzHgm4A%1n5Ods)K^w%6S z394F?Ap%P)eI?@^1J74zVij=VuXa{3c@BRyAVdEQsho-sW$hMZ#~n<nfKz9jM(ucI z%gbALqDto_aPaITMhq81{DrQ(nFeNhn!-~h@-IEL=)OCD4>{0E(UtyRH0H<NlDZe( zIseXCJYiinFs$iZ$b9jgw~ig=(*cz;6G&h|osSh}azMN%-?RqPqX_(Ei0|fg%$_KJ zR{~)8tM6(8O6XX8!{062=zjM>4ju4wWb5WNFFx~c|M;Z`!`}hG?W4a}medsraW!95 zn`!>$aJ5KQHA0%WYQbp8EbRd>CBGl3OXo}k;Now!UA80EIYU#`RTDIp4@9J~waBu! zQ|ydl$0zj^ecey1OC{Fp3f)?a_*>vbFpGc|k(kpn1j%U#aivppnKc2J+De_3zY3EL zzz?Y2S`2^*U=zR!-wMRs&&XeQh_4V_b3!q;89FPp+Dt6U9|?25{6$^`zz#ba09^D9 zfc?BTEZ}Ga;9Q8C6@TetUcwju(g}d+07g>A`tlBSV7ID(b_yf~U=Yys&q}VpUrJ~I z9H#!~1mLc(R&5P`(LBrG*8kfT4SodiYc>hEK-N4T*^=6ZhodQSA!aLTVwNMur|6lm z5i^_aSQrb&_04DzwLB7v4xXK}YNM83s4kq8Ch$o*K$JzNtdZwZgy$r*vaAeTC=G#o zS^R%rn|w%x0DR@|{ob6b;{dB6XN02Ar!Pj-?NJR#`BF$+L9pJWzYXikjJ#YOGj9@- zOFjFN6@Ah3tnXKiANJgsT*008P;D(iBiz>OxR*d4wzZ!%Nx^<g)R8-6L9W^MhL>(1 z8vgX+7ycsuG6)z0tY!h7$`@6T#)v?dAbzdLpFsPpdv}9_jwV4t7y34<t4?3k&rST* z0=i6}@jCehjh`WJILzd~Wqze9TH#k`&v@KeeE)s-;P{n^Klw(uZQ<wt@@wCE_<R5I z*!O?%gC9JRDSv<Zlb`(LXFvP*h`)?ILi%NLyXC8Z*#^e{(#$hbM?rC~Q_pMkto0ST zX9#-`L6ARyTj3x;$reav;sUU%{EI;q5-rpFoqgx@Nd(+e%zA|6c$fh^g;#)z_)Bjp z9--+_B_)&Di{IjJ^v@b8*-eb*_Dv@v+QS5a8VRq9#2YJTx_<d)aLQi??lAiiR?q03 z*@wS)ZPe|gcH4AeGr!Qw+ji-F1O9@2d~aZ`eC8OC-K$Qz5!iF=|CPT^BSCK~=w#|c z+*+$L=kbrdbr!Z>yl`=_vg!;j`)7=>aF2Dq6wv2SGYK#m<WQ!)^4G~Kv=v7Y?eq(3 zpmpw{`uk-x=j+$3K#=F>cxlxd=WfCk3Ix_ShbCn&Z`(}|fKLL>84A65&GKh{`1L<o z3V&}Z4RkeOwlNgcsx4WDzqD9Z9u~&g7}fgvAldX4lQznl$F8Nl+AP~VV=7U*hTp)g zA+V*W`qv3;W5xfpJ6X0iNKP7A%b{5^=Bio6-->KaR!8kPWluKSQ(92(EPnxTQ#v<k z*Ir2n#sFaGkR49K3{?#@UZ9=KtW881l7+oOIJ4<S#H3>v)=5q`ssq>x&!0qvuMMUi zH6$6^9_q61LZw^}8FDT88}&13U~p`o7Z{qpd0;S_=a4xEF*Z?}&Q*}u6@lrveoz1_ z0{hJn1FZ0u5y0sH#sbSvCCquRzS<GM1x-ZQPGDhLg0RA`TduMk7L}&t-Yiu=w@bNh zI_P}jguel>^bus&R4d$=VhId4Td5k#F6A@_Cj4#XG-Y-ugcjwT$}-n66$R9I57e=~ z+4d@_#kf+XMsP+0h())90aEx4NlgEiRPeP>r@ReB_3e5Qe9!eb5!bl-1HU(Gdio<l zQ_LBVlZeo^Ki(v!Z?(j}K@Sx*;J3t7-`01Ygk)B40g`daDw9ou88sd10+oGS&!_ft zDmV4{$-x1w*9N*QlB+o)ek(M<vg4NLw;0=z>>JTybNMXrQV<L1?t~*lkfMLKnyH^s z2?TdLel@#t_>sORGyHeLUbi4_Y@920!e8+lmGoyntML_qzTakiRrsx5U^UN}T}fY5 z&pLaK@LOKjZ~VwzOaITm{szWZc%6KLfaB+<e)5y2e)@Ct&+zv*&n$z#FRfg$`~|FT z0hstgbabLVhQw~e2?xEC@E7-s`vEMyuowjEXoG=4p$OvX0eB2w@I0yMGrDFBs@`T2 z0t}T9fAPK%(N_G@gDQW+;3I^iC*D4Z9r9Ub5_%iK`3P3WbrAW`4q)+X=kl9}aR!O{ z+1_9HYjC)4@T<1jZJwS<2vt67fu;Yb?R59jYwd>wbLFCc*8LT)^_s3Xn7Qb}1=Y_7 zwTDK)wHp>;nUk1;Fv#Z}9kHtkR!N;c+Z%_E7k@8aJZC3w8*>x{*Y<^T=g-OZL@@`$ zVK8o%sXB-z-RxrnAvR-!A;0~<#orBU;ct3?@gc%U?9D19IK+HU>+wm6`{%u=9C#3f z@?BduuZ6!~`=cdy;NW)#f2lO1x<du2T9l2x(;KLvg3+G2Z5zc#@z$1&|6Z&E*ru!g z^Zh%iA#Pc<sDHi9lD{P|G^xS%3B>*`{wBp#J2n7zDz@)<Er}lXwpHV<D^c9!-hfy9 zLSd<00FD>v>H@yE`jD2`2dppXJ^_P#19l3tAuj8Ip=?m=g>e6q(FI4AMoZR&@K@l9 zT>&hbJAUuyX!sl5b0hJDzit6v79`}PdH^m$d&A?=<|wW|h{P^_7r|e;jg^1(Kw0wd z4Z|Ervtj@}^Z`#3xIwr8+%Q}KF8Z>J-WmQTbp3OQz!11g!2B5fM`8`ggjuz>Hl-<& zlqm~bO4kIytqi6ha%dDtYDkRbxVDFcIo9GUU8Qlmoz+XTMVLU1Xu)T?HjuCs3j+#r z<8M>u@ESvjp1j(at&`Z9TN6n0Epp9O@4pHIgsL#y%X<&}slC42#oZxE;m&jF!8y=h zVThO!Q?ELH*~<Kux0O46Im+#94mmfRpN-^Q9-5og!<lL3ow?U@(7ieN*<I9e^R@*K z6Ft0KkDnRQbH`GH{Hqtrc)?->Qkh^;Im(Ny`1ND7I)Jr&hQEZesvNq08-)X0{X38M zjSQKyj`4H&+wp5JaMwX=hE@3e4DAKZp6|Q+PIOKV`MdFk8$Y(-bAR@C-+JVq?fQN4 z$tRfh=*PO>`1!x1e*O=9Uoq>TzBgWa@r4zukRTb<g98pm0ONcZnbA>5IGaRki{-Nn z%6M4kJYqCZ)WQg2@sVLasVZd#5<y=i-cu0x^qJF+{-t9V!)M1GF~Ncor2Ig*t&vKM zr)44`(%^6-is>kyy&SyO4~8VhRtZU#83H?hA#CugENox!8WFr+<+FjgfH%BM@)&I^ zV$zGP{@H0H_Uy%vGgJ6ty?pNM$s>mt-7BFP7L2@)z8YvN0Q0UacvX#!>9JMlG#oy9 z^7Oe2!u0~ffW>ctwq#&-ev9r|v*;Gh_$EJ1yo$O5#oq8&0T|KS?}1pD??C^ITagXx zR%(64FM>JQ`b}F9<CTCJfJC=9lOk>Bgo8YVlLznGx@8^w{rf*$JnwS+9aWpw)TG9w z;<43g8(Wi5$2c<ZH@z)Hki4Hla;rJ$C3)j-K3J_fRh?K;<v_3SrNKfxC<!6$ad=7V zG>E#RX1X@V&GyiYT{g0gBK3C3Hvm@pEeJR%4_hVn7KY_-IZ0#;aGY>tHWf9{_bhlI z9lReGz>U8pT^4|$Z?Ux_b|7-WchLai2khmQvLaZrM#Eey;h6(kDYy8BVewiMElAq? zka(LL4tBJ^@?f9tg?kZHKttTLIRcpQ@!a|T1@M>QN3nk{{$dBu@4~M^W)*-TuuACa z3!cywp*K6qzY~eL_M)iH(aztxLQ%Lx;09oSi^;D>IcNZ`Ha65~08L@+_>J<Wm(K>x ziP6DyxvjlcG%1<cw?GdY7S&v&$Mm(u*s?sLmyLeNF)qfGWI`3?6gP1@Q{bJsKa|?b zY~X!-&Yam-*8B^(Q}MT>hjnMKQ9NH@REwgnk2yT|u#sx%Yh4=55<=eC1ht!G^24ue zt9|AD=;$aXhbs>oa<`tnWt?v_Gy*(3yOn*$2EvuX_eyY=kaz2Gu166qFSvqC=VhZD zi3wJl2Wj4&)Lm<fT|}u0O9_#H!EWIDP%N-?e$_ZT1GnyW1V<$9_(cZR?ke&x9w!q} zJU9M249VVL++Agw-^ExxV)Y!4>$agc-?{X^edX)laqQ6#p7`ODh`$Uziup6+kKnJa zC!c?D`SKT;dT=F!Ug$za&B=Uy^!n~#Osbu~dYzPENQGJg(>bdAh9C?<G`%7qCu+`& z-Wl^NCp^-e>TURY$}P>Gb@2=~jvQs!FV?@&G-Cwy7NmyKF_A9YE9fiULt+h~)zk_b z{9gjct@xfq{>1_d{%QdoU3BI<g1;L<nDpHUtDHXwZy`)uL@zb&yD)$DtAal5{fFK> zhV8Tdn@=5ogT7h$3w-&{3Gi1}&uE?<`&$T(9L!Vj0(@b-eg1--yG%9ca!g+s%r0CG zpNq)nPR5UjZ-gZ^FQY-V)>z^19&YC7V`iC(|4CkJ73h6&IbTFCt)e@C;n?t30&4-i z<yHFyu)rc`4(;0ke_wj`$*=ywqT4@wiT=6j&Gl8$QsL6rOln@L9SiH4i{8-X#3qzj zB~23cnk*-AQ7@B*s~UxToVIWIs!&$D@D~8vbhT!vx5jCf*>PWS*u(wU^rlCuwHqBb zauVQ4w9b7YT<imu0-e7AxT&CnUjcm8tP+54_>j{uI0zUkjxyrF2+I#<9Z)ilcl6JL zA=OB@Eg`p|SJEb^kY*EQbrX`A|AYWbTcDljA+m3x2LLbV00y@-DY}n!D<)Y5=LHSm z-mUfjru)|qe$~$(NBL~1;lIp4__15yuLjV3Ek*rohII)Tip~Tu(rp1)skitW4EM;; zmxTZ>bQgSGs(?1934Rn!0PKfY+F}YwwX}#$7R;2XT66+i=7x9+Xm+w5;(Khw*-FvU zRcZE$rV$pku6txz5m^eiJP3;_&3U@U4WF0?uF^cg?j`)4l*ZB4toJCg0C?`4tFF4% z-$O37{HR<REvs5J6y-6q&2y4y^3*<kdxiF1{e33u(F@PmtX!Go{ACYUB$q3857(VM zp)X=S3EB#Y$uC~9=3~O>4MXco-oL$Z(z#vN&V_kze$9L-AOXwYng{7_h9F@+Szn{l zcS+~3_(c`%03`97&flQ}SV4Cf?>q1}Y_?yR&}^>)-~qq-er^IVo}ST0Yj^dDCC;^Q z?|iJD9d1D3yY7Zt7JTl1{LMEozWUe4P(MHZ1k(=w*oluE{+qcMo_<FA=NGkrhQ6yX zA*R>SK|9hH^Ccu-@w?ygMwnP3CTeJfAa{UKG>keTxI7du8pq)*fC_V2o;pLXE~9^u zevdio7it_idPFZBM^HxVfeOPb_0$N<YM&$41;5fMdtos`Fk^q=FG^$-vBg}`8xkx2 z()Eiq)>>G#X%l|09D=mz72R%NMdqV3kKk5@RVmuSR;-_yIFKQ{r%oO@$lK5(tO>LV z_g&%dZq3XHNcIHY4;?gqLy*VqI6gz??!e!I?DW!uLkupU4<knNKE8|c?;)gVvW+di zD$1!gp9$!nk$-us)vH!6$0Cj%;1#RaZ^jE{CWAx;y_pw#l^<m90k3xWjXlm7yyDr% z|K^ML-!@i1H~m@~A8QODD>vJIs#BV$YNM*Tvs||$@VAuB#b1tu$Y};+_(F^qYb{nP z4Amsni+YwOtMEI`-%;bF&bav7nyL3{tvY|Z3_V<9(zZAL5+QZrFe6}G0)hazh|tJe zEBP=>0hlge>aiwR0Qg>YSfFzW%3SOwAAAsj5}xr@O#pWlimy$)m9>&rq!x;^wb;O= zT;2~;p{k38gax{bm$w8qj3Th(Drus8Zp_v7BpPY>3y8hUAOIKTc`#MbOH1Vzmt7iP zaVwm5FaZPny%j@D`KtpCG^&0K;Q_060T+N}sYI2n;jip9L;>B2n{{D0o1MQwc<5XF z9Rs-iUVerl0gqeYO97mQwPdk@mK4dhovmTFMTZ<!ZaLISsB8BO<E?(_I#SCS0Jc!u z^3R<R*k^7MaC@2m+=}veDS`Rw;|I8A4$hy2$p^<765_N))u~>y8g5&pNyhv&+S=Ig zn3|dWEI8zwdiXM7%-=~?4GD9YbG?9(lgqjlHuk4BlkzsTNOMs99UQ~A!;>?R^f{^T zXPtL+i^RSr!EGb>V~>YXQr8Ar6KGAa)LrSrJ>9=cV+3IhHrVx>RmZOgRtlbIm?IMp z91eXy>#Rt2|F*v0@K@3nckK+;<|@-L(Dj?1U+Osur+K$!utA!~8|N+k!!Q3m>Srb$ zeB$x%Gwtuc{U~F9;V<~r`ExpeA+WO#u15Z4)T#bAw!=F3TlB^3883=a(qibW&CmfA z(ZZLYqYClMfTLp?K8L?2fbeMqOvws<0WQd3dGs(8V)Ljo9U&t#J_$WF0`LjNU*uh6 zYGg$TbA;|-K#a63f7L%TgD-|ivAAmZ1-|lkP5f}I+rk_LOpTNwz?)u0vP1&j!$=+c zTj0ooaa8)caPaSmQyM>?ef#*E+D7p`5&oJUH`j=yOs*JvZt+W3t^7rDhrfvIXU>(? z^F`Iq?-51^&Ye0gf5opeLq!ZG>kg{DcWy$>%IN^cKc=Q-yvdq1tCv5oPU5APR@ws` z&(D4mIV&@E>AQBn#+A@K>_uh0an&>5|LZR-xb+hLR;yzbNyTxaRllsO(pjI<Oj+;x zUm^$o5}is}{B1j_h?nE9RVK|=+N)}DCtbiZ8ZDZpv`(#&x=d3w<Af=p!?rD_WL=^! zn+m<*uL4+!ysjG+rU(p~6@ah3E)_WdW+p-hAqn6IA4>nxgSxYjzX9o@79=bYuI$XM zShkD5qS)j;P%j%eq2dC#2!La41#YJR%#nrpV^Q*McYq~;!(Wag6iaT|&6C!%F?C`B zkDK1#`@IQXE7d>Wb{n=Jjz8i@)d5H2Z#2b9tdh5a<ZS>h_7;D;Hd^A=@vygc+XcK3 zw$!=kObNJt##S1Nz&5W0n$onUy^y&k*tn+SgQX#b&^4tr3ev>(MWt@#xFRjX2`SWG zrR}w}ZNIQmiX0M9Gi>a$^64zZjUN_kz8)q5@QkAQUb~dYnTLqM{A$*$*>h*(0PFJn z^)W_TXLHKO3ho;6D#FNm>i*!>DU{U1v23uYJegjaVaeZ~OYYkm^el6$F5rp%Qf-|t z74yn4jbF0NKnB(-d*cNs@LFjyrU2}_do_cXtzEYgd{G{cU$XdHs;l`<;vN1jp(4Zr zOZYw{e$ha?j`Zuqg9TvCt}2wcTRpxFzR(%=8k+7I;M(~scd>ph{Nn41Z3Z1N(~&*D zeD9{`*Q#cry7sz{-1oUZ`<s9K&iDQq@%QoXfB*3(pZwvE8F=*XKgats)>pqm|Lo)o z;@9~Xlp#0j|H`=sWw89UYxFh!Z5Xh$!WLLnG}2+=SF~Vwh1`qqdlZ9aZLf4ZiTE3^ zA{Fa);|K&}X~%B{@*KzO##^Te#oun2CC!81!^aSnWtKDLqWH!|qe7s4q%pWs`%HH! zdu*&;<?Kxi`9)ES8%L<Tc`N)?{S3PI?Z&sW{G}@!_AyH86b`B`o_*_R#^&;Nc{w^_ zQMzL@y+;urj~h@jx?%=cF=Xke4}SFI*>}!d`0cyQw$O(7UW#B$qld_g=P-cwJ$xs% z^}#Oc10Ex$*AcsSJN}4|i}m7n4PGVrO<sJ_9$>~(*{6-?4TnDSlaO>D%6WU@cOw9= zefrVA`uu%Pe`KiUg=JN#*1q`RYJI7Smn|w))h{Dc!&nxBO_ifWR9s(rlG|L(McOSZ zONCSp>r8L7O7cykMZ2ZYH44=(jT@)7J&qcs&t|_y(sa9L1>Gk9W~1YGU~TXlCd{Pp zl?uRfuf0J{7K4!ZjMk3Qxd;WY1{`X16@81p0CiD<+y#AtRud{XNHEe+5H_s<Hkvue z6kz#8mx>i&Z-t2pTK0|r9H}?jXU@(AYT)mEG&IFuZd&?h1@;&|yW&~xa<&_}`hS^$ z0c()(cL1<+5CY3kv*TB`cK(LB4ZmzxcX0SSCNO7;-CDVkK}e;9&Igd+Mg13zA%IF~ z3rTBQWk)p7DNt3wT&5tm#SmL*df^_T8?K>*1y_tzAvJj=vO-vH-SeU?0cTXD=#_)D zWjQN~a~^XJ0kNHjW_3w1o>@XK-S2NdIf4Mp0N@XN;Oa>SaFL}gt2(u3shxVL;CD#m zLz{b9n#_%S()bca8`^=|F-KY};ATSQRr1OGY}8_Mye`C<{W7)o>Uo^{HIrRa3l7%4 znV78}QPDhY`Rp0<*C!@;W_wpx?M{jD6T=^}EU?r+GXzN=(5bjf38;gtyiM;M0T}*% z=CkGb3URlM_bmp)+?tC)5jaSm;I|9F8FK`8<*$9f4*nItcKk|TojprmEFD!eRnNi= zw=em_uYB#>4?lwSGePs`A3gQcpZ)yjXrSe<_;vP$7o2|q9WHYiY>4=a=nH<gqko3K z4)kT-UBzCp<PP>p0HgvyK`qOu-=oODD4*^4g{+|}9l$m6_sydfkb(_J!Z47|;l|%n zZ%6!9NYpeKRB_FtZ;D?Gj*lJIQW#@wx^T<8Ms@zKW1uex*7|uh{8e+#a9K3eL~U@e zk#i>QbN++f+vxnosTa~C{5^b(`<^|2{>%x-;7ZyW2o&+x0aqDlW!LY40|(;mYybX3 z`pxvIoVCHBMf#W=C_BAzzQ+Dm<oPov?ebPd&qyjIVQje>LaqA1j~NF?k+(?q4D;QX zS6TkT^UpoUuks?ZAVFXHy4P=fg`W8BLKtTv`$ReY);P6(S^j?R-dnM?oAB2*h!Sck zplwSvqQbCtSzAL3Wi&h04mD~Um9sphYGf^Kw{oPeRu!c!sTo$PG*qq4vaN0SowPn} zYt|+0((EP;Uv933cGAG#0&rU*^V-b!(D_?JZy^`b1jn_UkU2fTnqb}NM1;3?SF*xY ziPAc(Kv@6|P7A=r*~P*Y+6KUG4G1nE6S1gJ2!9RLlPiDKEeFOW?n>fdxgy(Um@9cZ ze2rHCj`_2shwr5v_i@V#T2m}MT*6=7W}yzdUH$WfzgS?E0anz{Qvfc3Rsk5GmYG!p zZ>+F9oI??j+s*)RHyVK5GQ%aXze@k9{R$&=CA7_J3QsGfqo%(wDJm;)s3DYs7{HDb zw=^l*q$>dTa-M|aQ%p^yg`7ndd=gs`*qfB;0Ts=VfkOTN3&58v`m?WL{)MZqjswam z%(NUCQI*Z{GZpa0*lkCBg-h{EoChl81@oT1YlW)lm7C_sB=i)?Bc5S$5i{E0odd)| zrPY5bv?jquVZd)1iIytI`(glWd!O<OmdmpkjvAdup?!-9w1f9=zn#&8^4ITX>g|%H z`F4)jtNg11`V;z`{7iQ|sm9q3UY0_4=nu|r_4}6iTl|gES+N%pxCP-$44P-@OOMYz zdV1B)G4%Dr;<^vt^V$FLRi^#@-oHGG>*pshzry;NsRw_?;3N1eeyji2-rv=XKH9Vi zgrR-jhBO9#17NU=@f9{oU>KAEtEisE6BbIUQI9yY0-l{6{cDKv6+*BESUA-<j%cgu z`G_i9l83EKe?YQQKZEO&5r6fLjHvlWjJZgQ)JW>1$Iucp53cxqd1J;GF~FA~ezCt= z$LtFL*q&?fi-=78`Yl^`?1(VCpXuuN?RNC<%gn#9a~D?JhmYfz>+HFA-ahIuTGh{S zC&D-+fW2)8z1_f311t{M?TyME{%Sy`#rCN)3@&>2UFJV}FXtQQ#$ZOu#;Inekzgnj z{N?o=vV{W^hEpHdvr_{%4YcL23h31<F-Cu$VPVWlwPMYNO&fT{4NL}%i5Bm~=wx~W z@HxgrO4z4wS@X=JU-{g99}9nNSqN4k%0T09t42l4syAtTKKQ{@z3{hJwZ`8Zr`j3a z`P=FyCIuCnI@qd8RSqh~+&SSd6>ct`3uxz&8))olb7wX}m*N-f7EgZ{e=l<#G<>sK zJ8y??xw<OTt3eqG3>tt3^kzc^^fhys+H9DJ5MS<q5&NiClhH!+F)ij0Dh)7~5dM-T z{GAD46~hg{VX}jIW#K)gOfK@mR2mG!eIPX<JH`dVBnx)g72WR1-Xv0eT{p>tweIPB zB>-OnqmMZ69=d;>02uN2qx#>VXz*RmFGDtV187;P{AvhNYvIly^Hx-sfyW64@i!Y@ zD*~`o_mgJ;a1prC*IwXALq%U&_7tgB(k#A~;VR30nMfYrVEOJLdzFY%OYx@IR}IL{ zDDmjDq-YnaQl8RGOhKg}IO1<3@OvttDS|T#`0v;!u>$b>6@RO%xl<;f3Dyd3*0097 zaa9||_ACsN+BAgitg7pyWxXFuLw#>lP4AgGy{>dEW#ezf)ip;?6hU<cdMCTmw@bgl zFR$s*tZF+s&ZeQRTibm}T+Z>lN?~b10xlnvx0U;x3_n8k41W1=b_7F0_^ab*70-iy zx#3q15BQA~ES59yw*j~-pfmb+!e22=$1m=#(2&u?bT<`^Zl0UPZ+qAqZd?2ZU-|mO zk390vx}JQT(MS58{K-#|fbIXa^Y<CV-{+r?2M)YHZ=(A&4i6b;3xoCD80%-iq#UgI z71qxnvN}b<7M-au$#BfBU#+bOjl%G^jVnsWE)3R$nBbHPYM&jYB&ScFs9{M^ifcFN zH$FH>jNpl}^<I>%;8!;k2<dpg((x5yaHc&%XN&N@ZUernV<)_6<EB@4#C)5%jO6d0 z?Jw(&a!2@k=*US-uHQL(3h~!LLE=}T9s_8nVZcUfANE)Km5TlF;QIr;JA;uO5ygOI z9CtX;;Dxhi6@xDmE}okL^E>bt?K6t(3VyP1Q@wt`Uxz%|$-YD1A}XMnM*;vp|J<_Y z92mBGz5HcFwjNP<HV1+suk%^LnB+LXdiJreeD2<lseT@{RTNE|o}pQ(8b>>qs$;FY z?%LvSYSeWA$jZk#*>`!v4QUo>&y00DDctZPb)~cwRu19I|5nkgZunZLW{bxDKgC~| zFln@M#wFYyUnfmo^v>z@#ncu_D+X6rXns}Vt`G=?F*bVtL<A=G3iliYtO*tqA>oGd zqqm@ezGFV(<^li;)KZflWZC$uVe=woP66EivQfKjv$2tMb`UROj1dS0zb%ZY+CUos ztA+-yMkyLQ+9)aAYylTo;+F&?0T|lmQN=Fo<!R}v*5XU(&%dkj_ah&%WuR2>Q=vt@ zn*PT!fR>mLwIDnJu#g>Touij70RP^kkNEf99D-LW`kLdlsqvek@u>i8v6w>%Nn4vm z6(`YI?9B#?Q79l+@wAMF6>hkdbe3NWW{&iome8WzH(8T@h{%Cfrd_3}Z;vJ=D9II| zFX56hnKJwT8Nk;t{^-g%)S@DboZ(KOg*PCo1yM8F?a{;9(`u)k#wzD$?VDx8g*&5A z33^stZru}m>d=rRGFQuE)!luHJbrR33wM)iE%VxuB<rb%9bcTcNPMo?wq~rjV!Jj6 zs?$RLT5a{7!z4(hf2IxuzY_vG0?FRr>9I%M<5iT=%DoN4#otNyFQbnPcz%xfTk2;g zLc%j8Q!QZdNNu}!{vCGml#vB>%$NV*&GSF?rN8~wBj5XHW?p#g2Twfyc*NhI)bJw) zA2Igm*%5!&hF>whqPw(aL83DhHLk|NjlVVc2+z!Tbpl#QVobCEd>!?x<~f6n7=h#n zV8UD2H49zLjxeK=rVgD^P3@EmE=UKU9BHIer*yZPs7b%XIs{nr=h!~$dom6;R<A-? z&aA&o8H6Ov=wGa%H`@D42k{1`3)%*Mx8ghmlG3-kYa5nXIMv)u*Y1HsjQ(W`qcbNE zOVtP;<V}!8k#rde>{w^@&y03PNEO}b0GD`&cxjwJ({;=MqYLNHFnhyg=!<6hT#XNI z2hYEKT&dst1i%_pL-(dj*r#7@g35-iufB|Ncli6lbIX>|F|d3U-P_8)3<=xLqwz~H zHu=CoGKF!=*i3I)z3ls6`Rv`dz~7rj08RrlX@gSxs@n9bn8CZYRiag?!8*u3HI_=2 z_NppvHcLu~M9tAuUTTc%s{T~B#@|$tYOq+^Trt_pr6TR`5Ey_1Cn%#`($-D$7hDIr z)x_5l0oecG_X7e}{szD-iVcaE#U9ZFS`)0fAB+ZC0MEN)K7uNILjaa&)t?$M6PU)= zv*IOKMeH@EhX}>SYT4{@&u5SQ&fmKULRdw#knLfC0LJ-b5M2DFv$zA8xd%IcW4dKx z{_5s@4fvR1x8N&&eTGmQ^)vI2;(wBs;lqBJ^J!k)m;-;w76~dkFBO0%60p=QGb||_ zNqGQo+wc+-{#Jf>{&p4g1i<tH+rFmNt&&7>i{x73D|~Fo9q4MIo&Y#yH$0%=4ggN^ zwIrtqR|z&{i>kE;>q?WgrP`}a0PN$XG^a6j(Ex1uoEZiHvoZOM9B)sbF?-IOSyxYq zdfZB^^crQoGJja|*P|2Rp$e6t@1;K0`R&E4rgC!fX|y29SYQ9W0;xIF@^kuB_8NZM z8~CJ^Rl%-}!O#S-(GNA}qm?$Nu<*osPj|Rru9WSmg;(@Ki7b@~l@>RYHF&>|U9dWo z_}lo~<Y1j|F!*SMV1V0$I%xO!Qv`OqB;bG-DHkoY;%>9Pir`Be-X=d0*_WPQoZLjk zM2_(S7L_^IeRSb}`OANB;v+^M{owH*FaQ|!GXV>%sGo8DyzJR!&p(f?&vMO|GWUX$ zA0dem*h1-9<A0@)@~@65&<ekP=;)j1p@H!m$g;;7+{>t61zLF9h9F5_haPpsGEyxt z6|^dG9TlvYtgZChZyf_{9MnG8E?-#8e@&H&%J`syHQTo_^8!j|JWK*!=Eqg>taw-f zNNrKc48b;R#(~#1Ca&MM6IHTe?ar<87x!1rUi`*!46e_reeR=|;VkL)fkfVNcQox8 z<xC%|rxS_HiWM^wFz23e`riv!K~KBh7+8Gq9VRv$_I`UF1881dy>pj=9rT0%%v@6R ztCPb!(UfoBf$sZN1~;RBwgdRtXXS5ZccT9n*OPeOz)=@sIaeXO4jmv*UfH;6*$=+_ znfXpXID@|dDy6}yGqe7=@1J$A+8s9%VU?}M%eH8`=E~m$4_ND6RVA^?RrRut^vWlG zL(<mx1g)cnXw*~<hf4AV!1A~LJVPE&%h8@}Yp2Px(r+m{L*MW>@^0sEgy3RAnH`ll zOll?IIoI+5awDJ8AG^)zRJ4=IIN$;s@}#voQm<XTbh$SEHUN(l&H`BeDkXDLETpIS z3xem%VUP-b1uH8=+Ttk$W?L@9Xe8ejDyiu_%=HZ*9=HzxUh0=ZFq|&um|xu+{yP6J z!+&p5GdA$|YIOw3mGD;p%TXlYT24gaY&F>z3>SrsH2o+9zXO1;P~qSw4&O!obtu^z zQJRs_sFNy6YGEw3EG&vuJT0QZYaOtdvXxR;YnBOxZ3}HHqF%y+>TXZuI_3J(i{va8 z4S=ofw=}0XXO;3i{s^Q@&I~D%J(8WiIbP4c8XM@@bLZlKJQYaPas%ko?jEG_2!&wZ z!usYj<w!-dti4($Rh{3npheYgf5BRFXew8dLmcWkRhvoMvb(aD=TP_MEh~$1b2iN= zLQ%3e0F9Y-Xlj`=as{G&k$$yyq1x?BPc8h?$e22BX1OTCjjFb&g{%%sF2mmp{>A!g z#NQ5ISgXQW{JI#H<#+>s&tDL~D4xOZ7t-g8@N3E#JuiA-!97g1fZbK8o->~Y_?<m_ z?uW3x`m3)q^TPjT^wAH#|5(j^6z?0s?{A)^m8YK(OIv0iM9W#`OY!#~`f9L*bk@Y* z^aCG&kQ(1YBPC(y(L0Le6(TJL&mfgCNa&*Dev*BsV$f<y&efEIM~@t#w^+S%U=4iT zICfP1vmz#nZ5XYb{04GjHi7*iC)?Y(Z40t4I&#dL8E)jXgKKe-Oc(GP|BEP`CF`AI zJ#!B_b^WW%Wdz`M@4--s!8`Jofy@WrJdXL*nbT^YLD|6rgqS}o^uk5Ef8ir{MePlL z)j#X~88?!=1M;t)E3tmQP!2edcV~#f7tfwLJ+i<$f9eEZ9qsLufU#Xex{k@0y}-M7 z7~t<NI(T`V)%XH^{<-I#eTI?Q^~3OiflR;6kxCezo0sV1`6i)PyZC#T(;pEO1JZ`M zj!4`1J6!{N6O}qfimG$gwQ8Mg``oelqSm?FVw|LqVClEzP&wAB$W-O(0Hze?e{Xwc z3bd_t8lhESlbS!bCM$+))PBE|?DdZzd9i?|tyiMWO3@b-1OlOq&=tQ#7AHJR2jvww z>OcZ!9-136nqL9fv4qiOl?V()BV*d}Tc%b3j_ulsfEx}Qm0*<oWk*pI`B$3K8Ecq7 zADu7@?_n&fK(_hh5Wv|N%thilT(Jujew*l<XYd|*x-x)95RTA&|H6{Fi@zEFi-mw( zyG{oj=Ip><a$-c$u2Y`D-=Q<Oi@{_52E~=FNYYL6HQV_a)G_$`2;lZ}`@w@SS?y_W zc4<*9tJBSY-?O0|wgYGjDly~ON>G$Y8BM88Lp`~!iBf)ZC(ClmynESk5x5L|v0#gn ztdeyW(5X*B%HX6}wnEvX`g)welkpI9&8!$;b%2o**&Httmse=dGbFa+jZ-F3rA!@d zAa1YU-p#$?HCql;wq?nozL(8OQnqrXx@x;`e!AKo@LQBjezi<9|Hi?btRKBC$Gg>> zkbEjdkX%23o4&UXl70mEi`t3~U@bT5qj|~Fr7^!s2XGgEop|umiohb)(E5TEb(`<W zf^Z!b$u;Sqa|)t;4t-<%%s$>WKFxd%8a*#W^Bnq?>KXG2-<xt$>gWIUkKcX-_48xj zf9z2lVB!7B{$HeDt*@RtW<_{I2&7GB${sA)04(gX`%$Qa!={6-4ge?ZX}VeSp+ zD4_I80f3L<(E@1}X&3rtx+9dzu=x1V7!A|QN?N;hvA{Ztq|BHjY_BxGa)SZFCu-`2 zH&CsXp%eTC^hX>MjJcAc-gdk_A^C2=CGsZttG*fPVjjG94HFT{-;H$tZc!ZORh)W| zmvGXE#^0Aq{$;*Iz7?>)I_cOWf|_PoNY^&hr2|?9BW3c)uvslJ2$#Qp5WL}gGIsdl zyXVd_$HGO>d+9LX3ujK9j)`>1z|6o<&PR~$xu&x(9ORxTw(VNpx8JT`gnR9-cW&LX zVa@6lFFr?rzX-sNK~lcQx5!o<StE$^`9lZ#(Kq4mj_9BN=cg~jUn-J~)Ae{OuO_L1 z(>m2EVPb4{taOdA>=bYlZQ>DsZ6fQ-lgh|OH2_ozYD=$TrEE$W)Bp=Z6aISRW4m9W z8m!hh6=$QQ4jN={@wWlE(Ret!Ur+ir{@TbxQ-ajZS^xyIAuo#wfQu0x|9}E8l?CM| z{$xu4)(;lOlmM>4i}0%q4C^E-3$|RTqz+*dS+RBGf$+CdgH*eJC9n2Sck!QqkWGNX z;V`g`0y;YA05{$y-6|1z0fC(b6aLn7<f(j0zx&JfDvwmmzk5FFXRI=jfBX0&1Ymv< zGSCbw0hl}*6SxbuA?yqcL*K~Ai4L_rH!1y|@j86<B-8m7G{6$T1SMcX`{B^OCRk{y zrL{#(8=oR)d9+kcs5=E<b{cqx4U2GvTp;B(AC|c&*Y1Z|w-kw~+qEjtPwkYcNAn?l z+APUC3ug*sdl^=fH>)^bm5`mj9;N03WVRC!UKs<d5Ul4yL)&O2_l6{HR8p4YSq?NZ zW))2O&K?<OY2`@8RSvYA7-dYEU$*?|+0-&6SFA^Acb+^lTV~P_l3C{2RLkH_@^E;8 zZ1fV~&gkVxJ2~u?y;`o2?+)J2-?WAxr33g*edk#3tOrWKWqkDsJAbi(hP+MuZQw0a ztf-m`xh42U1lBf7#~Xq-iwM7k;hJOcQ=fPUzj*ZWFws#uei`0J%h`H<?WmZ0{Vn%@ z;V=H~n-6~v>#Ii}#Q-b(1;0Q4B?0TJXPznN8_fL+&783B<yW?p^DD`_D~i#M-zcEz z1;v8|%%wL|H8dc=>iHNl?h&vHMo%8Yt{JuSTTwkj)r>cSJ5m$?XM_?Gq_YjeUofbY zOm{JAYA%N{G86AcM{SoeLy#1O%lVZv4{q8(N9bnUYsg;#%-|yww(ytEU|e2B`;1K% z{N1|Ee~rI-zrwIgZ<;u-z=-P98Fb#6vKY8B+BceK@QX~3Jp7uP^|-xa>@Zjcl3>p_ zX8wrdZ{hy=g4WMYF~~nBVVDXR&Yos&!$Bx!0Fo0+*nfOT0UyVm@HYdG{HO_kHFaZ} zCi%NI!+)Q9ZW*?5Dkta}z}9TdnoU?>p*}|uPM#k-&a8%-gl}52?9spcwEAZor7Ucl z%KR!-$o7VMqj1q0IQQC4ZKNjl`Zlyr6z?SK3yPQZ&p#Kes0sdWwTv2L8)a3A@fAHF zjlUhblO_oL8)4EOr%|(AtJckB3nWv99uBo@w3a;0oaR>kb^Z!k+WuOJ1%q;L<8R=b zcotDWqb&O1b&LW|UlM}}vE{f=Cl^%bpbfAsA_Ts!L~ZSGy!N4SkIgZ7Et=V0h$sqW zK`-;9vAFZD{2>b)I8y$txF3>jbpaQF8+->9H7Mq(Ok?oU59sEDXW=Q>2!K(J6Z3$x zA92sS7!%>}qY;0vEB=<g{)*(1qU%Tm7Ow7QIjEZxA$_L-oO4atGSn;uz~p~|KZ?JM z0G7b@^Em{mLfTZC-4rRxXP8kqq*Pj_yNKJ@6`A-P9^wa(czP?e#<59Z9j-YXYe+U_ zooYh&OdhZ`)bWe~uun|GYQgk1YFRHdyjks*UZ%b5q?iu}Ez(!M?*p?+{p`KMni<`{ z^$f!@+^LjVnq?leD(0C}t=%K!Kzo<GkqZ;&Wj)ZcW_b157;+~Ylgzum-H8>?(QZ%= z&C(nig*kRD1eoJvrZyjotM2{IP+aD!qswzbqJ0=k3jC$tEgits|4XH?#%h2icAN7J z450PBf%xkXBtRVbH`FcMHkp@IQ$&ZpAurHX_pB65WTt6A?+ksZ_l)qHe@8lgOSwdg z*vbgy``R1teCUr*KR@zMT0ax$0=EAb_gBCC<u88m%U?bH48AvP;qfzU2P2)Pm@naI z2`3NDEAi0zTlQDXzaT^8FEE9^8b`_B!vaCilP8!^5Tj>$bt4QP3qMO`t>_2(w2`)F z7_s*xaxfHTenK_X2-S|o)%w{!;s|-Ayhi+GhI;%n!rzUX!SBZPs~N1!GiwZuYzT{) zae>*7@H@GN5c!wR>upZrq-QIgJEB%+LWUi?_cQ$Wt<%^(J1ehNP%^NT!NIPct$7UO zdo89AeZ?|kqSQX)gyT5VH8F9+xl?>Q6o1bTq-_+w@Xi!}nE{Cb%s9TH|JZRzIPRqX zw+8;A+Gk)hZmr{;Ygeh*SD}AK0WE;}eKIc<?}+bbKPUJ;LE(S=I7r{WcgHImS3mo& zfBvcYx7?hzXu@AwomQ1trAAr-t%7~0s;o6}6eiVk6xlZ0btV@{qhYnP9;KcD-)lO2 z!(N&z8?4sw^fkNF{G~IjLIJq#WJOwK=o-Z|T%b4P^0)9ilfQwj-0l1YF)}#2F54ey zKmfk_8X6TorsL0D0IL*M(W`Pde>IO0^_$T6%Z`8svyxENbV5?l4lI_8#L#8iSa`=B zcied=e*#z*cm5WD5pE;hF6>>vCHt2A8zL8f3(^9Zi`Q*@!e#}{ZMktD{)_yJ^ecbq z|LqFs{2=f*+Iq6cT#4k`DJ*~?>NJ3h$n8*8Md><M{+hLw+o5{rZ}3|L?mwG9X(O=Z zrZuOQOxsn;TN8Z?umggF2;&-=+h!+6$lP~&`OUs%y@=CxCzYddrd1Z6fD`LMDAbg2 z%Xfk;D<S2%mFS^3w({Lpyrt!`<Ja%Z$+l@`&Eoy9{($0d>QENm&J1YTkvzHVBH7gv zn_a^r_eb|C72WH;X_U?)GY)T@kCe)gQSRjRLuU`Qy<&GRoJ;#V^^b;0{<JN=zsWc9 z%7!5r?mKOd=nDPC`~GNMtx5^O{kj}>lT~gne~~$Go#ViTyENLUFXkn2J?WU=NWbD& z>t`0?ccOwW?2eb(K1<;#={J49db#o-6#vA7j5u1Xx2wA}yK<r<N+e$>yq@iyVb0v^ zZn^)z{P|bE`Q7jRljhHezmMVmO8xWC{{0uafBuzYf93CsXgF0qJ3vRHXT(G&$rW5q zOsh#Si{g-dvSlj;dn-7l5m?g0)p7LAOzem1S<9*u4oOmfOiwX7Q-}JXQKs)#r_bW~ z<lC7Y3GufEAiW`eQPIkEU2q(&IU6$g2sFuG@w=IsfL5)<H58+e)}wwlloPCV>Y`Wc zMnp?!c<XdW8C3*-A)LnC^q?O0hK^~{{K?K;RLp30wRcADg|w{FO)G!FFE(d2E(*IR zzA;XnHQ-*Pgxs;Ss{-(abBu19$iElgk-u7Bg~3q&p!{XpU+tcm&zEfG@i5rlxicna ztMUH~f1g{%FZA@Y&o5u;#E^7+BLMTH2l<9EYmdBnaPRh)*ROo~fB)Gh=ihQuWZ&X% zs#H~;v^!KALfW9Jn61WoP);XNwO1aYDD@K(S*IpxyG}|!_0a0lDn!h$D1Q$7wQCPz z`kw$rTe~zRF(j^<C5|`ZHY2MJ-ij8$UTt)t)}U2GCwURBSeD2oQ38S@LT$?!8PPl> z!U`e`aS+Wd90l9}j4{U@v5#7?U?B(%(IRCog2$ojgtQV+{+3t@5F?nHNDLB)QE_~4 znId!LJLUmlD11kz4et^#DM$r@gW%Tj8_BoCU-|3SLf{O57ka-3ivK11`qiI5A2<BX z^n=`pCL;2$_5n7+*XAb)f5|YjXUL2WU^U7m=StzSy&Cw-ZjM(Pxm#Hq{tDpQ;KKeM zoxc1={A!&;{+KB#G*rDgZQ9f(qJ^>}S(oxW0`COCJwAmVacB^S!`l?#9C9lgENU~y zj2rK!<Y&=j%$WeL65Yz;q-du&XW?58@7begL|}cz1cZ8@<nq>{1ejSj&1XofWWBDn z2XnU$8<Cx0x3*fMwi;^kP^*&zzIT1!)QhLS=ZN`pS^PS0v_$WLJwu+l8h{Yi%>)h* z!K=;9N-PzOX&`!nK-Bi5z5Fzbd$b4Zl*H8KjPyGt03P_;98gjZmOl7kOt7Z#`zeLs zF@8%79@AIu2EV=USK*g{-IbEBy6Vp`!><l$Gs|E)ezkfw*8*RgJc~9jf8$-B{Num+ z+P5Epzmb27zdwrmEBMRkBk*hYFB82ZN^abQ_-nr}*n(PMNx3mfXc^3~9q0s?BAluf zuAoX8btvMiaxg=HgWvQ8%LpW8#J<-MoXZ6iljk}n3ICMz6UR>n_R^}KA-5LQfI6CL zyNlJcdL!gioJ7gr&71O-zzhuVSB*0gFJiC!Wl%8MXeMG<xl(01Zj*61=^Toxc=sqg zzk>G-2lMVdcoZYCay%K~msb_iST-pTqhe>8Kzp~L??E<sYt}%M?+3b$`D$S5LLFP5 zI)erDyG(;LL;k&Z@%-u2<FQHa;DZEl{t#$KrlxNh9k=Ai=Z5~pw7_~5-yrP3U+l-| z0hYhdKljXUe)F5BmoYn}@3e-=2Y2$D*nfTEIGOwA>-%=RykX^U{^?I2y7Qwm`0JNp z8Ww9zDr{99QCm7b_DB2;U8$CmH#Kmy?lsSP%egt6>Q^7{)-r1mwIsEUs@C`mH3f0{ zb$df}xizgAWmXDPcu4?mvuj$mUAAD1f#$3?bBezj*@nJp@oD&5Xdno5LkUR%Y(zv4 z=&8F6G!ro}6NAGEZ@vA_`Sby&6Bx?DQvR%U_sg~tb!D)44P%iv-7m$kQJ&*jq-aBd z&^$X8!tL|s31GTqUB?pZ?%ayIg}>252f!oA*FyrBUgCxFH>&Cf7I_0jUqhKbD~^j_ zl11o-zgmZ6LKeQxG66&5uL5u~%53V{G1fyz(HsDa+6H9Yats5I5*Nugiw0mX)qVg0 zJP<hi9YDk{YDsAga|tw-suVmykOJH}TM^2;E%XDXDoUFKePoKgn+-0OS`QdCgo^Xf z2+Edx0uRuFO}vnq+rpfL0l@XySOs#l>;-caRVB7Zpl;#RYnXq5s%gz>A$7`Ia{Fu# zi~c|}*Cwd?nvEHdv^v+@)LRZq-?=ppW{rt_@yea-jWWt(%64f)e6-2K)pPUw=8?D^ z0&ms!vl@QpNdnI$Z;i-hxIta6mXll=a^G}ZHMcPlW>^D%aUC1`D>{H<{*22UHPAZV zaFL0BKj{!)JwJ!I!^VWapZN@gZPIVEy^_5lu+lFnBm6G0el4Ki7k?YntLE>jnKd^2 zGNSQgi~s9ieDxa-qkd-i(ZA3I9QpT0PvQQG;YXNX{U-Qz<dLStOf{?O8PCsjL~0kL z_`3_24|?DLzes?P;~;~04Z>Ib^Bb5*9icx}=U1pj>HMWf*MUV!zlg6Ym9h4v`!wm1 zY0K;6+Ym&9X*+)Poh7>IkOgpHSojh!^YTWBql^Kf2bcNz0I)Vzcu8jX5#7IQ85~PM z<1B!|@ERu1U4=fH8I0-gMUF?3-@k7+`e)3qwmbRJzJ0GVU>SG;TZS5mXGi^F^n3u1 z%D&+nx)(X9ZM42XR6-v(fVW5lSUxu7F9VRyGG*ea8fA0|f8Ry_Jhs2O_zs=nN9;Mr zX=FY|pu1kQF)G8^7MZ;pcPFoC?WT!YJYcDT#yI_H0Q{`eGwU35{T4=p>3)MDU)Z?u z1@YRhS2wQu)gxb8I*&py4l$&#PFeq|>ZInRo+YAotHr4*XKE^AJ0W$l66O3{hJ@^x z#H!wuXQ8j(wN?%42Q4bWZ$R347q&ZD^aiM}8)Q3NZInXZ;%^<Lk@oZ+`l+m|os0Sz z{+94-vtLXp00adQ>PCF2&63-K3Qk8Z%S=c&WDwG=x`K8Xk^qjJNtKhoNV@!$rkVHz z5Lo1OuLC$>Tpa!)8w1XC|H485Oqj<;tz(K+tQYqN#oMCoMD#5*D<OL@0x-7^<2!%T z`@1Ng3h8r}zq-F_&4jao%U{~C`n<`9OXDP~4q?UIAry6$cEe(K2>~#XipHv`D<rSI z-aucrC42*L8DLFBLw?c#m||mdYJsZey$YhpOo<F(0m8U^yWJv!iaO?|2XdOrLQ1>J zn859jNg8$vLsdVj*tbH?Q*{Jbt_@X4FH<B_I$OD%l+=1<qbrUzg&G|+(+~RQEhGcT zhhDp~-}597Gdx$@FvWZ0x4+BqlG&&?Zn-qXNa{&$vDI_Mx}I8J$_Z~QDC^lK58iV~ zoK_gqIQaEf=1>;-!8toga}_SwuGX;J_uA!h=1j=b6!9X;zkTkM#$Vk(NBJy!4UGMj z#C8J9Tj4uMzkO?nPzdG^?qY-$^DEY+dH&=>@wUOYEdzcXa%8VgbV{vO<>L%lf9|z6 z-u>A>{p+ve`q|OH|H9v+c;NWqzlFcz_gC0oEz`c1rd@_@Q2iYIW|kmiLh!q1&vwVm z?%ur*A|VMn3MYNOfR|t=EymC2osZx!Lk}EpGvnY}%C+$IIQ&KUl{HQ~PdMC0{+@!- zc<VqBjfpgUnMW{-=8u^cl&0(2(L&2#sEDeT=?NG?1b;En#zcvK@D~6l_yJM;W$cdX zTGZ)`1ZK8h_`ClAiryVe;`b`%ONhDq5Ba=kpSfx#|HC^6M&9rj{34qkdOg}_&7BYM z+-Qw?bv5W%Z}W}8JED2!HB~@6$`}4#oR)wQe;Fb?3`>H)Z=J|g5{%j9YvkY|u6qD~ z+WVaAkZ&8F1O77U1>>%n-3bl44zQlr0|x-cKiP|!9An+)ZBBu_YwzoC9zkVr488uI zZJSp8$9Mnxl6h%dDU3bX6t&vbDl2=bOV*|qmHoab6yLxAqcE0ap3zftO0|w?X>)$+ ze$|=OscM;QoCr2iS=h!Fe_hUmur1iYR!gp&&3cG6!ZS@63Re^6GVPpJJ<&fa%QbOM z2DH#n8$clWCNxoPkl2vbRA0|h1O374Z@l^D4`)hIgwwn4VN!1mo*t08!Y=$(q<tXJ zg|}V)6~2;K00)fhke(BOp;P!e5=dL*+ZZbWfZ4cBVfc<a?GC<60;^&!054pq^qOE~ z3prLj#F2l!BhQq+-x7g+!UT}7v>g6&Bj+Q{^n)}NG-CCWq~Cm;QEZbz9j9$AWt$va z@NLUF+)$jIWNxlUjt;@Ep}_zvKUv36{n(V4IcckB0NBFo$6!Nfk#$nK*-Dh<+)zi@ z=*V@`OANsj*-2zOG?gUZl_~X;`Vr7HP|Wq~GNFAYQYsBYk@WRixg1`y7t|J?v<Sf0 zIR66LXK-sJDxTHSnr5ij_9zwAK2Q>u7~xotZQQ6{yIn_o#s11|%k1i{Lpz$4xm6oI z<Jz^oulLJMBx7z~h;*|+O4f8*)>hx`;%|d!o!64q4i{{6_S$T==(=zvC3bRyTuS*@ z3uskV8GnR&h$=C$e=hhA__Y^!pl^x6*%iq`IV(iq&fnNThr-g=@kVs}#_Eb$#gu)e zZ=2II?Os|ho4>i&UVrP-Kl;i)eDgc8e*PE5-$&{G{h<a}KmB>|3xA)}?<6B>VHy3u z>HbZpY1i8BLPLr!de3fjvj@fR>xiS8Ujbf%EItBf>Gp-KnR|gLj}U5+_fRh*)xIgY zv}6iRl^%7{0l<`e9il{{<IKF^72|<JN*8|%*cc6iMexhigA9$ruN5vRk#|)($Ni-I zU9B;+##rmtu3G-$^5xi*tycm4DlQv$?{RKH993+2*=}v1r~Z~10ipVC#7~jDdpjJ) zt0VZ`{~Drh#@H(V+F{Fralpv^4xW;~It&58@Rx~z;qQf+{Qd1Y4xc_dVe&boeSjYe zXysq^+xXMu#%8Yu=1whv?b|D_>HvB*O7si?UWN%4{9VQ{;N>sjh-35COv$|a;2ZFl zNgWQ+0laDDe?0srABVp)1mGqHSe;T`Q?GiRtg2~L<lUCWRX&7!GS0+b!w0=WmexS( zM@Vd~v!+;WT(p)c;x7m_L{5;Jot&els@klyUM}i{Cj15u#<sxe9Ptby>O_~ecEY#* z&){#9!5VR)%KP4z?q4BX<b@d?jku=#d=(l&R9YXp>86`Ld<#=CfJUg8fk*<FuHQmi z@vZL#w#vT-4;6sJ>PiWtYbJ!d=<$s)GT!nOf^Q3liL^U7)3>N!F37TM{0)^mfEOYc zFOa}Z%;t`Z4WV!3bJfp2L_}`<O>2MU><f**{FIq~A=#(}bW;{oK9LuN)k~L9mn<BG zBw-&}cu3u^(%_5g*{wkZ?Wa-*)qg{O_f~GIJ+*+f(&{SZG6)S1im{!eji#Nibuj$s zQNj0wz;z<mY+-=SIDOroC67|Lv7o1vOMza>DX+bB&McA^%YnYN(WCkSVkyyAybsLS z8`N;-9Y=wCvX|#c>}bE9E=ODK9v*wNQHT25_H}>RzVEtI*JCX{$t*3y1^cu3OVwkV zEqO?rfSxx!ld@)EpivM>Y}F~Y89nrviks}!R!_y62rklsms9=BvzN_A^w0AdfkefO z1{(Eq^v_NFEg2a8Hp#aOy%X-@_{yLP+7Mgk$iVLDYJ+ZH;7iTQpaMP0-Fy>Ybo$!} zd{ZWD$S5S&UjLB=U--+fe&gHU`R?~LzIv4K*yB$;`Q#7(?Z?_*DgOTY>1FgWE?>D) zPZqIjip>&p{;K5!3W&e_r^9s5-ZD)>2xO3uQlK(wP)VO}>6uYKEB>B3lYzY&S2_F_ zA65_;A+l(S@iUrfQf2fJ40diL#AGgb7`lNtjI^A8ko4>rFgq^%N+_rHWp;&(I6~*l zhGET0hsbW&=&XdOpO-sg2L<#N{CCCS1~0ISxpV1Y<-O>~e*F-lHj^Ul*?~nChGuxS zl)w95BWM@357$>fQt)atmL=@u3j-nDX(Jf641XCtl|jDeC$6rbG2yot&YeB=_UTFV zxl{HxJM98C;M~|d*`<wMfd`6-n*uQWb?ykhEmp07zj&a8zZhUWiv%1;SQ}r7ne;9! zxUs;(LFeoHwr^VTi|_pLW%<h|ZmUn!p>Q=kwL)3RYMC~Q{d_N1gXJ*~6RdMO*~k`Y z*e{<OX#p<JUz;dPA;BhU%-`Pbj@GReGqvZ{ZVAFU*BJR*B3pJQXBU4p@Ubg1!3Mu; zQo~l60BL~-3*r0z4-|L{7Fk9@yNbI|sj<OIA8-e7I)Uxmjk;O31++ETsN=Q{cK#*> zRBYO3@QW;Z4<i-m@dbti&`S`*^a0xsd`E^nMcpiV6S8Nga0{>*@&>?#U!R2s62Su4 z<>EzAlG8h!$&c>A=xdt4{+>~lk&EGP0l0sZxW0Udq&wnoQ8y8j6Dm*r4GirEVbyG~ z1TX}yAJE@2A6`{pXj&&68Va8Ubpl{JaXV)Nh^a-6$d5{tvd@KbdJ>wT^QEq9Dfa~T zJg*h|c6*<v3VL9Wrr(E6=;iy8BH3Y^w=CjTl<!^pSC;_%{;TIOnaSnxn>z-1#kzb0 zWZ#EtaXfq;wJmssVb}L@$Mrb093v|EGw?QPCVM910#^9COuw+AZv9S`C&N<8jslq# zMouy<TSeeuvvzYyN~KH<hI7%na!bm}Z~VSTQlG;21HZU{b_(Em`G&127?wUr(E6DU z;OhO2`E#tGBj=W|>rx;K-iBXgU&08#9>e6>@kUy5+(V6u&9kB}nG=7mmWH%<EXjqr zAH3<VPkrgHzy7W7eD{%z{(bDR$G-oAC!Tm>#NS^({oM1*mc3xtVyvGxZHfd;FJuES zro!Mi#z_Dpeh&`;MJN=1S9a~fOhiK9i2z&b=kjYspKdImu{uIY+Lg~bsyqpD86ccl z7qF5h;R*4p_8AVRx7Z$6)ZE2ijkg%)iiZlOr-x2pmDzCDBD328T=-qJVx{A!upry8 zX2l9rx7aJK#hgqFtR1`ke8BxPaEtjf>ga<=@vqbMOYbWN(tFYVZrjd^i5lP{^o?}N zp5O(*3i=6oOyu8_n0N!=w-^U}5h3@I;lHS)&%T|5O$0uNxX(x`-sKS8&M2P2FONl# zzYK}mqjPHjtoIXUAY2#zM*qwZB!WijE1cd~EAH((_a1P%WpWDxtW7Wd`?vr2<G0@& z^Jm%@+ZcoEs$*8fv@O|4bsDNA2{|ZkDa<7dx1ChD4&2muVyZbxwe+)Hy9+Cff1|p` zrlqi88llyewpv}=pkd1m+Al+u+jb5mIi<P4TSo)(;VP{WkNjJWyV_?0@NGzqy17sr z?iPSyMHBK`!j>9F@LcHvrbnqws)BM@PaFZ?pjVcz<A5qy&&`PnoZDt-2pu#0h-zz3 zZ0Bzf91v@bHBY1HJ2m*qy&!ByF6$A0^BfC=aO7Xu%T2k%A_!diXCb_pk8~-WA;)(Q z{4Mv-wimQx`Dro(l38ZRw@GD5aC!-cBk4{H!6qbT9O??WB8&VY{xID>eFlL2_4%PI z*rdvp60R(4HvVB_3Upskur1r*!I%{G>^C%XpctL>t?ZA^&3Q#6Vz~+B-cZY`9Vz=9 zvV{8_mhyzO|E;9wsZ(|*MLQ)sw9QuWw$ZnW>;PcQudcl6+B|`8JtO39K3k6;B6_{# zfSa{UWZoiMW}9eeua@`YWm#87WTTpi;gdUwTzFOz_g^4asp}GDZ6AVIG*3d!sTN?a zuq0h_ER92LRnlxvU4=q96Tf78J7?yKq+C3&uJ|i|GY4>+0(kL~rG((uF~IT{`hJ=| zV8YM?JR&auE(TBRpIh&5dVN3b{DRQeZ(64lOK*<!_1EFSEyUGerKutx=H77Il0W?N z-+hDL-$&r@qvH4RC!Rn6M*sZN$iGOx%yEZlPkEl)xM?H&!T?%F5KdFi$X^uC*e)3y zB+Kv|NB&}Zi^O}RQ&%8kdd2QBjIZqY#rW#DT3Su8oUk6<ZKPjSxAIqWXEeAlSOFO% zLvYTIx;p$-VjlR*M1A|Qz1ogtlKkDobo2<iYgVpWg^arvQ(-1PTDfAC_}zdjtW|Vo zBLcs)avkr3rPkJMyZ2#W?9{<btGIpFuARI0Big=xa6c~ycDK{l?G{rG?)6>a?_Lz< zj5k(J7QRu2m%$k?=|={`rEni|=ImQ<Wgfzd7jVHb(KSZ^zKC|3`3+G_yZi1ryp2R$ z#dV1j85e&Myyfri?U<YMg|QWJ9q%Vw^q(0i9{%c|>{-p!pJNm-3g}HBdh53ByZ0YD z!fyb7_wU@iQu!DDR<ISSN@gAMkIHC`N(0kt(a_igxs@b|<S^+|wb@ARFZs7VHyeSC zpHv@ega3QG6zk`Kzn8X9m*sD@!!g?myJ_7#b6C}7A~M;u(Tt^qvq2AkgAv>Nj@3rl z>ho3ZmA^%m&XzEz2rVqG0td7K%*3E0EL=gWf)>E`%r4OGDIL3EEZhrl<*ug4V<5{! z!6*#fSjg#g#i|L`6~<J^)TKmoBUR9yzXO8p0#+p*Ah-Dk<*xwdHuf%ak1>CZjKm%5 zD_m|dLQ(y*{EekZS`5iIyNy69S|&3l0A_2<)xr8I$Q{Js=_Kq8xnCD81hce*J>B$C zS&T|Re%B6Q%2*XEiWfzdMTh|uQlzB=n<?m_3DK?Cvm!~a0&e6C7oJif$*WfM(+2=s zGjjP_yG!74e3D67AMqqgo>nXyZTqT0*4+WVJ&p`W*>(PfYx0g>KNW4XpmJ3X^f+r< zGNm5OmOszuvIXn8q24zf%^SIBInXmAnV6kQW+t`Z1(G|tR^<tYYHyqqJW%Ii+v+Vq ztq1%H%Mep&);X?xqY8;8m3v9!1~1sIKU}@vuGXgDQQ<E$FnshD9Jk-W7pyL@=>J{1 zbZN7GRs;@z3%_hC=tc{z;461)hgg))v2tcZ<Ezp;BSAB}uXC8)i#IuE_>IxkhnPu> zM{eJ;L2wlYo3Cp>yx<Fe{x@I$*29l{?|V9b7QatA{So+8{rpRPPcp!?8TKeWV!njU zFmwLOU#Os}cA}ESNJtNiZyr7#mGM#RsGRW#vn%-<_@YRrV>kW2M~_AN1;0p+@z`PC z>2Yw2R$3=nuvz1)bpIYZ+VD$PFxqVtwECcIBB%JpItoFR37If_-pI@fn-FtXu0(97 z+ge+t)vF*Ax@TQ+K;_k|URv&~ee2gV8StxHckMy7T;in@_&K!^H^3s=xq+FX5C_*< zNn?x*4w;)_-@XF}xM$3v=>oRfSNT_QoR`j50?xBeBLU;QOaB`ncBcK+Z!erVjf8xz z&w^C)FW#p4tiYOkAF?%HG?;&x%kbAhUY);q5Lvs1S6Key3wWS>md@X&u~UD}F5s1n zK;n(IZr!=>Abz;$1bBV_u9sK;>brmP@!LO)Z7Yq=(CkoUs9#DC)TdNRt5UB;)Y`Vw zj@J=WOjYQr{W+^uf69C!tw7cTtIUMIQa52B=VcnGsn)m2zlfd&`3rOVRT3wM^H(b9 z7;*K+>}n_etq?J8kbgshqJv0qEBvj^0WI%K5>tc`s09HqlK`|?RiYkdh)~7?>zzuh zhOL4x+maVBBLNdblw5R+5CPbu%w$AB{j4RFV{sGQ@;};W?6A;4-=W{>-UA$+wcw5o zb^$no_<}Ni_LjNNVj(|>zaT#k6!R@d9N!ra0WlT1SuX+nz}GhalUL(`G7@S7u-TAc zrnr&J=?k*2nPHKWgd%c|wxphr^IdSwT5$)qClc^`061;-s7-FHp+r`&Fb|uB*X)h} zYz0UNh#O&v7zoS>BoB5*3o8gAb!4)UGH-0-oJi;)?LQBkFT^U~`JU<cE$UuEUkYtf z0N@njYi6UmoJ;Kl?^V&V^p@@IC$ZkTMdry`icw`vw2Ol6<b8anye><#$L+qhdGM%d zT5!K_CS%<3x-BC{AKpAuvSL_B+TlCA;gozDjuRCU=R{v=W-w)o;|;yKdpX|%l8v?? zo+sjA8S<^VN&~D+LAa0)U-<i=;Ee*h^v^Q5$-g4ke&BGp;aB>m^S3rWUw*DWjm_0V zHNW6}_o~3^CePNS!O?ST<6NbonltzMd7t{y|NRf&#P&IZkL>$>68=6B{ObCOu}9C* zrpNj@rcCS5K?lDwDgC5~XNZHCBjF&Kj!NAoAHnX{5O-I|vL~6>M=Swix`9vV_{s?v zjt%&=A6Ff25+M>J@j_XY)9Rq<MkNOP66^-XccmkbP*-dB6zu5`3+*$uS6DyWIm+<g z&0FXqU9|$Sod;(c27rt2>UGgY!({~H<u9(lH^<ub$iECh+KG7S-1a!Q$mkv2Z0JtQ z2@hh<wB31y<S*YC(Ld7#jJR(<u@0-~h{oqvjKh3;-t^>YM*kwfL)gpn_ucbnF~B;* z1W6Hpk$+LNt6XRB7Ow<<>1W362HcmtJ00V-UC$?(JaOH+)vK`LhQG^jk5c?y_6*tz z<|1SkV8V_)2jnmE?`ykXS@Y{l_*-pG)vMIV)J7{&3zMpxs?}p{3no>%>Rpfc;I$s} zOFfMRmBP9-sc}}k@KS)HZ!Y;&#j}BiXNHz8O_4`(9RE{|v7T<IRhE^4vYm5W*p$g& zdoU;brJ=vVRv!w$1viFJxCkCRl=#FAT*hmng2^=nU<jN+4T`2{hVPMr3m0PCVQ98j z;h(z+z!~OdCtO@q{9T0DtS0!Ld+z4jS?QOtxCuZQtyuzn!K$E{`EUR*H`4%1!I@<X zk;B{Q-^kojp0H?9TyLZg*v|vIe<S`n%J`0X-ct9^s?0in&C4eL=F6pcS<p=GNY5er z-0=HF^ai}`NT59AYGu7A66#X<unFX+RL~Hphy1vHa-}d;Yipz1%3ZboE{8B-r%{1P zqJ&Bd0;U02;wD+&pPcTN3G2#*;Q_<}4o7<3@R=q72=Kfk0OvLOJ2kO4D+<*(n1p?5 z!&O&YHD}gr=HS+(v4`9(U&q|IM~b4BrjF-8d$5@+GKAoB*K4_~7(YJDmPw8!OWMI9 zQRUO*WVX16w`@1}QF=}^7>-u?At%3Ow))}VH)>{M`Zcoll1bKL>z%Wc=v+2io>*t+ zi3Bk6Zw4S$2XICJBmS1|8445Pdm{@J(V*8Qq^;QqL*n9YTSoGQ*T9!K#hS%4)mJaB zsF5r(nP(vl6+e9%F-k)kG3Ijl$OC`)Kfn47Y_A;ptLYV<pXvQ|^wH0L@k@vP#`fxk z7c#w0dQqKx5Y=X2p!Z4pePa!LP=O86Fe85vb@4HI^i3>?kzz4ihQCO*3d3lXF=&QQ z=?Dh2ICRE#Nl6y&7zuCDK%;L)fh~Ux;jjGW0w-{i%vdF~!}9kH{|<^Nh8{UCO6w~P zpwZCQC|}jj%D)buLJuvDSFUjGdiV>EnW%v=z>13q(9VT~sLOld{9-@&O_wtIX9WJ( zK%;*~=bVmNUmg51R7eXfB;SLtG2b6!sqk^_hX!M;&Zs{}!z_Oj3bcKB;T^^Y!{2fY zeG&dfT@1_R@BV!bq&~n?pyc04X7At`w;|cm1-uzW1oqr3z%K)k@IU$NGf)5K>1Uqd zdx^gKRrsJ}VvHTTU!xbEynp?*JzH1*>ft{^{~Y-j0oWSWnv~R}Ru5T?YpQk0ug9uf z?MNb1x2v+%8N}8B*M6$oT2w7*0In)Wi&WsW6e<s-P-Y|T(m>B)qY|_RI7Qd*$6Um{ zD%>oS!csm2Td)9F*BgdNSq&s$BjgzIV}gyTNGSqSTmcbAA<-@dz*VX3RFaH$G7zc6 zPz2z>HiQLq5r(4-Ubqm&SA%i!*FIVJh~7#e7FjfwQ1bVq2|_roK8nErcpfeU0I;xK zKre3rxS2tB1TP>I@atRP0RfEE+xmZ_@CNw^%xKFP@x%uN%|`K8-%#PNT87!=A1Yzl zsC>$wpDqJ{!_Z`7F}8iDl<X^t8=RAQCQcT*sx!L)+yUIal3b~Z_EV<?pM@WJx`Cy9 zO#n>sOi9f`To^i4vJ=>bD<XzasHqbM5(l(NKUySpXHHTybjciVT$Q62`Cj-TfZv-w z{3!HyVoecE$h-C()+Uj^%)jvaS6(&udL5#)I@hXUUe~)%LaN)ao6NCJUMBQxnPeDS zW*2WlrugD!Ps=`6qrDvLd66q5=i8(7cEIPT`acm(lO5u*+5(sEv0tmcOnf^n3N$YS zP&<D6brVrLb?W4bayysxtjvMb`0J;#Qy|^X*XYuv4-(1%s|bt|8Vsi!SV1`aeQ#Hk zx{5B*ml}n|bGm)eJOkfeiEQp{>IgP+Zl<leX6|)2-u1aZ|C_IU>tXmCw;M6N62JfU z<BnfVY6+Qnq4<k;C13=9ckEzLO!fMfEt37eNR7_BaQMxmOtXL-EPt6*pz~KO>rDgd z3R4f_kt4GiWxz1K!|)d=@F>Pwo}4aVhY2IcL0&t7u}~7f`q@&|9c3-DBF>>uiGxvu z!_6;mK?2^u47n?!bGH9?HF7Wu{8Ox5hxyeC@atRYf<up*TeiSmRLxvLYpXr`@oTm3 z|7q;q|NpA0d)@QP`D45RAy;k+UJyjC8Y`9BQ@h)4+TG%5yLYQSt*uo7Z&Zsth=PD@ zl|TpyA%uhkLb!zx1VTVa0OgVpu>Zq(p7$7YebzU@zRpa(>;745&AH~7&m3cpIVWnT z9$k!2nR)-fGWca6475^pU&1qXn<C0Y`o$L*6AKSBJhZ7jpr_NvO8YazV8P$xjL$Oo z9TZ^bJotO`O)4I^E1MJ<4QxNkHMV0C+tfz)eZ0)iYWU3Uw0+xs_io;_Y4hE*{%&BD z?)B@}J69EL!1vSrnRx7b)@p$xYCW@O`?~M^kI#(uUxiB{E14TYm{KIg%3NZbzoUT3 zDRcA)90+(RAW|A+p-gZ=i3ash<)VWbvUK2LZx=>$Zst(V_Eu$GGA{R!w;jyX$<ej3 z_(k8-(k(??%{k~Sf)GUOvlx*9;DAtQ4K&<?8^?wsheuI>>4StMF>*TXO1O2ztK;k* ziKAM9G5cO3Z;QMFm-b!BEAr9~Tv%L7uqzO!KP3w<gukC)l28WrurJUe*wwhK&<yxt zYjXkEo8@;l9an(Ka+yU`Um%>P3t)YoU8xFNLEyJOGW?CBb-EvY(5zAXwbVfUE&ht$ zKsW#nJ_kfi$0^a+$ZkBb+%)8@zhQf}T4=uo;2C}eFrUxRUo)TD954#)QjIDfie7SJ zXJxW>2Mz=swL6Gn_BRxZITt}Fq-3wu!@fuVR)Hb(sUb8xwW|Ov8J*`V_d^9<m+U%n zC<(eWR20kHKDHN;=JFHYd*TZHpNqeF$n?m>T>-4Hcyvh~NBjD*@~z$O_*RTND#nd7 zu3RLorgTVRag@*}-Rj^C`z31CFVyd&9=fCm7~gQQ&J}%?*G~Jj!HwMTe!UvE9!KiB z`I0Luqj;%v5ZeB$0$fuNUVMp`r<wvOI<Q7){s3y>*Np&JHF$~IJ9eP2@J01yz&p%W z8ARPS98_OKNW*wOet&zvJH<xhcjcNh&c5`DfBYKGSJ!-B-zz+?RDOfsTYp~KuQSWu zqxx$rY68Bs(g-4`C1Q@P3F-GgxBqE8lK2-0F?=M5J?IF;3~*(yA)9|SIj6so+Aqds z49tM_C4G%Dn~~;aO}8q64pSLbSO+b5&A5}Cdzm(1jnC-XD2HikhE^{z?XPnu$X^<O zAAabeNA$izLA>w2?K>Z08sIbl-;ct`m>ckSJFZvvU{rU&Mmr>d;0Jd<rkhm|j$!@j z{S1KdG!|)&InM<A-Mcp$ur_vMjkeF4%iu5LMFP3!_Tw<E0!*VfMt9~egunhjyy#*y zG~Zq`1Jdh<-@*ec`?y0BQ5>MHuF$Cb+<wEeI9-w8PvG*#D@MVGzgpLc-o1=JiGLg; zaBR4XKEQX}feyTJ^F8-5u;!x-D?&7|4)FiEy*t)@`!Ciue-$os2w^5g)_wU?I7?iq zHBLK=W1Lgkt1_ybyPspJXx1sS{0zTC`Y1j9Zy{P`(#%-Av{*8)l3OjU%)Ty!u0M>_ zx?`c1g;$uf#q^Tfz>Zj;<!^MjC~;b!E%_JxE#LwPIRSqQ!GT8bAv0<Nd=!AI4VZon z%&QXp^z3uajRG7M_!4Lfe_`MF1F&koDy0H=ZFFK+p&`c$q;y-r(YZ{)XPtHCnP>WU zW*n_;4yF|tJ-eKsgIOK~Y6pASy69q#7}yZKGyc|-c%ToT@GJ6Zv9ifomyvW<l)rql zq-g8E;y3&ipT~uP*x8zde9!3gn*>dQF94i-1i-nqb)u;U(xm-{NYf`x9?0i!1Y5Kw zr;!7bLkkE}VhZwC(i+?t=ov@Hx~>>!Yj3ukNVGUs^0SbPR70n1pACTE`zE)VU8ktb zHWEh`qq@N+XRFphre5}e<!g9G1g>z(olD}3yP}!{E=F>UbzNW5%rdFtUN$-+m1I>C z^qEcs&P<UVDd^Q4>_z?78|Edvb=MQ}N_mY!XQe}bJ6D}DwQg?K>E6kTJFu>0ZS*}C zD=9mkk>7OQ@QLFd)|B;@%%HJ71V?uP{wyBQ70MDl;a79?0Py7atTnm<P}c5DtFM(= zU7mHi!tz}6`zk<0C#6(Mu=?~Vr-I<sr+@U*|NTo}rSB2mSMV3ls|1YCH#_mK^Zq)q z?3OKpie^+5$Q?U(F+4@!>rhbm1_2_J!PsM;)e#tTEbO4)3m{2fBgvVbN1-cNB4}I2 z{aIC4*DS`kc+T-DVKy#Tm~Ib=Utr99NBUujWPPPQbLb@;rEz^m)qcjw{=}~{+%iN3 z{KO~B$p?2aI^zR@E^{62-o1<2j+~oM9;@*>`i8X%0i5nh4?eVO*KQhqqd#k0r}xow z&+UKeN%@OL9R8wy>H&qn8CozNSPTrQddk2dSkImH*C8pfvOCE{{JP;UK@Y3{g1@i7 zewbO1>VkKU-~jz=CwQ_8F<p>IR;>HZd$bqhv&udAeGF?kHg*QUqIrAE-J9;l0IdtO zgJ98MumOkl&0DB;)HKG{2~dKc-}k`n-}>`UpI!dX)@}J)h?zna^rjSBlqkhtWJ$?N z$Yz8q;;zK6p{BPG{Tx<0I8+Ksgn&h|W93N4+$efZQ~u5hq{ZgMU+G$f7|V$1w8wpt z%SG|xm%Y_yJ=m*iRq8Lreena9!VCTix2&7J;v!)%cOtb11TaNpnV^}BFaU;(n1=O& zE)DqNw7*K*3V`sEZWorp&EK_a#cye&oYw-)L}jp0<rnN4T*lEFL$nRSD8TW7#sUpx zFB$x;=L%pC87{&C9pFa+4(HeMsD8BkmD?9M*KoBttNwm4ma|me`BWxoRI@Pv$4I*< zv2zMfDK#Y~N8WoZe@8tgwHbe&`xSp#&iFgb&%kI>fTKS2=Qj^@#;T%t24FJxq?=`1 z#1=q$m7~#%$@tUBI?6Ifl#!MYPZW3DnuUf@OU6t#S^(ria%&^_zXovPT8pGR3u<}G zPh3^qe~~C3RKh3c6tX2p7IJCrmyj2m77JR|Rw7cH0c~&2B0Y=h{9-P2x33r4yjDFX zuT>AP+Q2|#C&RR=0>Mu>eaSx8Ew`oaF2Qe=C-uFvte+o?-;psqTX$K5vn0M6ZL8|` z8>**{ffW<<?_-6wDY&64cw>e}0oDTx71-8aHVeS)qbz?et-i`_dJST=s*$cz8Ck8J zF9lO;5c!&_2`R8voqE=VU-+AUiuwzG|0Ddpkx=+um&RY!-z{`K!p)Wrv+$SUqUatA zf8`ML1w@VoC4Qf=<u_B;s&D~YoS(5VzlzTKGX0QB^HrI3QiFqs=pL(sGqj;G*M?KL z1&%Q_7k}-*#1IxW@P@`}5qwbVGs8Zja!P&lPF<C3-UPpBs=^Y}EOR72z(A8&ol)6$ zF$*x7u$w!!Z{6y~{ac|g_=UgsF(wBJ@dJ*kY0K(k^gg1w^{M@^?-@LvalO(YZGgX^ z*^wwAaP(iaUrp!Xudxurhlm@mN<D%xMx1`(jW=KaFZg@p_1BNQ#r#Oof8Ra=u3vi< z_cEub&@7<)GZPP++WLk8UxMRr&;a}(3NXWO$X^J&5&munfB9&eY1wvaW7>?J2bem_ z^H1%%{acrR`fQDh2BZi6@;8amjK7iTX+ceHCdh0?uw5(u%3GSIA`c~aB_Q%w$si+^ zARuTIo)asr3PM%0WrtyC9Q&*}%~kx7Yb!gCWlFTJVAiRX@4|A8r-bHj037o(&>b2r zYgk+SXzb2c3p!7Ti3VH%b}9z@0jmP*9OVF!0Wiv`&d#zn0S2NHtB^+VZLM@IRQx@g ze{-E<VVv(op)o$Iic(@2T%UOs)-wSdC+O-0EPz#i!_j`My^lP4$t6CopDlIeJPRJi z(_$c(_wX0|X7sBXeG>kr>B{m$T)=}QpmY?JFcWT?d}Ty%UBUG6%t%ajr%h9|YC9v@ z>ka~V5vU(c7U+C87V;<=VycT({ma6de3fP8y<kAqt}?Y)Ft}Gloi<7UJQ}RFK;)`i zU6(5*(+&QA02o;agXTgo12At&-ks<7k<X3dalwT50>)KcWA|Sxv;)4`Fw%Kop4U%~ z)W%Ys17ndlOKQM|PM3;W4pyXNSe`}LB4TN%JM<+&m(AR7L_Nj9JpL&JBK}of%I9J+ zRi5$%tANO1PY|(&Z{VHX+`}l(LXJ_oaHuxNfoZSrrus{4Xe&~J5TK0XiaiPw^k*-v zFf{{D<kbvK2zcX-r6D>LUf7-2GSmhVlqRDwc3cvHcnMlVim+Jl+%peQbzk$L^Zww9 zFaHaDkFL3fv9HSfOv~?0Onme+JfCmB1K;P3o8T1a-9oTmsiP$qga&?F19n748)HQ; zfBI3$T-$eT>BZWtW{WeD{eEc=#`??#G{%<-=PUe&!RR4o11{piFcs)mb;N>1TCVNU z!`PGX*IEDQddmaT@mBM-GxVV&%3lV5rb`jtNpv*Q-Fc@ymQfYOFZ!arf$wM9zUJ>% z`X|LBYuCegVd*;k2%gY%X$J34KZQ08esMTv#kBV>_M{`Q!&7R0b`WR{(16!~Wn9J8 z$P#dTK79C%*JuEqhPZlXY5(8f{?-`?-#R+A|H9ul<?pXdJ=&9@uk{<6oPoaX-3?&I zpQHi!!TayO5ASCHycrX;ZNSZ6+U)UxwyN~RUZz3vvmE&4!|T6w`KLa%gug9dB~>Y4 zTA+}rlI+MY^5j~va#<U$C;7K*ARq@WYKtDS5hG+_C8eYyVFA?qH78aWg%Im1XJ-f8 z<SGlHcj2#hn{LMi@;8O_><)p4{8jrEzXlmnFb#H>@;B5d0Lx`USy3mH2o6VrE&yxT zQn2F&tqFPpaOgJy81QO$2EgEt|80YgN7S$fUwi?|=xiV=y*Na#6xMhq<(YJ;x;ycl zg~zi59^7vQSi)Z11YT?S48f(_JpK|DXMR)zPGf*>=&S#NrJjFb;Fr`}@OJ_*G;WLz z0=pi~>6OIOvJ=n?D&#i{_yTwy(FA5S04#y|q9peSe)kH=R8?YkW(*T3Y~@1b<{5#d ziLk9u+a9aHg`DV}aY@6*qipuc+Hto}2SYwFA;M6#&!E9~wW2^snLNv%*=+W@o&4JS z#vA|VWhY~s;+7M9OB&^nTlKJhvMUeFb{9uV&W~GmoGNy;tV5L;waoGH)1027%u%12 zM<V|9KE54cfnUDV_*hAb+F#YlV)0N3WJyuKWjQWlJxE+fbHzB@*YW#tU7yL3Txw2` zze-SCpzSQEgM<M7>}LaE+^}f>RRf;<uNuJkKZnC{$ckpnFjv@}>Fpc4a|XKVL7vHX zi+0~8@5s57Q3kT{%GIZz{h2@iJJjFrTyqWWzfQV9uV3hUv-1uz?&KXbC89{#_FI9L z)K(IO5LQ?Sge5jza?l2`!iK%h3W&aShyXP8w1S{2zbb?Tu!~{Z=27U2u^DqR2-AxE z(ksx{>tCr~H~>d>4#HoWk>wJttD0r8`9Ak7%4Y_?c=3P(Pd@dO-c!yG6yIP5*?5q_ zsvkrZ#{As;Eq5$hf5orVVo=R{w`x~+9zqGs;xScSBIj6?_M*kv_;EbDFhVCd=%#L1 zG&l=jRB#pF3>lf0R@}zqFS<SarSbPQW;uSN)Z5>t6L7cuR)g=`M~}Su*3qMHza20i zJ<M=fujwtW1)fG*%?tZc#2J7imhf1h^Gf)b?PdflY7&e-8U8x{)tzboz02>m6-RZN zfcHH0EVD4sHvRNt8@_${B_E}1O+bVwX{xj-v8u9UlByD?7OGy&%77C4u78uoBlIkg zg~49|j39K;qeujnodZW%dTd#g{W(RmT?%e;FN>n?MDyfm?}u{HzpN5F<(S2IDOHj; zCHx5=7|L(yWZ`Tvp&?P=<xuliPA>oqf8lunnAYzCFkV<ztz+8?880TN@XB1&P)6b? z07Jjtmc;Q$<_IUDA+})KV$=M~Kp5(x0GO2k#uSYXoC^HVwA1c8e4g2<O`nYZD}eh2 zC@SRd+7Wz}a-4?R5TC)d=KO_Teo6eF<9#)TE-3}rhT5Pry6X}ElS&J`R)Wr#6M_5S z48XZ{e;>aV-)iD-0azG~a14M)i9KP5!Z!R}0^rK-mcz${2GCH2$FA2~6S3&-FyAVv zS;$Ugq!-N~vV2N^#9#rK&aLEgW0UOOyzOn`?E#~2lu!D=2OQvr7S@Ot3m;PT+-aka z65sH*U!zue88)XEHZs#r#cf1`<0Gz%WU9;iN8@y*ueUX+$1}2KQPHMYXf`VSga9$1 z?L7`yD1@AD8#tApd&vkKVAI1nvgCXntKU{jut#dYe`7fn{zifvg5whz0}B}`0sQQx zmtuyt85jaz*8W#T-)O#)m!N~zWtV;KbFn)k&(QaLrWZ`j)t)7l6k3i5^>zKki)`z0 z)!$g3|Mnkk{r%2&zk5y0&vrYyIrx>o>uzU4yBKM0CAHm@v7hazBb0DZ`emtQ=)vfM zj@6j)7a^iB)e8wHq&QnuPha(4`72-#z4WqXXkeSk0UT}-XdQYb^Bl!o9donT#(u5K zv)VHJ#kC3L8nf(vgVtwRubSu>n0rxN@s(n5s9jPQ6EqNJcuDl%bo$l&Y&3RmyN7sf z-Uy}c-O3moxMX2hXS`^F(-zXmnvotK$B)agp`G#1me;fb^NhU=_(j!&c!Nipd{Ke( zChD2QoEBhe7Yu&I#1V`qNsZ&ROury-k5zx^lJpkd(Qh3o4H$2%H|c@|dk+%TmtK6% zq}@-~X8Jra^^taPRdD+_<A6mQ_m2Cvp!kYgrXXYpXgr`<;ekceh!g{bKK|s>2jDNA ziT7;!&gB<>#7u%@l@ys_TC65{M54Mb>lT00zOv<Bu{I)C-1P)oUYJUMq)%~)^eIsM zWtHrg95}LM6+kI@=8GIQ=bCvd121%4y8a}Cv&h;U-Jvc&88w2trC3WTPJw<BE?CVE z^sM&_U~uqWMwu+uW(gO{5Iy5Bhu*`kr_wykhWu4QTb3r^HK$Na+YcDsG~JM5+=7KP zz{)@Q>tZc^eBFk+fpL)hY2}|rS#W6oU-`@23p4)W-=#t-h@%8UU|l%je3`mIeW+`n zUzA`0EPV;yQY||V|BL{Z{CU2#kNRu#uYD%Cq5O^eRjki`LsGc_+})?A^eg(ZRCzTi zNz5E0ZT_oJ$;cJ+-{dA;FDd|cZAk^VmEe5IWpe;`ahuY*3RyGXBIl+a*_j&h3~H1T zD_4&Rbph86*%%UXEP(q~le`QSc;ZouOk_e>gcXI2dg+l}D_bY0kN8CdM6U+|U_OBJ zFW`XX0ML=Q5=riFsJqv8>HBQwio6F4&y8*FGNnYvfc+7d=~QoY61i8uoBz6R>HUm) zJ;Y}j>aDUg2}U6PZ1y)(hD{KPgFalzlbz=5_@Q@VdmLSIWAo`0@`J^Z0dh+xzN`(v z_5n^qQ92N4f?m6}2BJ(mun5-e3LQ8hDlhOwDQ@y!I{ck=c>bir#@SN=rz=y5bnxj@ zfix9geA%Hx#QJ>3IZS)>FW<QOo8S62{#W0>mgZka-ME=yuYUG3oS%R3i`yMd81E}u zNpVuTALFz5eWW_eKJk>zlBk^VfmZp2KAN6U2A@w)A}3r>3&hJA3v&E{QE$aB)@S{y zUSqHcPy@2G+Uo19ax88Em^$!5LjBf0ORCXaj-&AlnSaP(FL;`6$C!#yN%2nJ7Za_c zPvX$b@Xs{;;wQZ8!Q$^uhD*kaYzNT7qii$SVhSW@L1JKQ+kf%FdJxYoY`b`PGtLzA zH_(P^n{aH<k2&$KC-&^KpH=DoxIg23W#lnG$8DK@&cW}mi44YcB83@R{r6b*Mgjiq zZ<&MeFlOhs|C9Z<8IFUI!RTPc+!X*g{C!SeZz9OJ)~$jw#5F^F5wQn$ZiBykC;Xo` z+^PR_x&Si}CG$lx4)lW$?0S?jICw9n0Dj``?_PdM_<Q;pr$-E_5k??~{AE4KQZ^JU z|3l&kmIr729o8muUBr%!MS+8utZ^<91*Bxetf#zH{v5DOsq-!i${w(4&NV2kRdm&s zVmtAi6Ty0}E%5TYlwuU&7U*;S7BtjtWvS~C0$Bht_F0d;aZr4~3}B>s!b{<QMoE>y z?F2A3=#ViiyjTOU5Nril8p>bSwM6=Lzp}~Jh9q5~xX08J7xYdcsxU@qOwhJrIgF2? z@ay{Gex~3j6n_iApQ4x{_*g@1(-^J!x!%vTI1}tSq0VhJ-eRQ65j0>}5GIcLORK*k zS5-KP=)%oeIA)hKNpP?5+9^o!vP*>Ui#A}tT<TBZ5g#=9A(^4_0I5F!X9o0-96E)0 z#tvlymMFlb+$L#zGv`<=1+cr`CTDBAF6?_}C+8c$0Y7h07?KB}g)(5M9GeVn)^@{q z6@c9$)J_te$v&2!^giZa$QOx_8N<k81g>r#ktFT`KqNL-m=J8Z(m`1bxL$q{g#~?& zJ?Ax~&-@3|_K2jvsqK2o()UW#O@RtT-p?h14J1XUh)3C<1@}7?cZnu<%b`xr>HKPn z7y}1bxE^Wkrol@|8v#6e3nD$$eq#l>Y|yH}g<wq3uomJ9;jE(b{{HVnUX9h5o#QI$ zL}llG+*&JMixC=fAP={6<1>zBzG;1GzrH2es#8CF(I5ZMfByPa@b^34W$uM*ucPnp zjW^#C^%vjg+kU?8PWrTLguk}@>O9Q28(3%QS{obfQ!oMiq6ahhWabT|khjz7fi&f6 zPCiIOZw8`(ziAPT@0IPr>V|-+hUMUQXun*5r50~1x*plw`?C0Di_SbS{5SYvp&&DT zAuYwl-~BeYqH8<!hRwftKR@{-`Y-w_4$x@5n4Z;W*>TKCBCvA@TKqQrpJ_C`=bpQn zt{&eq`O7qfJ9pBYikUh(K2}@Q=-oS+E%+goeelcbQBj;e!f71VG>i$H2s?HNkr2T8 zV!!zEuc<7&B7b9Z#|i6*?ERhmeeKO7ZypYRj~+RE_;r5E_#$Y)&EEsgfXK*P@|POG zUYfaW24;#0#<AYM1;zKSjX0`rxO3A6y`Sv`d?#Iyu&r;~asSST_dK;fL!0d1yXAX- z@u`ndo-0;lMkGh!L8iJW$x1<0iWJ$bB2qcjLf-t%@rl3WI}W(yPf;0vYv7XtV9CRu z6s7fpoz9}2Ij2=hqs89H!{*!kzABLs<z!|T2{}>Oo&t<J@Ml3rt8c;MM9cUT^(-v= zg9EhR0oE`#<Xv)PI^R$(e0VdcV5N3tWLwFOZ5Rh-Ra4xsR7o!$6pSVs{Z{}-Ee(Lz z8j$CBQJv4!zZrfK6f%SkN-v+QzL;en6(?N1Y-z4;NCjXAzl!O)RAC;;y<Fze^+@Uf zJht)6A<&#&OBd)nLWifbGt^~zF6w<%eHXhPpJZ$R&(m+>X9Kv>)C!G&ZOCTjfhpv& z{C2{4?h1QHC<VBd#b2sA9lB&A+5PM(Zq0Ir<h|bs;LhbqN0U^zOng~vaokH5!D}NX zeu=<1=W;u@>bz`IW<2bA2H<+RhC*f5s(;Q(>66W_Qz!td{-1af?pG%)w~L<@+Y-8I z*>@ht$5W^C^%5Mem-5}_0M33NTXLd`gpmYOB8>xu-0^Fl+M$a83Iex6KiQX11%Q+t z``Ku6uJXhp^lw<D@E9rRVYe5jbAi9>L%rpGZ`Sqbzs8ViGS$~K6P2TeT?j(p?h1VA zrJubN8*~iOtO4=ouu6x#_7(1)^RZNY^4u7WQfE!ZSkzhTLoO}hD9H$g-<4}V_=(T` z<v;xE!0*3({|DDy_ro9mMD;h5{;s?2w)J)?jf!X|S(-@E5S`ZkVaEQ)v6iut8^83# zk-v;sj42ix*+vUIe)ar8`u0{+ZnR%od{KwPV9CS~&<y*G${bzq5YT$V(Vt*7E>;rQ z|KJxt=s0mP_b-j2%(DAJ_)E7MRBhPjs9Oxz%*a*y^uW?P7>yVFYI@e7tSi=ojK6{T zS^RF>zAfHYn@|x|?(eyG3j-!IEg{!IX}ayi4eQ~DcHD<vto{p(HM*DSeb3&#Ptx;P z(=(>w1B_A?uV?vdB1lady?J>?4*4|@e(iO9px^o(>{SImN(=Gf4A8;$kt2s?H**kr zrx(-ydw?EJb^*3d0RQ)<lJWRsj}SwK;JBBuH|Tf-fA89Kr#;4+zjrfZ24;&LyB=i_ zXw~y)pWOEUUa?mH=ZKL@a%9AANRsOkRm7($9FeM>x%9K0-68r}TL5x>slY>WS~QS` z0GRT}T*#74njE?)b=+EdD0wzj$LVKXfVB-8D31f<rrss|?NUs2Du3Z`TRWQ-a6<kP zO5w%Rs>8G~4vcj!E)AFhQUId>Yu%!5eI^ddDw5cSO9h@`5aPkT3Nin-VVI_1cV*^< z7drN2&3%-SFoIt{S67!1^V83u4R|QPr2&V(3}bbEIb;c5_zPe!J{G|0y$0#q_*MPQ z6B*@_(XTRcfRNGsiciK@T0WY9q2r<#QULlci>S7wQ7Bxg%+f^bP`}A#V%Oc^ccB6M z96~J{zYG5QdAlepRicXIQACpi3kGIk!pPe>*gJ*Z;%|h(g+*wILv1cSQ5Ts0({XO* zb{%W&(#M&235r6h1Opi)s8W!SD9kdu;y|EAS1U4aMSa<d70amMd86ELw&*xd$9d{F zo2`N0kp{K)rI(1k2aXMiMzMNHr2XkUR7}T`m#j(xPkuN2PEdrF3t|>JlQ_Lt@RcaC z<AOhnk~(nA1^jHf$#g2m`WH%Q0eE;|EgUG2QCouIhoO3VsY-DDrJ>hjpJif&*r|{p zB!}KcNR1=3XO4wb$`WHgZ-2>rN88T~Q#t0h=fzGt`_q5&w_o}CRo}$;tolp)?{(MT zVC(NsGxEmmH2&gF8~!r!;8sT8Kr_^o8zuNL2BN^<3FK7+B}%VFe3U^PnV~10XI^+Y zp3kbXadsBJQG9iAmQJ`+1;6w>g00Ne$MI_M<py?KDpPcN|8hy#_A90q&bSn`yB@#` z>wt};&P?#c6TT3dAw6SvVR+_Ef$#3!Vpaa)^}KzXoqy@Gv)KTkQ0>u#!(YJ5bquJy z!{5<l4B774vh99s?$~<yk7G1}O?<N$dL!27@Yl9q4DM+L#_gM^F!cn6bM*OFwVS_j z_zk8Xl(h3e!*A`r^VaLk&v2ytuik#^2rb5KfTk}Oj%Cl-w0^*;od7T<aB3Q&*cp%> zdWZ(#ZTHyq2m~|r!uoacm-gSgut%%iW4Ay7{v~ylUp@ECz6WmjpP&7>{6&CVj^bvL zC$eZ2SkZhH<<fh*OdAJ0I8YmBs}R?s#^VMH21G?s=xV=$m8=(zrXHAVncUfn6g^9e zq$;I6KlrN>oJ@=avo8Kxt#oJc<6^HxSX_Bjth8`a+*e^A3WNyF-vQu(*>~q}F(g0H z1&ij%0&s@cN#$BLe)MDX&{a1r%kV|PVE7vZUqYjk?Y(IPjxpG-NwnKuh%#COLB<s9 zL`3;mQ*mi2dHRRW0>EhkwjXeYoTe9%KfZt`md?$JX&@#5=OI2&^2Q);Q!#;G;BVdY zJ*3Mqj|_);^njEfBx88kwV08D4bKK>QuH{jccBbd($!TgX8>;evhp(}MD^uyBB()B zU@|K#3NyB-hndSdWRs${G9x+B{0tq);$cMcJUfNWIZYd+0h7d;fws1DY(d`vtUg>% z37j}H2XMqfFohy52j<{K-X4)+-TAgw75Qb$QGb8O?7veyBX*J2M7n|KQ6oQ~S<*ep zdu@!E9J@|3jrxUm@PhtrZS_;eikC6{ePpT&RSNid!d<^qgVI!}<BO%oDlCpwn$>;^ zlH>4O=f>Um{q$qEy`Kkolcd9`j#h^Y7UEOWFm#>uVw-_KV_<mJ;;l=R;ml3e1Jsqz z1VV$w2$}g<25Ut|<D5?1c^F^Sk2!@Zkftw9Zq)|Aa?M#6e*Q1N^e^AID&ANBM)NP- ze>3jYEt&Ob9bJzMX(BBjCHSi&F%V7<B%FXJ{5k_YN}$sLs{Z2p{IZkSz9@K6=3J`v z($@&}H*Qx9Pk}x8MeVidiw9{0#v=>$m#f2FegS=fxXP~^`d!(oOg|by?~`cJOgALQ zea0?Jji5Tn>U~9BfjJVLg@J840%KSPzuWJl2NgYm@5NmS{-XZg>mXQ61B^~g6L1Dp zrX^Tn-+%9>yEdU0?__Z3R)~Y&M<0EH)?YgW>HYi+rd_HK+IOjZ)GWs@5tUbCPuG9@ zH}LoMcjIpX_qR0pGQGqb@K+wc%>+nPLx?gd0)GMUvrI3{V4GOjF+e~1D6xE!@VFBY z($8uqBWc?8$fkl#8}BIo=ELEEm3I3b4?XrI!-U~~_0+Cg{^1YK9sEU-6rzPlAz4F^ zv_NOO_$yA`Eoq*5`^wtY>VAYcJ-et%`dsoN1PX$=GdXm)DU&UyjOxZRi`dyQHm97M z<Ca>*Uv9>Iv#$b7F)V`Tce4ZweVZJx7q=^rG3e0@K=W-35AwP$m#g`a-X7Po7QomC z17KpVii&kh;r_@+?1$t~9O|^PumkujWw%I3o2+Ei3{5XWE-hauhu=t3to%K_@lhoo zpDPw<o}v$yBT-6SLSV`r1aO|}=+6@PVq2gIR@~KmbExp^?_z%Ti9FH)Kf+(1X@Nol zqy45Kva2zyDgiqst<R8>9uuuep4u3DeJHCy*VBY-*U!csUB4TDqX{nfJMxHMozG5I z=rT4HJ_=j2t-MRtv`(q<u?cC0Cw64~8DTj{5T%MmA=RA@#~sMUo*ZZVI&w}xWziCp zH>ia#B!wdh$-9-gr(7FxFxyT+{+{go3)~!uBvK`p+)#Ps!0{m`T;w;QPF|?R+jLkO zID2d`394-9L@`?PqJkfAV0zSeE20<qH}eou>BzTXp~NQcwcQ`B&iVnz`8qO|CYWKm zB1u@s7R&s$5_WO0o|e>Z{`!I9f~BXVK3G(e&->(}8CcJZiNa-V=77$URc}piJv=mY zkjwx%T|qXsJS|1j^fgl!RS7p0V!^NZ_4IQ-^QV9FPyhOjtG|Qyv+C~;{^PnI-FTz^ z&$wUx{I=WI<4P-jwLb$XW?x{UAle%rdI*Om1{TKc>PZHti1sT5X8}X>A$f@#Fh*GE zsrrjA678WNSSH0RoqoSBqA4F_q$h@}d=2$C{FT7`%zHR|B@~Cztt!*N42DJh0S4dz zP4ufl{iRFt6MN}?q@9?NCov{Fng-J_;Dfbu2fdK+e-3}KGBfs-_=Ug3Y|Cb~;H}$n z%({OE!*z@qlD6M-`_FE>>mCk10OxYA_?<EGMLf@*W=bMDApJ5UfMnw00}T5`WUNZO zf@*IEU<cvAs?G=;$Lqgu5B?r~gO>0&kJJE^@4WTeZ@8X8IWgwzO6|N(2OR7gC7+3n znWf1YAy9xHqY)k@ohrk9;V<4-8#k_Zx~en<J87g-HZ$SzLytbe6vZUhQ@eluFJCzC zLn&flMFdJQVk3n|<f#`W-wOdxkrpuvVI?o(#S;E1Y0hvN2rG94#b6S#$UqikQH%6u z>_F|vvy?k?f~J@qc{jf)-g*!3-FpJrVpyurf`wS~w<Zr5{1q6&qJYq=VSiS$4QW|& z!SMhd$2iGd0$?7R>3}VuY@I#JVX6XPMH|Frn5sz!E*tPzD)TW4*HBcSJWuH^{`Tyl zrA+aaNPfQ+7U<OBZ3K2U!Wn>@!7?B8&jAeoLu1w&p2K=a-l*<QW4@*GzC!0t(S9s{ zF$fb_&T*M-Xv%sdX?&|ppQ3E1bI#__F$;dT^oI4AXu#!tl@FP`F*3-MfszNzTJv%@ z3@{6liwjjQ&FBPKQ<=Or>xf4u)`YxG*2M`Aus2=b7t|^|>YICCo-m*^Au@C-o|HsH z5{59Cb;-bHTSHV|melT+ec*lF{b-ohXW*Oe-W%f-G3~hLbrSVswO`+};#aGxZzPST zx<{gy*i})H8+B~Qv!-`Q!e@^nfc2o~_&AAnN`@sLY_YT0>Yr3{1<v`(U9^lFx}M*3 zNj6ygimQB`;;$}P^a4&BFtub|HOgwFh-i{pU^o?HL`G*TM8<Jy_<`Mx%I>VGNVjyJ z<hQhFo0UL*(CnuSV>?$^cAfI!3qSuqzVy|v+xbZTI`i-KHxO?8$<4Pe_=^!U?Y|f@ z9eV=++m{D}tOGQ5FIb0ZwEr#|DUQh~fw&?av=P*0`oV_3&<LwDIAUOA*oso@{62I$ z!ll`U&X+JhGbd8ca7BiWwqcm2Q1Gnc+ku8rJ)L+SPS8xh@T>jI*^65g&9V%Sfr9u5 z&d;<}>&5)YBfA0APWl#=`b+cgPBh_d)F%Y6{hIIDL=5SGv{fA#)AY7Xl63#Jd)D3X zqgywGzna~d&cQ#;&yT@hx&tvFhP{9V8)(A;?KuXpK9pCLzo~JQ&lwXi9N+%?&f61z zUl-9wj+QwZ8q-DVwcj|wA_+;P4^YX712nTM+64+lA2a*jJ!$1eRi`tR_Gju#cwsU8 z#^CSWn>J}*zmKGN9F3iuJpJgMS6_bNnI&{f`AdOob=LnWo0P1Qqb!TIk^aG51<e0q z*X^p@x4<=itCVR8$xb2DoH+7k7dw@0NAWr`@sxYLn$T^%Q6A8L>u%h*_`4LqU5Z(Z zH-Dr3QutHg8=4EXVp*(p*R4KW2WQLKb=;$S0b?D<$vfihC>gq8oy{aGxIrV^WrbD^ zO|UYp-s=EV3EAdUtH0;bols?z9u33(oKJB|W}oA`&~(s7G#Z+D$T<S|{5(hOwk90v zbJu9Qwf+<eurD!m-}BXd8Tg9UU;7^E@x>EM|IJ4wh4ZDPLE$iH8~~niI0;&WCE>C+ zTPH315?6J>bRhMiIf8vk<F^3J<D&^mr;#^YPX*d2gR5LNKc?{KlaP-)GY<|)oXX{) zPH>Y$*)8xCi3VEz#n_fV?i1=zU0OuS;kuydmsQCSZ&k17vP9!J028O=Tb2c2;=6qL ziSMo1e~akdC(u}xjJAkom7^{e_~mtd>Bx3AdXbl%y)n^YFDL7iyHm82X45aTF+FSk z0`u)9F*f$bdc?ldqK@{?aro`yom~8O$t}mNin`<G<2Ot1X`V1uh>+3~Pf7X^AV2Yy ztiDJWM@E&(GE1>vl~wAgw$nIBdNf}oC2~SN3rVpgqC`8^0+$TRf-jgwiZJaptIzoO z+W+=9U-|ksuKxD7?R*sV_xc|(`@)Ss`RT3yo6bl0(c(hukcOLOm7Y91a1mydWCp-u zfX2P(zl_NAbn!?0s{Wy)8Z;?GUo=6c;R{jehZJ4VzDF9R8^3rj0oYuvNA%Es)qhcW zQUCZolQZa2%nb{|FVK_;np6qZyI**omQme-ow`W%7bEdQXuQn+<2LqkjLEnu+4#%U zM^qwqIwdd~uzEd%H&Vseyp>Uuo#1J^EyP=CGu^&r{SDu{_U84Q)qjbx?Z^+oUoG!@ zm?hYbzc_zC`80I^>L1VXCaS6M*Oxr#j1!5Ej$`<lG5rF~y-S*a7kh7`9;+bNX{^x( zCT`T38pAf;-OpxhZ8UDj-%3=U*aM5Pvpcfa&h3l<P3I#%SY{wh128a#zw~jY1vm<@ z(?mS8XY=>Jxc0-ty>ryo(S9wD5Gns$Rfr^YNk;B91FKK4@_$6ZV^ylS%wJ>zN#j2i zy@V1I>wN*IwZzJi=FMZmlH#?_RkqEte_yL{v$3`?7VGt^6k{pH^dYrC7aJ+_yZCRy zx@z1OciEXXJhgDinqin>I}$LLIu}v^Z1UK?)I;pp#}NA#V2pp%#X+A-#k>0ZY7M60 ziMC+K2!C;fs>zQuKbQKegp<ZeX_MGmd;_?>pwBsnXPjT4AN*yl*}J^I>dEDil_TkO zB(pW85x{Q@-u1{->ixjh>hqx%{7oW~n4#t1a3||LZQUka>yRl-$j<!4IKa)8s=z$p zSOCjm^G5Txvk93Zb+F23EK}xIY842k>}<LXyqMoBz?WjpI3;qXBLhEmBq%CC^%Wjj zT+AJ_lRI;rbQFUFk|ij4!=!DAL+5UyHi9{qZ4%ur`FrvQPPQgNjB>Myd*jXv=5an} zc?X|vsE8`mz11rtS1<2@MAhBeVIyY~XD$oF#~tdTshsd3d6utX2JPTy7_n_|<_pb^ z=8FDo9G>u-jarO5jE~#<vrFrvSCZze32WvZKkc<|rtCy|kkRy2XadJuG7=M+x#W`6 zTeTDERDoDpO|_PqYHDi6CZ6=Qpz|X(X2(}NZrvZ6{JQd#v(CTlFTV7(E3Zu7-)p|7 z`g`3Eue<)npWJv8{Qbo`MxI=cJFWiDQ55MRi*k5Bqa@?l#O#B6_c{nN!N~@r`=SJ* znA&EUW?GtbUxr0^QDJ*7Pbw_35?1~aFg`=AsK3Ix4AtFK47>`zsLxK$;C-=Whr%y1 z!F^28_&{TPe&KmMq0%wuNk_lZ_X_VTDhimNQCT0tUcT!=eW8oL+o?lfW4_NxbGK|| zN(uDeyYAY|7+9+K`etpr7Y=XRy7A^~uKex|cfem7k9X<mq}~1DR6S7q9dU%&4)KG2 z#_0!9eGlM@h08K8Nt3mW-tZS?-!Vtv?-9ngI{Nm!15(j8P-e`l*ItLe9(w2Ko8s5` z8m-AZPpdk^Y%;+`x>!y8CHb{LQzxJWn8Cbg02aXb%ZXtZ;qToJ1AX822X;UHl(RWK zvv=E%zkJy_RNNG_2$iDb-;$sZM}En$B~B^PmWq}&QG=FeLm0t2<u-Y8)#???Q*F&z zB*KiBdZHy}@wZXgSv6&9m#_2OYu>KRn;Z0fxYYo!Hzee$s%uhuRpF%;(XK-_Tvmxc zP#_eFyv5sKSNMATJw;*9EIhGhC<Z6~UKKcCU_=}0B6I|v0k{Y(fEDf3t>J74Tn$PQ z^J@E5`@MjHsA?eQ>V1?dwl$tnj#;KqjgPB!yht+O*2e)bC{+U%s(G5w*T~!ira)mQ zjJHssQ~}wT)13Dx6aPlx9vU|}qP?Hnp4Pp8(MgNBE@h+%8hTd39<xmHR5F=V1HiSt zfHpUHR{#$c*iYz3WC4zfykouKZ&mM1pAJQV08m1Rh|1~%Bjou3*p`Qqf=M)TbP%X^ z>Oz(rcDq;8;cQI8<YN~Ap1xuv!pcqM;L6*x96uswYzdfkPFhjqO`MEM&{{E^EvGZ} zP#<5Boi?UdtEks|n-0xei-I~h#ZUTj&|B88Iqyd9IbT#YalDRSp&~k8IyzM!?$0DB z>#HrU3p%AJVH}+{IIx7&ixcyo&421GI7d-MEykF}e59F5FDwas&biTo5gKq?{u2=< zs<r14v=D(_LRX755+w=jd7MiB(xPnkF~???V3bohKY#4gfBe^9x$-J{A2IddzrkO; zpRfDj4L9BN6S^PK`peLh@Rve;!zKsd*kT7@0sv-|#>_rQ(=QfS)L#tFXlR<C^#U#> z)zP0}kXU`0S&r;?qz@LYn&Q_5<1y{WuKE%?_*fCpiS2L1WsFFP(OHZ;2nQ68O8GK# z0*QC~#fHc)>~~_l7nt^UA3EXVdwCsZrjPpj0G9GHl`{aN=wv949VoxP|4!y1+{UE2 zTQEM~vvu2j@OLBHy_V>Etzs}Q5__B1UHjFqTz&mI?az*km7CZKjOBeFpw9$IjClFX zvrj)u%;^NRKhqvZ=Qk=wmH>t6(@gi?w~jK!ZwOmX&%F$E-^S(nHO8O}e~(~%W&(;s z8nW^8riLMZ33LEvY!OGnbb1K4>49YX_Kple>Cn${nY$CqMMmME{a60dckF(~;9xqZ z1JCT;`Ll2Q*+n0%ancsprL<L`7NPkYagIDiR;=3&2Dk9kDk4(Sm*Ow^ebwrfD_XXY z5Ora4o|H_Hne58u$epfRr<otBZTXujW|vpog)MKkBrLh-#NWwoy5R4ye+mNdIt{;( zy@|hrx^+|z6FAt%o4+;!>w-n?H)RV7umIM-192@EkLn6s0G7XkSkEX{sb;eTloxOr z-p|;Rr`Z?Ipb)f*O^IcBLLlA&F#Uqnvl;NxW-N!oLUR_Wgu=brFUS?Z0$21}vgn`X z1?bBe>ciHoO#DmH;w*=$oRJg8+-dcR=KKY{6;5F57~&qYTg(k_Ym@WY^SbHBbvO0} zdJ$diSH7otJ@~DKO7H-1@<#Kw@<CF_3QA?m<XizEtZJt)!fxetNmG0!o!wc8Kx2s2 z05Ipgq(hGOuXCvCw6&aW<I_W`k|JxRgvd+y+XUwImxuz;HA5j1iR_A%C$BOJ{#NpO zvyRb_$2!z!d_0>z{CD8jH-6WuL&wgueGMs7#RIo8fjsQ}j|)ri>#M#Ceu?=wo-1-m zusIGFL%A*=v%hF1*f_{7#sSZd?b$D;-_Fh@<+URCNi&X3$&Ums1gFDbbsLnsjBI6d zZ}rAUIt)xn#t?LN%118!A}P`8TO~gpw;115{B~)za`gv4ap~oM|F815#@;CY{^%z+ z-$eJLsK0bSiXL^>#!XDVP(w621jjBA#3&bg_o4z~f41i@DrhJiUuM`C^^_5ye)B5Y zFM444J!^+{B&<UW%?MqXF`@9A!6s<|rmOG4bUI>SEb+@!2B^Fo;#zS2G9yyRU$A^I zHeP!DqHn(R0)D~t_<fvtZh!ftK1pc3sK0n6VRU8|2Agit5+9bo417gn@Xj3!z<~w~ zaPPT~X5WpB!ht1PAaBz{YYUC0n>XC_jlciWH?CW^MP_p+487dhv7qgD#qg6vp7vkn zK!U$EdO!cHdN4C6YICQ4q4rAv!ml4;`rji4_#58N2pl3GJq&YSuO{MmvYlSg_@r5< zq3sv*GyKi$3mJT}JiP(1<BZT_nf7e7_`BBMq4IktrV9hD!Qro_3oOw4p4q?u>3t7v z`1im2{P`dGAWpTo>vl1LJdFY=r9}(xB;zGmfiF^0l3vo&%jELfR=%>USd=V9L}H6h zF+*+9^>G>XcO9rJi@(+WTRHi6@;5iqVoE8-GW@Ng{1{$H0&UF!EDG;?n!izi*$rq} z%IGP)XPBc0f8zzc0I&)$(tYNKQ@Ktj2f7Hw#}fR(-k5<e0l63H6fKPnVDSQ7G3^RO zRok{$%+JU0H}XruuIYzZfMm$&a)fr!t)T^%DNVIo=JqOJRz>D2>h)Ib)A$>!8jp1B z$vo2H6~mg(v;0`3V^eVe*maQmt{g_;4QzXn3upX=z;&qa#>&scLAOfP7QhSqrWR0U z=qa~MrJ66Ba#uZPPGB?a2;}eP#+3KviL~KBHrW``;J!zjwfRY1lOu}-2dAC7z#k^~ zxIwGf^wq)$5s!XnSMMeg$@+W%Owf!zS@^Zo?@$sq_C_V6Uj8`z_UpLnH>|3HJH^^M zY&`mcj`z~^@La`*J0&fBfxH#(lb5OYT0nBKMWhpTi-c^XsBkg%W;hK`T}&61$Y-B> z=41ESzAA?b-TY|w(|TSPUh!b;3M@A0%&3h7o#S{M@RsJ_a<hub88{=2nxhyF$N9*r zN51tN-yz?vYJ{WVYs#8#h+Rd<Wxg^C%+DA8;TQk$Ygb)G@89oUqyGB?^xyRUE&kq~ zxd&5*-*q?mrJ*zfaO`;CVTNMV^Vuo*(0=#Z1dHPpZIx;F#cEoNtidPr0d_)P{?LE} zUZx$4aTWh%X6h5rY3xPyr5RXvExQFf$mB5Q9+JNYUwJu7FP7(OW2FO<9i5o=_m_Ja z3JU(B{pu3Tthmg&5T7e-vkySuga@7d7Y}Yu=;F-0^+anccIV9-H`xP88smk9W{hR} z?z?_*?U%3k+kgF!bxcmkoD(=X(d!x4D|AoT_vBvYoRGgHz_ZT30Dw_at%|6ttIEIn z8ctNi9R$CAnBgT4zo`q>0>6tbU>yGT2+?n&|LTW^^`KgSajkw%?<?vVj=$jmn0t&Z z^Fh$+O<jX%QEAw;0sdmPSbyjG+qGV}MF%8Xxv{4+a@i9$SwHpYmRr8{e}C?iA3gJo z)8ubSUdo=xCAlgUL`6Ij>`HOcs!WDcOf<4uIxj-YM;&k{LV=h>0LY?>Mc4Gng;8eb znY6R-{LpOM+)MtA{#$w28}#i)md?7ed438p95Vv`h8U$wskn8CpH=uPgM;Cz!x4L7 z?%;3hyTkO{TrRsczZMtWHi=_JjKelCp-X-^7OS%{ZlRqr*n3P{0#WYj1a%S1(oWML z+dNELZ1`KcXiK_Dn3$^o#{^wN*{Wz$MmT>0{$A07L9D1%*=1d;9LsU*_NvQRy7`Ot zo7z1E%us(VSNYmJvG@xD!$a#bGEzNt5lGA_Wh;GanZz-XJM=k|jQ_oGW4cw{nte7J zz)Se+=S;n7kw0eTS~7)st`TR33=ozq!VDIY$PiL02pnqg90TAYaJZA}y=ua3ZOo5k z+iP<BFv_hwR}tcEA}Y#<`8LAgMl$*$W@Bsl@?|HSp!0h|<F|yZBk0$XfptM1mi<K} z^D4FLn^hPjUI2HhYUF}MtzetqFMc<YuO6JoP7B{GJgtos8C^oS%Gsu7AGR)%!(DRp z;p0||<Z?hg3zfRhv{41l^t;(p%I=VSVbhxN1i(lst-v+|YpP0TzDSXkQk^2SIS=&O zG~-WFIZ0ipzu)xLs-PNQZCVGvOZdy!8*BfRp(n4r>YI+ef%h}Lj~M;=#+z=s<rekd z+ZcXw9mV+i4Gb$Rn;3wDp$x&AgF*ES^ih6MVxQ9vY+o6S&o)}3qT2n}o;Tu0Poy9i zo2;JB2VZ8wUq)BNY>g%x{;C#pj#gl7)dU)UF}*T@u!d%E>kXsx>iEpIme~wCg>uNC z5_=q<nR#w;ND6=L@M{NNdI0mnj-`PH`~bQ;mSpjZ6PAl@bor$nm|jS_m)Q*%O%Wh7 zozRALKe_6PKfB_euf2^E+fk<Vpx&Lyfob~Q=j;niex&-3UdjZ7#0CwOq`(1OvpJOy zT&gn02pTY|?cu}dz_?&dvmY(t?>pL`UppMN_#ONI>Id!|6{afug}{t99sahH_Z}L% zVKMqIJ*|w*z4Di-kMw@NT>xXhaOf0cW!u4y2OizKZ{Jh<9^0|;Cs%&)|5|&&IUm8% zm28N3Ayz3K*qE$VktSH8R4W|v7w|?-x(JD2DPxL{A=}xBTtq5_aPwF4TFO|Y3zEvW zvbXums<)=R>qhgJ%iZ!8ta9_*Y_Z7cx*Gh#UrKPnVWD2wm?%*g4hUd_C{@1=XxUU1 zc6YYSuGfsiY<Q)&fFBMM;k#!bEGjkvxUIu&9;TNAUL4GL79zr5&|9|Qaz+NuHpf<# zTcKC~g};0t`Kzp_oyi0cF!naqh{jMHaU;>xO*rRVtMA;3U^8%lo26R>kH_hmG6u^U zA?;e$?<rv>{`&okznM_Et1&Xs<aANY9P8f&;8u4@rcNr8%TQ@w+bjoxxw*G=>9gu# zp}$(NpS6~LU(2*CI$KpvNX}T~%@BBoVK+m<@OK6%q`<vmOaYkvl8te=_Ue)WU_a3m z<}j{{BU$~JJQwzwwh0q}>(wjon&+orjM1x3crU+bzUI>mS<B6ef<<2<C+fW@o9u+0 z(|b(s%8_jI&Io=Vo+2=j*t^voa*3PVz7FNVzDgcf3--D&FqT~^q<pA_=LO>g$NE8j zq|+v0I#s_IM}l9)poj6OFCEDkzZh#DJKZKP#8Z4t%P!;7(L+dUKCx1QZHQ5d4AFW6 zUk1BTFj5)DZfN{{+q_P}HJ|JFuUAL1<htZim(2V7$;<xo%U}J*l~)&jzxVIDUtRy> z8*aSmmYXyC!q0yG3+EqPzwz!(wEl`;ym)ZF5<=lG+OM|f=XCphmg(IErEbc_VQ9*D z&+5Ku_>E4BP4*RBnVopy*K|D!s4~j}4Zb>PIS<3Zvf47spdqGbX!g<qzv+`Bf79VM z!(cs4UmSgcQ4Guc%$x}{|1vQ0E}X7#*v4xL{_afEZ#n@p(1uOG@E9{R+>Mf`kGE!M zhNEN<<y-&#AO7r*{`~*>{?F;bW4w1H?&!ZY`Xk+r(*G#qKcoDYk(kuL4ozB6jd(5k z@1accWbYyX41X7f=h>zT@SBXe@mBHoX!uKwrH01F1bu*1-tPlx=hpO(+DmQY$xMQ@ z+lmGr-S_Fny#eJH7cB5Ag74hO)Xni-j|F<yBTP>5#ACa6Y`o!H|Mb`Y{SVh(_=%69 z1uLoiDY43wqGgCIm2h{*B68fw$X4OqCNr~Iy}G2P&%1+Uv{*!31n@$AO-5Y8U$U?8 z;?Gj`*kINjIXU{D{BEToGSCDbSNVI(X~umfEcjbRe3kfvziMIxjnD!$i?Ddk-(hg} ztf3X*akcc276KUixN<)Hqi6+2u+z`*T#Z|(oufOjif`IuH4YaUF$%XgRGFV?YO-wf zTUeNsDq1xVtMjP90kDHnRt26?1E#`No374d^et~Ja9QLLY<S$q2>Mj<t>Y8IU#2$< z@*VrxPuu1-(zBA$1eJ+{zhbgL9D+_Xoi>DSRZ%!JZFq6*rS?)+*XPL{1#q4e@Uj){ z+q#rET7;^aC3`GtVaXcgKO-;;1qbu3DVLD!&K7F}cv-M2N2YUqO)+Y~xKNd4!>d+) zvlQ>G{~}X;qX^l|ax@C@>E)?TOft}-V147{lTUiz@>Lk7czffqh*n}%(n>ZlYBTZW zt;dsjXJva*@Oi<CarF54>l>f>ei9-Jk9M*&ep557m&t4OtC4Li3w$5fgenY-uKTPl zA(oUH9;;$wekw=DiO9OYYvFfuDs1YGb)bLMJN-Zo)>b7^)i;nIvOLZj21PYP$3`9$ z2m|bGsi<^G$*4H;8f~#S9=v`=YlnW%eACXOtoYHY(?0sC|HjahS6*e~uhwVP-|Osr zbkj{V0N+Ze`G0l3QY$n#I)yOH&>I?`)%`R+<HRg2i@x#~pDJjIxAW-giwcNNO9L;2 zwPDl_NBN09S~Qhvq6RnqFfFF9($stK5cuU6=+rM_rdAW?-s;($K`YeWolz<11eDnb z8~`iLzqI~ZQNZijF*lfikMQtr=2gIoj0#L^DU%YQ{DM>lo5T@XC#B$b^JaE%CBE|) zKl=I=e{|WOe(B$S#_SV-n){$q)1f%_Uz@)1e$KSV&(er(Hz5@9bb|K1oc&0(mp;5z z2l)*)=(pZn!rujn-Fo{?5Z(Mm|J7<>g@lR*W_XACLd^%j`<|fNwRUIg8nHt^${=4j zcoPx&Q*F$6Wp^<J1N<%9g&mNL9n(wP{~*&EL+(d*-u2V#uld@S|LRXazxMo(pVgCg zv<xe+#oh>1q<zt`HyM~k*3!3-8-Y>)5H0d$qc@xGrgVY7<kpaLDSwkyDRf+0vi5!- zNeP?G>v1!*zsA$JWss-l_OdA%y?*YED7R8<ch}z&TVX5mQv3%96Mw_rkhgVVSFQg- z+@T?h-w|@PfZ<-@g}smfu#ygdb@4z2j##Ulo&$ifLKhU<DJsTc$tWU4rX38SDC64M z7K_0P14Rl};yJ}IDd49O^FBm3EDH_m?xobm;O+32&=(f7Yyd~a*7gj5)6lHx+B!n_ zHV%H#xl?xX3CB}4<hM%tuKXog0qDftX@m5cushrI+8mz)xKQ2%o&a3!_w^}{CGb?Z zRcS|7NOr4575(JN&aUQYg1J{nv6-bgz9A!E+^a)PEcQ4(E*cPWJ<uCs&9LS1oc3-M z^wW>St2F4;y9E@p4BX{;<>3Kh@-g!-oVeoD(@(Q6!X%zcBGD1bDiPqqe(NGFZ<Kc# z@7-^&5!TlwkkinD-SAvU%T}jM^u^vAN#XrFL2FfstF5N7J8gBb(CRJa2HqfCG$FXQ zXJv=CNT}kZ72c|JcbSrsCF4tu3rWekg$La78Km^$vDr->#?-MBfk6pUQVqIT>1XAX z3LU(}L@_O_0oBbF42m4<+!JNThs(OewNB<*a%YM@W?nci>hD$GZ0D<gzt+}Y`FkV7 zZ`|_JpH>&(+igHZ``wDKl6_*sUyZPgfBZ}OvpoBZZdV6r{#5@3scryF=ialkugs-w z7q-%$2F@PhB0QS0F55qtpY)Z`+KUgR^%tA9qe5fD)mCjl{gvFYNDJUY_DJGUf{CFw z_U+pjS6~L<U`8OOhEQ3xpR!hCUl|bZ=IBlwq8$SoW9{}*e|O@#v>gRl{;KE0UTAgq zrVZ<F{oddG$>%Qp<Nx*DpWS7zU@h00-kla0t@8<$e{e`J1xn|C;d$pGHX(?lF5j4) z8O<vu0EWOi{MKQ*057F(_eR1hee_L6=;-->-+W!CY5Du|D|XT%ni`<@)6I(RzpDD` zz}Va!1Nu>_7MX<b{&b|;Ko4LC;z$#)-GJ%5t$iH;V|0ITH}!`n_B^~}^Bq6E{`*&d z_3!`cPd@*di_SmyV`s(bwM(Q)z*ACLTFt{GS=MCD-UQBP-QcYiA`=l<%HQN#AVrpK zUN$wGzq1_NBu?fY*H%78&Q`%-Ztp|nFI$kge(dii{-)J3Dw{eLrG6Fs%=lZS|BS!V zAu6q`jb*t&D}-qdo=(c*oSE_WecT)qw2uakBuz}vP2hI$5WoO-0pOV<vJ)q$nSw<- zI-FhFDAr{s6tyANXcE7!pO6d~u?VNc*DK?F=tPn>EVbI|PQkO(cGK8f43_ac<6LxK z#?5k)Lw`iI-vUR+PMu3Ag=_936WFI3tk0nJs+ATXD>2=!R1JWwio~KIe~Y^&+<@$2 zvryfsKhBeeJvL}RBEaXl?3M})f5Fi_gi<N$td*GfW(f0xpMiv{%xMM%SVag9g=67x zQjvl+ps|n@z6Oft;wMK^_;SdU$)B5{me6uDWjV_Vl-T@4meomaU*)$SGmy+XXx8Ax zDhn$b^bZ&o9(G37Uv~1!Rm)GYBBl!LR~G}^GB;y~%`B^$P;scJ@LGOP-zP8ZTLrjh z#EppB8+&Z?s*6jqnaCy*6$cT-RbtC1kJOo7Xpy3cTBp3CK$WLILw^gMhO4e_<VgX( zlgr|9VRIa|3{j$7m$26X3mHDM$E)ngNzY~9a|X|4ITn>A`~-Z}s%j8j+i_xv*3=wx zv-W0^h~P&x!ilNxn4lsMfsAli_LS-{UwSIOb6(0H!NO|QsUNMG7p`XBU$tL4|I+%a z`5FA8|Jnr12pr760Fcrqs`VKNIWr%_KV@oqT(21W*uKAz5XBU)D?OGEVp2wX3w?0n zeZ^il&0iR5yYQjbX~nN<FNRjzilJ_1Ia2l0hv|@3W?Ph59ZF|lrv1gf{lbf{pgsd% ze4Y+4qA|K?@s}4%=U>O(Kmpb&D}EV$W9I|#ch@dFn3=3V{;C3_|2if#uEUz2H#1ZP zEx|SgGnwDI8@~P*pZ~qj{L$ZhNB-J+>YX&bqd)G!jLXO)`<(swX`QdaU(z785b;Z^ zHZ=|m&`v){AWHD}$Qa;i0b$6S|L?q|d)DEjo_QPf_Z3{gB{#0&8tO@5T(Fn`X&=ai zxliE!_Qd0R7!8^ZNa=xOpDJCjaF}!C=M5^rggY36l1N#txW`dN@Pf9@c=ygN8`j-= z)AirK>Yu;##mi;zC(r%phqXnQR)EAH->JujtcXpNh!kR#f!!qJw2oP|YbNiE-U1LY zFw;$eOjudh+(~G(W_y_23dT8<g})(~feDtb1jV55YSEkXUd4}7K&Pw@G^B=<;4hZX zkfA{lJiybjW+SvM2uJe;z<Ndpw}6-3-pnBup$@kPz>bw*anaojDcTrl=OaTqMdxe) zqm5n&bYmZekrz0NxA;YYrR9mKf3<rR43T@K-WW!yPa^RU-Qg^GDLGSi#L}%NR<vL! ztS^=hR<<bz{X8Lv2f*j@kkO+N-z$8zwX>x(4s_6e{gjoip?(<?NXiMhAa<(K%(P!q z$}oX=wq3_PpaH_qk(2J{+oU_ONU!I_tlv!tTA%rj0dS`Tt5kVNbW>-MFOoU(87%or z<uwz}$;Y;tJj!m6DpwLzT5}{EqJ|TK1+=EN)f38NQyy%Ut_a}7*oQvovXExgi5qx% z-DeczA*H;mw^4{vsv|<a@=C-5F|sZ}`jhEB#6n=$C)*J<?byc-*V87vdiAMvMb#so zal$o;_yK*`DRGkLRi}8=310p54`TM>y|QGRYkXfoOx(nAsttiMF{pT)atiVFx6!0) zNs~DbF8Et#!%5pWiK{lXog}_1-`Ujnh_AnLwVAq#j{@}kfa$@xTwyLusgl|h2~=rC znzgyDZ^H0<xlY-G?=0OP7gsfh163FBP5APD=+s73fujVg@uCY8f?nfpkiOL-W0wG5 zCk2tEO|Z)z#SVXzJ<~F0*|mi8@{|l#3)h@^!5>~h>#z9zE<<m8Ki20T{>aG}Vt-B# zBua0r&oMsVN6-k1QCAb}9)^E%-T@}&vF|VJ6^8T#a`a;~UUa{9KZ32gQ)zxq$0JS9 z@D%MgYU0ab6Xs|v&|bo&VCy%(wm&e|Y_B?)a43#gFT}YRYCANAcHZZm6Np~Ojta%V z$N-ob>2XK`zW@{d;x%RWSjJz(FN@g<9)Z7Tzv35fZutwh@O#GkETvrBeK-AgZoT%) zU--RGefslX{PzErzbe3}zjXf9&&wuQyWc)#1?1UhF}@S|=;N9IqW!-7GDAobG$bdy zhW+{ITW`(v-~R-?Q;@$5fc2lvUsUJUlN16tct;1W2^fg!qveCed{0K2nHH%<=mLGu z#yjt*QM*~MWB%sbZUev!VMg8J?z`#2%}CI@GbY$WJGNr1zWvr8|KOS{|M^RQefbwI z`@M_LKkwro#@w0aUovMHjD!TNwPZ6wz#0jOkc^@&SGA~QWzk)HY)V$u4_=xR$%>8I z%A{p|7MtYf%F=xzS$b@niwP;0T&|25$O!M5jLvfCM^#!!UlSTCSCf5|0-yiPI~bIT zQ^^plvYY@5YXe`Go<;Q~xRZ5O{-|_40h~5q<~Gh;-<Hj>4`YOma>`^0G7)nyxGm%G z`8Z|KD%@x+U#O3v|LO}xX-?@)p_@*ICIt{AkVLB4d;<AlQE4j{Qv$2UYERbMEr2mG zV~%EpR?SijyB+>|5i|Zq{|)Uafhc%+XUkN}Da#qtc10Y?S%^PtGEPC*!0k=-R?iHm zayD=_l}Yt1F)8=~-1f2)Pk8_P)py-yvwqGIzS4=y7_BTdCr38nk=2sGhh@9+2j83I z;In6N3X+4oaB}rFC-KdKS;$_>W2-QFFR3)9j!CMe0G1f?O0JTSg<3flfQ7K4DS(1T zg(AV~m*MhYEY#{n0nKFe9G?cQl2RTHOD>l@D~lwv?}0Rt+^Zl9o{mb*$tRwO!n=}; zyc__Zbkd5|tCyd&%vnxWEL*k$&@4NF(KyzuIPrvKtJbVMdHE@4oQ4O+DW{zZcGjGB z8X#iHtyZG8udykF6RSA18eE@x8k2FaIqh_ODp{V&rKg{9>Z%p1PvbRDgE|#ka$WSk zDSlju+Qx5Jp@!#SK$OJfS*sI;HPDw^n$SG8NX)a%N4(+cQ}S%yiA(qmm5J1S3dd_W zDXfhliBXjH!&${NUBXlEw4B(>-E3n3;!cC|{@i;g6#T}YdzodGcg?2a;$fdIeGwkN zII*P8^ug3W5hF?bp);tnL>d<OO>DR|w~X=4Vr+%Zi7ZnrSy?K}UaGBZ=iIPsScxJA ztJa)x?xmOiudjR!>vQoJ=d1s??uS48(GBRnH`D%$_4()Pz^^m7XXFirWuzCZ_FG0k z2ETjv+3n_OT7c!RZJ(%Tzj9nE+?k`#zM9TAkXQYdHr=%TLRl=w0V__-4*2XD&S8HR z)OZYsS@b^A+<dSV;6tJBOW++%lcOL!O~EfRfCp0oVGFK7p_mtektZK6^%o*R;hjv_ zWE-%mYX;`P{!CPMY^OO}{;B|P-?{~ttIeA?-X(k)#_^6je(~e0ulU?07hZDNUw!kZ z;jhX+?Z^-7XN}!=9}U3idqo5Iv(MQm&8Q%zg#0xPUU}s=4x&L_LW&X?0Q$(=N2A~V zXTooPTl@vMgm>(K^!icpOH(kLZ@l>?iNWu&)mv3z&L^z>#MX)i9_X0{cn@P;(<eDK z3_3SQ|E1HB!(XkxeI5Sm>zoS-`qGHMc{4ujD!`dPQLky|U|j$6TYhxycdq=(-+l4& zFZ{vpuf6EJv(K^uOwp1mUxpjD9%>-lQLGh^EtxIj6b;TJ((ZV^7NQXaxV6))I+K!7 z$+6^1{-UL3FWhbAuD4~3m*t|`A$R+;@K-GG2#<_g<_9d$i9nQ`iup1N(4d95P#`+M zfIzMAK0!>VBRK<W!EEu@>(~R?T(f|0e)1m2?oc__;0ifpqvk?|H3QwLoR)n!#$k2R zbEAxwA(~G9u{(2+Gvb&3D6yC$_+2R?lxEguz@X^?mrgSI5O2yFln+1E>0JDw4;6qN zo|fC3qb|)*9=c-z-H(49Js1qL>46OK5f@K+t*eRZb^-W|(^ER8@QOMHgrjJJzc7$` zh6xHHPk@z+P3Q=RO=gV&*%ZuSs)yhA{()-_^XvD&FXv$INhf#?B==2EKKTUqWiXWv zpOWv&L<AgIzWgNiTjeEHWUpzyq7vRr$h(tODUMTkt1JqDQ&v+3M(;sQw3Z?Mnil}~ zRPYQHn^>z)4W2|5n?MJ4sn0faOQ%F{0$FFA`61|a#_4NT$}u2iQ!T&ph`<tgr*j`~ zA%oOoInfI2npJ#C<cs>lnp0Mt1ba{Zz<b_%;))d~z3)BmU*^;cA2@l%iSPZv|M`DZ Mxb|<a{lW?VAI>OEE&u=k diff --git a/allensdk/test/brain_observatory/behavior/resources/stimulus_template/input/test_image_set.pkl b/allensdk/test/brain_observatory/behavior/resources/stimulus_template/input/test_image_set.pkl deleted file mode 100644 index c529064e75fa9a177caf70966721ad67328f4c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077913 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�+!dEA!=M)t0qRcZD zRrh1L+q=&c)BOhzA3c5c?D-29&zz!B`%hF}-Me%9wk^3?6wQo{4hvkdWC6)7Qzp5$ z;9WEfCiLpIZ*<`UBzsr)0lcli$AI6V(63R+A(DMu_lXq@f=cdfet-KPic4LT6?%y$ zr|vc?$s?7Lq<*83r|S}EaVz~Owfg`oaFV%El+4!6!pcr=9Xwrizk!yu;8Gn~7FAfD zuia1*1_4b&BQ?Ci9kr`ut;|@>CopN~qso~ua8|P{&(b`DwYN?rZ|U6vCP9z!q269a zaHvQ$96?D!$A;B7oRTawWO$@<DH@+~kM~N%=B3}`{^oW2`-#y&C0-V|`v3reN@jpk zH(x$iKXeIQTgXKtZ@CkQ=lBc~m)^Cv(v1$9^rYdj*4Kne_yf440~DBq2Lh@@nSck- zDWq<Cu>e<e(L{BsCDMab-GfBd+^8Z^x8%avV~4h`4VW!d5^_wSt)ftgf6Bi%oHEYj zi{kJw36{i`43h}kuqgpUjw_8yOWY?yHKs1<Wi@d~mxbpr0X)x=NlI=bgfgJgDxCWd zGzp#bcsr%*-0n>#O*1BnO&BK0*JR~_N(69o7h1DzQ6*3b^*AsXHApJ)vgJWh@f))9 z3h;ANPANAxH)|ciR$y>AmL$sF#>K|RfkVm3$!dVIUTglz>&bdkdWlL`QXvkLQa)t{ zwh~dXgoiSfLk3-L?xvhg6tM)%)~<&y#nb6>+2Xlc_%p#yc<fNg&|&mb6A-Bq-MnSN z(QDIli+1flME|f;Cr{95^vK~uhY$UD@bHmiC(oQKr&rBYd@iNu&rodi*fBaD?%la< zGYf$05@RDnRxDje`E_5;-xyLDA~{&{_LZ>7+kLL&q~Ve6UW?zfoBtk_46__C8K!CD zLp}lEZy<_a{s-ccSO`Uh+MB5~EmfB~B&2(^KWln&ul8EydG%pLP&!~;0}Phv{f6GX zeOEC79BTKWbJY(UTifUX(D3LUMLw=kRG$zIcMl2lC`-7trFY9AFalfp@<oM~20sp3 z$b_;DlQIQo0PN_}!dT}!t$hI<fCSMNFod%GR?a1=FA;qKIS5PM=>G5#EE=&QPC_Nh z@giDj`ArxEH1WSrz{lfpl4DHbvq-~w+o1{qfRc3_?;pZsZgrke-Qh~C%Dsoa_4i`h z5-P!yRPFMKVbMLX2#H(Gy#-fK9z3b1rjly(l5g^~-l_{AC*7>Y;zWptmjKu0)ym3> z@{+SBe=OP%Jcq@ci4(B&K#{;ALnfvY*LBr~N#QOb#i0_wgkci!u^+(6sM2>+btg25 zd-VuYp(r8%;_0<rprM)J*peeko~k6i1Rx2SJlB$-Nl}F$Nf!>3giCII@j?pWG`qjj z8k|<v=geb0-+%e4<;z&u_gl6yFi;Enz|yLfte!>2rDWz77Ut(7R0Ad%7yv?oLzPa# zU?~p8J1(Anm1s#S?oA(*j7);G?2Vb38*_5<@~D2YjV!utxSfczpj!er;oGL{><pf; zjzR)S3DmM&y2wyTf}P>93*j`G^>NwQAMw?M?`AGq9-govw`lKAKOa9WPITe?Svszs zJPtUi1pE0CEO#tVuxP5{>=ZXv)ApYaAK0_KXv;=r6w|<N$vg_D=&eR~v4N8V5k<Qi zZtLD!J5E0i<h6%2Jhj`-1UegN=!3f5Y%f6h0rw{u82tv403;8u{=;wyfkk%ex38Yl zO1loV<Uzf47-@Uf{P_Nj%cW;d979u58C(pM;<y&X!IB8x^s{~6(UKeWbd^-OMg$e+ zpFpV=A2e*~!IQ=oYMQ7G6Oy*FO+J1a8Aj^vmzS~+c#%xhg*e@dw1nhMdMwC88Epl0 z1YIo5lQqJ_=z#<*fh;WcE6|evNX5S2_2bYazivd3q@k>qLA(d_5C>a;G*m500>FCY zj|6D=93N=>Mg#{ZQiB6N*Wh3e$#=>~L4o4^adtxG;7VPnN@|P=SmW9zLR0Nqw53P& zG^V4Afi!R!62DRKX1Y?tV-#?7C4$(ywRh|8J%lXXx>XG-l~<IVJ9%h(DyW3}S;L@6 zU}T7dT7yUpGHD@Ai*p)6Cd|jE-Ud3tAbuc822u`>Y|Dn<NFC?VP%(RLNi57vj&o*! zA&|vxB1;HM0FvY-Q@sUEnjSVeY@<m8Z-QwV8rf{I8N+>$rEexpq1(3UN`TRFf2fiK zCJG(}2L=ThUkV7O5+&KW`4le6$)QGf`r263?l4<;r*(;;Q*>P1nk3>ll;#ZN<_x90 zWo2&4+DHMEErmtfP?X4`+geyyC;@si@J8WpY~EQ}8EGl0WXUDPMg>#2n@*S0l*_|k zE>X?FgauO$Aaut>Kq(+9IcxLI12j6mNF|!e3c5Y03(e_MXHK6vbM^v_A+WY!;IF}$ zPqso?X=%wt>aZUB`KSH6i^12-<T&2XZyv>b;bxO9l=I?6V=~~8qAm}U1mc2nA6GKu z@oj`k-d;CAvin6;?KHr?7Pv9=(QTtE<F5Ix>v#V_xFpg*T*P8J;&w}8{X=FPSraWZ z5oxS{aHpDX)F+Pqr1(vANxe)!CeN(|Q9@kWy&qZ0nu}1{y5TXgOZC;N>Y7^!!K_ZP zSpKw)RXEfe_z_USP~~p2X&D4@U=nL&ow5yq1TvIM(ta;bqpU_oafrQ$F|Evr#BQ() z7m+mSt~YN1FlE|}IG?7&CBnE7yaufGcSF+<h(INH6Y(7OOt=yu8_p!kyS;nYPr>ft zA=uRi9^0wJIC-18AYeQluRzbcjy5_xspu`S8T~O4m*7M!x^b%>mFd1Yx+QYUssu0r zO=#W7Nq0cyJJ<#ukgKBn6CyZbxU<K8+O{ER?o@B7$U`MA03@oW5yt6?@XE<cwi?Hw z?^JK6Fd6&^os1ztk_1uOa22Qmm9&DV_>fo8^kkM8S2Ae{5HiMOpyW1?CC8R@g^<Dp z6`CRn=5&6y>7v=fe6fvSY2swdH=!hw-_oW2=-Ymam#Oo1h<dg$D6OsB+cadMg3Y<P z)Cox6kPsan5)w-8ZDd5K@@kb<5*Me)ErnK0KvD)i0m8G58&y*`e+xW`)ZXoAN(^MB zT$8)AH|EfX0Kq#oO}-^iVuhB+XaQ<}J(%v~ZqPxq*f+7in(*zc#Q`zvHx=zYqROe2 zS4n5Qe&upyDMi@NQic8Od60@K5VtsX$*!(ug#rg2b+l+xbD9ccKknZ{B)2JzW>LW_ zY0ENamP|~XVSHu*y_fd45ge}jkevN*v7C0FFLvWnSM4<5ktXeC?PAB343pUSut$jW zo1s5%6s7({a7lS%thdvR5rg7O^$~eOOIl9&v<)F@xqtIoWyzW2c$HKE7iR!2N(V}C zCbc=yX77)us~$8zBZ-Y1R<W&G5-qA(d%BIH!a5brBcE%b9&!X2K}`fq;L;Gpi93KE zp%O@dwTRSxDb-rmM`tFsQ#Obe--H!V8+j_<br0~dm7*e6gDkBQPG3H`^*tXdL70%2 z2*Myrh~2!9bSgqLpiZcy;88ig@A}C28zEf<RDvhT040b7x`b*VW7k_&0ch<;0?iY; z&smj8Dku@LsWt$~aYS;CAVHnPmXw=I5fg|aR&eQ0#CdX6V!F6oNv-d*$9~+lA#kqj zc%w|ogCx*MWJwqN5P^v;DNoLMDiy~WDiN|do&*SaLnKK79Y4mX94hf_y`+>Su_c2W zvn>gWya88oh$KMrktM?=%@7+r)59ePNV>(q^aEL%iZx*F{KW{{xF^xN<v|QpD@hg9 z4hjqjU%h5SW==klSMElvM#-^}!GVFnqDf&my8)(%NDN9ua3s2EbuD`n6iLlbG<cqB zpfHM1%gO7_%gxSAm6s@k=1q{LOe?yC*25Cqf;lrWce5KTh#N<iY~pJAem!yOOuyjR z4Y|epkDk3)ak+}r>KoNHBq&nCuk<2}>B7Z}6;!>@QjL;^Fqx_7gNk8Plv$@_N+0gq zRh*Zd3O@@CTqy&DA(OiH>V4SJqd;L`s6FMzC_;IARr}PTlHK89mG9A`G|6Djz4ZUS z{SUw;$cvWaRYeU@B8~o8n+kRylpyOWXt`5!rIN0chY-5eH2_3Xx`|fb5SC<C0+@E~ z`SDD3Jr!)F)3i6!nvJrs<cHn7$;2dd!A%MEYA0c~4>SN~6sQ49l&J)lC;%son__Ek z<OdK#f)ycm_o7JyCk)t}6d_OqR3d_t5ed8zlmTBna^NFe>61_F9>t|!z6`;sM3d}= zdF5_UiMQbGMUBL@fVdA-7RM1T1mjcaF5b^6-~$RGUq5eRmpm{{8`wcwqI0hUAR)K1 zOsMiEja!Jss8`oa8~4%Z_&xs~K0t4~rgQSS)5m|@wmx9aw;aV|sAOQ|Qq&2I95&hS zd5HW=E^XI50wx?mh!oE$l5@OCR~;&0BxES)b6m+>-gde*R1zifh7*?zm9!A|H(`=O zxG{Kglg2lRm^L0|(lwp?2{tExs~}FL+HCkQ$0;2qys=9E;7@2&Y?6vm=CZn;u>nmc zR2|%c!XltbA;BSGuqK+ABqrlp0+cqAf}4|*&!Y{Ph|~z-q;un+)P2Z0>&VPaT9=9v z4xP$kkuG)Jni#}xh|5gtkD?k+>|GbZ86X>0;AWUace>#C)Vv)Bj-D-}ElqWe^dmL+ zBf3_sR#Jio_)66ct4u>F8cg|oYnQL6kXEH&>G&ySU+v#sn3uhQLQhd)fvc7;UA$l} zHN#nyGh8yIN62KL<bxvNxb3vjooM?|fwEKbj4>H2wFerpvM6wj3jHo9jbfmK!+-Y* z-$Nr585xE&SmoJQs^G5**}zhrPVZ_QbgSm-r4mpHu0&QYLN}osFtlR_-bqS!tAO{e zeR~d`z24CJlG%(T)c*A8BgJrVCCN&6ZVQ^I9?<ga1*JuLP@#bZP=Q1^kO_)1IM~~# z)p+oxi?9vbBXEJ<L)_J;l5V}g6o>?HVScot+hq7dxCr%lN0#C!4gQHjm!B-rZVZxi z?aN05CEgFlgm#S=lllY$eZY{!_I_Xv#fnavpc0`aV%6IYm0#k$C`15@LxCc(_hs8t zK&kFg9p)<t5@`MOX=9V(w}ytM#>Wcm03}+{J*{tisymUo@85<ff=LiX886wR_wUt` zt9!YkjD~tY6(+BmJ!O<B2{wd73OU?`;SzTUww$=cECZZajMK0X%_21iOW>46Z>D}5 zSu#I?TjC>t^X8{wIJXY>SEnVJ)a`>PL6J8^sZ3xpkaF>y!I6haMx8XLh*G}(23VSg zwlr_yBBX9SlmWqE<hNPh?LcyGgMuTX;*(P{3_&OrpoF!hgn0qMp<(<Fg*0JZ0+iOl zf6$X4NjXxuw@?^PoGDLaNh)_9h?JR;vK|)zPe@9EROQ0HGP6J>I;5;*Sxo6_v>b*n zNm}y3lJLRJ?1|saS`reUx@EWeUR=I{%%GK046e20BwU6LspkX6mTNa|^6kNNDTqu* zQZPxG)fMHXs87h^$B!L3xVLyq9v!2S=uj6P6tr@gnV7zv?0ZiSkaVHlB%Z3hW<1CT z^8cl;!}nj8hD*9)57UOHdzfU{^BYtef1h{V5b@ubFX6Br9vL1csOrTfsC0Z4p|wUK zC?}5*bXAMv`epJ>j{i*X=6I5kC2=Hh30nY};Pg2;aH^`I{cSg5G3)wd*Vo-)9b6Vd zI>+9oAQ8$-gIXd<TShn{85Tqu!b7C2+QELMdRR9kN#dXq>ur!A<;}hqts2B~-6>R( z_N~$Rt{(-8yL<Qr5gfr55!~;961YSZ#{iC4lM^U)E21MUPu?k24uAKa&oD#-&7oc} zkK%AD7S{<s>m3{(<a2?v?dpH26gTM5Q+$+-4J|EC0iVXF4N}2bczX;mJ#8Z9)u7^u zP|1#JmGDN8;<;9vsrqt7MalUy$MzQ_ubK(t|C)}pL{~y3ZAFqes&!!7o!oFsa_S+% z5dAS=QUkcrXim&X;hfPXa0&JVe=^C}ixGJ}ox>4dnHU`TB1=?T^1+cVP4d=#K45a7 zWD1j$ne;r)>n`N58OEHlS);W3Y15%g6l`0(ghbjf6-SC>p$)bKECq*zV~kARkeZ&B zA^|99l^^Iu4W)2em4t^yMMNvZ13y42IJ0SEZeCt~AvW&9&0Ev~B{vV7QxW-dxtlg( zvR=0~DL%#un_$W2p{|=8rtqK@OQ^0(cNFE(PIJ}YY<D_LviYn&zQJ+ng}aZOx<Ilf z*mL_XXHL$WsDN-HRSZS?tD=idEttf@j~O~>h<t@|G*m?9+dGf=bovCaw14-GqAj_s z0+NguL&bvSOBT(WIZXvzd>l<gN66wZM&|^@zbX|D7C97R%bw;xS4>#qiicj>yV}3t zl7~3<y1qlj{-9A<a#ysqf-3*6c_>=65-L$eoBE9;=d0rfKa}HdaU$*m7LM-JTvtV) zqd&3yW-2${B!af>>IS!iGF~j!QoVb}kEgFSP+v{!_?;BEZhS-)eT)GZmiW@mWvHm< zY0C?GF)2pFp9E9-ppC}hkmMiXjqH-JBVtMo@=gGcLAA6LEqZ5lwY3zd2eNJkzJX>q z04OZSD%|f6R^w2ifW00?aC}I>P_L=V;nXZ3{L?4kA2tMJCG;;YBr9>(Krii0UbZ*Y zKcL1Wnl_7W^a*Hws$SxajW8y571YS=07P}dB%rFEY&p!8oN4hf$q^3A!rN4LhownH zaHo#$FI*ciYl>Ehgi3}$22Bo(ynFN;4W^cpm;_7)M?eynqC<pn21&xCDdfq4N60F= z0V-(`Zlc$V$!3b3u?0&OuDLZhi{>nbGiVw$R7zpu$8EGVIJ4<wQ%a|EO(4W27@Zsf zKd79^qNOVX03mAEMw7u7q+V?x6H!`JtYWm}<b>4`f&PAr)hPf<MGK|y2)cEzNnX1? z1*VjdP4I>}iC!o;!7XIV&ELFPjZs*>Q*~UqxJl`aNg#sD&6i1l9+xReaglf^sm-M3 zC^T+Dfd2MdReu}Lmk_$qlmMlDN6(aiNi-F$!QhI*AYq$&SvLS57}I5bbMw|czQnrw zcR7%emZ*-U7>*@WnvGt-M}Y24uU2r0xN=iw>bm4LtF36kycyHJ1DAw^fC)pmVyI;M z$`D70q#=+OL1Hi4Rfko!wP)ByuVDbhnaYk7JCAwy{N_UNMVSJ<_rGO+oNBOr29-YY ze}sx9u1L0_5@e|vO&57r>qa;tE2Jwa)kM*obR?DRW>_}?L#3TRp1sl3Ng}LB&g&P? zTVYFgNnX7LBoV_gJDncf*!qI>GxTgyJMdJp-ljl|1v%s!+(a@=b_qLrESm%=o8U}L zhMJfp@nUvl0Zo-90VvkpBuE*C=~ZMI|AWC=oQ&Isceo^xn1o75*#aHCDo+<m5fN&g z578aAW<GQtKnibr8@_H9|LM`)(1_lKe$?FD+`<oAV5mVt6T`?7K2nsY2b^UY>YvN+ za1AINruGR7I^`G7okHzS2}V~E7ZUEc<8AcVGuCAH8&o+^@_7UxOGrill2FMMCfk^{ zG?n!y<ZhvoxRQe<12w&gJ6dfvh!DvQAd;kwH|$>h&d|sJ$!_VU%^aIN_zM`qB!@~& z8cI?kdQYD*Ywp6ORF;fXx+~xjp@e^jOF_ZmQBWe?tF~``i<c}9z(^Sx5edT3u6rGz zl%7r+$wuUDy2TN}36(6G1Eru$glgoVs7oaUm0}W-sk+PZ+!k^{)OmL`&h90P7gBY^ z3S!Qtypyw2j;c$1%1PfZ3;>k&A3IkD@+fJVtSA+y!A?er2XN^c3Dhhfi$f`=kwuHU zYH9;4Ibf=+C}oro$4On{T)k(fl3;L7Wu#K=H$r6#;7dwI8AT=N3xi~5H?-T>aqhyP z$w-oRs_j_YwT@y5Tt*?u5ow*I+(F}grQT8V>kE70zZ+ko?#CxXrH`o1lsX#hfe<{S zS+<R~XDshCm9%W6o{W_j$;~ycq*?*H4UcFB2Tk(E_MHdL)wYS&^s=hYE72{oo=J$V z#CJ|+hByPWlPIUHLopl_Nk(sUn_dQem;en)-XzNkmU;-Ylu8R>Lh=@6;eiVMv`7Y# z5h#I525L&_=MnwR-2J<_^chr>wY!(tP=nVTbOW;#K%^HQq!&~_RE(D<B&0a5%1a5h zs9Hb@++%o>V??$JfNP?qwY7z9OLG%-C*_<3mEcf~P3TQeh~Th~Vq{{`&VB{RlgcA= zcV(#r(?iAS;q$%|DtTnzcd3JmyL7KR>J-&+&FS7EOFr|Ga7jTNKcY+qM5Zk%d=n~} z+N~uxD;DeChZ8pkJ=kIan-7fKr7+41>x??-Az+eXJE0U$u^&wy11BytyENg1OO)@P zI_-Pvf~*J(i&~vP$}RFwWEhh7s#PmjtU%s|Lq$@3GBgNvc*zn<b5jM^YIDa5l~PEH zO~t8{N#8hN39=*)z^3eM*5kO$p#)_{>bk@P6?uz}U9&bd8x<VA3GCXKv2KmhK$iLW zLBbX<R$p)|0*FgA$y1o@jS1h*SrL^|u%G^5SAe7&wKwg=$v1_9`T*5|Oht^7z!g3- zRw=0R=YbWCBP4oX!c!^pQi;gYN!h`FQZ5Q5TKE|Gn=(_9Vj}`6JvWULj$p|}aARD_ zheaOx2$-~EZGUo~F5NzLyVVQd+^6Rt(D}uol3f`)W`tb)_yEkkvEKaONM8~?k+p|~ z^T8272`<sw3Bh6Df^2PVd;Uyw4PmM7{+*lj7b-n1m&Wd$DqljP3E#qY;x<^4x>SNp zJBkmSzuQ4MNExc%5(tWJH9SBqRK#vnsa}+!p17y2y_0H78jv8ZyAx31_(s8jEm5iD zttgj>lS3t1knnMZ7)~QcNwPqZJbzZ<z(L`S;A7BBHu*hV8nL(20-W+s6tiKM8dL}= zuarR$H^C;}RfUz%<S8I9@X-{vH!tuyJfil&;|9bdflMP@sil?0%GS2FXU_p}!R^!5 zCW5yX6mVHA@9U37O47smt9csBnPyn3q^;h`qd)D;id-~Rt3+<fa3R8E$KU8A@{UH1 zZ+=58qRRbJzL{xKmz>7r6eg!CN%5X4-xA7_F{O!<%=IK#vlr9(TK|~<qDWv6QJjWh zk7$!KR(kr910=B}Tby&CWG8mLfToZ;;{!~<lF_9ZbNp5YQN@jHS~5Y_#6^eEJ#rQG zO;mPiCG031P+GZSIr+Q6I0B*}OT>08z~P@nb;1#uu@NOHkLqr)AQ_Uf%q9S7qE0}{ zdNd`7Qhd_-3{|(>j@O%X-|URF2{EMBt?*yI%%3tU7!(#SoI4AHBbmC0-um;k2PRKn z9GaBB>*&QRaHQL}@7+={8q%vs6ne-|)Ll!wh8(KIYwmfV5RT@5U{%%i>k7ZIT$WUn zmOz%yojFO**2Aupy%wb@|0@^M>d=*bb7p)u86nRx7K`8HRT9)lmt#nr69Q=;+OFgp z`_%nPzt=D{^N@x=!NVg3rCI~Ala)I}430cx(z|l6_tyV5ah!^q4SX0P?*lYae{Idr z{`aptp0zO9ywS`W_mjsoS-gL@=EjxsbH@&;RsePYIk}OycN$BQ-?o_ZRq>8PWe?s^ zsRYM%@B2=AOX4tKCGY+%F<^62KE!9BH7iO}QUtCC93d_P2#Ao#G!q#T)1pEy(V1dA zXbW5kkw<O;NlV0c#CE1hu^vYe0Xdrn#k%k+4fFT>aRm3vN0$3=M)4*#`15%|{%ZdA zenL9Am-;nuQPSuewuV;qfyaOR(A#D8x(VMNJ#>K@JBB}_iTI7q2JIc#yRb~wKZP^3 zVLC-rqHKWVZNo8k;p0d3wqS?zOP0K<D-|T196z`xclF}$wO*qcBVObkU%z{y15yv9 zAT7*CS`pbK+JH>@4_^{pnj(*YYyvPShH)jy-4i*0-Rnx}FoU;95YVHIHyk?Y2G^u{ zj{=m3S$YO^$u>H_YYu5n=~7cjxw?~;^y(iJxf*FZJtH+05W&Wcy0l!TZ{^2@P*@U7 zT7lFg?_{*9+Y-Pj*(6mJlPCg^xe0QVr~fb|@=mg4OUgFC<c4G#5JX3>PE6UDSD?Pl zz!JhvPWsyT=x{VF+BF5R>K8!i0y7bbE`3WeB!)13>YU}#X~jp+U1EXl9w!OB+qdu1 zj0blfCNwJ5)ZJA%b~38DvyS^&K9%TH%gPPFgw0!~rgGY4RA4$gd*;N6V`QNSm&oo_ z@v+^-Te8>3M+PjLJ7el3?Q>I=*ylPG7&`f2T!dA-jy-7m)Na{66*4)urQ544a_XOW z5@2KwHx2{CCc&+aoUwz4Z$X&EMwsR})4u^<lFlsB00t1du{<TFF^F@AdI7Di%@S~# zT7Xg`5ggx)tbbQ4&Yv`C51!=YBwBeJB5`3?b{@Xe@QxVj3&Bzkw2S4u7p%mwY=yHK zwHw7(tbxI6KYRZAJ>>z!UjQHJ)=JBVo3L_E4_%l_FESFbAau#PMIs1M@<f(vGWb>V zABNKdRTAA|eIIj!`d|JYN%HRdGWbz>F1#HiOgg)v60#J3ITE*_5+R#j7-fq!J>Fdo zPnwPcjIB^58M!%dWeO0uHnzYi+d5v-U%ZtR6xkjK=-7XVOqjhfCp}jB9|RFWsUE$l z5oPNBJ-RhviYY-?I=nkKZs`x8(yxvw2OYn&wWE)X9hi1#iZO{Y`Cy4SPGOs^zlk^* zRRWUCu*4G`>~R`3bHIOtEe1b6OmdeHr%{x0*F1z06j?ZD42c^ymzYUDRMI?R=1iPC zZT8}o!4&>qmquo7Mn>AYHFO~fr!3JjD$OoN2?sP*tysY_olAjZ8?`!qP0~6_m%x+M z^9{?k7T)+Lf|P~)%}wl*8Ps1=2{s;`lAT{fFG5&5h2*y6WRsT`9l?@c5ay?Fl37B7 z1C}qN7$&77ry(yHLbJ!FEeuZ1-+!|F#+|#u94!yuLF{I2mE*IXrPN2b%=ngWb0U>r zpKns<WgH!VlK7IGlr&{8FDHh>1%CSEF<|KsT@nxe^wZ&^M}I!Jf7jMcDTz@*^cJ5g zwq%^ew+3f;GrAE?(jGL<`G5bL3!%IaNk19}D>@qZ`owt|&LpC(-TW0{(!1%=+W4rF zVbj05e+dN8eD5X+LzW>?6jT|)pze22rB=@SFq#H(;LHvvy_;C%X7#0ur;i_I!2zmd zsAQ#1i-k*Il2QTooTzT@7A}x<`=N_|NmTr2He)bU6o=MLoew#A;1xta&!`AMVG~7A zXi2u-g}@E@;gf+0s5){Ou~3I~TQ*0kB*{%6Nr@#osZj_|-O|Vr%7;IH{_^=BL~jO6 zA6aJ{V4a_50zu^CNmi2FEy+p*44MQg=^Z62kvhk(Kr;5r+n22X^kaOIQpV~f6g4)q zs%^M2LeiNzp3#}wz^N7~-H1wfDp-1BSMum5vJAkkaDd-aBi+lFN-v%}d1Pnqn&m%C zu{GqeGo6m9KN`X$P{}(sIX;C;qD+n~fl5<MPI9V}s1m>6L3)B6yn10nB|BX!8v8XQ z{exSI@9f8BkT6N8<c7^MUed9pNmFMn3J8rN!b(@NKdWQt)5uGq0V@cqT=Plzj6g~C zBjZ?2i;AWiZZfE}fi<}FbaG7uO1YMSt5tuy#buUiys6d+_Q~wLB36OP!9+h`aXu@R zl|9;3DjKvA86FzAYT1&-s7rJMz$O4?V*kwYkIE=Ma<1wY(HRR7oF`B{F#zDbw^Jrx z9p_=UcuL3)QbCdH5Jt5;2Qc9rkfEuvtgMWTUC7d@6UQm>gQxQFk)My9Jgw$rd$;Ch zBt-}NFPuGXiVv0qFCH|BG`S%F8r_Gw;@xi#aHwP;<ME`?Z(L_0hQ3-90FB>0fPA>b zCGY+(%$Ep>P>B(e5p|Vv1}5~vOUTE-O#Py@g_Sp^9;-$|51~^7Uy7<vSJ9&K@PWO1 zsqV&cAl@uBsc2h~m=d<z9Y2=bdoiH-kCSn*_bn|Y-_QYDdJM3JG2nh(J+<GO8qr`H zn;Ki&X{ieVGEkHgk`DyTury}XO28g*8dldJORhvWSOj-M=SBn~+7d#6EGXs!LzKk* z^5yeCVoH3hPeh9YH0;GMsx%gs?+lg{zY<1bFW{{uzYCOH4S|o;SsAj{a;mKKm<lEA z7%=9Mc1&Yi8_^q@(zDi9h*M)jb8FkPRz+~K#k-yYz!4fa7zP~6D?oUF%BHNU@{;qX z4)4lMTs{L-8ppmz@rZ-bv;o~Qdc^Ta<4QUV4VrYA>fGrLQc2%1Bv_Kh6hO*>k~?r6 zQ*x(Jj(R&Q8~yn$6nQcecPpav{n!=AlSq=_Npr|ylTP;ba!e_)C1vBU3XP`St-Rd$ zvvXwUp%Z2Bs->WkDrDOTiHMG;;2Yr>$tIG<RW87q;{s+LDuGL6^NKa`D#~|DPlZoW zR3JS&w@{XpZ8{1`*3He_khF#_PEj#2F{<DlD})LQqAcd(g>z=prer40N))#r76z@! z-AmJpJ9T)-_&TK|aniI9j_;La3(EF!w6Z3L8D9j7ubraL_gJT>(MlX?jHJUsmdeU5 zLYAz`!13e9jxtW3K8uZsm|}NvenwJE$nu4=rca*0E*Bz+_qbtH$N`d2iCyW~lKhm~ zk@kB>l@t`)5n$09-?_`t79zPXS47xQY4jkmC%BD^-fU}__%Dh}bVwtM;~fj@uO%dl zk+3F(YJ=X3O^3W(VUfP6M_O+pR(T9Y!D%_cU%Ge#)7U<Y+(IQ_$c_hKNokYYigz8q z*3|2Off6Mjdfv9Tzj%Z3sR^<GPbP$W@Z@O=6SsvJ2bUq*5-oLMC%u4#OLFVRb3`j# ze2jcFmB$6O`n%rXrR?rCEK&r=Z{#C_@5x;WDh;ZJ+&_-qgq1kFQJ>&N$k~iOg{@ct z2w;at27zXVnyh^2hbMKuhMIjC9%2!IRl9dDpSO^1th!0WZ#qn2Kr#lfTnRE^f#6ot zQ-a_2W&${By>U3R2LU4u>`l~vQ&h~Jgmx-_;cCUjvnLMk%}-qJ3`=$pxdU+ALFHW? zcf47!CuEYwpaYV@B_~ZCr&7OdB@ULv5J=hmcGyZ(H(>H6h^E7@K}q=YxBp^mS4;$# zuw+A|N>>%b8EN{Po-JguxI@>xxukUb84Fj0L?<M!Pe-%{SMo`uC5)qjqdzT`7B2yo zNZAbyjff!|muSqm66qt!RDDaM@Ga#_NH+nD^6*Z|jl@f^?oO6T8s!8C^3pQ1bMgvV zVA)z&um!!FI^G*IRKwEhfX7jBn-RM@n&v2hs%DF?5(g8FpuVT1QdCOOp>tI?@78gO z;oG6iyif_+B*LpBUjO*|aQ$*l0g-f$=EO{uEDPdDV=PBk!s1;ja{%M?iIb;}9y@;g z_?ffkE}T1emW0tg+w#)a#)SAUm^Ez*-=D~ebS2jS&WAh(=UxEpcBR{m#-t3x#Bp>K z@Qv%6=8NWgruZ@6to?{CO>i|Ky!d?F;bSK@y|LJ_2T=ctxFn~LX8h|{uPJFw4226D zcMz-K-CcMViMM1Bgxcs^LMlND;)^2|se`#zoW(~;XG*|myCKrHB8E297A@X&xa9uJ zL7V;nz~`Y}I*ce!_c`Rj)}wGMk=80LUCZe$ZK4{uyeUzF36j$O@3?{H%yqP9VUK*0 zpa(S|Nx(%-LWcsCi0`;T)P`-TuNzbXTF}OT!!Q2}SNi2MskaiA$ijo8aigC^;o;$7 z)Fa7Bgl;TLLXGUbdsxu>L<c7p6v0*)pJ)<$groNHV>0@h0oZ44ZMZ0&w>jS=;&;n4 zTmn*+ILC@-K54|wg!oOo*NpTek%H4O;qYZlsV5Kb%}el~q4u)laK{~0I*z>K%Pz-g z6TqVX3gpC>Jjw)>*Wid%6gQbrh2vHyQ&kKQczrWLPqSgDB)gHgj?hMfWj6;$T7UEU z#8K4yFG@=B{la%m&w?-6(^<wdaMJl+lL<0FIklM!SB1vV9RO6?T)3s6kTekjthmS! z$kGCw-z%sHM`<Mp5=|x(<4spepoj@;cI2C6stu)rHwcmdDK9@iU#=zmlWA!wu&MNn zO(dWc@03R<H+Rd{;%x=F*%$`m;YgHeiiLow>TW_@bOh!9<zSj;9ewA|nLTewNaCiQ zM@y>ia6HP!K^X|jV{p8)IzhD7_=HNTj|sjXKYWDfK%E+$SU7-5nyOW@+>L6>Nr5Sq zk}h|VWw_I)PM<k_?Bpqk(%Fk87fPsva^f(W_vZBE)gj9l&6+yNf;f|&wSV{#9kOA> zNMD43lJzZi@FY^DP7Xp82TEGu5F|}vMMGb*2GFE$Sha9;KzIj|J6QBQp^+ewSFyq6 zzZxt(q7FBW)s%4mnqvKkwCYf+(k0}9ktN?r0U=od<Vj{I2vH-U2R4)N22eGCRk*z@ zetM<=10+>CW(97?fzvfDJ)cH_VPxR_Tj~#hN>~i}=6OK~@e=}><`zm4w6(CR-u|3E zC9J=bTS7FZ3MJ|~f_YKEsa|br=?y@=mSd7%!RwHokbQ_e5vx(j6~W=oM*SImV-FX9 z??NUBip;UpueCeEIi5R=i*!UexsWe{IMQ`NCGkm@>q}39KD?#Rnvln&FQAQ?szjb~ zTf1BV{1I&|#Wit!H}l{8lnnxO*i<6|x2%@Hla}msbc1LQ5SFSc%VkR4l@q%}YPV&V zILPpAbuj6$(#AJNuZ#2;DuGKrXwnfYP!byHxYddrw+*bE^5FTR+~Miwga=A6BJm)% z5l6D&u6Q>Mkqo^YU-FPi=p<A!kkXW6E(w(utqNOB*=-j1^9r_X!E}^MN2SDAdY3F& z2rQ|~Q5ag1%DmC~mUaH<7}X0%!myN{nU&1~9AyFESb3_Zn~!ygZ7!K^X=xM+fKKIZ z-b!z9)FizDr$qud`j8~hbAZ}$aS32j0`0z?#=d+B8vB9;ix^1l0Wqmt4xFyMarXg> zrgG<dc|;E%)q_C#%J{mZVF;!k(5psYB#a8B=~fNpjVankItp61bfq#1!JRvE=8VYF zsZ(bzTr4Ruy8s@h{kw|uska&AzhLIniAGgy?|?~;Q^J=VIDtYAlPs1q=49aRcBXyj z9xwJR{R+<AkNcK^B?uGeC{bbG`OVPC!z8V4@U?ij^snV#qAMF(&Wl&{d!#cpc1fnx z^XD&KzIsWcT0s*z6%F+kQ6u&t0D?{US|8K_QurvZ)1@0>2~?6*iBP^+OK*g4Hn#0K zdg;lV!7*$gAyy?qWLj#$s>9i*POv0}g(#<`wW+!Fncm*Y_ya}6kgAa+o`T>79TH#C zP5C7ubGW%hqEu^%+9eceqV52hb3!G?(9r*~0OvsJ3oB}%lAeJfoTa;=L7H0Pju;-K zl1n#BlR_%hAVBLLkeTbtupIByFmWpYir|1H!m(y{o|fRSbwQD^1XuzJmk=WfNmPb| z7q)WPlO<=cq-9MoU!g!X&2y<_^3#s2sD;y1lE-%}`S9ltE`6}1qt62-V@o1T9=TTt zr<16_NvI@2oI}<fv_46clc!AyAqq&NuuNkNl?;kJJQ9oYc$9mXwmi=QIfqC(z1w-- zp_1uJ;j0tYretmst^i8;5S<OAsRgg1Z;=FVDt1S%R%;WrG>W0Uq)<sE0KlYdByvL~ za0w$NREYqNWVmcprL;7m(#BlkwjI*AadvOrR#cduld(QoEly$qCE62E37j5rXiK*8 z2Q0Dn=SNdt|G=oEoE<-3xJ>hP<uh_DO7Bx2KbVs4Acx3siFH$$u{vn+ZDTZJ65P5e zgQX9ZgiEDRB^6^*ow(Cy&Xp*pyLjQkxl<=73@2Dhjt*Kj?}u-ZmJAs{2S=1_JBmt1 zk3^dk1~Uwh*nlHC5){4}O|q{R--q*lZ~;2$%jTE*midx(RE#@#^mKa-LnL<#eEOH+ zOOVjVD9ixRD<Z2GV3M>QPWaE;Up(jMMMno#K={#}+jm$ey~9#I(Kf&YIH?3a1r#aj zdi=-%iUoM#8@(VrOxn72`@swM+Itb5N5?0vUD17;C<hXuB65HnrjRFO)WaX1HX#h7 z%FuONK!j(TP)!_3fMizyBKf+dZY#u;%p{>3JzR@$*eVTN*hn1$LcWX<wb2jpn=4-i z2bI}^JdTN*5Dh;85!}e<Pjp%l3wzIt4h;$!W%3-6@%>|;IApU^tT{qKCwTy<ec(nL z>jQuiahrlu{xHE3;<r$$xv3Q+s-0^ap0EZ-bj-nhhg@eWFi^Mqr=s;ibH4o}P~sTU ze-0|U=3Vg}a(3)_d`Wc4mWg%fPIQ1I-9bu|P>G|}y@~ID^`-`(<l&5BwDH5;vIy=k z4wdY;KEh<r(sPY5dBL1QLKneJ_-@96m6TIjmy!W0k<Nxao03ZSmZHN0S1$Eiw8&4M z?nnWV)b7;+CAB(9L?6!tlrVBr5;vDhx?)KLayisAu@yK_DFsx@f-7-e+*+_1XE*0Y z0yqkr(5Z5@;gZ5P8ZnWU5-Iy86?^@_CBG%h`~$)h$Tc}pR(0#{gL+OAt(;S|O8i7e zCJV&o-+&(RJ-dKifjB7TzBq&>P>DJ;$lVCurKQx=JttU#E}c0;@k&u8p%NC^Ba~k% z%1uj(3iO*}3vs6J2ybvHc|jZ^_pinnDtWY1U%F69IfmlE44GqXknIR#5-jmW`(TNO z`o3g6(>s84g_m+ik_lD+61YV22i9W*W&*el#GYr&9!;00tt~Cj+Yx$1o2c{#O_foD zblTf0KBBZ*lKrVia-Br!(u-%P4Z3%aP-#1mw5<@Sv7m@;LD8O*)oq<Bn>{u@BP**v zN-MLrg-RbnCFQ4Tk-Vv;g%GF>C}bs$;w4g)um!0=FAPaZxw-_M_|ZW7BBj;@aD-|R zCRX7fJZRngNU=6zGxp}cjIp+Hcm9HVT=WWo9FvmNZk1&EOuI~O(lic(1TWPqYd5(p zpc0Kz21w~cZhK1g5_r7|yrCB9!#`8S7os=>CNkkLDIw%HHnYkIG{K<=-GC(yXgl|^ zvvFFG8h0N@Do(u0((|W&KA0Ep|AWa&z9Y$pId(wVVdR*%(8&%h-|5pHXpBj+w<%2E zkB&_pp`uDUQ0-V910{}cy%0lGN%KLd;sYl5kQ#jRU&AiEjots(zX_lIqDK?(IkqIi z<Xw}lWT$yPC}sK=u84?Bq#ZyO0uYQRA1frNgc=<}4ChBt?^Qt|$V%7&v<622w;Bi1 znl&_KLseqoPRnk963<qh?_5^o044hBrl+T*)A@u>ZJP_XaR8ERf;R=XQYNk15|FuL zsBRLk<duXtvhAWHRCEp(`BFcC$<Kd9Q1rUo9f!|ds=>_7se`Yvg}TSGb<^&`8es^8 zsOqPMR?%W(_fI&XC`tX6P^s#Y7U3$WO<8ua<lMRQrgy`a&YizNiIbA@3n<_$!~IMm z#7<x-A!5~{nQ~JaPm+Y~i`>{<Zs}5@H_LC1ZhA_%;7fXtzG#mt>2xz0lk9i0?oVZK zg&R~%))@%(&`v(~CF@vW7!27r&THwmZS<Refik+!NgmM|ys5RF%v%E`MbFF=&gKMI zjhxr{y?}#-23nQ@Otn~EZ;~TaTU&jj>Z)q=Rg_}Q_?ZZf*sTaB0D_V#-k=&36c!&W zd+_qZuaQ8CHytiJ+JPl82z3R~N;$5d24rFGeFk^ypun2`gF)R`6KJ9f{7~EoTxhpy zY%J4(N1dJI`FC}x2nm!4WI_T$vnFk~zh6{|0+hdg_wiUXcKs7b$x!$=NGF5A5y?s) zS)3chL)u47h*6<$K-7!`7_tNryHUBYmOcel_~9%HtEU3F9No_;t$=%-o!G)YY(&`R z;02P}T3ZnE+nN=oa(AQRxkvSQB3L(oDzTb*mEBo-_UOJ%Q46P9gI9N;{A%kCE4BhB zcR<-SyWbsjfD8w$+lUQG`UaK^kpxcO2~<)j+}_2B!XyrM3m%vTpbA)H8(|R~N&j`< zUmPUq;xBH9Ksn$Vg(f3QYC`ZgEy)=$F_FHW{QdkDp|MHp>4nQWnx*=0qFqsvl5(+l zFI!6WB{?Wjy9Fe;yJJwOQG-Z?lc_r!TL2fExI|QfHRa^!W~Q=VQ#R1WI~`v@{uU}O ziLPVp#;mkni+N&7XiIT%@$suoRti(Wf<Ps^D1KWW5EhrZW$%fSOVzhoBGq{s#>+|u z0ymIknbl25pHDP9^kqM>Y$2#G(gqHuJ2z@LL8B`%uq>5J?N&0}+4C1JTr44aE2CW8 zg$ocUW$hmNanJUxxhZj>E{0>b>zpFEG5mHYZpfsoI!V};>p~>^(U)zjZ=7Ld+ZPH6 zkETtP`^u0>Mt((cp1Q<2YV;IG;Q%{y?6}hR?j1I|4X66&@+IUAW=%c2oyB<A2}(#4 z))|!7hNe~m5D<gCE==NVKzS>Ay<)g0JBa4f)r8Sk^c`?wV71}Ikpug7;Z!QZ<1dm_ z2#02~b;r@Frmpevn}Fc+Ac<@$L%=j;WnE_;q93AltxTcGw6?TL)<WizdD}|8p>5M1 zm-vbGIM?_He-b*k_!3YACV@y|O03l(CJiVx7s|vU+W#KD=_65Q2^cd}8Xg`RB78$u z`UE_QIw7B{-Vz@gSfnh<$Y-j46VJVFCq8pWsTL>^AZXVDO#<K9l?0-g0W=7Sp+_x} z@!?QF5`vlx-S&rDP$1(L87J4TT%yeCsUy2G!sc6Yu8tBrbjCKL%O*OS7}gBTuDLVb z*dt9#aC}LqBtr`tx6vjozbU%2^%>C1o@DcaiQ#c2L68QJ!|*QtBCf;+OcEj)L>Wp! znCwwJLAsL1l|;F0FtM0W4wY70hi-%)YyY+>8#aTV2rDHSa4VGn#~NG=?xJWCPSmOr zRVg`{!X%rh>SpC7r7p1sXR#YzOeLITq^FvRavi0;1zmah1%-upl{TfXPfl7Bk0+CV zF)@fsLMZ&?p+SK`)@4OK>6R>|fp2Effm3ByYwp~m9St-WA1wW}&^M$qL4i5JAO#X@ z;|72nV*%0Gyt$EORSM<8l_)208M#}<a;Y3}5n@CPckcXIV2O~fRM>R!{CSq)D51N5 z@Al1EYh#Gvrcbuhix6o%C>avr=;qsy;%#W<sFWd?oq=FL`Z~?=A$9~LO`XmUxWv#s zqhXxshraLGIFh{rht1dxjscDXJC*$tVM)_L^WsT^FyLhe$^4l9@ULPa1C>OTu;73e zG`yv887rUI>Q$-@!x$$9o!2YzXK)Ts-G(DS(x`7cLbqw$1)K&8w$OZH@7Y`JW}wv6 z_l+<3sA(bciXaX`p(QFl2n()!l&7e~$l%W@O!<<Px;LsV*`;MLsw#m>c*0);RP-%T z0Ef2iqBls>d%%fRI~5lo*aA(o0EaVR1g<omERDbJ`#fAy;f|-^l|=NWc+00@OyQqC zDU!2gxjrPP!2xrc<D>dG^2=wq61DIQxIu0mt$2~1Jhi$C;4OzVwH1WAjAoAKCdGDu z5?Rh|>{^~^pv2KFJ&FL9l2bJV0hlOH{<JG2e1T9&XSd&?k~@qHhTO(?T-gD}AwCLA zk`fq-;tZ7}jE<s`iQ$eb@fe3nyq=pG7Qy{Z2BqJkl0|S1l^iqyMSzosTK0H0hDts_ z8iz_>O`1N}KSa&|<4RgXLs+8xP$H{s;UQMnBq$`5>Ln4>#nnYrOq}dWYpL0tos+Xs z^(w6goN&jobF<-1+@G1Ay1_ZSaW>(%q~eM6r;XGRfGQ;zSz;MZ?f}q9HB^Fvg2O^X zf>kz!V&VZ&YjbuUK3jRcmISDJD7%cX&#XKa$EFrwIK_Bp64RBSxh%KBdR4ssHpy|- z*Q!7zaEXDvTU-fpMAUZSqF@PO31q?@aOTvpBR`RQvMnz&F=ExiSz3p)AWlR`Y{>B? zM~_BHlHI9ai77d1Bc<B|CGjMKqiNHpPn+g8229|R1?_eg(phTs;21qjMz1(P((y9k zn|~fGVV%KmgaM<mjrBM6oTR|WV-`JGlSAO)G=L7y`hOjY64i^VscBnHAuPQ0d;!&0 zuUtmkD`yE5UV4@jz(GpM6mKgAlsHMTxI()?8VCMV@$l8JRV6{e7t-|mRJ2Low23SL z;6r4^dVJB$Tvo9#Cr~K-O{cYf>tzuPWWwP|-`rQ7l<j_t#3UA_BoIskl!TPpq$(uD zU>aZy_yXlo7M$MG2}-|0D7)KjzKqD=jWrV>8Xo!dd1M4s`Y5hMPA=9=XqQk)$VWUk zL`6Jc^+g-&$H>>xu(2(%kZ3u%?LsAr1~71jO6gYiU}LimbkGVpTw1rNk}zKq#X~J; z(&K~*xn)A7-5aAQ8Q@T9^f+?JVP{qklZ^L+B)aLHaottlbL=4WArsJ~Wj8kzx|!Ob zIL|%YUerS+V1=QG%}0`qA&Cxo6bUHOH6fC1>~X%3Pfr$QvIx#cmS9U?QS5O^VAPs* zsTtTIg)Az6lu5@~LOAk3=pqmp6dV#3251BahlB)&s2W@nRB3IBPzhF)m6<^|0b@f{ z#3c`IBg~05Oc^O;o3L)D!4uYRNF~oMGkrbnP1eLG5VWm^ArTVB#KfquQwVQERf4dP z07Y<q{=u=SoA(_(fB8o3Jq~{)4D{5Fc0^YNY2-Ds2xMuD@Fsd^@x9@qB+NrAY(x^I zbOsFvu7XM`3&+VCsTFPeA~cCBTm_K8CKy!7g)=9Qld^kY&yKCR8)7Yn`<guu*l74r zN%Y8ze2po2Wa)QMNuGVm`6+apI(_<d%KuIWl?<GOOFp(_&NLUQd*3z}21w&ji6h01 z3yze38Z6b3Sjb8mrTpPa9kifqC72?5dt_a<nKU4j`6j98AevN7WvlDLCam?^^^jG< zw~7nr&ttBKEbZURitIKmz7-SzOIyLEqFpC%G<OY;oBiHZv|<upJ71HOp^CAth$9Og zXf!PQ5$1qR&pKYKYdGa8yQxyE1UKqtzf?Q#PVQGT6IxZGCb1!a<1X5f03aU*P<{x! z6mt!+ygyd1Tj2C-;xz7qeHmfl4X+av3oIKR!4&XuctlprUb>#p_Kl#hhifXg#B$xp zm*MwsIDa;&766)&SsW-s$?_o%(T*3-nuSSL=DZE%tO0)#r(e4RMZZm%C{L}XCk0UC zfI+yUJ)9!AQqtgd=f?U?C&n6ga&rfdz{iRSiXeeT9xnar3cvCZCX`gsE&07U(&Q1~ zq-nlyK@v=9jEV`96hxTVEm=vx1k^~yW&`&89}r5Hf}#K8@W`$SssvtoxQ1<gMsW1+ zQO@+=|4jqPS$+ZZf5Ur3`Py9CEt%YnAdRpssfVa42pXeeaH~l155~I`4<@Z6GDGTC z%MwbL2$b?w9hdS-<m%=CRVuCoD6LtONVJ9rAU-}p{o@GVbT1+mO1CO6MS)2%!oQGE z@^rbB#!lOnh{Wt|2Tzw?xpC_rb|qSYJ-5>%-zz*A?9rkRXHeKY%ov{ZgeZfa&t~wb zr<Q=G#}%q~U%he_$(tPOl9G!Tj3JdsQgWjdv4arq)bXDwB(Sr1b7pdM0PAp*_{OLi z;C8=|$-^Kalj3Qxh>f&x11>fk2F7WK$+h?f{4l0Z`~C<1egFM*{Ro%16S+xjNsd_= z1RPoNjwQR`Yqx_y>Y_A82TK$GS*TQ_q{8ajJ9YI<&nU``B|veM%#!BUU@4T<1&zD6 zMUd2myNXl6)vMK%lHtU_1mcunG!<Andy0CLVoSw^TK>Qww<W)zXvd+_x;MWAN?^mt zFx_e2z3phT<tV}!5RpP!_07#NH!2ih4S3n{>eb8Fa3l2?pm;w;*f2U_pz6e8`Btqe zr9Jnk!vKs4szkK+{sZN{d;1_cxE`edeW5j_7q#)OjB!Xb?kfJH5t)-fB~_RD2-*5L zB2=<9xIT;n9{??cr7rU>eHbQ!d&y^qQzAYzH9utq8Ha@haI71U1*Zjs=LE$FcjyvN zr81#{OKxJ<!kk!2U}ppSgvbbYq&D1<_v=c<xf4I{p=7{x8e$la8KvDifH;KMa0HtS z;eg4|Ne8UXxb7~U58biH6>!NNa2#<uG%aqk4TqxMLu859<f(cU%>?lrfsmn$VGg$p zi~eTpNZ@4fWQa7n;W-9ff+kQ6XcD$*{FkXC|L^N5GZqCzB6p{6WHC)%Bfy1nXzR#S zBRefL1O=K#aaLl9N=TTO!lDu=or{%#)wNCVstml8glrfKa<g;PtCGYx3YuiVw-Oi% z)p#K_YogYGF(=&Ikfm7G-Q*OH7F7cO!os;h!@0m!{>xSbMkQvbE^g&DP>Bexz7=It zrxf#=As_L*LYG8}0VTQlIb(AQlGs2WWKgO0dR5i6YgE;}c7<xWm6b$nWq1TolgjvC zPNVkHGF(hhCkiheJNEOT1ABKA<)^QSSh;xi)QOxuzOpaWVl;<B22E}a&IeQac1%Xp zm&#X)*Mr`q21(PVPn!W40ZTLZN6PUJL~^EkD~QAL4K7U>>l-n4aPU%kHI6l2Q3nMN zBQX4Dp%U$DuU)TU#i5~v`9sK|IvdiqajtTH;2WT88L6{(sr)Y;sS1L`KgwIdnXXk4 zL|0Z|L{{v4;UeAEk5kQLH^P$W61fEMrL8*;U94^E{k@ER&_UgC$#5ZMLl$q|k#~Rm z=y5$Y13)DWQ0evSR~>YU#7Ze2;|B_eWA%Lfj<D`6*Kh^ET;NA?b=#^vpg}7V$P#fJ z@G?9az6qL8nD{>qipF343_ntWE~tc8X-L5v*}0f25vpi<GQfZ&QBMI)9WFL90xGdM z04Nddvb0aA%d!D+CyoX=L<!f}siY6G04KFu8M++XL~uZvg>SGWmKN$jGZGm<e@a8w z(kQR8^vsd{dGX7>H&ilAaYqhY0gb~YhdvHQ>=bH8tX&hjXpF-pj$s|eI^=BYUF!7c z1#lkJxihur3lJ(PFtg<~;SD$hI~qkKMQ*xj!(AFtGBoob%~2<nK#_9$Ki^FLVd2V% zxFqGPInxp954CN9CDQsMNlt?y36rSI#-QR7ZJFW|X>TGSDi^yX6;RN+;YlpMp>k(u z6T(qkDHXbfuL)d2HHr!g4W;Hct|yraK(#dq@%Sjw&lSI6pbQNTrW`n>bR$6}syam{ zWo+4f_)OX5YSrT=f)lZI;kN02n9y{Bk%P&cAS@W;0`b(Qh9?NGcx0|!p}^8ru!-t# zm1X7S<??xhOpG!z<M=5@@F<}Pikg4Z%(A#(<NEl}<qNTR14}N5lcFtXGL~fP4n~-a zCy{2tgS;<R7y?zoqy#ESN}B$I;OK`Lpb|r!T%b!rEXb0hOGcJPk0svGyUtn3<48I{ zi11mXo%~ONr7M@NT&=FX_mH5uoz5j>-vSFna7vzlpEgRxQ)^qQ%%}r5R7t3GiN1aK z0YD|IyhrhLTl<8Xo;`Ks0D`wnA~*wJOvSs8T&!vC8f~LJ9s{`kX?UoQiU0~6VH;9r zbRK&A=&52Ltz!{X!ixYXV981usHBLz000xwnkh~gtpPVRuB7`&C#l6MluJPYVNyTv zGTH(T82qg9N1#MG16cv!NU)=!j~_=qlWanEua@T2AI{`+b!qBVA<6;bLQn~J7t8u4 zj4A7%lPB#KUUVp%MhFBbk^RP@EZowf4u6%NqQ6uT9Jr5nlHCnkLRY$HOF7pnOV9qi zFFygUBn0_2D(Nt?W65C0M{a~r21>T!R|Z)Qm_`pgA1ra)>1=4|L_&)KJPmt6Jzw)d ziiXE=KotSg*l?&MbP^~TQ1MGW%m7Th$f43GEa@&0C!x~UlcvvK5gwbAlAe)i&Lc;b zs2o798okp%C5pZ+_op_c-(vGrhR~rBu9OB<VgO*I-{z7FCsYEGXb=Z1NmYVv#S4|< zh}0q|qC`jV*m$IJ*)f47+)r`DadFrKK&6n7$S8#GX#5C)LE*9MvJ3YfIaQ+OlNQ0D z6$+N9N25Xy5L?vlcANs5B&xj5KoJ*%qU0z==xK{6QII(TCQ0?iE<+fnQGu<pq70DY z3h-1`b^)?v?f_a@=4Y;r4)LEq^Se>klD+{$B?Bgl-h@&1%@X9<2}j?T10_&Npk#uQ z0Esbkru_$(#Fz}1h~nfBm}Jf+L6BZR!-FL|G(@3=NCru`pZ+<h1gosLe7*L5y-ou! zl>GrFAmKqxsiF-$(YNFNZB>{d_YhPfU?yn8C02Pw@w22o3hzNw@rc2dF4AUQWJ%S! zk(P+!w(UMzcB}E-@5FBop5%_EwGnkqcyD=U<>3LAtR5w?52<)>-V(ntyE~*AL6Jx& zfvvnFVUK`KlJ{Gy4IssbJ3%F?!oi;4N*`2$1T67dn?RC2fBE#w=RXYK_(;GOAsZ+J z0HG)emE^)ipMpP0LC3VDPAKFn_YQm#D$%V)#D@b_21-nzEeNE*DL^U(NdX+ES8OgE z<OmbOBm#kEPzqFnKp7}eDVK3ysKg1N_GVS(#WP3t=Eg0tgcD_N`i6Is<j_Q0G88c^ zvNPy7RI&qDzc=~8_hemK7^j1eQ=;cm;(&CI&?_1yNyBielAuNyGYUNxvw3jjlqDlb z+VHTy7^e~h86Mevx@EV)IH8i{?z#S<t5xvU$dB2MM1k-uCBzApR{AelO0`^2Y0-iO z)PYl}r3B@hNKC>SzzSTB%$K^J!N|<a%p!hM9|5UJ61EA|B8lM?#0ixQmgrk)j7b4r z1Z!_$QFJt*LT@Cs!V@;+6wxWSwDM{-1-b80Ith6bwj@;2q1o7sr-QmQOcI@9_yToS zdD`-f#0SnhO>m{#HMKVgBCcP<v;;V5b(*C()4hSD3SksK21^RzP9FRD$WQzC?%bN2 zmKYPfZ2pYzScr39obO8zDmnM0LOBcXtXw5ul>06x&@vfS$*2-4w-1wM&7!%Kph<Du z_f*@|_|9WXeDf+Q;l6Tjs|cRsL1!uu$wQ?n|0GnBx2y8ntw)W>cp|3;N=z-z`PAj$ zWbl}Ya`(>NJGWFsodAx#eOV`f3av9-lCH-RT**ZmU|qO)QBBs*QoVc6_HB@*!fi#{ zw(t45{7&opzh8gzQKru<#gh@&`34n+w<q!Fxe5~~czo8OR2L|dmf+}(NixivHytlJ zQIRBXtDFG~aBMo?lN|yAQSZdWZ!0Fys|7o$-Gp5qKYcQGM23hg0)H%a3zfcnQt1*X z78!AnB)|^g+t?G57B6Vc#Jl7+7grj5|CYm+b14Fxga-M#DOd;X1e!pl4vY^nCkcS0 zZzGohV}y3v*931^D5;786tSO);sB<5?Cly-olhUyw<*SN8hnNW#&-mH=QS=Y*s`;x zHODYwq@z~c-*=j|BV5QO7WCEse645e@Z$jFxRi!q*Sr^Z5XbSZr!yBA9-RF3um1(+ zxFJOe$=gSg>=qjjeslpI*-dv%FJYmZiA#WzV3IPl%R*w3Hqe}#5H821kK|;frMh;G zAwi_W;qYEc?{E5%ETH#5D8(of*KN>Re=eaKhDkJX^)t$%iZ|evK@MEHKnX}vqMJxj ztY9frY$*Y^lMSuUNngT(fY==x8I2DrSsW^HeP&+qfn#UY{*B%x#0U75EIfk=fk)s_ zs}4?ar54Ve3<Yw{#->=f29>ayk$FY@P)%nz0y%;T#^p;_K_*-RrPR!2-c(j<)w<L| zxZ}ruK8QPj7%rU}a7*WXPYF2feTP26A)Oqct$d?)%YLD6)xJ}{OhCkmO4yVDB?WFX zXV0EBd-j~!GiQQKv*1cUsPUbl(*H-?dv-^8CEwfM=UM;X1bghUjZHLpk#jV`#x^<H zL=z>EC6JKB0wjURB1aJfEHWY^ax|F*{t(Y~)#(=4<MGVA80H|gTHURd==<({cJ10# zrL@FyM|wLw!K42ng?Q>oYDt0;NT*nZ2kL)9mPlJ}tlCw5?7X3ceIY42Jbfl=aE~3a zbt~_f1N&<Z9zKj`a_0^#lL14Ukhr%vR8+FW9)PWzw5P2b(7Tr`UJ&iJFbL!=D&1Uj z_0ezrlUYdeD~-XUp_~Da2`iEw(ZorzL<;26_3IcZZ{Mh6UA;wzCsb~mvQaH7_=LI* zHqr3y+4H9~WV0v*d-t8&Ar6HW1nGJG%PTyO)~%s?d+nbt980X1Se?+wUt=mDf-?sf zHzR@pbdNCx@LTRZ!f){W@qL<3U5LiPk-MZt=cTJREZYg4^a8}_>V-?@-e?yf+lNE( z-#T~hqS#A~?kPMNloP^~jzx**A-b>b+qZLbWqIlRiK#d@Nzrcs$@3@!HE*|8p(F!G zDN_?6Ko*zWTGNks4h9wpNv2#_KB0?8_@0P!Kf<jn;ei4LAu?o(YkU{D<OL7}LjsB7 zGvU*_94U}0!Z&4aaEY3e28>)A#0U~mW^x2^u$~EyCozJv<$nhz>|$(e+qzZDHXXVu zOEX7lG;%k!xjF+>x-n2r96x3Z^O(j`i1LGjAis^K0OZ<;*MOyd{csq3#q>+3%+dFI z#E9X;hYL(}k|VquG-T+A(PPGq9cz!cg~jFTs<tuYZQuR_RCprvQDcG($VquwM-oMG zah+0#^A|3hXY;H*kMwj|?#sDLcjE&lsWJ3{N<?tvs<&<<meVB=q1y(0eVeK_x~Y>N zTFsz=<tj_WaI>b49~y}`8s@SsWKbv_PT(kP0b&$)xHwF4yi^1sOXS}KB~<PvO`u54 zKqUv>H3y#jzDX0D0$((&$0bv+Y)S8sCC-4*x1~wpuoaT1sKXcjzd$9bbSf)1?bv_p zG~2i(54LTfA!0P+rX{G=xCbeBqav4?Zw$c#`m4fBzX{~uB1Uc9f_kTop0ww>bxeE> zU5UPLuK9)Q4`06j&orfg24f^Tf@7wH2gBIxl2)t6L>N!^ZrBpa68aH+4CttG<2pSJ zKq1=GKEh9FT`qT-grmlvaP3}{$^l9=TO!n=mX=$^mynj;1XUt}`=_Av3wCY7HWpPT zP%OON&(XS{!J7Es$x;eVv-y3xoV*5=>MrYIVeiBqk6cgM@EV{5Q_4!+m!qPF{}Wqn z++l-Cf&ftIxc*eTB_MUv9oJMRb59QM-_6j^vSR#7Z9e}b&LB_1EO<zL0zm)~PGQLn zE1^l8y4ef!Xqgk)$HA8TL7zt`;>1)=5|iSYGZA4H*<?zID+SvDY|^SnC*Y|blM+Kp zEXm76kb*MRKZndKlY{$!B%IcOuwYLL0Xs}c<C()v&m$7`-8xaDD=f8X)v{&l_T3m& zNj41#87=;xBiYVmDpn;F@{uD)Gh|@gxY5IhBPR_WI2hf?@|2h=hxZ9z0nOuvgGfA7 zT*4+m#T`)_t;0u6AQYTBZAR{bCCgVcl#+2uEK+baSOah@oyS<F+-lUO$aIx<qEw-r zxB8kRdLC4YD4hxSwxAJ|cJA4^b2s}nJN6bY7y^#U0T>azZQ;!WVTvx5<z<9$pb}mh zYGTF>9nhmai8zjII-IdPgxsA-Q`#-O&qE%^l4BS^qO1f}f+sa?DkLRP5|^5O2`Dvf z1YJs+H%Jo|ke*a=)Z@alfYCTmB}=xUNv7+>y8jU>nK|3IZ7=oFwf5r%l}J((OYqhp zpx`RnD@G-P3M$$40l-Chb&-;wOT5NVC96#c;no34;QxwcOQOS)eFO65=9lle_~4&v zN`Vb;@GTm8UB|$Q!{_QX+6Y|WT^^H*L@A0+KqV6XSOIR{x>;9uooU*12B2RpQJQ24 zC%^;5XPb*NnGG7_O?Lmc)C67V`OBBo!9kT`{Q)9*7jpQUR|rNgfuom1e#r55LV4j0 zgmccql%?Ia`z}n12INQ$moEh>VPmOf->if8p*7gIJGN0Xa8P}i5~zgL${WcqpFuAL zl<;6+g}@zi3~>p)8zaU6<_WATD_#g!q9vH}52sK%ivm~TLQKk{5+`!nMgx#Cz>)zc z&*NA;I{VWpjPqFok}{{JT#0AoseTo~B~$`zVr5Z@Z{$sU8z_`8Cm~Wor3^B8N33^I z>4U$Mgd3oZGGo!Ul5G+e>=D3429;885&E&UY}>I1E#Op#aCeWQnB+&C0W=1fM48IC zQNu@!#K`Rkr=dd;vB|J~?T{v7xbMCh)E}cb(Vr7}u`P`nHFET*QP3q&3DpUvH2TMB zj6s>VFu!nl+1kwzrTx|Hzz6NujIMMNizE$2*>>2oIfB^dXz{~JU4F!>gi7GnS!Wwk zoGU7EvCFVx2eS9}?G(mUZ3$FL(Hm50<K`GNuxdHga7zpF7tN<2ZrpeMyS8canPe$e z7L|eoXLgr#mq*D1CsUH$NR>W^DhWykZ?Rgm@XMD3a^O-E`~nfig>Q)vjTp{T$|v!8 z;+fRA4e-Dt5Gj}v{OW%|mLxbE2;mOfZ;dwz?Lakp>jR)+Ej^DMVZ3+WUf9w;i$)QV zge99aNJgvByg{YS^e2WVY3^RWY{}yJb8Q+RDlI6jI&tR@nG!JY`q^Xs+P7}q1a45P z5xxoB&MSOtS_^9@)Wlxd+9~Vowqntnqu-drYyAiIZW~WhifdeFXWu(F8Pft=di)G1 zK_Ggr#4SZimt6U$%LkH(ON{9iYJ5x-fET@#ctO1qDq-nF1%LK4b6@0l>Y=Cf`Ldm2 zu@aT^v0O9}$CP0lc+h?_3jFmNFxY4zro_si5=MxVuqKk7&{XPeFbC}0iLO+#;D@hT z>+MdbP!>_rS2oL78NkVcQidG`AibNqNtngCoKEOpKUe*C!MvhNE2@&wR(%9#6qZFL zfC!TG4k`&cL9GCwU`;+a^WpdPi^i3t^$g)Y`n+YAe%}rsi%4xX8+2tVh5tW{9nK^- zQOR!Ft>H>cY-`>ERO$~Xp$#Dm(fExnN@GW1^Nz1XWRRdykf4B?fmF^7X8Nuw(s$nu z{)+jRy+9?@BLN9i0-SJvhi&Pbp<{lWo;xqUpr~|Z`MQl;uqholz=`jiTsz|8^FZ;& z;(Gygqqg?EsARGNS3at@;he>c9#c?>Wc49bj?CJvxDintk(`^kIk?U4>8eUq%w(!u zO+OQ+3=}V0THtWq*;7V--MeG+FNon1D0vK(liVWWI>$H#*!4`w_|39hweAcmWuv#| zEfOp>Bc3x8r=>FaDe(uqgGwNi5@TpeL6Z_FrSQ$?{U4wb1~1wzY}&g2@JWdhJt5hy zIV9Cg!a9uH5un8Q(EVT&4$7?taNyD=Qkyi|)7Q=Gya^ZOI!aE+DwGyFr!sgF;{@gv ztloF!=RXRUKnb}BNiA?CGbbBTBre(M191^l3K#;dZqP6L_H9wA4nh>YCmC`ObD4ml z`;Q({KC6>RP`Z7K#@gDLfDsD)UxbvDK_yw!KgA?*i}E%ErRPtcae;J%_6@LsO3!gJ zk(#5V82{!yy63)n{X$d%fNZ*O<|J9ROV|P~UxxSTQbI*CtqCpSe`8G?{z<ZM*Ds<_ z@B>7A$m33s1C$h&Xfk!|#0mN7Zu)i?FBspqWdqJ2MSyqLU(>e<me@Z3BsubgO;VC* zq(qv&^^5mMoR`6*dd`%dH6dKUoPnNig+E2~riU`5>$jHyN66io;7zm=fdHFW37!%* zc}D`LfF+-b6-l_i{_V5oo#>G}TCRjadn!gsu!$x}!w9XSYi-+>qEh>|Et@xQ)uBf} z=#C4=5t=vX0_Y4Uo&#YhEEzE(v?36V0VZ%I)o#S2@6ojT_3qVYfQ@#C^Waf3C4h-e za#o!%Fz%<^#fA3xU%PQDet-itU=q#4ph_4uAhFD#f&SvgH*SL~ar^`(Fo_HH7>BlA zx{5XJGG5rD8C2T0i;ApW)IVUP+_7^PLr=DES4*ne3M3I-cr~a}85LT^)SVO-<}U`8 zXaU!wZBz4bQliXJ<M0J0#i5P8#bam)2giXb>FbVyTrAy0aDWgD2|#MmvSlJm&6_v- z60X#^QIl*YF2NE=^p+|mP@>&8p_?q}Gse9Wz5z=A15`2!Lx>}q#x!=!q=Q|Kz@kHR znk2NQ=V!JUci%pn1NefXbK_AZUc<J!3C%k)ottn4&@`Pfl?&CAaxpB;o42U6>iF$H zj^99s7tF?e5LiNUa0n13|J0V*cZoM|oB_O#!<%HYHzGJHh_7m?lq@+cmoP4t-MS6x z?%gMd!{8llOn?y?&huwPWr0P11V~w|B8J1Wq_-P<0-!)8zOtUczlh)f(7QC@WtzaV zpD}>4Tc%bpluAj4uCRaB0j(@9F5#affb;*tVq3j}CV?bD1b0f;sA?YQ1SHj<F9Ax& zjvQe2(uVTFxubhF|4gzSAzX0nER3Y{5-YGU;{0tFXK<`c!sbt@*qobU!xf}>kg#I_ z@GE5UOi#CX_XmIFCldP!%n@2*0ZHWkgD9m7SW_TU0HI!j(2fF&GKlmJECn`!U9hFU zeE3<D_PquTB^t93Zt8UUj?j5~>ZEbQ8FfM@wyqtRx8063Tx;HB%>VACFijcBVAUlU z6A3oB)3DHpz@=fskhTY7oTQk<%3IQGqLQwpDD9Og!IBa%5y3@!%ON8sOv_zVSX!}q z-R3PjcC+<{UHAx?6m7cMEIdAVW;k91a+gfOIn&;p3_-g_nhP9oZn$#!+{u%PE5$&8 z2;_F*Iwq3avpqI%wr@ZwFbUqY!AWte@KKgBE3R-!AyM4inLiBe-?@21^Kc25Jgk1C z!|S2t$i)Fq2QSG=pi+a+q)LDi`nFiqqIs*9Tm)M(q9cfVhb`gqMm++RB8W@ToA74e zEqIqjb08A^EcIo6{>6JIOG-qrNe{^(;x+;Zm=d5wOE)(S6mDN$2C5Up0r?<(z!GZR zx^=qfH*PkHgF1;(YiY1o1QmrO1uo5<pTBzl<$vfDkbUQ8zrH4U50cO}34Ebh8<lZ@ z4Zcbvcmg4Jr^{CmxiLtBHg_T$2TI+dJwSq`3@G6sdhjSFMG?i_#Bz!G8g~({Yz>k0 z;|}j6Oz2-Oq$SkxS4!TL=t7o&HLwlp#1&9UF2>YK2o&Gl7Jb+&%@vcT5qQkI5vFOt zL-Mv&x3(9uZ@3${|MGd8iK&ir(x1Z-jzjEZbU+VOI(n3R=dP{mS1z4Bv}?0Zt@EZv zKnW-=vZN_aOitg7)R0bI&)irb1aE#xQ<~QE7O}u3p(zVX>HN+<X?*oLeUd*BZ;2!c zlnmLjE3SLt-4>DfnHH$SPi5}PK#~uOho(#ZtiOEl_eO1c3>-F=ej}FHPPd&2WNFHe zHl+NDBwXiqZRlCsu3f7ZywTcr?$PTj;xfxf5VI+=#bIPp&Nz*tT@WY=ZwEnu(7LrN zee?C#Lnwv&`fJ0vP?d=C;8<J|z-jURX6U%7Ir9rj%PKclZQZeJPc^5!O&ekzp&u?( z)*#!!8{jcu^T>iimpHU>75WrmIXc5dT$FD&ao#r8o`_02oy4>S=>wktrsHi}coS`+ z7$S0TE0-@Ph$|{8T8ha#Z_22zd(r{!qpY%&J*IIqV&6%S<WUbrD7X?p61Hx2rKBpg zfG8oyc@e@lSS2iF90E~$5|t;)l|WMvrI3_DPKu&A8lnVK0+-%5Dq+zk(nYe~i9-Ww zMB{90b+K_1ULQP!&b>G4acQW8s-)7*>l?s?LunIKX@j7~JU(GbRAMZsrT|eXCwK1r z;;NH({>T&{JkZXB0FDR_xf&vpS<olsZDO};TBLb%<NI;Ufp~Bo#rQhqZ+Ac?Y}Qnv zWJaFcy%&Qc(auq+Op-l{Dc?NhGvMXvi+=-;5@2a)di{zTy_c`4pu<&Z-3b^(4i0c4 zVQ2u!yaK!k&KDPm*f!xqx&q>lj_EB@d{k|{q3p8!%{NFRDk_<3#&(B}ch=#Q^g1MT zi;e-rZ=^kG8?du#?TUh_gPA2DDy4lbL6Z_?{W2AkcF*8SoW5};XOJnNCHQ|_#J($A z%Ais`GSxpF&n^0~B8HIrB&{0!$s*FbU&SONG62b_FRlb(N*I)ZA|CbbiV!Y@rLWL+ z9P9=t(OklL0FWhol=gn>*0CJ{Tw7$NW=+3r$#{XD_FEc=DUxPOg9bX8yH~%+_#-S0 zgBJxXIVvD5ltU1+Ax;EyIw(hs7y%fCuEbZgZXW#2ccUiFoWG>BymF%jRD0;C#I_7s zJwo-*F+(>(a#$=`IJ0i<CIsXGMka=Xu}hOk(UHHne6cozN_+QVEpRsvP};qFC*``l z(TLvAnQ&L~9X&Rv&t1c;Z`KN?=@zRlEt)^$hoSvCwP^TB6rRLx!x2nq#IcM0M?eyi zSm22k%D+doNf;;rCG>5Aw-&7elR%}2;<zyk0`)HMh~d&{#i^BSO85&9lMLH{ql8GQ zhUI;u(hdkE{%j&(`nVl9c=!<Yp_l*;R3G45492{;RN&It4YIUbqbl4gE+I?nH>{(e z2dV@cwXz3uz?w1|2GEHzHz#LK?ws6ti%7sd`d3h(ixR6eQ5%sPk(M?7tjA6$Vblsf z0Bzll|E>#Ex)p6q047wX2;q$W6uiMJV>ZbVCd*_3$Mek!mh=31q~XND1U>)a5<GfI zD-+^A$<p&@FKoEvlL<u35WjmrnJf8*zfS@59CdD%$(TpH0RW+jib|&10Hv!pZh@;B z161%)moSGZED^?$V>pVqO71PHPL8tW?%uw6P3fW^`nCSTAtWE!S)#sxHcrWO!THI* zM3*>=6Bq>+WiI3|Tuqk&SqZ(wB|kmE(`7tiO31|3fF<aXs00v2y8u#dT+3c?GxsG_ z5|QFp`U~rkEO9BYDFadoo8l)3;hMGY^Ua9y6Qe#Co3?a`&H*IVEYa=jJS3`3Vy<nI zX3g8s$-8&oewL6h`Sz>6y}ESh(5ZW$0pCy@mmEmACchryoHvVezp<R8HwMatTcbwn z2?(M@22NtdBZrNfmb<v5ymG^4wq@P{pb{pH<0nBR)IRh+4-HL~uyR{z;z16&D?D+O z*(N#CkR+nItc%hd9H_)5&K2G_a3#pnmTgEM+i@Mko79@NB7hjc5y7okv2um;zGKe! zg50U226b=Kv;kIrk7oA6Ypj1nCGdnyeioI;z}2IYObNN01zlpnmYN|gWfgDTl!+|` zRWg$o1Dmp-q@Kiz7EO&By=Pd$;034LW$_MM1)-aEnQFS;9`JSL)#a7tA$C*RvkQb5 zk}{umAYQjVoJ+I}u$2{FrBx*bOgORDgzDVfg~c0d>i$&#hl5CC0FVUp0Z~kIX?@fh zgds_+xyjMLe!Z@a_HU%%t~0*-HV{Q8lbiP+GIIQWNK*9j<{!L?j*&DmVJZ`4DmU&s z>K0_8<b-_L^H(C$n|}k9!bb2Kn#2#W2<0GK`~#Mry?8=_jNu`FBn@&O+`J>3v#wmW zpA1Pi$R*Zc1Hjx;8;LoLm82MN0I(1!<k5?@=k1h!oG1Y^M$)+n9&jxIP|^2o)9RAE zQ9YYCi1`!-ahyNW?RPPW>r$n3!hVp&g+PeFA?QnX1!QDkE6(w_AW{>Q5+X%R@Rlrb z2ah*66I4W_%*wV4;8v(qgo*L&Nso<R>Fo)MvLRpqQbMta`TqRDCyiR;Sh5KKIk;(4 zrcDQwkh~|3$4MzHb??+3SZdv(8CILd&6-1(x-q)47tqviK>uD{JG5@qrhV7G0~wTp zHxjaBFWqm^xsB=w0%<$Yy$8d0QKNJYj2a<Z!mu<7Vg+ms`R4o4lV&emT8jI3^VXfa z_n2os?2L6Ly`4CIf~L4c*Wp*fZf3&mJPMMwjyhbh2I5z5aut<{`>xcn1D!i%8&TdV zs2%&M&cYnPb}lMGleSe6&+)ycZ@$^Ef&Loh6~K~Y$+5aCON*8+o;P#C_kBsjrJg3i zX%qML5T~QYLCNkSQ0FihB~%KnyJ?cTVMr|*yxFp4t5z*r1uTI|NZxRzOd<|x$zr!4 z;hbDb<_O)1Dv3q`Nz~N=V~rcWXH-gg%)R@n_kl{)2M_9)tftLp^+8Pc!aZo^E4!1n zpUhR-L}8(*gxZZ>7w&-d>!C_<Rj*Q6DG9g`m2&3f<Stsdr}o~zum!wE?*V>rYCpJx zFOq^<E?_*65_M%b)O~3WI}=@&^itlw4N~30AC0$?q7QhI&AfGaGo$U!UGi|ytRPy~ z$=>0mv_u4hfc^mbY_t9iPzoA_?eb0F(Tf)pp}YW~q9Trq)b-7J6Kn@WaL7f-p9n>C z8b_rM2u165G|VNUw9^#EQCfWSCX*U4;jylgxQQB+Q)f>ecc@s{!ww&2@Fy5W2)%#T zwha}_<{&HKdGqXv)2CjZOvoh70Xif*p0(-x&0IPr14toQlDmYyWRR6&EI3o5O*}+I zOQ=M}0kG#UGEtlf<is)LB^Q`v``e&OS$xu~9b}A$`A9EF3I5-o(~rc@NU1VhDf1<M z=C6PIym^Pd-;A6<9};j0vSjNwS_e@051sjTU@wf6SSXt};f>U|F;Se8zPokr*}E@2 z1$uR9i<sL6#{k82MsO-i-wYc3?YA*O?%Tordv@(i^Y8wHabAuX4xJ*1i%$e{Ko3XL zunALh^Ovn!y|HTZR`PE&qetb&I7W{{+XYZKbb({U*Rxvk@$(X`IdSKf+7jIe*%yO9 zMHw7QI6VUxnZ<jCz+(UYz58}2*_-N<t+1miY)eun?%qLsvDUW>g>WlZtXx^Tf)A#B z7ZuE(J!$yBZmk=C#@>@bp)doa>l`Q!mUm>f5rZ$?N`_ljz=c^!TteoCDFs_X^p-4r znMzQihX4Y$f_7@Q#Hq#k6`%xxk|41XD&f1dh~<5ACAbi;l3v!mfDrRaSO@s78l<NM zuCXx>(Ga$qUNM`r17rd?I8*8r6BYsR2~}xrwrjT`9BgTB!P=Uu*;%>qKL5uHQ(d4E zbsV4)q7W_JSP#ghq2Qz**$<;5?k!E-x9e;Y05sh&61sYY8162!Dwz!D@No>^e1}y4 zhquj6ZqQ)&W(wiZx=HiXqU|65f`5L?8xnDpo**f`Kw*0Rn(p1E^7ykLVt4M|M^=L8 zJ$?vg%9X4wrf(j5s6)}~7@{XJ!Y+?L_3}05wAc~~YZK*uW|T2L5b-evoE6?l+A<uY zui+U63eY@k$CeG{1ycvLZ_*%&k_`Pn0x8nUf>H*SV)u-lG?P6JWJ&-OkQC4aW+dt) zP6-}hNTlZKVaey`ME6{;|3v~Gu%vt)Tq#SKA_Ir2Z8R3omoBoH$gkzT05jk$14;># zcq;DVPx#=I#;v>4`AsvVY-u{ZxX_lSQP?)xh9+MrEwyghoGIJ9H3;J1MjbnM>yDh% zw^#R$t$DMxY}2*(z;B1yksE6g?Y&Wwv^9NCfp5=lojP>30m^s703_0GU>6^OUncN| zj-E7Q-cqcSh!ERAi-Y?K7O?1@Jayc$B?^8TV<Akn=jpOUI#@S=hu6^jEh<F<mQ*Wh z_fg!hzGZkv(MsBPl~Ks99b2~|bniqciF<eMpeZ|sV|pYqBCdP|d}+lBj7yY{F3S69 z?6<w!(=E5YrAa1wGnf;O(k2vNI95TGJ{6THH%X`zkOWQ2fD({I6emy_!>M_vATA9) zal7+5!p;3zB;7Kg1TKL{7O}v=8oyVv1oHSg;Y8ws48#GvlQ1Q%Nxq)3AfT)rkvC93 zikzFOw~i$Y-T;!BIAMw2N=(ir1(%ZpFy$^R-FEh0Xx+T+k!f6yA3=&hCFv5GeHadj zGjC@-1Z~73Y?k4V1c20==(q$diA$k&GX({Ko4_h8O3<uZ4B)-S)V8NU60#6^I7Y(# za}fH+dl0-|QV;hGK}usc7IdB?{wRj5P@4P9GPoxUkBZIH21``#UAc1IvONIEtyHZE zyUP`uW@<~ndX1e`)1~)tx?iw4LlC7Jrhd{|S5%@a{ob8hHk2(I*QZs(R38v$PeKe% z#te_ifD@-EEAe|yUVy<RZviRZ#SDo|S^-O36_q^I<C((an?R|anRy4k13)GiPd0{& zuVBtQL@7`y^UFoNl)uXYQ^KeCj*AHU{`A+6Xp`F;&rlTHf=V;#doy#!PZW`i9YvR< zf&F_TEfI()h`^Paw-T1RbnVfzH)BxRx53BMqBUe`(6<(~se`A!C5*PTl&&XJ-V!Pe z6_JMO9!Q*uSda4E;p3;}<`=K3ShuNa+YX=vJrx0iq{9iaZ(xxoUQh{dF@q|pB7!Ng zn{cSF*4f2Ri3u5jgXx~6T3CCU*qh<GNVG&7P%lb#_wC!YoAGd45W1CT<4wh|0V;JF zbAqt6np!v*6LWPDy`5V*d*ZOKy0&VB!8<YFY~aQbO~*OyL>v}*ZE`C`3XZ~DRHa0e zOuo5Py!|AG6PU0vHKq3weNBL#&j{JD2N=dlw<3BAmXzR#?r{xWqEeG4?-iB6Zq>M; zl?HHpD0G8Ibmx{Mp(bINXOVu>4d9Rl*b)f^TfG5FfD!7_MkpzfGIhCyi|t_&sFYW* z`oM2zE&b-54^zruQlJt!I1!1?Z4Q~F>7x-7i+*m#Ow1AqO`H2^_XhExy@_2*?AFas z-9j4Y%}<%GK^wE%Zp%q--ADbAj|nOCyX7zV_mK(E1cjd4BNwK`;7YY~F9<3rv%_HN zFo9dhUS`@b9%)IUGFN|k%C#v>(C6(6e=oP9K2V+Fx@gC4=EuO5$a)@THy~`oym}HZ zE2{Uw{TKsQ<PGim<>#M%YI%Tj;xkYYsFYQgLh24o%EFSclTb-asz)V3N)$>L>1OYx zBWo6w;!Nk+*@C5J#&S?5ZlygU)CZ<h4@&<Zlu4ioRPssVR|VF^?@p*BMauG|fF+>K z+hka*KY#FX!<L=;d_8;&)7xlBIb-ImIW)hS9`h<k4Ev5zZ8Q#`;DiKHW2jP#R;}B# z>(IH2O>=4e--b6^i`MPB^z0``>ffhVFZ=0IE;kT6z@Py%OzP3Cd-OjE`+%)X^f{?? zGY)RZ_ai6HT!2-na{Xpp0mw=R4jwRqqxSPSv)REUrmy2EqtOgksCuK+5lIlDWWvp2 zIG`v}8c5!R@b>n$>l;V}B>BM=AW9u6p%S1JsX1h(tlC{!xw^c3by-<?McK-g6rU6< zMDJ$eNi)m=zeOdEGQnFtGzBVAx@G_uTnVc57L`oF!I1<c$_TwGTS}+|)*u^2_W+CD zTuMqN-x4eZ9QmjezrANvBAT{V#{g{)3<>9Cz>*{>CEkFnl-2}>wr!=8bR`Icp?fPy z1;~?q_13W<Oq;9LljvN*IMC><gx;OIprq>5y+3qN%9M<WP`7~+A~-~(=yChtu6{@s zEC+y*NfFjjaSI;NnHFp!@9*2(q@2nUD8af?hoH;@<X4~)7V)dsZc-OQt6MRNJpOaZ z(tm<VPi<#{(*2sc6A{U$p{ND&c2}|c^)D|Un<%_?h2Gojtq!h2d7vuhIzB5%J)i{m zTt;`liT%obmh{_&7~XRZw4$vlJsGg8;>EDQ=NJ}mDo`-5?%KL`*-wMpH(^hU9WB9x zQC!4vVugznH7+bckoJg3qC_G~=sR$hpi3F<Bq|X-#ZBNsJkrxWRuZ~VPy>``qANm) zOFT6{1E!!Uu`=ic<OoIqNpZpR`Fq*kadl?GK2a#JD0q^f#1+*jg1EmB!?mKz(g=oh z;|^eUAPk$?+cZpylD4m?J3(3^R3rEhl-joM*r`jG?%lg|?Law7tJZw9?MROkr=oQ0 zMkiflr{0v@4jjl-6kEF4X8>~(b-Le+O5fS`&4zIJ2Zl|Up1Zhs)tdE~_0+oe@57`= znF%GiDFuN_NNoYFSWk;j=g*(LK$Zes+rvm`uEvdw5OTLSFg=-0qKEKwz>(bF_f!K* zbZ^z=hx35nfeH?lVpuyqnzb7%*SJ<!tS(!<hET4|;*-LB^zNZwb#Bq<lMnH-ityl2 zy3F8_$0{8!HjoIul3mFfxF|MJ=x(W+lvq-HRb>jUlnLP)Vo5^pCJ$%XTS6rv$z?}f zC{jwl$(0D<8ofudw7E(OR0V;hCeb0d)Vfty@1gD)Nhu;XL*gyEzFa6rG-I;(Z7W^& zaDpW@X~TxK>oo>!pa!lue?C+xQ<qDz$)o3g1OW+^gd7M6xqK4*_!Ge<KZEg5?N9K9 zQwYjJXm^jtZ~=JTL8rNM*O4sOQIfcwy0|-cNpevuhmlBKikT#LU{80L+eWPQ;)P`= z&tLv0(h?3zI(Q3@`nqXiLV}R*`BO10!Ie<YUp;-ugcd}Fb7a~mOsFGFBNuobs)Tfe zquVGAu21Bt!NK5-dMcSxW}UVe_pl4I7;g#M5j%r*|L(073kcvEH3*(fzZ<ExLP9-( zNl3zuDyVpw&S8N`XcBS)d;&I--Yp7=RPi;SiEA0@l#sxWBrS<c?86yc@_q0Z^=m*y zc?o~F@f^64R3)EOd=daHd<iWoJw7PXZ!e;qiGR^w{??#b+phhG3?ECAr5UrJN_ly? zvt~}6G~PM4Uk~cvt2?8%+n_DAXo;h;eTUA#PB+JIw*!^hv~Az6O`CSW66A^5x7^>c zGh%o@z-Yi=oJxM;pyc1T^rz%9Fo`KAy28g!p1rte<?2d`%qf2}QaDge0bDdHK6Vn$ z8d!8T!nkwiFW5K$#hYCxG;T{!5C^Ya2d5xVG|allzI1|?>j$dMz)|AMKJRomy~jJY z6UR}twXgaB`#laD(nI)_Dl69lO9XKh<z?k%z!Ej2i*hH87~G>xlg~-R$(Fo`%M45M zsAo12*;2$_kQ`ELMsQ#^MtGvO){%b8&?ORatfVb9rwtt01IUtsH$>b(&hYIsElP|> zF|}at${<V%deL$BJ)#mCk#q-l7cFHtDhCeoV(#Cg$PHIgO)_>fU{go30+(g+n-<mW zNOlh0gD63kknePM7e*6GPA%$ki>prDdh$mWN(%Gs(hn+`dGoyv2caB}Ng{-7m?O#X zLvN6Dp0R9qf((uyiF<9Igiv$SK<*ADDvHnd@7zUrx~XX?4C45mfF<ssAsjh<;l<7* ze*}}i4lo(*OVs9%1uD^<GB_B9C^WFdm54w|!4bfn$9hDu3819%g&L2pt#Sk*a?lcG zdypprI2%Y27i3TgcV(u+2b~okCB@LkAWpbg_wCwPGIL0$rkp$MXl!Rfgpic2JqZZO z08^Z&;u6>q*pyHQe!~^P2Lwp4ltCgHPWlAD__6xui7Q#no8K3-DMOdkuVqWnCDF;~ zEwIR6!7?V}X{Ad39o`Zw35JzcV3WaH=t}9)&N^w^weQyy=`w+P<}94IbLY&SHjzF6 z6sployIW__rY-L=+EI2=>F&{^8vxX{P20A#IRTy8!k@Y@_?G&VHoz3-0ZdB$aZg6~ zNsCUfSHg}Qcp^<g=hp1~{V1gFLR{VJH)2-8t3;|tS&1AR<_vTtTXxggC+!}@a87Hb z*AEd~ppsQ_v`N)c8Maw%OQ6!x8mfD%Y0ng(gySzziEcmO9=2qAOw$brP|``Wo`QC) zlp!vyE-Nozxtv%dKkujU-}ULp&`R{~*lh%PgSWK#)I*Y(6gHzomBbFnlDZP0lyFEa z3U2_Y6fqnfP7u87^=`2UKtfXrOMpblxGngR9I4?K@TB+6m3U#yqk&30cEgphb64** z`{vSI0Wc*+2~gU$jZr|hn_N#rJu41jQ6fHB)y;e%J-1=)>J`hFn+sQR<t<vZyY~Jc z1#oYyfDPpcA2$))&!7=xDZ)4kPh>zq5JhZ23WD=XIFs3ZyiG2nxEQ*ma}qf`mE=N5 zfCYw~U{iX;)7}>&GzXvwLCO9zR6<GuGr=Ob5<wg)7r`J1`p}u*wz+(UTR>xg`4?<= z=a{Ie-yB?|D+@E1kW6XF11Qnsz%DH$;KDv&U;tHuNS$%g9waG&(y?R5xyo4RgZuYv ztIYqQPwPg(w1Z{CmNYE|GX3psj;tO~IBPk5lQ?Q57048zBrpXCC5Q^9l)b?SAw2~! z_jYl{>k;tRvBD!|P$n$JiWn@w$Y0|xkT$Ul;o=YRMv&(nniPN}BmqpZd^is8rmZ{E z{%xcaxMyM~A%vUiZ0~47Lhm<;QJdDS+ji*Eov|l~MFe&2TB9&AQnFL9Ca&<9*51~k zbGM!}y&X8%X1b$Cj~O#+WO65cgOz*8x2z%J)3@Ib|6%&vg5_lxD60$=_U>0xqCGLp z_4sj2lo%+XxvVUw1)@MDd`jqrGF~Rbfl5SfMCv9xu<FzP0Y%WhKL>Cm^KN3|y(q*M zPB6l@4<ROiGn-8cj%uw98`g#9T}k(V3T!oa1d5j|oHKdEz#eI`Ko*sFML9OV-8?)z z%1R73A>6_{0aaoVxV4JqmzJ#(YYJTA&M%wd@y<BBNx1<_X@#f+gMuZI%ySvHMer8i zzCW(CW*vwPpwPRG8X!RltGtkeoU|R}VbRhpA~<v<$C#ii(GPtKFY<2M2N=UKzkz2E zlr~hB(XV@9L~o)}e&vBHe?*mNtVWtGEsc+q{?j1Ice{+pTpU9ubuK+tT{7FHcL?2@ z`?wcWx<iF5i8;s+ws5jy++uPL0h}jNs(Of4<qDqxJ>o>A{~&_HN`=o!h9p;_jE+C{ zXNE43^Ls?O-9w_wm-KwQO*^P_r;Z#wSxX7=EjZg<JXN-cLg}`l64f${jfz@bBR9JT zoU`$>xWr^b+M}~-YL3&*ir`J<o2_AcRax%PF3lO4!(fVkM5UxH{R&88M~xsZ#3kc6 zq3E5&eFmHYJG?81O+6|ZzP)?yyA`_`*P{~8mryC7NodL9TLyvBQ~nl}l7{5N`3&~t z*91#SOCL38(z0WZesm8QKWQo_|BRW_CQTSU98iKPb?pq`h)QkHkC+kHr;pv>+O-9x z4A;7J@f#yK9z!rkh}W$rO>gZEH)h;~A0{wKca%MI3EBwT(75B1qTX>>l}ai!1vrkR z9+k*E*y+%Y-KRZLm_39g4i?H1xOCZme#GI}K&Z~;3jZ`MUA=S}YZLSQJbIWhY0;F3 z(q8(%v4xX5+K)hTn67a4T8bDWaz*$92;|nRkuot$aXHb(+-c*!>)RobC0SB-!Ily< zWzZ>AuhpYcLr_VkBrGLVYSmiGgzhak8P=(H(`<<ljtm>br~#5Upd?Z98*cmpRLWox zUotB&>b=2IMdiA6ygnq*;IP#=10oCtm`G*D#5ba}tytxmfkM$Ux&O*FYx#-IDa(nC z9w(*#$@S~uOZ4l8e=b^($C`_ga(?mVqc@*nMEw0ln_873raoqX3D<N;Hc%Y=lVFjk zg1BTOHyVf#dA)l1;^|9zuYnb~3F!3A0*q`!8Nw3ZaSIuEA}DTx(FjgH%uxeRpXxUF zk0Q9}k;(iwemHst7;8R$Dp&%ckLd1Xfcf~|tsBH|$7+tAzE}s-Bf12ZZqlj*R7y@4 zY~64tQpXVzxc^#y?kG?aJQ#^7aR89qq$yTM-P?ZvpWTLKQwFw=0PYh}DS9a<s$_EP zL&;K>+DPv`U(*5=f+qnLd<aUSM<B+Z|72tp>?Xc)HOrNJvdq~Y*SOAah}?7hKJGUx z%Qo+Z@$j^NqJat#Tjm!*jpC`(8!0d`m=Q=6C=|3QfJs2($9)2-bpO_%QS)|PdJPyd zZ1ngaC(>t$v2eq_cdjidILJ`@c7$oI+jQvCqj&E<IxCIeq(z;(bn6<yTsz>%2Hzc+ zGs)C}n1zCXjyLm1VQILfD9-Q(m<ZtLCop`}WUNZ7DmPYbMe0`Z(W_TO+l-nMF8Y_8 zq^}Z@wjD<4$8I7{RKli&9RL{ODwj9|xJ)?=rbEz8`mltE2>kFN<Ry3bU36C>pN$ua z{wQqx$&QStW;0`Tc~8-ljM@|4Sh|<sO4O0goHTM^_ts4skcQ($=jAkg5b+x~WEMxC zgJT8`uB0FY!%18TksCNt@D5B8ky-~lY4!$|^jV}f-a=8(B`8yacn+RKvJ_vODyO*Q zXgOHZ`$DCatMQj2R0B$M;KQ#(feBfHT|1Z@V^>dX721@d%o&e7%_rBc=10`Jcd@_h z*iLgLd;-D}7wc$38T|sV1t=>mT)zG6eG1Rs{GN{U=1uU9`y}2RMjP&cr%{fN4f_eD za9%to4AYeT_~BEGLCDmvH4Wh(qGpy3BTl4*mjpINVT$m>w-lR!OJv9%03NWeRI&!a zdJ3kz`1g#InZKF8^6@ig6aa#(2p=iVGe5|mEPmpGy3c@3nn)fxa_*Y=`18+lwi`4a zw}&1r1W3zat5i|CKw~&~60mdu$s0|HN~=>8ULD0s%v*s1EcRM6%2Y~iT#+-ZM@xJq zoHx`tkt<2ol8n6c5kyAR$Uswo5@)a>oGSu2rK1qGy&?dlFES*)5v~9c9{esCWuYxp zjCgwJ(npz*;(tX#54NMIBrav1f+rGVfSQCezJ>fFlCmTsF*cXShse#>gi)pk;|Z7z z_eIl|9lG}&ID`=<6Mh&wb_B-m0eyOO?+PTfZ|7&b)|Q(vQkN<e1SCYI4xRCNck9ww zWr?8!q~Dm-)VXt~Zou2nQDY})%$&lQxEQ5NlM`4Hpyaas$+(~97p+>iv1&UtX(q=G zkbbigF&1OhIWP?M3n(Jo4wHAF5<atQx3DWw$%wJC4q+*<$&}prGlb*Tw$pYUa6+W5 z=KU0|8@xAIm1*yK@GvmNK2M1jT!0xI8wgk6O4MorO%*FER+JPKF3y`i?pw-EXlNpP z%^X{Io%9*F#Icdcer)lYi1Injm0&?Zl>&!?Ac0O1&ILx{urLuPUD8S!WT}De0pjOF zQ_>0Gd`nAHTq%x=LY4Q0N@c5gDb|td-)vvdY64;sm;3hO6A+aQ-|$sHlRzjWq|mxo zufg2`buv`eM8BCDlwe!jtJb}EejdU=4*%xnm+hl7?knHlzs4oL)6i||9xlTt=E<1a z#@j#SA3WHq%w)ZuV-SKe0Z}-Op1r2M2z_puKLSMkLPm@z4yzJC#Oz7|iN+>;Lx&SP z3sC6`(V~a$J(_w)lka#Q+O+*M`t}c`?)4jgKhN<PcLIN};Q1&-EuTt4$CQCbcdlQS zD%G62bmK0__cN^yFncqp`z)1Irw9Uw;aJEJI$qFE&z!q>k!|<fsjzjQLRme@15X}1 zPQCh(Bess&v333OdE@%EZ$<#e(&CnaIFu#QVoB;rIeQalt~hrkOIc(J+9K`*9`QvG z;(9_SzvmO|NT5{DyEyl~E&B%ekT!*eaPiAR!v<5#^@A-wLy8jxBR^T<TmmIwDL{+| zYv#^^QToca3B`Ddzy9s-pEqeiXYK*XhK<fm5nH6%z#~K>zzI#eYmeT{w{4Fbz*r4U z2~_IJ7;Z)Gj$OL<q$Lxu)V=SZp<^dfz%t!Yad-^Iqfv!NX~+<4N|f#n9XfLS)SQA9 zmElv0(E$>r8sav@K^N@x<Ou|CsH|K`yQ|g!>Z!wzX3d*Rhys?ROK9D+msag|9X_la zLca~Q5OUdK5`Hx9IjB*<eD=l-CgSJ?v;jbZFEOudHHtUpfMo>>=1d+wut(b_pGlU| zvGwq#gB(}ju~H@W3#n38S0V=&5nRwDWH#frENSu@ummUpOK;odns;LbtU<RTlZR{` zAE7M~&l$i$q23cLVUr-9tz5SO@}r0BAY{oB6y-T5f2RHmS}4iG@d`pU34+PMc_*mk ztGk)o)s;5V@ogmm+&ln@MZ>oxYYtugIZ)|MLZvsa;Y}>S#Uc*g?g-m_(&vqSBZNe} z_n$m_NyiXmBr^GA-O$3-bpS1H6i@h3^rawRG-aayiL-PuH{C}j=aPR!Z?`ForTWBq zaLJYlY~8mE1&4v~_WIW-`43=Jf5V$sO6xE-e!nfBgd!N&Ljp^<61RX#PafXAeu)~9 zn&W4$+<y4{rFF(s>CrBgvpS*xCU?_gDRMTrgUQP=mr2o^-byr8VpGP=4K!g?I*OgL zhWW&Mwr^TB|Hna{nyYoQ2>m0A8*yAjaY^!imo24}R#>X%O92{O2o;%?0ggZ<`BXhB zrE@)=B%%di$q#P$upX7zxU+0YPy&^V-Xc;<aQ6->@gxbAGFTKp5J>dyMW7fs_Q6M= zHT<%jKJ2d*q-kRU{KRxh^K6~EbV1eb*oD&EFjclhQzBv$mAZE&A7>g4LqK0A5OnR{ zi+bNlKWWFDHA|bg<8((^yK63v3A#4^9yevq;*!-Hx9L*SgiWsusL~N!-6uFGFkHdu z6#GhTBugQ;wORu%Qc-Q(2JZ!vRJ#$C;7i=Z5v6T6eOv`4E`Yg%1ma?nY>Av45uAn( zUCH`vHWQ+3#!rK|M4z&CYZ=1?Dkaa-;<=KgPPWR8-6BEK+e2h*&9P4bT%t<m&Fa<e zP?bm!5V!eRzknsXEkTxo3h9!RFr^ia$;M5BC_#?EB`zWZmtg5Vq0;hIrX*LRUsvti zwU<mLo&a7zY?FWz6p1im8-xh=r1JtIZGb9=K8UQuBY-N%5;ucNN=ubxWZ)K>fD@PU z<`u55xsEG3pa^#K#$H9t4xu@SdAF!90Y!KVW0*wK_N@;zJvGzj5|yI50||-J4sOLe zWDv)*1gg9tF&ET@#@+Y?l$7oPPJBVsxlUsNp4XOeV8}hL-={~4s01v5N*SQ6$DiN7 z@`k_EVqgBQXaEH)(Q}300xIEBAiN|k_wdg33&%MXPogS4ef<hlx_jsP73VUz>q3|a z*)G}&gUU|!+VfB)+hUNgafw~N3s@jq&0+S2{d87Zvt;VmU0XE?s>Dg-=!#}d;oN$c zAnlsH0VXL-u$cNd?sris14}?rfKq^zc%b@}<x1(44~it$@n$KHH}e(<t|TkVpi;60 zh;5-@WuF<K;%aauv5{XV1PNeVNUySl$y<1=K_q_$Z0%#ECHlJcr;Lp*C4G8y?ueqz zR^O(5r!HN)ckkA{OPB&IGr^0~wgWT1J7Nd`l>)umcka=<e}6_>@@2@ViPM=5pqUp# z=2XVTjU780Skl!!bm*|*qehOIIDKBx%C%KHX^p|4L;7@M7CU~NdY|KgN@s$+a%9fd zns~F`gagNCZ43^O84<xbzXn)J!V)0GA&)T}pi(3)7|XtsZc3<Dcqz%tsW$D~i_8>} zhb8WKk9qfyJ_41Hl|ZFcG|Z)MVvr@2rO&8_b8Gk=Sn|L}0*)HEkc8erC0;iOr7HtS zAu&Og$j%wT5yBCj=|~Dt;=+%J-WVol_y%hE89^KbN?qwap%T4{>7=ll2yW}H-L#f5 z1Gfu(i5|m%jt#18PleS2uM&nOEEbipOp1oUqir#PNqaZ(8(jlv{avvlW>e<P$<521 zoi}%W(Z*vp9@~|Oa0|-x<`>8g{-jWZupDVkqE*{{E7+1{62u@_Gx-lFA#8(5&z{*S z<Ou-v?D<Pr&MPExTKvPAfDwTX<f2FpoG|ePJ-R0>Q7(52f6y&woCLQaJ$Lt>rFE`n zu&p=PH~$U7M7hb&4<0`@At<ZU*J;%o0i&)@z>3t|llwO>pCx`fdivU(C;UaA6781k zQF2-aB;-Jb$TG9bA|`=Q7BF0(oPj1L_+qGRAX1>|8~dwTgyXFcm2yXPZ`G`kr^^=& zn>1JH?b)MK8*jld$I0YmW+5u71@JPNy-)k9C$YE!WF#^pO$t&Xc%*N<A#T-Ml-Yy* zDm@ZZf<y&eq&Gyk1lXQ=#GmPEqJJ`EDcw=PkWZ|p^nd@)rx#^xvCBPyN@CIfOIIWC z3zYH?3RL<(rc;0L(WeMY?K*Yu*{A<k1HRIvM6+%^$*r(Rl6hlw@7WVi0L8ilB6Rca zBrc(L6T&GpF>IjESB}E%-T&(mKm3%paB)8AU~(?ArW3_6d4N79l;(~c5o1m!Oqsc` zxMJfrx^!czuQ35?TdNa@e6(ypPvU^VbC1P=!hj#M-$=i)x6n|u4vqUN9wmEZ0ZS}{ zxzGvOhK@qIU|no5)%$l*`iAFbFJ{U>KJplQedCBod;&)}{>Wm}J5hrGhRRi|Xtu;8 zrg<~RecPu)bEey5BlOHs@(TxAu}@ck4d0U1&BoP)_PC)d@e09|$Oss<8N(UI#YHkL zflC05s&)VpgvsklN<ol>B||uoOBZFxOYaMoN>{Bas{my-Z^1)`F94$wGPmfi9e@`! z1~Y8gx+B{cchiQ-wQFHkTXt|42~|7;B<7M<M>)@`<wXTf%*~lI2fDPdxa!!o2gYQe z5h2-2a`Iry6VmJG&>#||2Cx8`EZ=xQm!!v`c0b3&1lCY__EP-thn_y+37&~(R@V{% zW}KNo3(Sj}eYBoOA$t?YQ6NVa?$&iG<WQ3yJbX;Rbsztby_-~n#K~WH8gcSpEYvU5 z?5EG@-*g}7dnh-0a{m!+QyyAI91-1%$G5MZKXLp}&FRb69=v$-;uYlT{*9}sN}S=x z=}U6z)X6jG6Cp2MpjoaF9GfsSiTRW#m|BkY4tPq9i8+<g^|n)MGJQy==A0Uhn>KIV zA+?d6GI7*5{V22`_tdFl2cj11!&n*1ZsUfSz(2NlN^p_v5J6?o2QU%@1fq->6yFDe zh#{Wofk$4GZb_5UQ~ZTlh`bB3tjrirdjPP+6N*6Tw*)Mu-w~kXA7Ow9@`y<?CB6h# z3X&8e6u;jkD1F|fdD{*;jr#TP&n$1NOyd967QM)JO8xp7pLM5aF4ZTk+DVic_KnfI zE9z7GcI`1w_Uuok$$)`FhL4{*Ye9ZtAq{62Etr=xd&aaW476m-9BZsY<HnBraq8^+ z<&|6aF!Bv4$>irz;%5SGqc^M@r|C&zT#elfMG02`n+OJd=u+TN%DY{1YP*>XE(qX) z9TWJGvp9MLRDv0ig4+!+VTC$Knd3p!Z-Vok`25)9i7@~pJGn}jKqba|V-3LLy`rRq zrj)r;XlT-^F>?ie4NGhcN#_QXqF97vNTNy&rPE;z2z^_!MDoqD98+?lQmZyCIAtP& zYs%D0=feR-U$ElBEFM@SxcQOTQidmSd&BobmR2lZRk3;vC_`r%Ua@M773gw+5om<M z4ON06Y3A7Gw+>f|iW71N@TeeB2ut_@)*v?#6ql`ldd|<C!<wBlCwEcl&Qmw2u$7(g z-hTNUzYmCnRoaM4`9~i%uq44jL00gVC6Rgq!gxF|<TWn&IsHn2(6i^D$y+RW^YZnp z*Dsx~{UCWLp<SR8MJTuGuGiHuV3&@&=s*tu63Eg+I@(61Ee$5or`~y@`lrmqo0;!{ zr5AJ>P(e}xi?EGhnsPFnRAFKG`Qe?bXV_~`oV{}A@k@T-*^>vi8SczpOV#Z$zy<}C zFzzfx=L|TxfT;x%^{a(~K|L;(Zu7>-dNg^iESWRBcNffo-TMsYU6!|`q;y%~qTK0| z#xWXpSQNg8NqLad7{3|(HMOYy`%p#Sx_RTzKm9oR7)n(D4S^xxNMuSNmA>~zVFmaR zi(FodPk=?jBrav{c5hDVx(p~NPpWy#q7tkq^Yn>+iE05#fkzR-Nt}`>p1s0f_$NT| zqfb6>%(#H473tfb=_Xw}wuKTAZnSBS8-S>8-~j%Ay<%>q?=euRQ>RWH&AWB$%81?e zyi#3zLY8P^GIY%3S@ZJ?i%Uw1fTj8Ka%N4RHhChNH;6QD9A8F{7^SRKx?#s&x^yEY znfkQCg#AM?$sPglSJ;wujfj9ICU69tujLw{H!+(M_Z29VA)Etv{6cXyNA<*slSdOO zMgO<(DN)OEU>^;Fc#F~7l>lxFbzY$?;ivH{z_ejKt{Xtf)&UNP%Qp?zr~Q{-VDJtK zoQ@EerrwghHI@1YCIz50ZPF}?b6Zf33j~o85RGD`RGcv79;U9OW~2uobp{ZfSnr@x z(4`3B(7D|nAx-Z??q0QOMfn<i0b6$>D%mGsCvGx;i4Q1~)h2-YHWt#-c1`jd){%j; zWdKPyP{|UyO&0UOKG)z&U2Y$STx!0-rJTI{Rr_jh<JczDK^i8Trlym0nY#&*sH?~C zXs5OqFo}0kRhg&_uOu9ac<qJ7CQPoy!pIlK9zA{b8!UnF(DfT{leTau7qm&U5VdIZ zU&7Ex)D^;##7y}c=0-uV?x)l}AmAs%no!b#J<#ecTp?pY^-RF=G><R|;5SD~*La}s z9Kibd{_V@Ba0Q&cbmPHOn#3VQ-MtAaIi?%1LiMaUdIX~|1_2<+6Wkq{xXmRvISuZl zQ`7B3kFLjdu&ru+S^f+FXxOM9r{@)vuHHl))yB1}m`Kd)J8S0bnYOrQ&6qlU*6i7{ zXY&1Y=30*$_U*tvJvz3gIZu5XjD#9elHV>sgaz!>pYYi$AW9-iTzZ|`BVvdc5wMZ} z7<~m(3a%vFrRS@E%6JZM7Oz5JN{Hkw{4gtVtq(o~lp4W*I(O^QOIpNq6WW(xlWc{k z-MKqhLp|HTfoMkE$hQGkXxjvDojZ3z1y5v2r&5<5eFhAq%4EcZsdE+<EGs3K<p{6^ zxpSCNFnQ9CKmNenxgUR=FlPAoGz*xuX!*vSScufO;j`#}9tl1Txd9`(m=I_~lwuLL zVFaipmWxRd1aQF8MdCI=32BLo%l6TNAFB^iV|`R7EP{yrlnCGs?LUaO5_ySD$LZcI z;Rs7kRB|DMtPfp@=9J}j@h)DvaL%L=15p+me8i#5t{_S&c+;t5O>H)OgH<=p#BZRI zDmSQ9FL!6S61S^&3roR;4A8)$fG0yW<2Ps$cY422Wc23k5U2OUl~9!+N|ENLzk+)- z90_0|h69kWmf2nyuEfw!UOg!%$xGbe>j;E>H3{EvT^J3E@~eP&rc=)2UE>>Nc5Z(8 z{tLI9SwgBU+|fW1$uvwxx2|I-wAT8%Iebc46>1{0r5zgy2?O^FFzF@eq$p+QY*q3X zfX1`mX>4hx%#sxx1~d!c5+-(&=D0S9v&jjiyflTg^%5PCz&8n-aa=+lB0`V~=nD}Z zwnod6cVG$MCaCl?$~Fc8+wR_^a-@#Qy?3atLxX>E_v%@+?xT2>9`m=odisbC0$1fq zCopN-(BeSN;iI&2qx3|kgayV8m95ytJAu&Q7~3o319ry_8n12D`ihc*#S0fLDOtUK z%N|Q14$|19g6_`Cik9XtS-fb`qQ&{HB}L1Y6&EinDk^3`#=N{aGp7DHatMM%Lv>Q2 zC7{Fie|8BbaXsDk7L^F$ph~hOp-5#ZmDB|)#Rg62z}=FsK&5zscrLDqGMQhKo-&>z zgG%5M^eDrSf-ogb$>{CFk3MbCs9DQ))|2!CmiqKURqD`Qr#5xB#ASnYKjNs2_5tlN za<|hm2_k8tbaf%3)zjVQs{x?W$O%(t&C4%ZRs<+H`7w9S%;{67PMJJ;(&R}{rm@2r zGVuMlpBApzxU2dQ13|$dND}!rBQ~K4qIAwM`z+pW0yi9H=gyL)z{^dWnh=siB`mR` zQUFtA<glV~%-Le-z<!j&NqsJzl~@$ISCf0whDLLxU5F%Pv_&O90+oCp(U_7&5Ldox z#fsA6!h*Te#t!M#o>sXZ89^t)q#Hn&5{gm~rD#8b_9)2#l_GpYISN$54Np<Caa?Fi zNml}ttlm}c7HC8wQAu#(BUGh?N=9%Al?1CmCZfFeK$h?YK$L(T`vs_TYfRcERU+~= z1?Ly;rJH9gYn&?(me#MgLjXSsRdS>i&%<j;I9zHtJUfSk?5sI6<}6;d=iH6EQJwMd zXE=;KCiOj{_=HY)^$PtOZ(h5t6a*^W*T-$m3Ag}C;8vn=7drrkZlt6)G8oc%uSvoI zBf)Uqz2KoxA`)%}j1PgOo222c*WF^kE|FV&f=ah<(bUA!5%7^;;}idaU>=zH6r&Ne z4x|ATlWrAv(~D9@^pN?y{FzuZO}SXrb_;{IsC4Jz3AEBPmv7wTrx2nZ-6w#%REw<= zC4s&b)rc3z*n!WSy?FToO81#sdiQXN!CP1&>%-=HgpRm7s|bcyujZI++r@rRwV?{5 zo!ZB-GqgoKc5v6`%8HfcsG%!MdCM(ZR#H-2w0!xh@{~!XifR?<n@kzifNn9pM}!eJ zgc#$g`UOu(jRUxy5Gt({wE;rnk}S#lfF>623d06sID2aZSCZ<)bH{HGkpi3eP4V~- z;^+A_*~Jh2zZApClS1g`5BuQ5k3admVY3!(FlvKJz54)4J!sa3RMfUzTlDYV0|tNd zHC(A*UwgQPf7^IXvJ}ZVs&%Q9Lug|HO5d+&hC6KB<ezdEfZ2rw`T2_%<mJqs?dTNx z?m7W;%+Rm<_wGAr#I!|an|A|Bh)KfH$x|GdbLXT?r{G865PeHh0CyI5!0Gd(DKNfj z?WRR;-8H5+14zs^L1)6dgzQapSId-2#VNKJ>U^2RL5ngAO{keTK-VR@E$yT6D{r%u zKXR|<EyM-zw8_~5yq9Pkz{d*4!!4Zk<FK!~v}*DhQ`_D~amH_eQs~?ns}k7{YWy3c zDp8pW<QVuGxrH+TRElt}Rcp&m2;tNsp-K_M2{u9#VH{r*CjylGP+f{3Pqq|~<6-YX zSVHK=4@qdi+5xXrJ0gPHu^X2chy={@-q;3eQF0RP0$@rNtJkhySGnHFCL7mT00+QV zn8!m^f-99ST}b+k_>GmbVCCMkS8rIrPh`cr+8_%<qti;<TWFglSCT0)D}+ERmX1k^ z%bq@dr2s^q5ZDq?9Q|qKFM<e&loh+*g{3!O$77TKpbaVzR`1&mjWcYEXbVjV^t*YR zrnY3!9-88RB`m?jo`XeESqHJhXHLBN<Qc!{35xt<aFAj>@_cu%&>-@(J0+PHM&CLj z^Jk`BK7DlSJolVBfA#hwhx5LCfoJnN%>qszJ&YYv$Na&AjCea`^#W%*pJz|moRW=| z_reK4iHegWhYs)Ewvm>33@lu|k){`W^=J^#?Ip{6;tZ+j+EX=qsy0+sSe3wd;u0oe ztN@a9oK>!c{%_c@jvg~>DO6m&qBuWi^2l#`wg2+7kHTS;0O=h}0-Un(RzOk~mVl!y zKnX=+5}z6ADKu7NIL!fx8i6W40&ohR1lDkisFX!Hp(-fS{{cu|7mnac@#EkfVE6aW zK5x{th53KnNPrT#{qEg>8MGo|kPf2K;BW8>^rM4Y=Z>AxxJka5f5SIv_qT3cx*5iG zLiz65ci`Y5Lr0AIVaoJ5a~CXJw0P0N`Sa$^&7C!4=B!yWXVQ0f4DBuZbnDWk@6gHf zS5@s{hCQ4$W!&iRmPx&dQ^F98iHQ3wP{bv{+htv5%tgM8w;Q5=<tjH_zDDqd;X_mc z*KmU%5FXdGL=`T)2v-1$NQChmG+U~s1DwA7Dh2N?o89!84QCjFTPcG|?C;A<m&25E zr;g?zHvi&Nv#a2eA07nFlLl`PrB96Cph|!eIAeMsQv#>V-L?&7I&!5peAlvtKm~P* z+(`3gjhhjq5tyYIP0}P$5{ZH<QMy8{T(Bjn6gLA+?}IB<&{&2j3`Y`h1TP}nuQ`%9 zj)D`ZCo+?ne_lPj-)c$_qOuC=b=IP8+s>qF^LpMR<zf;t9i4|umn_W9iTI5OZt;rU zXRc-Y*+N(%h`N3a+DlRcrSQrXhXZKBzC-b>(y^{YNDRUfOvy_oAF+OMAY1U3w}I8W zfE3q(Ef|nRb2J8kHsP<P&xwPY5Y=HgSeYPD2tvRTOo_{9ulXH79zIQ3P^N7hDm)NL zw(Z8L!v|~5-GL6heDe6=?eo>t)>Q2~P6IdPp-XiRgF|w9a`(zvu;t9f>-V1FS9ta8 zA#iy05=d18DB<a~!6DUEY{KXGZ)3!}bY2Y=;R0A9azIfcVRLZb)^+6w+J(iqXvifq z@M<4Y1e(-|leA~$MLT~&GF2JsgM_JUWqCyf`@!0El>877u-H2g`ZlerC|$B(#^kZz zVZ)=Lp`0a=8ZaXR2X7H7%WUe=D6Ryq2sp74_mM5RYX>R?#)R*{M@YdERjOx7go47F zcL+n7iv&x;6OT8$_qUHfY48PUMglMbIJi=8^Z(rm&M0qVlW*6td*1;#m>BTgv%9ka zxCdSYTVm)^S8$A?l<r+wU5Ms-^)rGSI)Y-8X|v|!%w<vegrqPVOXVy|e#edY_N!i9 zpkY0}odhcFKSKC+w$`qEwSW@)MF5htHaWW8L~y*?<w3I&>XO@%ni2tAO!8J$Lid&| z!KO&3axNT0BRpJl2woHpN<hhGOSaABu!2zvC2(P;p19+4#h7CQTnVCFQMQV;a^-RY za;Kg2>)fjGXO#OG!X->n=r(*acmtHEs7*E_a3q?Tz?1+Xpr|!TS{7H5<ee^CwNh6~ zdbecA;4Cfzg7`iKaCH9U&It12ZXTi<{@)Mbpgo%ctc});b+>HUmZWZwi5FCH2}y~i z|C9^?m{ewsid2&gnhqv(#HCr4HVeWBR_W5kd9&e4$V#)x!EHNnnFfr6X^xA8L2xKN zz)oxohb*WhCV>}nl|Tz<iBLht4NyYh2{?+N&1?UFMepA52J-;V;sTr;xlJ+JHD-$3 za#$0{1UB)P*goLNQ;kdpav@`5bb_?eFRqROk`(>dF+l0qz76GNYqsHSfP+1_b-sFS zX;D$>hW*D*v4fHZzDf5K+zT(B+{VLw>h$?5w||CtfsEt=Z(hB0?qtm&HcR-sy~GXz zO9TkD=jlf;z;Ml4bf@}o8Xw^#-oJBW1p_XY7Oz~hnf48oB;q%QCmlU5ngvBWQv;oX zsj|>S3D|tyX)D9-u#M_Z$Spey`JF9jQl&+U=gyik=KFpfn|%h%WCS8`K>QG*ycQps za4Q2!Z^=@Um$IM~<OeI|N06@&mgGA=Q(9h)@1x<{+vj?VN@A078;{C<!qPtc=<lC4 zz>U?4>XEKs47w7SBmvT~-G&@?OMOWFzUtr40yxrbRJwIZO$2a!)4sbGgDSgs?~b_C z6;pS=fnPh`WW<;W^tGG;7Uf9V`N$ERK&7FB`*v&Jx@DX0-%MOkwx#+wthH9*hzscu zVqmC!HtJ5q7T=_vZc7)zB=qeJDq#muR|*^Dm8+P%FXLB||B}0Ks2>42dy;P?#cu86 z;L%>H;y@+RNScthZiNT1mk_IKMJAUW@@y8B2;p+3j2hg7R=Ez|mLze(5lGRSWhP-% zax{`GC*n8oMpuABH>e~ixq>hyY~oHsxaMDm-W}XXLiBd|Owg{7yJb#qm%`J3AC*Gs zHm2p1mxk9yXA){RXcT8T^m0oiE-f`#Q(nGe#mcf(s|6*1sIn60Bq1H_Nmvq|K&8Tb zQEB!p81o!j2GpFr=(bV^HUUXY(=tmz><;1JW=8xebfYOz7lNom{@=0^905R*T}w!l z2}?>!p((wKLBDey<3J#r`V}#ne#+Z*tegIR2FUTN=n*F@{cKlDxtU=dMgr7JXW3%T zJ%51)w#T+_tSm1rSh%oY`KFpHaHl(0YBrYSFU~J0-+t)CSyRI|?$GMMMBd{Y{GZO8 zyLA2j6aLJXdd-;)ck%SG$f$7++Ghu8>8K(qT<J13=emT!B{DpqlJ3ca`*v+vPZi;^ zlJa#`+u0B(7Ok#ELdR9$i$xosx+}HE_V3udo@9f5J6>{L^vcSOn>WFab~!l9gasvx z?7|x>X$cB#oiTOnkRB}=mhsmlTgz&)!1OCr%EoOV&Ra-HF`QhAp9^J4vXoHi&tgoV zQUW+BSb`-Ksrskz_i=lcE6JD=DoL3P-##LI`=ZI0<o{{s)~zdW)RTXKO1LOnHABJ0 zt%Zv+2vm1*sWU7JDZFi4XE5=2R45n7MDL}31DQ~Xe|yB}2|rAnI(6z#Gg$DXTzXi{ z%l&Ec_+f+kc5T<Pd8@92f0$pk<-qaNpb;{5ETHLPEv-vru?TsBmE?%%4Wi`1;u|QD z#c$VwA!+Z9D+m&zl0S*{5{th1RE~u`$bcev(!RYhB@R^L*n&!mC6UI4C-Kfx3t8{+ zL<lK|2rtJQP`Gqa-i+~%hHFR&_ghqwDG|MeQOOpRm;z)<@Sx;X5{lH7gr`6y!#D2Y zGsBfco?pX`@tpYPvjK9--I67ix)K*yF8|wdH>}5I0m2T;FQog)zwOcqfU-gKD^1#@ zm4a>nfDXD*`AXuoN~guFSx@`!btDW{sVl7|gJ4)uxR@w@_N?jl6r5MM@xaM*kvfI) z+U@KN^w!MjDe|mWoT?QgNf5dblb&l+O6w&yrR1M{`4Zh3NOB=3{SFfS`X)UBHne0t zq*~Y3O30E_>tC%iQoMHu9}`(QqQ(2Ry2ROp<(t;t7d@RE<6Kj7_S)5xRVBz{?633l zmoD3Q=)#RVH%{+dSx`_|v}DD`>XT=$!m9`bVRHPX59`=p8EkU<(Nq0Yppw1-=FK0B zG(YU!5)x9-=&I`7bb5yHqe7V9LFztv{LsO@G~B^TM?k#3ip+x?-=D)#K#B-moVelU zEv%Z=+j*3kQ2te};ewcQ(<a)=>_$+>gHV0ouy&^{0N3i3B}MsjbEZ!k-mkq4pd%Wq z=QbI15}_nJ863$3Y6(=5HYAhs5y(eADD(}W%djk9D1&jql>nT0BtIEX=#K`460vxE zR#%E|iQm+e2;UkuZQcq400sYWr36deRgl`Y{E{NT&l@R(ck0~5e%wZDU81u|Tk>#J z$A#TH!4ktODOVZrH6xdX!j_2QewZ|I;$)#|CKJFGEL@N`XWGQk-+tAjeXAC&x(xnd zUKu+~XbD(0z#6zvty=|#NgUk}dZ-gT3CIGjOr4%1`sPGpw#j*IlSFa|-;k#eyN%#r zRP<L8mFP#Qs<d+t)usE;x~U;T>)x}UY@B2Xy?ZycT*ymXwr!EzZi*C~`-~O3<z*x- zN*Gu<fA){V2Xt-K_;UtHfJ+9@e=~g35b%iu1d^x(Z~!F9)QuZnI+Vy#SOY|+fTYls zq)Kw7=3fFmMrq8miV!W(NC$wZ)TD86rOX|Ik`bI->Aww2OP7_Ft)?9wRtd&VM($q? z$zX2B4ow2QSR2>lPEt@R!v<ecynN+Kg>6s?O=>-01y|yRHLKTcTo(Yfyl8Rm?A%!> zOEc*iuw?E2V{ArnVMFqBWKB^49m06Q(ER!}W+qu{f`(&jZv2pV0irzR6-#3P?|Rhc z1UzqE{~jp)b`UN$OT=<3MDCM_GiGz*GPI0YD75u<9^1{kU>3PPXcDa~=~_z@_*0CC zq|Sr?@{XF?(|gMo<jnf%r<u8nmo8mWy6MpQYZni#D_pW{+0w$2s>3APh&dTN&K!YX zUO#_83;AO;r!HK7^zs**tH8Z(*Ii_UDsnX&rRSub81@}JO8?wiW({~ca}H}0ICK0o zG>N|GRe%waIFTHcQhHj{$dR><o;rQ}G;f-#xDo0upFX^cy@LvcjqC9O!<u4K*|K#z zyK(hlia`%XI(iR%9M-S3{3n0j+?;9SzU|hW@z4oegrlHKSva9*fC5mK-ekB^7N(Sj z49ZwOA_Wn!rJz6xNnEL?UkXJ4Q(zm9;b-|lC8UtX6Bfl~1bh72zv1ZqqES;Ox=}v@ z?ojB~ty_<7-3Z7!b!^x2OZ=eJQ+(d|OU9UJ1t5G2!(=-LSGK}Q*;%!lMgazL%s1)X zr{5r20wh=(IcD6r@#BA(IC0XHX*1^JEzHkflsD_AABPX>*S&q4c0InGyr^Q^f#c`s zD8q(Ht1Dh**)ke8tOx-dRH{7#1!6Bn?7nyfF_G!HoVY05G#tgFuf}8wjz|usbg7p1 zxOxjtT5WO&LkI^Ed6u?HI0USMBZOl@HBd##$u8by?EU8781r34vXw)IM!2?un8Y_* zX>l=i5;;>w5AM;fSwnoWHm*sS<WR~CRYK|h{EKY(_N8b;iC~CIQYFN0KiejY0CAm6 zNwO3X96D4W5jbT2El83u#U~-0$kZs}x42WnWJjj|Iw~z(v?zaRQOR<glnzs(n+dNG z%o04p#z#4>?Uabzpp_M6(4^vJC1jxyGmL&!SplWB42|JB;s&oNHcA?qkb{FP&73i7 zc3#1n-8Cnu^dd|lZVSU}_?*viD3N;%sc>Qg5!AQQ^(cIjB<0^=ntb{E4Y%<%gGHpo zeh-uauzqz1)@o{8T$+^dDA~Z@Wy}Rk-A3o)w~}nbY8m|~m@!gA+jo+Xn=48RmscG+ zuxTlT@29ELa~2d7<`<N1I(+)*_LT*ocuCQ!9mmnRnIa%F^0&XZck$%DEt|F-xcCrP zl_hZZ?%kj<uI?i?N_I%B0ZIzhSe8Of3#Uu$tY=RhVWi=XEp`IkcjOH3i}Nw%5Jf_f z{7`C#c#ctW*KXb*O>pkme$Hb`e3&Z3X2J17-$oSV+4ni~RbZlGg;w=c0WrWHr#)_+ z=@W<cZQtb6zmd@o-jlFHb_0fZ`3@%4gHyU9>k*N}G9Q)nR)wX%7_S+!d7mq;``x=w zC!|Ge7hFkx<>P#)zxKnAKK_iV<ECGdfYTG%xhsSzFbV8w*OH3APvHn3gItZ#ms+(! z;O^+W0E|qwd~I#o&W^dgN!;~im`UHhw4kJQ5~zgveFVL6sV)(hru;N3cR_wZ0baW4 zKa7Gcb?(}K__X{rJ8RGgK@~PgP7stLf@^fov-*y3Qo@sL^N>gst!H!v0AXx$aBoj3 zLb*#903^P6p{|5O_N0Z{l)%ZB7@bROjjW_uNugVpY&68T6%g4sc>sify~aJB_frM$ zDEvzL(h3U}<xU%KF<hfhKSt6EP|6D3F=|OnB10yMWSA0|BVh9ifky#JT!{r;k}<_a z$Vw*Jf*C=Cgr@)`ubIt@=q>^{0n5-1dw^>9f0-*STDXwhDK<P@uq$yPIcJil>PEbV za9g(~OftX5%cOa)I6w)t+d0HArc`F)0{|u82K3Qex_Dj=F3OqcN+jXRw;w!uf}tHJ z4YtupY&wd>3tyn+J`oi)aOgioZ?GZ;8v#8e{v#Lvl6KfHUOapK>Q#m+1^)b77l0Z? zy?6`sM$u~NW|VYazH*&k2ri*;AuS15H<`=ERNLdkTDFtgwz+)C+&S|~H*Z=#f9^aq znW;1L7B4ASoL{<W|DN?F1x4iIiz=!w+$K0wFHd0j{LZ=R^`(WSYin*Ihf$74!OM+H zXHI}h`*!cAfCT0fT%K2gz`*wan*SwddE1JI4HO}0$DTtcFI>BE1M_8V<nCZu`wlSM zo0yL%;_@|Av0F^GKV7qDtF6+JMh*Dv#;4hpY+cN3(n)^g@P2SEN`r(YoRxXACXfE6 zN2`X;tq=MVj3$6VfbzEAfYIA;xhL}@=}|$J0+qlP+E5BZ0X+$50+Z6SNtOcA>S0Nm zl!YWgDU3?LLZ!|Srmi%XbW}hKK#8J0-ih=yW9mlJW&%?iGTpr6lt{4SK(LUUU`SsL z7{GkW0RyQw`HpdvL~uigjTkv<^r+Ee#*X{p2fFUg&RawP4ld1}GH&Rge*K1w&snx% z@3Au;5H_qjv`>mifR?DgB@zn}5DgG137%gY4p^=WN_3x$Q!4e#LQ>)>{FG>MKC%CT zO5vddk_4oK<U1U9lEm%+Cj=6f?=y5IQHiib#gI1>S_vsQV5z78cK0JQm|8Y&z)NAO z0gz6uC)Je1BtQx6jqIC288vQ!I~g^ptvo4SFhMG1;9yd`c911(l%i6scTmai!8q=7 zfky#K?+=x<m=)wNSt2eiDOynu-%(lGM(G;}j?e^6@)aWS7Iis=MJ1srp|Dn#2SbuH zh3rbxfpzO64Yzy=v2YGd30Rt)yP&jcAC0tZS_3Yrs~D%V-<X&alpZ{|_cKNSTM2|6 zDNqMeM8&N{>BVy=*8)q~DDK}vC0G>(BZ^9FC?YC30EzRB8QXUV+HT?&z(jS6+pk_Y zcS27Qwa5O4R~P2ZoHjkLxOfpV#N3%vCr_O<cM$_y7L;t*Shh63NV-^g^p;%$9`k1> zRC;#vcvZ>#oV<dn)AxuRDYc`C_vKSZsl#Mu{UJ1K+L8b~yAK>WX}+1WmxY_jR!U5z zv~2SbHpweYVqpNmwM%DEq~uC_8Mk4{dTlK;H5}V=<NB4_<NMJf_*0=tn=u36=P=8s zd;AFVQFx_!PKwf<yiVL*u@ajlu#_`>;)s6GCDbL@lI$nZq=>z|?XAZB7LekafMpN| z0ZPJ>c_7gyVNFn_3|R`8lPT4sl0Oq<DVduDrSLT+1S5dMK52&*0yJEaoh)nPqBBmV zwk?}C`Jw?~i;1Ub)`3xwH=l1kz$pR|QK=)SM2X6PL72bkdOPGhFlpqdQNYr7kR`4G zO90aZ+0wlH!jj@;OBd%(n=s=0??+8rxN^&Z6C4jViL0Vg4DaL607RltWZ+PnSV-Zu zbfS?qasM^aG*?9><Za?Nt!p^%`2HgBCCQ@Zgh2dYHISrD2~`mii?SqRCYECwoDuq7 zbX(fIvdJJVZN_*Ls1#uc`fL`J=FX=1TesFtC~XW>qUB$NZ-7#u66^&?$)FO75=Kdx zQovG>Buz_x$7ir4Up&3v<ly8($VWzOL5J!uMI_Bk+%6{hnYa=T1Ud}-SM}}^juES5 z*;2r1aemSAiglQ}lIs-N)s%ovfR&}P$&$jQOP4KIO`;HY4JB_(`dnSHW=$EQ63hwu zB+6p~EXtoJRhm8ni7{v1(#l<jRBScSlGbp5W1W-$NFdO8pdEnvj^~uNy-x8^26o<1 zd<K1@P%UI`^6&o{W1=>N;E!xrglxuXG^xFei#+-ifJeZh{g%%jWfG*3Dkg_bYfI;& zCQY82GdDM9-u$^UCr_L-^{3pqxwB`_U%sk%(Y&Q4CCiF8oqojM`0D9{J5SP|^z>SF z`J$YeGxJvLy?mc`-Q*N+T)S}csC@{@>|1P0FX8PwcJHk@t+YzE&n72FDc7XaSWSet z=KyMJW1NF<=`@xCerV?&`u@a^Sd@MZRJzH~@Y4sQxhkLo^Vjo=DvoBcU$NUBh)3~= z6FS=Ka1&Ot)c|Q>{^CXRW=|V4sB<$1`2ZX75zr(&1>pP!jOxEtauSt*CDrb~hLw+d z6Wl~B_SY1U1t<waJ}#;wBKnIIT%_Kz591NBJ|F={a7O-!>1A!&QpaW!08B_Y0+f_K z`{d(~0j02%|2_49{i0EmCQLhvC<O7u_LDuR$c?CN*a*oH0o#v1jvFz2n5Z;jq-1H# zh>>H)kDvHc&isO9D^}9fBKN0>V}F>MyL8PiUfxTZ^siFbc>Ow_5U2WSJ_3g%NVN%- zbPX^H4k?g3(+qDmR^&?dIxtK6%fE{%;><!m1KD+RI7skj{6^!Z!_0m?Xj@9>byV-8 zlYq7*8bfFb*sNP=lXgH_zbS)2m6k8Z`bWJCj-{z12RZBnt`xWglBb5aG@nG1BYZ>r zA^m3dEd$r+N<vZaBk+g<oz|`5q8^r#j}qv~kR`i#Hwj`C5uJFH#iT%{1X~SZW`I(I z|0XI`#Qz+*2sd$Y(UQdl1<T5uAi7;Hxk3AT1)7^g68I`9Dl9B2T>&PQuOV_XOQ3@f z(Hn*&F0m@1PGzXwb91OSp;(j=I=Ks$S5+Uwz)Wu24d=oY%g0ocs7IsX4Ut<<5}B)v zdi0hHfkyfP<VnB0cD=pppIv)Lc;crq7CfURlE#A@C<b_PFB-#P1Gonuu{aAao~+(U zd#H75F-33MuzDF?G-ph5_)qS_g?TgSVK|8{tK@KU^NW@&n44czv}9@3Ma%GBG0yw; zqxhSCKEI=IZqA(9xkX#gq#ok8u3b1y$pI-bR8QhKn&?5rw(qAX1rdW^eC_h-BYP1% z_tl&{$4zd)*YC*d;7TCYi6h_&nrKSfoh1Qx8P^vo+_f8*PS?<#N4Ew^3N5cYw&{nW z^(wsycq<&iB+dv8VTmCcihi8kg|K3VM34WjXRFV38wJxz$Pipdm=cB(#{q`2*Ss;I zQU;j3Cli^)VBC7fm6eJ_x%jE<k7n*La?>^$!a2V#7!{Q!v@64wO!kO=N$pUKVzq0H z@%Z!4{{E4m^kM3t^7lwPK@YxYf(%6{*N(>{c6aO9`>Vm<i$)VBO`JSsD)Z!KOr11g z%m{>~kt0Wr7&R(=jvi0N?%aY>^2m5srcarcTd=BX?}_uK_^)wNLPSY?+@jw*ld%x8 zFI`0R=9On*<|eA6*u*+GYfY?^61*sZvt&0kCKIbv6B(8xRvgJrszl=^)xq|1_>kk_ zs5~L0t3JqnRJ{-Thkn2mzsY}TNlE7o#BSv7Rlf0Pva~Q~@~E$SwzsI!@C{`0g~)_& z$<hr_NB9=ga=~h_hYL}O2o5w-WD1N*?E_HcU{r)~25Aw*$(1q{CV0I~z!|);yj{&H zAj`57)NZiwzlln#SFNPlhW<)44xoH$nPjLOt2Zb7dUF0ak#J3bS;gX3ap97};uRJ* z06lyN=&LYRV4y@~!o4IYDL1Vm?L!%y73|Y7isTipuRaM!(i7s08VXEq-?dy9iu9BP zCILt|w*{YHuM8sn`o{m@J3x(6e}^;O#<K)ls-?B*Rcrlk-2#)KA9YvG9>JFAset!t z<GNM(xw$zrr!eoH;?4zmGbc}>B7Y)l%B;mjg^TEov9zFc|84(<S3lppa`nzruiZYr z-k+P3o4?`Mbqnt9++^Iz5f_u)h!3eR&|<M;Z_NpFj~b88AFJN6W!s*bQ|B3P$R=Hf z5U(_U`#PrZ+S8UQSkbw^nxGHEF^Qk+QEYq_%To1jr|_}1;w{@n(-}Kt93WfAzavO^ zbVEVP+AUc!bqd#|W^T#ig}Kvz95$c>QJgrFp(}m~vh)^7yq1Bd?2UmTJd&IF2vo{) zrA!1DiMWJt3E;BWWdKLuCMbE~FH4Zb-=M6-hR<$KWad8aw%*S6lg*np3`t2)GJ;F* zN8XN<$A8hd8O+LzoY7kknw$*!Zp1ieflr??o3wA<yt%VyP98sU=&)e~aAQCwuxa?P zVZ%m^pEP?>(TXy(w#B(KXU{KQv+cl1aEGENthE*ZaCs|gCmEp>yI90*;F7KSRK975 ztH};Z#c`50am)GhDoQMP69F6ry_jF342~?EqLL_7!vSLNK>jA4tFAU~x0M+Mr&MEy z)~!~!2``%OrkLz4AD{|*K`tp&=2bRoU|T;w?5LD9C3&Xd7vK__l2nL=DIh{NL?t;B zD~MB~PML>9GZPDRB}?d1UW!LSnz%}KE>I~T$q-KSK!k625&oNG$vVI&7D2b>m7obp z(b8pQYstl}qctV*TiJ5@DL|A;d3|tnDT#+!5@bT`CWc!HEL8yR1a3+D#@tt4QZO&q zHXA=hpN(0ID)t;dN1lT;DyVdggMT;XEWJ=TA~5@HV*f4d{1&C&-t!07-l0pVOSJbU z|IfSq)=jp+i~7m&NZllYj46YN$A|W8(dW<qXx+Lsr3-U&b7xN(k2pFbCwI<IQ)cGo z&YZ~bo=MXe6!X?DU0%9!Q|%Lf{mTc}E?lU4@Zy&@KVRNohPMe^TD<nib?aPiUISR1 z+H>;M31czH4a8+DsC4oSGC!LwqV?`ATXxli8xz;L;yY~);7T{@E@PHKuck975_UBW zP%!f;#PKM^kE<6?QOBSTW<o;S@SZ(1Bp_0xb4G;9ydgkBq%xdl8`f2l(IEh*V3+fI z_SA9TbZ`0jC(+{MU0|w5A(+YUED(ehuvCvqK%0nGk4nLsQj{0ZP>)@qD@l^lWBIA{ zbbu1U2yZX63g}M?K#V$CHUF|n!v>#N`4uU@@aISrL?zuznwvUy3ilFTfPM@`88dMj zynOCFayJG11Ar%wgDj08d;^h&+Zp$JCRUD~lDoKMCHB&S1#{=-msW07R=R|npB8~I zYBIvNZ)38xBZMe(5i5Yo(Pd(PCO^nn*+USZKqZMb%SQ#()#{;#fRcbywC_{xK18<& z6z&6n5+g@d4+SW{I^YShiFhuCb!f>6rEoKu)uiPjECnhR7A(k}F=1%`&Mg`4O_2$x z6i%gggl?Hl$Zg0;v1CfbZSbV91%%)&FuAxR0arq$BrS!w1SE+{NoDeiJc^*sTfroC zC;Un>r3MZDo2W#DhDrp^tX{)}1uT&8C7}oQV?%&SMlBHASp<qvi9Q*)0)#JCfKqu` z1*n8QAfO#oT7zGHZDslLrSqwUWVQs|l4%|>tEj3bm@tQwIEC1a(CzWFsBXiP^bdjC zA0W<uei!8*RMnBIXJjPCM$L{Fp-4AW5)daZoI75<bF;ZvK6n9&7v$#V&6zS`0x6rB zv{jv&w{T(ZlpiNeo-{RYSvhQK!=~*=?gd)DynnU!?4_Fzo<F&BdV9%&dGqGx&RM+f z`0Ypdy6Z00o}m(#nuU~214AfJtJ+Q_=xH<v`X!t{ad3OpjsvH!aC*~P>Nc(ENZm2T z?#@kr_V}UwyLax^;&SlFF)U7m4woT$HfG^Jp*eH+F4M}};Zu9}swf?z5y}a=p&X;s z;ph>N5LhCmNJC=|Z`n#RsKrYbFPIPg8{VHbVs<#mqEfJzj6e+v{0=BVkc1Lh)n8M1 zCW>)G<lch*2tA?>xBcn~{3XGYyfYq<Aj#(wm54<Q${MjZ8-&=ata<Y$jX!VjcShau zOj0G}^%S}AXh2Ep67EU-mOXp+!VJ)V;CD<bnVmO(Vg8cBqGiR%4TbW;QG{?K2;YVe z{XRfx(7><1A2sFw=j}YaqCC`Y|0msb@5xD`=|+u-OVf-Vjj_azN<<NrUWYa?bcRJ8 zs`Oq3WFbui8zO>;iglUuN8I0j-ht>jIp6*6w=}Ov9Z+W8+3$Y#v!DI2m6FSEmM7hv z>Gjodoxs&<_br+N{on;o6z=C)1U!h4OiC)zrf_agV^tD^Qm1Z)GH(X^m^I>V+)@pI zLLdj)<RlZ3G@FG<^f`J#C8!bM0f>yUq4mg8Mn4W{>SG{<>y=ovtb$^{%rD{%C`TG$ zp@1s5oU9DDD<&jh@3yZcED4mXkOiD2DoN;;d-4k_;9#2$DuFzp5@;kGQWI`PV*>HH zg`5MjQLe`dj;^F~&G1OCMVK7s<a}PJ1SIha@k#|8p!D(DwePNkqmy4=UWqpwEUAV$ zR#AtMo{*85R|YE8)X-H%Z-O4=(GQR=?xld!6Idf~I4X*Y@e7nV^;@y<s*(^6a!v}f z=|o3HMuvx;KYJ!9@QlmXKT6!$HMKh6%J(18cYE~wpGZb<ng0<V`hTL+A3qgyfrd|P zDww)yba;$vh_i}6j8a~k!2VMMO%&%NFFDtpkcj;^BqTg4n$;K)F{znZ$;e8?U&Q59 zwQ+6@jNS9=TaRuM0C00|asKvDU1n-ZYD$7Dvvv$<VZ>z`uM6=!*Ct0VGj<^DN8)s2 zOV_25v8(c#UmNOdZtWZ6=>T<<0sR5%SC*I`p4a@{l>yl=+xtMJUWz^@AgKEYD1a?# z>SSyHp$d}Jh6fxz)zgc3g~&a0h3ElTll)4m70^-v!;3Ik^-#IE@Kj7s;~YP-bL+ab zc$Wk#22FbX2A2H$2i#I11emOR&A!tCB0kL_bd$+o<p!$ZbR&sLyy!g#0Qsyz6PUwu zj4Ll=Ts$+trS-S~*ROM8e&KWA5`0PX@$%}3DOuhLOW-hhV^T7I(l2`t2CzB6m6D#B zjq^?qB~wqSaiKvc0;G525;%JF*s&uA_wU)W|8P(^0eT7n%Sg}imee$M^bU?9H_qVZ zoyR!0$i+dA0>vDSHtIF!1s^x^w<IQQq`ZxF4Bo2Fok}<^wouqRpb}mW+)7Lc3}5b3 zXB9fsqY|#WhfGS|^r0{50Rok{j_?{rj0>khT&WRrU~L`FekLS%nw9#1rTkoUrPQSO z3n%tT?xqO`ETOMClO`XN=8offoxDZ#(_{*;q;3Hc*keMH-WoXRL&%fCm1cLHkrNw) zQxRuB#F!FbB#07H8CHoT38-XNGGn*M(mO;Y<ZKcHSm9R1A^>Je6zo&V;@ixuT;E0M zq=-pKN+Oc7Dyab{ngk+Qu&{I`xdzafe8mMC*(Iupv6SNc?DT}la8hheoe1DmIB-6% zV+<Du_A_Og5YElMv?th*{z>;ANeT7mE%PN|(n>BI$w@4{efVJMJ~pLW)JAjy^&G!5 zgH$;^F*@AWSgoZJCB;;yrQS4Ge0+RV$hjCdXG3CQa+WtYB{Cv9;zC$#Ze2g*XX>6G z@m@W+MQX*=t$VYRmufN+6B85S;&a=k79Ow#?#9ilSMj)TmX43~Q*I$>)-f2;*wo(5 zB1+uC)8l>3ZG9s*lqxQg#JC<I2ej`<UYQ=hGDu$#Pq?jeWqIW&hNUSO7Ig)EL;lx8 z{at9`I`Dt9AX;h?Nn^@G8R{oo42`J|i&QHKH4LIV4j73`xw%;xo}{?&pd(Vfg&sm0 zo2Fes6LF|jSaII*vnRXV>s-hX&45O5#m~_fc`@zDzEu=U1W90|!?4J1W$$rIhTu?& z)_z3T7|#QqUKnIp;_~4KR=)8=z$8FPu*A}{k3L@a6@w{1F?T}V2^OV2d-wdZ_t!%K zO6yF|%+2!_F_Fo2vnbz#wjX%n1SIJ=pmdb2xoigi`R9E{f@9q|(jzjk#1@oR)Hb*G z4h&!A)Kve4zw?j4rUm#b{@U9h4yre08)gChMd{|$nZ1PqzzC9L0C*FuiK?8xtj*Ob zEu7s0#05w?64_<-68Iy4VhJYvNvPD@g9O+`CEnKDPH7J=QI9tYmP8LEEOAN}dGmPM zQNhJ&KzGafPu9FIwgf6+>o#2ps)X!=vxpI9O_=~a8?6LZ&&{j=AQ2E{oJn6Gb4i%B zLY6idSrT3Pl52vj0D1r%a->H>4+)1pAz(7G+dygUns-K)>Ig=vyl5jO(*K#W1z)JS zbFy-Z%At{kd3m(nyalKd`FT0nR@$lGhR$7DQUtlMcTt)s{R%1jn9v223K<EFr>GC$ z;<R`7j_uoa9#5(t!X(R8MGw8kOQ_&*O{(XQ#0_YWboAe7u>C(7(x2S`(0fKQk`lKc zu(FNGONK7h^wMRHGw5<JT&a{ao1)^P(vtji8vHR4=fab6i@XJSSviHiB2P3;xX{qp z+=d~VEwc}vIseSFg&SkT1dPCkdTX<jU8Ef*`}%G!EzZqyGIJ*DxQ-c$I30v%JdJAP zcXYG-0%W{$sc&#>nr<X>D_o$Z{xeLxB(M36s}QU%ly05UtOB~Mv^W_DZr!+rk&?yX zlO|TlrNn_y(NEL~uK6KMsw@NV1(dKHAeUp)Yi^*Miodmz2ZqZFj29PSLS)GCz2AQR zfkS1$4Tl5$D;m8CPDYgkMAEwrc=TO-v%Lmt^e!K~21@>)Z<U)lH4Vr7(8L?k-f#xk z<OFodWK}B>*oOcXIsZJ>n}L#^j_hUn=KCExe+FH4Q@G)q+_!J<p1mr}&POMvgEEC0 zJm7>ZE6j4oT?o`#O3j`CN{0>-gtBwT&iw)B6Fgqr0ht+GeUT(8YE)T|OwmmMjh5I< z$kxD>2pnaAX+DU@Q}3AsAuzIa@hGJCxQbw@w8xrFy3<&ku)s>`?#E|uSk$WkO0cO{ z2aPzDaAHgvE9z7nH4_xrl`sg@;pC`R-vxG{fl@+papPp9r^JT`9VBDvQ&uNybFw6V z^D3EtQY6!<eF;wzL(*SC5q?v>(fguH`U=fBEAFH$QNe*_!Xk$k8T|M`NGwTU^u{4n za%82oAFcWDU7?a%Z3^tBnytg~4%Zh>m$RfKFDI|4j3_)xbP70?w_IiOyoI7l++Pgi zLM;rG$|Q1YK(3J6(Wzr@C!K3?@bQEDcJCr#nPu=>f7l=HyEG=v5H~l^LIyo};2%7E zxa_3UzI^)d-rR$?j!J$?1M<Ci0q{NMeA9YcX24<D%<FT8X))5}OYL>#dde0S(T((G z5O=_!Nvx;1vXZBANqLnoJB|YG!iCtprYkV@yNiBQda-zOob4r=#Jtp8ih7#h%55B- zCD9Jc3xQyFxQO1qIXQxLyG;fo`YV_o31Vm?a-<uyxq4IGKtPH3O@#(Odi)r(0bFQ` z!8mo_db_otY=D^)0)PahxUJ^t(#>3BmW2YXLzx(gxx6$$@kRp<O$n2X&i-yHJ5UL~ zdQ&~&d|ZM-UT~MkD3{o8tlmL~wr!w_gBcmP@a9br`r{)%Jm{7>43!*Ua=umkNK}cJ zH!@806Z~K$;PQX>$~*jfhDtogRxbUvV}t5IqZNore7h<*BqdY3k(55)`0e(e_a8WP zfMs!jksY#g3zcG$a7Y%ZMXc63te4QcAhD#QN7+h=ztT`?`}Us?o{CJ(DUgE7!Fla1 zDDu@bbq!s+HHY9yvHxI6*G=x{IZY$UASqY^m5`q>D3NsoPm(k~&!Hv?o7$b*a1l~G z(=gH=MgYm(n3SX}p>U&j%d&)V2|%*1@dfM~bZ0dT2T^Lkuq2{nofn>Fuy>w#>}W~V z9OLfqHhzw$lzYqWE?Jd6{*(d^4G2^+s$`wFErKBxYeFZ1(F!UVYtm;OcYvXiyaDRM zi7FW&88lh>ChlaCw;_`dihoLh0mhZy9V)3U#MDAP4P=3mvhWlQP+3t1NuYAe%gxTs zhbq~7jGAZ{3hFqWw?bW#;7YtJCnal5&=);vZuWS`MueUXJof8u#hY$rSc!JP)_<JJ z?HHj4$0XN063Rn%ELjNK!)Hzg?aSr)dHE9G*5St^ejL-hyu5lvWbKnjGF+o?!^jEw zze+Ri`ZO`MgO@rQ*+MQ~Rw1dgIqu{Xcuz`>k6hZuI{J~moY=5X+HmpS=3$oX++Oh4 zhOd@xPY!EM06TX2noILCJbASPH|Q&?&rFn)&<Q8@*x)6`Kbjgb7}bCe7&VJ?atdoY zhQ@AkS})FnNy4K?{2}XZ$xw;C1lobc<(6fxmUS<cO7aEcd!+MTqeX|9tx*OT73VxN zy@NQFnCwAg1(amg1F_nbY0_8+94c9zi%F5LzgU;BR7RaYw!;rgE12;I5dG<UfR91X zDt-x99HGeJO9oD>Uv&VF&xt|#zfrf~&`+{M1sau^HM{Nl4<u>C#K9z?5{JkVni8P2 z>AQdIJB(HoaP;s&An8}Y$%agXN>O;pI72JtLnMC6SCr)nKNE1|Fn_?Lg9i^D_!X|S zecO(`0q0#A`9*rhYyF8kEe(OGthQr#ihEb_@+3Lq?Ol@j_BP=*TnxaRTP7cA(1a0h zl5jYv_q3jQ7FeR6Yrw^Z6Rjm>%)5_A5B$+%fx^dwDSAY!R96|jm=xZlU9fnTb;w64 z8)c<}%k1jUrIP0rK1#OQgaqvQe$yAo-2x@cdXw7yiDV^A6_Vprz=;W&6~MTXF()CE z0hAb%_!74fQ<B~dS@MGt5M<co)NhWSWT?a^R``<nyFV2uef$y5gb&^kSt8Vpu?4Q* zbcX~>NN!fgRYR9#UCPem#j67YB}%u<NgS+Sa0YZ`4JhO^FOov;P9(wpOb~V3f&II7 z{IHc^Q+{vF32xf5?PyZtFxPtI+NH-!JmhS@zCCkqad}1i!6&`??%RSU{hZ%HJsjg& zu(V7gZgFAG0^sqUaPAQ4g*Z71Dz(;ES{{O)vfdo_V&vuI6!>cD$qJ<ID)mI3XOq~u z#G>XQqEK%yIKywhKYw`lI<qS9nc?w?!H(*Ri!DPpIY(*m%}Fl>U+&z&OgS<La}g}n zn&ZNk;|dRT6}F7rxVyl$d4c4DhoomNvzyoG98v{X*^gLs=@OyeC`1E8Lqnri#$<}& zd81C^bw<+r)o#|MxU;jb3l(EPk(E3fkXWf103^x-O{{mAvx$zg_Rqj}d6m!gHzhGH z?D&oiYgCRI+E96k0MUx)^?%?^4k@y)>f3bqqvU`ZiAM%E4x~B2!>9D(2PON+J~ntl zby6D+DkMEy&o-?D7AV<&LO<tktY`EyrH?<~^uw-S1A<tZ^xN@chkq3&5l^{q?_LJq zemftL2-MI=tzykZO;t@*Nv=EkOu%7C62Nqb0`343=Poi({&6rUiZ+~>NN#2tiA!-f z3Nni7I)|pIrwNg`Pe3y-oTnP=CaFY3XvP}I>etM2MZIsJge`6M9{n3<pb1Wej{t#y z1V3F(z@1C1d`0Q*M%AW*>*?v&kRsz(yyBtj@71HD4MNhCnkeEBcj-AH&#H>kniCqQ zEIRQd$6h$O??;x_tl=&)vScR8Pb}-rsozLcvg8t@Mu3yB2=K9j&iIkBCw(lCa==L= zC+pV}$|L|1Vd8y!0eqmQ8+gR$z$CpRsw4#TS8!|iU%Vq!g5lE{s&hiQ9jpeP>X@>n z2|$k`L))|nQvj4QbMw70C1fM062%&lVhIaAi;LtNU_VS!%=w^z1ABfU+LTZn;<%ha z8?_*Dn0~)MvTBf-31URZq<u*L8^_whL;n!je;<ZkI@IdF{SCjrByO9r6Oso+mX;sE zGic~iSKXK*Kzm|>sCebADMw8MG|ICpl+aL9PL1lT1g~qWN;4C}FI)%>jY#*kUA~4( z?&cx{3^o15^1N);Z5{oi#5;4Q4NtO8<=zYqa)xZt*0plrI`~IQZU+}c{NoY~@{>aY z17iw1#%;XhE^Qy%<-0`K_+u1#3cy>~!Ur$ws!E-v&;at4cp1NW9j#k616+yK1;c|> z0-Wm%RdI$Rq6(E%Bv8L;2oxQh`MVxAkEuF<E0xhO<uL?$bMY>vr@F!ec6=%4l7WVC z90!-gQ5<M7bXa-c;7e87s&pjABO>&_mFjJ<1W5V66YLU~5?t9$giR)X>r>p;=#~B< z2ZBV2(6oW4KmIufmi|Vc&Y03SKkhzs66@Hx;Gh#nSi=PUIRG?K!5s=XbuKzNBabw~ z8rW!U9iH~Ge0N;Pak9R--N8frq3qMLyzjT~J$^nZR}!dTDK$PiGAt}I!Bf=GKRI)s zSgs{d35PH7Itz0P)YE_seK%^k8`Bz|oV$ZG%GHE@7+Aq)HDk$zNF|(HOH<bwf*YZN z>+9js;Xp$Im?U)@PVt}`C=E&e>*FzMV+B)VBW(+UAaGF9Z~~IVmH4a6h(O7cg514- z`{wnZtW^Q09^BfsYv3%OIO!v1^^yq{A|yJb7vYkqlfBEQ(YuW%QN5U1l?ZRB63UWU z0{|qa*}z9C-0+HnNcbtOh69z<h5G^-%iKzml|Fd?-JlW_pDdw<MvF8TSz?JN#7Qk| znsX&yM&q(6yK{4yG+|brSS83(3C36&7!*6jg@6^qbM6#Z^o1Zsuvy=Qh_q#k{n~7H zF`mR7vw8FPzXTWeO|h4aC!IEr&~{pS^yI}Kh1P!?Xa0X~s3lF$A2avM3OdpQ=)+-B zWcZFQ)(j)L#F&l&OylGt^%A&NSH;9%F@m?RqPD52-iL*)h;WySWw|L)p<&@ME>BT) zYu^=MY<iwhT-2&(kLGV&>0?vCAffZu#wKuQl8QTdxr_9{zUy}vm;uI@gqw1BfQDHc z%`hs9va+n$(*dVbDtae~*X8s^Ut4|%k6T`*g40T;dwkE;5m*mmsU(Pjeq;)E9*&Hm zaBy9o!}>inIWjoNq!sy1a^%r;<5H|noC*Wp>!YwkVWkU)uegKjaT8hJz!Itp*A*@+ zJRLo0DG6Z#JHPo9Tr$%0TIsa{EU&*c3S}U)nlK=o0b%sr20wxuK@W#s36x&DiQQPY zQ%}wknO^@F4W0aj+X^mO{br()%D1n6*nQ;Gg~%wjO`Z*ek{>z%G9B2zf8YN7hcHpb zr(!=UXTyc)KT>IBah5AA@bG@*rvrzMYKiBs``LW?!?!=|I&{XBUF4$yUE-CmiA~>U z!xOTr+lQ4nN)1OG1obrC2fK;^M;gb4Ch^AhVk|7&TafG|C;03vWQnDNT<X+=!`aOa zWF~W|;QA=rc-7qnOM>$9P!2L{t^Hbqy6EVFLIu}k@f;0}a#5n6(0&7$oC=Q12*j4= zQ<^LMw_kT`+3<-<CsE2ZYn%`hI+vf*gG05}^UXks3Xa17Nv~9|IoPB(4qRCc_mvI8 znPW-Sn;E%5qE&^-_>p*$7?Z=5X!rq3AFTxv>5;x0RFW$ggK%?eb0aaGa7YR{=Bm(T zxqoUZOY@Z^;7QLAY06>%4&epclFB(&k!65K=)3ILIv;%M=&!q3*!m3#<*L~jMs{Aw z_|6@)dCPY@Ph@sX-lnPnmmtX?h2~4%@c}A5V@CiKM99RmUQ=dvDj`tbVEGaIab$B; z8&~19*bQNT>`AC?YHzM8%=TpFlc7+S>55?bBqgVW)LKlCm#<9TS$O#5`O_y4?_Iyr z#Yxq{B-`Zp#C5Krb5obws)`B5s~+M6hu`xLX`=uI6{w`t&XU5k@WA6?IgOVQSJ8;% zQeuDSBZ*3&k^-M*wQ`sL6vt(xYh-Z*btjDySIwPSF}<tWKRt8>QB_dH8O}4HUp+WV z2i1OXEI!pmw3Ffr5SN^wdX)x@RdceF4sNg%xc^5>g9AbQ7$Nqu0t+hWRuA3<YXm_4 zo7(sAz8&IQcKiV~eBMxL^%nNA!;=I|egIqj2i|;#e@>nN5h#kgk3QS@-R>hnp)m>Z z@v-6fBaa<E3|l&IP-WbKBPY&;CAif%CJB#8S385t3*1p>0`{}tn-n+>?QPn%{rj!o zZr^_@F0-gy8HGjp>50+jPn`@5j&PSW_D|lqPd%+m1ncH`4{b@&T&UUT*^;ysol3)I zfe;*9Hpn%?@|N$+U^GF3nxe%!hLu&Sk$4i!6~j_588bXk2#{P$hG|UT!RPwHSA<H^ zl~^Oh*ojcde8_lhKqg+00?ovb6nXmaF4p_~8!E{|>BQnvmRQ%#bS0uogh$S6V@mo+ z!jeIg6?e8!KqVYgC(a@GSvee!fay$pO3`qi14=8Xq)PkUz!JV-ID(Uh%XzEzBoNhN z>JqSB!8jZKtvI~SDd`k*G6&@5W@MxhG8z*ViD&zK$mtWu4(;E)^T+SDY}%;b%?zd* zTn3#q)ucOuv8Hc#98PE$wTw4l>Csbm%f2l{`mcTvnFGu0)0K?8tScYGw3>913Lp+c zY2{?mvB+6g$L6M5ghqz>Y8u+xE;4$O=*}&v@MR`MghwT2m$IL#p|OJz*s<xm3lASJ z-kTZkX{e~EtZnNd)oyrnniP_2-PQT@-4jy1o!8Mq8K}ay2`YgMDwZ!+l@;c=&Ye7! zP}Vheg9>hb0d19>Ce&^#<FvzWevb6;$uXhQWoo}}yxny9h{&C|dW{~C$*Pm%pc1Q^ zbkzllDCLkT2H5Ka@dK5lEP+dKB{G-#P%qk59?;;SLa5Su6qYvSVO%0;DEw@|j;}s? zPf+p)D!l<luVaN6kg76p#vn@H<Ip6l;6NpsaCRf1*9uPQ=Jt{QrZQB@R>{vXPWAe~ zu=2h^Bd?I0gi32Z-SF+s!>2-H5>t{A<3J?@??aNXsml&Pg-)Cak5A7lCWIcUgct!Z zacAea!hSoncaLxhUL{oe$2R!<k9z`RGKwo}u}hQ|GLe7b)Nx#xuDsgbv0Dpjgf1(W z%MLvpN;qM15j9)0h_gsZ3kwSmpu!Tm@tXl$NQmM}^if2?xuU3!Rsvr?HULN~1`k|h z*f$_b!%!(49L8$tM~D;fyn_tj3!v3hRmqFB5qTw90jEt?X0o!ozu)+oSp)n{ILY0z zc0*?L#9Mj3sfKeXk)D5mk)aizbw2V7-e43_Fe>0U-asWd64VGFQZ2VaqQ2x`QQn&> zI2sZvB;OG#)i<_vF@@9G(oP7yvL~C^^}|9qk`1*dw}vi8T5L%0ncxc%G3@(GPjfR< zp=s>klZc3-&U>^9p5@B?ZW^B97g423@n)pSuo+MyJ@BV}VP*ZK3f;MP|IzZhuG}2J zL;8U#J$iz=&IWG9crU?~&;>B%q7vZLWtkuw+_bz)Vco1XZEI<`$eDnHtEIiZASpH` zJ~g+bBr7o{GB&NS+6DsZSztRja-9WpcWw?f7DF1nzWP?yD)skYy)$>Ct0XNxju01D zUgr&~;P41sBmAwWucuvVcXhcpEh_j_SXRU3DGdoDb#wA_W#(Xvm=+vnnR!ZvYoluN z(^kWcr(`OzI-5Gtv*RXO6-Wwbads1cj-g5VDS>k1WDUq9gRay?-O$xdmOyWxg_?*! zC{~xNF->P{K$$;}Oz&MAt%!RAAzq_PD?njySJA}}K710@2sB#ZN)9I3&w34&048CX zQ@okc8&LY=N4)V*I3K8b6Ic41T67<L{N>gi2Y$N{o1E_Pq{K#?JI&T|@t-4r(!m3V zkDdsQNXYOOmy=nj&J9oW7HYV{tc3G~;r{%K-$n4t&$MB_1(kk_%_yp*HK}tvB{uX- zV8F?<G1=8!W3%(@Cw11|(1B31m`jVo0d%)>P_1!cgX2<sb2gFMbr;K-Vy`%-n1Q>h z-J_!xVxkrtIagHEoE=bD=5sO7@@NeYj}n5&XZrfP+elYxYHDuOzzGo$3@vg1OA1qT zT5+XiN(M@ewMjUv0pNiZaQ=xCns5j{erJGcw68arg2cN9O1$DwZKsSpK8aPpk)M#A zc&1YOtzRdDw+Im^q<W3F{7Cx{yjyP|1toh;>qc~^EAcK$I09L552Lpsmg0u*B#xEU z3!NQ|<*>_}JF423?}<9TZ};9`kDLrvAp5!CQzwocKCtiSe{9Ey#6<_5_|=B>Us`IE zMRW?Zu}&B)ac6KRZP`kk>9;@Z4#{g9yG^L<J6DrdN!ag1HfaU-BjAWCX$h2I#!OeX zSz@};p)uidiij?e9H@&IWn5FeHa*rhwbd89Bf}zH8701arpsNP!V27`Rpqq}jOPzs z9-qE3HE=N}F)ltaJ-@Q4o%?NI;^uTuNos6#tSf=&fZ^MaGVLtCu3$-JLpIme;RVZf zT{wN-UD-Q9EG8WvY{Y<)c0WBM)%WT0L;e5mftgcWb8&bJlu(t%#wOVYcf)e*$<8G1 zaD146w;|4P_C1YqqK}O5-uN{JYA*Lvy)hBm3s2%;>j@@sSz>@i=`G4f0G22W=sB~v zFXqDWozlEjnEBD+kFw2q&tCi4i=m5OFmecy*wX)!huePuT>Kn92@`UDCZEuIeBBf! zRuK4gC2r;aC!M!+<oy4(ya7g(j46He#pdn%j-QLhl9c61krEUbaO}vD!v_w~UORN? z*zr^6BAL2{&!UVXkm5*GYEe~zC-(H=J-al(yJzn&S_aON@U1`YJr(OIkx{R<yeKa% zA)L^Yz_ZaARb6AZ79VK?q5f()yoGaFvWWvqyk;_G4mbWH8|kUFk(5~IH3vMwl`tz^ z!yij$f;<^|4_s8}v!N(aQxl>kHyIZYc=a%s6kSNVBxq_gbz`eUB~Gv^rYso#s!&os zz{De^IFJ0Sw1f*Mel}|W!zTDnQM=cgHDHx1DLxpw1WmGLn;bckwFOAdp)HkaJqenu zl;cA)QsSg^z{k+YFC_6k6zoe$;essd%Y90;5?pERnl)>&wEq2_RB+8K>&DL_SfZ=k z-3c(^LGI{ifibDvt*<FB%!oLM>*$B=yD;@1I$+!gI3j1l1bi40|6gZ5Ms6-ZRllD2 zk~Y79Nt-tVNn5}Dap#eklJ3d5`#kqnQRAJzgY-jbgbiV7X%Va9Jcp%K++`~N7JOq| zDL6<rycrcWp}F4M*-HC{*x8n*itKp2lqtC--i#zyVn$JUc~x}<jmO$1LXQTR2)~%) zii(U(aA%iXWGzg`rHSd`>a;lK)?F@-ulG7vP)VVjtpxB64fGK2RbN$_=Z*>vP4RV% z5tan`N9tzL?^ED&nV53O5?l$Lf`Z`&73L_uNFfiKzsDx1-{hmb#RwfEpcB*r2;e{x zLoe$3jB<@85`0RL-xLi>&XBAjS*cs=qX|6ZatsefF(lQYNLH9!le}H=;U{RtF=*ld z1ZePD5ANS^%8<wq$Dl{>V|Zhb!z<y8P{{d$zUV*rn!-*%BrwVTIyZh@y7K>PyaAB} zOBg7r-`0M*Y1`g_vr(?J%-n2(52C^po`gg42rHJ3961_r{B&q+a%MqUwSiItj|V-i zw$^&6X++=w_U&%p$&R_5a`h5*x#QQ<3E4g+)L-;5NFJxzsGyLTtjf-@oA)0*dB%tm z!KgeY5+jk8xV$i`Yfed2ZMc$VgqA=hr3)YmaNMQHyUz83cv0d4bSe!Z^Kng)KcH9D z9E?}j4#=%8BC@>lHKhSkq~Hx8iIRPbl-T6}6O;0l&TF+OD7UlI<IiJQ`ijj8QoGT* zQM;+7Ff7@0u4yNTCL#hVQH&?CDOae(6Oq4s!Adw_Nw=_%)F;<-l@g93Zlz{J_BMgr zDeH_v38A1${sQi!wQ?um-*^|W1RrW{6IW{Q#1hj(w}zgaS?@%e*aB2vRh$*Rk5GvX zn^+{VP3(yF8oveqNiYaX2Ox>oX==|t@h_+(Nl9BNw(mU=>1`Umx$x-OTb_6OuaNE4 z^CuX(A5ju9T?XYwRHA8um~)pQ0V3BZZ7vP5VV=whpowBmC(5O+Hbnor`sS941*vh- zaY<Q)1vzO+$(e<krYZGi=ap$4B%9Zo3X-BDqhjKcGrZ8K#*TrBiS7a>;gI1xzV2&? zOsp&blhCH8C$0>3Bkk1q@EczUi7RLu!a4v#sufAd6fMH1P^A~hU<j-WTAD}PD&IB= zlLL`P2}EIdkKi$D1Q}J5+O4mRV^k;4N2)zN#c^9i(BIGXnKqB$iE55VwVh}&K&gS! zT-$wQ5-6hStZ@dcuQ&vL(DaG_@UxYb5ACf1mEn~>6wa)Gm|>0(heM^Dz9d+(n;AIy zzrk)GuC#LKrjVom0+l2wQNXSFWc~NMkDiHirDf;i$kyz@`7`7JkWF&*7)QYIKzeBD zh=4pc^4&F(`l$<Sb7Og4QkY<gg}ghq@AzpO>n*qawEO7!lsq46>>KLJ3$on_5n&-` z&xX2kt2*IIWDw#e;SgaGDp68vDL-zEjiK_w+&Nu$(x#W}^)3H+OwI36q@2W5Le z(1YS9cL1O?Y~|Z1qLR4M70Pp6HV~F@21qoq2AoVe#8Ki|5^1Uinab(ODR;$n;rQO~ z$ue0%r4QAEGi6D_k_o!VCWcA^AR&+yZIX8}0f;W?bJCprsuQ=NOYR3H;gVp<Ddl(` zi(jaSTfrth*IBwGSxH7$iQRvH@9mdxZ3?h&rG#s5Bb|r2D}yC^Hfk!H%+y$2nialh z1Jb)Cl4_P46h&W?>cwlpkzRP;4#{ptmc*8H7r~V%;C|eB@N8mX%jN02OMj81gmaRV z6qa3bQo*$CT6X6SC)RB!x1x-Q)b6auZP(a|8HiJ7@bb_I9a|2B0Q~MXb&W0cr5P-P zOUlgmk`~2vxTJ`7NM?#Vr;M|Ov%fqePN2kMrd(fDZ378X!%f+-0wuSv>zY82b}_VO zdJ1?M8SHLrsPcI;lOoPVWYi8`W7Y(GR2Jv5{+~~Ynj#DMDLb2(?Ik=~aT$2>fEo_0 z!a^XH>gkwf<Jbg}*x(Q_1Xd9<Hc5duF+Oh03Hy~44cgB_C3?~tYT$z0!V?yso`xPP zIlv_*i+GMJ896cR;MPxVR##y19}X}{hrTM@5j5#tutj(yM8dShq0j3}_I10Zy{|8s z#=Qbc(v|q~pJ5<BSLK_w^uG80-#`3#-R7N#PKCSNSzabGu^71`FPuGf;v~u3cAPkQ z=0a2={_HB`8IZRTRI<g8?d^4C*@@T#_U+QnZ><8?SnvLm5uSpIx+VnXilW?fRz`$g z2#riBxY#wym6IJ5EZTYTRNR#lNKKN3d&ovK8c>&RYdO3^XBL=GpnUUlr8!P60tWEE z(U@SBHzl0YY6E-F22lvFTpmWh909a+t&y;V)mx~9Zv$9@#7go5ia;e^>zx{2RnUOJ z$&u*_J+b!(%-x1cAM)Cq@Y1_Ao{M1#NtY%QMoO#OM3yYAgy*5&@)aOUPsvSRYY4>- zP{}Fbpjuy|4D(~;05D84=A_EU;ED#EP>B+be^ICeSK_gG`>4c1D$Z8s74UKOfb8Vn z_mC*uM?bl@x09_IEse}tMDE|ne+5&75E))%|1+vfKNx+gd>0VZkV%+r=xQ~b?g3<_ z@3!p@h|H|)xI8txu)O^Izalqp?Q6gP^Cf2#TX;<tVD^JJ+G#FhSEr^~){FJ+_Go)G zLAQCu70sH}kduVfD-`;?-_f8nmfFU~>f9ukE7`-QrA&7UsHAa}3|FihtDfS33zB0M zz!aU3nq68^)7U*aIar$+3s-U%cV3%+xC9~72syjo*d+!kHD4?*$V_6+H?5M5mkcT2 zo5QU~ASc_)c@i+GjIi|bDfR`8s<Tv6Jd0(m#55sB;8z-DtX-oI+H?;y8pZ7mXiZM= z^TDM_0yI?WvGNk16ZHaANn$IHFP9&R1ca7my3oLqo$pn+br_7pBb%F-myr~<fAh!K zDRnpn+zN#;&@f5Klpfixbuhu^haLH|fhKFI88jIt37MFeTfryYM7Bw8<>XOHVDfk1 zR+J?DSm%d3=m#cQP{0Qteg5^1Ur*Bcrw@!zE<cNPz@Z^$PFcKU!0{8uPX?WfpfOQY zRs|+ualwGsq%EKF<JI|c6C=-_IJEEQ9ov8U0iv|yAA61l$7hvPlTVLGQIbRGPFQ$o zL_&I5W8c_KylBr@K*(MTc3V7QYwGf2Yu%DejQ`fLc58Hz5{~A{Y6Uk>Va?7_%L{<U zq6H4AP#YSg`+#o}+5|!38Y0rm1x6z&JWN=b#0sc3HCItv%@iD<1ULzqh<boD0ZSFQ zJw2|l<0LFm!L1P@;a74Ja(Qm@40PmfU`dq7tV#l<jSwM2B$aV|X@j5&Sp`tC7rTjI z3G4xVj33!6hcLmC>?<4i9D=%@{3a`5S29$B#lC%5>OcW)1%~9A=u!d|6Y8{XdV!|C z9)t+d%5tyk*w>#^x~f2P2%PQ(QeAlM$0FS;)N#&j09t+-p^{LWt%6&(?Fn>|+da(C z7aee|bbQx`yaMtB$P_@>8_hClG)$ubJUnZsNu!<YtI5ttXZ|UpsHR=htUV0g(<tF? z=xiwWW@ULRYa8ne(+M(RM9Q0;1~?Uv)l!`8ig0DxTzYYSD&4k(=$M4moYIQA*8Yj< zf$AJ^EVZy>YVq;n!W}ktGy6LVjTs*uxdc@z%uJ4naOGEbkCB|P$N-$$Z%Zr$fANIM z_V*Xs48HvEK4k%oLY7j^-MvZM?J6|^73O6&eUci@!C3kf&U7aEP@9<MV;({?5%{k_ zDo_c<30VW)Cx5ZY-I@m`jGYIZ;S)J!p-rmfAWWp2a1`Xb&+plQ;_U|pI$tXY0Z6G4 zrdkS&fVP8B;z*hm5n*!h$r(ElT{2)=Wl~0(#HWNwl9N`VmPD9<D*wNypZCXM@F%Jy zRI=%}ANK{Ei%nsm1fLb#20ckJ5uqW$L8l0G1C>sm3ce7Xl#y3jtrT<WA#o)xxcEnb zrTPl5Co%HOZ%42N{6tXP&fN!2MI?EBwYY~HYkh?|<V}S~MZ_d#`&tIC&E0>D>6ZTO z@6TU81E16wefWr?pL9{wKE%K~)N9P}k}iNfO&1r`0dyq@E)N54C9sEdB~$^}w;FEF z#ZG(2)b1UjLkC%sT!8x2k9VVkC!&NU<ZfVzP(d--N*n^95++_AC1Mowvy#J|3JzJx z#^Asule?uXnWBrH3okOdBuG+q#)p88TH?G|Jtt5SP2#Oy>?Y_+rY!Nyb(C#T2!iAg z483PxF!BLaB6CIs9OHNz40`Kise^HHh1Fx_>crtf_6r?M-AkRwN*I>gIfE;TJ)wKI zZXoamShB)RDm<WM2rXpdlW-+_fhvjp36wOz3}_Q#y8YMS<dUYI%j4H>%<_QSsK&d7 zrGNgDlgXS)j~?8=dyD!B{|F(qTs(V7(it6}8fh!dkUKOz&6DqI<SXqgFVZrc?#{;2 ztQ4@wTV7XRk)4v1;>pM(m?bGK+v_FSJSREY<-t$Nk?%=ngbLF@N^V(AQ_sZA)t)Mr zHbuMgn<wU%?$6y~i7Ji*Q5u{9Oxl&?rNqT17d6qWqyJ20AO|t_PEbk9Ta;|@;>9ur zr!5m^k`A)P)z<_g`IWA+|8QagPDFg(wMp_*sO?CDv+P_ziQ<8RZq#%QV|^46hDzOJ z3s9xY0@5NgS{+YZt~pc;RhII{h)ucAn|x;H`VUvY$jAyDM%cvRjP0vKFEQag125CN z6%<Dq#$ja0iZsI-!IdAH9M<GiZ|c2q*lVZMGc0l#lJl<p(+(oN_ntFof~WiNnaCu8 z5;K@2S&#}J8FnuCbP#k&x!h-ImZlRqQ{8~bjW1ZiQyq$;rT^H`)>v7Ro0b@LA?O$; zO7?y44LBE{QBYYg+wetD34a;8cwFfPRUJduW>CAII!kp3Z+`LesWNbwpClu6R^*jR z4vtF!#}$QmQ@Xlx2!L5USUfIlkVEaJY0AMvuXdcoCFIKy<}Ou_BLGTQqR6xGH)T<> zhR_yiIkWLqvQbvjTA_fe;UNN?%1a7!lEYBDH?FGP@Fh?QX$i-Y%mLtuTsc;+sf1I- z=7%IcX>cW|lC)&Xl0%lb5#MBoAAA5NBNkuc769i|zX4FR*;OVv<r^(HjpA`CynU`j zEDsyX*ci=#0xV(R65FP+2pcNt3Eb65m%OH;C_Uo%-XAt<T=<XjjeA0XB$yH+*<V$7 z4k(E#!56<F#Pr8qM?*aoEtiHB_BSiB``sgw{ss1>JmYjClVYCfSPjSGbdcJM5u2qU zqk}Ca9#3|zwl}6{mo@TirLbq&V|!~uMOI=Q3x7R@RdqF9MmODBYLc3mnn}oEaj`c& z&XqwnkAhv;r02m<n&`>%)prixxOJtaB%N@9$W(8`<r`RB7-oZ|>*(!htS&=VW!XS+ z>y>FHY?;V?WM1wkFSNYe?iOvmd!}+hEgpO_2vY<>Qv@=@Foub8651r!5>W@lFVKhM z1eddt&K%(f(^C^X3q+UX2}LO5YHW^grm(u0JV8}ON3`Y9ZF<(qR#_u=mJiqH#cE%k zD{%X|HDW@}0Wj!&5f=Uuxdue&(79+emtaR+M{G%`B+*C;lRoD^tblV~39y{v&2WiV z{#)v2t)i0s>-=~*C&iP<=>Fu3P2cZ6jHu*ckp)wH$`=Gk;vz%O1(PZmc<R)dkn<7o zDH+~Uc80+UVIE59<N`!bp5MKrqp_}{*bBe9@LRxveS7yG4UTc=Yh^|QlZoYpIXDgC zXj){KHuQ{4&#DKfcvLPD%m%!mh{J#@6PY@yXx+2AX3#q20YqBDx^&-m+E8`h&;p+c zrw1oZdsO`gsyKlZprlI(xCClJrHn$!`U)zwfl4?jX+&Hk7|^675)X)ig(=aLlK@^; zoRbuGoaAl?l{9YxC^@JEK@ciIYJ@IQkqnif1z!n|j4FvVIej=iFCD#GqBl1cbm?$V zNv_Ft01`|IOme=UuUMyDMH0RM4#*OACC-Jn&6U6%1SN6|=|o9S>36c9bqcH4)mNM9 zIC0Co?(k#V)(evaL*hwdO2(G_;ADIW*m6*b5>-qIq5JzC`+tkct?3})m2e=cmIr^G zSxK`dOyDoxBjcL=B7_^&(AVJNQ{UW%v8~0&YR=p|jf|(}R%s=+=yH8SZFzoDOms9G z=?OBaEzL+yOiIfjI5{aPJ-4u+sDyM3Huq>{xjQ}Glbu5y$ll8Grc2{Dul7`C#)X~@ zJ|7Y7F24kvTpdBH6B;zvSC{3}&yG#V^tBA%m?g`FX@<v~@5{?t4(#88N94+LT$G&u zi}(X%WMEyT5)df_snviZE7?eD<#WU$3auutvd;DTw4jNO9S1RVBSYj;TF?@zH&0Dj zDp~OZUt+RB{V8^$I2%&x2t?pMVXGYf!`#?o-+lIhpvV}LC=!1Sl}z7xPv@aSmR4ZI z0US^X#L*u^C8<SzWD;<JSp1cwWT@njB||3C<2dy1ymr_>$v>;s+lOn{eEj(aMsfkA zcoLDA4ll33?p*B6awo<`z?ROOK6UzZNN9LWvL~mcyp~^$c|(%!)JmobFj(rA98u5w zlqV@#Chikwqf>LRP*TP=(iJUafWZ}?;7apWwhoNny!YTSDj!3RzyD5tGuzqqD1l0g zix~0eX0W=69W5^L0508Mz#PCL=EVn8-Ly=nCZ~i-EQqFT!)K4pTf|Amd<4Hycobh1 zP-)^sWNDzEzPBnk$ZIQ)4fUE(2{j1=rA}7|mqeBfl~$YqP6_8nB^54$rBzfCO;TwF z5AtJ<sFFUWvV$r~?p=AU8qP2YR8j$lf~0CkhqNXRiaRObsNMGL_oLDp10^mVZyA>G z18_;9_O{*h!^7Y<?Mqd1z3g2TDnTz8M`@_^Wkny|`lVl2GDtE^Lh)XqN~+^%)B#Hn zNq$N00+t8<_)9>zr?jzqfXEO+IBw0{TYCKexn~mE^FKVe#y!E$y)b`$q_4e6i#{}i z&ELwJIs*8cD;b*4%FD}1Pf5-6HL$mwVn(NYVLH1tV`AeIGm%59a#$^poaP~oC^3zt zx!&U9+_Y3K+MMC|C*4{31S{v|m(;Wkj89)_%#RBR4n7-lHY75$VGQbWxrh6(;bJ*+ z&KNPn!y+@v+vvW{bD?EA4@(Tv*DLniab4DL2`W8%Yzy+J?H(?HN;ISuHYUZ0OkXXE zCKC$D8=j;UiUv}o6--Yn5e`iq#X{bz5v1;+AtyA0bf%tOU1&OJ^|Z7jyHK`6mN4&I z3mpR4h-tR1;bNI5eE&DBij$yY$EsxrhyabqWp$2K!5hdCB3S_^)G=^EVG;}pnT$yp zD(Q<W9LbMJs7foe%7G<&tyczx{Bvv8e*D?GueNUc<>=`!9uF;?uRx<`0Y+h-_zkcW zayIzPxeM%g^W+wnlPK8+9_iH8iLEi^9^_IRz3FI{S1dgxHasjM)@?UNS;MvHE22Kf z_L`DiQrA8_eS1zl(U-P`P~y_>Pvs>ex_I%v9Nau0C`<@~np@=TVtnfU!)2}`_?1|J zstRsYJqO%x;1I<&Er?Oob6i%4aM!hkO9`noTsXiaR7_pA;7U9ys;xn#Dj$VgO=UTQ zaMk4%%IgEGD$8<{Ly!IP-Nw(X2PbVwd<koSyaC!gY_Mc}0Pq2RSjiwPGPWaaNgC4z zFo+t?F<HWt45dV-441$kAW7xhdf}1-NnqXj4c3=4Qeq9b6|Tg2@YYd@9tEhxU;+c? z7y}rkf-sS;(A8xCPCpqfg8Qtsv9cg7bl*2$A}xs<LE;=_a*P3b?eHjJl8H)`Z&(7h ze)mgIVqsNB{}3h`F6TFx&E-1uUyZH(4*}>;zwLK<f0$vqH$BqZ+Q599lTTM#3ifdN zHr15ocsv<dS#15tDkJtz3Fc*lk>|VP!K8%5)a;^)>JoI)1XrrZ<4#FV%gW6qHo<G; zh^-S*;ZZ0|s2tvc0&3Ku!H$ab@Srp2*c^8@JiQA4H^JGhjTe1tWXFVGICm~Av8ZK$ zOk5I6mhk}K<bH}Fz={P<e?0|WK7B$er6?4BbPjlvR*nHjh)LI`*&4-(Pq_w8S+M{` zn!Zl7%C#vmDNU=J!fGubk_Mo_8n(h7KnPq5tD||+Vi9P<QrX(rM8(RIl-3s1MY`x6 zEj8ZcpdCm{I@cJBRpCal_IFip;E|%n&=MStQ`jLMv{JkoE~zAQAWB~{`eXP6EV1JR zj`SK$5`ytX-N>kt!<QVMq)L&04NUsviw)oWuya446z$5)BN>YISYi<Lr1E(LqNBpj zlWGzg8Jn1vU07CL*Ca(k0L-iIUToD2p&2IiB9^u`)K!&wGf@(A@=7Xb)@d%VzSidz zSBi6`QHJ+jnY^`N6&#O>t`t;oGTf^V_Yl)P;*u?ATA)p_C?6bpH?)?6W*j?ouTDz? zga{!fp({B;5`aWu&E<l6d-5uJHy>kum8A*WhFak5Hi-%Y0G1&0a3w61KFpNm<_!Rp zs;kf>Lj!g*o$K`AfFxdk2S5p#_cLILXCGK108;I?5uPODw*Q4U`aGBfC_$DsZ^j*< zULEAgxe1hLMd0>BlH_41hShKKCrVc`Vaab-(k1F`3roTz9z#Hg*cV2qkRqT;+Pc6d zJ<2#Pu$`T#zc`n8<dV<+@(qF)5cG+&(U<?A>RIDR;z?@JsS{wD62Clw?|Xw1OBy@- z2S={yO0HEN3y+^Z|Eo|5#rw%Ja{+U=#s<5a=&|~wloFamz7SVcIYe37==P+gy0a@9 znj30mEyS-z3pO?`DUGaEZ%HMl$0QIc#hsdxl9tIzA1`AXSs59bG?Ud!_IOJQa&rh1 zu4!(^b(tI<eD-X}xwGfO-K7oc_SRLEF|I;5CvEH?R;1K*U7ol(H?O(3=g;LJe*R4N zhsp)Ld5+S=xH{8tiX0OxEiID9s@#%Eay$uWRT|~Z>rkbulnbifrlzhVdtbfgppv{Y zDiIiq<B7qmp+U=zv*C0VH|@=I;~McU$tpl4hrVQ0JQt(3hVtx)Lt7zBCL|d+@t(E8 z1QQ&Nn82wBmI#;Z5V8n;phLV8+Bh6ZpVs^O)EhL(;YxhXK`!TK>8I$>dbl;RER)dj z<;E@FZU5y!z!_HZ(QGIxLj|tZoZCefg5k4DjE`pbOjsljSGKp5lB|W_g+W-20Fsi8 zSW4EEoG!}8?&cTQHxf};R$g7J#lzwzoEEv{6~-rK6jrrf9_PVXqJn$rlyI-;&EODt zA#batnuxv1j>||TpoHHQWeJY}t&Le)aAYr&BdB=+?s=#Zjfe?T`bKzM#%NRUNYSI? z(!s~-lgfi583hvC%8VB?LA2q>h60A5gut&9Z-QCSQG9vH;V03RK10?)Yj!XRxqGDz z2W615Bq>O=2%aPmG7_}%3iPoGZZq@p4qdWloNj72!3H3j1h%0pN#vGQ39!<Kj$6qA zCH@2a52PzmWxr)%sk4(45}wO07>$48{Nl1I6DnsgW>gkf@g=5E5Q>{>%5q&nKW~-} zFR}z4>5mRcP4*&K0+bNSxK{vU%D2-=MfE)cjBv5`L7rq#31`4N+Oza$d<p6J@x%F9 zwn26@5>irHT3S*>+&FZpQWH=<>Z+9F#6)-gMV_rpm~(L|FD=MUO-xGHF3NmwDc9EI zxY#&XN-E0_J(-y~Y*t{uFfvm@G_p3jH{;wAsERA9E6ehd!h=trIU5oZ8lC3lx~>se zjKh%^f`fhw{4F>ty}Ye|<l4+Vq0$o>Vz9(GGB?&3U`b0Ah{%1)02Yb4{MB$M=R0&s zabl3B+nRa+q_9!4rwj(AWv&x=l{npHV&WOWrI>5+6-~|wpY+7!N`t;dXO+T6T**=* zh_I(>5GHBEB`xaCR$x_qI0%w~kqOR{ci>0#=N0NBL$6Lo6ekeGU!xhC05V3Egh~cC zf*c`_!PV=iB#07%IX4p!tq4mh8*xm2@|jMejbDAU_51BCBndnd9)~?64^@ejNpwN^ zdRXaPAeA~kE+z_4Vu4b{MNqb*Q!**PZjVy%_^oK=a7J@x<8^`c<JD5@otjmyMf*v< zBJFv`EL&37d1dnU{C)Pz(|&L+6ELP1&!5X=0xm5xBe0;F%~^&)xc7sFB_Ih6&{CLi zx6+K@&X=wPH=^3ckK!CC-w;~(t&C-3BjW-tLPG&dy4}zNF$62*<PacDzmETA4YRrz z!6-`XhS~~-x=;N|?AvGZFq+g2Q(8eKg};5~Py(Tn4hNf75Q(>ZLVa;fz;OUghD?|P z{y-(8OF)y*$vOBw)0<Yfl2gHfN}LLUrMFF%x<Dm~f&{+|^drr20(15Xl=uX`Qyy7> z31cPtQe9<9c6{K@uh$8b98?lhdL5d;CI^-D>%)|`?fEUSxSsNDWPF0<ChX86u^YO} zBmUR1r589U@6X?v9_{aHx~L@yP^IFcB1BVNa;wUV^E`>J#Pp)ZuCDf0JkNxavH&k5 zJ)KK0DTO&?w_w;KIe-<>5T<lbW>yZK!yGQIT3^ZFRle;ybbGQ3ig}tOh6V-F5wbS5 zmnk!X%#-4y!h%l)o*=#_wXnYH^4N7tO;~0_=Sv#T&V3<E0FyYszmi113^b8Hr2}6B z;XWv=_=bTa+hND(I_zj_n(=h4Mc_=osw@H3ce+edD;OMcX`bX0!&tC*k}A>!xrM(7 z|3W3yZXSO8&zu3o=yEyYX<J{G83|cp<B^DxsyDUXWCw6~(rP<+#YnkAb{qf_DRK_6 zC83VPovd<G_2yJ?4k{V3;`=yOKuI#z`)fY^a^u&Vzy1FE?|%4c$F9A^ai0s1O=6>x zx3FXtm6*V-sVK$c?M{);H9af8STjEibyB*K9AcMOv}9@|ozVP2!I2oj?+#0BX+c(_ zzrphz62d%@D=r~5%h%XDIyE!@-~qdLxJU?=#9?1O<IqgdqveOd(84^ZBwN4(Dd6`- zXi>d!dDDV3ZwA^nUL|`FCh&2{3t$Im#C3#zs!$281XZH0);<UcDK;c8E=!%Q5IFts zU`+x}8pn+db(KXKaluD-|L_fy7C?jW$SOFi;i%$75MVi2as)tD!-+2Gqm{#;N@}+R z?|(rhZfG#%c$EB@<b0zal~%%W88=Y}PTl}RrMF9#%<|jLL@ss!C1Nn;tV#~MsYZ6V z(+Kv_PCd|EvP?-vOyI5!UkH*+R^qL(B}v{+9Vhd*Q^0NdX6sM;PXkH}{SvNmm4^ef z5@I12BA$(Z9V)$g_53lzt~1vs2D+LV568<~T2uroNkwEf0lGwYKexOcEuu$jBnc=j zFV1J}9bGn&AY>=?{^Q~jl9EzVQ_&=l$a5(kl4D{LkioO^a?(;#Qj)OJ6cl>1K&9UT zsnlF4@TyE)2d)HW8OSmZI(0fCwV<Z8e`w;y9N3I>B<m!1hQsl6`s?7*Oy`i?l_wIN zSS&E3*q#}X$@Y!S=tJTJv}!}~P_*B`Cj3g*0V+^wTvuo{pix$}P;r88oM?igS&6L| zErKnz(5TXr0cN4uY^rpM_&)r6tu;{Mo$D|yfe+4$pvj1mb8Qq);!FM(+$!5K2m+97 zzljkfr*hM~(4rMQT7e~lE`b(^<baZx7vS{X`|L2;^23guyLRvXc{f|$jvfyRK~v)H zbk;dnu(XirH4%y$28;==OG{&;YGGN0_z&D4<Rv7JGg?s#(j}lvTwMt@$K<Y-vvucS zCKe*r&`c}_Lqv%#SZ`%(|JcphdyDt+kg;KY<@hH&7HvtF3p1LihEq@<E=sw(IY^^e zv~h2?c#V%~pb}w8?THCMX>?>lojAQa4j@fl<BfIcP`z~3*Z<g>PE0Gxy`hIitcflY za3n*1BX0G^`s(7Wr0~E)ySHuqTJAx%Q)(P-Ej66!-Fh}!sp5wqxdOzF04X68+*4RZ z2`3>*6DQ(Jdac1-h?Tz0^3lu`Kn>><gSfuoN=h=ZGRdjn)~JHh70PP3x0+@`8%mE5 z7)|GR;4*C+rW7s@!j}42)oP_NSgz<QghPx=73@Sixnsi@pOIhAU0|;SP$qT*NK)t} zb`z&S`L^Tm1$RkvXHVaNLO2k+31VlDH|zhn4!x7D0e@D(Sxxll@#5S~ChYrKSs_c1 zK3S8>o39}m3>r^7H(Lsu^wi`G!GPC*^q`c+OyV|CxIvdRI{I;msqR!2dl^~TnVH$S zS*eLsbXghMIT<Ogg!lxOYvdPrvr-uv4LKi~M6s8Z&Dbl7IGA+$?Af#DBizI=b@Yy2 zyUFI@hg^;kyH~4O!I6FeM2zRyDxW@i1Ydf}4yHMhpl;upr}s0*COE=zH3m0>#Tdm~ z3b-WhNtu<dX(=7`oU8)oAW+eKePR@Mw+`}Id%z%`jpkcI4HiaGIJ9+Q>CrE*i*`$G zaeDZH%`DP3tsAPuVI>@un_pBi9%U5AFK9dO`-`;|L^8zjmvsK>O=`D;PXZ;Y;PkCv z5#|FGaew<iRBvCh?Clpa+>RVRsvv-q!RNxG<C8^|BnYx@1`~t$j`kzevZ9$FLh#C0 zji%Jz%5%D_tFMoU5XR6h6B?>nGz;}NfeEr?dq4SoxfcXWT$d`5l~NL7@dea$3{Kv> z3;TKW#99#cfH+qQ!4jEE5ZFhENsIEDp?1r?0VX|q0Hd9qMeL?v8|A5ES~t7g$K+?V zs|5I@8hd&gF>u=2azg_HgRG&@#eqWw3v5**i<ok-`|>}fDZ$_jytbtQmt}LUFE2Gd z^wi-!q}FW#atPG^Tp(efB*~knpvF$D11<ov9-Px&liFmTr>ui1eYFXxTY9&R!)^W= zN@W6+#BD>MFR&{4k3Z@+!IH30U`PR}V*Y(5;ofe>5@SMk#iS62<f3(h-Fhfx55Ni! zcN*$raFr-D&S}=w*H;n=5r98Hm_#3rH&($Jb)<N+7k(We_v@`Yj)rIW8rmuD$=<_& zPuw&W2;RZ@MM@WO<G<>VfK1|q@*s)MZmOfTQ9-aXrFtWexGc5!Y3rLBTSWdj(3j{H z=cXsQs0|Y06I0VY!~ioz;!aOXNlpfBfTFy7U@IesnD@MFO0>9mHKx7nGxDUw$Hc^` zXP1$clSypPnKP$@f=-`7XmT^6-qLw#gjC#ni%Snd9S)>!o%X8-CEN?V-oO$UW;8Jd z8fItj+-03B!UcN@2<*OnThs|uLc^d+!!-aX@zK=PN%jLFi%-Fzu5tF`Uz)Pn6BRPJ zmUss6wB*_>zJ!IHa1${m;_6@#fKn@8YpTeJJMq&OYYdL8jB`*4NU}>Ks*=h&qe><o z`5}onkRtITV?d6sq<0OGWK;4(li)~)zJ{wnsHDGA&*5huezJb^w%rE<0=dtyZ3hJh zpACzMj)_Yoz9hf6lw`&l!bcj&NF(b)^L*k<?ENaQs%sJP>(ZbC*H)$B5rjuaS%a|( z5fOP}>!<&BSBI|CW;~kegi6US#BOakAy|HXeu>BcBT8H){0I7<U`b>Nv2Rh%jz?-o zC`r(ui3dt<jY;{FhM5hbf|J8lhj58En!pq)(YHWsBJ@opPV~sko~-lZe+w~i)}lZL z_|Mv+IIK)uOSoKClYtW-cKY}c_6KeIVe6J}$TcIfRyd)<p$AS2+*r|@)tgZ$z(<-B zTuExTff9sCjwSz%oi3b8HmH(t%<8%?EgV+`k^dhPSJL_Lfr|UL3QH8>JVt=BbU{rt zLzUo4$b(4V*n$}?>{sr&^SELYU?eUj^p{PfWD1W2O*;6miX{Q0CU!%WHh#5b`;o}( z$|g<`e!{386`|5?4eKvp4e)Czt53yu`_2pI1*Fa}{=p7xYEh^@r!X9mA|7!?!+u;d z>5{9Kf#frhj2(apgqY|kU8V^HPEMAlglP$Sl%1_rRQWlW1T@*2iQp;+9^)v;;92R( zE|)7Qnen>p+|0y?vw<g1A~c-|2~WWN)JTvnTuEy>Vf`GGah&$A|Nfwo4XO*Y9<%QR zoA*7`I935M)S$*RGwK{pz!EK<DNqU11@3^GwrQGxg6os;Cl-|hO*V8zX2!52Lu+18 ztm#6mHikxQNUK!6PJ>!85wxjEx;wvb<40DfIYi00l7mV*1C2!qN&Lra?;6tR6$r&w z?L%`ZNl3CoXvE(YRB}`)NRkfV@54_vY~8W<$Zx^t!#TqE6CM#69g8n4#gpwVX32wH zPbk%BS*gfD1g42zUBzVuOob2X3d>&Np`lU6d`N&WpCZMnMP{1`4^deSoUSgW&ym-V zCW>>?6S=Hl@b4QTc>Vsu5-Xiwe^_+oz)YzGK^~JwOGI^1zi~Vu*!$rFb`M|?xHm&p zO$iMuT~RQO)Kp5itJs(L97UU?Ks`>_IH>3pb;3#}drT}4PMeQ;pr8Rf6Ni8(xBzME zD(2c%=4mxpQI5wI9TpsTl$_t4JAV2e&a`p;I=OY6XCu!+Bovii0vUhFX3*k)WqP;F z0YW5^CEl|jCcmvo{Wfd88Bub+iFbucdV)IxCy*tp;H>olGQIyc_b;(nnuiAYlNKr` zCf8FLyit`5lz2o(S^cBChZ!D<a>CH+eL3+be%SDtFv-AKWJ&!uUKuKVVY1R!-~9M% zcy4toPH_R8*)$M7Zr&nJhyaL(e`)L++mZ0)vN3m#QCT)?ci~rKO&Y%{m(Wh4v=LcA zCF>FcRyqr4IA$eAUN{%Zfu4=DL?xG+h8uv@3Y2U};24zhnO#Q@=W7WGE~Zh0RJo`e z&?=6^R9xQ~aU|Xc1f2ZsOmIlJE4zYC1eY$45fXfhT6RHZN&0PX5=SaH4#q(NEnevD zQ1vb@-3OI05X&AzpbwxV9GX%KK@LmvFHzVjX9IgN8XkZo<M$NT13WWo3vsovcuEu` ztv*4+AVvUGVv`-bLJvFYVt;>cTV;04u`Qoi8%~5tDw1FBHcXNyKt<P|9tKDNj~|hY z6s?#7{6hCiqs~Z`^Fs`iKqZ0FcRPO#IDH{JnxuHe45Qt}VjWAc3F*R;QeQQdT0J}Z zxS~4UL<A;2BNM2KAl0gu7)l-<6&oS-5m?gBPHomh_1Du}7o;wxJdkfFi&WGXW>LV! zCFl6Ck}(q{ndsTeH>Wj8pa7QSS^}4rph(I$#oEnMdLkbf0OxYShCWb<e^(XUl`Est zk>mnE;-i$K&Yl!1L8u%_98i+p$3p>E?Z?JJMS&)$_TA7BuaI@IGY}}mB}5IUP8r{d zyjf}NTqMFJ;4u3(e`cl77P6_oTxZWh(F4JfxdUDYBf!QH!6hw0l@OM`*$f^Dnq>0U z)QKO0AW7gFKY~NwqqlrUsN{EcQ!&aJ;PhjSFug@oBIi}60HihM;LxPSb)mfA4+NNt z4fiaTR2wTaYkVJ~OKnkl_`c1K;4RVLYB*t%?hXA_UAtk^)?dzM)^%_V)-i}rV_Z$q z>o?~}UcAo=INZ#C;qhu2bBUst8Qq{GMID10N>xd|1Sf<VjPi)+WM?HMrsvkCnv%@8 z^JjvCS;liAE;Wmp5(MpZNKzJm^YYnXslj!S$(!j;b-Stc@a2grnJ`Ww69-_H>4`bR ze*5Err?k~4(Oc8p(K~o$bW+L?(Mt1RCEC#&9m(f3<zBo%=6*tLummtYm?t`p#bXPE z!!2ox-n~1pJ`JG&MVJI;W|YuEYmTW=e(Y`LL$4y@sUHV4*@bnV9vFQEteb-OSV z_lg?nX{{%yT;M#=uw=}}J>7K$iNF20j(ysYa}{gWivy6@W-BixRB08G9ICU5PsWb~ zNKREI#$@%{|N2AY_8S5m#>5RpllXpk(*OC}-`4<2yAGZ_%Z97u)YMeUWzapzP(B%u zH?>=|h?GfKt)s|j*1l2ZP<EPwNWCKbED+&$29PaQ?Gh(;A5{QHKY4zwFk<FE)%xmW zyANEcqA)v!eHkfv<*fq~>`>*hx%{uYF5pTpU%hZpi7N)h8{G<CEiFA!x-p$n2B~i; z^~&OL)q|sGV{N?3I0@az+!GYoQ&iYjC!tS6S9F<R)gQvEI!s^^=*2C^$E;()E-)p1 zsr7`<fsPa)ir7%8=@@##k)h{<gS2^ym7COZUvE?jqmW7Uih+vs?bQQdF^DntByAgW zfC@PAC9_i6W+L4j3^KCiXH5Ep-|x+H+aV*4$j(Xw)o_SQP^Pyxb5d(u3CUBBCmjmz z0NIv!41pv<Jkh8}1>2X{?L!tULHoTOO_h1BliN3#Wr;qVQ^Bd+G^&L9W?bp(9Ve43 zTA6@l!wljSuD)>$ty3_BJIXn;{U(1QD*gTxU5Re4!j6buBayTVcg|2>M^k+ZYCJ1u zar&DHrVh19DWw%&MC-FbzXb)KkBq1LlbJ~km+E0=4n2v=O`ud*AQ(!gT1%l5mm#Ss zpM~bBiPUrP*e*5r>xm5sJbp4TC^+OyNK{%`JsDQR(ijx*gmp_XCQntut=<_-Ilz^k zs<xxL!%B%iW_}ib41wbd_dz8&y>HLV-j>~)Q(Wpdc*L$Uq$czy6sIXl2F9RoAYxEH z@Q*RvAjUKZAW1#acoCHvZE}-X;7^w>vrhr4%x*d8RA;L%_1w-4D&eFct)h~7mSnGl z**K_Uuc0`iIueJpeew;QQlVx{360zT9&fC!1CRt>0wnu!e<MiggOAsLyX#OOKJA1g zmCNZKH`tV#0y?F*-E<vf4PauG4xH*Yh(3p&tb{yEF>^X^oWGo|#J)^mU$kj7RRMMk zYDFGgm~jS6H*CYu-qb`F7Bgl{T)MZq<MKFtVl7d9_To+V3iX`2a83~?X^A93^d(Uz zF0$|^f=uKoLsue<57A;|6kmo(NPv>{A#|BwMG9ngQco=XuP7xXcTtfLD#7E%O#m-$ z%>&0cqZ&>yDjJHAKt}nLS6M?SWiDr9LTn6el+%I74({Lm^NwxbZ~cb;natM?Tk@+* zj@0cy3%CSRf)hcOph?WAZsujH`f!jX@Jg&mxTFMcyD@OYhvul%z=>2PtC1++;7aCL zvPK*pfwu-r7aQ8U`>?yx69<kd-H^PwT575jnq<kVcq){9PP7k(FJP&osjAo$ap>E1 zL_a~5_&)+nLTEcoRzmFl>f1xHh0Xj#a<8zrikDiei06uyvs1d@YF>RJzWaB6f4U@> z3CZs>*T?BdaVoRXv9+qCprEL%l8HDJ1`>zxDphNAm$@kH+)<%tPo4ZNBr*Z-WO@ce zDam+Za&lNBoSTiCueh*~0<JJWGd>C{Qwm-IyiHVdY3j$tVFl01&Ck#EB*oH^BW>e! z@P&lz%EnHjzhwBuo{hA0kJJEMFmNS5EOF}N^?vyRNfnx;J{<q=`2{U!0-P3b#gON1 zveKQ|J9pS>4+!BBfH4uSahr@y@JTV1Q{)Ng9W)Mx9=I@!kzAnYEb$A;yi{<w1$c+~ zRjx>qVR)eBG$!<~sXT*7<c}q5JBP(V+Q<nXO8|G!#9oW$2&tS8{6Mq%fdELZ0OzlO ziDLzooLdRubg;`?D@=Ypc|L|wAN&{8%B(--NKaP?RyrSM=4cL%1ppLq5FLJxZZfa2 z_<*k%y49pX7=`rVMIl~6`3abU2C3l0MmVr6Qn6E|b0r3y@sHByBDOmNpRCJMP}6bw zDqIQj^Z4oNgW^9wd2D`v$;>WgoQk-I^iZ)cN&K_Jg1re>f(Bs)P=99}iyjvS+)2R9 zB$^T*QNc-iVpvhd<zW9Mo+5+tfa9>#g!OfB?S|}3P$n4(U`;&r7`Xt#RC6*~%>o{V z59~}!cEv`8g`7Hm^x)pzJ6XlJdD8}P>2uAZ`fD(eA05ygKUt!H<B(%XObM>E#Q`M? zz1A&tLomsy;Dl3r!c--GFiMSe;6DCn#Tno*CAx8M50x6JWK8Ji!KG~>?O(8s1q`W< zM^qrMB3YHL%H0004jw{p%DH`C6On7h8?i1zCBM>bTxtEr%|D;dsq3~T2zR)C2t$eT z9iza`5CSPf|I<JC!8?bg-=85yDp+~;=Hv(l=8g^owf2e}o%)>UC6x_aGVAJU$Ym@m zqno2^Cunje@MKVUd@@l1sT5=BscGt}<w2G*vIR)2e=jcfX2ynwM#d!KJI>F|BCCn~ zYXWkSX7Ppd8Bi)Q24DB-kVtn?U289_WJDoJ*RS8ct27KGwkMLit)k^EHe&n&eyYUD zPlpGNXQ;$}rpJ#K@7<Z5RoFLv0XCEYOE@cWTu{itz9>;|ibGM|kpQRlEnKp>ENhzv zlMS5KPzCAvC@^Rma)5AfEmpsZ1EGzlc}sO(?4iw{uov}>Lp~)l@`~H690n&ws8&An z$6Kh70LYNY-*>b3{{@xwBY?H{-d{`F<o*-qqErrN0zv3^xj9VuWOBdK@8nfxc78#z zk7Q!mlK34^WF*?tumPWXMfmNK$~s}5=h!23K?Idx8$u<X{-7>iS-u&fC5Z`&)dKtA zA|zBQyhvCoyPZ|R{d?RFinp0w6`A`4>%E~8-BPMO@^X}jWnv$;R%%Bc<O%Xet)f#^ zH;I=FJ&BKbY?SjL76jO!lw2WLfE)p`X(S7(iGj-lmJ5>ESR=oML70hRf+eDbO0}FO zCo6+}>@nfzPM@Tb+Y4d(cJo&lnf{3F08xZU4k|hCNms%fAX&*lB_Wf^-A)hAU`Vfw zIXSN(ONt8+5%ag;9Iiy=1}bUrWzCwmg-X?R%^g}GK+B&C4J-+!#E3a}(-=h;ki?+| z0wyp3n{Mae0ORkZUF5iecHk~`h>|h`tOqAa$w8$}-v^{rc5u-Gk+gtAJIr`InB3Bn zkwt7q5&pt8C$FA9AQgwJka9&xvJnK;SLY?+fkYHaOV28*X+iX?EX^a8B->k3lIM;k zxCcS;bcD;DmZ$>FxpecqVAe$GC3#-r-_VxQV=mAxqRQhtDL61wGUe$;`7X%gGw`Ln z+|;P^SZ-W-RV`2@<c5)P`exwsE%12}e}GU)4)0g!t5k5$bOF}Mj(UMJ;2~FG9WW(6 zK^1yeyAZT{Oc-Rx^&2d9rL1G^9H|Tp_NWJkPXINKXNN)&xuPiiOix}gS>_n#9D7vp z=t`tZkt%lVmh5Wk>8LAo1$_JYnpIRXPl{-gPznI~1C~T_-gj;%sCuJ()5nHMYQnvV zO2(J`@Z}VM6mTDWvhn*p0U=QdY(vHBrIrGtJ&1SQh1ogid6^m6-0uY?=1fu_O-{N_ zfT^onO*Q*{nEK=3_mNBk+mPbT$T_u=0hZKbX3b0~@9H#)MSd8&#fZ~#r5DzA4o}m9 z6N7z2?6d1856&xMW}ZEJ&VmYPEU-kg0z_J7QM?7Mvqu0xu?Z6*lrU#tx4%AVpVL*D z5K+3LGU5v@6*a^7?ur8(&j4qH_S)!Rnoi#g*`lLC%mBCJAv8OkEZ<}b5PV1AdVV$? z-)I(B2c4iRx0^k8_$yiCrYsWJj_FG)tjEeR5hv;0QoB)<9Bm0@Ni!$*HN7%qa$f64 z5Uix~&C$Be7{KJ+Y5}JK;Wca5zAaR$X=?4p4!~*J-bxN-KaEI&hLx$$Walt<D=%a6 z<iVFPgP{!%UP6Issx8TkIri<kPc@<oGzpa?vgwcRj&&Qh{t{W#+Rs!S*DHwh_&DXn ztr?XR+}${n@6NFcdwKaUBTG=FIh;K*+!AYtC9S1a(G|&Y(Xok=EfSMGMfGjXRYV0~ z@J&q4F33-hW|a11z|p|a1jgTzQrw=jjO?tuY{yxNmzV$)`qb>6btgnI9U21=F;Iuq zGLAe9hE-%-LTd7s`AUm(k_lf;&M9x|>c<0ig-DmF8!UZ7T4K@RBE!lrP?9*;Iqd~c z&p78f*YU<cnK0-rErCJz?y=65Ml|p7g3dH+!nR}zK<EaZ3l1Ad!8kd^PA2Yljiz7a zf-*wSg7Umua*9Ec=u(%eAIJsIR~~W-1OyC;!d#j<>r2vtwy$3+i=0!%A$dEriFe2l zP|dZ1DS(oB=?Fj3r^Ju^UsE*)DoIdM0VjRiUhI`_X&5G=q;LJ(`yYLYs1y|8N;R64 zokvTvfH7L;gCyVqO;D$-EHa9jEMZk2C78tR9(=w4snqLBJzP{-kVnY_2?36|3(yZx zmGztHx0FEB$p|cRlBUj7`7w7=SFT*kxP-LA+MZEErR8T&pa0wV0cAGVj8{6CReVPI z1}gC=J%3IK_h?BiULFoyV*JCSSOTt1;ZK^@EH$gw@dBW6n_FXw?GW-=jt$xWkqbZm zN-zo472S1)IvkgotRCvusSHPKg7glvO%MjrA@3;j2bC2SJ~>EpGj-ZU5*2*%*uj0f zenMWd9g~8kFV}4lHVIi&mHD+Ip^w^dP6rNUNhKVzl3+;`Nw9>Nq)JY2fg}ZXuOoq% zXFH8|Y2C(^P?LmB8V}}pOR#jYzO|#5M+yRjkFKBXFawuIa9VH@>!|~tbD`C6Gw+fP z&0Q(kfqqqWkvn|<7R|$%tmLOkDrc2rvSG`v)7kYs?3j_G+Z?SF%v{57GbJQZc4h`S z@lUTtc1e2suV}&D7{AQ_9ZjJbT^rqq$fP*kjj;$o1OlXbFLt!m7NU95iH=Lj$Rf5q z__yOnj|Q9xPe?@0#ytrvi6$vhR|`QrSp}pI6y#-6qPe1&4)tWFB*f?krlw2xrs7M_ z&M&E~l^cf0%i^jA1_H6xk+=g-vQcF=uxgpca}rpQwq=m{{RJmJ9XME$qE1MMLP}yB zorzGKeaqyJ&#O}46|lsKtg4Ms-8-|~y(~nbx)Xo84j@UGa6%Dz9J$Www>SSJ6oJ-w zw|qUqBWV_T2Tg|Ox8YK6v(FRy%f^q^Xe9UVhD|H*WL)VrvZR%^#Eq;a{|mhGBb9`2 zJDmDWfs+=uq`d;p;Rht$$fR;%-kQ%g{q!rrZf+_!dJ6P63yVr9s7p)O&{za5Eui%Y zY4YYVp<AaRT*^;^qhLzVK=CGdlH~qX<BHc;l$Abl<;t*mUesMS{{!L-prr4|8Nqu^ z(v>oaEq0}2?H-!ELmW4Tx)=Y(<?Z2N^5mrks<GcclfLwntH>)Zu@5l@+_|Y`S={L| z1CWHpS{r;D3c^BBqFB(h$@FzfGp-iom>_+PiOx<;Qb(9HcpI^C4tuPwHB)wmNHDxX zm7#Dg7NSVmWvw-qc2v+BV&NDa&(HC=6BFW9$ORtTzkB<4UvDIx5g38rtP?T;M!*a3 zq(4^1N$m!dRKy{5%R{Ld6tf1bXNM6;r0-DE4wAtk>P3fL?86UBHh~8q36{i^2zh!- zs8mzW4sUcohNC(<=}BQq8fHKj4M|Fbs1gbsNKP|g+y<W+T|gnl;$5M9=S_l6fC-)3 zn397^>o$D5?_4_dn-p@sALVX}&`^1mcnZ<QzH?_5e>Zyf>ipN+hoLuqBF^rG8)E|? zQcF{loGrDGBC4|Zxag?JNUSjQ@!bR)bStby7!yzbCp{(d+^OS-kDNFk$LKER?$qSe z^o-mbv<>2zRI9ly)gEg%)xFyl2P$PGM~4%);Z~?XKD{`1W`0?99Ya>EkSniZ;WzYA zMKL{lQ-8D;8b>MTHK#ZH=%tc;*m3gWDW$=K#U-K+>B4d5Gx@pr-~l0Vj~@U_TGmPx zHwW8d5Dpx|w9ee_?HM*T-I4bJ_Y%)Wo%~#db^dFID~JP~=tba0Tte%GD^b5uuj@%G zF2VDeHZ1I;?@~{DO-}TIt)I$}^1+89OcK8Rw8_+N>$n-FK$YxTxdz*SaUO%CRkj3A zLRW$?!IRjm>%f$Fk`7~6`X=pGdjF#h)NkiwQZjNyk_rnTN#xCN*ZC?eUd9&vLYeaE z!)bXj4GSIoMmT;*EkRa7w#Qv3<sJm$^b=VcQ=|*1Y>j18&g7TI+ypFfM-ZOC;-!Mj zR5}!Hu1$jzcL)IckLM=#01imgOJxYamY%-E!}Q|ClZO}s=suw6nOJ=lrbHVQctO9$ zQ3fbYYt;<`6X7$uWQ>|~0S`V!9_9S4nVWP|S;TW!bcu%+b!mE9kE+@jVq2h+<IbmC zVJ;4T9ow@iv<V_dd4ybL!$N{i9NfL*yKkI?Herb|9(x5q8E=9KL6z`wE5XFHC45Uj z630pjXC%p~<AiAzj4RuZ(GZ6#(SehuWK0Q2QkKfwL8ao##x}LZsmhQGHUB2h$}o>2 z`Wxy8n%(Fayi?j8D>QI}jkCoSIg~`diu||$>;X;#PVF~UZx)5O{+m7LGppMBaMt49 zo8S>3H&M8MON)eNSX(ngXx2UH-G5Oc<*UaFx5in-hN}hUO9=ACs*>!K#Ka_et5Fe= zG|&>0m=)*QN@9Sb#2Co+c-(QJr%xO`aw?LxKLhE2kta=Y0SHe#FDTDEM0gh!6{@z# z%}9zP<D2Z&u<!&or5#WOsmk=SZlku+=c^_j5jHwVJ}RS7Sh2Y??r^@@(p;#LvP;N+ zdujg3SI;zRg2v4(I(?oe&z?U;@y1E~SSDhE56wjhMVdw1rlE=OjTnKVber=R;-vUD zJ!+iqT!*=^a5mEr$DYKR2$_XxvhjHHTvlfT{Y7Ry*+KY=a>(-><3znTAz<5==HJyu zdjXRjD&tV5O<J<Di;cEiCPnJ0_xPHy#t%2V3kW$KH+xO}wpzD2pkzPdZyaFWnoqyp zaWE({k+Gcud>0CvAs@Da+{r2qc3QJjldK1dxdH_5YIuIPG%@M*XkqXrxq9GyIxwTK z3`W8dWfQfJ3RF&SHEnP+bxK*JfKxFmzfygDHH!vZ2`;y{s(o;RF*q!g|4CjjR6_QC zWvw_Ci&B2`@>HmV??khS%#$EpQ-e93hZ)t?R*#`AaR`-!mb9fgsOfa@NOG;dN1)tY zse^px7C%Yn2@kR8FuUEaAhD3dB=0K;G>r|7b*w|FAkBpl@-zg^gjnKojvw5!<J+&9 zkTa&_wBr2bn+iIs#&N4ZkM$r<2GoUFo<syM6WM4Kq#9HrZjO3J>ZVsn_1YBy&% z`0b#Qw~R+ti4WTQfzw&>V4RwxTw6G<$on-qs;;IiV9XQp5Oc>+33S4ie4g;b->DA= zsdH=r`j2DZ+PLjhdQ}HMjSVv@{BTdA_HifQ=2FhZoK`ktMsstEXoVJb_6Dzc7azQO zFmrW?owXX}RFYQpMbfkAtGTJiV<O0sL<TCZ#)qeZoqfs`z9PksB!&lrN@rqH+*Eie ztT@S{-{B_Z8=1SXFed{i0I0;1Bp<aYfrW5xmbpg8rqYWe2%HKpr+~GUwZ4+ln$|AO zWety^KU2I>ZwX9*6E)SyqkJM|o27`)?F2`ppnzM_A^}F_K&$7XPROc+EeVt;=GgvA z1CD_>tY3F|HA~J3BfG3BgDOqIlW<W|LTL1X3k#~Mta?3oA^LhdyXZZs4X061I&Ye6 zmw$hF7$s)dBvnjnU5zEFr+04nSi9u?sN_JCfs)}81V`{gWaJt!3BBPXNR?k(TB+b9 zAVHRNn4~0%<gg@x5<dW;Tdz$r|7hLTpO1yaF}71!R8YdsbRQgv?XeeY>#D13$TkL; zka&v=xXX)u*g23N)IsdyI*I++KuL2`D%YfT<B?U63uIjdtU(poAwcjYi8JjIx*1e< zxRN#DTrPKhdCS1Kw(u~g`RAu1UAUK+zV%vDaqRFTa9tM?P>C68(By{J!SQ^-0U*f_ zU_tL=7HE|#@r;7ON{UzZ3_*z8;0_}X>R>>XM3(ezw<UTAmALAFc8p$+NQB_A<3Hch zO1OpQ5m*4h%o9W8p7hjY!YM+}96$KWPg^(n*^=}i9ahKjikeJ-Beh$wL=DG_NRv>B z&kMD58^+(L;W#8lp`LSyDLM5UsuJ8tbsJoXcLYkhGQAa8DlDm`f`h)3Z=s<BDshPJ z;0Rk+p-ldHLfjW)BV2ryHq6CW+v_<A+8b-UDIt3{Y93BXH$=$@(-&W?-*PaqybZH3 zr#Okld=vLP50w)Qq!NR>on!W{9BBXXiuC8F#Q*5Czdv8RIf7qOyON>2Y!j#@DJml+ z852w@?ThG?oZ^~><`!%qge0qE;D9it#GDU2a`a48Qd&xUY<wD8Yeq`ED;<Ba$_o!p zZdn5g3-VFGQ)AG(liV1QQ!?`y)<r`1<d#&`*Iz6vD6VcBfFzAhh%YkpkE%u$hI-AA z@*_@vG$n>kKqb%#p_^nA-dW;Un7fboMwTY1^_278BBCEq%PsKT{0snz0BOWg3OWuH z2y{}4Wu5aA_>1unD$@kri1Lgluj4n9XSNs15|<+zP^3SHdZ@WA`9DS|62zXHtFl7( zZ2HtLiMV%-E`dnkj=2NgGlLR{^4{NAKtf_PmHbDNmZTCHTQUGLQ>E}ohnSPF=nwOx z!?+ygg@JOz4|`6AvnmF=MNyg0vH_|ps;jZw<7~CHA62C5`_R5|Qj#Ot!X*{*hvPv5 zt}5eHeNw7H`E4{80fBCpV2M7Q<E$JR=On*`Gs1S*(~4x|wYiCWrTi?i*~!Ok>>0bY z@ECRB&(1ZFibm<nSO3JyMB&C2WBJ*0cA%)51C``!rSKxgnBJKPv53=+TX<n^<54nH z!XjV~kJWIjOLay=X?o0SGoTJ#t>!2wWbohxd!K_!*I9`?JkZU59eJ=_0itX`ZqQzK zUn!x3nuJ38bj6094%olz$E{z1C8A4`miTMfB6I?1M1!=bQ2|R5mn10xN=^?>kR<iV zUhBJf`GR2<4vEO7Dydx4nL)ympve%4;Lx{&N(@=I_ox`h=E@srJjw#ie7y3Gfl?X> zsd+$>+LN$NuEDz2Xz=7>c~0E%ZC?sMMU@<%J5=eb9U%oRwDSHhZ|}jKWtp|_f1&?d z))dE?af$`&(s5>-QD=NrEQo;g7Dyo#5)#teO7A2gArJ_Jz6c#@q4y3hnGf+hj(tA? zeHBK*_kRmdDlyM<U)On^``qW=J5UY&Om>tzahyPT`~>mEae@p%=?p1xLJ~B^@4Ndy z>F4etb?@0UJY*3kG>JZj$b|K)kg$u%;};ebR`+bw?!SG6RxMpEbl|S7sX;7SMX~?1 z&%Q{@ErbHma8j~VkP~c);oik`KGcv@M^L}2C@*vI;&gf~Q9)W>QC5^o4OdAc#Vh@7 z4b9!dV+Y8>9Fw4*Wl}EB{L*DSNW^DXE_2j=jT3-eo45lU-MVWJL<eh9U2^3LR0^r- zE@X;!OVnG@&-=;+5R0bv6zy^`>gNQI1lV)BdNdz}CLyX4BB*#{)?=Hh8!^5Hb1<!| zHAJ(x5n?uOfl&aMM0v2PF`br}(zeoof6H)N<<bvd{X;}%zoj<(LHzbhZ2(VA#Bgw> zr|GO6OIF4Esc;?%K7vpHQo@ts6ZapIG#vmYTMDj3tAI&wPM(vsvKpS$)Y?jCZfFu0 z)g^rc#@;lLq-iW2`Pz_paZ+My!LCHvo)+MZyvxu4DvS-{Sjb?pnHoIqUoz0aF}51T z<c`E}qwpl_Q#4c(!3_-b+WN0(1>=wVH}5%i_Uf(g<lj<D5;PK;A{mDrfJ9uPKz&Uc zELuAtQXHeKgc$lbKm@FK5D|W%D}6~Gjjcd(j(v2%$r?0t@T+*w&O00Y>;((3slz^Z zngfSUS|?9(hM&aVXGOwsN{7a@oLMA<M(@NsX13TdffZYa2c?qJaaB=%ZrYq_lizvs zwMqJPRJ<d92C~pQ7laaU0+kTFUwk<+2uPIVN_-3&`BgB<M-y=Z+aIH`Qru)#1OOBf zoRQnpVA5|)$?@sm{Ulter%zpp+lp35_QLX9!*9~(ySDE|D)k}^mL?sx!=BMF>2(@Z z!Xel6G?r$3^s0Hd08$?a;3mECNn!U$L<aC@`;i?nz((DL$&wyA#r8=qQsOj#z5V}# z!~4$V@qMG~$-MP+(W0GTfUH>E%Dfz=Zm+<uRNK9g{RksuLsEU*-PTZ3wsHkmLDs_Q zQ!yH=Bc^Aqz}-#t5muxsnkZG5l$2Ffm6cZ#(G%EZEwNrMGl%viRrXg}nx4C=xpx42 zUR&>mT}S9XLX2h6n`NEhkhGRWqsuL77>oqeyYCVY+@Y-xqjN!^%eGgFj|3}d6;*JA zbyp}k;i5JUzU0hARxbSWtaWk7t8~&J3w;dAgt&BwWDimxG0isi<W4&H;m~0->O2IM zXk1JwiWb)ppx{;e*|S^S-|M@oGCzLfS&v4RUD9$8WCD=jOX^2D1msH8)BeU0iEw+# z5^x2`h(0M{JA$~B2Ox>wCPFv>Nv;)_KjxW9fBk6gvXa_n32QrY5}_NJCfmE&hf!RD zHPK@mT;dyg`iF=^Z4Y2z$}|ip6NV+Ylj|5^)Ox8%Z((g=7`jai;Z2mEQIky!w-LTb zt2HDVY>9o{E%gNGE6W>KZ`gJ8BxDKT`M!%BDY2c&IPi(I1gDCz9xf)F0cfVC+iVib z9Uw3xDau)ltc0A6jA4zN$!y*LOb5T@ZgEPJ`MDqizDV#uM-<A65DxiKh_GCz&#E4t zI>A4VqD@k8bdbW44q0+~Asq^_p43?gRa;r9Ng!+S?9V=U`%f=V5>Cv-iB9()ge5P0 z0P-V968|Z7i&F6w5Xm8Myn!@9uK=?Mgy6%e{F?zAL`gtONlIeUPlHNbt4U*64rWNk zz1>P9B~~s4Je)J~-h(DLk8sv}$;4ZDDWB4m#^&XaS=ZlQTR87+=2iwx;`dfndhVsS z=hqKyRc&<2Yjo<?sH&oO(p<tRI^=r96M|d>l^8tq{dfQSR>b3e?(VfShj(qHhf+5u zZD%J7y|1&bC?|{l7`P}I=DkjPu;S<XfxaG^LDyF>{V*ddJ9E*@=?gL_U8mwGrw~*s zEoLy>N+t}{)hK<JQiy^sURts|bK#s>v*#^N&n+rP`ChhU@zUJV7FF8SYe)AUJ*_}} zo^TA%!HdKI0c+iE-zIl+=k6Uo$9uO;GBfhz4*l@>1RoI}@ZsGMFZd|hi>Y<9Xj4pI zAp(#0Ssu=vP4YIfr3jaOOTL-7n{<?}!rdrGF-?O$xg#U!N+>Z=5XzqQ^w!wN!|t8i zY$mX7b?vfG-+11#q9}Pv*pi?WVVrM_ytw2_QKgLtWf~4xQu2O)N&!hJD3Tn-7Y*~c z0^8zEpwh?lb4%;nI+2h%rL=vhd`^Y}k_HDO?F2sAuDhe71A901xzR~Uk2;0*^ix%2 zGN$7h!vc*=Rh^;vp(l~ZA^GCwMrPZz$xbdfxU8Y0846^Hu@YtVUF&unIvLZQAF|xg zxrHUZO5}E%!CB;NfT-J4O-ELgv%xBKZUW0a9w0;{<G?E%1H8sy{{bRPGSh}{r%s){ zcm>w1aA*|^-QxfzIwGG^IwZd;DxDlZ_N8#TgC~jBO$5iE^@N^;aHio}klMIvDZ(r% z%*$B##it=H5qm*%l$OLLKM1lEuml1DL!c5@s7m)!aDtJjlt|<x?)Zmtj#L0AB&jM1 zNdAdb2P=TY*H6KfI(r5<I3c`r!_yx?YFG#Sp1s^Qk5C)|G&n?MJA~H)zl4qSd|7cK z+B<8oyRj_$(>EYX;!$!v_x!6L<aTdHHXXx6Z{jZWz9R@r$4~g`0!)U`ahdAIqw_GX z{E$WQ<3D}x?)CG>_itU#{F0uIj?Q+v;`Vkntjx(w&(3Dx8^b1BT0^y_hNPB;NiA(n zwWayYDM?$hVAjkfxk=4>5rw&EiYDT$!bJ@)p;rJt$uimr6lTnuIb+7mxr@jkRWgk! zZ9#f|Sz}9+MCtH2lb;FL0AR{JIbl<6OTNDM)g5$FDsdH!;7Ygv&?j!)y+aQl3`;=P zUH;<LLv+&BeMLw@QnJ=WJYvQ2ItuW_a_SLh&zwve2awP4poKkIm4#Q2jH-Gzs-f`? zO_d1a%*bsg&Ng_X^Ur~3U<p^EXMpn@d+V}30hNCLdr`>{4m1*rQkU?fu~K8VIk-4S zf0G(PAn=5gq|_Z^QpietR#XaD3X<f6@E}W~o4V3R3-T+PY3kOsnvUvlBiRwCG&q3o z6;89(MsH}my`(IN?C?>Vt8rGq7W;t+QN9=DmoOt#GMp)7-a#d-E+lhs3UI7KmOv#c z0{J)WZcu40_U=|f@#50Dj=^pF#wi|uD2E4<0)}X8a+gE}=gA!$-(TTZf)Eq3VeO8L zGmchh61c<Lkcdpp@mk~lV;2FIbPqTI%_XWQBKH)68guDSV=e)o#sI~28om1jCBLF6 zJs*(5%pH=S!l6$8oj#`Wv>C&B)j9>5QmF;gK7KEyc)KwJl}M2Lo(faKmejmM^#+%C zYXm1(3QSUdLQ+yx646phcgRX9o+K)9eG8TT@DspN2Wcm4`qY__P(=^jvIX9>Z3nW_ zP6+Ux{oG8QsGOnHIfL_v-AISz<@SW}(t5bUxqqX1Ks<5L_}OP)cyn6m&~{=#UVYZO zsAMrBk{_o6FRwLlgwgP%i$v0<y;JATj|ZC{{4ef(edF?(Lku`!zD_%*YzHx1S4&xb zW)?AAKI3}y?C0m_<>us}YGd<8&aNt6Hjh4Sb7#(6oU?odjd6=hYZ{yCE6XT+D5WN@ z8i-;IQxsQ4X-QR4`rMgcOrJJm9z}B{s8CB5WvoDUYU|su?<9#d+T60{Si9fzJKq(7 zz#nXrR;g1HNBt)kH0kCYJOixKtCz2;!Cenfa=o6VCW7<S2#yaGtEiE<;M6-6CU*mG z)j0Iaa098h0+V(d%WdB*`={Z)lhQ~@ptKNYleIg{9X^Nv11c#S4z8|F|M*W%*@7(5 zu_8gFD1uAC2tZQuCIzQmDZ04-7OwP^C=+Zb)soT{0*T6<eAY+41A`L(-XGut&VXM$ zMFjWpf`Xd1o)i`hID*J)5b1})HG~u%iCc#KWG`d82}W7C2%@ZAEdrPxjNniq!UI63 zggs-}=t)Py@W=Mka0!yKUk$=m*&D?%SRqiyQ03l^rkb+i(%QEEO=CyTUcT{Ay;GXR z;ljgLx4Cq5Fk<x9^{W@5HYc@qLs2QRwQCOX**MyeksM@+X5H)xggnTp6<F%w=A-FS zLsh6b4x)Kt_3P+~R2gxL`C6b7^^6QVCGJEPL{`FG2rik41GAm0+JZrad@y8*-lv5W z#?71d(Lew8`b%_!vra^kl>CJ;fl4XKJIvg65Rf#9N-qIdL~nkBb^syC%eG4PRpRU+ zQZu9vrUWFV1SN@*9-*ItEHOQnBr#mcXNx^cCmj-mR$sy|J=sVTUmmkX3}VIpeT+sV zsyjf596fmGG|=DKP?q`r%XlY~-<>D^+@!bXH#oT)1r@QCZ>LEBWcCOfg#g+MkIs2( z<slDOXq<(w|9iITPx>k5Q(QiMWcSD*W0zX7<#l#-b#}Ma6y+?-CN?W9r9%>}By+Nt zWiHcInU%j{WmRouQRaeKvt~}8I&<+dYfy^I>sv|85xikUB6zD{&_FdnMO{gCZFO<R z0_wJ>d^T+^^>CCWrO^wwuB~r)$6@;50=;mdJ4sLOZ$C2@H!T7}<K}@BTv!93k6d3< z4R<rDKsiLs!@=zlmM*Z2UC9@)Q(h!!fGwTBc+Tdze)8NYeM?-Nu+;7<=AF<LY=J|x z#BlTw=j;$Wdh0eMMEmh^qoNWNA!;us0u|Nu1D&<$lizrO7Ki9XT9FWw;5SekNfH<W zX97|H6uK@E!o_OEND08mh`1z6`T=;)50fjnQi4PNTYo_O7>L-@&%E&WDNBm$I{OBP zNQ^OSob2~nA~*i71B;?$4OoK5SqR1)BDy3o;CcIQ8)@=eL;a#<fZhP|H4uKD9MA3m z3WUA0W$*hABem_>&UZ(DJDhsxGtU1e1KXwtt*WVa(~d7sUwTykFYgYSxPRFNj$4b% z4EJl|R~kQ#hJ@5@@{HFXYaTTu2ummIyL5nI-cThN8<C`CC?FPQf-^*LVU}g2`yDPc zbd3FU-laXnc~}#ck7G1GVQX&P%!rna41XXGhvkabXl+b;X7VaoVf-o+19dW&kcfNt zt=DPnt=J2$ct!6sZI#4l6W2@h>Q-M$wd{r|;poOd04BZgd~EFJ;~)P4Ow#@VaTb%p z762$AbbIGTB$M$^&XwB9VrcDCSMuiCGZKc60ICU%GZavv%o))e$^;(4IZeays^SGE zjj_?z=6O^81P)_va0miV=GDnLJzMkykp6K+nEEt&BcDL`pRi(ZiUUlX`vh>;uG$#l z+dK6q|LETBo7c{t*tcy1secpyh!!0k?M)SwV_LFS)za2nvx=lX9S^BC$zGP7omW&| zRkl2R!7Q5neKuo$x<CaEG1eX-smy|tRps?~Y8%_y8mj2|Q(cmUsrIu^CVxDAL1w{< z{EWrv1+_i+@y5?zy%TZUL!Q*Vf8D)%M@1X83AYl81!xp;p6@u@9$dmRfXkAldfCfY z?$SlhQW`T|r6LrJqDbL9pmfoBWNd|~>N%y(gq~*($le-m2lNy&8+5AoppC}GyLNh? z_wCcx$9;xIaA)}rx=pp0FaF@Q=W%|p=%Sp&Sc{O$(2K{QI(z^=QE-xI3j})lmBb~W zC~+u>P4{8RFQ%X<fi!5BKhZbnN-w=LEwi+_chGijBMQ;bf*}9{Dq}G%`;oMvJRy?e zL*Nuc1F$zFSsEzPb}U$|V0-bfg7+B1ML8Nz4-yDj)V~BVL|_YJ6FkdJ&i`Y0c);G> zv|(?=$8q=+gH#{7EV(tw6>RA%a&lnQ-J5jfgQ`N72oDIP$DK%Xng9WJnoeyPlyL@^ z{FJIVOHslhNqsgv`IZ9Jy}LBPyi5JjZP>Nj11ikiOE>|U)UC+*#BM>A4B!Hl*5Gwv zXitl73cYh!=S;+9rU6U;bP`Iyk!&XzPb!9cfJ&;~5y=tE8NRWN6Rs3Y!|*Lpm446s zkQ7r&0TX_1E+GlD(zM9mp9Gcq=|st76UHi_5^_7eFz3@-bT6)KicA<@PZq;Bp>=~Y zgtxjucJA1+Y5hQV!-_BdM(WUsE<ULjUi|CKvb9L4u61dZW+j!SaZU}};A8hYWvSL# za-g=%x(-{tgZ<<G^kTf)jf-avk8K@>?cxybz>U|zXr;<R({L+ldWMGjT4|Gnxi>$L zmaMtUFhnxcBzy6!sULm#(G-TZ<`or}6c(3YQ_CwTuBf6tNqJLSYXdp#`ic^BbJ>(2 zP5X56<j?126ciR@W#*K3ZQ4hM`Sy2eslN48ncW@Y_T9TI$5d#L1bVFduSmtkMU0?n zfCCi20CsO$R8o6#g_rLtxj1JFpfg=0Qlv9E+7bt|r7UO~)_Cd{uv8aR^7f)3s`QTH z>$V2Y3K+7j=3Ct|IMt%v{<^`ww$eqQ68)ePRQgrG5P(F0CMwBtk~dLt!Z)#4=`oN% zQoxdNo8F`pRT8e^AB8e?U!(F<q7q$9-gtj@9u>^dL*6YI{j7~tQWFmlr_te&>Ju@D zf{{(43naq4Kbok+yJHRSq@2^Iv&UvU`jya?5SFZeB4eX6s)`B%Zzav4bPNL<#7S9M zURlRLxP2#>Ao_?qCny=l{p)MYO5qfMD-mGR&B34<qNL{@^F4pf@I<)a7&w2YvDh6< zIq|^2jdUj3rf@ogZ`}L1xb?Tg4RSf!r+!I*;(@~NO0QhWZv4{g<x2glas3j)HF2RV zp?xBKu4H=ZT(qUXWAZit3rQ(BkM!qRwQLb6xk61+VoFd6LCFZtOG$~yFH|MPZtpUe zbSb%#kD*Fv;Y5l*0W7t5_VinDA}T2rM!zhJ8ZqW$I>P}8D%mgK5O-3DK{6zT%q?{Q zADNmBZ03>${~!VRy#4LWE57=EM$0B!SizMK*++x;S+Zm|G8mGE4pE6D`K2pYDD=8U zA<^x-|F>zldw0LS%k-k-2Z1GK=c0GRm^!+<JDV#CtzN4eq*uavY7VLj0j2!B<;!!k zmK7A2uF6lFIc4(uAAa=d^fYYS#d)+xT$#t0C@85eD{X9UsAjZoZQ06_lHwK1nD$1+ z_9xTkGjNFtm6c8F_Kcss{O?*weGLuz>fYCurzfIQtVw~3%5-TIICKjtMcNL7HvwIU z;)0VoIr25cZ^Qs6bbryT($>+)89Fb{qP%iwQ*ejeilV^{*+byHgEX9cf`&CaEy38e zlc0ut2B{5lJluOcO&d{_*7UZPE_@%ZBq|9vzmg(}Nbse21H#Cjd?Q(s)<*!BL~3%S zBzT)(O7V{#pc2qD;V=l=^vjTy78Ta_43FZ11Tee+86;^?h>b|u9!NDh8f-5LY^mLZ zEAgDnFOv1Oti*pr(uOt4!OA+kk4jJ{v{F%NKRR3L+f=<FVX@EG^>sAYR#en9_ix0? zaq0Ra>JAd<0F}bx?Hf?(204c_r&aPm8=66I3uLY^rUaFchD>vk2GZJ!2G8IJQgj$7 zFJ0x(VI7EcacKDt0{U%=A<tXa$Zt#-BPiLyoBxC+pc!j`BVIbG#A$47Qd`0yP>G$g zl%`9-(ns(8Ed@*W6H;)W=b|<a;F*A>6gq)ZUbLZ9Q4*DeBruJO5N!gK;#TwU%tZDr zMU_m#KY0izDs6zsW3eMIv&otW&W<fCO{7txbyTIu7YFHq_Z~cGUXI(mkCr_M5~CLB zR%T9q<ym`A;>W_2_2%^Az8!lB;3CUFK!509wAeU>ck=W}CUu;{e?dQ2b`fIt1^(VZ zFnpM~|68=;u|JS=+`M|>%+Z5;XkxO4W|JW-_4IVMR<B};Qq%e!$e$zYd+V0t6~Mw& zv?3>iuF=K$X<vN$;s1Ov`J>MkFJ~-eK~^q}19GzRN-2U{Rb0vauc)r6pkp`cRQjU% z^XAT;Hf{Ej9EQb}7FTwR#DV+0YSM$Ja)*iDtVaGM%TXEiUQkD=(>=@qYE56?qsNId z6Y<=goAz9?W3*Yhix*h=r%vOuqssUEC76`fN|QGP%S3V{KY8I#9ScXt9`b9{U4TXI zVRkLo*iMH59TAt<FYap1Ys2KET1w}?_iCbchpr^51mf_<Kf!zw+C(KB*%+!dAymot z&?h&_aVH=NsVN~!L~C9FNGMe)bxNJ;SHFMdT>`k4HJhka0z~QMC~s$VZiCQpY;Gpu z2AHC1;{ZUdCY0OEj3R(*7sVxBw&+G$2yZuhpHJ`{Z8m!dt_T(&eZyC%C*xH0sp2ce z6BAU4ik0<rS!!UcTubkU?FYs$Tz_a14#<eRW#q=<5<*Z1Z(hAZG<`aHTM@d^lHH3S z0gs-AD3J&x0T{140uy@!we^H4X)=D4gaU0376$Kqeed@5OBa|=K-)@^r&}?b(R4lF z2%nY|a{bz2l5n<KYNluqiIa<Br;19-Pl}i4rVC4Nz3Dj1Z+Z$L5oktq<~CZB9{DhF zL6oFPAXoh1L8fGQHsMwhlzy$UlqgDyO@7t*jc<I?5U#VcqkGUCob3qluv4AOJ>I^H zYz2po)INnu^wUfFp)>vyq*5;0%j>j*^zoXGy1Xf`)4AL!FTm2P|46IfU{HX5O2a+J zZm=(o;RyhTFtD;)>|b_voO~!`=^_#dvB)jh%(w2xPx}Fz{*H&vi7yXO-AJvBDd$15 zs)Kz@gRZJ+?Zu5ZyndjgIv?|6Hgls_t)MRnB}EISfAl{ed^q`|Pv_>BSC!^x<*h6$ z$;(_;Qc=zjladNtOZWo{^N`5X)8;K$xN!dLISbMYFbmKyv1`MgV`t7^eZ+wq&yubs zDLhI&>4^o;hxg=5w{PDRpHf2T9lDKKq8nVvE|n(X&H(r7N;t-^U9ykvWv~g(L^ckh zI*y;-?)K7GNCLh4pbwlHMCN|x@P2MHmL9rn@IAYCi2)m!Fx=BzGWVaavYt62Y4Al~ zw+X<Rh{%AbKq|-*m9@4c42(%cCAgAWcanYMQ(zKcgd7DPg-@LJD17YalE<fh^Xwb% z&&{jp875bP#wCnI?hwo&s>HNy&}o4i5B!p&NhB&&3VXVO4Te#1%o;dr6ZR(QE}pCz zd7c|NdBZ5|h*qJ;usFmEm>6DnP>vaZt@Smvja_Rt?LBsmwle>29g0U>q7r6~YcxAO zjWSJw0k(SjwAoRc8K0!84QnONZpAyi_WOb>9kd-TUpsZ~9OFt6A2Er1`+rEQ3w|Pw zv#6Qg4ljfz`kNBTLY7#;{x=c9p(!=$qpLA3TwYPSsxT*g{`8Ok`PQFaW?&qEkw{BH zf504|2lz?&lCm(oiC71;dS1MG{@Hkp{2Tum#4*Vh@!CZ6mM|qgCte9k@Tn)~N*x_= zCHi$^nUfV-t4V(yOxcEKG3yp1Kw|D@5-XNiu!f8$>_;Ck^^V&%4X^2}E134C&rqy= z@#Qx@THdpjSe{j7-8zRbF*XgAPB3ptKY;lnb44H&n@CVPPm2y(#Qysg@a-G+qdvka zeUnq?{5UP#ZI-X67eRuCEM09)bnt2G!W6T*v!Q5NdV0pP+?ACzl|{Lz-s$tFO@8nF z4<=9kWcIS+vQ-7?%L+@GTUoHGg02@?41aEFD2FL$q%B&!h_OnG7S3ljZhjH`nO<*Q z>vzzn=i&L~ANmYp(SHrSM`=KNxQzsgpCy?=c9l*7Cg136A|@f#UGVYhWgdB{DU2hQ zz$HKyE;`DXk0PWd9M>Xy2(zD^TDeWfnPo{}1B0?Gh5AoKmWIOF|9HhymK<ED-M>h@ zkrNS`pcL<`G5ylvJ7J;xc?d~r++6BP0bLV<lJv-yO_tTAs(ty#fos3T*}br+iMCv< zG(-ahAgBf8g5)6-D2i^CkN68PAt3=$_yGvlfLiCRvE%t}?2`m^elCT?@pOfy&~vb5 zk+DI8h`MBLrO*zoOPi=S>TN@sX=q<FqBr1&4dIFVquNb9^#u(4v=AfvX8OUFSils` zl8C_|M)YkXf8;M27nyBBI8s38FEF}*0PcTLC1SW6S1z7D0Sy3&_3ePnkj7D96lqOu zZ5^OA*pC)L&2j@3&2_S+YA@9#O2vVtkI<HIc^h3tD2Ckq>>t^%Y}y2sh}oiKH^Mmu zC%<3}Cu4#u0ZO_85=c^1f+vAYsoWbjH2_OY3SfF-Z$MjHXYU$qD>!|jg(KKKR1P_3 zIBD?30xc<23VDcz0S72AO%x_iRWf%Q2D<83eDPN)pU>&VSKgXkvwjyoHRj9M?n*?0 z!D`u1>A+57Qk$K_jR2f3T#Sot#BjL(L$*XU0JW2sE~rFmr_;Oxx8J!1Z-aM}`t$DI z?zY-O+}@eXvS~zFUs13uBYi3N^nV~rA5TxqD_&K&Y|)b3m8DK!s;Ml_NzX5>Yi=mb zOHW%kZ_eDga~5zdOk0}G3^-7!s%f<uxC=Hbv<1l%cHM+b;@HDsNq6WFy3N{LgKb`- zQ1{{`hM!y{7?vVkMy;cI;SyvCqYEOQ^@ms~O<6#SWJL_vC40dI6w$R(hpaPrO~8%q zig{@SHEVn73ch&f)fcS3W+mFB<UT5?UZ)gnp~=up3S^sH_*8;N557l0il7ZuJOQIX zq^DC2EM-iRtzSL!^4p)Mm$nUU-No{WK8(;B+oy>xszwT)+&T<Z#-YL#7p$JKYv2u5 zBp8udF1{BV1WaqcoRD?PGp8h0q6i>Z*9l2PI5jE9ez)J0qZKezu3OXHM(fMg-VHks zpT2nG$1KTvcW+#ipwg&koX!mn6}=ocfdJb!++X@j@bb%-0+f(wqlL){=c!Qbc$*0B z{z)YRqZX2($>V5Bx;}*^b|~Ss&V0*-?(0gcyE@xxjMvyuUk_ix8&E@|9pxpAa~!Pr zmfm;?wiLOzAWXrO#GSAtrFJiPq$?n$E&0g_R5FGGmCUpSSrV3#oGYIZmHab-N>3WX zwYIjeW}dfsV(8#{nnIv>Cxwl8&~`@=o5xk8j1lT&pC%DpBn*k;c5dFVwzqlZ?7u6I z8JxcO`aiQewy>tG@G%V$=^#kz$&)l_fFJ2aCR@awVc&4XbEaQrpgVIrU`yX?F}#1D zp6DGqE#EN7O0Jg5ZAZN0tRp`>G6-d_tEUaL4M%EA3i7hEvX>Q<*49_iC}~OB!dX*4 zeDD1ar_9eQE-NiapEsZIY^9M~WpQo>T&bb9h*^O%znJmG%vtm1&Yia?jXt?Wv@ju& zvu0%X;o~I24j2}18#{61iJk$~S9Xg=Wx8STcHLe};tzcVD4-(wCOzUM<+UYnVBX$2 z&S*k7n?PeWHf+J)!PY=R!Y;szz-JCQLymLYVhAa4oHa!AP>12QT{U^1|NT`CSym(K z&;qxF8vX2N|I31u0F%HI-+`Cg9sxn4{F0y)3@Ik>Iyp>mf>;4g0cO~s__x3M{j2}@ zBB!Eb{nlN355V4t{Xx+1qOkO0(HWM>cZk0tQbQNQ0Kgzs;!?T;`26G|IJymyyf`0O z!SMxAi2@W>Cs5}S#_qlw7)Dw`@E&oyTSe8`+SJ(8HMDL2I6U{?hHww=DH_mKR`=Oc z90jN801Z`5Duc+7QussD+&C88P)goPURst&!?_`@UcYve&I9~7s29!vkDnXYFJ2%X zJQ&>$3|b{i_(VY@eq&T6u4rb`*F{dbr3F-yDgj7b%1f1Hbl^#!`#B8+UVjOThcTQF zD%go?M2;;{wb{HWmXr$OLS2$7MGKSrs3a_@D`8WL%djrtN-!m`iR;OPrH<B?wk`&H zL|X)K*RBE7Yw9n9FX1@D6N^lkyof=1G0JkYF>MpTb2{y2u)y#j`Q!IMVpaV~Fa3GS zs)1eP-QcDc_?-40nfyG3q0jIw&JZ*Ze8^X?a;o!ii8CKt22*ZuX*{^eKka*8ef8DN zYd0AVLPf^J#n#-veO-@~y{@sXs~=0KYEc1gQcEhT%ZqZ-mn>egc+O|<zd!l&w89Eh z?d%0})AHa!<+b={3-VT0(Ce)rZ5AUar!nts_MAC$7t%I>u>(b=HO;HnZ`;TJYX3-E zg#(0Y`}RE<Ed7fB?gmA1n45ULNXFf~aS5LtUA?gboClLQs0kq8qY)}&a-n>R>w!~- z^b<jw1-zQ=k61?(W+ptBm}&T$n-%wfqw+Q|dZ}vJl)t?~qg7h7Q+5lK-~*5(DPZ3R z9kD0CN@RH|LOi*WWhQ}3KgZw{+BQ@w(8vc{7)GaWpbk8GitoU!^oQ5po0VVFwQkD} zHEDi9eo>r<hbgwV2LicYPehs<=s*{TXn+f-*mhE(hMpx*z))}E;8bUVXoW*mi|7PL zQBX?|YKN>D!sQdDR%H|V>V|>du2xW~e`NPD+RQv4FaLHuib_NRI0HyCASRu^K+fSJ z?$&b@q4-1&dJqIO@l=$|XdPfTdm;&JG8klN==8NZVv^2)_(HtEGozC55$ektrRjs0 z0i0Evm`knhq+FSHcs6(;2UptwBGrgWXiG)8Y4fH|e)q3$y!iYde`gf;`^c#o#yw}= zpZ>SOih?BpP0HXPQiw`&DV!lm2^?H0VM@XhIwPPYdE%3BX@P0tdNNe%q|IONAnw=^ zj)<Xk>*<zCt$4IOMnK%@6k_`>fb1bfz$5oUt@lHM$sxOb>6N>A!<zQmoKIhsEIs?e z^Dn=%pm`I=k>`On8Gy-(=aVp6ItpE|LV|~jVO5H{pBs2sF$q%UMaElA_eUH~|8|{x z;~NO!aHU<3@=2S0=xlRN;EoM_?M-A;8(P}CdOBO`=ufkP$!|1Bs#rxHE<GbFBW?E7 zkEbj^Y7&7KEF~95Z`_KK!orgBD*D3ZESNF%(<z^QK5fRV+4C1JSWJ7|70gnsX<NH- z``-OW#s;eMP|(xUGfM}Kf8!T=jCXl)z9tcexsFU6-X$|}*O~Y2_!9%Si*yY;Lrs+j zHc|yIG)&2kttU<}?!@hY%7@v5{lU8jk5C$V*oqWpYFLxPC(xLsA<T;amDYAtWKDT1 zbW#mVz!Lb8B1-~JV9o>~3S=TL=OrWwO7Q{FT~ML~kfNKaeN~magD{2g%?}2ep8n$- zAI!<C>m8;vFX<p0Id<ze%$so59aBUg9<x`!_^BC@w2LPt2}OFLM<hyb3*0?|SEPZN z)@g0R5f0cy(2@N6&w(pLJtwbX)`KZ+fsAZk*Voh0!hFDC#(H1A^TXF8)>pjUXHk(H z;By9%`<$=@PFep0u2SM)=7+=Ju+y**wiNkD2(lVao%4jgh588_zNJ6*venk~WTI&$ zSyDXRiuwp?{H9)7B^WmfFwr@H_P)6AI)EkGbaF|U5WVSYQNg(9!W`|CZ~xi8CLwtf zYe|>P`13&NF0iD$9cFH$IPB0qib#I(IjegK;|=5!T!JhiD?NZEkV#15^x~Z-Y_ZhY z-m#iaXILLL(_4OMc!ZeMiX#5<62OR%8igfM334Cj54V><A4o!7q~z0lR#*M<>3<TH zcxJCp&hOh!ly?A898~h+#pSr5aw`xCHw|fP;toPKlHRu!Ng~aCi~RUk!qQ`G*B|mv zh<|R~Hf2RSA`T~r9Hi;Ufw9eNSGTt`H&C66<-3JLrjm}^RNgwnjqWAO@|Lg2UNq~A z`8l|kit^ItEy`o0cX?S^anVZ9sca=#jxRp{bjq|ZX3d^GXWoMO3z_*!i|_Kfw*IwF z!CYOLvv~geMT-_J&THB8WK<BH0eS4Uy##Jrt4q%d`ZF1?VVs1A@)A2E&I%NgojgxK z>5MJm#>c7b<XARdu=vVtPO}rXFo-pd^mO9*mmEAaPviu`zr<m~svqjCST^l#EqIBr z^y^<E|0FS70!RsAdVouTLV%K(#3d|6^d<liy9GVM(4>7po|H5LSNaaRL_bSVX>LJX z&-yLf$0&A6cpRk`ij(}#upnAI@+9yvpbQbHdF|WF5h=#7J}HX|bss@fPbd(E%&jYc zc-?T7C+I&(P)R_e)Dw*g=^T<oZG#Cu3IO}5!0+f=zjg2Nb60<akB+(_dr?}qzynd) z1$a`#2OvMtYVQqspU4!vjYOzQm~80;eZp;|#f{a!uPv76ZB)&W%`s332|xpc3V*;7 z9npd>sl2QUA7u~r?q<9Jn3ixY5yz=4)zn(5o0Vo?6a4{}(I;^n8WW(Tlx-}h!jw=X z-$<1dz<CEY<+u2ch|N-D2|$`K1%#yJrvtPCww@4{Iy$;~DKyg7O3{%Hfl)iAl7mGE zN$L;?eW5+Pdi!C>Jfg;M+y?#Src!sZb!2FDbMc(Nz6dIjhWpEms^Q&ei}d_F7A_@y zN!%N6&xMPm+)!s#lQ<YC`?&>uVJxz?`m1=z&`rof{NLb`JmVIQL`{dJNyybk6{VBm z*7mmB%%{D*gMRg`O`#at33tVED&w3gU6_}?U_oYnLEf_TxnIntQzDaps>(`A$h{Wj zr7xZ{<MYoxpS3V;$>N0z=FeZeG%I&`F|rbM@Awbe%W@XaBd%MtVBxa5?Kgi2em?Yj z0M>gBAxlsRP00+;#fvlv!>R`y0sZU-d;(q|m8ufYl#{{H0!-GBNpNqth4!x3>jz}< zO`2)6E5&KE-Dwe`(%SCooM~^rCMsETB3Jr0Dg|9iQKA$gNtB$EJAq0DZ;_l!qPAbr zw=m|d@*(jYqLQ(l;*#<bsPz7vg1YW?^fAD=tM?YA-dcMbIwHWZwdn<d6lM!-^1G2g zgwG?GiBAv@fz}4sK4YG8d<z)BH<}Md>IaeH0?kbANtMj$vF6eK2$Ph)nV{U=)i<<> zRu2~*W$*r9H;ODisB{*ak_xIL!Q)17R7lQku4M4c@6WrT;jxXJK!ZDgsNyvBxfJB; z`LMYt(@lJK3Q&7IC$<AjIJK0#RlK**5)BT446K=Q-P)w+q_wrBMb}aji&(aVOQ6;c z0tK|=`Skt2(=vAgk^q^YOB1L>3?~pxToVu#gbB<Nl}N=-ppq;pbp=J52;G7(flN;n z!nLFDuA#t)B5Y<OuV;+t=ob3=3CZ-x_4wJf1IEN_$6w;M1BWQx(G^L&?w7+quz5Z0 zyBEG~GtTFqfAO8gty?UB^A2!s;cqp9Lw7~bQ;)@ajLYwW?{hA2>_-fuu4Gt!(?YNx zaXS64W$~yF0XwQFVP<*^&(N{vjA09<sJpk0tX;jjmp(qdwCnDs|7t7!vnpsIke!u9 zJzNema0{~27NuuqEL}8b+LWoYGw4*pK=0Dx68n`bWMt{o&u1*m$Ys35;)RRSvurs~ zURB#bBmB1d;>?9}=geEUXwkxj%NllGf7Gw|Z@>`U(j&4pd{&1boheN@)0`IAKW~ z)G#G<J59xEN^ESXMl5l51fChTDtfoMANPuR2+0zUL>1g+QW%&JUF<jmYICQHN-W7h zCHzVga<>FY{P7{c=^Lo@-=dPh#Fv!0pOPdcNw;Jkh984Qe8spe-o|@R|KaujnFUt@ zl@N*!8`^+M+7GRm;kQ+lmwscGrdtRw1;B<P9`y&tcBq-;<bh+p0WeZK1H06~75S~5 zx{pd~qwaWXr*`7g1eM6@?c9Y{I@I64x^G~3>z<=${;f6t!CkwD51YkBMu*i-02c-r z4hoI;4ql39AOk|f199lH$G%c|KO9Yd&Yb1crhy5-rpgD^bKIHg8DtI<zNp0Ctw=1R zo43%uMVkP)w2`hfLxYSINE$mgw@|06ol;z?udkK$7v-ie(6*$s1iZ+5M5SO$Msaeb zU`rFwq`MNGDLj_Jm*U?9_)Nf&bZG*aL?hpi2i`sjDiOIbyJi5EG`wLglu3s`l)`b3 zU`k*Q<$&bjtTUlW4Fp*OlATP*ufl^lYj$G^A70Z@o%z9Q3{-gTg;zez?xslF{?ux! z9$YHj+@bU5uW$wkN`xGjDSvY^si<@V^_H|b(h?-#mJNj-+~=S2y?YdP8^K+^eC5LV zOE!H!d4dG_{=GZ4kZz&~bi+pDbIki4Ep;{JEAz9LE?%@GJtHH138GNi!bMB5NzR(~ z@#HD6rLyX}8ivv@OJm&kv}uUlGneEQh76URx134T6*Liu*(YV03ue!rw{YJ41@qGi zx(+?UEBphVtH8?Z#7lPbI<@4ul$4M>nW^4X*FJlW+BfisPeY#|L2hAa;Ynx_J3+;j z^dl#=`y8<eyu!7itTC>(M3)UJQX*5nk&XguyKC~MzvBQO7BP!3tN|%qDL_ewWK4Iv z4@s)vpixjI({w)*l%nHz@(|%$K$O18Ux-a!Ql?P5Uw;o&T0JZ(?ZrgJ`WZh)r4rG$ z@EX4@Srae1$MPw6dW>2-e8fJuM@al~3Z5g=3(ne*meCDxCNi$5{CofcfC6BXxjA%+ zeOSDi5sf>KS?AmE_mh;{wSCiid-M+sjqKWg;{2r_x*n-KxpnmdRnzBAD<>JiNtQT~ zIh&zM1P|U0xgQ=30_xC32tPE7v01ovoZQ?~ihCm_CAi$hUsH^bCF(E4r4W`tCHuyb z0>}T1v`eJJFWf~X6=y14&0E`;1Jej72}~6BAw4Xe_xa>^|KiOwn?|@L&S(-yK<U{@ zD&8S@gF<Rdx(~hlkQfe)+<z80Gyy*Mfe1_zvEqw7JW-cinv8b!4-Tvy8Xl&jAKrZ$ z^D$R|0|QqYuLtfBP7ykaDk|YoBS;69m|>#}1k(?w<s{DyLp^o*Qx%q;fBubWrE7QK z7(sXR0FZxkx-rn?43P#VCHggRUGeeCCCQS}8-0&&@Rz`Z&O#5LcJl+a?L)tXs1VyM zt+Cn6{GTrn{>znUcY^@RT~7t<^c2F9*3(w6T{|mn{ygF_;xaI0!Gd|f($cg!pM5y_ zvpMO@8C6+Qux$PpQ>RS*Z0fWbGZtnSF-;&lha#1-N-nB*s~K5VTe587{KXmRi{{N; zw5)dX`NtH^Qvb|#e}l;P>TT0+gv64iOE6G+jh&}y6&G<E?s)*q?3<IJNi&RFZ~{af zw-!sy7ugld5_<%^BGj<gN$i%R`<du%LW(>&>5ny?wb@f~1_XZxl|U2861X%WdCP{x zAs@Z?km0y7Blo`?ll!xur%)-SZtDqvE<H`N6F><2Q!piiIb%bd0k6F`JGZ8L-6rI2 zi`P;y+&Gyi0g5MLdvfFeK!;sSe>>@(4{U3CT0n?A2#I8Qy5r7iKI)7}KmdFq?nB+N zwuUw%B*9qIa3!`qdF3$zIRI$~by5TXPSzdh9~j=WZTG<w=db+GqvRedm|BI4X5BDr z^FYQ~{PZ`}OMDb?^^gW$A#Rkw7=;jkP%S~?;Y&{Ma~JS|L*b20_LJl$^MHHQgTm+% zO`g6U+#uBMEodzhx;H@_%944w4(iU;M_ZekTUwgXy@90~Iueq&Su$tp`+t9vu_wWk ztPMf>R_s<cdX9`+01+4zEGa=GFiB8C?)IDSJC*`|?qg6wktQ&S?A&jD``afVOI@wa zoqhcSYnj!zPFNbjNER~-X{*17WTfHjHfpR<6^Yo!AiNk;>B>$hXPQ=52&l!$($`Wv z_pKL^#U{PIs9}@0mSey!4GIEY6q~?lxnCFQ$Ot0gQo7(6cP<QpUc@D2m2O+2`j|WS zp@_s6?%lih)mL}Xu+U;?k9^T~6YSKOXQ~qhmb`Zl$7LKlgR9$VvQt#BZ0W*za~CX5 zO9N7@C0Vc}BP)IJ7axD{(dV<57OX5@k;C|tk0ww4?DOd}=Pt=BsVHBue0kBT=%HJ@ zl8dQJjWjtat!bh`c<#!^jmMwR8E_9jmtimZ7@FwS3pl>0BTU>Cb~nKv15@&pK2Q4$ zo*r03J7TZX3P|V15nI@f;paZ2(tW~-KD^-`5f0JokSe0>+t8GTht{uK(^j7T$=_7F zmAik7t^|1eJRoTTmWbbkB%`>vlI)w4yB(FwXJJI9+N?z3EvN(}fo}dFaVWkVT*>#I z{yh<#1t*TEqK=XX43np}1)c$C8%RU1iBqT9^Q5}aZ-8BZl}|CyE1m)o9+e&{I_5Os zgFG)3G;{}`30MlnS;pinu&_Z;^r{%4?=sq4h*UJabHo6Rn|ACyeEPz*9|%imeyS75 zrYv?)i3@-vwIVFV@2}K%7Lvy+?k{2c4fSrsE}7g>=LV1)wptDuo~+^+V?D5_LllUs zt+-KBO0LZm1cFhd<PZTdF41<pr@I4K@*<XNZEbC$R#yX4ZH*IDvlh?%)ZUaDJ>*KM zAkIvjdbdO=E?rBhE0u^Nz6(q;@VlS?pWsE`dK(hBu=E6|MEkSuzBOwH8S$`oa2=UA zfN69qF94_nZNwXZ2DoDn5uBJ#@f2X=ss@xGog_Dmd3Wy^9qw<hSo+S(aHW?g=XKM= zgl|-<3{YZG;H3<;gRuF$nFdR8xp`Fn5V-l5an=lqxTA3_>E-b#gn7KLrBF#;!Et7M zLm&|DLf3@48Qc#L-m-B6b>oe-<;5##1hHuTqO_$;(-tjQun^<YlJv~1j72j({^*m> zrq4@XmYu;cz{wv>{%rc}d5ba%N~=+t?3NpomGkrS@(arwLH#vDBily@dV1DwAAeGJ zHxV3)J*{(jrQl3xqgStxK%gKu<OsHc8aJB~uV@?y2;H{OU~isaYn(pIm^kDN(px;~ zgU|{N?$gQWXjNEL7dmz${OZr6V{CtG$)d@BdF4gUN|qxLoU`8GN<o%<6pZczQi4jb zC*!viDxoXgM<pUT;VHs5eoTT&MsQLkLOD?DX}FT8w4UCmgm8vru%*CEcpZ-1(;yJ! zLw{l<86%qGDKHifU0?VDyNrY`n3&|#(h}o5e~!u&?*Vk6GD0%Yl-zcfE7Sz(TX;ft z0;q`Rh#S}pWBZSvK7Z{8N}XTdx_VVqy66ePD&yBQ=OA*DR&Y)UY9{Z1N@V<<3+UoA zzYPE*HF=8gJCgGz?Z&7XXd5gJv{dV3FNWYN5P1>0@fmW4v^UYlL5qjgU0q!r5T<r0 z6WA2GH@HMsRivf-%!M;PepfSPz>>mJNK1cY><O}xsFaG}CO|3abi&<N?T&zt!^zT; z@Fsl=j{LyH9CiWzJ`pP6p=6%xI-2|q4Gb{Xb=V4Q28MCj5JG@PW}^GLm<~mPB$@8u zBU-7Nh_fg1*!EGp0X56sfA#t2UU>cU(!rgIh>$97f2=3cp2P{suq#lBL<50bT((vM zk}zlJS3>5tfsk1^D8Wxnm_Q}6S8}C`ELaFda3w~}qTO2-CNAxFG!Fr3UwcbE4FPB; zsic&dnU2L9NaAs6c3yVcj87p*pUjxIXwjU{Kl<SP$x~*|U${7Pd0A~;#i~`MrSuQT z&B@No%gbM0-rB!m``$yxPMu&Q96x{SyMXG`y!S(mdVKR&w{cPeOt)`^wfovt#JaQR zfhKo=0UQz&{Z<(z2KS*=071_wwjv2E0vnVT66$ONlId=S!$<ub`xYKS#u|^0ZasW@ z)I`$AdSG?qirMcuuU-ZZD#4WkP6C&HmO>@LD8MNwQ&_quBDjeV&Kw;7(r7K-OR$aT z4zi@GltLw7>34d&tGkA%FR<K}ns7ThntbE;=cxoHVSgiy3L|untEqVjLB>XaFS-)W z_5>87vH)BPnLGwYhUBj+;xN!GFN)6IoJl%g3<ttWYN%k!2mONEcmC?lA0#e)jfIR; z!XVDLKv?3}LRR8MRt@vl6<8^gi@sL|lBT%fOXy4pU<hfpt8_8?%Me$>nCQw!Sk2rl zs{moL1ai2$0VO>=v>@V!Z9;k&8tm_<`&$n~d^)lGbhNh;#94zv5LZhgjzsc=Ye|}9 zfk@D$KZr_}<9<_2B6LgsyfBF`K$epLE~t_Z$Vm64ZNW%TN?pIPnZV<7C0HK15-K;n zLD#OKaq*CymK<Y90LPiR%M)X(AslC`@{4^TuuqUX;G7|pv-*6`82gxlshr8Lzwq3o zH|NxDz-3Dh8)PNmD5VAvz!|~CT47Wy^`loHOsKXdxvyTraziwCoz_8o;?CVW{`skU z=7LK2qA6-+<Q74TK>-0g$tj+SAwFvZp@F5y*d?sJG?g!<MN)1~Zhn4lRt9o+x~P<v zQ?xR7!L(04q+a*)S#xK9KG}EXFmr%9lxpHWMk*KN=j9a?6)|S6xTa&>cFx*!7pZb$ zj=;m}X+Rr7%<n?hcRxc2ckd1zS&iVZP$Jz^c%|YUKx_1-oWw>odLwLe8=o@gPvU_l ztqj-*^A4L4ri(JnK0c)ki(rWM!oFlYC4H}>W$fUZu9}>w?@-q1G_XJZ&I!6kUK3;~ zxRHniTQY!4VmWp0|N2j<(tkz-_cJ;K(5X@&Qqm3+0P0jkfb?qOlS!Gb-|@?*fA`9} zGqNi?*KMY3mQE(Ii1aTUcRr4?(rG-Rr$HS(aL(sMWHL(PbL@KmxYW$aL&Y)ck^sYt zMR?~8S8fK~{86YnIGVWYv|k!yGAB=cKfcWUc2A+bh~_3@JO~R$#{*wtyuNzv2f&i0 zmbP%fzRDG&v7~FL*MMateCP^|fsEJ^=K=$Rh^M&(CH~O5A^0oz2)6)cR)t#{0*%pj zh8&@Fa9q%N2Fh}i(3O(UV6U{{l0Ab_y!-k{B=-nRSgzWTmI9XQt7!vQl+BR151Gb9 z3<t;rEb$H>7{5gTr?kW$uB6nScdXJ)m{NjcMt>n}e?wP-AfY7%Izg0v{o7yv`Uy~} zsj0PdHN!^<TF~|eXiDnPd4*r{5U5JBCO9n0H45PY4=*zQyn2`_xoZ+#pqzEQaeaSF z$<#OLLitvD%gD|>_$zUaaPw&kdi=DZzoc5xgNMuXDFYm?UZqXIEoE-NDU1OsOiCtq z?_#^hP03FE?zVi)&(Ls|d>;@f2(oqAv8-@G32=o#E1YpYF)VpxU3U|cxJ#i*xF%Q9 zesWcDL3U1VZb42KIum+Q;j+1(eLVTY$)C<xm^JUy4?g&0+RV8NmSinoRY3$-w1R?_ z!d0u(yUSM9b#K_sbdz)E(e$aPlIuM334Hx9))f6M=&+=3;_I*OMEf_GCctzRU$+TP z*n{OI&?9tSgBjWcoQeeKadJ@y50d}k3A4?CBS`{>vwAo8CUGh$y}}QufJ0MSH^?>A z+p=oW<iEZCB4;R-aH7(0#13lV1QjE=xRNMNToRbTq$GY*TT)p1IZzac1e%48^b1;5 zCTxqJ5vU|+dC~Ok<#)eWR@t$3bPKyN>H}Csf)ddtutcoJCMPN)M6*YN9m=Io2Cj_8 zgD{Fz1b2c`a28Wxlwbl1QKqc;%?~<3xP)Yd?2n=>Nj4is_(li^VS(lY-^UZL(7t_~ zuBf6{Z$A3g#eHS601n6`pJK_h15d~sa#P6mK$OTx2unccS;7bq691Iv#KC=s;YJ5A zLs+F4GZ%5*5M<L_VAn1zlw8aKHc?3Y;yjnF2;Yz-bZ`DLv&NWvXmDuFz`&Z-z5RV% zy<J_M?VV^#mY_5?;HRWecX@W&tSSG)9kt$?D~aGVQbLxXOI#^YDM2QoiO<vc4Zmer z1B4`KQUXjYiR7YhcLZ(<-8R|cdVE-7G&x2;$P!)JVSmU=(O=2H%^Vy$HgPPR5%HRP zg*jl)-lXK31BIRpMCSWRToCSV-Z0ovHv6p?C%ycS?5=IJ)gm5BvLS|W?2nVCML5u* zw7LRt2WUwKi;UpB*tAY{Q1TA0#Ksere!xO_<SxJe#RQcCmTdfCbkF)`VNhp*o-nop z1eOes4E49wG8>oH-8s1{N~>yWYw4a;QnGSYX;}%wY!)reUs;s1VESjDd_4KnFVagg zXH0(o<IiWznzv-x@{+Q$vXYf63TPNmRp$uHiqe{n4P%F3ER5CR2@1H6{fr<}M7F#x zb~3qXv`f1vL*R&q2}+&LaE8c@kPNDH{1`QGs@!Pa4zA>6R$vNGH}M?WFT0aoi7^O~ z=DF~KJ>*j<{4|aqqEY`EGH`j*|A8O)1sl=pSF#)BQz22ymqexnmxQChBvC0qDFscz zmc%0e5tsi;OiK`r_mf^r(xik$J@eAr({d}@2S;!QFq;TQ&I}8E-9eaiEm1*3;vGN& zlDKecAt^-!Co+px7bqNnj+5|>yoUPHsna$)0t^(Hxa+*Z$jHg6k``cu*v2XA$)v;% zTJvpukI@vY>ez`h7q0xfmZB~;E5JD^geJ68aw=-vT>i%Xx+HvfOVr6kT>c0AWI}uV zV`%S&Z4y~|5}j7UfX+c-J_)9TprWP{9e|13@CR(gUPT)zKdZ5lvf|-kb}};-9K-}) zTD`iX1I?Q#4$+%(-Ac`rNK60x>uZzj04FMuhg0eHf-FIdQg9?k3W!2$0<gkAz&8tJ zDNGWbQlJDRnRWw`sEvbA$Mx7`iH0oA3?Cg_7gfjo43*emAsitru*8%TFo~CgfvX-N z+#mL@Y}b$%EnA_Ek}0Go6yl-oszq<VH0jk3m-p@9#kKVxXOT;Q*B)X*s|E!~j;|}! znn0Eaq?{up4$)gtG~y2}Iv53Vhw{X`cWiS;&DVWgd9rsPUvMSa5;Ik(dBNufC>^Ec zkZn6WX|Q|@Q!d_CSIW#J<F(A}0@{=in3KY&t-<wCjbONpb^t|ri)T)o^2x_jrZ37* zpYidBlPNZto0bDAVf8L9WaK5exBBMhx~lTZ)^$4%8YU680>M1DA5(&!Jmq)^KxiPz zLMs{;D!*}o<+>_RmLQ&l3$ZKNr>9RcCy}V-jHpD|!=?s;l5{8$jCbVtQCgdvq=uAz z%x1L)Zfqx@6aoc(plNQ1LeW&Rc=B7Xp(=4uvIw7fhC&em1c>2ppwfL<N|@4pR5AfK zk%jx2`jM9uOI-3H;OxGzG(nY^CGhs=%PQIiHZkQl8dhL|1d(7B%49wni@WKO#xEXH z8gDTzBG=IQPSO~1&Sg4Ku+n&897Y?mGkH1iOA$>$8PMTXLB@fX><5fYE{9RTOn^8z z&OJK?$MXAd6TmaiU;ZIv2|F2uiJ0QJ(E84u=662H&w?h!WrhwblX8>43ePO$cU#C9 z!imG7eXBN6Ewdj(pr~X77h{JgLk@W22;~o(Grk~|a>gHV+%V;=D1r>D>g(%gkY_s? zEjs6F^{y!|UFmrG$#4JZl^{!r+8qfvkS82U-v%X^Qb^tAU=8^Km!c~G(DY4I3P2K+ zh}|eBGR^w<sMHd|(g36XFc0<*K$e)nM7vR+BY?DJ3$Fw?%&5P;2aj0pNIx3*5@nC^ zn(<DYuiLhatXo~T^dB!zdhL^vfgSK+WJ+B0+)k6vAk&F)P6-#tc}h*3wHUC(L4Wi1 z%^PaB7S2+B0yN#ab(<{yT|UJgq_M+8gPI=)Q}+~!VJqaVXcw5cmFQZ-D35hiT<hs( z<Y8AwV_5;1v=r-P*0S6cmCeY8)D|^0H8fZshg+avc~MdR(z!FHe)8$3pU+w}f4cBA zb;jH!xhqOa%fk?!o40&bO%oXqW-B+X*|zUX7G_LNP)57;Jsme60lg?uC`sBHxbC3W z1L9%s=4~iT#&DP5Oq|ZJ2lXX17L{&CF9iUJL8(n0yIYu2IwsH)m1Gjsz>#(0e4*DH zW!i&%YpA&BXsM*!B<ac{CUF)<djF}XQYaJnGC`JLOObp_JOPQY6y5+yl<Y_t`!<I8 zPx*A{-I0UCuk_4|fB!taylsG-3yTheAvU8Vh65@DQn(-W_(75`khbs%2&{gB=YGb( z?b0Ps`kDh^E^`C|*BpQtx)7gGpTbrenJ)Vsk@nI+&84jpY?7`Vp{j-O7pUXn^b$On z6h<58N8G5?YGjg*dLISTAQOt;84qPOCFC!~Z#<G0k;D0=IWtHrl4qcM1K4ypP)S${ z`P+k?Y#<tmMS8|<Y{j^E&w$P#Cb<Hw_-weCHkn5s9wwMmW9sd~!PMGnF9C{nBN3Og zWcHNz-qIcr0h|*C0+v9fxRjJa=uU(tIFw&TR#Y1IQd0^@dVoqU4I(!xiFjj?qj}cH zMWqfRxVAP1Z>=?c!(fl>J+g^;0%&PW33E`P&l^iAK5rs6q)@^-P|0CT+9bJ!n0(-m z^vddQSo+UbCcQDWVjbOeWx<h7kS9d~0*eW2=!y(GIw*R|BZ(j^eRcaz>^K<GZ4+=b z@TSYsU7DJ(9q&^3g^=<vmH0;h)4i|0W=r43+btquKs<Bq#DTGG2x?9pZE0x6qu<h8 zSDK%lfvTO6Md$9~istS$Oxo&XxDw|~@hbX_78I;liOiHXXZmMTKAtjj@w}PSaduCe zIiCq|B@Bow%FVz&kX=yTjG3*zx~8djbPR#*6pfh~LddA*8%%TgRuuQBmF{#_NfH-4 z4>gH;8OG3CHweKb>@`7vFZ8ng->g3&L{`dYD`?VD+x7LgGa~gF$FXu-aD~o_;D^!| z&Q@q+q~`YR+G3r_$R-Y3QM#+6zIf5(H(%0p7ofzdd-~T%KZ->BF(msXu#&=>Z}<Te zy8r7xy&z25EF;q6`x1#;Fyi7L_<4TTFL5#XWBI918Np?gwd18A`L&-cSu{l>naJLD zFt!APzC|)Z?9-PoA@ma`!94&RbSC4rD_4;Mu3d(QU-byQeDR9sArQf38i0uQgt5D5 zt<&AgkGO0nfJmVgJcUXIi2RSlClWRISd<kWdEKMn-yRrv@W{r&$o;?3Sq$jJRz?vh zX%E};MVl`;6iAClfD0_t*J<Ep1SfG)fya3c9@#MfNK#iJ<EC8)2x8;;G3}xJ8pwsz z!d@KRII?l$#&x)Xu~qi=uI{nKlbsG(s;#LgDac;*#V7y3;;qA5U5N~w^|wTDfk%=h z4FYJ1&*7{Tkkq;-bR_{vWJ*$S6Cs>hw}KM56ct5UWgi!n_+?vL+I!a6V6&Gx(g7x7 zF;_sp($-O;Rb+oUYi%FhF*Y`~o7~$zULb&()pEf0&X8Rm@P9M=dGm(8`h{=5^5UOn z)NaK1ZEZI7NXL$ha}=C7hB08A=pRk#GJzYWdhQtq{w+5sg<VXuzIzuB&RvU57-Azg zfG6F7-rNiQL<#uctcFJ}6*T6r$Xg}#E%v*{+kNiTk^MV2t?Tb;m)_F5uezqbwYjD^ zm2b24ZA*LK5Jvu<wni=cg$0HAx!GAcg{7s%`I!{tQf2bR!iBVZqpK2jrM!ZbrDb?R z7B5&tgQcRzcCfClqPBg*jsw&ZK$d_ElaE)g3rap6{>CCFs|NOb?-NYKZ)%poB-JE` z2!KFHW7sEAFA(U0D`|Lu7F@n)T_~G0%+3ZM#w%J0K`1`78txcMKOY*Q7*%tgpE5Uh z(6+%?0vH>zcEI_M-K}*wGv0lj)r%#-^a{tIUP$0W2}m?a7?8*m)`0*1Z&PmpNB{93 z;1d6dN+3|gY`;iUC_m=1P=zo20?`REJoWQ_`P6SGz4cjEdD|evGj|ZdLAa^J(7lZg zL#?+l92X8z>5<G^AU=07P)gl~QX&{qye<Y(moKXlpcr6LgIMt|)V#f5DIr!J!{U;# zB}&drda<StBD@{Pf(c&|@ie!cJ5R4vu3L20e#Bb4caQuHpu~6Hyg~eU=C}s}S~=PU zzZDpH1<=$lcm5&)rIHiR&f5cPLySfEh;-ZmauN_l%O`LvnGV-JsM-yqO+ZOR+Qr7) z!(>K~Nh>_Jkl2QKFrj@TF|A`?cekr9N%$LUYp5vCrv==HNtrHSqp>@*Zd4_7r3m17 z5R`x>HSlL?u0*aws+6#$K%|5+iA`L_Zvjf^j!-66iPvMoQYc|q1J;s&>nDO6L|7Ri z35Slhg_><`5@3^JH|a@YwlN}Fuo+tbr-{vLh{YL4Y9qgm!~J!0-g@b!zb<SZ^|q3} zFw5aaa7}rPX}A@X>{1qS+U>}S0YnKbX$R1$lz`Gb@^IdNJ_b-8u?~LFm+lx5vQXd` z5NjnE<i>-$Mh3duTI#u1l@;X`HT6v`tqtYNb22kC(lfGFHsIu1%TUs;7K9}P@4|wd zW#~=$WZJ4%=4LFOJ9F0TISb~^nKf(f{DrokTu!^ClI5V%ym^ZlPubeu+E`y*+qQPg zKK4~O`vieY<Qcz;jG8!<U=gC%U2~2Pxr}G;fYJ;)39=+z5|xPBL?z*f<JT~S?9U~( z5G4*G5@8xU5T-<jVt`0-iHxK1G<+jaNmw#Ng=-55!`WLX6XxF_|D8>xOFsGQi_g)9 zQXdMKBrzA15?%u;!Irp^xJ<4DCJ9Ra5j4s7_&880fhE6Dg2cD_-9e(v&}kTueevd3 z&rJH;)J!5c7(2(GoZA8co&$Ik6}N<?fCWRQnBb)+39XV$JlG`UoMY=>M7ab&to2UV zB;nMJ8z45tP9Q;O-ZpOG72;<HWYcX*sd+DH4}1bZL!^(<)gwg%^u?>oDR7N0&UcvH z{qTz}#tH>$5i}U2w{57Z{2Y516IzOxf~DCBeY^$|K$G&7KBe$3ain`4wCZFJT{!?H zkcj|}s7-an)&^Wgc4TSjxoOc1Z}wpX1)idlE?EoC7fu&osjH)%(lVkrB=5?yqMWpu zpS=4Qs#X(F3NobB{SBczq;5jE=Y=epl6d6bBzp5P1xSL@1T4XnSR_gO#!7iiR6?Dn zroFRo?a%;}y>Cr|N~88i7)4RyWza~5bqV>1s*`;Nwqb2UBt#{QgavR8y&N4`zq;y+ zzr6VJ+e<sPQV5M;hYKi1QzC7QM_m#zI?|FsK6P9-ZlgW3*9^}{D@m4QP07ZTDZ!tt zuDH)99=;C#{a5bYQ|1PdSf~iZS1!A8PafMd%0xn%0|-f#RaJG(R1me*mlot^FU!ix zujyI0f!@FEZOt%WBl49v12QslF(uVi!-LalOhOlch1AF4{?5#%t-y-HRan)s)6*7# zN|jBm%_cq?dN%G>SQ-bK(L)F@s6mcQ9M6(xn*90zk6wuH2PUwZ*C;f%yObCEEZ85$ zz=UvguO}e5sH*G6LrEnW9jPW(J83xUOi;ejQzT1?Q`)r9X}OYe45&nONA!R>%_%oX z60GIb-EDORv)_B;1wbhzg9MZksw7>CKlgD-!6=1FL6$;S5|vWeBcF-@E>J0=H-Jgb zB<B*960lS4o*ruVmK~VmP+4#<sMCjfPYw;DMDJNf3F=8AGV?zfD4U#!4$TJANHY+* z3aG>(BxwnF0?Cc_czO7@+TCF&=3#h&z$Y@yL~mnbbP!No!uEa?iciA8pNsES=!bEU zT;T3K5|+sJvX~JuZ(e8a`bjGdPf6;oT*ihEG!X~J$;cvv*80ET8{&>h+C(ECIM!20 zIR+r@f()_yh|v&~^a6lOU=p8aK(+N15+y?y#WAyXd>eBzqNcO25APBp1-OJfT3b=N zJahiE4`R4LC`zCbvDySrB7S4YiK8l`{0&s1R4z*35>Nt{gr<O}`#HGe*fM@gDcxb; ze@s+D0&519dIwSLd%An5hocnE=9?q*3Y94)7f%_RDL}l_*MMiunAIa3F90+SGj8TC z)$Wc}Q{Q~?<##i?w__WIEYa}Lu5aG_PyzrYVsuV7rkTL1Jx@@6;X#N;P#NDzff57) zrUWXvM_mBlzgLs({6ii|T)99^znK`Jb`sI^*r6R8`rDcVlq$)vHPE)ZXLWCPQ+Y8i z$b#~2TA1?<wY1Kvsi_TAVz^RXX?<gT6}&0iEL}91<V^+>nwGDiD{eWqkTSlQnN?6; z*VNotTU}MvvTi$BIQ&Dh6Xc0#8t=kJ!hV25u4O)wDt_lFnSB$Jhzxj<Abe!sBz;O` zfNW@|(j-Ai%k$Y7lE_h@QGiXSaEo8Y{FCW!l^M+geojf3#tB$-Sj&M*<Zuuqdb-*h zOEadt_0qGyBk=}DiaHVOjuF6_F$=~-;1yTUB~U4%H^`D~N!pY`CE-U<3a%s?#ousV zqIL&K0+qz4r}Zo4RNxF4W%SZM%)4P>Kn|86!Rq+U0j1EP$!aAvmFWB?+6c8s@d{Jy zdx;XS6b~j+jHu{fqq2m!&t)nA4#p$(fe<HZP&i)q;PYm>j|B@vPfBp6`~W7Xm=%YR zFkp{N>i68F`*$t5iv-;)w~Lg#fjacNLR4bbF#<e+g13!(r6pYzkO&%FVxK@*1*F4( zF`74)GGIoK+0C_wsVxL>?8q&nqx3K_MGjoWS9oByi#UccR?-Jw!bNDW%C+w8)zGEx zb`^!z=KAXLmAPrNKK{pFUZZSPIf+M6Dd9>+a3GQwsPr6MiOyO`Pmz2Bg@Pmf?wRC0 zSyEi#=~h)T|K?)R$^V#Ksf|_#1TCGt{mAvJyDf-gi2G({Rc>H%yG>F@!DQGG?2uTE z6eaA|?zrF*9U!=O94mZnZ0FXk8;9CgeDuboSN@sTv)vbn%596cSxjmexTsTUYxd-o zOO%&fg(`tccc4dDX1S4Z#hs1!l$rvSVvl}zquyTwk9tRO>h7&OmW+8>GKTWPLU1b{ zJ-l<Ip9$X8l~vVsjdU;X?(OfV=w@9{6Rz&M-p#wmwr}XFudLvzvMpsy*ez>na|C!+ zCXJUeGimNtP*9MclSA*4RprI2Dr#+K*;HRqTv$|I)7a8nUsGAxFu47I5gbP{>e{(; zgj?5d-=f^}J5QS57wY&ugo*j7cR<!_*LfkBYDX~2ZliWkq5GN-aS^-`%!CSpo&*LG zpV84?$DS8o(BWgtB|@Qd>}gFi@G0%>s7jo>sNEJWkddWRaCN~fs1lk|0!aZ!EVd{e znP5u6a<n7;{O2G~f=d4(Hl>2N2WmIylkh1yl_-U-6j+t$N<b2z6g>m}IWrFz<p{D8 z-Ebm;vsuY;+L@pxp*jN-r!Y!F^3KxgnyGhjvERwJU$Ddx4+d<6G{7BVULSbrU^ujh zSMfe~+GlMr$d9xL$CrdfdX(PS`}Xb*Xxg>cSkCefT}vmxdGJrK9ZXbt{Te~s!xpBW zM|-fh!!-^G@l(?Rza+HwD$W-(bO=mz(&hggx(3)3x4|}c#2I$51DQD20i^_%{Do{# zPK!mt7@MGB=W@);UbZKsL3&3rk;CO6QaKHX*sqwIH&Hb-$mS-B>*?$wo7@I{uP$Al zG4C@Pz`YbLt<C%cNgz-}a6*zyNm$~OFHkZERRWZfsBHp=D0u^*EHjZX>Ff@rTTnt# zqAuyNQHema5r)vwWk(?_SLEO}Y#bRG+00CV&5?a0{kCflB{<YAlMAqjn-@viWVb5% z@PNr)sNEaawiQf%ZPF|6<@eI5ntn0(=u<7bY~o{^Jua3EM~*E5ZhfV+1V0E=@<!ed zXTFI__fmKNQP}g)uiZmSx{1PY{RZ7q$bEz%AcRX$>Ga7%dq&rGFmefCrk=5j2zF@W zD6DwrR*J>9>^XuMzOJpBQd<VLuVP&H%A$hes-}*%x>d|s%E-yj%O+}L>|0q$L4N-7 zlJe^6sv0Ej&Mw$;Lv@ASl^PoAD$8p7w;d*8;wU_Nf&w+b;VM=L<agnRzdpu;qbjj8 zaebFCG07enVmH`~1=Zd_f*mIZxT$&)tSO!#00r=BEoA4Br*a$V&x%1zh9XJN*67F- z>dFx-9JS~Z9zc3GB9gA@lPaZu{MVQN7~M+(j3P~D$r?~3RZ7TG;L`-+{I_T%QTmT~ zN3r|A?7kHEV+=Pzmf%V<rl0-n7r~YI`N@xb>Nj-AowvNUbM5G6giRzK8FxsNs!IYA z&q^01$doACkyE{nWOGSx5~zgn16T^8bc@`HB7v7Mj&T<;C-QJq)Q#I|ZCukeqnv59 zWdi{W)o=|YW>YpK08{^WzU#boN*J;^Ue1y_=D6dve|Rea7T=xgIFqna;iaNp1)|Gu za6LG#&~*7qFgJc53T7m=r^dt939|5eSpQ-(0Y)Y`5g4XK?Jx{rm$vS0n7Y|}TmZM9 z9Ah^s<{qMKFj`0**o!_EY-xBM!&v(W$jPa8wIOvj)RY%xFP!nwJ8!;b<y&A9Zze>g z=f$M^s1(Dzqpi~KLr0P<fkG44#JgnRsF5_#51xdkq}u(<#|q&DrG}<f%-#Ift5v(1 zd$)1pM$7@5H*eX&8YOyVm+l}LvXAZnyB%zT90)Y)-Nxn(ee&zD%8|7#IsfzOq}M(y zTC+pmeZ;D4Bmw0_<vb#5{cWaguU&;yhnRGSdkZBJR$_-5(8NWY!WWXg$tNC)JCFPV z79UUvC4ekC7c+|BY3C6|St=+C<45;y-_X}Z)P{+90CU8;jZFKop^p_(q)v|QAMI_d zT(y#Nwv|-0flDPdZCzcAX3EXL#|?RcAJx>?R+Sdw7AUQ(Z^RSQ*3pgasRy(}QmU<Q zs;eri>>fQZuGd<NFb-oR1{UYH#0gO;^~{mjz7f}@o*=Ov$39K*92XWESy=VpN_f5E z*-?GPTjMz%C_xFspn<_TD}62@Ih`kZB?5skI5$!2Bnm678KcXPQGy~VgFZGGz%e1O zI{%AzUwi%;EK0I*Ktr0u`y!Mdc%e?m<1cXt06r5D+ypEoB_|0eiAjPJ1Dg^&GK~9~ zm_z^<7$?sC^4HJ(`J)9Z>Q~b<VEaybRgi=WYXAqEmueD?XLV7+G&tjUVj{BS$f=wR z@ZyiO1Xe<t7ov<Igf0{~D?o7i{aq#r$B}db!3Ug!%{v~6%pAdOz>@5Qh0SVDZF7v? zjz+R{hwp$tk)3l$66O+$q8~bclpGBv6r3=YCSJl+0K+v1r=*&EDOAb8+naNN{Gm}L z=azMO)JwpZ04736SWjva9={WOD3O-7xh);8nOuaOaE6qQtGVkKMb_{pjZSo9p>}93 zxYXOTx~HoPPi0$cUDc}mrL#YI?=32cQatI~LU$0Q6jeg$Ci!+>NSc77<Sn3-U{n&p zsVXJvBP#{Y^mrkhyQs0TrK4vxsKn;%M^?fcx?yA^)A~l$%Wx_g%IXCGj|jGr_`#$- zl-_cp0MKK}YTmJRWUwjYUF=F9mk!ahTcP`~zJ1Oj9c1V!&Zgv`X3P>a_SP-^+h6}n znL9D>pep?f;`FsL6EH;Nm4YjhaF2^hci~D@u^=(X%Wg28$fXe2NFl(nLwmPl%~?;@ zF$%CZ<6y_Kr*&AL+xhV?cdhTJ191vhtSBrlW^ht*d2>&1dqZV$K>?L0)z#JYgngZj z)zqVu69pocx3#vlcXjt*_UUYEKq0SfAdIi*+;m`^`b_CLApz3T1%wai5>HI3Bv<lX zUJ#zT&s+xiEi49=66YjN3XXr5w-XqUmY@VzWlQiVo~HYg2lRYS>6rZ^CY`@P<mx^^ z76zG-Hm(G2VQo)3C4^?k;o=l;WF;#+I~z)te)Q&~KRolBfFgr9+;Oq$;u9%o3b1;L z*egiT1S+M}r3Y>$R3!i?1xw(UEXgDspG267sosG}zkKR9FTC|>+RCQ>VN$`n&<#W- zvv3+r$QXc03Pao?E(111<ap9DVqpo($EDcxk%H3(Pwk+3CFdMQBD5s|8AJ}(k~w*d zWc(bYD(?`7EkwoDJ{DR#;tt42R7Anf;lm`MciFcW=8v&t9E<R&^AD}rMF0f3jQX^2 zKyB}MNCHV$s1xE2kSp|ygoei4mdn{l#<0zCEEem=Bu(DzXRpQY1P4&Y-oAYYb@LR! z1D#_Lzv&1+Y^kbcL_nx^ag@T{JGVxeH8u~N`k^k-{kfsGyf9-f{om-}t)i_pDGULD zM$#ldvK|i1!m1Q@0OPlBvLs+hqV(WXCTT$>mI;@ug~!L@N<b30)Y8%2=`Y;XheLq& z-Rp*JvP9&%mHslMXLryx6fw=%)#>Qy-MkWTrGO;>DipY_8~W?g{{GUWKTW9~rWoDk zHHQyS28pbMv4kq5vzQjSJ!Bw4@8jeM@Cl7OYAJ5B7uj$r!JDl)Q8315zE5g-Buz?f zbreT3SL|8blSKKKIZk2unhhC7dMGMUF+kYIg1%bvBu->bPE+oe&L7`9(%V?EvVh#$ z@<Qy9r6nsX+E#ZpR+O$Pt!l(9(AYV!adgw#HqocCg=}V54?~s79?(gmr@N!MzG78b zRc%#yMcc;xCr)$DqD7+Jx(|>(rEgZ&kV)p1-~mZVO-Yt$JI-%lF$qb;B(q6iSv(~* zGB7qcf+KnTn3aDW#E(mUNJlvK?L~E9V%N)XD5D(61yg*5XEry(Ix)n^46wplNwsk} zDK_cr>8Qz@`3~`$g>S4cO9_w<xLkROA0;76;u3sERKge_9udKX+ReM#0wR2aBPH=$ z(53hk1#=I$QX+K|6F&3e+n;BY(*A{Gk##0tNo_aw8;eOV7OkV8DWNR!bd2DLi^%G# z)|kTwl{BmdWW$wk;)+TF{;gZr)fK^O8lISp*J7IZ+rxSaEX7a)6Ox?4TwlUk0BzPr zq$p|Izj^!EAv^=ezqB#N!Q<!E`o8aCumH}03##MZx4Yb3aFMArQaOIdaC!$YMP|^c zZ!%XM-KyO|ejrXZvJfbFlmk#{vCZrokR&RBN&KP&Cq!?elH?C2;KQ*)q^CG(Mq$5J z#sN!EkM4F_(pMH|&71b&-~U8`BY@<UqDQGWeyCrGrdrlN{z2R1w;(7m={{59qgWeA zOX87#k`?kesMJKtyS}M4L=}AL-MxK->({LxW@05#+@|fLI_m7-f{k>y-Ej9Eq;npk zDC}|XA&wJ3idMOMF;?=_hkL8$zxC3Kf1Xyikuf-`N@|72Y`e@U1Tb+dfJq!?H*S)H zyLLlaC1sRl!H~OW5}cmy<OZ{ZCK7UdLKg9TH$L^f-}n+gC>CJ6;XM}OZ7kiG5LvhG zV)E!LXB>2g7;U1GAE%*dVd(PV<0r}1`g>kHb7J4tf#!<h<@tHGye$QkRuq;tw>4Cj zmQ^DzVMOX2;bl26I?&nD1R(XS?xIq=ryX?a?CR3zujb7Rl=6z!;k`7LKDdvQA6CwB zMlTLZ4{lsh@q#NR8ApU8u{gQdO9_kexuG@%8IltLv-U7y!Sh?X^N_niQLHgOB6}0W z2}$xMp2kH!kFSttj;WjnNFcz4!pAWUDxI*3h&{&%yu-5GXok_hcCfFzrF7{>Z#?%q z8Y(@FWfw$ZW!km*_sI&3Q!%A`6Mu<HiCsxp`u~jJa4K;{xF%ELuUzRqUE&i)a^Y42 z*bu9bx_SG|tN)ytTh%_WQ4^(VH;myhMxM}?f@mgvl};(#1G!g3B|(Xhn0JI<cD=yF zYjgcNT!~jwDjLh;4tZF{K8i{NWVSMgEtwQRk3M(i1Soy<C`uAbSAs$yMAinFaDuq` z$@QeOn58wk9r@<qK2if)cI+F!eES>g?;G#JZuKH?lj$4E0!9&J_#_7;=gAdK=|pZy z_M99%z|`nwaL9m7jsylBI(ke31SILK1TOIgS`@^^tYGyNyZJIR7BjkR&Nc@}qZzeb z+VPow$(|j<O1Ndidb}R8rQSZQOKmN+6(u<fr%it6&#yv>o|75H@VEQO6m0{PzbVQM z1Ne7n5{n?1lm39<Ovp+Ale&^@DJCKl>pu=EH8*hK4CvsD@8|%Pm<zXVc-{K->+yze zp}8I4MBxd}_T9#`MsdV!pb|0@-bwD1hX_M!w$r_FZCAwtQ0Xr-8Zc4feS>yOCcW!W zWTH3KjUe0X7T;kV-2pNtP)ND=$5WzjEQ0&*#!nRIxLAr`-EuLIhjTBpG0DfCJ_;!9 zr&b134IkZcmLX++s!4Wcghq^ixo@<;v8;G`ZdP`lLzGGjb278?iYqG0tD4XZYf5Xn zHy)t7;E}OSYx}f%4XznlzkUcqbaP85Nm!b0G48Ukz_9{NYqnz+PKwj_vBr)Pi_pYe zQ{QE_iNa}A-4LX)j}n-2FY%OwCiWD8Td3NsX*Zx$h<qEnkJ#YSc}DeIQ|_fR4Ew-x z8n6ifrU4lo3VP%`A6{^1>P4s`pSZ%eTvo||?jPQZRdyR9Dv}Zgm%)A=l<iF`=e+X@ z@!Qi+OOi15>a|M<y~XA!4-;z;Xo~nPxDsl&o^A{Q020*6AT7m}pi1HGj={PzrpUyh zD;c_lQ004!IB^_Y*U-jIRv1JMPIH{CZMo<O5*?M0x*<)V5;->$Zt!7tJAZv4aJ*j^ znRszfmT0g*$|SjXHKEL?%(kp035S#fJLYF1Wdq){jAX^ao=i-@Thsv=VoIWY7cbD3 zb^WV57){&Jw|4UmNXypY0T62Eq0<lPd2IhT;{xVR#*&Pi$@FGQhOVQ@^V^dU)Xl&F zL7Eh+0%XbFdltk2PCybYK;hfgW`4>lR8CSQB{n44Zw&xy;Q%OV5?s<o)ThrN7jPjO z5|7#ig8OPCf&P9o?VTO;GhCUwc*f+n-=v{Q!j+=dBv2^=I6ny}g@2Ox&4Y+56|Ma? zHO5<9N?c1ZH<xb!l{l?_L!=K~GMIZDSi<UAU*BjB4s%L-M;EFu)wwh?8O9x8k>Bu! zQHQ%Ac*F2_>*+=Z6r-Vy*iDUX_c{`0$Cgd&*L0T7{3~2(dfjG{2kdf+b2Yzlm+|V6 z&!w9CBAd|2o|_S{#KAwYTv#u>8yhk8Dc_{-<~Kg`&37O9RW@^cU7c7x0ow{gaj?N% zP*JiV)3O4K8E_4gwqOlnvI3X*oms4VMu$3TigL3uGcvM77RuW)moCl7U0KoCwYs~d zaz$C&hW+DIU7b9zZNng=tJbeyw_)3M#)x&cH3Lko=u7Y_s^%~;)%0y;X+?*;F*!HQ zs_4;qLZb|MBo6f(FgbLlTX%2szSi#~tb^&nCLxXbxu8gdZ^S7ax1f#K?nDG)LA5$e zI`j@8H~@4s?7*b>124TQLxfLIfd_dYyaSW`7Rb`+Q%ECtWGGXxhuEe~Bluf5Rw+MP z-By(~<u8-|K*Yvs#MJvoYNZ|=p-Q0ecdHCsdvK-TKoe>=kYuq*AXADgL6YKof;1(R zDbc+31%x=o8_3eHpa1hGi;L=ehBm^|9r;CQa`?azCbAq$R7&Ds6z|AuLG~iCo5<b7 z=m0jap73k=013CNSc?Gt`>5oSx_uoANzt74Qtj{RRTe4BDQy!;jt@s;(pHzXi+E%t zL>6E@8GyRV%8D8ycV=$zF=zR}#yux4fB!<fcLR|t48z~3dL$;Gv9||>`X(D83^P0< zk}Et#cFrM`CH@$Z0Y;#a4}8P}Q6(KZb{N0uUxF&_Mt;zxLlFgtbmCMpHG%}Q5h~qj z4nrd#4R~X9c@L~5t<^=B)#{R*Mbl{<@EYC#@P`|FpC>s;z_`vr6AmJ^ZlDLqNiLRy ztSEsf13Uf%IK`I<^H~wD3I9Tw9)m1Vuh+o5*tU+&PSe@c!C~%(DKUO&6jXvWZ9wiO zfI~})0ys`C@ES-0r?s2%nnYFr7byebR!)2K#TWlFt#&grb3NTyMR?To&2X*(O!#Fk ztAN<TL_-<vh6uIc*7qQ{-@UOerSJLl16cas5cc3J-+qr2OrR2aH=FkS=@Se!5jPJX zLt4;9=NX0QgY^s@!y1``yEm^P|DT_^G%amu22*fL7@@l?1IuJ?X;VKP_A8g?l=tl# zzi{>X<<p0DZd%Vkbgt1cW`nQk))GQGuC=4Jv1V0KKK%nqyG9rn!)qn^){v`W0V)zM zuq90BkecD8x#?L?@I}yx?hmX2sDKiJ+ifeBktV2P;G0yKU_~T>%;2D-pfH6wFGN&c z-b?T>);(N-M3fLFBvYFug@7tuuvitnA5H)%IJ|!hu7o3i+^g;0!mZR&JpcXIpNmt{ z20V07omjYP5GoGQ*@RUX9hZQmU_T;Jf=BUQ1aJvgiVR#lC_({I(j_iXNqs66!r|<G zXIgqm)9Q7YC>;m~DQ8Dox&)Jj4{*Og4FmzD%BZYV88H2L>#p5hcoBUWd3k_gvjL=g zzuh_pSh6--+m=8;8BTB|UM-|HA}N11YC7bF{{g<=lgAJ58;kjHoy~P+D~pOs7>V4g zHPM>w&Y>MgFHBIeZ?C(%EH^|h`~crTCBku*A(E1eRb+xFL6uIM52e8dr@0p~tNrKz zCn7jNip3fo1tbAs=vGj|Cb$bo!p95+U?Fk5;+SyEjp<2%NzEI!B+(=AQ81)E4ScV) zp$1f<oynW8BX=VoaYOH;Qb^q)DTzwv-zYN)$ccwQBrr+h1R5n(D1wup@M1v-OgtFN z{diPrX#$n%8(Ju{Xm3Xs!9z%bd}wHB{m7P4o(Acu2;gi>X;@841SLro0`{mtx)+}W z9v8fpn`ukbT=3azlV1Gu)ap(9&;e8ee5rI2pE_m#(o<|9+>^pmI836VD0+08hl}GZ zAvckbA_%7fL+v}crQZWV_aQ5VXub)8<o6~&3NxEq8&t9un1KGmxp6S*pj8ZzU0k<f zQc{4lH>SnzJV3A5?SpL?C8-;so@7Y|2FW5y;G*MFL3P)L;nj7^GnZAYJ$S}g;nd+h z+cpL$jcng{aQE<PN?58Y@QOFIG-C6nG9@#+uxXGzX4-vo%q89iz1+4PY;w9bZEG)} zG#GHG)><r~8yUbRAqgs>f!{_}GMVI1DxgK;caztUa=zgIi1;ufFC#d_Y!Zn4hjoX& z$;Jf3z_eR8X#B(1+z6D4I-1onwCcMtKfnSw$kKY8-Glv|_4(7@#@0=wmIQBRYU1)J zP4Y9s(r=TJUCEL<QPjbuP$}LgfSZWmgrJ~Hpb{n}$rWETf(u_}A}sxy0B&}6d225s z0`lb;D~+5tdlKr6%Y+Drl1iqsz?E>ygCK-)8XQ4f5s4cOG$qI_XA+`7rEjAKgCy}> zV<WO$A1UU`V@7b`1R%mogLg==2SprHs%iTZM-J@XYSZMV+Oonh%$8I&wbO1x??=;` ztq1=fXZOKfS9xuX{~P_^dv72RS`xq%GcYBEBsU>}bP{?CwsG%Gw&fxX+p=U!vShhi zE|Tl8Y`Njydj&Iq5ApxaXG<<%c;VfMqoa0w&e_kN&s=lOwbq$_#(xJYeW52GTW4bQ zz6DzSxQO7k5+@=@`NslE0=S$I*c)BzVA(qN=?8}_W%xlFEV}Y^2e7>%NRgAI3F#2} z_nHDz7+)&ul5>q_$XewAV|FOkOWcmYuwoe}TI2j#lSaP(PvgCDrGiS8xRf*N+~zxy zZ-`PfB}auf50;}MN<~V7LtrVOmH#6!<=cL%(4~S+{|~4n&QPsaw;;2lL~*U{?K;@0 zN9CmKGRUP<rLK0l^0NSGN0?)uiIn-3le8x*Ca>4Uj3BORUoiHSfsYRu^p}}ydoW7t z2vRFpN0yLfwtJ01d1CdLuyvO*CHkbqEeaq?DQJQl<-|FMU+@h2!Bw~J-EmTHJM$GR z^<$9Vf<XD@{C;^zSf{QRDq#v%t<dq*G4d|E@O})A)+Jq^4JEw*_hvg>*}0|nlf7Fy z>Zgv*$fdX6e(U|g!$yyrFfNU|KOQ=C*!bDaE86Ez8$E1vUFW{zmfX1$2YR<+_iNX# zU9Z_)cT2s7CzGd5HNrA&Bc@H7IBMwNQ8kO!Z0J(QgN<}|cVnVmNNCUQ{ReFQ>Nd~g zI5FA~f3B1_h+#5M`O_P8`jqb>NbxA=EeR7yRFdWa99T(fMng)muDA?;N`^7&ts>|M z+az@l^yzh843{kqk<A$gh^UgbxfZ+eSx#}+<}M|0KuJ>@0o<^^yfEO=vflceI!F8z z#ua?Z>eb&QuoSW+`l`56UmMDJCxc3*VL%bJ!;1Ro5=a7K_w?yY;YuZ86S@1x4?Oz( zEANk=yLg$-6)rzD{ApZE@7{+mM9qau{MadmQw|qSBXt2fN)VR-j;}O5sPg`qnnP&z zUa?@@+`+OmV7&K+T3(t#n$i~E{Rz2B?_EjLr%e^`R+D?-GSBIey*otdZINTlb00Ev z_}D4a=VWL|?aZ0;+BfVzeb*W7pI^I#1I1)=?T!Wf1+sRP8dialYGDK?q+K{o)Qa0E z;{-$+;Yt`1!UQ?J?({jKoRE}gyGg&vG^HdbNt&p)r%x1xD*CPSkMcRiDrus5V@sQj zW}^P8cWrH&UprygJIvkB4Sb@2(0~D@wNe$w1(KpD^|g5m+yrp!KY^TlK%c%NfW-Bk zFs~n&{1UblU`iDC|G<^>^R2I+Gmpbt+Nd>trDe;PYq12C$_2D$?RsuX1vjddx2s(C z9_SnZdxOxv&{o;}ylzd+*RNaIK5yj9Pd_$b&?}QxX}eV3D^p}L_7o{OWm`ipogr6F zG)P-F*pUNIDMfJQi`(|I0Lu+3rPae~$lQI$S-lBM`Lzmx*b6K>H#Z6zRiNZC*ry$F z9lFGEwDYGA+jucJm8pCR<jo>29N2q+=(BB|{vB((ckI}(q;Asi|Gf9sn{T}F<~!z6 z4j(;w^vI9PIDyfV<=^H_pFDBOoVJa<M>s?6q`S9w@q({ewYqD|`qmkvM-2OT<d_N5 zW-v7I5HJ=D|7h^Ixow>r*h~yMUC*bwe$zJdG|Vh4VeMID24Kh@oz3=+-Q-&O)H{&F zx2{mPWd|y7iii!Z!=GGS1>gfyLO5hAIz<XgYysYDxI|jX4qz$@w@e;d;!nRj8K10I z90c_ZB;j#Rwf(d-F>GHvZ`%7W4>Ae)XAY~bXx+JQ`;?Y}PU*N4RI*BO^_yI&jLc2u z?Y{`!Rs7bcclSqZ3E6Taj0;lvDi+PSGu=Kk;1`jV+Ll{-o3;t4(Q^qV+OI4W24N%u z6)63RsNO*)3o9KdFP??wd5^AvYr;S|3WDdo5(eK~HSY9x{7<vH*aJMIy&-~kQG8D0 zG0IqI3=)}FLCfJiTe~`!H8;+!nKWkDkimn8ju@ktd(Dh#>>_n7oxLaT<_(bQ(>qCw zeDeI2{*+GjBt&*+OC9mKA}od1;C*Sdge8$1l|m#*6xPIb?^C8%2BTzTdR&D#()OSd zWhqyqHzpL4HU>#kpe!)-!Ib43d#FQt4rvA<gNQAyU8R{=Q{D7&L*D$W&TmiKT<kNE zmdZ_dQpJ=~lN(7XqLQ<m(5(2kO9bZ|(UXEiL8KDq1;xUv%I`*TEXef3dv`ZLB^!Eu z1G3Z@lMSZC-i<3knJ5gM%#@{PLQ=GpBtR7FM#^&|ExD(ZanmLN+`2W(TIUS;ji&R1 zUYWS6M^CuDSxY6G8#(!?#DD@tI}uqUlPTFZ;>$^OMX=@T2k(v?lpA34&7a=(+x|We zfl`%+0ZskC&e(n9hP1ou7X*gRUzY7RHWk-Brrc7IxfUML2s3$U_wJpW%IK-?4Xc}H zO)#bVoj0{j0!s#Zt9VNXlc7ULPB6Em)?2oqsl9XSUKZao#;fh#n#tFWbsIY7j2Zf$ z|7dDru0ZXK88wr}j~Q*y<@-Y?H*~Du!l?|-w@c^t?q_&Ml9ItUb|s#wz-F`}SJ!ox zcTuO1#BL9m67ouMmpci5IlNtUfh=z%<StMa+hlly+OW8Z)7gXOE!Rd{!jnGDN1|Af z10~ep)))qz&27<?HgNM3#>@naty{N%S$a?oM29L4UzVR0+P6q8J{dV*WeGk|Q0d22 z>m)H8bsIy<fg_bqiQ+1%RQOT}+JZ~byajWSl&T{mD*I%m6{X8p6~XCXZ81sGlb4b~ zIYz34B^6<UN?vhXS%Tl7lD96$=K^<797~9$_T|^IyVz73)v`wDvXlaHuoT%75XEcC zh{?f{Wh!94Y%AN*P3l%1IT2U-=p%hf$LJ3+Vf=(iL8YD}mv38<)!i>IpFN?!UWnc& z$4;KTV+i1vDMZPc3LgtFMR)g#GAZ<sJ1pesMkfjA)gn#%P{a_Wy|RG;qm-Bk-w5CN z<ew1UW=(T;3Jd{KMk)mB;C5DbByVDi-p7&|h;U2e+-akU-R8pGl$A=<h9x1wsM62- zBqb*rC{;KElN{CkkfkgFz?7}3Y*r=SD}<^1P9aPf(+?&~4f;_#l$<m*Axmu?OPA8S zm#I(Ps2DC8xK6rK_R;jY*@Yn$RcUAH7Xh}nD6JKQcmlZ9%NEzX^9w5Iz~7JV*v9$h zJ;X{XKZsLL11R2lHj*Su#r{N-pwc(aXZeO@6hSD0?{}k8-=CLX%>CORPX>!-d?V{L z7xtxdr_~v0*qcU2aoXv9lRmPEy|LWwU8{|q+R#l>8aI6K`|rH{)*ElU@z#6)89Zdj z$HPX97!H(%jhj4a!em7!?aSA0+|qmSSdzNO5A<$Xw{peGl`B@Q>ui}me26tWV(g50 z4fASe>i_-m(7_+P`_{W7YZtHGW>Rf(&S^}k1R+v%(B+F5DCyXe|8Ph{x?s^~E~p4_ zxJ^Pfe!zf~@00^91+x6;D)fr$`|{Oj*ymz=W>>BJ+;I0isi~;vpV|ieYV_{&($IPY zP?L5^EZbGOsYwFRHE>lOXNNRR^SsF){OLtYwhxuE1zMf?=v$WADy#bySNbtsDMC@A zwcI#@N`WP}!6aaW93_e?{0J%~imOzm)Uh}iyMI3D<+n!7Xk5Co%u0>g-D?bzYkQwA z@u{s$2~(_((RLHZsn(4ojdp~EqlHCCDjYefOYjszp1tq(!-hx0bMZ#<uJ%r)IqCBq zSh8Oso|j@bNRr_6;XOOL<e1F|oH%ymP_wrN5BYe6kvC&ZvZ-rcyW`OLJE)j{=*Hz! zhxH#LO>a{{`pMBVS8xA~8<*p|hZ~Xjf*@kJ6UIfIAaovgt(5WKl7rI1QRAcX8^Z2_ zilnQ$Bv)S|xJXMJUBX+a6hY!_y4hqMcx=l+Bw)S4w@gZ-0B7{*npMkM7tWeE?A?F- z@ue4@VFN&pDk&)(sZga#Qo?*fhWnWkssxkzVX0tJ;<k`!cogm&`dkQfMVRvY=+X~I zC30*~X@0}Pg^i0?0OPV+zAOWD*8!y*Oe2geR7Vi4TY%hlV%i<{Fz-%zokqUsKfiY6 zvW4Sc8>DmHlP?Wkv{|&9UBdfWC0>CN%8eWFjzOjKm!J|ziZSQ*wQ}=*_BKCEO^PEy zSbh^s<v0Av?J7avAC-mI4`IH@1LtCATPv5ds!Y*ZM8Q0dq^;0&C(V|mQPloDJ5w># zxqi#WC9}s314?hb`PN(Syf=9G7%F!kD(QMVk&&`-8L+n2_8&P-O}=pYaPQU)tO2W5 ztzF;QQ9oH*-I|$mTb3_tF?@H@$RX(p_pjGKnmBLy)&s{<gn3%MJGZZ^N5(p$ew;~h z0^|vQem!|3AzgtYMF~7!u%{&U1z>%s<mWkHRb=d<lSD5ki`arspA9y}v>L@*fk`@V zh-z*StAG;4A1b8-yMl8`<D|HwCYAgQ(LuRXTjR{(ue}s6OHe7Elxq76hc8RB@8*G` zG$eonN+m)o2-FWq;Y~rMB6kOis*o+%R0VOOxVV){%~V09`yP7y#Xo;AZdOyrD&~~U zsVE>U?Y6~n#S7pZ5ra_)#wDl(mQaLaQe~lrnjpmw7kwZblAX%`q1;fZZ<XBqq?quk z_O)lx6p@pI0*XN68r8H<C}-EmX}ECa80B#NnvO;FGp9}%YdMJF220HXrg0OX(wc1t z&lKgzxlFnF7hipG{o<*EJNbk*gq>_yzjgN^GcIrb+h2XATL26xT<LU1#|1>F({hSh zT~*M;(3!Z6#w3=5P3pJEN<pQBDY^VykRsfe&hfF-Bxu7KNOA+B%jN{;u)r7u;->^l zp3lmTmiaYfw0-;EUnPJ;BmzgIq>3)}NlL(`aG~r()lncRr{7UArHUiDjR*yoZl_rJ zs|VSaelRLEE^JJeXl}ilc@<nOZA+D%w3V&_QI%|<Kxv~n=JD9>g!#RQVBU_M$pWDM zNR+VyJUScKuUWBl-l#theC+3sKJmia^VX9CQpc0r!2!&`#uiwTs}%JLD^xbRBwdac z&aHEG>z;)aW%mY5Nj4m#sO&tl<9)w>7g)-l=fd_8l2tw0r=b%`JzZ9lDQZcVqX>`} z%)f96$1GP$k4)U!q8v`Rx~8dS%*P)>5<F?>SnkQ`6SROEF_Ld-<mj>E#!ap7=py^; z5PbN=xvQUlarMl}13ep8t(CZ3zj4dv&W_d=8$GYhhGiPe){Oo5!*||z{k4C;H)>|< zrhN(d94F6R0T4oq(ziD+)V5v$X-uC0reyK$=APpzb)7g9;WY;B1aKm_0$c8hF(~?J zPwBf?E}y@c-X3L{XD`li?tI!rU${c+z8)-N?mo*K@rlx*t@0FcPOe?EMu%tCNzU|) zHf&xrcfxyrG@0_TjHdi);YStzD0I60$Pxuq4-mT}5hYBkV5z9wC4wvF?);$i1}MN3 zd@5Z_62(PSDm4mWOZVRY$Wy=m$KZ)`nz$1;D8Y2msUhI>q6frFD1{=ZQGEuLa-4)p zByS6=@Q!nWFLw9K*Q7|oO}^+`27Qa6S`z)YqI%XXo5U$)({gb!9Gp7uNDn5FU73|~ z<?4l#yofux)~%FVjnRMXNYVVTp~0o$BgamxscT)m<-n=Dy&f%l!8x|EGsh3^h;^}( z7rbNX@>Lsm?mv0qW+qM&?gC*t9?<g_&e|>mP-GzI&UC0??J?~`*%tT~;*2zG^dLDj zt{eybWM}X0-GVonaY0MI$p(&29W4=IU`a45+l(_OLe+^NJ{@wfz-E2t3eEf`4}Z_7 z$`_wia1tE}pty3uQw1+EDMc#!S%^}J(hC$7oN)t_ih->tO8JYQ6`8R-O6by~{<I42 z6W#w%uGF+}{ye%;UHt;R-<p~hw`ug%)}h>lgR<1<mi_@<Vz_NAlV#eHm=-t_lX?{C zdX3$iw#K5hu5(St;#ouf@Px()PYn8N&6=H-Q&9opO~g+id72{HiefDxB9eC<+2`*D zOkjoUTPfI$>!0dWO%!q=(lJ@I%k<JawadO`R<7!>jvUqZa4cDMm!jda=TFDNn?N$H z!#TW@1D5sBU0+YlUL)<gLGYID6?Ky+LGQi!`Wx>In>^P9nEAEiMr+n>F%BOwcHGqY z9h7PT#et)z&t9ThT)T4q<N>P|4iVn=n7L}wIjGySeciH_g>}=-aQg7y|9I`~p_3PF z=sj@M1P&I!f=br{u_<TIa!m;86ETd9`?^9B9>ByC7j$Dv9*xB&EpSVDMWF-U6K@H~ zrJ5i?0ySbcyX0A#EzOM78U#Fl{+!4rnK*~CEZ}uEe!czs_V3=tt*ikJncgS~1qtm- zO*UMzXtA>5nqjZ~x~NJqC54c~BJxp+FH`6g<K%tr>ag?3BU-{KgR7`g6~YCX3Qt0s zZW@+Ck7U~<-U47h>YrQ54?yOQ;SMU@R|Rl2^-Gp1dfKpsi8(Wx=_Yi_(mZI-o@C8q zd}LjwE-_TP@?shkw3w6Yg3L-GcQc}vMNr-Lt&uxErTvlVOuRku3LQP<VN^{kPfLwl zq^7J_d)X(XV%sjW#Oy?HBDYb)sf<I0d~5_)&AgUXT|N6xqNyhj66zA269x{^8ojX; zy2Xu+i(8j>ZvW)ix&E#vbR_^LaJU#}$@#dvgG&;28O{{S#F~B7gc?u6g_HJVa0L>H zKmbxNlhRJ&iS}m<OXw1`Dm{cTEvs5qwzy23`FPc7RMO4iOZ<4-w|1>v(Nb44>OZgl z`S+;O6H&LZBXkESh3g2!sMkqkBt)-bF<Vc-sE;SPXHCRb8-^5)^caI}qCdndcM{1# zG%LgLgUM23L&Lm!uryDFt_DN2?$*}!<pCx3qeO2$)-!o;-m=;9peo59C(ielcv~>0 ztvKrDs!qWWwdwD@^n_P9;F*`lE#1P~#f)QbOL~BMmo&U{9)cMaQL>u?8>ypQj9*_l zu21D_`HdpHfF*H_Y+M4nP$7ZNZ8Yoae{JdITSBAa^Km&+XVOAGUQU~m*xM0M%DInO zO;T~I+G_Z_dG(?h6UL1mG5FoL-uhtlOm)lc@o|qCIb!VO@m$)qO)I*08NSIigTv?x z$-;2;%ISSuHgDOfPuG6qd7_%yYY*<))VX|#HcK2!L*97p-|vrJuy)7ZjPGHoj&F<7 z!$=d;!u5>2D{n-(m6hauwC$&vaMsqDG&>KzKpXEK#7gi6gQ9`wo%8}PD~5w%QEMf$ zk*tITE>e+dVv#Bnr;Udh3M5cVbhqYM8X=c?t1DM5XZ)4wXj4#b%+##$@4oz;hG417 ztaiPGZbSm;QOca++C`g6BIcot_%1vtjHoY!3o0dktE>U}K@pRxR9(JG2p9V#F!ERd zC8%`24BVeT7&CoA+lp0mC3>bTcp7(0MWt#rg%>&q>_M0UOQ3@qgD^oQjWu27kqh%? zkmYXD<vWn*_Ahek*eOZgr^r++ERG0rGIOQ`DuB~v?l`Z~PHGI&v$UnbG(d}B+_<r0 zN3+xpg-VlW&TBSKbB~R;z&yk8?)_Xxd$w;{D{s)&te?&7x$_ovboLxLrShcw`}|Uo zw2)s<6|-`#oGc46^cIvv7)-Bq!DWVx9@AqbwxfzFxv=<g9Nd)K;P&<&xRjdj!^biT zFMg1OvHGQyM@;TJ0vvXEFtb25ay!qO@bNo;XI4tb0J2hHIu#%l<`bG!r0kHQn?hnA zGy$52GgctR+7h(|k30f+a}=X^fu*b*e~n82K(bU!l;~1@y`qz*Hbup4?HvL*BTg7s zKvJr7H*AV<v=u6aJnkrD$-M-&-WV}lIwf?jUD?q%^{ro}sAj;^FAZ(#Ml<os-F7+D z(gLC{JNe#pfm6f~at|7mrBfKf?Tf|zT%jO^IQwa)!3l7_08g?i`E?GYKvw@==$F6t z*ZF%N`6q&YVmRKx)5OGTN77};CC-InDGM#-Hkk7D$LbQPZr`%9e%eItq>n#*@4cbp zXE*5?EN4+Sed@H?3%y^BOE>JWTZ{FNojiBBEV4Y+OGkEY-^nv_@Q76{U_#1I9^Sou z<61s%LGtV=L*M-OTSMzs@<PQ-0GafUEJoxc(h_4<uvA_-Da12p!nXZ_@$+egp<x?Y zH29P{Tg*qsAgOB_N<bH<LZSjlnX~7fR9>9lzOBl{FEUfc{hX$(cI31X+O1!LEJcwI z*R0Z93RzmFN%CT#R6lj_-%%x?bQ6_ql;~0!T~VMZWlj$~_;B=4sC4hm(l)SklP^W? zE{b=BNx`95k^*1_q7=VXG$~l;K)-(a^l$z-Gy$CUGKt_q&}B{ty<EATw8D!0b`d$J zn7rk^#XAJz$i!(s<C@Mp;Edl$^M!A$i?4k{uq-9%Z9PR_ETBYllqmp3sf6v_$33*C zXUlrt!xcsVH7}fF0I5F64jb1nO_9e>n>}xF$J%ZeN6(fnJ+fDIcBk{i-d$TZt`)rL zoHuvow3?Z9i&t#gbL^b<#^ovKKbOuj7cOh;&D&wWv41cNgz6M&5CKef2x%&Uld6|w zi9ID(6@fdbRJxwI{?x&lAFGg8T{&D<J%JAcrHs4@(0LH=P64I^dv|T?Ueh*z+Ncly z^~&#lIVfhOB6Js>8uLMY(4;$1DZq5=C|^}(0D)VAJ`}0KBeHqF2{SO|$5lS=!5@lB z^Wjn4-RTb7+L2xd{7PiTu5=+M{jO4RLMqYVBB+ESsX8g0mb^d6P){i~VIt^Uw{}I_ zg7N=)A<t~UlP|ngw;@gfN4B}}3V4rXXCsP+NDRS}LWH98er>7bOW!4S10!Ujz)-|X zJx*|+)Lz`6U`wp^{bAoD<Z%ib`P<-@VDHm%<-6<^<fd(YMy*1PT)jc16Y2AHC_3OS z!mrn9-`TplZtA3os!Mp~#@5s=Ub<p6kHpH>#jPtkySlozm<qsxtG4#k>5EkzLGa}2 zsl7eBImM-MLT6HDby5mui`n3%v&p>4L*IGxKebD{cI;*&K4DyE3d!-DD=v#fYvJ~J z(Yej57LuhyT~Nv4xmvDSvifmDJ*Br{dx^~C*c{kj%5kl9a<4We&`Q@_q)I4Q1oDf7 zD)$K8XU=FX7U{E$rE!+yN?)VnU0?}WP8ZD?BVYU7peJ~h%AQ$PVu(_Lx8MkVgWwcY zLgS$lsT<N%7Vf?jTtTBEER}GsABJwBQlzEgQ3~y<j{6e8{o##~HS=5SjYK|F2@NQk zlG+^ZX2G$`lSe?n5*3(P2`E`u87)8|@)ni4vq<~j2bGK*{M1{Sq-2OvK_(9fln4|% zbSc@pOUTpF-rm;M-qzC8Fn9XYiDM^B)B$h;wlr+in29xW<}GSp(b>JpM!r&a?6&13 zMG;od=Jil%sbF~4v<VZZ%v`Xvv*!?lKxG2|LJt8hGNzDNVbh*9QG{(LpR@I(W+b#e z%nf%#bxOk-sDv2_+a#O-5=pn)q74it+g<D~e6vn;tR(45mkmusNUuUF5w1Nux>q*O z89(%mzx@8!@pXsWB&AWn2pr{<LlacUS?@n?ffC~6KPq^c0sga}-;PPbxBesQc?si^ z!h7fkqEaJcH&pUpgLwiS%a^kSEMLBI&H7S0ZnaWDJM~wR`{#1^X6T8~<vkbKf}~yi zOS%W7Oo3jyvUT3*zYZ#B`NXq-pSIfD2Ghwe+1WA>i>?$wl0U6vjuM^m<%r<=u;m+{ zU<(15%<`p79By@;<bA_c_8G~*$@Gc4vj4Bj<%}TNib_rx5xWk#{9+K0swCvjMv|6q z)zzGRgroL|)>zK<j$K=~_;35p9i0s|nodp{H<n~Dw`s}JRqHluNvL;A6a$TTl(eeK zPB+Ob*UQG2=kVFt1H1Mdw#jOLTQ)xb-qC}5c3GOs+7&%F*Nfx_*R(K>GjkuYsi_4i z#W&Z<_>%wE^qT7PNsvPELODuwsbEspDqe5RVs|G_>bilZM>(kKNzqTUmSX#ZhJhub ztKBk%byfddx|&B~gAyu`{1uzV2Eoo5lDm$9U!<<eh__)`dkaunFl+ofe|q6b-I}x6 z^)1QL`ZQIzN#6&S62U$6NE*#Q6bofgsq~nHL?KHBklYC3N(!!|-TYx-DZfhgPVy~} zRHDJsdf>hX2mIpI55~`GjI2~pDXK}5xmuelPUTpl+wJFCqPGxTxB`y)KZUxHy8}w} z0pgi+9%o7a>iCY&H?C2h&!t}^vyd*{5tt4i)RZ=&sZ9t0TGrl_&NMAenGP~_{P;<e zr`1fEI$lseX6%G%v*s^a(y@9S8_@E$#fzG4?mQz#vTa(wcD0~SefH$>V<ye0Z&|fz z_YsM>iY$F@Dce`65@0D%<T!sxAXg>O>}<5^Y(<sg#G-A+GvTCXH#td(m-<{+rDO9J z7Uu-H`vcM06V(RTwv*(!qzvBU0w&<baVpQazh`~N!WpCA|EDG<gPw{l04P;f*+P;+ zlpZdcQaSI{>A!<5m7x8RK1s=6r~0V+|H;_ID`3i_mS9jI_ybXCq4^s$rFm*j7B=f* zVw^W~cSnbao(8&R)v7fsSELS3qOCh-fE2vJXU$76$R1=#35vCyAb_mbG<)#NNWc8z zfTw;xeDS8_31m&cQl<=|+eDqbMI1CPnS$qF=C1WaeTyjEL8jGP43MtLA6+lLL7-&z zP+W4vrLc>#`uYe{zWN*>xz;0c3l#-$SDp7Wr;}WvCdre#z}-imwAs?eW49d7E(j|` z-?_VYbNj-&Id#Uv%~FZ8xP9g74cm4fO1%_R4GD4i!v*x^?A2Q(mtR~uEG4Heyj{u9 zB*9LpwqvO6R#&diXUCGpIa4RhZtdLClM)j>6waI@DcIED=Jl#hS<qpba=N%sSZoS~ z%5IkhTWz344s`(*<V%ksyJ<Z0soR3Mpet&3s8pd-HcYQwN8R#H6oP1ho(wtMxl_3& zKw7Pt)+)9DH73ZCwqOFdg>_Q~|Ls=;ACKU9OI0w*8+s&VhT#Ac1m}SVAL6C_*+afv zO{lCy?kG#ql>SS%ZZ|NByp0)E)Tkm$l{797M@p&!!f>$r?tA#D-~98VNp(g!L#3{6 zlb1~NR@@X{0Ans=ivRg3_edzP=oD=!s1y$F@E$nD(wlJx^oiZyfk@>?sfoKJdg2ez zk|^>E)V3bB*l*XXY*1|7kZrqB^P2iuHIpY!m^5+n)G4;DQ6qJ@nQDY!Q>!Q=(XaNS z%}Z9ST?Z+)ZjrTH0p=TKP3E_pK2N4@_n}k$wI>EyTKx?7ihz*Ypb?2WTMd3pvCrwu zD{_?n2FDKV+r3w?vU4Y%MC8?-B;tvxi)~xeuyg-`B9i#aOP2|ij?aj(+SYiWga;PL z=@VX>Wa6@gH6z~s>mMR@2SQx2v~K4*{}*mt+}!q~Y)Ji^Qo$(SL7&2ua3y~iGeMEK z6A0#b!XxJYa#Uz1!2e-fsiEZG#BcTU8W%Uac9t%6{g}OkJsX~CooZ>aZlliSo3>Dq zdbY<;X=){%+iV(=TiH(7x;xjd=xALqRX3hcx5plP;+JpF?J@wIF+c!E@TLN=4U$B> zKSq{a6j0}ibW|y|Z&^8+y@XOBRSv%&o34UgwBif4UFHyY6ancbBDq(9t2!r%@~*N^ z_H|&?E<~sku3U0bp-N7Z&JhS*x|(RVlxmutn<R6WG&@>bn_HKyUAKAro}-BHS;ZiB zw-gJw1UT$2-%Rv+`d1F`rzw^G%X*t&N|GL*?B(L#WL$X1G6O>l<7!{EVM}l1aO!Mm zV>*v`Vfq1`^O*z&eR;G(Bd_aN=tW;Ah%p^ey|dvZr{-A;Som|?i-%kLI-)3~3ghQX zimX%?Gs46c<{_+5yzA=Km<)i@(F6O*gWEQ5SZ_05!&0|m+42=EpsQAPEaM7TWE$S^ z*M2i-fJ}^qnN|5<4)GhNB-a*tQ>F4X*|C(1tW;^;;HVrW{|1pN!sJ^4rXLjxcO@*9 zU+-s6Rm+R0O85QbXM_Im`tWJ<TayS@|B`ZWLk^OBLTDx9(y$|`-7@wBfE0f~hMgoO z9?OXYz@^Kd$s*h}OMBOK#{V7gKOO5zeEwXE)`AXi*0t?+dAqU6gpP*Hoi(U*()fv! zr%jtYaXeHSHFm<(nRDhXM3I(I<eC>FOGy_|#N>d48Y`DBUNC#w_;C|w%x_=o+@H9h z`DmVn7$67hg3Lzrgfav(dQh6Bx{=z4Rgg+?9*?%xJKg~A#ja8vMCXpAyLmItB#PNh zy^RNy;l^fG%B&QRdSt7VIBA<K(V(2({+$~;8fu2W{pa7lFtBi C34`VlEvxBjC* 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∋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ΤQt)Vm$ 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%0DdL7l7)7Iu!|;22R<N^V@nQ|{>@NH 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©iSx(!fhSW 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 Hf8hTC7Cj6m diff --git a/allensdk/test/brain_observatory/behavior/test_behavior_metadata_legacy.py b/allensdk/test/brain_observatory/behavior/test_behavior_metadata_legacy.py deleted file mode 100644 index 44e4aee0c8..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_behavior_metadata_legacy.py +++ /dev/null @@ -1,338 +0,0 @@ -import pickle -from datetime import datetime - -import pytest -import numpy as np -import pandas as pd -import pytz - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.behavior_metadata import ( - description_dict, get_task_parameters, get_expt_description, - BehaviorMetadata) -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.date_of_acquisition import \ - DateOfAcquisition -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.age import \ - Age -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.full_genotype import \ - FullGenotype -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .subject_metadata.reporter_line import \ - ReporterLine - - -@pytest.mark.parametrize("data, expected", - [pytest.param({ # noqa: E128 - "items": { - "behavior": { - "config": { - "DoC": { - "blank_duration_range": ( - 0.5, 0.6), - "response_window": [0.15, 0.75], - "change_time_dist": "geometric", - "auto_reward_volume": 0.002, - }, - "reward": { - "reward_volume": 0.007, - }, - "behavior": { - "task_id": "DoC_untranslated", - }, - }, - "params": { - "stage": "TRAINING_3_images_A", - "flash_omit_probability": 0.05 - }, - "stimuli": { - "images": {"draw_log": [1] * 10, - "flash_interval_sec": [ - 0.32, -1.0]} - }, - } - } - }, - { - "blank_duration_sec": [0.5, 0.6], - "stimulus_duration_sec": 0.32, - "omitted_flash_fraction": 0.05, - "response_window_sec": [0.15, 0.75], - "reward_volume": 0.007, - "session_type": "TRAINING_3_images_A", - "stimulus": "images", - "stimulus_distribution": "geometric", - "task": "change detection", - "n_stimulus_frames": 10, - "auto_reward_volume": 0.002 - }, id='basic'), - pytest.param({ - "items": { - "behavior": { - "config": { - "DoC": { - "blank_duration_range": ( - 0.5, 0.5), - "response_window": [0.15, - 0.75], - "change_time_dist": - "geometric", - "auto_reward_volume": 0.002 - }, - "reward": { - "reward_volume": 0.007, - }, - "behavior": { - "task_id": "DoC_untranslated", - }, - }, - "params": { - "stage": "TRAINING_3_images_A", - "flash_omit_probability": 0.05 - }, - "stimuli": { - "images": {"draw_log": [1] * 10, - "flash_interval_sec": [ - 0.32, -1.0]} - }, - } - } - }, - { - "blank_duration_sec": [0.5, 0.5], - "stimulus_duration_sec": 0.32, - "omitted_flash_fraction": 0.05, - "response_window_sec": [0.15, 0.75], - "reward_volume": 0.007, - "session_type": "TRAINING_3_images_A", - "stimulus": "images", - "stimulus_distribution": "geometric", - "task": "change detection", - "n_stimulus_frames": 10, - "auto_reward_volume": 0.002 - }, id='single_value_blank_duration'), - pytest.param({ - "items": { - "behavior": { - "config": { - "DoC": { - "blank_duration_range": ( - 0.5, 0.5), - "response_window": [0.15, - 0.75], - "change_time_dist": - "geometric", - "auto_reward_volume": 0.002 - }, - "reward": { - "reward_volume": 0.007, - }, - "behavior": { - "task_id": "DoC_untranslated", - }, - }, - "params": { - "stage": "TRAINING_3_images_A", - "flash_omit_probability": 0.05 - }, - "stimuli": { - "grating": {"draw_log": [1] * 10, - "flash_interval_sec": - [0.34, -1.0]} - }, - } - } - }, - { - "blank_duration_sec": [0.5, 0.5], - "stimulus_duration_sec": 0.34, - "omitted_flash_fraction": 0.05, - "response_window_sec": [0.15, 0.75], - "reward_volume": 0.007, - "session_type": "TRAINING_3_images_A", - "stimulus": "grating", - "stimulus_distribution": "geometric", - "task": "change detection", - "n_stimulus_frames": 10, - "auto_reward_volume": 0.002 - }, id='stimulus_duration_from_grating'), - pytest.param({ - "items": { - "behavior": { - "config": { - "DoC": { - "blank_duration_range": ( - 0.5, 0.5), - "response_window": [0.15, - 0.75], - "change_time_dist": - "geometric", - "auto_reward_volume": 0.002 - }, - "reward": { - "reward_volume": 0.007, - }, - "behavior": { - "task_id": "DoC_untranslated", - }, - }, - "params": { - "stage": "TRAINING_3_images_A", - "flash_omit_probability": 0.05 - }, - "stimuli": { - "grating": { - "draw_log": [1] * 10, - "flash_interval_sec": None} - }, - } - } - }, - { - "blank_duration_sec": [0.5, 0.5], - "stimulus_duration_sec": np.NaN, - "omitted_flash_fraction": 0.05, - "response_window_sec": [0.15, 0.75], - "reward_volume": 0.007, - "session_type": "TRAINING_3_images_A", - "stimulus": "grating", - "stimulus_distribution": "geometric", - "task": "change detection", - "n_stimulus_frames": 10, - "auto_reward_volume": 0.002 - }, id='stimulus_duration_none') - ] - ) -def test_get_task_parameters(data, expected): - actual = get_task_parameters(data) - for k, v in actual.items(): - # Special nan checking since pytest doesn't do it well - try: - if np.isnan(v): - assert np.isnan(expected[k]) - else: - assert expected[k] == v - except (TypeError, ValueError): - assert expected[k] == v - - actual_keys = list(actual.keys()) - actual_keys.sort() - expected_keys = list(expected.keys()) - expected_keys.sort() - assert actual_keys == expected_keys - - -def test_get_task_parameters_task_id_exception(): - """ - Test that, when task_id has an unexpected value, - get_task_parameters throws the correct exception - """ - input_data = { - "items": { - "behavior": { - "config": { - "DoC": { - "blank_duration_range": (0.5, 0.6), - "response_window": [0.15, 0.75], - "change_time_dist": "geometric", - "auto_reward_volume": 0.002 - }, - "reward": { - "reward_volume": 0.007, - }, - "behavior": { - "task_id": "junk", - }, - }, - "params": { - "stage": "TRAINING_3_images_A", - "flash_omit_probability": 0.05 - }, - "stimuli": { - "images": {"draw_log": [1] * 10, - "flash_interval_sec": [0.32, -1.0]} - }, - } - } - } - - with pytest.raises(RuntimeError) as error: - _ = get_task_parameters(input_data) - assert "does not know how to parse 'task_id'" in error.value.args[0] - - -def test_get_task_parameters_flash_duration_exception(): - """ - Test that, when 'images' or 'grating' not present in 'stimuli', - get_task_parameters throws the correct exception - """ - input_data = { - "items": { - "behavior": { - "config": { - "DoC": { - "blank_duration_range": (0.5, 0.6), - "response_window": [0.15, 0.75], - "change_time_dist": "geometric", - "auto_reward_volume": 0.002 - }, - "reward": { - "reward_volume": 0.007, - }, - "behavior": { - "task_id": "DoC", - }, - }, - "params": { - "stage": "TRAINING_3_images_A", - "flash_omit_probability": 0.05 - }, - "stimuli": { - "junk": {"draw_log": [1] * 10, - "flash_interval_sec": [0.32, -1.0]} - }, - } - } - } - - with pytest.raises(RuntimeError) as error: - _ = get_task_parameters(input_data) - shld_be = "'images' and/or 'grating' not a valid key" - assert shld_be in error.value.args[0] - - -@pytest.mark.parametrize("session_type, expected_description", [ - ("OPHYS_0_images_Z", description_dict[r"\AOPHYS_0_images"]), - ("OPHYS_1_images_A", description_dict[r"\AOPHYS_[1|3]_images"]), - ("OPHYS_2_images_B", description_dict[r"\AOPHYS_2_images"]), - ("OPHYS_3_images_C", description_dict[r"\AOPHYS_[1|3]_images"]), - ("OPHYS_4_images_D", description_dict[r"\AOPHYS_[4|6]_images"]), - ("OPHYS_5_images_E", description_dict[r"\AOPHYS_5_images"]), - ("OPHYS_6_images_F", description_dict[r"\AOPHYS_[4|6]_images"]), - ("TRAINING_0_gratings_A", description_dict[r"\ATRAINING_0_gratings"]), - ("TRAINING_1_gratings_B", description_dict[r"\ATRAINING_1_gratings"]), - ("TRAINING_2_gratings_C", description_dict[r"\ATRAINING_2_gratings"]), - ("TRAINING_3_images_D", description_dict[r"\ATRAINING_3_images"]), - ("TRAINING_4_images_E", description_dict[r"\ATRAINING_4_images"]), - ('TRAINING_3_images_A_10uL_reward', - description_dict[r"\ATRAINING_3_images"]), - ('TRAINING_5_images_A_handoff_lapsed', - description_dict[r"\ATRAINING_5_images"]) -]) -def test_get_expt_description_with_valid_session_type(session_type, - expected_description): - obt = get_expt_description(session_type) - assert obt == expected_description - - -@pytest.mark.parametrize("session_type", [ - ("bogus_session_type"), - ("stuff"), - ("OPHYS_7") -]) -def test_get_expt_description_raises_with_invalid_session_type(session_type): - with pytest.raises(RuntimeError, match="session type should match.*"): - get_expt_description(session_type) diff --git a/allensdk/test/brain_observatory/behavior/test_behavior_ophys_experiment.py b/allensdk/test/brain_observatory/behavior/test_behavior_ophys_experiment.py deleted file mode 100644 index d35d2bcf8e..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_behavior_ophys_experiment.py +++ /dev/null @@ -1,387 +0,0 @@ -import os -import datetime -import uuid -import pytest -import pandas as pd -import pytz -import numpy as np -from unittest.mock import create_autospec - -from pynwb import NWBHDF5IO - -from allensdk.brain_observatory.behavior.behavior_ophys_experiment import \ - BehaviorOphysExperiment -from allensdk.brain_observatory.behavior.behavior_session import \ - BehaviorSession -from allensdk.brain_observatory.behavior.data_files import SyncFile -from allensdk.brain_observatory.behavior.data_files.eye_tracking_file import \ - EyeTrackingFile -from allensdk.brain_observatory.behavior.data_files\ - .rigid_motion_transform_file import \ - RigidMotionTransformFile -from allensdk.brain_observatory.behavior.data_objects import \ - BehaviorSessionId, StimulusTimestamps -from allensdk.brain_observatory.behavior.data_objects.cell_specimens\ - .cell_specimens import \ - CellSpecimens -from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ - .eye_tracking_table import \ - EyeTrackingTable -from allensdk.brain_observatory.behavior.data_objects.eye_tracking\ - .rig_geometry import \ - RigGeometry as EyeTrackingRigGeometry -from allensdk.brain_observatory.behavior.data_objects.metadata \ - .behavior_metadata.date_of_acquisition import \ - DateOfAcquisitionOphys -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_metadata.foraging_id import \ - ForagingId -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .behavior_ophys_metadata import \ - BehaviorOphysMetadata -from allensdk.brain_observatory.behavior.data_objects.metadata\ - .ophys_experiment_metadata.multi_plane_metadata.imaging_plane_group \ - import \ - ImagingPlaneGroup -from allensdk.brain_observatory.behavior.data_objects.projections import \ - Projections -from allensdk.brain_observatory.behavior.data_objects.stimuli.util import \ - calculate_monitor_delay -from allensdk.brain_observatory.behavior.data_objects.timestamps\ - .ophys_timestamps import \ - OphysTimestamps -from allensdk.brain_observatory.session_api_utils import ( - sessions_are_equal) -from allensdk.brain_observatory.stimulus_info import MONITOR_DIMENSIONS -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.internal.api import db_connection_creator - - -@pytest.mark.requires_bamboo -def test_nwb_end_to_end(tmpdir_factory): - # NOTE: old test oeid 789359614 had no cell specimen ids due to not being - # part of the 2021 Visual Behavior release set which broke a ton - # of things... - - oeid = 795073741 - tmpdir = 'test_nwb_end_to_end' - nwb_filepath = os.path.join(str(tmpdir_factory.mktemp(tmpdir)), - 'nwbfile.nwb') - - d1 = BehaviorOphysExperiment.from_lims(oeid) - nwbfile = d1.to_nwb() - with NWBHDF5IO(nwb_filepath, 'w') as nwb_file_writer: - nwb_file_writer.write(nwbfile) - - d2 = BehaviorOphysExperiment.from_nwb(nwbfile=nwbfile) - - assert sessions_are_equal(d1, d2, reraise=True, - ignore_keys={'metadata': {'project_code'}}) - - -@pytest.mark.nightly -def test_visbeh_ophys_data_set(): - ophys_experiment_id = 789359614 - data_set = BehaviorOphysExperiment.from_lims(ophys_experiment_id, - exclude_invalid_rois=False) - - # TODO: need to improve testing here: - # for _, row in data_set.roi_metrics.iterrows(): - # print(np.array(row.to_dict()['mask']).sum()) - # print - # for _, row in data_set.roi_masks.iterrows(): - # print(np.array(row.to_dict()['mask']).sum()) - - lims_db = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP) - behavior_session_id = BehaviorSessionId.from_lims( - db=lims_db, ophys_experiment_id=ophys_experiment_id) - - # All sorts of assert relationships: - assert ForagingId.from_lims(behavior_session_id=behavior_session_id.value, - lims_db=lims_db).value == \ - data_set.metadata['behavior_session_uuid'] - - stimulus_templates = data_set.stimulus_templates - assert len(stimulus_templates) == 8 - assert stimulus_templates.loc['im000'].warped.shape == MONITOR_DIMENSIONS - assert stimulus_templates.loc['im000'].unwarped.shape == MONITOR_DIMENSIONS - - assert len(data_set.licks) == 2421 and set(data_set.licks.columns) \ - == set(['timestamps', 'frame']) - assert len(data_set.rewards) == 85 and set(data_set.rewards.columns) == \ - set(['timestamps', 'volume', 'autorewarded']) - assert len(data_set.corrected_fluorescence_traces) == 258 and \ - set(data_set.corrected_fluorescence_traces.columns) == \ - set(['cell_roi_id', 'corrected_fluorescence']) - np.testing.assert_array_almost_equal(data_set.running_speed.timestamps, - data_set.stimulus_timestamps) - assert len(data_set.cell_specimen_table) == len(data_set.dff_traces) - assert data_set.average_projection.data.shape == \ - data_set.max_projection.data.shape - assert set(data_set.motion_correction.columns) == set(['x', 'y']) - assert len(data_set.trials) == 602 - - expected_metadata = { - 'stimulus_frame_rate': 60.0, - 'full_genotype': 'Slc17a7-IRES2-Cre/wt;Camk2a-tTA/wt;Ai93(' - 'TITL-GCaMP6f)/wt', - 'ophys_experiment_id': 789359614, - 'behavior_session_id': 789295700, - 'imaging_plane_group_count': 0, - 'ophys_session_id': 789220000, - 'session_type': 'OPHYS_6_images_B', - 'driver_line': ['Camk2a-tTA', 'Slc17a7-IRES2-Cre'], - 'cre_line': 'Slc17a7-IRES2-Cre', - 'behavior_session_uuid': uuid.UUID( - '69cdbe09-e62b-4b42-aab1-54b5773dfe78'), - 'date_of_acquisition': pytz.utc.localize( - datetime.datetime(2018, 11, 30, 23, 28, 37)), - 'ophys_frame_rate': 31.0, - 'imaging_depth': 375, - 'mouse_id': 416369, - 'experiment_container_id': 814796558, - 'targeted_structure': 'VISp', - 'reporter_line': 'Ai93(TITL-GCaMP6f)', - 'emission_lambda': 520.0, - 'excitation_lambda': 910.0, - 'field_of_view_height': 512, - 'field_of_view_width': 447, - 'indicator': 'GCaMP6f', - 'equipment_name': 'CAM2P.5', - 'age_in_days': 139, - 'sex': 'F', - 'imaging_plane_group': None, - 'project_code': 'VisualBehavior' - } - assert data_set.metadata == expected_metadata - assert data_set.task_parameters == {'reward_volume': 0.007, - 'stimulus_distribution': u'geometric', - 'stimulus_duration_sec': 0.25, - 'stimulus': 'images', - 'omitted_flash_fraction': 0.05, - 'blank_duration_sec': [0.5, 0.5], - 'n_stimulus_frames': 69882, - 'task': 'change detection', - 'response_window_sec': [0.15, 0.75], - 'session_type': u'OPHYS_6_images_B', - 'auto_reward_volume': 0.005} - - -@pytest.mark.requires_bamboo -def test_legacy_dff_api(): - ophys_experiment_id = 792813858 - session = BehaviorOphysExperiment.from_lims( - ophys_experiment_id=ophys_experiment_id) - - _, dff_array = session.get_dff_traces() - for csid in session.dff_traces.index.values: - dff_trace = session.dff_traces.loc[csid]['dff'] - ind = session.cell_specimen_table.index.get_loc(csid) - np.testing.assert_array_almost_equal(dff_trace, dff_array[ind, :]) - - assert dff_array.shape[0] == session.dff_traces.shape[0] - - -@pytest.mark.requires_bamboo -@pytest.mark.parametrize('ophys_experiment_id, number_omitted', [ - pytest.param(789359614, 153), - pytest.param(792813858, 129) -]) -def test_stimulus_presentations_omitted(ophys_experiment_id, number_omitted): - session = BehaviorOphysExperiment.from_lims(ophys_experiment_id) - df = session.stimulus_presentations - assert df['omitted'].sum() == number_omitted - - -@pytest.mark.parametrize( - "dilation_frames, z_threshold", [ - (5, 9), - (1, 2) - ]) -def test_eye_tracking(dilation_frames, z_threshold, monkeypatch): - """A very long test just to test that eye tracking arguments are sent to - EyeTrackingTable factory method from BehaviorOphysExperiment.from_lims""" - expected = EyeTrackingTable(eye_tracking=pd.DataFrame([1, 2, 3])) - EyeTrackingTable_mock = create_autospec(EyeTrackingTable) - EyeTrackingTable_mock.from_data_file.return_value = expected - - etf = create_autospec(EyeTrackingFile, instance=True) - sf = create_autospec(SyncFile, instance=True) - - with monkeypatch.context() as ctx: - ctx.setattr('allensdk.brain_observatory.behavior.' - 'behavior_ophys_experiment.db_connection_creator', - create_autospec(db_connection_creator, instance=True)) - ctx.setattr( - SyncFile, 'from_lims', - lambda db, ophys_experiment_id: sf) - ctx.setattr( - StimulusTimestamps, 'from_sync_file', - lambda sync_file: create_autospec(StimulusTimestamps, - instance=True)) - ctx.setattr( - BehaviorSessionId, 'from_lims', - lambda db, ophys_experiment_id: create_autospec(BehaviorSessionId, - instance=True)) - ctx.setattr( - ImagingPlaneGroup, 'from_lims', - lambda lims_db, ophys_experiment_id: None) - ctx.setattr( - BehaviorOphysMetadata, 'from_lims', - lambda lims_db, ophys_experiment_id, - is_multiplane: create_autospec(BehaviorOphysMetadata, - instance=True)) - ctx.setattr('allensdk.brain_observatory.behavior.' - 'behavior_ophys_experiment.calculate_monitor_delay', - create_autospec(calculate_monitor_delay)) - ctx.setattr( - DateOfAcquisitionOphys, 'from_lims', - lambda lims_db, ophys_experiment_id: create_autospec( - DateOfAcquisitionOphys, instance=True)) - ctx.setattr( - BehaviorSession, 'from_lims', - lambda lims_db, behavior_session_id, - stimulus_timestamps, monitor_delay, date_of_acquisition: - BehaviorSession( - behavior_session_id=None, - stimulus_timestamps=None, - running_acquisition=None, - raw_running_speed=None, - running_speed=None, - licks=None, - rewards=None, - stimuli=None, - task_parameters=None, - trials=None, - metadata=None, - date_of_acquisition=None, - )) - ctx.setattr( - OphysTimestamps, 'from_sync_file', - lambda sync_file: create_autospec(OphysTimestamps, - instance=True)) - ctx.setattr( - Projections, 'from_lims', - lambda lims_db, ophys_experiment_id: create_autospec( - Projections, instance=True)) - ctx.setattr( - CellSpecimens, 'from_lims', - lambda lims_db, ophys_experiment_id, ophys_timestamps, - segmentation_mask_image_spacing, events_params, - exclude_invalid_rois: create_autospec( - BehaviorSession, instance=True)) - ctx.setattr( - RigidMotionTransformFile, 'from_lims', - lambda db, ophys_experiment_id: create_autospec( - RigidMotionTransformFile, instance=True)) - ctx.setattr( - EyeTrackingFile, 'from_lims', - lambda db, ophys_experiment_id: etf) - ctx.setattr( - EyeTrackingTable, 'from_data_file', - lambda data_file, sync_file, z_threshold, dilation_frames: - EyeTrackingTable_mock.from_data_file( - data_file=data_file, sync_file=sync_file, - z_threshold=z_threshold, dilation_frames=dilation_frames)) - ctx.setattr( - EyeTrackingRigGeometry, 'from_lims', - lambda lims_db, ophys_experiment_id: create_autospec( - EyeTrackingRigGeometry, instance=True)) - boe = BehaviorOphysExperiment.from_lims( - ophys_experiment_id=1, eye_tracking_z_threshold=z_threshold, - eye_tracking_dilation_frames=dilation_frames) - - obtained = boe.eye_tracking - assert obtained.equals(expected.value) - EyeTrackingTable_mock.from_data_file.assert_called_with( - data_file=etf, - sync_file=sf, - z_threshold=z_threshold, - dilation_frames=dilation_frames) - - -@pytest.mark.requires_bamboo -def test_event_detection(): - ophys_experiment_id = 789359614 - session = BehaviorOphysExperiment.from_lims( - ophys_experiment_id=ophys_experiment_id) - events = session.events - - assert len(events) > 0 - - expected_columns = ['events', 'filtered_events', 'lambda', 'noise_std', - 'cell_roi_id'] - assert len(events.columns) == len(expected_columns) - # Assert they contain the same columns - assert len(set(expected_columns).intersection(events.columns)) == len( - expected_columns) - - assert events.index.name == 'cell_specimen_id' - - # All events are the same length - event_length = len(set([len(x) for x in events['events']])) - assert event_length == 1 - - -@pytest.mark.requires_bamboo -def test_BehaviorOphysExperiment_property_data(): - ophys_experiment_id = 960410026 - dataset = BehaviorOphysExperiment.from_lims(ophys_experiment_id) - - assert dataset.ophys_session_id == 959458018 - assert dataset.ophys_experiment_id == 960410026 - - -def test_behavior_ophys_experiment_list_data_attributes_and_methods( - monkeypatch): - # Test that data related methods/attributes/properties for - # BehaviorOphysExperiment are returned properly. - - # This test will need to be updated if: - # 1. Data being returned by class has changed - # 2. Inheritance of class has changed - expected = { - 'average_projection', - 'behavior_session_id', - 'cell_specimen_table', - 'corrected_fluorescence_traces', - 'dff_traces', - 'events', - 'eye_tracking', - 'eye_tracking_rig_geometry', - 'get_cell_specimen_ids', - 'get_cell_specimen_indices', - 'get_dff_traces', - 'get_performance_metrics', - 'get_reward_rate', - 'get_rolling_performance_df', - 'get_segmentation_mask_image', - 'licks', - 'max_projection', - 'metadata', - 'motion_correction', - 'ophys_experiment_id', - 'ophys_session_id', - 'ophys_timestamps', - 'raw_running_speed', - 'rewards', - 'roi_masks', - 'running_speed', - 'segmentation_mask_image', - 'stimulus_presentations', - 'stimulus_templates', - 'stimulus_timestamps', - 'task_parameters', - 'trials' - } - - def dummy_init(self): - pass - - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorOphysExperiment, '__init__', dummy_init) - boe = BehaviorOphysExperiment() - obt = boe.list_data_attributes_and_methods() - - assert any(expected ^ set(obt)) is False diff --git a/allensdk/test/brain_observatory/behavior/test_behavior_session.py b/allensdk/test/brain_observatory/behavior/test_behavior_session.py deleted file mode 100644 index 013fe02641..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_behavior_session.py +++ /dev/null @@ -1,34 +0,0 @@ -from allensdk.brain_observatory.behavior.behavior_session import ( - BehaviorSession) - - -def test_behavior_session_list_data_attributes_and_methods(monkeypatch): - """Test that data related methods/attributes/properties for - BehaviorSession are returned properly.""" - - def dummy_init(self): - pass - - with monkeypatch.context() as ctx: - ctx.setattr(BehaviorSession, '__init__', dummy_init) - bs = BehaviorSession() - obt = bs.list_data_attributes_and_methods() - - expected = { - 'behavior_session_id', - 'get_performance_metrics', - 'get_reward_rate', - 'get_rolling_performance_df', - 'licks', - 'metadata', - 'raw_running_speed', - 'rewards', - 'running_speed', - 'stimulus_presentations', - 'stimulus_templates', - 'stimulus_timestamps', - 'task_parameters', - 'trials' - } - - assert any(expected ^ set(obt)) is False diff --git a/allensdk/test/brain_observatory/behavior/test_criteria.py b/allensdk/test/brain_observatory/behavior/test_criteria.py deleted file mode 100644 index 2bb3cb5bdb..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_criteria.py +++ /dev/null @@ -1,382 +0,0 @@ -import pytest -import pandas as pd -from allensdk.brain_observatory.behavior import criteria -from allensdk.core.exceptions import DataFrameKeyError, DataFrameIndexError - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 0, 1: 0, 2: 0, }, - }), - False, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 2.0, 1: 2.0, 2: 2.0, }, - }), - False, - ), # should need to be greater than 2.0 - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 0, 1: 0, 2: 2.1, }, - }), - False, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 0, 1: 2.1, 2: 2.1, }, - }), - True, - ), - ], -) -def test_two_out_of_three_aint_bad(session_summary, expected): - assert criteria.two_out_of_three_aint_bad(session_summary) == expected - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, }, - "dprime_peak": {0: 0, 1: 2.1, } - }), - pytest.raises(DataFrameIndexError), - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "other_col": {0: 0, 1: 2.1, 2: 2.1, } - }), - pytest.raises(DataFrameKeyError), - ), - ], -) -def test_two_out_of_three_aint_bad_exception(session_summary, expected): - with expected: - criteria.two_out_of_three_aint_bad(session_summary) - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 0, 1: 0, 2: 0, }, - }), - False, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 2.0, 1: 2.0, 2: 2.0, }, - }), - False, - ), # should need to be greater than 2.0 - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 0, 1: 2.1, 2: 0, }, - }), - False, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "dprime_peak": {0: 0, 1: 0, 2: 2.1, }, - }), - True, - ), - - ], -) -def test_yesterday_was_good(session_summary, expected): - assert criteria.yesterday_was_good(session_summary) == expected - - -@pytest.mark.parametrize( - "session_summary,expected", - [ - ( - pd.DataFrame({ - "training_day": {}, - "dprime_peak": {}, - }), - pytest.raises(DataFrameIndexError), - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "other_col": {0: 0, 1: 0, 2: 2.1, }, - }), - pytest.raises(DataFrameKeyError), - ), - ], -) -def test_yesterday_was_good_exception(session_summary, expected): - with expected: - criteria.yesterday_was_good(session_summary) - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "response_bias": {0: 0.0, 1: 0.0, 2: 0.0, }, - }), - False, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "response_bias": {0: 0.0, 1: 0.0, 2: 0.1, }, - }), - False, - ), # non-inclusive - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "response_bias": {0: 0.0, 1: 0.0, 2: 0.9, }, - }), - False, - ), # non-inclusive - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "response_bias": {0: 0.0, 1: 0.0, 2: 0.11, }, - }), - True, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "response_bias": {0: 0.0, 1: 0.0, 2: 0.89, }, - }), - True, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "response_bias": {0: 0.0, 1: 0.0, 2: 0.1011, }, - }), - True, - ), # doesn't round - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "response_bias": {0: 0.0, 1: 0.0, 2: 0.8999, }, - }), - True, - ), # doesn't round - ], -) -def test_no_response_bias(session_summary, expected): - assert criteria.no_response_bias(session_summary) == expected - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "training_day": {}, - "response_bias": {}, - }), - pytest.raises(DataFrameIndexError), - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "other_col": {0: 0.0, 1: 0.0, 2: 0.11, }, - }), - pytest.raises(DataFrameKeyError), - ), - ], -) -def test_no_response_bias_exception(session_summary, expected): - with expected: - criteria.no_response_bias(session_summary) - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 0.0, }, - }), - False, - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 100.0, }, - }), - False, - ), # non-inclusive - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 300.0, }, - }), - False, - ), # non-inclusive - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "num_contingent_trials": {0: 0.0, 1: 0.0, 2: 301.0, }, - }), - True, - ), - ], -) -def test_whole_lotta_trials(session_summary, expected): - assert criteria.whole_lotta_trials(session_summary) == expected - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "training_day": {}, - "num_contingent_trials": {}, - }), - pytest.raises(DataFrameIndexError), - ), - ( - pd.DataFrame({ - "training_day": {0: 0, 1: 1, 2: 3, }, - "other_col": {0: 0.0, 1: 0.0, 2: 301.0, }, - }), - pytest.raises(DataFrameKeyError), - ), - ] -) -def test_whole_lotta_trials_exception(session_summary, expected): - with expected: - criteria.whole_lotta_trials(session_summary) - - -@pytest.mark.parametrize( - "trials, expected", - [ - ( - pd.DataFrame({ - "training_day": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, # associate all with same training day - "trial_type": {0: "aborted", 1: "go", 2: "catch", 3: "go", }, - "trial_length": {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, }, - }), - True, - ), - ( - pd.DataFrame({ - "training_day": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, # associate all with same training day - "trial_type": {0: "aborted", 1: "go", 2: "catch", 3: "aborted", }, - "trial_length": {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, }, - }), - False, - ), # non-inclusive - ( - pd.DataFrame({ - "training_day": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, # associate all with same training day - "trial_type": {0: "aborted", 1: "go", 2: "aborted", 3: "aborted", }, - "trial_length": {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, }, - }), - False, - ), - ( - pd.DataFrame({ - "training_day": {}, # associate all with same training day - "trial_type": {}, - "trial_length": {}, - }), - False, - ), - ], -) -def test_mostly_useful(trials, expected): - assert criteria.mostly_useful(trials) == expected - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "task": {0: "Images", 1: "", 2: "", 3: "Images", }, - "dprime_peak": {0: 1.0, 1: 0.0, 2: 0.0, 3: 0.0, }, - "num_engaged_trials": {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, }, - }), - False, - ), - ( - pd.DataFrame({ - "task": {0: "", 1: "", 2: "", 3: "Images", 4: "Images", 5: "Images"}, - "dprime_peak": {0: 1.2, 1: 2.0, 2: 1.1, 3: 1.1, 4: 2.0, 5: 1.2, }, - "num_engaged_trials": {0: 101, 1: 102, 2: 200, 3: 101, 4: 102, 5: 99, }, - }), - False, - ), - ( - pd.DataFrame({ - "task": {0: "Images", 1: "Images", 2: "Images", 3: "Images", 4: "Images", 5: "Images"}, - "dprime_peak": {0: 1.2, 1: 2.0, 2: 1.1, 3: 1.1, 4: 2.0, 5: 1.2, }, - "num_engaged_trials": {0: 101, 1: 102, 2: 200, 3: 101, 4: 102, 5: 200, }, - }), - True, - ), - ], -) -def test_meets_engagement_criteria(session_summary, expected): - assert criteria.meets_engagement_criteria(session_summary) == expected - - -@pytest.mark.parametrize( - "session_summary, expected", - [ - ( - pd.DataFrame({ - "task": {0: "Images", 1: "Images", 2: "Images", 3: "Images", 4: "Images", 5: "Images"}, - "other_metric": {0: 1.2, 1: 2.0, 2: 1.1, 3: 1.1, 4: 2.0, 5: 1.2, }, - "num_engaged_trials": {0: 101, 1: 102, 2: 200, 3: 101, 4: 102, 5: 200, }, - }), - pytest.raises(DataFrameKeyError), - ), - ( - pd.DataFrame({ - "task": {0: "Images", 1: "Images", }, - "dprime_peak": {0: 1.2, 1: 2.0,}, - "num_engaged_trials": {0: 101, 1: 102}, - }), - pytest.raises(DataFrameIndexError), - ), - ], -) -def test_meets_engagement_criteria_exception(session_summary, expected): - with expected: - criteria.meets_engagement_criteria(session_summary) - - -@pytest.mark.parametrize( - "trials, expected", - [ - (pd.DataFrame({'training_day': {0: 0, 1: 1, 2: 3, }, }), False, ), - (pd.DataFrame({'training_day': {0: 0, 1: 1, 2: 40, }, }), True, ), # inclusive - (pd.DataFrame({'training_day': {0: 0, 1: 1, 2: 41, }, }), True, ), - ], -) -def test_summer_over(trials, expected): - assert criteria.summer_over(trials) == expected diff --git a/allensdk/test/brain_observatory/behavior/test_dprime.py b/allensdk/test/brain_observatory/behavior/test_dprime.py deleted file mode 100644 index c51771b0f7..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_dprime.py +++ /dev/null @@ -1,175 +0,0 @@ -import numpy as np -import pytest -import pandas as pd -import datetime -import pytz - -from allensdk.brain_observatory.behavior.dprime import get_hit_rate, get_false_alarm_rate, get_rolling_dprime, get_trial_count_corrected_false_alarm_rate, get_trial_count_corrected_hit_rate, get_dprime - - -NaN = float('nan') - - -@pytest.fixture -def mock_trials_fixture(): - - n_tr = 500 - np.random.seed(42) - change = np.random.random(n_tr) > 0.8 - incorrect = np.random.random(n_tr) > 0.8 - detect = change.copy() - detect[incorrect] = ~detect[incorrect] - - trials = pd.DataFrame({ - 'change': change, - 'detect': detect, - },) - trials['trial_type'] = trials['change'].map(lambda x: ['catch', 'go'][x]) - trials['response'] = trials['detect'] - trials['change_time'] = np.sort(np.random.rand(n_tr)) * 3600 - trials['reward_lick_latency'] = 0.1 - trials['reward_lick_count'] = 10 - trials['auto_rewarded'] = False - trials['lick_frames'] = [[] for row in trials.iterrows()] - trials['trial_length'] = 8.5 - trials['reward_times'] = trials.apply(lambda r: [r['change_time']+0.2] if r['change']*r['detect'] else [],axis=1) - trials['reward_volume'] = 0.005 * trials['reward_times'].map(len) - trials['response_latency'] = trials.apply(lambda r: 0.2 if r['detect'] else np.inf,axis=1) - trials['blank_duration_range'] = [[0.5, 0.5] for row in trials.iterrows()] - - metadata = {} - metadata['mouse_id'] = 'M999999' - metadata['user_id'] = 'johnd' - - metadata['startdatetime'] = datetime.datetime(2017, 7, 19, 10, 35, 8, 369000, tzinfo=pytz.utc) - metadata['dayofweek'] = metadata['startdatetime'].weekday() - metadata['startdatetime'] = metadata['startdatetime'] - - metadata['behavior_session_uuid'] = 12345 - metadata['stage'] = 'test' - metadata['stimulus'] = 'natural_scenes' - metadata['stimulus_distribution'] = 'exponential' - - for k, v in metadata.items(): - trials[k] = v - return trials - -from collections import defaultdict - -@pytest.fixture -def mock_rolling_dprime_fixture(mock_trials_fixture): - - data_dict = defaultdict(list) - for ri, row in mock_trials_fixture[['trial_type', 'response', 'change_time']].iterrows(): - assert not pd.isnull(row['change_time']) - if row['trial_type'] == 'go' and row['response'] == True: - hit = True - miss = false_alarm = correct_reject = False - elif row['trial_type'] == 'go' and row['response'] == False: - miss = True - hit = false_alarm = correct_reject = False - elif row['trial_type'] == 'catch' and row['response'] == True: - false_alarm = True - miss = hit = correct_reject = False - elif row['trial_type'] == 'catch' and row['response'] == False: - correct_reject = True - hit = false_alarm = miss = False - else: - raise RuntimeError - data_dict['hit'].append(hit) - data_dict['miss'].append(miss) - data_dict['false_alarm'].append(false_alarm) - data_dict['correct_reject'].append(correct_reject) - data_dict['aborted'].append(False) - - - - return pd.DataFrame(data_dict) - -def test_get_hit_rate(): - - hit, miss, aborted = ( - [0, 1, 0, 0, 0, 1], - [1, 0, 0, 0, 1, 0], - [0, 0, 1, 1, 0, 0]) - - result = get_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=3) - np.testing.assert_allclose(result, [0, .5, 1/3, 2/3]) - - -def test_get_false_alarm_rate(mock_trials_fixture): - - false_alarm, correct_reject, aborted = ( - [0, 1, 0, 0, 0, 1], - [1, 0, 0, 0, 1, 0], - [0, 0, 1, 1, 0, 0]) - - result = get_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=3) - np.testing.assert_allclose(result, [0, .5, 1/3, 2/3]) - - -def test_rolling_dprime_unit(): - - hit, miss, false_alarm, correct_reject, aborted = ( - [0, 0, 1, 0, 0, 1], - [1, 1, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0]) - - hr = get_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=3) - far = get_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=3) - result = get_rolling_dprime(hr, far) - np.testing.assert_allclose(result, [NaN, NaN, NaN, 2.326348, 4.652696, 4.652696]) - - -def test_rolling_dprime_integration_legacy(mock_rolling_dprime_fixture): - sliding_window = 100 - - hit = mock_rolling_dprime_fixture.hit - miss = mock_rolling_dprime_fixture.miss - false_alarm = mock_rolling_dprime_fixture.false_alarm - correct_reject = mock_rolling_dprime_fixture.correct_reject - aborted = mock_rolling_dprime_fixture.aborted - - hr = get_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=sliding_window) - cr = get_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=sliding_window) - dprime = get_rolling_dprime(hr, cr) - - assert dprime[2] == 4.6526957480816815 - - -def test_rolling_dprime_integration(mock_rolling_dprime_fixture): - sliding_window = 100 - - hit = mock_rolling_dprime_fixture.hit - miss = mock_rolling_dprime_fixture.miss - false_alarm = mock_rolling_dprime_fixture.false_alarm - correct_reject = mock_rolling_dprime_fixture.correct_reject - aborted = mock_rolling_dprime_fixture.aborted - - hr = get_trial_count_corrected_hit_rate(hit=hit, miss=miss, aborted=aborted, sliding_window=sliding_window) - cr = get_trial_count_corrected_false_alarm_rate(false_alarm=false_alarm, correct_reject=correct_reject, aborted=aborted, sliding_window=sliding_window) - dprime = get_rolling_dprime(hr, cr) - - assert dprime[2] == 0.6744897501960817 - - -@pytest.mark.parametrize('hr, far, dprime', [ - pytest.param(1., 1., 0.), - pytest.param(.5, .5, 0.), - pytest.param(.25, .5, -0.6744897501960817), - pytest.param(.5, .25, 0.6744897501960817), -]) -def test_dprime(hr, far, dprime): - val = get_dprime(hr, far) - assert val == dprime - if hr == far: - assert dprime == 0 - if hr < far: - assert val < 0 - elif hr > far: - assert val > 0 - else: - pass - diff --git a/allensdk/test/brain_observatory/behavior/test_event_detection.py b/allensdk/test/brain_observatory/behavior/test_event_detection.py deleted file mode 100644 index 9d1b4b2fae..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_event_detection.py +++ /dev/null @@ -1,21 +0,0 @@ -import numpy as np -import pytest - -from allensdk.brain_observatory.behavior.event_detection import \ - filter_events_array - - -def test_filter_events_array(): - with pytest.raises(ValueError): - filter_events_array(arr=np.array([0.0, 0.0, 0.6])) - - with pytest.raises(ValueError): - filter_events_array(arr=np.array([[0.0, 0.0, 0.6]]), n_time_steps=0) - - arr = np.array([[0.0, 0.0, 0.6]]) - filtered_events_array = filter_events_array(arr=arr) - assert arr.shape[0] == filtered_events_array.shape[0] - assert arr.shape[1] == filtered_events_array.shape[1] - - expected = np.array([[0.0, 0.0, 0.199559]]) - assert (np.abs(filtered_events_array - expected) < 1e-6).all() diff --git a/allensdk/test/brain_observatory/behavior/test_eye_tracking_processing.py b/allensdk/test/brain_observatory/behavior/test_eye_tracking_processing.py deleted file mode 100644 index 622770cbc3..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_eye_tracking_processing.py +++ /dev/null @@ -1,228 +0,0 @@ -from pathlib import Path - -import pytest - -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.behavior.eye_tracking_processing import ( - load_eye_tracking_hdf, determine_outliers, compute_circular_area, - compute_elliptical_area, determine_likely_blinks, - process_eye_tracking_data) - - -def create_preload_eye_tracking_df(data: np.ndarray) -> pd.DataFrame: - columns = ["center_x", "center_y", "width", "height", "phi"] - return pd.DataFrame(data, columns=columns) - - -def create_loaded_eye_tracking_df(data: np.ndarray) -> pd.DataFrame: - columns = ["cr_center_x", "cr_center_y", "cr_width", "cr_height", "cr_phi", - "eye_center_x", "eye_center_y", "eye_width", "eye_height", - "eye_phi", "pupil_center_x", "pupil_center_y", "pupil_width", - "pupil_height", "pupil_phi"] - df = pd.DataFrame(data, columns=columns) - df.index.name = 'frame' - return df - - -def create_area_df(data: np.ndarray) -> pd.DataFrame: - columns = ["cr_area", "eye_area", "pupil_area"] - return pd.DataFrame(data, columns=columns) - - -def create_refined_eye_tracking_df(data: np.ndarray) -> pd.DataFrame: - columns = ["timestamps", "cr_area", "eye_area", "pupil_area", - "likely_blink", "pupil_area_raw", "cr_area_raw", "eye_area_raw", - "cr_center_x", "cr_center_y", "cr_width", "cr_height", "cr_phi", - "eye_center_x", "eye_center_y", "eye_width", "eye_height", - "eye_phi", "pupil_center_x", "pupil_center_y", "pupil_width", - "pupil_height", "pupil_phi"] - df = pd.DataFrame(data, columns=columns) - df.index.name = 'frame' - # Initializing a df coerces all data to one dtype - # restoring the bool dtype for the 'likely_blink' column. - df['likely_blink'] = df['likely_blink'].apply(bool) - return df - - -@pytest.fixture -def hdf_fixture(request, tmp_path) -> Path: - """Creates a mock eye tracking h5 file to test loading functionality""" - tmp_hdf_path = tmp_path / "mock_eye_tracking_ellipse_fits.h5" - - test_data = request.param - cr = create_preload_eye_tracking_df(test_data["cr"]) - eye = create_preload_eye_tracking_df(test_data["eye"]) - pupil = create_preload_eye_tracking_df(test_data["pupil"]) - - cr.to_hdf(tmp_hdf_path, key="cr", mode="w") - eye.to_hdf(tmp_hdf_path, key="eye", mode="a") - pupil.to_hdf(tmp_hdf_path, key="pupil", mode="a") - - return tmp_hdf_path - - -@pytest.mark.parametrize("hdf_fixture, expected", [ - ({"cr": np.array([[1., 2., 3., 4., 5.]]), - "eye": np.array([[6., 7., 8., 9., 10.]]), - "pupil": np.array([[11., 12., 13., 14., 15.]])}, - - create_loaded_eye_tracking_df( - np.array([[1., 2., 3., 4., 5., 6., 7., 8., - 9., 10., 11., 12., 13., 14., 15.]])) - ), - - ({"cr": np.array([[5 + 2j, 4 + 1j, 3 + 1j, 2 + 8j, 1 + 1j]]), - "eye": np.array([[6, 7, 8, 9, 10]]), - "pupil": np.array([[15 + 1j, 14 + 3j, 13 + 2j, 12 + 1j, 11 + 1j]])}, - - create_loaded_eye_tracking_df( - np.array([[5., 4., 3., 2., 1., 6., 7., 8., - 9., 10., 15., 14., 13., 12., 11.]])) - ), - -], indirect=["hdf_fixture"]) -def test_load_eye_tracking_hdf(hdf_fixture: Path, expected: pd.DataFrame): - obtained = load_eye_tracking_hdf(hdf_fixture) - assert expected.equals(obtained) - - -@pytest.mark.parametrize("data_df, z_threshold, expected", [ - (create_area_df( - np.array([[1, 1, 2], - [2, 2, 1], - [1, 7, 3], - [1, 1, 1], - [1, 3, 2], - [1, 1, 1], - [1, 2, 1], - [2, 1, 1000]])), - 2.5, - pd.Series([False, False, False, False, False, False, False, True])), - - (create_area_df( - np.array([[1, 1, 2], - [2, 2, 1], - [1, 7, 3], - [1, 1, 1], - [1, 3, 2], - [1, 1, 1], - [1, 2, 1], - [2, 1, 1000]])), - 2.0, - pd.Series([False, False, True, False, False, False, False, True])), - -]) -def test_determine_outliers(data_df, z_threshold, expected): - obtained = determine_outliers(data_df, z_threshold) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("df_row, expected", [ - (pd.Series([3, 2], index=["width", "height"]), 9 * np.pi), - (pd.Series([2, 3], index=["width", "height"]), 9 * np.pi), -]) -def test_compute_circular_area(df_row: pd.Series, expected: float): - obtained_area = compute_circular_area(df_row) - assert obtained_area == expected - - -@pytest.mark.parametrize("df_row, expected", [ - (pd.Series([3, 2], index=["width", "height"]), 6 * np.pi), - (pd.Series([2, 3], index=["width", "height"]), 6 * np.pi), -]) -def test_compute_elliptical_area(df_row: pd.Series, expected: float): - obtained_area = compute_elliptical_area(df_row) - assert obtained_area == expected - - -@pytest.mark.parametrize( - "eye_areas, pupil_areas, outliers, dilation_frames, expected", - [ - (pd.Series([4, 8, 3, 20, np.nan, 10, 21, 19, 42]), - pd.Series([np.nan, 10, 2, 30, 99, 80, 93, 18, 777]), - pd.Series([False, False, False, False, False, False, - False, False, True]), - 2, - pd.Series([True, True, True, True, True, True, True, True, True])), - - (pd.Series([4, 8, 3, 20, np.nan, 10, 21, 19, 42]), - pd.Series([np.nan, 10, 2, 30, 99, 80, 93, 18, 777]), - pd.Series([False, False, False, False, False, False, - False, False, True]), - 1, - pd.Series([True, True, False, True, True, True, False, True, True])), - - - (pd.Series([4, 8, 3, 20, np.nan, 10, 21, 19, 42]), - pd.Series([np.nan, 10, 2, 30, 99, 80, 93, 18, 777]), - pd.Series([False, False, False, False, False, False, - False, False, True]), - 0, - pd.Series([True, False, False, False, True, False, False, - False, True])), - ]) -def test_determine_likely_blinks(eye_areas, pupil_areas, outliers, - dilation_frames, expected): - obtained = determine_likely_blinks(eye_areas, pupil_areas, outliers, - dilation_frames) - assert expected.equals(obtained) - - -@pytest.mark.parametrize("eye_tracking_df, frame_times", [ - (create_loaded_eye_tracking_df( - np.array([[1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1], - [2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2]])), - pd.Series(np.arange(0, 1.8, 0.1))), -]) -def test_process_eye_tracking_data_raises_on_sync_error(eye_tracking_df, - frame_times): - """ - Test that an error is raised when the number of sync timestamps exceeds - the number of eye tracking frames by more than 15 - """ - with pytest.raises(RuntimeError, match='Error! The number of sync file'): - process_eye_tracking_data(eye_tracking_df, frame_times) - - -@pytest.mark.parametrize("eye_tracking_df, frame_times", [ - (create_loaded_eye_tracking_df( - np.array([[1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1], - [2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2]])), - pd.Series(np.arange(0, 1.7, 0.1))), -]) -def test_process_eye_tracking_data_truncation(eye_tracking_df, - frame_times): - """ - Test that the array of sync times is truncated when the number - of raw sync timestamps exceeds the numer of eye tracking frames - by <= 15 - """ - df = process_eye_tracking_data(eye_tracking_df, frame_times) - np.testing.assert_array_almost_equal(df.timestamps.to_numpy(), - np.array([0.0, 0.1]), - decimal=10) - - -@pytest.mark.parametrize("eye_tracking_df, frame_times, expected", [ - (create_loaded_eye_tracking_df( - np.array([[1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., - 12., 13., 14., 15.], - [2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., - 13., 14., 15., 16.]])), - pd.Series([0.1, 0.2]), - create_refined_eye_tracking_df( - np.array([[0.1, 12 * np.pi, 72 * np.pi, 196 * np.pi, False, - 196 * np.pi, 12 * np.pi, 72 * np.pi, - 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., - 13., 14., 15.], - [0.2, 20 * np.pi, 90 * np.pi, 225 * np.pi, False, - 225 * np.pi, 20 * np.pi, 90 * np.pi, - 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., - 14., 15., 16.]])) - ), -]) -def test_process_eye_tracking_data(eye_tracking_df, frame_times, expected): - obtained = process_eye_tracking_data(eye_tracking_df, frame_times) - pd.testing.assert_frame_equal(obtained, expected) diff --git a/allensdk/test/brain_observatory/behavior/test_mtrain_annotate.py b/allensdk/test/brain_observatory/behavior/test_mtrain_annotate.py deleted file mode 100644 index 983a419aef..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_mtrain_annotate.py +++ /dev/null @@ -1,18 +0,0 @@ -import pytest -import pandas as pd - -from allensdk.brain_observatory.behavior.mtrain import annotate_change_detect - - -@pytest.fixture -def trials(): - return pd.DataFrame({ - 'trial_type': ['go', 'catch', 'go', 'catch'], - 'response': [1.0, 1.0, 0.0, 0.0]}) - - -def test_annotate_change_detect(trials): - - annotate_change_detect(trials) - pd.testing.assert_series_equal(trials['change'], pd.Series([True, False, True, False], name='change')) - pd.testing.assert_series_equal(trials['detect'], pd.Series([True, True, False, False], name='detect')) diff --git a/allensdk/test/brain_observatory/behavior/test_prior_exposure_count_processing.py b/allensdk/test/brain_observatory/behavior/test_prior_exposure_count_processing.py deleted file mode 100644 index dbce9cf848..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_prior_exposure_count_processing.py +++ /dev/null @@ -1,65 +0,0 @@ -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.behavior.behavior_project_cache.tables.util \ - .prior_exposure_processing import \ - get_prior_exposures_to_session_type, get_prior_exposures_to_image_set, \ - get_prior_exposures_to_omissions - - -def test_prior_exposure_to_session_type(): - """Tests normal behavior as well as case where session type is missing""" - df = pd.DataFrame({ - 'session_type': ['A', 'A', None, 'A', 'B'], - 'mouse_id': [0, 0, 0, 0, 1], - 'date_of_acquisition': [0, 1, 2, 3, 0] - }, index=pd.Series([0, 1, 2, 3, 4], name='behavior_session_id')) - expected = pd.Series([0, 1, np.nan, 2, 0], - index=pd.Series([0, 1, 2, 3, 4], - name='behavior_session_id')) - obtained = get_prior_exposures_to_session_type(df=df) - pd.testing.assert_series_equal(expected, obtained) - - -def test_prior_exposure_to_image_set(): - """Tests normal behavior as well as case where session type is not an - image set type""" - df = pd.DataFrame({ - 'session_type': ['TRAINING_1_images_A', 'OPHYS_2_images_A_passive', - 'foo', 'OPHYS_3_images_A', 'B'], - 'mouse_id': [0, 0, 0, 0, 1], - 'date_of_acquisition': [0, 1, 2, 3, 0] - }, index=pd.Index([0, 1, 2, 3, 4], name='behavior_session_id')) - expected = pd.Series([0, 1, np.nan, 2, np.nan], - index=pd.Series([0, 1, 2, 3, 4], - name='behavior_session_id')) - obtained = get_prior_exposures_to_image_set(df=df) - pd.testing.assert_series_equal(expected, obtained) - - -def test_prior_exposure_to_omissions(): - """Tests normal behavior and tests case where flash_omit_probability - needs to be looked up for habituation session. Only 1 of the habituation - sessions has omissions""" - df = pd.DataFrame({ - 'session_type': ['OPHYS_1_images_A', 'OPHYS_2_images_A_passive', - 'OPHYS_1_habituation', 'OPHYS_2_habituation', - 'OPHYS_3_habituation'], - 'mouse_id': [0, 0, 1, 1, 1], - 'foraging_id': [1, 2, 3, 4, 5], - 'date_of_acquisition': [0, 1, 0, 1, 2] - }, index=pd.Index([0, 1, 2, 3, 4], name='behavior_session_id')) - expected = pd.Series([0, 1, 0, 0, 1], - index=pd.Index([0, 1, 2, 3, 4], - name='behavior_session_id')) - - class MockFetchApi: - def get_behavior_stage_parameters(self, foraging_ids): - return { - 3: {}, - 4: {'flash_omit_probability': 0.05}, - 5: {} - } - fetch_api = MockFetchApi() - obtained = get_prior_exposures_to_omissions(df=df, fetch_api=fetch_api) - pd.testing.assert_series_equal(expected, obtained) diff --git a/allensdk/test/brain_observatory/behavior/test_rewards_processing.py b/allensdk/test/brain_observatory/behavior/test_rewards_processing.py deleted file mode 100644 index d344bce6ee..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_rewards_processing.py +++ /dev/null @@ -1,38 +0,0 @@ -import pandas as pd -import numpy as np - -from allensdk.brain_observatory.behavior.rewards_processing import get_rewards - - -def test_get_rewards(): - data = { - "items": { - "behavior": { - "trial_log": [ - { - 'rewards': [(0.007, 1085.96, 55)], - 'trial_params': { - 'catch': False, 'auto_reward': False, - 'change_time': 5}}, - { - 'rewards': [(0.008, 1090.01, 66)], - 'trial_params': { - 'catch': False, 'auto_reward': True, - 'change_time': 6}}, - { - 'rewards': [], - 'trial_params': { - 'catch': False, 'auto_reward': False, - 'change_time': 4}, - }, - ] - }}} - expected = pd.DataFrame( - {"volume": [0.007, 0.008], - "timestamps": [14.0, 15.0], - "autorewarded": [False, True]}) - - timesteps = -1*np.ones(100, dtype=float) - timesteps[55] = 14.0 - timesteps[66] = 15.0 - pd.testing.assert_frame_equal(expected, get_rewards(data, timesteps)) diff --git a/allensdk/test/brain_observatory/behavior/test_session_metrics.py b/allensdk/test/brain_observatory/behavior/test_session_metrics.py deleted file mode 100644 index 8fc6ad96ef..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_session_metrics.py +++ /dev/null @@ -1,71 +0,0 @@ -import pytest -from allensdk.brain_observatory.behavior import session_metrics as metrics -import pandas as pd -import numpy as np - - -@pytest.mark.parametrize( - "trials, detect_col, trial_types, expected", - [ - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True]}), - "detect", - ["go", "catch"], - 0.75, - ), - ( - pd.DataFrame({"trial_type":[ "go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True]}), - "detect", - ["go"], - 0.5, - ), - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True]}), - "detect", - [], - 0.8, - ), - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True]}), - "detect", - ["early"], - np.nan, - ), - ], -) -def test_response_bias(trials, detect_col, trial_types, expected): - assert metrics.response_bias(trials, detect_col, trial_types) == \ - pytest.approx(expected, nan_ok=True) - - -@pytest.mark.parametrize( - "trials, expected", - [ - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"],}), - 4, - ), - ( - pd.DataFrame({"trial_type":[ "go", "go", "go"],}), - 3, - ), - ( - pd.DataFrame({"trial_type": ["catch"],}), - 1, - ), - ( - pd.DataFrame({"trial_type": [],}), - 0, - ), - ( - pd.DataFrame({"trial_type": ["aborted", "nogo"]}), - 0, - ) - ], -) -def test_num_contingent_trials(trials, expected): - assert metrics.num_contingent_trials(trials) == expected diff --git a/allensdk/test/brain_observatory/behavior/test_stimulus_processing.py b/allensdk/test/brain_observatory/behavior/test_stimulus_processing.py deleted file mode 100644 index 02592a2c48..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_stimulus_processing.py +++ /dev/null @@ -1,459 +0,0 @@ -import os - -import numpy as np -import pandas as pd -import pytest - -from allensdk.brain_observatory.behavior.stimulus_processing import ( - get_stimulus_presentations, _get_stimulus_epoch, _get_draw_epochs, - get_visual_stimuli_df, get_stimulus_metadata, get_gratings_metadata, - get_stimulus_templates, is_change_event) -from allensdk.brain_observatory.behavior.data_objects.stimuli\ - .stimulus_templates import StimulusImage -from allensdk.test.brain_observatory.behavior.conftest import get_resources_dir - - -@pytest.fixture() -def behavior_stimuli_time_fixture(request): - """ - Fixture that allows for parameterization of behavior_stimuli stimuli - time data. - """ - timestamp_count = request.param["timestamp_count"] - time_step = request.param["time_step"] - - timestamps = np.array([time_step * i for i in range(timestamp_count)]) - - return timestamps - - -@pytest.mark.parametrize( - "behavior_stimuli_data_fixture,current_set_ix,start_frame," - "n_frames,expected", [ - ({'images_set_log': [ - ('Image', 'im065', 5.809955710916157, 0), - ('Image', 'im061', 314.06612555068784, 6), - ('Image', 'im062', 348.5941232265203, 12) - ], - 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, - 0, 0, 18, (0, 6)), - ({'images_set_log': [ - ('Image', 'im065', 5.809955710916157, 0), - ('Image', 'im061', 314.06612555068784, 6), - ('Image', 'im062', 348.5941232265203, 12) - ], - 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, - 2, 11, 18, (11, 18)) - ], indirect=["behavior_stimuli_data_fixture"] -) -def test_get_stimulus_epoch(behavior_stimuli_data_fixture, - current_set_ix, start_frame, n_frames, expected): - items = behavior_stimuli_data_fixture["items"] - log = items["behavior"]["stimuli"]["images"]["set_log"] - actual = _get_stimulus_epoch(log, current_set_ix, start_frame, n_frames) - assert actual == expected - - -@pytest.mark.parametrize( - "behavior_stimuli_data_fixture,start_frame,stop_frame,expected," - "stimuli_type", [ - ({'images_set_log': [ - ('Image', 'im065', 5.809955710916157, 0), - ('Image', 'im061', 314.06612555068784, 6), - ('Image', 'im062', 348.5941232265203, 12) - ], - 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, - 0, 6, [(1, 4)], 'images'), - ({'images_set_log': [ - ('Image', 'im065', 5.809955710916157, 0), - ('Image', 'im061', 314.06612555068784, 6), - ('Image', 'im062', 348.5941232265203, 12) - ], - 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, - 0, 11, [(1, 4), (8, 11)], 'images'), - ({'images_set_log': [ - ('Image', 'im065', 5.809955710916157, 0), - ('Image', 'im061', 314.06612555068784, 6), - ('Image', 'im062', 348.5941232265203, 12) - ], - 'images_draw_log': ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, - 0, 22, [(1, 4), (8, 11), (15, 18)], 'images'), - ({"grating_set_log": [ - ("Ori", 90, 3.585, 0), - ("Ori", 180, 40.847, 6), - ("Ori", 270, 62.633, 12) - ], - "grating_draw_log": ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, - 0, 6, [(1, 4)], 'grating'), - ({"grating_set_log": [ - ("Ori", 90.0, 3.585, 0), - ("Ori", 180.0, 40.847, 6), - ("Ori", 270.0, 62.633, 12) - ], - "grating_draw_log": ([0] + [1] * 3 + [0] * 3) * 3 + [0]}, - 6, 11, [(8, 11)], 'grating') - ], indirect=['behavior_stimuli_data_fixture'] -) -def test_get_draw_epochs(behavior_stimuli_data_fixture, - start_frame, stop_frame, expected, stimuli_type): - draw_log = (behavior_stimuli_data_fixture["items"]["behavior"] - ["stimuli"][stimuli_type]["draw_log"]) # noqa: E128 - actual = _get_draw_epochs(draw_log, start_frame, stop_frame) - assert actual == expected - - -@pytest.mark.parametrize("behavior_stimuli_data_fixture", ({},), - indirect=["behavior_stimuli_data_fixture"]) -def test_get_stimulus_templates(behavior_stimuli_data_fixture): - templates = get_stimulus_templates(behavior_stimuli_data_fixture, - grating_images_dict={}) - - assert templates.image_set_name == 'test_image_set' - assert len(templates) == 1 - assert list(templates.keys()) == ['im065'] - - for img in templates.values(): - assert isinstance(img, StimulusImage) - - expected_path = os.path.join(get_resources_dir(), 'stimulus_template', - 'expected') - - expected_unwarped_path = os.path.join( - expected_path, 'im065_unwarped.pkl') - expected_unwarped = pd.read_pickle(expected_unwarped_path) - - expected_warped_path = os.path.join( - expected_path, 'im065_warped.pkl') - expected_warped = pd.read_pickle(expected_warped_path) - - for img_name in templates: - img = templates[img_name] - assert np.allclose(a=expected_unwarped, - b=img.unwarped, equal_nan=True) - assert np.allclose(a=expected_warped, - b=img.warped, equal_nan=True) - - for img_name, img in templates.items(): - img = templates[img_name] - assert np.allclose(a=expected_unwarped, - b=img.unwarped, equal_nan=True) - assert np.allclose(a=expected_warped, - b=img.warped, equal_nan=True) - - -@pytest.mark.parametrize(("behavior_stimuli_data_fixture, " - "grating_images_dict, expected"), [ - ({"has_images": False}, - {"gratings_90.0": {"warped": np.ones((2, 2)), - "unwarped": np.ones( - (2, 2)) * 2}}, - {}), - ], indirect=["behavior_stimuli_data_fixture"]) -def test_get_stimulus_templates_for_gratings(behavior_stimuli_data_fixture, - grating_images_dict, expected): - templates = get_stimulus_templates(behavior_stimuli_data_fixture, - grating_images_dict=grating_images_dict) - - assert templates.image_set_name == 'grating' - assert list(templates.keys()) == ['gratings_90.0'] - assert np.allclose(templates['gratings_90.0'].warped, - np.array([[1, 1], [1, 1]])) - assert np.allclose(templates['gratings_90.0'].unwarped, - np.array([[2, 2], [2, 2]])) - - -# def test_get_images_dict(): -# pass -# # TODO -# # This is too hard-coded to be testable right now. -# # convert_filepath_caseinsensitive prevents using any tempdirs/tempfiles - - -@pytest.mark.parametrize("behavior_stimuli_data_fixture, remove_stimuli, " - "starting_index, expected_metadata", [ - ({ - "grating_set_log": [] - }, [], 0, - { - 'image_category': {}, - 'image_name': {}, - 'image_set': {}, - 'phase': {}, - 'spatial_frequency': {}, - 'orientation': {}, - 'image_index': {} - }), - ({}, [], 0, - { - 'image_category': {0: 'grating'}, - 'image_name': {0: 'gratings_90.0'}, - 'image_set': {0: 'grating'}, - 'phase': {0: None}, - 'spatial_frequency': {0: None}, - 'orientation': {0: 90}, - 'image_index': {0: 0} - }), - ({'grating_phase': 0.5, - 'grating_spatial_frequency': 12}, [], 0, - { - 'image_category': {0: 'grating'}, - 'image_name': {0: 'gratings_90.0'}, - 'image_set': {0: 'grating'}, - 'phase': {0: 0.5}, - 'spatial_frequency': {0: 12}, - 'orientation': {0: 90}, - 'image_index': {0: 0} - }), - ({"grating_set_log": [ - ("Ori", 90.0, 3.5, 0), - ("Ori", 270.0, 15, 6) - ], - "grating_phase": 0.5, - "grating_spatial_frequency": 12}, - [], 12, - { - 'image_category': {0: 'grating', - 1: 'grating'}, - 'image_name': {0: 'gratings_90.0', - 1: 'gratings_270.0'}, - 'image_set': {0: 'grating', - 1: 'grating'}, - 'phase': {0: 0.5, 1: 0.5}, - 'spatial_frequency': {0: 12, 1: 12}, - 'orientation': {0: 90, 1: 270}, - 'image_index': {0: 12, 1: 13} - }), - ({}, ['grating'], 0, - { - 'image_category': {}, - 'image_name': {}, - 'image_set': {}, - 'phase': {}, - 'spatial_frequency': {}, - 'orientation': {}, - 'image_index': {} - }), - ({"grating_set_log": - [ - ("Ori", 90, 3, 0) - ], - "grating_phase": 0.5, - "grating_spatial_frequency": 0.25}, - [], 0, - { - 'image_category': {0: 'grating'}, - 'image_name': {0: 'gratings_90.0'}, - 'image_set': {0: 'grating'}, - 'phase': {0: 0.5}, - 'spatial_frequency': {0: 0.25}, - 'orientation': {0: 90}, - 'image_index': {0: 0} - }) - ], - indirect=['behavior_stimuli_data_fixture']) -def test_get_gratings_metadata(behavior_stimuli_data_fixture, remove_stimuli, - starting_index, expected_metadata): - stimuli = behavior_stimuli_data_fixture['items']['behavior']['stimuli'] - for remove_stim in remove_stimuli: - del stimuli[remove_stim] - grating_meta = get_gratings_metadata(stimuli, start_idx=starting_index) - - assert grating_meta.to_dict() == expected_metadata - - -@pytest.mark.parametrize("behavior_stimuli_data_fixture, remove_stimuli, " - "expected_metadata", [ - ({'grating_phase': 10.0, - 'grating_spatial_frequency': 90.0, - "grating_set_log": [ - ("Ori", 90.0, 3.585, 0), - ("Ori", 180.0, 40.847, 6), - ("Ori", 270.0, 62.633, 12)] - }, - ['images'], - {'image_index': [0, 1, 2, 3], - 'image_name': ['gratings_90.0', - 'gratings_180.0', - 'gratings_270.0', 'omitted'], - 'image_category': ['grating', - 'grating', 'grating', - 'omitted'], - 'image_set': ['grating', 'grating', - 'grating', 'omitted'], - 'phase': [10, 10, 10, None], - 'spatial_frequency': [90, 90, - 90, None], - 'orientation': [90, 180, 270, None]}), - ({}, ['images', 'grating'], - {'image_index': [0], - 'image_name': ['omitted'], - 'image_category': ['omitted'], - 'image_set': ['omitted'], - 'phase': [None], - 'spatial_frequency': [None], - 'orientation': [None]})], - indirect=['behavior_stimuli_data_fixture']) -def test_get_stimulus_metadata(behavior_stimuli_data_fixture, - remove_stimuli, expected_metadata): - for key in remove_stimuli: - # do this because at current images are not tested and there's a - # hard coded path that prevents testing when this is fixed this can - # be removed. - del behavior_stimuli_data_fixture['items']['behavior']['stimuli'][key] - stimulus_metadata = get_stimulus_metadata(behavior_stimuli_data_fixture) - - expected_df = pd.DataFrame.from_dict(expected_metadata) - expected_df.set_index(['image_index'], inplace=True, drop=True) - - assert stimulus_metadata.equals(expected_df) - - -@pytest.mark.parametrize("behavior_stimuli_time_fixture," - "behavior_stimuli_data_fixture, " - "expected", [ - ({"timestamp_count": 15, "time_step": 1}, - {"images_set_log": [ - ('Image', 'im065', 5, 0), - ('Image', 'im064', 25, 6) - ], - "images_draw_log": (([0] * 2 + [1] * 2 + - [0] * 3) * 2 + [0]), - "grating_set_log": [ - ("Ori", 90, 3.5, 0), - ("Ori", 270, 15, 6) - ], - "grating_draw_log": ( - ([0] + [1] * 3 + [0] * 3) - * 2 + [0])}, - {"duration": [3.0, 2.0, 3.0, 2.0], - "end_frame": [5.0, 5.0, 12.0, 12.0], - "image_name": [np.NaN, 'im065', np.NaN, - 'im064'], - "index": [2, 0, 3, 1], - "omitted": [False, False, False, False], - "orientation": [90, np.NaN, 270, np.NaN], - "start_frame": [2.0, 3.0, 9.0, 10.0], - "start_time": [2, 3, 9, 10], - "stop_time": [5, 5, 12, 12]}) - ], indirect=['behavior_stimuli_time_fixture', - 'behavior_stimuli_data_fixture']) -def test_get_stimulus_presentations(behavior_stimuli_time_fixture, - behavior_stimuli_data_fixture, - expected): - presentations_df = get_stimulus_presentations( - behavior_stimuli_data_fixture, - behavior_stimuli_time_fixture) - - expected_df = pd.DataFrame.from_dict(expected) - - assert presentations_df.equals(expected_df) - - -@pytest.mark.parametrize("behavior_stimuli_time_fixture," - "behavior_stimuli_data_fixture," - "expected_data", [ - ({"timestamp_count": 15, "time_step": 1}, - {"images_set_log": [ - ('Image', 'im065', 5, 0), - ('Image', 'im064', 25, 6) - ], - "images_draw_log": (([0] * 2 + [1] * 2 + - [0] * 3) * 2 + [0]), - "grating_set_log": [ - ("Ori", 90, 3.5, 0), - ("Ori", 270, 15, 6) - ], - "grating_draw_log": ( - ([0] + [1] * 3 + [0] * 3) - * 2 + [0])}, - {"orientation": [90, None, 270, None], - "image_name": [None, 'im065', None, 'im064'], - "frame": [2.0, 3.0, 9.0, 10.0], - "end_frame": [5.0, 5.0, 12.0, 12.0], - "time": [2.0, 3.0, 9.0, 10.0], - "duration": [3.0, 2.0, 3.0, 2.0], - "omitted": [False, False, False, False]}), - - # test case with images and a static grating - ({"timestamp_count": 30, "time_step": 1}, - {"images_set_log": [ - ('Image', 'im065', 5, 0), - ('Image', 'im064', 25, 6) - ], - "images_draw_log": (([0] * 2 + [1] * 2 + - [0] * 3) * 2 + [ - 0] * 16), - "grating_set_log": [ - ("Ori", 90, -1, 12), - # -1 because that element is not used - ("Ori", 270, -1, 24) - ], - "grating_draw_log": ( - [0] * 17 + [1] * 11 + [0, 0])}, - {"orientation": [None, None, 90, 270], - "image_name": ['im065', 'im064', None, None], - "frame": [3.0, 10.0, 18.0, 25.0], - "end_frame": [5.0, 12.0, 25.0, 29.0], - "time": [3.0, 10.0, 18.0, 25.0], - "duration": [2.0, 2.0, 7.0, 4.0], - "omitted": [False, False, False, False]}) - ], - indirect=["behavior_stimuli_time_fixture", - "behavior_stimuli_data_fixture"]) -def test_get_visual_stimuli_df(behavior_stimuli_time_fixture, - behavior_stimuli_data_fixture, - expected_data): - stimuli_df = get_visual_stimuli_df(behavior_stimuli_data_fixture, - behavior_stimuli_time_fixture) - stimuli_df = stimuli_df.drop('index', axis=1) - - expected_df = pd.DataFrame.from_dict(expected_data) - assert stimuli_df.equals(expected_df) - - -def test_is_change_event_no_change(): - """Test case for no change""" - stimulus_presentations = pd.DataFrame({ - 'image_name': ['A', 'A', 'A'], - 'omitted': [False, False, False] - }) - - obtained = is_change_event(stimulus_presentations=stimulus_presentations) - expected = pd.Series([False, False, False], name='is_change') - pd.testing.assert_series_equal(obtained, expected) - - -def test_is_change_event_all_change(): - """Test case for all change""" - stimulus_presentations = pd.DataFrame({ - 'image_name': ['A', 'B', 'C'], - 'omitted': [False, False, False] - }) - - obtained = is_change_event(stimulus_presentations=stimulus_presentations) - expected = pd.Series([False, True, True], name='is_change') - pd.testing.assert_series_equal(obtained, expected) - - -def test_is_change_omission(): - """Test case for single omission""" - stimulus_presentations = pd.DataFrame({ - 'image_name': ['A', 'B', 'C'], - 'omitted': [False, True, False] - }) - - obtained = is_change_event(stimulus_presentations=stimulus_presentations) - expected = pd.Series([False, False, True], name='is_change') - pd.testing.assert_series_equal(obtained, expected) - - -def test_is_change_mult_omission(): - """Test case for multiple omission""" - stimulus_presentations = pd.DataFrame({ - 'image_name': ['A', 'B', 'C', 'D'], - 'omitted': [False, True, True, False] - }) - - obtained = is_change_event(stimulus_presentations=stimulus_presentations) - expected = pd.Series([False, False, False, True], name='is_change') - pd.testing.assert_series_equal(obtained, expected) diff --git a/allensdk/test/brain_observatory/behavior/test_sync_processing.py b/allensdk/test/brain_observatory/behavior/test_sync_processing.py deleted file mode 100644 index 02d8479998..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_sync_processing.py +++ /dev/null @@ -1,76 +0,0 @@ -import os -import pytest -import numpy as np -import allensdk.brain_observatory.behavior.sync as sync -from allensdk.brain_observatory.sync_dataset import Dataset - -base_dir = os.path.join( - "/", - "allen", - "programs", - "braintv", - "production", - "visualbehavior", - "prod0", - "specimen_789992909", - "ophys_session_819949602", -) -sync_path=os.path.join( - base_dir, - "819949602_sync.h5" -) - - -@pytest.mark.requires_bamboo -@pytest.mark.parametrize("sync_path, sync_key, count_exp, last_exp", [ - [sync_path, "ophys_frames", 140082, 4530.11659], - [sync_path, "lick_times", 2099, 3860.94482], - [sync_path, "ophys_trigger", 1, 6.8612], - [sync_path, "eye_tracking", 135908, 4531.00479], - [sync_path, "behavior_monitoring", 135887, 4530.19092], - [sync_path, "stim_photodiode", 4512, 4510.80997], - [sync_path, "stimulus_times_no_delay", 269977, 4510.25654], -]) -def test_get_time_sync_integration(sync_path, sync_key, count_exp, last_exp): - obt = sync.get_sync_data(sync_path)[sync_key] - assert count_exp == len(obt) - assert last_exp == obt[-1] - - -@pytest.mark.parametrize("fn, key, rise, fall, expect", [ - [sync.get_trigger, "foo", None, None, None], - [sync.get_trigger, "2p_trigger", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_trigger, "acq_trigger", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_eye_tracking, "cam2_exposure", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_eye_tracking, "eye_tracking", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_behavior_monitoring, "cam1_exposure", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_behavior_monitoring, "behavior_monitoring", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_stim_photodiode, "stim_photodiode", [1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6]], - [sync.get_stim_photodiode, "photodiode", [1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6]], - [sync.get_lick_times, "lick_times", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_lick_times, "lick_sensor", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_ophys_frames, "2p_vsync", [1, 2, 3], [4, 5, 6], [1, 2, 3]], - [sync.get_raw_stimulus_frames, "stim_vsync", [1, 2, 3], [4, 5, 6], [4, 5, 6]], -]) -def test_timestamp_extractors(fn, key, rise, fall, expect): - - class Ds(Dataset): - def __init__(self): - self.line_labels = [key, "1", "2"] - - def get_rising_edges(self, line, units): - if not line in self.line_labels: - raise ValueError - return rise - - def get_falling_edges(self, line, units): - if not line in self.line_labels: - raise ValueError - return fall - - if expect is None: - with pytest.raises(KeyError) as _err: - fn(Ds()) - else: - assert np.allclose(expect, fn(Ds())) - diff --git a/allensdk/test/brain_observatory/behavior/test_trial_masks.py b/allensdk/test/brain_observatory/behavior/test_trial_masks.py deleted file mode 100644 index b0e6b1f1c7..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_trial_masks.py +++ /dev/null @@ -1,107 +0,0 @@ -import pytest -from allensdk.brain_observatory.behavior import trial_masks as masks -import pandas as pd -import numpy as np - - -@pytest.mark.parametrize( - "trials, trial_types, expected", - [ - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True],}), - ["go", "catch"], - pd.Series([True, True, True, True, False], name="trial_type"), - ), - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True],}), - ["aborted"], - pd.Series([False, False, False, False, True], name="trial_type") - ), - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True],}), - [], - pd.Series([True, True, True, True, True], name="trial_type"), - ), - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True],}), - ["early"], - pd.Series([False, False, False, False, False], name="trial_type"), - ), - ( - pd.DataFrame({"trial_type": [], - "detect": [],}), - ["go", "catch"], - pd.Series([], name="trial_type"), - ), - ], -) -def test_trial_types(trials, trial_types, expected): - pd.testing.assert_series_equal( - masks.trial_types(trials, trial_types), expected, check_dtype=False) - - - -@pytest.mark.parametrize( - "trials, trial_types, expected", - [ - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "include": [True, False, True, True, True],}), - ["go", "catch"], - pd.Series([True, True, True, False], name="trial_type", - index=[0, 2, 3, 4]), - ), - ], -) -def test_trial_types_works_with_subselection(trials, trial_types, expected): - pd.testing.assert_series_equal( - masks.trial_types(trials[trials["include"]], trial_types), expected, - check_dtype=False) - - -@pytest.mark.parametrize( - "trials, expected", - [ - ( - pd.DataFrame({"trial_type": ["go", "go", "catch", "catch", "aborted"], - "detect": [True, False, True, True, True],}), - pd.Series([True, True, True, True, False], name="trial_type"), - ), - ( - pd.DataFrame({"trial_type": [], - "detect": [],}), - pd.Series([], name="trial_type"), - ), - ] -) -def test_contingent_trials(trials, expected): - pd.testing.assert_series_equal( - masks.contingent_trials(trials), expected, check_dtype=False) - - -@pytest.mark.parametrize( - "trials, thresh, expected", - [ - ( - pd.DataFrame({"reward_rate": [0.0, 1.0, 2.0, 3.0]}), - -1.0, - pd.Series([True, True, True, True], name="reward_rate"), - ), - ( - pd.DataFrame({"reward_rate": [0.0, 1.0, 2.0, 3.0]}), - 1.0, - pd.Series([False, False, True, True], name="reward_rate"), - ), - ( - pd.DataFrame({"reward_rate": [0.0, 1.0, 2.0, 3.0]}), - 3.0, - pd.Series([False, False, False, False], name="reward_rate"), - ), - ] -) -def test_reward_rate(trials, thresh, expected): - pd.testing.assert_series_equal(masks.reward_rate(trials, thresh), expected) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/behavior/test_trials_processing.py b/allensdk/test/brain_observatory/behavior/test_trials_processing.py deleted file mode 100644 index 5480f92049..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_trials_processing.py +++ /dev/null @@ -1,742 +0,0 @@ -import pytest -import pandas as pd -import numpy as np -from itertools import combinations - -from allensdk.brain_observatory.behavior.data_files import StimulusFile -from allensdk.brain_observatory.behavior import trials_processing -from allensdk.core.auth_config import LIMS_DB_CREDENTIAL_MAP -from allensdk.internal.api import db_connection_creator - - -@pytest.mark.requires_bamboo -@pytest.mark.parametrize( - 'behavior_experiment_id, ti, expected, exception', [ - (880293569, 5, (90, 90, None), None,), - (881236761, 0, None, IndexError,) - ] -) -def test_get_ori_info_from_trial(behavior_experiment_id, - ti, - expected, - exception, ): - """was feeling worried that the values would be wrong, - this helps reaffirm that maybe they are not... - - Notes - ----- - - i may be rewriting code here but its more a sanity check really... - """ - def _get_stimulus_data(): - lims_db = db_connection_creator( - fallback_credentials=LIMS_DB_CREDENTIAL_MAP) - stimulus_file = StimulusFile.from_lims( - db=lims_db, behavior_session_id=behavior_experiment_id) - return stimulus_file.data - stim_output = _get_stimulus_data() - trial_log = stim_output['items']['behavior']['trial_log'] - - if exception: - with pytest.raises(exception): - trials_processing.get_ori_info_from_trial(trial_log, ti, ) - else: - assert trials_processing.get_ori_info_from_trial(trial_log, ti, ) == expected # noqa: E501 - - -_test_response_latency_0 = np.array( - [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, 0.3669842, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 0.41701037, - np.nan, np.nan, 0.31692564, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, 0.28356898, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, 0.33363652, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, 0.21683128, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, 0.38365788, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, - np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]) -_test_starttime_0 = np.array( - [19.99986754, 22.9857173, 25.25430697, 27.50627203, 30.50876019, - 33.54466563, 37.314543, 38.06517225, 41.0677066, 42.58570486, - 44.83770039, 52.3774269, 57.63187756, 62.91968583, 66.67286547, - 68.17414034, 69.67541489, 74.19590836, 77.19846323, 78.69971244, - 80.9516403, 83.95418202, 86.22276367, 87.72406035, 89.97592663, - 92.97849208, 95.23039781, 97.49898909, 100.50154941, 102.75344423, - 104.25473193, 107.25726563, 109.50917136, 111.7610819, 114.01299179, - 116.26490714, 119.26744951, 121.51938378, 124.53862772, 127.55782612, - 129.80972512, 132.81226619, 137.31609721, 138.81734546, 141.08594764, - 143.33787839, 146.35708545, 149.35962973, 156.86599991, 159.88526245, - 163.65508305, 173.44672267, 175.69862167, 178.70117974, 180.95312267, - 183.22166712, 186.22421269, 189.24343194, 191.49533542, 195.28190828, - 198.28443076, 201.30364616, 203.55556985, 205.82415567, 209.577343, - 213.3472146, 216.34976979, 218.61835433, 222.38820892, 226.14139112, - 233.64779273, 234.39842519, 235.16570215, 237.4176191, 239.66953991, - 241.93811899, 244.94066135, 247.94320564, 249.44448821, 252.44703217, - 253.96497334, 254.71559618, 256.2168919, 263.73995532, 266.74247811, - 268.99441912, 271.2629764, 275.0161833, 276.51745143, 278.03538907, - 280.2873025, 282.53921593, 284.80780047, 287.81034956, 290.06226106, - 291.56355774, 294.56608823, 297.58530492, 299.83719974, 302.08911637, - 304.34102787, 308.1109572, 315.6172597, 317.11854964, 319.37043805, - 321.65571199, 323.90761451, 325.40892787, 327.66080216, 329.91271591, - 332.9319358, 336.68513692, 339.70434687, 341.20561115, 341.95625997, - 345.72611233, 347.22738976, 349.4626279, 357.01902553, 359.27093992, - 362.29016334, 365.29272109, 368.31197049, 372.06513441, 373.58308296, - 375.83498259, 377.3362504, 379.58815677, 382.60747224, 387.11118876, - 390.11375903, 392.3823596, 394.63425956, 396.88616336, 399.92207297, - 402.92464964, 405.94383939, 408.19575538, 410.46437038, 413.46690377, - 416.4694612, 418.72134384, 420.95662335, 423.95913236, 425.46040562, - 427.71231745, 429.98091481, 432.98349662, 434.48471376, 435.98598863, - 438.98854735, 442.0077961, 444.25968163, 446.54494947, 448.02954296, - 451.79940525, 454.81863412, 457.07053664, 459.33912952, 461.59103621, - 463.85962107, 465.360903, 467.61282348, 469.8814, 471.3826691, - 474.38523327, 477.42112684, 479.67303705, 481.94162769, 484.94417229, - 487.96340758, 490.21530914, 492.46722064, 494.73581031, 498.48898834, - 501.50822074, 503.00949272, 505.2780933, 507.53000255, 510.54922212, - 514.31907961, 516.57098918, 518.83957885, 520.34085308, 523.3600781, - 525.61201879, 529.39853328, 531.6504467, 533.91904696, 536.17094563, - 539.94081562, 542.19272616, 545.19526724, 546.69653986, 548.19781249, - 550.44972206, 553.46895029, 556.4714981, 559.47403694, 562.47658507]) - -expected_result_0 = np.array([ - np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, - np.inf, np.inf, 0.85743611, 0.82215855, 0.79754855, 0.77420232, - 0.74532604, 0.72504419, 0.73828876, 0.73168092, 0.73168145, - 0.73844044, 0.745635, 0.75997116, 0.73889553, 0.7457893, 0.73212764, - 0.72533739, 0., 0., 0., 0., 0., 0., 0., 0.83147215, 0.76759434, - 0.76013235, 1.50562915, 1.37576878, 1.36403067, 1.3524898, - 1.3640296, 1.36377167, 1.35249025, 1.35223636, 1.35223623, - 1.31828762, 1.31828779, 1.30726822, 1.30726804, 1.30703059, 1.28600222, - 1.27551339, 1.26541718, 1.27551391, 1.26541723, 1.86854445, 1.78508514, - 1.85409645, 1.86822076, 1.86854435, 1.86854454, 1.88321881, 1.88321885, - 1.31756348, 1.33989546, 1.35147388, 0.74517267, 0.75933052, 1.54807324, - 1.44950587, 1.43676766, 1.44979704, 1.46306592, 1.43676702, 1.47718591, - 1.50468411, 1.51930166, 1.51930185, 1.51930188, 1.53387944, 1.5642303, - 1.59545215, 1.58003398, 1.59580631, 1.62831513, 0.87666335, 0.85784626, - 1.6450693, 1.53453391, 1.54940651, 1.54974049, 1.56423021, 1.57968714, - 1.5796865, 1.59545254, 1.5800338, 1.53420629, 1.49127149, 0.78984375, - 0.80576787, 0.82234767, 0.80576784, 0.83089596, 1.64507108, 1.51930204, - 1.51930202, 1.50468432, 1.49096252, 1.49065321, 1.46336336, 1.46306626, - 1.4765797, 1.50468436, 1.50468414, 1.4903434, 1.44979783, 1.46336463, - 0.78160518, 0.77403664, 0.77403649, 0.76661287, 0.75932993, 0.74501851, - 0.74501813, 0.74486366, 0.74501799, 0.75202743, 0.7593303, 0.75234155, - 0.73168169, 0.7524993, 0.74548119, 0.74517234, 0., 0., 0., 0., 0., 0., - 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 0., 0., 0., 0., 0., 0., 0., -]) - -expected_result_1 = np.array( - [np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, - np.inf, np.inf, 1.811146, 1.944290, 1.898119, 1.811146, 1.733465, - 1.771897, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 2.417308, 2.047210, 1.994977, 3.890695, 3.321282, - 3.253684, 3.190197, 3.190196, 3.255157, 3.255157, 1.853143, 1.898129, - 1.897124, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 2.153860, 1.855050, 1.945345, 2.044882, - 2.155151, 2.279434, 2.344817, 2.279435, 2.347877, 2.574765, 0.000000, - 0.000000, 0.000000, 3.191613, 2.492687, 2.418930, 2.494413, 2.572924, - 2.346344, 2.492686, 2.492686, 2.346343, 2.279434, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 2.574758, 2.157737, 2.217599, 2.157739, 2.214870, 2.279435, 2.346341, - 2.346345, 2.346345, 2.417310, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 2.752063, 2.213507, 2.277990, 2.343290, 2.344815, - 2.213503, 1.992768, 2.153859, 2.097345, 2.152573, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, - 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, ]) - - -@pytest.mark.parametrize('kwargs, expected', [ - ( - { - 'response_latency': _test_response_latency_0, - 'starttime': _test_starttime_0, - 'trial_window': 15, - 'initial_trials': 10, - }, - expected_result_0, - ), - ( - { - 'response_latency': _test_response_latency_0, - 'starttime': _test_starttime_0, - 'trial_window': 5, - 'initial_trials': 10, - }, - expected_result_1, - ), -]) -def test_calculate_reward_rate(kwargs, expected): - assert np.allclose( - trials_processing.calculate_reward_rate(**kwargs), - expected, - ), "calculated reward rate should match expected reward rate :(" - - -def trial_data_and_expectation_0(): - test_trial = { - 'index': 3, - 'cumulative_rewards': 1, - 'licks': [(318.2737866026219, 18736), - (318.4235244484611, 18745), - (318.55351991075554, 18753), - (318.6735239364698, 18760), - (318.8235420609609, 18769), - (318.9733899117824, 18778), - (319.153503175955, 18789), - (319.35351008052305, 18801), - (321.24372627834714, 18914), - (321.3438153063156, 18920), - (321.49348118080985, 18929), - (321.6237259097134, 18937)], - 'stimulus_changes': [(('im065', 'im065'), - ('im062', 'im062'), - 317.76644976765834, - 18706)], - 'success': False, - 'cumulative_volume': 0.005, - 'trial_params': {'catch': False, - 'auto_reward': True, - 'change_time': 5}, - 'rewards': [(0.005, 317.92325660388286, 18715)], - 'events': [['trial_start', '', 314.0120642698258, 18481], - ['initial_blank', 'enter', 314.01216666808074, 18481], - ['initial_blank', 'exit', 314.0122573636779, 18481], - ['pre_change', 'enter', 314.01233489378524, 18481], - ['pre_change', 'exit', 314.0124103759274, 18481], - ['stimulus_window', 'enter', 314.01248819860115, 18481], - ['stimulus_changed', '', 317.7666744586863, 18706], - ['auto_reward', '', 317.76681547571155, 18706], - ['response_window', 'enter', 317.9231027139341, 18715], - ['response_window', 'exit', 318.532233361527, 18752], - ['miss', '', 318.5324346472395, 18752], - ['stimulus_window', 'exit', 322.0351179203675, 18962], - ['no_lick', 'exit', 322.0352864386384, 18962], - ['trial_end', '', 322.0353750862705, 18962]] - } - - expected_result = { - 'reward_volume': 0.005, - 'hit': False, - 'false_alarm': False, - 'miss': False, - 'sham_change': False, - 'stimulus_change': True, - 'aborted': False, - 'go': False, - 'catch': False, - 'auto_rewarded': True, - 'correct_reject': False - } - - return test_trial, expected_result - - -def trial_data_and_expectation_1(): - test_trial = { - 'index': 4, - 'cumulative_rewards': 1, - 'licks': [(324.1935569847751, 19091), - (324.34329131981696, 19100), - (324.49368158882305, 19109)], - 'stimulus_changes': [], - 'success': False, - 'cumulative_volume': 0.005, - 'trial_params': {'catch': False, - 'auto_reward': True, - 'change_time': 6}, - 'rewards': [], - 'events': [['trial_start', '', 322.2688823113451, 18976], - ['initial_blank', 'enter', 322.2689858798658, 18976], - ['initial_blank', 'exit', 322.26907599033007, 18976], - ['pre_change', 'enter', 322.2691523501716, 18976], - ['pre_change', 'exit', 322.26922900257955, 18976], - ['stimulus_window', 'enter', 322.26930536242105, 18976], - ['early_response', '', 324.1937059010944, 19091], - ['abort', '', 324.1937848940339, 19091], - ['timeout', 'enter', 324.19388963282034, 19091], - ['timeout', 'exit', 324.8042502297378, 19128], - ['trial_end', '', 324.80448691598986, 19128]] - } - - expected_result = { - 'reward_volume': 0, - 'hit': False, - 'false_alarm': False, - 'miss': False, - 'sham_change': False, - 'stimulus_change': False, - 'aborted': True, - 'go': False, - 'catch': False, - 'auto_rewarded': False, - 'correct_reject': False - } - - return test_trial, expected_result - - -def trial_data_and_expectation_2(): - test_trial = { - 'index': 51, - 'cumulative_rewards': 11, - 'licks': [(542.6200214334176, 32186), - (542.7097825733969, 32191), - (542.8597161461861, 32200), - (542.9599280520605, 32206), - (543.059708422432, 32212), - (543.15998088956, 32218), - (543.2899491431752, 32226), - (543.4098750536493, 32233), - (543.5197477960238, 32240), - (543.6596846660369, 32248), - (543.7699336488565, 32255), - (543.8897463361172, 32262), - (544.0196821148575, 32270), - (544.13974055793, 32277), - (544.2596729048659, 32284), - (544.3896745110557, 32292), - (544.5397306691843, 32301)], - 'stimulus_changes': [(('im069', 'im069'), - ('im085', 'im085'), - 542.2007438794369, - 32161)], - 'success': True, - 'cumulative_volume': 0.067, - 'trial_params': {'catch': False, - 'auto_reward': False, - 'change_time': 4}, - 'rewards': [(0.007, 542.620156599114, 32186)], - 'events': [['trial_start', '', 539.1971251251088, 31981], - ['initial_blank', 'enter', 539.197228401063, 31981], - ['initial_blank', 'exit', 539.1973220223246, 31981], - ['pre_change', 'enter', 539.1974007226976, 31981], - ['pre_change', 'exit', 539.197477667672, 31981], - ['stimulus_window', 'enter', 539.1975575383109, 31981], - ['stimulus_changed', '', 542.2009428246179, 32161], - ['response_window', 'enter', 542.3661398812824, 32171], - ['hit', '', 542.6201402153932, 32186], - ['response_window', 'exit', 542.9666720011281, 32207], - ['stimulus_window', 'exit', 546.4695340323526, 32417], - ['no_lick', 'exit', 546.4696966992947, 32417], - ['trial_end', '', 546.4697827138287, 32417]] - } - - expected_result = { - 'reward_volume': 0.007, - 'hit': True, - 'false_alarm': False, - 'miss': False, - 'sham_change': False, - 'stimulus_change': True, - 'aborted': False, - 'go': True, - 'catch': False, - 'auto_rewarded': False, - 'correct_reject': False - } - - return test_trial, expected_result - - -@pytest.mark.parametrize("data_exp_getter", [ - trial_data_and_expectation_0, - trial_data_and_expectation_1, - trial_data_and_expectation_2 -]) -def test_trial_data_from_log(data_exp_getter): - data, expectation = data_exp_getter() - assert trials_processing.trial_data_from_log(data) == expectation - - -@pytest.mark.parametrize( - "go,catch,auto_rewarded,hit,false_alarm,aborted,errortext", [ - (False, False, False, True, False, True, - "'aborted' trials cannot be"), # aborted and hit - (False, False, False, False, True, True, - "'aborted' trials cannot be"), # aborted and false alarm - (False, False, True, False, False, True, - "'aborted' trials cannot be"), # aborted and auto_rewarded - (False, False, False, True, True, False, - "both `hit` and `false_alarm` cannot be True"), # hit and false alarm - (True, True, False, False, False, False, - "both `go` and `catch` cannot be True"), # go and catch - # go and auto_rewarded - (True, False, True, False, False, False, - "both `go` and `auto_rewarded` cannot be True") - ] -) -def test_get_trial_timing_exclusivity_assertions( - go, catch, auto_rewarded, hit, false_alarm, aborted, errortext): - with pytest.raises(AssertionError) as e: - trials_processing.get_trial_timing( - None, None, go, catch, auto_rewarded, hit, false_alarm, - aborted, np.array([]), 0.0) - assert errortext in str(e.value) - - -def test_get_trial_timing(): - event_dict = { - ('trial_start', ''): {'timestamp': 306.4785879253758, 'frame': 18075}, - ('initial_blank', 'enter'): {'timestamp': 306.47868008512637, - 'frame': 18075}, - ('initial_blank', 'exit'): {'timestamp': 306.4787637603285, - 'frame': 18075}, - ('pre_change', 'enter'): {'timestamp': 306.47883573270514, - 'frame': 18075}, - ('pre_change', 'exit'): {'timestamp': 306.4789062422286, - 'frame': 18075}, - ('stimulus_window', 'enter'): {'timestamp': 306.478977629464, - 'frame': 18075}, - ('stimulus_changed', ''): {'timestamp': 310.9827406729944, - 'frame': 18345}, - ('auto_reward', ''): {'timestamp': 310.98279450599154, 'frame': 18345}, - ('response_window', 'enter'): {'timestamp': 311.13223900212347, - 'frame': 18354}, - ('response_window', 'exit'): {'timestamp': 311.73284526699706, - 'frame': 18390}, - ('miss', ''): {'timestamp': 311.7330193465259, 'frame': 18390}, - ('stimulus_window', 'exit'): {'timestamp': 315.2356723770604, - 'frame': 18600}, - ('no_lick', 'exit'): {'timestamp': 315.23582480636213, 'frame': 18600}, - ('trial_end', ''): {'timestamp': 315.23590438557534, 'frame': 18600} - } - - licks = [ - 312.24876, - 312.58027, - 312.73126, - 312.86627, - 313.02635, - 313.16292, - 313.54016, - 314.04408, - 314.47449, - 314.61011, - 314.75495, - ] - - # Only need to worry about the timestamp - # value at change_frame - # because get_trial_timing will only use - # timestamps to lookup the timestamp of - # change_frame - timestamps = np.zeros(20000, dtype=float) - timestamps[18345] = 311.77086 - - result = trials_processing.get_trial_timing( - event_dict, - licks, - go=False, - catch=False, - auto_rewarded=True, - hit=False, - false_alarm=False, - aborted=False, - timestamps=timestamps, - monitor_delay=0.0 - ) - - expected_result = { - 'start_time': 306.4785879253758, - 'stop_time': 315.23590438557534, - 'trial_length': 8.757316460199547, - 'response_time': 312.24876, - 'change_frame': 18345, - 'change_time': 311.77086, - 'response_latency': 0.4778999999999769 - } - - # use assert_frame_equal to take advantage of the - # nice way it deals with NaNs - pd.testing.assert_frame_equal(pd.DataFrame(result, index=[0]), - pd.DataFrame(expected_result, index=[0]), - check_names=False) - - -@pytest.mark.parametrize( - "licks, aborted, expected", - [ - ([1.0, 2.0, 3.0], True, float("nan")), - ([1.0, 2.0, 3.0], False, 1.0), - ([], True, float("nan")), - ([], False, float("nan")) - ] -) -def test_get_response_time(licks, aborted, expected): - actual = trials_processing._get_response_time(licks, aborted) - np.testing.assert_equal(actual, expected) - - -@pytest.mark.parametrize("behavior_stimuli_data_fixture, start_frame," - "expected", - [({}, 0, ('grating', 90, 'gratings_90')), - ({ - "images_set_log": [ - ('Image', 'im065', 5, 0)], - "grating_set_log": [ - ("Ori", 270, 15, 6)]}, 0, - ('images', 'im065', 'im065')), - ({ - "images_set_log": [], - "grating_set_log": [] - }, 0, ('', '', ''))], - indirect=['behavior_stimuli_data_fixture']) -def test_resolve_initial_image(behavior_stimuli_data_fixture, start_frame, - expected): - stimuli = behavior_stimuli_data_fixture['items']['behavior']['stimuli'] - resolved = trials_processing.resolve_initial_image(stimuli, start_frame) - assert resolved == expected - - -@pytest.mark.parametrize("behavior_stimuli_data_fixture, trial, expected", - [({}, - { - 'events': - [ - (None, None, None, 0) - ], - 'stimulus_changes': - [ - ] - }, - { - 'initial_image_name': 'gratings_90', - 'change_image_name': 'gratings_90' - }), - ({}, - { - 'events': - [ - (None, None, None, 0) - ], - 'stimulus_changes': - [ - (('horizontal', 90), - ('vertical', 180), - None, - None) - ] - }, - { - 'initial_image_name': 'gratings_90', - 'change_image_name': 'gratings_180' - }), - ({ - "images_set_log": [ - ('Image', 'im065', 5, 0)], - "grating_set_log": [ - ("Ori", 270, 15, 6)] - }, - { - 'events': - [ - (None, None, None, 5) - ], - 'stimulus_changes': - [ - (('im065', 'im065'), ('im057', 'im057'), - None, None) - ] - }, - { - 'initial_image_name': 'im065', - 'change_image_name': 'im057' - } - )], - indirect=['behavior_stimuli_data_fixture']) -def test_get_trial_image_names(behavior_stimuli_data_fixture, trial, - expected): - stimuli = behavior_stimuli_data_fixture['items']['behavior']['stimuli'] - trial_image_names = trials_processing.get_trial_image_names(trial, stimuli) - assert trial_image_names == expected - - -@pytest.mark.parametrize("trial_log,expected", - [([{'events': [('trial_start', 4), - ('trial_end', 5)]}, - {'events': [('trial_start', 6), - ('trial_end', 9)]}], - [(4, 6), (6, -1)]), - ([{'events': [('trial_start', 2), - ('trial_end', 9)]}, - {'events': [('trial_start', 5), - ('trial_end', 11)]}, - {'events': [('junk', 4), - ('trial_start', 7), - ('trial_end', 14)]}, - {'events': [('trial_start', 13), - ('trial_end', 22)]}], - [(2, 5), (5, 7), (7, 13), (13, -1)])]) -def test_get_trial_bounds(trial_log, expected): - bounds = trials_processing.get_trial_bounds(trial_log) - assert bounds == expected - - -def test_get_trial_bounds_exception(): - """ - Test that, if a trial does not have a trial_start event, a ValueError - is raised - """ - trial_log = [{'events': [('trial_start', 9), ('trial_end', 4)]}, - {'events': [('trial_end', 2)]}] - - with pytest.raises(ValueError): - _ = trials_processing.get_trial_bounds(trial_log) - - -@pytest.mark.parametrize("trial_log", - [([{'events': [('trial_start', 4), - ('trial_end', 5)]}, - {'events': [('trial_start', 2), - ('trial_end', 9)]}, - {'events': [('trial_start', 6), - ('trial_end', 11)]}])] - ) -def test_get_trial_bounds_order_exceptions(trial_log): - """ - Test that, when trial_start and trial_end are out of order, - exceptions are raised - """ - with pytest.raises(ValueError) as error: - _ = trials_processing.get_trial_bounds(trial_log) - assert 'order' in error.value.args[0] - - -def test_input_validation(monkeypatch): - """ - Test that get_trials raises the appropriate errors when input object - is malformed - - Note: this test does not test the case in which get_trials runs through - to completion. That is covered by the smoke tests in - allensdk/test/brain_observatory/behavior/test_get_trials_methods - """ - - class DummyObj(object): - def __init__(self): - pass - - def dummy_method(self): - pass - - # loop over all of the incomplete subsets of - # methods that the argument in get_trials_from_data_transform - # must have; make sure that the correct error with - # the correct error message is raised - - method_names_tuple = ('_behavior_stimulus_file', - 'get_rewards', 'get_licks', - 'get_stimulus_timestamps', - 'get_monitor_delay') - - for n_methods in range(1, 5): - method_iterator = combinations(method_names_tuple, - n_methods) - for local_method_name_tuple in method_iterator: - with monkeypatch.context() as ctx: - for method_name in local_method_name_tuple: - ctx.setattr(DummyObj, - method_name, - dummy_method, - raising=False) - - obj = DummyObj() - with pytest.raises(ValueError) as error: - _ = trials_processing.get_trials_from_data_transform(obj) - for method_name in method_names_tuple: - if method_name not in local_method_name_tuple: - assert method_name in error.value.args[0] - else: - assert method_name not in error.value.args[0] - - -@pytest.mark.parametrize( - "trials, response_window_start, expected", - [ - ( - pd.DataFrame({ - "change_time": [1, 2, 3, 4], - "lick_times": [[1.1], [2.1, 2.2], [3.3, 3.4], [4.4]]}), - 0.0, - [0.1, 0.1, 0.3, 0.4]), - ( - pd.DataFrame({ - "change_time": [1, 2, 3, 4], - "lick_times": [[1.1], [], [3.3, 3.4], [4.4]]}), - 0.0, - [0.1, float("inf"), 0.3, 0.4]), - ( - pd.DataFrame({ - "change_time": [1, 2, 3, 4], - "lick_times": [[1.1], [], [3.3, 3.4], [4.4]]}), - 0.15, - [float("inf"), float("inf"), 0.3, 0.4]), - ]) -def test_calculate_response_latency_list( - trials, response_window_start, expected): - latencies = trials_processing.calculate_response_latency_list( - trials, response_window_start) - np.testing.assert_allclose(latencies, expected) - - -@pytest.fixture -def trials_example(): - """minimal example for test_construct_rolling_performance_df - """ - trials_dict = { - 'start_time': { - 8: 368.305066913832, - 9: 378.0631642451044, - 10: 386.31999971927144, - 11: 394.57686825376004}, - 'lick_times': { - 8: np.array([]), - 9: np.array([]), - 10: np.array([]), - 11: np.array([])}, - 'hit': {8: False, 9: False, 10: False, 11: False}, - 'false_alarm': {8: False, 9: False, 10: False, 11: False}, - 'miss': {8: True, 9: False, 10: True, 11: True}, - 'aborted': {8: False, 9: False, 10: False, 11: False}, - 'correct_reject': {8: False, 9: True, 10: False, 11: False}} - return pd.DataFrame(trials_dict) - - -@pytest.mark.parametrize("session_type", ["OPHYS_5_images_B_passive", - "OPHYS_5_images_B"]) -def test_construct_rolling_performance_df(trials_example, session_type): - """tests that ending a session_type with "passive" replaces - rolling_dprime values with all zeros - """ - df = trials_processing.construct_rolling_performance_df( - trials_example, 0.15, session_type) - if session_type.endswith("passive"): - assert np.all(df["rolling_dprime"].values == 0.0) - else: - assert not np.all(df["rolling_dprime"].values == 0.0) diff --git a/allensdk/test/brain_observatory/behavior/test_write_behavior_nwb.py b/allensdk/test/brain_observatory/behavior/test_write_behavior_nwb.py deleted file mode 100644 index d37ee62713..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_write_behavior_nwb.py +++ /dev/null @@ -1,76 +0,0 @@ -import mock -from pathlib import Path -import pytest - -from allensdk.brain_observatory.behavior.write_behavior_nwb.__main__ import \ - write_behavior_nwb # noqa: E501 - - -def test_write_behavior_nwb_no_file(): - """ - This function is testing the fail condition of the write_behavior_nwb - method. The main functionality of the write_behavior_nwb method occurs - in a try block, and in the case that an exception is raised there is - functionality in the except block to check if any partial output - exists, and if so rename that file to have a .error suffix before - raising the previously mentioned exception. - - This test is checking the case where that partial output does not - exist. In this case we still want to have the original exception - returned and avoid a FileNotFound error. - - To ensure that we enter the except block, a value of None is passed - for the session_data argument. This will cause a TypeError when - write_behavior_nwb tries to subscript this variable. We are checking - that, even though no partial output exists, we still get this - TypeError raised. - """ - with pytest.raises(TypeError): - write_behavior_nwb( - session_data=None, - nwb_filepath='' - ) - - -def test_write_behavior_nwb_with_file(tmpdir): - """ - This function is testing the fail condition of the write_behavior_nwb - method. The main functionality of the write_behavior_nwb method occurs - in a try block, and in the case that an exception is raised there is - functionality in the except block to check if any partial output - exists, and if so rename that file to have a .error suffix before - raising the previously mentioned exception. - - This test is checking the case where a partial output file does - exist. In this case we still want to have the original exception - returned and avoid a FileNotFound error, but also check that a new - file with the .error suffix exists. - - To ensure that we enter the except block, a value of None is passed - for the session_data argument. This will cause a TypeError when - write_behavior_nwb tries to subscript this variable. To get the - partial output file to exist, we simply create a Path object and - call the .touch method. - - This test also patched the os.remove method to do nothing. This is - necessary because the write_behavior_nwb method checks for any - existing output and removes it before running. - """ - # Create the dummy .nwb file - fake_nwb_fp = Path(tmpdir) / 'fake_nwb.nwb' - Path(str(fake_nwb_fp) + '.inprogress').touch() - - def mock_os_remove(fp): - pass - - # Patch the os.remove method to do nothing - with mock.patch('os.remove', side_effects=mock_os_remove): - with pytest.raises(TypeError): - write_behavior_nwb( - session_data=None, - nwb_filepath=str(fake_nwb_fp) - ) - - # Check that the new .error file exists, and that we - # still get the expected exception - assert Path(str(fake_nwb_fp) + '.error').exists() diff --git a/allensdk/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py b/allensdk/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py deleted file mode 100644 index 44a1016473..0000000000 --- a/allensdk/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py +++ /dev/null @@ -1,82 +0,0 @@ -import mock -from pathlib import Path - -import pytest - - -from allensdk.brain_observatory.behavior.write_nwb.__main__ import \ - write_behavior_ophys_nwb # noqa: E501 - - -def test_write_behavior_ophys_nwb_no_file(): - """ - This function is testing the fail condition of the - write_behavior_ophys_nwb method. The main functionality of the - write_behavior_ophys_nwb method occurs in a try block, and in the - case that an exception is raised there is functionality in the except - block to check if any partial output exists, and if so rename that - file to have a .error suffix before raising the previously - mentioned exception. - - This test is checking the case where that partial output does not - exist. In this case we still want to have the original exception - returned and avoid a FileNotFound error. - - To ensure that we enter the except block, a value of None is passed - for the session_data argument. This will cause a TypeError when - write_behavior_ophys_nwb tries to subscript this variable. We are - checking that, even though no partial output exists, we still get - this TypeError raised. - """ - with pytest.raises(TypeError): - write_behavior_ophys_nwb( - session_data=None, - nwb_filepath='', - skip_eye_tracking=True - ) - - -def test_write_behavior_ophys_nwb_with_file(tmpdir): - """ - This function is testing the fail condition of the - write_behavior_ophys_nwb method. The main functionality of the - write_behavior_ophys_nwb method occurs in a try block, and in the - case that an exception is raised there is functionality in the except - block to check if any partial output exists, and if so rename that - file to have a .error suffix before raising the previously - mentioned exception. - - This test is checking the case where a partial output file does - exist. In this case we still want to have the original exception - returned and avoid a FileNotFound error, but also check that a new - file with the .error suffix exists. - - To ensure that we enter the except block, a value of None is passed - for the session_data argument. This will cause a TypeError when - write_behavior_ophys_nwb tries to subscript this variable. To get the - partial output file to exist, we simply create a Path object and - call the .touch method. - - This test also patched the os.remove method to do nothing. This is - necessary because the write_behavior_nwb method checks for any - existing output and removes it before running. - """ - # Create the dummy .nwb file - fake_nwb_fp = Path(tmpdir) / 'fake_nwb.nwb' - Path(str(fake_nwb_fp) + '.inprogress').touch() - - def mock_os_remove(fp): - pass - - # Patch the os.remove method to do nothing - with mock.patch('os.remove', side_effects=mock_os_remove): - with pytest.raises(TypeError): - write_behavior_ophys_nwb( - session_data=None, - nwb_filepath=str(fake_nwb_fp), - skip_eye_tracking=True - ) - - # Check that the new .error file exists, and that we - # still get the expected exception - assert Path(str(fake_nwb_fp) + '.error').exists() diff --git a/allensdk/test/brain_observatory/conftest.py b/allensdk/test/brain_observatory/conftest.py deleted file mode 100644 index e29a97ae1c..0000000000 --- a/allensdk/test/brain_observatory/conftest.py +++ /dev/null @@ -1,41 +0,0 @@ -import pytest -import os -from datetime import datetime -import pynwb -import numpy as np - - -@pytest.fixture -def running_speed(): - from allensdk.brain_observatory.running_speed import RunningSpeed - return RunningSpeed( - timestamps=[1., 2., 3.], - values=[4, 5, 6] - ) - - -@pytest.fixture -def nwbfile(): - return pynwb.NWBFile( - session_description='asession', - identifier='afile', - session_start_time=datetime.now() - ) - - -@pytest.fixture -def roundtripper(tmpdir_factory): - def f(nwbfile, api_cls, **api_kwargs): - tmpdir = str(tmpdir_factory.mktemp('nwb_roundtrip_tests')) - nwb_path = os.path.join(tmpdir, 'nwbfile.nwb') - - with pynwb.NWBHDF5IO(nwb_path, 'w') as write_io: - write_io.write(nwbfile) - - return api_cls(nwb_path, **api_kwargs) - return f - - -@pytest.fixture -def stimulus_timestamps(): - return np.array([1., 2., 3.]) diff --git a/allensdk/test/brain_observatory/ecephys/__init__.py b/allensdk/test/brain_observatory/ecephys/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/ecephys/align_timestamps/__init__.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py deleted file mode 100644 index 273bb6f506..0000000000 --- a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py +++ /dev/null @@ -1,186 +0,0 @@ -import json -import os -import subprocess as sp - -import pytest -import numpy as np - - -DATA_DIR = os.environ.get( - "ECEPHYS_PIPELINE_DATA", - os.path.join("/", "allen", "aibs", "informatics", "module_test_data", "ecephys"), -) - - -def apply_input_json_template( - template_path, input_json_path, temp_dir, data_dir=DATA_DIR -): - """ A utility for adjusting the input json so that: - 1. input paths find cached data in the data dir - 2. output paths write to a specified temp_dir - The adjusted input json will be written to temp_dir. - - """ - - with open(template_path, "r") as input_json_file: - input_json_data = json.load(input_json_file) - - input_json_data["sync_h5_path"] = os.path.join( - data_dir, input_json_data["sync_h5_path"] - ) - - for probe in input_json_data["probes"]: - - probe["barcode_channel_states_path"] = os.path.join( - data_dir, probe["barcode_channel_states_path"] - ) - probe["barcode_timestamps_path"] = os.path.join( - data_dir, probe["barcode_timestamps_path"] - ) - - for timestamps_file in probe["mappable_timestamp_files"]: - timestamps_file["input_path"] = os.path.join( - data_dir, timestamps_file["input_path"] - ) - timestamps_file["output_path"] = os.path.join( - temp_dir, timestamps_file["output_path"] - ) - - with open(input_json_path, "w") as input_json_file: - json.dump(input_json_data, input_json_file) - - -@pytest.fixture() -def align_timestamps_706875901_expected_params(): - return { - "probeA": { - "total_time_shift": -0.6097051644554128, - "global_probe_sampling_rate": 29999.956819421783, - "global_probe_lfp_sampling_rate": 2499.9964016184817, - }, - "probeB": { - "total_time_shift": -0.5875482733055364, - "global_probe_sampling_rate": 29999.90905329544, - "global_probe_lfp_sampling_rate": 2499.9924211079533, - }, - } - - -@pytest.fixture() -def align_timestamps_706875901_expected_files(): - return lambda data_dir: { - "probeA": { - "spikes_timestamps": os.path.join( - data_dir, "706875901_probeA_aligned_spike_timestamps.npy" - ), - "lfp_timestamps": os.path.join( - data_dir, "706875901_probeA_aligned_lfp_timestamps.npy" - ), - }, - "probeB": { - "spikes_timestamps": os.path.join( - data_dir, "706875901_probeB_aligned_spike_timestamps.npy" - ), - "lfp_timestamps": os.path.join( - data_dir, "706875901_probeB_aligned_lfp_timestamps.npy" - ), - }, - } - - -@pytest.fixture(scope="module") -def run_align_timestamps_706875901(tmpdir_factory): - base_path = tmpdir_factory.mktemp("align_timestamps_integration") - executable = ["python", "-m", "allensdk.brain_observatory.ecephys.align_timestamps"] - - input_json_path = os.path.join(base_path, "706875901_align_timestamps_input.json") - output_json_path = os.path.join(base_path, "706875901_align_timestamps_output.json") - executable.extend(["--input_json", input_json_path]) - executable.extend(["--output_json", output_json_path]) - - input_json_template_path = os.path.join( - DATA_DIR, "706875901_align_timestamps_input.json" - ) - apply_input_json_template(input_json_template_path, input_json_path, base_path) - - sp.check_call(executable) - - return output_json_path - - -@pytest.mark.requires_bamboo -def test_align_timestamps_parameters_706875901( - run_align_timestamps_706875901, align_timestamps_706875901_expected_params -): - - with open(run_align_timestamps_706875901, "r") as output_json_file: - output_json_data = json.load(output_json_file) - - for probe in output_json_data["probe_outputs"]: - expected = align_timestamps_706875901_expected_params[probe["name"]] - - assert expected["total_time_shift"] == probe["total_time_shift"] - assert ( - expected["global_probe_sampling_rate"] - == probe["global_probe_sampling_rate"] - ) - assert ( - expected["global_probe_lfp_sampling_rate"] - == probe["global_probe_lfp_sampling_rate"] - ) - - -@pytest.mark.requires_bamboo -def test_align_timestamps_files_706875901( - run_align_timestamps_706875901, align_timestamps_706875901_expected_files -): - - with open(run_align_timestamps_706875901, "r") as output_json_file: - output_json_data = json.load(output_json_file) - - expected_files = align_timestamps_706875901_expected_files(DATA_DIR) - for probe in output_json_data["probe_outputs"]: - - for output_file_key, output_file_path in probe["output_paths"].items(): - expected_file_path = expected_files[probe["name"]][output_file_key] - expected_data = np.load(expected_file_path, allow_pickle=False) - - obtained_data = np.load(output_file_path, allow_pickle=False) - - assert np.allclose(expected_data, obtained_data) - - -@pytest.mark.requires_bamboo -def test_align_timestamps_barcode_agreement_706875901(run_align_timestamps_706875901): - - with open(run_align_timestamps_706875901, "r") as output_json_file: - output_json_data = json.load(output_json_file) - - probe_parameters = {} - for probe in output_json_data["probe_outputs"]: - probe_parameters[probe["name"]] = probe - - aligned_barcode_data = [] - barcode_timestamp_lengths = [] - for probe in output_json_data["input_parameters"]["probes"]: - name = probe["name"] - barcode_data = np.load(probe["barcode_timestamps_path"], allow_pickle=False) - - total_time_shift = probe_parameters[name]["total_time_shift"] - global_probe_sampling_rate = probe_parameters[name][ - "global_probe_sampling_rate" - ] - - aligned_barcode_data.append( - barcode_data / global_probe_sampling_rate - total_time_shift - ) - barcode_timestamp_lengths.append(len(aligned_barcode_data)) - - min_length = np.amin(barcode_timestamp_lengths) - assert min_length > 0 - - for ii in range(len(aligned_barcode_data) - 1): - assert np.allclose( - aligned_barcode_data[ii][:min_length], - aligned_barcode_data[ii + 1][:min_length], - ) diff --git a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode.py deleted file mode 100644 index f5d4100a7b..0000000000 --- a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode.py +++ /dev/null @@ -1,97 +0,0 @@ -import pytest -import numpy as np -import pandas as pd - -import allensdk.brain_observatory.ecephys.align_timestamps.barcode as barcode - - -@pytest.fixture -def two_barcodes(): - - on_times = np.array([11, 14, 30, 32, 34]) - off_times = np.array([13, 15, 31, 33, 35]) - - ibi = 10 - bar_duration = 1.0 - bar_duration_ceiling = 7 - nbits = 4 - - return on_times, off_times, ibi, bar_duration, bar_duration_ceiling, nbits - - -@pytest.fixture -def master_barcodes_sequence(): - - master_times = np.array([10, 25, 30, 37, 44, 45]) - master_barcodes = np.array([1, 2, 3, 4, 5, 6]) - - return master_times, master_barcodes - - -def test_extract_barcodes_from_times(two_barcodes): - - starts_obt, codes_obt = barcode.extract_barcodes_from_times(*two_barcodes) - - starts_exp = [30] - codes_exp = [5] - - assert np.allclose(starts_obt, starts_exp) - assert np.allclose(codes_obt, codes_exp) - - -@pytest.mark.parametrize("sc", [1.0]) # 0.5, 10, .3, -14]) -@pytest.mark.parametrize("tr", [-3]) # 22, -11]) -@pytest.mark.parametrize("sind", [0]) # , 0, -5, 4.3]) -@pytest.mark.parametrize("prate", [10]) # , 1, -7, 0.1]) -@pytest.mark.parametrize("npcodes", [-1]) # , 3]) -def test_get_time_offset(sc, tr, sind, prate, npcodes, master_barcodes_sequence): - - master_times, master_barcodes = master_barcodes_sequence - probe_times = (master_times[:npcodes] + tr) * sc - probe_barcodes = master_barcodes[:npcodes] - - obt = barcode.get_probe_time_offset( - master_times, master_barcodes, probe_times, probe_barcodes, sind, prate - ) - obt = [obt[0][0], obt[1][0], (obt[2][0][0], obt[2][1][0])] - - # total_time_shift, probe_rate, master_endpoints - exp = [ - tr - sind / (sc * prate), - sc * prate, - (master_times[0], master_times[npcodes - 1]), - ] - - for exp_el, obt_el in zip(exp, obt): - assert np.allclose(exp_el, obt_el) - - -@pytest.mark.parametrize("sc", [-10, -2, -1, -0.5, 0.5, 1, 2, 10]) -@pytest.mark.parametrize("tr", [-10, -2, -1, -0.5, 0, 0.5, 1, 2, 10]) -def test_linear_transform_from_intervals(sc, tr, master_barcodes_sequence): - - master = np.array([1, 2]) - probe = (master + tr) * sc - - sc_obt, tr_obt = barcode.linear_transform_from_intervals(master, probe) - - assert sc == sc_obt - assert tr == tr_obt - - -@pytest.mark.parametrize("sc", [-10, -2, -1, -0.5, 0.5, 1, 2, 10]) -@pytest.mark.parametrize("tr", [-10, -2, -1, -0.5, 0, 0.5, 1, 2, 10]) -@pytest.mark.parametrize( - "npcodes", [-1, 3] -) # fails in region [0, 2] due to insufficient samples -def test_match_barcodes(sc, tr, npcodes, master_barcodes_sequence): - - master_times, master_barcodes = master_barcodes_sequence - probe_times = (master_times + tr) * sc - probe_times_cut = probe_times[:npcodes] - probe_barcodes = master_barcodes[:npcodes] - - pint, mint = barcode.match_barcodes( - master_times, master_barcodes, probe_times_cut, probe_barcodes - ) - assert pint[1] - pint[0] == sc * (mint[1] - mint[0]) diff --git a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py deleted file mode 100644 index 69e5ff963c..0000000000 --- a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py +++ /dev/null @@ -1,60 +0,0 @@ -from unittest import mock - -import pytest -import numpy as np - -from allensdk.brain_observatory.ecephys.align_timestamps.barcode_sync_dataset import ( - BarcodeSyncDataset, -) - - -@pytest.mark.parametrize( - "line_labels,expected", [[["barcode"], 0], [["barcodes"], 0], [[], None]] -) -def test_barcode_line(line_labels, expected): - - dataset = BarcodeSyncDataset() - dataset.line_labels = line_labels - - if expected is None: - with pytest.raises(ValueError): - obtained = dataset.barcode_line - - else: - obtained = dataset.barcode_line - assert obtained == expected - - -@pytest.mark.parametrize( - "sample_frequency,rising_edges,falling_edges,times_exp,codes_exp,table", - [ - [1, np.array([30, 50, 50.08]), np.array([31, 50.04, 50.12]), [50], [3], False], - [1, np.array([30, 50, 50.08]), np.array([31, 50.04, 50.12]), [50], [3], True], - ], -) -def test_extract_barcodes( - sample_frequency, rising_edges, falling_edges, times_exp, codes_exp, table -): - - dataset = BarcodeSyncDataset() - dataset.sample_frequency = sample_frequency - dataset.line_labels = ["barcode"] - - with mock.patch( - "allensdk.brain_observatory.sync_dataset.Dataset.get_rising_edges", - return_value=rising_edges, - ): - with mock.patch( - "allensdk.brain_observatory.sync_dataset.Dataset.get_falling_edges", - return_value=falling_edges, - ): - - if table: - table = dataset.get_barcode_table() - times = table["times"] - codes = table["codes"] - else: - times, codes = dataset.extract_barcodes() - - assert np.allclose(times, times_exp) - assert np.allclose(codes, codes_exp) diff --git a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py deleted file mode 100644 index 767c1d828e..0000000000 --- a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py +++ /dev/null @@ -1,28 +0,0 @@ -from unittest import mock - -import pytest -import numpy as np - -from allensdk.brain_observatory.ecephys.align_timestamps import channel_states as cs - - -@pytest.mark.parametrize( - "sample_frequency,events,times,times_exp,codes_exp", - [ - [ - 1, - np.array([1, 1, 1, -1, -1, -1]), - np.array([30, 50, 50.08, 31, 50.04, 50.12]), - [50], - [3], - ] - ], -) -def test_extract_barcodes_from_states( - sample_frequency, events, times, times_exp, codes_exp -): - - times, codes = cs.extract_barcodes_from_states(events, times, sample_frequency) - - assert np.allclose(times, times_exp) - assert np.allclose(codes, codes_exp) diff --git a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py deleted file mode 100644 index 5a991829b1..0000000000 --- a/allensdk/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py +++ /dev/null @@ -1,78 +0,0 @@ -from unittest import mock - -import pytest -import numpy as np - - -from allensdk.brain_observatory.ecephys.align_timestamps.probe_synchronizer import ( - ProbeSynchronizer, -) - - -def get_test_barcodes(): - - master_barcode_times = np.linspace(0, 30, 10) - master_barcodes = np.arange(0, 11) - - probe_barcode_times = np.linspace(0, 30, 10) * 0.5 + 1 - probe_barcodes = np.arange(0, 11) - - min_time = 0 - max_time = 30 - - return ( - master_barcode_times, - master_barcodes, - probe_barcode_times, - probe_barcodes, - min_time, - max_time, - ) - - -@pytest.fixture -def synchronizer(): - - local_sampling_rate = 4.0 - probe_start_index = 0 - - mbt, mb, pbt, pb, min_time, max_time = get_test_barcodes() - - result = ProbeSynchronizer.compute( - mbt, mb, pbt, pb, min_time, max_time, probe_start_index, local_sampling_rate - ) - - return result - - -@pytest.mark.parametrize( - "samples,sync_condition,expected", - [ - [ - np.arange(10, dtype="float"), - "master", - np.arange(10, dtype="float") / 2.0 - 2, - ], - [np.arange(10, dtype="float"), "probe", np.arange(10, dtype="float") / 4.0], - [ - np.arange(10, dtype="float"), - "salmon", - np.arange(10, dtype="float") / 2.0 - 2, - ], - ], -) -def test_call(synchronizer, samples, sync_condition, expected): - - if sync_condition in ("master", "probe"): - obtained = synchronizer(samples, sync_condition=sync_condition) - # print(obtained) - assert np.allclose(obtained, expected) - - else: - with pytest.raises(ValueError): - synchronizer(samples, sync_condition=sync_condition) - - -def test_sampling_rate_scale(synchronizer): - - assert synchronizer.sampling_rate_scale == 0.5 diff --git a/allensdk/test/brain_observatory/ecephys/conftest.py b/allensdk/test/brain_observatory/ecephys/conftest.py deleted file mode 100644 index db1f726994..0000000000 --- a/allensdk/test/brain_observatory/ecephys/conftest.py +++ /dev/null @@ -1,11 +0,0 @@ -import sys - - -def pytest_ignore_collect(path, config): - ''' The brain_observatory.ecephys submodule uses python 3.6 features that may not be backwards compatible! - ''' - - if sys.version_info < (3, 6): - return True - return False - diff --git a/allensdk/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py b/allensdk/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py deleted file mode 100644 index c0e2ad3b12..0000000000 --- a/allensdk/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py +++ /dev/null @@ -1,61 +0,0 @@ -from pathlib import Path - -import pytest -import pandas as pd -import xarray as xr - -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession - - -@pytest.mark.requires_bamboo -@pytest.mark.parametrize("nwb_path", [ - Path("/", "allen", "aibs", "mat", "Kael", "ecephys_data", "mouse412792.spikes.nwb") -]) -def test_spikes_nwb1(nwb_path): - """ - This test was based on the file /allen/aibs/mat/ecephys_data/mouse412792.spikes.nwb. To run this test please copy - or create a link to it in this directory. - """ - - if not nwb_path.exists(): - pytest.skip() - - # TODO: Convert this NWB 1 file into a NWB 2 file that way we can check that NWB Adaptors return the same data - # and computations (minus a few exceptions for missing NWB 1 data). - session = EcephysSession.from_nwb_path(path=str(nwb_path), nwb_version=1) - assert(isinstance(session.units, pd.DataFrame)) - assert(len(session.units) == 1363) - - print(session.stimulus_names) - - assert(isinstance(session.stimulus_presentations, pd.DataFrame)) - assert(len(session.stimulus_presentations) == 70390) - assert(len(session.get_stimulus_table(['Natural Images_5'])) == 5950) - assert(len(session.get_stimulus_table(['drifting_gratings_2'])) == 630) - assert(len(session.get_stimulus_table(['flash_250ms_1'])) == 150) - assert(len(session.get_stimulus_table(['gabor_20_deg_250ms_0'])) == 3645) - assert(len(session.get_stimulus_table(['natural_movie_one_three'])) == 18000) - assert(len(session.get_stimulus_table(['natural_movie_three_four'])) == 36000) - assert(len(session.get_stimulus_table(['spontaneous'])) == 15) - assert(len(session.get_stimulus_table(['static_gratings_6'])) == 6000) - - assert(session.running_speed.shape[0] == 365700) - - assert(len(session.spike_times.keys()) == 1363) - - assert(len(session.mean_waveforms.keys()) == 1363) - one_waveform = next(iter(session.mean_waveforms.values())) - assert(isinstance(one_waveform, xr.DataArray)) - - assert(len(session.probes) == 6) - assert(len(session.channels) == 737) - - pst = session.presentationwise_spike_times() - assert(isinstance(pst, pd.DataFrame) and len(pst) > 0) - - cpc = session.conditionwise_spike_statistics( - stimulus_presentation_ids=session.stimulus_presentations.index.values[:40] - ) - assert(isinstance(cpc, pd.DataFrame) and len(cpc) > 0) - - diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/__init__.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/conftest.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/conftest.py deleted file mode 100644 index b4ceb7556c..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/conftest.py +++ /dev/null @@ -1,66 +0,0 @@ -import pytest -import pandas as pd -import numpy as np - -from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi - - -class MockSessionApi(EcephysSessionApi): - """Mock Data to create an EcephysSession object and pass it into stimulus analysis""" - def get_spike_times(self): - return { - 0: np.array([1, 2, 3, 4]), - 1: np.array([2.5]), - 2: np.array([1.01, 1.03, 1.02]), - 3: np.array([]), - 4: np.array([0.01, 1.7, 2.13, 3.19, 4.25]), - 5: np.array([1.5, 3.0, 4.5]) - } - - def get_channels(self): - return pd.DataFrame({ - 'local_index': [0, 1, 2], - 'probe_horizontal_position': [5, 10, 15], - 'probe_id': [0, 0, 1], - 'probe_vertical_position': [10, 22, 33], - 'valid_data': [False, True, True] - }, index=pd.Index(name='channel_id', data=[0, 1, 2])) - - def get_units(self): - udf = pd.DataFrame({ - 'firing_rate': np.linspace(1, 3, 6), - 'isi_violations': [40, 0.5, 0.1, 0.2, 0.0, 0.1], - 'local_index': [0, 0, 1, 1, 2, 2], - 'peak_channel_id': [0, 2, 1, 1, 2, 0], - 'quality': ['good', 'good', 'good', 'bad', 'good', 'good'], - }, index=pd.Index(name='unit_id', data=np.arange(6)[::-1])) - return udf - - def get_probes(self): - return pd.DataFrame({ - 'description': ['probeA', 'probeB'], - 'location': ['VISp', 'VISam'], - 'sampling_rate': [30000.0, 30000.0] - }, index=pd.Index(name='id', data=[0, 1])) - - def get_stimulus_presentations(self): - return pd.DataFrame({ - 'start_time': np.linspace(0.0, 4.5, 10, endpoint=True), - 'stop_time': np.linspace(0.5, 5.0, 10, endpoint=True), - 'stimulus_name': ['spontaneous'] + ['s0'] * 6 + ['spontaneous'] + ['s1'] * 2, - 'stimulus_block': [0] + [1] * 6 + [0] + [2] * 2, - 'duration': 0.5, - 'stimulus_index': [0] + [1] * 6 + [0] + [2] * 2, - 'conditions': [0, 0, 0, 0, 1, 1, 1, 0, 2, 3] # generic stimulus condition - }, index=pd.Index(name='id', data=np.arange(10))) - - def get_invalid_times(self): - return pd.DataFrame() - - - def get_running_speed(self): - return pd.DataFrame({ - "start_time": np.linspace(0.0, 9.9, 100), - "end_time": np.linspace(0.1, 10.0, 100), - "velocity": np.linspace(-0.1, 11.0, 100) - }) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py deleted file mode 100644 index 1f819bbed0..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py +++ /dev/null @@ -1,95 +0,0 @@ -import pytest -import numpy as np -import pandas as pd - -from .conftest import MockSessionApi -from allensdk.brain_observatory.ecephys.stimulus_analysis.dot_motion import DotMotion -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession - - -class MockDMSessionApi(MockSessionApi): - def get_stimulus_presentations(self): - features = np.array(np.meshgrid([0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0], # Dir - [0.001, 0.005, 0.01, 0.02]) # Speed - ).reshape(2, 32) - - features = np.concatenate((features, np.array([np.nan, np.nan]).reshape((2, 1))), axis=1) # null case - - return pd.DataFrame({ - 'start_time': np.concatenate(([0.0], np.linspace(0.5, 32.5, 33, endpoint=True), [33.5])), - 'stop_time': np.concatenate(([0.5], np.linspace(1.5, 33.5, 33, endpoint=True), [34.0])), - 'stimulus_name': ['spontaneous'] + ['dot_motion']*33 + ['spontaneous'], - 'stimulus_block': [0] + [1]*33 + [0], - 'duration': [0.5] + [1.0]*33 + [0.5], - 'stimulus_index': [0] + [1]*33 + [0], - 'Dir': np.concatenate(([np.nan], features[0,:], [np.nan])), - 'Speed': np.concatenate(([np.nan], features[1, :], [np.nan])) - }, index=pd.Index(name='id', data=np.arange(35))) - - def get_invalid_times(self): - return pd.DataFrame() - - - -@pytest.fixture -def ecephys_api(): - return MockDMSessionApi() - - -def test_load(ecephys_api): - session = EcephysSession(api=ecephys_api) - dm = DotMotion(ecephys_session=session) - assert(dm.name == 'Dot Motion') - assert(set(dm.unit_ids) == set(range(6))) - assert(len(dm.conditionwise_statistics) == 33*6) - assert(dm.conditionwise_psth.shape == (33, 1.0/0.001-1, 6)) - assert(not dm.presentationwise_spike_times.empty) - assert(len(dm.presentationwise_statistics) == 33*6) - assert(len(dm.stimulus_conditions) == 33) - - -def test_stimulus(ecephys_api): - session = EcephysSession(api=ecephys_api) - dm = DotMotion(ecephys_session=session) - assert(isinstance(dm.stim_table, pd.DataFrame)) - assert(len(dm.stim_table) == 33) - assert(set(dm.stim_table.columns).issuperset({'Dir', 'Speed', 'start_time', 'stop_time'})) - - assert(set(dm.directions) == {0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0}) - assert(dm.number_directions == 8) - - assert(set(dm.speeds) == {0.001, 0.005, 0.01, 0.02}) - assert(dm.number_speeds == 4) - - -def test_metrics(ecephys_api): - session = EcephysSession(api=ecephys_api) - rfm = DotMotion(ecephys_session=session) - assert(isinstance(rfm.metrics, pd.DataFrame)) - assert(len(rfm.metrics) == 6) - assert(rfm.metrics.index.names == ['unit_id']) - - assert('pref_speed_dm' in rfm.metrics.columns) - assert(rfm.metrics['pref_speed_dm'].loc[0] == 0.001) - assert(rfm.metrics['pref_speed_dm'].loc[5] == 0.001) - - assert('pref_dir_dm' in rfm.metrics.columns) - assert(rfm.metrics['pref_dir_dm'].loc[0] == 0.0) - assert(rfm.metrics['pref_dir_dm'].loc[4] == 45.0) - - assert('firing_rate_dm' in rfm.metrics.columns) - assert('fano_dm' in rfm.metrics.columns) - assert('lifetime_sparseness_dm' in rfm.metrics.columns) - assert('run_pval_dm' in rfm.metrics.columns) - assert('run_mod_dm' in rfm.metrics.columns) - - -@pytest.mark.skip(reason='metric not yet implemented') -def test_speed_tuning_idx(): - pass - - -if __name__ == '__main__': - # test_load() - # test_stimulus() - test_metrics() diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py deleted file mode 100644 index 25bf4510c3..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py +++ /dev/null @@ -1,230 +0,0 @@ -import numpy as np -import pandas as pd -import pytest - -from .conftest import MockSessionApi -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession -from allensdk.brain_observatory.ecephys.stimulus_analysis.drifting_gratings import DriftingGratings, modulation_index, c50, f1_f0 - - -pd.set_option('display.max_columns', None) - - -class MockDGSessionApi(MockSessionApi): - ## c50 will be calculated differently depending on if 'drifting_gratings_contrast' stimuli exists. - - def __init__(self, with_dg_contrast=False): - self._with_dg_contrast = with_dg_contrast - - def get_spike_times(self): - return { - 0: np.array([1, 2, 3, 4]), - 1: np.array([2.5]), - 2: np.array([1.01, 1.03, 1.02]), - 3: np.array([]), - 4: np.array([0.01, 1.7, 2.13, 3.19, 4.25, 46.4, 48.7, 54.2, 80.3, 85.40, 85.44, 85.47]), - #5: np.array([1.5, 3.0, 4.5, 90.1]) # make sure there is a spike for the contrast stimulus - 5: np.concatenate(([1.5, 3.0, 4.5], np.linspace(85.0, 89.0, 20))) - } - - def get_stimulus_presentations(self): - features = np.array(np.meshgrid([1.0, 2.0, 4.0, 8.0, 15.0], # TF - [0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0]) # ORI - ).reshape(2, 40) - - stim_table = pd.DataFrame({ - 'start_time': np.concatenate(([0.0], np.linspace(0.5, 78.5, 40, endpoint=True), [80.0])), - 'stop_time': np.concatenate(([0.0], np.linspace(2.5, 80.5, 40, endpoint=True), [81.0])), - 'stimulus_name': ['spontaneous'] + ['drifting_gratings']*40 + ['spontaneous'], - 'stimulus_block': [0] + [1]*40 + [0], - 'duration': [0.5] + [2.0]*40 + [0.5], - 'stimulus_index': [0] + [1]*40 + [0], - 'temporal_frequency': np.concatenate(([np.nan], features[0, :], [np.nan])), - 'orientation': np.concatenate(([np.nan], features[1, :], [np.nan])), - 'contrast': 0.8 - }, index=pd.Index(name='id', data=np.arange(42))) - - if self._with_dg_contrast: - features = np.array(np.meshgrid([0.0, 45.0, 90.0, 135.0], # ORI - [0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]) # contrast - ).reshape(2, 36) - - dg_constrast = pd.DataFrame({ - 'start_time': np.concatenate((80.0 + np.linspace(0.0, 17.5, 36, endpoint=True), [97.5])), - 'stop_time': np.concatenate((81.5 + np.linspace(0.5, 18.0, 36, endpoint=True), [98.0])), - 'stimulus_name': ['drifting_gratings_contrast']*36 + ['spontaneous'], - 'stimulus_block': [2]*36 + [0], - 'duration': [0.5]*36 + [0.5], - 'stimulus_index': [2]*36 + [0], - 'temporal_frequency': 2.0, - 'orientation': np.concatenate((features[0, :], [np.nan])), - 'contrast': np.concatenate((features[1, :], [np.nan])) - }, index=pd.Index(name='id', data=np.arange(42, 42+37))) - stim_table = pd.concat((stim_table, dg_constrast)) - - return stim_table - - def get_invalid_times(self): - return pd.DataFrame() - - - - -@pytest.fixture -def ecephys_api(): - return MockDGSessionApi() - -#def mock_ecephys_api(): -# return MockDGSessionApi() - -@pytest.fixture -def ecephys_api_w_contrast(): - return MockDGSessionApi(with_dg_contrast=True) - - - -def test_load(ecephys_api): - session = EcephysSession(api=ecephys_api) - dg = DriftingGratings(ecephys_session=session) - assert(dg.name == 'Drifting Gratings') - assert(set(dg.unit_ids) == set(range(6))) - assert(len(dg.conditionwise_statistics) == 40*6) - assert(dg.conditionwise_psth.shape == (40, 2.0/0.001-1, 6)) - assert(not dg.presentationwise_spike_times.empty) - assert(len(dg.presentationwise_statistics) == 40*6) - assert(len(dg.stimulus_conditions) == 40) - - -def test_stimulus(ecephys_api): - session = EcephysSession(api=ecephys_api) - dg = DriftingGratings(ecephys_session=session) - assert(isinstance(dg.stim_table, pd.DataFrame)) - assert(len(dg.stim_table) == 40) - assert(len(dg.stim_table_contrast) == 0) - - assert(set(dg.stim_table.columns).issuperset({'temporal_frequency', 'orientation', 'contrast', 'start_time', - 'stop_time'})) - - assert(set(dg.tfvals) == {1.0, 2.0, 4.0, 8.0, 15.0}) - assert(dg.number_tf == 5) - - assert(set(dg.orivals) == {0.0, 45.0, 90.0, 135.0, 180.0, 225.0, 270.0, 315.0}) - assert(dg.number_ori == 8) - - assert(set(dg.contrastvals) == {0.8}) - assert(dg.number_contrast == 1) - - -def test_metrics(ecephys_api): - # Run metrics with no drifting_gratings_contrast stimuli - session = EcephysSession(api=ecephys_api) - dg = DriftingGratings(ecephys_session=session) - assert(isinstance(dg.metrics, pd.DataFrame)) - assert(len(dg.metrics) == 6) - assert(dg.metrics.index.names == ['unit_id']) - - assert('pref_ori_dg' in dg.metrics.columns) - assert(np.all(dg.metrics['pref_ori_dg'].loc[[0, 1, 2, 3, 4, 5]] == np.full(6, 0.0))) - - assert('pref_tf_dg' in dg.metrics.columns) - assert(np.all(dg.metrics['pref_tf_dg'].loc[[0, 5]] == [1.0, 2.0])) - - # with no contrast stimuli the c50 metric should be null - assert('c50_dg' in dg.metrics.columns) - assert(np.allclose(dg.metrics['c50_dg'].values, [np.nan]*6, equal_nan=True)) - - assert('f1_f0_dg' in dg.metrics.columns) - assert(np.allclose(dg.metrics['f1_f0_dg'].loc[[0, 1, 2, 3, 4, 5]], - [0.001572, np.nan, 1.999778, np.nan, 1.560436, 1.999978], equal_nan=True, atol=1.0e-06)) - - assert('mod_idx_dg' in dg.metrics.columns) - assert('g_osi_dg' in dg.metrics.columns) - assert(np.allclose(dg.metrics['g_osi_dg'].loc[[0, 3, 4, 5]], [1.0, np.nan, 0.745356, 1.0], equal_nan=True)) - - assert('g_dsi_dg' in dg.metrics.columns) - assert(np.allclose(dg.metrics['g_dsi_dg'].loc[[0, 3, 4, 5]], [1.0, np.nan, 0.491209, 1.0], equal_nan=True)) - - assert('firing_rate_dg' in dg.metrics.columns) - assert('fano_dg' in dg.metrics.columns) - assert('lifetime_sparseness_dg' in dg.metrics.columns) - assert('run_pval_dg' in dg.metrics.columns) - assert('run_mod_dg' in dg.metrics.columns) - - -def test_contrast_stimulus(ecephys_api_w_contrast): - session = EcephysSession(api=ecephys_api_w_contrast) - dg = DriftingGratings(ecephys_session=session) - assert(len(dg.stim_table) == 40) - - assert(len(dg.stim_table_contrast) == 36) - assert(len(dg.stimulus_conditions_contrast) == 36) - assert(len(dg.conditionwise_statistics_contrast) == 36*6) - - -def test_metric_with_contrast(ecephys_api_w_contrast): - session = EcephysSession(api=ecephys_api_w_contrast) - dg = DriftingGratings(ecephys_session=session) - - assert(isinstance(dg.metrics, pd.DataFrame)) - assert(len(dg.metrics) == 6) - assert(dg.metrics.index.names == ['unit_id']) - - # make sure normal prefered conditions remain the same - assert('pref_ori_dg' in dg.metrics.columns) - assert(np.all(dg.metrics['pref_ori_dg'].loc[[0, 1, 2, 3, 4, 5]] == np.full(6, 0.0))) - assert('pref_tf_dg' in dg.metrics.columns) - assert(np.all(dg.metrics['pref_tf_dg'].loc[[0, 5]] == [1.0, 2.0])) - - # Make sure class can see drifting_gratings_contrasts stimuli - assert('c50_dg' in dg.metrics.columns) - assert(np.allclose(dg.metrics['c50_dg'].loc[[0, 4, 5]], [0.359831, np.nan, 0.175859], equal_nan=True)) - - -@pytest.mark.parametrize('response,tf,sampling_rate,expected', - [ - (np.array([]), 2.0, 1000.0, np.nan), # invalid input - (np.zeros(2000), 2.0, 1000.0, 0.0), # no responses, MI ~ 0 - (np.ones(2000), 4.0, 1000.0, 0.0), # no derivation, MI ~ 0 - (np.linspace(0.5, 12.1), 8.0, 1.0, np.nan), # tf is outside niquist freq. - (np.array([0.1, 0.2, 0.2, 1.1]), 2.0, 4.0, 0.1389328986), # low mi - (np.linspace(0.5, 12.1, 50), 8.0, 1000.0, 4.993941), # high mi - ]) -def test_modulation_index(response, tf, sampling_rate, expected): - mi = modulation_index(response, tf, sampling_rate) # return nan, invalid - assert(np.isclose(mi, expected, equal_nan=True)) - - -@pytest.mark.parametrize('contrast_vals,responses,expected', - [ - (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.array([]), np.nan), # invalid input - (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.full(9, 12.0), 0.0090), # flat non-zero curve - (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.zeros(9), 0.3598313725490197), # no responses - (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.linspace(0.0, 12.0, 9), 0.1330745098039216), - (np.array([0.01, 0.02, 0.04, 0.08, 0.13, 0.2, 0.35, 0.6, 1.0]), np.array([10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), np.nan), # nan, special case where curve can't be fitted - ]) -def test_c50(contrast_vals, responses, expected): - c50_metric = c50(contrast_vals, responses) - assert(np.isclose(c50_metric, expected, equal_nan=True)) - - -@pytest.mark.parametrize('data_arr,tf,trial_duration,expected', - [ - (np.array([]), 2.0, 1.0, np.nan), # invalid input - (np.zeros((5, 256)), 4.0, 2.0, np.nan), # no spikes - (np.ones((5, 256)), 18.0, 16.0, np.nan), # tf*trial_duration is too high, returns nan - (np.full((5, 256), 5.0), 4.0, 2.0, 0.0), # has constant spiking - (np.array([0, 0, 1, 1, 2, 0, 5, 1]), 2.0, 1.0, 0.894427190999916), # can handle arrays - (np.array([[0, 0, 1, 1, 2, 0, 5, 1]]), 2.0, 1.0, 0.894427190999916) # same as above but int matrix form - ]) -def test_f1_f0(data_arr, tf, trial_duration, expected): - f1_f0_val = f1_f0(data_arr, tf, trial_duration) - assert(np.isclose(f1_f0_val, expected, equal_nan=True)) - - -if __name__ == '__main__': - # test_stimulus() - test_metrics() - # test_stim_table_contrast() - # test_contrast_stimulus() - # test_metric_with_contrast() - diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py deleted file mode 100644 index 5d245999d5..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py +++ /dev/null @@ -1,81 +0,0 @@ -import pytest -import pandas as pd -import numpy as np - -from .conftest import MockSessionApi -from allensdk.brain_observatory.ecephys.stimulus_analysis.flashes import Flashes -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession - - -class MockFlSessionApi(MockSessionApi): - def get_stimulus_presentations(self): - return pd.DataFrame({ - 'start_time': np.concatenate(([0.0], np.linspace(0.5, 4.25, 16, endpoint=True), [4.5])), - 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 4.5, 16, endpoint=True), [5.0])), - 'stimulus_name': ['spontaneous'] + ['flashes']*16 + ['spontaneous'], - 'stimulus_block': [0] + [1]*16 + [0], - 'duration': [0.5] + [0.25]*16 + [0.5], - 'stimulus_index': [0] + [1]*16 + [0], - 'color': [np.nan, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, 1, -1, 1, -1, -1, 1, np.nan] - }, index=pd.Index(name='id', data=np.arange(18))) - - def get_invalid_times(self): - return pd.DataFrame() - - - -@pytest.fixture -def ecephys_api(): - return MockFlSessionApi() - - -def test_load(ecephys_api): - session = EcephysSession(api=ecephys_api) - fl = Flashes(ecephys_session=session) - assert(fl.name == 'Flashes') - assert(set(fl.unit_ids) == set(range(6))) - assert(len(fl.conditionwise_statistics) == 2*6) - assert(fl.conditionwise_psth.shape == (2, 249, 6)) - assert(not fl.presentationwise_spike_times.empty) - assert(len(fl.presentationwise_statistics) == 16*6) - assert(len(fl.stimulus_conditions) == 2) - - -def test_stimulus(ecephys_api): - session = EcephysSession(api=ecephys_api) - fl = Flashes(ecephys_session=session) - assert(isinstance(fl.stim_table, pd.DataFrame)) - assert(len(fl.stim_table) == 16) - assert(set(fl.stim_table.columns).issuperset({'color', 'start_time', 'stop_time'})) - - assert(all(fl.colors == [-1.0, 1.0])) - assert(fl.number_colors == 2) - - -def test_metrics(ecephys_api): - session = EcephysSession(api=ecephys_api) - fl = Flashes(ecephys_session=session) - assert(isinstance(fl.metrics, pd.DataFrame)) - assert(len(fl.metrics) == 6) - assert(fl.metrics.index.names == ['unit_id']) - - assert('on_off_ratio_fl' in fl.metrics.columns) - assert(np.allclose(fl.metrics['on_off_ratio_fl'].loc[[0, 1, 2, 3, 4, 5]], - [0.0, np.nan, 0.0, np.nan, 3.0, 2.0], equal_nan=True)) # Check _get_on_off_ratio() method - - assert('sustained_idx_fl' in fl.metrics.columns) - assert(np.allclose(fl.metrics['sustained_idx_fl'].loc[[0, 1, 2, 3, 4, 5]].values, - [0.00401606, np.nan, 0.01204819, np.nan, 0.02811245, 0.00401606], equal_nan=True)) - - assert('firing_rate_fl' in fl.metrics.columns) - assert('time_to_peak_fl' in fl.metrics.columns) - assert('fano_fl' in fl.metrics.columns) - assert('lifetime_sparseness_fl' in fl.metrics.columns) - assert('run_pval_fl' in fl.metrics.columns) - assert('run_mod_fl' in fl.metrics.columns) - - -if __name__ == '__main__': - # test_load() - # test_stimulus() - test_metrics() diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py deleted file mode 100644 index beab602723..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py +++ /dev/null @@ -1,57 +0,0 @@ -import pytest -import numpy as np -import pandas as pd - -from .conftest import MockSessionApi -from allensdk.brain_observatory.ecephys.stimulus_analysis.natural_movies import NaturalMovies -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession - - -class MockNMSessionApi(MockSessionApi): - def get_stimulus_presentations(self): - raise NotImplementedError() - - -@pytest.fixture -def ecephys_api(): - return MockNMSessionApi() - - -@pytest.mark.skip(reason='NaturalMovies not fully implemented.') -def test_load(ecephys_api): - session = EcephysSession(api=ecephys_api) - nm = NaturalMovies(ecephys_session=session) - assert(nm.name == 'Natural Movies') - assert(set(nm.unit_ids) == set(range(6))) - # assert(len(nm.conditionwise_statistics) == 119*6) - # assert(nm.conditionwise_psth.shape == (119, 249, 6)) - # assert(not nm.presentationwise_spike_times.empty) - # assert(len(nm.presentationwise_statistics) == 119*6) - # assert(len(nm.stimulus_conditions) == 119) - - -@pytest.mark.skip(reason='NaturalMovies not fully implemented.') -def test_stimulus(ecephys_api): - session = EcephysSession(api=ecephys_api) - nm = NaturalMovies(ecephys_session=session) - assert(isinstance(nm.stim_table, pd.DataFrame)) - # assert(len(nm.stim_table) == 119) - # assert(set(nm.stim_table.columns).issuperset({'frame', 'start_time', 'stop_time'})) - # assert(np.all(nm.images == np.arange(-1.0, 118))) - # assert(nm.number_images == 119) - # assert(nm.number_nonblank == 118) - - -@pytest.mark.skip(reason='NaturalMovies not fully implemented.') -def test_metrics(ecephys_api): - session = EcephysSession(api=ecephys_api) - nm = NaturalMovies(ecephys_session=session) - assert(isinstance(nm.metrics, pd.DataFrame)) - assert(len(nm.metrics) == 6) - assert(nm.metrics.index.names == ['unit_id']) - - assert('fano_nm' in nm.metrics.columns) - assert('firing_rate_nm' in nm.metrics.columns) - assert('lifetime_sparseness_nm' in nm.metrics.columns) - assert('run_pval_nm' in nm.metrics.columns) - assert('run_mod_nm' in nm.metrics.columns) diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py deleted file mode 100644 index c5b6e52a63..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py +++ /dev/null @@ -1,91 +0,0 @@ -import pytest -import numpy as np -import pandas as pd - -from .conftest import MockSessionApi -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession -from allensdk.brain_observatory.ecephys.stimulus_analysis.natural_scenes import NaturalScenes, image_selectivity - - -class MockNSSessionApi(MockSessionApi): - def get_stimulus_presentations(self): - return pd.DataFrame({ - 'start_time': np.concatenate(([0.0], np.linspace(0.5, 29.50, 119, endpoint=True), [39.75])), - 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 39.75, 119, endpoint=True), [40.25])), - 'stimulus_name': ['spontaneous'] + ['natural_scenes']*119 + ['spontaneous'], - 'stimulus_block': [0] + [1]*119 + [0], - 'duration': [0.5] + [0.25]*119 + [0.5], - 'stimulus_index': [0] + [1]*119 + [0], - 'frame': np.concatenate(([np.nan], np.arange(-1.0, 118.0), [np.nan])) - }, index=pd.Index(name='id', data=np.arange(121))) - - def get_invalid_times(self): - return pd.DataFrame() - -@pytest.fixture -def ecephys_api(): - return MockNSSessionApi() - - -def test_load(ecephys_api): - session = EcephysSession(api=ecephys_api) - ns = NaturalScenes(ecephys_session=session) - assert(ns.name == 'Natural Scenes') - assert(set(ns.unit_ids) == set(range(6))) - assert(len(ns.conditionwise_statistics) == 119*6) - assert(ns.conditionwise_psth.shape == (119, 249, 6)) - assert(not ns.presentationwise_spike_times.empty) - assert(len(ns.presentationwise_statistics) == 119*6) - assert(len(ns.stimulus_conditions) == 119) - - -def test_stimulus(ecephys_api): - session = EcephysSession(api=ecephys_api) - ns = NaturalScenes(ecephys_session=session) - assert(isinstance(ns.stim_table, pd.DataFrame)) - assert(len(ns.stim_table) == 119) - assert(set(ns.stim_table.columns).issuperset({'frame', 'start_time', 'stop_time'})) - - assert(np.all(ns.images == np.arange(-1.0, 118))) - assert(ns.number_images == 119) - assert(ns.number_nonblank == 118) - - -def test_metrics(ecephys_api): - session = EcephysSession(api=ecephys_api) - ns = NaturalScenes(ecephys_session=session) - assert(isinstance(ns.metrics, pd.DataFrame)) - assert(len(ns.metrics) == 6) - assert(ns.metrics.index.names == ['unit_id']) - - assert('pref_image_ns' in ns.metrics.columns) - assert(np.all(ns.metrics['pref_image_ns'].loc[[0, 1, 3, 4]] == [2, 9, 2, 4])) - - assert('image_selectivity_ns' in ns.metrics.columns) - assert('firing_rate_ns' in ns.metrics.columns) - assert('fano_ns' in ns.metrics.columns) - assert('time_to_peak_ns' in ns.metrics.columns) - assert('lifetime_sparseness_ns' in ns.metrics.columns) - assert('run_pval_ns' in ns.metrics.columns) - assert('run_mod_ns' in ns.metrics.columns) - - -@pytest.mark.parametrize('responses,expected', - [ - (np.array([]), np.nan), # invalid input - (np.array([1.0]), np.nan), # selectivity of one image is undefined - (np.array([0.0]), np.nan), - (np.zeros(118), 0.0), # responds uniformly - (np.ones(118), 0.0), # responds uniformly - (np.array([0.0]*200 + [1.0]), 0.99004975), # reponse to 1 image ~ 1.0 - (np.array([5.5, 0.0, 15.0, 10.0, 2.3, 4.9]), 0.16166666666666674) - ]) -def test_image_selectivity(responses, expected): - img_sel = image_selectivity(responses) - assert(np.isclose(img_sel, expected, equal_nan=True)) - - -if __name__ == '__main__': - test_load() - # test_stimulus() - # test_metrics() diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py deleted file mode 100644 index b08d249c30..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py +++ /dev/null @@ -1,187 +0,0 @@ -import pytest -import pandas as pd -import numpy as np - -from .conftest import MockSessionApi -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession -from allensdk.brain_observatory.ecephys.stimulus_analysis.receptive_field_mapping import \ - ReceptiveFieldMapping, \ - fit_2d_gaussian, \ - threshold_rf - -class MockRFMSessionApi(MockSessionApi): - def get_stimulus_presentations(self): - features = np.array(np.meshgrid([30.0, -20.0, 40.0, 20.0, 0.0, -30.0, -40.0, 10.0, -10.0], # x_position - [10.0, -10.0, 30.0, 40.0, -40.0, -30.0, -20.0, 20.0, 0.0]) # y_position - ).reshape(2, 81) - - return pd.DataFrame({ - 'start_time': np.concatenate(([0.0], np.linspace(0.5, 20.50, 81, endpoint=True), [20.75])), - 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 20.75, 81, endpoint=True), [21.25])), - 'stimulus_name': ['spontaneous'] + ['gabors']*81 + ['spontaneous'], - 'stimulus_block': [0] + [1]*81 + [0], - 'duration': [0.5] + [0.25]*81 + [0.5], - 'stimulus_index': [0] + [1]*81 + [0], - 'x_position': np.concatenate(([np.nan], features[0, :], [np.nan])), - 'y_position': np.concatenate(([np.nan], features[1, :], [np.nan])) - }, index=pd.Index(name='id', data=np.arange(83))) - - -@pytest.fixture -def ecephys_api(): - return MockRFMSessionApi() - - -def test_load(ecephys_api): - session = EcephysSession(api=ecephys_api) - rfm = ReceptiveFieldMapping(ecephys_session=session) - assert(rfm.name == 'Receptive Field Mapping') - assert(set(rfm.unit_ids) == set(range(6))) - assert(len(rfm.conditionwise_statistics) == 81*6) - assert(rfm.conditionwise_psth.shape == (81, 249, 6)) - assert(not rfm.presentationwise_spike_times.empty) - assert(len(rfm.presentationwise_statistics) == 81*6) - assert(len(rfm.stimulus_conditions) == 81) - - -def test_stimulus(ecephys_api): - session = EcephysSession(api=ecephys_api) - rfm = ReceptiveFieldMapping(ecephys_session=session) - assert(isinstance(rfm.stim_table, pd.DataFrame)) - assert(len(rfm.stim_table) == 81) - assert(set(rfm.stim_table.columns).issuperset({'x_position', 'y_position', 'start_time', 'stop_time'})) - - assert(set(rfm.azimuths) == {30.0, -20.0, 40.0, 20.0, 0.0, -30.0, -40.0, 10.0, -10.0}) - assert(rfm.number_azimuths == 9) - - assert(set(rfm.elevations) == {10.0, -10.0, 30.0, 40.0, -40.0, -30.0, -20.0, 20.0, 0.0}) - assert(rfm.number_elevations == 9) - - -def test_metrics(ecephys_api): - session = EcephysSession(api=ecephys_api) - rfm = ReceptiveFieldMapping(ecephys_session=session, minimum_spike_count=1.0, trial_duration=0.25, - mask_threshold=0.5) - assert(isinstance(rfm.metrics, pd.DataFrame)) - assert(len(rfm.metrics) == 6) - assert(rfm.metrics.index.names == ['unit_id']) - - # TODO: Methods are too sensitive and will have different values depending on the version of scipy - assert('azimuth_rf' in rfm.metrics.columns) - assert('elevation_rf' in rfm.metrics.columns) - assert('width_rf' in rfm.metrics.columns) - assert('height_rf' in rfm.metrics.columns) - # Different versions of scipy will return unit 1 as either a 0.0 or a nan - #assert(np.allclose(rfm.metrics['height_rf'].loc[[0, 1, 2, 3, 4, 5]], - # [np.nan, 0.0, 129.522395, np.nan, np.nan, np.nan], equal_nan=True)) - - assert('area_rf' in rfm.metrics.columns) - assert(np.allclose(rfm.metrics['area_rf'].loc[[0, 1, 2, 3, 4, 5]], - [0.0, 0.0, 0.0, np.nan, 0.0, 0.0], equal_nan=True)) - - assert('p_value_rf' in rfm.metrics.columns) - assert('on_screen_rf' in rfm.metrics.columns) - assert('firing_rate_rf' in rfm.metrics.columns) - assert('fano_rf' in rfm.metrics.columns) - assert('time_to_peak_rf' in rfm.metrics.columns) - assert('lifetime_sparseness_rf' in rfm.metrics.columns) - assert('run_pval_rf' in rfm.metrics.columns) - assert('run_mod_rf' in rfm.metrics.columns) - - -def test_receptive_fields(ecephys_api): - # Also test_response_by_stimulus_position() - session = EcephysSession(api=ecephys_api) - rfm = ReceptiveFieldMapping(ecephys_session=session) - assert(rfm.receptive_fields) - assert(type(rfm.receptive_fields)) - assert('spike_counts' in rfm.receptive_fields) - assert(rfm.receptive_fields['spike_counts'].shape == (9, 9, 6)) # x, y, units - assert(set(rfm.receptive_fields['spike_counts'].coords) == {'y_position', 'x_position', 'unit_id'}) - assert(np.all(rfm.receptive_fields['spike_counts'].coords['x_position'] - == [-40.0, -30.0, -20.0, -10.0, 0.0, 10.0, 20.0, 30.0, 40.0])) - assert(np.all(rfm.receptive_fields['spike_counts'].coords['y_position'] - == [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0])) - - # Some randomly sampled testing to make sure everything works like it should - assert(rfm.receptive_fields['spike_counts'][{'unit_id': 0}].values.sum() == 4) - assert(rfm.receptive_fields['spike_counts'][{'unit_id': 3}].values.sum() == 0) - assert(rfm.receptive_fields['spike_counts'][{'unit_id': 2, 'x_position': 8, 'y_position': 3}] == 3) - assert(np.all(rfm.receptive_fields['spike_counts'][{'x_position': 2, 'y_position': 5}] == [1, 0, 0, 0, 1, 1])) - - - -## Some special receptive fields for testing - -# Data taken from real example -rf_field_real = np.array([[7440, 5704, 11408, 8184, 9920, 5952, 11904, 11904, 9672], - [8184, 12152, 10912, 12648, 15128, 19096, 17112, 14384, 11656], - [12152, 17856, 25048, 36208, 47368, 30256, 20336, 10912, 10168], - [15624, 31000, 53568, 92752, 119288, 69440, 31496, 16120, 10416], - [12152, 23560, 32984, 74896, 93496, 52328, 28024, 19592, 11656], - [9672, 7192, 10912, 16120, 16368, 18600, 14880, 6696, 11408], - [11656, 7688, 6696, 5456, 11408, 9672, 11160, 12152, 7936], - [6696, 6696, 9424, 8928, 6200, 11160, 7688, 6200, 9672], - [8928, 10912, 9176, 8432, 7688, 9424, 5704, 8184, 14384]], dtype=np.float64) - -# RF as a typical gaussian -x, y = np.meshgrid(np.linspace(-1, 1, 9), np.linspace(-1, 1, 9)) -rf_field_gaussian = np.exp(-((np.sqrt(x*x + y*y) - 0.0)**2 /(2.0*1.0**2))) - -# Only activity at one of the corners of the field -rf_field_edge = np.zeros((9, 9)) -rf_field_edge[8, 8] = 5.0 - - -@pytest.mark.parametrize('rf,threshold,expected_mask,expected_x,expected_y,expected_area', - [ - (np.zeros((9, 9)), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0), # No firing - (np.full((9, 9), 100.0), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0), # completely consistant firing, no center - (rf_field_real, 0.5, None, 3.5, 3.0, 2.0), # example from real data - (rf_field_gaussian, 0.5, None, 4.0, 4.0, 9.0), - (rf_field_edge, 0.05, None, 8.0, 8.0, 1.0) - ]) -def test_threshold_rf(rf, threshold, expected_mask, expected_x, expected_y, expected_area): - mask_rf, x, y, area = threshold_rf(rf, threshold) - assert(np.isclose(x, expected_x, equal_nan=True)) - assert(np.isclose(y, expected_y, equal_nan=True)) - assert(np.isclose(area, expected_area, equal_nan=True)) - if expected_mask is not None: - # TODO: Find a better way to check the resulting mask, it should match up with the center/area - assert(np.allclose(mask_rf, expected_mask, equal_nan=True)) - - -@pytest.mark.parametrize('matrix,expected', - [ - (rf_field_real, (np.array([1.04991433e+05, 3.74217858e+00, 3.24465965e+00, 1.66477569e+00, 1.04485211e+00]), True)), - (rf_field_gaussian, (np.array([1.0, 4.0, 4.0, 4.0, 4.0]), True)), - (np.zeros((9, 9)), ((np.nan, np.nan, np.nan, np.nan, np.nan), False)), - ## These edge cases are too sensitive and will produce different values depending on the - ## version of scipy is compiled against. - # (np.full((9, 9), 20.5), (np.array([20.5000000, 3.62601891, 3.55521927, 1.20266006e+05, 1.08161135e+05]), True)), - # (rf_field_edge, (np.array([5.0, 8.0, 8.0, 0.0, 0.0]), True)) - ]) -def test_fit_2d_gaussian(matrix, expected): - fit_params, success = fit_2d_gaussian(matrix) - assert(np.allclose(fit_params, expected[0], equal_nan=True)) - assert(success == expected[1]) - - -if __name__ == '__main__': - # test_load() - # test_stimulus() - test_metrics() - # test_receptive_fields() - - # test_threshold_rf(np.zeros((9, 9)), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0) # No firing - # test_threshold_rf(np.full((9, 9), 100.0), 0.5, np.zeros((9, 9)), np.nan, np.nan, 0.0) # completely consistant firing, no center - # test_threshold_rf(rf_field_real, 0.5, None, 3.5, 3.0, 2.0) # example from real data - # test_threshold_rf(rf_field_gaussian, 0.5, None, 4.0, 4.0, 9.0) - # test_threshold_rf(rf_field_edge, 0.05, None, 8.0, 8.0, 1.0) - - # test_fit_2d_gaussian(rf_field_real, (np.array([1.04991433e+05, 3.74217858e+00, 3.24465965e+00, 1.66477569e+00, 1.04485211e+00]), True)) - # test_fit_2d_gaussian(rf_field_gaussian, (np.array([1.0, 4.0, 4.0, 4.0, 4.0]), True)) - # test_fit_2d_gaussian(np.zeros((9, 9)), ((np.nan, np.nan, np.nan, np.nan, np.nan), False)) - # test_fit_2d_gaussian(np.full((9, 9), 20.5), (np.array([20.5000000, 3.62601891, 3.55521927, 1.20266006e+05, 1.08161135e+05]), True)) - test_fit_2d_gaussian(rf_field_edge, (np.array([5.0, 8.0, 8.0, 0.0, 0.0]), True)) - pass diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py deleted file mode 100644 index e7eeb1a4bf..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py +++ /dev/null @@ -1,134 +0,0 @@ -import pytest -import pandas as pd -import numpy as np - -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession -from .conftest import MockSessionApi -from allensdk.brain_observatory.ecephys.stimulus_analysis.static_gratings import StaticGratings, get_sfdi, fit_sf_tuning - - -class MockSGSessionApi(MockSessionApi): - def get_stimulus_presentations(self): - features = np.array(np.meshgrid([0.02, 0.04, 0.08, 0.16, 0.32], # SF - [0.0, 30.0, 60.0, 90.0, 120.0, 150.0], # ORI - [0.0, 0.25, 0.50, 0.75])).reshape(3, 120) # Phase - - return pd.DataFrame({ - 'start_time': np.concatenate(([0.0], np.linspace(0.5, 30.25, 120, endpoint=True), [31.5])), - 'stop_time': np.concatenate(([0.5], np.linspace(0.75, 30.50, 120, endpoint=True), [32.0])), - 'stimulus_name': ['spontaneous'] + ['static_gratings']*120 + ['spontaneous'], - 'stimulus_block': [0] + [1]*120 + [0], - 'duration': [0.5] + [0.25]*120 + [0.5], - 'stimulus_index': [0] + [1]*120 + [0], - 'spatial_frequency': np.concatenate(([np.nan], features[0, :], [np.nan])), - 'orientation': np.concatenate(([np.nan], features[1, :], [np.nan])), - 'phase': np.concatenate(([np.nan], features[2, :], [np.nan])) - }, index=pd.Index(name='id', data=np.arange(122))) - - -@pytest.fixture -def ecephys_api(): - return MockSGSessionApi() - - -def test_load(ecephys_api): - session = EcephysSession(api=ecephys_api) - sg = StaticGratings(ecephys_session=session) - assert(sg.name == 'Static Gratings') - assert(set(sg.unit_ids) == set(range(6))) - assert(len(sg.conditionwise_statistics) == 120*6) - assert(sg.conditionwise_psth.shape == (120, 249, 6)) - assert(not sg.presentationwise_spike_times.empty) - assert(len(sg.presentationwise_statistics) == 120*6) - assert(len(sg.stimulus_conditions) == 120) - - -def test_stimulus(ecephys_api): - session = EcephysSession(api=ecephys_api) - sg = StaticGratings(ecephys_session=session) - assert(isinstance(sg.stim_table, pd.DataFrame)) - assert(len(sg.stim_table) == 120) - assert(set(sg.stim_table.columns).issuperset({'spatial_frequency', 'orientation', 'phase', 'start_time', 'stop_time'})) - - assert(set(sg.sfvals) == {0.02, 0.04, 0.08, 0.16, 0.32}) - assert(sg.number_sf == 5) - - assert(set(sg.orivals) == {0.0, 30.0, 60.0, 90.0, 120.0, 150.0}) - assert(sg.number_ori == 6) - - assert(set(sg.phasevals) == {0.0, 0.25, 0.50, 0.75}) - assert(sg.number_phase == 4) - - -def test_bad_stimulus_key(ecephys_api): - with pytest.raises(Exception): - session = EcephysSession(api=ecephys_api) - sg = StaticGratings(ecephys_session=session, stimulus_key='gratings static') - sg.stim_table - - -def test_bad_col_key(ecephys_api): - with pytest.raises(KeyError): - session = EcephysSession(api=ecephys_api) - sg = StaticGratings(ecephys_session=session, col_sf='spatial_frequency', col_phase='esahp') - sg.phasevals - - -def test_metrics(ecephys_api): - session = EcephysSession(api=ecephys_api) - sg = StaticGratings(ecephys_session=session) - assert(isinstance(sg.metrics, pd.DataFrame)) - assert(len(sg.metrics) == 6) - assert(sg.metrics.index.names == ['unit_id']) - - assert('pref_sf_sg' in sg.metrics.columns) - assert(np.all(sg.metrics['pref_sf_sg'].loc[[0, 2, 4]] == [0.02, 0.02, 0.04])) - - assert('pref_ori_sg' in sg.metrics.columns) - assert(np.all(sg.metrics['pref_ori_sg'].loc[[0, 2, 4]] == [0.0, 0.0, 0.0])) - - assert('pref_phase_sg' in sg.metrics.columns) - assert(np.all(sg.metrics['pref_phase_sg'].loc[[0, 1, 2, 3]] == [0.25, 0.75, 0.5, 0.0])) - - assert('g_osi_sg' in sg.metrics.columns) - assert('time_to_peak_sg' in sg.metrics.columns) - assert('firing_rate_sg' in sg.metrics.columns) - assert('fano_sg' in sg.metrics.columns) - assert('lifetime_sparseness_sg' in sg.metrics.columns) - assert('run_pval_sg' in sg.metrics.columns) - assert('run_mod_sg' in sg.metrics.columns) - - -@pytest.mark.parametrize('sf_tuning_responses,mean_sweeps_trials,expected', - [ - (np.array([18.08333, 19.8333, 28.333, 14.80, 9.6170]), - np.array([12.0, 4.0, 8.0, 32.0, 4.0, 0.0, 4.0, 8.0, 24.0, 40.0, 32.0, 8.0, 20.0, 28.0, - 24.0, 28.0, 0.0, 4.0, 4.0, 24.0, 16.0, 8.0, 16.0, 4.0, 0.0, 4.0, 24.0, 4.0, - 12.0, 20.0, 0.0, 12.0, 0.0, 16.0]), 0.4402349784724991) - ]) -def test_get_sfdi(sf_tuning_responses, mean_sweeps_trials, expected): - assert(get_sfdi(sf_tuning_responses, mean_sweeps_trials, len(sf_tuning_responses)) == expected) - - -@pytest.mark.parametrize('sf_tuning_response,sf_vals,pref_sf_index,expected', - [ - (np.array([2.69565217, 3.91836735, 2.36734694, 1.52, 2.21276596]), - [0.02, 0.04, 0.08, 0.16, 0.32], 1, (0.22704947240176027, 0.0234087755414, np.nan, np.nan) - ), - (np.array([1.14285714, 0.73469388, 7.44, 13.6, 11.6]), [0.02, 0.04, 0.08, 0.16, 0.32], 3, - (3.290141840632274, 0.1956416782774323, 0.08, np.nan)), - (np.array([2.24, 1.83333333, 1.68, 1.87755102, 1.87755102]), - [0.02, 0.04, 0.08, 0.16, 0.32], 0, (0.0, 0.019999999552965164, np.nan, 0.32)) - ]) -def test_fit_sf_tuning(sf_tuning_response, sf_vals, pref_sf_index, expected): - assert(np.allclose(fit_sf_tuning(sf_tuning_response, sf_vals, pref_sf_index), expected, equal_nan=True)) - - -if __name__ == '__main__': - # test_stimulus() - # test_load() - # test_bad_stimulus_key() - # test_bad_col_key() - test_metrics() - pass - diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py deleted file mode 100644 index 4e59e62c4b..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py +++ /dev/null @@ -1,380 +0,0 @@ -import pytest -import pandas as pd -import numpy as np -import xarray as xr -import warnings - -from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession -from allensdk.brain_observatory.ecephys.stimulus_analysis.stimulus_analysis import StimulusAnalysis, \ - running_modulation, lifetime_sparseness, fano_factor, overall_firing_rate, get_fr, osi, dsi - - -pd.set_option('display.max_columns', None) - - -class MockSessionApi(EcephysSessionApi): - """Mock Data to create an EcephysSession object and pass it into stimulus analysis - - # TODO: move to conftest so other tests can use data - """ - def get_spike_times(self): - return { - 0: np.array([1, 2, 3, 4]), - 1: np.array([2.5]), - 2: np.array([1.01, 1.03, 1.02]), - 3: np.array([]), - 4: np.array([0.01, 1.7, 2.13, 3.19, 4.25]), - 5: np.array([1.5, 3.0, 4.5]) - } - - def get_channels(self): - return pd.DataFrame({ - 'local_index': [0, 1, 2], - 'probe_horizontal_position': [5, 10, 15], - 'probe_id': [0, 0, 1], - 'probe_vertical_position': [10, 22, 33], - 'valid_data': [False, True, True] - }, index=pd.Index(name='channel_id', data=[0, 1, 2])) - - def get_units(self): - udf = pd.DataFrame({ - 'firing_rate': np.linspace(1, 3, 6), - 'isi_violations': [40, 0.5, 0.1, 0.2, 0.0, 0.1], - 'local_index': [0, 0, 1, 1, 2, 2], - 'peak_channel_id': [0, 2, 1, 1, 2, 0], - 'quality': ['good', 'good', 'good', 'bad', 'good', 'good'], - }, index=pd.Index(name='unit_id', data=np.arange(6)[::-1])) - return udf - - def get_probes(self): - return pd.DataFrame({ - 'description': ['probeA', 'probeB'], - 'location': ['VISp', 'VISam'], - 'sampling_rate': [30000.0, 30000.0] - }, index=pd.Index(name='id', data=[0, 1])) - - def get_stimulus_presentations(self): - return pd.DataFrame({ - 'start_time': np.linspace(0.0, 4.5, 10, endpoint=True), - 'stop_time': np.linspace(0.5, 5.0, 10, endpoint=True), - 'stimulus_name': ['spontaneous'] + ['s0'] * 6 + ['spontaneous'] + ['s1'] * 2, - 'stimulus_block': [0] + [1] * 6 + [0] + [2] * 2, - 'duration': 0.5, - 'stimulus_index': [0] + [1] * 6 + [0] + [2] * 2, - 'conditions': [0, 0, 0, 0, 1, 1, 1, 0, 2, 3] # generic stimulus condition - }, index=pd.Index(name='id', data=np.arange(10))) - - def get_invalid_times(self): - return pd.DataFrame() - - def get_running_speed(self): - return pd.DataFrame({ - "start_time": np.linspace(0.0, 9.9, 100), - "end_time": np.linspace(0.1, 10.0, 100), - "velocity": np.linspace(-0.1, 11.0, 100) - }) - - -@pytest.fixture -def ecephys_api(): - return MockSessionApi() - - -def test_unit_ids(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session) - assert(set(stim_analysis.unit_ids) == set(range(6))) - assert(stim_analysis.unit_count == 6) - - -def test_unit_ids_filter_by_id(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, filter=[2, 3, 1]) - assert(set(stim_analysis.unit_ids) == {1, 2, 3}) - assert(stim_analysis.unit_count == 3) - - stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'unit_id': [3, 0]}) - assert(set(stim_analysis.unit_ids) == {0, 3}) - assert(stim_analysis.unit_count == 2) - - with pytest.raises(KeyError): - # If unit ids don't exists should raise an error - stim_analysis = StimulusAnalysis(ecephys_session=session, filter=[100, 200]) - units = stim_analysis.unit_ids - - -def test_unit_ids_filtered(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'location': 'VISp'}) - assert(set(stim_analysis.unit_ids) == {0, 2, 3, 5}) - assert(stim_analysis.unit_count == 4) - - stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'location': 'VISp', 'quality': 'good'}) - assert(set(stim_analysis.unit_ids) == {0, 3, 5}) - assert(stim_analysis.unit_count == 3) - - with pytest.raises(Exception): - # No units found should raise exception - stim_analysis = StimulusAnalysis(ecephys_session=session, filter={'location': 'pSIV'}) - stim_analysis.unit_ids - stim_analysis.unit_count - - -def test_stim_table(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') - assert(isinstance(stim_analysis.stim_table, pd.DataFrame)) - assert(len(stim_analysis.stim_table) == 6) - assert(stim_analysis.total_presentations == 6) - - # Make sure certain columns exist - assert('start_time' in stim_analysis.stim_table) - assert('stop_time' in stim_analysis.stim_table) - assert('stimulus_condition_id' in stim_analysis.stim_table) - assert('stimulus_name' in stim_analysis.stim_table) - assert('duration' in stim_analysis.stim_table) - - with pytest.raises(Exception): - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='0s') - stim_analysis.stim_table - - -def test_stim_table_spontaneous(ecephys_api): - # By default table should be empty because non of the stimulus are above the duration threshold - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, spontaneous_threshold=0.49) - assert(isinstance(stim_analysis.stim_table_spontaneous, pd.DataFrame)) - assert(len(stim_analysis.stim_table_spontaneous) == 2) - - # Check that threshold is working - stim_analysis = StimulusAnalysis(ecephys_session=session, spontaneous_threshold=0.51) - assert(len(stim_analysis.stim_table_spontaneous) == 0) - - -def test_conditionwise_psth(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5, - psth_resolution=0.1) - assert(isinstance(stim_analysis.conditionwise_psth, xr.DataArray)) - # assert(stim_analysis.conditionwise_psth.shape == (2, 4, 6)) - assert(stim_analysis.conditionwise_psth.coords['time_relative_to_stimulus_onset'].size == 4) # 0.5/0.1 - 1 - assert(stim_analysis.conditionwise_psth.coords['unit_id'].size == 6) - assert(stim_analysis.conditionwise_psth.coords['stimulus_condition_id'].size == 2) - assert(np.allclose(stim_analysis.conditionwise_psth[{'unit_id': 0, 'stimulus_condition_id': 1}].values, - np.array([1.0/3.0, 0.0, 0.0, 0.0]))) - - # Make sure psth doesn't fail even when all the condition_ids are unique. - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s1', trial_duration=0.5, - psth_resolution=0.1) - assert(stim_analysis.conditionwise_psth.coords['time_relative_to_stimulus_onset'].size == 4) - assert(stim_analysis.conditionwise_psth.coords['unit_id'].size == 6) - assert(stim_analysis.conditionwise_psth.coords['stimulus_condition_id'].size == 2) - - -def test_conditionwise_statistics(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') - assert(len(stim_analysis.conditionwise_statistics) == 2*6) # units x condition_ids - assert(set(stim_analysis.conditionwise_statistics.index.names) == {'unit_id', 'stimulus_condition_id'}) - assert(set(stim_analysis.conditionwise_statistics.columns) == - {'spike_std', 'spike_sem', 'spike_count', 'stimulus_presentation_count', 'spike_mean'}) - - expected = pd.Series( - [2.0, 3.0, 0.66666667, 0.57735027, 0.33333333], - ["spike_count", "stimulus_presentation_count", "spike_mean", "spike_std", "spike_sem"] - ) - obtained = stim_analysis.conditionwise_statistics.loc[(0, 1)] - pd.testing.assert_series_equal(expected, obtained[expected.index], check_less_precise=5, check_names=False) - - -def test_presentationwise_spike_times(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') - assert(len(stim_analysis.presentationwise_spike_times) == 12) - assert(list(stim_analysis.presentationwise_spike_times.index.names) == ['spike_time']) - assert(set(stim_analysis.presentationwise_spike_times.columns) == {'stimulus_presentation_id', 'unit_id', 'time_since_stimulus_presentation_onset'}) - assert(stim_analysis.presentationwise_spike_times.loc[1.01]['unit_id'] == 2) - assert(stim_analysis.presentationwise_spike_times.loc[1.01]['stimulus_presentation_id'] == 2) - assert(len(stim_analysis.presentationwise_spike_times.loc[3.0]) == 2) - - -def test_presentationwise_statistics(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5) - assert(len(stim_analysis.presentationwise_statistics) == 6*6) # units x presentation_ids - assert(set(stim_analysis.presentationwise_statistics.index.names) == {'stimulus_presentation_id', 'unit_id'}) - assert(set(stim_analysis.presentationwise_statistics.columns) == {'spike_counts', 'stimulus_condition_id', - 'running_speed'}) - assert(stim_analysis.presentationwise_statistics.loc[1, 0]['spike_counts'] == 1.0) - assert(stim_analysis.presentationwise_statistics.loc[1, 0]['stimulus_condition_id'] == 1.0) - assert(np.isclose(stim_analysis.presentationwise_statistics.loc[1, 0]['running_speed'], 0.684848)) - - -def test_stimulus_conditions(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5) - assert(len(stim_analysis.stimulus_conditions) == 2) - assert(np.all(stim_analysis.stimulus_conditions['stimulus_name'].unique() == ['s0'])) - assert(set(stim_analysis.stimulus_conditions['conditions'].unique()) == {0, 1}) - - -def test_running_speed(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') - assert(set(stim_analysis.running_speed.index.values) == set(range(1, 7))) - assert(np.isclose(stim_analysis.running_speed.loc[1]['running_speed'], 0.684848)) - assert(np.isclose(stim_analysis.running_speed.loc[3]['running_speed'], 1.806061)) - assert(np.isclose(stim_analysis.running_speed.loc[6]['running_speed'], 3.487879)) - - -def test_spikes(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') - assert(isinstance(stim_analysis.spikes, dict)) - assert(stim_analysis.spikes.keys() == set(range(6))) - assert(np.allclose(stim_analysis.spikes[0], [1, 2, 3, 4])) - assert(np.allclose(stim_analysis.spikes[4], [0.01, 1.7 , 2.13, 3.19, 4.25])) - assert(stim_analysis.spikes[3].size == 0) - - # Check that spikes dict is filtering units - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', filter=[0, 2]) - assert(stim_analysis.spikes.keys() == {0, 2}) - - -def test_get_preferred_condition(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') - assert(stim_analysis._get_preferred_condition(3) == 1) - - with pytest.raises(KeyError): - stim_analysis._get_preferred_condition(10) - -def test_check_multiple_preferred_conditions(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0') - - assert(stim_analysis._check_multiple_pref_conditions(0, 'conditions', [0, 1]) is False) - assert(stim_analysis._check_multiple_pref_conditions(3, 'conditions', [0, 1]) is True) - - -def test_get_time_to_peak(ecephys_api): - session = EcephysSession(api=ecephys_api) - stim_analysis = StimulusAnalysis(ecephys_session=session, stimulus_key='s0', trial_duration=0.5) - assert(stim_analysis._get_time_to_peak(1, stim_analysis._get_preferred_condition(1)) == 0.0005) - - -@pytest.mark.parametrize('spike_counts,running_speeds,speed_threshold,expected', - [ - (np.zeros(10), np.zeros(1),1.0, (np.nan, np.nan)), # Input error, return nan - (np.zeros(5), np.full(5, 2.0), 1.0, (np.nan, np.nan)), # returns Nan, always running - (np.zeros(5), np.full(5, 2.0), 2.1, (np.nan, np.nan)), # returns Nan, always stationary - (np.zeros(5), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (np.nan, np.nan)), # No firing, return Nans - (np.ones(5), np.array([0.0, 0.0, 2.0, 2.0, 2.0]), 1.0, (np.nan, 0.0)), # always the same fr, pval is Nan but run_mod is 0.0) - (np.array([3.0, 3.0, 1.5, 1.5, 0.9]), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (0.013559949584378913, -0.5666666666666667)), - (np.array([3.0, 3.0, 1.5, 1.5, 1.5]), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (0.0, -0.5)), - (np.array([3.0, 3.0, 1.5, 5.5, 2.5]), np.array([0.0, 0.0, 2.0, 2.5, 3.0]), 1.0, (0.9024099927051468, 0.052631578947368376)), - (np.array([0.0, 0.0, 4.0, 4.0]), np.array([0.0, 0.0, 2.5, 3.0]), 1.0, (0.0, 1.0)) - ]) -def test_running_modulation(spike_counts, running_speeds, speed_threshold, expected): - rm = running_modulation(spike_counts, running_speeds, speed_threshold) - assert(np.allclose(rm, expected, equal_nan=True)) - - -@pytest.mark.parametrize('responses,expected', - [ - (np.array([1.0]), np.nan), # can't calculate for single point - (np.full(20, 3.2), 0.0), # always the same, sparness should be at/near 0 - (np.array([10.0, 0.0, 0.0, 0.0, 0.0, 0.0]), 1.0), # spareness should be close to 1 - (np.array([2.24, 3.6, 0.8, 2.4, 3.52, 5.68, 8.96, 0.0]), 0.43500091849856115) - ]) -def test_lifetime_sparseness(responses, expected): - lts = lifetime_sparseness(responses) - assert(np.isclose(lts, expected, equal_nan=True)) - - -@pytest.mark.parametrize('spike_counts,expected', - [ - (np.zeros(10), np.nan), # mean 0.0 leads to Nan - (np.array([-1.5, 1.5]), np.nan), # mean 0 - (np.ones(5), 0.0), # no variance - (np.array([1.2, 20.0, 0.0, 36.2, 0.6]), 17.921379310344832), # High variance - (np.array([5.1, 5.3, 5.2, 5.1, 5.2]), 0.0010810810810810846), # low variance - ]) -def test_fano_factor(spike_counts, expected): - ff = fano_factor(spike_counts) - assert(np.isclose(ff, expected, equal_nan=True)) - - -@pytest.mark.parametrize('start_times,stop_times,spike_times,expected', - [ - (np.array([0.0]), np.array([0.0]), np.linspace(0, 10.0, 10), np.nan), # nan, total time 0.0 - (np.arange(1.0, 3.0), np.arange(0.0, 2.0), np.linspace(0, 10.0, 10), np.nan), # nan, total_time negative - (np.arange(1.0, 4.0), np.arange(0.0, 2.0), np.linspace(0, 10.0, 10), np.nan), # nan, time lengths don't match - (np.array([0.0]), np.array([1.0]), np.linspace(0, 10.0, 100), 10.0), - (np.array([0.0, 9.0]), np.array([1.0, 10.0]), np.linspace(0, 10.0, 101), 10.0) # 10.0 Hz split up into blocks - ]) -def test_overall_firing_rate(start_times, stop_times, spike_times, expected): - ofr = overall_firing_rate(start_times, stop_times, spike_times) - assert(np.isclose(ofr, expected, equal_nan=True)) - - -@pytest.mark.parametrize('spikes,sampling_freq,sweep_length,expected', - [ - (np.array([0.82764702, 0.83624702, 1.09211374]), 10, 1.5, [0.0, 0.0, 0.0, 0.0, 0.000133830, 0.004431861, 0.05412495, 0.2464033072, 0.45293459677, 0.4839428913, - 0.452934596, 0.2464033072, 0.054124958, 0.00443186162, 0.0001338306]), - (np.array([]), 10, 1.5, np.zeros(15)) - ]) -def test_get_fr(spikes, sampling_freq, sweep_length, expected): - frs = get_fr(spikes, num_timestep_second=sampling_freq, sweep_length=sweep_length) - assert(len(frs) == int(sampling_freq*sweep_length)) - assert(np.allclose(frs, expected)) - - -@pytest.mark.parametrize('orivals,tuning,expected', - [ - (np.array([1.0]), np.array([0.0, 30.0, 60.0, 90.0, 120.0, 150.0]), np.nan), - (np.array([]), np.array([]), np.nan), - (np.array([0.0+0.0j, 0.52359878 + 0.j, 1.04719755 + 0.j, 1.57079633+0.j, 2.0943951+0.j, 2.61799388+0.j]), np.array([5.5, 4.44, 3.54166667, 4.10869565, 4.42, 4.55319149]), 0.07873455094232604) - ]) -def test_osi(orivals, tuning, expected): - osi_val = osi(orivals, tuning) - assert(np.allclose(osi_val, expected, equal_nan=True)) - - -@pytest.mark.parametrize('orivals,tuning,expected', - [ - (np.array([1.0]), np.array([0.0, 30.0, 60.0, 90.0, 120.0, 150.0]), np.nan), - (np.array([]), np.array([]), np.nan), - (np.array([0.0+0.0j, 0.52359878 + 0.j, 1.04719755 + 0.j, 1.57079633+0.j, 2.0943951+0.j, 2.61799388+0.j]), np.array([5.5, 4.44, 3.54166667, 4.10869565, 4.42, 4.55319149]), 0.6126966469601506) - ]) -def test_dsi(orivals, tuning, expected): - dsi_val = dsi(orivals, tuning) - assert(np.allclose(dsi_val, expected, equal_nan=True)) - - -if __name__ == '__main__': - # test_unit_ids() - # test_unit_ids_filter_by_id() - # test_unit_ids_filtered() - # test_stim_table() - # test_stim_table_spontaneous() - # test_conditionwise_psth() - # test_conditionwise_statistics() - # test_presentationwise_spike_times() - # test_presentationwise_statistics() - # test_stimulus_conditions() - # test_running_speed() - # test_spikes() - # test_get_preferred_condition() - # test_get_time_to_peak() - # test_running_modulation(spike_counts=np.zeros(10), running_speeds=np.zeros(1), speed_threshold=1.0, - # expected=(np.nan, np.nan)) - # test_lifetime_sparseness(np.array([1.0]), 1.0) - # test_fano_factor([-1.5, 1.5], np.nan) # mean 0.0 leads to Nan - # test_overall_firing_rate(np.array([0.0]), np.array([0.0]), np.linspace(0, 10.0, 10)) - # test_osi(np.array([1.0]), np.array([0.0, 30.0, 60.0, 90.0, 120.0, 150.0]), np.nan) - test_osi(np.array([0.0+0.0j, 0.52359878 + 0.j, 1.04719755 + 0.j, 1.57079633+0.j, 2.0943951+0.j, 2.61799388+0.j]), - np.array([5.5, 4.44, 3.54166667, 4.10869565, 4.42, 4.55319149]), 0.07873455094232604) - pass \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_table/__init__.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py deleted file mode 100644 index f0d2dd4376..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py +++ /dev/null @@ -1,270 +0,0 @@ -import pytest -import pandas as pd -import numpy as np - -import allensdk.brain_observatory.ecephys.stimulus_table.ephys_pre_spikes as ephys_pre_spikes - - -def stimulus_psuedofixture_0(): - return { - "display_sequence": [[500, 1000]], - "sweep_frames": [[10, 20], [20, 25]], - "sweep_order": [1, 0], - "dimnames": ["a", "b", "c"], - "sweep_table": [[1, 2, 3], [-3, -2, -1]], - "stim_path": r"C:\\ecephys_stimulus_scripts\\gabor_20_deg_250ms.stim", - } - - -def stimulus_psuedofixture_1(): - return { - "display_sequence": [[500, 1000]], - "sweep_frames": [[10, 20], [20, 25]], - "sweep_order": [1, 0], - "dimnames": [], - "sweep_table": [], - "stim_path": r"C:\\ecephys_stimulus_scripts\\gabor_20_deg_250ms.stim", - } - - -def test_assign_sweep_values(): - - stim_table = pd.DataFrame( - [ - { - "Start": 0, - "End": 1, - "orientation": np.nan, - "color": np.nan, - "sweep_number": 2, - }, - { - "Start": 1, - "End": 2, - "orientation": np.nan, - "color": np.nan, - "sweep_number": 0, - }, - { - "Start": 2, - "End": 3, - "orientation": np.nan, - "color": np.nan, - "sweep_number": 1, - }, - { - "Start": 3, - "End": 4, - "orientation": np.nan, - "color": np.nan, - "sweep_number": 3, - }, - ] - ) - - sweep_table = pd.DataFrame( - [ - {"orientation": 0, "color": "red", "sweep_number": 0}, - {"orientation": 45, "color": "blue", "sweep_number": 1}, - {"orientation": 90, "color": "green", "sweep_number": 2}, - ] - ) - - expected = pd.DataFrame( - [ - {"Start": 0, "End": 1, "orientation": 90, "color": "green"}, - {"Start": 1, "End": 2, "orientation": 0, "color": "red"}, - {"Start": 2, "End": 3, "orientation": 45, "color": "blue"}, - {"Start": 3, "End": 4, "orientation": np.nan, "color": np.nan}, - ] - ) - - obtained = ephys_pre_spikes.assign_sweep_values(stim_table, sweep_table) - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_column_type=False, check_dtype=False) - - -@pytest.mark.parametrize( - "table,column,new_columns,drop,expected", - [ - [ - pd.DataFrame({"Pos": [[0, 1], [1, 2]], "count": [12, 42]}), - "Pos", - {"Pos_x": lambda field: field[0], "Pos_y": lambda field: field[1]}, - True, - pd.DataFrame({"Pos_x": [0, 1], "Pos_y": [1, 2], "count": [12, 42]}), - ], - [ - pd.DataFrame({"dog": [1, 2, 3]}), - "cat", - {}, - False, - pd.DataFrame({"dog": [1, 2, 3]}), - ], - ], -) -def test_split_column(table, column, new_columns, drop, expected): - - obtained = ephys_pre_spikes.split_column(table, column, new_columns, drop) - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_column_type=False, check_dtype=False) - - -@pytest.mark.parametrize( - "sweeps,disp_seq,expected", - [ - [ - {"Start": [0, 1, 2, 3], "End": [1, 2, 3, 4]}, - [[2, 5]], - {"Start": [2, 3, 4], "End": [3, 4, 5], "stimulus_block": [0, 0, 0]}, - ], - [ - {"Start": [1, 3, 15, 18], "End": [3, 4, 18, 20]}, - [[2, 4], [16, 36]], - { - "Start": [3, 17, 29, 32], - "End": [5, 18, 32, 34], - "stimulus_block": [0, 1, 1, 1], - }, - ], - ], -) -def test_apply_display_sequence(sweeps, disp_seq, expected): - - table = pd.DataFrame(sweeps) - disp_seq = np.array(disp_seq) - obt_table = ephys_pre_spikes.apply_display_sequence(table, disp_seq) - - expected_table = pd.DataFrame(expected) - pd.testing.assert_frame_equal( - obt_table, expected_table, check_like=True, check_column_type=False, check_dtype=False - ) - - -@pytest.mark.parametrize( - "stimulus_tables,expected", - [ - [ - [ - pd.DataFrame({"Start": [0, 1], "End": [1, 2]}), - pd.DataFrame({"Start": [5], "End": [7]}), - ], - [pd.DataFrame({"Start": [2], "End": [5]})], - ], - [[], []], - ], -) -def test_make_spontaneous_activity_tables(stimulus_tables, expected): - - obtained = ephys_pre_spikes.make_spontaneous_activity_tables(stimulus_tables) - - if len(obtained) == 1: - pd.testing.assert_frame_equal(obtained[0], expected[0], check_like=True, check_column_type=False, check_dtype=False) - else: - assert len(obtained) == len(expected) - - -# TODO: this test is really weird -@pytest.mark.parametrize( - "stimuli,stim_tabler,spon_tabler,sort_key,expected", - [ - [ - [[1, 5], [3, 4]], - lambda stimulus: [pd.DataFrame({"parameter": stimulus})], - lambda stimuli: [pd.DataFrame({"parameter": [len(stimuli)]})], - "parameter", - pd.DataFrame( - { - "parameter": [1, 2, 3, 4, 5], - "stimulus_block": [0, None, 1, 1, 0], - "stimulus_index": [0, None, 1, 1, 0], - } - ), - ] - ], -) -def test_create_stim_table(stimuli, stim_tabler, spon_tabler, sort_key, expected): - - obtained = ephys_pre_spikes.create_stim_table( - stimuli, stim_tabler, spon_tabler, sort_key - ) - pd.testing.assert_frame_equal( - obtained, expected, check_like=True, check_dtype=False, check_column_type=False - ) - - -@pytest.mark.parametrize( - "stim_table,frame_times,fps,eft,map_cols,expected", - [ - [ - pd.DataFrame( - {"Start": [1, 2, 3, 4], "End": [2, 3, 4, 5], "data": [-1, -2, -3, -4]} - ), - np.array([100, 50, 25, 12.5, 6.25]), - 10, - True, - ("Start", "End"), - pd.DataFrame( - { - "Start": [50, 25, 12.5, 6.25], - "End": [25, 12.5, 6.25, 6.35], - "data": [-1, -2, -3, -4], - } - ), - ] - ], -) -def test_apply_frame_times(stim_table, frame_times, fps, eft, map_cols, expected): - - obtained = ephys_pre_spikes.apply_frame_times( - stim_table, frame_times, fps, eft, map_cols - ) - pd.testing.assert_frame_equal(obtained, expected, check_like=True, check_column_type=False, check_dtype=False) - - -@pytest.mark.parametrize( - "stimulus,stf,start_key,end_key,expected", - [ - [ - stimulus_psuedofixture_0(), - lambda x: np.array(x), - "Start", - "End", - [ - pd.DataFrame( - { - "Start": [510, 520], - "End": [521, 526], - "a": [-3, 1], - "b": [-2, 2], - "c": [-1, 3], - "stimulus_block": [0, 0], - "stimulus_name": ["gabor_20_deg_250ms"] * 2, - } - ) - ], - ], - [ - stimulus_psuedofixture_1(), - lambda x: np.array(x), - "Start", - "End", - [ - pd.DataFrame( - { - "Start": [510, 520], - "End": [521, 526], - "Image": [1, 0], - "stimulus_block": [0, 0], - "stimulus_name": ["gabor_20_deg_250ms"] * 2, - } - ) - ], - ], - ], -) -def test_build_stimuluswise_table(stimulus, stf, start_key, end_key, expected): - - obtained = ephys_pre_spikes.build_stimuluswise_table( - stimulus, stf, start_key, end_key - ) - for obtained_table, expected_table in zip(obtained, expected): - pd.testing.assert_frame_equal(obtained_table, expected_table, check_like=True, check_column_type=False, check_dtype=False) diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py deleted file mode 100644 index 1e750d41d5..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py +++ /dev/null @@ -1,191 +0,0 @@ -import pytest -import pandas as pd -import numpy as np - -from allensdk.brain_observatory.ecephys.stimulus_table import naming_utilities as nu - - -@pytest.mark.parametrize( - "table,expected", - [ - [ - pd.DataFrame( - { - "stimulus_name": [ - "natural_movie_four_more_repeats", - "natural_movie_four", - "natural_movie_shuffled", - ] - } - ), - pd.DataFrame( - { - "stimulus_name": [ - "natural_movie_four_more_repeats", - "natural_movie_four", - "natural_movie_four_shuffled", - ] - } - ), - ], - [ - pd.DataFrame( - { - "stimulus_name": [ - "natural_movie_four_more_repeats", - "natural_movie_four", - ] - } - ), - pd.DataFrame( - { - "stimulus_name": [ - "natural_movie_four_more_repeats", - "natural_movie_four", - ] - } - ), - ], - [ - pd.DataFrame( - { - "stimulus_name": [ - "natural_movie_4_more_repeats", - "natural_movie_4", - "natural_movie_shuffled", - ] - } - ), - pd.DataFrame( - { - "stimulus_name": [ - "natural_movie_4_more_repeats", - "natural_movie_4", - "natural_movie_4_shuffled", - ] - } - ), - ], - ], -) -def test_add_number_to_shuffled_movie(table, expected): - obtained = nu.add_number_to_shuffled_movie(table) - pd.testing.assert_frame_equal(expected, obtained, check_like=True) - - -@pytest.mark.parametrize( - "table,expected", - [ - [ - pd.DataFrame( - {"stimulus_name": ["natural_movie_4", "natural_movie_5_more_repeats"]} - ), - pd.DataFrame( - { - "stimulus_name": [ - "natural_movie_four", - "natural_movie_five_more_repeats", - ] - } - ), - ] - ], -) -def test_standardize_movie_numbers(table, expected): - obtained = nu.standardize_movie_numbers(table) - pd.testing.assert_frame_equal(expected, obtained, check_like=True) - - -@pytest.mark.parametrize( - "table,name_map,expected", - [ - [ - pd.DataFrame({"stimulus_name": ["Natural Images", "contrast_response"]}), - { - "Natural Images": "natural_scenes", - "contrast_response": "drifting_gratings_contrast", - }, - pd.DataFrame( - {"stimulus_name": ["natural_scenes", "drifting_gratings_contrast"]} - ), - ], - [ - pd.DataFrame( - {"stimulus_name": ["Natural Images", "contrast_response", np.nan]} - ), - { - "Natural Images": "natural_scenes", - "contrast_response": "drifting_gratings_contrast", - None: "spontaneous", - }, - pd.DataFrame( - { - "stimulus_name": [ - "natural_scenes", - "drifting_gratings_contrast", - "spontaneous", - ] - } - ), - ], - ], -) -def test_map_stimulus_names(table, name_map, expected): - obtained = nu.map_stimulus_names(table, name_map) - pd.testing.assert_frame_equal(expected, obtained, check_like=True) - - -@pytest.mark.parametrize( - "table,expected", - [ - [ - pd.DataFrame({"a": [1, 2, 3], "b": [np.nan, np.nan, np.nan]}), - pd.DataFrame({"a": [1, 2, 3]}), - ], - [ - pd.DataFrame({"a": [1, 2, 3], "b": [None, None, None]}), - pd.DataFrame({"a": [1, 2, 3]}), - ], - [ - pd.DataFrame({"a": [1, 2, 3], "b": [None, None, 4]}), - pd.DataFrame({"a": [1, 2, 3], "b": [None, None, 4]}), - ], - ], -) -def test_drop_empty_columns(table, expected): - obtained = nu.drop_empty_columns(table) - pd.testing.assert_frame_equal(expected, obtained, check_like=True) - - -@pytest.mark.parametrize( - "table,expected", - [ - [ - pd.DataFrame({"a": [1, 2, np.nan], "A": [np.nan, None, 3]}), - pd.DataFrame({"a": [1, 2, 3]}), - ], - [ - pd.DataFrame({"bar": [1, 2, np.nan], "Bar": [np.nan, None, 3]}), - pd.DataFrame({"bar": [1, 2, 3]}), - ], - [ - pd.DataFrame({"bar": [1, 2, np.nan], "Bar": [np.nan, 4, 3]}), - pd.DataFrame({"bar": [1, 2, np.nan], "Bar": [np.nan, 4, 3]}), - ], - [ - pd.DataFrame( - { - "bar": [1, 2, np.nan], - "Bar": [np.nan, 4, 3], - "BAR": [np.nan, np.nan, 3], - } - ), - pd.DataFrame({"bar": [1, 2, 3], "Bar": [np.nan, 4, 3]}), - ], - ], -) -def test_collapse_colimns(table, expected): - obtained = nu.collapse_columns(table) - pd.testing.assert_frame_equal( - expected, obtained, check_like=True, check_dtype=False - ) diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py deleted file mode 100644 index 5181d7a26e..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py +++ /dev/null @@ -1,62 +0,0 @@ -import pytest - -from allensdk.brain_observatory.ecephys.stimulus_table import ( - stimulus_parameter_extraction as spe, -) - - -@pytest.fixture -def stim_repr(): - return "GratingStim(autoDraw=False, autoLog=True, color=array([1., 1., 1.]), colorSpace='rgb', contrast=0.8, depth=0, name=foo)" - - -@pytest.fixture -def dup_stim_repr(): - return "GratingStim(autoDraw=False, autoDraw=True)" - - -def test_extract_const_params_from_stim_repr_duplicates(dup_stim_repr): - with pytest.raises(KeyError): - obtained = spe.extract_const_params_from_stim_repr(dup_stim_repr) - - -def test_extract_const_params_from_stim_repr(stim_repr): - - expected = { - "autoDraw": False, - "autoLog": True, - "color": [1.0, 1.0, 1.0], - "colorSpace": "rgb", - "contrast": 0.8, - "depth": 0, - "name": "foo", - } - - obtained = spe.extract_const_params_from_stim_repr(stim_repr) - - assert len(expected) == len(obtained) - for key in obtained: - assert expected[key] == obtained[key] - - -def test_extract_stim_class_from_repr(stim_repr): - - expected = "GratingStim" - obtained = spe.extract_stim_class_from_repr(stim_repr) - - assert expected == obtained - - -def test_parse_stim_repr(stim_repr): - expected = { - "color": [1.0, 1.0, 1.0], - "colorSpace": "rgb", - "contrast": 0.8, - "depth": 0, - } - - obtained = spe.parse_stim_repr(stim_repr) - - assert len(expected) == len(obtained) - for key in obtained: - assert expected[key] == obtained[key] diff --git a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py deleted file mode 100644 index a325c3ec49..0000000000 --- a/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py +++ /dev/null @@ -1,316 +0,0 @@ -import collections -import sys -import os - -import pytest -import mock -import pandas as pd -import numpy as np - -from allensdk.brain_observatory.ecephys.stimulus_table.__main__ import ( - build_stimulus_table, -) - - -def build_psuedofixture(name, data): - new_class = collections.namedtuple(name, data.keys()) - return new_class(**data) - - -def stim_file(*a, **k): - return build_psuedofixture( - "StimFileClass", - { - "pre_blank_sec": 20.0, - "frames_per_second": 10.0, - "stimuli": [ - { - "stim_path": "C:\\ecephys_stimulus_scripts\\gabor_20_deg_250ms.stim", - "display_sequence": np.array([[50, 100]], dtype=np.int32), - "dimnames": ["TF", "SF"], - "sweep_frames": [ - (0, 4), - (5, 9), - (10, 14), - (15, 19), - (20, 24), - (25, 29), - (30, 34), - (35, 39), - ], - "sweep_order": [4, 3, 7, 1, 2, 0, 5, 6], - "sweep_table": [ - (-1, 1), - (-2, 2), - (-3, 3), - (-4, 4), - (-5, 5), - (-6, 6), - (-7, 7), - (-8, 8), - ], - "stim": "GratingStim(autoDraw=False, autoLog=True, contrast=0.8, win=Window(...))", - }, - { - "stim_path": "C:\\ecephys_stimulus_scripts\\static_gratings.stim", - "display_sequence": np.array( - [[45, 46], [100, 110]], dtype=np.int32 - ), - "dimnames": ["Ori", "Phase"], - "sweep_frames": [(0, 8), (9, 17), (18, 26), (27, 35)], - "sweep_order": [0, 2, 3, 1], - "sweep_table": [(-1.5, 1.5), (-2.5, 2.5), (-3.5, 3.5), (-4.5, 4.5)], - "stim": "GratingStim(contrast=0.8, ori=30.0, phase=array([0., 0.]), sf=array([0.16, 0.16]), size=array([250., 250.]))", - }, - ], - }, - ) - - -def sync_file(*a, **k): - class SyncFileClass: - def extract_frame_times(*a, **k): - return np.arange(10000, dtype=float) / 10 - - @classmethod - def factory(cls, *a, **k): - return cls() - - return SyncFileClass.factory - - -@pytest.fixture -def expected_table(): - return pd.DataFrame( - { - "Start": { - 0: 0.0, - 1: 65.0, - 2: 65.9, - 3: 66.8, - 4: 70.0, - 5: 70.5, - 6: 71.0, - 7: 71.5, - 8: 72.0, - 9: 72.5, - 10: 73.0, - 11: 73.5, - 12: 74.0, - 13: 120.8, - 14: 121.7, - }, - "End": { - 0: 65.0, - 1: 65.9, - 2: 66.8, - 3: 70.0, - 4: 70.5, - 5: 71.0, - 6: 71.5, - 7: 72.0, - 8: 72.5, - 9: 73.0, - 10: 73.5, - 11: 74.0, - 12: 120.8, - 13: 121.7, - 14: 122.6, - }, - "stimulus_name": { - 0: "spontaneous", - 1: "static_gratings", - 2: "static_gratings", - 3: "spontaneous", - 4: "gabor", - 5: "gabor", - 6: "gabor", - 7: "gabor", - 8: "gabor", - 9: "gabor", - 10: "gabor", - 11: "gabor", - 12: "spontaneous", - 13: "static_gratings", - 14: "static_gratings", - }, - "stimulus_block": { - 0: np.nan, - 1: 0.0, - 2: 0.0, - 3: np.nan, - 4: 1.0, - 5: 1.0, - 6: 1.0, - 7: 1.0, - 8: 1.0, - 9: 1.0, - 10: 1.0, - 11: 1.0, - 12: np.nan, - 13: 2.0, - 14: 2.0, - }, - "Ori": { - 0: np.nan, - 1: -1.5, - 2: -3.5, - 3: np.nan, - 4: np.nan, - 5: np.nan, - 6: np.nan, - 7: np.nan, - 8: np.nan, - 9: np.nan, - 10: np.nan, - 11: np.nan, - 12: np.nan, - 13: -4.5, - 14: -2.5, - }, - "Phase": { - 0: np.nan, - 1: 1.5, - 2: 3.5, - 3: np.nan, - 4: np.nan, - 5: np.nan, - 6: np.nan, - 7: np.nan, - 8: np.nan, - 9: np.nan, - 10: np.nan, - 11: np.nan, - 12: np.nan, - 13: 4.5, - 14: 2.5, - }, - "contrast": { - 0: np.nan, - 1: 0.8, - 2: 0.8, - 3: np.nan, - 4: 0.8, - 5: 0.8, - 6: 0.8, - 7: 0.8, - 8: 0.8, - 9: 0.8, - 10: 0.8, - 11: 0.8, - 12: np.nan, - 13: 0.8, - 14: 0.8, - }, - "sf": { - 0: np.nan, - 1: "[0.16, 0.16]", - 2: "[0.16, 0.16]", - 3: np.nan, - 4: "5.0", - 5: "4.0", - 6: "8.0", - 7: "2.0", - 8: "3.0", - 9: "1.0", - 10: "6.0", - 11: "7.0", - 12: np.nan, - 13: "[0.16, 0.16]", - 14: "[0.16, 0.16]", - }, - "size": { - 0: np.nan, - 1: "[250.0, 250.0]", - 2: "[250.0, 250.0]", - 3: np.nan, - 4: np.nan, - 5: np.nan, - 6: np.nan, - 7: np.nan, - 8: np.nan, - 9: np.nan, - 10: np.nan, - 11: np.nan, - 12: np.nan, - 13: "[250.0, 250.0]", - 14: "[250.0, 250.0]", - }, - "stimulus_index": { - 0: np.nan, - 1: 1.0, - 2: 1.0, - 3: np.nan, - 4: 0.0, - 5: 0.0, - 6: 0.0, - 7: 0.0, - 8: 0.0, - 9: 0.0, - 10: 0.0, - 11: 0.0, - 12: np.nan, - 13: 1.0, - 14: 1.0, - }, - "TF": { - 0: np.nan, - 1: np.nan, - 2: np.nan, - 3: np.nan, - 4: -5.0, - 5: -4.0, - 6: -8.0, - 7: -2.0, - 8: -3.0, - 9: -1.0, - 10: -6.0, - 11: -7.0, - 12: np.nan, - 13: np.nan, - 14: np.nan, - }, - } - ) - - -@mock.patch( - "allensdk.brain_observatory.ecephys.file_io.stim_file.CamStimOnePickleStimFile.factory", - new=stim_file, -) -@mock.patch( - "allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset.EcephysSyncDataset.factory", - new=sync_file(), -) -def test_build_stimulus_table(tmpdir_factory, expected_table): - - tmpdir = str(tmpdir_factory.mktemp("ecephys_stimulus_table_integration")) - table_path = os.path.join(tmpdir, "stimulus_table.csv") - frame_times_path = os.path.join(tmpdir, "frame_times.npy") - - build_stimulus_table( - stimulus_pkl_path="fake_stim_path", - sync_h5_path="fake_sync_path", - frame_time_strategy="use_photodiode", - minimum_spontaneous_activity_duration=sys.float_info.epsilon, - extract_const_params_from_repr=True, - drop_const_params=["name", "maskParams", "win", "autoLog", "autoDraw"], - maximum_expected_spontanous_activity_duration=99999999999, - stimulus_name_map={ - "": "spontaneous", - "Natural Images": "natural_scenes", - "flash_250ms": "flash", - "contrast_response": "drifting_gratings_contrast", - "gabor_20_deg_250ms": "gabor", - }, - column_name_map={}, - output_stimulus_table_path=table_path, - output_frame_times_path=frame_times_path, - fail_on_negative_duration=True - ) - - obtained_table = pd.read_csv(table_path) - obtained_frame_times = np.load(frame_times_path, allow_pickle=False) - - pd.testing.assert_frame_equal(expected_table, obtained_table, check_like=True, check_dtype=False) - assert np.array_equal(np.arange(10000) / 10, obtained_frame_times) diff --git a/allensdk/test/brain_observatory/ecephys/test_copy_utility.py b/allensdk/test/brain_observatory/ecephys/test_copy_utility.py deleted file mode 100644 index da74d4c15f..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_copy_utility.py +++ /dev/null @@ -1,201 +0,0 @@ -import os -import hashlib -from pathlib import Path -import sys -import shutil - -import pytest - -import argschema - -import allensdk.brain_observatory.ecephys.copy_utility.__main__ as cu -from allensdk.brain_observatory.ecephys.copy_utility._schemas import ( - SessionUploadInputSchema, SessionUploadOutputSchema) - - -@pytest.mark.parametrize("already_exists", [True, False]) -def test_dst_dir_exists(already_exists, tmp_path, monkeypatch): - dst_dir = tmp_path / "new_directory" - src_file = tmp_path / "source.txt" - src_file.touch() - - if already_exists: - dst_dir.mkdir() - dst_file = dst_dir / "destination.txt" - outj_path = tmp_path / "output.json" - - args = { - "files": [ - { - "source": str(src_file), - "destination": str(dst_file), - "key": "something"}], - "output_json": str(outj_path)} - - parser = argschema.ArgSchemaParser( - args, - schema_type=SessionUploadInputSchema, - output_schema_type=SessionUploadOutputSchema, - args=[] - ) - - def mock_copy_file(source, dest, use_rsync, make_parent_dirs, chmod=None): - parent = Path(dest).parent - if make_parent_dirs & (not parent.exists()): - parent.mkdir() - shutil.copy(source, dest) - - monkeypatch.setattr(cu, "copy_file_entry", mock_copy_file) - output = cu.main(**parser.args) - parser.output(output, indent=2) - assert outj_path.exists() - assert Path(args["files"][0]["destination"]).exists() - - -def test_hash_file(tmpdir_factory): - tempdir = str(tmpdir_factory.mktemp('ecephys_copy_utility_test_hash_file')) - path = os.path.join(tempdir, 'afile.txt') - - st = 'hello world' - with open(path, 'wb') as f: - f.write(st.encode()) - - hasher_cls = hashlib.sha256 - obtained = cu.hash_file(path, hasher_cls) - - h = hasher_cls() - h.update(st.encode()) - expected = h.digest() - assert expected == obtained - - -@pytest.mark.parametrize('use_rsync', [True, False]) -@pytest.mark.parametrize('make_parent_dirs', [True, False]) -@pytest.mark.parametrize("chmod", [777, 775, 755, None]) -def test_copy_file_entry(tmpdir_factory, use_rsync, make_parent_dirs, chmod): - - mac_or_linux = ( - sys.platform.startswith('darwin') or sys.platform.startswith('linux') - ) - if use_rsync and not mac_or_linux: - pytest.skip() - - tempdir = str( - tmpdir_factory.mktemp('ecephys_copy_utility_test_copy_file_entry') - ) - spath = os.path.join(tempdir, 'afile.txt') - dpath = os.path.join(tempdir, 'bfile.txt') - - with open(spath, 'w') as sf: - sf.write('foo') - - cu.copy_file_entry(spath, dpath, use_rsync, make_parent_dirs, chmod) - - with open(dpath, 'r') as df: - assert df.read() == 'foo' - - def get_human_mode(path): - return int(oct(os.stat(path).st_mode & 0o777)[2:]) - expected_mode = chmod if chmod is not None else get_human_mode(spath) - - if mac_or_linux: - assert get_human_mode(dpath) == expected_mode - - -@pytest.mark.parametrize('different', [True, False]) -@pytest.mark.parametrize('raise_if_comparison_fails', [True, False]) -def test_compare_directories(tmpdir_factory, - different, - raise_if_comparison_fails): - hasher_cls = hashlib.sha256 - - base_dir = str( - tmpdir_factory.mktemp('ecephys_copy_utility_test_compare_directories') - ) - sdir = os.path.join(base_dir, 'src') - os.makedirs(sdir) - ddir = os.path.join(base_dir, 'dest') - os.makedirs(ddir) - - if different: - - with open(os.path.join(sdir, 'foo.txt'), 'w') as f: - f.write('baz') - - if raise_if_comparison_fails: - with pytest.raises(ValueError): - cu.compare_directories( - sdir, ddir, hasher_cls, raise_if_comparison_fails) - else: - with pytest.warns(UserWarning): - cu.compare_directories( - sdir, ddir, hasher_cls, raise_if_comparison_fails) - - else: - cu.compare_directories( - sdir, ddir, hasher_cls, raise_if_comparison_fails) - - -@pytest.mark.parametrize('different', [True, False]) -@pytest.mark.parametrize('raise_if_comparison_fails', [True, False]) -def test_compare_files(tmpdir_factory, different, raise_if_comparison_fails): - hasher_cls = hashlib.sha256 - - base_dir = str( - tmpdir_factory.mktemp('ecephys_copy_utility_test_compare_files') - ) - spath = os.path.join(base_dir, 'source.txt') - dpath = os.path.join(base_dir, 'dest.txt') - - with open(spath, 'w') as f: - f.write('baz') - - if different: - - with open(dpath, 'w') as f: - f.write('fish') - - if raise_if_comparison_fails: - with pytest.raises(ValueError): - cu.compare_files( - spath, dpath, hasher_cls, raise_if_comparison_fails) - else: - with pytest.warns(UserWarning): - cu.compare_files( - spath, dpath, hasher_cls, raise_if_comparison_fails) - - else: - - with open(dpath, 'w') as f: - f.write('baz') - - cu.compare_files(spath, dpath, hasher_cls, raise_if_comparison_fails) - - -def test_SessionUploadSchema(tmpdir): - src_file = Path(tmpdir) / 'src.csv' - src_file.touch() - - dst_file = Path(tmpdir) / 'dst.csv' - - output_json = Path(tmpdir) / 'output.json' - - test_data = { - 'files': [{ - 'source': str(src_file), - 'destination': str(dst_file), - 'key': '' - }], - 'output_json': str(output_json) - } - - parser = argschema.ArgSchemaParser( - test_data, - schema_type=SessionUploadInputSchema, - output_schema_type=SessionUploadOutputSchema, - args=[] - ) - - # Mocking the functionality of the main method - shutil.copy(src_file, dst_file) - parser.output({'files': test_data['files']}) diff --git a/allensdk/test/brain_observatory/ecephys/test_current_source_density.py b/allensdk/test/brain_observatory/ecephys/test_current_source_density.py deleted file mode 100644 index 160b263884..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_current_source_density.py +++ /dev/null @@ -1,267 +0,0 @@ -import pytest -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.ecephys.current_source_density import _current_source_density as csd -from allensdk.brain_observatory.ecephys.current_source_density import _interpolation_utils as interp_utils -from allensdk.brain_observatory.ecephys.current_source_density import _filter_utils as filt_utils - - -@pytest.fixture -def stim_table(): - return pd.DataFrame({ - 'Start': [0, 1, 2, 3, 4, 5, 6], - 'End': [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], - 'alpha': [None, -1, -2, -3, -4, -5, -6], - 'stimulus_name': [None, 'a', 'a', 'a', 'b', 'b', 'a'], - 'stimulus_index': [None, 0, 0, 0, 1, 1, 2] - }) - - -# ------------ _current_source_density.py ------------ -@pytest.mark.parametrize('stim_index', [0, None]) -def test_extract_trial_windows(stim_table, stim_index): - - stim_name = 'a' - time_step = 0.1 - pre_stim_time = 0.2 - post_stim_time = 0.3 - num_trials = 2 - - expected = [ - [0.8, 0.9, 1.0, 1.1, 1.2], - [1.8, 1.9, 2.0, 2.1, 2.2] - ] - exp_rel = [-0.2, -0.1, 0.0, 0.1, 0.2] - - obtained, obt_rel = csd.extract_trial_windows( - stim_table, stim_name, time_step, pre_stim_time, - post_stim_time, num_trials, stim_index - ) - - assert np.allclose(obtained, expected) - assert np.allclose(obt_rel, exp_rel) - - -@pytest.mark.parametrize('times,raw,channels,windows,volts_per_bit,expected', [ - [ - np.arange(10), - np.arange(50).reshape([10, 5]), - [1, 3], - [[5.5, 6], [7, 8]], - 1.0, - [ - # data are rounded to int - [[28, 31], [30, 33]], - [[36, 41], [38, 43]] - ] - ], - [ - np.arange(10), - np.arange(50).reshape([10, 5]), - [1, 3], - [[5.5, 6], [7, 8]], - 0.5, - [ - # volts_per_bit scaling may result in floats - [[14, 15.5], [15, 16.5]], - [[18, 20.5], [19, 21.5]] - ] - ] -]) -def test_accumulate_lfp_data(times, raw, channels, windows, volts_per_bit, - expected): - obtained = csd.accumulate_lfp_data(times, raw, channels, - windows, volts_per_bit) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize('trial_mean_accumulated,spacing,expected,expected_channels', [ - [ - np.nanmean(np.arange(36).reshape([2, 6, 3]) ** 3, axis=0), - 1.0, - [[1728., 1926., 2142.], - [648., 702., 756.], - [810., 864., 918.], - [972., 1026., 1080.], - [1134., 1188., 1242.], - [-5292., -5706., -6138.]], - np.arange(6) - ] -]) -def test_compute_csd(trial_mean_accumulated, spacing, expected, expected_channels): - - obtained, obtained_channels = csd.compute_csd(trial_mean_accumulated, spacing=spacing) - - assert np.allclose(obtained, expected) - assert np.allclose(obtained_channels, expected_channels) - - -# ------------ _interpolation_utils.py ------------ -@pytest.mark.parametrize('min_chan, max_chan, expected', [ - [ - # min_chan - 0, - # max_chan - 4, - # expected actual channel locations - [[16, 0], [48, 0], [0, 20], [32, 20]] - ], - [ - 2, - 6, - [[0, 20], [32, 20], [16, 40], [48, 40]] - ], - [ - 0, - 8, - [[16, 0], [48, 0], [0, 20], [32, 20], - [16, 40], [48, 40], [0, 60], [32, 60]] - ], - [ - 4, - 8, - [[16, 40], [48, 40], [0, 60], [32, 60]] - ], - [ - 5, - 6, - [[48, 40]] - ] - -]) -def test_make_actual_channel_locations(min_chan, max_chan, expected): - obtained = interp_utils.make_actual_channel_locations(min_chan=min_chan, - max_chan=max_chan) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize('min_chan, max_chan, expected', [ - [ - # min_chan - 0, - # max_chan - 7, - # expected interpolated channel locations - [[24, 0], [24, 10], [24, 20], [24, 30], [24, 40], [24, 50], [24, 60]] - ], - [ - 0, - 14, - [[24, 0], [24, 10], [24, 20], [24, 30], [24, 40], [24, 50], [24, 60], - [24, 70], [24, 80], [24, 90], [24, 100], [24, 110], [24, 120], [24, 130]] - ], - [ - 2, - 6, - [[24, 20], [24, 30], [24, 40], [24, 50]] - ], - [ - 7, - 14, - [[24, 70], [24, 80], [24, 90], [24, 100], [24, 110], [24, 120], [24, 130]] - ], - [ - 8, - 9, - [[24, 80]] - ] -]) -def test_make_interp_channel_locations(min_chan, max_chan, expected): - obtained = interp_utils.make_interp_channel_locations(min_chan=min_chan, - max_chan=max_chan) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize('lfp, actual_locs, interp_locs, expected', [ - [ - # lfp - np.arange(36).reshape([2, 6, 3]) ** 3, - # actual_locs - interp_utils.make_actual_channel_locations(0, 6), - # interp_locs - interp_utils.make_interp_channel_locations(0, 6), - # expected (interp_lfp, spacing) - ([[[-1.48688877e+01, -1.65987508e+00, 2.25788198e+01], - [1.84977651e+02, 3.01621496e+02, 4.52968522e+02], - [5.82039685e+02, 8.18476063e+02, 1.11005335e+03], - [1.23712914e+03, 1.61285986e+03, 2.05929375e+03], - [2.03821497e+03, 2.56276850e+03, 3.17035171e+03], - [0.00000000e+00, 0.00000000e+00, 0.00000000e+00]], - - [[6.80643377e+03, 7.93617702e+03, 9.18494994e+03], - [1.24901530e+04, 1.41494541e+04, 1.59514583e+04], - [1.81704531e+04, 2.03174258e+04, 2.26275394e+04], - [2.37138688e+04, 2.62802568e+04, 2.90253479e+04], - [2.90797202e+04, 3.20168080e+04, 3.51449255e+04], - [0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]], 0.01) - ] -]) -def test_interp_channel_locs(lfp, actual_locs, interp_locs, expected): - obtained = interp_utils.interp_channel_locs(lfp=lfp, - actual_locs=actual_locs, - interp_locs=interp_locs) - - obtained_interp_lfp, obtained_spacing = obtained - expected_interp_lfp, expected_spacing = expected - - assert np.allclose(obtained_interp_lfp, expected_interp_lfp) - assert obtained_spacing == expected_spacing - - -# ------------ _filter_utils.py ------------ -@pytest.mark.parametrize('lfp, ref_channels, noisy_thresh, expected', [ - [ - # lfp arrays in the form of: trials x channel x time samples - # channel 1 should be marked as 'noisy' and 2 should be removed - # for being a reference - np.array([[[0.1, 0.1, 0.1, 0.1], [0, 50, 500, 5000], [0, 0, 0, 0], [0.3, 0.3, 0.3, 0.3]], - [[0.15, 0.15, 0.15, 0.15], [0, 10, 100, 1000], [0, 0, 0, 0], [0.25, 0.25, 0.25, 0.25]], - [[0.2, 0.2, 0.2, 0.2], [0, 0, 0, 0], [0, 0, 0, 0], [0.2, 0.2, 0.2, 0.2]]]), - # reference channels - [2], - # noisy_channel_threshold - 2.0, - # expected output (cleaned_lfp, good_indices) - (np.array([[[0.1, 0.1, 0.1, 0.1], [0.3, 0.3, 0.3, 0.3]], - [[0.15, 0.15, 0.15, 0.15], [0.25, 0.25, 0.25, 0.25]], - [[0.2, 0.2, 0.2, 0.2], [0.2, 0.2, 0.2, 0.2]]]), - np.array([0, 3])) - ] -]) -def test_select_good_channels(lfp, ref_channels, noisy_thresh, expected): - obtained = filt_utils.select_good_channels(lfp, - ref_channels, - noisy_thresh) - obtained_cleaned, obtained_good_inds = obtained - assert np.allclose(obtained_cleaned, expected[0]) - assert np.allclose(obtained_good_inds, expected[1]) - - -@pytest.mark.parametrize('lfp, sampling_rate, filter_cuts, filter_order, expected', [ - [ - # lfp - np.arange(30).reshape([1, 3, 10]), - # sampling_rate - 1000, - # filter_cuts - [5.0, 150.0], - # filter_order - 1, - # expected output - [[[-8.03033681, -7.51102701, -7.00015769, -6.49716665, -6.00149202, - -5.51257727, -5.02987273, -4.55283625, -4.08093445, -3.61364687], - [-8.03033681, -7.51102701, -7.00015769, -6.49716665, -6.00149202, - -5.51257727, -5.02987273, -4.55283625, -4.08093445, -3.61364687], - [-8.03033681, -7.51102701, -7.00015769, -6.49716665, -6.00149202, - -5.51257727, -5.02987273, -4.55283625, -4.08093445, -3.61364687]]] - - ] - -]) -def test_filter_lfp_channels(lfp, sampling_rate, filter_cuts, filter_order, expected): - obtained = filt_utils.filter_lfp_channels(lfp, - sampling_rate, - filter_cuts, - filter_order) - assert np.allclose(obtained, expected) diff --git a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_cache.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_cache.py deleted file mode 100644 index def086af8e..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_cache.py +++ /dev/null @@ -1,512 +0,0 @@ -import os -import collections -from datetime import datetime - -import pytest -import pandas as pd -import numpy as np -import SimpleITK as sitk -import pynwb - -import allensdk.brain_observatory.ecephys.ecephys_project_cache as epc -from allensdk.core.authentication import DbCredentials -import allensdk.brain_observatory.ecephys.write_nwb.__main__ as write_nwb -from allensdk.brain_observatory.ecephys.ecephys_project_api.http_engine import ( - write_from_stream, write_bytes_from_coroutine, AsyncHttpEngine, HttpEngine, - DEFAULT_TIMEOUT as HTTP_ENGINE_DEFAULT_TIMEOUT -) - -mock_lims_credentials = DbCredentials(dbname='mock_lims', user='mock_user', - host='mock_host', port='mock_port', - password='mock') - - -@pytest.fixture -def raw_sessions(): - return pd.DataFrame({ - 'session_type': ['stimulus_set_one', 'stimulus_set_two', 'stimulus_set_two'], - "unit_count": [500, 1000, 1500], - "channel_count": [40, 90, 140], - "probe_count": [3, 4, 5], - "structure_acronyms": [["a", "v"], ["a", "c"], ["b"]] - }, index=pd.Series(name='id', data=[1, 2, 3])) - - -@pytest.fixture -def sessions(): - return pd.DataFrame({ - 'session_type': ['stimulus_set_one', 'stimulus_set_two', 'stimulus_set_two'], - "unit_count": [500, 1000, 1500], - "channel_count": [40, 90, 140], - "probe_count": [3, 4, 5], - "ecephys_structure_acronyms": [["a", "v"], ["a", "c"], ["b"]] - }, index=pd.Series(name='id', data=[1, 2, 3])) - - -@pytest.fixture -def units(): - return pd.DataFrame({ - 'ecephys_channel_id': [2, 1], - 'snr': [1.5, 4.9], - "amplitude_cutoff": [0.05, 0.2], - "presence_ratio": [10, 20], - "isi_violations": [0.3, 0.4], - "quality": ["good", "noise"] - }, index=pd.Series(name='id', data=[1, 2])) - - -@pytest.fixture -def analysis_metrics(): - return pd.DataFrame({ - "a": [0, 1, 2], - "b": [3, 4, 5] - }, index=pd.Index(name="ecephys_unit_id", data=[1, 2, 3])) - - -@pytest.fixture -def channels(): - return pd.DataFrame({ - 'ecephys_probe_id': [11, 11], - 'ap': [1000, 2000], - "unit_count": [5, 10], - "ecephys_structure_acronym": ["a", "b"] - }, index=pd.Series(name='id', data=[1, 2])) - - -@pytest.fixture -def raw_probes(): - return pd.DataFrame({ - 'ecephys_session_id': [3], - "unit_count": [50], - "channel_count": [10], - "lfp_temporal_subsampling_factor": [2.0], - "lfp_sampling_rate": [1000.0], - }, index=pd.Series(name='id', data=[11])) - - -@pytest.fixture -def probes(): - return pd.DataFrame({ - 'ecephys_session_id': [3], - "unit_count": [50], - "channel_count": [10], - "lfp_temporal_subsampling_factor": [2.0], - "lfp_sampling_rate": [500.0], - }, index=pd.Series(name='id', data=[11])) - - -@pytest.fixture -def annotated_probes(probes, sessions): - return pd.merge(probes, sessions, left_on="ecephys_session_id", right_index=True, suffixes=["_probe", "_session"]) - - -@pytest.fixture -def annotated_channels(channels, annotated_probes): - return pd.merge(channels, annotated_probes, left_on="ecephys_probe_id", right_index=True, suffixes=["_channel", "_probe"]) - - -@pytest.fixture -def annotated_units(units, annotated_channels): - return pd.merge(units, annotated_channels, left_on="ecephys_channel_id", right_index=True, suffixes=["_unit", "_channel"]) - - -@pytest.fixture -def shared_tmpdir(tmpdir_factory): - return str(tmpdir_factory.mktemp('test_ecephys_project_cache')) - - -class MockEngine: - def __init__(self): - self.write_bytes = write_from_stream - - -@pytest.fixture -def mock_api(shared_tmpdir, raw_sessions, units, channels, raw_probes, analysis_metrics): - class MockApi: - - def __init__(self, **kwargs): - self.accesses = collections.defaultdict(lambda: 1) - self.rma_engine = MockEngine() - - def __getattr__(self, name): - self.accesses[name] += 1 - - def get_sessions(self, **kwargs): - return raw_sessions - - def get_units(self, **kwargs): - return units - - def get_channels(self, **kwargs): - return channels - - def get_probes(self, **kwargs): - return raw_probes - - def get_session_data(self, session_id, **kwargs): - path = os.path.join(shared_tmpdir, 'tmp.nwb') - - nwbfile = pynwb.NWBFile( - session_description='EcephysSession', - identifier=f"{session_id}", - session_start_time=datetime.now() - ) - - write_nwb.add_probe_to_nwbfile(nwbfile, 11, sampling_rate=1.0, - lfp_sampling_rate=2.0, - has_lfp_data=True, - name="Test Probe") - - with pynwb.NWBHDF5IO(path, "w") as io: - io.write(nwbfile) - - return open(path, 'rb') - - def get_probe_lfp_data(self, probe_id): - path = os.path.join(shared_tmpdir, f"probe_{probe_id}.nwb") - - nwbfile = pynwb.NWBFile( - session_description='EcephysProbe', - identifier=f"{probe_id}", - session_start_time=datetime.now() - ) - - with pynwb.NWBHDF5IO(path, "w") as io: - io.write(nwbfile) - - return open(path, 'rb') - - def get_natural_scene_template(self, number): - path = os.path.join(shared_tmpdir, "tmp.tiff") - img = sitk.GetImageFromArray(np.eye(100, dtype=np.uint8)) - sitk.WriteImage(img, path) - return open(path, "rb") - - def get_natural_movie_template(self, number): - path = os.path.join(shared_tmpdir, "tmp.npy") - np.save(path, np.eye(100)) - return open(path, "rb") - - def get_unit_analysis_metrics(self, *a, **k): - return analysis_metrics - - return MockApi - - -@pytest.fixture -def tmpdir_cache(shared_tmpdir, mock_api): - - man_path = os.path.join(shared_tmpdir, 'manifest.json') - - return epc.EcephysProjectCache( - fetch_api=mock_api(), - manifest=man_path - ) - - -def lazy_cache_test(cache, cache_name, api_name, expected, *args, **kwargs): - obtained_one = getattr(cache, cache_name)(*args, **kwargs) - obtained_two = getattr(cache, cache_name)(*args, **kwargs) - - pd.testing.assert_frame_equal(expected, obtained_one) - pd.testing.assert_frame_equal(expected, obtained_two) - - assert 1 == cache.fetch_api.accesses[api_name] - - -def test_get_sessions(tmpdir_cache, sessions): - lazy_cache_test(tmpdir_cache, '_get_sessions', "get_sessions", sessions) - - -@pytest.mark.parametrize("filter_by_validity", [False, True]) -def test_get_units(tmpdir_cache, units, filter_by_validity): - if filter_by_validity: - units = units[units["quality"] == "good"].drop(columns="quality") - lazy_cache_test(tmpdir_cache, '_get_units', "get_units", units, filter_by_validity=filter_by_validity) - else: - units = units[units["amplitude_cutoff"] <= 0.1] - lazy_cache_test(tmpdir_cache, '_get_units', "get_units", units, filter_by_validity=filter_by_validity) - - -def test_get_probes(tmpdir_cache, probes): - lazy_cache_test(tmpdir_cache, '_get_probes', "get_probes", probes) - - -def test_get_channels(tmpdir_cache, channels): - lazy_cache_test(tmpdir_cache, '_get_channels', "get_channels", channels) - - -def test_get_annotated_probes(tmpdir_cache, probes, annotated_probes): - lazy_cache_test(tmpdir_cache, "_get_annotated_probes", "get_probes", annotated_probes) - - -def test_get_annotated_channels(tmpdir_cache, channels, annotated_channels): - lazy_cache_test(tmpdir_cache, "_get_annotated_channels", "get_channels", annotated_channels) - - -def test_get_annotated_units(tmpdir_cache, units, annotated_units): - annotated_units = annotated_units[annotated_units["amplitude_cutoff"] < 0.1] - - lazy_cache_test(tmpdir_cache, "_get_annotated_units", "get_units", annotated_units, filter_by_validity=False) - - -def test_get_session_data(shared_tmpdir, tmpdir_cache): - - sid = 12345 - - data_one = tmpdir_cache.get_session_data(sid) - - assert 1 == tmpdir_cache.fetch_api.accesses['get_session_data'] - assert os.path.join(shared_tmpdir, f"session_{sid}", f"session_{sid}.nwb") == data_one.api.path - - -def test_get_natural_scene_template(shared_tmpdir, tmpdir_cache): - num = 10 - - data_one = tmpdir_cache.get_natural_scene_template(num) - - assert 1 == tmpdir_cache.fetch_api.accesses["get_natural_scene_template"] - assert np.allclose(np.eye(100), data_one) - - -def test_get_natural_movie_template(shared_tmpdir, tmpdir_cache): - num = 10 - - data_one = tmpdir_cache.get_natural_movie_template(num) - - assert 1 == tmpdir_cache.fetch_api.accesses["get_natural_movie_template"] - assert np.allclose(np.eye(100), data_one) - - -def test_get_unit_analysis_metrics_for_session(tmpdir_cache, analysis_metrics): - lazy_cache_test( - tmpdir_cache, - 'get_unit_analysis_metrics_for_session', - "get_unit_analysis_metrics", - analysis_metrics, - session_id=3, - annotate=False - ) - - -def test_get_unit_analysis_metrics_by_session_type(tmpdir_cache, analysis_metrics): - lazy_cache_test( - tmpdir_cache, - 'get_unit_analysis_metrics_by_session_type', - "get_unit_analysis_metrics", - analysis_metrics, - session_type="stimulus_set_two", - annotate=False - ) - - -def test_get_session_data_eventual_success(tmpdir_factory, mock_api): - man_path = os.path.join( - tmpdir_factory.mktemp("get_session_data"), - "manifest.json" - ) - - class InitiallyFailingApi(mock_api): - def get_session_data(self, session_id, **kwargs): - if self.accesses["get_session_data"] < 1: - raise ValueError("bad news!") - return super(InitiallyFailingApi, self).get_session_data(session_id, **kwargs) - - api = InitiallyFailingApi() - cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) - - sid = 12345 - session = cache.get_session_data(sid) - assert session.ecephys_session_id == sid - - -def test_get_session_data_continual_failure(tmpdir_factory, mock_api): - man_path = os.path.join( - tmpdir_factory.mktemp("get_session_data"), - "manifest.json" - ) - - class ContinuallyFailingApi(mock_api): - def get_session_data(self, session_id, **kwargs): - raise ValueError("bad news!") - - api = ContinuallyFailingApi() - cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) - - sid = 12345 - with pytest.raises(ValueError): - _ = cache.get_session_data(sid) - - -def test_get_probe_lfp_data(tmpdir_factory, mock_api): - man_path = os.path.join( - tmpdir_factory.mktemp("get_lfp_data"), - "manifest.json" - ) - - class InitiallyFailingApi(mock_api): - def get_probe_lfp_data(self, probe_id, **kwargs): - if self.accesses["get_probe_data"] < 1: - raise ValueError("bad news!") - return super(InitiallyFailingApi, self).get_probe_lfp_data(probe_id, **kwargs) - - api = InitiallyFailingApi() - cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) - - sid = 3 - pid = 11 - - session = cache.get_session_data(sid) - lfp_file = session.api._probe_nwbfile(pid) - - assert str(pid) == lfp_file.identifier - - -def test_get_probe_lfp_data_continually_failing(tmpdir_factory, mock_api): - man_path = os.path.join( - tmpdir_factory.mktemp("get_lfp_data"), - "manifest.json" - ) - - class ContinuallyFailingApi(mock_api): - def get_probe_lfp_data(self, probe_id, **kwargs): - if True: - raise ValueError("bad news!") - - api = ContinuallyFailingApi() - cache = epc.EcephysProjectCache(manifest=man_path, fetch_api=api) - - sid = 3 - pid = 11 - - with pytest.raises(ValueError): - session = cache.get_session_data(sid) - _ = session.api._probe_nwbfile(pid) - - -def test_from_lims_default(tmpdir_factory): - tmpdir = str(tmpdir_factory.mktemp("test_from_lims_default")) - - cache = epc.EcephysProjectCache.from_lims( - manifest=os.path.join(tmpdir, "manifest.json"), - lims_credentials=mock_lims_credentials - ) - assert isinstance(cache.fetch_api.app_engine, HttpEngine) - assert cache.stream_writer is write_from_stream - assert cache.fetch_api.app_engine.scheme == "http" - assert cache.fetch_api.app_engine.host == "lims2" - - -def test_from_warehouse_default(tmpdir_factory): - tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) - - cache = epc.EcephysProjectCache.from_warehouse( - manifest=os.path.join(tmpdir, "manifest.json") - ) - assert isinstance(cache.fetch_api.rma_engine, HttpEngine) - assert cache.stream_writer is write_from_stream - assert cache.fetch_api.rma_engine.scheme == "http" - assert cache.fetch_api.rma_engine.host == "api.brain-map.org" - - -def test_init_default(tmpdir_factory): - tmpdir = str(tmpdir_factory.mktemp("test_init_default")) - cache = epc.EcephysProjectCache( - manifest=os.path.join(tmpdir, "manifest.json") - ) - assert isinstance(cache.fetch_api.rma_engine, HttpEngine) - assert cache.stream_writer is cache.fetch_api.rma_engine.write_bytes - assert cache.fetch_api.rma_engine.scheme == "http" - assert cache.fetch_api.rma_engine.host == "api.brain-map.org" - - -@pytest.mark.parametrize( - ("cache_constructor, asynchronous, engine_attr, expected_engine," - "expected_scheme, expected_host, expected_stream_writer"), [ - ( - epc.EcephysProjectCache.from_lims, True, - "app_engine", AsyncHttpEngine, "http", "lims2", - write_bytes_from_coroutine - ), - ( - epc.EcephysProjectCache.from_lims, False, - "app_engine", HttpEngine, "http", "lims2", - write_from_stream - ) - ]) -def test_stream_asynchronous_arg_from_lims( - cache_constructor, asynchronous, engine_attr, expected_engine, - expected_scheme, expected_host, expected_stream_writer, - tmpdir_factory): - """ Ensure the proper stream engine is chosen from the `asynchronous` - argument in the EcephysProjectCache constructors (using other default - values).""" - tmpdir = str(tmpdir_factory.mktemp("test_stream_async_args")) - cache = cache_constructor( - asynchronous=asynchronous, - manifest=os.path.join(tmpdir, "manifest.json"), - lims_credentials=mock_lims_credentials) - engine = getattr(cache.fetch_api, engine_attr) - assert isinstance(engine, expected_engine) - assert cache.stream_writer is expected_stream_writer - assert engine.scheme == expected_scheme - assert engine.host == expected_host - - -@pytest.mark.parametrize( - ("cache_constructor, asynchronous, engine_attr, expected_engine," - "expected_scheme, expected_host, expected_stream_writer"), [ - ( - epc.EcephysProjectCache.from_warehouse, True, - "rma_engine", AsyncHttpEngine, "http", "api.brain-map.org", - write_bytes_from_coroutine - ), - ( - epc.EcephysProjectCache.from_warehouse, False, - "rma_engine", HttpEngine, "http", "api.brain-map.org", - write_from_stream - ) - ]) -def test_stream_asynchronous_arg_from_warehouse( - cache_constructor, asynchronous, engine_attr, expected_engine, - expected_scheme, expected_host, expected_stream_writer, - tmpdir_factory): - """ Ensure the proper stream engine is chosen from the `asynchronous` - argument in the EcephysProjectCache constructors (using other default - values).""" - tmpdir = str(tmpdir_factory.mktemp("test_stream_async_args")) - cache = cache_constructor( - asynchronous=asynchronous, - manifest=os.path.join(tmpdir, "manifest.json") - ) - engine = getattr(cache.fetch_api, engine_attr) - assert isinstance(engine, expected_engine) - assert cache.stream_writer is expected_stream_writer - assert engine.scheme == expected_scheme - assert engine.host == expected_host - - -def test_stream_writer_method_default_correct(tmpdir_factory): - """Checks that the stream_writer contained in the rma engine is used - when one is not supplied to the __init__ method. - """ - tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) - manifest = os.path.join(tmpdir, "manifest.json") - cache = epc.EcephysProjectCache(stream_writer=None, manifest=manifest) - assert cache.stream_writer == cache.fetch_api.rma_engine.write_bytes - -def test_default_timeout_from_warehouse(tmpdir_factory): - tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) - cache = epc.EcephysProjectCache.from_warehouse( - manifest=os.path.join(tmpdir, "manifest.json") - ) - assert cache.fetch_api.rma_engine.timeout == HTTP_ENGINE_DEFAULT_TIMEOUT - -def test_user_provided_timeout_from_warehouse(tmpdir_factory): - user_provided_timeout = 3 - tmpdir = str(tmpdir_factory.mktemp("test_from_warehouse_default")) - cache = epc.EcephysProjectCache.from_warehouse( - manifest=os.path.join(tmpdir, "manifest.json"), - timeout = user_provided_timeout - ) - assert cache.fetch_api.rma_engine.timeout == user_provided_timeout diff --git a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py deleted file mode 100644 index 7a5f60af92..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest - -from allensdk.brain_observatory.ecephys.ecephys_project_api import EcephysProjectFixedApi, MissingDataError - - -def test_get_sessions(): - api = EcephysProjectFixedApi() - with pytest.raises(MissingDataError) as err: - api.get_sessions() - - -def test_get_session_data(): - api = EcephysProjectFixedApi() - with pytest.raises(MissingDataError) as err: - api.get_session_data(12345) - assert re.compile("12345").search(err.message) is not None \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py deleted file mode 100644 index bb718ec574..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py +++ /dev/null @@ -1,227 +0,0 @@ -import os -import re -from unittest import mock - -import pytest -import pandas as pd -import numpy as np - -from allensdk.core.authentication import DbCredentials -from allensdk.brain_observatory.ecephys.ecephys_project_api import ( - ecephys_project_lims_api as epla, -) - -mock_lims_credentials = DbCredentials(dbname='mock_lims', user='mock_user', - host='mock_host', port='mock_port', - password='mock') - - -class MockSelector: - - def __init__(self, checks, response): - self.checks = checks - self.response = response - - def __call__(self, query, *args, **kwargs): - self.passed = {} - self.query = query - for name, check in self.checks.items(): - self.passed[name] = check(query) - return self.response - - -@pytest.mark.parametrize("method_name,kwargs,response,checks,expected", [ - [ - "get_units", - {}, - pd.DataFrame({"id": [5, 6], "something": [12, 14]}), - { - "no_pa_check": lambda st: "published_at" not in st - }, - pd.DataFrame( - {"something": [12, 14]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_units", - {"session_ids": [1, 2, 3]}, - pd.DataFrame({"id": [5, 6], "something": [12, 14]}), - { - "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"something": [12, 14]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_units", - {"unit_ids": [1, 2, 3]}, - pd.DataFrame({"id": [5, 6], "something": [12, 14]}), - { - "filters_units": lambda st: re.compile(r".+and eu.id in \(1,2,3\).*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"something": [12, 14]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_units", - {"channel_ids": [1, 2, 3], "probe_ids": [4, 5, 6]}, - pd.DataFrame({"id": [5, 6], "something": [12, 14]}), - { - "filters_channels": lambda st: re.compile(r".+and ec.id in \(1,2,3\).*", re.DOTALL).match(st) is not None, - "filters_probes": lambda st: re.compile(r".+and ep.id in \(4,5,6\).*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"something": [12, 14]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_units", - {"published_at": "2019-10-22"}, - pd.DataFrame({"id": [5, 6], "something": [12, 14]}), - { - "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, - "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"something": [12, 14]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_channels", - {"published_at": "2019-10-22", "session_ids": [1, 2, 3]}, - pd.DataFrame({"id": [5, 6], "something": [12, 14]}), - { - "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, - "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None, - "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"something": [12, 14]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_probes", - {"published_at": "2019-10-22", "session_ids": [1, 2, 3]}, - pd.DataFrame({"id": [5, 6], "something": [12, 14]}), - { - "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, - "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None, - "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"something": [12, 14]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_sessions", - {"published_at": "2019-10-22", "session_ids": [1, 2, 3]}, - pd.DataFrame({"id": [5, 6], "something": [12, 14], "genotype": ["foo", np.nan]}), - { - "checks_pa_not_null": lambda st: re.compile(r".+and es.published_at is not null.*", re.DOTALL).match(st) is not None, - "checks_pa": lambda st: re.compile(r".+and es.published_at <= '2019-10-22'.*", re.DOTALL).match(st) is not None, - "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"something": [12, 14], "genotype": ["foo", "wt"]}, - index=pd.Index(name="id", data=[5, 6]) - ) - ], - [ - "get_unit_analysis_metrics", - {"ecephys_session_ids": [1, 2, 3]}, - pd.DataFrame({"id": [5, 6], "data": [{"a": 1, "b": 2}, {"a": 3, "b": 4}], "ecephys_unit_id": [10, 11]}), - { - "filters_sessions": lambda st: re.compile(r".+and es.id in \(1,2,3\).*", re.DOTALL).match(st) is not None - }, - pd.DataFrame( - {"id": [5, 6], "a": [1, 3], "b": [2, 4]}, - index=pd.Index(name="iecephys_unit_id", data=[10, 11]) - ) - ] -]) -def test_pg_query(method_name, kwargs, response, checks, expected): - - selector = MockSelector(checks, response) - - with mock.patch("allensdk.internal.api.psycopg2_select", new=selector) as ptc: - api = epla.EcephysProjectLimsApi.default(lims_credentials=mock_lims_credentials) - obtained = getattr(api, method_name)(**kwargs) - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - any_checks_failed = False - for name, result in ptc.passed.items(): - if not result: - print(f"check {name} failed") - any_checks_failed = True - - if any_checks_failed: - print(ptc.query) - assert not any_checks_failed - - -WKF_ID = 12345 -class MockPgEngine: - - def __init__(self, query_pattern): - self.query_pattern = query_pattern - - -class MockTemplatePgEngine(MockPgEngine): - - def select_one(self, rendered): - assert self.query_pattern.match(rendered) is not None - return {"well_known_file_id": WKF_ID} - - -class MockDataPgEngine(MockPgEngine): - def select(self, rendered): - assert self.query_pattern.match(rendered) is not None - return pd.DataFrame({"id": [WKF_ID]}) - - -class MockHttpEngine: - def stream(self, url): - assert url == f"well_known_files/download/{WKF_ID}?wkf_id={WKF_ID}" - - -@pytest.mark.parametrize("method,kwargs,query_pattern,pg_engine_cls", [ - [ - "get_natural_movie_template", - {"number": 12}, - re.compile(".+st.name = 'natural_movie_12'.+", re.DOTALL), - MockTemplatePgEngine - ], - [ - "get_natural_scene_template", - {"number": 12}, - re.compile(".+st.name = 'natural_scene_12'.+", re.DOTALL), - MockTemplatePgEngine - ], - [ - "get_probe_lfp_data", - {"probe_id": 53}, - re.compile(r".+and earp.ecephys_probe_id = 53.+", re.DOTALL), - MockDataPgEngine - ], - [ - "get_session_data", - {"session_id": 53}, - re.compile(r".+and ear.ecephys_session_id = 53.+", re.DOTALL), - MockDataPgEngine - ] -]) -def test_file_getter(method, kwargs, query_pattern, pg_engine_cls): - - api = epla.EcephysProjectLimsApi( - postgres_engine=pg_engine_cls(query_pattern), app_engine=MockHttpEngine() - ) - getattr(api, method)(**kwargs) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py deleted file mode 100644 index 1982d83868..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py +++ /dev/null @@ -1,73 +0,0 @@ -import pytest - -from allensdk.brain_observatory.ecephys.ecephys_project_api import ecephys_project_warehouse_api as epwa - -@pytest.mark.skipif(True, reason="broken test") -@pytest.mark.parametrize( - "method,conditions,expected_query", - [ - [ - "get_sessions", - {}, - ( - "criteria=model::EcephysSession" - ), - ], - [ - "get_sessions", - {"session_ids": [779839471, 759228117]}, - ( - "criteria=model::EcephysSession,rma::criteria[id$in779839471,759228117]" - ), - ], - [ - "get_sessions", - {"session_ids": [779839471, 759228117], "has_eye_tracking": True}, - ( - "criteria=model::EcephysSession,rma::criteria[id$in779839471,759228117][fail_eye_tracking$eqfalse]" - ), - ], - [ - "get_sessions", - {"session_ids": [779839471, 759228117], "has_eye_tracking": True, "stimulus_names": ["foo", "bar"]}, - ( - "criteria=model::EcephysSession,rma::criteria[id$in779839471,759228117][fail_eye_tracking$eqfalse][stimulus_name$in'foo','bar']" - ), - ], - [ - "get_probes", - {"session_ids": [797828357, 774875821], "probe_ids": [805579741, 792602660]}, - ( - "criteria=model::EcephysProbe,rma::criteria[id$in805579741,792602660][ecephys_session_id$in797828357,774875821]" - ), - ], - [ - "get_channels", - {"session_ids": [746083955], "probe_ids": [760647913], "channel_ids": [849734900]}, - ( - "criteria=model::EcephysChannel,rma::criteria[id$in849734900][ecephys_probe_id$in760647913],rma::criteria,ecephys_probe[ecephys_session_id$in746083955]" - ), - ], - [ - "get_units", - {"session_ids": [779839471], "probe_ids": [792645497], "channel_ids": [849709694], "unit_ids": [849710462]}, - ( - "criteria=model::EcephysUnit," - "rma::criteria[id$in849710462]," - "rma::criteria[ecephys_channel_id$in849709694]," - "rma::criteria,ecephys_channel(ecephys_probe[id$in792645497])," - "rma::criteria,ecephys_channel(ecephys_probe(ecephys_session[id$in779839471]))" - ), - ], - ], -) -def test_query(method, conditions, expected_query): - class MockRmaEngine: - def get_rma_tabular(self, rendered): - print(expected_query) - print(rendered) - assert expected_query == rendered - return [] - - api = epwa.EcephysProjectWarehouseApi(rma_engine=MockRmaEngine()) - results = getattr(api, method)(**conditions) diff --git a/allensdk/test/brain_observatory/ecephys/test_ecephys_session.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_session.py deleted file mode 100644 index 120a552f25..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_ecephys_session.py +++ /dev/null @@ -1,555 +0,0 @@ -import pytest -import pandas as pd -import numpy as np -import xarray as xr -import types - -from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysSessionApi -from allensdk.brain_observatory.ecephys.ecephys_session import EcephysSession, nan_intervals, build_spike_histogram - - -@pytest.fixture -def raw_stimulus_table(): - return pd.DataFrame({ - 'start_time': np.arange(4)/2, - 'stop_time':np.arange(1, 5)/2, - 'stimulus_name':['a', 'a', 'a', 'a_movie'], - 'stimulus_block':[0, 0, 0, 1], - 'TF': np.empty(4) * np.nan, - 'SF':np.empty(4) * np.nan, - 'Ori': np.empty(4) * np.nan, - 'Contrast': np.empty(4) * np.nan, - 'Pos_x': np.empty(4) * np.nan, - 'Pos_y': np.empty(4) * np.nan, - 'stimulus_index': [0, 0, 1, 1], - 'Color': np.arange(4)*5.5, - 'Image': np.empty(4) * np.nan, - 'Phase': np.linspace(0, 180, 4), - "texRes": np.ones([4]) - }, index=pd.Index(name='id', data=np.arange(4))) - -@pytest.fixture -def raw_invalid_times_table(): - return pd.DataFrame({ - "start_time": [0.3, 1.1, 1.6], - "stop_time": [0.6, 1.54, 2.3], - "tags": - [ - ["EcephysSession", "739448407", "stimulus"], - ["EcephysProbe", "123448407", "probeA"], - ["EcephysProbe", "123448407", "all_probes"], - ] - }) - - -@pytest.fixture -def raw_spike_times(): - return { - 0: np.array([5, 6, 7, 8]), - 1: np.array([2.5]), - 2: np.array([1.01, 1.03, 1.02]) - } - - - -@pytest.fixture -def raw_mean_waveforms(): - return { - 0: np.zeros((3, 20)), - 1: np.zeros((3, 20)) + 1, - 2: np.zeros((3, 20)) + 2 - } - - -@pytest.fixture -def raw_channels(): - return pd.DataFrame({ - 'local_index': [0, 1, 2], - 'probe_horizontal_position': [5, 10, 15], - 'probe_id': [0, 0, 0], - 'probe_vertical_position': [10, 22, 33], - 'valid_data': [False, True, True] - }, index=pd.Index(name='channel_id', data=[0, 1, 2])) - - -@pytest.fixture -def raw_units(): - return pd.DataFrame({ - 'firing_rate': np.linspace(1, 3, 3), - 'isi_violations': [40, 0.5, 0.1], - 'local_index': [0, 0, 1], - 'peak_channel_id': [2, 1, 0], - 'quality': ['good', 'good', 'noise'], - 'snr': [0.1, 1.4, 10.0], - 'on_screen_rf': [True, False, True], - 'p_value_rf': [0.001, 0.01, 0.05] - }, index=pd.Index(name='unit_id', data=np.arange(3)[::-1])) - - -@pytest.fixture -def raw_probes(): - return pd.DataFrame({ - 'description': ['probeA', 'probeB'], - 'location': ['VISp', 'VISam'], - 'sampling_rate': [30000.0, 30000.0] - }, index=pd.Index(name='id', data=[0, 1])) - - -@pytest.fixture -def raw_lfp(): - return { - 0: xr.DataArray( - data=np.array([[1, 2, 3, 4, 5], - [6, 7, 8, 9, 10]]), - dims=['channel', 'time'], - coords=[[2, 1], np.linspace(0, 2, 5)] - ) - } - -@pytest.fixture -def just_stimulus_table_api(raw_stimulus_table): - class EcephysJustStimulusTableApi(EcephysSessionApi): - def get_stimulus_presentations(self): - return raw_stimulus_table - def get_invalid_times(self): - return pd.DataFrame() - return EcephysJustStimulusTableApi() - - -@pytest.fixture -def channels_table_api(raw_channels, raw_probes, raw_lfp, raw_stimulus_table): - class EcephysChannelsTableApi(EcephysSessionApi): - def get_channels(self): - return raw_channels - def get_probes(self): - return raw_probes - def get_lfp(self, pid): - return raw_lfp[pid] - def get_stimulus_presentations(self): - return raw_stimulus_table - def get_invalid_times(self): - return pd.DataFrame() - - return EcephysChannelsTableApi() - - -@pytest.fixture -def lfp_masking_api(raw_channels, raw_probes, raw_lfp, raw_stimulus_table, raw_invalid_times_table): - class EcephysMaskInvalidLFPApi(EcephysSessionApi): - def get_channels(self): - return raw_channels - def get_probes(self): - return raw_probes - def get_lfp(self, pid): - return raw_lfp[pid] - def get_stimulus_presentations(self): - return raw_stimulus_table - def get_invalid_times(self): - return raw_invalid_times_table - return EcephysMaskInvalidLFPApi() - - -@pytest.fixture -def units_table_api(raw_channels, raw_units, raw_probes): - class EcephysUnitsTableApi(EcephysSessionApi): - def get_channels(self): - return raw_channels - def get_units(self): - return raw_units - def get_probes(self): - return raw_probes - return EcephysUnitsTableApi() - -@pytest.fixture -def valid_stimulus_table_api(raw_stimulus_table,raw_invalid_times_table): - class EcephysValidStimulusTableApi(EcephysSessionApi): - def get_invalid_times(self): - return raw_invalid_times_table - def get_stimulus_presentations(self): - return raw_stimulus_table - return EcephysValidStimulusTableApi() - - -@pytest.fixture -def mean_waveforms_api(raw_mean_waveforms, raw_channels, raw_units, raw_probes): - class EcephysMeanWaveformsApi(EcephysSessionApi): - def get_mean_waveforms(self): - return raw_mean_waveforms - def get_channels(self): - return raw_channels - def get_units(self): - return raw_units - def get_probes(self): - return raw_probes - return EcephysMeanWaveformsApi() - - -@pytest.fixture -def spike_times_api(raw_units, raw_channels, raw_probes, raw_stimulus_table, raw_spike_times): - class EcephysSpikeTimesApi(EcephysSessionApi): - def get_spike_times(self): - return raw_spike_times - def get_channels(self): - return raw_channels - def get_units(self): - return raw_units - def get_probes(self): - return raw_probes - def get_stimulus_presentations(self): - return raw_stimulus_table - - def get_invalid_times(self): - return pd.DataFrame() - - return EcephysSpikeTimesApi() - - -def get_no_spikes_times(self): - # A special method used for testing cases when there are no spikes for a given session, will be swapped out for - # get_spike_times() - return { - 0: np.array([]), - 1: np.array([]), - 2: np.array([]) - } - - -@pytest.fixture -def session_metadata_api(): - class EcephysSessionMetadataApi(EcephysSessionApi): - def get_ecephys_session_id(self): - return 12345 - return EcephysSessionMetadataApi() - - -def test_get_stimulus_epochs(just_stimulus_table_api): - - expected = pd.DataFrame({ - "start_time": [0, 3/2], - "stop_time": [3/2, 2], - "duration": [3/2, 1/2], - "stimulus_name": ["a", "a_movie"], - "stimulus_block": [0, 1] - }) - - session = EcephysSession(api=just_stimulus_table_api) - obtained = session.get_stimulus_epochs() - - print(expected) - print(obtained) - - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - -def test_get_invalid_times(valid_stimulus_table_api, raw_invalid_times_table): - - expected = raw_invalid_times_table - - session = EcephysSession(api=valid_stimulus_table_api) - - obtained = session.get_invalid_times() - - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - -def test_get_stimulus_presentations(valid_stimulus_table_api): - - expected = pd.DataFrame({ - "start_time": [0, 1/2, 1, 3/2], - "stop_time": [1/2, 1, 3/2, 2], - "stimulus_name": ['invalid_presentation', 'invalid_presentation', 'a', 'a_movie'], - "phase": [np.nan, np.nan, 120.0, 180.0] - }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3])) - - session = EcephysSession(api=valid_stimulus_table_api) - obtained = session.stimulus_presentations[["start_time", "stop_time", "stimulus_name", "phase"]] - - print(expected) - print(obtained) - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - -def test_get_stimulus_presentations_no_invalid_times(just_stimulus_table_api): - - expected = pd.DataFrame({ - "start_time": [0, 1/2, 1, 3/2], - "stop_time": [1/2, 1, 3/2, 2], - 'stimulus_name': ['a', 'a', 'a', 'a_movie'], - - }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3])) - - session = EcephysSession(api=just_stimulus_table_api) - - obtained = session.stimulus_presentations[["start_time", "stop_time", "stimulus_name"]] - print(expected) - print(obtained) - - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - -def test_session_metadata(session_metadata_api): - session = EcephysSession(api=session_metadata_api) - - assert 12345 == session.ecephys_session_id - - -def test_build_stimulus_presentations(just_stimulus_table_api): - expected_columns = [ - 'start_time', 'stop_time', 'stimulus_name', 'stimulus_block', - 'temporal_frequency', 'spatial_frequency', 'orientation', 'contrast', - 'x_position', 'y_position', 'color', 'frame', 'phase', 'duration', "stimulus_condition_id" - ] - - session = EcephysSession(api=just_stimulus_table_api) - obtained = session.stimulus_presentations - - print(obtained.head()) - print(obtained.columns) - - assert set(expected_columns) == set(obtained.columns) - assert 'stimulus_presentation_id' == obtained.index.name - assert 4 == obtained.shape[0] - - -def test_build_mean_waveforms(mean_waveforms_api): - session = EcephysSession(api=mean_waveforms_api) - obtained = session.mean_waveforms - - assert np.allclose(np.zeros((3, 20)) + 2, obtained[2]) - assert np.allclose(np.zeros((3, 20)) + 1, obtained[1]) - - -def test_build_units_table(units_table_api): - session = EcephysSession(api=units_table_api) - obtained = session.units - - assert 3 == session.num_units - assert np.allclose([10, 22, 33], obtained['probe_vertical_position']) - assert np.allclose([0, 1, 2], obtained.index.values) - assert np.allclose([0.05, 0.01, 0.001], obtained['p_value_rf'].values) - - -def test_presentationwise_spike_counts(spike_times_api): - session = EcephysSession(api=spike_times_api) - obtained = session.presentationwise_spike_counts(np.linspace(-.1, .1, 3), session.stimulus_presentations.index.values, session.units.index.values) - - first = obtained.loc[{'unit_id': 2, 'stimulus_presentation_id': 2}] - assert np.allclose([0, 3], first) - - second = obtained.loc[{'unit_id': 1, 'stimulus_presentation_id': 3}] - assert np.allclose([0, 0], second) - - assert np.allclose([4, 2, 3], obtained.shape) - - -@pytest.mark.parametrize("spike_times,time_domain,expected", [ - [ - {1: [1.5, 2.5]}, - [[1, 2, 3, 4], [1.1, 2.1, 3.1, 4.1]], - np.array([[1, 1, 0], [1, 1, 0]])[:, :, None] - ], - [ - {1: [1.5, 2.5]}, - [[1, 2, 3, 4], [1.6, 2.0, 4.0, 4.1]], - np.array([[1, 1, 0], [0, 1, 0]])[:, :, None] - ], - [ - {1: [1.5, 2.5], 2: [1.5, 2.5]}, - [[1, 2, 3, 4], [1.6, 2.0, 4.0, 4.1]], - np.stack(([[1, 1, 0], [0, 1, 0]], [[1, 1, 0], [0, 1, 0]]), axis=2) - ] -, - [ - {1: [1.5, 2.5], 2: [1.5, 1.55]}, - [[1, 2, 3, 4], [1.6, 2.0, 4.0, 4.1]], - np.stack(([[1, 1, 0], [0, 1, 0]], [[2, 0, 0], [0, 0, 0]]), axis=2) - ] -]) -@pytest.mark.parametrize("binarize", [True, False]) -def test_build_spike_histogram(spike_times, time_domain, expected, binarize): - - unit_ids = [k for k in spike_times.keys()] - obtained = build_spike_histogram(time_domain, spike_times, unit_ids, binarize=binarize) - - expected = np.array(expected) - if binarize: - expected[expected > 0] = 1 - - print(expected - obtained) - assert np.allclose(expected, obtained) - - -def test_presentationwise_spike_times(spike_times_api): - session = EcephysSession(api=spike_times_api) - obtained = session.presentationwise_spike_times(session.stimulus_presentations.index.values, session.units.index.values) - - expected = pd.DataFrame({ - 'unit_id': [2, 2, 2], - 'stimulus_presentation_id': [2, 2, 2, ], - 'time_since_stimulus_presentation_onset': [0.01, 0.02, 0.03] - }, index=pd.Index(name='spike_time', data=[1.01, 1.02, 1.03])) - - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - -def test_empty_presentationwise_spike_times(spike_times_api): - # Test that when there are no spikes presentationwise_spike_times doesn't fail and instead returns a empty dataframe - spike_times_api.get_spike_times = types.MethodType(get_no_spikes_times, spike_times_api) - session = EcephysSession(api=spike_times_api) - obtained = session.presentationwise_spike_times(session.stimulus_presentations.index.values, - session.units.index.values) - assert(isinstance(obtained, pd.DataFrame)) - assert(obtained.empty) - - -def test_conditionwise_spike_statistics(spike_times_api): - session = EcephysSession(api=spike_times_api) - obtained = session.conditionwise_spike_statistics(stimulus_presentation_ids=[0, 1, 2]) - - pd.set_option('display.max_columns', None) - - assert obtained.loc[(2, 2), "spike_count"] == 3 - assert obtained.loc[(2, 2), "stimulus_presentation_count"] == 1 - - -def test_conditionwise_spike_statistics_using_rates(spike_times_api): - session = EcephysSession(api=spike_times_api) - obtained = session.conditionwise_spike_statistics(stimulus_presentation_ids=[0, 1, 2], use_rates=True) - - pd.set_option('display.max_columns', None) - assert np.allclose([0, 0, 6], obtained["spike_mean"].values) - - -def test_empty_conditionwise_spike_statistics(spike_times_api): - # special case when there are no spikes - spike_times_api.get_spike_times = types.MethodType(get_no_spikes_times, spike_times_api) - session = EcephysSession(api=spike_times_api) - obtained = session.conditionwise_spike_statistics( - stimulus_presentation_ids=session.stimulus_presentations.index.values, - unit_ids=session.units.index.values - ) - assert(len(obtained) == 12) - assert(not np.any(obtained['spike_count'])) # check all spike_counts are 0 - assert(not np.any(obtained['spike_mean'])) # spike_means are 0 - assert(np.all(np.isnan(obtained['spike_std']))) # std/sem will be undefined - assert(np.all(np.isnan(obtained['spike_sem']))) - - -def test_get_stimulus_parameter_values(just_stimulus_table_api): - session = EcephysSession(api=just_stimulus_table_api) - obtained = session.get_stimulus_parameter_values() - - expected = { - 'color': [0, 5.5, 11, 16.5], - 'phase': [0, 60, 120, 180] - } - - for k, v in expected.items(): - assert np.allclose(v, obtained[k]) - assert len(expected) == len(obtained) - - -@pytest.mark.parametrize("detailed", [True, False]) -def test_get_stimulus_table(detailed, just_stimulus_table_api, raw_stimulus_table): - session = EcephysSession(api=just_stimulus_table_api) - obtained = session.get_stimulus_table(['a'], include_detailed_parameters=detailed) - - expected_columns = ['start_time', 'stop_time', 'stimulus_name', 'stimulus_block', 'Color', 'Phase'] - if detailed: - expected_columns.append("texRes") - expected = raw_stimulus_table.loc[:2, expected_columns] - - expected['duration'] = expected['stop_time'] - expected['start_time'] - expected["stimulus_condition_id"] = [0, 1, 2] - expected.rename(columns={"Color": "color", "Phase": "phase"}, inplace=True) - - print(expected) - print(obtained) - - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - -def test_filter_owned_df(just_stimulus_table_api): - session = EcephysSession(api=just_stimulus_table_api) - ids = [0, 2] - obtained = session._filter_owned_df('stimulus_presentations', ids) - - assert np.allclose([0, 120], obtained['phase'].values) - - -def test_filter_owned_df_scalar(just_stimulus_table_api): - session = EcephysSession(api=just_stimulus_table_api) - ids = 3 - - obtained = session._filter_owned_df('stimulus_presentations', ids) - assert obtained['phase'].values[0] == 180 - - -def test_build_inter_presentation_intervals(just_stimulus_table_api): - session = EcephysSession(api=just_stimulus_table_api) - obtained = session.inter_presentation_intervals - - expected = pd.DataFrame({ - 'interval': [0, 0, 0] - }, index=pd.MultiIndex( - levels=[[0, 1, 2], [1, 2, 3]], - codes=[[0, 1, 2], [0, 1, 2]], - names=['from_presentation_id', 'to_presentation_id'] - ) - ) - - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - -def test_get_inter_presentation_intervals_for_stimulus(just_stimulus_table_api): - session = EcephysSession(api=just_stimulus_table_api) - obtained = session.get_inter_presentation_intervals_for_stimulus('a') - - expected = pd.DataFrame({ - 'interval': [0, 0] - }, index=pd.MultiIndex( - levels=[[0, 1], [1, 2]], - codes=[[0, 1], [0, 1]], - names=['from_presentation_id', 'to_presentation_id'] - ) - ) - - pd.testing.assert_frame_equal(expected, obtained, check_like=True, check_dtype=False) - - -def test_get_lfp(channels_table_api): - session = EcephysSession(api=channels_table_api) - obtained = session.get_lfp(0) - - expected = xr.DataArray( - data=np.array([[1, 2, 3, 4, 5], - [6, 7, 8, 9, 10]]), - dims=['channel', 'time'], - coords=[[2, 1], np.linspace(0, 2, 5)] - ) - - xr.testing.assert_equal(expected, obtained) - - -def test_get_lfp_mask_invalid(lfp_masking_api): - session = EcephysSession(api=lfp_masking_api) - obtained = session.get_lfp(0) - - expected = xr.DataArray( - data=np.array([[1, 2, 3, np.nan, np.nan], - [6, 7, 8, np.nan, np.nan]]), - dims=['channel', 'time'], - coords=[[2, 1], np.linspace(0, 2, 5)] - ) - print(expected) - print(obtained) - - xr.testing.assert_equal(expected, obtained) - - -@pytest.mark.parametrize("inp,expected", [ - [[np.nan, np.nan, 4, 4, 4, 5, 5], [0, 2, 5, 7]] -]) -def test_nan_intervals(inp, expected): - assert np.allclose( - expected, nan_intervals(inp) - ) diff --git a/allensdk/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py deleted file mode 100644 index bf0a65dc5d..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py +++ /dev/null @@ -1,30 +0,0 @@ -# most of the tests for this functionality are actually in test_write_nwb - -import warnings - -import h5py -import pytest -import pandas as pd - -import allensdk.brain_observatory.ecephys.ecephys_session_api.ecephys_nwb_session_api as ensa - - -@pytest.mark.parametrize("left,right,expected,left_on,right_on", [ - [ - pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3]}), - pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6], "c": [7, 8, 9]}), - pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6], "c": [7, 8, 9]}), - "a", - "a" - ], - [ - pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3]}), - pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3], "c": [7, 8, 9]}), - pd.DataFrame({"a": [1, 2, 3], "b": [1, 2, 3], "c": [7, 8, 9]}), - ["a", "b"], - ["a", "b"] - ] -]) -def test_clobbering_merge(left, right, expected, left_on, right_on): - obtained = ensa.clobbering_merge(left, right, left_on=left_on, right_on=left_on) - pd.testing.assert_frame_equal(expected, obtained, check_like=True) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py deleted file mode 100644 index 7445cc78c8..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py +++ /dev/null @@ -1,70 +0,0 @@ -from unittest import mock - -import pytest -import numpy as np -import h5py - -from allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset import EcephysSyncDataset - - -@pytest.mark.parametrize('expected', [1, None]) -def test_sample_frequency(expected): - dataset = EcephysSyncDataset() - dataset.meta_data = {'ni_daq': {}} - - dataset.sample_frequency = expected - assert dataset.sample_frequency == expected - assert dataset.sample_frequency == dataset.meta_data['ni_daq']['counter_output_freq'] - - -@pytest.mark.parametrize('key,line_labels,led_vals', [ - [ 'foo', ('LED_sync',), np.array([1, 2, 3]) ], - [ 'LED_sync', ('LED_sync',), np.array([1, 2, 3]) ], -]) -def test_extract_led_times(key, line_labels, led_vals): - - dataset = EcephysSyncDataset() - dataset.line_labels = line_labels - dataset.sample_frequency = 1000 - - with mock.patch('allensdk.brain_observatory.sync_dataset.Dataset.get_all_times', return_value=led_vals) as p: - with mock.patch("allensdk.brain_observatory.sync_dataset.Dataset.get_bit_changes", return_value=np.ones_like(led_vals)) as q: - obtained = dataset.extract_led_times(key) - - if key in line_labels: - q.assert_called_once_with(0) - else: - q.assert_called_with(18) - - assert np.allclose(obtained, led_vals) - - -@pytest.mark.parametrize('photodiode_times,vsyncs,cycle,expected', [ - [ # expected timing, using vsyncs - np.arange(5.0, 5 + (100 * 0.75), 0.75), - np.arange(5.0, 5 + (298 * 0.25), 0.25) - 0.0625 * np.random.rand(298), # num frames is (num_vsyncs - 1) * cycle + 1 - 3, - np.arange(5.0, 5 + (298 * 0.25), 0.25) - ] -]) -def test_extract_frame_times_from_photodiode(photodiode_times, vsyncs, cycle, expected): - - class TimesWrapper: - def __call__(self, ignore, keys): - if 'photodiode' in keys: - return photodiode_times - elif 'frames' in keys: - return vsyncs - - dataset = EcephysSyncDataset() - with mock.patch('allensdk.brain_observatory.ecephys.file_io.ecephys_sync_dataset.EcephysSyncDataset.get_edges', new_callable=TimesWrapper) as p: - obtained = dataset.extract_frame_times_from_photodiode(photodiode_cycle=cycle) - assert np.allclose(obtained, expected) - - - -def test_factory(): - - with mock.patch('allensdk.brain_observatory.sync_dataset.Dataset.load') as p: - dataset = EcephysSyncDataset.factory('foo') - p.assert_called_with('foo') \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/test_http_engine.py b/allensdk/test/brain_observatory/ecephys/test_http_engine.py deleted file mode 100644 index 296a9ee0d1..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_http_engine.py +++ /dev/null @@ -1,115 +0,0 @@ -import os - -import mock -import requests -import pytest - -from allensdk.brain_observatory.ecephys.ecephys_project_api import ( - http_engine -) - - -class MockResponse: - - @property - def headers(self): - return {"Content-length": 10 * 1024 ** 2} - - def iter_content(self, chunksize): - for ii in range(5): - yield f"{ii}_{chunksize}_".encode() - - -def test_stream(): - engine = http_engine.HttpEngine( - scheme="http", - host="api.brain-map.org/api/v2" - ) - - with mock.patch("requests.get", return_value=MockResponse()) as p: - - results = [item for item in engine.stream("fish")] - - p.assert_called_once_with( - "http://api.brain-map.org/api/v2/fish", stream=True - ) - - assert f"3_{engine.chunksize}_" == results[3].decode() - -def test_stream_timeout(): - engine = http_engine.HttpEngine( - scheme="http", - host="api.brain-map.org/api/v2", - timeout=0 - ) - - with mock.patch("requests.get", return_value=MockResponse()): - with pytest.raises(requests.Timeout): - for item in engine.stream("fish"): - pass - - -def test_stream_to_file(tmpdir_factory): - - tmpdir = str(tmpdir_factory.mktemp("stream_test")) - path = os.path.join(tmpdir, "look_at_this_file") - - engine = http_engine.HttpEngine( - scheme="http", - host="api.brain-map.org/api/v2", - chunksize="hi" - ) - - with mock.patch("requests.get", return_value=MockResponse()) as p: - - stream = engine.stream("fish") - http_engine.write_from_stream(path, stream) - - with open(path, "r") as fil: - assert "0_hi_1_hi_2_hi_3_hi_4_hi_" == fil.read() - - -class MockAsyncSession: - def get(self, url): - return MockAsyncResponse() - - -class MockAsyncResponse: - - async def __aenter__(self): - return self - - async def __aexit__(self, *a): - return self - - def __await__(self): - return self - - @property - def content(self): - return MockAsyncContent() - - -class MockAsyncContent: - - async def iter_chunked(self, chunksize): - for ii in range(10): - yield (f"{ii}".encode()) - - -def test_async_stream_to_file(tmpdir_factory): - engine = http_engine.AsyncHttpEngine( - scheme="http", - host="api.brain.map.org/api/v2", - session=MockAsyncSession() - ) - - tmpdir = str(tmpdir_factory.mktemp("async_stream_test")) - path = os.path.join(tmpdir, "one_two.three") - - stream = engine.stream("foo") - http_engine.write_bytes_from_coroutine(path, stream) - - with open(path, "r") as fil: - assert "0123456789" == fil.read() - diff --git a/allensdk/test/brain_observatory/ecephys/test_lfp_subsampling.py b/allensdk/test/brain_observatory/ecephys/test_lfp_subsampling.py deleted file mode 100644 index b66939f8c2..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_lfp_subsampling.py +++ /dev/null @@ -1,108 +0,0 @@ -import pytest -import itertools -import numpy as np -import logging - -import allensdk.brain_observatory.ecephys.lfp_subsampling.subsampling as subsampling - - -@pytest.mark.parametrize('total_channels', [100, 384]) -@pytest.mark.parametrize('surface_offset', [-20, -50]) -@pytest.mark.parametrize('surface_padding', [10, 20]) -@pytest.mark.parametrize('start_channel_offset', [0, 1, 2]) -@pytest.mark.parametrize('channel_stride', [1, 2, 4, 10]) -def test_select_channels(total_channels, surface_offset, surface_padding, start_channel_offset, channel_stride): - input_channels = np.arange(start_channel_offset, total_channels + surface_offset + surface_padding) - selected, actual = subsampling.select_channels(total_channels=total_channels, - surface_channel=total_channels + surface_offset, - surface_padding=surface_padding, - start_channel_offset=start_channel_offset, - channel_stride=channel_stride, - channel_order=np.arange(total_channels)) - - assert np.allclose(selected, actual) - assert len(selected) == len(input_channels[::channel_stride]) - - -@pytest.mark.parametrize('remove_references', [True, False]) -@pytest.mark.parametrize('reference_channels', [np.array([0, 1, 2]), np.array([9, 10, 11]), np.array([10, 11, 12])]) -@pytest.mark.parametrize('remove_noisy_channels', [True, False]) -@pytest.mark.parametrize('noisy_channels', [np.array([10, 11, 12])]) -def test_select_channels_filtered(remove_references, reference_channels, remove_noisy_channels, noisy_channels): - """Similar to test above but focused on ability to remove reference """ - total_channels = 100 - surface_offset = -20 - start_channel_offset = 0 - channel_stride = 1 - surface_padding = 10 - - selected, actual = subsampling.select_channels(total_channels=total_channels, - surface_channel=total_channels + surface_offset, - surface_padding=surface_padding, - start_channel_offset=start_channel_offset, - channel_stride=channel_stride, - channel_order=np.arange(total_channels), - noisy_channels=noisy_channels, - remove_noisy_channels=remove_noisy_channels, - reference_channels=reference_channels, - remove_references=remove_references) - - assert np.allclose(selected, actual) - removed_channels = set() - if remove_noisy_channels: - assert(not np.any(np.isin(noisy_channels, selected))) - removed_channels |= set(noisy_channels) - - if remove_references: - assert(not np.any(np.isin(reference_channels, selected))) - removed_channels |= set(reference_channels) - - input_channels = np.arange(start_channel_offset, total_channels + surface_offset + surface_padding) - assert(len(selected) == len(input_channels) - len(removed_channels)) - - -@pytest.mark.parametrize('array_length', [50]) # , 150, 2001]) -@pytest.mark.parametrize('subsampling_factor', [1]) # , 2, 4, 10]) -def test_subsample_timestamps(subsampling_factor, array_length): - timestamps = np.linspace(0, 50, array_length) - ts_subsampled = subsampling.subsample_timestamps(timestamps, subsampling_factor) - - assert len(ts_subsampled) == np.ceil(len(timestamps) / subsampling_factor) - - -def test_subsample_lfp(): - lfp_raw = np.zeros((100, 100)) - selected_channels = np.arange(0, 50, 5) - subsampling_factor = 2 - lfp_subsampled = subsampling.subsample_lfp(lfp_raw, selected_channels, subsampling_factor) - - assert lfp_subsampled.shape == (50, 10) - - -def test_remove_lfp_offset(): - lfp_raw = np.zeros((2500, 100)) + 10 - lfp_filtered = subsampling.remove_lfp_offset(lfp_raw, 2500.0, 0.1, 1) - - assert np.max(lfp_filtered) < 1e-10 - - -def test_remove_lfp_noise(): - lfp_raw = np.zeros((2500, 100)) - lfp_raw[:, -10:] = 1 - channel_numbers = np.arange(100) - lfp_noise_removed = subsampling.remove_lfp_noise(lfp_raw, 90, channel_numbers) - - # TODO: This is not safe, try using set to assure that the removed noise contains only -1 and 0's - assert np.array_equal(np.unique(lfp_noise_removed), np.array([-1, 0])) - - -if __name__ == '__main__': - logging.basicConfig() - logging.getLogger('ecephys_pipeline.modules.lfp_subsampling').setLevel(logging.INFO) - for tc, so, sp, sco, cs in itertools.product([100, 384], [-20, -50], [10, 20], [0, 1, 2], [1, 2, 4, 10]): - test_select_channels(total_channels=tc, surface_offset=so, surface_padding=sp, start_channel_offset=sco, - channel_stride=cs) - test_subsample_timestamps(subsampling_factor=1, array_length=50) - test_subsample_lfp() - test_remove_lfp_offset() - test_remove_lfp_noise() diff --git a/allensdk/test/brain_observatory/ecephys/test_rma_engine.py b/allensdk/test/brain_observatory/ecephys/test_rma_engine.py deleted file mode 100644 index 1f29a2b9ec..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_rma_engine.py +++ /dev/null @@ -1,32 +0,0 @@ -import pytest -import pandas as pd -import numpy as np - -import allensdk.brain_observatory.ecephys.ecephys_project_api.rma_engine as rma_engine - - -@pytest.mark.parametrize("dataframe,expected_types", [ - [ - pd.DataFrame({ - "a": ["1", "2", "3"], - "b": ["a", "1", "2"] - }), - {"a": np.dtype("int64"), "b": np.dtype("O")} - ], - [ - pd.DataFrame({ - "a": ["1", "2.4", "3"], - "b": ["a", "1", "2"] - }), - {"a": float, "b": np.dtype("O")} - ] -]) -def test_infer_column_types(dataframe, expected_types): - - obtained = rma_engine.infer_column_types(dataframe) - obtained_types = {colname: obtained[colname].dtype for colname in obtained.columns} - - assert(set(expected_types.keys()) == set(obtained_types.keys())) - - for key, value in expected_types.items(): - assert np.dtype(value) == np.dtype(obtained_types[key]) diff --git a/allensdk/test/brain_observatory/ecephys/test_stim_file.py b/allensdk/test/brain_observatory/ecephys/test_stim_file.py deleted file mode 100644 index 8510b6fe22..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_stim_file.py +++ /dev/null @@ -1,67 +0,0 @@ -import pickle -import operator as op -import os - -import pytest -import numpy as np - -from allensdk.brain_observatory.ecephys.file_io import stim_file as stim_file - - -# ideally these would be fixtures, but I want to parametrize over them -def stim_pkl_data(): - return { - 'fps': 1000, - 'pre_blank_sec': 20, - 'stimuli': [{'a': 1}, {'a': 1}], - 'items': { - 'foraging': { - 'encoders': [ - { - 'dx': [1, 2, 3] - } - ] - } - } - } - - -def stim_pkl_data_toplevel_dx(): - return { - 'fps': 1000, - 'pre_blank_sec': 20, - 'dx': [1, 2, 3], - 'stimuli': [{'a': 1}, {'a': 1}], - 'items': { - 'foraging': { - 'encoders': [] - } - } - } - - -@pytest.fixture(params=[stim_pkl_data, stim_pkl_data_toplevel_dx]) -def stim_pkl_on_disk(tmpdir_factory, request): - tmpdir = str(tmpdir_factory.mktemp('stim_files')) - file_path = os.path.join(tmpdir, 'stim.pkl') - - with open(file_path, 'wb') as pkl_file: - pickle.dump(request.param(), pkl_file) - - return file_path - - -@pytest.fixture -def camstimone_pickle_stim_file(stim_pkl_on_disk): - return stim_file.CamStimOnePickleStimFile.factory(stim_pkl_on_disk) - - -@pytest.mark.parametrize('prop_name,expected,comp', [ - ['frames_per_second', 1000, op.eq], - ['pre_blank_sec', 20, op.eq], - ['angular_wheel_rotation', [1, 2, 3], np.allclose], - ['angular_wheel_velocity', [1000, 2000, 3000], np.allclose] -]) -def test_properties(camstimone_pickle_stim_file, prop_name, expected, comp): - obtained = getattr(camstimone_pickle_stim_file, prop_name) - assert comp(obtained, expected) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/test_stimulus_sync.py b/allensdk/test/brain_observatory/ecephys/test_stimulus_sync.py deleted file mode 100644 index c285d248db..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_stimulus_sync.py +++ /dev/null @@ -1,178 +0,0 @@ -from functools import partial - -import pytest -import numpy as np - -from allensdk.brain_observatory.ecephys import stimulus_sync - - -# manual test cases for compute_frame_times, allocate_by_vsync, assign_to_last -@pytest.mark.parametrize('photodiode_times,frame_duration,num_frames,cycle,vsyncs,expected', [ - [ # super basic, no vsyncs, no bad frames - np.linspace(5, 30.0, 11), 0.25, 100, 10, None, - [ - np.arange(5, 30, 0.25), - np.arange(5.25, 30.25, 0.25) - ] - ], - [ # also no bad frames - np.array([5, 5.75, 6.5, 7.25]), 0.25, 9, 3, None, - [ - np.array([5, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0]), - np.array([5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25 ]), - ] - ], - [ # now add in a long-short, using the append_to_last rule - np.array([5, 5.75, 6.75, 7.25, 8.0]), 0.25, 12, 3, None, - [ - np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.75, 7.00, 7.25, 7.25, 7.50, 7.75]), - np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.75, 7.00, 7.25, 7.25, 7.50, 7.75, 8.00]), - ] - ], - [ # expected timing, using vsyncs - np.array([5, 5.75, 6.5, 7.25, 8.0]), 0.25, 12, 3, - np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4 , 6.65, 6.9 , 7.15, 7.4 , 7.65, 7.9]), - [ - np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.0, 7.25, 7.50, 7.75]), - np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.0, 7.25, 7.50, 7.75, 8.00]) - ] - ], - [ # classic extra frame case - np.array([5, 5.75, 6.5, 7.5, 8.25]), 0.25, 12, 3, - np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4 , 6.65, 7.15, 7.4 , 7.65, 7.9 , 8.15]), - [ - np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.25, 7.50, 7.75, 8.00]), - np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 7.25, 7.50, 7.75, 8., 8.25]) - ] - ], - [ # long-short, using vsyncs - np.array([5, 5.75, 6.5, 7.50, 8.0]), 0.25, 12, 3, - np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4 , 6.9 , 7.15, 7.4, 7.4, 7.65, 7.9]), - [ - np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 7.0, 7.25, 7.50, 7.50, 7.75]), - np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 7.0, 7.25, 7.50, 7.50, 7.75, 8.00]) - ] - ], - [ # only short, using vsyncs - np.array([5, 5.75, 6.5, 7.0, 7.75]), 0.25, 12, 3, - np.array([4.9 , 5.15, 5.4 , 5.65, 5.9 , 6.15, 6.4, 6.65, 6.65, 6.9, 7.15, 7.4 , 7.65, 7.9]), - [ - np.array([5.00, 5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 6.75, 7.0, 7.25, 7.50]), - np.array([5.25, 5.50, 5.75, 6.00, 6.25, 6.50, 6.75, 6.75, 7.0, 7.25, 7.50, 7.75]) - ] - ], -]) -def test_compute_frame_times(photodiode_times, frame_duration, num_frames, cycle, vsyncs, expected): - - if vsyncs is not None: - cb = partial(stimulus_sync.allocate_by_vsync, np.diff(vsyncs)) - else: - cb = stimulus_sync.assign_to_last - - obt_indices, obt_starts, obt_ends = stimulus_sync.compute_frame_times(photodiode_times, frame_duration, num_frames, cycle, cb) - assert(np.allclose(obt_indices, np.arange(num_frames))) - assert np.allclose(obt_starts, expected[0]) - assert np.allclose(obt_ends, expected[1]) - - -@pytest.mark.parametrize('process,pctiles', [ - [partial(np.random.rand, 1000), (5, 95)], - [partial(np.random.rand, 1000), (45, 55)] -]) -def test_trimmed_stats(process, pctiles): - - data = np.sort(process()) - true_mean = np.mean(data) - true_std = np.std(data) - - lower_missing = pctiles[0] - upper_missing = 100 - pctiles[1] - total_missing = lower_missing + upper_missing - fraction_lower = lower_missing / total_missing - - num_missing = (data.size * total_missing / 100) / ( 1 - total_missing / 100 ) - num_missing_lower = int(np.around( num_missing * fraction_lower )) - num_missing_upper = int(np.around( num_missing * ( 1 - fraction_lower ) )) - - data = np.concatenate([ - data, - np.zeros(num_missing_lower) - 1000, - np.zeros(num_missing_upper) + 1000 - ]) - - obt_mean, obt_std = stimulus_sync.trimmed_stats(data, pctiles=pctiles) - assert obt_mean == true_mean - assert obt_std == true_std - - -@pytest.mark.parametrize('pd_times,vs_times, expected', [ - [ [1, 2, 3, 4, 5], [1.8, 3, 4], [2, 3, 4] ] -]) -def test_trim_border_pulses(pd_times, vs_times, expected): - obtained = stimulus_sync.trim_border_pulses(pd_times, vs_times) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize('base,effect', [ - [ np.arange(20, dtype=float), [0.25, -0.25] ], - [ np.arange(20, dtype=float), [0.25, -0.25] ], - # [ np.arange(20, dtype=float), [0.25, -0.4] ], misses for assymmetric cases - # [ np.arange(20, dtype=float), [0.4, -0.25] ] -]) -def test_correct_on_off_effects(base, effect): - impacted = base.copy() - impacted[::2] += effect[0] - impacted[1::2] += effect[1] - - - obtained = stimulus_sync.correct_on_off_effects(impacted) - assert np.allclose(base, obtained) - - -@pytest.mark.parametrize('pd_times,ndevs,expected_mask', [ - [ [1, 2, 3, 9, 10, 11, 12], 4, [1, 1, 0, 0, 1, 1, 1] ], - [ [1.03, 2.10, 2.99, 8.9, 10.0, 11.1, 11.98], 10, [1, 1, 0, 0, 1, 1, 1] ] -]) -def test_flag_unexpected_edges(pd_times, ndevs, expected_mask): - - obtained_mask = stimulus_sync.flag_unexpected_edges(pd_times, ndevs) - assert np.allclose(obtained_mask, expected_mask) - - -@pytest.mark.parametrize('pd_times,ndevs,cycle,max_offset,expected', [ - [ [0, 1, 2, 3, 4, 9, 10, 11], 10, 60, 5, np.arange(12) ], - [ - np.concatenate([[0, 1, 2, 3, 3.95, 4, 4.1, 4.7, 9, 10, 11], np.arange(12, 1000)]), - 0.1, 60, 5, - np.arange(1000) - ] -]) -def test_fix_unexpected_edges(pd_times, ndevs, cycle, max_offset, expected): - obtained = stimulus_sync.fix_unexpected_edges(pd_times, ndevs, cycle, max_offset) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize('pd_times,cycle,expected', [ - [ [0, 1, 2, 3, 4, 5.1, 6, 7, 8], 1, 1] -]) -def test_estimate_frame_duration(pd_times, cycle, expected): - obtained = stimulus_sync.estimate_frame_duration(pd_times, cycle) - assert obtained == expected - - -@pytest.mark.parametrize('ends,frame_duration,irregularity,expected', [ - [ np.arange(20, dtype=float), 0.5, 1, np.concatenate([np.arange(19), [19.5]]) ] -]) -def test_assign_to_last(ends, frame_duration, irregularity, expected): - _, obt_ends = stimulus_sync.assign_to_last(None, None, ends, frame_duration, irregularity, None) - assert np.allclose(obt_ends, expected) - - -@pytest.mark.parametrize('vs_diff,index,starts,ends,frame_duration,irregularity,cycle,expected', [ - [ [1, 1, 1, 1, 2, 1, 1, 1, 1], 1, [5, 6, 7], [6, 7, 8], 1, 1, 3, [[5, 6, 8], [6, 8, 9]] ], - [ [1, 1, 1, 1, 0.5, 1, 1, 1, 1], 1, [5, 6, 7], [6, 7, 8], 1, -1, 3, [[5, 6, 6], [6, 6, 7]] ], -]) -def test_allocate_by_vsync(vs_diff, index, starts, ends, frame_duration, irregularity, cycle, expected): - obt_starts, obt_ends = stimulus_sync.allocate_by_vsync(vs_diff, index, starts, ends, frame_duration, irregularity, cycle) - assert np.allclose(obt_starts, expected[0]) - assert np.allclose(obt_ends, expected[1]) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/ecephys/test_visualization.py b/allensdk/test/brain_observatory/ecephys/test_visualization.py deleted file mode 100644 index 099aa18f63..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_visualization.py +++ /dev/null @@ -1,14 +0,0 @@ -import allensdk.brain_observatory.ecephys.visualization.__init__ as vis -import pandas as pd - -def test_raster_plot(): - spike_times = pd.DataFrame({ - 'unit_id': [2, 1, 2], - 'stimulus_presentation_id': [2, 2, 2, ], - 'time_since_stimulus_presentation_onset': [0.01, 0.02, 0.03] - }, index=pd.Index(name='spike_time', data=[1.01, 1.02, 1.03])) - - fig = vis.raster_plot(spike_times) - ax = fig.get_axes()[0] - - assert len(spike_times['unit_id'].unique()) == len(ax.collections) diff --git a/allensdk/test/brain_observatory/ecephys/test_write_nwb.py b/allensdk/test/brain_observatory/ecephys/test_write_nwb.py deleted file mode 100644 index cc54db1c7a..0000000000 --- a/allensdk/test/brain_observatory/ecephys/test_write_nwb.py +++ /dev/null @@ -1,1082 +0,0 @@ -import os -from datetime import datetime, timezone -from pathlib import Path -import logging -import platform - -import pytest -import pynwb -import pandas as pd -import numpy as np -import xarray as xr - -from pynwb import NWBFile, NWBHDF5IO - -from allensdk.brain_observatory.ecephys.current_source_density.__main__ import write_csd_to_h5 -import allensdk.brain_observatory.ecephys.write_nwb.__main__ as write_nwb -from allensdk.brain_observatory.ecephys.ecephys_session_api import EcephysNwbSessionApi -from allensdk.test.brain_observatory.behavior.test_eye_tracking_processing import create_preload_eye_tracking_df - - -@pytest.fixture -def units_table(): - return pynwb.misc.Units.from_dataframe(pd.DataFrame({ - "peak_channel_id": [5, 10, 15], - "local_index": [0, 1, 2], - "quality": ["good", "good", "noise"], - "firing_rate": [0.5, 1.2, -3.14], - "snr": [1.0, 2.4, 5], - "isi_violations": [34, 39, 22] - }, index=pd.Index([11, 22, 33], name="id")), name="units") - - -@pytest.fixture -def spike_times(): - return { - 11: [1, 2, 3, 4, 5, 6], - 22: [], - 33: [13, 4, 12] - } - - -@pytest.fixture -def running_speed(): - return pd.DataFrame({ - "start_time": [1., 2., 3., 4., 5.], - "end_time": [2., 3., 4., 5., 6.], - "velocity": [-1., -2., -1., 0., 1.], - "net_rotation": [-np.pi, -2 * np.pi, -np.pi, 0, np.pi] - }) - - -@pytest.fixture -def raw_running_data(): - return pd.DataFrame({ - "frame_time": np.random.rand(4), - "dx": np.random.rand(4), - "vsig": np.random.rand(4), - "vin": np.random.rand(4), - }) - - -@pytest.fixture -def stimulus_presentations_color(): - return pd.DataFrame({ - "alpha": [0.5, 0.4, 0.3, 0.2, 0.1], - "start_time": [1., 2., 4., 5., 6.], - "stop_time": [2., 4., 5., 6., 8.], - "stimulus_name": ['gabors', 'gabors', 'random', 'movie', 'gabors'], - "color": ["1.0", "", r"[1.0,-1.0, 10., -42.12, -.1]", "-1.0", ""] - }, index=pd.Index(name="stimulus_presentations_id", data=[0, 1, 2, 3, 4])) - - -def test_roundtrip_basic_metadata(roundtripper): - dt = datetime.now(timezone.utc) - nwbfile = pynwb.NWBFile( - session_description="EcephysSession", - identifier="{}".format(12345), - session_start_time=dt - ) - - api = roundtripper(nwbfile, EcephysNwbSessionApi) - assert 12345 == api.get_ecephys_session_id() - assert dt == api.get_session_start_time() - - -@pytest.mark.parametrize("metadata, expected_metadata", [ - ({ - "specimen_name": "mouse_1", - "age_in_days": 100.0, - "full_genotype": "wt", - "strain": "c57", - "sex": "F", - "stimulus_name": "brain_observatory_2.0", - "donor_id": 12345, - "species": "Mus musculus"}, - { - "specimen_name": "mouse_1", - "age_in_days": 100.0, - "age": "P100D", - "full_genotype": "wt", - "strain": "c57", - "sex": "F", - "stimulus_name": "brain_observatory_2.0", - "subject_id": "12345", - "species": "Mus musculus"}) -]) -def test_add_metadata(nwbfile, roundtripper, metadata, expected_metadata): - nwbfile = write_nwb.add_metadata_to_nwbfile(nwbfile, metadata) - - api = roundtripper(nwbfile, EcephysNwbSessionApi) - obtained = api.get_metadata() - - assert set(expected_metadata.keys()) == set(obtained.keys()) - - misses = {} - for key, value in expected_metadata.items(): - if obtained[key] != value: - misses[key] = {"expected": value, "obtained": obtained[key]} - - assert len(misses) == 0, f"the following metadata items were mismatched: {misses}" - - -@pytest.mark.parametrize("presentations", [ - (pd.DataFrame({ - 'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], - 'start_time': [1., 2., 4., 5., 6.], - 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'stop_time': [2., 4., 5., 6., 8.] - }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3, 4]))), - - (pd.DataFrame({ - 'gabor_specific_column': [1.0, 2.0, np.nan, np.nan, 3.0], - 'mixed_column': ["a", "", "b", "", "c"], - 'movie_specific_column': [np.nan, np.nan, np.nan, 1.0, np.nan], - 'start_time': [1., 2., 4., 5., 6.], - 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'stop_time': [2., 4., 5., 6., 8.] - }, index=pd.Index(name='stimulus_presentations_id', data=[0, 1, 2, 3, 4]))), -]) -def test_add_stimulus_presentations(nwbfile, presentations, roundtripper): - write_nwb.add_stimulus_timestamps(nwbfile, [0, 1]) - write_nwb.add_stimulus_presentations(nwbfile, presentations) - - api = roundtripper(nwbfile, EcephysNwbSessionApi) - obtained_stimulus_table = api.get_stimulus_presentations() - - pd.testing.assert_frame_equal(presentations, obtained_stimulus_table, check_dtype=False) - - -def test_add_stimulus_presentations_color(nwbfile, stimulus_presentations_color, roundtripper): - write_nwb.add_stimulus_timestamps(nwbfile, [0, 1]) - write_nwb.add_stimulus_presentations(nwbfile, stimulus_presentations_color) - - api = roundtripper(nwbfile, EcephysNwbSessionApi) - obtained_stimulus_table = api.get_stimulus_presentations() - - expected_color = [1.0, "", "", -1.0, ""] - obtained_color = obtained_stimulus_table["color"].values.tolist() - - mismatched = False - for expected, obtained in zip(expected_color, obtained_color): - if expected != obtained: - mismatched = True - - assert not mismatched, f"expected: {expected_color}, obtained: {obtained_color}" - - -@pytest.mark.parametrize("opto_table, expected", [ - (pd.DataFrame({ - "start_time": [0., 1., 2., 3.], - "stop_time": [0.5, 1.5, 2.5, 3.5], - "level": [10., 9., 8., 7.], - "condition": ["a", "a", "b", "c"]}), - None), - - # Test for older version of optotable that used nwb reserved "name" col - (pd.DataFrame({"start_time": [0., 1., 2., 3.], - "stop_time": [0.5, 1.5, 2.5, 3.5], - "level": [10., 9., 8., 7.], - "condition": ["a", "a", "b", "c"], - "name": ["w", "x", "y", "z"]}), - pd.DataFrame({"start_time": [0., 1., 2., 3.], - "stop_time": [0.5, 1.5, 2.5, 3.5], - "level": [10., 9., 8., 7.], - "condition": ["a", "a", "b", "c"], - "stimulus_name": ["w", "x", "y", "z"], - "duration": [0.5, 0.5, 0.5, 0.5]})), - - (pd.DataFrame({"start_time": [0., 1., 2., 3.], - "stop_time": [0.5, 1.5, 2.5, 3.5], - "level": [10., 9., 8., 7.], - "condition": ["a", "a", "b", "c"], - "stimulus_name": ["w", "x", "y", "z"]}), - None) -]) -def test_add_optotagging_table_to_nwbfile(nwbfile, roundtripper, opto_table, expected): - - opto_table["duration"] = opto_table["stop_time"] - opto_table["start_time"] - - nwbfile = write_nwb.add_optotagging_table_to_nwbfile(nwbfile, opto_table) - api = roundtripper(nwbfile, EcephysNwbSessionApi) - - obtained = api.get_optogenetic_stimulation() - - if expected is None: - expected = opto_table - - pd.testing.assert_frame_equal(obtained, expected, check_like=True) - - -@pytest.mark.parametrize("roundtrip", [True, False]) -@pytest.mark.parametrize("pid,name,srate,lfp_srate,has_lfp,expected", [ - [ - 12, - "a probe", - 30000.0, - 2500.0, - True, - pd.DataFrame({ - "description": ["a probe"], - "sampling_rate": [30000.0], - "lfp_sampling_rate": [2500.0], - "has_lfp_data": [True], - "location": ["See electrode locations"] - }, index=pd.Index([12], name="id")) - ] -]) -def test_add_probe_to_nwbfile(nwbfile, roundtripper, roundtrip, pid, name, srate, lfp_srate, has_lfp, expected): - - nwbfile, _, _ = write_nwb.add_probe_to_nwbfile(nwbfile, pid, - name=name, - sampling_rate=srate, - lfp_sampling_rate=lfp_srate, - has_lfp_data=has_lfp) - if roundtrip: - obt = roundtripper(nwbfile, EcephysNwbSessionApi) - else: - obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) - - pd.testing.assert_frame_equal(expected, obt.get_probes(), check_like=True) - - -@pytest.mark.parametrize("columns_to_add, expected_columns", [ - (None, - - {"probe_vertical_position", "probe_horizontal_position", - "probe_id", "local_index", "valid_data", "x", "y", "z", "group", - "group_name", "imp", "location", "filtering"}), - - ([("test_column_a", "description_a"), - ("test_column_b", "description_b")], - - {"x", "y", "z", "group", "group_name", "imp", "location", "filtering", - "test_column_a", "test_column_b"}) -]) -def test_add_ecephys_electrode_columns(nwbfile, columns_to_add, - expected_columns): - - write_nwb.add_ecephys_electrode_columns(nwbfile, columns_to_add) - - assert set(nwbfile.electrodes.colnames) == expected_columns - - -@pytest.mark.parametrize(("channels, local_index_whitelist, " - "expected_electrode_table"), [ - ([{"id": 1, - "probe_id": 1234, - "valid_data": True, - "local_index": 23, - "probe_vertical_position": 10, - "probe_horizontal_position": 10, - "anterior_posterior_ccf_coordinate": 15.0, - "dorsal_ventral_ccf_coordinate": 20.0, - "left_right_ccf_coordinate": 25.0, - "manual_structure_acronym": "CA1", - "impedence": np.nan, - "filtering": "AP band: 500 Hz high-pass; LFP band: 1000 Hz low-pass"}, - {"id": 2, - "probe_id": 1234, - "valid_data": True, - "local_index": 15, - "probe_vertical_position": 20, - "probe_horizontal_position": 20, - "anterior_posterior_ccf_coordinate": 25.0, - "dorsal_ventral_ccf_coordinate": 30.0, - "left_right_ccf_coordinate": 35.0, - "manual_structure_acronym": "CA3", - "impedence": 42.0, - "filtering": "custom"}], - - [15, 23], - - pd.DataFrame({ - "id": [2, 1], - "probe_id": [1234, 1234], - "valid_data": [True, True], - "local_index": [15, 23], - "probe_vertical_position": [20, 10], - "probe_horizontal_position": [20, 10], - "x": [25.0, 15.0], - "y": [30.0, 20.0], - "z": [35.0, 25.0], - "location": ["CA3", "CA1"], - "imp": [42.0, np.nan], - "filtering": ["custom", "AP band: 500 Hz high-pass; LFP band: 1000 Hz low-pass"] - }).set_index("id")) - -]) -def test_add_ecephys_electrodes(nwbfile, channels, local_index_whitelist, - expected_electrode_table): - - mock_device = pynwb.device.Device(name="mock_device") - mock_electrode_group = pynwb.ecephys.ElectrodeGroup(name="mock_group", - description="", - location="", - device=mock_device) - - write_nwb.add_ecephys_electrodes(nwbfile, channels, mock_electrode_group, - local_index_whitelist) - - obt_electrode_table = nwbfile.electrodes.to_dataframe().drop(columns=["group", "group_name"]) - - pd.testing.assert_frame_equal(obt_electrode_table, - expected_electrode_table, - check_like=True) - - -@pytest.mark.parametrize("dc,order,exp_idx,exp_data", [ - [{"a": [1, 2, 3], "b": [4, 5, 6]}, ["a", "b"], [3, 6], [1, 2, 3, 4, 5, 6]] -]) -def test_dict_to_indexed_array(dc, order, exp_idx, exp_data): - - obt_idx, obt_data = write_nwb.dict_to_indexed_array(dc, order) - assert np.allclose(exp_idx, obt_idx) - assert np.allclose(exp_data, obt_data) - - -def test_add_ragged_data_to_dynamic_table(units_table, spike_times): - - write_nwb.add_ragged_data_to_dynamic_table( - table=units_table, - data=spike_times, - column_name="spike_times" - ) - - assert np.allclose([1, 2, 3, 4, 5, 6], units_table["spike_times"][0]) - assert np.allclose([], units_table["spike_times"][1]) - assert np.allclose([13, 4, 12], units_table["spike_times"][2]) - - -@pytest.mark.parametrize("roundtrip,include_rotation", [ - [True, True], - [True, False] -]) -def test_add_running_speed_to_nwbfile(nwbfile, running_speed, roundtripper, roundtrip, include_rotation): - - nwbfile = write_nwb.add_running_speed_to_nwbfile(nwbfile, running_speed) - if roundtrip: - api_obt = roundtripper(nwbfile, EcephysNwbSessionApi) - else: - api_obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) - - obtained = api_obt.get_running_speed(include_rotation=include_rotation) - - expected = running_speed - if not include_rotation: - expected = expected.drop(columns="net_rotation") - pd.testing.assert_frame_equal(expected, obtained, check_like=True) - - -@pytest.mark.parametrize("roundtrip", [[True]]) -def test_add_raw_running_data_to_nwbfile(nwbfile, raw_running_data, roundtripper, roundtrip): - - nwbfile = write_nwb.add_raw_running_data_to_nwbfile(nwbfile, raw_running_data) - if roundtrip: - api_obt = roundtripper(nwbfile, EcephysNwbSessionApi) - else: - api_obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) - - obtained = api_obt.get_raw_running_data() - - expected = raw_running_data.rename(columns={"dx": "net_rotation", "vsig": "signal_voltage", "vin": "supply_voltage"}) - pd.testing.assert_frame_equal(expected, obtained, check_like=True) - - -@pytest.mark.parametrize("presentations, column_renames_map, columns_to_drop, expected", [ - (pd.DataFrame({'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], - 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'start_time': [1., 2., 4., 5., 6.], - 'stop_time': [2., 4., 5., 6., 8.]}), - {"alpha": "beta"}, - None, - pd.DataFrame({'beta': [0.5, 0.4, 0.3, 0.2, 0.1], - 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'start_time': [1., 2., 4., 5., 6.], - 'stop_time': [2., 4., 5., 6., 8.]})), - - (pd.DataFrame({'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], - 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'start_time': [1., 2., 4., 5., 6.], - 'stop_time': [2., 4., 5., 6., 8.]}), - {"alpha": "beta"}, - ["Nonexistant_column_to_drop"], - pd.DataFrame({'beta': [0.5, 0.4, 0.3, 0.2, 0.1], - 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'start_time': [1., 2., 4., 5., 6.], - 'stop_time': [2., 4., 5., 6., 8.]})), - - (pd.DataFrame({'alpha': [0.5, 0.4, 0.3, 0.2, 0.1], - 'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'Start': [1., 2., 4., 5., 6.], - 'End': [2., 4., 5., 6., 8.]}), - None, - ["alpha"], - pd.DataFrame({'stimulus_name': ['gabors', 'gabors', 'random', 'movie', 'gabors'], - 'start_time': [1., 2., 4., 5., 6.], - 'stop_time': [2., 4., 5., 6., 8.]})), -]) -def test_read_stimulus_table(tmpdir_factory, presentations, - column_renames_map, columns_to_drop, expected): - dirname = str(tmpdir_factory.mktemp("ecephys_nwb_test")) - stim_table_path = os.path.join(dirname, "stim_table.csv") - - presentations.to_csv(stim_table_path, index=False) - obt = write_nwb.read_stimulus_table(stim_table_path, - column_renames_map=column_renames_map, - columns_to_drop=columns_to_drop) - - pd.testing.assert_frame_equal(obt, expected) - - -# read_spike_times_to_dictionary(spike_times_path, spike_units_path, local_to_global_unit_map=None) -def test_read_spike_times_to_dictionary(tmpdir_factory): - dirname = str(tmpdir_factory.mktemp("ecephys_nwb_spike_times")) - spike_times_path = os.path.join(dirname, "spike_times.npy") - spike_units_path = os.path.join(dirname, "spike_units.npy") - - spike_times = np.sort(np.random.rand(30)) - np.save(spike_times_path, spike_times, allow_pickle=False) - - spike_units = np.concatenate([np.arange(15), np.arange(15)]) - np.save(spike_units_path, spike_units, allow_pickle=False) - - local_to_global_unit_map = {ii: -ii for ii in spike_units} - - obtained = write_nwb.read_spike_times_to_dictionary(spike_times_path, spike_units_path, local_to_global_unit_map) - for ii in range(15): - assert np.allclose(obtained[-ii], sorted([spike_times[ii], spike_times[15 + ii]])) - - -def test_read_waveforms_to_dictionary(tmpdir_factory): - dirname = str(tmpdir_factory.mktemp("ecephys_nwb_mean_waveforms")) - waveforms_path = os.path.join(dirname, "mean_waveforms.npy") - - nunits = 10 - nchannels = 30 - nsamples = 20 - - local_to_global_unit_map = {ii: -ii for ii in range(nunits)} - - mean_waveforms = np.random.rand(nunits, nsamples, nchannels) - np.save(waveforms_path, mean_waveforms, allow_pickle=False) - - obtained = write_nwb.read_waveforms_to_dictionary(waveforms_path, local_to_global_unit_map) - for ii in range(nunits): - assert np.allclose(mean_waveforms[ii, :, :], obtained[-ii]) - - -@pytest.fixture -def lfp_data(): - total_timestamps = 12 - subsample_channels = np.array([3, 2]) - - return { - "data": np.arange(total_timestamps * len(subsample_channels), dtype=np.int16).reshape((total_timestamps, len(subsample_channels))), - "timestamps": np.linspace(0, 1, total_timestamps), - "subsample_channels": subsample_channels - } - - -@pytest.fixture -def probe_data(): - probe_data = { - "id": 12345, - "name": "probeA", - "sampling_rate": 29.0, - "lfp_sampling_rate": 10.0, - "temporal_subsampling_factor": 2.0, - "channels": [ - { - "id": 0, - "probe_id": 12, - "local_index": 1, - "probe_vertical_position": 21, - "probe_horizontal_position": 33, - "valid_data": True, - "anterior_posterior_ccf_coordinate": 5.0, - "dorsal_ventral_ccf_coordinate": 10.0, - "left_right_ccf_coordinate": 15.0, - "manual_structure_acronym": "CA1", - "impedence": np.nan, - "filtering": "Unknown" - }, - { - "id": 1, - "probe_id": 12, - "local_index": 2, - "probe_vertical_position": 21, - "probe_horizontal_position": 32, - "valid_data": True, - "anterior_posterior_ccf_coordinate": 10.0, - "dorsal_ventral_ccf_coordinate": 15.0, - "left_right_ccf_coordinate": 20.0, - "manual_structure_acronym": "CA2", - "impedence": np.nan, - "filtering": "Unknown" - }, - { - "id": 2, - "probe_id": 12, - "local_index": 3, - "probe_vertical_position": 21, - "probe_horizontal_position": 31, - "valid_data": True, - "anterior_posterior_ccf_coordinate": 15.0, - "dorsal_ventral_ccf_coordinate": 20.0, - "left_right_ccf_coordinate": 25.0, - "manual_structure_acronym": "CA3", - "impedence": np.nan, - "filtering": "Unknown" - } - ], - "lfp": { - "input_data_path": "", - "input_timestamps_path": "", - "input_channels_path": "", - "output_path": "" - }, - "csd_path": "", - "amplitude_scale_factor": 1.0 - } - return probe_data - - -@pytest.fixture -def csd_data(): - csd_data = { - "csd": np.arange(20).reshape([2, 10]), - "relative_window": np.linspace(-1, 1, 10), - "channels": np.array([3, 2]), - "csd_locations": np.array([[1, 2], [3, 3]]), - "stimulus_name": "foo", - "stimulus_index": None, - "num_trials": 1000 - } - return csd_data - - -def test_write_probe_lfp_file(tmpdir_factory, lfp_data, probe_data, csd_data): - - tmpdir = Path(tmpdir_factory.mktemp("probe_lfp_nwb")) - input_data_path = tmpdir / Path("lfp_data.dat") - input_timestamps_path = tmpdir / Path("lfp_timestamps.npy") - input_channels_path = tmpdir / Path("lfp_channels.npy") - input_csd_path = tmpdir / Path("csd.h5") - output_path = str(tmpdir / Path("lfp.nwb")) # pynwb.NWBHDF5IO chokes on Path - - test_lfp_paths = { - "input_data_path": input_data_path, - "input_timestamps_path": input_timestamps_path, - "input_channels_path": input_channels_path, - "output_path": output_path - } - - test_session_metadata = { - "specimen_name": "A", - "age_in_days": 100.0, - "full_genotype": "wt", - "strain": "A strain", - "sex": "M", - "stimulus_name": "test_stim", - "species": "Mus musculus", - "donor_id": 42 - } - - probe_data.update({"lfp": test_lfp_paths}) - probe_data.update({"csd_path": input_csd_path}) - - write_csd_to_h5(path=input_csd_path, **csd_data) - - np.save(input_timestamps_path, lfp_data["timestamps"], allow_pickle=False) - np.save(input_channels_path, lfp_data["subsample_channels"], allow_pickle=False) - with open(input_data_path, "wb") as input_data_file: - input_data_file.write(lfp_data["data"].tobytes()) - - write_nwb.write_probe_lfp_file(4242, test_session_metadata, datetime.now(), logging.INFO, probe_data) - - exp_electrodes = pd.DataFrame(probe_data["channels"]).set_index("id").loc[[2, 1], :] - exp_electrodes.rename(columns={"anterior_posterior_ccf_coordinate": "x", - "dorsal_ventral_ccf_coordinate": "y", - "left_right_ccf_coordinate": "z", - "manual_structure_acronym": "location"}, inplace=True) - - with pynwb.NWBHDF5IO(output_path, "r") as obt_io: - obt_f = obt_io.read() - - obt_ser = obt_f.get_acquisition("probe_12345_lfp").electrical_series["probe_12345_lfp_data"] - assert np.allclose(lfp_data["data"], obt_ser.data[:]) - assert np.allclose(lfp_data["timestamps"], obt_ser.timestamps[:]) - - obt_electrodes = obt_f.electrodes.to_dataframe().loc[ - :, ["local_index", "probe_horizontal_position", - "probe_id", "probe_vertical_position", - "valid_data", "x", "y", "z", "location", "impedence", - "filtering"] - ] - - assert obt_f.session_id == "4242" - assert obt_f.subject.subject_id == "42" - - # There is a difference in how int dtypes are being saved in Windows - # that are causing tests to fail. - # Perhaps related to: https://stackoverflow.com/a/36279549 - if platform.system() == "Windows": - pd.testing.assert_frame_equal(obt_electrodes, exp_electrodes, check_like=True, check_dtype=False) - else: - pd.testing.assert_frame_equal(obt_electrodes, exp_electrodes, check_like=True) - - csd_series = obt_f.get_processing_module("current_source_density")["ecephys_csd"] - - assert np.allclose(csd_data["csd"], csd_series.time_series.data[:].T) - assert np.allclose(csd_data["relative_window"], csd_series.time_series.timestamps[:]) - obt_channel_locations = np.stack((csd_series.virtual_electrode_x_positions, - csd_series.virtual_electrode_y_positions), - axis=1) - assert np.allclose([[1, 2], [3, 3]], obt_channel_locations) # csd interpolated channel locations - - -@pytest.mark.parametrize("roundtrip", [True, False]) -def test_write_probe_lfp_file_roundtrip(tmpdir_factory, roundtrip, lfp_data, probe_data, csd_data): - - expected_csd = xr.DataArray( - name="CSD", - data=csd_data["csd"], - dims=["virtual_channel_index", "time"], - coords={ - "virtual_channel_index": np.arange(csd_data["csd"].shape[0]), - "time": csd_data["relative_window"], - "vertical_position": (("virtual_channel_index",), csd_data["csd_locations"][:, 1]), - "horizontal_position": (("virtual_channel_index",), csd_data["csd_locations"][:, 0]), - } - ) - - expected_lfp = xr.DataArray( - name="LFP", - data=lfp_data["data"], - dims=["time", "channel"], - coords=[lfp_data["timestamps"], [2, 1]] - ) - - tmpdir = Path(tmpdir_factory.mktemp("probe_lfp_nwb")) - input_data_path = tmpdir / Path("lfp_data.dat") - input_timestamps_path = tmpdir / Path("lfp_timestamps.npy") - input_channels_path = tmpdir / Path("lfp_channels.npy") - input_csd_path = tmpdir / Path("csd.h5") - output_path = str(tmpdir / Path("lfp.nwb")) # pynwb.NWBHDF5IO chokes on Path - - test_lfp_paths = { - "input_data_path": input_data_path, - "input_timestamps_path": input_timestamps_path, - "input_channels_path": input_channels_path, - "output_path": output_path - } - - probe_data.update({"lfp": test_lfp_paths}) - probe_data.update({"csd_path": input_csd_path}) - - write_csd_to_h5(path=input_csd_path, **csd_data) - - np.save(input_timestamps_path, lfp_data["timestamps"], allow_pickle=False) - np.save(input_channels_path, lfp_data["subsample_channels"], allow_pickle=False) - with open(input_data_path, "wb") as input_data_file: - input_data_file.write(lfp_data["data"].tobytes()) - - write_nwb.write_probe_lfp_file(4242, None, datetime.now(), logging.INFO, probe_data) - - obt = EcephysNwbSessionApi(path=None, probe_lfp_paths={12345: NWBHDF5IO(output_path, "r").read}) - - obtained_lfp = obt.get_lfp(12345) - obtained_csd = obt.get_current_source_density(12345) - - xr.testing.assert_equal(obtained_lfp, expected_lfp) - xr.testing.assert_equal(obtained_csd, expected_csd) - - -@pytest.fixture -def invalid_epochs(): - - epochs = [ - { - "type": "EcephysSession", - "id": 739448407, - "label": "stimulus", - "start_time": 1998.0, - "end_time": 2005.0, - }, - { - "type": "EcephysSession", - "id": 739448407, - "label": "stimulus", - "start_time": 2114.0, - "end_time": 2121.0, - }, - { - "type": "EcephysProbe", - "id": 123448407, - "label": "ProbeB", - "start_time": 114.0, - "end_time": 211.0, - }, - ] - - return epochs - - -def test_add_invalid_times(invalid_epochs, tmpdir_factory): - - nwbfile_name = str(tmpdir_factory.mktemp("test").join("test_invalid_times.nwb")) - - nwbfile = NWBFile( - session_description="EcephysSession", - identifier="{}".format(739448407), - session_start_time=datetime.now() - ) - - nwbfile = write_nwb.add_invalid_times(nwbfile, invalid_epochs) - - with NWBHDF5IO(nwbfile_name, mode="w") as io: - io.write(nwbfile) - nwbfile_in = NWBHDF5IO(nwbfile_name, mode="r").read() - - df = nwbfile.invalid_times.to_dataframe() - df_in = nwbfile_in.invalid_times.to_dataframe() - - pd.testing.assert_frame_equal(df, df_in, check_like=True, check_dtype=False) - - -def test_roundtrip_add_invalid_times(nwbfile, invalid_epochs, roundtripper): - - expected = write_nwb.setup_table_for_invalid_times(invalid_epochs) - - nwbfile = write_nwb.add_invalid_times(nwbfile, invalid_epochs) - api = roundtripper(nwbfile, EcephysNwbSessionApi) - obtained = api.get_invalid_times() - - pd.testing.assert_frame_equal(expected, obtained, check_dtype=False) - - -def test_no_invalid_times_table(): - - epochs = [] - assert write_nwb.setup_table_for_invalid_times(epochs).empty is True - - -def test_setup_table_for_invalid_times(): - - epoch = { - "type": "EcephysSession", - "id": 739448407, - "label": "stimulus", - "start_time": 1998.0, - "end_time": 2005.0, - } - - s = write_nwb.setup_table_for_invalid_times([epoch]).loc[0] - - assert s["start_time"] == epoch["start_time"] - assert s["stop_time"] == epoch["end_time"] - assert s["tags"] == [epoch["type"], str(epoch["id"]), epoch["label"]] - - -@pytest.fixture -def spike_amplitudes(): - return np.arange(5) - - -@pytest.fixture -def templates(): - return np.array([ - [ - [0, 1, 2], - [0, 1, 2], - [0, 1, 2], - [10, 21, 32] - ], - [ - [0, 1, 2], - [0, 1, 2], - [0, 1, 2], - [15, 9, 4] - ] - ]) - - -@pytest.fixture -def spike_templates(): - return np.array([0, 1, 0, 1, 0]) - - -@pytest.fixture -def expected_amplitudes(): - return np.array([0, 15, 60, 45, 120]) - - -def test_scale_amplitudes(spike_amplitudes, templates, spike_templates, expected_amplitudes): - - scale_factor = 0.195 - - expected = expected_amplitudes * scale_factor - obtained = write_nwb.scale_amplitudes(spike_amplitudes, templates, spike_templates, scale_factor) - - assert np.allclose(expected, obtained) - - -def test_read_spike_amplitudes_to_dictionary(tmpdir_factory, spike_amplitudes, templates, spike_templates, expected_amplitudes): - tmpdir = str(tmpdir_factory.mktemp("spike_amps")) - - spike_amplitudes_path = os.path.join(tmpdir, "spike_amplitudes.npy") - spike_units_path = os.path.join(tmpdir, "spike_units.npy") - templates_path = os.path.join(tmpdir, "templates.npy") - spike_templates_path = os.path.join(tmpdir, "spike_templates.npy") - inverse_whitening_matrix_path = os.path.join(tmpdir, "inverse_whitening_matrix_path.npy") - - whitening_matrix = np.diag(np.arange(3) + 1) - inverse_whitening_matrix = np.linalg.inv(whitening_matrix) - - spike_units = np.array([0, 0, 0, 1, 1]) - - for idx in range(templates.shape[0]): - templates[idx, :, :] = np.dot( - templates[idx, :, :], whitening_matrix - ) - - np.save(spike_amplitudes_path, spike_amplitudes, allow_pickle=False) - np.save(spike_units_path, spike_units, allow_pickle=False) - np.save(templates_path, templates, allow_pickle=False) - np.save(spike_templates_path, spike_templates, allow_pickle=False) - np.save(inverse_whitening_matrix_path, inverse_whitening_matrix, allow_pickle=False) - - obtained = write_nwb.read_spike_amplitudes_to_dictionary( - spike_amplitudes_path, - spike_units_path, - templates_path, - spike_templates_path, - inverse_whitening_matrix_path - ) - - assert np.allclose(expected_amplitudes[:3], obtained[0]) - assert np.allclose(expected_amplitudes[3:], obtained[1]) - - -@pytest.mark.parametrize("spike_times_mapping, spike_amplitudes_mapping, expected", [ - - ({12345: np.array([0, 1, 2, -1, 5, 4])}, # spike_times_mapping - - {12345: np.array([0, 1, 2, 3, 4, 5])}, # spike_amplitudes_mapping - - ({12345: np.array([0, 1, 2, 4, 5])}, # expected - {12345: np.array([0, 1, 2, 5, 4])})), - - ({12345: np.array([0, 1, 2, -1, 5, 4]), # spike_times_mapping - 54321: np.array([5, 4, 3, -1, 6])}, - - {12345: np.array([0, 1, 2, 3, 4, 5]), # spike_amplitudes_mapping - 54321: np.array([0, 1, 2, 3, 4])}, - - ({12345: np.array([0, 1, 2, 4, 5]), # expected - 54321: np.array([3, 4, 5, 6])}, - {12345: np.array([0, 1, 2, 5, 4]), - 54321: np.array([2, 1, 0, 4])})), -]) -def test_filter_and_sort_spikes(spike_times_mapping, spike_amplitudes_mapping, expected): - expected_spike_times, expected_spike_amplitudes = expected - - obtained_spike_times, obtained_spike_amplitudes = write_nwb.filter_and_sort_spikes(spike_times_mapping, - spike_amplitudes_mapping) - - np.testing.assert_equal(obtained_spike_times, expected_spike_times) - np.testing.assert_equal(obtained_spike_amplitudes, expected_spike_amplitudes) - - -@pytest.mark.parametrize("roundtrip", [True, False]) -@pytest.mark.parametrize("probes, parsed_probe_data, expected_units_table", [ - ([{"id": 1234, - "name": "probeA", - "sampling_rate": 29999.9655245905, - "lfp_sampling_rate": 2499.99712704921, - "temporal_subsampling_factor": 2.0, - "lfp": {}, - "spike_times_path": "/dummy_path", - "spike_clusters_files": "/dummy_path", - "mean_waveforms_path": "/dummy_path", - "channels": [{"id": 1, - "probe_id": 1234, - "valid_data": True, - "local_index": 0, - "probe_vertical_position": 10, - "probe_horizontal_position": 10, - "anterior_posterior_ccf_coordinate": 15.0, - "dorsal_ventral_ccf_coordinate": 20.0, - "left_right_ccf_coordinate": 25.0, - "manual_structure_acronym": "CA1", - "impedence": np.nan, - "filtering": "Unknown"}, - {"id": 2, - "probe_id": 1234, - "valid_data": True, - "local_index": 1, - "probe_vertical_position": 20, - "probe_horizontal_position": 20, - "anterior_posterior_ccf_coordinate": 25.0, - "dorsal_ventral_ccf_coordinate": 30.0, - "left_right_ccf_coordinate": 35.0, - "manual_structure_acronym": "CA3", - "impedence": np.nan, - "filtering": "Unknown"}], - - "units": [{"id": 777, - "local_index": 7, - "quality": "good", - "a": 0.5, - "b": 5}, - {"id": 778, - "local_index": 9, - "quality": "noise", - "a": 1.0, - "b": 10}]}], - - (pd.DataFrame({"id": [777, 778], "local_index": [7, 9], # units_table - "a": [0.5, 1.0], "b": [5, 10]}).set_index(keys="id", drop=True), - {777: np.array([0., 1., 2., -1., 5., 4.]), # spike_times - 778: np.array([5., 4., 3., -1., 6.])}, - {777: np.array([0., 1., 2., 3., 4., 5.]), # spike_amplitudes - 778: np.array([0., 1., 2., 3., 4.])}, - {777: np.array([1., 2., 3., 4., 5., 6.]), # mean_waveforms - 778: np.array([1., 2., 3., 4., 5.])}), - - pd.DataFrame({"id": [777, 778], "local_index": [7, 9], # units_table - "a": [0.5, 1.0], "b": [5, 10], - "spike_times": [[0., 1., 2., 4., 5.], [3., 4., 5., 6.]], - "spike_amplitudes": [[0., 1., 2., 5., 4.], [2., 1., 0., 4.]], - "waveform_mean": [[1., 2., 3., 4., 5., 6.], [1., 2., 3., 4., 5.]]} - ).set_index(keys="id", drop=True)), -]) -def test_add_probewise_data_to_nwbfile(monkeypatch, nwbfile, roundtripper, - roundtrip, probes, parsed_probe_data, - expected_units_table): - - def mock_parse_probes_data(probes): - return parsed_probe_data - - monkeypatch.setattr(write_nwb, "parse_probes_data", mock_parse_probes_data) - nwbfile = write_nwb.add_probewise_data_to_nwbfile(nwbfile, probes) - - if roundtrip: - obt = roundtripper(nwbfile, EcephysNwbSessionApi) - else: - obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) - - pd.testing.assert_frame_equal(obt.nwbfile.units.to_dataframe(), - expected_units_table) - - -@pytest.mark.parametrize("roundtrip", [True, False]) -@pytest.mark.parametrize("eye_tracking_rig_geometry, expected", [ - ({"monitor_position_mm": [1., 2., 3.], - "monitor_rotation_deg": [4., 5., 6.], - "camera_position_mm": [7., 8., 9.], - "camera_rotation_deg": [10., 11., 12.], - "led_position": [13., 14., 15.], - "equipment": "test_rig"}, - - # Expected - {"geometry": pd.DataFrame({"monitor_position_mm": [1., 2., 3.], - "monitor_rotation_deg": [4., 5., 6.], - "camera_position_mm": [7., 8., 9.], - "camera_rotation_deg": [10., 11., 12.], - "led_position_mm": [13., 14., 15.]}, - index=["x", "y", "z"]), - "equipment": "test_rig"}), -]) -def test_add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile, roundtripper, - roundtrip, - eye_tracking_rig_geometry, - expected): - - nwbfile = write_nwb.add_eye_tracking_rig_geometry_data_to_nwbfile(nwbfile, - eye_tracking_rig_geometry) - if roundtrip: - obt = roundtripper(nwbfile, EcephysNwbSessionApi) - else: - obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) - obtained_metadata = obt.get_rig_metadata() - - pd.testing.assert_frame_equal(obtained_metadata["geometry"], expected["geometry"], check_like=True) - assert obtained_metadata["equipment"] == expected["equipment"] - - -@pytest.mark.parametrize("roundtrip", [True, False]) -@pytest.mark.parametrize(("eye_tracking_frame_times, eye_dlc_tracking_data, " - "eye_gaze_data, expected_pupil_data, expected_gaze_data"), [ - ( - # eye_tracking_frame_times - pd.Series([3., 4., 5., 6., 7.]), - # eye_dlc_tracking_data - {"pupil_params": create_preload_eye_tracking_df(np.full((5, 5), 1.)), - "cr_params": create_preload_eye_tracking_df(np.full((5, 5), 2.)), - "eye_params": create_preload_eye_tracking_df(np.full((5, 5), 3.))}, - # eye_gaze_data - {"raw_pupil_areas": pd.Series([2., 4., 6., 8., 10.]), - "raw_eye_areas": pd.Series([3., 5., 7., 9., 11.]), - "raw_screen_coordinates": pd.DataFrame({"y": [2., 4., 6., 8., 10.], "x": [3., 5., 7., 9., 11.]}), - "raw_screen_coordinates_spherical": pd.DataFrame({"y": [2., 4., 6., 8., 10.], "x": [3., 5., 7., 9., 11.]}), - "new_pupil_areas": pd.Series([2., 4., np.nan, 8., 10.]), - "new_eye_areas": pd.Series([3., 5., np.nan, 9., 11.]), - "new_screen_coordinates": pd.DataFrame({"y": [2., 4., np.nan, 8., 10.], "x": [3., 5., np.nan, 9., 11.]}), - "new_screen_coordinates_spherical": pd.DataFrame({"y": [2., 4., np.nan, 8., 10.], "x": [3., 5., np.nan, 9., 11.]}), - "synced_frame_timestamps": pd.Series([3., 4., 5., 6., 7.])}, - # expected_pupil_data - pd.DataFrame({"corneal_reflection_center_x": [2.] * 5, - "corneal_reflection_center_y": [2.] * 5, - "corneal_reflection_height": [4.] * 5, - "corneal_reflection_width": [4.] * 5, - "corneal_reflection_phi": [2.] * 5, - "pupil_center_x": [1.] * 5, - "pupil_center_y": [1.] * 5, - "pupil_height": [2.] * 5, - "pupil_width": [2.] * 5, - "pupil_phi": [1.] * 5, - "eye_center_x": [3.] * 5, - "eye_center_y": [3.] * 5, - "eye_height": [6.] * 5, - "eye_width": [6.] * 5, - "eye_phi": [3.] * 5}, - index=[3., 4., 5., 6., 7.]), - # expected_gaze_data - pd.DataFrame({"raw_eye_area": [3., 5., 7., 9., 11.], - "raw_pupil_area": [2., 4., 6., 8., 10.], - "raw_screen_coordinates_x_cm": [3., 5., 7., 9., 11.], - "raw_screen_coordinates_y_cm": [2., 4., 6., 8., 10.], - "raw_screen_coordinates_spherical_x_deg": [3., 5., 7., 9., 11.], - "raw_screen_coordinates_spherical_y_deg": [2., 4., 6., 8., 10.], - "filtered_eye_area": [3., 5., np.nan, 9., 11.], - "filtered_pupil_area": [2., 4., np.nan, 8., 10.], - "filtered_screen_coordinates_x_cm": [3., 5., np.nan, 9., 11.], - "filtered_screen_coordinates_y_cm": [2., 4., np.nan, 8., 10.], - "filtered_screen_coordinates_spherical_x_deg": [3., 5., np.nan, 9., 11.], - "filtered_screen_coordinates_spherical_y_deg": [2., 4., np.nan, 8., 10.]}, - index=[3., 4., 5., 6., 7.]) - ), -]) -def test_add_eye_tracking_data_to_nwbfile(nwbfile, roundtripper, roundtrip, - eye_tracking_frame_times, - eye_dlc_tracking_data, - eye_gaze_data, - expected_pupil_data, expected_gaze_data): - nwbfile = write_nwb.add_eye_tracking_data_to_nwbfile(nwbfile, - eye_tracking_frame_times, - eye_dlc_tracking_data, - eye_gaze_data) - - if roundtrip: - obt = roundtripper(nwbfile, EcephysNwbSessionApi) - else: - obt = EcephysNwbSessionApi.from_nwbfile(nwbfile) - obtained_pupil_data = obt.get_pupil_data() - obtained_screen_gaze_data = obt.get_screen_gaze_data(include_filtered_data=True) - - pd.testing.assert_frame_equal(obtained_pupil_data, - expected_pupil_data, check_like=True) - pd.testing.assert_frame_equal(obtained_screen_gaze_data, - expected_gaze_data, check_like=True) diff --git a/allensdk/test/brain_observatory/extract_running_speed/__init__.py b/allensdk/test/brain_observatory/extract_running_speed/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py b/allensdk/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py deleted file mode 100644 index bcab4ef4d5..0000000000 --- a/allensdk/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py +++ /dev/null @@ -1,88 +0,0 @@ -import os -from pathlib import Path -import json -import subprocess as sp - -import pytest -import pandas as pd - -@pytest.fixture -def use_temp_dir(tmpdir_factory): - def fn(data_dir, tempdir_name, input_json_fname, output_json_fname, module, renamer_cb): - - temp_dir = str(tmpdir_factory.mktemp(tempdir_name)) - - input_json_path = os.path.join(data_dir, input_json_fname) - new_input_json_path = os.path.join(temp_dir, input_json_fname) - - output_json_path = os.path.join(temp_dir, output_json_fname) - - with open(input_json_path, 'r') as input_json: - input_json_data = json.load(input_json) - - input_json_data = renamer_cb(input_json_data, data_dir, temp_dir) - - with open(new_input_json_path, 'w') as new_input_json: - json.dump(input_json_data, new_input_json) - - sp.check_call([ - 'python', '-m', module, - '--input_json', new_input_json_path, - '--output_json', output_json_path - ]) - - with open(output_json_path, 'r') as output_json: - output_json_data = json.load(output_json) - - return output_json_data - - return fn - - -DATA_DIR = os.environ.get( - "ECEPHYS_PIPELINE_DATA", - os.path.join("/", "allen", "aibs", "informatics", "module_test_data", "ecephys", "extract_running_speed"), -) - - -def reparent(path, new_parent): - return str(Path(new_parent) / Path(path).name) - - -@pytest.mark.requires_bamboo -@pytest.mark.parametrize('input_json_fname,output_json_fname,exp_fname', [ - [ - "ECEPHYS_EXTRACT_RUNNING_SPEED_QUEUE_744228101_input.json", - 'ECEPHYS_EXTRACT_RUNNING_SPEED_QUEUE_744228101ls_output.json', - '744228101_running_speeds.h5', - ] -]) -def test_extract_running_speed_module( - use_temp_dir, input_json_fname, output_json_fname, exp_fname -): - - def renamer(input_json_data, data_dir, temp_dir): - input_json_data['sync_h5_path'] = reparent(input_json_data['sync_h5_path'], data_dir) - input_json_data['stimulus_pkl_path'] = reparent(input_json_data['stimulus_pkl_path'], data_dir) - - input_json_data['output_path'] = reparent(input_json_data['output_path'], temp_dir) - - return input_json_data - - output_json_data = use_temp_dir( - DATA_DIR, 'test_extract_running_speed', input_json_fname, output_json_fname, - 'allensdk.brain_observatory.extract_running_speed', renamer - ) - expected_path = os.path.join(DATA_DIR, exp_fname) - assert os.path.exists(expected_path) - - # Commenting this out for now -- this regression test is expected to fail - # TODO: Path forward for new regression tests - # expected_velos = pd.read_hdf(expected_path, key="running_speed") - # expected_raw = pd.read_hdf(expected_path, key="raw_data") - - # obtained_velos = pd.read_hdf(output_json_data['output_path'], key="running_speed") - # obtained_raw = pd.read_hdf(output_json_data['output_path'], key="raw_data") - - # pd.testing.assert_frame_equal(expected_velos, obtained_velos, check_like=True) - # pd.testing.assert_frame_equal(expected_raw, obtained_raw, check_like=True) diff --git a/allensdk/test/brain_observatory/gaze_mapping/__init__.py b/allensdk/test/brain_observatory/gaze_mapping/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/gaze_mapping/test_gaze_mapping.py b/allensdk/test/brain_observatory/gaze_mapping/test_gaze_mapping.py deleted file mode 100644 index e269921362..0000000000 --- a/allensdk/test/brain_observatory/gaze_mapping/test_gaze_mapping.py +++ /dev/null @@ -1,344 +0,0 @@ -import pytest - -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.gaze_mapping import _gaze_mapper as gm - - -@pytest.fixture() -def gaze_mapper_fixture(request): - default_params = { - "monitor_position": np.array([0, 0, 0]), - "monitor_rotations": np.array([0, 0, 0]), - "led_position": np.array([0, 0, 0]), - "camera_position": np.array([0, 0, 0]), - "camera_rotations": np.array([0, 0, 0]), - "eye_radius": 0.1682, - "cm_per_pixel": (10.2 / 10000.0) - } - default_params.update(request.param) - return gm.GazeMapper(**default_params) - - -@pytest.fixture() -def rig_component_fixture(request): - default_params = { - "position_in_eye_coord_frame": np.array([0, 0, 0]), - "rotations_in_self_coord_frame": np.array([0, 0, 0]) - } - default_params.update(request.param) - return gm.EyeTrackingRigObject(**default_params) - - -# ======== EyeTrackingRigObject tests ======== -@pytest.mark.parametrize('rig_component_fixture,expected', [ - ({"position_in_eye_coord_frame": [1, 0, 0]}, - [[0, 0, -1], - [-1, 0, 0], - [0, 1, 0]]), - - ({"position_in_eye_coord_frame": [0, 1, 0]}, - [[1, 0, 0], - [0, 0, -1], - [0, 1, 0]]), - - ({"position_in_eye_coord_frame": [0, 0, 1]}, - [[0, -1, 0], - [-1, 0, 0], - [0, 0, -1]]), -], indirect=['rig_component_fixture']) -def test_generate_self_to_eye_frame_xform(rig_component_fixture, expected): - obtained = rig_component_fixture.generate_self_to_eye_frame_xform() - assert np.allclose(obtained.as_matrix(), expected) - - -# ======== GazeMapper tests ======== -@pytest.mark.parametrize('gaze_mapper_fixture,expected', [ - # Simple 2D scenarios - ({"led_position": np.array([100, 0, 50])}, np.array([0.08417078, 0, 0.04208539])), - ({"led_position": np.array([50, 0, 20])}, np.array([0.08424169, 0, 0.03369668])), - # 3D scenarios - ({"led_position": np.array([246, 92.3, 52.6])}, np.array([0.07876523, 0.02955297, 0.01684167])), - ({"led_position": np.array([258.9, -61.2, 32.1])}, np.array([0.08187032, -0.01935289, 0.01015078])) - -], indirect=["gaze_mapper_fixture"]) -def test_compute_cr_coordinate(gaze_mapper_fixture, expected): - obtained = gaze_mapper_fixture.compute_cr_coordinate() - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("gaze_mapper_fixture, method_inputs, expected", [ - ({"monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([150, 0, 0]), - "led_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[300, 300], [350, 350], [325, 325], [290, 290]]), - "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [300, 300]])}, - [[-0.16820, 0.0000, 0.0000], - [-0.15195, -0.0510, 0.0510], - [-0.16428, -0.0255, 0.0255], - [-0.16758, 0.0102, -0.0102]]), - - # Test when params result in estimated pupil location outside of eye - ({"monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([150, 0, 0]), - "led_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[900, 900], [350, 350], [325, 325], [250, 250], [100, 100]]), - "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [300, 300], [800, 800]])}, - [[np.nan, np.nan, np.nan], - [-0.15195, -0.0510, 0.0510], - [-0.16428, -0.0255, 0.0255], - [-0.15195, 0.051, -0.051], - [np.nan, np.nan, np.nan]]), - -], indirect=['gaze_mapper_fixture']) -def test_pupil_pos_in_eye_coords(gaze_mapper_fixture, - method_inputs, - expected): - obtained = gaze_mapper_fixture.pupil_pos_in_eye_coords(**method_inputs) - assert np.allclose(obtained, expected, rtol=1e-4, equal_nan=True) - - -@pytest.mark.parametrize("gaze_mapper_fixture, method_inputs, expected", [ - ({"monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([150, 0, 0]), - "led_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[300, 300], [350, 350], [325, 325], [290, 290]]), - "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [300, 300]])}, - [[0, 0], - [-57.057, -57.057], - [-26.386, -26.386], - [10.3472, 10.347]]), - - # Test when params result in estimated pupil location outside of eye - ({"monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([150, 0, 0]), - "led_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[300, 300], [900, 900], [325, 325], [200, 200]]), - "cam_cr_params": np.array([[300, 300], [300, 300], [300, 300], [800, 800]])}, - [[0, 0], - [np.nan, np.nan], - [-26.386, -26.386], - [np.nan, np.nan]]), - -], indirect=['gaze_mapper_fixture']) -def test_pupil_position_on_monitor_in_cm(gaze_mapper_fixture, - method_inputs, - expected): - obtained = gaze_mapper_fixture.pupil_position_on_monitor_in_cm(**method_inputs) - assert np.allclose(obtained, expected, rtol=1e-4, equal_nan=True) - - -@pytest.mark.parametrize("gaze_mapper_fixture, method_inputs, expected", [ - ({"monitor_position": np.array([170, 0, 0])}, # rig geometry parameters - {"pupil_pos_on_monitor_in_cm": np.array([[2, 5]])}, - np.array([[0.6740368979845053, 1.6845678100189891]])), # expected - - ({"monitor_position": np.array([100, 0, 0])}, - {"pupil_pos_on_monitor_in_cm": np.array([[5, 6], [8, 9]])}, - np.array([[2.862405226111748, 3.429356585864454], - [4.573921259900861, 5.126473695179203]])) -], indirect=['gaze_mapper_fixture']) -def test_pupil_position_on_monitor_in_degrees(gaze_mapper_fixture, - method_inputs, - expected): - obtained = gaze_mapper_fixture.pupil_position_on_monitor_in_degrees( - **method_inputs - ) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize('gaze_mapper_fixture,ellipse_fits,expected,deg_diff_tolerance', [ - # General sanity check using extreme pupil values to see if output - # screen mapped coordinates are generally in the right quadrant/hemisphere. - - # As if looking at top half of screen - ({"led_position": np.array([135, 0, 0]), # rig geometry parameters - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[300, 200]]), # Pupil center (x, y) coords - "cam_cr_params": np.array([[300, 300]])}, # Corneal reflect (x, y) coords - np.array([[0, 1]]), # Expected general direction of outputs in unit vector form - 0), # Allowed angle tolerance (in degrees) between `expected - obtained` - - # As if looking at bottom half of screen - ({"led_position": np.array([135, 0, 0]), - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[300, 400]]), - "cam_cr_params": np.array([[300, 300]])}, - np.array([[0, -1]]), - 0), - - # As if looking at right side of screen - ({"led_position": np.array([135, 0, 0]), - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[200, 300]]), - "cam_cr_params": np.array([[300, 300]])}, - np.array([[1, 0]]), - 0), - - # As if looking at left side of screen - ({"led_position": np.array([135, 0, 0]), - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[400, 300]]), - "cam_cr_params": np.array([[300, 300]])}, - np.array([[-1, 0]]), - 0), - - # As if looking at upper right quadrant of screen - ({"led_position": np.array([135, 0, 0]), - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[200, 200]]), - "cam_cr_params": np.array([[300, 300]])}, - np.array([[1, 1]]), - 0), - - # As if looking at lower right quadrant of screen - ({"led_position": np.array([135, 0, 0]), - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[200, 400]]), - "cam_cr_params": np.array([[300, 300]])}, - np.array([[1, -1]]), - 0), - - # As if looking to upper right quadrant of screen - ({"led_position": np.array([135, 0, 0]), - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[400, 200]]), - "cam_cr_params": np.array([[300, 300]])}, - np.array([[-1, 1]]), - 0), - - # As if looking at lower left quadrant of screen - ({"led_position": np.array([135, 0, 0]), - "monitor_position": np.array([170, 0, 0]), - "camera_position": np.array([130, 0, 0])}, - {"cam_pupil_params": np.array([[400, 400]]), - "cam_cr_params": np.array([[300, 300]])}, - np.array([[-1, -1]]), - 0), - -], indirect=["gaze_mapper_fixture"]) -def test_mapping_gives_sane_outputs(gaze_mapper_fixture, ellipse_fits, expected, deg_diff_tolerance): - obtained = gaze_mapper_fixture.pupil_position_on_monitor_in_cm(**ellipse_fits) - for obt, exp in zip(obtained, expected): - # Check that angle between the obtained monitor coordinate and expected - # general direction is not more than the `deg_diff_tolerance`. - obt_unit_vec = obt / np.linalg.norm(obt) - angle_between = np.arccos(np.clip(np.dot(obt_unit_vec, exp), -1.0, 1.0)) - assert angle_between <= np.radians(deg_diff_tolerance) - - -# ======== Standalone function tests ======== -@pytest.mark.parametrize('ellipse_params,expected', [ - (pd.DataFrame({"height": [1, 1, 1, 1], "width": [2, 2, 2, 2]}), - pd.Series([4 * np.pi] * 4)), - - (pd.DataFrame({"height": [2, 2, 2, 2], "width": [1, 1, 1, 1]}), - pd.Series([4 * np.pi] * 4)), - - (pd.DataFrame({"height": [2, 4, 8, 16], "width": [1, 3, 9, 27]}), - pd.Series([4 * np.pi, 16 * np.pi, 81 * np.pi, 729 * np.pi])), - - (pd.DataFrame({"height": [1, 3, 9, 27], "width": [2, 4, 8, 16]}), - pd.Series([4 * np.pi, 16 * np.pi, 81 * np.pi, 729 * np.pi])), - - (pd.DataFrame({"height": [np.nan, 3, np.nan, 27], - "width": [2, 4, np.nan, np.nan]}), - pd.Series([4 * np.pi, 16 * np.pi, np.nan, 729 * np.pi])), -]) -def test_compute_circular_areas(ellipse_params, expected): - obtained = gm.compute_circular_areas(ellipse_params) - - assert np.allclose(obtained, expected, equal_nan=True) - - -@pytest.mark.parametrize('ellipse_params, expected', [ - (pd.DataFrame({"height": [1, 2, 3, 4], "width": [4, 3, 2, 1]}), - pd.Series([4 * np.pi, 6 * np.pi, 6 * np.pi, 4 * np.pi])), - - (pd.DataFrame({"height": [np.nan, 7, 11, 12, np.nan], - "width": [5, 3, 11, np.nan, np.nan]}), - pd.Series([np.nan, np.pi * 21, np.pi * 121, np.nan, np.nan])) -]) -def test_compute_elliptical_areas(ellipse_params, expected): - obtained = gm.compute_elliptical_areas(ellipse_params) - - assert np.allclose(obtained, expected, equal_nan=True) - - -@pytest.mark.parametrize("function_inputs,expected", [ - ({"plane_normal": np.array([1, 1, 1]), - "plane_point": np.array([1, 1, -5]), - "line_vectors": np.array([[6, 1, 4]]), - "line_points": np.array([[-5, 1, -1]])}, - np.array([-3.90909091, 1.18181818, -0.27272727])), - - ({"plane_normal": np.array([1, 0, 0]), - "plane_point": np.array([10, 0, 0]), - "line_vectors": np.array([[1, 0, 0], [1, 1, 1], [1, 1, 0]]), - "line_points": np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])}, - np.array([[10, 0, 0], [10, 10, 10], [10, 10, 0]])), - - ({"plane_normal": np.array([1, 0, 0]), - "plane_point": np.array([10, 0, 0]), - "line_vectors": np.array([[1, 0, 0], [1, 1, 1], [1, 1, 0], [1, 0, 0], [1, 0, 0]]), - "line_points": np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])}, - np.array([[10, 0, 0], [10, 10, 10], [10, 10, 0], [10, 0, 0], [10, 0, 0]])), - - ({"plane_normal": np.array([1, 1, 1]), - "plane_point": np.array([10, 10, 10]), - "line_vectors": np.array([[1, 1, 1], [1, 1, 1]]), - "line_points": np.array([[1, 2, 3], [0, 0, 0]])}, - np.array([[9, 10, 11], [10, 10, 10]])), - - ({"plane_normal": np.array([2, 1, -4]), - "plane_point": np.array([1, 1, -0.25]), - "line_vectors": np.array([[1, 3, 1]]), - "line_points": np.array([[0, 2, 0]])}, - np.array([[2, 8, 2]])), -]) -def test_project_to_plane(function_inputs, expected): - obtained = gm.project_to_plane(**function_inputs) - print(obtained) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("function_inputs, expected", [ - ({'x_rotation': 0.5, - 'y_rotation': 0.5, - 'z_rotation': 0.5}, - [[0.77015115, -0.21902415, 0.59907898], - [0.42073549, 0.88034656, -0.21902415], - [-0.47942554, 0.42073549, 0.77015115]]), - - ({'x_rotation': 0.5, - 'y_rotation': 0, - 'z_rotation': 0}, - [[1.0, 0.0, 0.0], - [0.0, 0.87758256, -0.47942554], - [0.0, 0.47942554, 0.87758256]]), - - ({'x_rotation': 0, - 'y_rotation': 0.5, - 'z_rotation': 0}, - [[0.87758256, 0.0, 0.47942554], - [0.0, 1.0, 0.0], - [-0.47942554, 0.0, 0.87758256]]), - - ({'x_rotation': 0, - 'y_rotation': 0, - 'z_rotation': 0.5}, - [[0.87758256, -0.47942554, 0.0], - [0.47942554, 0.87758256, 0.0], - [0.0, 0.0, 1.0]]), -]) -def test_generate_object_rotation_xform(function_inputs, expected): - obtained = gm.generate_object_rotation_xform(**function_inputs) - assert np.allclose(obtained.as_matrix(), expected) diff --git a/allensdk/test/brain_observatory/gaze_mapping/test_main.py b/allensdk/test/brain_observatory/gaze_mapping/test_main.py deleted file mode 100644 index c814b85174..0000000000 --- a/allensdk/test/brain_observatory/gaze_mapping/test_main.py +++ /dev/null @@ -1,188 +0,0 @@ -from pathlib import Path -import pytest - -import numpy as np -import pandas as pd - -import allensdk.brain_observatory.gaze_mapping.__main__ as main - -from allensdk.brain_observatory import sync_utilities as su -from allensdk.brain_observatory.sync_dataset import Dataset - - -def create_sample_ellipse_hdf(output_file: Path, - cr_data: pd.DataFrame, - eye_data: pd.DataFrame, - pupil_data: pd.DataFrame): - cr_data.to_hdf(output_file, key='cr', mode='w') - eye_data.to_hdf(output_file, key='eye', mode='a') - pupil_data.to_hdf(output_file, key='pupil', mode='a') - - -@pytest.fixture -def ellipse_fits_fixture(tmp_path, request) -> dict: - cr = {"center_x": [300, 305, 295, 310, 280], - "center_y": [300, 305, 295, 310, 280], - "width": [7, 8, 6, 7, 10], - "height": [6, 9, 5, 6, 8], - "phi": [0, 0.1, 0.15, 0.1, 0]} - - eye = {"center_x": [300, 305, 295, 310, 280], - "center_y": [300, 305, 295, 310, 280], - "width": [150, 155, 160, 150, 155], - "height": [120, 115, 120, 110, 100], - "phi": [0, 0.1, 0.15, 0.1, 0]} - - pupil = {"center_x": [300, 305, 295, 310, 280], - "center_y": [300, 305, 295, 310, 280], - "width": [30, 35, 40, 25, 50], - "height": [25, 27, 30, 20, 45], - "phi": [0, 0.1, 0.15, 0.1, 0]} - - test_dir = tmp_path / "test_load_ellipse_fit_params" - test_dir.mkdir() - - if request.param["create_good_fits_file"]: - test_path = test_dir / "good_ellipse_fits.h5" - else: - test_path = test_dir / "bad_ellipse_fits.h5" - pupil = {"center_x": [300], "center_y": [300], "width": [30], - "height": [25], "phi": [0]} - - cr = pd.DataFrame(cr) - eye = pd.DataFrame(eye) - pupil = pd.DataFrame(pupil) - - create_sample_ellipse_hdf(test_path, cr, eye, pupil) - - return {"cr": pd.DataFrame(cr), - "eye": pd.DataFrame(eye), - "pupil": pd.DataFrame(pupil), - "file_path": test_path} - - -@pytest.mark.parametrize("ellipse_fits_fixture, expect_good_file", [ - ({"create_good_fits_file": True}, True), - ({"create_good_fits_file": False}, False) -], indirect=["ellipse_fits_fixture"]) -def test_load_ellipse_fit_params(ellipse_fits_fixture: dict, expect_good_file: bool): - expected = {"cr_params": pd.DataFrame(ellipse_fits_fixture["cr"]).astype(float), - "pupil_params": pd.DataFrame(ellipse_fits_fixture["pupil"]).astype(float), - "eye_params": pd.DataFrame(ellipse_fits_fixture["eye"]).astype(float)} - - if expect_good_file: - obtained = main.load_ellipse_fit_params(ellipse_fits_fixture["file_path"]) - for key in expected.keys(): - pd.testing.assert_frame_equal(obtained[key], expected[key]) - else: - with pytest.raises(RuntimeError, match="ellipse fits don't match"): - obtained = main.load_ellipse_fit_params(ellipse_fits_fixture["file_path"]) - - -@pytest.mark.parametrize("input_args, expected", [ - ({"input_file": Path("input_file.h5"), - "session_sync_file": Path("sync_file.h5"), - "output_file": Path("output_file.h5"), - "monitor_position_x_mm": 100.0, - "monitor_position_y_mm": 500.0, - "monitor_position_z_mm": 300.0, - "monitor_rotation_x_deg": 30, - "monitor_rotation_y_deg": 60, - "monitor_rotation_z_deg": 90, - "camera_position_x_mm": 200.0, - "camera_position_y_mm": 600.0, - "camera_position_z_mm": 700.0, - "camera_rotation_x_deg": 20, - "camera_rotation_y_deg": 180, - "camera_rotation_z_deg": 5, - "led_position_x_mm": 800.0, - "led_position_y_mm": 900.0, - "led_position_z_mm": 1000.0, - "eye_radius_cm": 0.1682, - "cm_per_pixel": 0.0001, - "equipment": "Rig A", - "date_of_acquisition": "Some Date", - "eye_video_file": Path("eye_video.avi")}, - - {"pupil_params": "pupil_params_placeholder", - "cr_params": "cr_params_placeholder", - "eye_params": "eye_params_placeholder", - "session_sync_file": Path("sync_file.h5"), - "output_file": Path("output_file.h5"), - "monitor_position": np.array([10.0, 50.0, 30.0]), - "monitor_rotations": np.array([np.pi / 6, np.pi / 3, np.pi / 2]), - "camera_position": np.array([20.0, 60.0, 70.0]), - "camera_rotations": np.array([np.pi / 9, np.pi, np.pi / 36]), - "led_position": np.array([80.0, 90.0, 100.0]), - "eye_radius_cm": 0.1682, - "cm_per_pixel": 0.0001, - "equipment": "Rig A", - "date_of_acquisition": "Some Date", - "eye_video_file": Path("eye_video.avi")} - ), - -]) -def test_preprocess_input_args(monkeypatch, input_args: dict, expected: dict): - def mock_load_ellipse_fit_params(*args, **kwargs): - return {"pupil_params": "pupil_params_placeholder", - "cr_params": "cr_params_placeholder", - "eye_params": "eye_params_placeholder"} - - monkeypatch.setattr(main, "load_ellipse_fit_params", - mock_load_ellipse_fit_params) - - obtained = main.preprocess_input_args(input_args) - - for key in expected.keys(): - if isinstance(obtained[key], np.ndarray): - assert np.allclose(obtained[key], expected[key]) - else: - assert obtained[key] == expected[key] - - -@pytest.mark.parametrize("pupil_params_rows, expected, expect_fail", [ - (5, pd.Series([1, 2, 3, 4, 5]), False), - (4, None, True) -]) -def test_load_sync_file_timings(monkeypatch, pupil_params_rows, expected, expect_fail): - def mock_get_synchronized_frame_times(*args, **kwargs): - return pd.Series([1, 2, 3, 4, 5]) - - monkeypatch.setattr(main.su, "get_synchronized_frame_times", - mock_get_synchronized_frame_times) - - if expect_fail: - with pytest.raises(RuntimeError, match="number of camera sync pulses"): - main.load_sync_file_timings(Path("."), pupil_params_rows, True) - - else: - obtained = main.load_sync_file_timings(Path("."), pupil_params_rows, True) - assert expected.equals(obtained) - - -def test_load_truncated_timestamps(monkeypatch): - """ - Test that load_sync_file_timings handles the truncate_timestamps - arg correctly - """ - - class MockDataset(Dataset): - def __init__(self, path): - pass - - def get_edges(self, kind, keys, units='seconds'): - return pd.Series([1, 2, 3, 4, 500, 501, 502, 503], dtype=np.int64) - - - with monkeypatch.context() as ctx: - ctx.setattr(su, "Dataset", MockDataset) - timestamps = main.load_sync_file_timings("", 8, False) - expected = pd.Series([1, 2, 3, 4, 500, 501, 502, 503], dtype=np.int64) - assert timestamps.equals(expected) - - timestamps = main.load_sync_file_timings("", 4, True) - expected = pd.Series([1, 2, 3, 4], dtype=np.int64) - assert timestamps.equals(expected) - - with pytest.raises(RuntimeError): - timestamps = main.load_sync_file_timings("", 8, True) diff --git a/allensdk/test/brain_observatory/nwb/__init__.py b/allensdk/test/brain_observatory/nwb/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/nwb/conftest.py b/allensdk/test/brain_observatory/nwb/conftest.py deleted file mode 100644 index 755b0e08cb..0000000000 --- a/allensdk/test/brain_observatory/nwb/conftest.py +++ /dev/null @@ -1,12 +0,0 @@ -import sys - -import pytest - - -def pytest_ignore_collect(path, config): - ''' The brain_observatory.ecephys submodule uses python 3.6 features that may not be backwards compatible! - ''' - - if sys.version_info < (3, 6): - return True - return False diff --git a/allensdk/test/brain_observatory/nwb/test_nwb.py b/allensdk/test/brain_observatory/nwb/test_nwb.py deleted file mode 100644 index 48ed3f65be..0000000000 --- a/allensdk/test/brain_observatory/nwb/test_nwb.py +++ /dev/null @@ -1,57 +0,0 @@ -import warnings -import h5py -import pytest - -from allensdk.brain_observatory.nwb import check_nwbfile_version - - -@pytest.fixture -def version_only_nwbfile_fixture(tmp_path, request): - - nwb_version = request.param.get("nwb_version", "2.2.2") - - nwbfile_path = tmp_path / "version_only_nwbfile.nwb" - with h5py.File(nwbfile_path, "w") as f: - if nwb_version is not None: - # pynwb 1.x saves version as a dataset - # and in the format "NWB-x.y.z" - if tuple(nwb_version.split(".")) < ("2", "0", "0"): - f.create_dataset("nwb_version", data=f"NWB-{nwb_version}") - # pynwb 2.x saves version as an attribute - elif tuple(nwb_version.split(".")) >= ("2", "0", "0"): - f.attrs["nwb_version"] = nwb_version - else: - f.create_dataset("something_completely_unrelated", data="42") - - return str(nwbfile_path) - - -@pytest.mark.parametrize("version_only_nwbfile_fixture, min_desired_version" - ", warns, warn_msg, invalid_nwb", [ - ({"nwb_version": None}, "2.2.2" , True, "Warn msg A", True), - ({"nwb_version": "0.9.0c"}, "2.2.2" , True, "Warn msg B", False), - ({"nwb_version": "2"}, "2.2.2", True, "Warn msg C", False), - ({"nwb_version": "2.0b"}, "2.2.2", True, "Warn msg D", False), - ({"nwb_version": "2.2.2"}, "2.2.2", False, None, False), - ({"nwb_version": "2.2.8"}, "2.2.2", False, None, False), - ({"nwb_version": "3.0"}, "2.2.2", False, None, False) -], indirect=["version_only_nwbfile_fixture"]) -def test_check_nwbfile_version(version_only_nwbfile_fixture, - min_desired_version, warns, - warn_msg, invalid_nwb): - - with warnings.catch_warnings(record=True) as w: - warnings.simplefilter("always") - - check_nwbfile_version(nwbfile_path=version_only_nwbfile_fixture, - desired_minimum_version=min_desired_version, - warning_msg=warn_msg) - if warns: - if invalid_nwb: - assert ("neither a 'nwb_version' field " - "nor dataset could be found" - in str(w[-1].message)) - else: - assert warn_msg in str(w[-1].message) - else: - assert len(w) == 0 diff --git a/allensdk/test/brain_observatory/nwb/test_nwb_api.py b/allensdk/test/brain_observatory/nwb/test_nwb_api.py deleted file mode 100644 index 059474f149..0000000000 --- a/allensdk/test/brain_observatory/nwb/test_nwb_api.py +++ /dev/null @@ -1,11 +0,0 @@ -import os - -import pytest - -from allensdk.brain_observatory.nwb.nwb_api import NwbApi - - -def test_missing_file(tmpdir_factory): - path = os.path.join(str(tmpdir_factory.mktemp('nwb_api_missing_file_test')), 'foo.nwb') - with pytest.raises(OSError): - NwbApi.from_path(path) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/nwb/test_nwb_utils.py b/allensdk/test/brain_observatory/nwb/test_nwb_utils.py deleted file mode 100644 index 30e0df0905..0000000000 --- a/allensdk/test/brain_observatory/nwb/test_nwb_utils.py +++ /dev/null @@ -1,30 +0,0 @@ -import pytest -from allensdk.brain_observatory.nwb import nwb_utils - - -@pytest.mark.parametrize("input_cols, possible_names, expected_intersection", [ - (['duration', 'end_frame', 'image_index', 'image_name'], - {'stimulus_name', 'image_name'}, 'image_name'), - (['duration', 'end_frame', 'image_index', 'stimulus_name'], - {'stimulus_name', 'image_name'}, 'stimulus_name') -]) -def test_get_stimulus_name_column(input_cols, possible_names, - expected_intersection): - column_name = nwb_utils.get_column_name(input_cols, possible_names) - assert column_name == expected_intersection - - -@pytest.mark.parametrize("input_cols, possible_names, expected_excep_cols", [ - (['duration', 'end_frame', 'image_index'], {'stimulus_name', 'image_name'}, - []), - (['duration', 'end_frame', 'image_index', 'image_name', 'stimulus_name'], - {'stimulus_name', 'image_name'}, - ['stimulus_name', 'image_name']) -]) -def test_get_stimulus_name_column_exceptions(input_cols, - possible_names, - expected_excep_cols): - with pytest.raises(KeyError) as error: - nwb_utils.get_column_name(input_cols, possible_names) - for expected_value in expected_excep_cols: - assert expected_value in str(error.value) diff --git a/allensdk/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py b/allensdk/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py deleted file mode 100644 index ffc597b34c..0000000000 --- a/allensdk/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py +++ /dev/null @@ -1,309 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import os - -import pytest - -from scipy.ndimage.interpolation import zoom -import scipy.stats as stats -import numpy as np - -from allensdk.brain_observatory.receptive_field_analysis import chisquarerf as chi - - -@pytest.fixture -def rf_events(): - - np.random.seed(12) - - def make(receptive_field_mask, lsn): - activity = np.logical_or(lsn == 255, lsn==0) - return np.logical_and(activity, receptive_field_mask).sum(axis=(1, 2))[:, None] - - return make - - -@pytest.fixture -def locally_sparse_noise(): - - def make(ntr, nr, nc): - return np.around(np.random.rand(ntr, nr, nc)*255).astype(int) - - return make - - -@pytest.fixture -def rf_mask(): - - def make(nr, nc, slices): - mask = np.zeros((nr, nc)) - mask[slices] = 1 - return mask - - return make - - -@pytest.fixture -def exclusion_mask(): - mask = np.zeros((4, 4, 2)) - mask[:, :2, :] = 1 - return mask - - -@pytest.fixture -def events_per_pixel(): - - epp = np.zeros((2, 4, 4, 2)) - epp[0, 0, 0, 0] = 2 - epp[0, 0, 0, 1] = 3 - epp[1, 3, 3, 0] = 5 - epp[1, 1, 0, 0] = 4 - - return epp - - -@pytest.fixture -def trials_per_pixel(): - - tpp = np.zeros((4, 4, 2)) - tpp[:, :, 0] = 2 - tpp[:, :, 1] = 0 - - return tpp - - -# not testing d < 1 here -@pytest.mark.parametrize('r,c,d', [[2, 3, 4], [28, 16, 3], [28, 16, 2], [10, 20, 12]]) -def test_interpolate_rf(r, c, d): - - image = np.arange( r * c ).reshape([ r, c ]) - - delta_col = 1.0 / d - delta_row = c * delta_col - - obtained = chi.interpolate_RF(image, d) - grad = np.gradient(obtained) - - assert(np.allclose( grad[0], np.zeros_like(grad[0]) + delta_row )) - assert(np.allclose( grad[1], np.zeros_like(grad[1]) + delta_col )) - - -# tests integration with interpolate -# not testing case where r, c are small -@pytest.mark.parametrize('r,c,d', [[28, 16, 3], [28, 16, 2], [10, 20, 12]]) -def test_deinterpolate_rf(r, c, d): - - image = np.arange( r * c ).reshape([ r, c ]) - - interp = chi.interpolate_RF(image, d) - obt = chi.deinterpolate_RF(interp, c, r, d) - - assert(np.allclose( image, obt )) - - -def test_smooth_sta(): - - image = np.eye(10) - - smoothed = chi.smooth_STA(image) - - thresholded = smoothed.copy() - thresholded[thresholded < 0.5] = 0 - thresholded[thresholded > 0.5] = 1 - - assert(np.allclose( smoothed.T, smoothed )) - assert(np.allclose( image, thresholded )) - assert( np.count_nonzero(smoothed) > np.count_nonzero(image) ) - - -def test_build_trial_matrix(): - - tr0 = np.eye(16) * 255 - tr1 = np.arange(256).reshape((16, 16)) - lsn_template = np.array([ tr0, tr1 ]) - - exp = np.zeros((16, 16, 2, 2)) - exp[:, :, 0, 0] = np.eye(16) - exp[:, :, 1, 0] = 1 - np.eye(16) - exp[15, 15, 0, 1] = 1 - exp[0, 0, 1, 1] = 1 - - obt = chi.build_trial_matrix( lsn_template, 2 ) - assert(np.allclose( exp, obt )) - - -def test_get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel): - - obt = chi.get_expected_events_by_pixel(exclusion_mask, events_per_pixel, trials_per_pixel) - - assert( obt[0, 0, 0, 0] == 0.625 ) # 5 events, 8 trials (events counted even if 0 trials) - assert( obt[1, 1, 0, 0] == 0.5 ) # 4 events, 8 trials - assert( obt[0, 0, 0, 1] == 0.0 ) # no trials - assert( obt[1, 3, 3, 0] == 0.0 ) # out of mask - - -def test_chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel): - - obt_p, obt_ch = chi.chi_square_within_mask(exclusion_mask, events_per_pixel, trials_per_pixel) - - resps = np.array([4, 0, 0, 0, 0, 0, 0, 0]) - resids = resps - 0.5 - chi_sum = (resids ** 2 / 0.5).sum() - - exp_p = 1.0 - stats.chi2.cdf(chi_sum, 15) - - # the zeroth test cell has a response without a trial. - # this is infinitely surprising, so the pval is 0 - assert(np.allclose( obt_p, [0, exp_p] )) - - -def test_get_disc_masks(): - - lsn_template = np.zeros((9, 3, 3)) + 128 - for ii in range(3): - for jj in range(3): - lsn_template[3*ii+jj, ii, jj] = 0 - lsn_template[4, 2, 2] = 255 - - exp1 = np.ones((3, 3)) - exp1[2, 2] = 0 - - exp0 = np.zeros((3, 3)) - exp0[:2, :2] = 1 - - obt = chi.get_disc_masks(lsn_template, radius=1) - - assert(np.allclose( exp1, obt[1, 1, :, :] )) - assert(np.allclose( exp0, obt[0, 0, :, :] )) - - -def test_get_events_per_pixel(): - - events = np.zeros((3, 2)) - trials = np.zeros((4, 4, 2, 3)) - - # pixel 1,1 is off trial 1 and on trial 2 - trials[1, 1, 1, 1] = 1 - trials[1, 1, 0, 2] = 1 - - # pixel 2,2 is on trial 2 and off trial 0 - trials[2, 2, 0, 2] = 1 - trials[2, 2, 1, 0] = 1 - - # cell 0 has 4 events on trial 2 and 1 on trial 0 - events[2, 0] = 4 - events[0, 0] = 1 - - # cell 1 has 2 events on trial 1 - events[1, 1] = 2 - - exp = np.zeros((2, 4, 4, 2)) - exp[0, 2, 2, 0] = 4 - exp[0, 1, 1, 0] = 4 - exp[0, 2, 2, 1] = 1 - exp[1, 1, 1, 1] = 2 - - obt = chi.get_events_per_pixel(events, trials) - assert(np.allclose( obt, exp )) - - -@pytest.mark.parametrize('base,ex', [[5., 10], [0.1, 12], [np.arange(20), np.linspace(0, 1, 20)]]) -def test_nll_to_pvalue(base, ex): - - obt = chi.NLL_to_pvalue(ex, base) - exp = np.power(base, -ex) - - assert(np.allclose( exp, obt )) - - -# test by reversing nll_to_pvalue -@pytest.mark.parametrize('base,ex', [[10., 2], [10., 4], [np.array([10, 10, 10]), np.linspace(0, 1, 3)]]) -def test_pvalue_to_nll(base, ex): - - pv = chi.NLL_to_pvalue(ex, base) - max_nll = np.amax(ex) - - obt = chi.pvalue_to_NLL(pv, max_nll) - - assert(np.allclose( ex, obt )) - - -@pytest.mark.skipif(os.getenv('NO_TEST_RANDOM') == 'true', reason="random seed may not produce the same results on all machines") -def test_chi_square_binary(locally_sparse_noise, rf_events, rf_mask): - - ntr = 2000 - nr = 20 - nc = 20 - slices = [slice(9, 11), slice(9, 11)] - - mask = rf_mask(nr, nc, slices) - lsn = locally_sparse_noise(ntr, nr, nc) - events = rf_events(mask, lsn) - - obt = chi.chi_square_binary(events, lsn) - assert( obt[0][slices].sum() == 0 ) - assert( obt.sum() > 0 ) - - -@pytest.mark.skipif(os.getenv('NO_TEST_RANDOM') == 'true', reason="random seed may not produce the same results on all machines") -def test_get_peak_significance(locally_sparse_noise, rf_events, rf_mask): - - ntr = 2000 - nr = 20 - nc = 20 - slices = [slice(9, 11), slice(9, 11)] - - mask = rf_mask(nr, nc, slices) - lsn = locally_sparse_noise(ntr, nr, nc) - events = rf_events(mask, lsn) - - chi_pv = chi.chi_square_binary(events, lsn) - chi_nll = chi.pvalue_to_NLL(chi_pv) - - significant_cells, best_p, _, _ = chi.get_peak_significance(chi_nll, lsn) - - assert(np.allclose( best_p, 0 )) - assert(np.allclose( significant_cells, [True] )) - - -def test_locate_median(): - - mask = np.eye(9) - where = np.where(mask) - - obt = chi.locate_median(*where) - assert(np.allclose( obt , [4, 4] )) diff --git a/allensdk/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py b/allensdk/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py deleted file mode 100644 index a95dcb2f26..0000000000 --- a/allensdk/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py +++ /dev/null @@ -1,189 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import itertools as it - -import pytest -import mock - -from scipy.stats import multivariate_normal -from skimage.transform import rotate -import skimage -import numpy as np - -import allensdk.brain_observatory.receptive_field_analysis.fitgaussian2D as gauss - - -@pytest.fixture(scope='function') -def gaussian_pdf(): - - def gpdf(mean, cov, axes, scale=1): - - rv = multivariate_normal( mean, cov ) - mesh = np.meshgrid( *axes, indexing='ij' ) - pos = np.rollaxis( np.array(mesh), 0, len( axes ) + 1 ) - - out = rv.pdf( pos ) - out = out / np.amax(out) * scale - - return out, mesh - - return gpdf - - -@pytest.fixture(scope='function') -def domain_axes(): - - start = 0 - stop = 201 - step = 1 - naxes = 2 - - axes = [ np.arange(start, stop, step) for ii in range(naxes) ] - return axes - - -@pytest.fixture(scope='function') -def simple_fill(): - - def do_fill(domain_axes, fn): - - arr = np.zeros([ len(da) for da in domain_axes ]) - for pt in it.product(*domain_axes): - arr[pt] = fn(*pt) - - return arr - - return do_fill - - -@pytest.mark.parametrize('mean,cov,scale', [ [ [ 100, 100 ], [ 25, 25 ], 1 ], - [ [ 100, 100 ], [ 10, 25 ], 1 ], - [ [ 100, 110 ], [ 25, 25 ], 1 ], - [ [ 100, 110 ], [ 10, 25 ], 1 ], - [ [ 110, 100 ], [ 10, 25 ], 1 ] ]) -def test_gaussian2D_norot(mean, cov, scale, gaussian_pdf, domain_axes, simple_fill): - - full_cov = [ [ cov[0], 0 ], [ 0, cov[1] ] ] - exp, mesh = gaussian_pdf( mean, full_cov, domain_axes, scale ) - - obt_fn = gauss.gaussian2D( scale, mean[0], mean[1], np.sqrt(cov[0]), np.sqrt(cov[1]), 0 ) - obt = simple_fill( domain_axes, obt_fn ) - - assert( np.allclose( obt, exp ) ) - - -# only providing independent cov - using rotation after the fact -@pytest.mark.skipif(skimage.__version__ < '0.11.1', reason='cannot rotate about non-center point before .11.1') -@pytest.mark.parametrize('mean,cov,scale,rot', [ [ [ 100, 100 ], [ 25, 25 ], 1, 0 ], - [ [ 100, 100 ], [ 10, 25 ], 1, 0 ], - [ [ 100, 110 ], [ 25, 25 ], 1, 0 ], - [ [ 100, 110 ], [ 10, 25 ], 1, 0 ], - [ [ 110, 100 ], [ 10, 25 ], 1, 0 ], - [ [ 100, 100 ], [ 25, 25 ], 1, 90 ], - [ [ 100, 100 ], [ 25, 20 ], 1, 180 ], - [ [ 100, 100 ], [ 30, 25 ], 1, -90 ], - [ [ 100, 110 ], [ 20, 15 ], 1, -45 ], - [ [ 100, 110 ], [ 20, 15 ], 1, 30 ], - [ [ 100, 100 ], [ 15, 20 ], 1, 10 ], - [ [ 100, 100 ], [ 10, 25 ], 10, 0 ] ]) -def test_gaussian2D(mean, cov, scale, rot, gaussian_pdf, domain_axes, simple_fill): - - full_cov = [ [ cov[0], 0 ], [ 0, cov[1] ] ] - exp, mesh = gaussian_pdf( mean, full_cov, domain_axes, scale ) - - if rot != 0: - exp = rotate( exp, -rot, False, center=mean[::-1] ) # negative rotation - - obt_fn = gauss.gaussian2D( scale, mean[0], mean[1], np.sqrt(cov[0]), np.sqrt(cov[1]), rot ) - obt = simple_fill( domain_axes, obt_fn ) - - if rot == 0: - assert( np.allclose( obt, exp ) ) - else: - assert( np.linalg.norm( obt - exp ) / np.linalg.norm(exp) < 10 ** -2 ) - - -@pytest.mark.parametrize('mean,cov,scale', [ [ [ 100, 100 ], [ [1, 0 ], [0, 1] ], 1 ], - [ [ 100, 150 ], [ [1, 0 ], [0, 1] ], 1 ], - [ [ 125, 125 ], [ [1, 0 ], [0, 1] ], 1 ], - [ [ 110, 100 ], [ [1, 0 ], [0, 1] ], 1 ], - [ [ 90, 100 ], [ [1, 0 ], [0, 1] ], 1 ], - [ [ 100, 100 ], [ [1, 0 ], [0, 1] ], 2 ], - [ [ 100, 100 ], [ [5, 0 ], [0, 1] ], 1 ] ]) -def test_moments2(mean, cov, scale, gaussian_pdf, domain_axes): - - pdf, mesh = gaussian_pdf( mean, cov, domain_axes, scale ) - mom_exp = np.array([ scale, - mean[0], mean[1], - np.sqrt(cov[1][1]), np.sqrt(cov[0][0]) ]) - - mom_obt = gauss.moments2( pdf ) - - assert( np.allclose( mom_obt[:-1], mom_exp ) ) - assert( mom_obt[-1] is None ) # TODO: why? - - -# we probably want to test rotation here at some point, but there is no way that it could work now, given -# that moments2 assumes independence ... -@pytest.mark.parametrize('mean,cov,scale', [ [ [ 100, 100 ], [ 25, 25 ], 1 ], - [ [ 100, 100 ], [ 10, 25 ], 1 ], - [ [ 100, 110 ], [ 25, 25 ], 1 ], - [ [ 100, 110 ], [ 10, 25 ], 1 ], - [ [ 110, 100 ], [ 10, 25 ], 1 ] ]) -def test_fitgaussian2D(mean, cov, scale, gaussian_pdf, domain_axes): - - full_cov = [ [ cov[0], 0 ], [ 0, cov[1] ] ] - img, mesh = gaussian_pdf( mean, full_cov, domain_axes, scale ) - - obt = gauss.fitgaussian2D( img ) - exp = [ scale, mean[0], mean[1], np.sqrt(cov[0]), np.sqrt(cov[1]), 0 ] - - assert( np.allclose( exp, obt, atol=10**-3 ) ) - - -def test_fitgaussian2D_failure(): - - data = np.eye(10) - - res = mock.MagicMock() - res.success = False - res.status = 3 - res.message = 'foo' - - with mock.patch('scipy.optimize.minimize', return_value=res) as p: - with pytest.raises( gauss.GaussianFitError ): - gauss.fitgaussian2D(data) diff --git a/allensdk/test/brain_observatory/sync_utilities/__init__.py b/allensdk/test/brain_observatory/sync_utilities/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/brain_observatory/sync_utilities/test_sync_utilities.py b/allensdk/test/brain_observatory/sync_utilities/test_sync_utilities.py deleted file mode 100644 index b964a654e6..0000000000 --- a/allensdk/test/brain_observatory/sync_utilities/test_sync_utilities.py +++ /dev/null @@ -1,116 +0,0 @@ -import pytest -import numpy as np - -from functools import partial - -from allensdk.brain_observatory import sync_utilities as su -from allensdk.brain_observatory.sync_dataset import Dataset - - -class MockDataset(Dataset): - def __init__(self, path: str, - eye_tracking_timings, behavior_tracking_timings): - # Note: eye_tracking_timings and behavior_tracking_timings are test - # inputs that can be parametrized and do not exist in the real - # `Dataset` class. - self.eye_tracking_timings = eye_tracking_timings - self.behavior_tracking_timings = behavior_tracking_timings - - def get_edges(self, kind, keys, units='seconds'): - if keys == self.EYE_TRACKING_KEYS: - return self.eye_tracking_timings - elif keys == self.BEHAVIOR_TRACKING_KEYS: - return self.behavior_tracking_timings - - -@pytest.fixture -def mock_dataset_fixture(request): - test_params = { - "eye_tracking_timings": [], - "behavior_tracking_timings": [] - } - test_params.update(request.param) - return partial(MockDataset, **test_params) - - -@pytest.mark.parametrize('vs_times, expected', [ - [[0.016, 0.033, 0.051, 0.067, 3.0], [0.016, 0.033, 0.051, 0.067]] -]) -def test_trim_discontiguous_vsyncs(vs_times, expected): - obtained = su.trim_discontiguous_times(vs_times) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ - ({"eye_tracking_timings": [0.020, 0.030, 0.040, 0.050, 3.0]}, - Dataset.EYE_TRACKING_KEYS, [0.020, 0.030, 0.040, 0.050]), - - ({"behavior_tracking_timings": [0.080, 0.090, 0.100, 0.110, 8.0]}, - Dataset.BEHAVIOR_TRACKING_KEYS, [0.08, 0.090, 0.100, 0.110]) -], indirect=["mock_dataset_fixture"]) -def test_get_synchronized_frame_times(monkeypatch, mock_dataset_fixture, - sync_line_label_keys, expected): - monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) - - obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ - ({"eye_tracking_timings": [0.020, 0.030, 0.040, 0.050, 3.0]}, - Dataset.EYE_TRACKING_KEYS, [0.020, 0.030, 0.040, 0.050, 3.0]), - - ({"behavior_tracking_timings": [0.080, 0.090, 0.100, 0.110, 8.0]}, - Dataset.BEHAVIOR_TRACKING_KEYS, [0.08, 0.090, 0.100, 0.110, 8.0]) -], indirect=["mock_dataset_fixture"]) -def test_get_synchronized_frame_times_no_trim(monkeypatch, mock_dataset_fixture, - sync_line_label_keys, expected): - monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) - - obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys, trim_after_spike=False) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ - ({"eye_tracking_timings": [0.020, 0.030, 3.0, 0.040, 0.050, 0.040]}, - Dataset.EYE_TRACKING_KEYS, [0.020, 0.030]), - - ({"behavior_tracking_timings": [0.080, 8.0, 0.090, 0.100, 0.110, 0.150, 0.085, 0.110, 0.13]}, - Dataset.BEHAVIOR_TRACKING_KEYS, [0.08]) -], indirect=["mock_dataset_fixture"]) -def test_get_synchronized_frame_times_trim_with_spike(monkeypatch, mock_dataset_fixture, - sync_line_label_keys, expected): - monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) - - obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ - ({"eye_tracking_timings": [3.0, 0.030, 0.040, 0.050]}, - Dataset.EYE_TRACKING_KEYS, []), - - ({"behavior_tracking_timings": [8.0, 0.080, 0.090, 0.100, 0.110]}, - Dataset.BEHAVIOR_TRACKING_KEYS, []) -], indirect=["mock_dataset_fixture"]) -def test_get_synchronized_frame_times_trim_all(monkeypatch, mock_dataset_fixture, - sync_line_label_keys, expected): - monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) - - obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys) - assert np.allclose(obtained, expected) - - -@pytest.mark.parametrize("mock_dataset_fixture,sync_line_label_keys,expected", [ - ({"eye_tracking_timings": [0.020, 0.030, 3.0, 0.050, 0.040]}, - Dataset.EYE_TRACKING_KEYS, [0.020, 0.030, 3.0, 0.050, 0.040]), - - ({"behavior_tracking_timings": [0.080, 8.0, 0.090, 0.100, 0.110]}, - Dataset.BEHAVIOR_TRACKING_KEYS, [0.080, 8.0, 0.090, 0.100, 0.110]) -], indirect=["mock_dataset_fixture"]) -def test_get_synchronized_frame_times_no_trim_with_spike(monkeypatch, mock_dataset_fixture, - sync_line_label_keys, expected): - monkeypatch.setattr(su, "Dataset", mock_dataset_fixture) - - obtained = su.get_synchronized_frame_times("dummy_path", sync_line_label_keys, trim_after_spike=False) - assert np.allclose(obtained, expected) \ No newline at end of file diff --git a/allensdk/test/brain_observatory/test_circle_plots.py b/allensdk/test/brain_observatory/test_circle_plots.py deleted file mode 100644 index 0900cbbbf9..0000000000 --- a/allensdk/test/brain_observatory/test_circle_plots.py +++ /dev/null @@ -1,130 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import allensdk.brain_observatory.circle_plots as cplots -import numpy as np - -def test_polar_to_xy(): - d = cplots.polar_to_xy([0], 0.0) - assert d.shape[0] == 1 - assert d.shape[1] == 2 - - d = cplots.polar_to_xy([0, np.pi], 1.0) - - assert np.allclose(d, [[ 1, 0 ], [-1, 0]]) - -def test_polar_linspace(): - d = cplots.polar_linspace(1, 0, 180, 2, endpoint=True, degrees=True) - assert np.allclose(d, [[1,0],[-1,0]]) - - d = cplots.polar_linspace(1, 0, np.pi, 2, endpoint=False, degrees=False) - assert np.allclose(d, [[1,0],[0,1.0]]) - - d = cplots.polar_linspace(2, 0, 2*np.pi, 4, endpoint=False, degrees=False) - assert np.allclose(d, [[2,0],[0,2],[-2,0],[0,-2]]) - - d = cplots.polar_linspace(3, 0, 360, 5, endpoint=True, degrees=True) - assert np.allclose(d, [[3,0],[0,3],[-3,0],[0,-3],[3,0]]) - -def test_spiral_trials(): - coll = cplots.spiral_trials([0,2]) - - assert len(coll.get_paths()) == 2 - -def test_spiral_trials_polar(): - coll = cplots.spiral_trials_polar(1.0, 0.0, [1.0]) - assert len(coll.get_paths()) == 1 - - coll = cplots.spiral_trials_polar(1.0, 0.0, [1.0], offset=[1,0]) - assert len(coll.get_paths()) == 1 - -def test_angle_lines(): - lines = cplots.angle_lines([0], 0, 1) - assert len(lines.get_paths()) == 1 - - lines = cplots.angle_lines([0,1], 0, 1) - assert len(lines.get_paths()) == 2 - -def test_radial_arcs(): - arcs = cplots.radial_arcs([1], 0, 1) - assert len(arcs.get_paths()) == 1 - - arcs = cplots.radial_arcs([1,2], 0, 1) - assert len(arcs.get_paths()) == 2 - -def test_radial_circles(): - d = cplots.radial_circles([1]) - assert len(d.get_paths()) == 1 - - d = cplots.radial_circles([1,2]) - assert len(d.get_paths()) == 2 - -def test_polar_line_circles(): - d = cplots.polar_line_circles([1],0) - assert len(d.get_paths()) == 1 - - d = cplots.polar_line_circles([1],0,0) - assert len(d.get_paths()) == 1 - -def test_wedge_ring(): - d = cplots.wedge_ring(1, 0, 1, 0, 180) - assert len(d.get_paths()) == 1 - - d = cplots.wedge_ring(2, 0, 1) - assert len(d.get_paths()) == 2 - -def test_reset_hex_pack(): - pos = cplots.hex_pack(1.0, 1) - cplots.reset_hex_pack() - assert len(cplots.HEX_POSITIONS) == 0 - -def test_hex_pack(): - cplots.reset_hex_pack() - - pos = cplots.hex_pack(1.0, 1) - assert pos.shape[0] == 1 - assert np.allclose(pos, [[0,0]]) - assert np.allclose(cplots.HEX_POSITIONS.shape, [1,2]) - - pos = cplots.hex_pack(2.0, 2) - assert np.allclose(pos, [[0,0],[4,0]]) - assert np.allclose(cplots.HEX_POSITIONS.shape, [7,2]) - - pos = cplots.hex_pack(2.0, 8) - assert np.allclose(cplots.HEX_POSITIONS.shape, [19,2]) - - - - diff --git a/allensdk/test/brain_observatory/test_demixer.py b/allensdk/test/brain_observatory/test_demixer.py deleted file mode 100644 index 5b8a975d1d..0000000000 --- a/allensdk/test/brain_observatory/test_demixer.py +++ /dev/null @@ -1,125 +0,0 @@ -import numpy as np -import pytest -import scipy.sparse as sparse -import logging - -import allensdk.brain_observatory.demixer as dmx - - -@pytest.mark.parametrize( - "source_frame,mask_traces,flat_masks,pixels_per_mask,expected", - [ - ( - np.array([2., 2., 2., 1.]), - np.array([2.0, 2.0]), - sparse.csr_matrix(np.array([[1, 0, 0, 0], [1, 1, 0, 0]])), - np.array([1, 2]), - np.array([0, 2]), - ), - ( - np.array([2., 0., 2., 1.]), - np.array([2.0, 0.]), # zero in mask trace - sparse.csr_matrix(np.array([[1, 0, 0, 0], [1, 1, 0, 0]])), - np.array([1, 2]), - None, - ), - ( - np.array([2., 0., 2., 1.]), - np.array([2.0, 0.]), - sparse.csr_matrix(np.array([[1, 0, 0, 0], [0, 0, 0, 0]])), - np.array([1, 0]), # invalid mask (zero pixels) - None, - ) - ] -) -def test_demix_point( - source_frame, mask_traces, flat_masks, pixels_per_mask, expected): - result = dmx._demix_point(source_frame, mask_traces, flat_masks, - pixels_per_mask) - np.testing.assert_equal(result, expected) - - -@pytest.mark.parametrize( - "source_frame,mask_traces,flat_masks,pixels_per_mask,expected", - [ - (np.zeros(4), # force singular matrix - np.ones(2), - sparse.csr_matrix(np.array([[1, 0, 0, 0], [1, 1, 0, 0]])), - np.array([1, 2]), - np.zeros(2)), - ] -) -def test_demix_raises_warning_for_singular_matrix( - source_frame, mask_traces, flat_masks, pixels_per_mask, expected, - caplog): - result = dmx._demix_point(source_frame, mask_traces, flat_masks, - pixels_per_mask) - with caplog.at_level(logging.WARNING): - assert caplog.records[0].msg == ("Singular matrix, using least squares to " - "solve.") - assert caplog.records[0].levelno == logging.WARNING - np.testing.assert_equal(expected, result) - - -@pytest.mark.parametrize( - "raw_traces,stack,masks,max_block_size,expected", - [ - ( - np.array([[2.0, 0.0], [2.0, 2.0]]), - np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), - np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), - 1, # max_block_size < stack length - (np.array([[0, 0], [2, 0]]), [False, True]) - ), - ( - np.array([[2.0, 0.0], [2.0, 2.0]]), - np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), - np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), - 2, # max_block_size = stack length - (np.array([[0, 0], [2, 0]]), [False, True]) - ), - ( - np.array([[2.0, 0.0], [2.0, 2.0]]), - np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), - np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), - 1000, # max_block_size > stack length - (np.array([[0, 0], [2, 0]]), [False, True]) - ), - ( - np.array([[2.0, 0.0], [2.0, 2.0]]), - np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), - np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), - -1, # stack processed in one block - (np.array([[0, 0], [2, 0]]), [False, True]) - ), - ( - np.array([[2.0, 0.0, 1.0], [2.0, 2.0, 0.0]]), - np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]], [[1., 2.], [1., 2.]]]), - np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), - 2, # stack length not divisible by max_block_size - (np.array([[0, 0, 0], [2, 0, 0]]), [False, True, True]) - ), - - ], -) -def test_demix_time_dep_masks(raw_traces, stack, masks, max_block_size, expected): - result = dmx.demix_time_dep_masks(raw_traces, stack, masks, max_block_size) - np.testing.assert_equal(result[0], expected[0]) - assert result[1] == expected[1] - - -@pytest.mark.parametrize( - "raw_traces,stack,masks,max_block_size", - [ - ( - np.array([[2.0, 0.0], [2.0, 2.0]]), - np.array([[[2., 2.], [2., 1.]], [[2., 2.], [2., 1.]]]), - np.array([[[1, 0], [0, 0]], [[1, 1], [0, 0]]]), - -2, # invalid max_block_size) - ), - ], -) -def test_demix_invalid_max_block_size(raw_traces, stack, masks, max_block_size): - with pytest.raises(ValueError, match="Invalid maximum block size*"): - dmx.demix_time_dep_masks(raw_traces, stack, masks, max_block_size) - diff --git a/allensdk/test/brain_observatory/test_dff.py b/allensdk/test/brain_observatory/test_dff.py deleted file mode 100644 index 2ebb50939c..0000000000 --- a/allensdk/test/brain_observatory/test_dff.py +++ /dev/null @@ -1,160 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import allensdk.brain_observatory.dff as dff -import numpy as np -import pytest -from functools import partial -from matplotlib.pyplot import Figure -from mock import patch, MagicMock - - -def test_movingmode_fast(): - # check basic behavior - x = np.array([0, 10, 0, 0, 20, 0, 0, 0, 30]) - kernelsize = 4 - y = np.zeros(x.shape) - - dff.movingmode_fast(x, kernelsize, y) - - assert np.all(y == 0) - - # check window edges - x = np.array([0, 0, 1, 1, 2, 2, 3, 3]) - kernelsize = 2 - y = np.zeros(x.shape) - - dff.movingmode_fast(x, kernelsize, y) - - assert np.all(x == y) - - # check > 16 bit - x = np.array([4097, 4097, 4097, 4097]) - kernelsize = 2 - y = np.zeros(x.shape) - - dff.movingmode_fast(x, kernelsize, y) - - assert np.all(y == 4097) - - # check floats - x = np.array([0, 0, 1, 1, 2, 2, 3, 3], dtype=np.float32) - kernelsize = 2 - y = np.zeros(x.shape) - - dff.movingmode_fast(x, kernelsize, y) - - assert np.all(x == y) - - -def test_compute_dff_windowed_mode(): - x = np.array([[1, 5, -2, 3, 1, 10, 1, -2, 30, 5]]) - - with pytest.raises(ValueError): - dff.compute_dff_windowed_mode(x, mode_kernelsize=0) - with pytest.raises(ValueError): - dff.compute_dff_windowed_mode(x, mean_kernelsize=0) - - y = dff.compute_dff_windowed_mode(x) - - assert(y.shape == x.shape) - - -def test_compute_dff_windowed_median(): - x = np.array([[1, 5, -2, 3, 1, 10, 1, -2, 30, 5]], dtype=float) - - with pytest.raises(ValueError): - dff.compute_dff_windowed_median(x, median_kernel_long=2) - with pytest.raises(ValueError): - dff.compute_dff_windowed_median(x, median_kernel_short=-5) - with pytest.raises(ValueError): - dff.compute_dff_windowed_median(x, noise_kernel_length=50) - with pytest.raises(ValueError): - dff.compute_dff_windowed_median(x) - - x = np.sin(np.arange(0, 200)).reshape(1,200) - - y = dff.compute_dff_windowed_median(x, median_kernel_long=101, - median_kernel_short=11, - noise_kernel_length=5) - - assert(y.shape == x.shape) - - noise_stds = [] - small_frames = [] - y = dff.compute_dff_windowed_median(x, median_kernel_long=101, - median_kernel_short=11, - noise_stds=noise_stds, - n_small_baseline_frames=small_frames, - noise_kernel_length=5) - - assert len(noise_stds) == 1 - assert len(small_frames) == 1 - - -def test_calculate_dff(): - x = np.array([[1, 5, -2, 3, 1, 10, 1, -2, 30, 5]], dtype=float) - - with patch("os.makedirs") as mock_makedirs: - with patch.object(Figure, "savefig") as mock_save: - with patch.object(dff, "compute_dff_windowed_median", - return_value=x) as mock_computation: - dff.calculate_dff(x) - assert mock_makedirs.call_count == 0 - assert mock_save.call_count == 0 - mock_computation.assert_called_once_with(x) - - with patch("os.makedirs") as mock_makedirs: - with patch.object(Figure, "savefig") as mock_save: - mock_computation = MagicMock(return_value=x) - dff.calculate_dff(x, dff_computation_cb=mock_computation, - save_plot_dir="./test") - mock_makedirs.assert_called_once_with("./test") - mock_save.assert_called_once() - mock_computation.assert_called_once_with(x) - - x = np.sin(np.arange(0, 200)).reshape(1,200) - - noise_stds = [] - small_frames = [] - computation_cb = partial(dff.compute_dff_windowed_median, - median_kernel_long=101, - median_kernel_short=11, - noise_stds=noise_stds, - n_small_baseline_frames=small_frames, - noise_kernel_length=5) - dff.calculate_dff(x, dff_computation_cb=computation_cb) - assert len(noise_stds) == 1 - assert len(small_frames) == 1 diff --git a/allensdk/test/brain_observatory/test_drifting_gratings.py b/allensdk/test/brain_observatory/test_drifting_gratings.py deleted file mode 100644 index 4a9bdccb54..0000000000 --- a/allensdk/test/brain_observatory/test_drifting_gratings.py +++ /dev/null @@ -1,164 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.brain_observatory.drifting_gratings import DriftingGratings -from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis - -import pytest -from mock import patch, MagicMock - - -@pytest.fixture -def dataset(): - dataset = MagicMock(name='dataset') - - timestamps = MagicMock(name='timestamps') - celltraces = MagicMock(name='celltraces') - dataset.get_corrected_fluorescence_traces = \ - MagicMock(name='get_corrected_fluorescence_traces', - return_value=(timestamps, celltraces)) - dataset.get_roi_ids = MagicMock(name='get_roi_ids') - dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') - dff_traces = MagicMock(name="dfftraces") - dataset.get_dff_traces = MagicMock(name='get_dff_traces', - return_value=(None, dff_traces)) - dxcm = MagicMock(name='dxcm') - dxtime = MagicMock(name='dxtime') - dataset.get_running_speed=MagicMock(name='get_running_speed', - return_value=(dxcm, dxtime)) - dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', - return_value=MagicMock()) - - return dataset - -def mock_speed_tuning(): - binned_dx_sp = MagicMock(name='binned_dx_sp') - binned_cells_sp = MagicMock(name='binned_cells_sp') - binned_dx_vis = MagicMock(name='binned_dx_vis') - binned_cells_vis = MagicMock(name='binned_cells_vis') - peak_run = MagicMock(name='peak_run') - - return MagicMock(name='get_speed_tuning', - return_value=(binned_dx_sp, - binned_cells_sp, - binned_dx_vis, - binned_cells_vis, - peak_run)) - -def mock_sweep_response(): - sweep_response = MagicMock(name='sweep_response') - mean_sweep_response = MagicMock(name='mean_sweep_response') - pval = MagicMock(name='pval') - - return MagicMock(name='get_sweep_response', - return_value=(sweep_response, - mean_sweep_response, - pval)) - -@patch.object(StimulusAnalysis, - 'get_speed_tuning', - mock_speed_tuning()) -@patch.object(StimulusAnalysis, - 'get_sweep_response', - mock_sweep_response()) -@pytest.mark.parametrize('trigger', (1, 2, 3, 4, 5)) -def test_harness(dataset, trigger): - dg = DriftingGratings(dataset) - - assert dg._stim_table is StimulusAnalysis._PRELOAD - assert dg._orivals is StimulusAnalysis._PRELOAD - assert dg._tfvals is StimulusAnalysis._PRELOAD - assert dg._number_ori is StimulusAnalysis._PRELOAD - assert dg._number_tf is StimulusAnalysis._PRELOAD - assert dg._sweep_response is StimulusAnalysis._PRELOAD - assert dg._mean_sweep_response is StimulusAnalysis._PRELOAD - assert dg._pval is StimulusAnalysis._PRELOAD - assert dg._response is StimulusAnalysis._PRELOAD - assert dg._peak is StimulusAnalysis._PRELOAD - - if trigger == 1: - print(dg.stim_table) - print(dg.sweep_response) - print(dg.response) - print(dg.peak) - elif trigger == 2: - print(dg.orivals) - print(dg.mean_sweep_response) - print(dg.response) - print(dg.peak) - elif trigger == 3: - print(dg.tfvals) - print(dg.pval) - print(dg.response) - print(dg.peak) - elif trigger == 4: - print(dg.number_ori) - print(dg.sweep_response) - print(dg.response) - print(dg.peak) - elif trigger == 5: - print(dg.number_tf) - print(dg.sweep_response) - print(dg.response) - print(dg.peak) - - assert dg._stim_table is not StimulusAnalysis._PRELOAD - assert dg._orivals is not StimulusAnalysis._PRELOAD - assert dg._tfvals is not StimulusAnalysis._PRELOAD - assert dg._number_ori is not StimulusAnalysis._PRELOAD - assert dg._number_tf is not StimulusAnalysis._PRELOAD - assert dg._sweep_response is not StimulusAnalysis._PRELOAD - assert dg._mean_sweep_response is not StimulusAnalysis._PRELOAD - assert dg._pval is not StimulusAnalysis._PRELOAD - assert dg._response is not StimulusAnalysis._PRELOAD - assert dg._peak is not StimulusAnalysis._PRELOAD - - # check super properties - dataset.get_corrected_fluorescence_traces.assert_called_once_with() - assert dg._timestamps != DriftingGratings._PRELOAD - assert dg._celltraces != DriftingGratings._PRELOAD - assert dg._numbercells != DriftingGratings._PRELOAD - - assert not dataset.get_roi_ids.called - assert dg._roi_id is DriftingGratings._PRELOAD - - assert dataset.get_cell_specimen_ids.called - assert dg._cell_id is DriftingGratings._PRELOAD - - assert not dataset.get_dff_traces.called - assert dg._dfftraces is DriftingGratings._PRELOAD - - assert dg._dxcm is DriftingGratings._PRELOAD - assert dg._dxtime is DriftingGratings._PRELOAD diff --git a/allensdk/test/brain_observatory/test_locally_sparse_noise.py b/allensdk/test/brain_observatory/test_locally_sparse_noise.py deleted file mode 100644 index 6d81c98749..0000000000 --- a/allensdk/test/brain_observatory/test_locally_sparse_noise.py +++ /dev/null @@ -1,175 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise -from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis -import pytest -from mock import patch, MagicMock -import itertools as it - - -@pytest.fixture -def dataset(): - dataset = MagicMock(name='dataset') - - timestamps = MagicMock(name='timestamps') - celltraces = MagicMock(name='celltraces') - dataset.get_corrected_fluorescence_traces = \ - MagicMock(name='get_corrected_fluorescence_traces', - return_value=(timestamps, celltraces)) - dataset.get_roi_ids = MagicMock(name='get_roi_ids') - dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') - dff_traces = MagicMock(name="dfftraces") - dataset.get_dff_traces = MagicMock(name='get_dff_traces', - return_value=(None, dff_traces)) - dxcm = MagicMock(name='dxcm') - dxtime = MagicMock(name='dxtime') - dataset.get_running_speed=MagicMock(name='get_running_speed', - return_value=(dxcm, dxtime)) - - LSN = MagicMock(name='LSN') - LSN_mask = MagicMock(name='LSN_mask') - dataset.get_locally_sparse_noise_stimulus_template = \ - MagicMock(name='get_locally_sparse_noise_stimulus_template', - return_value=(LSN, LSN_mask)) - - return dataset - -def mock_speed_tuning(): - binned_dx_sp = MagicMock(name='binned_dx_sp') - binned_cells_sp = MagicMock(name='binned_cells_sp') - binned_dx_vis = MagicMock(name='binned_dx_vis') - binned_cells_vis = MagicMock(name='binned_cells_vis') - peak_run = MagicMock(name='peak_run') - - return MagicMock(name='get_speed_tuning', - return_value=(binned_dx_sp, - binned_cells_sp, - binned_dx_vis, - binned_cells_vis, - peak_run)) - -def mock_sweep_response(): - sweep_response = MagicMock(name='sweep_response') - mean_sweep_response = MagicMock(name='mean_sweep_response') - pval = MagicMock(name='pval') - - return MagicMock(name='get_sweep_response', - return_value=(sweep_response, - mean_sweep_response, - pval)) - -@patch.object(StimulusAnalysis, - 'get_sweep_response', - mock_sweep_response()) -@patch.object(LocallySparseNoise, - 'get_receptive_field', - MagicMock(name='get_receptive_field')) -@pytest.mark.parametrize('stimulus,trigger', - it.product(('locally_sparse_noise', - 'locally_sparse_noise_4deg', - 'locally_sparse_noise_8deg'), - (1,2,3,4,5,6))) -def test_harness(dataset, - stimulus, - trigger): - with patch('allensdk.brain_observatory.stimulus_analysis.StimulusAnalysis.get_speed_tuning', - mock_speed_tuning()) as get_speed_tuning: - lsn = LocallySparseNoise(dataset, stimulus) - - assert lsn._stim_table is StimulusAnalysis._PRELOAD - assert lsn._LSN is StimulusAnalysis._PRELOAD - assert lsn._LSN_mask is StimulusAnalysis._PRELOAD - assert lsn._sweeplength is StimulusAnalysis._PRELOAD - assert lsn._interlength is StimulusAnalysis._PRELOAD - assert lsn._extralength is StimulusAnalysis._PRELOAD - assert lsn._sweep_response is StimulusAnalysis._PRELOAD - assert lsn._mean_sweep_response is StimulusAnalysis._PRELOAD - assert lsn._pval is StimulusAnalysis._PRELOAD - assert lsn._receptive_field is StimulusAnalysis._PRELOAD - - if trigger == 1: - print(lsn.stim_table) - print(lsn.sweep_response) - print(lsn.receptive_field) - elif trigger == 2: - print(lsn.LSN) - print(lsn.mean_sweep_response) - print(lsn.receptive_field) - elif trigger == 3: - print(lsn.LSN_mask) - print(lsn.pval) - print(lsn.receptive_field) - elif trigger == 4: - print(lsn.sweeplength) - print(lsn.sweep_response) - print(lsn.receptive_field) - elif trigger == 5: - print(lsn.interlength) - print(lsn.mean_sweep_response) - print(lsn.receptive_field) - elif trigger == 6: - print(lsn.extralength) - print(lsn.pval) - print(lsn.receptive_field) - - assert lsn._stim_table is not StimulusAnalysis._PRELOAD - assert lsn._LSN is not StimulusAnalysis._PRELOAD - assert lsn._LSN_mask is not StimulusAnalysis._PRELOAD - assert lsn._sweeplength is not StimulusAnalysis._PRELOAD - assert lsn._interlength is not StimulusAnalysis._PRELOAD - assert lsn._extralength is not StimulusAnalysis._PRELOAD - assert lsn._sweep_response is not StimulusAnalysis._PRELOAD - assert lsn._mean_sweep_response is not StimulusAnalysis._PRELOAD - assert lsn._pval is not StimulusAnalysis._PRELOAD - assert lsn._receptive_field is not StimulusAnalysis._PRELOAD - - # verify super class members weren't preloaded - assert not dataset.get_corrected_fluorescence_traces.called - assert lsn._timestamps is StimulusAnalysis._PRELOAD - assert lsn._celltraces is StimulusAnalysis._PRELOAD - assert lsn._numbercells is StimulusAnalysis._PRELOAD - - assert not dataset.get_roi_ids.called - assert lsn._roi_id is StimulusAnalysis._PRELOAD - - assert not dataset.get_cell_specimen_ids.called - assert lsn._cell_id is StimulusAnalysis._PRELOAD - - assert not dataset.get_dff_traces.called - assert lsn._dfftraces is StimulusAnalysis._PRELOAD - - assert lsn._dxcm is StimulusAnalysis._PRELOAD - assert lsn._dxtime is StimulusAnalysis._PRELOAD diff --git a/allensdk/test/brain_observatory/test_natural_movie.py b/allensdk/test/brain_observatory/test_natural_movie.py deleted file mode 100644 index b737f0503d..0000000000 --- a/allensdk/test/brain_observatory/test_natural_movie.py +++ /dev/null @@ -1,144 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.brain_observatory.natural_movie import NaturalMovie -from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis -import pytest -from mock import patch, MagicMock -import pandas as pd - - -@pytest.fixture -def stimulus_table(): - return pd.DataFrame([ - {'frame': 0, 'start': 0, 'stop': 1}, - {'frame': 0, 'start': 1, 'stop': 2}, - {'frame': 1, 'start': 2, 'stop': 3}, - ]) - - -@pytest.fixture -def dataset(stimulus_table): - dataset = MagicMock(name='dataset') - - timestamps = MagicMock(name='timestamps') - celltraces = MagicMock(name='celltraces') - dataset.get_corrected_fluorescence_traces = \ - MagicMock(name='get_corrected_fluorescence_traces', - return_value=(timestamps, celltraces)) - dataset.get_roi_ids = MagicMock(name='get_roi_ids') - dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') - dff_traces = MagicMock(name="dfftraces") - dataset.get_dff_traces = MagicMock(name='get_dff_traces', - return_value=(None, dff_traces)) - dxcm = MagicMock(name='dxcm') - dxtime = MagicMock(name='dxtime') - dataset.get_running_speed=MagicMock(name='get_running_speed', - return_value=(dxcm, dxtime)) - dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', - return_value=stimulus_table) - - return dataset - -def mock_speed_tuning(): - binned_dx_sp = MagicMock(name='binned_dx_sp') - binned_cells_sp = MagicMock(name='binned_cells_sp') - binned_dx_vis = MagicMock(name='binned_dx_vis') - binned_cells_vis = MagicMock(name='binned_cells_vis') - peak_run = MagicMock(name='peak_run') - - return MagicMock(name='get_speed_tuning', - return_value=(binned_dx_sp, - binned_cells_sp, - binned_dx_vis, - binned_cells_vis, - peak_run)) - -def mock_sweep_response(): - sweep_response = MagicMock(name='sweep_response') - mean_sweep_response = MagicMock(name='mean_sweep_response') - pval = MagicMock(name='pval') - - return MagicMock(name='get_sweep_response', - return_value=(sweep_response, - mean_sweep_response, - pval)) - -@patch.object(StimulusAnalysis, - 'get_speed_tuning', - mock_speed_tuning()) -@patch.object(StimulusAnalysis, - 'get_sweep_response', - mock_sweep_response()) -@pytest.mark.parametrize( - 'trigger', [ - ('stim_table', 'sweep_response', 'peak'), - ('sweeplength', 'sweep_response', 'peak') - ] -) -def test_harness(dataset, trigger): - movie_name = "Mock Movie Name" - nm = NaturalMovie(dataset, movie_name) - - assert nm._stim_table is StimulusAnalysis._PRELOAD - assert nm._sweeplength is StimulusAnalysis._PRELOAD - assert nm._sweep_response is StimulusAnalysis._PRELOAD - assert nm._peak is StimulusAnalysis._PRELOAD - - for attr in trigger: - print(getattr(nm, attr)) - - assert nm._stim_table is not StimulusAnalysis._PRELOAD - assert nm._sweeplength is not StimulusAnalysis._PRELOAD - assert nm._sweep_response is not StimulusAnalysis._PRELOAD - assert nm._peak is not StimulusAnalysis._PRELOAD - - # check super properties weren't preloaded - dataset.get_corrected_fluorescence_traces.assert_called_once_with() - assert nm._timestamps is not NaturalMovie._PRELOAD - assert nm._celltraces is not NaturalMovie._PRELOAD - assert nm._numbercells is not NaturalMovie._PRELOAD - - assert not dataset.get_roi_ids.called - assert nm._roi_id is NaturalMovie._PRELOAD - - assert dataset.get_cell_specimen_ids.called - assert nm._cell_id is NaturalMovie._PRELOAD - - assert not dataset.get_dff_traces.called - assert nm._dfftraces is NaturalMovie._PRELOAD - - assert nm._dxcm is NaturalMovie._PRELOAD - assert nm._dxtime is NaturalMovie._PRELOAD diff --git a/allensdk/test/brain_observatory/test_natural_scenes.py b/allensdk/test/brain_observatory/test_natural_scenes.py deleted file mode 100644 index 447c21224d..0000000000 --- a/allensdk/test/brain_observatory/test_natural_scenes.py +++ /dev/null @@ -1,163 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.brain_observatory.natural_scenes import NaturalScenes -from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis -import pytest -from mock import patch, MagicMock - - -@pytest.fixture -def dataset(): - dataset = MagicMock(name='dataset') - - timestamps = MagicMock(name='timestamps') - celltraces = MagicMock(name='celltraces') - dataset.get_corrected_fluorescence_traces = \ - MagicMock(name='get_corrected_fluorescence_traces', - return_value=(timestamps, celltraces)) - dataset.get_roi_ids = MagicMock(name='get_roi_ids') - dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') - dff_traces = MagicMock(name="dfftraces") - dataset.get_dff_traces = MagicMock(name='get_dff_traces', - return_value=(None, dff_traces)) - dxcm = MagicMock(name='dxcm') - dxtime = MagicMock(name='dxtime') - dataset.get_running_speed=MagicMock(name='get_running_speed', - return_value=(dxcm, dxtime)) - dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', - return_value=MagicMock()) - - return dataset - -def mock_speed_tuning(): - binned_dx_sp = MagicMock(name='binned_dx_sp') - binned_cells_sp = MagicMock(name='binned_cells_sp') - binned_dx_vis = MagicMock(name='binned_dx_vis') - binned_cells_vis = MagicMock(name='binned_cells_vis') - peak_run = MagicMock(name='peak_run') - - return MagicMock(name='get_speed_tuning', - return_value=(binned_dx_sp, - binned_cells_sp, - binned_dx_vis, - binned_cells_vis, - peak_run)) - -def mock_sweep_response(): - sweep_response = MagicMock(name='sweep_response') - mean_sweep_response = MagicMock(name='mean_sweep_response') - pval = MagicMock(name='pval') - - return MagicMock(name='get_sweep_response', - return_value=(sweep_response, - mean_sweep_response, - pval)) - -@patch.object(StimulusAnalysis, - 'get_speed_tuning', - mock_speed_tuning()) -@patch.object(StimulusAnalysis, - 'get_sweep_response', - mock_sweep_response()) -@pytest.mark.parametrize('trigger', (1, 2, 3, 4, 5)) -def test_harness(dataset, trigger): - ns = NaturalScenes(dataset) - - assert ns._stim_table is StimulusAnalysis._PRELOAD - assert ns._number_scenes is StimulusAnalysis._PRELOAD - assert ns._sweeplength is StimulusAnalysis._PRELOAD - assert ns._interlength is StimulusAnalysis._PRELOAD - assert ns._extralength is StimulusAnalysis._PRELOAD - assert ns._sweep_response is StimulusAnalysis._PRELOAD - assert ns._mean_sweep_response is StimulusAnalysis._PRELOAD - assert ns._pval is StimulusAnalysis._PRELOAD - assert ns._response is StimulusAnalysis._PRELOAD - assert ns._peak is StimulusAnalysis._PRELOAD - - if trigger == 1: - print(ns._stim_table) - print(ns.sweep_response) - print(ns.response) - print(ns.peak) - if trigger == 2: - print(ns.number_scenes) - print(ns.sweep_response) - print(ns.response) - print(ns.peak) - elif trigger == 3: - print(ns.sweeplength) - print(ns.mean_sweep_response) - print(ns.response) - print(ns.peak) - elif trigger == 4: - print(ns.interlength) - print(ns.sweep_response) - print(ns.response) - print(ns.peak) - elif trigger == 5: - print(ns.extralength) - print(ns.mean_sweep_response) - print(ns.response) - print(ns.peak) - - assert ns._stim_table is not StimulusAnalysis._PRELOAD - assert ns._number_scenes is not StimulusAnalysis._PRELOAD - assert ns._sweeplength is not StimulusAnalysis._PRELOAD - assert ns._interlength is not StimulusAnalysis._PRELOAD - assert ns._extralength is not StimulusAnalysis._PRELOAD - assert ns._sweep_response is not StimulusAnalysis._PRELOAD - assert ns._mean_sweep_response is not StimulusAnalysis._PRELOAD - assert ns._pval is not StimulusAnalysis._PRELOAD - assert ns._response is not StimulusAnalysis._PRELOAD - assert ns._peak is not StimulusAnalysis._PRELOAD - - # check super properties - dataset.get_corrected_fluorescence_traces.assert_called_once_with() - assert ns._timestamps != NaturalScenes._PRELOAD - assert ns._celltraces != NaturalScenes._PRELOAD - assert ns._numbercells != NaturalScenes._PRELOAD - - assert not dataset.get_roi_ids.called - assert ns._roi_id is NaturalScenes._PRELOAD - - assert dataset.get_cell_specimen_ids.called - assert ns._cell_id is NaturalScenes._PRELOAD - - assert not dataset.get_dff_traces.called - assert ns._dfftraces is NaturalScenes._PRELOAD - - assert ns._dxcm is NaturalScenes._PRELOAD - assert ns._dxtime is NaturalScenes._PRELOAD diff --git a/allensdk/test/brain_observatory/test_notebook.py b/allensdk/test/brain_observatory/test_notebook.py deleted file mode 100644 index 3b3626614e..0000000000 --- a/allensdk/test/brain_observatory/test_notebook.py +++ /dev/null @@ -1,281 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.core.brain_observatory_cache import BrainObservatoryCache -from allensdk.brain_observatory.drifting_gratings import DriftingGratings -from allensdk.brain_observatory.static_gratings import StaticGratings -from allensdk.brain_observatory.natural_scenes import NaturalScenes -from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise -from allensdk.brain_observatory.r_neuropil import estimate_contamination_ratios -import allensdk.brain_observatory.stimulus_info as stim_info -import numpy as np -import pandas as pd -import pytest -import os - - -@pytest.fixture -def boc(tmpdir_factory): - manifest_file = tmpdir_factory.mktemp('data').join(os.path.join('boc','manifest.json')) - endpoint = os.environ['TEST_API_ENDPOINT'] if 'TEST_API_ENDPOINT' in os.environ else 'http://api.brain-map.org' - return BrainObservatoryCache(manifest_file=str(manifest_file), base_uri=endpoint) - - -@pytest.mark.nightly -def test_brain_observatory_trace_analysis_notebook(boc): - # Drifting Gratings - data_set = boc.get_ophys_experiment_data(502376461) - dg = DriftingGratings(data_set) - specimen_id = 517425074 - specimen_ids = data_set.get_cell_specimen_ids() - - cell_loc = np.argwhere(specimen_ids==specimen_id)[0][0] - - assert cell_loc == 97 - - # temporal frequency plot - response = dg.response[:,1:,cell_loc,0] - tfvals = dg.tfvals[1:] - orivals = dg.orivals - - # peak - pk = dg.peak.loc[cell_loc] - - # trials for cell's preferred condition - pref_ori = dg.orivals[dg.peak.ori_dg[cell_loc]] - pref_tf = dg.tfvals[dg.peak.tf_dg[cell_loc]] - assert pref_ori == 180 - assert pref_tf == 2 - - pref_trials = dg.stim_table[(dg.stim_table.orientation==pref_ori)&(dg.stim_table.temporal_frequency==pref_tf)] - assert pref_trials['start'][1] == 837 - assert pref_trials['end'][1] == 897 - - # mean sweep response - subset = dg.sweep_response[(dg.stim_table.orientation==pref_ori)&(dg.stim_table.temporal_frequency==pref_tf)] - subset_mean = dg.mean_sweep_response[(dg.stim_table.orientation==pref_ori)&(dg.stim_table.temporal_frequency==pref_tf)] - assert np.isclose(subset_mean['dx'][1], 0.920868) - - # response to each trial - trial_timestamps = np.arange(-1*dg.interlength, dg.interlength+dg.sweeplength, 1.)/dg.acquisition_rate - - -@pytest.mark.nightly -def test_brain_observatory_static_gratings_notebook(boc): - data_set = boc.get_ophys_experiment_data(510938357) - sg = StaticGratings(data_set) - - peak_head = sg.peak.head() - assert peak_head['cell_specimen_id'][0] == 517399188 - assert np.isclose(peak_head['reliability_sg'][0], -0.010099250163301616) - - -@pytest.mark.nightly -def test_brain_observatory_natural_scenes_notebook(boc): - data_set = boc.get_ophys_experiment_data(510938357) - ns = NaturalScenes(data_set) - ns_head = ns.peak.head() - - assert np.isclose(ns_head['peak_dff_ns'][0], 4.9614532738) - assert ns_head['cell_specimen_id'][0] == 517399188 - - -@pytest.mark.nightly -def test_brain_observatory_locally_sparse_noise_notebook(boc): - specimen_id = 517410165 - cell = boc.get_cell_specimens(ids=[specimen_id])[0] - - exp = boc.get_ophys_experiments(experiment_container_ids=[cell['experiment_container_id']], - stimuli=[stim_info.LOCALLY_SPARSE_NOISE])[0] - - data_set = boc.get_ophys_experiment_data(exp['id']) - lsn = LocallySparseNoise(data_set) - specimen_ids = data_set.get_cell_specimen_ids() - cell_loc = np.argwhere(specimen_ids==specimen_id)[0][0] - receptive_field = lsn.receptive_field[:,:,cell_loc,0] - - assert True - #assert cell_loc - #assert receptive_field - -@pytest.mark.nightly -def test_brain_observatory_experiment_containers_notebook(boc): - targeted_structures = boc.get_all_targeted_structures() - visp_ecs = boc.get_experiment_containers(targeted_structures=['VISp']) - depths = boc.get_all_imaging_depths() - stims = boc.get_all_stimuli() - cre_lines = boc.get_all_cre_lines() - cux2_ecs = boc.get_experiment_containers(cre_lines=['Cux2-CreERT2']) - cux2_ec_id = cux2_ecs[-1]['id'] - exps = boc.get_ophys_experiments(experiment_container_ids=[cux2_ec_id]) - exp = boc.get_ophys_experiments(experiment_container_ids=[cux2_ec_id], - stimuli=[stim_info.STATIC_GRATINGS])[0] - exp = boc.get_ophys_experiment_data(exp['id']) - - assert set(depths) == set([175, 185, 195, 200, 205, 225, 250, 265, 275, 276, 285, - 300, 320, 325, 335, 350, 365, 375, 390, 400, 550, 570, - 625]) - - expected_stimuli = ['drifting_gratings', - 'locally_sparse_noise', - 'locally_sparse_noise_4deg', - 'locally_sparse_noise_8deg', - 'natural_movie_one', - 'natural_movie_three', - 'natural_movie_two', - 'natural_scenes', - 'spontaneous', - 'static_gratings'] - - assert set(stims) == set(expected_stimuli) - - expected_cre_lines = [ u'Cux2-CreERT2', - u'Emx1-IRES-Cre', - u'Fezf2-CreER', - u'Nr5a1-Cre', - u'Ntsr1-Cre_GN220', - u'Pvalb-IRES-Cre', - u'Rbp4-Cre_KL100', - u'Rorb-IRES2-Cre', - u'Scnn1a-Tg3-Cre', - u'Slc17a7-IRES2-Cre', - u'Sst-IRES-Cre', - u'Tlx3-Cre_PL56', - u'Vip-IRES-Cre' ] - - assert set(cre_lines) == set(expected_cre_lines) - - cells = boc.get_cell_specimens() - - cells = pd.DataFrame.from_records(cells) - - # find direction selective cells in VISp - visp_ec_ids = [ ec['id'] for ec in visp_ecs ] - visp_cells = cells[cells['experiment_container_id'].isin(visp_ec_ids)] - - # significant response to drifting gratings stimulus - sig_cells = visp_cells[visp_cells['p_dg'] < 0.05] - - # direction selective cells - dsi_cells = sig_cells[(sig_cells['dsi_dg'] > 0.5) & (sig_cells['dsi_dg'] < 1.5)] - #assert len(cells) == 27124 - assert len(cells) > 0 - #assert len(visp_cells) == 16031 - assert len(visp_cells) > 0 - #assert len(sig_cells) == 8669 - assert len(sig_cells) > 0 - #assert len(dsi_cells) == 4943 - assert len(dsi_cells) > 0 - - # find experiment containers for those cells - dsi_ec_ids = dsi_cells['experiment_container_id'].unique() - - # Download the ophys experiments containing the drifting gratings stimulus for VISp experiment containers - dsi_exps = boc.get_ophys_experiments(experiment_container_ids=dsi_ec_ids, stimuli=[stim_info.DRIFTING_GRATINGS]) - - # pick a direction-selective cell and find its NWB file - dsi_cell = dsi_cells.iloc[0] - - # figure out which ophys experiment has the drifting gratings stimulus for the cell's experiment container - cell_exp = boc.get_ophys_experiments(experiment_container_ids=[dsi_cell['experiment_container_id']], - stimuli=[stim_info.DRIFTING_GRATINGS])[0] - - data_set = boc.get_ophys_experiment_data(cell_exp['id']) - - # Fluorescence - dsi_cell_id = dsi_cell['cell_specimen_id'] - time, raw_traces = data_set.get_fluorescence_traces(cell_specimen_ids=[dsi_cell_id]) - _, demixed_traces = data_set.get_demixed_traces(cell_specimen_ids=[dsi_cell_id]) - _, neuropil_traces = data_set.get_neuropil_traces(cell_specimen_ids=[dsi_cell_id]) - _, corrected_traces = data_set.get_corrected_fluorescence_traces(cell_specimen_ids=[dsi_cell_id]) - _, dff_traces = data_set.get_dff_traces(cell_specimen_ids=[dsi_cell_id]) - - # ROI Masks - data_set = boc.get_ophys_experiment_data(510221121) - - # get the specimen IDs for a few cells - cids = data_set.get_cell_specimen_ids()[:15:5] - - # get masks for specific cells - roi_mask_list = data_set.get_roi_mask(cell_specimen_ids=cids) - - # make a mask of all ROIs in the experiment - all_roi_masks = data_set.get_roi_mask_array() - combined_mask = all_roi_masks.max(axis=0) - - max_projection = data_set.get_max_projection() - - # ROI Analysis - # example loading drifing grating data - data_set = boc.get_ophys_experiment_data(512326618) - dg = DriftingGratings(data_set) - - # filter for visually responding, selective cells - vis_cells = (dg.peak.ptest_dg < 0.05) & (dg.peak.peak_dff_dg > 3) - osi_cells = vis_cells & (dg.peak.osi_dg > 0.5) & (dg.peak.osi_dg <= 1.5) - dsi_cells = vis_cells & (dg.peak.dsi_dg > 0.5) & (dg.peak.dsi_dg <= 1.5) - - # 2-d tf vs. ori histogram - # tfval = 0 is used for the blank sweep, so we are ignoring it here - os = np.zeros((len(dg.orivals), len(dg.tfvals)-1)) - ds = np.zeros((len(dg.orivals), len(dg.tfvals)-1)) - - for i,trial in dg.peak[osi_cells].iterrows(): - os[trial.ori_dg, trial.tf_dg-1] += 1 - - for i,trial in dg.peak[dsi_cells].iterrows(): - ds[trial.ori_dg, trial.tf_dg-1] += 1 - - max_count = max(os.max(), ds.max()) - - # Neuropil correction - data_set = boc.get_ophys_experiment_data(569407590) - csid = data_set.get_cell_specimen_ids()[0] - - time, demixed_traces = data_set.get_demixed_traces( - cell_specimen_ids=[csid]) - _, neuropil_traces = data_set.get_neuropil_traces(cell_specimen_ids=[csid]) - - results = estimate_contamination_ratios(demixed_traces[0], neuropil_traces[0]) - correction = demixed_traces[0] - results['r'] * neuropil_traces[0] - _, corrected_traces = data_set.get_corrected_fluorescence_traces( - cell_specimen_ids=[csid]) - - # Running Speed and Motion Correction - data_set = boc.get_ophys_experiment_data(512326618) - dxcm, dxtime = data_set.get_running_speed() - mc = data_set.get_motion_correction() - - assert True diff --git a/allensdk/test/brain_observatory/test_observatory_plots.py b/allensdk/test/brain_observatory/test_observatory_plots.py deleted file mode 100644 index 93673905e6..0000000000 --- a/allensdk/test/brain_observatory/test_observatory_plots.py +++ /dev/null @@ -1,268 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import os -import matplotlib.image as mpimg -import numpy as np -from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet -import allensdk.brain_observatory.observatory_plots as oplots -from allensdk.brain_observatory.static_gratings import StaticGratings -from allensdk.brain_observatory.drifting_gratings import DriftingGratings -from allensdk.brain_observatory.natural_scenes import NaturalScenes -from allensdk.brain_observatory.natural_movie import NaturalMovie -from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise -import allensdk.brain_observatory.stimulus_info as stiminfo -import allensdk.core.json_utilities as ju -from pkg_resources import resource_filename # @UnresolvedImport - - -data_file = os.environ.get('TEST_OBSERVATORY_EXPERIMENT_PLOTS_DATA', 'skip') -if data_file == 'default': - data_file = resource_filename(__name__, 'test_observatory_plots_data.json') - -if data_file == 'skip': - EXPERIMENT_CONTAINER=None - TEST_DATA_DIR=None -else: - EXPERIMENT_CONTAINER = ju.read(data_file) - TEST_DATA_DIR = EXPERIMENT_CONTAINER['image_directory'] - -class AnalysisSingleton(object): - def __init__(self, klass, session, *args): - self.klass = klass - self.session = session - self.args = args - - self.obj = None - - @staticmethod - def experiment_for_session(session): - return next(exp for exp in EXPERIMENT_CONTAINER['experiments'] if exp['session'] == session) - - def __call__(self): - if self.obj is None: - exp = self.experiment_for_session(self.session) - data_set = BrainObservatoryNwbDataSet(exp['nwb_file']) - self.obj = self.klass.from_analysis_file(data_set, exp['analysis_file'], *self.args) - - return self.obj - -STATIC_GRATINGS = AnalysisSingleton(StaticGratings, stiminfo.THREE_SESSION_B) -DRIFTING_GRATINGS = AnalysisSingleton(DriftingGratings, stiminfo.THREE_SESSION_A) -NATURAL_SCENES = AnalysisSingleton(NaturalScenes, stiminfo.THREE_SESSION_B) -NATURAL_MOVIE_ONE_A = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_A, stiminfo.NATURAL_MOVIE_ONE) -NATURAL_MOVIE_ONE_B = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_B, stiminfo.NATURAL_MOVIE_ONE) -NATURAL_MOVIE_ONE_C = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_C, stiminfo.NATURAL_MOVIE_ONE) -NATURAL_MOVIE_TWO = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_C, stiminfo.NATURAL_MOVIE_TWO) -NATURAL_MOVIE_THREE = AnalysisSingleton(NaturalMovie, stiminfo.THREE_SESSION_A, stiminfo.NATURAL_MOVIE_THREE) -LOCALLY_SPARSE_NOISE = AnalysisSingleton(LocallySparseNoise, stiminfo.THREE_SESSION_C, stiminfo.LOCALLY_SPARSE_NOISE) - -if EXPERIMENT_CONTAINER: - CELL_SPECIMEN_ID = EXPERIMENT_CONTAINER['cells'][0] -else: - CELL_SPECIMEN_ID = None - - -def assert_images_match(new_file, test_file, shape): - assert os.path.exists(new_file) - new_img = mpimg.imread(new_file) - assert np.allclose(new_img.shape[:2], shape) - - assert os.path.exists(test_file) - test_img = mpimg.imread(test_file) - assert np.allclose(new_img.shape, test_img.shape) - assert np.allclose(test_img.shape[:2], shape) - - assert (new_img - test_img).mean() < 0.1 - - os.remove(new_file) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,static_gratings", - [ [ 'static_gratings_ttp.png', STATIC_GRATINGS ] ]) -def test_ttp_static_gratings(new_file, static_gratings, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - static_gratings().plot_time_to_peak() - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,static_gratings", - [ [ 'static_gratings_pref_ori.png', STATIC_GRATINGS ] ]) -def test_pref_ori_static_gratings(new_file, static_gratings, shape=[250,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - static_gratings().plot_preferred_orientation() - oplots.finalize_no_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,static_gratings", - [ [ 'static_gratings_ori.png', STATIC_GRATINGS ] ]) -def test_osi_static_gratings(new_file, static_gratings, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - static_gratings().plot_orientation_selectivity() - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,static_gratings", - [ [ 'static_gratings_pref_sf.png', STATIC_GRATINGS ] ]) -def test_pref_sf(new_file, static_gratings, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - static_gratings().plot_preferred_spatial_frequency() - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,drifting_gratings", - [ [ 'drifting_gratings_pref_dir.png', DRIFTING_GRATINGS ] ]) -def test_pref_dir_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - drifting_gratings().plot_preferred_direction() - oplots.finalize_no_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,drifting_gratings", - [ [ 'drifting_gratings_pref_tf.png', DRIFTING_GRATINGS ] ]) -def test_pref_tf_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - drifting_gratings().plot_preferred_temporal_frequency() - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,drifting_gratings", - [ [ 'drifting_gratings_dsi.png', DRIFTING_GRATINGS ] ]) -def test_dsi_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - drifting_gratings().plot_direction_selectivity() - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,drifting_gratings", - [ [ 'drifting_gratings_osi.png', DRIFTING_GRATINGS ] ]) -def test_osi_drifting_gratings(new_file, drifting_gratings, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - drifting_gratings().plot_orientation_selectivity() - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,natural_scenes", - [ [ 'natural_scenes_ttp.png', NATURAL_SCENES ] ]) -def test_ttp_natural_scenes(new_file, natural_scenes, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - natural_scenes().plot_time_to_peak() - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,static_gratings,cell_specimen_id", - [ [ 'static_gratings_fan_plot.png', STATIC_GRATINGS, CELL_SPECIMEN_ID ] ]) -def test_fan_plot(new_file, static_gratings, cell_specimen_id, shape=[250,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - static_gratings().open_fan_plot(cell_specimen_id) - oplots.finalize_no_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,natural_scenes,cell_specimen_id", - [ [ 'natural_scenes_fan_plot.png', NATURAL_SCENES, CELL_SPECIMEN_ID ] ]) -def test_corona_plot(new_file, natural_scenes, cell_specimen_id, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - natural_scenes().open_corona_plot(cell_specimen_id) - oplots.finalize_no_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,natural_movie,cell_specimen_id", - [ ("natural_movie_one_a_track_plot.png", NATURAL_MOVIE_ONE_A, CELL_SPECIMEN_ID), - ("natural_movie_one_b_track_plot.png", NATURAL_MOVIE_ONE_B, CELL_SPECIMEN_ID), - ("natural_movie_one_c_track_plot.png", NATURAL_MOVIE_ONE_C, CELL_SPECIMEN_ID), - ("natural_movie_two_track_plot.png", NATURAL_MOVIE_TWO, CELL_SPECIMEN_ID), - ("natural_movie_three_track_plot.png", NATURAL_MOVIE_THREE, CELL_SPECIMEN_ID) ]) -def test_track_plot(new_file, natural_movie, cell_specimen_id, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - natural_movie().open_track_plot(cell_specimen_id) - oplots.finalize_no_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,drifting_gratings,cell_specimen_id", - [ [ 'drifting_gratings_star_plot.png', DRIFTING_GRATINGS, CELL_SPECIMEN_ID ] ]) -def test_star_plot(new_file, drifting_gratings, cell_specimen_id, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - drifting_gratings().open_star_plot(cell_specimen_id) - oplots.finalize_no_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,analysis,cell_specimen_id", - [ ("3sa_speed_tuning_plot.png", DRIFTING_GRATINGS, CELL_SPECIMEN_ID), - ("3sb_speed_tuning_plot.png", STATIC_GRATINGS, CELL_SPECIMEN_ID), - ("3sc_speed_tuning_plot.png", NATURAL_MOVIE_TWO, CELL_SPECIMEN_ID) ]) -def test_speed_tuning_plot(new_file, analysis, cell_specimen_id, shape=[500,500]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - analysis().plot_speed_tuning(cell_specimen_id) - oplots.finalize_with_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) - - -@pytest.mark.skipif(data_file == 'skip', reason='NWB Data files not configured') -@pytest.mark.parametrize("new_file,locally_sparse_noise,on,cell_specimen_id", - [ ('locally_sparse_noise_on.png', LOCALLY_SPARSE_NOISE, True, CELL_SPECIMEN_ID), - ('locally_sparse_noise_off.png', LOCALLY_SPARSE_NOISE, False, CELL_SPECIMEN_ID) ]) -def test_pincushion_plot(new_file, locally_sparse_noise, on, cell_specimen_id, shape=[500,877]): - with oplots.figure_in_px(shape[1], shape[0], new_file) as fig: - locally_sparse_noise().open_pincushion_plot(on, cell_specimen_id) - oplots.finalize_no_axes() - assert_images_match(new_file, os.path.join(TEST_DATA_DIR, new_file), shape) diff --git a/allensdk/test/brain_observatory/test_observatory_plots_data.json b/allensdk/test/brain_observatory/test_observatory_plots_data.json deleted file mode 100644 index e17d2898f0..0000000000 --- a/allensdk/test/brain_observatory/test_observatory_plots_data.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "image_directory": "/data/informatics/module_test_data/observatory/plots/", - "cells": [ - 517446551 - ], - "experiments": [ - { - "nwb_file": "/data/informatics/module_test_data/observatory/plots/510859641.nwb", - "session": "three_session_A", - "analysis_file": "/data/informatics/module_test_data/observatory/plots/510859641_three_session_A_analysis.h5" - }, - { - "nwb_file": "/data/informatics/module_test_data/observatory/plots/510698988.nwb", - "session": "three_session_B", - "analysis_file": "/data/informatics/module_test_data/observatory/plots/510698988_three_session_B_analysis.h5" - }, - { - "nwb_file": "/data/informatics/module_test_data/observatory/plots/510532780.nwb", - "session": "three_session_C", - "analysis_file": "/data/informatics/module_test_data/observatory/plots/510532780_three_session_C_analysis.h5" - } - ], - "id": 511511083 -} \ No newline at end of file diff --git a/allensdk/test/brain_observatory/test_roi_masks.py b/allensdk/test/brain_observatory/test_roi_masks.py deleted file mode 100644 index e0266038d4..0000000000 --- a/allensdk/test/brain_observatory/test_roi_masks.py +++ /dev/null @@ -1,215 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import numpy as np -import pandas as pd -import pytest -import allensdk.brain_observatory.roi_masks as roi_masks - - -def test_init_by_pixels(): - a = np.array([[0, 0], [1, 1], [1, 0]]) - - m = roi_masks.create_roi_mask(2, 2, [0, 0, 0, 0], pix_list=a) - - mp = m.get_mask_plane() - - assert mp[0, 0] == 1 - assert mp[1, 1] == 1 - assert mp[1, 0] == 0 - assert mp[1, 1] == 1 - - assert m.x == 0 - assert m.width == 2 - assert m.y == 0 - assert m.height == 2 - - -def test_init_by_pixels_with_border(): - a = np.array([[1, 1], [2, 1]]) - - m = roi_masks.create_roi_mask(3, 3, [1, 1, 1, 1], pix_list=a) - - assert m.x == 1 - assert m.width == 2 - assert m.y == 1 - assert m.height == 1 - assert m.overlaps_motion_border is True - - -def test_init_by_pixels_large(): - a = np.random.random((512, 512)) - a[a > 0.5] = 1 - - m = roi_masks.create_roi_mask( - 512, 512, [0, 0, 0, 0], pix_list=np.argwhere(a)) - - npx = len(np.where(a)[0]) - assert npx == len(np.where(m.get_mask_plane())[0]) - - -def test_create_neuropil_mask(): - - image_width = 100 - image_height = 80 - - # border = [image_width-1, 0, image_height-1, 0] - border = [5, 5, 5, 5] - - roi_mask = np.zeros((image_height, image_width), dtype=np.uint8) - roi_mask[40:45, 30:35] = 1 - - combined_binary_mask = np.zeros((image_height, image_width), dtype=np.uint8) - combined_binary_mask[:, 45:] = 1 - - roi = roi_masks.create_roi_mask(image_w=image_width, image_h=image_height, border=border, roi_mask=roi_mask) - obtained = roi_masks.create_neuropil_mask(roi, border, combined_binary_mask) - - expected_mask = np.zeros((58-27, 45-17), dtype=np.uint8) - expected_mask[:, :] = 1 - - assert np.allclose(expected_mask, obtained.mask) - assert obtained.x == 17 - assert obtained.y == 27 - assert obtained.width == 28 - assert obtained.height == 31 - - -def test_create_empty_neuropil_mask(): - image_width = 100 - image_height = 80 - - # border = [image_width-1, 0, image_height-1, 0] - border = [5, 5, 5, 5] - - roi_mask = np.zeros((image_height, image_width), dtype=np.uint8) - roi_mask[40:45, 30:35] = 1 - - combined_binary_mask = np.zeros((image_height, image_width), dtype=np.uint8) - combined_binary_mask[:, :] = 1 - - roi = roi_masks.create_roi_mask(image_w=image_width, image_h=image_height, border=border, roi_mask=roi_mask) - obtained = roi_masks.create_neuropil_mask(roi, border, combined_binary_mask) - - assert obtained.mask is None - assert 'zero_pixels' in obtained.flags - - -@pytest.fixture -def image_dims(): - return { - 'width': 100, - 'height': 100 - } - - -@pytest.fixture -def motion_border(): - return [5.0, 5.0, 5.0, 5.0] - -@pytest.fixture -def roi_mask_list(image_dims, motion_border): - - base_pixels = np.argwhere(np.ones((10, 10))) - - masks = [] - for ii in range(10): - pixels = base_pixels + ii * 10 - masks.append(roi_masks.create_roi_mask( - image_dims['width'], - image_dims['height'], - motion_border, - pix_list=pixels, - label=str(ii), - mask_group=-1 - )) - - return masks - -@pytest.fixture -def neuropil_masks(roi_mask_list, motion_border): - neuropil_masks = [] - - mask_array = roi_masks.create_roi_mask_array(roi_mask_list) - combined_mask = mask_array.max(axis=0) - - for roi_mask in roi_mask_list: - neuropil_masks.append(roi_masks.create_neuropil_mask( - roi_mask, - motion_border, - combined_mask, - roi_mask.label - )) - return neuropil_masks - -@pytest.fixture -def video(image_dims): - num_frames = 20 - data = np.ones((num_frames, image_dims['height'], image_dims['width'])) - data[:, 50:, 50:] = 2 - return data - - -def test_calculate_traces(video, roi_mask_list): - roi_traces, exclusions = roi_masks.calculate_traces(video, roi_mask_list) - - expected_exclusions = pd.DataFrame({ - 'roi_id': ['0', '9'], - 'exclusion_label_name': ['motion_border', 'motion_border'] - }) - - assert np.all(np.isnan(roi_traces[0, :])) - assert np.all(roi_traces[4, :] == 1) - assert np.all(roi_traces[6, :] == 2) - assert np.all(np.isnan(roi_traces[9, :])) - - pd.testing.assert_frame_equal(expected_exclusions, pd.DataFrame(exclusions), check_like=True) - - -def test_validate_masks(roi_mask_list, neuropil_masks): - roi_mask_list.extend(neuropil_masks) - roi_mask_list[3].mask = np.zeros_like(roi_mask_list[3].mask) - roi_mask_list[17].mask = np.zeros_like(roi_mask_list[17].mask) - - obtained = [] - for mask in roi_mask_list: - obtained.extend(roi_masks.validate_mask(mask)) - - expected_exclusions = pd.DataFrame({ - 'roi_id': ['0', '3', '9', '7'], - 'exclusion_label_name': ['motion_border', 'empty_roi_mask', 'motion_border', 'empty_neuropil_mask'] - }) - pd.testing.assert_frame_equal(expected_exclusions, pd.DataFrame(obtained), check_like=True) - diff --git a/allensdk/test/brain_observatory/test_session_analysis.py b/allensdk/test/brain_observatory/test_session_analysis.py deleted file mode 100644 index fa9754605a..0000000000 --- a/allensdk/test/brain_observatory/test_session_analysis.py +++ /dev/null @@ -1,141 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import patch -from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet -from allensdk.brain_observatory.session_analysis import SessionAnalysis -import os - - -_orig_get_stimulus_table = BrainObservatoryNwbDataSet.get_stimulus_table - - -def mock_stimulus_table(dset, name): - t = _orig_get_stimulus_table(dset, name) - t.set_value(0, 'end', - t.loc[0,'start'] + 10) - - return t - - -@pytest.fixture -def session_a(): - filename = os.path.abspath(os.path.join( - "/", "allen", "aibs", "informatics", "module_test_data", - "observatory", "test_nwb", "out_510390912.nwb" - )) - save_path = 'xyza' - - sa = SessionAnalysis(filename, save_path) - - return sa - - -@pytest.fixture -def session_b(): - filename = os.path.abspath(os.path.join( - "/", "allen", "aibs", "informatics", "module_test_data", - "observatory", "test_nwb", "506278598.nwb" - )) - save_path = 'xyzb' - - sa = SessionAnalysis(filename, save_path) - - return sa - - -@pytest.fixture -def session_c(): - filename = os.path.abspath(os.path.join( - "/", "allen", "aibs", "informatics", "module_test_data", - "observatory", "test_nwb", "out_510221121.nwb" - )) - save_path = 'xyzc' - - sa = SessionAnalysis(filename, save_path) - - return sa - - -@pytest.mark.nightly -@pytest.mark.parametrize('plot_flag',[False]) -def test_session_a(session_a, plot_flag): - with patch('allensdk.core.brain_observatory_nwb_data_set.BrainObservatoryNwbDataSet.get_stimulus_table', - mock_stimulus_table): - session_a.session_a(plot_flag=plot_flag) - - assert True - - -@pytest.mark.nightly -@pytest.mark.parametrize('plot_flag',[False]) -def test_session_b(session_b, plot_flag): - with patch('allensdk.core.brain_observatory_nwb_data_set.BrainObservatoryNwbDataSet.get_stimulus_table', - mock_stimulus_table): - session_b.session_b(plot_flag=plot_flag) - - assert True - - -@pytest.mark.nightly -@pytest.mark.parametrize('plot_flag',[False]) -def test_session_c(session_c, plot_flag): - with patch('allensdk.core.brain_observatory_nwb_data_set.BrainObservatoryNwbDataSet.get_stimulus_table', - mock_stimulus_table): - session_c.session_c(plot_flag=plot_flag) - - assert True - - -@pytest.mark.nightly -def test_session_get_session_type(session_a): - session_type = session_a.nwb.get_session_type() - - assert session_type == 'three_session_A' - - -@pytest.mark.nightly -def test_session_get_session_type_b(session_b): - session_type = session_b.nwb.get_session_type() - - assert session_type == 'three_session_B' - - -@pytest.mark.nightly -def test_session_get_session_type_c(session_c): - session_type = session_c.nwb.get_session_type() - - assert session_type == 'three_session_C' diff --git a/allensdk/test/brain_observatory/test_session_analysis_regression.py b/allensdk/test/brain_observatory/test_session_analysis_regression.py deleted file mode 100644 index 1dcc466bef..0000000000 --- a/allensdk/test/brain_observatory/test_session_analysis_regression.py +++ /dev/null @@ -1,279 +0,0 @@ -import logging -import sys -logging.basicConfig(level=logging.DEBUG) - -import pytest -import os -import json -from pkg_resources import resource_filename # @UnresolvedImport -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.drifting_gratings import DriftingGratings -from allensdk.brain_observatory.static_gratings import StaticGratings -from allensdk.brain_observatory.natural_movie import NaturalMovie -from allensdk.brain_observatory.natural_scenes import NaturalScenes -from allensdk.brain_observatory.locally_sparse_noise import LocallySparseNoise -from allensdk.brain_observatory.session_analysis import SessionAnalysis -from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet as BODS -import allensdk.brain_observatory.stimulus_info as si - -if 'TEST_SESSION_ANALYSIS_REGRESSION_DATA' in os.environ: - data_file = os.environ['TEST_SESSION_ANALYSIS_REGRESSION_DATA'] -else: - data_file = resource_filename(__name__, 'test_session_analysis_regression_data.json') - -@pytest.fixture(scope="module") -def paths(): - pyversion = sys.version_info[0] - logging.debug("loading " + data_file) - with open(data_file,'r') as f: - data = json.load(f) - return data[str(pyversion)] - -@pytest.fixture(scope="module") -def nwb_a(paths): - return paths['nwb_a'] - -@pytest.fixture(scope="module") -def nwb_b(paths): - return paths['nwb_b'] - -@pytest.fixture(scope="module") -def nwb_c(paths): - return paths['nwb_c'] - -@pytest.fixture(scope="module") -def analysis_a(paths): - return paths['analysis_a'] - -@pytest.fixture(scope="module") -def analysis_b(paths): - return paths['analysis_b'] - -@pytest.fixture(scope="module") -def analysis_c(paths): - return paths['analysis_c'] - -# session a - -@pytest.fixture(scope="module") -def dg(nwb_a, analysis_a): - return DriftingGratings.from_analysis_file(BODS(nwb_a), analysis_a) - -@pytest.fixture(scope="module") -def nm1a(nwb_a, analysis_a): - return NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a, si.NATURAL_MOVIE_ONE) - -@pytest.fixture(scope="module") -def nm3(nwb_a, analysis_a): - return NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a, si.NATURAL_MOVIE_THREE) - -# session b - -@pytest.fixture(scope="module") -def sg(nwb_b, analysis_b): - return StaticGratings.from_analysis_file(BODS(nwb_b), analysis_b) - -@pytest.fixture(scope="module") -def nm1b(nwb_b, analysis_b): - return NaturalMovie.from_analysis_file(BODS(nwb_b), analysis_b, si.NATURAL_MOVIE_ONE) - -@pytest.fixture(scope="module") -def ns(nwb_b, analysis_b): - return NaturalScenes.from_analysis_file(BODS(nwb_b), analysis_b) - -# session c -@pytest.fixture(scope="module") -def lsn(nwb_c, analysis_c): - # in order to work around 2/3 unicode compatibility, separate files are specified for python 2 and 3 - # we need to look up a different key depending on python version - key = si.LOCALLY_SPARSE_NOISE_4DEG if sys.version_info < (3,) else si.LOCALLY_SPARSE_NOISE - - return LocallySparseNoise.from_analysis_file(BODS(nwb_c), analysis_c, key) - -@pytest.fixture(scope="module") -def nm1c(nwb_c, analysis_c): - return NaturalMovie.from_analysis_file(BODS(nwb_c), analysis_c, si.NATURAL_MOVIE_ONE) - -@pytest.fixture(scope="module") -def nm2(nwb_c, analysis_c): - return NaturalMovie.from_analysis_file(BODS(nwb_c), analysis_c, si.NATURAL_MOVIE_TWO) - -@pytest.fixture(scope="module") -def analysis_a_new(nwb_a, tmpdir_factory): - save_path = str(tmpdir_factory.mktemp("session_a") / "session_a_new.h5") - - logging.debug("running analysis a") - session_analysis = SessionAnalysis(nwb_a, save_path) - session_analysis.session_a(plot_flag=False, save_flag=True) - logging.debug("done running analysis a") - logging.debug(save_path) - - yield save_path - - -@pytest.fixture(scope="module") -def analysis_b_new(nwb_b, tmpdir_factory): - save_path = str(tmpdir_factory.mktemp("session_b") / "session_b_new.h5") - - logging.debug("running analysis b") - session_analysis = SessionAnalysis(nwb_b, save_path) - session_analysis.session_b(plot_flag=False, save_flag=True) - logging.debug("done running analysis b") - logging.debug(save_path) - - yield save_path - - -@pytest.fixture(scope="module") -def analysis_c_new(nwb_c, tmpdir_factory): - save_path = str(tmpdir_factory.mktemp("session_c") / "session_c_new.h5") - - logging.debug("running analysis c") - session_analysis = SessionAnalysis(nwb_c, save_path) - - session_type = BODS(nwb_c).get_metadata()['session_type'] - if session_type == si.THREE_SESSION_C2: - session_analysis.session_c2(plot_flag=False, save_flag=True) - elif session_type == si.THREE_SESSION_C: - session_analysis.session_c(plot_flag=False, save_flag=True) - logging.debug("done running analysis c") - - logging.debug(save_path) - - yield save_path - - -def compare_peak(p1, p2): - assert len(set(p1.columns) ^ set(p2.columns)) == 0 - - p1 = p1.infer_objects() - p2 = p2.infer_objects() - - peak_blacklist = [ "rf_center_on_x_lsn", - "rf_center_on_y_lsn", - "rf_center_off_x_lsn", - "rf_center_off_y_lsn", - "rf_area_on_lsn", - "rf_area_off_lsn", - "rf_distance_lsn", - "rf_overlap_index_lsn", - "rf_chi2_lsn" ] - - for col in p1.select_dtypes(include=[np.number]): - if col in peak_blacklist: - logging.debug("skipping " + col) - continue - - logging.debug("checking " + col) - assert np.allclose(p1[col], p2[col], equal_nan=True) - - for col in p1.select_dtypes(include=['O']): - logging.debug("checking " + col) - assert all(p1[col] == p2[col]) - -@pytest.mark.nightly -def test_session_a(analysis_a, analysis_a_new): - peak = pd.read_hdf(analysis_a, "analysis/peak") - new_peak = pd.read_hdf(analysis_a_new, "analysis/peak") - compare_peak(peak, new_peak) - - -@pytest.mark.nightly -def test_drifting_gratings(dg, nwb_a, analysis_a_new): - logging.debug("reading outputs") - dg_new = DriftingGratings.from_analysis_file(BODS(nwb_a), analysis_a_new) - #assert np.allclose(dg.sweep_response, dg_new.sweep_response) - assert np.allclose(dg.mean_sweep_response, dg_new.mean_sweep_response, equal_nan=True) - - assert np.allclose(dg.response, dg_new.response, equal_nan=True) - assert np.allclose(dg.noise_correlation, dg_new.noise_correlation, equal_nan=True) - assert np.allclose(dg.signal_correlation, dg_new.signal_correlation, equal_nan=True) - assert np.allclose(dg.representational_similarity, dg_new.representational_similarity, equal_nan=True) - -@pytest.mark.nightly -def test_natural_movie_one_a(nm1a, nwb_a, analysis_a_new): - nm1a_new = NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a_new, si.NATURAL_MOVIE_ONE) - #assert np.allclose(nm1a.sweep_response, nm1a_new.sweep_response) - assert np.allclose(nm1a.binned_cells_sp, nm1a_new.binned_cells_sp, equal_nan=True) - assert np.allclose(nm1a.binned_cells_vis, nm1a_new.binned_cells_vis, equal_nan=True) - assert np.allclose(nm1a.binned_dx_sp, nm1a_new.binned_dx_sp, equal_nan=True) - assert np.allclose(nm1a.binned_dx_vis, nm1a_new.binned_dx_vis, equal_nan=True) - -@pytest.mark.nightly -def test_natural_movie_three(nm3, nwb_a, analysis_a_new): - #nm3_new = NaturalMovie.from_analysis_file(BODS(nwb_a), analysis_a_new, si.NATURAL_MOVIE_THREE) - #assert np.allclose(nm3.sweep_response, nm3_new.sweep_response) - pass - - -@pytest.mark.nightly -def test_session_b(analysis_b, analysis_b_new): - peak = pd.read_hdf(analysis_b, "analysis/peak") - new_peak = pd.read_hdf(analysis_b_new, "analysis/peak") - compare_peak(peak, new_peak) - -@pytest.mark.nightly -def test_static_gratings(sg, nwb_b, analysis_b_new): - sg_new = StaticGratings.from_analysis_file(BODS(nwb_b), analysis_b_new) - #assert np.allclose(sg.sweep_response, sg_new.sweep_response) - assert np.allclose(sg.mean_sweep_response, sg_new.mean_sweep_response, equal_nan=True) - - assert np.allclose(sg.response, sg_new.response, equal_nan=True) - assert np.allclose(sg.noise_correlation, sg_new.noise_correlation, equal_nan=True) - assert np.allclose(sg.signal_correlation, sg_new.signal_correlation, equal_nan=True) - assert np.allclose(sg.representational_similarity, sg_new.representational_similarity, equal_nan=True) - -@pytest.mark.nightly -def test_natural_movie_one_b(nm1b, nwb_b, analysis_b_new): - nm1b_new = NaturalMovie.from_analysis_file(BODS(nwb_b), analysis_b_new, si.NATURAL_MOVIE_ONE) - #assert np.allclose(nm1b.sweep_response, nm1b_new.sweep_response) - - assert np.allclose(nm1b.binned_cells_sp, nm1b_new.binned_cells_sp, equal_nan=True) - assert np.allclose(nm1b.binned_cells_vis, nm1b_new.binned_cells_vis, equal_nan=True) - assert np.allclose(nm1b.binned_dx_sp, nm1b_new.binned_dx_sp, equal_nan=True) - assert np.allclose(nm1b.binned_dx_vis, nm1b_new.binned_dx_vis, equal_nan=True) - -@pytest.mark.nightly -def test_natural_scenes(ns, nwb_b, analysis_b_new): - ns_new = NaturalScenes.from_analysis_file(BODS(nwb_b), analysis_b_new) - #assert np.allclose(ns.sweep_response, ns_new.sweep_response) - assert np.allclose(ns.mean_sweep_response, ns_new.mean_sweep_response, equal_nan=True) - - assert np.allclose(ns.noise_correlation, ns_new.noise_correlation, equal_nan=True) - assert np.allclose(ns.signal_correlation, ns_new.signal_correlation, equal_nan=True) - assert np.allclose(ns.representational_similarity, ns_new.representational_similarity, equal_nan=True) - -@pytest.mark.nightly -def test_session_c(analysis_c, analysis_c_new): - peak = pd.read_hdf(analysis_c, "analysis/peak") - new_peak = pd.read_hdf(analysis_c_new, "analysis/peak") - compare_peak(peak, new_peak) - -@pytest.mark.nightly -def test_locally_sparse_noise(lsn, nwb_c, analysis_c_new): - ds = BODS(nwb_c) - session_type = ds.get_metadata()['session_type'] - logging.debug(session_type) - - if session_type == si.THREE_SESSION_C: - lsn_new = LocallySparseNoise.from_analysis_file(ds, analysis_c_new, si.LOCALLY_SPARSE_NOISE) - elif session_type == si.THREE_SESSION_C2: - lsn_new = LocallySparseNoise.from_analysis_file(ds, analysis_c_new, si.LOCALLY_SPARSE_NOISE_4DEG) - - #assert np.allclose(lsn.sweep_response, lsn_new.sweep_response) - assert np.allclose(lsn.mean_sweep_response, lsn_new.mean_sweep_response, equal_nan=True) - -@pytest.mark.nightly -def test_natural_movie_one_c(nm1c, nwb_c, analysis_c_new): - nm1c_new = NaturalMovie.from_analysis_file(BODS(nwb_c), analysis_c_new, si.NATURAL_MOVIE_ONE) - #assert np.allclose(nm1c.sweep_response, nm1c_new.sweep_response) - - assert np.allclose(nm1c.binned_dx_sp, nm1c_new.binned_dx_sp, equal_nan=True) - assert np.allclose(nm1c.binned_dx_vis, nm1c_new.binned_dx_vis, equal_nan=True) - assert np.allclose(nm1c.binned_cells_sp, nm1c_new.binned_cells_sp, equal_nan=True) - assert np.allclose(nm1c.binned_cells_vis, nm1c_new.binned_cells_vis, equal_nan=True) - - - diff --git a/allensdk/test/brain_observatory/test_session_analysis_regression_data.json b/allensdk/test/brain_observatory/test_session_analysis_regression_data.json deleted file mode 100644 index 72767b0f06..0000000000 --- a/allensdk/test/brain_observatory/test_session_analysis_regression_data.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "2": { - "analysis_a": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847_three_session_A_analysis.h5", - "analysis_b": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590_three_session_B_analysis.h5", - "analysis_c": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121_three_session_C2_analysis.h5", - "nwb_a": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847.nwb", - "nwb_b": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590.nwb", - "nwb_c": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121.nwb" - }, - "3": { - "analysis_a": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/new_ks_2samp-2020-07-07/510859641_three_session_A_analysis.h5", - "analysis_b": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/new_ks_2samp-2020-07-07/510698988_three_session_B_analysis.h5", - "analysis_c": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/new_ks_2samp-2020-07-07/510532780_three_session_C_analysis.h5", - "nwb_a": "/allen/aibs/informatics/module_test_data/observatory//plots/510859641.nwb", - "nwb_b": "/allen/aibs/informatics/module_test_data/observatory/plots/510698988.nwb", - "nwb_c": "/allen/aibs/informatics/module_test_data/observatory/plots/510532780.nwb" - } -} \ No newline at end of file diff --git a/allensdk/test/brain_observatory/test_session_analysis_regression_data_list.json b/allensdk/test/brain_observatory/test_session_analysis_regression_data_list.json deleted file mode 100644 index fe9f455201..0000000000 --- a/allensdk/test/brain_observatory/test_session_analysis_regression_data_list.json +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121.nwb", - "version": 2, - "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569494121_three_session_C2_analysis.h5", - "ophys_experiment_id": 569494121, - "session_type": "three_session_C2" - }, - { - "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847.nwb", - "version": 2, - "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/570305847_three_session_A_analysis.h5", - "ophys_experiment_id": 570305847, - "session_type": "three_session_A" - }, - { - "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590.nwb", - "version": 2, - "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py2_analysis/569407590_three_session_B_analysis.h5", - "ophys_experiment_id": 569407590, - "session_type": "three_session_B" - }, - { - "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/plots/510532780.nwb", - "version": 3, - "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/510532780_three_session_C_analysis.h5", - "ophys_experiment_id": 510532780, - "session_type": "three_session_C" - }, - { - "nwb_file": "/allen/aibs/informatics/module_test_data/observatory//plots/510859641.nwb", - "version": 3, - "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/510859641_three_session_A_analysis.h5", - "ophys_experiment_id": 510859641, - "session_type": "three_session_A" - }, - { - "nwb_file": "/allen/aibs/informatics/module_test_data/observatory/plots/510698988.nwb", - "version": 3, - "analysis_file": "/allen/aibs/informatics/module_test_data/observatory/py3_analysis/510698988_three_session_B_analysis.h5", - "ophys_experiment_id": 510698988, - "session_type": "three_session_B" - } -] \ No newline at end of file diff --git a/allensdk/test/brain_observatory/test_session_api_utils.py b/allensdk/test/brain_observatory/test_session_api_utils.py deleted file mode 100644 index 00c61d9714..0000000000 --- a/allensdk/test/brain_observatory/test_session_api_utils.py +++ /dev/null @@ -1,313 +0,0 @@ -import warnings -from inspect import Parameter - -import pytest -import numpy as np -import pandas as pd - -from allensdk.brain_observatory.session_api_utils import is_equal, ParamsMixin - - -class ParamsMixinTestHarness(ParamsMixin): - - def __init__(self, param_to_ignore, a_param_1: int, a_param_2: float, - b_param_1: list, c_param_1: bool, d_param_1: np.ndarray, - e_param_1: pd.Series, f_param_1: pd.DataFrame): - - super().__init__(ignore={'param_to_ignore'}) - - self._a_param_1 = a_param_1 - self._a_param_2 = a_param_2 - self._b_param_1 = b_param_1 - self._c_param_1 = c_param_1 - self._d_param_1 = d_param_1 - self._e_param_1 = e_param_1 - self._f_param_1 = f_param_1 - - -@pytest.fixture -def mixin_harness_fixture(request) -> ParamsMixinTestHarness: - param_to_ignore = request.param.get('param_to_ignore', 'x') - a_param_1 = request.param.get('a_param_1', 8) - a_param_2 = request.param.get('a_param_2', 42.0) - b_param_1 = request.param.get('b_param_1', [1, 2, 3]) - c_param_1 = request.param.get('c_param_1', True) - d_param_1 = request.param.get('d_param_1', np.array([5, 5])) - e_param_1 = request.param.get('e_param_1', pd.Series([4.0, 5.0])) - f_param_1 = request.param.get('f_param_1', pd.DataFrame([1, 2, 3])) - - mixed_in = ParamsMixinTestHarness(param_to_ignore, a_param_1, - a_param_2, b_param_1, c_param_1, - d_param_1, e_param_1, f_param_1) - mixed_in._updated_params = request.param.get('updated_params', set()) - - return mixed_in - - -@pytest.mark.parametrize("a, b, expected", [ - (2, 2, True), - ('1', '1', True), - (1.5, 1.5, True), - ([1, 2, 3], [1, 2, 3], True), - ({1, 2, 3}, {1, 2, 3}, True), - ({'a', 'b', 'c'}, {'c', 'a', 'b'}, True), - ({'a': 0, 'z': 42}, {'a': 0, 'z': 42}, True), - (np.array([1, 2, 3]), np.array([1, 2, 3]), True), - ({'c': np.array([5, 5])}, {'c': np.array([5, 5])}, True), - (pd.Series([5, 5, 5]), pd.Series([5, 5, 5]), True), - (pd.DataFrame([10, 10]), pd.DataFrame([10, 10]), True), - ([pd.DataFrame(['a', 'b', 'c'])], [pd.DataFrame(['a', 'b', 'c'])], True), - ({'a': np.array([1, 2, 3])}, {'a': np.array([1, 2, 3])}, True), - ({'a': {'x': pd.Series([5.0, 6.0])}}, {'a': {'x': pd.Series([5.0, 6.0])}}, True), - ({'a': 20, 'b': 30}, {'b': 30, 'a': 20}, True), - - (1, 2.0, False), - ('1', 2, False), - ([1, 2, 3], 5, False), - ([1, 2, 3], [1, 2], False), - ([1, 2, 3], [3, 2, 1], False), - (['a', 'b'], {'a', 'b'}, False), - ({'a'}, {'a', 'b'}, False), - ({'a'}, {'b'}, False), - ({'a', 'b'}, np.array(['a', 'b']), False), - (np.array([3, 4, 5]), np.array([3, 4]), False), - ({'c': np.array([5, 5])}, {'c': np.array([5, 6])}, False), - (pd.Series([5, 5, 5]), pd.Series([5, 6, 5]), False), - (pd.Series([1, 2, 3]), pd.Series([1, 2]), False), - (pd.DataFrame([10, 10]), pd.DataFrame([10, 7]), False), - (pd.DataFrame([10, 20, 30]), pd.DataFrame([10, 20]), False), - ([pd.DataFrame(['a', 'b', 'c'])], [pd.DataFrame(['a', 'b', 'd'])], False), - ({'a': np.array([1, 2, 3])}, {'a': np.array([1, 2, 5])}, False), - ({'a': {'x': pd.Series([5.0, 6.0])}}, {'a': {'x': pd.Series([5.0, 7.0])}}, False), - - (pd.Series([5, 5, 5]), np.array([5, 5, 5]), False), - (np.array([8, 8, 8]), pd.DataFrame([8, 8, 8]), False), - (pd.Series([3, 3, 3]), pd.DataFrame([3, 3, 3]), False), -]) -def test_is_equal(a, b, expected): - assert is_equal(a, b) == expected - - -@pytest.mark.parametrize("mixin_harness_fixture, expected", [ - ({}, - [Parameter('param_to_ignore', Parameter.POSITIONAL_OR_KEYWORD), - Parameter('a_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=int), - Parameter('a_param_2', Parameter.POSITIONAL_OR_KEYWORD, annotation=float), - Parameter('b_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=list), - Parameter('c_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=bool), - Parameter('d_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=np.ndarray), - Parameter('e_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=pd.Series), - Parameter('f_param_1', Parameter.POSITIONAL_OR_KEYWORD, annotation=pd.DataFrame)]), -], indirect=["mixin_harness_fixture"]) -def test_get_param_signatures(mixin_harness_fixture, expected): - obtained = mixin_harness_fixture._get_param_signatures() - assert obtained == expected - - -@pytest.mark.parametrize("mixin_harness_fixture, expected", [ - ({}, - {'param_to_ignore': Parameter.empty, 'a_param_1': int, - 'a_param_2': float, 'b_param_1': list, 'c_param_1': bool, - 'd_param_1': np.ndarray, 'e_param_1': pd.Series, - 'f_param_1': pd.DataFrame}), -], indirect=["mixin_harness_fixture"]) -def test_get_param_type_annotations(mixin_harness_fixture, expected): - obtained = mixin_harness_fixture._get_param_type_annotations() - assert obtained == expected - - -@pytest.mark.parametrize("mixin_harness_fixture, expected", [ - ({}, - ['a_param_1', 'a_param_2', 'b_param_1', 'c_param_1', 'd_param_1', - 'e_param_1', 'f_param_1', 'param_to_ignore']), -], indirect=["mixin_harness_fixture"]) -def test_get_param_names(mixin_harness_fixture, expected): - obtained = mixin_harness_fixture._get_param_names() - assert obtained == expected - - -@pytest.mark.parametrize("mixin_harness_fixture, expected", [ - ({}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({'a_param_1': 2, 'a_param_2': 10.0, 'b_param_1': [1], 'c_param_1': False}, - {'a_param_1': 2, 'a_param_2': 10.0, 'b_param_1': [1], - 'c_param_1': False, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}) -], indirect=["mixin_harness_fixture"]) -def test_get_params(mixin_harness_fixture, expected): - obtained = mixin_harness_fixture.get_params() - is_equal(obtained, expected) - - -@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, expected", [ - ({}, - {'a_param_1': 5}, - {'a_param_1': 5, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'a_param_2': 10.0}, - {'a_param_1': 8, 'a_param_2': 10.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'b_param_1': [3, 4, 5]}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [3, 4, 5], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'a_param_1': 20, 'a_param_2': 3.14, 'b_param_1': [9, 10]}, - {'a_param_1': 20, 'a_param_2': 3.14, 'b_param_1': [9, 10], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'d_param_1': np.array([20, 20]), 'e_param_1': pd.Series([1, 2, 3]), 'b_param_1': [9, 10]}, - {'a_param_1': 20, 'a_param_2': 3.14, 'b_param_1': [9, 10], - 'c_param_1': True, 'd_param_1': np.array([20, 20]), - 'e_param_1': pd.Series([1, 2, 3]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - -], indirect=["mixin_harness_fixture"]) -def test_set_params_basic(mixin_harness_fixture, params_to_set, expected): - mixin_harness_fixture.set_params(**params_to_set) - obtained = mixin_harness_fixture.get_params() - is_equal(obtained, expected) - - -@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, expected", [ - ({}, - {'a_param': 5}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'something_random': 10.0}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - -], indirect=["mixin_harness_fixture"]) -def test_set_params_with_invalid_params(mixin_harness_fixture, - params_to_set, expected): - with warnings.catch_warnings(record=True) as w: - mixin_harness_fixture.set_params(**params_to_set) - assert 'not valid and is being ignored' in str(w[-1].message) - - obtained = mixin_harness_fixture.get_params() - is_equal(obtained, expected) - - -@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, expected", [ - ({}, - {'a_param_1': 'hello'}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'a_param_2': [5]}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'b_param_1': 1}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'d_param_1': [1, 2, 3]}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - - ({}, - {'e_param_1': {1, 2, 3}}, - {'a_param_1': 8, 'a_param_2': 42.0, 'b_param_1': [1, 2, 3], - 'c_param_1': True, 'd_param_1': np.array([5, 5]), - 'e_param_1': pd.Series([4.0, 5.0]), 'f_param_1': pd.DataFrame([1, 2, 3])}), - -], indirect=["mixin_harness_fixture"]) -def test_set_params_with_invalid_type(mixin_harness_fixture, params_to_set, expected): - with warnings.catch_warnings(record=True) as w: - mixin_harness_fixture.set_params(**params_to_set) - assert 'should be of type' in str(w[-1].message) - - obtained = mixin_harness_fixture.get_params() - is_equal(obtained, expected) - - -@pytest.mark.parametrize("mixin_harness_fixture, params_to_set, data_params, expected", [ - ({}, - {'a_param_1': 42}, - {'a_param_1'}, - True), - - ({}, - {'a_param_1': 8}, - {'a_param_1'}, - False), - - ({}, - {'a_param_1': 8.0}, - {'a_param_1'}, - False), - - ({}, - {'a_param_2': 3.0}, - {'a_param_1'}, - False), - - ({}, - {'a_param_2': 2.5, 'b_param_1': ['a', 'b', 'c']}, - {'b_param_1'}, - True), - - ({}, - {'a_param_1': 10, 'a_param_2': 9.0}, - {'b_param_1'}, - False), - - ({}, - {'d_param_1': np.array([98, 99, 100]), 'a_param_2': 9.0}, - {'d_param_1'}, - True), - - ({}, - {'d_param_1': np.array([98, 99, 100]), 'e_param_1': pd.Series([1, 3, 5])}, - {'e_param_1'}, - True), - - ({}, - {'d_param_1': np.array([98, 99, 100]), 'e_param_1': pd.Series([4.0, 5.0])}, - {'e_param_1'}, - False), - - -], indirect=["mixin_harness_fixture"]) -def test_needs_data_refresh(mixin_harness_fixture, params_to_set, data_params, expected): - mixin_harness_fixture.set_params(**params_to_set) - obtained = mixin_harness_fixture.needs_data_refresh(data_params) - assert obtained == expected - - -@pytest.mark.parametrize("mixin_harness_fixture, data_params, expected", [ - ({'updated_params': {'a_param_1', 'b_param_1'}}, - {'a_param_1'}, - {'b_param_1'}), - - ({'updated_params': {'a_param_1', 'a_param_2', 'b_param_1'}}, - {'a_param_1', 'a_param_2'}, - {'b_param_1'}), -], indirect=["mixin_harness_fixture"]) -def test_clear_updated_params(mixin_harness_fixture, data_params, expected): - mixin_harness_fixture.clear_updated_params(data_params) - assert mixin_harness_fixture._updated_params == expected diff --git a/allensdk/test/brain_observatory/test_static_gratings.py b/allensdk/test/brain_observatory/test_static_gratings.py deleted file mode 100644 index 0e409a175a..0000000000 --- a/allensdk/test/brain_observatory/test_static_gratings.py +++ /dev/null @@ -1,198 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.brain_observatory.static_gratings import StaticGratings -from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis -import pytest -from mock import patch, MagicMock - - -@pytest.fixture -def dataset(): - dataset = MagicMock(name='dataset') - - timestamps = MagicMock(name='timestamps') - celltraces = MagicMock(name='celltraces') - dataset.get_corrected_fluorescence_traces = \ - MagicMock(name='get_corrected_fluorescence_traces', - return_value=(timestamps, celltraces)) - dataset.get_roi_ids = MagicMock(name='get_roi_ids') - dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') - dff_traces = MagicMock(name="dfftraces") - dataset.get_dff_traces = MagicMock(name='get_dff_traces', - return_value=(None, dff_traces)) - dxcm = MagicMock(name='dxcm') - dxtime = MagicMock(name='dxtime') - dataset.get_running_speed=MagicMock(name='get_running_speed', - return_value=(dxcm, dxtime)) - dataset.get_stimulus_table=MagicMock(name='get_stimulus_table', - return_value=MagicMock()) - - return dataset - -def mock_speed_tuning(): - binned_dx_sp = MagicMock(name='binned_dx_sp') - binned_cells_sp = MagicMock(name='binned_cells_sp') - binned_dx_vis = MagicMock(name='binned_dx_vis') - binned_cells_vis = MagicMock(name='binned_cells_vis') - peak_run = MagicMock(name='peak_run') - - return MagicMock(name='get_speed_tuning', - return_value=(binned_dx_sp, - binned_cells_sp, - binned_dx_vis, - binned_cells_vis, - peak_run)) - -def mock_sweep_response(): - sweep_response = MagicMock(name='sweep_response') - mean_sweep_response = MagicMock(name='mean_sweep_response') - pval = MagicMock(name='pval') - - return MagicMock(name='get_sweep_response', - return_value=(sweep_response, - mean_sweep_response, - pval)) - -@patch.object(StimulusAnalysis, - 'get_speed_tuning', - mock_speed_tuning()) -@patch.object(StimulusAnalysis, - 'get_sweep_response', - mock_sweep_response()) -@pytest.mark.parametrize('trigger', (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) -def test_harness(dataset, trigger): - sg = StaticGratings(dataset) - - assert sg._stim_table is StimulusAnalysis._PRELOAD - assert sg._sweeplength is StimulusAnalysis._PRELOAD - assert sg._interlength is StimulusAnalysis._PRELOAD - assert sg._extralength is StimulusAnalysis._PRELOAD - assert sg._orivals is StimulusAnalysis._PRELOAD - assert sg._sfvals is StimulusAnalysis._PRELOAD - assert sg._phasevals is StimulusAnalysis._PRELOAD - assert sg._number_ori is StimulusAnalysis._PRELOAD - assert sg._number_sf is StimulusAnalysis._PRELOAD - assert sg._number_phase is StimulusAnalysis._PRELOAD - assert sg._sweep_response is StimulusAnalysis._PRELOAD - assert sg._mean_sweep_response is StimulusAnalysis._PRELOAD - assert sg._pval is StimulusAnalysis._PRELOAD - assert sg._response is StimulusAnalysis._PRELOAD - assert sg._peak is StimulusAnalysis._PRELOAD - - if trigger == 1: - print(sg._stim_table) - print(sg.sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 2: - print(sg.sweeplength) - print(sg.mean_sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 3: - print(sg.interlength) - print(sg.sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 4: - print(sg.extralength) - print(sg.mean_sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 5: - print(sg.orivals) - print(sg.sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 6: - print(sg.sfvals) - print(sg.sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 7: - print(sg.phasevals) - print(sg.mean_sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 8: - print(sg.number_ori) - print(sg.mean_sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 9: - print(sg.number_sf) - print(sg.sweep_response) - print(sg.response) - print(sg.peak) - elif trigger == 10: - print(sg.number_phase) - print(sg.sweep_response) - print(sg.response) - print(sg.peak) - - assert sg._stim_table is not StimulusAnalysis._PRELOAD - assert sg._sweeplength is not StimulusAnalysis._PRELOAD - assert sg._interlength is not StimulusAnalysis._PRELOAD - assert sg._extralength is not StimulusAnalysis._PRELOAD - assert sg._orivals is not StimulusAnalysis._PRELOAD - assert sg._sfvals is not StimulusAnalysis._PRELOAD - assert sg._phasevals is not StimulusAnalysis._PRELOAD - assert sg._number_ori is not StimulusAnalysis._PRELOAD - assert sg._number_sf is not StimulusAnalysis._PRELOAD - assert sg._number_phase is not StimulusAnalysis._PRELOAD - assert sg._sweep_response is not StimulusAnalysis._PRELOAD - assert sg._mean_sweep_response is not StimulusAnalysis._PRELOAD - assert sg._pval is not StimulusAnalysis._PRELOAD - assert sg._response is not StimulusAnalysis._PRELOAD - assert sg._peak is not StimulusAnalysis._PRELOAD - - # check super properties - dataset.get_corrected_fluorescence_traces.assert_called_once_with() - assert sg._timestamps != StaticGratings._PRELOAD - assert sg._celltraces != StaticGratings._PRELOAD - assert sg._numbercells != StaticGratings._PRELOAD - - assert not dataset.get_roi_ids.called - assert sg._roi_id is StaticGratings._PRELOAD - - assert dataset.get_cell_specimen_ids.called - assert sg._cell_id is StaticGratings._PRELOAD - - assert not dataset.get_dff_traces.called - assert sg._dfftraces is StaticGratings._PRELOAD - - assert sg._dxcm is StaticGratings._PRELOAD - assert sg._dxtime is StaticGratings._PRELOAD diff --git a/allensdk/test/brain_observatory/test_stimulus_analysis.py b/allensdk/test/brain_observatory/test_stimulus_analysis.py deleted file mode 100644 index 20827ec090..0000000000 --- a/allensdk/test/brain_observatory/test_stimulus_analysis.py +++ /dev/null @@ -1,140 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from allensdk.brain_observatory.stimulus_analysis import StimulusAnalysis -import pytest -from mock import patch, MagicMock - - -@pytest.fixture -def dataset(): - dataset = MagicMock(name='dataset') - - timestamps = MagicMock(name='timestamps') - celltraces = MagicMock(name='celltraces') - dataset.get_corrected_fluorescence_traces = \ - MagicMock(name='get_corrected_fluorescence_traces', - return_value=(timestamps, celltraces)) - dataset.get_roi_ids = MagicMock(name='get_roi_ids') - dataset.get_cell_specimen_ids = MagicMock(name='get_cell_specimen_ids') - dff_traces = MagicMock(name="dfftraces") - dataset.get_dff_traces = MagicMock(name='get_dff_traces', - return_value=(None, dff_traces)) - dxcm = MagicMock(name='dxcm') - dxtime = MagicMock(name='dxtime') - dataset.get_running_speed=MagicMock(name='get_running_speed', - return_value=(dxcm, dxtime)) - return dataset - -def mock_speed_tuning(): - binned_dx_sp = MagicMock(name='binned_dx_sp') - binned_cells_sp = MagicMock(name='binned_cells_sp') - binned_dx_vis = MagicMock(name='binned_dx_vis') - binned_cells_vis = MagicMock(name='binned_cells_vis') - peak_run = MagicMock(name='peak_run') - - return MagicMock(name='get_speed_tuning', - return_value=(binned_dx_sp, - binned_cells_sp, - binned_dx_vis, - binned_cells_vis, - peak_run)) - - -@pytest.mark.parametrize('trigger', - (1,2,3,4,5)) -def test_harness(dataset, - trigger): - with patch('allensdk.brain_observatory.stimulus_analysis.StimulusAnalysis.get_speed_tuning', - mock_speed_tuning()) as get_speed_tuning: - sa = StimulusAnalysis(dataset) - - assert sa._timestamps == StimulusAnalysis._PRELOAD - assert sa._celltraces == StimulusAnalysis._PRELOAD - assert sa._numbercells == StimulusAnalysis._PRELOAD - assert sa._roi_id == StimulusAnalysis._PRELOAD - assert sa._cell_id == StimulusAnalysis._PRELOAD - assert sa._dfftraces == StimulusAnalysis._PRELOAD - assert sa._dxcm == StimulusAnalysis._PRELOAD - assert sa._dxtime == StimulusAnalysis._PRELOAD - - if trigger == 1: - print(sa.timestamps) - print(sa.dxcm) - print(sa.binned_dx_sp) - elif trigger == 2: - print(sa.celltraces) - print(sa.dxtime) - print(sa.binned_cells_sp) - elif trigger == 3: - print(sa.acquisition_rate) - print(sa.dxcm) - print(sa.binned_dx_vis) - elif trigger == 4: - print(sa.numbercells) - print(sa.dxtime) - print(sa.binned_cells_vis) - elif trigger == 5: - print(sa.timestamps) - print(sa.dxcm) - print(sa.peak_run) - - print(sa.roi_id) - print(sa.cell_id) - print(sa.dfftraces) - - dataset.get_corrected_fluorescence_traces.assert_called_once_with() - assert sa._timestamps is not StimulusAnalysis._PRELOAD - assert sa._celltraces is not StimulusAnalysis._PRELOAD - assert sa._numbercells is not StimulusAnalysis._PRELOAD - - dataset.get_roi_ids.assert_called_once_with() - assert sa._roi_id is not StimulusAnalysis._PRELOAD - - dataset.get_cell_specimen_ids.assert_called_once_with() - assert sa._cell_id is not StimulusAnalysis._PRELOAD - - dataset.get_dff_traces.assert_called_once_with() - assert sa._dfftraces is not StimulusAnalysis._PRELOAD - - assert sa._dxcm is not StimulusAnalysis._PRELOAD - assert sa._dxtime is not StimulusAnalysis._PRELOAD - - get_speed_tuning.assert_called_once_with(binsize=800) - assert sa._binned_dx_sp is not StimulusAnalysis._PRELOAD - assert sa._binned_cells_sp is not StimulusAnalysis._PRELOAD - assert sa._binned_dx_vis is not StimulusAnalysis._PRELOAD - assert sa._binned_cells_vis is not StimulusAnalysis._PRELOAD - assert sa._peak_run is not StimulusAnalysis._PRELOAD diff --git a/allensdk/test/brain_observatory/test_stimulus_info.py b/allensdk/test/brain_observatory/test_stimulus_info.py deleted file mode 100755 index f15e40c849..0000000000 --- a/allensdk/test/brain_observatory/test_stimulus_info.py +++ /dev/null @@ -1,399 +0,0 @@ -import pytest -import numpy as np -import os -from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet, si -import numpy as np -from pkg_resources import resource_filename # @UnresolvedImport -NWB_FLAVORS = [] - -if 'TEST_NWB_FILES' in os.environ: - nwb_list_file = os.environ['TEST_NWB_FILES'] -else: - nwb_list_file = resource_filename(__name__, os.path.join('..','core','nwb_files.txt')) - -if nwb_list_file == 'skip': - NWB_FLAVORS = [] -else: - with open(nwb_list_file, 'r') as f: - NWB_FLAVORS = [l.strip() for l in f] - -@pytest.fixture(params=NWB_FLAVORS) -def data_set(request): - data_set = BrainObservatoryNwbDataSet(request.param) - - return data_set - -def test_BinaryIntervalSearchTree(): - - bist = si.BinaryIntervalSearchTree([(0, .9, 'A'), (1, 1.9, 'B'), (3, 3.9, 'D'), (2, 2.9, 'C')]) - assert bist.search(1.5)[2] == 'B' - assert bist.search(0)[2] == 'A' - assert bist.search(2.5)[2] == 'C' - assert bist.search(3.5)[2] == 'D' - -def test_BinaryIntervalSearchTree_shared_endpoint(): - - bist = si.BinaryIntervalSearchTree([(0, 1, 'A'), (1, 2, 'B')]) - assert bist.search(0)[2] == 'A' - assert bist.search(1)[2] == 'A' - assert bist.search(1.5)[2] == 'B' - -def test_pixels_to_visual_degrees(): - m = si.BrainObservatoryMonitor() - np.testing.assert_almost_equal(m.pixels_to_visual_degrees(1), 0.103270443661,10) - -@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), - reason="test NWB file not available") -def test_StimulusSearch(data_set): - - epoch_df = data_set.get_stimulus_epoch_table() - s = si.StimulusSearch(data_set) - assert len(s.search(epoch_df.iloc[2]['end'])) == 3 - assert s.search(epoch_df.iloc[2]['end'] + 1) is None - assert len(s.search(752)) == 3 - - -def test_sessions_with_stimulus(): - - for session_type, stimulus_type_list in si.SESSION_STIMULUS_MAP.items(): - for stimulus_type in stimulus_type_list: - assert session_type in si.sessions_with_stimulus(stimulus_type) - -def test_stimuli_in_session(): - - for session_type, stimulus_type_list in si.SESSION_STIMULUS_MAP.items(): - for stimulus_type in stimulus_type_list: - assert session_type in si.sessions_with_stimulus(stimulus_type) - -def test_stimuli_in_session(): - - test_dict = {si.THREE_SESSION_A:4, - si.THREE_SESSION_B:4, - si.THREE_SESSION_C:4, - si.THREE_SESSION_C2:5} - - for session in si.SESSION_LIST: - assert session in si.SESSION_STIMULUS_MAP - assert len(si.stimuli_in_session(session)) == test_dict[session] - assert len(si.SESSION_STIMULUS_MAP) == len(si.SESSION_LIST) == 4 - -def test_all_stimuli(): - assert len(si.all_stimuli()) == 10 - -def test_rotate(): - np.testing.assert_array_almost_equal(np.array(si.rotate(1,1,np.pi)), np.array([-1,-1])) - -def test_get_spatial_grating(): - - data = si.get_spatial_grating(height=100, aspect_ratio=2, ori=45, pix_per_cycle=10, phase=0, p2p_amp=2, baseline=1) - - assert data.shape == (100,200) - np.testing.assert_almost_equal(data[0,0], data[-1,-1]) - np.testing.assert_almost_equal(data.max(), 2, 3) - np.testing.assert_almost_equal(data.min(), 0, 3) - np.testing.assert_almost_equal(data[50,100], 2) - -def test_get_spatio_temporal_grating(): - - for t, test_val in zip([0,.5,1], [2,0,2]): - data = si.get_spatio_temporal_grating(t, height=100, aspect_ratio=2, ori=45, pix_per_cycle=10, phase=0, p2p_amp=2, baseline=1, temporal_frequency=1) - np.testing.assert_almost_equal(data[50,100], test_val) - - data = si.get_spatio_temporal_grating(0, height=100, - aspect_ratio=2, - ori=45, - pix_per_cycle=20, - phase=0, - p2p_amp=2, - baseline=1, - temporal_frequency=1) - - x1 = data[50, 100] - - data = si.get_spatio_temporal_grating(.5, height=100, - aspect_ratio=2, - ori=45, - pix_per_cycle=20, - phase=.5, - p2p_amp=2, - baseline=1, - temporal_frequency=1) - - x2 = data[50, 100] - - np.testing.assert_almost_equal(x1, x2) - -def test_map_template_monitor(): - - - - np.testing.assert_almost_equal(np.array((500, 250)), - si.map_template_coordinate_to_monitor_coordinate((20, 20), (1000, 500), (40, 40))) - - - np.testing.assert_almost_equal(np.array((20,20)), - si.map_monitor_coordinate_to_template_coordinate((500, 250), (1000, 500), (40,40))) - -def test_lsn_monitor(): - - lsn4_template_coordinate = (8, 14) - lsn4_monitor_coordinate = np.array(si.MONITOR_DIMENSIONS)/2 #(600,960) - np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), - si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, si.MONITOR_DIMENSIONS, si.LOCALLY_SPARSE_NOISE_4DEG)) - - lsn4_template_coordinate = (4, 7) - lsn4_monitor_coordinate = np.array(si.MONITOR_DIMENSIONS)/2#(600,960) - np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), - si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, si.MONITOR_DIMENSIONS, si.LOCALLY_SPARSE_NOISE_8DEG)) - - lsn4_template_coordinate = (0,0) - lsn4_monitor_coordinate = (240,330) - np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), - si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, - si.MONITOR_DIMENSIONS, - si.LOCALLY_SPARSE_NOISE_4DEG)) - - lsn4_template_coordinate = (0,0) - lsn4_monitor_coordinate = (240,330) - np.testing.assert_almost_equal(np.array(lsn4_template_coordinate), - si.monitor_coordinate_to_lsn_coordinate(lsn4_monitor_coordinate, - si.MONITOR_DIMENSIONS, - si.LOCALLY_SPARSE_NOISE_4DEG)) - - - lsn4_template_coordinate = (0,0) - lsn4_monitor_coordinate = (240,330) - np.testing.assert_almost_equal(np.array(lsn4_monitor_coordinate), - si.map_stimulus_coordinate_to_monitor_coordinate(lsn4_template_coordinate, - si.MONITOR_DIMENSIONS, - si.LOCALLY_SPARSE_NOISE_8DEG)) - - lsn4_template_coordinate = (0,0) - lsn4_monitor_coordinate = (240,330) - np.testing.assert_almost_equal(np.array(lsn4_template_coordinate), - si.monitor_coordinate_to_lsn_coordinate(lsn4_monitor_coordinate, - si.MONITOR_DIMENSIONS, - si.LOCALLY_SPARSE_NOISE_8DEG)) - -def test_natural_scene_monitor(): - - template_coordinate = (0,0) - monitor_coordinate = (141, 373) - np.testing.assert_almost_equal(np.array(monitor_coordinate), - si.natural_scene_coordinate_to_monitor_coordinate(template_coordinate, - si.MONITOR_DIMENSIONS)) - - template_coordinate = (0,0) - monitor_coordinate = (141, 373) - np.testing.assert_almost_equal(np.array(template_coordinate), - si.map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, - si.MONITOR_DIMENSIONS, - si.NATURAL_SCENES)) - -def test_natural_movie_monitor(): - - template_coordinate = (0,0) - monitor_coordinate = (60, 0) - np.testing.assert_almost_equal(np.array(monitor_coordinate), - si.natural_movie_coordinate_to_monitor_coordinate(template_coordinate, - si.MONITOR_DIMENSIONS)) - - template_coordinate = (0,0) - monitor_coordinate = (60, 0) - np.testing.assert_almost_equal(np.array(template_coordinate), - si.map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, - si.MONITOR_DIMENSIONS, - si.NATURAL_MOVIE_ONE)) - -def test_bijective_all_stimuli(): - - for stimulus in si.all_stimuli(): - - template_coordinate = (10,10) - monitor_coordinate = si.map_stimulus_coordinate_to_monitor_coordinate(template_coordinate, - si.MONITOR_DIMENSIONS, - stimulus) - - new_template_coordinate = si.map_monitor_coordinate_to_stimulus_coordinate(monitor_coordinate, - si.MONITOR_DIMENSIONS, - stimulus) - - np.testing.assert_array_almost_equal(template_coordinate, new_template_coordinate) - - for original_loc in [(0,0), (10,10)]: - - for target_stimulus in si.all_stimuli(): - - new_loc = si.map_stimulus(original_loc, stimulus, target_stimulus, si.MONITOR_DIMENSIONS) - new_original_loc = si.map_stimulus(new_loc, target_stimulus, stimulus, si.MONITOR_DIMENSIONS) - np.testing.assert_array_almost_equal(new_original_loc, original_loc) - -def test_monitor_basic_spatial_unit(): - - m = si.Monitor(300,400, 5, 'cm') - m.set_spatial_unit('cm') - - m.set_spatial_unit('inch') - np.testing.assert_almost_equal(m.panel_size, 1.968505, 5) - np.testing.assert_almost_equal(1./m.aspect_ratio, 3./4) - np.testing.assert_almost_equal(m.height, 0.46500143220300011) - np.testing.assert_almost_equal(m.width, 0.62000190960400015) - np.testing.assert_almost_equal(m.pixel_size, 0.0015500047740100004) - - m.set_spatial_unit('cm') - np.testing.assert_almost_equal(m.panel_size, 5) - np.testing.assert_almost_equal(1./m.aspect_ratio, 3./4) - np.testing.assert_almost_equal(m.height, 3) - np.testing.assert_almost_equal(m.width, 4) - np.testing.assert_almost_equal(m.pixel_size, .01) - - -def test_pixels_to_visual_degrees(): - - m = si.BrainObservatoryMonitor() - - np.testing.assert_almost_equal(m.pixels_to_visual_degrees(45), 4.64716996476) - np.testing.assert_almost_equal(m.pixels_to_visual_degrees(45, small_angle_approximation=False), 4.64462483116) - - np.testing.assert_almost_equal(m.pixels_to_visual_degrees(1), 0.103270443661) - np.testing.assert_almost_equal(m.pixels_to_visual_degrees(1, small_angle_approximation=False), 0.103270415704) - -@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), - reason="test NWB file not available") -def test_lsn_image_to_screen(data_set): - - compare_set = set(data_set.list_stimuli()).intersection(si.LOCALLY_SPARSE_NOISE_STIMULUS_TYPES) - if len(compare_set) > 0: - for stimulus_type in compare_set: - - template = data_set.get_stimulus_template(stimulus_type) - m = si.BrainObservatoryMonitor() - m.lsn_image_to_screen(template[0,:,:]).shape == si.MONITOR_DIMENSIONS - -@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), - reason="test NWB file not available") -def test_natural_movie_image_to_screen(data_set): - - compare_set = set(data_set.list_stimuli()).intersection(si.NATURAL_MOVIE_STIMULUS_TYPES) - if len(compare_set) > 0: - for stimulus_type in compare_set: - - template = data_set.get_stimulus_template(stimulus_type) - m = si.BrainObservatoryMonitor() - m.natural_movie_image_to_screen(template[0, :, :]).shape == si.MONITOR_DIMENSIONS - -@pytest.mark.skipif(not os.path.exists('/projects/neuralcoding'), - reason="test NWB file not available") -def test_grating_to_screen(data_set): - - compare_set = set(data_set.list_stimuli()).intersection([si.STATIC_GRATINGS, si.DRIFTING_GRATINGS]) - if len(compare_set) > 0: - - for stimulus_type in compare_set: - m = si.BrainObservatoryMonitor() - curr_row = data_set.get_stimulus_table(stimulus_type).iloc[10] - phase = 0 - spatial_frequency = .04 - orientation = curr_row.orientation - template = m.grating_to_screen(phase, spatial_frequency, orientation) - assert m.natural_movie_image_to_screen(template).shape == si.MONITOR_DIMENSIONS - -def test_get_mask(): - m = si.BrainObservatoryMonitor() - mask = m.get_mask() - - assert mask.sum() == 931286 - assert mask.shape == si.MONITOR_DIMENSIONS - - -def test_mask(): - m = si.BrainObservatoryMonitor() - - assert(m._mask is None) - - assert(m.mask.sum() == 931286) - assert(m.mask.shape == si.MONITOR_DIMENSIONS) - assert(m._mask is not None) - - -def test_translate_image_and_fill(): - ''' - [[1 2 3] - [4 5 6] - [7 8 9]] - - [[127 4 5] - [127 7 8] - [127 127 127]] - ''' - - - X = np.array([[1,2,3],[4,5,6],[7,8,9]]) - X_test = np.array([[127, 4, 5], [127, 7, 8], [127, 127, 127]]) - X_result = si.translate_image_and_fill(X, translation=(1,1)) - - np.testing.assert_array_almost_equal(X_result, X_test) - -def test_visual_degrees_to_pixels(): - - m = si.BrainObservatoryMonitor() - np.testing.assert_approx_equal(m.visual_degrees_to_pixels(4.5), 43.5749072092) - -def test_spatial_frequency_to_pix_per_cycle(): - - m = si.BrainObservatoryMonitor() - - x1 = m.spatial_frequency_to_pix_per_cycle(.1, 15.0) - x2 = m.spatial_frequency_to_pix_per_cycle(.05, 15.0) - - np.testing.assert_almost_equal(x1, 97.7072500845) - np.testing.assert_almost_equal(x2/x1, 2) - -def test_show_image(): - - m = si.BrainObservatoryMonitor() - - img = np.zeros(si.MONITOR_DIMENSIONS) - m.show_image(img, show=False, warp=True, mask=False) - m.show_image(img, show=False, warp=False, mask=True) - -def test_map_stimulus(): - - m = si.BrainObservatoryMonitor() - test_list = [(0, 0), (-5.333333333333333, -7.333333333333333), (-5.333333333333333, -7.333333333333333), (-2.6666666666666665, -3.6666666666666665), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-141.0, -373.0), (0, 0), (0, 0), (240.0, 330.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (99.0, -43.0), (240.0, 330.0), (240.0, 330.0), (240.0, 330.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (99.0, -43.0), (240.0, 330.0), (240.0, 330.0), (240.0, 330.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (50.666666666666664, 104.5), (99.0, -43.0), (240.0, 330.0), (240.0, 330.0), (60.0, 0.0), (-4.0, -7.333333333333333), (-4.0, -7.333333333333333), (-2.0, -3.6666666666666665), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (-81.0, -373.0), (60.0, 0.0), (60.0, 0.0), (60.0, 0.0), (-4.0, -7.333333333333333), (-4.0, -7.333333333333333), (-2.0, -3.6666666666666665), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (-81.0, -373.0), (60.0, 0.0), (60.0, 0.0), (60.0, 0.0), (-4.0, -7.333333333333333), (-4.0, -7.333333333333333), (-2.0, -3.6666666666666665), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (-81.0, -373.0), (60.0, 0.0), (60.0, 0.0), (141.0, 373.0), (-2.2, 0.9555555555555556), (-2.2, 0.9555555555555556), (-1.1, 0.4777777777777778), (22.8, 118.11666666666666), (22.8, 118.11666666666666), (22.8, 118.11666666666666), (0.0, 0.0), (141.0, 373.0), (141.0, 373.0), (0, 0), (-5.333333333333333, -7.333333333333333), (-5.333333333333333, -7.333333333333333), (-2.6666666666666665, -3.6666666666666665), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-141.0, -373.0), (0, 0), (0, 0), (0, 0), (-5.333333333333333, -7.333333333333333), (-5.333333333333333, -7.333333333333333), (-2.6666666666666665, -3.6666666666666665), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-16.88888888888889, 0.0), (-141.0, -373.0), (0, 0), (0, 0)] - counter = 0 - for source_stimulus in sorted(si.all_stimuli()): - for target_stimulus in sorted(si.all_stimuli()): - tmp = m.map_stimulus((0,0), source_stimulus, target_stimulus) - np.testing.assert_array_almost_equal(tmp, test_list[counter]) - counter += 1 - np.testing.assert_array_almost_equal(m.map_stimulus(tmp, target_stimulus, source_stimulus), np.array([0,0])) - -if __name__ == "__main__": -# - # with open(nwb_list_file, 'r') as f: - # NWB_FLAVORS = [l.strip() for l in f] - # - # for nwb_file_location in NWB_FLAVORS: - # data_set = BrainObservatoryNwbDataSet(nwb_file_location) - # test_lsn_image_to_screen(data_set) - # test_natural_movie_image_to_screen(data_set) - # test_grating_to_screen(data_set) - - # test_StimulusSearch() - # test_BinaryIntervalSearchTree() - # test_sessions_with_stimulus() - # test_stimuli_in_session() - # test_all_stimuli() - # test_rotate() - # test_get_spatial_grating() - # test_get_spatio_temporal_grating() - # test_map_template_coordinate_to_monitor_coordinate() - # test_natural_scene_monitor() - # test_bijective_all_stimuli() - # test_monitor_basic_spatial_unit() - # test_brain_observatory_monitor() - # test_spatial_frequency_to_pix_per_cycle() - # test_get_mask() - # test_show_image() - test_map_stimulus() \ No newline at end of file diff --git a/allensdk/test/config/test_config_single_file_json.py b/allensdk/test/config/test_config_single_file_json.py deleted file mode 100644 index 744e692491..0000000000 --- a/allensdk/test/config/test_config_single_file_json.py +++ /dev/null @@ -1,73 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import patch, mock_open -from allensdk.model.biophys_sim.config import Config -try: - import __builtin__ as builtins # @UnresolvedImport -except: - import builtins # @UnresolvedImport - - -@pytest.fixture -def simple_config(): - manifest = '''{ - "manifest": [ - { "type": "dir", - "spec": "MOCK_DOT", - "key": "BASEDIR" - }], - "biophys": - [{ "hoc": [ "stdgui.hoc"] }] - }''' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=manifest)): - config = Config().load('config.json', False) - - return config - - -def testAccessHocFilesInData(simple_config): - assert simple_config.data['biophys'][0]['hoc'][0] == 'stdgui.hoc' - - -def testManifestIsNotInData(simple_config): - assert 'manifest' not in simple_config.data - - -def testManifestInReservedData(simple_config): - assert 'manifest' in simple_config.reserved_data[0] diff --git a/allensdk/test/config/test_json_comments.py b/allensdk/test/config/test_json_comments.py deleted file mode 100644 index f798d4a02c..0000000000 --- a/allensdk/test/config/test_json_comments.py +++ /dev/null @@ -1,209 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import patch, mock_open, Mock -from simplejson.scanner import JSONDecodeError -import allensdk.core.json_utilities as ju -from allensdk.core.json_utilities import JsonComments -import logging -try: - import __builtin__ as builtins # @UnresolvedImport -except: - import builtins # @UnresolvedImport - - -@pytest.fixture -def commented_json(): - return ("{\n" - " // comment\n" - " \"color\": \"blue\"\n" - "}") - - -@pytest.fixture -def blank_line_json(): - return ("{\n" - "\n" - "\n" - "\n" - " \"color\": \"blue\"\n" - "}") - - -@pytest.fixture -def multi_line_json(): - return ("{\n" - "/* \n" - " * multiline comment\n" - " */\n" - " \"color\": \"blue\"\n" - "}") - - -@pytest.fixture -def two_multi_line_json(): - return ("{\n" - " \"colors\": [\"blue\",\n" - " /* comment these out\n" - " \"red\",\n" - " \"yellow\",\n" - " ... but not these */\n" - " \"orange\",\n" - " \"purple\",\n" - " /* also comment this out\n" - " \"indigo\",\n" - " .... end comment */\n" - " \"violet\"\n" - " ]\n" - "}") - - -@pytest.fixture -def corrupted_json(): - return ("{\n" - " \"colors\": \"blue\",\n" - " /* comment these out\n" - " \"red\",\n" - " \"yel") - - -@pytest.fixture -def ju_logger(): - log = logging.getLogger('allensdk.core.json_utilities') - log.error = Mock() - - return log - - -def testSingleLineCommentJSONDecodeError(corrupted_json, - ju_logger): - with pytest.raises(JSONDecodeError) as e_info: - with patch(builtins.__name__ + ".open", - mock_open(read_data=corrupted_json)): - JsonComments.read_file("corrupted.json") - - ju_logger.error.assert_called_once_with( - 'Could not load json object from file: corrupted.json') - assert e_info.typename == 'JSONDecodeError' - - -def testSingleLineComment(commented_json): - parsed_json = JsonComments.read_string( - commented_json) - - assert('color' in parsed_json and - parsed_json['color'] == 'blue') - - -def testBlankLines(blank_line_json): - parsed_json = JsonComments.read_string( - blank_line_json) - - assert('color' in parsed_json and - parsed_json['color'] == 'blue') - - -def testMultiLineComment(multi_line_json): - parsed_json = JsonComments.read_string( - multi_line_json) - - assert('color' in parsed_json and - parsed_json['color'] == 'blue') - - -def testTwoMultiLineComments(two_multi_line_json): - parsed_json = JsonComments.read_string( - two_multi_line_json) - - assert('colors' in parsed_json) - assert(len(parsed_json['colors']) == 4) - assert('blue' in parsed_json['colors']) - assert('orange' in parsed_json['colors']) - assert('purple' in parsed_json['colors']) - assert('violet' in parsed_json['colors']) - - -def testSingleLineCommentFile(commented_json): - with patch(builtins.__name__ + ".open", - mock_open( - read_data=commented_json)): - parsed_json = JsonComments.read_file('mock.json') - - assert('color' in parsed_json and - parsed_json['color'] == 'blue') - - -def testBlankLinesFile(blank_line_json): - with patch(builtins.__name__ + ".open", - mock_open( - read_data=blank_line_json)): - parsed_json = JsonComments.read_file('mock.json') - - assert('color' in parsed_json and - parsed_json['color'] == 'blue') - - -def testMultiLineFile(multi_line_json): - with patch(builtins.__name__ + ".open", - mock_open( - read_data=multi_line_json)): - parsed_json = JsonComments.read_file('mock.json') - - assert('color' in parsed_json and - parsed_json['color'] == 'blue') - - -def testTwoMultiLineFile(two_multi_line_json): - with patch(builtins.__name__ + ".open", - mock_open( - read_data=two_multi_line_json)): - parsed_json = JsonComments.read_file('mock.json') - - assert('colors' in parsed_json) - assert(len(parsed_json['colors']) == 4) - assert('blue' in parsed_json['colors']) - assert('orange' in parsed_json['colors']) - assert('purple' in parsed_json['colors']) - assert('violet' in parsed_json['colors']) - - -def test_write_nan(): - with patch(builtins.__name__ + ".open", - mock_open(), - create=True) as mo: - ju.write('/some/file/test.json', { "thing": float('nan')}) - - assert 'null' in str(mo().write.call_args_list[0]) diff --git a/allensdk/test/config/test_manifest.py b/allensdk/test/config/test_manifest.py deleted file mode 100644 index cddbb90c1f..0000000000 --- a/allensdk/test/config/test_manifest.py +++ /dev/null @@ -1,96 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import os -from allensdk.config.manifest_builder import ManifestBuilder -from allensdk.config.manifest import Manifest - - -@pytest.fixture -def builder(): - b = ManifestBuilder() - b.add_path('BASEDIR', '/home/username/example') - - return b - - -def testManifestConstructor(builder): - manifest = builder.get_manifest() - expected = os.path.abspath('/home/username/example') - actual = manifest.get_path('BASEDIR') - assert(expected == actual) - - -def testManifestParent(builder): - builder.add_path('WORKDIR', - 'work', - parent_key='BASEDIR') - manifest = builder.get_manifest() - expected = os.path.abspath('/home/username/example/work') - actual = manifest.get_path('WORKDIR') - assert(expected == actual) - - -def testManifestBuilderDataFrame(builder): - builder.add_path('WORKDIR', - 'work', - parent_key='BASEDIR') - builder_df = builder.as_dataframe() - - assert('key' in builder_df.keys()) - assert('type' in builder_df.keys()) - assert('spec' in builder_df.keys()) - assert('parent_key' in builder_df.keys()) - assert('format' in builder_df.keys()) - assert(5 == len(builder_df.keys())) - - -def testManifestDataFrame(builder): - builder.add_path('WORKDIR', - 'work', - parent_key='BASEDIR') - - manifest = builder.get_manifest() - df = manifest.as_dataframe() - - assert('type' in df.keys()) - assert('spec' in df.keys()) - assert(2 == len(df.keys())) - - -def safe_mkdir_root_dir(): - directory = os.path.abspath(os.sep) - Manifest.safe_mkdir(directory) # should not error \ No newline at end of file diff --git a/allensdk/test/config/test_multi_file_config.py b/allensdk/test/config/test_multi_file_config.py deleted file mode 100644 index f6a739f52e..0000000000 --- a/allensdk/test/config/test_multi_file_config.py +++ /dev/null @@ -1,134 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2016. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import patch, mock_open -from allensdk.config.model.description_parser import DescriptionParser -try: - import __builtin__ as builtins -except: - import builtins - - -@pytest.fixture -def multiconfig(): - file_1 = ("{\n" - " \"section_A\": [\n" - " {\n" - " \"prop_a\": \"val_a\",\n" - " \"prop_b\": \"val_b\"\n" - " },\n" - " {\n" - " \"prop_c\": \"val_c\",\n" - " \"prop_d\": \"val_d\"\n" - " }\n" - " ],\n" - - " \"section_B\": [\n" - " {\n" - " \"prop_e\": \"val_e\",\n" - " \"prop_f\": \"val_f\"\n" - " },\n" - " {\n" - " \"prop_g\": \"val_g\",\n" - " \"prop_h\": \"val_h\"\n" - " }\n" - " ]\n" - "}\n" - ) - file_2 = ("{\n" - " \"section_B\": [\n" - " {\n" - " \"prop_i\": \"val_i\",\n" - " \"prop_j\": \"val_j\"\n" - " }\n" - " ],\n" - " \"section_C\": [\n" - " {\n" - " \"prop_k\": \"val_k\",\n" - " \"prop_l\": \"val_l\"\n" - " }\n" - " ]\n" - "}\n" - ) - - parser = DescriptionParser() - - with patch(builtins.__name__ + ".open", - mock_open(read_data=file_1)): - description = parser.read("mock_1.json") - - with patch(builtins.__name__ + ".open", - mock_open(read_data=file_2)): - parser.read("mock_2.json", description) - - return description - - -def testAllSectionsPresent(multiconfig): - assert ('section_A' in multiconfig.data and - 'section_B' in multiconfig.data and - 'section_C' in multiconfig.data) - assert len(multiconfig.data.keys()) == 3 - - -def testSectionA(multiconfig): - assert len(multiconfig.data['section_A']) == 2 - assert multiconfig.data['section_A'][0] == { - 'prop_a': 'val_a', - 'prop_b': 'val_b'} - assert multiconfig.data['section_A'][1] == { - 'prop_c': 'val_c', - 'prop_d': 'val_d'} - - -def testSectionB(multiconfig): - assert len(multiconfig.data['section_B']) == 3 - assert multiconfig.data['section_B'][0] == { - 'prop_e': 'val_e', - 'prop_f': 'val_f'} - assert multiconfig.data['section_B'][1] == { - 'prop_g': 'val_g', - 'prop_h': 'val_h'} - assert multiconfig.data['section_B'][2] == { - 'prop_i': 'val_i', - 'prop_j': 'val_j'} - - -def testSectionC(multiconfig): - assert len(multiconfig.data['section_C']) == 1 - assert multiconfig.data['section_C'][0] == { - 'prop_k': 'val_k', - 'prop_l': 'val_l'} diff --git a/allensdk/test/config/test_pyconfig_parser.py b/allensdk/test/config/test_pyconfig_parser.py deleted file mode 100644 index 01439aa88a..0000000000 --- a/allensdk/test/config/test_pyconfig_parser.py +++ /dev/null @@ -1,136 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from mock import patch, mock_open -from allensdk.config.model.description_parser import DescriptionParser -try: - import __builtin__ as builtins -except: - import builtins - - -@pytest.fixture -def pyconfig(): - file_1 = ("{\n" - " \"section_A\": [\n" - " {\n" - " \"prop_a\": \"val_a\",\n" - " \"prop_b\": \"val_b\"\n" - " },\n" - " {\n" - " \"prop_c\": \"val_c\",\n" - " \"prop_d\": \"val_d\"\n" - " }\n" - " ],\n" - " \"section_B\": [\n" - " {\n" - " \"prop_e\": \"val_e\",\n" - " \"prop_f\": \"val_f\"\n" - " },\n" - " {\n" - " \"prop_g\": \"val_g\",\n" - " \"prop_h\": \"val_h\"\n" - " }\n" - " ]\n" - "}\n" - ) - file_2 = ("{\n" - " \"section_B\": [\n" - " {\n" - " \"prop_i\": \"val_i\",\n" - " \"prop_j\": \"val_j\"\n" - " }\n" - " ],\n" - " \"section_C\": [\n" - " {\n" - " \"prop_k\": \"val_k\",\n" - " \"prop_l\": \"val_l\"\n" - " }\n" - " ]\n" - "}\n" - ) - - with patch(builtins.__name__ + ".open", - mock_open( - read_data=file_1)): - parser = DescriptionParser() - description = parser.read("mock_1.pycfg") - - with patch(builtins.__name__ + ".open", - mock_open( - read_data=file_2)): - parser = DescriptionParser() - parser.read("mock_2.pycfg", - description) - - return description - - -def testAllSectionsPresent(pyconfig): - assert('section_A' in pyconfig.data and - 'section_B' in pyconfig.data and - 'section_C' in pyconfig.data) - assert(len(pyconfig.data.keys()) == 3) - - -def testSectionA(pyconfig): - assert len(pyconfig.data['section_A']) == 2 - assert pyconfig.data['section_A'][0] == { - 'prop_a': 'val_a', - 'prop_b': 'val_b'} - assert pyconfig.data['section_A'][1] == { - 'prop_c': 'val_c', - 'prop_d': 'val_d'} - - -def testSectionB(pyconfig): - assert len(pyconfig.data['section_B']) == 3 - assert pyconfig.data['section_B'][0] == { - 'prop_e': 'val_e', - 'prop_f': 'val_f'} - assert pyconfig.data['section_B'][1] == { - 'prop_g': 'val_g', - 'prop_h': 'val_h'} - assert pyconfig.data['section_B'][2] == { - 'prop_i': 'val_i', - 'prop_j': 'val_j'} - - -def testSectionC(pyconfig): - assert len(pyconfig.data['section_C']) == 1 - assert pyconfig.data['section_C'][0] == { - 'prop_k': 'val_k', - 'prop_l': 'val_l'} diff --git a/allensdk/test/core/nwb_ephys_files.txt b/allensdk/test/core/nwb_ephys_files.txt deleted file mode 100644 index 598d597d51..0000000000 --- a/allensdk/test/core/nwb_ephys_files.txt +++ /dev/null @@ -1 +0,0 @@ -/data/informatics/module_test_data/observatory/test_nwb/519244938_ephys.nwb \ No newline at end of file diff --git a/allensdk/test/core/nwb_files.txt b/allensdk/test/core/nwb_files.txt deleted file mode 100644 index 2d9019bbb6..0000000000 --- a/allensdk/test/core/nwb_files.txt +++ /dev/null @@ -1,4 +0,0 @@ -/allen/aibs/informatics/module_test_data/observatory/test_nwb/506954308.nwb -/allen/aibs/informatics/module_test_data/observatory/test_nwb/out_510221121.nwb -/allen/aibs/informatics/module_test_data/observatory/test_nwb/out_510390912.nwb -/allen/aibs/informatics/module_test_data/observatory/test_nwb/out_510524416.nwb diff --git a/allensdk/test/core/test_authentication.py b/allensdk/test/core/test_authentication.py deleted file mode 100644 index f8b2531aab..0000000000 --- a/allensdk/test/core/test_authentication.py +++ /dev/null @@ -1,75 +0,0 @@ -import pytest - -from allensdk.core.authentication import ( - EnvCredentialProvider, credential_injector, set_credential_provider) - - -@pytest.mark.parametrize( - "provider,credential_map,expected", - [ - (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), - {"user": "LIMS_USER", "password": "LIMS_PASSWORD"}, - ("user", "1234")), - ] -) -def test_credential_injector(provider, credential_map, expected): - def mock_func(*, user, password): - return (user, password) - assert ( - credential_injector(credential_map, provider)(mock_func)() == expected) - - -@pytest.mark.parametrize( - "provider,credential_map,expected", - [ - (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), - {"user": "LIMS_USER"}, - ("user")), - ] -) -def test_credential_injector_only_injects_existing_kwargs( - provider, credential_map, expected): - def mock_func(*, user): - return user - assert ( - credential_injector(credential_map, provider)(mock_func)() == expected) - - -@pytest.mark.parametrize( - "provider,credential_map", - [ - (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), - {"user": "LIMS_USER", "password": "LIMS_PASSWORD"},), - ] -) -def test_credential_injector_only_injects_mapped_credentials( - provider, credential_map): - def mock_func(*, user, db): - pass - with pytest.raises(TypeError): - credential_injector(credential_map, provider)(mock_func)() - - -@pytest.mark.parametrize( - "provider,credential_map", - [ - (EnvCredentialProvider({"LIMS_USER": "user", "LIMS_PASSWORD": "1234"}), - {"user": "LIMS_USER", "password": "LIMS_PASSWORD"},), - ] -) -def test_credential_injector_preserves_function_args(provider, credential_map): - def mock_func(arg1, kwarg1=None, *, user, password): - return (arg1, kwarg1, user, password) - assert ( - credential_injector(credential_map, provider) - (mock_func)("arg1", kwarg1="kwarg1") - == ("arg1", "kwarg1", "user", "1234")) - - -def test_credential_injector_with_provider_update(): - def mock_func(*, user): - return user - provider = EnvCredentialProvider({"LIMS_USER": "user"}) - credential_map = {"user": "LIMS_USER"} - set_credential_provider(provider) - assert credential_injector(credential_map)(mock_func)() == "user" diff --git a/allensdk/test/core/test_brain_observatory_cache.py b/allensdk/test/core/test_brain_observatory_cache.py deleted file mode 100644 index be359c3d11..0000000000 --- a/allensdk/test/core/test_brain_observatory_cache.py +++ /dev/null @@ -1,379 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import os -import numpy as np -from mock import call, patch, mock_open, MagicMock -from allensdk.core.brain_observatory_cache import BrainObservatoryCache -from allensdk.api.queries.brain_observatory_api import BrainObservatoryApi -import json -import allensdk.brain_observatory.stimulus_info as si -from allensdk.test_utilities.regression_fixture import get_list_of_path_dict - -try: - import __builtin__ as builtins # @UnresolvedImport -except: - import builtins # @UnresolvedImport - - -CACHE_MANIFEST = """ -{ - "manifest": [ - { - "type": "manifest_version", - "value": "1.3" - }, - { - "type": "dir", - "spec": ".", - "key": "BASEDIR" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "experiment_containers.json", - "key": "EXPERIMENT_CONTAINERS" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "ophys_experiments.json", - "key": "EXPERIMENTS" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "ophys_experiment_data/%d.nwb", - "key": "EXPERIMENT_DATA" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "cell_specimens.json", - "key": "CELL_SPECIMENS" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "stimulus_mappings.json", - "key": "STIMULUS_MAPPINGS" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "ophys_analysis_data/%d_%s_analysis.h5", - "key": "ANALYSIS_DATA" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "ophys_experiment_events/%d_events.npz", - "key": "EVENTS_DATA" - }, - { - "parent_key": "BASEDIR", - "type": "file", - "spec": "ophys_eye_gaze_mapping/%d_eyetracking_dlc_to_screen_mapping.h5", - "key": "EYE_GAZE_DATA" - } - ] -} -""" - - -@pytest.fixture() -def events_test_data(): - return {"pattern": "/allen/aibs/informatics/module_test_data/observatory/events/%d_events.npz", - "experiment_id": 715923832} - - -@pytest.fixture(scope="function") -def brain_observatory_cache(): - boc = None - - try: - manifest_data = bytes(CACHE_MANIFEST, 'UTF-8') # Python 3 - except: - manifest_data = bytes(CACHE_MANIFEST) # Python 2.7 - - with patch('os.path.exists', - return_value=True): - with patch(builtins.__name__ + ".open", - mock_open(read_data=manifest_data)): - # Download a list of all targeted areas - boc = BrainObservatoryCache(manifest_file="some_path/manifest.json", - base_uri='http://api.brain-map.org') - - return boc - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_all_targeted_structures(mock_json_msg_query, - brain_observatory_cache): - with patch('os.path.exists') as m: - m.return_value = False - - with patch('allensdk.core.json_utilities.write', - MagicMock(name='write_json')): - with patch('allensdk.core.json_utilities.read', - MagicMock(name='read_json')): - brain_observatory_cache.get_all_targeted_structures() - - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::ExperimentContainer,rma::include," - "ophys_experiments,isi_experiment," - "specimen(donor(conditions,age,transgenic_lines))," - "targeted_structure," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_experiment_containers(mock_json_msg_query, - brain_observatory_cache): - with patch('os.path.exists') as m: - m.return_value = False - - with patch('allensdk.core.json_utilities.write', - MagicMock(name='write_json')): - with patch('allensdk.core.json_utilities.read', - MagicMock(name='read_json')): - # Download experiment containers for VISp experiments - visp_ecs = brain_observatory_cache.get_experiment_containers( - targeted_structures=['VISp']) - - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::ExperimentContainer,rma::include," - "ophys_experiments,isi_experiment," - "specimen(donor(conditions,age,transgenic_lines)),targeted_structure," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_all_cre_lines(mock_json_msg_query, - brain_observatory_cache): - with patch('os.path.exists') as m: - m.return_value = False - - with patch('allensdk.core.json_utilities.write', - MagicMock(name='write_json')): - with patch('allensdk.core.json_utilities.read', - MagicMock(name='read_json')): - # Download a list of all cre lines - tls = brain_observatory_cache.get_all_cre_lines() - - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::ExperimentContainer,rma::include," - "ophys_experiments,isi_experiment," - "specimen(donor(conditions,age,transgenic_lines)),targeted_structure," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_ophys_experiments(mock_json_msg_query, - brain_observatory_cache): - with patch('os.path.exists') as m: - m.return_value = False - - with patch('allensdk.core.json_utilities.write', - MagicMock(name='write_json')): - with patch('allensdk.core.json_utilities.read', - MagicMock(name='read_json')): - # Download a list of all transgenic driver lines - tls = brain_observatory_cache.get_ophys_experiments() - - calls = [call("http://api.brain-map.org/api/v2/data/query.json?q=" - "model::OphysExperiment,rma::include,experiment_container," - "well_known_files(well_known_file_type),targeted_structure," - "specimen(donor(age,transgenic_lines))," - "rma::options[num_rows$eq'all'][count$eqfalse]"), - - call("http://api.brain-map.org/api/v2/data/query.json?q=" - "model::WellKnownFile,rma::criteria,well_known_file_type[name$eqEyeDlcScreenMapping]," - "rma::options[num_rows$eq'all'][count$eqfalse]")] - - mock_json_msg_query.assert_has_calls(calls) - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_all_session_types(mock_json_msg_query, - brain_observatory_cache): - with patch('os.path.exists') as m: - m.return_value = False - - with patch('allensdk.core.json_utilities.write', - MagicMock(name='write_json')): - with patch('allensdk.core.json_utilities.read', - MagicMock(name='read_json')): - # Download a list of all transgenic driver lines - tls = brain_observatory_cache.get_all_session_types() - - calls = [call("http://api.brain-map.org/api/v2/data/query.json?q=" - "model::OphysExperiment,rma::include,experiment_container," - "well_known_files(well_known_file_type),targeted_structure," - "specimen(donor(age,transgenic_lines))," - "rma::options[num_rows$eq'all'][count$eqfalse]"), - - call("http://api.brain-map.org/api/v2/data/query.json?q=" - "model::WellKnownFile,rma::criteria,well_known_file_type[name$eqEyeDlcScreenMapping]," - "rma::options[num_rows$eq'all'][count$eqfalse]")] - - mock_json_msg_query.assert_has_calls(calls) - - -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_stimulus_mappings(mock_json_msg_query, - brain_observatory_cache): - with patch('os.path.exists') as m: - m.return_value = False - - with patch('allensdk.core.json_utilities.write', - MagicMock(name='write_json')): - with patch('allensdk.core.json_utilities.read', - MagicMock(name='read_json')): - # Download a list of all transgenic driver lines - tls = brain_observatory_cache._get_stimulus_mappings() - - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::ApiCamStimulusMapping," - "rma::options[num_rows$eq'all'][count$eqfalse]") - - -@pytest.mark.skipif(True, reason="need to develop mocks") -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_cell_specimens(mock_json_msg_query, - brain_observatory_cache): - with patch('os.path.exists') as m: - m.return_value = False - - with patch('allensdk.core.json_utilities.write', - MagicMock(name='write_json')): - # Download a list of all transgenic driver lines - tls = brain_observatory_cache.get_cell_specimens() - - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=") - - -# NOTE: This test should be updated when ugly hack for associating -# ophys experiment id with ophys session id is resolved. -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_get_ophys_pupil_data(mock_json_msg_query, - brain_observatory_cache): - - with patch.dict('allensdk.core.ophys_experiment_session_id_mapping.ophys_experiment_session_id_map', {111: 777}, clear=True): - # We are only testing that rma query is correct - try: - tls = brain_observatory_cache.get_ophys_pupil_data(111, suppress_pupil_data=False) - except Exception: - pass - - mock_json_msg_query.assert_called_once_with( - "http://api.brain-map.org/api/v2/data/query.json?q=" - "model::WellKnownFile," - "rma::criteria,[attachable_id$eq777],well_known_file_type[name$eqEyeDlcScreenMapping]," - "rma::options[num_rows$eq'all'][count$eqfalse]" - ) - - -def test_build_manifest(tmpdir_factory): - try: - manifest_data = bytes(CACHE_MANIFEST, 'UTF-8') # Python 3 - except: - manifest_data = bytes(CACHE_MANIFEST) # Python 2.7 - - manifest_file = str(tmpdir_factory.mktemp("boc").join("manifest.json")) - with patch('allensdk.config.manifest_builder.ManifestBuilder.write_json_string') as mock_write_json_string: - mock_write_json_string.return_value = manifest_data - - brain_observatory_cache = BrainObservatoryCache(manifest_file=manifest_file) - with open(manifest_file, 'rb') as f: - read_manifest_data = f.read() - - assert manifest_data == read_manifest_data - - -def test_string_argument_errors(brain_observatory_cache): - boc = brain_observatory_cache - - with pytest.raises(TypeError): - boc.get_experiment_containers(targeted_structures='str') - - with pytest.raises(TypeError): - boc.get_experiment_containers(cre_lines='str') - - with pytest.raises(TypeError): - boc.get_ophys_experiments(targeted_structures='str') - - with pytest.raises(TypeError): - boc.get_ophys_experiments(cre_lines='str') - - with pytest.raises(TypeError): - boc.get_ophys_experiments(stimuli='str') - - with pytest.raises(TypeError): - boc.get_ophys_experiments(session_types='str') - -@pytest.mark.skipif(not os.path.exists('/allen/aibs/informatics/module_test_data'), reason='AIBS path not available') -@pytest.mark.parametrize("path_dict", get_list_of_path_dict()) -def test_brain_observatory_cache_get_analysis_file(brain_observatory_cache, path_dict): - - nwb_path_pattern = os.path.join(os.path.dirname(path_dict['nwb_file']), '%d.nwb') - brain_observatory_cache.manifest.add_path(brain_observatory_cache.EXPERIMENT_DATA_KEY, nwb_path_pattern) - - analysis_path_pattern = os.path.join(os.path.dirname(path_dict['analysis_file']), '%d_%s_analysis.h5') - brain_observatory_cache.manifest.add_path(brain_observatory_cache.ANALYSIS_DATA_KEY, analysis_path_pattern) - - oeid = path_dict['ophys_experiment_id'] - data_set = brain_observatory_cache.get_ophys_experiment_data(oeid) - for stimulus in data_set.list_stimuli(): - if stimulus != si.SPONTANEOUS_ACTIVITY: - brain_observatory_cache.get_ophys_experiment_analysis(oeid, stimulus) - - -@pytest.mark.skipif(not os.path.exists('/allen/aibs/informatics/module_test_data'), reason='AIBS path not available') -def test_brain_observatory_cache_get_events_data(brain_observatory_cache, events_test_data): - eid = events_test_data["experiment_id"] - data_file = events_test_data["pattern"] % eid - - brain_observatory_cache.manifest.add_path(brain_observatory_cache.EVENTS_DATA_KEY, events_test_data["pattern"]) - - events = brain_observatory_cache.get_ophys_experiment_events(eid) - true_events = np.load(data_file, allow_pickle=False)["ev"] - assert(np.all(events == true_events)) diff --git a/allensdk/test/core/test_brain_observatory_nwb_data_set.py b/allensdk/test/core/test_brain_observatory_nwb_data_set.py deleted file mode 100755 index b141c3ab96..0000000000 --- a/allensdk/test/core/test_brain_observatory_nwb_data_set.py +++ /dev/null @@ -1,360 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import functools -import numpy as np -from pkg_resources import resource_filename # @UnresolvedImport -from allensdk.core.brain_observatory_nwb_data_set import BrainObservatoryNwbDataSet, si -import allensdk.core.brain_observatory_nwb_data_set as bonds -import pytest -import os -import h5py - -from allensdk.brain_observatory.brain_observatory_exceptions import MissingStimulusException - -from test_h5_utilities import mem_h5 - - -NWB_FLAVORS = [] - -if 'TEST_NWB_FILES' in os.environ: - nwb_list_file = os.environ['TEST_NWB_FILES'] -else: - nwb_list_file = resource_filename(__name__, 'nwb_files.txt') - -if os.environ.get('TEST_COMPLETE', None) == 'true': - with open(nwb_list_file, 'r') as f: - NWB_FLAVORS = [l.strip() for l in f] - - -@pytest.fixture(params=NWB_FLAVORS) -def data_set(request): - assert os.path.exists(request.param) - data_set = BrainObservatoryNwbDataSet(request.param) - - return data_set - - -@pytest.fixture -def stim_pres_h5(mem_h5): - def make_stim_pres_h5(stimulus_name): - mem_h5.create_group('stimulus/presentation/{}'.format(stimulus_name)) - mem_h5.create_group('stimulus/not_presentation/{}'.format(stimulus_name)) - return mem_h5 - return make_stim_pres_h5 - - -@pytest.fixture -def abstract_feature_series_h5(mem_h5): - def make_abstract_feature_series_h5(stimulus_name, stim_data, features, frame_dur): - - stimulus_path = 'stimulus/presentation/{}'.format(stimulus_name) - frame_dur_path = '{}/frame_duration'.format(stimulus_path) - features_path = '{}/features'.format(stimulus_path) - stim_data_path = '{}/data'.format(stimulus_path) - - mem_h5[frame_dur_path] = frame_dur - mem_h5[stim_data_path] = stim_data - mem_h5[features_path] = features - - return mem_h5 - return make_abstract_feature_series_h5 - - -def test_acceptance(data_set): - data_set.get_cell_specimen_ids() - data_set.get_session_type() - data_set.get_metadata() - data_set.get_running_speed() - data_set.get_motion_correction() - - -def test_get_roi_ids(data_set): - ids = data_set.get_roi_ids() - assert len(ids) == len(data_set.get_cell_specimen_ids()) - -def test_get_metadata(data_set): - md = data_set.get_metadata() - - valid_fields = [ 'genotype', 'cre_line', 'imaging_depth_um', 'ophys_experiment_id', 'experiment_container_id', - 'session_start_time', 'age_days', 'device', 'device_name', 'pipeline_version', 'sex', - 'targeted_structure', 'excitation_lambda', 'indicator', 'fov', 'session_type', 'specimen_name' ] - - invalid_fields = [ 'imaging_depth', 'age', 'device_string', 'generated_by' ] - - for field in valid_fields: - assert md[field] is not None - - for field in invalid_fields: - assert field not in md - - - -def test_get_cell_specimen_indices(data_set): - inds = data_set.get_cell_specimen_indices([]) - assert len(inds) == 0 - - ids = data_set.get_cell_specimen_ids() - - inds = data_set.get_cell_specimen_indices(ids) - assert np.all(np.array(inds) == np.arange(len(inds))) - - inds = data_set.get_cell_specimen_indices([ids[0]]) - assert inds[0] == 0 - - -def test_get_fluorescence_traces(data_set): - ids = data_set.get_cell_specimen_ids() - - timestamps, traces = data_set.get_fluorescence_traces() - assert len(timestamps) == traces.shape[1] - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_fluorescence_traces(ids) - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_fluorescence_traces([ids[0]]) - assert traces.shape[0] == 1 - - -def test_get_neuropil_traces(data_set): - ids = data_set.get_cell_specimen_ids() - - timestamps, traces = data_set.get_neuropil_traces() - assert len(timestamps) == traces.shape[1] - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_neuropil_traces(ids) - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_neuropil_traces([ids[0]]) - assert traces.shape[0] == 1 - - -def test_get_dff_traces(data_set): - ids = data_set.get_cell_specimen_ids() - - timestamps, traces = data_set.get_dff_traces() - # assert len(timestamps) == traces.shape[1] - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_dff_traces(ids) - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_dff_traces([ids[0]]) - assert traces.shape[0] == 1 - -def test_get_neuropil_r(data_set): - - ids = data_set.get_cell_specimen_ids() - r = data_set.get_neuropil_r() - assert len(ids) == len(r) - - r = data_set.get_neuropil_r(ids) - assert len(ids) == len(r) - - short_list = [ids[0]] - r = data_set.get_neuropil_r(short_list) - assert len(short_list) == len(r) - -def test_get_corrected_fluorescence_traces(data_set): - ids = data_set.get_cell_specimen_ids() - - timestamps, traces = data_set.get_corrected_fluorescence_traces() - assert len(timestamps) == traces.shape[1] - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_corrected_fluorescence_traces(ids) - assert len(ids) == traces.shape[0] - - timestamps, traces = data_set.get_corrected_fluorescence_traces([ids[0]]) - assert traces.shape[0] == 1 - - -def test_get_roi_mask(data_set): - ids = data_set.get_cell_specimen_ids() - roi_masks = data_set.get_roi_mask() - assert len(ids) == len(roi_masks) - - max_projection = data_set.get_max_projection() - for roi_mask in roi_masks: - mask = roi_mask.get_mask_plane() - assert mask.shape[0] == max_projection.shape[0] - assert mask.shape[1] == max_projection.shape[1] - - roi_masks = data_set.get_roi_mask([ids[0]]) - assert len(roi_masks) == 1 - - -def test_get_roi_mask_array(data_set): - ids = data_set.get_cell_specimen_ids() - arr = data_set.get_roi_mask_array() - assert arr.shape[0] == len(ids) - - arr = data_set.get_roi_mask_array([ids[0]]) - assert arr.shape[0] == 1 - - try: - arr = data_set.get_roi_mask_array([0]) - except ValueError as e: - assert str(e).startswith("Cell specimen not found") - - -def test_get_stimulus_epoch_table(data_set): - - summary_df = data_set.get_stimulus_epoch_table() - - session_type = data_set.get_session_type() - if session_type == si.THREE_SESSION_A or si.THREE_SESSION_C: - assert len(summary_df) == 7 - elif session_type == si.THREE_SESSION_B: - assert len(summary_df) == 8 - elif session_type == si.THREE_SESSION_C2: - assert len(summary_df) == 10 - else: - raise NotImplementedError('Code not tested for session of type: %s' % session_type) - -def test_get_stimulus_table_master(data_set): - - master_df = data_set.get_stimulus_table('master') - - session_type = data_set.get_session_type() - if session_type == si.THREE_SESSION_A: - assert len(master_df) == 45629 - elif session_type == si.THREE_SESSION_B: - assert len(master_df) == 20951 - elif session_type == si.THREE_SESSION_C: - assert len(master_df) == 26882 - elif session_type == si.THREE_SESSION_C2: - assert len(master_df) == 29398 - else: - raise NotImplementedError('Code not tested for session of type: %s' % session_type) - - -def test_make_indexed_time_series_stimulus_table(): - - stimulus_name = 'fish' - frame_dur_exp = np.arange(20).reshape((10, 2)) - inds_exp = np.arange(10) - - obt = bonds._make_indexed_time_series_stimulus_table(inds_exp, frame_dur_exp) - - frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T - assert(np.allclose( frame_dur_obt, frame_dur_exp )) - - -def test_make_indexed_time_series_stimulus_table_out_of_order(): - - stimulus_name = 'fish' - frame_dur_exp = np.arange(20).reshape((10, 2)) - frame_dur_file = frame_dur_exp.copy()[::-1, :] - inds_exp = np.arange(10) - - obt = bonds._make_indexed_time_series_stimulus_table(inds_exp, frame_dur_file) - - frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T - assert(np.allclose( frame_dur_obt, frame_dur_exp )) - - -def test_make_abstract_feature_series_stimulus_table_out_of_order(): - - stimulus_name = 'fish' - frame_dur_exp = np.arange(20).reshape((10, 2)) - frame_dur_file = frame_dur_exp.copy()[::-1, :] - features_exp = ['orientation', 'spatial_frequency', 'phase'] - data_exp = np.arange(30).reshape((10, 3)) - data_file = data_exp.copy()[::-1, :] - - obt = bonds._make_abstract_feature_series_stimulus_table(data_file, features_exp, frame_dur_file) - - frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T - assert(np.allclose( frame_dur_obt, frame_dur_exp )) - - data_obt = np.array([ obt['orientation'].values, obt['spatial_frequency'].values, obt['phase'].values ]).T - assert(np.allclose( data_obt, data_exp )) - - -def test_make_spontanous_activity_stimulus_table(): - - table_values_exp = [[0, 2], [4, 6]] - - frame_dur = np.arange(8).reshape((4, 2)) - events = np.array([ 1, -1, 1, -1 ]) - - obt = bonds._make_spontaneous_activity_stimulus_table(events, frame_dur) - assert(np.allclose( obt.values, table_values_exp )) - - -def test_make_repeated_indexed_time_series_stimulus_table(): - - stimulus_name = 'fish' - frame_dur_exp = np.arange(20).reshape((10, 2)) - inds_exp = np.array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) - repeats_exp = np.array([0] * 5 + [1] * 5) - - obt = bonds._make_repeated_indexed_time_series_stimulus_table(inds_exp, frame_dur_exp) - - frame_dur_obt = np.array([ obt['start'].values, obt['end'].values ]).T - assert(np.allclose( frame_dur_obt, frame_dur_exp )) - assert(np.allclose( repeats_exp, obt['repeat'] )) - - -def test_find_stimulus_presentation_group(stim_pres_h5): - - stimulus_name = 'fish' - stim_pres_h5 = stim_pres_h5(stimulus_name) - - obt = bonds._find_stimulus_presentation_group(stim_pres_h5, stimulus_name) - - assert( obt.name == '/stimulus/presentation/fish' ) - - -def test_find_stimulus_presentation_group_missing(stim_pres_h5): - - stimulus_name = 'fish' - stim_pres_h5 = stim_pres_h5('fowl') - - with pytest.raises(MissingStimulusException): - obt = bonds._find_stimulus_presentation_group(stim_pres_h5, stimulus_name) - - -def test_find_stimulus_presentation_group_duplicate(stim_pres_h5): - - stimulus_name = 'fish' - stim_pres_h5 = stim_pres_h5('fish') - stim_pres_h5.create_group('/stimulus/presentation/fish_stimulus') - - with pytest.raises(MissingStimulusException): - obt = bonds._find_stimulus_presentation_group(stim_pres_h5, stimulus_name) diff --git a/allensdk/test/core/test_cell_filters.py b/allensdk/test/core/test_cell_filters.py deleted file mode 100644 index 298b5a9c8b..0000000000 --- a/allensdk/test/core/test_cell_filters.py +++ /dev/null @@ -1,360 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import os -import json -import pandas as pd -from zipfile import ZipFile -from mock import patch, mock_open, MagicMock -from test_brain_observatory_cache import CACHE_MANIFEST -from allensdk.core.brain_observatory_cache \ - import BrainObservatoryCache -from allensdk.api.queries.brain_observatory_api \ - import BrainObservatoryApi - - -try: - import __builtin__ as builtins # @UnresolvedImport -except: - import builtins # @UnresolvedImport - -CELL_SPECIMEN_ZIP_URL = ("http://observatory.brain-map.org/visualcoding/" - "data/cell_metrics.csv.zip") - - -@pytest.fixture -def cells(): - return [{u'tld1_id': 177839004, - u'natural_movie_two_small': None, - u'natural_movie_one_a_small': None, - u'speed_tuning_c_large': None, - u'speed_tuning_c_small': None, - u'drifting_grating_small': None, - u'tld1_name': u'Cux2-CreERT2', - u'imaging_depth': 275, - u'tlr1_id': 265943423, - u'pref_dir_dg': None, - u'osi_sg': 0.728589701688166, - u'osi_dg': None, - u'tlr1_name': u'Ai93(TITL-GCaMP6f)', - u'area': u'VISpm', - u'pref_image_ns': 89.0, - u'natural_movie_one_c_small': None, - u'locally_sparse_noise_on_small': None, - u'drifting_grating_large': None, - u'experiment_container_id': 511498500, - u'natural_movie_one_a_large': None, - u'natural_movie_one_c_large': None, - u'tld2_name': u'Camk2a-tTA', - u'p_ns': 2.64407299505246e-05, - u'natural_movie_three_large': None, - u'pref_ori_sg': 30.0, - u'speed_tuning_a_large': None, - u'p_dg': None, - u'time_to_peak_sg': 0.199499999999999, - u'p_sg': 7.60972815250796e-05, - u'time_to_peak_ns': 0.299249999999998, - u'locally_sparse_noise_on_large': None, - u'dsi_dg': None, - u'pref_tf_dg': None, - u'natural_movie_three_small': None, - u'pref_sf_sg': 0.32, - u'tld2_id': 177837320, - u'locally_sparse_noise_off_large': None, - u'locally_sparse_noise_off_small': None, - u'cell_specimen_id': 517394843, - u'pref_phase_sg': 0.5 - }, - {u'tld1_id': 177839004, - u'natural_movie_two_small': None, - u'natural_movie_one_a_small': None, - u'speed_tuning_c_large': None, - u'speed_tuning_c_small': None, - u'drifting_grating_small': None, - u'tld1_name': u'Cux2-CreERT2', - u'imaging_depth': 275, - u'tlr1_id': 265943423, - u'natural_movie_two_large': None, - u'speed_tuning_a_small': None, - u'pref_dir_dg': None, - u'osi_sg': 0.899272239777491, - u'osi_dg': None, - u'tlr1_name': u'Ai93(TITL-GCaMP6f)', - u'area': u'VISpm', - u'pref_image_ns': 15.0, - u'natural_movie_one_c_small': None, - u'locally_sparse_noise_on_small': None, - u'drifting_grating_large': None, - u'experiment_container_id': 511498500, - u'natural_movie_one_a_large': None, - u'natural_movie_one_c_large': None, - u'tld2_name': u'Camk2a-tTA', - u'p_ns': 0.000356823517642681, - u'natural_movie_three_large': None, - u'pref_ori_sg': 0.0, - u'speed_tuning_a_large': None, - u'p_dg': None, - u'time_to_peak_sg': 0.565249999999996, - u'p_sg': 0.0565790644804479, - u'time_to_peak_ns': 0.432249999999997, - u'locally_sparse_noise_on_large': None, - u'dsi_dg': None, - u'pref_tf_dg': None, - u'natural_movie_three_small': None, - u'pref_sf_sg': 0.32, - u'tld2_id': 177837320, - u'locally_sparse_noise_off_large': None, - u'locally_sparse_noise_off_small': None, - u'cell_specimen_id': 517394850, - u'pref_phase_sg': 0.5}] - - -@pytest.fixture -def api(): - boi = BrainObservatoryApi() - - return boi - - -@pytest.fixture -def unmocked_boc(fn_temp_dir): - manifest_file = os.path.join(fn_temp_dir, "unmocked_boc", "manifest.json") - boc = BrainObservatoryCache(manifest_file=manifest_file) - - return boc - - -@pytest.fixture -def brain_observatory_cache(fn_temp_dir): - boc = None - - try: - manifest_data = bytes(CACHE_MANIFEST, - 'UTF-8') # Python 3 - except: - manifest_data = bytes(CACHE_MANIFEST) # Python 2.7 - - with patch('os.path.exists', - return_value=True): - with patch(builtins.__name__ + ".open", - mock_open(read_data=manifest_data)): - manifest_file = os.path.join(fn_temp_dir, "boc", "manifest.json") - boc = BrainObservatoryCache(manifest_file=manifest_file, - base_uri='http://api.brain-map.org') - - return boc - - -@pytest.fixture(scope="module") -def cell_specimen_table(tmpdir_factory): - # download a zipped version of the cell specimen table for filter tests - # as it is orders of magnitude faster - api = BrainObservatoryApi() - data_dir = str(tmpdir_factory.mktemp("data")) - zipped = os.path.join("cell_specimens.zip") - api.retrieve_file_over_http(CELL_SPECIMEN_ZIP_URL, zipped) - df = pd.read_csv(ZipFile(zipped).open("cell_metrics.csv"), - true_values="t", false_values="f") - js = json.loads(df.to_json(orient="records")) - table_file = os.path.join(data_dir, "cell_specimens.json") - with open(table_file, "w") as f: - json.dump(js, f, indent=1) - return table_file - - -@pytest.fixture -def example_filters(): - f = [{"field": "p_dg", - "op": "<=", - "value": 0.001 }, - {"field": "pref_dir_dg", - "op": "=", "value": 45 }, - {"field": "area", "op": "in", "value": [ "VISpm" ] }, - {"field": "tld1_name", - "op": "in", - "value": [ "Rbp4-Cre", "Cux2-CreERT2", "Rorb-IRES2-Cre" ] } - ] - - return f - - -@pytest.fixture -def between_filter(): - f = [{"field": "p_ns", - "op": "between", - "value": [ 0.00034, 0.00035 ] } - ] - - return f - - -FILTER_OPERATORS = ["=", "<", ">", "<=", ">=", "between", "in", "is"] -QUERY_TEMPLATES = { - "=": '({0} == {1})', - "<": '({0} < {1})', - ">": '({0} > {1})', - "<=": '({0} <= {1})', - ">=": '({0} >= {1})', - "between": '({0} >= {1}) and ({0} <= {1})', - "in": '({0} == {1})', - "is": '({0} == {1})' -} - - -@pytest.mark.skipif(True, reason="not done") -@patch.object(BrainObservatoryApi, "json_msg_query") -def test_dataframe_query(mock_json_msg_query, - brain_observatory_cache, - between_filter, - cells): - brain_observatory_cache = unmocked_boc - with patch('os.path.exists', - MagicMock(return_value=True)): - with patch('allensdk.core.json_utilities.read', - MagicMock(return_value=cells)): - cells = brain_observatory_cache.get_cell_specimens( - filters=between_filter) - - assert len(cells) > 0 - - -@pytest.mark.todo_flaky -def test_dataframe_query_unmocked(unmocked_boc, - example_filters, - cells, - cell_specimen_table): - brain_observatory_cache = unmocked_boc - - cells = brain_observatory_cache.get_cell_specimens( - filters=example_filters, - file_name=cell_specimen_table) - - # total lines = 18260, can make fail by passing no filters - #expected = 105 - assert len(cells) > 0 and len(cells) < 1000 - - -@pytest.mark.todo_flaky -def test_dataframe_query_between_unmocked(unmocked_boc, - between_filter, - cells, - cell_specimen_table): - brain_observatory_cache = unmocked_boc - - cells = brain_observatory_cache.get_cell_specimens( - filters=between_filter, - file_name=cell_specimen_table) - - # total lines = 18260, can make fail by passing no filters - #expected = 15 - assert len(cells) > 0 and len (cells) < 1000 - - -@pytest.mark.todo_flaky -def test_dataframe_query_is_unmocked(unmocked_boc, - cells, - cell_specimen_table): - brain_observatory_cache = unmocked_boc - - is_filter = [ - {"field": "all_stim", - "op": "is", - "value": True } - ] - - cells = brain_observatory_cache.get_cell_specimens( - filters=is_filter, - file_name=cell_specimen_table) - - assert len(cells) > 0 - - -def test_dataframe_query_string_between(api): - filters = [ - {"field": "p_ns", - "op": "between", - "value": [ 0.00034, 0.00035 ] } - ] - - query_string = api.dataframe_query_string(filters) - - assert query_string == '(p_ns >= 0.00034) and (p_ns <= 0.00035)' - - -def test_dataframe_query_string_in(api): - filters = [ - {"field": "name", - "op": "in", - "value": [ 'Abc', 'Def', 'Ghi' ] } - ] - - query_string = api.dataframe_query_string(filters) - - assert query_string == "(name == ['Abc', 'Def', 'Ghi'])" - - -def test_dataframe_query_string_in_floats(api): - filters = [ - {"field": "rating", - "op": "in", - "value": [ 9.9, 8.7, 0.1 ] } - ] - - query_string = api.dataframe_query_string(filters) - - assert query_string == "(rating == [9.9, 8.7, 0.1])" - - -def test_dataframe_query_string_is_boolean(api): - filters = [ - {"field": "fact_check", - "op": "is", - "value": False } - ] - - query_string = api.dataframe_query_string(filters) - - assert query_string == "(fact_check == False)" - - -def test_dataframe_query_string_multi_filters(api, - example_filters): - query_string = api.dataframe_query_string(example_filters) - - assert query_string == ("(p_dg <= 0.001) & (pref_dir_dg == 45) & " - "(area == ['VISpm']) & " - "(tld1_name == " - "['Rbp4-Cre', 'Cux2-CreERT2', 'Rorb-IRES2-Cre'])") diff --git a/allensdk/test/core/test_cell_types_cache_unit.py b/allensdk/test/core/test_cell_types_cache_unit.py deleted file mode 100644 index 6858396284..0000000000 --- a/allensdk/test/core/test_cell_types_cache_unit.py +++ /dev/null @@ -1,622 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import allensdk.core.cell_types_cache as CTC -from allensdk.core.cell_types_cache import ReporterStatus as RS -import pytest -from pandas.core.frame import DataFrame -from allensdk.config import enable_console_log -from mock import MagicMock, patch, call, mock_open -from six.moves import builtins -import itertools as it -import allensdk.core.json_utilities as ju -import pandas.io.json as pj -import pandas as pd -import os - -_MOCK_PATH = '/path/to/xyz.txt' - - -@pytest.fixture(scope="session", autouse=True) -def console_log(): - enable_console_log() - - -@pytest.fixture -def cell_id(): - cell_id = 480114344 - - return cell_id - - -@pytest.fixture -def cached_csv(tmpdir_factory): - csv = str(tmpdir_factory.mktemp("cache_test").join("data.csv")) - return csv - - -@pytest.fixture -def cache_fixture(tmpdir_factory): - # Instantiate the CellTypesCache instance. The manifest_file argument - # tells it where to store the manifest, which is a JSON file that tracks - # file paths. If you supply a relative path, it will go - # into your current working directory - manifest_file = str(tmpdir_factory.mktemp("ctc").join("manifest.json")) - ctc = CTC.CellTypesCache(manifest_file=manifest_file) - - return ctc - - -@pytest.mark.parametrize('path_exists', - (False, True)) -@patch('allensdk.core.cell_types_cache.NwbDataSet') -def test_sweep_data_with_api(mock_nwb, - cache_fixture, - path_exists): - ctc = cache_fixture - - specimen_id = 464212183 - - ephys_result = [{'ephys_result': - {'well_known_files': [ - {'download_link': '/path/to/data.nwb' }]}}] - - # this saves the NWB file to 'cell_types/specimen_464212183/ephys.nwb' - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=ephys_result)) as query_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs') as mkd: - mock_nwb.reset_mock() - _ = ctc.get_ephys_data(specimen_id, _MOCK_PATH) - - assert ope.called - if path_exists: - mock_nwb.assert_called_once_with(_MOCK_PATH) - assert not query_mock.called - assert not mkd.called - else: - # both levels of cacheable methods check if the directory exists. - assert mkd.call_args_list == [call(_MOCK_PATH)] - assert query_mock.called - mock_http.assert_called_once_with('http://api.brain-map.org/path/to/data.nwb', - _MOCK_PATH) - - -def test_sweep_data_exception(cache_fixture): - ctc = cache_fixture - - specimen_id = 464212183 - - ephys_result = [{'ephys_result': - {'well_known_files': [] }}] - - with pytest.raises(Exception) as exc: - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=ephys_result)) as query_mock: - with patch('os.path.exists', MagicMock(return_value=False)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - with patch('allensdk.core.cell_types_cache.NwbDataSet') as nwb: - _ = ctc.get_ephys_data(specimen_id) - - assert 'has no ephys data' in str(exc.value) - - -@pytest.mark.parametrize('path_exists,morph_flag,recon_flag,statuses,species,simple', - it.product((False, True), - (False, True), - (False, True), - (RS.POSITIVE, ['list', 'of', 'statuses']), - (None, ['mouse'], ['human']), - (False,))) - -def test_get_cells(cache_fixture, - path_exists, - morph_flag, - recon_flag, - statuses, - species, - simple): - ctc = cache_fixture - # this downloads metadata for all cells with morphology images - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.core.json_utilities.read', - return_value=['mock_cells_from_server']) as ju_read: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.list_cells_api', - MagicMock(return_value=['mock_cells_from_server'])) as list_cells_mock: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.filter_cells_api', - MagicMock(return_value=['mock_cells'])) as filter_cells_mock: - with patch('allensdk.core.json_utilities.write') as ju_write: - cells = ctc.get_cells(require_morphology=morph_flag, - require_reconstruction=recon_flag, - reporter_status=statuses, - species=species, - simple=simple) - - assert cells == ['mock_cells'] - - if (statuses == RS.POSITIVE): - expected_status = [statuses] - else: - expected_status = statuses - - filter_cells_mock.assert_called_once_with(['mock_cells_from_server'], - morph_flag, - recon_flag, - expected_status, - species, - simple) - - -@pytest.mark.parametrize('path_exists,morph_flag,recon_flag,statuses', - it.product((False, True), - (False, True), - (False, True), - (RS.POSITIVE, ['list', 'of', 'statuses']))) -def test_get_cells_with_api(cache_fixture, - path_exists, - morph_flag, - recon_flag, - statuses): - ctc = cache_fixture - - # note, this is only a mock for coverage, - # and has not a lot of relation to the actual data form - sweeps = [1, 2, 3] - return_dicts = [{'sweep_number': x, - 'tags': ['what - ever'], - 'neuron_reconstructions' : [], - 'data_sets': [], - 'reporter_status': 'whatever', - 'has_morphology': False, - 'has_reconstruction': False, - 'donor': { 'transgenic_lines': [{'transgenic_line_type_name': 'driver', - 'name': 'harold'}]}, - 'cell_reporter': {'name': 'tired'}, - 'specimen_tags': [{'name': 'a - b', - 'value': 123}]} for x \ - in sweeps] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', return_value=return_dicts)) as query_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.core.json_utilities.read', - return_value=return_dicts) as ju_read: - with patch('allensdk.core.json_utilities.write') as ju_write: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - cells = ctc.get_cells(require_morphology=morph_flag, - require_reconstruction=recon_flag, - reporter_status=statuses, - simple=True) - if path_exists: - ju_read.assert_called_once_with(_MOCK_PATH) - else: - assert ju_write.called - -@pytest.mark.parametrize('path_exists', - (False, True)) -def test_get_reconstruction(cache_fixture, - cell_id, - path_exists): - ctc = cache_fixture - - save_recon = \ - 'allensdk.api.queries.cell_types_api.CellTypesApi.save_reconstruction' - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch(save_recon) as save_recon_mock: - with patch('allensdk.core.swc.read_swc') as read_swc_mock: - # download and open an SWC file - _ = ctc.get_reconstruction(cell_id) - - if path_exists is False: - save_recon_mock.assert_called_once_with(cell_id, - _MOCK_PATH) - - read_swc_mock.assert_called_once_with(_MOCK_PATH) - - -@pytest.mark.parametrize('path_exists', - (False, True)) -@patch.object(DataFrame, "to_csv") -def test_get_reconstruction_with_api(to_csv, - cache_fixture, - cell_id, - path_exists): - ctc = cache_fixture - - reconstruction_data = [{'neuron_reconstructions': [ - {'well_known_files': [ - {'download_link': 'http://example.org'}]}]}] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=reconstruction_data)) as query_mock: - with patch('allensdk.core.swc.read_swc') as read_swc_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - _ = ctc.get_reconstruction(cell_id) - - if path_exists: - read_swc_mock.assert_called_once_with(_MOCK_PATH) - else: - assert query_mock.called - - -@patch.object(DataFrame, "to_csv") -def test_get_reconstruction_exception(to_csv, - cache_fixture, - cell_id): - ctc = cache_fixture - - reconstruction_data = [{'neuron_reconstructions': [ - {'well_known_files': None}]}] - - with pytest.raises(Exception) as exc: - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=reconstruction_data)) as query_mock: - with patch('allensdk.core.swc.read_swc') as read_swc_mock: - with patch('os.path.exists', MagicMock(return_value=False)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - _ = ctc.get_reconstruction(cell_id) - - assert 'has no reconstruction' in str(exc.value) - - -@pytest.mark.parametrize('path_exists,lookup_error', - it.product((False, True), - (False, True))) -def test_get_reconstruction_markers(cache_fixture, - cell_id, - path_exists, - lookup_error): - ctc = cache_fixture - - if lookup_error: - def lookup(i, n): - raise(LookupError('mock lookup error')) - else: - def lookup(i, n): - return - - save_recon_marker = \ - 'allensdk.api.queries.cell_types_api.CellTypesApi.save_reconstruction_markers' - - # download and open a marker file - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch(save_recon_marker, - MagicMock(side_effect=lookup)) as save_recon_markers_mock: - with patch('allensdk.core.swc.read_marker_file') as read_marker_mock: - _ = ctc.get_reconstruction_markers(cell_id) - - if path_exists is False: - save_recon_markers_mock.assert_called_once_with(cell_id, - _MOCK_PATH) - - if lookup_error: - assert not read_marker_mock.called - else: - read_marker_mock.assert_called_once_with(_MOCK_PATH) - - -@pytest.mark.parametrize('path_exists,lookup_error', - it.product((False, True), - (False, True))) -def test_get_reconstruction_markers_with_api(cache_fixture, - cell_id, - path_exists, - lookup_error): - ctc = cache_fixture - - reconstruction_data = [{'neuron_reconstructions': [ - {'well_known_files': [ - {'download_link': '/mock/path_to_file'}]}]}] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=reconstruction_data)) as query_mock: - with patch('allensdk.core.swc.read_marker_file') as marker_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - _ = ctc.get_reconstruction_markers(cell_id) - - if path_exists: - assert marker_mock.called - else: - mock_http.assert_called_once_with('http://api.brain-map.org/mock/path_to_file', - _MOCK_PATH) - - -def test_get_reconstruction_markers_exception(cache_fixture, - cell_id): - ctc = cache_fixture - - reconstruction_data = [{'neuron_reconstructions': [ - {'well_known_files': []}]}] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.retrieve_file_over_http') as mock_http: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=reconstruction_data)) as query_mock: - with patch('allensdk.core.swc.read_marker_file') as marker_mock: - with patch('os.path.exists', MagicMock(return_value=False)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - markers = ctc.get_reconstruction_markers(cell_id) - - assert len(markers) == 0 - - -@pytest.mark.parametrize('dataframe', - (False, True)) -def test_get_ephys_features(cache_fixture, - dataframe): - ctc = cache_fixture - - api_get_ephys_features = \ - 'allensdk.api.queries.cell_types_api.CellTypesApi.get_ephys_features' - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch(api_get_ephys_features) as api_get_ephys_features_mock: - # download all electrophysiology features for all cells - _ = ctc.get_ephys_features(dataframe=dataframe) - - assert api_get_ephys_features_mock.called - - -@pytest.mark.parametrize('df,path_exists', - it.product((False,True), - (False,True))) -@patch.object(DataFrame, "to_csv") -@patch("pandas.read_csv") -def test_get_ephys_features_with_api(read_csv, - to_csv, - cache_fixture, - df, - path_exists): - ctc = cache_fixture - - mock_data = [{'lorem': 1, - 'ipsum': 2 }, - {'lorem': 3, - 'ipsum': 4 }] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=mock_data)) as query_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs') as mkd: - _ = ctc.get_ephys_features(dataframe=df) - - if path_exists: - read_csv.assert_called_once_with(_MOCK_PATH, parse_dates=True) - else: - mkd.assert_called_once_with(_MOCK_PATH) - assert query_mock.called - - -@pytest.mark.parametrize('df', (False, True)) -def test_get_ephys_features_cache_roundtrip(cached_csv, - cache_fixture, - df): - ctc = cache_fixture - - mock_data = [{'lorem': 1, - 'ipsum': 2 }, - {'lorem': 3, - 'ipsum': 4 }] - - with patch.object(ctc, "get_cache_path", return_value=cached_csv): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=mock_data)) as query_mock: - data = ctc.get_ephys_features() - pandas_data = pd.read_csv(cached_csv, parse_dates=True) - - assert len(data) == 2 - assert sorted(data[0].keys()) == sorted(pandas_data.columns) - - -@pytest.mark.parametrize('path_exists,df', - it.product((False, True), - (False, True))) -@patch.object(DataFrame, "to_csv") -@patch("pandas.read_csv", - return_value=DataFrame([{ 'stuff': 'whatever'}, - { 'stuff': 'nonsense'}])) -def test_get_morphology_features(read_csv, - to_csv, - cache_fixture, - path_exists, - df): - ctc = cache_fixture - - json_data = [{ 'stuff': 'whatever'}, - { 'stuff': 'nonsense'}] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs') as mkd: - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=json_data)) as query_mock: - data = ctc.get_morphology_features(df, _MOCK_PATH) - - if df: - assert ('stuff' in data) == True - else: - assert all(['stuff' in f for f in data]) - - - if path_exists: - if df: - read_csv.assert_called_once_with(_MOCK_PATH, parse_dates=True) - else: - assert True - assert not mkd.called - else: - assert query_mock.called - assert mkd.called - - -@pytest.mark.parametrize('path_exists', - (False, True)) -def test_get_ephys_sweeps(cache_fixture, - path_exists): - ctc = cache_fixture - - cell_id = 464212183 - - get_ephys_sweeps = \ - 'allensdk.api.queries.cell_types_api.CellTypesApi.get_ephys_sweeps' - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch(get_ephys_sweeps) as get_ephys_sweeps_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.core.json_utilities.read', - return_value=['mock_data']) as ju_read: - with patch('allensdk.core.json_utilities.write') as ju_write: - _ = ctc.get_ephys_sweeps(cell_id) - - if path_exists: - assert ju_read.called_once_with(_MOCK_PATH) - else: - assert get_ephys_sweeps_mock.called_once_with(cell_id) - - -@pytest.mark.parametrize('path_exists', - (False, True)) -def test_get_ephys_sweeps_with_api(cache_fixture, - path_exists): - ctc = cache_fixture - - cell_id = 464212183 - sweeps = [1, 2, 3] - return_dicts = [{'sweep_number': x} for x in sweeps] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=return_dicts)) as query_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - with patch('allensdk.core.json_utilities.read', - return_value=['mock_data']) as ju_read: - with patch('allensdk.core.json_utilities.write') as ju_write: - _ = ctc.get_ephys_sweeps(cell_id) - - # read will be called regardless - assert ju_read.called_once_with(_MOCK_PATH) - - if path_exists: - assert not query_mock.called - else: - assert query_mock.called - - -@pytest.mark.parametrize('path_exists,require_reconstruction', - it.product((False, True), - (False, True))) -@patch('pandas.DataFrame.merge') -@patch.object(DataFrame, "to_csv") -@patch("pandas.read_csv", - return_value=DataFrame([{ 'stuff': 'whatever'}, - { 'stuff': 'nonsense'}])) -def test_get_all_features(read_csv, - to_csv, - mock_merge, - cache_fixture, - path_exists, - require_reconstruction): - ctc = cache_fixture - - sweeps = [1, 2, 3] - return_dicts = [{'sweep_number': x, - 'tags': 'whatever'} for x in sweeps] - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.api.queries.cell_types_api.CellTypesApi.model_query', - MagicMock(name='model query', - return_value=return_dicts)) as query_mock: - with patch('os.path.exists', MagicMock(return_value=path_exists)) as ope: - with patch('allensdk.config.manifest.Manifest.safe_make_parent_dirs'): - with patch('allensdk.core.json_utilities.read', - return_value=return_dicts) as ju_read: - with patch(builtins.__name__ + '.open', - mock_open(), - create=True) as open_mock: - with patch('allensdk.core.json_utilities.write') as ju_write: - _ = ctc.get_all_features( - require_reconstruction=require_reconstruction) - - if path_exists: - assert read_csv.called - else: - assert query_mock.called - - assert mock_merge.called - - -def test_build_manifest(cache_fixture): - ctc = cache_fixture - - mb_mock = MagicMock(name='manifest builder') - - with patch.object(ctc, "get_cache_path", return_value=_MOCK_PATH): - with patch('allensdk.core.cell_types_cache.ManifestBuilder', - return_value=mb_mock): - ctc.build_manifest('test_manifest.json') - - assert mb_mock.add_path.call_count == 8 - mb_mock.write_json_file.assert_called_once_with('test_manifest.json') diff --git a/allensdk/test/core/test_h5_utilities.py b/allensdk/test/core/test_h5_utilities.py deleted file mode 100644 index 7d3dd565d2..0000000000 --- a/allensdk/test/core/test_h5_utilities.py +++ /dev/null @@ -1,87 +0,0 @@ -import functools - -import h5py -import pytest -import numpy as np - -import allensdk.core.h5_utilities as h5_utilities - - -@pytest.fixture -def mem_h5(request): - my_file = h5py.File('my_file.h5', driver='core', backing_store=False) - - def fin(): - my_file.close() - request.addfinalizer(fin) - - return my_file - - -@pytest.fixture -def simple_h5(mem_h5): - mem_h5.create_group('a') - mem_h5.create_group('a/b') - mem_h5.create_group('a/b/c') - mem_h5.create_group('d') - mem_h5.create_group('a/e') - - return mem_h5 - - -@pytest.fixture -def simple_h5_with_datsets(simple_h5): - simple_h5.create_dataset(name='/a/b/c/fish', data=np.eye(10)) - simple_h5.create_dataset(name='a/fowl', data=np.eye(15)) - simple_h5.create_dataset(name='a/b/mammal', data=np.eye(20)) - - return simple_h5 - - -def test_decode_bytes(): - - inp = np.array([b'a', b'b', b'c']) - obt = h5_utilities.decode_bytes(inp) - - assert(np.array_equal( obt, ['a', 'b', 'c'] )) - - -def test_traverse_h5_file(simple_h5): - - names = [] - def cb(name, node): - names.append(name) - h5_utilities.traverse_h5_file(cb, simple_h5) - - assert( set(names) == set(['a', 'a/b', 'a/b/c', 'd', 'a/e']) ) - - -def test_locate_h5_objects(simple_h5): - - matcher_cb = functools.partial(h5_utilities.h5_object_matcher_relname_in, ['c', 'e']) - matches = h5_utilities.locate_h5_objects(matcher_cb, simple_h5) - - match_names = [ match.name for match in matches ] - assert( set(match_names) == set(['/a/e', '/a/b/c']) ) - - -def test_keyed_locate_h5_objects(simple_h5): - - matcher_cbs = { - 'e': functools.partial(h5_utilities.h5_object_matcher_relname_in, ['e']), - 'c': functools.partial(h5_utilities.h5_object_matcher_relname_in, ['c']), - } - - matches = h5_utilities.keyed_locate_h5_objects(matcher_cbs, simple_h5) - assert( matches['e'].name == '/a/e' ) - assert( matches['c'].name == '/a/b/c' ) - - -def test_load_datasets_by_relnames(simple_h5_with_datsets): - - relnames = ['fish', 'fowl', 'mammal'] - obt = h5_utilities.load_datasets_by_relnames(relnames, simple_h5_with_datsets, simple_h5_with_datsets['a/b']) - - assert( len(obt) == 2 ) - assert(np.allclose( obt['fish'], np.eye(10) )) - assert(np.allclose( obt['mammal'], np.eye(20) )) diff --git a/allensdk/test/core/test_json_utilities.py b/allensdk/test/core/test_json_utilities.py deleted file mode 100644 index be7aa56956..0000000000 --- a/allensdk/test/core/test_json_utilities.py +++ /dev/null @@ -1,124 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import allensdk.core.json_utilities as ju -import pytest -from mock import patch, MagicMock, call -import numpy as np - - -@pytest.fixture -def dict_obj(): - int_array, y = np.meshgrid(np.arange(2), np.arange(2)) - float_array = y.astype(float)/4.2 - bool_array = int_array > 0 - - object = {"string": "test string", - "float_array": float_array, - "int_array": int_array, - "bool_array": bool_array, - "list": ["this", "is", 1, "list"]} - return object - - -def test_write_integer_array(dict_obj): - s_in = ju.write_string({ "int_array": dict_obj["int_array"] }) - s_out = """{ - "int_array": [ - [ - 0, - 1 - ], - [ - 0, - 1 - ] - ] -}""" - - assert s_in == s_out - -def test_write_float_array(dict_obj): - s_in = ju.write_string({ "float_array": dict_obj["float_array"] }) - s_out ="""{ - "float_array": [ - [ - 0.0, - 0.0 - ], - [ - 0.23809523809523808, - 0.23809523809523808 - ] - ] -}""" - - assert s_in == s_out - -def test_write_string(dict_obj): - s_in = ju.write_string({ "string": dict_obj["string"] }) - s_out = """{ - "string": "test string" -}""" - - assert s_in == s_out - -def test_write_bool_array(dict_obj): - s_in = ju.write_string({ "bool_array": dict_obj["bool_array"] }) - s_out = """{ - "bool_array": [ - [ - false, - true - ], - [ - false, - true - ] - ] -}""" - assert s_in == s_out - -def test_write_list(dict_obj): - s_in = ju.write_string({ "list": dict_obj["list"] }) - s_out = """{ - "list": [ - "this", - "is", - 1, - "list" - ] -}""" - assert s_in == s_out diff --git a/allensdk/test/core/test_lazy_property.py b/allensdk/test/core/test_lazy_property.py deleted file mode 100644 index ea485e735a..0000000000 --- a/allensdk/test/core/test_lazy_property.py +++ /dev/null @@ -1,42 +0,0 @@ -import pytest -import copy as cp - -from allensdk.core.lazy_property import LazyProperty, LazyPropertyMixin - - -class CopyApi(object): - def get_data(self, original_data): - return cp.copy(original_data) - - -class DataClass(LazyPropertyMixin): - - def __init__(self, original_data, api=None): - self.api = CopyApi() if api is None else api - self.original_data = original_data - - self.data = self.LazyProperty(self.api.get_data, original_data=self.original_data) - - -@pytest.mark.parametrize('original_data', [{'a': 'b'}, [None]]) -def test_first_compute(original_data): - data_obj = DataClass(original_data) - assert data_obj.data == original_data - assert data_obj.data is not original_data - - -@pytest.mark.parametrize('original_data', [1, '1', [None]]) -def test_is_lazy(original_data): - data_obj = DataClass(original_data) - - first = data_obj.data - second = data_obj.data - assert first is second - - -@pytest.mark.parametrize('original_data', [1, '1', [None]]) -def test_not_settable(original_data): - data_obj = DataClass(original_data) - with pytest.raises(AttributeError) as err: - data_obj.data = '12345' - assert "Can't set LazyLoadable attribute" in err \ No newline at end of file diff --git a/allensdk/test/core/test_mouse_connectivity_cache.py b/allensdk/test/core/test_mouse_connectivity_cache.py deleted file mode 100755 index a525510e33..0000000000 --- a/allensdk/test/core/test_mouse_connectivity_cache.py +++ /dev/null @@ -1,525 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import warnings -import mock -import pytest -import numpy as np -import nrrd -import pandas as pd -import SimpleITK as sitk - - -from allensdk.core.mouse_connectivity_cache import MouseConnectivityCache -from allensdk.core.structure_tree import StructureTree - - -@pytest.fixture -def cached_csv(tmpdir_factory): - csv = str(tmpdir_factory.mktemp("cache_test").join("data.csv")) - return csv - - -@pytest.fixture(scope='function') -def mcc(tmpdir_factory): - manifest_file = tmpdir_factory.mktemp("mcc").join('manifest.json') - return MouseConnectivityCache(manifest_file=str(manifest_file)) - - -@pytest.fixture(scope='function') -def new_nodes(): - - return [{'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'structure_sets':[{'id': 1}, {'id': 4}, {'id': 167587189}] }] - - -@pytest.fixture(scope='function') -def old_nodes(): - - return [{'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'parent_structure_id': 12}] - -@pytest.fixture(scope='function') -def experiments(): - return [{'data_set_id': 1, 'name': 'foo', 'storage_directory': 'meep', 'transgenic_line': { 'name': 'most_creish' }, - 'injection_structures': '234/324', 'structure_id': 97}, - {'data_set_id': 2, 'name': 'bar', 'storage_directory': 'meep', 'transgenic_line': None, - 'injection_structures': '234/324/234', 'structure_id': 21}] - - -@pytest.fixture(scope='function') -def unionizes(): - - # note that I've mucked around with these values a bit - return [{"hemisphere_id": 1, "id": 169991412, "is_injection": False, - "max_voxel_density": 0.284863, "max_voxel_x": 7700, - "max_voxel_y": 6500, "max_voxel_z": 5000, - "normalized_projection_volume": 0.0, - "projection_density": 0.116754, "projection_energy": 30.7332, - "projection_intensity": 263.231, "projection_volume": 0.0018718, - "section_data_set_id": 166218353, "structure_id": 1, - "sum_pixel_intensity": 99234900.0, "sum_pixels": 1308740.0, - "sum_projection_pixel_intensity": 40221700.0, - "sum_projection_pixels": 152800.0, - "volume": 0.016032}, - {"hemisphere_id": 2, "id": 169991601, "is_injection": False, - "max_voxel_density": 0.0614783, "max_voxel_x": 7500, - "max_voxel_y": 4900, "max_voxel_z": 1700, - "normalized_projection_volume": 0.0, - "projection_density": 0.0168009, - "projection_energy": 1.96084, "projection_intensity": 116.71, - "projection_volume": 0.00148144, - "section_data_set_id": 166218353, "structure_id": 60, - "sum_pixel_intensity": 261941000.0, "sum_pixels": 7198050.0, - "sum_projection_pixel_intensity": 14114200.0, - "sum_projection_pixels": 120934.0, "volume": 0.0881761}] - - -@pytest.fixture(scope='function') -def top_injection_unionizes(): - return pd.DataFrame([{'experiment_id': 1, 'is_injection': True, 'hemisphere_id': 1, 'structure_id': 10, 'normalized_projection_volume': 0.75}, - {'experiment_id': 1, 'is_injection': True, 'hemisphere_id': 2, 'structure_id': 15, 'normalized_projection_volume': 0.25}, - {'experiment_id': 1, 'is_injection': False, 'hemisphere_id': 1, 'structure_id': 10, 'normalized_projection_volume': 2.0}, - {'experiment_id': 1, 'is_injection': False, 'hemisphere_id': 2, 'structure_id': 11, 'normalized_projection_volume': 0.001}]) - - -def test_init(mcc): - assert( os.path.exists(mcc.manifest_path) ) - - -def test_get_annotation_volume(mcc): - - eye = np.eye(100) - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'annotation', 'ccf_2017', - 'annotation_25.nrrd') - - with mock.patch.object(mcc.api, "retrieve_file_over_http", - new=lambda a, b: nrrd.write(b, eye)): - obtained, _ = mcc.get_annotation_volume() - - with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: - mcc.get_annotation_volume() - - mock_rtrv.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_template_volume(mcc): - eye = np.eye(100) - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'average_template_25.nrrd') - - with mock.patch.object(mcc.api, "retrieve_file_over_http", - new=lambda a, b: nrrd.write(b, eye)): - obtained, _ = mcc.get_template_volume() - - with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: - mcc.get_template_volume() - - mock_rtrv.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_projection_density(mcc): - - eye = np.eye(100) - eid = 123456789 - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'experiment_{0}'.format(eid), - 'projection_density_25.nrrd') - - with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' - 'retrieve_file_over_http', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_projection_density(eid) - - with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: - mcc.get_projection_density(eid) - - mock_rtrv.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_injection_density(mcc): - - eye = np.eye(100) - eid = 123456789 - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'experiment_{0}'.format(eid), - 'injection_density_25.nrrd') - - with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' - 'retrieve_file_over_http', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_injection_density(eid) - - with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: - mcc.get_injection_density(eid) - - mock_rtrv.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_injection_fraction(mcc): - - eye = np.eye(100) - eid = 123456789 - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'experiment_{0}'.format(eid), - 'injection_fraction_25.nrrd') - - with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' - 'retrieve_file_over_http', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_injection_fraction(eid) - - with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: - mcc.get_injection_fraction(eid) - - mock_rtrv.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_data_mask(mcc): - - eye = np.eye(100) - eid = 123456789 - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'experiment_{0}'.format(eid), - 'data_mask_25.nrrd') - - with mock.patch('allensdk.api.queries.grid_data_api.GridDataApi.' - 'retrieve_file_over_http', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_data_mask(eid) - - with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: - mcc.get_data_mask(eid) - - mock_rtrv.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_structure_tree(mcc, new_nodes): - - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'structures.json') - - with mock.patch('allensdk.api.queries.ontologies_api.' - 'OntologiesApi.model_query', - return_value=new_nodes) as p: - - obtained = mcc.get_structure_tree() - - mcc.get_structure_tree() - p.assert_called_once() - - assert( obtained.node_ids()[0] == 0 ) - - cm_obt = obtained.get_colormap() - assert(len(cm_obt[0]) == 3) - - assert( os.path.exists(path) ) - - -def test_get_experiments(mcc, experiments): - - file_path = os.path.join(os.path.dirname(mcc.manifest_path), 'experiments.json') - - def new_fn(*args, **kwargs): return experiments - - with mock.patch.object(mcc.api, "model_query", - new=new_fn): - obtained = mcc.get_experiments() - - with mock.patch.object(mcc.api, "model_query") as mock_squery: - mcc.get_experiments() - - mock_squery.assert_not_called() - assert os.path.exists(file_path) - assert 'storage_directory' not in obtained[0] - assert obtained[0]['transgenic_line'] == 'most_creish' - - obtained = mcc.get_experiments(cre=['MOST_CREISH']) - assert len(obtained) == 1 - - -def test_filter_experiments(mcc, experiments): - - pass_line = mcc.filter_experiments(experiments, cre=True) - fail_line = mcc.filter_experiments(experiments, cre=False) - - assert len(pass_line) == 1 - assert len(fail_line) == 1 - - def fake_tree(*a, **k): - class FakeTree(object): - def descendant_ids(*a, **k): - return [[97, 98], []] - return FakeTree() - - with mock.patch.object(mcc, 'get_structure_tree', new=fake_tree) as p: - sid_line = mcc.filter_experiments(experiments, cre=True, injection_structure_ids=[97, 98]) - - assert len(sid_line) == 1 - -def test_rank_structures(mcc, top_injection_unionizes): - - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'experiment_{0}'.format(1), - 'structure_unionizes.csv') - - with mock.patch.object(mcc.api, "model_query", - lambda *args, **kwargs: top_injection_unionizes): - obt = mcc.rank_structures([1], True, [15], [1, 2]) - - assert(len(obt) == 1) - exp = obt[0] - assert(len(exp) == 1) - st = exp[0] - assert(st['structure_id'] == 15) - assert(st['normalized_projection_volume'] == 0.25) - - -def test_default_structure_ids(mcc, new_nodes): - - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'structures.json') - - with mock.patch('allensdk.api.queries.ontologies_api.' - 'OntologiesApi.model_query', - return_value=new_nodes) as p: - - default_structure_ids = mcc.default_structure_ids - assert(len(default_structure_ids) == 1) - assert(default_structure_ids[0] == 0) - - -def test_get_experiment_structure_unionizes(mcc, unionizes): - - eid = 166218353 - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'experiment_{0}'.format(eid), - 'structure_unionizes.csv') - - with mock.patch.object(mcc.api, "model_query", - new=lambda *args, **kwargs: unionizes): - obtained = mcc.get_experiment_structure_unionizes(eid) - - with mock.patch.object(mcc.api, "model_query") as mock_query: - mcc.get_experiment_structure_unionizes(eid) - - mock_query.assert_not_called() - assert obtained.loc[0, 'projection_intensity'] == 263.231 - assert os.path.exists(path) - - -def test_get_experiment_structure_unionizes_cache_roundtrip(mcc, unionizes, - cached_csv): - - eid = 166218353 - - with mock.patch.object(mcc.api, "model_query", - new=lambda *args, **kwargs: unionizes): - obtained = mcc.get_experiment_structure_unionizes( - eid, file_name=cached_csv) - pandas_data = pd.read_csv(cached_csv, index_col=0, parse_dates=True) - - assert obtained.loc[0, 'projection_intensity'] == 263.231 - assert(sorted(obtained.keys()) == sorted(pandas_data.columns)) - - -def test_filter_structure_unionizes(mcc, unionizes): - - obtained = mcc.filter_structure_unionizes(pd.DataFrame(unionizes), - hemisphere_ids=[1]) - - assert obtained.loc[0, 'volume'] == 0.016032 - - obt_sid = mcc.filter_structure_unionizes(pd.DataFrame(unionizes), - hemisphere_ids=[1], - structure_ids=[1,60,90]) - - assert obtained.loc[0, 'volume'] == 0.016032 - -def test_get_structure_unionizes(mcc, unionizes): - - with mock.patch.object(mcc, "get_experiment_structure_unionizes", - new=lambda *a, **k: pd.DataFrame(unionizes)): - obtained = mcc.get_structure_unionizes([1, 2, 3]) - - assert obtained.shape[0] == 6 - - -def test_get_projection_matrix(mcc): - # yup - - unionizes = [{'experiment_id': 1, - 'structure_id': 2, - 'hemisphere_id': 1, - 'value': 30}, - {'experiment_id': 1, - 'structure_id': 2, - 'hemisphere_id': 2, - 'value': 40},] - - with mock.patch.object(mcc, "get_structure_unionizes", - new=lambda *a, **k: pd.DataFrame(unionizes)): - class FakeTree(object): - def value_map(*a, **k): - return {1: 'one', 2: 'two'} - with mock.patch.object(mcc, "get_structure_tree", - new=lambda *a, **k: FakeTree()): - obtained = mcc.get_projection_matrix([1], [2], [1, 2], ['value']) - - assert np.allclose(obtained['matrix'], np.array([[30, 40]])) - assert np.array_equal([ii['label'] for ii in obtained['columns']], - ['two-L', 'two-R']) - - -def test_get_reference_space(mcc, new_nodes): - - tree = StructureTree(StructureTree.clean_structures(new_nodes)) - with mock.patch.object(mcc, "get_structure_tree", - new=lambda *a, **k: tree): - annot = np.arange(125).reshape((5, 5, 5)) - with mock.patch.object(mcc, "get_annotation_volume", - new=lambda *a, **k: (annot, 'foo')): - rsp_obt = mcc.get_reference_space() - - assert( np.allclose(rsp_obt.resolution, [25, 25, 25]) ) - assert( np.allclose( rsp_obt.annotation, annot ) ) - - -def test_get_structure_mask(mcc): - - sid = 12 - - eye = np.eye(100) - path = os.path.join(os.path.dirname(mcc.manifest_path), - 'annotation', 'ccf_2017', 'structure_masks', - 'resolution_25', 'structure_{0}.nrrd'.format(sid)) - - with mock.patch.object(mcc.api, "retrieve_file_over_http", - new=lambda a, b: nrrd.write(b, eye)): - obtained, _ = mcc.get_structure_mask(sid) - - with mock.patch.object(mcc.api, "retrieve_file_over_http") as mock_rtrv: - mcc.get_structure_mask(sid) - - mock_rtrv.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -@pytest.mark.parametrize('inp,fails', [(1, False), - (pd.Series([2]), False), - ('qwerty', True)]) -def test_validate_structure_id(inp, fails): - - if fails: - with pytest.raises(ValueError) as exc: - MouseConnectivityCache.validate_structure_id(inp) - else: - out = MouseConnectivityCache.validate_structure_id(inp) - assert( out == int(inp) ) - - -@pytest.mark.parametrize('inp,fails', [([1, 2, 3], False), - ([pd.Series([2]), pd.Series([3])], False), - (['qwerty', 1], True)]) -def test_validate_structure_ids(inp, fails): - - if fails: - with pytest.raises(ValueError) as exc: - MouseConnectivityCache.validate_structure_ids(inp) - else: - out = MouseConnectivityCache.validate_structure_ids(inp) - assert( out == [ int(i) for i in inp ] ) - - -def test_get_deformation_field(mcc): - - arr = np.random.rand(2, 4, 5, 3) - - def write_dfmfld(*a, **k): - img = sitk.GetImageFromArray(arr) - sitk.WriteImage(img, str(k['header_path']), True) # TODO the str call here is only necessary in 2.7 - - with mock.patch.object(mcc.api, 'download_deformation_field', new=write_dfmfld) as p: - obtained = mcc.get_deformation_field(123) - - assert np.allclose(arr, obtained) - - -def test_get_affine_parameters(mcc): - - def new_fn(*args, **kwargs): - return [{'alignment3d': { - 'trv_00': 1, - 'trv_01': 2, - 'trv_02': 3, - 'trv_03': 4, - 'trv_04': 5, - 'trv_05': 6, - 'trv_06': 7, - 'trv_07': 8, - 'trv_08': 9, - 'trv_09': 10, - 'trv_10': 11, - 'trv_11': 12, - }}] - - expected = np.array([ - [1, 2, 3], - [4, 5, 6], - [7, 8, 9], - [10, 11, 12] - ]) - - with mock.patch.object(mcc.api, "model_query", new=new_fn): - obtained = mcc.get_affine_parameters(1245) - - assert np.allclose(expected, obtained) \ No newline at end of file diff --git a/allensdk/test/core/test_mouse_connectivity_notebook.py b/allensdk/test/core/test_mouse_connectivity_notebook.py deleted file mode 100644 index a30dc05564..0000000000 --- a/allensdk/test/core/test_mouse_connectivity_notebook.py +++ /dev/null @@ -1,307 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest - -import os - - -@pytest.mark.nightly -def test_notebook(tmpdir_factory): - - # coding: utf-8 - - # ## Mouse Connectivity - # - # This notebook demonstrates how to access and manipulate data in the Allen Mouse Brain Connectivity Atlas. The `MouseConnectivityCache` AllenSDK class provides methods for downloading metadata about experiments, including their viral injection site and the mouse's transgenic line. You can request information either as a Pandas DataFrame or a simple list of dictionaries. - # - # An important feature of the `MouseConnectivityCache` is how it stores and retrieves data for you. By default, it will create (or read) a manifest file that keeps track of where various connectivity atlas data are stored. If you request something that has not already been downloaded, it will download it and store it in a well known location. - # - # Download this notebook in .ipynb format <a href='mouse_connectivity.ipynb'>here</a>. - - # In[1]: - - from allensdk.core.mouse_connectivity_cache import MouseConnectivityCache - - # The manifest file is a simple JSON file that keeps track of all of - # the data that has already been downloaded onto the hard drives. - # If you supply a relative path, it is assumed to be relative to your - # current working directory. - manifest_file = tmpdir_factory.mktemp('mcc').join('manifest.json') - mcc = MouseConnectivityCache(manifest_file=str(manifest_file)) - - # open up a list of all of the experiments - all_experiments = mcc.get_experiments(dataframe=True) - print("%d total experiments" % len(all_experiments)) - - # take a look at what we know about an experiment with a primary motor injection - all_experiments.loc[122642490] - - - # `MouseConnectivityCache` has a method for retrieving the adult mouse structure tree as an `StructureTree` class instance. This is a wrapper around a list of dictionaries, where each dictionary describes a structure. It is principally useful for looking up structures by their properties. - - # In[2]: - - # pandas for nice tables - import pandas as pd - - # grab the StructureTree instance - structure_tree = mcc.get_structure_tree() - - # get info on some structures - structures = structure_tree.get_structures_by_name(['Primary visual area', 'Hypothalamus']) - pd.DataFrame(structures) - - - # As a convenience, structures are grouped in to named collections called "structure sets". These sets can be used to quickly gather a useful subset of structures from the tree. The criteria used to define structure sets are eclectic; a structure set might list: - # - # * structures that were used in a particular project. - # * structures that coarsely partition the brain. - # * structures that bear functional similarity. - # - # or something else entirely. To view all of the available structure sets along with their descriptions, follow this [link](http://api.brain-map.org/api/v2/data/StructureSet/query.json). To see only structure sets relevant to the adult mouse brain, use the StructureTree: - - # In[3]: - - from allensdk.api.queries.ontologies_api import OntologiesApi - - oapi = OntologiesApi() - - # get the ids of all the structure sets in the tree - structure_set_ids = structure_tree.get_structure_sets() - - # query the API for information on those structure sets - pd.DataFrame(oapi.get_structure_sets(structure_set_ids)) - - - # On the connectivity atlas web site, you'll see that we show most of our data at a fairly coarse structure level. We did this by creating a structure set of ~300 structures, which we call the "summary structures". We can use the structure tree to get all of the structures in this set: - - # In[4]: - - # From the above table, "Mouse Connectivity - Summary" has id 167587189 - summary_structures = structure_tree.get_structures_by_set_id([167587189]) - pd.DataFrame(summary_structures) - - - # This is how you can filter experiments by transgenic line: - - # In[5]: - - # fetch the experiments that have injections in the isocortex of cre-positive mice - isocortex = structure_tree.get_structures_by_name(['Isocortex'])[0] - cre_cortical_experiments = mcc.get_experiments(cre=True, - injection_structure_ids=[isocortex['id']]) - - print("%d cre cortical experiments" % len(cre_cortical_experiments)) - - # same as before, but restrict the cre line - rbp4_cortical_experiments = mcc.get_experiments(cre=[ 'Rbp4-Cre_KL100' ], - injection_structure_ids=[isocortex['id']]) - - - print("%d Rbp4 cortical experiments" % len(rbp4_cortical_experiments)) - - - # ## Structure Signal Unionization - # - # The ProjectionStructureUnionizes API data tells you how much signal there was in a given structure and experiment. It contains the density of projecting signal, volume of projecting signal, and other information. `MouseConnectivityCache` provides methods for querying and storing this data. - - # In[6]: - - # find wild-type injections into primary visual area - visp = structure_tree.get_structures_by_acronym(['VISp'])[0] - visp_experiments = mcc.get_experiments(cre=False, - injection_structure_ids=[visp['id']]) - - print("%d VISp experiments" % len(visp_experiments)) - - structure_unionizes = mcc.get_structure_unionizes([ e['id'] for e in visp_experiments ], - is_injection=False, - structure_ids=[isocortex['id']], - include_descendants=True) - - print("%d VISp non-injection, cortical structure unionizes" % len(structure_unionizes)) - - - # In[7]: - - structure_unionizes.head() - - - # This is a rather large table, even for a relatively small number of experiments. You can filter it down to a smaller list of structures like this. - - # In[8]: - - dense_unionizes = structure_unionizes[ structure_unionizes.projection_density > .5 ] - large_unionizes = dense_unionizes[ dense_unionizes.volume > .5 ] - large_structures = pd.DataFrame(structure_tree.nodes(large_unionizes.structure_id)) - - print("%d large, dense, cortical, non-injection unionizes, %d structures" % ( len(large_unionizes), len(large_structures) )) - - print(large_structures.name) - - large_unionizes - - - # ## Generating a Projection Matrix - # The `MouseConnectivityCache` class provides a helper method for converting ProjectionStructureUnionize records for a set of experiments and structures into a matrix. This code snippet demonstrates how to make a matrix of projection density values in auditory sub-structures for cre-negative VISp experiments. - - # In[9]: - - import numpy as np - import matplotlib.pyplot as plt - import warnings - warnings.filterwarnings('ignore') - - visp_experiment_ids = [ e['id'] for e in visp_experiments ] - ctx_children = structure_tree.child_ids( [isocortex['id']] )[0] - - pm = mcc.get_projection_matrix(experiment_ids = visp_experiment_ids, - projection_structure_ids = ctx_children, - hemisphere_ids= [2], # right hemisphere, ipsilateral - parameter = 'projection_density') - - row_labels = pm['rows'] # these are just experiment ids - column_labels = [ c['label'] for c in pm['columns'] ] - matrix = pm['matrix'] - - fig, ax = plt.subplots(figsize=(15,15)) - heatmap = ax.pcolor(matrix, cmap=plt.cm.afmhot) - - # put the major ticks at the middle of each cell - ax.set_xticks(np.arange(matrix.shape[1])+0.5, minor=False) - ax.set_yticks(np.arange(matrix.shape[0])+0.5, minor=False) - - ax.set_xlim([0, matrix.shape[1]]) - ax.set_ylim([0, matrix.shape[0]]) - - # want a more natural, table-like display - ax.invert_yaxis() - ax.xaxis.tick_top() - - ax.set_xticklabels(column_labels, minor=False) - ax.set_yticklabels(row_labels, minor=False) - - # ## Manipulating Grid Data - # - # The `MouseConnectivityCache` class also helps you download and open every experiment's projection grid data volume. By default it will download 25um volumes, but you could also download data at other resolutions if you prefer (10um, 50um, 100um). - # - # This demonstrates how you can load the projection density for a particular experiment. It also shows how to download the template volume to which all grid data is registered. Voxels in that template have been structurally annotated by neuroanatomists and the resulting labels stored in a separate annotation volume image. - - # In[10]: - - # we'll take this experiment - an injection into the primary somatosensory - as an example - experiment_id = 181599674 - - - # In[11]: - - # projection density: number of projecting pixels / voxel volume - pd, pd_info = mcc.get_projection_density(experiment_id) - - # injection density: number of projecting pixels in injection site / voxel volume - ind, ind_info = mcc.get_injection_density(experiment_id) - - # injection fraction: number of pixels in injection site / voxel volume - inf, inf_info = mcc.get_injection_fraction(experiment_id) - - # data mask: - # binary mask indicating which voxels contain valid data - dm, dm_info = mcc.get_data_mask(experiment_id) - - template, template_info = mcc.get_template_volume() - annot, annot_info = mcc.get_annotation_volume() - - # in addition to the annotation volume, you can get binary masks for individual structures - # in this case, we'll get one for the isocortex - cortex_mask, cm_info = mcc.get_structure_mask(315) - - print(pd_info) - print(pd.shape, template.shape, annot.shape) - - - # Once you have these loaded, you can use matplotlib see what they look like. - - # In[12]: - - # compute the maximum intensity projection (along the anterior-posterior axis) of the projection data - pd_mip = pd.max(axis=0) - ind_mip = ind.max(axis=0) - inf_mip = inf.max(axis=0) - - # show that slice of all volumes side-by-side - f, pr_axes = plt.subplots(1, 3, figsize=(15, 6)) - - pr_axes[0].imshow(pd_mip, cmap='hot', aspect='equal') - pr_axes[0].set_title("projection density MaxIP") - - pr_axes[1].imshow(ind_mip, cmap='hot', aspect='equal') - pr_axes[1].set_title("injection density MaxIP") - - pr_axes[2].imshow(inf_mip, cmap='hot', aspect='equal') - pr_axes[2].set_title("injection fraction MaxIP") - - - # In[13]: - - # Look at a slice from the average template and annotation volumes - - # pick a slice to show - slice_idx = 264 - - f, ccf_axes = plt.subplots(1, 3, figsize=(15, 6)) - - ccf_axes[0].imshow(template[slice_idx,:,:], cmap='gray', aspect='equal', vmin=template.min(), vmax=template.max()) - ccf_axes[0].set_title("registration template") - - ccf_axes[1].imshow(annot[slice_idx,:,:], cmap='gray', aspect='equal', vmin=0, vmax=2000) - ccf_axes[1].set_title("annotation volume") - - ccf_axes[2].imshow(cortex_mask[slice_idx,:,:], cmap='gray', aspect='equal', vmin=0, vmax=1) - ccf_axes[2].set_title("isocortex mask") - - - # On occasion the TissueCyte microscope fails to acquire a tile. In this case the data from that tile should not be used for analysis. The data mask associated with each experiment can be used to determine which portions of the grid data came from correctly acquired tiles. - # - # In this experiment, a missed tile can be seen in the data mask as a dark warped square. The values in the mask exist within [0, 1], describing the fraction of each voxel that was correctly acquired - - # In[14]: - - f, data_mask_axis = plt.subplots(figsize=(5, 6)) - - data_mask_axis.imshow(dm[81, :, :], cmap='hot', aspect='equal', vmin=0, vmax=1) - data_mask_axis.set_title('data mask') - - diff --git a/allensdk/test/core/test_nwb_data_set.py b/allensdk/test/core/test_nwb_data_set.py deleted file mode 100644 index 2804ca1f29..0000000000 --- a/allensdk/test/core/test_nwb_data_set.py +++ /dev/null @@ -1,233 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -from mock import patch, MagicMock -from pkg_resources import resource_filename # @UnresolvedImport -import numpy as np -from allensdk.core.nwb_data_set import NwbDataSet -import pytest -import os - -NWB_FLAVORS = [] - -if 'TEST_EPHYS_NWB_FILES' in os.environ: - nwb_list_file = os.environ['TEST_EPHYS_NWB_FILES'] -else: - nwb_list_file = resource_filename(__name__, 'nwb_ephys_files.txt') -with open(nwb_list_file, 'r') as f: - NWB_FLAVORS = [l.strip() for l in f] - - -@pytest.fixture(params=NWB_FLAVORS) -def data_set(request): - nwb_file = request.param - data_set = NwbDataSet(nwb_file) - return data_set - -@pytest.mark.nightly -def test_get_sweep_numbers(data_set): - sweep_numbers = data_set.get_sweep_numbers() - - assert len(sweep_numbers) > 0 - - -@pytest.mark.nightly -def test_get_experiment_sweep_numbers(data_set): - sweep_numbers = data_set.get_experiment_sweep_numbers() - - assert len(sweep_numbers) > 0 - - -@pytest.mark.nightly -def test_get_spike_times(data_set): - sweep_numbers = data_set.get_experiment_sweep_numbers() - - found_spikes = False - - for n in sweep_numbers: - spike_times = data_set.get_spike_times(n) - if len(spike_times > 0): - found_spikes = True - - assert found_spikes is True - -def mock_h5py_file(m=None, data=None): - if m is None: - m = MagicMock() - - f = MagicMock() - - if data is None: - f.__enter__.return_value = f - else: - f.__enter__.return_value = data - - m.return_value = f - - return m - - -@pytest.fixture -def mock_data_set(): - nwb_file = 'fixture.nwb' - data_set = NwbDataSet(nwb_file) - return data_set - - -def test_fill_sweep_responses_extend(mock_data_set): - data_set = mock_data_set - DATA_LENGTH = 5 - - class H5Scalar(object): - def __init__(self, i): - self.i = i - self.value = i - def __eq__(self, j): - return j == self.i - - h5 = { - 'epochs': { - 'Sweep_1': { - 'response': { - 'timeseries': { - 'data': np.ones(DATA_LENGTH) - } - } - }, - 'Experiment_1': { - 'stimulus': { - 'idx_start': H5Scalar(1), - 'count': H5Scalar(3), # truncation is here - 'timeseries': { - 'data': np.ones(DATA_LENGTH) - } - } - } - } - } - - with patch('h5py.File', mock_h5py_file(data=h5)): - data_set.fill_sweep_responses(0.0, [1], extend_experiment=True) - - assert h5['epochs']['Experiment_1']['stimulus']['count'] == 4 - assert h5['epochs']['Experiment_1']['stimulus']['idx_start'] == 1 - assert np.all(h5['epochs']['Sweep_1']['response']['timeseries']['data']== 0.0) - -def test_fill_sweep_responses(mock_data_set): - data_set = mock_data_set - DATA_LENGTH = 5 - - h5 = { - 'stimulus': { - 'presentation': { - 'Sweep_1': { - 'aibs_stimulus_amplitude_pa': 15.0, - 'aibs_stimulus_name': 'Joe', - 'gain': 1.0, - 'initial_access_resistance': 0.05, - 'seal': True - } - } - }, - 'epochs': { - 'Sweep_1': { - 'description': 'sweep 1 description', - 'stimulus': {}, - 'response': { - 'count': DATA_LENGTH, - 'idx_start': 0, - 'timeseries': { - 'data': np.ones(DATA_LENGTH) * 1.0 - } - } - } - } - } - - with patch('h5py.File', mock_h5py_file(data=h5)): - data_set.fill_sweep_responses(0.0, [1]) - - assert not np.any(h5['epochs']['Sweep_1']['response']['timeseries']['data']) - assert len(h5['epochs']['Sweep_1']['response']['timeseries']['data']) == \ - DATA_LENGTH - - -@pytest.mark.xfail -def test_set_spike_times(mock_data_set): - data_set = mock_data_set - DATA_LENGTH = 5 - - h5 = { - 'analysis': { - 'spike_times': { - 'Sweep_1': {} - } - }, - 'stimulus': { - 'presentation': { - 'Sweep_1': { - 'aibs_stimulus_amplitude_pa': 15.0, - 'aibs_stimulus_name': 'Joe', - 'gain': 1.0, - 'initial_access_resistance': 0.05, - 'seal': True - } - } - }, - 'epochs': { - 'Sweep_1': { - 'description': 'sweep 1 description', - 'stimulus': {}, - 'response': { - 'count': DATA_LENGTH, - 'idx_start': 0, - 'timeseries': { - 'data': np.ones(DATA_LENGTH) * 1.0 - } - } - } - } - } - - with patch('h5py.File', mock_h5py_file(data=h5)): - data_set.set_spike_times(1, [0.1, 0.2, 0.3, 0.4, 0.5]) - - assert False - -@pytest.mark.nightly -def test_get_sweep_metadata(data_set): - sweep_metadata = data_set.get_sweep_metadata(1) - - assert sweep_metadata is not None diff --git a/allensdk/test/core/test_obj_utilities.py b/allensdk/test/core/test_obj_utilities.py deleted file mode 100644 index 31f239754f..0000000000 --- a/allensdk/test/core/test_obj_utilities.py +++ /dev/null @@ -1,94 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import numpy as np - -import pytest -from mock import MagicMock, mock_open, patch - -from allensdk.core.obj_utilities import read_obj, parse_obj - - -@pytest.fixture -def wavefront_obj(): - return ''' - -v 8578 5484.96 5227.57 -v 8509.2 5487.54 5237.07 -v 8564.38 5522.13 5220.41 -v 8631.93 5497.82 5228.33 -v 8517.88 5542.95 5234.53 -v 8615.26 5563.22 5224.48 - -# i'm a comment! - -vn -0.0247061 -0.352726 -0.935401 -vn -0.235489 -0.190095 -0.953105 -vn -0.0880336 -0.0323767 -0.995591 -vn 0.122706 -0.209891 -0.969994 -vn -0.343738 0.217978 -0.913416 -vn 0.0753706 0.16324 -0.983703 - -I should be a comment, but am not - -f 1//1 2//2 3//3 -f 4//4 1//1 3//3 -f 3//3 2//2 5//5 -f 6//6 3//3 5//5 - - ''' - - -def test_read_obj(wavefront_obj): - - path = 'path!' - - # need to patch the version in allensdk.api.cache because of import x from y syntax above - with patch( 'allensdk.core.obj_utilities.open', mock_open(read_data=wavefront_obj), create=True ) as p: - obt = read_obj(path) - p.assert_called_with(path, 'r') - assert( obt is not None ) - - -def test_parse_obj(wavefront_obj): - - lines = wavefront_obj.split('\n') - vertices, vertex_normals, face_vertices, face_normals = parse_obj(lines) - - assert(np.allclose( face_vertices, face_normals )) - assert(np.allclose( face_vertices[2, :], [2, 1, 4] )) - assert(np.allclose( vertices[1, :], [8509.2, 5487.54, 5237.07] )) - assert(np.allclose( vertex_normals[2, :], [-0.0880336, -0.0323767, -0.995591] )) diff --git a/allensdk/test/core/test_reference_space.py b/allensdk/test/core/test_reference_space.py deleted file mode 100644 index 22667fb714..0000000000 --- a/allensdk/test/core/test_reference_space.py +++ /dev/null @@ -1,232 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os - -import pytest -import mock -import numpy as np -import nrrd -import pandas as pd - -from allensdk.core.reference_space import ReferenceSpace -from allensdk.core.structure_tree import StructureTree - - -@pytest.fixture -def rsp(): - - tree = [{'id': 1, 'structure_id_path': [1]}, - {'id': 2, 'structure_id_path': [1, 2]}, - {'id': 3, 'structure_id_path': [1, 3]}, - {'id': 4, 'structure_id_path': [1, 2, 4]}, - {'id': 5, 'structure_id_path': [1, 2, 5]}, - {'id': 6, 'structure_id_path': [1, 2, 5, 6]}, - {'id': 7, 'structure_id_path': [1, 7]}] - - # leaves are 6, 4, 3 - # additionally annotate 2, 5 for realism :) - annotation = np.zeros((10, 10, 10)) - annotation[4:8, 4:8, 4:8] = 2 - annotation[5:7, 5:7, 5:7] = 5 - annotation[5:7, 5:7, 5] = 6 - annotation[7, 7, 7] = 4 - annotation[8:10, 8:10, 8:10] = 3 - - return ReferenceSpace(StructureTree(tree), annotation, [10, 10, 10]) - - -@pytest.fixture -def itksnap_rsp(): - tree = [ - {'id': 1, 'rgb_triplet': [1, 2, 3], 'acronym': 'b', 'structure_id_path': [1]}, - {'id': 5000, 'rgb_triplet': [4, 5, 6], 'acronym': 'a', 'structure_id_path': [1, 5000]}, - ] - - annotation = np.zeros((10, 10, 10)) - annotation[:, :, :5] = 1 - annotation[:, :, 7:] = 5000 - - return ReferenceSpace(StructureTree(tree), annotation, [10, 10, 10]) - - -def test_direct_voxel_counts(rsp): - obt_one = rsp.direct_voxel_map - obt_two = rsp.direct_voxel_map - - assert( obt_one[3] == 8 ) - assert( obt_one[2] == 4**3 - 2**3 - 1 ) - assert( obt_two[1] == 0 ) - assert( obt_two[2] == 4**3 - 2**3 - 1 ) - - -def test_total_voxel_counts(rsp): - - obt = rsp.total_voxel_map - - assert( obt[2] == 4**3 ) - assert( obt[6] == 4 ) - - -def test_remove_unassigned(rsp): - - rsp.remove_unassigned() - node_ids = rsp.structure_tree.node_ids() - - assert( 1 in node_ids ) - assert( 7 not in node_ids ) - - -def test_make_structure_mask(rsp): - - exp = np.zeros((10, 10, 10)) - exp[4:8, 4:8, 4:8] = 1 - exp[8:10, 8:10, 8:10] = 1 - obt = rsp.make_structure_mask([2, 3, 7]) - - assert( np.allclose(obt, exp) ) - - -def test_make_structure_mask_direct(rsp): - - exp = np.zeros((10, 10, 10)) - exp[5:7, 5:7, 6:7] = 1 - obt = rsp.make_structure_mask([5], True) - - assert( np.allclose(obt, exp) ) - - -def test_many_structure_masks(rsp): - - cb = mock.MagicMock() - - [ii for ii in rsp.many_structure_masks([2, 3], output_cb=cb)] - - assert( cb.call_count == 2 ) - - -def test_many_structure_masks_default_cb(rsp): - - rsp.make_structure_mask = mock.MagicMock(return_value=2) - for item in rsp.many_structure_masks([1]): - assert( np.allclose(item, [1, 2]) ) - - -def test_check_coverage(rsp): - - mask = np.zeros((10, 10, 10)) - mask[7:10, 7:10, 7:10] = 1 - - obt = rsp.check_coverage([3], mask) - assert( np.count_nonzero(obt) == 27 - 8 ) - - -def test_validate_structures(rsp): - - rsp.structure_tree.has_overlaps = mock.MagicMock() - rsp.check_coverage = mock.MagicMock() - - rsp.validate_structures(1, 2) - - rsp.structure_tree.has_overlaps.assert_called_with(1) - rsp.check_coverage.assert_called_with(1, 2) - - -def test_downsample(rsp): - - target = rsp.downsample((10, 20, 20)) - - assert( np.allclose(target.annotation.shape, [10, 5, 5]) ) - - -def test_get_slice_image(rsp): - - cmap = {0: [0, 0, 0], 1: [0, 0, 0], 2: [0, 0, 0], 3: [1, 2, 3], - 4: [0, 0, 0], 5: [0, 0, 0], 6: [0, 0, 0], 7: [0, 0, 0], } - - image = rsp.get_slice_image(0, 90, cmap=cmap) - - assert( image[:, :, 0].sum() == 4 ) - - -def test_direct_voxel_map_setter(rsp): - - rsp.direct_voxel_map = 4 - assert( rsp.direct_voxel_map == 4 ) - - -def test_total_voxel_map_setter(rsp): - - rsp.total_voxel_map = 3 - assert( rsp.total_voxel_map == 3 ) - - -def test_export_itksnap_labels(itksnap_rsp): - - annot, labels = itksnap_rsp.export_itksnap_labels(id_type=np.uint8) - - exp = np.zeros((10, 10, 10)) - exp[:, :, :5] = 2 - exp[:, :, 7:] = 1 - - assert set(np.unique(annot)) == set([0, 1, 2]) - assert np.array_equal(labels['LABEL'][:], ['a', 'b']) - assert set(labels['IDX'].values) == set([1, 2]) - assert np.allclose(exp, annot) - - -def test_write_itksnap_labels(itksnap_rsp, tmpdir_factory): - - tmpdir = str(tmpdir_factory.mktemp('test_write_itksnap_labels')) - annot_path = os.path.join(tmpdir, 'annot.nrrd') - labels_path = os.path.join(tmpdir, 'labels.csv') - - itksnap_rsp.write_itksnap_labels(annot_path, labels_path, id_type=np.uint8) - exp_annot, exp_labels = itksnap_rsp.export_itksnap_labels(id_type=np.uint8) - - obt_annot, _ = nrrd.read(annot_path) - assert np.allclose(obt_annot, exp_annot) - - obt_labels = pd.read_csv( - labels_path, - delim_whitespace=True, - names=['IDX', '-R-', '-G-', '-B-', '-A-', 'VIS', 'MSH', 'LABEL'], - index_col=False - ) - pd.testing.assert_frame_equal(obt_labels, exp_labels, check_index_type=False) - - assert os.path.exists(labels_path) - assert os.path.exists(annot_path) - diff --git a/allensdk/test/core/test_reference_space_cache.py b/allensdk/test/core/test_reference_space_cache.py deleted file mode 100644 index 742c043126..0000000000 --- a/allensdk/test/core/test_reference_space_cache.py +++ /dev/null @@ -1,222 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2016-2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os - -import pytest -import mock -import numpy as np -import nrrd -import pandas as pd - -from allensdk.core.reference_space_cache import ReferenceSpaceCache -from allensdk.core.structure_tree import StructureTree - - -@pytest.fixture() -def rsp_version(): - return 'annotation/look_a_version' - - -@pytest.fixture() -def resolution(): - return 25 - - -@pytest.fixture(scope='function') -def old_nodes(): - - return [{'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'parent_structure_id': 12}] - - -@pytest.fixture(scope='function') -def new_nodes(): - - return [{'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'structure_sets':[{'id': 1}, {'id': 4}, {'id': 167587189}] }] - - -@pytest.fixture(scope='function') -def rsp(fn_temp_dir, rsp_version, resolution): - - manifest_path = os.path.join(fn_temp_dir, 'manifest.json') - return ReferenceSpaceCache(reference_space_key=rsp_version, - resolution=resolution, - manifest=manifest_path) - - - -def test_init(rsp, fn_temp_dir): - - manifest_path = os.path.join(fn_temp_dir, 'manifest.json') - assert( os.path.exists(manifest_path) ) - - -def test_get_annotation_volume(rsp, fn_temp_dir, rsp_version, resolution): - - eye = np.eye(100) - path = os.path.join(fn_temp_dir, rsp_version, 'annotation_{0}.nrrd'.format(resolution)) - - rsp.api.retrieve_file_over_http = lambda a, b: nrrd.write(b, eye) - obtained, _ = rsp.get_annotation_volume() - - rsp.api.retrieve_file_over_http = mock.MagicMock() - rsp.get_annotation_volume() - - rsp.api.retrieve_file_over_http.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_template_volume(rsp, fn_temp_dir, resolution): - - eye = np.eye(100) - path = os.path.join(fn_temp_dir, 'average_template_{0}.nrrd'.format(resolution)) - - rsp.api.retrieve_file_over_http = lambda a, b: nrrd.write(b, eye) - obtained, _ = rsp.get_template_volume() - - rsp.api.retrieve_file_over_http = mock.MagicMock() - rsp.get_template_volume() - - rsp.api.retrieve_file_over_http.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_structure_tree(rsp, fn_temp_dir, new_nodes): - - path = os.path.join(fn_temp_dir, 'structures.json') - - with mock.patch('allensdk.api.queries.ontologies_api.' - 'OntologiesApi.model_query', - return_value=new_nodes) as p: - - obtained = rsp.get_structure_tree() - - rsp.get_structure_tree() - p.assert_called_once() - - assert(obtained.node_ids()[0] == 0) - - cm_obt = obtained.get_colormap() - assert(len(cm_obt[0]) == 3) - - assert( os.path.exists(path) ) - - -def test_get_reference_space(rsp, new_nodes): - - tree = StructureTree(StructureTree.clean_structures(new_nodes)) - rsp.get_structure_tree = lambda *a, **k: tree - - annot = np.arange(125).reshape((5, 5, 5)) - rsp.get_annotation_volume = lambda *a, **k: (annot, 'foo') - - rsp_obt = rsp.get_reference_space() - - assert( np.allclose(rsp_obt.resolution, [25, 25, 25]) ) - assert( np.allclose( rsp_obt.annotation, annot ) ) - - -def test_get_structure_mask(rsp, fn_temp_dir, rsp_version): - - sid = 12 - - eye = np.eye(100) - path = os.path.join(fn_temp_dir, rsp_version, 'structure_masks', - 'resolution_25', 'structure_{0}.nrrd'.format(sid)) - - rsp.api.retrieve_file_over_http = lambda a, b: nrrd.write(b, eye) - obtained, _ = rsp.get_structure_mask(sid) - - rsp.api.retrieve_file_over_http = mock.MagicMock() - rsp.get_structure_mask(sid) - - rsp.api.retrieve_file_over_http.assert_not_called() - assert( np.allclose(obtained, eye) ) - assert( os.path.exists(path) ) - - -def test_get_structure_mesh(rsp, fn_temp_dir, rsp_version): - - sid = 12 - - path = os.path.join(fn_temp_dir, rsp_version, 'structure_meshes','structure_{0}.obj'.format(sid)) - - def write_obj(path): - with open(path, 'w') as fil: - fil.write('vn 1 2 4') - - expected = [1, 2, 4] - - rsp.api.retrieve_file_over_http = lambda a, b: write_obj(b) - obtained = rsp.get_structure_mesh(sid) - - rsp.api.retrieve_file_over_http = mock.MagicMock() - rsp.get_structure_mesh(sid) - - rsp.api.retrieve_file_over_http.assert_not_called() - assert( np.allclose(obtained[1], expected) ) - assert( os.path.exists(path) ) - - -@pytest.mark.parametrize('inp,fails', [(1, False), - (pd.Series([2]), False), - ('qwerty', True)]) -def test_validate_structure_id(inp, fails): - - if fails: - with pytest.raises(ValueError) as exc: - ReferenceSpaceCache.validate_structure_id(inp) - else: - out = ReferenceSpaceCache.validate_structure_id(inp) - assert( out == int(inp) ) - - -@pytest.mark.parametrize('inp,fails', [([1, 2, 3], False), - ([pd.Series([2]), pd.Series([3])], False), - (['qwerty', 1], True)]) -def test_validate_structure_ids(inp, fails): - - if fails: - with pytest.raises(ValueError) as exc: - ReferenceSpaceCache.validate_structure_ids(inp) - else: - out = ReferenceSpaceCache.validate_structure_ids(inp) - assert( out == list(map(int, inp)) ) diff --git a/allensdk/test/core/test_reference_space_notebook.py b/allensdk/test/core/test_reference_space_notebook.py deleted file mode 100644 index 37e1ccc7ea..0000000000 --- a/allensdk/test/core/test_reference_space_notebook.py +++ /dev/null @@ -1,264 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest - -import os - - -@pytest.mark.nightly -def test_notebook(tmpdir_factory): - - # coding: utf-8 - - # # Reference Space - # - # This notebook contains example code demonstrating the use of the StructureTree and ReferenceSpace classes. These classes provide methods for interacting with the 3d spaces to which Allen Institute data and atlases are registered. - # - # Unlike the AllenSDK cache classes, StructureTree and ReferenceSpace operate entirely in memory. We recommend using json files to store text and nrrd files to store volumetric images. - # - # The MouseConnectivityCache class has methods for downloading, storing, and constructing StructureTrees and ReferenceSpaces. Please see [here](https://alleninstitute.github.io/AllenSDK/_static/examples/nb/mouse_connectivity.html) for examples. - - # ## Constructing a StructureTree - # - # A StructureTree object is a wrapper around a structure graph - a list of dictionaries documenting brain structures and their containment relationships. To build a structure tree, you will first need to obtain a structure graph. - # - # For a list of atlases and corresponding structure graph ids, see [here](http://help.brain-map.org/display/api/Atlas+Drawings+and+Ontologies). - - # In[1]: - - from allensdk.api.queries.ontologies_api import OntologiesApi - from allensdk.core.structure_tree import StructureTree - - oapi = OntologiesApi() - structure_graph = oapi.get_structures_with_sets([1]) # 1 is the id of the adult mouse structure graph - - # This removes some unused fields returned by the query - structure_graph = StructureTree.clean_structures(structure_graph) - - tree = StructureTree(structure_graph) - - - # In[2]: - - # now let's take a look at a structure - tree.get_structures_by_name(['Dorsal auditory area']) - - - # The fields are: - # * acronym: a shortened name for the structure - # * rgb_triplet: each structure is assigned a consistent color for visualizations - # * graph_id: the structure graph to which this structure belongs - # * graph_order: each structure is assigned a consistent position in the flattened graph - # * id: a unique integer identifier - # * name: the full name of the structure - # * structure_id_path: traces a path from the root node of the tree to this structure - # * structure_set_ids: the structure belongs to these predefined groups - - # ## Using a StructureTree - - # In[3]: - - # get a structure's parent - tree.parent([1011]) - - - # In[4]: - - # get a dictionary mapping structure ids to names - - name_map = tree.get_name_map() - name_map[247] - - - # In[5]: - - # ask whether one structure is contained within another - - strida = 385 - stridb = 247 - - is_desc = '' if tree.structure_descends_from(385, 247) else ' not' - - print( '{0} is{1} in {2}'.format(name_map[strida], is_desc, name_map[stridb]) ) - - - # In[6]: - - # build a custom map that looks up acronyms by ids - # the syntax here is just a pair of node-wise functions. - # The first one returns keys while the second one returns values - - acronym_map = tree.value_map(lambda x: x['id'], lambda y: y['acronym']) - print( acronym_map[385] ) - - - # ## Downloading an annotation volume - # - # This code snippet will download and store a nrrd file containing the Allen Common Coordinate Framework annotation. We have requested an annotation with 25-micron isometric spacing. The orientation of this space is: - # * Anterior -> Posterior - # * Superior -> Inferior - # * Left -> Right - # This is the no-frills way to download an annotation volume. See the <a href='_static/examples/nb/mouse_connectivity.html#Manipulating-Grid-Data'>mouse connectivity</a> examples if you want to properly cache the downloaded data. - - # In[7]: - - import os - import nrrd - from allensdk.api.queries.mouse_connectivity_api import MouseConnectivityApi - from allensdk.config.manifest import Manifest - - # the annotation download writes a file, so we will need somwhere to put it - annotation_dir = str(tmpdir_factory.mktemp('annotation')) - - annotation_path = os.path.join(annotation_dir, 'annotation.nrrd') - - mcapi = MouseConnectivityApi() - mcapi.download_annotation_volume('annotation/ccf_2016', 25, annotation_path) - - annotation, meta = nrrd.read(annotation_path) - - - # ## Constructing a ReferenceSpace - - # In[8]: - - from allensdk.core.reference_space import ReferenceSpace - - # build a reference space from a StructureTree and annotation volume, the third argument is - # the resolution of the space in microns - rsp = ReferenceSpace(tree, annotation, [25, 25, 25]) - - - # ## Using a ReferenceSpace - - # #### making structure masks - # - # The simplest use of a Reference space is to build binary indicator masks for structures or groups of structures. - - # In[9]: - - # A complete mask for one structure - whole_cortex_mask = rsp.make_structure_mask([315]) - - # view in coronal section - - - # What if you want a mask for a whole collection of ontologically disparate structures? Just pass more structure ids to make_structure_masks: - - # In[10]: - - # This gets all of the structures targeted by the Allen Brain Observatory project - brain_observatory_structures = rsp.structure_tree.get_structures_by_set_id([514166994]) - brain_observatory_ids = [st['id'] for st in brain_observatory_structures] - - brain_observatory_mask = rsp.make_structure_mask(brain_observatory_ids) - - # view in horizontal section - - # You can also make and store a number of structure_masks at once: - - # In[11]: - - import functools - - # Define a wrapper function that will control the mask generation. - # This one checks for a nrrd file in the specified base directory - # and builds/writes the mask only if one does not exist - mask_writer = functools.partial(ReferenceSpace.check_and_write, annotation_dir) - - # many_structure_masks is a generator - nothing has actrually been run yet - mask_generator = rsp.many_structure_masks([385, 1097], mask_writer) - - # consume the resulting iterator to make and write the masks - for structure_id in mask_generator: - print( 'made mask for structure {0}.'.format(structure_id) ) - - os.listdir(annotation_dir) - - - # #### Removing unassigned structures - - # A structure graph may contain structures that are not used in a particular reference space. Having these around can complicate use of the reference space, so we generally want to remove them. - # - # We'll try this using "Somatosensory areas, layer 6a" as a test case. In the 2016 ccf space, this structure is unused in favor of finer distinctions (e.g. "Primary somatosensory area, barrel field, layer 6a"). - - # In[12]: - - # Double-check the voxel counts - no_voxel_id = rsp.structure_tree.get_structures_by_name(['Somatosensory areas, layer 6a'])[0]['id'] - print( 'voxel count for structure {0}: {1}'.format(no_voxel_id, rsp.total_voxel_map[no_voxel_id]) ) - - # remove unassigned structures from the ReferenceSpace's StructureTree - rsp.remove_unassigned() - - # check the structure tree - no_voxel_id in rsp.structure_tree.node_ids() - - - # #### View a slice from the annotation - - # In[13]: - - import numpy as np - - - # #### Downsample the space - # - # If you want an annotation at a resolution we don't provide, you can make one with the downsample method. - - # In[14]: - - import warnings - - target_resolution = [75, 75, 75] - - # in some versions of scipy, scipy.ndimage.zoom raises a helpful but distracting - # warning about the method used to truncate integers. - warnings.simplefilter('ignore') - - sf_rsp = rsp.downsample(target_resolution) - - # re-enable warnings - warnings.simplefilter('default') - - print( rsp.annotation.shape ) - print( sf_rsp.annotation.shape ) - - - # Now view the downsampled space: - - # In[15]: - diff --git a/allensdk/test/core/test_simple_tree.py b/allensdk/test/core/test_simple_tree.py deleted file mode 100644 index 1bc9f56ceb..0000000000 --- a/allensdk/test/core/test_simple_tree.py +++ /dev/null @@ -1,194 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import mock -from numpy import allclose - -from allensdk.core.simple_tree import SimpleTree - - -@pytest.fixture -def tree(): - - s = frozenset([1, 2, 3]) - - nodes = [{'id': 0, 'parent': None, 1: 2, s: 'a'}, {'id': 1, 'parent': 0, 1: 7, s: 'd'}, - {'id': 2, 'parent': 0, 1: 3, s: 'b'}, {'id': 3, 'parent': 1, 1: 6, s: 'e'}, - {'id': 4, 'parent': 1, 1: 4, s: 'c'}, {'id': 5, 'parent': 2, 1: 5, s: 'f'}] - - parent_fn = lambda node: node['parent'] - id_fn = lambda node: node['id'] - - return SimpleTree(nodes, id_fn, parent_fn) - - -def test_initialization(tree): - - assert( None in tree._parent_ids.values() ) - assert( len(tree._child_ids) == 6 ) - - -def test_filter_nodes(tree): - - two_par = tree.filter_nodes(lambda node: node['parent'] == 2) - assert( two_par[0]['id'] == 5 ) - assert( len(two_par) == 1 ) - - -@pytest.mark.parametrize('key,val,to,exp', [ ['id', [2, 1, 3], lambda x: x['id'],[2, 1, 3]], - [lambda x: x['id'], [2, 1, 3], lambda x: x['id'],[2, 1, 3]], - [1, [3, 7, 6], lambda x: x['id'],[2, 1, 3]], - [frozenset([1, 2, 3]), ['b'], lambda x: x[1], [3]] ]) -def test_nodes_by_property(tree, key, val, to, exp): - - obt = tree.nodes_by_property( key, val, to_fn=to ) - assert( allclose( obt, exp) ) - - -def test_value_map(tree): - - parent_map = tree.value_map(lambda node: node['id'], - lambda node: node['parent']) - - assert( len(parent_map) == 6 ) - assert( parent_map[2] == 0 ) - assert( parent_map[3] == 1 ) - - -def test_value_map_nonunique(tree): - - with pytest.raises( RuntimeError ): - parent_map = tree.value_map(lambda node: node['parent'], - lambda node: node['id']) - - -def test_node_ids(tree): - - obtained = tree.node_ids() - expected = range(6) - - assert( set(obtained) == set(expected) ) - - -def test_parent_ids(tree): - - nodes = [5, 4, 2] - obtained = tree.parent_ids(nodes) - - assert( allclose([2, 1, 0], obtained) ) - - -def test_child_ids(tree): - - obtained = tree.child_ids([1]) - assert( set(obtained[0]) == set([4, 3]) ) - assert( len(obtained) == 1 ) - - -def test_ancestor_ids(tree): - - obtained = tree.ancestor_ids([5, 1]) - - assert( len(obtained) == 2 ) - assert( set(obtained[0]) == set([5, 2, 0]) ) - assert( set(obtained[1]) == set([1, 0]) ) - - -def test_descendant_ids(tree): - - obtained = tree.descendant_ids([0, 3]) - - assert( len(obtained) == 2 ) - assert( set(obtained[0]) == set(range(6)) ) - assert( set(obtained[1]) == set([3]) ) - - -def test_nodes(tree): - - obtained = tree.nodes([0, 1]) - - assert( len(obtained) == 2 ) - assert( obtained[0]['parent'] is None ) - assert( obtained[1]['id'] == 1 ) - - -def test_nodes_default(tree): - - obtained = tree.nodes() - assert( len(obtained) == 6 ) - - -def test_parents(tree): - - obtained = tree.parents([0, 1]) - assert( len(obtained) == 2 ) - assert( obtained[0] is None ) - -def test_children(tree): - - obtained = tree.children([0, 5]) - - assert( len(obtained) == 2 ) - assert( set(obtained[1]) == set([]) ) - assert( len(obtained[0]) == 2 ) - assert( isinstance(obtained[0][0], dict) ) - -def test_descendants(tree): - - obtained = tree.descendants([0, 3]) - - assert( len(obtained) == 2 ) - assert( len(obtained[0]) == 6 ) - assert( obtained[1][0]['id'] == 3 ) - assert( isinstance(obtained[0][0], dict) ) - - -def test_ancestors(tree): - - obtained = tree.ancestors([5, 1]) - - assert( len(obtained) == 2 ) - assert( len(obtained[0]) == 3 ) - assert( isinstance(obtained[0][0], dict) ) - assert( len(obtained[1]) == 2 ) - - -def test_cbs(tree): - - nodes = tree.nodes() - for node in nodes: - assert( node['id'] == tree.node_id_cb(node) ) - assert( node['parent'] == tree.parent_id_cb(node) ) diff --git a/allensdk/test/core/test_sitk_utilities.py b/allensdk/test/core/test_sitk_utilities.py deleted file mode 100644 index 4c8a839b34..0000000000 --- a/allensdk/test/core/test_sitk_utilities.py +++ /dev/null @@ -1,182 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2015-2018. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import pytest -import numpy as np -import SimpleITK as sitk -import nrrd - -from allensdk.core import sitk_utilities as su - - - -@pytest.fixture(params=[1, 2, 3, 4]) -def ncomponents(request): - return request.param - - -@pytest.fixture(params=[ [10, 20], [10, 20, 30], [10, 20, 30], [10, 10, 10], [20, 20] ]) -def size(request): - return request.param - - -@pytest.fixture(params=[ lambda x: list(range(x+1))[1:], lambda x: [10] * x ]) -def spacing(request): - return request.param - - -@pytest.fixture(params=[ lambda x: list(range(x+1))[1:], lambda x: [5] * x ]) -def origin(request): - return request.param - - -@pytest.fixture(params=[ lambda x: np.eye(x).flatten() ]) -def direction(request): - return request.param - - -@pytest.fixture(scope='function') -def image(size, ncomponents, spacing, origin, direction): - - if ncomponents > 1: - img = sitk.Image(size, sitk.sitkVectorUInt8, ncomponents) - else: - img = sitk.Image(size, sitk.sitkUInt8, ncomponents) - - ndim = len(size) - - spacing_val = spacing(ndim) - img.SetSpacing(spacing_val) - - origin_val = origin(ndim) - img.SetOrigin(origin_val) - - dir_val = direction(ndim) - img.SetDirection(dir_val) - - return img, {'ncomponents': ncomponents, - 'size': size, - 'spacing': spacing_val, - 'origin': origin_val, - 'direction': dir_val} - - -def test_get_sitk_image_information(image): - - obtained = su.get_sitk_image_information(image[0]) - for key, value in image[1].items(): - assert(np.allclose( obtained[key], value )) - - -def test_set_sitk_image_information_roundtrip(image): - - info = su.get_sitk_image_information(image[0]) - arr = sitk.GetArrayFromImage(image[0]) - - new_image = sitk.GetImageFromArray(arr, info['ncomponents'] > 1) - su.set_sitk_image_information(new_image, info) - - obtained = su.get_sitk_image_information(new_image) - for key, value in info.items(): - assert(np.allclose( obtained[key], value )) - - -@pytest.mark.parametrize('act,dec,nc', [ ([10, 20], [20, 10], 1), - ([10, 20, 30], [30, 20, 10], 1), - ([10, 20, 30, 3], [30, 20, 10], 3), - ([10, 10, 10, 3], [10, 10, 10], 3 ) ]) -def test_fix_array_dimensions(act, dec, nc): - - arr = np.zeros(act) - obt = su.fix_array_dimensions(arr, nc) - - if nc == 1: - assert(np.array_equal( obt.shape, dec )) - else: - assert(np.array_equal( obt.shape[:-1], dec )) - - assert( not np.isfortran(obt) ) - - -def test_sitk_metaimage_roundtrip(tmpdir_factory, size): - - path = tmpdir_factory.mktemp('metaimage_io_test').join('dummy.mhd') - - array = np.random.rand(*size) - - su.write_ndarray_with_sitk(array, path) - obt_image, obt_info = su.read_ndarray_with_sitk(path) - - assert(np.allclose( obt_image, array )) - - -def test_sitk_metaimage_vector_roundtrip(tmpdir_factory, size): - - path = tmpdir_factory.mktemp('metaimage_io_test').join('dummy.mhd') - - size = list(size) + [3] - array = np.random.rand(*size) - - su.write_ndarray_with_sitk(array, path, ncomponents=3) - obt_image, obt_info = su.read_ndarray_with_sitk(path) - - assert(np.allclose( obt_image, array )) - assert( obt_info['ncomponents'] == 3 ) - - -def test_sitk_nrrd_read(tmpdir_factory, size): - - path = tmpdir_factory.mktemp('nrrd_io_test').join('dummy.nrrd') - array = np.random.rand(*size) - - nrrd.write(str(path), array) - - obt_image, obt_info = su.read_ndarray_with_sitk(path) - - assert(np.allclose( obt_image, array )) - - - -def test_sitk_nrrd_write(tmpdir_factory, size): - - path = tmpdir_factory.mktemp('nrrd_io_test').join('dummy_again.nrrd') - - array = np.random.rand(*size) - - su.write_ndarray_with_sitk(array, path) - obt_image, obt_info = nrrd.read(str(path)) - - assert(np.allclose( obt_image, array )) diff --git a/allensdk/test/core/test_structure_tree.py b/allensdk/test/core/test_structure_tree.py deleted file mode 100644 index e37f2ed2b2..0000000000 --- a/allensdk/test/core/test_structure_tree.py +++ /dev/null @@ -1,250 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import mock -from numpy import allclose -import sys -import pandas as pd - -from allensdk.api.queries.ontologies_api import OntologiesApi -from allensdk.core.structure_tree import StructureTree - -if sys.version_info > (3,): - long = int - -@pytest.fixture -def nodes(): - - return [{'id': 0, 'structure_id_path': [0], 'rgb_triplet': [0, 0, 0], 'acronym': 'rt', 'name': 'root', 'structure_set_ids':[1, 4]}, - {'id': 1, 'structure_id_path': [0, 1], 'rgb_triplet': [0, 15, 255], 'acronym': 'a', 'name': 'alpha', 'structure_set_ids': [1, 3]}, - {'id': 2, 'structure_id_path': [0, 2], 'rgb_triplet': [255, 255, 255], 'acronym': 'b', 'name': 'beta', 'structure_set_ids': [1, 2]}] - - -@pytest.fixture -def tree(nodes): - return StructureTree(nodes) - - -@pytest.fixture -def oapi(): - oa = OntologiesApi() - - oa.get_structures = mock.MagicMock(return_value=[{'id': 1, 'structure_id_path': '1'}]) - oa.get_structure_set_map = mock.MagicMock(return_value={1: [2, 3]}) - - return oa - - -def test_get_structures_by_id(tree): - - obtained = tree.get_structures_by_id([1, 2]) - assert( len(obtained) == 2 ) - - -def test_get_structures_by_name(tree): - - obtained = tree.get_structures_by_name(['root']) - assert( len(obtained) == 1 ) - - -def test_get_structures_by_acronym(tree): - - obtained = tree.get_structures_by_acronym(['rt', 'a', 'b']) - assert( len(obtained) == 3) - - -def test_get_structures_by_set_id(tree): - - obtained = tree.get_structures_by_set_id([2, 3]) - - assert( len(obtained) == 2 ) - - -def test_get_colormap(tree): - - obtained = tree.get_colormap() - assert( allclose(obtained[0], [0, 0, 0]) ) - assert( allclose(obtained[2], [255, 255, 255]) ) - - -def test_get_name_map(tree): - - obtained = tree.get_name_map() - assert( obtained[0] == 'root' ) - assert( obtained[2] == 'beta' ) - - -def test_get_id_acronym_map(tree): - - obtained = tree.get_id_acronym_map() - assert( obtained['rt'] == 0 ) - - -def test_get_ancestor_id_map(tree): - - obtained = tree.get_ancestor_id_map() - assert( set(obtained[2]) == set([2, 0]) ) - - -def test_structure_descends_from(tree): - - assert( tree.structure_descends_from(2, 0) ) - assert( not tree.structure_descends_from(0, 1) ) - - -def test_has_overlaps(tree): - - obtained = tree.has_overlaps([0, 1, 2]) - assert( obtained == set([0]) ) - - obag = tree.has_overlaps([1, 2]) - assert( not obag ) - - -def test_clean_structures(nodes): - - dirty_node = {'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'structure_sets':[{'id': 1}, {'id': 4}]} - - clean_node = StructureTree.clean_structures([dirty_node])[0] - assert( isinstance(clean_node['rgb_triplet'], list) ) - assert( isinstance(clean_node['structure_id_path'], list) ) - - -def test_clean_structures_no_sets(): - - dirty_node = {'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root'} - - clean_node = StructureTree.clean_structures([dirty_node]) - st = StructureTree(clean_node) - - assert( len(clean_node[0]['structure_set_ids']) == 0 ) - - -def test_clean_structures_only_ids(): - - dirty_node = {'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'structure_set_ids': [1, 2, 3] } - - clean_node = StructureTree.clean_structures([dirty_node]) - st = StructureTree(clean_node) - - assert( len(clean_node[0]['structure_set_ids']) == 3 ) - - -def test_clean_structures_ids_sets(): - - dirty_node = {'id': 0, 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'structure_set_ids': [1, 2, 3], - 'structure_sets': [{'id': 1}, {'id': 4}] } - - clean_node = StructureTree.clean_structures([dirty_node]) - st = StructureTree(clean_node) - - assert( len(clean_node[0]['structure_set_ids']) == 4 ) - - -def test_clean_structures_str_id(): - - dirty_node = {'id': '0', 'structure_id_path': '/0/', - 'color_hex_triplet': '000000', 'acronym': 'rt', - 'name': 'root', 'structure_set_ids': [1, 2, 3], - 'structure_sets': [{'id': 1}, {'id': 4}] } - - clean_node = StructureTree.clean_structures([dirty_node]) - st = StructureTree(clean_node) - - assert( set(st.node_ids()) == set([0]) ) - - -def test_get_structure_sets(tree): - - expected = set([1, 2, 3, 4]) - obtained = tree.get_structure_sets() - assert( expected == obtained ) - - -def test_clean_structures_weird_keys(): - - dirty_node = {'id': 5, 'dummy_key': 'dummy_val'} - clean_node = StructureTree.clean_structures([dirty_node])[0] - - assert( len(clean_node) == 2 ) - assert( clean_node['id'] == 5 ) - - -@pytest.mark.parametrize('inp,out', [('990099', [153, 0, 153]), - ('#990099', [153, 0, 153]), - ([153, 0, 153], [153, 0, 153]), - ((153., 0., 153.), [153, 0, 153]), - ([long(153), long(0), long(153)], [153, 0, 153])]) -def test_hex_to_rgb(inp, out): - obt = StructureTree.hex_to_rgb(inp) - assert(allclose(obt, out)) - - -@pytest.mark.parametrize('inp,out', [('/1/2/3/', [1, 2, 3]), - ('1/2/3/', [1, 2, 3]), - ('/1/2/3', [1, 2, 3]), - ('1/2/3', [1, 2, 3]), - ([1, 2, 3], [1, 2, 3]), - ([1.0, long(2), 3], [1, 2, 3]), - ((1, 2, 3), [1, 2, 3]), - ('', [])]) -def test_path_to_list(inp, out): - obt = StructureTree.path_to_list(inp) - assert(allclose(obt, out)) - - -def test_export_label_description(tree): - exp = pd.DataFrame({ - 'IDX': [0, 1, 2], - '-R-': [0, 0, 255], - '-G-': [0, 15, 255], - '-B-': [0, 255, 255], - '-A-': [1.0, 1.0, 1.0], - 'VIS': [1, 1, 1], - 'MSH': [1, 1, 1], - 'LABEL': ['rt', 'a', 'b'] - }).loc[:, ('IDX', '-R-', '-G-', '-B-', '-A-', 'VIS', 'MSH', 'LABEL')] - - obt = tree.export_label_description() - pd.testing.assert_frame_equal(obt, exp) \ No newline at end of file diff --git a/allensdk/test/ephys/data/spike_test_high_init_dvdt.txt b/allensdk/test/ephys/data/spike_test_high_init_dvdt.txt deleted file mode 100644 index b3cd2741f1..0000000000 --- a/allensdk/test/ephys/data/spike_test_high_init_dvdt.txt +++ /dev/null @@ -1,28000 +0,0 @@ -1.000000000000000000e+00 -7.331250000000000000e+01 -1.000005000000000033e+00 -7.328125000000000000e+01 -1.000010000000000066e+00 -7.325000000000000000e+01 -1.000015000000000098e+00 -7.328125000000000000e+01 -1.000020000000000131e+00 -7.321875000000000000e+01 -1.000025000000000164e+00 -7.331250000000000000e+01 -1.000029999999999974e+00 -7.321875000000000000e+01 -1.000035000000000007e+00 -7.321875000000000000e+01 -1.000040000000000040e+00 -7.325000000000000000e+01 -1.000045000000000073e+00 -7.328125000000000000e+01 -1.000050000000000106e+00 -7.325000000000000000e+01 -1.000055000000000138e+00 -7.331250000000000000e+01 -1.000060000000000171e+00 -7.325000000000000000e+01 -1.000064999999999982e+00 -7.328125000000000000e+01 -1.000070000000000014e+00 -7.321875000000000000e+01 -1.000075000000000047e+00 -7.325000000000000000e+01 -1.000080000000000080e+00 -7.325000000000000000e+01 -1.000085000000000113e+00 -7.318750000000000000e+01 -1.000090000000000146e+00 -7.325000000000000000e+01 -1.000095000000000178e+00 -7.318750000000000000e+01 -1.000099999999999989e+00 -7.321875000000000000e+01 -1.000105000000000022e+00 -7.328125000000000000e+01 -1.000110000000000054e+00 -7.328125000000000000e+01 -1.000115000000000087e+00 -7.328125000000000000e+01 -1.000120000000000120e+00 -7.328125000000000000e+01 -1.000125000000000153e+00 -7.328125000000000000e+01 -1.000130000000000186e+00 -7.321875000000000000e+01 -1.000134999999999996e+00 -7.321875000000000000e+01 -1.000140000000000029e+00 -7.318750000000000000e+01 -1.000145000000000062e+00 -7.321875000000000000e+01 -1.000150000000000095e+00 -7.321875000000000000e+01 -1.000155000000000127e+00 -7.321875000000000000e+01 -1.000160000000000160e+00 -7.321875000000000000e+01 -1.000165000000000193e+00 -7.318750000000000000e+01 -1.000170000000000003e+00 -7.321875000000000000e+01 -1.000175000000000036e+00 -7.318750000000000000e+01 -1.000180000000000069e+00 -7.325000000000000000e+01 -1.000185000000000102e+00 -7.321875000000000000e+01 -1.000190000000000135e+00 -7.321875000000000000e+01 -1.000195000000000167e+00 -7.318750000000000000e+01 -1.000199999999999978e+00 -7.321875000000000000e+01 -1.000205000000000011e+00 -7.325000000000000000e+01 -1.000210000000000043e+00 -7.321875000000000000e+01 -1.000215000000000076e+00 -7.328125000000000000e+01 -1.000220000000000109e+00 -7.328125000000000000e+01 -1.000225000000000142e+00 -7.325000000000000000e+01 -1.000230000000000175e+00 -7.328125000000000000e+01 -1.000234999999999985e+00 -7.318750000000000000e+01 -1.000240000000000018e+00 -7.325000000000000000e+01 -1.000245000000000051e+00 -7.318750000000000000e+01 -1.000250000000000083e+00 -7.321875000000000000e+01 -1.000255000000000116e+00 -7.321875000000000000e+01 -1.000260000000000149e+00 -7.325000000000000000e+01 -1.000265000000000182e+00 -7.321875000000000000e+01 -1.000269999999999992e+00 -7.321875000000000000e+01 -1.000275000000000025e+00 -7.321875000000000000e+01 -1.000280000000000058e+00 -7.318750000000000000e+01 -1.000285000000000091e+00 -7.328125000000000000e+01 -1.000290000000000123e+00 -7.325000000000000000e+01 -1.000295000000000156e+00 -7.328125000000000000e+01 -1.000300000000000189e+00 -7.328125000000000000e+01 -1.000305000000000000e+00 -7.325000000000000000e+01 -1.000310000000000032e+00 -7.318750000000000000e+01 -1.000315000000000065e+00 -7.334375000000000000e+01 -1.000320000000000098e+00 -7.328125000000000000e+01 -1.000325000000000131e+00 -7.325000000000000000e+01 -1.000330000000000163e+00 -7.325000000000000000e+01 -1.000334999999999974e+00 -7.315625000000000000e+01 -1.000340000000000007e+00 -7.325000000000000000e+01 -1.000345000000000040e+00 -7.315625000000000000e+01 -1.000350000000000072e+00 -7.321875000000000000e+01 -1.000355000000000105e+00 -7.321875000000000000e+01 -1.000360000000000138e+00 -7.315625000000000000e+01 -1.000365000000000171e+00 -7.328125000000000000e+01 -1.000369999999999981e+00 -7.325000000000000000e+01 -1.000375000000000014e+00 -7.325000000000000000e+01 -1.000380000000000047e+00 -7.321875000000000000e+01 -1.000385000000000080e+00 -7.318750000000000000e+01 -1.000390000000000112e+00 -7.325000000000000000e+01 -1.000395000000000145e+00 -7.325000000000000000e+01 -1.000400000000000178e+00 -7.325000000000000000e+01 -1.000404999999999989e+00 -7.328125000000000000e+01 -1.000410000000000021e+00 -7.334375000000000000e+01 -1.000415000000000054e+00 -7.328125000000000000e+01 -1.000420000000000087e+00 -7.321875000000000000e+01 -1.000425000000000120e+00 -7.321875000000000000e+01 -1.000430000000000152e+00 -7.328125000000000000e+01 -1.000435000000000185e+00 -7.328125000000000000e+01 -1.000439999999999996e+00 -7.331250000000000000e+01 -1.000445000000000029e+00 -7.328125000000000000e+01 -1.000450000000000061e+00 -7.331250000000000000e+01 -1.000455000000000094e+00 -7.328125000000000000e+01 -1.000460000000000127e+00 -7.328125000000000000e+01 -1.000465000000000160e+00 -7.328125000000000000e+01 -1.000470000000000192e+00 -7.325000000000000000e+01 -1.000475000000000003e+00 -7.325000000000000000e+01 -1.000480000000000036e+00 -7.331250000000000000e+01 -1.000485000000000069e+00 -7.328125000000000000e+01 -1.000490000000000101e+00 -7.325000000000000000e+01 -1.000495000000000134e+00 -7.328125000000000000e+01 -1.000500000000000167e+00 -7.328125000000000000e+01 -1.000504999999999978e+00 -7.328125000000000000e+01 -1.000510000000000010e+00 -7.328125000000000000e+01 -1.000515000000000043e+00 -7.328125000000000000e+01 -1.000520000000000076e+00 -7.325000000000000000e+01 -1.000525000000000109e+00 -7.331250000000000000e+01 -1.000530000000000141e+00 -7.331250000000000000e+01 -1.000535000000000174e+00 -7.321875000000000000e+01 -1.000539999999999985e+00 -7.318750000000000000e+01 -1.000545000000000018e+00 -7.325000000000000000e+01 -1.000550000000000050e+00 -7.325000000000000000e+01 -1.000555000000000083e+00 -7.321875000000000000e+01 -1.000560000000000116e+00 -7.328125000000000000e+01 -1.000565000000000149e+00 -7.328125000000000000e+01 -1.000570000000000181e+00 -7.321875000000000000e+01 -1.000574999999999992e+00 -7.328125000000000000e+01 -1.000580000000000025e+00 -7.328125000000000000e+01 -1.000585000000000058e+00 -7.318750000000000000e+01 -1.000590000000000090e+00 -7.321875000000000000e+01 -1.000595000000000123e+00 -7.321875000000000000e+01 -1.000600000000000156e+00 -7.328125000000000000e+01 -1.000605000000000189e+00 -7.321875000000000000e+01 -1.000609999999999999e+00 -7.328125000000000000e+01 -1.000615000000000032e+00 -7.321875000000000000e+01 -1.000620000000000065e+00 -7.328125000000000000e+01 -1.000625000000000098e+00 -7.315625000000000000e+01 -1.000630000000000130e+00 -7.325000000000000000e+01 -1.000635000000000163e+00 -7.321875000000000000e+01 -1.000639999999999974e+00 -7.328125000000000000e+01 -1.000645000000000007e+00 -7.321875000000000000e+01 -1.000650000000000039e+00 -7.325000000000000000e+01 -1.000655000000000072e+00 -7.318750000000000000e+01 -1.000660000000000105e+00 -7.321875000000000000e+01 -1.000665000000000138e+00 -7.325000000000000000e+01 -1.000670000000000170e+00 -7.328125000000000000e+01 -1.000674999999999981e+00 -7.315625000000000000e+01 -1.000680000000000014e+00 -7.321875000000000000e+01 -1.000685000000000047e+00 -7.325000000000000000e+01 -1.000690000000000079e+00 -7.325000000000000000e+01 -1.000695000000000112e+00 -7.321875000000000000e+01 -1.000700000000000145e+00 -7.318750000000000000e+01 -1.000705000000000178e+00 -7.328125000000000000e+01 -1.000709999999999988e+00 -7.325000000000000000e+01 -1.000715000000000021e+00 -7.325000000000000000e+01 -1.000720000000000054e+00 -7.331250000000000000e+01 -1.000725000000000087e+00 -7.321875000000000000e+01 -1.000730000000000119e+00 -7.321875000000000000e+01 -1.000735000000000152e+00 -7.321875000000000000e+01 -1.000740000000000185e+00 -7.315625000000000000e+01 -1.000744999999999996e+00 -7.321875000000000000e+01 -1.000750000000000028e+00 -7.325000000000000000e+01 -1.000755000000000061e+00 -7.328125000000000000e+01 -1.000760000000000094e+00 -7.321875000000000000e+01 -1.000765000000000127e+00 -7.325000000000000000e+01 -1.000770000000000159e+00 -7.321875000000000000e+01 -1.000775000000000192e+00 -7.318750000000000000e+01 -1.000780000000000003e+00 -7.325000000000000000e+01 -1.000785000000000036e+00 -7.321875000000000000e+01 -1.000790000000000068e+00 -7.331250000000000000e+01 -1.000795000000000101e+00 -7.325000000000000000e+01 -1.000800000000000134e+00 -7.321875000000000000e+01 -1.000805000000000167e+00 -7.328125000000000000e+01 -1.000809999999999977e+00 -7.328125000000000000e+01 -1.000815000000000010e+00 -7.328125000000000000e+01 -1.000820000000000043e+00 -7.325000000000000000e+01 -1.000825000000000076e+00 -7.325000000000000000e+01 -1.000830000000000108e+00 -7.328125000000000000e+01 -1.000835000000000141e+00 -7.328125000000000000e+01 -1.000840000000000174e+00 -7.328125000000000000e+01 -1.000844999999999985e+00 -7.328125000000000000e+01 -1.000850000000000017e+00 -7.328125000000000000e+01 -1.000855000000000050e+00 -7.331250000000000000e+01 -1.000860000000000083e+00 -7.321875000000000000e+01 -1.000865000000000116e+00 -7.331250000000000000e+01 -1.000870000000000148e+00 -7.325000000000000000e+01 -1.000875000000000181e+00 -7.328125000000000000e+01 -1.000879999999999992e+00 -7.328125000000000000e+01 -1.000885000000000025e+00 -7.321875000000000000e+01 -1.000890000000000057e+00 -7.325000000000000000e+01 -1.000895000000000090e+00 -7.321875000000000000e+01 -1.000900000000000123e+00 -7.325000000000000000e+01 -1.000905000000000156e+00 -7.328125000000000000e+01 -1.000910000000000188e+00 -7.321875000000000000e+01 -1.000914999999999999e+00 -7.331250000000000000e+01 -1.000920000000000032e+00 -7.328125000000000000e+01 -1.000925000000000065e+00 -7.325000000000000000e+01 -1.000930000000000097e+00 -7.328125000000000000e+01 -1.000935000000000130e+00 -7.325000000000000000e+01 -1.000940000000000163e+00 -7.328125000000000000e+01 -1.000944999999999974e+00 -7.325000000000000000e+01 -1.000950000000000006e+00 -7.328125000000000000e+01 -1.000955000000000039e+00 -7.328125000000000000e+01 -1.000960000000000072e+00 -7.328125000000000000e+01 -1.000965000000000105e+00 -7.318750000000000000e+01 -1.000970000000000137e+00 -7.321875000000000000e+01 -1.000975000000000170e+00 -7.325000000000000000e+01 -1.000979999999999981e+00 -7.328125000000000000e+01 -1.000985000000000014e+00 -7.318750000000000000e+01 -1.000990000000000046e+00 -7.325000000000000000e+01 -1.000995000000000079e+00 -7.328125000000000000e+01 -1.001000000000000112e+00 -7.325000000000000000e+01 -1.001005000000000145e+00 -7.328125000000000000e+01 -1.001010000000000177e+00 -7.325000000000000000e+01 -1.001014999999999988e+00 -7.321875000000000000e+01 -1.001020000000000021e+00 -7.325000000000000000e+01 -1.001025000000000054e+00 -7.318750000000000000e+01 -1.001030000000000086e+00 -7.325000000000000000e+01 -1.001035000000000119e+00 -7.328125000000000000e+01 -1.001040000000000152e+00 -7.325000000000000000e+01 -1.001045000000000185e+00 -7.321875000000000000e+01 -1.001049999999999995e+00 -7.328125000000000000e+01 -1.001055000000000028e+00 -7.328125000000000000e+01 -1.001060000000000061e+00 -7.321875000000000000e+01 -1.001065000000000094e+00 -7.328125000000000000e+01 -1.001070000000000126e+00 -7.328125000000000000e+01 -1.001075000000000159e+00 -7.321875000000000000e+01 -1.001080000000000192e+00 -7.325000000000000000e+01 -1.001085000000000003e+00 -7.321875000000000000e+01 -1.001090000000000035e+00 -7.328125000000000000e+01 -1.001095000000000068e+00 -7.328125000000000000e+01 -1.001100000000000101e+00 -7.328125000000000000e+01 -1.001105000000000134e+00 -7.334375000000000000e+01 -1.001110000000000166e+00 -7.328125000000000000e+01 -1.001114999999999977e+00 -7.328125000000000000e+01 -1.001120000000000010e+00 -7.328125000000000000e+01 -1.001125000000000043e+00 -7.328125000000000000e+01 -1.001130000000000075e+00 -7.331250000000000000e+01 -1.001135000000000108e+00 -7.321875000000000000e+01 -1.001140000000000141e+00 -7.321875000000000000e+01 -1.001145000000000174e+00 -7.328125000000000000e+01 -1.001149999999999984e+00 -7.325000000000000000e+01 -1.001155000000000017e+00 -7.328125000000000000e+01 -1.001160000000000050e+00 -7.328125000000000000e+01 -1.001165000000000083e+00 -7.328125000000000000e+01 -1.001170000000000115e+00 -7.325000000000000000e+01 -1.001175000000000148e+00 -7.328125000000000000e+01 -1.001180000000000181e+00 -7.328125000000000000e+01 -1.001184999999999992e+00 -7.325000000000000000e+01 -1.001190000000000024e+00 -7.325000000000000000e+01 -1.001195000000000057e+00 -7.325000000000000000e+01 -1.001200000000000090e+00 -7.331250000000000000e+01 -1.001205000000000123e+00 -7.331250000000000000e+01 -1.001210000000000155e+00 -7.325000000000000000e+01 -1.001215000000000188e+00 -7.334375000000000000e+01 -1.001219999999999999e+00 -7.334375000000000000e+01 -1.001225000000000032e+00 -7.328125000000000000e+01 -1.001230000000000064e+00 -7.325000000000000000e+01 -1.001235000000000097e+00 -7.328125000000000000e+01 -1.001240000000000130e+00 -7.328125000000000000e+01 -1.001245000000000163e+00 -7.331250000000000000e+01 -1.001249999999999973e+00 -7.328125000000000000e+01 -1.001255000000000006e+00 -7.328125000000000000e+01 -1.001260000000000039e+00 -7.325000000000000000e+01 -1.001265000000000072e+00 -7.321875000000000000e+01 -1.001270000000000104e+00 -7.325000000000000000e+01 -1.001275000000000137e+00 -7.331250000000000000e+01 -1.001280000000000170e+00 -7.328125000000000000e+01 -1.001284999999999981e+00 -7.331250000000000000e+01 -1.001290000000000013e+00 -7.325000000000000000e+01 -1.001295000000000046e+00 -7.331250000000000000e+01 -1.001300000000000079e+00 -7.331250000000000000e+01 -1.001305000000000112e+00 -7.331250000000000000e+01 -1.001310000000000144e+00 -7.334375000000000000e+01 -1.001315000000000177e+00 -7.331250000000000000e+01 -1.001319999999999988e+00 -7.331250000000000000e+01 -1.001325000000000021e+00 -7.331250000000000000e+01 -1.001330000000000053e+00 -7.334375000000000000e+01 -1.001335000000000086e+00 -7.328125000000000000e+01 -1.001340000000000119e+00 -7.331250000000000000e+01 -1.001345000000000152e+00 -7.331250000000000000e+01 -1.001350000000000184e+00 -7.331250000000000000e+01 -1.001354999999999995e+00 -7.328125000000000000e+01 -1.001360000000000028e+00 -7.331250000000000000e+01 -1.001365000000000061e+00 -7.331250000000000000e+01 -1.001370000000000093e+00 -7.334375000000000000e+01 -1.001375000000000126e+00 -7.328125000000000000e+01 -1.001380000000000159e+00 -7.331250000000000000e+01 -1.001385000000000192e+00 -7.331250000000000000e+01 -1.001390000000000002e+00 -7.328125000000000000e+01 -1.001395000000000035e+00 -7.328125000000000000e+01 -1.001400000000000068e+00 -7.334375000000000000e+01 -1.001405000000000101e+00 -7.340625000000000000e+01 -1.001410000000000133e+00 -7.334375000000000000e+01 -1.001415000000000166e+00 -7.331250000000000000e+01 -1.001419999999999977e+00 -7.334375000000000000e+01 -1.001425000000000010e+00 -7.337500000000000000e+01 -1.001430000000000042e+00 -7.331250000000000000e+01 -1.001435000000000075e+00 -7.334375000000000000e+01 -1.001440000000000108e+00 -7.334375000000000000e+01 -1.001445000000000141e+00 -7.331250000000000000e+01 -1.001450000000000173e+00 -7.331250000000000000e+01 -1.001454999999999984e+00 -7.325000000000000000e+01 -1.001460000000000017e+00 -7.334375000000000000e+01 -1.001465000000000050e+00 -7.328125000000000000e+01 -1.001470000000000082e+00 -7.334375000000000000e+01 -1.001475000000000115e+00 -7.334375000000000000e+01 -1.001480000000000148e+00 -7.337500000000000000e+01 -1.001485000000000181e+00 -7.334375000000000000e+01 -1.001489999999999991e+00 -7.334375000000000000e+01 -1.001495000000000024e+00 -7.334375000000000000e+01 -1.001500000000000057e+00 -7.328125000000000000e+01 -1.001505000000000090e+00 -7.337500000000000000e+01 -1.001510000000000122e+00 -7.334375000000000000e+01 -1.001515000000000155e+00 -7.328125000000000000e+01 -1.001520000000000188e+00 -7.337500000000000000e+01 -1.001524999999999999e+00 -7.334375000000000000e+01 -1.001530000000000031e+00 -7.334375000000000000e+01 -1.001535000000000064e+00 -7.328125000000000000e+01 -1.001540000000000097e+00 -7.334375000000000000e+01 -1.001545000000000130e+00 -7.334375000000000000e+01 -1.001550000000000162e+00 -7.334375000000000000e+01 -1.001554999999999973e+00 -7.334375000000000000e+01 -1.001560000000000006e+00 -7.331250000000000000e+01 -1.001565000000000039e+00 -7.328125000000000000e+01 -1.001570000000000071e+00 -7.321875000000000000e+01 -1.001575000000000104e+00 -7.331250000000000000e+01 -1.001580000000000137e+00 -7.331250000000000000e+01 -1.001585000000000170e+00 -7.331250000000000000e+01 -1.001589999999999980e+00 -7.325000000000000000e+01 -1.001595000000000013e+00 -7.331250000000000000e+01 -1.001600000000000046e+00 -7.328125000000000000e+01 -1.001605000000000079e+00 -7.325000000000000000e+01 -1.001610000000000111e+00 -7.328125000000000000e+01 -1.001615000000000144e+00 -7.328125000000000000e+01 -1.001620000000000177e+00 -7.340625000000000000e+01 -1.001624999999999988e+00 -7.334375000000000000e+01 -1.001630000000000020e+00 -7.328125000000000000e+01 -1.001635000000000053e+00 -7.331250000000000000e+01 -1.001640000000000086e+00 -7.334375000000000000e+01 -1.001645000000000119e+00 -7.334375000000000000e+01 -1.001650000000000151e+00 -7.340625000000000000e+01 -1.001655000000000184e+00 -7.328125000000000000e+01 -1.001659999999999995e+00 -7.331250000000000000e+01 -1.001665000000000028e+00 -7.328125000000000000e+01 -1.001670000000000060e+00 -7.331250000000000000e+01 -1.001675000000000093e+00 -7.331250000000000000e+01 -1.001680000000000126e+00 -7.334375000000000000e+01 -1.001685000000000159e+00 -7.334375000000000000e+01 -1.001690000000000191e+00 -7.334375000000000000e+01 -1.001695000000000002e+00 -7.328125000000000000e+01 -1.001700000000000035e+00 -7.331250000000000000e+01 -1.001705000000000068e+00 -7.321875000000000000e+01 -1.001710000000000100e+00 -7.337500000000000000e+01 -1.001715000000000133e+00 -7.328125000000000000e+01 -1.001720000000000166e+00 -7.331250000000000000e+01 -1.001724999999999977e+00 -7.334375000000000000e+01 -1.001730000000000009e+00 -7.328125000000000000e+01 -1.001735000000000042e+00 -7.337500000000000000e+01 -1.001740000000000075e+00 -7.331250000000000000e+01 -1.001745000000000108e+00 -7.328125000000000000e+01 -1.001750000000000140e+00 -7.331250000000000000e+01 -1.001755000000000173e+00 -7.331250000000000000e+01 -1.001759999999999984e+00 -7.331250000000000000e+01 -1.001765000000000017e+00 -7.328125000000000000e+01 -1.001770000000000049e+00 -7.325000000000000000e+01 -1.001775000000000082e+00 -7.321875000000000000e+01 -1.001780000000000115e+00 -7.328125000000000000e+01 -1.001785000000000148e+00 -7.325000000000000000e+01 -1.001790000000000180e+00 -7.325000000000000000e+01 -1.001794999999999991e+00 -7.328125000000000000e+01 -1.001800000000000024e+00 -7.328125000000000000e+01 -1.001805000000000057e+00 -7.325000000000000000e+01 -1.001810000000000089e+00 -7.328125000000000000e+01 -1.001815000000000122e+00 -7.325000000000000000e+01 -1.001820000000000155e+00 -7.328125000000000000e+01 -1.001825000000000188e+00 -7.325000000000000000e+01 -1.001829999999999998e+00 -7.325000000000000000e+01 -1.001835000000000031e+00 -7.328125000000000000e+01 -1.001840000000000064e+00 -7.328125000000000000e+01 -1.001845000000000097e+00 -7.321875000000000000e+01 -1.001850000000000129e+00 -7.334375000000000000e+01 -1.001855000000000162e+00 -7.331250000000000000e+01 -1.001859999999999973e+00 -7.328125000000000000e+01 -1.001865000000000006e+00 -7.328125000000000000e+01 -1.001870000000000038e+00 -7.325000000000000000e+01 -1.001875000000000071e+00 -7.328125000000000000e+01 -1.001880000000000104e+00 -7.321875000000000000e+01 -1.001885000000000137e+00 -7.321875000000000000e+01 -1.001890000000000169e+00 -7.321875000000000000e+01 -1.001894999999999980e+00 -7.321875000000000000e+01 -1.001900000000000013e+00 -7.318750000000000000e+01 -1.001905000000000046e+00 -7.318750000000000000e+01 -1.001910000000000078e+00 -7.321875000000000000e+01 -1.001915000000000111e+00 -7.318750000000000000e+01 -1.001920000000000144e+00 -7.321875000000000000e+01 -1.001925000000000177e+00 -7.328125000000000000e+01 -1.001929999999999987e+00 -7.321875000000000000e+01 -1.001935000000000020e+00 -7.321875000000000000e+01 -1.001940000000000053e+00 -7.321875000000000000e+01 -1.001945000000000086e+00 -7.318750000000000000e+01 -1.001950000000000118e+00 -7.321875000000000000e+01 -1.001955000000000151e+00 -7.321875000000000000e+01 -1.001960000000000184e+00 -7.321875000000000000e+01 -1.001964999999999995e+00 -7.325000000000000000e+01 -1.001970000000000027e+00 -7.325000000000000000e+01 -1.001975000000000060e+00 -7.328125000000000000e+01 -1.001980000000000093e+00 -7.325000000000000000e+01 -1.001985000000000126e+00 -7.331250000000000000e+01 -1.001990000000000158e+00 -7.321875000000000000e+01 -1.001995000000000191e+00 -7.321875000000000000e+01 -1.002000000000000002e+00 -7.321875000000000000e+01 -1.002005000000000035e+00 -7.321875000000000000e+01 -1.002010000000000067e+00 -7.328125000000000000e+01 -1.002015000000000100e+00 -7.328125000000000000e+01 -1.002020000000000133e+00 -7.321875000000000000e+01 -1.002025000000000166e+00 -7.325000000000000000e+01 -1.002029999999999976e+00 -7.321875000000000000e+01 -1.002035000000000009e+00 -7.318750000000000000e+01 -1.002040000000000042e+00 -7.331250000000000000e+01 -1.002045000000000075e+00 -7.321875000000000000e+01 -1.002050000000000107e+00 -7.331250000000000000e+01 -1.002055000000000140e+00 -7.331250000000000000e+01 -1.002060000000000173e+00 -7.328125000000000000e+01 -1.002064999999999984e+00 -7.321875000000000000e+01 -1.002070000000000016e+00 -7.328125000000000000e+01 -1.002075000000000049e+00 -7.328125000000000000e+01 -1.002080000000000082e+00 -7.328125000000000000e+01 -1.002085000000000115e+00 -7.328125000000000000e+01 -1.002090000000000147e+00 -7.328125000000000000e+01 -1.002095000000000180e+00 -7.331250000000000000e+01 -1.002099999999999991e+00 -7.321875000000000000e+01 -1.002105000000000024e+00 -7.328125000000000000e+01 -1.002110000000000056e+00 -7.328125000000000000e+01 -1.002115000000000089e+00 -7.331250000000000000e+01 -1.002120000000000122e+00 -7.328125000000000000e+01 -1.002125000000000155e+00 -7.321875000000000000e+01 -1.002130000000000187e+00 -7.328125000000000000e+01 -1.002134999999999998e+00 -7.328125000000000000e+01 -1.002140000000000031e+00 -7.321875000000000000e+01 -1.002145000000000064e+00 -7.318750000000000000e+01 -1.002150000000000096e+00 -7.315625000000000000e+01 -1.002155000000000129e+00 -7.318750000000000000e+01 -1.002160000000000162e+00 -7.325000000000000000e+01 -1.002164999999999973e+00 -7.321875000000000000e+01 -1.002170000000000005e+00 -7.328125000000000000e+01 -1.002175000000000038e+00 -7.328125000000000000e+01 -1.002180000000000071e+00 -7.328125000000000000e+01 -1.002185000000000104e+00 -7.325000000000000000e+01 -1.002190000000000136e+00 -7.325000000000000000e+01 -1.002195000000000169e+00 -7.334375000000000000e+01 -1.002199999999999980e+00 -7.325000000000000000e+01 -1.002205000000000013e+00 -7.321875000000000000e+01 -1.002210000000000045e+00 -7.321875000000000000e+01 -1.002215000000000078e+00 -7.328125000000000000e+01 -1.002220000000000111e+00 -7.325000000000000000e+01 -1.002225000000000144e+00 -7.321875000000000000e+01 -1.002230000000000176e+00 -7.325000000000000000e+01 -1.002234999999999987e+00 -7.328125000000000000e+01 -1.002240000000000020e+00 -7.321875000000000000e+01 -1.002245000000000053e+00 -7.321875000000000000e+01 -1.002250000000000085e+00 -7.328125000000000000e+01 -1.002255000000000118e+00 -7.328125000000000000e+01 -1.002260000000000151e+00 -7.328125000000000000e+01 -1.002265000000000184e+00 -7.325000000000000000e+01 -1.002269999999999994e+00 -7.325000000000000000e+01 -1.002275000000000027e+00 -7.325000000000000000e+01 -1.002280000000000060e+00 -7.334375000000000000e+01 -1.002285000000000093e+00 -7.325000000000000000e+01 -1.002290000000000125e+00 -7.321875000000000000e+01 -1.002295000000000158e+00 -7.328125000000000000e+01 -1.002300000000000191e+00 -7.328125000000000000e+01 -1.002305000000000001e+00 -7.331250000000000000e+01 -1.002310000000000034e+00 -7.325000000000000000e+01 -1.002315000000000067e+00 -7.321875000000000000e+01 -1.002320000000000100e+00 -7.321875000000000000e+01 -1.002325000000000133e+00 -7.318750000000000000e+01 -1.002330000000000165e+00 -7.321875000000000000e+01 -1.002334999999999976e+00 -7.318750000000000000e+01 -1.002340000000000009e+00 -7.325000000000000000e+01 -1.002345000000000041e+00 -7.318750000000000000e+01 -1.002350000000000074e+00 -7.321875000000000000e+01 -1.002355000000000107e+00 -7.318750000000000000e+01 -1.002360000000000140e+00 -7.318750000000000000e+01 -1.002365000000000173e+00 -7.325000000000000000e+01 -1.002369999999999983e+00 -7.318750000000000000e+01 -1.002375000000000016e+00 -7.321875000000000000e+01 -1.002380000000000049e+00 -7.328125000000000000e+01 -1.002385000000000081e+00 -7.325000000000000000e+01 -1.002390000000000114e+00 -7.321875000000000000e+01 -1.002395000000000147e+00 -7.328125000000000000e+01 -1.002400000000000180e+00 -7.328125000000000000e+01 -1.002404999999999990e+00 -7.334375000000000000e+01 -1.002410000000000023e+00 -7.321875000000000000e+01 -1.002415000000000056e+00 -7.331250000000000000e+01 -1.002420000000000089e+00 -7.325000000000000000e+01 -1.002425000000000122e+00 -7.325000000000000000e+01 -1.002430000000000154e+00 -7.328125000000000000e+01 -1.002435000000000187e+00 -7.328125000000000000e+01 -1.002439999999999998e+00 -7.334375000000000000e+01 -1.002445000000000030e+00 -7.331250000000000000e+01 -1.002450000000000063e+00 -7.325000000000000000e+01 -1.002455000000000096e+00 -7.328125000000000000e+01 -1.002460000000000129e+00 -7.325000000000000000e+01 -1.002465000000000162e+00 -7.321875000000000000e+01 -1.002469999999999972e+00 -7.321875000000000000e+01 -1.002475000000000005e+00 -7.321875000000000000e+01 -1.002480000000000038e+00 -7.334375000000000000e+01 -1.002485000000000070e+00 -7.328125000000000000e+01 -1.002490000000000103e+00 -7.328125000000000000e+01 -1.002495000000000136e+00 -7.328125000000000000e+01 -1.002500000000000169e+00 -7.331250000000000000e+01 -1.002504999999999979e+00 -7.321875000000000000e+01 -1.002510000000000012e+00 -7.328125000000000000e+01 -1.002515000000000045e+00 -7.331250000000000000e+01 -1.002520000000000078e+00 -7.328125000000000000e+01 -1.002525000000000110e+00 -7.328125000000000000e+01 -1.002530000000000143e+00 -7.334375000000000000e+01 -1.002535000000000176e+00 -7.331250000000000000e+01 -1.002539999999999987e+00 -7.328125000000000000e+01 -1.002545000000000019e+00 -7.337500000000000000e+01 -1.002550000000000052e+00 -7.328125000000000000e+01 -1.002555000000000085e+00 -7.331250000000000000e+01 -1.002560000000000118e+00 -7.325000000000000000e+01 -1.002565000000000150e+00 -7.331250000000000000e+01 -1.002570000000000183e+00 -7.328125000000000000e+01 -1.002574999999999994e+00 -7.331250000000000000e+01 -1.002580000000000027e+00 -7.331250000000000000e+01 -1.002585000000000059e+00 -7.331250000000000000e+01 -1.002590000000000092e+00 -7.331250000000000000e+01 -1.002595000000000125e+00 -7.334375000000000000e+01 -1.002600000000000158e+00 -7.331250000000000000e+01 -1.002605000000000190e+00 -7.334375000000000000e+01 -1.002610000000000001e+00 -7.331250000000000000e+01 -1.002615000000000034e+00 -7.337500000000000000e+01 -1.002620000000000067e+00 -7.328125000000000000e+01 -1.002625000000000099e+00 -7.331250000000000000e+01 -1.002630000000000132e+00 -7.331250000000000000e+01 -1.002635000000000165e+00 -7.334375000000000000e+01 -1.002639999999999976e+00 -7.331250000000000000e+01 -1.002645000000000008e+00 -7.331250000000000000e+01 -1.002650000000000041e+00 -7.331250000000000000e+01 -1.002655000000000074e+00 -7.331250000000000000e+01 -1.002660000000000107e+00 -7.334375000000000000e+01 -1.002665000000000139e+00 -7.334375000000000000e+01 -1.002670000000000172e+00 -7.328125000000000000e+01 -1.002674999999999983e+00 -7.331250000000000000e+01 -1.002680000000000016e+00 -7.325000000000000000e+01 -1.002685000000000048e+00 -7.325000000000000000e+01 -1.002690000000000081e+00 -7.331250000000000000e+01 -1.002695000000000114e+00 -7.337500000000000000e+01 -1.002700000000000147e+00 -7.328125000000000000e+01 -1.002705000000000179e+00 -7.331250000000000000e+01 -1.002709999999999990e+00 -7.328125000000000000e+01 -1.002715000000000023e+00 -7.331250000000000000e+01 -1.002720000000000056e+00 -7.331250000000000000e+01 -1.002725000000000088e+00 -7.331250000000000000e+01 -1.002730000000000121e+00 -7.328125000000000000e+01 -1.002735000000000154e+00 -7.328125000000000000e+01 -1.002740000000000187e+00 -7.331250000000000000e+01 -1.002744999999999997e+00 -7.334375000000000000e+01 -1.002750000000000030e+00 -7.328125000000000000e+01 -1.002755000000000063e+00 -7.334375000000000000e+01 -1.002760000000000096e+00 -7.331250000000000000e+01 -1.002765000000000128e+00 -7.331250000000000000e+01 -1.002770000000000161e+00 -7.331250000000000000e+01 -1.002774999999999972e+00 -7.328125000000000000e+01 -1.002780000000000005e+00 -7.328125000000000000e+01 -1.002785000000000037e+00 -7.334375000000000000e+01 -1.002790000000000070e+00 -7.334375000000000000e+01 -1.002795000000000103e+00 -7.328125000000000000e+01 -1.002800000000000136e+00 -7.340625000000000000e+01 -1.002805000000000168e+00 -7.328125000000000000e+01 -1.002809999999999979e+00 -7.328125000000000000e+01 -1.002815000000000012e+00 -7.331250000000000000e+01 -1.002820000000000045e+00 -7.334375000000000000e+01 -1.002825000000000077e+00 -7.334375000000000000e+01 -1.002830000000000110e+00 -7.328125000000000000e+01 -1.002835000000000143e+00 -7.334375000000000000e+01 -1.002840000000000176e+00 -7.331250000000000000e+01 -1.002844999999999986e+00 -7.334375000000000000e+01 -1.002850000000000019e+00 -7.331250000000000000e+01 -1.002855000000000052e+00 -7.331250000000000000e+01 -1.002860000000000085e+00 -7.334375000000000000e+01 -1.002865000000000117e+00 -7.334375000000000000e+01 -1.002870000000000150e+00 -7.334375000000000000e+01 -1.002875000000000183e+00 -7.337500000000000000e+01 -1.002879999999999994e+00 -7.328125000000000000e+01 -1.002885000000000026e+00 -7.337500000000000000e+01 -1.002890000000000059e+00 -7.334375000000000000e+01 -1.002895000000000092e+00 -7.328125000000000000e+01 -1.002900000000000125e+00 -7.337500000000000000e+01 -1.002905000000000157e+00 -7.331250000000000000e+01 -1.002910000000000190e+00 -7.328125000000000000e+01 -1.002915000000000001e+00 -7.331250000000000000e+01 -1.002920000000000034e+00 -7.334375000000000000e+01 -1.002925000000000066e+00 -7.328125000000000000e+01 -1.002930000000000099e+00 -7.328125000000000000e+01 -1.002935000000000132e+00 -7.331250000000000000e+01 -1.002940000000000165e+00 -7.331250000000000000e+01 -1.002944999999999975e+00 -7.337500000000000000e+01 -1.002950000000000008e+00 -7.328125000000000000e+01 -1.002955000000000041e+00 -7.328125000000000000e+01 -1.002960000000000074e+00 -7.331250000000000000e+01 -1.002965000000000106e+00 -7.334375000000000000e+01 -1.002970000000000139e+00 -7.328125000000000000e+01 -1.002975000000000172e+00 -7.334375000000000000e+01 -1.002979999999999983e+00 -7.334375000000000000e+01 -1.002985000000000015e+00 -7.334375000000000000e+01 -1.002990000000000048e+00 -7.337500000000000000e+01 -1.002995000000000081e+00 -7.337500000000000000e+01 -1.003000000000000114e+00 -7.340625000000000000e+01 -1.003005000000000146e+00 -7.334375000000000000e+01 -1.003010000000000179e+00 -7.331250000000000000e+01 -1.003014999999999990e+00 -7.340625000000000000e+01 -1.003020000000000023e+00 -7.334375000000000000e+01 -1.003025000000000055e+00 -7.340625000000000000e+01 -1.003030000000000088e+00 -7.334375000000000000e+01 -1.003035000000000121e+00 -7.334375000000000000e+01 -1.003040000000000154e+00 -7.334375000000000000e+01 -1.003045000000000186e+00 -7.331250000000000000e+01 -1.003049999999999997e+00 -7.337500000000000000e+01 -1.003055000000000030e+00 -7.331250000000000000e+01 -1.003060000000000063e+00 -7.331250000000000000e+01 -1.003065000000000095e+00 -7.334375000000000000e+01 -1.003070000000000128e+00 -7.331250000000000000e+01 -1.003075000000000161e+00 -7.331250000000000000e+01 -1.003079999999999972e+00 -7.334375000000000000e+01 -1.003085000000000004e+00 -7.328125000000000000e+01 -1.003090000000000037e+00 -7.337500000000000000e+01 -1.003095000000000070e+00 -7.334375000000000000e+01 -1.003100000000000103e+00 -7.331250000000000000e+01 -1.003105000000000135e+00 -7.334375000000000000e+01 -1.003110000000000168e+00 -7.334375000000000000e+01 -1.003114999999999979e+00 -7.331250000000000000e+01 -1.003120000000000012e+00 -7.331250000000000000e+01 -1.003125000000000044e+00 -7.331250000000000000e+01 -1.003130000000000077e+00 -7.328125000000000000e+01 -1.003135000000000110e+00 -7.331250000000000000e+01 -1.003140000000000143e+00 -7.331250000000000000e+01 -1.003145000000000175e+00 -7.331250000000000000e+01 -1.003149999999999986e+00 -7.334375000000000000e+01 -1.003155000000000019e+00 -7.334375000000000000e+01 -1.003160000000000052e+00 -7.334375000000000000e+01 -1.003165000000000084e+00 -7.340625000000000000e+01 -1.003170000000000117e+00 -7.328125000000000000e+01 -1.003175000000000150e+00 -7.334375000000000000e+01 -1.003180000000000183e+00 -7.331250000000000000e+01 -1.003184999999999993e+00 -7.328125000000000000e+01 -1.003190000000000026e+00 -7.328125000000000000e+01 -1.003195000000000059e+00 -7.331250000000000000e+01 -1.003200000000000092e+00 -7.334375000000000000e+01 -1.003205000000000124e+00 -7.334375000000000000e+01 -1.003210000000000157e+00 -7.334375000000000000e+01 -1.003215000000000190e+00 -7.340625000000000000e+01 -1.003220000000000001e+00 -7.334375000000000000e+01 -1.003225000000000033e+00 -7.331250000000000000e+01 -1.003230000000000066e+00 -7.331250000000000000e+01 -1.003235000000000099e+00 -7.331250000000000000e+01 -1.003240000000000132e+00 -7.334375000000000000e+01 -1.003245000000000164e+00 -7.337500000000000000e+01 -1.003249999999999975e+00 -7.331250000000000000e+01 -1.003255000000000008e+00 -7.331250000000000000e+01 -1.003260000000000041e+00 -7.328125000000000000e+01 -1.003265000000000073e+00 -7.328125000000000000e+01 -1.003270000000000106e+00 -7.334375000000000000e+01 -1.003275000000000139e+00 -7.337500000000000000e+01 -1.003280000000000172e+00 -7.337500000000000000e+01 -1.003284999999999982e+00 -7.331250000000000000e+01 -1.003290000000000015e+00 -7.337500000000000000e+01 -1.003295000000000048e+00 -7.334375000000000000e+01 -1.003300000000000081e+00 -7.334375000000000000e+01 -1.003305000000000113e+00 -7.337500000000000000e+01 -1.003310000000000146e+00 -7.331250000000000000e+01 -1.003315000000000179e+00 -7.331250000000000000e+01 -1.003319999999999990e+00 -7.334375000000000000e+01 -1.003325000000000022e+00 -7.334375000000000000e+01 -1.003330000000000055e+00 -7.331250000000000000e+01 -1.003335000000000088e+00 -7.334375000000000000e+01 -1.003340000000000121e+00 -7.331250000000000000e+01 -1.003345000000000153e+00 -7.328125000000000000e+01 -1.003350000000000186e+00 -7.337500000000000000e+01 -1.003354999999999997e+00 -7.331250000000000000e+01 -1.003360000000000030e+00 -7.337500000000000000e+01 -1.003365000000000062e+00 -7.331250000000000000e+01 -1.003370000000000095e+00 -7.340625000000000000e+01 -1.003375000000000128e+00 -7.337500000000000000e+01 -1.003380000000000161e+00 -7.334375000000000000e+01 -1.003384999999999971e+00 -7.331250000000000000e+01 -1.003390000000000004e+00 -7.340625000000000000e+01 -1.003395000000000037e+00 -7.334375000000000000e+01 -1.003400000000000070e+00 -7.337500000000000000e+01 -1.003405000000000102e+00 -7.334375000000000000e+01 -1.003410000000000135e+00 -7.331250000000000000e+01 -1.003415000000000168e+00 -7.334375000000000000e+01 -1.003419999999999979e+00 -7.331250000000000000e+01 -1.003425000000000011e+00 -7.334375000000000000e+01 -1.003430000000000044e+00 -7.334375000000000000e+01 -1.003435000000000077e+00 -7.337500000000000000e+01 -1.003440000000000110e+00 -7.328125000000000000e+01 -1.003445000000000142e+00 -7.334375000000000000e+01 -1.003450000000000175e+00 -7.337500000000000000e+01 -1.003454999999999986e+00 -7.334375000000000000e+01 -1.003460000000000019e+00 -7.337500000000000000e+01 -1.003465000000000051e+00 -7.334375000000000000e+01 -1.003470000000000084e+00 -7.337500000000000000e+01 -1.003475000000000117e+00 -7.331250000000000000e+01 -1.003480000000000150e+00 -7.331250000000000000e+01 -1.003485000000000182e+00 -7.331250000000000000e+01 -1.003489999999999993e+00 -7.337500000000000000e+01 -1.003495000000000026e+00 -7.331250000000000000e+01 -1.003500000000000059e+00 -7.334375000000000000e+01 -1.003505000000000091e+00 -7.340625000000000000e+01 -1.003510000000000124e+00 -7.334375000000000000e+01 -1.003515000000000157e+00 -7.334375000000000000e+01 -1.003520000000000190e+00 -7.340625000000000000e+01 -1.003525000000000000e+00 -7.334375000000000000e+01 -1.003530000000000033e+00 -7.334375000000000000e+01 -1.003535000000000066e+00 -7.340625000000000000e+01 -1.003540000000000099e+00 -7.331250000000000000e+01 -1.003545000000000131e+00 -7.331250000000000000e+01 -1.003550000000000164e+00 -7.337500000000000000e+01 -1.003554999999999975e+00 -7.337500000000000000e+01 -1.003560000000000008e+00 -7.334375000000000000e+01 -1.003565000000000040e+00 -7.337500000000000000e+01 -1.003570000000000073e+00 -7.331250000000000000e+01 -1.003575000000000106e+00 -7.331250000000000000e+01 -1.003580000000000139e+00 -7.343750762939453125e+01 -1.003585000000000171e+00 -7.337500000000000000e+01 -1.003589999999999982e+00 -7.334375000000000000e+01 -1.003595000000000015e+00 -7.334375000000000000e+01 -1.003600000000000048e+00 -7.334375000000000000e+01 -1.003605000000000080e+00 -7.337500000000000000e+01 -1.003610000000000113e+00 -7.334375000000000000e+01 -1.003615000000000146e+00 -7.340625000000000000e+01 -1.003620000000000179e+00 -7.334375000000000000e+01 -1.003624999999999989e+00 -7.340625000000000000e+01 -1.003630000000000022e+00 -7.337500000000000000e+01 -1.003635000000000055e+00 -7.337500000000000000e+01 -1.003640000000000088e+00 -7.340625000000000000e+01 -1.003645000000000120e+00 -7.340625000000000000e+01 -1.003650000000000153e+00 -7.337500000000000000e+01 -1.003655000000000186e+00 -7.334375000000000000e+01 -1.003659999999999997e+00 -7.337500000000000000e+01 -1.003665000000000029e+00 -7.340625000000000000e+01 -1.003670000000000062e+00 -7.337500000000000000e+01 -1.003675000000000095e+00 -7.334375000000000000e+01 -1.003680000000000128e+00 -7.343750762939453125e+01 -1.003685000000000160e+00 -7.340625000000000000e+01 -1.003690000000000193e+00 -7.334375000000000000e+01 -1.003695000000000004e+00 -7.334375000000000000e+01 -1.003700000000000037e+00 -7.334375000000000000e+01 -1.003705000000000069e+00 -7.334375000000000000e+01 -1.003710000000000102e+00 -7.334375000000000000e+01 -1.003715000000000135e+00 -7.331250000000000000e+01 -1.003720000000000168e+00 -7.337500000000000000e+01 -1.003724999999999978e+00 -7.334375000000000000e+01 -1.003730000000000011e+00 -7.334375000000000000e+01 -1.003735000000000044e+00 -7.340625000000000000e+01 -1.003740000000000077e+00 -7.334375000000000000e+01 -1.003745000000000109e+00 -7.340625000000000000e+01 -1.003750000000000142e+00 -7.340625000000000000e+01 -1.003755000000000175e+00 -7.334375000000000000e+01 -1.003759999999999986e+00 -7.334375000000000000e+01 -1.003765000000000018e+00 -7.340625000000000000e+01 -1.003770000000000051e+00 -7.337500000000000000e+01 -1.003775000000000084e+00 -7.331250000000000000e+01 -1.003780000000000117e+00 -7.334375000000000000e+01 -1.003785000000000149e+00 -7.334375000000000000e+01 -1.003790000000000182e+00 -7.331250000000000000e+01 -1.003794999999999993e+00 -7.334375000000000000e+01 -1.003800000000000026e+00 -7.334375000000000000e+01 -1.003805000000000058e+00 -7.328125000000000000e+01 -1.003810000000000091e+00 -7.328125000000000000e+01 -1.003815000000000124e+00 -7.334375000000000000e+01 -1.003820000000000157e+00 -7.328125000000000000e+01 -1.003825000000000189e+00 -7.334375000000000000e+01 -1.003830000000000000e+00 -7.334375000000000000e+01 -1.003835000000000033e+00 -7.334375000000000000e+01 -1.003840000000000066e+00 -7.337500000000000000e+01 -1.003845000000000098e+00 -7.337500000000000000e+01 -1.003850000000000131e+00 -7.337500000000000000e+01 -1.003855000000000164e+00 -7.340625000000000000e+01 -1.003859999999999975e+00 -7.334375000000000000e+01 -1.003865000000000007e+00 -7.334375000000000000e+01 -1.003870000000000040e+00 -7.337500000000000000e+01 -1.003875000000000073e+00 -7.337500000000000000e+01 -1.003880000000000106e+00 -7.337500000000000000e+01 -1.003885000000000138e+00 -7.346875000000000000e+01 -1.003890000000000171e+00 -7.337500000000000000e+01 -1.003894999999999982e+00 -7.337500000000000000e+01 -1.003900000000000015e+00 -7.337500000000000000e+01 -1.003905000000000047e+00 -7.340625000000000000e+01 -1.003910000000000080e+00 -7.340625000000000000e+01 -1.003915000000000113e+00 -7.331250000000000000e+01 -1.003920000000000146e+00 -7.334375000000000000e+01 -1.003925000000000178e+00 -7.337500000000000000e+01 -1.003929999999999989e+00 -7.340625000000000000e+01 -1.003935000000000022e+00 -7.343750762939453125e+01 -1.003940000000000055e+00 -7.340625000000000000e+01 -1.003945000000000087e+00 -7.343750762939453125e+01 -1.003950000000000120e+00 -7.334375000000000000e+01 -1.003955000000000153e+00 -7.334375000000000000e+01 -1.003960000000000186e+00 -7.334375000000000000e+01 -1.003964999999999996e+00 -7.337500000000000000e+01 -1.003970000000000029e+00 -7.331250000000000000e+01 -1.003975000000000062e+00 -7.343750762939453125e+01 -1.003980000000000095e+00 -7.334375000000000000e+01 -1.003985000000000127e+00 -7.340625000000000000e+01 -1.003990000000000160e+00 -7.334375000000000000e+01 -1.003995000000000193e+00 -7.334375000000000000e+01 -1.004000000000000004e+00 -7.337500000000000000e+01 -1.004005000000000036e+00 -7.337500000000000000e+01 -1.004010000000000069e+00 -7.334375000000000000e+01 -1.004015000000000102e+00 -7.334375000000000000e+01 -1.004020000000000135e+00 -7.331250000000000000e+01 -1.004025000000000167e+00 -7.334375000000000000e+01 -1.004029999999999978e+00 -7.334375000000000000e+01 -1.004035000000000011e+00 -7.334375000000000000e+01 -1.004040000000000044e+00 -7.334375000000000000e+01 -1.004045000000000076e+00 -7.334375000000000000e+01 -1.004050000000000109e+00 -7.337500000000000000e+01 -1.004055000000000142e+00 -7.328125000000000000e+01 -1.004060000000000175e+00 -7.334375000000000000e+01 -1.004064999999999985e+00 -7.328125000000000000e+01 -1.004070000000000018e+00 -7.337500000000000000e+01 -1.004075000000000051e+00 -7.334375000000000000e+01 -1.004080000000000084e+00 -7.334375000000000000e+01 -1.004085000000000116e+00 -7.337500000000000000e+01 -1.004090000000000149e+00 -7.331250000000000000e+01 -1.004095000000000182e+00 -7.337500000000000000e+01 -1.004099999999999993e+00 -7.331250000000000000e+01 -1.004105000000000025e+00 -7.340625000000000000e+01 -1.004110000000000058e+00 -7.331250000000000000e+01 -1.004115000000000091e+00 -7.334375000000000000e+01 -1.004120000000000124e+00 -7.334375000000000000e+01 -1.004125000000000156e+00 -7.337500000000000000e+01 -1.004130000000000189e+00 -7.337500000000000000e+01 -1.004135000000000000e+00 -7.334375000000000000e+01 -1.004140000000000033e+00 -7.337500000000000000e+01 -1.004145000000000065e+00 -7.337500000000000000e+01 -1.004150000000000098e+00 -7.337500000000000000e+01 -1.004155000000000131e+00 -7.337500000000000000e+01 -1.004160000000000164e+00 -7.337500000000000000e+01 -1.004164999999999974e+00 -7.337500000000000000e+01 -1.004170000000000007e+00 -7.334375000000000000e+01 -1.004175000000000040e+00 -7.340625000000000000e+01 -1.004180000000000073e+00 -7.340625000000000000e+01 -1.004185000000000105e+00 -7.334375000000000000e+01 -1.004190000000000138e+00 -7.340625000000000000e+01 -1.004195000000000171e+00 -7.334375000000000000e+01 -1.004199999999999982e+00 -7.340625000000000000e+01 -1.004205000000000014e+00 -7.331250000000000000e+01 -1.004210000000000047e+00 -7.334375000000000000e+01 -1.004215000000000080e+00 -7.334375000000000000e+01 -1.004220000000000113e+00 -7.334375000000000000e+01 -1.004225000000000145e+00 -7.334375000000000000e+01 -1.004230000000000178e+00 -7.331250000000000000e+01 -1.004234999999999989e+00 -7.337500000000000000e+01 -1.004240000000000022e+00 -7.331250000000000000e+01 -1.004245000000000054e+00 -7.331250000000000000e+01 -1.004250000000000087e+00 -7.331250000000000000e+01 -1.004255000000000120e+00 -7.328125000000000000e+01 -1.004260000000000153e+00 -7.337500000000000000e+01 -1.004265000000000185e+00 -7.340625000000000000e+01 -1.004269999999999996e+00 -7.334375000000000000e+01 -1.004275000000000029e+00 -7.337500000000000000e+01 -1.004280000000000062e+00 -7.337500000000000000e+01 -1.004285000000000094e+00 -7.340625000000000000e+01 -1.004290000000000127e+00 -7.331250000000000000e+01 -1.004295000000000160e+00 -7.334375000000000000e+01 -1.004300000000000193e+00 -7.334375000000000000e+01 -1.004305000000000003e+00 -7.334375000000000000e+01 -1.004310000000000036e+00 -7.331250000000000000e+01 -1.004315000000000069e+00 -7.334375000000000000e+01 -1.004320000000000102e+00 -7.331250000000000000e+01 -1.004325000000000134e+00 -7.334375000000000000e+01 -1.004330000000000167e+00 -7.340625000000000000e+01 -1.004334999999999978e+00 -7.343750762939453125e+01 -1.004340000000000011e+00 -7.334375000000000000e+01 -1.004345000000000043e+00 -7.334375000000000000e+01 -1.004350000000000076e+00 -7.331250000000000000e+01 -1.004355000000000109e+00 -7.334375000000000000e+01 -1.004360000000000142e+00 -7.343750762939453125e+01 -1.004365000000000174e+00 -7.337500000000000000e+01 -1.004369999999999985e+00 -7.331250000000000000e+01 -1.004375000000000018e+00 -7.334375000000000000e+01 -1.004380000000000051e+00 -7.340625000000000000e+01 -1.004385000000000083e+00 -7.331250000000000000e+01 -1.004390000000000116e+00 -7.337500000000000000e+01 -1.004395000000000149e+00 -7.337500000000000000e+01 -1.004400000000000182e+00 -7.334375000000000000e+01 -1.004404999999999992e+00 -7.334375000000000000e+01 -1.004410000000000025e+00 -7.340625000000000000e+01 -1.004415000000000058e+00 -7.334375000000000000e+01 -1.004420000000000091e+00 -7.331250000000000000e+01 -1.004425000000000123e+00 -7.337500000000000000e+01 -1.004430000000000156e+00 -7.334375000000000000e+01 -1.004435000000000189e+00 -7.337500000000000000e+01 -1.004440000000000000e+00 -7.334375000000000000e+01 -1.004445000000000032e+00 -7.328125000000000000e+01 -1.004450000000000065e+00 -7.334375000000000000e+01 -1.004455000000000098e+00 -7.331250000000000000e+01 -1.004460000000000131e+00 -7.337500000000000000e+01 -1.004465000000000163e+00 -7.340625000000000000e+01 -1.004469999999999974e+00 -7.334375000000000000e+01 -1.004475000000000007e+00 -7.337500000000000000e+01 -1.004480000000000040e+00 -7.334375000000000000e+01 -1.004485000000000072e+00 -7.337500000000000000e+01 -1.004490000000000105e+00 -7.337500000000000000e+01 -1.004495000000000138e+00 -7.340625000000000000e+01 -1.004500000000000171e+00 -7.337500000000000000e+01 -1.004504999999999981e+00 -7.334375000000000000e+01 -1.004510000000000014e+00 -7.325000000000000000e+01 -1.004515000000000047e+00 -7.331250000000000000e+01 -1.004520000000000080e+00 -7.334375000000000000e+01 -1.004525000000000112e+00 -7.334375000000000000e+01 -1.004530000000000145e+00 -7.334375000000000000e+01 -1.004535000000000178e+00 -7.337500000000000000e+01 -1.004539999999999988e+00 -7.331250000000000000e+01 -1.004545000000000021e+00 -7.331250000000000000e+01 -1.004550000000000054e+00 -7.334375000000000000e+01 -1.004555000000000087e+00 -7.325000000000000000e+01 -1.004560000000000120e+00 -7.331250000000000000e+01 -1.004565000000000152e+00 -7.328125000000000000e+01 -1.004570000000000185e+00 -7.334375000000000000e+01 -1.004574999999999996e+00 -7.334375000000000000e+01 -1.004580000000000028e+00 -7.334375000000000000e+01 -1.004585000000000061e+00 -7.331250000000000000e+01 -1.004590000000000094e+00 -7.331250000000000000e+01 -1.004595000000000127e+00 -7.337500000000000000e+01 -1.004600000000000160e+00 -7.340625000000000000e+01 -1.004605000000000192e+00 -7.334375000000000000e+01 -1.004610000000000003e+00 -7.340625000000000000e+01 -1.004615000000000036e+00 -7.334375000000000000e+01 -1.004620000000000068e+00 -7.334375000000000000e+01 -1.004625000000000101e+00 -7.334375000000000000e+01 -1.004630000000000134e+00 -7.328125000000000000e+01 -1.004635000000000167e+00 -7.334375000000000000e+01 -1.004639999999999977e+00 -7.334375000000000000e+01 -1.004645000000000010e+00 -7.337500000000000000e+01 -1.004650000000000043e+00 -7.340625000000000000e+01 -1.004655000000000076e+00 -7.331250000000000000e+01 -1.004660000000000108e+00 -7.331250000000000000e+01 -1.004665000000000141e+00 -7.334375000000000000e+01 -1.004670000000000174e+00 -7.337500000000000000e+01 -1.004674999999999985e+00 -7.340625000000000000e+01 -1.004680000000000017e+00 -7.337500000000000000e+01 -1.004685000000000050e+00 -7.334375000000000000e+01 -1.004690000000000083e+00 -7.337500000000000000e+01 -1.004695000000000116e+00 -7.334375000000000000e+01 -1.004700000000000149e+00 -7.337500000000000000e+01 -1.004705000000000181e+00 -7.334375000000000000e+01 -1.004709999999999992e+00 -7.337500000000000000e+01 -1.004715000000000025e+00 -7.340625000000000000e+01 -1.004720000000000057e+00 -7.340625000000000000e+01 -1.004725000000000090e+00 -7.334375000000000000e+01 -1.004730000000000123e+00 -7.334375000000000000e+01 -1.004735000000000156e+00 -7.334375000000000000e+01 -1.004740000000000189e+00 -7.337500000000000000e+01 -1.004744999999999999e+00 -7.334375000000000000e+01 -1.004750000000000032e+00 -7.337500000000000000e+01 -1.004755000000000065e+00 -7.328125000000000000e+01 -1.004760000000000097e+00 -7.334375000000000000e+01 -1.004765000000000130e+00 -7.340625000000000000e+01 -1.004770000000000163e+00 -7.340625000000000000e+01 -1.004774999999999974e+00 -7.340625000000000000e+01 -1.004780000000000006e+00 -7.337500000000000000e+01 -1.004785000000000039e+00 -7.331250000000000000e+01 -1.004790000000000072e+00 -7.334375000000000000e+01 -1.004795000000000105e+00 -7.334375000000000000e+01 -1.004800000000000137e+00 -7.337500000000000000e+01 -1.004805000000000170e+00 -7.337500000000000000e+01 -1.004809999999999981e+00 -7.337500000000000000e+01 -1.004815000000000014e+00 -7.334375000000000000e+01 -1.004820000000000046e+00 -7.334375000000000000e+01 -1.004825000000000079e+00 -7.340625000000000000e+01 -1.004830000000000112e+00 -7.337500000000000000e+01 -1.004835000000000145e+00 -7.334375000000000000e+01 -1.004840000000000177e+00 -7.334375000000000000e+01 -1.004844999999999988e+00 -7.337500000000000000e+01 -1.004850000000000021e+00 -7.331250000000000000e+01 -1.004855000000000054e+00 -7.334375000000000000e+01 -1.004860000000000086e+00 -7.331250000000000000e+01 -1.004865000000000119e+00 -7.328125000000000000e+01 -1.004870000000000152e+00 -7.328125000000000000e+01 -1.004875000000000185e+00 -7.331250000000000000e+01 -1.004879999999999995e+00 -7.334375000000000000e+01 -1.004885000000000028e+00 -7.331250000000000000e+01 -1.004890000000000061e+00 -7.334375000000000000e+01 -1.004895000000000094e+00 -7.328125000000000000e+01 -1.004900000000000126e+00 -7.331250000000000000e+01 -1.004905000000000159e+00 -7.331250000000000000e+01 -1.004910000000000192e+00 -7.331250000000000000e+01 -1.004915000000000003e+00 -7.331250000000000000e+01 -1.004920000000000035e+00 -7.328125000000000000e+01 -1.004925000000000068e+00 -7.334375000000000000e+01 -1.004930000000000101e+00 -7.337500000000000000e+01 -1.004935000000000134e+00 -7.337500000000000000e+01 -1.004940000000000166e+00 -7.340625000000000000e+01 -1.004944999999999977e+00 -7.334375000000000000e+01 -1.004950000000000010e+00 -7.340625000000000000e+01 -1.004955000000000043e+00 -7.334375000000000000e+01 -1.004960000000000075e+00 -7.331250000000000000e+01 -1.004965000000000108e+00 -7.334375000000000000e+01 -1.004970000000000141e+00 -7.337500000000000000e+01 -1.004975000000000174e+00 -7.334375000000000000e+01 -1.004979999999999984e+00 -7.337500000000000000e+01 -1.004985000000000017e+00 -7.331250000000000000e+01 -1.004990000000000050e+00 -7.337500000000000000e+01 -1.004995000000000083e+00 -7.337500000000000000e+01 -1.005000000000000115e+00 -7.331250000000000000e+01 -1.005005000000000148e+00 -7.340625000000000000e+01 -1.005010000000000181e+00 -7.334375000000000000e+01 -1.005014999999999992e+00 -7.340625000000000000e+01 -1.005020000000000024e+00 -7.337500000000000000e+01 -1.005025000000000057e+00 -7.337500000000000000e+01 -1.005030000000000090e+00 -7.340625000000000000e+01 -1.005035000000000123e+00 -7.337500000000000000e+01 -1.005040000000000155e+00 -7.340625000000000000e+01 -1.005045000000000188e+00 -7.334375000000000000e+01 -1.005049999999999999e+00 -7.340625000000000000e+01 -1.005055000000000032e+00 -7.334375000000000000e+01 -1.005060000000000064e+00 -7.334375000000000000e+01 -1.005065000000000097e+00 -7.334375000000000000e+01 -1.005070000000000130e+00 -7.337500000000000000e+01 -1.005075000000000163e+00 -7.337500000000000000e+01 -1.005079999999999973e+00 -7.331250000000000000e+01 -1.005085000000000006e+00 -7.337500000000000000e+01 -1.005090000000000039e+00 -7.337500000000000000e+01 -1.005095000000000072e+00 -7.340625000000000000e+01 -1.005100000000000104e+00 -7.334375000000000000e+01 -1.005105000000000137e+00 -7.334375000000000000e+01 -1.005110000000000170e+00 -7.337500000000000000e+01 -1.005114999999999981e+00 -7.334375000000000000e+01 -1.005120000000000013e+00 -7.331250000000000000e+01 -1.005125000000000046e+00 -7.337500000000000000e+01 -1.005130000000000079e+00 -7.331250000000000000e+01 -1.005135000000000112e+00 -7.334375000000000000e+01 -1.005140000000000144e+00 -7.334375000000000000e+01 -1.005145000000000177e+00 -7.334375000000000000e+01 -1.005149999999999988e+00 -7.337500000000000000e+01 -1.005155000000000021e+00 -7.331250000000000000e+01 -1.005160000000000053e+00 -7.334375000000000000e+01 -1.005165000000000086e+00 -7.337500000000000000e+01 -1.005170000000000119e+00 -7.328125000000000000e+01 -1.005175000000000152e+00 -7.334375000000000000e+01 -1.005180000000000184e+00 -7.334375000000000000e+01 -1.005184999999999995e+00 -7.328125000000000000e+01 -1.005190000000000028e+00 -7.334375000000000000e+01 -1.005195000000000061e+00 -7.337500000000000000e+01 -1.005200000000000093e+00 -7.334375000000000000e+01 -1.005205000000000126e+00 -7.334375000000000000e+01 -1.005210000000000159e+00 -7.337500000000000000e+01 -1.005215000000000192e+00 -7.337500000000000000e+01 -1.005220000000000002e+00 -7.340625000000000000e+01 -1.005225000000000035e+00 -7.340625000000000000e+01 -1.005230000000000068e+00 -7.337500000000000000e+01 -1.005235000000000101e+00 -7.334375000000000000e+01 -1.005240000000000133e+00 -7.340625000000000000e+01 -1.005245000000000166e+00 -7.343750762939453125e+01 -1.005249999999999977e+00 -7.334375000000000000e+01 -1.005255000000000010e+00 -7.337500000000000000e+01 -1.005260000000000042e+00 -7.340625000000000000e+01 -1.005265000000000075e+00 -7.334375000000000000e+01 -1.005270000000000108e+00 -7.337500000000000000e+01 -1.005275000000000141e+00 -7.337500000000000000e+01 -1.005280000000000173e+00 -7.337500000000000000e+01 -1.005284999999999984e+00 -7.337500000000000000e+01 -1.005290000000000017e+00 -7.340625000000000000e+01 -1.005295000000000050e+00 -7.337500000000000000e+01 -1.005300000000000082e+00 -7.337500000000000000e+01 -1.005305000000000115e+00 -7.334375000000000000e+01 -1.005310000000000148e+00 -7.337500000000000000e+01 -1.005315000000000181e+00 -7.328125000000000000e+01 -1.005319999999999991e+00 -7.331250000000000000e+01 -1.005325000000000024e+00 -7.337500000000000000e+01 -1.005330000000000057e+00 -7.334375000000000000e+01 -1.005335000000000090e+00 -7.328125000000000000e+01 -1.005340000000000122e+00 -7.334375000000000000e+01 -1.005345000000000155e+00 -7.334375000000000000e+01 -1.005350000000000188e+00 -7.337500000000000000e+01 -1.005354999999999999e+00 -7.340625000000000000e+01 -1.005360000000000031e+00 -7.334375000000000000e+01 -1.005365000000000064e+00 -7.340625000000000000e+01 -1.005370000000000097e+00 -7.340625000000000000e+01 -1.005375000000000130e+00 -7.337500000000000000e+01 -1.005380000000000162e+00 -7.337500000000000000e+01 -1.005384999999999973e+00 -7.337500000000000000e+01 -1.005390000000000006e+00 -7.337500000000000000e+01 -1.005395000000000039e+00 -7.334375000000000000e+01 -1.005400000000000071e+00 -7.331250000000000000e+01 -1.005405000000000104e+00 -7.331250000000000000e+01 -1.005410000000000137e+00 -7.331250000000000000e+01 -1.005415000000000170e+00 -7.334375000000000000e+01 -1.005419999999999980e+00 -7.337500000000000000e+01 -1.005425000000000013e+00 -7.331250000000000000e+01 -1.005430000000000046e+00 -7.334375000000000000e+01 -1.005435000000000079e+00 -7.331250000000000000e+01 -1.005440000000000111e+00 -7.328125000000000000e+01 -1.005445000000000144e+00 -7.331250000000000000e+01 -1.005450000000000177e+00 -7.331250000000000000e+01 -1.005454999999999988e+00 -7.334375000000000000e+01 -1.005460000000000020e+00 -7.331250000000000000e+01 -1.005465000000000053e+00 -7.328125000000000000e+01 -1.005470000000000086e+00 -7.325000000000000000e+01 -1.005475000000000119e+00 -7.334375000000000000e+01 -1.005480000000000151e+00 -7.331250000000000000e+01 -1.005485000000000184e+00 -7.331250000000000000e+01 -1.005489999999999995e+00 -7.328125000000000000e+01 -1.005495000000000028e+00 -7.331250000000000000e+01 -1.005500000000000060e+00 -7.331250000000000000e+01 -1.005505000000000093e+00 -7.334375000000000000e+01 -1.005510000000000126e+00 -7.334375000000000000e+01 -1.005515000000000159e+00 -7.334375000000000000e+01 -1.005520000000000191e+00 -7.334375000000000000e+01 -1.005525000000000002e+00 -7.337500000000000000e+01 -1.005530000000000035e+00 -7.334375000000000000e+01 -1.005535000000000068e+00 -7.334375000000000000e+01 -1.005540000000000100e+00 -7.334375000000000000e+01 -1.005545000000000133e+00 -7.331250000000000000e+01 -1.005550000000000166e+00 -7.328125000000000000e+01 -1.005554999999999977e+00 -7.328125000000000000e+01 -1.005560000000000009e+00 -7.328125000000000000e+01 -1.005565000000000042e+00 -7.328125000000000000e+01 -1.005570000000000075e+00 -7.328125000000000000e+01 -1.005575000000000108e+00 -7.325000000000000000e+01 -1.005580000000000140e+00 -7.331250000000000000e+01 -1.005585000000000173e+00 -7.331250000000000000e+01 -1.005589999999999984e+00 -7.331250000000000000e+01 -1.005595000000000017e+00 -7.331250000000000000e+01 -1.005600000000000049e+00 -7.331250000000000000e+01 -1.005605000000000082e+00 -7.328125000000000000e+01 -1.005610000000000115e+00 -7.331250000000000000e+01 -1.005615000000000148e+00 -7.337500000000000000e+01 -1.005620000000000180e+00 -7.334375000000000000e+01 -1.005624999999999991e+00 -7.328125000000000000e+01 -1.005630000000000024e+00 -7.331250000000000000e+01 -1.005635000000000057e+00 -7.328125000000000000e+01 -1.005640000000000089e+00 -7.325000000000000000e+01 -1.005645000000000122e+00 -7.325000000000000000e+01 -1.005650000000000155e+00 -7.328125000000000000e+01 -1.005655000000000188e+00 -7.331250000000000000e+01 -1.005659999999999998e+00 -7.325000000000000000e+01 -1.005665000000000031e+00 -7.328125000000000000e+01 -1.005670000000000064e+00 -7.321875000000000000e+01 -1.005675000000000097e+00 -7.331250000000000000e+01 -1.005680000000000129e+00 -7.334375000000000000e+01 -1.005685000000000162e+00 -7.334375000000000000e+01 -1.005689999999999973e+00 -7.328125000000000000e+01 -1.005695000000000006e+00 -7.328125000000000000e+01 -1.005700000000000038e+00 -7.331250000000000000e+01 -1.005705000000000071e+00 -7.334375000000000000e+01 -1.005710000000000104e+00 -7.334375000000000000e+01 -1.005715000000000137e+00 -7.325000000000000000e+01 -1.005720000000000169e+00 -7.331250000000000000e+01 -1.005724999999999980e+00 -7.328125000000000000e+01 -1.005730000000000013e+00 -7.331250000000000000e+01 -1.005735000000000046e+00 -7.328125000000000000e+01 -1.005740000000000078e+00 -7.334375000000000000e+01 -1.005745000000000111e+00 -7.331250000000000000e+01 -1.005750000000000144e+00 -7.331250000000000000e+01 -1.005755000000000177e+00 -7.331250000000000000e+01 -1.005759999999999987e+00 -7.334375000000000000e+01 -1.005765000000000020e+00 -7.328125000000000000e+01 -1.005770000000000053e+00 -7.331250000000000000e+01 -1.005775000000000086e+00 -7.331250000000000000e+01 -1.005780000000000118e+00 -7.328125000000000000e+01 -1.005785000000000151e+00 -7.331250000000000000e+01 -1.005790000000000184e+00 -7.337500000000000000e+01 -1.005794999999999995e+00 -7.328125000000000000e+01 -1.005800000000000027e+00 -7.331250000000000000e+01 -1.005805000000000060e+00 -7.334375000000000000e+01 -1.005810000000000093e+00 -7.334375000000000000e+01 -1.005815000000000126e+00 -7.334375000000000000e+01 -1.005820000000000158e+00 -7.331250000000000000e+01 -1.005825000000000191e+00 -7.328125000000000000e+01 -1.005830000000000002e+00 -7.337500000000000000e+01 -1.005835000000000035e+00 -7.334375000000000000e+01 -1.005840000000000067e+00 -7.334375000000000000e+01 -1.005845000000000100e+00 -7.334375000000000000e+01 -1.005850000000000133e+00 -7.334375000000000000e+01 -1.005855000000000166e+00 -7.334375000000000000e+01 -1.005859999999999976e+00 -7.337500000000000000e+01 -1.005865000000000009e+00 -7.334375000000000000e+01 -1.005870000000000042e+00 -7.331250000000000000e+01 -1.005875000000000075e+00 -7.337500000000000000e+01 -1.005880000000000107e+00 -7.334375000000000000e+01 -1.005885000000000140e+00 -7.331250000000000000e+01 -1.005890000000000173e+00 -7.328125000000000000e+01 -1.005894999999999984e+00 -7.334375000000000000e+01 -1.005900000000000016e+00 -7.334375000000000000e+01 -1.005905000000000049e+00 -7.331250000000000000e+01 -1.005910000000000082e+00 -7.331250000000000000e+01 -1.005915000000000115e+00 -7.328125000000000000e+01 -1.005920000000000147e+00 -7.325000000000000000e+01 -1.005925000000000180e+00 -7.328125000000000000e+01 -1.005929999999999991e+00 -7.334375000000000000e+01 -1.005935000000000024e+00 -7.325000000000000000e+01 -1.005940000000000056e+00 -7.325000000000000000e+01 -1.005945000000000089e+00 -7.328125000000000000e+01 -1.005950000000000122e+00 -7.328125000000000000e+01 -1.005955000000000155e+00 -7.328125000000000000e+01 -1.005960000000000187e+00 -7.328125000000000000e+01 -1.005964999999999998e+00 -7.331250000000000000e+01 -1.005970000000000031e+00 -7.334375000000000000e+01 -1.005975000000000064e+00 -7.331250000000000000e+01 -1.005980000000000096e+00 -7.321875000000000000e+01 -1.005985000000000129e+00 -7.328125000000000000e+01 -1.005990000000000162e+00 -7.328125000000000000e+01 -1.005994999999999973e+00 -7.328125000000000000e+01 -1.006000000000000005e+00 -7.321875000000000000e+01 -1.006005000000000038e+00 -7.321875000000000000e+01 -1.006010000000000071e+00 -7.325000000000000000e+01 -1.006015000000000104e+00 -7.325000000000000000e+01 -1.006020000000000136e+00 -7.328125000000000000e+01 -1.006025000000000169e+00 -7.328125000000000000e+01 -1.006029999999999980e+00 -7.328125000000000000e+01 -1.006035000000000013e+00 -7.325000000000000000e+01 -1.006040000000000045e+00 -7.328125000000000000e+01 -1.006045000000000078e+00 -7.328125000000000000e+01 -1.006050000000000111e+00 -7.331250000000000000e+01 -1.006055000000000144e+00 -7.328125000000000000e+01 -1.006060000000000176e+00 -7.328125000000000000e+01 -1.006064999999999987e+00 -7.325000000000000000e+01 -1.006070000000000020e+00 -7.325000000000000000e+01 -1.006075000000000053e+00 -7.331250000000000000e+01 -1.006080000000000085e+00 -7.328125000000000000e+01 -1.006085000000000118e+00 -7.331250000000000000e+01 -1.006090000000000151e+00 -7.331250000000000000e+01 -1.006095000000000184e+00 -7.331250000000000000e+01 -1.006099999999999994e+00 -7.328125000000000000e+01 -1.006105000000000027e+00 -7.328125000000000000e+01 -1.006110000000000060e+00 -7.334375000000000000e+01 -1.006115000000000093e+00 -7.328125000000000000e+01 -1.006120000000000125e+00 -7.328125000000000000e+01 -1.006125000000000158e+00 -7.334375000000000000e+01 -1.006130000000000191e+00 -7.334375000000000000e+01 -1.006135000000000002e+00 -7.328125000000000000e+01 -1.006140000000000034e+00 -7.337500000000000000e+01 -1.006145000000000067e+00 -7.334375000000000000e+01 -1.006150000000000100e+00 -7.331250000000000000e+01 -1.006155000000000133e+00 -7.334375000000000000e+01 -1.006160000000000165e+00 -7.334375000000000000e+01 -1.006164999999999976e+00 -7.334375000000000000e+01 -1.006170000000000009e+00 -7.334375000000000000e+01 -1.006175000000000042e+00 -7.328125000000000000e+01 -1.006180000000000074e+00 -7.340625000000000000e+01 -1.006185000000000107e+00 -7.331250000000000000e+01 -1.006190000000000140e+00 -7.328125000000000000e+01 -1.006195000000000173e+00 -7.334375000000000000e+01 -1.006199999999999983e+00 -7.340625000000000000e+01 -1.006205000000000016e+00 -7.334375000000000000e+01 -1.006210000000000049e+00 -7.331250000000000000e+01 -1.006215000000000082e+00 -7.334375000000000000e+01 -1.006220000000000114e+00 -7.334375000000000000e+01 -1.006225000000000147e+00 -7.331250000000000000e+01 -1.006230000000000180e+00 -7.334375000000000000e+01 -1.006234999999999991e+00 -7.334375000000000000e+01 -1.006240000000000023e+00 -7.337500000000000000e+01 -1.006245000000000056e+00 -7.328125000000000000e+01 -1.006250000000000089e+00 -7.331250000000000000e+01 -1.006255000000000122e+00 -7.328125000000000000e+01 -1.006260000000000154e+00 -7.328125000000000000e+01 -1.006265000000000187e+00 -7.331250000000000000e+01 -1.006269999999999998e+00 -7.334375000000000000e+01 -1.006275000000000031e+00 -7.334375000000000000e+01 -1.006280000000000063e+00 -7.334375000000000000e+01 -1.006285000000000096e+00 -7.334375000000000000e+01 -1.006290000000000129e+00 -7.331250000000000000e+01 -1.006295000000000162e+00 -7.331250000000000000e+01 -1.006299999999999972e+00 -7.337500000000000000e+01 -1.006305000000000005e+00 -7.334375000000000000e+01 -1.006310000000000038e+00 -7.331250000000000000e+01 -1.006315000000000071e+00 -7.334375000000000000e+01 -1.006320000000000103e+00 -7.334375000000000000e+01 -1.006325000000000136e+00 -7.334375000000000000e+01 -1.006330000000000169e+00 -7.337500000000000000e+01 -1.006334999999999980e+00 -7.340625000000000000e+01 -1.006340000000000012e+00 -7.337500000000000000e+01 -1.006345000000000045e+00 -7.334375000000000000e+01 -1.006350000000000078e+00 -7.331250000000000000e+01 -1.006355000000000111e+00 -7.334375000000000000e+01 -1.006360000000000143e+00 -7.334375000000000000e+01 -1.006365000000000176e+00 -7.334375000000000000e+01 -1.006369999999999987e+00 -7.340625000000000000e+01 -1.006375000000000020e+00 -7.337500000000000000e+01 -1.006380000000000052e+00 -7.334375000000000000e+01 -1.006385000000000085e+00 -7.334375000000000000e+01 -1.006390000000000118e+00 -7.337500000000000000e+01 -1.006395000000000151e+00 -7.328125000000000000e+01 -1.006400000000000183e+00 -7.334375000000000000e+01 -1.006404999999999994e+00 -7.337500000000000000e+01 -1.006410000000000027e+00 -7.343750762939453125e+01 -1.006415000000000060e+00 -7.334375000000000000e+01 -1.006420000000000092e+00 -7.337500000000000000e+01 -1.006425000000000125e+00 -7.334375000000000000e+01 -1.006430000000000158e+00 -7.334375000000000000e+01 -1.006435000000000191e+00 -7.340625000000000000e+01 -1.006440000000000001e+00 -7.340625000000000000e+01 -1.006445000000000034e+00 -7.331250000000000000e+01 -1.006450000000000067e+00 -7.334375000000000000e+01 -1.006455000000000100e+00 -7.340625000000000000e+01 -1.006460000000000132e+00 -7.340625000000000000e+01 -1.006465000000000165e+00 -7.340625000000000000e+01 -1.006469999999999976e+00 -7.334375000000000000e+01 -1.006475000000000009e+00 -7.340625000000000000e+01 -1.006480000000000041e+00 -7.334375000000000000e+01 -1.006485000000000074e+00 -7.337500000000000000e+01 -1.006490000000000107e+00 -7.340625000000000000e+01 -1.006495000000000140e+00 -7.340625000000000000e+01 -1.006500000000000172e+00 -7.337500000000000000e+01 -1.006504999999999983e+00 -7.340625000000000000e+01 -1.006510000000000016e+00 -7.334375000000000000e+01 -1.006515000000000049e+00 -7.340625000000000000e+01 -1.006520000000000081e+00 -7.340625000000000000e+01 -1.006525000000000114e+00 -7.340625000000000000e+01 -1.006530000000000147e+00 -7.337500000000000000e+01 -1.006535000000000180e+00 -7.340625000000000000e+01 -1.006539999999999990e+00 -7.340625000000000000e+01 -1.006545000000000023e+00 -7.340625000000000000e+01 -1.006550000000000056e+00 -7.337500000000000000e+01 -1.006555000000000089e+00 -7.337500000000000000e+01 -1.006560000000000121e+00 -7.337500000000000000e+01 -1.006565000000000154e+00 -7.334375000000000000e+01 -1.006570000000000187e+00 -7.331250000000000000e+01 -1.006574999999999998e+00 -7.340625000000000000e+01 -1.006580000000000030e+00 -7.343750762939453125e+01 -1.006585000000000063e+00 -7.337500000000000000e+01 -1.006590000000000096e+00 -7.340625000000000000e+01 -1.006595000000000129e+00 -7.340625000000000000e+01 -1.006600000000000161e+00 -7.340625000000000000e+01 -1.006604999999999972e+00 -7.346875000000000000e+01 -1.006610000000000005e+00 -7.334375000000000000e+01 -1.006615000000000038e+00 -7.334375000000000000e+01 -1.006620000000000070e+00 -7.334375000000000000e+01 -1.006625000000000103e+00 -7.334375000000000000e+01 -1.006630000000000136e+00 -7.337500000000000000e+01 -1.006635000000000169e+00 -7.337500000000000000e+01 -1.006639999999999979e+00 -7.337500000000000000e+01 -1.006645000000000012e+00 -7.337500000000000000e+01 -1.006650000000000045e+00 -7.340625000000000000e+01 -1.006655000000000078e+00 -7.334375000000000000e+01 -1.006660000000000110e+00 -7.334375000000000000e+01 -1.006665000000000143e+00 -7.337500000000000000e+01 -1.006670000000000176e+00 -7.334375000000000000e+01 -1.006674999999999986e+00 -7.340625000000000000e+01 -1.006680000000000019e+00 -7.343750762939453125e+01 -1.006685000000000052e+00 -7.340625000000000000e+01 -1.006690000000000085e+00 -7.343750762939453125e+01 -1.006695000000000118e+00 -7.340625000000000000e+01 -1.006700000000000150e+00 -7.337500000000000000e+01 -1.006705000000000183e+00 -7.337500000000000000e+01 -1.006709999999999994e+00 -7.340625000000000000e+01 -1.006715000000000027e+00 -7.346875000000000000e+01 -1.006720000000000059e+00 -7.340625000000000000e+01 -1.006725000000000092e+00 -7.340625000000000000e+01 -1.006730000000000125e+00 -7.340625000000000000e+01 -1.006735000000000158e+00 -7.340625000000000000e+01 -1.006740000000000190e+00 -7.340625000000000000e+01 -1.006745000000000001e+00 -7.334375000000000000e+01 -1.006750000000000034e+00 -7.331250000000000000e+01 -1.006755000000000067e+00 -7.340625000000000000e+01 -1.006760000000000099e+00 -7.343750762939453125e+01 -1.006765000000000132e+00 -7.334375000000000000e+01 -1.006770000000000165e+00 -7.343750762939453125e+01 -1.006774999999999975e+00 -7.334375000000000000e+01 -1.006780000000000008e+00 -7.334375000000000000e+01 -1.006785000000000041e+00 -7.343750762939453125e+01 -1.006790000000000074e+00 -7.340625000000000000e+01 -1.006795000000000107e+00 -7.340625000000000000e+01 -1.006800000000000139e+00 -7.337500000000000000e+01 -1.006805000000000172e+00 -7.343750762939453125e+01 -1.006809999999999983e+00 -7.340625000000000000e+01 -1.006815000000000015e+00 -7.334375000000000000e+01 -1.006820000000000048e+00 -7.343750762939453125e+01 -1.006825000000000081e+00 -7.343750762939453125e+01 -1.006830000000000114e+00 -7.343750762939453125e+01 -1.006835000000000147e+00 -7.337500000000000000e+01 -1.006840000000000179e+00 -7.343750762939453125e+01 -1.006844999999999990e+00 -7.337500000000000000e+01 -1.006850000000000023e+00 -7.340625000000000000e+01 -1.006855000000000055e+00 -7.340625000000000000e+01 -1.006860000000000088e+00 -7.340625000000000000e+01 -1.006865000000000121e+00 -7.331250000000000000e+01 -1.006870000000000154e+00 -7.340625000000000000e+01 -1.006875000000000187e+00 -7.337500000000000000e+01 -1.006879999999999997e+00 -7.340625000000000000e+01 -1.006885000000000030e+00 -7.337500000000000000e+01 -1.006890000000000063e+00 -7.334375000000000000e+01 -1.006895000000000095e+00 -7.331250000000000000e+01 -1.006900000000000128e+00 -7.334375000000000000e+01 -1.006905000000000161e+00 -7.337500000000000000e+01 -1.006909999999999972e+00 -7.337500000000000000e+01 -1.006915000000000004e+00 -7.334375000000000000e+01 -1.006920000000000037e+00 -7.328125000000000000e+01 -1.006925000000000070e+00 -7.331250000000000000e+01 -1.006930000000000103e+00 -7.331250000000000000e+01 -1.006935000000000136e+00 -7.337500000000000000e+01 -1.006940000000000168e+00 -7.337500000000000000e+01 -1.006944999999999979e+00 -7.337500000000000000e+01 -1.006950000000000012e+00 -7.334375000000000000e+01 -1.006955000000000044e+00 -7.334375000000000000e+01 -1.006960000000000077e+00 -7.334375000000000000e+01 -1.006965000000000110e+00 -7.337500000000000000e+01 -1.006970000000000143e+00 -7.334375000000000000e+01 -1.006975000000000176e+00 -7.340625000000000000e+01 -1.006979999999999986e+00 -7.343750762939453125e+01 -1.006985000000000019e+00 -7.334375000000000000e+01 -1.006990000000000052e+00 -7.340625000000000000e+01 -1.006995000000000084e+00 -7.337500000000000000e+01 -1.007000000000000117e+00 -7.343750762939453125e+01 -1.007005000000000150e+00 -7.337500000000000000e+01 -1.007010000000000183e+00 -7.331250000000000000e+01 -1.007014999999999993e+00 -7.334375000000000000e+01 -1.007020000000000026e+00 -7.331250000000000000e+01 -1.007025000000000059e+00 -7.340625000000000000e+01 -1.007030000000000092e+00 -7.337500000000000000e+01 -1.007035000000000124e+00 -7.331250000000000000e+01 -1.007040000000000157e+00 -7.331250000000000000e+01 -1.007045000000000190e+00 -7.337500000000000000e+01 -1.007050000000000001e+00 -7.334375000000000000e+01 -1.007055000000000033e+00 -7.337500000000000000e+01 -1.007060000000000066e+00 -7.337500000000000000e+01 -1.007065000000000099e+00 -7.334375000000000000e+01 -1.007070000000000132e+00 -7.334375000000000000e+01 -1.007075000000000164e+00 -7.340625000000000000e+01 -1.007079999999999975e+00 -7.334375000000000000e+01 -1.007085000000000008e+00 -7.334375000000000000e+01 -1.007090000000000041e+00 -7.334375000000000000e+01 -1.007095000000000073e+00 -7.331250000000000000e+01 -1.007100000000000106e+00 -7.334375000000000000e+01 -1.007105000000000139e+00 -7.343750762939453125e+01 -1.007110000000000172e+00 -7.331250000000000000e+01 -1.007114999999999982e+00 -7.337500000000000000e+01 -1.007120000000000015e+00 -7.334375000000000000e+01 -1.007125000000000048e+00 -7.331250000000000000e+01 -1.007130000000000081e+00 -7.334375000000000000e+01 -1.007135000000000113e+00 -7.331250000000000000e+01 -1.007140000000000146e+00 -7.337500000000000000e+01 -1.007145000000000179e+00 -7.331250000000000000e+01 -1.007149999999999990e+00 -7.343750762939453125e+01 -1.007155000000000022e+00 -7.331250000000000000e+01 -1.007160000000000055e+00 -7.334375000000000000e+01 -1.007165000000000088e+00 -7.337500000000000000e+01 -1.007170000000000121e+00 -7.331250000000000000e+01 -1.007175000000000153e+00 -7.337500000000000000e+01 -1.007180000000000186e+00 -7.340625000000000000e+01 -1.007184999999999997e+00 -7.334375000000000000e+01 -1.007190000000000030e+00 -7.331250000000000000e+01 -1.007195000000000062e+00 -7.340625000000000000e+01 -1.007200000000000095e+00 -7.334375000000000000e+01 -1.007205000000000128e+00 -7.334375000000000000e+01 -1.007210000000000161e+00 -7.337500000000000000e+01 -1.007214999999999971e+00 -7.334375000000000000e+01 -1.007220000000000004e+00 -7.337500000000000000e+01 -1.007225000000000037e+00 -7.334375000000000000e+01 -1.007230000000000070e+00 -7.334375000000000000e+01 -1.007235000000000102e+00 -7.340625000000000000e+01 -1.007240000000000135e+00 -7.340625000000000000e+01 -1.007245000000000168e+00 -7.334375000000000000e+01 -1.007249999999999979e+00 -7.337500000000000000e+01 -1.007255000000000011e+00 -7.340625000000000000e+01 -1.007260000000000044e+00 -7.334375000000000000e+01 -1.007265000000000077e+00 -7.337500000000000000e+01 -1.007270000000000110e+00 -7.340625000000000000e+01 -1.007275000000000142e+00 -7.328125000000000000e+01 -1.007280000000000175e+00 -7.334375000000000000e+01 -1.007284999999999986e+00 -7.334375000000000000e+01 -1.007290000000000019e+00 -7.331250000000000000e+01 -1.007295000000000051e+00 -7.334375000000000000e+01 -1.007300000000000084e+00 -7.331250000000000000e+01 -1.007305000000000117e+00 -7.334375000000000000e+01 -1.007310000000000150e+00 -7.334375000000000000e+01 -1.007315000000000182e+00 -7.334375000000000000e+01 -1.007319999999999993e+00 -7.337500000000000000e+01 -1.007325000000000026e+00 -7.334375000000000000e+01 -1.007330000000000059e+00 -7.337500000000000000e+01 -1.007335000000000091e+00 -7.337500000000000000e+01 -1.007340000000000124e+00 -7.337500000000000000e+01 -1.007345000000000157e+00 -7.337500000000000000e+01 -1.007350000000000190e+00 -7.337500000000000000e+01 -1.007355000000000000e+00 -7.340625000000000000e+01 -1.007360000000000033e+00 -7.340625000000000000e+01 -1.007365000000000066e+00 -7.331250000000000000e+01 -1.007370000000000099e+00 -7.331250000000000000e+01 -1.007375000000000131e+00 -7.334375000000000000e+01 -1.007380000000000164e+00 -7.331250000000000000e+01 -1.007384999999999975e+00 -7.331250000000000000e+01 -1.007390000000000008e+00 -7.334375000000000000e+01 -1.007395000000000040e+00 -7.337500000000000000e+01 -1.007400000000000073e+00 -7.340625000000000000e+01 -1.007405000000000106e+00 -7.334375000000000000e+01 -1.007410000000000139e+00 -7.334375000000000000e+01 -1.007415000000000171e+00 -7.331250000000000000e+01 -1.007419999999999982e+00 -7.337500000000000000e+01 -1.007425000000000015e+00 -7.334375000000000000e+01 -1.007430000000000048e+00 -7.331250000000000000e+01 -1.007435000000000080e+00 -7.340625000000000000e+01 -1.007440000000000113e+00 -7.334375000000000000e+01 -1.007445000000000146e+00 -7.337500000000000000e+01 -1.007450000000000179e+00 -7.331250000000000000e+01 -1.007454999999999989e+00 -7.334375000000000000e+01 -1.007460000000000022e+00 -7.331250000000000000e+01 -1.007465000000000055e+00 -7.334375000000000000e+01 -1.007470000000000088e+00 -7.328125000000000000e+01 -1.007475000000000120e+00 -7.334375000000000000e+01 -1.007480000000000153e+00 -7.334375000000000000e+01 -1.007485000000000186e+00 -7.334375000000000000e+01 -1.007489999999999997e+00 -7.331250000000000000e+01 -1.007495000000000029e+00 -7.340625000000000000e+01 -1.007500000000000062e+00 -7.334375000000000000e+01 -1.007505000000000095e+00 -7.334375000000000000e+01 -1.007510000000000128e+00 -7.334375000000000000e+01 -1.007515000000000160e+00 -7.334375000000000000e+01 -1.007520000000000193e+00 -7.331250000000000000e+01 -1.007525000000000004e+00 -7.334375000000000000e+01 -1.007530000000000037e+00 -7.334375000000000000e+01 -1.007535000000000069e+00 -7.331250000000000000e+01 -1.007540000000000102e+00 -7.337500000000000000e+01 -1.007545000000000135e+00 -7.340625000000000000e+01 -1.007550000000000168e+00 -7.334375000000000000e+01 -1.007554999999999978e+00 -7.337500000000000000e+01 -1.007560000000000011e+00 -7.334375000000000000e+01 -1.007565000000000044e+00 -7.337500000000000000e+01 -1.007570000000000077e+00 -7.334375000000000000e+01 -1.007575000000000109e+00 -7.337500000000000000e+01 -1.007580000000000142e+00 -7.334375000000000000e+01 -1.007585000000000175e+00 -7.331250000000000000e+01 -1.007589999999999986e+00 -7.331250000000000000e+01 -1.007595000000000018e+00 -7.334375000000000000e+01 -1.007600000000000051e+00 -7.337500000000000000e+01 -1.007605000000000084e+00 -7.337500000000000000e+01 -1.007610000000000117e+00 -7.340625000000000000e+01 -1.007615000000000149e+00 -7.337500000000000000e+01 -1.007620000000000182e+00 -7.337500000000000000e+01 -1.007624999999999993e+00 -7.334375000000000000e+01 -1.007630000000000026e+00 -7.334375000000000000e+01 -1.007635000000000058e+00 -7.334375000000000000e+01 -1.007640000000000091e+00 -7.337500000000000000e+01 -1.007645000000000124e+00 -7.334375000000000000e+01 -1.007650000000000157e+00 -7.334375000000000000e+01 -1.007655000000000189e+00 -7.331250000000000000e+01 -1.007660000000000000e+00 -7.334375000000000000e+01 -1.007665000000000033e+00 -7.331250000000000000e+01 -1.007670000000000066e+00 -7.337500000000000000e+01 -1.007675000000000098e+00 -7.334375000000000000e+01 -1.007680000000000131e+00 -7.331250000000000000e+01 -1.007685000000000164e+00 -7.334375000000000000e+01 -1.007689999999999975e+00 -7.337500000000000000e+01 -1.007695000000000007e+00 -7.334375000000000000e+01 -1.007700000000000040e+00 -7.334375000000000000e+01 -1.007705000000000073e+00 -7.340625000000000000e+01 -1.007710000000000106e+00 -7.340625000000000000e+01 -1.007715000000000138e+00 -7.337500000000000000e+01 -1.007720000000000171e+00 -7.331250000000000000e+01 -1.007724999999999982e+00 -7.337500000000000000e+01 -1.007730000000000015e+00 -7.331250000000000000e+01 -1.007735000000000047e+00 -7.337500000000000000e+01 -1.007740000000000080e+00 -7.334375000000000000e+01 -1.007745000000000113e+00 -7.331250000000000000e+01 -1.007750000000000146e+00 -7.334375000000000000e+01 -1.007755000000000178e+00 -7.331250000000000000e+01 -1.007759999999999989e+00 -7.328125000000000000e+01 -1.007765000000000022e+00 -7.334375000000000000e+01 -1.007770000000000055e+00 -7.331250000000000000e+01 -1.007775000000000087e+00 -7.337500000000000000e+01 -1.007780000000000120e+00 -7.334375000000000000e+01 -1.007785000000000153e+00 -7.334375000000000000e+01 -1.007790000000000186e+00 -7.334375000000000000e+01 -1.007794999999999996e+00 -7.331250000000000000e+01 -1.007800000000000029e+00 -7.331250000000000000e+01 -1.007805000000000062e+00 -7.331250000000000000e+01 -1.007810000000000095e+00 -7.331250000000000000e+01 -1.007815000000000127e+00 -7.331250000000000000e+01 -1.007820000000000160e+00 -7.334375000000000000e+01 -1.007825000000000193e+00 -7.334375000000000000e+01 -1.007830000000000004e+00 -7.337500000000000000e+01 -1.007835000000000036e+00 -7.340625000000000000e+01 -1.007840000000000069e+00 -7.337500000000000000e+01 -1.007845000000000102e+00 -7.334375000000000000e+01 -1.007850000000000135e+00 -7.334375000000000000e+01 -1.007855000000000167e+00 -7.331250000000000000e+01 -1.007859999999999978e+00 -7.334375000000000000e+01 -1.007865000000000011e+00 -7.331250000000000000e+01 -1.007870000000000044e+00 -7.331250000000000000e+01 -1.007875000000000076e+00 -7.328125000000000000e+01 -1.007880000000000109e+00 -7.331250000000000000e+01 -1.007885000000000142e+00 -7.334375000000000000e+01 -1.007890000000000175e+00 -7.334375000000000000e+01 -1.007894999999999985e+00 -7.328125000000000000e+01 -1.007900000000000018e+00 -7.331250000000000000e+01 -1.007905000000000051e+00 -7.331250000000000000e+01 -1.007910000000000084e+00 -7.331250000000000000e+01 -1.007915000000000116e+00 -7.331250000000000000e+01 -1.007920000000000149e+00 -7.331250000000000000e+01 -1.007925000000000182e+00 -7.328125000000000000e+01 -1.007929999999999993e+00 -7.334375000000000000e+01 -1.007935000000000025e+00 -7.331250000000000000e+01 -1.007940000000000058e+00 -7.334375000000000000e+01 -1.007945000000000091e+00 -7.331250000000000000e+01 -1.007950000000000124e+00 -7.331250000000000000e+01 -1.007955000000000156e+00 -7.337500000000000000e+01 -1.007960000000000189e+00 -7.331250000000000000e+01 -1.007965000000000000e+00 -7.331250000000000000e+01 -1.007970000000000033e+00 -7.340625000000000000e+01 -1.007975000000000065e+00 -7.340625000000000000e+01 -1.007980000000000098e+00 -7.337500000000000000e+01 -1.007985000000000131e+00 -7.334375000000000000e+01 -1.007990000000000164e+00 -7.331250000000000000e+01 -1.007994999999999974e+00 -7.337500000000000000e+01 -1.008000000000000007e+00 -7.340625000000000000e+01 -1.008005000000000040e+00 -7.334375000000000000e+01 -1.008010000000000073e+00 -7.334375000000000000e+01 -1.008015000000000105e+00 -7.334375000000000000e+01 -1.008020000000000138e+00 -7.334375000000000000e+01 -1.008025000000000171e+00 -7.331250000000000000e+01 -1.008029999999999982e+00 -7.337500000000000000e+01 -1.008035000000000014e+00 -7.337500000000000000e+01 -1.008040000000000047e+00 -7.328125000000000000e+01 -1.008045000000000080e+00 -7.340625000000000000e+01 -1.008050000000000113e+00 -7.334375000000000000e+01 -1.008055000000000145e+00 -7.337500000000000000e+01 -1.008060000000000178e+00 -7.334375000000000000e+01 -1.008064999999999989e+00 -7.334375000000000000e+01 -1.008070000000000022e+00 -7.343750762939453125e+01 -1.008075000000000054e+00 -7.340625000000000000e+01 -1.008080000000000087e+00 -7.337500000000000000e+01 -1.008085000000000120e+00 -7.337500000000000000e+01 -1.008090000000000153e+00 -7.334375000000000000e+01 -1.008095000000000185e+00 -7.337500000000000000e+01 -1.008099999999999996e+00 -7.340625000000000000e+01 -1.008105000000000029e+00 -7.340625000000000000e+01 -1.008110000000000062e+00 -7.340625000000000000e+01 -1.008115000000000094e+00 -7.337500000000000000e+01 -1.008120000000000127e+00 -7.334375000000000000e+01 -1.008125000000000160e+00 -7.337500000000000000e+01 -1.008130000000000193e+00 -7.340625000000000000e+01 -1.008135000000000003e+00 -7.334375000000000000e+01 -1.008140000000000036e+00 -7.334375000000000000e+01 -1.008145000000000069e+00 -7.331250000000000000e+01 -1.008150000000000102e+00 -7.331250000000000000e+01 -1.008155000000000134e+00 -7.328125000000000000e+01 -1.008160000000000167e+00 -7.334375000000000000e+01 -1.008164999999999978e+00 -7.328125000000000000e+01 -1.008170000000000011e+00 -7.334375000000000000e+01 -1.008175000000000043e+00 -7.334375000000000000e+01 -1.008180000000000076e+00 -7.334375000000000000e+01 -1.008185000000000109e+00 -7.325000000000000000e+01 -1.008190000000000142e+00 -7.331250000000000000e+01 -1.008195000000000174e+00 -7.331250000000000000e+01 -1.008199999999999985e+00 -7.337500000000000000e+01 -1.008205000000000018e+00 -7.331250000000000000e+01 -1.008210000000000051e+00 -7.340625000000000000e+01 -1.008215000000000083e+00 -7.331250000000000000e+01 -1.008220000000000116e+00 -7.334375000000000000e+01 -1.008225000000000149e+00 -7.334375000000000000e+01 -1.008230000000000182e+00 -7.325000000000000000e+01 -1.008234999999999992e+00 -7.331250000000000000e+01 -1.008240000000000025e+00 -7.334375000000000000e+01 -1.008245000000000058e+00 -7.331250000000000000e+01 -1.008250000000000091e+00 -7.328125000000000000e+01 -1.008255000000000123e+00 -7.334375000000000000e+01 -1.008260000000000156e+00 -7.331250000000000000e+01 -1.008265000000000189e+00 -7.334375000000000000e+01 -1.008270000000000000e+00 -7.331250000000000000e+01 -1.008275000000000032e+00 -7.331250000000000000e+01 -1.008280000000000065e+00 -7.334375000000000000e+01 -1.008285000000000098e+00 -7.340625000000000000e+01 -1.008290000000000131e+00 -7.334375000000000000e+01 -1.008295000000000163e+00 -7.334375000000000000e+01 -1.008299999999999974e+00 -7.331250000000000000e+01 -1.008305000000000007e+00 -7.331250000000000000e+01 -1.008310000000000040e+00 -7.334375000000000000e+01 -1.008315000000000072e+00 -7.331250000000000000e+01 -1.008320000000000105e+00 -7.334375000000000000e+01 -1.008325000000000138e+00 -7.331250000000000000e+01 -1.008330000000000171e+00 -7.328125000000000000e+01 -1.008334999999999981e+00 -7.334375000000000000e+01 -1.008340000000000014e+00 -7.337500000000000000e+01 -1.008345000000000047e+00 -7.334375000000000000e+01 -1.008350000000000080e+00 -7.331250000000000000e+01 -1.008355000000000112e+00 -7.334375000000000000e+01 -1.008360000000000145e+00 -7.334375000000000000e+01 -1.008365000000000178e+00 -7.328125000000000000e+01 -1.008369999999999989e+00 -7.331250000000000000e+01 -1.008375000000000021e+00 -7.328125000000000000e+01 -1.008380000000000054e+00 -7.331250000000000000e+01 -1.008385000000000087e+00 -7.331250000000000000e+01 -1.008390000000000120e+00 -7.331250000000000000e+01 -1.008395000000000152e+00 -7.337500000000000000e+01 -1.008400000000000185e+00 -7.340625000000000000e+01 -1.008404999999999996e+00 -7.337500000000000000e+01 -1.008410000000000029e+00 -7.334375000000000000e+01 -1.008415000000000061e+00 -7.334375000000000000e+01 -1.008420000000000094e+00 -7.334375000000000000e+01 -1.008425000000000127e+00 -7.331250000000000000e+01 -1.008430000000000160e+00 -7.337500000000000000e+01 -1.008435000000000192e+00 -7.337500000000000000e+01 -1.008440000000000003e+00 -7.337500000000000000e+01 -1.008445000000000036e+00 -7.334375000000000000e+01 -1.008450000000000069e+00 -7.337500000000000000e+01 -1.008455000000000101e+00 -7.337500000000000000e+01 -1.008460000000000134e+00 -7.331250000000000000e+01 -1.008465000000000167e+00 -7.337500000000000000e+01 -1.008469999999999978e+00 -7.334375000000000000e+01 -1.008475000000000010e+00 -7.334375000000000000e+01 -1.008480000000000043e+00 -7.337500000000000000e+01 -1.008485000000000076e+00 -7.334375000000000000e+01 -1.008490000000000109e+00 -7.337500000000000000e+01 -1.008495000000000141e+00 -7.334375000000000000e+01 -1.008500000000000174e+00 -7.337500000000000000e+01 -1.008504999999999985e+00 -7.337500000000000000e+01 -1.008510000000000018e+00 -7.337500000000000000e+01 -1.008515000000000050e+00 -7.337500000000000000e+01 -1.008520000000000083e+00 -7.340625000000000000e+01 -1.008525000000000116e+00 -7.337500000000000000e+01 -1.008530000000000149e+00 -7.343750762939453125e+01 -1.008535000000000181e+00 -7.331250000000000000e+01 -1.008539999999999992e+00 -7.334375000000000000e+01 -1.008545000000000025e+00 -7.337500000000000000e+01 -1.008550000000000058e+00 -7.331250000000000000e+01 -1.008555000000000090e+00 -7.334375000000000000e+01 -1.008560000000000123e+00 -7.328125000000000000e+01 -1.008565000000000156e+00 -7.331250000000000000e+01 -1.008570000000000189e+00 -7.337500000000000000e+01 -1.008574999999999999e+00 -7.340625000000000000e+01 -1.008580000000000032e+00 -7.337500000000000000e+01 -1.008585000000000065e+00 -7.334375000000000000e+01 -1.008590000000000098e+00 -7.334375000000000000e+01 -1.008595000000000130e+00 -7.334375000000000000e+01 -1.008600000000000163e+00 -7.334375000000000000e+01 -1.008604999999999974e+00 -7.337500000000000000e+01 -1.008610000000000007e+00 -7.343750762939453125e+01 -1.008615000000000039e+00 -7.331250000000000000e+01 -1.008620000000000072e+00 -7.334375000000000000e+01 -1.008625000000000105e+00 -7.331250000000000000e+01 -1.008630000000000138e+00 -7.334375000000000000e+01 -1.008635000000000170e+00 -7.340625000000000000e+01 -1.008639999999999981e+00 -7.337500000000000000e+01 -1.008645000000000014e+00 -7.334375000000000000e+01 -1.008650000000000047e+00 -7.337500000000000000e+01 -1.008655000000000079e+00 -7.334375000000000000e+01 -1.008660000000000112e+00 -7.331250000000000000e+01 -1.008665000000000145e+00 -7.337500000000000000e+01 -1.008670000000000178e+00 -7.337500000000000000e+01 -1.008674999999999988e+00 -7.343750762939453125e+01 -1.008680000000000021e+00 -7.340625000000000000e+01 -1.008685000000000054e+00 -7.343750762939453125e+01 -1.008690000000000087e+00 -7.340625000000000000e+01 -1.008695000000000119e+00 -7.337500000000000000e+01 -1.008700000000000152e+00 -7.340625000000000000e+01 -1.008705000000000185e+00 -7.337500000000000000e+01 -1.008709999999999996e+00 -7.334375000000000000e+01 -1.008715000000000028e+00 -7.337500000000000000e+01 -1.008720000000000061e+00 -7.337500000000000000e+01 -1.008725000000000094e+00 -7.337500000000000000e+01 -1.008730000000000127e+00 -7.334375000000000000e+01 -1.008735000000000159e+00 -7.334375000000000000e+01 -1.008740000000000192e+00 -7.337500000000000000e+01 -1.008745000000000003e+00 -7.331250000000000000e+01 -1.008750000000000036e+00 -7.334375000000000000e+01 -1.008755000000000068e+00 -7.337500000000000000e+01 -1.008760000000000101e+00 -7.331250000000000000e+01 -1.008765000000000134e+00 -7.334375000000000000e+01 -1.008770000000000167e+00 -7.334375000000000000e+01 -1.008774999999999977e+00 -7.331250000000000000e+01 -1.008780000000000010e+00 -7.331250000000000000e+01 -1.008785000000000043e+00 -7.325000000000000000e+01 -1.008790000000000076e+00 -7.325000000000000000e+01 -1.008795000000000108e+00 -7.331250000000000000e+01 -1.008800000000000141e+00 -7.328125000000000000e+01 -1.008805000000000174e+00 -7.328125000000000000e+01 -1.008809999999999985e+00 -7.331250000000000000e+01 -1.008815000000000017e+00 -7.328125000000000000e+01 -1.008820000000000050e+00 -7.328125000000000000e+01 -1.008825000000000083e+00 -7.328125000000000000e+01 -1.008830000000000116e+00 -7.331250000000000000e+01 -1.008835000000000148e+00 -7.331250000000000000e+01 -1.008840000000000181e+00 -7.328125000000000000e+01 -1.008844999999999992e+00 -7.331250000000000000e+01 -1.008850000000000025e+00 -7.334375000000000000e+01 -1.008855000000000057e+00 -7.331250000000000000e+01 -1.008860000000000090e+00 -7.331250000000000000e+01 -1.008865000000000123e+00 -7.325000000000000000e+01 -1.008870000000000156e+00 -7.331250000000000000e+01 -1.008875000000000188e+00 -7.328125000000000000e+01 -1.008879999999999999e+00 -7.328125000000000000e+01 -1.008885000000000032e+00 -7.328125000000000000e+01 -1.008890000000000065e+00 -7.334375000000000000e+01 -1.008895000000000097e+00 -7.334375000000000000e+01 -1.008900000000000130e+00 -7.334375000000000000e+01 -1.008905000000000163e+00 -7.334375000000000000e+01 -1.008909999999999973e+00 -7.334375000000000000e+01 -1.008915000000000006e+00 -7.334375000000000000e+01 -1.008920000000000039e+00 -7.334375000000000000e+01 -1.008925000000000072e+00 -7.334375000000000000e+01 -1.008930000000000105e+00 -7.328125000000000000e+01 -1.008935000000000137e+00 -7.334375000000000000e+01 -1.008940000000000170e+00 -7.321875000000000000e+01 -1.008944999999999981e+00 -7.328125000000000000e+01 -1.008950000000000014e+00 -7.331250000000000000e+01 -1.008955000000000046e+00 -7.328125000000000000e+01 -1.008960000000000079e+00 -7.328125000000000000e+01 -1.008965000000000112e+00 -7.328125000000000000e+01 -1.008970000000000145e+00 -7.321875000000000000e+01 -1.008975000000000177e+00 -7.328125000000000000e+01 -1.008979999999999988e+00 -7.328125000000000000e+01 -1.008985000000000021e+00 -7.328125000000000000e+01 -1.008990000000000054e+00 -7.328125000000000000e+01 -1.008995000000000086e+00 -7.331250000000000000e+01 -1.009000000000000119e+00 -7.331250000000000000e+01 -1.009005000000000152e+00 -7.331250000000000000e+01 -1.009010000000000185e+00 -7.334375000000000000e+01 -1.009014999999999995e+00 -7.334375000000000000e+01 -1.009020000000000028e+00 -7.331250000000000000e+01 -1.009025000000000061e+00 -7.328125000000000000e+01 -1.009030000000000094e+00 -7.328125000000000000e+01 -1.009035000000000126e+00 -7.334375000000000000e+01 -1.009040000000000159e+00 -7.331250000000000000e+01 -1.009045000000000192e+00 -7.331250000000000000e+01 -1.009050000000000002e+00 -7.328125000000000000e+01 -1.009055000000000035e+00 -7.334375000000000000e+01 -1.009060000000000068e+00 -7.331250000000000000e+01 -1.009065000000000101e+00 -7.331250000000000000e+01 -1.009070000000000134e+00 -7.334375000000000000e+01 -1.009075000000000166e+00 -7.331250000000000000e+01 -1.009079999999999977e+00 -7.331250000000000000e+01 -1.009085000000000010e+00 -7.331250000000000000e+01 -1.009090000000000042e+00 -7.331250000000000000e+01 -1.009095000000000075e+00 -7.331250000000000000e+01 -1.009100000000000108e+00 -7.321875000000000000e+01 -1.009105000000000141e+00 -7.331250000000000000e+01 -1.009110000000000174e+00 -7.325000000000000000e+01 -1.009114999999999984e+00 -7.328125000000000000e+01 -1.009120000000000017e+00 -7.328125000000000000e+01 -1.009125000000000050e+00 -7.328125000000000000e+01 -1.009130000000000082e+00 -7.328125000000000000e+01 -1.009135000000000115e+00 -7.325000000000000000e+01 -1.009140000000000148e+00 -7.325000000000000000e+01 -1.009145000000000181e+00 -7.325000000000000000e+01 -1.009149999999999991e+00 -7.325000000000000000e+01 -1.009155000000000024e+00 -7.328125000000000000e+01 -1.009160000000000057e+00 -7.325000000000000000e+01 -1.009165000000000090e+00 -7.331250000000000000e+01 -1.009170000000000122e+00 -7.328125000000000000e+01 -1.009175000000000155e+00 -7.328125000000000000e+01 -1.009180000000000188e+00 -7.331250000000000000e+01 -1.009184999999999999e+00 -7.331250000000000000e+01 -1.009190000000000031e+00 -7.334375000000000000e+01 -1.009195000000000064e+00 -7.321875000000000000e+01 -1.009200000000000097e+00 -7.334375000000000000e+01 -1.009205000000000130e+00 -7.334375000000000000e+01 -1.009210000000000163e+00 -7.328125000000000000e+01 -1.009214999999999973e+00 -7.328125000000000000e+01 -1.009220000000000006e+00 -7.337500000000000000e+01 -1.009225000000000039e+00 -7.328125000000000000e+01 -1.009230000000000071e+00 -7.325000000000000000e+01 -1.009235000000000104e+00 -7.331250000000000000e+01 -1.009240000000000137e+00 -7.334375000000000000e+01 -1.009245000000000170e+00 -7.331250000000000000e+01 -1.009249999999999980e+00 -7.331250000000000000e+01 -1.009255000000000013e+00 -7.328125000000000000e+01 -1.009260000000000046e+00 -7.328125000000000000e+01 -1.009265000000000079e+00 -7.334375000000000000e+01 -1.009270000000000111e+00 -7.331250000000000000e+01 -1.009275000000000144e+00 -7.328125000000000000e+01 -1.009280000000000177e+00 -7.334375000000000000e+01 -1.009284999999999988e+00 -7.331250000000000000e+01 -1.009290000000000020e+00 -7.337500000000000000e+01 -1.009295000000000053e+00 -7.328125000000000000e+01 -1.009300000000000086e+00 -7.340625000000000000e+01 -1.009305000000000119e+00 -7.328125000000000000e+01 -1.009310000000000151e+00 -7.328125000000000000e+01 -1.009315000000000184e+00 -7.331250000000000000e+01 -1.009319999999999995e+00 -7.337500000000000000e+01 -1.009325000000000028e+00 -7.328125000000000000e+01 -1.009330000000000060e+00 -7.321875000000000000e+01 -1.009335000000000093e+00 -7.331250000000000000e+01 -1.009340000000000126e+00 -7.334375000000000000e+01 -1.009345000000000159e+00 -7.331250000000000000e+01 -1.009350000000000191e+00 -7.334375000000000000e+01 -1.009355000000000002e+00 -7.334375000000000000e+01 -1.009360000000000035e+00 -7.325000000000000000e+01 -1.009365000000000068e+00 -7.325000000000000000e+01 -1.009370000000000100e+00 -7.331250000000000000e+01 -1.009375000000000133e+00 -7.331250000000000000e+01 -1.009380000000000166e+00 -7.331250000000000000e+01 -1.009384999999999977e+00 -7.334375000000000000e+01 -1.009390000000000009e+00 -7.331250000000000000e+01 -1.009395000000000042e+00 -7.334375000000000000e+01 -1.009400000000000075e+00 -7.337500000000000000e+01 -1.009405000000000108e+00 -7.328125000000000000e+01 -1.009410000000000140e+00 -7.325000000000000000e+01 -1.009415000000000173e+00 -7.331250000000000000e+01 -1.009419999999999984e+00 -7.331250000000000000e+01 -1.009425000000000017e+00 -7.334375000000000000e+01 -1.009430000000000049e+00 -7.334375000000000000e+01 -1.009435000000000082e+00 -7.334375000000000000e+01 -1.009440000000000115e+00 -7.337500000000000000e+01 -1.009445000000000148e+00 -7.337500000000000000e+01 -1.009450000000000180e+00 -7.331250000000000000e+01 -1.009454999999999991e+00 -7.331250000000000000e+01 -1.009460000000000024e+00 -7.328125000000000000e+01 -1.009465000000000057e+00 -7.331250000000000000e+01 -1.009470000000000089e+00 -7.334375000000000000e+01 -1.009475000000000122e+00 -7.331250000000000000e+01 -1.009480000000000155e+00 -7.334375000000000000e+01 -1.009485000000000188e+00 -7.328125000000000000e+01 -1.009489999999999998e+00 -7.334375000000000000e+01 -1.009495000000000031e+00 -7.328125000000000000e+01 -1.009500000000000064e+00 -7.331250000000000000e+01 -1.009505000000000097e+00 -7.328125000000000000e+01 -1.009510000000000129e+00 -7.340625000000000000e+01 -1.009515000000000162e+00 -7.334375000000000000e+01 -1.009519999999999973e+00 -7.337500000000000000e+01 -1.009525000000000006e+00 -7.334375000000000000e+01 -1.009530000000000038e+00 -7.334375000000000000e+01 -1.009535000000000071e+00 -7.337500000000000000e+01 -1.009540000000000104e+00 -7.331250000000000000e+01 -1.009545000000000137e+00 -7.337500000000000000e+01 -1.009550000000000169e+00 -7.328125000000000000e+01 -1.009554999999999980e+00 -7.331250000000000000e+01 -1.009560000000000013e+00 -7.334375000000000000e+01 -1.009565000000000046e+00 -7.331250000000000000e+01 -1.009570000000000078e+00 -7.331250000000000000e+01 -1.009575000000000111e+00 -7.331250000000000000e+01 -1.009580000000000144e+00 -7.334375000000000000e+01 -1.009585000000000177e+00 -7.334375000000000000e+01 -1.009589999999999987e+00 -7.328125000000000000e+01 -1.009595000000000020e+00 -7.334375000000000000e+01 -1.009600000000000053e+00 -7.331250000000000000e+01 -1.009605000000000086e+00 -7.331250000000000000e+01 -1.009610000000000118e+00 -7.328125000000000000e+01 -1.009615000000000151e+00 -7.337500000000000000e+01 -1.009620000000000184e+00 -7.328125000000000000e+01 -1.009624999999999995e+00 -7.334375000000000000e+01 -1.009630000000000027e+00 -7.328125000000000000e+01 -1.009635000000000060e+00 -7.331250000000000000e+01 -1.009640000000000093e+00 -7.334375000000000000e+01 -1.009645000000000126e+00 -7.334375000000000000e+01 -1.009650000000000158e+00 -7.331250000000000000e+01 -1.009655000000000191e+00 -7.331250000000000000e+01 -1.009660000000000002e+00 -7.334375000000000000e+01 -1.009665000000000035e+00 -7.334375000000000000e+01 -1.009670000000000067e+00 -7.334375000000000000e+01 -1.009675000000000100e+00 -7.334375000000000000e+01 -1.009680000000000133e+00 -7.334375000000000000e+01 -1.009685000000000166e+00 -7.334375000000000000e+01 -1.009689999999999976e+00 -7.328125000000000000e+01 -1.009695000000000009e+00 -7.331250000000000000e+01 -1.009700000000000042e+00 -7.340625000000000000e+01 -1.009705000000000075e+00 -7.334375000000000000e+01 -1.009710000000000107e+00 -7.328125000000000000e+01 -1.009715000000000140e+00 -7.328125000000000000e+01 -1.009720000000000173e+00 -7.331250000000000000e+01 -1.009724999999999984e+00 -7.331250000000000000e+01 -1.009730000000000016e+00 -7.328125000000000000e+01 -1.009735000000000049e+00 -7.325000000000000000e+01 -1.009740000000000082e+00 -7.325000000000000000e+01 -1.009745000000000115e+00 -7.331250000000000000e+01 -1.009750000000000147e+00 -7.321875000000000000e+01 -1.009755000000000180e+00 -7.328125000000000000e+01 -1.009759999999999991e+00 -7.334375000000000000e+01 -1.009765000000000024e+00 -7.334375000000000000e+01 -1.009770000000000056e+00 -7.328125000000000000e+01 -1.009775000000000089e+00 -7.328125000000000000e+01 -1.009780000000000122e+00 -7.325000000000000000e+01 -1.009785000000000155e+00 -7.328125000000000000e+01 -1.009790000000000187e+00 -7.334375000000000000e+01 -1.009794999999999998e+00 -7.331250000000000000e+01 -1.009800000000000031e+00 -7.328125000000000000e+01 -1.009805000000000064e+00 -7.325000000000000000e+01 -1.009810000000000096e+00 -7.328125000000000000e+01 -1.009815000000000129e+00 -7.328125000000000000e+01 -1.009820000000000162e+00 -7.331250000000000000e+01 -1.009824999999999973e+00 -7.334375000000000000e+01 -1.009830000000000005e+00 -7.328125000000000000e+01 -1.009835000000000038e+00 -7.334375000000000000e+01 -1.009840000000000071e+00 -7.328125000000000000e+01 -1.009845000000000104e+00 -7.334375000000000000e+01 -1.009850000000000136e+00 -7.334375000000000000e+01 -1.009855000000000169e+00 -7.328125000000000000e+01 -1.009859999999999980e+00 -7.331250000000000000e+01 -1.009865000000000013e+00 -7.331250000000000000e+01 -1.009870000000000045e+00 -7.334375000000000000e+01 -1.009875000000000078e+00 -7.331250000000000000e+01 -1.009880000000000111e+00 -7.334375000000000000e+01 -1.009885000000000144e+00 -7.331250000000000000e+01 -1.009890000000000176e+00 -7.331250000000000000e+01 -1.009894999999999987e+00 -7.334375000000000000e+01 -1.009900000000000020e+00 -7.334375000000000000e+01 -1.009905000000000053e+00 -7.328125000000000000e+01 -1.009910000000000085e+00 -7.328125000000000000e+01 -1.009915000000000118e+00 -7.331250000000000000e+01 -1.009920000000000151e+00 -7.334375000000000000e+01 -1.009925000000000184e+00 -7.331250000000000000e+01 -1.009929999999999994e+00 -7.334375000000000000e+01 -1.009935000000000027e+00 -7.334375000000000000e+01 -1.009940000000000060e+00 -7.334375000000000000e+01 -1.009945000000000093e+00 -7.334375000000000000e+01 -1.009950000000000125e+00 -7.334375000000000000e+01 -1.009955000000000158e+00 -7.328125000000000000e+01 -1.009960000000000191e+00 -7.337500000000000000e+01 -1.009965000000000002e+00 -7.328125000000000000e+01 -1.009970000000000034e+00 -7.340625000000000000e+01 -1.009975000000000067e+00 -7.331250000000000000e+01 -1.009980000000000100e+00 -7.331250000000000000e+01 -1.009985000000000133e+00 -7.328125000000000000e+01 -1.009990000000000165e+00 -7.337500000000000000e+01 -1.009994999999999976e+00 -7.334375000000000000e+01 -1.010000000000000009e+00 -7.331250000000000000e+01 -1.010005000000000042e+00 -7.334375000000000000e+01 -1.010010000000000074e+00 -7.331250000000000000e+01 -1.010015000000000107e+00 -7.334375000000000000e+01 -1.010020000000000140e+00 -7.334375000000000000e+01 -1.010025000000000173e+00 -7.334375000000000000e+01 -1.010029999999999983e+00 -7.331250000000000000e+01 -1.010035000000000016e+00 -7.334375000000000000e+01 -1.010040000000000049e+00 -7.328125000000000000e+01 -1.010045000000000082e+00 -7.328125000000000000e+01 -1.010050000000000114e+00 -7.334375000000000000e+01 -1.010055000000000147e+00 -7.331250000000000000e+01 -1.010060000000000180e+00 -7.334375000000000000e+01 -1.010064999999999991e+00 -7.337500000000000000e+01 -1.010070000000000023e+00 -7.328125000000000000e+01 -1.010075000000000056e+00 -7.334375000000000000e+01 -1.010080000000000089e+00 -7.334375000000000000e+01 -1.010085000000000122e+00 -7.337500000000000000e+01 -1.010090000000000154e+00 -7.337500000000000000e+01 -1.010095000000000187e+00 -7.340625000000000000e+01 -1.010099999999999998e+00 -7.340625000000000000e+01 -1.010105000000000031e+00 -7.337500000000000000e+01 -1.010110000000000063e+00 -7.334375000000000000e+01 -1.010115000000000096e+00 -7.337500000000000000e+01 -1.010120000000000129e+00 -7.337500000000000000e+01 -1.010125000000000162e+00 -7.331250000000000000e+01 -1.010129999999999972e+00 -7.331250000000000000e+01 -1.010135000000000005e+00 -7.334375000000000000e+01 -1.010140000000000038e+00 -7.334375000000000000e+01 -1.010145000000000071e+00 -7.334375000000000000e+01 -1.010150000000000103e+00 -7.331250000000000000e+01 -1.010155000000000136e+00 -7.337500000000000000e+01 -1.010160000000000169e+00 -7.340625000000000000e+01 -1.010164999999999980e+00 -7.334375000000000000e+01 -1.010170000000000012e+00 -7.328125000000000000e+01 -1.010175000000000045e+00 -7.340625000000000000e+01 -1.010180000000000078e+00 -7.328125000000000000e+01 -1.010185000000000111e+00 -7.337500000000000000e+01 -1.010190000000000143e+00 -7.334375000000000000e+01 -1.010195000000000176e+00 -7.334375000000000000e+01 -1.010199999999999987e+00 -7.331250000000000000e+01 -1.010205000000000020e+00 -7.328125000000000000e+01 -1.010210000000000052e+00 -7.331250000000000000e+01 -1.010215000000000085e+00 -7.337500000000000000e+01 -1.010220000000000118e+00 -7.337500000000000000e+01 -1.010225000000000151e+00 -7.334375000000000000e+01 -1.010230000000000183e+00 -7.337500000000000000e+01 -1.010234999999999994e+00 -7.340625000000000000e+01 -1.010240000000000027e+00 -7.337500000000000000e+01 -1.010245000000000060e+00 -7.334375000000000000e+01 -1.010250000000000092e+00 -7.340625000000000000e+01 -1.010255000000000125e+00 -7.340625000000000000e+01 -1.010260000000000158e+00 -7.334375000000000000e+01 -1.010265000000000191e+00 -7.337500000000000000e+01 -1.010270000000000001e+00 -7.343750762939453125e+01 -1.010275000000000034e+00 -7.340625000000000000e+01 -1.010280000000000067e+00 -7.334375000000000000e+01 -1.010285000000000100e+00 -7.331250000000000000e+01 -1.010290000000000132e+00 -7.337500000000000000e+01 -1.010295000000000165e+00 -7.334375000000000000e+01 -1.010299999999999976e+00 -7.340625000000000000e+01 -1.010305000000000009e+00 -7.337500000000000000e+01 -1.010310000000000041e+00 -7.340625000000000000e+01 -1.010315000000000074e+00 -7.350000000000000000e+01 -1.010320000000000107e+00 -7.340625000000000000e+01 -1.010325000000000140e+00 -7.334375000000000000e+01 -1.010330000000000172e+00 -7.343750762939453125e+01 -1.010334999999999983e+00 -7.340625000000000000e+01 -1.010340000000000016e+00 -7.340625000000000000e+01 -1.010345000000000049e+00 -7.343750762939453125e+01 -1.010350000000000081e+00 -7.340625000000000000e+01 -1.010355000000000114e+00 -7.337500000000000000e+01 -1.010360000000000147e+00 -7.343750762939453125e+01 -1.010365000000000180e+00 -7.340625000000000000e+01 -1.010369999999999990e+00 -7.343750762939453125e+01 -1.010375000000000023e+00 -7.331250000000000000e+01 -1.010380000000000056e+00 -7.334375000000000000e+01 -1.010385000000000089e+00 -7.334375000000000000e+01 -1.010390000000000121e+00 -7.331250000000000000e+01 -1.010395000000000154e+00 -7.334375000000000000e+01 -1.010400000000000187e+00 -7.340625000000000000e+01 -1.010404999999999998e+00 -7.340625000000000000e+01 -1.010410000000000030e+00 -7.337500000000000000e+01 -1.010415000000000063e+00 -7.337500000000000000e+01 -1.010420000000000096e+00 -7.337500000000000000e+01 -1.010425000000000129e+00 -7.340625000000000000e+01 -1.010430000000000161e+00 -7.334375000000000000e+01 -1.010434999999999972e+00 -7.343750762939453125e+01 -1.010440000000000005e+00 -7.340625000000000000e+01 -1.010445000000000038e+00 -7.337500000000000000e+01 -1.010450000000000070e+00 -7.334375000000000000e+01 -1.010455000000000103e+00 -7.340625000000000000e+01 -1.010460000000000136e+00 -7.337500000000000000e+01 -1.010465000000000169e+00 -7.340625000000000000e+01 -1.010469999999999979e+00 -7.334375000000000000e+01 -1.010475000000000012e+00 -7.334375000000000000e+01 -1.010480000000000045e+00 -7.334375000000000000e+01 -1.010485000000000078e+00 -7.337500000000000000e+01 -1.010490000000000110e+00 -7.331250000000000000e+01 -1.010495000000000143e+00 -7.337500000000000000e+01 -1.010500000000000176e+00 -7.331250000000000000e+01 -1.010504999999999987e+00 -7.334375000000000000e+01 -1.010510000000000019e+00 -7.331250000000000000e+01 -1.010515000000000052e+00 -7.334375000000000000e+01 -1.010520000000000085e+00 -7.337500000000000000e+01 -1.010525000000000118e+00 -7.334375000000000000e+01 -1.010530000000000150e+00 -7.331250000000000000e+01 -1.010535000000000183e+00 -7.334375000000000000e+01 -1.010539999999999994e+00 -7.337500000000000000e+01 -1.010545000000000027e+00 -7.334375000000000000e+01 -1.010550000000000059e+00 -7.334375000000000000e+01 -1.010555000000000092e+00 -7.340625000000000000e+01 -1.010560000000000125e+00 -7.334375000000000000e+01 -1.010565000000000158e+00 -7.337500000000000000e+01 -1.010570000000000190e+00 -7.337500000000000000e+01 -1.010575000000000001e+00 -7.337500000000000000e+01 -1.010580000000000034e+00 -7.340625000000000000e+01 -1.010585000000000067e+00 -7.340625000000000000e+01 -1.010590000000000099e+00 -7.340625000000000000e+01 -1.010595000000000132e+00 -7.337500000000000000e+01 -1.010600000000000165e+00 -7.340625000000000000e+01 -1.010604999999999976e+00 -7.340625000000000000e+01 -1.010610000000000008e+00 -7.334375000000000000e+01 -1.010615000000000041e+00 -7.334375000000000000e+01 -1.010620000000000074e+00 -7.337500000000000000e+01 -1.010625000000000107e+00 -7.331250000000000000e+01 -1.010630000000000139e+00 -7.334375000000000000e+01 -1.010635000000000172e+00 -7.331250000000000000e+01 -1.010639999999999983e+00 -7.334375000000000000e+01 -1.010645000000000016e+00 -7.334375000000000000e+01 -1.010650000000000048e+00 -7.328125000000000000e+01 -1.010655000000000081e+00 -7.334375000000000000e+01 -1.010660000000000114e+00 -7.334375000000000000e+01 -1.010665000000000147e+00 -7.340625000000000000e+01 -1.010670000000000179e+00 -7.334375000000000000e+01 -1.010674999999999990e+00 -7.337500000000000000e+01 -1.010680000000000023e+00 -7.328125000000000000e+01 -1.010685000000000056e+00 -7.331250000000000000e+01 -1.010690000000000088e+00 -7.328125000000000000e+01 -1.010695000000000121e+00 -7.334375000000000000e+01 -1.010700000000000154e+00 -7.325000000000000000e+01 -1.010705000000000187e+00 -7.331250000000000000e+01 -1.010709999999999997e+00 -7.331250000000000000e+01 -1.010715000000000030e+00 -7.328125000000000000e+01 -1.010720000000000063e+00 -7.334375000000000000e+01 -1.010725000000000096e+00 -7.337500000000000000e+01 -1.010730000000000128e+00 -7.331250000000000000e+01 -1.010735000000000161e+00 -7.331250000000000000e+01 -1.010739999999999972e+00 -7.334375000000000000e+01 -1.010745000000000005e+00 -7.331250000000000000e+01 -1.010750000000000037e+00 -7.331250000000000000e+01 -1.010755000000000070e+00 -7.334375000000000000e+01 -1.010760000000000103e+00 -7.331250000000000000e+01 -1.010765000000000136e+00 -7.334375000000000000e+01 -1.010770000000000168e+00 -7.331250000000000000e+01 -1.010774999999999979e+00 -7.331250000000000000e+01 -1.010780000000000012e+00 -7.334375000000000000e+01 -1.010785000000000045e+00 -7.328125000000000000e+01 -1.010790000000000077e+00 -7.331250000000000000e+01 -1.010795000000000110e+00 -7.337500000000000000e+01 -1.010800000000000143e+00 -7.331250000000000000e+01 -1.010805000000000176e+00 -7.334375000000000000e+01 -1.010809999999999986e+00 -7.321875000000000000e+01 -1.010815000000000019e+00 -7.334375000000000000e+01 -1.010820000000000052e+00 -7.325000000000000000e+01 -1.010825000000000085e+00 -7.328125000000000000e+01 -1.010830000000000117e+00 -7.328125000000000000e+01 -1.010835000000000150e+00 -7.331250000000000000e+01 -1.010840000000000183e+00 -7.331250000000000000e+01 -1.010844999999999994e+00 -7.328125000000000000e+01 -1.010850000000000026e+00 -7.337500000000000000e+01 -1.010855000000000059e+00 -7.328125000000000000e+01 -1.010860000000000092e+00 -7.334375000000000000e+01 -1.010865000000000125e+00 -7.328125000000000000e+01 -1.010870000000000157e+00 -7.331250000000000000e+01 -1.010875000000000190e+00 -7.331250000000000000e+01 -1.010880000000000001e+00 -7.328125000000000000e+01 -1.010885000000000034e+00 -7.331250000000000000e+01 -1.010890000000000066e+00 -7.328125000000000000e+01 -1.010895000000000099e+00 -7.334375000000000000e+01 -1.010900000000000132e+00 -7.331250000000000000e+01 -1.010905000000000165e+00 -7.328125000000000000e+01 -1.010909999999999975e+00 -7.334375000000000000e+01 -1.010915000000000008e+00 -7.334375000000000000e+01 -1.010920000000000041e+00 -7.331250000000000000e+01 -1.010925000000000074e+00 -7.331250000000000000e+01 -1.010930000000000106e+00 -7.334375000000000000e+01 -1.010935000000000139e+00 -7.334375000000000000e+01 -1.010940000000000172e+00 -7.334375000000000000e+01 -1.010944999999999983e+00 -7.331250000000000000e+01 -1.010950000000000015e+00 -7.331250000000000000e+01 -1.010955000000000048e+00 -7.334375000000000000e+01 -1.010960000000000081e+00 -7.334375000000000000e+01 -1.010965000000000114e+00 -7.328125000000000000e+01 -1.010970000000000146e+00 -7.331250000000000000e+01 -1.010975000000000179e+00 -7.331250000000000000e+01 -1.010979999999999990e+00 -7.337500000000000000e+01 -1.010985000000000023e+00 -7.331250000000000000e+01 -1.010990000000000055e+00 -7.340625000000000000e+01 -1.010995000000000088e+00 -7.331250000000000000e+01 -1.011000000000000121e+00 -7.337500000000000000e+01 -1.011005000000000154e+00 -7.334375000000000000e+01 -1.011010000000000186e+00 -7.328125000000000000e+01 -1.011014999999999997e+00 -7.334375000000000000e+01 -1.011020000000000030e+00 -7.334375000000000000e+01 -1.011025000000000063e+00 -7.340625000000000000e+01 -1.011030000000000095e+00 -7.340625000000000000e+01 -1.011035000000000128e+00 -7.334375000000000000e+01 -1.011040000000000161e+00 -7.334375000000000000e+01 -1.011045000000000194e+00 -7.337500000000000000e+01 -1.011050000000000004e+00 -7.334375000000000000e+01 -1.011055000000000037e+00 -7.334375000000000000e+01 -1.011060000000000070e+00 -7.337500000000000000e+01 -1.011065000000000103e+00 -7.334375000000000000e+01 -1.011070000000000135e+00 -7.337500000000000000e+01 -1.011075000000000168e+00 -7.334375000000000000e+01 -1.011079999999999979e+00 -7.331250000000000000e+01 -1.011085000000000012e+00 -7.334375000000000000e+01 -1.011090000000000044e+00 -7.334375000000000000e+01 -1.011095000000000077e+00 -7.337500000000000000e+01 -1.011100000000000110e+00 -7.340625000000000000e+01 -1.011105000000000143e+00 -7.337500000000000000e+01 -1.011110000000000175e+00 -7.334375000000000000e+01 -1.011114999999999986e+00 -7.337500000000000000e+01 -1.011120000000000019e+00 -7.337500000000000000e+01 -1.011125000000000052e+00 -7.334375000000000000e+01 -1.011130000000000084e+00 -7.334375000000000000e+01 -1.011135000000000117e+00 -7.331250000000000000e+01 -1.011140000000000150e+00 -7.340625000000000000e+01 -1.011145000000000183e+00 -7.343750762939453125e+01 -1.011149999999999993e+00 -7.337500000000000000e+01 -1.011155000000000026e+00 -7.343750762939453125e+01 -1.011160000000000059e+00 -7.334375000000000000e+01 -1.011165000000000092e+00 -7.337500000000000000e+01 -1.011170000000000124e+00 -7.334375000000000000e+01 -1.011175000000000157e+00 -7.340625000000000000e+01 -1.011180000000000190e+00 -7.334375000000000000e+01 -1.011185000000000000e+00 -7.337500000000000000e+01 -1.011190000000000033e+00 -7.328125000000000000e+01 -1.011195000000000066e+00 -7.334375000000000000e+01 -1.011200000000000099e+00 -7.340625000000000000e+01 -1.011205000000000132e+00 -7.334375000000000000e+01 -1.011210000000000164e+00 -7.331250000000000000e+01 -1.011214999999999975e+00 -7.337500000000000000e+01 -1.011220000000000008e+00 -7.337500000000000000e+01 -1.011225000000000041e+00 -7.334375000000000000e+01 -1.011230000000000073e+00 -7.337500000000000000e+01 -1.011235000000000106e+00 -7.334375000000000000e+01 -1.011240000000000139e+00 -7.337500000000000000e+01 -1.011245000000000172e+00 -7.340625000000000000e+01 -1.011249999999999982e+00 -7.340625000000000000e+01 -1.011255000000000015e+00 -7.334375000000000000e+01 -1.011260000000000048e+00 -7.340625000000000000e+01 -1.011265000000000081e+00 -7.337500000000000000e+01 -1.011270000000000113e+00 -7.340625000000000000e+01 -1.011275000000000146e+00 -7.334375000000000000e+01 -1.011280000000000179e+00 -7.337500000000000000e+01 -1.011284999999999989e+00 -7.337500000000000000e+01 -1.011290000000000022e+00 -7.334375000000000000e+01 -1.011295000000000055e+00 -7.331250000000000000e+01 -1.011300000000000088e+00 -7.331250000000000000e+01 -1.011305000000000121e+00 -7.328125000000000000e+01 -1.011310000000000153e+00 -7.337500000000000000e+01 -1.011315000000000186e+00 -7.337500000000000000e+01 -1.011319999999999997e+00 -7.340625000000000000e+01 -1.011325000000000029e+00 -7.331250000000000000e+01 -1.011330000000000062e+00 -7.331250000000000000e+01 -1.011335000000000095e+00 -7.340625000000000000e+01 -1.011340000000000128e+00 -7.334375000000000000e+01 -1.011345000000000161e+00 -7.331250000000000000e+01 -1.011350000000000193e+00 -7.334375000000000000e+01 -1.011355000000000004e+00 -7.334375000000000000e+01 -1.011360000000000037e+00 -7.328125000000000000e+01 -1.011365000000000069e+00 -7.337500000000000000e+01 -1.011370000000000102e+00 -7.328125000000000000e+01 -1.011375000000000135e+00 -7.334375000000000000e+01 -1.011380000000000168e+00 -7.334375000000000000e+01 -1.011384999999999978e+00 -7.337500000000000000e+01 -1.011390000000000011e+00 -7.334375000000000000e+01 -1.011395000000000044e+00 -7.331250000000000000e+01 -1.011400000000000077e+00 -7.334375000000000000e+01 -1.011405000000000109e+00 -7.334375000000000000e+01 -1.011410000000000142e+00 -7.331250000000000000e+01 -1.011415000000000175e+00 -7.334375000000000000e+01 -1.011419999999999986e+00 -7.328125000000000000e+01 -1.011425000000000018e+00 -7.334375000000000000e+01 -1.011430000000000051e+00 -7.331250000000000000e+01 -1.011435000000000084e+00 -7.328125000000000000e+01 -1.011440000000000117e+00 -7.337500000000000000e+01 -1.011445000000000149e+00 -7.328125000000000000e+01 -1.011450000000000182e+00 -7.334375000000000000e+01 -1.011454999999999993e+00 -7.334375000000000000e+01 -1.011460000000000026e+00 -7.328125000000000000e+01 -1.011465000000000058e+00 -7.337500000000000000e+01 -1.011470000000000091e+00 -7.337500000000000000e+01 -1.011475000000000124e+00 -7.331250000000000000e+01 -1.011480000000000157e+00 -7.334375000000000000e+01 -1.011485000000000190e+00 -7.331250000000000000e+01 -1.011490000000000000e+00 -7.334375000000000000e+01 -1.011495000000000033e+00 -7.331250000000000000e+01 -1.011500000000000066e+00 -7.331250000000000000e+01 -1.011505000000000098e+00 -7.331250000000000000e+01 -1.011510000000000131e+00 -7.334375000000000000e+01 -1.011515000000000164e+00 -7.328125000000000000e+01 -1.011519999999999975e+00 -7.331250000000000000e+01 -1.011525000000000007e+00 -7.331250000000000000e+01 -1.011530000000000040e+00 -7.325000000000000000e+01 -1.011535000000000073e+00 -7.321875000000000000e+01 -1.011540000000000106e+00 -7.334375000000000000e+01 -1.011545000000000138e+00 -7.328125000000000000e+01 -1.011550000000000171e+00 -7.334375000000000000e+01 -1.011554999999999982e+00 -7.328125000000000000e+01 -1.011560000000000015e+00 -7.331250000000000000e+01 -1.011565000000000047e+00 -7.331250000000000000e+01 -1.011570000000000080e+00 -7.334375000000000000e+01 -1.011575000000000113e+00 -7.334375000000000000e+01 -1.011580000000000146e+00 -7.331250000000000000e+01 -1.011585000000000178e+00 -7.331250000000000000e+01 -1.011589999999999989e+00 -7.331250000000000000e+01 -1.011595000000000022e+00 -7.334375000000000000e+01 -1.011600000000000055e+00 -7.334375000000000000e+01 -1.011605000000000087e+00 -7.331250000000000000e+01 -1.011610000000000120e+00 -7.331250000000000000e+01 -1.011615000000000153e+00 -7.334375000000000000e+01 -1.011620000000000186e+00 -7.334375000000000000e+01 -1.011624999999999996e+00 -7.334375000000000000e+01 -1.011630000000000029e+00 -7.334375000000000000e+01 -1.011635000000000062e+00 -7.334375000000000000e+01 -1.011640000000000095e+00 -7.334375000000000000e+01 -1.011645000000000127e+00 -7.331250000000000000e+01 -1.011650000000000160e+00 -7.331250000000000000e+01 -1.011655000000000193e+00 -7.331250000000000000e+01 -1.011660000000000004e+00 -7.331250000000000000e+01 -1.011665000000000036e+00 -7.328125000000000000e+01 -1.011670000000000069e+00 -7.331250000000000000e+01 -1.011675000000000102e+00 -7.331250000000000000e+01 -1.011680000000000135e+00 -7.334375000000000000e+01 -1.011685000000000167e+00 -7.334375000000000000e+01 -1.011689999999999978e+00 -7.334375000000000000e+01 -1.011695000000000011e+00 -7.334375000000000000e+01 -1.011700000000000044e+00 -7.328125000000000000e+01 -1.011705000000000076e+00 -7.331250000000000000e+01 -1.011710000000000109e+00 -7.331250000000000000e+01 -1.011715000000000142e+00 -7.334375000000000000e+01 -1.011720000000000175e+00 -7.337500000000000000e+01 -1.011724999999999985e+00 -7.331250000000000000e+01 -1.011730000000000018e+00 -7.334375000000000000e+01 -1.011735000000000051e+00 -7.334375000000000000e+01 -1.011740000000000084e+00 -7.331250000000000000e+01 -1.011745000000000116e+00 -7.328125000000000000e+01 -1.011750000000000149e+00 -7.325000000000000000e+01 -1.011755000000000182e+00 -7.331250000000000000e+01 -1.011759999999999993e+00 -7.331250000000000000e+01 -1.011765000000000025e+00 -7.328125000000000000e+01 -1.011770000000000058e+00 -7.331250000000000000e+01 -1.011775000000000091e+00 -7.334375000000000000e+01 -1.011780000000000124e+00 -7.328125000000000000e+01 -1.011785000000000156e+00 -7.334375000000000000e+01 -1.011790000000000189e+00 -7.334375000000000000e+01 -1.011795000000000000e+00 -7.331250000000000000e+01 -1.011800000000000033e+00 -7.337500000000000000e+01 -1.011805000000000065e+00 -7.331250000000000000e+01 -1.011810000000000098e+00 -7.334375000000000000e+01 -1.011815000000000131e+00 -7.334375000000000000e+01 -1.011820000000000164e+00 -7.334375000000000000e+01 -1.011824999999999974e+00 -7.340625000000000000e+01 -1.011830000000000007e+00 -7.337500000000000000e+01 -1.011835000000000040e+00 -7.337500000000000000e+01 -1.011840000000000073e+00 -7.331250000000000000e+01 -1.011845000000000105e+00 -7.331250000000000000e+01 -1.011850000000000138e+00 -7.334375000000000000e+01 -1.011855000000000171e+00 -7.331250000000000000e+01 -1.011859999999999982e+00 -7.334375000000000000e+01 -1.011865000000000014e+00 -7.331250000000000000e+01 -1.011870000000000047e+00 -7.337500000000000000e+01 -1.011875000000000080e+00 -7.331250000000000000e+01 -1.011880000000000113e+00 -7.328125000000000000e+01 -1.011885000000000145e+00 -7.334375000000000000e+01 -1.011890000000000178e+00 -7.331250000000000000e+01 -1.011894999999999989e+00 -7.334375000000000000e+01 -1.011900000000000022e+00 -7.334375000000000000e+01 -1.011905000000000054e+00 -7.331250000000000000e+01 -1.011910000000000087e+00 -7.331250000000000000e+01 -1.011915000000000120e+00 -7.334375000000000000e+01 -1.011920000000000153e+00 -7.331250000000000000e+01 -1.011925000000000185e+00 -7.337500000000000000e+01 -1.011929999999999996e+00 -7.328125000000000000e+01 -1.011935000000000029e+00 -7.331250000000000000e+01 -1.011940000000000062e+00 -7.337500000000000000e+01 -1.011945000000000094e+00 -7.331250000000000000e+01 -1.011950000000000127e+00 -7.334375000000000000e+01 -1.011955000000000160e+00 -7.331250000000000000e+01 -1.011960000000000193e+00 -7.331250000000000000e+01 -1.011965000000000003e+00 -7.328125000000000000e+01 -1.011970000000000036e+00 -7.331250000000000000e+01 -1.011975000000000069e+00 -7.334375000000000000e+01 -1.011980000000000102e+00 -7.331250000000000000e+01 -1.011985000000000134e+00 -7.334375000000000000e+01 -1.011990000000000167e+00 -7.334375000000000000e+01 -1.011994999999999978e+00 -7.328125000000000000e+01 -1.012000000000000011e+00 -7.331250000000000000e+01 -1.012005000000000043e+00 -7.331250000000000000e+01 -1.012010000000000076e+00 -7.334375000000000000e+01 -1.012015000000000109e+00 -7.331250000000000000e+01 -1.012020000000000142e+00 -7.328125000000000000e+01 -1.012025000000000174e+00 -7.331250000000000000e+01 -1.012029999999999985e+00 -7.334375000000000000e+01 -1.012035000000000018e+00 -7.331250000000000000e+01 -1.012040000000000051e+00 -7.331250000000000000e+01 -1.012045000000000083e+00 -7.328125000000000000e+01 -1.012050000000000116e+00 -7.331250000000000000e+01 -1.012055000000000149e+00 -7.328125000000000000e+01 -1.012060000000000182e+00 -7.331250000000000000e+01 -1.012064999999999992e+00 -7.337500000000000000e+01 -1.012070000000000025e+00 -7.331250000000000000e+01 -1.012075000000000058e+00 -7.334375000000000000e+01 -1.012080000000000091e+00 -7.337500000000000000e+01 -1.012085000000000123e+00 -7.331250000000000000e+01 -1.012090000000000156e+00 -7.334375000000000000e+01 -1.012095000000000189e+00 -7.334375000000000000e+01 -1.012100000000000000e+00 -7.334375000000000000e+01 -1.012105000000000032e+00 -7.328125000000000000e+01 -1.012110000000000065e+00 -7.334375000000000000e+01 -1.012115000000000098e+00 -7.334375000000000000e+01 -1.012120000000000131e+00 -7.328125000000000000e+01 -1.012125000000000163e+00 -7.334375000000000000e+01 -1.012129999999999974e+00 -7.337500000000000000e+01 -1.012135000000000007e+00 -7.331250000000000000e+01 -1.012140000000000040e+00 -7.331250000000000000e+01 -1.012145000000000072e+00 -7.334375000000000000e+01 -1.012150000000000105e+00 -7.331250000000000000e+01 -1.012155000000000138e+00 -7.334375000000000000e+01 -1.012160000000000171e+00 -7.334375000000000000e+01 -1.012164999999999981e+00 -7.331250000000000000e+01 -1.012170000000000014e+00 -7.328125000000000000e+01 -1.012175000000000047e+00 -7.331250000000000000e+01 -1.012180000000000080e+00 -7.337500000000000000e+01 -1.012185000000000112e+00 -7.331250000000000000e+01 -1.012190000000000145e+00 -7.334375000000000000e+01 -1.012195000000000178e+00 -7.331250000000000000e+01 -1.012199999999999989e+00 -7.334375000000000000e+01 -1.012205000000000021e+00 -7.331250000000000000e+01 -1.012210000000000054e+00 -7.334375000000000000e+01 -1.012215000000000087e+00 -7.328125000000000000e+01 -1.012220000000000120e+00 -7.328125000000000000e+01 -1.012225000000000152e+00 -7.328125000000000000e+01 -1.012230000000000185e+00 -7.331250000000000000e+01 -1.012234999999999996e+00 -7.334375000000000000e+01 -1.012240000000000029e+00 -7.334375000000000000e+01 -1.012245000000000061e+00 -7.325000000000000000e+01 -1.012250000000000094e+00 -7.334375000000000000e+01 -1.012255000000000127e+00 -7.331250000000000000e+01 -1.012260000000000160e+00 -7.328125000000000000e+01 -1.012265000000000192e+00 -7.334375000000000000e+01 -1.012270000000000003e+00 -7.325000000000000000e+01 -1.012275000000000036e+00 -7.334375000000000000e+01 -1.012280000000000069e+00 -7.337500000000000000e+01 -1.012285000000000101e+00 -7.331250000000000000e+01 -1.012290000000000134e+00 -7.334375000000000000e+01 -1.012295000000000167e+00 -7.328125000000000000e+01 -1.012299999999999978e+00 -7.325000000000000000e+01 -1.012305000000000010e+00 -7.331250000000000000e+01 -1.012310000000000043e+00 -7.337500000000000000e+01 -1.012315000000000076e+00 -7.334375000000000000e+01 -1.012320000000000109e+00 -7.331250000000000000e+01 -1.012325000000000141e+00 -7.331250000000000000e+01 -1.012330000000000174e+00 -7.331250000000000000e+01 -1.012334999999999985e+00 -7.331250000000000000e+01 -1.012340000000000018e+00 -7.334375000000000000e+01 -1.012345000000000050e+00 -7.331250000000000000e+01 -1.012350000000000083e+00 -7.334375000000000000e+01 -1.012355000000000116e+00 -7.337500000000000000e+01 -1.012360000000000149e+00 -7.331250000000000000e+01 -1.012365000000000181e+00 -7.334375000000000000e+01 -1.012369999999999992e+00 -7.331250000000000000e+01 -1.012375000000000025e+00 -7.331250000000000000e+01 -1.012380000000000058e+00 -7.334375000000000000e+01 -1.012385000000000090e+00 -7.328125000000000000e+01 -1.012390000000000123e+00 -7.337500000000000000e+01 -1.012395000000000156e+00 -7.334375000000000000e+01 -1.012400000000000189e+00 -7.337500000000000000e+01 -1.012404999999999999e+00 -7.331250000000000000e+01 -1.012410000000000032e+00 -7.328125000000000000e+01 -1.012415000000000065e+00 -7.331250000000000000e+01 -1.012420000000000098e+00 -7.331250000000000000e+01 -1.012425000000000130e+00 -7.328125000000000000e+01 -1.012430000000000163e+00 -7.337500000000000000e+01 -1.012434999999999974e+00 -7.337500000000000000e+01 -1.012440000000000007e+00 -7.331250000000000000e+01 -1.012445000000000039e+00 -7.334375000000000000e+01 -1.012450000000000072e+00 -7.340625000000000000e+01 -1.012455000000000105e+00 -7.331250000000000000e+01 -1.012460000000000138e+00 -7.334375000000000000e+01 -1.012465000000000170e+00 -7.331250000000000000e+01 -1.012469999999999981e+00 -7.337500000000000000e+01 -1.012475000000000014e+00 -7.334375000000000000e+01 -1.012480000000000047e+00 -7.331250000000000000e+01 -1.012485000000000079e+00 -7.334375000000000000e+01 -1.012490000000000112e+00 -7.334375000000000000e+01 -1.012495000000000145e+00 -7.331250000000000000e+01 -1.012500000000000178e+00 -7.334375000000000000e+01 -1.012504999999999988e+00 -7.334375000000000000e+01 -1.012510000000000021e+00 -7.334375000000000000e+01 -1.012515000000000054e+00 -7.331250000000000000e+01 -1.012520000000000087e+00 -7.328125000000000000e+01 -1.012525000000000119e+00 -7.325000000000000000e+01 -1.012530000000000152e+00 -7.331250000000000000e+01 -1.012535000000000185e+00 -7.337500000000000000e+01 -1.012539999999999996e+00 -7.334375000000000000e+01 -1.012545000000000028e+00 -7.331250000000000000e+01 -1.012550000000000061e+00 -7.328125000000000000e+01 -1.012555000000000094e+00 -7.328125000000000000e+01 -1.012560000000000127e+00 -7.331250000000000000e+01 -1.012565000000000159e+00 -7.328125000000000000e+01 -1.012570000000000192e+00 -7.331250000000000000e+01 -1.012575000000000003e+00 -7.328125000000000000e+01 -1.012580000000000036e+00 -7.328125000000000000e+01 -1.012585000000000068e+00 -7.328125000000000000e+01 -1.012590000000000101e+00 -7.334375000000000000e+01 -1.012595000000000134e+00 -7.328125000000000000e+01 -1.012600000000000167e+00 -7.321875000000000000e+01 -1.012604999999999977e+00 -7.325000000000000000e+01 -1.012610000000000010e+00 -7.328125000000000000e+01 -1.012615000000000043e+00 -7.334375000000000000e+01 -1.012620000000000076e+00 -7.328125000000000000e+01 -1.012625000000000108e+00 -7.334375000000000000e+01 -1.012630000000000141e+00 -7.331250000000000000e+01 -1.012635000000000174e+00 -7.334375000000000000e+01 -1.012639999999999985e+00 -7.331250000000000000e+01 -1.012645000000000017e+00 -7.331250000000000000e+01 -1.012650000000000050e+00 -7.328125000000000000e+01 -1.012655000000000083e+00 -7.331250000000000000e+01 -1.012660000000000116e+00 -7.328125000000000000e+01 -1.012665000000000148e+00 -7.328125000000000000e+01 -1.012670000000000181e+00 -7.334375000000000000e+01 -1.012674999999999992e+00 -7.331250000000000000e+01 -1.012680000000000025e+00 -7.334375000000000000e+01 -1.012685000000000057e+00 -7.328125000000000000e+01 -1.012690000000000090e+00 -7.331250000000000000e+01 -1.012695000000000123e+00 -7.328125000000000000e+01 -1.012700000000000156e+00 -7.337500000000000000e+01 -1.012705000000000188e+00 -7.328125000000000000e+01 -1.012709999999999999e+00 -7.328125000000000000e+01 -1.012715000000000032e+00 -7.328125000000000000e+01 -1.012720000000000065e+00 -7.334375000000000000e+01 -1.012725000000000097e+00 -7.334375000000000000e+01 -1.012730000000000130e+00 -7.334375000000000000e+01 -1.012735000000000163e+00 -7.331250000000000000e+01 -1.012739999999999974e+00 -7.328125000000000000e+01 -1.012745000000000006e+00 -7.328125000000000000e+01 -1.012750000000000039e+00 -7.331250000000000000e+01 -1.012755000000000072e+00 -7.328125000000000000e+01 -1.012760000000000105e+00 -7.325000000000000000e+01 -1.012765000000000137e+00 -7.331250000000000000e+01 -1.012770000000000170e+00 -7.331250000000000000e+01 -1.012774999999999981e+00 -7.328125000000000000e+01 -1.012780000000000014e+00 -7.328125000000000000e+01 -1.012785000000000046e+00 -7.325000000000000000e+01 -1.012790000000000079e+00 -7.328125000000000000e+01 -1.012795000000000112e+00 -7.328125000000000000e+01 -1.012800000000000145e+00 -7.325000000000000000e+01 -1.012805000000000177e+00 -7.328125000000000000e+01 -1.012809999999999988e+00 -7.334375000000000000e+01 -1.012815000000000021e+00 -7.331250000000000000e+01 -1.012820000000000054e+00 -7.328125000000000000e+01 -1.012825000000000086e+00 -7.331250000000000000e+01 -1.012830000000000119e+00 -7.328125000000000000e+01 -1.012835000000000152e+00 -7.331250000000000000e+01 -1.012840000000000185e+00 -7.331250000000000000e+01 -1.012844999999999995e+00 -7.337500000000000000e+01 -1.012850000000000028e+00 -7.331250000000000000e+01 -1.012855000000000061e+00 -7.334375000000000000e+01 -1.012860000000000094e+00 -7.328125000000000000e+01 -1.012865000000000126e+00 -7.325000000000000000e+01 -1.012870000000000159e+00 -7.334375000000000000e+01 -1.012875000000000192e+00 -7.331250000000000000e+01 -1.012880000000000003e+00 -7.328125000000000000e+01 -1.012885000000000035e+00 -7.325000000000000000e+01 -1.012890000000000068e+00 -7.325000000000000000e+01 -1.012895000000000101e+00 -7.325000000000000000e+01 -1.012900000000000134e+00 -7.328125000000000000e+01 -1.012905000000000166e+00 -7.328125000000000000e+01 -1.012909999999999977e+00 -7.331250000000000000e+01 -1.012915000000000010e+00 -7.331250000000000000e+01 -1.012920000000000043e+00 -7.328125000000000000e+01 -1.012925000000000075e+00 -7.331250000000000000e+01 -1.012930000000000108e+00 -7.328125000000000000e+01 -1.012935000000000141e+00 -7.328125000000000000e+01 -1.012940000000000174e+00 -7.328125000000000000e+01 -1.012944999999999984e+00 -7.328125000000000000e+01 -1.012950000000000017e+00 -7.325000000000000000e+01 -1.012955000000000050e+00 -7.321875000000000000e+01 -1.012960000000000083e+00 -7.328125000000000000e+01 -1.012965000000000115e+00 -7.328125000000000000e+01 -1.012970000000000148e+00 -7.328125000000000000e+01 -1.012975000000000181e+00 -7.328125000000000000e+01 -1.012979999999999992e+00 -7.325000000000000000e+01 -1.012985000000000024e+00 -7.334375000000000000e+01 -1.012990000000000057e+00 -7.334375000000000000e+01 -1.012995000000000090e+00 -7.331250000000000000e+01 -1.013000000000000123e+00 -7.328125000000000000e+01 -1.013005000000000155e+00 -7.328125000000000000e+01 -1.013010000000000188e+00 -7.328125000000000000e+01 -1.013014999999999999e+00 -7.328125000000000000e+01 -1.013020000000000032e+00 -7.325000000000000000e+01 -1.013025000000000064e+00 -7.328125000000000000e+01 -1.013030000000000097e+00 -7.325000000000000000e+01 -1.013035000000000130e+00 -7.331250000000000000e+01 -1.013040000000000163e+00 -7.331250000000000000e+01 -1.013044999999999973e+00 -7.337500000000000000e+01 -1.013050000000000006e+00 -7.331250000000000000e+01 -1.013055000000000039e+00 -7.334375000000000000e+01 -1.013060000000000072e+00 -7.337500000000000000e+01 -1.013065000000000104e+00 -7.337500000000000000e+01 -1.013070000000000137e+00 -7.337500000000000000e+01 -1.013075000000000170e+00 -7.334375000000000000e+01 -1.013079999999999981e+00 -7.340625000000000000e+01 -1.013085000000000013e+00 -7.334375000000000000e+01 -1.013090000000000046e+00 -7.325000000000000000e+01 -1.013095000000000079e+00 -7.331250000000000000e+01 -1.013100000000000112e+00 -7.328125000000000000e+01 -1.013105000000000144e+00 -7.334375000000000000e+01 -1.013110000000000177e+00 -7.337500000000000000e+01 -1.013114999999999988e+00 -7.334375000000000000e+01 -1.013120000000000021e+00 -7.337500000000000000e+01 -1.013125000000000053e+00 -7.337500000000000000e+01 -1.013130000000000086e+00 -7.331250000000000000e+01 -1.013135000000000119e+00 -7.334375000000000000e+01 -1.013140000000000152e+00 -7.334375000000000000e+01 -1.013145000000000184e+00 -7.334375000000000000e+01 -1.013149999999999995e+00 -7.331250000000000000e+01 -1.013155000000000028e+00 -7.337500000000000000e+01 -1.013160000000000061e+00 -7.331250000000000000e+01 -1.013165000000000093e+00 -7.337500000000000000e+01 -1.013170000000000126e+00 -7.331250000000000000e+01 -1.013175000000000159e+00 -7.334375000000000000e+01 -1.013180000000000192e+00 -7.337500000000000000e+01 -1.013185000000000002e+00 -7.334375000000000000e+01 -1.013190000000000035e+00 -7.331250000000000000e+01 -1.013195000000000068e+00 -7.334375000000000000e+01 -1.013200000000000101e+00 -7.337500000000000000e+01 -1.013205000000000133e+00 -7.328125000000000000e+01 -1.013210000000000166e+00 -7.334375000000000000e+01 -1.013214999999999977e+00 -7.334375000000000000e+01 -1.013220000000000010e+00 -7.337500000000000000e+01 -1.013225000000000042e+00 -7.340625000000000000e+01 -1.013230000000000075e+00 -7.340625000000000000e+01 -1.013235000000000108e+00 -7.334375000000000000e+01 -1.013240000000000141e+00 -7.340625000000000000e+01 -1.013245000000000173e+00 -7.337500000000000000e+01 -1.013249999999999984e+00 -7.334375000000000000e+01 -1.013255000000000017e+00 -7.334375000000000000e+01 -1.013260000000000050e+00 -7.328125000000000000e+01 -1.013265000000000082e+00 -7.331250000000000000e+01 -1.013270000000000115e+00 -7.331250000000000000e+01 -1.013275000000000148e+00 -7.328125000000000000e+01 -1.013280000000000181e+00 -7.334375000000000000e+01 -1.013284999999999991e+00 -7.331250000000000000e+01 -1.013290000000000024e+00 -7.334375000000000000e+01 -1.013295000000000057e+00 -7.334375000000000000e+01 -1.013300000000000090e+00 -7.331250000000000000e+01 -1.013305000000000122e+00 -7.328125000000000000e+01 -1.013310000000000155e+00 -7.331250000000000000e+01 -1.013315000000000188e+00 -7.334375000000000000e+01 -1.013319999999999999e+00 -7.334375000000000000e+01 -1.013325000000000031e+00 -7.328125000000000000e+01 -1.013330000000000064e+00 -7.334375000000000000e+01 -1.013335000000000097e+00 -7.334375000000000000e+01 -1.013340000000000130e+00 -7.334375000000000000e+01 -1.013345000000000162e+00 -7.340625000000000000e+01 -1.013349999999999973e+00 -7.331250000000000000e+01 -1.013355000000000006e+00 -7.337500000000000000e+01 -1.013360000000000039e+00 -7.337500000000000000e+01 -1.013365000000000071e+00 -7.343750762939453125e+01 -1.013370000000000104e+00 -7.337500000000000000e+01 -1.013375000000000137e+00 -7.334375000000000000e+01 -1.013380000000000170e+00 -7.328125000000000000e+01 -1.013384999999999980e+00 -7.334375000000000000e+01 -1.013390000000000013e+00 -7.340625000000000000e+01 -1.013395000000000046e+00 -7.334375000000000000e+01 -1.013400000000000079e+00 -7.331250000000000000e+01 -1.013405000000000111e+00 -7.328125000000000000e+01 -1.013410000000000144e+00 -7.340625000000000000e+01 -1.013415000000000177e+00 -7.337500000000000000e+01 -1.013419999999999987e+00 -7.337500000000000000e+01 -1.013425000000000020e+00 -7.328125000000000000e+01 -1.013430000000000053e+00 -7.334375000000000000e+01 -1.013435000000000086e+00 -7.337500000000000000e+01 -1.013440000000000119e+00 -7.334375000000000000e+01 -1.013445000000000151e+00 -7.337500000000000000e+01 -1.013450000000000184e+00 -7.334375000000000000e+01 -1.013454999999999995e+00 -7.340625000000000000e+01 -1.013460000000000027e+00 -7.334375000000000000e+01 -1.013465000000000060e+00 -7.334375000000000000e+01 -1.013470000000000093e+00 -7.337500000000000000e+01 -1.013475000000000126e+00 -7.334375000000000000e+01 -1.013480000000000159e+00 -7.328125000000000000e+01 -1.013485000000000191e+00 -7.334375000000000000e+01 -1.013490000000000002e+00 -7.334375000000000000e+01 -1.013495000000000035e+00 -7.334375000000000000e+01 -1.013500000000000068e+00 -7.331250000000000000e+01 -1.013505000000000100e+00 -7.331250000000000000e+01 -1.013510000000000133e+00 -7.334375000000000000e+01 -1.013515000000000166e+00 -7.331250000000000000e+01 -1.013519999999999976e+00 -7.331250000000000000e+01 -1.013525000000000009e+00 -7.334375000000000000e+01 -1.013530000000000042e+00 -7.328125000000000000e+01 -1.013535000000000075e+00 -7.334375000000000000e+01 -1.013540000000000108e+00 -7.337500000000000000e+01 -1.013545000000000140e+00 -7.334375000000000000e+01 -1.013550000000000173e+00 -7.328125000000000000e+01 -1.013554999999999984e+00 -7.334375000000000000e+01 -1.013560000000000016e+00 -7.340625000000000000e+01 -1.013565000000000049e+00 -7.337500000000000000e+01 -1.013570000000000082e+00 -7.334375000000000000e+01 -1.013575000000000115e+00 -7.334375000000000000e+01 -1.013580000000000148e+00 -7.337500000000000000e+01 -1.013585000000000180e+00 -7.334375000000000000e+01 -1.013589999999999991e+00 -7.334375000000000000e+01 -1.013595000000000024e+00 -7.331250000000000000e+01 -1.013600000000000056e+00 -7.337500000000000000e+01 -1.013605000000000089e+00 -7.331250000000000000e+01 -1.013610000000000122e+00 -7.334375000000000000e+01 -1.013615000000000155e+00 -7.337500000000000000e+01 -1.013620000000000188e+00 -7.340625000000000000e+01 -1.013624999999999998e+00 -7.334375000000000000e+01 -1.013630000000000031e+00 -7.334375000000000000e+01 -1.013635000000000064e+00 -7.334375000000000000e+01 -1.013640000000000096e+00 -7.328125000000000000e+01 -1.013645000000000129e+00 -7.334375000000000000e+01 -1.013650000000000162e+00 -7.334375000000000000e+01 -1.013654999999999973e+00 -7.334375000000000000e+01 -1.013660000000000005e+00 -7.334375000000000000e+01 -1.013665000000000038e+00 -7.334375000000000000e+01 -1.013670000000000071e+00 -7.337500000000000000e+01 -1.013675000000000104e+00 -7.334375000000000000e+01 -1.013680000000000136e+00 -7.331250000000000000e+01 -1.013685000000000169e+00 -7.331250000000000000e+01 -1.013689999999999980e+00 -7.331250000000000000e+01 -1.013695000000000013e+00 -7.328125000000000000e+01 -1.013700000000000045e+00 -7.331250000000000000e+01 -1.013705000000000078e+00 -7.334375000000000000e+01 -1.013710000000000111e+00 -7.331250000000000000e+01 -1.013715000000000144e+00 -7.331250000000000000e+01 -1.013720000000000176e+00 -7.328125000000000000e+01 -1.013724999999999987e+00 -7.334375000000000000e+01 -1.013730000000000020e+00 -7.334375000000000000e+01 -1.013735000000000053e+00 -7.334375000000000000e+01 -1.013740000000000085e+00 -7.337500000000000000e+01 -1.013745000000000118e+00 -7.328125000000000000e+01 -1.013750000000000151e+00 -7.331250000000000000e+01 -1.013755000000000184e+00 -7.331250000000000000e+01 -1.013759999999999994e+00 -7.340625000000000000e+01 -1.013765000000000027e+00 -7.331250000000000000e+01 -1.013770000000000060e+00 -7.337500000000000000e+01 -1.013775000000000093e+00 -7.337500000000000000e+01 -1.013780000000000125e+00 -7.334375000000000000e+01 -1.013785000000000158e+00 -7.334375000000000000e+01 -1.013790000000000191e+00 -7.331250000000000000e+01 -1.013795000000000002e+00 -7.328125000000000000e+01 -1.013800000000000034e+00 -7.331250000000000000e+01 -1.013805000000000067e+00 -7.331250000000000000e+01 -1.013810000000000100e+00 -7.334375000000000000e+01 -1.013815000000000133e+00 -7.337500000000000000e+01 -1.013820000000000165e+00 -7.331250000000000000e+01 -1.013824999999999976e+00 -7.337500000000000000e+01 -1.013830000000000009e+00 -7.340625000000000000e+01 -1.013835000000000042e+00 -7.337500000000000000e+01 -1.013840000000000074e+00 -7.334375000000000000e+01 -1.013845000000000107e+00 -7.331250000000000000e+01 -1.013850000000000140e+00 -7.331250000000000000e+01 -1.013855000000000173e+00 -7.337500000000000000e+01 -1.013859999999999983e+00 -7.337500000000000000e+01 -1.013865000000000016e+00 -7.334375000000000000e+01 -1.013870000000000049e+00 -7.328125000000000000e+01 -1.013875000000000082e+00 -7.334375000000000000e+01 -1.013880000000000114e+00 -7.328125000000000000e+01 -1.013885000000000147e+00 -7.328125000000000000e+01 -1.013890000000000180e+00 -7.328125000000000000e+01 -1.013894999999999991e+00 -7.331250000000000000e+01 -1.013900000000000023e+00 -7.325000000000000000e+01 -1.013905000000000056e+00 -7.325000000000000000e+01 -1.013910000000000089e+00 -7.328125000000000000e+01 -1.013915000000000122e+00 -7.331250000000000000e+01 -1.013920000000000154e+00 -7.328125000000000000e+01 -1.013925000000000187e+00 -7.328125000000000000e+01 -1.013929999999999998e+00 -7.328125000000000000e+01 -1.013935000000000031e+00 -7.331250000000000000e+01 -1.013940000000000063e+00 -7.328125000000000000e+01 -1.013945000000000096e+00 -7.328125000000000000e+01 -1.013950000000000129e+00 -7.328125000000000000e+01 -1.013955000000000162e+00 -7.325000000000000000e+01 -1.013959999999999972e+00 -7.325000000000000000e+01 -1.013965000000000005e+00 -7.328125000000000000e+01 -1.013970000000000038e+00 -7.325000000000000000e+01 -1.013975000000000071e+00 -7.328125000000000000e+01 -1.013980000000000103e+00 -7.325000000000000000e+01 -1.013985000000000136e+00 -7.328125000000000000e+01 -1.013990000000000169e+00 -7.331250000000000000e+01 -1.013994999999999980e+00 -7.331250000000000000e+01 -1.014000000000000012e+00 -7.331250000000000000e+01 -1.014005000000000045e+00 -7.328125000000000000e+01 -1.014010000000000078e+00 -7.328125000000000000e+01 -1.014015000000000111e+00 -7.331250000000000000e+01 -1.014020000000000143e+00 -7.328125000000000000e+01 -1.014025000000000176e+00 -7.325000000000000000e+01 -1.014029999999999987e+00 -7.334375000000000000e+01 -1.014035000000000020e+00 -7.334375000000000000e+01 -1.014040000000000052e+00 -7.325000000000000000e+01 -1.014045000000000085e+00 -7.328125000000000000e+01 -1.014050000000000118e+00 -7.331250000000000000e+01 -1.014055000000000151e+00 -7.331250000000000000e+01 -1.014060000000000183e+00 -7.328125000000000000e+01 -1.014064999999999994e+00 -7.328125000000000000e+01 -1.014070000000000027e+00 -7.325000000000000000e+01 -1.014075000000000060e+00 -7.325000000000000000e+01 -1.014080000000000092e+00 -7.331250000000000000e+01 -1.014085000000000125e+00 -7.325000000000000000e+01 -1.014090000000000158e+00 -7.328125000000000000e+01 -1.014095000000000191e+00 -7.328125000000000000e+01 -1.014100000000000001e+00 -7.328125000000000000e+01 -1.014105000000000034e+00 -7.328125000000000000e+01 -1.014110000000000067e+00 -7.334375000000000000e+01 -1.014115000000000100e+00 -7.328125000000000000e+01 -1.014120000000000132e+00 -7.334375000000000000e+01 -1.014125000000000165e+00 -7.334375000000000000e+01 -1.014129999999999976e+00 -7.331250000000000000e+01 -1.014135000000000009e+00 -7.334375000000000000e+01 -1.014140000000000041e+00 -7.331250000000000000e+01 -1.014145000000000074e+00 -7.325000000000000000e+01 -1.014150000000000107e+00 -7.331250000000000000e+01 -1.014155000000000140e+00 -7.325000000000000000e+01 -1.014160000000000172e+00 -7.321875000000000000e+01 -1.014164999999999983e+00 -7.331250000000000000e+01 -1.014170000000000016e+00 -7.331250000000000000e+01 -1.014175000000000049e+00 -7.328125000000000000e+01 -1.014180000000000081e+00 -7.328125000000000000e+01 -1.014185000000000114e+00 -7.334375000000000000e+01 -1.014190000000000147e+00 -7.331250000000000000e+01 -1.014195000000000180e+00 -7.334375000000000000e+01 -1.014199999999999990e+00 -7.325000000000000000e+01 -1.014205000000000023e+00 -7.331250000000000000e+01 -1.014210000000000056e+00 -7.331250000000000000e+01 -1.014215000000000089e+00 -7.331250000000000000e+01 -1.014220000000000121e+00 -7.328125000000000000e+01 -1.014225000000000154e+00 -7.328125000000000000e+01 -1.014230000000000187e+00 -7.328125000000000000e+01 -1.014234999999999998e+00 -7.334375000000000000e+01 -1.014240000000000030e+00 -7.331250000000000000e+01 -1.014245000000000063e+00 -7.328125000000000000e+01 -1.014250000000000096e+00 -7.334375000000000000e+01 -1.014255000000000129e+00 -7.334375000000000000e+01 -1.014260000000000161e+00 -7.331250000000000000e+01 -1.014264999999999972e+00 -7.334375000000000000e+01 -1.014270000000000005e+00 -7.334375000000000000e+01 -1.014275000000000038e+00 -7.334375000000000000e+01 -1.014280000000000070e+00 -7.331250000000000000e+01 -1.014285000000000103e+00 -7.337500000000000000e+01 -1.014290000000000136e+00 -7.328125000000000000e+01 -1.014295000000000169e+00 -7.328125000000000000e+01 -1.014299999999999979e+00 -7.334375000000000000e+01 -1.014305000000000012e+00 -7.331250000000000000e+01 -1.014310000000000045e+00 -7.331250000000000000e+01 -1.014315000000000078e+00 -7.331250000000000000e+01 -1.014320000000000110e+00 -7.334375000000000000e+01 -1.014325000000000143e+00 -7.331250000000000000e+01 -1.014330000000000176e+00 -7.337500000000000000e+01 -1.014334999999999987e+00 -7.328125000000000000e+01 -1.014340000000000019e+00 -7.331250000000000000e+01 -1.014345000000000052e+00 -7.328125000000000000e+01 -1.014350000000000085e+00 -7.337500000000000000e+01 -1.014355000000000118e+00 -7.331250000000000000e+01 -1.014360000000000150e+00 -7.337500000000000000e+01 -1.014365000000000183e+00 -7.328125000000000000e+01 -1.014369999999999994e+00 -7.331250000000000000e+01 -1.014375000000000027e+00 -7.328125000000000000e+01 -1.014380000000000059e+00 -7.331250000000000000e+01 -1.014385000000000092e+00 -7.337500000000000000e+01 -1.014390000000000125e+00 -7.331250000000000000e+01 -1.014395000000000158e+00 -7.331250000000000000e+01 -1.014400000000000190e+00 -7.328125000000000000e+01 -1.014405000000000001e+00 -7.328125000000000000e+01 -1.014410000000000034e+00 -7.334375000000000000e+01 -1.014415000000000067e+00 -7.325000000000000000e+01 -1.014420000000000099e+00 -7.328125000000000000e+01 -1.014425000000000132e+00 -7.334375000000000000e+01 -1.014430000000000165e+00 -7.334375000000000000e+01 -1.014434999999999976e+00 -7.334375000000000000e+01 -1.014440000000000008e+00 -7.331250000000000000e+01 -1.014445000000000041e+00 -7.334375000000000000e+01 -1.014450000000000074e+00 -7.331250000000000000e+01 -1.014455000000000107e+00 -7.334375000000000000e+01 -1.014460000000000139e+00 -7.328125000000000000e+01 -1.014465000000000172e+00 -7.325000000000000000e+01 -1.014469999999999983e+00 -7.325000000000000000e+01 -1.014475000000000016e+00 -7.331250000000000000e+01 -1.014480000000000048e+00 -7.328125000000000000e+01 -1.014485000000000081e+00 -7.334375000000000000e+01 -1.014490000000000114e+00 -7.331250000000000000e+01 -1.014495000000000147e+00 -7.328125000000000000e+01 -1.014500000000000179e+00 -7.331250000000000000e+01 -1.014504999999999990e+00 -7.325000000000000000e+01 -1.014510000000000023e+00 -7.331250000000000000e+01 -1.014515000000000056e+00 -7.334375000000000000e+01 -1.014520000000000088e+00 -7.328125000000000000e+01 -1.014525000000000121e+00 -7.321875000000000000e+01 -1.014530000000000154e+00 -7.328125000000000000e+01 -1.014535000000000187e+00 -7.334375000000000000e+01 -1.014539999999999997e+00 -7.328125000000000000e+01 -1.014545000000000030e+00 -7.328125000000000000e+01 -1.014550000000000063e+00 -7.325000000000000000e+01 -1.014555000000000096e+00 -7.334375000000000000e+01 -1.014560000000000128e+00 -7.337500000000000000e+01 -1.014565000000000161e+00 -7.328125000000000000e+01 -1.014570000000000194e+00 -7.331250000000000000e+01 -1.014575000000000005e+00 -7.331250000000000000e+01 -1.014580000000000037e+00 -7.331250000000000000e+01 -1.014585000000000070e+00 -7.331250000000000000e+01 -1.014590000000000103e+00 -7.331250000000000000e+01 -1.014595000000000136e+00 -7.331250000000000000e+01 -1.014600000000000168e+00 -7.331250000000000000e+01 -1.014604999999999979e+00 -7.337500000000000000e+01 -1.014610000000000012e+00 -7.334375000000000000e+01 -1.014615000000000045e+00 -7.331250000000000000e+01 -1.014620000000000077e+00 -7.337500000000000000e+01 -1.014625000000000110e+00 -7.334375000000000000e+01 -1.014630000000000143e+00 -7.328125000000000000e+01 -1.014635000000000176e+00 -7.334375000000000000e+01 -1.014639999999999986e+00 -7.328125000000000000e+01 -1.014645000000000019e+00 -7.340625000000000000e+01 -1.014650000000000052e+00 -7.334375000000000000e+01 -1.014655000000000085e+00 -7.331250000000000000e+01 -1.014660000000000117e+00 -7.331250000000000000e+01 -1.014665000000000150e+00 -7.334375000000000000e+01 -1.014670000000000183e+00 -7.328125000000000000e+01 -1.014674999999999994e+00 -7.328125000000000000e+01 -1.014680000000000026e+00 -7.331250000000000000e+01 -1.014685000000000059e+00 -7.328125000000000000e+01 -1.014690000000000092e+00 -7.321875000000000000e+01 -1.014695000000000125e+00 -7.328125000000000000e+01 -1.014700000000000157e+00 -7.328125000000000000e+01 -1.014705000000000190e+00 -7.331250000000000000e+01 -1.014710000000000001e+00 -7.325000000000000000e+01 -1.014715000000000034e+00 -7.328125000000000000e+01 -1.014720000000000066e+00 -7.328125000000000000e+01 -1.014725000000000099e+00 -7.331250000000000000e+01 -1.014730000000000132e+00 -7.328125000000000000e+01 -1.014735000000000165e+00 -7.337500000000000000e+01 -1.014739999999999975e+00 -7.334375000000000000e+01 -1.014745000000000008e+00 -7.334375000000000000e+01 -1.014750000000000041e+00 -7.334375000000000000e+01 -1.014755000000000074e+00 -7.328125000000000000e+01 -1.014760000000000106e+00 -7.331250000000000000e+01 -1.014765000000000139e+00 -7.328125000000000000e+01 -1.014770000000000172e+00 -7.331250000000000000e+01 -1.014774999999999983e+00 -7.331250000000000000e+01 -1.014780000000000015e+00 -7.328125000000000000e+01 -1.014785000000000048e+00 -7.337500000000000000e+01 -1.014790000000000081e+00 -7.334375000000000000e+01 -1.014795000000000114e+00 -7.334375000000000000e+01 -1.014800000000000146e+00 -7.331250000000000000e+01 -1.014805000000000179e+00 -7.325000000000000000e+01 -1.014809999999999990e+00 -7.334375000000000000e+01 -1.014815000000000023e+00 -7.328125000000000000e+01 -1.014820000000000055e+00 -7.334375000000000000e+01 -1.014825000000000088e+00 -7.328125000000000000e+01 -1.014830000000000121e+00 -7.334375000000000000e+01 -1.014835000000000154e+00 -7.334375000000000000e+01 -1.014840000000000186e+00 -7.340625000000000000e+01 -1.014844999999999997e+00 -7.331250000000000000e+01 -1.014850000000000030e+00 -7.337500000000000000e+01 -1.014855000000000063e+00 -7.331250000000000000e+01 -1.014860000000000095e+00 -7.334375000000000000e+01 -1.014865000000000128e+00 -7.328125000000000000e+01 -1.014870000000000161e+00 -7.328125000000000000e+01 -1.014875000000000194e+00 -7.328125000000000000e+01 -1.014880000000000004e+00 -7.331250000000000000e+01 -1.014885000000000037e+00 -7.328125000000000000e+01 -1.014890000000000070e+00 -7.328125000000000000e+01 -1.014895000000000103e+00 -7.331250000000000000e+01 -1.014900000000000135e+00 -7.325000000000000000e+01 -1.014905000000000168e+00 -7.328125000000000000e+01 -1.014909999999999979e+00 -7.331250000000000000e+01 -1.014915000000000012e+00 -7.331250000000000000e+01 -1.014920000000000044e+00 -7.331250000000000000e+01 -1.014925000000000077e+00 -7.331250000000000000e+01 -1.014930000000000110e+00 -7.328125000000000000e+01 -1.014935000000000143e+00 -7.328125000000000000e+01 -1.014940000000000175e+00 -7.331250000000000000e+01 -1.014944999999999986e+00 -7.328125000000000000e+01 -1.014950000000000019e+00 -7.331250000000000000e+01 -1.014955000000000052e+00 -7.334375000000000000e+01 -1.014960000000000084e+00 -7.331250000000000000e+01 -1.014965000000000117e+00 -7.331250000000000000e+01 -1.014970000000000150e+00 -7.328125000000000000e+01 -1.014975000000000183e+00 -7.328125000000000000e+01 -1.014979999999999993e+00 -7.331250000000000000e+01 -1.014985000000000026e+00 -7.331250000000000000e+01 -1.014990000000000059e+00 -7.328125000000000000e+01 -1.014995000000000092e+00 -7.337500000000000000e+01 -1.015000000000000124e+00 -7.328125000000000000e+01 -1.015005000000000157e+00 -7.331250000000000000e+01 -1.015010000000000190e+00 -7.321875000000000000e+01 -1.015015000000000001e+00 -7.328125000000000000e+01 -1.015020000000000033e+00 -7.334375000000000000e+01 -1.015025000000000066e+00 -7.337500000000000000e+01 -1.015030000000000099e+00 -7.331250000000000000e+01 -1.015035000000000132e+00 -7.334375000000000000e+01 -1.015040000000000164e+00 -7.331250000000000000e+01 -1.015044999999999975e+00 -7.337500000000000000e+01 -1.015050000000000008e+00 -7.334375000000000000e+01 -1.015055000000000041e+00 -7.337500000000000000e+01 -1.015060000000000073e+00 -7.334375000000000000e+01 -1.015065000000000106e+00 -7.331250000000000000e+01 -1.015070000000000139e+00 -7.337500000000000000e+01 -1.015075000000000172e+00 -7.340625000000000000e+01 -1.015079999999999982e+00 -7.328125000000000000e+01 -1.015085000000000015e+00 -7.328125000000000000e+01 -1.015090000000000048e+00 -7.334375000000000000e+01 -1.015095000000000081e+00 -7.334375000000000000e+01 -1.015100000000000113e+00 -7.334375000000000000e+01 -1.015105000000000146e+00 -7.331250000000000000e+01 -1.015110000000000179e+00 -7.328125000000000000e+01 -1.015114999999999990e+00 -7.321875000000000000e+01 -1.015120000000000022e+00 -7.334375000000000000e+01 -1.015125000000000055e+00 -7.331250000000000000e+01 -1.015130000000000088e+00 -7.334375000000000000e+01 -1.015135000000000121e+00 -7.334375000000000000e+01 -1.015140000000000153e+00 -7.334375000000000000e+01 -1.015145000000000186e+00 -7.334375000000000000e+01 -1.015149999999999997e+00 -7.334375000000000000e+01 -1.015155000000000030e+00 -7.331250000000000000e+01 -1.015160000000000062e+00 -7.331250000000000000e+01 -1.015165000000000095e+00 -7.334375000000000000e+01 -1.015170000000000128e+00 -7.331250000000000000e+01 -1.015175000000000161e+00 -7.334375000000000000e+01 -1.015180000000000193e+00 -7.325000000000000000e+01 -1.015185000000000004e+00 -7.328125000000000000e+01 -1.015190000000000037e+00 -7.328125000000000000e+01 -1.015195000000000070e+00 -7.331250000000000000e+01 -1.015200000000000102e+00 -7.328125000000000000e+01 -1.015205000000000135e+00 -7.328125000000000000e+01 -1.015210000000000168e+00 -7.334375000000000000e+01 -1.015214999999999979e+00 -7.328125000000000000e+01 -1.015220000000000011e+00 -7.328125000000000000e+01 -1.015225000000000044e+00 -7.337500000000000000e+01 -1.015230000000000077e+00 -7.331250000000000000e+01 -1.015235000000000110e+00 -7.328125000000000000e+01 -1.015240000000000142e+00 -7.328125000000000000e+01 -1.015245000000000175e+00 -7.331250000000000000e+01 -1.015249999999999986e+00 -7.328125000000000000e+01 -1.015255000000000019e+00 -7.328125000000000000e+01 -1.015260000000000051e+00 -7.328125000000000000e+01 -1.015265000000000084e+00 -7.328125000000000000e+01 -1.015270000000000117e+00 -7.331250000000000000e+01 -1.015275000000000150e+00 -7.328125000000000000e+01 -1.015280000000000182e+00 -7.328125000000000000e+01 -1.015284999999999993e+00 -7.331250000000000000e+01 -1.015290000000000026e+00 -7.328125000000000000e+01 -1.015295000000000059e+00 -7.331250000000000000e+01 -1.015300000000000091e+00 -7.328125000000000000e+01 -1.015305000000000124e+00 -7.331250000000000000e+01 -1.015310000000000157e+00 -7.328125000000000000e+01 -1.015315000000000190e+00 -7.328125000000000000e+01 -1.015320000000000000e+00 -7.334375000000000000e+01 -1.015325000000000033e+00 -7.328125000000000000e+01 -1.015330000000000066e+00 -7.328125000000000000e+01 -1.015335000000000099e+00 -7.328125000000000000e+01 -1.015340000000000131e+00 -7.328125000000000000e+01 -1.015345000000000164e+00 -7.331250000000000000e+01 -1.015349999999999975e+00 -7.328125000000000000e+01 -1.015355000000000008e+00 -7.328125000000000000e+01 -1.015360000000000040e+00 -7.331250000000000000e+01 -1.015365000000000073e+00 -7.325000000000000000e+01 -1.015370000000000106e+00 -7.328125000000000000e+01 -1.015375000000000139e+00 -7.328125000000000000e+01 -1.015380000000000171e+00 -7.331250000000000000e+01 -1.015384999999999982e+00 -7.328125000000000000e+01 -1.015390000000000015e+00 -7.321875000000000000e+01 -1.015395000000000048e+00 -7.328125000000000000e+01 -1.015400000000000080e+00 -7.328125000000000000e+01 -1.015405000000000113e+00 -7.328125000000000000e+01 -1.015410000000000146e+00 -7.337500000000000000e+01 -1.015415000000000179e+00 -7.331250000000000000e+01 -1.015419999999999989e+00 -7.331250000000000000e+01 -1.015425000000000022e+00 -7.328125000000000000e+01 -1.015430000000000055e+00 -7.328125000000000000e+01 -1.015435000000000088e+00 -7.334375000000000000e+01 -1.015440000000000120e+00 -7.321875000000000000e+01 -1.015445000000000153e+00 -7.328125000000000000e+01 -1.015450000000000186e+00 -7.337500000000000000e+01 -1.015454999999999997e+00 -7.331250000000000000e+01 -1.015460000000000029e+00 -7.328125000000000000e+01 -1.015465000000000062e+00 -7.325000000000000000e+01 -1.015470000000000095e+00 -7.328125000000000000e+01 -1.015475000000000128e+00 -7.328125000000000000e+01 -1.015480000000000160e+00 -7.331250000000000000e+01 -1.015485000000000193e+00 -7.321875000000000000e+01 -1.015490000000000004e+00 -7.328125000000000000e+01 -1.015495000000000037e+00 -7.334375000000000000e+01 -1.015500000000000069e+00 -7.328125000000000000e+01 -1.015505000000000102e+00 -7.325000000000000000e+01 -1.015510000000000135e+00 -7.328125000000000000e+01 -1.015515000000000168e+00 -7.331250000000000000e+01 -1.015519999999999978e+00 -7.328125000000000000e+01 -1.015525000000000011e+00 -7.328125000000000000e+01 -1.015530000000000044e+00 -7.334375000000000000e+01 -1.015535000000000077e+00 -7.325000000000000000e+01 -1.015540000000000109e+00 -7.328125000000000000e+01 -1.015545000000000142e+00 -7.331250000000000000e+01 -1.015550000000000175e+00 -7.325000000000000000e+01 -1.015554999999999986e+00 -7.334375000000000000e+01 -1.015560000000000018e+00 -7.334375000000000000e+01 -1.015565000000000051e+00 -7.328125000000000000e+01 -1.015570000000000084e+00 -7.328125000000000000e+01 -1.015575000000000117e+00 -7.331250000000000000e+01 -1.015580000000000149e+00 -7.325000000000000000e+01 -1.015585000000000182e+00 -7.331250000000000000e+01 -1.015589999999999993e+00 -7.334375000000000000e+01 -1.015595000000000026e+00 -7.325000000000000000e+01 -1.015600000000000058e+00 -7.331250000000000000e+01 -1.015605000000000091e+00 -7.331250000000000000e+01 -1.015610000000000124e+00 -7.325000000000000000e+01 -1.015615000000000157e+00 -7.325000000000000000e+01 -1.015620000000000189e+00 -7.328125000000000000e+01 -1.015625000000000000e+00 -7.328125000000000000e+01 -1.015630000000000033e+00 -7.328125000000000000e+01 -1.015635000000000066e+00 -7.328125000000000000e+01 -1.015640000000000098e+00 -7.325000000000000000e+01 -1.015645000000000131e+00 -7.331250000000000000e+01 -1.015650000000000164e+00 -7.328125000000000000e+01 -1.015654999999999974e+00 -7.328125000000000000e+01 -1.015660000000000007e+00 -7.328125000000000000e+01 -1.015665000000000040e+00 -7.325000000000000000e+01 -1.015670000000000073e+00 -7.325000000000000000e+01 -1.015675000000000106e+00 -7.328125000000000000e+01 -1.015680000000000138e+00 -7.328125000000000000e+01 -1.015685000000000171e+00 -7.331250000000000000e+01 -1.015689999999999982e+00 -7.325000000000000000e+01 -1.015695000000000014e+00 -7.325000000000000000e+01 -1.015700000000000047e+00 -7.328125000000000000e+01 -1.015705000000000080e+00 -7.318750000000000000e+01 -1.015710000000000113e+00 -7.328125000000000000e+01 -1.015715000000000146e+00 -7.328125000000000000e+01 -1.015720000000000178e+00 -7.331250000000000000e+01 -1.015724999999999989e+00 -7.328125000000000000e+01 -1.015730000000000022e+00 -7.331250000000000000e+01 -1.015735000000000054e+00 -7.318750000000000000e+01 -1.015740000000000087e+00 -7.328125000000000000e+01 -1.015745000000000120e+00 -7.325000000000000000e+01 -1.015750000000000153e+00 -7.321875000000000000e+01 -1.015755000000000186e+00 -7.318750000000000000e+01 -1.015759999999999996e+00 -7.328125000000000000e+01 -1.015765000000000029e+00 -7.318750000000000000e+01 -1.015770000000000062e+00 -7.318750000000000000e+01 -1.015775000000000095e+00 -7.321875000000000000e+01 -1.015780000000000127e+00 -7.328125000000000000e+01 -1.015785000000000160e+00 -7.318750000000000000e+01 -1.015790000000000193e+00 -7.325000000000000000e+01 -1.015795000000000003e+00 -7.325000000000000000e+01 -1.015800000000000036e+00 -7.325000000000000000e+01 -1.015805000000000069e+00 -7.318750000000000000e+01 -1.015810000000000102e+00 -7.325000000000000000e+01 -1.015815000000000135e+00 -7.325000000000000000e+01 -1.015820000000000167e+00 -7.325000000000000000e+01 -1.015824999999999978e+00 -7.321875000000000000e+01 -1.015830000000000011e+00 -7.328125000000000000e+01 -1.015835000000000043e+00 -7.321875000000000000e+01 -1.015840000000000076e+00 -7.321875000000000000e+01 -1.015845000000000109e+00 -7.325000000000000000e+01 -1.015850000000000142e+00 -7.328125000000000000e+01 -1.015855000000000175e+00 -7.325000000000000000e+01 -1.015859999999999985e+00 -7.328125000000000000e+01 -1.015865000000000018e+00 -7.325000000000000000e+01 -1.015870000000000051e+00 -7.331250000000000000e+01 -1.015875000000000083e+00 -7.331250000000000000e+01 -1.015880000000000116e+00 -7.328125000000000000e+01 -1.015885000000000149e+00 -7.331250000000000000e+01 -1.015890000000000182e+00 -7.325000000000000000e+01 -1.015894999999999992e+00 -7.321875000000000000e+01 -1.015900000000000025e+00 -7.328125000000000000e+01 -1.015905000000000058e+00 -7.328125000000000000e+01 -1.015910000000000091e+00 -7.328125000000000000e+01 -1.015915000000000123e+00 -7.331250000000000000e+01 -1.015920000000000156e+00 -7.331250000000000000e+01 -1.015925000000000189e+00 -7.325000000000000000e+01 -1.015930000000000000e+00 -7.321875000000000000e+01 -1.015935000000000032e+00 -7.328125000000000000e+01 -1.015940000000000065e+00 -7.321875000000000000e+01 -1.015945000000000098e+00 -7.325000000000000000e+01 -1.015950000000000131e+00 -7.321875000000000000e+01 -1.015955000000000163e+00 -7.321875000000000000e+01 -1.015959999999999974e+00 -7.328125000000000000e+01 -1.015965000000000007e+00 -7.328125000000000000e+01 -1.015970000000000040e+00 -7.328125000000000000e+01 -1.015975000000000072e+00 -7.328125000000000000e+01 -1.015980000000000105e+00 -7.328125000000000000e+01 -1.015985000000000138e+00 -7.321875000000000000e+01 -1.015990000000000171e+00 -7.331250000000000000e+01 -1.015994999999999981e+00 -7.328125000000000000e+01 -1.016000000000000014e+00 -7.331250000000000000e+01 -1.016005000000000047e+00 -7.328125000000000000e+01 -1.016010000000000080e+00 -7.325000000000000000e+01 -1.016015000000000112e+00 -7.331250000000000000e+01 -1.016020000000000145e+00 -7.328125000000000000e+01 -1.016025000000000178e+00 -7.328125000000000000e+01 -1.016029999999999989e+00 -7.328125000000000000e+01 -1.016035000000000021e+00 -7.321875000000000000e+01 -1.016040000000000054e+00 -7.331250000000000000e+01 -1.016045000000000087e+00 -7.328125000000000000e+01 -1.016050000000000120e+00 -7.321875000000000000e+01 -1.016055000000000152e+00 -7.328125000000000000e+01 -1.016060000000000185e+00 -7.325000000000000000e+01 -1.016064999999999996e+00 -7.325000000000000000e+01 -1.016070000000000029e+00 -7.325000000000000000e+01 -1.016075000000000061e+00 -7.328125000000000000e+01 -1.016080000000000094e+00 -7.334375000000000000e+01 -1.016085000000000127e+00 -7.328125000000000000e+01 -1.016090000000000160e+00 -7.331250000000000000e+01 -1.016095000000000192e+00 -7.328125000000000000e+01 -1.016100000000000003e+00 -7.331250000000000000e+01 -1.016105000000000036e+00 -7.331250000000000000e+01 -1.016110000000000069e+00 -7.328125000000000000e+01 -1.016115000000000101e+00 -7.325000000000000000e+01 -1.016120000000000134e+00 -7.325000000000000000e+01 -1.016125000000000167e+00 -7.325000000000000000e+01 -1.016129999999999978e+00 -7.328125000000000000e+01 -1.016135000000000010e+00 -7.325000000000000000e+01 -1.016140000000000043e+00 -7.328125000000000000e+01 -1.016145000000000076e+00 -7.328125000000000000e+01 -1.016150000000000109e+00 -7.328125000000000000e+01 -1.016155000000000141e+00 -7.321875000000000000e+01 -1.016160000000000174e+00 -7.321875000000000000e+01 -1.016164999999999985e+00 -7.325000000000000000e+01 -1.016170000000000018e+00 -7.325000000000000000e+01 -1.016175000000000050e+00 -7.328125000000000000e+01 -1.016180000000000083e+00 -7.321875000000000000e+01 -1.016185000000000116e+00 -7.331250000000000000e+01 -1.016190000000000149e+00 -7.321875000000000000e+01 -1.016195000000000181e+00 -7.328125000000000000e+01 -1.016199999999999992e+00 -7.334375000000000000e+01 -1.016205000000000025e+00 -7.325000000000000000e+01 -1.016210000000000058e+00 -7.328125000000000000e+01 -1.016215000000000090e+00 -7.328125000000000000e+01 -1.016220000000000123e+00 -7.331250000000000000e+01 -1.016225000000000156e+00 -7.328125000000000000e+01 -1.016230000000000189e+00 -7.325000000000000000e+01 -1.016234999999999999e+00 -7.331250000000000000e+01 -1.016240000000000032e+00 -7.321875000000000000e+01 -1.016245000000000065e+00 -7.331250000000000000e+01 -1.016250000000000098e+00 -7.331250000000000000e+01 -1.016255000000000130e+00 -7.328125000000000000e+01 -1.016260000000000163e+00 -7.331250000000000000e+01 -1.016264999999999974e+00 -7.328125000000000000e+01 -1.016270000000000007e+00 -7.331250000000000000e+01 -1.016275000000000039e+00 -7.334375000000000000e+01 -1.016280000000000072e+00 -7.331250000000000000e+01 -1.016285000000000105e+00 -7.328125000000000000e+01 -1.016290000000000138e+00 -7.331250000000000000e+01 -1.016295000000000170e+00 -7.328125000000000000e+01 -1.016299999999999981e+00 -7.334375000000000000e+01 -1.016305000000000014e+00 -7.328125000000000000e+01 -1.016310000000000047e+00 -7.334375000000000000e+01 -1.016315000000000079e+00 -7.331250000000000000e+01 -1.016320000000000112e+00 -7.328125000000000000e+01 -1.016325000000000145e+00 -7.331250000000000000e+01 -1.016330000000000178e+00 -7.334375000000000000e+01 -1.016334999999999988e+00 -7.334375000000000000e+01 -1.016340000000000021e+00 -7.331250000000000000e+01 -1.016345000000000054e+00 -7.334375000000000000e+01 -1.016350000000000087e+00 -7.334375000000000000e+01 -1.016355000000000119e+00 -7.328125000000000000e+01 -1.016360000000000152e+00 -7.325000000000000000e+01 -1.016365000000000185e+00 -7.331250000000000000e+01 -1.016369999999999996e+00 -7.334375000000000000e+01 -1.016375000000000028e+00 -7.334375000000000000e+01 -1.016380000000000061e+00 -7.331250000000000000e+01 -1.016385000000000094e+00 -7.334375000000000000e+01 -1.016390000000000127e+00 -7.328125000000000000e+01 -1.016395000000000159e+00 -7.337500000000000000e+01 -1.016400000000000192e+00 -7.331250000000000000e+01 -1.016405000000000003e+00 -7.331250000000000000e+01 -1.016410000000000036e+00 -7.334375000000000000e+01 -1.016415000000000068e+00 -7.325000000000000000e+01 -1.016420000000000101e+00 -7.328125000000000000e+01 -1.016425000000000134e+00 -7.328125000000000000e+01 -1.016430000000000167e+00 -7.331250000000000000e+01 -1.016434999999999977e+00 -7.325000000000000000e+01 -1.016440000000000010e+00 -7.328125000000000000e+01 -1.016445000000000043e+00 -7.331250000000000000e+01 -1.016450000000000076e+00 -7.331250000000000000e+01 -1.016455000000000108e+00 -7.325000000000000000e+01 -1.016460000000000141e+00 -7.334375000000000000e+01 -1.016465000000000174e+00 -7.328125000000000000e+01 -1.016469999999999985e+00 -7.328125000000000000e+01 -1.016475000000000017e+00 -7.328125000000000000e+01 -1.016480000000000050e+00 -7.318750000000000000e+01 -1.016485000000000083e+00 -7.325000000000000000e+01 -1.016490000000000116e+00 -7.318750000000000000e+01 -1.016495000000000148e+00 -7.328125000000000000e+01 -1.016500000000000181e+00 -7.328125000000000000e+01 -1.016504999999999992e+00 -7.328125000000000000e+01 -1.016510000000000025e+00 -7.328125000000000000e+01 -1.016515000000000057e+00 -7.328125000000000000e+01 -1.016520000000000090e+00 -7.325000000000000000e+01 -1.016525000000000123e+00 -7.328125000000000000e+01 -1.016530000000000156e+00 -7.325000000000000000e+01 -1.016535000000000188e+00 -7.328125000000000000e+01 -1.016539999999999999e+00 -7.334375000000000000e+01 -1.016545000000000032e+00 -7.328125000000000000e+01 -1.016550000000000065e+00 -7.328125000000000000e+01 -1.016555000000000097e+00 -7.328125000000000000e+01 -1.016560000000000130e+00 -7.328125000000000000e+01 -1.016565000000000163e+00 -7.331250000000000000e+01 -1.016569999999999974e+00 -7.328125000000000000e+01 -1.016575000000000006e+00 -7.325000000000000000e+01 -1.016580000000000039e+00 -7.325000000000000000e+01 -1.016585000000000072e+00 -7.331250000000000000e+01 -1.016590000000000105e+00 -7.321875000000000000e+01 -1.016595000000000137e+00 -7.328125000000000000e+01 -1.016600000000000170e+00 -7.334375000000000000e+01 -1.016604999999999981e+00 -7.328125000000000000e+01 -1.016610000000000014e+00 -7.321875000000000000e+01 -1.016615000000000046e+00 -7.328125000000000000e+01 -1.016620000000000079e+00 -7.328125000000000000e+01 -1.016625000000000112e+00 -7.321875000000000000e+01 -1.016630000000000145e+00 -7.325000000000000000e+01 -1.016635000000000177e+00 -7.328125000000000000e+01 -1.016639999999999988e+00 -7.328125000000000000e+01 -1.016645000000000021e+00 -7.328125000000000000e+01 -1.016650000000000054e+00 -7.334375000000000000e+01 -1.016655000000000086e+00 -7.334375000000000000e+01 -1.016660000000000119e+00 -7.328125000000000000e+01 -1.016665000000000152e+00 -7.331250000000000000e+01 -1.016670000000000185e+00 -7.328125000000000000e+01 -1.016674999999999995e+00 -7.328125000000000000e+01 -1.016680000000000028e+00 -7.331250000000000000e+01 -1.016685000000000061e+00 -7.328125000000000000e+01 -1.016690000000000094e+00 -7.318750000000000000e+01 -1.016695000000000126e+00 -7.328125000000000000e+01 -1.016700000000000159e+00 -7.325000000000000000e+01 -1.016705000000000192e+00 -7.328125000000000000e+01 -1.016710000000000003e+00 -7.328125000000000000e+01 -1.016715000000000035e+00 -7.328125000000000000e+01 -1.016720000000000068e+00 -7.331250000000000000e+01 -1.016725000000000101e+00 -7.331250000000000000e+01 -1.016730000000000134e+00 -7.325000000000000000e+01 -1.016735000000000166e+00 -7.325000000000000000e+01 -1.016739999999999977e+00 -7.328125000000000000e+01 -1.016745000000000010e+00 -7.325000000000000000e+01 -1.016750000000000043e+00 -7.328125000000000000e+01 -1.016755000000000075e+00 -7.325000000000000000e+01 -1.016760000000000108e+00 -7.334375000000000000e+01 -1.016765000000000141e+00 -7.325000000000000000e+01 -1.016770000000000174e+00 -7.328125000000000000e+01 -1.016774999999999984e+00 -7.325000000000000000e+01 -1.016780000000000017e+00 -7.328125000000000000e+01 -1.016785000000000050e+00 -7.331250000000000000e+01 -1.016790000000000083e+00 -7.328125000000000000e+01 -1.016795000000000115e+00 -7.331250000000000000e+01 -1.016800000000000148e+00 -7.321875000000000000e+01 -1.016805000000000181e+00 -7.325000000000000000e+01 -1.016809999999999992e+00 -7.325000000000000000e+01 -1.016815000000000024e+00 -7.328125000000000000e+01 -1.016820000000000057e+00 -7.328125000000000000e+01 -1.016825000000000090e+00 -7.328125000000000000e+01 -1.016830000000000123e+00 -7.328125000000000000e+01 -1.016835000000000155e+00 -7.328125000000000000e+01 -1.016840000000000188e+00 -7.328125000000000000e+01 -1.016844999999999999e+00 -7.328125000000000000e+01 -1.016850000000000032e+00 -7.328125000000000000e+01 -1.016855000000000064e+00 -7.337500000000000000e+01 -1.016860000000000097e+00 -7.331250000000000000e+01 -1.016865000000000130e+00 -7.331250000000000000e+01 -1.016870000000000163e+00 -7.331250000000000000e+01 -1.016874999999999973e+00 -7.318750000000000000e+01 -1.016880000000000006e+00 -7.325000000000000000e+01 -1.016885000000000039e+00 -7.325000000000000000e+01 -1.016890000000000072e+00 -7.328125000000000000e+01 -1.016895000000000104e+00 -7.321875000000000000e+01 -1.016900000000000137e+00 -7.321875000000000000e+01 -1.016905000000000170e+00 -7.325000000000000000e+01 -1.016909999999999981e+00 -7.331250000000000000e+01 -1.016915000000000013e+00 -7.328125000000000000e+01 -1.016920000000000046e+00 -7.325000000000000000e+01 -1.016925000000000079e+00 -7.325000000000000000e+01 -1.016930000000000112e+00 -7.325000000000000000e+01 -1.016935000000000144e+00 -7.321875000000000000e+01 -1.016940000000000177e+00 -7.325000000000000000e+01 -1.016944999999999988e+00 -7.321875000000000000e+01 -1.016950000000000021e+00 -7.328125000000000000e+01 -1.016955000000000053e+00 -7.328125000000000000e+01 -1.016960000000000086e+00 -7.334375000000000000e+01 -1.016965000000000119e+00 -7.331250000000000000e+01 -1.016970000000000152e+00 -7.331250000000000000e+01 -1.016975000000000184e+00 -7.328125000000000000e+01 -1.016979999999999995e+00 -7.331250000000000000e+01 -1.016985000000000028e+00 -7.328125000000000000e+01 -1.016990000000000061e+00 -7.328125000000000000e+01 -1.016995000000000093e+00 -7.321875000000000000e+01 -1.017000000000000126e+00 -7.325000000000000000e+01 -1.017005000000000159e+00 -7.328125000000000000e+01 -1.017010000000000192e+00 -7.328125000000000000e+01 -1.017015000000000002e+00 -7.331250000000000000e+01 -1.017020000000000035e+00 -7.328125000000000000e+01 -1.017025000000000068e+00 -7.325000000000000000e+01 -1.017030000000000101e+00 -7.328125000000000000e+01 -1.017035000000000133e+00 -7.328125000000000000e+01 -1.017040000000000166e+00 -7.328125000000000000e+01 -1.017044999999999977e+00 -7.334375000000000000e+01 -1.017050000000000010e+00 -7.331250000000000000e+01 -1.017055000000000042e+00 -7.328125000000000000e+01 -1.017060000000000075e+00 -7.321875000000000000e+01 -1.017065000000000108e+00 -7.328125000000000000e+01 -1.017070000000000141e+00 -7.328125000000000000e+01 -1.017075000000000173e+00 -7.325000000000000000e+01 -1.017079999999999984e+00 -7.318750000000000000e+01 -1.017085000000000017e+00 -7.325000000000000000e+01 -1.017090000000000050e+00 -7.328125000000000000e+01 -1.017095000000000082e+00 -7.321875000000000000e+01 -1.017100000000000115e+00 -7.325000000000000000e+01 -1.017105000000000148e+00 -7.328125000000000000e+01 -1.017110000000000181e+00 -7.328125000000000000e+01 -1.017114999999999991e+00 -7.325000000000000000e+01 -1.017120000000000024e+00 -7.328125000000000000e+01 -1.017125000000000057e+00 -7.328125000000000000e+01 -1.017130000000000090e+00 -7.325000000000000000e+01 -1.017135000000000122e+00 -7.331250000000000000e+01 -1.017140000000000155e+00 -7.325000000000000000e+01 -1.017145000000000188e+00 -7.328125000000000000e+01 -1.017149999999999999e+00 -7.325000000000000000e+01 -1.017155000000000031e+00 -7.321875000000000000e+01 -1.017160000000000064e+00 -7.328125000000000000e+01 -1.017165000000000097e+00 -7.328125000000000000e+01 -1.017170000000000130e+00 -7.328125000000000000e+01 -1.017175000000000162e+00 -7.318750000000000000e+01 -1.017179999999999973e+00 -7.328125000000000000e+01 -1.017185000000000006e+00 -7.325000000000000000e+01 -1.017190000000000039e+00 -7.328125000000000000e+01 -1.017195000000000071e+00 -7.331250000000000000e+01 -1.017200000000000104e+00 -7.328125000000000000e+01 -1.017205000000000137e+00 -7.328125000000000000e+01 -1.017210000000000170e+00 -7.328125000000000000e+01 -1.017214999999999980e+00 -7.331250000000000000e+01 -1.017220000000000013e+00 -7.337500000000000000e+01 -1.017225000000000046e+00 -7.331250000000000000e+01 -1.017230000000000079e+00 -7.334375000000000000e+01 -1.017235000000000111e+00 -7.334375000000000000e+01 -1.017240000000000144e+00 -7.331250000000000000e+01 -1.017245000000000177e+00 -7.334375000000000000e+01 -1.017249999999999988e+00 -7.331250000000000000e+01 -1.017255000000000020e+00 -7.334375000000000000e+01 -1.017260000000000053e+00 -7.331250000000000000e+01 -1.017265000000000086e+00 -7.328125000000000000e+01 -1.017270000000000119e+00 -7.325000000000000000e+01 -1.017275000000000151e+00 -7.328125000000000000e+01 -1.017280000000000184e+00 -7.318750000000000000e+01 -1.017284999999999995e+00 -7.334375000000000000e+01 -1.017290000000000028e+00 -7.331250000000000000e+01 -1.017295000000000060e+00 -7.331250000000000000e+01 -1.017300000000000093e+00 -7.334375000000000000e+01 -1.017305000000000126e+00 -7.328125000000000000e+01 -1.017310000000000159e+00 -7.334375000000000000e+01 -1.017315000000000191e+00 -7.334375000000000000e+01 -1.017320000000000002e+00 -7.321875000000000000e+01 -1.017325000000000035e+00 -7.337500000000000000e+01 -1.017330000000000068e+00 -7.331250000000000000e+01 -1.017335000000000100e+00 -7.337500000000000000e+01 -1.017340000000000133e+00 -7.334375000000000000e+01 -1.017345000000000166e+00 -7.331250000000000000e+01 -1.017349999999999977e+00 -7.337500000000000000e+01 -1.017355000000000009e+00 -7.331250000000000000e+01 -1.017360000000000042e+00 -7.328125000000000000e+01 -1.017365000000000075e+00 -7.331250000000000000e+01 -1.017370000000000108e+00 -7.334375000000000000e+01 -1.017375000000000140e+00 -7.334375000000000000e+01 -1.017380000000000173e+00 -7.328125000000000000e+01 -1.017384999999999984e+00 -7.334375000000000000e+01 -1.017390000000000017e+00 -7.331250000000000000e+01 -1.017395000000000049e+00 -7.328125000000000000e+01 -1.017400000000000082e+00 -7.337500000000000000e+01 -1.017405000000000115e+00 -7.334375000000000000e+01 -1.017410000000000148e+00 -7.334375000000000000e+01 -1.017415000000000180e+00 -7.334375000000000000e+01 -1.017419999999999991e+00 -7.331250000000000000e+01 -1.017425000000000024e+00 -7.340625000000000000e+01 -1.017430000000000057e+00 -7.334375000000000000e+01 -1.017435000000000089e+00 -7.334375000000000000e+01 -1.017440000000000122e+00 -7.331250000000000000e+01 -1.017445000000000155e+00 -7.328125000000000000e+01 -1.017450000000000188e+00 -7.334375000000000000e+01 -1.017454999999999998e+00 -7.337500000000000000e+01 -1.017460000000000031e+00 -7.325000000000000000e+01 -1.017465000000000064e+00 -7.331250000000000000e+01 -1.017470000000000097e+00 -7.334375000000000000e+01 -1.017475000000000129e+00 -7.331250000000000000e+01 -1.017480000000000162e+00 -7.328125000000000000e+01 -1.017484999999999973e+00 -7.334375000000000000e+01 -1.017490000000000006e+00 -7.334375000000000000e+01 -1.017495000000000038e+00 -7.340625000000000000e+01 -1.017500000000000071e+00 -7.328125000000000000e+01 -1.017505000000000104e+00 -7.331250000000000000e+01 -1.017510000000000137e+00 -7.328125000000000000e+01 -1.017515000000000169e+00 -7.334375000000000000e+01 -1.017519999999999980e+00 -7.334375000000000000e+01 -1.017525000000000013e+00 -7.331250000000000000e+01 -1.017530000000000046e+00 -7.334375000000000000e+01 -1.017535000000000078e+00 -7.334375000000000000e+01 -1.017540000000000111e+00 -7.334375000000000000e+01 -1.017545000000000144e+00 -7.328125000000000000e+01 -1.017550000000000177e+00 -7.328125000000000000e+01 -1.017554999999999987e+00 -7.337500000000000000e+01 -1.017560000000000020e+00 -7.334375000000000000e+01 -1.017565000000000053e+00 -7.334375000000000000e+01 -1.017570000000000086e+00 -7.331250000000000000e+01 -1.017575000000000118e+00 -7.334375000000000000e+01 -1.017580000000000151e+00 -7.337500000000000000e+01 -1.017585000000000184e+00 -7.331250000000000000e+01 -1.017589999999999995e+00 -7.334375000000000000e+01 -1.017595000000000027e+00 -7.334375000000000000e+01 -1.017600000000000060e+00 -7.328125000000000000e+01 -1.017605000000000093e+00 -7.331250000000000000e+01 -1.017610000000000126e+00 -7.331250000000000000e+01 -1.017615000000000158e+00 -7.328125000000000000e+01 -1.017620000000000191e+00 -7.328125000000000000e+01 -1.017625000000000002e+00 -7.331250000000000000e+01 -1.017630000000000035e+00 -7.331250000000000000e+01 -1.017635000000000067e+00 -7.334375000000000000e+01 -1.017640000000000100e+00 -7.331250000000000000e+01 -1.017645000000000133e+00 -7.337500000000000000e+01 -1.017650000000000166e+00 -7.334375000000000000e+01 -1.017654999999999976e+00 -7.331250000000000000e+01 -1.017660000000000009e+00 -7.334375000000000000e+01 -1.017665000000000042e+00 -7.328125000000000000e+01 -1.017670000000000075e+00 -7.331250000000000000e+01 -1.017675000000000107e+00 -7.331250000000000000e+01 -1.017680000000000140e+00 -7.334375000000000000e+01 -1.017685000000000173e+00 -7.334375000000000000e+01 -1.017689999999999984e+00 -7.331250000000000000e+01 -1.017695000000000016e+00 -7.331250000000000000e+01 -1.017700000000000049e+00 -7.331250000000000000e+01 -1.017705000000000082e+00 -7.328125000000000000e+01 -1.017710000000000115e+00 -7.340625000000000000e+01 -1.017715000000000147e+00 -7.331250000000000000e+01 -1.017720000000000180e+00 -7.334375000000000000e+01 -1.017724999999999991e+00 -7.337500000000000000e+01 -1.017730000000000024e+00 -7.334375000000000000e+01 -1.017735000000000056e+00 -7.337500000000000000e+01 -1.017740000000000089e+00 -7.331250000000000000e+01 -1.017745000000000122e+00 -7.328125000000000000e+01 -1.017750000000000155e+00 -7.337500000000000000e+01 -1.017755000000000187e+00 -7.334375000000000000e+01 -1.017759999999999998e+00 -7.331250000000000000e+01 -1.017765000000000031e+00 -7.331250000000000000e+01 -1.017770000000000064e+00 -7.334375000000000000e+01 -1.017775000000000096e+00 -7.331250000000000000e+01 -1.017780000000000129e+00 -7.334375000000000000e+01 -1.017785000000000162e+00 -7.328125000000000000e+01 -1.017789999999999973e+00 -7.337500000000000000e+01 -1.017795000000000005e+00 -7.337500000000000000e+01 -1.017800000000000038e+00 -7.331250000000000000e+01 -1.017805000000000071e+00 -7.331250000000000000e+01 -1.017810000000000104e+00 -7.331250000000000000e+01 -1.017815000000000136e+00 -7.331250000000000000e+01 -1.017820000000000169e+00 -7.337500000000000000e+01 -1.017824999999999980e+00 -7.334375000000000000e+01 -1.017830000000000013e+00 -7.328125000000000000e+01 -1.017835000000000045e+00 -7.334375000000000000e+01 -1.017840000000000078e+00 -7.331250000000000000e+01 -1.017845000000000111e+00 -7.328125000000000000e+01 -1.017850000000000144e+00 -7.331250000000000000e+01 -1.017855000000000176e+00 -7.331250000000000000e+01 -1.017859999999999987e+00 -7.328125000000000000e+01 -1.017865000000000020e+00 -7.328125000000000000e+01 -1.017870000000000053e+00 -7.321875000000000000e+01 -1.017875000000000085e+00 -7.321875000000000000e+01 -1.017880000000000118e+00 -7.328125000000000000e+01 -1.017885000000000151e+00 -7.331250000000000000e+01 -1.017890000000000184e+00 -7.321875000000000000e+01 -1.017894999999999994e+00 -7.328125000000000000e+01 -1.017900000000000027e+00 -7.321875000000000000e+01 -1.017905000000000060e+00 -7.325000000000000000e+01 -1.017910000000000093e+00 -7.321875000000000000e+01 -1.017915000000000125e+00 -7.331250000000000000e+01 -1.017920000000000158e+00 -7.321875000000000000e+01 -1.017925000000000191e+00 -7.334375000000000000e+01 -1.017930000000000001e+00 -7.328125000000000000e+01 -1.017935000000000034e+00 -7.328125000000000000e+01 -1.017940000000000067e+00 -7.328125000000000000e+01 -1.017945000000000100e+00 -7.331250000000000000e+01 -1.017950000000000133e+00 -7.334375000000000000e+01 -1.017955000000000165e+00 -7.334375000000000000e+01 -1.017959999999999976e+00 -7.334375000000000000e+01 -1.017965000000000009e+00 -7.331250000000000000e+01 -1.017970000000000041e+00 -7.331250000000000000e+01 -1.017975000000000074e+00 -7.334375000000000000e+01 -1.017980000000000107e+00 -7.328125000000000000e+01 -1.017985000000000140e+00 -7.325000000000000000e+01 -1.017990000000000173e+00 -7.334375000000000000e+01 -1.017994999999999983e+00 -7.328125000000000000e+01 -1.018000000000000016e+00 -7.331250000000000000e+01 -1.018005000000000049e+00 -7.328125000000000000e+01 -1.018010000000000081e+00 -7.334375000000000000e+01 -1.018015000000000114e+00 -7.328125000000000000e+01 -1.018020000000000147e+00 -7.328125000000000000e+01 -1.018025000000000180e+00 -7.337500000000000000e+01 -1.018029999999999990e+00 -7.337500000000000000e+01 -1.018035000000000023e+00 -7.328125000000000000e+01 -1.018040000000000056e+00 -7.331250000000000000e+01 -1.018045000000000089e+00 -7.325000000000000000e+01 -1.018050000000000122e+00 -7.325000000000000000e+01 -1.018055000000000154e+00 -7.328125000000000000e+01 -1.018060000000000187e+00 -7.328125000000000000e+01 -1.018064999999999998e+00 -7.328125000000000000e+01 -1.018070000000000030e+00 -7.325000000000000000e+01 -1.018075000000000063e+00 -7.321875000000000000e+01 -1.018080000000000096e+00 -7.328125000000000000e+01 -1.018085000000000129e+00 -7.318750000000000000e+01 -1.018090000000000162e+00 -7.325000000000000000e+01 -1.018095000000000194e+00 -7.321875000000000000e+01 -1.018100000000000005e+00 -7.325000000000000000e+01 -1.018105000000000038e+00 -7.325000000000000000e+01 -1.018110000000000070e+00 -7.328125000000000000e+01 -1.018115000000000103e+00 -7.318750000000000000e+01 -1.018120000000000136e+00 -7.328125000000000000e+01 -1.018125000000000169e+00 -7.318750000000000000e+01 -1.018129999999999979e+00 -7.321875000000000000e+01 -1.018135000000000012e+00 -7.325000000000000000e+01 -1.018140000000000045e+00 -7.321875000000000000e+01 -1.018145000000000078e+00 -7.321875000000000000e+01 -1.018150000000000110e+00 -7.321875000000000000e+01 -1.018155000000000143e+00 -7.321875000000000000e+01 -1.018160000000000176e+00 -7.325000000000000000e+01 -1.018164999999999987e+00 -7.328125000000000000e+01 -1.018170000000000019e+00 -7.321875000000000000e+01 -1.018175000000000052e+00 -7.328125000000000000e+01 -1.018180000000000085e+00 -7.321875000000000000e+01 -1.018185000000000118e+00 -7.318750000000000000e+01 -1.018190000000000150e+00 -7.325000000000000000e+01 -1.018195000000000183e+00 -7.325000000000000000e+01 -1.018199999999999994e+00 -7.331250000000000000e+01 -1.018205000000000027e+00 -7.328125000000000000e+01 -1.018210000000000059e+00 -7.328125000000000000e+01 -1.018215000000000092e+00 -7.328125000000000000e+01 -1.018220000000000125e+00 -7.325000000000000000e+01 -1.018225000000000158e+00 -7.328125000000000000e+01 -1.018230000000000190e+00 -7.325000000000000000e+01 -1.018235000000000001e+00 -7.328125000000000000e+01 -1.018240000000000034e+00 -7.331250000000000000e+01 -1.018245000000000067e+00 -7.328125000000000000e+01 -1.018250000000000099e+00 -7.328125000000000000e+01 -1.018255000000000132e+00 -7.325000000000000000e+01 -1.018260000000000165e+00 -7.331250000000000000e+01 -1.018264999999999976e+00 -7.328125000000000000e+01 -1.018270000000000008e+00 -7.328125000000000000e+01 -1.018275000000000041e+00 -7.328125000000000000e+01 -1.018280000000000074e+00 -7.331250000000000000e+01 -1.018285000000000107e+00 -7.331250000000000000e+01 -1.018290000000000139e+00 -7.328125000000000000e+01 -1.018295000000000172e+00 -7.328125000000000000e+01 -1.018299999999999983e+00 -7.328125000000000000e+01 -1.018305000000000016e+00 -7.331250000000000000e+01 -1.018310000000000048e+00 -7.331250000000000000e+01 -1.018315000000000081e+00 -7.328125000000000000e+01 -1.018320000000000114e+00 -7.334375000000000000e+01 -1.018325000000000147e+00 -7.325000000000000000e+01 -1.018330000000000179e+00 -7.328125000000000000e+01 -1.018334999999999990e+00 -7.325000000000000000e+01 -1.018340000000000023e+00 -7.331250000000000000e+01 -1.018345000000000056e+00 -7.328125000000000000e+01 -1.018350000000000088e+00 -7.328125000000000000e+01 -1.018355000000000121e+00 -7.334375000000000000e+01 -1.018360000000000154e+00 -7.331250000000000000e+01 -1.018365000000000187e+00 -7.334375000000000000e+01 -1.018369999999999997e+00 -7.334375000000000000e+01 -1.018375000000000030e+00 -7.331250000000000000e+01 -1.018380000000000063e+00 -7.334375000000000000e+01 -1.018385000000000096e+00 -7.334375000000000000e+01 -1.018390000000000128e+00 -7.331250000000000000e+01 -1.018395000000000161e+00 -7.331250000000000000e+01 -1.018400000000000194e+00 -7.331250000000000000e+01 -1.018405000000000005e+00 -7.328125000000000000e+01 -1.018410000000000037e+00 -7.334375000000000000e+01 -1.018415000000000070e+00 -7.334375000000000000e+01 -1.018420000000000103e+00 -7.337500000000000000e+01 -1.018425000000000136e+00 -7.334375000000000000e+01 -1.018430000000000168e+00 -7.334375000000000000e+01 -1.018434999999999979e+00 -7.331250000000000000e+01 -1.018440000000000012e+00 -7.334375000000000000e+01 -1.018445000000000045e+00 -7.334375000000000000e+01 -1.018450000000000077e+00 -7.337500000000000000e+01 -1.018455000000000110e+00 -7.337500000000000000e+01 -1.018460000000000143e+00 -7.334375000000000000e+01 -1.018465000000000176e+00 -7.334375000000000000e+01 -1.018469999999999986e+00 -7.334375000000000000e+01 -1.018475000000000019e+00 -7.337500000000000000e+01 -1.018480000000000052e+00 -7.340625000000000000e+01 -1.018485000000000085e+00 -7.337500000000000000e+01 -1.018490000000000117e+00 -7.334375000000000000e+01 -1.018495000000000150e+00 -7.334375000000000000e+01 -1.018500000000000183e+00 -7.340625000000000000e+01 -1.018504999999999994e+00 -7.334375000000000000e+01 -1.018510000000000026e+00 -7.331250000000000000e+01 -1.018515000000000059e+00 -7.331250000000000000e+01 -1.018520000000000092e+00 -7.334375000000000000e+01 -1.018525000000000125e+00 -7.334375000000000000e+01 -1.018530000000000157e+00 -7.340625000000000000e+01 -1.018535000000000190e+00 -7.328125000000000000e+01 -1.018540000000000001e+00 -7.331250000000000000e+01 -1.018545000000000034e+00 -7.331250000000000000e+01 -1.018550000000000066e+00 -7.328125000000000000e+01 -1.018555000000000099e+00 -7.334375000000000000e+01 -1.018560000000000132e+00 -7.337500000000000000e+01 -1.018565000000000165e+00 -7.331250000000000000e+01 -1.018569999999999975e+00 -7.334375000000000000e+01 -1.018575000000000008e+00 -7.331250000000000000e+01 -1.018580000000000041e+00 -7.325000000000000000e+01 -1.018585000000000074e+00 -7.337500000000000000e+01 -1.018590000000000106e+00 -7.328125000000000000e+01 -1.018595000000000139e+00 -7.325000000000000000e+01 -1.018600000000000172e+00 -7.325000000000000000e+01 -1.018604999999999983e+00 -7.334375000000000000e+01 -1.018610000000000015e+00 -7.328125000000000000e+01 -1.018615000000000048e+00 -7.328125000000000000e+01 -1.018620000000000081e+00 -7.325000000000000000e+01 -1.018625000000000114e+00 -7.328125000000000000e+01 -1.018630000000000146e+00 -7.331250000000000000e+01 -1.018635000000000179e+00 -7.331250000000000000e+01 -1.018639999999999990e+00 -7.328125000000000000e+01 -1.018645000000000023e+00 -7.337500000000000000e+01 -1.018650000000000055e+00 -7.331250000000000000e+01 -1.018655000000000088e+00 -7.334375000000000000e+01 -1.018660000000000121e+00 -7.331250000000000000e+01 -1.018665000000000154e+00 -7.328125000000000000e+01 -1.018670000000000186e+00 -7.334375000000000000e+01 -1.018674999999999997e+00 -7.331250000000000000e+01 -1.018680000000000030e+00 -7.334375000000000000e+01 -1.018685000000000063e+00 -7.331250000000000000e+01 -1.018690000000000095e+00 -7.337500000000000000e+01 -1.018695000000000128e+00 -7.331250000000000000e+01 -1.018700000000000161e+00 -7.334375000000000000e+01 -1.018705000000000194e+00 -7.337500000000000000e+01 -1.018710000000000004e+00 -7.334375000000000000e+01 -1.018715000000000037e+00 -7.340625000000000000e+01 -1.018720000000000070e+00 -7.337500000000000000e+01 -1.018725000000000103e+00 -7.328125000000000000e+01 -1.018730000000000135e+00 -7.331250000000000000e+01 -1.018735000000000168e+00 -7.334375000000000000e+01 -1.018739999999999979e+00 -7.331250000000000000e+01 -1.018745000000000012e+00 -7.334375000000000000e+01 -1.018750000000000044e+00 -7.337500000000000000e+01 -1.018755000000000077e+00 -7.334375000000000000e+01 -1.018760000000000110e+00 -7.334375000000000000e+01 -1.018765000000000143e+00 -7.334375000000000000e+01 -1.018770000000000175e+00 -7.334375000000000000e+01 -1.018774999999999986e+00 -7.331250000000000000e+01 -1.018780000000000019e+00 -7.334375000000000000e+01 -1.018785000000000052e+00 -7.334375000000000000e+01 -1.018790000000000084e+00 -7.334375000000000000e+01 -1.018795000000000117e+00 -7.328125000000000000e+01 -1.018800000000000150e+00 -7.334375000000000000e+01 -1.018805000000000183e+00 -7.328125000000000000e+01 -1.018809999999999993e+00 -7.334375000000000000e+01 -1.018815000000000026e+00 -7.328125000000000000e+01 -1.018820000000000059e+00 -7.328125000000000000e+01 -1.018825000000000092e+00 -7.331250000000000000e+01 -1.018830000000000124e+00 -7.334375000000000000e+01 -1.018835000000000157e+00 -7.337500000000000000e+01 -1.018840000000000190e+00 -7.340625000000000000e+01 -1.018845000000000001e+00 -7.340625000000000000e+01 -1.018850000000000033e+00 -7.337500000000000000e+01 -1.018855000000000066e+00 -7.340625000000000000e+01 -1.018860000000000099e+00 -7.334375000000000000e+01 -1.018865000000000132e+00 -7.337500000000000000e+01 -1.018870000000000164e+00 -7.340625000000000000e+01 -1.018874999999999975e+00 -7.340625000000000000e+01 -1.018880000000000008e+00 -7.340625000000000000e+01 -1.018885000000000041e+00 -7.337500000000000000e+01 -1.018890000000000073e+00 -7.340625000000000000e+01 -1.018895000000000106e+00 -7.334375000000000000e+01 -1.018900000000000139e+00 -7.334375000000000000e+01 -1.018905000000000172e+00 -7.334375000000000000e+01 -1.018909999999999982e+00 -7.334375000000000000e+01 -1.018915000000000015e+00 -7.340625000000000000e+01 -1.018920000000000048e+00 -7.331250000000000000e+01 -1.018925000000000081e+00 -7.337500000000000000e+01 -1.018930000000000113e+00 -7.340625000000000000e+01 -1.018935000000000146e+00 -7.337500000000000000e+01 -1.018940000000000179e+00 -7.331250000000000000e+01 -1.018944999999999990e+00 -7.334375000000000000e+01 -1.018950000000000022e+00 -7.337500000000000000e+01 -1.018955000000000055e+00 -7.328125000000000000e+01 -1.018960000000000088e+00 -7.334375000000000000e+01 -1.018965000000000121e+00 -7.334375000000000000e+01 -1.018970000000000153e+00 -7.328125000000000000e+01 -1.018975000000000186e+00 -7.340625000000000000e+01 -1.018979999999999997e+00 -7.337500000000000000e+01 -1.018985000000000030e+00 -7.331250000000000000e+01 -1.018990000000000062e+00 -7.331250000000000000e+01 -1.018995000000000095e+00 -7.340625000000000000e+01 -1.019000000000000128e+00 -7.334375000000000000e+01 -1.019005000000000161e+00 -7.340625000000000000e+01 -1.019010000000000193e+00 -7.328125000000000000e+01 -1.019015000000000004e+00 -7.334375000000000000e+01 -1.019020000000000037e+00 -7.328125000000000000e+01 -1.019025000000000070e+00 -7.337500000000000000e+01 -1.019030000000000102e+00 -7.334375000000000000e+01 -1.019035000000000135e+00 -7.334375000000000000e+01 -1.019040000000000168e+00 -7.337500000000000000e+01 -1.019044999999999979e+00 -7.331250000000000000e+01 -1.019050000000000011e+00 -7.334375000000000000e+01 -1.019055000000000044e+00 -7.337500000000000000e+01 -1.019060000000000077e+00 -7.340625000000000000e+01 -1.019065000000000110e+00 -7.331250000000000000e+01 -1.019070000000000142e+00 -7.337500000000000000e+01 -1.019075000000000175e+00 -7.337500000000000000e+01 -1.019079999999999986e+00 -7.340625000000000000e+01 -1.019085000000000019e+00 -7.334375000000000000e+01 -1.019090000000000051e+00 -7.337500000000000000e+01 -1.019095000000000084e+00 -7.334375000000000000e+01 -1.019100000000000117e+00 -7.340625000000000000e+01 -1.019105000000000150e+00 -7.334375000000000000e+01 -1.019110000000000182e+00 -7.337500000000000000e+01 -1.019114999999999993e+00 -7.331250000000000000e+01 -1.019120000000000026e+00 -7.337500000000000000e+01 -1.019125000000000059e+00 -7.340625000000000000e+01 -1.019130000000000091e+00 -7.334375000000000000e+01 -1.019135000000000124e+00 -7.337500000000000000e+01 -1.019140000000000157e+00 -7.337500000000000000e+01 -1.019145000000000190e+00 -7.331250000000000000e+01 -1.019150000000000000e+00 -7.331250000000000000e+01 -1.019155000000000033e+00 -7.334375000000000000e+01 -1.019160000000000066e+00 -7.334375000000000000e+01 -1.019165000000000099e+00 -7.334375000000000000e+01 -1.019170000000000131e+00 -7.334375000000000000e+01 -1.019175000000000164e+00 -7.340625000000000000e+01 -1.019179999999999975e+00 -7.337500000000000000e+01 -1.019185000000000008e+00 -7.343750762939453125e+01 -1.019190000000000040e+00 -7.334375000000000000e+01 -1.019195000000000073e+00 -7.334375000000000000e+01 -1.019200000000000106e+00 -7.334375000000000000e+01 -1.019205000000000139e+00 -7.337500000000000000e+01 -1.019210000000000171e+00 -7.334375000000000000e+01 -1.019214999999999982e+00 -7.331250000000000000e+01 -1.019220000000000015e+00 -7.334375000000000000e+01 -1.019225000000000048e+00 -7.337500000000000000e+01 -1.019230000000000080e+00 -7.328125000000000000e+01 -1.019235000000000113e+00 -7.334375000000000000e+01 -1.019240000000000146e+00 -7.337500000000000000e+01 -1.019245000000000179e+00 -7.334375000000000000e+01 -1.019249999999999989e+00 -7.334375000000000000e+01 -1.019255000000000022e+00 -7.337500000000000000e+01 -1.019260000000000055e+00 -7.331250000000000000e+01 -1.019265000000000088e+00 -7.328125000000000000e+01 -1.019270000000000120e+00 -7.334375000000000000e+01 -1.019275000000000153e+00 -7.337500000000000000e+01 -1.019280000000000186e+00 -7.331250000000000000e+01 -1.019284999999999997e+00 -7.334375000000000000e+01 -1.019290000000000029e+00 -7.337500000000000000e+01 -1.019295000000000062e+00 -7.334375000000000000e+01 -1.019300000000000095e+00 -7.340625000000000000e+01 -1.019305000000000128e+00 -7.328125000000000000e+01 -1.019310000000000160e+00 -7.334375000000000000e+01 -1.019315000000000193e+00 -7.331250000000000000e+01 -1.019320000000000004e+00 -7.334375000000000000e+01 -1.019325000000000037e+00 -7.334375000000000000e+01 -1.019330000000000069e+00 -7.328125000000000000e+01 -1.019335000000000102e+00 -7.337500000000000000e+01 -1.019340000000000135e+00 -7.328125000000000000e+01 -1.019345000000000168e+00 -7.334375000000000000e+01 -1.019349999999999978e+00 -7.334375000000000000e+01 -1.019355000000000011e+00 -7.331250000000000000e+01 -1.019360000000000044e+00 -7.331250000000000000e+01 -1.019365000000000077e+00 -7.337500000000000000e+01 -1.019370000000000109e+00 -7.328125000000000000e+01 -1.019375000000000142e+00 -7.337500000000000000e+01 -1.019380000000000175e+00 -7.337500000000000000e+01 -1.019384999999999986e+00 -7.331250000000000000e+01 -1.019390000000000018e+00 -7.331250000000000000e+01 -1.019395000000000051e+00 -7.340625000000000000e+01 -1.019400000000000084e+00 -7.331250000000000000e+01 -1.019405000000000117e+00 -7.334375000000000000e+01 -1.019410000000000149e+00 -7.337500000000000000e+01 -1.019415000000000182e+00 -7.328125000000000000e+01 -1.019419999999999993e+00 -7.337500000000000000e+01 -1.019425000000000026e+00 -7.340625000000000000e+01 -1.019430000000000058e+00 -7.343750762939453125e+01 -1.019435000000000091e+00 -7.337500000000000000e+01 -1.019440000000000124e+00 -7.340625000000000000e+01 -1.019445000000000157e+00 -7.337500000000000000e+01 -1.019450000000000189e+00 -7.334375000000000000e+01 -1.019455000000000000e+00 -7.334375000000000000e+01 -1.019460000000000033e+00 -7.337500000000000000e+01 -1.019465000000000066e+00 -7.340625000000000000e+01 -1.019470000000000098e+00 -7.340625000000000000e+01 -1.019475000000000131e+00 -7.331250000000000000e+01 -1.019480000000000164e+00 -7.343750762939453125e+01 -1.019484999999999975e+00 -7.337500000000000000e+01 -1.019490000000000007e+00 -7.340625000000000000e+01 -1.019495000000000040e+00 -7.334375000000000000e+01 -1.019500000000000073e+00 -7.337500000000000000e+01 -1.019505000000000106e+00 -7.340625000000000000e+01 -1.019510000000000138e+00 -7.331250000000000000e+01 -1.019515000000000171e+00 -7.337500000000000000e+01 -1.019519999999999982e+00 -7.340625000000000000e+01 -1.019525000000000015e+00 -7.337500000000000000e+01 -1.019530000000000047e+00 -7.334375000000000000e+01 -1.019535000000000080e+00 -7.334375000000000000e+01 -1.019540000000000113e+00 -7.334375000000000000e+01 -1.019545000000000146e+00 -7.334375000000000000e+01 -1.019550000000000178e+00 -7.331250000000000000e+01 -1.019554999999999989e+00 -7.334375000000000000e+01 -1.019560000000000022e+00 -7.340625000000000000e+01 -1.019565000000000055e+00 -7.328125000000000000e+01 -1.019570000000000087e+00 -7.334375000000000000e+01 -1.019575000000000120e+00 -7.331250000000000000e+01 -1.019580000000000153e+00 -7.334375000000000000e+01 -1.019585000000000186e+00 -7.340625000000000000e+01 -1.019589999999999996e+00 -7.334375000000000000e+01 -1.019595000000000029e+00 -7.337500000000000000e+01 -1.019600000000000062e+00 -7.334375000000000000e+01 -1.019605000000000095e+00 -7.334375000000000000e+01 -1.019610000000000127e+00 -7.337500000000000000e+01 -1.019615000000000160e+00 -7.334375000000000000e+01 -1.019620000000000193e+00 -7.334375000000000000e+01 -1.019625000000000004e+00 -7.337500000000000000e+01 -1.019630000000000036e+00 -7.334375000000000000e+01 -1.019635000000000069e+00 -7.328125000000000000e+01 -1.019640000000000102e+00 -7.334375000000000000e+01 -1.019645000000000135e+00 -7.334375000000000000e+01 -1.019650000000000167e+00 -7.334375000000000000e+01 -1.019654999999999978e+00 -7.334375000000000000e+01 -1.019660000000000011e+00 -7.328125000000000000e+01 -1.019665000000000044e+00 -7.331250000000000000e+01 -1.019670000000000076e+00 -7.331250000000000000e+01 -1.019675000000000109e+00 -7.328125000000000000e+01 -1.019680000000000142e+00 -7.328125000000000000e+01 -1.019685000000000175e+00 -7.331250000000000000e+01 -1.019689999999999985e+00 -7.331250000000000000e+01 -1.019695000000000018e+00 -7.340625000000000000e+01 -1.019700000000000051e+00 -7.331250000000000000e+01 -1.019705000000000084e+00 -7.334375000000000000e+01 -1.019710000000000116e+00 -7.334375000000000000e+01 -1.019715000000000149e+00 -7.328125000000000000e+01 -1.019720000000000182e+00 -7.325000000000000000e+01 -1.019724999999999993e+00 -7.334375000000000000e+01 -1.019730000000000025e+00 -7.331250000000000000e+01 -1.019735000000000058e+00 -7.331250000000000000e+01 -1.019740000000000091e+00 -7.328125000000000000e+01 -1.019745000000000124e+00 -7.328125000000000000e+01 -1.019750000000000156e+00 -7.331250000000000000e+01 -1.019755000000000189e+00 -7.334375000000000000e+01 -1.019760000000000000e+00 -7.331250000000000000e+01 -1.019765000000000033e+00 -7.337500000000000000e+01 -1.019770000000000065e+00 -7.328125000000000000e+01 -1.019775000000000098e+00 -7.328125000000000000e+01 -1.019780000000000131e+00 -7.331250000000000000e+01 -1.019785000000000164e+00 -7.337500000000000000e+01 -1.019789999999999974e+00 -7.337500000000000000e+01 -1.019795000000000007e+00 -7.331250000000000000e+01 -1.019800000000000040e+00 -7.337500000000000000e+01 -1.019805000000000073e+00 -7.334375000000000000e+01 -1.019810000000000105e+00 -7.337500000000000000e+01 -1.019815000000000138e+00 -7.331250000000000000e+01 -1.019820000000000171e+00 -7.328125000000000000e+01 -1.019824999999999982e+00 -7.328125000000000000e+01 -1.019830000000000014e+00 -7.331250000000000000e+01 -1.019835000000000047e+00 -7.328125000000000000e+01 -1.019840000000000080e+00 -7.328125000000000000e+01 -1.019845000000000113e+00 -7.334375000000000000e+01 -1.019850000000000145e+00 -7.334375000000000000e+01 -1.019855000000000178e+00 -7.331250000000000000e+01 -1.019859999999999989e+00 -7.331250000000000000e+01 -1.019865000000000022e+00 -7.331250000000000000e+01 -1.019870000000000054e+00 -7.334375000000000000e+01 -1.019875000000000087e+00 -7.331250000000000000e+01 -1.019880000000000120e+00 -7.337500000000000000e+01 -1.019885000000000153e+00 -7.337500000000000000e+01 -1.019890000000000185e+00 -7.331250000000000000e+01 -1.019894999999999996e+00 -7.334375000000000000e+01 -1.019900000000000029e+00 -7.331250000000000000e+01 -1.019905000000000062e+00 -7.331250000000000000e+01 -1.019910000000000094e+00 -7.340625000000000000e+01 -1.019915000000000127e+00 -7.334375000000000000e+01 -1.019920000000000160e+00 -7.334375000000000000e+01 -1.019925000000000193e+00 -7.337500000000000000e+01 -1.019930000000000003e+00 -7.331250000000000000e+01 -1.019935000000000036e+00 -7.334375000000000000e+01 -1.019940000000000069e+00 -7.337500000000000000e+01 -1.019945000000000102e+00 -7.334375000000000000e+01 -1.019950000000000134e+00 -7.337500000000000000e+01 -1.019955000000000167e+00 -7.334375000000000000e+01 -1.019959999999999978e+00 -7.334375000000000000e+01 -1.019965000000000011e+00 -7.334375000000000000e+01 -1.019970000000000043e+00 -7.334375000000000000e+01 -1.019975000000000076e+00 -7.331250000000000000e+01 -1.019980000000000109e+00 -7.331250000000000000e+01 -1.019985000000000142e+00 -7.331250000000000000e+01 -1.019990000000000174e+00 -7.334375000000000000e+01 -1.019994999999999985e+00 -7.334375000000000000e+01 -1.020000000000000018e+00 -7.337500000000000000e+01 -1.020005000000000051e+00 -7.331250000000000000e+01 -1.020010000000000083e+00 -7.334375000000000000e+01 -1.020015000000000116e+00 -7.334375000000000000e+01 -1.020020000000000149e+00 -7.331250000000000000e+01 -1.020025000000000182e+00 -7.334375000000000000e+01 -1.020029999999999992e+00 -7.350000000000000000e+01 -1.020035000000000025e+00 -7.365625000000000000e+01 -1.020040000000000058e+00 -7.384375762939453125e+01 -1.020045000000000091e+00 -7.400000000000000000e+01 -1.020050000000000123e+00 -7.403125000000000000e+01 -1.020055000000000156e+00 -7.393750000000000000e+01 -1.020060000000000189e+00 -7.381250000000000000e+01 -1.020065000000000000e+00 -7.359375000000000000e+01 -1.020070000000000032e+00 -7.334375000000000000e+01 -1.020075000000000065e+00 -7.309375000000000000e+01 -1.020080000000000098e+00 -7.287500000000000000e+01 -1.020085000000000131e+00 -7.278125000000000000e+01 -1.020090000000000163e+00 -7.253125000000000000e+01 -1.020094999999999974e+00 -7.246875000000000000e+01 -1.020100000000000007e+00 -7.231250762939453125e+01 -1.020105000000000040e+00 -7.231250762939453125e+01 -1.020110000000000072e+00 -7.215625000000000000e+01 -1.020115000000000105e+00 -7.209375762939453125e+01 -1.020120000000000138e+00 -7.203125000000000000e+01 -1.020125000000000171e+00 -7.187500000000000000e+01 -1.020129999999999981e+00 -7.175000000000000000e+01 -1.020135000000000014e+00 -7.171875000000000000e+01 -1.020140000000000047e+00 -7.162500000000000000e+01 -1.020145000000000080e+00 -7.153125000000000000e+01 -1.020150000000000112e+00 -7.146875000000000000e+01 -1.020155000000000145e+00 -7.134375000000000000e+01 -1.020160000000000178e+00 -7.131250000000000000e+01 -1.020164999999999988e+00 -7.118750000000000000e+01 -1.020170000000000021e+00 -7.115625000000000000e+01 -1.020175000000000054e+00 -7.106250762939453125e+01 -1.020180000000000087e+00 -7.096875762939453125e+01 -1.020185000000000120e+00 -7.096875762939453125e+01 -1.020190000000000152e+00 -7.078125000000000000e+01 -1.020195000000000185e+00 -7.071875000000000000e+01 -1.020199999999999996e+00 -7.059375000000000000e+01 -1.020205000000000028e+00 -7.053125000000000000e+01 -1.020210000000000061e+00 -7.046875000000000000e+01 -1.020215000000000094e+00 -7.046875000000000000e+01 -1.020220000000000127e+00 -7.034375762939453125e+01 -1.020225000000000160e+00 -7.025000762939453125e+01 -1.020230000000000192e+00 -7.021875000000000000e+01 -1.020235000000000003e+00 -7.012500000000000000e+01 -1.020240000000000036e+00 -7.003125000000000000e+01 -1.020245000000000068e+00 -7.003125000000000000e+01 -1.020250000000000101e+00 -6.990625000000000000e+01 -1.020255000000000134e+00 -6.984375762939453125e+01 -1.020260000000000167e+00 -6.978125000000000000e+01 -1.020264999999999977e+00 -6.968750000000000000e+01 -1.020270000000000010e+00 -6.965625000000000000e+01 -1.020275000000000043e+00 -6.959375000000000000e+01 -1.020280000000000076e+00 -6.953125762939453125e+01 -1.020285000000000108e+00 -6.946875000000000000e+01 -1.020290000000000141e+00 -6.937500000000000000e+01 -1.020295000000000174e+00 -6.937500000000000000e+01 -1.020299999999999985e+00 -6.928125000000000000e+01 -1.020305000000000017e+00 -6.918750000000000000e+01 -1.020310000000000050e+00 -6.912500762939453125e+01 -1.020315000000000083e+00 -6.912500762939453125e+01 -1.020320000000000116e+00 -6.900000000000000000e+01 -1.020325000000000149e+00 -6.900000000000000000e+01 -1.020330000000000181e+00 -6.893750000000000000e+01 -1.020334999999999992e+00 -6.890625762939453125e+01 -1.020340000000000025e+00 -6.887500000000000000e+01 -1.020345000000000057e+00 -6.881250762939453125e+01 -1.020350000000000090e+00 -6.871875000000000000e+01 -1.020355000000000123e+00 -6.868750000000000000e+01 -1.020360000000000156e+00 -6.865625000000000000e+01 -1.020365000000000189e+00 -6.859375000000000000e+01 -1.020369999999999999e+00 -6.850000762939453125e+01 -1.020375000000000032e+00 -6.843750000000000000e+01 -1.020380000000000065e+00 -6.843750000000000000e+01 -1.020385000000000097e+00 -6.834375000000000000e+01 -1.020390000000000130e+00 -6.821875000000000000e+01 -1.020395000000000163e+00 -6.821875000000000000e+01 -1.020399999999999974e+00 -6.825000000000000000e+01 -1.020405000000000006e+00 -6.815625000000000000e+01 -1.020410000000000039e+00 -6.812500000000000000e+01 -1.020415000000000072e+00 -6.809375762939453125e+01 -1.020420000000000105e+00 -6.803125000000000000e+01 -1.020425000000000137e+00 -6.796875000000000000e+01 -1.020430000000000170e+00 -6.790625000000000000e+01 -1.020434999999999981e+00 -6.784375000000000000e+01 -1.020440000000000014e+00 -6.778125762939453125e+01 -1.020445000000000046e+00 -6.781250000000000000e+01 -1.020450000000000079e+00 -6.775000000000000000e+01 -1.020455000000000112e+00 -6.768750762939453125e+01 -1.020460000000000145e+00 -6.765625000000000000e+01 -1.020465000000000177e+00 -6.759375000000000000e+01 -1.020469999999999988e+00 -6.753125000000000000e+01 -1.020475000000000021e+00 -6.756250000000000000e+01 -1.020480000000000054e+00 -6.750000000000000000e+01 -1.020485000000000086e+00 -6.743750000000000000e+01 -1.020490000000000119e+00 -6.734375000000000000e+01 -1.020495000000000152e+00 -6.740625000000000000e+01 -1.020500000000000185e+00 -6.734375000000000000e+01 -1.020504999999999995e+00 -6.728125000000000000e+01 -1.020510000000000028e+00 -6.728125000000000000e+01 -1.020515000000000061e+00 -6.725000000000000000e+01 -1.020520000000000094e+00 -6.721875000000000000e+01 -1.020525000000000126e+00 -6.715625000000000000e+01 -1.020530000000000159e+00 -6.715625000000000000e+01 -1.020535000000000192e+00 -6.706250762939453125e+01 -1.020540000000000003e+00 -6.703125000000000000e+01 -1.020545000000000035e+00 -6.703125000000000000e+01 -1.020550000000000068e+00 -6.690625000000000000e+01 -1.020555000000000101e+00 -6.690625000000000000e+01 -1.020560000000000134e+00 -6.690625000000000000e+01 -1.020565000000000166e+00 -6.684375000000000000e+01 -1.020569999999999977e+00 -6.684375000000000000e+01 -1.020575000000000010e+00 -6.684375000000000000e+01 -1.020580000000000043e+00 -6.681250000000000000e+01 -1.020585000000000075e+00 -6.681250000000000000e+01 -1.020590000000000108e+00 -6.671875000000000000e+01 -1.020595000000000141e+00 -6.671875000000000000e+01 -1.020600000000000174e+00 -6.668750000000000000e+01 -1.020604999999999984e+00 -6.659375000000000000e+01 -1.020610000000000017e+00 -6.659375000000000000e+01 -1.020615000000000050e+00 -6.650000000000000000e+01 -1.020620000000000083e+00 -6.653125000000000000e+01 -1.020625000000000115e+00 -6.650000000000000000e+01 -1.020630000000000148e+00 -6.646875000000000000e+01 -1.020635000000000181e+00 -6.643750762939453125e+01 -1.020639999999999992e+00 -6.643750762939453125e+01 -1.020645000000000024e+00 -6.640625000000000000e+01 -1.020650000000000057e+00 -6.637500000000000000e+01 -1.020655000000000090e+00 -6.634375762939453125e+01 -1.020660000000000123e+00 -6.631250000000000000e+01 -1.020665000000000155e+00 -6.625000762939453125e+01 -1.020670000000000188e+00 -6.621875000000000000e+01 -1.020674999999999999e+00 -6.615625000000000000e+01 -1.020680000000000032e+00 -6.615625000000000000e+01 -1.020685000000000064e+00 -6.618750000000000000e+01 -1.020690000000000097e+00 -6.615625000000000000e+01 -1.020695000000000130e+00 -6.609375000000000000e+01 -1.020700000000000163e+00 -6.606250000000000000e+01 -1.020704999999999973e+00 -6.606250000000000000e+01 -1.020710000000000006e+00 -6.603125762939453125e+01 -1.020715000000000039e+00 -6.600000000000000000e+01 -1.020720000000000072e+00 -6.603125762939453125e+01 -1.020725000000000104e+00 -6.596875000000000000e+01 -1.020730000000000137e+00 -6.596875000000000000e+01 -1.020735000000000170e+00 -6.590625000000000000e+01 -1.020739999999999981e+00 -6.587500000000000000e+01 -1.020745000000000013e+00 -6.590625000000000000e+01 -1.020750000000000046e+00 -6.584375000000000000e+01 -1.020755000000000079e+00 -6.581250000000000000e+01 -1.020760000000000112e+00 -6.584375000000000000e+01 -1.020765000000000144e+00 -6.575000000000000000e+01 -1.020770000000000177e+00 -6.578125000000000000e+01 -1.020774999999999988e+00 -6.578125000000000000e+01 -1.020780000000000021e+00 -6.568750000000000000e+01 -1.020785000000000053e+00 -6.565625000000000000e+01 -1.020790000000000086e+00 -6.559375000000000000e+01 -1.020795000000000119e+00 -6.559375000000000000e+01 -1.020800000000000152e+00 -6.559375000000000000e+01 -1.020805000000000184e+00 -6.553125000000000000e+01 -1.020809999999999995e+00 -6.553125000000000000e+01 -1.020815000000000028e+00 -6.556250000000000000e+01 -1.020820000000000061e+00 -6.550000000000000000e+01 -1.020825000000000093e+00 -6.553125000000000000e+01 -1.020830000000000126e+00 -6.546875000000000000e+01 -1.020835000000000159e+00 -6.540625000000000000e+01 -1.020840000000000192e+00 -6.546875000000000000e+01 -1.020845000000000002e+00 -6.540625000000000000e+01 -1.020850000000000035e+00 -6.534375000000000000e+01 -1.020855000000000068e+00 -6.537500000000000000e+01 -1.020860000000000101e+00 -6.537500000000000000e+01 -1.020865000000000133e+00 -6.531250762939453125e+01 -1.020870000000000166e+00 -6.534375000000000000e+01 -1.020874999999999977e+00 -6.525000000000000000e+01 -1.020880000000000010e+00 -6.521875762939453125e+01 -1.020885000000000042e+00 -6.521875762939453125e+01 -1.020890000000000075e+00 -6.528125000000000000e+01 -1.020895000000000108e+00 -6.518750000000000000e+01 -1.020900000000000141e+00 -6.515625000000000000e+01 -1.020905000000000173e+00 -6.518750000000000000e+01 -1.020909999999999984e+00 -6.509375000000000000e+01 -1.020915000000000017e+00 -6.509375000000000000e+01 -1.020920000000000050e+00 -6.506250000000000000e+01 -1.020925000000000082e+00 -6.506250000000000000e+01 -1.020930000000000115e+00 -6.506250000000000000e+01 -1.020935000000000148e+00 -6.503125000000000000e+01 -1.020940000000000181e+00 -6.500000762939453125e+01 -1.020944999999999991e+00 -6.500000762939453125e+01 -1.020950000000000024e+00 -6.500000762939453125e+01 -1.020955000000000057e+00 -6.496875000000000000e+01 -1.020960000000000090e+00 -6.496875000000000000e+01 -1.020965000000000122e+00 -6.493750000000000000e+01 -1.020970000000000155e+00 -6.490625762939453125e+01 -1.020975000000000188e+00 -6.493750000000000000e+01 -1.020979999999999999e+00 -6.493750000000000000e+01 -1.020985000000000031e+00 -6.490625762939453125e+01 -1.020990000000000064e+00 -6.490625762939453125e+01 -1.020995000000000097e+00 -6.478125000000000000e+01 -1.021000000000000130e+00 -6.484375000000000000e+01 -1.021005000000000162e+00 -6.484375000000000000e+01 -1.021009999999999973e+00 -6.481250000000000000e+01 -1.021015000000000006e+00 -6.481250000000000000e+01 -1.021020000000000039e+00 -6.478125000000000000e+01 -1.021025000000000071e+00 -6.468750000000000000e+01 -1.021030000000000104e+00 -6.471875000000000000e+01 -1.021035000000000137e+00 -6.471875000000000000e+01 -1.021040000000000170e+00 -6.465625000000000000e+01 -1.021044999999999980e+00 -6.468750000000000000e+01 -1.021050000000000013e+00 -6.465625000000000000e+01 -1.021055000000000046e+00 -6.468750000000000000e+01 -1.021060000000000079e+00 -6.456250000000000000e+01 -1.021065000000000111e+00 -6.465625000000000000e+01 -1.021070000000000144e+00 -6.456250000000000000e+01 -1.021075000000000177e+00 -6.453125000000000000e+01 -1.021079999999999988e+00 -6.456250000000000000e+01 -1.021085000000000020e+00 -6.453125000000000000e+01 -1.021090000000000053e+00 -6.453125000000000000e+01 -1.021095000000000086e+00 -6.450000762939453125e+01 -1.021100000000000119e+00 -6.453125000000000000e+01 -1.021105000000000151e+00 -6.450000762939453125e+01 -1.021110000000000184e+00 -6.446875000000000000e+01 -1.021114999999999995e+00 -6.440625000000000000e+01 -1.021120000000000028e+00 -6.450000762939453125e+01 -1.021125000000000060e+00 -6.443750000000000000e+01 -1.021130000000000093e+00 -6.437500000000000000e+01 -1.021135000000000126e+00 -6.437500000000000000e+01 -1.021140000000000159e+00 -6.440625000000000000e+01 -1.021145000000000191e+00 -6.431250000000000000e+01 -1.021150000000000002e+00 -6.431250000000000000e+01 -1.021155000000000035e+00 -6.428125762939453125e+01 -1.021160000000000068e+00 -6.431250000000000000e+01 -1.021165000000000100e+00 -6.428125762939453125e+01 -1.021170000000000133e+00 -6.421875000000000000e+01 -1.021175000000000166e+00 -6.421875000000000000e+01 -1.021179999999999977e+00 -6.421875000000000000e+01 -1.021185000000000009e+00 -6.421875000000000000e+01 -1.021190000000000042e+00 -6.415625000000000000e+01 -1.021195000000000075e+00 -6.418750762939453125e+01 -1.021200000000000108e+00 -6.418750762939453125e+01 -1.021205000000000140e+00 -6.415625000000000000e+01 -1.021210000000000173e+00 -6.418750762939453125e+01 -1.021214999999999984e+00 -6.409375000000000000e+01 -1.021220000000000017e+00 -6.412500000000000000e+01 -1.021225000000000049e+00 -6.409375000000000000e+01 -1.021230000000000082e+00 -6.409375000000000000e+01 -1.021235000000000115e+00 -6.406250000000000000e+01 -1.021240000000000148e+00 -6.409375000000000000e+01 -1.021245000000000180e+00 -6.406250000000000000e+01 -1.021249999999999991e+00 -6.403125000000000000e+01 -1.021255000000000024e+00 -6.403125000000000000e+01 -1.021260000000000057e+00 -6.403125000000000000e+01 -1.021265000000000089e+00 -6.403125000000000000e+01 -1.021270000000000122e+00 -6.403125000000000000e+01 -1.021275000000000155e+00 -6.403125000000000000e+01 -1.021280000000000188e+00 -6.403125000000000000e+01 -1.021284999999999998e+00 -6.403125000000000000e+01 -1.021290000000000031e+00 -6.403125000000000000e+01 -1.021295000000000064e+00 -6.396874618530273438e+01 -1.021300000000000097e+00 -6.403125000000000000e+01 -1.021305000000000129e+00 -6.400000000000000000e+01 -1.021310000000000162e+00 -6.403125000000000000e+01 -1.021314999999999973e+00 -6.393750000000000000e+01 -1.021320000000000006e+00 -6.396874618530273438e+01 -1.021325000000000038e+00 -6.387500381469726562e+01 -1.021330000000000071e+00 -6.393750000000000000e+01 -1.021335000000000104e+00 -6.390625381469726562e+01 -1.021340000000000137e+00 -6.381250000000000000e+01 -1.021345000000000169e+00 -6.390625381469726562e+01 -1.021349999999999980e+00 -6.390625381469726562e+01 -1.021355000000000013e+00 -6.384375000000000000e+01 -1.021360000000000046e+00 -6.384375000000000000e+01 -1.021365000000000078e+00 -6.381250000000000000e+01 -1.021370000000000111e+00 -6.378125381469726562e+01 -1.021375000000000144e+00 -6.381250000000000000e+01 -1.021380000000000177e+00 -6.384375000000000000e+01 -1.021384999999999987e+00 -6.384375000000000000e+01 -1.021390000000000020e+00 -6.381250000000000000e+01 -1.021395000000000053e+00 -6.384375000000000000e+01 -1.021400000000000086e+00 -6.381250000000000000e+01 -1.021405000000000118e+00 -6.368750381469726562e+01 -1.021410000000000151e+00 -6.378125381469726562e+01 -1.021415000000000184e+00 -6.381250000000000000e+01 -1.021419999999999995e+00 -6.371875000000000000e+01 -1.021425000000000027e+00 -6.378125381469726562e+01 -1.021430000000000060e+00 -6.371875000000000000e+01 -1.021435000000000093e+00 -6.368750381469726562e+01 -1.021440000000000126e+00 -6.362500000000000000e+01 -1.021445000000000158e+00 -6.368750381469726562e+01 -1.021450000000000191e+00 -6.368750381469726562e+01 -1.021455000000000002e+00 -6.365625000000000000e+01 -1.021460000000000035e+00 -6.365625000000000000e+01 -1.021465000000000067e+00 -6.365625000000000000e+01 -1.021470000000000100e+00 -6.362500000000000000e+01 -1.021475000000000133e+00 -6.362500000000000000e+01 -1.021480000000000166e+00 -6.359375381469726562e+01 -1.021484999999999976e+00 -6.359375381469726562e+01 -1.021490000000000009e+00 -6.359375381469726562e+01 -1.021495000000000042e+00 -6.362500000000000000e+01 -1.021500000000000075e+00 -6.353125000000000000e+01 -1.021505000000000107e+00 -6.359375381469726562e+01 -1.021510000000000140e+00 -6.365625000000000000e+01 -1.021515000000000173e+00 -6.359375381469726562e+01 -1.021519999999999984e+00 -6.353125000000000000e+01 -1.021525000000000016e+00 -6.359375381469726562e+01 -1.021530000000000049e+00 -6.350000381469726562e+01 -1.021535000000000082e+00 -6.350000381469726562e+01 -1.021540000000000115e+00 -6.350000381469726562e+01 -1.021545000000000147e+00 -6.343750000000000000e+01 -1.021550000000000180e+00 -6.346875381469726562e+01 -1.021554999999999991e+00 -6.343750000000000000e+01 -1.021560000000000024e+00 -6.343750000000000000e+01 -1.021565000000000056e+00 -6.343750000000000000e+01 -1.021570000000000089e+00 -6.337500381469726562e+01 -1.021575000000000122e+00 -6.340625000000000000e+01 -1.021580000000000155e+00 -6.337500381469726562e+01 -1.021585000000000187e+00 -6.334375000000000000e+01 -1.021589999999999998e+00 -6.334375000000000000e+01 -1.021595000000000031e+00 -6.334375000000000000e+01 -1.021600000000000064e+00 -6.337500381469726562e+01 -1.021605000000000096e+00 -6.328125381469726562e+01 -1.021610000000000129e+00 -6.331250000000000000e+01 -1.021615000000000162e+00 -6.328125381469726562e+01 -1.021619999999999973e+00 -6.331250000000000000e+01 -1.021625000000000005e+00 -6.324999618530273438e+01 -1.021630000000000038e+00 -6.321875000000000000e+01 -1.021635000000000071e+00 -6.328125381469726562e+01 -1.021640000000000104e+00 -6.328125381469726562e+01 -1.021645000000000136e+00 -6.331250000000000000e+01 -1.021650000000000169e+00 -6.324999618530273438e+01 -1.021654999999999980e+00 -6.328125381469726562e+01 -1.021660000000000013e+00 -6.321875000000000000e+01 -1.021665000000000045e+00 -6.324999618530273438e+01 -1.021670000000000078e+00 -6.315625381469726562e+01 -1.021675000000000111e+00 -6.315625381469726562e+01 -1.021680000000000144e+00 -6.318750381469726562e+01 -1.021685000000000176e+00 -6.312500000000000000e+01 -1.021689999999999987e+00 -6.318750381469726562e+01 -1.021695000000000020e+00 -6.315625381469726562e+01 -1.021700000000000053e+00 -6.309375000000000000e+01 -1.021705000000000085e+00 -6.315625381469726562e+01 -1.021710000000000118e+00 -6.315625381469726562e+01 -1.021715000000000151e+00 -6.309375000000000000e+01 -1.021720000000000184e+00 -6.309375000000000000e+01 -1.021724999999999994e+00 -6.306250381469726562e+01 -1.021730000000000027e+00 -6.309375000000000000e+01 -1.021735000000000060e+00 -6.306250381469726562e+01 -1.021740000000000093e+00 -6.306250381469726562e+01 -1.021745000000000125e+00 -6.306250381469726562e+01 -1.021750000000000158e+00 -6.300000000000000000e+01 -1.021755000000000191e+00 -6.303125000000000000e+01 -1.021760000000000002e+00 -6.306250381469726562e+01 -1.021765000000000034e+00 -6.306250381469726562e+01 -1.021770000000000067e+00 -6.300000000000000000e+01 -1.021775000000000100e+00 -6.300000000000000000e+01 -1.021780000000000133e+00 -6.300000000000000000e+01 -1.021785000000000165e+00 -6.300000000000000000e+01 -1.021789999999999976e+00 -6.300000000000000000e+01 -1.021795000000000009e+00 -6.300000000000000000e+01 -1.021800000000000042e+00 -6.300000000000000000e+01 -1.021805000000000074e+00 -6.296875381469726562e+01 -1.021810000000000107e+00 -6.300000000000000000e+01 -1.021815000000000140e+00 -6.296875381469726562e+01 -1.021820000000000173e+00 -6.293750000000000000e+01 -1.021824999999999983e+00 -6.287500381469726562e+01 -1.021830000000000016e+00 -6.296875381469726562e+01 -1.021835000000000049e+00 -6.293750000000000000e+01 -1.021840000000000082e+00 -6.290625000000000000e+01 -1.021845000000000114e+00 -6.284375381469726562e+01 -1.021850000000000147e+00 -6.290625000000000000e+01 -1.021855000000000180e+00 -6.290625000000000000e+01 -1.021859999999999991e+00 -6.284375381469726562e+01 -1.021865000000000023e+00 -6.284375381469726562e+01 -1.021870000000000056e+00 -6.287500381469726562e+01 -1.021875000000000089e+00 -6.278125381469726562e+01 -1.021880000000000122e+00 -6.287500381469726562e+01 -1.021885000000000154e+00 -6.284375381469726562e+01 -1.021890000000000187e+00 -6.278125381469726562e+01 -1.021894999999999998e+00 -6.278125381469726562e+01 -1.021900000000000031e+00 -6.278125381469726562e+01 -1.021905000000000063e+00 -6.275000381469726562e+01 -1.021910000000000096e+00 -6.278125381469726562e+01 -1.021915000000000129e+00 -6.278125381469726562e+01 -1.021920000000000162e+00 -6.271875000000000000e+01 -1.021925000000000194e+00 -6.268750000000000000e+01 -1.021930000000000005e+00 -6.275000381469726562e+01 -1.021935000000000038e+00 -6.278125381469726562e+01 -1.021940000000000071e+00 -6.275000381469726562e+01 -1.021945000000000103e+00 -6.275000381469726562e+01 -1.021950000000000136e+00 -6.271875000000000000e+01 -1.021955000000000169e+00 -6.275000381469726562e+01 -1.021959999999999980e+00 -6.268750000000000000e+01 -1.021965000000000012e+00 -6.268750000000000000e+01 -1.021970000000000045e+00 -6.268750000000000000e+01 -1.021975000000000078e+00 -6.265625381469726562e+01 -1.021980000000000111e+00 -6.262500000000000000e+01 -1.021985000000000143e+00 -6.271875000000000000e+01 -1.021990000000000176e+00 -6.268750000000000000e+01 -1.021994999999999987e+00 -6.265625381469726562e+01 -1.022000000000000020e+00 -6.268750000000000000e+01 -1.022005000000000052e+00 -6.268750000000000000e+01 -1.022010000000000085e+00 -6.268750000000000000e+01 -1.022015000000000118e+00 -6.262500000000000000e+01 -1.022020000000000151e+00 -6.265625381469726562e+01 -1.022025000000000183e+00 -6.262500000000000000e+01 -1.022029999999999994e+00 -6.262500000000000000e+01 -1.022035000000000027e+00 -6.265625381469726562e+01 -1.022040000000000060e+00 -6.268750000000000000e+01 -1.022045000000000092e+00 -6.259375000000000000e+01 -1.022050000000000125e+00 -6.265625381469726562e+01 -1.022055000000000158e+00 -6.262500000000000000e+01 -1.022060000000000191e+00 -6.262500000000000000e+01 -1.022065000000000001e+00 -6.259375000000000000e+01 -1.022070000000000034e+00 -6.256250381469726562e+01 -1.022075000000000067e+00 -6.262500000000000000e+01 -1.022080000000000100e+00 -6.253124618530273438e+01 -1.022085000000000132e+00 -6.259375000000000000e+01 -1.022090000000000165e+00 -6.256250381469726562e+01 -1.022094999999999976e+00 -6.253124618530273438e+01 -1.022100000000000009e+00 -6.253124618530273438e+01 -1.022105000000000041e+00 -6.253124618530273438e+01 -1.022110000000000074e+00 -6.246875381469726562e+01 -1.022115000000000107e+00 -6.253124618530273438e+01 -1.022120000000000140e+00 -6.250000000000000000e+01 -1.022125000000000172e+00 -6.250000000000000000e+01 -1.022129999999999983e+00 -6.246875381469726562e+01 -1.022135000000000016e+00 -6.246875381469726562e+01 -1.022140000000000049e+00 -6.250000000000000000e+01 -1.022145000000000081e+00 -6.240625381469726562e+01 -1.022150000000000114e+00 -6.240625381469726562e+01 -1.022155000000000147e+00 -6.243750000000000000e+01 -1.022160000000000180e+00 -6.243750000000000000e+01 -1.022164999999999990e+00 -6.243750000000000000e+01 -1.022170000000000023e+00 -6.240625381469726562e+01 -1.022175000000000056e+00 -6.246875381469726562e+01 -1.022180000000000089e+00 -6.237500000000000000e+01 -1.022185000000000121e+00 -6.237500000000000000e+01 -1.022190000000000154e+00 -6.243750000000000000e+01 -1.022195000000000187e+00 -6.237500000000000000e+01 -1.022199999999999998e+00 -6.240625381469726562e+01 -1.022205000000000030e+00 -6.243750000000000000e+01 -1.022210000000000063e+00 -6.237500000000000000e+01 -1.022215000000000096e+00 -6.231250381469726562e+01 -1.022220000000000129e+00 -6.234375000000000000e+01 -1.022225000000000161e+00 -6.234375000000000000e+01 -1.022230000000000194e+00 -6.231250381469726562e+01 -1.022235000000000005e+00 -6.231250381469726562e+01 -1.022240000000000038e+00 -6.231250381469726562e+01 -1.022245000000000070e+00 -6.228125000000000000e+01 -1.022250000000000103e+00 -6.228125000000000000e+01 -1.022255000000000136e+00 -6.231250381469726562e+01 -1.022260000000000169e+00 -6.231250381469726562e+01 -1.022264999999999979e+00 -6.228125000000000000e+01 -1.022270000000000012e+00 -6.225000381469726562e+01 -1.022275000000000045e+00 -6.218750000000000000e+01 -1.022280000000000078e+00 -6.225000381469726562e+01 -1.022285000000000110e+00 -6.221875000000000000e+01 -1.022290000000000143e+00 -6.221875000000000000e+01 -1.022295000000000176e+00 -6.218750000000000000e+01 -1.022299999999999986e+00 -6.218750000000000000e+01 -1.022305000000000019e+00 -6.221875000000000000e+01 -1.022310000000000052e+00 -6.221875000000000000e+01 -1.022315000000000085e+00 -6.218750000000000000e+01 -1.022320000000000118e+00 -6.218750000000000000e+01 -1.022325000000000150e+00 -6.218750000000000000e+01 -1.022330000000000183e+00 -6.225000381469726562e+01 -1.022334999999999994e+00 -6.212500000000000000e+01 -1.022340000000000027e+00 -6.215625381469726562e+01 -1.022345000000000059e+00 -6.212500000000000000e+01 -1.022350000000000092e+00 -6.212500000000000000e+01 -1.022355000000000125e+00 -6.215625381469726562e+01 -1.022360000000000158e+00 -6.209375000000000000e+01 -1.022365000000000190e+00 -6.206250000000000000e+01 -1.022370000000000001e+00 -6.206250000000000000e+01 -1.022375000000000034e+00 -6.209375000000000000e+01 -1.022380000000000067e+00 -6.206250000000000000e+01 -1.022385000000000099e+00 -6.203125000000000000e+01 -1.022390000000000132e+00 -6.206250000000000000e+01 -1.022395000000000165e+00 -6.206250000000000000e+01 -1.022399999999999975e+00 -6.200000381469726562e+01 -1.022405000000000008e+00 -6.200000381469726562e+01 -1.022410000000000041e+00 -6.203125000000000000e+01 -1.022415000000000074e+00 -6.200000381469726562e+01 -1.022420000000000107e+00 -6.200000381469726562e+01 -1.022425000000000139e+00 -6.196875000000000000e+01 -1.022430000000000172e+00 -6.193750000000000000e+01 -1.022434999999999983e+00 -6.200000381469726562e+01 -1.022440000000000015e+00 -6.200000381469726562e+01 -1.022445000000000048e+00 -6.193750000000000000e+01 -1.022450000000000081e+00 -6.190625381469726562e+01 -1.022455000000000114e+00 -6.187500000000000000e+01 -1.022460000000000147e+00 -6.187500000000000000e+01 -1.022465000000000179e+00 -6.193750000000000000e+01 -1.022469999999999990e+00 -6.187500000000000000e+01 -1.022475000000000023e+00 -6.184375381469726562e+01 -1.022480000000000055e+00 -6.190625381469726562e+01 -1.022485000000000088e+00 -6.184375381469726562e+01 -1.022490000000000121e+00 -6.184375381469726562e+01 -1.022495000000000154e+00 -6.178125000000000000e+01 -1.022500000000000187e+00 -6.181250000000000000e+01 -1.022504999999999997e+00 -6.187500000000000000e+01 -1.022510000000000030e+00 -6.178125000000000000e+01 -1.022515000000000063e+00 -6.175000381469726562e+01 -1.022520000000000095e+00 -6.184375381469726562e+01 -1.022525000000000128e+00 -6.178125000000000000e+01 -1.022530000000000161e+00 -6.178125000000000000e+01 -1.022535000000000194e+00 -6.175000381469726562e+01 -1.022540000000000004e+00 -6.178125000000000000e+01 -1.022545000000000037e+00 -6.175000381469726562e+01 -1.022550000000000070e+00 -6.171875000000000000e+01 -1.022555000000000103e+00 -6.178125000000000000e+01 -1.022560000000000136e+00 -6.175000381469726562e+01 -1.022565000000000168e+00 -6.168750381469726562e+01 -1.022569999999999979e+00 -6.168750381469726562e+01 -1.022575000000000012e+00 -6.175000381469726562e+01 -1.022580000000000044e+00 -6.171875000000000000e+01 -1.022585000000000077e+00 -6.168750381469726562e+01 -1.022590000000000110e+00 -6.171875000000000000e+01 -1.022595000000000143e+00 -6.171875000000000000e+01 -1.022600000000000176e+00 -6.171875000000000000e+01 -1.022604999999999986e+00 -6.171875000000000000e+01 -1.022610000000000019e+00 -6.162500000000000000e+01 -1.022615000000000052e+00 -6.168750381469726562e+01 -1.022620000000000084e+00 -6.165625000000000000e+01 -1.022625000000000117e+00 -6.162500000000000000e+01 -1.022630000000000150e+00 -6.165625000000000000e+01 -1.022635000000000183e+00 -6.159375381469726562e+01 -1.022639999999999993e+00 -6.159375381469726562e+01 -1.022645000000000026e+00 -6.165625000000000000e+01 -1.022650000000000059e+00 -6.162500000000000000e+01 -1.022655000000000092e+00 -6.156250000000000000e+01 -1.022660000000000124e+00 -6.165625000000000000e+01 -1.022665000000000157e+00 -6.156250000000000000e+01 -1.022670000000000190e+00 -6.159375381469726562e+01 -1.022675000000000001e+00 -6.159375381469726562e+01 -1.022680000000000033e+00 -6.156250000000000000e+01 -1.022685000000000066e+00 -6.159375381469726562e+01 -1.022690000000000099e+00 -6.159375381469726562e+01 -1.022695000000000132e+00 -6.159375381469726562e+01 -1.022700000000000164e+00 -6.159375381469726562e+01 -1.022704999999999975e+00 -6.159375381469726562e+01 -1.022710000000000008e+00 -6.159375381469726562e+01 -1.022715000000000041e+00 -6.156250000000000000e+01 -1.022720000000000073e+00 -6.153125381469726562e+01 -1.022725000000000106e+00 -6.159375381469726562e+01 -1.022730000000000139e+00 -6.150000000000000000e+01 -1.022735000000000172e+00 -6.153125381469726562e+01 -1.022739999999999982e+00 -6.153125381469726562e+01 -1.022745000000000015e+00 -6.150000000000000000e+01 -1.022750000000000048e+00 -6.150000000000000000e+01 -1.022755000000000081e+00 -6.146875000000000000e+01 -1.022760000000000113e+00 -6.146875000000000000e+01 -1.022765000000000146e+00 -6.146875000000000000e+01 -1.022770000000000179e+00 -6.143750381469726562e+01 -1.022774999999999990e+00 -6.143750381469726562e+01 -1.022780000000000022e+00 -6.146875000000000000e+01 -1.022785000000000055e+00 -6.143750381469726562e+01 -1.022790000000000088e+00 -6.143750381469726562e+01 -1.022795000000000121e+00 -6.146875000000000000e+01 -1.022800000000000153e+00 -6.146875000000000000e+01 -1.022805000000000186e+00 -6.143750381469726562e+01 -1.022809999999999997e+00 -6.140625000000000000e+01 -1.022815000000000030e+00 -6.137500000000000000e+01 -1.022820000000000062e+00 -6.134375000000000000e+01 -1.022825000000000095e+00 -6.140625000000000000e+01 -1.022830000000000128e+00 -6.140625000000000000e+01 -1.022835000000000161e+00 -6.137500000000000000e+01 -1.022840000000000193e+00 -6.143750381469726562e+01 -1.022845000000000004e+00 -6.140625000000000000e+01 -1.022850000000000037e+00 -6.134375000000000000e+01 -1.022855000000000070e+00 -6.137500000000000000e+01 -1.022860000000000102e+00 -6.143750381469726562e+01 -1.022865000000000135e+00 -6.146875000000000000e+01 -1.022870000000000168e+00 -6.140625000000000000e+01 -1.022874999999999979e+00 -6.131250000000000000e+01 -1.022880000000000011e+00 -6.143750381469726562e+01 -1.022885000000000044e+00 -6.131250000000000000e+01 -1.022890000000000077e+00 -6.134375000000000000e+01 -1.022895000000000110e+00 -6.128125381469726562e+01 -1.022900000000000142e+00 -6.134375000000000000e+01 -1.022905000000000175e+00 -6.131250000000000000e+01 -1.022909999999999986e+00 -6.128125381469726562e+01 -1.022915000000000019e+00 -6.131250000000000000e+01 -1.022920000000000051e+00 -6.125000000000000000e+01 -1.022925000000000084e+00 -6.128125381469726562e+01 -1.022930000000000117e+00 -6.121875000000000000e+01 -1.022935000000000150e+00 -6.125000000000000000e+01 -1.022940000000000182e+00 -6.121875000000000000e+01 -1.022944999999999993e+00 -6.125000000000000000e+01 -1.022950000000000026e+00 -6.121875000000000000e+01 -1.022955000000000059e+00 -6.125000000000000000e+01 -1.022960000000000091e+00 -6.115625000000000000e+01 -1.022965000000000124e+00 -6.121875000000000000e+01 -1.022970000000000157e+00 -6.115625000000000000e+01 -1.022975000000000190e+00 -6.118750381469726562e+01 -1.022980000000000000e+00 -6.118750381469726562e+01 -1.022985000000000033e+00 -6.115625000000000000e+01 -1.022990000000000066e+00 -6.112500381469726562e+01 -1.022995000000000099e+00 -6.115625000000000000e+01 -1.023000000000000131e+00 -6.115625000000000000e+01 -1.023005000000000164e+00 -6.112500381469726562e+01 -1.023009999999999975e+00 -6.109375000000000000e+01 -1.023015000000000008e+00 -6.109375000000000000e+01 -1.023020000000000040e+00 -6.115625000000000000e+01 -1.023025000000000073e+00 -6.106250000000000000e+01 -1.023030000000000106e+00 -6.109375000000000000e+01 -1.023035000000000139e+00 -6.109375000000000000e+01 -1.023040000000000171e+00 -6.112500381469726562e+01 -1.023044999999999982e+00 -6.112500381469726562e+01 -1.023050000000000015e+00 -6.109375000000000000e+01 -1.023055000000000048e+00 -6.106250000000000000e+01 -1.023060000000000080e+00 -6.112500381469726562e+01 -1.023065000000000113e+00 -6.103125381469726562e+01 -1.023070000000000146e+00 -6.106250000000000000e+01 -1.023075000000000179e+00 -6.103125381469726562e+01 -1.023079999999999989e+00 -6.106250000000000000e+01 -1.023085000000000022e+00 -6.103125381469726562e+01 -1.023090000000000055e+00 -6.100000000000000000e+01 -1.023095000000000088e+00 -6.100000000000000000e+01 -1.023100000000000120e+00 -6.100000000000000000e+01 -1.023105000000000153e+00 -6.100000000000000000e+01 -1.023110000000000186e+00 -6.093750000000000000e+01 -1.023114999999999997e+00 -6.103125381469726562e+01 -1.023120000000000029e+00 -6.096875381469726562e+01 -1.023125000000000062e+00 -6.100000000000000000e+01 -1.023130000000000095e+00 -6.100000000000000000e+01 -1.023135000000000128e+00 -6.100000000000000000e+01 -1.023140000000000160e+00 -6.096875381469726562e+01 -1.023145000000000193e+00 -6.096875381469726562e+01 -1.023150000000000004e+00 -6.093750000000000000e+01 -1.023155000000000037e+00 -6.093750000000000000e+01 -1.023160000000000069e+00 -6.096875381469726562e+01 -1.023165000000000102e+00 -6.093750000000000000e+01 -1.023170000000000135e+00 -6.093750000000000000e+01 -1.023175000000000168e+00 -6.084375000000000000e+01 -1.023179999999999978e+00 -6.090625000000000000e+01 -1.023185000000000011e+00 -6.090625000000000000e+01 -1.023190000000000044e+00 -6.090625000000000000e+01 -1.023195000000000077e+00 -6.093750000000000000e+01 -1.023200000000000109e+00 -6.087500381469726562e+01 -1.023205000000000142e+00 -6.087500381469726562e+01 -1.023210000000000175e+00 -6.084375000000000000e+01 -1.023214999999999986e+00 -6.087500381469726562e+01 -1.023220000000000018e+00 -6.087500381469726562e+01 -1.023225000000000051e+00 -6.087500381469726562e+01 -1.023230000000000084e+00 -6.087500381469726562e+01 -1.023235000000000117e+00 -6.081250381469726562e+01 -1.023240000000000149e+00 -6.081250381469726562e+01 -1.023245000000000182e+00 -6.081250381469726562e+01 -1.023249999999999993e+00 -6.087500381469726562e+01 -1.023255000000000026e+00 -6.081250381469726562e+01 -1.023260000000000058e+00 -6.081250381469726562e+01 -1.023265000000000091e+00 -6.084375000000000000e+01 -1.023270000000000124e+00 -6.078125000000000000e+01 -1.023275000000000157e+00 -6.075000000000000000e+01 -1.023280000000000189e+00 -6.068750000000000000e+01 -1.023285000000000000e+00 -6.075000000000000000e+01 -1.023290000000000033e+00 -6.068750000000000000e+01 -1.023295000000000066e+00 -6.078125000000000000e+01 -1.023300000000000098e+00 -6.075000000000000000e+01 -1.023305000000000131e+00 -6.068750000000000000e+01 -1.023310000000000164e+00 -6.068750000000000000e+01 -1.023314999999999975e+00 -6.071875381469726562e+01 -1.023320000000000007e+00 -6.068750000000000000e+01 -1.023325000000000040e+00 -6.071875381469726562e+01 -1.023330000000000073e+00 -6.065625000000000000e+01 -1.023335000000000106e+00 -6.068750000000000000e+01 -1.023340000000000138e+00 -6.065625000000000000e+01 -1.023345000000000171e+00 -6.065625000000000000e+01 -1.023349999999999982e+00 -6.071875381469726562e+01 -1.023355000000000015e+00 -6.062500000000000000e+01 -1.023360000000000047e+00 -6.062500000000000000e+01 -1.023365000000000080e+00 -6.059375000000000000e+01 -1.023370000000000113e+00 -6.059375000000000000e+01 -1.023375000000000146e+00 -6.059375000000000000e+01 -1.023380000000000178e+00 -6.062500000000000000e+01 -1.023384999999999989e+00 -6.062500000000000000e+01 -1.023390000000000022e+00 -6.062500000000000000e+01 -1.023395000000000055e+00 -6.059375000000000000e+01 -1.023400000000000087e+00 -6.065625000000000000e+01 -1.023405000000000120e+00 -6.056250381469726562e+01 -1.023410000000000153e+00 -6.059375000000000000e+01 -1.023415000000000186e+00 -6.062500000000000000e+01 -1.023419999999999996e+00 -6.056250381469726562e+01 -1.023425000000000029e+00 -6.059375000000000000e+01 -1.023430000000000062e+00 -6.059375000000000000e+01 -1.023435000000000095e+00 -6.059375000000000000e+01 -1.023440000000000127e+00 -6.056250381469726562e+01 -1.023445000000000160e+00 -6.056250381469726562e+01 -1.023450000000000193e+00 -6.050000000000000000e+01 -1.023455000000000004e+00 -6.056250381469726562e+01 -1.023460000000000036e+00 -6.062500000000000000e+01 -1.023465000000000069e+00 -6.053125000000000000e+01 -1.023470000000000102e+00 -6.053125000000000000e+01 -1.023475000000000135e+00 -6.053125000000000000e+01 -1.023480000000000167e+00 -6.053125000000000000e+01 -1.023484999999999978e+00 -6.050000000000000000e+01 -1.023490000000000011e+00 -6.053125000000000000e+01 -1.023495000000000044e+00 -6.053125000000000000e+01 -1.023500000000000076e+00 -6.050000000000000000e+01 -1.023505000000000109e+00 -6.050000000000000000e+01 -1.023510000000000142e+00 -6.050000000000000000e+01 -1.023515000000000175e+00 -6.043750000000000000e+01 -1.023519999999999985e+00 -6.050000000000000000e+01 -1.023525000000000018e+00 -6.040625381469726562e+01 -1.023530000000000051e+00 -6.050000000000000000e+01 -1.023535000000000084e+00 -6.043750000000000000e+01 -1.023540000000000116e+00 -6.040625381469726562e+01 -1.023545000000000149e+00 -6.046875381469726562e+01 -1.023550000000000182e+00 -6.046875381469726562e+01 -1.023554999999999993e+00 -6.043750000000000000e+01 -1.023560000000000025e+00 -6.040625381469726562e+01 -1.023565000000000058e+00 -6.040625381469726562e+01 -1.023570000000000091e+00 -6.046875381469726562e+01 -1.023575000000000124e+00 -6.034375000000000000e+01 -1.023580000000000156e+00 -6.040625381469726562e+01 -1.023585000000000189e+00 -6.043750000000000000e+01 -1.023590000000000000e+00 -6.037500000000000000e+01 -1.023595000000000033e+00 -6.040625381469726562e+01 -1.023600000000000065e+00 -6.040625381469726562e+01 -1.023605000000000098e+00 -6.037500000000000000e+01 -1.023610000000000131e+00 -6.034375000000000000e+01 -1.023615000000000164e+00 -6.037500000000000000e+01 -1.023619999999999974e+00 -6.034375000000000000e+01 -1.023625000000000007e+00 -6.031250381469726562e+01 -1.023630000000000040e+00 -6.034375000000000000e+01 -1.023635000000000073e+00 -6.034375000000000000e+01 -1.023640000000000105e+00 -6.025000381469726562e+01 -1.023645000000000138e+00 -6.025000381469726562e+01 -1.023650000000000171e+00 -6.021875000000000000e+01 -1.023654999999999982e+00 -6.034375000000000000e+01 -1.023660000000000014e+00 -6.018750000000000000e+01 -1.023665000000000047e+00 -6.028125000000000000e+01 -1.023670000000000080e+00 -6.028125000000000000e+01 -1.023675000000000113e+00 -6.018750000000000000e+01 -1.023680000000000145e+00 -6.021875000000000000e+01 -1.023685000000000178e+00 -6.025000381469726562e+01 -1.023689999999999989e+00 -6.018750000000000000e+01 -1.023695000000000022e+00 -6.018750000000000000e+01 -1.023700000000000054e+00 -6.028125000000000000e+01 -1.023705000000000087e+00 -6.025000381469726562e+01 -1.023710000000000120e+00 -6.021875000000000000e+01 -1.023715000000000153e+00 -6.018750000000000000e+01 -1.023720000000000185e+00 -6.028125000000000000e+01 -1.023724999999999996e+00 -6.018750000000000000e+01 -1.023730000000000029e+00 -6.021875000000000000e+01 -1.023735000000000062e+00 -6.018750000000000000e+01 -1.023740000000000094e+00 -6.021875000000000000e+01 -1.023745000000000127e+00 -6.015625381469726562e+01 -1.023750000000000160e+00 -6.015625381469726562e+01 -1.023755000000000193e+00 -6.009375381469726562e+01 -1.023760000000000003e+00 -6.012500000000000000e+01 -1.023765000000000036e+00 -6.009375381469726562e+01 -1.023770000000000069e+00 -6.012500000000000000e+01 -1.023775000000000102e+00 -6.009375381469726562e+01 -1.023780000000000134e+00 -6.012500000000000000e+01 -1.023785000000000167e+00 -6.012500000000000000e+01 -1.023789999999999978e+00 -6.015625381469726562e+01 -1.023795000000000011e+00 -6.012500000000000000e+01 -1.023800000000000043e+00 -6.009375381469726562e+01 -1.023805000000000076e+00 -6.012500000000000000e+01 -1.023810000000000109e+00 -6.012500000000000000e+01 -1.023815000000000142e+00 -6.003125000000000000e+01 -1.023820000000000174e+00 -6.009375381469726562e+01 -1.023824999999999985e+00 -6.009375381469726562e+01 -1.023830000000000018e+00 -6.009375381469726562e+01 -1.023835000000000051e+00 -6.003125000000000000e+01 -1.023840000000000083e+00 -6.000000381469726562e+01 -1.023845000000000116e+00 -5.996875000000000000e+01 -1.023850000000000149e+00 -6.003125000000000000e+01 -1.023855000000000182e+00 -6.000000381469726562e+01 -1.023859999999999992e+00 -5.996875000000000000e+01 -1.023865000000000025e+00 -5.996875000000000000e+01 -1.023870000000000058e+00 -6.006250000000000000e+01 -1.023875000000000091e+00 -5.993750381469726562e+01 -1.023880000000000123e+00 -5.993750381469726562e+01 -1.023885000000000156e+00 -6.000000381469726562e+01 -1.023890000000000189e+00 -5.996875000000000000e+01 -1.023895000000000000e+00 -5.993750381469726562e+01 -1.023900000000000032e+00 -5.993750381469726562e+01 -1.023905000000000065e+00 -5.990625000000000000e+01 -1.023910000000000098e+00 -5.996875000000000000e+01 -1.023915000000000131e+00 -5.990625000000000000e+01 -1.023920000000000163e+00 -5.993750381469726562e+01 -1.023924999999999974e+00 -5.990625000000000000e+01 -1.023930000000000007e+00 -5.987500000000000000e+01 -1.023935000000000040e+00 -5.990625000000000000e+01 -1.023940000000000072e+00 -5.996875000000000000e+01 -1.023945000000000105e+00 -5.987500000000000000e+01 -1.023950000000000138e+00 -5.984375381469726562e+01 -1.023955000000000171e+00 -5.981250000000000000e+01 -1.023959999999999981e+00 -5.990625000000000000e+01 -1.023965000000000014e+00 -5.981250000000000000e+01 -1.023970000000000047e+00 -5.987500000000000000e+01 -1.023975000000000080e+00 -5.987500000000000000e+01 -1.023980000000000112e+00 -5.990625000000000000e+01 -1.023985000000000145e+00 -5.984375381469726562e+01 -1.023990000000000178e+00 -5.981250000000000000e+01 -1.023994999999999989e+00 -5.990625000000000000e+01 -1.024000000000000021e+00 -5.978125000000000000e+01 -1.024005000000000054e+00 -5.984375381469726562e+01 -1.024010000000000087e+00 -5.984375381469726562e+01 -1.024015000000000120e+00 -5.981250000000000000e+01 -1.024020000000000152e+00 -5.984375381469726562e+01 -1.024025000000000185e+00 -5.981250000000000000e+01 -1.024029999999999996e+00 -5.978125000000000000e+01 -1.024035000000000029e+00 -5.968750381469726562e+01 -1.024040000000000061e+00 -5.978125000000000000e+01 -1.024045000000000094e+00 -5.981250000000000000e+01 -1.024050000000000127e+00 -5.978125000000000000e+01 -1.024055000000000160e+00 -5.975000000000000000e+01 -1.024060000000000192e+00 -5.978125000000000000e+01 -1.024065000000000003e+00 -5.981250000000000000e+01 -1.024070000000000036e+00 -5.971875000000000000e+01 -1.024075000000000069e+00 -5.968750381469726562e+01 -1.024080000000000101e+00 -5.971875000000000000e+01 -1.024085000000000134e+00 -5.971875000000000000e+01 -1.024090000000000167e+00 -5.975000000000000000e+01 -1.024094999999999978e+00 -5.968750381469726562e+01 -1.024100000000000010e+00 -5.978125000000000000e+01 -1.024105000000000043e+00 -5.971875000000000000e+01 -1.024110000000000076e+00 -5.971875000000000000e+01 -1.024115000000000109e+00 -5.968750381469726562e+01 -1.024120000000000141e+00 -5.971875000000000000e+01 -1.024125000000000174e+00 -5.968750381469726562e+01 -1.024129999999999985e+00 -5.965625000000000000e+01 -1.024135000000000018e+00 -5.965625000000000000e+01 -1.024140000000000050e+00 -5.959375381469726562e+01 -1.024145000000000083e+00 -5.965625000000000000e+01 -1.024150000000000116e+00 -5.959375381469726562e+01 -1.024155000000000149e+00 -5.968750381469726562e+01 -1.024160000000000181e+00 -5.962500000000000000e+01 -1.024164999999999992e+00 -5.962500000000000000e+01 -1.024170000000000025e+00 -5.959375381469726562e+01 -1.024175000000000058e+00 -5.962500000000000000e+01 -1.024180000000000090e+00 -5.956250000000000000e+01 -1.024185000000000123e+00 -5.965625000000000000e+01 -1.024190000000000156e+00 -5.962500000000000000e+01 -1.024195000000000189e+00 -5.962500000000000000e+01 -1.024199999999999999e+00 -5.956250000000000000e+01 -1.024205000000000032e+00 -5.962500000000000000e+01 -1.024210000000000065e+00 -5.953125381469726562e+01 -1.024215000000000098e+00 -5.965625000000000000e+01 -1.024220000000000130e+00 -5.962500000000000000e+01 -1.024225000000000163e+00 -5.956250000000000000e+01 -1.024229999999999974e+00 -5.956250000000000000e+01 -1.024235000000000007e+00 -5.959375381469726562e+01 -1.024240000000000039e+00 -5.959375381469726562e+01 -1.024245000000000072e+00 -5.953125381469726562e+01 -1.024250000000000105e+00 -5.953125381469726562e+01 -1.024255000000000138e+00 -5.956250000000000000e+01 -1.024260000000000170e+00 -5.950000000000000000e+01 -1.024264999999999981e+00 -5.950000000000000000e+01 -1.024270000000000014e+00 -5.956250000000000000e+01 -1.024275000000000047e+00 -5.950000000000000000e+01 -1.024280000000000079e+00 -5.950000000000000000e+01 -1.024285000000000112e+00 -5.950000000000000000e+01 -1.024290000000000145e+00 -5.953125381469726562e+01 -1.024295000000000178e+00 -5.950000000000000000e+01 -1.024299999999999988e+00 -5.950000000000000000e+01 -1.024305000000000021e+00 -5.950000000000000000e+01 -1.024310000000000054e+00 -5.953125381469726562e+01 -1.024315000000000087e+00 -5.943750381469726562e+01 -1.024320000000000119e+00 -5.946875000000000000e+01 -1.024325000000000152e+00 -5.943750381469726562e+01 -1.024330000000000185e+00 -5.950000000000000000e+01 -1.024334999999999996e+00 -5.946875000000000000e+01 -1.024340000000000028e+00 -5.953125381469726562e+01 -1.024345000000000061e+00 -5.946875000000000000e+01 -1.024350000000000094e+00 -5.943750381469726562e+01 -1.024355000000000127e+00 -5.943750381469726562e+01 -1.024360000000000159e+00 -5.940625000000000000e+01 -1.024365000000000192e+00 -5.943750381469726562e+01 -1.024370000000000003e+00 -5.946875000000000000e+01 -1.024375000000000036e+00 -5.940625000000000000e+01 -1.024380000000000068e+00 -5.934375000000000000e+01 -1.024385000000000101e+00 -5.943750381469726562e+01 -1.024390000000000134e+00 -5.940625000000000000e+01 -1.024395000000000167e+00 -5.940625000000000000e+01 -1.024399999999999977e+00 -5.943750381469726562e+01 -1.024405000000000010e+00 -5.943750381469726562e+01 -1.024410000000000043e+00 -5.937500381469726562e+01 -1.024415000000000076e+00 -5.934375000000000000e+01 -1.024420000000000108e+00 -5.937500381469726562e+01 -1.024425000000000141e+00 -5.934375000000000000e+01 -1.024430000000000174e+00 -5.940625000000000000e+01 -1.024434999999999985e+00 -5.934375000000000000e+01 -1.024440000000000017e+00 -5.931250000000000000e+01 -1.024445000000000050e+00 -5.931250000000000000e+01 -1.024450000000000083e+00 -5.934375000000000000e+01 -1.024455000000000116e+00 -5.931250000000000000e+01 -1.024460000000000148e+00 -5.934375000000000000e+01 -1.024465000000000181e+00 -5.934375000000000000e+01 -1.024469999999999992e+00 -5.934375000000000000e+01 -1.024475000000000025e+00 -5.928125381469726562e+01 -1.024480000000000057e+00 -5.928125381469726562e+01 -1.024485000000000090e+00 -5.928125381469726562e+01 -1.024490000000000123e+00 -5.928125381469726562e+01 -1.024495000000000156e+00 -5.921875381469726562e+01 -1.024500000000000188e+00 -5.925000000000000000e+01 -1.024504999999999999e+00 -5.928125381469726562e+01 -1.024510000000000032e+00 -5.921875381469726562e+01 -1.024515000000000065e+00 -5.921875381469726562e+01 -1.024520000000000097e+00 -5.925000000000000000e+01 -1.024525000000000130e+00 -5.918750000000000000e+01 -1.024530000000000163e+00 -5.918750000000000000e+01 -1.024534999999999973e+00 -5.918750000000000000e+01 -1.024540000000000006e+00 -5.915625000000000000e+01 -1.024545000000000039e+00 -5.915625000000000000e+01 -1.024550000000000072e+00 -5.915625000000000000e+01 -1.024555000000000105e+00 -5.918750000000000000e+01 -1.024560000000000137e+00 -5.918750000000000000e+01 -1.024565000000000170e+00 -5.909375000000000000e+01 -1.024569999999999981e+00 -5.915625000000000000e+01 -1.024575000000000014e+00 -5.912500381469726562e+01 -1.024580000000000046e+00 -5.918750000000000000e+01 -1.024585000000000079e+00 -5.915625000000000000e+01 -1.024590000000000112e+00 -5.912500381469726562e+01 -1.024595000000000145e+00 -5.915625000000000000e+01 -1.024600000000000177e+00 -5.915625000000000000e+01 -1.024604999999999988e+00 -5.909375000000000000e+01 -1.024610000000000021e+00 -5.912500381469726562e+01 -1.024615000000000054e+00 -5.915625000000000000e+01 -1.024620000000000086e+00 -5.906250000000000000e+01 -1.024625000000000119e+00 -5.903125000000000000e+01 -1.024630000000000152e+00 -5.909375000000000000e+01 -1.024635000000000185e+00 -5.900000000000000000e+01 -1.024639999999999995e+00 -5.903125000000000000e+01 -1.024645000000000028e+00 -5.903125000000000000e+01 -1.024650000000000061e+00 -5.909375000000000000e+01 -1.024655000000000094e+00 -5.906250000000000000e+01 -1.024660000000000126e+00 -5.900000000000000000e+01 -1.024665000000000159e+00 -5.903125000000000000e+01 -1.024670000000000192e+00 -5.900000000000000000e+01 -1.024675000000000002e+00 -5.903125000000000000e+01 -1.024680000000000035e+00 -5.900000000000000000e+01 -1.024685000000000068e+00 -5.903125000000000000e+01 -1.024690000000000101e+00 -5.900000000000000000e+01 -1.024695000000000134e+00 -5.900000000000000000e+01 -1.024700000000000166e+00 -5.900000000000000000e+01 -1.024704999999999977e+00 -5.903125000000000000e+01 -1.024710000000000010e+00 -5.903125000000000000e+01 -1.024715000000000042e+00 -5.900000000000000000e+01 -1.024720000000000075e+00 -5.900000000000000000e+01 -1.024725000000000108e+00 -5.900000000000000000e+01 -1.024730000000000141e+00 -5.893750000000000000e+01 -1.024735000000000174e+00 -5.896875381469726562e+01 -1.024739999999999984e+00 -5.900000000000000000e+01 -1.024745000000000017e+00 -5.900000000000000000e+01 -1.024750000000000050e+00 -5.890625000000000000e+01 -1.024755000000000082e+00 -5.893750000000000000e+01 -1.024760000000000115e+00 -5.890625000000000000e+01 -1.024765000000000148e+00 -5.893750000000000000e+01 -1.024770000000000181e+00 -5.890625000000000000e+01 -1.024774999999999991e+00 -5.896875381469726562e+01 -1.024780000000000024e+00 -5.893750000000000000e+01 -1.024785000000000057e+00 -5.893750000000000000e+01 -1.024790000000000090e+00 -5.887500381469726562e+01 -1.024795000000000122e+00 -5.890625000000000000e+01 -1.024800000000000155e+00 -5.893750000000000000e+01 -1.024805000000000188e+00 -5.893750000000000000e+01 -1.024809999999999999e+00 -5.893750000000000000e+01 -1.024815000000000031e+00 -5.893750000000000000e+01 -1.024820000000000064e+00 -5.896875381469726562e+01 -1.024825000000000097e+00 -5.884375000000000000e+01 -1.024830000000000130e+00 -5.887500381469726562e+01 -1.024835000000000163e+00 -5.887500381469726562e+01 -1.024839999999999973e+00 -5.884375000000000000e+01 -1.024845000000000006e+00 -5.878125000000000000e+01 -1.024850000000000039e+00 -5.884375000000000000e+01 -1.024855000000000071e+00 -5.881250381469726562e+01 -1.024860000000000104e+00 -5.884375000000000000e+01 -1.024865000000000137e+00 -5.881250381469726562e+01 -1.024870000000000170e+00 -5.884375000000000000e+01 -1.024874999999999980e+00 -5.881250381469726562e+01 -1.024880000000000013e+00 -5.875000000000000000e+01 -1.024885000000000046e+00 -5.878125000000000000e+01 -1.024890000000000079e+00 -5.881250381469726562e+01 -1.024895000000000111e+00 -5.884375000000000000e+01 -1.024900000000000144e+00 -5.878125000000000000e+01 -1.024905000000000177e+00 -5.884375000000000000e+01 -1.024909999999999988e+00 -5.881250381469726562e+01 -1.024915000000000020e+00 -5.881250381469726562e+01 -1.024920000000000053e+00 -5.875000000000000000e+01 -1.024925000000000086e+00 -5.875000000000000000e+01 -1.024930000000000119e+00 -5.884375000000000000e+01 -1.024935000000000151e+00 -5.878125000000000000e+01 -1.024940000000000184e+00 -5.878125000000000000e+01 -1.024944999999999995e+00 -5.881250381469726562e+01 -1.024950000000000028e+00 -5.878125000000000000e+01 -1.024955000000000060e+00 -5.878125000000000000e+01 -1.024960000000000093e+00 -5.875000000000000000e+01 -1.024965000000000126e+00 -5.875000000000000000e+01 -1.024970000000000159e+00 -5.871875381469726562e+01 -1.024975000000000191e+00 -5.868750000000000000e+01 -1.024980000000000002e+00 -5.862500000000000000e+01 -1.024985000000000035e+00 -5.865625381469726562e+01 -1.024990000000000068e+00 -5.865625381469726562e+01 -1.024995000000000100e+00 -5.862500000000000000e+01 -1.025000000000000133e+00 -5.865625381469726562e+01 -1.025005000000000166e+00 -5.862500000000000000e+01 -1.025009999999999977e+00 -5.862500000000000000e+01 -1.025015000000000009e+00 -5.862500000000000000e+01 -1.025020000000000042e+00 -5.862500000000000000e+01 -1.025025000000000075e+00 -5.865625381469726562e+01 -1.025030000000000108e+00 -5.865625381469726562e+01 -1.025035000000000140e+00 -5.865625381469726562e+01 -1.025040000000000173e+00 -5.862500000000000000e+01 -1.025044999999999984e+00 -5.862500000000000000e+01 -1.025050000000000017e+00 -5.865625381469726562e+01 -1.025055000000000049e+00 -5.862500000000000000e+01 -1.025060000000000082e+00 -5.865625381469726562e+01 -1.025065000000000115e+00 -5.859375000000000000e+01 -1.025070000000000148e+00 -5.862500000000000000e+01 -1.025075000000000180e+00 -5.862500000000000000e+01 -1.025079999999999991e+00 -5.859375000000000000e+01 -1.025085000000000024e+00 -5.856250381469726562e+01 -1.025090000000000057e+00 -5.856250381469726562e+01 -1.025095000000000089e+00 -5.856250381469726562e+01 -1.025100000000000122e+00 -5.859375000000000000e+01 -1.025105000000000155e+00 -5.859375000000000000e+01 -1.025110000000000188e+00 -5.859375000000000000e+01 -1.025114999999999998e+00 -5.856250381469726562e+01 -1.025120000000000031e+00 -5.853125000000000000e+01 -1.025125000000000064e+00 -5.856250381469726562e+01 -1.025130000000000097e+00 -5.853125000000000000e+01 -1.025135000000000129e+00 -5.850000381469726562e+01 -1.025140000000000162e+00 -5.850000381469726562e+01 -1.025144999999999973e+00 -5.850000381469726562e+01 -1.025150000000000006e+00 -5.846875000000000000e+01 -1.025155000000000038e+00 -5.850000381469726562e+01 -1.025160000000000071e+00 -5.850000381469726562e+01 -1.025165000000000104e+00 -5.850000381469726562e+01 -1.025170000000000137e+00 -5.843750000000000000e+01 -1.025175000000000169e+00 -5.846875000000000000e+01 -1.025179999999999980e+00 -5.850000381469726562e+01 -1.025185000000000013e+00 -5.846875000000000000e+01 -1.025190000000000046e+00 -5.846875000000000000e+01 -1.025195000000000078e+00 -5.843750000000000000e+01 -1.025200000000000111e+00 -5.846875000000000000e+01 -1.025205000000000144e+00 -5.840625381469726562e+01 -1.025210000000000177e+00 -5.843750000000000000e+01 -1.025214999999999987e+00 -5.843750000000000000e+01 -1.025220000000000020e+00 -5.837500000000000000e+01 -1.025225000000000053e+00 -5.846875000000000000e+01 -1.025230000000000086e+00 -5.843750000000000000e+01 -1.025235000000000118e+00 -5.837500000000000000e+01 -1.025240000000000151e+00 -5.834375000000000000e+01 -1.025245000000000184e+00 -5.837500000000000000e+01 -1.025249999999999995e+00 -5.837500000000000000e+01 -1.025255000000000027e+00 -5.834375000000000000e+01 -1.025260000000000060e+00 -5.834375000000000000e+01 -1.025265000000000093e+00 -5.831250000000000000e+01 -1.025270000000000126e+00 -5.831250000000000000e+01 -1.025275000000000158e+00 -5.831250000000000000e+01 -1.025280000000000191e+00 -5.828125000000000000e+01 -1.025285000000000002e+00 -5.831250000000000000e+01 -1.025290000000000035e+00 -5.831250000000000000e+01 -1.025295000000000067e+00 -5.828125000000000000e+01 -1.025300000000000100e+00 -5.825000381469726562e+01 -1.025305000000000133e+00 -5.828125000000000000e+01 -1.025310000000000166e+00 -5.825000381469726562e+01 -1.025314999999999976e+00 -5.825000381469726562e+01 -1.025320000000000009e+00 -5.825000381469726562e+01 -1.025325000000000042e+00 -5.821875000000000000e+01 -1.025330000000000075e+00 -5.825000381469726562e+01 -1.025335000000000107e+00 -5.821875000000000000e+01 -1.025340000000000140e+00 -5.821875000000000000e+01 -1.025345000000000173e+00 -5.821875000000000000e+01 -1.025349999999999984e+00 -5.825000381469726562e+01 -1.025355000000000016e+00 -5.821875000000000000e+01 -1.025360000000000049e+00 -5.821875000000000000e+01 -1.025365000000000082e+00 -5.828125000000000000e+01 -1.025370000000000115e+00 -5.821875000000000000e+01 -1.025375000000000147e+00 -5.821875000000000000e+01 -1.025380000000000180e+00 -5.825000381469726562e+01 -1.025384999999999991e+00 -5.818750000000000000e+01 -1.025390000000000024e+00 -5.828125000000000000e+01 -1.025395000000000056e+00 -5.815625000000000000e+01 -1.025400000000000089e+00 -5.821875000000000000e+01 -1.025405000000000122e+00 -5.815625000000000000e+01 -1.025410000000000155e+00 -5.812500000000000000e+01 -1.025415000000000187e+00 -5.818750000000000000e+01 -1.025419999999999998e+00 -5.812500000000000000e+01 -1.025425000000000031e+00 -5.809375381469726562e+01 -1.025430000000000064e+00 -5.812500000000000000e+01 -1.025435000000000096e+00 -5.815625000000000000e+01 -1.025440000000000129e+00 -5.809375381469726562e+01 -1.025445000000000162e+00 -5.812500000000000000e+01 -1.025450000000000195e+00 -5.821875000000000000e+01 -1.025455000000000005e+00 -5.815625000000000000e+01 -1.025460000000000038e+00 -5.812500000000000000e+01 -1.025465000000000071e+00 -5.815625000000000000e+01 -1.025470000000000104e+00 -5.815625000000000000e+01 -1.025475000000000136e+00 -5.812500000000000000e+01 -1.025480000000000169e+00 -5.812500000000000000e+01 -1.025484999999999980e+00 -5.806250000000000000e+01 -1.025490000000000013e+00 -5.803125000000000000e+01 -1.025495000000000045e+00 -5.809375381469726562e+01 -1.025500000000000078e+00 -5.809375381469726562e+01 -1.025505000000000111e+00 -5.806250000000000000e+01 -1.025510000000000144e+00 -5.806250000000000000e+01 -1.025515000000000176e+00 -5.809375381469726562e+01 -1.025519999999999987e+00 -5.812500000000000000e+01 -1.025525000000000020e+00 -5.809375381469726562e+01 -1.025530000000000053e+00 -5.803125000000000000e+01 -1.025535000000000085e+00 -5.803125000000000000e+01 -1.025540000000000118e+00 -5.809375381469726562e+01 -1.025545000000000151e+00 -5.809375381469726562e+01 -1.025550000000000184e+00 -5.806250000000000000e+01 -1.025554999999999994e+00 -5.806250000000000000e+01 -1.025560000000000027e+00 -5.803125000000000000e+01 -1.025565000000000060e+00 -5.806250000000000000e+01 -1.025570000000000093e+00 -5.800000381469726562e+01 -1.025575000000000125e+00 -5.803125000000000000e+01 -1.025580000000000158e+00 -5.803125000000000000e+01 -1.025585000000000191e+00 -5.803125000000000000e+01 -1.025590000000000002e+00 -5.800000381469726562e+01 -1.025595000000000034e+00 -5.796875000000000000e+01 -1.025600000000000067e+00 -5.800000381469726562e+01 -1.025605000000000100e+00 -5.796875000000000000e+01 -1.025610000000000133e+00 -5.803125000000000000e+01 -1.025615000000000165e+00 -5.800000381469726562e+01 -1.025619999999999976e+00 -5.793750381469726562e+01 -1.025625000000000009e+00 -5.800000381469726562e+01 -1.025630000000000042e+00 -5.793750381469726562e+01 -1.025635000000000074e+00 -5.790625000000000000e+01 -1.025640000000000107e+00 -5.787500000000000000e+01 -1.025645000000000140e+00 -5.787500000000000000e+01 -1.025650000000000173e+00 -5.787500000000000000e+01 -1.025654999999999983e+00 -5.790625000000000000e+01 -1.025660000000000016e+00 -5.793750381469726562e+01 -1.025665000000000049e+00 -5.787500000000000000e+01 -1.025670000000000082e+00 -5.790625000000000000e+01 -1.025675000000000114e+00 -5.790625000000000000e+01 -1.025680000000000147e+00 -5.787500000000000000e+01 -1.025685000000000180e+00 -5.787500000000000000e+01 -1.025689999999999991e+00 -5.784375381469726562e+01 -1.025695000000000023e+00 -5.781250000000000000e+01 -1.025700000000000056e+00 -5.784375381469726562e+01 -1.025705000000000089e+00 -5.778125381469726562e+01 -1.025710000000000122e+00 -5.787500000000000000e+01 -1.025715000000000154e+00 -5.784375381469726562e+01 -1.025720000000000187e+00 -5.784375381469726562e+01 -1.025724999999999998e+00 -5.787500000000000000e+01 -1.025730000000000031e+00 -5.781250000000000000e+01 -1.025735000000000063e+00 -5.778125381469726562e+01 -1.025740000000000096e+00 -5.784375381469726562e+01 -1.025745000000000129e+00 -5.778125381469726562e+01 -1.025750000000000162e+00 -5.781250000000000000e+01 -1.025755000000000194e+00 -5.778125381469726562e+01 -1.025760000000000005e+00 -5.778125381469726562e+01 -1.025765000000000038e+00 -5.781250000000000000e+01 -1.025770000000000071e+00 -5.775000000000000000e+01 -1.025775000000000103e+00 -5.781250000000000000e+01 -1.025780000000000136e+00 -5.771875000000000000e+01 -1.025785000000000169e+00 -5.775000000000000000e+01 -1.025789999999999980e+00 -5.778125381469726562e+01 -1.025795000000000012e+00 -5.775000000000000000e+01 -1.025800000000000045e+00 -5.775000000000000000e+01 -1.025805000000000078e+00 -5.778125381469726562e+01 -1.025810000000000111e+00 -5.775000000000000000e+01 -1.025815000000000143e+00 -5.771875000000000000e+01 -1.025820000000000176e+00 -5.781250000000000000e+01 -1.025824999999999987e+00 -5.771875000000000000e+01 -1.025830000000000020e+00 -5.771875000000000000e+01 -1.025835000000000052e+00 -5.771875000000000000e+01 -1.025840000000000085e+00 -5.775000000000000000e+01 -1.025845000000000118e+00 -5.771875000000000000e+01 -1.025850000000000151e+00 -5.771875000000000000e+01 -1.025855000000000183e+00 -5.775000000000000000e+01 -1.025859999999999994e+00 -5.765625000000000000e+01 -1.025865000000000027e+00 -5.765625000000000000e+01 -1.025870000000000060e+00 -5.765625000000000000e+01 -1.025875000000000092e+00 -5.765625000000000000e+01 -1.025880000000000125e+00 -5.765625000000000000e+01 -1.025885000000000158e+00 -5.762500000000000000e+01 -1.025890000000000191e+00 -5.759375000000000000e+01 -1.025895000000000001e+00 -5.765625000000000000e+01 -1.025900000000000034e+00 -5.765625000000000000e+01 -1.025905000000000067e+00 -5.762500000000000000e+01 -1.025910000000000100e+00 -5.759375000000000000e+01 -1.025915000000000132e+00 -5.765625000000000000e+01 -1.025920000000000165e+00 -5.765625000000000000e+01 -1.025924999999999976e+00 -5.762500000000000000e+01 -1.025930000000000009e+00 -5.759375000000000000e+01 -1.025935000000000041e+00 -5.759375000000000000e+01 -1.025940000000000074e+00 -5.762500000000000000e+01 -1.025945000000000107e+00 -5.756250000000000000e+01 -1.025950000000000140e+00 -5.759375000000000000e+01 -1.025955000000000172e+00 -5.753125381469726562e+01 -1.025959999999999983e+00 -5.762500000000000000e+01 -1.025965000000000016e+00 -5.756250000000000000e+01 -1.025970000000000049e+00 -5.759375000000000000e+01 -1.025975000000000081e+00 -5.753125381469726562e+01 -1.025980000000000114e+00 -5.759375000000000000e+01 -1.025985000000000147e+00 -5.756250000000000000e+01 -1.025990000000000180e+00 -5.756250000000000000e+01 -1.025994999999999990e+00 -5.759375000000000000e+01 -1.026000000000000023e+00 -5.753125381469726562e+01 -1.026005000000000056e+00 -5.753125381469726562e+01 -1.026010000000000089e+00 -5.753125381469726562e+01 -1.026015000000000121e+00 -5.746875000000000000e+01 -1.026020000000000154e+00 -5.756250000000000000e+01 -1.026025000000000187e+00 -5.753125381469726562e+01 -1.026029999999999998e+00 -5.753125381469726562e+01 -1.026035000000000030e+00 -5.753125381469726562e+01 -1.026040000000000063e+00 -5.750000000000000000e+01 -1.026045000000000096e+00 -5.750000000000000000e+01 -1.026050000000000129e+00 -5.750000000000000000e+01 -1.026055000000000161e+00 -5.750000000000000000e+01 -1.026060000000000194e+00 -5.750000000000000000e+01 -1.026065000000000005e+00 -5.746875000000000000e+01 -1.026070000000000038e+00 -5.746875000000000000e+01 -1.026075000000000070e+00 -5.746875000000000000e+01 -1.026080000000000103e+00 -5.746875000000000000e+01 -1.026085000000000136e+00 -5.746875000000000000e+01 -1.026090000000000169e+00 -5.750000000000000000e+01 -1.026094999999999979e+00 -5.746875000000000000e+01 -1.026100000000000012e+00 -5.743750000000000000e+01 -1.026105000000000045e+00 -5.746875000000000000e+01 -1.026110000000000078e+00 -5.743750000000000000e+01 -1.026115000000000110e+00 -5.737500381469726562e+01 -1.026120000000000143e+00 -5.746875000000000000e+01 -1.026125000000000176e+00 -5.743750000000000000e+01 -1.026129999999999987e+00 -5.743750000000000000e+01 -1.026135000000000019e+00 -5.737500381469726562e+01 -1.026140000000000052e+00 -5.737500381469726562e+01 -1.026145000000000085e+00 -5.740625000000000000e+01 -1.026150000000000118e+00 -5.740625000000000000e+01 -1.026155000000000150e+00 -5.734375000000000000e+01 -1.026160000000000183e+00 -5.740625000000000000e+01 -1.026164999999999994e+00 -5.731250000000000000e+01 -1.026170000000000027e+00 -5.740625000000000000e+01 -1.026175000000000059e+00 -5.734375000000000000e+01 -1.026180000000000092e+00 -5.734375000000000000e+01 -1.026185000000000125e+00 -5.731250000000000000e+01 -1.026190000000000158e+00 -5.734375000000000000e+01 -1.026195000000000190e+00 -5.737500381469726562e+01 -1.026200000000000001e+00 -5.734375000000000000e+01 -1.026205000000000034e+00 -5.728125381469726562e+01 -1.026210000000000067e+00 -5.731250000000000000e+01 -1.026215000000000099e+00 -5.728125381469726562e+01 -1.026220000000000132e+00 -5.728125381469726562e+01 -1.026225000000000165e+00 -5.728125381469726562e+01 -1.026229999999999976e+00 -5.728125381469726562e+01 -1.026235000000000008e+00 -5.734375000000000000e+01 -1.026240000000000041e+00 -5.725000000000000000e+01 -1.026245000000000074e+00 -5.725000000000000000e+01 -1.026250000000000107e+00 -5.725000000000000000e+01 -1.026255000000000139e+00 -5.725000000000000000e+01 -1.026260000000000172e+00 -5.721875381469726562e+01 -1.026264999999999983e+00 -5.721875381469726562e+01 -1.026270000000000016e+00 -5.721875381469726562e+01 -1.026275000000000048e+00 -5.715625000000000000e+01 -1.026280000000000081e+00 -5.725000000000000000e+01 -1.026285000000000114e+00 -5.721875381469726562e+01 -1.026290000000000147e+00 -5.725000000000000000e+01 -1.026295000000000179e+00 -5.718750000000000000e+01 -1.026299999999999990e+00 -5.721875381469726562e+01 -1.026305000000000023e+00 -5.718750000000000000e+01 -1.026310000000000056e+00 -5.721875381469726562e+01 -1.026315000000000088e+00 -5.718750000000000000e+01 -1.026320000000000121e+00 -5.712500381469726562e+01 -1.026325000000000154e+00 -5.709375000000000000e+01 -1.026330000000000187e+00 -5.721875381469726562e+01 -1.026334999999999997e+00 -5.715625000000000000e+01 -1.026340000000000030e+00 -5.712500381469726562e+01 -1.026345000000000063e+00 -5.715625000000000000e+01 -1.026350000000000096e+00 -5.715625000000000000e+01 -1.026355000000000128e+00 -5.715625000000000000e+01 -1.026360000000000161e+00 -5.712500381469726562e+01 -1.026365000000000194e+00 -5.712500381469726562e+01 -1.026370000000000005e+00 -5.709375000000000000e+01 -1.026375000000000037e+00 -5.715625000000000000e+01 -1.026380000000000070e+00 -5.706250381469726562e+01 -1.026385000000000103e+00 -5.706250381469726562e+01 -1.026390000000000136e+00 -5.703125000000000000e+01 -1.026395000000000168e+00 -5.709375000000000000e+01 -1.026399999999999979e+00 -5.706250381469726562e+01 -1.026405000000000012e+00 -5.706250381469726562e+01 -1.026410000000000045e+00 -5.706250381469726562e+01 -1.026415000000000077e+00 -5.709375000000000000e+01 -1.026420000000000110e+00 -5.706250381469726562e+01 -1.026425000000000143e+00 -5.706250381469726562e+01 -1.026430000000000176e+00 -5.706250381469726562e+01 -1.026434999999999986e+00 -5.709375000000000000e+01 -1.026440000000000019e+00 -5.703125000000000000e+01 -1.026445000000000052e+00 -5.709375000000000000e+01 -1.026450000000000085e+00 -5.706250381469726562e+01 -1.026455000000000117e+00 -5.709375000000000000e+01 -1.026460000000000150e+00 -5.706250381469726562e+01 -1.026465000000000183e+00 -5.700000000000000000e+01 -1.026469999999999994e+00 -5.700000000000000000e+01 -1.026475000000000026e+00 -5.706250381469726562e+01 -1.026480000000000059e+00 -5.700000000000000000e+01 -1.026485000000000092e+00 -5.700000000000000000e+01 -1.026490000000000125e+00 -5.706250381469726562e+01 -1.026495000000000157e+00 -5.696875381469726562e+01 -1.026500000000000190e+00 -5.700000000000000000e+01 -1.026505000000000001e+00 -5.703125000000000000e+01 -1.026510000000000034e+00 -5.700000000000000000e+01 -1.026515000000000066e+00 -5.693750000000000000e+01 -1.026520000000000099e+00 -5.693750000000000000e+01 -1.026525000000000132e+00 -5.700000000000000000e+01 -1.026530000000000165e+00 -5.690625381469726562e+01 -1.026534999999999975e+00 -5.696875381469726562e+01 -1.026540000000000008e+00 -5.696875381469726562e+01 -1.026545000000000041e+00 -5.696875381469726562e+01 -1.026550000000000074e+00 -5.693750000000000000e+01 -1.026555000000000106e+00 -5.693750000000000000e+01 -1.026560000000000139e+00 -5.693750000000000000e+01 -1.026565000000000172e+00 -5.687500000000000000e+01 -1.026569999999999983e+00 -5.690625381469726562e+01 -1.026575000000000015e+00 -5.687500000000000000e+01 -1.026580000000000048e+00 -5.690625381469726562e+01 -1.026585000000000081e+00 -5.693750000000000000e+01 -1.026590000000000114e+00 -5.687500000000000000e+01 -1.026595000000000146e+00 -5.687500000000000000e+01 -1.026600000000000179e+00 -5.684375000000000000e+01 -1.026604999999999990e+00 -5.687500000000000000e+01 -1.026610000000000023e+00 -5.684375000000000000e+01 -1.026615000000000055e+00 -5.684375000000000000e+01 -1.026620000000000088e+00 -5.684375000000000000e+01 -1.026625000000000121e+00 -5.687500000000000000e+01 -1.026630000000000154e+00 -5.681250381469726562e+01 -1.026635000000000186e+00 -5.684375000000000000e+01 -1.026639999999999997e+00 -5.687500000000000000e+01 -1.026645000000000030e+00 -5.681250381469726562e+01 -1.026650000000000063e+00 -5.681250381469726562e+01 -1.026655000000000095e+00 -5.681250381469726562e+01 -1.026660000000000128e+00 -5.681250381469726562e+01 -1.026665000000000161e+00 -5.678125000000000000e+01 -1.026670000000000194e+00 -5.681250381469726562e+01 -1.026675000000000004e+00 -5.684375000000000000e+01 -1.026680000000000037e+00 -5.681250381469726562e+01 -1.026685000000000070e+00 -5.678125000000000000e+01 -1.026690000000000103e+00 -5.668750000000000000e+01 -1.026695000000000135e+00 -5.675000000000000000e+01 -1.026700000000000168e+00 -5.678125000000000000e+01 -1.026704999999999979e+00 -5.671875000000000000e+01 -1.026710000000000012e+00 -5.671875000000000000e+01 -1.026715000000000044e+00 -5.665625381469726562e+01 -1.026720000000000077e+00 -5.675000000000000000e+01 -1.026725000000000110e+00 -5.671875000000000000e+01 -1.026730000000000143e+00 -5.675000000000000000e+01 -1.026735000000000175e+00 -5.671875000000000000e+01 -1.026739999999999986e+00 -5.668750000000000000e+01 -1.026745000000000019e+00 -5.665625381469726562e+01 -1.026750000000000052e+00 -5.668750000000000000e+01 -1.026755000000000084e+00 -5.668750000000000000e+01 -1.026760000000000117e+00 -5.671875000000000000e+01 -1.026765000000000150e+00 -5.659375000000000000e+01 -1.026770000000000183e+00 -5.671875000000000000e+01 -1.026774999999999993e+00 -5.665625381469726562e+01 -1.026780000000000026e+00 -5.668750000000000000e+01 -1.026785000000000059e+00 -5.665625381469726562e+01 -1.026790000000000092e+00 -5.665625381469726562e+01 -1.026795000000000124e+00 -5.662500000000000000e+01 -1.026800000000000157e+00 -5.665625381469726562e+01 -1.026805000000000190e+00 -5.653125000000000000e+01 -1.026810000000000000e+00 -5.659375000000000000e+01 -1.026815000000000033e+00 -5.662500000000000000e+01 -1.026820000000000066e+00 -5.659375000000000000e+01 -1.026825000000000099e+00 -5.659375000000000000e+01 -1.026830000000000132e+00 -5.659375000000000000e+01 -1.026835000000000164e+00 -5.659375000000000000e+01 -1.026839999999999975e+00 -5.650000381469726562e+01 -1.026845000000000008e+00 -5.656250381469726562e+01 -1.026850000000000041e+00 -5.656250381469726562e+01 -1.026855000000000073e+00 -5.653125000000000000e+01 -1.026860000000000106e+00 -5.653125000000000000e+01 -1.026865000000000139e+00 -5.650000381469726562e+01 -1.026870000000000172e+00 -5.656250381469726562e+01 -1.026874999999999982e+00 -5.656250381469726562e+01 -1.026880000000000015e+00 -5.656250381469726562e+01 -1.026885000000000048e+00 -5.650000381469726562e+01 -1.026890000000000081e+00 -5.656250381469726562e+01 -1.026895000000000113e+00 -5.653125000000000000e+01 -1.026900000000000146e+00 -5.653125000000000000e+01 -1.026905000000000179e+00 -5.650000381469726562e+01 -1.026909999999999989e+00 -5.650000381469726562e+01 -1.026915000000000022e+00 -5.646875000000000000e+01 -1.026920000000000055e+00 -5.653125000000000000e+01 -1.026925000000000088e+00 -5.650000381469726562e+01 -1.026930000000000121e+00 -5.650000381469726562e+01 -1.026935000000000153e+00 -5.650000381469726562e+01 -1.026940000000000186e+00 -5.650000381469726562e+01 -1.026944999999999997e+00 -5.646875000000000000e+01 -1.026950000000000029e+00 -5.643750000000000000e+01 -1.026955000000000062e+00 -5.637500000000000000e+01 -1.026960000000000095e+00 -5.646875000000000000e+01 -1.026965000000000128e+00 -5.643750000000000000e+01 -1.026970000000000161e+00 -5.640625381469726562e+01 -1.026975000000000193e+00 -5.643750000000000000e+01 -1.026980000000000004e+00 -5.643750000000000000e+01 -1.026985000000000037e+00 -5.646875000000000000e+01 -1.026990000000000069e+00 -5.640625381469726562e+01 -1.026995000000000102e+00 -5.643750000000000000e+01 -1.027000000000000135e+00 -5.637500000000000000e+01 -1.027005000000000168e+00 -5.637500000000000000e+01 -1.027009999999999978e+00 -5.640625381469726562e+01 -1.027015000000000011e+00 -5.640625381469726562e+01 -1.027020000000000044e+00 -5.631250000000000000e+01 -1.027025000000000077e+00 -5.634375381469726562e+01 -1.027030000000000109e+00 -5.634375381469726562e+01 -1.027035000000000142e+00 -5.640625381469726562e+01 -1.027040000000000175e+00 -5.631250000000000000e+01 -1.027044999999999986e+00 -5.631250000000000000e+01 -1.027050000000000018e+00 -5.631250000000000000e+01 -1.027055000000000051e+00 -5.631250000000000000e+01 -1.027060000000000084e+00 -5.631250000000000000e+01 -1.027065000000000117e+00 -5.631250000000000000e+01 -1.027070000000000149e+00 -5.631250000000000000e+01 -1.027075000000000182e+00 -5.631250000000000000e+01 -1.027079999999999993e+00 -5.628125000000000000e+01 -1.027085000000000026e+00 -5.631250000000000000e+01 -1.027090000000000058e+00 -5.631250000000000000e+01 -1.027095000000000091e+00 -5.625000381469726562e+01 -1.027100000000000124e+00 -5.625000381469726562e+01 -1.027105000000000157e+00 -5.625000381469726562e+01 -1.027110000000000190e+00 -5.628125000000000000e+01 -1.027115000000000000e+00 -5.625000381469726562e+01 -1.027120000000000033e+00 -5.625000381469726562e+01 -1.027125000000000066e+00 -5.628125000000000000e+01 -1.027130000000000098e+00 -5.621875000000000000e+01 -1.027135000000000131e+00 -5.628125000000000000e+01 -1.027140000000000164e+00 -5.628125000000000000e+01 -1.027144999999999975e+00 -5.625000381469726562e+01 -1.027150000000000007e+00 -5.625000381469726562e+01 -1.027155000000000040e+00 -5.612500000000000000e+01 -1.027160000000000073e+00 -5.618750381469726562e+01 -1.027165000000000106e+00 -5.621875000000000000e+01 -1.027170000000000138e+00 -5.621875000000000000e+01 -1.027175000000000171e+00 -5.618750381469726562e+01 -1.027179999999999982e+00 -5.615625000000000000e+01 -1.027185000000000015e+00 -5.612500000000000000e+01 -1.027190000000000047e+00 -5.612500000000000000e+01 -1.027195000000000080e+00 -5.618750381469726562e+01 -1.027200000000000113e+00 -5.615625000000000000e+01 -1.027205000000000146e+00 -5.621875000000000000e+01 -1.027210000000000178e+00 -5.615625000000000000e+01 -1.027214999999999989e+00 -5.615625000000000000e+01 -1.027220000000000022e+00 -5.621875000000000000e+01 -1.027225000000000055e+00 -5.621875000000000000e+01 -1.027230000000000087e+00 -5.621875000000000000e+01 -1.027235000000000120e+00 -5.615625000000000000e+01 -1.027240000000000153e+00 -5.606250000000000000e+01 -1.027245000000000186e+00 -5.612500000000000000e+01 -1.027249999999999996e+00 -5.615625000000000000e+01 -1.027255000000000029e+00 -5.612500000000000000e+01 -1.027260000000000062e+00 -5.612500000000000000e+01 -1.027265000000000095e+00 -5.612500000000000000e+01 -1.027270000000000127e+00 -5.609375381469726562e+01 -1.027275000000000160e+00 -5.606250000000000000e+01 -1.027280000000000193e+00 -5.606250000000000000e+01 -1.027285000000000004e+00 -5.612500000000000000e+01 -1.027290000000000036e+00 -5.612500000000000000e+01 -1.027295000000000069e+00 -5.612500000000000000e+01 -1.027300000000000102e+00 -5.612500000000000000e+01 -1.027305000000000135e+00 -5.606250000000000000e+01 -1.027310000000000167e+00 -5.606250000000000000e+01 -1.027314999999999978e+00 -5.606250000000000000e+01 -1.027320000000000011e+00 -5.609375381469726562e+01 -1.027325000000000044e+00 -5.609375381469726562e+01 -1.027330000000000076e+00 -5.606250000000000000e+01 -1.027335000000000109e+00 -5.609375381469726562e+01 -1.027340000000000142e+00 -5.609375381469726562e+01 -1.027345000000000175e+00 -5.606250000000000000e+01 -1.027349999999999985e+00 -5.603125000000000000e+01 -1.027355000000000018e+00 -5.600000000000000000e+01 -1.027360000000000051e+00 -5.603125000000000000e+01 -1.027365000000000084e+00 -5.600000000000000000e+01 -1.027370000000000116e+00 -5.603125000000000000e+01 -1.027375000000000149e+00 -5.603125000000000000e+01 -1.027380000000000182e+00 -5.596875000000000000e+01 -1.027384999999999993e+00 -5.593750381469726562e+01 -1.027390000000000025e+00 -5.600000000000000000e+01 -1.027395000000000058e+00 -5.596875000000000000e+01 -1.027400000000000091e+00 -5.596875000000000000e+01 -1.027405000000000124e+00 -5.603125000000000000e+01 -1.027410000000000156e+00 -5.596875000000000000e+01 -1.027415000000000189e+00 -5.600000000000000000e+01 -1.027420000000000000e+00 -5.600000000000000000e+01 -1.027425000000000033e+00 -5.596875000000000000e+01 -1.027430000000000065e+00 -5.596875000000000000e+01 -1.027435000000000098e+00 -5.593750381469726562e+01 -1.027440000000000131e+00 -5.590625000000000000e+01 -1.027445000000000164e+00 -5.600000000000000000e+01 -1.027449999999999974e+00 -5.593750381469726562e+01 -1.027455000000000007e+00 -5.584375000000000000e+01 -1.027460000000000040e+00 -5.590625000000000000e+01 -1.027465000000000073e+00 -5.600000000000000000e+01 -1.027470000000000105e+00 -5.593750381469726562e+01 -1.027475000000000138e+00 -5.596875000000000000e+01 -1.027480000000000171e+00 -5.593750381469726562e+01 -1.027484999999999982e+00 -5.593750381469726562e+01 -1.027490000000000014e+00 -5.593750381469726562e+01 -1.027495000000000047e+00 -5.590625000000000000e+01 -1.027500000000000080e+00 -5.593750381469726562e+01 -1.027505000000000113e+00 -5.590625000000000000e+01 -1.027510000000000145e+00 -5.593750381469726562e+01 -1.027515000000000178e+00 -5.593750381469726562e+01 -1.027519999999999989e+00 -5.587500000000000000e+01 -1.027525000000000022e+00 -5.590625000000000000e+01 -1.027530000000000054e+00 -5.584375000000000000e+01 -1.027535000000000087e+00 -5.587500000000000000e+01 -1.027540000000000120e+00 -5.584375000000000000e+01 -1.027545000000000153e+00 -5.581250000000000000e+01 -1.027550000000000185e+00 -5.584375000000000000e+01 -1.027554999999999996e+00 -5.584375000000000000e+01 -1.027560000000000029e+00 -5.575000000000000000e+01 -1.027565000000000062e+00 -5.584375000000000000e+01 -1.027570000000000094e+00 -5.584375000000000000e+01 -1.027575000000000127e+00 -5.584375000000000000e+01 -1.027580000000000160e+00 -5.578125381469726562e+01 -1.027585000000000193e+00 -5.581250000000000000e+01 -1.027590000000000003e+00 -5.578125381469726562e+01 -1.027595000000000036e+00 -5.581250000000000000e+01 -1.027600000000000069e+00 -5.578125381469726562e+01 -1.027605000000000102e+00 -5.578125381469726562e+01 -1.027610000000000134e+00 -5.571875000000000000e+01 -1.027615000000000167e+00 -5.578125381469726562e+01 -1.027619999999999978e+00 -5.575000000000000000e+01 -1.027625000000000011e+00 -5.575000000000000000e+01 -1.027630000000000043e+00 -5.578125381469726562e+01 -1.027635000000000076e+00 -5.578125381469726562e+01 -1.027640000000000109e+00 -5.568750381469726562e+01 -1.027645000000000142e+00 -5.578125381469726562e+01 -1.027650000000000174e+00 -5.575000000000000000e+01 -1.027654999999999985e+00 -5.571875000000000000e+01 -1.027660000000000018e+00 -5.571875000000000000e+01 -1.027665000000000051e+00 -5.571875000000000000e+01 -1.027670000000000083e+00 -5.571875000000000000e+01 -1.027675000000000116e+00 -5.568750381469726562e+01 -1.027680000000000149e+00 -5.568750381469726562e+01 -1.027685000000000182e+00 -5.565625000000000000e+01 -1.027689999999999992e+00 -5.575000000000000000e+01 -1.027695000000000025e+00 -5.565625000000000000e+01 -1.027700000000000058e+00 -5.559375000000000000e+01 -1.027705000000000091e+00 -5.571875000000000000e+01 -1.027710000000000123e+00 -5.568750381469726562e+01 -1.027715000000000156e+00 -5.568750381469726562e+01 -1.027720000000000189e+00 -5.559375000000000000e+01 -1.027725000000000000e+00 -5.559375000000000000e+01 -1.027730000000000032e+00 -5.565625000000000000e+01 -1.027735000000000065e+00 -5.565625000000000000e+01 -1.027740000000000098e+00 -5.559375000000000000e+01 -1.027745000000000131e+00 -5.559375000000000000e+01 -1.027750000000000163e+00 -5.565625000000000000e+01 -1.027754999999999974e+00 -5.559375000000000000e+01 -1.027760000000000007e+00 -5.553125381469726562e+01 -1.027765000000000040e+00 -5.556250000000000000e+01 -1.027770000000000072e+00 -5.565625000000000000e+01 -1.027775000000000105e+00 -5.553125381469726562e+01 -1.027780000000000138e+00 -5.556250000000000000e+01 -1.027785000000000171e+00 -5.553125381469726562e+01 -1.027789999999999981e+00 -5.553125381469726562e+01 -1.027795000000000014e+00 -5.556250000000000000e+01 -1.027800000000000047e+00 -5.556250000000000000e+01 -1.027805000000000080e+00 -5.556250000000000000e+01 -1.027810000000000112e+00 -5.556250000000000000e+01 -1.027815000000000145e+00 -5.553125381469726562e+01 -1.027820000000000178e+00 -5.556250000000000000e+01 -1.027824999999999989e+00 -5.546875381469726562e+01 -1.027830000000000021e+00 -5.556250000000000000e+01 -1.027835000000000054e+00 -5.550000000000000000e+01 -1.027840000000000087e+00 -5.543750000000000000e+01 -1.027845000000000120e+00 -5.546875381469726562e+01 -1.027850000000000152e+00 -5.546875381469726562e+01 -1.027855000000000185e+00 -5.543750000000000000e+01 -1.027859999999999996e+00 -5.550000000000000000e+01 -1.027865000000000029e+00 -5.550000000000000000e+01 -1.027870000000000061e+00 -5.543750000000000000e+01 -1.027875000000000094e+00 -5.546875381469726562e+01 -1.027880000000000127e+00 -5.537500381469726562e+01 -1.027885000000000160e+00 -5.550000000000000000e+01 -1.027890000000000192e+00 -5.546875381469726562e+01 -1.027895000000000003e+00 -5.543750000000000000e+01 -1.027900000000000036e+00 -5.546875381469726562e+01 -1.027905000000000069e+00 -5.540625000000000000e+01 -1.027910000000000101e+00 -5.537500381469726562e+01 -1.027915000000000134e+00 -5.534375000000000000e+01 -1.027920000000000167e+00 -5.537500381469726562e+01 -1.027924999999999978e+00 -5.534375000000000000e+01 -1.027930000000000010e+00 -5.537500381469726562e+01 -1.027935000000000043e+00 -5.537500381469726562e+01 -1.027940000000000076e+00 -5.537500381469726562e+01 -1.027945000000000109e+00 -5.540625000000000000e+01 -1.027950000000000141e+00 -5.534375000000000000e+01 -1.027955000000000174e+00 -5.537500381469726562e+01 -1.027959999999999985e+00 -5.543750000000000000e+01 -1.027965000000000018e+00 -5.537500381469726562e+01 -1.027970000000000050e+00 -5.537500381469726562e+01 -1.027975000000000083e+00 -5.537500381469726562e+01 -1.027980000000000116e+00 -5.531250000000000000e+01 -1.027985000000000149e+00 -5.534375000000000000e+01 -1.027990000000000181e+00 -5.528125000000000000e+01 -1.027994999999999992e+00 -5.531250000000000000e+01 -1.028000000000000025e+00 -5.531250000000000000e+01 -1.028005000000000058e+00 -5.537500381469726562e+01 -1.028010000000000090e+00 -5.528125000000000000e+01 -1.028015000000000123e+00 -5.531250000000000000e+01 -1.028020000000000156e+00 -5.528125000000000000e+01 -1.028025000000000189e+00 -5.531250000000000000e+01 -1.028029999999999999e+00 -5.534375000000000000e+01 -1.028035000000000032e+00 -5.528125000000000000e+01 -1.028040000000000065e+00 -5.528125000000000000e+01 -1.028045000000000098e+00 -5.528125000000000000e+01 -1.028050000000000130e+00 -5.528125000000000000e+01 -1.028055000000000163e+00 -5.525000000000000000e+01 -1.028059999999999974e+00 -5.528125000000000000e+01 -1.028065000000000007e+00 -5.518750000000000000e+01 -1.028070000000000039e+00 -5.521875381469726562e+01 -1.028075000000000072e+00 -5.518750000000000000e+01 -1.028080000000000105e+00 -5.521875381469726562e+01 -1.028085000000000138e+00 -5.518750000000000000e+01 -1.028090000000000170e+00 -5.518750000000000000e+01 -1.028094999999999981e+00 -5.512500000000000000e+01 -1.028100000000000014e+00 -5.515625000000000000e+01 -1.028105000000000047e+00 -5.515625000000000000e+01 -1.028110000000000079e+00 -5.515625000000000000e+01 -1.028115000000000112e+00 -5.512500000000000000e+01 -1.028120000000000145e+00 -5.515625000000000000e+01 -1.028125000000000178e+00 -5.509375000000000000e+01 -1.028129999999999988e+00 -5.515625000000000000e+01 -1.028135000000000021e+00 -5.515625000000000000e+01 -1.028140000000000054e+00 -5.512500000000000000e+01 -1.028145000000000087e+00 -5.506250381469726562e+01 -1.028150000000000119e+00 -5.512500000000000000e+01 -1.028155000000000152e+00 -5.512500000000000000e+01 -1.028160000000000185e+00 -5.509375000000000000e+01 -1.028164999999999996e+00 -5.503125000000000000e+01 -1.028170000000000028e+00 -5.503125000000000000e+01 -1.028175000000000061e+00 -5.503125000000000000e+01 -1.028180000000000094e+00 -5.506250381469726562e+01 -1.028185000000000127e+00 -5.506250381469726562e+01 -1.028190000000000159e+00 -5.503125000000000000e+01 -1.028195000000000192e+00 -5.506250381469726562e+01 -1.028200000000000003e+00 -5.503125000000000000e+01 -1.028205000000000036e+00 -5.506250381469726562e+01 -1.028210000000000068e+00 -5.509375000000000000e+01 -1.028215000000000101e+00 -5.509375000000000000e+01 -1.028220000000000134e+00 -5.503125000000000000e+01 -1.028225000000000167e+00 -5.500000000000000000e+01 -1.028229999999999977e+00 -5.500000000000000000e+01 -1.028235000000000010e+00 -5.500000000000000000e+01 -1.028240000000000043e+00 -5.503125000000000000e+01 -1.028245000000000076e+00 -5.500000000000000000e+01 -1.028250000000000108e+00 -5.503125000000000000e+01 -1.028255000000000141e+00 -5.503125000000000000e+01 -1.028260000000000174e+00 -5.500000000000000000e+01 -1.028264999999999985e+00 -5.503125000000000000e+01 -1.028270000000000017e+00 -5.503125000000000000e+01 -1.028275000000000050e+00 -5.500000000000000000e+01 -1.028280000000000083e+00 -5.500000000000000000e+01 -1.028285000000000116e+00 -5.500000000000000000e+01 -1.028290000000000148e+00 -5.500000000000000000e+01 -1.028295000000000181e+00 -5.496875381469726562e+01 -1.028299999999999992e+00 -5.496875381469726562e+01 -1.028305000000000025e+00 -5.500000000000000000e+01 -1.028310000000000057e+00 -5.496875381469726562e+01 -1.028315000000000090e+00 -5.500000000000000000e+01 -1.028320000000000123e+00 -5.500000000000000000e+01 -1.028325000000000156e+00 -5.500000000000000000e+01 -1.028330000000000188e+00 -5.500000000000000000e+01 -1.028334999999999999e+00 -5.496875381469726562e+01 -1.028340000000000032e+00 -5.490625381469726562e+01 -1.028345000000000065e+00 -5.493750000000000000e+01 -1.028350000000000097e+00 -5.490625381469726562e+01 -1.028355000000000130e+00 -5.493750000000000000e+01 -1.028360000000000163e+00 -5.487500000000000000e+01 -1.028364999999999974e+00 -5.493750000000000000e+01 -1.028370000000000006e+00 -5.490625381469726562e+01 -1.028375000000000039e+00 -5.490625381469726562e+01 -1.028380000000000072e+00 -5.493750000000000000e+01 -1.028385000000000105e+00 -5.490625381469726562e+01 -1.028390000000000137e+00 -5.484375000000000000e+01 -1.028395000000000170e+00 -5.484375000000000000e+01 -1.028399999999999981e+00 -5.487500000000000000e+01 -1.028405000000000014e+00 -5.484375000000000000e+01 -1.028410000000000046e+00 -5.487500000000000000e+01 -1.028415000000000079e+00 -5.487500000000000000e+01 -1.028420000000000112e+00 -5.490625381469726562e+01 -1.028425000000000145e+00 -5.490625381469726562e+01 -1.028430000000000177e+00 -5.484375000000000000e+01 -1.028434999999999988e+00 -5.484375000000000000e+01 -1.028440000000000021e+00 -5.484375000000000000e+01 -1.028445000000000054e+00 -5.481250381469726562e+01 -1.028450000000000086e+00 -5.484375000000000000e+01 -1.028455000000000119e+00 -5.484375000000000000e+01 -1.028460000000000152e+00 -5.484375000000000000e+01 -1.028465000000000185e+00 -5.484375000000000000e+01 -1.028469999999999995e+00 -5.484375000000000000e+01 -1.028475000000000028e+00 -5.481250381469726562e+01 -1.028480000000000061e+00 -5.481250381469726562e+01 -1.028485000000000094e+00 -5.478125000000000000e+01 -1.028490000000000126e+00 -5.484375000000000000e+01 -1.028495000000000159e+00 -5.481250381469726562e+01 -1.028500000000000192e+00 -5.478125000000000000e+01 -1.028505000000000003e+00 -5.478125000000000000e+01 -1.028510000000000035e+00 -5.484375000000000000e+01 -1.028515000000000068e+00 -5.484375000000000000e+01 -1.028520000000000101e+00 -5.481250381469726562e+01 -1.028525000000000134e+00 -5.487500000000000000e+01 -1.028530000000000166e+00 -5.481250381469726562e+01 -1.028534999999999977e+00 -5.481250381469726562e+01 -1.028540000000000010e+00 -5.478125000000000000e+01 -1.028545000000000043e+00 -5.481250381469726562e+01 -1.028550000000000075e+00 -5.478125000000000000e+01 -1.028555000000000108e+00 -5.478125000000000000e+01 -1.028560000000000141e+00 -5.481250381469726562e+01 -1.028565000000000174e+00 -5.471875000000000000e+01 -1.028569999999999984e+00 -5.478125000000000000e+01 -1.028575000000000017e+00 -5.471875000000000000e+01 -1.028580000000000050e+00 -5.481250381469726562e+01 -1.028585000000000083e+00 -5.475000381469726562e+01 -1.028590000000000115e+00 -5.475000381469726562e+01 -1.028595000000000148e+00 -5.478125000000000000e+01 -1.028600000000000181e+00 -5.471875000000000000e+01 -1.028604999999999992e+00 -5.478125000000000000e+01 -1.028610000000000024e+00 -5.471875000000000000e+01 -1.028615000000000057e+00 -5.468750000000000000e+01 -1.028620000000000090e+00 -5.475000381469726562e+01 -1.028625000000000123e+00 -5.471875000000000000e+01 -1.028630000000000155e+00 -5.475000381469726562e+01 -1.028635000000000188e+00 -5.468750000000000000e+01 -1.028639999999999999e+00 -5.471875000000000000e+01 -1.028645000000000032e+00 -5.465625381469726562e+01 -1.028650000000000064e+00 -5.471875000000000000e+01 -1.028655000000000097e+00 -5.468750000000000000e+01 -1.028660000000000130e+00 -5.471875000000000000e+01 -1.028665000000000163e+00 -5.468750000000000000e+01 -1.028669999999999973e+00 -5.468750000000000000e+01 -1.028675000000000006e+00 -5.462500000000000000e+01 -1.028680000000000039e+00 -5.471875000000000000e+01 -1.028685000000000072e+00 -5.475000381469726562e+01 -1.028690000000000104e+00 -5.468750000000000000e+01 -1.028695000000000137e+00 -5.465625381469726562e+01 -1.028700000000000170e+00 -5.462500000000000000e+01 -1.028704999999999981e+00 -5.462500000000000000e+01 -1.028710000000000013e+00 -5.462500000000000000e+01 -1.028715000000000046e+00 -5.465625381469726562e+01 -1.028720000000000079e+00 -5.465625381469726562e+01 -1.028725000000000112e+00 -5.462500000000000000e+01 -1.028730000000000144e+00 -5.456250000000000000e+01 -1.028735000000000177e+00 -5.456250000000000000e+01 -1.028739999999999988e+00 -5.456250000000000000e+01 -1.028745000000000021e+00 -5.462500000000000000e+01 -1.028750000000000053e+00 -5.456250000000000000e+01 -1.028755000000000086e+00 -5.459375381469726562e+01 -1.028760000000000119e+00 -5.453125000000000000e+01 -1.028765000000000152e+00 -5.462500000000000000e+01 -1.028770000000000184e+00 -5.462500000000000000e+01 -1.028774999999999995e+00 -5.453125000000000000e+01 -1.028780000000000028e+00 -5.456250000000000000e+01 -1.028785000000000061e+00 -5.453125000000000000e+01 -1.028790000000000093e+00 -5.453125000000000000e+01 -1.028795000000000126e+00 -5.456250000000000000e+01 -1.028800000000000159e+00 -5.456250000000000000e+01 -1.028805000000000192e+00 -5.459375381469726562e+01 -1.028810000000000002e+00 -5.453125000000000000e+01 -1.028815000000000035e+00 -5.453125000000000000e+01 -1.028820000000000068e+00 -5.453125000000000000e+01 -1.028825000000000101e+00 -5.456250000000000000e+01 -1.028830000000000133e+00 -5.456250000000000000e+01 -1.028835000000000166e+00 -5.450000381469726562e+01 -1.028839999999999977e+00 -5.450000381469726562e+01 -1.028845000000000010e+00 -5.450000381469726562e+01 -1.028850000000000042e+00 -5.446875000000000000e+01 -1.028855000000000075e+00 -5.450000381469726562e+01 -1.028860000000000108e+00 -5.446875000000000000e+01 -1.028865000000000141e+00 -5.446875000000000000e+01 -1.028870000000000173e+00 -5.450000381469726562e+01 -1.028874999999999984e+00 -5.443750000000000000e+01 -1.028880000000000017e+00 -5.446875000000000000e+01 -1.028885000000000050e+00 -5.450000381469726562e+01 -1.028890000000000082e+00 -5.443750000000000000e+01 -1.028895000000000115e+00 -5.446875000000000000e+01 -1.028900000000000148e+00 -5.440625000000000000e+01 -1.028905000000000181e+00 -5.440625000000000000e+01 -1.028909999999999991e+00 -5.440625000000000000e+01 -1.028915000000000024e+00 -5.440625000000000000e+01 -1.028920000000000057e+00 -5.440625000000000000e+01 -1.028925000000000090e+00 -5.437500000000000000e+01 -1.028930000000000122e+00 -5.443750000000000000e+01 -1.028935000000000155e+00 -5.440625000000000000e+01 -1.028940000000000188e+00 -5.437500000000000000e+01 -1.028944999999999999e+00 -5.443750000000000000e+01 -1.028950000000000031e+00 -5.440625000000000000e+01 -1.028955000000000064e+00 -5.440625000000000000e+01 -1.028960000000000097e+00 -5.434375381469726562e+01 -1.028965000000000130e+00 -5.437500000000000000e+01 -1.028970000000000162e+00 -5.431250000000000000e+01 -1.028975000000000195e+00 -5.431250000000000000e+01 -1.028980000000000006e+00 -5.431250000000000000e+01 -1.028985000000000039e+00 -5.434375381469726562e+01 -1.028990000000000071e+00 -5.434375381469726562e+01 -1.028995000000000104e+00 -5.428125000000000000e+01 -1.029000000000000137e+00 -5.431250000000000000e+01 -1.029005000000000170e+00 -5.428125000000000000e+01 -1.029009999999999980e+00 -5.428125000000000000e+01 -1.029015000000000013e+00 -5.431250000000000000e+01 -1.029020000000000046e+00 -5.428125000000000000e+01 -1.029025000000000079e+00 -5.428125000000000000e+01 -1.029030000000000111e+00 -5.425000000000000000e+01 -1.029035000000000144e+00 -5.434375381469726562e+01 -1.029040000000000177e+00 -5.421875000000000000e+01 -1.029044999999999987e+00 -5.425000000000000000e+01 -1.029050000000000020e+00 -5.425000000000000000e+01 -1.029055000000000053e+00 -5.428125000000000000e+01 -1.029060000000000086e+00 -5.428125000000000000e+01 -1.029065000000000119e+00 -5.421875000000000000e+01 -1.029070000000000151e+00 -5.428125000000000000e+01 -1.029075000000000184e+00 -5.421875000000000000e+01 -1.029079999999999995e+00 -5.421875000000000000e+01 -1.029085000000000027e+00 -5.428125000000000000e+01 -1.029090000000000060e+00 -5.428125000000000000e+01 -1.029095000000000093e+00 -5.418750381469726562e+01 -1.029100000000000126e+00 -5.428125000000000000e+01 -1.029105000000000159e+00 -5.415625000000000000e+01 -1.029110000000000191e+00 -5.415625000000000000e+01 -1.029115000000000002e+00 -5.418750381469726562e+01 -1.029120000000000035e+00 -5.418750381469726562e+01 -1.029125000000000068e+00 -5.418750381469726562e+01 -1.029130000000000100e+00 -5.415625000000000000e+01 -1.029135000000000133e+00 -5.421875000000000000e+01 -1.029140000000000166e+00 -5.418750381469726562e+01 -1.029144999999999976e+00 -5.418750381469726562e+01 -1.029150000000000009e+00 -5.415625000000000000e+01 -1.029155000000000042e+00 -5.409375381469726562e+01 -1.029160000000000075e+00 -5.409375381469726562e+01 -1.029165000000000108e+00 -5.412500000000000000e+01 -1.029170000000000140e+00 -5.412500000000000000e+01 -1.029175000000000173e+00 -5.409375381469726562e+01 -1.029179999999999984e+00 -5.415625000000000000e+01 -1.029185000000000016e+00 -5.406250000000000000e+01 -1.029190000000000049e+00 -5.409375381469726562e+01 -1.029195000000000082e+00 -5.406250000000000000e+01 -1.029200000000000115e+00 -5.406250000000000000e+01 -1.029205000000000148e+00 -5.409375381469726562e+01 -1.029210000000000180e+00 -5.409375381469726562e+01 -1.029214999999999991e+00 -5.409375381469726562e+01 -1.029220000000000024e+00 -5.409375381469726562e+01 -1.029225000000000056e+00 -5.412500000000000000e+01 -1.029230000000000089e+00 -5.409375381469726562e+01 -1.029235000000000122e+00 -5.406250000000000000e+01 -1.029240000000000155e+00 -5.400000000000000000e+01 -1.029245000000000188e+00 -5.400000000000000000e+01 -1.029249999999999998e+00 -5.403125381469726562e+01 -1.029255000000000031e+00 -5.400000000000000000e+01 -1.029260000000000064e+00 -5.403125381469726562e+01 -1.029265000000000096e+00 -5.400000000000000000e+01 -1.029270000000000129e+00 -5.396875000000000000e+01 -1.029275000000000162e+00 -5.396875000000000000e+01 -1.029280000000000195e+00 -5.396875000000000000e+01 -1.029285000000000005e+00 -5.400000000000000000e+01 -1.029290000000000038e+00 -5.393750381469726562e+01 -1.029295000000000071e+00 -5.396875000000000000e+01 -1.029300000000000104e+00 -5.393750381469726562e+01 -1.029305000000000136e+00 -5.400000000000000000e+01 -1.029310000000000169e+00 -5.400000000000000000e+01 -1.029314999999999980e+00 -5.396875000000000000e+01 -1.029320000000000013e+00 -5.396875000000000000e+01 -1.029325000000000045e+00 -5.396875000000000000e+01 -1.029330000000000078e+00 -5.396875000000000000e+01 -1.029335000000000111e+00 -5.400000000000000000e+01 -1.029340000000000144e+00 -5.396875000000000000e+01 -1.029345000000000176e+00 -5.390625000000000000e+01 -1.029349999999999987e+00 -5.396875000000000000e+01 -1.029355000000000020e+00 -5.396875000000000000e+01 -1.029360000000000053e+00 -5.400000000000000000e+01 -1.029365000000000085e+00 -5.393750381469726562e+01 -1.029370000000000118e+00 -5.384375000000000000e+01 -1.029375000000000151e+00 -5.387500381469726562e+01 -1.029380000000000184e+00 -5.387500381469726562e+01 -1.029384999999999994e+00 -5.390625000000000000e+01 -1.029390000000000027e+00 -5.384375000000000000e+01 -1.029395000000000060e+00 -5.387500381469726562e+01 -1.029400000000000093e+00 -5.390625000000000000e+01 -1.029405000000000125e+00 -5.384375000000000000e+01 -1.029410000000000158e+00 -5.387500381469726562e+01 -1.029415000000000191e+00 -5.390625000000000000e+01 -1.029420000000000002e+00 -5.387500381469726562e+01 -1.029425000000000034e+00 -5.390625000000000000e+01 -1.029430000000000067e+00 -5.390625000000000000e+01 -1.029435000000000100e+00 -5.390625000000000000e+01 -1.029440000000000133e+00 -5.384375000000000000e+01 -1.029445000000000165e+00 -5.393750381469726562e+01 -1.029449999999999976e+00 -5.387500381469726562e+01 -1.029455000000000009e+00 -5.384375000000000000e+01 -1.029460000000000042e+00 -5.390625000000000000e+01 -1.029465000000000074e+00 -5.378125381469726562e+01 -1.029470000000000107e+00 -5.375000000000000000e+01 -1.029475000000000140e+00 -5.378125381469726562e+01 -1.029480000000000173e+00 -5.378125381469726562e+01 -1.029484999999999983e+00 -5.384375000000000000e+01 -1.029490000000000016e+00 -5.378125381469726562e+01 -1.029495000000000049e+00 -5.381250000000000000e+01 -1.029500000000000082e+00 -5.375000000000000000e+01 -1.029505000000000114e+00 -5.378125381469726562e+01 -1.029510000000000147e+00 -5.378125381469726562e+01 -1.029515000000000180e+00 -5.378125381469726562e+01 -1.029519999999999991e+00 -5.375000000000000000e+01 -1.029525000000000023e+00 -5.371875000000000000e+01 -1.029530000000000056e+00 -5.371875000000000000e+01 -1.029535000000000089e+00 -5.378125381469726562e+01 -1.029540000000000122e+00 -5.371875000000000000e+01 -1.029545000000000154e+00 -5.371875000000000000e+01 -1.029550000000000187e+00 -5.371875000000000000e+01 -1.029554999999999998e+00 -5.371875000000000000e+01 -1.029560000000000031e+00 -5.375000000000000000e+01 -1.029565000000000063e+00 -5.371875000000000000e+01 -1.029570000000000096e+00 -5.378125381469726562e+01 -1.029575000000000129e+00 -5.368750000000000000e+01 -1.029580000000000162e+00 -5.378125381469726562e+01 -1.029585000000000194e+00 -5.375000000000000000e+01 -1.029590000000000005e+00 -5.368750000000000000e+01 -1.029595000000000038e+00 -5.371875000000000000e+01 -1.029600000000000071e+00 -5.371875000000000000e+01 -1.029605000000000103e+00 -5.368750000000000000e+01 -1.029610000000000136e+00 -5.365625000000000000e+01 -1.029615000000000169e+00 -5.368750000000000000e+01 -1.029619999999999980e+00 -5.368750000000000000e+01 -1.029625000000000012e+00 -5.368750000000000000e+01 -1.029630000000000045e+00 -5.368750000000000000e+01 -1.029635000000000078e+00 -5.365625000000000000e+01 -1.029640000000000111e+00 -5.371875000000000000e+01 -1.029645000000000143e+00 -5.362500381469726562e+01 -1.029650000000000176e+00 -5.368750000000000000e+01 -1.029654999999999987e+00 -5.368750000000000000e+01 -1.029660000000000020e+00 -5.362500381469726562e+01 -1.029665000000000052e+00 -5.362500381469726562e+01 -1.029670000000000085e+00 -5.365625000000000000e+01 -1.029675000000000118e+00 -5.371875000000000000e+01 -1.029680000000000151e+00 -5.365625000000000000e+01 -1.029685000000000183e+00 -5.365625000000000000e+01 -1.029689999999999994e+00 -5.359375000000000000e+01 -1.029695000000000027e+00 -5.371875000000000000e+01 -1.029700000000000060e+00 -5.368750000000000000e+01 -1.029705000000000092e+00 -5.365625000000000000e+01 -1.029710000000000125e+00 -5.365625000000000000e+01 -1.029715000000000158e+00 -5.365625000000000000e+01 -1.029720000000000191e+00 -5.359375000000000000e+01 -1.029725000000000001e+00 -5.365625000000000000e+01 -1.029730000000000034e+00 -5.362500381469726562e+01 -1.029735000000000067e+00 -5.365625000000000000e+01 -1.029740000000000100e+00 -5.362500381469726562e+01 -1.029745000000000132e+00 -5.353125000000000000e+01 -1.029750000000000165e+00 -5.359375000000000000e+01 -1.029754999999999976e+00 -5.356250000000000000e+01 -1.029760000000000009e+00 -5.359375000000000000e+01 -1.029765000000000041e+00 -5.359375000000000000e+01 -1.029770000000000074e+00 -5.353125000000000000e+01 -1.029775000000000107e+00 -5.353125000000000000e+01 -1.029780000000000140e+00 -5.353125000000000000e+01 -1.029785000000000172e+00 -5.353125000000000000e+01 -1.029789999999999983e+00 -5.353125000000000000e+01 -1.029795000000000016e+00 -5.356250000000000000e+01 -1.029800000000000049e+00 -5.356250000000000000e+01 -1.029805000000000081e+00 -5.359375000000000000e+01 -1.029810000000000114e+00 -5.356250000000000000e+01 -1.029815000000000147e+00 -5.350000000000000000e+01 -1.029820000000000180e+00 -5.353125000000000000e+01 -1.029824999999999990e+00 -5.353125000000000000e+01 -1.029830000000000023e+00 -5.350000000000000000e+01 -1.029835000000000056e+00 -5.350000000000000000e+01 -1.029840000000000089e+00 -5.350000000000000000e+01 -1.029845000000000121e+00 -5.356250000000000000e+01 -1.029850000000000154e+00 -5.350000000000000000e+01 -1.029855000000000187e+00 -5.343750000000000000e+01 -1.029859999999999998e+00 -5.350000000000000000e+01 -1.029865000000000030e+00 -5.350000000000000000e+01 -1.029870000000000063e+00 -5.350000000000000000e+01 -1.029875000000000096e+00 -5.346875381469726562e+01 -1.029880000000000129e+00 -5.343750000000000000e+01 -1.029885000000000161e+00 -5.343750000000000000e+01 -1.029890000000000194e+00 -5.343750000000000000e+01 -1.029895000000000005e+00 -5.343750000000000000e+01 -1.029900000000000038e+00 -5.340625000000000000e+01 -1.029905000000000070e+00 -5.343750000000000000e+01 -1.029910000000000103e+00 -5.343750000000000000e+01 -1.029915000000000136e+00 -5.334375000000000000e+01 -1.029920000000000169e+00 -5.343750000000000000e+01 -1.029924999999999979e+00 -5.337500381469726562e+01 -1.029930000000000012e+00 -5.340625000000000000e+01 -1.029935000000000045e+00 -5.334375000000000000e+01 -1.029940000000000078e+00 -5.337500381469726562e+01 -1.029945000000000110e+00 -5.334375000000000000e+01 -1.029950000000000143e+00 -5.337500381469726562e+01 -1.029955000000000176e+00 -5.340625000000000000e+01 -1.029959999999999987e+00 -5.340625000000000000e+01 -1.029965000000000019e+00 -5.334375000000000000e+01 -1.029970000000000052e+00 -5.340625000000000000e+01 -1.029975000000000085e+00 -5.337500381469726562e+01 -1.029980000000000118e+00 -5.340625000000000000e+01 -1.029985000000000150e+00 -5.331250381469726562e+01 -1.029990000000000183e+00 -5.334375000000000000e+01 -1.029994999999999994e+00 -5.334375000000000000e+01 -1.030000000000000027e+00 -5.334375000000000000e+01 -1.030005000000000059e+00 -5.337500381469726562e+01 -1.030010000000000092e+00 -5.334375000000000000e+01 -1.030015000000000125e+00 -5.334375000000000000e+01 -1.030020000000000158e+00 -5.334375000000000000e+01 -1.030025000000000190e+00 -5.337500381469726562e+01 -1.030030000000000001e+00 -5.328125000000000000e+01 -1.030035000000000034e+00 -5.331250381469726562e+01 -1.030040000000000067e+00 -5.334375000000000000e+01 -1.030045000000000099e+00 -5.334375000000000000e+01 -1.030050000000000132e+00 -5.328125000000000000e+01 -1.030055000000000165e+00 -5.334375000000000000e+01 -1.030059999999999976e+00 -5.331250381469726562e+01 -1.030065000000000008e+00 -5.328125000000000000e+01 -1.030070000000000041e+00 -5.325000000000000000e+01 -1.030075000000000074e+00 -5.321875381469726562e+01 -1.030080000000000107e+00 -5.321875381469726562e+01 -1.030085000000000139e+00 -5.325000000000000000e+01 -1.030090000000000172e+00 -5.318750000000000000e+01 -1.030094999999999983e+00 -5.321875381469726562e+01 -1.030100000000000016e+00 -5.315625381469726562e+01 -1.030105000000000048e+00 -5.321875381469726562e+01 -1.030110000000000081e+00 -5.315625381469726562e+01 -1.030115000000000114e+00 -5.315625381469726562e+01 -1.030120000000000147e+00 -5.315625381469726562e+01 -1.030125000000000179e+00 -5.312500000000000000e+01 -1.030129999999999990e+00 -5.309375000000000000e+01 -1.030135000000000023e+00 -5.312500000000000000e+01 -1.030140000000000056e+00 -5.315625381469726562e+01 -1.030145000000000088e+00 -5.306250381469726562e+01 -1.030150000000000121e+00 -5.315625381469726562e+01 -1.030155000000000154e+00 -5.312500000000000000e+01 -1.030160000000000187e+00 -5.303125000000000000e+01 -1.030164999999999997e+00 -5.309375000000000000e+01 -1.030170000000000030e+00 -5.306250381469726562e+01 -1.030175000000000063e+00 -5.309375000000000000e+01 -1.030180000000000096e+00 -5.306250381469726562e+01 -1.030185000000000128e+00 -5.309375000000000000e+01 -1.030190000000000161e+00 -5.315625381469726562e+01 -1.030195000000000194e+00 -5.303125000000000000e+01 -1.030200000000000005e+00 -5.303125000000000000e+01 -1.030205000000000037e+00 -5.309375000000000000e+01 -1.030210000000000070e+00 -5.309375000000000000e+01 -1.030215000000000103e+00 -5.309375000000000000e+01 -1.030220000000000136e+00 -5.309375000000000000e+01 -1.030225000000000168e+00 -5.306250381469726562e+01 -1.030229999999999979e+00 -5.303125000000000000e+01 -1.030235000000000012e+00 -5.300000000000000000e+01 -1.030240000000000045e+00 -5.303125000000000000e+01 -1.030245000000000077e+00 -5.303125000000000000e+01 -1.030250000000000110e+00 -5.300000000000000000e+01 -1.030255000000000143e+00 -5.300000000000000000e+01 -1.030260000000000176e+00 -5.303125000000000000e+01 -1.030264999999999986e+00 -5.306250381469726562e+01 -1.030270000000000019e+00 -5.303125000000000000e+01 -1.030275000000000052e+00 -5.300000000000000000e+01 -1.030280000000000085e+00 -5.303125000000000000e+01 -1.030285000000000117e+00 -5.300000000000000000e+01 -1.030290000000000150e+00 -5.300000000000000000e+01 -1.030295000000000183e+00 -5.296875000000000000e+01 -1.030299999999999994e+00 -5.293750000000000000e+01 -1.030305000000000026e+00 -5.300000000000000000e+01 -1.030310000000000059e+00 -5.293750000000000000e+01 -1.030315000000000092e+00 -5.296875000000000000e+01 -1.030320000000000125e+00 -5.300000000000000000e+01 -1.030325000000000157e+00 -5.293750000000000000e+01 -1.030330000000000190e+00 -5.293750000000000000e+01 -1.030335000000000001e+00 -5.296875000000000000e+01 -1.030340000000000034e+00 -5.296875000000000000e+01 -1.030345000000000066e+00 -5.296875000000000000e+01 -1.030350000000000099e+00 -5.293750000000000000e+01 -1.030355000000000132e+00 -5.293750000000000000e+01 -1.030360000000000165e+00 -5.293750000000000000e+01 -1.030364999999999975e+00 -5.290625381469726562e+01 -1.030370000000000008e+00 -5.290625381469726562e+01 -1.030375000000000041e+00 -5.293750000000000000e+01 -1.030380000000000074e+00 -5.290625381469726562e+01 -1.030385000000000106e+00 -5.296875000000000000e+01 -1.030390000000000139e+00 -5.287500000000000000e+01 -1.030395000000000172e+00 -5.290625381469726562e+01 -1.030399999999999983e+00 -5.287500000000000000e+01 -1.030405000000000015e+00 -5.287500000000000000e+01 -1.030410000000000048e+00 -5.290625381469726562e+01 -1.030415000000000081e+00 -5.293750000000000000e+01 -1.030420000000000114e+00 -5.293750000000000000e+01 -1.030425000000000146e+00 -5.287500000000000000e+01 -1.030430000000000179e+00 -5.287500000000000000e+01 -1.030434999999999990e+00 -5.290625381469726562e+01 -1.030440000000000023e+00 -5.284375000000000000e+01 -1.030445000000000055e+00 -5.290625381469726562e+01 -1.030450000000000088e+00 -5.287500000000000000e+01 -1.030455000000000121e+00 -5.287500000000000000e+01 -1.030460000000000154e+00 -5.290625381469726562e+01 -1.030465000000000186e+00 -5.287500000000000000e+01 -1.030469999999999997e+00 -5.287500000000000000e+01 -1.030475000000000030e+00 -5.284375000000000000e+01 -1.030480000000000063e+00 -5.281250000000000000e+01 -1.030485000000000095e+00 -5.287500000000000000e+01 -1.030490000000000128e+00 -5.284375000000000000e+01 -1.030495000000000161e+00 -5.284375000000000000e+01 -1.030500000000000194e+00 -5.278125000000000000e+01 -1.030505000000000004e+00 -5.275000381469726562e+01 -1.030510000000000037e+00 -5.278125000000000000e+01 -1.030515000000000070e+00 -5.281250000000000000e+01 -1.030520000000000103e+00 -5.275000381469726562e+01 -1.030525000000000135e+00 -5.278125000000000000e+01 -1.030530000000000168e+00 -5.275000381469726562e+01 -1.030534999999999979e+00 -5.275000381469726562e+01 -1.030540000000000012e+00 -5.271875000000000000e+01 -1.030545000000000044e+00 -5.278125000000000000e+01 -1.030550000000000077e+00 -5.271875000000000000e+01 -1.030555000000000110e+00 -5.268750000000000000e+01 -1.030560000000000143e+00 -5.268750000000000000e+01 -1.030565000000000175e+00 -5.275000381469726562e+01 -1.030569999999999986e+00 -5.275000381469726562e+01 -1.030575000000000019e+00 -5.265625381469726562e+01 -1.030580000000000052e+00 -5.271875000000000000e+01 -1.030585000000000084e+00 -5.275000381469726562e+01 -1.030590000000000117e+00 -5.262500000000000000e+01 -1.030595000000000150e+00 -5.268750000000000000e+01 -1.030600000000000183e+00 -5.265625381469726562e+01 -1.030604999999999993e+00 -5.268750000000000000e+01 -1.030610000000000026e+00 -5.268750000000000000e+01 -1.030615000000000059e+00 -5.268750000000000000e+01 -1.030620000000000092e+00 -5.265625381469726562e+01 -1.030625000000000124e+00 -5.262500000000000000e+01 -1.030630000000000157e+00 -5.268750000000000000e+01 -1.030635000000000190e+00 -5.265625381469726562e+01 -1.030640000000000001e+00 -5.265625381469726562e+01 -1.030645000000000033e+00 -5.262500000000000000e+01 -1.030650000000000066e+00 -5.262500000000000000e+01 -1.030655000000000099e+00 -5.262500000000000000e+01 -1.030660000000000132e+00 -5.256250000000000000e+01 -1.030665000000000164e+00 -5.262500000000000000e+01 -1.030669999999999975e+00 -5.262500000000000000e+01 -1.030675000000000008e+00 -5.259375381469726562e+01 -1.030680000000000041e+00 -5.259375381469726562e+01 -1.030685000000000073e+00 -5.265625381469726562e+01 -1.030690000000000106e+00 -5.259375381469726562e+01 -1.030695000000000139e+00 -5.256250000000000000e+01 -1.030700000000000172e+00 -5.253125000000000000e+01 -1.030704999999999982e+00 -5.259375381469726562e+01 -1.030710000000000015e+00 -5.259375381469726562e+01 -1.030715000000000048e+00 -5.253125000000000000e+01 -1.030720000000000081e+00 -5.256250000000000000e+01 -1.030725000000000113e+00 -5.256250000000000000e+01 -1.030730000000000146e+00 -5.253125000000000000e+01 -1.030735000000000179e+00 -5.253125000000000000e+01 -1.030739999999999990e+00 -5.250000381469726562e+01 -1.030745000000000022e+00 -5.250000381469726562e+01 -1.030750000000000055e+00 -5.256250000000000000e+01 -1.030755000000000088e+00 -5.250000381469726562e+01 -1.030760000000000121e+00 -5.250000381469726562e+01 -1.030765000000000153e+00 -5.253125000000000000e+01 -1.030770000000000186e+00 -5.253125000000000000e+01 -1.030774999999999997e+00 -5.250000381469726562e+01 -1.030780000000000030e+00 -5.246875000000000000e+01 -1.030785000000000062e+00 -5.250000381469726562e+01 -1.030790000000000095e+00 -5.259375381469726562e+01 -1.030795000000000128e+00 -5.250000381469726562e+01 -1.030800000000000161e+00 -5.250000381469726562e+01 -1.030805000000000193e+00 -5.253125000000000000e+01 -1.030810000000000004e+00 -5.250000381469726562e+01 -1.030815000000000037e+00 -5.250000381469726562e+01 -1.030820000000000070e+00 -5.250000381469726562e+01 -1.030825000000000102e+00 -5.250000381469726562e+01 -1.030830000000000135e+00 -5.246875000000000000e+01 -1.030835000000000168e+00 -5.246875000000000000e+01 -1.030839999999999979e+00 -5.243750381469726562e+01 -1.030845000000000011e+00 -5.243750381469726562e+01 -1.030850000000000044e+00 -5.240625000000000000e+01 -1.030855000000000077e+00 -5.246875000000000000e+01 -1.030860000000000110e+00 -5.246875000000000000e+01 -1.030865000000000142e+00 -5.243750381469726562e+01 -1.030870000000000175e+00 -5.237500000000000000e+01 -1.030874999999999986e+00 -5.243750381469726562e+01 -1.030880000000000019e+00 -5.240625000000000000e+01 -1.030885000000000051e+00 -5.240625000000000000e+01 -1.030890000000000084e+00 -5.246875000000000000e+01 -1.030895000000000117e+00 -5.237500000000000000e+01 -1.030900000000000150e+00 -5.234375381469726562e+01 -1.030905000000000182e+00 -5.234375381469726562e+01 -1.030909999999999993e+00 -5.240625000000000000e+01 -1.030915000000000026e+00 -5.234375381469726562e+01 -1.030920000000000059e+00 -5.234375381469726562e+01 -1.030925000000000091e+00 -5.234375381469726562e+01 -1.030930000000000124e+00 -5.237500000000000000e+01 -1.030935000000000157e+00 -5.228125000000000000e+01 -1.030940000000000190e+00 -5.240625000000000000e+01 -1.030945000000000000e+00 -5.237500000000000000e+01 -1.030950000000000033e+00 -5.228125000000000000e+01 -1.030955000000000066e+00 -5.240625000000000000e+01 -1.030960000000000099e+00 -5.234375381469726562e+01 -1.030965000000000131e+00 -5.231250000000000000e+01 -1.030970000000000164e+00 -5.234375381469726562e+01 -1.030974999999999975e+00 -5.234375381469726562e+01 -1.030980000000000008e+00 -5.231250000000000000e+01 -1.030985000000000040e+00 -5.234375381469726562e+01 -1.030990000000000073e+00 -5.234375381469726562e+01 -1.030995000000000106e+00 -5.231250000000000000e+01 -1.031000000000000139e+00 -5.231250000000000000e+01 -1.031005000000000171e+00 -5.225000000000000000e+01 -1.031009999999999982e+00 -5.225000000000000000e+01 -1.031015000000000015e+00 -5.228125000000000000e+01 -1.031020000000000048e+00 -5.228125000000000000e+01 -1.031025000000000080e+00 -5.228125000000000000e+01 -1.031030000000000113e+00 -5.221875000000000000e+01 -1.031035000000000146e+00 -5.221875000000000000e+01 -1.031040000000000179e+00 -5.225000000000000000e+01 -1.031044999999999989e+00 -5.228125000000000000e+01 -1.031050000000000022e+00 -5.228125000000000000e+01 -1.031055000000000055e+00 -5.221875000000000000e+01 -1.031060000000000088e+00 -5.225000000000000000e+01 -1.031065000000000120e+00 -5.225000000000000000e+01 -1.031070000000000153e+00 -5.225000000000000000e+01 -1.031075000000000186e+00 -5.221875000000000000e+01 -1.031079999999999997e+00 -5.221875000000000000e+01 -1.031085000000000029e+00 -5.225000000000000000e+01 -1.031090000000000062e+00 -5.228125000000000000e+01 -1.031095000000000095e+00 -5.218750381469726562e+01 -1.031100000000000128e+00 -5.221875000000000000e+01 -1.031105000000000160e+00 -5.218750381469726562e+01 -1.031110000000000193e+00 -5.212500000000000000e+01 -1.031115000000000004e+00 -5.212500000000000000e+01 -1.031120000000000037e+00 -5.212500000000000000e+01 -1.031125000000000069e+00 -5.218750381469726562e+01 -1.031130000000000102e+00 -5.215625000000000000e+01 -1.031135000000000135e+00 -5.212500000000000000e+01 -1.031140000000000168e+00 -5.215625000000000000e+01 -1.031144999999999978e+00 -5.218750381469726562e+01 -1.031150000000000011e+00 -5.215625000000000000e+01 -1.031155000000000044e+00 -5.215625000000000000e+01 -1.031160000000000077e+00 -5.215625000000000000e+01 -1.031165000000000109e+00 -5.215625000000000000e+01 -1.031170000000000142e+00 -5.218750381469726562e+01 -1.031175000000000175e+00 -5.209375000000000000e+01 -1.031179999999999986e+00 -5.212500000000000000e+01 -1.031185000000000018e+00 -5.206250000000000000e+01 -1.031190000000000051e+00 -5.218750381469726562e+01 -1.031195000000000084e+00 -5.215625000000000000e+01 -1.031200000000000117e+00 -5.209375000000000000e+01 -1.031205000000000149e+00 -5.209375000000000000e+01 -1.031210000000000182e+00 -5.206250000000000000e+01 -1.031214999999999993e+00 -5.206250000000000000e+01 -1.031220000000000026e+00 -5.203125381469726562e+01 -1.031225000000000058e+00 -5.203125381469726562e+01 -1.031230000000000091e+00 -5.209375000000000000e+01 -1.031235000000000124e+00 -5.209375000000000000e+01 -1.031240000000000157e+00 -5.212500000000000000e+01 -1.031245000000000189e+00 -5.203125381469726562e+01 -1.031250000000000000e+00 -5.206250000000000000e+01 -1.031255000000000033e+00 -5.203125381469726562e+01 -1.031260000000000066e+00 -5.209375000000000000e+01 -1.031265000000000098e+00 -5.206250000000000000e+01 -1.031270000000000131e+00 -5.203125381469726562e+01 -1.031275000000000164e+00 -5.206250000000000000e+01 -1.031279999999999974e+00 -5.209375000000000000e+01 -1.031285000000000007e+00 -5.206250000000000000e+01 -1.031290000000000040e+00 -5.203125381469726562e+01 -1.031295000000000073e+00 -5.200000000000000000e+01 -1.031300000000000106e+00 -5.203125381469726562e+01 -1.031305000000000138e+00 -5.206250000000000000e+01 -1.031310000000000171e+00 -5.200000000000000000e+01 -1.031314999999999982e+00 -5.193750000000000000e+01 -1.031320000000000014e+00 -5.203125381469726562e+01 -1.031325000000000047e+00 -5.196875000000000000e+01 -1.031330000000000080e+00 -5.196875000000000000e+01 -1.031335000000000113e+00 -5.200000000000000000e+01 -1.031340000000000146e+00 -5.190625000000000000e+01 -1.031345000000000178e+00 -5.190625000000000000e+01 -1.031349999999999989e+00 -5.196875000000000000e+01 -1.031355000000000022e+00 -5.200000000000000000e+01 -1.031360000000000054e+00 -5.184375000000000000e+01 -1.031365000000000087e+00 -5.203125381469726562e+01 -1.031370000000000120e+00 -5.196875000000000000e+01 -1.031375000000000153e+00 -5.190625000000000000e+01 -1.031380000000000186e+00 -5.196875000000000000e+01 -1.031384999999999996e+00 -5.193750000000000000e+01 -1.031390000000000029e+00 -5.190625000000000000e+01 -1.031395000000000062e+00 -5.190625000000000000e+01 -1.031400000000000095e+00 -5.190625000000000000e+01 -1.031405000000000127e+00 -5.187500381469726562e+01 -1.031410000000000160e+00 -5.187500381469726562e+01 -1.031415000000000193e+00 -5.196875000000000000e+01 -1.031420000000000003e+00 -5.187500381469726562e+01 -1.031425000000000036e+00 -5.190625000000000000e+01 -1.031430000000000069e+00 -5.187500381469726562e+01 -1.031435000000000102e+00 -5.190625000000000000e+01 -1.031440000000000135e+00 -5.187500381469726562e+01 -1.031445000000000167e+00 -5.181250000000000000e+01 -1.031449999999999978e+00 -5.196875000000000000e+01 -1.031455000000000011e+00 -5.193750000000000000e+01 -1.031460000000000043e+00 -5.184375000000000000e+01 -1.031465000000000076e+00 -5.184375000000000000e+01 -1.031470000000000109e+00 -5.178125381469726562e+01 -1.031475000000000142e+00 -5.184375000000000000e+01 -1.031480000000000175e+00 -5.184375000000000000e+01 -1.031484999999999985e+00 -5.175000000000000000e+01 -1.031490000000000018e+00 -5.181250000000000000e+01 -1.031495000000000051e+00 -5.181250000000000000e+01 -1.031500000000000083e+00 -5.181250000000000000e+01 -1.031505000000000116e+00 -5.178125381469726562e+01 -1.031510000000000149e+00 -5.175000000000000000e+01 -1.031515000000000182e+00 -5.178125381469726562e+01 -1.031519999999999992e+00 -5.184375000000000000e+01 -1.031525000000000025e+00 -5.178125381469726562e+01 -1.031530000000000058e+00 -5.171875381469726562e+01 -1.031535000000000091e+00 -5.175000000000000000e+01 -1.031540000000000123e+00 -5.175000000000000000e+01 -1.031545000000000156e+00 -5.175000000000000000e+01 -1.031550000000000189e+00 -5.175000000000000000e+01 -1.031555000000000000e+00 -5.168750000000000000e+01 -1.031560000000000032e+00 -5.165625000000000000e+01 -1.031565000000000065e+00 -5.168750000000000000e+01 -1.031570000000000098e+00 -5.168750000000000000e+01 -1.031575000000000131e+00 -5.168750000000000000e+01 -1.031580000000000163e+00 -5.171875381469726562e+01 -1.031584999999999974e+00 -5.171875381469726562e+01 -1.031590000000000007e+00 -5.165625000000000000e+01 -1.031595000000000040e+00 -5.168750000000000000e+01 -1.031600000000000072e+00 -5.171875381469726562e+01 -1.031605000000000105e+00 -5.168750000000000000e+01 -1.031610000000000138e+00 -5.165625000000000000e+01 -1.031615000000000171e+00 -5.162500381469726562e+01 -1.031619999999999981e+00 -5.165625000000000000e+01 -1.031625000000000014e+00 -5.159375000000000000e+01 -1.031630000000000047e+00 -5.162500381469726562e+01 -1.031635000000000080e+00 -5.165625000000000000e+01 -1.031640000000000112e+00 -5.165625000000000000e+01 -1.031645000000000145e+00 -5.156250381469726562e+01 -1.031650000000000178e+00 -5.156250381469726562e+01 -1.031654999999999989e+00 -5.159375000000000000e+01 -1.031660000000000021e+00 -5.162500381469726562e+01 -1.031665000000000054e+00 -5.162500381469726562e+01 -1.031670000000000087e+00 -5.159375000000000000e+01 -1.031675000000000120e+00 -5.156250381469726562e+01 -1.031680000000000152e+00 -5.159375000000000000e+01 -1.031685000000000185e+00 -5.165625000000000000e+01 -1.031689999999999996e+00 -5.165625000000000000e+01 -1.031695000000000029e+00 -5.156250381469726562e+01 -1.031700000000000061e+00 -5.159375000000000000e+01 -1.031705000000000094e+00 -5.153125000000000000e+01 -1.031710000000000127e+00 -5.162500381469726562e+01 -1.031715000000000160e+00 -5.156250381469726562e+01 -1.031720000000000192e+00 -5.159375000000000000e+01 -1.031725000000000003e+00 -5.159375000000000000e+01 -1.031730000000000036e+00 -5.156250381469726562e+01 -1.031735000000000069e+00 -5.159375000000000000e+01 -1.031740000000000101e+00 -5.156250381469726562e+01 -1.031745000000000134e+00 -5.150000000000000000e+01 -1.031750000000000167e+00 -5.153125000000000000e+01 -1.031754999999999978e+00 -5.150000000000000000e+01 -1.031760000000000010e+00 -5.143750000000000000e+01 -1.031765000000000043e+00 -5.150000000000000000e+01 -1.031770000000000076e+00 -5.150000000000000000e+01 -1.031775000000000109e+00 -5.146875381469726562e+01 -1.031780000000000141e+00 -5.146875381469726562e+01 -1.031785000000000174e+00 -5.153125000000000000e+01 -1.031789999999999985e+00 -5.153125000000000000e+01 -1.031795000000000018e+00 -5.150000000000000000e+01 -1.031800000000000050e+00 -5.150000000000000000e+01 -1.031805000000000083e+00 -5.146875381469726562e+01 -1.031810000000000116e+00 -5.153125000000000000e+01 -1.031815000000000149e+00 -5.143750000000000000e+01 -1.031820000000000181e+00 -5.146875381469726562e+01 -1.031824999999999992e+00 -5.143750000000000000e+01 -1.031830000000000025e+00 -5.146875381469726562e+01 -1.031835000000000058e+00 -5.146875381469726562e+01 -1.031840000000000090e+00 -5.143750000000000000e+01 -1.031845000000000123e+00 -5.146875381469726562e+01 -1.031850000000000156e+00 -5.146875381469726562e+01 -1.031855000000000189e+00 -5.143750000000000000e+01 -1.031859999999999999e+00 -5.140625000000000000e+01 -1.031865000000000032e+00 -5.143750000000000000e+01 -1.031870000000000065e+00 -5.137500000000000000e+01 -1.031875000000000098e+00 -5.140625000000000000e+01 -1.031880000000000130e+00 -5.140625000000000000e+01 -1.031885000000000163e+00 -5.137500000000000000e+01 -1.031889999999999974e+00 -5.128125000000000000e+01 -1.031895000000000007e+00 -5.146875381469726562e+01 -1.031900000000000039e+00 -5.137500000000000000e+01 -1.031905000000000072e+00 -5.140625000000000000e+01 -1.031910000000000105e+00 -5.137500000000000000e+01 -1.031915000000000138e+00 -5.137500000000000000e+01 -1.031920000000000170e+00 -5.137500000000000000e+01 -1.031924999999999981e+00 -5.146875381469726562e+01 -1.031930000000000014e+00 -5.140625000000000000e+01 -1.031935000000000047e+00 -5.134375000000000000e+01 -1.031940000000000079e+00 -5.134375000000000000e+01 -1.031945000000000112e+00 -5.140625000000000000e+01 -1.031950000000000145e+00 -5.134375000000000000e+01 -1.031955000000000178e+00 -5.134375000000000000e+01 -1.031959999999999988e+00 -5.134375000000000000e+01 -1.031965000000000021e+00 -5.134375000000000000e+01 -1.031970000000000054e+00 -5.140625000000000000e+01 -1.031975000000000087e+00 -5.140625000000000000e+01 -1.031980000000000119e+00 -5.134375000000000000e+01 -1.031985000000000152e+00 -5.128125000000000000e+01 -1.031990000000000185e+00 -5.128125000000000000e+01 -1.031994999999999996e+00 -5.128125000000000000e+01 -1.032000000000000028e+00 -5.128125000000000000e+01 -1.032005000000000061e+00 -5.131250381469726562e+01 -1.032010000000000094e+00 -5.128125000000000000e+01 -1.032015000000000127e+00 -5.131250381469726562e+01 -1.032020000000000159e+00 -5.128125000000000000e+01 -1.032025000000000192e+00 -5.128125000000000000e+01 -1.032030000000000003e+00 -5.125000000000000000e+01 -1.032035000000000036e+00 -5.128125000000000000e+01 -1.032040000000000068e+00 -5.128125000000000000e+01 -1.032045000000000101e+00 -5.128125000000000000e+01 -1.032050000000000134e+00 -5.125000000000000000e+01 -1.032055000000000167e+00 -5.125000000000000000e+01 -1.032059999999999977e+00 -5.128125000000000000e+01 -1.032065000000000010e+00 -5.128125000000000000e+01 -1.032070000000000043e+00 -5.128125000000000000e+01 -1.032075000000000076e+00 -5.128125000000000000e+01 -1.032080000000000108e+00 -5.125000000000000000e+01 -1.032085000000000141e+00 -5.125000000000000000e+01 -1.032090000000000174e+00 -5.125000000000000000e+01 -1.032094999999999985e+00 -5.128125000000000000e+01 -1.032100000000000017e+00 -5.121875000000000000e+01 -1.032105000000000050e+00 -5.125000000000000000e+01 -1.032110000000000083e+00 -5.118750000000000000e+01 -1.032115000000000116e+00 -5.118750000000000000e+01 -1.032120000000000148e+00 -5.118750000000000000e+01 -1.032125000000000181e+00 -5.118750000000000000e+01 -1.032129999999999992e+00 -5.115625381469726562e+01 -1.032135000000000025e+00 -5.121875000000000000e+01 -1.032140000000000057e+00 -5.115625381469726562e+01 -1.032145000000000090e+00 -5.118750000000000000e+01 -1.032150000000000123e+00 -5.106250381469726562e+01 -1.032155000000000156e+00 -5.109375000000000000e+01 -1.032160000000000188e+00 -5.112500000000000000e+01 -1.032164999999999999e+00 -5.109375000000000000e+01 -1.032170000000000032e+00 -5.109375000000000000e+01 -1.032175000000000065e+00 -5.109375000000000000e+01 -1.032180000000000097e+00 -5.103125000000000000e+01 -1.032185000000000130e+00 -5.106250381469726562e+01 -1.032190000000000163e+00 -5.112500000000000000e+01 -1.032194999999999974e+00 -5.106250381469726562e+01 -1.032200000000000006e+00 -5.112500000000000000e+01 -1.032205000000000039e+00 -5.109375000000000000e+01 -1.032210000000000072e+00 -5.109375000000000000e+01 -1.032215000000000105e+00 -5.109375000000000000e+01 -1.032220000000000137e+00 -5.106250381469726562e+01 -1.032225000000000170e+00 -5.106250381469726562e+01 -1.032229999999999981e+00 -5.109375000000000000e+01 -1.032235000000000014e+00 -5.106250381469726562e+01 -1.032240000000000046e+00 -5.103125000000000000e+01 -1.032245000000000079e+00 -5.106250381469726562e+01 -1.032250000000000112e+00 -5.103125000000000000e+01 -1.032255000000000145e+00 -5.106250381469726562e+01 -1.032260000000000177e+00 -5.103125000000000000e+01 -1.032264999999999988e+00 -5.103125000000000000e+01 -1.032270000000000021e+00 -5.100000381469726562e+01 -1.032275000000000054e+00 -5.100000381469726562e+01 -1.032280000000000086e+00 -5.103125000000000000e+01 -1.032285000000000119e+00 -5.103125000000000000e+01 -1.032290000000000152e+00 -5.100000381469726562e+01 -1.032295000000000185e+00 -5.096875000000000000e+01 -1.032299999999999995e+00 -5.096875000000000000e+01 -1.032305000000000028e+00 -5.100000381469726562e+01 -1.032310000000000061e+00 -5.096875000000000000e+01 -1.032315000000000094e+00 -5.093750000000000000e+01 -1.032320000000000126e+00 -5.096875000000000000e+01 -1.032325000000000159e+00 -5.096875000000000000e+01 -1.032330000000000192e+00 -5.096875000000000000e+01 -1.032335000000000003e+00 -5.096875000000000000e+01 -1.032340000000000035e+00 -5.090625381469726562e+01 -1.032345000000000068e+00 -5.096875000000000000e+01 -1.032350000000000101e+00 -5.096875000000000000e+01 -1.032355000000000134e+00 -5.100000381469726562e+01 -1.032360000000000166e+00 -5.093750000000000000e+01 -1.032364999999999977e+00 -5.096875000000000000e+01 -1.032370000000000010e+00 -5.093750000000000000e+01 -1.032375000000000043e+00 -5.093750000000000000e+01 -1.032380000000000075e+00 -5.090625381469726562e+01 -1.032385000000000108e+00 -5.090625381469726562e+01 -1.032390000000000141e+00 -5.093750000000000000e+01 -1.032395000000000174e+00 -5.093750000000000000e+01 -1.032399999999999984e+00 -5.096875000000000000e+01 -1.032405000000000017e+00 -5.087500000000000000e+01 -1.032410000000000050e+00 -5.087500000000000000e+01 -1.032415000000000083e+00 -5.084375381469726562e+01 -1.032420000000000115e+00 -5.087500000000000000e+01 -1.032425000000000148e+00 -5.090625381469726562e+01 -1.032430000000000181e+00 -5.084375381469726562e+01 -1.032434999999999992e+00 -5.093750000000000000e+01 -1.032440000000000024e+00 -5.084375381469726562e+01 -1.032445000000000057e+00 -5.093750000000000000e+01 -1.032450000000000090e+00 -5.084375381469726562e+01 -1.032455000000000123e+00 -5.090625381469726562e+01 -1.032460000000000155e+00 -5.093750000000000000e+01 -1.032465000000000188e+00 -5.087500000000000000e+01 -1.032469999999999999e+00 -5.078125000000000000e+01 -1.032475000000000032e+00 -5.084375381469726562e+01 -1.032480000000000064e+00 -5.081250000000000000e+01 -1.032485000000000097e+00 -5.084375381469726562e+01 -1.032490000000000130e+00 -5.078125000000000000e+01 -1.032495000000000163e+00 -5.084375381469726562e+01 -1.032500000000000195e+00 -5.084375381469726562e+01 -1.032505000000000006e+00 -5.084375381469726562e+01 -1.032510000000000039e+00 -5.081250000000000000e+01 -1.032515000000000072e+00 -5.081250000000000000e+01 -1.032520000000000104e+00 -5.075000381469726562e+01 -1.032525000000000137e+00 -5.081250000000000000e+01 -1.032530000000000170e+00 -5.081250000000000000e+01 -1.032534999999999981e+00 -5.075000381469726562e+01 -1.032540000000000013e+00 -5.078125000000000000e+01 -1.032545000000000046e+00 -5.075000381469726562e+01 -1.032550000000000079e+00 -5.075000381469726562e+01 -1.032555000000000112e+00 -5.078125000000000000e+01 -1.032560000000000144e+00 -5.071875000000000000e+01 -1.032565000000000177e+00 -5.075000381469726562e+01 -1.032569999999999988e+00 -5.071875000000000000e+01 -1.032575000000000021e+00 -5.071875000000000000e+01 -1.032580000000000053e+00 -5.078125000000000000e+01 -1.032585000000000086e+00 -5.071875000000000000e+01 -1.032590000000000119e+00 -5.078125000000000000e+01 -1.032595000000000152e+00 -5.071875000000000000e+01 -1.032600000000000184e+00 -5.071875000000000000e+01 -1.032604999999999995e+00 -5.068750000000000000e+01 -1.032610000000000028e+00 -5.068750000000000000e+01 -1.032615000000000061e+00 -5.068750000000000000e+01 -1.032620000000000093e+00 -5.068750000000000000e+01 -1.032625000000000126e+00 -5.078125000000000000e+01 -1.032630000000000159e+00 -5.065625000000000000e+01 -1.032635000000000192e+00 -5.068750000000000000e+01 -1.032640000000000002e+00 -5.062500000000000000e+01 -1.032645000000000035e+00 -5.065625000000000000e+01 -1.032650000000000068e+00 -5.065625000000000000e+01 -1.032655000000000101e+00 -5.065625000000000000e+01 -1.032660000000000133e+00 -5.059375381469726562e+01 -1.032665000000000166e+00 -5.065625000000000000e+01 -1.032669999999999977e+00 -5.068750000000000000e+01 -1.032675000000000010e+00 -5.059375381469726562e+01 -1.032680000000000042e+00 -5.065625000000000000e+01 -1.032685000000000075e+00 -5.062500000000000000e+01 -1.032690000000000108e+00 -5.059375381469726562e+01 -1.032695000000000141e+00 -5.059375381469726562e+01 -1.032700000000000173e+00 -5.065625000000000000e+01 -1.032704999999999984e+00 -5.062500000000000000e+01 -1.032710000000000017e+00 -5.065625000000000000e+01 -1.032715000000000050e+00 -5.065625000000000000e+01 -1.032720000000000082e+00 -5.056250000000000000e+01 -1.032725000000000115e+00 -5.065625000000000000e+01 -1.032730000000000148e+00 -5.059375381469726562e+01 -1.032735000000000181e+00 -5.062500000000000000e+01 -1.032739999999999991e+00 -5.059375381469726562e+01 -1.032745000000000024e+00 -5.059375381469726562e+01 -1.032750000000000057e+00 -5.065625000000000000e+01 -1.032755000000000090e+00 -5.053125000000000000e+01 -1.032760000000000122e+00 -5.056250000000000000e+01 -1.032765000000000155e+00 -5.053125000000000000e+01 -1.032770000000000188e+00 -5.059375381469726562e+01 -1.032774999999999999e+00 -5.062500000000000000e+01 -1.032780000000000031e+00 -5.059375381469726562e+01 -1.032785000000000064e+00 -5.056250000000000000e+01 -1.032790000000000097e+00 -5.056250000000000000e+01 -1.032795000000000130e+00 -5.053125000000000000e+01 -1.032800000000000162e+00 -5.053125000000000000e+01 -1.032805000000000195e+00 -5.053125000000000000e+01 -1.032810000000000006e+00 -5.050000000000000000e+01 -1.032815000000000039e+00 -5.046875000000000000e+01 -1.032820000000000071e+00 -5.056250000000000000e+01 -1.032825000000000104e+00 -5.046875000000000000e+01 -1.032830000000000137e+00 -5.046875000000000000e+01 -1.032835000000000170e+00 -5.040625000000000000e+01 -1.032839999999999980e+00 -5.053125000000000000e+01 -1.032845000000000013e+00 -5.046875000000000000e+01 -1.032850000000000046e+00 -5.046875000000000000e+01 -1.032855000000000079e+00 -5.046875000000000000e+01 -1.032860000000000111e+00 -5.050000000000000000e+01 -1.032865000000000144e+00 -5.043750381469726562e+01 -1.032870000000000177e+00 -5.046875000000000000e+01 -1.032874999999999988e+00 -5.043750381469726562e+01 -1.032880000000000020e+00 -5.040625000000000000e+01 -1.032885000000000053e+00 -5.050000000000000000e+01 -1.032890000000000086e+00 -5.046875000000000000e+01 -1.032895000000000119e+00 -5.050000000000000000e+01 -1.032900000000000151e+00 -5.040625000000000000e+01 -1.032905000000000184e+00 -5.040625000000000000e+01 -1.032909999999999995e+00 -5.046875000000000000e+01 -1.032915000000000028e+00 -5.043750381469726562e+01 -1.032920000000000060e+00 -5.043750381469726562e+01 -1.032925000000000093e+00 -5.037500000000000000e+01 -1.032930000000000126e+00 -5.034375000000000000e+01 -1.032935000000000159e+00 -5.040625000000000000e+01 -1.032940000000000191e+00 -5.043750381469726562e+01 -1.032945000000000002e+00 -5.043750381469726562e+01 -1.032950000000000035e+00 -5.034375000000000000e+01 -1.032955000000000068e+00 -5.043750381469726562e+01 -1.032960000000000100e+00 -5.037500000000000000e+01 -1.032965000000000133e+00 -5.037500000000000000e+01 -1.032970000000000166e+00 -5.040625000000000000e+01 -1.032974999999999977e+00 -5.037500000000000000e+01 -1.032980000000000009e+00 -5.043750381469726562e+01 -1.032985000000000042e+00 -5.037500000000000000e+01 -1.032990000000000075e+00 -5.034375000000000000e+01 -1.032995000000000108e+00 -5.034375000000000000e+01 -1.033000000000000140e+00 -5.040625000000000000e+01 -1.033005000000000173e+00 -5.043750381469726562e+01 -1.033009999999999984e+00 -5.034375000000000000e+01 -1.033015000000000017e+00 -5.043750381469726562e+01 -1.033020000000000049e+00 -5.034375000000000000e+01 -1.033025000000000082e+00 -5.040625000000000000e+01 -1.033030000000000115e+00 -5.040625000000000000e+01 -1.033035000000000148e+00 -5.040625000000000000e+01 -1.033040000000000180e+00 -5.037500000000000000e+01 -1.033044999999999991e+00 -5.037500000000000000e+01 -1.033050000000000024e+00 -5.040625000000000000e+01 -1.033055000000000057e+00 -5.037500000000000000e+01 -1.033060000000000089e+00 -5.040625000000000000e+01 -1.033065000000000122e+00 -5.037500000000000000e+01 -1.033070000000000155e+00 -5.031250000000000000e+01 -1.033075000000000188e+00 -5.037500000000000000e+01 -1.033079999999999998e+00 -5.034375000000000000e+01 -1.033085000000000031e+00 -5.034375000000000000e+01 -1.033090000000000064e+00 -5.031250000000000000e+01 -1.033095000000000097e+00 -5.028125381469726562e+01 -1.033100000000000129e+00 -5.031250000000000000e+01 -1.033105000000000162e+00 -5.040625000000000000e+01 -1.033110000000000195e+00 -5.031250000000000000e+01 -1.033115000000000006e+00 -5.025000000000000000e+01 -1.033120000000000038e+00 -5.034375000000000000e+01 -1.033125000000000071e+00 -5.031250000000000000e+01 -1.033130000000000104e+00 -5.025000000000000000e+01 -1.033135000000000137e+00 -5.034375000000000000e+01 -1.033140000000000169e+00 -5.028125381469726562e+01 -1.033144999999999980e+00 -5.025000000000000000e+01 -1.033150000000000013e+00 -5.028125381469726562e+01 -1.033155000000000046e+00 -5.025000000000000000e+01 -1.033160000000000078e+00 -5.021875000000000000e+01 -1.033165000000000111e+00 -5.028125381469726562e+01 -1.033170000000000144e+00 -5.025000000000000000e+01 -1.033175000000000177e+00 -5.025000000000000000e+01 -1.033179999999999987e+00 -5.021875000000000000e+01 -1.033185000000000020e+00 -5.015625000000000000e+01 -1.033190000000000053e+00 -5.025000000000000000e+01 -1.033195000000000086e+00 -5.021875000000000000e+01 -1.033200000000000118e+00 -5.031250000000000000e+01 -1.033205000000000151e+00 -5.025000000000000000e+01 -1.033210000000000184e+00 -5.025000000000000000e+01 -1.033214999999999995e+00 -5.025000000000000000e+01 -1.033220000000000027e+00 -5.028125381469726562e+01 -1.033225000000000060e+00 -5.025000000000000000e+01 -1.033230000000000093e+00 -5.018750381469726562e+01 -1.033235000000000126e+00 -5.018750381469726562e+01 -1.033240000000000158e+00 -5.021875000000000000e+01 -1.033245000000000191e+00 -5.025000000000000000e+01 -1.033250000000000002e+00 -5.012500381469726562e+01 -1.033255000000000035e+00 -5.021875000000000000e+01 -1.033260000000000067e+00 -5.018750381469726562e+01 -1.033265000000000100e+00 -5.015625000000000000e+01 -1.033270000000000133e+00 -5.015625000000000000e+01 -1.033275000000000166e+00 -5.015625000000000000e+01 -1.033279999999999976e+00 -5.018750381469726562e+01 -1.033285000000000009e+00 -5.015625000000000000e+01 -1.033290000000000042e+00 -5.015625000000000000e+01 -1.033295000000000075e+00 -5.012500381469726562e+01 -1.033300000000000107e+00 -5.018750381469726562e+01 -1.033305000000000140e+00 -5.012500381469726562e+01 -1.033310000000000173e+00 -5.015625000000000000e+01 -1.033314999999999984e+00 -5.009375000000000000e+01 -1.033320000000000016e+00 -5.012500381469726562e+01 -1.033325000000000049e+00 -5.012500381469726562e+01 -1.033330000000000082e+00 -5.009375000000000000e+01 -1.033335000000000115e+00 -5.015625000000000000e+01 -1.033340000000000147e+00 -5.009375000000000000e+01 -1.033345000000000180e+00 -5.012500381469726562e+01 -1.033349999999999991e+00 -5.009375000000000000e+01 -1.033355000000000024e+00 -5.009375000000000000e+01 -1.033360000000000056e+00 -5.003125381469726562e+01 -1.033365000000000089e+00 -5.009375000000000000e+01 -1.033370000000000122e+00 -5.000000000000000000e+01 -1.033375000000000155e+00 -5.009375000000000000e+01 -1.033380000000000187e+00 -5.006250000000000000e+01 -1.033384999999999998e+00 -5.006250000000000000e+01 -1.033390000000000031e+00 -5.003125381469726562e+01 -1.033395000000000064e+00 -4.996875000000000000e+01 -1.033400000000000096e+00 -5.003125381469726562e+01 -1.033405000000000129e+00 -5.000000000000000000e+01 -1.033410000000000162e+00 -5.000000000000000000e+01 -1.033415000000000195e+00 -5.000000000000000000e+01 -1.033420000000000005e+00 -5.003125381469726562e+01 -1.033425000000000038e+00 -5.000000000000000000e+01 -1.033430000000000071e+00 -5.003125381469726562e+01 -1.033435000000000104e+00 -5.003125381469726562e+01 -1.033440000000000136e+00 -5.006250000000000000e+01 -1.033445000000000169e+00 -4.996875000000000000e+01 -1.033449999999999980e+00 -4.996875000000000000e+01 -1.033455000000000013e+00 -5.003125381469726562e+01 -1.033460000000000045e+00 -4.996875000000000000e+01 -1.033465000000000078e+00 -4.996875000000000000e+01 -1.033470000000000111e+00 -4.996875000000000000e+01 -1.033475000000000144e+00 -4.996875000000000000e+01 -1.033480000000000176e+00 -4.993750000000000000e+01 -1.033484999999999987e+00 -4.993750000000000000e+01 -1.033490000000000020e+00 -4.993750000000000000e+01 -1.033495000000000053e+00 -4.993750000000000000e+01 -1.033500000000000085e+00 -5.003125381469726562e+01 -1.033505000000000118e+00 -4.993750000000000000e+01 -1.033510000000000151e+00 -4.993750000000000000e+01 -1.033515000000000184e+00 -4.993750000000000000e+01 -1.033519999999999994e+00 -4.996875000000000000e+01 -1.033525000000000027e+00 -4.996875000000000000e+01 -1.033530000000000060e+00 -4.990625000000000000e+01 -1.033535000000000093e+00 -4.990625000000000000e+01 -1.033540000000000125e+00 -4.987500381469726562e+01 -1.033545000000000158e+00 -4.993750000000000000e+01 -1.033550000000000191e+00 -4.981250000000000000e+01 -1.033555000000000001e+00 -4.987500381469726562e+01 -1.033560000000000034e+00 -4.984375000000000000e+01 -1.033565000000000067e+00 -4.990625000000000000e+01 -1.033570000000000100e+00 -4.987500381469726562e+01 -1.033575000000000133e+00 -4.987500381469726562e+01 -1.033580000000000165e+00 -4.981250000000000000e+01 -1.033584999999999976e+00 -4.981250000000000000e+01 -1.033590000000000009e+00 -4.984375000000000000e+01 -1.033595000000000041e+00 -4.984375000000000000e+01 -1.033600000000000074e+00 -4.975000000000000000e+01 -1.033605000000000107e+00 -4.984375000000000000e+01 -1.033610000000000140e+00 -4.984375000000000000e+01 -1.033615000000000173e+00 -4.984375000000000000e+01 -1.033619999999999983e+00 -4.978125000000000000e+01 -1.033625000000000016e+00 -4.978125000000000000e+01 -1.033630000000000049e+00 -4.975000000000000000e+01 -1.033635000000000081e+00 -4.978125000000000000e+01 -1.033640000000000114e+00 -4.975000000000000000e+01 -1.033645000000000147e+00 -4.981250000000000000e+01 -1.033650000000000180e+00 -4.971875381469726562e+01 -1.033654999999999990e+00 -4.978125000000000000e+01 -1.033660000000000023e+00 -4.981250000000000000e+01 -1.033665000000000056e+00 -4.978125000000000000e+01 -1.033670000000000089e+00 -4.981250000000000000e+01 -1.033675000000000122e+00 -4.971875381469726562e+01 -1.033680000000000154e+00 -4.978125000000000000e+01 -1.033685000000000187e+00 -4.975000000000000000e+01 -1.033689999999999998e+00 -4.971875381469726562e+01 -1.033695000000000030e+00 -4.968750000000000000e+01 -1.033700000000000063e+00 -4.984375000000000000e+01 -1.033705000000000096e+00 -4.971875381469726562e+01 -1.033710000000000129e+00 -4.971875381469726562e+01 -1.033715000000000162e+00 -4.968750000000000000e+01 -1.033720000000000194e+00 -4.968750000000000000e+01 -1.033725000000000005e+00 -4.968750000000000000e+01 -1.033730000000000038e+00 -4.968750000000000000e+01 -1.033735000000000070e+00 -4.968750000000000000e+01 -1.033740000000000103e+00 -4.968750000000000000e+01 -1.033745000000000136e+00 -4.968750000000000000e+01 -1.033750000000000169e+00 -4.965625000000000000e+01 -1.033754999999999979e+00 -4.959375000000000000e+01 -1.033760000000000012e+00 -4.962500000000000000e+01 -1.033765000000000045e+00 -4.959375000000000000e+01 -1.033770000000000078e+00 -4.959375000000000000e+01 -1.033775000000000110e+00 -4.956250381469726562e+01 -1.033780000000000143e+00 -4.962500000000000000e+01 -1.033785000000000176e+00 -4.959375000000000000e+01 -1.033789999999999987e+00 -4.962500000000000000e+01 -1.033795000000000019e+00 -4.962500000000000000e+01 -1.033800000000000052e+00 -4.959375000000000000e+01 -1.033805000000000085e+00 -4.962500000000000000e+01 -1.033810000000000118e+00 -4.959375000000000000e+01 -1.033815000000000150e+00 -4.965625000000000000e+01 -1.033820000000000183e+00 -4.953125000000000000e+01 -1.033824999999999994e+00 -4.965625000000000000e+01 -1.033830000000000027e+00 -4.959375000000000000e+01 -1.033835000000000059e+00 -4.959375000000000000e+01 -1.033840000000000092e+00 -4.956250381469726562e+01 -1.033845000000000125e+00 -4.956250381469726562e+01 -1.033850000000000158e+00 -4.962500000000000000e+01 -1.033855000000000190e+00 -4.962500000000000000e+01 -1.033860000000000001e+00 -4.953125000000000000e+01 -1.033865000000000034e+00 -4.956250381469726562e+01 -1.033870000000000067e+00 -4.953125000000000000e+01 -1.033875000000000099e+00 -4.953125000000000000e+01 -1.033880000000000132e+00 -4.950000000000000000e+01 -1.033885000000000165e+00 -4.950000000000000000e+01 -1.033889999999999976e+00 -4.950000000000000000e+01 -1.033895000000000008e+00 -4.956250381469726562e+01 -1.033900000000000041e+00 -4.950000000000000000e+01 -1.033905000000000074e+00 -4.953125000000000000e+01 -1.033910000000000107e+00 -4.950000000000000000e+01 -1.033915000000000139e+00 -4.950000000000000000e+01 -1.033920000000000172e+00 -4.950000000000000000e+01 -1.033924999999999983e+00 -4.953125000000000000e+01 -1.033930000000000016e+00 -4.956250381469726562e+01 -1.033935000000000048e+00 -4.953125000000000000e+01 -1.033940000000000081e+00 -4.959375000000000000e+01 -1.033945000000000114e+00 -4.956250381469726562e+01 -1.033950000000000147e+00 -4.950000000000000000e+01 -1.033955000000000179e+00 -4.950000000000000000e+01 -1.033959999999999990e+00 -4.956250381469726562e+01 -1.033965000000000023e+00 -4.953125000000000000e+01 -1.033970000000000056e+00 -4.953125000000000000e+01 -1.033975000000000088e+00 -4.953125000000000000e+01 -1.033980000000000121e+00 -4.946875381469726562e+01 -1.033985000000000154e+00 -4.946875381469726562e+01 -1.033990000000000187e+00 -4.946875381469726562e+01 -1.033994999999999997e+00 -4.943750000000000000e+01 -1.034000000000000030e+00 -4.950000000000000000e+01 -1.034005000000000063e+00 -4.950000000000000000e+01 -1.034010000000000096e+00 -4.943750000000000000e+01 -1.034015000000000128e+00 -4.940625381469726562e+01 -1.034020000000000161e+00 -4.943750000000000000e+01 -1.034025000000000194e+00 -4.940625381469726562e+01 -1.034030000000000005e+00 -4.946875381469726562e+01 -1.034035000000000037e+00 -4.946875381469726562e+01 -1.034040000000000070e+00 -4.940625381469726562e+01 -1.034045000000000103e+00 -4.943750000000000000e+01 -1.034050000000000136e+00 -4.937500000000000000e+01 -1.034055000000000168e+00 -4.943750000000000000e+01 -1.034059999999999979e+00 -4.946875381469726562e+01 -1.034065000000000012e+00 -4.934375000000000000e+01 -1.034070000000000045e+00 -4.940625381469726562e+01 -1.034075000000000077e+00 -4.943750000000000000e+01 -1.034080000000000110e+00 -4.937500000000000000e+01 -1.034085000000000143e+00 -4.940625381469726562e+01 -1.034090000000000176e+00 -4.940625381469726562e+01 -1.034094999999999986e+00 -4.940625381469726562e+01 -1.034100000000000019e+00 -4.940625381469726562e+01 -1.034105000000000052e+00 -4.934375000000000000e+01 -1.034110000000000085e+00 -4.934375000000000000e+01 -1.034115000000000117e+00 -4.940625381469726562e+01 -1.034120000000000150e+00 -4.940625381469726562e+01 -1.034125000000000183e+00 -4.937500000000000000e+01 -1.034129999999999994e+00 -4.937500000000000000e+01 -1.034135000000000026e+00 -4.931250381469726562e+01 -1.034140000000000059e+00 -4.934375000000000000e+01 -1.034145000000000092e+00 -4.934375000000000000e+01 -1.034150000000000125e+00 -4.934375000000000000e+01 -1.034155000000000157e+00 -4.937500000000000000e+01 -1.034160000000000190e+00 -4.934375000000000000e+01 -1.034165000000000001e+00 -4.934375000000000000e+01 -1.034170000000000034e+00 -4.934375000000000000e+01 -1.034175000000000066e+00 -4.931250381469726562e+01 -1.034180000000000099e+00 -4.934375000000000000e+01 -1.034185000000000132e+00 -4.934375000000000000e+01 -1.034190000000000165e+00 -4.934375000000000000e+01 -1.034194999999999975e+00 -4.928125000000000000e+01 -1.034200000000000008e+00 -4.931250381469726562e+01 -1.034205000000000041e+00 -4.928125000000000000e+01 -1.034210000000000074e+00 -4.931250381469726562e+01 -1.034215000000000106e+00 -4.931250381469726562e+01 -1.034220000000000139e+00 -4.928125000000000000e+01 -1.034225000000000172e+00 -4.934375000000000000e+01 -1.034229999999999983e+00 -4.934375000000000000e+01 -1.034235000000000015e+00 -4.928125000000000000e+01 -1.034240000000000048e+00 -4.925000381469726562e+01 -1.034245000000000081e+00 -4.925000381469726562e+01 -1.034250000000000114e+00 -4.928125000000000000e+01 -1.034255000000000146e+00 -4.925000381469726562e+01 -1.034260000000000179e+00 -4.918750000000000000e+01 -1.034264999999999990e+00 -4.918750000000000000e+01 -1.034270000000000023e+00 -4.918750000000000000e+01 -1.034275000000000055e+00 -4.921875000000000000e+01 -1.034280000000000088e+00 -4.918750000000000000e+01 -1.034285000000000121e+00 -4.925000381469726562e+01 -1.034290000000000154e+00 -4.928125000000000000e+01 -1.034295000000000186e+00 -4.928125000000000000e+01 -1.034299999999999997e+00 -4.925000381469726562e+01 -1.034305000000000030e+00 -4.921875000000000000e+01 -1.034310000000000063e+00 -4.921875000000000000e+01 -1.034315000000000095e+00 -4.918750000000000000e+01 -1.034320000000000128e+00 -4.918750000000000000e+01 -1.034325000000000161e+00 -4.918750000000000000e+01 -1.034330000000000194e+00 -4.921875000000000000e+01 -1.034335000000000004e+00 -4.918750000000000000e+01 -1.034340000000000037e+00 -4.921875000000000000e+01 -1.034345000000000070e+00 -4.921875000000000000e+01 -1.034350000000000103e+00 -4.928125000000000000e+01 -1.034355000000000135e+00 -4.918750000000000000e+01 -1.034360000000000168e+00 -4.921875000000000000e+01 -1.034364999999999979e+00 -4.925000381469726562e+01 -1.034370000000000012e+00 -4.921875000000000000e+01 -1.034375000000000044e+00 -4.918750000000000000e+01 -1.034380000000000077e+00 -4.915625381469726562e+01 -1.034385000000000110e+00 -4.921875000000000000e+01 -1.034390000000000143e+00 -4.921875000000000000e+01 -1.034395000000000175e+00 -4.912500000000000000e+01 -1.034399999999999986e+00 -4.918750000000000000e+01 -1.034405000000000019e+00 -4.918750000000000000e+01 -1.034410000000000052e+00 -4.915625381469726562e+01 -1.034415000000000084e+00 -4.912500000000000000e+01 -1.034420000000000117e+00 -4.912500000000000000e+01 -1.034425000000000150e+00 -4.915625381469726562e+01 -1.034430000000000183e+00 -4.909375000000000000e+01 -1.034434999999999993e+00 -4.915625381469726562e+01 -1.034440000000000026e+00 -4.912500000000000000e+01 -1.034445000000000059e+00 -4.915625381469726562e+01 -1.034450000000000092e+00 -4.915625381469726562e+01 -1.034455000000000124e+00 -4.900000381469726562e+01 -1.034460000000000157e+00 -4.915625381469726562e+01 -1.034465000000000190e+00 -4.912500000000000000e+01 -1.034470000000000001e+00 -4.906250000000000000e+01 -1.034475000000000033e+00 -4.906250000000000000e+01 -1.034480000000000066e+00 -4.909375000000000000e+01 -1.034485000000000099e+00 -4.903125000000000000e+01 -1.034490000000000132e+00 -4.906250000000000000e+01 -1.034495000000000164e+00 -4.903125000000000000e+01 -1.034499999999999975e+00 -4.906250000000000000e+01 -1.034505000000000008e+00 -4.903125000000000000e+01 -1.034510000000000041e+00 -4.903125000000000000e+01 -1.034515000000000073e+00 -4.903125000000000000e+01 -1.034520000000000106e+00 -4.900000381469726562e+01 -1.034525000000000139e+00 -4.903125000000000000e+01 -1.034530000000000172e+00 -4.906250000000000000e+01 -1.034534999999999982e+00 -4.903125000000000000e+01 -1.034540000000000015e+00 -4.900000381469726562e+01 -1.034545000000000048e+00 -4.900000381469726562e+01 -1.034550000000000081e+00 -4.900000381469726562e+01 -1.034555000000000113e+00 -4.896875000000000000e+01 -1.034560000000000146e+00 -4.896875000000000000e+01 -1.034565000000000179e+00 -4.900000381469726562e+01 -1.034569999999999990e+00 -4.896875000000000000e+01 -1.034575000000000022e+00 -4.896875000000000000e+01 -1.034580000000000055e+00 -4.896875000000000000e+01 -1.034585000000000088e+00 -4.893750000000000000e+01 -1.034590000000000121e+00 -4.893750000000000000e+01 -1.034595000000000153e+00 -4.890625000000000000e+01 -1.034600000000000186e+00 -4.887500000000000000e+01 -1.034604999999999997e+00 -4.887500000000000000e+01 -1.034610000000000030e+00 -4.890625000000000000e+01 -1.034615000000000062e+00 -4.890625000000000000e+01 -1.034620000000000095e+00 -4.893750000000000000e+01 -1.034625000000000128e+00 -4.884375381469726562e+01 -1.034630000000000161e+00 -4.893750000000000000e+01 -1.034635000000000193e+00 -4.896875000000000000e+01 -1.034640000000000004e+00 -4.887500000000000000e+01 -1.034645000000000037e+00 -4.890625000000000000e+01 -1.034650000000000070e+00 -4.890625000000000000e+01 -1.034655000000000102e+00 -4.887500000000000000e+01 -1.034660000000000135e+00 -4.884375381469726562e+01 -1.034665000000000168e+00 -4.884375381469726562e+01 -1.034669999999999979e+00 -4.881250000000000000e+01 -1.034675000000000011e+00 -4.881250000000000000e+01 -1.034680000000000044e+00 -4.887500000000000000e+01 -1.034685000000000077e+00 -4.887500000000000000e+01 -1.034690000000000110e+00 -4.881250000000000000e+01 -1.034695000000000142e+00 -4.881250000000000000e+01 -1.034700000000000175e+00 -4.884375381469726562e+01 -1.034704999999999986e+00 -4.884375381469726562e+01 -1.034710000000000019e+00 -4.881250000000000000e+01 -1.034715000000000051e+00 -4.878125000000000000e+01 -1.034720000000000084e+00 -4.875000381469726562e+01 -1.034725000000000117e+00 -4.878125000000000000e+01 -1.034730000000000150e+00 -4.878125000000000000e+01 -1.034735000000000182e+00 -4.878125000000000000e+01 -1.034739999999999993e+00 -4.881250000000000000e+01 -1.034745000000000026e+00 -4.871875000000000000e+01 -1.034750000000000059e+00 -4.875000381469726562e+01 -1.034755000000000091e+00 -4.875000381469726562e+01 -1.034760000000000124e+00 -4.878125000000000000e+01 -1.034765000000000157e+00 -4.875000381469726562e+01 -1.034770000000000190e+00 -4.875000381469726562e+01 -1.034775000000000000e+00 -4.878125000000000000e+01 -1.034780000000000033e+00 -4.878125000000000000e+01 -1.034785000000000066e+00 -4.875000381469726562e+01 -1.034790000000000099e+00 -4.875000381469726562e+01 -1.034795000000000131e+00 -4.875000381469726562e+01 -1.034800000000000164e+00 -4.871875000000000000e+01 -1.034804999999999975e+00 -4.871875000000000000e+01 -1.034810000000000008e+00 -4.878125000000000000e+01 -1.034815000000000040e+00 -4.871875000000000000e+01 -1.034820000000000073e+00 -4.871875000000000000e+01 -1.034825000000000106e+00 -4.875000381469726562e+01 -1.034830000000000139e+00 -4.881250000000000000e+01 -1.034835000000000171e+00 -4.875000381469726562e+01 -1.034839999999999982e+00 -4.868750381469726562e+01 -1.034845000000000015e+00 -4.875000381469726562e+01 -1.034850000000000048e+00 -4.871875000000000000e+01 -1.034855000000000080e+00 -4.868750381469726562e+01 -1.034860000000000113e+00 -4.868750381469726562e+01 -1.034865000000000146e+00 -4.868750381469726562e+01 -1.034870000000000179e+00 -4.862500000000000000e+01 -1.034874999999999989e+00 -4.865625000000000000e+01 -1.034880000000000022e+00 -4.868750381469726562e+01 -1.034885000000000055e+00 -4.865625000000000000e+01 -1.034890000000000088e+00 -4.862500000000000000e+01 -1.034895000000000120e+00 -4.865625000000000000e+01 -1.034900000000000153e+00 -4.865625000000000000e+01 -1.034905000000000186e+00 -4.856250000000000000e+01 -1.034909999999999997e+00 -4.859375381469726562e+01 -1.034915000000000029e+00 -4.853125381469726562e+01 -1.034920000000000062e+00 -4.856250000000000000e+01 -1.034925000000000095e+00 -4.856250000000000000e+01 -1.034930000000000128e+00 -4.856250000000000000e+01 -1.034935000000000160e+00 -4.856250000000000000e+01 -1.034940000000000193e+00 -4.856250000000000000e+01 -1.034945000000000004e+00 -4.856250000000000000e+01 -1.034950000000000037e+00 -4.856250000000000000e+01 -1.034955000000000069e+00 -4.859375381469726562e+01 -1.034960000000000102e+00 -4.856250000000000000e+01 -1.034965000000000135e+00 -4.859375381469726562e+01 -1.034970000000000168e+00 -4.856250000000000000e+01 -1.034974999999999978e+00 -4.856250000000000000e+01 -1.034980000000000011e+00 -4.856250000000000000e+01 -1.034985000000000044e+00 -4.862500000000000000e+01 -1.034990000000000077e+00 -4.856250000000000000e+01 -1.034995000000000109e+00 -4.853125381469726562e+01 -1.035000000000000142e+00 -4.856250000000000000e+01 -1.035005000000000175e+00 -4.859375381469726562e+01 -1.035009999999999986e+00 -4.859375381469726562e+01 -1.035015000000000018e+00 -4.856250000000000000e+01 -1.035020000000000051e+00 -4.859375381469726562e+01 -1.035025000000000084e+00 -4.856250000000000000e+01 -1.035030000000000117e+00 -4.859375381469726562e+01 -1.035035000000000149e+00 -4.859375381469726562e+01 -1.035040000000000182e+00 -4.856250000000000000e+01 -1.035044999999999993e+00 -4.853125381469726562e+01 -1.035050000000000026e+00 -4.856250000000000000e+01 -1.035055000000000058e+00 -4.853125381469726562e+01 -1.035060000000000091e+00 -4.853125381469726562e+01 -1.035065000000000124e+00 -4.850000000000000000e+01 -1.035070000000000157e+00 -4.850000000000000000e+01 -1.035075000000000189e+00 -4.853125381469726562e+01 -1.035080000000000000e+00 -4.853125381469726562e+01 -1.035085000000000033e+00 -4.850000000000000000e+01 -1.035090000000000066e+00 -4.850000000000000000e+01 -1.035095000000000098e+00 -4.853125381469726562e+01 -1.035100000000000131e+00 -4.850000000000000000e+01 -1.035105000000000164e+00 -4.846875000000000000e+01 -1.035109999999999975e+00 -4.846875000000000000e+01 -1.035115000000000007e+00 -4.850000000000000000e+01 -1.035120000000000040e+00 -4.843750381469726562e+01 -1.035125000000000073e+00 -4.846875000000000000e+01 -1.035130000000000106e+00 -4.850000000000000000e+01 -1.035135000000000138e+00 -4.843750381469726562e+01 -1.035140000000000171e+00 -4.840625000000000000e+01 -1.035144999999999982e+00 -4.843750381469726562e+01 -1.035150000000000015e+00 -4.846875000000000000e+01 -1.035155000000000047e+00 -4.846875000000000000e+01 -1.035160000000000080e+00 -4.840625000000000000e+01 -1.035165000000000113e+00 -4.846875000000000000e+01 -1.035170000000000146e+00 -4.846875000000000000e+01 -1.035175000000000178e+00 -4.840625000000000000e+01 -1.035179999999999989e+00 -4.843750381469726562e+01 -1.035185000000000022e+00 -4.840625000000000000e+01 -1.035190000000000055e+00 -4.840625000000000000e+01 -1.035195000000000087e+00 -4.840625000000000000e+01 -1.035200000000000120e+00 -4.837500000000000000e+01 -1.035205000000000153e+00 -4.834375000000000000e+01 -1.035210000000000186e+00 -4.837500000000000000e+01 -1.035214999999999996e+00 -4.834375000000000000e+01 -1.035220000000000029e+00 -4.840625000000000000e+01 -1.035225000000000062e+00 -4.843750381469726562e+01 -1.035230000000000095e+00 -4.834375000000000000e+01 -1.035235000000000127e+00 -4.843750381469726562e+01 -1.035240000000000160e+00 -4.840625000000000000e+01 -1.035245000000000193e+00 -4.840625000000000000e+01 -1.035250000000000004e+00 -4.831250000000000000e+01 -1.035255000000000036e+00 -4.834375000000000000e+01 -1.035260000000000069e+00 -4.834375000000000000e+01 -1.035265000000000102e+00 -4.834375000000000000e+01 -1.035270000000000135e+00 -4.834375000000000000e+01 -1.035275000000000167e+00 -4.837500000000000000e+01 -1.035279999999999978e+00 -4.840625000000000000e+01 -1.035285000000000011e+00 -4.828125381469726562e+01 -1.035290000000000044e+00 -4.831250000000000000e+01 -1.035295000000000076e+00 -4.834375000000000000e+01 -1.035300000000000109e+00 -4.834375000000000000e+01 -1.035305000000000142e+00 -4.837500000000000000e+01 -1.035310000000000175e+00 -4.834375000000000000e+01 -1.035314999999999985e+00 -4.831250000000000000e+01 -1.035320000000000018e+00 -4.834375000000000000e+01 -1.035325000000000051e+00 -4.834375000000000000e+01 -1.035330000000000084e+00 -4.828125381469726562e+01 -1.035335000000000116e+00 -4.825000000000000000e+01 -1.035340000000000149e+00 -4.828125381469726562e+01 -1.035345000000000182e+00 -4.831250000000000000e+01 -1.035349999999999993e+00 -4.828125381469726562e+01 -1.035355000000000025e+00 -4.828125381469726562e+01 -1.035360000000000058e+00 -4.831250000000000000e+01 -1.035365000000000091e+00 -4.828125381469726562e+01 -1.035370000000000124e+00 -4.825000000000000000e+01 -1.035375000000000156e+00 -4.828125381469726562e+01 -1.035380000000000189e+00 -4.831250000000000000e+01 -1.035385000000000000e+00 -4.825000000000000000e+01 -1.035390000000000033e+00 -4.831250000000000000e+01 -1.035395000000000065e+00 -4.821875000000000000e+01 -1.035400000000000098e+00 -4.825000000000000000e+01 -1.035405000000000131e+00 -4.828125381469726562e+01 -1.035410000000000164e+00 -4.818750000000000000e+01 -1.035414999999999974e+00 -4.825000000000000000e+01 -1.035420000000000007e+00 -4.821875000000000000e+01 -1.035425000000000040e+00 -4.821875000000000000e+01 -1.035430000000000073e+00 -4.821875000000000000e+01 -1.035435000000000105e+00 -4.825000000000000000e+01 -1.035440000000000138e+00 -4.831250000000000000e+01 -1.035445000000000171e+00 -4.825000000000000000e+01 -1.035449999999999982e+00 -4.821875000000000000e+01 -1.035455000000000014e+00 -4.825000000000000000e+01 -1.035460000000000047e+00 -4.815625000000000000e+01 -1.035465000000000080e+00 -4.815625000000000000e+01 -1.035470000000000113e+00 -4.818750000000000000e+01 -1.035475000000000145e+00 -4.818750000000000000e+01 -1.035480000000000178e+00 -4.821875000000000000e+01 -1.035484999999999989e+00 -4.818750000000000000e+01 -1.035490000000000022e+00 -4.815625000000000000e+01 -1.035495000000000054e+00 -4.812500381469726562e+01 -1.035500000000000087e+00 -4.821875000000000000e+01 -1.035505000000000120e+00 -4.818750000000000000e+01 -1.035510000000000153e+00 -4.821875000000000000e+01 -1.035515000000000185e+00 -4.818750000000000000e+01 -1.035519999999999996e+00 -4.821875000000000000e+01 -1.035525000000000029e+00 -4.818750000000000000e+01 -1.035530000000000062e+00 -4.818750000000000000e+01 -1.035535000000000094e+00 -4.815625000000000000e+01 -1.035540000000000127e+00 -4.812500381469726562e+01 -1.035545000000000160e+00 -4.812500381469726562e+01 -1.035550000000000193e+00 -4.812500381469726562e+01 -1.035555000000000003e+00 -4.809375000000000000e+01 -1.035560000000000036e+00 -4.809375000000000000e+01 -1.035565000000000069e+00 -4.806250000000000000e+01 -1.035570000000000102e+00 -4.809375000000000000e+01 -1.035575000000000134e+00 -4.809375000000000000e+01 -1.035580000000000167e+00 -4.809375000000000000e+01 -1.035584999999999978e+00 -4.812500381469726562e+01 -1.035590000000000011e+00 -4.809375000000000000e+01 -1.035595000000000043e+00 -4.809375000000000000e+01 -1.035600000000000076e+00 -4.812500381469726562e+01 -1.035605000000000109e+00 -4.803125000000000000e+01 -1.035610000000000142e+00 -4.803125000000000000e+01 -1.035615000000000174e+00 -4.803125000000000000e+01 -1.035619999999999985e+00 -4.809375000000000000e+01 -1.035625000000000018e+00 -4.800000000000000000e+01 -1.035630000000000051e+00 -4.803125000000000000e+01 -1.035635000000000083e+00 -4.806250000000000000e+01 -1.035640000000000116e+00 -4.809375000000000000e+01 -1.035645000000000149e+00 -4.806250000000000000e+01 -1.035650000000000182e+00 -4.803125000000000000e+01 -1.035654999999999992e+00 -4.803125000000000000e+01 -1.035660000000000025e+00 -4.803125000000000000e+01 -1.035665000000000058e+00 -4.806250000000000000e+01 -1.035670000000000091e+00 -4.803125000000000000e+01 -1.035675000000000123e+00 -4.803125000000000000e+01 -1.035680000000000156e+00 -4.815625000000000000e+01 -1.035685000000000189e+00 -4.803125000000000000e+01 -1.035690000000000000e+00 -4.800000000000000000e+01 -1.035695000000000032e+00 -4.803125000000000000e+01 -1.035700000000000065e+00 -4.806250000000000000e+01 -1.035705000000000098e+00 -4.803125000000000000e+01 -1.035710000000000131e+00 -4.800000000000000000e+01 -1.035715000000000163e+00 -4.803125000000000000e+01 -1.035719999999999974e+00 -4.803125000000000000e+01 -1.035725000000000007e+00 -4.796875381469726562e+01 -1.035730000000000040e+00 -4.800000000000000000e+01 -1.035735000000000072e+00 -4.796875381469726562e+01 -1.035740000000000105e+00 -4.803125000000000000e+01 -1.035745000000000138e+00 -4.796875381469726562e+01 -1.035750000000000171e+00 -4.800000000000000000e+01 -1.035754999999999981e+00 -4.796875381469726562e+01 -1.035760000000000014e+00 -4.803125000000000000e+01 -1.035765000000000047e+00 -4.796875381469726562e+01 -1.035770000000000080e+00 -4.796875381469726562e+01 -1.035775000000000112e+00 -4.793750000000000000e+01 -1.035780000000000145e+00 -4.803125000000000000e+01 -1.035785000000000178e+00 -4.793750000000000000e+01 -1.035789999999999988e+00 -4.793750000000000000e+01 -1.035795000000000021e+00 -4.790625000000000000e+01 -1.035800000000000054e+00 -4.803125000000000000e+01 -1.035805000000000087e+00 -4.800000000000000000e+01 -1.035810000000000120e+00 -4.787500381469726562e+01 -1.035815000000000152e+00 -4.793750000000000000e+01 -1.035820000000000185e+00 -4.787500381469726562e+01 -1.035824999999999996e+00 -4.793750000000000000e+01 -1.035830000000000028e+00 -4.790625000000000000e+01 -1.035835000000000061e+00 -4.787500381469726562e+01 -1.035840000000000094e+00 -4.784375000000000000e+01 -1.035845000000000127e+00 -4.790625000000000000e+01 -1.035850000000000160e+00 -4.784375000000000000e+01 -1.035855000000000192e+00 -4.793750000000000000e+01 -1.035860000000000003e+00 -4.790625000000000000e+01 -1.035865000000000036e+00 -4.793750000000000000e+01 -1.035870000000000068e+00 -4.790625000000000000e+01 -1.035875000000000101e+00 -4.790625000000000000e+01 -1.035880000000000134e+00 -4.790625000000000000e+01 -1.035885000000000167e+00 -4.787500381469726562e+01 -1.035889999999999977e+00 -4.787500381469726562e+01 -1.035895000000000010e+00 -4.781250381469726562e+01 -1.035900000000000043e+00 -4.787500381469726562e+01 -1.035905000000000076e+00 -4.781250381469726562e+01 -1.035910000000000108e+00 -4.781250381469726562e+01 -1.035915000000000141e+00 -4.784375000000000000e+01 -1.035920000000000174e+00 -4.781250381469726562e+01 -1.035924999999999985e+00 -4.784375000000000000e+01 -1.035930000000000017e+00 -4.781250381469726562e+01 -1.035935000000000050e+00 -4.781250381469726562e+01 -1.035940000000000083e+00 -4.781250381469726562e+01 -1.035945000000000116e+00 -4.778125000000000000e+01 -1.035950000000000149e+00 -4.778125000000000000e+01 -1.035955000000000181e+00 -4.778125000000000000e+01 -1.035959999999999992e+00 -4.778125000000000000e+01 -1.035965000000000025e+00 -4.781250381469726562e+01 -1.035970000000000057e+00 -4.778125000000000000e+01 -1.035975000000000090e+00 -4.787500381469726562e+01 -1.035980000000000123e+00 -4.771875381469726562e+01 -1.035985000000000156e+00 -4.781250381469726562e+01 -1.035990000000000189e+00 -4.778125000000000000e+01 -1.035994999999999999e+00 -4.781250381469726562e+01 -1.036000000000000032e+00 -4.775000000000000000e+01 -1.036005000000000065e+00 -4.768750000000000000e+01 -1.036010000000000097e+00 -4.775000000000000000e+01 -1.036015000000000130e+00 -4.775000000000000000e+01 -1.036020000000000163e+00 -4.775000000000000000e+01 -1.036025000000000196e+00 -4.771875381469726562e+01 -1.036030000000000006e+00 -4.771875381469726562e+01 -1.036035000000000039e+00 -4.775000000000000000e+01 -1.036040000000000072e+00 -4.771875381469726562e+01 -1.036045000000000105e+00 -4.771875381469726562e+01 -1.036050000000000137e+00 -4.775000000000000000e+01 -1.036055000000000170e+00 -4.765625000000000000e+01 -1.036059999999999981e+00 -4.775000000000000000e+01 -1.036065000000000014e+00 -4.771875381469726562e+01 -1.036070000000000046e+00 -4.771875381469726562e+01 -1.036075000000000079e+00 -4.765625000000000000e+01 -1.036080000000000112e+00 -4.762500000000000000e+01 -1.036085000000000145e+00 -4.768750000000000000e+01 -1.036090000000000177e+00 -4.765625000000000000e+01 -1.036094999999999988e+00 -4.765625000000000000e+01 -1.036100000000000021e+00 -4.771875381469726562e+01 -1.036105000000000054e+00 -4.768750000000000000e+01 -1.036110000000000086e+00 -4.765625000000000000e+01 -1.036115000000000119e+00 -4.762500000000000000e+01 -1.036120000000000152e+00 -4.759375000000000000e+01 -1.036125000000000185e+00 -4.762500000000000000e+01 -1.036129999999999995e+00 -4.765625000000000000e+01 -1.036135000000000028e+00 -4.759375000000000000e+01 -1.036140000000000061e+00 -4.759375000000000000e+01 -1.036145000000000094e+00 -4.753125000000000000e+01 -1.036150000000000126e+00 -4.765625000000000000e+01 -1.036155000000000159e+00 -4.759375000000000000e+01 -1.036160000000000192e+00 -4.759375000000000000e+01 -1.036165000000000003e+00 -4.768750000000000000e+01 -1.036170000000000035e+00 -4.765625000000000000e+01 -1.036175000000000068e+00 -4.759375000000000000e+01 -1.036180000000000101e+00 -4.756250381469726562e+01 -1.036185000000000134e+00 -4.759375000000000000e+01 -1.036190000000000166e+00 -4.753125000000000000e+01 -1.036194999999999977e+00 -4.756250381469726562e+01 -1.036200000000000010e+00 -4.762500000000000000e+01 -1.036205000000000043e+00 -4.756250381469726562e+01 -1.036210000000000075e+00 -4.753125000000000000e+01 -1.036215000000000108e+00 -4.756250381469726562e+01 -1.036220000000000141e+00 -4.753125000000000000e+01 -1.036225000000000174e+00 -4.759375000000000000e+01 -1.036229999999999984e+00 -4.753125000000000000e+01 -1.036235000000000017e+00 -4.759375000000000000e+01 -1.036240000000000050e+00 -4.756250381469726562e+01 -1.036245000000000083e+00 -4.750000000000000000e+01 -1.036250000000000115e+00 -4.756250381469726562e+01 -1.036255000000000148e+00 -4.753125000000000000e+01 -1.036260000000000181e+00 -4.753125000000000000e+01 -1.036264999999999992e+00 -4.750000000000000000e+01 -1.036270000000000024e+00 -4.756250381469726562e+01 -1.036275000000000057e+00 -4.753125000000000000e+01 -1.036280000000000090e+00 -4.753125000000000000e+01 -1.036285000000000123e+00 -4.756250381469726562e+01 -1.036290000000000155e+00 -4.750000000000000000e+01 -1.036295000000000188e+00 -4.746875000000000000e+01 -1.036299999999999999e+00 -4.753125000000000000e+01 -1.036305000000000032e+00 -4.753125000000000000e+01 -1.036310000000000064e+00 -4.750000000000000000e+01 -1.036315000000000097e+00 -4.753125000000000000e+01 -1.036320000000000130e+00 -4.753125000000000000e+01 -1.036325000000000163e+00 -4.746875000000000000e+01 -1.036330000000000195e+00 -4.753125000000000000e+01 -1.036335000000000006e+00 -4.750000000000000000e+01 -1.036340000000000039e+00 -4.750000000000000000e+01 -1.036345000000000072e+00 -4.753125000000000000e+01 -1.036350000000000104e+00 -4.753125000000000000e+01 -1.036355000000000137e+00 -4.750000000000000000e+01 -1.036360000000000170e+00 -4.750000000000000000e+01 -1.036364999999999981e+00 -4.750000000000000000e+01 -1.036370000000000013e+00 -4.746875000000000000e+01 -1.036375000000000046e+00 -4.746875000000000000e+01 -1.036380000000000079e+00 -4.750000000000000000e+01 -1.036385000000000112e+00 -4.746875000000000000e+01 -1.036390000000000144e+00 -4.746875000000000000e+01 -1.036395000000000177e+00 -4.746875000000000000e+01 -1.036399999999999988e+00 -4.750000000000000000e+01 -1.036405000000000021e+00 -4.743750000000000000e+01 -1.036410000000000053e+00 -4.750000000000000000e+01 -1.036415000000000086e+00 -4.746875000000000000e+01 -1.036420000000000119e+00 -4.746875000000000000e+01 -1.036425000000000152e+00 -4.746875000000000000e+01 -1.036430000000000184e+00 -4.743750000000000000e+01 -1.036434999999999995e+00 -4.746875000000000000e+01 -1.036440000000000028e+00 -4.746875000000000000e+01 -1.036445000000000061e+00 -4.743750000000000000e+01 -1.036450000000000093e+00 -4.743750000000000000e+01 -1.036455000000000126e+00 -4.740625381469726562e+01 -1.036460000000000159e+00 -4.743750000000000000e+01 -1.036465000000000192e+00 -4.743750000000000000e+01 -1.036470000000000002e+00 -4.740625381469726562e+01 -1.036475000000000035e+00 -4.740625381469726562e+01 -1.036480000000000068e+00 -4.743750000000000000e+01 -1.036485000000000101e+00 -4.743750000000000000e+01 -1.036490000000000133e+00 -4.743750000000000000e+01 -1.036495000000000166e+00 -4.737500000000000000e+01 -1.036499999999999977e+00 -4.740625381469726562e+01 -1.036505000000000010e+00 -4.737500000000000000e+01 -1.036510000000000042e+00 -4.737500000000000000e+01 -1.036515000000000075e+00 -4.737500000000000000e+01 -1.036520000000000108e+00 -4.743750000000000000e+01 -1.036525000000000141e+00 -4.740625381469726562e+01 -1.036530000000000173e+00 -4.734375000000000000e+01 -1.036534999999999984e+00 -4.734375000000000000e+01 -1.036540000000000017e+00 -4.737500000000000000e+01 -1.036545000000000050e+00 -4.731250000000000000e+01 -1.036550000000000082e+00 -4.737500000000000000e+01 -1.036555000000000115e+00 -4.734375000000000000e+01 -1.036560000000000148e+00 -4.728125000000000000e+01 -1.036565000000000181e+00 -4.731250000000000000e+01 -1.036569999999999991e+00 -4.734375000000000000e+01 -1.036575000000000024e+00 -4.731250000000000000e+01 -1.036580000000000057e+00 -4.734375000000000000e+01 -1.036585000000000090e+00 -4.731250000000000000e+01 -1.036590000000000122e+00 -4.734375000000000000e+01 -1.036595000000000155e+00 -4.728125000000000000e+01 -1.036600000000000188e+00 -4.728125000000000000e+01 -1.036604999999999999e+00 -4.731250000000000000e+01 -1.036610000000000031e+00 -4.734375000000000000e+01 -1.036615000000000064e+00 -4.728125000000000000e+01 -1.036620000000000097e+00 -4.725000381469726562e+01 -1.036625000000000130e+00 -4.725000381469726562e+01 -1.036630000000000162e+00 -4.728125000000000000e+01 -1.036635000000000195e+00 -4.721875000000000000e+01 -1.036640000000000006e+00 -4.731250000000000000e+01 -1.036645000000000039e+00 -4.728125000000000000e+01 -1.036650000000000071e+00 -4.725000381469726562e+01 -1.036655000000000104e+00 -4.728125000000000000e+01 -1.036660000000000137e+00 -4.731250000000000000e+01 -1.036665000000000170e+00 -4.725000381469726562e+01 -1.036669999999999980e+00 -4.721875000000000000e+01 -1.036675000000000013e+00 -4.718750000000000000e+01 -1.036680000000000046e+00 -4.725000381469726562e+01 -1.036685000000000079e+00 -4.721875000000000000e+01 -1.036690000000000111e+00 -4.725000381469726562e+01 -1.036695000000000144e+00 -4.731250000000000000e+01 -1.036700000000000177e+00 -4.725000381469726562e+01 -1.036704999999999988e+00 -4.718750000000000000e+01 -1.036710000000000020e+00 -4.721875000000000000e+01 -1.036715000000000053e+00 -4.721875000000000000e+01 -1.036720000000000086e+00 -4.721875000000000000e+01 -1.036725000000000119e+00 -4.718750000000000000e+01 -1.036730000000000151e+00 -4.715625381469726562e+01 -1.036735000000000184e+00 -4.718750000000000000e+01 -1.036739999999999995e+00 -4.715625381469726562e+01 -1.036745000000000028e+00 -4.718750000000000000e+01 -1.036750000000000060e+00 -4.718750000000000000e+01 -1.036755000000000093e+00 -4.715625381469726562e+01 -1.036760000000000126e+00 -4.715625381469726562e+01 -1.036765000000000159e+00 -4.725000381469726562e+01 -1.036770000000000191e+00 -4.718750000000000000e+01 -1.036775000000000002e+00 -4.718750000000000000e+01 -1.036780000000000035e+00 -4.715625381469726562e+01 -1.036785000000000068e+00 -4.712500000000000000e+01 -1.036790000000000100e+00 -4.709375381469726562e+01 -1.036795000000000133e+00 -4.712500000000000000e+01 -1.036800000000000166e+00 -4.715625381469726562e+01 -1.036804999999999977e+00 -4.712500000000000000e+01 -1.036810000000000009e+00 -4.712500000000000000e+01 -1.036815000000000042e+00 -4.715625381469726562e+01 -1.036820000000000075e+00 -4.712500000000000000e+01 -1.036825000000000108e+00 -4.706250000000000000e+01 -1.036830000000000140e+00 -4.709375381469726562e+01 -1.036835000000000173e+00 -4.709375381469726562e+01 -1.036839999999999984e+00 -4.712500000000000000e+01 -1.036845000000000017e+00 -4.715625381469726562e+01 -1.036850000000000049e+00 -4.709375381469726562e+01 -1.036855000000000082e+00 -4.706250000000000000e+01 -1.036860000000000115e+00 -4.706250000000000000e+01 -1.036865000000000148e+00 -4.706250000000000000e+01 -1.036870000000000180e+00 -4.712500000000000000e+01 -1.036874999999999991e+00 -4.706250000000000000e+01 -1.036880000000000024e+00 -4.709375381469726562e+01 -1.036885000000000057e+00 -4.703125000000000000e+01 -1.036890000000000089e+00 -4.706250000000000000e+01 -1.036895000000000122e+00 -4.706250000000000000e+01 -1.036900000000000155e+00 -4.706250000000000000e+01 -1.036905000000000188e+00 -4.703125000000000000e+01 -1.036909999999999998e+00 -4.700000381469726562e+01 -1.036915000000000031e+00 -4.706250000000000000e+01 -1.036920000000000064e+00 -4.709375381469726562e+01 -1.036925000000000097e+00 -4.700000381469726562e+01 -1.036930000000000129e+00 -4.703125000000000000e+01 -1.036935000000000162e+00 -4.703125000000000000e+01 -1.036940000000000195e+00 -4.703125000000000000e+01 -1.036945000000000006e+00 -4.706250000000000000e+01 -1.036950000000000038e+00 -4.700000381469726562e+01 -1.036955000000000071e+00 -4.703125000000000000e+01 -1.036960000000000104e+00 -4.706250000000000000e+01 -1.036965000000000137e+00 -4.703125000000000000e+01 -1.036970000000000169e+00 -4.700000381469726562e+01 -1.036974999999999980e+00 -4.696875000000000000e+01 -1.036980000000000013e+00 -4.700000381469726562e+01 -1.036985000000000046e+00 -4.700000381469726562e+01 -1.036990000000000078e+00 -4.700000381469726562e+01 -1.036995000000000111e+00 -4.696875000000000000e+01 -1.037000000000000144e+00 -4.700000381469726562e+01 -1.037005000000000177e+00 -4.693750000000000000e+01 -1.037009999999999987e+00 -4.703125000000000000e+01 -1.037015000000000020e+00 -4.700000381469726562e+01 -1.037020000000000053e+00 -4.690625000000000000e+01 -1.037025000000000086e+00 -4.700000381469726562e+01 -1.037030000000000118e+00 -4.700000381469726562e+01 -1.037035000000000151e+00 -4.696875000000000000e+01 -1.037040000000000184e+00 -4.700000381469726562e+01 -1.037044999999999995e+00 -4.693750000000000000e+01 -1.037050000000000027e+00 -4.696875000000000000e+01 -1.037055000000000060e+00 -4.690625000000000000e+01 -1.037060000000000093e+00 -4.696875000000000000e+01 -1.037065000000000126e+00 -4.700000381469726562e+01 -1.037070000000000158e+00 -4.693750000000000000e+01 -1.037075000000000191e+00 -4.696875000000000000e+01 -1.037080000000000002e+00 -4.693750000000000000e+01 -1.037085000000000035e+00 -4.693750000000000000e+01 -1.037090000000000067e+00 -4.696875000000000000e+01 -1.037095000000000100e+00 -4.696875000000000000e+01 -1.037100000000000133e+00 -4.687500000000000000e+01 -1.037105000000000166e+00 -4.690625000000000000e+01 -1.037109999999999976e+00 -4.687500000000000000e+01 -1.037115000000000009e+00 -4.690625000000000000e+01 -1.037120000000000042e+00 -4.693750000000000000e+01 -1.037125000000000075e+00 -4.693750000000000000e+01 -1.037130000000000107e+00 -4.690625000000000000e+01 -1.037135000000000140e+00 -4.690625000000000000e+01 -1.037140000000000173e+00 -4.684375381469726562e+01 -1.037144999999999984e+00 -4.687500000000000000e+01 -1.037150000000000016e+00 -4.690625000000000000e+01 -1.037155000000000049e+00 -4.690625000000000000e+01 -1.037160000000000082e+00 -4.693750000000000000e+01 -1.037165000000000115e+00 -4.684375381469726562e+01 -1.037170000000000147e+00 -4.684375381469726562e+01 -1.037175000000000180e+00 -4.684375381469726562e+01 -1.037179999999999991e+00 -4.681250000000000000e+01 -1.037185000000000024e+00 -4.687500000000000000e+01 -1.037190000000000056e+00 -4.681250000000000000e+01 -1.037195000000000089e+00 -4.684375381469726562e+01 -1.037200000000000122e+00 -4.678125000000000000e+01 -1.037205000000000155e+00 -4.684375381469726562e+01 -1.037210000000000187e+00 -4.681250000000000000e+01 -1.037214999999999998e+00 -4.678125000000000000e+01 -1.037220000000000031e+00 -4.675000000000000000e+01 -1.037225000000000064e+00 -4.671875000000000000e+01 -1.037230000000000096e+00 -4.684375381469726562e+01 -1.037235000000000129e+00 -4.678125000000000000e+01 -1.037240000000000162e+00 -4.675000000000000000e+01 -1.037245000000000195e+00 -4.681250000000000000e+01 -1.037250000000000005e+00 -4.681250000000000000e+01 -1.037255000000000038e+00 -4.678125000000000000e+01 -1.037260000000000071e+00 -4.681250000000000000e+01 -1.037265000000000104e+00 -4.678125000000000000e+01 -1.037270000000000136e+00 -4.678125000000000000e+01 -1.037275000000000169e+00 -4.681250000000000000e+01 -1.037279999999999980e+00 -4.675000000000000000e+01 -1.037285000000000013e+00 -4.675000000000000000e+01 -1.037290000000000045e+00 -4.671875000000000000e+01 -1.037295000000000078e+00 -4.675000000000000000e+01 -1.037300000000000111e+00 -4.675000000000000000e+01 -1.037305000000000144e+00 -4.671875000000000000e+01 -1.037310000000000176e+00 -4.678125000000000000e+01 -1.037314999999999987e+00 -4.675000000000000000e+01 -1.037320000000000020e+00 -4.675000000000000000e+01 -1.037325000000000053e+00 -4.678125000000000000e+01 -1.037330000000000085e+00 -4.675000000000000000e+01 -1.037335000000000118e+00 -4.681250000000000000e+01 -1.037340000000000151e+00 -4.681250000000000000e+01 -1.037345000000000184e+00 -4.671875000000000000e+01 -1.037349999999999994e+00 -4.678125000000000000e+01 -1.037355000000000027e+00 -4.671875000000000000e+01 -1.037360000000000060e+00 -4.671875000000000000e+01 -1.037365000000000093e+00 -4.675000000000000000e+01 -1.037370000000000125e+00 -4.671875000000000000e+01 -1.037375000000000158e+00 -4.665625000000000000e+01 -1.037380000000000191e+00 -4.671875000000000000e+01 -1.037385000000000002e+00 -4.671875000000000000e+01 -1.037390000000000034e+00 -4.665625000000000000e+01 -1.037395000000000067e+00 -4.665625000000000000e+01 -1.037400000000000100e+00 -4.665625000000000000e+01 -1.037405000000000133e+00 -4.665625000000000000e+01 -1.037410000000000165e+00 -4.665625000000000000e+01 -1.037414999999999976e+00 -4.659375000000000000e+01 -1.037420000000000009e+00 -4.662500000000000000e+01 -1.037425000000000042e+00 -4.662500000000000000e+01 -1.037430000000000074e+00 -4.656250000000000000e+01 -1.037435000000000107e+00 -4.662500000000000000e+01 -1.037440000000000140e+00 -4.659375000000000000e+01 -1.037445000000000173e+00 -4.656250000000000000e+01 -1.037449999999999983e+00 -4.659375000000000000e+01 -1.037455000000000016e+00 -4.656250000000000000e+01 -1.037460000000000049e+00 -4.662500000000000000e+01 -1.037465000000000082e+00 -4.656250000000000000e+01 -1.037470000000000114e+00 -4.659375000000000000e+01 -1.037475000000000147e+00 -4.653125381469726562e+01 -1.037480000000000180e+00 -4.646875000000000000e+01 -1.037484999999999991e+00 -4.659375000000000000e+01 -1.037490000000000023e+00 -4.653125381469726562e+01 -1.037495000000000056e+00 -4.650000000000000000e+01 -1.037500000000000089e+00 -4.646875000000000000e+01 -1.037505000000000122e+00 -4.656250000000000000e+01 -1.037510000000000154e+00 -4.650000000000000000e+01 -1.037515000000000187e+00 -4.650000000000000000e+01 -1.037519999999999998e+00 -4.653125381469726562e+01 -1.037525000000000031e+00 -4.650000000000000000e+01 -1.037530000000000063e+00 -4.650000000000000000e+01 -1.037535000000000096e+00 -4.653125381469726562e+01 -1.037540000000000129e+00 -4.653125381469726562e+01 -1.037545000000000162e+00 -4.653125381469726562e+01 -1.037550000000000194e+00 -4.646875000000000000e+01 -1.037555000000000005e+00 -4.643750000000000000e+01 -1.037560000000000038e+00 -4.650000000000000000e+01 -1.037565000000000071e+00 -4.650000000000000000e+01 -1.037570000000000103e+00 -4.643750000000000000e+01 -1.037575000000000136e+00 -4.646875000000000000e+01 -1.037580000000000169e+00 -4.646875000000000000e+01 -1.037584999999999980e+00 -4.650000000000000000e+01 -1.037590000000000012e+00 -4.646875000000000000e+01 -1.037595000000000045e+00 -4.643750000000000000e+01 -1.037600000000000078e+00 -4.640625000000000000e+01 -1.037605000000000111e+00 -4.646875000000000000e+01 -1.037610000000000143e+00 -4.640625000000000000e+01 -1.037615000000000176e+00 -4.646875000000000000e+01 -1.037619999999999987e+00 -4.646875000000000000e+01 -1.037625000000000020e+00 -4.640625000000000000e+01 -1.037630000000000052e+00 -4.643750000000000000e+01 -1.037635000000000085e+00 -4.637500381469726562e+01 -1.037640000000000118e+00 -4.640625000000000000e+01 -1.037645000000000151e+00 -4.637500381469726562e+01 -1.037650000000000183e+00 -4.640625000000000000e+01 -1.037654999999999994e+00 -4.643750000000000000e+01 -1.037660000000000027e+00 -4.640625000000000000e+01 -1.037665000000000060e+00 -4.640625000000000000e+01 -1.037670000000000092e+00 -4.643750000000000000e+01 -1.037675000000000125e+00 -4.643750000000000000e+01 -1.037680000000000158e+00 -4.640625000000000000e+01 -1.037685000000000191e+00 -4.637500381469726562e+01 -1.037690000000000001e+00 -4.634375000000000000e+01 -1.037695000000000034e+00 -4.631250000000000000e+01 -1.037700000000000067e+00 -4.640625000000000000e+01 -1.037705000000000100e+00 -4.637500381469726562e+01 -1.037710000000000132e+00 -4.634375000000000000e+01 -1.037715000000000165e+00 -4.637500381469726562e+01 -1.037719999999999976e+00 -4.631250000000000000e+01 -1.037725000000000009e+00 -4.634375000000000000e+01 -1.037730000000000041e+00 -4.637500381469726562e+01 -1.037735000000000074e+00 -4.634375000000000000e+01 -1.037740000000000107e+00 -4.637500381469726562e+01 -1.037745000000000140e+00 -4.637500381469726562e+01 -1.037750000000000172e+00 -4.634375000000000000e+01 -1.037754999999999983e+00 -4.634375000000000000e+01 -1.037760000000000016e+00 -4.631250000000000000e+01 -1.037765000000000049e+00 -4.628125381469726562e+01 -1.037770000000000081e+00 -4.625000000000000000e+01 -1.037775000000000114e+00 -4.631250000000000000e+01 -1.037780000000000147e+00 -4.628125381469726562e+01 -1.037785000000000180e+00 -4.628125381469726562e+01 -1.037789999999999990e+00 -4.625000000000000000e+01 -1.037795000000000023e+00 -4.621875381469726562e+01 -1.037800000000000056e+00 -4.631250000000000000e+01 -1.037805000000000089e+00 -4.628125381469726562e+01 -1.037810000000000121e+00 -4.628125381469726562e+01 -1.037815000000000154e+00 -4.625000000000000000e+01 -1.037820000000000187e+00 -4.621875381469726562e+01 -1.037824999999999998e+00 -4.628125381469726562e+01 -1.037830000000000030e+00 -4.621875381469726562e+01 -1.037835000000000063e+00 -4.621875381469726562e+01 -1.037840000000000096e+00 -4.621875381469726562e+01 -1.037845000000000129e+00 -4.628125381469726562e+01 -1.037850000000000161e+00 -4.618750000000000000e+01 -1.037855000000000194e+00 -4.621875381469726562e+01 -1.037860000000000005e+00 -4.615625000000000000e+01 -1.037865000000000038e+00 -4.618750000000000000e+01 -1.037870000000000070e+00 -4.621875381469726562e+01 -1.037875000000000103e+00 -4.615625000000000000e+01 -1.037880000000000136e+00 -4.618750000000000000e+01 -1.037885000000000169e+00 -4.618750000000000000e+01 -1.037889999999999979e+00 -4.612500381469726562e+01 -1.037895000000000012e+00 -4.618750000000000000e+01 -1.037900000000000045e+00 -4.615625000000000000e+01 -1.037905000000000078e+00 -4.618750000000000000e+01 -1.037910000000000110e+00 -4.615625000000000000e+01 -1.037915000000000143e+00 -4.615625000000000000e+01 -1.037920000000000176e+00 -4.615625000000000000e+01 -1.037924999999999986e+00 -4.615625000000000000e+01 -1.037930000000000019e+00 -4.615625000000000000e+01 -1.037935000000000052e+00 -4.615625000000000000e+01 -1.037940000000000085e+00 -4.612500381469726562e+01 -1.037945000000000118e+00 -4.615625000000000000e+01 -1.037950000000000150e+00 -4.618750000000000000e+01 -1.037955000000000183e+00 -4.609375000000000000e+01 -1.037959999999999994e+00 -4.609375000000000000e+01 -1.037965000000000027e+00 -4.609375000000000000e+01 -1.037970000000000059e+00 -4.606250000000000000e+01 -1.037975000000000092e+00 -4.612500381469726562e+01 -1.037980000000000125e+00 -4.606250000000000000e+01 -1.037985000000000158e+00 -4.606250000000000000e+01 -1.037990000000000190e+00 -4.603125000000000000e+01 -1.037995000000000001e+00 -4.609375000000000000e+01 -1.038000000000000034e+00 -4.606250000000000000e+01 -1.038005000000000067e+00 -4.600000000000000000e+01 -1.038010000000000099e+00 -4.606250000000000000e+01 -1.038015000000000132e+00 -4.603125000000000000e+01 -1.038020000000000165e+00 -4.603125000000000000e+01 -1.038024999999999975e+00 -4.609375000000000000e+01 -1.038030000000000008e+00 -4.600000000000000000e+01 -1.038035000000000041e+00 -4.603125000000000000e+01 -1.038040000000000074e+00 -4.606250000000000000e+01 -1.038045000000000107e+00 -4.603125000000000000e+01 -1.038050000000000139e+00 -4.600000000000000000e+01 -1.038055000000000172e+00 -4.603125000000000000e+01 -1.038059999999999983e+00 -4.603125000000000000e+01 -1.038065000000000015e+00 -4.600000000000000000e+01 -1.038070000000000048e+00 -4.606250000000000000e+01 -1.038075000000000081e+00 -4.596875381469726562e+01 -1.038080000000000114e+00 -4.596875381469726562e+01 -1.038085000000000147e+00 -4.596875381469726562e+01 -1.038090000000000179e+00 -4.593750000000000000e+01 -1.038094999999999990e+00 -4.600000000000000000e+01 -1.038100000000000023e+00 -4.603125000000000000e+01 -1.038105000000000055e+00 -4.600000000000000000e+01 -1.038110000000000088e+00 -4.603125000000000000e+01 -1.038115000000000121e+00 -4.593750000000000000e+01 -1.038120000000000154e+00 -4.596875381469726562e+01 -1.038125000000000187e+00 -4.596875381469726562e+01 -1.038129999999999997e+00 -4.593750000000000000e+01 -1.038135000000000030e+00 -4.600000000000000000e+01 -1.038140000000000063e+00 -4.596875381469726562e+01 -1.038145000000000095e+00 -4.593750000000000000e+01 -1.038150000000000128e+00 -4.590625000000000000e+01 -1.038155000000000161e+00 -4.593750000000000000e+01 -1.038160000000000194e+00 -4.596875381469726562e+01 -1.038165000000000004e+00 -4.596875381469726562e+01 -1.038170000000000037e+00 -4.600000000000000000e+01 -1.038175000000000070e+00 -4.596875381469726562e+01 -1.038180000000000103e+00 -4.596875381469726562e+01 -1.038185000000000136e+00 -4.600000000000000000e+01 -1.038190000000000168e+00 -4.596875381469726562e+01 -1.038194999999999979e+00 -4.593750000000000000e+01 -1.038200000000000012e+00 -4.593750000000000000e+01 -1.038205000000000044e+00 -4.596875381469726562e+01 -1.038210000000000077e+00 -4.590625000000000000e+01 -1.038215000000000110e+00 -4.590625000000000000e+01 -1.038220000000000143e+00 -4.593750000000000000e+01 -1.038225000000000176e+00 -4.593750000000000000e+01 -1.038229999999999986e+00 -4.587500000000000000e+01 -1.038235000000000019e+00 -4.584375000000000000e+01 -1.038240000000000052e+00 -4.587500000000000000e+01 -1.038245000000000084e+00 -4.584375000000000000e+01 -1.038250000000000117e+00 -4.593750000000000000e+01 -1.038255000000000150e+00 -4.578125000000000000e+01 -1.038260000000000183e+00 -4.584375000000000000e+01 -1.038264999999999993e+00 -4.584375000000000000e+01 -1.038270000000000026e+00 -4.584375000000000000e+01 -1.038275000000000059e+00 -4.587500000000000000e+01 -1.038280000000000092e+00 -4.581250381469726562e+01 -1.038285000000000124e+00 -4.587500000000000000e+01 -1.038290000000000157e+00 -4.587500000000000000e+01 -1.038295000000000190e+00 -4.584375000000000000e+01 -1.038300000000000001e+00 -4.584375000000000000e+01 -1.038305000000000033e+00 -4.590625000000000000e+01 -1.038310000000000066e+00 -4.581250381469726562e+01 -1.038315000000000099e+00 -4.578125000000000000e+01 -1.038320000000000132e+00 -4.575000000000000000e+01 -1.038325000000000164e+00 -4.581250381469726562e+01 -1.038329999999999975e+00 -4.578125000000000000e+01 -1.038335000000000008e+00 -4.578125000000000000e+01 -1.038340000000000041e+00 -4.578125000000000000e+01 -1.038345000000000073e+00 -4.571875000000000000e+01 -1.038350000000000106e+00 -4.581250381469726562e+01 -1.038355000000000139e+00 -4.571875000000000000e+01 -1.038360000000000172e+00 -4.575000000000000000e+01 -1.038364999999999982e+00 -4.575000000000000000e+01 -1.038370000000000015e+00 -4.578125000000000000e+01 -1.038375000000000048e+00 -4.571875000000000000e+01 -1.038380000000000081e+00 -4.575000000000000000e+01 -1.038385000000000113e+00 -4.571875000000000000e+01 -1.038390000000000146e+00 -4.575000000000000000e+01 -1.038395000000000179e+00 -4.575000000000000000e+01 -1.038399999999999990e+00 -4.578125000000000000e+01 -1.038405000000000022e+00 -4.571875000000000000e+01 -1.038410000000000055e+00 -4.578125000000000000e+01 -1.038415000000000088e+00 -4.575000000000000000e+01 -1.038420000000000121e+00 -4.575000000000000000e+01 -1.038425000000000153e+00 -4.571875000000000000e+01 -1.038430000000000186e+00 -4.571875000000000000e+01 -1.038434999999999997e+00 -4.571875000000000000e+01 -1.038440000000000030e+00 -4.575000000000000000e+01 -1.038445000000000062e+00 -4.571875000000000000e+01 -1.038450000000000095e+00 -4.568750000000000000e+01 -1.038455000000000128e+00 -4.578125000000000000e+01 -1.038460000000000161e+00 -4.568750000000000000e+01 -1.038465000000000193e+00 -4.571875000000000000e+01 -1.038470000000000004e+00 -4.571875000000000000e+01 -1.038475000000000037e+00 -4.568750000000000000e+01 -1.038480000000000070e+00 -4.568750000000000000e+01 -1.038485000000000102e+00 -4.568750000000000000e+01 -1.038490000000000135e+00 -4.565625381469726562e+01 -1.038495000000000168e+00 -4.565625381469726562e+01 -1.038499999999999979e+00 -4.565625381469726562e+01 -1.038505000000000011e+00 -4.565625381469726562e+01 -1.038510000000000044e+00 -4.571875000000000000e+01 -1.038515000000000077e+00 -4.565625381469726562e+01 -1.038520000000000110e+00 -4.565625381469726562e+01 -1.038525000000000142e+00 -4.559375000000000000e+01 -1.038530000000000175e+00 -4.562500000000000000e+01 -1.038534999999999986e+00 -4.559375000000000000e+01 -1.038540000000000019e+00 -4.568750000000000000e+01 -1.038545000000000051e+00 -4.565625381469726562e+01 -1.038550000000000084e+00 -4.568750000000000000e+01 -1.038555000000000117e+00 -4.559375000000000000e+01 -1.038560000000000150e+00 -4.565625381469726562e+01 -1.038565000000000182e+00 -4.562500000000000000e+01 -1.038569999999999993e+00 -4.565625381469726562e+01 -1.038575000000000026e+00 -4.565625381469726562e+01 -1.038580000000000059e+00 -4.559375000000000000e+01 -1.038585000000000091e+00 -4.562500000000000000e+01 -1.038590000000000124e+00 -4.562500000000000000e+01 -1.038595000000000157e+00 -4.562500000000000000e+01 -1.038600000000000190e+00 -4.559375000000000000e+01 -1.038605000000000000e+00 -4.562500000000000000e+01 -1.038610000000000033e+00 -4.565625381469726562e+01 -1.038615000000000066e+00 -4.559375000000000000e+01 -1.038620000000000099e+00 -4.556250381469726562e+01 -1.038625000000000131e+00 -4.556250381469726562e+01 -1.038630000000000164e+00 -4.553125000000000000e+01 -1.038634999999999975e+00 -4.559375000000000000e+01 -1.038640000000000008e+00 -4.553125000000000000e+01 -1.038645000000000040e+00 -4.553125000000000000e+01 -1.038650000000000073e+00 -4.553125000000000000e+01 -1.038655000000000106e+00 -4.550000381469726562e+01 -1.038660000000000139e+00 -4.550000381469726562e+01 -1.038665000000000171e+00 -4.550000381469726562e+01 -1.038669999999999982e+00 -4.550000381469726562e+01 -1.038675000000000015e+00 -4.550000381469726562e+01 -1.038680000000000048e+00 -4.550000381469726562e+01 -1.038685000000000080e+00 -4.546875000000000000e+01 -1.038690000000000113e+00 -4.553125000000000000e+01 -1.038695000000000146e+00 -4.553125000000000000e+01 -1.038700000000000179e+00 -4.550000381469726562e+01 -1.038704999999999989e+00 -4.543750000000000000e+01 -1.038710000000000022e+00 -4.546875000000000000e+01 -1.038715000000000055e+00 -4.546875000000000000e+01 -1.038720000000000088e+00 -4.546875000000000000e+01 -1.038725000000000120e+00 -4.543750000000000000e+01 -1.038730000000000153e+00 -4.543750000000000000e+01 -1.038735000000000186e+00 -4.546875000000000000e+01 -1.038739999999999997e+00 -4.546875000000000000e+01 -1.038745000000000029e+00 -4.543750000000000000e+01 -1.038750000000000062e+00 -4.550000381469726562e+01 -1.038755000000000095e+00 -4.546875000000000000e+01 -1.038760000000000128e+00 -4.550000381469726562e+01 -1.038765000000000160e+00 -4.546875000000000000e+01 -1.038770000000000193e+00 -4.546875000000000000e+01 -1.038775000000000004e+00 -4.543750000000000000e+01 -1.038780000000000037e+00 -4.546875000000000000e+01 -1.038785000000000069e+00 -4.543750000000000000e+01 -1.038790000000000102e+00 -4.534375000000000000e+01 -1.038795000000000135e+00 -4.543750000000000000e+01 -1.038800000000000168e+00 -4.534375000000000000e+01 -1.038804999999999978e+00 -4.540625381469726562e+01 -1.038810000000000011e+00 -4.540625381469726562e+01 -1.038815000000000044e+00 -4.537500000000000000e+01 -1.038820000000000077e+00 -4.537500000000000000e+01 -1.038825000000000109e+00 -4.540625381469726562e+01 -1.038830000000000142e+00 -4.540625381469726562e+01 -1.038835000000000175e+00 -4.540625381469726562e+01 -1.038839999999999986e+00 -4.537500000000000000e+01 -1.038845000000000018e+00 -4.540625381469726562e+01 -1.038850000000000051e+00 -4.540625381469726562e+01 -1.038855000000000084e+00 -4.534375000000000000e+01 -1.038860000000000117e+00 -4.537500000000000000e+01 -1.038865000000000149e+00 -4.528125000000000000e+01 -1.038870000000000182e+00 -4.537500000000000000e+01 -1.038874999999999993e+00 -4.540625381469726562e+01 -1.038880000000000026e+00 -4.537500000000000000e+01 -1.038885000000000058e+00 -4.531250000000000000e+01 -1.038890000000000091e+00 -4.531250000000000000e+01 -1.038895000000000124e+00 -4.531250000000000000e+01 -1.038900000000000157e+00 -4.534375000000000000e+01 -1.038905000000000189e+00 -4.534375000000000000e+01 -1.038910000000000000e+00 -4.531250000000000000e+01 -1.038915000000000033e+00 -4.537500000000000000e+01 -1.038920000000000066e+00 -4.537500000000000000e+01 -1.038925000000000098e+00 -4.534375000000000000e+01 -1.038930000000000131e+00 -4.537500000000000000e+01 -1.038935000000000164e+00 -4.534375000000000000e+01 -1.038939999999999975e+00 -4.534375000000000000e+01 -1.038945000000000007e+00 -4.534375000000000000e+01 -1.038950000000000040e+00 -4.534375000000000000e+01 -1.038955000000000073e+00 -4.531250000000000000e+01 -1.038960000000000106e+00 -4.534375000000000000e+01 -1.038965000000000138e+00 -4.534375000000000000e+01 -1.038970000000000171e+00 -4.531250000000000000e+01 -1.038974999999999982e+00 -4.534375000000000000e+01 -1.038980000000000015e+00 -4.531250000000000000e+01 -1.038985000000000047e+00 -4.525000381469726562e+01 -1.038990000000000080e+00 -4.531250000000000000e+01 -1.038995000000000113e+00 -4.531250000000000000e+01 -1.039000000000000146e+00 -4.518750000000000000e+01 -1.039005000000000178e+00 -4.534375000000000000e+01 -1.039009999999999989e+00 -4.528125000000000000e+01 -1.039015000000000022e+00 -4.528125000000000000e+01 -1.039020000000000055e+00 -4.528125000000000000e+01 -1.039025000000000087e+00 -4.531250000000000000e+01 -1.039030000000000120e+00 -4.525000381469726562e+01 -1.039035000000000153e+00 -4.525000381469726562e+01 -1.039040000000000186e+00 -4.521875000000000000e+01 -1.039044999999999996e+00 -4.521875000000000000e+01 -1.039050000000000029e+00 -4.525000381469726562e+01 -1.039055000000000062e+00 -4.518750000000000000e+01 -1.039060000000000095e+00 -4.521875000000000000e+01 -1.039065000000000127e+00 -4.528125000000000000e+01 -1.039070000000000160e+00 -4.525000381469726562e+01 -1.039075000000000193e+00 -4.521875000000000000e+01 -1.039080000000000004e+00 -4.525000381469726562e+01 -1.039085000000000036e+00 -4.525000381469726562e+01 -1.039090000000000069e+00 -4.521875000000000000e+01 -1.039095000000000102e+00 -4.525000381469726562e+01 -1.039100000000000135e+00 -4.528125000000000000e+01 -1.039105000000000167e+00 -4.525000381469726562e+01 -1.039109999999999978e+00 -4.525000381469726562e+01 -1.039115000000000011e+00 -4.521875000000000000e+01 -1.039120000000000044e+00 -4.521875000000000000e+01 -1.039125000000000076e+00 -4.521875000000000000e+01 -1.039130000000000109e+00 -4.521875000000000000e+01 -1.039135000000000142e+00 -4.518750000000000000e+01 -1.039140000000000175e+00 -4.521875000000000000e+01 -1.039144999999999985e+00 -4.521875000000000000e+01 -1.039150000000000018e+00 -4.518750000000000000e+01 -1.039155000000000051e+00 -4.521875000000000000e+01 -1.039160000000000084e+00 -4.518750000000000000e+01 -1.039165000000000116e+00 -4.521875000000000000e+01 -1.039170000000000149e+00 -4.515625000000000000e+01 -1.039175000000000182e+00 -4.521875000000000000e+01 -1.039179999999999993e+00 -4.515625000000000000e+01 -1.039185000000000025e+00 -4.518750000000000000e+01 -1.039190000000000058e+00 -4.515625000000000000e+01 -1.039195000000000091e+00 -4.512500000000000000e+01 -1.039200000000000124e+00 -4.515625000000000000e+01 -1.039205000000000156e+00 -4.518750000000000000e+01 -1.039210000000000189e+00 -4.515625000000000000e+01 -1.039215000000000000e+00 -4.509375381469726562e+01 -1.039220000000000033e+00 -4.509375381469726562e+01 -1.039225000000000065e+00 -4.509375381469726562e+01 -1.039230000000000098e+00 -4.512500000000000000e+01 -1.039235000000000131e+00 -4.512500000000000000e+01 -1.039240000000000164e+00 -4.509375381469726562e+01 -1.039244999999999974e+00 -4.512500000000000000e+01 -1.039250000000000007e+00 -4.515625000000000000e+01 -1.039255000000000040e+00 -4.509375381469726562e+01 -1.039260000000000073e+00 -4.515625000000000000e+01 -1.039265000000000105e+00 -4.506250000000000000e+01 -1.039270000000000138e+00 -4.509375381469726562e+01 -1.039275000000000171e+00 -4.509375381469726562e+01 -1.039279999999999982e+00 -4.506250000000000000e+01 -1.039285000000000014e+00 -4.506250000000000000e+01 -1.039290000000000047e+00 -4.509375381469726562e+01 -1.039295000000000080e+00 -4.506250000000000000e+01 -1.039300000000000113e+00 -4.512500000000000000e+01 -1.039305000000000145e+00 -4.503125000000000000e+01 -1.039310000000000178e+00 -4.509375381469726562e+01 -1.039314999999999989e+00 -4.509375381469726562e+01 -1.039320000000000022e+00 -4.506250000000000000e+01 -1.039325000000000054e+00 -4.509375381469726562e+01 -1.039330000000000087e+00 -4.503125000000000000e+01 -1.039335000000000120e+00 -4.503125000000000000e+01 -1.039340000000000153e+00 -4.506250000000000000e+01 -1.039345000000000185e+00 -4.506250000000000000e+01 -1.039349999999999996e+00 -4.509375381469726562e+01 -1.039355000000000029e+00 -4.506250000000000000e+01 -1.039360000000000062e+00 -4.506250000000000000e+01 -1.039365000000000094e+00 -4.509375381469726562e+01 -1.039370000000000127e+00 -4.506250000000000000e+01 -1.039375000000000160e+00 -4.509375381469726562e+01 -1.039380000000000193e+00 -4.500000000000000000e+01 -1.039385000000000003e+00 -4.503125000000000000e+01 -1.039390000000000036e+00 -4.500000000000000000e+01 -1.039395000000000069e+00 -4.503125000000000000e+01 -1.039400000000000102e+00 -4.500000000000000000e+01 -1.039405000000000134e+00 -4.503125000000000000e+01 -1.039410000000000167e+00 -4.496875000000000000e+01 -1.039414999999999978e+00 -4.496875000000000000e+01 -1.039420000000000011e+00 -4.500000000000000000e+01 -1.039425000000000043e+00 -4.496875000000000000e+01 -1.039430000000000076e+00 -4.503125000000000000e+01 -1.039435000000000109e+00 -4.500000000000000000e+01 -1.039440000000000142e+00 -4.500000000000000000e+01 -1.039445000000000174e+00 -4.500000000000000000e+01 -1.039449999999999985e+00 -4.496875000000000000e+01 -1.039455000000000018e+00 -4.496875000000000000e+01 -1.039460000000000051e+00 -4.493750381469726562e+01 -1.039465000000000083e+00 -4.500000000000000000e+01 -1.039470000000000116e+00 -4.496875000000000000e+01 -1.039475000000000149e+00 -4.493750381469726562e+01 -1.039480000000000182e+00 -4.493750381469726562e+01 -1.039484999999999992e+00 -4.490625000000000000e+01 -1.039490000000000025e+00 -4.493750381469726562e+01 -1.039495000000000058e+00 -4.493750381469726562e+01 -1.039500000000000091e+00 -4.493750381469726562e+01 -1.039505000000000123e+00 -4.493750381469726562e+01 -1.039510000000000156e+00 -4.496875000000000000e+01 -1.039515000000000189e+00 -4.496875000000000000e+01 -1.039520000000000000e+00 -4.490625000000000000e+01 -1.039525000000000032e+00 -4.487500000000000000e+01 -1.039530000000000065e+00 -4.490625000000000000e+01 -1.039535000000000098e+00 -4.490625000000000000e+01 -1.039540000000000131e+00 -4.493750381469726562e+01 -1.039545000000000163e+00 -4.496875000000000000e+01 -1.039549999999999974e+00 -4.493750381469726562e+01 -1.039555000000000007e+00 -4.490625000000000000e+01 -1.039560000000000040e+00 -4.487500000000000000e+01 -1.039565000000000072e+00 -4.487500000000000000e+01 -1.039570000000000105e+00 -4.487500000000000000e+01 -1.039575000000000138e+00 -4.487500000000000000e+01 -1.039580000000000171e+00 -4.487500000000000000e+01 -1.039584999999999981e+00 -4.484375381469726562e+01 -1.039590000000000014e+00 -4.487500000000000000e+01 -1.039595000000000047e+00 -4.484375381469726562e+01 -1.039600000000000080e+00 -4.481250000000000000e+01 -1.039605000000000112e+00 -4.484375381469726562e+01 -1.039610000000000145e+00 -4.487500000000000000e+01 -1.039615000000000178e+00 -4.490625000000000000e+01 -1.039619999999999989e+00 -4.484375381469726562e+01 -1.039625000000000021e+00 -4.481250000000000000e+01 -1.039630000000000054e+00 -4.478125381469726562e+01 -1.039635000000000087e+00 -4.478125381469726562e+01 -1.039640000000000120e+00 -4.478125381469726562e+01 -1.039645000000000152e+00 -4.475000000000000000e+01 -1.039650000000000185e+00 -4.475000000000000000e+01 -1.039654999999999996e+00 -4.478125381469726562e+01 -1.039660000000000029e+00 -4.475000000000000000e+01 -1.039665000000000061e+00 -4.478125381469726562e+01 -1.039670000000000094e+00 -4.475000000000000000e+01 -1.039675000000000127e+00 -4.478125381469726562e+01 -1.039680000000000160e+00 -4.478125381469726562e+01 -1.039685000000000192e+00 -4.475000000000000000e+01 -1.039690000000000003e+00 -4.478125381469726562e+01 -1.039695000000000036e+00 -4.478125381469726562e+01 -1.039700000000000069e+00 -4.478125381469726562e+01 -1.039705000000000101e+00 -4.471875000000000000e+01 -1.039710000000000134e+00 -4.475000000000000000e+01 -1.039715000000000167e+00 -4.481250000000000000e+01 -1.039719999999999978e+00 -4.478125381469726562e+01 -1.039725000000000010e+00 -4.471875000000000000e+01 -1.039730000000000043e+00 -4.468750381469726562e+01 -1.039735000000000076e+00 -4.475000000000000000e+01 -1.039740000000000109e+00 -4.471875000000000000e+01 -1.039745000000000141e+00 -4.478125381469726562e+01 -1.039750000000000174e+00 -4.468750381469726562e+01 -1.039754999999999985e+00 -4.468750381469726562e+01 -1.039760000000000018e+00 -4.465625000000000000e+01 -1.039765000000000050e+00 -4.468750381469726562e+01 -1.039770000000000083e+00 -4.468750381469726562e+01 -1.039775000000000116e+00 -4.468750381469726562e+01 -1.039780000000000149e+00 -4.468750381469726562e+01 -1.039785000000000181e+00 -4.465625000000000000e+01 -1.039789999999999992e+00 -4.468750381469726562e+01 -1.039795000000000025e+00 -4.471875000000000000e+01 -1.039800000000000058e+00 -4.471875000000000000e+01 -1.039805000000000090e+00 -4.478125381469726562e+01 -1.039810000000000123e+00 -4.465625000000000000e+01 -1.039815000000000156e+00 -4.471875000000000000e+01 -1.039820000000000189e+00 -4.462500000000000000e+01 -1.039824999999999999e+00 -4.456250000000000000e+01 -1.039830000000000032e+00 -4.462500000000000000e+01 -1.039835000000000065e+00 -4.465625000000000000e+01 -1.039840000000000098e+00 -4.459375000000000000e+01 -1.039845000000000130e+00 -4.468750381469726562e+01 -1.039850000000000163e+00 -4.468750381469726562e+01 -1.039855000000000196e+00 -4.468750381469726562e+01 -1.039860000000000007e+00 -4.459375000000000000e+01 -1.039865000000000039e+00 -4.462500000000000000e+01 -1.039870000000000072e+00 -4.471875000000000000e+01 -1.039875000000000105e+00 -4.462500000000000000e+01 -1.039880000000000138e+00 -4.456250000000000000e+01 -1.039885000000000170e+00 -4.462500000000000000e+01 -1.039889999999999981e+00 -4.462500000000000000e+01 -1.039895000000000014e+00 -4.462500000000000000e+01 -1.039900000000000047e+00 -4.465625000000000000e+01 -1.039905000000000079e+00 -4.462500000000000000e+01 -1.039910000000000112e+00 -4.459375000000000000e+01 -1.039915000000000145e+00 -4.465625000000000000e+01 -1.039920000000000178e+00 -4.459375000000000000e+01 -1.039924999999999988e+00 -4.459375000000000000e+01 -1.039930000000000021e+00 -4.456250000000000000e+01 -1.039935000000000054e+00 -4.459375000000000000e+01 -1.039940000000000087e+00 -4.459375000000000000e+01 -1.039945000000000119e+00 -4.462500000000000000e+01 -1.039950000000000152e+00 -4.450000000000000000e+01 -1.039955000000000185e+00 -4.459375000000000000e+01 -1.039959999999999996e+00 -4.456250000000000000e+01 -1.039965000000000028e+00 -4.462500000000000000e+01 -1.039970000000000061e+00 -4.459375000000000000e+01 -1.039975000000000094e+00 -4.462500000000000000e+01 -1.039980000000000127e+00 -4.456250000000000000e+01 -1.039985000000000159e+00 -4.462500000000000000e+01 -1.039990000000000192e+00 -4.456250000000000000e+01 -1.039995000000000003e+00 -4.453125381469726562e+01 -1.040000000000000036e+00 -4.453125381469726562e+01 -1.040005000000000068e+00 -4.453125381469726562e+01 -1.040010000000000101e+00 -4.456250000000000000e+01 -1.040015000000000134e+00 -4.456250000000000000e+01 -1.040020000000000167e+00 -4.456250000000000000e+01 -1.040024999999999977e+00 -4.446875000000000000e+01 -1.040030000000000010e+00 -4.456250000000000000e+01 -1.040035000000000043e+00 -4.446875000000000000e+01 -1.040040000000000076e+00 -4.450000000000000000e+01 -1.040045000000000108e+00 -4.453125381469726562e+01 -1.040050000000000141e+00 -4.450000000000000000e+01 -1.040055000000000174e+00 -4.456250000000000000e+01 -1.040059999999999985e+00 -4.456250000000000000e+01 -1.040065000000000017e+00 -4.453125381469726562e+01 -1.040070000000000050e+00 -4.453125381469726562e+01 -1.040075000000000083e+00 -4.453125381469726562e+01 -1.040080000000000116e+00 -4.453125381469726562e+01 -1.040085000000000148e+00 -4.446875000000000000e+01 -1.040090000000000181e+00 -4.450000000000000000e+01 -1.040094999999999992e+00 -4.453125381469726562e+01 -1.040100000000000025e+00 -4.450000000000000000e+01 -1.040105000000000057e+00 -4.450000000000000000e+01 -1.040110000000000090e+00 -4.446875000000000000e+01 -1.040115000000000123e+00 -4.443750000000000000e+01 -1.040120000000000156e+00 -4.446875000000000000e+01 -1.040125000000000188e+00 -4.443750000000000000e+01 -1.040129999999999999e+00 -4.446875000000000000e+01 -1.040135000000000032e+00 -4.440625000000000000e+01 -1.040140000000000065e+00 -4.443750000000000000e+01 -1.040145000000000097e+00 -4.443750000000000000e+01 -1.040150000000000130e+00 -4.446875000000000000e+01 -1.040155000000000163e+00 -4.437500381469726562e+01 -1.040160000000000196e+00 -4.446875000000000000e+01 -1.040165000000000006e+00 -4.446875000000000000e+01 -1.040170000000000039e+00 -4.443750000000000000e+01 -1.040175000000000072e+00 -4.434375000000000000e+01 -1.040180000000000105e+00 -4.437500381469726562e+01 -1.040185000000000137e+00 -4.437500381469726562e+01 -1.040190000000000170e+00 -4.443750000000000000e+01 -1.040194999999999981e+00 -4.440625000000000000e+01 -1.040200000000000014e+00 -4.437500381469726562e+01 -1.040205000000000046e+00 -4.434375000000000000e+01 -1.040210000000000079e+00 -4.434375000000000000e+01 -1.040215000000000112e+00 -4.440625000000000000e+01 -1.040220000000000145e+00 -4.434375000000000000e+01 -1.040225000000000177e+00 -4.437500381469726562e+01 -1.040229999999999988e+00 -4.431250000000000000e+01 -1.040235000000000021e+00 -4.431250000000000000e+01 -1.040240000000000054e+00 -4.434375000000000000e+01 -1.040245000000000086e+00 -4.437500381469726562e+01 -1.040250000000000119e+00 -4.431250000000000000e+01 -1.040255000000000152e+00 -4.434375000000000000e+01 -1.040260000000000185e+00 -4.428125000000000000e+01 -1.040264999999999995e+00 -4.431250000000000000e+01 -1.040270000000000028e+00 -4.428125000000000000e+01 -1.040275000000000061e+00 -4.431250000000000000e+01 -1.040280000000000094e+00 -4.428125000000000000e+01 -1.040285000000000126e+00 -4.428125000000000000e+01 -1.040290000000000159e+00 -4.428125000000000000e+01 -1.040295000000000192e+00 -4.431250000000000000e+01 -1.040300000000000002e+00 -4.428125000000000000e+01 -1.040305000000000035e+00 -4.425000000000000000e+01 -1.040310000000000068e+00 -4.428125000000000000e+01 -1.040315000000000101e+00 -4.428125000000000000e+01 -1.040320000000000134e+00 -4.428125000000000000e+01 -1.040325000000000166e+00 -4.428125000000000000e+01 -1.040329999999999977e+00 -4.425000000000000000e+01 -1.040335000000000010e+00 -4.431250000000000000e+01 -1.040340000000000042e+00 -4.418750000000000000e+01 -1.040345000000000075e+00 -4.425000000000000000e+01 -1.040350000000000108e+00 -4.425000000000000000e+01 -1.040355000000000141e+00 -4.425000000000000000e+01 -1.040360000000000174e+00 -4.421875381469726562e+01 -1.040364999999999984e+00 -4.421875381469726562e+01 -1.040370000000000017e+00 -4.428125000000000000e+01 -1.040375000000000050e+00 -4.418750000000000000e+01 -1.040380000000000082e+00 -4.415625000000000000e+01 -1.040385000000000115e+00 -4.421875381469726562e+01 -1.040390000000000148e+00 -4.421875381469726562e+01 -1.040395000000000181e+00 -4.421875381469726562e+01 -1.040399999999999991e+00 -4.421875381469726562e+01 -1.040405000000000024e+00 -4.421875381469726562e+01 -1.040410000000000057e+00 -4.428125000000000000e+01 -1.040415000000000090e+00 -4.418750000000000000e+01 -1.040420000000000122e+00 -4.418750000000000000e+01 -1.040425000000000155e+00 -4.412500000000000000e+01 -1.040430000000000188e+00 -4.415625000000000000e+01 -1.040434999999999999e+00 -4.421875381469726562e+01 -1.040440000000000031e+00 -4.421875381469726562e+01 -1.040445000000000064e+00 -4.415625000000000000e+01 -1.040450000000000097e+00 -4.415625000000000000e+01 -1.040455000000000130e+00 -4.418750000000000000e+01 -1.040460000000000163e+00 -4.421875381469726562e+01 -1.040465000000000195e+00 -4.415625000000000000e+01 -1.040470000000000006e+00 -4.415625000000000000e+01 -1.040475000000000039e+00 -4.409375000000000000e+01 -1.040480000000000071e+00 -4.412500000000000000e+01 -1.040485000000000104e+00 -4.406250381469726562e+01 -1.040490000000000137e+00 -4.409375000000000000e+01 -1.040495000000000170e+00 -4.409375000000000000e+01 -1.040499999999999980e+00 -4.412500000000000000e+01 -1.040505000000000013e+00 -4.409375000000000000e+01 -1.040510000000000046e+00 -4.412500000000000000e+01 -1.040515000000000079e+00 -4.403125000000000000e+01 -1.040520000000000111e+00 -4.409375000000000000e+01 -1.040525000000000144e+00 -4.409375000000000000e+01 -1.040530000000000177e+00 -4.406250381469726562e+01 -1.040534999999999988e+00 -4.406250381469726562e+01 -1.040540000000000020e+00 -4.406250381469726562e+01 -1.040545000000000053e+00 -4.409375000000000000e+01 -1.040550000000000086e+00 -4.409375000000000000e+01 -1.040555000000000119e+00 -4.406250381469726562e+01 -1.040560000000000151e+00 -4.403125000000000000e+01 -1.040565000000000184e+00 -4.400000000000000000e+01 -1.040569999999999995e+00 -4.403125000000000000e+01 -1.040575000000000028e+00 -4.400000000000000000e+01 -1.040580000000000060e+00 -4.403125000000000000e+01 -1.040585000000000093e+00 -4.403125000000000000e+01 -1.040590000000000126e+00 -4.400000000000000000e+01 -1.040595000000000159e+00 -4.400000000000000000e+01 -1.040600000000000191e+00 -4.406250381469726562e+01 -1.040605000000000002e+00 -4.400000000000000000e+01 -1.040610000000000035e+00 -4.396875381469726562e+01 -1.040615000000000068e+00 -4.400000000000000000e+01 -1.040620000000000100e+00 -4.406250381469726562e+01 -1.040625000000000133e+00 -4.400000000000000000e+01 -1.040630000000000166e+00 -4.400000000000000000e+01 -1.040634999999999977e+00 -4.403125000000000000e+01 -1.040640000000000009e+00 -4.403125000000000000e+01 -1.040645000000000042e+00 -4.403125000000000000e+01 -1.040650000000000075e+00 -4.406250381469726562e+01 -1.040655000000000108e+00 -4.396875381469726562e+01 -1.040660000000000140e+00 -4.406250381469726562e+01 -1.040665000000000173e+00 -4.403125000000000000e+01 -1.040669999999999984e+00 -4.406250381469726562e+01 -1.040675000000000017e+00 -4.403125000000000000e+01 -1.040680000000000049e+00 -4.400000000000000000e+01 -1.040685000000000082e+00 -4.400000000000000000e+01 -1.040690000000000115e+00 -4.396875381469726562e+01 -1.040695000000000148e+00 -4.400000000000000000e+01 -1.040700000000000180e+00 -4.396875381469726562e+01 -1.040704999999999991e+00 -4.396875381469726562e+01 -1.040710000000000024e+00 -4.396875381469726562e+01 -1.040715000000000057e+00 -4.393750000000000000e+01 -1.040720000000000089e+00 -4.393750000000000000e+01 -1.040725000000000122e+00 -4.393750000000000000e+01 -1.040730000000000155e+00 -4.396875381469726562e+01 -1.040735000000000188e+00 -4.387500000000000000e+01 -1.040739999999999998e+00 -4.390625381469726562e+01 -1.040745000000000031e+00 -4.390625381469726562e+01 -1.040750000000000064e+00 -4.387500000000000000e+01 -1.040755000000000097e+00 -4.396875381469726562e+01 -1.040760000000000129e+00 -4.390625381469726562e+01 -1.040765000000000162e+00 -4.393750000000000000e+01 -1.040770000000000195e+00 -4.393750000000000000e+01 -1.040775000000000006e+00 -4.390625381469726562e+01 -1.040780000000000038e+00 -4.390625381469726562e+01 -1.040785000000000071e+00 -4.393750000000000000e+01 -1.040790000000000104e+00 -4.387500000000000000e+01 -1.040795000000000137e+00 -4.390625381469726562e+01 -1.040800000000000169e+00 -4.384375000000000000e+01 -1.040804999999999980e+00 -4.393750000000000000e+01 -1.040810000000000013e+00 -4.393750000000000000e+01 -1.040815000000000046e+00 -4.387500000000000000e+01 -1.040820000000000078e+00 -4.381250381469726562e+01 -1.040825000000000111e+00 -4.387500000000000000e+01 -1.040830000000000144e+00 -4.384375000000000000e+01 -1.040835000000000177e+00 -4.387500000000000000e+01 -1.040839999999999987e+00 -4.384375000000000000e+01 -1.040845000000000020e+00 -4.384375000000000000e+01 -1.040850000000000053e+00 -4.384375000000000000e+01 -1.040855000000000086e+00 -4.378125000000000000e+01 -1.040860000000000118e+00 -4.390625381469726562e+01 -1.040865000000000151e+00 -4.381250381469726562e+01 -1.040870000000000184e+00 -4.378125000000000000e+01 -1.040874999999999995e+00 -4.378125000000000000e+01 -1.040880000000000027e+00 -4.384375000000000000e+01 -1.040885000000000060e+00 -4.381250381469726562e+01 -1.040890000000000093e+00 -4.378125000000000000e+01 -1.040895000000000126e+00 -4.378125000000000000e+01 -1.040900000000000158e+00 -4.384375000000000000e+01 -1.040905000000000191e+00 -4.381250381469726562e+01 -1.040910000000000002e+00 -4.387500000000000000e+01 -1.040915000000000035e+00 -4.384375000000000000e+01 -1.040920000000000067e+00 -4.381250381469726562e+01 -1.040925000000000100e+00 -4.378125000000000000e+01 -1.040930000000000133e+00 -4.384375000000000000e+01 -1.040935000000000166e+00 -4.378125000000000000e+01 -1.040939999999999976e+00 -4.381250381469726562e+01 -1.040945000000000009e+00 -4.378125000000000000e+01 -1.040950000000000042e+00 -4.378125000000000000e+01 -1.040955000000000075e+00 -4.378125000000000000e+01 -1.040960000000000107e+00 -4.371875000000000000e+01 -1.040965000000000140e+00 -4.375000000000000000e+01 -1.040970000000000173e+00 -4.378125000000000000e+01 -1.040974999999999984e+00 -4.365625381469726562e+01 -1.040980000000000016e+00 -4.368750000000000000e+01 -1.040985000000000049e+00 -4.365625381469726562e+01 -1.040990000000000082e+00 -4.368750000000000000e+01 -1.040995000000000115e+00 -4.371875000000000000e+01 -1.041000000000000147e+00 -4.375000000000000000e+01 -1.041005000000000180e+00 -4.375000000000000000e+01 -1.041009999999999991e+00 -4.371875000000000000e+01 -1.041015000000000024e+00 -4.368750000000000000e+01 -1.041020000000000056e+00 -4.378125000000000000e+01 -1.041025000000000089e+00 -4.368750000000000000e+01 -1.041030000000000122e+00 -4.368750000000000000e+01 -1.041035000000000155e+00 -4.365625381469726562e+01 -1.041040000000000187e+00 -4.371875000000000000e+01 -1.041044999999999998e+00 -4.368750000000000000e+01 -1.041050000000000031e+00 -4.365625381469726562e+01 -1.041055000000000064e+00 -4.371875000000000000e+01 -1.041060000000000096e+00 -4.368750000000000000e+01 -1.041065000000000129e+00 -4.368750000000000000e+01 -1.041070000000000162e+00 -4.371875000000000000e+01 -1.041075000000000195e+00 -4.371875000000000000e+01 -1.041080000000000005e+00 -4.368750000000000000e+01 -1.041085000000000038e+00 -4.365625381469726562e+01 -1.041090000000000071e+00 -4.365625381469726562e+01 -1.041095000000000104e+00 -4.365625381469726562e+01 -1.041100000000000136e+00 -4.368750000000000000e+01 -1.041105000000000169e+00 -4.362500000000000000e+01 -1.041109999999999980e+00 -4.368750000000000000e+01 -1.041115000000000013e+00 -4.362500000000000000e+01 -1.041120000000000045e+00 -4.359375000000000000e+01 -1.041125000000000078e+00 -4.356250000000000000e+01 -1.041130000000000111e+00 -4.365625381469726562e+01 -1.041135000000000144e+00 -4.362500000000000000e+01 -1.041140000000000176e+00 -4.359375000000000000e+01 -1.041144999999999987e+00 -4.365625381469726562e+01 -1.041150000000000020e+00 -4.365625381469726562e+01 -1.041155000000000053e+00 -4.359375000000000000e+01 -1.041160000000000085e+00 -4.356250000000000000e+01 -1.041165000000000118e+00 -4.359375000000000000e+01 -1.041170000000000151e+00 -4.353125000000000000e+01 -1.041175000000000184e+00 -4.356250000000000000e+01 -1.041179999999999994e+00 -4.356250000000000000e+01 -1.041185000000000027e+00 -4.353125000000000000e+01 -1.041190000000000060e+00 -4.359375000000000000e+01 -1.041195000000000093e+00 -4.356250000000000000e+01 -1.041200000000000125e+00 -4.356250000000000000e+01 -1.041205000000000158e+00 -4.353125000000000000e+01 -1.041210000000000191e+00 -4.353125000000000000e+01 -1.041215000000000002e+00 -4.356250000000000000e+01 -1.041220000000000034e+00 -4.350000381469726562e+01 -1.041225000000000067e+00 -4.356250000000000000e+01 -1.041230000000000100e+00 -4.350000381469726562e+01 -1.041235000000000133e+00 -4.353125000000000000e+01 -1.041240000000000165e+00 -4.353125000000000000e+01 -1.041244999999999976e+00 -4.359375000000000000e+01 -1.041250000000000009e+00 -4.353125000000000000e+01 -1.041255000000000042e+00 -4.350000381469726562e+01 -1.041260000000000074e+00 -4.353125000000000000e+01 -1.041265000000000107e+00 -4.353125000000000000e+01 -1.041270000000000140e+00 -4.350000381469726562e+01 -1.041275000000000173e+00 -4.350000381469726562e+01 -1.041279999999999983e+00 -4.346875000000000000e+01 -1.041285000000000016e+00 -4.353125000000000000e+01 -1.041290000000000049e+00 -4.353125000000000000e+01 -1.041295000000000082e+00 -4.346875000000000000e+01 -1.041300000000000114e+00 -4.346875000000000000e+01 -1.041305000000000147e+00 -4.346875000000000000e+01 -1.041310000000000180e+00 -4.350000381469726562e+01 -1.041314999999999991e+00 -4.353125000000000000e+01 -1.041320000000000023e+00 -4.353125000000000000e+01 -1.041325000000000056e+00 -4.353125000000000000e+01 -1.041330000000000089e+00 -4.350000381469726562e+01 -1.041335000000000122e+00 -4.350000381469726562e+01 -1.041340000000000154e+00 -4.343750000000000000e+01 -1.041345000000000187e+00 -4.346875000000000000e+01 -1.041349999999999998e+00 -4.346875000000000000e+01 -1.041355000000000031e+00 -4.337500000000000000e+01 -1.041360000000000063e+00 -4.343750000000000000e+01 -1.041365000000000096e+00 -4.350000381469726562e+01 -1.041370000000000129e+00 -4.346875000000000000e+01 -1.041375000000000162e+00 -4.350000381469726562e+01 -1.041380000000000194e+00 -4.346875000000000000e+01 -1.041385000000000005e+00 -4.346875000000000000e+01 -1.041390000000000038e+00 -4.343750000000000000e+01 -1.041395000000000071e+00 -4.350000381469726562e+01 -1.041400000000000103e+00 -4.350000381469726562e+01 -1.041405000000000136e+00 -4.350000381469726562e+01 -1.041410000000000169e+00 -4.343750000000000000e+01 -1.041414999999999980e+00 -4.340625000000000000e+01 -1.041420000000000012e+00 -4.340625000000000000e+01 -1.041425000000000045e+00 -4.343750000000000000e+01 -1.041430000000000078e+00 -4.340625000000000000e+01 -1.041435000000000111e+00 -4.340625000000000000e+01 -1.041440000000000143e+00 -4.343750000000000000e+01 -1.041445000000000176e+00 -4.337500000000000000e+01 -1.041449999999999987e+00 -4.334375381469726562e+01 -1.041455000000000020e+00 -4.337500000000000000e+01 -1.041460000000000052e+00 -4.331250000000000000e+01 -1.041465000000000085e+00 -4.340625000000000000e+01 -1.041470000000000118e+00 -4.337500000000000000e+01 -1.041475000000000151e+00 -4.337500000000000000e+01 -1.041480000000000183e+00 -4.334375381469726562e+01 -1.041484999999999994e+00 -4.337500000000000000e+01 -1.041490000000000027e+00 -4.334375381469726562e+01 -1.041495000000000060e+00 -4.337500000000000000e+01 -1.041500000000000092e+00 -4.334375381469726562e+01 -1.041505000000000125e+00 -4.340625000000000000e+01 -1.041510000000000158e+00 -4.337500000000000000e+01 -1.041515000000000191e+00 -4.334375381469726562e+01 -1.041520000000000001e+00 -4.331250000000000000e+01 -1.041525000000000034e+00 -4.337500000000000000e+01 -1.041530000000000067e+00 -4.334375381469726562e+01 -1.041535000000000100e+00 -4.328125000000000000e+01 -1.041540000000000132e+00 -4.328125000000000000e+01 -1.041545000000000165e+00 -4.328125000000000000e+01 -1.041549999999999976e+00 -4.321875000000000000e+01 -1.041555000000000009e+00 -4.328125000000000000e+01 -1.041560000000000041e+00 -4.331250000000000000e+01 -1.041565000000000074e+00 -4.328125000000000000e+01 -1.041570000000000107e+00 -4.331250000000000000e+01 -1.041575000000000140e+00 -4.321875000000000000e+01 -1.041580000000000172e+00 -4.328125000000000000e+01 -1.041584999999999983e+00 -4.325000381469726562e+01 -1.041590000000000016e+00 -4.328125000000000000e+01 -1.041595000000000049e+00 -4.328125000000000000e+01 -1.041600000000000081e+00 -4.318750381469726562e+01 -1.041605000000000114e+00 -4.328125000000000000e+01 -1.041610000000000147e+00 -4.328125000000000000e+01 -1.041615000000000180e+00 -4.321875000000000000e+01 -1.041619999999999990e+00 -4.318750381469726562e+01 -1.041625000000000023e+00 -4.318750381469726562e+01 -1.041630000000000056e+00 -4.331250000000000000e+01 -1.041635000000000089e+00 -4.318750381469726562e+01 -1.041640000000000121e+00 -4.321875000000000000e+01 -1.041645000000000154e+00 -4.321875000000000000e+01 -1.041650000000000187e+00 -4.325000381469726562e+01 -1.041654999999999998e+00 -4.321875000000000000e+01 -1.041660000000000030e+00 -4.321875000000000000e+01 -1.041665000000000063e+00 -4.325000381469726562e+01 -1.041670000000000096e+00 -4.315625000000000000e+01 -1.041675000000000129e+00 -4.321875000000000000e+01 -1.041680000000000161e+00 -4.315625000000000000e+01 -1.041685000000000194e+00 -4.315625000000000000e+01 -1.041690000000000005e+00 -4.318750381469726562e+01 -1.041695000000000038e+00 -4.321875000000000000e+01 -1.041700000000000070e+00 -4.321875000000000000e+01 -1.041705000000000103e+00 -4.318750381469726562e+01 -1.041710000000000136e+00 -4.318750381469726562e+01 -1.041715000000000169e+00 -4.318750381469726562e+01 -1.041719999999999979e+00 -4.321875000000000000e+01 -1.041725000000000012e+00 -4.318750381469726562e+01 -1.041730000000000045e+00 -4.318750381469726562e+01 -1.041735000000000078e+00 -4.315625000000000000e+01 -1.041740000000000110e+00 -4.318750381469726562e+01 -1.041745000000000143e+00 -4.318750381469726562e+01 -1.041750000000000176e+00 -4.315625000000000000e+01 -1.041754999999999987e+00 -4.318750381469726562e+01 -1.041760000000000019e+00 -4.309375381469726562e+01 -1.041765000000000052e+00 -4.315625000000000000e+01 -1.041770000000000085e+00 -4.315625000000000000e+01 -1.041775000000000118e+00 -4.312500000000000000e+01 -1.041780000000000150e+00 -4.315625000000000000e+01 -1.041785000000000183e+00 -4.312500000000000000e+01 -1.041789999999999994e+00 -4.309375381469726562e+01 -1.041795000000000027e+00 -4.306250000000000000e+01 -1.041800000000000059e+00 -4.315625000000000000e+01 -1.041805000000000092e+00 -4.309375381469726562e+01 -1.041810000000000125e+00 -4.312500000000000000e+01 -1.041815000000000158e+00 -4.309375381469726562e+01 -1.041820000000000190e+00 -4.309375381469726562e+01 -1.041825000000000001e+00 -4.309375381469726562e+01 -1.041830000000000034e+00 -4.306250000000000000e+01 -1.041835000000000067e+00 -4.303125000000000000e+01 -1.041840000000000099e+00 -4.315625000000000000e+01 -1.041845000000000132e+00 -4.306250000000000000e+01 -1.041850000000000165e+00 -4.306250000000000000e+01 -1.041854999999999976e+00 -4.312500000000000000e+01 -1.041860000000000008e+00 -4.306250000000000000e+01 -1.041865000000000041e+00 -4.306250000000000000e+01 -1.041870000000000074e+00 -4.303125000000000000e+01 -1.041875000000000107e+00 -4.300000000000000000e+01 -1.041880000000000139e+00 -4.300000000000000000e+01 -1.041885000000000172e+00 -4.300000000000000000e+01 -1.041889999999999983e+00 -4.300000000000000000e+01 -1.041895000000000016e+00 -4.300000000000000000e+01 -1.041900000000000048e+00 -4.300000000000000000e+01 -1.041905000000000081e+00 -4.293750381469726562e+01 -1.041910000000000114e+00 -4.300000000000000000e+01 -1.041915000000000147e+00 -4.300000000000000000e+01 -1.041920000000000179e+00 -4.296875000000000000e+01 -1.041924999999999990e+00 -4.296875000000000000e+01 -1.041930000000000023e+00 -4.296875000000000000e+01 -1.041935000000000056e+00 -4.296875000000000000e+01 -1.041940000000000088e+00 -4.300000000000000000e+01 -1.041945000000000121e+00 -4.300000000000000000e+01 -1.041950000000000154e+00 -4.303125000000000000e+01 -1.041955000000000187e+00 -4.296875000000000000e+01 -1.041959999999999997e+00 -4.300000000000000000e+01 -1.041965000000000030e+00 -4.296875000000000000e+01 -1.041970000000000063e+00 -4.300000000000000000e+01 -1.041975000000000096e+00 -4.293750381469726562e+01 -1.041980000000000128e+00 -4.300000000000000000e+01 -1.041985000000000161e+00 -4.290625000000000000e+01 -1.041990000000000194e+00 -4.300000000000000000e+01 -1.041995000000000005e+00 -4.293750381469726562e+01 -1.042000000000000037e+00 -4.296875000000000000e+01 -1.042005000000000070e+00 -4.290625000000000000e+01 -1.042010000000000103e+00 -4.290625000000000000e+01 -1.042015000000000136e+00 -4.293750381469726562e+01 -1.042020000000000168e+00 -4.287500000000000000e+01 -1.042024999999999979e+00 -4.293750381469726562e+01 -1.042030000000000012e+00 -4.287500000000000000e+01 -1.042035000000000045e+00 -4.290625000000000000e+01 -1.042040000000000077e+00 -4.290625000000000000e+01 -1.042045000000000110e+00 -4.284375000000000000e+01 -1.042050000000000143e+00 -4.284375000000000000e+01 -1.042055000000000176e+00 -4.290625000000000000e+01 -1.042059999999999986e+00 -4.290625000000000000e+01 -1.042065000000000019e+00 -4.287500000000000000e+01 -1.042070000000000052e+00 -4.284375000000000000e+01 -1.042075000000000085e+00 -4.287500000000000000e+01 -1.042080000000000117e+00 -4.281250000000000000e+01 -1.042085000000000150e+00 -4.281250000000000000e+01 -1.042090000000000183e+00 -4.284375000000000000e+01 -1.042094999999999994e+00 -4.281250000000000000e+01 -1.042100000000000026e+00 -4.281250000000000000e+01 -1.042105000000000059e+00 -4.284375000000000000e+01 -1.042110000000000092e+00 -4.290625000000000000e+01 -1.042115000000000125e+00 -4.281250000000000000e+01 -1.042120000000000157e+00 -4.284375000000000000e+01 -1.042125000000000190e+00 -4.278125381469726562e+01 -1.042130000000000001e+00 -4.284375000000000000e+01 -1.042135000000000034e+00 -4.284375000000000000e+01 -1.042140000000000066e+00 -4.278125381469726562e+01 -1.042145000000000099e+00 -4.278125381469726562e+01 -1.042150000000000132e+00 -4.284375000000000000e+01 -1.042155000000000165e+00 -4.278125381469726562e+01 -1.042159999999999975e+00 -4.275000000000000000e+01 -1.042165000000000008e+00 -4.268750000000000000e+01 -1.042170000000000041e+00 -4.278125381469726562e+01 -1.042175000000000074e+00 -4.271875000000000000e+01 -1.042180000000000106e+00 -4.275000000000000000e+01 -1.042185000000000139e+00 -4.271875000000000000e+01 -1.042190000000000172e+00 -4.275000000000000000e+01 -1.042194999999999983e+00 -4.278125381469726562e+01 -1.042200000000000015e+00 -4.275000000000000000e+01 -1.042205000000000048e+00 -4.278125381469726562e+01 -1.042210000000000081e+00 -4.278125381469726562e+01 -1.042215000000000114e+00 -4.278125381469726562e+01 -1.042220000000000146e+00 -4.271875000000000000e+01 -1.042225000000000179e+00 -4.271875000000000000e+01 -1.042229999999999990e+00 -4.268750000000000000e+01 -1.042235000000000023e+00 -4.271875000000000000e+01 -1.042240000000000055e+00 -4.275000000000000000e+01 -1.042245000000000088e+00 -4.271875000000000000e+01 -1.042250000000000121e+00 -4.265625000000000000e+01 -1.042255000000000154e+00 -4.271875000000000000e+01 -1.042260000000000186e+00 -4.271875000000000000e+01 -1.042264999999999997e+00 -4.265625000000000000e+01 -1.042270000000000030e+00 -4.268750000000000000e+01 -1.042275000000000063e+00 -4.271875000000000000e+01 -1.042280000000000095e+00 -4.271875000000000000e+01 -1.042285000000000128e+00 -4.268750000000000000e+01 -1.042290000000000161e+00 -4.268750000000000000e+01 -1.042295000000000194e+00 -4.271875000000000000e+01 -1.042300000000000004e+00 -4.265625000000000000e+01 -1.042305000000000037e+00 -4.268750000000000000e+01 -1.042310000000000070e+00 -4.265625000000000000e+01 -1.042315000000000103e+00 -4.268750000000000000e+01 -1.042320000000000135e+00 -4.268750000000000000e+01 -1.042325000000000168e+00 -4.265625000000000000e+01 -1.042329999999999979e+00 -4.265625000000000000e+01 -1.042335000000000012e+00 -4.271875000000000000e+01 -1.042340000000000044e+00 -4.265625000000000000e+01 -1.042345000000000077e+00 -4.271875000000000000e+01 -1.042350000000000110e+00 -4.265625000000000000e+01 -1.042355000000000143e+00 -4.265625000000000000e+01 -1.042360000000000175e+00 -4.268750000000000000e+01 -1.042364999999999986e+00 -4.268750000000000000e+01 -1.042370000000000019e+00 -4.265625000000000000e+01 -1.042375000000000052e+00 -4.262500381469726562e+01 -1.042380000000000084e+00 -4.262500381469726562e+01 -1.042385000000000117e+00 -4.262500381469726562e+01 -1.042390000000000150e+00 -4.268750000000000000e+01 -1.042395000000000183e+00 -4.256250000000000000e+01 -1.042399999999999993e+00 -4.259375000000000000e+01 -1.042405000000000026e+00 -4.262500381469726562e+01 -1.042410000000000059e+00 -4.262500381469726562e+01 -1.042415000000000092e+00 -4.262500381469726562e+01 -1.042420000000000124e+00 -4.259375000000000000e+01 -1.042425000000000157e+00 -4.259375000000000000e+01 -1.042430000000000190e+00 -4.259375000000000000e+01 -1.042435000000000000e+00 -4.265625000000000000e+01 -1.042440000000000033e+00 -4.259375000000000000e+01 -1.042445000000000066e+00 -4.253125000000000000e+01 -1.042450000000000099e+00 -4.259375000000000000e+01 -1.042455000000000132e+00 -4.262500381469726562e+01 -1.042460000000000164e+00 -4.256250000000000000e+01 -1.042464999999999975e+00 -4.259375000000000000e+01 -1.042470000000000008e+00 -4.259375000000000000e+01 -1.042475000000000041e+00 -4.256250000000000000e+01 -1.042480000000000073e+00 -4.250000000000000000e+01 -1.042485000000000106e+00 -4.250000000000000000e+01 -1.042490000000000139e+00 -4.250000000000000000e+01 -1.042495000000000172e+00 -4.253125000000000000e+01 -1.042499999999999982e+00 -4.253125000000000000e+01 -1.042505000000000015e+00 -4.253125000000000000e+01 -1.042510000000000048e+00 -4.246875381469726562e+01 -1.042515000000000081e+00 -4.250000000000000000e+01 -1.042520000000000113e+00 -4.246875381469726562e+01 -1.042525000000000146e+00 -4.250000000000000000e+01 -1.042530000000000179e+00 -4.243750000000000000e+01 -1.042534999999999989e+00 -4.250000000000000000e+01 -1.042540000000000022e+00 -4.246875381469726562e+01 -1.042545000000000055e+00 -4.250000000000000000e+01 -1.042550000000000088e+00 -4.246875381469726562e+01 -1.042555000000000121e+00 -4.250000000000000000e+01 -1.042560000000000153e+00 -4.243750000000000000e+01 -1.042565000000000186e+00 -4.240625000000000000e+01 -1.042569999999999997e+00 -4.243750000000000000e+01 -1.042575000000000029e+00 -4.240625000000000000e+01 -1.042580000000000062e+00 -4.243750000000000000e+01 -1.042585000000000095e+00 -4.234375000000000000e+01 -1.042590000000000128e+00 -4.243750000000000000e+01 -1.042595000000000161e+00 -4.243750000000000000e+01 -1.042600000000000193e+00 -4.240625000000000000e+01 -1.042605000000000004e+00 -4.240625000000000000e+01 -1.042610000000000037e+00 -4.234375000000000000e+01 -1.042615000000000069e+00 -4.243750000000000000e+01 -1.042620000000000102e+00 -4.237500381469726562e+01 -1.042625000000000135e+00 -4.240625000000000000e+01 -1.042630000000000168e+00 -4.237500381469726562e+01 -1.042634999999999978e+00 -4.234375000000000000e+01 -1.042640000000000011e+00 -4.240625000000000000e+01 -1.042645000000000044e+00 -4.234375000000000000e+01 -1.042650000000000077e+00 -4.240625000000000000e+01 -1.042655000000000109e+00 -4.231250000000000000e+01 -1.042660000000000142e+00 -4.237500381469726562e+01 -1.042665000000000175e+00 -4.231250000000000000e+01 -1.042669999999999986e+00 -4.240625000000000000e+01 -1.042675000000000018e+00 -4.237500381469726562e+01 -1.042680000000000051e+00 -4.240625000000000000e+01 -1.042685000000000084e+00 -4.234375000000000000e+01 -1.042690000000000117e+00 -4.234375000000000000e+01 -1.042695000000000149e+00 -4.234375000000000000e+01 -1.042700000000000182e+00 -4.231250000000000000e+01 -1.042704999999999993e+00 -4.228125000000000000e+01 -1.042710000000000026e+00 -4.231250000000000000e+01 -1.042715000000000058e+00 -4.228125000000000000e+01 -1.042720000000000091e+00 -4.228125000000000000e+01 -1.042725000000000124e+00 -4.234375000000000000e+01 -1.042730000000000157e+00 -4.228125000000000000e+01 -1.042735000000000190e+00 -4.228125000000000000e+01 -1.042740000000000000e+00 -4.218750000000000000e+01 -1.042745000000000033e+00 -4.221875381469726562e+01 -1.042750000000000066e+00 -4.221875381469726562e+01 -1.042755000000000098e+00 -4.228125000000000000e+01 -1.042760000000000131e+00 -4.221875381469726562e+01 -1.042765000000000164e+00 -4.225000000000000000e+01 -1.042769999999999975e+00 -4.221875381469726562e+01 -1.042775000000000007e+00 -4.218750000000000000e+01 -1.042780000000000040e+00 -4.225000000000000000e+01 -1.042785000000000073e+00 -4.221875381469726562e+01 -1.042790000000000106e+00 -4.225000000000000000e+01 -1.042795000000000138e+00 -4.218750000000000000e+01 -1.042800000000000171e+00 -4.225000000000000000e+01 -1.042804999999999982e+00 -4.218750000000000000e+01 -1.042810000000000015e+00 -4.221875381469726562e+01 -1.042815000000000047e+00 -4.218750000000000000e+01 -1.042820000000000080e+00 -4.218750000000000000e+01 -1.042825000000000113e+00 -4.221875381469726562e+01 -1.042830000000000146e+00 -4.215625000000000000e+01 -1.042835000000000178e+00 -4.215625000000000000e+01 -1.042839999999999989e+00 -4.218750000000000000e+01 -1.042845000000000022e+00 -4.215625000000000000e+01 -1.042850000000000055e+00 -4.215625000000000000e+01 -1.042855000000000087e+00 -4.209375000000000000e+01 -1.042860000000000120e+00 -4.209375000000000000e+01 -1.042865000000000153e+00 -4.212500000000000000e+01 -1.042870000000000186e+00 -4.215625000000000000e+01 -1.042874999999999996e+00 -4.209375000000000000e+01 -1.042880000000000029e+00 -4.206250381469726562e+01 -1.042885000000000062e+00 -4.206250381469726562e+01 -1.042890000000000095e+00 -4.209375000000000000e+01 -1.042895000000000127e+00 -4.209375000000000000e+01 -1.042900000000000160e+00 -4.209375000000000000e+01 -1.042905000000000193e+00 -4.209375000000000000e+01 -1.042910000000000004e+00 -4.206250381469726562e+01 -1.042915000000000036e+00 -4.206250381469726562e+01 -1.042920000000000069e+00 -4.209375000000000000e+01 -1.042925000000000102e+00 -4.206250381469726562e+01 -1.042930000000000135e+00 -4.206250381469726562e+01 -1.042935000000000167e+00 -4.209375000000000000e+01 -1.042939999999999978e+00 -4.209375000000000000e+01 -1.042945000000000011e+00 -4.203125000000000000e+01 -1.042950000000000044e+00 -4.209375000000000000e+01 -1.042955000000000076e+00 -4.203125000000000000e+01 -1.042960000000000109e+00 -4.209375000000000000e+01 -1.042965000000000142e+00 -4.212500000000000000e+01 -1.042970000000000175e+00 -4.203125000000000000e+01 -1.042974999999999985e+00 -4.203125000000000000e+01 -1.042980000000000018e+00 -4.206250381469726562e+01 -1.042985000000000051e+00 -4.203125000000000000e+01 -1.042990000000000084e+00 -4.206250381469726562e+01 -1.042995000000000116e+00 -4.203125000000000000e+01 -1.043000000000000149e+00 -4.200000000000000000e+01 -1.043005000000000182e+00 -4.200000000000000000e+01 -1.043009999999999993e+00 -4.203125000000000000e+01 -1.043015000000000025e+00 -4.203125000000000000e+01 -1.043020000000000058e+00 -4.196875000000000000e+01 -1.043025000000000091e+00 -4.203125000000000000e+01 -1.043030000000000124e+00 -4.200000000000000000e+01 -1.043035000000000156e+00 -4.200000000000000000e+01 -1.043040000000000189e+00 -4.196875000000000000e+01 -1.043045000000000000e+00 -4.196875000000000000e+01 -1.043050000000000033e+00 -4.200000000000000000e+01 -1.043055000000000065e+00 -4.193750000000000000e+01 -1.043060000000000098e+00 -4.196875000000000000e+01 -1.043065000000000131e+00 -4.196875000000000000e+01 -1.043070000000000164e+00 -4.196875000000000000e+01 -1.043074999999999974e+00 -4.196875000000000000e+01 -1.043080000000000007e+00 -4.193750000000000000e+01 -1.043085000000000040e+00 -4.190625381469726562e+01 -1.043090000000000073e+00 -4.196875000000000000e+01 -1.043095000000000105e+00 -4.193750000000000000e+01 -1.043100000000000138e+00 -4.193750000000000000e+01 -1.043105000000000171e+00 -4.193750000000000000e+01 -1.043109999999999982e+00 -4.193750000000000000e+01 -1.043115000000000014e+00 -4.196875000000000000e+01 -1.043120000000000047e+00 -4.193750000000000000e+01 -1.043125000000000080e+00 -4.196875000000000000e+01 -1.043130000000000113e+00 -4.196875000000000000e+01 -1.043135000000000145e+00 -4.200000000000000000e+01 -1.043140000000000178e+00 -4.193750000000000000e+01 -1.043144999999999989e+00 -4.193750000000000000e+01 -1.043150000000000022e+00 -4.196875000000000000e+01 -1.043155000000000054e+00 -4.196875000000000000e+01 -1.043160000000000087e+00 -4.190625381469726562e+01 -1.043165000000000120e+00 -4.193750000000000000e+01 -1.043170000000000153e+00 -4.193750000000000000e+01 -1.043175000000000185e+00 -4.196875000000000000e+01 -1.043179999999999996e+00 -4.193750000000000000e+01 -1.043185000000000029e+00 -4.196875000000000000e+01 -1.043190000000000062e+00 -4.190625381469726562e+01 -1.043195000000000094e+00 -4.190625381469726562e+01 -1.043200000000000127e+00 -4.200000000000000000e+01 -1.043205000000000160e+00 -4.193750000000000000e+01 -1.043210000000000193e+00 -4.193750000000000000e+01 -1.043215000000000003e+00 -4.193750000000000000e+01 -1.043220000000000036e+00 -4.196875000000000000e+01 -1.043225000000000069e+00 -4.187500000000000000e+01 -1.043230000000000102e+00 -4.187500000000000000e+01 -1.043235000000000134e+00 -4.187500000000000000e+01 -1.043240000000000167e+00 -4.187500000000000000e+01 -1.043244999999999978e+00 -4.181250000000000000e+01 -1.043250000000000011e+00 -4.181250000000000000e+01 -1.043255000000000043e+00 -4.187500000000000000e+01 -1.043260000000000076e+00 -4.184375000000000000e+01 -1.043265000000000109e+00 -4.184375000000000000e+01 -1.043270000000000142e+00 -4.184375000000000000e+01 -1.043275000000000174e+00 -4.187500000000000000e+01 -1.043279999999999985e+00 -4.190625381469726562e+01 -1.043285000000000018e+00 -4.181250000000000000e+01 -1.043290000000000051e+00 -4.184375000000000000e+01 -1.043295000000000083e+00 -4.181250000000000000e+01 -1.043300000000000116e+00 -4.178125000000000000e+01 -1.043305000000000149e+00 -4.171875000000000000e+01 -1.043310000000000182e+00 -4.178125000000000000e+01 -1.043314999999999992e+00 -4.178125000000000000e+01 -1.043320000000000025e+00 -4.175000381469726562e+01 -1.043325000000000058e+00 -4.178125000000000000e+01 -1.043330000000000091e+00 -4.178125000000000000e+01 -1.043335000000000123e+00 -4.181250000000000000e+01 -1.043340000000000156e+00 -4.175000381469726562e+01 -1.043345000000000189e+00 -4.171875000000000000e+01 -1.043350000000000000e+00 -4.181250000000000000e+01 -1.043355000000000032e+00 -4.178125000000000000e+01 -1.043360000000000065e+00 -4.171875000000000000e+01 -1.043365000000000098e+00 -4.178125000000000000e+01 -1.043370000000000131e+00 -4.171875000000000000e+01 -1.043375000000000163e+00 -4.175000381469726562e+01 -1.043380000000000196e+00 -4.171875000000000000e+01 -1.043385000000000007e+00 -4.175000381469726562e+01 -1.043390000000000040e+00 -4.168750000000000000e+01 -1.043395000000000072e+00 -4.171875000000000000e+01 -1.043400000000000105e+00 -4.171875000000000000e+01 -1.043405000000000138e+00 -4.168750000000000000e+01 -1.043410000000000171e+00 -4.168750000000000000e+01 -1.043414999999999981e+00 -4.168750000000000000e+01 -1.043420000000000014e+00 -4.168750000000000000e+01 -1.043425000000000047e+00 -4.171875000000000000e+01 -1.043430000000000080e+00 -4.171875000000000000e+01 -1.043435000000000112e+00 -4.171875000000000000e+01 -1.043440000000000145e+00 -4.168750000000000000e+01 -1.043445000000000178e+00 -4.168750000000000000e+01 -1.043449999999999989e+00 -4.165625381469726562e+01 -1.043455000000000021e+00 -4.168750000000000000e+01 -1.043460000000000054e+00 -4.162500000000000000e+01 -1.043465000000000087e+00 -4.162500000000000000e+01 -1.043470000000000120e+00 -4.168750000000000000e+01 -1.043475000000000152e+00 -4.165625381469726562e+01 -1.043480000000000185e+00 -4.162500000000000000e+01 -1.043484999999999996e+00 -4.162500000000000000e+01 -1.043490000000000029e+00 -4.159375000000000000e+01 -1.043495000000000061e+00 -4.159375000000000000e+01 -1.043500000000000094e+00 -4.156250000000000000e+01 -1.043505000000000127e+00 -4.159375000000000000e+01 -1.043510000000000160e+00 -4.156250000000000000e+01 -1.043515000000000192e+00 -4.159375000000000000e+01 -1.043520000000000003e+00 -4.162500000000000000e+01 -1.043525000000000036e+00 -4.153125000000000000e+01 -1.043530000000000069e+00 -4.165625381469726562e+01 -1.043535000000000101e+00 -4.159375000000000000e+01 -1.043540000000000134e+00 -4.156250000000000000e+01 -1.043545000000000167e+00 -4.153125000000000000e+01 -1.043549999999999978e+00 -4.153125000000000000e+01 -1.043555000000000010e+00 -4.159375000000000000e+01 -1.043560000000000043e+00 -4.156250000000000000e+01 -1.043565000000000076e+00 -4.150000381469726562e+01 -1.043570000000000109e+00 -4.150000381469726562e+01 -1.043575000000000141e+00 -4.150000381469726562e+01 -1.043580000000000174e+00 -4.153125000000000000e+01 -1.043584999999999985e+00 -4.150000381469726562e+01 -1.043590000000000018e+00 -4.150000381469726562e+01 -1.043595000000000050e+00 -4.150000381469726562e+01 -1.043600000000000083e+00 -4.150000381469726562e+01 -1.043605000000000116e+00 -4.150000381469726562e+01 -1.043610000000000149e+00 -4.150000381469726562e+01 -1.043615000000000181e+00 -4.143750000000000000e+01 -1.043619999999999992e+00 -4.146875000000000000e+01 -1.043625000000000025e+00 -4.146875000000000000e+01 -1.043630000000000058e+00 -4.143750000000000000e+01 -1.043635000000000090e+00 -4.143750000000000000e+01 -1.043640000000000123e+00 -4.150000381469726562e+01 -1.043645000000000156e+00 -4.143750000000000000e+01 -1.043650000000000189e+00 -4.146875000000000000e+01 -1.043654999999999999e+00 -4.143750000000000000e+01 -1.043660000000000032e+00 -4.150000381469726562e+01 -1.043665000000000065e+00 -4.143750000000000000e+01 -1.043670000000000098e+00 -4.150000381469726562e+01 -1.043675000000000130e+00 -4.150000381469726562e+01 -1.043680000000000163e+00 -4.146875000000000000e+01 -1.043685000000000196e+00 -4.150000381469726562e+01 -1.043690000000000007e+00 -4.143750000000000000e+01 -1.043695000000000039e+00 -4.153125000000000000e+01 -1.043700000000000072e+00 -4.146875000000000000e+01 -1.043705000000000105e+00 -4.143750000000000000e+01 -1.043710000000000138e+00 -4.146875000000000000e+01 -1.043715000000000170e+00 -4.146875000000000000e+01 -1.043719999999999981e+00 -4.143750000000000000e+01 -1.043725000000000014e+00 -4.143750000000000000e+01 -1.043730000000000047e+00 -4.146875000000000000e+01 -1.043735000000000079e+00 -4.146875000000000000e+01 -1.043740000000000112e+00 -4.146875000000000000e+01 -1.043745000000000145e+00 -4.143750000000000000e+01 -1.043750000000000178e+00 -4.150000381469726562e+01 -1.043754999999999988e+00 -4.146875000000000000e+01 -1.043760000000000021e+00 -4.146875000000000000e+01 -1.043765000000000054e+00 -4.146875000000000000e+01 -1.043770000000000087e+00 -4.140625000000000000e+01 -1.043775000000000119e+00 -4.140625000000000000e+01 -1.043780000000000152e+00 -4.137500000000000000e+01 -1.043785000000000185e+00 -4.137500000000000000e+01 -1.043789999999999996e+00 -4.137500000000000000e+01 -1.043795000000000028e+00 -4.140625000000000000e+01 -1.043800000000000061e+00 -4.140625000000000000e+01 -1.043805000000000094e+00 -4.137500000000000000e+01 -1.043810000000000127e+00 -4.140625000000000000e+01 -1.043815000000000159e+00 -4.137500000000000000e+01 -1.043820000000000192e+00 -4.140625000000000000e+01 -1.043825000000000003e+00 -4.137500000000000000e+01 -1.043830000000000036e+00 -4.140625000000000000e+01 -1.043835000000000068e+00 -4.140625000000000000e+01 -1.043840000000000101e+00 -4.137500000000000000e+01 -1.043845000000000134e+00 -4.134375381469726562e+01 -1.043850000000000167e+00 -4.134375381469726562e+01 -1.043854999999999977e+00 -4.140625000000000000e+01 -1.043860000000000010e+00 -4.134375381469726562e+01 -1.043865000000000043e+00 -4.137500000000000000e+01 -1.043870000000000076e+00 -4.134375381469726562e+01 -1.043875000000000108e+00 -4.137500000000000000e+01 -1.043880000000000141e+00 -4.137500000000000000e+01 -1.043885000000000174e+00 -4.134375381469726562e+01 -1.043889999999999985e+00 -4.137500000000000000e+01 -1.043895000000000017e+00 -4.131250000000000000e+01 -1.043900000000000050e+00 -4.137500000000000000e+01 -1.043905000000000083e+00 -4.137500000000000000e+01 -1.043910000000000116e+00 -4.131250000000000000e+01 -1.043915000000000148e+00 -4.134375381469726562e+01 -1.043920000000000181e+00 -4.131250000000000000e+01 -1.043924999999999992e+00 -4.131250000000000000e+01 -1.043930000000000025e+00 -4.134375381469726562e+01 -1.043935000000000057e+00 -4.140625000000000000e+01 -1.043940000000000090e+00 -4.131250000000000000e+01 -1.043945000000000123e+00 -4.137500000000000000e+01 -1.043950000000000156e+00 -4.134375381469726562e+01 -1.043955000000000188e+00 -4.134375381469726562e+01 -1.043959999999999999e+00 -4.131250000000000000e+01 -1.043965000000000032e+00 -4.131250000000000000e+01 -1.043970000000000065e+00 -4.131250000000000000e+01 -1.043975000000000097e+00 -4.128125000000000000e+01 -1.043980000000000130e+00 -4.134375381469726562e+01 -1.043985000000000163e+00 -4.128125000000000000e+01 -1.043990000000000196e+00 -4.131250000000000000e+01 -1.043995000000000006e+00 -4.131250000000000000e+01 -1.044000000000000039e+00 -4.128125000000000000e+01 -1.044005000000000072e+00 -4.125000000000000000e+01 -1.044010000000000105e+00 -4.128125000000000000e+01 -1.044015000000000137e+00 -4.125000000000000000e+01 -1.044020000000000170e+00 -4.128125000000000000e+01 -1.044024999999999981e+00 -4.134375381469726562e+01 -1.044030000000000014e+00 -4.125000000000000000e+01 -1.044035000000000046e+00 -4.128125000000000000e+01 -1.044040000000000079e+00 -4.118750381469726562e+01 -1.044045000000000112e+00 -4.125000000000000000e+01 -1.044050000000000145e+00 -4.121875000000000000e+01 -1.044055000000000177e+00 -4.128125000000000000e+01 -1.044059999999999988e+00 -4.121875000000000000e+01 -1.044065000000000021e+00 -4.118750381469726562e+01 -1.044070000000000054e+00 -4.121875000000000000e+01 -1.044075000000000086e+00 -4.118750381469726562e+01 -1.044080000000000119e+00 -4.112500000000000000e+01 -1.044085000000000152e+00 -4.118750381469726562e+01 -1.044090000000000185e+00 -4.115625000000000000e+01 -1.044094999999999995e+00 -4.115625000000000000e+01 -1.044100000000000028e+00 -4.121875000000000000e+01 -1.044105000000000061e+00 -4.112500000000000000e+01 -1.044110000000000094e+00 -4.115625000000000000e+01 -1.044115000000000126e+00 -4.118750381469726562e+01 -1.044120000000000159e+00 -4.115625000000000000e+01 -1.044125000000000192e+00 -4.115625000000000000e+01 -1.044130000000000003e+00 -4.118750381469726562e+01 -1.044135000000000035e+00 -4.121875000000000000e+01 -1.044140000000000068e+00 -4.112500000000000000e+01 -1.044145000000000101e+00 -4.118750381469726562e+01 -1.044150000000000134e+00 -4.115625000000000000e+01 -1.044155000000000166e+00 -4.115625000000000000e+01 -1.044159999999999977e+00 -4.115625000000000000e+01 -1.044165000000000010e+00 -4.109375000000000000e+01 -1.044170000000000043e+00 -4.112500000000000000e+01 -1.044175000000000075e+00 -4.115625000000000000e+01 -1.044180000000000108e+00 -4.115625000000000000e+01 -1.044185000000000141e+00 -4.118750381469726562e+01 -1.044190000000000174e+00 -4.109375000000000000e+01 -1.044194999999999984e+00 -4.106250000000000000e+01 -1.044200000000000017e+00 -4.115625000000000000e+01 -1.044205000000000050e+00 -4.109375000000000000e+01 -1.044210000000000083e+00 -4.115625000000000000e+01 -1.044215000000000115e+00 -4.106250000000000000e+01 -1.044220000000000148e+00 -4.115625000000000000e+01 -1.044225000000000181e+00 -4.112500000000000000e+01 -1.044229999999999992e+00 -4.106250000000000000e+01 -1.044235000000000024e+00 -4.106250000000000000e+01 -1.044240000000000057e+00 -4.106250000000000000e+01 -1.044245000000000090e+00 -4.106250000000000000e+01 -1.044250000000000123e+00 -4.109375000000000000e+01 -1.044255000000000155e+00 -4.103125381469726562e+01 -1.044260000000000188e+00 -4.106250000000000000e+01 -1.044264999999999999e+00 -4.103125381469726562e+01 -1.044270000000000032e+00 -4.106250000000000000e+01 -1.044275000000000064e+00 -4.103125381469726562e+01 -1.044280000000000097e+00 -4.103125381469726562e+01 -1.044285000000000130e+00 -4.100000000000000000e+01 -1.044290000000000163e+00 -4.103125381469726562e+01 -1.044295000000000195e+00 -4.106250000000000000e+01 -1.044300000000000006e+00 -4.103125381469726562e+01 -1.044305000000000039e+00 -4.100000000000000000e+01 -1.044310000000000072e+00 -4.100000000000000000e+01 -1.044315000000000104e+00 -4.103125381469726562e+01 -1.044320000000000137e+00 -4.103125381469726562e+01 -1.044325000000000170e+00 -4.103125381469726562e+01 -1.044329999999999981e+00 -4.103125381469726562e+01 -1.044335000000000013e+00 -4.100000000000000000e+01 -1.044340000000000046e+00 -4.100000000000000000e+01 -1.044345000000000079e+00 -4.093750381469726562e+01 -1.044350000000000112e+00 -4.100000000000000000e+01 -1.044355000000000144e+00 -4.087500381469726562e+01 -1.044360000000000177e+00 -4.096875000000000000e+01 -1.044364999999999988e+00 -4.100000000000000000e+01 -1.044370000000000021e+00 -4.096875000000000000e+01 -1.044375000000000053e+00 -4.093750381469726562e+01 -1.044380000000000086e+00 -4.093750381469726562e+01 -1.044385000000000119e+00 -4.090625000000000000e+01 -1.044390000000000152e+00 -4.096875000000000000e+01 -1.044395000000000184e+00 -4.093750381469726562e+01 -1.044399999999999995e+00 -4.090625000000000000e+01 -1.044405000000000028e+00 -4.093750381469726562e+01 -1.044410000000000061e+00 -4.096875000000000000e+01 -1.044415000000000093e+00 -4.093750381469726562e+01 -1.044420000000000126e+00 -4.093750381469726562e+01 -1.044425000000000159e+00 -4.093750381469726562e+01 -1.044430000000000192e+00 -4.087500381469726562e+01 -1.044435000000000002e+00 -4.090625000000000000e+01 -1.044440000000000035e+00 -4.084375000000000000e+01 -1.044445000000000068e+00 -4.093750381469726562e+01 -1.044450000000000101e+00 -4.090625000000000000e+01 -1.044455000000000133e+00 -4.096875000000000000e+01 -1.044460000000000166e+00 -4.090625000000000000e+01 -1.044464999999999977e+00 -4.090625000000000000e+01 -1.044470000000000010e+00 -4.093750381469726562e+01 -1.044475000000000042e+00 -4.090625000000000000e+01 -1.044480000000000075e+00 -4.087500381469726562e+01 -1.044485000000000108e+00 -4.096875000000000000e+01 -1.044490000000000141e+00 -4.096875000000000000e+01 -1.044495000000000173e+00 -4.093750381469726562e+01 -1.044499999999999984e+00 -4.093750381469726562e+01 -1.044505000000000017e+00 -4.090625000000000000e+01 -1.044510000000000050e+00 -4.093750381469726562e+01 -1.044515000000000082e+00 -4.087500381469726562e+01 -1.044520000000000115e+00 -4.090625000000000000e+01 -1.044525000000000148e+00 -4.087500381469726562e+01 -1.044530000000000181e+00 -4.090625000000000000e+01 -1.044534999999999991e+00 -4.087500381469726562e+01 -1.044540000000000024e+00 -4.087500381469726562e+01 -1.044545000000000057e+00 -4.090625000000000000e+01 -1.044550000000000090e+00 -4.084375000000000000e+01 -1.044555000000000122e+00 -4.090625000000000000e+01 -1.044560000000000155e+00 -4.090625000000000000e+01 -1.044565000000000188e+00 -4.075000000000000000e+01 -1.044569999999999999e+00 -4.081250000000000000e+01 -1.044575000000000031e+00 -4.084375000000000000e+01 -1.044580000000000064e+00 -4.078125381469726562e+01 -1.044585000000000097e+00 -4.078125381469726562e+01 -1.044590000000000130e+00 -4.081250000000000000e+01 -1.044595000000000162e+00 -4.078125381469726562e+01 -1.044600000000000195e+00 -4.078125381469726562e+01 -1.044605000000000006e+00 -4.078125381469726562e+01 -1.044610000000000039e+00 -4.081250000000000000e+01 -1.044615000000000071e+00 -4.081250000000000000e+01 -1.044620000000000104e+00 -4.078125381469726562e+01 -1.044625000000000137e+00 -4.084375000000000000e+01 -1.044630000000000170e+00 -4.078125381469726562e+01 -1.044634999999999980e+00 -4.081250000000000000e+01 -1.044640000000000013e+00 -4.084375000000000000e+01 -1.044645000000000046e+00 -4.081250000000000000e+01 -1.044650000000000079e+00 -4.081250000000000000e+01 -1.044655000000000111e+00 -4.078125381469726562e+01 -1.044660000000000144e+00 -4.078125381469726562e+01 -1.044665000000000177e+00 -4.081250000000000000e+01 -1.044669999999999987e+00 -4.071875000000000000e+01 -1.044675000000000020e+00 -4.075000000000000000e+01 -1.044680000000000053e+00 -4.075000000000000000e+01 -1.044685000000000086e+00 -4.071875000000000000e+01 -1.044690000000000119e+00 -4.078125381469726562e+01 -1.044695000000000151e+00 -4.071875000000000000e+01 -1.044700000000000184e+00 -4.071875000000000000e+01 -1.044704999999999995e+00 -4.065625000000000000e+01 -1.044710000000000027e+00 -4.068750000000000000e+01 -1.044715000000000060e+00 -4.071875000000000000e+01 -1.044720000000000093e+00 -4.068750000000000000e+01 -1.044725000000000126e+00 -4.068750000000000000e+01 -1.044730000000000159e+00 -4.068750000000000000e+01 -1.044735000000000191e+00 -4.065625000000000000e+01 -1.044740000000000002e+00 -4.071875000000000000e+01 -1.044745000000000035e+00 -4.065625000000000000e+01 -1.044750000000000068e+00 -4.059375000000000000e+01 -1.044755000000000100e+00 -4.062500381469726562e+01 -1.044760000000000133e+00 -4.065625000000000000e+01 -1.044765000000000166e+00 -4.068750000000000000e+01 -1.044769999999999976e+00 -4.068750000000000000e+01 -1.044775000000000009e+00 -4.065625000000000000e+01 -1.044780000000000042e+00 -4.062500381469726562e+01 -1.044785000000000075e+00 -4.065625000000000000e+01 -1.044790000000000108e+00 -4.062500381469726562e+01 -1.044795000000000140e+00 -4.062500381469726562e+01 -1.044800000000000173e+00 -4.068750000000000000e+01 -1.044804999999999984e+00 -4.065625000000000000e+01 -1.044810000000000016e+00 -4.065625000000000000e+01 -1.044815000000000049e+00 -4.062500381469726562e+01 -1.044820000000000082e+00 -4.056250000000000000e+01 -1.044825000000000115e+00 -4.062500381469726562e+01 -1.044830000000000148e+00 -4.062500381469726562e+01 -1.044835000000000180e+00 -4.059375000000000000e+01 -1.044839999999999991e+00 -4.056250000000000000e+01 -1.044845000000000024e+00 -4.059375000000000000e+01 -1.044850000000000056e+00 -4.056250000000000000e+01 -1.044855000000000089e+00 -4.059375000000000000e+01 -1.044860000000000122e+00 -4.065625000000000000e+01 -1.044865000000000155e+00 -4.056250000000000000e+01 -1.044870000000000188e+00 -4.062500381469726562e+01 -1.044874999999999998e+00 -4.062500381469726562e+01 -1.044880000000000031e+00 -4.059375000000000000e+01 -1.044885000000000064e+00 -4.053125000000000000e+01 -1.044890000000000096e+00 -4.056250000000000000e+01 -1.044895000000000129e+00 -4.053125000000000000e+01 -1.044900000000000162e+00 -4.056250000000000000e+01 -1.044905000000000195e+00 -4.050000000000000000e+01 -1.044910000000000005e+00 -4.059375000000000000e+01 -1.044915000000000038e+00 -4.050000000000000000e+01 -1.044920000000000071e+00 -4.053125000000000000e+01 -1.044925000000000104e+00 -4.053125000000000000e+01 -1.044930000000000136e+00 -4.050000000000000000e+01 -1.044935000000000169e+00 -4.053125000000000000e+01 -1.044939999999999980e+00 -4.053125000000000000e+01 -1.044945000000000013e+00 -4.053125000000000000e+01 -1.044950000000000045e+00 -4.050000000000000000e+01 -1.044955000000000078e+00 -4.046875381469726562e+01 -1.044960000000000111e+00 -4.046875381469726562e+01 -1.044965000000000144e+00 -4.043750000000000000e+01 -1.044970000000000176e+00 -4.050000000000000000e+01 -1.044974999999999987e+00 -4.043750000000000000e+01 -1.044980000000000020e+00 -4.046875381469726562e+01 -1.044985000000000053e+00 -4.050000000000000000e+01 -1.044990000000000085e+00 -4.046875381469726562e+01 -1.044995000000000118e+00 -4.050000000000000000e+01 -1.045000000000000151e+00 -4.037500000000000000e+01 -1.045005000000000184e+00 -4.040625000000000000e+01 -1.045009999999999994e+00 -4.043750000000000000e+01 -1.045015000000000027e+00 -4.037500000000000000e+01 -1.045020000000000060e+00 -4.037500000000000000e+01 -1.045025000000000093e+00 -4.037500000000000000e+01 -1.045030000000000125e+00 -4.040625000000000000e+01 -1.045035000000000158e+00 -4.034375000000000000e+01 -1.045040000000000191e+00 -4.037500000000000000e+01 -1.045045000000000002e+00 -4.034375000000000000e+01 -1.045050000000000034e+00 -4.034375000000000000e+01 -1.045055000000000067e+00 -4.031250381469726562e+01 -1.045060000000000100e+00 -4.031250381469726562e+01 -1.045065000000000133e+00 -4.028125000000000000e+01 -1.045070000000000165e+00 -4.028125000000000000e+01 -1.045074999999999976e+00 -4.031250381469726562e+01 -1.045080000000000009e+00 -4.028125000000000000e+01 -1.045085000000000042e+00 -4.028125000000000000e+01 -1.045090000000000074e+00 -4.031250381469726562e+01 -1.045095000000000107e+00 -4.031250381469726562e+01 -1.045100000000000140e+00 -4.031250381469726562e+01 -1.045105000000000173e+00 -4.034375000000000000e+01 -1.045109999999999983e+00 -4.025000000000000000e+01 -1.045115000000000016e+00 -4.028125000000000000e+01 -1.045120000000000049e+00 -4.028125000000000000e+01 -1.045125000000000082e+00 -4.025000000000000000e+01 -1.045130000000000114e+00 -4.025000000000000000e+01 -1.045135000000000147e+00 -4.028125000000000000e+01 -1.045140000000000180e+00 -4.028125000000000000e+01 -1.045144999999999991e+00 -4.028125000000000000e+01 -1.045150000000000023e+00 -4.025000000000000000e+01 -1.045155000000000056e+00 -4.031250381469726562e+01 -1.045160000000000089e+00 -4.028125000000000000e+01 -1.045165000000000122e+00 -4.025000000000000000e+01 -1.045170000000000154e+00 -4.025000000000000000e+01 -1.045175000000000187e+00 -4.021875000000000000e+01 -1.045179999999999998e+00 -4.028125000000000000e+01 -1.045185000000000031e+00 -4.028125000000000000e+01 -1.045190000000000063e+00 -4.021875000000000000e+01 -1.045195000000000096e+00 -4.025000000000000000e+01 -1.045200000000000129e+00 -4.021875000000000000e+01 -1.045205000000000162e+00 -4.018750000000000000e+01 -1.045210000000000194e+00 -4.028125000000000000e+01 -1.045215000000000005e+00 -4.021875000000000000e+01 -1.045220000000000038e+00 -4.028125000000000000e+01 -1.045225000000000071e+00 -4.018750000000000000e+01 -1.045230000000000103e+00 -4.021875000000000000e+01 -1.045235000000000136e+00 -4.015625381469726562e+01 -1.045240000000000169e+00 -4.018750000000000000e+01 -1.045244999999999980e+00 -4.009375000000000000e+01 -1.045250000000000012e+00 -4.015625381469726562e+01 -1.045255000000000045e+00 -4.021875000000000000e+01 -1.045260000000000078e+00 -4.018750000000000000e+01 -1.045265000000000111e+00 -4.018750000000000000e+01 -1.045270000000000143e+00 -4.015625381469726562e+01 -1.045275000000000176e+00 -4.012500000000000000e+01 -1.045279999999999987e+00 -4.015625381469726562e+01 -1.045285000000000020e+00 -4.012500000000000000e+01 -1.045290000000000052e+00 -4.009375000000000000e+01 -1.045295000000000085e+00 -4.012500000000000000e+01 -1.045300000000000118e+00 -4.012500000000000000e+01 -1.045305000000000151e+00 -4.009375000000000000e+01 -1.045310000000000183e+00 -4.006250381469726562e+01 -1.045314999999999994e+00 -4.009375000000000000e+01 -1.045320000000000027e+00 -4.009375000000000000e+01 -1.045325000000000060e+00 -4.012500000000000000e+01 -1.045330000000000092e+00 -4.012500000000000000e+01 -1.045335000000000125e+00 -4.012500000000000000e+01 -1.045340000000000158e+00 -4.009375000000000000e+01 -1.045345000000000191e+00 -4.009375000000000000e+01 -1.045350000000000001e+00 -4.009375000000000000e+01 -1.045355000000000034e+00 -4.009375000000000000e+01 -1.045360000000000067e+00 -4.006250381469726562e+01 -1.045365000000000100e+00 -4.003125000000000000e+01 -1.045370000000000132e+00 -4.009375000000000000e+01 -1.045375000000000165e+00 -4.012500000000000000e+01 -1.045379999999999976e+00 -4.009375000000000000e+01 -1.045385000000000009e+00 -4.003125000000000000e+01 -1.045390000000000041e+00 -4.006250381469726562e+01 -1.045395000000000074e+00 -4.009375000000000000e+01 -1.045400000000000107e+00 -4.003125000000000000e+01 -1.045405000000000140e+00 -4.003125000000000000e+01 -1.045410000000000172e+00 -4.006250381469726562e+01 -1.045414999999999983e+00 -4.009375000000000000e+01 -1.045420000000000016e+00 -4.003125000000000000e+01 -1.045425000000000049e+00 -4.006250381469726562e+01 -1.045430000000000081e+00 -4.003125000000000000e+01 -1.045435000000000114e+00 -4.003125000000000000e+01 -1.045440000000000147e+00 -4.006250381469726562e+01 -1.045445000000000180e+00 -4.000000000000000000e+01 -1.045449999999999990e+00 -4.000000000000000000e+01 -1.045455000000000023e+00 -3.996875000000000000e+01 -1.045460000000000056e+00 -3.993750000000000000e+01 -1.045465000000000089e+00 -4.003125000000000000e+01 -1.045470000000000121e+00 -4.000000000000000000e+01 -1.045475000000000154e+00 -3.993750000000000000e+01 -1.045480000000000187e+00 -3.993750000000000000e+01 -1.045484999999999998e+00 -3.993750000000000000e+01 -1.045490000000000030e+00 -3.990625381469726562e+01 -1.045495000000000063e+00 -3.996875000000000000e+01 -1.045500000000000096e+00 -3.990625381469726562e+01 -1.045505000000000129e+00 -3.990625381469726562e+01 -1.045510000000000161e+00 -3.990625381469726562e+01 -1.045515000000000194e+00 -3.987500000000000000e+01 -1.045520000000000005e+00 -3.993750000000000000e+01 -1.045525000000000038e+00 -3.987500000000000000e+01 -1.045530000000000070e+00 -3.996875000000000000e+01 -1.045535000000000103e+00 -3.996875000000000000e+01 -1.045540000000000136e+00 -3.987500000000000000e+01 -1.045545000000000169e+00 -3.993750000000000000e+01 -1.045549999999999979e+00 -4.003125000000000000e+01 -1.045555000000000012e+00 -3.987500000000000000e+01 -1.045560000000000045e+00 -4.000000000000000000e+01 -1.045565000000000078e+00 -3.987500000000000000e+01 -1.045570000000000110e+00 -3.993750000000000000e+01 -1.045575000000000143e+00 -3.990625381469726562e+01 -1.045580000000000176e+00 -3.987500000000000000e+01 -1.045584999999999987e+00 -3.993750000000000000e+01 -1.045590000000000019e+00 -3.990625381469726562e+01 -1.045595000000000052e+00 -3.987500000000000000e+01 -1.045600000000000085e+00 -3.993750000000000000e+01 -1.045605000000000118e+00 -3.987500000000000000e+01 -1.045610000000000150e+00 -3.984375000000000000e+01 -1.045615000000000183e+00 -3.987500000000000000e+01 -1.045619999999999994e+00 -3.984375000000000000e+01 -1.045625000000000027e+00 -3.987500000000000000e+01 -1.045630000000000059e+00 -3.987500000000000000e+01 -1.045635000000000092e+00 -3.987500000000000000e+01 -1.045640000000000125e+00 -3.984375000000000000e+01 -1.045645000000000158e+00 -3.987500000000000000e+01 -1.045650000000000190e+00 -3.984375000000000000e+01 -1.045655000000000001e+00 -3.984375000000000000e+01 -1.045660000000000034e+00 -3.984375000000000000e+01 -1.045665000000000067e+00 -3.987500000000000000e+01 -1.045670000000000099e+00 -3.987500000000000000e+01 -1.045675000000000132e+00 -3.987500000000000000e+01 -1.045680000000000165e+00 -3.978125000000000000e+01 -1.045684999999999976e+00 -3.981250000000000000e+01 -1.045690000000000008e+00 -3.987500000000000000e+01 -1.045695000000000041e+00 -3.987500000000000000e+01 -1.045700000000000074e+00 -3.984375000000000000e+01 -1.045705000000000107e+00 -3.984375000000000000e+01 -1.045710000000000139e+00 -3.987500000000000000e+01 -1.045715000000000172e+00 -3.978125000000000000e+01 -1.045719999999999983e+00 -3.975000381469726562e+01 -1.045725000000000016e+00 -3.981250000000000000e+01 -1.045730000000000048e+00 -3.984375000000000000e+01 -1.045735000000000081e+00 -3.978125000000000000e+01 -1.045740000000000114e+00 -3.981250000000000000e+01 -1.045745000000000147e+00 -3.978125000000000000e+01 -1.045750000000000179e+00 -3.987500000000000000e+01 -1.045754999999999990e+00 -3.984375000000000000e+01 -1.045760000000000023e+00 -3.984375000000000000e+01 -1.045765000000000056e+00 -3.990625381469726562e+01 -1.045770000000000088e+00 -3.981250000000000000e+01 -1.045775000000000121e+00 -3.978125000000000000e+01 -1.045780000000000154e+00 -3.984375000000000000e+01 -1.045785000000000187e+00 -3.981250000000000000e+01 -1.045789999999999997e+00 -3.978125000000000000e+01 -1.045795000000000030e+00 -3.975000381469726562e+01 -1.045800000000000063e+00 -3.968750000000000000e+01 -1.045805000000000096e+00 -3.978125000000000000e+01 -1.045810000000000128e+00 -3.981250000000000000e+01 -1.045815000000000161e+00 -3.978125000000000000e+01 -1.045820000000000194e+00 -3.971875000000000000e+01 -1.045825000000000005e+00 -3.984375000000000000e+01 -1.045830000000000037e+00 -3.978125000000000000e+01 -1.045835000000000070e+00 -3.978125000000000000e+01 -1.045840000000000103e+00 -3.975000381469726562e+01 -1.045845000000000136e+00 -3.975000381469726562e+01 -1.045850000000000168e+00 -3.971875000000000000e+01 -1.045854999999999979e+00 -3.975000381469726562e+01 -1.045860000000000012e+00 -3.975000381469726562e+01 -1.045865000000000045e+00 -3.975000381469726562e+01 -1.045870000000000077e+00 -3.971875000000000000e+01 -1.045875000000000110e+00 -3.975000381469726562e+01 -1.045880000000000143e+00 -3.975000381469726562e+01 -1.045885000000000176e+00 -3.975000381469726562e+01 -1.045889999999999986e+00 -3.965625000000000000e+01 -1.045895000000000019e+00 -3.978125000000000000e+01 -1.045900000000000052e+00 -3.971875000000000000e+01 -1.045905000000000085e+00 -3.975000381469726562e+01 -1.045910000000000117e+00 -3.965625000000000000e+01 -1.045915000000000150e+00 -3.968750000000000000e+01 -1.045920000000000183e+00 -3.971875000000000000e+01 -1.045924999999999994e+00 -3.971875000000000000e+01 -1.045930000000000026e+00 -3.962500000000000000e+01 -1.045935000000000059e+00 -3.959375381469726562e+01 -1.045940000000000092e+00 -3.971875000000000000e+01 -1.045945000000000125e+00 -3.956250000000000000e+01 -1.045950000000000157e+00 -3.968750000000000000e+01 -1.045955000000000190e+00 -3.965625000000000000e+01 -1.045960000000000001e+00 -3.962500000000000000e+01 -1.045965000000000034e+00 -3.962500000000000000e+01 -1.045970000000000066e+00 -3.962500000000000000e+01 -1.045975000000000099e+00 -3.956250000000000000e+01 -1.045980000000000132e+00 -3.956250000000000000e+01 -1.045985000000000165e+00 -3.956250000000000000e+01 -1.045989999999999975e+00 -3.959375381469726562e+01 -1.045995000000000008e+00 -3.953125000000000000e+01 -1.046000000000000041e+00 -3.956250000000000000e+01 -1.046005000000000074e+00 -3.956250000000000000e+01 -1.046010000000000106e+00 -3.959375381469726562e+01 -1.046015000000000139e+00 -3.959375381469726562e+01 -1.046020000000000172e+00 -3.956250000000000000e+01 -1.046024999999999983e+00 -3.953125000000000000e+01 -1.046030000000000015e+00 -3.956250000000000000e+01 -1.046035000000000048e+00 -3.956250000000000000e+01 -1.046040000000000081e+00 -3.953125000000000000e+01 -1.046045000000000114e+00 -3.946875000000000000e+01 -1.046050000000000146e+00 -3.953125000000000000e+01 -1.046055000000000179e+00 -3.940625000000000000e+01 -1.046059999999999990e+00 -3.950000000000000000e+01 -1.046065000000000023e+00 -3.953125000000000000e+01 -1.046070000000000055e+00 -3.953125000000000000e+01 -1.046075000000000088e+00 -3.953125000000000000e+01 -1.046080000000000121e+00 -3.950000000000000000e+01 -1.046085000000000154e+00 -3.950000000000000000e+01 -1.046090000000000186e+00 -3.953125000000000000e+01 -1.046094999999999997e+00 -3.950000000000000000e+01 -1.046100000000000030e+00 -3.953125000000000000e+01 -1.046105000000000063e+00 -3.950000000000000000e+01 -1.046110000000000095e+00 -3.946875000000000000e+01 -1.046115000000000128e+00 -3.946875000000000000e+01 -1.046120000000000161e+00 -3.943750381469726562e+01 -1.046125000000000194e+00 -3.943750381469726562e+01 -1.046130000000000004e+00 -3.946875000000000000e+01 -1.046135000000000037e+00 -3.943750381469726562e+01 -1.046140000000000070e+00 -3.937500000000000000e+01 -1.046145000000000103e+00 -3.937500000000000000e+01 -1.046150000000000135e+00 -3.937500000000000000e+01 -1.046155000000000168e+00 -3.931250000000000000e+01 -1.046159999999999979e+00 -3.940625000000000000e+01 -1.046165000000000012e+00 -3.940625000000000000e+01 -1.046170000000000044e+00 -3.937500000000000000e+01 -1.046175000000000077e+00 -3.940625000000000000e+01 -1.046180000000000110e+00 -3.937500000000000000e+01 -1.046185000000000143e+00 -3.934375381469726562e+01 -1.046190000000000175e+00 -3.937500000000000000e+01 -1.046194999999999986e+00 -3.940625000000000000e+01 -1.046200000000000019e+00 -3.934375381469726562e+01 -1.046205000000000052e+00 -3.940625000000000000e+01 -1.046210000000000084e+00 -3.934375381469726562e+01 -1.046215000000000117e+00 -3.937500000000000000e+01 -1.046220000000000150e+00 -3.931250000000000000e+01 -1.046225000000000183e+00 -3.928125000000000000e+01 -1.046229999999999993e+00 -3.931250000000000000e+01 -1.046235000000000026e+00 -3.931250000000000000e+01 -1.046240000000000059e+00 -3.934375381469726562e+01 -1.046245000000000092e+00 -3.931250000000000000e+01 -1.046250000000000124e+00 -3.937500000000000000e+01 -1.046255000000000157e+00 -3.931250000000000000e+01 -1.046260000000000190e+00 -3.928125000000000000e+01 -1.046265000000000001e+00 -3.940625000000000000e+01 -1.046270000000000033e+00 -3.934375381469726562e+01 -1.046275000000000066e+00 -3.937500000000000000e+01 -1.046280000000000099e+00 -3.931250000000000000e+01 -1.046285000000000132e+00 -3.931250000000000000e+01 -1.046290000000000164e+00 -3.928125000000000000e+01 -1.046294999999999975e+00 -3.934375381469726562e+01 -1.046300000000000008e+00 -3.931250000000000000e+01 -1.046305000000000041e+00 -3.934375381469726562e+01 -1.046310000000000073e+00 -3.928125000000000000e+01 -1.046315000000000106e+00 -3.931250000000000000e+01 -1.046320000000000139e+00 -3.928125000000000000e+01 -1.046325000000000172e+00 -3.931250000000000000e+01 -1.046329999999999982e+00 -3.931250000000000000e+01 -1.046335000000000015e+00 -3.931250000000000000e+01 -1.046340000000000048e+00 -3.931250000000000000e+01 -1.046345000000000081e+00 -3.925000000000000000e+01 -1.046350000000000113e+00 -3.931250000000000000e+01 -1.046355000000000146e+00 -3.928125000000000000e+01 -1.046360000000000179e+00 -3.925000000000000000e+01 -1.046364999999999990e+00 -3.928125000000000000e+01 -1.046370000000000022e+00 -3.928125000000000000e+01 -1.046375000000000055e+00 -3.931250000000000000e+01 -1.046380000000000088e+00 -3.928125000000000000e+01 -1.046385000000000121e+00 -3.928125000000000000e+01 -1.046390000000000153e+00 -3.925000000000000000e+01 -1.046395000000000186e+00 -3.928125000000000000e+01 -1.046399999999999997e+00 -3.921875000000000000e+01 -1.046405000000000030e+00 -3.918750381469726562e+01 -1.046410000000000062e+00 -3.921875000000000000e+01 -1.046415000000000095e+00 -3.918750381469726562e+01 -1.046420000000000128e+00 -3.925000000000000000e+01 -1.046425000000000161e+00 -3.928125000000000000e+01 -1.046430000000000193e+00 -3.921875000000000000e+01 -1.046435000000000004e+00 -3.915625000000000000e+01 -1.046440000000000037e+00 -3.925000000000000000e+01 -1.046445000000000070e+00 -3.925000000000000000e+01 -1.046450000000000102e+00 -3.931250000000000000e+01 -1.046455000000000135e+00 -3.921875000000000000e+01 -1.046460000000000168e+00 -3.915625000000000000e+01 -1.046464999999999979e+00 -3.921875000000000000e+01 -1.046470000000000011e+00 -3.918750381469726562e+01 -1.046475000000000044e+00 -3.918750381469726562e+01 -1.046480000000000077e+00 -3.915625000000000000e+01 -1.046485000000000110e+00 -3.915625000000000000e+01 -1.046490000000000142e+00 -3.918750381469726562e+01 -1.046495000000000175e+00 -3.915625000000000000e+01 -1.046499999999999986e+00 -3.909375000000000000e+01 -1.046505000000000019e+00 -3.915625000000000000e+01 -1.046510000000000051e+00 -3.915625000000000000e+01 -1.046515000000000084e+00 -3.918750381469726562e+01 -1.046520000000000117e+00 -3.912500000000000000e+01 -1.046525000000000150e+00 -3.912500000000000000e+01 -1.046530000000000182e+00 -3.912500000000000000e+01 -1.046534999999999993e+00 -3.915625000000000000e+01 -1.046540000000000026e+00 -3.906250000000000000e+01 -1.046545000000000059e+00 -3.912500000000000000e+01 -1.046550000000000091e+00 -3.912500000000000000e+01 -1.046555000000000124e+00 -3.909375000000000000e+01 -1.046560000000000157e+00 -3.909375000000000000e+01 -1.046565000000000190e+00 -3.909375000000000000e+01 -1.046570000000000000e+00 -3.906250000000000000e+01 -1.046575000000000033e+00 -3.906250000000000000e+01 -1.046580000000000066e+00 -3.900000000000000000e+01 -1.046585000000000099e+00 -3.903125381469726562e+01 -1.046590000000000131e+00 -3.903125381469726562e+01 -1.046595000000000164e+00 -3.909375000000000000e+01 -1.046599999999999975e+00 -3.906250000000000000e+01 -1.046605000000000008e+00 -3.903125381469726562e+01 -1.046610000000000040e+00 -3.903125381469726562e+01 -1.046615000000000073e+00 -3.906250000000000000e+01 -1.046620000000000106e+00 -3.903125381469726562e+01 -1.046625000000000139e+00 -3.903125381469726562e+01 -1.046630000000000171e+00 -3.903125381469726562e+01 -1.046634999999999982e+00 -3.900000000000000000e+01 -1.046640000000000015e+00 -3.900000000000000000e+01 -1.046645000000000048e+00 -3.900000000000000000e+01 -1.046650000000000080e+00 -3.903125381469726562e+01 -1.046655000000000113e+00 -3.900000000000000000e+01 -1.046660000000000146e+00 -3.900000000000000000e+01 -1.046665000000000179e+00 -3.900000000000000000e+01 -1.046669999999999989e+00 -3.900000000000000000e+01 -1.046675000000000022e+00 -3.896875000000000000e+01 -1.046680000000000055e+00 -3.900000000000000000e+01 -1.046685000000000088e+00 -3.900000000000000000e+01 -1.046690000000000120e+00 -3.903125381469726562e+01 -1.046695000000000153e+00 -3.896875000000000000e+01 -1.046700000000000186e+00 -3.893750000000000000e+01 -1.046704999999999997e+00 -3.896875000000000000e+01 -1.046710000000000029e+00 -3.893750000000000000e+01 -1.046715000000000062e+00 -3.896875000000000000e+01 -1.046720000000000095e+00 -3.903125381469726562e+01 -1.046725000000000128e+00 -3.893750000000000000e+01 -1.046730000000000160e+00 -3.896875000000000000e+01 -1.046735000000000193e+00 -3.896875000000000000e+01 -1.046740000000000004e+00 -3.896875000000000000e+01 -1.046745000000000037e+00 -3.900000000000000000e+01 -1.046750000000000069e+00 -3.893750000000000000e+01 -1.046755000000000102e+00 -3.890625000000000000e+01 -1.046760000000000135e+00 -3.893750000000000000e+01 -1.046765000000000168e+00 -3.893750000000000000e+01 -1.046769999999999978e+00 -3.893750000000000000e+01 -1.046775000000000011e+00 -3.890625000000000000e+01 -1.046780000000000044e+00 -3.896875000000000000e+01 -1.046785000000000077e+00 -3.893750000000000000e+01 -1.046790000000000109e+00 -3.890625000000000000e+01 -1.046795000000000142e+00 -3.887500381469726562e+01 -1.046800000000000175e+00 -3.887500381469726562e+01 -1.046804999999999986e+00 -3.890625000000000000e+01 -1.046810000000000018e+00 -3.893750000000000000e+01 -1.046815000000000051e+00 -3.890625000000000000e+01 -1.046820000000000084e+00 -3.890625000000000000e+01 -1.046825000000000117e+00 -3.881250000000000000e+01 -1.046830000000000149e+00 -3.890625000000000000e+01 -1.046835000000000182e+00 -3.890625000000000000e+01 -1.046839999999999993e+00 -3.887500381469726562e+01 -1.046845000000000026e+00 -3.890625000000000000e+01 -1.046850000000000058e+00 -3.884375000000000000e+01 -1.046855000000000091e+00 -3.884375000000000000e+01 -1.046860000000000124e+00 -3.887500381469726562e+01 -1.046865000000000157e+00 -3.884375000000000000e+01 -1.046870000000000189e+00 -3.887500381469726562e+01 -1.046875000000000000e+00 -3.884375000000000000e+01 -1.046880000000000033e+00 -3.884375000000000000e+01 -1.046885000000000066e+00 -3.887500381469726562e+01 -1.046890000000000098e+00 -3.884375000000000000e+01 -1.046895000000000131e+00 -3.884375000000000000e+01 -1.046900000000000164e+00 -3.884375000000000000e+01 -1.046905000000000197e+00 -3.884375000000000000e+01 -1.046910000000000007e+00 -3.881250000000000000e+01 -1.046915000000000040e+00 -3.884375000000000000e+01 -1.046920000000000073e+00 -3.884375000000000000e+01 -1.046925000000000106e+00 -3.878125000000000000e+01 -1.046930000000000138e+00 -3.878125000000000000e+01 -1.046935000000000171e+00 -3.875000000000000000e+01 -1.046939999999999982e+00 -3.881250000000000000e+01 -1.046945000000000014e+00 -3.881250000000000000e+01 -1.046950000000000047e+00 -3.884375000000000000e+01 -1.046955000000000080e+00 -3.881250000000000000e+01 -1.046960000000000113e+00 -3.878125000000000000e+01 -1.046965000000000146e+00 -3.881250000000000000e+01 -1.046970000000000178e+00 -3.878125000000000000e+01 -1.046974999999999989e+00 -3.878125000000000000e+01 -1.046980000000000022e+00 -3.881250000000000000e+01 -1.046985000000000054e+00 -3.881250000000000000e+01 -1.046990000000000087e+00 -3.875000000000000000e+01 -1.046995000000000120e+00 -3.884375000000000000e+01 -1.047000000000000153e+00 -3.881250000000000000e+01 -1.047005000000000186e+00 -3.871875381469726562e+01 -1.047009999999999996e+00 -3.878125000000000000e+01 -1.047015000000000029e+00 -3.881250000000000000e+01 -1.047020000000000062e+00 -3.881250000000000000e+01 -1.047025000000000095e+00 -3.875000000000000000e+01 -1.047030000000000127e+00 -3.871875381469726562e+01 -1.047035000000000160e+00 -3.881250000000000000e+01 -1.047040000000000193e+00 -3.878125000000000000e+01 -1.047045000000000003e+00 -3.868750000000000000e+01 -1.047050000000000036e+00 -3.875000000000000000e+01 -1.047055000000000069e+00 -3.875000000000000000e+01 -1.047060000000000102e+00 -3.868750000000000000e+01 -1.047065000000000135e+00 -3.871875381469726562e+01 -1.047070000000000167e+00 -3.871875381469726562e+01 -1.047074999999999978e+00 -3.865625000000000000e+01 -1.047080000000000011e+00 -3.868750000000000000e+01 -1.047085000000000043e+00 -3.868750000000000000e+01 -1.047090000000000076e+00 -3.865625000000000000e+01 -1.047095000000000109e+00 -3.871875381469726562e+01 -1.047100000000000142e+00 -3.871875381469726562e+01 -1.047105000000000175e+00 -3.865625000000000000e+01 -1.047109999999999985e+00 -3.868750000000000000e+01 -1.047115000000000018e+00 -3.865625000000000000e+01 -1.047120000000000051e+00 -3.871875381469726562e+01 -1.047125000000000083e+00 -3.862500000000000000e+01 -1.047130000000000116e+00 -3.865625000000000000e+01 -1.047135000000000149e+00 -3.865625000000000000e+01 -1.047140000000000182e+00 -3.865625000000000000e+01 -1.047144999999999992e+00 -3.865625000000000000e+01 -1.047150000000000025e+00 -3.865625000000000000e+01 -1.047155000000000058e+00 -3.862500000000000000e+01 -1.047160000000000091e+00 -3.865625000000000000e+01 -1.047165000000000123e+00 -3.859375000000000000e+01 -1.047170000000000156e+00 -3.865625000000000000e+01 -1.047175000000000189e+00 -3.865625000000000000e+01 -1.047180000000000000e+00 -3.862500000000000000e+01 -1.047185000000000032e+00 -3.865625000000000000e+01 -1.047190000000000065e+00 -3.862500000000000000e+01 -1.047195000000000098e+00 -3.859375000000000000e+01 -1.047200000000000131e+00 -3.862500000000000000e+01 -1.047205000000000163e+00 -3.859375000000000000e+01 -1.047210000000000196e+00 -3.865625000000000000e+01 -1.047215000000000007e+00 -3.865625000000000000e+01 -1.047220000000000040e+00 -3.862500000000000000e+01 -1.047225000000000072e+00 -3.865625000000000000e+01 -1.047230000000000105e+00 -3.853125000000000000e+01 -1.047235000000000138e+00 -3.859375000000000000e+01 -1.047240000000000171e+00 -3.859375000000000000e+01 -1.047244999999999981e+00 -3.856250381469726562e+01 -1.047250000000000014e+00 -3.850000000000000000e+01 -1.047255000000000047e+00 -3.853125000000000000e+01 -1.047260000000000080e+00 -3.856250381469726562e+01 -1.047265000000000112e+00 -3.850000000000000000e+01 -1.047270000000000145e+00 -3.853125000000000000e+01 -1.047275000000000178e+00 -3.856250381469726562e+01 -1.047279999999999989e+00 -3.850000000000000000e+01 -1.047285000000000021e+00 -3.853125000000000000e+01 -1.047290000000000054e+00 -3.850000000000000000e+01 -1.047295000000000087e+00 -3.843750000000000000e+01 -1.047300000000000120e+00 -3.850000000000000000e+01 -1.047305000000000152e+00 -3.846875381469726562e+01 -1.047310000000000185e+00 -3.850000000000000000e+01 -1.047314999999999996e+00 -3.850000000000000000e+01 -1.047320000000000029e+00 -3.843750000000000000e+01 -1.047325000000000061e+00 -3.846875381469726562e+01 -1.047330000000000094e+00 -3.850000000000000000e+01 -1.047335000000000127e+00 -3.843750000000000000e+01 -1.047340000000000160e+00 -3.846875381469726562e+01 -1.047345000000000192e+00 -3.846875381469726562e+01 -1.047350000000000003e+00 -3.843750000000000000e+01 -1.047355000000000036e+00 -3.843750000000000000e+01 -1.047360000000000069e+00 -3.850000000000000000e+01 -1.047365000000000101e+00 -3.846875381469726562e+01 -1.047370000000000134e+00 -3.837500000000000000e+01 -1.047375000000000167e+00 -3.846875381469726562e+01 -1.047379999999999978e+00 -3.840625000000000000e+01 -1.047385000000000010e+00 -3.840625000000000000e+01 -1.047390000000000043e+00 -3.840625000000000000e+01 -1.047395000000000076e+00 -3.834375000000000000e+01 -1.047400000000000109e+00 -3.840625000000000000e+01 -1.047405000000000141e+00 -3.843750000000000000e+01 -1.047410000000000174e+00 -3.837500000000000000e+01 -1.047414999999999985e+00 -3.840625000000000000e+01 -1.047420000000000018e+00 -3.846875381469726562e+01 -1.047425000000000050e+00 -3.840625000000000000e+01 -1.047430000000000083e+00 -3.837500000000000000e+01 -1.047435000000000116e+00 -3.843750000000000000e+01 -1.047440000000000149e+00 -3.840625000000000000e+01 -1.047445000000000181e+00 -3.840625000000000000e+01 -1.047449999999999992e+00 -3.840625000000000000e+01 -1.047455000000000025e+00 -3.837500000000000000e+01 -1.047460000000000058e+00 -3.840625000000000000e+01 -1.047465000000000090e+00 -3.837500000000000000e+01 -1.047470000000000123e+00 -3.837500000000000000e+01 -1.047475000000000156e+00 -3.837500000000000000e+01 -1.047480000000000189e+00 -3.837500000000000000e+01 -1.047484999999999999e+00 -3.837500000000000000e+01 -1.047490000000000032e+00 -3.834375000000000000e+01 -1.047495000000000065e+00 -3.834375000000000000e+01 -1.047500000000000098e+00 -3.834375000000000000e+01 -1.047505000000000130e+00 -3.831250381469726562e+01 -1.047510000000000163e+00 -3.834375000000000000e+01 -1.047515000000000196e+00 -3.828125000000000000e+01 -1.047520000000000007e+00 -3.831250381469726562e+01 -1.047525000000000039e+00 -3.834375000000000000e+01 -1.047530000000000072e+00 -3.834375000000000000e+01 -1.047535000000000105e+00 -3.828125000000000000e+01 -1.047540000000000138e+00 -3.828125000000000000e+01 -1.047545000000000170e+00 -3.831250381469726562e+01 -1.047549999999999981e+00 -3.825000000000000000e+01 -1.047555000000000014e+00 -3.825000000000000000e+01 -1.047560000000000047e+00 -3.828125000000000000e+01 -1.047565000000000079e+00 -3.828125000000000000e+01 -1.047570000000000112e+00 -3.834375000000000000e+01 -1.047575000000000145e+00 -3.818750000000000000e+01 -1.047580000000000178e+00 -3.828125000000000000e+01 -1.047584999999999988e+00 -3.818750000000000000e+01 -1.047590000000000021e+00 -3.825000000000000000e+01 -1.047595000000000054e+00 -3.821875000000000000e+01 -1.047600000000000087e+00 -3.818750000000000000e+01 -1.047605000000000119e+00 -3.818750000000000000e+01 -1.047610000000000152e+00 -3.821875000000000000e+01 -1.047615000000000185e+00 -3.821875000000000000e+01 -1.047619999999999996e+00 -3.828125000000000000e+01 -1.047625000000000028e+00 -3.818750000000000000e+01 -1.047630000000000061e+00 -3.821875000000000000e+01 -1.047635000000000094e+00 -3.828125000000000000e+01 -1.047640000000000127e+00 -3.818750000000000000e+01 -1.047645000000000159e+00 -3.818750000000000000e+01 -1.047650000000000192e+00 -3.815625381469726562e+01 -1.047655000000000003e+00 -3.812500000000000000e+01 -1.047660000000000036e+00 -3.815625381469726562e+01 -1.047665000000000068e+00 -3.815625381469726562e+01 -1.047670000000000101e+00 -3.815625381469726562e+01 -1.047675000000000134e+00 -3.815625381469726562e+01 -1.047680000000000167e+00 -3.818750000000000000e+01 -1.047684999999999977e+00 -3.809375000000000000e+01 -1.047690000000000010e+00 -3.818750000000000000e+01 -1.047695000000000043e+00 -3.815625381469726562e+01 -1.047700000000000076e+00 -3.809375000000000000e+01 -1.047705000000000108e+00 -3.818750000000000000e+01 -1.047710000000000141e+00 -3.809375000000000000e+01 -1.047715000000000174e+00 -3.809375000000000000e+01 -1.047719999999999985e+00 -3.815625381469726562e+01 -1.047725000000000017e+00 -3.812500000000000000e+01 -1.047730000000000050e+00 -3.812500000000000000e+01 -1.047735000000000083e+00 -3.809375000000000000e+01 -1.047740000000000116e+00 -3.806250000000000000e+01 -1.047745000000000148e+00 -3.803125000000000000e+01 -1.047750000000000181e+00 -3.809375000000000000e+01 -1.047754999999999992e+00 -3.803125000000000000e+01 -1.047760000000000025e+00 -3.809375000000000000e+01 -1.047765000000000057e+00 -3.806250000000000000e+01 -1.047770000000000090e+00 -3.803125000000000000e+01 -1.047775000000000123e+00 -3.806250000000000000e+01 -1.047780000000000156e+00 -3.803125000000000000e+01 -1.047785000000000188e+00 -3.806250000000000000e+01 -1.047789999999999999e+00 -3.803125000000000000e+01 -1.047795000000000032e+00 -3.806250000000000000e+01 -1.047800000000000065e+00 -3.800000381469726562e+01 -1.047805000000000097e+00 -3.809375000000000000e+01 -1.047810000000000130e+00 -3.800000381469726562e+01 -1.047815000000000163e+00 -3.800000381469726562e+01 -1.047820000000000196e+00 -3.800000381469726562e+01 -1.047825000000000006e+00 -3.800000381469726562e+01 -1.047830000000000039e+00 -3.800000381469726562e+01 -1.047835000000000072e+00 -3.800000381469726562e+01 -1.047840000000000105e+00 -3.803125000000000000e+01 -1.047845000000000137e+00 -3.803125000000000000e+01 -1.047850000000000170e+00 -3.793750000000000000e+01 -1.047854999999999981e+00 -3.796875000000000000e+01 -1.047860000000000014e+00 -3.796875000000000000e+01 -1.047865000000000046e+00 -3.800000381469726562e+01 -1.047870000000000079e+00 -3.793750000000000000e+01 -1.047875000000000112e+00 -3.793750000000000000e+01 -1.047880000000000145e+00 -3.793750000000000000e+01 -1.047885000000000177e+00 -3.796875000000000000e+01 -1.047889999999999988e+00 -3.790625000000000000e+01 -1.047895000000000021e+00 -3.790625000000000000e+01 -1.047900000000000054e+00 -3.796875000000000000e+01 -1.047905000000000086e+00 -3.793750000000000000e+01 -1.047910000000000119e+00 -3.793750000000000000e+01 -1.047915000000000152e+00 -3.793750000000000000e+01 -1.047920000000000185e+00 -3.787500000000000000e+01 -1.047924999999999995e+00 -3.790625000000000000e+01 -1.047930000000000028e+00 -3.800000381469726562e+01 -1.047935000000000061e+00 -3.793750000000000000e+01 -1.047940000000000094e+00 -3.793750000000000000e+01 -1.047945000000000126e+00 -3.787500000000000000e+01 -1.047950000000000159e+00 -3.784375381469726562e+01 -1.047955000000000192e+00 -3.793750000000000000e+01 -1.047960000000000003e+00 -3.793750000000000000e+01 -1.047965000000000035e+00 -3.790625000000000000e+01 -1.047970000000000068e+00 -3.787500000000000000e+01 -1.047975000000000101e+00 -3.790625000000000000e+01 -1.047980000000000134e+00 -3.793750000000000000e+01 -1.047985000000000166e+00 -3.793750000000000000e+01 -1.047989999999999977e+00 -3.787500000000000000e+01 -1.047995000000000010e+00 -3.790625000000000000e+01 -1.048000000000000043e+00 -3.790625000000000000e+01 -1.048005000000000075e+00 -3.787500000000000000e+01 -1.048010000000000108e+00 -3.787500000000000000e+01 -1.048015000000000141e+00 -3.784375381469726562e+01 -1.048020000000000174e+00 -3.790625000000000000e+01 -1.048024999999999984e+00 -3.784375381469726562e+01 -1.048030000000000017e+00 -3.784375381469726562e+01 -1.048035000000000050e+00 -3.784375381469726562e+01 -1.048040000000000083e+00 -3.781250000000000000e+01 -1.048045000000000115e+00 -3.787500000000000000e+01 -1.048050000000000148e+00 -3.784375381469726562e+01 -1.048055000000000181e+00 -3.781250000000000000e+01 -1.048059999999999992e+00 -3.784375381469726562e+01 -1.048065000000000024e+00 -3.784375381469726562e+01 -1.048070000000000057e+00 -3.784375381469726562e+01 -1.048075000000000090e+00 -3.781250000000000000e+01 -1.048080000000000123e+00 -3.775000381469726562e+01 -1.048085000000000155e+00 -3.784375381469726562e+01 -1.048090000000000188e+00 -3.778125000000000000e+01 -1.048094999999999999e+00 -3.778125000000000000e+01 -1.048100000000000032e+00 -3.784375381469726562e+01 -1.048105000000000064e+00 -3.778125000000000000e+01 -1.048110000000000097e+00 -3.775000381469726562e+01 -1.048115000000000130e+00 -3.778125000000000000e+01 -1.048120000000000163e+00 -3.771875000000000000e+01 -1.048125000000000195e+00 -3.778125000000000000e+01 -1.048130000000000006e+00 -3.781250000000000000e+01 -1.048135000000000039e+00 -3.781250000000000000e+01 -1.048140000000000072e+00 -3.775000381469726562e+01 -1.048145000000000104e+00 -3.778125000000000000e+01 -1.048150000000000137e+00 -3.778125000000000000e+01 -1.048155000000000170e+00 -3.778125000000000000e+01 -1.048159999999999981e+00 -3.771875000000000000e+01 -1.048165000000000013e+00 -3.771875000000000000e+01 -1.048170000000000046e+00 -3.771875000000000000e+01 -1.048175000000000079e+00 -3.771875000000000000e+01 -1.048180000000000112e+00 -3.768750000000000000e+01 -1.048185000000000144e+00 -3.768750000000000000e+01 -1.048190000000000177e+00 -3.771875000000000000e+01 -1.048194999999999988e+00 -3.765625000000000000e+01 -1.048200000000000021e+00 -3.768750000000000000e+01 -1.048205000000000053e+00 -3.765625000000000000e+01 -1.048210000000000086e+00 -3.765625000000000000e+01 -1.048215000000000119e+00 -3.762500000000000000e+01 -1.048220000000000152e+00 -3.759375381469726562e+01 -1.048225000000000184e+00 -3.765625000000000000e+01 -1.048229999999999995e+00 -3.768750000000000000e+01 -1.048235000000000028e+00 -3.765625000000000000e+01 -1.048240000000000061e+00 -3.765625000000000000e+01 -1.048245000000000093e+00 -3.765625000000000000e+01 -1.048250000000000126e+00 -3.768750000000000000e+01 -1.048255000000000159e+00 -3.768750000000000000e+01 -1.048260000000000192e+00 -3.765625000000000000e+01 -1.048265000000000002e+00 -3.765625000000000000e+01 -1.048270000000000035e+00 -3.765625000000000000e+01 -1.048275000000000068e+00 -3.759375381469726562e+01 -1.048280000000000101e+00 -3.762500000000000000e+01 -1.048285000000000133e+00 -3.765625000000000000e+01 -1.048290000000000166e+00 -3.756250000000000000e+01 -1.048294999999999977e+00 -3.759375381469726562e+01 -1.048300000000000010e+00 -3.762500000000000000e+01 -1.048305000000000042e+00 -3.756250000000000000e+01 -1.048310000000000075e+00 -3.762500000000000000e+01 -1.048315000000000108e+00 -3.759375381469726562e+01 -1.048320000000000141e+00 -3.759375381469726562e+01 -1.048325000000000173e+00 -3.759375381469726562e+01 -1.048329999999999984e+00 -3.756250000000000000e+01 -1.048335000000000017e+00 -3.756250000000000000e+01 -1.048340000000000050e+00 -3.753125000000000000e+01 -1.048345000000000082e+00 -3.753125000000000000e+01 -1.048350000000000115e+00 -3.753125000000000000e+01 -1.048355000000000148e+00 -3.750000000000000000e+01 -1.048360000000000181e+00 -3.756250000000000000e+01 -1.048364999999999991e+00 -3.753125000000000000e+01 -1.048370000000000024e+00 -3.753125000000000000e+01 -1.048375000000000057e+00 -3.750000000000000000e+01 -1.048380000000000090e+00 -3.750000000000000000e+01 -1.048385000000000122e+00 -3.746875000000000000e+01 -1.048390000000000155e+00 -3.743750381469726562e+01 -1.048395000000000188e+00 -3.750000000000000000e+01 -1.048399999999999999e+00 -3.750000000000000000e+01 -1.048405000000000031e+00 -3.746875000000000000e+01 -1.048410000000000064e+00 -3.750000000000000000e+01 -1.048415000000000097e+00 -3.743750381469726562e+01 -1.048420000000000130e+00 -3.746875000000000000e+01 -1.048425000000000162e+00 -3.750000000000000000e+01 -1.048430000000000195e+00 -3.746875000000000000e+01 -1.048435000000000006e+00 -3.743750381469726562e+01 -1.048440000000000039e+00 -3.746875000000000000e+01 -1.048445000000000071e+00 -3.743750381469726562e+01 -1.048450000000000104e+00 -3.746875000000000000e+01 -1.048455000000000137e+00 -3.746875000000000000e+01 -1.048460000000000170e+00 -3.743750381469726562e+01 -1.048464999999999980e+00 -3.743750381469726562e+01 -1.048470000000000013e+00 -3.743750381469726562e+01 -1.048475000000000046e+00 -3.746875000000000000e+01 -1.048480000000000079e+00 -3.746875000000000000e+01 -1.048485000000000111e+00 -3.743750381469726562e+01 -1.048490000000000144e+00 -3.740625000000000000e+01 -1.048495000000000177e+00 -3.734375000000000000e+01 -1.048499999999999988e+00 -3.737500000000000000e+01 -1.048505000000000020e+00 -3.743750381469726562e+01 -1.048510000000000053e+00 -3.737500000000000000e+01 -1.048515000000000086e+00 -3.734375000000000000e+01 -1.048520000000000119e+00 -3.740625000000000000e+01 -1.048525000000000151e+00 -3.740625000000000000e+01 -1.048530000000000184e+00 -3.737500000000000000e+01 -1.048534999999999995e+00 -3.737500000000000000e+01 -1.048540000000000028e+00 -3.737500000000000000e+01 -1.048545000000000060e+00 -3.740625000000000000e+01 -1.048550000000000093e+00 -3.740625000000000000e+01 -1.048555000000000126e+00 -3.737500000000000000e+01 -1.048560000000000159e+00 -3.740625000000000000e+01 -1.048565000000000191e+00 -3.740625000000000000e+01 -1.048570000000000002e+00 -3.737500000000000000e+01 -1.048575000000000035e+00 -3.740625000000000000e+01 -1.048580000000000068e+00 -3.731250000000000000e+01 -1.048585000000000100e+00 -3.734375000000000000e+01 -1.048590000000000133e+00 -3.728125381469726562e+01 -1.048595000000000166e+00 -3.731250000000000000e+01 -1.048599999999999977e+00 -3.746875000000000000e+01 -1.048605000000000009e+00 -3.734375000000000000e+01 -1.048610000000000042e+00 -3.731250000000000000e+01 -1.048615000000000075e+00 -3.734375000000000000e+01 -1.048620000000000108e+00 -3.737500000000000000e+01 -1.048625000000000140e+00 -3.728125381469726562e+01 -1.048630000000000173e+00 -3.728125381469726562e+01 -1.048634999999999984e+00 -3.728125381469726562e+01 -1.048640000000000017e+00 -3.725000000000000000e+01 -1.048645000000000049e+00 -3.728125381469726562e+01 -1.048650000000000082e+00 -3.728125381469726562e+01 -1.048655000000000115e+00 -3.725000000000000000e+01 -1.048660000000000148e+00 -3.728125381469726562e+01 -1.048665000000000180e+00 -3.731250000000000000e+01 -1.048669999999999991e+00 -3.725000000000000000e+01 -1.048675000000000024e+00 -3.728125381469726562e+01 -1.048680000000000057e+00 -3.715625000000000000e+01 -1.048685000000000089e+00 -3.721875000000000000e+01 -1.048690000000000122e+00 -3.721875000000000000e+01 -1.048695000000000155e+00 -3.715625000000000000e+01 -1.048700000000000188e+00 -3.721875000000000000e+01 -1.048704999999999998e+00 -3.721875000000000000e+01 -1.048710000000000031e+00 -3.718750000000000000e+01 -1.048715000000000064e+00 -3.721875000000000000e+01 -1.048720000000000097e+00 -3.721875000000000000e+01 -1.048725000000000129e+00 -3.721875000000000000e+01 -1.048730000000000162e+00 -3.721875000000000000e+01 -1.048735000000000195e+00 -3.721875000000000000e+01 -1.048740000000000006e+00 -3.718750000000000000e+01 -1.048745000000000038e+00 -3.718750000000000000e+01 -1.048750000000000071e+00 -3.718750000000000000e+01 -1.048755000000000104e+00 -3.715625000000000000e+01 -1.048760000000000137e+00 -3.715625000000000000e+01 -1.048765000000000169e+00 -3.718750000000000000e+01 -1.048769999999999980e+00 -3.718750000000000000e+01 -1.048775000000000013e+00 -3.709375000000000000e+01 -1.048780000000000046e+00 -3.725000000000000000e+01 -1.048785000000000078e+00 -3.718750000000000000e+01 -1.048790000000000111e+00 -3.728125381469726562e+01 -1.048795000000000144e+00 -3.712500381469726562e+01 -1.048800000000000177e+00 -3.715625000000000000e+01 -1.048804999999999987e+00 -3.715625000000000000e+01 -1.048810000000000020e+00 -3.715625000000000000e+01 -1.048815000000000053e+00 -3.718750000000000000e+01 -1.048820000000000086e+00 -3.715625000000000000e+01 -1.048825000000000118e+00 -3.715625000000000000e+01 -1.048830000000000151e+00 -3.718750000000000000e+01 -1.048835000000000184e+00 -3.709375000000000000e+01 -1.048839999999999995e+00 -3.709375000000000000e+01 -1.048845000000000027e+00 -3.709375000000000000e+01 -1.048850000000000060e+00 -3.709375000000000000e+01 -1.048855000000000093e+00 -3.706250000000000000e+01 -1.048860000000000126e+00 -3.706250000000000000e+01 -1.048865000000000158e+00 -3.706250000000000000e+01 -1.048870000000000191e+00 -3.709375000000000000e+01 -1.048875000000000002e+00 -3.709375000000000000e+01 -1.048880000000000035e+00 -3.700000000000000000e+01 -1.048885000000000067e+00 -3.700000000000000000e+01 -1.048890000000000100e+00 -3.703125381469726562e+01 -1.048895000000000133e+00 -3.706250000000000000e+01 -1.048900000000000166e+00 -3.703125381469726562e+01 -1.048904999999999976e+00 -3.700000000000000000e+01 -1.048910000000000009e+00 -3.703125381469726562e+01 -1.048915000000000042e+00 -3.700000000000000000e+01 -1.048920000000000075e+00 -3.700000000000000000e+01 -1.048925000000000107e+00 -3.703125381469726562e+01 -1.048930000000000140e+00 -3.696875000000000000e+01 -1.048935000000000173e+00 -3.703125381469726562e+01 -1.048939999999999984e+00 -3.700000000000000000e+01 -1.048945000000000016e+00 -3.700000000000000000e+01 -1.048950000000000049e+00 -3.693750000000000000e+01 -1.048955000000000082e+00 -3.700000000000000000e+01 -1.048960000000000115e+00 -3.696875000000000000e+01 -1.048965000000000147e+00 -3.700000000000000000e+01 -1.048970000000000180e+00 -3.700000000000000000e+01 -1.048974999999999991e+00 -3.693750000000000000e+01 -1.048980000000000024e+00 -3.693750000000000000e+01 -1.048985000000000056e+00 -3.696875000000000000e+01 -1.048990000000000089e+00 -3.700000000000000000e+01 -1.048995000000000122e+00 -3.696875000000000000e+01 -1.049000000000000155e+00 -3.696875000000000000e+01 -1.049005000000000187e+00 -3.693750000000000000e+01 -1.049009999999999998e+00 -3.693750000000000000e+01 -1.049015000000000031e+00 -3.696875000000000000e+01 -1.049020000000000064e+00 -3.700000000000000000e+01 -1.049025000000000096e+00 -3.693750000000000000e+01 -1.049030000000000129e+00 -3.696875000000000000e+01 -1.049035000000000162e+00 -3.696875000000000000e+01 -1.049040000000000195e+00 -3.696875000000000000e+01 -1.049045000000000005e+00 -3.696875000000000000e+01 -1.049050000000000038e+00 -3.690625000000000000e+01 -1.049055000000000071e+00 -3.693750000000000000e+01 -1.049060000000000104e+00 -3.696875000000000000e+01 -1.049065000000000136e+00 -3.690625000000000000e+01 -1.049070000000000169e+00 -3.693750000000000000e+01 -1.049074999999999980e+00 -3.696875000000000000e+01 -1.049080000000000013e+00 -3.690625000000000000e+01 -1.049085000000000045e+00 -3.684375000000000000e+01 -1.049090000000000078e+00 -3.690625000000000000e+01 -1.049095000000000111e+00 -3.687500381469726562e+01 -1.049100000000000144e+00 -3.690625000000000000e+01 -1.049105000000000176e+00 -3.693750000000000000e+01 -1.049109999999999987e+00 -3.693750000000000000e+01 -1.049115000000000020e+00 -3.690625000000000000e+01 -1.049120000000000053e+00 -3.693750000000000000e+01 -1.049125000000000085e+00 -3.690625000000000000e+01 -1.049130000000000118e+00 -3.687500381469726562e+01 -1.049135000000000151e+00 -3.684375000000000000e+01 -1.049140000000000184e+00 -3.684375000000000000e+01 -1.049144999999999994e+00 -3.684375000000000000e+01 -1.049150000000000027e+00 -3.684375000000000000e+01 -1.049155000000000060e+00 -3.684375000000000000e+01 -1.049160000000000093e+00 -3.684375000000000000e+01 -1.049165000000000125e+00 -3.681250000000000000e+01 -1.049170000000000158e+00 -3.687500381469726562e+01 -1.049175000000000191e+00 -3.693750000000000000e+01 -1.049180000000000001e+00 -3.687500381469726562e+01 -1.049185000000000034e+00 -3.681250000000000000e+01 -1.049190000000000067e+00 -3.681250000000000000e+01 -1.049195000000000100e+00 -3.681250000000000000e+01 -1.049200000000000133e+00 -3.681250000000000000e+01 -1.049205000000000165e+00 -3.678125000000000000e+01 -1.049209999999999976e+00 -3.675000000000000000e+01 -1.049215000000000009e+00 -3.675000000000000000e+01 -1.049220000000000041e+00 -3.678125000000000000e+01 -1.049225000000000074e+00 -3.678125000000000000e+01 -1.049230000000000107e+00 -3.681250000000000000e+01 -1.049235000000000140e+00 -3.678125000000000000e+01 -1.049240000000000173e+00 -3.671875381469726562e+01 -1.049244999999999983e+00 -3.678125000000000000e+01 -1.049250000000000016e+00 -3.671875381469726562e+01 -1.049255000000000049e+00 -3.671875381469726562e+01 -1.049260000000000081e+00 -3.675000000000000000e+01 -1.049265000000000114e+00 -3.671875381469726562e+01 -1.049270000000000147e+00 -3.681250000000000000e+01 -1.049275000000000180e+00 -3.678125000000000000e+01 -1.049279999999999990e+00 -3.665625000000000000e+01 -1.049285000000000023e+00 -3.671875381469726562e+01 -1.049290000000000056e+00 -3.668750000000000000e+01 -1.049295000000000089e+00 -3.668750000000000000e+01 -1.049300000000000122e+00 -3.675000000000000000e+01 -1.049305000000000154e+00 -3.665625000000000000e+01 -1.049310000000000187e+00 -3.678125000000000000e+01 -1.049314999999999998e+00 -3.665625000000000000e+01 -1.049320000000000030e+00 -3.665625000000000000e+01 -1.049325000000000063e+00 -3.665625000000000000e+01 -1.049330000000000096e+00 -3.671875381469726562e+01 -1.049335000000000129e+00 -3.668750000000000000e+01 -1.049340000000000162e+00 -3.662500000000000000e+01 -1.049345000000000194e+00 -3.662500000000000000e+01 -1.049350000000000005e+00 -3.659375000000000000e+01 -1.049355000000000038e+00 -3.665625000000000000e+01 -1.049360000000000070e+00 -3.662500000000000000e+01 -1.049365000000000103e+00 -3.662500000000000000e+01 -1.049370000000000136e+00 -3.659375000000000000e+01 -1.049375000000000169e+00 -3.656250381469726562e+01 -1.049379999999999979e+00 -3.665625000000000000e+01 -1.049385000000000012e+00 -3.659375000000000000e+01 -1.049390000000000045e+00 -3.656250381469726562e+01 -1.049395000000000078e+00 -3.656250381469726562e+01 -1.049400000000000110e+00 -3.659375000000000000e+01 -1.049405000000000143e+00 -3.665625000000000000e+01 -1.049410000000000176e+00 -3.656250381469726562e+01 -1.049414999999999987e+00 -3.653125000000000000e+01 -1.049420000000000019e+00 -3.659375000000000000e+01 -1.049425000000000052e+00 -3.650000000000000000e+01 -1.049430000000000085e+00 -3.656250381469726562e+01 -1.049435000000000118e+00 -3.653125000000000000e+01 -1.049440000000000150e+00 -3.659375000000000000e+01 -1.049445000000000183e+00 -3.653125000000000000e+01 -1.049449999999999994e+00 -3.659375000000000000e+01 -1.049455000000000027e+00 -3.665625000000000000e+01 -1.049460000000000059e+00 -3.653125000000000000e+01 -1.049465000000000092e+00 -3.653125000000000000e+01 -1.049470000000000125e+00 -3.656250381469726562e+01 -1.049475000000000158e+00 -3.656250381469726562e+01 -1.049480000000000190e+00 -3.653125000000000000e+01 -1.049485000000000001e+00 -3.650000000000000000e+01 -1.049490000000000034e+00 -3.646875000000000000e+01 -1.049495000000000067e+00 -3.653125000000000000e+01 -1.049500000000000099e+00 -3.646875000000000000e+01 -1.049505000000000132e+00 -3.653125000000000000e+01 -1.049510000000000165e+00 -3.653125000000000000e+01 -1.049514999999999976e+00 -3.653125000000000000e+01 -1.049520000000000008e+00 -3.650000000000000000e+01 -1.049525000000000041e+00 -3.646875000000000000e+01 -1.049530000000000074e+00 -3.643750000000000000e+01 -1.049535000000000107e+00 -3.643750000000000000e+01 -1.049540000000000139e+00 -3.650000000000000000e+01 -1.049545000000000172e+00 -3.643750000000000000e+01 -1.049549999999999983e+00 -3.650000000000000000e+01 -1.049555000000000016e+00 -3.643750000000000000e+01 -1.049560000000000048e+00 -3.643750000000000000e+01 -1.049565000000000081e+00 -3.640625381469726562e+01 -1.049570000000000114e+00 -3.643750000000000000e+01 -1.049575000000000147e+00 -3.640625381469726562e+01 -1.049580000000000179e+00 -3.640625381469726562e+01 -1.049584999999999990e+00 -3.637500000000000000e+01 -1.049590000000000023e+00 -3.640625381469726562e+01 -1.049595000000000056e+00 -3.637500000000000000e+01 -1.049600000000000088e+00 -3.631250000000000000e+01 -1.049605000000000121e+00 -3.634375000000000000e+01 -1.049610000000000154e+00 -3.640625381469726562e+01 -1.049615000000000187e+00 -3.634375000000000000e+01 -1.049619999999999997e+00 -3.634375000000000000e+01 -1.049625000000000030e+00 -3.628125000000000000e+01 -1.049630000000000063e+00 -3.628125000000000000e+01 -1.049635000000000096e+00 -3.634375000000000000e+01 -1.049640000000000128e+00 -3.628125000000000000e+01 -1.049645000000000161e+00 -3.631250000000000000e+01 -1.049650000000000194e+00 -3.631250000000000000e+01 -1.049655000000000005e+00 -3.628125000000000000e+01 -1.049660000000000037e+00 -3.634375000000000000e+01 -1.049665000000000070e+00 -3.628125000000000000e+01 -1.049670000000000103e+00 -3.628125000000000000e+01 -1.049675000000000136e+00 -3.628125000000000000e+01 -1.049680000000000168e+00 -3.621875000000000000e+01 -1.049684999999999979e+00 -3.625000000000000000e+01 -1.049690000000000012e+00 -3.628125000000000000e+01 -1.049695000000000045e+00 -3.625000000000000000e+01 -1.049700000000000077e+00 -3.625000000000000000e+01 -1.049705000000000110e+00 -3.621875000000000000e+01 -1.049710000000000143e+00 -3.618750000000000000e+01 -1.049715000000000176e+00 -3.628125000000000000e+01 -1.049719999999999986e+00 -3.618750000000000000e+01 -1.049725000000000019e+00 -3.625000000000000000e+01 -1.049730000000000052e+00 -3.618750000000000000e+01 -1.049735000000000085e+00 -3.628125000000000000e+01 -1.049740000000000117e+00 -3.621875000000000000e+01 -1.049745000000000150e+00 -3.625000000000000000e+01 -1.049750000000000183e+00 -3.628125000000000000e+01 -1.049754999999999994e+00 -3.621875000000000000e+01 -1.049760000000000026e+00 -3.618750000000000000e+01 -1.049765000000000059e+00 -3.618750000000000000e+01 -1.049770000000000092e+00 -3.618750000000000000e+01 -1.049775000000000125e+00 -3.615625381469726562e+01 -1.049780000000000157e+00 -3.618750000000000000e+01 -1.049785000000000190e+00 -3.612500000000000000e+01 -1.049790000000000001e+00 -3.618750000000000000e+01 -1.049795000000000034e+00 -3.612500000000000000e+01 -1.049800000000000066e+00 -3.615625381469726562e+01 -1.049805000000000099e+00 -3.618750000000000000e+01 -1.049810000000000132e+00 -3.615625381469726562e+01 -1.049815000000000165e+00 -3.618750000000000000e+01 -1.049819999999999975e+00 -3.612500000000000000e+01 -1.049825000000000008e+00 -3.615625381469726562e+01 -1.049830000000000041e+00 -3.609375000000000000e+01 -1.049835000000000074e+00 -3.609375000000000000e+01 -1.049840000000000106e+00 -3.609375000000000000e+01 -1.049845000000000139e+00 -3.609375000000000000e+01 -1.049850000000000172e+00 -3.606250000000000000e+01 -1.049854999999999983e+00 -3.612500000000000000e+01 -1.049860000000000015e+00 -3.618750000000000000e+01 -1.049865000000000048e+00 -3.615625381469726562e+01 -1.049870000000000081e+00 -3.609375000000000000e+01 -1.049875000000000114e+00 -3.615625381469726562e+01 -1.049880000000000146e+00 -3.612500000000000000e+01 -1.049885000000000179e+00 -3.615625381469726562e+01 -1.049889999999999990e+00 -3.609375000000000000e+01 -1.049895000000000023e+00 -3.603125000000000000e+01 -1.049900000000000055e+00 -3.606250000000000000e+01 -1.049905000000000088e+00 -3.609375000000000000e+01 -1.049910000000000121e+00 -3.609375000000000000e+01 -1.049915000000000154e+00 -3.606250000000000000e+01 -1.049920000000000186e+00 -3.603125000000000000e+01 -1.049924999999999997e+00 -3.606250000000000000e+01 -1.049930000000000030e+00 -3.606250000000000000e+01 -1.049935000000000063e+00 -3.606250000000000000e+01 -1.049940000000000095e+00 -3.603125000000000000e+01 -1.049945000000000128e+00 -3.606250000000000000e+01 -1.049950000000000161e+00 -3.609375000000000000e+01 -1.049955000000000194e+00 -3.600000381469726562e+01 -1.049960000000000004e+00 -3.603125000000000000e+01 -1.049965000000000037e+00 -3.603125000000000000e+01 -1.049970000000000070e+00 -3.606250000000000000e+01 -1.049975000000000103e+00 -3.596875000000000000e+01 -1.049980000000000135e+00 -3.606250000000000000e+01 -1.049985000000000168e+00 -3.603125000000000000e+01 -1.049989999999999979e+00 -3.596875000000000000e+01 -1.049995000000000012e+00 -3.603125000000000000e+01 -1.050000000000000044e+00 -3.603125000000000000e+01 -1.050005000000000077e+00 -3.596875000000000000e+01 -1.050010000000000110e+00 -3.600000381469726562e+01 -1.050015000000000143e+00 -3.600000381469726562e+01 -1.050020000000000175e+00 -3.596875000000000000e+01 -1.050024999999999986e+00 -3.596875000000000000e+01 -1.050030000000000019e+00 -3.593750000000000000e+01 -1.050035000000000052e+00 -3.600000381469726562e+01 -1.050040000000000084e+00 -3.590625000000000000e+01 -1.050045000000000117e+00 -3.593750000000000000e+01 -1.050050000000000150e+00 -3.596875000000000000e+01 -1.050055000000000183e+00 -3.596875000000000000e+01 -1.050059999999999993e+00 -3.593750000000000000e+01 -1.050065000000000026e+00 -3.590625000000000000e+01 -1.050070000000000059e+00 -3.590625000000000000e+01 -1.050075000000000092e+00 -3.584375381469726562e+01 -1.050080000000000124e+00 -3.587500000000000000e+01 -1.050085000000000157e+00 -3.590625000000000000e+01 -1.050090000000000190e+00 -3.590625000000000000e+01 -1.050095000000000001e+00 -3.590625000000000000e+01 -1.050100000000000033e+00 -3.596875000000000000e+01 -1.050105000000000066e+00 -3.593750000000000000e+01 -1.050110000000000099e+00 -3.590625000000000000e+01 -1.050115000000000132e+00 -3.593750000000000000e+01 -1.050120000000000164e+00 -3.593750000000000000e+01 -1.050124999999999975e+00 -3.596875000000000000e+01 -1.050130000000000008e+00 -3.590625000000000000e+01 -1.050135000000000041e+00 -3.587500000000000000e+01 -1.050140000000000073e+00 -3.593750000000000000e+01 -1.050145000000000106e+00 -3.587500000000000000e+01 -1.050150000000000139e+00 -3.587500000000000000e+01 -1.050155000000000172e+00 -3.590625000000000000e+01 -1.050159999999999982e+00 -3.584375381469726562e+01 -1.050165000000000015e+00 -3.587500000000000000e+01 -1.050170000000000048e+00 -3.587500000000000000e+01 -1.050175000000000081e+00 -3.584375381469726562e+01 -1.050180000000000113e+00 -3.593750000000000000e+01 -1.050185000000000146e+00 -3.581250000000000000e+01 -1.050190000000000179e+00 -3.584375381469726562e+01 -1.050194999999999990e+00 -3.587500000000000000e+01 -1.050200000000000022e+00 -3.584375381469726562e+01 -1.050205000000000055e+00 -3.590625000000000000e+01 -1.050210000000000088e+00 -3.590625000000000000e+01 -1.050215000000000121e+00 -3.587500000000000000e+01 -1.050220000000000153e+00 -3.590625000000000000e+01 -1.050225000000000186e+00 -3.587500000000000000e+01 -1.050229999999999997e+00 -3.587500000000000000e+01 -1.050235000000000030e+00 -3.581250000000000000e+01 -1.050240000000000062e+00 -3.587500000000000000e+01 -1.050245000000000095e+00 -3.575000000000000000e+01 -1.050250000000000128e+00 -3.584375381469726562e+01 -1.050255000000000161e+00 -3.575000000000000000e+01 -1.050260000000000193e+00 -3.578125000000000000e+01 -1.050265000000000004e+00 -3.584375381469726562e+01 -1.050270000000000037e+00 -3.584375381469726562e+01 -1.050275000000000070e+00 -3.584375381469726562e+01 -1.050280000000000102e+00 -3.584375381469726562e+01 -1.050285000000000135e+00 -3.578125000000000000e+01 -1.050290000000000168e+00 -3.584375381469726562e+01 -1.050294999999999979e+00 -3.578125000000000000e+01 -1.050300000000000011e+00 -3.578125000000000000e+01 -1.050305000000000044e+00 -3.584375381469726562e+01 -1.050310000000000077e+00 -3.581250000000000000e+01 -1.050315000000000110e+00 -3.578125000000000000e+01 -1.050320000000000142e+00 -3.578125000000000000e+01 -1.050325000000000175e+00 -3.581250000000000000e+01 -1.050329999999999986e+00 -3.581250000000000000e+01 -1.050335000000000019e+00 -3.578125000000000000e+01 -1.050340000000000051e+00 -3.575000000000000000e+01 -1.050345000000000084e+00 -3.578125000000000000e+01 -1.050350000000000117e+00 -3.575000000000000000e+01 -1.050355000000000150e+00 -3.578125000000000000e+01 -1.050360000000000182e+00 -3.575000000000000000e+01 -1.050364999999999993e+00 -3.578125000000000000e+01 -1.050370000000000026e+00 -3.578125000000000000e+01 -1.050375000000000059e+00 -3.581250000000000000e+01 -1.050380000000000091e+00 -3.571875000000000000e+01 -1.050385000000000124e+00 -3.575000000000000000e+01 -1.050390000000000157e+00 -3.571875000000000000e+01 -1.050395000000000190e+00 -3.571875000000000000e+01 -1.050400000000000000e+00 -3.575000000000000000e+01 -1.050405000000000033e+00 -3.571875000000000000e+01 -1.050410000000000066e+00 -3.568750381469726562e+01 -1.050415000000000099e+00 -3.571875000000000000e+01 -1.050420000000000131e+00 -3.571875000000000000e+01 -1.050425000000000164e+00 -3.571875000000000000e+01 -1.050430000000000197e+00 -3.571875000000000000e+01 -1.050435000000000008e+00 -3.571875000000000000e+01 -1.050440000000000040e+00 -3.565625000000000000e+01 -1.050445000000000073e+00 -3.568750381469726562e+01 -1.050450000000000106e+00 -3.562500000000000000e+01 -1.050455000000000139e+00 -3.568750381469726562e+01 -1.050460000000000171e+00 -3.565625000000000000e+01 -1.050464999999999982e+00 -3.568750381469726562e+01 -1.050470000000000015e+00 -3.568750381469726562e+01 -1.050475000000000048e+00 -3.571875000000000000e+01 -1.050480000000000080e+00 -3.565625000000000000e+01 -1.050485000000000113e+00 -3.565625000000000000e+01 -1.050490000000000146e+00 -3.571875000000000000e+01 -1.050495000000000179e+00 -3.568750381469726562e+01 -1.050499999999999989e+00 -3.571875000000000000e+01 -1.050505000000000022e+00 -3.565625000000000000e+01 -1.050510000000000055e+00 -3.565625000000000000e+01 -1.050515000000000088e+00 -3.568750381469726562e+01 -1.050520000000000120e+00 -3.559375000000000000e+01 -1.050525000000000153e+00 -3.571875000000000000e+01 -1.050530000000000186e+00 -3.568750381469726562e+01 -1.050534999999999997e+00 -3.568750381469726562e+01 -1.050540000000000029e+00 -3.565625000000000000e+01 -1.050545000000000062e+00 -3.565625000000000000e+01 -1.050550000000000095e+00 -3.571875000000000000e+01 -1.050555000000000128e+00 -3.565625000000000000e+01 -1.050560000000000160e+00 -3.568750381469726562e+01 -1.050565000000000193e+00 -3.568750381469726562e+01 -1.050570000000000004e+00 -3.562500000000000000e+01 -1.050575000000000037e+00 -3.562500000000000000e+01 -1.050580000000000069e+00 -3.559375000000000000e+01 -1.050585000000000102e+00 -3.562500000000000000e+01 -1.050590000000000135e+00 -3.562500000000000000e+01 -1.050595000000000168e+00 -3.565625000000000000e+01 -1.050599999999999978e+00 -3.565625000000000000e+01 -1.050605000000000011e+00 -3.562500000000000000e+01 -1.050610000000000044e+00 -3.556250000000000000e+01 -1.050615000000000077e+00 -3.565625000000000000e+01 -1.050620000000000109e+00 -3.559375000000000000e+01 -1.050625000000000142e+00 -3.562500000000000000e+01 -1.050630000000000175e+00 -3.562500000000000000e+01 -1.050634999999999986e+00 -3.565625000000000000e+01 -1.050640000000000018e+00 -3.559375000000000000e+01 -1.050645000000000051e+00 -3.559375000000000000e+01 -1.050650000000000084e+00 -3.565625000000000000e+01 -1.050655000000000117e+00 -3.565625000000000000e+01 -1.050660000000000149e+00 -3.562500000000000000e+01 -1.050665000000000182e+00 -3.556250000000000000e+01 -1.050669999999999993e+00 -3.568750381469726562e+01 -1.050675000000000026e+00 -3.565625000000000000e+01 -1.050680000000000058e+00 -3.559375000000000000e+01 -1.050685000000000091e+00 -3.562500000000000000e+01 -1.050690000000000124e+00 -3.559375000000000000e+01 -1.050695000000000157e+00 -3.562500000000000000e+01 -1.050700000000000189e+00 -3.562500000000000000e+01 -1.050705000000000000e+00 -3.565625000000000000e+01 -1.050710000000000033e+00 -3.559375000000000000e+01 -1.050715000000000066e+00 -3.559375000000000000e+01 -1.050720000000000098e+00 -3.562500000000000000e+01 -1.050725000000000131e+00 -3.559375000000000000e+01 -1.050730000000000164e+00 -3.559375000000000000e+01 -1.050735000000000197e+00 -3.562500000000000000e+01 -1.050740000000000007e+00 -3.559375000000000000e+01 -1.050745000000000040e+00 -3.556250000000000000e+01 -1.050750000000000073e+00 -3.559375000000000000e+01 -1.050755000000000106e+00 -3.559375000000000000e+01 -1.050760000000000138e+00 -3.556250000000000000e+01 -1.050765000000000171e+00 -3.565625000000000000e+01 -1.050769999999999982e+00 -3.565625000000000000e+01 -1.050775000000000015e+00 -3.559375000000000000e+01 -1.050780000000000047e+00 -3.562500000000000000e+01 -1.050785000000000080e+00 -3.562500000000000000e+01 -1.050790000000000113e+00 -3.565625000000000000e+01 -1.050795000000000146e+00 -3.562500000000000000e+01 -1.050800000000000178e+00 -3.556250000000000000e+01 -1.050804999999999989e+00 -3.565625000000000000e+01 -1.050810000000000022e+00 -3.559375000000000000e+01 -1.050815000000000055e+00 -3.559375000000000000e+01 -1.050820000000000087e+00 -3.559375000000000000e+01 -1.050825000000000120e+00 -3.556250000000000000e+01 -1.050830000000000153e+00 -3.553125381469726562e+01 -1.050835000000000186e+00 -3.559375000000000000e+01 -1.050839999999999996e+00 -3.565625000000000000e+01 -1.050845000000000029e+00 -3.559375000000000000e+01 -1.050850000000000062e+00 -3.556250000000000000e+01 -1.050855000000000095e+00 -3.565625000000000000e+01 -1.050860000000000127e+00 -3.559375000000000000e+01 -1.050865000000000160e+00 -3.559375000000000000e+01 -1.050870000000000193e+00 -3.559375000000000000e+01 -1.050875000000000004e+00 -3.562500000000000000e+01 -1.050880000000000036e+00 -3.553125381469726562e+01 -1.050885000000000069e+00 -3.553125381469726562e+01 -1.050890000000000102e+00 -3.556250000000000000e+01 -1.050895000000000135e+00 -3.556250000000000000e+01 -1.050900000000000167e+00 -3.553125381469726562e+01 -1.050904999999999978e+00 -3.553125381469726562e+01 -1.050910000000000011e+00 -3.559375000000000000e+01 -1.050915000000000044e+00 -3.550000000000000000e+01 -1.050920000000000076e+00 -3.556250000000000000e+01 -1.050925000000000109e+00 -3.559375000000000000e+01 -1.050930000000000142e+00 -3.562500000000000000e+01 -1.050935000000000175e+00 -3.556250000000000000e+01 -1.050939999999999985e+00 -3.559375000000000000e+01 -1.050945000000000018e+00 -3.565625000000000000e+01 -1.050950000000000051e+00 -3.553125381469726562e+01 -1.050955000000000084e+00 -3.556250000000000000e+01 -1.050960000000000116e+00 -3.559375000000000000e+01 -1.050965000000000149e+00 -3.553125381469726562e+01 -1.050970000000000182e+00 -3.556250000000000000e+01 -1.050974999999999993e+00 -3.553125381469726562e+01 -1.050980000000000025e+00 -3.553125381469726562e+01 -1.050985000000000058e+00 -3.556250000000000000e+01 -1.050990000000000091e+00 -3.546875000000000000e+01 -1.050995000000000124e+00 -3.556250000000000000e+01 -1.051000000000000156e+00 -3.553125381469726562e+01 -1.051005000000000189e+00 -3.553125381469726562e+01 -1.051010000000000000e+00 -3.550000000000000000e+01 -1.051015000000000033e+00 -3.553125381469726562e+01 -1.051020000000000065e+00 -3.553125381469726562e+01 -1.051025000000000098e+00 -3.550000000000000000e+01 -1.051030000000000131e+00 -3.546875000000000000e+01 -1.051035000000000164e+00 -3.546875000000000000e+01 -1.051040000000000196e+00 -3.543750381469726562e+01 -1.051045000000000007e+00 -3.553125381469726562e+01 -1.051050000000000040e+00 -3.543750381469726562e+01 -1.051055000000000073e+00 -3.550000000000000000e+01 -1.051060000000000105e+00 -3.546875000000000000e+01 -1.051065000000000138e+00 -3.546875000000000000e+01 -1.051070000000000171e+00 -3.546875000000000000e+01 -1.051074999999999982e+00 -3.550000000000000000e+01 -1.051080000000000014e+00 -3.540625000000000000e+01 -1.051085000000000047e+00 -3.543750381469726562e+01 -1.051090000000000080e+00 -3.534375000000000000e+01 -1.051095000000000113e+00 -3.543750381469726562e+01 -1.051100000000000145e+00 -3.534375000000000000e+01 -1.051105000000000178e+00 -3.537500000000000000e+01 -1.051109999999999989e+00 -3.537500000000000000e+01 -1.051115000000000022e+00 -3.537500000000000000e+01 -1.051120000000000054e+00 -3.537500000000000000e+01 -1.051125000000000087e+00 -3.537500000000000000e+01 -1.051130000000000120e+00 -3.540625000000000000e+01 -1.051135000000000153e+00 -3.534375000000000000e+01 -1.051140000000000185e+00 -3.534375000000000000e+01 -1.051144999999999996e+00 -3.537500000000000000e+01 -1.051150000000000029e+00 -3.540625000000000000e+01 -1.051155000000000062e+00 -3.540625000000000000e+01 -1.051160000000000094e+00 -3.534375000000000000e+01 -1.051165000000000127e+00 -3.534375000000000000e+01 -1.051170000000000160e+00 -3.534375000000000000e+01 -1.051175000000000193e+00 -3.531250000000000000e+01 -1.051180000000000003e+00 -3.531250000000000000e+01 -1.051185000000000036e+00 -3.534375000000000000e+01 -1.051190000000000069e+00 -3.528125381469726562e+01 -1.051195000000000102e+00 -3.528125381469726562e+01 -1.051200000000000134e+00 -3.531250000000000000e+01 -1.051205000000000167e+00 -3.528125381469726562e+01 -1.051209999999999978e+00 -3.525000000000000000e+01 -1.051215000000000011e+00 -3.521875000000000000e+01 -1.051220000000000043e+00 -3.521875000000000000e+01 -1.051225000000000076e+00 -3.518750000000000000e+01 -1.051230000000000109e+00 -3.518750000000000000e+01 -1.051235000000000142e+00 -3.521875000000000000e+01 -1.051240000000000174e+00 -3.518750000000000000e+01 -1.051244999999999985e+00 -3.525000000000000000e+01 -1.051250000000000018e+00 -3.525000000000000000e+01 -1.051255000000000051e+00 -3.518750000000000000e+01 -1.051260000000000083e+00 -3.521875000000000000e+01 -1.051265000000000116e+00 -3.518750000000000000e+01 -1.051270000000000149e+00 -3.515625000000000000e+01 -1.051275000000000182e+00 -3.515625000000000000e+01 -1.051279999999999992e+00 -3.515625000000000000e+01 -1.051285000000000025e+00 -3.515625000000000000e+01 -1.051290000000000058e+00 -3.515625000000000000e+01 -1.051295000000000091e+00 -3.512500381469726562e+01 -1.051300000000000123e+00 -3.515625000000000000e+01 -1.051305000000000156e+00 -3.512500381469726562e+01 -1.051310000000000189e+00 -3.509375000000000000e+01 -1.051315000000000000e+00 -3.515625000000000000e+01 -1.051320000000000032e+00 -3.506250000000000000e+01 -1.051325000000000065e+00 -3.509375000000000000e+01 -1.051330000000000098e+00 -3.512500381469726562e+01 -1.051335000000000131e+00 -3.503125000000000000e+01 -1.051340000000000163e+00 -3.509375000000000000e+01 -1.051345000000000196e+00 -3.512500381469726562e+01 -1.051350000000000007e+00 -3.506250000000000000e+01 -1.051355000000000040e+00 -3.506250000000000000e+01 -1.051360000000000072e+00 -3.503125000000000000e+01 -1.051365000000000105e+00 -3.509375000000000000e+01 -1.051370000000000138e+00 -3.506250000000000000e+01 -1.051375000000000171e+00 -3.512500381469726562e+01 -1.051379999999999981e+00 -3.506250000000000000e+01 -1.051385000000000014e+00 -3.503125000000000000e+01 -1.051390000000000047e+00 -3.500000000000000000e+01 -1.051395000000000080e+00 -3.503125000000000000e+01 -1.051400000000000112e+00 -3.503125000000000000e+01 -1.051405000000000145e+00 -3.503125000000000000e+01 -1.051410000000000178e+00 -3.509375000000000000e+01 -1.051414999999999988e+00 -3.500000000000000000e+01 -1.051420000000000021e+00 -3.500000000000000000e+01 -1.051425000000000054e+00 -3.503125000000000000e+01 -1.051430000000000087e+00 -3.503125000000000000e+01 -1.051435000000000120e+00 -3.503125000000000000e+01 -1.051440000000000152e+00 -3.503125000000000000e+01 -1.051445000000000185e+00 -3.503125000000000000e+01 -1.051449999999999996e+00 -3.500000000000000000e+01 -1.051455000000000028e+00 -3.503125000000000000e+01 -1.051460000000000061e+00 -3.496875381469726562e+01 -1.051465000000000094e+00 -3.500000000000000000e+01 -1.051470000000000127e+00 -3.503125000000000000e+01 -1.051475000000000160e+00 -3.500000000000000000e+01 -1.051480000000000192e+00 -3.503125000000000000e+01 -1.051485000000000003e+00 -3.500000000000000000e+01 -1.051490000000000036e+00 -3.500000000000000000e+01 -1.051495000000000068e+00 -3.500000000000000000e+01 -1.051500000000000101e+00 -3.500000000000000000e+01 -1.051505000000000134e+00 -3.500000000000000000e+01 -1.051510000000000167e+00 -3.503125000000000000e+01 -1.051514999999999977e+00 -3.496875381469726562e+01 -1.051520000000000010e+00 -3.496875381469726562e+01 -1.051525000000000043e+00 -3.503125000000000000e+01 -1.051530000000000076e+00 -3.500000000000000000e+01 -1.051535000000000108e+00 -3.500000000000000000e+01 -1.051540000000000141e+00 -3.500000000000000000e+01 -1.051545000000000174e+00 -3.493750000000000000e+01 -1.051549999999999985e+00 -3.496875381469726562e+01 -1.051555000000000017e+00 -3.496875381469726562e+01 -1.051560000000000050e+00 -3.490625000000000000e+01 -1.051565000000000083e+00 -3.490625000000000000e+01 -1.051570000000000116e+00 -3.493750000000000000e+01 -1.051575000000000149e+00 -3.490625000000000000e+01 -1.051580000000000181e+00 -3.493750000000000000e+01 -1.051584999999999992e+00 -3.490625000000000000e+01 -1.051590000000000025e+00 -3.493750000000000000e+01 -1.051595000000000057e+00 -3.490625000000000000e+01 -1.051600000000000090e+00 -3.493750000000000000e+01 -1.051605000000000123e+00 -3.493750000000000000e+01 -1.051610000000000156e+00 -3.490625000000000000e+01 -1.051615000000000189e+00 -3.493750000000000000e+01 -1.051619999999999999e+00 -3.487500000000000000e+01 -1.051625000000000032e+00 -3.487500000000000000e+01 -1.051630000000000065e+00 -3.481250381469726562e+01 -1.051635000000000097e+00 -3.484375000000000000e+01 -1.051640000000000130e+00 -3.484375000000000000e+01 -1.051645000000000163e+00 -3.481250381469726562e+01 -1.051650000000000196e+00 -3.490625000000000000e+01 -1.051655000000000006e+00 -3.484375000000000000e+01 -1.051660000000000039e+00 -3.487500000000000000e+01 -1.051665000000000072e+00 -3.478125000000000000e+01 -1.051670000000000105e+00 -3.487500000000000000e+01 -1.051675000000000137e+00 -3.484375000000000000e+01 -1.051680000000000170e+00 -3.475000000000000000e+01 -1.051684999999999981e+00 -3.484375000000000000e+01 -1.051690000000000014e+00 -3.484375000000000000e+01 -1.051695000000000046e+00 -3.481250381469726562e+01 -1.051700000000000079e+00 -3.478125000000000000e+01 -1.051705000000000112e+00 -3.481250381469726562e+01 -1.051710000000000145e+00 -3.478125000000000000e+01 -1.051715000000000177e+00 -3.487500000000000000e+01 -1.051719999999999988e+00 -3.481250381469726562e+01 -1.051725000000000021e+00 -3.478125000000000000e+01 -1.051730000000000054e+00 -3.478125000000000000e+01 -1.051735000000000086e+00 -3.478125000000000000e+01 -1.051740000000000119e+00 -3.484375000000000000e+01 -1.051745000000000152e+00 -3.481250381469726562e+01 -1.051750000000000185e+00 -3.475000000000000000e+01 -1.051754999999999995e+00 -3.475000000000000000e+01 -1.051760000000000028e+00 -3.478125000000000000e+01 -1.051765000000000061e+00 -3.475000000000000000e+01 -1.051770000000000094e+00 -3.471875000000000000e+01 -1.051775000000000126e+00 -3.478125000000000000e+01 -1.051780000000000159e+00 -3.481250381469726562e+01 -1.051785000000000192e+00 -3.475000000000000000e+01 -1.051790000000000003e+00 -3.465625000000000000e+01 -1.051795000000000035e+00 -3.471875000000000000e+01 -1.051800000000000068e+00 -3.465625000000000000e+01 -1.051805000000000101e+00 -3.471875000000000000e+01 -1.051810000000000134e+00 -3.471875000000000000e+01 -1.051815000000000166e+00 -3.468750000000000000e+01 -1.051819999999999977e+00 -3.468750000000000000e+01 -1.051825000000000010e+00 -3.465625000000000000e+01 -1.051830000000000043e+00 -3.478125000000000000e+01 -1.051835000000000075e+00 -3.465625000000000000e+01 -1.051840000000000108e+00 -3.471875000000000000e+01 -1.051845000000000141e+00 -3.465625000000000000e+01 -1.051850000000000174e+00 -3.462500000000000000e+01 -1.051854999999999984e+00 -3.471875000000000000e+01 -1.051860000000000017e+00 -3.465625000000000000e+01 -1.051865000000000050e+00 -3.462500000000000000e+01 -1.051870000000000083e+00 -3.462500000000000000e+01 -1.051875000000000115e+00 -3.459375000000000000e+01 -1.051880000000000148e+00 -3.459375000000000000e+01 -1.051885000000000181e+00 -3.462500000000000000e+01 -1.051889999999999992e+00 -3.453125000000000000e+01 -1.051895000000000024e+00 -3.462500000000000000e+01 -1.051900000000000057e+00 -3.453125000000000000e+01 -1.051905000000000090e+00 -3.453125000000000000e+01 -1.051910000000000123e+00 -3.459375000000000000e+01 -1.051915000000000155e+00 -3.462500000000000000e+01 -1.051920000000000188e+00 -3.453125000000000000e+01 -1.051924999999999999e+00 -3.456250381469726562e+01 -1.051930000000000032e+00 -3.459375000000000000e+01 -1.051935000000000064e+00 -3.456250381469726562e+01 -1.051940000000000097e+00 -3.450000000000000000e+01 -1.051945000000000130e+00 -3.450000000000000000e+01 -1.051950000000000163e+00 -3.453125000000000000e+01 -1.051955000000000195e+00 -3.459375000000000000e+01 -1.051960000000000006e+00 -3.453125000000000000e+01 -1.051965000000000039e+00 -3.446875000000000000e+01 -1.051970000000000072e+00 -3.450000000000000000e+01 -1.051975000000000104e+00 -3.446875000000000000e+01 -1.051980000000000137e+00 -3.446875000000000000e+01 -1.051985000000000170e+00 -3.446875000000000000e+01 -1.051989999999999981e+00 -3.443750000000000000e+01 -1.051995000000000013e+00 -3.450000000000000000e+01 -1.052000000000000046e+00 -3.443750000000000000e+01 -1.052005000000000079e+00 -3.434375000000000000e+01 -1.052010000000000112e+00 -3.443750000000000000e+01 -1.052015000000000144e+00 -3.443750000000000000e+01 -1.052020000000000177e+00 -3.437500000000000000e+01 -1.052024999999999988e+00 -3.437500000000000000e+01 -1.052030000000000021e+00 -3.431250000000000000e+01 -1.052035000000000053e+00 -3.443750000000000000e+01 -1.052040000000000086e+00 -3.434375000000000000e+01 -1.052045000000000119e+00 -3.434375000000000000e+01 -1.052050000000000152e+00 -3.434375000000000000e+01 -1.052055000000000184e+00 -3.428125000000000000e+01 -1.052059999999999995e+00 -3.431250000000000000e+01 -1.052065000000000028e+00 -3.428125000000000000e+01 -1.052070000000000061e+00 -3.431250000000000000e+01 -1.052075000000000093e+00 -3.425000381469726562e+01 -1.052080000000000126e+00 -3.428125000000000000e+01 -1.052085000000000159e+00 -3.428125000000000000e+01 -1.052090000000000192e+00 -3.428125000000000000e+01 -1.052095000000000002e+00 -3.425000381469726562e+01 -1.052100000000000035e+00 -3.425000381469726562e+01 -1.052105000000000068e+00 -3.421875000000000000e+01 -1.052110000000000101e+00 -3.428125000000000000e+01 -1.052115000000000133e+00 -3.428125000000000000e+01 -1.052120000000000166e+00 -3.421875000000000000e+01 -1.052124999999999977e+00 -3.425000381469726562e+01 -1.052130000000000010e+00 -3.421875000000000000e+01 -1.052135000000000042e+00 -3.415625000000000000e+01 -1.052140000000000075e+00 -3.418750000000000000e+01 -1.052145000000000108e+00 -3.418750000000000000e+01 -1.052150000000000141e+00 -3.418750000000000000e+01 -1.052155000000000173e+00 -3.415625000000000000e+01 -1.052159999999999984e+00 -3.415625000000000000e+01 -1.052165000000000017e+00 -3.421875000000000000e+01 -1.052170000000000050e+00 -3.418750000000000000e+01 -1.052175000000000082e+00 -3.418750000000000000e+01 -1.052180000000000115e+00 -3.425000381469726562e+01 -1.052185000000000148e+00 -3.418750000000000000e+01 -1.052190000000000181e+00 -3.421875000000000000e+01 -1.052194999999999991e+00 -3.418750000000000000e+01 -1.052200000000000024e+00 -3.412500000000000000e+01 -1.052205000000000057e+00 -3.418750000000000000e+01 -1.052210000000000090e+00 -3.418750000000000000e+01 -1.052215000000000122e+00 -3.415625000000000000e+01 -1.052220000000000155e+00 -3.415625000000000000e+01 -1.052225000000000188e+00 -3.415625000000000000e+01 -1.052229999999999999e+00 -3.415625000000000000e+01 -1.052235000000000031e+00 -3.412500000000000000e+01 -1.052240000000000064e+00 -3.406250000000000000e+01 -1.052245000000000097e+00 -3.409375381469726562e+01 -1.052250000000000130e+00 -3.415625000000000000e+01 -1.052255000000000162e+00 -3.412500000000000000e+01 -1.052260000000000195e+00 -3.409375381469726562e+01 -1.052265000000000006e+00 -3.409375381469726562e+01 -1.052270000000000039e+00 -3.403125000000000000e+01 -1.052275000000000071e+00 -3.406250000000000000e+01 -1.052280000000000104e+00 -3.403125000000000000e+01 -1.052285000000000137e+00 -3.403125000000000000e+01 -1.052290000000000170e+00 -3.406250000000000000e+01 -1.052294999999999980e+00 -3.403125000000000000e+01 -1.052300000000000013e+00 -3.406250000000000000e+01 -1.052305000000000046e+00 -3.403125000000000000e+01 -1.052310000000000079e+00 -3.403125000000000000e+01 -1.052315000000000111e+00 -3.400000000000000000e+01 -1.052320000000000144e+00 -3.400000000000000000e+01 -1.052325000000000177e+00 -3.396875000000000000e+01 -1.052329999999999988e+00 -3.400000000000000000e+01 -1.052335000000000020e+00 -3.393750000000000000e+01 -1.052340000000000053e+00 -3.403125000000000000e+01 -1.052345000000000086e+00 -3.403125000000000000e+01 -1.052350000000000119e+00 -3.396875000000000000e+01 -1.052355000000000151e+00 -3.396875000000000000e+01 -1.052360000000000184e+00 -3.390625000000000000e+01 -1.052364999999999995e+00 -3.393750000000000000e+01 -1.052370000000000028e+00 -3.393750000000000000e+01 -1.052375000000000060e+00 -3.396875000000000000e+01 -1.052380000000000093e+00 -3.396875000000000000e+01 -1.052385000000000126e+00 -3.400000000000000000e+01 -1.052390000000000159e+00 -3.390625000000000000e+01 -1.052395000000000191e+00 -3.390625000000000000e+01 -1.052400000000000002e+00 -3.396875000000000000e+01 -1.052405000000000035e+00 -3.390625000000000000e+01 -1.052410000000000068e+00 -3.381250000000000000e+01 -1.052415000000000100e+00 -3.390625000000000000e+01 -1.052420000000000133e+00 -3.390625000000000000e+01 -1.052425000000000166e+00 -3.387500000000000000e+01 -1.052429999999999977e+00 -3.387500000000000000e+01 -1.052435000000000009e+00 -3.384375381469726562e+01 -1.052440000000000042e+00 -3.384375381469726562e+01 -1.052445000000000075e+00 -3.387500000000000000e+01 -1.052450000000000108e+00 -3.387500000000000000e+01 -1.052455000000000140e+00 -3.387500000000000000e+01 -1.052460000000000173e+00 -3.381250000000000000e+01 -1.052464999999999984e+00 -3.384375381469726562e+01 -1.052470000000000017e+00 -3.393750000000000000e+01 -1.052475000000000049e+00 -3.387500000000000000e+01 -1.052480000000000082e+00 -3.384375381469726562e+01 -1.052485000000000115e+00 -3.384375381469726562e+01 -1.052490000000000148e+00 -3.381250000000000000e+01 -1.052495000000000180e+00 -3.375000000000000000e+01 -1.052499999999999991e+00 -3.378125000000000000e+01 -1.052505000000000024e+00 -3.384375381469726562e+01 -1.052510000000000057e+00 -3.375000000000000000e+01 -1.052515000000000089e+00 -3.384375381469726562e+01 -1.052520000000000122e+00 -3.378125000000000000e+01 -1.052525000000000155e+00 -3.378125000000000000e+01 -1.052530000000000188e+00 -3.384375381469726562e+01 -1.052534999999999998e+00 -3.381250000000000000e+01 -1.052540000000000031e+00 -3.378125000000000000e+01 -1.052545000000000064e+00 -3.378125000000000000e+01 -1.052550000000000097e+00 -3.378125000000000000e+01 -1.052555000000000129e+00 -3.378125000000000000e+01 -1.052560000000000162e+00 -3.381250000000000000e+01 -1.052565000000000195e+00 -3.378125000000000000e+01 -1.052570000000000006e+00 -3.378125000000000000e+01 -1.052575000000000038e+00 -3.384375381469726562e+01 -1.052580000000000071e+00 -3.375000000000000000e+01 -1.052585000000000104e+00 -3.378125000000000000e+01 -1.052590000000000137e+00 -3.378125000000000000e+01 -1.052595000000000169e+00 -3.368750381469726562e+01 -1.052599999999999980e+00 -3.368750381469726562e+01 -1.052605000000000013e+00 -3.371875000000000000e+01 -1.052610000000000046e+00 -3.378125000000000000e+01 -1.052615000000000078e+00 -3.368750381469726562e+01 -1.052620000000000111e+00 -3.375000000000000000e+01 -1.052625000000000144e+00 -3.371875000000000000e+01 -1.052630000000000177e+00 -3.371875000000000000e+01 -1.052634999999999987e+00 -3.368750381469726562e+01 -1.052640000000000020e+00 -3.371875000000000000e+01 -1.052645000000000053e+00 -3.365625000000000000e+01 -1.052650000000000086e+00 -3.365625000000000000e+01 -1.052655000000000118e+00 -3.365625000000000000e+01 -1.052660000000000151e+00 -3.371875000000000000e+01 -1.052665000000000184e+00 -3.371875000000000000e+01 -1.052669999999999995e+00 -3.365625000000000000e+01 -1.052675000000000027e+00 -3.368750381469726562e+01 -1.052680000000000060e+00 -3.375000000000000000e+01 -1.052685000000000093e+00 -3.362500000000000000e+01 -1.052690000000000126e+00 -3.368750381469726562e+01 -1.052695000000000158e+00 -3.365625000000000000e+01 -1.052700000000000191e+00 -3.368750381469726562e+01 -1.052705000000000002e+00 -3.368750381469726562e+01 -1.052710000000000035e+00 -3.368750381469726562e+01 -1.052715000000000067e+00 -3.365625000000000000e+01 -1.052720000000000100e+00 -3.365625000000000000e+01 -1.052725000000000133e+00 -3.365625000000000000e+01 -1.052730000000000166e+00 -3.362500000000000000e+01 -1.052734999999999976e+00 -3.365625000000000000e+01 -1.052740000000000009e+00 -3.365625000000000000e+01 -1.052745000000000042e+00 -3.362500000000000000e+01 -1.052750000000000075e+00 -3.359375000000000000e+01 -1.052755000000000107e+00 -3.362500000000000000e+01 -1.052760000000000140e+00 -3.362500000000000000e+01 -1.052765000000000173e+00 -3.356250000000000000e+01 -1.052769999999999984e+00 -3.356250000000000000e+01 -1.052775000000000016e+00 -3.353125381469726562e+01 -1.052780000000000049e+00 -3.359375000000000000e+01 -1.052785000000000082e+00 -3.359375000000000000e+01 -1.052790000000000115e+00 -3.359375000000000000e+01 -1.052795000000000147e+00 -3.350000000000000000e+01 -1.052800000000000180e+00 -3.359375000000000000e+01 -1.052804999999999991e+00 -3.356250000000000000e+01 -1.052810000000000024e+00 -3.353125381469726562e+01 -1.052815000000000056e+00 -3.353125381469726562e+01 -1.052820000000000089e+00 -3.353125381469726562e+01 -1.052825000000000122e+00 -3.353125381469726562e+01 -1.052830000000000155e+00 -3.353125381469726562e+01 -1.052835000000000187e+00 -3.350000000000000000e+01 -1.052839999999999998e+00 -3.346875000000000000e+01 -1.052845000000000031e+00 -3.343750000000000000e+01 -1.052850000000000064e+00 -3.353125381469726562e+01 -1.052855000000000096e+00 -3.350000000000000000e+01 -1.052860000000000129e+00 -3.343750000000000000e+01 -1.052865000000000162e+00 -3.353125381469726562e+01 -1.052870000000000195e+00 -3.340625000000000000e+01 -1.052875000000000005e+00 -3.346875000000000000e+01 -1.052880000000000038e+00 -3.346875000000000000e+01 -1.052885000000000071e+00 -3.346875000000000000e+01 -1.052890000000000104e+00 -3.343750000000000000e+01 -1.052895000000000136e+00 -3.346875000000000000e+01 -1.052900000000000169e+00 -3.343750000000000000e+01 -1.052904999999999980e+00 -3.340625000000000000e+01 -1.052910000000000013e+00 -3.340625000000000000e+01 -1.052915000000000045e+00 -3.343750000000000000e+01 -1.052920000000000078e+00 -3.343750000000000000e+01 -1.052925000000000111e+00 -3.340625000000000000e+01 -1.052930000000000144e+00 -3.346875000000000000e+01 -1.052935000000000176e+00 -3.337500381469726562e+01 -1.052939999999999987e+00 -3.334375000000000000e+01 -1.052945000000000020e+00 -3.343750000000000000e+01 -1.052950000000000053e+00 -3.331250000000000000e+01 -1.052955000000000085e+00 -3.337500381469726562e+01 -1.052960000000000118e+00 -3.334375000000000000e+01 -1.052965000000000151e+00 -3.334375000000000000e+01 -1.052970000000000184e+00 -3.331250000000000000e+01 -1.052974999999999994e+00 -3.337500381469726562e+01 -1.052980000000000027e+00 -3.334375000000000000e+01 -1.052985000000000060e+00 -3.334375000000000000e+01 -1.052990000000000093e+00 -3.334375000000000000e+01 -1.052995000000000125e+00 -3.337500381469726562e+01 -1.053000000000000158e+00 -3.334375000000000000e+01 -1.053005000000000191e+00 -3.325000000000000000e+01 -1.053010000000000002e+00 -3.331250000000000000e+01 -1.053015000000000034e+00 -3.328125000000000000e+01 -1.053020000000000067e+00 -3.328125000000000000e+01 -1.053025000000000100e+00 -3.331250000000000000e+01 -1.053030000000000133e+00 -3.331250000000000000e+01 -1.053035000000000165e+00 -3.321875381469726562e+01 -1.053039999999999976e+00 -3.331250000000000000e+01 -1.053045000000000009e+00 -3.334375000000000000e+01 -1.053050000000000042e+00 -3.328125000000000000e+01 -1.053055000000000074e+00 -3.328125000000000000e+01 -1.053060000000000107e+00 -3.321875381469726562e+01 -1.053065000000000140e+00 -3.325000000000000000e+01 -1.053070000000000173e+00 -3.325000000000000000e+01 -1.053074999999999983e+00 -3.325000000000000000e+01 -1.053080000000000016e+00 -3.325000000000000000e+01 -1.053085000000000049e+00 -3.328125000000000000e+01 -1.053090000000000082e+00 -3.325000000000000000e+01 -1.053095000000000114e+00 -3.325000000000000000e+01 -1.053100000000000147e+00 -3.325000000000000000e+01 -1.053105000000000180e+00 -3.321875381469726562e+01 -1.053109999999999991e+00 -3.331250000000000000e+01 -1.053115000000000023e+00 -3.328125000000000000e+01 -1.053120000000000056e+00 -3.321875381469726562e+01 -1.053125000000000089e+00 -3.321875381469726562e+01 -1.053130000000000122e+00 -3.318750000000000000e+01 -1.053135000000000154e+00 -3.321875381469726562e+01 -1.053140000000000187e+00 -3.321875381469726562e+01 -1.053144999999999998e+00 -3.321875381469726562e+01 -1.053150000000000031e+00 -3.321875381469726562e+01 -1.053155000000000063e+00 -3.328125000000000000e+01 -1.053160000000000096e+00 -3.315625000000000000e+01 -1.053165000000000129e+00 -3.325000000000000000e+01 -1.053170000000000162e+00 -3.318750000000000000e+01 -1.053175000000000194e+00 -3.318750000000000000e+01 -1.053180000000000005e+00 -3.318750000000000000e+01 -1.053185000000000038e+00 -3.321875381469726562e+01 -1.053190000000000071e+00 -3.315625000000000000e+01 -1.053195000000000103e+00 -3.321875381469726562e+01 -1.053200000000000136e+00 -3.318750000000000000e+01 -1.053205000000000169e+00 -3.318750000000000000e+01 -1.053209999999999980e+00 -3.321875381469726562e+01 -1.053215000000000012e+00 -3.321875381469726562e+01 -1.053220000000000045e+00 -3.318750000000000000e+01 -1.053225000000000078e+00 -3.321875381469726562e+01 -1.053230000000000111e+00 -3.315625000000000000e+01 -1.053235000000000143e+00 -3.315625000000000000e+01 -1.053240000000000176e+00 -3.312500381469726562e+01 -1.053244999999999987e+00 -3.309375000000000000e+01 -1.053250000000000020e+00 -3.315625000000000000e+01 -1.053255000000000052e+00 -3.315625000000000000e+01 -1.053260000000000085e+00 -3.315625000000000000e+01 -1.053265000000000118e+00 -3.309375000000000000e+01 -1.053270000000000151e+00 -3.312500381469726562e+01 -1.053275000000000183e+00 -3.318750000000000000e+01 -1.053279999999999994e+00 -3.315625000000000000e+01 -1.053285000000000027e+00 -3.315625000000000000e+01 -1.053290000000000060e+00 -3.306250000000000000e+01 -1.053295000000000092e+00 -3.309375000000000000e+01 -1.053300000000000125e+00 -3.312500381469726562e+01 -1.053305000000000158e+00 -3.303125000000000000e+01 -1.053310000000000191e+00 -3.312500381469726562e+01 -1.053315000000000001e+00 -3.315625000000000000e+01 -1.053320000000000034e+00 -3.309375000000000000e+01 -1.053325000000000067e+00 -3.309375000000000000e+01 -1.053330000000000100e+00 -3.303125000000000000e+01 -1.053335000000000132e+00 -3.303125000000000000e+01 -1.053340000000000165e+00 -3.309375000000000000e+01 -1.053344999999999976e+00 -3.303125000000000000e+01 -1.053350000000000009e+00 -3.303125000000000000e+01 -1.053355000000000041e+00 -3.303125000000000000e+01 -1.053360000000000074e+00 -3.309375000000000000e+01 -1.053365000000000107e+00 -3.300000000000000000e+01 -1.053370000000000140e+00 -3.300000000000000000e+01 -1.053375000000000172e+00 -3.303125000000000000e+01 -1.053379999999999983e+00 -3.303125000000000000e+01 -1.053385000000000016e+00 -3.300000000000000000e+01 -1.053390000000000049e+00 -3.300000000000000000e+01 -1.053395000000000081e+00 -3.300000000000000000e+01 -1.053400000000000114e+00 -3.300000000000000000e+01 -1.053405000000000147e+00 -3.303125000000000000e+01 -1.053410000000000180e+00 -3.300000000000000000e+01 -1.053414999999999990e+00 -3.300000000000000000e+01 -1.053420000000000023e+00 -3.300000000000000000e+01 -1.053425000000000056e+00 -3.296875381469726562e+01 -1.053430000000000089e+00 -3.300000000000000000e+01 -1.053435000000000121e+00 -3.296875381469726562e+01 -1.053440000000000154e+00 -3.296875381469726562e+01 -1.053445000000000187e+00 -3.293750000000000000e+01 -1.053449999999999998e+00 -3.296875381469726562e+01 -1.053455000000000030e+00 -3.300000000000000000e+01 -1.053460000000000063e+00 -3.290625000000000000e+01 -1.053465000000000096e+00 -3.296875381469726562e+01 -1.053470000000000129e+00 -3.296875381469726562e+01 -1.053475000000000161e+00 -3.290625000000000000e+01 -1.053480000000000194e+00 -3.293750000000000000e+01 -1.053485000000000005e+00 -3.290625000000000000e+01 -1.053490000000000038e+00 -3.287500000000000000e+01 -1.053495000000000070e+00 -3.290625000000000000e+01 -1.053500000000000103e+00 -3.284375000000000000e+01 -1.053505000000000136e+00 -3.290625000000000000e+01 -1.053510000000000169e+00 -3.287500000000000000e+01 -1.053514999999999979e+00 -3.293750000000000000e+01 -1.053520000000000012e+00 -3.287500000000000000e+01 -1.053525000000000045e+00 -3.296875381469726562e+01 -1.053530000000000078e+00 -3.290625000000000000e+01 -1.053535000000000110e+00 -3.287500000000000000e+01 -1.053540000000000143e+00 -3.290625000000000000e+01 -1.053545000000000176e+00 -3.290625000000000000e+01 -1.053549999999999986e+00 -3.290625000000000000e+01 -1.053555000000000019e+00 -3.290625000000000000e+01 -1.053560000000000052e+00 -3.284375000000000000e+01 -1.053565000000000085e+00 -3.281250381469726562e+01 -1.053570000000000118e+00 -3.284375000000000000e+01 -1.053575000000000150e+00 -3.278125000000000000e+01 -1.053580000000000183e+00 -3.290625000000000000e+01 -1.053584999999999994e+00 -3.281250381469726562e+01 -1.053590000000000027e+00 -3.278125000000000000e+01 -1.053595000000000059e+00 -3.281250381469726562e+01 -1.053600000000000092e+00 -3.281250381469726562e+01 -1.053605000000000125e+00 -3.278125000000000000e+01 -1.053610000000000158e+00 -3.284375000000000000e+01 -1.053615000000000190e+00 -3.281250381469726562e+01 -1.053620000000000001e+00 -3.275000000000000000e+01 -1.053625000000000034e+00 -3.271875000000000000e+01 -1.053630000000000067e+00 -3.275000000000000000e+01 -1.053635000000000099e+00 -3.271875000000000000e+01 -1.053640000000000132e+00 -3.268750000000000000e+01 -1.053645000000000165e+00 -3.278125000000000000e+01 -1.053649999999999975e+00 -3.268750000000000000e+01 -1.053655000000000008e+00 -3.265625381469726562e+01 -1.053660000000000041e+00 -3.271875000000000000e+01 -1.053665000000000074e+00 -3.275000000000000000e+01 -1.053670000000000107e+00 -3.271875000000000000e+01 -1.053675000000000139e+00 -3.275000000000000000e+01 -1.053680000000000172e+00 -3.271875000000000000e+01 -1.053684999999999983e+00 -3.265625381469726562e+01 -1.053690000000000015e+00 -3.265625381469726562e+01 -1.053695000000000048e+00 -3.265625381469726562e+01 -1.053700000000000081e+00 -3.265625381469726562e+01 -1.053705000000000114e+00 -3.265625381469726562e+01 -1.053710000000000147e+00 -3.265625381469726562e+01 -1.053715000000000179e+00 -3.265625381469726562e+01 -1.053719999999999990e+00 -3.262500000000000000e+01 -1.053725000000000023e+00 -3.262500000000000000e+01 -1.053730000000000055e+00 -3.265625381469726562e+01 -1.053735000000000088e+00 -3.259375000000000000e+01 -1.053740000000000121e+00 -3.268750000000000000e+01 -1.053745000000000154e+00 -3.265625381469726562e+01 -1.053750000000000187e+00 -3.262500000000000000e+01 -1.053754999999999997e+00 -3.268750000000000000e+01 -1.053760000000000030e+00 -3.262500000000000000e+01 -1.053765000000000063e+00 -3.262500000000000000e+01 -1.053770000000000095e+00 -3.262500000000000000e+01 -1.053775000000000128e+00 -3.256250000000000000e+01 -1.053780000000000161e+00 -3.256250000000000000e+01 -1.053785000000000194e+00 -3.259375000000000000e+01 -1.053790000000000004e+00 -3.256250000000000000e+01 -1.053795000000000037e+00 -3.250000381469726562e+01 -1.053800000000000070e+00 -3.256250000000000000e+01 -1.053805000000000103e+00 -3.256250000000000000e+01 -1.053810000000000136e+00 -3.259375000000000000e+01 -1.053815000000000168e+00 -3.256250000000000000e+01 -1.053819999999999979e+00 -3.256250000000000000e+01 -1.053825000000000012e+00 -3.253125000000000000e+01 -1.053830000000000044e+00 -3.256250000000000000e+01 -1.053835000000000077e+00 -3.256250000000000000e+01 -1.053840000000000110e+00 -3.259375000000000000e+01 -1.053845000000000143e+00 -3.256250000000000000e+01 -1.053850000000000176e+00 -3.253125000000000000e+01 -1.053854999999999986e+00 -3.259375000000000000e+01 -1.053860000000000019e+00 -3.253125000000000000e+01 -1.053865000000000052e+00 -3.253125000000000000e+01 -1.053870000000000084e+00 -3.256250000000000000e+01 -1.053875000000000117e+00 -3.259375000000000000e+01 -1.053880000000000150e+00 -3.259375000000000000e+01 -1.053885000000000183e+00 -3.256250000000000000e+01 -1.053889999999999993e+00 -3.253125000000000000e+01 -1.053895000000000026e+00 -3.250000381469726562e+01 -1.053900000000000059e+00 -3.250000381469726562e+01 -1.053905000000000092e+00 -3.256250000000000000e+01 -1.053910000000000124e+00 -3.250000381469726562e+01 -1.053915000000000157e+00 -3.253125000000000000e+01 -1.053920000000000190e+00 -3.250000381469726562e+01 -1.053925000000000001e+00 -3.253125000000000000e+01 -1.053930000000000033e+00 -3.253125000000000000e+01 -1.053935000000000066e+00 -3.250000381469726562e+01 -1.053940000000000099e+00 -3.250000381469726562e+01 -1.053945000000000132e+00 -3.250000381469726562e+01 -1.053950000000000164e+00 -3.253125000000000000e+01 -1.053954999999999975e+00 -3.250000381469726562e+01 -1.053960000000000008e+00 -3.246875000000000000e+01 -1.053965000000000041e+00 -3.250000381469726562e+01 -1.053970000000000073e+00 -3.250000381469726562e+01 -1.053975000000000106e+00 -3.250000381469726562e+01 -1.053980000000000139e+00 -3.250000381469726562e+01 -1.053985000000000172e+00 -3.250000381469726562e+01 -1.053989999999999982e+00 -3.253125000000000000e+01 -1.053995000000000015e+00 -3.246875000000000000e+01 -1.054000000000000048e+00 -3.246875000000000000e+01 -1.054005000000000081e+00 -3.250000381469726562e+01 -1.054010000000000113e+00 -3.246875000000000000e+01 -1.054015000000000146e+00 -3.243750000000000000e+01 -1.054020000000000179e+00 -3.243750000000000000e+01 -1.054024999999999990e+00 -3.246875000000000000e+01 -1.054030000000000022e+00 -3.253125000000000000e+01 -1.054035000000000055e+00 -3.246875000000000000e+01 -1.054040000000000088e+00 -3.246875000000000000e+01 -1.054045000000000121e+00 -3.246875000000000000e+01 -1.054050000000000153e+00 -3.243750000000000000e+01 -1.054055000000000186e+00 -3.246875000000000000e+01 -1.054059999999999997e+00 -3.243750000000000000e+01 -1.054065000000000030e+00 -3.243750000000000000e+01 -1.054070000000000062e+00 -3.246875000000000000e+01 -1.054075000000000095e+00 -3.243750000000000000e+01 -1.054080000000000128e+00 -3.243750000000000000e+01 -1.054085000000000161e+00 -3.243750000000000000e+01 -1.054090000000000193e+00 -3.240625000000000000e+01 -1.054095000000000004e+00 -3.243750000000000000e+01 -1.054100000000000037e+00 -3.240625000000000000e+01 -1.054105000000000070e+00 -3.237500000000000000e+01 -1.054110000000000102e+00 -3.237500000000000000e+01 -1.054115000000000135e+00 -3.240625000000000000e+01 -1.054120000000000168e+00 -3.234375000000000000e+01 -1.054124999999999979e+00 -3.240625000000000000e+01 -1.054130000000000011e+00 -3.246875000000000000e+01 -1.054135000000000044e+00 -3.234375000000000000e+01 -1.054140000000000077e+00 -3.237500000000000000e+01 -1.054145000000000110e+00 -3.234375000000000000e+01 -1.054150000000000142e+00 -3.234375000000000000e+01 -1.054155000000000175e+00 -3.231250000000000000e+01 -1.054159999999999986e+00 -3.234375000000000000e+01 -1.054165000000000019e+00 -3.234375000000000000e+01 -1.054170000000000051e+00 -3.231250000000000000e+01 -1.054175000000000084e+00 -3.234375000000000000e+01 -1.054180000000000117e+00 -3.231250000000000000e+01 -1.054185000000000150e+00 -3.234375000000000000e+01 -1.054190000000000182e+00 -3.228125000000000000e+01 -1.054194999999999993e+00 -3.234375000000000000e+01 -1.054200000000000026e+00 -3.228125000000000000e+01 -1.054205000000000059e+00 -3.228125000000000000e+01 -1.054210000000000091e+00 -3.228125000000000000e+01 -1.054215000000000124e+00 -3.234375000000000000e+01 -1.054220000000000157e+00 -3.231250000000000000e+01 -1.054225000000000190e+00 -3.225000381469726562e+01 -1.054230000000000000e+00 -3.225000381469726562e+01 -1.054235000000000033e+00 -3.225000381469726562e+01 -1.054240000000000066e+00 -3.221875000000000000e+01 -1.054245000000000099e+00 -3.218750000000000000e+01 -1.054250000000000131e+00 -3.228125000000000000e+01 -1.054255000000000164e+00 -3.221875000000000000e+01 -1.054260000000000197e+00 -3.228125000000000000e+01 -1.054265000000000008e+00 -3.221875000000000000e+01 -1.054270000000000040e+00 -3.225000381469726562e+01 -1.054275000000000073e+00 -3.225000381469726562e+01 -1.054280000000000106e+00 -3.225000381469726562e+01 -1.054285000000000139e+00 -3.218750000000000000e+01 -1.054290000000000171e+00 -3.225000381469726562e+01 -1.054294999999999982e+00 -3.218750000000000000e+01 -1.054300000000000015e+00 -3.218750000000000000e+01 -1.054305000000000048e+00 -3.221875000000000000e+01 -1.054310000000000080e+00 -3.218750000000000000e+01 -1.054315000000000113e+00 -3.221875000000000000e+01 -1.054320000000000146e+00 -3.215625000000000000e+01 -1.054325000000000179e+00 -3.215625000000000000e+01 -1.054329999999999989e+00 -3.218750000000000000e+01 -1.054335000000000022e+00 -3.212500000000000000e+01 -1.054340000000000055e+00 -3.215625000000000000e+01 -1.054345000000000088e+00 -3.218750000000000000e+01 -1.054350000000000120e+00 -3.218750000000000000e+01 -1.054355000000000153e+00 -3.221875000000000000e+01 -1.054360000000000186e+00 -3.218750000000000000e+01 -1.054364999999999997e+00 -3.215625000000000000e+01 -1.054370000000000029e+00 -3.215625000000000000e+01 -1.054375000000000062e+00 -3.218750000000000000e+01 -1.054380000000000095e+00 -3.218750000000000000e+01 -1.054385000000000128e+00 -3.215625000000000000e+01 -1.054390000000000160e+00 -3.215625000000000000e+01 -1.054395000000000193e+00 -3.203125000000000000e+01 -1.054400000000000004e+00 -3.212500000000000000e+01 -1.054405000000000037e+00 -3.209375381469726562e+01 -1.054410000000000069e+00 -3.212500000000000000e+01 -1.054415000000000102e+00 -3.215625000000000000e+01 -1.054420000000000135e+00 -3.215625000000000000e+01 -1.054425000000000168e+00 -3.209375381469726562e+01 -1.054429999999999978e+00 -3.212500000000000000e+01 -1.054435000000000011e+00 -3.209375381469726562e+01 -1.054440000000000044e+00 -3.212500000000000000e+01 -1.054445000000000077e+00 -3.209375381469726562e+01 -1.054450000000000109e+00 -3.215625000000000000e+01 -1.054455000000000142e+00 -3.209375381469726562e+01 -1.054460000000000175e+00 -3.212500000000000000e+01 -1.054464999999999986e+00 -3.206250000000000000e+01 -1.054470000000000018e+00 -3.209375381469726562e+01 -1.054475000000000051e+00 -3.215625000000000000e+01 -1.054480000000000084e+00 -3.203125000000000000e+01 -1.054485000000000117e+00 -3.203125000000000000e+01 -1.054490000000000149e+00 -3.209375381469726562e+01 -1.054495000000000182e+00 -3.209375381469726562e+01 -1.054499999999999993e+00 -3.203125000000000000e+01 -1.054505000000000026e+00 -3.203125000000000000e+01 -1.054510000000000058e+00 -3.203125000000000000e+01 -1.054515000000000091e+00 -3.203125000000000000e+01 -1.054520000000000124e+00 -3.206250000000000000e+01 -1.054525000000000157e+00 -3.203125000000000000e+01 -1.054530000000000189e+00 -3.206250000000000000e+01 -1.054535000000000000e+00 -3.203125000000000000e+01 -1.054540000000000033e+00 -3.203125000000000000e+01 -1.054545000000000066e+00 -3.203125000000000000e+01 -1.054550000000000098e+00 -3.203125000000000000e+01 -1.054555000000000131e+00 -3.203125000000000000e+01 -1.054560000000000164e+00 -3.203125000000000000e+01 -1.054565000000000197e+00 -3.203125000000000000e+01 -1.054570000000000007e+00 -3.203125000000000000e+01 -1.054575000000000040e+00 -3.203125000000000000e+01 -1.054580000000000073e+00 -3.203125000000000000e+01 -1.054585000000000106e+00 -3.209375381469726562e+01 -1.054590000000000138e+00 -3.203125000000000000e+01 -1.054595000000000171e+00 -3.203125000000000000e+01 -1.054599999999999982e+00 -3.203125000000000000e+01 -1.054605000000000015e+00 -3.203125000000000000e+01 -1.054610000000000047e+00 -3.196875000000000000e+01 -1.054615000000000080e+00 -3.203125000000000000e+01 -1.054620000000000113e+00 -3.196875000000000000e+01 -1.054625000000000146e+00 -3.203125000000000000e+01 -1.054630000000000178e+00 -3.196875000000000000e+01 -1.054634999999999989e+00 -3.203125000000000000e+01 -1.054640000000000022e+00 -3.203125000000000000e+01 -1.054645000000000055e+00 -3.203125000000000000e+01 -1.054650000000000087e+00 -3.203125000000000000e+01 -1.054655000000000120e+00 -3.203125000000000000e+01 -1.054660000000000153e+00 -3.203125000000000000e+01 -1.054665000000000186e+00 -3.203125000000000000e+01 -1.054669999999999996e+00 -3.203125000000000000e+01 -1.054675000000000029e+00 -3.203125000000000000e+01 -1.054680000000000062e+00 -3.193750190734863281e+01 -1.054685000000000095e+00 -3.193750190734863281e+01 -1.054690000000000127e+00 -3.187500000000000000e+01 -1.054695000000000160e+00 -3.193750190734863281e+01 -1.054700000000000193e+00 -3.190625000000000000e+01 -1.054705000000000004e+00 -3.196875000000000000e+01 -1.054710000000000036e+00 -3.200000000000000000e+01 -1.054715000000000069e+00 -3.190625000000000000e+01 -1.054720000000000102e+00 -3.184375190734863281e+01 -1.054725000000000135e+00 -3.193750190734863281e+01 -1.054730000000000167e+00 -3.200000000000000000e+01 -1.054734999999999978e+00 -3.187500000000000000e+01 -1.054740000000000011e+00 -3.184375190734863281e+01 -1.054745000000000044e+00 -3.184375190734863281e+01 -1.054750000000000076e+00 -3.184375190734863281e+01 -1.054755000000000109e+00 -3.184375190734863281e+01 -1.054760000000000142e+00 -3.184375190734863281e+01 -1.054765000000000175e+00 -3.184375190734863281e+01 -1.054769999999999985e+00 -3.190625000000000000e+01 -1.054775000000000018e+00 -3.181250000000000000e+01 -1.054780000000000051e+00 -3.187500000000000000e+01 -1.054785000000000084e+00 -3.187500000000000000e+01 -1.054790000000000116e+00 -3.187500000000000000e+01 -1.054795000000000149e+00 -3.181250000000000000e+01 -1.054800000000000182e+00 -3.187500000000000000e+01 -1.054804999999999993e+00 -3.184375190734863281e+01 -1.054810000000000025e+00 -3.184375190734863281e+01 -1.054815000000000058e+00 -3.178125190734863281e+01 -1.054820000000000091e+00 -3.181250000000000000e+01 -1.054825000000000124e+00 -3.178125190734863281e+01 -1.054830000000000156e+00 -3.184375190734863281e+01 -1.054835000000000189e+00 -3.181250000000000000e+01 -1.054840000000000000e+00 -3.175000190734863281e+01 -1.054845000000000033e+00 -3.178125190734863281e+01 -1.054850000000000065e+00 -3.175000190734863281e+01 -1.054855000000000098e+00 -3.168750190734863281e+01 -1.054860000000000131e+00 -3.175000190734863281e+01 -1.054865000000000164e+00 -3.171875000000000000e+01 -1.054870000000000196e+00 -3.171875000000000000e+01 -1.054875000000000007e+00 -3.175000190734863281e+01 -1.054880000000000040e+00 -3.171875000000000000e+01 -1.054885000000000073e+00 -3.181250000000000000e+01 -1.054890000000000105e+00 -3.175000190734863281e+01 -1.054895000000000138e+00 -3.168750190734863281e+01 -1.054900000000000171e+00 -3.175000190734863281e+01 -1.054904999999999982e+00 -3.178125190734863281e+01 -1.054910000000000014e+00 -3.181250000000000000e+01 -1.054915000000000047e+00 -3.171875000000000000e+01 -1.054920000000000080e+00 -3.171875000000000000e+01 -1.054925000000000113e+00 -3.171875000000000000e+01 -1.054930000000000145e+00 -3.171875000000000000e+01 -1.054935000000000178e+00 -3.171875000000000000e+01 -1.054939999999999989e+00 -3.165625000000000000e+01 -1.054945000000000022e+00 -3.171875000000000000e+01 -1.054950000000000054e+00 -3.171875000000000000e+01 -1.054955000000000087e+00 -3.162499809265136719e+01 -1.054960000000000120e+00 -3.168750190734863281e+01 -1.054965000000000153e+00 -3.168750190734863281e+01 -1.054970000000000185e+00 -3.162499809265136719e+01 -1.054974999999999996e+00 -3.162499809265136719e+01 -1.054980000000000029e+00 -3.159375190734863281e+01 -1.054985000000000062e+00 -3.162499809265136719e+01 -1.054990000000000094e+00 -3.165625000000000000e+01 -1.054995000000000127e+00 -3.156250000000000000e+01 -1.055000000000000160e+00 -3.159375190734863281e+01 -1.055005000000000193e+00 -3.159375190734863281e+01 -1.055010000000000003e+00 -3.159375190734863281e+01 -1.055015000000000036e+00 -3.162499809265136719e+01 -1.055020000000000069e+00 -3.156250000000000000e+01 -1.055025000000000102e+00 -3.156250000000000000e+01 -1.055030000000000134e+00 -3.153125190734863281e+01 -1.055035000000000167e+00 -3.150000000000000000e+01 -1.055039999999999978e+00 -3.153125190734863281e+01 -1.055045000000000011e+00 -3.146875000000000000e+01 -1.055050000000000043e+00 -3.153125190734863281e+01 -1.055055000000000076e+00 -3.150000000000000000e+01 -1.055060000000000109e+00 -3.146875000000000000e+01 -1.055065000000000142e+00 -3.150000000000000000e+01 -1.055070000000000174e+00 -3.150000000000000000e+01 -1.055074999999999985e+00 -3.146875000000000000e+01 -1.055080000000000018e+00 -3.143750190734863281e+01 -1.055085000000000051e+00 -3.150000000000000000e+01 -1.055090000000000083e+00 -3.146875000000000000e+01 -1.055095000000000116e+00 -3.143750190734863281e+01 -1.055100000000000149e+00 -3.143750190734863281e+01 -1.055105000000000182e+00 -3.146875000000000000e+01 -1.055109999999999992e+00 -3.150000000000000000e+01 -1.055115000000000025e+00 -3.137500190734863281e+01 -1.055120000000000058e+00 -3.140625000000000000e+01 -1.055125000000000091e+00 -3.150000000000000000e+01 -1.055130000000000123e+00 -3.146875000000000000e+01 -1.055135000000000156e+00 -3.146875000000000000e+01 -1.055140000000000189e+00 -3.137500190734863281e+01 -1.055145000000000000e+00 -3.146875000000000000e+01 -1.055150000000000032e+00 -3.137500190734863281e+01 -1.055155000000000065e+00 -3.143750190734863281e+01 -1.055160000000000098e+00 -3.143750190734863281e+01 -1.055165000000000131e+00 -3.143750190734863281e+01 -1.055170000000000163e+00 -3.134375000000000000e+01 -1.055175000000000196e+00 -3.140625000000000000e+01 -1.055180000000000007e+00 -3.134375000000000000e+01 -1.055185000000000040e+00 -3.134375000000000000e+01 -1.055190000000000072e+00 -3.128125190734863281e+01 -1.055195000000000105e+00 -3.134375000000000000e+01 -1.055200000000000138e+00 -3.134375000000000000e+01 -1.055205000000000171e+00 -3.137500190734863281e+01 -1.055209999999999981e+00 -3.128125190734863281e+01 -1.055215000000000014e+00 -3.128125190734863281e+01 -1.055220000000000047e+00 -3.121875000000000000e+01 -1.055225000000000080e+00 -3.128125190734863281e+01 -1.055230000000000112e+00 -3.131250000000000000e+01 -1.055235000000000145e+00 -3.128125190734863281e+01 -1.055240000000000178e+00 -3.128125190734863281e+01 -1.055244999999999989e+00 -3.128125190734863281e+01 -1.055250000000000021e+00 -3.118750000000000000e+01 -1.055255000000000054e+00 -3.128125190734863281e+01 -1.055260000000000087e+00 -3.128125190734863281e+01 -1.055265000000000120e+00 -3.128125190734863281e+01 -1.055270000000000152e+00 -3.125000000000000000e+01 -1.055275000000000185e+00 -3.121875000000000000e+01 -1.055279999999999996e+00 -3.121875000000000000e+01 -1.055285000000000029e+00 -3.121875000000000000e+01 -1.055290000000000061e+00 -3.118750000000000000e+01 -1.055295000000000094e+00 -3.121875000000000000e+01 -1.055300000000000127e+00 -3.128125190734863281e+01 -1.055305000000000160e+00 -3.118750000000000000e+01 -1.055310000000000192e+00 -3.118750000000000000e+01 -1.055315000000000003e+00 -3.121875000000000000e+01 -1.055320000000000036e+00 -3.118750000000000000e+01 -1.055325000000000069e+00 -3.115625190734863281e+01 -1.055330000000000101e+00 -3.118750000000000000e+01 -1.055335000000000134e+00 -3.121875000000000000e+01 -1.055340000000000167e+00 -3.118750000000000000e+01 -1.055344999999999978e+00 -3.121875000000000000e+01 -1.055350000000000010e+00 -3.112500190734863281e+01 -1.055355000000000043e+00 -3.121875000000000000e+01 -1.055360000000000076e+00 -3.118750000000000000e+01 -1.055365000000000109e+00 -3.121875000000000000e+01 -1.055370000000000141e+00 -3.112500190734863281e+01 -1.055375000000000174e+00 -3.118750000000000000e+01 -1.055379999999999985e+00 -3.112500190734863281e+01 -1.055385000000000018e+00 -3.112500190734863281e+01 -1.055390000000000050e+00 -3.118750000000000000e+01 -1.055395000000000083e+00 -3.115625190734863281e+01 -1.055400000000000116e+00 -3.112500190734863281e+01 -1.055405000000000149e+00 -3.112500190734863281e+01 -1.055410000000000181e+00 -3.115625190734863281e+01 -1.055414999999999992e+00 -3.115625190734863281e+01 -1.055420000000000025e+00 -3.112500190734863281e+01 -1.055425000000000058e+00 -3.115625190734863281e+01 -1.055430000000000090e+00 -3.115625190734863281e+01 -1.055435000000000123e+00 -3.115625190734863281e+01 -1.055440000000000156e+00 -3.112500190734863281e+01 -1.055445000000000189e+00 -3.115625190734863281e+01 -1.055449999999999999e+00 -3.103125000000000000e+01 -1.055455000000000032e+00 -3.115625190734863281e+01 -1.055460000000000065e+00 -3.115625190734863281e+01 -1.055465000000000098e+00 -3.112500190734863281e+01 -1.055470000000000130e+00 -3.106250000000000000e+01 -1.055475000000000163e+00 -3.106250000000000000e+01 -1.055480000000000196e+00 -3.109375000000000000e+01 -1.055485000000000007e+00 -3.112500190734863281e+01 -1.055490000000000039e+00 -3.109375000000000000e+01 -1.055495000000000072e+00 -3.106250000000000000e+01 -1.055500000000000105e+00 -3.106250000000000000e+01 -1.055505000000000138e+00 -3.109375000000000000e+01 -1.055510000000000170e+00 -3.109375000000000000e+01 -1.055514999999999981e+00 -3.112500190734863281e+01 -1.055520000000000014e+00 -3.100000190734863281e+01 -1.055525000000000047e+00 -3.109375000000000000e+01 -1.055530000000000079e+00 -3.112500190734863281e+01 -1.055535000000000112e+00 -3.106250000000000000e+01 -1.055540000000000145e+00 -3.106250000000000000e+01 -1.055545000000000178e+00 -3.100000190734863281e+01 -1.055549999999999988e+00 -3.103125000000000000e+01 -1.055555000000000021e+00 -3.100000190734863281e+01 -1.055560000000000054e+00 -3.106250000000000000e+01 -1.055565000000000087e+00 -3.103125000000000000e+01 -1.055570000000000119e+00 -3.103125000000000000e+01 -1.055575000000000152e+00 -3.100000190734863281e+01 -1.055580000000000185e+00 -3.106250000000000000e+01 -1.055584999999999996e+00 -3.106250000000000000e+01 -1.055590000000000028e+00 -3.100000190734863281e+01 -1.055595000000000061e+00 -3.100000190734863281e+01 -1.055600000000000094e+00 -3.100000190734863281e+01 -1.055605000000000127e+00 -3.100000190734863281e+01 -1.055610000000000159e+00 -3.100000190734863281e+01 -1.055615000000000192e+00 -3.100000190734863281e+01 -1.055620000000000003e+00 -3.093750000000000000e+01 -1.055625000000000036e+00 -3.093750000000000000e+01 -1.055630000000000068e+00 -3.100000190734863281e+01 -1.055635000000000101e+00 -3.100000190734863281e+01 -1.055640000000000134e+00 -3.096875000000000000e+01 -1.055645000000000167e+00 -3.100000190734863281e+01 -1.055649999999999977e+00 -3.093750000000000000e+01 -1.055655000000000010e+00 -3.096875000000000000e+01 -1.055660000000000043e+00 -3.093750000000000000e+01 -1.055665000000000076e+00 -3.093750000000000000e+01 -1.055670000000000108e+00 -3.093750000000000000e+01 -1.055675000000000141e+00 -3.093750000000000000e+01 -1.055680000000000174e+00 -3.090625000000000000e+01 -1.055684999999999985e+00 -3.096875000000000000e+01 -1.055690000000000017e+00 -3.090625000000000000e+01 -1.055695000000000050e+00 -3.090625000000000000e+01 -1.055700000000000083e+00 -3.093750000000000000e+01 -1.055705000000000116e+00 -3.090625000000000000e+01 -1.055710000000000148e+00 -3.090625000000000000e+01 -1.055715000000000181e+00 -3.087500190734863281e+01 -1.055719999999999992e+00 -3.096875000000000000e+01 -1.055725000000000025e+00 -3.090625000000000000e+01 -1.055730000000000057e+00 -3.081250000000000000e+01 -1.055735000000000090e+00 -3.087500190734863281e+01 -1.055740000000000123e+00 -3.084375190734863281e+01 -1.055745000000000156e+00 -3.090625000000000000e+01 -1.055750000000000188e+00 -3.087500190734863281e+01 -1.055754999999999999e+00 -3.084375190734863281e+01 -1.055760000000000032e+00 -3.090625000000000000e+01 -1.055765000000000065e+00 -3.081250000000000000e+01 -1.055770000000000097e+00 -3.081250000000000000e+01 -1.055775000000000130e+00 -3.078125000000000000e+01 -1.055780000000000163e+00 -3.078125000000000000e+01 -1.055785000000000196e+00 -3.078125000000000000e+01 -1.055790000000000006e+00 -3.078125000000000000e+01 -1.055795000000000039e+00 -3.078125000000000000e+01 -1.055800000000000072e+00 -3.078125000000000000e+01 -1.055805000000000105e+00 -3.075000000000000000e+01 -1.055810000000000137e+00 -3.068750000000000000e+01 -1.055815000000000170e+00 -3.068750000000000000e+01 -1.055819999999999981e+00 -3.071875190734863281e+01 -1.055825000000000014e+00 -3.071875190734863281e+01 -1.055830000000000046e+00 -3.065625000000000000e+01 -1.055835000000000079e+00 -3.068750000000000000e+01 -1.055840000000000112e+00 -3.065625000000000000e+01 -1.055845000000000145e+00 -3.065625000000000000e+01 -1.055850000000000177e+00 -3.068750000000000000e+01 -1.055854999999999988e+00 -3.065625000000000000e+01 -1.055860000000000021e+00 -3.056250190734863281e+01 -1.055865000000000054e+00 -3.062500000000000000e+01 -1.055870000000000086e+00 -3.056250190734863281e+01 -1.055875000000000119e+00 -3.065625000000000000e+01 -1.055880000000000152e+00 -3.056250190734863281e+01 -1.055885000000000185e+00 -3.059375190734863281e+01 -1.055889999999999995e+00 -3.053125000000000000e+01 -1.055895000000000028e+00 -3.062500000000000000e+01 -1.055900000000000061e+00 -3.059375190734863281e+01 -1.055905000000000094e+00 -3.050000000000000000e+01 -1.055910000000000126e+00 -3.053125000000000000e+01 -1.055915000000000159e+00 -3.053125000000000000e+01 -1.055920000000000192e+00 -3.056250190734863281e+01 -1.055925000000000002e+00 -3.050000000000000000e+01 -1.055930000000000035e+00 -3.046875000000000000e+01 -1.055935000000000068e+00 -3.050000000000000000e+01 -1.055940000000000101e+00 -3.046875000000000000e+01 -1.055945000000000134e+00 -3.040625190734863281e+01 -1.055950000000000166e+00 -3.046875000000000000e+01 -1.055954999999999977e+00 -3.046875000000000000e+01 -1.055960000000000010e+00 -3.043750190734863281e+01 -1.055965000000000042e+00 -3.043750190734863281e+01 -1.055970000000000075e+00 -3.040625190734863281e+01 -1.055975000000000108e+00 -3.034375000000000000e+01 -1.055980000000000141e+00 -3.037500000000000000e+01 -1.055985000000000174e+00 -3.031250000000000000e+01 -1.055989999999999984e+00 -3.031250000000000000e+01 -1.055995000000000017e+00 -3.031250000000000000e+01 -1.056000000000000050e+00 -3.034375000000000000e+01 -1.056005000000000082e+00 -3.034375000000000000e+01 -1.056010000000000115e+00 -3.031250000000000000e+01 -1.056015000000000148e+00 -3.034375000000000000e+01 -1.056020000000000181e+00 -3.021875000000000000e+01 -1.056024999999999991e+00 -3.021875000000000000e+01 -1.056030000000000024e+00 -3.018750000000000000e+01 -1.056035000000000057e+00 -3.021875000000000000e+01 -1.056040000000000090e+00 -3.028125190734863281e+01 -1.056045000000000122e+00 -3.021875000000000000e+01 -1.056050000000000155e+00 -3.018750000000000000e+01 -1.056055000000000188e+00 -3.015625190734863281e+01 -1.056059999999999999e+00 -3.015625190734863281e+01 -1.056065000000000031e+00 -3.015625190734863281e+01 -1.056070000000000064e+00 -3.009375000000000000e+01 -1.056075000000000097e+00 -3.000000190734863281e+01 -1.056080000000000130e+00 -3.000000190734863281e+01 -1.056085000000000163e+00 -3.003125000000000000e+01 -1.056090000000000195e+00 -3.000000190734863281e+01 -1.056095000000000006e+00 -2.996875190734863281e+01 -1.056100000000000039e+00 -2.987500000000000000e+01 -1.056105000000000071e+00 -2.987500000000000000e+01 -1.056110000000000104e+00 -2.990625000000000000e+01 -1.056115000000000137e+00 -2.987500000000000000e+01 -1.056120000000000170e+00 -2.981250000000000000e+01 -1.056124999999999980e+00 -2.981250000000000000e+01 -1.056130000000000013e+00 -2.975000000000000000e+01 -1.056135000000000046e+00 -2.971875190734863281e+01 -1.056140000000000079e+00 -2.959375000000000000e+01 -1.056145000000000111e+00 -2.950000000000000000e+01 -1.056150000000000144e+00 -2.950000000000000000e+01 -1.056155000000000177e+00 -2.937500000000000000e+01 -1.056159999999999988e+00 -2.921875000000000000e+01 -1.056165000000000020e+00 -2.912500190734863281e+01 -1.056170000000000053e+00 -2.896875190734863281e+01 -1.056175000000000086e+00 -2.878125000000000000e+01 -1.056180000000000119e+00 -2.850000000000000000e+01 -1.056185000000000151e+00 -2.825000190734863281e+01 -1.056190000000000184e+00 -2.787500000000000000e+01 -1.056194999999999995e+00 -2.768750190734863281e+01 -1.056200000000000028e+00 -2.725000190734863281e+01 -1.056205000000000060e+00 -2.690625000000000000e+01 -1.056210000000000093e+00 -2.646875000000000000e+01 -1.056215000000000126e+00 -2.596875000000000000e+01 -1.056220000000000159e+00 -2.550000190734863281e+01 -1.056225000000000191e+00 -2.500000000000000000e+01 -1.056230000000000002e+00 -2.437500190734863281e+01 -1.056235000000000035e+00 -2.375000000000000000e+01 -1.056240000000000068e+00 -2.309375000000000000e+01 -1.056245000000000100e+00 -2.240625000000000000e+01 -1.056250000000000133e+00 -2.153125000000000000e+01 -1.056255000000000166e+00 -2.065625000000000000e+01 -1.056259999999999977e+00 -1.978125000000000000e+01 -1.056265000000000009e+00 -1.890625000000000000e+01 -1.056270000000000042e+00 -1.790625000000000000e+01 -1.056275000000000075e+00 -1.690625000000000000e+01 -1.056280000000000108e+00 -1.584375095367431641e+01 -1.056285000000000140e+00 -1.484375095367431641e+01 -1.056290000000000173e+00 -1.381250000000000000e+01 -1.056294999999999984e+00 -1.275000095367431641e+01 -1.056300000000000017e+00 -1.165625000000000000e+01 -1.056305000000000049e+00 -1.065625095367431641e+01 -1.056310000000000082e+00 -9.625000000000000000e+00 -1.056315000000000115e+00 -8.593750000000000000e+00 -1.056320000000000148e+00 -7.593750000000000000e+00 -1.056325000000000180e+00 -6.656250000000000000e+00 -1.056329999999999991e+00 -5.656250476837158203e+00 -1.056335000000000024e+00 -4.718750476837158203e+00 -1.056340000000000057e+00 -3.750000238418579102e+00 -1.056345000000000089e+00 -2.875000000000000000e+00 -1.056350000000000122e+00 -2.000000000000000000e+00 -1.056355000000000155e+00 -1.125000119209289551e+00 -1.056360000000000188e+00 -3.125000000000000000e-01 -1.056364999999999998e+00 6.250000000000000000e-01 -1.056370000000000031e+00 1.312500000000000000e+00 -1.056375000000000064e+00 2.125000000000000000e+00 -1.056380000000000097e+00 2.875000000000000000e+00 -1.056385000000000129e+00 3.531250238418579102e+00 -1.056390000000000162e+00 4.312500000000000000e+00 -1.056395000000000195e+00 4.968750476837158203e+00 -1.056400000000000006e+00 5.687500476837158203e+00 -1.056405000000000038e+00 6.281250000000000000e+00 -1.056410000000000071e+00 7.000000000000000000e+00 -1.056415000000000104e+00 7.500000476837158203e+00 -1.056420000000000137e+00 8.125000953674316406e+00 -1.056425000000000169e+00 8.656250000000000000e+00 -1.056429999999999980e+00 9.218750953674316406e+00 -1.056435000000000013e+00 9.750000000000000000e+00 -1.056440000000000046e+00 1.018750000000000000e+01 -1.056445000000000078e+00 1.071875000000000000e+01 -1.056450000000000111e+00 1.118750000000000000e+01 -1.056455000000000144e+00 1.159375095367431641e+01 -1.056460000000000177e+00 1.200000000000000000e+01 -1.056464999999999987e+00 1.240625000000000000e+01 -1.056470000000000020e+00 1.281250000000000000e+01 -1.056475000000000053e+00 1.312500095367431641e+01 -1.056480000000000086e+00 1.350000000000000000e+01 -1.056485000000000118e+00 1.387500000000000000e+01 -1.056490000000000151e+00 1.415625000000000000e+01 -1.056495000000000184e+00 1.450000095367431641e+01 -1.056499999999999995e+00 1.478125095367431641e+01 -1.056505000000000027e+00 1.503125000000000000e+01 -1.056510000000000060e+00 1.525000000000000000e+01 -1.056515000000000093e+00 1.553125000000000000e+01 -1.056520000000000126e+00 1.575000000000000000e+01 -1.056525000000000158e+00 1.600000000000000000e+01 -1.056530000000000191e+00 1.618750000000000000e+01 -1.056535000000000002e+00 1.637500000000000000e+01 -1.056540000000000035e+00 1.656250190734863281e+01 -1.056545000000000067e+00 1.668750190734863281e+01 -1.056550000000000100e+00 1.687500000000000000e+01 -1.056555000000000133e+00 1.696875000000000000e+01 -1.056560000000000166e+00 1.706250000000000000e+01 -1.056564999999999976e+00 1.715625000000000000e+01 -1.056570000000000009e+00 1.725000000000000000e+01 -1.056575000000000042e+00 1.737500000000000000e+01 -1.056580000000000075e+00 1.737500000000000000e+01 -1.056585000000000107e+00 1.753125000000000000e+01 -1.056590000000000140e+00 1.750000000000000000e+01 -1.056595000000000173e+00 1.753125000000000000e+01 -1.056599999999999984e+00 1.756250190734863281e+01 -1.056605000000000016e+00 1.765625000000000000e+01 -1.056610000000000049e+00 1.762500000000000000e+01 -1.056615000000000082e+00 1.765625000000000000e+01 -1.056620000000000115e+00 1.768750000000000000e+01 -1.056625000000000147e+00 1.762500000000000000e+01 -1.056630000000000180e+00 1.762500000000000000e+01 -1.056634999999999991e+00 1.756250190734863281e+01 -1.056640000000000024e+00 1.756250190734863281e+01 -1.056645000000000056e+00 1.746875000000000000e+01 -1.056650000000000089e+00 1.740625190734863281e+01 -1.056655000000000122e+00 1.734375000000000000e+01 -1.056660000000000155e+00 1.725000000000000000e+01 -1.056665000000000187e+00 1.715625000000000000e+01 -1.056669999999999998e+00 1.706250000000000000e+01 -1.056675000000000031e+00 1.700000000000000000e+01 -1.056680000000000064e+00 1.687500000000000000e+01 -1.056685000000000096e+00 1.678125000000000000e+01 -1.056690000000000129e+00 1.665625000000000000e+01 -1.056695000000000162e+00 1.650000000000000000e+01 -1.056700000000000195e+00 1.643750000000000000e+01 -1.056705000000000005e+00 1.625000190734863281e+01 -1.056710000000000038e+00 1.612500190734863281e+01 -1.056715000000000071e+00 1.600000000000000000e+01 -1.056720000000000104e+00 1.584375095367431641e+01 -1.056725000000000136e+00 1.562500000000000000e+01 -1.056730000000000169e+00 1.553125000000000000e+01 -1.056734999999999980e+00 1.531250000000000000e+01 -1.056740000000000013e+00 1.506250095367431641e+01 -1.056745000000000045e+00 1.493750000000000000e+01 -1.056750000000000078e+00 1.478125095367431641e+01 -1.056755000000000111e+00 1.453125000000000000e+01 -1.056760000000000144e+00 1.434375095367431641e+01 -1.056765000000000176e+00 1.418750000000000000e+01 -1.056769999999999987e+00 1.393750000000000000e+01 -1.056775000000000020e+00 1.378125000000000000e+01 -1.056780000000000053e+00 1.353125000000000000e+01 -1.056785000000000085e+00 1.325000000000000000e+01 -1.056790000000000118e+00 1.303125000000000000e+01 -1.056795000000000151e+00 1.281250000000000000e+01 -1.056800000000000184e+00 1.262500000000000000e+01 -1.056804999999999994e+00 1.234375000000000000e+01 -1.056810000000000027e+00 1.209375000000000000e+01 -1.056815000000000060e+00 1.184375000000000000e+01 -1.056820000000000093e+00 1.162500000000000000e+01 -1.056825000000000125e+00 1.131250095367431641e+01 -1.056830000000000158e+00 1.109375095367431641e+01 -1.056835000000000191e+00 1.081250095367431641e+01 -1.056840000000000002e+00 1.059375095367431641e+01 -1.056845000000000034e+00 1.028125000000000000e+01 -1.056850000000000067e+00 1.003125000000000000e+01 -1.056855000000000100e+00 9.718750953674316406e+00 -1.056860000000000133e+00 9.531250000000000000e+00 -1.056865000000000165e+00 9.218750953674316406e+00 -1.056869999999999976e+00 8.937500000000000000e+00 -1.056875000000000009e+00 8.625000000000000000e+00 -1.056880000000000042e+00 8.375000000000000000e+00 -1.056885000000000074e+00 8.000000000000000000e+00 -1.056890000000000107e+00 7.687500000000000000e+00 -1.056895000000000140e+00 7.437500000000000000e+00 -1.056900000000000173e+00 7.156250000000000000e+00 -1.056904999999999983e+00 6.843750476837158203e+00 -1.056910000000000016e+00 6.593750476837158203e+00 -1.056915000000000049e+00 6.250000000000000000e+00 -1.056920000000000082e+00 5.906250476837158203e+00 -1.056925000000000114e+00 5.593750000000000000e+00 -1.056930000000000147e+00 5.343750000000000000e+00 -1.056935000000000180e+00 5.000000000000000000e+00 -1.056939999999999991e+00 4.656250000000000000e+00 -1.056945000000000023e+00 4.406250000000000000e+00 -1.056950000000000056e+00 4.093750000000000000e+00 -1.056955000000000089e+00 3.812500000000000000e+00 -1.056960000000000122e+00 3.406250238418579102e+00 -1.056965000000000154e+00 3.093750000000000000e+00 -1.056970000000000187e+00 2.812500000000000000e+00 -1.056974999999999998e+00 2.500000000000000000e+00 -1.056980000000000031e+00 2.187500000000000000e+00 -1.056985000000000063e+00 1.906250000000000000e+00 -1.056990000000000096e+00 1.531250119209289551e+00 -1.056995000000000129e+00 1.187500119209289551e+00 -1.057000000000000162e+00 9.687500596046447754e-01 -1.057005000000000194e+00 5.625000596046447754e-01 -1.057010000000000005e+00 2.500000000000000000e-01 -1.057015000000000038e+00 0.000000000000000000e+00 -1.057020000000000071e+00 -4.375000000000000000e-01 -1.057025000000000103e+00 -7.812500000000000000e-01 -1.057030000000000136e+00 -9.687500596046447754e-01 -1.057035000000000169e+00 -1.312500000000000000e+00 -1.057039999999999980e+00 -1.562500000000000000e+00 -1.057045000000000012e+00 -2.000000000000000000e+00 -1.057050000000000045e+00 -2.281250000000000000e+00 -1.057055000000000078e+00 -2.593750238418579102e+00 -1.057060000000000111e+00 -2.968750000000000000e+00 -1.057065000000000143e+00 -3.281250238418579102e+00 -1.057070000000000176e+00 -3.593750000000000000e+00 -1.057074999999999987e+00 -3.812500000000000000e+00 -1.057080000000000020e+00 -4.156250000000000000e+00 -1.057085000000000052e+00 -4.531250000000000000e+00 -1.057090000000000085e+00 -4.875000000000000000e+00 -1.057095000000000118e+00 -5.125000000000000000e+00 -1.057100000000000151e+00 -5.406250476837158203e+00 -1.057105000000000183e+00 -5.781250000000000000e+00 -1.057109999999999994e+00 -6.062500000000000000e+00 -1.057115000000000027e+00 -6.375000476837158203e+00 -1.057120000000000060e+00 -6.625000000000000000e+00 -1.057125000000000092e+00 -7.031250476837158203e+00 -1.057130000000000125e+00 -7.281250476837158203e+00 -1.057135000000000158e+00 -7.593750000000000000e+00 -1.057140000000000191e+00 -7.937500476837158203e+00 -1.057145000000000001e+00 -8.156250000000000000e+00 -1.057150000000000034e+00 -8.406250000000000000e+00 -1.057155000000000067e+00 -8.687500000000000000e+00 -1.057160000000000100e+00 -9.031250000000000000e+00 -1.057165000000000132e+00 -9.343750000000000000e+00 -1.057170000000000165e+00 -9.625000000000000000e+00 -1.057174999999999976e+00 -9.937500953674316406e+00 -1.057180000000000009e+00 -1.015625095367431641e+01 -1.057185000000000041e+00 -1.050000000000000000e+01 -1.057190000000000074e+00 -1.078125000000000000e+01 -1.057195000000000107e+00 -1.100000000000000000e+01 -1.057200000000000140e+00 -1.128125000000000000e+01 -1.057205000000000172e+00 -1.153125095367431641e+01 -1.057209999999999983e+00 -1.181250095367431641e+01 -1.057215000000000016e+00 -1.209375000000000000e+01 -1.057220000000000049e+00 -1.240625000000000000e+01 -1.057225000000000081e+00 -1.256250000000000000e+01 -1.057230000000000114e+00 -1.284375000000000000e+01 -1.057235000000000147e+00 -1.312500095367431641e+01 -1.057240000000000180e+00 -1.334375095367431641e+01 -1.057244999999999990e+00 -1.365625000000000000e+01 -1.057250000000000023e+00 -1.384375095367431641e+01 -1.057255000000000056e+00 -1.409375000000000000e+01 -1.057260000000000089e+00 -1.434375095367431641e+01 -1.057265000000000121e+00 -1.459375000000000000e+01 -1.057270000000000154e+00 -1.481250000000000000e+01 -1.057275000000000187e+00 -1.503125000000000000e+01 -1.057279999999999998e+00 -1.534375000000000000e+01 -1.057285000000000030e+00 -1.546875000000000000e+01 -1.057290000000000063e+00 -1.578125000000000000e+01 -1.057295000000000096e+00 -1.603125000000000000e+01 -1.057300000000000129e+00 -1.615625000000000000e+01 -1.057305000000000161e+00 -1.646875000000000000e+01 -1.057310000000000194e+00 -1.665625000000000000e+01 -1.057315000000000005e+00 -1.684375190734863281e+01 -1.057320000000000038e+00 -1.712500190734863281e+01 -1.057325000000000070e+00 -1.734375000000000000e+01 -1.057330000000000103e+00 -1.753125000000000000e+01 -1.057335000000000136e+00 -1.771875190734863281e+01 -1.057340000000000169e+00 -1.800000190734863281e+01 -1.057344999999999979e+00 -1.812500000000000000e+01 -1.057350000000000012e+00 -1.840625000000000000e+01 -1.057355000000000045e+00 -1.859375000000000000e+01 -1.057360000000000078e+00 -1.881250000000000000e+01 -1.057365000000000110e+00 -1.896875000000000000e+01 -1.057370000000000143e+00 -1.915625190734863281e+01 -1.057375000000000176e+00 -1.934375000000000000e+01 -1.057379999999999987e+00 -1.953125000000000000e+01 -1.057385000000000019e+00 -1.971875190734863281e+01 -1.057390000000000052e+00 -1.990625000000000000e+01 -1.057395000000000085e+00 -2.009375000000000000e+01 -1.057400000000000118e+00 -2.025000000000000000e+01 -1.057405000000000150e+00 -2.053125000000000000e+01 -1.057410000000000183e+00 -2.071875000000000000e+01 -1.057414999999999994e+00 -2.084375000000000000e+01 -1.057420000000000027e+00 -2.103125190734863281e+01 -1.057425000000000059e+00 -2.121875000000000000e+01 -1.057430000000000092e+00 -2.128125000000000000e+01 -1.057435000000000125e+00 -2.153125000000000000e+01 -1.057440000000000158e+00 -2.165625000000000000e+01 -1.057445000000000190e+00 -2.187500000000000000e+01 -1.057450000000000001e+00 -2.203125190734863281e+01 -1.057455000000000034e+00 -2.218750190734863281e+01 -1.057460000000000067e+00 -2.234375190734863281e+01 -1.057465000000000099e+00 -2.250000000000000000e+01 -1.057470000000000132e+00 -2.271875000000000000e+01 -1.057475000000000165e+00 -2.284375000000000000e+01 -1.057479999999999976e+00 -2.293750000000000000e+01 -1.057485000000000008e+00 -2.315625000000000000e+01 -1.057490000000000041e+00 -2.325000000000000000e+01 -1.057495000000000074e+00 -2.350000190734863281e+01 -1.057500000000000107e+00 -2.362500190734863281e+01 -1.057505000000000139e+00 -2.371875000000000000e+01 -1.057510000000000172e+00 -2.390625190734863281e+01 -1.057514999999999983e+00 -2.406250190734863281e+01 -1.057520000000000016e+00 -2.418750000000000000e+01 -1.057525000000000048e+00 -2.437500190734863281e+01 -1.057530000000000081e+00 -2.450000190734863281e+01 -1.057535000000000114e+00 -2.459375000000000000e+01 -1.057540000000000147e+00 -2.468750000000000000e+01 -1.057545000000000179e+00 -2.490625000000000000e+01 -1.057549999999999990e+00 -2.500000000000000000e+01 -1.057555000000000023e+00 -2.518750000000000000e+01 -1.057560000000000056e+00 -2.525000000000000000e+01 -1.057565000000000088e+00 -2.534375000000000000e+01 -1.057570000000000121e+00 -2.550000190734863281e+01 -1.057575000000000154e+00 -2.565625190734863281e+01 -1.057580000000000187e+00 -2.575000000000000000e+01 -1.057584999999999997e+00 -2.590625000000000000e+01 -1.057590000000000030e+00 -2.603125000000000000e+01 -1.057595000000000063e+00 -2.609375190734863281e+01 -1.057600000000000096e+00 -2.625000190734863281e+01 -1.057605000000000128e+00 -2.634375000000000000e+01 -1.057610000000000161e+00 -2.646875000000000000e+01 -1.057615000000000194e+00 -2.656250000000000000e+01 -1.057620000000000005e+00 -2.665625190734863281e+01 -1.057625000000000037e+00 -2.684375000000000000e+01 -1.057630000000000070e+00 -2.693750190734863281e+01 -1.057635000000000103e+00 -2.703125000000000000e+01 -1.057640000000000136e+00 -2.709375190734863281e+01 -1.057645000000000168e+00 -2.721875000000000000e+01 -1.057649999999999979e+00 -2.734375000000000000e+01 -1.057655000000000012e+00 -2.743750000000000000e+01 -1.057660000000000045e+00 -2.759375000000000000e+01 -1.057665000000000077e+00 -2.762500000000000000e+01 -1.057670000000000110e+00 -2.775000000000000000e+01 -1.057675000000000143e+00 -2.787500000000000000e+01 -1.057680000000000176e+00 -2.793750000000000000e+01 -1.057684999999999986e+00 -2.803125000000000000e+01 -1.057690000000000019e+00 -2.821875000000000000e+01 -1.057695000000000052e+00 -2.821875000000000000e+01 -1.057700000000000085e+00 -2.831250000000000000e+01 -1.057705000000000117e+00 -2.837500000000000000e+01 -1.057710000000000150e+00 -2.853125190734863281e+01 -1.057715000000000183e+00 -2.859375000000000000e+01 -1.057719999999999994e+00 -2.865625000000000000e+01 -1.057725000000000026e+00 -2.878125000000000000e+01 -1.057730000000000059e+00 -2.890625000000000000e+01 -1.057735000000000092e+00 -2.896875190734863281e+01 -1.057740000000000125e+00 -2.903125000000000000e+01 -1.057745000000000157e+00 -2.912500190734863281e+01 -1.057750000000000190e+00 -2.925000190734863281e+01 -1.057755000000000001e+00 -2.931250000000000000e+01 -1.057760000000000034e+00 -2.937500000000000000e+01 -1.057765000000000066e+00 -2.943750190734863281e+01 -1.057770000000000099e+00 -2.956250190734863281e+01 -1.057775000000000132e+00 -2.965625000000000000e+01 -1.057780000000000165e+00 -2.981250000000000000e+01 -1.057785000000000197e+00 -2.978125000000000000e+01 -1.057790000000000008e+00 -2.987500000000000000e+01 -1.057795000000000041e+00 -2.996875190734863281e+01 -1.057800000000000074e+00 -2.996875190734863281e+01 -1.057805000000000106e+00 -3.012500190734863281e+01 -1.057810000000000139e+00 -3.015625190734863281e+01 -1.057815000000000172e+00 -3.025000000000000000e+01 -1.057819999999999983e+00 -3.031250000000000000e+01 -1.057825000000000015e+00 -3.031250000000000000e+01 -1.057830000000000048e+00 -3.046875000000000000e+01 -1.057835000000000081e+00 -3.053125000000000000e+01 -1.057840000000000114e+00 -3.059375190734863281e+01 -1.057845000000000146e+00 -3.065625000000000000e+01 -1.057850000000000179e+00 -3.071875190734863281e+01 -1.057854999999999990e+00 -3.078125000000000000e+01 -1.057860000000000023e+00 -3.084375190734863281e+01 -1.057865000000000055e+00 -3.093750000000000000e+01 -1.057870000000000088e+00 -3.096875000000000000e+01 -1.057875000000000121e+00 -3.100000190734863281e+01 -1.057880000000000154e+00 -3.109375000000000000e+01 -1.057885000000000186e+00 -3.115625190734863281e+01 -1.057889999999999997e+00 -3.131250000000000000e+01 -1.057895000000000030e+00 -3.131250000000000000e+01 -1.057900000000000063e+00 -3.131250000000000000e+01 -1.057905000000000095e+00 -3.143750190734863281e+01 -1.057910000000000128e+00 -3.150000000000000000e+01 -1.057915000000000161e+00 -3.156250000000000000e+01 -1.057920000000000194e+00 -3.165625000000000000e+01 -1.057925000000000004e+00 -3.168750190734863281e+01 -1.057930000000000037e+00 -3.178125190734863281e+01 -1.057935000000000070e+00 -3.181250000000000000e+01 -1.057940000000000103e+00 -3.184375190734863281e+01 -1.057945000000000135e+00 -3.187500000000000000e+01 -1.057950000000000168e+00 -3.196875000000000000e+01 -1.057954999999999979e+00 -3.203125000000000000e+01 -1.057960000000000012e+00 -3.209375381469726562e+01 -1.057965000000000044e+00 -3.209375381469726562e+01 -1.057970000000000077e+00 -3.215625000000000000e+01 -1.057975000000000110e+00 -3.225000381469726562e+01 -1.057980000000000143e+00 -3.228125000000000000e+01 -1.057985000000000175e+00 -3.237500000000000000e+01 -1.057989999999999986e+00 -3.237500000000000000e+01 -1.057995000000000019e+00 -3.250000381469726562e+01 -1.058000000000000052e+00 -3.246875000000000000e+01 -1.058005000000000084e+00 -3.250000381469726562e+01 -1.058010000000000117e+00 -3.256250000000000000e+01 -1.058015000000000150e+00 -3.256250000000000000e+01 -1.058020000000000183e+00 -3.259375000000000000e+01 -1.058024999999999993e+00 -3.265625381469726562e+01 -1.058030000000000026e+00 -3.268750000000000000e+01 -1.058035000000000059e+00 -3.278125000000000000e+01 -1.058040000000000092e+00 -3.284375000000000000e+01 -1.058045000000000124e+00 -3.284375000000000000e+01 -1.058050000000000157e+00 -3.293750000000000000e+01 -1.058055000000000190e+00 -3.293750000000000000e+01 -1.058060000000000000e+00 -3.296875381469726562e+01 -1.058065000000000033e+00 -3.300000000000000000e+01 -1.058070000000000066e+00 -3.303125000000000000e+01 -1.058075000000000099e+00 -3.315625000000000000e+01 -1.058080000000000132e+00 -3.312500381469726562e+01 -1.058085000000000164e+00 -3.318750000000000000e+01 -1.058090000000000197e+00 -3.315625000000000000e+01 -1.058095000000000008e+00 -3.321875381469726562e+01 -1.058100000000000041e+00 -3.328125000000000000e+01 -1.058105000000000073e+00 -3.328125000000000000e+01 -1.058110000000000106e+00 -3.337500381469726562e+01 -1.058115000000000139e+00 -3.337500381469726562e+01 -1.058120000000000172e+00 -3.340625000000000000e+01 -1.058124999999999982e+00 -3.346875000000000000e+01 -1.058130000000000015e+00 -3.350000000000000000e+01 -1.058135000000000048e+00 -3.353125381469726562e+01 -1.058140000000000081e+00 -3.356250000000000000e+01 -1.058145000000000113e+00 -3.362500000000000000e+01 -1.058150000000000146e+00 -3.362500000000000000e+01 -1.058155000000000179e+00 -3.365625000000000000e+01 -1.058159999999999989e+00 -3.371875000000000000e+01 -1.058165000000000022e+00 -3.378125000000000000e+01 -1.058170000000000055e+00 -3.378125000000000000e+01 -1.058175000000000088e+00 -3.381250000000000000e+01 -1.058180000000000121e+00 -3.381250000000000000e+01 -1.058185000000000153e+00 -3.384375381469726562e+01 -1.058190000000000186e+00 -3.393750000000000000e+01 -1.058194999999999997e+00 -3.393750000000000000e+01 -1.058200000000000029e+00 -3.396875000000000000e+01 -1.058205000000000062e+00 -3.400000000000000000e+01 -1.058210000000000095e+00 -3.400000000000000000e+01 -1.058215000000000128e+00 -3.400000000000000000e+01 -1.058220000000000161e+00 -3.409375381469726562e+01 -1.058225000000000193e+00 -3.406250000000000000e+01 -1.058230000000000004e+00 -3.412500000000000000e+01 -1.058235000000000037e+00 -3.412500000000000000e+01 -1.058240000000000069e+00 -3.418750000000000000e+01 -1.058245000000000102e+00 -3.409375381469726562e+01 -1.058250000000000135e+00 -3.418750000000000000e+01 -1.058255000000000168e+00 -3.434375000000000000e+01 -1.058259999999999978e+00 -3.428125000000000000e+01 -1.058265000000000011e+00 -3.434375000000000000e+01 -1.058270000000000044e+00 -3.431250000000000000e+01 -1.058275000000000077e+00 -3.437500000000000000e+01 -1.058280000000000109e+00 -3.440625381469726562e+01 -1.058285000000000142e+00 -3.437500000000000000e+01 -1.058290000000000175e+00 -3.443750000000000000e+01 -1.058294999999999986e+00 -3.446875000000000000e+01 -1.058300000000000018e+00 -3.450000000000000000e+01 -1.058305000000000051e+00 -3.450000000000000000e+01 -1.058310000000000084e+00 -3.453125000000000000e+01 -1.058315000000000117e+00 -3.453125000000000000e+01 -1.058320000000000149e+00 -3.450000000000000000e+01 -1.058325000000000182e+00 -3.462500000000000000e+01 -1.058329999999999993e+00 -3.465625000000000000e+01 -1.058335000000000026e+00 -3.459375000000000000e+01 -1.058340000000000058e+00 -3.471875000000000000e+01 -1.058345000000000091e+00 -3.465625000000000000e+01 -1.058350000000000124e+00 -3.465625000000000000e+01 -1.058355000000000157e+00 -3.475000000000000000e+01 -1.058360000000000190e+00 -3.475000000000000000e+01 -1.058365000000000000e+00 -3.478125000000000000e+01 -1.058370000000000033e+00 -3.478125000000000000e+01 -1.058375000000000066e+00 -3.478125000000000000e+01 -1.058380000000000098e+00 -3.487500000000000000e+01 -1.058385000000000131e+00 -3.487500000000000000e+01 -1.058390000000000164e+00 -3.484375000000000000e+01 -1.058395000000000197e+00 -3.490625000000000000e+01 -1.058400000000000007e+00 -3.493750000000000000e+01 -1.058405000000000040e+00 -3.493750000000000000e+01 -1.058410000000000073e+00 -3.493750000000000000e+01 -1.058415000000000106e+00 -3.500000000000000000e+01 -1.058420000000000138e+00 -3.500000000000000000e+01 -1.058425000000000171e+00 -3.500000000000000000e+01 -1.058429999999999982e+00 -3.500000000000000000e+01 -1.058435000000000015e+00 -3.503125000000000000e+01 -1.058440000000000047e+00 -3.506250000000000000e+01 -1.058445000000000080e+00 -3.503125000000000000e+01 -1.058450000000000113e+00 -3.509375000000000000e+01 -1.058455000000000146e+00 -3.509375000000000000e+01 -1.058460000000000178e+00 -3.512500381469726562e+01 -1.058464999999999989e+00 -3.512500381469726562e+01 -1.058470000000000022e+00 -3.521875000000000000e+01 -1.058475000000000055e+00 -3.515625000000000000e+01 -1.058480000000000087e+00 -3.518750000000000000e+01 -1.058485000000000120e+00 -3.521875000000000000e+01 -1.058490000000000153e+00 -3.528125381469726562e+01 -1.058495000000000186e+00 -3.525000000000000000e+01 -1.058499999999999996e+00 -3.525000000000000000e+01 -1.058505000000000029e+00 -3.531250000000000000e+01 -1.058510000000000062e+00 -3.528125381469726562e+01 -1.058515000000000095e+00 -3.531250000000000000e+01 -1.058520000000000127e+00 -3.534375000000000000e+01 -1.058525000000000160e+00 -3.528125381469726562e+01 -1.058530000000000193e+00 -3.531250000000000000e+01 -1.058535000000000004e+00 -3.531250000000000000e+01 -1.058540000000000036e+00 -3.537500000000000000e+01 -1.058545000000000069e+00 -3.537500000000000000e+01 -1.058550000000000102e+00 -3.534375000000000000e+01 -1.058555000000000135e+00 -3.543750381469726562e+01 -1.058560000000000167e+00 -3.546875000000000000e+01 -1.058564999999999978e+00 -3.537500000000000000e+01 -1.058570000000000011e+00 -3.540625000000000000e+01 -1.058575000000000044e+00 -3.546875000000000000e+01 -1.058580000000000076e+00 -3.550000000000000000e+01 -1.058585000000000109e+00 -3.543750381469726562e+01 -1.058590000000000142e+00 -3.550000000000000000e+01 -1.058595000000000175e+00 -3.556250000000000000e+01 -1.058599999999999985e+00 -3.553125381469726562e+01 -1.058605000000000018e+00 -3.550000000000000000e+01 -1.058610000000000051e+00 -3.550000000000000000e+01 -1.058615000000000084e+00 -3.553125381469726562e+01 -1.058620000000000116e+00 -3.559375000000000000e+01 -1.058625000000000149e+00 -3.553125381469726562e+01 -1.058630000000000182e+00 -3.556250000000000000e+01 -1.058634999999999993e+00 -3.556250000000000000e+01 -1.058640000000000025e+00 -3.559375000000000000e+01 -1.058645000000000058e+00 -3.565625000000000000e+01 -1.058650000000000091e+00 -3.562500000000000000e+01 -1.058655000000000124e+00 -3.559375000000000000e+01 -1.058660000000000156e+00 -3.562500000000000000e+01 -1.058665000000000189e+00 -3.568750381469726562e+01 -1.058670000000000000e+00 -3.562500000000000000e+01 -1.058675000000000033e+00 -3.568750381469726562e+01 -1.058680000000000065e+00 -3.568750381469726562e+01 -1.058685000000000098e+00 -3.578125000000000000e+01 -1.058690000000000131e+00 -3.565625000000000000e+01 -1.058695000000000164e+00 -3.568750381469726562e+01 -1.058700000000000196e+00 -3.575000000000000000e+01 -1.058705000000000007e+00 -3.575000000000000000e+01 -1.058710000000000040e+00 -3.578125000000000000e+01 -1.058715000000000073e+00 -3.571875000000000000e+01 -1.058720000000000105e+00 -3.578125000000000000e+01 -1.058725000000000138e+00 -3.575000000000000000e+01 -1.058730000000000171e+00 -3.581250000000000000e+01 -1.058734999999999982e+00 -3.584375381469726562e+01 -1.058740000000000014e+00 -3.581250000000000000e+01 -1.058745000000000047e+00 -3.581250000000000000e+01 -1.058750000000000080e+00 -3.590625000000000000e+01 -1.058755000000000113e+00 -3.590625000000000000e+01 -1.058760000000000145e+00 -3.587500000000000000e+01 -1.058765000000000178e+00 -3.593750000000000000e+01 -1.058769999999999989e+00 -3.590625000000000000e+01 -1.058775000000000022e+00 -3.593750000000000000e+01 -1.058780000000000054e+00 -3.596875000000000000e+01 -1.058785000000000087e+00 -3.590625000000000000e+01 -1.058790000000000120e+00 -3.593750000000000000e+01 -1.058795000000000153e+00 -3.593750000000000000e+01 -1.058800000000000185e+00 -3.600000381469726562e+01 -1.058804999999999996e+00 -3.600000381469726562e+01 -1.058810000000000029e+00 -3.590625000000000000e+01 -1.058815000000000062e+00 -3.600000381469726562e+01 -1.058820000000000094e+00 -3.596875000000000000e+01 -1.058825000000000127e+00 -3.603125000000000000e+01 -1.058830000000000160e+00 -3.603125000000000000e+01 -1.058835000000000193e+00 -3.606250000000000000e+01 -1.058840000000000003e+00 -3.606250000000000000e+01 -1.058845000000000036e+00 -3.596875000000000000e+01 -1.058850000000000069e+00 -3.603125000000000000e+01 -1.058855000000000102e+00 -3.606250000000000000e+01 -1.058860000000000134e+00 -3.606250000000000000e+01 -1.058865000000000167e+00 -3.609375000000000000e+01 -1.058869999999999978e+00 -3.603125000000000000e+01 -1.058875000000000011e+00 -3.612500000000000000e+01 -1.058880000000000043e+00 -3.609375000000000000e+01 -1.058885000000000076e+00 -3.609375000000000000e+01 -1.058890000000000109e+00 -3.609375000000000000e+01 -1.058895000000000142e+00 -3.606250000000000000e+01 -1.058900000000000174e+00 -3.609375000000000000e+01 -1.058904999999999985e+00 -3.612500000000000000e+01 -1.058910000000000018e+00 -3.615625381469726562e+01 -1.058915000000000051e+00 -3.615625381469726562e+01 -1.058920000000000083e+00 -3.615625381469726562e+01 -1.058925000000000116e+00 -3.621875000000000000e+01 -1.058930000000000149e+00 -3.621875000000000000e+01 -1.058935000000000182e+00 -3.621875000000000000e+01 -1.058939999999999992e+00 -3.615625381469726562e+01 -1.058945000000000025e+00 -3.615625381469726562e+01 -1.058950000000000058e+00 -3.618750000000000000e+01 -1.058955000000000091e+00 -3.621875000000000000e+01 -1.058960000000000123e+00 -3.615625381469726562e+01 -1.058965000000000156e+00 -3.615625381469726562e+01 -1.058970000000000189e+00 -3.621875000000000000e+01 -1.058975000000000000e+00 -3.628125000000000000e+01 -1.058980000000000032e+00 -3.618750000000000000e+01 -1.058985000000000065e+00 -3.615625381469726562e+01 -1.058990000000000098e+00 -3.625000000000000000e+01 -1.058995000000000131e+00 -3.618750000000000000e+01 -1.059000000000000163e+00 -3.628125000000000000e+01 -1.059005000000000196e+00 -3.625000000000000000e+01 -1.059010000000000007e+00 -3.618750000000000000e+01 -1.059015000000000040e+00 -3.625000000000000000e+01 -1.059020000000000072e+00 -3.628125000000000000e+01 -1.059025000000000105e+00 -3.625000000000000000e+01 -1.059030000000000138e+00 -3.625000000000000000e+01 -1.059035000000000171e+00 -3.631250000000000000e+01 -1.059039999999999981e+00 -3.628125000000000000e+01 -1.059045000000000014e+00 -3.628125000000000000e+01 -1.059050000000000047e+00 -3.634375000000000000e+01 -1.059055000000000080e+00 -3.631250000000000000e+01 -1.059060000000000112e+00 -3.631250000000000000e+01 -1.059065000000000145e+00 -3.628125000000000000e+01 -1.059070000000000178e+00 -3.628125000000000000e+01 -1.059074999999999989e+00 -3.625000000000000000e+01 -1.059080000000000021e+00 -3.628125000000000000e+01 -1.059085000000000054e+00 -3.634375000000000000e+01 -1.059090000000000087e+00 -3.637500000000000000e+01 -1.059095000000000120e+00 -3.631250000000000000e+01 -1.059100000000000152e+00 -3.634375000000000000e+01 -1.059105000000000185e+00 -3.625000000000000000e+01 -1.059109999999999996e+00 -3.631250000000000000e+01 -1.059115000000000029e+00 -3.634375000000000000e+01 -1.059120000000000061e+00 -3.637500000000000000e+01 -1.059125000000000094e+00 -3.634375000000000000e+01 -1.059130000000000127e+00 -3.634375000000000000e+01 -1.059135000000000160e+00 -3.640625381469726562e+01 -1.059140000000000192e+00 -3.634375000000000000e+01 -1.059145000000000003e+00 -3.631250000000000000e+01 -1.059150000000000036e+00 -3.637500000000000000e+01 -1.059155000000000069e+00 -3.634375000000000000e+01 -1.059160000000000101e+00 -3.628125000000000000e+01 -1.059165000000000134e+00 -3.628125000000000000e+01 -1.059170000000000167e+00 -3.631250000000000000e+01 -1.059174999999999978e+00 -3.631250000000000000e+01 -1.059180000000000010e+00 -3.637500000000000000e+01 -1.059185000000000043e+00 -3.634375000000000000e+01 -1.059190000000000076e+00 -3.637500000000000000e+01 -1.059195000000000109e+00 -3.640625381469726562e+01 -1.059200000000000141e+00 -3.640625381469726562e+01 -1.059205000000000174e+00 -3.637500000000000000e+01 -1.059209999999999985e+00 -3.640625381469726562e+01 -1.059215000000000018e+00 -3.643750000000000000e+01 -1.059220000000000050e+00 -3.637500000000000000e+01 -1.059225000000000083e+00 -3.643750000000000000e+01 -1.059230000000000116e+00 -3.643750000000000000e+01 -1.059235000000000149e+00 -3.640625381469726562e+01 -1.059240000000000181e+00 -3.643750000000000000e+01 -1.059244999999999992e+00 -3.643750000000000000e+01 -1.059250000000000025e+00 -3.643750000000000000e+01 -1.059255000000000058e+00 -3.643750000000000000e+01 -1.059260000000000090e+00 -3.643750000000000000e+01 -1.059265000000000123e+00 -3.640625381469726562e+01 -1.059270000000000156e+00 -3.643750000000000000e+01 -1.059275000000000189e+00 -3.650000000000000000e+01 -1.059279999999999999e+00 -3.643750000000000000e+01 -1.059285000000000032e+00 -3.640625381469726562e+01 -1.059290000000000065e+00 -3.643750000000000000e+01 -1.059295000000000098e+00 -3.643750000000000000e+01 -1.059300000000000130e+00 -3.646875000000000000e+01 -1.059305000000000163e+00 -3.646875000000000000e+01 -1.059310000000000196e+00 -3.646875000000000000e+01 -1.059315000000000007e+00 -3.646875000000000000e+01 -1.059320000000000039e+00 -3.650000000000000000e+01 -1.059325000000000072e+00 -3.650000000000000000e+01 -1.059330000000000105e+00 -3.646875000000000000e+01 -1.059335000000000138e+00 -3.650000000000000000e+01 -1.059340000000000170e+00 -3.653125000000000000e+01 -1.059344999999999981e+00 -3.650000000000000000e+01 -1.059350000000000014e+00 -3.643750000000000000e+01 -1.059355000000000047e+00 -3.659375000000000000e+01 -1.059360000000000079e+00 -3.646875000000000000e+01 -1.059365000000000112e+00 -3.646875000000000000e+01 -1.059370000000000145e+00 -3.650000000000000000e+01 -1.059375000000000178e+00 -3.653125000000000000e+01 -1.059379999999999988e+00 -3.653125000000000000e+01 -1.059385000000000021e+00 -3.653125000000000000e+01 -1.059390000000000054e+00 -3.653125000000000000e+01 -1.059395000000000087e+00 -3.656250381469726562e+01 -1.059400000000000119e+00 -3.653125000000000000e+01 -1.059405000000000152e+00 -3.656250381469726562e+01 -1.059410000000000185e+00 -3.659375000000000000e+01 -1.059414999999999996e+00 -3.659375000000000000e+01 -1.059420000000000028e+00 -3.656250381469726562e+01 -1.059425000000000061e+00 -3.659375000000000000e+01 -1.059430000000000094e+00 -3.653125000000000000e+01 -1.059435000000000127e+00 -3.659375000000000000e+01 -1.059440000000000159e+00 -3.656250381469726562e+01 -1.059445000000000192e+00 -3.653125000000000000e+01 -1.059450000000000003e+00 -3.653125000000000000e+01 -1.059455000000000036e+00 -3.653125000000000000e+01 -1.059460000000000068e+00 -3.653125000000000000e+01 -1.059465000000000101e+00 -3.653125000000000000e+01 -1.059470000000000134e+00 -3.659375000000000000e+01 -1.059475000000000167e+00 -3.659375000000000000e+01 -1.059479999999999977e+00 -3.662500000000000000e+01 -1.059485000000000010e+00 -3.671875381469726562e+01 -1.059490000000000043e+00 -3.659375000000000000e+01 -1.059495000000000076e+00 -3.665625000000000000e+01 -1.059500000000000108e+00 -3.659375000000000000e+01 -1.059505000000000141e+00 -3.665625000000000000e+01 -1.059510000000000174e+00 -3.665625000000000000e+01 -1.059514999999999985e+00 -3.668750000000000000e+01 -1.059520000000000017e+00 -3.665625000000000000e+01 -1.059525000000000050e+00 -3.662500000000000000e+01 -1.059530000000000083e+00 -3.662500000000000000e+01 -1.059535000000000116e+00 -3.665625000000000000e+01 -1.059540000000000148e+00 -3.671875381469726562e+01 -1.059545000000000181e+00 -3.665625000000000000e+01 -1.059549999999999992e+00 -3.662500000000000000e+01 -1.059555000000000025e+00 -3.665625000000000000e+01 -1.059560000000000057e+00 -3.665625000000000000e+01 -1.059565000000000090e+00 -3.668750000000000000e+01 -1.059570000000000123e+00 -3.665625000000000000e+01 -1.059575000000000156e+00 -3.665625000000000000e+01 -1.059580000000000188e+00 -3.665625000000000000e+01 -1.059584999999999999e+00 -3.671875381469726562e+01 -1.059590000000000032e+00 -3.665625000000000000e+01 -1.059595000000000065e+00 -3.665625000000000000e+01 -1.059600000000000097e+00 -3.675000000000000000e+01 -1.059605000000000130e+00 -3.668750000000000000e+01 -1.059610000000000163e+00 -3.668750000000000000e+01 -1.059615000000000196e+00 -3.671875381469726562e+01 -1.059620000000000006e+00 -3.668750000000000000e+01 -1.059625000000000039e+00 -3.671875381469726562e+01 -1.059630000000000072e+00 -3.671875381469726562e+01 -1.059635000000000105e+00 -3.668750000000000000e+01 -1.059640000000000137e+00 -3.671875381469726562e+01 -1.059645000000000170e+00 -3.671875381469726562e+01 -1.059649999999999981e+00 -3.671875381469726562e+01 -1.059655000000000014e+00 -3.675000000000000000e+01 -1.059660000000000046e+00 -3.671875381469726562e+01 -1.059665000000000079e+00 -3.678125000000000000e+01 -1.059670000000000112e+00 -3.678125000000000000e+01 -1.059675000000000145e+00 -3.671875381469726562e+01 -1.059680000000000177e+00 -3.675000000000000000e+01 -1.059684999999999988e+00 -3.671875381469726562e+01 -1.059690000000000021e+00 -3.675000000000000000e+01 -1.059695000000000054e+00 -3.678125000000000000e+01 -1.059700000000000086e+00 -3.675000000000000000e+01 -1.059705000000000119e+00 -3.678125000000000000e+01 -1.059710000000000152e+00 -3.671875381469726562e+01 -1.059715000000000185e+00 -3.671875381469726562e+01 -1.059719999999999995e+00 -3.678125000000000000e+01 -1.059725000000000028e+00 -3.671875381469726562e+01 -1.059730000000000061e+00 -3.678125000000000000e+01 -1.059735000000000094e+00 -3.671875381469726562e+01 -1.059740000000000126e+00 -3.681250000000000000e+01 -1.059745000000000159e+00 -3.665625000000000000e+01 -1.059750000000000192e+00 -3.678125000000000000e+01 -1.059755000000000003e+00 -3.675000000000000000e+01 -1.059760000000000035e+00 -3.678125000000000000e+01 -1.059765000000000068e+00 -3.678125000000000000e+01 -1.059770000000000101e+00 -3.678125000000000000e+01 -1.059775000000000134e+00 -3.678125000000000000e+01 -1.059780000000000166e+00 -3.675000000000000000e+01 -1.059784999999999977e+00 -3.675000000000000000e+01 -1.059790000000000010e+00 -3.678125000000000000e+01 -1.059795000000000043e+00 -3.678125000000000000e+01 -1.059800000000000075e+00 -3.671875381469726562e+01 -1.059805000000000108e+00 -3.681250000000000000e+01 -1.059810000000000141e+00 -3.678125000000000000e+01 -1.059815000000000174e+00 -3.678125000000000000e+01 -1.059819999999999984e+00 -3.678125000000000000e+01 -1.059825000000000017e+00 -3.681250000000000000e+01 -1.059830000000000050e+00 -3.678125000000000000e+01 -1.059835000000000083e+00 -3.678125000000000000e+01 -1.059840000000000115e+00 -3.681250000000000000e+01 -1.059845000000000148e+00 -3.681250000000000000e+01 -1.059850000000000181e+00 -3.684375000000000000e+01 -1.059854999999999992e+00 -3.681250000000000000e+01 -1.059860000000000024e+00 -3.684375000000000000e+01 -1.059865000000000057e+00 -3.678125000000000000e+01 -1.059870000000000090e+00 -3.681250000000000000e+01 -1.059875000000000123e+00 -3.681250000000000000e+01 -1.059880000000000155e+00 -3.681250000000000000e+01 -1.059885000000000188e+00 -3.681250000000000000e+01 -1.059889999999999999e+00 -3.681250000000000000e+01 -1.059895000000000032e+00 -3.681250000000000000e+01 -1.059900000000000064e+00 -3.690625000000000000e+01 -1.059905000000000097e+00 -3.678125000000000000e+01 -1.059910000000000130e+00 -3.678125000000000000e+01 -1.059915000000000163e+00 -3.690625000000000000e+01 -1.059920000000000195e+00 -3.684375000000000000e+01 -1.059925000000000006e+00 -3.684375000000000000e+01 -1.059930000000000039e+00 -3.687500381469726562e+01 -1.059935000000000072e+00 -3.687500381469726562e+01 -1.059940000000000104e+00 -3.681250000000000000e+01 -1.059945000000000137e+00 -3.687500381469726562e+01 -1.059950000000000170e+00 -3.684375000000000000e+01 -1.059954999999999981e+00 -3.681250000000000000e+01 -1.059960000000000013e+00 -3.687500381469726562e+01 -1.059965000000000046e+00 -3.687500381469726562e+01 -1.059970000000000079e+00 -3.678125000000000000e+01 -1.059975000000000112e+00 -3.687500381469726562e+01 -1.059980000000000144e+00 -3.687500381469726562e+01 -1.059985000000000177e+00 -3.684375000000000000e+01 -1.059989999999999988e+00 -3.690625000000000000e+01 -1.059995000000000021e+00 -3.681250000000000000e+01 -1.060000000000000053e+00 -3.678125000000000000e+01 -1.060005000000000086e+00 -3.687500381469726562e+01 -1.060010000000000119e+00 -3.687500381469726562e+01 -1.060015000000000152e+00 -3.687500381469726562e+01 -1.060020000000000184e+00 -3.684375000000000000e+01 -1.060024999999999995e+00 -3.684375000000000000e+01 -1.060030000000000028e+00 -3.687500381469726562e+01 -1.060035000000000061e+00 -3.690625000000000000e+01 -1.060040000000000093e+00 -3.687500381469726562e+01 -1.060045000000000126e+00 -3.690625000000000000e+01 -1.060050000000000159e+00 -3.681250000000000000e+01 -1.060055000000000192e+00 -3.687500381469726562e+01 -1.060060000000000002e+00 -3.684375000000000000e+01 -1.060065000000000035e+00 -3.684375000000000000e+01 -1.060070000000000068e+00 -3.687500381469726562e+01 -1.060075000000000101e+00 -3.687500381469726562e+01 -1.060080000000000133e+00 -3.687500381469726562e+01 -1.060085000000000166e+00 -3.690625000000000000e+01 -1.060089999999999977e+00 -3.684375000000000000e+01 -1.060095000000000010e+00 -3.684375000000000000e+01 -1.060100000000000042e+00 -3.690625000000000000e+01 -1.060105000000000075e+00 -3.690625000000000000e+01 -1.060110000000000108e+00 -3.687500381469726562e+01 -1.060115000000000141e+00 -3.684375000000000000e+01 -1.060120000000000173e+00 -3.684375000000000000e+01 -1.060124999999999984e+00 -3.681250000000000000e+01 -1.060130000000000017e+00 -3.687500381469726562e+01 -1.060135000000000050e+00 -3.687500381469726562e+01 -1.060140000000000082e+00 -3.681250000000000000e+01 -1.060145000000000115e+00 -3.684375000000000000e+01 -1.060150000000000148e+00 -3.681250000000000000e+01 -1.060155000000000181e+00 -3.687500381469726562e+01 -1.060159999999999991e+00 -3.693750000000000000e+01 -1.060165000000000024e+00 -3.690625000000000000e+01 -1.060170000000000057e+00 -3.684375000000000000e+01 -1.060175000000000090e+00 -3.687500381469726562e+01 -1.060180000000000122e+00 -3.690625000000000000e+01 -1.060185000000000155e+00 -3.687500381469726562e+01 -1.060190000000000188e+00 -3.684375000000000000e+01 -1.060194999999999999e+00 -3.690625000000000000e+01 -1.060200000000000031e+00 -3.684375000000000000e+01 -1.060205000000000064e+00 -3.684375000000000000e+01 -1.060210000000000097e+00 -3.681250000000000000e+01 -1.060215000000000130e+00 -3.684375000000000000e+01 -1.060220000000000162e+00 -3.687500381469726562e+01 -1.060225000000000195e+00 -3.684375000000000000e+01 -1.060230000000000006e+00 -3.687500381469726562e+01 -1.060235000000000039e+00 -3.684375000000000000e+01 -1.060240000000000071e+00 -3.681250000000000000e+01 -1.060245000000000104e+00 -3.684375000000000000e+01 -1.060250000000000137e+00 -3.687500381469726562e+01 -1.060255000000000170e+00 -3.687500381469726562e+01 -1.060259999999999980e+00 -3.681250000000000000e+01 -1.060265000000000013e+00 -3.681250000000000000e+01 -1.060270000000000046e+00 -3.681250000000000000e+01 -1.060275000000000079e+00 -3.687500381469726562e+01 -1.060280000000000111e+00 -3.687500381469726562e+01 -1.060285000000000144e+00 -3.684375000000000000e+01 -1.060290000000000177e+00 -3.684375000000000000e+01 -1.060294999999999987e+00 -3.687500381469726562e+01 -1.060300000000000020e+00 -3.690625000000000000e+01 -1.060305000000000053e+00 -3.684375000000000000e+01 -1.060310000000000086e+00 -3.684375000000000000e+01 -1.060315000000000119e+00 -3.681250000000000000e+01 -1.060320000000000151e+00 -3.681250000000000000e+01 -1.060325000000000184e+00 -3.684375000000000000e+01 -1.060329999999999995e+00 -3.690625000000000000e+01 -1.060335000000000027e+00 -3.687500381469726562e+01 -1.060340000000000060e+00 -3.687500381469726562e+01 -1.060345000000000093e+00 -3.681250000000000000e+01 -1.060350000000000126e+00 -3.687500381469726562e+01 -1.060355000000000159e+00 -3.687500381469726562e+01 -1.060360000000000191e+00 -3.690625000000000000e+01 -1.060365000000000002e+00 -3.681250000000000000e+01 -1.060370000000000035e+00 -3.684375000000000000e+01 -1.060375000000000068e+00 -3.684375000000000000e+01 -1.060380000000000100e+00 -3.684375000000000000e+01 -1.060385000000000133e+00 -3.687500381469726562e+01 -1.060390000000000166e+00 -3.684375000000000000e+01 -1.060394999999999976e+00 -3.687500381469726562e+01 -1.060400000000000009e+00 -3.690625000000000000e+01 -1.060405000000000042e+00 -3.684375000000000000e+01 -1.060410000000000075e+00 -3.687500381469726562e+01 -1.060415000000000108e+00 -3.687500381469726562e+01 -1.060420000000000140e+00 -3.696875000000000000e+01 -1.060425000000000173e+00 -3.690625000000000000e+01 -1.060429999999999984e+00 -3.693750000000000000e+01 -1.060435000000000016e+00 -3.690625000000000000e+01 -1.060440000000000049e+00 -3.690625000000000000e+01 -1.060445000000000082e+00 -3.696875000000000000e+01 -1.060450000000000115e+00 -3.700000000000000000e+01 -1.060455000000000148e+00 -3.690625000000000000e+01 -1.060460000000000180e+00 -3.684375000000000000e+01 -1.060464999999999991e+00 -3.693750000000000000e+01 -1.060470000000000024e+00 -3.693750000000000000e+01 -1.060475000000000056e+00 -3.690625000000000000e+01 -1.060480000000000089e+00 -3.687500381469726562e+01 -1.060485000000000122e+00 -3.690625000000000000e+01 -1.060490000000000155e+00 -3.700000000000000000e+01 -1.060495000000000188e+00 -3.693750000000000000e+01 -1.060499999999999998e+00 -3.690625000000000000e+01 -1.060505000000000031e+00 -3.687500381469726562e+01 -1.060510000000000064e+00 -3.690625000000000000e+01 -1.060515000000000096e+00 -3.693750000000000000e+01 -1.060520000000000129e+00 -3.690625000000000000e+01 -1.060525000000000162e+00 -3.690625000000000000e+01 -1.060530000000000195e+00 -3.687500381469726562e+01 -1.060535000000000005e+00 -3.690625000000000000e+01 -1.060540000000000038e+00 -3.690625000000000000e+01 -1.060545000000000071e+00 -3.687500381469726562e+01 -1.060550000000000104e+00 -3.700000000000000000e+01 -1.060555000000000136e+00 -3.690625000000000000e+01 -1.060560000000000169e+00 -3.690625000000000000e+01 -1.060564999999999980e+00 -3.693750000000000000e+01 -1.060570000000000013e+00 -3.690625000000000000e+01 -1.060575000000000045e+00 -3.693750000000000000e+01 -1.060580000000000078e+00 -3.690625000000000000e+01 -1.060585000000000111e+00 -3.696875000000000000e+01 -1.060590000000000144e+00 -3.687500381469726562e+01 -1.060595000000000176e+00 -3.690625000000000000e+01 -1.060599999999999987e+00 -3.690625000000000000e+01 -1.060605000000000020e+00 -3.693750000000000000e+01 -1.060610000000000053e+00 -3.690625000000000000e+01 -1.060615000000000085e+00 -3.690625000000000000e+01 -1.060620000000000118e+00 -3.696875000000000000e+01 -1.060625000000000151e+00 -3.693750000000000000e+01 -1.060630000000000184e+00 -3.693750000000000000e+01 -1.060634999999999994e+00 -3.693750000000000000e+01 -1.060640000000000027e+00 -3.690625000000000000e+01 -1.060645000000000060e+00 -3.690625000000000000e+01 -1.060650000000000093e+00 -3.696875000000000000e+01 -1.060655000000000125e+00 -3.687500381469726562e+01 -1.060660000000000158e+00 -3.700000000000000000e+01 -1.060665000000000191e+00 -3.696875000000000000e+01 -1.060670000000000002e+00 -3.696875000000000000e+01 -1.060675000000000034e+00 -3.693750000000000000e+01 -1.060680000000000067e+00 -3.696875000000000000e+01 -1.060685000000000100e+00 -3.690625000000000000e+01 -1.060690000000000133e+00 -3.693750000000000000e+01 -1.060695000000000165e+00 -3.687500381469726562e+01 -1.060699999999999976e+00 -3.687500381469726562e+01 -1.060705000000000009e+00 -3.687500381469726562e+01 -1.060710000000000042e+00 -3.687500381469726562e+01 -1.060715000000000074e+00 -3.687500381469726562e+01 -1.060720000000000107e+00 -3.690625000000000000e+01 -1.060725000000000140e+00 -3.684375000000000000e+01 -1.060730000000000173e+00 -3.690625000000000000e+01 -1.060734999999999983e+00 -3.687500381469726562e+01 -1.060740000000000016e+00 -3.687500381469726562e+01 -1.060745000000000049e+00 -3.693750000000000000e+01 -1.060750000000000082e+00 -3.690625000000000000e+01 -1.060755000000000114e+00 -3.681250000000000000e+01 -1.060760000000000147e+00 -3.690625000000000000e+01 -1.060765000000000180e+00 -3.690625000000000000e+01 -1.060769999999999991e+00 -3.684375000000000000e+01 -1.060775000000000023e+00 -3.690625000000000000e+01 -1.060780000000000056e+00 -3.693750000000000000e+01 -1.060785000000000089e+00 -3.690625000000000000e+01 -1.060790000000000122e+00 -3.690625000000000000e+01 -1.060795000000000154e+00 -3.696875000000000000e+01 -1.060800000000000187e+00 -3.693750000000000000e+01 -1.060804999999999998e+00 -3.693750000000000000e+01 -1.060810000000000031e+00 -3.690625000000000000e+01 -1.060815000000000063e+00 -3.696875000000000000e+01 -1.060820000000000096e+00 -3.690625000000000000e+01 -1.060825000000000129e+00 -3.690625000000000000e+01 -1.060830000000000162e+00 -3.696875000000000000e+01 -1.060835000000000194e+00 -3.693750000000000000e+01 -1.060840000000000005e+00 -3.690625000000000000e+01 -1.060845000000000038e+00 -3.690625000000000000e+01 -1.060850000000000071e+00 -3.693750000000000000e+01 -1.060855000000000103e+00 -3.693750000000000000e+01 -1.060860000000000136e+00 -3.696875000000000000e+01 -1.060865000000000169e+00 -3.696875000000000000e+01 -1.060869999999999980e+00 -3.696875000000000000e+01 -1.060875000000000012e+00 -3.696875000000000000e+01 -1.060880000000000045e+00 -3.700000000000000000e+01 -1.060885000000000078e+00 -3.690625000000000000e+01 -1.060890000000000111e+00 -3.696875000000000000e+01 -1.060895000000000143e+00 -3.690625000000000000e+01 -1.060900000000000176e+00 -3.693750000000000000e+01 -1.060904999999999987e+00 -3.693750000000000000e+01 -1.060910000000000020e+00 -3.693750000000000000e+01 -1.060915000000000052e+00 -3.693750000000000000e+01 -1.060920000000000085e+00 -3.696875000000000000e+01 -1.060925000000000118e+00 -3.693750000000000000e+01 -1.060930000000000151e+00 -3.696875000000000000e+01 -1.060935000000000183e+00 -3.690625000000000000e+01 -1.060939999999999994e+00 -3.696875000000000000e+01 -1.060945000000000027e+00 -3.696875000000000000e+01 -1.060950000000000060e+00 -3.693750000000000000e+01 -1.060955000000000092e+00 -3.696875000000000000e+01 -1.060960000000000125e+00 -3.696875000000000000e+01 -1.060965000000000158e+00 -3.700000000000000000e+01 -1.060970000000000191e+00 -3.700000000000000000e+01 -1.060975000000000001e+00 -3.693750000000000000e+01 -1.060980000000000034e+00 -3.696875000000000000e+01 -1.060985000000000067e+00 -3.693750000000000000e+01 -1.060990000000000100e+00 -3.700000000000000000e+01 -1.060995000000000132e+00 -3.700000000000000000e+01 -1.061000000000000165e+00 -3.696875000000000000e+01 -1.061004999999999976e+00 -3.696875000000000000e+01 -1.061010000000000009e+00 -3.700000000000000000e+01 -1.061015000000000041e+00 -3.703125381469726562e+01 -1.061020000000000074e+00 -3.693750000000000000e+01 -1.061025000000000107e+00 -3.696875000000000000e+01 -1.061030000000000140e+00 -3.703125381469726562e+01 -1.061035000000000172e+00 -3.700000000000000000e+01 -1.061039999999999983e+00 -3.696875000000000000e+01 -1.061045000000000016e+00 -3.696875000000000000e+01 -1.061050000000000049e+00 -3.696875000000000000e+01 -1.061055000000000081e+00 -3.696875000000000000e+01 -1.061060000000000114e+00 -3.696875000000000000e+01 -1.061065000000000147e+00 -3.700000000000000000e+01 -1.061070000000000180e+00 -3.700000000000000000e+01 -1.061074999999999990e+00 -3.693750000000000000e+01 -1.061080000000000023e+00 -3.696875000000000000e+01 -1.061085000000000056e+00 -3.693750000000000000e+01 -1.061090000000000089e+00 -3.690625000000000000e+01 -1.061095000000000121e+00 -3.696875000000000000e+01 -1.061100000000000154e+00 -3.700000000000000000e+01 -1.061105000000000187e+00 -3.696875000000000000e+01 -1.061109999999999998e+00 -3.693750000000000000e+01 -1.061115000000000030e+00 -3.693750000000000000e+01 -1.061120000000000063e+00 -3.693750000000000000e+01 -1.061125000000000096e+00 -3.690625000000000000e+01 -1.061130000000000129e+00 -3.696875000000000000e+01 -1.061135000000000161e+00 -3.696875000000000000e+01 -1.061140000000000194e+00 -3.690625000000000000e+01 -1.061145000000000005e+00 -3.693750000000000000e+01 -1.061150000000000038e+00 -3.687500381469726562e+01 -1.061155000000000070e+00 -3.696875000000000000e+01 -1.061160000000000103e+00 -3.693750000000000000e+01 -1.061165000000000136e+00 -3.700000000000000000e+01 -1.061170000000000169e+00 -3.696875000000000000e+01 -1.061174999999999979e+00 -3.696875000000000000e+01 -1.061180000000000012e+00 -3.693750000000000000e+01 -1.061185000000000045e+00 -3.700000000000000000e+01 -1.061190000000000078e+00 -3.700000000000000000e+01 -1.061195000000000110e+00 -3.700000000000000000e+01 -1.061200000000000143e+00 -3.700000000000000000e+01 -1.061205000000000176e+00 -3.703125381469726562e+01 -1.061209999999999987e+00 -3.703125381469726562e+01 -1.061215000000000019e+00 -3.696875000000000000e+01 -1.061220000000000052e+00 -3.703125381469726562e+01 -1.061225000000000085e+00 -3.703125381469726562e+01 -1.061230000000000118e+00 -3.703125381469726562e+01 -1.061235000000000150e+00 -3.703125381469726562e+01 -1.061240000000000183e+00 -3.703125381469726562e+01 -1.061244999999999994e+00 -3.703125381469726562e+01 -1.061250000000000027e+00 -3.700000000000000000e+01 -1.061255000000000059e+00 -3.703125381469726562e+01 -1.061260000000000092e+00 -3.700000000000000000e+01 -1.061265000000000125e+00 -3.703125381469726562e+01 -1.061270000000000158e+00 -3.700000000000000000e+01 -1.061275000000000190e+00 -3.703125381469726562e+01 -1.061280000000000001e+00 -3.706250000000000000e+01 -1.061285000000000034e+00 -3.700000000000000000e+01 -1.061290000000000067e+00 -3.703125381469726562e+01 -1.061295000000000099e+00 -3.700000000000000000e+01 -1.061300000000000132e+00 -3.700000000000000000e+01 -1.061305000000000165e+00 -3.703125381469726562e+01 -1.061310000000000198e+00 -3.700000000000000000e+01 -1.061315000000000008e+00 -3.700000000000000000e+01 -1.061320000000000041e+00 -3.706250000000000000e+01 -1.061325000000000074e+00 -3.700000000000000000e+01 -1.061330000000000107e+00 -3.700000000000000000e+01 -1.061335000000000139e+00 -3.700000000000000000e+01 -1.061340000000000172e+00 -3.703125381469726562e+01 -1.061344999999999983e+00 -3.700000000000000000e+01 -1.061350000000000016e+00 -3.700000000000000000e+01 -1.061355000000000048e+00 -3.706250000000000000e+01 -1.061360000000000081e+00 -3.700000000000000000e+01 -1.061365000000000114e+00 -3.700000000000000000e+01 -1.061370000000000147e+00 -3.700000000000000000e+01 -1.061375000000000179e+00 -3.700000000000000000e+01 -1.061379999999999990e+00 -3.703125381469726562e+01 -1.061385000000000023e+00 -3.706250000000000000e+01 -1.061390000000000056e+00 -3.703125381469726562e+01 -1.061395000000000088e+00 -3.700000000000000000e+01 -1.061400000000000121e+00 -3.703125381469726562e+01 -1.061405000000000154e+00 -3.703125381469726562e+01 -1.061410000000000187e+00 -3.706250000000000000e+01 -1.061414999999999997e+00 -3.700000000000000000e+01 -1.061420000000000030e+00 -3.703125381469726562e+01 -1.061425000000000063e+00 -3.706250000000000000e+01 -1.061430000000000096e+00 -3.700000000000000000e+01 -1.061435000000000128e+00 -3.703125381469726562e+01 -1.061440000000000161e+00 -3.706250000000000000e+01 -1.061445000000000194e+00 -3.703125381469726562e+01 -1.061450000000000005e+00 -3.706250000000000000e+01 -1.061455000000000037e+00 -3.703125381469726562e+01 -1.061460000000000070e+00 -3.703125381469726562e+01 -1.061465000000000103e+00 -3.703125381469726562e+01 -1.061470000000000136e+00 -3.700000000000000000e+01 -1.061475000000000168e+00 -3.700000000000000000e+01 -1.061479999999999979e+00 -3.700000000000000000e+01 -1.061485000000000012e+00 -3.700000000000000000e+01 -1.061490000000000045e+00 -3.700000000000000000e+01 -1.061495000000000077e+00 -3.693750000000000000e+01 -1.061500000000000110e+00 -3.700000000000000000e+01 -1.061505000000000143e+00 -3.703125381469726562e+01 -1.061510000000000176e+00 -3.703125381469726562e+01 -1.061514999999999986e+00 -3.696875000000000000e+01 -1.061520000000000019e+00 -3.700000000000000000e+01 -1.061525000000000052e+00 -3.703125381469726562e+01 -1.061530000000000085e+00 -3.703125381469726562e+01 -1.061535000000000117e+00 -3.700000000000000000e+01 -1.061540000000000150e+00 -3.700000000000000000e+01 -1.061545000000000183e+00 -3.700000000000000000e+01 -1.061549999999999994e+00 -3.696875000000000000e+01 -1.061555000000000026e+00 -3.700000000000000000e+01 -1.061560000000000059e+00 -3.706250000000000000e+01 -1.061565000000000092e+00 -3.703125381469726562e+01 -1.061570000000000125e+00 -3.700000000000000000e+01 -1.061575000000000157e+00 -3.700000000000000000e+01 -1.061580000000000190e+00 -3.696875000000000000e+01 -1.061585000000000001e+00 -3.703125381469726562e+01 -1.061590000000000034e+00 -3.700000000000000000e+01 -1.061595000000000066e+00 -3.703125381469726562e+01 -1.061600000000000099e+00 -3.703125381469726562e+01 -1.061605000000000132e+00 -3.703125381469726562e+01 -1.061610000000000165e+00 -3.703125381469726562e+01 -1.061615000000000197e+00 -3.703125381469726562e+01 -1.061620000000000008e+00 -3.700000000000000000e+01 -1.061625000000000041e+00 -3.703125381469726562e+01 -1.061630000000000074e+00 -3.703125381469726562e+01 -1.061635000000000106e+00 -3.706250000000000000e+01 -1.061640000000000139e+00 -3.706250000000000000e+01 -1.061645000000000172e+00 -3.703125381469726562e+01 -1.061649999999999983e+00 -3.700000000000000000e+01 -1.061655000000000015e+00 -3.706250000000000000e+01 -1.061660000000000048e+00 -3.706250000000000000e+01 -1.061665000000000081e+00 -3.709375000000000000e+01 -1.061670000000000114e+00 -3.709375000000000000e+01 -1.061675000000000146e+00 -3.706250000000000000e+01 -1.061680000000000179e+00 -3.712500381469726562e+01 -1.061684999999999990e+00 -3.706250000000000000e+01 -1.061690000000000023e+00 -3.706250000000000000e+01 -1.061695000000000055e+00 -3.709375000000000000e+01 -1.061700000000000088e+00 -3.715625000000000000e+01 -1.061705000000000121e+00 -3.709375000000000000e+01 -1.061710000000000154e+00 -3.703125381469726562e+01 -1.061715000000000186e+00 -3.706250000000000000e+01 -1.061719999999999997e+00 -3.706250000000000000e+01 -1.061725000000000030e+00 -3.706250000000000000e+01 -1.061730000000000063e+00 -3.709375000000000000e+01 -1.061735000000000095e+00 -3.706250000000000000e+01 -1.061740000000000128e+00 -3.709375000000000000e+01 -1.061745000000000161e+00 -3.706250000000000000e+01 -1.061750000000000194e+00 -3.703125381469726562e+01 -1.061755000000000004e+00 -3.709375000000000000e+01 -1.061760000000000037e+00 -3.709375000000000000e+01 -1.061765000000000070e+00 -3.706250000000000000e+01 -1.061770000000000103e+00 -3.715625000000000000e+01 -1.061775000000000135e+00 -3.703125381469726562e+01 -1.061780000000000168e+00 -3.712500381469726562e+01 -1.061784999999999979e+00 -3.706250000000000000e+01 -1.061790000000000012e+00 -3.706250000000000000e+01 -1.061795000000000044e+00 -3.703125381469726562e+01 -1.061800000000000077e+00 -3.706250000000000000e+01 -1.061805000000000110e+00 -3.709375000000000000e+01 -1.061810000000000143e+00 -3.703125381469726562e+01 -1.061815000000000175e+00 -3.703125381469726562e+01 -1.061819999999999986e+00 -3.706250000000000000e+01 -1.061825000000000019e+00 -3.706250000000000000e+01 -1.061830000000000052e+00 -3.709375000000000000e+01 -1.061835000000000084e+00 -3.703125381469726562e+01 -1.061840000000000117e+00 -3.706250000000000000e+01 -1.061845000000000150e+00 -3.703125381469726562e+01 -1.061850000000000183e+00 -3.706250000000000000e+01 -1.061854999999999993e+00 -3.709375000000000000e+01 -1.061860000000000026e+00 -3.706250000000000000e+01 -1.061865000000000059e+00 -3.712500381469726562e+01 -1.061870000000000092e+00 -3.709375000000000000e+01 -1.061875000000000124e+00 -3.712500381469726562e+01 -1.061880000000000157e+00 -3.709375000000000000e+01 -1.061885000000000190e+00 -3.712500381469726562e+01 -1.061890000000000001e+00 -3.709375000000000000e+01 -1.061895000000000033e+00 -3.709375000000000000e+01 -1.061900000000000066e+00 -3.712500381469726562e+01 -1.061905000000000099e+00 -3.706250000000000000e+01 -1.061910000000000132e+00 -3.706250000000000000e+01 -1.061915000000000164e+00 -3.712500381469726562e+01 -1.061920000000000197e+00 -3.712500381469726562e+01 -1.061925000000000008e+00 -3.709375000000000000e+01 -1.061930000000000041e+00 -3.703125381469726562e+01 -1.061935000000000073e+00 -3.709375000000000000e+01 -1.061940000000000106e+00 -3.703125381469726562e+01 -1.061945000000000139e+00 -3.703125381469726562e+01 -1.061950000000000172e+00 -3.706250000000000000e+01 -1.061954999999999982e+00 -3.703125381469726562e+01 -1.061960000000000015e+00 -3.709375000000000000e+01 -1.061965000000000048e+00 -3.706250000000000000e+01 -1.061970000000000081e+00 -3.706250000000000000e+01 -1.061975000000000113e+00 -3.703125381469726562e+01 -1.061980000000000146e+00 -3.706250000000000000e+01 -1.061985000000000179e+00 -3.706250000000000000e+01 -1.061989999999999990e+00 -3.700000000000000000e+01 -1.061995000000000022e+00 -3.712500381469726562e+01 -1.062000000000000055e+00 -3.706250000000000000e+01 -1.062005000000000088e+00 -3.706250000000000000e+01 -1.062010000000000121e+00 -3.706250000000000000e+01 -1.062015000000000153e+00 -3.709375000000000000e+01 -1.062020000000000186e+00 -3.709375000000000000e+01 -1.062024999999999997e+00 -3.706250000000000000e+01 -1.062030000000000030e+00 -3.700000000000000000e+01 -1.062035000000000062e+00 -3.706250000000000000e+01 -1.062040000000000095e+00 -3.709375000000000000e+01 -1.062045000000000128e+00 -3.712500381469726562e+01 -1.062050000000000161e+00 -3.709375000000000000e+01 -1.062055000000000193e+00 -3.709375000000000000e+01 -1.062060000000000004e+00 -3.703125381469726562e+01 -1.062065000000000037e+00 -3.709375000000000000e+01 -1.062070000000000070e+00 -3.712500381469726562e+01 -1.062075000000000102e+00 -3.709375000000000000e+01 -1.062080000000000135e+00 -3.709375000000000000e+01 -1.062085000000000168e+00 -3.712500381469726562e+01 -1.062089999999999979e+00 -3.712500381469726562e+01 -1.062095000000000011e+00 -3.712500381469726562e+01 -1.062100000000000044e+00 -3.712500381469726562e+01 -1.062105000000000077e+00 -3.712500381469726562e+01 -1.062110000000000110e+00 -3.712500381469726562e+01 -1.062115000000000142e+00 -3.712500381469726562e+01 -1.062120000000000175e+00 -3.712500381469726562e+01 -1.062124999999999986e+00 -3.715625000000000000e+01 -1.062130000000000019e+00 -3.712500381469726562e+01 -1.062135000000000051e+00 -3.715625000000000000e+01 -1.062140000000000084e+00 -3.709375000000000000e+01 -1.062145000000000117e+00 -3.709375000000000000e+01 -1.062150000000000150e+00 -3.712500381469726562e+01 -1.062155000000000182e+00 -3.712500381469726562e+01 -1.062159999999999993e+00 -3.715625000000000000e+01 -1.062165000000000026e+00 -3.709375000000000000e+01 -1.062170000000000059e+00 -3.712500381469726562e+01 -1.062175000000000091e+00 -3.715625000000000000e+01 -1.062180000000000124e+00 -3.712500381469726562e+01 -1.062185000000000157e+00 -3.712500381469726562e+01 -1.062190000000000190e+00 -3.706250000000000000e+01 -1.062195000000000000e+00 -3.715625000000000000e+01 -1.062200000000000033e+00 -3.715625000000000000e+01 -1.062205000000000066e+00 -3.706250000000000000e+01 -1.062210000000000099e+00 -3.715625000000000000e+01 -1.062215000000000131e+00 -3.715625000000000000e+01 -1.062220000000000164e+00 -3.709375000000000000e+01 -1.062225000000000197e+00 -3.715625000000000000e+01 -1.062230000000000008e+00 -3.718750000000000000e+01 -1.062235000000000040e+00 -3.709375000000000000e+01 -1.062240000000000073e+00 -3.715625000000000000e+01 -1.062245000000000106e+00 -3.706250000000000000e+01 -1.062250000000000139e+00 -3.709375000000000000e+01 -1.062255000000000171e+00 -3.712500381469726562e+01 -1.062259999999999982e+00 -3.709375000000000000e+01 -1.062265000000000015e+00 -3.706250000000000000e+01 -1.062270000000000048e+00 -3.715625000000000000e+01 -1.062275000000000080e+00 -3.709375000000000000e+01 -1.062280000000000113e+00 -3.715625000000000000e+01 -1.062285000000000146e+00 -3.709375000000000000e+01 -1.062290000000000179e+00 -3.712500381469726562e+01 -1.062294999999999989e+00 -3.709375000000000000e+01 -1.062300000000000022e+00 -3.706250000000000000e+01 -1.062305000000000055e+00 -3.709375000000000000e+01 -1.062310000000000088e+00 -3.709375000000000000e+01 -1.062315000000000120e+00 -3.712500381469726562e+01 -1.062320000000000153e+00 -3.709375000000000000e+01 -1.062325000000000186e+00 -3.715625000000000000e+01 -1.062329999999999997e+00 -3.712500381469726562e+01 -1.062335000000000029e+00 -3.715625000000000000e+01 -1.062340000000000062e+00 -3.706250000000000000e+01 -1.062345000000000095e+00 -3.712500381469726562e+01 -1.062350000000000128e+00 -3.706250000000000000e+01 -1.062355000000000160e+00 -3.715625000000000000e+01 -1.062360000000000193e+00 -3.715625000000000000e+01 -1.062365000000000004e+00 -3.715625000000000000e+01 -1.062370000000000037e+00 -3.715625000000000000e+01 -1.062375000000000069e+00 -3.715625000000000000e+01 -1.062380000000000102e+00 -3.715625000000000000e+01 -1.062385000000000135e+00 -3.718750000000000000e+01 -1.062390000000000168e+00 -3.715625000000000000e+01 -1.062394999999999978e+00 -3.709375000000000000e+01 -1.062400000000000011e+00 -3.715625000000000000e+01 -1.062405000000000044e+00 -3.718750000000000000e+01 -1.062410000000000077e+00 -3.712500381469726562e+01 -1.062415000000000109e+00 -3.718750000000000000e+01 -1.062420000000000142e+00 -3.712500381469726562e+01 -1.062425000000000175e+00 -3.715625000000000000e+01 -1.062429999999999986e+00 -3.718750000000000000e+01 -1.062435000000000018e+00 -3.715625000000000000e+01 -1.062440000000000051e+00 -3.715625000000000000e+01 -1.062445000000000084e+00 -3.712500381469726562e+01 -1.062450000000000117e+00 -3.715625000000000000e+01 -1.062455000000000149e+00 -3.715625000000000000e+01 -1.062460000000000182e+00 -3.721875000000000000e+01 -1.062464999999999993e+00 -3.721875000000000000e+01 -1.062470000000000026e+00 -3.718750000000000000e+01 -1.062475000000000058e+00 -3.715625000000000000e+01 -1.062480000000000091e+00 -3.718750000000000000e+01 -1.062485000000000124e+00 -3.718750000000000000e+01 -1.062490000000000157e+00 -3.721875000000000000e+01 -1.062495000000000189e+00 -3.715625000000000000e+01 -1.062500000000000000e+00 -3.712500381469726562e+01 -1.062505000000000033e+00 -3.715625000000000000e+01 -1.062510000000000066e+00 -3.712500381469726562e+01 -1.062515000000000098e+00 -3.718750000000000000e+01 -1.062520000000000131e+00 -3.721875000000000000e+01 -1.062525000000000164e+00 -3.712500381469726562e+01 -1.062530000000000197e+00 -3.715625000000000000e+01 -1.062535000000000007e+00 -3.712500381469726562e+01 -1.062540000000000040e+00 -3.712500381469726562e+01 -1.062545000000000073e+00 -3.715625000000000000e+01 -1.062550000000000106e+00 -3.709375000000000000e+01 -1.062555000000000138e+00 -3.718750000000000000e+01 -1.062560000000000171e+00 -3.715625000000000000e+01 -1.062564999999999982e+00 -3.715625000000000000e+01 -1.062570000000000014e+00 -3.712500381469726562e+01 -1.062575000000000047e+00 -3.709375000000000000e+01 -1.062580000000000080e+00 -3.712500381469726562e+01 -1.062585000000000113e+00 -3.715625000000000000e+01 -1.062590000000000146e+00 -3.718750000000000000e+01 -1.062595000000000178e+00 -3.715625000000000000e+01 -1.062599999999999989e+00 -3.721875000000000000e+01 -1.062605000000000022e+00 -3.718750000000000000e+01 -1.062610000000000054e+00 -3.718750000000000000e+01 -1.062615000000000087e+00 -3.715625000000000000e+01 -1.062620000000000120e+00 -3.712500381469726562e+01 -1.062625000000000153e+00 -3.718750000000000000e+01 -1.062630000000000186e+00 -3.712500381469726562e+01 -1.062634999999999996e+00 -3.718750000000000000e+01 -1.062640000000000029e+00 -3.715625000000000000e+01 -1.062645000000000062e+00 -3.715625000000000000e+01 -1.062650000000000095e+00 -3.709375000000000000e+01 -1.062655000000000127e+00 -3.718750000000000000e+01 -1.062660000000000160e+00 -3.712500381469726562e+01 -1.062665000000000193e+00 -3.712500381469726562e+01 -1.062670000000000003e+00 -3.715625000000000000e+01 -1.062675000000000036e+00 -3.715625000000000000e+01 -1.062680000000000069e+00 -3.718750000000000000e+01 -1.062685000000000102e+00 -3.715625000000000000e+01 -1.062690000000000135e+00 -3.715625000000000000e+01 -1.062695000000000167e+00 -3.718750000000000000e+01 -1.062699999999999978e+00 -3.715625000000000000e+01 -1.062705000000000011e+00 -3.715625000000000000e+01 -1.062710000000000043e+00 -3.718750000000000000e+01 -1.062715000000000076e+00 -3.721875000000000000e+01 -1.062720000000000109e+00 -3.718750000000000000e+01 -1.062725000000000142e+00 -3.721875000000000000e+01 -1.062730000000000175e+00 -3.712500381469726562e+01 -1.062734999999999985e+00 -3.715625000000000000e+01 -1.062740000000000018e+00 -3.718750000000000000e+01 -1.062745000000000051e+00 -3.715625000000000000e+01 -1.062750000000000083e+00 -3.721875000000000000e+01 -1.062755000000000116e+00 -3.721875000000000000e+01 -1.062760000000000149e+00 -3.712500381469726562e+01 -1.062765000000000182e+00 -3.712500381469726562e+01 -1.062769999999999992e+00 -3.718750000000000000e+01 -1.062775000000000025e+00 -3.715625000000000000e+01 -1.062780000000000058e+00 -3.715625000000000000e+01 -1.062785000000000091e+00 -3.718750000000000000e+01 -1.062790000000000123e+00 -3.718750000000000000e+01 -1.062795000000000156e+00 -3.718750000000000000e+01 -1.062800000000000189e+00 -3.728125381469726562e+01 -1.062805000000000000e+00 -3.715625000000000000e+01 -1.062810000000000032e+00 -3.725000000000000000e+01 -1.062815000000000065e+00 -3.712500381469726562e+01 -1.062820000000000098e+00 -3.715625000000000000e+01 -1.062825000000000131e+00 -3.721875000000000000e+01 -1.062830000000000163e+00 -3.718750000000000000e+01 -1.062835000000000196e+00 -3.721875000000000000e+01 -1.062840000000000007e+00 -3.721875000000000000e+01 -1.062845000000000040e+00 -3.721875000000000000e+01 -1.062850000000000072e+00 -3.718750000000000000e+01 -1.062855000000000105e+00 -3.718750000000000000e+01 -1.062860000000000138e+00 -3.715625000000000000e+01 -1.062865000000000171e+00 -3.718750000000000000e+01 -1.062869999999999981e+00 -3.721875000000000000e+01 -1.062875000000000014e+00 -3.718750000000000000e+01 -1.062880000000000047e+00 -3.715625000000000000e+01 -1.062885000000000080e+00 -3.715625000000000000e+01 -1.062890000000000112e+00 -3.715625000000000000e+01 -1.062895000000000145e+00 -3.715625000000000000e+01 -1.062900000000000178e+00 -3.718750000000000000e+01 -1.062904999999999989e+00 -3.718750000000000000e+01 -1.062910000000000021e+00 -3.718750000000000000e+01 -1.062915000000000054e+00 -3.718750000000000000e+01 -1.062920000000000087e+00 -3.721875000000000000e+01 -1.062925000000000120e+00 -3.718750000000000000e+01 -1.062930000000000152e+00 -3.715625000000000000e+01 -1.062935000000000185e+00 -3.725000000000000000e+01 -1.062939999999999996e+00 -3.715625000000000000e+01 -1.062945000000000029e+00 -3.718750000000000000e+01 -1.062950000000000061e+00 -3.721875000000000000e+01 -1.062955000000000094e+00 -3.718750000000000000e+01 -1.062960000000000127e+00 -3.718750000000000000e+01 -1.062965000000000160e+00 -3.715625000000000000e+01 -1.062970000000000192e+00 -3.715625000000000000e+01 -1.062975000000000003e+00 -3.715625000000000000e+01 -1.062980000000000036e+00 -3.715625000000000000e+01 -1.062985000000000069e+00 -3.712500381469726562e+01 -1.062990000000000101e+00 -3.715625000000000000e+01 -1.062995000000000134e+00 -3.721875000000000000e+01 -1.063000000000000167e+00 -3.715625000000000000e+01 -1.063004999999999978e+00 -3.721875000000000000e+01 -1.063010000000000010e+00 -3.721875000000000000e+01 -1.063015000000000043e+00 -3.725000000000000000e+01 -1.063020000000000076e+00 -3.715625000000000000e+01 -1.063025000000000109e+00 -3.721875000000000000e+01 -1.063030000000000141e+00 -3.721875000000000000e+01 -1.063035000000000174e+00 -3.718750000000000000e+01 -1.063039999999999985e+00 -3.721875000000000000e+01 -1.063045000000000018e+00 -3.725000000000000000e+01 -1.063050000000000050e+00 -3.718750000000000000e+01 -1.063055000000000083e+00 -3.721875000000000000e+01 -1.063060000000000116e+00 -3.715625000000000000e+01 -1.063065000000000149e+00 -3.715625000000000000e+01 -1.063070000000000181e+00 -3.721875000000000000e+01 -1.063074999999999992e+00 -3.715625000000000000e+01 -1.063080000000000025e+00 -3.712500381469726562e+01 -1.063085000000000058e+00 -3.721875000000000000e+01 -1.063090000000000090e+00 -3.715625000000000000e+01 -1.063095000000000123e+00 -3.718750000000000000e+01 -1.063100000000000156e+00 -3.709375000000000000e+01 -1.063105000000000189e+00 -3.715625000000000000e+01 -1.063109999999999999e+00 -3.718750000000000000e+01 -1.063115000000000032e+00 -3.712500381469726562e+01 -1.063120000000000065e+00 -3.715625000000000000e+01 -1.063125000000000098e+00 -3.715625000000000000e+01 -1.063130000000000130e+00 -3.718750000000000000e+01 -1.063135000000000163e+00 -3.718750000000000000e+01 -1.063140000000000196e+00 -3.715625000000000000e+01 -1.063145000000000007e+00 -3.718750000000000000e+01 -1.063150000000000039e+00 -3.715625000000000000e+01 -1.063155000000000072e+00 -3.718750000000000000e+01 -1.063160000000000105e+00 -3.721875000000000000e+01 -1.063165000000000138e+00 -3.718750000000000000e+01 -1.063170000000000170e+00 -3.715625000000000000e+01 -1.063174999999999981e+00 -3.712500381469726562e+01 -1.063180000000000014e+00 -3.712500381469726562e+01 -1.063185000000000047e+00 -3.709375000000000000e+01 -1.063190000000000079e+00 -3.709375000000000000e+01 -1.063195000000000112e+00 -3.703125381469726562e+01 -1.063200000000000145e+00 -3.715625000000000000e+01 -1.063205000000000178e+00 -3.715625000000000000e+01 -1.063209999999999988e+00 -3.715625000000000000e+01 -1.063215000000000021e+00 -3.715625000000000000e+01 -1.063220000000000054e+00 -3.712500381469726562e+01 -1.063225000000000087e+00 -3.712500381469726562e+01 -1.063230000000000119e+00 -3.715625000000000000e+01 -1.063235000000000152e+00 -3.712500381469726562e+01 -1.063240000000000185e+00 -3.718750000000000000e+01 -1.063244999999999996e+00 -3.712500381469726562e+01 -1.063250000000000028e+00 -3.715625000000000000e+01 -1.063255000000000061e+00 -3.715625000000000000e+01 -1.063260000000000094e+00 -3.715625000000000000e+01 -1.063265000000000127e+00 -3.721875000000000000e+01 -1.063270000000000159e+00 -3.718750000000000000e+01 -1.063275000000000192e+00 -3.718750000000000000e+01 -1.063280000000000003e+00 -3.718750000000000000e+01 -1.063285000000000036e+00 -3.718750000000000000e+01 -1.063290000000000068e+00 -3.718750000000000000e+01 -1.063295000000000101e+00 -3.715625000000000000e+01 -1.063300000000000134e+00 -3.721875000000000000e+01 -1.063305000000000167e+00 -3.718750000000000000e+01 -1.063309999999999977e+00 -3.718750000000000000e+01 -1.063315000000000010e+00 -3.721875000000000000e+01 -1.063320000000000043e+00 -3.718750000000000000e+01 -1.063325000000000076e+00 -3.725000000000000000e+01 -1.063330000000000108e+00 -3.721875000000000000e+01 -1.063335000000000141e+00 -3.721875000000000000e+01 -1.063340000000000174e+00 -3.721875000000000000e+01 -1.063344999999999985e+00 -3.718750000000000000e+01 -1.063350000000000017e+00 -3.718750000000000000e+01 -1.063355000000000050e+00 -3.721875000000000000e+01 -1.063360000000000083e+00 -3.725000000000000000e+01 -1.063365000000000116e+00 -3.721875000000000000e+01 -1.063370000000000148e+00 -3.718750000000000000e+01 -1.063375000000000181e+00 -3.728125381469726562e+01 -1.063379999999999992e+00 -3.721875000000000000e+01 -1.063385000000000025e+00 -3.721875000000000000e+01 -1.063390000000000057e+00 -3.725000000000000000e+01 -1.063395000000000090e+00 -3.721875000000000000e+01 -1.063400000000000123e+00 -3.718750000000000000e+01 -1.063405000000000156e+00 -3.718750000000000000e+01 -1.063410000000000188e+00 -3.725000000000000000e+01 -1.063414999999999999e+00 -3.718750000000000000e+01 -1.063420000000000032e+00 -3.725000000000000000e+01 -1.063425000000000065e+00 -3.725000000000000000e+01 -1.063430000000000097e+00 -3.718750000000000000e+01 -1.063435000000000130e+00 -3.718750000000000000e+01 -1.063440000000000163e+00 -3.728125381469726562e+01 -1.063445000000000196e+00 -3.721875000000000000e+01 -1.063450000000000006e+00 -3.721875000000000000e+01 -1.063455000000000039e+00 -3.725000000000000000e+01 -1.063460000000000072e+00 -3.725000000000000000e+01 -1.063465000000000105e+00 -3.721875000000000000e+01 -1.063470000000000137e+00 -3.721875000000000000e+01 -1.063475000000000170e+00 -3.725000000000000000e+01 -1.063479999999999981e+00 -3.721875000000000000e+01 -1.063485000000000014e+00 -3.721875000000000000e+01 -1.063490000000000046e+00 -3.715625000000000000e+01 -1.063495000000000079e+00 -3.728125381469726562e+01 -1.063500000000000112e+00 -3.725000000000000000e+01 -1.063505000000000145e+00 -3.721875000000000000e+01 -1.063510000000000177e+00 -3.721875000000000000e+01 -1.063514999999999988e+00 -3.725000000000000000e+01 -1.063520000000000021e+00 -3.721875000000000000e+01 -1.063525000000000054e+00 -3.725000000000000000e+01 -1.063530000000000086e+00 -3.718750000000000000e+01 -1.063535000000000119e+00 -3.718750000000000000e+01 -1.063540000000000152e+00 -3.725000000000000000e+01 -1.063545000000000185e+00 -3.721875000000000000e+01 -1.063549999999999995e+00 -3.725000000000000000e+01 -1.063555000000000028e+00 -3.725000000000000000e+01 -1.063560000000000061e+00 -3.721875000000000000e+01 -1.063565000000000094e+00 -3.718750000000000000e+01 -1.063570000000000126e+00 -3.718750000000000000e+01 -1.063575000000000159e+00 -3.721875000000000000e+01 -1.063580000000000192e+00 -3.725000000000000000e+01 -1.063585000000000003e+00 -3.721875000000000000e+01 -1.063590000000000035e+00 -3.718750000000000000e+01 -1.063595000000000068e+00 -3.721875000000000000e+01 -1.063600000000000101e+00 -3.721875000000000000e+01 -1.063605000000000134e+00 -3.718750000000000000e+01 -1.063610000000000166e+00 -3.718750000000000000e+01 -1.063614999999999977e+00 -3.725000000000000000e+01 -1.063620000000000010e+00 -3.725000000000000000e+01 -1.063625000000000043e+00 -3.721875000000000000e+01 -1.063630000000000075e+00 -3.731250000000000000e+01 -1.063635000000000108e+00 -3.728125381469726562e+01 -1.063640000000000141e+00 -3.721875000000000000e+01 -1.063645000000000174e+00 -3.721875000000000000e+01 -1.063649999999999984e+00 -3.728125381469726562e+01 -1.063655000000000017e+00 -3.721875000000000000e+01 -1.063660000000000050e+00 -3.718750000000000000e+01 -1.063665000000000083e+00 -3.725000000000000000e+01 -1.063670000000000115e+00 -3.718750000000000000e+01 -1.063675000000000148e+00 -3.721875000000000000e+01 -1.063680000000000181e+00 -3.718750000000000000e+01 -1.063684999999999992e+00 -3.721875000000000000e+01 -1.063690000000000024e+00 -3.728125381469726562e+01 -1.063695000000000057e+00 -3.725000000000000000e+01 -1.063700000000000090e+00 -3.718750000000000000e+01 -1.063705000000000123e+00 -3.728125381469726562e+01 -1.063710000000000155e+00 -3.725000000000000000e+01 -1.063715000000000188e+00 -3.728125381469726562e+01 -1.063719999999999999e+00 -3.728125381469726562e+01 -1.063725000000000032e+00 -3.721875000000000000e+01 -1.063730000000000064e+00 -3.725000000000000000e+01 -1.063735000000000097e+00 -3.725000000000000000e+01 -1.063740000000000130e+00 -3.721875000000000000e+01 -1.063745000000000163e+00 -3.721875000000000000e+01 -1.063750000000000195e+00 -3.718750000000000000e+01 -1.063755000000000006e+00 -3.721875000000000000e+01 -1.063760000000000039e+00 -3.721875000000000000e+01 -1.063765000000000072e+00 -3.728125381469726562e+01 -1.063770000000000104e+00 -3.721875000000000000e+01 -1.063775000000000137e+00 -3.718750000000000000e+01 -1.063780000000000170e+00 -3.718750000000000000e+01 -1.063784999999999981e+00 -3.725000000000000000e+01 -1.063790000000000013e+00 -3.728125381469726562e+01 -1.063795000000000046e+00 -3.728125381469726562e+01 -1.063800000000000079e+00 -3.721875000000000000e+01 -1.063805000000000112e+00 -3.718750000000000000e+01 -1.063810000000000144e+00 -3.718750000000000000e+01 -1.063815000000000177e+00 -3.728125381469726562e+01 -1.063819999999999988e+00 -3.725000000000000000e+01 -1.063825000000000021e+00 -3.725000000000000000e+01 -1.063830000000000053e+00 -3.718750000000000000e+01 -1.063835000000000086e+00 -3.715625000000000000e+01 -1.063840000000000119e+00 -3.715625000000000000e+01 -1.063845000000000152e+00 -3.718750000000000000e+01 -1.063850000000000184e+00 -3.718750000000000000e+01 -1.063854999999999995e+00 -3.721875000000000000e+01 -1.063860000000000028e+00 -3.725000000000000000e+01 -1.063865000000000061e+00 -3.718750000000000000e+01 -1.063870000000000093e+00 -3.725000000000000000e+01 -1.063875000000000126e+00 -3.718750000000000000e+01 -1.063880000000000159e+00 -3.718750000000000000e+01 -1.063885000000000192e+00 -3.715625000000000000e+01 -1.063890000000000002e+00 -3.718750000000000000e+01 -1.063895000000000035e+00 -3.721875000000000000e+01 -1.063900000000000068e+00 -3.728125381469726562e+01 -1.063905000000000101e+00 -3.725000000000000000e+01 -1.063910000000000133e+00 -3.725000000000000000e+01 -1.063915000000000166e+00 -3.728125381469726562e+01 -1.063919999999999977e+00 -3.718750000000000000e+01 -1.063925000000000010e+00 -3.728125381469726562e+01 -1.063930000000000042e+00 -3.725000000000000000e+01 -1.063935000000000075e+00 -3.728125381469726562e+01 -1.063940000000000108e+00 -3.721875000000000000e+01 -1.063945000000000141e+00 -3.718750000000000000e+01 -1.063950000000000173e+00 -3.728125381469726562e+01 -1.063954999999999984e+00 -3.728125381469726562e+01 -1.063960000000000017e+00 -3.721875000000000000e+01 -1.063965000000000050e+00 -3.721875000000000000e+01 -1.063970000000000082e+00 -3.728125381469726562e+01 -1.063975000000000115e+00 -3.721875000000000000e+01 -1.063980000000000148e+00 -3.718750000000000000e+01 -1.063985000000000181e+00 -3.718750000000000000e+01 -1.063989999999999991e+00 -3.721875000000000000e+01 -1.063995000000000024e+00 -3.721875000000000000e+01 -1.064000000000000057e+00 -3.718750000000000000e+01 -1.064005000000000090e+00 -3.725000000000000000e+01 -1.064010000000000122e+00 -3.721875000000000000e+01 -1.064015000000000155e+00 -3.721875000000000000e+01 -1.064020000000000188e+00 -3.721875000000000000e+01 -1.064024999999999999e+00 -3.721875000000000000e+01 -1.064030000000000031e+00 -3.725000000000000000e+01 -1.064035000000000064e+00 -3.725000000000000000e+01 -1.064040000000000097e+00 -3.725000000000000000e+01 -1.064045000000000130e+00 -3.721875000000000000e+01 -1.064050000000000162e+00 -3.725000000000000000e+01 -1.064055000000000195e+00 -3.725000000000000000e+01 -1.064060000000000006e+00 -3.721875000000000000e+01 -1.064065000000000039e+00 -3.721875000000000000e+01 -1.064070000000000071e+00 -3.725000000000000000e+01 -1.064075000000000104e+00 -3.718750000000000000e+01 -1.064080000000000137e+00 -3.718750000000000000e+01 -1.064085000000000170e+00 -3.721875000000000000e+01 -1.064089999999999980e+00 -3.718750000000000000e+01 -1.064095000000000013e+00 -3.721875000000000000e+01 -1.064100000000000046e+00 -3.725000000000000000e+01 -1.064105000000000079e+00 -3.725000000000000000e+01 -1.064110000000000111e+00 -3.721875000000000000e+01 -1.064115000000000144e+00 -3.718750000000000000e+01 -1.064120000000000177e+00 -3.721875000000000000e+01 -1.064124999999999988e+00 -3.721875000000000000e+01 -1.064130000000000020e+00 -3.721875000000000000e+01 -1.064135000000000053e+00 -3.725000000000000000e+01 -1.064140000000000086e+00 -3.715625000000000000e+01 -1.064145000000000119e+00 -3.721875000000000000e+01 -1.064150000000000151e+00 -3.721875000000000000e+01 -1.064155000000000184e+00 -3.721875000000000000e+01 -1.064159999999999995e+00 -3.718750000000000000e+01 -1.064165000000000028e+00 -3.718750000000000000e+01 -1.064170000000000060e+00 -3.718750000000000000e+01 -1.064175000000000093e+00 -3.715625000000000000e+01 -1.064180000000000126e+00 -3.718750000000000000e+01 -1.064185000000000159e+00 -3.721875000000000000e+01 -1.064190000000000191e+00 -3.718750000000000000e+01 -1.064195000000000002e+00 -3.718750000000000000e+01 -1.064200000000000035e+00 -3.725000000000000000e+01 -1.064205000000000068e+00 -3.721875000000000000e+01 -1.064210000000000100e+00 -3.721875000000000000e+01 -1.064215000000000133e+00 -3.721875000000000000e+01 -1.064220000000000166e+00 -3.728125381469726562e+01 -1.064224999999999977e+00 -3.728125381469726562e+01 -1.064230000000000009e+00 -3.725000000000000000e+01 -1.064235000000000042e+00 -3.725000000000000000e+01 -1.064240000000000075e+00 -3.731250000000000000e+01 -1.064245000000000108e+00 -3.721875000000000000e+01 -1.064250000000000140e+00 -3.725000000000000000e+01 -1.064255000000000173e+00 -3.715625000000000000e+01 -1.064259999999999984e+00 -3.718750000000000000e+01 -1.064265000000000017e+00 -3.718750000000000000e+01 -1.064270000000000049e+00 -3.721875000000000000e+01 -1.064275000000000082e+00 -3.725000000000000000e+01 -1.064280000000000115e+00 -3.718750000000000000e+01 -1.064285000000000148e+00 -3.725000000000000000e+01 -1.064290000000000180e+00 -3.725000000000000000e+01 -1.064294999999999991e+00 -3.718750000000000000e+01 -1.064300000000000024e+00 -3.725000000000000000e+01 -1.064305000000000057e+00 -3.718750000000000000e+01 -1.064310000000000089e+00 -3.721875000000000000e+01 -1.064315000000000122e+00 -3.718750000000000000e+01 -1.064320000000000155e+00 -3.725000000000000000e+01 -1.064325000000000188e+00 -3.728125381469726562e+01 -1.064329999999999998e+00 -3.728125381469726562e+01 -1.064335000000000031e+00 -3.725000000000000000e+01 -1.064340000000000064e+00 -3.721875000000000000e+01 -1.064345000000000097e+00 -3.725000000000000000e+01 -1.064350000000000129e+00 -3.721875000000000000e+01 -1.064355000000000162e+00 -3.731250000000000000e+01 -1.064360000000000195e+00 -3.728125381469726562e+01 -1.064365000000000006e+00 -3.718750000000000000e+01 -1.064370000000000038e+00 -3.725000000000000000e+01 -1.064375000000000071e+00 -3.725000000000000000e+01 -1.064380000000000104e+00 -3.725000000000000000e+01 -1.064385000000000137e+00 -3.728125381469726562e+01 -1.064390000000000169e+00 -3.721875000000000000e+01 -1.064394999999999980e+00 -3.721875000000000000e+01 -1.064400000000000013e+00 -3.721875000000000000e+01 -1.064405000000000046e+00 -3.728125381469726562e+01 -1.064410000000000078e+00 -3.718750000000000000e+01 -1.064415000000000111e+00 -3.725000000000000000e+01 -1.064420000000000144e+00 -3.715625000000000000e+01 -1.064425000000000177e+00 -3.728125381469726562e+01 -1.064429999999999987e+00 -3.725000000000000000e+01 -1.064435000000000020e+00 -3.721875000000000000e+01 -1.064440000000000053e+00 -3.718750000000000000e+01 -1.064445000000000086e+00 -3.721875000000000000e+01 -1.064450000000000118e+00 -3.725000000000000000e+01 -1.064455000000000151e+00 -3.725000000000000000e+01 -1.064460000000000184e+00 -3.725000000000000000e+01 -1.064464999999999995e+00 -3.725000000000000000e+01 -1.064470000000000027e+00 -3.721875000000000000e+01 -1.064475000000000060e+00 -3.728125381469726562e+01 -1.064480000000000093e+00 -3.721875000000000000e+01 -1.064485000000000126e+00 -3.731250000000000000e+01 -1.064490000000000158e+00 -3.721875000000000000e+01 -1.064495000000000191e+00 -3.721875000000000000e+01 -1.064500000000000002e+00 -3.721875000000000000e+01 -1.064505000000000035e+00 -3.721875000000000000e+01 -1.064510000000000067e+00 -3.718750000000000000e+01 -1.064515000000000100e+00 -3.721875000000000000e+01 -1.064520000000000133e+00 -3.728125381469726562e+01 -1.064525000000000166e+00 -3.725000000000000000e+01 -1.064529999999999976e+00 -3.721875000000000000e+01 -1.064535000000000009e+00 -3.725000000000000000e+01 -1.064540000000000042e+00 -3.721875000000000000e+01 -1.064545000000000075e+00 -3.725000000000000000e+01 -1.064550000000000107e+00 -3.721875000000000000e+01 -1.064555000000000140e+00 -3.725000000000000000e+01 -1.064560000000000173e+00 -3.718750000000000000e+01 -1.064564999999999984e+00 -3.718750000000000000e+01 -1.064570000000000016e+00 -3.718750000000000000e+01 -1.064575000000000049e+00 -3.718750000000000000e+01 -1.064580000000000082e+00 -3.715625000000000000e+01 -1.064585000000000115e+00 -3.721875000000000000e+01 -1.064590000000000147e+00 -3.718750000000000000e+01 -1.064595000000000180e+00 -3.718750000000000000e+01 -1.064599999999999991e+00 -3.728125381469726562e+01 -1.064605000000000024e+00 -3.728125381469726562e+01 -1.064610000000000056e+00 -3.718750000000000000e+01 -1.064615000000000089e+00 -3.718750000000000000e+01 -1.064620000000000122e+00 -3.721875000000000000e+01 -1.064625000000000155e+00 -3.721875000000000000e+01 -1.064630000000000187e+00 -3.721875000000000000e+01 -1.064634999999999998e+00 -3.721875000000000000e+01 -1.064640000000000031e+00 -3.715625000000000000e+01 -1.064645000000000064e+00 -3.728125381469726562e+01 -1.064650000000000096e+00 -3.721875000000000000e+01 -1.064655000000000129e+00 -3.718750000000000000e+01 -1.064660000000000162e+00 -3.718750000000000000e+01 -1.064665000000000195e+00 -3.718750000000000000e+01 -1.064670000000000005e+00 -3.721875000000000000e+01 -1.064675000000000038e+00 -3.721875000000000000e+01 -1.064680000000000071e+00 -3.721875000000000000e+01 -1.064685000000000104e+00 -3.718750000000000000e+01 -1.064690000000000136e+00 -3.721875000000000000e+01 -1.064695000000000169e+00 -3.718750000000000000e+01 -1.064699999999999980e+00 -3.721875000000000000e+01 -1.064705000000000013e+00 -3.718750000000000000e+01 -1.064710000000000045e+00 -3.718750000000000000e+01 -1.064715000000000078e+00 -3.715625000000000000e+01 -1.064720000000000111e+00 -3.721875000000000000e+01 -1.064725000000000144e+00 -3.718750000000000000e+01 -1.064730000000000176e+00 -3.715625000000000000e+01 -1.064734999999999987e+00 -3.721875000000000000e+01 -1.064740000000000020e+00 -3.715625000000000000e+01 -1.064745000000000053e+00 -3.718750000000000000e+01 -1.064750000000000085e+00 -3.718750000000000000e+01 -1.064755000000000118e+00 -3.718750000000000000e+01 -1.064760000000000151e+00 -3.715625000000000000e+01 -1.064765000000000184e+00 -3.718750000000000000e+01 -1.064769999999999994e+00 -3.715625000000000000e+01 -1.064775000000000027e+00 -3.725000000000000000e+01 -1.064780000000000060e+00 -3.718750000000000000e+01 -1.064785000000000093e+00 -3.721875000000000000e+01 -1.064790000000000125e+00 -3.715625000000000000e+01 -1.064795000000000158e+00 -3.725000000000000000e+01 -1.064800000000000191e+00 -3.721875000000000000e+01 -1.064805000000000001e+00 -3.721875000000000000e+01 -1.064810000000000034e+00 -3.718750000000000000e+01 -1.064815000000000067e+00 -3.718750000000000000e+01 -1.064820000000000100e+00 -3.725000000000000000e+01 -1.064825000000000133e+00 -3.715625000000000000e+01 -1.064830000000000165e+00 -3.715625000000000000e+01 -1.064835000000000198e+00 -3.725000000000000000e+01 -1.064840000000000009e+00 -3.718750000000000000e+01 -1.064845000000000041e+00 -3.715625000000000000e+01 -1.064850000000000074e+00 -3.721875000000000000e+01 -1.064855000000000107e+00 -3.715625000000000000e+01 -1.064860000000000140e+00 -3.715625000000000000e+01 -1.064865000000000173e+00 -3.715625000000000000e+01 -1.064869999999999983e+00 -3.709375000000000000e+01 -1.064875000000000016e+00 -3.718750000000000000e+01 -1.064880000000000049e+00 -3.718750000000000000e+01 -1.064885000000000081e+00 -3.715625000000000000e+01 -1.064890000000000114e+00 -3.712500381469726562e+01 -1.064895000000000147e+00 -3.718750000000000000e+01 -1.064900000000000180e+00 -3.718750000000000000e+01 -1.064904999999999990e+00 -3.725000000000000000e+01 -1.064910000000000023e+00 -3.718750000000000000e+01 -1.064915000000000056e+00 -3.715625000000000000e+01 -1.064920000000000089e+00 -3.715625000000000000e+01 -1.064925000000000122e+00 -3.718750000000000000e+01 -1.064930000000000154e+00 -3.725000000000000000e+01 -1.064935000000000187e+00 -3.725000000000000000e+01 -1.064939999999999998e+00 -3.721875000000000000e+01 -1.064945000000000030e+00 -3.721875000000000000e+01 -1.064950000000000063e+00 -3.721875000000000000e+01 -1.064955000000000096e+00 -3.721875000000000000e+01 -1.064960000000000129e+00 -3.728125381469726562e+01 -1.064965000000000162e+00 -3.718750000000000000e+01 -1.064970000000000194e+00 -3.721875000000000000e+01 -1.064975000000000005e+00 -3.731250000000000000e+01 -1.064980000000000038e+00 -3.718750000000000000e+01 -1.064985000000000070e+00 -3.725000000000000000e+01 -1.064990000000000103e+00 -3.721875000000000000e+01 -1.064995000000000136e+00 -3.725000000000000000e+01 -1.065000000000000169e+00 -3.721875000000000000e+01 -1.065004999999999979e+00 -3.725000000000000000e+01 -1.065010000000000012e+00 -3.718750000000000000e+01 -1.065015000000000045e+00 -3.718750000000000000e+01 -1.065020000000000078e+00 -3.718750000000000000e+01 -1.065025000000000110e+00 -3.725000000000000000e+01 -1.065030000000000143e+00 -3.715625000000000000e+01 -1.065035000000000176e+00 -3.718750000000000000e+01 -1.065039999999999987e+00 -3.715625000000000000e+01 -1.065045000000000019e+00 -3.715625000000000000e+01 -1.065050000000000052e+00 -3.721875000000000000e+01 -1.065055000000000085e+00 -3.715625000000000000e+01 -1.065060000000000118e+00 -3.725000000000000000e+01 -1.065065000000000150e+00 -3.721875000000000000e+01 -1.065070000000000183e+00 -3.718750000000000000e+01 -1.065074999999999994e+00 -3.715625000000000000e+01 -1.065080000000000027e+00 -3.721875000000000000e+01 -1.065085000000000059e+00 -3.718750000000000000e+01 -1.065090000000000092e+00 -3.721875000000000000e+01 -1.065095000000000125e+00 -3.715625000000000000e+01 -1.065100000000000158e+00 -3.715625000000000000e+01 -1.065105000000000190e+00 -3.715625000000000000e+01 -1.065110000000000001e+00 -3.721875000000000000e+01 -1.065115000000000034e+00 -3.718750000000000000e+01 -1.065120000000000067e+00 -3.718750000000000000e+01 -1.065125000000000099e+00 -3.718750000000000000e+01 -1.065130000000000132e+00 -3.715625000000000000e+01 -1.065135000000000165e+00 -3.718750000000000000e+01 -1.065140000000000198e+00 -3.718750000000000000e+01 -1.065145000000000008e+00 -3.715625000000000000e+01 -1.065150000000000041e+00 -3.718750000000000000e+01 -1.065155000000000074e+00 -3.718750000000000000e+01 -1.065160000000000107e+00 -3.718750000000000000e+01 -1.065165000000000139e+00 -3.718750000000000000e+01 -1.065170000000000172e+00 -3.718750000000000000e+01 -1.065174999999999983e+00 -3.715625000000000000e+01 -1.065180000000000016e+00 -3.715625000000000000e+01 -1.065185000000000048e+00 -3.718750000000000000e+01 -1.065190000000000081e+00 -3.718750000000000000e+01 -1.065195000000000114e+00 -3.728125381469726562e+01 -1.065200000000000147e+00 -3.721875000000000000e+01 -1.065205000000000179e+00 -3.718750000000000000e+01 -1.065209999999999990e+00 -3.715625000000000000e+01 -1.065215000000000023e+00 -3.721875000000000000e+01 -1.065220000000000056e+00 -3.715625000000000000e+01 -1.065225000000000088e+00 -3.721875000000000000e+01 -1.065230000000000121e+00 -3.715625000000000000e+01 -1.065235000000000154e+00 -3.721875000000000000e+01 -1.065240000000000187e+00 -3.712500381469726562e+01 -1.065244999999999997e+00 -3.718750000000000000e+01 -1.065250000000000030e+00 -3.718750000000000000e+01 -1.065255000000000063e+00 -3.718750000000000000e+01 -1.065260000000000096e+00 -3.715625000000000000e+01 -1.065265000000000128e+00 -3.721875000000000000e+01 -1.065270000000000161e+00 -3.712500381469726562e+01 -1.065275000000000194e+00 -3.721875000000000000e+01 -1.065280000000000005e+00 -3.718750000000000000e+01 -1.065285000000000037e+00 -3.718750000000000000e+01 -1.065290000000000070e+00 -3.715625000000000000e+01 -1.065295000000000103e+00 -3.715625000000000000e+01 -1.065300000000000136e+00 -3.718750000000000000e+01 -1.065305000000000168e+00 -3.715625000000000000e+01 -1.065309999999999979e+00 -3.718750000000000000e+01 -1.065315000000000012e+00 -3.715625000000000000e+01 -1.065320000000000045e+00 -3.718750000000000000e+01 -1.065325000000000077e+00 -3.715625000000000000e+01 -1.065330000000000110e+00 -3.718750000000000000e+01 -1.065335000000000143e+00 -3.725000000000000000e+01 -1.065340000000000176e+00 -3.721875000000000000e+01 -1.065344999999999986e+00 -3.725000000000000000e+01 -1.065350000000000019e+00 -3.718750000000000000e+01 -1.065355000000000052e+00 -3.718750000000000000e+01 -1.065360000000000085e+00 -3.715625000000000000e+01 -1.065365000000000117e+00 -3.715625000000000000e+01 -1.065370000000000150e+00 -3.718750000000000000e+01 -1.065375000000000183e+00 -3.721875000000000000e+01 -1.065379999999999994e+00 -3.718750000000000000e+01 -1.065385000000000026e+00 -3.715625000000000000e+01 -1.065390000000000059e+00 -3.712500381469726562e+01 -1.065395000000000092e+00 -3.718750000000000000e+01 -1.065400000000000125e+00 -3.721875000000000000e+01 -1.065405000000000157e+00 -3.718750000000000000e+01 -1.065410000000000190e+00 -3.715625000000000000e+01 -1.065415000000000001e+00 -3.718750000000000000e+01 -1.065420000000000034e+00 -3.718750000000000000e+01 -1.065425000000000066e+00 -3.715625000000000000e+01 -1.065430000000000099e+00 -3.721875000000000000e+01 -1.065435000000000132e+00 -3.718750000000000000e+01 -1.065440000000000165e+00 -3.721875000000000000e+01 -1.065445000000000197e+00 -3.721875000000000000e+01 -1.065450000000000008e+00 -3.718750000000000000e+01 -1.065455000000000041e+00 -3.728125381469726562e+01 -1.065460000000000074e+00 -3.721875000000000000e+01 -1.065465000000000106e+00 -3.721875000000000000e+01 -1.065470000000000139e+00 -3.721875000000000000e+01 -1.065475000000000172e+00 -3.718750000000000000e+01 -1.065479999999999983e+00 -3.715625000000000000e+01 -1.065485000000000015e+00 -3.718750000000000000e+01 -1.065490000000000048e+00 -3.715625000000000000e+01 -1.065495000000000081e+00 -3.715625000000000000e+01 -1.065500000000000114e+00 -3.718750000000000000e+01 -1.065505000000000146e+00 -3.715625000000000000e+01 -1.065510000000000179e+00 -3.718750000000000000e+01 -1.065514999999999990e+00 -3.718750000000000000e+01 -1.065520000000000023e+00 -3.715625000000000000e+01 -1.065525000000000055e+00 -3.721875000000000000e+01 -1.065530000000000088e+00 -3.712500381469726562e+01 -1.065535000000000121e+00 -3.712500381469726562e+01 -1.065540000000000154e+00 -3.721875000000000000e+01 -1.065545000000000186e+00 -3.715625000000000000e+01 -1.065549999999999997e+00 -3.718750000000000000e+01 -1.065555000000000030e+00 -3.715625000000000000e+01 -1.065560000000000063e+00 -3.718750000000000000e+01 -1.065565000000000095e+00 -3.718750000000000000e+01 -1.065570000000000128e+00 -3.715625000000000000e+01 -1.065575000000000161e+00 -3.709375000000000000e+01 -1.065580000000000194e+00 -3.715625000000000000e+01 -1.065585000000000004e+00 -3.715625000000000000e+01 -1.065590000000000037e+00 -3.709375000000000000e+01 -1.065595000000000070e+00 -3.715625000000000000e+01 -1.065600000000000103e+00 -3.715625000000000000e+01 -1.065605000000000135e+00 -3.715625000000000000e+01 -1.065610000000000168e+00 -3.715625000000000000e+01 -1.065614999999999979e+00 -3.712500381469726562e+01 -1.065620000000000012e+00 -3.712500381469726562e+01 -1.065625000000000044e+00 -3.718750000000000000e+01 -1.065630000000000077e+00 -3.715625000000000000e+01 -1.065635000000000110e+00 -3.721875000000000000e+01 -1.065640000000000143e+00 -3.715625000000000000e+01 -1.065645000000000175e+00 -3.718750000000000000e+01 -1.065649999999999986e+00 -3.718750000000000000e+01 -1.065655000000000019e+00 -3.715625000000000000e+01 -1.065660000000000052e+00 -3.715625000000000000e+01 -1.065665000000000084e+00 -3.715625000000000000e+01 -1.065670000000000117e+00 -3.718750000000000000e+01 -1.065675000000000150e+00 -3.709375000000000000e+01 -1.065680000000000183e+00 -3.715625000000000000e+01 -1.065684999999999993e+00 -3.715625000000000000e+01 -1.065690000000000026e+00 -3.712500381469726562e+01 -1.065695000000000059e+00 -3.715625000000000000e+01 -1.065700000000000092e+00 -3.715625000000000000e+01 -1.065705000000000124e+00 -3.712500381469726562e+01 -1.065710000000000157e+00 -3.706250000000000000e+01 -1.065715000000000190e+00 -3.709375000000000000e+01 -1.065720000000000001e+00 -3.709375000000000000e+01 -1.065725000000000033e+00 -3.706250000000000000e+01 -1.065730000000000066e+00 -3.706250000000000000e+01 -1.065735000000000099e+00 -3.715625000000000000e+01 -1.065740000000000132e+00 -3.709375000000000000e+01 -1.065745000000000164e+00 -3.712500381469726562e+01 -1.065750000000000197e+00 -3.712500381469726562e+01 -1.065755000000000008e+00 -3.715625000000000000e+01 -1.065760000000000041e+00 -3.712500381469726562e+01 -1.065765000000000073e+00 -3.712500381469726562e+01 -1.065770000000000106e+00 -3.706250000000000000e+01 -1.065775000000000139e+00 -3.709375000000000000e+01 -1.065780000000000172e+00 -3.718750000000000000e+01 -1.065784999999999982e+00 -3.709375000000000000e+01 -1.065790000000000015e+00 -3.715625000000000000e+01 -1.065795000000000048e+00 -3.706250000000000000e+01 -1.065800000000000081e+00 -3.712500381469726562e+01 -1.065805000000000113e+00 -3.706250000000000000e+01 -1.065810000000000146e+00 -3.709375000000000000e+01 -1.065815000000000179e+00 -3.709375000000000000e+01 -1.065819999999999990e+00 -3.706250000000000000e+01 -1.065825000000000022e+00 -3.712500381469726562e+01 -1.065830000000000055e+00 -3.703125381469726562e+01 -1.065835000000000088e+00 -3.706250000000000000e+01 -1.065840000000000121e+00 -3.703125381469726562e+01 -1.065845000000000153e+00 -3.709375000000000000e+01 -1.065850000000000186e+00 -3.703125381469726562e+01 -1.065854999999999997e+00 -3.709375000000000000e+01 -1.065860000000000030e+00 -3.715625000000000000e+01 -1.065865000000000062e+00 -3.709375000000000000e+01 -1.065870000000000095e+00 -3.706250000000000000e+01 -1.065875000000000128e+00 -3.709375000000000000e+01 -1.065880000000000161e+00 -3.706250000000000000e+01 -1.065885000000000193e+00 -3.706250000000000000e+01 -1.065890000000000004e+00 -3.703125381469726562e+01 -1.065895000000000037e+00 -3.703125381469726562e+01 -1.065900000000000070e+00 -3.703125381469726562e+01 -1.065905000000000102e+00 -3.703125381469726562e+01 -1.065910000000000135e+00 -3.706250000000000000e+01 -1.065915000000000168e+00 -3.703125381469726562e+01 -1.065919999999999979e+00 -3.709375000000000000e+01 -1.065925000000000011e+00 -3.709375000000000000e+01 -1.065930000000000044e+00 -3.709375000000000000e+01 -1.065935000000000077e+00 -3.703125381469726562e+01 -1.065940000000000110e+00 -3.709375000000000000e+01 -1.065945000000000142e+00 -3.709375000000000000e+01 -1.065950000000000175e+00 -3.700000000000000000e+01 -1.065954999999999986e+00 -3.706250000000000000e+01 -1.065960000000000019e+00 -3.700000000000000000e+01 -1.065965000000000051e+00 -3.703125381469726562e+01 -1.065970000000000084e+00 -3.703125381469726562e+01 -1.065975000000000117e+00 -3.706250000000000000e+01 -1.065980000000000150e+00 -3.703125381469726562e+01 -1.065985000000000182e+00 -3.703125381469726562e+01 -1.065989999999999993e+00 -3.706250000000000000e+01 -1.065995000000000026e+00 -3.706250000000000000e+01 -1.066000000000000059e+00 -3.703125381469726562e+01 -1.066005000000000091e+00 -3.703125381469726562e+01 -1.066010000000000124e+00 -3.696875000000000000e+01 -1.066015000000000157e+00 -3.703125381469726562e+01 -1.066020000000000190e+00 -3.709375000000000000e+01 -1.066025000000000000e+00 -3.703125381469726562e+01 -1.066030000000000033e+00 -3.709375000000000000e+01 -1.066035000000000066e+00 -3.703125381469726562e+01 -1.066040000000000099e+00 -3.703125381469726562e+01 -1.066045000000000131e+00 -3.703125381469726562e+01 -1.066050000000000164e+00 -3.700000000000000000e+01 -1.066055000000000197e+00 -3.703125381469726562e+01 -1.066060000000000008e+00 -3.706250000000000000e+01 -1.066065000000000040e+00 -3.706250000000000000e+01 -1.066070000000000073e+00 -3.706250000000000000e+01 -1.066075000000000106e+00 -3.706250000000000000e+01 -1.066080000000000139e+00 -3.703125381469726562e+01 -1.066085000000000171e+00 -3.706250000000000000e+01 -1.066089999999999982e+00 -3.706250000000000000e+01 -1.066095000000000015e+00 -3.703125381469726562e+01 -1.066100000000000048e+00 -3.703125381469726562e+01 -1.066105000000000080e+00 -3.703125381469726562e+01 -1.066110000000000113e+00 -3.706250000000000000e+01 -1.066115000000000146e+00 -3.700000000000000000e+01 -1.066120000000000179e+00 -3.706250000000000000e+01 -1.066124999999999989e+00 -3.703125381469726562e+01 -1.066130000000000022e+00 -3.706250000000000000e+01 -1.066135000000000055e+00 -3.703125381469726562e+01 -1.066140000000000088e+00 -3.700000000000000000e+01 -1.066145000000000120e+00 -3.703125381469726562e+01 -1.066150000000000153e+00 -3.700000000000000000e+01 -1.066155000000000186e+00 -3.703125381469726562e+01 -1.066159999999999997e+00 -3.700000000000000000e+01 -1.066165000000000029e+00 -3.700000000000000000e+01 -1.066170000000000062e+00 -3.703125381469726562e+01 -1.066175000000000095e+00 -3.703125381469726562e+01 -1.066180000000000128e+00 -3.700000000000000000e+01 -1.066185000000000160e+00 -3.696875000000000000e+01 -1.066190000000000193e+00 -3.703125381469726562e+01 -1.066195000000000004e+00 -3.700000000000000000e+01 -1.066200000000000037e+00 -3.703125381469726562e+01 -1.066205000000000069e+00 -3.700000000000000000e+01 -1.066210000000000102e+00 -3.700000000000000000e+01 -1.066215000000000135e+00 -3.700000000000000000e+01 -1.066220000000000168e+00 -3.703125381469726562e+01 -1.066224999999999978e+00 -3.700000000000000000e+01 -1.066230000000000011e+00 -3.696875000000000000e+01 -1.066235000000000044e+00 -3.700000000000000000e+01 -1.066240000000000077e+00 -3.700000000000000000e+01 -1.066245000000000109e+00 -3.696875000000000000e+01 -1.066250000000000142e+00 -3.703125381469726562e+01 -1.066255000000000175e+00 -3.703125381469726562e+01 -1.066259999999999986e+00 -3.700000000000000000e+01 -1.066265000000000018e+00 -3.700000000000000000e+01 -1.066270000000000051e+00 -3.700000000000000000e+01 -1.066275000000000084e+00 -3.700000000000000000e+01 -1.066280000000000117e+00 -3.700000000000000000e+01 -1.066285000000000149e+00 -3.696875000000000000e+01 -1.066290000000000182e+00 -3.696875000000000000e+01 -1.066294999999999993e+00 -3.700000000000000000e+01 -1.066300000000000026e+00 -3.693750000000000000e+01 -1.066305000000000058e+00 -3.696875000000000000e+01 -1.066310000000000091e+00 -3.696875000000000000e+01 -1.066315000000000124e+00 -3.700000000000000000e+01 -1.066320000000000157e+00 -3.696875000000000000e+01 -1.066325000000000189e+00 -3.703125381469726562e+01 -1.066330000000000000e+00 -3.693750000000000000e+01 -1.066335000000000033e+00 -3.696875000000000000e+01 -1.066340000000000066e+00 -3.700000000000000000e+01 -1.066345000000000098e+00 -3.700000000000000000e+01 -1.066350000000000131e+00 -3.700000000000000000e+01 -1.066355000000000164e+00 -3.700000000000000000e+01 -1.066360000000000197e+00 -3.703125381469726562e+01 -1.066365000000000007e+00 -3.700000000000000000e+01 -1.066370000000000040e+00 -3.696875000000000000e+01 -1.066375000000000073e+00 -3.696875000000000000e+01 -1.066380000000000106e+00 -3.693750000000000000e+01 -1.066385000000000138e+00 -3.690625000000000000e+01 -1.066390000000000171e+00 -3.693750000000000000e+01 -1.066394999999999982e+00 -3.690625000000000000e+01 -1.066400000000000015e+00 -3.690625000000000000e+01 -1.066405000000000047e+00 -3.696875000000000000e+01 -1.066410000000000080e+00 -3.693750000000000000e+01 -1.066415000000000113e+00 -3.693750000000000000e+01 -1.066420000000000146e+00 -3.693750000000000000e+01 -1.066425000000000178e+00 -3.696875000000000000e+01 -1.066429999999999989e+00 -3.693750000000000000e+01 -1.066435000000000022e+00 -3.696875000000000000e+01 -1.066440000000000055e+00 -3.693750000000000000e+01 -1.066445000000000087e+00 -3.696875000000000000e+01 -1.066450000000000120e+00 -3.696875000000000000e+01 -1.066455000000000153e+00 -3.687500381469726562e+01 -1.066460000000000186e+00 -3.700000000000000000e+01 -1.066464999999999996e+00 -3.693750000000000000e+01 -1.066470000000000029e+00 -3.693750000000000000e+01 -1.066475000000000062e+00 -3.700000000000000000e+01 -1.066480000000000095e+00 -3.690625000000000000e+01 -1.066485000000000127e+00 -3.696875000000000000e+01 -1.066490000000000160e+00 -3.700000000000000000e+01 -1.066495000000000193e+00 -3.690625000000000000e+01 -1.066500000000000004e+00 -3.696875000000000000e+01 -1.066505000000000036e+00 -3.696875000000000000e+01 -1.066510000000000069e+00 -3.693750000000000000e+01 -1.066515000000000102e+00 -3.690625000000000000e+01 -1.066520000000000135e+00 -3.687500381469726562e+01 -1.066525000000000167e+00 -3.690625000000000000e+01 -1.066529999999999978e+00 -3.690625000000000000e+01 -1.066535000000000011e+00 -3.696875000000000000e+01 -1.066540000000000044e+00 -3.693750000000000000e+01 -1.066545000000000076e+00 -3.696875000000000000e+01 -1.066550000000000109e+00 -3.696875000000000000e+01 -1.066555000000000142e+00 -3.693750000000000000e+01 -1.066560000000000175e+00 -3.696875000000000000e+01 -1.066564999999999985e+00 -3.696875000000000000e+01 -1.066570000000000018e+00 -3.690625000000000000e+01 -1.066575000000000051e+00 -3.696875000000000000e+01 -1.066580000000000084e+00 -3.696875000000000000e+01 -1.066585000000000116e+00 -3.693750000000000000e+01 -1.066590000000000149e+00 -3.693750000000000000e+01 -1.066595000000000182e+00 -3.696875000000000000e+01 -1.066599999999999993e+00 -3.693750000000000000e+01 -1.066605000000000025e+00 -3.696875000000000000e+01 -1.066610000000000058e+00 -3.696875000000000000e+01 -1.066615000000000091e+00 -3.696875000000000000e+01 -1.066620000000000124e+00 -3.690625000000000000e+01 -1.066625000000000156e+00 -3.700000000000000000e+01 -1.066630000000000189e+00 -3.700000000000000000e+01 -1.066635000000000000e+00 -3.696875000000000000e+01 -1.066640000000000033e+00 -3.700000000000000000e+01 -1.066645000000000065e+00 -3.696875000000000000e+01 -1.066650000000000098e+00 -3.696875000000000000e+01 -1.066655000000000131e+00 -3.693750000000000000e+01 -1.066660000000000164e+00 -3.696875000000000000e+01 -1.066665000000000196e+00 -3.693750000000000000e+01 -1.066670000000000007e+00 -3.690625000000000000e+01 -1.066675000000000040e+00 -3.693750000000000000e+01 -1.066680000000000073e+00 -3.693750000000000000e+01 -1.066685000000000105e+00 -3.696875000000000000e+01 -1.066690000000000138e+00 -3.693750000000000000e+01 -1.066695000000000171e+00 -3.687500381469726562e+01 -1.066699999999999982e+00 -3.690625000000000000e+01 -1.066705000000000014e+00 -3.690625000000000000e+01 -1.066710000000000047e+00 -3.690625000000000000e+01 -1.066715000000000080e+00 -3.696875000000000000e+01 -1.066720000000000113e+00 -3.693750000000000000e+01 -1.066725000000000145e+00 -3.690625000000000000e+01 -1.066730000000000178e+00 -3.690625000000000000e+01 -1.066734999999999989e+00 -3.690625000000000000e+01 -1.066740000000000022e+00 -3.690625000000000000e+01 -1.066745000000000054e+00 -3.687500381469726562e+01 -1.066750000000000087e+00 -3.693750000000000000e+01 -1.066755000000000120e+00 -3.690625000000000000e+01 -1.066760000000000153e+00 -3.687500381469726562e+01 -1.066765000000000185e+00 -3.687500381469726562e+01 -1.066769999999999996e+00 -3.687500381469726562e+01 -1.066775000000000029e+00 -3.690625000000000000e+01 -1.066780000000000062e+00 -3.687500381469726562e+01 -1.066785000000000094e+00 -3.690625000000000000e+01 -1.066790000000000127e+00 -3.687500381469726562e+01 -1.066795000000000160e+00 -3.690625000000000000e+01 -1.066800000000000193e+00 -3.693750000000000000e+01 -1.066805000000000003e+00 -3.687500381469726562e+01 -1.066810000000000036e+00 -3.687500381469726562e+01 -1.066815000000000069e+00 -3.687500381469726562e+01 -1.066820000000000102e+00 -3.690625000000000000e+01 -1.066825000000000134e+00 -3.690625000000000000e+01 -1.066830000000000167e+00 -3.684375000000000000e+01 -1.066834999999999978e+00 -3.693750000000000000e+01 -1.066840000000000011e+00 -3.684375000000000000e+01 -1.066845000000000043e+00 -3.690625000000000000e+01 -1.066850000000000076e+00 -3.690625000000000000e+01 -1.066855000000000109e+00 -3.690625000000000000e+01 -1.066860000000000142e+00 -3.693750000000000000e+01 -1.066865000000000174e+00 -3.687500381469726562e+01 -1.066869999999999985e+00 -3.684375000000000000e+01 -1.066875000000000018e+00 -3.687500381469726562e+01 -1.066880000000000051e+00 -3.690625000000000000e+01 -1.066885000000000083e+00 -3.690625000000000000e+01 -1.066890000000000116e+00 -3.687500381469726562e+01 -1.066895000000000149e+00 -3.693750000000000000e+01 -1.066900000000000182e+00 -3.690625000000000000e+01 -1.066904999999999992e+00 -3.687500381469726562e+01 -1.066910000000000025e+00 -3.690625000000000000e+01 -1.066915000000000058e+00 -3.687500381469726562e+01 -1.066920000000000091e+00 -3.684375000000000000e+01 -1.066925000000000123e+00 -3.687500381469726562e+01 -1.066930000000000156e+00 -3.684375000000000000e+01 -1.066935000000000189e+00 -3.684375000000000000e+01 -1.066940000000000000e+00 -3.687500381469726562e+01 -1.066945000000000032e+00 -3.678125000000000000e+01 -1.066950000000000065e+00 -3.690625000000000000e+01 -1.066955000000000098e+00 -3.684375000000000000e+01 -1.066960000000000131e+00 -3.687500381469726562e+01 -1.066965000000000163e+00 -3.684375000000000000e+01 -1.066970000000000196e+00 -3.684375000000000000e+01 -1.066975000000000007e+00 -3.687500381469726562e+01 -1.066980000000000040e+00 -3.684375000000000000e+01 -1.066985000000000072e+00 -3.684375000000000000e+01 -1.066990000000000105e+00 -3.684375000000000000e+01 -1.066995000000000138e+00 -3.684375000000000000e+01 -1.067000000000000171e+00 -3.684375000000000000e+01 -1.067004999999999981e+00 -3.684375000000000000e+01 -1.067010000000000014e+00 -3.690625000000000000e+01 -1.067015000000000047e+00 -3.690625000000000000e+01 -1.067020000000000080e+00 -3.684375000000000000e+01 -1.067025000000000112e+00 -3.687500381469726562e+01 -1.067030000000000145e+00 -3.684375000000000000e+01 -1.067035000000000178e+00 -3.690625000000000000e+01 -1.067039999999999988e+00 -3.687500381469726562e+01 -1.067045000000000021e+00 -3.684375000000000000e+01 -1.067050000000000054e+00 -3.684375000000000000e+01 -1.067055000000000087e+00 -3.690625000000000000e+01 -1.067060000000000120e+00 -3.684375000000000000e+01 -1.067065000000000152e+00 -3.684375000000000000e+01 -1.067070000000000185e+00 -3.681250000000000000e+01 -1.067074999999999996e+00 -3.684375000000000000e+01 -1.067080000000000028e+00 -3.684375000000000000e+01 -1.067085000000000061e+00 -3.687500381469726562e+01 -1.067090000000000094e+00 -3.684375000000000000e+01 -1.067095000000000127e+00 -3.684375000000000000e+01 -1.067100000000000160e+00 -3.684375000000000000e+01 -1.067105000000000192e+00 -3.684375000000000000e+01 -1.067110000000000003e+00 -3.681250000000000000e+01 -1.067115000000000036e+00 -3.684375000000000000e+01 -1.067120000000000068e+00 -3.684375000000000000e+01 -1.067125000000000101e+00 -3.678125000000000000e+01 -1.067130000000000134e+00 -3.678125000000000000e+01 -1.067135000000000167e+00 -3.681250000000000000e+01 -1.067139999999999977e+00 -3.684375000000000000e+01 -1.067145000000000010e+00 -3.684375000000000000e+01 -1.067150000000000043e+00 -3.687500381469726562e+01 -1.067155000000000076e+00 -3.678125000000000000e+01 -1.067160000000000108e+00 -3.684375000000000000e+01 -1.067165000000000141e+00 -3.684375000000000000e+01 -1.067170000000000174e+00 -3.684375000000000000e+01 -1.067174999999999985e+00 -3.684375000000000000e+01 -1.067180000000000017e+00 -3.678125000000000000e+01 -1.067185000000000050e+00 -3.684375000000000000e+01 -1.067190000000000083e+00 -3.681250000000000000e+01 -1.067195000000000116e+00 -3.678125000000000000e+01 -1.067200000000000149e+00 -3.684375000000000000e+01 -1.067205000000000181e+00 -3.684375000000000000e+01 -1.067209999999999992e+00 -3.678125000000000000e+01 -1.067215000000000025e+00 -3.684375000000000000e+01 -1.067220000000000057e+00 -3.678125000000000000e+01 -1.067225000000000090e+00 -3.678125000000000000e+01 -1.067230000000000123e+00 -3.687500381469726562e+01 -1.067235000000000156e+00 -3.675000000000000000e+01 -1.067240000000000189e+00 -3.681250000000000000e+01 -1.067244999999999999e+00 -3.678125000000000000e+01 -1.067250000000000032e+00 -3.684375000000000000e+01 -1.067255000000000065e+00 -3.678125000000000000e+01 -1.067260000000000097e+00 -3.684375000000000000e+01 -1.067265000000000130e+00 -3.687500381469726562e+01 -1.067270000000000163e+00 -3.684375000000000000e+01 -1.067275000000000196e+00 -3.687500381469726562e+01 -1.067280000000000006e+00 -3.678125000000000000e+01 -1.067285000000000039e+00 -3.687500381469726562e+01 -1.067290000000000072e+00 -3.684375000000000000e+01 -1.067295000000000105e+00 -3.678125000000000000e+01 -1.067300000000000137e+00 -3.684375000000000000e+01 -1.067305000000000170e+00 -3.681250000000000000e+01 -1.067309999999999981e+00 -3.681250000000000000e+01 -1.067315000000000014e+00 -3.681250000000000000e+01 -1.067320000000000046e+00 -3.684375000000000000e+01 -1.067325000000000079e+00 -3.681250000000000000e+01 -1.067330000000000112e+00 -3.678125000000000000e+01 -1.067335000000000145e+00 -3.684375000000000000e+01 -1.067340000000000177e+00 -3.684375000000000000e+01 -1.067344999999999988e+00 -3.675000000000000000e+01 -1.067350000000000021e+00 -3.687500381469726562e+01 -1.067355000000000054e+00 -3.675000000000000000e+01 -1.067360000000000086e+00 -3.678125000000000000e+01 -1.067365000000000119e+00 -3.678125000000000000e+01 -1.067370000000000152e+00 -3.678125000000000000e+01 -1.067375000000000185e+00 -3.681250000000000000e+01 -1.067379999999999995e+00 -3.684375000000000000e+01 -1.067385000000000028e+00 -3.681250000000000000e+01 -1.067390000000000061e+00 -3.681250000000000000e+01 -1.067395000000000094e+00 -3.681250000000000000e+01 -1.067400000000000126e+00 -3.678125000000000000e+01 -1.067405000000000159e+00 -3.681250000000000000e+01 -1.067410000000000192e+00 -3.678125000000000000e+01 -1.067415000000000003e+00 -3.678125000000000000e+01 -1.067420000000000035e+00 -3.684375000000000000e+01 -1.067425000000000068e+00 -3.684375000000000000e+01 -1.067430000000000101e+00 -3.684375000000000000e+01 -1.067435000000000134e+00 -3.684375000000000000e+01 -1.067440000000000166e+00 -3.684375000000000000e+01 -1.067444999999999977e+00 -3.681250000000000000e+01 -1.067450000000000010e+00 -3.684375000000000000e+01 -1.067455000000000043e+00 -3.678125000000000000e+01 -1.067460000000000075e+00 -3.681250000000000000e+01 -1.067465000000000108e+00 -3.681250000000000000e+01 -1.067470000000000141e+00 -3.681250000000000000e+01 -1.067475000000000174e+00 -3.681250000000000000e+01 -1.067479999999999984e+00 -3.684375000000000000e+01 -1.067485000000000017e+00 -3.681250000000000000e+01 -1.067490000000000050e+00 -3.675000000000000000e+01 -1.067495000000000083e+00 -3.678125000000000000e+01 -1.067500000000000115e+00 -3.684375000000000000e+01 -1.067505000000000148e+00 -3.684375000000000000e+01 -1.067510000000000181e+00 -3.684375000000000000e+01 -1.067514999999999992e+00 -3.675000000000000000e+01 -1.067520000000000024e+00 -3.675000000000000000e+01 -1.067525000000000057e+00 -3.678125000000000000e+01 -1.067530000000000090e+00 -3.675000000000000000e+01 -1.067535000000000123e+00 -3.671875381469726562e+01 -1.067540000000000155e+00 -3.675000000000000000e+01 -1.067545000000000188e+00 -3.678125000000000000e+01 -1.067549999999999999e+00 -3.671875381469726562e+01 -1.067555000000000032e+00 -3.668750000000000000e+01 -1.067560000000000064e+00 -3.671875381469726562e+01 -1.067565000000000097e+00 -3.675000000000000000e+01 -1.067570000000000130e+00 -3.681250000000000000e+01 -1.067575000000000163e+00 -3.675000000000000000e+01 -1.067580000000000195e+00 -3.678125000000000000e+01 -1.067585000000000006e+00 -3.675000000000000000e+01 -1.067590000000000039e+00 -3.678125000000000000e+01 -1.067595000000000072e+00 -3.678125000000000000e+01 -1.067600000000000104e+00 -3.671875381469726562e+01 -1.067605000000000137e+00 -3.678125000000000000e+01 -1.067610000000000170e+00 -3.678125000000000000e+01 -1.067614999999999981e+00 -3.681250000000000000e+01 -1.067620000000000013e+00 -3.678125000000000000e+01 -1.067625000000000046e+00 -3.675000000000000000e+01 -1.067630000000000079e+00 -3.675000000000000000e+01 -1.067635000000000112e+00 -3.678125000000000000e+01 -1.067640000000000144e+00 -3.684375000000000000e+01 -1.067645000000000177e+00 -3.678125000000000000e+01 -1.067649999999999988e+00 -3.681250000000000000e+01 -1.067655000000000021e+00 -3.681250000000000000e+01 -1.067660000000000053e+00 -3.684375000000000000e+01 -1.067665000000000086e+00 -3.681250000000000000e+01 -1.067670000000000119e+00 -3.678125000000000000e+01 -1.067675000000000152e+00 -3.678125000000000000e+01 -1.067680000000000184e+00 -3.678125000000000000e+01 -1.067684999999999995e+00 -3.678125000000000000e+01 -1.067690000000000028e+00 -3.678125000000000000e+01 -1.067695000000000061e+00 -3.678125000000000000e+01 -1.067700000000000093e+00 -3.678125000000000000e+01 -1.067705000000000126e+00 -3.678125000000000000e+01 -1.067710000000000159e+00 -3.675000000000000000e+01 -1.067715000000000192e+00 -3.678125000000000000e+01 -1.067720000000000002e+00 -3.675000000000000000e+01 -1.067725000000000035e+00 -3.678125000000000000e+01 -1.067730000000000068e+00 -3.678125000000000000e+01 -1.067735000000000101e+00 -3.678125000000000000e+01 -1.067740000000000133e+00 -3.678125000000000000e+01 -1.067745000000000166e+00 -3.684375000000000000e+01 -1.067749999999999977e+00 -3.678125000000000000e+01 -1.067755000000000010e+00 -3.687500381469726562e+01 -1.067760000000000042e+00 -3.684375000000000000e+01 -1.067765000000000075e+00 -3.678125000000000000e+01 -1.067770000000000108e+00 -3.681250000000000000e+01 -1.067775000000000141e+00 -3.678125000000000000e+01 -1.067780000000000173e+00 -3.671875381469726562e+01 -1.067784999999999984e+00 -3.675000000000000000e+01 -1.067790000000000017e+00 -3.671875381469726562e+01 -1.067795000000000050e+00 -3.671875381469726562e+01 -1.067800000000000082e+00 -3.675000000000000000e+01 -1.067805000000000115e+00 -3.675000000000000000e+01 -1.067810000000000148e+00 -3.681250000000000000e+01 -1.067815000000000181e+00 -3.678125000000000000e+01 -1.067819999999999991e+00 -3.678125000000000000e+01 -1.067825000000000024e+00 -3.678125000000000000e+01 -1.067830000000000057e+00 -3.675000000000000000e+01 -1.067835000000000090e+00 -3.675000000000000000e+01 -1.067840000000000122e+00 -3.675000000000000000e+01 -1.067845000000000155e+00 -3.678125000000000000e+01 -1.067850000000000188e+00 -3.671875381469726562e+01 -1.067854999999999999e+00 -3.675000000000000000e+01 -1.067860000000000031e+00 -3.671875381469726562e+01 -1.067865000000000064e+00 -3.675000000000000000e+01 -1.067870000000000097e+00 -3.678125000000000000e+01 -1.067875000000000130e+00 -3.675000000000000000e+01 -1.067880000000000162e+00 -3.671875381469726562e+01 -1.067885000000000195e+00 -3.675000000000000000e+01 -1.067890000000000006e+00 -3.678125000000000000e+01 -1.067895000000000039e+00 -3.675000000000000000e+01 -1.067900000000000071e+00 -3.675000000000000000e+01 -1.067905000000000104e+00 -3.671875381469726562e+01 -1.067910000000000137e+00 -3.668750000000000000e+01 -1.067915000000000170e+00 -3.671875381469726562e+01 -1.067919999999999980e+00 -3.675000000000000000e+01 -1.067925000000000013e+00 -3.671875381469726562e+01 -1.067930000000000046e+00 -3.668750000000000000e+01 -1.067935000000000079e+00 -3.665625000000000000e+01 -1.067940000000000111e+00 -3.671875381469726562e+01 -1.067945000000000144e+00 -3.668750000000000000e+01 -1.067950000000000177e+00 -3.671875381469726562e+01 -1.067954999999999988e+00 -3.671875381469726562e+01 -1.067960000000000020e+00 -3.668750000000000000e+01 -1.067965000000000053e+00 -3.671875381469726562e+01 -1.067970000000000086e+00 -3.668750000000000000e+01 -1.067975000000000119e+00 -3.671875381469726562e+01 -1.067980000000000151e+00 -3.668750000000000000e+01 -1.067985000000000184e+00 -3.668750000000000000e+01 -1.067989999999999995e+00 -3.668750000000000000e+01 -1.067995000000000028e+00 -3.671875381469726562e+01 -1.068000000000000060e+00 -3.668750000000000000e+01 -1.068005000000000093e+00 -3.671875381469726562e+01 -1.068010000000000126e+00 -3.678125000000000000e+01 -1.068015000000000159e+00 -3.665625000000000000e+01 -1.068020000000000191e+00 -3.665625000000000000e+01 -1.068025000000000002e+00 -3.668750000000000000e+01 -1.068030000000000035e+00 -3.668750000000000000e+01 -1.068035000000000068e+00 -3.665625000000000000e+01 -1.068040000000000100e+00 -3.668750000000000000e+01 -1.068045000000000133e+00 -3.668750000000000000e+01 -1.068050000000000166e+00 -3.668750000000000000e+01 -1.068054999999999977e+00 -3.665625000000000000e+01 -1.068060000000000009e+00 -3.668750000000000000e+01 -1.068065000000000042e+00 -3.671875381469726562e+01 -1.068070000000000075e+00 -3.671875381469726562e+01 -1.068075000000000108e+00 -3.665625000000000000e+01 -1.068080000000000140e+00 -3.665625000000000000e+01 -1.068085000000000173e+00 -3.671875381469726562e+01 -1.068089999999999984e+00 -3.665625000000000000e+01 -1.068095000000000017e+00 -3.662500000000000000e+01 -1.068100000000000049e+00 -3.668750000000000000e+01 -1.068105000000000082e+00 -3.671875381469726562e+01 -1.068110000000000115e+00 -3.671875381469726562e+01 -1.068115000000000148e+00 -3.671875381469726562e+01 -1.068120000000000180e+00 -3.675000000000000000e+01 -1.068124999999999991e+00 -3.675000000000000000e+01 -1.068130000000000024e+00 -3.678125000000000000e+01 -1.068135000000000057e+00 -3.675000000000000000e+01 -1.068140000000000089e+00 -3.668750000000000000e+01 -1.068145000000000122e+00 -3.678125000000000000e+01 -1.068150000000000155e+00 -3.671875381469726562e+01 -1.068155000000000188e+00 -3.671875381469726562e+01 -1.068159999999999998e+00 -3.671875381469726562e+01 -1.068165000000000031e+00 -3.665625000000000000e+01 -1.068170000000000064e+00 -3.668750000000000000e+01 -1.068175000000000097e+00 -3.678125000000000000e+01 -1.068180000000000129e+00 -3.668750000000000000e+01 -1.068185000000000162e+00 -3.671875381469726562e+01 -1.068190000000000195e+00 -3.671875381469726562e+01 -1.068195000000000006e+00 -3.675000000000000000e+01 -1.068200000000000038e+00 -3.678125000000000000e+01 -1.068205000000000071e+00 -3.668750000000000000e+01 -1.068210000000000104e+00 -3.675000000000000000e+01 -1.068215000000000137e+00 -3.671875381469726562e+01 -1.068220000000000169e+00 -3.671875381469726562e+01 -1.068224999999999980e+00 -3.675000000000000000e+01 -1.068230000000000013e+00 -3.665625000000000000e+01 -1.068235000000000046e+00 -3.671875381469726562e+01 -1.068240000000000078e+00 -3.668750000000000000e+01 -1.068245000000000111e+00 -3.671875381469726562e+01 -1.068250000000000144e+00 -3.668750000000000000e+01 -1.068255000000000177e+00 -3.668750000000000000e+01 -1.068259999999999987e+00 -3.675000000000000000e+01 -1.068265000000000020e+00 -3.678125000000000000e+01 -1.068270000000000053e+00 -3.678125000000000000e+01 -1.068275000000000086e+00 -3.671875381469726562e+01 -1.068280000000000118e+00 -3.678125000000000000e+01 -1.068285000000000151e+00 -3.668750000000000000e+01 -1.068290000000000184e+00 -3.675000000000000000e+01 -1.068294999999999995e+00 -3.675000000000000000e+01 -1.068300000000000027e+00 -3.665625000000000000e+01 -1.068305000000000060e+00 -3.675000000000000000e+01 -1.068310000000000093e+00 -3.675000000000000000e+01 -1.068315000000000126e+00 -3.668750000000000000e+01 -1.068320000000000158e+00 -3.671875381469726562e+01 -1.068325000000000191e+00 -3.668750000000000000e+01 -1.068330000000000002e+00 -3.668750000000000000e+01 -1.068335000000000035e+00 -3.668750000000000000e+01 -1.068340000000000067e+00 -3.675000000000000000e+01 -1.068345000000000100e+00 -3.671875381469726562e+01 -1.068350000000000133e+00 -3.668750000000000000e+01 -1.068355000000000166e+00 -3.671875381469726562e+01 -1.068360000000000198e+00 -3.671875381469726562e+01 -1.068365000000000009e+00 -3.665625000000000000e+01 -1.068370000000000042e+00 -3.662500000000000000e+01 -1.068375000000000075e+00 -3.668750000000000000e+01 -1.068380000000000107e+00 -3.668750000000000000e+01 -1.068385000000000140e+00 -3.668750000000000000e+01 -1.068390000000000173e+00 -3.668750000000000000e+01 -1.068394999999999984e+00 -3.665625000000000000e+01 -1.068400000000000016e+00 -3.668750000000000000e+01 -1.068405000000000049e+00 -3.665625000000000000e+01 -1.068410000000000082e+00 -3.668750000000000000e+01 -1.068415000000000115e+00 -3.662500000000000000e+01 -1.068420000000000147e+00 -3.668750000000000000e+01 -1.068425000000000180e+00 -3.662500000000000000e+01 -1.068429999999999991e+00 -3.668750000000000000e+01 -1.068435000000000024e+00 -3.668750000000000000e+01 -1.068440000000000056e+00 -3.662500000000000000e+01 -1.068445000000000089e+00 -3.665625000000000000e+01 -1.068450000000000122e+00 -3.668750000000000000e+01 -1.068455000000000155e+00 -3.668750000000000000e+01 -1.068460000000000187e+00 -3.665625000000000000e+01 -1.068464999999999998e+00 -3.665625000000000000e+01 -1.068470000000000031e+00 -3.665625000000000000e+01 -1.068475000000000064e+00 -3.671875381469726562e+01 -1.068480000000000096e+00 -3.665625000000000000e+01 -1.068485000000000129e+00 -3.662500000000000000e+01 -1.068490000000000162e+00 -3.665625000000000000e+01 -1.068495000000000195e+00 -3.662500000000000000e+01 -1.068500000000000005e+00 -3.665625000000000000e+01 -1.068505000000000038e+00 -3.656250381469726562e+01 -1.068510000000000071e+00 -3.659375000000000000e+01 -1.068515000000000104e+00 -3.662500000000000000e+01 -1.068520000000000136e+00 -3.659375000000000000e+01 -1.068525000000000169e+00 -3.662500000000000000e+01 -1.068529999999999980e+00 -3.662500000000000000e+01 -1.068535000000000013e+00 -3.659375000000000000e+01 -1.068540000000000045e+00 -3.662500000000000000e+01 -1.068545000000000078e+00 -3.653125000000000000e+01 -1.068550000000000111e+00 -3.653125000000000000e+01 -1.068555000000000144e+00 -3.659375000000000000e+01 -1.068560000000000176e+00 -3.662500000000000000e+01 -1.068564999999999987e+00 -3.662500000000000000e+01 -1.068570000000000020e+00 -3.659375000000000000e+01 -1.068575000000000053e+00 -3.656250381469726562e+01 -1.068580000000000085e+00 -3.659375000000000000e+01 -1.068585000000000118e+00 -3.659375000000000000e+01 -1.068590000000000151e+00 -3.668750000000000000e+01 -1.068595000000000184e+00 -3.659375000000000000e+01 -1.068599999999999994e+00 -3.662500000000000000e+01 -1.068605000000000027e+00 -3.665625000000000000e+01 -1.068610000000000060e+00 -3.659375000000000000e+01 -1.068615000000000093e+00 -3.659375000000000000e+01 -1.068620000000000125e+00 -3.656250381469726562e+01 -1.068625000000000158e+00 -3.656250381469726562e+01 -1.068630000000000191e+00 -3.653125000000000000e+01 -1.068635000000000002e+00 -3.659375000000000000e+01 -1.068640000000000034e+00 -3.656250381469726562e+01 -1.068645000000000067e+00 -3.656250381469726562e+01 -1.068650000000000100e+00 -3.653125000000000000e+01 -1.068655000000000133e+00 -3.653125000000000000e+01 -1.068660000000000165e+00 -3.653125000000000000e+01 -1.068665000000000198e+00 -3.656250381469726562e+01 -1.068670000000000009e+00 -3.659375000000000000e+01 -1.068675000000000042e+00 -3.656250381469726562e+01 -1.068680000000000074e+00 -3.653125000000000000e+01 -1.068685000000000107e+00 -3.656250381469726562e+01 -1.068690000000000140e+00 -3.653125000000000000e+01 -1.068695000000000173e+00 -3.662500000000000000e+01 -1.068699999999999983e+00 -3.656250381469726562e+01 -1.068705000000000016e+00 -3.659375000000000000e+01 -1.068710000000000049e+00 -3.653125000000000000e+01 -1.068715000000000082e+00 -3.656250381469726562e+01 -1.068720000000000114e+00 -3.650000000000000000e+01 -1.068725000000000147e+00 -3.653125000000000000e+01 -1.068730000000000180e+00 -3.653125000000000000e+01 -1.068734999999999991e+00 -3.653125000000000000e+01 -1.068740000000000023e+00 -3.653125000000000000e+01 -1.068745000000000056e+00 -3.653125000000000000e+01 -1.068750000000000089e+00 -3.653125000000000000e+01 -1.068755000000000122e+00 -3.653125000000000000e+01 -1.068760000000000154e+00 -3.650000000000000000e+01 -1.068765000000000187e+00 -3.653125000000000000e+01 -1.068769999999999998e+00 -3.650000000000000000e+01 -1.068775000000000031e+00 -3.659375000000000000e+01 -1.068780000000000063e+00 -3.650000000000000000e+01 -1.068785000000000096e+00 -3.653125000000000000e+01 -1.068790000000000129e+00 -3.656250381469726562e+01 -1.068795000000000162e+00 -3.656250381469726562e+01 -1.068800000000000194e+00 -3.653125000000000000e+01 -1.068805000000000005e+00 -3.650000000000000000e+01 -1.068810000000000038e+00 -3.653125000000000000e+01 -1.068815000000000071e+00 -3.659375000000000000e+01 -1.068820000000000103e+00 -3.656250381469726562e+01 -1.068825000000000136e+00 -3.659375000000000000e+01 -1.068830000000000169e+00 -3.659375000000000000e+01 -1.068834999999999980e+00 -3.653125000000000000e+01 -1.068840000000000012e+00 -3.656250381469726562e+01 -1.068845000000000045e+00 -3.653125000000000000e+01 -1.068850000000000078e+00 -3.653125000000000000e+01 -1.068855000000000111e+00 -3.656250381469726562e+01 -1.068860000000000143e+00 -3.659375000000000000e+01 -1.068865000000000176e+00 -3.656250381469726562e+01 -1.068869999999999987e+00 -3.650000000000000000e+01 -1.068875000000000020e+00 -3.653125000000000000e+01 -1.068880000000000052e+00 -3.653125000000000000e+01 -1.068885000000000085e+00 -3.653125000000000000e+01 -1.068890000000000118e+00 -3.656250381469726562e+01 -1.068895000000000151e+00 -3.653125000000000000e+01 -1.068900000000000183e+00 -3.646875000000000000e+01 -1.068904999999999994e+00 -3.653125000000000000e+01 -1.068910000000000027e+00 -3.646875000000000000e+01 -1.068915000000000060e+00 -3.650000000000000000e+01 -1.068920000000000092e+00 -3.653125000000000000e+01 -1.068925000000000125e+00 -3.650000000000000000e+01 -1.068930000000000158e+00 -3.650000000000000000e+01 -1.068935000000000191e+00 -3.650000000000000000e+01 -1.068940000000000001e+00 -3.653125000000000000e+01 -1.068945000000000034e+00 -3.646875000000000000e+01 -1.068950000000000067e+00 -3.646875000000000000e+01 -1.068955000000000100e+00 -3.650000000000000000e+01 -1.068960000000000132e+00 -3.653125000000000000e+01 -1.068965000000000165e+00 -3.650000000000000000e+01 -1.068970000000000198e+00 -3.656250381469726562e+01 -1.068975000000000009e+00 -3.653125000000000000e+01 -1.068980000000000041e+00 -3.656250381469726562e+01 -1.068985000000000074e+00 -3.646875000000000000e+01 -1.068990000000000107e+00 -3.650000000000000000e+01 -1.068995000000000140e+00 -3.653125000000000000e+01 -1.069000000000000172e+00 -3.646875000000000000e+01 -1.069004999999999983e+00 -3.653125000000000000e+01 -1.069010000000000016e+00 -3.646875000000000000e+01 -1.069015000000000049e+00 -3.650000000000000000e+01 -1.069020000000000081e+00 -3.646875000000000000e+01 -1.069025000000000114e+00 -3.643750000000000000e+01 -1.069030000000000147e+00 -3.650000000000000000e+01 -1.069035000000000180e+00 -3.653125000000000000e+01 -1.069039999999999990e+00 -3.653125000000000000e+01 -1.069045000000000023e+00 -3.650000000000000000e+01 -1.069050000000000056e+00 -3.653125000000000000e+01 -1.069055000000000089e+00 -3.646875000000000000e+01 -1.069060000000000121e+00 -3.650000000000000000e+01 -1.069065000000000154e+00 -3.646875000000000000e+01 -1.069070000000000187e+00 -3.640625381469726562e+01 -1.069074999999999998e+00 -3.643750000000000000e+01 -1.069080000000000030e+00 -3.646875000000000000e+01 -1.069085000000000063e+00 -3.643750000000000000e+01 -1.069090000000000096e+00 -3.640625381469726562e+01 -1.069095000000000129e+00 -3.646875000000000000e+01 -1.069100000000000161e+00 -3.653125000000000000e+01 -1.069105000000000194e+00 -3.646875000000000000e+01 -1.069110000000000005e+00 -3.646875000000000000e+01 -1.069115000000000038e+00 -3.650000000000000000e+01 -1.069120000000000070e+00 -3.643750000000000000e+01 -1.069125000000000103e+00 -3.650000000000000000e+01 -1.069130000000000136e+00 -3.650000000000000000e+01 -1.069135000000000169e+00 -3.646875000000000000e+01 -1.069139999999999979e+00 -3.643750000000000000e+01 -1.069145000000000012e+00 -3.640625381469726562e+01 -1.069150000000000045e+00 -3.646875000000000000e+01 -1.069155000000000078e+00 -3.640625381469726562e+01 -1.069160000000000110e+00 -3.650000000000000000e+01 -1.069165000000000143e+00 -3.653125000000000000e+01 -1.069170000000000176e+00 -3.643750000000000000e+01 -1.069174999999999986e+00 -3.646875000000000000e+01 -1.069180000000000019e+00 -3.646875000000000000e+01 -1.069185000000000052e+00 -3.653125000000000000e+01 -1.069190000000000085e+00 -3.650000000000000000e+01 -1.069195000000000118e+00 -3.640625381469726562e+01 -1.069200000000000150e+00 -3.650000000000000000e+01 -1.069205000000000183e+00 -3.643750000000000000e+01 -1.069209999999999994e+00 -3.646875000000000000e+01 -1.069215000000000027e+00 -3.646875000000000000e+01 -1.069220000000000059e+00 -3.650000000000000000e+01 -1.069225000000000092e+00 -3.640625381469726562e+01 -1.069230000000000125e+00 -3.653125000000000000e+01 -1.069235000000000158e+00 -3.650000000000000000e+01 -1.069240000000000190e+00 -3.650000000000000000e+01 -1.069245000000000001e+00 -3.646875000000000000e+01 -1.069250000000000034e+00 -3.646875000000000000e+01 -1.069255000000000067e+00 -3.643750000000000000e+01 -1.069260000000000099e+00 -3.640625381469726562e+01 -1.069265000000000132e+00 -3.646875000000000000e+01 -1.069270000000000165e+00 -3.640625381469726562e+01 -1.069275000000000198e+00 -3.646875000000000000e+01 -1.069280000000000008e+00 -3.643750000000000000e+01 -1.069285000000000041e+00 -3.643750000000000000e+01 -1.069290000000000074e+00 -3.643750000000000000e+01 -1.069295000000000107e+00 -3.646875000000000000e+01 -1.069300000000000139e+00 -3.650000000000000000e+01 -1.069305000000000172e+00 -3.646875000000000000e+01 -1.069309999999999983e+00 -3.643750000000000000e+01 -1.069315000000000015e+00 -3.637500000000000000e+01 -1.069320000000000048e+00 -3.646875000000000000e+01 -1.069325000000000081e+00 -3.646875000000000000e+01 -1.069330000000000114e+00 -3.640625381469726562e+01 -1.069335000000000147e+00 -3.643750000000000000e+01 -1.069340000000000179e+00 -3.646875000000000000e+01 -1.069344999999999990e+00 -3.643750000000000000e+01 -1.069350000000000023e+00 -3.650000000000000000e+01 -1.069355000000000055e+00 -3.650000000000000000e+01 -1.069360000000000088e+00 -3.643750000000000000e+01 -1.069365000000000121e+00 -3.643750000000000000e+01 -1.069370000000000154e+00 -3.643750000000000000e+01 -1.069375000000000187e+00 -3.643750000000000000e+01 -1.069379999999999997e+00 -3.646875000000000000e+01 -1.069385000000000030e+00 -3.640625381469726562e+01 -1.069390000000000063e+00 -3.643750000000000000e+01 -1.069395000000000095e+00 -3.646875000000000000e+01 -1.069400000000000128e+00 -3.643750000000000000e+01 -1.069405000000000161e+00 -3.646875000000000000e+01 -1.069410000000000194e+00 -3.643750000000000000e+01 -1.069415000000000004e+00 -3.646875000000000000e+01 -1.069420000000000037e+00 -3.640625381469726562e+01 -1.069425000000000070e+00 -3.646875000000000000e+01 -1.069430000000000103e+00 -3.640625381469726562e+01 -1.069435000000000136e+00 -3.643750000000000000e+01 -1.069440000000000168e+00 -3.643750000000000000e+01 -1.069444999999999979e+00 -3.643750000000000000e+01 -1.069450000000000012e+00 -3.640625381469726562e+01 -1.069455000000000044e+00 -3.637500000000000000e+01 -1.069460000000000077e+00 -3.637500000000000000e+01 -1.069465000000000110e+00 -3.637500000000000000e+01 -1.069470000000000143e+00 -3.640625381469726562e+01 -1.069475000000000176e+00 -3.640625381469726562e+01 -1.069479999999999986e+00 -3.643750000000000000e+01 -1.069485000000000019e+00 -3.640625381469726562e+01 -1.069490000000000052e+00 -3.640625381469726562e+01 -1.069495000000000084e+00 -3.643750000000000000e+01 -1.069500000000000117e+00 -3.637500000000000000e+01 -1.069505000000000150e+00 -3.640625381469726562e+01 -1.069510000000000183e+00 -3.637500000000000000e+01 -1.069514999999999993e+00 -3.640625381469726562e+01 -1.069520000000000026e+00 -3.640625381469726562e+01 -1.069525000000000059e+00 -3.634375000000000000e+01 -1.069530000000000092e+00 -3.637500000000000000e+01 -1.069535000000000124e+00 -3.637500000000000000e+01 -1.069540000000000157e+00 -3.643750000000000000e+01 -1.069545000000000190e+00 -3.640625381469726562e+01 -1.069550000000000001e+00 -3.640625381469726562e+01 -1.069555000000000033e+00 -3.640625381469726562e+01 -1.069560000000000066e+00 -3.634375000000000000e+01 -1.069565000000000099e+00 -3.634375000000000000e+01 -1.069570000000000132e+00 -3.634375000000000000e+01 -1.069575000000000164e+00 -3.634375000000000000e+01 -1.069580000000000197e+00 -3.643750000000000000e+01 -1.069585000000000008e+00 -3.640625381469726562e+01 -1.069590000000000041e+00 -3.628125000000000000e+01 -1.069595000000000073e+00 -3.643750000000000000e+01 -1.069600000000000106e+00 -3.643750000000000000e+01 -1.069605000000000139e+00 -3.637500000000000000e+01 -1.069610000000000172e+00 -3.640625381469726562e+01 -1.069614999999999982e+00 -3.640625381469726562e+01 -1.069620000000000015e+00 -3.640625381469726562e+01 -1.069625000000000048e+00 -3.634375000000000000e+01 -1.069630000000000081e+00 -3.646875000000000000e+01 -1.069635000000000113e+00 -3.640625381469726562e+01 -1.069640000000000146e+00 -3.637500000000000000e+01 -1.069645000000000179e+00 -3.634375000000000000e+01 -1.069649999999999990e+00 -3.631250000000000000e+01 -1.069655000000000022e+00 -3.634375000000000000e+01 -1.069660000000000055e+00 -3.637500000000000000e+01 -1.069665000000000088e+00 -3.637500000000000000e+01 -1.069670000000000121e+00 -3.640625381469726562e+01 -1.069675000000000153e+00 -3.637500000000000000e+01 -1.069680000000000186e+00 -3.640625381469726562e+01 -1.069684999999999997e+00 -3.643750000000000000e+01 -1.069690000000000030e+00 -3.640625381469726562e+01 -1.069695000000000062e+00 -3.643750000000000000e+01 -1.069700000000000095e+00 -3.631250000000000000e+01 -1.069705000000000128e+00 -3.637500000000000000e+01 -1.069710000000000161e+00 -3.637500000000000000e+01 -1.069715000000000193e+00 -3.640625381469726562e+01 -1.069720000000000004e+00 -3.637500000000000000e+01 -1.069725000000000037e+00 -3.634375000000000000e+01 -1.069730000000000070e+00 -3.640625381469726562e+01 -1.069735000000000102e+00 -3.637500000000000000e+01 -1.069740000000000135e+00 -3.637500000000000000e+01 -1.069745000000000168e+00 -3.637500000000000000e+01 -1.069749999999999979e+00 -3.634375000000000000e+01 -1.069755000000000011e+00 -3.634375000000000000e+01 -1.069760000000000044e+00 -3.637500000000000000e+01 -1.069765000000000077e+00 -3.634375000000000000e+01 -1.069770000000000110e+00 -3.643750000000000000e+01 -1.069775000000000142e+00 -3.634375000000000000e+01 -1.069780000000000175e+00 -3.628125000000000000e+01 -1.069784999999999986e+00 -3.628125000000000000e+01 -1.069790000000000019e+00 -3.631250000000000000e+01 -1.069795000000000051e+00 -3.634375000000000000e+01 -1.069800000000000084e+00 -3.631250000000000000e+01 -1.069805000000000117e+00 -3.625000000000000000e+01 -1.069810000000000150e+00 -3.631250000000000000e+01 -1.069815000000000182e+00 -3.628125000000000000e+01 -1.069819999999999993e+00 -3.621875000000000000e+01 -1.069825000000000026e+00 -3.625000000000000000e+01 -1.069830000000000059e+00 -3.631250000000000000e+01 -1.069835000000000091e+00 -3.634375000000000000e+01 -1.069840000000000124e+00 -3.625000000000000000e+01 -1.069845000000000157e+00 -3.628125000000000000e+01 -1.069850000000000190e+00 -3.631250000000000000e+01 -1.069855000000000000e+00 -3.634375000000000000e+01 -1.069860000000000033e+00 -3.628125000000000000e+01 -1.069865000000000066e+00 -3.628125000000000000e+01 -1.069870000000000099e+00 -3.631250000000000000e+01 -1.069875000000000131e+00 -3.631250000000000000e+01 -1.069880000000000164e+00 -3.625000000000000000e+01 -1.069885000000000197e+00 -3.628125000000000000e+01 -1.069890000000000008e+00 -3.634375000000000000e+01 -1.069895000000000040e+00 -3.631250000000000000e+01 -1.069900000000000073e+00 -3.631250000000000000e+01 -1.069905000000000106e+00 -3.634375000000000000e+01 -1.069910000000000139e+00 -3.628125000000000000e+01 -1.069915000000000171e+00 -3.628125000000000000e+01 -1.069919999999999982e+00 -3.631250000000000000e+01 -1.069925000000000015e+00 -3.634375000000000000e+01 -1.069930000000000048e+00 -3.628125000000000000e+01 -1.069935000000000080e+00 -3.634375000000000000e+01 -1.069940000000000113e+00 -3.631250000000000000e+01 -1.069945000000000146e+00 -3.631250000000000000e+01 -1.069950000000000179e+00 -3.625000000000000000e+01 -1.069954999999999989e+00 -3.634375000000000000e+01 -1.069960000000000022e+00 -3.631250000000000000e+01 -1.069965000000000055e+00 -3.631250000000000000e+01 -1.069970000000000088e+00 -3.625000000000000000e+01 -1.069975000000000120e+00 -3.628125000000000000e+01 -1.069980000000000153e+00 -3.634375000000000000e+01 -1.069985000000000186e+00 -3.628125000000000000e+01 -1.069989999999999997e+00 -3.634375000000000000e+01 -1.069995000000000029e+00 -3.621875000000000000e+01 -1.070000000000000062e+00 -3.634375000000000000e+01 -1.070005000000000095e+00 -3.625000000000000000e+01 -1.070010000000000128e+00 -3.631250000000000000e+01 -1.070015000000000160e+00 -3.625000000000000000e+01 -1.070020000000000193e+00 -3.628125000000000000e+01 -1.070025000000000004e+00 -3.631250000000000000e+01 -1.070030000000000037e+00 -3.634375000000000000e+01 -1.070035000000000069e+00 -3.634375000000000000e+01 -1.070040000000000102e+00 -3.634375000000000000e+01 -1.070045000000000135e+00 -3.634375000000000000e+01 -1.070050000000000168e+00 -3.628125000000000000e+01 -1.070054999999999978e+00 -3.625000000000000000e+01 -1.070060000000000011e+00 -3.628125000000000000e+01 -1.070065000000000044e+00 -3.631250000000000000e+01 -1.070070000000000077e+00 -3.628125000000000000e+01 -1.070075000000000109e+00 -3.625000000000000000e+01 -1.070080000000000142e+00 -3.628125000000000000e+01 -1.070085000000000175e+00 -3.621875000000000000e+01 -1.070089999999999986e+00 -3.634375000000000000e+01 -1.070095000000000018e+00 -3.628125000000000000e+01 -1.070100000000000051e+00 -3.628125000000000000e+01 -1.070105000000000084e+00 -3.631250000000000000e+01 -1.070110000000000117e+00 -3.625000000000000000e+01 -1.070115000000000149e+00 -3.628125000000000000e+01 -1.070120000000000182e+00 -3.628125000000000000e+01 -1.070124999999999993e+00 -3.628125000000000000e+01 -1.070130000000000026e+00 -3.618750000000000000e+01 -1.070135000000000058e+00 -3.625000000000000000e+01 -1.070140000000000091e+00 -3.625000000000000000e+01 -1.070145000000000124e+00 -3.625000000000000000e+01 -1.070150000000000157e+00 -3.628125000000000000e+01 -1.070155000000000189e+00 -3.631250000000000000e+01 -1.070160000000000000e+00 -3.625000000000000000e+01 -1.070165000000000033e+00 -3.628125000000000000e+01 -1.070170000000000066e+00 -3.628125000000000000e+01 -1.070175000000000098e+00 -3.631250000000000000e+01 -1.070180000000000131e+00 -3.628125000000000000e+01 -1.070185000000000164e+00 -3.625000000000000000e+01 -1.070190000000000197e+00 -3.628125000000000000e+01 -1.070195000000000007e+00 -3.625000000000000000e+01 -1.070200000000000040e+00 -3.628125000000000000e+01 -1.070205000000000073e+00 -3.628125000000000000e+01 -1.070210000000000106e+00 -3.625000000000000000e+01 -1.070215000000000138e+00 -3.625000000000000000e+01 -1.070220000000000171e+00 -3.628125000000000000e+01 -1.070224999999999982e+00 -3.628125000000000000e+01 -1.070230000000000015e+00 -3.625000000000000000e+01 -1.070235000000000047e+00 -3.628125000000000000e+01 -1.070240000000000080e+00 -3.631250000000000000e+01 -1.070245000000000113e+00 -3.628125000000000000e+01 -1.070250000000000146e+00 -3.621875000000000000e+01 -1.070255000000000178e+00 -3.628125000000000000e+01 -1.070259999999999989e+00 -3.621875000000000000e+01 -1.070265000000000022e+00 -3.625000000000000000e+01 -1.070270000000000055e+00 -3.628125000000000000e+01 -1.070275000000000087e+00 -3.621875000000000000e+01 -1.070280000000000120e+00 -3.628125000000000000e+01 -1.070285000000000153e+00 -3.625000000000000000e+01 -1.070290000000000186e+00 -3.625000000000000000e+01 -1.070294999999999996e+00 -3.621875000000000000e+01 -1.070300000000000029e+00 -3.625000000000000000e+01 -1.070305000000000062e+00 -3.621875000000000000e+01 -1.070310000000000095e+00 -3.621875000000000000e+01 -1.070315000000000127e+00 -3.625000000000000000e+01 -1.070320000000000160e+00 -3.621875000000000000e+01 -1.070325000000000193e+00 -3.618750000000000000e+01 -1.070330000000000004e+00 -3.621875000000000000e+01 -1.070335000000000036e+00 -3.621875000000000000e+01 -1.070340000000000069e+00 -3.615625381469726562e+01 -1.070345000000000102e+00 -3.621875000000000000e+01 -1.070350000000000135e+00 -3.615625381469726562e+01 -1.070355000000000167e+00 -3.615625381469726562e+01 -1.070359999999999978e+00 -3.615625381469726562e+01 -1.070365000000000011e+00 -3.615625381469726562e+01 -1.070370000000000044e+00 -3.615625381469726562e+01 -1.070375000000000076e+00 -3.615625381469726562e+01 -1.070380000000000109e+00 -3.621875000000000000e+01 -1.070385000000000142e+00 -3.612500000000000000e+01 -1.070390000000000175e+00 -3.615625381469726562e+01 -1.070394999999999985e+00 -3.615625381469726562e+01 -1.070400000000000018e+00 -3.612500000000000000e+01 -1.070405000000000051e+00 -3.621875000000000000e+01 -1.070410000000000084e+00 -3.618750000000000000e+01 -1.070415000000000116e+00 -3.618750000000000000e+01 -1.070420000000000149e+00 -3.615625381469726562e+01 -1.070425000000000182e+00 -3.621875000000000000e+01 -1.070429999999999993e+00 -3.618750000000000000e+01 -1.070435000000000025e+00 -3.615625381469726562e+01 -1.070440000000000058e+00 -3.615625381469726562e+01 -1.070445000000000091e+00 -3.618750000000000000e+01 -1.070450000000000124e+00 -3.615625381469726562e+01 -1.070455000000000156e+00 -3.612500000000000000e+01 -1.070460000000000189e+00 -3.618750000000000000e+01 -1.070465000000000000e+00 -3.615625381469726562e+01 -1.070470000000000033e+00 -3.618750000000000000e+01 -1.070475000000000065e+00 -3.621875000000000000e+01 -1.070480000000000098e+00 -3.615625381469726562e+01 -1.070485000000000131e+00 -3.621875000000000000e+01 -1.070490000000000164e+00 -3.621875000000000000e+01 -1.070495000000000196e+00 -3.621875000000000000e+01 -1.070500000000000007e+00 -3.621875000000000000e+01 -1.070505000000000040e+00 -3.625000000000000000e+01 -1.070510000000000073e+00 -3.618750000000000000e+01 -1.070515000000000105e+00 -3.612500000000000000e+01 -1.070520000000000138e+00 -3.615625381469726562e+01 -1.070525000000000171e+00 -3.618750000000000000e+01 -1.070529999999999982e+00 -3.612500000000000000e+01 -1.070535000000000014e+00 -3.615625381469726562e+01 -1.070540000000000047e+00 -3.618750000000000000e+01 -1.070545000000000080e+00 -3.615625381469726562e+01 -1.070550000000000113e+00 -3.612500000000000000e+01 -1.070555000000000145e+00 -3.615625381469726562e+01 -1.070560000000000178e+00 -3.615625381469726562e+01 -1.070564999999999989e+00 -3.612500000000000000e+01 -1.070570000000000022e+00 -3.606250000000000000e+01 -1.070575000000000054e+00 -3.612500000000000000e+01 -1.070580000000000087e+00 -3.621875000000000000e+01 -1.070585000000000120e+00 -3.612500000000000000e+01 -1.070590000000000153e+00 -3.609375000000000000e+01 -1.070595000000000185e+00 -3.609375000000000000e+01 -1.070599999999999996e+00 -3.612500000000000000e+01 -1.070605000000000029e+00 -3.612500000000000000e+01 -1.070610000000000062e+00 -3.621875000000000000e+01 -1.070615000000000094e+00 -3.609375000000000000e+01 -1.070620000000000127e+00 -3.615625381469726562e+01 -1.070625000000000160e+00 -3.609375000000000000e+01 -1.070630000000000193e+00 -3.615625381469726562e+01 -1.070635000000000003e+00 -3.615625381469726562e+01 -1.070640000000000036e+00 -3.606250000000000000e+01 -1.070645000000000069e+00 -3.612500000000000000e+01 -1.070650000000000102e+00 -3.612500000000000000e+01 -1.070655000000000134e+00 -3.609375000000000000e+01 -1.070660000000000167e+00 -3.612500000000000000e+01 -1.070664999999999978e+00 -3.615625381469726562e+01 -1.070670000000000011e+00 -3.609375000000000000e+01 -1.070675000000000043e+00 -3.612500000000000000e+01 -1.070680000000000076e+00 -3.603125000000000000e+01 -1.070685000000000109e+00 -3.615625381469726562e+01 -1.070690000000000142e+00 -3.612500000000000000e+01 -1.070695000000000174e+00 -3.609375000000000000e+01 -1.070699999999999985e+00 -3.609375000000000000e+01 -1.070705000000000018e+00 -3.606250000000000000e+01 -1.070710000000000051e+00 -3.615625381469726562e+01 -1.070715000000000083e+00 -3.612500000000000000e+01 -1.070720000000000116e+00 -3.615625381469726562e+01 -1.070725000000000149e+00 -3.618750000000000000e+01 -1.070730000000000182e+00 -3.609375000000000000e+01 -1.070734999999999992e+00 -3.606250000000000000e+01 -1.070740000000000025e+00 -3.615625381469726562e+01 -1.070745000000000058e+00 -3.615625381469726562e+01 -1.070750000000000091e+00 -3.609375000000000000e+01 -1.070755000000000123e+00 -3.612500000000000000e+01 -1.070760000000000156e+00 -3.606250000000000000e+01 -1.070765000000000189e+00 -3.606250000000000000e+01 -1.070770000000000000e+00 -3.609375000000000000e+01 -1.070775000000000032e+00 -3.609375000000000000e+01 -1.070780000000000065e+00 -3.609375000000000000e+01 -1.070785000000000098e+00 -3.615625381469726562e+01 -1.070790000000000131e+00 -3.603125000000000000e+01 -1.070795000000000163e+00 -3.612500000000000000e+01 -1.070800000000000196e+00 -3.606250000000000000e+01 -1.070805000000000007e+00 -3.603125000000000000e+01 -1.070810000000000040e+00 -3.606250000000000000e+01 -1.070815000000000072e+00 -3.606250000000000000e+01 -1.070820000000000105e+00 -3.609375000000000000e+01 -1.070825000000000138e+00 -3.606250000000000000e+01 -1.070830000000000171e+00 -3.615625381469726562e+01 -1.070834999999999981e+00 -3.606250000000000000e+01 -1.070840000000000014e+00 -3.609375000000000000e+01 -1.070845000000000047e+00 -3.612500000000000000e+01 -1.070850000000000080e+00 -3.603125000000000000e+01 -1.070855000000000112e+00 -3.603125000000000000e+01 -1.070860000000000145e+00 -3.606250000000000000e+01 -1.070865000000000178e+00 -3.606250000000000000e+01 -1.070869999999999989e+00 -3.606250000000000000e+01 -1.070875000000000021e+00 -3.603125000000000000e+01 -1.070880000000000054e+00 -3.606250000000000000e+01 -1.070885000000000087e+00 -3.603125000000000000e+01 -1.070890000000000120e+00 -3.603125000000000000e+01 -1.070895000000000152e+00 -3.603125000000000000e+01 -1.070900000000000185e+00 -3.603125000000000000e+01 -1.070904999999999996e+00 -3.603125000000000000e+01 -1.070910000000000029e+00 -3.606250000000000000e+01 -1.070915000000000061e+00 -3.606250000000000000e+01 -1.070920000000000094e+00 -3.600000381469726562e+01 -1.070925000000000127e+00 -3.603125000000000000e+01 -1.070930000000000160e+00 -3.600000381469726562e+01 -1.070935000000000192e+00 -3.603125000000000000e+01 -1.070940000000000003e+00 -3.603125000000000000e+01 -1.070945000000000036e+00 -3.603125000000000000e+01 -1.070950000000000069e+00 -3.596875000000000000e+01 -1.070955000000000101e+00 -3.600000381469726562e+01 -1.070960000000000134e+00 -3.596875000000000000e+01 -1.070965000000000167e+00 -3.600000381469726562e+01 -1.070969999999999978e+00 -3.606250000000000000e+01 -1.070975000000000010e+00 -3.600000381469726562e+01 -1.070980000000000043e+00 -3.593750000000000000e+01 -1.070985000000000076e+00 -3.596875000000000000e+01 -1.070990000000000109e+00 -3.593750000000000000e+01 -1.070995000000000141e+00 -3.596875000000000000e+01 -1.071000000000000174e+00 -3.600000381469726562e+01 -1.071004999999999985e+00 -3.596875000000000000e+01 -1.071010000000000018e+00 -3.593750000000000000e+01 -1.071015000000000050e+00 -3.596875000000000000e+01 -1.071020000000000083e+00 -3.596875000000000000e+01 -1.071025000000000116e+00 -3.600000381469726562e+01 -1.071030000000000149e+00 -3.603125000000000000e+01 -1.071035000000000181e+00 -3.603125000000000000e+01 -1.071039999999999992e+00 -3.603125000000000000e+01 -1.071045000000000025e+00 -3.593750000000000000e+01 -1.071050000000000058e+00 -3.603125000000000000e+01 -1.071055000000000090e+00 -3.593750000000000000e+01 -1.071060000000000123e+00 -3.600000381469726562e+01 -1.071065000000000156e+00 -3.603125000000000000e+01 -1.071070000000000189e+00 -3.596875000000000000e+01 -1.071074999999999999e+00 -3.600000381469726562e+01 -1.071080000000000032e+00 -3.603125000000000000e+01 -1.071085000000000065e+00 -3.603125000000000000e+01 -1.071090000000000098e+00 -3.603125000000000000e+01 -1.071095000000000130e+00 -3.603125000000000000e+01 -1.071100000000000163e+00 -3.603125000000000000e+01 -1.071105000000000196e+00 -3.596875000000000000e+01 -1.071110000000000007e+00 -3.596875000000000000e+01 -1.071115000000000039e+00 -3.596875000000000000e+01 -1.071120000000000072e+00 -3.603125000000000000e+01 -1.071125000000000105e+00 -3.603125000000000000e+01 -1.071130000000000138e+00 -3.603125000000000000e+01 -1.071135000000000170e+00 -3.596875000000000000e+01 -1.071139999999999981e+00 -3.603125000000000000e+01 -1.071145000000000014e+00 -3.603125000000000000e+01 -1.071150000000000047e+00 -3.606250000000000000e+01 -1.071155000000000079e+00 -3.603125000000000000e+01 -1.071160000000000112e+00 -3.603125000000000000e+01 -1.071165000000000145e+00 -3.596875000000000000e+01 -1.071170000000000178e+00 -3.596875000000000000e+01 -1.071174999999999988e+00 -3.603125000000000000e+01 -1.071180000000000021e+00 -3.600000381469726562e+01 -1.071185000000000054e+00 -3.603125000000000000e+01 -1.071190000000000087e+00 -3.603125000000000000e+01 -1.071195000000000119e+00 -3.596875000000000000e+01 -1.071200000000000152e+00 -3.603125000000000000e+01 -1.071205000000000185e+00 -3.596875000000000000e+01 -1.071209999999999996e+00 -3.596875000000000000e+01 -1.071215000000000028e+00 -3.593750000000000000e+01 -1.071220000000000061e+00 -3.593750000000000000e+01 -1.071225000000000094e+00 -3.596875000000000000e+01 -1.071230000000000127e+00 -3.593750000000000000e+01 -1.071235000000000159e+00 -3.596875000000000000e+01 -1.071240000000000192e+00 -3.596875000000000000e+01 -1.071245000000000003e+00 -3.593750000000000000e+01 -1.071250000000000036e+00 -3.590625000000000000e+01 -1.071255000000000068e+00 -3.603125000000000000e+01 -1.071260000000000101e+00 -3.593750000000000000e+01 -1.071265000000000134e+00 -3.596875000000000000e+01 -1.071270000000000167e+00 -3.600000381469726562e+01 -1.071274999999999977e+00 -3.593750000000000000e+01 -1.071280000000000010e+00 -3.593750000000000000e+01 -1.071285000000000043e+00 -3.596875000000000000e+01 -1.071290000000000076e+00 -3.603125000000000000e+01 -1.071295000000000108e+00 -3.593750000000000000e+01 -1.071300000000000141e+00 -3.593750000000000000e+01 -1.071305000000000174e+00 -3.593750000000000000e+01 -1.071309999999999985e+00 -3.590625000000000000e+01 -1.071315000000000017e+00 -3.587500000000000000e+01 -1.071320000000000050e+00 -3.587500000000000000e+01 -1.071325000000000083e+00 -3.590625000000000000e+01 -1.071330000000000116e+00 -3.593750000000000000e+01 -1.071335000000000148e+00 -3.593750000000000000e+01 -1.071340000000000181e+00 -3.590625000000000000e+01 -1.071344999999999992e+00 -3.587500000000000000e+01 -1.071350000000000025e+00 -3.587500000000000000e+01 -1.071355000000000057e+00 -3.590625000000000000e+01 -1.071360000000000090e+00 -3.584375381469726562e+01 -1.071365000000000123e+00 -3.590625000000000000e+01 -1.071370000000000156e+00 -3.587500000000000000e+01 -1.071375000000000188e+00 -3.590625000000000000e+01 -1.071379999999999999e+00 -3.590625000000000000e+01 -1.071385000000000032e+00 -3.590625000000000000e+01 -1.071390000000000065e+00 -3.593750000000000000e+01 -1.071395000000000097e+00 -3.590625000000000000e+01 -1.071400000000000130e+00 -3.590625000000000000e+01 -1.071405000000000163e+00 -3.590625000000000000e+01 -1.071410000000000196e+00 -3.593750000000000000e+01 -1.071415000000000006e+00 -3.593750000000000000e+01 -1.071420000000000039e+00 -3.590625000000000000e+01 -1.071425000000000072e+00 -3.596875000000000000e+01 -1.071430000000000105e+00 -3.593750000000000000e+01 -1.071435000000000137e+00 -3.590625000000000000e+01 -1.071440000000000170e+00 -3.590625000000000000e+01 -1.071444999999999981e+00 -3.593750000000000000e+01 -1.071450000000000014e+00 -3.590625000000000000e+01 -1.071455000000000046e+00 -3.593750000000000000e+01 -1.071460000000000079e+00 -3.593750000000000000e+01 -1.071465000000000112e+00 -3.590625000000000000e+01 -1.071470000000000145e+00 -3.587500000000000000e+01 -1.071475000000000177e+00 -3.590625000000000000e+01 -1.071479999999999988e+00 -3.584375381469726562e+01 -1.071485000000000021e+00 -3.587500000000000000e+01 -1.071490000000000054e+00 -3.584375381469726562e+01 -1.071495000000000086e+00 -3.590625000000000000e+01 -1.071500000000000119e+00 -3.590625000000000000e+01 -1.071505000000000152e+00 -3.587500000000000000e+01 -1.071510000000000185e+00 -3.584375381469726562e+01 -1.071514999999999995e+00 -3.590625000000000000e+01 -1.071520000000000028e+00 -3.590625000000000000e+01 -1.071525000000000061e+00 -3.593750000000000000e+01 -1.071530000000000094e+00 -3.590625000000000000e+01 -1.071535000000000126e+00 -3.587500000000000000e+01 -1.071540000000000159e+00 -3.590625000000000000e+01 -1.071545000000000192e+00 -3.590625000000000000e+01 -1.071550000000000002e+00 -3.590625000000000000e+01 -1.071555000000000035e+00 -3.590625000000000000e+01 -1.071560000000000068e+00 -3.587500000000000000e+01 -1.071565000000000101e+00 -3.581250000000000000e+01 -1.071570000000000134e+00 -3.587500000000000000e+01 -1.071575000000000166e+00 -3.587500000000000000e+01 -1.071579999999999977e+00 -3.587500000000000000e+01 -1.071585000000000010e+00 -3.581250000000000000e+01 -1.071590000000000042e+00 -3.587500000000000000e+01 -1.071595000000000075e+00 -3.584375381469726562e+01 -1.071600000000000108e+00 -3.581250000000000000e+01 -1.071605000000000141e+00 -3.584375381469726562e+01 -1.071610000000000174e+00 -3.587500000000000000e+01 -1.071614999999999984e+00 -3.581250000000000000e+01 -1.071620000000000017e+00 -3.584375381469726562e+01 -1.071625000000000050e+00 -3.584375381469726562e+01 -1.071630000000000082e+00 -3.584375381469726562e+01 -1.071635000000000115e+00 -3.590625000000000000e+01 -1.071640000000000148e+00 -3.584375381469726562e+01 -1.071645000000000181e+00 -3.581250000000000000e+01 -1.071649999999999991e+00 -3.590625000000000000e+01 -1.071655000000000024e+00 -3.584375381469726562e+01 -1.071660000000000057e+00 -3.587500000000000000e+01 -1.071665000000000090e+00 -3.587500000000000000e+01 -1.071670000000000122e+00 -3.590625000000000000e+01 -1.071675000000000155e+00 -3.587500000000000000e+01 -1.071680000000000188e+00 -3.584375381469726562e+01 -1.071684999999999999e+00 -3.581250000000000000e+01 -1.071690000000000031e+00 -3.584375381469726562e+01 -1.071695000000000064e+00 -3.578125000000000000e+01 -1.071700000000000097e+00 -3.587500000000000000e+01 -1.071705000000000130e+00 -3.587500000000000000e+01 -1.071710000000000163e+00 -3.584375381469726562e+01 -1.071715000000000195e+00 -3.581250000000000000e+01 -1.071720000000000006e+00 -3.584375381469726562e+01 -1.071725000000000039e+00 -3.584375381469726562e+01 -1.071730000000000071e+00 -3.578125000000000000e+01 -1.071735000000000104e+00 -3.578125000000000000e+01 -1.071740000000000137e+00 -3.578125000000000000e+01 -1.071745000000000170e+00 -3.578125000000000000e+01 -1.071749999999999980e+00 -3.578125000000000000e+01 -1.071755000000000013e+00 -3.584375381469726562e+01 -1.071760000000000046e+00 -3.584375381469726562e+01 -1.071765000000000079e+00 -3.578125000000000000e+01 -1.071770000000000111e+00 -3.578125000000000000e+01 -1.071775000000000144e+00 -3.578125000000000000e+01 -1.071780000000000177e+00 -3.581250000000000000e+01 -1.071784999999999988e+00 -3.578125000000000000e+01 -1.071790000000000020e+00 -3.578125000000000000e+01 -1.071795000000000053e+00 -3.571875000000000000e+01 -1.071800000000000086e+00 -3.581250000000000000e+01 -1.071805000000000119e+00 -3.571875000000000000e+01 -1.071810000000000151e+00 -3.575000000000000000e+01 -1.071815000000000184e+00 -3.578125000000000000e+01 -1.071819999999999995e+00 -3.578125000000000000e+01 -1.071825000000000028e+00 -3.584375381469726562e+01 -1.071830000000000060e+00 -3.581250000000000000e+01 -1.071835000000000093e+00 -3.581250000000000000e+01 -1.071840000000000126e+00 -3.575000000000000000e+01 -1.071845000000000159e+00 -3.578125000000000000e+01 -1.071850000000000191e+00 -3.578125000000000000e+01 -1.071855000000000002e+00 -3.578125000000000000e+01 -1.071860000000000035e+00 -3.581250000000000000e+01 -1.071865000000000068e+00 -3.575000000000000000e+01 -1.071870000000000100e+00 -3.581250000000000000e+01 -1.071875000000000133e+00 -3.568750381469726562e+01 -1.071880000000000166e+00 -3.578125000000000000e+01 -1.071884999999999977e+00 -3.575000000000000000e+01 -1.071890000000000009e+00 -3.575000000000000000e+01 -1.071895000000000042e+00 -3.581250000000000000e+01 -1.071900000000000075e+00 -3.568750381469726562e+01 -1.071905000000000108e+00 -3.571875000000000000e+01 -1.071910000000000140e+00 -3.578125000000000000e+01 -1.071915000000000173e+00 -3.578125000000000000e+01 -1.071919999999999984e+00 -3.575000000000000000e+01 -1.071925000000000017e+00 -3.584375381469726562e+01 -1.071930000000000049e+00 -3.575000000000000000e+01 -1.071935000000000082e+00 -3.571875000000000000e+01 -1.071940000000000115e+00 -3.575000000000000000e+01 -1.071945000000000148e+00 -3.578125000000000000e+01 -1.071950000000000180e+00 -3.575000000000000000e+01 -1.071954999999999991e+00 -3.571875000000000000e+01 -1.071960000000000024e+00 -3.571875000000000000e+01 -1.071965000000000057e+00 -3.575000000000000000e+01 -1.071970000000000089e+00 -3.581250000000000000e+01 -1.071975000000000122e+00 -3.578125000000000000e+01 -1.071980000000000155e+00 -3.571875000000000000e+01 -1.071985000000000188e+00 -3.571875000000000000e+01 -1.071989999999999998e+00 -3.578125000000000000e+01 -1.071995000000000031e+00 -3.578125000000000000e+01 -1.072000000000000064e+00 -3.571875000000000000e+01 -1.072005000000000097e+00 -3.578125000000000000e+01 -1.072010000000000129e+00 -3.575000000000000000e+01 -1.072015000000000162e+00 -3.571875000000000000e+01 -1.072020000000000195e+00 -3.581250000000000000e+01 -1.072025000000000006e+00 -3.578125000000000000e+01 -1.072030000000000038e+00 -3.581250000000000000e+01 -1.072035000000000071e+00 -3.578125000000000000e+01 -1.072040000000000104e+00 -3.571875000000000000e+01 -1.072045000000000137e+00 -3.575000000000000000e+01 -1.072050000000000169e+00 -3.575000000000000000e+01 -1.072054999999999980e+00 -3.571875000000000000e+01 -1.072060000000000013e+00 -3.571875000000000000e+01 -1.072065000000000046e+00 -3.568750381469726562e+01 -1.072070000000000078e+00 -3.568750381469726562e+01 -1.072075000000000111e+00 -3.571875000000000000e+01 -1.072080000000000144e+00 -3.575000000000000000e+01 -1.072085000000000177e+00 -3.565625000000000000e+01 -1.072089999999999987e+00 -3.565625000000000000e+01 -1.072095000000000020e+00 -3.571875000000000000e+01 -1.072100000000000053e+00 -3.571875000000000000e+01 -1.072105000000000086e+00 -3.575000000000000000e+01 -1.072110000000000118e+00 -3.571875000000000000e+01 -1.072115000000000151e+00 -3.571875000000000000e+01 -1.072120000000000184e+00 -3.571875000000000000e+01 -1.072124999999999995e+00 -3.565625000000000000e+01 -1.072130000000000027e+00 -3.575000000000000000e+01 -1.072135000000000060e+00 -3.565625000000000000e+01 -1.072140000000000093e+00 -3.575000000000000000e+01 -1.072145000000000126e+00 -3.575000000000000000e+01 -1.072150000000000158e+00 -3.571875000000000000e+01 -1.072155000000000191e+00 -3.571875000000000000e+01 -1.072160000000000002e+00 -3.568750381469726562e+01 -1.072165000000000035e+00 -3.568750381469726562e+01 -1.072170000000000067e+00 -3.568750381469726562e+01 -1.072175000000000100e+00 -3.578125000000000000e+01 -1.072180000000000133e+00 -3.568750381469726562e+01 -1.072185000000000166e+00 -3.575000000000000000e+01 -1.072190000000000198e+00 -3.571875000000000000e+01 -1.072195000000000009e+00 -3.571875000000000000e+01 -1.072200000000000042e+00 -3.575000000000000000e+01 -1.072205000000000075e+00 -3.571875000000000000e+01 -1.072210000000000107e+00 -3.575000000000000000e+01 -1.072215000000000140e+00 -3.571875000000000000e+01 -1.072220000000000173e+00 -3.568750381469726562e+01 -1.072224999999999984e+00 -3.575000000000000000e+01 -1.072230000000000016e+00 -3.565625000000000000e+01 -1.072235000000000049e+00 -3.568750381469726562e+01 -1.072240000000000082e+00 -3.565625000000000000e+01 -1.072245000000000115e+00 -3.568750381469726562e+01 -1.072250000000000147e+00 -3.565625000000000000e+01 -1.072255000000000180e+00 -3.562500000000000000e+01 -1.072259999999999991e+00 -3.562500000000000000e+01 -1.072265000000000024e+00 -3.565625000000000000e+01 -1.072270000000000056e+00 -3.568750381469726562e+01 -1.072275000000000089e+00 -3.562500000000000000e+01 -1.072280000000000122e+00 -3.562500000000000000e+01 -1.072285000000000155e+00 -3.568750381469726562e+01 -1.072290000000000187e+00 -3.568750381469726562e+01 -1.072294999999999998e+00 -3.565625000000000000e+01 -1.072300000000000031e+00 -3.565625000000000000e+01 -1.072305000000000064e+00 -3.565625000000000000e+01 -1.072310000000000096e+00 -3.562500000000000000e+01 -1.072315000000000129e+00 -3.571875000000000000e+01 -1.072320000000000162e+00 -3.556250000000000000e+01 -1.072325000000000195e+00 -3.562500000000000000e+01 -1.072330000000000005e+00 -3.565625000000000000e+01 -1.072335000000000038e+00 -3.565625000000000000e+01 -1.072340000000000071e+00 -3.565625000000000000e+01 -1.072345000000000104e+00 -3.565625000000000000e+01 -1.072350000000000136e+00 -3.568750381469726562e+01 -1.072355000000000169e+00 -3.562500000000000000e+01 -1.072359999999999980e+00 -3.559375000000000000e+01 -1.072365000000000013e+00 -3.556250000000000000e+01 -1.072370000000000045e+00 -3.565625000000000000e+01 -1.072375000000000078e+00 -3.565625000000000000e+01 -1.072380000000000111e+00 -3.562500000000000000e+01 -1.072385000000000144e+00 -3.559375000000000000e+01 -1.072390000000000176e+00 -3.562500000000000000e+01 -1.072394999999999987e+00 -3.562500000000000000e+01 -1.072400000000000020e+00 -3.562500000000000000e+01 -1.072405000000000053e+00 -3.562500000000000000e+01 -1.072410000000000085e+00 -3.559375000000000000e+01 -1.072415000000000118e+00 -3.556250000000000000e+01 -1.072420000000000151e+00 -3.556250000000000000e+01 -1.072425000000000184e+00 -3.562500000000000000e+01 -1.072429999999999994e+00 -3.565625000000000000e+01 -1.072435000000000027e+00 -3.562500000000000000e+01 -1.072440000000000060e+00 -3.553125381469726562e+01 -1.072445000000000093e+00 -3.562500000000000000e+01 -1.072450000000000125e+00 -3.556250000000000000e+01 -1.072455000000000158e+00 -3.556250000000000000e+01 -1.072460000000000191e+00 -3.559375000000000000e+01 -1.072465000000000002e+00 -3.559375000000000000e+01 -1.072470000000000034e+00 -3.562500000000000000e+01 -1.072475000000000067e+00 -3.565625000000000000e+01 -1.072480000000000100e+00 -3.556250000000000000e+01 -1.072485000000000133e+00 -3.556250000000000000e+01 -1.072490000000000165e+00 -3.556250000000000000e+01 -1.072495000000000198e+00 -3.556250000000000000e+01 -1.072500000000000009e+00 -3.559375000000000000e+01 -1.072505000000000042e+00 -3.559375000000000000e+01 -1.072510000000000074e+00 -3.559375000000000000e+01 -1.072515000000000107e+00 -3.556250000000000000e+01 -1.072520000000000140e+00 -3.556250000000000000e+01 -1.072525000000000173e+00 -3.553125381469726562e+01 -1.072529999999999983e+00 -3.553125381469726562e+01 -1.072535000000000016e+00 -3.556250000000000000e+01 -1.072540000000000049e+00 -3.559375000000000000e+01 -1.072545000000000082e+00 -3.556250000000000000e+01 -1.072550000000000114e+00 -3.556250000000000000e+01 -1.072555000000000147e+00 -3.546875000000000000e+01 -1.072560000000000180e+00 -3.556250000000000000e+01 -1.072564999999999991e+00 -3.556250000000000000e+01 -1.072570000000000023e+00 -3.550000000000000000e+01 -1.072575000000000056e+00 -3.546875000000000000e+01 -1.072580000000000089e+00 -3.550000000000000000e+01 -1.072585000000000122e+00 -3.546875000000000000e+01 -1.072590000000000154e+00 -3.553125381469726562e+01 -1.072595000000000187e+00 -3.550000000000000000e+01 -1.072599999999999998e+00 -3.550000000000000000e+01 -1.072605000000000031e+00 -3.550000000000000000e+01 -1.072610000000000063e+00 -3.546875000000000000e+01 -1.072615000000000096e+00 -3.550000000000000000e+01 -1.072620000000000129e+00 -3.543750381469726562e+01 -1.072625000000000162e+00 -3.546875000000000000e+01 -1.072630000000000194e+00 -3.550000000000000000e+01 -1.072635000000000005e+00 -3.550000000000000000e+01 -1.072640000000000038e+00 -3.550000000000000000e+01 -1.072645000000000071e+00 -3.550000000000000000e+01 -1.072650000000000103e+00 -3.553125381469726562e+01 -1.072655000000000136e+00 -3.553125381469726562e+01 -1.072660000000000169e+00 -3.550000000000000000e+01 -1.072664999999999980e+00 -3.546875000000000000e+01 -1.072670000000000012e+00 -3.553125381469726562e+01 -1.072675000000000045e+00 -3.553125381469726562e+01 -1.072680000000000078e+00 -3.550000000000000000e+01 -1.072685000000000111e+00 -3.553125381469726562e+01 -1.072690000000000143e+00 -3.546875000000000000e+01 -1.072695000000000176e+00 -3.550000000000000000e+01 -1.072699999999999987e+00 -3.550000000000000000e+01 -1.072705000000000020e+00 -3.553125381469726562e+01 -1.072710000000000052e+00 -3.553125381469726562e+01 -1.072715000000000085e+00 -3.546875000000000000e+01 -1.072720000000000118e+00 -3.556250000000000000e+01 -1.072725000000000151e+00 -3.553125381469726562e+01 -1.072730000000000183e+00 -3.553125381469726562e+01 -1.072734999999999994e+00 -3.553125381469726562e+01 -1.072740000000000027e+00 -3.550000000000000000e+01 -1.072745000000000060e+00 -3.546875000000000000e+01 -1.072750000000000092e+00 -3.550000000000000000e+01 -1.072755000000000125e+00 -3.546875000000000000e+01 -1.072760000000000158e+00 -3.550000000000000000e+01 -1.072765000000000191e+00 -3.550000000000000000e+01 -1.072770000000000001e+00 -3.546875000000000000e+01 -1.072775000000000034e+00 -3.556250000000000000e+01 -1.072780000000000067e+00 -3.550000000000000000e+01 -1.072785000000000100e+00 -3.550000000000000000e+01 -1.072790000000000132e+00 -3.546875000000000000e+01 -1.072795000000000165e+00 -3.550000000000000000e+01 -1.072800000000000198e+00 -3.543750381469726562e+01 -1.072805000000000009e+00 -3.546875000000000000e+01 -1.072810000000000041e+00 -3.546875000000000000e+01 -1.072815000000000074e+00 -3.546875000000000000e+01 -1.072820000000000107e+00 -3.543750381469726562e+01 -1.072825000000000140e+00 -3.543750381469726562e+01 -1.072830000000000172e+00 -3.546875000000000000e+01 -1.072834999999999983e+00 -3.540625000000000000e+01 -1.072840000000000016e+00 -3.540625000000000000e+01 -1.072845000000000049e+00 -3.537500000000000000e+01 -1.072850000000000081e+00 -3.546875000000000000e+01 -1.072855000000000114e+00 -3.543750381469726562e+01 -1.072860000000000147e+00 -3.540625000000000000e+01 -1.072865000000000180e+00 -3.540625000000000000e+01 -1.072869999999999990e+00 -3.537500000000000000e+01 -1.072875000000000023e+00 -3.543750381469726562e+01 -1.072880000000000056e+00 -3.543750381469726562e+01 -1.072885000000000089e+00 -3.540625000000000000e+01 -1.072890000000000121e+00 -3.546875000000000000e+01 -1.072895000000000154e+00 -3.543750381469726562e+01 -1.072900000000000187e+00 -3.543750381469726562e+01 -1.072904999999999998e+00 -3.540625000000000000e+01 -1.072910000000000030e+00 -3.546875000000000000e+01 -1.072915000000000063e+00 -3.543750381469726562e+01 -1.072920000000000096e+00 -3.546875000000000000e+01 -1.072925000000000129e+00 -3.540625000000000000e+01 -1.072930000000000161e+00 -3.546875000000000000e+01 -1.072935000000000194e+00 -3.540625000000000000e+01 -1.072940000000000005e+00 -3.550000000000000000e+01 -1.072945000000000038e+00 -3.546875000000000000e+01 -1.072950000000000070e+00 -3.537500000000000000e+01 -1.072955000000000103e+00 -3.543750381469726562e+01 -1.072960000000000136e+00 -3.543750381469726562e+01 -1.072965000000000169e+00 -3.543750381469726562e+01 -1.072969999999999979e+00 -3.540625000000000000e+01 -1.072975000000000012e+00 -3.537500000000000000e+01 -1.072980000000000045e+00 -3.537500000000000000e+01 -1.072985000000000078e+00 -3.534375000000000000e+01 -1.072990000000000110e+00 -3.540625000000000000e+01 -1.072995000000000143e+00 -3.531250000000000000e+01 -1.073000000000000176e+00 -3.534375000000000000e+01 -1.073004999999999987e+00 -3.534375000000000000e+01 -1.073010000000000019e+00 -3.531250000000000000e+01 -1.073015000000000052e+00 -3.537500000000000000e+01 -1.073020000000000085e+00 -3.528125381469726562e+01 -1.073025000000000118e+00 -3.531250000000000000e+01 -1.073030000000000150e+00 -3.537500000000000000e+01 -1.073035000000000183e+00 -3.540625000000000000e+01 -1.073039999999999994e+00 -3.540625000000000000e+01 -1.073045000000000027e+00 -3.540625000000000000e+01 -1.073050000000000059e+00 -3.537500000000000000e+01 -1.073055000000000092e+00 -3.534375000000000000e+01 -1.073060000000000125e+00 -3.537500000000000000e+01 -1.073065000000000158e+00 -3.531250000000000000e+01 -1.073070000000000190e+00 -3.534375000000000000e+01 -1.073075000000000001e+00 -3.534375000000000000e+01 -1.073080000000000034e+00 -3.525000000000000000e+01 -1.073085000000000067e+00 -3.534375000000000000e+01 -1.073090000000000099e+00 -3.531250000000000000e+01 -1.073095000000000132e+00 -3.537500000000000000e+01 -1.073100000000000165e+00 -3.534375000000000000e+01 -1.073105000000000198e+00 -3.537500000000000000e+01 -1.073110000000000008e+00 -3.531250000000000000e+01 -1.073115000000000041e+00 -3.531250000000000000e+01 -1.073120000000000074e+00 -3.537500000000000000e+01 -1.073125000000000107e+00 -3.540625000000000000e+01 -1.073130000000000139e+00 -3.543750381469726562e+01 -1.073135000000000172e+00 -3.531250000000000000e+01 -1.073139999999999983e+00 -3.537500000000000000e+01 -1.073145000000000016e+00 -3.534375000000000000e+01 -1.073150000000000048e+00 -3.531250000000000000e+01 -1.073155000000000081e+00 -3.531250000000000000e+01 -1.073160000000000114e+00 -3.540625000000000000e+01 -1.073165000000000147e+00 -3.531250000000000000e+01 -1.073170000000000179e+00 -3.525000000000000000e+01 -1.073174999999999990e+00 -3.534375000000000000e+01 -1.073180000000000023e+00 -3.525000000000000000e+01 -1.073185000000000056e+00 -3.534375000000000000e+01 -1.073190000000000088e+00 -3.528125381469726562e+01 -1.073195000000000121e+00 -3.531250000000000000e+01 -1.073200000000000154e+00 -3.531250000000000000e+01 -1.073205000000000187e+00 -3.528125381469726562e+01 -1.073209999999999997e+00 -3.534375000000000000e+01 -1.073215000000000030e+00 -3.528125381469726562e+01 -1.073220000000000063e+00 -3.531250000000000000e+01 -1.073225000000000096e+00 -3.534375000000000000e+01 -1.073230000000000128e+00 -3.531250000000000000e+01 -1.073235000000000161e+00 -3.528125381469726562e+01 -1.073240000000000194e+00 -3.531250000000000000e+01 -1.073245000000000005e+00 -3.534375000000000000e+01 -1.073250000000000037e+00 -3.528125381469726562e+01 -1.073255000000000070e+00 -3.531250000000000000e+01 -1.073260000000000103e+00 -3.528125381469726562e+01 -1.073265000000000136e+00 -3.528125381469726562e+01 -1.073270000000000168e+00 -3.525000000000000000e+01 -1.073274999999999979e+00 -3.531250000000000000e+01 -1.073280000000000012e+00 -3.528125381469726562e+01 -1.073285000000000045e+00 -3.528125381469726562e+01 -1.073290000000000077e+00 -3.528125381469726562e+01 -1.073295000000000110e+00 -3.528125381469726562e+01 -1.073300000000000143e+00 -3.528125381469726562e+01 -1.073305000000000176e+00 -3.531250000000000000e+01 -1.073309999999999986e+00 -3.528125381469726562e+01 -1.073315000000000019e+00 -3.531250000000000000e+01 -1.073320000000000052e+00 -3.531250000000000000e+01 -1.073325000000000085e+00 -3.534375000000000000e+01 -1.073330000000000117e+00 -3.528125381469726562e+01 -1.073335000000000150e+00 -3.534375000000000000e+01 -1.073340000000000183e+00 -3.534375000000000000e+01 -1.073344999999999994e+00 -3.531250000000000000e+01 -1.073350000000000026e+00 -3.534375000000000000e+01 -1.073355000000000059e+00 -3.537500000000000000e+01 -1.073360000000000092e+00 -3.534375000000000000e+01 -1.073365000000000125e+00 -3.534375000000000000e+01 -1.073370000000000157e+00 -3.543750381469726562e+01 -1.073375000000000190e+00 -3.534375000000000000e+01 -1.073380000000000001e+00 -3.531250000000000000e+01 -1.073385000000000034e+00 -3.537500000000000000e+01 -1.073390000000000066e+00 -3.543750381469726562e+01 -1.073395000000000099e+00 -3.534375000000000000e+01 -1.073400000000000132e+00 -3.531250000000000000e+01 -1.073405000000000165e+00 -3.540625000000000000e+01 -1.073410000000000197e+00 -3.540625000000000000e+01 -1.073415000000000008e+00 -3.534375000000000000e+01 -1.073420000000000041e+00 -3.534375000000000000e+01 -1.073425000000000074e+00 -3.534375000000000000e+01 -1.073430000000000106e+00 -3.531250000000000000e+01 -1.073435000000000139e+00 -3.540625000000000000e+01 -1.073440000000000172e+00 -3.534375000000000000e+01 -1.073444999999999983e+00 -3.531250000000000000e+01 -1.073450000000000015e+00 -3.531250000000000000e+01 -1.073455000000000048e+00 -3.531250000000000000e+01 -1.073460000000000081e+00 -3.534375000000000000e+01 -1.073465000000000114e+00 -3.531250000000000000e+01 -1.073470000000000146e+00 -3.534375000000000000e+01 -1.073475000000000179e+00 -3.528125381469726562e+01 -1.073479999999999990e+00 -3.531250000000000000e+01 -1.073485000000000023e+00 -3.528125381469726562e+01 -1.073490000000000055e+00 -3.528125381469726562e+01 -1.073495000000000088e+00 -3.537500000000000000e+01 -1.073500000000000121e+00 -3.525000000000000000e+01 -1.073505000000000154e+00 -3.531250000000000000e+01 -1.073510000000000186e+00 -3.534375000000000000e+01 -1.073514999999999997e+00 -3.534375000000000000e+01 -1.073520000000000030e+00 -3.531250000000000000e+01 -1.073525000000000063e+00 -3.534375000000000000e+01 -1.073530000000000095e+00 -3.537500000000000000e+01 -1.073535000000000128e+00 -3.534375000000000000e+01 -1.073540000000000161e+00 -3.531250000000000000e+01 -1.073545000000000194e+00 -3.531250000000000000e+01 -1.073550000000000004e+00 -3.534375000000000000e+01 -1.073555000000000037e+00 -3.528125381469726562e+01 -1.073560000000000070e+00 -3.528125381469726562e+01 -1.073565000000000103e+00 -3.525000000000000000e+01 -1.073570000000000135e+00 -3.531250000000000000e+01 -1.073575000000000168e+00 -3.534375000000000000e+01 -1.073579999999999979e+00 -3.534375000000000000e+01 -1.073585000000000012e+00 -3.528125381469726562e+01 -1.073590000000000044e+00 -3.537500000000000000e+01 -1.073595000000000077e+00 -3.534375000000000000e+01 -1.073600000000000110e+00 -3.531250000000000000e+01 -1.073605000000000143e+00 -3.537500000000000000e+01 -1.073610000000000175e+00 -3.528125381469726562e+01 -1.073614999999999986e+00 -3.531250000000000000e+01 -1.073620000000000019e+00 -3.534375000000000000e+01 -1.073625000000000052e+00 -3.534375000000000000e+01 -1.073630000000000084e+00 -3.531250000000000000e+01 -1.073635000000000117e+00 -3.531250000000000000e+01 -1.073640000000000150e+00 -3.528125381469726562e+01 -1.073645000000000183e+00 -3.528125381469726562e+01 -1.073649999999999993e+00 -3.534375000000000000e+01 -1.073655000000000026e+00 -3.537500000000000000e+01 -1.073660000000000059e+00 -3.528125381469726562e+01 -1.073665000000000092e+00 -3.528125381469726562e+01 -1.073670000000000124e+00 -3.531250000000000000e+01 -1.073675000000000157e+00 -3.531250000000000000e+01 -1.073680000000000190e+00 -3.531250000000000000e+01 -1.073685000000000000e+00 -3.528125381469726562e+01 -1.073690000000000033e+00 -3.531250000000000000e+01 -1.073695000000000066e+00 -3.531250000000000000e+01 -1.073700000000000099e+00 -3.528125381469726562e+01 -1.073705000000000132e+00 -3.528125381469726562e+01 -1.073710000000000164e+00 -3.528125381469726562e+01 -1.073715000000000197e+00 -3.531250000000000000e+01 -1.073720000000000008e+00 -3.528125381469726562e+01 -1.073725000000000041e+00 -3.528125381469726562e+01 -1.073730000000000073e+00 -3.525000000000000000e+01 -1.073735000000000106e+00 -3.528125381469726562e+01 -1.073740000000000139e+00 -3.525000000000000000e+01 -1.073745000000000172e+00 -3.525000000000000000e+01 -1.073749999999999982e+00 -3.525000000000000000e+01 -1.073755000000000015e+00 -3.521875000000000000e+01 -1.073760000000000048e+00 -3.518750000000000000e+01 -1.073765000000000081e+00 -3.515625000000000000e+01 -1.073770000000000113e+00 -3.521875000000000000e+01 -1.073775000000000146e+00 -3.521875000000000000e+01 -1.073780000000000179e+00 -3.518750000000000000e+01 -1.073784999999999989e+00 -3.515625000000000000e+01 -1.073790000000000022e+00 -3.518750000000000000e+01 -1.073795000000000055e+00 -3.521875000000000000e+01 -1.073800000000000088e+00 -3.518750000000000000e+01 -1.073805000000000121e+00 -3.512500381469726562e+01 -1.073810000000000153e+00 -3.518750000000000000e+01 -1.073815000000000186e+00 -3.515625000000000000e+01 -1.073819999999999997e+00 -3.518750000000000000e+01 -1.073825000000000029e+00 -3.518750000000000000e+01 -1.073830000000000062e+00 -3.521875000000000000e+01 -1.073835000000000095e+00 -3.515625000000000000e+01 -1.073840000000000128e+00 -3.518750000000000000e+01 -1.073845000000000161e+00 -3.521875000000000000e+01 -1.073850000000000193e+00 -3.518750000000000000e+01 -1.073855000000000004e+00 -3.518750000000000000e+01 -1.073860000000000037e+00 -3.512500381469726562e+01 -1.073865000000000069e+00 -3.515625000000000000e+01 -1.073870000000000102e+00 -3.518750000000000000e+01 -1.073875000000000135e+00 -3.518750000000000000e+01 -1.073880000000000168e+00 -3.518750000000000000e+01 -1.073884999999999978e+00 -3.515625000000000000e+01 -1.073890000000000011e+00 -3.512500381469726562e+01 -1.073895000000000044e+00 -3.509375000000000000e+01 -1.073900000000000077e+00 -3.518750000000000000e+01 -1.073905000000000109e+00 -3.506250000000000000e+01 -1.073910000000000142e+00 -3.515625000000000000e+01 -1.073915000000000175e+00 -3.512500381469726562e+01 -1.073919999999999986e+00 -3.515625000000000000e+01 -1.073925000000000018e+00 -3.515625000000000000e+01 -1.073930000000000051e+00 -3.515625000000000000e+01 -1.073935000000000084e+00 -3.512500381469726562e+01 -1.073940000000000117e+00 -3.515625000000000000e+01 -1.073945000000000149e+00 -3.509375000000000000e+01 -1.073950000000000182e+00 -3.503125000000000000e+01 -1.073954999999999993e+00 -3.515625000000000000e+01 -1.073960000000000026e+00 -3.518750000000000000e+01 -1.073965000000000058e+00 -3.509375000000000000e+01 -1.073970000000000091e+00 -3.512500381469726562e+01 -1.073975000000000124e+00 -3.512500381469726562e+01 -1.073980000000000157e+00 -3.506250000000000000e+01 -1.073985000000000190e+00 -3.509375000000000000e+01 -1.073990000000000000e+00 -3.509375000000000000e+01 -1.073995000000000033e+00 -3.509375000000000000e+01 -1.074000000000000066e+00 -3.515625000000000000e+01 -1.074005000000000098e+00 -3.512500381469726562e+01 -1.074010000000000131e+00 -3.509375000000000000e+01 -1.074015000000000164e+00 -3.509375000000000000e+01 -1.074020000000000197e+00 -3.509375000000000000e+01 -1.074025000000000007e+00 -3.509375000000000000e+01 -1.074030000000000040e+00 -3.506250000000000000e+01 -1.074035000000000073e+00 -3.512500381469726562e+01 -1.074040000000000106e+00 -3.506250000000000000e+01 -1.074045000000000138e+00 -3.503125000000000000e+01 -1.074050000000000171e+00 -3.509375000000000000e+01 -1.074054999999999982e+00 -3.509375000000000000e+01 -1.074060000000000015e+00 -3.506250000000000000e+01 -1.074065000000000047e+00 -3.509375000000000000e+01 -1.074070000000000080e+00 -3.500000000000000000e+01 -1.074075000000000113e+00 -3.509375000000000000e+01 -1.074080000000000146e+00 -3.506250000000000000e+01 -1.074085000000000178e+00 -3.512500381469726562e+01 -1.074089999999999989e+00 -3.509375000000000000e+01 -1.074095000000000022e+00 -3.506250000000000000e+01 -1.074100000000000055e+00 -3.509375000000000000e+01 -1.074105000000000087e+00 -3.506250000000000000e+01 -1.074110000000000120e+00 -3.515625000000000000e+01 -1.074115000000000153e+00 -3.506250000000000000e+01 -1.074120000000000186e+00 -3.506250000000000000e+01 -1.074124999999999996e+00 -3.503125000000000000e+01 -1.074130000000000029e+00 -3.506250000000000000e+01 -1.074135000000000062e+00 -3.506250000000000000e+01 -1.074140000000000095e+00 -3.503125000000000000e+01 -1.074145000000000127e+00 -3.509375000000000000e+01 -1.074150000000000160e+00 -3.500000000000000000e+01 -1.074155000000000193e+00 -3.509375000000000000e+01 -1.074160000000000004e+00 -3.503125000000000000e+01 -1.074165000000000036e+00 -3.500000000000000000e+01 -1.074170000000000069e+00 -3.503125000000000000e+01 -1.074175000000000102e+00 -3.509375000000000000e+01 -1.074180000000000135e+00 -3.503125000000000000e+01 -1.074185000000000167e+00 -3.500000000000000000e+01 -1.074189999999999978e+00 -3.503125000000000000e+01 -1.074195000000000011e+00 -3.500000000000000000e+01 -1.074200000000000044e+00 -3.503125000000000000e+01 -1.074205000000000076e+00 -3.506250000000000000e+01 -1.074210000000000109e+00 -3.500000000000000000e+01 -1.074215000000000142e+00 -3.506250000000000000e+01 -1.074220000000000175e+00 -3.500000000000000000e+01 -1.074224999999999985e+00 -3.496875381469726562e+01 -1.074230000000000018e+00 -3.503125000000000000e+01 -1.074235000000000051e+00 -3.503125000000000000e+01 -1.074240000000000084e+00 -3.500000000000000000e+01 -1.074245000000000116e+00 -3.500000000000000000e+01 -1.074250000000000149e+00 -3.500000000000000000e+01 -1.074255000000000182e+00 -3.503125000000000000e+01 -1.074259999999999993e+00 -3.500000000000000000e+01 -1.074265000000000025e+00 -3.500000000000000000e+01 -1.074270000000000058e+00 -3.500000000000000000e+01 -1.074275000000000091e+00 -3.500000000000000000e+01 -1.074280000000000124e+00 -3.500000000000000000e+01 -1.074285000000000156e+00 -3.500000000000000000e+01 -1.074290000000000189e+00 -3.493750000000000000e+01 -1.074295000000000000e+00 -3.496875381469726562e+01 -1.074300000000000033e+00 -3.490625000000000000e+01 -1.074305000000000065e+00 -3.493750000000000000e+01 -1.074310000000000098e+00 -3.500000000000000000e+01 -1.074315000000000131e+00 -3.493750000000000000e+01 -1.074320000000000164e+00 -3.496875381469726562e+01 -1.074325000000000196e+00 -3.500000000000000000e+01 -1.074330000000000007e+00 -3.500000000000000000e+01 -1.074335000000000040e+00 -3.500000000000000000e+01 -1.074340000000000073e+00 -3.500000000000000000e+01 -1.074345000000000105e+00 -3.487500000000000000e+01 -1.074350000000000138e+00 -3.493750000000000000e+01 -1.074355000000000171e+00 -3.493750000000000000e+01 -1.074359999999999982e+00 -3.500000000000000000e+01 -1.074365000000000014e+00 -3.496875381469726562e+01 -1.074370000000000047e+00 -3.493750000000000000e+01 -1.074375000000000080e+00 -3.496875381469726562e+01 -1.074380000000000113e+00 -3.493750000000000000e+01 -1.074385000000000145e+00 -3.500000000000000000e+01 -1.074390000000000178e+00 -3.490625000000000000e+01 -1.074394999999999989e+00 -3.487500000000000000e+01 -1.074400000000000022e+00 -3.487500000000000000e+01 -1.074405000000000054e+00 -3.490625000000000000e+01 -1.074410000000000087e+00 -3.493750000000000000e+01 -1.074415000000000120e+00 -3.493750000000000000e+01 -1.074420000000000153e+00 -3.490625000000000000e+01 -1.074425000000000185e+00 -3.487500000000000000e+01 -1.074429999999999996e+00 -3.487500000000000000e+01 -1.074435000000000029e+00 -3.487500000000000000e+01 -1.074440000000000062e+00 -3.490625000000000000e+01 -1.074445000000000094e+00 -3.484375000000000000e+01 -1.074450000000000127e+00 -3.487500000000000000e+01 -1.074455000000000160e+00 -3.490625000000000000e+01 -1.074460000000000193e+00 -3.490625000000000000e+01 -1.074465000000000003e+00 -3.487500000000000000e+01 -1.074470000000000036e+00 -3.487500000000000000e+01 -1.074475000000000069e+00 -3.487500000000000000e+01 -1.074480000000000102e+00 -3.487500000000000000e+01 -1.074485000000000134e+00 -3.487500000000000000e+01 -1.074490000000000167e+00 -3.490625000000000000e+01 -1.074494999999999978e+00 -3.484375000000000000e+01 -1.074500000000000011e+00 -3.484375000000000000e+01 -1.074505000000000043e+00 -3.487500000000000000e+01 -1.074510000000000076e+00 -3.490625000000000000e+01 -1.074515000000000109e+00 -3.487500000000000000e+01 -1.074520000000000142e+00 -3.496875381469726562e+01 -1.074525000000000174e+00 -3.487500000000000000e+01 -1.074529999999999985e+00 -3.490625000000000000e+01 -1.074535000000000018e+00 -3.490625000000000000e+01 -1.074540000000000051e+00 -3.481250381469726562e+01 -1.074545000000000083e+00 -3.484375000000000000e+01 -1.074550000000000116e+00 -3.490625000000000000e+01 -1.074555000000000149e+00 -3.484375000000000000e+01 -1.074560000000000182e+00 -3.484375000000000000e+01 -1.074564999999999992e+00 -3.481250381469726562e+01 -1.074570000000000025e+00 -3.481250381469726562e+01 -1.074575000000000058e+00 -3.478125000000000000e+01 -1.074580000000000091e+00 -3.478125000000000000e+01 -1.074585000000000123e+00 -3.481250381469726562e+01 -1.074590000000000156e+00 -3.484375000000000000e+01 -1.074595000000000189e+00 -3.484375000000000000e+01 -1.074600000000000000e+00 -3.484375000000000000e+01 -1.074605000000000032e+00 -3.481250381469726562e+01 -1.074610000000000065e+00 -3.484375000000000000e+01 -1.074615000000000098e+00 -3.478125000000000000e+01 -1.074620000000000131e+00 -3.478125000000000000e+01 -1.074625000000000163e+00 -3.484375000000000000e+01 -1.074630000000000196e+00 -3.475000000000000000e+01 -1.074635000000000007e+00 -3.478125000000000000e+01 -1.074640000000000040e+00 -3.478125000000000000e+01 -1.074645000000000072e+00 -3.475000000000000000e+01 -1.074650000000000105e+00 -3.475000000000000000e+01 -1.074655000000000138e+00 -3.471875000000000000e+01 -1.074660000000000171e+00 -3.475000000000000000e+01 -1.074664999999999981e+00 -3.487500000000000000e+01 -1.074670000000000014e+00 -3.475000000000000000e+01 -1.074675000000000047e+00 -3.475000000000000000e+01 -1.074680000000000080e+00 -3.475000000000000000e+01 -1.074685000000000112e+00 -3.471875000000000000e+01 -1.074690000000000145e+00 -3.475000000000000000e+01 -1.074695000000000178e+00 -3.478125000000000000e+01 -1.074699999999999989e+00 -3.471875000000000000e+01 -1.074705000000000021e+00 -3.465625000000000000e+01 -1.074710000000000054e+00 -3.471875000000000000e+01 -1.074715000000000087e+00 -3.465625000000000000e+01 -1.074720000000000120e+00 -3.468750000000000000e+01 -1.074725000000000152e+00 -3.468750000000000000e+01 -1.074730000000000185e+00 -3.471875000000000000e+01 -1.074734999999999996e+00 -3.468750000000000000e+01 -1.074740000000000029e+00 -3.468750000000000000e+01 -1.074745000000000061e+00 -3.471875000000000000e+01 -1.074750000000000094e+00 -3.462500000000000000e+01 -1.074755000000000127e+00 -3.471875000000000000e+01 -1.074760000000000160e+00 -3.471875000000000000e+01 -1.074765000000000192e+00 -3.468750000000000000e+01 -1.074770000000000003e+00 -3.465625000000000000e+01 -1.074775000000000036e+00 -3.468750000000000000e+01 -1.074780000000000069e+00 -3.465625000000000000e+01 -1.074785000000000101e+00 -3.462500000000000000e+01 -1.074790000000000134e+00 -3.471875000000000000e+01 -1.074795000000000167e+00 -3.465625000000000000e+01 -1.074799999999999978e+00 -3.465625000000000000e+01 -1.074805000000000010e+00 -3.462500000000000000e+01 -1.074810000000000043e+00 -3.465625000000000000e+01 -1.074815000000000076e+00 -3.465625000000000000e+01 -1.074820000000000109e+00 -3.465625000000000000e+01 -1.074825000000000141e+00 -3.468750000000000000e+01 -1.074830000000000174e+00 -3.471875000000000000e+01 -1.074834999999999985e+00 -3.475000000000000000e+01 -1.074840000000000018e+00 -3.468750000000000000e+01 -1.074845000000000050e+00 -3.468750000000000000e+01 -1.074850000000000083e+00 -3.465625000000000000e+01 -1.074855000000000116e+00 -3.468750000000000000e+01 -1.074860000000000149e+00 -3.465625000000000000e+01 -1.074865000000000181e+00 -3.465625000000000000e+01 -1.074869999999999992e+00 -3.468750000000000000e+01 -1.074875000000000025e+00 -3.465625000000000000e+01 -1.074880000000000058e+00 -3.459375000000000000e+01 -1.074885000000000090e+00 -3.471875000000000000e+01 -1.074890000000000123e+00 -3.462500000000000000e+01 -1.074895000000000156e+00 -3.462500000000000000e+01 -1.074900000000000189e+00 -3.465625000000000000e+01 -1.074904999999999999e+00 -3.462500000000000000e+01 -1.074910000000000032e+00 -3.456250381469726562e+01 -1.074915000000000065e+00 -3.459375000000000000e+01 -1.074920000000000098e+00 -3.459375000000000000e+01 -1.074925000000000130e+00 -3.453125000000000000e+01 -1.074930000000000163e+00 -3.453125000000000000e+01 -1.074935000000000196e+00 -3.459375000000000000e+01 -1.074940000000000007e+00 -3.456250381469726562e+01 -1.074945000000000039e+00 -3.462500000000000000e+01 -1.074950000000000072e+00 -3.456250381469726562e+01 -1.074955000000000105e+00 -3.459375000000000000e+01 -1.074960000000000138e+00 -3.453125000000000000e+01 -1.074965000000000170e+00 -3.456250381469726562e+01 -1.074969999999999981e+00 -3.459375000000000000e+01 -1.074975000000000014e+00 -3.453125000000000000e+01 -1.074980000000000047e+00 -3.459375000000000000e+01 -1.074985000000000079e+00 -3.459375000000000000e+01 -1.074990000000000112e+00 -3.453125000000000000e+01 -1.074995000000000145e+00 -3.453125000000000000e+01 -1.075000000000000178e+00 -3.453125000000000000e+01 -1.075004999999999988e+00 -3.453125000000000000e+01 -1.075010000000000021e+00 -3.453125000000000000e+01 -1.075015000000000054e+00 -3.453125000000000000e+01 -1.075020000000000087e+00 -3.453125000000000000e+01 -1.075025000000000119e+00 -3.450000000000000000e+01 -1.075030000000000152e+00 -3.446875000000000000e+01 -1.075035000000000185e+00 -3.443750000000000000e+01 -1.075039999999999996e+00 -3.446875000000000000e+01 -1.075045000000000028e+00 -3.446875000000000000e+01 -1.075050000000000061e+00 -3.450000000000000000e+01 -1.075055000000000094e+00 -3.443750000000000000e+01 -1.075060000000000127e+00 -3.443750000000000000e+01 -1.075065000000000159e+00 -3.443750000000000000e+01 -1.075070000000000192e+00 -3.446875000000000000e+01 -1.075075000000000003e+00 -3.440625381469726562e+01 -1.075080000000000036e+00 -3.446875000000000000e+01 -1.075085000000000068e+00 -3.443750000000000000e+01 -1.075090000000000101e+00 -3.443750000000000000e+01 -1.075095000000000134e+00 -3.446875000000000000e+01 -1.075100000000000167e+00 -3.443750000000000000e+01 -1.075104999999999977e+00 -3.446875000000000000e+01 -1.075110000000000010e+00 -3.437500000000000000e+01 -1.075115000000000043e+00 -3.434375000000000000e+01 -1.075120000000000076e+00 -3.440625381469726562e+01 -1.075125000000000108e+00 -3.437500000000000000e+01 -1.075130000000000141e+00 -3.443750000000000000e+01 -1.075135000000000174e+00 -3.437500000000000000e+01 -1.075139999999999985e+00 -3.443750000000000000e+01 -1.075145000000000017e+00 -3.440625381469726562e+01 -1.075150000000000050e+00 -3.443750000000000000e+01 -1.075155000000000083e+00 -3.443750000000000000e+01 -1.075160000000000116e+00 -3.446875000000000000e+01 -1.075165000000000148e+00 -3.440625381469726562e+01 -1.075170000000000181e+00 -3.440625381469726562e+01 -1.075174999999999992e+00 -3.440625381469726562e+01 -1.075180000000000025e+00 -3.434375000000000000e+01 -1.075185000000000057e+00 -3.437500000000000000e+01 -1.075190000000000090e+00 -3.437500000000000000e+01 -1.075195000000000123e+00 -3.440625381469726562e+01 -1.075200000000000156e+00 -3.437500000000000000e+01 -1.075205000000000188e+00 -3.443750000000000000e+01 -1.075209999999999999e+00 -3.437500000000000000e+01 -1.075215000000000032e+00 -3.443750000000000000e+01 -1.075220000000000065e+00 -3.443750000000000000e+01 -1.075225000000000097e+00 -3.437500000000000000e+01 -1.075230000000000130e+00 -3.440625381469726562e+01 -1.075235000000000163e+00 -3.440625381469726562e+01 -1.075240000000000196e+00 -3.437500000000000000e+01 -1.075245000000000006e+00 -3.434375000000000000e+01 -1.075250000000000039e+00 -3.434375000000000000e+01 -1.075255000000000072e+00 -3.437500000000000000e+01 -1.075260000000000105e+00 -3.434375000000000000e+01 -1.075265000000000137e+00 -3.437500000000000000e+01 -1.075270000000000170e+00 -3.431250000000000000e+01 -1.075274999999999981e+00 -3.431250000000000000e+01 -1.075280000000000014e+00 -3.434375000000000000e+01 -1.075285000000000046e+00 -3.434375000000000000e+01 -1.075290000000000079e+00 -3.434375000000000000e+01 -1.075295000000000112e+00 -3.434375000000000000e+01 -1.075300000000000145e+00 -3.431250000000000000e+01 -1.075305000000000177e+00 -3.434375000000000000e+01 -1.075309999999999988e+00 -3.434375000000000000e+01 -1.075315000000000021e+00 -3.428125000000000000e+01 -1.075320000000000054e+00 -3.431250000000000000e+01 -1.075325000000000086e+00 -3.434375000000000000e+01 -1.075330000000000119e+00 -3.425000381469726562e+01 -1.075335000000000152e+00 -3.428125000000000000e+01 -1.075340000000000185e+00 -3.434375000000000000e+01 -1.075344999999999995e+00 -3.434375000000000000e+01 -1.075350000000000028e+00 -3.431250000000000000e+01 -1.075355000000000061e+00 -3.431250000000000000e+01 -1.075360000000000094e+00 -3.437500000000000000e+01 -1.075365000000000126e+00 -3.434375000000000000e+01 -1.075370000000000159e+00 -3.434375000000000000e+01 -1.075375000000000192e+00 -3.434375000000000000e+01 -1.075380000000000003e+00 -3.434375000000000000e+01 -1.075385000000000035e+00 -3.434375000000000000e+01 -1.075390000000000068e+00 -3.428125000000000000e+01 -1.075395000000000101e+00 -3.431250000000000000e+01 -1.075400000000000134e+00 -3.434375000000000000e+01 -1.075405000000000166e+00 -3.428125000000000000e+01 -1.075409999999999977e+00 -3.431250000000000000e+01 -1.075415000000000010e+00 -3.434375000000000000e+01 -1.075420000000000043e+00 -3.431250000000000000e+01 -1.075425000000000075e+00 -3.431250000000000000e+01 -1.075430000000000108e+00 -3.434375000000000000e+01 -1.075435000000000141e+00 -3.431250000000000000e+01 -1.075440000000000174e+00 -3.431250000000000000e+01 -1.075444999999999984e+00 -3.428125000000000000e+01 -1.075450000000000017e+00 -3.431250000000000000e+01 -1.075455000000000050e+00 -3.428125000000000000e+01 -1.075460000000000083e+00 -3.428125000000000000e+01 -1.075465000000000115e+00 -3.428125000000000000e+01 -1.075470000000000148e+00 -3.428125000000000000e+01 -1.075475000000000181e+00 -3.418750000000000000e+01 -1.075479999999999992e+00 -3.431250000000000000e+01 -1.075485000000000024e+00 -3.428125000000000000e+01 -1.075490000000000057e+00 -3.428125000000000000e+01 -1.075495000000000090e+00 -3.428125000000000000e+01 -1.075500000000000123e+00 -3.425000381469726562e+01 -1.075505000000000155e+00 -3.425000381469726562e+01 -1.075510000000000188e+00 -3.428125000000000000e+01 -1.075514999999999999e+00 -3.428125000000000000e+01 -1.075520000000000032e+00 -3.428125000000000000e+01 -1.075525000000000064e+00 -3.428125000000000000e+01 -1.075530000000000097e+00 -3.428125000000000000e+01 -1.075535000000000130e+00 -3.428125000000000000e+01 -1.075540000000000163e+00 -3.421875000000000000e+01 -1.075545000000000195e+00 -3.431250000000000000e+01 -1.075550000000000006e+00 -3.418750000000000000e+01 -1.075555000000000039e+00 -3.421875000000000000e+01 -1.075560000000000072e+00 -3.428125000000000000e+01 -1.075565000000000104e+00 -3.421875000000000000e+01 -1.075570000000000137e+00 -3.431250000000000000e+01 -1.075575000000000170e+00 -3.418750000000000000e+01 -1.075579999999999981e+00 -3.428125000000000000e+01 -1.075585000000000013e+00 -3.425000381469726562e+01 -1.075590000000000046e+00 -3.421875000000000000e+01 -1.075595000000000079e+00 -3.421875000000000000e+01 -1.075600000000000112e+00 -3.418750000000000000e+01 -1.075605000000000144e+00 -3.425000381469726562e+01 -1.075610000000000177e+00 -3.425000381469726562e+01 -1.075614999999999988e+00 -3.421875000000000000e+01 -1.075620000000000021e+00 -3.425000381469726562e+01 -1.075625000000000053e+00 -3.428125000000000000e+01 -1.075630000000000086e+00 -3.428125000000000000e+01 -1.075635000000000119e+00 -3.428125000000000000e+01 -1.075640000000000152e+00 -3.428125000000000000e+01 -1.075645000000000184e+00 -3.431250000000000000e+01 -1.075649999999999995e+00 -3.428125000000000000e+01 -1.075655000000000028e+00 -3.418750000000000000e+01 -1.075660000000000061e+00 -3.421875000000000000e+01 -1.075665000000000093e+00 -3.425000381469726562e+01 -1.075670000000000126e+00 -3.418750000000000000e+01 -1.075675000000000159e+00 -3.421875000000000000e+01 -1.075680000000000192e+00 -3.421875000000000000e+01 -1.075685000000000002e+00 -3.425000381469726562e+01 -1.075690000000000035e+00 -3.418750000000000000e+01 -1.075695000000000068e+00 -3.425000381469726562e+01 -1.075700000000000101e+00 -3.418750000000000000e+01 -1.075705000000000133e+00 -3.418750000000000000e+01 -1.075710000000000166e+00 -3.421875000000000000e+01 -1.075715000000000199e+00 -3.425000381469726562e+01 -1.075720000000000010e+00 -3.418750000000000000e+01 -1.075725000000000042e+00 -3.415625000000000000e+01 -1.075730000000000075e+00 -3.421875000000000000e+01 -1.075735000000000108e+00 -3.421875000000000000e+01 -1.075740000000000141e+00 -3.418750000000000000e+01 -1.075745000000000173e+00 -3.418750000000000000e+01 -1.075749999999999984e+00 -3.421875000000000000e+01 -1.075755000000000017e+00 -3.412500000000000000e+01 -1.075760000000000050e+00 -3.428125000000000000e+01 -1.075765000000000082e+00 -3.421875000000000000e+01 -1.075770000000000115e+00 -3.421875000000000000e+01 -1.075775000000000148e+00 -3.415625000000000000e+01 -1.075780000000000181e+00 -3.421875000000000000e+01 -1.075784999999999991e+00 -3.418750000000000000e+01 -1.075790000000000024e+00 -3.418750000000000000e+01 -1.075795000000000057e+00 -3.415625000000000000e+01 -1.075800000000000090e+00 -3.415625000000000000e+01 -1.075805000000000122e+00 -3.415625000000000000e+01 -1.075810000000000155e+00 -3.409375381469726562e+01 -1.075815000000000188e+00 -3.409375381469726562e+01 -1.075819999999999999e+00 -3.418750000000000000e+01 -1.075825000000000031e+00 -3.409375381469726562e+01 -1.075830000000000064e+00 -3.409375381469726562e+01 -1.075835000000000097e+00 -3.406250000000000000e+01 -1.075840000000000130e+00 -3.409375381469726562e+01 -1.075845000000000162e+00 -3.412500000000000000e+01 -1.075850000000000195e+00 -3.409375381469726562e+01 -1.075855000000000006e+00 -3.415625000000000000e+01 -1.075860000000000039e+00 -3.406250000000000000e+01 -1.075865000000000071e+00 -3.403125000000000000e+01 -1.075870000000000104e+00 -3.412500000000000000e+01 -1.075875000000000137e+00 -3.406250000000000000e+01 -1.075880000000000170e+00 -3.412500000000000000e+01 -1.075884999999999980e+00 -3.409375381469726562e+01 -1.075890000000000013e+00 -3.406250000000000000e+01 -1.075895000000000046e+00 -3.406250000000000000e+01 -1.075900000000000079e+00 -3.412500000000000000e+01 -1.075905000000000111e+00 -3.409375381469726562e+01 -1.075910000000000144e+00 -3.409375381469726562e+01 -1.075915000000000177e+00 -3.406250000000000000e+01 -1.075919999999999987e+00 -3.409375381469726562e+01 -1.075925000000000020e+00 -3.403125000000000000e+01 -1.075930000000000053e+00 -3.406250000000000000e+01 -1.075935000000000086e+00 -3.403125000000000000e+01 -1.075940000000000119e+00 -3.406250000000000000e+01 -1.075945000000000151e+00 -3.400000000000000000e+01 -1.075950000000000184e+00 -3.409375381469726562e+01 -1.075954999999999995e+00 -3.403125000000000000e+01 -1.075960000000000027e+00 -3.409375381469726562e+01 -1.075965000000000060e+00 -3.409375381469726562e+01 -1.075970000000000093e+00 -3.406250000000000000e+01 -1.075975000000000126e+00 -3.409375381469726562e+01 -1.075980000000000159e+00 -3.403125000000000000e+01 -1.075985000000000191e+00 -3.409375381469726562e+01 -1.075990000000000002e+00 -3.406250000000000000e+01 -1.075995000000000035e+00 -3.403125000000000000e+01 -1.076000000000000068e+00 -3.406250000000000000e+01 -1.076005000000000100e+00 -3.396875000000000000e+01 -1.076010000000000133e+00 -3.403125000000000000e+01 -1.076015000000000166e+00 -3.400000000000000000e+01 -1.076020000000000199e+00 -3.400000000000000000e+01 -1.076025000000000009e+00 -3.403125000000000000e+01 -1.076030000000000042e+00 -3.396875000000000000e+01 -1.076035000000000075e+00 -3.403125000000000000e+01 -1.076040000000000108e+00 -3.403125000000000000e+01 -1.076045000000000140e+00 -3.403125000000000000e+01 -1.076050000000000173e+00 -3.406250000000000000e+01 -1.076054999999999984e+00 -3.403125000000000000e+01 -1.076060000000000016e+00 -3.400000000000000000e+01 -1.076065000000000049e+00 -3.400000000000000000e+01 -1.076070000000000082e+00 -3.400000000000000000e+01 -1.076075000000000115e+00 -3.393750000000000000e+01 -1.076080000000000148e+00 -3.403125000000000000e+01 -1.076085000000000180e+00 -3.400000000000000000e+01 -1.076089999999999991e+00 -3.400000000000000000e+01 -1.076095000000000024e+00 -3.400000000000000000e+01 -1.076100000000000056e+00 -3.400000000000000000e+01 -1.076105000000000089e+00 -3.396875000000000000e+01 -1.076110000000000122e+00 -3.400000000000000000e+01 -1.076115000000000155e+00 -3.396875000000000000e+01 -1.076120000000000188e+00 -3.390625000000000000e+01 -1.076124999999999998e+00 -3.390625000000000000e+01 -1.076130000000000031e+00 -3.393750000000000000e+01 -1.076135000000000064e+00 -3.393750000000000000e+01 -1.076140000000000096e+00 -3.400000000000000000e+01 -1.076145000000000129e+00 -3.403125000000000000e+01 -1.076150000000000162e+00 -3.400000000000000000e+01 -1.076155000000000195e+00 -3.393750000000000000e+01 -1.076160000000000005e+00 -3.403125000000000000e+01 -1.076165000000000038e+00 -3.400000000000000000e+01 -1.076170000000000071e+00 -3.400000000000000000e+01 -1.076175000000000104e+00 -3.393750000000000000e+01 -1.076180000000000136e+00 -3.396875000000000000e+01 -1.076185000000000169e+00 -3.393750000000000000e+01 -1.076189999999999980e+00 -3.396875000000000000e+01 -1.076195000000000013e+00 -3.393750000000000000e+01 -1.076200000000000045e+00 -3.393750000000000000e+01 -1.076205000000000078e+00 -3.393750000000000000e+01 -1.076210000000000111e+00 -3.396875000000000000e+01 -1.076215000000000144e+00 -3.393750000000000000e+01 -1.076220000000000176e+00 -3.390625000000000000e+01 -1.076224999999999987e+00 -3.403125000000000000e+01 -1.076230000000000020e+00 -3.396875000000000000e+01 -1.076235000000000053e+00 -3.393750000000000000e+01 -1.076240000000000085e+00 -3.390625000000000000e+01 -1.076245000000000118e+00 -3.390625000000000000e+01 -1.076250000000000151e+00 -3.393750000000000000e+01 -1.076255000000000184e+00 -3.390625000000000000e+01 -1.076259999999999994e+00 -3.393750000000000000e+01 -1.076265000000000027e+00 -3.393750000000000000e+01 -1.076270000000000060e+00 -3.387500000000000000e+01 -1.076275000000000093e+00 -3.393750000000000000e+01 -1.076280000000000125e+00 -3.396875000000000000e+01 -1.076285000000000158e+00 -3.387500000000000000e+01 -1.076290000000000191e+00 -3.393750000000000000e+01 -1.076295000000000002e+00 -3.381250000000000000e+01 -1.076300000000000034e+00 -3.387500000000000000e+01 -1.076305000000000067e+00 -3.387500000000000000e+01 -1.076310000000000100e+00 -3.387500000000000000e+01 -1.076315000000000133e+00 -3.381250000000000000e+01 -1.076320000000000165e+00 -3.390625000000000000e+01 -1.076325000000000198e+00 -3.390625000000000000e+01 -1.076330000000000009e+00 -3.384375381469726562e+01 -1.076335000000000042e+00 -3.390625000000000000e+01 -1.076340000000000074e+00 -3.378125000000000000e+01 -1.076345000000000107e+00 -3.378125000000000000e+01 -1.076350000000000140e+00 -3.390625000000000000e+01 -1.076355000000000173e+00 -3.381250000000000000e+01 -1.076359999999999983e+00 -3.378125000000000000e+01 -1.076365000000000016e+00 -3.381250000000000000e+01 -1.076370000000000049e+00 -3.378125000000000000e+01 -1.076375000000000082e+00 -3.378125000000000000e+01 -1.076380000000000114e+00 -3.381250000000000000e+01 -1.076385000000000147e+00 -3.381250000000000000e+01 -1.076390000000000180e+00 -3.384375381469726562e+01 -1.076394999999999991e+00 -3.381250000000000000e+01 -1.076400000000000023e+00 -3.378125000000000000e+01 -1.076405000000000056e+00 -3.384375381469726562e+01 -1.076410000000000089e+00 -3.378125000000000000e+01 -1.076415000000000122e+00 -3.381250000000000000e+01 -1.076420000000000154e+00 -3.378125000000000000e+01 -1.076425000000000187e+00 -3.371875000000000000e+01 -1.076429999999999998e+00 -3.378125000000000000e+01 -1.076435000000000031e+00 -3.375000000000000000e+01 -1.076440000000000063e+00 -3.371875000000000000e+01 -1.076445000000000096e+00 -3.378125000000000000e+01 -1.076450000000000129e+00 -3.375000000000000000e+01 -1.076455000000000162e+00 -3.368750381469726562e+01 -1.076460000000000194e+00 -3.371875000000000000e+01 -1.076465000000000005e+00 -3.378125000000000000e+01 -1.076470000000000038e+00 -3.375000000000000000e+01 -1.076475000000000071e+00 -3.371875000000000000e+01 -1.076480000000000103e+00 -3.378125000000000000e+01 -1.076485000000000136e+00 -3.378125000000000000e+01 -1.076490000000000169e+00 -3.375000000000000000e+01 -1.076494999999999980e+00 -3.378125000000000000e+01 -1.076500000000000012e+00 -3.365625000000000000e+01 -1.076505000000000045e+00 -3.378125000000000000e+01 -1.076510000000000078e+00 -3.375000000000000000e+01 -1.076515000000000111e+00 -3.375000000000000000e+01 -1.076520000000000143e+00 -3.378125000000000000e+01 -1.076525000000000176e+00 -3.378125000000000000e+01 -1.076529999999999987e+00 -3.371875000000000000e+01 -1.076535000000000020e+00 -3.378125000000000000e+01 -1.076540000000000052e+00 -3.375000000000000000e+01 -1.076545000000000085e+00 -3.371875000000000000e+01 -1.076550000000000118e+00 -3.375000000000000000e+01 -1.076555000000000151e+00 -3.375000000000000000e+01 -1.076560000000000183e+00 -3.371875000000000000e+01 -1.076564999999999994e+00 -3.375000000000000000e+01 -1.076570000000000027e+00 -3.371875000000000000e+01 -1.076575000000000060e+00 -3.368750381469726562e+01 -1.076580000000000092e+00 -3.362500000000000000e+01 -1.076585000000000125e+00 -3.371875000000000000e+01 -1.076590000000000158e+00 -3.365625000000000000e+01 -1.076595000000000191e+00 -3.365625000000000000e+01 -1.076600000000000001e+00 -3.365625000000000000e+01 -1.076605000000000034e+00 -3.368750381469726562e+01 -1.076610000000000067e+00 -3.365625000000000000e+01 -1.076615000000000100e+00 -3.368750381469726562e+01 -1.076620000000000132e+00 -3.359375000000000000e+01 -1.076625000000000165e+00 -3.365625000000000000e+01 -1.076630000000000198e+00 -3.365625000000000000e+01 -1.076635000000000009e+00 -3.368750381469726562e+01 -1.076640000000000041e+00 -3.362500000000000000e+01 -1.076645000000000074e+00 -3.365625000000000000e+01 -1.076650000000000107e+00 -3.359375000000000000e+01 -1.076655000000000140e+00 -3.362500000000000000e+01 -1.076660000000000172e+00 -3.362500000000000000e+01 -1.076664999999999983e+00 -3.365625000000000000e+01 -1.076670000000000016e+00 -3.362500000000000000e+01 -1.076675000000000049e+00 -3.362500000000000000e+01 -1.076680000000000081e+00 -3.365625000000000000e+01 -1.076685000000000114e+00 -3.365625000000000000e+01 -1.076690000000000147e+00 -3.365625000000000000e+01 -1.076695000000000180e+00 -3.365625000000000000e+01 -1.076699999999999990e+00 -3.362500000000000000e+01 -1.076705000000000023e+00 -3.362500000000000000e+01 -1.076710000000000056e+00 -3.356250000000000000e+01 -1.076715000000000089e+00 -3.365625000000000000e+01 -1.076720000000000121e+00 -3.356250000000000000e+01 -1.076725000000000154e+00 -3.356250000000000000e+01 -1.076730000000000187e+00 -3.362500000000000000e+01 -1.076734999999999998e+00 -3.362500000000000000e+01 -1.076740000000000030e+00 -3.362500000000000000e+01 -1.076745000000000063e+00 -3.359375000000000000e+01 -1.076750000000000096e+00 -3.359375000000000000e+01 -1.076755000000000129e+00 -3.353125381469726562e+01 -1.076760000000000161e+00 -3.359375000000000000e+01 -1.076765000000000194e+00 -3.356250000000000000e+01 -1.076770000000000005e+00 -3.362500000000000000e+01 -1.076775000000000038e+00 -3.365625000000000000e+01 -1.076780000000000070e+00 -3.356250000000000000e+01 -1.076785000000000103e+00 -3.359375000000000000e+01 -1.076790000000000136e+00 -3.356250000000000000e+01 -1.076795000000000169e+00 -3.353125381469726562e+01 -1.076799999999999979e+00 -3.353125381469726562e+01 -1.076805000000000012e+00 -3.359375000000000000e+01 -1.076810000000000045e+00 -3.356250000000000000e+01 -1.076815000000000078e+00 -3.359375000000000000e+01 -1.076820000000000110e+00 -3.356250000000000000e+01 -1.076825000000000143e+00 -3.353125381469726562e+01 -1.076830000000000176e+00 -3.359375000000000000e+01 -1.076834999999999987e+00 -3.365625000000000000e+01 -1.076840000000000019e+00 -3.359375000000000000e+01 -1.076845000000000052e+00 -3.353125381469726562e+01 -1.076850000000000085e+00 -3.350000000000000000e+01 -1.076855000000000118e+00 -3.359375000000000000e+01 -1.076860000000000150e+00 -3.356250000000000000e+01 -1.076865000000000183e+00 -3.353125381469726562e+01 -1.076869999999999994e+00 -3.356250000000000000e+01 -1.076875000000000027e+00 -3.350000000000000000e+01 -1.076880000000000059e+00 -3.350000000000000000e+01 -1.076885000000000092e+00 -3.350000000000000000e+01 -1.076890000000000125e+00 -3.353125381469726562e+01 -1.076895000000000158e+00 -3.353125381469726562e+01 -1.076900000000000190e+00 -3.353125381469726562e+01 -1.076905000000000001e+00 -3.353125381469726562e+01 -1.076910000000000034e+00 -3.353125381469726562e+01 -1.076915000000000067e+00 -3.356250000000000000e+01 -1.076920000000000099e+00 -3.346875000000000000e+01 -1.076925000000000132e+00 -3.353125381469726562e+01 -1.076930000000000165e+00 -3.353125381469726562e+01 -1.076935000000000198e+00 -3.350000000000000000e+01 -1.076940000000000008e+00 -3.353125381469726562e+01 -1.076945000000000041e+00 -3.350000000000000000e+01 -1.076950000000000074e+00 -3.353125381469726562e+01 -1.076955000000000107e+00 -3.343750000000000000e+01 -1.076960000000000139e+00 -3.350000000000000000e+01 -1.076965000000000172e+00 -3.350000000000000000e+01 -1.076969999999999983e+00 -3.350000000000000000e+01 -1.076975000000000016e+00 -3.353125381469726562e+01 -1.076980000000000048e+00 -3.353125381469726562e+01 -1.076985000000000081e+00 -3.350000000000000000e+01 -1.076990000000000114e+00 -3.353125381469726562e+01 -1.076995000000000147e+00 -3.350000000000000000e+01 -1.077000000000000179e+00 -3.350000000000000000e+01 -1.077004999999999990e+00 -3.346875000000000000e+01 -1.077010000000000023e+00 -3.350000000000000000e+01 -1.077015000000000056e+00 -3.350000000000000000e+01 -1.077020000000000088e+00 -3.353125381469726562e+01 -1.077025000000000121e+00 -3.350000000000000000e+01 -1.077030000000000154e+00 -3.353125381469726562e+01 -1.077035000000000187e+00 -3.350000000000000000e+01 -1.077039999999999997e+00 -3.343750000000000000e+01 -1.077045000000000030e+00 -3.353125381469726562e+01 -1.077050000000000063e+00 -3.346875000000000000e+01 -1.077055000000000096e+00 -3.343750000000000000e+01 -1.077060000000000128e+00 -3.353125381469726562e+01 -1.077065000000000161e+00 -3.346875000000000000e+01 -1.077070000000000194e+00 -3.353125381469726562e+01 -1.077075000000000005e+00 -3.346875000000000000e+01 -1.077080000000000037e+00 -3.346875000000000000e+01 -1.077085000000000070e+00 -3.346875000000000000e+01 -1.077090000000000103e+00 -3.350000000000000000e+01 -1.077095000000000136e+00 -3.346875000000000000e+01 -1.077100000000000168e+00 -3.346875000000000000e+01 -1.077104999999999979e+00 -3.346875000000000000e+01 -1.077110000000000012e+00 -3.343750000000000000e+01 -1.077115000000000045e+00 -3.343750000000000000e+01 -1.077120000000000077e+00 -3.340625000000000000e+01 -1.077125000000000110e+00 -3.346875000000000000e+01 -1.077130000000000143e+00 -3.334375000000000000e+01 -1.077135000000000176e+00 -3.337500381469726562e+01 -1.077139999999999986e+00 -3.340625000000000000e+01 -1.077145000000000019e+00 -3.343750000000000000e+01 -1.077150000000000052e+00 -3.346875000000000000e+01 -1.077155000000000085e+00 -3.334375000000000000e+01 -1.077160000000000117e+00 -3.340625000000000000e+01 -1.077165000000000150e+00 -3.340625000000000000e+01 -1.077170000000000183e+00 -3.343750000000000000e+01 -1.077174999999999994e+00 -3.331250000000000000e+01 -1.077180000000000026e+00 -3.337500381469726562e+01 -1.077185000000000059e+00 -3.337500381469726562e+01 -1.077190000000000092e+00 -3.334375000000000000e+01 -1.077195000000000125e+00 -3.334375000000000000e+01 -1.077200000000000157e+00 -3.343750000000000000e+01 -1.077205000000000190e+00 -3.334375000000000000e+01 -1.077210000000000001e+00 -3.340625000000000000e+01 -1.077215000000000034e+00 -3.337500381469726562e+01 -1.077220000000000066e+00 -3.334375000000000000e+01 -1.077225000000000099e+00 -3.334375000000000000e+01 -1.077230000000000132e+00 -3.334375000000000000e+01 -1.077235000000000165e+00 -3.334375000000000000e+01 -1.077240000000000197e+00 -3.328125000000000000e+01 -1.077245000000000008e+00 -3.334375000000000000e+01 -1.077250000000000041e+00 -3.334375000000000000e+01 -1.077255000000000074e+00 -3.331250000000000000e+01 -1.077260000000000106e+00 -3.331250000000000000e+01 -1.077265000000000139e+00 -3.334375000000000000e+01 -1.077270000000000172e+00 -3.334375000000000000e+01 -1.077274999999999983e+00 -3.331250000000000000e+01 -1.077280000000000015e+00 -3.325000000000000000e+01 -1.077285000000000048e+00 -3.334375000000000000e+01 -1.077290000000000081e+00 -3.337500381469726562e+01 -1.077295000000000114e+00 -3.331250000000000000e+01 -1.077300000000000146e+00 -3.331250000000000000e+01 -1.077305000000000179e+00 -3.331250000000000000e+01 -1.077309999999999990e+00 -3.328125000000000000e+01 -1.077315000000000023e+00 -3.328125000000000000e+01 -1.077320000000000055e+00 -3.334375000000000000e+01 -1.077325000000000088e+00 -3.328125000000000000e+01 -1.077330000000000121e+00 -3.321875381469726562e+01 -1.077335000000000154e+00 -3.328125000000000000e+01 -1.077340000000000186e+00 -3.328125000000000000e+01 -1.077344999999999997e+00 -3.328125000000000000e+01 -1.077350000000000030e+00 -3.321875381469726562e+01 -1.077355000000000063e+00 -3.328125000000000000e+01 -1.077360000000000095e+00 -3.328125000000000000e+01 -1.077365000000000128e+00 -3.321875381469726562e+01 -1.077370000000000161e+00 -3.321875381469726562e+01 -1.077375000000000194e+00 -3.325000000000000000e+01 -1.077380000000000004e+00 -3.325000000000000000e+01 -1.077385000000000037e+00 -3.325000000000000000e+01 -1.077390000000000070e+00 -3.321875381469726562e+01 -1.077395000000000103e+00 -3.325000000000000000e+01 -1.077400000000000135e+00 -3.318750000000000000e+01 -1.077405000000000168e+00 -3.328125000000000000e+01 -1.077409999999999979e+00 -3.321875381469726562e+01 -1.077415000000000012e+00 -3.321875381469726562e+01 -1.077420000000000044e+00 -3.318750000000000000e+01 -1.077425000000000077e+00 -3.321875381469726562e+01 -1.077430000000000110e+00 -3.315625000000000000e+01 -1.077435000000000143e+00 -3.315625000000000000e+01 -1.077440000000000175e+00 -3.321875381469726562e+01 -1.077444999999999986e+00 -3.321875381469726562e+01 -1.077450000000000019e+00 -3.321875381469726562e+01 -1.077455000000000052e+00 -3.315625000000000000e+01 -1.077460000000000084e+00 -3.321875381469726562e+01 -1.077465000000000117e+00 -3.315625000000000000e+01 -1.077470000000000150e+00 -3.321875381469726562e+01 -1.077475000000000183e+00 -3.315625000000000000e+01 -1.077479999999999993e+00 -3.318750000000000000e+01 -1.077485000000000026e+00 -3.318750000000000000e+01 -1.077490000000000059e+00 -3.312500381469726562e+01 -1.077495000000000092e+00 -3.318750000000000000e+01 -1.077500000000000124e+00 -3.321875381469726562e+01 -1.077505000000000157e+00 -3.321875381469726562e+01 -1.077510000000000190e+00 -3.315625000000000000e+01 -1.077515000000000001e+00 -3.318750000000000000e+01 -1.077520000000000033e+00 -3.321875381469726562e+01 -1.077525000000000066e+00 -3.325000000000000000e+01 -1.077530000000000099e+00 -3.321875381469726562e+01 -1.077535000000000132e+00 -3.318750000000000000e+01 -1.077540000000000164e+00 -3.315625000000000000e+01 -1.077545000000000197e+00 -3.315625000000000000e+01 -1.077550000000000008e+00 -3.315625000000000000e+01 -1.077555000000000041e+00 -3.318750000000000000e+01 -1.077560000000000073e+00 -3.315625000000000000e+01 -1.077565000000000106e+00 -3.312500381469726562e+01 -1.077570000000000139e+00 -3.318750000000000000e+01 -1.077575000000000172e+00 -3.309375000000000000e+01 -1.077579999999999982e+00 -3.318750000000000000e+01 -1.077585000000000015e+00 -3.315625000000000000e+01 -1.077590000000000048e+00 -3.312500381469726562e+01 -1.077595000000000081e+00 -3.315625000000000000e+01 -1.077600000000000113e+00 -3.312500381469726562e+01 -1.077605000000000146e+00 -3.309375000000000000e+01 -1.077610000000000179e+00 -3.312500381469726562e+01 -1.077614999999999990e+00 -3.306250000000000000e+01 -1.077620000000000022e+00 -3.306250000000000000e+01 -1.077625000000000055e+00 -3.303125000000000000e+01 -1.077630000000000088e+00 -3.306250000000000000e+01 -1.077635000000000121e+00 -3.312500381469726562e+01 -1.077640000000000153e+00 -3.306250000000000000e+01 -1.077645000000000186e+00 -3.306250000000000000e+01 -1.077649999999999997e+00 -3.312500381469726562e+01 -1.077655000000000030e+00 -3.315625000000000000e+01 -1.077660000000000062e+00 -3.309375000000000000e+01 -1.077665000000000095e+00 -3.309375000000000000e+01 -1.077670000000000128e+00 -3.309375000000000000e+01 -1.077675000000000161e+00 -3.315625000000000000e+01 -1.077680000000000193e+00 -3.309375000000000000e+01 -1.077685000000000004e+00 -3.309375000000000000e+01 -1.077690000000000037e+00 -3.306250000000000000e+01 -1.077695000000000070e+00 -3.306250000000000000e+01 -1.077700000000000102e+00 -3.306250000000000000e+01 -1.077705000000000135e+00 -3.306250000000000000e+01 -1.077710000000000168e+00 -3.312500381469726562e+01 -1.077714999999999979e+00 -3.306250000000000000e+01 -1.077720000000000011e+00 -3.309375000000000000e+01 -1.077725000000000044e+00 -3.303125000000000000e+01 -1.077730000000000077e+00 -3.303125000000000000e+01 -1.077735000000000110e+00 -3.309375000000000000e+01 -1.077740000000000142e+00 -3.309375000000000000e+01 -1.077745000000000175e+00 -3.303125000000000000e+01 -1.077749999999999986e+00 -3.309375000000000000e+01 -1.077755000000000019e+00 -3.303125000000000000e+01 -1.077760000000000051e+00 -3.309375000000000000e+01 -1.077765000000000084e+00 -3.300000000000000000e+01 -1.077770000000000117e+00 -3.303125000000000000e+01 -1.077775000000000150e+00 -3.300000000000000000e+01 -1.077780000000000182e+00 -3.296875381469726562e+01 -1.077784999999999993e+00 -3.300000000000000000e+01 -1.077790000000000026e+00 -3.303125000000000000e+01 -1.077795000000000059e+00 -3.303125000000000000e+01 -1.077800000000000091e+00 -3.303125000000000000e+01 -1.077805000000000124e+00 -3.300000000000000000e+01 -1.077810000000000157e+00 -3.300000000000000000e+01 -1.077815000000000190e+00 -3.293750000000000000e+01 -1.077820000000000000e+00 -3.300000000000000000e+01 -1.077825000000000033e+00 -3.300000000000000000e+01 -1.077830000000000066e+00 -3.293750000000000000e+01 -1.077835000000000099e+00 -3.300000000000000000e+01 -1.077840000000000131e+00 -3.296875381469726562e+01 -1.077845000000000164e+00 -3.296875381469726562e+01 -1.077850000000000197e+00 -3.300000000000000000e+01 -1.077855000000000008e+00 -3.296875381469726562e+01 -1.077860000000000040e+00 -3.296875381469726562e+01 -1.077865000000000073e+00 -3.293750000000000000e+01 -1.077870000000000106e+00 -3.296875381469726562e+01 -1.077875000000000139e+00 -3.293750000000000000e+01 -1.077880000000000171e+00 -3.293750000000000000e+01 -1.077884999999999982e+00 -3.290625000000000000e+01 -1.077890000000000015e+00 -3.293750000000000000e+01 -1.077895000000000048e+00 -3.290625000000000000e+01 -1.077900000000000080e+00 -3.296875381469726562e+01 -1.077905000000000113e+00 -3.293750000000000000e+01 -1.077910000000000146e+00 -3.290625000000000000e+01 -1.077915000000000179e+00 -3.290625000000000000e+01 -1.077919999999999989e+00 -3.293750000000000000e+01 -1.077925000000000022e+00 -3.290625000000000000e+01 -1.077930000000000055e+00 -3.290625000000000000e+01 -1.077935000000000088e+00 -3.293750000000000000e+01 -1.077940000000000120e+00 -3.290625000000000000e+01 -1.077945000000000153e+00 -3.290625000000000000e+01 -1.077950000000000186e+00 -3.293750000000000000e+01 -1.077954999999999997e+00 -3.290625000000000000e+01 -1.077960000000000029e+00 -3.284375000000000000e+01 -1.077965000000000062e+00 -3.287500000000000000e+01 -1.077970000000000095e+00 -3.290625000000000000e+01 -1.077975000000000128e+00 -3.293750000000000000e+01 -1.077980000000000160e+00 -3.284375000000000000e+01 -1.077985000000000193e+00 -3.281250381469726562e+01 -1.077990000000000004e+00 -3.281250381469726562e+01 -1.077995000000000037e+00 -3.290625000000000000e+01 -1.078000000000000069e+00 -3.284375000000000000e+01 -1.078005000000000102e+00 -3.284375000000000000e+01 -1.078010000000000135e+00 -3.278125000000000000e+01 -1.078015000000000168e+00 -3.287500000000000000e+01 -1.078019999999999978e+00 -3.281250381469726562e+01 -1.078025000000000011e+00 -3.278125000000000000e+01 -1.078030000000000044e+00 -3.278125000000000000e+01 -1.078035000000000077e+00 -3.278125000000000000e+01 -1.078040000000000109e+00 -3.281250381469726562e+01 -1.078045000000000142e+00 -3.275000000000000000e+01 -1.078050000000000175e+00 -3.278125000000000000e+01 -1.078054999999999986e+00 -3.271875000000000000e+01 -1.078060000000000018e+00 -3.278125000000000000e+01 -1.078065000000000051e+00 -3.278125000000000000e+01 -1.078070000000000084e+00 -3.281250381469726562e+01 -1.078075000000000117e+00 -3.271875000000000000e+01 -1.078080000000000149e+00 -3.271875000000000000e+01 -1.078085000000000182e+00 -3.268750000000000000e+01 -1.078089999999999993e+00 -3.268750000000000000e+01 -1.078095000000000026e+00 -3.271875000000000000e+01 -1.078100000000000058e+00 -3.268750000000000000e+01 -1.078105000000000091e+00 -3.271875000000000000e+01 -1.078110000000000124e+00 -3.268750000000000000e+01 -1.078115000000000157e+00 -3.268750000000000000e+01 -1.078120000000000189e+00 -3.268750000000000000e+01 -1.078125000000000000e+00 -3.268750000000000000e+01 -1.078130000000000033e+00 -3.268750000000000000e+01 -1.078135000000000066e+00 -3.265625381469726562e+01 -1.078140000000000098e+00 -3.262500000000000000e+01 -1.078145000000000131e+00 -3.268750000000000000e+01 -1.078150000000000164e+00 -3.265625381469726562e+01 -1.078155000000000197e+00 -3.262500000000000000e+01 -1.078160000000000007e+00 -3.262500000000000000e+01 -1.078165000000000040e+00 -3.259375000000000000e+01 -1.078170000000000073e+00 -3.259375000000000000e+01 -1.078175000000000106e+00 -3.256250000000000000e+01 -1.078180000000000138e+00 -3.256250000000000000e+01 -1.078185000000000171e+00 -3.259375000000000000e+01 -1.078189999999999982e+00 -3.253125000000000000e+01 -1.078195000000000014e+00 -3.259375000000000000e+01 -1.078200000000000047e+00 -3.256250000000000000e+01 -1.078205000000000080e+00 -3.253125000000000000e+01 -1.078210000000000113e+00 -3.256250000000000000e+01 -1.078215000000000146e+00 -3.256250000000000000e+01 -1.078220000000000178e+00 -3.253125000000000000e+01 -1.078224999999999989e+00 -3.253125000000000000e+01 -1.078230000000000022e+00 -3.253125000000000000e+01 -1.078235000000000054e+00 -3.256250000000000000e+01 -1.078240000000000087e+00 -3.250000381469726562e+01 -1.078245000000000120e+00 -3.246875000000000000e+01 -1.078250000000000153e+00 -3.256250000000000000e+01 -1.078255000000000186e+00 -3.250000381469726562e+01 -1.078259999999999996e+00 -3.253125000000000000e+01 -1.078265000000000029e+00 -3.250000381469726562e+01 -1.078270000000000062e+00 -3.259375000000000000e+01 -1.078275000000000095e+00 -3.253125000000000000e+01 -1.078280000000000127e+00 -3.250000381469726562e+01 -1.078285000000000160e+00 -3.253125000000000000e+01 -1.078290000000000193e+00 -3.250000381469726562e+01 -1.078295000000000003e+00 -3.246875000000000000e+01 -1.078300000000000036e+00 -3.246875000000000000e+01 -1.078305000000000069e+00 -3.253125000000000000e+01 -1.078310000000000102e+00 -3.250000381469726562e+01 -1.078315000000000135e+00 -3.243750000000000000e+01 -1.078320000000000167e+00 -3.237500000000000000e+01 -1.078324999999999978e+00 -3.250000381469726562e+01 -1.078330000000000011e+00 -3.243750000000000000e+01 -1.078335000000000043e+00 -3.243750000000000000e+01 -1.078340000000000076e+00 -3.237500000000000000e+01 -1.078345000000000109e+00 -3.243750000000000000e+01 -1.078350000000000142e+00 -3.237500000000000000e+01 -1.078355000000000175e+00 -3.243750000000000000e+01 -1.078359999999999985e+00 -3.243750000000000000e+01 -1.078365000000000018e+00 -3.237500000000000000e+01 -1.078370000000000051e+00 -3.240625000000000000e+01 -1.078375000000000083e+00 -3.243750000000000000e+01 -1.078380000000000116e+00 -3.240625000000000000e+01 -1.078385000000000149e+00 -3.237500000000000000e+01 -1.078390000000000182e+00 -3.243750000000000000e+01 -1.078394999999999992e+00 -3.240625000000000000e+01 -1.078400000000000025e+00 -3.237500000000000000e+01 -1.078405000000000058e+00 -3.234375000000000000e+01 -1.078410000000000091e+00 -3.240625000000000000e+01 -1.078415000000000123e+00 -3.234375000000000000e+01 -1.078420000000000156e+00 -3.234375000000000000e+01 -1.078425000000000189e+00 -3.237500000000000000e+01 -1.078430000000000000e+00 -3.231250000000000000e+01 -1.078435000000000032e+00 -3.237500000000000000e+01 -1.078440000000000065e+00 -3.234375000000000000e+01 -1.078445000000000098e+00 -3.231250000000000000e+01 -1.078450000000000131e+00 -3.234375000000000000e+01 -1.078455000000000163e+00 -3.231250000000000000e+01 -1.078460000000000196e+00 -3.237500000000000000e+01 -1.078465000000000007e+00 -3.234375000000000000e+01 -1.078470000000000040e+00 -3.234375000000000000e+01 -1.078475000000000072e+00 -3.231250000000000000e+01 -1.078480000000000105e+00 -3.234375000000000000e+01 -1.078485000000000138e+00 -3.231250000000000000e+01 -1.078490000000000171e+00 -3.228125000000000000e+01 -1.078494999999999981e+00 -3.228125000000000000e+01 -1.078500000000000014e+00 -3.228125000000000000e+01 -1.078505000000000047e+00 -3.231250000000000000e+01 -1.078510000000000080e+00 -3.228125000000000000e+01 -1.078515000000000112e+00 -3.221875000000000000e+01 -1.078520000000000145e+00 -3.231250000000000000e+01 -1.078525000000000178e+00 -3.218750000000000000e+01 -1.078529999999999989e+00 -3.228125000000000000e+01 -1.078535000000000021e+00 -3.218750000000000000e+01 -1.078540000000000054e+00 -3.221875000000000000e+01 -1.078545000000000087e+00 -3.215625000000000000e+01 -1.078550000000000120e+00 -3.215625000000000000e+01 -1.078555000000000152e+00 -3.215625000000000000e+01 -1.078560000000000185e+00 -3.215625000000000000e+01 -1.078564999999999996e+00 -3.215625000000000000e+01 -1.078570000000000029e+00 -3.218750000000000000e+01 -1.078575000000000061e+00 -3.215625000000000000e+01 -1.078580000000000094e+00 -3.218750000000000000e+01 -1.078585000000000127e+00 -3.215625000000000000e+01 -1.078590000000000160e+00 -3.215625000000000000e+01 -1.078595000000000192e+00 -3.215625000000000000e+01 -1.078600000000000003e+00 -3.209375381469726562e+01 -1.078605000000000036e+00 -3.209375381469726562e+01 -1.078610000000000069e+00 -3.209375381469726562e+01 -1.078615000000000101e+00 -3.209375381469726562e+01 -1.078620000000000134e+00 -3.203125000000000000e+01 -1.078625000000000167e+00 -3.206250000000000000e+01 -1.078629999999999978e+00 -3.209375381469726562e+01 -1.078635000000000010e+00 -3.209375381469726562e+01 -1.078640000000000043e+00 -3.212500000000000000e+01 -1.078645000000000076e+00 -3.206250000000000000e+01 -1.078650000000000109e+00 -3.206250000000000000e+01 -1.078655000000000141e+00 -3.203125000000000000e+01 -1.078660000000000174e+00 -3.209375381469726562e+01 -1.078664999999999985e+00 -3.206250000000000000e+01 -1.078670000000000018e+00 -3.209375381469726562e+01 -1.078675000000000050e+00 -3.203125000000000000e+01 -1.078680000000000083e+00 -3.203125000000000000e+01 -1.078685000000000116e+00 -3.203125000000000000e+01 -1.078690000000000149e+00 -3.203125000000000000e+01 -1.078695000000000181e+00 -3.206250000000000000e+01 -1.078699999999999992e+00 -3.203125000000000000e+01 -1.078705000000000025e+00 -3.200000000000000000e+01 -1.078710000000000058e+00 -3.203125000000000000e+01 -1.078715000000000090e+00 -3.203125000000000000e+01 -1.078720000000000123e+00 -3.203125000000000000e+01 -1.078725000000000156e+00 -3.203125000000000000e+01 -1.078730000000000189e+00 -3.203125000000000000e+01 -1.078734999999999999e+00 -3.203125000000000000e+01 -1.078740000000000032e+00 -3.203125000000000000e+01 -1.078745000000000065e+00 -3.203125000000000000e+01 -1.078750000000000098e+00 -3.203125000000000000e+01 -1.078755000000000130e+00 -3.203125000000000000e+01 -1.078760000000000163e+00 -3.203125000000000000e+01 -1.078765000000000196e+00 -3.203125000000000000e+01 -1.078770000000000007e+00 -3.203125000000000000e+01 -1.078775000000000039e+00 -3.203125000000000000e+01 -1.078780000000000072e+00 -3.203125000000000000e+01 -1.078785000000000105e+00 -3.203125000000000000e+01 -1.078790000000000138e+00 -3.203125000000000000e+01 -1.078795000000000170e+00 -3.203125000000000000e+01 -1.078799999999999981e+00 -3.196875000000000000e+01 -1.078805000000000014e+00 -3.203125000000000000e+01 -1.078810000000000047e+00 -3.203125000000000000e+01 -1.078815000000000079e+00 -3.203125000000000000e+01 -1.078820000000000112e+00 -3.203125000000000000e+01 -1.078825000000000145e+00 -3.203125000000000000e+01 -1.078830000000000178e+00 -3.200000000000000000e+01 -1.078834999999999988e+00 -3.203125000000000000e+01 -1.078840000000000021e+00 -3.203125000000000000e+01 -1.078845000000000054e+00 -3.196875000000000000e+01 -1.078850000000000087e+00 -3.200000000000000000e+01 -1.078855000000000119e+00 -3.203125000000000000e+01 -1.078860000000000152e+00 -3.190625000000000000e+01 -1.078865000000000185e+00 -3.193750190734863281e+01 -1.078869999999999996e+00 -3.196875000000000000e+01 -1.078875000000000028e+00 -3.196875000000000000e+01 -1.078880000000000061e+00 -3.196875000000000000e+01 -1.078885000000000094e+00 -3.196875000000000000e+01 -1.078890000000000127e+00 -3.203125000000000000e+01 -1.078895000000000159e+00 -3.193750190734863281e+01 -1.078900000000000192e+00 -3.196875000000000000e+01 -1.078905000000000003e+00 -3.200000000000000000e+01 -1.078910000000000036e+00 -3.193750190734863281e+01 -1.078915000000000068e+00 -3.193750190734863281e+01 -1.078920000000000101e+00 -3.193750190734863281e+01 -1.078925000000000134e+00 -3.190625000000000000e+01 -1.078930000000000167e+00 -3.193750190734863281e+01 -1.078934999999999977e+00 -3.193750190734863281e+01 -1.078940000000000010e+00 -3.187500000000000000e+01 -1.078945000000000043e+00 -3.193750190734863281e+01 -1.078950000000000076e+00 -3.190625000000000000e+01 -1.078955000000000108e+00 -3.193750190734863281e+01 -1.078960000000000141e+00 -3.187500000000000000e+01 -1.078965000000000174e+00 -3.187500000000000000e+01 -1.078969999999999985e+00 -3.184375190734863281e+01 -1.078975000000000017e+00 -3.190625000000000000e+01 -1.078980000000000050e+00 -3.193750190734863281e+01 -1.078985000000000083e+00 -3.187500000000000000e+01 -1.078990000000000116e+00 -3.184375190734863281e+01 -1.078995000000000148e+00 -3.184375190734863281e+01 -1.079000000000000181e+00 -3.184375190734863281e+01 -1.079004999999999992e+00 -3.181250000000000000e+01 -1.079010000000000025e+00 -3.187500000000000000e+01 -1.079015000000000057e+00 -3.184375190734863281e+01 -1.079020000000000090e+00 -3.184375190734863281e+01 -1.079025000000000123e+00 -3.187500000000000000e+01 -1.079030000000000156e+00 -3.187500000000000000e+01 -1.079035000000000188e+00 -3.181250000000000000e+01 -1.079039999999999999e+00 -3.181250000000000000e+01 -1.079045000000000032e+00 -3.184375190734863281e+01 -1.079050000000000065e+00 -3.184375190734863281e+01 -1.079055000000000097e+00 -3.178125190734863281e+01 -1.079060000000000130e+00 -3.181250000000000000e+01 -1.079065000000000163e+00 -3.181250000000000000e+01 -1.079070000000000196e+00 -3.181250000000000000e+01 -1.079075000000000006e+00 -3.175000190734863281e+01 -1.079080000000000039e+00 -3.175000190734863281e+01 -1.079085000000000072e+00 -3.178125190734863281e+01 -1.079090000000000105e+00 -3.175000190734863281e+01 -1.079095000000000137e+00 -3.175000190734863281e+01 -1.079100000000000170e+00 -3.171875000000000000e+01 -1.079104999999999981e+00 -3.175000190734863281e+01 -1.079110000000000014e+00 -3.168750190734863281e+01 -1.079115000000000046e+00 -3.168750190734863281e+01 -1.079120000000000079e+00 -3.171875000000000000e+01 -1.079125000000000112e+00 -3.168750190734863281e+01 -1.079130000000000145e+00 -3.171875000000000000e+01 -1.079135000000000177e+00 -3.168750190734863281e+01 -1.079139999999999988e+00 -3.178125190734863281e+01 -1.079145000000000021e+00 -3.181250000000000000e+01 -1.079150000000000054e+00 -3.175000190734863281e+01 -1.079155000000000086e+00 -3.175000190734863281e+01 -1.079160000000000119e+00 -3.171875000000000000e+01 -1.079165000000000152e+00 -3.178125190734863281e+01 -1.079170000000000185e+00 -3.178125190734863281e+01 -1.079174999999999995e+00 -3.171875000000000000e+01 -1.079180000000000028e+00 -3.171875000000000000e+01 -1.079185000000000061e+00 -3.175000190734863281e+01 -1.079190000000000094e+00 -3.171875000000000000e+01 -1.079195000000000126e+00 -3.175000190734863281e+01 -1.079200000000000159e+00 -3.171875000000000000e+01 -1.079205000000000192e+00 -3.168750190734863281e+01 -1.079210000000000003e+00 -3.165625000000000000e+01 -1.079215000000000035e+00 -3.171875000000000000e+01 -1.079220000000000068e+00 -3.168750190734863281e+01 -1.079225000000000101e+00 -3.171875000000000000e+01 -1.079230000000000134e+00 -3.168750190734863281e+01 -1.079235000000000166e+00 -3.168750190734863281e+01 -1.079240000000000199e+00 -3.165625000000000000e+01 -1.079245000000000010e+00 -3.168750190734863281e+01 -1.079250000000000043e+00 -3.165625000000000000e+01 -1.079255000000000075e+00 -3.168750190734863281e+01 -1.079260000000000108e+00 -3.165625000000000000e+01 -1.079265000000000141e+00 -3.168750190734863281e+01 -1.079270000000000174e+00 -3.168750190734863281e+01 -1.079274999999999984e+00 -3.165625000000000000e+01 -1.079280000000000017e+00 -3.168750190734863281e+01 -1.079285000000000050e+00 -3.165625000000000000e+01 -1.079290000000000083e+00 -3.165625000000000000e+01 -1.079295000000000115e+00 -3.165625000000000000e+01 -1.079300000000000148e+00 -3.165625000000000000e+01 -1.079305000000000181e+00 -3.162499809265136719e+01 -1.079309999999999992e+00 -3.162499809265136719e+01 -1.079315000000000024e+00 -3.162499809265136719e+01 -1.079320000000000057e+00 -3.168750190734863281e+01 -1.079325000000000090e+00 -3.165625000000000000e+01 -1.079330000000000123e+00 -3.168750190734863281e+01 -1.079335000000000155e+00 -3.165625000000000000e+01 -1.079340000000000188e+00 -3.162499809265136719e+01 -1.079344999999999999e+00 -3.165625000000000000e+01 -1.079350000000000032e+00 -3.156250000000000000e+01 -1.079355000000000064e+00 -3.162499809265136719e+01 -1.079360000000000097e+00 -3.162499809265136719e+01 -1.079365000000000130e+00 -3.159375190734863281e+01 -1.079370000000000163e+00 -3.159375190734863281e+01 -1.079375000000000195e+00 -3.159375190734863281e+01 -1.079380000000000006e+00 -3.159375190734863281e+01 -1.079385000000000039e+00 -3.156250000000000000e+01 -1.079390000000000072e+00 -3.153125190734863281e+01 -1.079395000000000104e+00 -3.153125190734863281e+01 -1.079400000000000137e+00 -3.159375190734863281e+01 -1.079405000000000170e+00 -3.159375190734863281e+01 -1.079409999999999981e+00 -3.156250000000000000e+01 -1.079415000000000013e+00 -3.146875000000000000e+01 -1.079420000000000046e+00 -3.153125190734863281e+01 -1.079425000000000079e+00 -3.153125190734863281e+01 -1.079430000000000112e+00 -3.150000000000000000e+01 -1.079435000000000144e+00 -3.150000000000000000e+01 -1.079440000000000177e+00 -3.150000000000000000e+01 -1.079444999999999988e+00 -3.146875000000000000e+01 -1.079450000000000021e+00 -3.150000000000000000e+01 -1.079455000000000053e+00 -3.153125190734863281e+01 -1.079460000000000086e+00 -3.150000000000000000e+01 -1.079465000000000119e+00 -3.150000000000000000e+01 -1.079470000000000152e+00 -3.150000000000000000e+01 -1.079475000000000184e+00 -3.150000000000000000e+01 -1.079479999999999995e+00 -3.146875000000000000e+01 -1.079485000000000028e+00 -3.146875000000000000e+01 -1.079490000000000061e+00 -3.143750190734863281e+01 -1.079495000000000093e+00 -3.150000000000000000e+01 -1.079500000000000126e+00 -3.146875000000000000e+01 -1.079505000000000159e+00 -3.143750190734863281e+01 -1.079510000000000192e+00 -3.146875000000000000e+01 -1.079515000000000002e+00 -3.143750190734863281e+01 -1.079520000000000035e+00 -3.146875000000000000e+01 -1.079525000000000068e+00 -3.146875000000000000e+01 -1.079530000000000101e+00 -3.146875000000000000e+01 -1.079535000000000133e+00 -3.146875000000000000e+01 -1.079540000000000166e+00 -3.137500190734863281e+01 -1.079545000000000199e+00 -3.143750190734863281e+01 -1.079550000000000010e+00 -3.137500190734863281e+01 -1.079555000000000042e+00 -3.140625000000000000e+01 -1.079560000000000075e+00 -3.137500190734863281e+01 -1.079565000000000108e+00 -3.143750190734863281e+01 -1.079570000000000141e+00 -3.137500190734863281e+01 -1.079575000000000173e+00 -3.137500190734863281e+01 -1.079579999999999984e+00 -3.134375000000000000e+01 -1.079585000000000017e+00 -3.134375000000000000e+01 -1.079590000000000050e+00 -3.137500190734863281e+01 -1.079595000000000082e+00 -3.134375000000000000e+01 -1.079600000000000115e+00 -3.134375000000000000e+01 -1.079605000000000148e+00 -3.137500190734863281e+01 -1.079610000000000181e+00 -3.125000000000000000e+01 -1.079614999999999991e+00 -3.134375000000000000e+01 -1.079620000000000024e+00 -3.128125190734863281e+01 -1.079625000000000057e+00 -3.128125190734863281e+01 -1.079630000000000090e+00 -3.137500190734863281e+01 -1.079635000000000122e+00 -3.128125190734863281e+01 -1.079640000000000155e+00 -3.134375000000000000e+01 -1.079645000000000188e+00 -3.131250000000000000e+01 -1.079649999999999999e+00 -3.131250000000000000e+01 -1.079655000000000031e+00 -3.131250000000000000e+01 -1.079660000000000064e+00 -3.128125190734863281e+01 -1.079665000000000097e+00 -3.128125190734863281e+01 -1.079670000000000130e+00 -3.128125190734863281e+01 -1.079675000000000162e+00 -3.125000000000000000e+01 -1.079680000000000195e+00 -3.121875000000000000e+01 -1.079685000000000006e+00 -3.128125190734863281e+01 -1.079690000000000039e+00 -3.128125190734863281e+01 -1.079695000000000071e+00 -3.128125190734863281e+01 -1.079700000000000104e+00 -3.128125190734863281e+01 -1.079705000000000137e+00 -3.131250000000000000e+01 -1.079710000000000170e+00 -3.128125190734863281e+01 -1.079714999999999980e+00 -3.125000000000000000e+01 -1.079720000000000013e+00 -3.121875000000000000e+01 -1.079725000000000046e+00 -3.121875000000000000e+01 -1.079730000000000079e+00 -3.118750000000000000e+01 -1.079735000000000111e+00 -3.121875000000000000e+01 -1.079740000000000144e+00 -3.112500190734863281e+01 -1.079745000000000177e+00 -3.118750000000000000e+01 -1.079749999999999988e+00 -3.115625190734863281e+01 -1.079755000000000020e+00 -3.125000000000000000e+01 -1.079760000000000053e+00 -3.118750000000000000e+01 -1.079765000000000086e+00 -3.118750000000000000e+01 -1.079770000000000119e+00 -3.115625190734863281e+01 -1.079775000000000151e+00 -3.115625190734863281e+01 -1.079780000000000184e+00 -3.115625190734863281e+01 -1.079784999999999995e+00 -3.115625190734863281e+01 -1.079790000000000028e+00 -3.118750000000000000e+01 -1.079795000000000060e+00 -3.118750000000000000e+01 -1.079800000000000093e+00 -3.118750000000000000e+01 -1.079805000000000126e+00 -3.118750000000000000e+01 -1.079810000000000159e+00 -3.115625190734863281e+01 -1.079815000000000191e+00 -3.112500190734863281e+01 -1.079820000000000002e+00 -3.121875000000000000e+01 -1.079825000000000035e+00 -3.121875000000000000e+01 -1.079830000000000068e+00 -3.118750000000000000e+01 -1.079835000000000100e+00 -3.118750000000000000e+01 -1.079840000000000133e+00 -3.118750000000000000e+01 -1.079845000000000166e+00 -3.115625190734863281e+01 -1.079850000000000199e+00 -3.112500190734863281e+01 -1.079855000000000009e+00 -3.118750000000000000e+01 -1.079860000000000042e+00 -3.112500190734863281e+01 -1.079865000000000075e+00 -3.115625190734863281e+01 -1.079870000000000108e+00 -3.121875000000000000e+01 -1.079875000000000140e+00 -3.115625190734863281e+01 -1.079880000000000173e+00 -3.118750000000000000e+01 -1.079884999999999984e+00 -3.118750000000000000e+01 -1.079890000000000017e+00 -3.121875000000000000e+01 -1.079895000000000049e+00 -3.118750000000000000e+01 -1.079900000000000082e+00 -3.115625190734863281e+01 -1.079905000000000115e+00 -3.109375000000000000e+01 -1.079910000000000148e+00 -3.115625190734863281e+01 -1.079915000000000180e+00 -3.115625190734863281e+01 -1.079919999999999991e+00 -3.112500190734863281e+01 -1.079925000000000024e+00 -3.109375000000000000e+01 -1.079930000000000057e+00 -3.112500190734863281e+01 -1.079935000000000089e+00 -3.109375000000000000e+01 -1.079940000000000122e+00 -3.112500190734863281e+01 -1.079945000000000155e+00 -3.115625190734863281e+01 -1.079950000000000188e+00 -3.109375000000000000e+01 -1.079954999999999998e+00 -3.100000190734863281e+01 -1.079960000000000031e+00 -3.109375000000000000e+01 -1.079965000000000064e+00 -3.106250000000000000e+01 -1.079970000000000097e+00 -3.106250000000000000e+01 -1.079975000000000129e+00 -3.103125000000000000e+01 -1.079980000000000162e+00 -3.103125000000000000e+01 -1.079985000000000195e+00 -3.106250000000000000e+01 -1.079990000000000006e+00 -3.106250000000000000e+01 -1.079995000000000038e+00 -3.103125000000000000e+01 -1.080000000000000071e+00 -3.103125000000000000e+01 -1.080005000000000104e+00 -3.100000190734863281e+01 -1.080010000000000137e+00 -3.103125000000000000e+01 -1.080015000000000169e+00 -3.103125000000000000e+01 -1.080019999999999980e+00 -3.103125000000000000e+01 -1.080025000000000013e+00 -3.103125000000000000e+01 -1.080030000000000046e+00 -3.106250000000000000e+01 -1.080035000000000078e+00 -3.100000190734863281e+01 -1.080040000000000111e+00 -3.106250000000000000e+01 -1.080045000000000144e+00 -3.100000190734863281e+01 -1.080050000000000177e+00 -3.106250000000000000e+01 -1.080054999999999987e+00 -3.100000190734863281e+01 -1.080060000000000020e+00 -3.100000190734863281e+01 -1.080065000000000053e+00 -3.100000190734863281e+01 -1.080070000000000086e+00 -3.103125000000000000e+01 -1.080075000000000118e+00 -3.096875000000000000e+01 -1.080080000000000151e+00 -3.096875000000000000e+01 -1.080085000000000184e+00 -3.096875000000000000e+01 -1.080089999999999995e+00 -3.100000190734863281e+01 -1.080095000000000027e+00 -3.096875000000000000e+01 -1.080100000000000060e+00 -3.090625000000000000e+01 -1.080105000000000093e+00 -3.093750000000000000e+01 -1.080110000000000126e+00 -3.096875000000000000e+01 -1.080115000000000158e+00 -3.100000190734863281e+01 -1.080120000000000191e+00 -3.096875000000000000e+01 -1.080125000000000002e+00 -3.087500190734863281e+01 -1.080130000000000035e+00 -3.090625000000000000e+01 -1.080135000000000067e+00 -3.093750000000000000e+01 -1.080140000000000100e+00 -3.087500190734863281e+01 -1.080145000000000133e+00 -3.090625000000000000e+01 -1.080150000000000166e+00 -3.087500190734863281e+01 -1.080155000000000198e+00 -3.084375190734863281e+01 -1.080160000000000009e+00 -3.090625000000000000e+01 -1.080165000000000042e+00 -3.087500190734863281e+01 -1.080170000000000075e+00 -3.087500190734863281e+01 -1.080175000000000107e+00 -3.084375190734863281e+01 -1.080180000000000140e+00 -3.081250000000000000e+01 -1.080185000000000173e+00 -3.084375190734863281e+01 -1.080189999999999984e+00 -3.087500190734863281e+01 -1.080195000000000016e+00 -3.078125000000000000e+01 -1.080200000000000049e+00 -3.084375190734863281e+01 -1.080205000000000082e+00 -3.084375190734863281e+01 -1.080210000000000115e+00 -3.078125000000000000e+01 -1.080215000000000147e+00 -3.084375190734863281e+01 -1.080220000000000180e+00 -3.081250000000000000e+01 -1.080224999999999991e+00 -3.081250000000000000e+01 -1.080230000000000024e+00 -3.078125000000000000e+01 -1.080235000000000056e+00 -3.084375190734863281e+01 -1.080240000000000089e+00 -3.078125000000000000e+01 -1.080245000000000122e+00 -3.081250000000000000e+01 -1.080250000000000155e+00 -3.081250000000000000e+01 -1.080255000000000187e+00 -3.084375190734863281e+01 -1.080259999999999998e+00 -3.081250000000000000e+01 -1.080265000000000031e+00 -3.081250000000000000e+01 -1.080270000000000064e+00 -3.084375190734863281e+01 -1.080275000000000096e+00 -3.084375190734863281e+01 -1.080280000000000129e+00 -3.087500190734863281e+01 -1.080285000000000162e+00 -3.078125000000000000e+01 -1.080290000000000195e+00 -3.078125000000000000e+01 -1.080295000000000005e+00 -3.071875190734863281e+01 -1.080300000000000038e+00 -3.084375190734863281e+01 -1.080305000000000071e+00 -3.078125000000000000e+01 -1.080310000000000104e+00 -3.078125000000000000e+01 -1.080315000000000136e+00 -3.081250000000000000e+01 -1.080320000000000169e+00 -3.075000000000000000e+01 -1.080324999999999980e+00 -3.071875190734863281e+01 -1.080330000000000013e+00 -3.068750000000000000e+01 -1.080335000000000045e+00 -3.071875190734863281e+01 -1.080340000000000078e+00 -3.071875190734863281e+01 -1.080345000000000111e+00 -3.068750000000000000e+01 -1.080350000000000144e+00 -3.071875190734863281e+01 -1.080355000000000176e+00 -3.071875190734863281e+01 -1.080359999999999987e+00 -3.071875190734863281e+01 -1.080365000000000020e+00 -3.078125000000000000e+01 -1.080370000000000053e+00 -3.068750000000000000e+01 -1.080375000000000085e+00 -3.075000000000000000e+01 -1.080380000000000118e+00 -3.071875190734863281e+01 -1.080385000000000151e+00 -3.075000000000000000e+01 -1.080390000000000184e+00 -3.071875190734863281e+01 -1.080394999999999994e+00 -3.078125000000000000e+01 -1.080400000000000027e+00 -3.068750000000000000e+01 -1.080405000000000060e+00 -3.071875190734863281e+01 -1.080410000000000093e+00 -3.065625000000000000e+01 -1.080415000000000125e+00 -3.065625000000000000e+01 -1.080420000000000158e+00 -3.065625000000000000e+01 -1.080425000000000191e+00 -3.065625000000000000e+01 -1.080430000000000001e+00 -3.065625000000000000e+01 -1.080435000000000034e+00 -3.062500000000000000e+01 -1.080440000000000067e+00 -3.065625000000000000e+01 -1.080445000000000100e+00 -3.065625000000000000e+01 -1.080450000000000133e+00 -3.056250190734863281e+01 -1.080455000000000165e+00 -3.056250190734863281e+01 -1.080460000000000198e+00 -3.053125000000000000e+01 -1.080465000000000009e+00 -3.056250190734863281e+01 -1.080470000000000041e+00 -3.056250190734863281e+01 -1.080475000000000074e+00 -3.056250190734863281e+01 -1.080480000000000107e+00 -3.050000000000000000e+01 -1.080485000000000140e+00 -3.056250190734863281e+01 -1.080490000000000173e+00 -3.053125000000000000e+01 -1.080494999999999983e+00 -3.053125000000000000e+01 -1.080500000000000016e+00 -3.053125000000000000e+01 -1.080505000000000049e+00 -3.050000000000000000e+01 -1.080510000000000081e+00 -3.050000000000000000e+01 -1.080515000000000114e+00 -3.050000000000000000e+01 -1.080520000000000147e+00 -3.053125000000000000e+01 -1.080525000000000180e+00 -3.046875000000000000e+01 -1.080529999999999990e+00 -3.050000000000000000e+01 -1.080535000000000023e+00 -3.050000000000000000e+01 -1.080540000000000056e+00 -3.046875000000000000e+01 -1.080545000000000089e+00 -3.050000000000000000e+01 -1.080550000000000122e+00 -3.043750190734863281e+01 -1.080555000000000154e+00 -3.046875000000000000e+01 -1.080560000000000187e+00 -3.043750190734863281e+01 -1.080564999999999998e+00 -3.046875000000000000e+01 -1.080570000000000030e+00 -3.046875000000000000e+01 -1.080575000000000063e+00 -3.040625190734863281e+01 -1.080580000000000096e+00 -3.037500000000000000e+01 -1.080585000000000129e+00 -3.043750190734863281e+01 -1.080590000000000162e+00 -3.040625190734863281e+01 -1.080595000000000194e+00 -3.040625190734863281e+01 -1.080600000000000005e+00 -3.037500000000000000e+01 -1.080605000000000038e+00 -3.034375000000000000e+01 -1.080610000000000070e+00 -3.034375000000000000e+01 -1.080615000000000103e+00 -3.040625190734863281e+01 -1.080620000000000136e+00 -3.034375000000000000e+01 -1.080625000000000169e+00 -3.037500000000000000e+01 -1.080629999999999979e+00 -3.034375000000000000e+01 -1.080635000000000012e+00 -3.040625190734863281e+01 -1.080640000000000045e+00 -3.031250000000000000e+01 -1.080645000000000078e+00 -3.031250000000000000e+01 -1.080650000000000110e+00 -3.031250000000000000e+01 -1.080655000000000143e+00 -3.025000000000000000e+01 -1.080660000000000176e+00 -3.028125190734863281e+01 -1.080664999999999987e+00 -3.028125190734863281e+01 -1.080670000000000019e+00 -3.021875000000000000e+01 -1.080675000000000052e+00 -3.028125190734863281e+01 -1.080680000000000085e+00 -3.028125190734863281e+01 -1.080685000000000118e+00 -3.025000000000000000e+01 -1.080690000000000150e+00 -3.025000000000000000e+01 -1.080695000000000183e+00 -3.021875000000000000e+01 -1.080699999999999994e+00 -3.021875000000000000e+01 -1.080705000000000027e+00 -3.025000000000000000e+01 -1.080710000000000059e+00 -3.018750000000000000e+01 -1.080715000000000092e+00 -3.025000000000000000e+01 -1.080720000000000125e+00 -3.021875000000000000e+01 -1.080725000000000158e+00 -3.015625190734863281e+01 -1.080730000000000190e+00 -3.018750000000000000e+01 -1.080735000000000001e+00 -3.012500190734863281e+01 -1.080740000000000034e+00 -3.015625190734863281e+01 -1.080745000000000067e+00 -3.015625190734863281e+01 -1.080750000000000099e+00 -3.015625190734863281e+01 -1.080755000000000132e+00 -3.012500190734863281e+01 -1.080760000000000165e+00 -3.015625190734863281e+01 -1.080765000000000198e+00 -3.006250000000000000e+01 -1.080770000000000008e+00 -3.015625190734863281e+01 -1.080775000000000041e+00 -3.009375000000000000e+01 -1.080780000000000074e+00 -3.015625190734863281e+01 -1.080785000000000107e+00 -3.012500190734863281e+01 -1.080790000000000139e+00 -3.015625190734863281e+01 -1.080795000000000172e+00 -3.006250000000000000e+01 -1.080799999999999983e+00 -3.009375000000000000e+01 -1.080805000000000016e+00 -3.006250000000000000e+01 -1.080810000000000048e+00 -3.006250000000000000e+01 -1.080815000000000081e+00 -3.015625190734863281e+01 -1.080820000000000114e+00 -3.009375000000000000e+01 -1.080825000000000147e+00 -3.009375000000000000e+01 -1.080830000000000179e+00 -3.000000190734863281e+01 -1.080834999999999990e+00 -3.000000190734863281e+01 -1.080840000000000023e+00 -3.003125000000000000e+01 -1.080845000000000056e+00 -3.003125000000000000e+01 -1.080850000000000088e+00 -3.006250000000000000e+01 -1.080855000000000121e+00 -3.003125000000000000e+01 -1.080860000000000154e+00 -3.003125000000000000e+01 -1.080865000000000187e+00 -2.993750000000000000e+01 -1.080869999999999997e+00 -3.000000190734863281e+01 -1.080875000000000030e+00 -2.996875190734863281e+01 -1.080880000000000063e+00 -2.996875190734863281e+01 -1.080885000000000096e+00 -3.000000190734863281e+01 -1.080890000000000128e+00 -2.996875190734863281e+01 -1.080895000000000161e+00 -2.996875190734863281e+01 -1.080900000000000194e+00 -3.000000190734863281e+01 -1.080905000000000005e+00 -3.003125000000000000e+01 -1.080910000000000037e+00 -2.996875190734863281e+01 -1.080915000000000070e+00 -2.996875190734863281e+01 -1.080920000000000103e+00 -2.993750000000000000e+01 -1.080925000000000136e+00 -2.993750000000000000e+01 -1.080930000000000168e+00 -2.996875190734863281e+01 -1.080934999999999979e+00 -2.993750000000000000e+01 -1.080940000000000012e+00 -2.990625000000000000e+01 -1.080945000000000045e+00 -2.993750000000000000e+01 -1.080950000000000077e+00 -2.990625000000000000e+01 -1.080955000000000110e+00 -2.990625000000000000e+01 -1.080960000000000143e+00 -2.990625000000000000e+01 -1.080965000000000176e+00 -2.984375190734863281e+01 -1.080969999999999986e+00 -2.993750000000000000e+01 -1.080975000000000019e+00 -2.990625000000000000e+01 -1.080980000000000052e+00 -2.987500000000000000e+01 -1.080985000000000085e+00 -2.990625000000000000e+01 -1.080990000000000117e+00 -2.984375190734863281e+01 -1.080995000000000150e+00 -2.981250000000000000e+01 -1.081000000000000183e+00 -2.981250000000000000e+01 -1.081004999999999994e+00 -2.975000000000000000e+01 -1.081010000000000026e+00 -2.981250000000000000e+01 -1.081015000000000059e+00 -2.978125000000000000e+01 -1.081020000000000092e+00 -2.971875190734863281e+01 -1.081025000000000125e+00 -2.981250000000000000e+01 -1.081030000000000157e+00 -2.978125000000000000e+01 -1.081035000000000190e+00 -2.975000000000000000e+01 -1.081040000000000001e+00 -2.975000000000000000e+01 -1.081045000000000034e+00 -2.975000000000000000e+01 -1.081050000000000066e+00 -2.968750190734863281e+01 -1.081055000000000099e+00 -2.971875190734863281e+01 -1.081060000000000132e+00 -2.968750190734863281e+01 -1.081065000000000165e+00 -2.965625000000000000e+01 -1.081070000000000197e+00 -2.968750190734863281e+01 -1.081075000000000008e+00 -2.962500000000000000e+01 -1.081080000000000041e+00 -2.965625000000000000e+01 -1.081085000000000074e+00 -2.965625000000000000e+01 -1.081090000000000106e+00 -2.965625000000000000e+01 -1.081095000000000139e+00 -2.959375000000000000e+01 -1.081100000000000172e+00 -2.956250190734863281e+01 -1.081104999999999983e+00 -2.962500000000000000e+01 -1.081110000000000015e+00 -2.956250190734863281e+01 -1.081115000000000048e+00 -2.959375000000000000e+01 -1.081120000000000081e+00 -2.950000000000000000e+01 -1.081125000000000114e+00 -2.946875000000000000e+01 -1.081130000000000146e+00 -2.946875000000000000e+01 -1.081135000000000179e+00 -2.950000000000000000e+01 -1.081139999999999990e+00 -2.943750190734863281e+01 -1.081145000000000023e+00 -2.940625190734863281e+01 -1.081150000000000055e+00 -2.940625190734863281e+01 -1.081155000000000088e+00 -2.950000000000000000e+01 -1.081160000000000121e+00 -2.940625190734863281e+01 -1.081165000000000154e+00 -2.940625190734863281e+01 -1.081170000000000186e+00 -2.943750190734863281e+01 -1.081174999999999997e+00 -2.940625190734863281e+01 -1.081180000000000030e+00 -2.940625190734863281e+01 -1.081185000000000063e+00 -2.931250000000000000e+01 -1.081190000000000095e+00 -2.931250000000000000e+01 -1.081195000000000128e+00 -2.931250000000000000e+01 -1.081200000000000161e+00 -2.928125190734863281e+01 -1.081205000000000194e+00 -2.928125190734863281e+01 -1.081210000000000004e+00 -2.934375000000000000e+01 -1.081215000000000037e+00 -2.928125190734863281e+01 -1.081220000000000070e+00 -2.921875000000000000e+01 -1.081225000000000103e+00 -2.928125190734863281e+01 -1.081230000000000135e+00 -2.918750000000000000e+01 -1.081235000000000168e+00 -2.921875000000000000e+01 -1.081239999999999979e+00 -2.918750000000000000e+01 -1.081245000000000012e+00 -2.915625000000000000e+01 -1.081250000000000044e+00 -2.921875000000000000e+01 -1.081255000000000077e+00 -2.915625000000000000e+01 -1.081260000000000110e+00 -2.903125000000000000e+01 -1.081265000000000143e+00 -2.912500190734863281e+01 -1.081270000000000175e+00 -2.909375000000000000e+01 -1.081274999999999986e+00 -2.903125000000000000e+01 -1.081280000000000019e+00 -2.900000190734863281e+01 -1.081285000000000052e+00 -2.903125000000000000e+01 -1.081290000000000084e+00 -2.903125000000000000e+01 -1.081295000000000117e+00 -2.900000190734863281e+01 -1.081300000000000150e+00 -2.896875190734863281e+01 -1.081305000000000183e+00 -2.890625000000000000e+01 -1.081309999999999993e+00 -2.884375190734863281e+01 -1.081315000000000026e+00 -2.884375190734863281e+01 -1.081320000000000059e+00 -2.868750190734863281e+01 -1.081325000000000092e+00 -2.868750190734863281e+01 -1.081330000000000124e+00 -2.850000000000000000e+01 -1.081335000000000157e+00 -2.834375000000000000e+01 -1.081340000000000190e+00 -2.821875000000000000e+01 -1.081345000000000001e+00 -2.800000000000000000e+01 -1.081350000000000033e+00 -2.784375190734863281e+01 -1.081355000000000066e+00 -2.765625000000000000e+01 -1.081360000000000099e+00 -2.734375000000000000e+01 -1.081365000000000132e+00 -2.715625000000000000e+01 -1.081370000000000164e+00 -2.684375000000000000e+01 -1.081375000000000197e+00 -2.646875000000000000e+01 -1.081380000000000008e+00 -2.609375190734863281e+01 -1.081385000000000041e+00 -2.571875000000000000e+01 -1.081390000000000073e+00 -2.531250000000000000e+01 -1.081395000000000106e+00 -2.484375000000000000e+01 -1.081400000000000139e+00 -2.443750000000000000e+01 -1.081405000000000172e+00 -2.384375000000000000e+01 -1.081409999999999982e+00 -2.321875000000000000e+01 -1.081415000000000015e+00 -2.262500190734863281e+01 -1.081420000000000048e+00 -2.187500000000000000e+01 -1.081425000000000081e+00 -2.115625000000000000e+01 -1.081430000000000113e+00 -2.046875190734863281e+01 -1.081435000000000146e+00 -1.953125000000000000e+01 -1.081440000000000179e+00 -1.878125000000000000e+01 -1.081444999999999990e+00 -1.784375190734863281e+01 -1.081450000000000022e+00 -1.687500000000000000e+01 -1.081455000000000055e+00 -1.593750000000000000e+01 -1.081460000000000088e+00 -1.500000095367431641e+01 -1.081465000000000121e+00 -1.390625095367431641e+01 -1.081470000000000153e+00 -1.296875095367431641e+01 -1.081475000000000186e+00 -1.196875095367431641e+01 -1.081479999999999997e+00 -1.093750000000000000e+01 -1.081485000000000030e+00 -9.968750000000000000e+00 -1.081490000000000062e+00 -8.937500000000000000e+00 -1.081495000000000095e+00 -7.906249523162841797e+00 -1.081500000000000128e+00 -6.968750000000000000e+00 -1.081505000000000161e+00 -6.000000000000000000e+00 -1.081510000000000193e+00 -5.093750000000000000e+00 -1.081515000000000004e+00 -4.156250000000000000e+00 -1.081520000000000037e+00 -3.281250238418579102e+00 -1.081525000000000070e+00 -2.312500000000000000e+00 -1.081530000000000102e+00 -1.437500000000000000e+00 -1.081535000000000135e+00 -6.250000000000000000e-01 -1.081540000000000168e+00 2.500000000000000000e-01 -1.081544999999999979e+00 1.000000000000000000e+00 -1.081550000000000011e+00 1.781250000000000000e+00 -1.081555000000000044e+00 2.593750238418579102e+00 -1.081560000000000077e+00 3.343750000000000000e+00 -1.081565000000000110e+00 4.125000000000000000e+00 -1.081570000000000142e+00 4.812500000000000000e+00 -1.081575000000000175e+00 5.406250476837158203e+00 -1.081579999999999986e+00 6.125000476837158203e+00 -1.081585000000000019e+00 6.843750476837158203e+00 -1.081590000000000051e+00 7.437500000000000000e+00 -1.081595000000000084e+00 8.062500953674316406e+00 -1.081600000000000117e+00 8.656250000000000000e+00 -1.081605000000000150e+00 9.218750953674316406e+00 -1.081610000000000182e+00 9.812500000000000000e+00 -1.081614999999999993e+00 1.037500095367431641e+01 -1.081620000000000026e+00 1.093750000000000000e+01 -1.081625000000000059e+00 1.137500095367431641e+01 -1.081630000000000091e+00 1.190625000000000000e+01 -1.081635000000000124e+00 1.234375000000000000e+01 -1.081640000000000157e+00 1.281250000000000000e+01 -1.081645000000000190e+00 1.328125000000000000e+01 -1.081650000000000000e+00 1.365625000000000000e+01 -1.081655000000000033e+00 1.406250095367431641e+01 -1.081660000000000066e+00 1.456250095367431641e+01 -1.081665000000000099e+00 1.487500000000000000e+01 -1.081670000000000131e+00 1.525000000000000000e+01 -1.081675000000000164e+00 1.562500000000000000e+01 -1.081680000000000197e+00 1.600000000000000000e+01 -1.081685000000000008e+00 1.628125000000000000e+01 -1.081690000000000040e+00 1.656250190734863281e+01 -1.081695000000000073e+00 1.700000000000000000e+01 -1.081700000000000106e+00 1.721875000000000000e+01 -1.081705000000000139e+00 1.743750000000000000e+01 -1.081710000000000171e+00 1.771875190734863281e+01 -1.081714999999999982e+00 1.800000190734863281e+01 -1.081720000000000015e+00 1.821875000000000000e+01 -1.081725000000000048e+00 1.843750190734863281e+01 -1.081730000000000080e+00 1.862500000000000000e+01 -1.081735000000000113e+00 1.887500190734863281e+01 -1.081740000000000146e+00 1.900000190734863281e+01 -1.081745000000000179e+00 1.912500000000000000e+01 -1.081749999999999989e+00 1.931250000000000000e+01 -1.081755000000000022e+00 1.950000000000000000e+01 -1.081760000000000055e+00 1.962500000000000000e+01 -1.081765000000000088e+00 1.978125000000000000e+01 -1.081770000000000120e+00 1.990625000000000000e+01 -1.081775000000000153e+00 2.000000000000000000e+01 -1.081780000000000186e+00 2.009375000000000000e+01 -1.081784999999999997e+00 2.015625190734863281e+01 -1.081790000000000029e+00 2.031250190734863281e+01 -1.081795000000000062e+00 2.040625000000000000e+01 -1.081800000000000095e+00 2.050000000000000000e+01 -1.081805000000000128e+00 2.050000000000000000e+01 -1.081810000000000160e+00 2.053125000000000000e+01 -1.081815000000000193e+00 2.059375190734863281e+01 -1.081820000000000004e+00 2.059375190734863281e+01 -1.081825000000000037e+00 2.071875000000000000e+01 -1.081830000000000069e+00 2.065625000000000000e+01 -1.081835000000000102e+00 2.075000190734863281e+01 -1.081840000000000135e+00 2.068750000000000000e+01 -1.081845000000000168e+00 2.071875000000000000e+01 -1.081849999999999978e+00 2.075000190734863281e+01 -1.081855000000000011e+00 2.062500000000000000e+01 -1.081860000000000044e+00 2.062500000000000000e+01 -1.081865000000000077e+00 2.059375190734863281e+01 -1.081870000000000109e+00 2.053125000000000000e+01 -1.081875000000000142e+00 2.050000000000000000e+01 -1.081880000000000175e+00 2.040625000000000000e+01 -1.081884999999999986e+00 2.040625000000000000e+01 -1.081890000000000018e+00 2.028125000000000000e+01 -1.081895000000000051e+00 2.018750000000000000e+01 -1.081900000000000084e+00 2.000000000000000000e+01 -1.081905000000000117e+00 2.000000000000000000e+01 -1.081910000000000149e+00 1.990625000000000000e+01 -1.081915000000000182e+00 1.975000000000000000e+01 -1.081919999999999993e+00 1.962500000000000000e+01 -1.081925000000000026e+00 1.946875000000000000e+01 -1.081930000000000058e+00 1.937500000000000000e+01 -1.081935000000000091e+00 1.925000000000000000e+01 -1.081940000000000124e+00 1.906250000000000000e+01 -1.081945000000000157e+00 1.900000190734863281e+01 -1.081950000000000189e+00 1.881250000000000000e+01 -1.081955000000000000e+00 1.868750000000000000e+01 -1.081960000000000033e+00 1.853125000000000000e+01 -1.081965000000000066e+00 1.834375000000000000e+01 -1.081970000000000098e+00 1.818750000000000000e+01 -1.081975000000000131e+00 1.803125000000000000e+01 -1.081980000000000164e+00 1.781250000000000000e+01 -1.081985000000000197e+00 1.765625000000000000e+01 -1.081990000000000007e+00 1.750000000000000000e+01 -1.081995000000000040e+00 1.725000000000000000e+01 -1.082000000000000073e+00 1.709375000000000000e+01 -1.082005000000000106e+00 1.687500000000000000e+01 -1.082010000000000138e+00 1.668750190734863281e+01 -1.082015000000000171e+00 1.650000000000000000e+01 -1.082019999999999982e+00 1.625000190734863281e+01 -1.082025000000000015e+00 1.600000000000000000e+01 -1.082030000000000047e+00 1.584375095367431641e+01 -1.082035000000000080e+00 1.565625000000000000e+01 -1.082040000000000113e+00 1.543750095367431641e+01 -1.082045000000000146e+00 1.521875095367431641e+01 -1.082050000000000178e+00 1.500000095367431641e+01 -1.082054999999999989e+00 1.471875095367431641e+01 -1.082060000000000022e+00 1.456250095367431641e+01 -1.082065000000000055e+00 1.437500000000000000e+01 -1.082070000000000087e+00 1.409375000000000000e+01 -1.082075000000000120e+00 1.381250000000000000e+01 -1.082080000000000153e+00 1.365625000000000000e+01 -1.082085000000000186e+00 1.340625095367431641e+01 -1.082089999999999996e+00 1.315625000000000000e+01 -1.082095000000000029e+00 1.293750000000000000e+01 -1.082100000000000062e+00 1.265625000000000000e+01 -1.082105000000000095e+00 1.240625000000000000e+01 -1.082110000000000127e+00 1.221875000000000000e+01 -1.082115000000000160e+00 1.190625000000000000e+01 -1.082120000000000193e+00 1.168750000000000000e+01 -1.082125000000000004e+00 1.134375000000000000e+01 -1.082130000000000036e+00 1.109375095367431641e+01 -1.082135000000000069e+00 1.100000000000000000e+01 -1.082140000000000102e+00 1.059375095367431641e+01 -1.082145000000000135e+00 1.037500095367431641e+01 -1.082150000000000167e+00 1.006250000000000000e+01 -1.082154999999999978e+00 9.812500000000000000e+00 -1.082160000000000011e+00 9.531250000000000000e+00 -1.082165000000000044e+00 9.312500000000000000e+00 -1.082170000000000076e+00 9.000000953674316406e+00 -1.082175000000000109e+00 8.750000000000000000e+00 -1.082180000000000142e+00 8.500000000000000000e+00 -1.082185000000000175e+00 8.156250000000000000e+00 -1.082189999999999985e+00 7.906249523162841797e+00 -1.082195000000000018e+00 7.625000000000000000e+00 -1.082200000000000051e+00 7.312500476837158203e+00 -1.082205000000000084e+00 7.062500476837158203e+00 -1.082210000000000116e+00 6.750000000000000000e+00 -1.082215000000000149e+00 6.531250000000000000e+00 -1.082220000000000182e+00 6.218750000000000000e+00 -1.082224999999999993e+00 5.937500000000000000e+00 -1.082230000000000025e+00 5.625000000000000000e+00 -1.082235000000000058e+00 5.375000000000000000e+00 -1.082240000000000091e+00 5.125000000000000000e+00 -1.082245000000000124e+00 4.843750000000000000e+00 -1.082250000000000156e+00 4.500000476837158203e+00 -1.082255000000000189e+00 4.281250476837158203e+00 -1.082260000000000000e+00 3.906250000000000000e+00 -1.082265000000000033e+00 3.625000238418579102e+00 -1.082270000000000065e+00 3.406250238418579102e+00 -1.082275000000000098e+00 3.062500238418579102e+00 -1.082280000000000131e+00 2.781250000000000000e+00 -1.082285000000000164e+00 2.500000000000000000e+00 -1.082290000000000196e+00 2.187500000000000000e+00 -1.082295000000000007e+00 1.875000119209289551e+00 -1.082300000000000040e+00 1.593750119209289551e+00 -1.082305000000000073e+00 1.312500000000000000e+00 -1.082310000000000105e+00 1.031250000000000000e+00 -1.082315000000000138e+00 7.500000000000000000e-01 -1.082320000000000171e+00 5.000000000000000000e-01 -1.082324999999999982e+00 2.500000000000000000e-01 -1.082330000000000014e+00 0.000000000000000000e+00 -1.082335000000000047e+00 -3.125000000000000000e-01 -1.082340000000000080e+00 -5.312500000000000000e-01 -1.082345000000000113e+00 -8.437500000000000000e-01 -1.082350000000000145e+00 -1.031250000000000000e+00 -1.082355000000000178e+00 -1.343750000000000000e+00 -1.082359999999999989e+00 -1.562500000000000000e+00 -1.082365000000000022e+00 -1.906250000000000000e+00 -1.082370000000000054e+00 -2.125000000000000000e+00 -1.082375000000000087e+00 -2.500000000000000000e+00 -1.082380000000000120e+00 -2.718750238418579102e+00 -1.082385000000000153e+00 -2.937500238418579102e+00 -1.082390000000000185e+00 -3.125000000000000000e+00 -1.082394999999999996e+00 -3.500000000000000000e+00 -1.082400000000000029e+00 -3.781250000000000000e+00 -1.082405000000000062e+00 -4.062500476837158203e+00 -1.082410000000000094e+00 -4.312500000000000000e+00 -1.082415000000000127e+00 -4.500000476837158203e+00 -1.082420000000000160e+00 -4.843750000000000000e+00 -1.082425000000000193e+00 -5.093750000000000000e+00 -1.082430000000000003e+00 -5.343750000000000000e+00 -1.082435000000000036e+00 -5.593750000000000000e+00 -1.082440000000000069e+00 -5.843750000000000000e+00 -1.082445000000000102e+00 -6.125000476837158203e+00 -1.082450000000000134e+00 -6.281250000000000000e+00 -1.082455000000000167e+00 -6.531250000000000000e+00 -1.082459999999999978e+00 -6.781250000000000000e+00 -1.082465000000000011e+00 -7.031250476837158203e+00 -1.082470000000000043e+00 -7.312500476837158203e+00 -1.082475000000000076e+00 -7.500000476837158203e+00 -1.082480000000000109e+00 -7.750000476837158203e+00 -1.082485000000000142e+00 -8.031250000000000000e+00 -1.082490000000000174e+00 -8.156250000000000000e+00 -1.082494999999999985e+00 -8.500000000000000000e+00 -1.082500000000000018e+00 -8.687500000000000000e+00 -1.082505000000000051e+00 -8.906250000000000000e+00 -1.082510000000000083e+00 -9.093750000000000000e+00 -1.082515000000000116e+00 -9.406250000000000000e+00 -1.082520000000000149e+00 -9.562500000000000000e+00 -1.082525000000000182e+00 -9.812500000000000000e+00 -1.082529999999999992e+00 -1.006250000000000000e+01 -1.082535000000000025e+00 -1.021875095367431641e+01 -1.082540000000000058e+00 -1.043750095367431641e+01 -1.082545000000000091e+00 -1.071875000000000000e+01 -1.082550000000000123e+00 -1.096875000000000000e+01 -1.082555000000000156e+00 -1.115625000000000000e+01 -1.082560000000000189e+00 -1.137500095367431641e+01 -1.082565000000000000e+00 -1.156250000000000000e+01 -1.082570000000000032e+00 -1.168750000000000000e+01 -1.082575000000000065e+00 -1.193750000000000000e+01 -1.082580000000000098e+00 -1.212500000000000000e+01 -1.082585000000000131e+00 -1.234375000000000000e+01 -1.082590000000000163e+00 -1.253125095367431641e+01 -1.082595000000000196e+00 -1.275000095367431641e+01 -1.082600000000000007e+00 -1.296875095367431641e+01 -1.082605000000000040e+00 -1.309375000000000000e+01 -1.082610000000000072e+00 -1.334375095367431641e+01 -1.082615000000000105e+00 -1.350000000000000000e+01 -1.082620000000000138e+00 -1.368750095367431641e+01 -1.082625000000000171e+00 -1.390625095367431641e+01 -1.082629999999999981e+00 -1.409375000000000000e+01 -1.082635000000000014e+00 -1.425000000000000000e+01 -1.082640000000000047e+00 -1.446875000000000000e+01 -1.082645000000000080e+00 -1.465625000000000000e+01 -1.082650000000000112e+00 -1.478125095367431641e+01 -1.082655000000000145e+00 -1.493750000000000000e+01 -1.082660000000000178e+00 -1.512500000000000000e+01 -1.082664999999999988e+00 -1.528125095367431641e+01 -1.082670000000000021e+00 -1.550000095367431641e+01 -1.082675000000000054e+00 -1.565625000000000000e+01 -1.082680000000000087e+00 -1.581249904632568359e+01 -1.082685000000000120e+00 -1.603125000000000000e+01 -1.082690000000000152e+00 -1.618750000000000000e+01 -1.082695000000000185e+00 -1.634375000000000000e+01 -1.082699999999999996e+00 -1.653125000000000000e+01 -1.082705000000000028e+00 -1.662500000000000000e+01 -1.082710000000000061e+00 -1.684375190734863281e+01 -1.082715000000000094e+00 -1.696875000000000000e+01 -1.082720000000000127e+00 -1.706250000000000000e+01 -1.082725000000000160e+00 -1.728125190734863281e+01 -1.082730000000000192e+00 -1.746875000000000000e+01 -1.082735000000000003e+00 -1.753125000000000000e+01 -1.082740000000000036e+00 -1.771875190734863281e+01 -1.082745000000000068e+00 -1.787500000000000000e+01 -1.082750000000000101e+00 -1.803125000000000000e+01 -1.082755000000000134e+00 -1.818750000000000000e+01 -1.082760000000000167e+00 -1.831250000000000000e+01 -1.082765000000000200e+00 -1.846875000000000000e+01 -1.082770000000000010e+00 -1.865625000000000000e+01 -1.082775000000000043e+00 -1.881250000000000000e+01 -1.082780000000000076e+00 -1.896875000000000000e+01 -1.082785000000000108e+00 -1.903125000000000000e+01 -1.082790000000000141e+00 -1.928125190734863281e+01 -1.082795000000000174e+00 -1.934375000000000000e+01 -1.082799999999999985e+00 -1.950000000000000000e+01 -1.082805000000000017e+00 -1.959375190734863281e+01 -1.082810000000000050e+00 -1.975000000000000000e+01 -1.082815000000000083e+00 -1.987500190734863281e+01 -1.082820000000000116e+00 -1.993750000000000000e+01 -1.082825000000000149e+00 -2.009375000000000000e+01 -1.082830000000000181e+00 -2.021875000000000000e+01 -1.082834999999999992e+00 -2.034375000000000000e+01 -1.082840000000000025e+00 -2.046875190734863281e+01 -1.082845000000000057e+00 -2.062500000000000000e+01 -1.082850000000000090e+00 -2.078125000000000000e+01 -1.082855000000000123e+00 -2.084375000000000000e+01 -1.082860000000000156e+00 -2.096875000000000000e+01 -1.082865000000000189e+00 -2.103125190734863281e+01 -1.082869999999999999e+00 -2.118750190734863281e+01 -1.082875000000000032e+00 -2.134375000000000000e+01 -1.082880000000000065e+00 -2.140625000000000000e+01 -1.082885000000000097e+00 -2.153125000000000000e+01 -1.082890000000000130e+00 -2.165625000000000000e+01 -1.082895000000000163e+00 -2.178125000000000000e+01 -1.082900000000000196e+00 -2.184375000000000000e+01 -1.082905000000000006e+00 -2.196875000000000000e+01 -1.082910000000000039e+00 -2.209375000000000000e+01 -1.082915000000000072e+00 -2.212500000000000000e+01 -1.082920000000000105e+00 -2.231250000000000000e+01 -1.082925000000000137e+00 -2.237500000000000000e+01 -1.082930000000000170e+00 -2.253125000000000000e+01 -1.082934999999999981e+00 -2.253125000000000000e+01 -1.082940000000000014e+00 -2.271875000000000000e+01 -1.082945000000000046e+00 -2.281250000000000000e+01 -1.082950000000000079e+00 -2.284375000000000000e+01 -1.082955000000000112e+00 -2.296875000000000000e+01 -1.082960000000000145e+00 -2.309375000000000000e+01 -1.082965000000000177e+00 -2.315625000000000000e+01 -1.082969999999999988e+00 -2.321875000000000000e+01 -1.082975000000000021e+00 -2.334375190734863281e+01 -1.082980000000000054e+00 -2.340625000000000000e+01 -1.082985000000000086e+00 -2.350000190734863281e+01 -1.082990000000000119e+00 -2.359375000000000000e+01 -1.082995000000000152e+00 -2.378125190734863281e+01 -1.083000000000000185e+00 -2.381250000000000000e+01 -1.083004999999999995e+00 -2.387500000000000000e+01 -1.083010000000000028e+00 -2.396875000000000000e+01 -1.083015000000000061e+00 -2.409375000000000000e+01 -1.083020000000000094e+00 -2.415625000000000000e+01 -1.083025000000000126e+00 -2.418750000000000000e+01 -1.083030000000000159e+00 -2.434375190734863281e+01 -1.083035000000000192e+00 -2.440625000000000000e+01 -1.083040000000000003e+00 -2.446875000000000000e+01 -1.083045000000000035e+00 -2.453125000000000000e+01 -1.083050000000000068e+00 -2.462500190734863281e+01 -1.083055000000000101e+00 -2.475000000000000000e+01 -1.083060000000000134e+00 -2.484375000000000000e+01 -1.083065000000000166e+00 -2.490625000000000000e+01 -1.083070000000000199e+00 -2.490625000000000000e+01 -1.083075000000000010e+00 -2.500000000000000000e+01 -1.083080000000000043e+00 -2.506250190734863281e+01 -1.083085000000000075e+00 -2.515625000000000000e+01 -1.083090000000000108e+00 -2.515625000000000000e+01 -1.083095000000000141e+00 -2.525000000000000000e+01 -1.083100000000000174e+00 -2.534375000000000000e+01 -1.083104999999999984e+00 -2.550000190734863281e+01 -1.083110000000000017e+00 -2.550000190734863281e+01 -1.083115000000000050e+00 -2.562500000000000000e+01 -1.083120000000000083e+00 -2.568750000000000000e+01 -1.083125000000000115e+00 -2.581250190734863281e+01 -1.083130000000000148e+00 -2.584375000000000000e+01 -1.083135000000000181e+00 -2.590625000000000000e+01 -1.083139999999999992e+00 -2.600000000000000000e+01 -1.083145000000000024e+00 -2.603125000000000000e+01 -1.083150000000000057e+00 -2.609375190734863281e+01 -1.083155000000000090e+00 -2.621875190734863281e+01 -1.083160000000000123e+00 -2.628125000000000000e+01 -1.083165000000000155e+00 -2.634375000000000000e+01 -1.083170000000000188e+00 -2.643750000000000000e+01 -1.083174999999999999e+00 -2.646875000000000000e+01 -1.083180000000000032e+00 -2.656250000000000000e+01 -1.083185000000000064e+00 -2.662500000000000000e+01 -1.083190000000000097e+00 -2.668750190734863281e+01 -1.083195000000000130e+00 -2.678125000000000000e+01 -1.083200000000000163e+00 -2.678125000000000000e+01 -1.083205000000000195e+00 -2.690625000000000000e+01 -1.083210000000000006e+00 -2.690625000000000000e+01 -1.083215000000000039e+00 -2.700000000000000000e+01 -1.083220000000000072e+00 -2.703125000000000000e+01 -1.083225000000000104e+00 -2.706250000000000000e+01 -1.083230000000000137e+00 -2.709375190734863281e+01 -1.083235000000000170e+00 -2.721875000000000000e+01 -1.083239999999999981e+00 -2.725000190734863281e+01 -1.083245000000000013e+00 -2.734375000000000000e+01 -1.083250000000000046e+00 -2.737500190734863281e+01 -1.083255000000000079e+00 -2.750000000000000000e+01 -1.083260000000000112e+00 -2.750000000000000000e+01 -1.083265000000000144e+00 -2.753125190734863281e+01 -1.083270000000000177e+00 -2.759375000000000000e+01 -1.083274999999999988e+00 -2.762500000000000000e+01 -1.083280000000000021e+00 -2.768750190734863281e+01 -1.083285000000000053e+00 -2.778125000000000000e+01 -1.083290000000000086e+00 -2.787500000000000000e+01 -1.083295000000000119e+00 -2.793750000000000000e+01 -1.083300000000000152e+00 -2.790625000000000000e+01 -1.083305000000000184e+00 -2.800000000000000000e+01 -1.083309999999999995e+00 -2.800000000000000000e+01 -1.083315000000000028e+00 -2.809375190734863281e+01 -1.083320000000000061e+00 -2.815625000000000000e+01 -1.083325000000000093e+00 -2.815625000000000000e+01 -1.083330000000000126e+00 -2.825000190734863281e+01 -1.083335000000000159e+00 -2.821875000000000000e+01 -1.083340000000000192e+00 -2.834375000000000000e+01 -1.083345000000000002e+00 -2.837500000000000000e+01 -1.083350000000000035e+00 -2.846875000000000000e+01 -1.083355000000000068e+00 -2.850000000000000000e+01 -1.083360000000000101e+00 -2.853125190734863281e+01 -1.083365000000000133e+00 -2.853125190734863281e+01 -1.083370000000000166e+00 -2.862500000000000000e+01 -1.083375000000000199e+00 -2.862500000000000000e+01 -1.083380000000000010e+00 -2.865625000000000000e+01 -1.083385000000000042e+00 -2.878125000000000000e+01 -1.083390000000000075e+00 -2.881250000000000000e+01 -1.083395000000000108e+00 -2.881250000000000000e+01 -1.083400000000000141e+00 -2.890625000000000000e+01 -1.083405000000000173e+00 -2.893750000000000000e+01 -1.083409999999999984e+00 -2.900000190734863281e+01 -1.083415000000000017e+00 -2.900000190734863281e+01 -1.083420000000000050e+00 -2.903125000000000000e+01 -1.083425000000000082e+00 -2.906250000000000000e+01 -1.083430000000000115e+00 -2.909375000000000000e+01 -1.083435000000000148e+00 -2.912500190734863281e+01 -1.083440000000000181e+00 -2.918750000000000000e+01 -1.083444999999999991e+00 -2.921875000000000000e+01 -1.083450000000000024e+00 -2.928125190734863281e+01 -1.083455000000000057e+00 -2.934375000000000000e+01 -1.083460000000000090e+00 -2.940625190734863281e+01 -1.083465000000000122e+00 -2.943750190734863281e+01 -1.083470000000000155e+00 -2.943750190734863281e+01 -1.083475000000000188e+00 -2.946875000000000000e+01 -1.083479999999999999e+00 -2.956250190734863281e+01 -1.083485000000000031e+00 -2.959375000000000000e+01 -1.083490000000000064e+00 -2.962500000000000000e+01 -1.083495000000000097e+00 -2.962500000000000000e+01 -1.083500000000000130e+00 -2.965625000000000000e+01 -1.083505000000000162e+00 -2.962500000000000000e+01 -1.083510000000000195e+00 -2.965625000000000000e+01 -1.083515000000000006e+00 -2.978125000000000000e+01 -1.083520000000000039e+00 -2.981250000000000000e+01 -1.083525000000000071e+00 -2.987500000000000000e+01 -1.083530000000000104e+00 -2.990625000000000000e+01 -1.083535000000000137e+00 -2.987500000000000000e+01 -1.083540000000000170e+00 -2.996875190734863281e+01 -1.083544999999999980e+00 -2.993750000000000000e+01 -1.083550000000000013e+00 -2.996875190734863281e+01 -1.083555000000000046e+00 -3.006250000000000000e+01 -1.083560000000000079e+00 -3.009375000000000000e+01 -1.083565000000000111e+00 -3.012500190734863281e+01 -1.083570000000000144e+00 -3.021875000000000000e+01 -1.083575000000000177e+00 -3.015625190734863281e+01 -1.083579999999999988e+00 -3.025000000000000000e+01 -1.083585000000000020e+00 -3.028125190734863281e+01 -1.083590000000000053e+00 -3.034375000000000000e+01 -1.083595000000000086e+00 -3.031250000000000000e+01 -1.083600000000000119e+00 -3.040625190734863281e+01 -1.083605000000000151e+00 -3.034375000000000000e+01 -1.083610000000000184e+00 -3.050000000000000000e+01 -1.083614999999999995e+00 -3.046875000000000000e+01 -1.083620000000000028e+00 -3.053125000000000000e+01 -1.083625000000000060e+00 -3.053125000000000000e+01 -1.083630000000000093e+00 -3.059375190734863281e+01 -1.083635000000000126e+00 -3.059375190734863281e+01 -1.083640000000000159e+00 -3.062500000000000000e+01 -1.083645000000000191e+00 -3.065625000000000000e+01 -1.083650000000000002e+00 -3.071875190734863281e+01 -1.083655000000000035e+00 -3.068750000000000000e+01 -1.083660000000000068e+00 -3.078125000000000000e+01 -1.083665000000000100e+00 -3.078125000000000000e+01 -1.083670000000000133e+00 -3.081250000000000000e+01 -1.083675000000000166e+00 -3.081250000000000000e+01 -1.083680000000000199e+00 -3.090625000000000000e+01 -1.083685000000000009e+00 -3.090625000000000000e+01 -1.083690000000000042e+00 -3.087500190734863281e+01 -1.083695000000000075e+00 -3.093750000000000000e+01 -1.083700000000000108e+00 -3.096875000000000000e+01 -1.083705000000000140e+00 -3.100000190734863281e+01 -1.083710000000000173e+00 -3.100000190734863281e+01 -1.083714999999999984e+00 -3.103125000000000000e+01 -1.083720000000000017e+00 -3.109375000000000000e+01 -1.083725000000000049e+00 -3.112500190734863281e+01 -1.083730000000000082e+00 -3.109375000000000000e+01 -1.083735000000000115e+00 -3.118750000000000000e+01 -1.083740000000000148e+00 -3.121875000000000000e+01 -1.083745000000000180e+00 -3.118750000000000000e+01 -1.083749999999999991e+00 -3.125000000000000000e+01 -1.083755000000000024e+00 -3.131250000000000000e+01 -1.083760000000000057e+00 -3.128125190734863281e+01 -1.083765000000000089e+00 -3.125000000000000000e+01 -1.083770000000000122e+00 -3.131250000000000000e+01 -1.083775000000000155e+00 -3.131250000000000000e+01 -1.083780000000000188e+00 -3.140625000000000000e+01 -1.083784999999999998e+00 -3.140625000000000000e+01 -1.083790000000000031e+00 -3.140625000000000000e+01 -1.083795000000000064e+00 -3.146875000000000000e+01 -1.083800000000000097e+00 -3.143750190734863281e+01 -1.083805000000000129e+00 -3.150000000000000000e+01 -1.083810000000000162e+00 -3.153125190734863281e+01 -1.083815000000000195e+00 -3.156250000000000000e+01 -1.083820000000000006e+00 -3.156250000000000000e+01 -1.083825000000000038e+00 -3.159375190734863281e+01 -1.083830000000000071e+00 -3.156250000000000000e+01 -1.083835000000000104e+00 -3.162499809265136719e+01 -1.083840000000000137e+00 -3.168750190734863281e+01 -1.083845000000000169e+00 -3.168750190734863281e+01 -1.083849999999999980e+00 -3.175000190734863281e+01 -1.083855000000000013e+00 -3.171875000000000000e+01 -1.083860000000000046e+00 -3.178125190734863281e+01 -1.083865000000000078e+00 -3.178125190734863281e+01 -1.083870000000000111e+00 -3.178125190734863281e+01 -1.083875000000000144e+00 -3.181250000000000000e+01 -1.083880000000000177e+00 -3.187500000000000000e+01 -1.083884999999999987e+00 -3.184375190734863281e+01 -1.083890000000000020e+00 -3.190625000000000000e+01 -1.083895000000000053e+00 -3.190625000000000000e+01 -1.083900000000000086e+00 -3.193750190734863281e+01 -1.083905000000000118e+00 -3.193750190734863281e+01 -1.083910000000000151e+00 -3.193750190734863281e+01 -1.083915000000000184e+00 -3.193750190734863281e+01 -1.083919999999999995e+00 -3.200000000000000000e+01 -1.083925000000000027e+00 -3.203125000000000000e+01 -1.083930000000000060e+00 -3.209375381469726562e+01 -1.083935000000000093e+00 -3.209375381469726562e+01 -1.083940000000000126e+00 -3.209375381469726562e+01 -1.083945000000000158e+00 -3.206250000000000000e+01 -1.083950000000000191e+00 -3.215625000000000000e+01 -1.083955000000000002e+00 -3.212500000000000000e+01 -1.083960000000000035e+00 -3.218750000000000000e+01 -1.083965000000000067e+00 -3.215625000000000000e+01 -1.083970000000000100e+00 -3.212500000000000000e+01 -1.083975000000000133e+00 -3.221875000000000000e+01 -1.083980000000000166e+00 -3.218750000000000000e+01 -1.083985000000000198e+00 -3.221875000000000000e+01 -1.083990000000000009e+00 -3.221875000000000000e+01 -1.083995000000000042e+00 -3.228125000000000000e+01 -1.084000000000000075e+00 -3.231250000000000000e+01 -1.084005000000000107e+00 -3.237500000000000000e+01 -1.084010000000000140e+00 -3.237500000000000000e+01 -1.084015000000000173e+00 -3.237500000000000000e+01 -1.084019999999999984e+00 -3.240625000000000000e+01 -1.084025000000000016e+00 -3.240625000000000000e+01 -1.084030000000000049e+00 -3.246875000000000000e+01 -1.084035000000000082e+00 -3.243750000000000000e+01 -1.084040000000000115e+00 -3.246875000000000000e+01 -1.084045000000000147e+00 -3.253125000000000000e+01 -1.084050000000000180e+00 -3.256250000000000000e+01 -1.084054999999999991e+00 -3.243750000000000000e+01 -1.084060000000000024e+00 -3.256250000000000000e+01 -1.084065000000000056e+00 -3.256250000000000000e+01 -1.084070000000000089e+00 -3.259375000000000000e+01 -1.084075000000000122e+00 -3.262500000000000000e+01 -1.084080000000000155e+00 -3.265625381469726562e+01 -1.084085000000000187e+00 -3.262500000000000000e+01 -1.084089999999999998e+00 -3.265625381469726562e+01 -1.084095000000000031e+00 -3.265625381469726562e+01 -1.084100000000000064e+00 -3.268750000000000000e+01 -1.084105000000000096e+00 -3.271875000000000000e+01 -1.084110000000000129e+00 -3.271875000000000000e+01 -1.084115000000000162e+00 -3.275000000000000000e+01 -1.084120000000000195e+00 -3.278125000000000000e+01 -1.084125000000000005e+00 -3.275000000000000000e+01 -1.084130000000000038e+00 -3.284375000000000000e+01 -1.084135000000000071e+00 -3.287500000000000000e+01 -1.084140000000000104e+00 -3.275000000000000000e+01 -1.084145000000000136e+00 -3.284375000000000000e+01 -1.084150000000000169e+00 -3.284375000000000000e+01 -1.084154999999999980e+00 -3.284375000000000000e+01 -1.084160000000000013e+00 -3.284375000000000000e+01 -1.084165000000000045e+00 -3.290625000000000000e+01 -1.084170000000000078e+00 -3.293750000000000000e+01 -1.084175000000000111e+00 -3.296875381469726562e+01 -1.084180000000000144e+00 -3.300000000000000000e+01 -1.084185000000000176e+00 -3.293750000000000000e+01 -1.084189999999999987e+00 -3.300000000000000000e+01 -1.084195000000000020e+00 -3.303125000000000000e+01 -1.084200000000000053e+00 -3.303125000000000000e+01 -1.084205000000000085e+00 -3.296875381469726562e+01 -1.084210000000000118e+00 -3.303125000000000000e+01 -1.084215000000000151e+00 -3.309375000000000000e+01 -1.084220000000000184e+00 -3.303125000000000000e+01 -1.084224999999999994e+00 -3.315625000000000000e+01 -1.084230000000000027e+00 -3.309375000000000000e+01 -1.084235000000000060e+00 -3.312500381469726562e+01 -1.084240000000000093e+00 -3.315625000000000000e+01 -1.084245000000000125e+00 -3.318750000000000000e+01 -1.084250000000000158e+00 -3.312500381469726562e+01 -1.084255000000000191e+00 -3.328125000000000000e+01 -1.084260000000000002e+00 -3.318750000000000000e+01 -1.084265000000000034e+00 -3.325000000000000000e+01 -1.084270000000000067e+00 -3.318750000000000000e+01 -1.084275000000000100e+00 -3.328125000000000000e+01 -1.084280000000000133e+00 -3.328125000000000000e+01 -1.084285000000000165e+00 -3.325000000000000000e+01 -1.084290000000000198e+00 -3.331250000000000000e+01 -1.084295000000000009e+00 -3.334375000000000000e+01 -1.084300000000000042e+00 -3.334375000000000000e+01 -1.084305000000000074e+00 -3.334375000000000000e+01 -1.084310000000000107e+00 -3.340625000000000000e+01 -1.084315000000000140e+00 -3.346875000000000000e+01 -1.084320000000000173e+00 -3.350000000000000000e+01 -1.084324999999999983e+00 -3.346875000000000000e+01 -1.084330000000000016e+00 -3.350000000000000000e+01 -1.084335000000000049e+00 -3.350000000000000000e+01 -1.084340000000000082e+00 -3.353125381469726562e+01 -1.084345000000000114e+00 -3.346875000000000000e+01 -1.084350000000000147e+00 -3.353125381469726562e+01 -1.084355000000000180e+00 -3.356250000000000000e+01 -1.084359999999999991e+00 -3.353125381469726562e+01 -1.084365000000000023e+00 -3.359375000000000000e+01 -1.084370000000000056e+00 -3.359375000000000000e+01 -1.084375000000000089e+00 -3.359375000000000000e+01 -1.084380000000000122e+00 -3.362500000000000000e+01 -1.084385000000000154e+00 -3.359375000000000000e+01 -1.084390000000000187e+00 -3.365625000000000000e+01 -1.084394999999999998e+00 -3.362500000000000000e+01 -1.084400000000000031e+00 -3.365625000000000000e+01 -1.084405000000000063e+00 -3.368750381469726562e+01 -1.084410000000000096e+00 -3.368750381469726562e+01 -1.084415000000000129e+00 -3.365625000000000000e+01 -1.084420000000000162e+00 -3.375000000000000000e+01 -1.084425000000000194e+00 -3.384375381469726562e+01 -1.084430000000000005e+00 -3.371875000000000000e+01 -1.084435000000000038e+00 -3.378125000000000000e+01 -1.084440000000000071e+00 -3.375000000000000000e+01 -1.084445000000000103e+00 -3.381250000000000000e+01 -1.084450000000000136e+00 -3.378125000000000000e+01 -1.084455000000000169e+00 -3.384375381469726562e+01 -1.084459999999999980e+00 -3.390625000000000000e+01 -1.084465000000000012e+00 -3.384375381469726562e+01 -1.084470000000000045e+00 -3.387500000000000000e+01 -1.084475000000000078e+00 -3.387500000000000000e+01 -1.084480000000000111e+00 -3.390625000000000000e+01 -1.084485000000000143e+00 -3.390625000000000000e+01 -1.084490000000000176e+00 -3.390625000000000000e+01 -1.084494999999999987e+00 -3.393750000000000000e+01 -1.084500000000000020e+00 -3.393750000000000000e+01 -1.084505000000000052e+00 -3.396875000000000000e+01 -1.084510000000000085e+00 -3.393750000000000000e+01 -1.084515000000000118e+00 -3.393750000000000000e+01 -1.084520000000000151e+00 -3.400000000000000000e+01 -1.084525000000000183e+00 -3.403125000000000000e+01 -1.084529999999999994e+00 -3.403125000000000000e+01 -1.084535000000000027e+00 -3.403125000000000000e+01 -1.084540000000000060e+00 -3.406250000000000000e+01 -1.084545000000000092e+00 -3.412500000000000000e+01 -1.084550000000000125e+00 -3.409375381469726562e+01 -1.084555000000000158e+00 -3.409375381469726562e+01 -1.084560000000000191e+00 -3.415625000000000000e+01 -1.084565000000000001e+00 -3.415625000000000000e+01 -1.084570000000000034e+00 -3.418750000000000000e+01 -1.084575000000000067e+00 -3.418750000000000000e+01 -1.084580000000000100e+00 -3.421875000000000000e+01 -1.084585000000000132e+00 -3.421875000000000000e+01 -1.084590000000000165e+00 -3.428125000000000000e+01 -1.084595000000000198e+00 -3.421875000000000000e+01 -1.084600000000000009e+00 -3.425000381469726562e+01 -1.084605000000000041e+00 -3.421875000000000000e+01 -1.084610000000000074e+00 -3.428125000000000000e+01 -1.084615000000000107e+00 -3.425000381469726562e+01 -1.084620000000000140e+00 -3.428125000000000000e+01 -1.084625000000000172e+00 -3.428125000000000000e+01 -1.084629999999999983e+00 -3.434375000000000000e+01 -1.084635000000000016e+00 -3.434375000000000000e+01 -1.084640000000000049e+00 -3.434375000000000000e+01 -1.084645000000000081e+00 -3.434375000000000000e+01 -1.084650000000000114e+00 -3.434375000000000000e+01 -1.084655000000000147e+00 -3.440625381469726562e+01 -1.084660000000000180e+00 -3.434375000000000000e+01 -1.084664999999999990e+00 -3.434375000000000000e+01 -1.084670000000000023e+00 -3.437500000000000000e+01 -1.084675000000000056e+00 -3.443750000000000000e+01 -1.084680000000000089e+00 -3.443750000000000000e+01 -1.084685000000000121e+00 -3.443750000000000000e+01 -1.084690000000000154e+00 -3.446875000000000000e+01 -1.084695000000000187e+00 -3.446875000000000000e+01 -1.084699999999999998e+00 -3.443750000000000000e+01 -1.084705000000000030e+00 -3.446875000000000000e+01 -1.084710000000000063e+00 -3.453125000000000000e+01 -1.084715000000000096e+00 -3.450000000000000000e+01 -1.084720000000000129e+00 -3.450000000000000000e+01 -1.084725000000000161e+00 -3.446875000000000000e+01 -1.084730000000000194e+00 -3.450000000000000000e+01 -1.084735000000000005e+00 -3.453125000000000000e+01 -1.084740000000000038e+00 -3.456250381469726562e+01 -1.084745000000000070e+00 -3.453125000000000000e+01 -1.084750000000000103e+00 -3.456250381469726562e+01 -1.084755000000000136e+00 -3.456250381469726562e+01 -1.084760000000000169e+00 -3.462500000000000000e+01 -1.084764999999999979e+00 -3.459375000000000000e+01 -1.084770000000000012e+00 -3.465625000000000000e+01 -1.084775000000000045e+00 -3.465625000000000000e+01 -1.084780000000000078e+00 -3.459375000000000000e+01 -1.084785000000000110e+00 -3.468750000000000000e+01 -1.084790000000000143e+00 -3.468750000000000000e+01 -1.084795000000000176e+00 -3.468750000000000000e+01 -1.084799999999999986e+00 -3.465625000000000000e+01 -1.084805000000000019e+00 -3.475000000000000000e+01 -1.084810000000000052e+00 -3.468750000000000000e+01 -1.084815000000000085e+00 -3.471875000000000000e+01 -1.084820000000000118e+00 -3.475000000000000000e+01 -1.084825000000000150e+00 -3.471875000000000000e+01 -1.084830000000000183e+00 -3.478125000000000000e+01 -1.084834999999999994e+00 -3.475000000000000000e+01 -1.084840000000000027e+00 -3.481250381469726562e+01 -1.084845000000000059e+00 -3.478125000000000000e+01 -1.084850000000000092e+00 -3.478125000000000000e+01 -1.084855000000000125e+00 -3.475000000000000000e+01 -1.084860000000000158e+00 -3.484375000000000000e+01 -1.084865000000000190e+00 -3.481250381469726562e+01 -1.084870000000000001e+00 -3.481250381469726562e+01 -1.084875000000000034e+00 -3.487500000000000000e+01 -1.084880000000000067e+00 -3.490625000000000000e+01 -1.084885000000000099e+00 -3.487500000000000000e+01 -1.084890000000000132e+00 -3.487500000000000000e+01 -1.084895000000000165e+00 -3.490625000000000000e+01 -1.084900000000000198e+00 -3.493750000000000000e+01 -1.084905000000000008e+00 -3.496875381469726562e+01 -1.084910000000000041e+00 -3.496875381469726562e+01 -1.084915000000000074e+00 -3.493750000000000000e+01 -1.084920000000000107e+00 -3.496875381469726562e+01 -1.084925000000000139e+00 -3.493750000000000000e+01 -1.084930000000000172e+00 -3.496875381469726562e+01 -1.084934999999999983e+00 -3.496875381469726562e+01 -1.084940000000000015e+00 -3.500000000000000000e+01 -1.084945000000000048e+00 -3.503125000000000000e+01 -1.084950000000000081e+00 -3.500000000000000000e+01 -1.084955000000000114e+00 -3.500000000000000000e+01 -1.084960000000000147e+00 -3.503125000000000000e+01 -1.084965000000000179e+00 -3.500000000000000000e+01 -1.084969999999999990e+00 -3.500000000000000000e+01 -1.084975000000000023e+00 -3.506250000000000000e+01 -1.084980000000000055e+00 -3.509375000000000000e+01 -1.084985000000000088e+00 -3.506250000000000000e+01 -1.084990000000000121e+00 -3.509375000000000000e+01 -1.084995000000000154e+00 -3.506250000000000000e+01 -1.085000000000000187e+00 -3.506250000000000000e+01 -1.085004999999999997e+00 -3.509375000000000000e+01 -1.085010000000000030e+00 -3.509375000000000000e+01 -1.085015000000000063e+00 -3.509375000000000000e+01 -1.085020000000000095e+00 -3.521875000000000000e+01 -1.085025000000000128e+00 -3.512500381469726562e+01 -1.085030000000000161e+00 -3.512500381469726562e+01 -1.085035000000000194e+00 -3.515625000000000000e+01 -1.085040000000000004e+00 -3.512500381469726562e+01 -1.085045000000000037e+00 -3.515625000000000000e+01 -1.085050000000000070e+00 -3.518750000000000000e+01 -1.085055000000000103e+00 -3.518750000000000000e+01 -1.085060000000000136e+00 -3.521875000000000000e+01 -1.085065000000000168e+00 -3.518750000000000000e+01 -1.085069999999999979e+00 -3.525000000000000000e+01 -1.085075000000000012e+00 -3.528125381469726562e+01 -1.085080000000000044e+00 -3.528125381469726562e+01 -1.085085000000000077e+00 -3.534375000000000000e+01 -1.085090000000000110e+00 -3.534375000000000000e+01 -1.085095000000000143e+00 -3.528125381469726562e+01 -1.085100000000000176e+00 -3.534375000000000000e+01 -1.085104999999999986e+00 -3.528125381469726562e+01 -1.085110000000000019e+00 -3.534375000000000000e+01 -1.085115000000000052e+00 -3.537500000000000000e+01 -1.085120000000000084e+00 -3.531250000000000000e+01 -1.085125000000000117e+00 -3.531250000000000000e+01 -1.085130000000000150e+00 -3.537500000000000000e+01 -1.085135000000000183e+00 -3.537500000000000000e+01 -1.085139999999999993e+00 -3.534375000000000000e+01 -1.085145000000000026e+00 -3.540625000000000000e+01 -1.085150000000000059e+00 -3.537500000000000000e+01 -1.085155000000000092e+00 -3.540625000000000000e+01 -1.085160000000000124e+00 -3.543750381469726562e+01 -1.085165000000000157e+00 -3.543750381469726562e+01 -1.085170000000000190e+00 -3.543750381469726562e+01 -1.085175000000000001e+00 -3.537500000000000000e+01 -1.085180000000000033e+00 -3.550000000000000000e+01 -1.085185000000000066e+00 -3.543750381469726562e+01 -1.085190000000000099e+00 -3.540625000000000000e+01 -1.085195000000000132e+00 -3.550000000000000000e+01 -1.085200000000000164e+00 -3.546875000000000000e+01 -1.085205000000000197e+00 -3.553125381469726562e+01 -1.085210000000000008e+00 -3.553125381469726562e+01 -1.085215000000000041e+00 -3.559375000000000000e+01 -1.085220000000000073e+00 -3.553125381469726562e+01 -1.085225000000000106e+00 -3.553125381469726562e+01 -1.085230000000000139e+00 -3.556250000000000000e+01 -1.085235000000000172e+00 -3.553125381469726562e+01 -1.085239999999999982e+00 -3.559375000000000000e+01 -1.085245000000000015e+00 -3.556250000000000000e+01 -1.085250000000000048e+00 -3.556250000000000000e+01 -1.085255000000000081e+00 -3.556250000000000000e+01 -1.085260000000000113e+00 -3.559375000000000000e+01 -1.085265000000000146e+00 -3.559375000000000000e+01 -1.085270000000000179e+00 -3.556250000000000000e+01 -1.085274999999999990e+00 -3.559375000000000000e+01 -1.085280000000000022e+00 -3.559375000000000000e+01 -1.085285000000000055e+00 -3.565625000000000000e+01 -1.085290000000000088e+00 -3.559375000000000000e+01 -1.085295000000000121e+00 -3.562500000000000000e+01 -1.085300000000000153e+00 -3.568750381469726562e+01 -1.085305000000000186e+00 -3.565625000000000000e+01 -1.085309999999999997e+00 -3.565625000000000000e+01 -1.085315000000000030e+00 -3.571875000000000000e+01 -1.085320000000000062e+00 -3.568750381469726562e+01 -1.085325000000000095e+00 -3.568750381469726562e+01 -1.085330000000000128e+00 -3.571875000000000000e+01 -1.085335000000000161e+00 -3.571875000000000000e+01 -1.085340000000000193e+00 -3.571875000000000000e+01 -1.085345000000000004e+00 -3.571875000000000000e+01 -1.085350000000000037e+00 -3.568750381469726562e+01 -1.085355000000000070e+00 -3.571875000000000000e+01 -1.085360000000000102e+00 -3.568750381469726562e+01 -1.085365000000000135e+00 -3.578125000000000000e+01 -1.085370000000000168e+00 -3.578125000000000000e+01 -1.085374999999999979e+00 -3.581250000000000000e+01 -1.085380000000000011e+00 -3.571875000000000000e+01 -1.085385000000000044e+00 -3.578125000000000000e+01 -1.085390000000000077e+00 -3.578125000000000000e+01 -1.085395000000000110e+00 -3.584375381469726562e+01 -1.085400000000000142e+00 -3.581250000000000000e+01 -1.085405000000000175e+00 -3.584375381469726562e+01 -1.085409999999999986e+00 -3.584375381469726562e+01 -1.085415000000000019e+00 -3.584375381469726562e+01 -1.085420000000000051e+00 -3.584375381469726562e+01 -1.085425000000000084e+00 -3.584375381469726562e+01 -1.085430000000000117e+00 -3.593750000000000000e+01 -1.085435000000000150e+00 -3.590625000000000000e+01 -1.085440000000000182e+00 -3.584375381469726562e+01 -1.085444999999999993e+00 -3.587500000000000000e+01 -1.085450000000000026e+00 -3.584375381469726562e+01 -1.085455000000000059e+00 -3.587500000000000000e+01 -1.085460000000000091e+00 -3.590625000000000000e+01 -1.085465000000000124e+00 -3.587500000000000000e+01 -1.085470000000000157e+00 -3.587500000000000000e+01 -1.085475000000000190e+00 -3.587500000000000000e+01 -1.085480000000000000e+00 -3.596875000000000000e+01 -1.085485000000000033e+00 -3.600000381469726562e+01 -1.085490000000000066e+00 -3.596875000000000000e+01 -1.085495000000000099e+00 -3.590625000000000000e+01 -1.085500000000000131e+00 -3.593750000000000000e+01 -1.085505000000000164e+00 -3.590625000000000000e+01 -1.085510000000000197e+00 -3.593750000000000000e+01 -1.085515000000000008e+00 -3.596875000000000000e+01 -1.085520000000000040e+00 -3.603125000000000000e+01 -1.085525000000000073e+00 -3.603125000000000000e+01 -1.085530000000000106e+00 -3.600000381469726562e+01 -1.085535000000000139e+00 -3.596875000000000000e+01 -1.085540000000000171e+00 -3.603125000000000000e+01 -1.085544999999999982e+00 -3.603125000000000000e+01 -1.085550000000000015e+00 -3.606250000000000000e+01 -1.085555000000000048e+00 -3.603125000000000000e+01 -1.085560000000000080e+00 -3.612500000000000000e+01 -1.085565000000000113e+00 -3.603125000000000000e+01 -1.085570000000000146e+00 -3.612500000000000000e+01 -1.085575000000000179e+00 -3.603125000000000000e+01 -1.085579999999999989e+00 -3.603125000000000000e+01 -1.085585000000000022e+00 -3.609375000000000000e+01 -1.085590000000000055e+00 -3.606250000000000000e+01 -1.085595000000000088e+00 -3.609375000000000000e+01 -1.085600000000000120e+00 -3.612500000000000000e+01 -1.085605000000000153e+00 -3.606250000000000000e+01 -1.085610000000000186e+00 -3.615625381469726562e+01 -1.085614999999999997e+00 -3.615625381469726562e+01 -1.085620000000000029e+00 -3.618750000000000000e+01 -1.085625000000000062e+00 -3.618750000000000000e+01 -1.085630000000000095e+00 -3.615625381469726562e+01 -1.085635000000000128e+00 -3.615625381469726562e+01 -1.085640000000000160e+00 -3.615625381469726562e+01 -1.085645000000000193e+00 -3.618750000000000000e+01 -1.085650000000000004e+00 -3.618750000000000000e+01 -1.085655000000000037e+00 -3.618750000000000000e+01 -1.085660000000000069e+00 -3.621875000000000000e+01 -1.085665000000000102e+00 -3.625000000000000000e+01 -1.085670000000000135e+00 -3.628125000000000000e+01 -1.085675000000000168e+00 -3.628125000000000000e+01 -1.085679999999999978e+00 -3.615625381469726562e+01 -1.085685000000000011e+00 -3.628125000000000000e+01 -1.085690000000000044e+00 -3.628125000000000000e+01 -1.085695000000000077e+00 -3.621875000000000000e+01 -1.085700000000000109e+00 -3.628125000000000000e+01 -1.085705000000000142e+00 -3.625000000000000000e+01 -1.085710000000000175e+00 -3.628125000000000000e+01 -1.085714999999999986e+00 -3.631250000000000000e+01 -1.085720000000000018e+00 -3.634375000000000000e+01 -1.085725000000000051e+00 -3.631250000000000000e+01 -1.085730000000000084e+00 -3.634375000000000000e+01 -1.085735000000000117e+00 -3.634375000000000000e+01 -1.085740000000000149e+00 -3.631250000000000000e+01 -1.085745000000000182e+00 -3.640625381469726562e+01 -1.085749999999999993e+00 -3.628125000000000000e+01 -1.085755000000000026e+00 -3.631250000000000000e+01 -1.085760000000000058e+00 -3.637500000000000000e+01 -1.085765000000000091e+00 -3.640625381469726562e+01 -1.085770000000000124e+00 -3.631250000000000000e+01 -1.085775000000000157e+00 -3.634375000000000000e+01 -1.085780000000000189e+00 -3.640625381469726562e+01 -1.085785000000000000e+00 -3.640625381469726562e+01 -1.085790000000000033e+00 -3.634375000000000000e+01 -1.085795000000000066e+00 -3.643750000000000000e+01 -1.085800000000000098e+00 -3.631250000000000000e+01 -1.085805000000000131e+00 -3.646875000000000000e+01 -1.085810000000000164e+00 -3.637500000000000000e+01 -1.085815000000000197e+00 -3.640625381469726562e+01 -1.085820000000000007e+00 -3.643750000000000000e+01 -1.085825000000000040e+00 -3.643750000000000000e+01 -1.085830000000000073e+00 -3.643750000000000000e+01 -1.085835000000000106e+00 -3.643750000000000000e+01 -1.085840000000000138e+00 -3.646875000000000000e+01 -1.085845000000000171e+00 -3.646875000000000000e+01 -1.085849999999999982e+00 -3.646875000000000000e+01 -1.085855000000000015e+00 -3.643750000000000000e+01 -1.085860000000000047e+00 -3.646875000000000000e+01 -1.085865000000000080e+00 -3.650000000000000000e+01 -1.085870000000000113e+00 -3.646875000000000000e+01 -1.085875000000000146e+00 -3.646875000000000000e+01 -1.085880000000000178e+00 -3.653125000000000000e+01 -1.085884999999999989e+00 -3.650000000000000000e+01 -1.085890000000000022e+00 -3.653125000000000000e+01 -1.085895000000000055e+00 -3.650000000000000000e+01 -1.085900000000000087e+00 -3.646875000000000000e+01 -1.085905000000000120e+00 -3.653125000000000000e+01 -1.085910000000000153e+00 -3.646875000000000000e+01 -1.085915000000000186e+00 -3.650000000000000000e+01 -1.085919999999999996e+00 -3.656250381469726562e+01 -1.085925000000000029e+00 -3.653125000000000000e+01 -1.085930000000000062e+00 -3.653125000000000000e+01 -1.085935000000000095e+00 -3.653125000000000000e+01 -1.085940000000000127e+00 -3.653125000000000000e+01 -1.085945000000000160e+00 -3.650000000000000000e+01 -1.085950000000000193e+00 -3.653125000000000000e+01 -1.085955000000000004e+00 -3.656250381469726562e+01 -1.085960000000000036e+00 -3.653125000000000000e+01 -1.085965000000000069e+00 -3.659375000000000000e+01 -1.085970000000000102e+00 -3.653125000000000000e+01 -1.085975000000000135e+00 -3.662500000000000000e+01 -1.085980000000000167e+00 -3.659375000000000000e+01 -1.085984999999999978e+00 -3.662500000000000000e+01 -1.085990000000000011e+00 -3.662500000000000000e+01 -1.085995000000000044e+00 -3.668750000000000000e+01 -1.086000000000000076e+00 -3.653125000000000000e+01 -1.086005000000000109e+00 -3.653125000000000000e+01 -1.086010000000000142e+00 -3.665625000000000000e+01 -1.086015000000000175e+00 -3.665625000000000000e+01 -1.086019999999999985e+00 -3.668750000000000000e+01 -1.086025000000000018e+00 -3.665625000000000000e+01 -1.086030000000000051e+00 -3.668750000000000000e+01 -1.086035000000000084e+00 -3.671875381469726562e+01 -1.086040000000000116e+00 -3.662500000000000000e+01 -1.086045000000000149e+00 -3.668750000000000000e+01 -1.086050000000000182e+00 -3.665625000000000000e+01 -1.086054999999999993e+00 -3.671875381469726562e+01 -1.086060000000000025e+00 -3.668750000000000000e+01 -1.086065000000000058e+00 -3.668750000000000000e+01 -1.086070000000000091e+00 -3.668750000000000000e+01 -1.086075000000000124e+00 -3.671875381469726562e+01 -1.086080000000000156e+00 -3.675000000000000000e+01 -1.086085000000000189e+00 -3.671875381469726562e+01 -1.086090000000000000e+00 -3.675000000000000000e+01 -1.086095000000000033e+00 -3.678125000000000000e+01 -1.086100000000000065e+00 -3.675000000000000000e+01 -1.086105000000000098e+00 -3.678125000000000000e+01 -1.086110000000000131e+00 -3.684375000000000000e+01 -1.086115000000000164e+00 -3.681250000000000000e+01 -1.086120000000000196e+00 -3.681250000000000000e+01 -1.086125000000000007e+00 -3.678125000000000000e+01 -1.086130000000000040e+00 -3.678125000000000000e+01 -1.086135000000000073e+00 -3.681250000000000000e+01 -1.086140000000000105e+00 -3.687500381469726562e+01 -1.086145000000000138e+00 -3.681250000000000000e+01 -1.086150000000000171e+00 -3.684375000000000000e+01 -1.086154999999999982e+00 -3.684375000000000000e+01 -1.086160000000000014e+00 -3.684375000000000000e+01 -1.086165000000000047e+00 -3.690625000000000000e+01 -1.086170000000000080e+00 -3.690625000000000000e+01 -1.086175000000000113e+00 -3.690625000000000000e+01 -1.086180000000000145e+00 -3.687500381469726562e+01 -1.086185000000000178e+00 -3.681250000000000000e+01 -1.086189999999999989e+00 -3.690625000000000000e+01 -1.086195000000000022e+00 -3.690625000000000000e+01 -1.086200000000000054e+00 -3.693750000000000000e+01 -1.086205000000000087e+00 -3.693750000000000000e+01 -1.086210000000000120e+00 -3.690625000000000000e+01 -1.086215000000000153e+00 -3.690625000000000000e+01 -1.086220000000000185e+00 -3.693750000000000000e+01 -1.086224999999999996e+00 -3.696875000000000000e+01 -1.086230000000000029e+00 -3.696875000000000000e+01 -1.086235000000000062e+00 -3.696875000000000000e+01 -1.086240000000000094e+00 -3.700000000000000000e+01 -1.086245000000000127e+00 -3.696875000000000000e+01 -1.086250000000000160e+00 -3.690625000000000000e+01 -1.086255000000000193e+00 -3.696875000000000000e+01 -1.086260000000000003e+00 -3.690625000000000000e+01 -1.086265000000000036e+00 -3.693750000000000000e+01 -1.086270000000000069e+00 -3.693750000000000000e+01 -1.086275000000000102e+00 -3.700000000000000000e+01 -1.086280000000000134e+00 -3.696875000000000000e+01 -1.086285000000000167e+00 -3.696875000000000000e+01 -1.086290000000000200e+00 -3.700000000000000000e+01 -1.086295000000000011e+00 -3.703125381469726562e+01 -1.086300000000000043e+00 -3.700000000000000000e+01 -1.086305000000000076e+00 -3.696875000000000000e+01 -1.086310000000000109e+00 -3.696875000000000000e+01 -1.086315000000000142e+00 -3.700000000000000000e+01 -1.086320000000000174e+00 -3.700000000000000000e+01 -1.086324999999999985e+00 -3.700000000000000000e+01 -1.086330000000000018e+00 -3.703125381469726562e+01 -1.086335000000000051e+00 -3.700000000000000000e+01 -1.086340000000000083e+00 -3.700000000000000000e+01 -1.086345000000000116e+00 -3.703125381469726562e+01 -1.086350000000000149e+00 -3.703125381469726562e+01 -1.086355000000000182e+00 -3.706250000000000000e+01 -1.086359999999999992e+00 -3.700000000000000000e+01 -1.086365000000000025e+00 -3.703125381469726562e+01 -1.086370000000000058e+00 -3.703125381469726562e+01 -1.086375000000000091e+00 -3.703125381469726562e+01 -1.086380000000000123e+00 -3.709375000000000000e+01 -1.086385000000000156e+00 -3.709375000000000000e+01 -1.086390000000000189e+00 -3.703125381469726562e+01 -1.086395000000000000e+00 -3.709375000000000000e+01 -1.086400000000000032e+00 -3.709375000000000000e+01 -1.086405000000000065e+00 -3.709375000000000000e+01 -1.086410000000000098e+00 -3.709375000000000000e+01 -1.086415000000000131e+00 -3.709375000000000000e+01 -1.086420000000000163e+00 -3.712500381469726562e+01 -1.086425000000000196e+00 -3.706250000000000000e+01 -1.086430000000000007e+00 -3.709375000000000000e+01 -1.086435000000000040e+00 -3.703125381469726562e+01 -1.086440000000000072e+00 -3.709375000000000000e+01 -1.086445000000000105e+00 -3.715625000000000000e+01 -1.086450000000000138e+00 -3.709375000000000000e+01 -1.086455000000000171e+00 -3.709375000000000000e+01 -1.086459999999999981e+00 -3.715625000000000000e+01 -1.086465000000000014e+00 -3.715625000000000000e+01 -1.086470000000000047e+00 -3.709375000000000000e+01 -1.086475000000000080e+00 -3.715625000000000000e+01 -1.086480000000000112e+00 -3.715625000000000000e+01 -1.086485000000000145e+00 -3.715625000000000000e+01 -1.086490000000000178e+00 -3.718750000000000000e+01 -1.086494999999999989e+00 -3.715625000000000000e+01 -1.086500000000000021e+00 -3.712500381469726562e+01 -1.086505000000000054e+00 -3.721875000000000000e+01 -1.086510000000000087e+00 -3.718750000000000000e+01 -1.086515000000000120e+00 -3.718750000000000000e+01 -1.086520000000000152e+00 -3.721875000000000000e+01 -1.086525000000000185e+00 -3.718750000000000000e+01 -1.086529999999999996e+00 -3.718750000000000000e+01 -1.086535000000000029e+00 -3.728125381469726562e+01 -1.086540000000000061e+00 -3.721875000000000000e+01 -1.086545000000000094e+00 -3.725000000000000000e+01 -1.086550000000000127e+00 -3.728125381469726562e+01 -1.086555000000000160e+00 -3.734375000000000000e+01 -1.086560000000000192e+00 -3.728125381469726562e+01 -1.086565000000000003e+00 -3.731250000000000000e+01 -1.086570000000000036e+00 -3.728125381469726562e+01 -1.086575000000000069e+00 -3.725000000000000000e+01 -1.086580000000000101e+00 -3.737500000000000000e+01 -1.086585000000000134e+00 -3.731250000000000000e+01 -1.086590000000000167e+00 -3.728125381469726562e+01 -1.086595000000000200e+00 -3.731250000000000000e+01 -1.086600000000000010e+00 -3.728125381469726562e+01 -1.086605000000000043e+00 -3.734375000000000000e+01 -1.086610000000000076e+00 -3.731250000000000000e+01 -1.086615000000000109e+00 -3.734375000000000000e+01 -1.086620000000000141e+00 -3.731250000000000000e+01 -1.086625000000000174e+00 -3.737500000000000000e+01 -1.086629999999999985e+00 -3.728125381469726562e+01 -1.086635000000000018e+00 -3.728125381469726562e+01 -1.086640000000000050e+00 -3.731250000000000000e+01 -1.086645000000000083e+00 -3.731250000000000000e+01 -1.086650000000000116e+00 -3.734375000000000000e+01 -1.086655000000000149e+00 -3.728125381469726562e+01 -1.086660000000000181e+00 -3.737500000000000000e+01 -1.086664999999999992e+00 -3.734375000000000000e+01 -1.086670000000000025e+00 -3.734375000000000000e+01 -1.086675000000000058e+00 -3.731250000000000000e+01 -1.086680000000000090e+00 -3.737500000000000000e+01 -1.086685000000000123e+00 -3.734375000000000000e+01 -1.086690000000000156e+00 -3.740625000000000000e+01 -1.086695000000000189e+00 -3.734375000000000000e+01 -1.086699999999999999e+00 -3.734375000000000000e+01 -1.086705000000000032e+00 -3.734375000000000000e+01 -1.086710000000000065e+00 -3.737500000000000000e+01 -1.086715000000000098e+00 -3.737500000000000000e+01 -1.086720000000000130e+00 -3.737500000000000000e+01 -1.086725000000000163e+00 -3.743750381469726562e+01 -1.086730000000000196e+00 -3.734375000000000000e+01 -1.086735000000000007e+00 -3.737500000000000000e+01 -1.086740000000000039e+00 -3.743750381469726562e+01 -1.086745000000000072e+00 -3.737500000000000000e+01 -1.086750000000000105e+00 -3.737500000000000000e+01 -1.086755000000000138e+00 -3.737500000000000000e+01 -1.086760000000000170e+00 -3.737500000000000000e+01 -1.086764999999999981e+00 -3.737500000000000000e+01 -1.086770000000000014e+00 -3.737500000000000000e+01 -1.086775000000000047e+00 -3.737500000000000000e+01 -1.086780000000000079e+00 -3.746875000000000000e+01 -1.086785000000000112e+00 -3.740625000000000000e+01 -1.086790000000000145e+00 -3.740625000000000000e+01 -1.086795000000000178e+00 -3.743750381469726562e+01 -1.086799999999999988e+00 -3.743750381469726562e+01 -1.086805000000000021e+00 -3.740625000000000000e+01 -1.086810000000000054e+00 -3.740625000000000000e+01 -1.086815000000000087e+00 -3.743750381469726562e+01 -1.086820000000000119e+00 -3.750000000000000000e+01 -1.086825000000000152e+00 -3.743750381469726562e+01 -1.086830000000000185e+00 -3.753125000000000000e+01 -1.086834999999999996e+00 -3.746875000000000000e+01 -1.086840000000000028e+00 -3.750000000000000000e+01 -1.086845000000000061e+00 -3.753125000000000000e+01 -1.086850000000000094e+00 -3.753125000000000000e+01 -1.086855000000000127e+00 -3.750000000000000000e+01 -1.086860000000000159e+00 -3.753125000000000000e+01 -1.086865000000000192e+00 -3.756250000000000000e+01 -1.086870000000000003e+00 -3.750000000000000000e+01 -1.086875000000000036e+00 -3.759375381469726562e+01 -1.086880000000000068e+00 -3.762500000000000000e+01 -1.086885000000000101e+00 -3.756250000000000000e+01 -1.086890000000000134e+00 -3.756250000000000000e+01 -1.086895000000000167e+00 -3.759375381469726562e+01 -1.086900000000000199e+00 -3.759375381469726562e+01 -1.086905000000000010e+00 -3.756250000000000000e+01 -1.086910000000000043e+00 -3.756250000000000000e+01 -1.086915000000000076e+00 -3.750000000000000000e+01 -1.086920000000000108e+00 -3.756250000000000000e+01 -1.086925000000000141e+00 -3.759375381469726562e+01 -1.086930000000000174e+00 -3.756250000000000000e+01 -1.086934999999999985e+00 -3.759375381469726562e+01 -1.086940000000000017e+00 -3.762500000000000000e+01 -1.086945000000000050e+00 -3.762500000000000000e+01 -1.086950000000000083e+00 -3.756250000000000000e+01 -1.086955000000000116e+00 -3.762500000000000000e+01 -1.086960000000000148e+00 -3.762500000000000000e+01 -1.086965000000000181e+00 -3.759375381469726562e+01 -1.086969999999999992e+00 -3.759375381469726562e+01 -1.086975000000000025e+00 -3.762500000000000000e+01 -1.086980000000000057e+00 -3.765625000000000000e+01 -1.086985000000000090e+00 -3.765625000000000000e+01 -1.086990000000000123e+00 -3.762500000000000000e+01 -1.086995000000000156e+00 -3.768750000000000000e+01 -1.087000000000000188e+00 -3.771875000000000000e+01 -1.087004999999999999e+00 -3.762500000000000000e+01 -1.087010000000000032e+00 -3.771875000000000000e+01 -1.087015000000000065e+00 -3.768750000000000000e+01 -1.087020000000000097e+00 -3.775000381469726562e+01 -1.087025000000000130e+00 -3.768750000000000000e+01 -1.087030000000000163e+00 -3.771875000000000000e+01 -1.087035000000000196e+00 -3.771875000000000000e+01 -1.087040000000000006e+00 -3.771875000000000000e+01 -1.087045000000000039e+00 -3.765625000000000000e+01 -1.087050000000000072e+00 -3.771875000000000000e+01 -1.087055000000000105e+00 -3.775000381469726562e+01 -1.087060000000000137e+00 -3.771875000000000000e+01 -1.087065000000000170e+00 -3.768750000000000000e+01 -1.087069999999999981e+00 -3.768750000000000000e+01 -1.087075000000000014e+00 -3.778125000000000000e+01 -1.087080000000000046e+00 -3.771875000000000000e+01 -1.087085000000000079e+00 -3.775000381469726562e+01 -1.087090000000000112e+00 -3.778125000000000000e+01 -1.087095000000000145e+00 -3.771875000000000000e+01 -1.087100000000000177e+00 -3.778125000000000000e+01 -1.087104999999999988e+00 -3.778125000000000000e+01 -1.087110000000000021e+00 -3.784375381469726562e+01 -1.087115000000000054e+00 -3.784375381469726562e+01 -1.087120000000000086e+00 -3.778125000000000000e+01 -1.087125000000000119e+00 -3.784375381469726562e+01 -1.087130000000000152e+00 -3.781250000000000000e+01 -1.087135000000000185e+00 -3.784375381469726562e+01 -1.087139999999999995e+00 -3.781250000000000000e+01 -1.087145000000000028e+00 -3.778125000000000000e+01 -1.087150000000000061e+00 -3.784375381469726562e+01 -1.087155000000000094e+00 -3.784375381469726562e+01 -1.087160000000000126e+00 -3.784375381469726562e+01 -1.087165000000000159e+00 -3.781250000000000000e+01 -1.087170000000000192e+00 -3.787500000000000000e+01 -1.087175000000000002e+00 -3.784375381469726562e+01 -1.087180000000000035e+00 -3.781250000000000000e+01 -1.087185000000000068e+00 -3.784375381469726562e+01 -1.087190000000000101e+00 -3.793750000000000000e+01 -1.087195000000000134e+00 -3.787500000000000000e+01 -1.087200000000000166e+00 -3.790625000000000000e+01 -1.087205000000000199e+00 -3.784375381469726562e+01 -1.087210000000000010e+00 -3.784375381469726562e+01 -1.087215000000000042e+00 -3.790625000000000000e+01 -1.087220000000000075e+00 -3.787500000000000000e+01 -1.087225000000000108e+00 -3.787500000000000000e+01 -1.087230000000000141e+00 -3.784375381469726562e+01 -1.087235000000000174e+00 -3.790625000000000000e+01 -1.087239999999999984e+00 -3.790625000000000000e+01 -1.087245000000000017e+00 -3.793750000000000000e+01 -1.087250000000000050e+00 -3.787500000000000000e+01 -1.087255000000000082e+00 -3.787500000000000000e+01 -1.087260000000000115e+00 -3.790625000000000000e+01 -1.087265000000000148e+00 -3.790625000000000000e+01 -1.087270000000000181e+00 -3.790625000000000000e+01 -1.087274999999999991e+00 -3.784375381469726562e+01 -1.087280000000000024e+00 -3.800000381469726562e+01 -1.087285000000000057e+00 -3.787500000000000000e+01 -1.087290000000000090e+00 -3.790625000000000000e+01 -1.087295000000000122e+00 -3.800000381469726562e+01 -1.087300000000000155e+00 -3.796875000000000000e+01 -1.087305000000000188e+00 -3.800000381469726562e+01 -1.087309999999999999e+00 -3.800000381469726562e+01 -1.087315000000000031e+00 -3.796875000000000000e+01 -1.087320000000000064e+00 -3.803125000000000000e+01 -1.087325000000000097e+00 -3.796875000000000000e+01 -1.087330000000000130e+00 -3.796875000000000000e+01 -1.087335000000000163e+00 -3.793750000000000000e+01 -1.087340000000000195e+00 -3.796875000000000000e+01 -1.087345000000000006e+00 -3.793750000000000000e+01 -1.087350000000000039e+00 -3.796875000000000000e+01 -1.087355000000000071e+00 -3.803125000000000000e+01 -1.087360000000000104e+00 -3.800000381469726562e+01 -1.087365000000000137e+00 -3.796875000000000000e+01 -1.087370000000000170e+00 -3.800000381469726562e+01 -1.087374999999999980e+00 -3.800000381469726562e+01 -1.087380000000000013e+00 -3.803125000000000000e+01 -1.087385000000000046e+00 -3.803125000000000000e+01 -1.087390000000000079e+00 -3.800000381469726562e+01 -1.087395000000000111e+00 -3.793750000000000000e+01 -1.087400000000000144e+00 -3.800000381469726562e+01 -1.087405000000000177e+00 -3.793750000000000000e+01 -1.087409999999999988e+00 -3.796875000000000000e+01 -1.087415000000000020e+00 -3.793750000000000000e+01 -1.087420000000000053e+00 -3.800000381469726562e+01 -1.087425000000000086e+00 -3.800000381469726562e+01 -1.087430000000000119e+00 -3.803125000000000000e+01 -1.087435000000000151e+00 -3.800000381469726562e+01 -1.087440000000000184e+00 -3.803125000000000000e+01 -1.087444999999999995e+00 -3.806250000000000000e+01 -1.087450000000000028e+00 -3.803125000000000000e+01 -1.087455000000000060e+00 -3.800000381469726562e+01 -1.087460000000000093e+00 -3.803125000000000000e+01 -1.087465000000000126e+00 -3.806250000000000000e+01 -1.087470000000000159e+00 -3.800000381469726562e+01 -1.087475000000000191e+00 -3.803125000000000000e+01 -1.087480000000000002e+00 -3.803125000000000000e+01 -1.087485000000000035e+00 -3.806250000000000000e+01 -1.087490000000000068e+00 -3.806250000000000000e+01 -1.087495000000000100e+00 -3.803125000000000000e+01 -1.087500000000000133e+00 -3.806250000000000000e+01 -1.087505000000000166e+00 -3.809375000000000000e+01 -1.087510000000000199e+00 -3.809375000000000000e+01 -1.087515000000000009e+00 -3.809375000000000000e+01 -1.087520000000000042e+00 -3.809375000000000000e+01 -1.087525000000000075e+00 -3.809375000000000000e+01 -1.087530000000000108e+00 -3.809375000000000000e+01 -1.087535000000000140e+00 -3.809375000000000000e+01 -1.087540000000000173e+00 -3.803125000000000000e+01 -1.087544999999999984e+00 -3.812500000000000000e+01 -1.087550000000000017e+00 -3.812500000000000000e+01 -1.087555000000000049e+00 -3.815625381469726562e+01 -1.087560000000000082e+00 -3.815625381469726562e+01 -1.087565000000000115e+00 -3.815625381469726562e+01 -1.087570000000000148e+00 -3.809375000000000000e+01 -1.087575000000000180e+00 -3.809375000000000000e+01 -1.087579999999999991e+00 -3.815625381469726562e+01 -1.087585000000000024e+00 -3.815625381469726562e+01 -1.087590000000000057e+00 -3.812500000000000000e+01 -1.087595000000000089e+00 -3.815625381469726562e+01 -1.087600000000000122e+00 -3.812500000000000000e+01 -1.087605000000000155e+00 -3.812500000000000000e+01 -1.087610000000000188e+00 -3.815625381469726562e+01 -1.087614999999999998e+00 -3.815625381469726562e+01 -1.087620000000000031e+00 -3.812500000000000000e+01 -1.087625000000000064e+00 -3.812500000000000000e+01 -1.087630000000000097e+00 -3.812500000000000000e+01 -1.087635000000000129e+00 -3.818750000000000000e+01 -1.087640000000000162e+00 -3.815625381469726562e+01 -1.087645000000000195e+00 -3.812500000000000000e+01 -1.087650000000000006e+00 -3.812500000000000000e+01 -1.087655000000000038e+00 -3.818750000000000000e+01 -1.087660000000000071e+00 -3.812500000000000000e+01 -1.087665000000000104e+00 -3.812500000000000000e+01 -1.087670000000000137e+00 -3.815625381469726562e+01 -1.087675000000000169e+00 -3.812500000000000000e+01 -1.087679999999999980e+00 -3.812500000000000000e+01 -1.087685000000000013e+00 -3.815625381469726562e+01 -1.087690000000000046e+00 -3.812500000000000000e+01 -1.087695000000000078e+00 -3.818750000000000000e+01 -1.087700000000000111e+00 -3.812500000000000000e+01 -1.087705000000000144e+00 -3.818750000000000000e+01 -1.087710000000000177e+00 -3.815625381469726562e+01 -1.087714999999999987e+00 -3.818750000000000000e+01 -1.087720000000000020e+00 -3.812500000000000000e+01 -1.087725000000000053e+00 -3.815625381469726562e+01 -1.087730000000000086e+00 -3.809375000000000000e+01 -1.087735000000000118e+00 -3.818750000000000000e+01 -1.087740000000000151e+00 -3.815625381469726562e+01 -1.087745000000000184e+00 -3.818750000000000000e+01 -1.087749999999999995e+00 -3.818750000000000000e+01 -1.087755000000000027e+00 -3.815625381469726562e+01 -1.087760000000000060e+00 -3.818750000000000000e+01 -1.087765000000000093e+00 -3.821875000000000000e+01 -1.087770000000000126e+00 -3.812500000000000000e+01 -1.087775000000000158e+00 -3.815625381469726562e+01 -1.087780000000000191e+00 -3.818750000000000000e+01 -1.087785000000000002e+00 -3.821875000000000000e+01 -1.087790000000000035e+00 -3.818750000000000000e+01 -1.087795000000000067e+00 -3.821875000000000000e+01 -1.087800000000000100e+00 -3.828125000000000000e+01 -1.087805000000000133e+00 -3.818750000000000000e+01 -1.087810000000000166e+00 -3.815625381469726562e+01 -1.087815000000000198e+00 -3.818750000000000000e+01 -1.087820000000000009e+00 -3.818750000000000000e+01 -1.087825000000000042e+00 -3.825000000000000000e+01 -1.087830000000000075e+00 -3.825000000000000000e+01 -1.087835000000000107e+00 -3.821875000000000000e+01 -1.087840000000000140e+00 -3.821875000000000000e+01 -1.087845000000000173e+00 -3.825000000000000000e+01 -1.087849999999999984e+00 -3.828125000000000000e+01 -1.087855000000000016e+00 -3.825000000000000000e+01 -1.087860000000000049e+00 -3.825000000000000000e+01 -1.087865000000000082e+00 -3.828125000000000000e+01 -1.087870000000000115e+00 -3.825000000000000000e+01 -1.087875000000000147e+00 -3.818750000000000000e+01 -1.087880000000000180e+00 -3.825000000000000000e+01 -1.087884999999999991e+00 -3.818750000000000000e+01 -1.087890000000000024e+00 -3.825000000000000000e+01 -1.087895000000000056e+00 -3.828125000000000000e+01 -1.087900000000000089e+00 -3.825000000000000000e+01 -1.087905000000000122e+00 -3.818750000000000000e+01 -1.087910000000000155e+00 -3.821875000000000000e+01 -1.087915000000000187e+00 -3.818750000000000000e+01 -1.087919999999999998e+00 -3.828125000000000000e+01 -1.087925000000000031e+00 -3.828125000000000000e+01 -1.087930000000000064e+00 -3.831250381469726562e+01 -1.087935000000000096e+00 -3.828125000000000000e+01 -1.087940000000000129e+00 -3.828125000000000000e+01 -1.087945000000000162e+00 -3.828125000000000000e+01 -1.087950000000000195e+00 -3.828125000000000000e+01 -1.087955000000000005e+00 -3.828125000000000000e+01 -1.087960000000000038e+00 -3.821875000000000000e+01 -1.087965000000000071e+00 -3.828125000000000000e+01 -1.087970000000000104e+00 -3.828125000000000000e+01 -1.087975000000000136e+00 -3.831250381469726562e+01 -1.087980000000000169e+00 -3.821875000000000000e+01 -1.087984999999999980e+00 -3.834375000000000000e+01 -1.087990000000000013e+00 -3.828125000000000000e+01 -1.087995000000000045e+00 -3.828125000000000000e+01 -1.088000000000000078e+00 -3.828125000000000000e+01 -1.088005000000000111e+00 -3.828125000000000000e+01 -1.088010000000000144e+00 -3.825000000000000000e+01 -1.088015000000000176e+00 -3.834375000000000000e+01 -1.088019999999999987e+00 -3.821875000000000000e+01 -1.088025000000000020e+00 -3.831250381469726562e+01 -1.088030000000000053e+00 -3.834375000000000000e+01 -1.088035000000000085e+00 -3.834375000000000000e+01 -1.088040000000000118e+00 -3.837500000000000000e+01 -1.088045000000000151e+00 -3.834375000000000000e+01 -1.088050000000000184e+00 -3.831250381469726562e+01 -1.088054999999999994e+00 -3.837500000000000000e+01 -1.088060000000000027e+00 -3.834375000000000000e+01 -1.088065000000000060e+00 -3.834375000000000000e+01 -1.088070000000000093e+00 -3.837500000000000000e+01 -1.088075000000000125e+00 -3.834375000000000000e+01 -1.088080000000000158e+00 -3.837500000000000000e+01 -1.088085000000000191e+00 -3.837500000000000000e+01 -1.088090000000000002e+00 -3.837500000000000000e+01 -1.088095000000000034e+00 -3.840625000000000000e+01 -1.088100000000000067e+00 -3.840625000000000000e+01 -1.088105000000000100e+00 -3.837500000000000000e+01 -1.088110000000000133e+00 -3.843750000000000000e+01 -1.088115000000000165e+00 -3.840625000000000000e+01 -1.088120000000000198e+00 -3.843750000000000000e+01 -1.088125000000000009e+00 -3.843750000000000000e+01 -1.088130000000000042e+00 -3.837500000000000000e+01 -1.088135000000000074e+00 -3.840625000000000000e+01 -1.088140000000000107e+00 -3.846875381469726562e+01 -1.088145000000000140e+00 -3.840625000000000000e+01 -1.088150000000000173e+00 -3.837500000000000000e+01 -1.088154999999999983e+00 -3.850000000000000000e+01 -1.088160000000000016e+00 -3.837500000000000000e+01 -1.088165000000000049e+00 -3.843750000000000000e+01 -1.088170000000000082e+00 -3.843750000000000000e+01 -1.088175000000000114e+00 -3.843750000000000000e+01 -1.088180000000000147e+00 -3.837500000000000000e+01 -1.088185000000000180e+00 -3.843750000000000000e+01 -1.088189999999999991e+00 -3.840625000000000000e+01 -1.088195000000000023e+00 -3.840625000000000000e+01 -1.088200000000000056e+00 -3.837500000000000000e+01 -1.088205000000000089e+00 -3.831250381469726562e+01 -1.088210000000000122e+00 -3.834375000000000000e+01 -1.088215000000000154e+00 -3.843750000000000000e+01 -1.088220000000000187e+00 -3.840625000000000000e+01 -1.088224999999999998e+00 -3.840625000000000000e+01 -1.088230000000000031e+00 -3.846875381469726562e+01 -1.088235000000000063e+00 -3.840625000000000000e+01 -1.088240000000000096e+00 -3.840625000000000000e+01 -1.088245000000000129e+00 -3.843750000000000000e+01 -1.088250000000000162e+00 -3.850000000000000000e+01 -1.088255000000000194e+00 -3.843750000000000000e+01 -1.088260000000000005e+00 -3.840625000000000000e+01 -1.088265000000000038e+00 -3.846875381469726562e+01 -1.088270000000000071e+00 -3.837500000000000000e+01 -1.088275000000000103e+00 -3.840625000000000000e+01 -1.088280000000000136e+00 -3.840625000000000000e+01 -1.088285000000000169e+00 -3.846875381469726562e+01 -1.088289999999999980e+00 -3.846875381469726562e+01 -1.088295000000000012e+00 -3.843750000000000000e+01 -1.088300000000000045e+00 -3.846875381469726562e+01 -1.088305000000000078e+00 -3.843750000000000000e+01 -1.088310000000000111e+00 -3.853125000000000000e+01 -1.088315000000000143e+00 -3.843750000000000000e+01 -1.088320000000000176e+00 -3.850000000000000000e+01 -1.088324999999999987e+00 -3.846875381469726562e+01 -1.088330000000000020e+00 -3.850000000000000000e+01 -1.088335000000000052e+00 -3.850000000000000000e+01 -1.088340000000000085e+00 -3.843750000000000000e+01 -1.088345000000000118e+00 -3.846875381469726562e+01 -1.088350000000000151e+00 -3.840625000000000000e+01 -1.088355000000000183e+00 -3.850000000000000000e+01 -1.088359999999999994e+00 -3.853125000000000000e+01 -1.088365000000000027e+00 -3.850000000000000000e+01 -1.088370000000000060e+00 -3.850000000000000000e+01 -1.088375000000000092e+00 -3.840625000000000000e+01 -1.088380000000000125e+00 -3.843750000000000000e+01 -1.088385000000000158e+00 -3.843750000000000000e+01 -1.088390000000000191e+00 -3.843750000000000000e+01 -1.088395000000000001e+00 -3.850000000000000000e+01 -1.088400000000000034e+00 -3.850000000000000000e+01 -1.088405000000000067e+00 -3.850000000000000000e+01 -1.088410000000000100e+00 -3.850000000000000000e+01 -1.088415000000000132e+00 -3.850000000000000000e+01 -1.088420000000000165e+00 -3.846875381469726562e+01 -1.088425000000000198e+00 -3.850000000000000000e+01 -1.088430000000000009e+00 -3.853125000000000000e+01 -1.088435000000000041e+00 -3.846875381469726562e+01 -1.088440000000000074e+00 -3.846875381469726562e+01 -1.088445000000000107e+00 -3.853125000000000000e+01 -1.088450000000000140e+00 -3.850000000000000000e+01 -1.088455000000000172e+00 -3.853125000000000000e+01 -1.088459999999999983e+00 -3.856250381469726562e+01 -1.088465000000000016e+00 -3.856250381469726562e+01 -1.088470000000000049e+00 -3.856250381469726562e+01 -1.088475000000000081e+00 -3.853125000000000000e+01 -1.088480000000000114e+00 -3.853125000000000000e+01 -1.088485000000000147e+00 -3.856250381469726562e+01 -1.088490000000000180e+00 -3.862500000000000000e+01 -1.088494999999999990e+00 -3.850000000000000000e+01 -1.088500000000000023e+00 -3.865625000000000000e+01 -1.088505000000000056e+00 -3.859375000000000000e+01 -1.088510000000000089e+00 -3.859375000000000000e+01 -1.088515000000000121e+00 -3.859375000000000000e+01 -1.088520000000000154e+00 -3.859375000000000000e+01 -1.088525000000000187e+00 -3.862500000000000000e+01 -1.088529999999999998e+00 -3.859375000000000000e+01 -1.088535000000000030e+00 -3.856250381469726562e+01 -1.088540000000000063e+00 -3.865625000000000000e+01 -1.088545000000000096e+00 -3.862500000000000000e+01 -1.088550000000000129e+00 -3.856250381469726562e+01 -1.088555000000000161e+00 -3.862500000000000000e+01 -1.088560000000000194e+00 -3.859375000000000000e+01 -1.088565000000000005e+00 -3.859375000000000000e+01 -1.088570000000000038e+00 -3.859375000000000000e+01 -1.088575000000000070e+00 -3.859375000000000000e+01 -1.088580000000000103e+00 -3.862500000000000000e+01 -1.088585000000000136e+00 -3.862500000000000000e+01 -1.088590000000000169e+00 -3.862500000000000000e+01 -1.088594999999999979e+00 -3.859375000000000000e+01 -1.088600000000000012e+00 -3.871875381469726562e+01 -1.088605000000000045e+00 -3.862500000000000000e+01 -1.088610000000000078e+00 -3.865625000000000000e+01 -1.088615000000000110e+00 -3.865625000000000000e+01 -1.088620000000000143e+00 -3.865625000000000000e+01 -1.088625000000000176e+00 -3.865625000000000000e+01 -1.088629999999999987e+00 -3.859375000000000000e+01 -1.088635000000000019e+00 -3.865625000000000000e+01 -1.088640000000000052e+00 -3.865625000000000000e+01 -1.088645000000000085e+00 -3.865625000000000000e+01 -1.088650000000000118e+00 -3.868750000000000000e+01 -1.088655000000000150e+00 -3.871875381469726562e+01 -1.088660000000000183e+00 -3.871875381469726562e+01 -1.088664999999999994e+00 -3.871875381469726562e+01 -1.088670000000000027e+00 -3.871875381469726562e+01 -1.088675000000000059e+00 -3.871875381469726562e+01 -1.088680000000000092e+00 -3.868750000000000000e+01 -1.088685000000000125e+00 -3.865625000000000000e+01 -1.088690000000000158e+00 -3.865625000000000000e+01 -1.088695000000000190e+00 -3.865625000000000000e+01 -1.088700000000000001e+00 -3.865625000000000000e+01 -1.088705000000000034e+00 -3.862500000000000000e+01 -1.088710000000000067e+00 -3.865625000000000000e+01 -1.088715000000000099e+00 -3.865625000000000000e+01 -1.088720000000000132e+00 -3.868750000000000000e+01 -1.088725000000000165e+00 -3.865625000000000000e+01 -1.088730000000000198e+00 -3.868750000000000000e+01 -1.088735000000000008e+00 -3.865625000000000000e+01 -1.088740000000000041e+00 -3.868750000000000000e+01 -1.088745000000000074e+00 -3.868750000000000000e+01 -1.088750000000000107e+00 -3.875000000000000000e+01 -1.088755000000000139e+00 -3.868750000000000000e+01 -1.088760000000000172e+00 -3.878125000000000000e+01 -1.088764999999999983e+00 -3.871875381469726562e+01 -1.088770000000000016e+00 -3.875000000000000000e+01 -1.088775000000000048e+00 -3.871875381469726562e+01 -1.088780000000000081e+00 -3.871875381469726562e+01 -1.088785000000000114e+00 -3.871875381469726562e+01 -1.088790000000000147e+00 -3.871875381469726562e+01 -1.088795000000000179e+00 -3.875000000000000000e+01 -1.088799999999999990e+00 -3.871875381469726562e+01 -1.088805000000000023e+00 -3.875000000000000000e+01 -1.088810000000000056e+00 -3.871875381469726562e+01 -1.088815000000000088e+00 -3.871875381469726562e+01 -1.088820000000000121e+00 -3.871875381469726562e+01 -1.088825000000000154e+00 -3.878125000000000000e+01 -1.088830000000000187e+00 -3.868750000000000000e+01 -1.088834999999999997e+00 -3.871875381469726562e+01 -1.088840000000000030e+00 -3.875000000000000000e+01 -1.088845000000000063e+00 -3.871875381469726562e+01 -1.088850000000000096e+00 -3.868750000000000000e+01 -1.088855000000000128e+00 -3.871875381469726562e+01 -1.088860000000000161e+00 -3.871875381469726562e+01 -1.088865000000000194e+00 -3.875000000000000000e+01 -1.088870000000000005e+00 -3.875000000000000000e+01 -1.088875000000000037e+00 -3.878125000000000000e+01 -1.088880000000000070e+00 -3.871875381469726562e+01 -1.088885000000000103e+00 -3.875000000000000000e+01 -1.088890000000000136e+00 -3.878125000000000000e+01 -1.088895000000000168e+00 -3.871875381469726562e+01 -1.088899999999999979e+00 -3.871875381469726562e+01 -1.088905000000000012e+00 -3.881250000000000000e+01 -1.088910000000000045e+00 -3.878125000000000000e+01 -1.088915000000000077e+00 -3.878125000000000000e+01 -1.088920000000000110e+00 -3.878125000000000000e+01 -1.088925000000000143e+00 -3.878125000000000000e+01 -1.088930000000000176e+00 -3.881250000000000000e+01 -1.088934999999999986e+00 -3.871875381469726562e+01 -1.088940000000000019e+00 -3.875000000000000000e+01 -1.088945000000000052e+00 -3.878125000000000000e+01 -1.088950000000000085e+00 -3.884375000000000000e+01 -1.088955000000000117e+00 -3.881250000000000000e+01 -1.088960000000000150e+00 -3.878125000000000000e+01 -1.088965000000000183e+00 -3.881250000000000000e+01 -1.088969999999999994e+00 -3.881250000000000000e+01 -1.088975000000000026e+00 -3.871875381469726562e+01 -1.088980000000000059e+00 -3.878125000000000000e+01 -1.088985000000000092e+00 -3.878125000000000000e+01 -1.088990000000000125e+00 -3.868750000000000000e+01 -1.088995000000000157e+00 -3.871875381469726562e+01 -1.089000000000000190e+00 -3.878125000000000000e+01 -1.089005000000000001e+00 -3.875000000000000000e+01 -1.089010000000000034e+00 -3.881250000000000000e+01 -1.089015000000000066e+00 -3.878125000000000000e+01 -1.089020000000000099e+00 -3.878125000000000000e+01 -1.089025000000000132e+00 -3.878125000000000000e+01 -1.089030000000000165e+00 -3.878125000000000000e+01 -1.089035000000000197e+00 -3.875000000000000000e+01 -1.089040000000000008e+00 -3.884375000000000000e+01 -1.089045000000000041e+00 -3.875000000000000000e+01 -1.089050000000000074e+00 -3.875000000000000000e+01 -1.089055000000000106e+00 -3.878125000000000000e+01 -1.089060000000000139e+00 -3.878125000000000000e+01 -1.089065000000000172e+00 -3.881250000000000000e+01 -1.089069999999999983e+00 -3.875000000000000000e+01 -1.089075000000000015e+00 -3.884375000000000000e+01 -1.089080000000000048e+00 -3.875000000000000000e+01 -1.089085000000000081e+00 -3.878125000000000000e+01 -1.089090000000000114e+00 -3.884375000000000000e+01 -1.089095000000000146e+00 -3.878125000000000000e+01 -1.089100000000000179e+00 -3.884375000000000000e+01 -1.089104999999999990e+00 -3.881250000000000000e+01 -1.089110000000000023e+00 -3.887500381469726562e+01 -1.089115000000000055e+00 -3.884375000000000000e+01 -1.089120000000000088e+00 -3.881250000000000000e+01 -1.089125000000000121e+00 -3.878125000000000000e+01 -1.089130000000000154e+00 -3.884375000000000000e+01 -1.089135000000000186e+00 -3.887500381469726562e+01 -1.089139999999999997e+00 -3.884375000000000000e+01 -1.089145000000000030e+00 -3.884375000000000000e+01 -1.089150000000000063e+00 -3.884375000000000000e+01 -1.089155000000000095e+00 -3.881250000000000000e+01 -1.089160000000000128e+00 -3.881250000000000000e+01 -1.089165000000000161e+00 -3.881250000000000000e+01 -1.089170000000000194e+00 -3.887500381469726562e+01 -1.089175000000000004e+00 -3.887500381469726562e+01 -1.089180000000000037e+00 -3.887500381469726562e+01 -1.089185000000000070e+00 -3.884375000000000000e+01 -1.089190000000000103e+00 -3.887500381469726562e+01 -1.089195000000000135e+00 -3.893750000000000000e+01 -1.089200000000000168e+00 -3.890625000000000000e+01 -1.089204999999999979e+00 -3.890625000000000000e+01 -1.089210000000000012e+00 -3.887500381469726562e+01 -1.089215000000000044e+00 -3.893750000000000000e+01 -1.089220000000000077e+00 -3.890625000000000000e+01 -1.089225000000000110e+00 -3.896875000000000000e+01 -1.089230000000000143e+00 -3.893750000000000000e+01 -1.089235000000000175e+00 -3.893750000000000000e+01 -1.089239999999999986e+00 -3.896875000000000000e+01 -1.089245000000000019e+00 -3.890625000000000000e+01 -1.089250000000000052e+00 -3.893750000000000000e+01 -1.089255000000000084e+00 -3.900000000000000000e+01 -1.089260000000000117e+00 -3.896875000000000000e+01 -1.089265000000000150e+00 -3.893750000000000000e+01 -1.089270000000000183e+00 -3.900000000000000000e+01 -1.089274999999999993e+00 -3.893750000000000000e+01 -1.089280000000000026e+00 -3.896875000000000000e+01 -1.089285000000000059e+00 -3.893750000000000000e+01 -1.089290000000000092e+00 -3.893750000000000000e+01 -1.089295000000000124e+00 -3.900000000000000000e+01 -1.089300000000000157e+00 -3.896875000000000000e+01 -1.089305000000000190e+00 -3.893750000000000000e+01 -1.089310000000000000e+00 -3.896875000000000000e+01 -1.089315000000000033e+00 -3.893750000000000000e+01 -1.089320000000000066e+00 -3.893750000000000000e+01 -1.089325000000000099e+00 -3.893750000000000000e+01 -1.089330000000000132e+00 -3.896875000000000000e+01 -1.089335000000000164e+00 -3.896875000000000000e+01 -1.089340000000000197e+00 -3.900000000000000000e+01 -1.089345000000000008e+00 -3.900000000000000000e+01 -1.089350000000000041e+00 -3.893750000000000000e+01 -1.089355000000000073e+00 -3.896875000000000000e+01 -1.089360000000000106e+00 -3.896875000000000000e+01 -1.089365000000000139e+00 -3.896875000000000000e+01 -1.089370000000000172e+00 -3.896875000000000000e+01 -1.089374999999999982e+00 -3.900000000000000000e+01 -1.089380000000000015e+00 -3.896875000000000000e+01 -1.089385000000000048e+00 -3.900000000000000000e+01 -1.089390000000000081e+00 -3.900000000000000000e+01 -1.089395000000000113e+00 -3.896875000000000000e+01 -1.089400000000000146e+00 -3.903125381469726562e+01 -1.089405000000000179e+00 -3.903125381469726562e+01 -1.089409999999999989e+00 -3.903125381469726562e+01 -1.089415000000000022e+00 -3.900000000000000000e+01 -1.089420000000000055e+00 -3.900000000000000000e+01 -1.089425000000000088e+00 -3.903125381469726562e+01 -1.089430000000000121e+00 -3.900000000000000000e+01 -1.089435000000000153e+00 -3.900000000000000000e+01 -1.089440000000000186e+00 -3.903125381469726562e+01 -1.089444999999999997e+00 -3.906250000000000000e+01 -1.089450000000000029e+00 -3.903125381469726562e+01 -1.089455000000000062e+00 -3.903125381469726562e+01 -1.089460000000000095e+00 -3.909375000000000000e+01 -1.089465000000000128e+00 -3.903125381469726562e+01 -1.089470000000000161e+00 -3.906250000000000000e+01 -1.089475000000000193e+00 -3.903125381469726562e+01 -1.089480000000000004e+00 -3.900000000000000000e+01 -1.089485000000000037e+00 -3.903125381469726562e+01 -1.089490000000000069e+00 -3.903125381469726562e+01 -1.089495000000000102e+00 -3.903125381469726562e+01 -1.089500000000000135e+00 -3.903125381469726562e+01 -1.089505000000000168e+00 -3.912500000000000000e+01 -1.089509999999999978e+00 -3.909375000000000000e+01 -1.089515000000000011e+00 -3.912500000000000000e+01 -1.089520000000000044e+00 -3.906250000000000000e+01 -1.089525000000000077e+00 -3.912500000000000000e+01 -1.089530000000000109e+00 -3.909375000000000000e+01 -1.089535000000000142e+00 -3.900000000000000000e+01 -1.089540000000000175e+00 -3.909375000000000000e+01 -1.089544999999999986e+00 -3.906250000000000000e+01 -1.089550000000000018e+00 -3.906250000000000000e+01 -1.089555000000000051e+00 -3.909375000000000000e+01 -1.089560000000000084e+00 -3.909375000000000000e+01 -1.089565000000000117e+00 -3.906250000000000000e+01 -1.089570000000000149e+00 -3.903125381469726562e+01 -1.089575000000000182e+00 -3.909375000000000000e+01 -1.089579999999999993e+00 -3.915625000000000000e+01 -1.089585000000000026e+00 -3.903125381469726562e+01 -1.089590000000000058e+00 -3.909375000000000000e+01 -1.089595000000000091e+00 -3.909375000000000000e+01 -1.089600000000000124e+00 -3.912500000000000000e+01 -1.089605000000000157e+00 -3.918750381469726562e+01 -1.089610000000000190e+00 -3.906250000000000000e+01 -1.089615000000000000e+00 -3.912500000000000000e+01 -1.089620000000000033e+00 -3.909375000000000000e+01 -1.089625000000000066e+00 -3.915625000000000000e+01 -1.089630000000000098e+00 -3.912500000000000000e+01 -1.089635000000000131e+00 -3.909375000000000000e+01 -1.089640000000000164e+00 -3.909375000000000000e+01 -1.089645000000000197e+00 -3.906250000000000000e+01 -1.089650000000000007e+00 -3.909375000000000000e+01 -1.089655000000000040e+00 -3.912500000000000000e+01 -1.089660000000000073e+00 -3.906250000000000000e+01 -1.089665000000000106e+00 -3.912500000000000000e+01 -1.089670000000000138e+00 -3.909375000000000000e+01 -1.089675000000000171e+00 -3.909375000000000000e+01 -1.089679999999999982e+00 -3.909375000000000000e+01 -1.089685000000000015e+00 -3.909375000000000000e+01 -1.089690000000000047e+00 -3.909375000000000000e+01 -1.089695000000000080e+00 -3.906250000000000000e+01 -1.089700000000000113e+00 -3.903125381469726562e+01 -1.089705000000000146e+00 -3.915625000000000000e+01 -1.089710000000000178e+00 -3.906250000000000000e+01 -1.089714999999999989e+00 -3.903125381469726562e+01 -1.089720000000000022e+00 -3.912500000000000000e+01 -1.089725000000000055e+00 -3.909375000000000000e+01 -1.089730000000000087e+00 -3.909375000000000000e+01 -1.089735000000000120e+00 -3.912500000000000000e+01 -1.089740000000000153e+00 -3.909375000000000000e+01 -1.089745000000000186e+00 -3.912500000000000000e+01 -1.089749999999999996e+00 -3.909375000000000000e+01 -1.089755000000000029e+00 -3.915625000000000000e+01 -1.089760000000000062e+00 -3.912500000000000000e+01 -1.089765000000000095e+00 -3.912500000000000000e+01 -1.089770000000000127e+00 -3.912500000000000000e+01 -1.089775000000000160e+00 -3.915625000000000000e+01 -1.089780000000000193e+00 -3.918750381469726562e+01 -1.089785000000000004e+00 -3.912500000000000000e+01 -1.089790000000000036e+00 -3.915625000000000000e+01 -1.089795000000000069e+00 -3.915625000000000000e+01 -1.089800000000000102e+00 -3.915625000000000000e+01 -1.089805000000000135e+00 -3.912500000000000000e+01 -1.089810000000000167e+00 -3.909375000000000000e+01 -1.089814999999999978e+00 -3.915625000000000000e+01 -1.089820000000000011e+00 -3.915625000000000000e+01 -1.089825000000000044e+00 -3.915625000000000000e+01 -1.089830000000000076e+00 -3.915625000000000000e+01 -1.089835000000000109e+00 -3.918750381469726562e+01 -1.089840000000000142e+00 -3.915625000000000000e+01 -1.089845000000000175e+00 -3.915625000000000000e+01 -1.089849999999999985e+00 -3.915625000000000000e+01 -1.089855000000000018e+00 -3.915625000000000000e+01 -1.089860000000000051e+00 -3.912500000000000000e+01 -1.089865000000000084e+00 -3.915625000000000000e+01 -1.089870000000000116e+00 -3.912500000000000000e+01 -1.089875000000000149e+00 -3.915625000000000000e+01 -1.089880000000000182e+00 -3.918750381469726562e+01 -1.089884999999999993e+00 -3.915625000000000000e+01 -1.089890000000000025e+00 -3.921875000000000000e+01 -1.089895000000000058e+00 -3.918750381469726562e+01 -1.089900000000000091e+00 -3.915625000000000000e+01 -1.089905000000000124e+00 -3.921875000000000000e+01 -1.089910000000000156e+00 -3.925000000000000000e+01 -1.089915000000000189e+00 -3.909375000000000000e+01 -1.089920000000000000e+00 -3.915625000000000000e+01 -1.089925000000000033e+00 -3.918750381469726562e+01 -1.089930000000000065e+00 -3.918750381469726562e+01 -1.089935000000000098e+00 -3.915625000000000000e+01 -1.089940000000000131e+00 -3.912500000000000000e+01 -1.089945000000000164e+00 -3.912500000000000000e+01 -1.089950000000000196e+00 -3.921875000000000000e+01 -1.089955000000000007e+00 -3.921875000000000000e+01 -1.089960000000000040e+00 -3.918750381469726562e+01 -1.089965000000000073e+00 -3.928125000000000000e+01 -1.089970000000000105e+00 -3.918750381469726562e+01 -1.089975000000000138e+00 -3.915625000000000000e+01 -1.089980000000000171e+00 -3.918750381469726562e+01 -1.089984999999999982e+00 -3.918750381469726562e+01 -1.089990000000000014e+00 -3.921875000000000000e+01 -1.089995000000000047e+00 -3.925000000000000000e+01 -1.090000000000000080e+00 -3.918750381469726562e+01 -1.090005000000000113e+00 -3.921875000000000000e+01 -1.090010000000000145e+00 -3.925000000000000000e+01 -1.090015000000000178e+00 -3.918750381469726562e+01 -1.090019999999999989e+00 -3.925000000000000000e+01 -1.090025000000000022e+00 -3.918750381469726562e+01 -1.090030000000000054e+00 -3.918750381469726562e+01 -1.090035000000000087e+00 -3.921875000000000000e+01 -1.090040000000000120e+00 -3.918750381469726562e+01 -1.090045000000000153e+00 -3.918750381469726562e+01 -1.090050000000000185e+00 -3.921875000000000000e+01 -1.090054999999999996e+00 -3.915625000000000000e+01 -1.090060000000000029e+00 -3.918750381469726562e+01 -1.090065000000000062e+00 -3.921875000000000000e+01 -1.090070000000000094e+00 -3.921875000000000000e+01 -1.090075000000000127e+00 -3.921875000000000000e+01 -1.090080000000000160e+00 -3.918750381469726562e+01 -1.090085000000000193e+00 -3.921875000000000000e+01 -1.090090000000000003e+00 -3.921875000000000000e+01 -1.090095000000000036e+00 -3.918750381469726562e+01 -1.090100000000000069e+00 -3.918750381469726562e+01 -1.090105000000000102e+00 -3.925000000000000000e+01 -1.090110000000000134e+00 -3.925000000000000000e+01 -1.090115000000000167e+00 -3.925000000000000000e+01 -1.090120000000000200e+00 -3.925000000000000000e+01 -1.090125000000000011e+00 -3.934375381469726562e+01 -1.090130000000000043e+00 -3.925000000000000000e+01 -1.090135000000000076e+00 -3.925000000000000000e+01 -1.090140000000000109e+00 -3.925000000000000000e+01 -1.090145000000000142e+00 -3.925000000000000000e+01 -1.090150000000000174e+00 -3.934375381469726562e+01 -1.090154999999999985e+00 -3.928125000000000000e+01 -1.090160000000000018e+00 -3.928125000000000000e+01 -1.090165000000000051e+00 -3.921875000000000000e+01 -1.090170000000000083e+00 -3.925000000000000000e+01 -1.090175000000000116e+00 -3.928125000000000000e+01 -1.090180000000000149e+00 -3.934375381469726562e+01 -1.090185000000000182e+00 -3.934375381469726562e+01 -1.090189999999999992e+00 -3.928125000000000000e+01 -1.090195000000000025e+00 -3.925000000000000000e+01 -1.090200000000000058e+00 -3.918750381469726562e+01 -1.090205000000000091e+00 -3.937500000000000000e+01 -1.090210000000000123e+00 -3.925000000000000000e+01 -1.090215000000000156e+00 -3.934375381469726562e+01 -1.090220000000000189e+00 -3.931250000000000000e+01 -1.090225000000000000e+00 -3.931250000000000000e+01 -1.090230000000000032e+00 -3.934375381469726562e+01 -1.090235000000000065e+00 -3.934375381469726562e+01 -1.090240000000000098e+00 -3.931250000000000000e+01 -1.090245000000000131e+00 -3.943750381469726562e+01 -1.090250000000000163e+00 -3.940625000000000000e+01 -1.090255000000000196e+00 -3.940625000000000000e+01 -1.090260000000000007e+00 -3.934375381469726562e+01 -1.090265000000000040e+00 -3.931250000000000000e+01 -1.090270000000000072e+00 -3.937500000000000000e+01 -1.090275000000000105e+00 -3.946875000000000000e+01 -1.090280000000000138e+00 -3.931250000000000000e+01 -1.090285000000000171e+00 -3.934375381469726562e+01 -1.090289999999999981e+00 -3.934375381469726562e+01 -1.090295000000000014e+00 -3.931250000000000000e+01 -1.090300000000000047e+00 -3.934375381469726562e+01 -1.090305000000000080e+00 -3.934375381469726562e+01 -1.090310000000000112e+00 -3.937500000000000000e+01 -1.090315000000000145e+00 -3.934375381469726562e+01 -1.090320000000000178e+00 -3.934375381469726562e+01 -1.090324999999999989e+00 -3.934375381469726562e+01 -1.090330000000000021e+00 -3.934375381469726562e+01 -1.090335000000000054e+00 -3.940625000000000000e+01 -1.090340000000000087e+00 -3.928125000000000000e+01 -1.090345000000000120e+00 -3.934375381469726562e+01 -1.090350000000000152e+00 -3.931250000000000000e+01 -1.090355000000000185e+00 -3.937500000000000000e+01 -1.090359999999999996e+00 -3.934375381469726562e+01 -1.090365000000000029e+00 -3.934375381469726562e+01 -1.090370000000000061e+00 -3.940625000000000000e+01 -1.090375000000000094e+00 -3.934375381469726562e+01 -1.090380000000000127e+00 -3.934375381469726562e+01 -1.090385000000000160e+00 -3.937500000000000000e+01 -1.090390000000000192e+00 -3.940625000000000000e+01 -1.090395000000000003e+00 -3.931250000000000000e+01 -1.090400000000000036e+00 -3.937500000000000000e+01 -1.090405000000000069e+00 -3.934375381469726562e+01 -1.090410000000000101e+00 -3.937500000000000000e+01 -1.090415000000000134e+00 -3.937500000000000000e+01 -1.090420000000000167e+00 -3.934375381469726562e+01 -1.090425000000000200e+00 -3.934375381469726562e+01 -1.090430000000000010e+00 -3.937500000000000000e+01 -1.090435000000000043e+00 -3.934375381469726562e+01 -1.090440000000000076e+00 -3.928125000000000000e+01 -1.090445000000000109e+00 -3.943750381469726562e+01 -1.090450000000000141e+00 -3.934375381469726562e+01 -1.090455000000000174e+00 -3.940625000000000000e+01 -1.090459999999999985e+00 -3.937500000000000000e+01 -1.090465000000000018e+00 -3.937500000000000000e+01 -1.090470000000000050e+00 -3.940625000000000000e+01 -1.090475000000000083e+00 -3.934375381469726562e+01 -1.090480000000000116e+00 -3.937500000000000000e+01 -1.090485000000000149e+00 -3.937500000000000000e+01 -1.090490000000000181e+00 -3.943750381469726562e+01 -1.090494999999999992e+00 -3.946875000000000000e+01 -1.090500000000000025e+00 -3.940625000000000000e+01 -1.090505000000000058e+00 -3.943750381469726562e+01 -1.090510000000000090e+00 -3.943750381469726562e+01 -1.090515000000000123e+00 -3.940625000000000000e+01 -1.090520000000000156e+00 -3.943750381469726562e+01 -1.090525000000000189e+00 -3.943750381469726562e+01 -1.090529999999999999e+00 -3.934375381469726562e+01 -1.090535000000000032e+00 -3.943750381469726562e+01 -1.090540000000000065e+00 -3.940625000000000000e+01 -1.090545000000000098e+00 -3.937500000000000000e+01 -1.090550000000000130e+00 -3.943750381469726562e+01 -1.090555000000000163e+00 -3.943750381469726562e+01 -1.090560000000000196e+00 -3.937500000000000000e+01 -1.090565000000000007e+00 -3.943750381469726562e+01 -1.090570000000000039e+00 -3.946875000000000000e+01 -1.090575000000000072e+00 -3.940625000000000000e+01 -1.090580000000000105e+00 -3.937500000000000000e+01 -1.090585000000000138e+00 -3.940625000000000000e+01 -1.090590000000000170e+00 -3.946875000000000000e+01 -1.090594999999999981e+00 -3.934375381469726562e+01 -1.090600000000000014e+00 -3.943750381469726562e+01 -1.090605000000000047e+00 -3.946875000000000000e+01 -1.090610000000000079e+00 -3.946875000000000000e+01 -1.090615000000000112e+00 -3.940625000000000000e+01 -1.090620000000000145e+00 -3.946875000000000000e+01 -1.090625000000000178e+00 -3.943750381469726562e+01 -1.090629999999999988e+00 -3.943750381469726562e+01 -1.090635000000000021e+00 -3.946875000000000000e+01 -1.090640000000000054e+00 -3.946875000000000000e+01 -1.090645000000000087e+00 -3.950000000000000000e+01 -1.090650000000000119e+00 -3.943750381469726562e+01 -1.090655000000000152e+00 -3.943750381469726562e+01 -1.090660000000000185e+00 -3.946875000000000000e+01 -1.090664999999999996e+00 -3.940625000000000000e+01 -1.090670000000000028e+00 -3.950000000000000000e+01 -1.090675000000000061e+00 -3.937500000000000000e+01 -1.090680000000000094e+00 -3.946875000000000000e+01 -1.090685000000000127e+00 -3.943750381469726562e+01 -1.090690000000000159e+00 -3.950000000000000000e+01 -1.090695000000000192e+00 -3.946875000000000000e+01 -1.090700000000000003e+00 -3.943750381469726562e+01 -1.090705000000000036e+00 -3.946875000000000000e+01 -1.090710000000000068e+00 -3.943750381469726562e+01 -1.090715000000000101e+00 -3.943750381469726562e+01 -1.090720000000000134e+00 -3.940625000000000000e+01 -1.090725000000000167e+00 -3.943750381469726562e+01 -1.090730000000000199e+00 -3.946875000000000000e+01 -1.090735000000000010e+00 -3.946875000000000000e+01 -1.090740000000000043e+00 -3.946875000000000000e+01 -1.090745000000000076e+00 -3.946875000000000000e+01 -1.090750000000000108e+00 -3.946875000000000000e+01 -1.090755000000000141e+00 -3.950000000000000000e+01 -1.090760000000000174e+00 -3.946875000000000000e+01 -1.090764999999999985e+00 -3.943750381469726562e+01 -1.090770000000000017e+00 -3.943750381469726562e+01 -1.090775000000000050e+00 -3.943750381469726562e+01 -1.090780000000000083e+00 -3.946875000000000000e+01 -1.090785000000000116e+00 -3.946875000000000000e+01 -1.090790000000000148e+00 -3.946875000000000000e+01 -1.090795000000000181e+00 -3.946875000000000000e+01 -1.090799999999999992e+00 -3.953125000000000000e+01 -1.090805000000000025e+00 -3.946875000000000000e+01 -1.090810000000000057e+00 -3.946875000000000000e+01 -1.090815000000000090e+00 -3.946875000000000000e+01 -1.090820000000000123e+00 -3.950000000000000000e+01 -1.090825000000000156e+00 -3.950000000000000000e+01 -1.090830000000000188e+00 -3.946875000000000000e+01 -1.090834999999999999e+00 -3.943750381469726562e+01 -1.090840000000000032e+00 -3.950000000000000000e+01 -1.090845000000000065e+00 -3.943750381469726562e+01 -1.090850000000000097e+00 -3.946875000000000000e+01 -1.090855000000000130e+00 -3.950000000000000000e+01 -1.090860000000000163e+00 -3.946875000000000000e+01 -1.090865000000000196e+00 -3.950000000000000000e+01 -1.090870000000000006e+00 -3.953125000000000000e+01 -1.090875000000000039e+00 -3.953125000000000000e+01 -1.090880000000000072e+00 -3.950000000000000000e+01 -1.090885000000000105e+00 -3.953125000000000000e+01 -1.090890000000000137e+00 -3.953125000000000000e+01 -1.090895000000000170e+00 -3.950000000000000000e+01 -1.090899999999999981e+00 -3.953125000000000000e+01 -1.090905000000000014e+00 -3.953125000000000000e+01 -1.090910000000000046e+00 -3.946875000000000000e+01 -1.090915000000000079e+00 -3.959375381469726562e+01 -1.090920000000000112e+00 -3.956250000000000000e+01 -1.090925000000000145e+00 -3.953125000000000000e+01 -1.090930000000000177e+00 -3.959375381469726562e+01 -1.090934999999999988e+00 -3.953125000000000000e+01 -1.090940000000000021e+00 -3.959375381469726562e+01 -1.090945000000000054e+00 -3.959375381469726562e+01 -1.090950000000000086e+00 -3.959375381469726562e+01 -1.090955000000000119e+00 -3.959375381469726562e+01 -1.090960000000000152e+00 -3.953125000000000000e+01 -1.090965000000000185e+00 -3.956250000000000000e+01 -1.090969999999999995e+00 -3.950000000000000000e+01 -1.090975000000000028e+00 -3.956250000000000000e+01 -1.090980000000000061e+00 -3.956250000000000000e+01 -1.090985000000000094e+00 -3.956250000000000000e+01 -1.090990000000000126e+00 -3.956250000000000000e+01 -1.090995000000000159e+00 -3.956250000000000000e+01 -1.091000000000000192e+00 -3.959375381469726562e+01 -1.091005000000000003e+00 -3.959375381469726562e+01 -1.091010000000000035e+00 -3.953125000000000000e+01 -1.091015000000000068e+00 -3.959375381469726562e+01 -1.091020000000000101e+00 -3.956250000000000000e+01 -1.091025000000000134e+00 -3.953125000000000000e+01 -1.091030000000000166e+00 -3.950000000000000000e+01 -1.091035000000000199e+00 -3.953125000000000000e+01 -1.091040000000000010e+00 -3.950000000000000000e+01 -1.091045000000000043e+00 -3.962500000000000000e+01 -1.091050000000000075e+00 -3.962500000000000000e+01 -1.091055000000000108e+00 -3.956250000000000000e+01 -1.091060000000000141e+00 -3.959375381469726562e+01 -1.091065000000000174e+00 -3.959375381469726562e+01 -1.091069999999999984e+00 -3.962500000000000000e+01 -1.091075000000000017e+00 -3.956250000000000000e+01 -1.091080000000000050e+00 -3.959375381469726562e+01 -1.091085000000000083e+00 -3.950000000000000000e+01 -1.091090000000000115e+00 -3.956250000000000000e+01 -1.091095000000000148e+00 -3.956250000000000000e+01 -1.091100000000000181e+00 -3.956250000000000000e+01 -1.091104999999999992e+00 -3.959375381469726562e+01 -1.091110000000000024e+00 -3.956250000000000000e+01 -1.091115000000000057e+00 -3.956250000000000000e+01 -1.091120000000000090e+00 -3.953125000000000000e+01 -1.091125000000000123e+00 -3.953125000000000000e+01 -1.091130000000000155e+00 -3.956250000000000000e+01 -1.091135000000000188e+00 -3.953125000000000000e+01 -1.091139999999999999e+00 -3.953125000000000000e+01 -1.091145000000000032e+00 -3.959375381469726562e+01 -1.091150000000000064e+00 -3.956250000000000000e+01 -1.091155000000000097e+00 -3.956250000000000000e+01 -1.091160000000000130e+00 -3.965625000000000000e+01 -1.091165000000000163e+00 -3.959375381469726562e+01 -1.091170000000000195e+00 -3.956250000000000000e+01 -1.091175000000000006e+00 -3.965625000000000000e+01 -1.091180000000000039e+00 -3.965625000000000000e+01 -1.091185000000000072e+00 -3.965625000000000000e+01 -1.091190000000000104e+00 -3.962500000000000000e+01 -1.091195000000000137e+00 -3.962500000000000000e+01 -1.091200000000000170e+00 -3.959375381469726562e+01 -1.091204999999999981e+00 -3.965625000000000000e+01 -1.091210000000000013e+00 -3.956250000000000000e+01 -1.091215000000000046e+00 -3.965625000000000000e+01 -1.091220000000000079e+00 -3.965625000000000000e+01 -1.091225000000000112e+00 -3.959375381469726562e+01 -1.091230000000000144e+00 -3.959375381469726562e+01 -1.091235000000000177e+00 -3.959375381469726562e+01 -1.091239999999999988e+00 -3.959375381469726562e+01 -1.091245000000000021e+00 -3.962500000000000000e+01 -1.091250000000000053e+00 -3.956250000000000000e+01 -1.091255000000000086e+00 -3.965625000000000000e+01 -1.091260000000000119e+00 -3.962500000000000000e+01 -1.091265000000000152e+00 -3.962500000000000000e+01 -1.091270000000000184e+00 -3.962500000000000000e+01 -1.091274999999999995e+00 -3.962500000000000000e+01 -1.091280000000000028e+00 -3.965625000000000000e+01 -1.091285000000000061e+00 -3.968750000000000000e+01 -1.091290000000000093e+00 -3.956250000000000000e+01 -1.091295000000000126e+00 -3.965625000000000000e+01 -1.091300000000000159e+00 -3.968750000000000000e+01 -1.091305000000000192e+00 -3.965625000000000000e+01 -1.091310000000000002e+00 -3.971875000000000000e+01 -1.091315000000000035e+00 -3.965625000000000000e+01 -1.091320000000000068e+00 -3.968750000000000000e+01 -1.091325000000000101e+00 -3.962500000000000000e+01 -1.091330000000000133e+00 -3.962500000000000000e+01 -1.091335000000000166e+00 -3.965625000000000000e+01 -1.091340000000000199e+00 -3.962500000000000000e+01 -1.091345000000000010e+00 -3.959375381469726562e+01 -1.091350000000000042e+00 -3.965625000000000000e+01 -1.091355000000000075e+00 -3.959375381469726562e+01 -1.091360000000000108e+00 -3.965625000000000000e+01 -1.091365000000000141e+00 -3.962500000000000000e+01 -1.091370000000000173e+00 -3.965625000000000000e+01 -1.091374999999999984e+00 -3.968750000000000000e+01 -1.091380000000000017e+00 -3.968750000000000000e+01 -1.091385000000000050e+00 -3.959375381469726562e+01 -1.091390000000000082e+00 -3.959375381469726562e+01 -1.091395000000000115e+00 -3.965625000000000000e+01 -1.091400000000000148e+00 -3.965625000000000000e+01 -1.091405000000000181e+00 -3.962500000000000000e+01 -1.091409999999999991e+00 -3.965625000000000000e+01 -1.091415000000000024e+00 -3.965625000000000000e+01 -1.091420000000000057e+00 -3.965625000000000000e+01 -1.091425000000000090e+00 -3.965625000000000000e+01 -1.091430000000000122e+00 -3.959375381469726562e+01 -1.091435000000000155e+00 -3.962500000000000000e+01 -1.091440000000000188e+00 -3.968750000000000000e+01 -1.091444999999999999e+00 -3.959375381469726562e+01 -1.091450000000000031e+00 -3.959375381469726562e+01 -1.091455000000000064e+00 -3.962500000000000000e+01 -1.091460000000000097e+00 -3.953125000000000000e+01 -1.091465000000000130e+00 -3.959375381469726562e+01 -1.091470000000000162e+00 -3.962500000000000000e+01 -1.091475000000000195e+00 -3.965625000000000000e+01 -1.091480000000000006e+00 -3.962500000000000000e+01 -1.091485000000000039e+00 -3.965625000000000000e+01 -1.091490000000000071e+00 -3.968750000000000000e+01 -1.091495000000000104e+00 -3.962500000000000000e+01 -1.091500000000000137e+00 -3.971875000000000000e+01 -1.091505000000000170e+00 -3.965625000000000000e+01 -1.091509999999999980e+00 -3.962500000000000000e+01 -1.091515000000000013e+00 -3.968750000000000000e+01 -1.091520000000000046e+00 -3.965625000000000000e+01 -1.091525000000000079e+00 -3.968750000000000000e+01 -1.091530000000000111e+00 -3.965625000000000000e+01 -1.091535000000000144e+00 -3.965625000000000000e+01 -1.091540000000000177e+00 -3.965625000000000000e+01 -1.091544999999999987e+00 -3.968750000000000000e+01 -1.091550000000000020e+00 -3.971875000000000000e+01 -1.091555000000000053e+00 -3.965625000000000000e+01 -1.091560000000000086e+00 -3.968750000000000000e+01 -1.091565000000000119e+00 -3.971875000000000000e+01 -1.091570000000000151e+00 -3.971875000000000000e+01 -1.091575000000000184e+00 -3.968750000000000000e+01 -1.091579999999999995e+00 -3.975000381469726562e+01 -1.091585000000000027e+00 -3.968750000000000000e+01 -1.091590000000000060e+00 -3.968750000000000000e+01 -1.091595000000000093e+00 -3.965625000000000000e+01 -1.091600000000000126e+00 -3.975000381469726562e+01 -1.091605000000000159e+00 -3.975000381469726562e+01 -1.091610000000000191e+00 -3.968750000000000000e+01 -1.091615000000000002e+00 -3.971875000000000000e+01 -1.091620000000000035e+00 -3.971875000000000000e+01 -1.091625000000000068e+00 -3.971875000000000000e+01 -1.091630000000000100e+00 -3.975000381469726562e+01 -1.091635000000000133e+00 -3.971875000000000000e+01 -1.091640000000000166e+00 -3.968750000000000000e+01 -1.091645000000000199e+00 -3.968750000000000000e+01 -1.091650000000000009e+00 -3.962500000000000000e+01 -1.091655000000000042e+00 -3.965625000000000000e+01 -1.091660000000000075e+00 -3.968750000000000000e+01 -1.091665000000000108e+00 -3.971875000000000000e+01 -1.091670000000000140e+00 -3.968750000000000000e+01 -1.091675000000000173e+00 -3.965625000000000000e+01 -1.091679999999999984e+00 -3.971875000000000000e+01 -1.091685000000000016e+00 -3.975000381469726562e+01 -1.091690000000000049e+00 -3.968750000000000000e+01 -1.091695000000000082e+00 -3.968750000000000000e+01 -1.091700000000000115e+00 -3.975000381469726562e+01 -1.091705000000000148e+00 -3.971875000000000000e+01 -1.091710000000000180e+00 -3.975000381469726562e+01 -1.091714999999999991e+00 -3.975000381469726562e+01 -1.091720000000000024e+00 -3.975000381469726562e+01 -1.091725000000000056e+00 -3.975000381469726562e+01 -1.091730000000000089e+00 -3.975000381469726562e+01 -1.091735000000000122e+00 -3.978125000000000000e+01 -1.091740000000000155e+00 -3.975000381469726562e+01 -1.091745000000000188e+00 -3.978125000000000000e+01 -1.091749999999999998e+00 -3.971875000000000000e+01 -1.091755000000000031e+00 -3.975000381469726562e+01 -1.091760000000000064e+00 -3.971875000000000000e+01 -1.091765000000000096e+00 -3.978125000000000000e+01 -1.091770000000000129e+00 -3.978125000000000000e+01 -1.091775000000000162e+00 -3.981250000000000000e+01 -1.091780000000000195e+00 -3.978125000000000000e+01 -1.091785000000000005e+00 -3.978125000000000000e+01 -1.091790000000000038e+00 -3.978125000000000000e+01 -1.091795000000000071e+00 -3.981250000000000000e+01 -1.091800000000000104e+00 -3.981250000000000000e+01 -1.091805000000000136e+00 -3.975000381469726562e+01 -1.091810000000000169e+00 -3.975000381469726562e+01 -1.091814999999999980e+00 -3.978125000000000000e+01 -1.091820000000000013e+00 -3.978125000000000000e+01 -1.091825000000000045e+00 -3.975000381469726562e+01 -1.091830000000000078e+00 -3.978125000000000000e+01 -1.091835000000000111e+00 -3.975000381469726562e+01 -1.091840000000000144e+00 -3.981250000000000000e+01 -1.091845000000000176e+00 -3.978125000000000000e+01 -1.091849999999999987e+00 -3.978125000000000000e+01 -1.091855000000000020e+00 -3.978125000000000000e+01 -1.091860000000000053e+00 -3.978125000000000000e+01 -1.091865000000000085e+00 -3.978125000000000000e+01 -1.091870000000000118e+00 -3.978125000000000000e+01 -1.091875000000000151e+00 -3.981250000000000000e+01 -1.091880000000000184e+00 -3.975000381469726562e+01 -1.091884999999999994e+00 -3.971875000000000000e+01 -1.091890000000000027e+00 -3.981250000000000000e+01 -1.091895000000000060e+00 -3.975000381469726562e+01 -1.091900000000000093e+00 -3.978125000000000000e+01 -1.091905000000000125e+00 -3.981250000000000000e+01 -1.091910000000000158e+00 -3.975000381469726562e+01 -1.091915000000000191e+00 -3.971875000000000000e+01 -1.091920000000000002e+00 -3.975000381469726562e+01 -1.091925000000000034e+00 -3.981250000000000000e+01 -1.091930000000000067e+00 -3.981250000000000000e+01 -1.091935000000000100e+00 -3.971875000000000000e+01 -1.091940000000000133e+00 -3.978125000000000000e+01 -1.091945000000000165e+00 -3.975000381469726562e+01 -1.091950000000000198e+00 -3.978125000000000000e+01 -1.091955000000000009e+00 -3.975000381469726562e+01 -1.091960000000000042e+00 -3.971875000000000000e+01 -1.091965000000000074e+00 -3.978125000000000000e+01 -1.091970000000000107e+00 -3.981250000000000000e+01 -1.091975000000000140e+00 -3.984375000000000000e+01 -1.091980000000000173e+00 -3.975000381469726562e+01 -1.091984999999999983e+00 -3.978125000000000000e+01 -1.091990000000000016e+00 -3.981250000000000000e+01 -1.091995000000000049e+00 -3.978125000000000000e+01 -1.092000000000000082e+00 -3.984375000000000000e+01 -1.092005000000000114e+00 -3.987500000000000000e+01 -1.092010000000000147e+00 -3.984375000000000000e+01 -1.092015000000000180e+00 -3.984375000000000000e+01 -1.092019999999999991e+00 -3.987500000000000000e+01 -1.092025000000000023e+00 -3.984375000000000000e+01 -1.092030000000000056e+00 -3.984375000000000000e+01 -1.092035000000000089e+00 -3.987500000000000000e+01 -1.092040000000000122e+00 -3.984375000000000000e+01 -1.092045000000000154e+00 -3.987500000000000000e+01 -1.092050000000000187e+00 -3.990625381469726562e+01 -1.092054999999999998e+00 -3.984375000000000000e+01 -1.092060000000000031e+00 -3.990625381469726562e+01 -1.092065000000000063e+00 -3.987500000000000000e+01 -1.092070000000000096e+00 -3.987500000000000000e+01 -1.092075000000000129e+00 -3.987500000000000000e+01 -1.092080000000000162e+00 -3.987500000000000000e+01 -1.092085000000000194e+00 -3.981250000000000000e+01 -1.092090000000000005e+00 -3.993750000000000000e+01 -1.092095000000000038e+00 -3.990625381469726562e+01 -1.092100000000000071e+00 -3.987500000000000000e+01 -1.092105000000000103e+00 -3.993750000000000000e+01 -1.092110000000000136e+00 -3.987500000000000000e+01 -1.092115000000000169e+00 -3.990625381469726562e+01 -1.092119999999999980e+00 -3.987500000000000000e+01 -1.092125000000000012e+00 -3.987500000000000000e+01 -1.092130000000000045e+00 -3.990625381469726562e+01 -1.092135000000000078e+00 -3.987500000000000000e+01 -1.092140000000000111e+00 -3.987500000000000000e+01 -1.092145000000000143e+00 -3.987500000000000000e+01 -1.092150000000000176e+00 -3.990625381469726562e+01 -1.092154999999999987e+00 -3.987500000000000000e+01 -1.092160000000000020e+00 -3.987500000000000000e+01 -1.092165000000000052e+00 -3.984375000000000000e+01 -1.092170000000000085e+00 -3.993750000000000000e+01 -1.092175000000000118e+00 -3.987500000000000000e+01 -1.092180000000000151e+00 -3.987500000000000000e+01 -1.092185000000000183e+00 -3.990625381469726562e+01 -1.092189999999999994e+00 -3.987500000000000000e+01 -1.092195000000000027e+00 -3.984375000000000000e+01 -1.092200000000000060e+00 -3.984375000000000000e+01 -1.092205000000000092e+00 -3.984375000000000000e+01 -1.092210000000000125e+00 -3.981250000000000000e+01 -1.092215000000000158e+00 -3.984375000000000000e+01 -1.092220000000000191e+00 -3.984375000000000000e+01 -1.092225000000000001e+00 -3.987500000000000000e+01 -1.092230000000000034e+00 -3.987500000000000000e+01 -1.092235000000000067e+00 -3.993750000000000000e+01 -1.092240000000000100e+00 -3.984375000000000000e+01 -1.092245000000000132e+00 -3.987500000000000000e+01 -1.092250000000000165e+00 -3.987500000000000000e+01 -1.092255000000000198e+00 -3.984375000000000000e+01 -1.092260000000000009e+00 -3.987500000000000000e+01 -1.092265000000000041e+00 -3.981250000000000000e+01 -1.092270000000000074e+00 -3.984375000000000000e+01 -1.092275000000000107e+00 -3.984375000000000000e+01 -1.092280000000000140e+00 -3.984375000000000000e+01 -1.092285000000000172e+00 -3.984375000000000000e+01 -1.092289999999999983e+00 -3.984375000000000000e+01 -1.092295000000000016e+00 -3.987500000000000000e+01 -1.092300000000000049e+00 -3.984375000000000000e+01 -1.092305000000000081e+00 -3.990625381469726562e+01 -1.092310000000000114e+00 -3.981250000000000000e+01 -1.092315000000000147e+00 -3.978125000000000000e+01 -1.092320000000000180e+00 -3.981250000000000000e+01 -1.092324999999999990e+00 -3.984375000000000000e+01 -1.092330000000000023e+00 -3.981250000000000000e+01 -1.092335000000000056e+00 -3.984375000000000000e+01 -1.092340000000000089e+00 -3.981250000000000000e+01 -1.092345000000000121e+00 -3.978125000000000000e+01 -1.092350000000000154e+00 -3.984375000000000000e+01 -1.092355000000000187e+00 -3.987500000000000000e+01 -1.092359999999999998e+00 -3.978125000000000000e+01 -1.092365000000000030e+00 -3.984375000000000000e+01 -1.092370000000000063e+00 -3.987500000000000000e+01 -1.092375000000000096e+00 -3.984375000000000000e+01 -1.092380000000000129e+00 -3.981250000000000000e+01 -1.092385000000000161e+00 -3.987500000000000000e+01 -1.092390000000000194e+00 -3.984375000000000000e+01 -1.092395000000000005e+00 -3.984375000000000000e+01 -1.092400000000000038e+00 -3.984375000000000000e+01 -1.092405000000000070e+00 -3.984375000000000000e+01 -1.092410000000000103e+00 -3.987500000000000000e+01 -1.092415000000000136e+00 -3.984375000000000000e+01 -1.092420000000000169e+00 -3.984375000000000000e+01 -1.092424999999999979e+00 -3.990625381469726562e+01 -1.092430000000000012e+00 -3.990625381469726562e+01 -1.092435000000000045e+00 -3.987500000000000000e+01 -1.092440000000000078e+00 -3.990625381469726562e+01 -1.092445000000000110e+00 -3.993750000000000000e+01 -1.092450000000000143e+00 -3.984375000000000000e+01 -1.092455000000000176e+00 -3.987500000000000000e+01 -1.092459999999999987e+00 -3.984375000000000000e+01 -1.092465000000000019e+00 -3.978125000000000000e+01 -1.092470000000000052e+00 -3.990625381469726562e+01 -1.092475000000000085e+00 -3.984375000000000000e+01 -1.092480000000000118e+00 -3.984375000000000000e+01 -1.092485000000000150e+00 -3.981250000000000000e+01 -1.092490000000000183e+00 -3.990625381469726562e+01 -1.092494999999999994e+00 -3.993750000000000000e+01 -1.092500000000000027e+00 -3.987500000000000000e+01 -1.092505000000000059e+00 -3.990625381469726562e+01 -1.092510000000000092e+00 -3.990625381469726562e+01 -1.092515000000000125e+00 -3.990625381469726562e+01 -1.092520000000000158e+00 -3.990625381469726562e+01 -1.092525000000000190e+00 -3.990625381469726562e+01 -1.092530000000000001e+00 -3.990625381469726562e+01 -1.092535000000000034e+00 -3.993750000000000000e+01 -1.092540000000000067e+00 -3.993750000000000000e+01 -1.092545000000000099e+00 -3.984375000000000000e+01 -1.092550000000000132e+00 -3.987500000000000000e+01 -1.092555000000000165e+00 -3.984375000000000000e+01 -1.092560000000000198e+00 -3.984375000000000000e+01 -1.092565000000000008e+00 -3.987500000000000000e+01 -1.092570000000000041e+00 -3.984375000000000000e+01 -1.092575000000000074e+00 -3.984375000000000000e+01 -1.092580000000000107e+00 -3.990625381469726562e+01 -1.092585000000000139e+00 -3.984375000000000000e+01 -1.092590000000000172e+00 -3.990625381469726562e+01 -1.092594999999999983e+00 -3.987500000000000000e+01 -1.092600000000000016e+00 -3.990625381469726562e+01 -1.092605000000000048e+00 -3.984375000000000000e+01 -1.092610000000000081e+00 -3.990625381469726562e+01 -1.092615000000000114e+00 -3.990625381469726562e+01 -1.092620000000000147e+00 -3.984375000000000000e+01 -1.092625000000000179e+00 -3.987500000000000000e+01 -1.092629999999999990e+00 -3.987500000000000000e+01 -1.092635000000000023e+00 -3.993750000000000000e+01 -1.092640000000000056e+00 -3.990625381469726562e+01 -1.092645000000000088e+00 -3.987500000000000000e+01 -1.092650000000000121e+00 -3.987500000000000000e+01 -1.092655000000000154e+00 -3.990625381469726562e+01 -1.092660000000000187e+00 -3.987500000000000000e+01 -1.092664999999999997e+00 -3.987500000000000000e+01 -1.092670000000000030e+00 -3.987500000000000000e+01 -1.092675000000000063e+00 -3.981250000000000000e+01 -1.092680000000000096e+00 -3.984375000000000000e+01 -1.092685000000000128e+00 -3.984375000000000000e+01 -1.092690000000000161e+00 -3.984375000000000000e+01 -1.092695000000000194e+00 -3.987500000000000000e+01 -1.092700000000000005e+00 -3.984375000000000000e+01 -1.092705000000000037e+00 -3.987500000000000000e+01 -1.092710000000000070e+00 -3.981250000000000000e+01 -1.092715000000000103e+00 -3.981250000000000000e+01 -1.092720000000000136e+00 -3.984375000000000000e+01 -1.092725000000000168e+00 -3.990625381469726562e+01 -1.092729999999999979e+00 -3.990625381469726562e+01 -1.092735000000000012e+00 -3.993750000000000000e+01 -1.092740000000000045e+00 -3.984375000000000000e+01 -1.092745000000000077e+00 -3.993750000000000000e+01 -1.092750000000000110e+00 -3.987500000000000000e+01 -1.092755000000000143e+00 -3.996875000000000000e+01 -1.092760000000000176e+00 -3.987500000000000000e+01 -1.092764999999999986e+00 -3.990625381469726562e+01 -1.092770000000000019e+00 -3.990625381469726562e+01 -1.092775000000000052e+00 -3.987500000000000000e+01 -1.092780000000000085e+00 -3.984375000000000000e+01 -1.092785000000000117e+00 -3.984375000000000000e+01 -1.092790000000000150e+00 -3.990625381469726562e+01 -1.092795000000000183e+00 -3.987500000000000000e+01 -1.092799999999999994e+00 -3.984375000000000000e+01 -1.092805000000000026e+00 -3.993750000000000000e+01 -1.092810000000000059e+00 -3.981250000000000000e+01 -1.092815000000000092e+00 -3.987500000000000000e+01 -1.092820000000000125e+00 -3.984375000000000000e+01 -1.092825000000000157e+00 -3.984375000000000000e+01 -1.092830000000000190e+00 -3.984375000000000000e+01 -1.092835000000000001e+00 -3.987500000000000000e+01 -1.092840000000000034e+00 -3.981250000000000000e+01 -1.092845000000000066e+00 -3.978125000000000000e+01 -1.092850000000000099e+00 -3.981250000000000000e+01 -1.092855000000000132e+00 -3.984375000000000000e+01 -1.092860000000000165e+00 -3.984375000000000000e+01 -1.092865000000000197e+00 -3.978125000000000000e+01 -1.092870000000000008e+00 -3.984375000000000000e+01 -1.092875000000000041e+00 -3.990625381469726562e+01 -1.092880000000000074e+00 -3.990625381469726562e+01 -1.092885000000000106e+00 -3.987500000000000000e+01 -1.092890000000000139e+00 -3.987500000000000000e+01 -1.092895000000000172e+00 -3.990625381469726562e+01 -1.092899999999999983e+00 -3.984375000000000000e+01 -1.092905000000000015e+00 -3.990625381469726562e+01 -1.092910000000000048e+00 -3.990625381469726562e+01 -1.092915000000000081e+00 -3.987500000000000000e+01 -1.092920000000000114e+00 -3.987500000000000000e+01 -1.092925000000000146e+00 -3.987500000000000000e+01 -1.092930000000000179e+00 -3.987500000000000000e+01 -1.092934999999999990e+00 -3.987500000000000000e+01 -1.092940000000000023e+00 -3.981250000000000000e+01 -1.092945000000000055e+00 -3.987500000000000000e+01 -1.092950000000000088e+00 -3.984375000000000000e+01 -1.092955000000000121e+00 -3.987500000000000000e+01 -1.092960000000000154e+00 -3.978125000000000000e+01 -1.092965000000000186e+00 -3.990625381469726562e+01 -1.092969999999999997e+00 -3.984375000000000000e+01 -1.092975000000000030e+00 -3.987500000000000000e+01 -1.092980000000000063e+00 -3.984375000000000000e+01 -1.092985000000000095e+00 -3.984375000000000000e+01 -1.092990000000000128e+00 -3.981250000000000000e+01 -1.092995000000000161e+00 -3.981250000000000000e+01 -1.093000000000000194e+00 -3.984375000000000000e+01 -1.093005000000000004e+00 -3.975000381469726562e+01 -1.093010000000000037e+00 -3.981250000000000000e+01 -1.093015000000000070e+00 -3.987500000000000000e+01 -1.093020000000000103e+00 -3.987500000000000000e+01 -1.093025000000000135e+00 -3.984375000000000000e+01 -1.093030000000000168e+00 -3.981250000000000000e+01 -1.093034999999999979e+00 -3.987500000000000000e+01 -1.093040000000000012e+00 -3.984375000000000000e+01 -1.093045000000000044e+00 -3.984375000000000000e+01 -1.093050000000000077e+00 -3.984375000000000000e+01 -1.093055000000000110e+00 -3.987500000000000000e+01 -1.093060000000000143e+00 -3.987500000000000000e+01 -1.093065000000000175e+00 -3.987500000000000000e+01 -1.093069999999999986e+00 -3.990625381469726562e+01 -1.093075000000000019e+00 -3.990625381469726562e+01 -1.093080000000000052e+00 -3.990625381469726562e+01 -1.093085000000000084e+00 -3.990625381469726562e+01 -1.093090000000000117e+00 -3.987500000000000000e+01 -1.093095000000000150e+00 -3.987500000000000000e+01 -1.093100000000000183e+00 -3.990625381469726562e+01 -1.093104999999999993e+00 -3.990625381469726562e+01 -1.093110000000000026e+00 -3.990625381469726562e+01 -1.093115000000000059e+00 -3.993750000000000000e+01 -1.093120000000000092e+00 -3.987500000000000000e+01 -1.093125000000000124e+00 -3.990625381469726562e+01 -1.093130000000000157e+00 -3.987500000000000000e+01 -1.093135000000000190e+00 -3.984375000000000000e+01 -1.093140000000000001e+00 -3.987500000000000000e+01 -1.093145000000000033e+00 -3.981250000000000000e+01 -1.093150000000000066e+00 -3.987500000000000000e+01 -1.093155000000000099e+00 -3.981250000000000000e+01 -1.093160000000000132e+00 -3.984375000000000000e+01 -1.093165000000000164e+00 -3.996875000000000000e+01 -1.093170000000000197e+00 -3.990625381469726562e+01 -1.093175000000000008e+00 -3.984375000000000000e+01 -1.093180000000000041e+00 -3.990625381469726562e+01 -1.093185000000000073e+00 -3.987500000000000000e+01 -1.093190000000000106e+00 -3.984375000000000000e+01 -1.093195000000000139e+00 -3.990625381469726562e+01 -1.093200000000000172e+00 -3.987500000000000000e+01 -1.093204999999999982e+00 -3.990625381469726562e+01 -1.093210000000000015e+00 -3.987500000000000000e+01 -1.093215000000000048e+00 -3.993750000000000000e+01 -1.093220000000000081e+00 -3.993750000000000000e+01 -1.093225000000000113e+00 -3.996875000000000000e+01 -1.093230000000000146e+00 -3.990625381469726562e+01 -1.093235000000000179e+00 -3.990625381469726562e+01 -1.093239999999999990e+00 -3.990625381469726562e+01 -1.093245000000000022e+00 -3.987500000000000000e+01 -1.093250000000000055e+00 -3.990625381469726562e+01 -1.093255000000000088e+00 -3.987500000000000000e+01 -1.093260000000000121e+00 -3.993750000000000000e+01 -1.093265000000000153e+00 -3.987500000000000000e+01 -1.093270000000000186e+00 -3.987500000000000000e+01 -1.093274999999999997e+00 -3.987500000000000000e+01 -1.093280000000000030e+00 -3.990625381469726562e+01 -1.093285000000000062e+00 -3.990625381469726562e+01 -1.093290000000000095e+00 -3.987500000000000000e+01 -1.093295000000000128e+00 -3.996875000000000000e+01 -1.093300000000000161e+00 -3.996875000000000000e+01 -1.093305000000000193e+00 -3.984375000000000000e+01 -1.093310000000000004e+00 -3.993750000000000000e+01 -1.093315000000000037e+00 -3.993750000000000000e+01 -1.093320000000000070e+00 -4.000000000000000000e+01 -1.093325000000000102e+00 -3.987500000000000000e+01 -1.093330000000000135e+00 -4.003125000000000000e+01 -1.093335000000000168e+00 -3.990625381469726562e+01 -1.093339999999999979e+00 -3.996875000000000000e+01 -1.093345000000000011e+00 -3.996875000000000000e+01 -1.093350000000000044e+00 -4.003125000000000000e+01 -1.093355000000000077e+00 -3.993750000000000000e+01 -1.093360000000000110e+00 -3.996875000000000000e+01 -1.093365000000000142e+00 -3.993750000000000000e+01 -1.093370000000000175e+00 -4.000000000000000000e+01 -1.093374999999999986e+00 -3.993750000000000000e+01 -1.093380000000000019e+00 -3.996875000000000000e+01 -1.093385000000000051e+00 -3.996875000000000000e+01 -1.093390000000000084e+00 -3.996875000000000000e+01 -1.093395000000000117e+00 -3.987500000000000000e+01 -1.093400000000000150e+00 -3.996875000000000000e+01 -1.093405000000000182e+00 -4.003125000000000000e+01 -1.093409999999999993e+00 -4.003125000000000000e+01 -1.093415000000000026e+00 -4.003125000000000000e+01 -1.093420000000000059e+00 -4.003125000000000000e+01 -1.093425000000000091e+00 -4.003125000000000000e+01 -1.093430000000000124e+00 -3.996875000000000000e+01 -1.093435000000000157e+00 -4.003125000000000000e+01 -1.093440000000000190e+00 -4.006250381469726562e+01 -1.093445000000000000e+00 -4.003125000000000000e+01 -1.093450000000000033e+00 -3.996875000000000000e+01 -1.093455000000000066e+00 -4.003125000000000000e+01 -1.093460000000000099e+00 -3.996875000000000000e+01 -1.093465000000000131e+00 -4.006250381469726562e+01 -1.093470000000000164e+00 -4.006250381469726562e+01 -1.093475000000000197e+00 -4.003125000000000000e+01 -1.093480000000000008e+00 -4.003125000000000000e+01 -1.093485000000000040e+00 -4.006250381469726562e+01 -1.093490000000000073e+00 -4.003125000000000000e+01 -1.093495000000000106e+00 -4.003125000000000000e+01 -1.093500000000000139e+00 -4.003125000000000000e+01 -1.093505000000000171e+00 -4.000000000000000000e+01 -1.093509999999999982e+00 -3.996875000000000000e+01 -1.093515000000000015e+00 -4.003125000000000000e+01 -1.093520000000000048e+00 -4.000000000000000000e+01 -1.093525000000000080e+00 -4.000000000000000000e+01 -1.093530000000000113e+00 -4.006250381469726562e+01 -1.093535000000000146e+00 -4.003125000000000000e+01 -1.093540000000000179e+00 -4.003125000000000000e+01 -1.093544999999999989e+00 -4.003125000000000000e+01 -1.093550000000000022e+00 -4.000000000000000000e+01 -1.093555000000000055e+00 -3.996875000000000000e+01 -1.093560000000000088e+00 -4.003125000000000000e+01 -1.093565000000000120e+00 -4.003125000000000000e+01 -1.093570000000000153e+00 -3.996875000000000000e+01 -1.093575000000000186e+00 -4.003125000000000000e+01 -1.093579999999999997e+00 -4.003125000000000000e+01 -1.093585000000000029e+00 -4.000000000000000000e+01 -1.093590000000000062e+00 -4.003125000000000000e+01 -1.093595000000000095e+00 -4.003125000000000000e+01 -1.093600000000000128e+00 -4.003125000000000000e+01 -1.093605000000000160e+00 -4.003125000000000000e+01 -1.093610000000000193e+00 -4.003125000000000000e+01 -1.093615000000000004e+00 -4.003125000000000000e+01 -1.093620000000000037e+00 -4.003125000000000000e+01 -1.093625000000000069e+00 -4.006250381469726562e+01 -1.093630000000000102e+00 -4.006250381469726562e+01 -1.093635000000000135e+00 -4.006250381469726562e+01 -1.093640000000000168e+00 -4.003125000000000000e+01 -1.093645000000000200e+00 -4.006250381469726562e+01 -1.093650000000000011e+00 -4.003125000000000000e+01 -1.093655000000000044e+00 -4.003125000000000000e+01 -1.093660000000000077e+00 -4.003125000000000000e+01 -1.093665000000000109e+00 -4.003125000000000000e+01 -1.093670000000000142e+00 -3.996875000000000000e+01 -1.093675000000000175e+00 -3.996875000000000000e+01 -1.093679999999999986e+00 -4.003125000000000000e+01 -1.093685000000000018e+00 -3.993750000000000000e+01 -1.093690000000000051e+00 -4.006250381469726562e+01 -1.093695000000000084e+00 -4.003125000000000000e+01 -1.093700000000000117e+00 -4.003125000000000000e+01 -1.093705000000000149e+00 -4.003125000000000000e+01 -1.093710000000000182e+00 -4.003125000000000000e+01 -1.093714999999999993e+00 -4.003125000000000000e+01 -1.093720000000000026e+00 -4.003125000000000000e+01 -1.093725000000000058e+00 -4.009375000000000000e+01 -1.093730000000000091e+00 -4.003125000000000000e+01 -1.093735000000000124e+00 -4.003125000000000000e+01 -1.093740000000000157e+00 -4.006250381469726562e+01 -1.093745000000000189e+00 -4.000000000000000000e+01 -1.093750000000000000e+00 -4.000000000000000000e+01 -1.093755000000000033e+00 -4.000000000000000000e+01 -1.093760000000000066e+00 -4.003125000000000000e+01 -1.093765000000000098e+00 -4.003125000000000000e+01 -1.093770000000000131e+00 -3.996875000000000000e+01 -1.093775000000000164e+00 -4.003125000000000000e+01 -1.093780000000000197e+00 -4.003125000000000000e+01 -1.093785000000000007e+00 -4.003125000000000000e+01 -1.093790000000000040e+00 -4.003125000000000000e+01 -1.093795000000000073e+00 -4.003125000000000000e+01 -1.093800000000000106e+00 -4.003125000000000000e+01 -1.093805000000000138e+00 -3.996875000000000000e+01 -1.093810000000000171e+00 -4.003125000000000000e+01 -1.093814999999999982e+00 -4.003125000000000000e+01 -1.093820000000000014e+00 -3.996875000000000000e+01 -1.093825000000000047e+00 -4.003125000000000000e+01 -1.093830000000000080e+00 -4.003125000000000000e+01 -1.093835000000000113e+00 -4.003125000000000000e+01 -1.093840000000000146e+00 -4.003125000000000000e+01 -1.093845000000000178e+00 -4.003125000000000000e+01 -1.093849999999999989e+00 -3.996875000000000000e+01 -1.093855000000000022e+00 -4.003125000000000000e+01 -1.093860000000000054e+00 -4.003125000000000000e+01 -1.093865000000000087e+00 -4.003125000000000000e+01 -1.093870000000000120e+00 -3.996875000000000000e+01 -1.093875000000000153e+00 -4.003125000000000000e+01 -1.093880000000000186e+00 -3.996875000000000000e+01 -1.093884999999999996e+00 -3.993750000000000000e+01 -1.093890000000000029e+00 -4.003125000000000000e+01 -1.093895000000000062e+00 -3.996875000000000000e+01 -1.093900000000000095e+00 -4.000000000000000000e+01 -1.093905000000000127e+00 -3.996875000000000000e+01 -1.093910000000000160e+00 -3.996875000000000000e+01 -1.093915000000000193e+00 -4.000000000000000000e+01 -1.093920000000000003e+00 -3.996875000000000000e+01 -1.093925000000000036e+00 -3.993750000000000000e+01 -1.093930000000000069e+00 -4.006250381469726562e+01 -1.093935000000000102e+00 -4.003125000000000000e+01 -1.093940000000000135e+00 -4.003125000000000000e+01 -1.093945000000000167e+00 -3.993750000000000000e+01 -1.093950000000000200e+00 -3.996875000000000000e+01 -1.093955000000000011e+00 -4.003125000000000000e+01 -1.093960000000000043e+00 -3.993750000000000000e+01 -1.093965000000000076e+00 -4.003125000000000000e+01 -1.093970000000000109e+00 -4.003125000000000000e+01 -1.093975000000000142e+00 -3.996875000000000000e+01 -1.093980000000000175e+00 -3.993750000000000000e+01 -1.093984999999999985e+00 -3.996875000000000000e+01 -1.093990000000000018e+00 -3.987500000000000000e+01 -1.093995000000000051e+00 -3.993750000000000000e+01 -1.094000000000000083e+00 -3.987500000000000000e+01 -1.094005000000000116e+00 -3.996875000000000000e+01 -1.094010000000000149e+00 -3.987500000000000000e+01 -1.094015000000000182e+00 -3.996875000000000000e+01 -1.094019999999999992e+00 -3.996875000000000000e+01 -1.094025000000000025e+00 -3.990625381469726562e+01 -1.094030000000000058e+00 -3.996875000000000000e+01 -1.094035000000000091e+00 -3.993750000000000000e+01 -1.094040000000000123e+00 -3.990625381469726562e+01 -1.094045000000000156e+00 -3.993750000000000000e+01 -1.094050000000000189e+00 -3.996875000000000000e+01 -1.094055000000000000e+00 -3.987500000000000000e+01 -1.094060000000000032e+00 -3.996875000000000000e+01 -1.094065000000000065e+00 -3.993750000000000000e+01 -1.094070000000000098e+00 -3.996875000000000000e+01 -1.094075000000000131e+00 -3.990625381469726562e+01 -1.094080000000000163e+00 -3.993750000000000000e+01 -1.094085000000000196e+00 -3.993750000000000000e+01 -1.094090000000000007e+00 -3.993750000000000000e+01 -1.094095000000000040e+00 -3.993750000000000000e+01 -1.094100000000000072e+00 -4.003125000000000000e+01 -1.094105000000000105e+00 -3.990625381469726562e+01 -1.094110000000000138e+00 -3.996875000000000000e+01 -1.094115000000000171e+00 -4.000000000000000000e+01 -1.094119999999999981e+00 -3.990625381469726562e+01 -1.094125000000000014e+00 -4.000000000000000000e+01 -1.094130000000000047e+00 -4.000000000000000000e+01 -1.094135000000000080e+00 -3.990625381469726562e+01 -1.094140000000000112e+00 -4.003125000000000000e+01 -1.094145000000000145e+00 -3.993750000000000000e+01 -1.094150000000000178e+00 -3.993750000000000000e+01 -1.094154999999999989e+00 -3.993750000000000000e+01 -1.094160000000000021e+00 -3.993750000000000000e+01 -1.094165000000000054e+00 -3.990625381469726562e+01 -1.094170000000000087e+00 -3.993750000000000000e+01 -1.094175000000000120e+00 -3.990625381469726562e+01 -1.094180000000000152e+00 -3.987500000000000000e+01 -1.094185000000000185e+00 -3.993750000000000000e+01 -1.094189999999999996e+00 -3.993750000000000000e+01 -1.094195000000000029e+00 -3.990625381469726562e+01 -1.094200000000000061e+00 -3.990625381469726562e+01 -1.094205000000000094e+00 -3.990625381469726562e+01 -1.094210000000000127e+00 -3.996875000000000000e+01 -1.094215000000000160e+00 -3.996875000000000000e+01 -1.094220000000000192e+00 -3.993750000000000000e+01 -1.094225000000000003e+00 -3.987500000000000000e+01 -1.094230000000000036e+00 -3.987500000000000000e+01 -1.094235000000000069e+00 -3.987500000000000000e+01 -1.094240000000000101e+00 -3.993750000000000000e+01 -1.094245000000000134e+00 -3.993750000000000000e+01 -1.094250000000000167e+00 -3.993750000000000000e+01 -1.094255000000000200e+00 -4.003125000000000000e+01 -1.094260000000000010e+00 -4.003125000000000000e+01 -1.094265000000000043e+00 -4.003125000000000000e+01 -1.094270000000000076e+00 -3.996875000000000000e+01 -1.094275000000000109e+00 -3.996875000000000000e+01 -1.094280000000000141e+00 -3.993750000000000000e+01 -1.094285000000000174e+00 -4.003125000000000000e+01 -1.094289999999999985e+00 -3.990625381469726562e+01 -1.094295000000000018e+00 -3.993750000000000000e+01 -1.094300000000000050e+00 -3.996875000000000000e+01 -1.094305000000000083e+00 -4.003125000000000000e+01 -1.094310000000000116e+00 -4.003125000000000000e+01 -1.094315000000000149e+00 -4.003125000000000000e+01 -1.094320000000000181e+00 -4.003125000000000000e+01 -1.094324999999999992e+00 -3.993750000000000000e+01 -1.094330000000000025e+00 -4.003125000000000000e+01 -1.094335000000000058e+00 -4.003125000000000000e+01 -1.094340000000000090e+00 -4.003125000000000000e+01 -1.094345000000000123e+00 -4.003125000000000000e+01 -1.094350000000000156e+00 -3.996875000000000000e+01 -1.094355000000000189e+00 -4.000000000000000000e+01 -1.094359999999999999e+00 -3.993750000000000000e+01 -1.094365000000000032e+00 -4.000000000000000000e+01 -1.094370000000000065e+00 -4.003125000000000000e+01 -1.094375000000000098e+00 -4.000000000000000000e+01 -1.094380000000000130e+00 -3.993750000000000000e+01 -1.094385000000000163e+00 -3.990625381469726562e+01 -1.094390000000000196e+00 -4.003125000000000000e+01 -1.094395000000000007e+00 -4.003125000000000000e+01 -1.094400000000000039e+00 -3.996875000000000000e+01 -1.094405000000000072e+00 -3.996875000000000000e+01 -1.094410000000000105e+00 -3.993750000000000000e+01 -1.094415000000000138e+00 -4.003125000000000000e+01 -1.094420000000000170e+00 -3.993750000000000000e+01 -1.094424999999999981e+00 -3.993750000000000000e+01 -1.094430000000000014e+00 -3.996875000000000000e+01 -1.094435000000000047e+00 -3.996875000000000000e+01 -1.094440000000000079e+00 -3.993750000000000000e+01 -1.094445000000000112e+00 -3.996875000000000000e+01 -1.094450000000000145e+00 -4.000000000000000000e+01 -1.094455000000000178e+00 -3.990625381469726562e+01 -1.094459999999999988e+00 -3.987500000000000000e+01 -1.094465000000000021e+00 -3.993750000000000000e+01 -1.094470000000000054e+00 -3.993750000000000000e+01 -1.094475000000000087e+00 -3.993750000000000000e+01 -1.094480000000000119e+00 -3.987500000000000000e+01 -1.094485000000000152e+00 -3.996875000000000000e+01 -1.094490000000000185e+00 -3.990625381469726562e+01 -1.094494999999999996e+00 -3.996875000000000000e+01 -1.094500000000000028e+00 -3.993750000000000000e+01 -1.094505000000000061e+00 -3.987500000000000000e+01 -1.094510000000000094e+00 -3.993750000000000000e+01 -1.094515000000000127e+00 -3.996875000000000000e+01 -1.094520000000000159e+00 -4.003125000000000000e+01 -1.094525000000000192e+00 -3.990625381469726562e+01 -1.094530000000000003e+00 -3.993750000000000000e+01 -1.094535000000000036e+00 -3.990625381469726562e+01 -1.094540000000000068e+00 -3.993750000000000000e+01 -1.094545000000000101e+00 -3.993750000000000000e+01 -1.094550000000000134e+00 -3.996875000000000000e+01 -1.094555000000000167e+00 -3.993750000000000000e+01 -1.094560000000000199e+00 -3.993750000000000000e+01 -1.094565000000000010e+00 -3.987500000000000000e+01 -1.094570000000000043e+00 -3.987500000000000000e+01 -1.094575000000000076e+00 -3.993750000000000000e+01 -1.094580000000000108e+00 -3.987500000000000000e+01 -1.094585000000000141e+00 -3.987500000000000000e+01 -1.094590000000000174e+00 -3.990625381469726562e+01 -1.094594999999999985e+00 -3.987500000000000000e+01 -1.094600000000000017e+00 -3.990625381469726562e+01 -1.094605000000000050e+00 -3.990625381469726562e+01 -1.094610000000000083e+00 -3.990625381469726562e+01 -1.094615000000000116e+00 -3.990625381469726562e+01 -1.094620000000000148e+00 -3.996875000000000000e+01 -1.094625000000000181e+00 -3.990625381469726562e+01 -1.094629999999999992e+00 -3.993750000000000000e+01 -1.094635000000000025e+00 -3.984375000000000000e+01 -1.094640000000000057e+00 -3.987500000000000000e+01 -1.094645000000000090e+00 -3.987500000000000000e+01 -1.094650000000000123e+00 -3.990625381469726562e+01 -1.094655000000000156e+00 -3.990625381469726562e+01 -1.094660000000000188e+00 -3.993750000000000000e+01 -1.094664999999999999e+00 -3.984375000000000000e+01 -1.094670000000000032e+00 -3.993750000000000000e+01 -1.094675000000000065e+00 -3.993750000000000000e+01 -1.094680000000000097e+00 -3.990625381469726562e+01 -1.094685000000000130e+00 -3.996875000000000000e+01 -1.094690000000000163e+00 -3.993750000000000000e+01 -1.094695000000000196e+00 -3.987500000000000000e+01 -1.094700000000000006e+00 -3.996875000000000000e+01 -1.094705000000000039e+00 -3.987500000000000000e+01 -1.094710000000000072e+00 -3.987500000000000000e+01 -1.094715000000000105e+00 -3.984375000000000000e+01 -1.094720000000000137e+00 -3.987500000000000000e+01 -1.094725000000000170e+00 -3.987500000000000000e+01 -1.094729999999999981e+00 -3.990625381469726562e+01 -1.094735000000000014e+00 -3.993750000000000000e+01 -1.094740000000000046e+00 -3.993750000000000000e+01 -1.094745000000000079e+00 -3.984375000000000000e+01 -1.094750000000000112e+00 -3.990625381469726562e+01 -1.094755000000000145e+00 -3.987500000000000000e+01 -1.094760000000000177e+00 -3.996875000000000000e+01 -1.094764999999999988e+00 -3.990625381469726562e+01 -1.094770000000000021e+00 -3.990625381469726562e+01 -1.094775000000000054e+00 -3.996875000000000000e+01 -1.094780000000000086e+00 -3.990625381469726562e+01 -1.094785000000000119e+00 -3.984375000000000000e+01 -1.094790000000000152e+00 -4.000000000000000000e+01 -1.094795000000000185e+00 -3.993750000000000000e+01 -1.094799999999999995e+00 -3.993750000000000000e+01 -1.094805000000000028e+00 -3.990625381469726562e+01 -1.094810000000000061e+00 -3.990625381469726562e+01 -1.094815000000000094e+00 -3.993750000000000000e+01 -1.094820000000000126e+00 -3.987500000000000000e+01 -1.094825000000000159e+00 -3.993750000000000000e+01 -1.094830000000000192e+00 -3.990625381469726562e+01 -1.094835000000000003e+00 -3.993750000000000000e+01 -1.094840000000000035e+00 -3.993750000000000000e+01 -1.094845000000000068e+00 -3.987500000000000000e+01 -1.094850000000000101e+00 -3.990625381469726562e+01 -1.094855000000000134e+00 -3.993750000000000000e+01 -1.094860000000000166e+00 -3.990625381469726562e+01 -1.094865000000000199e+00 -3.990625381469726562e+01 -1.094870000000000010e+00 -3.990625381469726562e+01 -1.094875000000000043e+00 -3.993750000000000000e+01 -1.094880000000000075e+00 -3.993750000000000000e+01 -1.094885000000000108e+00 -3.990625381469726562e+01 -1.094890000000000141e+00 -3.993750000000000000e+01 -1.094895000000000174e+00 -3.990625381469726562e+01 -1.094899999999999984e+00 -3.987500000000000000e+01 -1.094905000000000017e+00 -3.990625381469726562e+01 -1.094910000000000050e+00 -3.987500000000000000e+01 -1.094915000000000083e+00 -3.993750000000000000e+01 -1.094920000000000115e+00 -3.987500000000000000e+01 -1.094925000000000148e+00 -3.984375000000000000e+01 -1.094930000000000181e+00 -3.990625381469726562e+01 -1.094934999999999992e+00 -3.990625381469726562e+01 -1.094940000000000024e+00 -3.987500000000000000e+01 -1.094945000000000057e+00 -3.984375000000000000e+01 -1.094950000000000090e+00 -3.984375000000000000e+01 -1.094955000000000123e+00 -3.987500000000000000e+01 -1.094960000000000155e+00 -3.990625381469726562e+01 -1.094965000000000188e+00 -3.990625381469726562e+01 -1.094969999999999999e+00 -3.981250000000000000e+01 -1.094975000000000032e+00 -3.984375000000000000e+01 -1.094980000000000064e+00 -3.990625381469726562e+01 -1.094985000000000097e+00 -3.990625381469726562e+01 -1.094990000000000130e+00 -3.984375000000000000e+01 -1.094995000000000163e+00 -3.990625381469726562e+01 -1.095000000000000195e+00 -3.984375000000000000e+01 -1.095005000000000006e+00 -3.984375000000000000e+01 -1.095010000000000039e+00 -3.981250000000000000e+01 -1.095015000000000072e+00 -3.981250000000000000e+01 -1.095020000000000104e+00 -3.981250000000000000e+01 -1.095025000000000137e+00 -3.981250000000000000e+01 -1.095030000000000170e+00 -3.987500000000000000e+01 -1.095034999999999981e+00 -3.984375000000000000e+01 -1.095040000000000013e+00 -3.987500000000000000e+01 -1.095045000000000046e+00 -3.984375000000000000e+01 -1.095050000000000079e+00 -3.984375000000000000e+01 -1.095055000000000112e+00 -3.990625381469726562e+01 -1.095060000000000144e+00 -3.981250000000000000e+01 -1.095065000000000177e+00 -3.987500000000000000e+01 -1.095069999999999988e+00 -3.981250000000000000e+01 -1.095075000000000021e+00 -3.984375000000000000e+01 -1.095080000000000053e+00 -3.984375000000000000e+01 -1.095085000000000086e+00 -3.984375000000000000e+01 -1.095090000000000119e+00 -3.984375000000000000e+01 -1.095095000000000152e+00 -3.981250000000000000e+01 -1.095100000000000184e+00 -3.990625381469726562e+01 -1.095104999999999995e+00 -3.984375000000000000e+01 -1.095110000000000028e+00 -3.981250000000000000e+01 -1.095115000000000061e+00 -3.993750000000000000e+01 -1.095120000000000093e+00 -3.993750000000000000e+01 -1.095125000000000126e+00 -3.984375000000000000e+01 -1.095130000000000159e+00 -3.981250000000000000e+01 -1.095135000000000192e+00 -3.987500000000000000e+01 -1.095140000000000002e+00 -3.981250000000000000e+01 -1.095145000000000035e+00 -3.981250000000000000e+01 -1.095150000000000068e+00 -3.981250000000000000e+01 -1.095155000000000101e+00 -3.978125000000000000e+01 -1.095160000000000133e+00 -3.981250000000000000e+01 -1.095165000000000166e+00 -3.987500000000000000e+01 -1.095170000000000199e+00 -3.984375000000000000e+01 -1.095175000000000010e+00 -3.981250000000000000e+01 -1.095180000000000042e+00 -3.987500000000000000e+01 -1.095185000000000075e+00 -3.978125000000000000e+01 -1.095190000000000108e+00 -3.984375000000000000e+01 -1.095195000000000141e+00 -3.978125000000000000e+01 -1.095200000000000173e+00 -3.978125000000000000e+01 -1.095204999999999984e+00 -3.984375000000000000e+01 -1.095210000000000017e+00 -3.981250000000000000e+01 -1.095215000000000050e+00 -3.987500000000000000e+01 -1.095220000000000082e+00 -3.984375000000000000e+01 -1.095225000000000115e+00 -3.981250000000000000e+01 -1.095230000000000148e+00 -3.981250000000000000e+01 -1.095235000000000181e+00 -3.990625381469726562e+01 -1.095239999999999991e+00 -3.984375000000000000e+01 -1.095245000000000024e+00 -3.984375000000000000e+01 -1.095250000000000057e+00 -3.987500000000000000e+01 -1.095255000000000090e+00 -3.987500000000000000e+01 -1.095260000000000122e+00 -3.987500000000000000e+01 -1.095265000000000155e+00 -3.984375000000000000e+01 -1.095270000000000188e+00 -3.987500000000000000e+01 -1.095274999999999999e+00 -3.990625381469726562e+01 -1.095280000000000031e+00 -3.987500000000000000e+01 -1.095285000000000064e+00 -3.984375000000000000e+01 -1.095290000000000097e+00 -3.984375000000000000e+01 -1.095295000000000130e+00 -3.984375000000000000e+01 -1.095300000000000162e+00 -3.987500000000000000e+01 -1.095305000000000195e+00 -3.984375000000000000e+01 -1.095310000000000006e+00 -3.984375000000000000e+01 -1.095315000000000039e+00 -3.990625381469726562e+01 -1.095320000000000071e+00 -3.984375000000000000e+01 -1.095325000000000104e+00 -3.987500000000000000e+01 -1.095330000000000137e+00 -3.987500000000000000e+01 -1.095335000000000170e+00 -3.990625381469726562e+01 -1.095339999999999980e+00 -3.987500000000000000e+01 -1.095345000000000013e+00 -3.981250000000000000e+01 -1.095350000000000046e+00 -3.990625381469726562e+01 -1.095355000000000079e+00 -3.987500000000000000e+01 -1.095360000000000111e+00 -3.981250000000000000e+01 -1.095365000000000144e+00 -3.978125000000000000e+01 -1.095370000000000177e+00 -3.978125000000000000e+01 -1.095374999999999988e+00 -3.984375000000000000e+01 -1.095380000000000020e+00 -3.984375000000000000e+01 -1.095385000000000053e+00 -3.981250000000000000e+01 -1.095390000000000086e+00 -3.984375000000000000e+01 -1.095395000000000119e+00 -3.978125000000000000e+01 -1.095400000000000151e+00 -3.984375000000000000e+01 -1.095405000000000184e+00 -3.987500000000000000e+01 -1.095409999999999995e+00 -3.981250000000000000e+01 -1.095415000000000028e+00 -3.984375000000000000e+01 -1.095420000000000060e+00 -3.984375000000000000e+01 -1.095425000000000093e+00 -3.984375000000000000e+01 -1.095430000000000126e+00 -3.981250000000000000e+01 -1.095435000000000159e+00 -3.984375000000000000e+01 -1.095440000000000191e+00 -3.981250000000000000e+01 -1.095445000000000002e+00 -3.978125000000000000e+01 -1.095450000000000035e+00 -3.981250000000000000e+01 -1.095455000000000068e+00 -3.981250000000000000e+01 -1.095460000000000100e+00 -3.981250000000000000e+01 -1.095465000000000133e+00 -3.984375000000000000e+01 -1.095470000000000166e+00 -3.984375000000000000e+01 -1.095475000000000199e+00 -3.981250000000000000e+01 -1.095480000000000009e+00 -3.987500000000000000e+01 -1.095485000000000042e+00 -3.984375000000000000e+01 -1.095490000000000075e+00 -3.978125000000000000e+01 -1.095495000000000108e+00 -3.984375000000000000e+01 -1.095500000000000140e+00 -3.981250000000000000e+01 -1.095505000000000173e+00 -3.984375000000000000e+01 -1.095509999999999984e+00 -3.978125000000000000e+01 -1.095515000000000017e+00 -3.978125000000000000e+01 -1.095520000000000049e+00 -3.984375000000000000e+01 -1.095525000000000082e+00 -3.984375000000000000e+01 -1.095530000000000115e+00 -3.984375000000000000e+01 -1.095535000000000148e+00 -3.984375000000000000e+01 -1.095540000000000180e+00 -3.984375000000000000e+01 -1.095544999999999991e+00 -3.984375000000000000e+01 -1.095550000000000024e+00 -3.981250000000000000e+01 -1.095555000000000057e+00 -3.984375000000000000e+01 -1.095560000000000089e+00 -3.978125000000000000e+01 -1.095565000000000122e+00 -3.987500000000000000e+01 -1.095570000000000155e+00 -3.978125000000000000e+01 -1.095575000000000188e+00 -3.984375000000000000e+01 -1.095579999999999998e+00 -3.984375000000000000e+01 -1.095585000000000031e+00 -3.984375000000000000e+01 -1.095590000000000064e+00 -3.981250000000000000e+01 -1.095595000000000097e+00 -3.984375000000000000e+01 -1.095600000000000129e+00 -3.984375000000000000e+01 -1.095605000000000162e+00 -3.978125000000000000e+01 -1.095610000000000195e+00 -3.981250000000000000e+01 -1.095615000000000006e+00 -3.984375000000000000e+01 -1.095620000000000038e+00 -3.987500000000000000e+01 -1.095625000000000071e+00 -3.978125000000000000e+01 -1.095630000000000104e+00 -3.981250000000000000e+01 -1.095635000000000137e+00 -3.984375000000000000e+01 -1.095640000000000169e+00 -3.984375000000000000e+01 -1.095644999999999980e+00 -3.984375000000000000e+01 -1.095650000000000013e+00 -3.981250000000000000e+01 -1.095655000000000046e+00 -3.987500000000000000e+01 -1.095660000000000078e+00 -3.984375000000000000e+01 -1.095665000000000111e+00 -3.990625381469726562e+01 -1.095670000000000144e+00 -3.984375000000000000e+01 -1.095675000000000177e+00 -3.978125000000000000e+01 -1.095679999999999987e+00 -3.981250000000000000e+01 -1.095685000000000020e+00 -3.987500000000000000e+01 -1.095690000000000053e+00 -3.984375000000000000e+01 -1.095695000000000086e+00 -3.984375000000000000e+01 -1.095700000000000118e+00 -3.987500000000000000e+01 -1.095705000000000151e+00 -3.984375000000000000e+01 -1.095710000000000184e+00 -3.984375000000000000e+01 -1.095714999999999995e+00 -3.987500000000000000e+01 -1.095720000000000027e+00 -3.984375000000000000e+01 -1.095725000000000060e+00 -3.984375000000000000e+01 -1.095730000000000093e+00 -3.984375000000000000e+01 -1.095735000000000126e+00 -3.981250000000000000e+01 -1.095740000000000158e+00 -3.984375000000000000e+01 -1.095745000000000191e+00 -3.984375000000000000e+01 -1.095750000000000002e+00 -3.981250000000000000e+01 -1.095755000000000035e+00 -3.987500000000000000e+01 -1.095760000000000067e+00 -3.984375000000000000e+01 -1.095765000000000100e+00 -3.990625381469726562e+01 -1.095770000000000133e+00 -3.987500000000000000e+01 -1.095775000000000166e+00 -3.987500000000000000e+01 -1.095780000000000198e+00 -3.987500000000000000e+01 -1.095785000000000009e+00 -3.990625381469726562e+01 -1.095790000000000042e+00 -3.990625381469726562e+01 -1.095795000000000075e+00 -3.984375000000000000e+01 -1.095800000000000107e+00 -3.990625381469726562e+01 -1.095805000000000140e+00 -3.984375000000000000e+01 -1.095810000000000173e+00 -3.984375000000000000e+01 -1.095814999999999984e+00 -3.984375000000000000e+01 -1.095820000000000016e+00 -3.981250000000000000e+01 -1.095825000000000049e+00 -3.984375000000000000e+01 -1.095830000000000082e+00 -3.981250000000000000e+01 -1.095835000000000115e+00 -3.984375000000000000e+01 -1.095840000000000147e+00 -3.984375000000000000e+01 -1.095845000000000180e+00 -3.984375000000000000e+01 -1.095849999999999991e+00 -3.981250000000000000e+01 -1.095855000000000024e+00 -3.990625381469726562e+01 -1.095860000000000056e+00 -3.981250000000000000e+01 -1.095865000000000089e+00 -3.987500000000000000e+01 -1.095870000000000122e+00 -3.984375000000000000e+01 -1.095875000000000155e+00 -3.984375000000000000e+01 -1.095880000000000187e+00 -3.984375000000000000e+01 -1.095884999999999998e+00 -3.984375000000000000e+01 -1.095890000000000031e+00 -3.981250000000000000e+01 -1.095895000000000064e+00 -3.984375000000000000e+01 -1.095900000000000096e+00 -3.984375000000000000e+01 -1.095905000000000129e+00 -3.981250000000000000e+01 -1.095910000000000162e+00 -3.981250000000000000e+01 -1.095915000000000195e+00 -3.978125000000000000e+01 -1.095920000000000005e+00 -3.978125000000000000e+01 -1.095925000000000038e+00 -3.978125000000000000e+01 -1.095930000000000071e+00 -3.981250000000000000e+01 -1.095935000000000104e+00 -3.981250000000000000e+01 -1.095940000000000136e+00 -3.978125000000000000e+01 -1.095945000000000169e+00 -3.981250000000000000e+01 -1.095949999999999980e+00 -3.971875000000000000e+01 -1.095955000000000013e+00 -3.981250000000000000e+01 -1.095960000000000045e+00 -3.975000381469726562e+01 -1.095965000000000078e+00 -3.978125000000000000e+01 -1.095970000000000111e+00 -3.981250000000000000e+01 -1.095975000000000144e+00 -3.975000381469726562e+01 -1.095980000000000176e+00 -3.978125000000000000e+01 -1.095984999999999987e+00 -3.975000381469726562e+01 -1.095990000000000020e+00 -3.978125000000000000e+01 -1.095995000000000053e+00 -3.975000381469726562e+01 -1.096000000000000085e+00 -3.981250000000000000e+01 -1.096005000000000118e+00 -3.981250000000000000e+01 -1.096010000000000151e+00 -3.981250000000000000e+01 -1.096015000000000184e+00 -3.984375000000000000e+01 -1.096019999999999994e+00 -3.984375000000000000e+01 -1.096025000000000027e+00 -3.981250000000000000e+01 -1.096030000000000060e+00 -3.981250000000000000e+01 -1.096035000000000093e+00 -3.984375000000000000e+01 -1.096040000000000125e+00 -3.987500000000000000e+01 -1.096045000000000158e+00 -3.984375000000000000e+01 -1.096050000000000191e+00 -3.987500000000000000e+01 -1.096055000000000001e+00 -3.984375000000000000e+01 -1.096060000000000034e+00 -3.987500000000000000e+01 -1.096065000000000067e+00 -3.984375000000000000e+01 -1.096070000000000100e+00 -3.987500000000000000e+01 -1.096075000000000133e+00 -3.990625381469726562e+01 -1.096080000000000165e+00 -3.984375000000000000e+01 -1.096085000000000198e+00 -3.987500000000000000e+01 -1.096090000000000009e+00 -3.984375000000000000e+01 -1.096095000000000041e+00 -3.987500000000000000e+01 -1.096100000000000074e+00 -3.984375000000000000e+01 -1.096105000000000107e+00 -3.981250000000000000e+01 -1.096110000000000140e+00 -3.984375000000000000e+01 -1.096115000000000173e+00 -3.978125000000000000e+01 -1.096119999999999983e+00 -3.987500000000000000e+01 -1.096125000000000016e+00 -3.981250000000000000e+01 -1.096130000000000049e+00 -3.981250000000000000e+01 -1.096135000000000081e+00 -3.981250000000000000e+01 -1.096140000000000114e+00 -3.984375000000000000e+01 -1.096145000000000147e+00 -3.981250000000000000e+01 -1.096150000000000180e+00 -3.984375000000000000e+01 -1.096154999999999990e+00 -3.987500000000000000e+01 -1.096160000000000023e+00 -3.984375000000000000e+01 -1.096165000000000056e+00 -3.984375000000000000e+01 -1.096170000000000089e+00 -3.984375000000000000e+01 -1.096175000000000122e+00 -3.990625381469726562e+01 -1.096180000000000154e+00 -3.984375000000000000e+01 -1.096185000000000187e+00 -3.981250000000000000e+01 -1.096189999999999998e+00 -3.984375000000000000e+01 -1.096195000000000030e+00 -3.975000381469726562e+01 -1.096200000000000063e+00 -3.990625381469726562e+01 -1.096205000000000096e+00 -3.981250000000000000e+01 -1.096210000000000129e+00 -3.987500000000000000e+01 -1.096215000000000162e+00 -3.981250000000000000e+01 -1.096220000000000194e+00 -3.981250000000000000e+01 -1.096225000000000005e+00 -3.978125000000000000e+01 -1.096230000000000038e+00 -3.990625381469726562e+01 -1.096235000000000070e+00 -3.984375000000000000e+01 -1.096240000000000103e+00 -3.981250000000000000e+01 -1.096245000000000136e+00 -3.978125000000000000e+01 -1.096250000000000169e+00 -3.984375000000000000e+01 -1.096254999999999979e+00 -3.978125000000000000e+01 -1.096260000000000012e+00 -3.984375000000000000e+01 -1.096265000000000045e+00 -3.987500000000000000e+01 -1.096270000000000078e+00 -3.978125000000000000e+01 -1.096275000000000110e+00 -3.978125000000000000e+01 -1.096280000000000143e+00 -3.990625381469726562e+01 -1.096285000000000176e+00 -3.984375000000000000e+01 -1.096289999999999987e+00 -3.981250000000000000e+01 -1.096295000000000019e+00 -3.981250000000000000e+01 -1.096300000000000052e+00 -3.984375000000000000e+01 -1.096305000000000085e+00 -3.981250000000000000e+01 -1.096310000000000118e+00 -3.987500000000000000e+01 -1.096315000000000150e+00 -3.981250000000000000e+01 -1.096320000000000183e+00 -3.981250000000000000e+01 -1.096324999999999994e+00 -3.981250000000000000e+01 -1.096330000000000027e+00 -3.984375000000000000e+01 -1.096335000000000059e+00 -3.978125000000000000e+01 -1.096340000000000092e+00 -3.981250000000000000e+01 -1.096345000000000125e+00 -3.975000381469726562e+01 -1.096350000000000158e+00 -3.981250000000000000e+01 -1.096355000000000190e+00 -3.978125000000000000e+01 -1.096360000000000001e+00 -3.984375000000000000e+01 -1.096365000000000034e+00 -3.981250000000000000e+01 -1.096370000000000067e+00 -3.981250000000000000e+01 -1.096375000000000099e+00 -3.978125000000000000e+01 -1.096380000000000132e+00 -3.978125000000000000e+01 -1.096385000000000165e+00 -3.978125000000000000e+01 -1.096390000000000198e+00 -3.975000381469726562e+01 -1.096395000000000008e+00 -3.975000381469726562e+01 -1.096400000000000041e+00 -3.975000381469726562e+01 -1.096405000000000074e+00 -3.981250000000000000e+01 -1.096410000000000107e+00 -3.978125000000000000e+01 -1.096415000000000139e+00 -3.978125000000000000e+01 -1.096420000000000172e+00 -3.978125000000000000e+01 -1.096424999999999983e+00 -3.978125000000000000e+01 -1.096430000000000016e+00 -3.971875000000000000e+01 -1.096435000000000048e+00 -3.978125000000000000e+01 -1.096440000000000081e+00 -3.978125000000000000e+01 -1.096445000000000114e+00 -3.978125000000000000e+01 -1.096450000000000147e+00 -3.975000381469726562e+01 -1.096455000000000179e+00 -3.975000381469726562e+01 -1.096459999999999990e+00 -3.975000381469726562e+01 -1.096465000000000023e+00 -3.971875000000000000e+01 -1.096470000000000056e+00 -3.975000381469726562e+01 -1.096475000000000088e+00 -3.978125000000000000e+01 -1.096480000000000121e+00 -3.975000381469726562e+01 -1.096485000000000154e+00 -3.971875000000000000e+01 -1.096490000000000187e+00 -3.978125000000000000e+01 -1.096494999999999997e+00 -3.975000381469726562e+01 -1.096500000000000030e+00 -3.975000381469726562e+01 -1.096505000000000063e+00 -3.971875000000000000e+01 -1.096510000000000096e+00 -3.978125000000000000e+01 -1.096515000000000128e+00 -3.971875000000000000e+01 -1.096520000000000161e+00 -3.978125000000000000e+01 -1.096525000000000194e+00 -3.978125000000000000e+01 -1.096530000000000005e+00 -3.978125000000000000e+01 -1.096535000000000037e+00 -3.981250000000000000e+01 -1.096540000000000070e+00 -3.975000381469726562e+01 -1.096545000000000103e+00 -3.978125000000000000e+01 -1.096550000000000136e+00 -3.978125000000000000e+01 -1.096555000000000168e+00 -3.971875000000000000e+01 -1.096559999999999979e+00 -3.975000381469726562e+01 -1.096565000000000012e+00 -3.971875000000000000e+01 -1.096570000000000045e+00 -3.975000381469726562e+01 -1.096575000000000077e+00 -3.978125000000000000e+01 -1.096580000000000110e+00 -3.981250000000000000e+01 -1.096585000000000143e+00 -3.978125000000000000e+01 -1.096590000000000176e+00 -3.975000381469726562e+01 -1.096594999999999986e+00 -3.968750000000000000e+01 -1.096600000000000019e+00 -3.975000381469726562e+01 -1.096605000000000052e+00 -3.978125000000000000e+01 -1.096610000000000085e+00 -3.978125000000000000e+01 -1.096615000000000117e+00 -3.981250000000000000e+01 -1.096620000000000150e+00 -3.978125000000000000e+01 -1.096625000000000183e+00 -3.978125000000000000e+01 -1.096629999999999994e+00 -3.971875000000000000e+01 -1.096635000000000026e+00 -3.975000381469726562e+01 -1.096640000000000059e+00 -3.978125000000000000e+01 -1.096645000000000092e+00 -3.978125000000000000e+01 -1.096650000000000125e+00 -3.984375000000000000e+01 -1.096655000000000157e+00 -3.978125000000000000e+01 -1.096660000000000190e+00 -3.981250000000000000e+01 -1.096665000000000001e+00 -3.981250000000000000e+01 -1.096670000000000034e+00 -3.978125000000000000e+01 -1.096675000000000066e+00 -3.978125000000000000e+01 -1.096680000000000099e+00 -3.978125000000000000e+01 -1.096685000000000132e+00 -3.978125000000000000e+01 -1.096690000000000165e+00 -3.978125000000000000e+01 -1.096695000000000197e+00 -3.978125000000000000e+01 -1.096700000000000008e+00 -3.978125000000000000e+01 -1.096705000000000041e+00 -3.978125000000000000e+01 -1.096710000000000074e+00 -3.975000381469726562e+01 -1.096715000000000106e+00 -3.975000381469726562e+01 -1.096720000000000139e+00 -3.971875000000000000e+01 -1.096725000000000172e+00 -3.981250000000000000e+01 -1.096729999999999983e+00 -3.975000381469726562e+01 -1.096735000000000015e+00 -3.978125000000000000e+01 -1.096740000000000048e+00 -3.975000381469726562e+01 -1.096745000000000081e+00 -3.978125000000000000e+01 -1.096750000000000114e+00 -3.978125000000000000e+01 -1.096755000000000146e+00 -3.978125000000000000e+01 -1.096760000000000179e+00 -3.971875000000000000e+01 -1.096764999999999990e+00 -3.981250000000000000e+01 -1.096770000000000023e+00 -3.978125000000000000e+01 -1.096775000000000055e+00 -3.978125000000000000e+01 -1.096780000000000088e+00 -3.981250000000000000e+01 -1.096785000000000121e+00 -3.975000381469726562e+01 -1.096790000000000154e+00 -3.975000381469726562e+01 -1.096795000000000186e+00 -3.978125000000000000e+01 -1.096799999999999997e+00 -3.978125000000000000e+01 -1.096805000000000030e+00 -3.975000381469726562e+01 -1.096810000000000063e+00 -3.978125000000000000e+01 -1.096815000000000095e+00 -3.978125000000000000e+01 -1.096820000000000128e+00 -3.971875000000000000e+01 -1.096825000000000161e+00 -3.971875000000000000e+01 -1.096830000000000194e+00 -3.981250000000000000e+01 -1.096835000000000004e+00 -3.971875000000000000e+01 -1.096840000000000037e+00 -3.975000381469726562e+01 -1.096845000000000070e+00 -3.975000381469726562e+01 -1.096850000000000103e+00 -3.978125000000000000e+01 -1.096855000000000135e+00 -3.978125000000000000e+01 -1.096860000000000168e+00 -3.975000381469726562e+01 -1.096864999999999979e+00 -3.971875000000000000e+01 -1.096870000000000012e+00 -3.971875000000000000e+01 -1.096875000000000044e+00 -3.978125000000000000e+01 -1.096880000000000077e+00 -3.971875000000000000e+01 -1.096885000000000110e+00 -3.968750000000000000e+01 -1.096890000000000143e+00 -3.968750000000000000e+01 -1.096895000000000175e+00 -3.978125000000000000e+01 -1.096899999999999986e+00 -3.971875000000000000e+01 -1.096905000000000019e+00 -3.971875000000000000e+01 -1.096910000000000052e+00 -3.971875000000000000e+01 -1.096915000000000084e+00 -3.975000381469726562e+01 -1.096920000000000117e+00 -3.971875000000000000e+01 -1.096925000000000150e+00 -3.978125000000000000e+01 -1.096930000000000183e+00 -3.971875000000000000e+01 -1.096934999999999993e+00 -3.971875000000000000e+01 -1.096940000000000026e+00 -3.971875000000000000e+01 -1.096945000000000059e+00 -3.971875000000000000e+01 -1.096950000000000092e+00 -3.978125000000000000e+01 -1.096955000000000124e+00 -3.978125000000000000e+01 -1.096960000000000157e+00 -3.978125000000000000e+01 -1.096965000000000190e+00 -3.975000381469726562e+01 -1.096970000000000001e+00 -3.971875000000000000e+01 -1.096975000000000033e+00 -3.978125000000000000e+01 -1.096980000000000066e+00 -3.981250000000000000e+01 -1.096985000000000099e+00 -3.971875000000000000e+01 -1.096990000000000132e+00 -3.975000381469726562e+01 -1.096995000000000164e+00 -3.975000381469726562e+01 -1.097000000000000197e+00 -3.968750000000000000e+01 -1.097005000000000008e+00 -3.968750000000000000e+01 -1.097010000000000041e+00 -3.975000381469726562e+01 -1.097015000000000073e+00 -3.971875000000000000e+01 -1.097020000000000106e+00 -3.971875000000000000e+01 -1.097025000000000139e+00 -3.975000381469726562e+01 -1.097030000000000172e+00 -3.975000381469726562e+01 -1.097034999999999982e+00 -3.975000381469726562e+01 -1.097040000000000015e+00 -3.971875000000000000e+01 -1.097045000000000048e+00 -3.971875000000000000e+01 -1.097050000000000081e+00 -3.975000381469726562e+01 -1.097055000000000113e+00 -3.975000381469726562e+01 -1.097060000000000146e+00 -3.984375000000000000e+01 -1.097065000000000179e+00 -3.981250000000000000e+01 -1.097069999999999990e+00 -3.978125000000000000e+01 -1.097075000000000022e+00 -3.971875000000000000e+01 -1.097080000000000055e+00 -3.968750000000000000e+01 -1.097085000000000088e+00 -3.971875000000000000e+01 -1.097090000000000121e+00 -3.981250000000000000e+01 -1.097095000000000153e+00 -3.971875000000000000e+01 -1.097100000000000186e+00 -3.971875000000000000e+01 -1.097104999999999997e+00 -3.978125000000000000e+01 -1.097110000000000030e+00 -3.971875000000000000e+01 -1.097115000000000062e+00 -3.975000381469726562e+01 -1.097120000000000095e+00 -3.968750000000000000e+01 -1.097125000000000128e+00 -3.975000381469726562e+01 -1.097130000000000161e+00 -3.984375000000000000e+01 -1.097135000000000193e+00 -3.968750000000000000e+01 -1.097140000000000004e+00 -3.971875000000000000e+01 -1.097145000000000037e+00 -3.971875000000000000e+01 -1.097150000000000070e+00 -3.978125000000000000e+01 -1.097155000000000102e+00 -3.971875000000000000e+01 -1.097160000000000135e+00 -3.978125000000000000e+01 -1.097165000000000168e+00 -3.978125000000000000e+01 -1.097170000000000201e+00 -3.971875000000000000e+01 -1.097175000000000011e+00 -3.975000381469726562e+01 -1.097180000000000044e+00 -3.971875000000000000e+01 -1.097185000000000077e+00 -3.971875000000000000e+01 -1.097190000000000110e+00 -3.975000381469726562e+01 -1.097195000000000142e+00 -3.975000381469726562e+01 -1.097200000000000175e+00 -3.975000381469726562e+01 -1.097204999999999986e+00 -3.978125000000000000e+01 -1.097210000000000019e+00 -3.975000381469726562e+01 -1.097215000000000051e+00 -3.971875000000000000e+01 -1.097220000000000084e+00 -3.968750000000000000e+01 -1.097225000000000117e+00 -3.971875000000000000e+01 -1.097230000000000150e+00 -3.965625000000000000e+01 -1.097235000000000182e+00 -3.968750000000000000e+01 -1.097239999999999993e+00 -3.971875000000000000e+01 -1.097245000000000026e+00 -3.978125000000000000e+01 -1.097250000000000059e+00 -3.968750000000000000e+01 -1.097255000000000091e+00 -3.965625000000000000e+01 -1.097260000000000124e+00 -3.971875000000000000e+01 -1.097265000000000157e+00 -3.965625000000000000e+01 -1.097270000000000190e+00 -3.971875000000000000e+01 -1.097275000000000000e+00 -3.965625000000000000e+01 -1.097280000000000033e+00 -3.965625000000000000e+01 -1.097285000000000066e+00 -3.971875000000000000e+01 -1.097290000000000099e+00 -3.971875000000000000e+01 -1.097295000000000131e+00 -3.971875000000000000e+01 -1.097300000000000164e+00 -3.965625000000000000e+01 -1.097305000000000197e+00 -3.968750000000000000e+01 -1.097310000000000008e+00 -3.965625000000000000e+01 -1.097315000000000040e+00 -3.968750000000000000e+01 -1.097320000000000073e+00 -3.968750000000000000e+01 -1.097325000000000106e+00 -3.965625000000000000e+01 -1.097330000000000139e+00 -3.968750000000000000e+01 -1.097335000000000171e+00 -3.965625000000000000e+01 -1.097339999999999982e+00 -3.965625000000000000e+01 -1.097345000000000015e+00 -3.971875000000000000e+01 -1.097350000000000048e+00 -3.971875000000000000e+01 -1.097355000000000080e+00 -3.965625000000000000e+01 -1.097360000000000113e+00 -3.971875000000000000e+01 -1.097365000000000146e+00 -3.971875000000000000e+01 -1.097370000000000179e+00 -3.968750000000000000e+01 -1.097374999999999989e+00 -3.975000381469726562e+01 -1.097380000000000022e+00 -3.975000381469726562e+01 -1.097385000000000055e+00 -3.975000381469726562e+01 -1.097390000000000088e+00 -3.971875000000000000e+01 -1.097395000000000120e+00 -3.971875000000000000e+01 -1.097400000000000153e+00 -3.978125000000000000e+01 -1.097405000000000186e+00 -3.971875000000000000e+01 -1.097409999999999997e+00 -3.971875000000000000e+01 -1.097415000000000029e+00 -3.971875000000000000e+01 -1.097420000000000062e+00 -3.978125000000000000e+01 -1.097425000000000095e+00 -3.975000381469726562e+01 -1.097430000000000128e+00 -3.968750000000000000e+01 -1.097435000000000160e+00 -3.971875000000000000e+01 -1.097440000000000193e+00 -3.965625000000000000e+01 -1.097445000000000004e+00 -3.971875000000000000e+01 -1.097450000000000037e+00 -3.971875000000000000e+01 -1.097455000000000069e+00 -3.971875000000000000e+01 -1.097460000000000102e+00 -3.978125000000000000e+01 -1.097465000000000135e+00 -3.975000381469726562e+01 -1.097470000000000168e+00 -3.975000381469726562e+01 -1.097475000000000200e+00 -3.971875000000000000e+01 -1.097480000000000011e+00 -3.971875000000000000e+01 -1.097485000000000044e+00 -3.971875000000000000e+01 -1.097490000000000077e+00 -3.975000381469726562e+01 -1.097495000000000109e+00 -3.968750000000000000e+01 -1.097500000000000142e+00 -3.971875000000000000e+01 -1.097505000000000175e+00 -3.971875000000000000e+01 -1.097509999999999986e+00 -3.968750000000000000e+01 -1.097515000000000018e+00 -3.975000381469726562e+01 -1.097520000000000051e+00 -3.975000381469726562e+01 -1.097525000000000084e+00 -3.971875000000000000e+01 -1.097530000000000117e+00 -3.971875000000000000e+01 -1.097535000000000149e+00 -3.975000381469726562e+01 -1.097540000000000182e+00 -3.971875000000000000e+01 -1.097544999999999993e+00 -3.968750000000000000e+01 -1.097550000000000026e+00 -3.971875000000000000e+01 -1.097555000000000058e+00 -3.971875000000000000e+01 -1.097560000000000091e+00 -3.971875000000000000e+01 -1.097565000000000124e+00 -3.971875000000000000e+01 -1.097570000000000157e+00 -3.971875000000000000e+01 -1.097575000000000189e+00 -3.975000381469726562e+01 -1.097580000000000000e+00 -3.971875000000000000e+01 -1.097585000000000033e+00 -3.968750000000000000e+01 -1.097590000000000066e+00 -3.978125000000000000e+01 -1.097595000000000098e+00 -3.971875000000000000e+01 -1.097600000000000131e+00 -3.978125000000000000e+01 -1.097605000000000164e+00 -3.971875000000000000e+01 -1.097610000000000197e+00 -3.975000381469726562e+01 -1.097615000000000007e+00 -3.971875000000000000e+01 -1.097620000000000040e+00 -3.968750000000000000e+01 -1.097625000000000073e+00 -3.971875000000000000e+01 -1.097630000000000106e+00 -3.978125000000000000e+01 -1.097635000000000138e+00 -3.975000381469726562e+01 -1.097640000000000171e+00 -3.971875000000000000e+01 -1.097644999999999982e+00 -3.971875000000000000e+01 -1.097650000000000015e+00 -3.978125000000000000e+01 -1.097655000000000047e+00 -3.975000381469726562e+01 -1.097660000000000080e+00 -3.975000381469726562e+01 -1.097665000000000113e+00 -3.975000381469726562e+01 -1.097670000000000146e+00 -3.971875000000000000e+01 -1.097675000000000178e+00 -3.965625000000000000e+01 -1.097679999999999989e+00 -3.978125000000000000e+01 -1.097685000000000022e+00 -3.978125000000000000e+01 -1.097690000000000055e+00 -3.968750000000000000e+01 -1.097695000000000087e+00 -3.968750000000000000e+01 -1.097700000000000120e+00 -3.975000381469726562e+01 -1.097705000000000153e+00 -3.968750000000000000e+01 -1.097710000000000186e+00 -3.971875000000000000e+01 -1.097714999999999996e+00 -3.975000381469726562e+01 -1.097720000000000029e+00 -3.968750000000000000e+01 -1.097725000000000062e+00 -3.965625000000000000e+01 -1.097730000000000095e+00 -3.968750000000000000e+01 -1.097735000000000127e+00 -3.965625000000000000e+01 -1.097740000000000160e+00 -3.971875000000000000e+01 -1.097745000000000193e+00 -3.968750000000000000e+01 -1.097750000000000004e+00 -3.971875000000000000e+01 -1.097755000000000036e+00 -3.968750000000000000e+01 -1.097760000000000069e+00 -3.971875000000000000e+01 -1.097765000000000102e+00 -3.971875000000000000e+01 -1.097770000000000135e+00 -3.968750000000000000e+01 -1.097775000000000167e+00 -3.971875000000000000e+01 -1.097780000000000200e+00 -3.971875000000000000e+01 -1.097785000000000011e+00 -3.971875000000000000e+01 -1.097790000000000044e+00 -3.968750000000000000e+01 -1.097795000000000076e+00 -3.968750000000000000e+01 -1.097800000000000109e+00 -3.968750000000000000e+01 -1.097805000000000142e+00 -3.971875000000000000e+01 -1.097810000000000175e+00 -3.968750000000000000e+01 -1.097814999999999985e+00 -3.968750000000000000e+01 -1.097820000000000018e+00 -3.968750000000000000e+01 -1.097825000000000051e+00 -3.962500000000000000e+01 -1.097830000000000084e+00 -3.971875000000000000e+01 -1.097835000000000116e+00 -3.965625000000000000e+01 -1.097840000000000149e+00 -3.971875000000000000e+01 -1.097845000000000182e+00 -3.965625000000000000e+01 -1.097849999999999993e+00 -3.971875000000000000e+01 -1.097855000000000025e+00 -3.965625000000000000e+01 -1.097860000000000058e+00 -3.975000381469726562e+01 -1.097865000000000091e+00 -3.965625000000000000e+01 -1.097870000000000124e+00 -3.968750000000000000e+01 -1.097875000000000156e+00 -3.962500000000000000e+01 -1.097880000000000189e+00 -3.962500000000000000e+01 -1.097885000000000000e+00 -3.965625000000000000e+01 -1.097890000000000033e+00 -3.971875000000000000e+01 -1.097895000000000065e+00 -3.965625000000000000e+01 -1.097900000000000098e+00 -3.978125000000000000e+01 -1.097905000000000131e+00 -3.968750000000000000e+01 -1.097910000000000164e+00 -3.975000381469726562e+01 -1.097915000000000196e+00 -3.971875000000000000e+01 -1.097920000000000007e+00 -3.975000381469726562e+01 -1.097925000000000040e+00 -3.965625000000000000e+01 -1.097930000000000073e+00 -3.975000381469726562e+01 -1.097935000000000105e+00 -3.971875000000000000e+01 -1.097940000000000138e+00 -3.968750000000000000e+01 -1.097945000000000171e+00 -3.971875000000000000e+01 -1.097949999999999982e+00 -3.968750000000000000e+01 -1.097955000000000014e+00 -3.965625000000000000e+01 -1.097960000000000047e+00 -3.962500000000000000e+01 -1.097965000000000080e+00 -3.968750000000000000e+01 -1.097970000000000113e+00 -3.965625000000000000e+01 -1.097975000000000145e+00 -3.965625000000000000e+01 -1.097980000000000178e+00 -3.968750000000000000e+01 -1.097984999999999989e+00 -3.965625000000000000e+01 -1.097990000000000022e+00 -3.975000381469726562e+01 -1.097995000000000054e+00 -3.975000381469726562e+01 -1.098000000000000087e+00 -3.968750000000000000e+01 -1.098005000000000120e+00 -3.978125000000000000e+01 -1.098010000000000153e+00 -3.965625000000000000e+01 -1.098015000000000185e+00 -3.968750000000000000e+01 -1.098019999999999996e+00 -3.975000381469726562e+01 -1.098025000000000029e+00 -3.965625000000000000e+01 -1.098030000000000062e+00 -3.971875000000000000e+01 -1.098035000000000094e+00 -3.968750000000000000e+01 -1.098040000000000127e+00 -3.968750000000000000e+01 -1.098045000000000160e+00 -3.965625000000000000e+01 -1.098050000000000193e+00 -3.971875000000000000e+01 -1.098055000000000003e+00 -3.959375381469726562e+01 -1.098060000000000036e+00 -3.962500000000000000e+01 -1.098065000000000069e+00 -3.962500000000000000e+01 -1.098070000000000102e+00 -3.965625000000000000e+01 -1.098075000000000134e+00 -3.965625000000000000e+01 -1.098080000000000167e+00 -3.968750000000000000e+01 -1.098085000000000200e+00 -3.959375381469726562e+01 -1.098090000000000011e+00 -3.971875000000000000e+01 -1.098095000000000043e+00 -3.965625000000000000e+01 -1.098100000000000076e+00 -3.959375381469726562e+01 -1.098105000000000109e+00 -3.965625000000000000e+01 -1.098110000000000142e+00 -3.965625000000000000e+01 -1.098115000000000174e+00 -3.962500000000000000e+01 -1.098119999999999985e+00 -3.962500000000000000e+01 -1.098125000000000018e+00 -3.959375381469726562e+01 -1.098130000000000051e+00 -3.965625000000000000e+01 -1.098135000000000083e+00 -3.968750000000000000e+01 -1.098140000000000116e+00 -3.965625000000000000e+01 -1.098145000000000149e+00 -3.956250000000000000e+01 -1.098150000000000182e+00 -3.962500000000000000e+01 -1.098154999999999992e+00 -3.965625000000000000e+01 -1.098160000000000025e+00 -3.956250000000000000e+01 -1.098165000000000058e+00 -3.959375381469726562e+01 -1.098170000000000091e+00 -3.965625000000000000e+01 -1.098175000000000123e+00 -3.965625000000000000e+01 -1.098180000000000156e+00 -3.959375381469726562e+01 -1.098185000000000189e+00 -3.965625000000000000e+01 -1.098190000000000000e+00 -3.965625000000000000e+01 -1.098195000000000032e+00 -3.965625000000000000e+01 -1.098200000000000065e+00 -3.962500000000000000e+01 -1.098205000000000098e+00 -3.965625000000000000e+01 -1.098210000000000131e+00 -3.956250000000000000e+01 -1.098215000000000163e+00 -3.962500000000000000e+01 -1.098220000000000196e+00 -3.959375381469726562e+01 -1.098225000000000007e+00 -3.965625000000000000e+01 -1.098230000000000040e+00 -3.959375381469726562e+01 -1.098235000000000072e+00 -3.956250000000000000e+01 -1.098240000000000105e+00 -3.965625000000000000e+01 -1.098245000000000138e+00 -3.959375381469726562e+01 -1.098250000000000171e+00 -3.959375381469726562e+01 -1.098254999999999981e+00 -3.965625000000000000e+01 -1.098260000000000014e+00 -3.959375381469726562e+01 -1.098265000000000047e+00 -3.965625000000000000e+01 -1.098270000000000080e+00 -3.950000000000000000e+01 -1.098275000000000112e+00 -3.959375381469726562e+01 -1.098280000000000145e+00 -3.956250000000000000e+01 -1.098285000000000178e+00 -3.956250000000000000e+01 -1.098289999999999988e+00 -3.956250000000000000e+01 -1.098295000000000021e+00 -3.965625000000000000e+01 -1.098300000000000054e+00 -3.959375381469726562e+01 -1.098305000000000087e+00 -3.953125000000000000e+01 -1.098310000000000120e+00 -3.956250000000000000e+01 -1.098315000000000152e+00 -3.959375381469726562e+01 -1.098320000000000185e+00 -3.962500000000000000e+01 -1.098324999999999996e+00 -3.959375381469726562e+01 -1.098330000000000028e+00 -3.959375381469726562e+01 -1.098335000000000061e+00 -3.956250000000000000e+01 -1.098340000000000094e+00 -3.956250000000000000e+01 -1.098345000000000127e+00 -3.962500000000000000e+01 -1.098350000000000160e+00 -3.956250000000000000e+01 -1.098355000000000192e+00 -3.959375381469726562e+01 -1.098360000000000003e+00 -3.959375381469726562e+01 -1.098365000000000036e+00 -3.956250000000000000e+01 -1.098370000000000068e+00 -3.959375381469726562e+01 -1.098375000000000101e+00 -3.959375381469726562e+01 -1.098380000000000134e+00 -3.962500000000000000e+01 -1.098385000000000167e+00 -3.953125000000000000e+01 -1.098390000000000200e+00 -3.953125000000000000e+01 -1.098395000000000010e+00 -3.956250000000000000e+01 -1.098400000000000043e+00 -3.956250000000000000e+01 -1.098405000000000076e+00 -3.953125000000000000e+01 -1.098410000000000108e+00 -3.956250000000000000e+01 -1.098415000000000141e+00 -3.962500000000000000e+01 -1.098420000000000174e+00 -3.956250000000000000e+01 -1.098424999999999985e+00 -3.956250000000000000e+01 -1.098430000000000017e+00 -3.959375381469726562e+01 -1.098435000000000050e+00 -3.965625000000000000e+01 -1.098440000000000083e+00 -3.953125000000000000e+01 -1.098445000000000116e+00 -3.956250000000000000e+01 -1.098450000000000149e+00 -3.953125000000000000e+01 -1.098455000000000181e+00 -3.953125000000000000e+01 -1.098459999999999992e+00 -3.950000000000000000e+01 -1.098465000000000025e+00 -3.962500000000000000e+01 -1.098470000000000057e+00 -3.953125000000000000e+01 -1.098475000000000090e+00 -3.956250000000000000e+01 -1.098480000000000123e+00 -3.953125000000000000e+01 -1.098485000000000156e+00 -3.953125000000000000e+01 -1.098490000000000189e+00 -3.956250000000000000e+01 -1.098494999999999999e+00 -3.956250000000000000e+01 -1.098500000000000032e+00 -3.953125000000000000e+01 -1.098505000000000065e+00 -3.950000000000000000e+01 -1.098510000000000097e+00 -3.953125000000000000e+01 -1.098515000000000130e+00 -3.953125000000000000e+01 -1.098520000000000163e+00 -3.953125000000000000e+01 -1.098525000000000196e+00 -3.950000000000000000e+01 -1.098530000000000006e+00 -3.956250000000000000e+01 -1.098535000000000039e+00 -3.953125000000000000e+01 -1.098540000000000072e+00 -3.959375381469726562e+01 -1.098545000000000105e+00 -3.956250000000000000e+01 -1.098550000000000137e+00 -3.959375381469726562e+01 -1.098555000000000170e+00 -3.956250000000000000e+01 -1.098559999999999981e+00 -3.950000000000000000e+01 -1.098565000000000014e+00 -3.959375381469726562e+01 -1.098570000000000046e+00 -3.953125000000000000e+01 -1.098575000000000079e+00 -3.956250000000000000e+01 -1.098580000000000112e+00 -3.953125000000000000e+01 -1.098585000000000145e+00 -3.953125000000000000e+01 -1.098590000000000177e+00 -3.953125000000000000e+01 -1.098594999999999988e+00 -3.953125000000000000e+01 -1.098600000000000021e+00 -3.956250000000000000e+01 -1.098605000000000054e+00 -3.953125000000000000e+01 -1.098610000000000086e+00 -3.950000000000000000e+01 -1.098615000000000119e+00 -3.950000000000000000e+01 -1.098620000000000152e+00 -3.950000000000000000e+01 -1.098625000000000185e+00 -3.950000000000000000e+01 -1.098629999999999995e+00 -3.956250000000000000e+01 -1.098635000000000028e+00 -3.956250000000000000e+01 -1.098640000000000061e+00 -3.953125000000000000e+01 -1.098645000000000094e+00 -3.950000000000000000e+01 -1.098650000000000126e+00 -3.953125000000000000e+01 -1.098655000000000159e+00 -3.953125000000000000e+01 -1.098660000000000192e+00 -3.950000000000000000e+01 -1.098665000000000003e+00 -3.950000000000000000e+01 -1.098670000000000035e+00 -3.946875000000000000e+01 -1.098675000000000068e+00 -3.950000000000000000e+01 -1.098680000000000101e+00 -3.953125000000000000e+01 -1.098685000000000134e+00 -3.950000000000000000e+01 -1.098690000000000166e+00 -3.953125000000000000e+01 -1.098695000000000199e+00 -3.946875000000000000e+01 -1.098700000000000010e+00 -3.950000000000000000e+01 -1.098705000000000043e+00 -3.953125000000000000e+01 -1.098710000000000075e+00 -3.953125000000000000e+01 -1.098715000000000108e+00 -3.953125000000000000e+01 -1.098720000000000141e+00 -3.950000000000000000e+01 -1.098725000000000174e+00 -3.950000000000000000e+01 -1.098729999999999984e+00 -3.953125000000000000e+01 -1.098735000000000017e+00 -3.950000000000000000e+01 -1.098740000000000050e+00 -3.953125000000000000e+01 -1.098745000000000083e+00 -3.953125000000000000e+01 -1.098750000000000115e+00 -3.953125000000000000e+01 -1.098755000000000148e+00 -3.953125000000000000e+01 -1.098760000000000181e+00 -3.953125000000000000e+01 -1.098764999999999992e+00 -3.953125000000000000e+01 -1.098770000000000024e+00 -3.953125000000000000e+01 -1.098775000000000057e+00 -3.950000000000000000e+01 -1.098780000000000090e+00 -3.953125000000000000e+01 -1.098785000000000123e+00 -3.943750381469726562e+01 -1.098790000000000155e+00 -3.953125000000000000e+01 -1.098795000000000188e+00 -3.953125000000000000e+01 -1.098799999999999999e+00 -3.950000000000000000e+01 -1.098805000000000032e+00 -3.953125000000000000e+01 -1.098810000000000064e+00 -3.950000000000000000e+01 -1.098815000000000097e+00 -3.956250000000000000e+01 -1.098820000000000130e+00 -3.953125000000000000e+01 -1.098825000000000163e+00 -3.953125000000000000e+01 -1.098830000000000195e+00 -3.953125000000000000e+01 -1.098835000000000006e+00 -3.946875000000000000e+01 -1.098840000000000039e+00 -3.956250000000000000e+01 -1.098845000000000072e+00 -3.953125000000000000e+01 -1.098850000000000104e+00 -3.950000000000000000e+01 -1.098855000000000137e+00 -3.946875000000000000e+01 -1.098860000000000170e+00 -3.953125000000000000e+01 -1.098864999999999981e+00 -3.953125000000000000e+01 -1.098870000000000013e+00 -3.953125000000000000e+01 -1.098875000000000046e+00 -3.953125000000000000e+01 -1.098880000000000079e+00 -3.950000000000000000e+01 -1.098885000000000112e+00 -3.950000000000000000e+01 -1.098890000000000144e+00 -3.950000000000000000e+01 -1.098895000000000177e+00 -3.946875000000000000e+01 -1.098899999999999988e+00 -3.950000000000000000e+01 -1.098905000000000021e+00 -3.953125000000000000e+01 -1.098910000000000053e+00 -3.943750381469726562e+01 -1.098915000000000086e+00 -3.950000000000000000e+01 -1.098920000000000119e+00 -3.950000000000000000e+01 -1.098925000000000152e+00 -3.953125000000000000e+01 -1.098930000000000184e+00 -3.946875000000000000e+01 -1.098934999999999995e+00 -3.956250000000000000e+01 -1.098940000000000028e+00 -3.956250000000000000e+01 -1.098945000000000061e+00 -3.953125000000000000e+01 -1.098950000000000093e+00 -3.953125000000000000e+01 -1.098955000000000126e+00 -3.950000000000000000e+01 -1.098960000000000159e+00 -3.946875000000000000e+01 -1.098965000000000192e+00 -3.953125000000000000e+01 -1.098970000000000002e+00 -3.956250000000000000e+01 -1.098975000000000035e+00 -3.953125000000000000e+01 -1.098980000000000068e+00 -3.950000000000000000e+01 -1.098985000000000101e+00 -3.950000000000000000e+01 -1.098990000000000133e+00 -3.956250000000000000e+01 -1.098995000000000166e+00 -3.950000000000000000e+01 -1.099000000000000199e+00 -3.953125000000000000e+01 -1.099005000000000010e+00 -3.950000000000000000e+01 -1.099010000000000042e+00 -3.959375381469726562e+01 -1.099015000000000075e+00 -3.953125000000000000e+01 -1.099020000000000108e+00 -3.953125000000000000e+01 -1.099025000000000141e+00 -3.953125000000000000e+01 -1.099030000000000173e+00 -3.950000000000000000e+01 -1.099034999999999984e+00 -3.943750381469726562e+01 -1.099040000000000017e+00 -3.950000000000000000e+01 -1.099045000000000050e+00 -3.950000000000000000e+01 -1.099050000000000082e+00 -3.946875000000000000e+01 -1.099055000000000115e+00 -3.943750381469726562e+01 -1.099060000000000148e+00 -3.946875000000000000e+01 -1.099065000000000181e+00 -3.946875000000000000e+01 -1.099069999999999991e+00 -3.943750381469726562e+01 -1.099075000000000024e+00 -3.950000000000000000e+01 -1.099080000000000057e+00 -3.953125000000000000e+01 -1.099085000000000090e+00 -3.946875000000000000e+01 -1.099090000000000122e+00 -3.950000000000000000e+01 -1.099095000000000155e+00 -3.943750381469726562e+01 -1.099100000000000188e+00 -3.950000000000000000e+01 -1.099104999999999999e+00 -3.943750381469726562e+01 -1.099110000000000031e+00 -3.946875000000000000e+01 -1.099115000000000064e+00 -3.940625000000000000e+01 -1.099120000000000097e+00 -3.946875000000000000e+01 -1.099125000000000130e+00 -3.940625000000000000e+01 -1.099130000000000162e+00 -3.940625000000000000e+01 -1.099135000000000195e+00 -3.940625000000000000e+01 -1.099140000000000006e+00 -3.946875000000000000e+01 -1.099145000000000039e+00 -3.943750381469726562e+01 -1.099150000000000071e+00 -3.943750381469726562e+01 -1.099155000000000104e+00 -3.943750381469726562e+01 -1.099160000000000137e+00 -3.943750381469726562e+01 -1.099165000000000170e+00 -3.943750381469726562e+01 -1.099169999999999980e+00 -3.943750381469726562e+01 -1.099175000000000013e+00 -3.946875000000000000e+01 -1.099180000000000046e+00 -3.943750381469726562e+01 -1.099185000000000079e+00 -3.946875000000000000e+01 -1.099190000000000111e+00 -3.937500000000000000e+01 -1.099195000000000144e+00 -3.940625000000000000e+01 -1.099200000000000177e+00 -3.943750381469726562e+01 -1.099204999999999988e+00 -3.940625000000000000e+01 -1.099210000000000020e+00 -3.943750381469726562e+01 -1.099215000000000053e+00 -3.940625000000000000e+01 -1.099220000000000086e+00 -3.943750381469726562e+01 -1.099225000000000119e+00 -3.943750381469726562e+01 -1.099230000000000151e+00 -3.943750381469726562e+01 -1.099235000000000184e+00 -3.943750381469726562e+01 -1.099239999999999995e+00 -3.940625000000000000e+01 -1.099245000000000028e+00 -3.937500000000000000e+01 -1.099250000000000060e+00 -3.940625000000000000e+01 -1.099255000000000093e+00 -3.937500000000000000e+01 -1.099260000000000126e+00 -3.943750381469726562e+01 -1.099265000000000159e+00 -3.943750381469726562e+01 -1.099270000000000191e+00 -3.940625000000000000e+01 -1.099275000000000002e+00 -3.940625000000000000e+01 -1.099280000000000035e+00 -3.943750381469726562e+01 -1.099285000000000068e+00 -3.943750381469726562e+01 -1.099290000000000100e+00 -3.937500000000000000e+01 -1.099295000000000133e+00 -3.940625000000000000e+01 -1.099300000000000166e+00 -3.937500000000000000e+01 -1.099305000000000199e+00 -3.943750381469726562e+01 -1.099310000000000009e+00 -3.937500000000000000e+01 -1.099315000000000042e+00 -3.940625000000000000e+01 -1.099320000000000075e+00 -3.940625000000000000e+01 -1.099325000000000108e+00 -3.937500000000000000e+01 -1.099330000000000140e+00 -3.937500000000000000e+01 -1.099335000000000173e+00 -3.937500000000000000e+01 -1.099339999999999984e+00 -3.940625000000000000e+01 -1.099345000000000017e+00 -3.937500000000000000e+01 -1.099350000000000049e+00 -3.937500000000000000e+01 -1.099355000000000082e+00 -3.940625000000000000e+01 -1.099360000000000115e+00 -3.940625000000000000e+01 -1.099365000000000148e+00 -3.934375381469726562e+01 -1.099370000000000180e+00 -3.931250000000000000e+01 -1.099374999999999991e+00 -3.940625000000000000e+01 -1.099380000000000024e+00 -3.940625000000000000e+01 -1.099385000000000057e+00 -3.943750381469726562e+01 -1.099390000000000089e+00 -3.934375381469726562e+01 -1.099395000000000122e+00 -3.943750381469726562e+01 -1.099400000000000155e+00 -3.940625000000000000e+01 -1.099405000000000188e+00 -3.934375381469726562e+01 -1.099409999999999998e+00 -3.937500000000000000e+01 -1.099415000000000031e+00 -3.937500000000000000e+01 -1.099420000000000064e+00 -3.940625000000000000e+01 -1.099425000000000097e+00 -3.943750381469726562e+01 -1.099430000000000129e+00 -3.937500000000000000e+01 -1.099435000000000162e+00 -3.940625000000000000e+01 -1.099440000000000195e+00 -3.943750381469726562e+01 -1.099445000000000006e+00 -3.940625000000000000e+01 -1.099450000000000038e+00 -3.943750381469726562e+01 -1.099455000000000071e+00 -3.934375381469726562e+01 -1.099460000000000104e+00 -3.943750381469726562e+01 -1.099465000000000137e+00 -3.937500000000000000e+01 -1.099470000000000169e+00 -3.937500000000000000e+01 -1.099474999999999980e+00 -3.943750381469726562e+01 -1.099480000000000013e+00 -3.937500000000000000e+01 -1.099485000000000046e+00 -3.943750381469726562e+01 -1.099490000000000078e+00 -3.940625000000000000e+01 -1.099495000000000111e+00 -3.937500000000000000e+01 -1.099500000000000144e+00 -3.940625000000000000e+01 -1.099505000000000177e+00 -3.940625000000000000e+01 -1.099509999999999987e+00 -3.943750381469726562e+01 -1.099515000000000020e+00 -3.943750381469726562e+01 -1.099520000000000053e+00 -3.946875000000000000e+01 -1.099525000000000086e+00 -3.943750381469726562e+01 -1.099530000000000118e+00 -3.940625000000000000e+01 -1.099535000000000151e+00 -3.940625000000000000e+01 -1.099540000000000184e+00 -3.940625000000000000e+01 -1.099544999999999995e+00 -3.940625000000000000e+01 -1.099550000000000027e+00 -3.940625000000000000e+01 -1.099555000000000060e+00 -3.937500000000000000e+01 -1.099560000000000093e+00 -3.946875000000000000e+01 -1.099565000000000126e+00 -3.937500000000000000e+01 -1.099570000000000158e+00 -3.937500000000000000e+01 -1.099575000000000191e+00 -3.940625000000000000e+01 -1.099580000000000002e+00 -3.937500000000000000e+01 -1.099585000000000035e+00 -3.937500000000000000e+01 -1.099590000000000067e+00 -3.937500000000000000e+01 -1.099595000000000100e+00 -3.943750381469726562e+01 -1.099600000000000133e+00 -3.937500000000000000e+01 -1.099605000000000166e+00 -3.934375381469726562e+01 -1.099610000000000198e+00 -3.937500000000000000e+01 -1.099615000000000009e+00 -3.940625000000000000e+01 -1.099620000000000042e+00 -3.943750381469726562e+01 -1.099625000000000075e+00 -3.943750381469726562e+01 -1.099630000000000107e+00 -3.940625000000000000e+01 -1.099635000000000140e+00 -3.943750381469726562e+01 -1.099640000000000173e+00 -3.943750381469726562e+01 -1.099644999999999984e+00 -3.937500000000000000e+01 -1.099650000000000016e+00 -3.943750381469726562e+01 -1.099655000000000049e+00 -3.940625000000000000e+01 -1.099660000000000082e+00 -3.937500000000000000e+01 -1.099665000000000115e+00 -3.937500000000000000e+01 -1.099670000000000147e+00 -3.943750381469726562e+01 -1.099675000000000180e+00 -3.937500000000000000e+01 -1.099679999999999991e+00 -3.940625000000000000e+01 -1.099685000000000024e+00 -3.937500000000000000e+01 -1.099690000000000056e+00 -3.934375381469726562e+01 -1.099695000000000089e+00 -3.937500000000000000e+01 -1.099700000000000122e+00 -3.934375381469726562e+01 -1.099705000000000155e+00 -3.940625000000000000e+01 -1.099710000000000187e+00 -3.934375381469726562e+01 -1.099714999999999998e+00 -3.934375381469726562e+01 -1.099720000000000031e+00 -3.937500000000000000e+01 -1.099725000000000064e+00 -3.934375381469726562e+01 -1.099730000000000096e+00 -3.940625000000000000e+01 -1.099735000000000129e+00 -3.940625000000000000e+01 -1.099740000000000162e+00 -3.937500000000000000e+01 -1.099745000000000195e+00 -3.940625000000000000e+01 -1.099750000000000005e+00 -3.934375381469726562e+01 -1.099755000000000038e+00 -3.937500000000000000e+01 -1.099760000000000071e+00 -3.934375381469726562e+01 -1.099765000000000104e+00 -3.934375381469726562e+01 -1.099770000000000136e+00 -3.937500000000000000e+01 -1.099775000000000169e+00 -3.934375381469726562e+01 -1.099779999999999980e+00 -3.934375381469726562e+01 -1.099785000000000013e+00 -3.931250000000000000e+01 -1.099790000000000045e+00 -3.931250000000000000e+01 -1.099795000000000078e+00 -3.934375381469726562e+01 -1.099800000000000111e+00 -3.937500000000000000e+01 -1.099805000000000144e+00 -3.937500000000000000e+01 -1.099810000000000176e+00 -3.937500000000000000e+01 -1.099814999999999987e+00 -3.931250000000000000e+01 -1.099820000000000020e+00 -3.928125000000000000e+01 -1.099825000000000053e+00 -3.937500000000000000e+01 -1.099830000000000085e+00 -3.937500000000000000e+01 -1.099835000000000118e+00 -3.934375381469726562e+01 -1.099840000000000151e+00 -3.934375381469726562e+01 -1.099845000000000184e+00 -3.931250000000000000e+01 -1.099849999999999994e+00 -3.937500000000000000e+01 -1.099855000000000027e+00 -3.931250000000000000e+01 -1.099860000000000060e+00 -3.934375381469726562e+01 -1.099865000000000093e+00 -3.928125000000000000e+01 -1.099870000000000125e+00 -3.928125000000000000e+01 -1.099875000000000158e+00 -3.925000000000000000e+01 -1.099880000000000191e+00 -3.931250000000000000e+01 -1.099885000000000002e+00 -3.928125000000000000e+01 -1.099890000000000034e+00 -3.925000000000000000e+01 -1.099895000000000067e+00 -3.928125000000000000e+01 -1.099900000000000100e+00 -3.928125000000000000e+01 -1.099905000000000133e+00 -3.928125000000000000e+01 -1.099910000000000165e+00 -3.934375381469726562e+01 -1.099915000000000198e+00 -3.934375381469726562e+01 -1.099920000000000009e+00 -3.928125000000000000e+01 -1.099925000000000042e+00 -3.931250000000000000e+01 -1.099930000000000074e+00 -3.928125000000000000e+01 -1.099935000000000107e+00 -3.928125000000000000e+01 -1.099940000000000140e+00 -3.931250000000000000e+01 -1.099945000000000173e+00 -3.931250000000000000e+01 -1.099949999999999983e+00 -3.928125000000000000e+01 -1.099955000000000016e+00 -3.925000000000000000e+01 -1.099960000000000049e+00 -3.925000000000000000e+01 -1.099965000000000082e+00 -3.921875000000000000e+01 -1.099970000000000114e+00 -3.925000000000000000e+01 -1.099975000000000147e+00 -3.928125000000000000e+01 -1.099980000000000180e+00 -3.931250000000000000e+01 -1.099984999999999991e+00 -3.931250000000000000e+01 -1.099990000000000023e+00 -3.928125000000000000e+01 -1.099995000000000056e+00 -3.931250000000000000e+01 -1.100000000000000089e+00 -3.925000000000000000e+01 -1.100005000000000122e+00 -3.928125000000000000e+01 -1.100010000000000154e+00 -3.934375381469726562e+01 -1.100015000000000187e+00 -3.931250000000000000e+01 -1.100019999999999998e+00 -3.928125000000000000e+01 -1.100025000000000031e+00 -3.931250000000000000e+01 -1.100030000000000063e+00 -3.931250000000000000e+01 -1.100035000000000096e+00 -3.928125000000000000e+01 -1.100040000000000129e+00 -3.934375381469726562e+01 -1.100045000000000162e+00 -3.921875000000000000e+01 -1.100050000000000194e+00 -3.928125000000000000e+01 -1.100055000000000005e+00 -3.931250000000000000e+01 -1.100060000000000038e+00 -3.925000000000000000e+01 -1.100065000000000071e+00 -3.925000000000000000e+01 -1.100070000000000103e+00 -3.921875000000000000e+01 -1.100075000000000136e+00 -3.931250000000000000e+01 -1.100080000000000169e+00 -3.931250000000000000e+01 -1.100084999999999980e+00 -3.925000000000000000e+01 -1.100090000000000012e+00 -3.921875000000000000e+01 -1.100095000000000045e+00 -3.928125000000000000e+01 -1.100100000000000078e+00 -3.928125000000000000e+01 -1.100105000000000111e+00 -3.928125000000000000e+01 -1.100110000000000143e+00 -3.928125000000000000e+01 -1.100115000000000176e+00 -3.934375381469726562e+01 -1.100119999999999987e+00 -3.921875000000000000e+01 -1.100125000000000020e+00 -3.921875000000000000e+01 -1.100130000000000052e+00 -3.928125000000000000e+01 -1.100135000000000085e+00 -3.928125000000000000e+01 -1.100140000000000118e+00 -3.928125000000000000e+01 -1.100145000000000151e+00 -3.925000000000000000e+01 -1.100150000000000183e+00 -3.925000000000000000e+01 -1.100154999999999994e+00 -3.928125000000000000e+01 -1.100160000000000027e+00 -3.921875000000000000e+01 -1.100165000000000060e+00 -3.925000000000000000e+01 -1.100170000000000092e+00 -3.925000000000000000e+01 -1.100175000000000125e+00 -3.928125000000000000e+01 -1.100180000000000158e+00 -3.928125000000000000e+01 -1.100185000000000191e+00 -3.928125000000000000e+01 -1.100190000000000001e+00 -3.925000000000000000e+01 -1.100195000000000034e+00 -3.928125000000000000e+01 -1.100200000000000067e+00 -3.928125000000000000e+01 -1.100205000000000100e+00 -3.921875000000000000e+01 -1.100210000000000132e+00 -3.925000000000000000e+01 -1.100215000000000165e+00 -3.928125000000000000e+01 -1.100220000000000198e+00 -3.928125000000000000e+01 -1.100225000000000009e+00 -3.928125000000000000e+01 -1.100230000000000041e+00 -3.921875000000000000e+01 -1.100235000000000074e+00 -3.921875000000000000e+01 -1.100240000000000107e+00 -3.925000000000000000e+01 -1.100245000000000140e+00 -3.928125000000000000e+01 -1.100250000000000172e+00 -3.921875000000000000e+01 -1.100254999999999983e+00 -3.928125000000000000e+01 -1.100260000000000016e+00 -3.921875000000000000e+01 -1.100265000000000049e+00 -3.921875000000000000e+01 -1.100270000000000081e+00 -3.925000000000000000e+01 -1.100275000000000114e+00 -3.921875000000000000e+01 -1.100280000000000147e+00 -3.928125000000000000e+01 -1.100285000000000180e+00 -3.918750381469726562e+01 -1.100289999999999990e+00 -3.928125000000000000e+01 -1.100295000000000023e+00 -3.928125000000000000e+01 -1.100300000000000056e+00 -3.928125000000000000e+01 -1.100305000000000089e+00 -3.921875000000000000e+01 -1.100310000000000121e+00 -3.915625000000000000e+01 -1.100315000000000154e+00 -3.915625000000000000e+01 -1.100320000000000187e+00 -3.925000000000000000e+01 -1.100324999999999998e+00 -3.925000000000000000e+01 -1.100330000000000030e+00 -3.921875000000000000e+01 -1.100335000000000063e+00 -3.921875000000000000e+01 -1.100340000000000096e+00 -3.925000000000000000e+01 -1.100345000000000129e+00 -3.925000000000000000e+01 -1.100350000000000161e+00 -3.928125000000000000e+01 -1.100355000000000194e+00 -3.925000000000000000e+01 -1.100360000000000005e+00 -3.925000000000000000e+01 -1.100365000000000038e+00 -3.925000000000000000e+01 -1.100370000000000070e+00 -3.934375381469726562e+01 -1.100375000000000103e+00 -3.925000000000000000e+01 -1.100380000000000136e+00 -3.925000000000000000e+01 -1.100385000000000169e+00 -3.931250000000000000e+01 -1.100389999999999979e+00 -3.928125000000000000e+01 -1.100395000000000012e+00 -3.928125000000000000e+01 -1.100400000000000045e+00 -3.921875000000000000e+01 -1.100405000000000078e+00 -3.928125000000000000e+01 -1.100410000000000110e+00 -3.921875000000000000e+01 -1.100415000000000143e+00 -3.918750381469726562e+01 -1.100420000000000176e+00 -3.921875000000000000e+01 -1.100424999999999986e+00 -3.928125000000000000e+01 -1.100430000000000019e+00 -3.925000000000000000e+01 -1.100435000000000052e+00 -3.928125000000000000e+01 -1.100440000000000085e+00 -3.921875000000000000e+01 -1.100445000000000118e+00 -3.928125000000000000e+01 -1.100450000000000150e+00 -3.928125000000000000e+01 -1.100455000000000183e+00 -3.921875000000000000e+01 -1.100459999999999994e+00 -3.918750381469726562e+01 -1.100465000000000027e+00 -3.921875000000000000e+01 -1.100470000000000059e+00 -3.921875000000000000e+01 -1.100475000000000092e+00 -3.918750381469726562e+01 -1.100480000000000125e+00 -3.918750381469726562e+01 -1.100485000000000158e+00 -3.925000000000000000e+01 -1.100490000000000190e+00 -3.925000000000000000e+01 -1.100495000000000001e+00 -3.921875000000000000e+01 -1.100500000000000034e+00 -3.925000000000000000e+01 -1.100505000000000067e+00 -3.928125000000000000e+01 -1.100510000000000099e+00 -3.921875000000000000e+01 -1.100515000000000132e+00 -3.928125000000000000e+01 -1.100520000000000165e+00 -3.928125000000000000e+01 -1.100525000000000198e+00 -3.918750381469726562e+01 -1.100530000000000008e+00 -3.918750381469726562e+01 -1.100535000000000041e+00 -3.918750381469726562e+01 -1.100540000000000074e+00 -3.925000000000000000e+01 -1.100545000000000107e+00 -3.918750381469726562e+01 -1.100550000000000139e+00 -3.921875000000000000e+01 -1.100555000000000172e+00 -3.921875000000000000e+01 -1.100559999999999983e+00 -3.921875000000000000e+01 -1.100565000000000015e+00 -3.921875000000000000e+01 -1.100570000000000048e+00 -3.921875000000000000e+01 -1.100575000000000081e+00 -3.925000000000000000e+01 -1.100580000000000114e+00 -3.918750381469726562e+01 -1.100585000000000147e+00 -3.921875000000000000e+01 -1.100590000000000179e+00 -3.921875000000000000e+01 -1.100594999999999990e+00 -3.921875000000000000e+01 -1.100600000000000023e+00 -3.918750381469726562e+01 -1.100605000000000055e+00 -3.915625000000000000e+01 -1.100610000000000088e+00 -3.921875000000000000e+01 -1.100615000000000121e+00 -3.918750381469726562e+01 -1.100620000000000154e+00 -3.915625000000000000e+01 -1.100625000000000187e+00 -3.915625000000000000e+01 -1.100629999999999997e+00 -3.918750381469726562e+01 -1.100635000000000030e+00 -3.915625000000000000e+01 -1.100640000000000063e+00 -3.921875000000000000e+01 -1.100645000000000095e+00 -3.912500000000000000e+01 -1.100650000000000128e+00 -3.921875000000000000e+01 -1.100655000000000161e+00 -3.921875000000000000e+01 -1.100660000000000194e+00 -3.921875000000000000e+01 -1.100665000000000004e+00 -3.925000000000000000e+01 -1.100670000000000037e+00 -3.915625000000000000e+01 -1.100675000000000070e+00 -3.918750381469726562e+01 -1.100680000000000103e+00 -3.915625000000000000e+01 -1.100685000000000136e+00 -3.918750381469726562e+01 -1.100690000000000168e+00 -3.915625000000000000e+01 -1.100695000000000201e+00 -3.915625000000000000e+01 -1.100700000000000012e+00 -3.918750381469726562e+01 -1.100705000000000044e+00 -3.918750381469726562e+01 -1.100710000000000077e+00 -3.918750381469726562e+01 -1.100715000000000110e+00 -3.918750381469726562e+01 -1.100720000000000143e+00 -3.915625000000000000e+01 -1.100725000000000176e+00 -3.918750381469726562e+01 -1.100729999999999986e+00 -3.918750381469726562e+01 -1.100735000000000019e+00 -3.912500000000000000e+01 -1.100740000000000052e+00 -3.918750381469726562e+01 -1.100745000000000084e+00 -3.918750381469726562e+01 -1.100750000000000117e+00 -3.921875000000000000e+01 -1.100755000000000150e+00 -3.921875000000000000e+01 -1.100760000000000183e+00 -3.918750381469726562e+01 -1.100764999999999993e+00 -3.918750381469726562e+01 -1.100770000000000026e+00 -3.918750381469726562e+01 -1.100775000000000059e+00 -3.918750381469726562e+01 -1.100780000000000092e+00 -3.915625000000000000e+01 -1.100785000000000124e+00 -3.921875000000000000e+01 -1.100790000000000157e+00 -3.918750381469726562e+01 -1.100795000000000190e+00 -3.915625000000000000e+01 -1.100800000000000001e+00 -3.918750381469726562e+01 -1.100805000000000033e+00 -3.928125000000000000e+01 -1.100810000000000066e+00 -3.918750381469726562e+01 -1.100815000000000099e+00 -3.915625000000000000e+01 -1.100820000000000132e+00 -3.912500000000000000e+01 -1.100825000000000164e+00 -3.915625000000000000e+01 -1.100830000000000197e+00 -3.915625000000000000e+01 -1.100835000000000008e+00 -3.915625000000000000e+01 -1.100840000000000041e+00 -3.915625000000000000e+01 -1.100845000000000073e+00 -3.918750381469726562e+01 -1.100850000000000106e+00 -3.915625000000000000e+01 -1.100855000000000139e+00 -3.915625000000000000e+01 -1.100860000000000172e+00 -3.921875000000000000e+01 -1.100864999999999982e+00 -3.921875000000000000e+01 -1.100870000000000015e+00 -3.918750381469726562e+01 -1.100875000000000048e+00 -3.915625000000000000e+01 -1.100880000000000081e+00 -3.918750381469726562e+01 -1.100885000000000113e+00 -3.909375000000000000e+01 -1.100890000000000146e+00 -3.915625000000000000e+01 -1.100895000000000179e+00 -3.915625000000000000e+01 -1.100899999999999990e+00 -3.915625000000000000e+01 -1.100905000000000022e+00 -3.909375000000000000e+01 -1.100910000000000055e+00 -3.915625000000000000e+01 -1.100915000000000088e+00 -3.912500000000000000e+01 -1.100920000000000121e+00 -3.912500000000000000e+01 -1.100925000000000153e+00 -3.915625000000000000e+01 -1.100930000000000186e+00 -3.906250000000000000e+01 -1.100934999999999997e+00 -3.918750381469726562e+01 -1.100940000000000030e+00 -3.915625000000000000e+01 -1.100945000000000062e+00 -3.912500000000000000e+01 -1.100950000000000095e+00 -3.915625000000000000e+01 -1.100955000000000128e+00 -3.906250000000000000e+01 -1.100960000000000161e+00 -3.912500000000000000e+01 -1.100965000000000193e+00 -3.909375000000000000e+01 -1.100970000000000004e+00 -3.915625000000000000e+01 -1.100975000000000037e+00 -3.915625000000000000e+01 -1.100980000000000070e+00 -3.918750381469726562e+01 -1.100985000000000102e+00 -3.912500000000000000e+01 -1.100990000000000135e+00 -3.915625000000000000e+01 -1.100995000000000168e+00 -3.915625000000000000e+01 -1.101000000000000201e+00 -3.912500000000000000e+01 -1.101005000000000011e+00 -3.918750381469726562e+01 -1.101010000000000044e+00 -3.912500000000000000e+01 -1.101015000000000077e+00 -3.912500000000000000e+01 -1.101020000000000110e+00 -3.909375000000000000e+01 -1.101025000000000142e+00 -3.915625000000000000e+01 -1.101030000000000175e+00 -3.909375000000000000e+01 -1.101034999999999986e+00 -3.915625000000000000e+01 -1.101040000000000019e+00 -3.915625000000000000e+01 -1.101045000000000051e+00 -3.906250000000000000e+01 -1.101050000000000084e+00 -3.909375000000000000e+01 -1.101055000000000117e+00 -3.912500000000000000e+01 -1.101060000000000150e+00 -3.912500000000000000e+01 -1.101065000000000182e+00 -3.912500000000000000e+01 -1.101069999999999993e+00 -3.912500000000000000e+01 -1.101075000000000026e+00 -3.909375000000000000e+01 -1.101080000000000059e+00 -3.906250000000000000e+01 -1.101085000000000091e+00 -3.909375000000000000e+01 -1.101090000000000124e+00 -3.915625000000000000e+01 -1.101095000000000157e+00 -3.903125381469726562e+01 -1.101100000000000190e+00 -3.909375000000000000e+01 -1.101105000000000000e+00 -3.909375000000000000e+01 -1.101110000000000033e+00 -3.906250000000000000e+01 -1.101115000000000066e+00 -3.906250000000000000e+01 -1.101120000000000099e+00 -3.906250000000000000e+01 -1.101125000000000131e+00 -3.903125381469726562e+01 -1.101130000000000164e+00 -3.903125381469726562e+01 -1.101135000000000197e+00 -3.909375000000000000e+01 -1.101140000000000008e+00 -3.906250000000000000e+01 -1.101145000000000040e+00 -3.903125381469726562e+01 -1.101150000000000073e+00 -3.906250000000000000e+01 -1.101155000000000106e+00 -3.909375000000000000e+01 -1.101160000000000139e+00 -3.903125381469726562e+01 -1.101165000000000171e+00 -3.909375000000000000e+01 -1.101169999999999982e+00 -3.906250000000000000e+01 -1.101175000000000015e+00 -3.909375000000000000e+01 -1.101180000000000048e+00 -3.909375000000000000e+01 -1.101185000000000080e+00 -3.912500000000000000e+01 -1.101190000000000113e+00 -3.912500000000000000e+01 -1.101195000000000146e+00 -3.906250000000000000e+01 -1.101200000000000179e+00 -3.906250000000000000e+01 -1.101204999999999989e+00 -3.906250000000000000e+01 -1.101210000000000022e+00 -3.906250000000000000e+01 -1.101215000000000055e+00 -3.909375000000000000e+01 -1.101220000000000088e+00 -3.909375000000000000e+01 -1.101225000000000120e+00 -3.906250000000000000e+01 -1.101230000000000153e+00 -3.909375000000000000e+01 -1.101235000000000186e+00 -3.909375000000000000e+01 -1.101239999999999997e+00 -3.909375000000000000e+01 -1.101245000000000029e+00 -3.915625000000000000e+01 -1.101250000000000062e+00 -3.906250000000000000e+01 -1.101255000000000095e+00 -3.912500000000000000e+01 -1.101260000000000128e+00 -3.909375000000000000e+01 -1.101265000000000160e+00 -3.909375000000000000e+01 -1.101270000000000193e+00 -3.915625000000000000e+01 -1.101275000000000004e+00 -3.903125381469726562e+01 -1.101280000000000037e+00 -3.909375000000000000e+01 -1.101285000000000069e+00 -3.909375000000000000e+01 -1.101290000000000102e+00 -3.903125381469726562e+01 -1.101295000000000135e+00 -3.900000000000000000e+01 -1.101300000000000168e+00 -3.912500000000000000e+01 -1.101305000000000200e+00 -3.909375000000000000e+01 -1.101310000000000011e+00 -3.909375000000000000e+01 -1.101315000000000044e+00 -3.909375000000000000e+01 -1.101320000000000077e+00 -3.909375000000000000e+01 -1.101325000000000109e+00 -3.906250000000000000e+01 -1.101330000000000142e+00 -3.903125381469726562e+01 -1.101335000000000175e+00 -3.906250000000000000e+01 -1.101339999999999986e+00 -3.906250000000000000e+01 -1.101345000000000018e+00 -3.903125381469726562e+01 -1.101350000000000051e+00 -3.906250000000000000e+01 -1.101355000000000084e+00 -3.909375000000000000e+01 -1.101360000000000117e+00 -3.903125381469726562e+01 -1.101365000000000149e+00 -3.909375000000000000e+01 -1.101370000000000182e+00 -3.903125381469726562e+01 -1.101374999999999993e+00 -3.903125381469726562e+01 -1.101380000000000026e+00 -3.906250000000000000e+01 -1.101385000000000058e+00 -3.906250000000000000e+01 -1.101390000000000091e+00 -3.903125381469726562e+01 -1.101395000000000124e+00 -3.906250000000000000e+01 -1.101400000000000157e+00 -3.903125381469726562e+01 -1.101405000000000189e+00 -3.906250000000000000e+01 -1.101410000000000000e+00 -3.906250000000000000e+01 -1.101415000000000033e+00 -3.903125381469726562e+01 -1.101420000000000066e+00 -3.906250000000000000e+01 -1.101425000000000098e+00 -3.903125381469726562e+01 -1.101430000000000131e+00 -3.903125381469726562e+01 -1.101435000000000164e+00 -3.903125381469726562e+01 -1.101440000000000197e+00 -3.903125381469726562e+01 -1.101445000000000007e+00 -3.900000000000000000e+01 -1.101450000000000040e+00 -3.906250000000000000e+01 -1.101455000000000073e+00 -3.906250000000000000e+01 -1.101460000000000106e+00 -3.900000000000000000e+01 -1.101465000000000138e+00 -3.906250000000000000e+01 -1.101470000000000171e+00 -3.906250000000000000e+01 -1.101474999999999982e+00 -3.909375000000000000e+01 -1.101480000000000015e+00 -3.903125381469726562e+01 -1.101485000000000047e+00 -3.909375000000000000e+01 -1.101490000000000080e+00 -3.903125381469726562e+01 -1.101495000000000113e+00 -3.906250000000000000e+01 -1.101500000000000146e+00 -3.900000000000000000e+01 -1.101505000000000178e+00 -3.906250000000000000e+01 -1.101509999999999989e+00 -3.903125381469726562e+01 -1.101515000000000022e+00 -3.906250000000000000e+01 -1.101520000000000055e+00 -3.900000000000000000e+01 -1.101525000000000087e+00 -3.903125381469726562e+01 -1.101530000000000120e+00 -3.903125381469726562e+01 -1.101535000000000153e+00 -3.903125381469726562e+01 -1.101540000000000186e+00 -3.903125381469726562e+01 -1.101544999999999996e+00 -3.903125381469726562e+01 -1.101550000000000029e+00 -3.903125381469726562e+01 -1.101555000000000062e+00 -3.903125381469726562e+01 -1.101560000000000095e+00 -3.903125381469726562e+01 -1.101565000000000127e+00 -3.900000000000000000e+01 -1.101570000000000160e+00 -3.906250000000000000e+01 -1.101575000000000193e+00 -3.906250000000000000e+01 -1.101580000000000004e+00 -3.903125381469726562e+01 -1.101585000000000036e+00 -3.896875000000000000e+01 -1.101590000000000069e+00 -3.900000000000000000e+01 -1.101595000000000102e+00 -3.900000000000000000e+01 -1.101600000000000135e+00 -3.896875000000000000e+01 -1.101605000000000167e+00 -3.900000000000000000e+01 -1.101610000000000200e+00 -3.903125381469726562e+01 -1.101615000000000011e+00 -3.903125381469726562e+01 -1.101620000000000044e+00 -3.903125381469726562e+01 -1.101625000000000076e+00 -3.900000000000000000e+01 -1.101630000000000109e+00 -3.900000000000000000e+01 -1.101635000000000142e+00 -3.896875000000000000e+01 -1.101640000000000175e+00 -3.896875000000000000e+01 -1.101644999999999985e+00 -3.900000000000000000e+01 -1.101650000000000018e+00 -3.900000000000000000e+01 -1.101655000000000051e+00 -3.903125381469726562e+01 -1.101660000000000084e+00 -3.903125381469726562e+01 -1.101665000000000116e+00 -3.896875000000000000e+01 -1.101670000000000149e+00 -3.903125381469726562e+01 -1.101675000000000182e+00 -3.896875000000000000e+01 -1.101679999999999993e+00 -3.896875000000000000e+01 -1.101685000000000025e+00 -3.896875000000000000e+01 -1.101690000000000058e+00 -3.900000000000000000e+01 -1.101695000000000091e+00 -3.900000000000000000e+01 -1.101700000000000124e+00 -3.900000000000000000e+01 -1.101705000000000156e+00 -3.900000000000000000e+01 -1.101710000000000189e+00 -3.900000000000000000e+01 -1.101715000000000000e+00 -3.900000000000000000e+01 -1.101720000000000033e+00 -3.900000000000000000e+01 -1.101725000000000065e+00 -3.903125381469726562e+01 -1.101730000000000098e+00 -3.900000000000000000e+01 -1.101735000000000131e+00 -3.900000000000000000e+01 -1.101740000000000164e+00 -3.900000000000000000e+01 -1.101745000000000196e+00 -3.903125381469726562e+01 -1.101750000000000007e+00 -3.900000000000000000e+01 -1.101755000000000040e+00 -3.896875000000000000e+01 -1.101760000000000073e+00 -3.903125381469726562e+01 -1.101765000000000105e+00 -3.896875000000000000e+01 -1.101770000000000138e+00 -3.896875000000000000e+01 -1.101775000000000171e+00 -3.900000000000000000e+01 -1.101779999999999982e+00 -3.896875000000000000e+01 -1.101785000000000014e+00 -3.900000000000000000e+01 -1.101790000000000047e+00 -3.903125381469726562e+01 -1.101795000000000080e+00 -3.896875000000000000e+01 -1.101800000000000113e+00 -3.896875000000000000e+01 -1.101805000000000145e+00 -3.903125381469726562e+01 -1.101810000000000178e+00 -3.900000000000000000e+01 -1.101814999999999989e+00 -3.900000000000000000e+01 -1.101820000000000022e+00 -3.900000000000000000e+01 -1.101825000000000054e+00 -3.900000000000000000e+01 -1.101830000000000087e+00 -3.900000000000000000e+01 -1.101835000000000120e+00 -3.900000000000000000e+01 -1.101840000000000153e+00 -3.893750000000000000e+01 -1.101845000000000185e+00 -3.900000000000000000e+01 -1.101849999999999996e+00 -3.900000000000000000e+01 -1.101855000000000029e+00 -3.893750000000000000e+01 -1.101860000000000062e+00 -3.896875000000000000e+01 -1.101865000000000094e+00 -3.900000000000000000e+01 -1.101870000000000127e+00 -3.900000000000000000e+01 -1.101875000000000160e+00 -3.900000000000000000e+01 -1.101880000000000193e+00 -3.893750000000000000e+01 -1.101885000000000003e+00 -3.896875000000000000e+01 -1.101890000000000036e+00 -3.900000000000000000e+01 -1.101895000000000069e+00 -3.896875000000000000e+01 -1.101900000000000102e+00 -3.896875000000000000e+01 -1.101905000000000134e+00 -3.896875000000000000e+01 -1.101910000000000167e+00 -3.896875000000000000e+01 -1.101915000000000200e+00 -3.887500381469726562e+01 -1.101920000000000011e+00 -3.896875000000000000e+01 -1.101925000000000043e+00 -3.893750000000000000e+01 -1.101930000000000076e+00 -3.896875000000000000e+01 -1.101935000000000109e+00 -3.900000000000000000e+01 -1.101940000000000142e+00 -3.900000000000000000e+01 -1.101945000000000174e+00 -3.890625000000000000e+01 -1.101949999999999985e+00 -3.893750000000000000e+01 -1.101955000000000018e+00 -3.896875000000000000e+01 -1.101960000000000051e+00 -3.893750000000000000e+01 -1.101965000000000083e+00 -3.893750000000000000e+01 -1.101970000000000116e+00 -3.900000000000000000e+01 -1.101975000000000149e+00 -3.896875000000000000e+01 -1.101980000000000182e+00 -3.900000000000000000e+01 -1.101984999999999992e+00 -3.890625000000000000e+01 -1.101990000000000025e+00 -3.896875000000000000e+01 -1.101995000000000058e+00 -3.896875000000000000e+01 -1.102000000000000091e+00 -3.893750000000000000e+01 -1.102005000000000123e+00 -3.893750000000000000e+01 -1.102010000000000156e+00 -3.893750000000000000e+01 -1.102015000000000189e+00 -3.893750000000000000e+01 -1.102020000000000000e+00 -3.893750000000000000e+01 -1.102025000000000032e+00 -3.893750000000000000e+01 -1.102030000000000065e+00 -3.896875000000000000e+01 -1.102035000000000098e+00 -3.893750000000000000e+01 -1.102040000000000131e+00 -3.893750000000000000e+01 -1.102045000000000163e+00 -3.896875000000000000e+01 -1.102050000000000196e+00 -3.896875000000000000e+01 -1.102055000000000007e+00 -3.896875000000000000e+01 -1.102060000000000040e+00 -3.893750000000000000e+01 -1.102065000000000072e+00 -3.890625000000000000e+01 -1.102070000000000105e+00 -3.890625000000000000e+01 -1.102075000000000138e+00 -3.896875000000000000e+01 -1.102080000000000171e+00 -3.896875000000000000e+01 -1.102084999999999981e+00 -3.896875000000000000e+01 -1.102090000000000014e+00 -3.893750000000000000e+01 -1.102095000000000047e+00 -3.900000000000000000e+01 -1.102100000000000080e+00 -3.896875000000000000e+01 -1.102105000000000112e+00 -3.896875000000000000e+01 -1.102110000000000145e+00 -3.900000000000000000e+01 -1.102115000000000178e+00 -3.890625000000000000e+01 -1.102119999999999989e+00 -3.896875000000000000e+01 -1.102125000000000021e+00 -3.887500381469726562e+01 -1.102130000000000054e+00 -3.890625000000000000e+01 -1.102135000000000087e+00 -3.896875000000000000e+01 -1.102140000000000120e+00 -3.893750000000000000e+01 -1.102145000000000152e+00 -3.900000000000000000e+01 -1.102150000000000185e+00 -3.900000000000000000e+01 -1.102154999999999996e+00 -3.896875000000000000e+01 -1.102160000000000029e+00 -3.900000000000000000e+01 -1.102165000000000061e+00 -3.893750000000000000e+01 -1.102170000000000094e+00 -3.896875000000000000e+01 -1.102175000000000127e+00 -3.893750000000000000e+01 -1.102180000000000160e+00 -3.893750000000000000e+01 -1.102185000000000192e+00 -3.896875000000000000e+01 -1.102190000000000003e+00 -3.887500381469726562e+01 -1.102195000000000036e+00 -3.890625000000000000e+01 -1.102200000000000069e+00 -3.900000000000000000e+01 -1.102205000000000101e+00 -3.893750000000000000e+01 -1.102210000000000134e+00 -3.893750000000000000e+01 -1.102215000000000167e+00 -3.893750000000000000e+01 -1.102220000000000200e+00 -3.893750000000000000e+01 -1.102225000000000010e+00 -3.896875000000000000e+01 -1.102230000000000043e+00 -3.893750000000000000e+01 -1.102235000000000076e+00 -3.890625000000000000e+01 -1.102240000000000109e+00 -3.890625000000000000e+01 -1.102245000000000141e+00 -3.890625000000000000e+01 -1.102250000000000174e+00 -3.890625000000000000e+01 -1.102254999999999985e+00 -3.893750000000000000e+01 -1.102260000000000018e+00 -3.896875000000000000e+01 -1.102265000000000050e+00 -3.890625000000000000e+01 -1.102270000000000083e+00 -3.893750000000000000e+01 -1.102275000000000116e+00 -3.890625000000000000e+01 -1.102280000000000149e+00 -3.893750000000000000e+01 -1.102285000000000181e+00 -3.890625000000000000e+01 -1.102289999999999992e+00 -3.890625000000000000e+01 -1.102295000000000025e+00 -3.890625000000000000e+01 -1.102300000000000058e+00 -3.893750000000000000e+01 -1.102305000000000090e+00 -3.890625000000000000e+01 -1.102310000000000123e+00 -3.887500381469726562e+01 -1.102315000000000156e+00 -3.890625000000000000e+01 -1.102320000000000189e+00 -3.884375000000000000e+01 -1.102324999999999999e+00 -3.890625000000000000e+01 -1.102330000000000032e+00 -3.887500381469726562e+01 -1.102335000000000065e+00 -3.890625000000000000e+01 -1.102340000000000098e+00 -3.884375000000000000e+01 -1.102345000000000130e+00 -3.881250000000000000e+01 -1.102350000000000163e+00 -3.887500381469726562e+01 -1.102355000000000196e+00 -3.884375000000000000e+01 -1.102360000000000007e+00 -3.887500381469726562e+01 -1.102365000000000039e+00 -3.890625000000000000e+01 -1.102370000000000072e+00 -3.890625000000000000e+01 -1.102375000000000105e+00 -3.890625000000000000e+01 -1.102380000000000138e+00 -3.884375000000000000e+01 -1.102385000000000170e+00 -3.890625000000000000e+01 -1.102389999999999981e+00 -3.890625000000000000e+01 -1.102395000000000014e+00 -3.893750000000000000e+01 -1.102400000000000047e+00 -3.884375000000000000e+01 -1.102405000000000079e+00 -3.890625000000000000e+01 -1.102410000000000112e+00 -3.890625000000000000e+01 -1.102415000000000145e+00 -3.887500381469726562e+01 -1.102420000000000178e+00 -3.884375000000000000e+01 -1.102424999999999988e+00 -3.890625000000000000e+01 -1.102430000000000021e+00 -3.884375000000000000e+01 -1.102435000000000054e+00 -3.887500381469726562e+01 -1.102440000000000087e+00 -3.884375000000000000e+01 -1.102445000000000119e+00 -3.890625000000000000e+01 -1.102450000000000152e+00 -3.890625000000000000e+01 -1.102455000000000185e+00 -3.890625000000000000e+01 -1.102459999999999996e+00 -3.887500381469726562e+01 -1.102465000000000028e+00 -3.890625000000000000e+01 -1.102470000000000061e+00 -3.887500381469726562e+01 -1.102475000000000094e+00 -3.887500381469726562e+01 -1.102480000000000127e+00 -3.890625000000000000e+01 -1.102485000000000159e+00 -3.887500381469726562e+01 -1.102490000000000192e+00 -3.887500381469726562e+01 -1.102495000000000003e+00 -3.893750000000000000e+01 -1.102500000000000036e+00 -3.887500381469726562e+01 -1.102505000000000068e+00 -3.884375000000000000e+01 -1.102510000000000101e+00 -3.887500381469726562e+01 -1.102515000000000134e+00 -3.884375000000000000e+01 -1.102520000000000167e+00 -3.884375000000000000e+01 -1.102525000000000199e+00 -3.881250000000000000e+01 -1.102530000000000010e+00 -3.884375000000000000e+01 -1.102535000000000043e+00 -3.881250000000000000e+01 -1.102540000000000076e+00 -3.887500381469726562e+01 -1.102545000000000108e+00 -3.884375000000000000e+01 -1.102550000000000141e+00 -3.878125000000000000e+01 -1.102555000000000174e+00 -3.881250000000000000e+01 -1.102559999999999985e+00 -3.887500381469726562e+01 -1.102565000000000017e+00 -3.887500381469726562e+01 -1.102570000000000050e+00 -3.890625000000000000e+01 -1.102575000000000083e+00 -3.884375000000000000e+01 -1.102580000000000116e+00 -3.881250000000000000e+01 -1.102585000000000148e+00 -3.887500381469726562e+01 -1.102590000000000181e+00 -3.887500381469726562e+01 -1.102594999999999992e+00 -3.893750000000000000e+01 -1.102600000000000025e+00 -3.884375000000000000e+01 -1.102605000000000057e+00 -3.887500381469726562e+01 -1.102610000000000090e+00 -3.881250000000000000e+01 -1.102615000000000123e+00 -3.887500381469726562e+01 -1.102620000000000156e+00 -3.884375000000000000e+01 -1.102625000000000188e+00 -3.887500381469726562e+01 -1.102629999999999999e+00 -3.887500381469726562e+01 -1.102635000000000032e+00 -3.884375000000000000e+01 -1.102640000000000065e+00 -3.881250000000000000e+01 -1.102645000000000097e+00 -3.878125000000000000e+01 -1.102650000000000130e+00 -3.881250000000000000e+01 -1.102655000000000163e+00 -3.887500381469726562e+01 -1.102660000000000196e+00 -3.878125000000000000e+01 -1.102665000000000006e+00 -3.881250000000000000e+01 -1.102670000000000039e+00 -3.884375000000000000e+01 -1.102675000000000072e+00 -3.884375000000000000e+01 -1.102680000000000105e+00 -3.884375000000000000e+01 -1.102685000000000137e+00 -3.878125000000000000e+01 -1.102690000000000170e+00 -3.881250000000000000e+01 -1.102694999999999981e+00 -3.881250000000000000e+01 -1.102700000000000014e+00 -3.878125000000000000e+01 -1.102705000000000046e+00 -3.881250000000000000e+01 -1.102710000000000079e+00 -3.890625000000000000e+01 -1.102715000000000112e+00 -3.878125000000000000e+01 -1.102720000000000145e+00 -3.881250000000000000e+01 -1.102725000000000177e+00 -3.881250000000000000e+01 -1.102729999999999988e+00 -3.878125000000000000e+01 -1.102735000000000021e+00 -3.875000000000000000e+01 -1.102740000000000054e+00 -3.881250000000000000e+01 -1.102745000000000086e+00 -3.884375000000000000e+01 -1.102750000000000119e+00 -3.881250000000000000e+01 -1.102755000000000152e+00 -3.884375000000000000e+01 -1.102760000000000185e+00 -3.884375000000000000e+01 -1.102764999999999995e+00 -3.878125000000000000e+01 -1.102770000000000028e+00 -3.884375000000000000e+01 -1.102775000000000061e+00 -3.884375000000000000e+01 -1.102780000000000094e+00 -3.884375000000000000e+01 -1.102785000000000126e+00 -3.887500381469726562e+01 -1.102790000000000159e+00 -3.887500381469726562e+01 -1.102795000000000192e+00 -3.878125000000000000e+01 -1.102800000000000002e+00 -3.887500381469726562e+01 -1.102805000000000035e+00 -3.881250000000000000e+01 -1.102810000000000068e+00 -3.887500381469726562e+01 -1.102815000000000101e+00 -3.881250000000000000e+01 -1.102820000000000134e+00 -3.887500381469726562e+01 -1.102825000000000166e+00 -3.881250000000000000e+01 -1.102830000000000199e+00 -3.884375000000000000e+01 -1.102835000000000010e+00 -3.890625000000000000e+01 -1.102840000000000042e+00 -3.887500381469726562e+01 -1.102845000000000075e+00 -3.881250000000000000e+01 -1.102850000000000108e+00 -3.884375000000000000e+01 -1.102855000000000141e+00 -3.881250000000000000e+01 -1.102860000000000174e+00 -3.884375000000000000e+01 -1.102864999999999984e+00 -3.884375000000000000e+01 -1.102870000000000017e+00 -3.881250000000000000e+01 -1.102875000000000050e+00 -3.884375000000000000e+01 -1.102880000000000082e+00 -3.884375000000000000e+01 -1.102885000000000115e+00 -3.893750000000000000e+01 -1.102890000000000148e+00 -3.881250000000000000e+01 -1.102895000000000181e+00 -3.884375000000000000e+01 -1.102899999999999991e+00 -3.884375000000000000e+01 -1.102905000000000024e+00 -3.887500381469726562e+01 -1.102910000000000057e+00 -3.890625000000000000e+01 -1.102915000000000090e+00 -3.881250000000000000e+01 -1.102920000000000122e+00 -3.881250000000000000e+01 -1.102925000000000155e+00 -3.881250000000000000e+01 -1.102930000000000188e+00 -3.884375000000000000e+01 -1.102934999999999999e+00 -3.881250000000000000e+01 -1.102940000000000031e+00 -3.881250000000000000e+01 -1.102945000000000064e+00 -3.881250000000000000e+01 -1.102950000000000097e+00 -3.881250000000000000e+01 -1.102955000000000130e+00 -3.878125000000000000e+01 -1.102960000000000163e+00 -3.881250000000000000e+01 -1.102965000000000195e+00 -3.878125000000000000e+01 -1.102970000000000006e+00 -3.875000000000000000e+01 -1.102975000000000039e+00 -3.878125000000000000e+01 -1.102980000000000071e+00 -3.875000000000000000e+01 -1.102985000000000104e+00 -3.875000000000000000e+01 -1.102990000000000137e+00 -3.881250000000000000e+01 -1.102995000000000170e+00 -3.878125000000000000e+01 -1.102999999999999980e+00 -3.878125000000000000e+01 -1.103005000000000013e+00 -3.881250000000000000e+01 -1.103010000000000046e+00 -3.871875381469726562e+01 -1.103015000000000079e+00 -3.881250000000000000e+01 -1.103020000000000111e+00 -3.875000000000000000e+01 -1.103025000000000144e+00 -3.884375000000000000e+01 -1.103030000000000177e+00 -3.875000000000000000e+01 -1.103034999999999988e+00 -3.875000000000000000e+01 -1.103040000000000020e+00 -3.871875381469726562e+01 -1.103045000000000053e+00 -3.875000000000000000e+01 -1.103050000000000086e+00 -3.881250000000000000e+01 -1.103055000000000119e+00 -3.871875381469726562e+01 -1.103060000000000151e+00 -3.875000000000000000e+01 -1.103065000000000184e+00 -3.881250000000000000e+01 -1.103069999999999995e+00 -3.871875381469726562e+01 -1.103075000000000028e+00 -3.881250000000000000e+01 -1.103080000000000060e+00 -3.871875381469726562e+01 -1.103085000000000093e+00 -3.881250000000000000e+01 -1.103090000000000126e+00 -3.884375000000000000e+01 -1.103095000000000159e+00 -3.878125000000000000e+01 -1.103100000000000191e+00 -3.878125000000000000e+01 -1.103105000000000002e+00 -3.878125000000000000e+01 -1.103110000000000035e+00 -3.875000000000000000e+01 -1.103115000000000068e+00 -3.865625000000000000e+01 -1.103120000000000100e+00 -3.875000000000000000e+01 -1.103125000000000133e+00 -3.875000000000000000e+01 -1.103130000000000166e+00 -3.875000000000000000e+01 -1.103135000000000199e+00 -3.868750000000000000e+01 -1.103140000000000009e+00 -3.875000000000000000e+01 -1.103145000000000042e+00 -3.871875381469726562e+01 -1.103150000000000075e+00 -3.875000000000000000e+01 -1.103155000000000108e+00 -3.868750000000000000e+01 -1.103160000000000140e+00 -3.878125000000000000e+01 -1.103165000000000173e+00 -3.878125000000000000e+01 -1.103169999999999984e+00 -3.878125000000000000e+01 -1.103175000000000017e+00 -3.878125000000000000e+01 -1.103180000000000049e+00 -3.875000000000000000e+01 -1.103185000000000082e+00 -3.878125000000000000e+01 -1.103190000000000115e+00 -3.875000000000000000e+01 -1.103195000000000148e+00 -3.871875381469726562e+01 -1.103200000000000180e+00 -3.878125000000000000e+01 -1.103204999999999991e+00 -3.875000000000000000e+01 -1.103210000000000024e+00 -3.871875381469726562e+01 -1.103215000000000057e+00 -3.868750000000000000e+01 -1.103220000000000089e+00 -3.868750000000000000e+01 -1.103225000000000122e+00 -3.875000000000000000e+01 -1.103230000000000155e+00 -3.875000000000000000e+01 -1.103235000000000188e+00 -3.871875381469726562e+01 -1.103239999999999998e+00 -3.871875381469726562e+01 -1.103245000000000031e+00 -3.871875381469726562e+01 -1.103250000000000064e+00 -3.868750000000000000e+01 -1.103255000000000097e+00 -3.868750000000000000e+01 -1.103260000000000129e+00 -3.875000000000000000e+01 -1.103265000000000162e+00 -3.868750000000000000e+01 -1.103270000000000195e+00 -3.868750000000000000e+01 -1.103275000000000006e+00 -3.871875381469726562e+01 -1.103280000000000038e+00 -3.868750000000000000e+01 -1.103285000000000071e+00 -3.871875381469726562e+01 -1.103290000000000104e+00 -3.878125000000000000e+01 -1.103295000000000137e+00 -3.868750000000000000e+01 -1.103300000000000169e+00 -3.865625000000000000e+01 -1.103304999999999980e+00 -3.871875381469726562e+01 -1.103310000000000013e+00 -3.868750000000000000e+01 -1.103315000000000046e+00 -3.875000000000000000e+01 -1.103320000000000078e+00 -3.865625000000000000e+01 -1.103325000000000111e+00 -3.868750000000000000e+01 -1.103330000000000144e+00 -3.865625000000000000e+01 -1.103335000000000177e+00 -3.865625000000000000e+01 -1.103339999999999987e+00 -3.868750000000000000e+01 -1.103345000000000020e+00 -3.862500000000000000e+01 -1.103350000000000053e+00 -3.868750000000000000e+01 -1.103355000000000086e+00 -3.871875381469726562e+01 -1.103360000000000118e+00 -3.865625000000000000e+01 -1.103365000000000151e+00 -3.868750000000000000e+01 -1.103370000000000184e+00 -3.875000000000000000e+01 -1.103374999999999995e+00 -3.865625000000000000e+01 -1.103380000000000027e+00 -3.865625000000000000e+01 -1.103385000000000060e+00 -3.865625000000000000e+01 -1.103390000000000093e+00 -3.868750000000000000e+01 -1.103395000000000126e+00 -3.868750000000000000e+01 -1.103400000000000158e+00 -3.868750000000000000e+01 -1.103405000000000191e+00 -3.862500000000000000e+01 -1.103410000000000002e+00 -3.868750000000000000e+01 -1.103415000000000035e+00 -3.871875381469726562e+01 -1.103420000000000067e+00 -3.862500000000000000e+01 -1.103425000000000100e+00 -3.865625000000000000e+01 -1.103430000000000133e+00 -3.865625000000000000e+01 -1.103435000000000166e+00 -3.868750000000000000e+01 -1.103440000000000198e+00 -3.862500000000000000e+01 -1.103445000000000009e+00 -3.865625000000000000e+01 -1.103450000000000042e+00 -3.865625000000000000e+01 -1.103455000000000075e+00 -3.862500000000000000e+01 -1.103460000000000107e+00 -3.862500000000000000e+01 -1.103465000000000140e+00 -3.862500000000000000e+01 -1.103470000000000173e+00 -3.862500000000000000e+01 -1.103474999999999984e+00 -3.856250381469726562e+01 -1.103480000000000016e+00 -3.853125000000000000e+01 -1.103485000000000049e+00 -3.862500000000000000e+01 -1.103490000000000082e+00 -3.859375000000000000e+01 -1.103495000000000115e+00 -3.862500000000000000e+01 -1.103500000000000147e+00 -3.862500000000000000e+01 -1.103505000000000180e+00 -3.853125000000000000e+01 -1.103509999999999991e+00 -3.862500000000000000e+01 -1.103515000000000024e+00 -3.865625000000000000e+01 -1.103520000000000056e+00 -3.850000000000000000e+01 -1.103525000000000089e+00 -3.865625000000000000e+01 -1.103530000000000122e+00 -3.859375000000000000e+01 -1.103535000000000155e+00 -3.856250381469726562e+01 -1.103540000000000187e+00 -3.856250381469726562e+01 -1.103544999999999998e+00 -3.859375000000000000e+01 -1.103550000000000031e+00 -3.853125000000000000e+01 -1.103555000000000064e+00 -3.859375000000000000e+01 -1.103560000000000096e+00 -3.859375000000000000e+01 -1.103565000000000129e+00 -3.859375000000000000e+01 -1.103570000000000162e+00 -3.856250381469726562e+01 -1.103575000000000195e+00 -3.853125000000000000e+01 -1.103580000000000005e+00 -3.856250381469726562e+01 -1.103585000000000038e+00 -3.853125000000000000e+01 -1.103590000000000071e+00 -3.859375000000000000e+01 -1.103595000000000104e+00 -3.859375000000000000e+01 -1.103600000000000136e+00 -3.856250381469726562e+01 -1.103605000000000169e+00 -3.856250381469726562e+01 -1.103609999999999980e+00 -3.853125000000000000e+01 -1.103615000000000013e+00 -3.862500000000000000e+01 -1.103620000000000045e+00 -3.859375000000000000e+01 -1.103625000000000078e+00 -3.856250381469726562e+01 -1.103630000000000111e+00 -3.853125000000000000e+01 -1.103635000000000144e+00 -3.862500000000000000e+01 -1.103640000000000176e+00 -3.865625000000000000e+01 -1.103644999999999987e+00 -3.862500000000000000e+01 -1.103650000000000020e+00 -3.856250381469726562e+01 -1.103655000000000053e+00 -3.862500000000000000e+01 -1.103660000000000085e+00 -3.859375000000000000e+01 -1.103665000000000118e+00 -3.862500000000000000e+01 -1.103670000000000151e+00 -3.859375000000000000e+01 -1.103675000000000184e+00 -3.859375000000000000e+01 -1.103679999999999994e+00 -3.853125000000000000e+01 -1.103685000000000027e+00 -3.856250381469726562e+01 -1.103690000000000060e+00 -3.859375000000000000e+01 -1.103695000000000093e+00 -3.862500000000000000e+01 -1.103700000000000125e+00 -3.859375000000000000e+01 -1.103705000000000158e+00 -3.856250381469726562e+01 -1.103710000000000191e+00 -3.862500000000000000e+01 -1.103715000000000002e+00 -3.856250381469726562e+01 -1.103720000000000034e+00 -3.853125000000000000e+01 -1.103725000000000067e+00 -3.856250381469726562e+01 -1.103730000000000100e+00 -3.853125000000000000e+01 -1.103735000000000133e+00 -3.856250381469726562e+01 -1.103740000000000165e+00 -3.853125000000000000e+01 -1.103745000000000198e+00 -3.859375000000000000e+01 -1.103750000000000009e+00 -3.865625000000000000e+01 -1.103755000000000042e+00 -3.859375000000000000e+01 -1.103760000000000074e+00 -3.859375000000000000e+01 -1.103765000000000107e+00 -3.856250381469726562e+01 -1.103770000000000140e+00 -3.856250381469726562e+01 -1.103775000000000173e+00 -3.856250381469726562e+01 -1.103779999999999983e+00 -3.859375000000000000e+01 -1.103785000000000016e+00 -3.850000000000000000e+01 -1.103790000000000049e+00 -3.850000000000000000e+01 -1.103795000000000082e+00 -3.856250381469726562e+01 -1.103800000000000114e+00 -3.856250381469726562e+01 -1.103805000000000147e+00 -3.850000000000000000e+01 -1.103810000000000180e+00 -3.853125000000000000e+01 -1.103814999999999991e+00 -3.856250381469726562e+01 -1.103820000000000023e+00 -3.850000000000000000e+01 -1.103825000000000056e+00 -3.853125000000000000e+01 -1.103830000000000089e+00 -3.853125000000000000e+01 -1.103835000000000122e+00 -3.853125000000000000e+01 -1.103840000000000154e+00 -3.853125000000000000e+01 -1.103845000000000187e+00 -3.853125000000000000e+01 -1.103849999999999998e+00 -3.853125000000000000e+01 -1.103855000000000031e+00 -3.850000000000000000e+01 -1.103860000000000063e+00 -3.850000000000000000e+01 -1.103865000000000096e+00 -3.846875381469726562e+01 -1.103870000000000129e+00 -3.850000000000000000e+01 -1.103875000000000162e+00 -3.853125000000000000e+01 -1.103880000000000194e+00 -3.850000000000000000e+01 -1.103885000000000005e+00 -3.853125000000000000e+01 -1.103890000000000038e+00 -3.853125000000000000e+01 -1.103895000000000071e+00 -3.850000000000000000e+01 -1.103900000000000103e+00 -3.846875381469726562e+01 -1.103905000000000136e+00 -3.846875381469726562e+01 -1.103910000000000169e+00 -3.850000000000000000e+01 -1.103914999999999980e+00 -3.846875381469726562e+01 -1.103920000000000012e+00 -3.850000000000000000e+01 -1.103925000000000045e+00 -3.850000000000000000e+01 -1.103930000000000078e+00 -3.850000000000000000e+01 -1.103935000000000111e+00 -3.846875381469726562e+01 -1.103940000000000143e+00 -3.846875381469726562e+01 -1.103945000000000176e+00 -3.850000000000000000e+01 -1.103949999999999987e+00 -3.850000000000000000e+01 -1.103955000000000020e+00 -3.846875381469726562e+01 -1.103960000000000052e+00 -3.850000000000000000e+01 -1.103965000000000085e+00 -3.846875381469726562e+01 -1.103970000000000118e+00 -3.843750000000000000e+01 -1.103975000000000151e+00 -3.853125000000000000e+01 -1.103980000000000183e+00 -3.843750000000000000e+01 -1.103984999999999994e+00 -3.850000000000000000e+01 -1.103990000000000027e+00 -3.850000000000000000e+01 -1.103995000000000060e+00 -3.856250381469726562e+01 -1.104000000000000092e+00 -3.850000000000000000e+01 -1.104005000000000125e+00 -3.850000000000000000e+01 -1.104010000000000158e+00 -3.853125000000000000e+01 -1.104015000000000191e+00 -3.846875381469726562e+01 -1.104020000000000001e+00 -3.850000000000000000e+01 -1.104025000000000034e+00 -3.850000000000000000e+01 -1.104030000000000067e+00 -3.846875381469726562e+01 -1.104035000000000100e+00 -3.853125000000000000e+01 -1.104040000000000132e+00 -3.840625000000000000e+01 -1.104045000000000165e+00 -3.850000000000000000e+01 -1.104050000000000198e+00 -3.843750000000000000e+01 -1.104055000000000009e+00 -3.853125000000000000e+01 -1.104060000000000041e+00 -3.846875381469726562e+01 -1.104065000000000074e+00 -3.840625000000000000e+01 -1.104070000000000107e+00 -3.843750000000000000e+01 -1.104075000000000140e+00 -3.846875381469726562e+01 -1.104080000000000172e+00 -3.846875381469726562e+01 -1.104084999999999983e+00 -3.843750000000000000e+01 -1.104090000000000016e+00 -3.840625000000000000e+01 -1.104095000000000049e+00 -3.846875381469726562e+01 -1.104100000000000081e+00 -3.846875381469726562e+01 -1.104105000000000114e+00 -3.843750000000000000e+01 -1.104110000000000147e+00 -3.840625000000000000e+01 -1.104115000000000180e+00 -3.840625000000000000e+01 -1.104119999999999990e+00 -3.846875381469726562e+01 -1.104125000000000023e+00 -3.850000000000000000e+01 -1.104130000000000056e+00 -3.843750000000000000e+01 -1.104135000000000089e+00 -3.850000000000000000e+01 -1.104140000000000121e+00 -3.834375000000000000e+01 -1.104145000000000154e+00 -3.840625000000000000e+01 -1.104150000000000187e+00 -3.843750000000000000e+01 -1.104154999999999998e+00 -3.840625000000000000e+01 -1.104160000000000030e+00 -3.840625000000000000e+01 -1.104165000000000063e+00 -3.840625000000000000e+01 -1.104170000000000096e+00 -3.843750000000000000e+01 -1.104175000000000129e+00 -3.843750000000000000e+01 -1.104180000000000161e+00 -3.843750000000000000e+01 -1.104185000000000194e+00 -3.837500000000000000e+01 -1.104190000000000005e+00 -3.846875381469726562e+01 -1.104195000000000038e+00 -3.840625000000000000e+01 -1.104200000000000070e+00 -3.840625000000000000e+01 -1.104205000000000103e+00 -3.840625000000000000e+01 -1.104210000000000136e+00 -3.843750000000000000e+01 -1.104215000000000169e+00 -3.843750000000000000e+01 -1.104219999999999979e+00 -3.837500000000000000e+01 -1.104225000000000012e+00 -3.837500000000000000e+01 -1.104230000000000045e+00 -3.843750000000000000e+01 -1.104235000000000078e+00 -3.834375000000000000e+01 -1.104240000000000110e+00 -3.834375000000000000e+01 -1.104245000000000143e+00 -3.843750000000000000e+01 -1.104250000000000176e+00 -3.840625000000000000e+01 -1.104254999999999987e+00 -3.843750000000000000e+01 -1.104260000000000019e+00 -3.837500000000000000e+01 -1.104265000000000052e+00 -3.837500000000000000e+01 -1.104270000000000085e+00 -3.837500000000000000e+01 -1.104275000000000118e+00 -3.840625000000000000e+01 -1.104280000000000150e+00 -3.840625000000000000e+01 -1.104285000000000183e+00 -3.834375000000000000e+01 -1.104289999999999994e+00 -3.837500000000000000e+01 -1.104295000000000027e+00 -3.837500000000000000e+01 -1.104300000000000059e+00 -3.843750000000000000e+01 -1.104305000000000092e+00 -3.834375000000000000e+01 -1.104310000000000125e+00 -3.834375000000000000e+01 -1.104315000000000158e+00 -3.840625000000000000e+01 -1.104320000000000190e+00 -3.840625000000000000e+01 -1.104325000000000001e+00 -3.834375000000000000e+01 -1.104330000000000034e+00 -3.837500000000000000e+01 -1.104335000000000067e+00 -3.834375000000000000e+01 -1.104340000000000099e+00 -3.837500000000000000e+01 -1.104345000000000132e+00 -3.834375000000000000e+01 -1.104350000000000165e+00 -3.834375000000000000e+01 -1.104355000000000198e+00 -3.834375000000000000e+01 -1.104360000000000008e+00 -3.837500000000000000e+01 -1.104365000000000041e+00 -3.837500000000000000e+01 -1.104370000000000074e+00 -3.837500000000000000e+01 -1.104375000000000107e+00 -3.834375000000000000e+01 -1.104380000000000139e+00 -3.831250381469726562e+01 -1.104385000000000172e+00 -3.828125000000000000e+01 -1.104389999999999983e+00 -3.828125000000000000e+01 -1.104395000000000016e+00 -3.828125000000000000e+01 -1.104400000000000048e+00 -3.834375000000000000e+01 -1.104405000000000081e+00 -3.834375000000000000e+01 -1.104410000000000114e+00 -3.828125000000000000e+01 -1.104415000000000147e+00 -3.831250381469726562e+01 -1.104420000000000179e+00 -3.831250381469726562e+01 -1.104424999999999990e+00 -3.828125000000000000e+01 -1.104430000000000023e+00 -3.828125000000000000e+01 -1.104435000000000056e+00 -3.828125000000000000e+01 -1.104440000000000088e+00 -3.828125000000000000e+01 -1.104445000000000121e+00 -3.828125000000000000e+01 -1.104450000000000154e+00 -3.834375000000000000e+01 -1.104455000000000187e+00 -3.831250381469726562e+01 -1.104459999999999997e+00 -3.831250381469726562e+01 -1.104465000000000030e+00 -3.825000000000000000e+01 -1.104470000000000063e+00 -3.828125000000000000e+01 -1.104475000000000096e+00 -3.834375000000000000e+01 -1.104480000000000128e+00 -3.821875000000000000e+01 -1.104485000000000161e+00 -3.828125000000000000e+01 -1.104490000000000194e+00 -3.825000000000000000e+01 -1.104495000000000005e+00 -3.828125000000000000e+01 -1.104500000000000037e+00 -3.828125000000000000e+01 -1.104505000000000070e+00 -3.831250381469726562e+01 -1.104510000000000103e+00 -3.828125000000000000e+01 -1.104515000000000136e+00 -3.831250381469726562e+01 -1.104520000000000168e+00 -3.825000000000000000e+01 -1.104525000000000201e+00 -3.834375000000000000e+01 -1.104530000000000012e+00 -3.831250381469726562e+01 -1.104535000000000045e+00 -3.831250381469726562e+01 -1.104540000000000077e+00 -3.828125000000000000e+01 -1.104545000000000110e+00 -3.828125000000000000e+01 -1.104550000000000143e+00 -3.825000000000000000e+01 -1.104555000000000176e+00 -3.831250381469726562e+01 -1.104559999999999986e+00 -3.828125000000000000e+01 -1.104565000000000019e+00 -3.828125000000000000e+01 -1.104570000000000052e+00 -3.831250381469726562e+01 -1.104575000000000085e+00 -3.828125000000000000e+01 -1.104580000000000117e+00 -3.831250381469726562e+01 -1.104585000000000150e+00 -3.828125000000000000e+01 -1.104590000000000183e+00 -3.831250381469726562e+01 -1.104594999999999994e+00 -3.831250381469726562e+01 -1.104600000000000026e+00 -3.828125000000000000e+01 -1.104605000000000059e+00 -3.828125000000000000e+01 -1.104610000000000092e+00 -3.828125000000000000e+01 -1.104615000000000125e+00 -3.825000000000000000e+01 -1.104620000000000157e+00 -3.828125000000000000e+01 -1.104625000000000190e+00 -3.828125000000000000e+01 -1.104630000000000001e+00 -3.831250381469726562e+01 -1.104635000000000034e+00 -3.828125000000000000e+01 -1.104640000000000066e+00 -3.825000000000000000e+01 -1.104645000000000099e+00 -3.828125000000000000e+01 -1.104650000000000132e+00 -3.828125000000000000e+01 -1.104655000000000165e+00 -3.825000000000000000e+01 -1.104660000000000197e+00 -3.825000000000000000e+01 -1.104665000000000008e+00 -3.828125000000000000e+01 -1.104670000000000041e+00 -3.831250381469726562e+01 -1.104675000000000074e+00 -3.828125000000000000e+01 -1.104680000000000106e+00 -3.831250381469726562e+01 -1.104685000000000139e+00 -3.828125000000000000e+01 -1.104690000000000172e+00 -3.818750000000000000e+01 -1.104694999999999983e+00 -3.825000000000000000e+01 -1.104700000000000015e+00 -3.828125000000000000e+01 -1.104705000000000048e+00 -3.828125000000000000e+01 -1.104710000000000081e+00 -3.828125000000000000e+01 -1.104715000000000114e+00 -3.828125000000000000e+01 -1.104720000000000146e+00 -3.831250381469726562e+01 -1.104725000000000179e+00 -3.828125000000000000e+01 -1.104729999999999990e+00 -3.828125000000000000e+01 -1.104735000000000023e+00 -3.828125000000000000e+01 -1.104740000000000055e+00 -3.821875000000000000e+01 -1.104745000000000088e+00 -3.828125000000000000e+01 -1.104750000000000121e+00 -3.825000000000000000e+01 -1.104755000000000154e+00 -3.831250381469726562e+01 -1.104760000000000186e+00 -3.828125000000000000e+01 -1.104764999999999997e+00 -3.818750000000000000e+01 -1.104770000000000030e+00 -3.828125000000000000e+01 -1.104775000000000063e+00 -3.828125000000000000e+01 -1.104780000000000095e+00 -3.825000000000000000e+01 -1.104785000000000128e+00 -3.821875000000000000e+01 -1.104790000000000161e+00 -3.825000000000000000e+01 -1.104795000000000194e+00 -3.828125000000000000e+01 -1.104800000000000004e+00 -3.821875000000000000e+01 -1.104805000000000037e+00 -3.828125000000000000e+01 -1.104810000000000070e+00 -3.818750000000000000e+01 -1.104815000000000103e+00 -3.818750000000000000e+01 -1.104820000000000135e+00 -3.828125000000000000e+01 -1.104825000000000168e+00 -3.821875000000000000e+01 -1.104830000000000201e+00 -3.821875000000000000e+01 -1.104835000000000012e+00 -3.821875000000000000e+01 -1.104840000000000044e+00 -3.815625381469726562e+01 -1.104845000000000077e+00 -3.815625381469726562e+01 -1.104850000000000110e+00 -3.818750000000000000e+01 -1.104855000000000143e+00 -3.818750000000000000e+01 -1.104860000000000175e+00 -3.815625381469726562e+01 -1.104864999999999986e+00 -3.809375000000000000e+01 -1.104870000000000019e+00 -3.815625381469726562e+01 -1.104875000000000052e+00 -3.818750000000000000e+01 -1.104880000000000084e+00 -3.812500000000000000e+01 -1.104885000000000117e+00 -3.815625381469726562e+01 -1.104890000000000150e+00 -3.815625381469726562e+01 -1.104895000000000183e+00 -3.815625381469726562e+01 -1.104899999999999993e+00 -3.815625381469726562e+01 -1.104905000000000026e+00 -3.809375000000000000e+01 -1.104910000000000059e+00 -3.818750000000000000e+01 -1.104915000000000092e+00 -3.815625381469726562e+01 -1.104920000000000124e+00 -3.815625381469726562e+01 -1.104925000000000157e+00 -3.818750000000000000e+01 -1.104930000000000190e+00 -3.815625381469726562e+01 -1.104935000000000000e+00 -3.818750000000000000e+01 -1.104940000000000033e+00 -3.818750000000000000e+01 -1.104945000000000066e+00 -3.818750000000000000e+01 -1.104950000000000099e+00 -3.815625381469726562e+01 -1.104955000000000132e+00 -3.815625381469726562e+01 -1.104960000000000164e+00 -3.815625381469726562e+01 -1.104965000000000197e+00 -3.818750000000000000e+01 -1.104970000000000008e+00 -3.812500000000000000e+01 -1.104975000000000041e+00 -3.812500000000000000e+01 -1.104980000000000073e+00 -3.815625381469726562e+01 -1.104985000000000106e+00 -3.815625381469726562e+01 -1.104990000000000139e+00 -3.818750000000000000e+01 -1.104995000000000172e+00 -3.815625381469726562e+01 -1.104999999999999982e+00 -3.815625381469726562e+01 -1.105005000000000015e+00 -3.812500000000000000e+01 -1.105010000000000048e+00 -3.815625381469726562e+01 -1.105015000000000081e+00 -3.815625381469726562e+01 -1.105020000000000113e+00 -3.812500000000000000e+01 -1.105025000000000146e+00 -3.812500000000000000e+01 -1.105030000000000179e+00 -3.812500000000000000e+01 -1.105034999999999989e+00 -3.818750000000000000e+01 -1.105040000000000022e+00 -3.815625381469726562e+01 -1.105045000000000055e+00 -3.818750000000000000e+01 -1.105050000000000088e+00 -3.815625381469726562e+01 -1.105055000000000121e+00 -3.812500000000000000e+01 -1.105060000000000153e+00 -3.815625381469726562e+01 -1.105065000000000186e+00 -3.812500000000000000e+01 -1.105069999999999997e+00 -3.815625381469726562e+01 -1.105075000000000029e+00 -3.812500000000000000e+01 -1.105080000000000062e+00 -3.812500000000000000e+01 -1.105085000000000095e+00 -3.815625381469726562e+01 -1.105090000000000128e+00 -3.809375000000000000e+01 -1.105095000000000161e+00 -3.815625381469726562e+01 -1.105100000000000193e+00 -3.809375000000000000e+01 -1.105105000000000004e+00 -3.812500000000000000e+01 -1.105110000000000037e+00 -3.815625381469726562e+01 -1.105115000000000069e+00 -3.815625381469726562e+01 -1.105120000000000102e+00 -3.815625381469726562e+01 -1.105125000000000135e+00 -3.809375000000000000e+01 -1.105130000000000168e+00 -3.812500000000000000e+01 -1.105135000000000201e+00 -3.812500000000000000e+01 -1.105140000000000011e+00 -3.806250000000000000e+01 -1.105145000000000044e+00 -3.809375000000000000e+01 -1.105150000000000077e+00 -3.815625381469726562e+01 -1.105155000000000109e+00 -3.815625381469726562e+01 -1.105160000000000142e+00 -3.812500000000000000e+01 -1.105165000000000175e+00 -3.809375000000000000e+01 -1.105169999999999986e+00 -3.806250000000000000e+01 -1.105175000000000018e+00 -3.809375000000000000e+01 -1.105180000000000051e+00 -3.812500000000000000e+01 -1.105185000000000084e+00 -3.809375000000000000e+01 -1.105190000000000117e+00 -3.806250000000000000e+01 -1.105195000000000149e+00 -3.809375000000000000e+01 -1.105200000000000182e+00 -3.806250000000000000e+01 -1.105204999999999993e+00 -3.806250000000000000e+01 -1.105210000000000026e+00 -3.815625381469726562e+01 -1.105215000000000058e+00 -3.806250000000000000e+01 -1.105220000000000091e+00 -3.809375000000000000e+01 -1.105225000000000124e+00 -3.809375000000000000e+01 -1.105230000000000157e+00 -3.806250000000000000e+01 -1.105235000000000190e+00 -3.806250000000000000e+01 -1.105240000000000000e+00 -3.803125000000000000e+01 -1.105245000000000033e+00 -3.806250000000000000e+01 -1.105250000000000066e+00 -3.809375000000000000e+01 -1.105255000000000098e+00 -3.806250000000000000e+01 -1.105260000000000131e+00 -3.809375000000000000e+01 -1.105265000000000164e+00 -3.812500000000000000e+01 -1.105270000000000197e+00 -3.812500000000000000e+01 -1.105275000000000007e+00 -3.806250000000000000e+01 -1.105280000000000040e+00 -3.809375000000000000e+01 -1.105285000000000073e+00 -3.809375000000000000e+01 -1.105290000000000106e+00 -3.809375000000000000e+01 -1.105295000000000138e+00 -3.806250000000000000e+01 -1.105300000000000171e+00 -3.809375000000000000e+01 -1.105304999999999982e+00 -3.809375000000000000e+01 -1.105310000000000015e+00 -3.803125000000000000e+01 -1.105315000000000047e+00 -3.806250000000000000e+01 -1.105320000000000080e+00 -3.803125000000000000e+01 -1.105325000000000113e+00 -3.809375000000000000e+01 -1.105330000000000146e+00 -3.806250000000000000e+01 -1.105335000000000178e+00 -3.809375000000000000e+01 -1.105339999999999989e+00 -3.809375000000000000e+01 -1.105345000000000022e+00 -3.809375000000000000e+01 -1.105350000000000055e+00 -3.806250000000000000e+01 -1.105355000000000087e+00 -3.809375000000000000e+01 -1.105360000000000120e+00 -3.803125000000000000e+01 -1.105365000000000153e+00 -3.809375000000000000e+01 -1.105370000000000186e+00 -3.806250000000000000e+01 -1.105374999999999996e+00 -3.809375000000000000e+01 -1.105380000000000029e+00 -3.803125000000000000e+01 -1.105385000000000062e+00 -3.812500000000000000e+01 -1.105390000000000095e+00 -3.809375000000000000e+01 -1.105395000000000127e+00 -3.812500000000000000e+01 -1.105400000000000160e+00 -3.806250000000000000e+01 -1.105405000000000193e+00 -3.812500000000000000e+01 -1.105410000000000004e+00 -3.809375000000000000e+01 -1.105415000000000036e+00 -3.812500000000000000e+01 -1.105420000000000069e+00 -3.809375000000000000e+01 -1.105425000000000102e+00 -3.806250000000000000e+01 -1.105430000000000135e+00 -3.806250000000000000e+01 -1.105435000000000167e+00 -3.809375000000000000e+01 -1.105440000000000200e+00 -3.803125000000000000e+01 -1.105445000000000011e+00 -3.806250000000000000e+01 -1.105450000000000044e+00 -3.812500000000000000e+01 -1.105455000000000076e+00 -3.815625381469726562e+01 -1.105460000000000109e+00 -3.809375000000000000e+01 -1.105465000000000142e+00 -3.809375000000000000e+01 -1.105470000000000175e+00 -3.812500000000000000e+01 -1.105474999999999985e+00 -3.812500000000000000e+01 -1.105480000000000018e+00 -3.815625381469726562e+01 -1.105485000000000051e+00 -3.809375000000000000e+01 -1.105490000000000084e+00 -3.809375000000000000e+01 -1.105495000000000116e+00 -3.803125000000000000e+01 -1.105500000000000149e+00 -3.812500000000000000e+01 -1.105505000000000182e+00 -3.809375000000000000e+01 -1.105509999999999993e+00 -3.809375000000000000e+01 -1.105515000000000025e+00 -3.803125000000000000e+01 -1.105520000000000058e+00 -3.803125000000000000e+01 -1.105525000000000091e+00 -3.803125000000000000e+01 -1.105530000000000124e+00 -3.803125000000000000e+01 -1.105535000000000156e+00 -3.809375000000000000e+01 -1.105540000000000189e+00 -3.809375000000000000e+01 -1.105545000000000000e+00 -3.809375000000000000e+01 -1.105550000000000033e+00 -3.806250000000000000e+01 -1.105555000000000065e+00 -3.806250000000000000e+01 -1.105560000000000098e+00 -3.806250000000000000e+01 -1.105565000000000131e+00 -3.803125000000000000e+01 -1.105570000000000164e+00 -3.803125000000000000e+01 -1.105575000000000196e+00 -3.803125000000000000e+01 -1.105580000000000007e+00 -3.809375000000000000e+01 -1.105585000000000040e+00 -3.806250000000000000e+01 -1.105590000000000073e+00 -3.803125000000000000e+01 -1.105595000000000105e+00 -3.803125000000000000e+01 -1.105600000000000138e+00 -3.806250000000000000e+01 -1.105605000000000171e+00 -3.803125000000000000e+01 -1.105609999999999982e+00 -3.803125000000000000e+01 -1.105615000000000014e+00 -3.806250000000000000e+01 -1.105620000000000047e+00 -3.809375000000000000e+01 -1.105625000000000080e+00 -3.809375000000000000e+01 -1.105630000000000113e+00 -3.806250000000000000e+01 -1.105635000000000145e+00 -3.809375000000000000e+01 -1.105640000000000178e+00 -3.806250000000000000e+01 -1.105644999999999989e+00 -3.803125000000000000e+01 -1.105650000000000022e+00 -3.806250000000000000e+01 -1.105655000000000054e+00 -3.809375000000000000e+01 -1.105660000000000087e+00 -3.806250000000000000e+01 -1.105665000000000120e+00 -3.806250000000000000e+01 -1.105670000000000153e+00 -3.803125000000000000e+01 -1.105675000000000185e+00 -3.803125000000000000e+01 -1.105679999999999996e+00 -3.803125000000000000e+01 -1.105685000000000029e+00 -3.809375000000000000e+01 -1.105690000000000062e+00 -3.800000381469726562e+01 -1.105695000000000094e+00 -3.806250000000000000e+01 -1.105700000000000127e+00 -3.809375000000000000e+01 -1.105705000000000160e+00 -3.803125000000000000e+01 -1.105710000000000193e+00 -3.806250000000000000e+01 -1.105715000000000003e+00 -3.809375000000000000e+01 -1.105720000000000036e+00 -3.803125000000000000e+01 -1.105725000000000069e+00 -3.803125000000000000e+01 -1.105730000000000102e+00 -3.803125000000000000e+01 -1.105735000000000134e+00 -3.806250000000000000e+01 -1.105740000000000167e+00 -3.803125000000000000e+01 -1.105745000000000200e+00 -3.806250000000000000e+01 -1.105750000000000011e+00 -3.803125000000000000e+01 -1.105755000000000043e+00 -3.806250000000000000e+01 -1.105760000000000076e+00 -3.803125000000000000e+01 -1.105765000000000109e+00 -3.803125000000000000e+01 -1.105770000000000142e+00 -3.803125000000000000e+01 -1.105775000000000174e+00 -3.803125000000000000e+01 -1.105779999999999985e+00 -3.803125000000000000e+01 -1.105785000000000018e+00 -3.800000381469726562e+01 -1.105790000000000051e+00 -3.800000381469726562e+01 -1.105795000000000083e+00 -3.800000381469726562e+01 -1.105800000000000116e+00 -3.796875000000000000e+01 -1.105805000000000149e+00 -3.803125000000000000e+01 -1.105810000000000182e+00 -3.800000381469726562e+01 -1.105814999999999992e+00 -3.803125000000000000e+01 -1.105820000000000025e+00 -3.803125000000000000e+01 -1.105825000000000058e+00 -3.800000381469726562e+01 -1.105830000000000091e+00 -3.793750000000000000e+01 -1.105835000000000123e+00 -3.793750000000000000e+01 -1.105840000000000156e+00 -3.800000381469726562e+01 -1.105845000000000189e+00 -3.796875000000000000e+01 -1.105850000000000000e+00 -3.800000381469726562e+01 -1.105855000000000032e+00 -3.796875000000000000e+01 -1.105860000000000065e+00 -3.796875000000000000e+01 -1.105865000000000098e+00 -3.793750000000000000e+01 -1.105870000000000131e+00 -3.800000381469726562e+01 -1.105875000000000163e+00 -3.800000381469726562e+01 -1.105880000000000196e+00 -3.796875000000000000e+01 -1.105885000000000007e+00 -3.796875000000000000e+01 -1.105890000000000040e+00 -3.796875000000000000e+01 -1.105895000000000072e+00 -3.796875000000000000e+01 -1.105900000000000105e+00 -3.800000381469726562e+01 -1.105905000000000138e+00 -3.803125000000000000e+01 -1.105910000000000171e+00 -3.796875000000000000e+01 -1.105914999999999981e+00 -3.803125000000000000e+01 -1.105920000000000014e+00 -3.800000381469726562e+01 -1.105925000000000047e+00 -3.796875000000000000e+01 -1.105930000000000080e+00 -3.803125000000000000e+01 -1.105935000000000112e+00 -3.803125000000000000e+01 -1.105940000000000145e+00 -3.793750000000000000e+01 -1.105945000000000178e+00 -3.793750000000000000e+01 -1.105949999999999989e+00 -3.800000381469726562e+01 -1.105955000000000021e+00 -3.796875000000000000e+01 -1.105960000000000054e+00 -3.803125000000000000e+01 -1.105965000000000087e+00 -3.796875000000000000e+01 -1.105970000000000120e+00 -3.793750000000000000e+01 -1.105975000000000152e+00 -3.793750000000000000e+01 -1.105980000000000185e+00 -3.796875000000000000e+01 -1.105984999999999996e+00 -3.800000381469726562e+01 -1.105990000000000029e+00 -3.803125000000000000e+01 -1.105995000000000061e+00 -3.796875000000000000e+01 -1.106000000000000094e+00 -3.796875000000000000e+01 -1.106005000000000127e+00 -3.796875000000000000e+01 -1.106010000000000160e+00 -3.796875000000000000e+01 -1.106015000000000192e+00 -3.793750000000000000e+01 -1.106020000000000003e+00 -3.800000381469726562e+01 -1.106025000000000036e+00 -3.800000381469726562e+01 -1.106030000000000069e+00 -3.800000381469726562e+01 -1.106035000000000101e+00 -3.800000381469726562e+01 -1.106040000000000134e+00 -3.796875000000000000e+01 -1.106045000000000167e+00 -3.803125000000000000e+01 -1.106050000000000200e+00 -3.803125000000000000e+01 -1.106055000000000010e+00 -3.793750000000000000e+01 -1.106060000000000043e+00 -3.803125000000000000e+01 -1.106065000000000076e+00 -3.800000381469726562e+01 -1.106070000000000109e+00 -3.796875000000000000e+01 -1.106075000000000141e+00 -3.800000381469726562e+01 -1.106080000000000174e+00 -3.803125000000000000e+01 -1.106084999999999985e+00 -3.800000381469726562e+01 -1.106090000000000018e+00 -3.800000381469726562e+01 -1.106095000000000050e+00 -3.800000381469726562e+01 -1.106100000000000083e+00 -3.803125000000000000e+01 -1.106105000000000116e+00 -3.796875000000000000e+01 -1.106110000000000149e+00 -3.793750000000000000e+01 -1.106115000000000181e+00 -3.796875000000000000e+01 -1.106119999999999992e+00 -3.796875000000000000e+01 -1.106125000000000025e+00 -3.790625000000000000e+01 -1.106130000000000058e+00 -3.796875000000000000e+01 -1.106135000000000090e+00 -3.793750000000000000e+01 -1.106140000000000123e+00 -3.796875000000000000e+01 -1.106145000000000156e+00 -3.790625000000000000e+01 -1.106150000000000189e+00 -3.796875000000000000e+01 -1.106154999999999999e+00 -3.790625000000000000e+01 -1.106160000000000032e+00 -3.793750000000000000e+01 -1.106165000000000065e+00 -3.793750000000000000e+01 -1.106170000000000098e+00 -3.790625000000000000e+01 -1.106175000000000130e+00 -3.790625000000000000e+01 -1.106180000000000163e+00 -3.790625000000000000e+01 -1.106185000000000196e+00 -3.787500000000000000e+01 -1.106190000000000007e+00 -3.793750000000000000e+01 -1.106195000000000039e+00 -3.793750000000000000e+01 -1.106200000000000072e+00 -3.793750000000000000e+01 -1.106205000000000105e+00 -3.793750000000000000e+01 -1.106210000000000138e+00 -3.793750000000000000e+01 -1.106215000000000170e+00 -3.790625000000000000e+01 -1.106219999999999981e+00 -3.790625000000000000e+01 -1.106225000000000014e+00 -3.784375381469726562e+01 -1.106230000000000047e+00 -3.790625000000000000e+01 -1.106235000000000079e+00 -3.790625000000000000e+01 -1.106240000000000112e+00 -3.796875000000000000e+01 -1.106245000000000145e+00 -3.787500000000000000e+01 -1.106250000000000178e+00 -3.787500000000000000e+01 -1.106254999999999988e+00 -3.790625000000000000e+01 -1.106260000000000021e+00 -3.790625000000000000e+01 -1.106265000000000054e+00 -3.790625000000000000e+01 -1.106270000000000087e+00 -3.787500000000000000e+01 -1.106275000000000119e+00 -3.790625000000000000e+01 -1.106280000000000152e+00 -3.787500000000000000e+01 -1.106285000000000185e+00 -3.790625000000000000e+01 -1.106289999999999996e+00 -3.784375381469726562e+01 -1.106295000000000028e+00 -3.790625000000000000e+01 -1.106300000000000061e+00 -3.790625000000000000e+01 -1.106305000000000094e+00 -3.787500000000000000e+01 -1.106310000000000127e+00 -3.784375381469726562e+01 -1.106315000000000159e+00 -3.790625000000000000e+01 -1.106320000000000192e+00 -3.787500000000000000e+01 -1.106325000000000003e+00 -3.787500000000000000e+01 -1.106330000000000036e+00 -3.790625000000000000e+01 -1.106335000000000068e+00 -3.784375381469726562e+01 -1.106340000000000101e+00 -3.784375381469726562e+01 -1.106345000000000134e+00 -3.787500000000000000e+01 -1.106350000000000167e+00 -3.790625000000000000e+01 -1.106355000000000199e+00 -3.787500000000000000e+01 -1.106360000000000010e+00 -3.787500000000000000e+01 -1.106365000000000043e+00 -3.793750000000000000e+01 -1.106370000000000076e+00 -3.784375381469726562e+01 -1.106375000000000108e+00 -3.784375381469726562e+01 -1.106380000000000141e+00 -3.787500000000000000e+01 -1.106385000000000174e+00 -3.790625000000000000e+01 -1.106389999999999985e+00 -3.790625000000000000e+01 -1.106395000000000017e+00 -3.790625000000000000e+01 -1.106400000000000050e+00 -3.781250000000000000e+01 -1.106405000000000083e+00 -3.784375381469726562e+01 -1.106410000000000116e+00 -3.781250000000000000e+01 -1.106415000000000148e+00 -3.784375381469726562e+01 -1.106420000000000181e+00 -3.790625000000000000e+01 -1.106424999999999992e+00 -3.790625000000000000e+01 -1.106430000000000025e+00 -3.784375381469726562e+01 -1.106435000000000057e+00 -3.790625000000000000e+01 -1.106440000000000090e+00 -3.790625000000000000e+01 -1.106445000000000123e+00 -3.784375381469726562e+01 -1.106450000000000156e+00 -3.784375381469726562e+01 -1.106455000000000188e+00 -3.781250000000000000e+01 -1.106459999999999999e+00 -3.790625000000000000e+01 -1.106465000000000032e+00 -3.790625000000000000e+01 -1.106470000000000065e+00 -3.790625000000000000e+01 -1.106475000000000097e+00 -3.784375381469726562e+01 -1.106480000000000130e+00 -3.787500000000000000e+01 -1.106485000000000163e+00 -3.784375381469726562e+01 -1.106490000000000196e+00 -3.790625000000000000e+01 -1.106495000000000006e+00 -3.790625000000000000e+01 -1.106500000000000039e+00 -3.790625000000000000e+01 -1.106505000000000072e+00 -3.790625000000000000e+01 -1.106510000000000105e+00 -3.787500000000000000e+01 -1.106515000000000137e+00 -3.790625000000000000e+01 -1.106520000000000170e+00 -3.787500000000000000e+01 -1.106524999999999981e+00 -3.781250000000000000e+01 -1.106530000000000014e+00 -3.781250000000000000e+01 -1.106535000000000046e+00 -3.793750000000000000e+01 -1.106540000000000079e+00 -3.784375381469726562e+01 -1.106545000000000112e+00 -3.787500000000000000e+01 -1.106550000000000145e+00 -3.784375381469726562e+01 -1.106555000000000177e+00 -3.787500000000000000e+01 -1.106559999999999988e+00 -3.790625000000000000e+01 -1.106565000000000021e+00 -3.790625000000000000e+01 -1.106570000000000054e+00 -3.787500000000000000e+01 -1.106575000000000086e+00 -3.787500000000000000e+01 -1.106580000000000119e+00 -3.793750000000000000e+01 -1.106585000000000152e+00 -3.784375381469726562e+01 -1.106590000000000185e+00 -3.790625000000000000e+01 -1.106594999999999995e+00 -3.787500000000000000e+01 -1.106600000000000028e+00 -3.790625000000000000e+01 -1.106605000000000061e+00 -3.787500000000000000e+01 -1.106610000000000094e+00 -3.787500000000000000e+01 -1.106615000000000126e+00 -3.787500000000000000e+01 -1.106620000000000159e+00 -3.793750000000000000e+01 -1.106625000000000192e+00 -3.781250000000000000e+01 -1.106630000000000003e+00 -3.781250000000000000e+01 -1.106635000000000035e+00 -3.790625000000000000e+01 -1.106640000000000068e+00 -3.787500000000000000e+01 -1.106645000000000101e+00 -3.784375381469726562e+01 -1.106650000000000134e+00 -3.790625000000000000e+01 -1.106655000000000166e+00 -3.793750000000000000e+01 -1.106660000000000199e+00 -3.787500000000000000e+01 -1.106665000000000010e+00 -3.790625000000000000e+01 -1.106670000000000043e+00 -3.790625000000000000e+01 -1.106675000000000075e+00 -3.793750000000000000e+01 -1.106680000000000108e+00 -3.787500000000000000e+01 -1.106685000000000141e+00 -3.784375381469726562e+01 -1.106690000000000174e+00 -3.787500000000000000e+01 -1.106694999999999984e+00 -3.781250000000000000e+01 -1.106700000000000017e+00 -3.781250000000000000e+01 -1.106705000000000050e+00 -3.784375381469726562e+01 -1.106710000000000083e+00 -3.781250000000000000e+01 -1.106715000000000115e+00 -3.784375381469726562e+01 -1.106720000000000148e+00 -3.781250000000000000e+01 -1.106725000000000181e+00 -3.784375381469726562e+01 -1.106729999999999992e+00 -3.784375381469726562e+01 -1.106735000000000024e+00 -3.784375381469726562e+01 -1.106740000000000057e+00 -3.784375381469726562e+01 -1.106745000000000090e+00 -3.784375381469726562e+01 -1.106750000000000123e+00 -3.784375381469726562e+01 -1.106755000000000155e+00 -3.781250000000000000e+01 -1.106760000000000188e+00 -3.781250000000000000e+01 -1.106764999999999999e+00 -3.775000381469726562e+01 -1.106770000000000032e+00 -3.775000381469726562e+01 -1.106775000000000064e+00 -3.784375381469726562e+01 -1.106780000000000097e+00 -3.787500000000000000e+01 -1.106785000000000130e+00 -3.778125000000000000e+01 -1.106790000000000163e+00 -3.784375381469726562e+01 -1.106795000000000195e+00 -3.778125000000000000e+01 -1.106800000000000006e+00 -3.781250000000000000e+01 -1.106805000000000039e+00 -3.784375381469726562e+01 -1.106810000000000072e+00 -3.778125000000000000e+01 -1.106815000000000104e+00 -3.781250000000000000e+01 -1.106820000000000137e+00 -3.771875000000000000e+01 -1.106825000000000170e+00 -3.781250000000000000e+01 -1.106829999999999981e+00 -3.787500000000000000e+01 -1.106835000000000013e+00 -3.784375381469726562e+01 -1.106840000000000046e+00 -3.787500000000000000e+01 -1.106845000000000079e+00 -3.784375381469726562e+01 -1.106850000000000112e+00 -3.790625000000000000e+01 -1.106855000000000144e+00 -3.784375381469726562e+01 -1.106860000000000177e+00 -3.784375381469726562e+01 -1.106864999999999988e+00 -3.787500000000000000e+01 -1.106870000000000021e+00 -3.784375381469726562e+01 -1.106875000000000053e+00 -3.778125000000000000e+01 -1.106880000000000086e+00 -3.781250000000000000e+01 -1.106885000000000119e+00 -3.787500000000000000e+01 -1.106890000000000152e+00 -3.784375381469726562e+01 -1.106895000000000184e+00 -3.781250000000000000e+01 -1.106899999999999995e+00 -3.790625000000000000e+01 -1.106905000000000028e+00 -3.781250000000000000e+01 -1.106910000000000061e+00 -3.784375381469726562e+01 -1.106915000000000093e+00 -3.790625000000000000e+01 -1.106920000000000126e+00 -3.781250000000000000e+01 -1.106925000000000159e+00 -3.784375381469726562e+01 -1.106930000000000192e+00 -3.778125000000000000e+01 -1.106935000000000002e+00 -3.784375381469726562e+01 -1.106940000000000035e+00 -3.778125000000000000e+01 -1.106945000000000068e+00 -3.781250000000000000e+01 -1.106950000000000101e+00 -3.781250000000000000e+01 -1.106955000000000133e+00 -3.781250000000000000e+01 -1.106960000000000166e+00 -3.784375381469726562e+01 -1.106965000000000199e+00 -3.778125000000000000e+01 -1.106970000000000010e+00 -3.775000381469726562e+01 -1.106975000000000042e+00 -3.778125000000000000e+01 -1.106980000000000075e+00 -3.781250000000000000e+01 -1.106985000000000108e+00 -3.778125000000000000e+01 -1.106990000000000141e+00 -3.784375381469726562e+01 -1.106995000000000173e+00 -3.778125000000000000e+01 -1.106999999999999984e+00 -3.775000381469726562e+01 -1.107005000000000017e+00 -3.784375381469726562e+01 -1.107010000000000050e+00 -3.778125000000000000e+01 -1.107015000000000082e+00 -3.778125000000000000e+01 -1.107020000000000115e+00 -3.775000381469726562e+01 -1.107025000000000148e+00 -3.775000381469726562e+01 -1.107030000000000181e+00 -3.778125000000000000e+01 -1.107034999999999991e+00 -3.775000381469726562e+01 -1.107040000000000024e+00 -3.775000381469726562e+01 -1.107045000000000057e+00 -3.768750000000000000e+01 -1.107050000000000090e+00 -3.771875000000000000e+01 -1.107055000000000122e+00 -3.771875000000000000e+01 -1.107060000000000155e+00 -3.771875000000000000e+01 -1.107065000000000188e+00 -3.768750000000000000e+01 -1.107069999999999999e+00 -3.778125000000000000e+01 -1.107075000000000031e+00 -3.778125000000000000e+01 -1.107080000000000064e+00 -3.768750000000000000e+01 -1.107085000000000097e+00 -3.784375381469726562e+01 -1.107090000000000130e+00 -3.771875000000000000e+01 -1.107095000000000162e+00 -3.778125000000000000e+01 -1.107100000000000195e+00 -3.771875000000000000e+01 -1.107105000000000006e+00 -3.781250000000000000e+01 -1.107110000000000039e+00 -3.778125000000000000e+01 -1.107115000000000071e+00 -3.784375381469726562e+01 -1.107120000000000104e+00 -3.775000381469726562e+01 -1.107125000000000137e+00 -3.778125000000000000e+01 -1.107130000000000170e+00 -3.778125000000000000e+01 -1.107134999999999980e+00 -3.778125000000000000e+01 -1.107140000000000013e+00 -3.775000381469726562e+01 -1.107145000000000046e+00 -3.775000381469726562e+01 -1.107150000000000079e+00 -3.771875000000000000e+01 -1.107155000000000111e+00 -3.778125000000000000e+01 -1.107160000000000144e+00 -3.778125000000000000e+01 -1.107165000000000177e+00 -3.775000381469726562e+01 -1.107169999999999987e+00 -3.778125000000000000e+01 -1.107175000000000020e+00 -3.775000381469726562e+01 -1.107180000000000053e+00 -3.778125000000000000e+01 -1.107185000000000086e+00 -3.778125000000000000e+01 -1.107190000000000119e+00 -3.775000381469726562e+01 -1.107195000000000151e+00 -3.778125000000000000e+01 -1.107200000000000184e+00 -3.778125000000000000e+01 -1.107204999999999995e+00 -3.778125000000000000e+01 -1.107210000000000027e+00 -3.775000381469726562e+01 -1.107215000000000060e+00 -3.768750000000000000e+01 -1.107220000000000093e+00 -3.765625000000000000e+01 -1.107225000000000126e+00 -3.775000381469726562e+01 -1.107230000000000159e+00 -3.768750000000000000e+01 -1.107235000000000191e+00 -3.771875000000000000e+01 -1.107240000000000002e+00 -3.778125000000000000e+01 -1.107245000000000035e+00 -3.768750000000000000e+01 -1.107250000000000068e+00 -3.768750000000000000e+01 -1.107255000000000100e+00 -3.765625000000000000e+01 -1.107260000000000133e+00 -3.775000381469726562e+01 -1.107265000000000166e+00 -3.775000381469726562e+01 -1.107270000000000199e+00 -3.775000381469726562e+01 -1.107275000000000009e+00 -3.778125000000000000e+01 -1.107280000000000042e+00 -3.778125000000000000e+01 -1.107285000000000075e+00 -3.771875000000000000e+01 -1.107290000000000108e+00 -3.771875000000000000e+01 -1.107295000000000140e+00 -3.778125000000000000e+01 -1.107300000000000173e+00 -3.771875000000000000e+01 -1.107304999999999984e+00 -3.771875000000000000e+01 -1.107310000000000016e+00 -3.771875000000000000e+01 -1.107315000000000049e+00 -3.775000381469726562e+01 -1.107320000000000082e+00 -3.768750000000000000e+01 -1.107325000000000115e+00 -3.771875000000000000e+01 -1.107330000000000148e+00 -3.771875000000000000e+01 -1.107335000000000180e+00 -3.768750000000000000e+01 -1.107339999999999991e+00 -3.771875000000000000e+01 -1.107345000000000024e+00 -3.765625000000000000e+01 -1.107350000000000056e+00 -3.768750000000000000e+01 -1.107355000000000089e+00 -3.771875000000000000e+01 -1.107360000000000122e+00 -3.768750000000000000e+01 -1.107365000000000155e+00 -3.765625000000000000e+01 -1.107370000000000188e+00 -3.765625000000000000e+01 -1.107374999999999998e+00 -3.771875000000000000e+01 -1.107380000000000031e+00 -3.765625000000000000e+01 -1.107385000000000064e+00 -3.765625000000000000e+01 -1.107390000000000096e+00 -3.762500000000000000e+01 -1.107395000000000129e+00 -3.765625000000000000e+01 -1.107400000000000162e+00 -3.765625000000000000e+01 -1.107405000000000195e+00 -3.765625000000000000e+01 -1.107410000000000005e+00 -3.765625000000000000e+01 -1.107415000000000038e+00 -3.768750000000000000e+01 -1.107420000000000071e+00 -3.768750000000000000e+01 -1.107425000000000104e+00 -3.762500000000000000e+01 -1.107430000000000136e+00 -3.768750000000000000e+01 -1.107435000000000169e+00 -3.765625000000000000e+01 -1.107439999999999980e+00 -3.765625000000000000e+01 -1.107445000000000013e+00 -3.765625000000000000e+01 -1.107450000000000045e+00 -3.765625000000000000e+01 -1.107455000000000078e+00 -3.765625000000000000e+01 -1.107460000000000111e+00 -3.771875000000000000e+01 -1.107465000000000144e+00 -3.762500000000000000e+01 -1.107470000000000176e+00 -3.765625000000000000e+01 -1.107474999999999987e+00 -3.762500000000000000e+01 -1.107480000000000020e+00 -3.765625000000000000e+01 -1.107485000000000053e+00 -3.765625000000000000e+01 -1.107490000000000085e+00 -3.762500000000000000e+01 -1.107495000000000118e+00 -3.762500000000000000e+01 -1.107500000000000151e+00 -3.765625000000000000e+01 -1.107505000000000184e+00 -3.765625000000000000e+01 -1.107509999999999994e+00 -3.759375381469726562e+01 -1.107515000000000027e+00 -3.756250000000000000e+01 -1.107520000000000060e+00 -3.765625000000000000e+01 -1.107525000000000093e+00 -3.762500000000000000e+01 -1.107530000000000125e+00 -3.759375381469726562e+01 -1.107535000000000158e+00 -3.762500000000000000e+01 -1.107540000000000191e+00 -3.756250000000000000e+01 -1.107545000000000002e+00 -3.759375381469726562e+01 -1.107550000000000034e+00 -3.756250000000000000e+01 -1.107555000000000067e+00 -3.765625000000000000e+01 -1.107560000000000100e+00 -3.762500000000000000e+01 -1.107565000000000133e+00 -3.759375381469726562e+01 -1.107570000000000165e+00 -3.756250000000000000e+01 -1.107575000000000198e+00 -3.762500000000000000e+01 -1.107580000000000009e+00 -3.759375381469726562e+01 -1.107585000000000042e+00 -3.753125000000000000e+01 -1.107590000000000074e+00 -3.756250000000000000e+01 -1.107595000000000107e+00 -3.762500000000000000e+01 -1.107600000000000140e+00 -3.759375381469726562e+01 -1.107605000000000173e+00 -3.759375381469726562e+01 -1.107609999999999983e+00 -3.756250000000000000e+01 -1.107615000000000016e+00 -3.759375381469726562e+01 -1.107620000000000049e+00 -3.756250000000000000e+01 -1.107625000000000082e+00 -3.759375381469726562e+01 -1.107630000000000114e+00 -3.759375381469726562e+01 -1.107635000000000147e+00 -3.762500000000000000e+01 -1.107640000000000180e+00 -3.765625000000000000e+01 -1.107644999999999991e+00 -3.756250000000000000e+01 -1.107650000000000023e+00 -3.756250000000000000e+01 -1.107655000000000056e+00 -3.759375381469726562e+01 -1.107660000000000089e+00 -3.756250000000000000e+01 -1.107665000000000122e+00 -3.759375381469726562e+01 -1.107670000000000154e+00 -3.756250000000000000e+01 -1.107675000000000187e+00 -3.759375381469726562e+01 -1.107679999999999998e+00 -3.750000000000000000e+01 -1.107685000000000031e+00 -3.759375381469726562e+01 -1.107690000000000063e+00 -3.759375381469726562e+01 -1.107695000000000096e+00 -3.756250000000000000e+01 -1.107700000000000129e+00 -3.756250000000000000e+01 -1.107705000000000162e+00 -3.756250000000000000e+01 -1.107710000000000194e+00 -3.753125000000000000e+01 -1.107715000000000005e+00 -3.759375381469726562e+01 -1.107720000000000038e+00 -3.759375381469726562e+01 -1.107725000000000071e+00 -3.753125000000000000e+01 -1.107730000000000103e+00 -3.750000000000000000e+01 -1.107735000000000136e+00 -3.756250000000000000e+01 -1.107740000000000169e+00 -3.762500000000000000e+01 -1.107744999999999980e+00 -3.753125000000000000e+01 -1.107750000000000012e+00 -3.756250000000000000e+01 -1.107755000000000045e+00 -3.753125000000000000e+01 -1.107760000000000078e+00 -3.759375381469726562e+01 -1.107765000000000111e+00 -3.756250000000000000e+01 -1.107770000000000143e+00 -3.759375381469726562e+01 -1.107775000000000176e+00 -3.750000000000000000e+01 -1.107779999999999987e+00 -3.753125000000000000e+01 -1.107785000000000020e+00 -3.753125000000000000e+01 -1.107790000000000052e+00 -3.753125000000000000e+01 -1.107795000000000085e+00 -3.753125000000000000e+01 -1.107800000000000118e+00 -3.756250000000000000e+01 -1.107805000000000151e+00 -3.753125000000000000e+01 -1.107810000000000183e+00 -3.750000000000000000e+01 -1.107814999999999994e+00 -3.750000000000000000e+01 -1.107820000000000027e+00 -3.759375381469726562e+01 -1.107825000000000060e+00 -3.750000000000000000e+01 -1.107830000000000092e+00 -3.756250000000000000e+01 -1.107835000000000125e+00 -3.750000000000000000e+01 -1.107840000000000158e+00 -3.750000000000000000e+01 -1.107845000000000191e+00 -3.750000000000000000e+01 -1.107850000000000001e+00 -3.753125000000000000e+01 -1.107855000000000034e+00 -3.756250000000000000e+01 -1.107860000000000067e+00 -3.750000000000000000e+01 -1.107865000000000100e+00 -3.753125000000000000e+01 -1.107870000000000132e+00 -3.756250000000000000e+01 -1.107875000000000165e+00 -3.750000000000000000e+01 -1.107880000000000198e+00 -3.750000000000000000e+01 -1.107885000000000009e+00 -3.750000000000000000e+01 -1.107890000000000041e+00 -3.759375381469726562e+01 -1.107895000000000074e+00 -3.753125000000000000e+01 -1.107900000000000107e+00 -3.750000000000000000e+01 -1.107905000000000140e+00 -3.750000000000000000e+01 -1.107910000000000172e+00 -3.750000000000000000e+01 -1.107914999999999983e+00 -3.750000000000000000e+01 -1.107920000000000016e+00 -3.750000000000000000e+01 -1.107925000000000049e+00 -3.753125000000000000e+01 -1.107930000000000081e+00 -3.746875000000000000e+01 -1.107935000000000114e+00 -3.750000000000000000e+01 -1.107940000000000147e+00 -3.746875000000000000e+01 -1.107945000000000180e+00 -3.753125000000000000e+01 -1.107949999999999990e+00 -3.750000000000000000e+01 -1.107955000000000023e+00 -3.750000000000000000e+01 -1.107960000000000056e+00 -3.746875000000000000e+01 -1.107965000000000089e+00 -3.746875000000000000e+01 -1.107970000000000121e+00 -3.753125000000000000e+01 -1.107975000000000154e+00 -3.750000000000000000e+01 -1.107980000000000187e+00 -3.753125000000000000e+01 -1.107984999999999998e+00 -3.746875000000000000e+01 -1.107990000000000030e+00 -3.750000000000000000e+01 -1.107995000000000063e+00 -3.753125000000000000e+01 -1.108000000000000096e+00 -3.750000000000000000e+01 -1.108005000000000129e+00 -3.743750381469726562e+01 -1.108010000000000161e+00 -3.746875000000000000e+01 -1.108015000000000194e+00 -3.746875000000000000e+01 -1.108020000000000005e+00 -3.743750381469726562e+01 -1.108025000000000038e+00 -3.737500000000000000e+01 -1.108030000000000070e+00 -3.743750381469726562e+01 -1.108035000000000103e+00 -3.743750381469726562e+01 -1.108040000000000136e+00 -3.743750381469726562e+01 -1.108045000000000169e+00 -3.740625000000000000e+01 -1.108050000000000201e+00 -3.740625000000000000e+01 -1.108055000000000012e+00 -3.746875000000000000e+01 -1.108060000000000045e+00 -3.750000000000000000e+01 -1.108065000000000078e+00 -3.743750381469726562e+01 -1.108070000000000110e+00 -3.750000000000000000e+01 -1.108075000000000143e+00 -3.743750381469726562e+01 -1.108080000000000176e+00 -3.743750381469726562e+01 -1.108084999999999987e+00 -3.743750381469726562e+01 -1.108090000000000019e+00 -3.743750381469726562e+01 -1.108095000000000052e+00 -3.740625000000000000e+01 -1.108100000000000085e+00 -3.743750381469726562e+01 -1.108105000000000118e+00 -3.743750381469726562e+01 -1.108110000000000150e+00 -3.743750381469726562e+01 -1.108115000000000183e+00 -3.740625000000000000e+01 -1.108119999999999994e+00 -3.746875000000000000e+01 -1.108125000000000027e+00 -3.743750381469726562e+01 -1.108130000000000059e+00 -3.750000000000000000e+01 -1.108135000000000092e+00 -3.746875000000000000e+01 -1.108140000000000125e+00 -3.746875000000000000e+01 -1.108145000000000158e+00 -3.750000000000000000e+01 -1.108150000000000190e+00 -3.746875000000000000e+01 -1.108155000000000001e+00 -3.746875000000000000e+01 -1.108160000000000034e+00 -3.746875000000000000e+01 -1.108165000000000067e+00 -3.750000000000000000e+01 -1.108170000000000099e+00 -3.743750381469726562e+01 -1.108175000000000132e+00 -3.743750381469726562e+01 -1.108180000000000165e+00 -3.743750381469726562e+01 -1.108185000000000198e+00 -3.737500000000000000e+01 -1.108190000000000008e+00 -3.740625000000000000e+01 -1.108195000000000041e+00 -3.743750381469726562e+01 -1.108200000000000074e+00 -3.740625000000000000e+01 -1.108205000000000107e+00 -3.740625000000000000e+01 -1.108210000000000139e+00 -3.737500000000000000e+01 -1.108215000000000172e+00 -3.743750381469726562e+01 -1.108219999999999983e+00 -3.737500000000000000e+01 -1.108225000000000016e+00 -3.737500000000000000e+01 -1.108230000000000048e+00 -3.740625000000000000e+01 -1.108235000000000081e+00 -3.737500000000000000e+01 -1.108240000000000114e+00 -3.737500000000000000e+01 -1.108245000000000147e+00 -3.737500000000000000e+01 -1.108250000000000179e+00 -3.740625000000000000e+01 -1.108254999999999990e+00 -3.740625000000000000e+01 -1.108260000000000023e+00 -3.737500000000000000e+01 -1.108265000000000056e+00 -3.740625000000000000e+01 -1.108270000000000088e+00 -3.740625000000000000e+01 -1.108275000000000121e+00 -3.740625000000000000e+01 -1.108280000000000154e+00 -3.734375000000000000e+01 -1.108285000000000187e+00 -3.734375000000000000e+01 -1.108289999999999997e+00 -3.734375000000000000e+01 -1.108295000000000030e+00 -3.737500000000000000e+01 -1.108300000000000063e+00 -3.740625000000000000e+01 -1.108305000000000096e+00 -3.737500000000000000e+01 -1.108310000000000128e+00 -3.734375000000000000e+01 -1.108315000000000161e+00 -3.731250000000000000e+01 -1.108320000000000194e+00 -3.734375000000000000e+01 -1.108325000000000005e+00 -3.731250000000000000e+01 -1.108330000000000037e+00 -3.734375000000000000e+01 -1.108335000000000070e+00 -3.731250000000000000e+01 -1.108340000000000103e+00 -3.734375000000000000e+01 -1.108345000000000136e+00 -3.728125381469726562e+01 -1.108350000000000168e+00 -3.734375000000000000e+01 -1.108355000000000201e+00 -3.737500000000000000e+01 -1.108360000000000012e+00 -3.734375000000000000e+01 -1.108365000000000045e+00 -3.728125381469726562e+01 -1.108370000000000077e+00 -3.731250000000000000e+01 -1.108375000000000110e+00 -3.734375000000000000e+01 -1.108380000000000143e+00 -3.737500000000000000e+01 -1.108385000000000176e+00 -3.734375000000000000e+01 -1.108389999999999986e+00 -3.728125381469726562e+01 -1.108395000000000019e+00 -3.737500000000000000e+01 -1.108400000000000052e+00 -3.731250000000000000e+01 -1.108405000000000085e+00 -3.725000000000000000e+01 -1.108410000000000117e+00 -3.731250000000000000e+01 -1.108415000000000150e+00 -3.725000000000000000e+01 -1.108420000000000183e+00 -3.731250000000000000e+01 -1.108424999999999994e+00 -3.725000000000000000e+01 -1.108430000000000026e+00 -3.728125381469726562e+01 -1.108435000000000059e+00 -3.728125381469726562e+01 -1.108440000000000092e+00 -3.731250000000000000e+01 -1.108445000000000125e+00 -3.725000000000000000e+01 -1.108450000000000157e+00 -3.725000000000000000e+01 -1.108455000000000190e+00 -3.728125381469726562e+01 -1.108460000000000001e+00 -3.728125381469726562e+01 -1.108465000000000034e+00 -3.728125381469726562e+01 -1.108470000000000066e+00 -3.728125381469726562e+01 -1.108475000000000099e+00 -3.728125381469726562e+01 -1.108480000000000132e+00 -3.728125381469726562e+01 -1.108485000000000165e+00 -3.715625000000000000e+01 -1.108490000000000197e+00 -3.725000000000000000e+01 -1.108495000000000008e+00 -3.721875000000000000e+01 -1.108500000000000041e+00 -3.718750000000000000e+01 -1.108505000000000074e+00 -3.728125381469726562e+01 -1.108510000000000106e+00 -3.721875000000000000e+01 -1.108515000000000139e+00 -3.728125381469726562e+01 -1.108520000000000172e+00 -3.721875000000000000e+01 -1.108524999999999983e+00 -3.728125381469726562e+01 -1.108530000000000015e+00 -3.721875000000000000e+01 -1.108535000000000048e+00 -3.728125381469726562e+01 -1.108540000000000081e+00 -3.728125381469726562e+01 -1.108545000000000114e+00 -3.728125381469726562e+01 -1.108550000000000146e+00 -3.721875000000000000e+01 -1.108555000000000179e+00 -3.721875000000000000e+01 -1.108559999999999990e+00 -3.718750000000000000e+01 -1.108565000000000023e+00 -3.728125381469726562e+01 -1.108570000000000055e+00 -3.712500381469726562e+01 -1.108575000000000088e+00 -3.715625000000000000e+01 -1.108580000000000121e+00 -3.721875000000000000e+01 -1.108585000000000154e+00 -3.721875000000000000e+01 -1.108590000000000186e+00 -3.718750000000000000e+01 -1.108594999999999997e+00 -3.718750000000000000e+01 -1.108600000000000030e+00 -3.721875000000000000e+01 -1.108605000000000063e+00 -3.718750000000000000e+01 -1.108610000000000095e+00 -3.718750000000000000e+01 -1.108615000000000128e+00 -3.718750000000000000e+01 -1.108620000000000161e+00 -3.721875000000000000e+01 -1.108625000000000194e+00 -3.721875000000000000e+01 -1.108630000000000004e+00 -3.721875000000000000e+01 -1.108635000000000037e+00 -3.718750000000000000e+01 -1.108640000000000070e+00 -3.728125381469726562e+01 -1.108645000000000103e+00 -3.718750000000000000e+01 -1.108650000000000135e+00 -3.718750000000000000e+01 -1.108655000000000168e+00 -3.718750000000000000e+01 -1.108660000000000201e+00 -3.718750000000000000e+01 -1.108665000000000012e+00 -3.718750000000000000e+01 -1.108670000000000044e+00 -3.725000000000000000e+01 -1.108675000000000077e+00 -3.728125381469726562e+01 -1.108680000000000110e+00 -3.725000000000000000e+01 -1.108685000000000143e+00 -3.718750000000000000e+01 -1.108690000000000175e+00 -3.721875000000000000e+01 -1.108694999999999986e+00 -3.721875000000000000e+01 -1.108700000000000019e+00 -3.715625000000000000e+01 -1.108705000000000052e+00 -3.721875000000000000e+01 -1.108710000000000084e+00 -3.718750000000000000e+01 -1.108715000000000117e+00 -3.721875000000000000e+01 -1.108720000000000150e+00 -3.715625000000000000e+01 -1.108725000000000183e+00 -3.715625000000000000e+01 -1.108729999999999993e+00 -3.715625000000000000e+01 -1.108735000000000026e+00 -3.718750000000000000e+01 -1.108740000000000059e+00 -3.712500381469726562e+01 -1.108745000000000092e+00 -3.718750000000000000e+01 -1.108750000000000124e+00 -3.718750000000000000e+01 -1.108755000000000157e+00 -3.721875000000000000e+01 -1.108760000000000190e+00 -3.721875000000000000e+01 -1.108765000000000001e+00 -3.718750000000000000e+01 -1.108770000000000033e+00 -3.715625000000000000e+01 -1.108775000000000066e+00 -3.721875000000000000e+01 -1.108780000000000099e+00 -3.728125381469726562e+01 -1.108785000000000132e+00 -3.721875000000000000e+01 -1.108790000000000164e+00 -3.718750000000000000e+01 -1.108795000000000197e+00 -3.721875000000000000e+01 -1.108800000000000008e+00 -3.712500381469726562e+01 -1.108805000000000041e+00 -3.715625000000000000e+01 -1.108810000000000073e+00 -3.718750000000000000e+01 -1.108815000000000106e+00 -3.718750000000000000e+01 -1.108820000000000139e+00 -3.718750000000000000e+01 -1.108825000000000172e+00 -3.718750000000000000e+01 -1.108829999999999982e+00 -3.718750000000000000e+01 -1.108835000000000015e+00 -3.715625000000000000e+01 -1.108840000000000048e+00 -3.721875000000000000e+01 -1.108845000000000081e+00 -3.715625000000000000e+01 -1.108850000000000113e+00 -3.718750000000000000e+01 -1.108855000000000146e+00 -3.718750000000000000e+01 -1.108860000000000179e+00 -3.712500381469726562e+01 -1.108864999999999990e+00 -3.718750000000000000e+01 -1.108870000000000022e+00 -3.715625000000000000e+01 -1.108875000000000055e+00 -3.715625000000000000e+01 -1.108880000000000088e+00 -3.715625000000000000e+01 -1.108885000000000121e+00 -3.715625000000000000e+01 -1.108890000000000153e+00 -3.709375000000000000e+01 -1.108895000000000186e+00 -3.718750000000000000e+01 -1.108899999999999997e+00 -3.718750000000000000e+01 -1.108905000000000030e+00 -3.712500381469726562e+01 -1.108910000000000062e+00 -3.721875000000000000e+01 -1.108915000000000095e+00 -3.712500381469726562e+01 -1.108920000000000128e+00 -3.709375000000000000e+01 -1.108925000000000161e+00 -3.718750000000000000e+01 -1.108930000000000193e+00 -3.715625000000000000e+01 -1.108935000000000004e+00 -3.706250000000000000e+01 -1.108940000000000037e+00 -3.715625000000000000e+01 -1.108945000000000070e+00 -3.709375000000000000e+01 -1.108950000000000102e+00 -3.706250000000000000e+01 -1.108955000000000135e+00 -3.709375000000000000e+01 -1.108960000000000168e+00 -3.709375000000000000e+01 -1.108965000000000201e+00 -3.709375000000000000e+01 -1.108970000000000011e+00 -3.706250000000000000e+01 -1.108975000000000044e+00 -3.706250000000000000e+01 -1.108980000000000077e+00 -3.703125381469726562e+01 -1.108985000000000110e+00 -3.706250000000000000e+01 -1.108990000000000142e+00 -3.703125381469726562e+01 -1.108995000000000175e+00 -3.709375000000000000e+01 -1.108999999999999986e+00 -3.709375000000000000e+01 -1.109005000000000019e+00 -3.706250000000000000e+01 -1.109010000000000051e+00 -3.700000000000000000e+01 -1.109015000000000084e+00 -3.706250000000000000e+01 -1.109020000000000117e+00 -3.700000000000000000e+01 -1.109025000000000150e+00 -3.706250000000000000e+01 -1.109030000000000182e+00 -3.703125381469726562e+01 -1.109034999999999993e+00 -3.700000000000000000e+01 -1.109040000000000026e+00 -3.703125381469726562e+01 -1.109045000000000059e+00 -3.703125381469726562e+01 -1.109050000000000091e+00 -3.700000000000000000e+01 -1.109055000000000124e+00 -3.700000000000000000e+01 -1.109060000000000157e+00 -3.703125381469726562e+01 -1.109065000000000190e+00 -3.706250000000000000e+01 -1.109070000000000000e+00 -3.703125381469726562e+01 -1.109075000000000033e+00 -3.703125381469726562e+01 -1.109080000000000066e+00 -3.703125381469726562e+01 -1.109085000000000099e+00 -3.703125381469726562e+01 -1.109090000000000131e+00 -3.703125381469726562e+01 -1.109095000000000164e+00 -3.696875000000000000e+01 -1.109100000000000197e+00 -3.700000000000000000e+01 -1.109105000000000008e+00 -3.703125381469726562e+01 -1.109110000000000040e+00 -3.700000000000000000e+01 -1.109115000000000073e+00 -3.703125381469726562e+01 -1.109120000000000106e+00 -3.703125381469726562e+01 -1.109125000000000139e+00 -3.703125381469726562e+01 -1.109130000000000171e+00 -3.703125381469726562e+01 -1.109134999999999982e+00 -3.703125381469726562e+01 -1.109140000000000015e+00 -3.706250000000000000e+01 -1.109145000000000048e+00 -3.700000000000000000e+01 -1.109150000000000080e+00 -3.700000000000000000e+01 -1.109155000000000113e+00 -3.700000000000000000e+01 -1.109160000000000146e+00 -3.700000000000000000e+01 -1.109165000000000179e+00 -3.703125381469726562e+01 -1.109169999999999989e+00 -3.700000000000000000e+01 -1.109175000000000022e+00 -3.706250000000000000e+01 -1.109180000000000055e+00 -3.703125381469726562e+01 -1.109185000000000088e+00 -3.703125381469726562e+01 -1.109190000000000120e+00 -3.700000000000000000e+01 -1.109195000000000153e+00 -3.703125381469726562e+01 -1.109200000000000186e+00 -3.700000000000000000e+01 -1.109204999999999997e+00 -3.700000000000000000e+01 -1.109210000000000029e+00 -3.700000000000000000e+01 -1.109215000000000062e+00 -3.700000000000000000e+01 -1.109220000000000095e+00 -3.696875000000000000e+01 -1.109225000000000128e+00 -3.700000000000000000e+01 -1.109230000000000160e+00 -3.700000000000000000e+01 -1.109235000000000193e+00 -3.696875000000000000e+01 -1.109240000000000004e+00 -3.700000000000000000e+01 -1.109245000000000037e+00 -3.700000000000000000e+01 -1.109250000000000069e+00 -3.700000000000000000e+01 -1.109255000000000102e+00 -3.700000000000000000e+01 -1.109260000000000135e+00 -3.703125381469726562e+01 -1.109265000000000168e+00 -3.700000000000000000e+01 -1.109270000000000200e+00 -3.700000000000000000e+01 -1.109275000000000011e+00 -3.703125381469726562e+01 -1.109280000000000044e+00 -3.700000000000000000e+01 -1.109285000000000077e+00 -3.700000000000000000e+01 -1.109290000000000109e+00 -3.703125381469726562e+01 -1.109295000000000142e+00 -3.703125381469726562e+01 -1.109300000000000175e+00 -3.700000000000000000e+01 -1.109304999999999986e+00 -3.700000000000000000e+01 -1.109310000000000018e+00 -3.700000000000000000e+01 -1.109315000000000051e+00 -3.700000000000000000e+01 -1.109320000000000084e+00 -3.700000000000000000e+01 -1.109325000000000117e+00 -3.700000000000000000e+01 -1.109330000000000149e+00 -3.700000000000000000e+01 -1.109335000000000182e+00 -3.700000000000000000e+01 -1.109339999999999993e+00 -3.700000000000000000e+01 -1.109345000000000026e+00 -3.700000000000000000e+01 -1.109350000000000058e+00 -3.696875000000000000e+01 -1.109355000000000091e+00 -3.703125381469726562e+01 -1.109360000000000124e+00 -3.700000000000000000e+01 -1.109365000000000157e+00 -3.703125381469726562e+01 -1.109370000000000189e+00 -3.696875000000000000e+01 -1.109375000000000000e+00 -3.700000000000000000e+01 -1.109380000000000033e+00 -3.700000000000000000e+01 -1.109385000000000066e+00 -3.700000000000000000e+01 -1.109390000000000098e+00 -3.700000000000000000e+01 -1.109395000000000131e+00 -3.700000000000000000e+01 -1.109400000000000164e+00 -3.700000000000000000e+01 -1.109405000000000197e+00 -3.696875000000000000e+01 -1.109410000000000007e+00 -3.693750000000000000e+01 -1.109415000000000040e+00 -3.696875000000000000e+01 -1.109420000000000073e+00 -3.696875000000000000e+01 -1.109425000000000106e+00 -3.693750000000000000e+01 -1.109430000000000138e+00 -3.696875000000000000e+01 -1.109435000000000171e+00 -3.696875000000000000e+01 -1.109439999999999982e+00 -3.700000000000000000e+01 -1.109445000000000014e+00 -3.696875000000000000e+01 -1.109450000000000047e+00 -3.696875000000000000e+01 -1.109455000000000080e+00 -3.696875000000000000e+01 -1.109460000000000113e+00 -3.693750000000000000e+01 -1.109465000000000146e+00 -3.696875000000000000e+01 -1.109470000000000178e+00 -3.696875000000000000e+01 -1.109474999999999989e+00 -3.693750000000000000e+01 -1.109480000000000022e+00 -3.700000000000000000e+01 -1.109485000000000054e+00 -3.696875000000000000e+01 -1.109490000000000087e+00 -3.693750000000000000e+01 -1.109495000000000120e+00 -3.696875000000000000e+01 -1.109500000000000153e+00 -3.696875000000000000e+01 -1.109505000000000186e+00 -3.690625000000000000e+01 -1.109509999999999996e+00 -3.696875000000000000e+01 -1.109515000000000029e+00 -3.700000000000000000e+01 -1.109520000000000062e+00 -3.700000000000000000e+01 -1.109525000000000095e+00 -3.696875000000000000e+01 -1.109530000000000127e+00 -3.696875000000000000e+01 -1.109535000000000160e+00 -3.693750000000000000e+01 -1.109540000000000193e+00 -3.693750000000000000e+01 -1.109545000000000003e+00 -3.690625000000000000e+01 -1.109550000000000036e+00 -3.696875000000000000e+01 -1.109555000000000069e+00 -3.693750000000000000e+01 -1.109560000000000102e+00 -3.700000000000000000e+01 -1.109565000000000135e+00 -3.696875000000000000e+01 -1.109570000000000167e+00 -3.700000000000000000e+01 -1.109575000000000200e+00 -3.696875000000000000e+01 -1.109580000000000011e+00 -3.696875000000000000e+01 -1.109585000000000043e+00 -3.700000000000000000e+01 -1.109590000000000076e+00 -3.696875000000000000e+01 -1.109595000000000109e+00 -3.696875000000000000e+01 -1.109600000000000142e+00 -3.690625000000000000e+01 -1.109605000000000175e+00 -3.693750000000000000e+01 -1.109609999999999985e+00 -3.690625000000000000e+01 -1.109615000000000018e+00 -3.690625000000000000e+01 -1.109620000000000051e+00 -3.696875000000000000e+01 -1.109625000000000083e+00 -3.690625000000000000e+01 -1.109630000000000116e+00 -3.693750000000000000e+01 -1.109635000000000149e+00 -3.690625000000000000e+01 -1.109640000000000182e+00 -3.684375000000000000e+01 -1.109644999999999992e+00 -3.696875000000000000e+01 -1.109650000000000025e+00 -3.693750000000000000e+01 -1.109655000000000058e+00 -3.684375000000000000e+01 -1.109660000000000091e+00 -3.690625000000000000e+01 -1.109665000000000123e+00 -3.687500381469726562e+01 -1.109670000000000156e+00 -3.690625000000000000e+01 -1.109675000000000189e+00 -3.690625000000000000e+01 -1.109680000000000000e+00 -3.687500381469726562e+01 -1.109685000000000032e+00 -3.678125000000000000e+01 -1.109690000000000065e+00 -3.690625000000000000e+01 -1.109695000000000098e+00 -3.687500381469726562e+01 -1.109700000000000131e+00 -3.687500381469726562e+01 -1.109705000000000163e+00 -3.690625000000000000e+01 -1.109710000000000196e+00 -3.693750000000000000e+01 -1.109715000000000007e+00 -3.684375000000000000e+01 -1.109720000000000040e+00 -3.687500381469726562e+01 -1.109725000000000072e+00 -3.687500381469726562e+01 -1.109730000000000105e+00 -3.684375000000000000e+01 -1.109735000000000138e+00 -3.684375000000000000e+01 -1.109740000000000171e+00 -3.687500381469726562e+01 -1.109744999999999981e+00 -3.687500381469726562e+01 -1.109750000000000014e+00 -3.687500381469726562e+01 -1.109755000000000047e+00 -3.684375000000000000e+01 -1.109760000000000080e+00 -3.684375000000000000e+01 -1.109765000000000112e+00 -3.684375000000000000e+01 -1.109770000000000145e+00 -3.684375000000000000e+01 -1.109775000000000178e+00 -3.684375000000000000e+01 -1.109779999999999989e+00 -3.684375000000000000e+01 -1.109785000000000021e+00 -3.684375000000000000e+01 -1.109790000000000054e+00 -3.684375000000000000e+01 -1.109795000000000087e+00 -3.684375000000000000e+01 -1.109800000000000120e+00 -3.684375000000000000e+01 -1.109805000000000152e+00 -3.684375000000000000e+01 -1.109810000000000185e+00 -3.681250000000000000e+01 -1.109814999999999996e+00 -3.684375000000000000e+01 -1.109820000000000029e+00 -3.690625000000000000e+01 -1.109825000000000061e+00 -3.684375000000000000e+01 -1.109830000000000094e+00 -3.690625000000000000e+01 -1.109835000000000127e+00 -3.684375000000000000e+01 -1.109840000000000160e+00 -3.684375000000000000e+01 -1.109845000000000192e+00 -3.684375000000000000e+01 -1.109850000000000003e+00 -3.684375000000000000e+01 -1.109855000000000036e+00 -3.687500381469726562e+01 -1.109860000000000069e+00 -3.681250000000000000e+01 -1.109865000000000101e+00 -3.684375000000000000e+01 -1.109870000000000134e+00 -3.684375000000000000e+01 -1.109875000000000167e+00 -3.684375000000000000e+01 -1.109880000000000200e+00 -3.687500381469726562e+01 -1.109885000000000010e+00 -3.684375000000000000e+01 -1.109890000000000043e+00 -3.678125000000000000e+01 -1.109895000000000076e+00 -3.681250000000000000e+01 -1.109900000000000109e+00 -3.681250000000000000e+01 -1.109905000000000141e+00 -3.687500381469726562e+01 -1.109910000000000174e+00 -3.681250000000000000e+01 -1.109914999999999985e+00 -3.684375000000000000e+01 -1.109920000000000018e+00 -3.684375000000000000e+01 -1.109925000000000050e+00 -3.681250000000000000e+01 -1.109930000000000083e+00 -3.681250000000000000e+01 -1.109935000000000116e+00 -3.687500381469726562e+01 -1.109940000000000149e+00 -3.678125000000000000e+01 -1.109945000000000181e+00 -3.678125000000000000e+01 -1.109949999999999992e+00 -3.684375000000000000e+01 -1.109955000000000025e+00 -3.681250000000000000e+01 -1.109960000000000058e+00 -3.678125000000000000e+01 -1.109965000000000090e+00 -3.684375000000000000e+01 -1.109970000000000123e+00 -3.678125000000000000e+01 -1.109975000000000156e+00 -3.684375000000000000e+01 -1.109980000000000189e+00 -3.681250000000000000e+01 -1.109984999999999999e+00 -3.681250000000000000e+01 -1.109990000000000032e+00 -3.678125000000000000e+01 -1.109995000000000065e+00 -3.681250000000000000e+01 -1.110000000000000098e+00 -3.681250000000000000e+01 -1.110005000000000130e+00 -3.684375000000000000e+01 -1.110010000000000163e+00 -3.684375000000000000e+01 -1.110015000000000196e+00 -3.675000000000000000e+01 -1.110020000000000007e+00 -3.678125000000000000e+01 -1.110025000000000039e+00 -3.681250000000000000e+01 -1.110030000000000072e+00 -3.668750000000000000e+01 -1.110035000000000105e+00 -3.675000000000000000e+01 -1.110040000000000138e+00 -3.684375000000000000e+01 -1.110045000000000170e+00 -3.678125000000000000e+01 -1.110049999999999981e+00 -3.671875381469726562e+01 -1.110055000000000014e+00 -3.681250000000000000e+01 -1.110060000000000047e+00 -3.678125000000000000e+01 -1.110065000000000079e+00 -3.681250000000000000e+01 -1.110070000000000112e+00 -3.684375000000000000e+01 -1.110075000000000145e+00 -3.681250000000000000e+01 -1.110080000000000178e+00 -3.681250000000000000e+01 -1.110084999999999988e+00 -3.678125000000000000e+01 -1.110090000000000021e+00 -3.678125000000000000e+01 -1.110095000000000054e+00 -3.678125000000000000e+01 -1.110100000000000087e+00 -3.675000000000000000e+01 -1.110105000000000119e+00 -3.678125000000000000e+01 -1.110110000000000152e+00 -3.678125000000000000e+01 -1.110115000000000185e+00 -3.681250000000000000e+01 -1.110119999999999996e+00 -3.678125000000000000e+01 -1.110125000000000028e+00 -3.678125000000000000e+01 -1.110130000000000061e+00 -3.681250000000000000e+01 -1.110135000000000094e+00 -3.681250000000000000e+01 -1.110140000000000127e+00 -3.675000000000000000e+01 -1.110145000000000159e+00 -3.681250000000000000e+01 -1.110150000000000192e+00 -3.678125000000000000e+01 -1.110155000000000003e+00 -3.684375000000000000e+01 -1.110160000000000036e+00 -3.678125000000000000e+01 -1.110165000000000068e+00 -3.678125000000000000e+01 -1.110170000000000101e+00 -3.678125000000000000e+01 -1.110175000000000134e+00 -3.678125000000000000e+01 -1.110180000000000167e+00 -3.681250000000000000e+01 -1.110185000000000199e+00 -3.684375000000000000e+01 -1.110190000000000010e+00 -3.678125000000000000e+01 -1.110195000000000043e+00 -3.684375000000000000e+01 -1.110200000000000076e+00 -3.675000000000000000e+01 -1.110205000000000108e+00 -3.684375000000000000e+01 -1.110210000000000141e+00 -3.678125000000000000e+01 -1.110215000000000174e+00 -3.678125000000000000e+01 -1.110219999999999985e+00 -3.678125000000000000e+01 -1.110225000000000017e+00 -3.675000000000000000e+01 -1.110230000000000050e+00 -3.678125000000000000e+01 -1.110235000000000083e+00 -3.675000000000000000e+01 -1.110240000000000116e+00 -3.678125000000000000e+01 -1.110245000000000148e+00 -3.678125000000000000e+01 -1.110250000000000181e+00 -3.668750000000000000e+01 -1.110254999999999992e+00 -3.675000000000000000e+01 -1.110260000000000025e+00 -3.678125000000000000e+01 -1.110265000000000057e+00 -3.675000000000000000e+01 -1.110270000000000090e+00 -3.678125000000000000e+01 -1.110275000000000123e+00 -3.675000000000000000e+01 -1.110280000000000156e+00 -3.678125000000000000e+01 -1.110285000000000188e+00 -3.678125000000000000e+01 -1.110289999999999999e+00 -3.671875381469726562e+01 -1.110295000000000032e+00 -3.671875381469726562e+01 -1.110300000000000065e+00 -3.681250000000000000e+01 -1.110305000000000097e+00 -3.675000000000000000e+01 -1.110310000000000130e+00 -3.671875381469726562e+01 -1.110315000000000163e+00 -3.675000000000000000e+01 -1.110320000000000196e+00 -3.671875381469726562e+01 -1.110325000000000006e+00 -3.675000000000000000e+01 -1.110330000000000039e+00 -3.678125000000000000e+01 -1.110335000000000072e+00 -3.675000000000000000e+01 -1.110340000000000105e+00 -3.675000000000000000e+01 -1.110345000000000137e+00 -3.671875381469726562e+01 -1.110350000000000170e+00 -3.671875381469726562e+01 -1.110354999999999981e+00 -3.675000000000000000e+01 -1.110360000000000014e+00 -3.668750000000000000e+01 -1.110365000000000046e+00 -3.678125000000000000e+01 -1.110370000000000079e+00 -3.678125000000000000e+01 -1.110375000000000112e+00 -3.668750000000000000e+01 -1.110380000000000145e+00 -3.668750000000000000e+01 -1.110385000000000177e+00 -3.675000000000000000e+01 -1.110389999999999988e+00 -3.678125000000000000e+01 -1.110395000000000021e+00 -3.675000000000000000e+01 -1.110400000000000054e+00 -3.668750000000000000e+01 -1.110405000000000086e+00 -3.671875381469726562e+01 -1.110410000000000119e+00 -3.671875381469726562e+01 -1.110415000000000152e+00 -3.671875381469726562e+01 -1.110420000000000185e+00 -3.668750000000000000e+01 -1.110424999999999995e+00 -3.668750000000000000e+01 -1.110430000000000028e+00 -3.671875381469726562e+01 -1.110435000000000061e+00 -3.678125000000000000e+01 -1.110440000000000094e+00 -3.675000000000000000e+01 -1.110445000000000126e+00 -3.671875381469726562e+01 -1.110450000000000159e+00 -3.671875381469726562e+01 -1.110455000000000192e+00 -3.668750000000000000e+01 -1.110460000000000003e+00 -3.668750000000000000e+01 -1.110465000000000035e+00 -3.678125000000000000e+01 -1.110470000000000068e+00 -3.671875381469726562e+01 -1.110475000000000101e+00 -3.675000000000000000e+01 -1.110480000000000134e+00 -3.668750000000000000e+01 -1.110485000000000166e+00 -3.675000000000000000e+01 -1.110490000000000199e+00 -3.671875381469726562e+01 -1.110495000000000010e+00 -3.671875381469726562e+01 -1.110500000000000043e+00 -3.668750000000000000e+01 -1.110505000000000075e+00 -3.668750000000000000e+01 -1.110510000000000108e+00 -3.668750000000000000e+01 -1.110515000000000141e+00 -3.671875381469726562e+01 -1.110520000000000174e+00 -3.665625000000000000e+01 -1.110524999999999984e+00 -3.665625000000000000e+01 -1.110530000000000017e+00 -3.668750000000000000e+01 -1.110535000000000050e+00 -3.671875381469726562e+01 -1.110540000000000083e+00 -3.668750000000000000e+01 -1.110545000000000115e+00 -3.665625000000000000e+01 -1.110550000000000148e+00 -3.671875381469726562e+01 -1.110555000000000181e+00 -3.675000000000000000e+01 -1.110559999999999992e+00 -3.659375000000000000e+01 -1.110565000000000024e+00 -3.662500000000000000e+01 -1.110570000000000057e+00 -3.665625000000000000e+01 -1.110575000000000090e+00 -3.665625000000000000e+01 -1.110580000000000123e+00 -3.662500000000000000e+01 -1.110585000000000155e+00 -3.665625000000000000e+01 -1.110590000000000188e+00 -3.662500000000000000e+01 -1.110594999999999999e+00 -3.662500000000000000e+01 -1.110600000000000032e+00 -3.668750000000000000e+01 -1.110605000000000064e+00 -3.665625000000000000e+01 -1.110610000000000097e+00 -3.665625000000000000e+01 -1.110615000000000130e+00 -3.665625000000000000e+01 -1.110620000000000163e+00 -3.665625000000000000e+01 -1.110625000000000195e+00 -3.665625000000000000e+01 -1.110630000000000006e+00 -3.665625000000000000e+01 -1.110635000000000039e+00 -3.665625000000000000e+01 -1.110640000000000072e+00 -3.668750000000000000e+01 -1.110645000000000104e+00 -3.668750000000000000e+01 -1.110650000000000137e+00 -3.662500000000000000e+01 -1.110655000000000170e+00 -3.659375000000000000e+01 -1.110659999999999981e+00 -3.665625000000000000e+01 -1.110665000000000013e+00 -3.656250381469726562e+01 -1.110670000000000046e+00 -3.659375000000000000e+01 -1.110675000000000079e+00 -3.659375000000000000e+01 -1.110680000000000112e+00 -3.662500000000000000e+01 -1.110685000000000144e+00 -3.659375000000000000e+01 -1.110690000000000177e+00 -3.659375000000000000e+01 -1.110694999999999988e+00 -3.659375000000000000e+01 -1.110700000000000021e+00 -3.659375000000000000e+01 -1.110705000000000053e+00 -3.665625000000000000e+01 -1.110710000000000086e+00 -3.662500000000000000e+01 -1.110715000000000119e+00 -3.659375000000000000e+01 -1.110720000000000152e+00 -3.653125000000000000e+01 -1.110725000000000184e+00 -3.659375000000000000e+01 -1.110729999999999995e+00 -3.656250381469726562e+01 -1.110735000000000028e+00 -3.656250381469726562e+01 -1.110740000000000061e+00 -3.659375000000000000e+01 -1.110745000000000093e+00 -3.659375000000000000e+01 -1.110750000000000126e+00 -3.656250381469726562e+01 -1.110755000000000159e+00 -3.662500000000000000e+01 -1.110760000000000192e+00 -3.659375000000000000e+01 -1.110765000000000002e+00 -3.659375000000000000e+01 -1.110770000000000035e+00 -3.665625000000000000e+01 -1.110775000000000068e+00 -3.662500000000000000e+01 -1.110780000000000101e+00 -3.665625000000000000e+01 -1.110785000000000133e+00 -3.665625000000000000e+01 -1.110790000000000166e+00 -3.662500000000000000e+01 -1.110795000000000199e+00 -3.659375000000000000e+01 -1.110800000000000010e+00 -3.653125000000000000e+01 -1.110805000000000042e+00 -3.659375000000000000e+01 -1.110810000000000075e+00 -3.653125000000000000e+01 -1.110815000000000108e+00 -3.659375000000000000e+01 -1.110820000000000141e+00 -3.653125000000000000e+01 -1.110825000000000173e+00 -3.653125000000000000e+01 -1.110829999999999984e+00 -3.659375000000000000e+01 -1.110835000000000017e+00 -3.656250381469726562e+01 -1.110840000000000050e+00 -3.653125000000000000e+01 -1.110845000000000082e+00 -3.659375000000000000e+01 -1.110850000000000115e+00 -3.656250381469726562e+01 -1.110855000000000148e+00 -3.653125000000000000e+01 -1.110860000000000181e+00 -3.656250381469726562e+01 -1.110864999999999991e+00 -3.653125000000000000e+01 -1.110870000000000024e+00 -3.653125000000000000e+01 -1.110875000000000057e+00 -3.653125000000000000e+01 -1.110880000000000090e+00 -3.662500000000000000e+01 -1.110885000000000122e+00 -3.650000000000000000e+01 -1.110890000000000155e+00 -3.659375000000000000e+01 -1.110895000000000188e+00 -3.656250381469726562e+01 -1.110899999999999999e+00 -3.653125000000000000e+01 -1.110905000000000031e+00 -3.650000000000000000e+01 -1.110910000000000064e+00 -3.653125000000000000e+01 -1.110915000000000097e+00 -3.653125000000000000e+01 -1.110920000000000130e+00 -3.650000000000000000e+01 -1.110925000000000162e+00 -3.656250381469726562e+01 -1.110930000000000195e+00 -3.653125000000000000e+01 -1.110935000000000006e+00 -3.656250381469726562e+01 -1.110940000000000039e+00 -3.653125000000000000e+01 -1.110945000000000071e+00 -3.653125000000000000e+01 -1.110950000000000104e+00 -3.656250381469726562e+01 -1.110955000000000137e+00 -3.653125000000000000e+01 -1.110960000000000170e+00 -3.653125000000000000e+01 -1.110964999999999980e+00 -3.659375000000000000e+01 -1.110970000000000013e+00 -3.650000000000000000e+01 -1.110975000000000046e+00 -3.653125000000000000e+01 -1.110980000000000079e+00 -3.650000000000000000e+01 -1.110985000000000111e+00 -3.650000000000000000e+01 -1.110990000000000144e+00 -3.646875000000000000e+01 -1.110995000000000177e+00 -3.653125000000000000e+01 -1.110999999999999988e+00 -3.650000000000000000e+01 -1.111005000000000020e+00 -3.650000000000000000e+01 -1.111010000000000053e+00 -3.653125000000000000e+01 -1.111015000000000086e+00 -3.650000000000000000e+01 -1.111020000000000119e+00 -3.653125000000000000e+01 -1.111025000000000151e+00 -3.650000000000000000e+01 -1.111030000000000184e+00 -3.646875000000000000e+01 -1.111034999999999995e+00 -3.653125000000000000e+01 -1.111040000000000028e+00 -3.650000000000000000e+01 -1.111045000000000060e+00 -3.646875000000000000e+01 -1.111050000000000093e+00 -3.646875000000000000e+01 -1.111055000000000126e+00 -3.646875000000000000e+01 -1.111060000000000159e+00 -3.650000000000000000e+01 -1.111065000000000191e+00 -3.643750000000000000e+01 -1.111070000000000002e+00 -3.653125000000000000e+01 -1.111075000000000035e+00 -3.646875000000000000e+01 -1.111080000000000068e+00 -3.650000000000000000e+01 -1.111085000000000100e+00 -3.650000000000000000e+01 -1.111090000000000133e+00 -3.650000000000000000e+01 -1.111095000000000166e+00 -3.650000000000000000e+01 -1.111100000000000199e+00 -3.650000000000000000e+01 -1.111105000000000009e+00 -3.650000000000000000e+01 -1.111110000000000042e+00 -3.646875000000000000e+01 -1.111115000000000075e+00 -3.650000000000000000e+01 -1.111120000000000108e+00 -3.646875000000000000e+01 -1.111125000000000140e+00 -3.650000000000000000e+01 -1.111130000000000173e+00 -3.650000000000000000e+01 -1.111134999999999984e+00 -3.646875000000000000e+01 -1.111140000000000017e+00 -3.640625381469726562e+01 -1.111145000000000049e+00 -3.643750000000000000e+01 -1.111150000000000082e+00 -3.640625381469726562e+01 -1.111155000000000115e+00 -3.637500000000000000e+01 -1.111160000000000148e+00 -3.646875000000000000e+01 -1.111165000000000180e+00 -3.646875000000000000e+01 -1.111169999999999991e+00 -3.643750000000000000e+01 -1.111175000000000024e+00 -3.650000000000000000e+01 -1.111180000000000057e+00 -3.643750000000000000e+01 -1.111185000000000089e+00 -3.646875000000000000e+01 -1.111190000000000122e+00 -3.646875000000000000e+01 -1.111195000000000155e+00 -3.646875000000000000e+01 -1.111200000000000188e+00 -3.650000000000000000e+01 -1.111204999999999998e+00 -3.646875000000000000e+01 -1.111210000000000031e+00 -3.650000000000000000e+01 -1.111215000000000064e+00 -3.650000000000000000e+01 -1.111220000000000097e+00 -3.646875000000000000e+01 -1.111225000000000129e+00 -3.646875000000000000e+01 -1.111230000000000162e+00 -3.646875000000000000e+01 -1.111235000000000195e+00 -3.643750000000000000e+01 -1.111240000000000006e+00 -3.643750000000000000e+01 -1.111245000000000038e+00 -3.640625381469726562e+01 -1.111250000000000071e+00 -3.640625381469726562e+01 -1.111255000000000104e+00 -3.634375000000000000e+01 -1.111260000000000137e+00 -3.637500000000000000e+01 -1.111265000000000169e+00 -3.637500000000000000e+01 -1.111269999999999980e+00 -3.640625381469726562e+01 -1.111275000000000013e+00 -3.637500000000000000e+01 -1.111280000000000046e+00 -3.637500000000000000e+01 -1.111285000000000078e+00 -3.637500000000000000e+01 -1.111290000000000111e+00 -3.637500000000000000e+01 -1.111295000000000144e+00 -3.640625381469726562e+01 -1.111300000000000177e+00 -3.640625381469726562e+01 -1.111304999999999987e+00 -3.640625381469726562e+01 -1.111310000000000020e+00 -3.643750000000000000e+01 -1.111315000000000053e+00 -3.634375000000000000e+01 -1.111320000000000086e+00 -3.646875000000000000e+01 -1.111325000000000118e+00 -3.643750000000000000e+01 -1.111330000000000151e+00 -3.634375000000000000e+01 -1.111335000000000184e+00 -3.640625381469726562e+01 -1.111339999999999995e+00 -3.634375000000000000e+01 -1.111345000000000027e+00 -3.640625381469726562e+01 -1.111350000000000060e+00 -3.631250000000000000e+01 -1.111355000000000093e+00 -3.640625381469726562e+01 -1.111360000000000126e+00 -3.637500000000000000e+01 -1.111365000000000158e+00 -3.640625381469726562e+01 -1.111370000000000191e+00 -3.637500000000000000e+01 -1.111375000000000002e+00 -3.640625381469726562e+01 -1.111380000000000035e+00 -3.637500000000000000e+01 -1.111385000000000067e+00 -3.631250000000000000e+01 -1.111390000000000100e+00 -3.634375000000000000e+01 -1.111395000000000133e+00 -3.628125000000000000e+01 -1.111400000000000166e+00 -3.631250000000000000e+01 -1.111405000000000198e+00 -3.631250000000000000e+01 -1.111410000000000009e+00 -3.628125000000000000e+01 -1.111415000000000042e+00 -3.625000000000000000e+01 -1.111420000000000075e+00 -3.631250000000000000e+01 -1.111425000000000107e+00 -3.631250000000000000e+01 -1.111430000000000140e+00 -3.634375000000000000e+01 -1.111435000000000173e+00 -3.637500000000000000e+01 -1.111439999999999984e+00 -3.631250000000000000e+01 -1.111445000000000016e+00 -3.634375000000000000e+01 -1.111450000000000049e+00 -3.628125000000000000e+01 -1.111455000000000082e+00 -3.625000000000000000e+01 -1.111460000000000115e+00 -3.628125000000000000e+01 -1.111465000000000147e+00 -3.618750000000000000e+01 -1.111470000000000180e+00 -3.625000000000000000e+01 -1.111474999999999991e+00 -3.615625381469726562e+01 -1.111480000000000024e+00 -3.625000000000000000e+01 -1.111485000000000056e+00 -3.621875000000000000e+01 -1.111490000000000089e+00 -3.625000000000000000e+01 -1.111495000000000122e+00 -3.618750000000000000e+01 -1.111500000000000155e+00 -3.618750000000000000e+01 -1.111505000000000187e+00 -3.618750000000000000e+01 -1.111509999999999998e+00 -3.618750000000000000e+01 -1.111515000000000031e+00 -3.609375000000000000e+01 -1.111520000000000064e+00 -3.621875000000000000e+01 -1.111525000000000096e+00 -3.615625381469726562e+01 -1.111530000000000129e+00 -3.621875000000000000e+01 -1.111535000000000162e+00 -3.621875000000000000e+01 -1.111540000000000195e+00 -3.618750000000000000e+01 -1.111545000000000005e+00 -3.618750000000000000e+01 -1.111550000000000038e+00 -3.621875000000000000e+01 -1.111555000000000071e+00 -3.615625381469726562e+01 -1.111560000000000104e+00 -3.621875000000000000e+01 -1.111565000000000136e+00 -3.621875000000000000e+01 -1.111570000000000169e+00 -3.628125000000000000e+01 -1.111575000000000202e+00 -3.615625381469726562e+01 -1.111580000000000013e+00 -3.615625381469726562e+01 -1.111585000000000045e+00 -3.621875000000000000e+01 -1.111590000000000078e+00 -3.621875000000000000e+01 -1.111595000000000111e+00 -3.621875000000000000e+01 -1.111600000000000144e+00 -3.618750000000000000e+01 -1.111605000000000176e+00 -3.618750000000000000e+01 -1.111609999999999987e+00 -3.618750000000000000e+01 -1.111615000000000020e+00 -3.625000000000000000e+01 -1.111620000000000053e+00 -3.615625381469726562e+01 -1.111625000000000085e+00 -3.618750000000000000e+01 -1.111630000000000118e+00 -3.615625381469726562e+01 -1.111635000000000151e+00 -3.621875000000000000e+01 -1.111640000000000184e+00 -3.621875000000000000e+01 -1.111644999999999994e+00 -3.615625381469726562e+01 -1.111650000000000027e+00 -3.618750000000000000e+01 -1.111655000000000060e+00 -3.615625381469726562e+01 -1.111660000000000093e+00 -3.618750000000000000e+01 -1.111665000000000125e+00 -3.615625381469726562e+01 -1.111670000000000158e+00 -3.618750000000000000e+01 -1.111675000000000191e+00 -3.618750000000000000e+01 -1.111680000000000001e+00 -3.621875000000000000e+01 -1.111685000000000034e+00 -3.615625381469726562e+01 -1.111690000000000067e+00 -3.618750000000000000e+01 -1.111695000000000100e+00 -3.615625381469726562e+01 -1.111700000000000133e+00 -3.615625381469726562e+01 -1.111705000000000165e+00 -3.621875000000000000e+01 -1.111710000000000198e+00 -3.615625381469726562e+01 -1.111715000000000009e+00 -3.609375000000000000e+01 -1.111720000000000041e+00 -3.615625381469726562e+01 -1.111725000000000074e+00 -3.615625381469726562e+01 -1.111730000000000107e+00 -3.615625381469726562e+01 -1.111735000000000140e+00 -3.621875000000000000e+01 -1.111740000000000173e+00 -3.615625381469726562e+01 -1.111744999999999983e+00 -3.621875000000000000e+01 -1.111750000000000016e+00 -3.615625381469726562e+01 -1.111755000000000049e+00 -3.615625381469726562e+01 -1.111760000000000081e+00 -3.625000000000000000e+01 -1.111765000000000114e+00 -3.618750000000000000e+01 -1.111770000000000147e+00 -3.621875000000000000e+01 -1.111775000000000180e+00 -3.615625381469726562e+01 -1.111779999999999990e+00 -3.615625381469726562e+01 -1.111785000000000023e+00 -3.618750000000000000e+01 -1.111790000000000056e+00 -3.618750000000000000e+01 -1.111795000000000089e+00 -3.615625381469726562e+01 -1.111800000000000122e+00 -3.628125000000000000e+01 -1.111805000000000154e+00 -3.618750000000000000e+01 -1.111810000000000187e+00 -3.612500000000000000e+01 -1.111814999999999998e+00 -3.615625381469726562e+01 -1.111820000000000030e+00 -3.615625381469726562e+01 -1.111825000000000063e+00 -3.609375000000000000e+01 -1.111830000000000096e+00 -3.615625381469726562e+01 -1.111835000000000129e+00 -3.618750000000000000e+01 -1.111840000000000162e+00 -3.612500000000000000e+01 -1.111845000000000194e+00 -3.606250000000000000e+01 -1.111850000000000005e+00 -3.618750000000000000e+01 -1.111855000000000038e+00 -3.618750000000000000e+01 -1.111860000000000070e+00 -3.615625381469726562e+01 -1.111865000000000103e+00 -3.609375000000000000e+01 -1.111870000000000136e+00 -3.615625381469726562e+01 -1.111875000000000169e+00 -3.612500000000000000e+01 -1.111880000000000202e+00 -3.615625381469726562e+01 -1.111885000000000012e+00 -3.612500000000000000e+01 -1.111890000000000045e+00 -3.615625381469726562e+01 -1.111895000000000078e+00 -3.609375000000000000e+01 -1.111900000000000110e+00 -3.609375000000000000e+01 -1.111905000000000143e+00 -3.612500000000000000e+01 -1.111910000000000176e+00 -3.612500000000000000e+01 -1.111914999999999987e+00 -3.612500000000000000e+01 -1.111920000000000019e+00 -3.606250000000000000e+01 -1.111925000000000052e+00 -3.609375000000000000e+01 -1.111930000000000085e+00 -3.606250000000000000e+01 -1.111935000000000118e+00 -3.609375000000000000e+01 -1.111940000000000150e+00 -3.609375000000000000e+01 -1.111945000000000183e+00 -3.603125000000000000e+01 -1.111949999999999994e+00 -3.609375000000000000e+01 -1.111955000000000027e+00 -3.603125000000000000e+01 -1.111960000000000059e+00 -3.603125000000000000e+01 -1.111965000000000092e+00 -3.596875000000000000e+01 -1.111970000000000125e+00 -3.603125000000000000e+01 -1.111975000000000158e+00 -3.603125000000000000e+01 -1.111980000000000190e+00 -3.609375000000000000e+01 -1.111985000000000001e+00 -3.603125000000000000e+01 -1.111990000000000034e+00 -3.603125000000000000e+01 -1.111995000000000067e+00 -3.603125000000000000e+01 -1.112000000000000099e+00 -3.593750000000000000e+01 -1.112005000000000132e+00 -3.603125000000000000e+01 -1.112010000000000165e+00 -3.603125000000000000e+01 -1.112015000000000198e+00 -3.593750000000000000e+01 -1.112020000000000008e+00 -3.603125000000000000e+01 -1.112025000000000041e+00 -3.593750000000000000e+01 -1.112030000000000074e+00 -3.596875000000000000e+01 -1.112035000000000107e+00 -3.596875000000000000e+01 -1.112040000000000139e+00 -3.596875000000000000e+01 -1.112045000000000172e+00 -3.603125000000000000e+01 -1.112049999999999983e+00 -3.596875000000000000e+01 -1.112055000000000016e+00 -3.596875000000000000e+01 -1.112060000000000048e+00 -3.600000381469726562e+01 -1.112065000000000081e+00 -3.600000381469726562e+01 -1.112070000000000114e+00 -3.600000381469726562e+01 -1.112075000000000147e+00 -3.593750000000000000e+01 -1.112080000000000179e+00 -3.596875000000000000e+01 -1.112084999999999990e+00 -3.593750000000000000e+01 -1.112090000000000023e+00 -3.593750000000000000e+01 -1.112095000000000056e+00 -3.590625000000000000e+01 -1.112100000000000088e+00 -3.603125000000000000e+01 -1.112105000000000121e+00 -3.596875000000000000e+01 -1.112110000000000154e+00 -3.596875000000000000e+01 -1.112115000000000187e+00 -3.596875000000000000e+01 -1.112119999999999997e+00 -3.596875000000000000e+01 -1.112125000000000030e+00 -3.600000381469726562e+01 -1.112130000000000063e+00 -3.596875000000000000e+01 -1.112135000000000096e+00 -3.603125000000000000e+01 -1.112140000000000128e+00 -3.600000381469726562e+01 -1.112145000000000161e+00 -3.593750000000000000e+01 -1.112150000000000194e+00 -3.603125000000000000e+01 -1.112155000000000005e+00 -3.596875000000000000e+01 -1.112160000000000037e+00 -3.593750000000000000e+01 -1.112165000000000070e+00 -3.596875000000000000e+01 -1.112170000000000103e+00 -3.596875000000000000e+01 -1.112175000000000136e+00 -3.593750000000000000e+01 -1.112180000000000168e+00 -3.596875000000000000e+01 -1.112185000000000201e+00 -3.596875000000000000e+01 -1.112190000000000012e+00 -3.587500000000000000e+01 -1.112195000000000045e+00 -3.593750000000000000e+01 -1.112200000000000077e+00 -3.593750000000000000e+01 -1.112205000000000110e+00 -3.590625000000000000e+01 -1.112210000000000143e+00 -3.590625000000000000e+01 -1.112215000000000176e+00 -3.593750000000000000e+01 -1.112219999999999986e+00 -3.590625000000000000e+01 -1.112225000000000019e+00 -3.590625000000000000e+01 -1.112230000000000052e+00 -3.590625000000000000e+01 -1.112235000000000085e+00 -3.593750000000000000e+01 -1.112240000000000117e+00 -3.584375381469726562e+01 -1.112245000000000150e+00 -3.590625000000000000e+01 -1.112250000000000183e+00 -3.581250000000000000e+01 -1.112254999999999994e+00 -3.596875000000000000e+01 -1.112260000000000026e+00 -3.590625000000000000e+01 -1.112265000000000059e+00 -3.587500000000000000e+01 -1.112270000000000092e+00 -3.590625000000000000e+01 -1.112275000000000125e+00 -3.590625000000000000e+01 -1.112280000000000157e+00 -3.587500000000000000e+01 -1.112285000000000190e+00 -3.587500000000000000e+01 -1.112290000000000001e+00 -3.587500000000000000e+01 -1.112295000000000034e+00 -3.587500000000000000e+01 -1.112300000000000066e+00 -3.587500000000000000e+01 -1.112305000000000099e+00 -3.587500000000000000e+01 -1.112310000000000132e+00 -3.581250000000000000e+01 -1.112315000000000165e+00 -3.587500000000000000e+01 -1.112320000000000197e+00 -3.581250000000000000e+01 -1.112325000000000008e+00 -3.581250000000000000e+01 -1.112330000000000041e+00 -3.584375381469726562e+01 -1.112335000000000074e+00 -3.575000000000000000e+01 -1.112340000000000106e+00 -3.587500000000000000e+01 -1.112345000000000139e+00 -3.578125000000000000e+01 -1.112350000000000172e+00 -3.590625000000000000e+01 -1.112354999999999983e+00 -3.578125000000000000e+01 -1.112360000000000015e+00 -3.584375381469726562e+01 -1.112365000000000048e+00 -3.578125000000000000e+01 -1.112370000000000081e+00 -3.584375381469726562e+01 -1.112375000000000114e+00 -3.578125000000000000e+01 -1.112380000000000146e+00 -3.578125000000000000e+01 -1.112385000000000179e+00 -3.581250000000000000e+01 -1.112389999999999990e+00 -3.575000000000000000e+01 -1.112395000000000023e+00 -3.575000000000000000e+01 -1.112400000000000055e+00 -3.578125000000000000e+01 -1.112405000000000088e+00 -3.575000000000000000e+01 -1.112410000000000121e+00 -3.581250000000000000e+01 -1.112415000000000154e+00 -3.571875000000000000e+01 -1.112420000000000186e+00 -3.578125000000000000e+01 -1.112424999999999997e+00 -3.571875000000000000e+01 -1.112430000000000030e+00 -3.578125000000000000e+01 -1.112435000000000063e+00 -3.571875000000000000e+01 -1.112440000000000095e+00 -3.568750381469726562e+01 -1.112445000000000128e+00 -3.568750381469726562e+01 -1.112450000000000161e+00 -3.575000000000000000e+01 -1.112455000000000194e+00 -3.578125000000000000e+01 -1.112460000000000004e+00 -3.571875000000000000e+01 -1.112465000000000037e+00 -3.571875000000000000e+01 -1.112470000000000070e+00 -3.578125000000000000e+01 -1.112475000000000103e+00 -3.568750381469726562e+01 -1.112480000000000135e+00 -3.571875000000000000e+01 -1.112485000000000168e+00 -3.575000000000000000e+01 -1.112490000000000201e+00 -3.565625000000000000e+01 -1.112495000000000012e+00 -3.578125000000000000e+01 -1.112500000000000044e+00 -3.562500000000000000e+01 -1.112505000000000077e+00 -3.575000000000000000e+01 -1.112510000000000110e+00 -3.571875000000000000e+01 -1.112515000000000143e+00 -3.565625000000000000e+01 -1.112520000000000175e+00 -3.575000000000000000e+01 -1.112524999999999986e+00 -3.568750381469726562e+01 -1.112530000000000019e+00 -3.562500000000000000e+01 -1.112535000000000052e+00 -3.565625000000000000e+01 -1.112540000000000084e+00 -3.562500000000000000e+01 -1.112545000000000117e+00 -3.562500000000000000e+01 -1.112550000000000150e+00 -3.568750381469726562e+01 -1.112555000000000183e+00 -3.565625000000000000e+01 -1.112559999999999993e+00 -3.559375000000000000e+01 -1.112565000000000026e+00 -3.562500000000000000e+01 -1.112570000000000059e+00 -3.562500000000000000e+01 -1.112575000000000092e+00 -3.568750381469726562e+01 -1.112580000000000124e+00 -3.562500000000000000e+01 -1.112585000000000157e+00 -3.562500000000000000e+01 -1.112590000000000190e+00 -3.565625000000000000e+01 -1.112595000000000001e+00 -3.565625000000000000e+01 -1.112600000000000033e+00 -3.562500000000000000e+01 -1.112605000000000066e+00 -3.568750381469726562e+01 -1.112610000000000099e+00 -3.565625000000000000e+01 -1.112615000000000132e+00 -3.568750381469726562e+01 -1.112620000000000164e+00 -3.565625000000000000e+01 -1.112625000000000197e+00 -3.559375000000000000e+01 -1.112630000000000008e+00 -3.565625000000000000e+01 -1.112635000000000041e+00 -3.565625000000000000e+01 -1.112640000000000073e+00 -3.565625000000000000e+01 -1.112645000000000106e+00 -3.565625000000000000e+01 -1.112650000000000139e+00 -3.565625000000000000e+01 -1.112655000000000172e+00 -3.565625000000000000e+01 -1.112659999999999982e+00 -3.562500000000000000e+01 -1.112665000000000015e+00 -3.565625000000000000e+01 -1.112670000000000048e+00 -3.562500000000000000e+01 -1.112675000000000081e+00 -3.568750381469726562e+01 -1.112680000000000113e+00 -3.562500000000000000e+01 -1.112685000000000146e+00 -3.565625000000000000e+01 -1.112690000000000179e+00 -3.565625000000000000e+01 -1.112694999999999990e+00 -3.559375000000000000e+01 -1.112700000000000022e+00 -3.556250000000000000e+01 -1.112705000000000055e+00 -3.562500000000000000e+01 -1.112710000000000088e+00 -3.565625000000000000e+01 -1.112715000000000121e+00 -3.562500000000000000e+01 -1.112720000000000153e+00 -3.559375000000000000e+01 -1.112725000000000186e+00 -3.562500000000000000e+01 -1.112729999999999997e+00 -3.565625000000000000e+01 -1.112735000000000030e+00 -3.559375000000000000e+01 -1.112740000000000062e+00 -3.559375000000000000e+01 -1.112745000000000095e+00 -3.562500000000000000e+01 -1.112750000000000128e+00 -3.559375000000000000e+01 -1.112755000000000161e+00 -3.556250000000000000e+01 -1.112760000000000193e+00 -3.559375000000000000e+01 -1.112765000000000004e+00 -3.565625000000000000e+01 -1.112770000000000037e+00 -3.568750381469726562e+01 -1.112775000000000070e+00 -3.559375000000000000e+01 -1.112780000000000102e+00 -3.562500000000000000e+01 -1.112785000000000135e+00 -3.562500000000000000e+01 -1.112790000000000168e+00 -3.559375000000000000e+01 -1.112795000000000201e+00 -3.568750381469726562e+01 -1.112800000000000011e+00 -3.565625000000000000e+01 -1.112805000000000044e+00 -3.571875000000000000e+01 -1.112810000000000077e+00 -3.565625000000000000e+01 -1.112815000000000110e+00 -3.565625000000000000e+01 -1.112820000000000142e+00 -3.565625000000000000e+01 -1.112825000000000175e+00 -3.562500000000000000e+01 -1.112829999999999986e+00 -3.565625000000000000e+01 -1.112835000000000019e+00 -3.565625000000000000e+01 -1.112840000000000051e+00 -3.562500000000000000e+01 -1.112845000000000084e+00 -3.559375000000000000e+01 -1.112850000000000117e+00 -3.562500000000000000e+01 -1.112855000000000150e+00 -3.559375000000000000e+01 -1.112860000000000182e+00 -3.565625000000000000e+01 -1.112864999999999993e+00 -3.565625000000000000e+01 -1.112870000000000026e+00 -3.562500000000000000e+01 -1.112875000000000059e+00 -3.559375000000000000e+01 -1.112880000000000091e+00 -3.556250000000000000e+01 -1.112885000000000124e+00 -3.565625000000000000e+01 -1.112890000000000157e+00 -3.559375000000000000e+01 -1.112895000000000190e+00 -3.559375000000000000e+01 -1.112900000000000000e+00 -3.559375000000000000e+01 -1.112905000000000033e+00 -3.562500000000000000e+01 -1.112910000000000066e+00 -3.562500000000000000e+01 -1.112915000000000099e+00 -3.553125381469726562e+01 -1.112920000000000131e+00 -3.559375000000000000e+01 -1.112925000000000164e+00 -3.559375000000000000e+01 -1.112930000000000197e+00 -3.556250000000000000e+01 -1.112935000000000008e+00 -3.556250000000000000e+01 -1.112940000000000040e+00 -3.556250000000000000e+01 -1.112945000000000073e+00 -3.562500000000000000e+01 -1.112950000000000106e+00 -3.562500000000000000e+01 -1.112955000000000139e+00 -3.562500000000000000e+01 -1.112960000000000171e+00 -3.556250000000000000e+01 -1.112964999999999982e+00 -3.562500000000000000e+01 -1.112970000000000015e+00 -3.556250000000000000e+01 -1.112975000000000048e+00 -3.565625000000000000e+01 -1.112980000000000080e+00 -3.559375000000000000e+01 -1.112985000000000113e+00 -3.556250000000000000e+01 -1.112990000000000146e+00 -3.556250000000000000e+01 -1.112995000000000179e+00 -3.559375000000000000e+01 -1.112999999999999989e+00 -3.562500000000000000e+01 -1.113005000000000022e+00 -3.559375000000000000e+01 -1.113010000000000055e+00 -3.559375000000000000e+01 -1.113015000000000088e+00 -3.556250000000000000e+01 -1.113020000000000120e+00 -3.556250000000000000e+01 -1.113025000000000153e+00 -3.562500000000000000e+01 -1.113030000000000186e+00 -3.553125381469726562e+01 -1.113034999999999997e+00 -3.553125381469726562e+01 -1.113040000000000029e+00 -3.559375000000000000e+01 -1.113045000000000062e+00 -3.556250000000000000e+01 -1.113050000000000095e+00 -3.556250000000000000e+01 -1.113055000000000128e+00 -3.559375000000000000e+01 -1.113060000000000160e+00 -3.559375000000000000e+01 -1.113065000000000193e+00 -3.559375000000000000e+01 -1.113070000000000004e+00 -3.559375000000000000e+01 -1.113075000000000037e+00 -3.553125381469726562e+01 -1.113080000000000069e+00 -3.553125381469726562e+01 -1.113085000000000102e+00 -3.556250000000000000e+01 -1.113090000000000135e+00 -3.553125381469726562e+01 -1.113095000000000168e+00 -3.553125381469726562e+01 -1.113100000000000200e+00 -3.556250000000000000e+01 -1.113105000000000011e+00 -3.553125381469726562e+01 -1.113110000000000044e+00 -3.556250000000000000e+01 -1.113115000000000077e+00 -3.556250000000000000e+01 -1.113120000000000109e+00 -3.553125381469726562e+01 -1.113125000000000142e+00 -3.562500000000000000e+01 -1.113130000000000175e+00 -3.556250000000000000e+01 -1.113134999999999986e+00 -3.556250000000000000e+01 -1.113140000000000018e+00 -3.556250000000000000e+01 -1.113145000000000051e+00 -3.556250000000000000e+01 -1.113150000000000084e+00 -3.556250000000000000e+01 -1.113155000000000117e+00 -3.553125381469726562e+01 -1.113160000000000149e+00 -3.553125381469726562e+01 -1.113165000000000182e+00 -3.559375000000000000e+01 -1.113169999999999993e+00 -3.556250000000000000e+01 -1.113175000000000026e+00 -3.553125381469726562e+01 -1.113180000000000058e+00 -3.550000000000000000e+01 -1.113185000000000091e+00 -3.546875000000000000e+01 -1.113190000000000124e+00 -3.553125381469726562e+01 -1.113195000000000157e+00 -3.550000000000000000e+01 -1.113200000000000189e+00 -3.550000000000000000e+01 -1.113205000000000000e+00 -3.550000000000000000e+01 -1.113210000000000033e+00 -3.556250000000000000e+01 -1.113215000000000066e+00 -3.550000000000000000e+01 -1.113220000000000098e+00 -3.556250000000000000e+01 -1.113225000000000131e+00 -3.550000000000000000e+01 -1.113230000000000164e+00 -3.546875000000000000e+01 -1.113235000000000197e+00 -3.550000000000000000e+01 -1.113240000000000007e+00 -3.550000000000000000e+01 -1.113245000000000040e+00 -3.543750381469726562e+01 -1.113250000000000073e+00 -3.553125381469726562e+01 -1.113255000000000106e+00 -3.553125381469726562e+01 -1.113260000000000138e+00 -3.550000000000000000e+01 -1.113265000000000171e+00 -3.550000000000000000e+01 -1.113269999999999982e+00 -3.550000000000000000e+01 -1.113275000000000015e+00 -3.553125381469726562e+01 -1.113280000000000047e+00 -3.550000000000000000e+01 -1.113285000000000080e+00 -3.550000000000000000e+01 -1.113290000000000113e+00 -3.543750381469726562e+01 -1.113295000000000146e+00 -3.550000000000000000e+01 -1.113300000000000178e+00 -3.550000000000000000e+01 -1.113304999999999989e+00 -3.553125381469726562e+01 -1.113310000000000022e+00 -3.546875000000000000e+01 -1.113315000000000055e+00 -3.553125381469726562e+01 -1.113320000000000087e+00 -3.553125381469726562e+01 -1.113325000000000120e+00 -3.550000000000000000e+01 -1.113330000000000153e+00 -3.550000000000000000e+01 -1.113335000000000186e+00 -3.556250000000000000e+01 -1.113339999999999996e+00 -3.553125381469726562e+01 -1.113345000000000029e+00 -3.553125381469726562e+01 -1.113350000000000062e+00 -3.550000000000000000e+01 -1.113355000000000095e+00 -3.550000000000000000e+01 -1.113360000000000127e+00 -3.553125381469726562e+01 -1.113365000000000160e+00 -3.550000000000000000e+01 -1.113370000000000193e+00 -3.546875000000000000e+01 -1.113375000000000004e+00 -3.550000000000000000e+01 -1.113380000000000036e+00 -3.540625000000000000e+01 -1.113385000000000069e+00 -3.550000000000000000e+01 -1.113390000000000102e+00 -3.546875000000000000e+01 -1.113395000000000135e+00 -3.550000000000000000e+01 -1.113400000000000167e+00 -3.546875000000000000e+01 -1.113405000000000200e+00 -3.543750381469726562e+01 -1.113410000000000011e+00 -3.546875000000000000e+01 -1.113415000000000044e+00 -3.546875000000000000e+01 -1.113420000000000076e+00 -3.543750381469726562e+01 -1.113425000000000109e+00 -3.543750381469726562e+01 -1.113430000000000142e+00 -3.540625000000000000e+01 -1.113435000000000175e+00 -3.540625000000000000e+01 -1.113439999999999985e+00 -3.540625000000000000e+01 -1.113445000000000018e+00 -3.534375000000000000e+01 -1.113450000000000051e+00 -3.546875000000000000e+01 -1.113455000000000084e+00 -3.540625000000000000e+01 -1.113460000000000116e+00 -3.540625000000000000e+01 -1.113465000000000149e+00 -3.546875000000000000e+01 -1.113470000000000182e+00 -3.537500000000000000e+01 -1.113474999999999993e+00 -3.540625000000000000e+01 -1.113480000000000025e+00 -3.537500000000000000e+01 -1.113485000000000058e+00 -3.543750381469726562e+01 -1.113490000000000091e+00 -3.534375000000000000e+01 -1.113495000000000124e+00 -3.540625000000000000e+01 -1.113500000000000156e+00 -3.540625000000000000e+01 -1.113505000000000189e+00 -3.540625000000000000e+01 -1.113510000000000000e+00 -3.543750381469726562e+01 -1.113515000000000033e+00 -3.540625000000000000e+01 -1.113520000000000065e+00 -3.537500000000000000e+01 -1.113525000000000098e+00 -3.540625000000000000e+01 -1.113530000000000131e+00 -3.534375000000000000e+01 -1.113535000000000164e+00 -3.537500000000000000e+01 -1.113540000000000196e+00 -3.540625000000000000e+01 -1.113545000000000007e+00 -3.543750381469726562e+01 -1.113550000000000040e+00 -3.534375000000000000e+01 -1.113555000000000073e+00 -3.537500000000000000e+01 -1.113560000000000105e+00 -3.537500000000000000e+01 -1.113565000000000138e+00 -3.534375000000000000e+01 -1.113570000000000171e+00 -3.534375000000000000e+01 -1.113574999999999982e+00 -3.537500000000000000e+01 -1.113580000000000014e+00 -3.537500000000000000e+01 -1.113585000000000047e+00 -3.531250000000000000e+01 -1.113590000000000080e+00 -3.537500000000000000e+01 -1.113595000000000113e+00 -3.537500000000000000e+01 -1.113600000000000145e+00 -3.534375000000000000e+01 -1.113605000000000178e+00 -3.531250000000000000e+01 -1.113609999999999989e+00 -3.534375000000000000e+01 -1.113615000000000022e+00 -3.534375000000000000e+01 -1.113620000000000054e+00 -3.537500000000000000e+01 -1.113625000000000087e+00 -3.534375000000000000e+01 -1.113630000000000120e+00 -3.540625000000000000e+01 -1.113635000000000153e+00 -3.537500000000000000e+01 -1.113640000000000185e+00 -3.540625000000000000e+01 -1.113644999999999996e+00 -3.528125381469726562e+01 -1.113650000000000029e+00 -3.528125381469726562e+01 -1.113655000000000062e+00 -3.534375000000000000e+01 -1.113660000000000094e+00 -3.531250000000000000e+01 -1.113665000000000127e+00 -3.537500000000000000e+01 -1.113670000000000160e+00 -3.537500000000000000e+01 -1.113675000000000193e+00 -3.531250000000000000e+01 -1.113680000000000003e+00 -3.531250000000000000e+01 -1.113685000000000036e+00 -3.534375000000000000e+01 -1.113690000000000069e+00 -3.534375000000000000e+01 -1.113695000000000102e+00 -3.531250000000000000e+01 -1.113700000000000134e+00 -3.531250000000000000e+01 -1.113705000000000167e+00 -3.537500000000000000e+01 -1.113710000000000200e+00 -3.531250000000000000e+01 -1.113715000000000011e+00 -3.534375000000000000e+01 -1.113720000000000043e+00 -3.528125381469726562e+01 -1.113725000000000076e+00 -3.528125381469726562e+01 -1.113730000000000109e+00 -3.534375000000000000e+01 -1.113735000000000142e+00 -3.528125381469726562e+01 -1.113740000000000174e+00 -3.534375000000000000e+01 -1.113744999999999985e+00 -3.534375000000000000e+01 -1.113750000000000018e+00 -3.531250000000000000e+01 -1.113755000000000051e+00 -3.534375000000000000e+01 -1.113760000000000083e+00 -3.531250000000000000e+01 -1.113765000000000116e+00 -3.534375000000000000e+01 -1.113770000000000149e+00 -3.525000000000000000e+01 -1.113775000000000182e+00 -3.525000000000000000e+01 -1.113779999999999992e+00 -3.531250000000000000e+01 -1.113785000000000025e+00 -3.528125381469726562e+01 -1.113790000000000058e+00 -3.518750000000000000e+01 -1.113795000000000091e+00 -3.528125381469726562e+01 -1.113800000000000123e+00 -3.518750000000000000e+01 -1.113805000000000156e+00 -3.521875000000000000e+01 -1.113810000000000189e+00 -3.521875000000000000e+01 -1.113815000000000000e+00 -3.521875000000000000e+01 -1.113820000000000032e+00 -3.525000000000000000e+01 -1.113825000000000065e+00 -3.518750000000000000e+01 -1.113830000000000098e+00 -3.525000000000000000e+01 -1.113835000000000131e+00 -3.521875000000000000e+01 -1.113840000000000163e+00 -3.521875000000000000e+01 -1.113845000000000196e+00 -3.521875000000000000e+01 -1.113850000000000007e+00 -3.525000000000000000e+01 -1.113855000000000040e+00 -3.518750000000000000e+01 -1.113860000000000072e+00 -3.515625000000000000e+01 -1.113865000000000105e+00 -3.521875000000000000e+01 -1.113870000000000138e+00 -3.518750000000000000e+01 -1.113875000000000171e+00 -3.521875000000000000e+01 -1.113879999999999981e+00 -3.515625000000000000e+01 -1.113885000000000014e+00 -3.518750000000000000e+01 -1.113890000000000047e+00 -3.521875000000000000e+01 -1.113895000000000080e+00 -3.518750000000000000e+01 -1.113900000000000112e+00 -3.515625000000000000e+01 -1.113905000000000145e+00 -3.518750000000000000e+01 -1.113910000000000178e+00 -3.518750000000000000e+01 -1.113914999999999988e+00 -3.515625000000000000e+01 -1.113920000000000021e+00 -3.515625000000000000e+01 -1.113925000000000054e+00 -3.515625000000000000e+01 -1.113930000000000087e+00 -3.518750000000000000e+01 -1.113935000000000120e+00 -3.506250000000000000e+01 -1.113940000000000152e+00 -3.509375000000000000e+01 -1.113945000000000185e+00 -3.515625000000000000e+01 -1.113949999999999996e+00 -3.515625000000000000e+01 -1.113955000000000028e+00 -3.509375000000000000e+01 -1.113960000000000061e+00 -3.509375000000000000e+01 -1.113965000000000094e+00 -3.506250000000000000e+01 -1.113970000000000127e+00 -3.509375000000000000e+01 -1.113975000000000160e+00 -3.506250000000000000e+01 -1.113980000000000192e+00 -3.506250000000000000e+01 -1.113985000000000003e+00 -3.509375000000000000e+01 -1.113990000000000036e+00 -3.506250000000000000e+01 -1.113995000000000068e+00 -3.503125000000000000e+01 -1.114000000000000101e+00 -3.509375000000000000e+01 -1.114005000000000134e+00 -3.503125000000000000e+01 -1.114010000000000167e+00 -3.509375000000000000e+01 -1.114015000000000200e+00 -3.509375000000000000e+01 -1.114020000000000010e+00 -3.503125000000000000e+01 -1.114025000000000043e+00 -3.503125000000000000e+01 -1.114030000000000076e+00 -3.503125000000000000e+01 -1.114035000000000108e+00 -3.515625000000000000e+01 -1.114040000000000141e+00 -3.503125000000000000e+01 -1.114045000000000174e+00 -3.506250000000000000e+01 -1.114049999999999985e+00 -3.506250000000000000e+01 -1.114055000000000017e+00 -3.509375000000000000e+01 -1.114060000000000050e+00 -3.506250000000000000e+01 -1.114065000000000083e+00 -3.509375000000000000e+01 -1.114070000000000116e+00 -3.503125000000000000e+01 -1.114075000000000149e+00 -3.503125000000000000e+01 -1.114080000000000181e+00 -3.503125000000000000e+01 -1.114084999999999992e+00 -3.506250000000000000e+01 -1.114090000000000025e+00 -3.506250000000000000e+01 -1.114095000000000057e+00 -3.503125000000000000e+01 -1.114100000000000090e+00 -3.506250000000000000e+01 -1.114105000000000123e+00 -3.503125000000000000e+01 -1.114110000000000156e+00 -3.509375000000000000e+01 -1.114115000000000189e+00 -3.515625000000000000e+01 -1.114119999999999999e+00 -3.509375000000000000e+01 -1.114125000000000032e+00 -3.506250000000000000e+01 -1.114130000000000065e+00 -3.506250000000000000e+01 -1.114135000000000097e+00 -3.509375000000000000e+01 -1.114140000000000130e+00 -3.509375000000000000e+01 -1.114145000000000163e+00 -3.509375000000000000e+01 -1.114150000000000196e+00 -3.506250000000000000e+01 -1.114155000000000006e+00 -3.503125000000000000e+01 -1.114160000000000039e+00 -3.509375000000000000e+01 -1.114165000000000072e+00 -3.509375000000000000e+01 -1.114170000000000105e+00 -3.506250000000000000e+01 -1.114175000000000137e+00 -3.506250000000000000e+01 -1.114180000000000170e+00 -3.503125000000000000e+01 -1.114184999999999981e+00 -3.509375000000000000e+01 -1.114190000000000014e+00 -3.506250000000000000e+01 -1.114195000000000046e+00 -3.506250000000000000e+01 -1.114200000000000079e+00 -3.509375000000000000e+01 -1.114205000000000112e+00 -3.506250000000000000e+01 -1.114210000000000145e+00 -3.506250000000000000e+01 -1.114215000000000177e+00 -3.503125000000000000e+01 -1.114219999999999988e+00 -3.506250000000000000e+01 -1.114225000000000021e+00 -3.506250000000000000e+01 -1.114230000000000054e+00 -3.503125000000000000e+01 -1.114235000000000086e+00 -3.506250000000000000e+01 -1.114240000000000119e+00 -3.509375000000000000e+01 -1.114245000000000152e+00 -3.503125000000000000e+01 -1.114250000000000185e+00 -3.506250000000000000e+01 -1.114254999999999995e+00 -3.503125000000000000e+01 -1.114260000000000028e+00 -3.500000000000000000e+01 -1.114265000000000061e+00 -3.503125000000000000e+01 -1.114270000000000094e+00 -3.506250000000000000e+01 -1.114275000000000126e+00 -3.500000000000000000e+01 -1.114280000000000159e+00 -3.503125000000000000e+01 -1.114285000000000192e+00 -3.500000000000000000e+01 -1.114290000000000003e+00 -3.500000000000000000e+01 -1.114295000000000035e+00 -3.500000000000000000e+01 -1.114300000000000068e+00 -3.500000000000000000e+01 -1.114305000000000101e+00 -3.506250000000000000e+01 -1.114310000000000134e+00 -3.496875381469726562e+01 -1.114315000000000166e+00 -3.503125000000000000e+01 -1.114320000000000199e+00 -3.496875381469726562e+01 -1.114325000000000010e+00 -3.496875381469726562e+01 -1.114330000000000043e+00 -3.500000000000000000e+01 -1.114335000000000075e+00 -3.500000000000000000e+01 -1.114340000000000108e+00 -3.493750000000000000e+01 -1.114345000000000141e+00 -3.500000000000000000e+01 -1.114350000000000174e+00 -3.496875381469726562e+01 -1.114354999999999984e+00 -3.500000000000000000e+01 -1.114360000000000017e+00 -3.496875381469726562e+01 -1.114365000000000050e+00 -3.493750000000000000e+01 -1.114370000000000083e+00 -3.493750000000000000e+01 -1.114375000000000115e+00 -3.496875381469726562e+01 -1.114380000000000148e+00 -3.493750000000000000e+01 -1.114385000000000181e+00 -3.493750000000000000e+01 -1.114389999999999992e+00 -3.496875381469726562e+01 -1.114395000000000024e+00 -3.500000000000000000e+01 -1.114400000000000057e+00 -3.493750000000000000e+01 -1.114405000000000090e+00 -3.493750000000000000e+01 -1.114410000000000123e+00 -3.496875381469726562e+01 -1.114415000000000155e+00 -3.493750000000000000e+01 -1.114420000000000188e+00 -3.496875381469726562e+01 -1.114424999999999999e+00 -3.493750000000000000e+01 -1.114430000000000032e+00 -3.496875381469726562e+01 -1.114435000000000064e+00 -3.493750000000000000e+01 -1.114440000000000097e+00 -3.490625000000000000e+01 -1.114445000000000130e+00 -3.490625000000000000e+01 -1.114450000000000163e+00 -3.490625000000000000e+01 -1.114455000000000195e+00 -3.493750000000000000e+01 -1.114460000000000006e+00 -3.481250381469726562e+01 -1.114465000000000039e+00 -3.490625000000000000e+01 -1.114470000000000072e+00 -3.487500000000000000e+01 -1.114475000000000104e+00 -3.493750000000000000e+01 -1.114480000000000137e+00 -3.487500000000000000e+01 -1.114485000000000170e+00 -3.484375000000000000e+01 -1.114489999999999981e+00 -3.490625000000000000e+01 -1.114495000000000013e+00 -3.481250381469726562e+01 -1.114500000000000046e+00 -3.493750000000000000e+01 -1.114505000000000079e+00 -3.496875381469726562e+01 -1.114510000000000112e+00 -3.493750000000000000e+01 -1.114515000000000144e+00 -3.487500000000000000e+01 -1.114520000000000177e+00 -3.496875381469726562e+01 -1.114524999999999988e+00 -3.493750000000000000e+01 -1.114530000000000021e+00 -3.496875381469726562e+01 -1.114535000000000053e+00 -3.493750000000000000e+01 -1.114540000000000086e+00 -3.490625000000000000e+01 -1.114545000000000119e+00 -3.490625000000000000e+01 -1.114550000000000152e+00 -3.490625000000000000e+01 -1.114555000000000184e+00 -3.493750000000000000e+01 -1.114559999999999995e+00 -3.487500000000000000e+01 -1.114565000000000028e+00 -3.490625000000000000e+01 -1.114570000000000061e+00 -3.493750000000000000e+01 -1.114575000000000093e+00 -3.490625000000000000e+01 -1.114580000000000126e+00 -3.493750000000000000e+01 -1.114585000000000159e+00 -3.490625000000000000e+01 -1.114590000000000192e+00 -3.493750000000000000e+01 -1.114595000000000002e+00 -3.487500000000000000e+01 -1.114600000000000035e+00 -3.493750000000000000e+01 -1.114605000000000068e+00 -3.487500000000000000e+01 -1.114610000000000101e+00 -3.496875381469726562e+01 -1.114615000000000133e+00 -3.493750000000000000e+01 -1.114620000000000166e+00 -3.487500000000000000e+01 -1.114625000000000199e+00 -3.490625000000000000e+01 -1.114630000000000010e+00 -3.487500000000000000e+01 -1.114635000000000042e+00 -3.496875381469726562e+01 -1.114640000000000075e+00 -3.487500000000000000e+01 -1.114645000000000108e+00 -3.484375000000000000e+01 -1.114650000000000141e+00 -3.490625000000000000e+01 -1.114655000000000173e+00 -3.484375000000000000e+01 -1.114659999999999984e+00 -3.487500000000000000e+01 -1.114665000000000017e+00 -3.484375000000000000e+01 -1.114670000000000050e+00 -3.484375000000000000e+01 -1.114675000000000082e+00 -3.484375000000000000e+01 -1.114680000000000115e+00 -3.484375000000000000e+01 -1.114685000000000148e+00 -3.478125000000000000e+01 -1.114690000000000181e+00 -3.481250381469726562e+01 -1.114694999999999991e+00 -3.481250381469726562e+01 -1.114700000000000024e+00 -3.487500000000000000e+01 -1.114705000000000057e+00 -3.487500000000000000e+01 -1.114710000000000090e+00 -3.484375000000000000e+01 -1.114715000000000122e+00 -3.481250381469726562e+01 -1.114720000000000155e+00 -3.484375000000000000e+01 -1.114725000000000188e+00 -3.481250381469726562e+01 -1.114729999999999999e+00 -3.484375000000000000e+01 -1.114735000000000031e+00 -3.487500000000000000e+01 -1.114740000000000064e+00 -3.481250381469726562e+01 -1.114745000000000097e+00 -3.490625000000000000e+01 -1.114750000000000130e+00 -3.484375000000000000e+01 -1.114755000000000162e+00 -3.481250381469726562e+01 -1.114760000000000195e+00 -3.478125000000000000e+01 -1.114765000000000006e+00 -3.478125000000000000e+01 -1.114770000000000039e+00 -3.478125000000000000e+01 -1.114775000000000071e+00 -3.475000000000000000e+01 -1.114780000000000104e+00 -3.478125000000000000e+01 -1.114785000000000137e+00 -3.478125000000000000e+01 -1.114790000000000170e+00 -3.475000000000000000e+01 -1.114794999999999980e+00 -3.471875000000000000e+01 -1.114800000000000013e+00 -3.478125000000000000e+01 -1.114805000000000046e+00 -3.478125000000000000e+01 -1.114810000000000079e+00 -3.481250381469726562e+01 -1.114815000000000111e+00 -3.478125000000000000e+01 -1.114820000000000144e+00 -3.475000000000000000e+01 -1.114825000000000177e+00 -3.478125000000000000e+01 -1.114829999999999988e+00 -3.478125000000000000e+01 -1.114835000000000020e+00 -3.478125000000000000e+01 -1.114840000000000053e+00 -3.475000000000000000e+01 -1.114845000000000086e+00 -3.468750000000000000e+01 -1.114850000000000119e+00 -3.471875000000000000e+01 -1.114855000000000151e+00 -3.475000000000000000e+01 -1.114860000000000184e+00 -3.465625000000000000e+01 -1.114864999999999995e+00 -3.471875000000000000e+01 -1.114870000000000028e+00 -3.471875000000000000e+01 -1.114875000000000060e+00 -3.471875000000000000e+01 -1.114880000000000093e+00 -3.478125000000000000e+01 -1.114885000000000126e+00 -3.465625000000000000e+01 -1.114890000000000159e+00 -3.465625000000000000e+01 -1.114895000000000191e+00 -3.465625000000000000e+01 -1.114900000000000002e+00 -3.465625000000000000e+01 -1.114905000000000035e+00 -3.468750000000000000e+01 -1.114910000000000068e+00 -3.471875000000000000e+01 -1.114915000000000100e+00 -3.465625000000000000e+01 -1.114920000000000133e+00 -3.468750000000000000e+01 -1.114925000000000166e+00 -3.462500000000000000e+01 -1.114930000000000199e+00 -3.471875000000000000e+01 -1.114935000000000009e+00 -3.465625000000000000e+01 -1.114940000000000042e+00 -3.468750000000000000e+01 -1.114945000000000075e+00 -3.465625000000000000e+01 -1.114950000000000108e+00 -3.462500000000000000e+01 -1.114955000000000140e+00 -3.468750000000000000e+01 -1.114960000000000173e+00 -3.468750000000000000e+01 -1.114964999999999984e+00 -3.465625000000000000e+01 -1.114970000000000017e+00 -3.462500000000000000e+01 -1.114975000000000049e+00 -3.462500000000000000e+01 -1.114980000000000082e+00 -3.465625000000000000e+01 -1.114985000000000115e+00 -3.465625000000000000e+01 -1.114990000000000148e+00 -3.453125000000000000e+01 -1.114995000000000180e+00 -3.465625000000000000e+01 -1.114999999999999991e+00 -3.462500000000000000e+01 -1.115005000000000024e+00 -3.465625000000000000e+01 -1.115010000000000057e+00 -3.459375000000000000e+01 -1.115015000000000089e+00 -3.459375000000000000e+01 -1.115020000000000122e+00 -3.462500000000000000e+01 -1.115025000000000155e+00 -3.456250381469726562e+01 -1.115030000000000188e+00 -3.462500000000000000e+01 -1.115034999999999998e+00 -3.459375000000000000e+01 -1.115040000000000031e+00 -3.465625000000000000e+01 -1.115045000000000064e+00 -3.462500000000000000e+01 -1.115050000000000097e+00 -3.462500000000000000e+01 -1.115055000000000129e+00 -3.450000000000000000e+01 -1.115060000000000162e+00 -3.453125000000000000e+01 -1.115065000000000195e+00 -3.456250381469726562e+01 -1.115070000000000006e+00 -3.453125000000000000e+01 -1.115075000000000038e+00 -3.450000000000000000e+01 -1.115080000000000071e+00 -3.459375000000000000e+01 -1.115085000000000104e+00 -3.456250381469726562e+01 -1.115090000000000137e+00 -3.453125000000000000e+01 -1.115095000000000169e+00 -3.456250381469726562e+01 -1.115100000000000202e+00 -3.450000000000000000e+01 -1.115105000000000013e+00 -3.450000000000000000e+01 -1.115110000000000046e+00 -3.453125000000000000e+01 -1.115115000000000078e+00 -3.450000000000000000e+01 -1.115120000000000111e+00 -3.450000000000000000e+01 -1.115125000000000144e+00 -3.446875000000000000e+01 -1.115130000000000177e+00 -3.450000000000000000e+01 -1.115134999999999987e+00 -3.450000000000000000e+01 -1.115140000000000020e+00 -3.446875000000000000e+01 -1.115145000000000053e+00 -3.453125000000000000e+01 -1.115150000000000086e+00 -3.446875000000000000e+01 -1.115155000000000118e+00 -3.446875000000000000e+01 -1.115160000000000151e+00 -3.446875000000000000e+01 -1.115165000000000184e+00 -3.443750000000000000e+01 -1.115169999999999995e+00 -3.450000000000000000e+01 -1.115175000000000027e+00 -3.446875000000000000e+01 -1.115180000000000060e+00 -3.453125000000000000e+01 -1.115185000000000093e+00 -3.453125000000000000e+01 -1.115190000000000126e+00 -3.443750000000000000e+01 -1.115195000000000158e+00 -3.450000000000000000e+01 -1.115200000000000191e+00 -3.450000000000000000e+01 -1.115205000000000002e+00 -3.446875000000000000e+01 -1.115210000000000035e+00 -3.443750000000000000e+01 -1.115215000000000067e+00 -3.446875000000000000e+01 -1.115220000000000100e+00 -3.446875000000000000e+01 -1.115225000000000133e+00 -3.446875000000000000e+01 -1.115230000000000166e+00 -3.443750000000000000e+01 -1.115235000000000198e+00 -3.446875000000000000e+01 -1.115240000000000009e+00 -3.443750000000000000e+01 -1.115245000000000042e+00 -3.443750000000000000e+01 -1.115250000000000075e+00 -3.446875000000000000e+01 -1.115255000000000107e+00 -3.443750000000000000e+01 -1.115260000000000140e+00 -3.443750000000000000e+01 -1.115265000000000173e+00 -3.446875000000000000e+01 -1.115269999999999984e+00 -3.446875000000000000e+01 -1.115275000000000016e+00 -3.450000000000000000e+01 -1.115280000000000049e+00 -3.443750000000000000e+01 -1.115285000000000082e+00 -3.437500000000000000e+01 -1.115290000000000115e+00 -3.440625381469726562e+01 -1.115295000000000147e+00 -3.446875000000000000e+01 -1.115300000000000180e+00 -3.446875000000000000e+01 -1.115304999999999991e+00 -3.443750000000000000e+01 -1.115310000000000024e+00 -3.440625381469726562e+01 -1.115315000000000056e+00 -3.446875000000000000e+01 -1.115320000000000089e+00 -3.446875000000000000e+01 -1.115325000000000122e+00 -3.440625381469726562e+01 -1.115330000000000155e+00 -3.446875000000000000e+01 -1.115335000000000187e+00 -3.446875000000000000e+01 -1.115339999999999998e+00 -3.440625381469726562e+01 -1.115345000000000031e+00 -3.446875000000000000e+01 -1.115350000000000064e+00 -3.440625381469726562e+01 -1.115355000000000096e+00 -3.437500000000000000e+01 -1.115360000000000129e+00 -3.440625381469726562e+01 -1.115365000000000162e+00 -3.437500000000000000e+01 -1.115370000000000195e+00 -3.437500000000000000e+01 -1.115375000000000005e+00 -3.440625381469726562e+01 -1.115380000000000038e+00 -3.440625381469726562e+01 -1.115385000000000071e+00 -3.440625381469726562e+01 -1.115390000000000104e+00 -3.437500000000000000e+01 -1.115395000000000136e+00 -3.443750000000000000e+01 -1.115400000000000169e+00 -3.437500000000000000e+01 -1.115405000000000202e+00 -3.434375000000000000e+01 -1.115410000000000013e+00 -3.440625381469726562e+01 -1.115415000000000045e+00 -3.440625381469726562e+01 -1.115420000000000078e+00 -3.434375000000000000e+01 -1.115425000000000111e+00 -3.440625381469726562e+01 -1.115430000000000144e+00 -3.437500000000000000e+01 -1.115435000000000176e+00 -3.437500000000000000e+01 -1.115439999999999987e+00 -3.431250000000000000e+01 -1.115445000000000020e+00 -3.437500000000000000e+01 -1.115450000000000053e+00 -3.434375000000000000e+01 -1.115455000000000085e+00 -3.437500000000000000e+01 -1.115460000000000118e+00 -3.434375000000000000e+01 -1.115465000000000151e+00 -3.434375000000000000e+01 -1.115470000000000184e+00 -3.431250000000000000e+01 -1.115474999999999994e+00 -3.434375000000000000e+01 -1.115480000000000027e+00 -3.434375000000000000e+01 -1.115485000000000060e+00 -3.440625381469726562e+01 -1.115490000000000093e+00 -3.437500000000000000e+01 -1.115495000000000125e+00 -3.440625381469726562e+01 -1.115500000000000158e+00 -3.434375000000000000e+01 -1.115505000000000191e+00 -3.428125000000000000e+01 -1.115510000000000002e+00 -3.434375000000000000e+01 -1.115515000000000034e+00 -3.431250000000000000e+01 -1.115520000000000067e+00 -3.428125000000000000e+01 -1.115525000000000100e+00 -3.434375000000000000e+01 -1.115530000000000133e+00 -3.431250000000000000e+01 -1.115535000000000165e+00 -3.431250000000000000e+01 -1.115540000000000198e+00 -3.425000381469726562e+01 -1.115545000000000009e+00 -3.431250000000000000e+01 -1.115550000000000042e+00 -3.428125000000000000e+01 -1.115555000000000074e+00 -3.431250000000000000e+01 -1.115560000000000107e+00 -3.428125000000000000e+01 -1.115565000000000140e+00 -3.428125000000000000e+01 -1.115570000000000173e+00 -3.428125000000000000e+01 -1.115574999999999983e+00 -3.431250000000000000e+01 -1.115580000000000016e+00 -3.428125000000000000e+01 -1.115585000000000049e+00 -3.428125000000000000e+01 -1.115590000000000082e+00 -3.431250000000000000e+01 -1.115595000000000114e+00 -3.428125000000000000e+01 -1.115600000000000147e+00 -3.425000381469726562e+01 -1.115605000000000180e+00 -3.425000381469726562e+01 -1.115609999999999991e+00 -3.421875000000000000e+01 -1.115615000000000023e+00 -3.421875000000000000e+01 -1.115620000000000056e+00 -3.418750000000000000e+01 -1.115625000000000089e+00 -3.418750000000000000e+01 -1.115630000000000122e+00 -3.425000381469726562e+01 -1.115635000000000154e+00 -3.421875000000000000e+01 -1.115640000000000187e+00 -3.425000381469726562e+01 -1.115644999999999998e+00 -3.428125000000000000e+01 -1.115650000000000031e+00 -3.425000381469726562e+01 -1.115655000000000063e+00 -3.415625000000000000e+01 -1.115660000000000096e+00 -3.421875000000000000e+01 -1.115665000000000129e+00 -3.415625000000000000e+01 -1.115670000000000162e+00 -3.428125000000000000e+01 -1.115675000000000194e+00 -3.425000381469726562e+01 -1.115680000000000005e+00 -3.415625000000000000e+01 -1.115685000000000038e+00 -3.415625000000000000e+01 -1.115690000000000071e+00 -3.415625000000000000e+01 -1.115695000000000103e+00 -3.421875000000000000e+01 -1.115700000000000136e+00 -3.421875000000000000e+01 -1.115705000000000169e+00 -3.418750000000000000e+01 -1.115710000000000202e+00 -3.412500000000000000e+01 -1.115715000000000012e+00 -3.415625000000000000e+01 -1.115720000000000045e+00 -3.421875000000000000e+01 -1.115725000000000078e+00 -3.415625000000000000e+01 -1.115730000000000111e+00 -3.415625000000000000e+01 -1.115735000000000143e+00 -3.418750000000000000e+01 -1.115740000000000176e+00 -3.415625000000000000e+01 -1.115744999999999987e+00 -3.415625000000000000e+01 -1.115750000000000020e+00 -3.415625000000000000e+01 -1.115755000000000052e+00 -3.418750000000000000e+01 -1.115760000000000085e+00 -3.406250000000000000e+01 -1.115765000000000118e+00 -3.406250000000000000e+01 -1.115770000000000151e+00 -3.409375381469726562e+01 -1.115775000000000183e+00 -3.409375381469726562e+01 -1.115779999999999994e+00 -3.403125000000000000e+01 -1.115785000000000027e+00 -3.412500000000000000e+01 -1.115790000000000060e+00 -3.406250000000000000e+01 -1.115795000000000092e+00 -3.409375381469726562e+01 -1.115800000000000125e+00 -3.412500000000000000e+01 -1.115805000000000158e+00 -3.406250000000000000e+01 -1.115810000000000191e+00 -3.403125000000000000e+01 -1.115815000000000001e+00 -3.409375381469726562e+01 -1.115820000000000034e+00 -3.409375381469726562e+01 -1.115825000000000067e+00 -3.409375381469726562e+01 -1.115830000000000100e+00 -3.412500000000000000e+01 -1.115835000000000132e+00 -3.409375381469726562e+01 -1.115840000000000165e+00 -3.403125000000000000e+01 -1.115845000000000198e+00 -3.403125000000000000e+01 -1.115850000000000009e+00 -3.406250000000000000e+01 -1.115855000000000041e+00 -3.409375381469726562e+01 -1.115860000000000074e+00 -3.403125000000000000e+01 -1.115865000000000107e+00 -3.406250000000000000e+01 -1.115870000000000140e+00 -3.409375381469726562e+01 -1.115875000000000172e+00 -3.406250000000000000e+01 -1.115879999999999983e+00 -3.409375381469726562e+01 -1.115885000000000016e+00 -3.409375381469726562e+01 -1.115890000000000049e+00 -3.403125000000000000e+01 -1.115895000000000081e+00 -3.400000000000000000e+01 -1.115900000000000114e+00 -3.403125000000000000e+01 -1.115905000000000147e+00 -3.406250000000000000e+01 -1.115910000000000180e+00 -3.403125000000000000e+01 -1.115914999999999990e+00 -3.400000000000000000e+01 -1.115920000000000023e+00 -3.400000000000000000e+01 -1.115925000000000056e+00 -3.393750000000000000e+01 -1.115930000000000089e+00 -3.406250000000000000e+01 -1.115935000000000121e+00 -3.400000000000000000e+01 -1.115940000000000154e+00 -3.400000000000000000e+01 -1.115945000000000187e+00 -3.400000000000000000e+01 -1.115949999999999998e+00 -3.403125000000000000e+01 -1.115955000000000030e+00 -3.396875000000000000e+01 -1.115960000000000063e+00 -3.400000000000000000e+01 -1.115965000000000096e+00 -3.390625000000000000e+01 -1.115970000000000129e+00 -3.393750000000000000e+01 -1.115975000000000161e+00 -3.400000000000000000e+01 -1.115980000000000194e+00 -3.393750000000000000e+01 -1.115985000000000005e+00 -3.400000000000000000e+01 -1.115990000000000038e+00 -3.393750000000000000e+01 -1.115995000000000070e+00 -3.396875000000000000e+01 -1.116000000000000103e+00 -3.390625000000000000e+01 -1.116005000000000136e+00 -3.393750000000000000e+01 -1.116010000000000169e+00 -3.393750000000000000e+01 -1.116015000000000201e+00 -3.390625000000000000e+01 -1.116020000000000012e+00 -3.396875000000000000e+01 -1.116025000000000045e+00 -3.403125000000000000e+01 -1.116030000000000078e+00 -3.390625000000000000e+01 -1.116035000000000110e+00 -3.387500000000000000e+01 -1.116040000000000143e+00 -3.393750000000000000e+01 -1.116045000000000176e+00 -3.400000000000000000e+01 -1.116049999999999986e+00 -3.390625000000000000e+01 -1.116055000000000019e+00 -3.393750000000000000e+01 -1.116060000000000052e+00 -3.396875000000000000e+01 -1.116065000000000085e+00 -3.393750000000000000e+01 -1.116070000000000118e+00 -3.390625000000000000e+01 -1.116075000000000150e+00 -3.390625000000000000e+01 -1.116080000000000183e+00 -3.384375381469726562e+01 -1.116084999999999994e+00 -3.387500000000000000e+01 -1.116090000000000027e+00 -3.387500000000000000e+01 -1.116095000000000059e+00 -3.390625000000000000e+01 -1.116100000000000092e+00 -3.393750000000000000e+01 -1.116105000000000125e+00 -3.384375381469726562e+01 -1.116110000000000158e+00 -3.384375381469726562e+01 -1.116115000000000190e+00 -3.381250000000000000e+01 -1.116120000000000001e+00 -3.384375381469726562e+01 -1.116125000000000034e+00 -3.384375381469726562e+01 -1.116130000000000067e+00 -3.381250000000000000e+01 -1.116135000000000099e+00 -3.384375381469726562e+01 -1.116140000000000132e+00 -3.384375381469726562e+01 -1.116145000000000165e+00 -3.378125000000000000e+01 -1.116150000000000198e+00 -3.381250000000000000e+01 -1.116155000000000008e+00 -3.375000000000000000e+01 -1.116160000000000041e+00 -3.378125000000000000e+01 -1.116165000000000074e+00 -3.375000000000000000e+01 -1.116170000000000107e+00 -3.378125000000000000e+01 -1.116175000000000139e+00 -3.378125000000000000e+01 -1.116180000000000172e+00 -3.378125000000000000e+01 -1.116184999999999983e+00 -3.375000000000000000e+01 -1.116190000000000015e+00 -3.375000000000000000e+01 -1.116195000000000048e+00 -3.378125000000000000e+01 -1.116200000000000081e+00 -3.381250000000000000e+01 -1.116205000000000114e+00 -3.375000000000000000e+01 -1.116210000000000147e+00 -3.378125000000000000e+01 -1.116215000000000179e+00 -3.381250000000000000e+01 -1.116219999999999990e+00 -3.378125000000000000e+01 -1.116225000000000023e+00 -3.381250000000000000e+01 -1.116230000000000055e+00 -3.378125000000000000e+01 -1.116235000000000088e+00 -3.378125000000000000e+01 -1.116240000000000121e+00 -3.378125000000000000e+01 -1.116245000000000154e+00 -3.378125000000000000e+01 -1.116250000000000187e+00 -3.378125000000000000e+01 -1.116254999999999997e+00 -3.381250000000000000e+01 -1.116260000000000030e+00 -3.381250000000000000e+01 -1.116265000000000063e+00 -3.384375381469726562e+01 -1.116270000000000095e+00 -3.378125000000000000e+01 -1.116275000000000128e+00 -3.378125000000000000e+01 -1.116280000000000161e+00 -3.384375381469726562e+01 -1.116285000000000194e+00 -3.384375381469726562e+01 -1.116290000000000004e+00 -3.378125000000000000e+01 -1.116295000000000037e+00 -3.381250000000000000e+01 -1.116300000000000070e+00 -3.384375381469726562e+01 -1.116305000000000103e+00 -3.384375381469726562e+01 -1.116310000000000136e+00 -3.378125000000000000e+01 -1.116315000000000168e+00 -3.381250000000000000e+01 -1.116320000000000201e+00 -3.384375381469726562e+01 -1.116325000000000012e+00 -3.384375381469726562e+01 -1.116330000000000044e+00 -3.384375381469726562e+01 -1.116335000000000077e+00 -3.378125000000000000e+01 -1.116340000000000110e+00 -3.387500000000000000e+01 -1.116345000000000143e+00 -3.375000000000000000e+01 -1.116350000000000176e+00 -3.378125000000000000e+01 -1.116354999999999986e+00 -3.378125000000000000e+01 -1.116360000000000019e+00 -3.381250000000000000e+01 -1.116365000000000052e+00 -3.375000000000000000e+01 -1.116370000000000084e+00 -3.378125000000000000e+01 -1.116375000000000117e+00 -3.378125000000000000e+01 -1.116380000000000150e+00 -3.371875000000000000e+01 -1.116385000000000183e+00 -3.371875000000000000e+01 -1.116389999999999993e+00 -3.375000000000000000e+01 -1.116395000000000026e+00 -3.371875000000000000e+01 -1.116400000000000059e+00 -3.368750381469726562e+01 -1.116405000000000092e+00 -3.375000000000000000e+01 -1.116410000000000124e+00 -3.378125000000000000e+01 -1.116415000000000157e+00 -3.378125000000000000e+01 -1.116420000000000190e+00 -3.378125000000000000e+01 -1.116425000000000001e+00 -3.371875000000000000e+01 -1.116430000000000033e+00 -3.368750381469726562e+01 -1.116435000000000066e+00 -3.365625000000000000e+01 -1.116440000000000099e+00 -3.371875000000000000e+01 -1.116445000000000132e+00 -3.378125000000000000e+01 -1.116450000000000164e+00 -3.378125000000000000e+01 -1.116455000000000197e+00 -3.371875000000000000e+01 -1.116460000000000008e+00 -3.371875000000000000e+01 -1.116465000000000041e+00 -3.375000000000000000e+01 -1.116470000000000073e+00 -3.371875000000000000e+01 -1.116475000000000106e+00 -3.371875000000000000e+01 -1.116480000000000139e+00 -3.371875000000000000e+01 -1.116485000000000172e+00 -3.375000000000000000e+01 -1.116489999999999982e+00 -3.371875000000000000e+01 -1.116495000000000015e+00 -3.375000000000000000e+01 -1.116500000000000048e+00 -3.368750381469726562e+01 -1.116505000000000081e+00 -3.368750381469726562e+01 -1.116510000000000113e+00 -3.362500000000000000e+01 -1.116515000000000146e+00 -3.362500000000000000e+01 -1.116520000000000179e+00 -3.365625000000000000e+01 -1.116524999999999990e+00 -3.362500000000000000e+01 -1.116530000000000022e+00 -3.362500000000000000e+01 -1.116535000000000055e+00 -3.362500000000000000e+01 -1.116540000000000088e+00 -3.365625000000000000e+01 -1.116545000000000121e+00 -3.362500000000000000e+01 -1.116550000000000153e+00 -3.359375000000000000e+01 -1.116555000000000186e+00 -3.362500000000000000e+01 -1.116559999999999997e+00 -3.359375000000000000e+01 -1.116565000000000030e+00 -3.356250000000000000e+01 -1.116570000000000062e+00 -3.362500000000000000e+01 -1.116575000000000095e+00 -3.365625000000000000e+01 -1.116580000000000128e+00 -3.362500000000000000e+01 -1.116585000000000161e+00 -3.359375000000000000e+01 -1.116590000000000193e+00 -3.362500000000000000e+01 -1.116595000000000004e+00 -3.353125381469726562e+01 -1.116600000000000037e+00 -3.356250000000000000e+01 -1.116605000000000070e+00 -3.362500000000000000e+01 -1.116610000000000102e+00 -3.365625000000000000e+01 -1.116615000000000135e+00 -3.365625000000000000e+01 -1.116620000000000168e+00 -3.359375000000000000e+01 -1.116625000000000201e+00 -3.365625000000000000e+01 -1.116630000000000011e+00 -3.368750381469726562e+01 -1.116635000000000044e+00 -3.365625000000000000e+01 -1.116640000000000077e+00 -3.359375000000000000e+01 -1.116645000000000110e+00 -3.356250000000000000e+01 -1.116650000000000142e+00 -3.359375000000000000e+01 -1.116655000000000175e+00 -3.365625000000000000e+01 -1.116659999999999986e+00 -3.359375000000000000e+01 -1.116665000000000019e+00 -3.359375000000000000e+01 -1.116670000000000051e+00 -3.359375000000000000e+01 -1.116675000000000084e+00 -3.359375000000000000e+01 -1.116680000000000117e+00 -3.362500000000000000e+01 -1.116685000000000150e+00 -3.359375000000000000e+01 -1.116690000000000182e+00 -3.359375000000000000e+01 -1.116694999999999993e+00 -3.362500000000000000e+01 -1.116700000000000026e+00 -3.362500000000000000e+01 -1.116705000000000059e+00 -3.353125381469726562e+01 -1.116710000000000091e+00 -3.356250000000000000e+01 -1.116715000000000124e+00 -3.356250000000000000e+01 -1.116720000000000157e+00 -3.353125381469726562e+01 -1.116725000000000190e+00 -3.350000000000000000e+01 -1.116730000000000000e+00 -3.350000000000000000e+01 -1.116735000000000033e+00 -3.353125381469726562e+01 -1.116740000000000066e+00 -3.353125381469726562e+01 -1.116745000000000099e+00 -3.350000000000000000e+01 -1.116750000000000131e+00 -3.353125381469726562e+01 -1.116755000000000164e+00 -3.353125381469726562e+01 -1.116760000000000197e+00 -3.343750000000000000e+01 -1.116765000000000008e+00 -3.350000000000000000e+01 -1.116770000000000040e+00 -3.350000000000000000e+01 -1.116775000000000073e+00 -3.350000000000000000e+01 -1.116780000000000106e+00 -3.350000000000000000e+01 -1.116785000000000139e+00 -3.350000000000000000e+01 -1.116790000000000171e+00 -3.356250000000000000e+01 -1.116794999999999982e+00 -3.350000000000000000e+01 -1.116800000000000015e+00 -3.350000000000000000e+01 -1.116805000000000048e+00 -3.350000000000000000e+01 -1.116810000000000080e+00 -3.346875000000000000e+01 -1.116815000000000113e+00 -3.350000000000000000e+01 -1.116820000000000146e+00 -3.350000000000000000e+01 -1.116825000000000179e+00 -3.350000000000000000e+01 -1.116829999999999989e+00 -3.353125381469726562e+01 -1.116835000000000022e+00 -3.353125381469726562e+01 -1.116840000000000055e+00 -3.350000000000000000e+01 -1.116845000000000088e+00 -3.346875000000000000e+01 -1.116850000000000120e+00 -3.353125381469726562e+01 -1.116855000000000153e+00 -3.353125381469726562e+01 -1.116860000000000186e+00 -3.350000000000000000e+01 -1.116864999999999997e+00 -3.353125381469726562e+01 -1.116870000000000029e+00 -3.353125381469726562e+01 -1.116875000000000062e+00 -3.350000000000000000e+01 -1.116880000000000095e+00 -3.350000000000000000e+01 -1.116885000000000128e+00 -3.350000000000000000e+01 -1.116890000000000160e+00 -3.346875000000000000e+01 -1.116895000000000193e+00 -3.350000000000000000e+01 -1.116900000000000004e+00 -3.353125381469726562e+01 -1.116905000000000037e+00 -3.346875000000000000e+01 -1.116910000000000069e+00 -3.350000000000000000e+01 -1.116915000000000102e+00 -3.350000000000000000e+01 -1.116920000000000135e+00 -3.350000000000000000e+01 -1.116925000000000168e+00 -3.350000000000000000e+01 -1.116930000000000200e+00 -3.350000000000000000e+01 -1.116935000000000011e+00 -3.350000000000000000e+01 -1.116940000000000044e+00 -3.353125381469726562e+01 -1.116945000000000077e+00 -3.346875000000000000e+01 -1.116950000000000109e+00 -3.343750000000000000e+01 -1.116955000000000142e+00 -3.346875000000000000e+01 -1.116960000000000175e+00 -3.343750000000000000e+01 -1.116964999999999986e+00 -3.350000000000000000e+01 -1.116970000000000018e+00 -3.350000000000000000e+01 -1.116975000000000051e+00 -3.346875000000000000e+01 -1.116980000000000084e+00 -3.340625000000000000e+01 -1.116985000000000117e+00 -3.343750000000000000e+01 -1.116990000000000149e+00 -3.350000000000000000e+01 -1.116995000000000182e+00 -3.343750000000000000e+01 -1.116999999999999993e+00 -3.350000000000000000e+01 -1.117005000000000026e+00 -3.340625000000000000e+01 -1.117010000000000058e+00 -3.343750000000000000e+01 -1.117015000000000091e+00 -3.343750000000000000e+01 -1.117020000000000124e+00 -3.343750000000000000e+01 -1.117025000000000157e+00 -3.350000000000000000e+01 -1.117030000000000189e+00 -3.343750000000000000e+01 -1.117035000000000000e+00 -3.340625000000000000e+01 -1.117040000000000033e+00 -3.337500381469726562e+01 -1.117045000000000066e+00 -3.340625000000000000e+01 -1.117050000000000098e+00 -3.337500381469726562e+01 -1.117055000000000131e+00 -3.337500381469726562e+01 -1.117060000000000164e+00 -3.337500381469726562e+01 -1.117065000000000197e+00 -3.334375000000000000e+01 -1.117070000000000007e+00 -3.337500381469726562e+01 -1.117075000000000040e+00 -3.337500381469726562e+01 -1.117080000000000073e+00 -3.340625000000000000e+01 -1.117085000000000106e+00 -3.334375000000000000e+01 -1.117090000000000138e+00 -3.331250000000000000e+01 -1.117095000000000171e+00 -3.331250000000000000e+01 -1.117099999999999982e+00 -3.331250000000000000e+01 -1.117105000000000015e+00 -3.331250000000000000e+01 -1.117110000000000047e+00 -3.334375000000000000e+01 -1.117115000000000080e+00 -3.334375000000000000e+01 -1.117120000000000113e+00 -3.328125000000000000e+01 -1.117125000000000146e+00 -3.328125000000000000e+01 -1.117130000000000178e+00 -3.328125000000000000e+01 -1.117134999999999989e+00 -3.328125000000000000e+01 -1.117140000000000022e+00 -3.328125000000000000e+01 -1.117145000000000055e+00 -3.328125000000000000e+01 -1.117150000000000087e+00 -3.331250000000000000e+01 -1.117155000000000120e+00 -3.328125000000000000e+01 -1.117160000000000153e+00 -3.328125000000000000e+01 -1.117165000000000186e+00 -3.331250000000000000e+01 -1.117169999999999996e+00 -3.318750000000000000e+01 -1.117175000000000029e+00 -3.325000000000000000e+01 -1.117180000000000062e+00 -3.331250000000000000e+01 -1.117185000000000095e+00 -3.321875381469726562e+01 -1.117190000000000127e+00 -3.321875381469726562e+01 -1.117195000000000160e+00 -3.321875381469726562e+01 -1.117200000000000193e+00 -3.318750000000000000e+01 -1.117205000000000004e+00 -3.321875381469726562e+01 -1.117210000000000036e+00 -3.328125000000000000e+01 -1.117215000000000069e+00 -3.321875381469726562e+01 -1.117220000000000102e+00 -3.318750000000000000e+01 -1.117225000000000135e+00 -3.315625000000000000e+01 -1.117230000000000167e+00 -3.315625000000000000e+01 -1.117235000000000200e+00 -3.321875381469726562e+01 -1.117240000000000011e+00 -3.321875381469726562e+01 -1.117245000000000044e+00 -3.325000000000000000e+01 -1.117250000000000076e+00 -3.321875381469726562e+01 -1.117255000000000109e+00 -3.318750000000000000e+01 -1.117260000000000142e+00 -3.318750000000000000e+01 -1.117265000000000175e+00 -3.318750000000000000e+01 -1.117269999999999985e+00 -3.321875381469726562e+01 -1.117275000000000018e+00 -3.315625000000000000e+01 -1.117280000000000051e+00 -3.315625000000000000e+01 -1.117285000000000084e+00 -3.318750000000000000e+01 -1.117290000000000116e+00 -3.318750000000000000e+01 -1.117295000000000149e+00 -3.315625000000000000e+01 -1.117300000000000182e+00 -3.315625000000000000e+01 -1.117304999999999993e+00 -3.315625000000000000e+01 -1.117310000000000025e+00 -3.315625000000000000e+01 -1.117315000000000058e+00 -3.315625000000000000e+01 -1.117320000000000091e+00 -3.315625000000000000e+01 -1.117325000000000124e+00 -3.315625000000000000e+01 -1.117330000000000156e+00 -3.315625000000000000e+01 -1.117335000000000189e+00 -3.312500381469726562e+01 -1.117340000000000000e+00 -3.309375000000000000e+01 -1.117345000000000033e+00 -3.309375000000000000e+01 -1.117350000000000065e+00 -3.309375000000000000e+01 -1.117355000000000098e+00 -3.315625000000000000e+01 -1.117360000000000131e+00 -3.309375000000000000e+01 -1.117365000000000164e+00 -3.312500381469726562e+01 -1.117370000000000196e+00 -3.315625000000000000e+01 -1.117375000000000007e+00 -3.312500381469726562e+01 -1.117380000000000040e+00 -3.309375000000000000e+01 -1.117385000000000073e+00 -3.312500381469726562e+01 -1.117390000000000105e+00 -3.306250000000000000e+01 -1.117395000000000138e+00 -3.309375000000000000e+01 -1.117400000000000171e+00 -3.315625000000000000e+01 -1.117404999999999982e+00 -3.312500381469726562e+01 -1.117410000000000014e+00 -3.312500381469726562e+01 -1.117415000000000047e+00 -3.309375000000000000e+01 -1.117420000000000080e+00 -3.318750000000000000e+01 -1.117425000000000113e+00 -3.309375000000000000e+01 -1.117430000000000145e+00 -3.309375000000000000e+01 -1.117435000000000178e+00 -3.309375000000000000e+01 -1.117439999999999989e+00 -3.312500381469726562e+01 -1.117445000000000022e+00 -3.309375000000000000e+01 -1.117450000000000054e+00 -3.315625000000000000e+01 -1.117455000000000087e+00 -3.315625000000000000e+01 -1.117460000000000120e+00 -3.315625000000000000e+01 -1.117465000000000153e+00 -3.315625000000000000e+01 -1.117470000000000185e+00 -3.315625000000000000e+01 -1.117474999999999996e+00 -3.312500381469726562e+01 -1.117480000000000029e+00 -3.312500381469726562e+01 -1.117485000000000062e+00 -3.315625000000000000e+01 -1.117490000000000094e+00 -3.309375000000000000e+01 -1.117495000000000127e+00 -3.309375000000000000e+01 -1.117500000000000160e+00 -3.312500381469726562e+01 -1.117505000000000193e+00 -3.309375000000000000e+01 -1.117510000000000003e+00 -3.306250000000000000e+01 -1.117515000000000036e+00 -3.303125000000000000e+01 -1.117520000000000069e+00 -3.303125000000000000e+01 -1.117525000000000102e+00 -3.303125000000000000e+01 -1.117530000000000134e+00 -3.303125000000000000e+01 -1.117535000000000167e+00 -3.303125000000000000e+01 -1.117540000000000200e+00 -3.300000000000000000e+01 -1.117545000000000011e+00 -3.300000000000000000e+01 -1.117550000000000043e+00 -3.303125000000000000e+01 -1.117555000000000076e+00 -3.303125000000000000e+01 -1.117560000000000109e+00 -3.300000000000000000e+01 -1.117565000000000142e+00 -3.300000000000000000e+01 -1.117570000000000174e+00 -3.300000000000000000e+01 -1.117574999999999985e+00 -3.300000000000000000e+01 -1.117580000000000018e+00 -3.303125000000000000e+01 -1.117585000000000051e+00 -3.303125000000000000e+01 -1.117590000000000083e+00 -3.300000000000000000e+01 -1.117595000000000116e+00 -3.300000000000000000e+01 -1.117600000000000149e+00 -3.300000000000000000e+01 -1.117605000000000182e+00 -3.300000000000000000e+01 -1.117609999999999992e+00 -3.296875381469726562e+01 -1.117615000000000025e+00 -3.300000000000000000e+01 -1.117620000000000058e+00 -3.303125000000000000e+01 -1.117625000000000091e+00 -3.303125000000000000e+01 -1.117630000000000123e+00 -3.300000000000000000e+01 -1.117635000000000156e+00 -3.296875381469726562e+01 -1.117640000000000189e+00 -3.300000000000000000e+01 -1.117645000000000000e+00 -3.296875381469726562e+01 -1.117650000000000032e+00 -3.296875381469726562e+01 -1.117655000000000065e+00 -3.300000000000000000e+01 -1.117660000000000098e+00 -3.296875381469726562e+01 -1.117665000000000131e+00 -3.296875381469726562e+01 -1.117670000000000163e+00 -3.293750000000000000e+01 -1.117675000000000196e+00 -3.296875381469726562e+01 -1.117680000000000007e+00 -3.296875381469726562e+01 -1.117685000000000040e+00 -3.290625000000000000e+01 -1.117690000000000072e+00 -3.293750000000000000e+01 -1.117695000000000105e+00 -3.290625000000000000e+01 -1.117700000000000138e+00 -3.293750000000000000e+01 -1.117705000000000171e+00 -3.290625000000000000e+01 -1.117709999999999981e+00 -3.287500000000000000e+01 -1.117715000000000014e+00 -3.290625000000000000e+01 -1.117720000000000047e+00 -3.284375000000000000e+01 -1.117725000000000080e+00 -3.290625000000000000e+01 -1.117730000000000112e+00 -3.281250381469726562e+01 -1.117735000000000145e+00 -3.284375000000000000e+01 -1.117740000000000178e+00 -3.284375000000000000e+01 -1.117744999999999989e+00 -3.284375000000000000e+01 -1.117750000000000021e+00 -3.278125000000000000e+01 -1.117755000000000054e+00 -3.278125000000000000e+01 -1.117760000000000087e+00 -3.281250381469726562e+01 -1.117765000000000120e+00 -3.281250381469726562e+01 -1.117770000000000152e+00 -3.278125000000000000e+01 -1.117775000000000185e+00 -3.275000000000000000e+01 -1.117779999999999996e+00 -3.278125000000000000e+01 -1.117785000000000029e+00 -3.278125000000000000e+01 -1.117790000000000061e+00 -3.278125000000000000e+01 -1.117795000000000094e+00 -3.281250381469726562e+01 -1.117800000000000127e+00 -3.271875000000000000e+01 -1.117805000000000160e+00 -3.281250381469726562e+01 -1.117810000000000192e+00 -3.278125000000000000e+01 -1.117815000000000003e+00 -3.281250381469726562e+01 -1.117820000000000036e+00 -3.278125000000000000e+01 -1.117825000000000069e+00 -3.278125000000000000e+01 -1.117830000000000101e+00 -3.278125000000000000e+01 -1.117835000000000134e+00 -3.275000000000000000e+01 -1.117840000000000167e+00 -3.275000000000000000e+01 -1.117845000000000200e+00 -3.278125000000000000e+01 -1.117850000000000010e+00 -3.265625381469726562e+01 -1.117855000000000043e+00 -3.275000000000000000e+01 -1.117860000000000076e+00 -3.271875000000000000e+01 -1.117865000000000109e+00 -3.278125000000000000e+01 -1.117870000000000141e+00 -3.275000000000000000e+01 -1.117875000000000174e+00 -3.271875000000000000e+01 -1.117879999999999985e+00 -3.275000000000000000e+01 -1.117885000000000018e+00 -3.275000000000000000e+01 -1.117890000000000050e+00 -3.271875000000000000e+01 -1.117895000000000083e+00 -3.275000000000000000e+01 -1.117900000000000116e+00 -3.275000000000000000e+01 -1.117905000000000149e+00 -3.268750000000000000e+01 -1.117910000000000181e+00 -3.265625381469726562e+01 -1.117914999999999992e+00 -3.271875000000000000e+01 -1.117920000000000025e+00 -3.271875000000000000e+01 -1.117925000000000058e+00 -3.268750000000000000e+01 -1.117930000000000090e+00 -3.271875000000000000e+01 -1.117935000000000123e+00 -3.265625381469726562e+01 -1.117940000000000156e+00 -3.265625381469726562e+01 -1.117945000000000189e+00 -3.265625381469726562e+01 -1.117949999999999999e+00 -3.262500000000000000e+01 -1.117955000000000032e+00 -3.262500000000000000e+01 -1.117960000000000065e+00 -3.265625381469726562e+01 -1.117965000000000098e+00 -3.265625381469726562e+01 -1.117970000000000130e+00 -3.265625381469726562e+01 -1.117975000000000163e+00 -3.265625381469726562e+01 -1.117980000000000196e+00 -3.259375000000000000e+01 -1.117985000000000007e+00 -3.259375000000000000e+01 -1.117990000000000039e+00 -3.256250000000000000e+01 -1.117995000000000072e+00 -3.262500000000000000e+01 -1.118000000000000105e+00 -3.256250000000000000e+01 -1.118005000000000138e+00 -3.259375000000000000e+01 -1.118010000000000170e+00 -3.262500000000000000e+01 -1.118014999999999981e+00 -3.256250000000000000e+01 -1.118020000000000014e+00 -3.256250000000000000e+01 -1.118025000000000047e+00 -3.253125000000000000e+01 -1.118030000000000079e+00 -3.265625381469726562e+01 -1.118035000000000112e+00 -3.253125000000000000e+01 -1.118040000000000145e+00 -3.256250000000000000e+01 -1.118045000000000178e+00 -3.256250000000000000e+01 -1.118049999999999988e+00 -3.256250000000000000e+01 -1.118055000000000021e+00 -3.259375000000000000e+01 -1.118060000000000054e+00 -3.256250000000000000e+01 -1.118065000000000087e+00 -3.256250000000000000e+01 -1.118070000000000119e+00 -3.256250000000000000e+01 -1.118075000000000152e+00 -3.253125000000000000e+01 -1.118080000000000185e+00 -3.246875000000000000e+01 -1.118084999999999996e+00 -3.256250000000000000e+01 -1.118090000000000028e+00 -3.246875000000000000e+01 -1.118095000000000061e+00 -3.253125000000000000e+01 -1.118100000000000094e+00 -3.246875000000000000e+01 -1.118105000000000127e+00 -3.246875000000000000e+01 -1.118110000000000159e+00 -3.243750000000000000e+01 -1.118115000000000192e+00 -3.250000381469726562e+01 -1.118120000000000003e+00 -3.250000381469726562e+01 -1.118125000000000036e+00 -3.243750000000000000e+01 -1.118130000000000068e+00 -3.243750000000000000e+01 -1.118135000000000101e+00 -3.250000381469726562e+01 -1.118140000000000134e+00 -3.253125000000000000e+01 -1.118145000000000167e+00 -3.243750000000000000e+01 -1.118150000000000199e+00 -3.246875000000000000e+01 -1.118155000000000010e+00 -3.250000381469726562e+01 -1.118160000000000043e+00 -3.246875000000000000e+01 -1.118165000000000076e+00 -3.246875000000000000e+01 -1.118170000000000108e+00 -3.240625000000000000e+01 -1.118175000000000141e+00 -3.243750000000000000e+01 -1.118180000000000174e+00 -3.240625000000000000e+01 -1.118184999999999985e+00 -3.243750000000000000e+01 -1.118190000000000017e+00 -3.240625000000000000e+01 -1.118195000000000050e+00 -3.246875000000000000e+01 -1.118200000000000083e+00 -3.243750000000000000e+01 -1.118205000000000116e+00 -3.240625000000000000e+01 -1.118210000000000148e+00 -3.240625000000000000e+01 -1.118215000000000181e+00 -3.231250000000000000e+01 -1.118219999999999992e+00 -3.234375000000000000e+01 -1.118225000000000025e+00 -3.228125000000000000e+01 -1.118230000000000057e+00 -3.240625000000000000e+01 -1.118235000000000090e+00 -3.234375000000000000e+01 -1.118240000000000123e+00 -3.240625000000000000e+01 -1.118245000000000156e+00 -3.234375000000000000e+01 -1.118250000000000188e+00 -3.243750000000000000e+01 -1.118254999999999999e+00 -3.240625000000000000e+01 -1.118260000000000032e+00 -3.234375000000000000e+01 -1.118265000000000065e+00 -3.237500000000000000e+01 -1.118270000000000097e+00 -3.237500000000000000e+01 -1.118275000000000130e+00 -3.237500000000000000e+01 -1.118280000000000163e+00 -3.234375000000000000e+01 -1.118285000000000196e+00 -3.231250000000000000e+01 -1.118290000000000006e+00 -3.231250000000000000e+01 -1.118295000000000039e+00 -3.228125000000000000e+01 -1.118300000000000072e+00 -3.228125000000000000e+01 -1.118305000000000105e+00 -3.231250000000000000e+01 -1.118310000000000137e+00 -3.228125000000000000e+01 -1.118315000000000170e+00 -3.231250000000000000e+01 -1.118319999999999981e+00 -3.231250000000000000e+01 -1.118325000000000014e+00 -3.231250000000000000e+01 -1.118330000000000046e+00 -3.225000381469726562e+01 -1.118335000000000079e+00 -3.225000381469726562e+01 -1.118340000000000112e+00 -3.228125000000000000e+01 -1.118345000000000145e+00 -3.228125000000000000e+01 -1.118350000000000177e+00 -3.225000381469726562e+01 -1.118354999999999988e+00 -3.228125000000000000e+01 -1.118360000000000021e+00 -3.221875000000000000e+01 -1.118365000000000054e+00 -3.231250000000000000e+01 -1.118370000000000086e+00 -3.221875000000000000e+01 -1.118375000000000119e+00 -3.228125000000000000e+01 -1.118380000000000152e+00 -3.221875000000000000e+01 -1.118385000000000185e+00 -3.221875000000000000e+01 -1.118389999999999995e+00 -3.221875000000000000e+01 -1.118395000000000028e+00 -3.228125000000000000e+01 -1.118400000000000061e+00 -3.221875000000000000e+01 -1.118405000000000094e+00 -3.228125000000000000e+01 -1.118410000000000126e+00 -3.221875000000000000e+01 -1.118415000000000159e+00 -3.221875000000000000e+01 -1.118420000000000192e+00 -3.218750000000000000e+01 -1.118425000000000002e+00 -3.228125000000000000e+01 -1.118430000000000035e+00 -3.225000381469726562e+01 -1.118435000000000068e+00 -3.221875000000000000e+01 -1.118440000000000101e+00 -3.221875000000000000e+01 -1.118445000000000134e+00 -3.218750000000000000e+01 -1.118450000000000166e+00 -3.221875000000000000e+01 -1.118455000000000199e+00 -3.221875000000000000e+01 -1.118460000000000010e+00 -3.212500000000000000e+01 -1.118465000000000042e+00 -3.215625000000000000e+01 -1.118470000000000075e+00 -3.215625000000000000e+01 -1.118475000000000108e+00 -3.212500000000000000e+01 -1.118480000000000141e+00 -3.221875000000000000e+01 -1.118485000000000174e+00 -3.221875000000000000e+01 -1.118489999999999984e+00 -3.215625000000000000e+01 -1.118495000000000017e+00 -3.218750000000000000e+01 -1.118500000000000050e+00 -3.215625000000000000e+01 -1.118505000000000082e+00 -3.218750000000000000e+01 -1.118510000000000115e+00 -3.209375381469726562e+01 -1.118515000000000148e+00 -3.218750000000000000e+01 -1.118520000000000181e+00 -3.215625000000000000e+01 -1.118524999999999991e+00 -3.215625000000000000e+01 -1.118530000000000024e+00 -3.212500000000000000e+01 -1.118535000000000057e+00 -3.209375381469726562e+01 -1.118540000000000090e+00 -3.209375381469726562e+01 -1.118545000000000122e+00 -3.212500000000000000e+01 -1.118550000000000155e+00 -3.206250000000000000e+01 -1.118555000000000188e+00 -3.206250000000000000e+01 -1.118559999999999999e+00 -3.209375381469726562e+01 -1.118565000000000031e+00 -3.206250000000000000e+01 -1.118570000000000064e+00 -3.212500000000000000e+01 -1.118575000000000097e+00 -3.209375381469726562e+01 -1.118580000000000130e+00 -3.209375381469726562e+01 -1.118585000000000163e+00 -3.203125000000000000e+01 -1.118590000000000195e+00 -3.209375381469726562e+01 -1.118595000000000006e+00 -3.206250000000000000e+01 -1.118600000000000039e+00 -3.206250000000000000e+01 -1.118605000000000071e+00 -3.209375381469726562e+01 -1.118610000000000104e+00 -3.209375381469726562e+01 -1.118615000000000137e+00 -3.206250000000000000e+01 -1.118620000000000170e+00 -3.203125000000000000e+01 -1.118625000000000203e+00 -3.203125000000000000e+01 -1.118630000000000013e+00 -3.203125000000000000e+01 -1.118635000000000046e+00 -3.200000000000000000e+01 -1.118640000000000079e+00 -3.203125000000000000e+01 -1.118645000000000111e+00 -3.203125000000000000e+01 -1.118650000000000144e+00 -3.203125000000000000e+01 -1.118655000000000177e+00 -3.203125000000000000e+01 -1.118659999999999988e+00 -3.193750190734863281e+01 -1.118665000000000020e+00 -3.203125000000000000e+01 -1.118670000000000053e+00 -3.203125000000000000e+01 -1.118675000000000086e+00 -3.200000000000000000e+01 -1.118680000000000119e+00 -3.200000000000000000e+01 -1.118685000000000151e+00 -3.196875000000000000e+01 -1.118690000000000184e+00 -3.193750190734863281e+01 -1.118694999999999995e+00 -3.203125000000000000e+01 -1.118700000000000028e+00 -3.203125000000000000e+01 -1.118705000000000060e+00 -3.196875000000000000e+01 -1.118710000000000093e+00 -3.203125000000000000e+01 -1.118715000000000126e+00 -3.193750190734863281e+01 -1.118720000000000159e+00 -3.200000000000000000e+01 -1.118725000000000191e+00 -3.193750190734863281e+01 -1.118730000000000002e+00 -3.184375190734863281e+01 -1.118735000000000035e+00 -3.193750190734863281e+01 -1.118740000000000068e+00 -3.190625000000000000e+01 -1.118745000000000100e+00 -3.196875000000000000e+01 -1.118750000000000133e+00 -3.196875000000000000e+01 -1.118755000000000166e+00 -3.190625000000000000e+01 -1.118760000000000199e+00 -3.190625000000000000e+01 -1.118765000000000009e+00 -3.190625000000000000e+01 -1.118770000000000042e+00 -3.190625000000000000e+01 -1.118775000000000075e+00 -3.190625000000000000e+01 -1.118780000000000108e+00 -3.184375190734863281e+01 -1.118785000000000140e+00 -3.187500000000000000e+01 -1.118790000000000173e+00 -3.187500000000000000e+01 -1.118794999999999984e+00 -3.184375190734863281e+01 -1.118800000000000017e+00 -3.187500000000000000e+01 -1.118805000000000049e+00 -3.184375190734863281e+01 -1.118810000000000082e+00 -3.181250000000000000e+01 -1.118815000000000115e+00 -3.181250000000000000e+01 -1.118820000000000148e+00 -3.178125190734863281e+01 -1.118825000000000180e+00 -3.187500000000000000e+01 -1.118829999999999991e+00 -3.181250000000000000e+01 -1.118835000000000024e+00 -3.184375190734863281e+01 -1.118840000000000057e+00 -3.181250000000000000e+01 -1.118845000000000089e+00 -3.178125190734863281e+01 -1.118850000000000122e+00 -3.184375190734863281e+01 -1.118855000000000155e+00 -3.184375190734863281e+01 -1.118860000000000188e+00 -3.184375190734863281e+01 -1.118864999999999998e+00 -3.178125190734863281e+01 -1.118870000000000031e+00 -3.181250000000000000e+01 -1.118875000000000064e+00 -3.181250000000000000e+01 -1.118880000000000097e+00 -3.178125190734863281e+01 -1.118885000000000129e+00 -3.181250000000000000e+01 -1.118890000000000162e+00 -3.175000190734863281e+01 -1.118895000000000195e+00 -3.171875000000000000e+01 -1.118900000000000006e+00 -3.178125190734863281e+01 -1.118905000000000038e+00 -3.178125190734863281e+01 -1.118910000000000071e+00 -3.178125190734863281e+01 -1.118915000000000104e+00 -3.178125190734863281e+01 -1.118920000000000137e+00 -3.171875000000000000e+01 -1.118925000000000169e+00 -3.171875000000000000e+01 -1.118930000000000202e+00 -3.165625000000000000e+01 -1.118935000000000013e+00 -3.168750190734863281e+01 -1.118940000000000046e+00 -3.165625000000000000e+01 -1.118945000000000078e+00 -3.171875000000000000e+01 -1.118950000000000111e+00 -3.168750190734863281e+01 -1.118955000000000144e+00 -3.175000190734863281e+01 -1.118960000000000177e+00 -3.168750190734863281e+01 -1.118964999999999987e+00 -3.175000190734863281e+01 -1.118970000000000020e+00 -3.168750190734863281e+01 -1.118975000000000053e+00 -3.165625000000000000e+01 -1.118980000000000086e+00 -3.165625000000000000e+01 -1.118985000000000118e+00 -3.168750190734863281e+01 -1.118990000000000151e+00 -3.168750190734863281e+01 -1.118995000000000184e+00 -3.168750190734863281e+01 -1.118999999999999995e+00 -3.168750190734863281e+01 -1.119005000000000027e+00 -3.168750190734863281e+01 -1.119010000000000060e+00 -3.159375190734863281e+01 -1.119015000000000093e+00 -3.168750190734863281e+01 -1.119020000000000126e+00 -3.165625000000000000e+01 -1.119025000000000158e+00 -3.162499809265136719e+01 -1.119030000000000191e+00 -3.159375190734863281e+01 -1.119035000000000002e+00 -3.162499809265136719e+01 -1.119040000000000035e+00 -3.159375190734863281e+01 -1.119045000000000067e+00 -3.165625000000000000e+01 -1.119050000000000100e+00 -3.162499809265136719e+01 -1.119055000000000133e+00 -3.159375190734863281e+01 -1.119060000000000166e+00 -3.159375190734863281e+01 -1.119065000000000198e+00 -3.162499809265136719e+01 -1.119070000000000009e+00 -3.159375190734863281e+01 -1.119075000000000042e+00 -3.156250000000000000e+01 -1.119080000000000075e+00 -3.156250000000000000e+01 -1.119085000000000107e+00 -3.162499809265136719e+01 -1.119090000000000140e+00 -3.153125190734863281e+01 -1.119095000000000173e+00 -3.153125190734863281e+01 -1.119099999999999984e+00 -3.153125190734863281e+01 -1.119105000000000016e+00 -3.150000000000000000e+01 -1.119110000000000049e+00 -3.150000000000000000e+01 -1.119115000000000082e+00 -3.150000000000000000e+01 -1.119120000000000115e+00 -3.153125190734863281e+01 -1.119125000000000147e+00 -3.153125190734863281e+01 -1.119130000000000180e+00 -3.143750190734863281e+01 -1.119134999999999991e+00 -3.150000000000000000e+01 -1.119140000000000024e+00 -3.150000000000000000e+01 -1.119145000000000056e+00 -3.146875000000000000e+01 -1.119150000000000089e+00 -3.140625000000000000e+01 -1.119155000000000122e+00 -3.140625000000000000e+01 -1.119160000000000155e+00 -3.143750190734863281e+01 -1.119165000000000187e+00 -3.140625000000000000e+01 -1.119169999999999998e+00 -3.143750190734863281e+01 -1.119175000000000031e+00 -3.140625000000000000e+01 -1.119180000000000064e+00 -3.140625000000000000e+01 -1.119185000000000096e+00 -3.143750190734863281e+01 -1.119190000000000129e+00 -3.137500190734863281e+01 -1.119195000000000162e+00 -3.143750190734863281e+01 -1.119200000000000195e+00 -3.140625000000000000e+01 -1.119205000000000005e+00 -3.140625000000000000e+01 -1.119210000000000038e+00 -3.143750190734863281e+01 -1.119215000000000071e+00 -3.143750190734863281e+01 -1.119220000000000104e+00 -3.143750190734863281e+01 -1.119225000000000136e+00 -3.131250000000000000e+01 -1.119230000000000169e+00 -3.137500190734863281e+01 -1.119235000000000202e+00 -3.140625000000000000e+01 -1.119240000000000013e+00 -3.131250000000000000e+01 -1.119245000000000045e+00 -3.131250000000000000e+01 -1.119250000000000078e+00 -3.134375000000000000e+01 -1.119255000000000111e+00 -3.134375000000000000e+01 -1.119260000000000144e+00 -3.134375000000000000e+01 -1.119265000000000176e+00 -3.134375000000000000e+01 -1.119269999999999987e+00 -3.131250000000000000e+01 -1.119275000000000020e+00 -3.134375000000000000e+01 -1.119280000000000053e+00 -3.134375000000000000e+01 -1.119285000000000085e+00 -3.137500190734863281e+01 -1.119290000000000118e+00 -3.128125190734863281e+01 -1.119295000000000151e+00 -3.137500190734863281e+01 -1.119300000000000184e+00 -3.131250000000000000e+01 -1.119304999999999994e+00 -3.134375000000000000e+01 -1.119310000000000027e+00 -3.125000000000000000e+01 -1.119315000000000060e+00 -3.134375000000000000e+01 -1.119320000000000093e+00 -3.131250000000000000e+01 -1.119325000000000125e+00 -3.131250000000000000e+01 -1.119330000000000158e+00 -3.128125190734863281e+01 -1.119335000000000191e+00 -3.128125190734863281e+01 -1.119340000000000002e+00 -3.121875000000000000e+01 -1.119345000000000034e+00 -3.128125190734863281e+01 -1.119350000000000067e+00 -3.125000000000000000e+01 -1.119355000000000100e+00 -3.128125190734863281e+01 -1.119360000000000133e+00 -3.128125190734863281e+01 -1.119365000000000165e+00 -3.125000000000000000e+01 -1.119370000000000198e+00 -3.128125190734863281e+01 -1.119375000000000009e+00 -3.128125190734863281e+01 -1.119380000000000042e+00 -3.131250000000000000e+01 -1.119385000000000074e+00 -3.128125190734863281e+01 -1.119390000000000107e+00 -3.125000000000000000e+01 -1.119395000000000140e+00 -3.128125190734863281e+01 -1.119400000000000173e+00 -3.125000000000000000e+01 -1.119404999999999983e+00 -3.121875000000000000e+01 -1.119410000000000016e+00 -3.128125190734863281e+01 -1.119415000000000049e+00 -3.121875000000000000e+01 -1.119420000000000082e+00 -3.121875000000000000e+01 -1.119425000000000114e+00 -3.121875000000000000e+01 -1.119430000000000147e+00 -3.125000000000000000e+01 -1.119435000000000180e+00 -3.118750000000000000e+01 -1.119439999999999991e+00 -3.121875000000000000e+01 -1.119445000000000023e+00 -3.118750000000000000e+01 -1.119450000000000056e+00 -3.121875000000000000e+01 -1.119455000000000089e+00 -3.128125190734863281e+01 -1.119460000000000122e+00 -3.109375000000000000e+01 -1.119465000000000154e+00 -3.115625190734863281e+01 -1.119470000000000187e+00 -3.121875000000000000e+01 -1.119474999999999998e+00 -3.118750000000000000e+01 -1.119480000000000031e+00 -3.112500190734863281e+01 -1.119485000000000063e+00 -3.115625190734863281e+01 -1.119490000000000096e+00 -3.112500190734863281e+01 -1.119495000000000129e+00 -3.112500190734863281e+01 -1.119500000000000162e+00 -3.115625190734863281e+01 -1.119505000000000194e+00 -3.106250000000000000e+01 -1.119510000000000005e+00 -3.109375000000000000e+01 -1.119515000000000038e+00 -3.103125000000000000e+01 -1.119520000000000071e+00 -3.103125000000000000e+01 -1.119525000000000103e+00 -3.106250000000000000e+01 -1.119530000000000136e+00 -3.106250000000000000e+01 -1.119535000000000169e+00 -3.103125000000000000e+01 -1.119540000000000202e+00 -3.100000190734863281e+01 -1.119545000000000012e+00 -3.106250000000000000e+01 -1.119550000000000045e+00 -3.106250000000000000e+01 -1.119555000000000078e+00 -3.106250000000000000e+01 -1.119560000000000111e+00 -3.103125000000000000e+01 -1.119565000000000143e+00 -3.100000190734863281e+01 -1.119570000000000176e+00 -3.100000190734863281e+01 -1.119574999999999987e+00 -3.103125000000000000e+01 -1.119580000000000020e+00 -3.100000190734863281e+01 -1.119585000000000052e+00 -3.100000190734863281e+01 -1.119590000000000085e+00 -3.100000190734863281e+01 -1.119595000000000118e+00 -3.100000190734863281e+01 -1.119600000000000151e+00 -3.100000190734863281e+01 -1.119605000000000183e+00 -3.093750000000000000e+01 -1.119609999999999994e+00 -3.093750000000000000e+01 -1.119615000000000027e+00 -3.096875000000000000e+01 -1.119620000000000060e+00 -3.093750000000000000e+01 -1.119625000000000092e+00 -3.096875000000000000e+01 -1.119630000000000125e+00 -3.100000190734863281e+01 -1.119635000000000158e+00 -3.096875000000000000e+01 -1.119640000000000191e+00 -3.096875000000000000e+01 -1.119645000000000001e+00 -3.096875000000000000e+01 -1.119650000000000034e+00 -3.096875000000000000e+01 -1.119655000000000067e+00 -3.093750000000000000e+01 -1.119660000000000100e+00 -3.096875000000000000e+01 -1.119665000000000132e+00 -3.096875000000000000e+01 -1.119670000000000165e+00 -3.096875000000000000e+01 -1.119675000000000198e+00 -3.093750000000000000e+01 -1.119680000000000009e+00 -3.096875000000000000e+01 -1.119685000000000041e+00 -3.087500190734863281e+01 -1.119690000000000074e+00 -3.087500190734863281e+01 -1.119695000000000107e+00 -3.090625000000000000e+01 -1.119700000000000140e+00 -3.090625000000000000e+01 -1.119705000000000172e+00 -3.090625000000000000e+01 -1.119709999999999983e+00 -3.096875000000000000e+01 -1.119715000000000016e+00 -3.090625000000000000e+01 -1.119720000000000049e+00 -3.093750000000000000e+01 -1.119725000000000081e+00 -3.090625000000000000e+01 -1.119730000000000114e+00 -3.090625000000000000e+01 -1.119735000000000147e+00 -3.084375190734863281e+01 -1.119740000000000180e+00 -3.090625000000000000e+01 -1.119744999999999990e+00 -3.084375190734863281e+01 -1.119750000000000023e+00 -3.090625000000000000e+01 -1.119755000000000056e+00 -3.084375190734863281e+01 -1.119760000000000089e+00 -3.078125000000000000e+01 -1.119765000000000121e+00 -3.087500190734863281e+01 -1.119770000000000154e+00 -3.087500190734863281e+01 -1.119775000000000187e+00 -3.081250000000000000e+01 -1.119779999999999998e+00 -3.081250000000000000e+01 -1.119785000000000030e+00 -3.081250000000000000e+01 -1.119790000000000063e+00 -3.078125000000000000e+01 -1.119795000000000096e+00 -3.081250000000000000e+01 -1.119800000000000129e+00 -3.081250000000000000e+01 -1.119805000000000161e+00 -3.081250000000000000e+01 -1.119810000000000194e+00 -3.078125000000000000e+01 -1.119815000000000005e+00 -3.081250000000000000e+01 -1.119820000000000038e+00 -3.071875190734863281e+01 -1.119825000000000070e+00 -3.075000000000000000e+01 -1.119830000000000103e+00 -3.078125000000000000e+01 -1.119835000000000136e+00 -3.075000000000000000e+01 -1.119840000000000169e+00 -3.078125000000000000e+01 -1.119845000000000201e+00 -3.081250000000000000e+01 -1.119850000000000012e+00 -3.078125000000000000e+01 -1.119855000000000045e+00 -3.071875190734863281e+01 -1.119860000000000078e+00 -3.071875190734863281e+01 -1.119865000000000110e+00 -3.071875190734863281e+01 -1.119870000000000143e+00 -3.068750000000000000e+01 -1.119875000000000176e+00 -3.068750000000000000e+01 -1.119879999999999987e+00 -3.075000000000000000e+01 -1.119885000000000019e+00 -3.075000000000000000e+01 -1.119890000000000052e+00 -3.071875190734863281e+01 -1.119895000000000085e+00 -3.075000000000000000e+01 -1.119900000000000118e+00 -3.071875190734863281e+01 -1.119905000000000150e+00 -3.068750000000000000e+01 -1.119910000000000183e+00 -3.065625000000000000e+01 -1.119914999999999994e+00 -3.062500000000000000e+01 -1.119920000000000027e+00 -3.065625000000000000e+01 -1.119925000000000059e+00 -3.065625000000000000e+01 -1.119930000000000092e+00 -3.065625000000000000e+01 -1.119935000000000125e+00 -3.068750000000000000e+01 -1.119940000000000158e+00 -3.071875190734863281e+01 -1.119945000000000190e+00 -3.065625000000000000e+01 -1.119950000000000001e+00 -3.065625000000000000e+01 -1.119955000000000034e+00 -3.062500000000000000e+01 -1.119960000000000067e+00 -3.062500000000000000e+01 -1.119965000000000099e+00 -3.062500000000000000e+01 -1.119970000000000132e+00 -3.065625000000000000e+01 -1.119975000000000165e+00 -3.059375190734863281e+01 -1.119980000000000198e+00 -3.059375190734863281e+01 -1.119985000000000008e+00 -3.059375190734863281e+01 -1.119990000000000041e+00 -3.059375190734863281e+01 -1.119995000000000074e+00 -3.062500000000000000e+01 -1.120000000000000107e+00 -3.059375190734863281e+01 -1.120005000000000139e+00 -3.062500000000000000e+01 -1.120010000000000172e+00 -3.059375190734863281e+01 -1.120014999999999983e+00 -3.059375190734863281e+01 -1.120020000000000016e+00 -3.056250190734863281e+01 -1.120025000000000048e+00 -3.053125000000000000e+01 -1.120030000000000081e+00 -3.053125000000000000e+01 -1.120035000000000114e+00 -3.046875000000000000e+01 -1.120040000000000147e+00 -3.053125000000000000e+01 -1.120045000000000179e+00 -3.053125000000000000e+01 -1.120049999999999990e+00 -3.050000000000000000e+01 -1.120055000000000023e+00 -3.046875000000000000e+01 -1.120060000000000056e+00 -3.050000000000000000e+01 -1.120065000000000088e+00 -3.050000000000000000e+01 -1.120070000000000121e+00 -3.050000000000000000e+01 -1.120075000000000154e+00 -3.050000000000000000e+01 -1.120080000000000187e+00 -3.053125000000000000e+01 -1.120084999999999997e+00 -3.053125000000000000e+01 -1.120090000000000030e+00 -3.050000000000000000e+01 -1.120095000000000063e+00 -3.050000000000000000e+01 -1.120100000000000096e+00 -3.040625190734863281e+01 -1.120105000000000128e+00 -3.050000000000000000e+01 -1.120110000000000161e+00 -3.050000000000000000e+01 -1.120115000000000194e+00 -3.043750190734863281e+01 -1.120120000000000005e+00 -3.046875000000000000e+01 -1.120125000000000037e+00 -3.037500000000000000e+01 -1.120130000000000070e+00 -3.046875000000000000e+01 -1.120135000000000103e+00 -3.040625190734863281e+01 -1.120140000000000136e+00 -3.043750190734863281e+01 -1.120145000000000168e+00 -3.043750190734863281e+01 -1.120150000000000201e+00 -3.037500000000000000e+01 -1.120155000000000012e+00 -3.040625190734863281e+01 -1.120160000000000045e+00 -3.025000000000000000e+01 -1.120165000000000077e+00 -3.034375000000000000e+01 -1.120170000000000110e+00 -3.028125190734863281e+01 -1.120175000000000143e+00 -3.028125190734863281e+01 -1.120180000000000176e+00 -3.031250000000000000e+01 -1.120184999999999986e+00 -3.025000000000000000e+01 -1.120190000000000019e+00 -3.028125190734863281e+01 -1.120195000000000052e+00 -3.028125190734863281e+01 -1.120200000000000085e+00 -3.031250000000000000e+01 -1.120205000000000117e+00 -3.028125190734863281e+01 -1.120210000000000150e+00 -3.021875000000000000e+01 -1.120215000000000183e+00 -3.025000000000000000e+01 -1.120219999999999994e+00 -3.015625190734863281e+01 -1.120225000000000026e+00 -3.018750000000000000e+01 -1.120230000000000059e+00 -3.015625190734863281e+01 -1.120235000000000092e+00 -3.006250000000000000e+01 -1.120240000000000125e+00 -3.003125000000000000e+01 -1.120245000000000157e+00 -3.015625190734863281e+01 -1.120250000000000190e+00 -3.009375000000000000e+01 -1.120255000000000001e+00 -3.003125000000000000e+01 -1.120260000000000034e+00 -2.996875190734863281e+01 -1.120265000000000066e+00 -3.003125000000000000e+01 -1.120270000000000099e+00 -3.000000190734863281e+01 -1.120275000000000132e+00 -3.003125000000000000e+01 -1.120280000000000165e+00 -3.000000190734863281e+01 -1.120285000000000197e+00 -3.000000190734863281e+01 -1.120290000000000008e+00 -2.996875190734863281e+01 -1.120295000000000041e+00 -2.993750000000000000e+01 -1.120300000000000074e+00 -2.990625000000000000e+01 -1.120305000000000106e+00 -2.984375190734863281e+01 -1.120310000000000139e+00 -2.984375190734863281e+01 -1.120315000000000172e+00 -2.978125000000000000e+01 -1.120319999999999983e+00 -2.978125000000000000e+01 -1.120325000000000015e+00 -2.971875190734863281e+01 -1.120330000000000048e+00 -2.965625000000000000e+01 -1.120335000000000081e+00 -2.956250190734863281e+01 -1.120340000000000114e+00 -2.943750190734863281e+01 -1.120345000000000146e+00 -2.931250000000000000e+01 -1.120350000000000179e+00 -2.915625000000000000e+01 -1.120354999999999990e+00 -2.906250000000000000e+01 -1.120360000000000023e+00 -2.884375190734863281e+01 -1.120365000000000055e+00 -2.865625000000000000e+01 -1.120370000000000088e+00 -2.846875000000000000e+01 -1.120375000000000121e+00 -2.818750000000000000e+01 -1.120380000000000154e+00 -2.796875190734863281e+01 -1.120385000000000186e+00 -2.765625000000000000e+01 -1.120389999999999997e+00 -2.731250000000000000e+01 -1.120395000000000030e+00 -2.700000000000000000e+01 -1.120400000000000063e+00 -2.659375000000000000e+01 -1.120405000000000095e+00 -2.621875190734863281e+01 -1.120410000000000128e+00 -2.575000000000000000e+01 -1.120415000000000161e+00 -2.518750000000000000e+01 -1.120420000000000194e+00 -2.468750000000000000e+01 -1.120425000000000004e+00 -2.415625000000000000e+01 -1.120430000000000037e+00 -2.350000190734863281e+01 -1.120435000000000070e+00 -2.284375000000000000e+01 -1.120440000000000103e+00 -2.218750190734863281e+01 -1.120445000000000135e+00 -2.140625000000000000e+01 -1.120450000000000168e+00 -2.068750000000000000e+01 -1.120455000000000201e+00 -1.978125000000000000e+01 -1.120460000000000012e+00 -1.890625000000000000e+01 -1.120465000000000044e+00 -1.796875000000000000e+01 -1.120470000000000077e+00 -1.709375000000000000e+01 -1.120475000000000110e+00 -1.609375000000000000e+01 -1.120480000000000143e+00 -1.512500000000000000e+01 -1.120485000000000175e+00 -1.409375000000000000e+01 -1.120489999999999986e+00 -1.303125000000000000e+01 -1.120495000000000019e+00 -1.203125095367431641e+01 -1.120500000000000052e+00 -1.109375095367431641e+01 -1.120505000000000084e+00 -1.000000000000000000e+01 -1.120510000000000117e+00 -9.000000953674316406e+00 -1.120515000000000150e+00 -8.093750000000000000e+00 -1.120520000000000183e+00 -7.031250476837158203e+00 -1.120524999999999993e+00 -6.156250476837158203e+00 -1.120530000000000026e+00 -5.187500476837158203e+00 -1.120535000000000059e+00 -4.312500000000000000e+00 -1.120540000000000092e+00 -3.437500000000000000e+00 -1.120545000000000124e+00 -2.500000000000000000e+00 -1.120550000000000157e+00 -1.593750119209289551e+00 -1.120555000000000190e+00 -7.812500000000000000e-01 -1.120560000000000000e+00 6.250000000000000000e-02 -1.120565000000000033e+00 8.125000000000000000e-01 -1.120570000000000066e+00 1.593750119209289551e+00 -1.120575000000000099e+00 2.375000238418579102e+00 -1.120580000000000132e+00 3.156250000000000000e+00 -1.120585000000000164e+00 3.843750000000000000e+00 -1.120590000000000197e+00 4.625000000000000000e+00 -1.120595000000000008e+00 5.312500000000000000e+00 -1.120600000000000041e+00 5.937500000000000000e+00 -1.120605000000000073e+00 6.593750476837158203e+00 -1.120610000000000106e+00 7.281250476837158203e+00 -1.120615000000000139e+00 7.875000000000000000e+00 -1.120620000000000172e+00 8.531250000000000000e+00 -1.120624999999999982e+00 9.062500000000000000e+00 -1.120630000000000015e+00 9.656250000000000000e+00 -1.120635000000000048e+00 1.028125000000000000e+01 -1.120640000000000081e+00 1.075000000000000000e+01 -1.120645000000000113e+00 1.131250095367431641e+01 -1.120650000000000146e+00 1.184375000000000000e+01 -1.120655000000000179e+00 1.225000095367431641e+01 -1.120659999999999989e+00 1.271875000000000000e+01 -1.120665000000000022e+00 1.318750095367431641e+01 -1.120670000000000055e+00 1.365625000000000000e+01 -1.120675000000000088e+00 1.406250095367431641e+01 -1.120680000000000121e+00 1.443750000000000000e+01 -1.120685000000000153e+00 1.481250000000000000e+01 -1.120690000000000186e+00 1.521875095367431641e+01 -1.120694999999999997e+00 1.556250095367431641e+01 -1.120700000000000029e+00 1.600000000000000000e+01 -1.120705000000000062e+00 1.628125000000000000e+01 -1.120710000000000095e+00 1.656250190734863281e+01 -1.120715000000000128e+00 1.690625000000000000e+01 -1.120720000000000161e+00 1.715625000000000000e+01 -1.120725000000000193e+00 1.743750000000000000e+01 -1.120730000000000004e+00 1.768750000000000000e+01 -1.120735000000000037e+00 1.800000190734863281e+01 -1.120740000000000069e+00 1.812500000000000000e+01 -1.120745000000000102e+00 1.843750190734863281e+01 -1.120750000000000135e+00 1.856250190734863281e+01 -1.120755000000000168e+00 1.878125000000000000e+01 -1.120760000000000201e+00 1.890625000000000000e+01 -1.120765000000000011e+00 1.906250000000000000e+01 -1.120770000000000044e+00 1.928125190734863281e+01 -1.120775000000000077e+00 1.937500000000000000e+01 -1.120780000000000109e+00 1.953125000000000000e+01 -1.120785000000000142e+00 1.965625000000000000e+01 -1.120790000000000175e+00 1.978125000000000000e+01 -1.120794999999999986e+00 1.987500190734863281e+01 -1.120800000000000018e+00 1.993750000000000000e+01 -1.120805000000000051e+00 2.006250000000000000e+01 -1.120810000000000084e+00 2.009375000000000000e+01 -1.120815000000000117e+00 2.028125000000000000e+01 -1.120820000000000149e+00 2.021875000000000000e+01 -1.120825000000000182e+00 2.025000000000000000e+01 -1.120829999999999993e+00 2.031250190734863281e+01 -1.120835000000000026e+00 2.031250190734863281e+01 -1.120840000000000058e+00 2.031250190734863281e+01 -1.120845000000000091e+00 2.034375000000000000e+01 -1.120850000000000124e+00 2.028125000000000000e+01 -1.120855000000000157e+00 2.021875000000000000e+01 -1.120860000000000190e+00 2.025000000000000000e+01 -1.120865000000000000e+00 2.015625190734863281e+01 -1.120870000000000033e+00 2.012500000000000000e+01 -1.120875000000000066e+00 2.006250000000000000e+01 -1.120880000000000098e+00 2.000000000000000000e+01 -1.120885000000000131e+00 2.000000000000000000e+01 -1.120890000000000164e+00 1.981250000000000000e+01 -1.120895000000000197e+00 1.978125000000000000e+01 -1.120900000000000007e+00 1.962500000000000000e+01 -1.120905000000000040e+00 1.956250000000000000e+01 -1.120910000000000073e+00 1.943750190734863281e+01 -1.120915000000000106e+00 1.928125190734863281e+01 -1.120920000000000138e+00 1.915625190734863281e+01 -1.120925000000000171e+00 1.909375000000000000e+01 -1.120929999999999982e+00 1.893750000000000000e+01 -1.120935000000000015e+00 1.871875190734863281e+01 -1.120940000000000047e+00 1.862500000000000000e+01 -1.120945000000000080e+00 1.850000000000000000e+01 -1.120950000000000113e+00 1.834375000000000000e+01 -1.120955000000000146e+00 1.818750000000000000e+01 -1.120960000000000178e+00 1.803125000000000000e+01 -1.120964999999999989e+00 1.790625000000000000e+01 -1.120970000000000022e+00 1.768750000000000000e+01 -1.120975000000000055e+00 1.746875000000000000e+01 -1.120980000000000087e+00 1.728125190734863281e+01 -1.120985000000000120e+00 1.706250000000000000e+01 -1.120990000000000153e+00 1.690625000000000000e+01 -1.120995000000000186e+00 1.671875000000000000e+01 -1.120999999999999996e+00 1.650000000000000000e+01 -1.121005000000000029e+00 1.631250000000000000e+01 -1.121010000000000062e+00 1.606250000000000000e+01 -1.121015000000000095e+00 1.581249904632568359e+01 -1.121020000000000127e+00 1.559375000000000000e+01 -1.121025000000000160e+00 1.537500000000000000e+01 -1.121030000000000193e+00 1.512500000000000000e+01 -1.121035000000000004e+00 1.490625000000000000e+01 -1.121040000000000036e+00 1.462500095367431641e+01 -1.121045000000000069e+00 1.443750000000000000e+01 -1.121050000000000102e+00 1.415625000000000000e+01 -1.121055000000000135e+00 1.387500000000000000e+01 -1.121060000000000167e+00 1.368750095367431641e+01 -1.121065000000000200e+00 1.343750000000000000e+01 -1.121070000000000011e+00 1.318750095367431641e+01 -1.121075000000000044e+00 1.300000000000000000e+01 -1.121080000000000076e+00 1.265625000000000000e+01 -1.121085000000000109e+00 1.243750000000000000e+01 -1.121090000000000142e+00 1.215625000000000000e+01 -1.121095000000000175e+00 1.187500000000000000e+01 -1.121099999999999985e+00 1.159375095367431641e+01 -1.121105000000000018e+00 1.134375000000000000e+01 -1.121110000000000051e+00 1.118750000000000000e+01 -1.121115000000000084e+00 1.078125000000000000e+01 -1.121120000000000116e+00 1.053125000000000000e+01 -1.121125000000000149e+00 1.025000000000000000e+01 -1.121130000000000182e+00 1.003125000000000000e+01 -1.121134999999999993e+00 9.718750953674316406e+00 -1.121140000000000025e+00 9.500000953674316406e+00 -1.121145000000000058e+00 9.156250000000000000e+00 -1.121150000000000091e+00 8.843750000000000000e+00 -1.121155000000000124e+00 8.625000000000000000e+00 -1.121160000000000156e+00 8.281250953674316406e+00 -1.121165000000000189e+00 8.031250000000000000e+00 -1.121170000000000000e+00 7.718750476837158203e+00 -1.121175000000000033e+00 7.437500000000000000e+00 -1.121180000000000065e+00 7.062500476837158203e+00 -1.121185000000000098e+00 6.812500476837158203e+00 -1.121190000000000131e+00 6.562500476837158203e+00 -1.121195000000000164e+00 6.250000000000000000e+00 -1.121200000000000196e+00 5.937500000000000000e+00 -1.121205000000000007e+00 5.593750000000000000e+00 -1.121210000000000040e+00 5.343750000000000000e+00 -1.121215000000000073e+00 5.000000000000000000e+00 -1.121220000000000105e+00 4.718750476837158203e+00 -1.121225000000000138e+00 4.500000476837158203e+00 -1.121230000000000171e+00 4.125000000000000000e+00 -1.121234999999999982e+00 3.843750000000000000e+00 -1.121240000000000014e+00 3.500000000000000000e+00 -1.121245000000000047e+00 3.218750000000000000e+00 -1.121250000000000080e+00 2.968750000000000000e+00 -1.121255000000000113e+00 2.687500000000000000e+00 -1.121260000000000145e+00 2.375000238418579102e+00 -1.121265000000000178e+00 2.031250238418579102e+00 -1.121269999999999989e+00 1.750000000000000000e+00 -1.121275000000000022e+00 1.343750000000000000e+00 -1.121280000000000054e+00 1.125000119209289551e+00 -1.121285000000000087e+00 8.750000000000000000e-01 -1.121290000000000120e+00 5.937500596046447754e-01 -1.121295000000000153e+00 2.812500298023223877e-01 -1.121300000000000185e+00 -1.250000000000000000e-01 -1.121304999999999996e+00 -2.812500298023223877e-01 -1.121310000000000029e+00 -5.937500596046447754e-01 -1.121315000000000062e+00 -8.437500000000000000e-01 -1.121320000000000094e+00 -1.125000119209289551e+00 -1.121325000000000127e+00 -1.468750119209289551e+00 -1.121330000000000160e+00 -1.687500000000000000e+00 -1.121335000000000193e+00 -2.093750000000000000e+00 -1.121340000000000003e+00 -2.312500000000000000e+00 -1.121345000000000036e+00 -2.593750238418579102e+00 -1.121350000000000069e+00 -2.875000000000000000e+00 -1.121355000000000102e+00 -3.156250000000000000e+00 -1.121360000000000134e+00 -3.437500000000000000e+00 -1.121365000000000167e+00 -3.750000238418579102e+00 -1.121370000000000200e+00 -3.968750238418579102e+00 -1.121375000000000011e+00 -4.281250476837158203e+00 -1.121380000000000043e+00 -4.562500000000000000e+00 -1.121385000000000076e+00 -4.781250000000000000e+00 -1.121390000000000109e+00 -5.062500000000000000e+00 -1.121395000000000142e+00 -5.343750000000000000e+00 -1.121400000000000174e+00 -5.625000000000000000e+00 -1.121404999999999985e+00 -5.875000476837158203e+00 -1.121410000000000018e+00 -6.156250476837158203e+00 -1.121415000000000051e+00 -6.468750000000000000e+00 -1.121420000000000083e+00 -6.625000000000000000e+00 -1.121425000000000116e+00 -7.000000000000000000e+00 -1.121430000000000149e+00 -7.187500000000000000e+00 -1.121435000000000182e+00 -7.437500000000000000e+00 -1.121439999999999992e+00 -7.687500000000000000e+00 -1.121445000000000025e+00 -7.875000000000000000e+00 -1.121450000000000058e+00 -8.218750000000000000e+00 -1.121455000000000091e+00 -8.406250000000000000e+00 -1.121460000000000123e+00 -8.750000000000000000e+00 -1.121465000000000156e+00 -8.968750000000000000e+00 -1.121470000000000189e+00 -9.187500000000000000e+00 -1.121475000000000000e+00 -9.437500953674316406e+00 -1.121480000000000032e+00 -9.656250000000000000e+00 -1.121485000000000065e+00 -9.875000000000000000e+00 -1.121490000000000098e+00 -1.015625095367431641e+01 -1.121495000000000131e+00 -1.034375000000000000e+01 -1.121500000000000163e+00 -1.059375095367431641e+01 -1.121505000000000196e+00 -1.084375000000000000e+01 -1.121510000000000007e+00 -1.106250000000000000e+01 -1.121515000000000040e+00 -1.131250095367431641e+01 -1.121520000000000072e+00 -1.150000000000000000e+01 -1.121525000000000105e+00 -1.171875000000000000e+01 -1.121530000000000138e+00 -1.203125095367431641e+01 -1.121535000000000171e+00 -1.215625000000000000e+01 -1.121539999999999981e+00 -1.240625000000000000e+01 -1.121545000000000014e+00 -1.262500000000000000e+01 -1.121550000000000047e+00 -1.281250000000000000e+01 -1.121555000000000080e+00 -1.306250000000000000e+01 -1.121560000000000112e+00 -1.321875000000000000e+01 -1.121565000000000145e+00 -1.343750000000000000e+01 -1.121570000000000178e+00 -1.368750095367431641e+01 -1.121574999999999989e+00 -1.381250000000000000e+01 -1.121580000000000021e+00 -1.403125000000000000e+01 -1.121585000000000054e+00 -1.425000000000000000e+01 -1.121590000000000087e+00 -1.437500000000000000e+01 -1.121595000000000120e+00 -1.465625000000000000e+01 -1.121600000000000152e+00 -1.484375095367431641e+01 -1.121605000000000185e+00 -1.493750000000000000e+01 -1.121609999999999996e+00 -1.515625000000000000e+01 -1.121615000000000029e+00 -1.534375000000000000e+01 -1.121620000000000061e+00 -1.553125000000000000e+01 -1.121625000000000094e+00 -1.571875095367431641e+01 -1.121630000000000127e+00 -1.590625000000000000e+01 -1.121635000000000160e+00 -1.609375000000000000e+01 -1.121640000000000192e+00 -1.621875000000000000e+01 -1.121645000000000003e+00 -1.646875000000000000e+01 -1.121650000000000036e+00 -1.653125000000000000e+01 -1.121655000000000069e+00 -1.678125000000000000e+01 -1.121660000000000101e+00 -1.690625000000000000e+01 -1.121665000000000134e+00 -1.709375000000000000e+01 -1.121670000000000167e+00 -1.728125190734863281e+01 -1.121675000000000200e+00 -1.740625190734863281e+01 -1.121680000000000010e+00 -1.759375000000000000e+01 -1.121685000000000043e+00 -1.771875190734863281e+01 -1.121690000000000076e+00 -1.790625000000000000e+01 -1.121695000000000109e+00 -1.803125000000000000e+01 -1.121700000000000141e+00 -1.821875000000000000e+01 -1.121705000000000174e+00 -1.837500000000000000e+01 -1.121709999999999985e+00 -1.853125000000000000e+01 -1.121715000000000018e+00 -1.871875190734863281e+01 -1.121720000000000050e+00 -1.884375000000000000e+01 -1.121725000000000083e+00 -1.900000190734863281e+01 -1.121730000000000116e+00 -1.912500000000000000e+01 -1.121735000000000149e+00 -1.931250000000000000e+01 -1.121740000000000181e+00 -1.946875000000000000e+01 -1.121744999999999992e+00 -1.953125000000000000e+01 -1.121750000000000025e+00 -1.965625000000000000e+01 -1.121755000000000058e+00 -1.981250000000000000e+01 -1.121760000000000090e+00 -1.990625000000000000e+01 -1.121765000000000123e+00 -2.003125190734863281e+01 -1.121770000000000156e+00 -2.021875000000000000e+01 -1.121775000000000189e+00 -2.034375000000000000e+01 -1.121779999999999999e+00 -2.046875190734863281e+01 -1.121785000000000032e+00 -2.065625000000000000e+01 -1.121790000000000065e+00 -2.078125000000000000e+01 -1.121795000000000098e+00 -2.084375000000000000e+01 -1.121800000000000130e+00 -2.093750000000000000e+01 -1.121805000000000163e+00 -2.106250000000000000e+01 -1.121810000000000196e+00 -2.128125000000000000e+01 -1.121815000000000007e+00 -2.134375000000000000e+01 -1.121820000000000039e+00 -2.146875190734863281e+01 -1.121825000000000072e+00 -2.162500190734863281e+01 -1.121830000000000105e+00 -2.168750000000000000e+01 -1.121835000000000138e+00 -2.187500000000000000e+01 -1.121840000000000170e+00 -2.190625190734863281e+01 -1.121844999999999981e+00 -2.209375000000000000e+01 -1.121850000000000014e+00 -2.215625000000000000e+01 -1.121855000000000047e+00 -2.225000000000000000e+01 -1.121860000000000079e+00 -2.228125000000000000e+01 -1.121865000000000112e+00 -2.250000000000000000e+01 -1.121870000000000145e+00 -2.250000000000000000e+01 -1.121875000000000178e+00 -2.265625000000000000e+01 -1.121879999999999988e+00 -2.271875000000000000e+01 -1.121885000000000021e+00 -2.290625190734863281e+01 -1.121890000000000054e+00 -2.290625190734863281e+01 -1.121895000000000087e+00 -2.306250190734863281e+01 -1.121900000000000119e+00 -2.315625000000000000e+01 -1.121905000000000152e+00 -2.325000000000000000e+01 -1.121910000000000185e+00 -2.337500000000000000e+01 -1.121914999999999996e+00 -2.346875000000000000e+01 -1.121920000000000028e+00 -2.350000190734863281e+01 -1.121925000000000061e+00 -2.359375000000000000e+01 -1.121930000000000094e+00 -2.368750000000000000e+01 -1.121935000000000127e+00 -2.381250000000000000e+01 -1.121940000000000159e+00 -2.393750190734863281e+01 -1.121945000000000192e+00 -2.400000000000000000e+01 -1.121950000000000003e+00 -2.412500000000000000e+01 -1.121955000000000036e+00 -2.421875190734863281e+01 -1.121960000000000068e+00 -2.428125000000000000e+01 -1.121965000000000101e+00 -2.440625000000000000e+01 -1.121970000000000134e+00 -2.450000190734863281e+01 -1.121975000000000167e+00 -2.450000190734863281e+01 -1.121980000000000199e+00 -2.459375000000000000e+01 -1.121985000000000010e+00 -2.471875000000000000e+01 -1.121990000000000043e+00 -2.478125190734863281e+01 -1.121995000000000076e+00 -2.484375000000000000e+01 -1.122000000000000108e+00 -2.490625000000000000e+01 -1.122005000000000141e+00 -2.500000000000000000e+01 -1.122010000000000174e+00 -2.512500000000000000e+01 -1.122014999999999985e+00 -2.515625000000000000e+01 -1.122020000000000017e+00 -2.521875190734863281e+01 -1.122025000000000050e+00 -2.534375000000000000e+01 -1.122030000000000083e+00 -2.546875000000000000e+01 -1.122035000000000116e+00 -2.546875000000000000e+01 -1.122040000000000148e+00 -2.556250000000000000e+01 -1.122045000000000181e+00 -2.556250000000000000e+01 -1.122049999999999992e+00 -2.575000000000000000e+01 -1.122055000000000025e+00 -2.575000000000000000e+01 -1.122060000000000057e+00 -2.581250190734863281e+01 -1.122065000000000090e+00 -2.593750190734863281e+01 -1.122070000000000123e+00 -2.596875000000000000e+01 -1.122075000000000156e+00 -2.603125000000000000e+01 -1.122080000000000188e+00 -2.609375190734863281e+01 -1.122084999999999999e+00 -2.615625000000000000e+01 -1.122090000000000032e+00 -2.621875190734863281e+01 -1.122095000000000065e+00 -2.621875190734863281e+01 -1.122100000000000097e+00 -2.640625000000000000e+01 -1.122105000000000130e+00 -2.643750000000000000e+01 -1.122110000000000163e+00 -2.643750000000000000e+01 -1.122115000000000196e+00 -2.653125190734863281e+01 -1.122120000000000006e+00 -2.656250000000000000e+01 -1.122125000000000039e+00 -2.665625190734863281e+01 -1.122130000000000072e+00 -2.671875000000000000e+01 -1.122135000000000105e+00 -2.675000000000000000e+01 -1.122140000000000137e+00 -2.690625000000000000e+01 -1.122145000000000170e+00 -2.690625000000000000e+01 -1.122149999999999981e+00 -2.700000000000000000e+01 -1.122155000000000014e+00 -2.696875190734863281e+01 -1.122160000000000046e+00 -2.700000000000000000e+01 -1.122165000000000079e+00 -2.706250000000000000e+01 -1.122170000000000112e+00 -2.712500000000000000e+01 -1.122175000000000145e+00 -2.721875000000000000e+01 -1.122180000000000177e+00 -2.728125000000000000e+01 -1.122184999999999988e+00 -2.728125000000000000e+01 -1.122190000000000021e+00 -2.740625190734863281e+01 -1.122195000000000054e+00 -2.737500190734863281e+01 -1.122200000000000086e+00 -2.746875000000000000e+01 -1.122205000000000119e+00 -2.750000000000000000e+01 -1.122210000000000152e+00 -2.753125190734863281e+01 -1.122215000000000185e+00 -2.762500000000000000e+01 -1.122219999999999995e+00 -2.768750190734863281e+01 -1.122225000000000028e+00 -2.771875000000000000e+01 -1.122230000000000061e+00 -2.778125000000000000e+01 -1.122235000000000094e+00 -2.778125000000000000e+01 -1.122240000000000126e+00 -2.784375190734863281e+01 -1.122245000000000159e+00 -2.790625000000000000e+01 -1.122250000000000192e+00 -2.790625000000000000e+01 -1.122255000000000003e+00 -2.796875190734863281e+01 -1.122260000000000035e+00 -2.803125000000000000e+01 -1.122265000000000068e+00 -2.812500190734863281e+01 -1.122270000000000101e+00 -2.812500190734863281e+01 -1.122275000000000134e+00 -2.818750000000000000e+01 -1.122280000000000166e+00 -2.818750000000000000e+01 -1.122285000000000199e+00 -2.821875000000000000e+01 -1.122290000000000010e+00 -2.821875000000000000e+01 -1.122295000000000043e+00 -2.828125190734863281e+01 -1.122300000000000075e+00 -2.834375000000000000e+01 -1.122305000000000108e+00 -2.843750000000000000e+01 -1.122310000000000141e+00 -2.840625190734863281e+01 -1.122315000000000174e+00 -2.846875000000000000e+01 -1.122319999999999984e+00 -2.853125190734863281e+01 -1.122325000000000017e+00 -2.859375000000000000e+01 -1.122330000000000050e+00 -2.853125190734863281e+01 -1.122335000000000083e+00 -2.862500000000000000e+01 -1.122340000000000115e+00 -2.862500000000000000e+01 -1.122345000000000148e+00 -2.868750190734863281e+01 -1.122350000000000181e+00 -2.875000000000000000e+01 -1.122354999999999992e+00 -2.881250000000000000e+01 -1.122360000000000024e+00 -2.884375190734863281e+01 -1.122365000000000057e+00 -2.881250000000000000e+01 -1.122370000000000090e+00 -2.887500000000000000e+01 -1.122375000000000123e+00 -2.900000190734863281e+01 -1.122380000000000155e+00 -2.900000190734863281e+01 -1.122385000000000188e+00 -2.900000190734863281e+01 -1.122389999999999999e+00 -2.903125000000000000e+01 -1.122395000000000032e+00 -2.903125000000000000e+01 -1.122400000000000064e+00 -2.906250000000000000e+01 -1.122405000000000097e+00 -2.912500190734863281e+01 -1.122410000000000130e+00 -2.918750000000000000e+01 -1.122415000000000163e+00 -2.918750000000000000e+01 -1.122420000000000195e+00 -2.928125190734863281e+01 -1.122425000000000006e+00 -2.928125190734863281e+01 -1.122430000000000039e+00 -2.921875000000000000e+01 -1.122435000000000072e+00 -2.925000190734863281e+01 -1.122440000000000104e+00 -2.940625190734863281e+01 -1.122445000000000137e+00 -2.934375000000000000e+01 -1.122450000000000170e+00 -2.940625190734863281e+01 -1.122455000000000203e+00 -2.946875000000000000e+01 -1.122460000000000013e+00 -2.943750190734863281e+01 -1.122465000000000046e+00 -2.950000000000000000e+01 -1.122470000000000079e+00 -2.956250190734863281e+01 -1.122475000000000112e+00 -2.956250190734863281e+01 -1.122480000000000144e+00 -2.959375000000000000e+01 -1.122485000000000177e+00 -2.965625000000000000e+01 -1.122489999999999988e+00 -2.968750190734863281e+01 -1.122495000000000021e+00 -2.965625000000000000e+01 -1.122500000000000053e+00 -2.965625000000000000e+01 -1.122505000000000086e+00 -2.971875190734863281e+01 -1.122510000000000119e+00 -2.971875190734863281e+01 -1.122515000000000152e+00 -2.975000000000000000e+01 -1.122520000000000184e+00 -2.981250000000000000e+01 -1.122524999999999995e+00 -2.987500000000000000e+01 -1.122530000000000028e+00 -2.984375190734863281e+01 -1.122535000000000061e+00 -2.987500000000000000e+01 -1.122540000000000093e+00 -2.984375190734863281e+01 -1.122545000000000126e+00 -2.990625000000000000e+01 -1.122550000000000159e+00 -3.000000190734863281e+01 -1.122555000000000192e+00 -3.000000190734863281e+01 -1.122560000000000002e+00 -3.003125000000000000e+01 -1.122565000000000035e+00 -3.009375000000000000e+01 -1.122570000000000068e+00 -3.009375000000000000e+01 -1.122575000000000101e+00 -3.015625190734863281e+01 -1.122580000000000133e+00 -3.015625190734863281e+01 -1.122585000000000166e+00 -3.021875000000000000e+01 -1.122590000000000199e+00 -3.028125190734863281e+01 -1.122595000000000010e+00 -3.031250000000000000e+01 -1.122600000000000042e+00 -3.031250000000000000e+01 -1.122605000000000075e+00 -3.031250000000000000e+01 -1.122610000000000108e+00 -3.031250000000000000e+01 -1.122615000000000141e+00 -3.043750190734863281e+01 -1.122620000000000173e+00 -3.037500000000000000e+01 -1.122624999999999984e+00 -3.043750190734863281e+01 -1.122630000000000017e+00 -3.046875000000000000e+01 -1.122635000000000050e+00 -3.050000000000000000e+01 -1.122640000000000082e+00 -3.050000000000000000e+01 -1.122645000000000115e+00 -3.050000000000000000e+01 -1.122650000000000148e+00 -3.053125000000000000e+01 -1.122655000000000181e+00 -3.062500000000000000e+01 -1.122659999999999991e+00 -3.059375190734863281e+01 -1.122665000000000024e+00 -3.068750000000000000e+01 -1.122670000000000057e+00 -3.065625000000000000e+01 -1.122675000000000090e+00 -3.065625000000000000e+01 -1.122680000000000122e+00 -3.071875190734863281e+01 -1.122685000000000155e+00 -3.075000000000000000e+01 -1.122690000000000188e+00 -3.075000000000000000e+01 -1.122694999999999999e+00 -3.075000000000000000e+01 -1.122700000000000031e+00 -3.084375190734863281e+01 -1.122705000000000064e+00 -3.084375190734863281e+01 -1.122710000000000097e+00 -3.087500190734863281e+01 -1.122715000000000130e+00 -3.093750000000000000e+01 -1.122720000000000162e+00 -3.090625000000000000e+01 -1.122725000000000195e+00 -3.090625000000000000e+01 -1.122730000000000006e+00 -3.096875000000000000e+01 -1.122735000000000039e+00 -3.096875000000000000e+01 -1.122740000000000071e+00 -3.100000190734863281e+01 -1.122745000000000104e+00 -3.096875000000000000e+01 -1.122750000000000137e+00 -3.096875000000000000e+01 -1.122755000000000170e+00 -3.100000190734863281e+01 -1.122760000000000202e+00 -3.100000190734863281e+01 -1.122765000000000013e+00 -3.100000190734863281e+01 -1.122770000000000046e+00 -3.109375000000000000e+01 -1.122775000000000079e+00 -3.109375000000000000e+01 -1.122780000000000111e+00 -3.112500190734863281e+01 -1.122785000000000144e+00 -3.112500190734863281e+01 -1.122790000000000177e+00 -3.112500190734863281e+01 -1.122794999999999987e+00 -3.115625190734863281e+01 -1.122800000000000020e+00 -3.118750000000000000e+01 -1.122805000000000053e+00 -3.128125190734863281e+01 -1.122810000000000086e+00 -3.121875000000000000e+01 -1.122815000000000119e+00 -3.128125190734863281e+01 -1.122820000000000151e+00 -3.128125190734863281e+01 -1.122825000000000184e+00 -3.128125190734863281e+01 -1.122829999999999995e+00 -3.134375000000000000e+01 -1.122835000000000027e+00 -3.140625000000000000e+01 -1.122840000000000060e+00 -3.137500190734863281e+01 -1.122845000000000093e+00 -3.143750190734863281e+01 -1.122850000000000126e+00 -3.153125190734863281e+01 -1.122855000000000159e+00 -3.146875000000000000e+01 -1.122860000000000191e+00 -3.146875000000000000e+01 -1.122865000000000002e+00 -3.150000000000000000e+01 -1.122870000000000035e+00 -3.150000000000000000e+01 -1.122875000000000068e+00 -3.153125190734863281e+01 -1.122880000000000100e+00 -3.162499809265136719e+01 -1.122885000000000133e+00 -3.153125190734863281e+01 -1.122890000000000166e+00 -3.162499809265136719e+01 -1.122895000000000199e+00 -3.156250000000000000e+01 -1.122900000000000009e+00 -3.153125190734863281e+01 -1.122905000000000042e+00 -3.168750190734863281e+01 -1.122910000000000075e+00 -3.165625000000000000e+01 -1.122915000000000108e+00 -3.165625000000000000e+01 -1.122920000000000140e+00 -3.168750190734863281e+01 -1.122925000000000173e+00 -3.168750190734863281e+01 -1.122929999999999984e+00 -3.168750190734863281e+01 -1.122935000000000016e+00 -3.171875000000000000e+01 -1.122940000000000049e+00 -3.178125190734863281e+01 -1.122945000000000082e+00 -3.171875000000000000e+01 -1.122950000000000115e+00 -3.178125190734863281e+01 -1.122955000000000148e+00 -3.184375190734863281e+01 -1.122960000000000180e+00 -3.184375190734863281e+01 -1.122964999999999991e+00 -3.181250000000000000e+01 -1.122970000000000024e+00 -3.184375190734863281e+01 -1.122975000000000056e+00 -3.184375190734863281e+01 -1.122980000000000089e+00 -3.187500000000000000e+01 -1.122985000000000122e+00 -3.193750190734863281e+01 -1.122990000000000155e+00 -3.190625000000000000e+01 -1.122995000000000188e+00 -3.196875000000000000e+01 -1.122999999999999998e+00 -3.193750190734863281e+01 -1.123005000000000031e+00 -3.200000000000000000e+01 -1.123010000000000064e+00 -3.203125000000000000e+01 -1.123015000000000096e+00 -3.200000000000000000e+01 -1.123020000000000129e+00 -3.203125000000000000e+01 -1.123025000000000162e+00 -3.203125000000000000e+01 -1.123030000000000195e+00 -3.203125000000000000e+01 -1.123035000000000005e+00 -3.203125000000000000e+01 -1.123040000000000038e+00 -3.203125000000000000e+01 -1.123045000000000071e+00 -3.206250000000000000e+01 -1.123050000000000104e+00 -3.209375381469726562e+01 -1.123055000000000136e+00 -3.215625000000000000e+01 -1.123060000000000169e+00 -3.215625000000000000e+01 -1.123065000000000202e+00 -3.218750000000000000e+01 -1.123070000000000013e+00 -3.215625000000000000e+01 -1.123075000000000045e+00 -3.218750000000000000e+01 -1.123080000000000078e+00 -3.218750000000000000e+01 -1.123085000000000111e+00 -3.228125000000000000e+01 -1.123090000000000144e+00 -3.228125000000000000e+01 -1.123095000000000176e+00 -3.225000381469726562e+01 -1.123099999999999987e+00 -3.228125000000000000e+01 -1.123105000000000020e+00 -3.228125000000000000e+01 -1.123110000000000053e+00 -3.237500000000000000e+01 -1.123115000000000085e+00 -3.234375000000000000e+01 -1.123120000000000118e+00 -3.237500000000000000e+01 -1.123125000000000151e+00 -3.237500000000000000e+01 -1.123130000000000184e+00 -3.246875000000000000e+01 -1.123134999999999994e+00 -3.243750000000000000e+01 -1.123140000000000027e+00 -3.246875000000000000e+01 -1.123145000000000060e+00 -3.246875000000000000e+01 -1.123150000000000093e+00 -3.243750000000000000e+01 -1.123155000000000125e+00 -3.253125000000000000e+01 -1.123160000000000158e+00 -3.246875000000000000e+01 -1.123165000000000191e+00 -3.246875000000000000e+01 -1.123170000000000002e+00 -3.246875000000000000e+01 -1.123175000000000034e+00 -3.246875000000000000e+01 -1.123180000000000067e+00 -3.250000381469726562e+01 -1.123185000000000100e+00 -3.250000381469726562e+01 -1.123190000000000133e+00 -3.256250000000000000e+01 -1.123195000000000165e+00 -3.259375000000000000e+01 -1.123200000000000198e+00 -3.256250000000000000e+01 -1.123205000000000009e+00 -3.265625381469726562e+01 -1.123210000000000042e+00 -3.262500000000000000e+01 -1.123215000000000074e+00 -3.271875000000000000e+01 -1.123220000000000107e+00 -3.271875000000000000e+01 -1.123225000000000140e+00 -3.265625381469726562e+01 -1.123230000000000173e+00 -3.271875000000000000e+01 -1.123234999999999983e+00 -3.268750000000000000e+01 -1.123240000000000016e+00 -3.278125000000000000e+01 -1.123245000000000049e+00 -3.278125000000000000e+01 -1.123250000000000082e+00 -3.278125000000000000e+01 -1.123255000000000114e+00 -3.281250381469726562e+01 -1.123260000000000147e+00 -3.287500000000000000e+01 -1.123265000000000180e+00 -3.287500000000000000e+01 -1.123269999999999991e+00 -3.290625000000000000e+01 -1.123275000000000023e+00 -3.290625000000000000e+01 -1.123280000000000056e+00 -3.293750000000000000e+01 -1.123285000000000089e+00 -3.296875381469726562e+01 -1.123290000000000122e+00 -3.293750000000000000e+01 -1.123295000000000154e+00 -3.293750000000000000e+01 -1.123300000000000187e+00 -3.300000000000000000e+01 -1.123304999999999998e+00 -3.300000000000000000e+01 -1.123310000000000031e+00 -3.300000000000000000e+01 -1.123315000000000063e+00 -3.300000000000000000e+01 -1.123320000000000096e+00 -3.300000000000000000e+01 -1.123325000000000129e+00 -3.300000000000000000e+01 -1.123330000000000162e+00 -3.303125000000000000e+01 -1.123335000000000194e+00 -3.303125000000000000e+01 -1.123340000000000005e+00 -3.300000000000000000e+01 -1.123345000000000038e+00 -3.306250000000000000e+01 -1.123350000000000071e+00 -3.306250000000000000e+01 -1.123355000000000103e+00 -3.306250000000000000e+01 -1.123360000000000136e+00 -3.306250000000000000e+01 -1.123365000000000169e+00 -3.309375000000000000e+01 -1.123370000000000202e+00 -3.312500381469726562e+01 -1.123375000000000012e+00 -3.315625000000000000e+01 -1.123380000000000045e+00 -3.312500381469726562e+01 -1.123385000000000078e+00 -3.318750000000000000e+01 -1.123390000000000111e+00 -3.318750000000000000e+01 -1.123395000000000143e+00 -3.309375000000000000e+01 -1.123400000000000176e+00 -3.321875381469726562e+01 -1.123404999999999987e+00 -3.315625000000000000e+01 -1.123410000000000020e+00 -3.325000000000000000e+01 -1.123415000000000052e+00 -3.321875381469726562e+01 -1.123420000000000085e+00 -3.328125000000000000e+01 -1.123425000000000118e+00 -3.328125000000000000e+01 -1.123430000000000151e+00 -3.331250000000000000e+01 -1.123435000000000183e+00 -3.334375000000000000e+01 -1.123439999999999994e+00 -3.334375000000000000e+01 -1.123445000000000027e+00 -3.334375000000000000e+01 -1.123450000000000060e+00 -3.334375000000000000e+01 -1.123455000000000092e+00 -3.337500381469726562e+01 -1.123460000000000125e+00 -3.343750000000000000e+01 -1.123465000000000158e+00 -3.340625000000000000e+01 -1.123470000000000191e+00 -3.340625000000000000e+01 -1.123475000000000001e+00 -3.343750000000000000e+01 -1.123480000000000034e+00 -3.340625000000000000e+01 -1.123485000000000067e+00 -3.343750000000000000e+01 -1.123490000000000100e+00 -3.340625000000000000e+01 -1.123495000000000132e+00 -3.340625000000000000e+01 -1.123500000000000165e+00 -3.350000000000000000e+01 -1.123505000000000198e+00 -3.346875000000000000e+01 -1.123510000000000009e+00 -3.350000000000000000e+01 -1.123515000000000041e+00 -3.343750000000000000e+01 -1.123520000000000074e+00 -3.350000000000000000e+01 -1.123525000000000107e+00 -3.353125381469726562e+01 -1.123530000000000140e+00 -3.359375000000000000e+01 -1.123535000000000172e+00 -3.356250000000000000e+01 -1.123539999999999983e+00 -3.359375000000000000e+01 -1.123545000000000016e+00 -3.362500000000000000e+01 -1.123550000000000049e+00 -3.362500000000000000e+01 -1.123555000000000081e+00 -3.356250000000000000e+01 -1.123560000000000114e+00 -3.362500000000000000e+01 -1.123565000000000147e+00 -3.371875000000000000e+01 -1.123570000000000180e+00 -3.362500000000000000e+01 -1.123574999999999990e+00 -3.365625000000000000e+01 -1.123580000000000023e+00 -3.378125000000000000e+01 -1.123585000000000056e+00 -3.365625000000000000e+01 -1.123590000000000089e+00 -3.371875000000000000e+01 -1.123595000000000121e+00 -3.371875000000000000e+01 -1.123600000000000154e+00 -3.371875000000000000e+01 -1.123605000000000187e+00 -3.378125000000000000e+01 -1.123609999999999998e+00 -3.371875000000000000e+01 -1.123615000000000030e+00 -3.375000000000000000e+01 -1.123620000000000063e+00 -3.381250000000000000e+01 -1.123625000000000096e+00 -3.381250000000000000e+01 -1.123630000000000129e+00 -3.387500000000000000e+01 -1.123635000000000161e+00 -3.384375381469726562e+01 -1.123640000000000194e+00 -3.381250000000000000e+01 -1.123645000000000005e+00 -3.381250000000000000e+01 -1.123650000000000038e+00 -3.387500000000000000e+01 -1.123655000000000070e+00 -3.384375381469726562e+01 -1.123660000000000103e+00 -3.387500000000000000e+01 -1.123665000000000136e+00 -3.387500000000000000e+01 -1.123670000000000169e+00 -3.384375381469726562e+01 -1.123675000000000201e+00 -3.387500000000000000e+01 -1.123680000000000012e+00 -3.381250000000000000e+01 -1.123685000000000045e+00 -3.390625000000000000e+01 -1.123690000000000078e+00 -3.384375381469726562e+01 -1.123695000000000110e+00 -3.393750000000000000e+01 -1.123700000000000143e+00 -3.390625000000000000e+01 -1.123705000000000176e+00 -3.387500000000000000e+01 -1.123709999999999987e+00 -3.393750000000000000e+01 -1.123715000000000019e+00 -3.396875000000000000e+01 -1.123720000000000052e+00 -3.396875000000000000e+01 -1.123725000000000085e+00 -3.393750000000000000e+01 -1.123730000000000118e+00 -3.400000000000000000e+01 -1.123735000000000150e+00 -3.400000000000000000e+01 -1.123740000000000183e+00 -3.403125000000000000e+01 -1.123744999999999994e+00 -3.400000000000000000e+01 -1.123750000000000027e+00 -3.403125000000000000e+01 -1.123755000000000059e+00 -3.406250000000000000e+01 -1.123760000000000092e+00 -3.400000000000000000e+01 -1.123765000000000125e+00 -3.403125000000000000e+01 -1.123770000000000158e+00 -3.403125000000000000e+01 -1.123775000000000190e+00 -3.403125000000000000e+01 -1.123780000000000001e+00 -3.409375381469726562e+01 -1.123785000000000034e+00 -3.409375381469726562e+01 -1.123790000000000067e+00 -3.409375381469726562e+01 -1.123795000000000099e+00 -3.415625000000000000e+01 -1.123800000000000132e+00 -3.409375381469726562e+01 -1.123805000000000165e+00 -3.406250000000000000e+01 -1.123810000000000198e+00 -3.412500000000000000e+01 -1.123815000000000008e+00 -3.418750000000000000e+01 -1.123820000000000041e+00 -3.409375381469726562e+01 -1.123825000000000074e+00 -3.415625000000000000e+01 -1.123830000000000107e+00 -3.421875000000000000e+01 -1.123835000000000139e+00 -3.418750000000000000e+01 -1.123840000000000172e+00 -3.418750000000000000e+01 -1.123844999999999983e+00 -3.418750000000000000e+01 -1.123850000000000016e+00 -3.418750000000000000e+01 -1.123855000000000048e+00 -3.421875000000000000e+01 -1.123860000000000081e+00 -3.428125000000000000e+01 -1.123865000000000114e+00 -3.425000381469726562e+01 -1.123870000000000147e+00 -3.425000381469726562e+01 -1.123875000000000179e+00 -3.428125000000000000e+01 -1.123879999999999990e+00 -3.425000381469726562e+01 -1.123885000000000023e+00 -3.434375000000000000e+01 -1.123890000000000056e+00 -3.434375000000000000e+01 -1.123895000000000088e+00 -3.440625381469726562e+01 -1.123900000000000121e+00 -3.428125000000000000e+01 -1.123905000000000154e+00 -3.437500000000000000e+01 -1.123910000000000187e+00 -3.434375000000000000e+01 -1.123914999999999997e+00 -3.437500000000000000e+01 -1.123920000000000030e+00 -3.437500000000000000e+01 -1.123925000000000063e+00 -3.434375000000000000e+01 -1.123930000000000096e+00 -3.440625381469726562e+01 -1.123935000000000128e+00 -3.450000000000000000e+01 -1.123940000000000161e+00 -3.446875000000000000e+01 -1.123945000000000194e+00 -3.443750000000000000e+01 -1.123950000000000005e+00 -3.437500000000000000e+01 -1.123955000000000037e+00 -3.446875000000000000e+01 -1.123960000000000070e+00 -3.443750000000000000e+01 -1.123965000000000103e+00 -3.453125000000000000e+01 -1.123970000000000136e+00 -3.453125000000000000e+01 -1.123975000000000168e+00 -3.450000000000000000e+01 -1.123980000000000201e+00 -3.450000000000000000e+01 -1.123985000000000012e+00 -3.446875000000000000e+01 -1.123990000000000045e+00 -3.450000000000000000e+01 -1.123995000000000077e+00 -3.450000000000000000e+01 -1.124000000000000110e+00 -3.453125000000000000e+01 -1.124005000000000143e+00 -3.456250381469726562e+01 -1.124010000000000176e+00 -3.459375000000000000e+01 -1.124014999999999986e+00 -3.459375000000000000e+01 -1.124020000000000019e+00 -3.453125000000000000e+01 -1.124025000000000052e+00 -3.459375000000000000e+01 -1.124030000000000085e+00 -3.459375000000000000e+01 -1.124035000000000117e+00 -3.456250381469726562e+01 -1.124040000000000150e+00 -3.468750000000000000e+01 -1.124045000000000183e+00 -3.465625000000000000e+01 -1.124049999999999994e+00 -3.462500000000000000e+01 -1.124055000000000026e+00 -3.468750000000000000e+01 -1.124060000000000059e+00 -3.465625000000000000e+01 -1.124065000000000092e+00 -3.465625000000000000e+01 -1.124070000000000125e+00 -3.468750000000000000e+01 -1.124075000000000157e+00 -3.471875000000000000e+01 -1.124080000000000190e+00 -3.468750000000000000e+01 -1.124085000000000001e+00 -3.471875000000000000e+01 -1.124090000000000034e+00 -3.465625000000000000e+01 -1.124095000000000066e+00 -3.465625000000000000e+01 -1.124100000000000099e+00 -3.475000000000000000e+01 -1.124105000000000132e+00 -3.478125000000000000e+01 -1.124110000000000165e+00 -3.475000000000000000e+01 -1.124115000000000197e+00 -3.471875000000000000e+01 -1.124120000000000008e+00 -3.471875000000000000e+01 -1.124125000000000041e+00 -3.475000000000000000e+01 -1.124130000000000074e+00 -3.475000000000000000e+01 -1.124135000000000106e+00 -3.478125000000000000e+01 -1.124140000000000139e+00 -3.484375000000000000e+01 -1.124145000000000172e+00 -3.484375000000000000e+01 -1.124149999999999983e+00 -3.487500000000000000e+01 -1.124155000000000015e+00 -3.481250381469726562e+01 -1.124160000000000048e+00 -3.487500000000000000e+01 -1.124165000000000081e+00 -3.484375000000000000e+01 -1.124170000000000114e+00 -3.484375000000000000e+01 -1.124175000000000146e+00 -3.487500000000000000e+01 -1.124180000000000179e+00 -3.490625000000000000e+01 -1.124184999999999990e+00 -3.487500000000000000e+01 -1.124190000000000023e+00 -3.487500000000000000e+01 -1.124195000000000055e+00 -3.490625000000000000e+01 -1.124200000000000088e+00 -3.487500000000000000e+01 -1.124205000000000121e+00 -3.481250381469726562e+01 -1.124210000000000154e+00 -3.487500000000000000e+01 -1.124215000000000186e+00 -3.493750000000000000e+01 -1.124219999999999997e+00 -3.490625000000000000e+01 -1.124225000000000030e+00 -3.487500000000000000e+01 -1.124230000000000063e+00 -3.490625000000000000e+01 -1.124235000000000095e+00 -3.487500000000000000e+01 -1.124240000000000128e+00 -3.490625000000000000e+01 -1.124245000000000161e+00 -3.487500000000000000e+01 -1.124250000000000194e+00 -3.493750000000000000e+01 -1.124255000000000004e+00 -3.496875381469726562e+01 -1.124260000000000037e+00 -3.487500000000000000e+01 -1.124265000000000070e+00 -3.490625000000000000e+01 -1.124270000000000103e+00 -3.487500000000000000e+01 -1.124275000000000135e+00 -3.490625000000000000e+01 -1.124280000000000168e+00 -3.500000000000000000e+01 -1.124285000000000201e+00 -3.493750000000000000e+01 -1.124290000000000012e+00 -3.493750000000000000e+01 -1.124295000000000044e+00 -3.503125000000000000e+01 -1.124300000000000077e+00 -3.500000000000000000e+01 -1.124305000000000110e+00 -3.500000000000000000e+01 -1.124310000000000143e+00 -3.503125000000000000e+01 -1.124315000000000175e+00 -3.503125000000000000e+01 -1.124319999999999986e+00 -3.503125000000000000e+01 -1.124325000000000019e+00 -3.503125000000000000e+01 -1.124330000000000052e+00 -3.506250000000000000e+01 -1.124335000000000084e+00 -3.506250000000000000e+01 -1.124340000000000117e+00 -3.506250000000000000e+01 -1.124345000000000150e+00 -3.509375000000000000e+01 -1.124350000000000183e+00 -3.506250000000000000e+01 -1.124354999999999993e+00 -3.509375000000000000e+01 -1.124360000000000026e+00 -3.509375000000000000e+01 -1.124365000000000059e+00 -3.506250000000000000e+01 -1.124370000000000092e+00 -3.509375000000000000e+01 -1.124375000000000124e+00 -3.515625000000000000e+01 -1.124380000000000157e+00 -3.509375000000000000e+01 -1.124385000000000190e+00 -3.515625000000000000e+01 -1.124390000000000001e+00 -3.512500381469726562e+01 -1.124395000000000033e+00 -3.515625000000000000e+01 -1.124400000000000066e+00 -3.515625000000000000e+01 -1.124405000000000099e+00 -3.515625000000000000e+01 -1.124410000000000132e+00 -3.515625000000000000e+01 -1.124415000000000164e+00 -3.515625000000000000e+01 -1.124420000000000197e+00 -3.515625000000000000e+01 -1.124425000000000008e+00 -3.518750000000000000e+01 -1.124430000000000041e+00 -3.525000000000000000e+01 -1.124435000000000073e+00 -3.518750000000000000e+01 -1.124440000000000106e+00 -3.525000000000000000e+01 -1.124445000000000139e+00 -3.518750000000000000e+01 -1.124450000000000172e+00 -3.525000000000000000e+01 -1.124454999999999982e+00 -3.521875000000000000e+01 -1.124460000000000015e+00 -3.521875000000000000e+01 -1.124465000000000048e+00 -3.525000000000000000e+01 -1.124470000000000081e+00 -3.521875000000000000e+01 -1.124475000000000113e+00 -3.525000000000000000e+01 -1.124480000000000146e+00 -3.521875000000000000e+01 -1.124485000000000179e+00 -3.528125381469726562e+01 -1.124489999999999990e+00 -3.525000000000000000e+01 -1.124495000000000022e+00 -3.528125381469726562e+01 -1.124500000000000055e+00 -3.531250000000000000e+01 -1.124505000000000088e+00 -3.525000000000000000e+01 -1.124510000000000121e+00 -3.534375000000000000e+01 -1.124515000000000153e+00 -3.531250000000000000e+01 -1.124520000000000186e+00 -3.528125381469726562e+01 -1.124524999999999997e+00 -3.528125381469726562e+01 -1.124530000000000030e+00 -3.531250000000000000e+01 -1.124535000000000062e+00 -3.528125381469726562e+01 -1.124540000000000095e+00 -3.528125381469726562e+01 -1.124545000000000128e+00 -3.534375000000000000e+01 -1.124550000000000161e+00 -3.531250000000000000e+01 -1.124555000000000193e+00 -3.537500000000000000e+01 -1.124560000000000004e+00 -3.531250000000000000e+01 -1.124565000000000037e+00 -3.534375000000000000e+01 -1.124570000000000070e+00 -3.531250000000000000e+01 -1.124575000000000102e+00 -3.540625000000000000e+01 -1.124580000000000135e+00 -3.540625000000000000e+01 -1.124585000000000168e+00 -3.540625000000000000e+01 -1.124590000000000201e+00 -3.543750381469726562e+01 -1.124595000000000011e+00 -3.543750381469726562e+01 -1.124600000000000044e+00 -3.540625000000000000e+01 -1.124605000000000077e+00 -3.543750381469726562e+01 -1.124610000000000110e+00 -3.546875000000000000e+01 -1.124615000000000142e+00 -3.540625000000000000e+01 -1.124620000000000175e+00 -3.543750381469726562e+01 -1.124624999999999986e+00 -3.546875000000000000e+01 -1.124630000000000019e+00 -3.550000000000000000e+01 -1.124635000000000051e+00 -3.546875000000000000e+01 -1.124640000000000084e+00 -3.550000000000000000e+01 -1.124645000000000117e+00 -3.550000000000000000e+01 -1.124650000000000150e+00 -3.546875000000000000e+01 -1.124655000000000182e+00 -3.553125381469726562e+01 -1.124659999999999993e+00 -3.550000000000000000e+01 -1.124665000000000026e+00 -3.550000000000000000e+01 -1.124670000000000059e+00 -3.550000000000000000e+01 -1.124675000000000091e+00 -3.553125381469726562e+01 -1.124680000000000124e+00 -3.553125381469726562e+01 -1.124685000000000157e+00 -3.556250000000000000e+01 -1.124690000000000190e+00 -3.550000000000000000e+01 -1.124695000000000000e+00 -3.553125381469726562e+01 -1.124700000000000033e+00 -3.553125381469726562e+01 -1.124705000000000066e+00 -3.550000000000000000e+01 -1.124710000000000099e+00 -3.556250000000000000e+01 -1.124715000000000131e+00 -3.556250000000000000e+01 -1.124720000000000164e+00 -3.556250000000000000e+01 -1.124725000000000197e+00 -3.553125381469726562e+01 -1.124730000000000008e+00 -3.556250000000000000e+01 -1.124735000000000040e+00 -3.559375000000000000e+01 -1.124740000000000073e+00 -3.559375000000000000e+01 -1.124745000000000106e+00 -3.559375000000000000e+01 -1.124750000000000139e+00 -3.559375000000000000e+01 -1.124755000000000171e+00 -3.559375000000000000e+01 -1.124759999999999982e+00 -3.562500000000000000e+01 -1.124765000000000015e+00 -3.559375000000000000e+01 -1.124770000000000048e+00 -3.562500000000000000e+01 -1.124775000000000080e+00 -3.565625000000000000e+01 -1.124780000000000113e+00 -3.565625000000000000e+01 -1.124785000000000146e+00 -3.565625000000000000e+01 -1.124790000000000179e+00 -3.559375000000000000e+01 -1.124794999999999989e+00 -3.571875000000000000e+01 -1.124800000000000022e+00 -3.568750381469726562e+01 -1.124805000000000055e+00 -3.565625000000000000e+01 -1.124810000000000088e+00 -3.565625000000000000e+01 -1.124815000000000120e+00 -3.565625000000000000e+01 -1.124820000000000153e+00 -3.571875000000000000e+01 -1.124825000000000186e+00 -3.568750381469726562e+01 -1.124829999999999997e+00 -3.571875000000000000e+01 -1.124835000000000029e+00 -3.571875000000000000e+01 -1.124840000000000062e+00 -3.565625000000000000e+01 -1.124845000000000095e+00 -3.575000000000000000e+01 -1.124850000000000128e+00 -3.578125000000000000e+01 -1.124855000000000160e+00 -3.571875000000000000e+01 -1.124860000000000193e+00 -3.575000000000000000e+01 -1.124865000000000004e+00 -3.578125000000000000e+01 -1.124870000000000037e+00 -3.571875000000000000e+01 -1.124875000000000069e+00 -3.578125000000000000e+01 -1.124880000000000102e+00 -3.581250000000000000e+01 -1.124885000000000135e+00 -3.584375381469726562e+01 -1.124890000000000168e+00 -3.578125000000000000e+01 -1.124895000000000200e+00 -3.581250000000000000e+01 -1.124900000000000011e+00 -3.581250000000000000e+01 -1.124905000000000044e+00 -3.578125000000000000e+01 -1.124910000000000077e+00 -3.587500000000000000e+01 -1.124915000000000109e+00 -3.590625000000000000e+01 -1.124920000000000142e+00 -3.584375381469726562e+01 -1.124925000000000175e+00 -3.587500000000000000e+01 -1.124929999999999986e+00 -3.584375381469726562e+01 -1.124935000000000018e+00 -3.590625000000000000e+01 -1.124940000000000051e+00 -3.590625000000000000e+01 -1.124945000000000084e+00 -3.590625000000000000e+01 -1.124950000000000117e+00 -3.587500000000000000e+01 -1.124955000000000149e+00 -3.584375381469726562e+01 -1.124960000000000182e+00 -3.590625000000000000e+01 -1.124964999999999993e+00 -3.593750000000000000e+01 -1.124970000000000026e+00 -3.590625000000000000e+01 -1.124975000000000058e+00 -3.584375381469726562e+01 -1.124980000000000091e+00 -3.587500000000000000e+01 -1.124985000000000124e+00 -3.587500000000000000e+01 -1.124990000000000157e+00 -3.590625000000000000e+01 -1.124995000000000189e+00 -3.584375381469726562e+01 -1.125000000000000000e+00 -3.584375381469726562e+01 -1.125005000000000033e+00 -3.590625000000000000e+01 -1.125010000000000066e+00 -3.584375381469726562e+01 -1.125015000000000098e+00 -3.587500000000000000e+01 -1.125020000000000131e+00 -3.590625000000000000e+01 -1.125025000000000164e+00 -3.584375381469726562e+01 -1.125030000000000197e+00 -3.590625000000000000e+01 -1.125035000000000007e+00 -3.590625000000000000e+01 -1.125040000000000040e+00 -3.590625000000000000e+01 -1.125045000000000073e+00 -3.587500000000000000e+01 -1.125050000000000106e+00 -3.581250000000000000e+01 -1.125055000000000138e+00 -3.587500000000000000e+01 -1.125060000000000171e+00 -3.587500000000000000e+01 -1.125064999999999982e+00 -3.590625000000000000e+01 -1.125070000000000014e+00 -3.587500000000000000e+01 -1.125075000000000047e+00 -3.590625000000000000e+01 -1.125080000000000080e+00 -3.596875000000000000e+01 -1.125085000000000113e+00 -3.596875000000000000e+01 -1.125090000000000146e+00 -3.590625000000000000e+01 -1.125095000000000178e+00 -3.603125000000000000e+01 -1.125099999999999989e+00 -3.600000381469726562e+01 -1.125105000000000022e+00 -3.603125000000000000e+01 -1.125110000000000054e+00 -3.593750000000000000e+01 -1.125115000000000087e+00 -3.600000381469726562e+01 -1.125120000000000120e+00 -3.596875000000000000e+01 -1.125125000000000153e+00 -3.603125000000000000e+01 -1.125130000000000186e+00 -3.596875000000000000e+01 -1.125134999999999996e+00 -3.603125000000000000e+01 -1.125140000000000029e+00 -3.600000381469726562e+01 -1.125145000000000062e+00 -3.603125000000000000e+01 -1.125150000000000095e+00 -3.596875000000000000e+01 -1.125155000000000127e+00 -3.600000381469726562e+01 -1.125160000000000160e+00 -3.603125000000000000e+01 -1.125165000000000193e+00 -3.606250000000000000e+01 -1.125170000000000003e+00 -3.603125000000000000e+01 -1.125175000000000036e+00 -3.609375000000000000e+01 -1.125180000000000069e+00 -3.603125000000000000e+01 -1.125185000000000102e+00 -3.603125000000000000e+01 -1.125190000000000135e+00 -3.609375000000000000e+01 -1.125195000000000167e+00 -3.609375000000000000e+01 -1.125200000000000200e+00 -3.612500000000000000e+01 -1.125205000000000011e+00 -3.603125000000000000e+01 -1.125210000000000043e+00 -3.609375000000000000e+01 -1.125215000000000076e+00 -3.606250000000000000e+01 -1.125220000000000109e+00 -3.615625381469726562e+01 -1.125225000000000142e+00 -3.612500000000000000e+01 -1.125230000000000175e+00 -3.615625381469726562e+01 -1.125234999999999985e+00 -3.612500000000000000e+01 -1.125240000000000018e+00 -3.603125000000000000e+01 -1.125245000000000051e+00 -3.609375000000000000e+01 -1.125250000000000083e+00 -3.615625381469726562e+01 -1.125255000000000116e+00 -3.615625381469726562e+01 -1.125260000000000149e+00 -3.612500000000000000e+01 -1.125265000000000182e+00 -3.609375000000000000e+01 -1.125269999999999992e+00 -3.612500000000000000e+01 -1.125275000000000025e+00 -3.618750000000000000e+01 -1.125280000000000058e+00 -3.618750000000000000e+01 -1.125285000000000091e+00 -3.609375000000000000e+01 -1.125290000000000123e+00 -3.615625381469726562e+01 -1.125295000000000156e+00 -3.612500000000000000e+01 -1.125300000000000189e+00 -3.612500000000000000e+01 -1.125305000000000000e+00 -3.615625381469726562e+01 -1.125310000000000032e+00 -3.615625381469726562e+01 -1.125315000000000065e+00 -3.618750000000000000e+01 -1.125320000000000098e+00 -3.621875000000000000e+01 -1.125325000000000131e+00 -3.615625381469726562e+01 -1.125330000000000163e+00 -3.618750000000000000e+01 -1.125335000000000196e+00 -3.618750000000000000e+01 -1.125340000000000007e+00 -3.618750000000000000e+01 -1.125345000000000040e+00 -3.621875000000000000e+01 -1.125350000000000072e+00 -3.618750000000000000e+01 -1.125355000000000105e+00 -3.628125000000000000e+01 -1.125360000000000138e+00 -3.621875000000000000e+01 -1.125365000000000171e+00 -3.625000000000000000e+01 -1.125369999999999981e+00 -3.634375000000000000e+01 -1.125375000000000014e+00 -3.621875000000000000e+01 -1.125380000000000047e+00 -3.628125000000000000e+01 -1.125385000000000080e+00 -3.628125000000000000e+01 -1.125390000000000112e+00 -3.628125000000000000e+01 -1.125395000000000145e+00 -3.625000000000000000e+01 -1.125400000000000178e+00 -3.628125000000000000e+01 -1.125404999999999989e+00 -3.628125000000000000e+01 -1.125410000000000021e+00 -3.628125000000000000e+01 -1.125415000000000054e+00 -3.628125000000000000e+01 -1.125420000000000087e+00 -3.631250000000000000e+01 -1.125425000000000120e+00 -3.631250000000000000e+01 -1.125430000000000152e+00 -3.628125000000000000e+01 -1.125435000000000185e+00 -3.628125000000000000e+01 -1.125439999999999996e+00 -3.634375000000000000e+01 -1.125445000000000029e+00 -3.634375000000000000e+01 -1.125450000000000061e+00 -3.631250000000000000e+01 -1.125455000000000094e+00 -3.637500000000000000e+01 -1.125460000000000127e+00 -3.637500000000000000e+01 -1.125465000000000160e+00 -3.640625381469726562e+01 -1.125470000000000192e+00 -3.634375000000000000e+01 -1.125475000000000003e+00 -3.643750000000000000e+01 -1.125480000000000036e+00 -3.640625381469726562e+01 -1.125485000000000069e+00 -3.646875000000000000e+01 -1.125490000000000101e+00 -3.643750000000000000e+01 -1.125495000000000134e+00 -3.640625381469726562e+01 -1.125500000000000167e+00 -3.640625381469726562e+01 -1.125505000000000200e+00 -3.643750000000000000e+01 -1.125510000000000010e+00 -3.640625381469726562e+01 -1.125515000000000043e+00 -3.643750000000000000e+01 -1.125520000000000076e+00 -3.643750000000000000e+01 -1.125525000000000109e+00 -3.643750000000000000e+01 -1.125530000000000141e+00 -3.637500000000000000e+01 -1.125535000000000174e+00 -3.643750000000000000e+01 -1.125539999999999985e+00 -3.646875000000000000e+01 -1.125545000000000018e+00 -3.643750000000000000e+01 -1.125550000000000050e+00 -3.643750000000000000e+01 -1.125555000000000083e+00 -3.640625381469726562e+01 -1.125560000000000116e+00 -3.646875000000000000e+01 -1.125565000000000149e+00 -3.646875000000000000e+01 -1.125570000000000181e+00 -3.650000000000000000e+01 -1.125574999999999992e+00 -3.650000000000000000e+01 -1.125580000000000025e+00 -3.650000000000000000e+01 -1.125585000000000058e+00 -3.653125000000000000e+01 -1.125590000000000090e+00 -3.650000000000000000e+01 -1.125595000000000123e+00 -3.653125000000000000e+01 -1.125600000000000156e+00 -3.650000000000000000e+01 -1.125605000000000189e+00 -3.653125000000000000e+01 -1.125609999999999999e+00 -3.653125000000000000e+01 -1.125615000000000032e+00 -3.653125000000000000e+01 -1.125620000000000065e+00 -3.662500000000000000e+01 -1.125625000000000098e+00 -3.650000000000000000e+01 -1.125630000000000130e+00 -3.659375000000000000e+01 -1.125635000000000163e+00 -3.656250381469726562e+01 -1.125640000000000196e+00 -3.653125000000000000e+01 -1.125645000000000007e+00 -3.653125000000000000e+01 -1.125650000000000039e+00 -3.653125000000000000e+01 -1.125655000000000072e+00 -3.656250381469726562e+01 -1.125660000000000105e+00 -3.659375000000000000e+01 -1.125665000000000138e+00 -3.659375000000000000e+01 -1.125670000000000170e+00 -3.662500000000000000e+01 -1.125674999999999981e+00 -3.668750000000000000e+01 -1.125680000000000014e+00 -3.659375000000000000e+01 -1.125685000000000047e+00 -3.665625000000000000e+01 -1.125690000000000079e+00 -3.662500000000000000e+01 -1.125695000000000112e+00 -3.665625000000000000e+01 -1.125700000000000145e+00 -3.665625000000000000e+01 -1.125705000000000178e+00 -3.665625000000000000e+01 -1.125709999999999988e+00 -3.668750000000000000e+01 -1.125715000000000021e+00 -3.665625000000000000e+01 -1.125720000000000054e+00 -3.665625000000000000e+01 -1.125725000000000087e+00 -3.668750000000000000e+01 -1.125730000000000119e+00 -3.668750000000000000e+01 -1.125735000000000152e+00 -3.668750000000000000e+01 -1.125740000000000185e+00 -3.668750000000000000e+01 -1.125744999999999996e+00 -3.668750000000000000e+01 -1.125750000000000028e+00 -3.675000000000000000e+01 -1.125755000000000061e+00 -3.675000000000000000e+01 -1.125760000000000094e+00 -3.671875381469726562e+01 -1.125765000000000127e+00 -3.671875381469726562e+01 -1.125770000000000159e+00 -3.671875381469726562e+01 -1.125775000000000192e+00 -3.675000000000000000e+01 -1.125780000000000003e+00 -3.671875381469726562e+01 -1.125785000000000036e+00 -3.675000000000000000e+01 -1.125790000000000068e+00 -3.671875381469726562e+01 -1.125795000000000101e+00 -3.671875381469726562e+01 -1.125800000000000134e+00 -3.678125000000000000e+01 -1.125805000000000167e+00 -3.675000000000000000e+01 -1.125810000000000199e+00 -3.678125000000000000e+01 -1.125815000000000010e+00 -3.684375000000000000e+01 -1.125820000000000043e+00 -3.681250000000000000e+01 -1.125825000000000076e+00 -3.681250000000000000e+01 -1.125830000000000108e+00 -3.678125000000000000e+01 -1.125835000000000141e+00 -3.678125000000000000e+01 -1.125840000000000174e+00 -3.678125000000000000e+01 -1.125844999999999985e+00 -3.684375000000000000e+01 -1.125850000000000017e+00 -3.684375000000000000e+01 -1.125855000000000050e+00 -3.681250000000000000e+01 -1.125860000000000083e+00 -3.684375000000000000e+01 -1.125865000000000116e+00 -3.681250000000000000e+01 -1.125870000000000148e+00 -3.684375000000000000e+01 -1.125875000000000181e+00 -3.687500381469726562e+01 -1.125879999999999992e+00 -3.684375000000000000e+01 -1.125885000000000025e+00 -3.684375000000000000e+01 -1.125890000000000057e+00 -3.690625000000000000e+01 -1.125895000000000090e+00 -3.678125000000000000e+01 -1.125900000000000123e+00 -3.687500381469726562e+01 -1.125905000000000156e+00 -3.690625000000000000e+01 -1.125910000000000188e+00 -3.687500381469726562e+01 -1.125914999999999999e+00 -3.687500381469726562e+01 -1.125920000000000032e+00 -3.693750000000000000e+01 -1.125925000000000065e+00 -3.687500381469726562e+01 -1.125930000000000097e+00 -3.690625000000000000e+01 -1.125935000000000130e+00 -3.687500381469726562e+01 -1.125940000000000163e+00 -3.687500381469726562e+01 -1.125945000000000196e+00 -3.687500381469726562e+01 -1.125950000000000006e+00 -3.687500381469726562e+01 -1.125955000000000039e+00 -3.690625000000000000e+01 -1.125960000000000072e+00 -3.690625000000000000e+01 -1.125965000000000105e+00 -3.690625000000000000e+01 -1.125970000000000137e+00 -3.687500381469726562e+01 -1.125975000000000170e+00 -3.687500381469726562e+01 -1.125980000000000203e+00 -3.690625000000000000e+01 -1.125985000000000014e+00 -3.693750000000000000e+01 -1.125990000000000046e+00 -3.696875000000000000e+01 -1.125995000000000079e+00 -3.690625000000000000e+01 -1.126000000000000112e+00 -3.693750000000000000e+01 -1.126005000000000145e+00 -3.693750000000000000e+01 -1.126010000000000177e+00 -3.693750000000000000e+01 -1.126014999999999988e+00 -3.696875000000000000e+01 -1.126020000000000021e+00 -3.696875000000000000e+01 -1.126025000000000054e+00 -3.700000000000000000e+01 -1.126030000000000086e+00 -3.696875000000000000e+01 -1.126035000000000119e+00 -3.696875000000000000e+01 -1.126040000000000152e+00 -3.696875000000000000e+01 -1.126045000000000185e+00 -3.693750000000000000e+01 -1.126049999999999995e+00 -3.693750000000000000e+01 -1.126055000000000028e+00 -3.696875000000000000e+01 -1.126060000000000061e+00 -3.693750000000000000e+01 -1.126065000000000094e+00 -3.696875000000000000e+01 -1.126070000000000126e+00 -3.696875000000000000e+01 -1.126075000000000159e+00 -3.696875000000000000e+01 -1.126080000000000192e+00 -3.700000000000000000e+01 -1.126085000000000003e+00 -3.696875000000000000e+01 -1.126090000000000035e+00 -3.703125381469726562e+01 -1.126095000000000068e+00 -3.700000000000000000e+01 -1.126100000000000101e+00 -3.700000000000000000e+01 -1.126105000000000134e+00 -3.700000000000000000e+01 -1.126110000000000166e+00 -3.706250000000000000e+01 -1.126115000000000199e+00 -3.700000000000000000e+01 -1.126120000000000010e+00 -3.706250000000000000e+01 -1.126125000000000043e+00 -3.703125381469726562e+01 -1.126130000000000075e+00 -3.703125381469726562e+01 -1.126135000000000108e+00 -3.700000000000000000e+01 -1.126140000000000141e+00 -3.703125381469726562e+01 -1.126145000000000174e+00 -3.706250000000000000e+01 -1.126149999999999984e+00 -3.706250000000000000e+01 -1.126155000000000017e+00 -3.703125381469726562e+01 -1.126160000000000050e+00 -3.709375000000000000e+01 -1.126165000000000083e+00 -3.700000000000000000e+01 -1.126170000000000115e+00 -3.700000000000000000e+01 -1.126175000000000148e+00 -3.703125381469726562e+01 -1.126180000000000181e+00 -3.709375000000000000e+01 -1.126184999999999992e+00 -3.706250000000000000e+01 -1.126190000000000024e+00 -3.706250000000000000e+01 -1.126195000000000057e+00 -3.700000000000000000e+01 -1.126200000000000090e+00 -3.706250000000000000e+01 -1.126205000000000123e+00 -3.703125381469726562e+01 -1.126210000000000155e+00 -3.709375000000000000e+01 -1.126215000000000188e+00 -3.709375000000000000e+01 -1.126219999999999999e+00 -3.709375000000000000e+01 -1.126225000000000032e+00 -3.703125381469726562e+01 -1.126230000000000064e+00 -3.709375000000000000e+01 -1.126235000000000097e+00 -3.706250000000000000e+01 -1.126240000000000130e+00 -3.703125381469726562e+01 -1.126245000000000163e+00 -3.706250000000000000e+01 -1.126250000000000195e+00 -3.706250000000000000e+01 -1.126255000000000006e+00 -3.709375000000000000e+01 -1.126260000000000039e+00 -3.709375000000000000e+01 -1.126265000000000072e+00 -3.709375000000000000e+01 -1.126270000000000104e+00 -3.715625000000000000e+01 -1.126275000000000137e+00 -3.709375000000000000e+01 -1.126280000000000170e+00 -3.709375000000000000e+01 -1.126285000000000203e+00 -3.712500381469726562e+01 -1.126290000000000013e+00 -3.715625000000000000e+01 -1.126295000000000046e+00 -3.709375000000000000e+01 -1.126300000000000079e+00 -3.712500381469726562e+01 -1.126305000000000112e+00 -3.715625000000000000e+01 -1.126310000000000144e+00 -3.709375000000000000e+01 -1.126315000000000177e+00 -3.712500381469726562e+01 -1.126319999999999988e+00 -3.721875000000000000e+01 -1.126325000000000021e+00 -3.715625000000000000e+01 -1.126330000000000053e+00 -3.715625000000000000e+01 -1.126335000000000086e+00 -3.712500381469726562e+01 -1.126340000000000119e+00 -3.712500381469726562e+01 -1.126345000000000152e+00 -3.718750000000000000e+01 -1.126350000000000184e+00 -3.712500381469726562e+01 -1.126354999999999995e+00 -3.718750000000000000e+01 -1.126360000000000028e+00 -3.715625000000000000e+01 -1.126365000000000061e+00 -3.721875000000000000e+01 -1.126370000000000093e+00 -3.718750000000000000e+01 -1.126375000000000126e+00 -3.725000000000000000e+01 -1.126380000000000159e+00 -3.721875000000000000e+01 -1.126385000000000192e+00 -3.721875000000000000e+01 -1.126390000000000002e+00 -3.728125381469726562e+01 -1.126395000000000035e+00 -3.728125381469726562e+01 -1.126400000000000068e+00 -3.721875000000000000e+01 -1.126405000000000101e+00 -3.718750000000000000e+01 -1.126410000000000133e+00 -3.728125381469726562e+01 -1.126415000000000166e+00 -3.728125381469726562e+01 -1.126420000000000199e+00 -3.728125381469726562e+01 -1.126425000000000010e+00 -3.728125381469726562e+01 -1.126430000000000042e+00 -3.728125381469726562e+01 -1.126435000000000075e+00 -3.728125381469726562e+01 -1.126440000000000108e+00 -3.721875000000000000e+01 -1.126445000000000141e+00 -3.728125381469726562e+01 -1.126450000000000173e+00 -3.731250000000000000e+01 -1.126454999999999984e+00 -3.728125381469726562e+01 -1.126460000000000017e+00 -3.721875000000000000e+01 -1.126465000000000050e+00 -3.725000000000000000e+01 -1.126470000000000082e+00 -3.728125381469726562e+01 -1.126475000000000115e+00 -3.731250000000000000e+01 -1.126480000000000148e+00 -3.728125381469726562e+01 -1.126485000000000181e+00 -3.725000000000000000e+01 -1.126489999999999991e+00 -3.734375000000000000e+01 -1.126495000000000024e+00 -3.731250000000000000e+01 -1.126500000000000057e+00 -3.734375000000000000e+01 -1.126505000000000090e+00 -3.731250000000000000e+01 -1.126510000000000122e+00 -3.737500000000000000e+01 -1.126515000000000155e+00 -3.737500000000000000e+01 -1.126520000000000188e+00 -3.737500000000000000e+01 -1.126524999999999999e+00 -3.731250000000000000e+01 -1.126530000000000031e+00 -3.740625000000000000e+01 -1.126535000000000064e+00 -3.743750381469726562e+01 -1.126540000000000097e+00 -3.740625000000000000e+01 -1.126545000000000130e+00 -3.737500000000000000e+01 -1.126550000000000162e+00 -3.737500000000000000e+01 -1.126555000000000195e+00 -3.734375000000000000e+01 -1.126560000000000006e+00 -3.737500000000000000e+01 -1.126565000000000039e+00 -3.737500000000000000e+01 -1.126570000000000071e+00 -3.740625000000000000e+01 -1.126575000000000104e+00 -3.731250000000000000e+01 -1.126580000000000137e+00 -3.737500000000000000e+01 -1.126585000000000170e+00 -3.737500000000000000e+01 -1.126590000000000202e+00 -3.740625000000000000e+01 -1.126595000000000013e+00 -3.740625000000000000e+01 -1.126600000000000046e+00 -3.740625000000000000e+01 -1.126605000000000079e+00 -3.734375000000000000e+01 -1.126610000000000111e+00 -3.734375000000000000e+01 -1.126615000000000144e+00 -3.743750381469726562e+01 -1.126620000000000177e+00 -3.734375000000000000e+01 -1.126624999999999988e+00 -3.740625000000000000e+01 -1.126630000000000020e+00 -3.743750381469726562e+01 -1.126635000000000053e+00 -3.737500000000000000e+01 -1.126640000000000086e+00 -3.746875000000000000e+01 -1.126645000000000119e+00 -3.737500000000000000e+01 -1.126650000000000151e+00 -3.746875000000000000e+01 -1.126655000000000184e+00 -3.743750381469726562e+01 -1.126659999999999995e+00 -3.740625000000000000e+01 -1.126665000000000028e+00 -3.740625000000000000e+01 -1.126670000000000060e+00 -3.740625000000000000e+01 -1.126675000000000093e+00 -3.734375000000000000e+01 -1.126680000000000126e+00 -3.740625000000000000e+01 -1.126685000000000159e+00 -3.743750381469726562e+01 -1.126690000000000191e+00 -3.743750381469726562e+01 -1.126695000000000002e+00 -3.740625000000000000e+01 -1.126700000000000035e+00 -3.743750381469726562e+01 -1.126705000000000068e+00 -3.746875000000000000e+01 -1.126710000000000100e+00 -3.740625000000000000e+01 -1.126715000000000133e+00 -3.743750381469726562e+01 -1.126720000000000166e+00 -3.743750381469726562e+01 -1.126725000000000199e+00 -3.746875000000000000e+01 -1.126730000000000009e+00 -3.737500000000000000e+01 -1.126735000000000042e+00 -3.743750381469726562e+01 -1.126740000000000075e+00 -3.743750381469726562e+01 -1.126745000000000108e+00 -3.750000000000000000e+01 -1.126750000000000140e+00 -3.743750381469726562e+01 -1.126755000000000173e+00 -3.746875000000000000e+01 -1.126759999999999984e+00 -3.746875000000000000e+01 -1.126765000000000017e+00 -3.740625000000000000e+01 -1.126770000000000049e+00 -3.743750381469726562e+01 -1.126775000000000082e+00 -3.750000000000000000e+01 -1.126780000000000115e+00 -3.746875000000000000e+01 -1.126785000000000148e+00 -3.743750381469726562e+01 -1.126790000000000180e+00 -3.750000000000000000e+01 -1.126794999999999991e+00 -3.753125000000000000e+01 -1.126800000000000024e+00 -3.750000000000000000e+01 -1.126805000000000057e+00 -3.753125000000000000e+01 -1.126810000000000089e+00 -3.756250000000000000e+01 -1.126815000000000122e+00 -3.750000000000000000e+01 -1.126820000000000155e+00 -3.756250000000000000e+01 -1.126825000000000188e+00 -3.756250000000000000e+01 -1.126829999999999998e+00 -3.753125000000000000e+01 -1.126835000000000031e+00 -3.746875000000000000e+01 -1.126840000000000064e+00 -3.759375381469726562e+01 -1.126845000000000097e+00 -3.756250000000000000e+01 -1.126850000000000129e+00 -3.753125000000000000e+01 -1.126855000000000162e+00 -3.756250000000000000e+01 -1.126860000000000195e+00 -3.756250000000000000e+01 -1.126865000000000006e+00 -3.762500000000000000e+01 -1.126870000000000038e+00 -3.756250000000000000e+01 -1.126875000000000071e+00 -3.759375381469726562e+01 -1.126880000000000104e+00 -3.750000000000000000e+01 -1.126885000000000137e+00 -3.756250000000000000e+01 -1.126890000000000169e+00 -3.756250000000000000e+01 -1.126895000000000202e+00 -3.762500000000000000e+01 -1.126900000000000013e+00 -3.756250000000000000e+01 -1.126905000000000046e+00 -3.765625000000000000e+01 -1.126910000000000078e+00 -3.759375381469726562e+01 -1.126915000000000111e+00 -3.759375381469726562e+01 -1.126920000000000144e+00 -3.759375381469726562e+01 -1.126925000000000177e+00 -3.759375381469726562e+01 -1.126929999999999987e+00 -3.753125000000000000e+01 -1.126935000000000020e+00 -3.753125000000000000e+01 -1.126940000000000053e+00 -3.765625000000000000e+01 -1.126945000000000086e+00 -3.762500000000000000e+01 -1.126950000000000118e+00 -3.753125000000000000e+01 -1.126955000000000151e+00 -3.762500000000000000e+01 -1.126960000000000184e+00 -3.756250000000000000e+01 -1.126964999999999995e+00 -3.759375381469726562e+01 -1.126970000000000027e+00 -3.756250000000000000e+01 -1.126975000000000060e+00 -3.759375381469726562e+01 -1.126980000000000093e+00 -3.762500000000000000e+01 -1.126985000000000126e+00 -3.762500000000000000e+01 -1.126990000000000158e+00 -3.759375381469726562e+01 -1.126995000000000191e+00 -3.762500000000000000e+01 -1.127000000000000002e+00 -3.765625000000000000e+01 -1.127005000000000035e+00 -3.762500000000000000e+01 -1.127010000000000067e+00 -3.762500000000000000e+01 -1.127015000000000100e+00 -3.765625000000000000e+01 -1.127020000000000133e+00 -3.759375381469726562e+01 -1.127025000000000166e+00 -3.765625000000000000e+01 -1.127030000000000198e+00 -3.762500000000000000e+01 -1.127035000000000009e+00 -3.768750000000000000e+01 -1.127040000000000042e+00 -3.768750000000000000e+01 -1.127045000000000075e+00 -3.765625000000000000e+01 -1.127050000000000107e+00 -3.768750000000000000e+01 -1.127055000000000140e+00 -3.765625000000000000e+01 -1.127060000000000173e+00 -3.765625000000000000e+01 -1.127064999999999984e+00 -3.768750000000000000e+01 -1.127070000000000016e+00 -3.771875000000000000e+01 -1.127075000000000049e+00 -3.775000381469726562e+01 -1.127080000000000082e+00 -3.765625000000000000e+01 -1.127085000000000115e+00 -3.765625000000000000e+01 -1.127090000000000147e+00 -3.771875000000000000e+01 -1.127095000000000180e+00 -3.775000381469726562e+01 -1.127099999999999991e+00 -3.771875000000000000e+01 -1.127105000000000024e+00 -3.762500000000000000e+01 -1.127110000000000056e+00 -3.775000381469726562e+01 -1.127115000000000089e+00 -3.768750000000000000e+01 -1.127120000000000122e+00 -3.771875000000000000e+01 -1.127125000000000155e+00 -3.768750000000000000e+01 -1.127130000000000187e+00 -3.768750000000000000e+01 -1.127134999999999998e+00 -3.768750000000000000e+01 -1.127140000000000031e+00 -3.775000381469726562e+01 -1.127145000000000064e+00 -3.775000381469726562e+01 -1.127150000000000096e+00 -3.771875000000000000e+01 -1.127155000000000129e+00 -3.771875000000000000e+01 -1.127160000000000162e+00 -3.762500000000000000e+01 -1.127165000000000195e+00 -3.775000381469726562e+01 -1.127170000000000005e+00 -3.775000381469726562e+01 -1.127175000000000038e+00 -3.771875000000000000e+01 -1.127180000000000071e+00 -3.778125000000000000e+01 -1.127185000000000104e+00 -3.768750000000000000e+01 -1.127190000000000136e+00 -3.781250000000000000e+01 -1.127195000000000169e+00 -3.778125000000000000e+01 -1.127200000000000202e+00 -3.775000381469726562e+01 -1.127205000000000013e+00 -3.778125000000000000e+01 -1.127210000000000045e+00 -3.775000381469726562e+01 -1.127215000000000078e+00 -3.778125000000000000e+01 -1.127220000000000111e+00 -3.778125000000000000e+01 -1.127225000000000144e+00 -3.781250000000000000e+01 -1.127230000000000176e+00 -3.781250000000000000e+01 -1.127234999999999987e+00 -3.778125000000000000e+01 -1.127240000000000020e+00 -3.787500000000000000e+01 -1.127245000000000053e+00 -3.781250000000000000e+01 -1.127250000000000085e+00 -3.778125000000000000e+01 -1.127255000000000118e+00 -3.784375381469726562e+01 -1.127260000000000151e+00 -3.784375381469726562e+01 -1.127265000000000184e+00 -3.781250000000000000e+01 -1.127269999999999994e+00 -3.784375381469726562e+01 -1.127275000000000027e+00 -3.784375381469726562e+01 -1.127280000000000060e+00 -3.778125000000000000e+01 -1.127285000000000093e+00 -3.784375381469726562e+01 -1.127290000000000125e+00 -3.787500000000000000e+01 -1.127295000000000158e+00 -3.778125000000000000e+01 -1.127300000000000191e+00 -3.778125000000000000e+01 -1.127305000000000001e+00 -3.781250000000000000e+01 -1.127310000000000034e+00 -3.781250000000000000e+01 -1.127315000000000067e+00 -3.787500000000000000e+01 -1.127320000000000100e+00 -3.784375381469726562e+01 -1.127325000000000133e+00 -3.787500000000000000e+01 -1.127330000000000165e+00 -3.775000381469726562e+01 -1.127335000000000198e+00 -3.784375381469726562e+01 -1.127340000000000009e+00 -3.784375381469726562e+01 -1.127345000000000041e+00 -3.784375381469726562e+01 -1.127350000000000074e+00 -3.784375381469726562e+01 -1.127355000000000107e+00 -3.787500000000000000e+01 -1.127360000000000140e+00 -3.784375381469726562e+01 -1.127365000000000173e+00 -3.793750000000000000e+01 -1.127369999999999983e+00 -3.787500000000000000e+01 -1.127375000000000016e+00 -3.787500000000000000e+01 -1.127380000000000049e+00 -3.784375381469726562e+01 -1.127385000000000081e+00 -3.790625000000000000e+01 -1.127390000000000114e+00 -3.784375381469726562e+01 -1.127395000000000147e+00 -3.784375381469726562e+01 -1.127400000000000180e+00 -3.784375381469726562e+01 -1.127404999999999990e+00 -3.784375381469726562e+01 -1.127410000000000023e+00 -3.787500000000000000e+01 -1.127415000000000056e+00 -3.787500000000000000e+01 -1.127420000000000089e+00 -3.790625000000000000e+01 -1.127425000000000122e+00 -3.790625000000000000e+01 -1.127430000000000154e+00 -3.787500000000000000e+01 -1.127435000000000187e+00 -3.787500000000000000e+01 -1.127439999999999998e+00 -3.790625000000000000e+01 -1.127445000000000030e+00 -3.787500000000000000e+01 -1.127450000000000063e+00 -3.790625000000000000e+01 -1.127455000000000096e+00 -3.793750000000000000e+01 -1.127460000000000129e+00 -3.793750000000000000e+01 -1.127465000000000162e+00 -3.800000381469726562e+01 -1.127470000000000194e+00 -3.790625000000000000e+01 -1.127475000000000005e+00 -3.796875000000000000e+01 -1.127480000000000038e+00 -3.793750000000000000e+01 -1.127485000000000070e+00 -3.790625000000000000e+01 -1.127490000000000103e+00 -3.793750000000000000e+01 -1.127495000000000136e+00 -3.790625000000000000e+01 -1.127500000000000169e+00 -3.790625000000000000e+01 -1.127505000000000202e+00 -3.790625000000000000e+01 -1.127510000000000012e+00 -3.790625000000000000e+01 -1.127515000000000045e+00 -3.790625000000000000e+01 -1.127520000000000078e+00 -3.800000381469726562e+01 -1.127525000000000110e+00 -3.793750000000000000e+01 -1.127530000000000143e+00 -3.800000381469726562e+01 -1.127535000000000176e+00 -3.800000381469726562e+01 -1.127539999999999987e+00 -3.793750000000000000e+01 -1.127545000000000019e+00 -3.803125000000000000e+01 -1.127550000000000052e+00 -3.796875000000000000e+01 -1.127555000000000085e+00 -3.800000381469726562e+01 -1.127560000000000118e+00 -3.800000381469726562e+01 -1.127565000000000150e+00 -3.796875000000000000e+01 -1.127570000000000183e+00 -3.796875000000000000e+01 -1.127574999999999994e+00 -3.796875000000000000e+01 -1.127580000000000027e+00 -3.796875000000000000e+01 -1.127585000000000059e+00 -3.796875000000000000e+01 -1.127590000000000092e+00 -3.803125000000000000e+01 -1.127595000000000125e+00 -3.803125000000000000e+01 -1.127600000000000158e+00 -3.809375000000000000e+01 -1.127605000000000190e+00 -3.796875000000000000e+01 -1.127610000000000001e+00 -3.806250000000000000e+01 -1.127615000000000034e+00 -3.803125000000000000e+01 -1.127620000000000067e+00 -3.800000381469726562e+01 -1.127625000000000099e+00 -3.806250000000000000e+01 -1.127630000000000132e+00 -3.809375000000000000e+01 -1.127635000000000165e+00 -3.800000381469726562e+01 -1.127640000000000198e+00 -3.803125000000000000e+01 -1.127645000000000008e+00 -3.803125000000000000e+01 -1.127650000000000041e+00 -3.803125000000000000e+01 -1.127655000000000074e+00 -3.806250000000000000e+01 -1.127660000000000107e+00 -3.809375000000000000e+01 -1.127665000000000139e+00 -3.815625381469726562e+01 -1.127670000000000172e+00 -3.806250000000000000e+01 -1.127674999999999983e+00 -3.806250000000000000e+01 -1.127680000000000016e+00 -3.815625381469726562e+01 -1.127685000000000048e+00 -3.809375000000000000e+01 -1.127690000000000081e+00 -3.806250000000000000e+01 -1.127695000000000114e+00 -3.812500000000000000e+01 -1.127700000000000147e+00 -3.803125000000000000e+01 -1.127705000000000179e+00 -3.812500000000000000e+01 -1.127709999999999990e+00 -3.812500000000000000e+01 -1.127715000000000023e+00 -3.806250000000000000e+01 -1.127720000000000056e+00 -3.815625381469726562e+01 -1.127725000000000088e+00 -3.809375000000000000e+01 -1.127730000000000121e+00 -3.815625381469726562e+01 -1.127735000000000154e+00 -3.809375000000000000e+01 -1.127740000000000187e+00 -3.815625381469726562e+01 -1.127744999999999997e+00 -3.812500000000000000e+01 -1.127750000000000030e+00 -3.809375000000000000e+01 -1.127755000000000063e+00 -3.815625381469726562e+01 -1.127760000000000096e+00 -3.812500000000000000e+01 -1.127765000000000128e+00 -3.812500000000000000e+01 -1.127770000000000161e+00 -3.815625381469726562e+01 -1.127775000000000194e+00 -3.815625381469726562e+01 -1.127780000000000005e+00 -3.818750000000000000e+01 -1.127785000000000037e+00 -3.815625381469726562e+01 -1.127790000000000070e+00 -3.818750000000000000e+01 -1.127795000000000103e+00 -3.818750000000000000e+01 -1.127800000000000136e+00 -3.818750000000000000e+01 -1.127805000000000168e+00 -3.825000000000000000e+01 -1.127810000000000201e+00 -3.818750000000000000e+01 -1.127815000000000012e+00 -3.821875000000000000e+01 -1.127820000000000045e+00 -3.815625381469726562e+01 -1.127825000000000077e+00 -3.815625381469726562e+01 -1.127830000000000110e+00 -3.821875000000000000e+01 -1.127835000000000143e+00 -3.825000000000000000e+01 -1.127840000000000176e+00 -3.818750000000000000e+01 -1.127844999999999986e+00 -3.818750000000000000e+01 -1.127850000000000019e+00 -3.821875000000000000e+01 -1.127855000000000052e+00 -3.821875000000000000e+01 -1.127860000000000085e+00 -3.825000000000000000e+01 -1.127865000000000117e+00 -3.828125000000000000e+01 -1.127870000000000150e+00 -3.818750000000000000e+01 -1.127875000000000183e+00 -3.818750000000000000e+01 -1.127879999999999994e+00 -3.825000000000000000e+01 -1.127885000000000026e+00 -3.818750000000000000e+01 -1.127890000000000059e+00 -3.818750000000000000e+01 -1.127895000000000092e+00 -3.818750000000000000e+01 -1.127900000000000125e+00 -3.825000000000000000e+01 -1.127905000000000157e+00 -3.825000000000000000e+01 -1.127910000000000190e+00 -3.825000000000000000e+01 -1.127915000000000001e+00 -3.825000000000000000e+01 -1.127920000000000034e+00 -3.828125000000000000e+01 -1.127925000000000066e+00 -3.828125000000000000e+01 -1.127930000000000099e+00 -3.828125000000000000e+01 -1.127935000000000132e+00 -3.828125000000000000e+01 -1.127940000000000165e+00 -3.831250381469726562e+01 -1.127945000000000197e+00 -3.828125000000000000e+01 -1.127950000000000008e+00 -3.831250381469726562e+01 -1.127955000000000041e+00 -3.828125000000000000e+01 -1.127960000000000074e+00 -3.834375000000000000e+01 -1.127965000000000106e+00 -3.828125000000000000e+01 -1.127970000000000139e+00 -3.821875000000000000e+01 -1.127975000000000172e+00 -3.828125000000000000e+01 -1.127979999999999983e+00 -3.831250381469726562e+01 -1.127985000000000015e+00 -3.831250381469726562e+01 -1.127990000000000048e+00 -3.834375000000000000e+01 -1.127995000000000081e+00 -3.831250381469726562e+01 -1.128000000000000114e+00 -3.834375000000000000e+01 -1.128005000000000146e+00 -3.831250381469726562e+01 -1.128010000000000179e+00 -3.828125000000000000e+01 -1.128014999999999990e+00 -3.828125000000000000e+01 -1.128020000000000023e+00 -3.834375000000000000e+01 -1.128025000000000055e+00 -3.834375000000000000e+01 -1.128030000000000088e+00 -3.834375000000000000e+01 -1.128035000000000121e+00 -3.837500000000000000e+01 -1.128040000000000154e+00 -3.828125000000000000e+01 -1.128045000000000186e+00 -3.837500000000000000e+01 -1.128049999999999997e+00 -3.834375000000000000e+01 -1.128055000000000030e+00 -3.834375000000000000e+01 -1.128060000000000063e+00 -3.834375000000000000e+01 -1.128065000000000095e+00 -3.834375000000000000e+01 -1.128070000000000128e+00 -3.831250381469726562e+01 -1.128075000000000161e+00 -3.837500000000000000e+01 -1.128080000000000194e+00 -3.834375000000000000e+01 -1.128085000000000004e+00 -3.837500000000000000e+01 -1.128090000000000037e+00 -3.828125000000000000e+01 -1.128095000000000070e+00 -3.834375000000000000e+01 -1.128100000000000103e+00 -3.834375000000000000e+01 -1.128105000000000135e+00 -3.831250381469726562e+01 -1.128110000000000168e+00 -3.837500000000000000e+01 -1.128115000000000201e+00 -3.834375000000000000e+01 -1.128120000000000012e+00 -3.834375000000000000e+01 -1.128125000000000044e+00 -3.834375000000000000e+01 -1.128130000000000077e+00 -3.837500000000000000e+01 -1.128135000000000110e+00 -3.834375000000000000e+01 -1.128140000000000143e+00 -3.837500000000000000e+01 -1.128145000000000175e+00 -3.834375000000000000e+01 -1.128149999999999986e+00 -3.840625000000000000e+01 -1.128155000000000019e+00 -3.834375000000000000e+01 -1.128160000000000052e+00 -3.834375000000000000e+01 -1.128165000000000084e+00 -3.834375000000000000e+01 -1.128170000000000117e+00 -3.837500000000000000e+01 -1.128175000000000150e+00 -3.834375000000000000e+01 -1.128180000000000183e+00 -3.837500000000000000e+01 -1.128184999999999993e+00 -3.837500000000000000e+01 -1.128190000000000026e+00 -3.834375000000000000e+01 -1.128195000000000059e+00 -3.831250381469726562e+01 -1.128200000000000092e+00 -3.837500000000000000e+01 -1.128205000000000124e+00 -3.843750000000000000e+01 -1.128210000000000157e+00 -3.837500000000000000e+01 -1.128215000000000190e+00 -3.846875381469726562e+01 -1.128220000000000001e+00 -3.840625000000000000e+01 -1.128225000000000033e+00 -3.840625000000000000e+01 -1.128230000000000066e+00 -3.840625000000000000e+01 -1.128235000000000099e+00 -3.834375000000000000e+01 -1.128240000000000132e+00 -3.837500000000000000e+01 -1.128245000000000164e+00 -3.840625000000000000e+01 -1.128250000000000197e+00 -3.837500000000000000e+01 -1.128255000000000008e+00 -3.840625000000000000e+01 -1.128260000000000041e+00 -3.843750000000000000e+01 -1.128265000000000073e+00 -3.840625000000000000e+01 -1.128270000000000106e+00 -3.843750000000000000e+01 -1.128275000000000139e+00 -3.843750000000000000e+01 -1.128280000000000172e+00 -3.843750000000000000e+01 -1.128284999999999982e+00 -3.840625000000000000e+01 -1.128290000000000015e+00 -3.843750000000000000e+01 -1.128295000000000048e+00 -3.843750000000000000e+01 -1.128300000000000081e+00 -3.843750000000000000e+01 -1.128305000000000113e+00 -3.840625000000000000e+01 -1.128310000000000146e+00 -3.843750000000000000e+01 -1.128315000000000179e+00 -3.846875381469726562e+01 -1.128319999999999990e+00 -3.843750000000000000e+01 -1.128325000000000022e+00 -3.843750000000000000e+01 -1.128330000000000055e+00 -3.840625000000000000e+01 -1.128335000000000088e+00 -3.846875381469726562e+01 -1.128340000000000121e+00 -3.846875381469726562e+01 -1.128345000000000153e+00 -3.846875381469726562e+01 -1.128350000000000186e+00 -3.850000000000000000e+01 -1.128354999999999997e+00 -3.843750000000000000e+01 -1.128360000000000030e+00 -3.850000000000000000e+01 -1.128365000000000062e+00 -3.850000000000000000e+01 -1.128370000000000095e+00 -3.846875381469726562e+01 -1.128375000000000128e+00 -3.846875381469726562e+01 -1.128380000000000161e+00 -3.850000000000000000e+01 -1.128385000000000193e+00 -3.850000000000000000e+01 -1.128390000000000004e+00 -3.853125000000000000e+01 -1.128395000000000037e+00 -3.853125000000000000e+01 -1.128400000000000070e+00 -3.853125000000000000e+01 -1.128405000000000102e+00 -3.846875381469726562e+01 -1.128410000000000135e+00 -3.850000000000000000e+01 -1.128415000000000168e+00 -3.846875381469726562e+01 -1.128420000000000201e+00 -3.856250381469726562e+01 -1.128425000000000011e+00 -3.850000000000000000e+01 -1.128430000000000044e+00 -3.856250381469726562e+01 -1.128435000000000077e+00 -3.853125000000000000e+01 -1.128440000000000110e+00 -3.859375000000000000e+01 -1.128445000000000142e+00 -3.853125000000000000e+01 -1.128450000000000175e+00 -3.853125000000000000e+01 -1.128454999999999986e+00 -3.853125000000000000e+01 -1.128460000000000019e+00 -3.856250381469726562e+01 -1.128465000000000051e+00 -3.856250381469726562e+01 -1.128470000000000084e+00 -3.856250381469726562e+01 -1.128475000000000117e+00 -3.856250381469726562e+01 -1.128480000000000150e+00 -3.856250381469726562e+01 -1.128485000000000182e+00 -3.859375000000000000e+01 -1.128489999999999993e+00 -3.859375000000000000e+01 -1.128495000000000026e+00 -3.862500000000000000e+01 -1.128500000000000059e+00 -3.859375000000000000e+01 -1.128505000000000091e+00 -3.853125000000000000e+01 -1.128510000000000124e+00 -3.853125000000000000e+01 -1.128515000000000157e+00 -3.856250381469726562e+01 -1.128520000000000190e+00 -3.865625000000000000e+01 -1.128525000000000000e+00 -3.859375000000000000e+01 -1.128530000000000033e+00 -3.859375000000000000e+01 -1.128535000000000066e+00 -3.856250381469726562e+01 -1.128540000000000099e+00 -3.853125000000000000e+01 -1.128545000000000131e+00 -3.859375000000000000e+01 -1.128550000000000164e+00 -3.859375000000000000e+01 -1.128555000000000197e+00 -3.859375000000000000e+01 -1.128560000000000008e+00 -3.853125000000000000e+01 -1.128565000000000040e+00 -3.856250381469726562e+01 -1.128570000000000073e+00 -3.865625000000000000e+01 -1.128575000000000106e+00 -3.850000000000000000e+01 -1.128580000000000139e+00 -3.856250381469726562e+01 -1.128585000000000171e+00 -3.859375000000000000e+01 -1.128589999999999982e+00 -3.856250381469726562e+01 -1.128595000000000015e+00 -3.856250381469726562e+01 -1.128600000000000048e+00 -3.859375000000000000e+01 -1.128605000000000080e+00 -3.853125000000000000e+01 -1.128610000000000113e+00 -3.853125000000000000e+01 -1.128615000000000146e+00 -3.856250381469726562e+01 -1.128620000000000179e+00 -3.865625000000000000e+01 -1.128624999999999989e+00 -3.856250381469726562e+01 -1.128630000000000022e+00 -3.853125000000000000e+01 -1.128635000000000055e+00 -3.859375000000000000e+01 -1.128640000000000088e+00 -3.856250381469726562e+01 -1.128645000000000120e+00 -3.862500000000000000e+01 -1.128650000000000153e+00 -3.862500000000000000e+01 -1.128655000000000186e+00 -3.859375000000000000e+01 -1.128659999999999997e+00 -3.859375000000000000e+01 -1.128665000000000029e+00 -3.862500000000000000e+01 -1.128670000000000062e+00 -3.865625000000000000e+01 -1.128675000000000095e+00 -3.859375000000000000e+01 -1.128680000000000128e+00 -3.862500000000000000e+01 -1.128685000000000160e+00 -3.865625000000000000e+01 -1.128690000000000193e+00 -3.859375000000000000e+01 -1.128695000000000004e+00 -3.865625000000000000e+01 -1.128700000000000037e+00 -3.868750000000000000e+01 -1.128705000000000069e+00 -3.862500000000000000e+01 -1.128710000000000102e+00 -3.868750000000000000e+01 -1.128715000000000135e+00 -3.865625000000000000e+01 -1.128720000000000168e+00 -3.868750000000000000e+01 -1.128725000000000200e+00 -3.868750000000000000e+01 -1.128730000000000011e+00 -3.865625000000000000e+01 -1.128735000000000044e+00 -3.865625000000000000e+01 -1.128740000000000077e+00 -3.865625000000000000e+01 -1.128745000000000109e+00 -3.868750000000000000e+01 -1.128750000000000142e+00 -3.865625000000000000e+01 -1.128755000000000175e+00 -3.871875381469726562e+01 -1.128759999999999986e+00 -3.865625000000000000e+01 -1.128765000000000018e+00 -3.868750000000000000e+01 -1.128770000000000051e+00 -3.865625000000000000e+01 -1.128775000000000084e+00 -3.865625000000000000e+01 -1.128780000000000117e+00 -3.868750000000000000e+01 -1.128785000000000149e+00 -3.865625000000000000e+01 -1.128790000000000182e+00 -3.871875381469726562e+01 -1.128794999999999993e+00 -3.862500000000000000e+01 -1.128800000000000026e+00 -3.868750000000000000e+01 -1.128805000000000058e+00 -3.865625000000000000e+01 -1.128810000000000091e+00 -3.862500000000000000e+01 -1.128815000000000124e+00 -3.862500000000000000e+01 -1.128820000000000157e+00 -3.862500000000000000e+01 -1.128825000000000189e+00 -3.871875381469726562e+01 -1.128830000000000000e+00 -3.865625000000000000e+01 -1.128835000000000033e+00 -3.862500000000000000e+01 -1.128840000000000066e+00 -3.871875381469726562e+01 -1.128845000000000098e+00 -3.868750000000000000e+01 -1.128850000000000131e+00 -3.868750000000000000e+01 -1.128855000000000164e+00 -3.865625000000000000e+01 -1.128860000000000197e+00 -3.871875381469726562e+01 -1.128865000000000007e+00 -3.868750000000000000e+01 -1.128870000000000040e+00 -3.868750000000000000e+01 -1.128875000000000073e+00 -3.865625000000000000e+01 -1.128880000000000106e+00 -3.865625000000000000e+01 -1.128885000000000138e+00 -3.862500000000000000e+01 -1.128890000000000171e+00 -3.865625000000000000e+01 -1.128894999999999982e+00 -3.868750000000000000e+01 -1.128900000000000015e+00 -3.868750000000000000e+01 -1.128905000000000047e+00 -3.868750000000000000e+01 -1.128910000000000080e+00 -3.865625000000000000e+01 -1.128915000000000113e+00 -3.862500000000000000e+01 -1.128920000000000146e+00 -3.865625000000000000e+01 -1.128925000000000178e+00 -3.871875381469726562e+01 -1.128929999999999989e+00 -3.868750000000000000e+01 -1.128935000000000022e+00 -3.868750000000000000e+01 -1.128940000000000055e+00 -3.875000000000000000e+01 -1.128945000000000087e+00 -3.868750000000000000e+01 -1.128950000000000120e+00 -3.871875381469726562e+01 -1.128955000000000153e+00 -3.871875381469726562e+01 -1.128960000000000186e+00 -3.875000000000000000e+01 -1.128964999999999996e+00 -3.871875381469726562e+01 -1.128970000000000029e+00 -3.871875381469726562e+01 -1.128975000000000062e+00 -3.875000000000000000e+01 -1.128980000000000095e+00 -3.871875381469726562e+01 -1.128985000000000127e+00 -3.865625000000000000e+01 -1.128990000000000160e+00 -3.875000000000000000e+01 -1.128995000000000193e+00 -3.875000000000000000e+01 -1.129000000000000004e+00 -3.875000000000000000e+01 -1.129005000000000036e+00 -3.875000000000000000e+01 -1.129010000000000069e+00 -3.868750000000000000e+01 -1.129015000000000102e+00 -3.868750000000000000e+01 -1.129020000000000135e+00 -3.871875381469726562e+01 -1.129025000000000167e+00 -3.868750000000000000e+01 -1.129030000000000200e+00 -3.871875381469726562e+01 -1.129035000000000011e+00 -3.871875381469726562e+01 -1.129040000000000044e+00 -3.875000000000000000e+01 -1.129045000000000076e+00 -3.871875381469726562e+01 -1.129050000000000109e+00 -3.871875381469726562e+01 -1.129055000000000142e+00 -3.878125000000000000e+01 -1.129060000000000175e+00 -3.871875381469726562e+01 -1.129064999999999985e+00 -3.871875381469726562e+01 -1.129070000000000018e+00 -3.878125000000000000e+01 -1.129075000000000051e+00 -3.868750000000000000e+01 -1.129080000000000084e+00 -3.871875381469726562e+01 -1.129085000000000116e+00 -3.871875381469726562e+01 -1.129090000000000149e+00 -3.871875381469726562e+01 -1.129095000000000182e+00 -3.871875381469726562e+01 -1.129099999999999993e+00 -3.868750000000000000e+01 -1.129105000000000025e+00 -3.868750000000000000e+01 -1.129110000000000058e+00 -3.871875381469726562e+01 -1.129115000000000091e+00 -3.871875381469726562e+01 -1.129120000000000124e+00 -3.865625000000000000e+01 -1.129125000000000156e+00 -3.875000000000000000e+01 -1.129130000000000189e+00 -3.871875381469726562e+01 -1.129135000000000000e+00 -3.871875381469726562e+01 -1.129140000000000033e+00 -3.878125000000000000e+01 -1.129145000000000065e+00 -3.865625000000000000e+01 -1.129150000000000098e+00 -3.871875381469726562e+01 -1.129155000000000131e+00 -3.868750000000000000e+01 -1.129160000000000164e+00 -3.868750000000000000e+01 -1.129165000000000196e+00 -3.868750000000000000e+01 -1.129170000000000007e+00 -3.875000000000000000e+01 -1.129175000000000040e+00 -3.881250000000000000e+01 -1.129180000000000073e+00 -3.871875381469726562e+01 -1.129185000000000105e+00 -3.878125000000000000e+01 -1.129190000000000138e+00 -3.878125000000000000e+01 -1.129195000000000171e+00 -3.878125000000000000e+01 -1.129199999999999982e+00 -3.878125000000000000e+01 -1.129205000000000014e+00 -3.875000000000000000e+01 -1.129210000000000047e+00 -3.875000000000000000e+01 -1.129215000000000080e+00 -3.875000000000000000e+01 -1.129220000000000113e+00 -3.878125000000000000e+01 -1.129225000000000145e+00 -3.875000000000000000e+01 -1.129230000000000178e+00 -3.878125000000000000e+01 -1.129234999999999989e+00 -3.871875381469726562e+01 -1.129240000000000022e+00 -3.884375000000000000e+01 -1.129245000000000054e+00 -3.875000000000000000e+01 -1.129250000000000087e+00 -3.878125000000000000e+01 -1.129255000000000120e+00 -3.878125000000000000e+01 -1.129260000000000153e+00 -3.884375000000000000e+01 -1.129265000000000185e+00 -3.884375000000000000e+01 -1.129269999999999996e+00 -3.878125000000000000e+01 -1.129275000000000029e+00 -3.884375000000000000e+01 -1.129280000000000062e+00 -3.878125000000000000e+01 -1.129285000000000094e+00 -3.878125000000000000e+01 -1.129290000000000127e+00 -3.878125000000000000e+01 -1.129295000000000160e+00 -3.875000000000000000e+01 -1.129300000000000193e+00 -3.884375000000000000e+01 -1.129305000000000003e+00 -3.871875381469726562e+01 -1.129310000000000036e+00 -3.871875381469726562e+01 -1.129315000000000069e+00 -3.878125000000000000e+01 -1.129320000000000102e+00 -3.881250000000000000e+01 -1.129325000000000134e+00 -3.878125000000000000e+01 -1.129330000000000167e+00 -3.878125000000000000e+01 -1.129335000000000200e+00 -3.875000000000000000e+01 -1.129340000000000011e+00 -3.875000000000000000e+01 -1.129345000000000043e+00 -3.875000000000000000e+01 -1.129350000000000076e+00 -3.875000000000000000e+01 -1.129355000000000109e+00 -3.878125000000000000e+01 -1.129360000000000142e+00 -3.878125000000000000e+01 -1.129365000000000174e+00 -3.878125000000000000e+01 -1.129369999999999985e+00 -3.871875381469726562e+01 -1.129375000000000018e+00 -3.878125000000000000e+01 -1.129380000000000051e+00 -3.875000000000000000e+01 -1.129385000000000083e+00 -3.871875381469726562e+01 -1.129390000000000116e+00 -3.878125000000000000e+01 -1.129395000000000149e+00 -3.878125000000000000e+01 -1.129400000000000182e+00 -3.881250000000000000e+01 -1.129404999999999992e+00 -3.878125000000000000e+01 -1.129410000000000025e+00 -3.881250000000000000e+01 -1.129415000000000058e+00 -3.884375000000000000e+01 -1.129420000000000091e+00 -3.878125000000000000e+01 -1.129425000000000123e+00 -3.881250000000000000e+01 -1.129430000000000156e+00 -3.878125000000000000e+01 -1.129435000000000189e+00 -3.884375000000000000e+01 -1.129440000000000000e+00 -3.887500381469726562e+01 -1.129445000000000032e+00 -3.881250000000000000e+01 -1.129450000000000065e+00 -3.884375000000000000e+01 -1.129455000000000098e+00 -3.884375000000000000e+01 -1.129460000000000131e+00 -3.884375000000000000e+01 -1.129465000000000163e+00 -3.890625000000000000e+01 -1.129470000000000196e+00 -3.887500381469726562e+01 -1.129475000000000007e+00 -3.887500381469726562e+01 -1.129480000000000040e+00 -3.887500381469726562e+01 -1.129485000000000072e+00 -3.884375000000000000e+01 -1.129490000000000105e+00 -3.890625000000000000e+01 -1.129495000000000138e+00 -3.896875000000000000e+01 -1.129500000000000171e+00 -3.890625000000000000e+01 -1.129505000000000203e+00 -3.893750000000000000e+01 -1.129510000000000014e+00 -3.893750000000000000e+01 -1.129515000000000047e+00 -3.893750000000000000e+01 -1.129520000000000080e+00 -3.890625000000000000e+01 -1.129525000000000112e+00 -3.893750000000000000e+01 -1.129530000000000145e+00 -3.887500381469726562e+01 -1.129535000000000178e+00 -3.893750000000000000e+01 -1.129539999999999988e+00 -3.887500381469726562e+01 -1.129545000000000021e+00 -3.887500381469726562e+01 -1.129550000000000054e+00 -3.896875000000000000e+01 -1.129555000000000087e+00 -3.900000000000000000e+01 -1.129560000000000120e+00 -3.893750000000000000e+01 -1.129565000000000152e+00 -3.893750000000000000e+01 -1.129570000000000185e+00 -3.896875000000000000e+01 -1.129574999999999996e+00 -3.896875000000000000e+01 -1.129580000000000028e+00 -3.890625000000000000e+01 -1.129585000000000061e+00 -3.893750000000000000e+01 -1.129590000000000094e+00 -3.893750000000000000e+01 -1.129595000000000127e+00 -3.896875000000000000e+01 -1.129600000000000160e+00 -3.893750000000000000e+01 -1.129605000000000192e+00 -3.896875000000000000e+01 -1.129610000000000003e+00 -3.893750000000000000e+01 -1.129615000000000036e+00 -3.893750000000000000e+01 -1.129620000000000068e+00 -3.890625000000000000e+01 -1.129625000000000101e+00 -3.893750000000000000e+01 -1.129630000000000134e+00 -3.893750000000000000e+01 -1.129635000000000167e+00 -3.893750000000000000e+01 -1.129640000000000200e+00 -3.900000000000000000e+01 -1.129645000000000010e+00 -3.893750000000000000e+01 -1.129650000000000043e+00 -3.893750000000000000e+01 -1.129655000000000076e+00 -3.893750000000000000e+01 -1.129660000000000108e+00 -3.893750000000000000e+01 -1.129665000000000141e+00 -3.900000000000000000e+01 -1.129670000000000174e+00 -3.896875000000000000e+01 -1.129674999999999985e+00 -3.893750000000000000e+01 -1.129680000000000017e+00 -3.896875000000000000e+01 -1.129685000000000050e+00 -3.896875000000000000e+01 -1.129690000000000083e+00 -3.896875000000000000e+01 -1.129695000000000116e+00 -3.896875000000000000e+01 -1.129700000000000149e+00 -3.896875000000000000e+01 -1.129705000000000181e+00 -3.890625000000000000e+01 -1.129709999999999992e+00 -3.896875000000000000e+01 -1.129715000000000025e+00 -3.896875000000000000e+01 -1.129720000000000057e+00 -3.896875000000000000e+01 -1.129725000000000090e+00 -3.900000000000000000e+01 -1.129730000000000123e+00 -3.900000000000000000e+01 -1.129735000000000156e+00 -3.900000000000000000e+01 -1.129740000000000189e+00 -3.900000000000000000e+01 -1.129744999999999999e+00 -3.896875000000000000e+01 -1.129750000000000032e+00 -3.900000000000000000e+01 -1.129755000000000065e+00 -3.896875000000000000e+01 -1.129760000000000097e+00 -3.903125381469726562e+01 -1.129765000000000130e+00 -3.903125381469726562e+01 -1.129770000000000163e+00 -3.900000000000000000e+01 -1.129775000000000196e+00 -3.900000000000000000e+01 -1.129780000000000006e+00 -3.900000000000000000e+01 -1.129785000000000039e+00 -3.900000000000000000e+01 -1.129790000000000072e+00 -3.903125381469726562e+01 -1.129795000000000105e+00 -3.900000000000000000e+01 -1.129800000000000137e+00 -3.903125381469726562e+01 -1.129805000000000170e+00 -3.900000000000000000e+01 -1.129810000000000203e+00 -3.906250000000000000e+01 -1.129815000000000014e+00 -3.900000000000000000e+01 -1.129820000000000046e+00 -3.900000000000000000e+01 -1.129825000000000079e+00 -3.896875000000000000e+01 -1.129830000000000112e+00 -3.900000000000000000e+01 -1.129835000000000145e+00 -3.900000000000000000e+01 -1.129840000000000177e+00 -3.900000000000000000e+01 -1.129844999999999988e+00 -3.900000000000000000e+01 -1.129850000000000021e+00 -3.900000000000000000e+01 -1.129855000000000054e+00 -3.900000000000000000e+01 -1.129860000000000086e+00 -3.900000000000000000e+01 -1.129865000000000119e+00 -3.900000000000000000e+01 -1.129870000000000152e+00 -3.903125381469726562e+01 -1.129875000000000185e+00 -3.900000000000000000e+01 -1.129879999999999995e+00 -3.900000000000000000e+01 -1.129885000000000028e+00 -3.903125381469726562e+01 -1.129890000000000061e+00 -3.900000000000000000e+01 -1.129895000000000094e+00 -3.909375000000000000e+01 -1.129900000000000126e+00 -3.903125381469726562e+01 -1.129905000000000159e+00 -3.900000000000000000e+01 -1.129910000000000192e+00 -3.900000000000000000e+01 -1.129915000000000003e+00 -3.900000000000000000e+01 -1.129920000000000035e+00 -3.900000000000000000e+01 -1.129925000000000068e+00 -3.900000000000000000e+01 -1.129930000000000101e+00 -3.900000000000000000e+01 -1.129935000000000134e+00 -3.900000000000000000e+01 -1.129940000000000166e+00 -3.903125381469726562e+01 -1.129945000000000199e+00 -3.903125381469726562e+01 -1.129950000000000010e+00 -3.903125381469726562e+01 -1.129955000000000043e+00 -3.906250000000000000e+01 -1.129960000000000075e+00 -3.909375000000000000e+01 -1.129965000000000108e+00 -3.900000000000000000e+01 -1.129970000000000141e+00 -3.900000000000000000e+01 -1.129975000000000174e+00 -3.903125381469726562e+01 -1.129979999999999984e+00 -3.906250000000000000e+01 -1.129985000000000017e+00 -3.900000000000000000e+01 -1.129990000000000050e+00 -3.903125381469726562e+01 -1.129995000000000083e+00 -3.903125381469726562e+01 -1.130000000000000115e+00 -3.903125381469726562e+01 -1.130005000000000148e+00 -3.906250000000000000e+01 -1.130010000000000181e+00 -3.903125381469726562e+01 -1.130014999999999992e+00 -3.906250000000000000e+01 -1.130020000000000024e+00 -3.909375000000000000e+01 -1.130025000000000057e+00 -3.909375000000000000e+01 -1.130030000000000090e+00 -3.912500000000000000e+01 -1.130035000000000123e+00 -3.909375000000000000e+01 -1.130040000000000155e+00 -3.906250000000000000e+01 -1.130045000000000188e+00 -3.896875000000000000e+01 -1.130049999999999999e+00 -3.909375000000000000e+01 -1.130055000000000032e+00 -3.906250000000000000e+01 -1.130060000000000064e+00 -3.906250000000000000e+01 -1.130065000000000097e+00 -3.906250000000000000e+01 -1.130070000000000130e+00 -3.906250000000000000e+01 -1.130075000000000163e+00 -3.906250000000000000e+01 -1.130080000000000195e+00 -3.903125381469726562e+01 -1.130085000000000006e+00 -3.906250000000000000e+01 -1.130090000000000039e+00 -3.903125381469726562e+01 -1.130095000000000072e+00 -3.906250000000000000e+01 -1.130100000000000104e+00 -3.912500000000000000e+01 -1.130105000000000137e+00 -3.900000000000000000e+01 -1.130110000000000170e+00 -3.906250000000000000e+01 -1.130115000000000203e+00 -3.909375000000000000e+01 -1.130120000000000013e+00 -3.906250000000000000e+01 -1.130125000000000046e+00 -3.906250000000000000e+01 -1.130130000000000079e+00 -3.906250000000000000e+01 -1.130135000000000112e+00 -3.903125381469726562e+01 -1.130140000000000144e+00 -3.909375000000000000e+01 -1.130145000000000177e+00 -3.906250000000000000e+01 -1.130149999999999988e+00 -3.903125381469726562e+01 -1.130155000000000021e+00 -3.906250000000000000e+01 -1.130160000000000053e+00 -3.915625000000000000e+01 -1.130165000000000086e+00 -3.906250000000000000e+01 -1.130170000000000119e+00 -3.906250000000000000e+01 -1.130175000000000152e+00 -3.903125381469726562e+01 -1.130180000000000184e+00 -3.903125381469726562e+01 -1.130184999999999995e+00 -3.906250000000000000e+01 -1.130190000000000028e+00 -3.900000000000000000e+01 -1.130195000000000061e+00 -3.903125381469726562e+01 -1.130200000000000093e+00 -3.909375000000000000e+01 -1.130205000000000126e+00 -3.906250000000000000e+01 -1.130210000000000159e+00 -3.906250000000000000e+01 -1.130215000000000192e+00 -3.900000000000000000e+01 -1.130220000000000002e+00 -3.900000000000000000e+01 -1.130225000000000035e+00 -3.906250000000000000e+01 -1.130230000000000068e+00 -3.909375000000000000e+01 -1.130235000000000101e+00 -3.906250000000000000e+01 -1.130240000000000133e+00 -3.906250000000000000e+01 -1.130245000000000166e+00 -3.909375000000000000e+01 -1.130250000000000199e+00 -3.909375000000000000e+01 -1.130255000000000010e+00 -3.909375000000000000e+01 -1.130260000000000042e+00 -3.906250000000000000e+01 -1.130265000000000075e+00 -3.906250000000000000e+01 -1.130270000000000108e+00 -3.909375000000000000e+01 -1.130275000000000141e+00 -3.915625000000000000e+01 -1.130280000000000173e+00 -3.915625000000000000e+01 -1.130284999999999984e+00 -3.903125381469726562e+01 -1.130290000000000017e+00 -3.909375000000000000e+01 -1.130295000000000050e+00 -3.909375000000000000e+01 -1.130300000000000082e+00 -3.906250000000000000e+01 -1.130305000000000115e+00 -3.912500000000000000e+01 -1.130310000000000148e+00 -3.912500000000000000e+01 -1.130315000000000181e+00 -3.915625000000000000e+01 -1.130319999999999991e+00 -3.912500000000000000e+01 -1.130325000000000024e+00 -3.906250000000000000e+01 -1.130330000000000057e+00 -3.906250000000000000e+01 -1.130335000000000090e+00 -3.912500000000000000e+01 -1.130340000000000122e+00 -3.903125381469726562e+01 -1.130345000000000155e+00 -3.912500000000000000e+01 -1.130350000000000188e+00 -3.909375000000000000e+01 -1.130354999999999999e+00 -3.909375000000000000e+01 -1.130360000000000031e+00 -3.915625000000000000e+01 -1.130365000000000064e+00 -3.912500000000000000e+01 -1.130370000000000097e+00 -3.915625000000000000e+01 -1.130375000000000130e+00 -3.912500000000000000e+01 -1.130380000000000162e+00 -3.915625000000000000e+01 -1.130385000000000195e+00 -3.915625000000000000e+01 -1.130390000000000006e+00 -3.912500000000000000e+01 -1.130395000000000039e+00 -3.915625000000000000e+01 -1.130400000000000071e+00 -3.912500000000000000e+01 -1.130405000000000104e+00 -3.909375000000000000e+01 -1.130410000000000137e+00 -3.909375000000000000e+01 -1.130415000000000170e+00 -3.912500000000000000e+01 -1.130420000000000202e+00 -3.915625000000000000e+01 -1.130425000000000013e+00 -3.915625000000000000e+01 -1.130430000000000046e+00 -3.915625000000000000e+01 -1.130435000000000079e+00 -3.915625000000000000e+01 -1.130440000000000111e+00 -3.915625000000000000e+01 -1.130445000000000144e+00 -3.918750381469726562e+01 -1.130450000000000177e+00 -3.915625000000000000e+01 -1.130454999999999988e+00 -3.909375000000000000e+01 -1.130460000000000020e+00 -3.918750381469726562e+01 -1.130465000000000053e+00 -3.915625000000000000e+01 -1.130470000000000086e+00 -3.915625000000000000e+01 -1.130475000000000119e+00 -3.918750381469726562e+01 -1.130480000000000151e+00 -3.921875000000000000e+01 -1.130485000000000184e+00 -3.918750381469726562e+01 -1.130489999999999995e+00 -3.909375000000000000e+01 -1.130495000000000028e+00 -3.918750381469726562e+01 -1.130500000000000060e+00 -3.918750381469726562e+01 -1.130505000000000093e+00 -3.918750381469726562e+01 -1.130510000000000126e+00 -3.925000000000000000e+01 -1.130515000000000159e+00 -3.918750381469726562e+01 -1.130520000000000191e+00 -3.915625000000000000e+01 -1.130525000000000002e+00 -3.921875000000000000e+01 -1.130530000000000035e+00 -3.915625000000000000e+01 -1.130535000000000068e+00 -3.921875000000000000e+01 -1.130540000000000100e+00 -3.918750381469726562e+01 -1.130545000000000133e+00 -3.915625000000000000e+01 -1.130550000000000166e+00 -3.925000000000000000e+01 -1.130555000000000199e+00 -3.918750381469726562e+01 -1.130560000000000009e+00 -3.918750381469726562e+01 -1.130565000000000042e+00 -3.912500000000000000e+01 -1.130570000000000075e+00 -3.915625000000000000e+01 -1.130575000000000108e+00 -3.918750381469726562e+01 -1.130580000000000140e+00 -3.928125000000000000e+01 -1.130585000000000173e+00 -3.921875000000000000e+01 -1.130589999999999984e+00 -3.918750381469726562e+01 -1.130595000000000017e+00 -3.918750381469726562e+01 -1.130600000000000049e+00 -3.921875000000000000e+01 -1.130605000000000082e+00 -3.915625000000000000e+01 -1.130610000000000115e+00 -3.921875000000000000e+01 -1.130615000000000148e+00 -3.921875000000000000e+01 -1.130620000000000180e+00 -3.921875000000000000e+01 -1.130624999999999991e+00 -3.921875000000000000e+01 -1.130630000000000024e+00 -3.915625000000000000e+01 -1.130635000000000057e+00 -3.925000000000000000e+01 -1.130640000000000089e+00 -3.921875000000000000e+01 -1.130645000000000122e+00 -3.918750381469726562e+01 -1.130650000000000155e+00 -3.921875000000000000e+01 -1.130655000000000188e+00 -3.921875000000000000e+01 -1.130659999999999998e+00 -3.918750381469726562e+01 -1.130665000000000031e+00 -3.915625000000000000e+01 -1.130670000000000064e+00 -3.921875000000000000e+01 -1.130675000000000097e+00 -3.918750381469726562e+01 -1.130680000000000129e+00 -3.928125000000000000e+01 -1.130685000000000162e+00 -3.928125000000000000e+01 -1.130690000000000195e+00 -3.928125000000000000e+01 -1.130695000000000006e+00 -3.925000000000000000e+01 -1.130700000000000038e+00 -3.928125000000000000e+01 -1.130705000000000071e+00 -3.928125000000000000e+01 -1.130710000000000104e+00 -3.934375381469726562e+01 -1.130715000000000137e+00 -3.931250000000000000e+01 -1.130720000000000169e+00 -3.931250000000000000e+01 -1.130725000000000202e+00 -3.928125000000000000e+01 -1.130730000000000013e+00 -3.928125000000000000e+01 -1.130735000000000046e+00 -3.931250000000000000e+01 -1.130740000000000078e+00 -3.931250000000000000e+01 -1.130745000000000111e+00 -3.931250000000000000e+01 -1.130750000000000144e+00 -3.925000000000000000e+01 -1.130755000000000177e+00 -3.928125000000000000e+01 -1.130759999999999987e+00 -3.931250000000000000e+01 -1.130765000000000020e+00 -3.928125000000000000e+01 -1.130770000000000053e+00 -3.928125000000000000e+01 -1.130775000000000086e+00 -3.934375381469726562e+01 -1.130780000000000118e+00 -3.931250000000000000e+01 -1.130785000000000151e+00 -3.928125000000000000e+01 -1.130790000000000184e+00 -3.931250000000000000e+01 -1.130794999999999995e+00 -3.925000000000000000e+01 -1.130800000000000027e+00 -3.931250000000000000e+01 -1.130805000000000060e+00 -3.931250000000000000e+01 -1.130810000000000093e+00 -3.921875000000000000e+01 -1.130815000000000126e+00 -3.928125000000000000e+01 -1.130820000000000158e+00 -3.928125000000000000e+01 -1.130825000000000191e+00 -3.928125000000000000e+01 -1.130830000000000002e+00 -3.925000000000000000e+01 -1.130835000000000035e+00 -3.934375381469726562e+01 -1.130840000000000067e+00 -3.934375381469726562e+01 -1.130845000000000100e+00 -3.934375381469726562e+01 -1.130850000000000133e+00 -3.934375381469726562e+01 -1.130855000000000166e+00 -3.931250000000000000e+01 -1.130860000000000198e+00 -3.928125000000000000e+01 -1.130865000000000009e+00 -3.937500000000000000e+01 -1.130870000000000042e+00 -3.928125000000000000e+01 -1.130875000000000075e+00 -3.934375381469726562e+01 -1.130880000000000107e+00 -3.934375381469726562e+01 -1.130885000000000140e+00 -3.931250000000000000e+01 -1.130890000000000173e+00 -3.928125000000000000e+01 -1.130894999999999984e+00 -3.937500000000000000e+01 -1.130900000000000016e+00 -3.934375381469726562e+01 -1.130905000000000049e+00 -3.937500000000000000e+01 -1.130910000000000082e+00 -3.934375381469726562e+01 -1.130915000000000115e+00 -3.928125000000000000e+01 -1.130920000000000147e+00 -3.934375381469726562e+01 -1.130925000000000180e+00 -3.940625000000000000e+01 -1.130929999999999991e+00 -3.934375381469726562e+01 -1.130935000000000024e+00 -3.937500000000000000e+01 -1.130940000000000056e+00 -3.931250000000000000e+01 -1.130945000000000089e+00 -3.937500000000000000e+01 -1.130950000000000122e+00 -3.931250000000000000e+01 -1.130955000000000155e+00 -3.934375381469726562e+01 -1.130960000000000187e+00 -3.931250000000000000e+01 -1.130964999999999998e+00 -3.931250000000000000e+01 -1.130970000000000031e+00 -3.937500000000000000e+01 -1.130975000000000064e+00 -3.931250000000000000e+01 -1.130980000000000096e+00 -3.937500000000000000e+01 -1.130985000000000129e+00 -3.925000000000000000e+01 -1.130990000000000162e+00 -3.931250000000000000e+01 -1.130995000000000195e+00 -3.937500000000000000e+01 -1.131000000000000005e+00 -3.931250000000000000e+01 -1.131005000000000038e+00 -3.931250000000000000e+01 -1.131010000000000071e+00 -3.934375381469726562e+01 -1.131015000000000104e+00 -3.934375381469726562e+01 -1.131020000000000136e+00 -3.934375381469726562e+01 -1.131025000000000169e+00 -3.934375381469726562e+01 -1.131030000000000202e+00 -3.934375381469726562e+01 -1.131035000000000013e+00 -3.934375381469726562e+01 -1.131040000000000045e+00 -3.934375381469726562e+01 -1.131045000000000078e+00 -3.934375381469726562e+01 -1.131050000000000111e+00 -3.931250000000000000e+01 -1.131055000000000144e+00 -3.928125000000000000e+01 -1.131060000000000176e+00 -3.934375381469726562e+01 -1.131064999999999987e+00 -3.928125000000000000e+01 -1.131070000000000020e+00 -3.937500000000000000e+01 -1.131075000000000053e+00 -3.934375381469726562e+01 -1.131080000000000085e+00 -3.934375381469726562e+01 -1.131085000000000118e+00 -3.934375381469726562e+01 -1.131090000000000151e+00 -3.931250000000000000e+01 -1.131095000000000184e+00 -3.931250000000000000e+01 -1.131099999999999994e+00 -3.934375381469726562e+01 -1.131105000000000027e+00 -3.931250000000000000e+01 -1.131110000000000060e+00 -3.931250000000000000e+01 -1.131115000000000093e+00 -3.925000000000000000e+01 -1.131120000000000125e+00 -3.934375381469726562e+01 -1.131125000000000158e+00 -3.934375381469726562e+01 -1.131130000000000191e+00 -3.937500000000000000e+01 -1.131135000000000002e+00 -3.934375381469726562e+01 -1.131140000000000034e+00 -3.928125000000000000e+01 -1.131145000000000067e+00 -3.928125000000000000e+01 -1.131150000000000100e+00 -3.931250000000000000e+01 -1.131155000000000133e+00 -3.931250000000000000e+01 -1.131160000000000165e+00 -3.931250000000000000e+01 -1.131165000000000198e+00 -3.934375381469726562e+01 -1.131170000000000009e+00 -3.934375381469726562e+01 -1.131175000000000042e+00 -3.928125000000000000e+01 -1.131180000000000074e+00 -3.934375381469726562e+01 -1.131185000000000107e+00 -3.931250000000000000e+01 -1.131190000000000140e+00 -3.934375381469726562e+01 -1.131195000000000173e+00 -3.934375381469726562e+01 -1.131199999999999983e+00 -3.931250000000000000e+01 -1.131205000000000016e+00 -3.934375381469726562e+01 -1.131210000000000049e+00 -3.934375381469726562e+01 -1.131215000000000082e+00 -3.934375381469726562e+01 -1.131220000000000114e+00 -3.931250000000000000e+01 -1.131225000000000147e+00 -3.934375381469726562e+01 -1.131230000000000180e+00 -3.928125000000000000e+01 -1.131234999999999991e+00 -3.928125000000000000e+01 -1.131240000000000023e+00 -3.937500000000000000e+01 -1.131245000000000056e+00 -3.937500000000000000e+01 -1.131250000000000089e+00 -3.934375381469726562e+01 -1.131255000000000122e+00 -3.931250000000000000e+01 -1.131260000000000154e+00 -3.931250000000000000e+01 -1.131265000000000187e+00 -3.934375381469726562e+01 -1.131269999999999998e+00 -3.934375381469726562e+01 -1.131275000000000031e+00 -3.931250000000000000e+01 -1.131280000000000063e+00 -3.937500000000000000e+01 -1.131285000000000096e+00 -3.940625000000000000e+01 -1.131290000000000129e+00 -3.934375381469726562e+01 -1.131295000000000162e+00 -3.931250000000000000e+01 -1.131300000000000194e+00 -3.934375381469726562e+01 -1.131305000000000005e+00 -3.931250000000000000e+01 -1.131310000000000038e+00 -3.934375381469726562e+01 -1.131315000000000071e+00 -3.931250000000000000e+01 -1.131320000000000103e+00 -3.931250000000000000e+01 -1.131325000000000136e+00 -3.931250000000000000e+01 -1.131330000000000169e+00 -3.937500000000000000e+01 -1.131335000000000202e+00 -3.934375381469726562e+01 -1.131340000000000012e+00 -3.931250000000000000e+01 -1.131345000000000045e+00 -3.937500000000000000e+01 -1.131350000000000078e+00 -3.934375381469726562e+01 -1.131355000000000111e+00 -3.931250000000000000e+01 -1.131360000000000143e+00 -3.925000000000000000e+01 -1.131365000000000176e+00 -3.934375381469726562e+01 -1.131369999999999987e+00 -3.934375381469726562e+01 -1.131375000000000020e+00 -3.928125000000000000e+01 -1.131380000000000052e+00 -3.928125000000000000e+01 -1.131385000000000085e+00 -3.931250000000000000e+01 -1.131390000000000118e+00 -3.934375381469726562e+01 -1.131395000000000151e+00 -3.934375381469726562e+01 -1.131400000000000183e+00 -3.934375381469726562e+01 -1.131404999999999994e+00 -3.934375381469726562e+01 -1.131410000000000027e+00 -3.931250000000000000e+01 -1.131415000000000060e+00 -3.931250000000000000e+01 -1.131420000000000092e+00 -3.931250000000000000e+01 -1.131425000000000125e+00 -3.931250000000000000e+01 -1.131430000000000158e+00 -3.925000000000000000e+01 -1.131435000000000191e+00 -3.940625000000000000e+01 -1.131440000000000001e+00 -3.931250000000000000e+01 -1.131445000000000034e+00 -3.934375381469726562e+01 -1.131450000000000067e+00 -3.934375381469726562e+01 -1.131455000000000100e+00 -3.928125000000000000e+01 -1.131460000000000132e+00 -3.934375381469726562e+01 -1.131465000000000165e+00 -3.931250000000000000e+01 -1.131470000000000198e+00 -3.931250000000000000e+01 -1.131475000000000009e+00 -3.937500000000000000e+01 -1.131480000000000041e+00 -3.931250000000000000e+01 -1.131485000000000074e+00 -3.937500000000000000e+01 -1.131490000000000107e+00 -3.934375381469726562e+01 -1.131495000000000140e+00 -3.934375381469726562e+01 -1.131500000000000172e+00 -3.937500000000000000e+01 -1.131504999999999983e+00 -3.934375381469726562e+01 -1.131510000000000016e+00 -3.937500000000000000e+01 -1.131515000000000049e+00 -3.931250000000000000e+01 -1.131520000000000081e+00 -3.937500000000000000e+01 -1.131525000000000114e+00 -3.928125000000000000e+01 -1.131530000000000147e+00 -3.934375381469726562e+01 -1.131535000000000180e+00 -3.937500000000000000e+01 -1.131539999999999990e+00 -3.937500000000000000e+01 -1.131545000000000023e+00 -3.931250000000000000e+01 -1.131550000000000056e+00 -3.934375381469726562e+01 -1.131555000000000089e+00 -3.934375381469726562e+01 -1.131560000000000121e+00 -3.937500000000000000e+01 -1.131565000000000154e+00 -3.928125000000000000e+01 -1.131570000000000187e+00 -3.928125000000000000e+01 -1.131574999999999998e+00 -3.940625000000000000e+01 -1.131580000000000030e+00 -3.934375381469726562e+01 -1.131585000000000063e+00 -3.931250000000000000e+01 -1.131590000000000096e+00 -3.928125000000000000e+01 -1.131595000000000129e+00 -3.934375381469726562e+01 -1.131600000000000161e+00 -3.934375381469726562e+01 -1.131605000000000194e+00 -3.928125000000000000e+01 -1.131610000000000005e+00 -3.928125000000000000e+01 -1.131615000000000038e+00 -3.934375381469726562e+01 -1.131620000000000070e+00 -3.940625000000000000e+01 -1.131625000000000103e+00 -3.931250000000000000e+01 -1.131630000000000136e+00 -3.931250000000000000e+01 -1.131635000000000169e+00 -3.934375381469726562e+01 -1.131640000000000201e+00 -3.937500000000000000e+01 -1.131645000000000012e+00 -3.937500000000000000e+01 -1.131650000000000045e+00 -3.937500000000000000e+01 -1.131655000000000078e+00 -3.940625000000000000e+01 -1.131660000000000110e+00 -3.937500000000000000e+01 -1.131665000000000143e+00 -3.934375381469726562e+01 -1.131670000000000176e+00 -3.937500000000000000e+01 -1.131674999999999986e+00 -3.934375381469726562e+01 -1.131680000000000019e+00 -3.931250000000000000e+01 -1.131685000000000052e+00 -3.934375381469726562e+01 -1.131690000000000085e+00 -3.937500000000000000e+01 -1.131695000000000118e+00 -3.934375381469726562e+01 -1.131700000000000150e+00 -3.931250000000000000e+01 -1.131705000000000183e+00 -3.934375381469726562e+01 -1.131709999999999994e+00 -3.934375381469726562e+01 -1.131715000000000027e+00 -3.931250000000000000e+01 -1.131720000000000059e+00 -3.931250000000000000e+01 -1.131725000000000092e+00 -3.928125000000000000e+01 -1.131730000000000125e+00 -3.928125000000000000e+01 -1.131735000000000158e+00 -3.934375381469726562e+01 -1.131740000000000190e+00 -3.937500000000000000e+01 -1.131745000000000001e+00 -3.931250000000000000e+01 -1.131750000000000034e+00 -3.931250000000000000e+01 -1.131755000000000067e+00 -3.934375381469726562e+01 -1.131760000000000099e+00 -3.928125000000000000e+01 -1.131765000000000132e+00 -3.934375381469726562e+01 -1.131770000000000165e+00 -3.934375381469726562e+01 -1.131775000000000198e+00 -3.934375381469726562e+01 -1.131780000000000008e+00 -3.934375381469726562e+01 -1.131785000000000041e+00 -3.937500000000000000e+01 -1.131790000000000074e+00 -3.937500000000000000e+01 -1.131795000000000107e+00 -3.937500000000000000e+01 -1.131800000000000139e+00 -3.934375381469726562e+01 -1.131805000000000172e+00 -3.934375381469726562e+01 -1.131809999999999983e+00 -3.940625000000000000e+01 -1.131815000000000015e+00 -3.934375381469726562e+01 -1.131820000000000048e+00 -3.934375381469726562e+01 -1.131825000000000081e+00 -3.940625000000000000e+01 -1.131830000000000114e+00 -3.934375381469726562e+01 -1.131835000000000147e+00 -3.937500000000000000e+01 -1.131840000000000179e+00 -3.934375381469726562e+01 -1.131844999999999990e+00 -3.940625000000000000e+01 -1.131850000000000023e+00 -3.931250000000000000e+01 -1.131855000000000055e+00 -3.931250000000000000e+01 -1.131860000000000088e+00 -3.940625000000000000e+01 -1.131865000000000121e+00 -3.937500000000000000e+01 -1.131870000000000154e+00 -3.931250000000000000e+01 -1.131875000000000187e+00 -3.934375381469726562e+01 -1.131879999999999997e+00 -3.937500000000000000e+01 -1.131885000000000030e+00 -3.943750381469726562e+01 -1.131890000000000063e+00 -3.934375381469726562e+01 -1.131895000000000095e+00 -3.937500000000000000e+01 -1.131900000000000128e+00 -3.934375381469726562e+01 -1.131905000000000161e+00 -3.940625000000000000e+01 -1.131910000000000194e+00 -3.931250000000000000e+01 -1.131915000000000004e+00 -3.934375381469726562e+01 -1.131920000000000037e+00 -3.943750381469726562e+01 -1.131925000000000070e+00 -3.931250000000000000e+01 -1.131930000000000103e+00 -3.943750381469726562e+01 -1.131935000000000136e+00 -3.937500000000000000e+01 -1.131940000000000168e+00 -3.940625000000000000e+01 -1.131945000000000201e+00 -3.940625000000000000e+01 -1.131950000000000012e+00 -3.940625000000000000e+01 -1.131955000000000044e+00 -3.943750381469726562e+01 -1.131960000000000077e+00 -3.937500000000000000e+01 -1.131965000000000110e+00 -3.937500000000000000e+01 -1.131970000000000143e+00 -3.934375381469726562e+01 -1.131975000000000176e+00 -3.943750381469726562e+01 -1.131979999999999986e+00 -3.934375381469726562e+01 -1.131985000000000019e+00 -3.940625000000000000e+01 -1.131990000000000052e+00 -3.943750381469726562e+01 -1.131995000000000084e+00 -3.940625000000000000e+01 -1.132000000000000117e+00 -3.931250000000000000e+01 -1.132005000000000150e+00 -3.940625000000000000e+01 -1.132010000000000183e+00 -3.946875000000000000e+01 -1.132014999999999993e+00 -3.934375381469726562e+01 -1.132020000000000026e+00 -3.940625000000000000e+01 -1.132025000000000059e+00 -3.940625000000000000e+01 -1.132030000000000092e+00 -3.943750381469726562e+01 -1.132035000000000124e+00 -3.934375381469726562e+01 -1.132040000000000157e+00 -3.940625000000000000e+01 -1.132045000000000190e+00 -3.937500000000000000e+01 -1.132050000000000001e+00 -3.934375381469726562e+01 -1.132055000000000033e+00 -3.940625000000000000e+01 -1.132060000000000066e+00 -3.940625000000000000e+01 -1.132065000000000099e+00 -3.943750381469726562e+01 -1.132070000000000132e+00 -3.946875000000000000e+01 -1.132075000000000164e+00 -3.943750381469726562e+01 -1.132080000000000197e+00 -3.940625000000000000e+01 -1.132085000000000008e+00 -3.946875000000000000e+01 -1.132090000000000041e+00 -3.943750381469726562e+01 -1.132095000000000073e+00 -3.946875000000000000e+01 -1.132100000000000106e+00 -3.946875000000000000e+01 -1.132105000000000139e+00 -3.943750381469726562e+01 -1.132110000000000172e+00 -3.943750381469726562e+01 -1.132114999999999982e+00 -3.943750381469726562e+01 -1.132120000000000015e+00 -3.946875000000000000e+01 -1.132125000000000048e+00 -3.946875000000000000e+01 -1.132130000000000081e+00 -3.950000000000000000e+01 -1.132135000000000113e+00 -3.946875000000000000e+01 -1.132140000000000146e+00 -3.950000000000000000e+01 -1.132145000000000179e+00 -3.943750381469726562e+01 -1.132149999999999990e+00 -3.940625000000000000e+01 -1.132155000000000022e+00 -3.946875000000000000e+01 -1.132160000000000055e+00 -3.943750381469726562e+01 -1.132165000000000088e+00 -3.946875000000000000e+01 -1.132170000000000121e+00 -3.950000000000000000e+01 -1.132175000000000153e+00 -3.950000000000000000e+01 -1.132180000000000186e+00 -3.950000000000000000e+01 -1.132184999999999997e+00 -3.943750381469726562e+01 -1.132190000000000030e+00 -3.946875000000000000e+01 -1.132195000000000062e+00 -3.946875000000000000e+01 -1.132200000000000095e+00 -3.940625000000000000e+01 -1.132205000000000128e+00 -3.946875000000000000e+01 -1.132210000000000161e+00 -3.943750381469726562e+01 -1.132215000000000193e+00 -3.943750381469726562e+01 -1.132220000000000004e+00 -3.950000000000000000e+01 -1.132225000000000037e+00 -3.950000000000000000e+01 -1.132230000000000070e+00 -3.950000000000000000e+01 -1.132235000000000102e+00 -3.943750381469726562e+01 -1.132240000000000135e+00 -3.943750381469726562e+01 -1.132245000000000168e+00 -3.946875000000000000e+01 -1.132250000000000201e+00 -3.946875000000000000e+01 -1.132255000000000011e+00 -3.946875000000000000e+01 -1.132260000000000044e+00 -3.946875000000000000e+01 -1.132265000000000077e+00 -3.943750381469726562e+01 -1.132270000000000110e+00 -3.950000000000000000e+01 -1.132275000000000142e+00 -3.946875000000000000e+01 -1.132280000000000175e+00 -3.943750381469726562e+01 -1.132284999999999986e+00 -3.943750381469726562e+01 -1.132290000000000019e+00 -3.946875000000000000e+01 -1.132295000000000051e+00 -3.950000000000000000e+01 -1.132300000000000084e+00 -3.946875000000000000e+01 -1.132305000000000117e+00 -3.953125000000000000e+01 -1.132310000000000150e+00 -3.943750381469726562e+01 -1.132315000000000182e+00 -3.950000000000000000e+01 -1.132319999999999993e+00 -3.953125000000000000e+01 -1.132325000000000026e+00 -3.946875000000000000e+01 -1.132330000000000059e+00 -3.953125000000000000e+01 -1.132335000000000091e+00 -3.946875000000000000e+01 -1.132340000000000124e+00 -3.950000000000000000e+01 -1.132345000000000157e+00 -3.946875000000000000e+01 -1.132350000000000190e+00 -3.946875000000000000e+01 -1.132355000000000000e+00 -3.946875000000000000e+01 -1.132360000000000033e+00 -3.950000000000000000e+01 -1.132365000000000066e+00 -3.950000000000000000e+01 -1.132370000000000099e+00 -3.953125000000000000e+01 -1.132375000000000131e+00 -3.950000000000000000e+01 -1.132380000000000164e+00 -3.946875000000000000e+01 -1.132385000000000197e+00 -3.950000000000000000e+01 -1.132390000000000008e+00 -3.943750381469726562e+01 -1.132395000000000040e+00 -3.946875000000000000e+01 -1.132400000000000073e+00 -3.946875000000000000e+01 -1.132405000000000106e+00 -3.943750381469726562e+01 -1.132410000000000139e+00 -3.950000000000000000e+01 -1.132415000000000171e+00 -3.943750381469726562e+01 -1.132419999999999982e+00 -3.946875000000000000e+01 -1.132425000000000015e+00 -3.946875000000000000e+01 -1.132430000000000048e+00 -3.950000000000000000e+01 -1.132435000000000080e+00 -3.943750381469726562e+01 -1.132440000000000113e+00 -3.946875000000000000e+01 -1.132445000000000146e+00 -3.950000000000000000e+01 -1.132450000000000179e+00 -3.950000000000000000e+01 -1.132454999999999989e+00 -3.953125000000000000e+01 -1.132460000000000022e+00 -3.953125000000000000e+01 -1.132465000000000055e+00 -3.950000000000000000e+01 -1.132470000000000088e+00 -3.950000000000000000e+01 -1.132475000000000120e+00 -3.946875000000000000e+01 -1.132480000000000153e+00 -3.950000000000000000e+01 -1.132485000000000186e+00 -3.959375381469726562e+01 -1.132489999999999997e+00 -3.950000000000000000e+01 -1.132495000000000029e+00 -3.950000000000000000e+01 -1.132500000000000062e+00 -3.950000000000000000e+01 -1.132505000000000095e+00 -3.956250000000000000e+01 -1.132510000000000128e+00 -3.946875000000000000e+01 -1.132515000000000160e+00 -3.950000000000000000e+01 -1.132520000000000193e+00 -3.950000000000000000e+01 -1.132525000000000004e+00 -3.950000000000000000e+01 -1.132530000000000037e+00 -3.953125000000000000e+01 -1.132535000000000069e+00 -3.946875000000000000e+01 -1.132540000000000102e+00 -3.950000000000000000e+01 -1.132545000000000135e+00 -3.950000000000000000e+01 -1.132550000000000168e+00 -3.953125000000000000e+01 -1.132555000000000200e+00 -3.946875000000000000e+01 -1.132560000000000011e+00 -3.953125000000000000e+01 -1.132565000000000044e+00 -3.950000000000000000e+01 -1.132570000000000077e+00 -3.946875000000000000e+01 -1.132575000000000109e+00 -3.950000000000000000e+01 -1.132580000000000142e+00 -3.950000000000000000e+01 -1.132585000000000175e+00 -3.946875000000000000e+01 -1.132589999999999986e+00 -3.950000000000000000e+01 -1.132595000000000018e+00 -3.950000000000000000e+01 -1.132600000000000051e+00 -3.950000000000000000e+01 -1.132605000000000084e+00 -3.950000000000000000e+01 -1.132610000000000117e+00 -3.950000000000000000e+01 -1.132615000000000149e+00 -3.950000000000000000e+01 -1.132620000000000182e+00 -3.950000000000000000e+01 -1.132624999999999993e+00 -3.950000000000000000e+01 -1.132630000000000026e+00 -3.953125000000000000e+01 -1.132635000000000058e+00 -3.953125000000000000e+01 -1.132640000000000091e+00 -3.953125000000000000e+01 -1.132645000000000124e+00 -3.950000000000000000e+01 -1.132650000000000157e+00 -3.953125000000000000e+01 -1.132655000000000189e+00 -3.950000000000000000e+01 -1.132660000000000000e+00 -3.946875000000000000e+01 -1.132665000000000033e+00 -3.950000000000000000e+01 -1.132670000000000066e+00 -3.946875000000000000e+01 -1.132675000000000098e+00 -3.950000000000000000e+01 -1.132680000000000131e+00 -3.946875000000000000e+01 -1.132685000000000164e+00 -3.956250000000000000e+01 -1.132690000000000197e+00 -3.950000000000000000e+01 -1.132695000000000007e+00 -3.953125000000000000e+01 -1.132700000000000040e+00 -3.950000000000000000e+01 -1.132705000000000073e+00 -3.953125000000000000e+01 -1.132710000000000106e+00 -3.953125000000000000e+01 -1.132715000000000138e+00 -3.950000000000000000e+01 -1.132720000000000171e+00 -3.950000000000000000e+01 -1.132724999999999982e+00 -3.950000000000000000e+01 -1.132730000000000015e+00 -3.953125000000000000e+01 -1.132735000000000047e+00 -3.950000000000000000e+01 -1.132740000000000080e+00 -3.953125000000000000e+01 -1.132745000000000113e+00 -3.950000000000000000e+01 -1.132750000000000146e+00 -3.953125000000000000e+01 -1.132755000000000178e+00 -3.959375381469726562e+01 -1.132759999999999989e+00 -3.953125000000000000e+01 -1.132765000000000022e+00 -3.953125000000000000e+01 -1.132770000000000055e+00 -3.950000000000000000e+01 -1.132775000000000087e+00 -3.946875000000000000e+01 -1.132780000000000120e+00 -3.950000000000000000e+01 -1.132785000000000153e+00 -3.946875000000000000e+01 -1.132790000000000186e+00 -3.950000000000000000e+01 -1.132794999999999996e+00 -3.950000000000000000e+01 -1.132800000000000029e+00 -3.953125000000000000e+01 -1.132805000000000062e+00 -3.950000000000000000e+01 -1.132810000000000095e+00 -3.956250000000000000e+01 -1.132815000000000127e+00 -3.950000000000000000e+01 -1.132820000000000160e+00 -3.953125000000000000e+01 -1.132825000000000193e+00 -3.953125000000000000e+01 -1.132830000000000004e+00 -3.953125000000000000e+01 -1.132835000000000036e+00 -3.956250000000000000e+01 -1.132840000000000069e+00 -3.956250000000000000e+01 -1.132845000000000102e+00 -3.953125000000000000e+01 -1.132850000000000135e+00 -3.950000000000000000e+01 -1.132855000000000167e+00 -3.956250000000000000e+01 -1.132860000000000200e+00 -3.950000000000000000e+01 -1.132865000000000011e+00 -3.959375381469726562e+01 -1.132870000000000044e+00 -3.950000000000000000e+01 -1.132875000000000076e+00 -3.956250000000000000e+01 -1.132880000000000109e+00 -3.953125000000000000e+01 -1.132885000000000142e+00 -3.956250000000000000e+01 -1.132890000000000175e+00 -3.959375381469726562e+01 -1.132894999999999985e+00 -3.956250000000000000e+01 -1.132900000000000018e+00 -3.956250000000000000e+01 -1.132905000000000051e+00 -3.959375381469726562e+01 -1.132910000000000084e+00 -3.953125000000000000e+01 -1.132915000000000116e+00 -3.950000000000000000e+01 -1.132920000000000149e+00 -3.959375381469726562e+01 -1.132925000000000182e+00 -3.956250000000000000e+01 -1.132929999999999993e+00 -3.953125000000000000e+01 -1.132935000000000025e+00 -3.956250000000000000e+01 -1.132940000000000058e+00 -3.946875000000000000e+01 -1.132945000000000091e+00 -3.953125000000000000e+01 -1.132950000000000124e+00 -3.959375381469726562e+01 -1.132955000000000156e+00 -3.953125000000000000e+01 -1.132960000000000189e+00 -3.959375381469726562e+01 -1.132965000000000000e+00 -3.953125000000000000e+01 -1.132970000000000033e+00 -3.959375381469726562e+01 -1.132975000000000065e+00 -3.959375381469726562e+01 -1.132980000000000098e+00 -3.950000000000000000e+01 -1.132985000000000131e+00 -3.956250000000000000e+01 -1.132990000000000164e+00 -3.956250000000000000e+01 -1.132995000000000196e+00 -3.959375381469726562e+01 -1.133000000000000007e+00 -3.953125000000000000e+01 -1.133005000000000040e+00 -3.956250000000000000e+01 -1.133010000000000073e+00 -3.959375381469726562e+01 -1.133015000000000105e+00 -3.962500000000000000e+01 -1.133020000000000138e+00 -3.956250000000000000e+01 -1.133025000000000171e+00 -3.965625000000000000e+01 -1.133030000000000204e+00 -3.956250000000000000e+01 -1.133035000000000014e+00 -3.962500000000000000e+01 -1.133040000000000047e+00 -3.962500000000000000e+01 -1.133045000000000080e+00 -3.956250000000000000e+01 -1.133050000000000113e+00 -3.956250000000000000e+01 -1.133055000000000145e+00 -3.953125000000000000e+01 -1.133060000000000178e+00 -3.953125000000000000e+01 -1.133064999999999989e+00 -3.956250000000000000e+01 -1.133070000000000022e+00 -3.959375381469726562e+01 -1.133075000000000054e+00 -3.956250000000000000e+01 -1.133080000000000087e+00 -3.956250000000000000e+01 -1.133085000000000120e+00 -3.953125000000000000e+01 -1.133090000000000153e+00 -3.956250000000000000e+01 -1.133095000000000185e+00 -3.953125000000000000e+01 -1.133099999999999996e+00 -3.953125000000000000e+01 -1.133105000000000029e+00 -3.953125000000000000e+01 -1.133110000000000062e+00 -3.953125000000000000e+01 -1.133115000000000094e+00 -3.953125000000000000e+01 -1.133120000000000127e+00 -3.956250000000000000e+01 -1.133125000000000160e+00 -3.956250000000000000e+01 -1.133130000000000193e+00 -3.962500000000000000e+01 -1.133135000000000003e+00 -3.953125000000000000e+01 -1.133140000000000036e+00 -3.956250000000000000e+01 -1.133145000000000069e+00 -3.953125000000000000e+01 -1.133150000000000102e+00 -3.953125000000000000e+01 -1.133155000000000134e+00 -3.956250000000000000e+01 -1.133160000000000167e+00 -3.959375381469726562e+01 -1.133165000000000200e+00 -3.959375381469726562e+01 -1.133170000000000011e+00 -3.959375381469726562e+01 -1.133175000000000043e+00 -3.965625000000000000e+01 -1.133180000000000076e+00 -3.959375381469726562e+01 -1.133185000000000109e+00 -3.950000000000000000e+01 -1.133190000000000142e+00 -3.959375381469726562e+01 -1.133195000000000174e+00 -3.950000000000000000e+01 -1.133199999999999985e+00 -3.953125000000000000e+01 -1.133205000000000018e+00 -3.959375381469726562e+01 -1.133210000000000051e+00 -3.959375381469726562e+01 -1.133215000000000083e+00 -3.956250000000000000e+01 -1.133220000000000116e+00 -3.956250000000000000e+01 -1.133225000000000149e+00 -3.956250000000000000e+01 -1.133230000000000182e+00 -3.953125000000000000e+01 -1.133234999999999992e+00 -3.962500000000000000e+01 -1.133240000000000025e+00 -3.956250000000000000e+01 -1.133245000000000058e+00 -3.959375381469726562e+01 -1.133250000000000091e+00 -3.956250000000000000e+01 -1.133255000000000123e+00 -3.965625000000000000e+01 -1.133260000000000156e+00 -3.953125000000000000e+01 -1.133265000000000189e+00 -3.956250000000000000e+01 -1.133270000000000000e+00 -3.953125000000000000e+01 -1.133275000000000032e+00 -3.959375381469726562e+01 -1.133280000000000065e+00 -3.953125000000000000e+01 -1.133285000000000098e+00 -3.956250000000000000e+01 -1.133290000000000131e+00 -3.956250000000000000e+01 -1.133295000000000163e+00 -3.953125000000000000e+01 -1.133300000000000196e+00 -3.953125000000000000e+01 -1.133305000000000007e+00 -3.956250000000000000e+01 -1.133310000000000040e+00 -3.953125000000000000e+01 -1.133315000000000072e+00 -3.965625000000000000e+01 -1.133320000000000105e+00 -3.959375381469726562e+01 -1.133325000000000138e+00 -3.959375381469726562e+01 -1.133330000000000171e+00 -3.950000000000000000e+01 -1.133335000000000203e+00 -3.956250000000000000e+01 -1.133340000000000014e+00 -3.959375381469726562e+01 -1.133345000000000047e+00 -3.962500000000000000e+01 -1.133350000000000080e+00 -3.965625000000000000e+01 -1.133355000000000112e+00 -3.956250000000000000e+01 -1.133360000000000145e+00 -3.953125000000000000e+01 -1.133365000000000178e+00 -3.956250000000000000e+01 -1.133369999999999989e+00 -3.956250000000000000e+01 -1.133375000000000021e+00 -3.956250000000000000e+01 -1.133380000000000054e+00 -3.950000000000000000e+01 -1.133385000000000087e+00 -3.962500000000000000e+01 -1.133390000000000120e+00 -3.956250000000000000e+01 -1.133395000000000152e+00 -3.950000000000000000e+01 -1.133400000000000185e+00 -3.953125000000000000e+01 -1.133404999999999996e+00 -3.959375381469726562e+01 -1.133410000000000029e+00 -3.950000000000000000e+01 -1.133415000000000061e+00 -3.956250000000000000e+01 -1.133420000000000094e+00 -3.953125000000000000e+01 -1.133425000000000127e+00 -3.953125000000000000e+01 -1.133430000000000160e+00 -3.956250000000000000e+01 -1.133435000000000192e+00 -3.959375381469726562e+01 -1.133440000000000003e+00 -3.956250000000000000e+01 -1.133445000000000036e+00 -3.959375381469726562e+01 -1.133450000000000069e+00 -3.953125000000000000e+01 -1.133455000000000101e+00 -3.956250000000000000e+01 -1.133460000000000134e+00 -3.959375381469726562e+01 -1.133465000000000167e+00 -3.953125000000000000e+01 -1.133470000000000200e+00 -3.956250000000000000e+01 -1.133475000000000010e+00 -3.965625000000000000e+01 -1.133480000000000043e+00 -3.959375381469726562e+01 -1.133485000000000076e+00 -3.965625000000000000e+01 -1.133490000000000109e+00 -3.959375381469726562e+01 -1.133495000000000141e+00 -3.962500000000000000e+01 -1.133500000000000174e+00 -3.959375381469726562e+01 -1.133504999999999985e+00 -3.959375381469726562e+01 -1.133510000000000018e+00 -3.959375381469726562e+01 -1.133515000000000050e+00 -3.962500000000000000e+01 -1.133520000000000083e+00 -3.959375381469726562e+01 -1.133525000000000116e+00 -3.962500000000000000e+01 -1.133530000000000149e+00 -3.959375381469726562e+01 -1.133535000000000181e+00 -3.956250000000000000e+01 -1.133539999999999992e+00 -3.956250000000000000e+01 -1.133545000000000025e+00 -3.959375381469726562e+01 -1.133550000000000058e+00 -3.950000000000000000e+01 -1.133555000000000090e+00 -3.965625000000000000e+01 -1.133560000000000123e+00 -3.959375381469726562e+01 -1.133565000000000156e+00 -3.953125000000000000e+01 -1.133570000000000189e+00 -3.956250000000000000e+01 -1.133574999999999999e+00 -3.953125000000000000e+01 -1.133580000000000032e+00 -3.956250000000000000e+01 -1.133585000000000065e+00 -3.956250000000000000e+01 -1.133590000000000098e+00 -3.959375381469726562e+01 -1.133595000000000130e+00 -3.956250000000000000e+01 -1.133600000000000163e+00 -3.956250000000000000e+01 -1.133605000000000196e+00 -3.959375381469726562e+01 -1.133610000000000007e+00 -3.956250000000000000e+01 -1.133615000000000039e+00 -3.953125000000000000e+01 -1.133620000000000072e+00 -3.959375381469726562e+01 -1.133625000000000105e+00 -3.959375381469726562e+01 -1.133630000000000138e+00 -3.959375381469726562e+01 -1.133635000000000170e+00 -3.956250000000000000e+01 -1.133640000000000203e+00 -3.959375381469726562e+01 -1.133645000000000014e+00 -3.959375381469726562e+01 -1.133650000000000047e+00 -3.959375381469726562e+01 -1.133655000000000079e+00 -3.959375381469726562e+01 -1.133660000000000112e+00 -3.956250000000000000e+01 -1.133665000000000145e+00 -3.959375381469726562e+01 -1.133670000000000178e+00 -3.959375381469726562e+01 -1.133674999999999988e+00 -3.962500000000000000e+01 -1.133680000000000021e+00 -3.959375381469726562e+01 -1.133685000000000054e+00 -3.959375381469726562e+01 -1.133690000000000087e+00 -3.959375381469726562e+01 -1.133695000000000119e+00 -3.962500000000000000e+01 -1.133700000000000152e+00 -3.956250000000000000e+01 -1.133705000000000185e+00 -3.965625000000000000e+01 -1.133709999999999996e+00 -3.962500000000000000e+01 -1.133715000000000028e+00 -3.956250000000000000e+01 -1.133720000000000061e+00 -3.962500000000000000e+01 -1.133725000000000094e+00 -3.962500000000000000e+01 -1.133730000000000127e+00 -3.968750000000000000e+01 -1.133735000000000159e+00 -3.959375381469726562e+01 -1.133740000000000192e+00 -3.959375381469726562e+01 -1.133745000000000003e+00 -3.965625000000000000e+01 -1.133750000000000036e+00 -3.962500000000000000e+01 -1.133755000000000068e+00 -3.968750000000000000e+01 -1.133760000000000101e+00 -3.965625000000000000e+01 -1.133765000000000134e+00 -3.959375381469726562e+01 -1.133770000000000167e+00 -3.965625000000000000e+01 -1.133775000000000199e+00 -3.962500000000000000e+01 -1.133780000000000010e+00 -3.965625000000000000e+01 -1.133785000000000043e+00 -3.959375381469726562e+01 -1.133790000000000076e+00 -3.968750000000000000e+01 -1.133795000000000108e+00 -3.962500000000000000e+01 -1.133800000000000141e+00 -3.959375381469726562e+01 -1.133805000000000174e+00 -3.971875000000000000e+01 -1.133809999999999985e+00 -3.962500000000000000e+01 -1.133815000000000017e+00 -3.965625000000000000e+01 -1.133820000000000050e+00 -3.965625000000000000e+01 -1.133825000000000083e+00 -3.965625000000000000e+01 -1.133830000000000116e+00 -3.965625000000000000e+01 -1.133835000000000148e+00 -3.965625000000000000e+01 -1.133840000000000181e+00 -3.956250000000000000e+01 -1.133844999999999992e+00 -3.965625000000000000e+01 -1.133850000000000025e+00 -3.965625000000000000e+01 -1.133855000000000057e+00 -3.962500000000000000e+01 -1.133860000000000090e+00 -3.965625000000000000e+01 -1.133865000000000123e+00 -3.962500000000000000e+01 -1.133870000000000156e+00 -3.962500000000000000e+01 -1.133875000000000188e+00 -3.965625000000000000e+01 -1.133879999999999999e+00 -3.968750000000000000e+01 -1.133885000000000032e+00 -3.965625000000000000e+01 -1.133890000000000065e+00 -3.965625000000000000e+01 -1.133895000000000097e+00 -3.959375381469726562e+01 -1.133900000000000130e+00 -3.965625000000000000e+01 -1.133905000000000163e+00 -3.965625000000000000e+01 -1.133910000000000196e+00 -3.959375381469726562e+01 -1.133915000000000006e+00 -3.959375381469726562e+01 -1.133920000000000039e+00 -3.965625000000000000e+01 -1.133925000000000072e+00 -3.962500000000000000e+01 -1.133930000000000105e+00 -3.959375381469726562e+01 -1.133935000000000137e+00 -3.962500000000000000e+01 -1.133940000000000170e+00 -3.962500000000000000e+01 -1.133945000000000203e+00 -3.959375381469726562e+01 -1.133950000000000014e+00 -3.959375381469726562e+01 -1.133955000000000046e+00 -3.959375381469726562e+01 -1.133960000000000079e+00 -3.953125000000000000e+01 -1.133965000000000112e+00 -3.965625000000000000e+01 -1.133970000000000145e+00 -3.965625000000000000e+01 -1.133975000000000177e+00 -3.962500000000000000e+01 -1.133979999999999988e+00 -3.965625000000000000e+01 -1.133985000000000021e+00 -3.965625000000000000e+01 -1.133990000000000054e+00 -3.965625000000000000e+01 -1.133995000000000086e+00 -3.959375381469726562e+01 -1.134000000000000119e+00 -3.962500000000000000e+01 -1.134005000000000152e+00 -3.962500000000000000e+01 -1.134010000000000185e+00 -3.965625000000000000e+01 -1.134014999999999995e+00 -3.965625000000000000e+01 -1.134020000000000028e+00 -3.965625000000000000e+01 -1.134025000000000061e+00 -3.956250000000000000e+01 -1.134030000000000094e+00 -3.959375381469726562e+01 -1.134035000000000126e+00 -3.959375381469726562e+01 -1.134040000000000159e+00 -3.962500000000000000e+01 -1.134045000000000192e+00 -3.965625000000000000e+01 -1.134050000000000002e+00 -3.965625000000000000e+01 -1.134055000000000035e+00 -3.959375381469726562e+01 -1.134060000000000068e+00 -3.959375381469726562e+01 -1.134065000000000101e+00 -3.962500000000000000e+01 -1.134070000000000134e+00 -3.962500000000000000e+01 -1.134075000000000166e+00 -3.959375381469726562e+01 -1.134080000000000199e+00 -3.962500000000000000e+01 -1.134085000000000010e+00 -3.959375381469726562e+01 -1.134090000000000042e+00 -3.971875000000000000e+01 -1.134095000000000075e+00 -3.968750000000000000e+01 -1.134100000000000108e+00 -3.962500000000000000e+01 -1.134105000000000141e+00 -3.965625000000000000e+01 -1.134110000000000174e+00 -3.965625000000000000e+01 -1.134114999999999984e+00 -3.959375381469726562e+01 -1.134120000000000017e+00 -3.959375381469726562e+01 -1.134125000000000050e+00 -3.965625000000000000e+01 -1.134130000000000082e+00 -3.965625000000000000e+01 -1.134135000000000115e+00 -3.959375381469726562e+01 -1.134140000000000148e+00 -3.965625000000000000e+01 -1.134145000000000181e+00 -3.965625000000000000e+01 -1.134149999999999991e+00 -3.962500000000000000e+01 -1.134155000000000024e+00 -3.965625000000000000e+01 -1.134160000000000057e+00 -3.959375381469726562e+01 -1.134165000000000090e+00 -3.965625000000000000e+01 -1.134170000000000122e+00 -3.965625000000000000e+01 -1.134175000000000155e+00 -3.959375381469726562e+01 -1.134180000000000188e+00 -3.965625000000000000e+01 -1.134184999999999999e+00 -3.968750000000000000e+01 -1.134190000000000031e+00 -3.965625000000000000e+01 -1.134195000000000064e+00 -3.965625000000000000e+01 -1.134200000000000097e+00 -3.965625000000000000e+01 -1.134205000000000130e+00 -3.968750000000000000e+01 -1.134210000000000163e+00 -3.965625000000000000e+01 -1.134215000000000195e+00 -3.968750000000000000e+01 -1.134220000000000006e+00 -3.968750000000000000e+01 -1.134225000000000039e+00 -3.968750000000000000e+01 -1.134230000000000071e+00 -3.965625000000000000e+01 -1.134235000000000104e+00 -3.968750000000000000e+01 -1.134240000000000137e+00 -3.971875000000000000e+01 -1.134245000000000170e+00 -3.962500000000000000e+01 -1.134250000000000203e+00 -3.968750000000000000e+01 -1.134255000000000013e+00 -3.968750000000000000e+01 -1.134260000000000046e+00 -3.965625000000000000e+01 -1.134265000000000079e+00 -3.962500000000000000e+01 -1.134270000000000111e+00 -3.968750000000000000e+01 -1.134275000000000144e+00 -3.962500000000000000e+01 -1.134280000000000177e+00 -3.965625000000000000e+01 -1.134284999999999988e+00 -3.968750000000000000e+01 -1.134290000000000020e+00 -3.971875000000000000e+01 -1.134295000000000053e+00 -3.971875000000000000e+01 -1.134300000000000086e+00 -3.971875000000000000e+01 -1.134305000000000119e+00 -3.968750000000000000e+01 -1.134310000000000151e+00 -3.971875000000000000e+01 -1.134315000000000184e+00 -3.971875000000000000e+01 -1.134319999999999995e+00 -3.965625000000000000e+01 -1.134325000000000028e+00 -3.965625000000000000e+01 -1.134330000000000060e+00 -3.965625000000000000e+01 -1.134335000000000093e+00 -3.968750000000000000e+01 -1.134340000000000126e+00 -3.971875000000000000e+01 -1.134345000000000159e+00 -3.975000381469726562e+01 -1.134350000000000191e+00 -3.965625000000000000e+01 -1.134355000000000002e+00 -3.975000381469726562e+01 -1.134360000000000035e+00 -3.971875000000000000e+01 -1.134365000000000068e+00 -3.971875000000000000e+01 -1.134370000000000100e+00 -3.971875000000000000e+01 -1.134375000000000133e+00 -3.971875000000000000e+01 -1.134380000000000166e+00 -3.975000381469726562e+01 -1.134385000000000199e+00 -3.965625000000000000e+01 -1.134390000000000009e+00 -3.965625000000000000e+01 -1.134395000000000042e+00 -3.968750000000000000e+01 -1.134400000000000075e+00 -3.968750000000000000e+01 -1.134405000000000108e+00 -3.962500000000000000e+01 -1.134410000000000140e+00 -3.965625000000000000e+01 -1.134415000000000173e+00 -3.971875000000000000e+01 -1.134419999999999984e+00 -3.971875000000000000e+01 -1.134425000000000017e+00 -3.965625000000000000e+01 -1.134430000000000049e+00 -3.971875000000000000e+01 -1.134435000000000082e+00 -3.968750000000000000e+01 -1.134440000000000115e+00 -3.968750000000000000e+01 -1.134445000000000148e+00 -3.978125000000000000e+01 -1.134450000000000180e+00 -3.962500000000000000e+01 -1.134454999999999991e+00 -3.971875000000000000e+01 -1.134460000000000024e+00 -3.971875000000000000e+01 -1.134465000000000057e+00 -3.968750000000000000e+01 -1.134470000000000089e+00 -3.971875000000000000e+01 -1.134475000000000122e+00 -3.968750000000000000e+01 -1.134480000000000155e+00 -3.971875000000000000e+01 -1.134485000000000188e+00 -3.971875000000000000e+01 -1.134489999999999998e+00 -3.971875000000000000e+01 -1.134495000000000031e+00 -3.978125000000000000e+01 -1.134500000000000064e+00 -3.975000381469726562e+01 -1.134505000000000097e+00 -3.965625000000000000e+01 -1.134510000000000129e+00 -3.975000381469726562e+01 -1.134515000000000162e+00 -3.971875000000000000e+01 -1.134520000000000195e+00 -3.971875000000000000e+01 -1.134525000000000006e+00 -3.968750000000000000e+01 -1.134530000000000038e+00 -3.971875000000000000e+01 -1.134535000000000071e+00 -3.975000381469726562e+01 -1.134540000000000104e+00 -3.971875000000000000e+01 -1.134545000000000137e+00 -3.975000381469726562e+01 -1.134550000000000169e+00 -3.971875000000000000e+01 -1.134555000000000202e+00 -3.978125000000000000e+01 -1.134560000000000013e+00 -3.971875000000000000e+01 -1.134565000000000046e+00 -3.975000381469726562e+01 -1.134570000000000078e+00 -3.968750000000000000e+01 -1.134575000000000111e+00 -3.968750000000000000e+01 -1.134580000000000144e+00 -3.971875000000000000e+01 -1.134585000000000177e+00 -3.968750000000000000e+01 -1.134589999999999987e+00 -3.965625000000000000e+01 -1.134595000000000020e+00 -3.968750000000000000e+01 -1.134600000000000053e+00 -3.971875000000000000e+01 -1.134605000000000086e+00 -3.971875000000000000e+01 -1.134610000000000118e+00 -3.968750000000000000e+01 -1.134615000000000151e+00 -3.968750000000000000e+01 -1.134620000000000184e+00 -3.971875000000000000e+01 -1.134624999999999995e+00 -3.971875000000000000e+01 -1.134630000000000027e+00 -3.971875000000000000e+01 -1.134635000000000060e+00 -3.971875000000000000e+01 -1.134640000000000093e+00 -3.971875000000000000e+01 -1.134645000000000126e+00 -3.968750000000000000e+01 -1.134650000000000158e+00 -3.965625000000000000e+01 -1.134655000000000191e+00 -3.968750000000000000e+01 -1.134660000000000002e+00 -3.971875000000000000e+01 -1.134665000000000035e+00 -3.965625000000000000e+01 -1.134670000000000067e+00 -3.968750000000000000e+01 -1.134675000000000100e+00 -3.975000381469726562e+01 -1.134680000000000133e+00 -3.971875000000000000e+01 -1.134685000000000166e+00 -3.971875000000000000e+01 -1.134690000000000198e+00 -3.968750000000000000e+01 -1.134695000000000009e+00 -3.965625000000000000e+01 -1.134700000000000042e+00 -3.971875000000000000e+01 -1.134705000000000075e+00 -3.965625000000000000e+01 -1.134710000000000107e+00 -3.975000381469726562e+01 -1.134715000000000140e+00 -3.968750000000000000e+01 -1.134720000000000173e+00 -3.968750000000000000e+01 -1.134724999999999984e+00 -3.971875000000000000e+01 -1.134730000000000016e+00 -3.968750000000000000e+01 -1.134735000000000049e+00 -3.971875000000000000e+01 -1.134740000000000082e+00 -3.971875000000000000e+01 -1.134745000000000115e+00 -3.975000381469726562e+01 -1.134750000000000147e+00 -3.968750000000000000e+01 -1.134755000000000180e+00 -3.968750000000000000e+01 -1.134759999999999991e+00 -3.968750000000000000e+01 -1.134765000000000024e+00 -3.965625000000000000e+01 -1.134770000000000056e+00 -3.965625000000000000e+01 -1.134775000000000089e+00 -3.968750000000000000e+01 -1.134780000000000122e+00 -3.971875000000000000e+01 -1.134785000000000155e+00 -3.971875000000000000e+01 -1.134790000000000187e+00 -3.971875000000000000e+01 -1.134794999999999998e+00 -3.965625000000000000e+01 -1.134800000000000031e+00 -3.968750000000000000e+01 -1.134805000000000064e+00 -3.971875000000000000e+01 -1.134810000000000096e+00 -3.968750000000000000e+01 -1.134815000000000129e+00 -3.965625000000000000e+01 -1.134820000000000162e+00 -3.975000381469726562e+01 -1.134825000000000195e+00 -3.971875000000000000e+01 -1.134830000000000005e+00 -3.968750000000000000e+01 -1.134835000000000038e+00 -3.971875000000000000e+01 -1.134840000000000071e+00 -3.971875000000000000e+01 -1.134845000000000104e+00 -3.968750000000000000e+01 -1.134850000000000136e+00 -3.975000381469726562e+01 -1.134855000000000169e+00 -3.975000381469726562e+01 -1.134860000000000202e+00 -3.975000381469726562e+01 -1.134865000000000013e+00 -3.971875000000000000e+01 -1.134870000000000045e+00 -3.968750000000000000e+01 -1.134875000000000078e+00 -3.968750000000000000e+01 -1.134880000000000111e+00 -3.971875000000000000e+01 -1.134885000000000144e+00 -3.971875000000000000e+01 -1.134890000000000176e+00 -3.971875000000000000e+01 -1.134894999999999987e+00 -3.968750000000000000e+01 -1.134900000000000020e+00 -3.968750000000000000e+01 -1.134905000000000053e+00 -3.971875000000000000e+01 -1.134910000000000085e+00 -3.971875000000000000e+01 -1.134915000000000118e+00 -3.975000381469726562e+01 -1.134920000000000151e+00 -3.968750000000000000e+01 -1.134925000000000184e+00 -3.978125000000000000e+01 -1.134929999999999994e+00 -3.975000381469726562e+01 -1.134935000000000027e+00 -3.971875000000000000e+01 -1.134940000000000060e+00 -3.968750000000000000e+01 -1.134945000000000093e+00 -3.975000381469726562e+01 -1.134950000000000125e+00 -3.968750000000000000e+01 -1.134955000000000158e+00 -3.968750000000000000e+01 -1.134960000000000191e+00 -3.968750000000000000e+01 -1.134965000000000002e+00 -3.968750000000000000e+01 -1.134970000000000034e+00 -3.971875000000000000e+01 -1.134975000000000067e+00 -3.968750000000000000e+01 -1.134980000000000100e+00 -3.971875000000000000e+01 -1.134985000000000133e+00 -3.971875000000000000e+01 -1.134990000000000165e+00 -3.971875000000000000e+01 -1.134995000000000198e+00 -3.971875000000000000e+01 -1.135000000000000009e+00 -3.971875000000000000e+01 -1.135005000000000042e+00 -3.975000381469726562e+01 -1.135010000000000074e+00 -3.978125000000000000e+01 -1.135015000000000107e+00 -3.971875000000000000e+01 -1.135020000000000140e+00 -3.975000381469726562e+01 -1.135025000000000173e+00 -3.971875000000000000e+01 -1.135029999999999983e+00 -3.968750000000000000e+01 -1.135035000000000016e+00 -3.971875000000000000e+01 -1.135040000000000049e+00 -3.971875000000000000e+01 -1.135045000000000082e+00 -3.971875000000000000e+01 -1.135050000000000114e+00 -3.965625000000000000e+01 -1.135055000000000147e+00 -3.968750000000000000e+01 -1.135060000000000180e+00 -3.968750000000000000e+01 -1.135064999999999991e+00 -3.965625000000000000e+01 -1.135070000000000023e+00 -3.971875000000000000e+01 -1.135075000000000056e+00 -3.971875000000000000e+01 -1.135080000000000089e+00 -3.965625000000000000e+01 -1.135085000000000122e+00 -3.965625000000000000e+01 -1.135090000000000154e+00 -3.971875000000000000e+01 -1.135095000000000187e+00 -3.965625000000000000e+01 -1.135099999999999998e+00 -3.965625000000000000e+01 -1.135105000000000031e+00 -3.968750000000000000e+01 -1.135110000000000063e+00 -3.971875000000000000e+01 -1.135115000000000096e+00 -3.968750000000000000e+01 -1.135120000000000129e+00 -3.968750000000000000e+01 -1.135125000000000162e+00 -3.968750000000000000e+01 -1.135130000000000194e+00 -3.971875000000000000e+01 -1.135135000000000005e+00 -3.968750000000000000e+01 -1.135140000000000038e+00 -3.968750000000000000e+01 -1.135145000000000071e+00 -3.965625000000000000e+01 -1.135150000000000103e+00 -3.968750000000000000e+01 -1.135155000000000136e+00 -3.968750000000000000e+01 -1.135160000000000169e+00 -3.971875000000000000e+01 -1.135165000000000202e+00 -3.965625000000000000e+01 -1.135170000000000012e+00 -3.971875000000000000e+01 -1.135175000000000045e+00 -3.968750000000000000e+01 -1.135180000000000078e+00 -3.971875000000000000e+01 -1.135185000000000111e+00 -3.968750000000000000e+01 -1.135190000000000143e+00 -3.968750000000000000e+01 -1.135195000000000176e+00 -3.965625000000000000e+01 -1.135199999999999987e+00 -3.971875000000000000e+01 -1.135205000000000020e+00 -3.975000381469726562e+01 -1.135210000000000052e+00 -3.971875000000000000e+01 -1.135215000000000085e+00 -3.965625000000000000e+01 -1.135220000000000118e+00 -3.975000381469726562e+01 -1.135225000000000151e+00 -3.968750000000000000e+01 -1.135230000000000183e+00 -3.971875000000000000e+01 -1.135234999999999994e+00 -3.975000381469726562e+01 -1.135240000000000027e+00 -3.965625000000000000e+01 -1.135245000000000060e+00 -3.968750000000000000e+01 -1.135250000000000092e+00 -3.971875000000000000e+01 -1.135255000000000125e+00 -3.978125000000000000e+01 -1.135260000000000158e+00 -3.968750000000000000e+01 -1.135265000000000191e+00 -3.968750000000000000e+01 -1.135270000000000001e+00 -3.971875000000000000e+01 -1.135275000000000034e+00 -3.965625000000000000e+01 -1.135280000000000067e+00 -3.971875000000000000e+01 -1.135285000000000100e+00 -3.962500000000000000e+01 -1.135290000000000132e+00 -3.971875000000000000e+01 -1.135295000000000165e+00 -3.962500000000000000e+01 -1.135300000000000198e+00 -3.968750000000000000e+01 -1.135305000000000009e+00 -3.968750000000000000e+01 -1.135310000000000041e+00 -3.965625000000000000e+01 -1.135315000000000074e+00 -3.968750000000000000e+01 -1.135320000000000107e+00 -3.971875000000000000e+01 -1.135325000000000140e+00 -3.968750000000000000e+01 -1.135330000000000172e+00 -3.968750000000000000e+01 -1.135334999999999983e+00 -3.971875000000000000e+01 -1.135340000000000016e+00 -3.965625000000000000e+01 -1.135345000000000049e+00 -3.968750000000000000e+01 -1.135350000000000081e+00 -3.965625000000000000e+01 -1.135355000000000114e+00 -3.968750000000000000e+01 -1.135360000000000147e+00 -3.968750000000000000e+01 -1.135365000000000180e+00 -3.968750000000000000e+01 -1.135369999999999990e+00 -3.965625000000000000e+01 -1.135375000000000023e+00 -3.965625000000000000e+01 -1.135380000000000056e+00 -3.968750000000000000e+01 -1.135385000000000089e+00 -3.971875000000000000e+01 -1.135390000000000121e+00 -3.968750000000000000e+01 -1.135395000000000154e+00 -3.968750000000000000e+01 -1.135400000000000187e+00 -3.965625000000000000e+01 -1.135404999999999998e+00 -3.968750000000000000e+01 -1.135410000000000030e+00 -3.965625000000000000e+01 -1.135415000000000063e+00 -3.962500000000000000e+01 -1.135420000000000096e+00 -3.965625000000000000e+01 -1.135425000000000129e+00 -3.968750000000000000e+01 -1.135430000000000161e+00 -3.965625000000000000e+01 -1.135435000000000194e+00 -3.965625000000000000e+01 -1.135440000000000005e+00 -3.965625000000000000e+01 -1.135445000000000038e+00 -3.962500000000000000e+01 -1.135450000000000070e+00 -3.962500000000000000e+01 -1.135455000000000103e+00 -3.965625000000000000e+01 -1.135460000000000136e+00 -3.965625000000000000e+01 -1.135465000000000169e+00 -3.962500000000000000e+01 -1.135470000000000201e+00 -3.959375381469726562e+01 -1.135475000000000012e+00 -3.962500000000000000e+01 -1.135480000000000045e+00 -3.962500000000000000e+01 -1.135485000000000078e+00 -3.962500000000000000e+01 -1.135490000000000110e+00 -3.959375381469726562e+01 -1.135495000000000143e+00 -3.962500000000000000e+01 -1.135500000000000176e+00 -3.965625000000000000e+01 -1.135504999999999987e+00 -3.971875000000000000e+01 -1.135510000000000019e+00 -3.965625000000000000e+01 -1.135515000000000052e+00 -3.962500000000000000e+01 -1.135520000000000085e+00 -3.965625000000000000e+01 -1.135525000000000118e+00 -3.968750000000000000e+01 -1.135530000000000150e+00 -3.959375381469726562e+01 -1.135535000000000183e+00 -3.968750000000000000e+01 -1.135539999999999994e+00 -3.962500000000000000e+01 -1.135545000000000027e+00 -3.965625000000000000e+01 -1.135550000000000059e+00 -3.971875000000000000e+01 -1.135555000000000092e+00 -3.965625000000000000e+01 -1.135560000000000125e+00 -3.959375381469726562e+01 -1.135565000000000158e+00 -3.962500000000000000e+01 -1.135570000000000190e+00 -3.971875000000000000e+01 -1.135575000000000001e+00 -3.965625000000000000e+01 -1.135580000000000034e+00 -3.965625000000000000e+01 -1.135585000000000067e+00 -3.965625000000000000e+01 -1.135590000000000099e+00 -3.968750000000000000e+01 -1.135595000000000132e+00 -3.962500000000000000e+01 -1.135600000000000165e+00 -3.965625000000000000e+01 -1.135605000000000198e+00 -3.968750000000000000e+01 -1.135610000000000008e+00 -3.965625000000000000e+01 -1.135615000000000041e+00 -3.971875000000000000e+01 -1.135620000000000074e+00 -3.965625000000000000e+01 -1.135625000000000107e+00 -3.965625000000000000e+01 -1.135630000000000139e+00 -3.965625000000000000e+01 -1.135635000000000172e+00 -3.962500000000000000e+01 -1.135639999999999983e+00 -3.968750000000000000e+01 -1.135645000000000016e+00 -3.965625000000000000e+01 -1.135650000000000048e+00 -3.965625000000000000e+01 -1.135655000000000081e+00 -3.962500000000000000e+01 -1.135660000000000114e+00 -3.962500000000000000e+01 -1.135665000000000147e+00 -3.959375381469726562e+01 -1.135670000000000179e+00 -3.959375381469726562e+01 -1.135674999999999990e+00 -3.962500000000000000e+01 -1.135680000000000023e+00 -3.959375381469726562e+01 -1.135685000000000056e+00 -3.956250000000000000e+01 -1.135690000000000088e+00 -3.968750000000000000e+01 -1.135695000000000121e+00 -3.962500000000000000e+01 -1.135700000000000154e+00 -3.959375381469726562e+01 -1.135705000000000187e+00 -3.965625000000000000e+01 -1.135709999999999997e+00 -3.959375381469726562e+01 -1.135715000000000030e+00 -3.965625000000000000e+01 -1.135720000000000063e+00 -3.965625000000000000e+01 -1.135725000000000096e+00 -3.965625000000000000e+01 -1.135730000000000128e+00 -3.965625000000000000e+01 -1.135735000000000161e+00 -3.965625000000000000e+01 -1.135740000000000194e+00 -3.968750000000000000e+01 -1.135745000000000005e+00 -3.965625000000000000e+01 -1.135750000000000037e+00 -3.962500000000000000e+01 -1.135755000000000070e+00 -3.971875000000000000e+01 -1.135760000000000103e+00 -3.968750000000000000e+01 -1.135765000000000136e+00 -3.962500000000000000e+01 -1.135770000000000168e+00 -3.968750000000000000e+01 -1.135775000000000201e+00 -3.968750000000000000e+01 -1.135780000000000012e+00 -3.965625000000000000e+01 -1.135785000000000045e+00 -3.968750000000000000e+01 -1.135790000000000077e+00 -3.965625000000000000e+01 -1.135795000000000110e+00 -3.959375381469726562e+01 -1.135800000000000143e+00 -3.962500000000000000e+01 -1.135805000000000176e+00 -3.965625000000000000e+01 -1.135809999999999986e+00 -3.962500000000000000e+01 -1.135815000000000019e+00 -3.965625000000000000e+01 -1.135820000000000052e+00 -3.965625000000000000e+01 -1.135825000000000085e+00 -3.959375381469726562e+01 -1.135830000000000117e+00 -3.965625000000000000e+01 -1.135835000000000150e+00 -3.962500000000000000e+01 -1.135840000000000183e+00 -3.965625000000000000e+01 -1.135844999999999994e+00 -3.965625000000000000e+01 -1.135850000000000026e+00 -3.968750000000000000e+01 -1.135855000000000059e+00 -3.965625000000000000e+01 -1.135860000000000092e+00 -3.959375381469726562e+01 -1.135865000000000125e+00 -3.962500000000000000e+01 -1.135870000000000157e+00 -3.965625000000000000e+01 -1.135875000000000190e+00 -3.971875000000000000e+01 -1.135880000000000001e+00 -3.965625000000000000e+01 -1.135885000000000034e+00 -3.965625000000000000e+01 -1.135890000000000066e+00 -3.962500000000000000e+01 -1.135895000000000099e+00 -3.968750000000000000e+01 -1.135900000000000132e+00 -3.965625000000000000e+01 -1.135905000000000165e+00 -3.965625000000000000e+01 -1.135910000000000197e+00 -3.968750000000000000e+01 -1.135915000000000008e+00 -3.965625000000000000e+01 -1.135920000000000041e+00 -3.965625000000000000e+01 -1.135925000000000074e+00 -3.965625000000000000e+01 -1.135930000000000106e+00 -3.959375381469726562e+01 -1.135935000000000139e+00 -3.965625000000000000e+01 -1.135940000000000172e+00 -3.962500000000000000e+01 -1.135944999999999983e+00 -3.959375381469726562e+01 -1.135950000000000015e+00 -3.962500000000000000e+01 -1.135955000000000048e+00 -3.965625000000000000e+01 -1.135960000000000081e+00 -3.968750000000000000e+01 -1.135965000000000114e+00 -3.965625000000000000e+01 -1.135970000000000146e+00 -3.959375381469726562e+01 -1.135975000000000179e+00 -3.962500000000000000e+01 -1.135979999999999990e+00 -3.959375381469726562e+01 -1.135985000000000023e+00 -3.959375381469726562e+01 -1.135990000000000055e+00 -3.962500000000000000e+01 -1.135995000000000088e+00 -3.965625000000000000e+01 -1.136000000000000121e+00 -3.965625000000000000e+01 -1.136005000000000154e+00 -3.962500000000000000e+01 -1.136010000000000186e+00 -3.959375381469726562e+01 -1.136014999999999997e+00 -3.959375381469726562e+01 -1.136020000000000030e+00 -3.959375381469726562e+01 -1.136025000000000063e+00 -3.965625000000000000e+01 -1.136030000000000095e+00 -3.962500000000000000e+01 -1.136035000000000128e+00 -3.959375381469726562e+01 -1.136040000000000161e+00 -3.959375381469726562e+01 -1.136045000000000194e+00 -3.965625000000000000e+01 -1.136050000000000004e+00 -3.968750000000000000e+01 -1.136055000000000037e+00 -3.962500000000000000e+01 -1.136060000000000070e+00 -3.962500000000000000e+01 -1.136065000000000103e+00 -3.959375381469726562e+01 -1.136070000000000135e+00 -3.959375381469726562e+01 -1.136075000000000168e+00 -3.965625000000000000e+01 -1.136080000000000201e+00 -3.965625000000000000e+01 -1.136085000000000012e+00 -3.959375381469726562e+01 -1.136090000000000044e+00 -3.962500000000000000e+01 -1.136095000000000077e+00 -3.962500000000000000e+01 -1.136100000000000110e+00 -3.965625000000000000e+01 -1.136105000000000143e+00 -3.959375381469726562e+01 -1.136110000000000175e+00 -3.962500000000000000e+01 -1.136114999999999986e+00 -3.965625000000000000e+01 -1.136120000000000019e+00 -3.962500000000000000e+01 -1.136125000000000052e+00 -3.962500000000000000e+01 -1.136130000000000084e+00 -3.962500000000000000e+01 -1.136135000000000117e+00 -3.956250000000000000e+01 -1.136140000000000150e+00 -3.959375381469726562e+01 -1.136145000000000183e+00 -3.965625000000000000e+01 -1.136149999999999993e+00 -3.959375381469726562e+01 -1.136155000000000026e+00 -3.965625000000000000e+01 -1.136160000000000059e+00 -3.965625000000000000e+01 -1.136165000000000092e+00 -3.968750000000000000e+01 -1.136170000000000124e+00 -3.956250000000000000e+01 -1.136175000000000157e+00 -3.962500000000000000e+01 -1.136180000000000190e+00 -3.965625000000000000e+01 -1.136185000000000000e+00 -3.962500000000000000e+01 -1.136190000000000033e+00 -3.962500000000000000e+01 -1.136195000000000066e+00 -3.968750000000000000e+01 -1.136200000000000099e+00 -3.962500000000000000e+01 -1.136205000000000132e+00 -3.965625000000000000e+01 -1.136210000000000164e+00 -3.959375381469726562e+01 -1.136215000000000197e+00 -3.965625000000000000e+01 -1.136220000000000008e+00 -3.959375381469726562e+01 -1.136225000000000041e+00 -3.959375381469726562e+01 -1.136230000000000073e+00 -3.965625000000000000e+01 -1.136235000000000106e+00 -3.962500000000000000e+01 -1.136240000000000139e+00 -3.959375381469726562e+01 -1.136245000000000172e+00 -3.959375381469726562e+01 -1.136249999999999982e+00 -3.965625000000000000e+01 -1.136255000000000015e+00 -3.965625000000000000e+01 -1.136260000000000048e+00 -3.962500000000000000e+01 -1.136265000000000081e+00 -3.959375381469726562e+01 -1.136270000000000113e+00 -3.965625000000000000e+01 -1.136275000000000146e+00 -3.965625000000000000e+01 -1.136280000000000179e+00 -3.959375381469726562e+01 -1.136284999999999989e+00 -3.962500000000000000e+01 -1.136290000000000022e+00 -3.959375381469726562e+01 -1.136295000000000055e+00 -3.965625000000000000e+01 -1.136300000000000088e+00 -3.962500000000000000e+01 -1.136305000000000121e+00 -3.965625000000000000e+01 -1.136310000000000153e+00 -3.962500000000000000e+01 -1.136315000000000186e+00 -3.965625000000000000e+01 -1.136319999999999997e+00 -3.962500000000000000e+01 -1.136325000000000029e+00 -3.971875000000000000e+01 -1.136330000000000062e+00 -3.965625000000000000e+01 -1.136335000000000095e+00 -3.965625000000000000e+01 -1.136340000000000128e+00 -3.971875000000000000e+01 -1.136345000000000161e+00 -3.968750000000000000e+01 -1.136350000000000193e+00 -3.965625000000000000e+01 -1.136355000000000004e+00 -3.962500000000000000e+01 -1.136360000000000037e+00 -3.959375381469726562e+01 -1.136365000000000069e+00 -3.962500000000000000e+01 -1.136370000000000102e+00 -3.968750000000000000e+01 -1.136375000000000135e+00 -3.965625000000000000e+01 -1.136380000000000168e+00 -3.968750000000000000e+01 -1.136385000000000201e+00 -3.968750000000000000e+01 -1.136390000000000011e+00 -3.965625000000000000e+01 -1.136395000000000044e+00 -3.965625000000000000e+01 -1.136400000000000077e+00 -3.968750000000000000e+01 -1.136405000000000109e+00 -3.971875000000000000e+01 -1.136410000000000142e+00 -3.959375381469726562e+01 -1.136415000000000175e+00 -3.965625000000000000e+01 -1.136419999999999986e+00 -3.959375381469726562e+01 -1.136425000000000018e+00 -3.965625000000000000e+01 -1.136430000000000051e+00 -3.962500000000000000e+01 -1.136435000000000084e+00 -3.965625000000000000e+01 -1.136440000000000117e+00 -3.968750000000000000e+01 -1.136445000000000149e+00 -3.975000381469726562e+01 -1.136450000000000182e+00 -3.968750000000000000e+01 -1.136454999999999993e+00 -3.962500000000000000e+01 -1.136460000000000026e+00 -3.965625000000000000e+01 -1.136465000000000058e+00 -3.968750000000000000e+01 -1.136470000000000091e+00 -3.965625000000000000e+01 -1.136475000000000124e+00 -3.965625000000000000e+01 -1.136480000000000157e+00 -3.962500000000000000e+01 -1.136485000000000190e+00 -3.965625000000000000e+01 -1.136490000000000000e+00 -3.959375381469726562e+01 -1.136495000000000033e+00 -3.956250000000000000e+01 -1.136500000000000066e+00 -3.965625000000000000e+01 -1.136505000000000098e+00 -3.965625000000000000e+01 -1.136510000000000131e+00 -3.965625000000000000e+01 -1.136515000000000164e+00 -3.965625000000000000e+01 -1.136520000000000197e+00 -3.968750000000000000e+01 -1.136525000000000007e+00 -3.962500000000000000e+01 -1.136530000000000040e+00 -3.965625000000000000e+01 -1.136535000000000073e+00 -3.965625000000000000e+01 -1.136540000000000106e+00 -3.965625000000000000e+01 -1.136545000000000138e+00 -3.965625000000000000e+01 -1.136550000000000171e+00 -3.968750000000000000e+01 -1.136554999999999982e+00 -3.959375381469726562e+01 -1.136560000000000015e+00 -3.971875000000000000e+01 -1.136565000000000047e+00 -3.965625000000000000e+01 -1.136570000000000080e+00 -3.965625000000000000e+01 -1.136575000000000113e+00 -3.965625000000000000e+01 -1.136580000000000146e+00 -3.962500000000000000e+01 -1.136585000000000178e+00 -3.962500000000000000e+01 -1.136589999999999989e+00 -3.959375381469726562e+01 -1.136595000000000022e+00 -3.959375381469726562e+01 -1.136600000000000055e+00 -3.965625000000000000e+01 -1.136605000000000087e+00 -3.962500000000000000e+01 -1.136610000000000120e+00 -3.962500000000000000e+01 -1.136615000000000153e+00 -3.962500000000000000e+01 -1.136620000000000186e+00 -3.965625000000000000e+01 -1.136624999999999996e+00 -3.965625000000000000e+01 -1.136630000000000029e+00 -3.965625000000000000e+01 -1.136635000000000062e+00 -3.959375381469726562e+01 -1.136640000000000095e+00 -3.965625000000000000e+01 -1.136645000000000127e+00 -3.965625000000000000e+01 -1.136650000000000160e+00 -3.956250000000000000e+01 -1.136655000000000193e+00 -3.956250000000000000e+01 -1.136660000000000004e+00 -3.959375381469726562e+01 -1.136665000000000036e+00 -3.962500000000000000e+01 -1.136670000000000069e+00 -3.965625000000000000e+01 -1.136675000000000102e+00 -3.962500000000000000e+01 -1.136680000000000135e+00 -3.965625000000000000e+01 -1.136685000000000167e+00 -3.956250000000000000e+01 -1.136690000000000200e+00 -3.959375381469726562e+01 -1.136695000000000011e+00 -3.956250000000000000e+01 -1.136700000000000044e+00 -3.959375381469726562e+01 -1.136705000000000076e+00 -3.959375381469726562e+01 -1.136710000000000109e+00 -3.959375381469726562e+01 -1.136715000000000142e+00 -3.959375381469726562e+01 -1.136720000000000175e+00 -3.965625000000000000e+01 -1.136724999999999985e+00 -3.956250000000000000e+01 -1.136730000000000018e+00 -3.962500000000000000e+01 -1.136735000000000051e+00 -3.965625000000000000e+01 -1.136740000000000084e+00 -3.962500000000000000e+01 -1.136745000000000116e+00 -3.956250000000000000e+01 -1.136750000000000149e+00 -3.959375381469726562e+01 -1.136755000000000182e+00 -3.962500000000000000e+01 -1.136759999999999993e+00 -3.965625000000000000e+01 -1.136765000000000025e+00 -3.962500000000000000e+01 -1.136770000000000058e+00 -3.959375381469726562e+01 -1.136775000000000091e+00 -3.962500000000000000e+01 -1.136780000000000124e+00 -3.962500000000000000e+01 -1.136785000000000156e+00 -3.965625000000000000e+01 -1.136790000000000189e+00 -3.959375381469726562e+01 -1.136795000000000000e+00 -3.962500000000000000e+01 -1.136800000000000033e+00 -3.962500000000000000e+01 -1.136805000000000065e+00 -3.962500000000000000e+01 -1.136810000000000098e+00 -3.959375381469726562e+01 -1.136815000000000131e+00 -3.959375381469726562e+01 -1.136820000000000164e+00 -3.959375381469726562e+01 -1.136825000000000196e+00 -3.962500000000000000e+01 -1.136830000000000007e+00 -3.959375381469726562e+01 -1.136835000000000040e+00 -3.962500000000000000e+01 -1.136840000000000073e+00 -3.953125000000000000e+01 -1.136845000000000105e+00 -3.953125000000000000e+01 -1.136850000000000138e+00 -3.959375381469726562e+01 -1.136855000000000171e+00 -3.956250000000000000e+01 -1.136860000000000204e+00 -3.956250000000000000e+01 -1.136865000000000014e+00 -3.959375381469726562e+01 -1.136870000000000047e+00 -3.956250000000000000e+01 -1.136875000000000080e+00 -3.956250000000000000e+01 -1.136880000000000113e+00 -3.959375381469726562e+01 -1.136885000000000145e+00 -3.959375381469726562e+01 -1.136890000000000178e+00 -3.956250000000000000e+01 -1.136894999999999989e+00 -3.953125000000000000e+01 -1.136900000000000022e+00 -3.953125000000000000e+01 -1.136905000000000054e+00 -3.953125000000000000e+01 -1.136910000000000087e+00 -3.959375381469726562e+01 -1.136915000000000120e+00 -3.953125000000000000e+01 -1.136920000000000153e+00 -3.956250000000000000e+01 -1.136925000000000185e+00 -3.953125000000000000e+01 -1.136929999999999996e+00 -3.956250000000000000e+01 -1.136935000000000029e+00 -3.950000000000000000e+01 -1.136940000000000062e+00 -3.953125000000000000e+01 -1.136945000000000094e+00 -3.956250000000000000e+01 -1.136950000000000127e+00 -3.959375381469726562e+01 -1.136955000000000160e+00 -3.962500000000000000e+01 -1.136960000000000193e+00 -3.959375381469726562e+01 -1.136965000000000003e+00 -3.956250000000000000e+01 -1.136970000000000036e+00 -3.956250000000000000e+01 -1.136975000000000069e+00 -3.959375381469726562e+01 -1.136980000000000102e+00 -3.956250000000000000e+01 -1.136985000000000134e+00 -3.959375381469726562e+01 -1.136990000000000167e+00 -3.962500000000000000e+01 -1.136995000000000200e+00 -3.959375381469726562e+01 -1.137000000000000011e+00 -3.956250000000000000e+01 -1.137005000000000043e+00 -3.959375381469726562e+01 -1.137010000000000076e+00 -3.959375381469726562e+01 -1.137015000000000109e+00 -3.956250000000000000e+01 -1.137020000000000142e+00 -3.956250000000000000e+01 -1.137025000000000174e+00 -3.959375381469726562e+01 -1.137029999999999985e+00 -3.956250000000000000e+01 -1.137035000000000018e+00 -3.953125000000000000e+01 -1.137040000000000051e+00 -3.959375381469726562e+01 -1.137045000000000083e+00 -3.956250000000000000e+01 -1.137050000000000116e+00 -3.962500000000000000e+01 -1.137055000000000149e+00 -3.953125000000000000e+01 -1.137060000000000182e+00 -3.953125000000000000e+01 -1.137064999999999992e+00 -3.956250000000000000e+01 -1.137070000000000025e+00 -3.956250000000000000e+01 -1.137075000000000058e+00 -3.959375381469726562e+01 -1.137080000000000091e+00 -3.953125000000000000e+01 -1.137085000000000123e+00 -3.953125000000000000e+01 -1.137090000000000156e+00 -3.956250000000000000e+01 -1.137095000000000189e+00 -3.953125000000000000e+01 -1.137100000000000000e+00 -3.956250000000000000e+01 -1.137105000000000032e+00 -3.956250000000000000e+01 -1.137110000000000065e+00 -3.953125000000000000e+01 -1.137115000000000098e+00 -3.956250000000000000e+01 -1.137120000000000131e+00 -3.956250000000000000e+01 -1.137125000000000163e+00 -3.953125000000000000e+01 -1.137130000000000196e+00 -3.956250000000000000e+01 -1.137135000000000007e+00 -3.953125000000000000e+01 -1.137140000000000040e+00 -3.953125000000000000e+01 -1.137145000000000072e+00 -3.956250000000000000e+01 -1.137150000000000105e+00 -3.950000000000000000e+01 -1.137155000000000138e+00 -3.953125000000000000e+01 -1.137160000000000171e+00 -3.956250000000000000e+01 -1.137165000000000203e+00 -3.953125000000000000e+01 -1.137170000000000014e+00 -3.956250000000000000e+01 -1.137175000000000047e+00 -3.956250000000000000e+01 -1.137180000000000080e+00 -3.956250000000000000e+01 -1.137185000000000112e+00 -3.956250000000000000e+01 -1.137190000000000145e+00 -3.956250000000000000e+01 -1.137195000000000178e+00 -3.953125000000000000e+01 -1.137199999999999989e+00 -3.959375381469726562e+01 -1.137205000000000021e+00 -3.959375381469726562e+01 -1.137210000000000054e+00 -3.959375381469726562e+01 -1.137215000000000087e+00 -3.956250000000000000e+01 -1.137220000000000120e+00 -3.959375381469726562e+01 -1.137225000000000152e+00 -3.959375381469726562e+01 -1.137230000000000185e+00 -3.962500000000000000e+01 -1.137234999999999996e+00 -3.956250000000000000e+01 -1.137240000000000029e+00 -3.956250000000000000e+01 -1.137245000000000061e+00 -3.959375381469726562e+01 -1.137250000000000094e+00 -3.953125000000000000e+01 -1.137255000000000127e+00 -3.956250000000000000e+01 -1.137260000000000160e+00 -3.950000000000000000e+01 -1.137265000000000192e+00 -3.953125000000000000e+01 -1.137270000000000003e+00 -3.959375381469726562e+01 -1.137275000000000036e+00 -3.956250000000000000e+01 -1.137280000000000069e+00 -3.950000000000000000e+01 -1.137285000000000101e+00 -3.953125000000000000e+01 -1.137290000000000134e+00 -3.953125000000000000e+01 -1.137295000000000167e+00 -3.959375381469726562e+01 -1.137300000000000200e+00 -3.959375381469726562e+01 -1.137305000000000010e+00 -3.953125000000000000e+01 -1.137310000000000043e+00 -3.953125000000000000e+01 -1.137315000000000076e+00 -3.950000000000000000e+01 -1.137320000000000109e+00 -3.950000000000000000e+01 -1.137325000000000141e+00 -3.953125000000000000e+01 -1.137330000000000174e+00 -3.953125000000000000e+01 -1.137334999999999985e+00 -3.950000000000000000e+01 -1.137340000000000018e+00 -3.953125000000000000e+01 -1.137345000000000050e+00 -3.959375381469726562e+01 -1.137350000000000083e+00 -3.953125000000000000e+01 -1.137355000000000116e+00 -3.953125000000000000e+01 -1.137360000000000149e+00 -3.953125000000000000e+01 -1.137365000000000181e+00 -3.953125000000000000e+01 -1.137369999999999992e+00 -3.956250000000000000e+01 -1.137375000000000025e+00 -3.959375381469726562e+01 -1.137380000000000058e+00 -3.956250000000000000e+01 -1.137385000000000090e+00 -3.953125000000000000e+01 -1.137390000000000123e+00 -3.956250000000000000e+01 -1.137395000000000156e+00 -3.959375381469726562e+01 -1.137400000000000189e+00 -3.953125000000000000e+01 -1.137404999999999999e+00 -3.962500000000000000e+01 -1.137410000000000032e+00 -3.956250000000000000e+01 -1.137415000000000065e+00 -3.959375381469726562e+01 -1.137420000000000098e+00 -3.956250000000000000e+01 -1.137425000000000130e+00 -3.959375381469726562e+01 -1.137430000000000163e+00 -3.953125000000000000e+01 -1.137435000000000196e+00 -3.953125000000000000e+01 -1.137440000000000007e+00 -3.956250000000000000e+01 -1.137445000000000039e+00 -3.950000000000000000e+01 -1.137450000000000072e+00 -3.956250000000000000e+01 -1.137455000000000105e+00 -3.956250000000000000e+01 -1.137460000000000138e+00 -3.956250000000000000e+01 -1.137465000000000170e+00 -3.965625000000000000e+01 -1.137470000000000203e+00 -3.953125000000000000e+01 -1.137475000000000014e+00 -3.956250000000000000e+01 -1.137480000000000047e+00 -3.959375381469726562e+01 -1.137485000000000079e+00 -3.956250000000000000e+01 -1.137490000000000112e+00 -3.968750000000000000e+01 -1.137495000000000145e+00 -3.962500000000000000e+01 -1.137500000000000178e+00 -3.959375381469726562e+01 -1.137504999999999988e+00 -3.953125000000000000e+01 -1.137510000000000021e+00 -3.956250000000000000e+01 -1.137515000000000054e+00 -3.956250000000000000e+01 -1.137520000000000087e+00 -3.959375381469726562e+01 -1.137525000000000119e+00 -3.959375381469726562e+01 -1.137530000000000152e+00 -3.959375381469726562e+01 -1.137535000000000185e+00 -3.962500000000000000e+01 -1.137539999999999996e+00 -3.956250000000000000e+01 -1.137545000000000028e+00 -3.959375381469726562e+01 -1.137550000000000061e+00 -3.953125000000000000e+01 -1.137555000000000094e+00 -3.950000000000000000e+01 -1.137560000000000127e+00 -3.953125000000000000e+01 -1.137565000000000159e+00 -3.956250000000000000e+01 -1.137570000000000192e+00 -3.950000000000000000e+01 -1.137575000000000003e+00 -3.956250000000000000e+01 -1.137580000000000036e+00 -3.950000000000000000e+01 -1.137585000000000068e+00 -3.950000000000000000e+01 -1.137590000000000101e+00 -3.953125000000000000e+01 -1.137595000000000134e+00 -3.950000000000000000e+01 -1.137600000000000167e+00 -3.959375381469726562e+01 -1.137605000000000199e+00 -3.950000000000000000e+01 -1.137610000000000010e+00 -3.956250000000000000e+01 -1.137615000000000043e+00 -3.956250000000000000e+01 -1.137620000000000076e+00 -3.953125000000000000e+01 -1.137625000000000108e+00 -3.953125000000000000e+01 -1.137630000000000141e+00 -3.956250000000000000e+01 -1.137635000000000174e+00 -3.950000000000000000e+01 -1.137639999999999985e+00 -3.959375381469726562e+01 -1.137645000000000017e+00 -3.956250000000000000e+01 -1.137650000000000050e+00 -3.953125000000000000e+01 -1.137655000000000083e+00 -3.953125000000000000e+01 -1.137660000000000116e+00 -3.953125000000000000e+01 -1.137665000000000148e+00 -3.956250000000000000e+01 -1.137670000000000181e+00 -3.953125000000000000e+01 -1.137674999999999992e+00 -3.956250000000000000e+01 -1.137680000000000025e+00 -3.953125000000000000e+01 -1.137685000000000057e+00 -3.953125000000000000e+01 -1.137690000000000090e+00 -3.953125000000000000e+01 -1.137695000000000123e+00 -3.959375381469726562e+01 -1.137700000000000156e+00 -3.953125000000000000e+01 -1.137705000000000188e+00 -3.953125000000000000e+01 -1.137709999999999999e+00 -3.953125000000000000e+01 -1.137715000000000032e+00 -3.959375381469726562e+01 -1.137720000000000065e+00 -3.953125000000000000e+01 -1.137725000000000097e+00 -3.950000000000000000e+01 -1.137730000000000130e+00 -3.950000000000000000e+01 -1.137735000000000163e+00 -3.946875000000000000e+01 -1.137740000000000196e+00 -3.950000000000000000e+01 -1.137745000000000006e+00 -3.956250000000000000e+01 -1.137750000000000039e+00 -3.956250000000000000e+01 -1.137755000000000072e+00 -3.950000000000000000e+01 -1.137760000000000105e+00 -3.950000000000000000e+01 -1.137765000000000137e+00 -3.953125000000000000e+01 -1.137770000000000170e+00 -3.950000000000000000e+01 -1.137775000000000203e+00 -3.956250000000000000e+01 -1.137780000000000014e+00 -3.953125000000000000e+01 -1.137785000000000046e+00 -3.953125000000000000e+01 -1.137790000000000079e+00 -3.950000000000000000e+01 -1.137795000000000112e+00 -3.950000000000000000e+01 -1.137800000000000145e+00 -3.946875000000000000e+01 -1.137805000000000177e+00 -3.953125000000000000e+01 -1.137809999999999988e+00 -3.953125000000000000e+01 -1.137815000000000021e+00 -3.953125000000000000e+01 -1.137820000000000054e+00 -3.950000000000000000e+01 -1.137825000000000086e+00 -3.946875000000000000e+01 -1.137830000000000119e+00 -3.950000000000000000e+01 -1.137835000000000152e+00 -3.953125000000000000e+01 -1.137840000000000185e+00 -3.953125000000000000e+01 -1.137844999999999995e+00 -3.950000000000000000e+01 -1.137850000000000028e+00 -3.950000000000000000e+01 -1.137855000000000061e+00 -3.946875000000000000e+01 -1.137860000000000094e+00 -3.953125000000000000e+01 -1.137865000000000126e+00 -3.950000000000000000e+01 -1.137870000000000159e+00 -3.943750381469726562e+01 -1.137875000000000192e+00 -3.953125000000000000e+01 -1.137880000000000003e+00 -3.950000000000000000e+01 -1.137885000000000035e+00 -3.950000000000000000e+01 -1.137890000000000068e+00 -3.943750381469726562e+01 -1.137895000000000101e+00 -3.953125000000000000e+01 -1.137900000000000134e+00 -3.950000000000000000e+01 -1.137905000000000166e+00 -3.950000000000000000e+01 -1.137910000000000199e+00 -3.953125000000000000e+01 -1.137915000000000010e+00 -3.950000000000000000e+01 -1.137920000000000043e+00 -3.946875000000000000e+01 -1.137925000000000075e+00 -3.953125000000000000e+01 -1.137930000000000108e+00 -3.950000000000000000e+01 -1.137935000000000141e+00 -3.946875000000000000e+01 -1.137940000000000174e+00 -3.946875000000000000e+01 -1.137944999999999984e+00 -3.946875000000000000e+01 -1.137950000000000017e+00 -3.953125000000000000e+01 -1.137955000000000050e+00 -3.943750381469726562e+01 -1.137960000000000083e+00 -3.950000000000000000e+01 -1.137965000000000115e+00 -3.943750381469726562e+01 -1.137970000000000148e+00 -3.950000000000000000e+01 -1.137975000000000181e+00 -3.950000000000000000e+01 -1.137979999999999992e+00 -3.946875000000000000e+01 -1.137985000000000024e+00 -3.946875000000000000e+01 -1.137990000000000057e+00 -3.950000000000000000e+01 -1.137995000000000090e+00 -3.946875000000000000e+01 -1.138000000000000123e+00 -3.953125000000000000e+01 -1.138005000000000155e+00 -3.953125000000000000e+01 -1.138010000000000188e+00 -3.946875000000000000e+01 -1.138014999999999999e+00 -3.946875000000000000e+01 -1.138020000000000032e+00 -3.946875000000000000e+01 -1.138025000000000064e+00 -3.946875000000000000e+01 -1.138030000000000097e+00 -3.946875000000000000e+01 -1.138035000000000130e+00 -3.943750381469726562e+01 -1.138040000000000163e+00 -3.950000000000000000e+01 -1.138045000000000195e+00 -3.946875000000000000e+01 -1.138050000000000006e+00 -3.950000000000000000e+01 -1.138055000000000039e+00 -3.943750381469726562e+01 -1.138060000000000072e+00 -3.950000000000000000e+01 -1.138065000000000104e+00 -3.950000000000000000e+01 -1.138070000000000137e+00 -3.940625000000000000e+01 -1.138075000000000170e+00 -3.943750381469726562e+01 -1.138080000000000203e+00 -3.946875000000000000e+01 -1.138085000000000013e+00 -3.950000000000000000e+01 -1.138090000000000046e+00 -3.946875000000000000e+01 -1.138095000000000079e+00 -3.943750381469726562e+01 -1.138100000000000112e+00 -3.943750381469726562e+01 -1.138105000000000144e+00 -3.950000000000000000e+01 -1.138110000000000177e+00 -3.950000000000000000e+01 -1.138114999999999988e+00 -3.950000000000000000e+01 -1.138120000000000021e+00 -3.956250000000000000e+01 -1.138125000000000053e+00 -3.946875000000000000e+01 -1.138130000000000086e+00 -3.946875000000000000e+01 -1.138135000000000119e+00 -3.946875000000000000e+01 -1.138140000000000152e+00 -3.950000000000000000e+01 -1.138145000000000184e+00 -3.950000000000000000e+01 -1.138149999999999995e+00 -3.946875000000000000e+01 -1.138155000000000028e+00 -3.950000000000000000e+01 -1.138160000000000061e+00 -3.953125000000000000e+01 -1.138165000000000093e+00 -3.950000000000000000e+01 -1.138170000000000126e+00 -3.946875000000000000e+01 -1.138175000000000159e+00 -3.953125000000000000e+01 -1.138180000000000192e+00 -3.950000000000000000e+01 -1.138185000000000002e+00 -3.946875000000000000e+01 -1.138190000000000035e+00 -3.950000000000000000e+01 -1.138195000000000068e+00 -3.946875000000000000e+01 -1.138200000000000101e+00 -3.950000000000000000e+01 -1.138205000000000133e+00 -3.943750381469726562e+01 -1.138210000000000166e+00 -3.950000000000000000e+01 -1.138215000000000199e+00 -3.953125000000000000e+01 -1.138220000000000010e+00 -3.946875000000000000e+01 -1.138225000000000042e+00 -3.946875000000000000e+01 -1.138230000000000075e+00 -3.950000000000000000e+01 -1.138235000000000108e+00 -3.950000000000000000e+01 -1.138240000000000141e+00 -3.950000000000000000e+01 -1.138245000000000173e+00 -3.946875000000000000e+01 -1.138249999999999984e+00 -3.950000000000000000e+01 -1.138255000000000017e+00 -3.953125000000000000e+01 -1.138260000000000050e+00 -3.943750381469726562e+01 -1.138265000000000082e+00 -3.943750381469726562e+01 -1.138270000000000115e+00 -3.946875000000000000e+01 -1.138275000000000148e+00 -3.946875000000000000e+01 -1.138280000000000181e+00 -3.946875000000000000e+01 -1.138284999999999991e+00 -3.946875000000000000e+01 -1.138290000000000024e+00 -3.946875000000000000e+01 -1.138295000000000057e+00 -3.953125000000000000e+01 -1.138300000000000090e+00 -3.946875000000000000e+01 -1.138305000000000122e+00 -3.950000000000000000e+01 -1.138310000000000155e+00 -3.940625000000000000e+01 -1.138315000000000188e+00 -3.946875000000000000e+01 -1.138319999999999999e+00 -3.943750381469726562e+01 -1.138325000000000031e+00 -3.950000000000000000e+01 -1.138330000000000064e+00 -3.940625000000000000e+01 -1.138335000000000097e+00 -3.953125000000000000e+01 -1.138340000000000130e+00 -3.943750381469726562e+01 -1.138345000000000162e+00 -3.943750381469726562e+01 -1.138350000000000195e+00 -3.946875000000000000e+01 -1.138355000000000006e+00 -3.946875000000000000e+01 -1.138360000000000039e+00 -3.950000000000000000e+01 -1.138365000000000071e+00 -3.946875000000000000e+01 -1.138370000000000104e+00 -3.943750381469726562e+01 -1.138375000000000137e+00 -3.946875000000000000e+01 -1.138380000000000170e+00 -3.946875000000000000e+01 -1.138385000000000202e+00 -3.950000000000000000e+01 -1.138390000000000013e+00 -3.943750381469726562e+01 -1.138395000000000046e+00 -3.943750381469726562e+01 -1.138400000000000079e+00 -3.953125000000000000e+01 -1.138405000000000111e+00 -3.946875000000000000e+01 -1.138410000000000144e+00 -3.946875000000000000e+01 -1.138415000000000177e+00 -3.946875000000000000e+01 -1.138419999999999987e+00 -3.950000000000000000e+01 -1.138425000000000020e+00 -3.946875000000000000e+01 -1.138430000000000053e+00 -3.946875000000000000e+01 -1.138435000000000086e+00 -3.940625000000000000e+01 -1.138440000000000119e+00 -3.943750381469726562e+01 -1.138445000000000151e+00 -3.940625000000000000e+01 -1.138450000000000184e+00 -3.946875000000000000e+01 -1.138454999999999995e+00 -3.943750381469726562e+01 -1.138460000000000027e+00 -3.946875000000000000e+01 -1.138465000000000060e+00 -3.950000000000000000e+01 -1.138470000000000093e+00 -3.943750381469726562e+01 -1.138475000000000126e+00 -3.946875000000000000e+01 -1.138480000000000159e+00 -3.946875000000000000e+01 -1.138485000000000191e+00 -3.946875000000000000e+01 -1.138490000000000002e+00 -3.943750381469726562e+01 -1.138495000000000035e+00 -3.943750381469726562e+01 -1.138500000000000068e+00 -3.946875000000000000e+01 -1.138505000000000100e+00 -3.943750381469726562e+01 -1.138510000000000133e+00 -3.950000000000000000e+01 -1.138515000000000166e+00 -3.940625000000000000e+01 -1.138520000000000199e+00 -3.937500000000000000e+01 -1.138525000000000009e+00 -3.943750381469726562e+01 -1.138530000000000042e+00 -3.943750381469726562e+01 -1.138535000000000075e+00 -3.950000000000000000e+01 -1.138540000000000108e+00 -3.943750381469726562e+01 -1.138545000000000140e+00 -3.946875000000000000e+01 -1.138550000000000173e+00 -3.937500000000000000e+01 -1.138554999999999984e+00 -3.943750381469726562e+01 -1.138560000000000016e+00 -3.943750381469726562e+01 -1.138565000000000049e+00 -3.940625000000000000e+01 -1.138570000000000082e+00 -3.943750381469726562e+01 -1.138575000000000115e+00 -3.940625000000000000e+01 -1.138580000000000148e+00 -3.946875000000000000e+01 -1.138585000000000180e+00 -3.946875000000000000e+01 -1.138589999999999991e+00 -3.940625000000000000e+01 -1.138595000000000024e+00 -3.940625000000000000e+01 -1.138600000000000056e+00 -3.946875000000000000e+01 -1.138605000000000089e+00 -3.943750381469726562e+01 -1.138610000000000122e+00 -3.934375381469726562e+01 -1.138615000000000155e+00 -3.934375381469726562e+01 -1.138620000000000188e+00 -3.940625000000000000e+01 -1.138624999999999998e+00 -3.946875000000000000e+01 -1.138630000000000031e+00 -3.937500000000000000e+01 -1.138635000000000064e+00 -3.940625000000000000e+01 -1.138640000000000096e+00 -3.943750381469726562e+01 -1.138645000000000129e+00 -3.946875000000000000e+01 -1.138650000000000162e+00 -3.943750381469726562e+01 -1.138655000000000195e+00 -3.931250000000000000e+01 -1.138660000000000005e+00 -3.940625000000000000e+01 -1.138665000000000038e+00 -3.940625000000000000e+01 -1.138670000000000071e+00 -3.940625000000000000e+01 -1.138675000000000104e+00 -3.937500000000000000e+01 -1.138680000000000136e+00 -3.934375381469726562e+01 -1.138685000000000169e+00 -3.940625000000000000e+01 -1.138690000000000202e+00 -3.937500000000000000e+01 -1.138695000000000013e+00 -3.940625000000000000e+01 -1.138700000000000045e+00 -3.943750381469726562e+01 -1.138705000000000078e+00 -3.943750381469726562e+01 -1.138710000000000111e+00 -3.946875000000000000e+01 -1.138715000000000144e+00 -3.943750381469726562e+01 -1.138720000000000176e+00 -3.937500000000000000e+01 -1.138724999999999987e+00 -3.943750381469726562e+01 -1.138730000000000020e+00 -3.943750381469726562e+01 -1.138735000000000053e+00 -3.943750381469726562e+01 -1.138740000000000085e+00 -3.946875000000000000e+01 -1.138745000000000118e+00 -3.950000000000000000e+01 -1.138750000000000151e+00 -3.943750381469726562e+01 -1.138755000000000184e+00 -3.946875000000000000e+01 -1.138759999999999994e+00 -3.946875000000000000e+01 -1.138765000000000027e+00 -3.946875000000000000e+01 -1.138770000000000060e+00 -3.946875000000000000e+01 -1.138775000000000093e+00 -3.943750381469726562e+01 -1.138780000000000125e+00 -3.940625000000000000e+01 -1.138785000000000158e+00 -3.940625000000000000e+01 -1.138790000000000191e+00 -3.943750381469726562e+01 -1.138795000000000002e+00 -3.943750381469726562e+01 -1.138800000000000034e+00 -3.950000000000000000e+01 -1.138805000000000067e+00 -3.950000000000000000e+01 -1.138810000000000100e+00 -3.946875000000000000e+01 -1.138815000000000133e+00 -3.953125000000000000e+01 -1.138820000000000165e+00 -3.946875000000000000e+01 -1.138825000000000198e+00 -3.943750381469726562e+01 -1.138830000000000009e+00 -3.940625000000000000e+01 -1.138835000000000042e+00 -3.946875000000000000e+01 -1.138840000000000074e+00 -3.943750381469726562e+01 -1.138845000000000107e+00 -3.946875000000000000e+01 -1.138850000000000140e+00 -3.950000000000000000e+01 -1.138855000000000173e+00 -3.950000000000000000e+01 -1.138859999999999983e+00 -3.940625000000000000e+01 -1.138865000000000016e+00 -3.946875000000000000e+01 -1.138870000000000049e+00 -3.940625000000000000e+01 -1.138875000000000082e+00 -3.943750381469726562e+01 -1.138880000000000114e+00 -3.937500000000000000e+01 -1.138885000000000147e+00 -3.940625000000000000e+01 -1.138890000000000180e+00 -3.940625000000000000e+01 -1.138894999999999991e+00 -3.943750381469726562e+01 -1.138900000000000023e+00 -3.940625000000000000e+01 -1.138905000000000056e+00 -3.940625000000000000e+01 -1.138910000000000089e+00 -3.940625000000000000e+01 -1.138915000000000122e+00 -3.943750381469726562e+01 -1.138920000000000154e+00 -3.940625000000000000e+01 -1.138925000000000187e+00 -3.937500000000000000e+01 -1.138929999999999998e+00 -3.937500000000000000e+01 -1.138935000000000031e+00 -3.940625000000000000e+01 -1.138940000000000063e+00 -3.940625000000000000e+01 -1.138945000000000096e+00 -3.940625000000000000e+01 -1.138950000000000129e+00 -3.940625000000000000e+01 -1.138955000000000162e+00 -3.943750381469726562e+01 -1.138960000000000194e+00 -3.950000000000000000e+01 -1.138965000000000005e+00 -3.940625000000000000e+01 -1.138970000000000038e+00 -3.940625000000000000e+01 -1.138975000000000071e+00 -3.946875000000000000e+01 -1.138980000000000103e+00 -3.943750381469726562e+01 -1.138985000000000136e+00 -3.943750381469726562e+01 -1.138990000000000169e+00 -3.943750381469726562e+01 -1.138995000000000202e+00 -3.940625000000000000e+01 -1.139000000000000012e+00 -3.946875000000000000e+01 -1.139005000000000045e+00 -3.950000000000000000e+01 -1.139010000000000078e+00 -3.937500000000000000e+01 -1.139015000000000111e+00 -3.940625000000000000e+01 -1.139020000000000143e+00 -3.950000000000000000e+01 -1.139025000000000176e+00 -3.943750381469726562e+01 -1.139029999999999987e+00 -3.943750381469726562e+01 -1.139035000000000020e+00 -3.943750381469726562e+01 -1.139040000000000052e+00 -3.950000000000000000e+01 -1.139045000000000085e+00 -3.943750381469726562e+01 -1.139050000000000118e+00 -3.946875000000000000e+01 -1.139055000000000151e+00 -3.943750381469726562e+01 -1.139060000000000183e+00 -3.943750381469726562e+01 -1.139064999999999994e+00 -3.940625000000000000e+01 -1.139070000000000027e+00 -3.946875000000000000e+01 -1.139075000000000060e+00 -3.950000000000000000e+01 -1.139080000000000092e+00 -3.946875000000000000e+01 -1.139085000000000125e+00 -3.946875000000000000e+01 -1.139090000000000158e+00 -3.946875000000000000e+01 -1.139095000000000191e+00 -3.950000000000000000e+01 -1.139100000000000001e+00 -3.950000000000000000e+01 -1.139105000000000034e+00 -3.943750381469726562e+01 -1.139110000000000067e+00 -3.950000000000000000e+01 -1.139115000000000100e+00 -3.943750381469726562e+01 -1.139120000000000132e+00 -3.943750381469726562e+01 -1.139125000000000165e+00 -3.950000000000000000e+01 -1.139130000000000198e+00 -3.940625000000000000e+01 -1.139135000000000009e+00 -3.943750381469726562e+01 -1.139140000000000041e+00 -3.940625000000000000e+01 -1.139145000000000074e+00 -3.943750381469726562e+01 -1.139150000000000107e+00 -3.946875000000000000e+01 -1.139155000000000140e+00 -3.940625000000000000e+01 -1.139160000000000172e+00 -3.943750381469726562e+01 -1.139164999999999983e+00 -3.937500000000000000e+01 -1.139170000000000016e+00 -3.937500000000000000e+01 -1.139175000000000049e+00 -3.937500000000000000e+01 -1.139180000000000081e+00 -3.943750381469726562e+01 -1.139185000000000114e+00 -3.934375381469726562e+01 -1.139190000000000147e+00 -3.937500000000000000e+01 -1.139195000000000180e+00 -3.943750381469726562e+01 -1.139199999999999990e+00 -3.937500000000000000e+01 -1.139205000000000023e+00 -3.943750381469726562e+01 -1.139210000000000056e+00 -3.937500000000000000e+01 -1.139215000000000089e+00 -3.940625000000000000e+01 -1.139220000000000121e+00 -3.943750381469726562e+01 -1.139225000000000154e+00 -3.940625000000000000e+01 -1.139230000000000187e+00 -3.943750381469726562e+01 -1.139234999999999998e+00 -3.940625000000000000e+01 -1.139240000000000030e+00 -3.940625000000000000e+01 -1.139245000000000063e+00 -3.937500000000000000e+01 -1.139250000000000096e+00 -3.940625000000000000e+01 -1.139255000000000129e+00 -3.937500000000000000e+01 -1.139260000000000161e+00 -3.950000000000000000e+01 -1.139265000000000194e+00 -3.940625000000000000e+01 -1.139270000000000005e+00 -3.937500000000000000e+01 -1.139275000000000038e+00 -3.937500000000000000e+01 -1.139280000000000070e+00 -3.937500000000000000e+01 -1.139285000000000103e+00 -3.940625000000000000e+01 -1.139290000000000136e+00 -3.937500000000000000e+01 -1.139295000000000169e+00 -3.937500000000000000e+01 -1.139300000000000201e+00 -3.940625000000000000e+01 -1.139305000000000012e+00 -3.934375381469726562e+01 -1.139310000000000045e+00 -3.940625000000000000e+01 -1.139315000000000078e+00 -3.937500000000000000e+01 -1.139320000000000110e+00 -3.940625000000000000e+01 -1.139325000000000143e+00 -3.937500000000000000e+01 -1.139330000000000176e+00 -3.934375381469726562e+01 -1.139334999999999987e+00 -3.934375381469726562e+01 -1.139340000000000019e+00 -3.934375381469726562e+01 -1.139345000000000052e+00 -3.931250000000000000e+01 -1.139350000000000085e+00 -3.934375381469726562e+01 -1.139355000000000118e+00 -3.934375381469726562e+01 -1.139360000000000150e+00 -3.934375381469726562e+01 -1.139365000000000183e+00 -3.937500000000000000e+01 -1.139369999999999994e+00 -3.931250000000000000e+01 -1.139375000000000027e+00 -3.934375381469726562e+01 -1.139380000000000059e+00 -3.934375381469726562e+01 -1.139385000000000092e+00 -3.934375381469726562e+01 -1.139390000000000125e+00 -3.934375381469726562e+01 -1.139395000000000158e+00 -3.934375381469726562e+01 -1.139400000000000190e+00 -3.937500000000000000e+01 -1.139405000000000001e+00 -3.928125000000000000e+01 -1.139410000000000034e+00 -3.937500000000000000e+01 -1.139415000000000067e+00 -3.931250000000000000e+01 -1.139420000000000099e+00 -3.937500000000000000e+01 -1.139425000000000132e+00 -3.937500000000000000e+01 -1.139430000000000165e+00 -3.937500000000000000e+01 -1.139435000000000198e+00 -3.934375381469726562e+01 -1.139440000000000008e+00 -3.931250000000000000e+01 -1.139445000000000041e+00 -3.928125000000000000e+01 -1.139450000000000074e+00 -3.928125000000000000e+01 -1.139455000000000107e+00 -3.931250000000000000e+01 -1.139460000000000139e+00 -3.928125000000000000e+01 -1.139465000000000172e+00 -3.928125000000000000e+01 -1.139469999999999983e+00 -3.937500000000000000e+01 -1.139475000000000016e+00 -3.934375381469726562e+01 -1.139480000000000048e+00 -3.937500000000000000e+01 -1.139485000000000081e+00 -3.931250000000000000e+01 -1.139490000000000114e+00 -3.934375381469726562e+01 -1.139495000000000147e+00 -3.931250000000000000e+01 -1.139500000000000179e+00 -3.928125000000000000e+01 -1.139504999999999990e+00 -3.934375381469726562e+01 -1.139510000000000023e+00 -3.937500000000000000e+01 -1.139515000000000056e+00 -3.931250000000000000e+01 -1.139520000000000088e+00 -3.934375381469726562e+01 -1.139525000000000121e+00 -3.931250000000000000e+01 -1.139530000000000154e+00 -3.934375381469726562e+01 -1.139535000000000187e+00 -3.934375381469726562e+01 -1.139539999999999997e+00 -3.931250000000000000e+01 -1.139545000000000030e+00 -3.934375381469726562e+01 -1.139550000000000063e+00 -3.937500000000000000e+01 -1.139555000000000096e+00 -3.928125000000000000e+01 -1.139560000000000128e+00 -3.934375381469726562e+01 -1.139565000000000161e+00 -3.934375381469726562e+01 -1.139570000000000194e+00 -3.934375381469726562e+01 -1.139575000000000005e+00 -3.934375381469726562e+01 -1.139580000000000037e+00 -3.934375381469726562e+01 -1.139585000000000070e+00 -3.934375381469726562e+01 -1.139590000000000103e+00 -3.931250000000000000e+01 -1.139595000000000136e+00 -3.934375381469726562e+01 -1.139600000000000168e+00 -3.928125000000000000e+01 -1.139605000000000201e+00 -3.937500000000000000e+01 -1.139610000000000012e+00 -3.934375381469726562e+01 -1.139615000000000045e+00 -3.934375381469726562e+01 -1.139620000000000077e+00 -3.934375381469726562e+01 -1.139625000000000110e+00 -3.931250000000000000e+01 -1.139630000000000143e+00 -3.931250000000000000e+01 -1.139635000000000176e+00 -3.940625000000000000e+01 -1.139639999999999986e+00 -3.931250000000000000e+01 -1.139645000000000019e+00 -3.931250000000000000e+01 -1.139650000000000052e+00 -3.934375381469726562e+01 -1.139655000000000085e+00 -3.934375381469726562e+01 -1.139660000000000117e+00 -3.934375381469726562e+01 -1.139665000000000150e+00 -3.934375381469726562e+01 -1.139670000000000183e+00 -3.934375381469726562e+01 -1.139674999999999994e+00 -3.934375381469726562e+01 -1.139680000000000026e+00 -3.934375381469726562e+01 -1.139685000000000059e+00 -3.934375381469726562e+01 -1.139690000000000092e+00 -3.934375381469726562e+01 -1.139695000000000125e+00 -3.934375381469726562e+01 -1.139700000000000157e+00 -3.937500000000000000e+01 -1.139705000000000190e+00 -3.934375381469726562e+01 -1.139710000000000001e+00 -3.931250000000000000e+01 -1.139715000000000034e+00 -3.931250000000000000e+01 -1.139720000000000066e+00 -3.931250000000000000e+01 -1.139725000000000099e+00 -3.934375381469726562e+01 -1.139730000000000132e+00 -3.934375381469726562e+01 -1.139735000000000165e+00 -3.934375381469726562e+01 -1.139740000000000197e+00 -3.931250000000000000e+01 -1.139745000000000008e+00 -3.931250000000000000e+01 -1.139750000000000041e+00 -3.931250000000000000e+01 -1.139755000000000074e+00 -3.940625000000000000e+01 -1.139760000000000106e+00 -3.934375381469726562e+01 -1.139765000000000139e+00 -3.928125000000000000e+01 -1.139770000000000172e+00 -3.928125000000000000e+01 -1.139774999999999983e+00 -3.925000000000000000e+01 -1.139780000000000015e+00 -3.931250000000000000e+01 -1.139785000000000048e+00 -3.931250000000000000e+01 -1.139790000000000081e+00 -3.937500000000000000e+01 -1.139795000000000114e+00 -3.931250000000000000e+01 -1.139800000000000146e+00 -3.934375381469726562e+01 -1.139805000000000179e+00 -3.928125000000000000e+01 -1.139809999999999990e+00 -3.934375381469726562e+01 -1.139815000000000023e+00 -3.931250000000000000e+01 -1.139820000000000055e+00 -3.934375381469726562e+01 -1.139825000000000088e+00 -3.934375381469726562e+01 -1.139830000000000121e+00 -3.928125000000000000e+01 -1.139835000000000154e+00 -3.937500000000000000e+01 -1.139840000000000186e+00 -3.931250000000000000e+01 -1.139844999999999997e+00 -3.928125000000000000e+01 -1.139850000000000030e+00 -3.934375381469726562e+01 -1.139855000000000063e+00 -3.934375381469726562e+01 -1.139860000000000095e+00 -3.937500000000000000e+01 -1.139865000000000128e+00 -3.931250000000000000e+01 -1.139870000000000161e+00 -3.940625000000000000e+01 -1.139875000000000194e+00 -3.931250000000000000e+01 -1.139880000000000004e+00 -3.928125000000000000e+01 -1.139885000000000037e+00 -3.928125000000000000e+01 -1.139890000000000070e+00 -3.931250000000000000e+01 -1.139895000000000103e+00 -3.931250000000000000e+01 -1.139900000000000135e+00 -3.934375381469726562e+01 -1.139905000000000168e+00 -3.937500000000000000e+01 -1.139910000000000201e+00 -3.928125000000000000e+01 -1.139915000000000012e+00 -3.934375381469726562e+01 -1.139920000000000044e+00 -3.937500000000000000e+01 -1.139925000000000077e+00 -3.931250000000000000e+01 -1.139930000000000110e+00 -3.931250000000000000e+01 -1.139935000000000143e+00 -3.928125000000000000e+01 -1.139940000000000175e+00 -3.937500000000000000e+01 -1.139944999999999986e+00 -3.934375381469726562e+01 -1.139950000000000019e+00 -3.931250000000000000e+01 -1.139955000000000052e+00 -3.937500000000000000e+01 -1.139960000000000084e+00 -3.937500000000000000e+01 -1.139965000000000117e+00 -3.934375381469726562e+01 -1.139970000000000150e+00 -3.925000000000000000e+01 -1.139975000000000183e+00 -3.934375381469726562e+01 -1.139979999999999993e+00 -3.931250000000000000e+01 -1.139985000000000026e+00 -3.931250000000000000e+01 -1.139990000000000059e+00 -3.931250000000000000e+01 -1.139995000000000092e+00 -3.931250000000000000e+01 diff --git a/allensdk/test/ephys/data/spike_test_pair.txt b/allensdk/test/ephys/data/spike_test_pair.txt deleted file mode 100644 index c39c88e6af..0000000000 --- a/allensdk/test/ephys/data/spike_test_pair.txt +++ /dev/null @@ -1,4000 +0,0 @@ -1.030000000000000027e+00 -4.737500000000000000e+01 -1.030005000000000059e+00 -4.737500000000000000e+01 -1.030010000000000092e+00 -4.740625381469726562e+01 -1.030015000000000125e+00 -4.737500000000000000e+01 -1.030020000000000158e+00 -4.740625381469726562e+01 -1.030025000000000190e+00 -4.737500000000000000e+01 -1.030030000000000001e+00 -4.731250000000000000e+01 -1.030035000000000034e+00 -4.740625381469726562e+01 -1.030040000000000067e+00 -4.728125381469726562e+01 -1.030045000000000099e+00 -4.734375381469726562e+01 -1.030050000000000132e+00 -4.728125381469726562e+01 -1.030055000000000165e+00 -4.737500000000000000e+01 -1.030059999999999976e+00 -4.728125381469726562e+01 -1.030065000000000008e+00 -4.731250000000000000e+01 -1.030070000000000041e+00 -4.734375381469726562e+01 -1.030075000000000074e+00 -4.721875000000000000e+01 -1.030080000000000107e+00 -4.731250000000000000e+01 -1.030085000000000139e+00 -4.731250000000000000e+01 -1.030090000000000172e+00 -4.728125381469726562e+01 -1.030094999999999983e+00 -4.721875000000000000e+01 -1.030100000000000016e+00 -4.718750381469726562e+01 -1.030105000000000048e+00 -4.721875000000000000e+01 -1.030110000000000081e+00 -4.721875000000000000e+01 -1.030115000000000114e+00 -4.728125381469726562e+01 -1.030120000000000147e+00 -4.728125381469726562e+01 -1.030125000000000179e+00 -4.721875000000000000e+01 -1.030129999999999990e+00 -4.718750381469726562e+01 -1.030135000000000023e+00 -4.715625381469726562e+01 -1.030140000000000056e+00 -4.718750381469726562e+01 -1.030145000000000088e+00 -4.721875000000000000e+01 -1.030150000000000121e+00 -4.718750381469726562e+01 -1.030155000000000154e+00 -4.715625381469726562e+01 -1.030160000000000187e+00 -4.715625381469726562e+01 -1.030164999999999997e+00 -4.712500000000000000e+01 -1.030170000000000030e+00 -4.712500000000000000e+01 -1.030175000000000063e+00 -4.712500000000000000e+01 -1.030180000000000096e+00 -4.715625381469726562e+01 -1.030185000000000128e+00 -4.709375381469726562e+01 -1.030190000000000161e+00 -4.709375381469726562e+01 -1.030195000000000194e+00 -4.712500000000000000e+01 -1.030200000000000005e+00 -4.715625381469726562e+01 -1.030205000000000037e+00 -4.703125381469726562e+01 -1.030210000000000070e+00 -4.709375381469726562e+01 -1.030215000000000103e+00 -4.706250000000000000e+01 -1.030220000000000136e+00 -4.712500000000000000e+01 -1.030225000000000168e+00 -4.709375381469726562e+01 -1.030229999999999979e+00 -4.700000381469726562e+01 -1.030235000000000012e+00 -4.706250000000000000e+01 -1.030240000000000045e+00 -4.700000381469726562e+01 -1.030245000000000077e+00 -4.703125381469726562e+01 -1.030250000000000110e+00 -4.706250000000000000e+01 -1.030255000000000143e+00 -4.700000381469726562e+01 -1.030260000000000176e+00 -4.703125381469726562e+01 -1.030264999999999986e+00 -4.703125381469726562e+01 -1.030270000000000019e+00 -4.700000381469726562e+01 -1.030275000000000052e+00 -4.700000381469726562e+01 -1.030280000000000085e+00 -4.700000381469726562e+01 -1.030285000000000117e+00 -4.703125381469726562e+01 -1.030290000000000150e+00 -4.696875000000000000e+01 -1.030295000000000183e+00 -4.696875000000000000e+01 -1.030299999999999994e+00 -4.693750381469726562e+01 -1.030305000000000026e+00 -4.693750381469726562e+01 -1.030310000000000059e+00 -4.696875000000000000e+01 -1.030315000000000092e+00 -4.696875000000000000e+01 -1.030320000000000125e+00 -4.690625000000000000e+01 -1.030325000000000157e+00 -4.693750381469726562e+01 -1.030330000000000190e+00 -4.684375381469726562e+01 -1.030335000000000001e+00 -4.687500381469726562e+01 -1.030340000000000034e+00 -4.693750381469726562e+01 -1.030345000000000066e+00 -4.693750381469726562e+01 -1.030350000000000099e+00 -4.681250000000000000e+01 -1.030355000000000132e+00 -4.687500381469726562e+01 -1.030360000000000165e+00 -4.690625000000000000e+01 -1.030364999999999975e+00 -4.690625000000000000e+01 -1.030370000000000008e+00 -4.687500381469726562e+01 -1.030375000000000041e+00 -4.684375381469726562e+01 -1.030380000000000074e+00 -4.681250000000000000e+01 -1.030385000000000106e+00 -4.684375381469726562e+01 -1.030390000000000139e+00 -4.678125381469726562e+01 -1.030395000000000172e+00 -4.687500381469726562e+01 -1.030399999999999983e+00 -4.693750381469726562e+01 -1.030405000000000015e+00 -4.678125381469726562e+01 -1.030410000000000048e+00 -4.681250000000000000e+01 -1.030415000000000081e+00 -4.684375381469726562e+01 -1.030420000000000114e+00 -4.678125381469726562e+01 -1.030425000000000146e+00 -4.684375381469726562e+01 -1.030430000000000179e+00 -4.671875381469726562e+01 -1.030434999999999990e+00 -4.675000000000000000e+01 -1.030440000000000023e+00 -4.681250000000000000e+01 -1.030445000000000055e+00 -4.671875381469726562e+01 -1.030450000000000088e+00 -4.675000000000000000e+01 -1.030455000000000121e+00 -4.675000000000000000e+01 -1.030460000000000154e+00 -4.668750381469726562e+01 -1.030465000000000186e+00 -4.675000000000000000e+01 -1.030469999999999997e+00 -4.671875381469726562e+01 -1.030475000000000030e+00 -4.678125381469726562e+01 -1.030480000000000063e+00 -4.665625000000000000e+01 -1.030485000000000095e+00 -4.668750381469726562e+01 -1.030490000000000128e+00 -4.678125381469726562e+01 -1.030495000000000161e+00 -4.671875381469726562e+01 -1.030500000000000194e+00 -4.671875381469726562e+01 -1.030505000000000004e+00 -4.681250000000000000e+01 -1.030510000000000037e+00 -4.668750381469726562e+01 -1.030515000000000070e+00 -4.675000000000000000e+01 -1.030520000000000103e+00 -4.662500381469726562e+01 -1.030525000000000135e+00 -4.668750381469726562e+01 -1.030530000000000168e+00 -4.662500381469726562e+01 -1.030534999999999979e+00 -4.662500381469726562e+01 -1.030540000000000012e+00 -4.665625000000000000e+01 -1.030545000000000044e+00 -4.668750381469726562e+01 -1.030550000000000077e+00 -4.659375000000000000e+01 -1.030555000000000110e+00 -4.662500381469726562e+01 -1.030560000000000143e+00 -4.665625000000000000e+01 -1.030565000000000175e+00 -4.659375000000000000e+01 -1.030569999999999986e+00 -4.662500381469726562e+01 -1.030575000000000019e+00 -4.671875381469726562e+01 -1.030580000000000052e+00 -4.656250381469726562e+01 -1.030585000000000084e+00 -4.665625000000000000e+01 -1.030590000000000117e+00 -4.665625000000000000e+01 -1.030595000000000150e+00 -4.656250381469726562e+01 -1.030600000000000183e+00 -4.659375000000000000e+01 -1.030604999999999993e+00 -4.659375000000000000e+01 -1.030610000000000026e+00 -4.656250381469726562e+01 -1.030615000000000059e+00 -4.659375000000000000e+01 -1.030620000000000092e+00 -4.662500381469726562e+01 -1.030625000000000124e+00 -4.662500381469726562e+01 -1.030630000000000157e+00 -4.659375000000000000e+01 -1.030635000000000190e+00 -4.653125381469726562e+01 -1.030640000000000001e+00 -4.665625000000000000e+01 -1.030645000000000033e+00 -4.656250381469726562e+01 -1.030650000000000066e+00 -4.653125381469726562e+01 -1.030655000000000099e+00 -4.650000000000000000e+01 -1.030660000000000132e+00 -4.653125381469726562e+01 -1.030665000000000164e+00 -4.653125381469726562e+01 -1.030669999999999975e+00 -4.656250381469726562e+01 -1.030675000000000008e+00 -4.653125381469726562e+01 -1.030680000000000041e+00 -4.653125381469726562e+01 -1.030685000000000073e+00 -4.653125381469726562e+01 -1.030690000000000106e+00 -4.656250381469726562e+01 -1.030695000000000139e+00 -4.650000000000000000e+01 -1.030700000000000172e+00 -4.650000000000000000e+01 -1.030704999999999982e+00 -4.650000000000000000e+01 -1.030710000000000015e+00 -4.653125381469726562e+01 -1.030715000000000048e+00 -4.646875381469726562e+01 -1.030720000000000081e+00 -4.646875381469726562e+01 -1.030725000000000113e+00 -4.650000000000000000e+01 -1.030730000000000146e+00 -4.646875381469726562e+01 -1.030735000000000179e+00 -4.643750000000000000e+01 -1.030739999999999990e+00 -4.646875381469726562e+01 -1.030745000000000022e+00 -4.643750000000000000e+01 -1.030750000000000055e+00 -4.640625000000000000e+01 -1.030755000000000088e+00 -4.643750000000000000e+01 -1.030760000000000121e+00 -4.646875381469726562e+01 -1.030765000000000153e+00 -4.640625000000000000e+01 -1.030770000000000186e+00 -4.634375000000000000e+01 -1.030774999999999997e+00 -4.646875381469726562e+01 -1.030780000000000030e+00 -4.640625000000000000e+01 -1.030785000000000062e+00 -4.646875381469726562e+01 -1.030790000000000095e+00 -4.643750000000000000e+01 -1.030795000000000128e+00 -4.643750000000000000e+01 -1.030800000000000161e+00 -4.643750000000000000e+01 -1.030805000000000193e+00 -4.634375000000000000e+01 -1.030810000000000004e+00 -4.637500381469726562e+01 -1.030815000000000037e+00 -4.634375000000000000e+01 -1.030820000000000070e+00 -4.634375000000000000e+01 -1.030825000000000102e+00 -4.634375000000000000e+01 -1.030830000000000135e+00 -4.634375000000000000e+01 -1.030835000000000168e+00 -4.637500381469726562e+01 -1.030839999999999979e+00 -4.637500381469726562e+01 -1.030845000000000011e+00 -4.631250381469726562e+01 -1.030850000000000044e+00 -4.631250381469726562e+01 -1.030855000000000077e+00 -4.628125381469726562e+01 -1.030860000000000110e+00 -4.628125381469726562e+01 -1.030865000000000142e+00 -4.631250381469726562e+01 -1.030870000000000175e+00 -4.634375000000000000e+01 -1.030874999999999986e+00 -4.628125381469726562e+01 -1.030880000000000019e+00 -4.628125381469726562e+01 -1.030885000000000051e+00 -4.625000000000000000e+01 -1.030890000000000084e+00 -4.625000000000000000e+01 -1.030895000000000117e+00 -4.621875381469726562e+01 -1.030900000000000150e+00 -4.628125381469726562e+01 -1.030905000000000182e+00 -4.621875381469726562e+01 -1.030909999999999993e+00 -4.621875381469726562e+01 -1.030915000000000026e+00 -4.625000000000000000e+01 -1.030920000000000059e+00 -4.618750000000000000e+01 -1.030925000000000091e+00 -4.618750000000000000e+01 -1.030930000000000124e+00 -4.615625381469726562e+01 -1.030935000000000157e+00 -4.625000000000000000e+01 -1.030940000000000190e+00 -4.615625381469726562e+01 -1.030945000000000000e+00 -4.618750000000000000e+01 -1.030950000000000033e+00 -4.615625381469726562e+01 -1.030955000000000066e+00 -4.609375000000000000e+01 -1.030960000000000099e+00 -4.612500381469726562e+01 -1.030965000000000131e+00 -4.609375000000000000e+01 -1.030970000000000164e+00 -4.621875381469726562e+01 -1.030974999999999975e+00 -4.609375000000000000e+01 -1.030980000000000008e+00 -4.615625381469726562e+01 -1.030985000000000040e+00 -4.609375000000000000e+01 -1.030990000000000073e+00 -4.615625381469726562e+01 -1.030995000000000106e+00 -4.606250381469726562e+01 -1.031000000000000139e+00 -4.603125000000000000e+01 -1.031005000000000171e+00 -4.609375000000000000e+01 -1.031009999999999982e+00 -4.606250381469726562e+01 -1.031015000000000015e+00 -4.606250381469726562e+01 -1.031020000000000048e+00 -4.606250381469726562e+01 -1.031025000000000080e+00 -4.609375000000000000e+01 -1.031030000000000113e+00 -4.606250381469726562e+01 -1.031035000000000146e+00 -4.600000381469726562e+01 -1.031040000000000179e+00 -4.603125000000000000e+01 -1.031044999999999989e+00 -4.606250381469726562e+01 -1.031050000000000022e+00 -4.603125000000000000e+01 -1.031055000000000055e+00 -4.606250381469726562e+01 -1.031060000000000088e+00 -4.603125000000000000e+01 -1.031065000000000120e+00 -4.603125000000000000e+01 -1.031070000000000153e+00 -4.603125000000000000e+01 -1.031075000000000186e+00 -4.603125000000000000e+01 -1.031079999999999997e+00 -4.596875381469726562e+01 -1.031085000000000029e+00 -4.603125000000000000e+01 -1.031090000000000062e+00 -4.596875381469726562e+01 -1.031095000000000095e+00 -4.593750000000000000e+01 -1.031100000000000128e+00 -4.596875381469726562e+01 -1.031105000000000160e+00 -4.600000381469726562e+01 -1.031110000000000193e+00 -4.596875381469726562e+01 -1.031115000000000004e+00 -4.596875381469726562e+01 -1.031120000000000037e+00 -4.596875381469726562e+01 -1.031125000000000069e+00 -4.593750000000000000e+01 -1.031130000000000102e+00 -4.593750000000000000e+01 -1.031135000000000135e+00 -4.596875381469726562e+01 -1.031140000000000168e+00 -4.600000381469726562e+01 -1.031144999999999978e+00 -4.593750000000000000e+01 -1.031150000000000011e+00 -4.593750000000000000e+01 -1.031155000000000044e+00 -4.590625381469726562e+01 -1.031160000000000077e+00 -4.593750000000000000e+01 -1.031165000000000109e+00 -4.593750000000000000e+01 -1.031170000000000142e+00 -4.593750000000000000e+01 -1.031175000000000175e+00 -4.590625381469726562e+01 -1.031179999999999986e+00 -4.590625381469726562e+01 -1.031185000000000018e+00 -4.590625381469726562e+01 -1.031190000000000051e+00 -4.590625381469726562e+01 -1.031195000000000084e+00 -4.584375381469726562e+01 -1.031200000000000117e+00 -4.581250381469726562e+01 -1.031205000000000149e+00 -4.584375381469726562e+01 -1.031210000000000182e+00 -4.587500000000000000e+01 -1.031214999999999993e+00 -4.584375381469726562e+01 -1.031220000000000026e+00 -4.584375381469726562e+01 -1.031225000000000058e+00 -4.584375381469726562e+01 -1.031230000000000091e+00 -4.584375381469726562e+01 -1.031235000000000124e+00 -4.584375381469726562e+01 -1.031240000000000157e+00 -4.578125000000000000e+01 -1.031245000000000189e+00 -4.571875000000000000e+01 -1.031250000000000000e+00 -4.578125000000000000e+01 -1.031255000000000033e+00 -4.581250381469726562e+01 -1.031260000000000066e+00 -4.587500000000000000e+01 -1.031265000000000098e+00 -4.578125000000000000e+01 -1.031270000000000131e+00 -4.578125000000000000e+01 -1.031275000000000164e+00 -4.581250381469726562e+01 -1.031279999999999974e+00 -4.571875000000000000e+01 -1.031285000000000007e+00 -4.581250381469726562e+01 -1.031290000000000040e+00 -4.568750000000000000e+01 -1.031295000000000073e+00 -4.571875000000000000e+01 -1.031300000000000106e+00 -4.571875000000000000e+01 -1.031305000000000138e+00 -4.565625381469726562e+01 -1.031310000000000171e+00 -4.568750000000000000e+01 -1.031314999999999982e+00 -4.565625381469726562e+01 -1.031320000000000014e+00 -4.565625381469726562e+01 -1.031325000000000047e+00 -4.568750000000000000e+01 -1.031330000000000080e+00 -4.562500000000000000e+01 -1.031335000000000113e+00 -4.562500000000000000e+01 -1.031340000000000146e+00 -4.559375381469726562e+01 -1.031345000000000178e+00 -4.568750000000000000e+01 -1.031349999999999989e+00 -4.559375381469726562e+01 -1.031355000000000022e+00 -4.559375381469726562e+01 -1.031360000000000054e+00 -4.559375381469726562e+01 -1.031365000000000087e+00 -4.556250381469726562e+01 -1.031370000000000120e+00 -4.562500000000000000e+01 -1.031375000000000153e+00 -4.559375381469726562e+01 -1.031380000000000186e+00 -4.553125000000000000e+01 -1.031384999999999996e+00 -4.553125000000000000e+01 -1.031390000000000029e+00 -4.556250381469726562e+01 -1.031395000000000062e+00 -4.553125000000000000e+01 -1.031400000000000095e+00 -4.550000381469726562e+01 -1.031405000000000127e+00 -4.550000381469726562e+01 -1.031410000000000160e+00 -4.546875000000000000e+01 -1.031415000000000193e+00 -4.550000381469726562e+01 -1.031420000000000003e+00 -4.546875000000000000e+01 -1.031425000000000036e+00 -4.546875000000000000e+01 -1.031430000000000069e+00 -4.546875000000000000e+01 -1.031435000000000102e+00 -4.546875000000000000e+01 -1.031440000000000135e+00 -4.546875000000000000e+01 -1.031445000000000167e+00 -4.546875000000000000e+01 -1.031449999999999978e+00 -4.546875000000000000e+01 -1.031455000000000011e+00 -4.550000381469726562e+01 -1.031460000000000043e+00 -4.543750381469726562e+01 -1.031465000000000076e+00 -4.543750381469726562e+01 -1.031470000000000109e+00 -4.543750381469726562e+01 -1.031475000000000142e+00 -4.540625381469726562e+01 -1.031480000000000175e+00 -4.540625381469726562e+01 -1.031484999999999985e+00 -4.534375381469726562e+01 -1.031490000000000018e+00 -4.537500000000000000e+01 -1.031495000000000051e+00 -4.534375381469726562e+01 -1.031500000000000083e+00 -4.531250000000000000e+01 -1.031505000000000116e+00 -4.534375381469726562e+01 -1.031510000000000149e+00 -4.531250000000000000e+01 -1.031515000000000182e+00 -4.531250000000000000e+01 -1.031519999999999992e+00 -4.531250000000000000e+01 -1.031525000000000025e+00 -4.534375381469726562e+01 -1.031530000000000058e+00 -4.528125381469726562e+01 -1.031535000000000091e+00 -4.528125381469726562e+01 -1.031540000000000123e+00 -4.525000381469726562e+01 -1.031545000000000156e+00 -4.518750381469726562e+01 -1.031550000000000189e+00 -4.525000381469726562e+01 -1.031555000000000000e+00 -4.515625000000000000e+01 -1.031560000000000032e+00 -4.515625000000000000e+01 -1.031565000000000065e+00 -4.521875000000000000e+01 -1.031570000000000098e+00 -4.515625000000000000e+01 -1.031575000000000131e+00 -4.515625000000000000e+01 -1.031580000000000163e+00 -4.521875000000000000e+01 -1.031584999999999974e+00 -4.525000381469726562e+01 -1.031590000000000007e+00 -4.512500381469726562e+01 -1.031595000000000040e+00 -4.525000381469726562e+01 -1.031600000000000072e+00 -4.518750381469726562e+01 -1.031605000000000105e+00 -4.521875000000000000e+01 -1.031610000000000138e+00 -4.512500381469726562e+01 -1.031615000000000171e+00 -4.515625000000000000e+01 -1.031619999999999981e+00 -4.518750381469726562e+01 -1.031625000000000014e+00 -4.515625000000000000e+01 -1.031630000000000047e+00 -4.512500381469726562e+01 -1.031635000000000080e+00 -4.515625000000000000e+01 -1.031640000000000112e+00 -4.515625000000000000e+01 -1.031645000000000145e+00 -4.512500381469726562e+01 -1.031650000000000178e+00 -4.509375381469726562e+01 -1.031654999999999989e+00 -4.512500381469726562e+01 -1.031660000000000021e+00 -4.512500381469726562e+01 -1.031665000000000054e+00 -4.500000000000000000e+01 -1.031670000000000087e+00 -4.512500381469726562e+01 -1.031675000000000120e+00 -4.506250000000000000e+01 -1.031680000000000152e+00 -4.509375381469726562e+01 -1.031685000000000185e+00 -4.506250000000000000e+01 -1.031689999999999996e+00 -4.506250000000000000e+01 -1.031695000000000029e+00 -4.503125381469726562e+01 -1.031700000000000061e+00 -4.500000000000000000e+01 -1.031705000000000094e+00 -4.496875000000000000e+01 -1.031710000000000127e+00 -4.496875000000000000e+01 -1.031715000000000160e+00 -4.500000000000000000e+01 -1.031720000000000192e+00 -4.490625000000000000e+01 -1.031725000000000003e+00 -4.496875000000000000e+01 -1.031730000000000036e+00 -4.487500381469726562e+01 -1.031735000000000069e+00 -4.496875000000000000e+01 -1.031740000000000101e+00 -4.493750381469726562e+01 -1.031745000000000134e+00 -4.493750381469726562e+01 -1.031750000000000167e+00 -4.490625000000000000e+01 -1.031754999999999978e+00 -4.496875000000000000e+01 -1.031760000000000010e+00 -4.490625000000000000e+01 -1.031765000000000043e+00 -4.487500381469726562e+01 -1.031770000000000076e+00 -4.487500381469726562e+01 -1.031775000000000109e+00 -4.490625000000000000e+01 -1.031780000000000141e+00 -4.484375381469726562e+01 -1.031785000000000174e+00 -4.481250000000000000e+01 -1.031789999999999985e+00 -4.481250000000000000e+01 -1.031795000000000018e+00 -4.481250000000000000e+01 -1.031800000000000050e+00 -4.481250000000000000e+01 -1.031805000000000083e+00 -4.478125381469726562e+01 -1.031810000000000116e+00 -4.481250000000000000e+01 -1.031815000000000149e+00 -4.478125381469726562e+01 -1.031820000000000181e+00 -4.478125381469726562e+01 -1.031824999999999992e+00 -4.481250000000000000e+01 -1.031830000000000025e+00 -4.481250000000000000e+01 -1.031835000000000058e+00 -4.478125381469726562e+01 -1.031840000000000090e+00 -4.481250000000000000e+01 -1.031845000000000123e+00 -4.478125381469726562e+01 -1.031850000000000156e+00 -4.471875381469726562e+01 -1.031855000000000189e+00 -4.471875381469726562e+01 -1.031859999999999999e+00 -4.465625000000000000e+01 -1.031865000000000032e+00 -4.471875381469726562e+01 -1.031870000000000065e+00 -4.468750381469726562e+01 -1.031875000000000098e+00 -4.468750381469726562e+01 -1.031880000000000130e+00 -4.471875381469726562e+01 -1.031885000000000163e+00 -4.465625000000000000e+01 -1.031889999999999974e+00 -4.468750381469726562e+01 -1.031895000000000007e+00 -4.468750381469726562e+01 -1.031900000000000039e+00 -4.462500381469726562e+01 -1.031905000000000072e+00 -4.465625000000000000e+01 -1.031910000000000105e+00 -4.465625000000000000e+01 -1.031915000000000138e+00 -4.462500381469726562e+01 -1.031920000000000170e+00 -4.462500381469726562e+01 -1.031924999999999981e+00 -4.465625000000000000e+01 -1.031930000000000014e+00 -4.459375000000000000e+01 -1.031935000000000047e+00 -4.456250381469726562e+01 -1.031940000000000079e+00 -4.459375000000000000e+01 -1.031945000000000112e+00 -4.465625000000000000e+01 -1.031950000000000145e+00 -4.456250381469726562e+01 -1.031955000000000178e+00 -4.462500381469726562e+01 -1.031959999999999988e+00 -4.459375000000000000e+01 -1.031965000000000021e+00 -4.459375000000000000e+01 -1.031970000000000054e+00 -4.453125381469726562e+01 -1.031975000000000087e+00 -4.462500381469726562e+01 -1.031980000000000119e+00 -4.456250381469726562e+01 -1.031985000000000152e+00 -4.453125381469726562e+01 -1.031990000000000185e+00 -4.453125381469726562e+01 -1.031994999999999996e+00 -4.453125381469726562e+01 -1.032000000000000028e+00 -4.453125381469726562e+01 -1.032005000000000061e+00 -4.450000000000000000e+01 -1.032010000000000094e+00 -4.456250381469726562e+01 -1.032015000000000127e+00 -4.450000000000000000e+01 -1.032020000000000159e+00 -4.450000000000000000e+01 -1.032025000000000192e+00 -4.450000000000000000e+01 -1.032030000000000003e+00 -4.446875381469726562e+01 -1.032035000000000036e+00 -4.443750000000000000e+01 -1.032040000000000068e+00 -4.446875381469726562e+01 -1.032045000000000101e+00 -4.450000000000000000e+01 -1.032050000000000134e+00 -4.443750000000000000e+01 -1.032055000000000167e+00 -4.443750000000000000e+01 -1.032059999999999977e+00 -4.440625381469726562e+01 -1.032065000000000010e+00 -4.446875381469726562e+01 -1.032070000000000043e+00 -4.437500381469726562e+01 -1.032075000000000076e+00 -4.437500381469726562e+01 -1.032080000000000108e+00 -4.434375000000000000e+01 -1.032085000000000141e+00 -4.437500381469726562e+01 -1.032090000000000174e+00 -4.431250381469726562e+01 -1.032094999999999985e+00 -4.431250381469726562e+01 -1.032100000000000017e+00 -4.428125000000000000e+01 -1.032105000000000050e+00 -4.428125000000000000e+01 -1.032110000000000083e+00 -4.428125000000000000e+01 -1.032115000000000116e+00 -4.428125000000000000e+01 -1.032120000000000148e+00 -4.431250381469726562e+01 -1.032125000000000181e+00 -4.425000000000000000e+01 -1.032129999999999992e+00 -4.425000000000000000e+01 -1.032135000000000025e+00 -4.418750000000000000e+01 -1.032140000000000057e+00 -4.428125000000000000e+01 -1.032145000000000090e+00 -4.418750000000000000e+01 -1.032150000000000123e+00 -4.415625381469726562e+01 -1.032155000000000156e+00 -4.415625381469726562e+01 -1.032160000000000188e+00 -4.421875381469726562e+01 -1.032164999999999999e+00 -4.415625381469726562e+01 -1.032170000000000032e+00 -4.421875381469726562e+01 -1.032175000000000065e+00 -4.412500000000000000e+01 -1.032180000000000097e+00 -4.415625381469726562e+01 -1.032185000000000130e+00 -4.412500000000000000e+01 -1.032190000000000163e+00 -4.409375000000000000e+01 -1.032194999999999974e+00 -4.412500000000000000e+01 -1.032200000000000006e+00 -4.409375000000000000e+01 -1.032205000000000039e+00 -4.406250381469726562e+01 -1.032210000000000072e+00 -4.415625381469726562e+01 -1.032215000000000105e+00 -4.415625381469726562e+01 -1.032220000000000137e+00 -4.406250381469726562e+01 -1.032225000000000170e+00 -4.409375000000000000e+01 -1.032229999999999981e+00 -4.406250381469726562e+01 -1.032235000000000014e+00 -4.403125000000000000e+01 -1.032240000000000046e+00 -4.403125000000000000e+01 -1.032245000000000079e+00 -4.406250381469726562e+01 -1.032250000000000112e+00 -4.396875381469726562e+01 -1.032255000000000145e+00 -4.403125000000000000e+01 -1.032260000000000177e+00 -4.403125000000000000e+01 -1.032264999999999988e+00 -4.400000381469726562e+01 -1.032270000000000021e+00 -4.396875381469726562e+01 -1.032275000000000054e+00 -4.400000381469726562e+01 -1.032280000000000086e+00 -4.403125000000000000e+01 -1.032285000000000119e+00 -4.393750000000000000e+01 -1.032290000000000152e+00 -4.396875381469726562e+01 -1.032295000000000185e+00 -4.396875381469726562e+01 -1.032299999999999995e+00 -4.390625381469726562e+01 -1.032305000000000028e+00 -4.396875381469726562e+01 -1.032310000000000061e+00 -4.393750000000000000e+01 -1.032315000000000094e+00 -4.384375381469726562e+01 -1.032320000000000126e+00 -4.390625381469726562e+01 -1.032325000000000159e+00 -4.381250381469726562e+01 -1.032330000000000192e+00 -4.393750000000000000e+01 -1.032335000000000003e+00 -4.390625381469726562e+01 -1.032340000000000035e+00 -4.396875381469726562e+01 -1.032345000000000068e+00 -4.390625381469726562e+01 -1.032350000000000101e+00 -4.387500000000000000e+01 -1.032355000000000134e+00 -4.390625381469726562e+01 -1.032360000000000166e+00 -4.384375381469726562e+01 -1.032364999999999977e+00 -4.387500000000000000e+01 -1.032370000000000010e+00 -4.387500000000000000e+01 -1.032375000000000043e+00 -4.387500000000000000e+01 -1.032380000000000075e+00 -4.375000381469726562e+01 -1.032385000000000108e+00 -4.381250381469726562e+01 -1.032390000000000141e+00 -4.378125000000000000e+01 -1.032395000000000174e+00 -4.381250381469726562e+01 -1.032399999999999984e+00 -4.378125000000000000e+01 -1.032405000000000017e+00 -4.381250381469726562e+01 -1.032410000000000050e+00 -4.378125000000000000e+01 -1.032415000000000083e+00 -4.378125000000000000e+01 -1.032420000000000115e+00 -4.371875000000000000e+01 -1.032425000000000148e+00 -4.375000381469726562e+01 -1.032430000000000181e+00 -4.378125000000000000e+01 -1.032434999999999992e+00 -4.371875000000000000e+01 -1.032440000000000024e+00 -4.375000381469726562e+01 -1.032445000000000057e+00 -4.375000381469726562e+01 -1.032450000000000090e+00 -4.371875000000000000e+01 -1.032455000000000123e+00 -4.375000381469726562e+01 -1.032460000000000155e+00 -4.368750381469726562e+01 -1.032465000000000188e+00 -4.371875000000000000e+01 -1.032469999999999999e+00 -4.375000381469726562e+01 -1.032475000000000032e+00 -4.368750381469726562e+01 -1.032480000000000064e+00 -4.371875000000000000e+01 -1.032485000000000097e+00 -4.368750381469726562e+01 -1.032490000000000130e+00 -4.365625381469726562e+01 -1.032495000000000163e+00 -4.368750381469726562e+01 -1.032500000000000195e+00 -4.362500000000000000e+01 -1.032505000000000006e+00 -4.362500000000000000e+01 -1.032510000000000039e+00 -4.365625381469726562e+01 -1.032515000000000072e+00 -4.362500000000000000e+01 -1.032520000000000104e+00 -4.362500000000000000e+01 -1.032525000000000137e+00 -4.359375381469726562e+01 -1.032530000000000170e+00 -4.362500000000000000e+01 -1.032534999999999981e+00 -4.362500000000000000e+01 -1.032540000000000013e+00 -4.359375381469726562e+01 -1.032545000000000046e+00 -4.362500000000000000e+01 -1.032550000000000079e+00 -4.356250000000000000e+01 -1.032555000000000112e+00 -4.362500000000000000e+01 -1.032560000000000144e+00 -4.353125000000000000e+01 -1.032565000000000177e+00 -4.359375381469726562e+01 -1.032569999999999988e+00 -4.356250000000000000e+01 -1.032575000000000021e+00 -4.359375381469726562e+01 -1.032580000000000053e+00 -4.365625381469726562e+01 -1.032585000000000086e+00 -4.359375381469726562e+01 -1.032590000000000119e+00 -4.362500000000000000e+01 -1.032595000000000152e+00 -4.353125000000000000e+01 -1.032600000000000184e+00 -4.353125000000000000e+01 -1.032604999999999995e+00 -4.356250000000000000e+01 -1.032610000000000028e+00 -4.353125000000000000e+01 -1.032615000000000061e+00 -4.356250000000000000e+01 -1.032620000000000093e+00 -4.356250000000000000e+01 -1.032625000000000126e+00 -4.353125000000000000e+01 -1.032630000000000159e+00 -4.356250000000000000e+01 -1.032635000000000192e+00 -4.356250000000000000e+01 -1.032640000000000002e+00 -4.353125000000000000e+01 -1.032645000000000035e+00 -4.359375381469726562e+01 -1.032650000000000068e+00 -4.353125000000000000e+01 -1.032655000000000101e+00 -4.350000381469726562e+01 -1.032660000000000133e+00 -4.353125000000000000e+01 -1.032665000000000166e+00 -4.353125000000000000e+01 -1.032669999999999977e+00 -4.353125000000000000e+01 -1.032675000000000010e+00 -4.353125000000000000e+01 -1.032680000000000042e+00 -4.346875000000000000e+01 -1.032685000000000075e+00 -4.350000381469726562e+01 -1.032690000000000108e+00 -4.346875000000000000e+01 -1.032695000000000141e+00 -4.343750381469726562e+01 -1.032700000000000173e+00 -4.350000381469726562e+01 -1.032704999999999984e+00 -4.343750381469726562e+01 -1.032710000000000017e+00 -4.350000381469726562e+01 -1.032715000000000050e+00 -4.350000381469726562e+01 -1.032720000000000082e+00 -4.350000381469726562e+01 -1.032725000000000115e+00 -4.346875000000000000e+01 -1.032730000000000148e+00 -4.343750381469726562e+01 -1.032735000000000181e+00 -4.346875000000000000e+01 -1.032739999999999991e+00 -4.340625000000000000e+01 -1.032745000000000024e+00 -4.337500000000000000e+01 -1.032750000000000057e+00 -4.343750381469726562e+01 -1.032755000000000090e+00 -4.337500000000000000e+01 -1.032760000000000122e+00 -4.343750381469726562e+01 -1.032765000000000155e+00 -4.340625000000000000e+01 -1.032770000000000188e+00 -4.337500000000000000e+01 -1.032774999999999999e+00 -4.340625000000000000e+01 -1.032780000000000031e+00 -4.334375381469726562e+01 -1.032785000000000064e+00 -4.340625000000000000e+01 -1.032790000000000097e+00 -4.334375381469726562e+01 -1.032795000000000130e+00 -4.331250000000000000e+01 -1.032800000000000162e+00 -4.328125381469726562e+01 -1.032805000000000195e+00 -4.328125381469726562e+01 -1.032810000000000006e+00 -4.328125381469726562e+01 -1.032815000000000039e+00 -4.328125381469726562e+01 -1.032820000000000071e+00 -4.328125381469726562e+01 -1.032825000000000104e+00 -4.328125381469726562e+01 -1.032830000000000137e+00 -4.321875000000000000e+01 -1.032835000000000170e+00 -4.321875000000000000e+01 -1.032839999999999980e+00 -4.328125381469726562e+01 -1.032845000000000013e+00 -4.328125381469726562e+01 -1.032850000000000046e+00 -4.328125381469726562e+01 -1.032855000000000079e+00 -4.325000381469726562e+01 -1.032860000000000111e+00 -4.318750381469726562e+01 -1.032865000000000144e+00 -4.321875000000000000e+01 -1.032870000000000177e+00 -4.315625000000000000e+01 -1.032874999999999988e+00 -4.312500381469726562e+01 -1.032880000000000020e+00 -4.315625000000000000e+01 -1.032885000000000053e+00 -4.321875000000000000e+01 -1.032890000000000086e+00 -4.315625000000000000e+01 -1.032895000000000119e+00 -4.321875000000000000e+01 -1.032900000000000151e+00 -4.315625000000000000e+01 -1.032905000000000184e+00 -4.315625000000000000e+01 -1.032909999999999995e+00 -4.309375381469726562e+01 -1.032915000000000028e+00 -4.318750381469726562e+01 -1.032920000000000060e+00 -4.315625000000000000e+01 -1.032925000000000093e+00 -4.309375381469726562e+01 -1.032930000000000126e+00 -4.303125381469726562e+01 -1.032935000000000159e+00 -4.309375381469726562e+01 -1.032940000000000191e+00 -4.306250000000000000e+01 -1.032945000000000002e+00 -4.303125381469726562e+01 -1.032950000000000035e+00 -4.306250000000000000e+01 -1.032955000000000068e+00 -4.300000000000000000e+01 -1.032960000000000100e+00 -4.306250000000000000e+01 -1.032965000000000133e+00 -4.300000000000000000e+01 -1.032970000000000166e+00 -4.303125381469726562e+01 -1.032974999999999977e+00 -4.303125381469726562e+01 -1.032980000000000009e+00 -4.303125381469726562e+01 -1.032985000000000042e+00 -4.303125381469726562e+01 -1.032990000000000075e+00 -4.300000000000000000e+01 -1.032995000000000108e+00 -4.300000000000000000e+01 -1.033000000000000140e+00 -4.300000000000000000e+01 -1.033005000000000173e+00 -4.300000000000000000e+01 -1.033009999999999984e+00 -4.296875381469726562e+01 -1.033015000000000017e+00 -4.296875381469726562e+01 -1.033020000000000049e+00 -4.300000000000000000e+01 -1.033025000000000082e+00 -4.296875381469726562e+01 -1.033030000000000115e+00 -4.296875381469726562e+01 -1.033035000000000148e+00 -4.303125381469726562e+01 -1.033040000000000180e+00 -4.300000000000000000e+01 -1.033044999999999991e+00 -4.300000000000000000e+01 -1.033050000000000024e+00 -4.293750381469726562e+01 -1.033055000000000057e+00 -4.290625000000000000e+01 -1.033060000000000089e+00 -4.293750381469726562e+01 -1.033065000000000122e+00 -4.296875381469726562e+01 -1.033070000000000155e+00 -4.293750381469726562e+01 -1.033075000000000188e+00 -4.300000000000000000e+01 -1.033079999999999998e+00 -4.296875381469726562e+01 -1.033085000000000031e+00 -4.290625000000000000e+01 -1.033090000000000064e+00 -4.296875381469726562e+01 -1.033095000000000097e+00 -4.293750381469726562e+01 -1.033100000000000129e+00 -4.293750381469726562e+01 -1.033105000000000162e+00 -4.293750381469726562e+01 -1.033110000000000195e+00 -4.287500381469726562e+01 -1.033115000000000006e+00 -4.287500381469726562e+01 -1.033120000000000038e+00 -4.287500381469726562e+01 -1.033125000000000071e+00 -4.287500381469726562e+01 -1.033130000000000104e+00 -4.287500381469726562e+01 -1.033135000000000137e+00 -4.287500381469726562e+01 -1.033140000000000169e+00 -4.290625000000000000e+01 -1.033144999999999980e+00 -4.284375000000000000e+01 -1.033150000000000013e+00 -4.278125381469726562e+01 -1.033155000000000046e+00 -4.278125381469726562e+01 -1.033160000000000078e+00 -4.278125381469726562e+01 -1.033165000000000111e+00 -4.278125381469726562e+01 -1.033170000000000144e+00 -4.284375000000000000e+01 -1.033175000000000177e+00 -4.278125381469726562e+01 -1.033179999999999987e+00 -4.278125381469726562e+01 -1.033185000000000020e+00 -4.271875381469726562e+01 -1.033190000000000053e+00 -4.275000000000000000e+01 -1.033195000000000086e+00 -4.281250381469726562e+01 -1.033200000000000118e+00 -4.268750000000000000e+01 -1.033205000000000151e+00 -4.275000000000000000e+01 -1.033210000000000184e+00 -4.268750000000000000e+01 -1.033214999999999995e+00 -4.271875381469726562e+01 -1.033220000000000027e+00 -4.271875381469726562e+01 -1.033225000000000060e+00 -4.265625000000000000e+01 -1.033230000000000093e+00 -4.268750000000000000e+01 -1.033235000000000126e+00 -4.268750000000000000e+01 -1.033240000000000158e+00 -4.271875381469726562e+01 -1.033245000000000191e+00 -4.262500381469726562e+01 -1.033250000000000002e+00 -4.262500381469726562e+01 -1.033255000000000035e+00 -4.265625000000000000e+01 -1.033260000000000067e+00 -4.262500381469726562e+01 -1.033265000000000100e+00 -4.265625000000000000e+01 -1.033270000000000133e+00 -4.259375000000000000e+01 -1.033275000000000166e+00 -4.265625000000000000e+01 -1.033279999999999976e+00 -4.256250381469726562e+01 -1.033285000000000009e+00 -4.253125000000000000e+01 -1.033290000000000042e+00 -4.253125000000000000e+01 -1.033295000000000075e+00 -4.256250381469726562e+01 -1.033300000000000107e+00 -4.250000000000000000e+01 -1.033305000000000140e+00 -4.246875381469726562e+01 -1.033310000000000173e+00 -4.250000000000000000e+01 -1.033314999999999984e+00 -4.250000000000000000e+01 -1.033320000000000016e+00 -4.250000000000000000e+01 -1.033325000000000049e+00 -4.250000000000000000e+01 -1.033330000000000082e+00 -4.250000000000000000e+01 -1.033335000000000115e+00 -4.240625381469726562e+01 -1.033340000000000147e+00 -4.243750000000000000e+01 -1.033345000000000180e+00 -4.243750000000000000e+01 -1.033349999999999991e+00 -4.240625381469726562e+01 -1.033355000000000024e+00 -4.243750000000000000e+01 -1.033360000000000056e+00 -4.237500381469726562e+01 -1.033365000000000089e+00 -4.234375000000000000e+01 -1.033370000000000122e+00 -4.228125000000000000e+01 -1.033375000000000155e+00 -4.237500381469726562e+01 -1.033380000000000187e+00 -4.237500381469726562e+01 -1.033384999999999998e+00 -4.240625381469726562e+01 -1.033390000000000031e+00 -4.234375000000000000e+01 -1.033395000000000064e+00 -4.234375000000000000e+01 -1.033400000000000096e+00 -4.228125000000000000e+01 -1.033405000000000129e+00 -4.240625381469726562e+01 -1.033410000000000162e+00 -4.228125000000000000e+01 -1.033415000000000195e+00 -4.225000381469726562e+01 -1.033420000000000005e+00 -4.225000381469726562e+01 -1.033425000000000038e+00 -4.225000381469726562e+01 -1.033430000000000071e+00 -4.228125000000000000e+01 -1.033435000000000104e+00 -4.225000381469726562e+01 -1.033440000000000136e+00 -4.228125000000000000e+01 -1.033445000000000169e+00 -4.218750000000000000e+01 -1.033449999999999980e+00 -4.221875381469726562e+01 -1.033455000000000013e+00 -4.212500000000000000e+01 -1.033460000000000045e+00 -4.221875381469726562e+01 -1.033465000000000078e+00 -4.215625381469726562e+01 -1.033470000000000111e+00 -4.212500000000000000e+01 -1.033475000000000144e+00 -4.206250381469726562e+01 -1.033480000000000176e+00 -4.206250381469726562e+01 -1.033484999999999987e+00 -4.209375381469726562e+01 -1.033490000000000020e+00 -4.209375381469726562e+01 -1.033495000000000053e+00 -4.206250381469726562e+01 -1.033500000000000085e+00 -4.200000381469726562e+01 -1.033505000000000118e+00 -4.203125000000000000e+01 -1.033510000000000151e+00 -4.200000381469726562e+01 -1.033515000000000184e+00 -4.203125000000000000e+01 -1.033519999999999994e+00 -4.206250381469726562e+01 -1.033525000000000027e+00 -4.196875000000000000e+01 -1.033530000000000060e+00 -4.200000381469726562e+01 -1.033535000000000093e+00 -4.200000381469726562e+01 -1.033540000000000125e+00 -4.200000381469726562e+01 -1.033545000000000158e+00 -4.190625381469726562e+01 -1.033550000000000191e+00 -4.193750000000000000e+01 -1.033555000000000001e+00 -4.190625381469726562e+01 -1.033560000000000034e+00 -4.187500000000000000e+01 -1.033565000000000067e+00 -4.181250000000000000e+01 -1.033570000000000100e+00 -4.178125000000000000e+01 -1.033575000000000133e+00 -4.184375381469726562e+01 -1.033580000000000165e+00 -4.178125000000000000e+01 -1.033584999999999976e+00 -4.181250000000000000e+01 -1.033590000000000009e+00 -4.181250000000000000e+01 -1.033595000000000041e+00 -4.171875000000000000e+01 -1.033600000000000074e+00 -4.165625381469726562e+01 -1.033605000000000107e+00 -4.162500000000000000e+01 -1.033610000000000140e+00 -4.165625381469726562e+01 -1.033615000000000173e+00 -4.165625381469726562e+01 -1.033619999999999983e+00 -4.159375381469726562e+01 -1.033625000000000016e+00 -4.153125381469726562e+01 -1.033630000000000049e+00 -4.150000381469726562e+01 -1.033635000000000081e+00 -4.146875000000000000e+01 -1.033640000000000114e+00 -4.143750381469726562e+01 -1.033645000000000147e+00 -4.137500381469726562e+01 -1.033650000000000180e+00 -4.131250000000000000e+01 -1.033654999999999990e+00 -4.121875000000000000e+01 -1.033660000000000023e+00 -4.112500381469726562e+01 -1.033665000000000056e+00 -4.093750381469726562e+01 -1.033670000000000089e+00 -4.087500381469726562e+01 -1.033675000000000122e+00 -4.065625381469726562e+01 -1.033680000000000154e+00 -4.040625381469726562e+01 -1.033685000000000187e+00 -4.025000381469726562e+01 -1.033689999999999998e+00 -3.987500000000000000e+01 -1.033695000000000030e+00 -3.962500000000000000e+01 -1.033700000000000063e+00 -3.918750381469726562e+01 -1.033705000000000096e+00 -3.903125381469726562e+01 -1.033710000000000129e+00 -3.856250381469726562e+01 -1.033715000000000162e+00 -3.815625381469726562e+01 -1.033720000000000194e+00 -3.775000381469726562e+01 -1.033725000000000005e+00 -3.737500381469726562e+01 -1.033730000000000038e+00 -3.687500381469726562e+01 -1.033735000000000070e+00 -3.643750000000000000e+01 -1.033740000000000103e+00 -3.600000381469726562e+01 -1.033745000000000136e+00 -3.550000000000000000e+01 -1.033750000000000169e+00 -3.496875381469726562e+01 -1.033754999999999979e+00 -3.443750000000000000e+01 -1.033760000000000012e+00 -3.390625000000000000e+01 -1.033765000000000045e+00 -3.334375000000000000e+01 -1.033770000000000078e+00 -3.278125000000000000e+01 -1.033775000000000110e+00 -3.228125000000000000e+01 -1.033780000000000143e+00 -3.165625000000000000e+01 -1.033785000000000176e+00 -3.109375190734863281e+01 -1.033789999999999987e+00 -3.043750190734863281e+01 -1.033795000000000019e+00 -2.978125190734863281e+01 -1.033800000000000052e+00 -2.915625000000000000e+01 -1.033805000000000085e+00 -2.843750000000000000e+01 -1.033810000000000118e+00 -2.765625190734863281e+01 -1.033815000000000150e+00 -2.684375000000000000e+01 -1.033820000000000183e+00 -2.609375190734863281e+01 -1.033824999999999994e+00 -2.518750190734863281e+01 -1.033830000000000027e+00 -2.428125000000000000e+01 -1.033835000000000059e+00 -2.325000000000000000e+01 -1.033840000000000092e+00 -2.228125190734863281e+01 -1.033845000000000125e+00 -2.121875000000000000e+01 -1.033850000000000158e+00 -2.003125190734863281e+01 -1.033855000000000190e+00 -1.878125000000000000e+01 -1.033860000000000001e+00 -1.750000000000000000e+01 -1.033865000000000034e+00 -1.628125000000000000e+01 -1.033870000000000067e+00 -1.496875095367431641e+01 -1.033875000000000099e+00 -1.356250000000000000e+01 -1.033880000000000132e+00 -1.221875095367431641e+01 -1.033885000000000165e+00 -1.071875095367431641e+01 -1.033889999999999976e+00 -9.375000000000000000e+00 -1.033895000000000008e+00 -8.093750000000000000e+00 -1.033900000000000041e+00 -6.593750476837158203e+00 -1.033905000000000074e+00 -5.375000000000000000e+00 -1.033910000000000107e+00 -3.968750238418579102e+00 -1.033915000000000139e+00 -2.687500000000000000e+00 -1.033920000000000172e+00 -1.375000119209289551e+00 -1.033924999999999983e+00 -2.187500000000000000e-01 -1.033930000000000016e+00 1.031250000000000000e+00 -1.033935000000000048e+00 2.218750000000000000e+00 -1.033940000000000081e+00 3.375000000000000000e+00 -1.033945000000000114e+00 4.500000476837158203e+00 -1.033950000000000147e+00 5.500000476837158203e+00 -1.033955000000000179e+00 6.500000000000000000e+00 -1.033959999999999990e+00 7.468750000000000000e+00 -1.033965000000000023e+00 8.375000000000000000e+00 -1.033970000000000056e+00 9.250000000000000000e+00 -1.033975000000000088e+00 1.009375000000000000e+01 -1.033980000000000121e+00 1.087500095367431641e+01 -1.033985000000000154e+00 1.162500000000000000e+01 -1.033990000000000187e+00 1.234375000000000000e+01 -1.033994999999999997e+00 1.296875095367431641e+01 -1.034000000000000030e+00 1.350000000000000000e+01 -1.034005000000000063e+00 1.406250095367431641e+01 -1.034010000000000096e+00 1.450000095367431641e+01 -1.034015000000000128e+00 1.493750000000000000e+01 -1.034020000000000161e+00 1.537500000000000000e+01 -1.034025000000000194e+00 1.571875095367431641e+01 -1.034030000000000005e+00 1.600000000000000000e+01 -1.034035000000000037e+00 1.631250000000000000e+01 -1.034040000000000070e+00 1.653125190734863281e+01 -1.034045000000000103e+00 1.668750190734863281e+01 -1.034050000000000136e+00 1.687500000000000000e+01 -1.034055000000000168e+00 1.693750190734863281e+01 -1.034059999999999979e+00 1.703125000000000000e+01 -1.034065000000000012e+00 1.700000000000000000e+01 -1.034070000000000045e+00 1.703125000000000000e+01 -1.034075000000000077e+00 1.700000000000000000e+01 -1.034080000000000110e+00 1.690625000000000000e+01 -1.034085000000000143e+00 1.678125000000000000e+01 -1.034090000000000176e+00 1.662500000000000000e+01 -1.034094999999999986e+00 1.637500190734863281e+01 -1.034100000000000019e+00 1.625000190734863281e+01 -1.034105000000000052e+00 1.600000000000000000e+01 -1.034110000000000085e+00 1.565625190734863281e+01 -1.034115000000000117e+00 1.543750095367431641e+01 -1.034120000000000150e+00 1.512500095367431641e+01 -1.034125000000000183e+00 1.478125095367431641e+01 -1.034129999999999994e+00 1.437500000000000000e+01 -1.034135000000000026e+00 1.403125095367431641e+01 -1.034140000000000059e+00 1.359375095367431641e+01 -1.034145000000000092e+00 1.325000095367431641e+01 -1.034150000000000125e+00 1.271875000000000000e+01 -1.034155000000000157e+00 1.231250095367431641e+01 -1.034160000000000190e+00 1.181250095367431641e+01 -1.034165000000000001e+00 1.131250095367431641e+01 -1.034170000000000034e+00 1.081250095367431641e+01 -1.034175000000000066e+00 1.025000000000000000e+01 -1.034180000000000099e+00 9.781250953674316406e+00 -1.034185000000000132e+00 9.156250000000000000e+00 -1.034190000000000165e+00 8.531250000000000000e+00 -1.034194999999999975e+00 8.031250000000000000e+00 -1.034200000000000008e+00 7.500000476837158203e+00 -1.034205000000000041e+00 6.843750476837158203e+00 -1.034210000000000074e+00 6.218750476837158203e+00 -1.034215000000000106e+00 5.500000476837158203e+00 -1.034220000000000139e+00 4.937500000000000000e+00 -1.034225000000000172e+00 4.250000000000000000e+00 -1.034229999999999983e+00 3.562500238418579102e+00 -1.034235000000000015e+00 2.906250000000000000e+00 -1.034240000000000048e+00 2.218750000000000000e+00 -1.034245000000000081e+00 1.531250119209289551e+00 -1.034250000000000114e+00 7.812500000000000000e-01 -1.034255000000000146e+00 9.375000000000000000e-02 -1.034260000000000179e+00 -5.937500596046447754e-01 -1.034264999999999990e+00 -1.312500119209289551e+00 -1.034270000000000023e+00 -2.031250238418579102e+00 -1.034275000000000055e+00 -2.812500000000000000e+00 -1.034280000000000088e+00 -3.531250238418579102e+00 -1.034285000000000121e+00 -4.281250476837158203e+00 -1.034290000000000154e+00 -5.000000476837158203e+00 -1.034295000000000186e+00 -5.812500000000000000e+00 -1.034299999999999997e+00 -6.593750476837158203e+00 -1.034305000000000030e+00 -7.312500476837158203e+00 -1.034310000000000063e+00 -8.093750000000000000e+00 -1.034315000000000095e+00 -8.843750953674316406e+00 -1.034320000000000128e+00 -9.656250000000000000e+00 -1.034325000000000161e+00 -1.040625000000000000e+01 -1.034330000000000194e+00 -1.106250000000000000e+01 -1.034335000000000004e+00 -1.190625000000000000e+01 -1.034340000000000037e+00 -1.265625095367431641e+01 -1.034345000000000070e+00 -1.346875095367431641e+01 -1.034350000000000103e+00 -1.418750095367431641e+01 -1.034355000000000135e+00 -1.493750000000000000e+01 -1.034360000000000168e+00 -1.565625190734863281e+01 -1.034364999999999979e+00 -1.631250000000000000e+01 -1.034370000000000012e+00 -1.706250000000000000e+01 -1.034375000000000044e+00 -1.778125000000000000e+01 -1.034380000000000077e+00 -1.850000000000000000e+01 -1.034385000000000110e+00 -1.918750000000000000e+01 -1.034390000000000143e+00 -1.987500190734863281e+01 -1.034395000000000175e+00 -2.059375190734863281e+01 -1.034399999999999986e+00 -2.121875000000000000e+01 -1.034405000000000019e+00 -2.193750000000000000e+01 -1.034410000000000052e+00 -2.262500190734863281e+01 -1.034415000000000084e+00 -2.321875000000000000e+01 -1.034420000000000117e+00 -2.387500190734863281e+01 -1.034425000000000150e+00 -2.450000190734863281e+01 -1.034430000000000183e+00 -2.512500000000000000e+01 -1.034434999999999993e+00 -2.578125190734863281e+01 -1.034440000000000026e+00 -2.637500190734863281e+01 -1.034445000000000059e+00 -2.700000000000000000e+01 -1.034450000000000092e+00 -2.753125190734863281e+01 -1.034455000000000124e+00 -2.818750190734863281e+01 -1.034460000000000157e+00 -2.875000000000000000e+01 -1.034465000000000190e+00 -2.931250000000000000e+01 -1.034470000000000001e+00 -2.987500000000000000e+01 -1.034475000000000033e+00 -3.043750190734863281e+01 -1.034480000000000066e+00 -3.093750190734863281e+01 -1.034485000000000099e+00 -3.143750190734863281e+01 -1.034490000000000132e+00 -3.203125381469726562e+01 -1.034495000000000164e+00 -3.246875000000000000e+01 -1.034499999999999975e+00 -3.293750000000000000e+01 -1.034505000000000008e+00 -3.350000000000000000e+01 -1.034510000000000041e+00 -3.403125381469726562e+01 -1.034515000000000073e+00 -3.450000381469726562e+01 -1.034520000000000106e+00 -3.487500000000000000e+01 -1.034525000000000139e+00 -3.543750381469726562e+01 -1.034530000000000172e+00 -3.587500000000000000e+01 -1.034534999999999982e+00 -3.631250000000000000e+01 -1.034540000000000015e+00 -3.681250381469726562e+01 -1.034545000000000048e+00 -3.725000000000000000e+01 -1.034550000000000081e+00 -3.762500381469726562e+01 -1.034555000000000113e+00 -3.806250000000000000e+01 -1.034560000000000146e+00 -3.843750000000000000e+01 -1.034565000000000179e+00 -3.890625000000000000e+01 -1.034569999999999990e+00 -3.925000000000000000e+01 -1.034575000000000022e+00 -3.962500000000000000e+01 -1.034580000000000055e+00 -4.003125000000000000e+01 -1.034585000000000088e+00 -4.037500000000000000e+01 -1.034590000000000121e+00 -4.081250381469726562e+01 -1.034595000000000153e+00 -4.109375000000000000e+01 -1.034600000000000186e+00 -4.150000381469726562e+01 -1.034604999999999997e+00 -4.178125000000000000e+01 -1.034610000000000030e+00 -4.212500000000000000e+01 -1.034615000000000062e+00 -4.250000000000000000e+01 -1.034620000000000095e+00 -4.275000000000000000e+01 -1.034625000000000128e+00 -4.306250000000000000e+01 -1.034630000000000161e+00 -4.346875000000000000e+01 -1.034635000000000193e+00 -4.375000381469726562e+01 -1.034640000000000004e+00 -4.406250381469726562e+01 -1.034645000000000037e+00 -4.431250381469726562e+01 -1.034650000000000070e+00 -4.465625000000000000e+01 -1.034655000000000102e+00 -4.490625000000000000e+01 -1.034660000000000135e+00 -4.521875000000000000e+01 -1.034665000000000168e+00 -4.550000381469726562e+01 -1.034669999999999979e+00 -4.568750000000000000e+01 -1.034675000000000011e+00 -4.600000381469726562e+01 -1.034680000000000044e+00 -4.621875381469726562e+01 -1.034685000000000077e+00 -4.650000000000000000e+01 -1.034690000000000110e+00 -4.671875381469726562e+01 -1.034695000000000142e+00 -4.696875000000000000e+01 -1.034700000000000175e+00 -4.709375381469726562e+01 -1.034704999999999986e+00 -4.746875000000000000e+01 -1.034710000000000019e+00 -4.765625381469726562e+01 -1.034715000000000051e+00 -4.784375000000000000e+01 -1.034720000000000084e+00 -4.809375000000000000e+01 -1.034725000000000117e+00 -4.834375000000000000e+01 -1.034730000000000150e+00 -4.843750381469726562e+01 -1.034735000000000182e+00 -4.862500381469726562e+01 -1.034739999999999993e+00 -4.890625000000000000e+01 -1.034745000000000026e+00 -4.903125381469726562e+01 -1.034750000000000059e+00 -4.918750381469726562e+01 -1.034755000000000091e+00 -4.946875381469726562e+01 -1.034760000000000124e+00 -4.965625381469726562e+01 -1.034765000000000157e+00 -4.975000381469726562e+01 -1.034770000000000190e+00 -5.003125381469726562e+01 -1.034775000000000000e+00 -5.015625000000000000e+01 -1.034780000000000033e+00 -5.021875381469726562e+01 -1.034785000000000066e+00 -5.040625000000000000e+01 -1.034790000000000099e+00 -5.056250000000000000e+01 -1.034795000000000131e+00 -5.068750381469726562e+01 -1.034800000000000164e+00 -5.084375381469726562e+01 -1.034804999999999975e+00 -5.100000381469726562e+01 -1.034810000000000008e+00 -5.115625381469726562e+01 -1.034815000000000040e+00 -5.131250381469726562e+01 -1.034820000000000073e+00 -5.153125000000000000e+01 -1.034825000000000106e+00 -5.159375000000000000e+01 -1.034830000000000139e+00 -5.175000381469726562e+01 -1.034835000000000171e+00 -5.190625381469726562e+01 -1.034839999999999982e+00 -5.196875381469726562e+01 -1.034845000000000015e+00 -5.218750381469726562e+01 -1.034850000000000048e+00 -5.218750381469726562e+01 -1.034855000000000080e+00 -5.240625000000000000e+01 -1.034860000000000113e+00 -5.250000381469726562e+01 -1.034865000000000146e+00 -5.253125381469726562e+01 -1.034870000000000179e+00 -5.271875000000000000e+01 -1.034874999999999989e+00 -5.281250000000000000e+01 -1.034880000000000022e+00 -5.293750381469726562e+01 -1.034885000000000055e+00 -5.303125000000000000e+01 -1.034890000000000088e+00 -5.318750000000000000e+01 -1.034895000000000120e+00 -5.331250381469726562e+01 -1.034900000000000153e+00 -5.334375381469726562e+01 -1.034905000000000186e+00 -5.337500381469726562e+01 -1.034909999999999997e+00 -5.359375000000000000e+01 -1.034915000000000029e+00 -5.362500381469726562e+01 -1.034920000000000062e+00 -5.375000000000000000e+01 -1.034925000000000095e+00 -5.381250381469726562e+01 -1.034930000000000128e+00 -5.384375000000000000e+01 -1.034935000000000160e+00 -5.396875381469726562e+01 -1.034940000000000193e+00 -5.406250381469726562e+01 -1.034945000000000004e+00 -5.415625000000000000e+01 -1.034950000000000037e+00 -5.431250000000000000e+01 -1.034955000000000069e+00 -5.428125381469726562e+01 -1.034960000000000102e+00 -5.434375381469726562e+01 -1.034965000000000135e+00 -5.443750381469726562e+01 -1.034970000000000168e+00 -5.453125381469726562e+01 -1.034974999999999978e+00 -5.462500000000000000e+01 -1.034980000000000011e+00 -5.468750381469726562e+01 -1.034985000000000044e+00 -5.475000381469726562e+01 -1.034990000000000077e+00 -5.478125381469726562e+01 -1.034995000000000109e+00 -5.487500000000000000e+01 -1.035000000000000142e+00 -5.490625381469726562e+01 -1.035005000000000175e+00 -5.500000381469726562e+01 -1.035009999999999986e+00 -5.500000381469726562e+01 -1.035015000000000018e+00 -5.506250381469726562e+01 -1.035020000000000051e+00 -5.509375381469726562e+01 -1.035025000000000084e+00 -5.515625381469726562e+01 -1.035030000000000117e+00 -5.525000381469726562e+01 -1.035035000000000149e+00 -5.528125000000000000e+01 -1.035040000000000182e+00 -5.534375000000000000e+01 -1.035044999999999993e+00 -5.540625381469726562e+01 -1.035050000000000026e+00 -5.540625381469726562e+01 -1.035055000000000058e+00 -5.543750000000000000e+01 -1.035060000000000091e+00 -5.550000381469726562e+01 -1.035065000000000124e+00 -5.556250381469726562e+01 -1.035070000000000157e+00 -5.562500381469726562e+01 -1.035075000000000189e+00 -5.568750381469726562e+01 -1.035080000000000000e+00 -5.568750381469726562e+01 -1.035085000000000033e+00 -5.575000000000000000e+01 -1.035090000000000066e+00 -5.578125381469726562e+01 -1.035095000000000098e+00 -5.590625000000000000e+01 -1.035100000000000131e+00 -5.584375000000000000e+01 -1.035105000000000164e+00 -5.587500381469726562e+01 -1.035109999999999975e+00 -5.593750381469726562e+01 -1.035115000000000007e+00 -5.600000000000000000e+01 -1.035120000000000040e+00 -5.593750381469726562e+01 -1.035125000000000073e+00 -5.606250000000000000e+01 -1.035130000000000106e+00 -5.615625000000000000e+01 -1.035135000000000138e+00 -5.615625000000000000e+01 -1.035140000000000171e+00 -5.615625000000000000e+01 -1.035144999999999982e+00 -5.615625000000000000e+01 -1.035150000000000015e+00 -5.615625000000000000e+01 -1.035155000000000047e+00 -5.618750381469726562e+01 -1.035160000000000080e+00 -5.625000381469726562e+01 -1.035165000000000113e+00 -5.628125381469726562e+01 -1.035170000000000146e+00 -5.628125381469726562e+01 -1.035175000000000178e+00 -5.631250000000000000e+01 -1.035179999999999989e+00 -5.628125381469726562e+01 -1.035185000000000022e+00 -5.634375381469726562e+01 -1.035190000000000055e+00 -5.643750381469726562e+01 -1.035195000000000087e+00 -5.643750381469726562e+01 -1.035200000000000120e+00 -5.643750381469726562e+01 -1.035205000000000153e+00 -5.650000381469726562e+01 -1.035210000000000186e+00 -5.650000381469726562e+01 -1.035214999999999996e+00 -5.653125381469726562e+01 -1.035220000000000029e+00 -5.650000381469726562e+01 -1.035225000000000062e+00 -5.653125381469726562e+01 -1.035230000000000095e+00 -5.659375381469726562e+01 -1.035235000000000127e+00 -5.653125381469726562e+01 -1.035240000000000160e+00 -5.656250381469726562e+01 -1.035245000000000193e+00 -5.659375381469726562e+01 -1.035250000000000004e+00 -5.659375381469726562e+01 -1.035255000000000036e+00 -5.659375381469726562e+01 -1.035260000000000069e+00 -5.665625381469726562e+01 -1.035265000000000102e+00 -5.675000381469726562e+01 -1.035270000000000135e+00 -5.668750381469726562e+01 -1.035275000000000167e+00 -5.665625381469726562e+01 -1.035279999999999978e+00 -5.675000381469726562e+01 -1.035285000000000011e+00 -5.675000381469726562e+01 -1.035290000000000044e+00 -5.678125000000000000e+01 -1.035295000000000076e+00 -5.675000381469726562e+01 -1.035300000000000109e+00 -5.684375381469726562e+01 -1.035305000000000142e+00 -5.678125000000000000e+01 -1.035310000000000175e+00 -5.681250381469726562e+01 -1.035314999999999985e+00 -5.684375381469726562e+01 -1.035320000000000018e+00 -5.684375381469726562e+01 -1.035325000000000051e+00 -5.687500000000000000e+01 -1.035330000000000084e+00 -5.681250381469726562e+01 -1.035335000000000116e+00 -5.681250381469726562e+01 -1.035340000000000149e+00 -5.681250381469726562e+01 -1.035345000000000182e+00 -5.684375381469726562e+01 -1.035349999999999993e+00 -5.690625381469726562e+01 -1.035355000000000025e+00 -5.684375381469726562e+01 -1.035360000000000058e+00 -5.690625381469726562e+01 -1.035365000000000091e+00 -5.687500000000000000e+01 -1.035370000000000124e+00 -5.687500000000000000e+01 -1.035375000000000156e+00 -5.690625381469726562e+01 -1.035380000000000189e+00 -5.690625381469726562e+01 -1.035385000000000000e+00 -5.693750381469726562e+01 -1.035390000000000033e+00 -5.693750381469726562e+01 -1.035395000000000065e+00 -5.693750381469726562e+01 -1.035400000000000098e+00 -5.684375381469726562e+01 -1.035405000000000131e+00 -5.693750381469726562e+01 -1.035410000000000164e+00 -5.684375381469726562e+01 -1.035414999999999974e+00 -5.690625381469726562e+01 -1.035420000000000007e+00 -5.687500000000000000e+01 -1.035425000000000040e+00 -5.690625381469726562e+01 -1.035430000000000073e+00 -5.693750381469726562e+01 -1.035435000000000105e+00 -5.693750381469726562e+01 -1.035440000000000138e+00 -5.690625381469726562e+01 -1.035445000000000171e+00 -5.696875381469726562e+01 -1.035449999999999982e+00 -5.693750381469726562e+01 -1.035455000000000014e+00 -5.690625381469726562e+01 -1.035460000000000047e+00 -5.690625381469726562e+01 -1.035465000000000080e+00 -5.693750381469726562e+01 -1.035470000000000113e+00 -5.690625381469726562e+01 -1.035475000000000145e+00 -5.693750381469726562e+01 -1.035480000000000178e+00 -5.684375381469726562e+01 -1.035484999999999989e+00 -5.687500000000000000e+01 -1.035490000000000022e+00 -5.684375381469726562e+01 -1.035495000000000054e+00 -5.690625381469726562e+01 -1.035500000000000087e+00 -5.690625381469726562e+01 -1.035505000000000120e+00 -5.684375381469726562e+01 -1.035510000000000153e+00 -5.687500000000000000e+01 -1.035515000000000185e+00 -5.690625381469726562e+01 -1.035519999999999996e+00 -5.687500000000000000e+01 -1.035525000000000029e+00 -5.684375381469726562e+01 -1.035530000000000062e+00 -5.693750381469726562e+01 -1.035535000000000094e+00 -5.678125000000000000e+01 -1.035540000000000127e+00 -5.684375381469726562e+01 -1.035545000000000160e+00 -5.687500000000000000e+01 -1.035550000000000193e+00 -5.684375381469726562e+01 -1.035555000000000003e+00 -5.684375381469726562e+01 -1.035560000000000036e+00 -5.678125000000000000e+01 -1.035565000000000069e+00 -5.681250381469726562e+01 -1.035570000000000102e+00 -5.678125000000000000e+01 -1.035575000000000134e+00 -5.681250381469726562e+01 -1.035580000000000167e+00 -5.671875000000000000e+01 -1.035584999999999978e+00 -5.675000381469726562e+01 -1.035590000000000011e+00 -5.671875000000000000e+01 -1.035595000000000043e+00 -5.678125000000000000e+01 -1.035600000000000076e+00 -5.675000381469726562e+01 -1.035605000000000109e+00 -5.671875000000000000e+01 -1.035610000000000142e+00 -5.675000381469726562e+01 -1.035615000000000174e+00 -5.668750381469726562e+01 -1.035619999999999985e+00 -5.668750381469726562e+01 -1.035625000000000018e+00 -5.665625381469726562e+01 -1.035630000000000051e+00 -5.668750381469726562e+01 -1.035635000000000083e+00 -5.668750381469726562e+01 -1.035640000000000116e+00 -5.665625381469726562e+01 -1.035645000000000149e+00 -5.668750381469726562e+01 -1.035650000000000182e+00 -5.659375381469726562e+01 -1.035654999999999992e+00 -5.662500000000000000e+01 -1.035660000000000025e+00 -5.656250381469726562e+01 -1.035665000000000058e+00 -5.665625381469726562e+01 -1.035670000000000091e+00 -5.659375381469726562e+01 -1.035675000000000123e+00 -5.653125381469726562e+01 -1.035680000000000156e+00 -5.653125381469726562e+01 -1.035685000000000189e+00 -5.653125381469726562e+01 -1.035690000000000000e+00 -5.653125381469726562e+01 -1.035695000000000032e+00 -5.653125381469726562e+01 -1.035700000000000065e+00 -5.653125381469726562e+01 -1.035705000000000098e+00 -5.656250381469726562e+01 -1.035710000000000131e+00 -5.653125381469726562e+01 -1.035715000000000163e+00 -5.646875000000000000e+01 -1.035719999999999974e+00 -5.650000381469726562e+01 -1.035725000000000007e+00 -5.650000381469726562e+01 -1.035730000000000040e+00 -5.646875000000000000e+01 -1.035735000000000072e+00 -5.650000381469726562e+01 -1.035740000000000105e+00 -5.637500381469726562e+01 -1.035745000000000138e+00 -5.643750381469726562e+01 -1.035750000000000171e+00 -5.640625381469726562e+01 -1.035754999999999981e+00 -5.646875000000000000e+01 -1.035760000000000014e+00 -5.646875000000000000e+01 -1.035765000000000047e+00 -5.640625381469726562e+01 -1.035770000000000080e+00 -5.646875000000000000e+01 -1.035775000000000112e+00 -5.634375381469726562e+01 -1.035780000000000145e+00 -5.631250000000000000e+01 -1.035785000000000178e+00 -5.637500381469726562e+01 -1.035789999999999988e+00 -5.631250000000000000e+01 -1.035795000000000021e+00 -5.634375381469726562e+01 -1.035800000000000054e+00 -5.634375381469726562e+01 -1.035805000000000087e+00 -5.621875381469726562e+01 -1.035810000000000120e+00 -5.628125381469726562e+01 -1.035815000000000152e+00 -5.628125381469726562e+01 -1.035820000000000185e+00 -5.618750381469726562e+01 -1.035824999999999996e+00 -5.625000381469726562e+01 -1.035830000000000028e+00 -5.615625000000000000e+01 -1.035835000000000061e+00 -5.618750381469726562e+01 -1.035840000000000094e+00 -5.615625000000000000e+01 -1.035845000000000127e+00 -5.625000381469726562e+01 -1.035850000000000160e+00 -5.615625000000000000e+01 -1.035855000000000192e+00 -5.609375381469726562e+01 -1.035860000000000003e+00 -5.612500381469726562e+01 -1.035865000000000036e+00 -5.612500381469726562e+01 -1.035870000000000068e+00 -5.609375381469726562e+01 -1.035875000000000101e+00 -5.606250000000000000e+01 -1.035880000000000134e+00 -5.612500381469726562e+01 -1.035885000000000167e+00 -5.609375381469726562e+01 -1.035889999999999977e+00 -5.600000000000000000e+01 -1.035895000000000010e+00 -5.600000000000000000e+01 -1.035900000000000043e+00 -5.596875381469726562e+01 -1.035905000000000076e+00 -5.606250000000000000e+01 -1.035910000000000108e+00 -5.596875381469726562e+01 -1.035915000000000141e+00 -5.593750381469726562e+01 -1.035920000000000174e+00 -5.587500381469726562e+01 -1.035924999999999985e+00 -5.593750381469726562e+01 -1.035930000000000017e+00 -5.593750381469726562e+01 -1.035935000000000050e+00 -5.590625000000000000e+01 -1.035940000000000083e+00 -5.590625000000000000e+01 -1.035945000000000116e+00 -5.590625000000000000e+01 -1.035950000000000149e+00 -5.590625000000000000e+01 -1.035955000000000181e+00 -5.581250381469726562e+01 -1.035959999999999992e+00 -5.581250381469726562e+01 -1.035965000000000025e+00 -5.578125381469726562e+01 -1.035970000000000057e+00 -5.581250381469726562e+01 -1.035975000000000090e+00 -5.581250381469726562e+01 -1.035980000000000123e+00 -5.584375000000000000e+01 -1.035985000000000156e+00 -5.571875381469726562e+01 -1.035990000000000189e+00 -5.575000000000000000e+01 -1.035994999999999999e+00 -5.581250381469726562e+01 -1.036000000000000032e+00 -5.581250381469726562e+01 -1.036005000000000065e+00 -5.565625381469726562e+01 -1.036010000000000097e+00 -5.568750381469726562e+01 -1.036015000000000130e+00 -5.568750381469726562e+01 -1.036020000000000163e+00 -5.568750381469726562e+01 -1.036025000000000196e+00 -5.565625381469726562e+01 -1.036030000000000006e+00 -5.568750381469726562e+01 -1.036035000000000039e+00 -5.565625381469726562e+01 -1.036040000000000072e+00 -5.562500381469726562e+01 -1.036045000000000105e+00 -5.562500381469726562e+01 -1.036050000000000137e+00 -5.559375000000000000e+01 -1.036055000000000170e+00 -5.565625381469726562e+01 -1.036059999999999981e+00 -5.562500381469726562e+01 -1.036065000000000014e+00 -5.559375000000000000e+01 -1.036070000000000046e+00 -5.550000381469726562e+01 -1.036075000000000079e+00 -5.556250381469726562e+01 -1.036080000000000112e+00 -5.553125381469726562e+01 -1.036085000000000145e+00 -5.550000381469726562e+01 -1.036090000000000177e+00 -5.553125381469726562e+01 -1.036094999999999988e+00 -5.550000381469726562e+01 -1.036100000000000021e+00 -5.546875381469726562e+01 -1.036105000000000054e+00 -5.550000381469726562e+01 -1.036110000000000086e+00 -5.546875381469726562e+01 -1.036115000000000119e+00 -5.543750000000000000e+01 -1.036120000000000152e+00 -5.540625381469726562e+01 -1.036125000000000185e+00 -5.537500381469726562e+01 -1.036129999999999995e+00 -5.540625381469726562e+01 -1.036135000000000028e+00 -5.531250381469726562e+01 -1.036140000000000061e+00 -5.540625381469726562e+01 -1.036145000000000094e+00 -5.540625381469726562e+01 -1.036150000000000126e+00 -5.528125000000000000e+01 -1.036155000000000159e+00 -5.531250381469726562e+01 -1.036160000000000192e+00 -5.528125000000000000e+01 -1.036165000000000003e+00 -5.528125000000000000e+01 -1.036170000000000035e+00 -5.525000381469726562e+01 -1.036175000000000068e+00 -5.528125000000000000e+01 -1.036180000000000101e+00 -5.521875381469726562e+01 -1.036185000000000134e+00 -5.518750000000000000e+01 -1.036190000000000166e+00 -5.515625381469726562e+01 -1.036194999999999977e+00 -5.518750000000000000e+01 -1.036200000000000010e+00 -5.515625381469726562e+01 -1.036205000000000043e+00 -5.518750000000000000e+01 -1.036210000000000075e+00 -5.518750000000000000e+01 -1.036215000000000108e+00 -5.518750000000000000e+01 -1.036220000000000141e+00 -5.506250381469726562e+01 -1.036225000000000174e+00 -5.503125000000000000e+01 -1.036229999999999984e+00 -5.512500000000000000e+01 -1.036235000000000017e+00 -5.506250381469726562e+01 -1.036240000000000050e+00 -5.506250381469726562e+01 -1.036245000000000083e+00 -5.503125000000000000e+01 -1.036250000000000115e+00 -5.503125000000000000e+01 -1.036255000000000148e+00 -5.506250381469726562e+01 -1.036260000000000181e+00 -5.500000381469726562e+01 -1.036264999999999992e+00 -5.503125000000000000e+01 -1.036270000000000024e+00 -5.500000381469726562e+01 -1.036275000000000057e+00 -5.500000381469726562e+01 -1.036280000000000090e+00 -5.496875381469726562e+01 -1.036285000000000123e+00 -5.496875381469726562e+01 -1.036290000000000155e+00 -5.490625381469726562e+01 -1.036295000000000188e+00 -5.490625381469726562e+01 -1.036299999999999999e+00 -5.490625381469726562e+01 -1.036305000000000032e+00 -5.487500000000000000e+01 -1.036310000000000064e+00 -5.490625381469726562e+01 -1.036315000000000097e+00 -5.490625381469726562e+01 -1.036320000000000130e+00 -5.484375381469726562e+01 -1.036325000000000163e+00 -5.484375381469726562e+01 -1.036330000000000195e+00 -5.481250381469726562e+01 -1.036335000000000006e+00 -5.478125381469726562e+01 -1.036340000000000039e+00 -5.478125381469726562e+01 -1.036345000000000072e+00 -5.475000381469726562e+01 -1.036350000000000104e+00 -5.475000381469726562e+01 -1.036355000000000137e+00 -5.468750381469726562e+01 -1.036360000000000170e+00 -5.475000381469726562e+01 -1.036364999999999981e+00 -5.468750381469726562e+01 -1.036370000000000013e+00 -5.465625381469726562e+01 -1.036375000000000046e+00 -5.471875000000000000e+01 -1.036380000000000079e+00 -5.456250000000000000e+01 -1.036385000000000112e+00 -5.462500000000000000e+01 -1.036390000000000144e+00 -5.459375381469726562e+01 -1.036395000000000177e+00 -5.453125381469726562e+01 -1.036399999999999988e+00 -5.453125381469726562e+01 -1.036405000000000021e+00 -5.453125381469726562e+01 -1.036410000000000053e+00 -5.453125381469726562e+01 -1.036415000000000086e+00 -5.459375381469726562e+01 -1.036420000000000119e+00 -5.450000381469726562e+01 -1.036425000000000152e+00 -5.450000381469726562e+01 -1.036430000000000184e+00 -5.446875000000000000e+01 -1.036434999999999995e+00 -5.450000381469726562e+01 -1.036440000000000028e+00 -5.443750381469726562e+01 -1.036445000000000061e+00 -5.440625000000000000e+01 -1.036450000000000093e+00 -5.440625000000000000e+01 -1.036455000000000126e+00 -5.446875000000000000e+01 -1.036460000000000159e+00 -5.437500381469726562e+01 -1.036465000000000192e+00 -5.437500381469726562e+01 -1.036470000000000002e+00 -5.440625000000000000e+01 -1.036475000000000035e+00 -5.443750381469726562e+01 -1.036480000000000068e+00 -5.434375381469726562e+01 -1.036485000000000101e+00 -5.434375381469726562e+01 -1.036490000000000133e+00 -5.428125381469726562e+01 -1.036495000000000166e+00 -5.428125381469726562e+01 -1.036499999999999977e+00 -5.425000000000000000e+01 -1.036505000000000010e+00 -5.428125381469726562e+01 -1.036510000000000042e+00 -5.428125381469726562e+01 -1.036515000000000075e+00 -5.428125381469726562e+01 -1.036520000000000108e+00 -5.421875381469726562e+01 -1.036525000000000141e+00 -5.418750381469726562e+01 -1.036530000000000173e+00 -5.425000000000000000e+01 -1.036534999999999984e+00 -5.418750381469726562e+01 -1.036540000000000017e+00 -5.415625000000000000e+01 -1.036545000000000050e+00 -5.415625000000000000e+01 -1.036550000000000082e+00 -5.415625000000000000e+01 -1.036555000000000115e+00 -5.400000000000000000e+01 -1.036560000000000148e+00 -5.403125381469726562e+01 -1.036565000000000181e+00 -5.400000000000000000e+01 -1.036569999999999991e+00 -5.400000000000000000e+01 -1.036575000000000024e+00 -5.396875381469726562e+01 -1.036580000000000057e+00 -5.400000000000000000e+01 -1.036585000000000090e+00 -5.400000000000000000e+01 -1.036590000000000122e+00 -5.396875381469726562e+01 -1.036595000000000155e+00 -5.400000000000000000e+01 -1.036600000000000188e+00 -5.393750381469726562e+01 -1.036604999999999999e+00 -5.393750381469726562e+01 -1.036610000000000031e+00 -5.396875381469726562e+01 -1.036615000000000064e+00 -5.393750381469726562e+01 -1.036620000000000097e+00 -5.396875381469726562e+01 -1.036625000000000130e+00 -5.396875381469726562e+01 -1.036630000000000162e+00 -5.390625000000000000e+01 -1.036635000000000195e+00 -5.381250381469726562e+01 -1.036640000000000006e+00 -5.387500381469726562e+01 -1.036645000000000039e+00 -5.381250381469726562e+01 -1.036650000000000071e+00 -5.381250381469726562e+01 -1.036655000000000104e+00 -5.381250381469726562e+01 -1.036660000000000137e+00 -5.378125381469726562e+01 -1.036665000000000170e+00 -5.371875381469726562e+01 -1.036669999999999980e+00 -5.371875381469726562e+01 -1.036675000000000013e+00 -5.375000000000000000e+01 -1.036680000000000046e+00 -5.368750000000000000e+01 -1.036685000000000079e+00 -5.368750000000000000e+01 -1.036690000000000111e+00 -5.365625381469726562e+01 -1.036695000000000144e+00 -5.368750000000000000e+01 -1.036700000000000177e+00 -5.368750000000000000e+01 -1.036704999999999988e+00 -5.378125381469726562e+01 -1.036710000000000020e+00 -5.365625381469726562e+01 -1.036715000000000053e+00 -5.362500381469726562e+01 -1.036720000000000086e+00 -5.368750000000000000e+01 -1.036725000000000119e+00 -5.362500381469726562e+01 -1.036730000000000151e+00 -5.365625381469726562e+01 -1.036735000000000184e+00 -5.356250381469726562e+01 -1.036739999999999995e+00 -5.359375000000000000e+01 -1.036745000000000028e+00 -5.359375000000000000e+01 -1.036750000000000060e+00 -5.356250381469726562e+01 -1.036755000000000093e+00 -5.350000381469726562e+01 -1.036760000000000126e+00 -5.350000381469726562e+01 -1.036765000000000159e+00 -5.353125000000000000e+01 -1.036770000000000191e+00 -5.350000381469726562e+01 -1.036775000000000002e+00 -5.350000381469726562e+01 -1.036780000000000035e+00 -5.346875381469726562e+01 -1.036785000000000068e+00 -5.350000381469726562e+01 -1.036790000000000100e+00 -5.346875381469726562e+01 -1.036795000000000133e+00 -5.346875381469726562e+01 -1.036800000000000166e+00 -5.346875381469726562e+01 -1.036804999999999977e+00 -5.343750000000000000e+01 -1.036810000000000009e+00 -5.343750000000000000e+01 -1.036815000000000042e+00 -5.337500381469726562e+01 -1.036820000000000075e+00 -5.340625381469726562e+01 -1.036825000000000108e+00 -5.334375381469726562e+01 -1.036830000000000140e+00 -5.337500381469726562e+01 -1.036835000000000173e+00 -5.334375381469726562e+01 -1.036839999999999984e+00 -5.334375381469726562e+01 -1.036845000000000017e+00 -5.325000381469726562e+01 -1.036850000000000049e+00 -5.334375381469726562e+01 -1.036855000000000082e+00 -5.331250381469726562e+01 -1.036860000000000115e+00 -5.328125000000000000e+01 -1.036865000000000148e+00 -5.325000381469726562e+01 -1.036870000000000180e+00 -5.328125000000000000e+01 -1.036874999999999991e+00 -5.328125000000000000e+01 -1.036880000000000024e+00 -5.321875381469726562e+01 -1.036885000000000057e+00 -5.331250381469726562e+01 -1.036890000000000089e+00 -5.325000381469726562e+01 -1.036895000000000122e+00 -5.315625381469726562e+01 -1.036900000000000155e+00 -5.321875381469726562e+01 -1.036905000000000188e+00 -5.318750000000000000e+01 -1.036909999999999998e+00 -5.315625381469726562e+01 -1.036915000000000031e+00 -5.315625381469726562e+01 -1.036920000000000064e+00 -5.315625381469726562e+01 -1.036925000000000097e+00 -5.312500000000000000e+01 -1.036930000000000129e+00 -5.309375381469726562e+01 -1.036935000000000162e+00 -5.309375381469726562e+01 -1.036940000000000195e+00 -5.309375381469726562e+01 -1.036945000000000006e+00 -5.312500000000000000e+01 -1.036950000000000038e+00 -5.300000381469726562e+01 -1.036955000000000071e+00 -5.303125000000000000e+01 -1.036960000000000104e+00 -5.300000381469726562e+01 -1.036965000000000137e+00 -5.296875000000000000e+01 -1.036970000000000169e+00 -5.300000381469726562e+01 -1.036974999999999980e+00 -5.300000381469726562e+01 -1.036980000000000013e+00 -5.300000381469726562e+01 -1.036985000000000046e+00 -5.296875000000000000e+01 -1.036990000000000078e+00 -5.290625381469726562e+01 -1.036995000000000111e+00 -5.290625381469726562e+01 -1.037000000000000144e+00 -5.293750381469726562e+01 -1.037005000000000177e+00 -5.284375381469726562e+01 -1.037009999999999987e+00 -5.284375381469726562e+01 -1.037015000000000020e+00 -5.284375381469726562e+01 -1.037020000000000053e+00 -5.284375381469726562e+01 -1.037025000000000086e+00 -5.293750381469726562e+01 -1.037030000000000118e+00 -5.287500000000000000e+01 -1.037035000000000151e+00 -5.284375381469726562e+01 -1.037040000000000184e+00 -5.278125381469726562e+01 -1.037044999999999995e+00 -5.281250000000000000e+01 -1.037050000000000027e+00 -5.278125381469726562e+01 -1.037055000000000060e+00 -5.284375381469726562e+01 -1.037060000000000093e+00 -5.281250000000000000e+01 -1.037065000000000126e+00 -5.278125381469726562e+01 -1.037070000000000158e+00 -5.275000381469726562e+01 -1.037075000000000191e+00 -5.268750381469726562e+01 -1.037080000000000002e+00 -5.268750381469726562e+01 -1.037085000000000035e+00 -5.271875000000000000e+01 -1.037090000000000067e+00 -5.268750381469726562e+01 -1.037095000000000100e+00 -5.268750381469726562e+01 -1.037100000000000133e+00 -5.265625381469726562e+01 -1.037105000000000166e+00 -5.268750381469726562e+01 -1.037109999999999976e+00 -5.268750381469726562e+01 -1.037115000000000009e+00 -5.268750381469726562e+01 -1.037120000000000042e+00 -5.262500381469726562e+01 -1.037125000000000075e+00 -5.265625381469726562e+01 -1.037130000000000107e+00 -5.256250000000000000e+01 -1.037135000000000140e+00 -5.250000381469726562e+01 -1.037140000000000173e+00 -5.256250000000000000e+01 -1.037144999999999984e+00 -5.250000381469726562e+01 -1.037150000000000016e+00 -5.253125381469726562e+01 -1.037155000000000049e+00 -5.250000381469726562e+01 -1.037160000000000082e+00 -5.253125381469726562e+01 -1.037165000000000115e+00 -5.246875381469726562e+01 -1.037170000000000147e+00 -5.250000381469726562e+01 -1.037175000000000180e+00 -5.243750381469726562e+01 -1.037179999999999991e+00 -5.246875381469726562e+01 -1.037185000000000024e+00 -5.243750381469726562e+01 -1.037190000000000056e+00 -5.243750381469726562e+01 -1.037195000000000089e+00 -5.243750381469726562e+01 -1.037200000000000122e+00 -5.234375381469726562e+01 -1.037205000000000155e+00 -5.240625000000000000e+01 -1.037210000000000187e+00 -5.237500381469726562e+01 -1.037214999999999998e+00 -5.231250000000000000e+01 -1.037220000000000031e+00 -5.231250000000000000e+01 -1.037225000000000064e+00 -5.234375381469726562e+01 -1.037230000000000096e+00 -5.234375381469726562e+01 -1.037235000000000129e+00 -5.228125381469726562e+01 -1.037240000000000162e+00 -5.228125381469726562e+01 -1.037245000000000195e+00 -5.225000000000000000e+01 -1.037250000000000005e+00 -5.221875381469726562e+01 -1.037255000000000038e+00 -5.225000000000000000e+01 -1.037260000000000071e+00 -5.215625000000000000e+01 -1.037265000000000104e+00 -5.228125381469726562e+01 -1.037270000000000136e+00 -5.228125381469726562e+01 -1.037275000000000169e+00 -5.228125381469726562e+01 -1.037279999999999980e+00 -5.221875381469726562e+01 -1.037285000000000013e+00 -5.221875381469726562e+01 -1.037290000000000045e+00 -5.218750381469726562e+01 -1.037295000000000078e+00 -5.215625000000000000e+01 -1.037300000000000111e+00 -5.218750381469726562e+01 -1.037305000000000144e+00 -5.209375000000000000e+01 -1.037310000000000176e+00 -5.212500381469726562e+01 -1.037314999999999987e+00 -5.212500381469726562e+01 -1.037320000000000020e+00 -5.209375000000000000e+01 -1.037325000000000053e+00 -5.215625000000000000e+01 -1.037330000000000085e+00 -5.209375000000000000e+01 -1.037335000000000118e+00 -5.206250381469726562e+01 -1.037340000000000151e+00 -5.215625000000000000e+01 -1.037345000000000184e+00 -5.203125381469726562e+01 -1.037349999999999994e+00 -5.200000000000000000e+01 -1.037355000000000027e+00 -5.203125381469726562e+01 -1.037360000000000060e+00 -5.193750000000000000e+01 -1.037365000000000093e+00 -5.196875381469726562e+01 -1.037370000000000125e+00 -5.196875381469726562e+01 -1.037375000000000158e+00 -5.196875381469726562e+01 -1.037380000000000191e+00 -5.196875381469726562e+01 -1.037385000000000002e+00 -5.193750000000000000e+01 -1.037390000000000034e+00 -5.196875381469726562e+01 -1.037395000000000067e+00 -5.190625381469726562e+01 -1.037400000000000100e+00 -5.190625381469726562e+01 -1.037405000000000133e+00 -5.193750000000000000e+01 -1.037410000000000165e+00 -5.187500381469726562e+01 -1.037414999999999976e+00 -5.187500381469726562e+01 -1.037420000000000009e+00 -5.190625381469726562e+01 -1.037425000000000042e+00 -5.184375000000000000e+01 -1.037430000000000074e+00 -5.181250381469726562e+01 -1.037435000000000107e+00 -5.184375000000000000e+01 -1.037440000000000140e+00 -5.181250381469726562e+01 -1.037445000000000173e+00 -5.181250381469726562e+01 -1.037449999999999983e+00 -5.181250381469726562e+01 -1.037455000000000016e+00 -5.175000381469726562e+01 -1.037460000000000049e+00 -5.181250381469726562e+01 -1.037465000000000082e+00 -5.181250381469726562e+01 -1.037470000000000114e+00 -5.181250381469726562e+01 -1.037475000000000147e+00 -5.178125381469726562e+01 -1.037480000000000180e+00 -5.175000381469726562e+01 -1.037484999999999991e+00 -5.175000381469726562e+01 -1.037490000000000023e+00 -5.162500381469726562e+01 -1.037495000000000056e+00 -5.171875381469726562e+01 -1.037500000000000089e+00 -5.168750000000000000e+01 -1.037505000000000122e+00 -5.165625381469726562e+01 -1.037510000000000154e+00 -5.162500381469726562e+01 -1.037515000000000187e+00 -5.162500381469726562e+01 -1.037519999999999998e+00 -5.156250381469726562e+01 -1.037525000000000031e+00 -5.159375000000000000e+01 -1.037530000000000063e+00 -5.153125000000000000e+01 -1.037535000000000096e+00 -5.156250381469726562e+01 -1.037540000000000129e+00 -5.150000381469726562e+01 -1.037545000000000162e+00 -5.153125000000000000e+01 -1.037550000000000194e+00 -5.150000381469726562e+01 -1.037555000000000005e+00 -5.150000381469726562e+01 -1.037560000000000038e+00 -5.150000381469726562e+01 -1.037565000000000071e+00 -5.146875381469726562e+01 -1.037570000000000103e+00 -5.146875381469726562e+01 -1.037575000000000136e+00 -5.146875381469726562e+01 -1.037580000000000169e+00 -5.146875381469726562e+01 -1.037584999999999980e+00 -5.140625381469726562e+01 -1.037590000000000012e+00 -5.143750000000000000e+01 -1.037595000000000045e+00 -5.146875381469726562e+01 -1.037600000000000078e+00 -5.134375381469726562e+01 -1.037605000000000111e+00 -5.134375381469726562e+01 -1.037610000000000143e+00 -5.137500000000000000e+01 -1.037615000000000176e+00 -5.137500000000000000e+01 -1.037619999999999987e+00 -5.134375381469726562e+01 -1.037625000000000020e+00 -5.134375381469726562e+01 -1.037630000000000052e+00 -5.134375381469726562e+01 -1.037635000000000085e+00 -5.131250381469726562e+01 -1.037640000000000118e+00 -5.131250381469726562e+01 -1.037645000000000151e+00 -5.128125000000000000e+01 -1.037650000000000183e+00 -5.131250381469726562e+01 -1.037654999999999994e+00 -5.125000381469726562e+01 -1.037660000000000027e+00 -5.121875000000000000e+01 -1.037665000000000060e+00 -5.115625381469726562e+01 -1.037670000000000092e+00 -5.115625381469726562e+01 -1.037675000000000125e+00 -5.115625381469726562e+01 -1.037680000000000158e+00 -5.115625381469726562e+01 -1.037685000000000191e+00 -5.125000381469726562e+01 -1.037690000000000001e+00 -5.112500000000000000e+01 -1.037695000000000034e+00 -5.109375381469726562e+01 -1.037700000000000067e+00 -5.115625381469726562e+01 -1.037705000000000100e+00 -5.112500000000000000e+01 -1.037710000000000132e+00 -5.112500000000000000e+01 -1.037715000000000165e+00 -5.109375381469726562e+01 -1.037719999999999976e+00 -5.109375381469726562e+01 -1.037725000000000009e+00 -5.103125381469726562e+01 -1.037730000000000041e+00 -5.103125381469726562e+01 -1.037735000000000074e+00 -5.100000381469726562e+01 -1.037740000000000107e+00 -5.103125381469726562e+01 -1.037745000000000140e+00 -5.100000381469726562e+01 -1.037750000000000172e+00 -5.100000381469726562e+01 -1.037754999999999983e+00 -5.100000381469726562e+01 -1.037760000000000016e+00 -5.100000381469726562e+01 -1.037765000000000049e+00 -5.096875000000000000e+01 -1.037770000000000081e+00 -5.093750381469726562e+01 -1.037775000000000114e+00 -5.090625381469726562e+01 -1.037780000000000147e+00 -5.090625381469726562e+01 -1.037785000000000180e+00 -5.087500000000000000e+01 -1.037789999999999990e+00 -5.090625381469726562e+01 -1.037795000000000023e+00 -5.090625381469726562e+01 -1.037800000000000056e+00 -5.081250000000000000e+01 -1.037805000000000089e+00 -5.084375381469726562e+01 -1.037810000000000121e+00 -5.084375381469726562e+01 -1.037815000000000154e+00 -5.078125381469726562e+01 -1.037820000000000187e+00 -5.081250000000000000e+01 -1.037824999999999998e+00 -5.084375381469726562e+01 -1.037830000000000030e+00 -5.075000381469726562e+01 -1.037835000000000063e+00 -5.075000381469726562e+01 -1.037840000000000096e+00 -5.078125381469726562e+01 -1.037845000000000129e+00 -5.078125381469726562e+01 -1.037850000000000161e+00 -5.071875000000000000e+01 -1.037855000000000194e+00 -5.068750381469726562e+01 -1.037860000000000005e+00 -5.075000381469726562e+01 -1.037865000000000038e+00 -5.065625000000000000e+01 -1.037870000000000070e+00 -5.071875000000000000e+01 -1.037875000000000103e+00 -5.068750381469726562e+01 -1.037880000000000136e+00 -5.062500381469726562e+01 -1.037885000000000169e+00 -5.068750381469726562e+01 -1.037889999999999979e+00 -5.065625000000000000e+01 -1.037895000000000012e+00 -5.068750381469726562e+01 -1.037900000000000045e+00 -5.065625000000000000e+01 -1.037905000000000078e+00 -5.068750381469726562e+01 -1.037910000000000110e+00 -5.059375381469726562e+01 -1.037915000000000143e+00 -5.062500381469726562e+01 -1.037920000000000176e+00 -5.059375381469726562e+01 -1.037924999999999986e+00 -5.053125381469726562e+01 -1.037930000000000019e+00 -5.053125381469726562e+01 -1.037935000000000052e+00 -5.050000000000000000e+01 -1.037940000000000085e+00 -5.059375381469726562e+01 -1.037945000000000118e+00 -5.050000000000000000e+01 -1.037950000000000150e+00 -5.050000000000000000e+01 -1.037955000000000183e+00 -5.050000000000000000e+01 -1.037959999999999994e+00 -5.050000000000000000e+01 -1.037965000000000027e+00 -5.050000000000000000e+01 -1.037970000000000059e+00 -5.043750381469726562e+01 -1.037975000000000092e+00 -5.046875381469726562e+01 -1.037980000000000125e+00 -5.046875381469726562e+01 -1.037985000000000158e+00 -5.040625000000000000e+01 -1.037990000000000190e+00 -5.046875381469726562e+01 -1.037995000000000001e+00 -5.040625000000000000e+01 -1.038000000000000034e+00 -5.043750381469726562e+01 -1.038005000000000067e+00 -5.040625000000000000e+01 -1.038010000000000099e+00 -5.034375000000000000e+01 -1.038015000000000132e+00 -5.040625000000000000e+01 -1.038020000000000165e+00 -5.037500381469726562e+01 -1.038024999999999975e+00 -5.040625000000000000e+01 -1.038030000000000008e+00 -5.031250381469726562e+01 -1.038035000000000041e+00 -5.034375000000000000e+01 -1.038040000000000074e+00 -5.037500381469726562e+01 -1.038045000000000107e+00 -5.031250381469726562e+01 -1.038050000000000139e+00 -5.034375000000000000e+01 -1.038055000000000172e+00 -5.028125381469726562e+01 -1.038059999999999983e+00 -5.025000000000000000e+01 -1.038065000000000015e+00 -5.028125381469726562e+01 -1.038070000000000048e+00 -5.031250381469726562e+01 -1.038075000000000081e+00 -5.028125381469726562e+01 -1.038080000000000114e+00 -5.018750381469726562e+01 -1.038085000000000147e+00 -5.021875381469726562e+01 -1.038090000000000179e+00 -5.028125381469726562e+01 -1.038094999999999990e+00 -5.021875381469726562e+01 -1.038100000000000023e+00 -5.018750381469726562e+01 -1.038105000000000055e+00 -5.012500381469726562e+01 -1.038110000000000088e+00 -5.015625000000000000e+01 -1.038115000000000121e+00 -5.012500381469726562e+01 -1.038120000000000154e+00 -5.015625000000000000e+01 -1.038125000000000187e+00 -5.009375000000000000e+01 -1.038129999999999997e+00 -5.012500381469726562e+01 -1.038135000000000030e+00 -5.003125381469726562e+01 -1.038140000000000063e+00 -5.009375000000000000e+01 -1.038145000000000095e+00 -5.009375000000000000e+01 -1.038150000000000128e+00 -5.009375000000000000e+01 -1.038155000000000161e+00 -5.003125381469726562e+01 -1.038160000000000194e+00 -5.006250381469726562e+01 -1.038165000000000004e+00 -5.006250381469726562e+01 -1.038170000000000037e+00 -5.003125381469726562e+01 -1.038175000000000070e+00 -5.003125381469726562e+01 -1.038180000000000103e+00 -5.000000000000000000e+01 -1.038185000000000136e+00 -5.003125381469726562e+01 -1.038190000000000168e+00 -5.003125381469726562e+01 -1.038194999999999979e+00 -4.993750000000000000e+01 -1.038200000000000012e+00 -4.996875381469726562e+01 -1.038205000000000044e+00 -4.996875381469726562e+01 -1.038210000000000077e+00 -4.996875381469726562e+01 -1.038215000000000110e+00 -4.993750000000000000e+01 -1.038220000000000143e+00 -4.990625381469726562e+01 -1.038225000000000176e+00 -4.993750000000000000e+01 -1.038229999999999986e+00 -4.984375000000000000e+01 -1.038235000000000019e+00 -4.996875381469726562e+01 -1.038240000000000052e+00 -4.987500381469726562e+01 -1.038245000000000084e+00 -4.987500381469726562e+01 -1.038250000000000117e+00 -4.993750000000000000e+01 -1.038255000000000150e+00 -4.990625381469726562e+01 -1.038260000000000183e+00 -4.984375000000000000e+01 -1.038264999999999993e+00 -4.984375000000000000e+01 -1.038270000000000026e+00 -4.984375000000000000e+01 -1.038275000000000059e+00 -4.981250381469726562e+01 -1.038280000000000092e+00 -4.981250381469726562e+01 -1.038285000000000124e+00 -4.975000381469726562e+01 -1.038290000000000157e+00 -4.975000381469726562e+01 -1.038295000000000190e+00 -4.990625381469726562e+01 -1.038300000000000001e+00 -4.968750000000000000e+01 -1.038305000000000033e+00 -4.978125000000000000e+01 -1.038310000000000066e+00 -4.975000381469726562e+01 -1.038315000000000099e+00 -4.978125000000000000e+01 -1.038320000000000132e+00 -4.975000381469726562e+01 -1.038325000000000164e+00 -4.968750000000000000e+01 -1.038329999999999975e+00 -4.975000381469726562e+01 -1.038335000000000008e+00 -4.971875381469726562e+01 -1.038340000000000041e+00 -4.971875381469726562e+01 -1.038345000000000073e+00 -4.971875381469726562e+01 -1.038350000000000106e+00 -4.971875381469726562e+01 -1.038355000000000139e+00 -4.968750000000000000e+01 -1.038360000000000172e+00 -4.965625381469726562e+01 -1.038364999999999982e+00 -4.971875381469726562e+01 -1.038370000000000015e+00 -4.959375381469726562e+01 -1.038375000000000048e+00 -4.959375381469726562e+01 -1.038380000000000081e+00 -4.965625381469726562e+01 -1.038385000000000113e+00 -4.962500000000000000e+01 -1.038390000000000146e+00 -4.962500000000000000e+01 -1.038395000000000179e+00 -4.962500000000000000e+01 -1.038399999999999990e+00 -4.959375381469726562e+01 -1.038405000000000022e+00 -4.959375381469726562e+01 -1.038410000000000055e+00 -4.956250381469726562e+01 -1.038415000000000088e+00 -4.956250381469726562e+01 -1.038420000000000121e+00 -4.956250381469726562e+01 -1.038425000000000153e+00 -4.950000381469726562e+01 -1.038430000000000186e+00 -4.950000381469726562e+01 -1.038434999999999997e+00 -4.950000381469726562e+01 -1.038440000000000030e+00 -4.950000381469726562e+01 -1.038445000000000062e+00 -4.946875381469726562e+01 -1.038450000000000095e+00 -4.950000381469726562e+01 -1.038455000000000128e+00 -4.950000381469726562e+01 -1.038460000000000161e+00 -4.950000381469726562e+01 -1.038465000000000193e+00 -4.950000381469726562e+01 -1.038470000000000004e+00 -4.953125000000000000e+01 -1.038475000000000037e+00 -4.950000381469726562e+01 -1.038480000000000070e+00 -4.950000381469726562e+01 -1.038485000000000102e+00 -4.950000381469726562e+01 -1.038490000000000135e+00 -4.950000381469726562e+01 -1.038495000000000168e+00 -4.946875381469726562e+01 -1.038499999999999979e+00 -4.943750000000000000e+01 -1.038505000000000011e+00 -4.940625381469726562e+01 -1.038510000000000044e+00 -4.940625381469726562e+01 -1.038515000000000077e+00 -4.937500000000000000e+01 -1.038520000000000110e+00 -4.937500000000000000e+01 -1.038525000000000142e+00 -4.934375381469726562e+01 -1.038530000000000175e+00 -4.943750000000000000e+01 -1.038534999999999986e+00 -4.937500000000000000e+01 -1.038540000000000019e+00 -4.934375381469726562e+01 -1.038545000000000051e+00 -4.940625381469726562e+01 -1.038550000000000084e+00 -4.934375381469726562e+01 -1.038555000000000117e+00 -4.934375381469726562e+01 -1.038560000000000150e+00 -4.934375381469726562e+01 -1.038565000000000182e+00 -4.928125000000000000e+01 -1.038569999999999993e+00 -4.931250381469726562e+01 -1.038575000000000026e+00 -4.934375381469726562e+01 -1.038580000000000059e+00 -4.931250381469726562e+01 -1.038585000000000091e+00 -4.928125000000000000e+01 -1.038590000000000124e+00 -4.928125000000000000e+01 -1.038595000000000157e+00 -4.934375381469726562e+01 -1.038600000000000190e+00 -4.931250381469726562e+01 -1.038605000000000000e+00 -4.934375381469726562e+01 -1.038610000000000033e+00 -4.931250381469726562e+01 -1.038615000000000066e+00 -4.928125000000000000e+01 -1.038620000000000099e+00 -4.928125000000000000e+01 -1.038625000000000131e+00 -4.925000381469726562e+01 -1.038630000000000164e+00 -4.925000381469726562e+01 -1.038634999999999975e+00 -4.928125000000000000e+01 -1.038640000000000008e+00 -4.921875000000000000e+01 -1.038645000000000040e+00 -4.915625381469726562e+01 -1.038650000000000073e+00 -4.921875000000000000e+01 -1.038655000000000106e+00 -4.921875000000000000e+01 -1.038660000000000139e+00 -4.921875000000000000e+01 -1.038665000000000171e+00 -4.918750381469726562e+01 -1.038669999999999982e+00 -4.915625381469726562e+01 -1.038675000000000015e+00 -4.915625381469726562e+01 -1.038680000000000048e+00 -4.912500000000000000e+01 -1.038685000000000080e+00 -4.915625381469726562e+01 -1.038690000000000113e+00 -4.912500000000000000e+01 -1.038695000000000146e+00 -4.918750381469726562e+01 -1.038700000000000179e+00 -4.915625381469726562e+01 -1.038704999999999989e+00 -4.915625381469726562e+01 -1.038710000000000022e+00 -4.915625381469726562e+01 -1.038715000000000055e+00 -4.909375381469726562e+01 -1.038720000000000088e+00 -4.906250000000000000e+01 -1.038725000000000120e+00 -4.918750381469726562e+01 -1.038730000000000153e+00 -4.906250000000000000e+01 -1.038735000000000186e+00 -4.903125381469726562e+01 -1.038739999999999997e+00 -4.909375381469726562e+01 -1.038745000000000029e+00 -4.906250000000000000e+01 -1.038750000000000062e+00 -4.906250000000000000e+01 -1.038755000000000095e+00 -4.909375381469726562e+01 -1.038760000000000128e+00 -4.906250000000000000e+01 -1.038765000000000160e+00 -4.909375381469726562e+01 -1.038770000000000193e+00 -4.906250000000000000e+01 -1.038775000000000004e+00 -4.900000381469726562e+01 -1.038780000000000037e+00 -4.903125381469726562e+01 -1.038785000000000069e+00 -4.900000381469726562e+01 -1.038790000000000102e+00 -4.900000381469726562e+01 -1.038795000000000135e+00 -4.903125381469726562e+01 -1.038800000000000168e+00 -4.900000381469726562e+01 -1.038804999999999978e+00 -4.906250000000000000e+01 -1.038810000000000011e+00 -4.900000381469726562e+01 -1.038815000000000044e+00 -4.900000381469726562e+01 -1.038820000000000077e+00 -4.896875000000000000e+01 -1.038825000000000109e+00 -4.900000381469726562e+01 -1.038830000000000142e+00 -4.900000381469726562e+01 -1.038835000000000175e+00 -4.896875000000000000e+01 -1.038839999999999986e+00 -4.893750381469726562e+01 -1.038845000000000018e+00 -4.900000381469726562e+01 -1.038850000000000051e+00 -4.890625000000000000e+01 -1.038855000000000084e+00 -4.890625000000000000e+01 -1.038860000000000117e+00 -4.890625000000000000e+01 -1.038865000000000149e+00 -4.896875000000000000e+01 -1.038870000000000182e+00 -4.890625000000000000e+01 -1.038874999999999993e+00 -4.887500381469726562e+01 -1.038880000000000026e+00 -4.890625000000000000e+01 -1.038885000000000058e+00 -4.890625000000000000e+01 -1.038890000000000091e+00 -4.884375381469726562e+01 -1.038895000000000124e+00 -4.884375381469726562e+01 -1.038900000000000157e+00 -4.884375381469726562e+01 -1.038905000000000189e+00 -4.887500381469726562e+01 -1.038910000000000000e+00 -4.893750381469726562e+01 -1.038915000000000033e+00 -4.884375381469726562e+01 -1.038920000000000066e+00 -4.881250000000000000e+01 -1.038925000000000098e+00 -4.887500381469726562e+01 -1.038930000000000131e+00 -4.881250000000000000e+01 -1.038935000000000164e+00 -4.884375381469726562e+01 -1.038939999999999975e+00 -4.884375381469726562e+01 -1.038945000000000007e+00 -4.884375381469726562e+01 -1.038950000000000040e+00 -4.878125381469726562e+01 -1.038955000000000073e+00 -4.875000381469726562e+01 -1.038960000000000106e+00 -4.875000381469726562e+01 -1.038965000000000138e+00 -4.878125381469726562e+01 -1.038970000000000171e+00 -4.871875000000000000e+01 -1.038974999999999982e+00 -4.881250000000000000e+01 -1.038980000000000015e+00 -4.871875000000000000e+01 -1.038985000000000047e+00 -4.871875000000000000e+01 -1.038990000000000080e+00 -4.871875000000000000e+01 -1.038995000000000113e+00 -4.878125381469726562e+01 -1.039000000000000146e+00 -4.868750381469726562e+01 -1.039005000000000178e+00 -4.871875000000000000e+01 -1.039009999999999989e+00 -4.868750381469726562e+01 -1.039015000000000022e+00 -4.871875000000000000e+01 -1.039020000000000055e+00 -4.865625000000000000e+01 -1.039025000000000087e+00 -4.871875000000000000e+01 -1.039030000000000120e+00 -4.862500381469726562e+01 -1.039035000000000153e+00 -4.865625000000000000e+01 -1.039040000000000186e+00 -4.862500381469726562e+01 -1.039044999999999996e+00 -4.865625000000000000e+01 -1.039050000000000029e+00 -4.871875000000000000e+01 -1.039055000000000062e+00 -4.865625000000000000e+01 -1.039060000000000095e+00 -4.862500381469726562e+01 -1.039065000000000127e+00 -4.862500381469726562e+01 -1.039070000000000160e+00 -4.865625000000000000e+01 -1.039075000000000193e+00 -4.865625000000000000e+01 -1.039080000000000004e+00 -4.859375381469726562e+01 -1.039085000000000036e+00 -4.859375381469726562e+01 -1.039090000000000069e+00 -4.859375381469726562e+01 -1.039095000000000102e+00 -4.859375381469726562e+01 -1.039100000000000135e+00 -4.856250000000000000e+01 -1.039105000000000167e+00 -4.859375381469726562e+01 -1.039109999999999978e+00 -4.853125381469726562e+01 -1.039115000000000011e+00 -4.856250000000000000e+01 -1.039120000000000044e+00 -4.859375381469726562e+01 -1.039125000000000076e+00 -4.862500381469726562e+01 -1.039130000000000109e+00 -4.853125381469726562e+01 -1.039135000000000142e+00 -4.859375381469726562e+01 -1.039140000000000175e+00 -4.853125381469726562e+01 -1.039144999999999985e+00 -4.853125381469726562e+01 -1.039150000000000018e+00 -4.853125381469726562e+01 -1.039155000000000051e+00 -4.850000000000000000e+01 -1.039160000000000084e+00 -4.850000000000000000e+01 -1.039165000000000116e+00 -4.853125381469726562e+01 -1.039170000000000149e+00 -4.843750381469726562e+01 -1.039175000000000182e+00 -4.853125381469726562e+01 -1.039179999999999993e+00 -4.846875381469726562e+01 -1.039185000000000025e+00 -4.850000000000000000e+01 -1.039190000000000058e+00 -4.843750381469726562e+01 -1.039195000000000091e+00 -4.837500381469726562e+01 -1.039200000000000124e+00 -4.843750381469726562e+01 -1.039205000000000156e+00 -4.846875381469726562e+01 -1.039210000000000189e+00 -4.843750381469726562e+01 -1.039215000000000000e+00 -4.843750381469726562e+01 -1.039220000000000033e+00 -4.840625000000000000e+01 -1.039225000000000065e+00 -4.843750381469726562e+01 -1.039230000000000098e+00 -4.840625000000000000e+01 -1.039235000000000131e+00 -4.843750381469726562e+01 -1.039240000000000164e+00 -4.840625000000000000e+01 -1.039244999999999974e+00 -4.837500381469726562e+01 -1.039250000000000007e+00 -4.846875381469726562e+01 -1.039255000000000040e+00 -4.834375000000000000e+01 -1.039260000000000073e+00 -4.837500381469726562e+01 -1.039265000000000105e+00 -4.834375000000000000e+01 -1.039270000000000138e+00 -4.837500381469726562e+01 -1.039275000000000171e+00 -4.840625000000000000e+01 -1.039279999999999982e+00 -4.831250381469726562e+01 -1.039285000000000014e+00 -4.834375000000000000e+01 -1.039290000000000047e+00 -4.834375000000000000e+01 -1.039295000000000080e+00 -4.828125381469726562e+01 -1.039300000000000113e+00 -4.828125381469726562e+01 -1.039305000000000145e+00 -4.834375000000000000e+01 -1.039310000000000178e+00 -4.831250381469726562e+01 -1.039314999999999989e+00 -4.834375000000000000e+01 -1.039320000000000022e+00 -4.828125381469726562e+01 -1.039325000000000054e+00 -4.828125381469726562e+01 -1.039330000000000087e+00 -4.828125381469726562e+01 -1.039335000000000120e+00 -4.825000000000000000e+01 -1.039340000000000153e+00 -4.821875381469726562e+01 -1.039345000000000185e+00 -4.821875381469726562e+01 -1.039349999999999996e+00 -4.828125381469726562e+01 -1.039355000000000029e+00 -4.818750000000000000e+01 -1.039360000000000062e+00 -4.818750000000000000e+01 -1.039365000000000094e+00 -4.821875381469726562e+01 -1.039370000000000127e+00 -4.828125381469726562e+01 -1.039375000000000160e+00 -4.821875381469726562e+01 -1.039380000000000193e+00 -4.818750000000000000e+01 -1.039385000000000003e+00 -4.815625381469726562e+01 -1.039390000000000036e+00 -4.818750000000000000e+01 -1.039395000000000069e+00 -4.815625381469726562e+01 -1.039400000000000102e+00 -4.815625381469726562e+01 -1.039405000000000134e+00 -4.815625381469726562e+01 -1.039410000000000167e+00 -4.818750000000000000e+01 -1.039414999999999978e+00 -4.815625381469726562e+01 -1.039420000000000011e+00 -4.815625381469726562e+01 -1.039425000000000043e+00 -4.818750000000000000e+01 -1.039430000000000076e+00 -4.812500381469726562e+01 -1.039435000000000109e+00 -4.809375000000000000e+01 -1.039440000000000142e+00 -4.815625381469726562e+01 -1.039445000000000174e+00 -4.809375000000000000e+01 -1.039449999999999985e+00 -4.809375000000000000e+01 -1.039455000000000018e+00 -4.812500381469726562e+01 -1.039460000000000051e+00 -4.803125000000000000e+01 -1.039465000000000083e+00 -4.812500381469726562e+01 -1.039470000000000116e+00 -4.796875381469726562e+01 -1.039475000000000149e+00 -4.803125000000000000e+01 -1.039480000000000182e+00 -4.803125000000000000e+01 -1.039484999999999992e+00 -4.803125000000000000e+01 -1.039490000000000025e+00 -4.796875381469726562e+01 -1.039495000000000058e+00 -4.800000000000000000e+01 -1.039500000000000091e+00 -4.793750000000000000e+01 -1.039505000000000123e+00 -4.803125000000000000e+01 -1.039510000000000156e+00 -4.796875381469726562e+01 -1.039515000000000189e+00 -4.793750000000000000e+01 -1.039520000000000000e+00 -4.793750000000000000e+01 -1.039525000000000032e+00 -4.803125000000000000e+01 -1.039530000000000065e+00 -4.796875381469726562e+01 -1.039535000000000098e+00 -4.793750000000000000e+01 -1.039540000000000131e+00 -4.793750000000000000e+01 -1.039545000000000163e+00 -4.796875381469726562e+01 -1.039549999999999974e+00 -4.796875381469726562e+01 -1.039555000000000007e+00 -4.796875381469726562e+01 -1.039560000000000040e+00 -4.793750000000000000e+01 -1.039565000000000072e+00 -4.790625381469726562e+01 -1.039570000000000105e+00 -4.790625381469726562e+01 -1.039575000000000138e+00 -4.793750000000000000e+01 -1.039580000000000171e+00 -4.787500381469726562e+01 -1.039584999999999981e+00 -4.784375000000000000e+01 -1.039590000000000014e+00 -4.784375000000000000e+01 -1.039595000000000047e+00 -4.781250381469726562e+01 -1.039600000000000080e+00 -4.790625381469726562e+01 -1.039605000000000112e+00 -4.790625381469726562e+01 -1.039610000000000145e+00 -4.781250381469726562e+01 -1.039615000000000178e+00 -4.784375000000000000e+01 -1.039619999999999989e+00 -4.781250381469726562e+01 -1.039625000000000021e+00 -4.787500381469726562e+01 -1.039630000000000054e+00 -4.784375000000000000e+01 -1.039635000000000087e+00 -4.778125000000000000e+01 -1.039640000000000120e+00 -4.784375000000000000e+01 -1.039645000000000152e+00 -4.775000381469726562e+01 -1.039650000000000185e+00 -4.781250381469726562e+01 -1.039654999999999996e+00 -4.784375000000000000e+01 -1.039660000000000029e+00 -4.784375000000000000e+01 -1.039665000000000061e+00 -4.778125000000000000e+01 -1.039670000000000094e+00 -4.784375000000000000e+01 -1.039675000000000127e+00 -4.771875381469726562e+01 -1.039680000000000160e+00 -4.781250381469726562e+01 -1.039685000000000192e+00 -4.775000381469726562e+01 -1.039690000000000003e+00 -4.768750000000000000e+01 -1.039695000000000036e+00 -4.768750000000000000e+01 -1.039700000000000069e+00 -4.775000381469726562e+01 -1.039705000000000101e+00 -4.768750000000000000e+01 -1.039710000000000134e+00 -4.768750000000000000e+01 -1.039715000000000167e+00 -4.771875381469726562e+01 -1.039719999999999978e+00 -4.768750000000000000e+01 -1.039725000000000010e+00 -4.768750000000000000e+01 -1.039730000000000043e+00 -4.765625381469726562e+01 -1.039735000000000076e+00 -4.765625381469726562e+01 -1.039740000000000109e+00 -4.762500000000000000e+01 -1.039745000000000141e+00 -4.765625381469726562e+01 -1.039750000000000174e+00 -4.765625381469726562e+01 -1.039754999999999985e+00 -4.768750000000000000e+01 -1.039760000000000018e+00 -4.759375381469726562e+01 -1.039765000000000050e+00 -4.756250381469726562e+01 -1.039770000000000083e+00 -4.756250381469726562e+01 -1.039775000000000116e+00 -4.759375381469726562e+01 -1.039780000000000149e+00 -4.762500000000000000e+01 -1.039785000000000181e+00 -4.759375381469726562e+01 -1.039789999999999992e+00 -4.756250381469726562e+01 -1.039795000000000025e+00 -4.756250381469726562e+01 -1.039800000000000058e+00 -4.756250381469726562e+01 -1.039805000000000090e+00 -4.756250381469726562e+01 -1.039810000000000123e+00 -4.753125000000000000e+01 -1.039815000000000156e+00 -4.750000381469726562e+01 -1.039820000000000189e+00 -4.753125000000000000e+01 -1.039824999999999999e+00 -4.759375381469726562e+01 -1.039830000000000032e+00 -4.750000381469726562e+01 -1.039835000000000065e+00 -4.753125000000000000e+01 -1.039840000000000098e+00 -4.743750381469726562e+01 -1.039845000000000130e+00 -4.750000381469726562e+01 -1.039850000000000163e+00 -4.750000381469726562e+01 -1.039855000000000196e+00 -4.750000381469726562e+01 -1.039860000000000007e+00 -4.750000381469726562e+01 -1.039865000000000039e+00 -4.750000381469726562e+01 -1.039870000000000072e+00 -4.750000381469726562e+01 -1.039875000000000105e+00 -4.743750381469726562e+01 -1.039880000000000138e+00 -4.746875000000000000e+01 -1.039885000000000170e+00 -4.743750381469726562e+01 -1.039889999999999981e+00 -4.750000381469726562e+01 -1.039895000000000014e+00 -4.743750381469726562e+01 -1.039900000000000047e+00 -4.743750381469726562e+01 -1.039905000000000079e+00 -4.743750381469726562e+01 -1.039910000000000112e+00 -4.743750381469726562e+01 -1.039915000000000145e+00 -4.743750381469726562e+01 -1.039920000000000178e+00 -4.743750381469726562e+01 -1.039924999999999988e+00 -4.737500000000000000e+01 -1.039930000000000021e+00 -4.740625381469726562e+01 -1.039935000000000054e+00 -4.737500000000000000e+01 -1.039940000000000087e+00 -4.734375381469726562e+01 -1.039945000000000119e+00 -4.737500000000000000e+01 -1.039950000000000152e+00 -4.737500000000000000e+01 -1.039955000000000185e+00 -4.734375381469726562e+01 -1.039959999999999996e+00 -4.737500000000000000e+01 -1.039965000000000028e+00 -4.734375381469726562e+01 -1.039970000000000061e+00 -4.737500000000000000e+01 -1.039975000000000094e+00 -4.734375381469726562e+01 -1.039980000000000127e+00 -4.740625381469726562e+01 -1.039985000000000159e+00 -4.740625381469726562e+01 -1.039990000000000192e+00 -4.734375381469726562e+01 -1.039995000000000003e+00 -4.734375381469726562e+01 -1.040000000000000036e+00 -4.737500000000000000e+01 -1.040005000000000068e+00 -4.737500000000000000e+01 -1.040010000000000101e+00 -4.737500000000000000e+01 -1.040015000000000134e+00 -4.725000381469726562e+01 -1.040020000000000167e+00 -4.728125381469726562e+01 -1.040024999999999977e+00 -4.731250000000000000e+01 -1.040030000000000010e+00 -4.725000381469726562e+01 -1.040035000000000043e+00 -4.728125381469726562e+01 -1.040040000000000076e+00 -4.728125381469726562e+01 -1.040045000000000108e+00 -4.721875000000000000e+01 -1.040050000000000141e+00 -4.721875000000000000e+01 -1.040055000000000174e+00 -4.721875000000000000e+01 -1.040059999999999985e+00 -4.725000381469726562e+01 -1.040065000000000017e+00 -4.721875000000000000e+01 -1.040070000000000050e+00 -4.721875000000000000e+01 -1.040075000000000083e+00 -4.718750381469726562e+01 -1.040080000000000116e+00 -4.718750381469726562e+01 -1.040085000000000148e+00 -4.721875000000000000e+01 -1.040090000000000181e+00 -4.721875000000000000e+01 -1.040094999999999992e+00 -4.715625381469726562e+01 -1.040100000000000025e+00 -4.712500000000000000e+01 -1.040105000000000057e+00 -4.718750381469726562e+01 -1.040110000000000090e+00 -4.718750381469726562e+01 -1.040115000000000123e+00 -4.712500000000000000e+01 -1.040120000000000156e+00 -4.715625381469726562e+01 -1.040125000000000188e+00 -4.715625381469726562e+01 -1.040129999999999999e+00 -4.718750381469726562e+01 -1.040135000000000032e+00 -4.718750381469726562e+01 -1.040140000000000065e+00 -4.709375381469726562e+01 -1.040145000000000097e+00 -4.712500000000000000e+01 -1.040150000000000130e+00 -4.715625381469726562e+01 -1.040155000000000163e+00 -4.712500000000000000e+01 -1.040160000000000196e+00 -4.715625381469726562e+01 -1.040165000000000006e+00 -4.715625381469726562e+01 -1.040170000000000039e+00 -4.715625381469726562e+01 -1.040175000000000072e+00 -4.715625381469726562e+01 -1.040180000000000105e+00 -4.703125381469726562e+01 -1.040185000000000137e+00 -4.709375381469726562e+01 -1.040190000000000170e+00 -4.709375381469726562e+01 -1.040194999999999981e+00 -4.706250000000000000e+01 -1.040200000000000014e+00 -4.706250000000000000e+01 -1.040205000000000046e+00 -4.703125381469726562e+01 -1.040210000000000079e+00 -4.700000381469726562e+01 -1.040215000000000112e+00 -4.709375381469726562e+01 -1.040220000000000145e+00 -4.700000381469726562e+01 -1.040225000000000177e+00 -4.703125381469726562e+01 -1.040229999999999988e+00 -4.700000381469726562e+01 -1.040235000000000021e+00 -4.703125381469726562e+01 -1.040240000000000054e+00 -4.700000381469726562e+01 -1.040245000000000086e+00 -4.700000381469726562e+01 -1.040250000000000119e+00 -4.696875000000000000e+01 -1.040255000000000152e+00 -4.709375381469726562e+01 -1.040260000000000185e+00 -4.700000381469726562e+01 -1.040264999999999995e+00 -4.700000381469726562e+01 -1.040270000000000028e+00 -4.693750381469726562e+01 -1.040275000000000061e+00 -4.700000381469726562e+01 -1.040280000000000094e+00 -4.696875000000000000e+01 -1.040285000000000126e+00 -4.693750381469726562e+01 -1.040290000000000159e+00 -4.700000381469726562e+01 -1.040295000000000192e+00 -4.696875000000000000e+01 -1.040300000000000002e+00 -4.693750381469726562e+01 -1.040305000000000035e+00 -4.696875000000000000e+01 -1.040310000000000068e+00 -4.693750381469726562e+01 -1.040315000000000101e+00 -4.693750381469726562e+01 -1.040320000000000134e+00 -4.684375381469726562e+01 -1.040325000000000166e+00 -4.696875000000000000e+01 -1.040329999999999977e+00 -4.693750381469726562e+01 -1.040335000000000010e+00 -4.693750381469726562e+01 -1.040340000000000042e+00 -4.693750381469726562e+01 -1.040345000000000075e+00 -4.687500381469726562e+01 -1.040350000000000108e+00 -4.690625000000000000e+01 -1.040355000000000141e+00 -4.687500381469726562e+01 -1.040360000000000174e+00 -4.687500381469726562e+01 -1.040364999999999984e+00 -4.693750381469726562e+01 -1.040370000000000017e+00 -4.684375381469726562e+01 -1.040375000000000050e+00 -4.681250000000000000e+01 -1.040380000000000082e+00 -4.687500381469726562e+01 -1.040385000000000115e+00 -4.687500381469726562e+01 -1.040390000000000148e+00 -4.684375381469726562e+01 -1.040395000000000181e+00 -4.678125381469726562e+01 -1.040399999999999991e+00 -4.687500381469726562e+01 -1.040405000000000024e+00 -4.684375381469726562e+01 -1.040410000000000057e+00 -4.681250000000000000e+01 -1.040415000000000090e+00 -4.684375381469726562e+01 -1.040420000000000122e+00 -4.684375381469726562e+01 -1.040425000000000155e+00 -4.684375381469726562e+01 -1.040430000000000188e+00 -4.681250000000000000e+01 -1.040434999999999999e+00 -4.684375381469726562e+01 -1.040440000000000031e+00 -4.678125381469726562e+01 -1.040445000000000064e+00 -4.681250000000000000e+01 -1.040450000000000097e+00 -4.681250000000000000e+01 -1.040455000000000130e+00 -4.678125381469726562e+01 -1.040460000000000163e+00 -4.681250000000000000e+01 -1.040465000000000195e+00 -4.675000000000000000e+01 -1.040470000000000006e+00 -4.681250000000000000e+01 -1.040475000000000039e+00 -4.675000000000000000e+01 -1.040480000000000071e+00 -4.675000000000000000e+01 -1.040485000000000104e+00 -4.671875381469726562e+01 -1.040490000000000137e+00 -4.675000000000000000e+01 -1.040495000000000170e+00 -4.678125381469726562e+01 -1.040499999999999980e+00 -4.681250000000000000e+01 -1.040505000000000013e+00 -4.668750381469726562e+01 -1.040510000000000046e+00 -4.678125381469726562e+01 -1.040515000000000079e+00 -4.678125381469726562e+01 -1.040520000000000111e+00 -4.675000000000000000e+01 -1.040525000000000144e+00 -4.668750381469726562e+01 -1.040530000000000177e+00 -4.675000000000000000e+01 -1.040534999999999988e+00 -4.665625000000000000e+01 -1.040540000000000020e+00 -4.671875381469726562e+01 -1.040545000000000053e+00 -4.662500381469726562e+01 -1.040550000000000086e+00 -4.671875381469726562e+01 -1.040555000000000119e+00 -4.665625000000000000e+01 -1.040560000000000151e+00 -4.668750381469726562e+01 -1.040565000000000184e+00 -4.665625000000000000e+01 -1.040569999999999995e+00 -4.665625000000000000e+01 -1.040575000000000028e+00 -4.659375000000000000e+01 -1.040580000000000060e+00 -4.668750381469726562e+01 -1.040585000000000093e+00 -4.668750381469726562e+01 -1.040590000000000126e+00 -4.662500381469726562e+01 -1.040595000000000159e+00 -4.665625000000000000e+01 -1.040600000000000191e+00 -4.659375000000000000e+01 -1.040605000000000002e+00 -4.668750381469726562e+01 -1.040610000000000035e+00 -4.668750381469726562e+01 -1.040615000000000068e+00 -4.659375000000000000e+01 -1.040620000000000100e+00 -4.665625000000000000e+01 -1.040625000000000133e+00 -4.662500381469726562e+01 -1.040630000000000166e+00 -4.656250381469726562e+01 -1.040634999999999977e+00 -4.665625000000000000e+01 -1.040640000000000009e+00 -4.653125381469726562e+01 -1.040645000000000042e+00 -4.659375000000000000e+01 -1.040650000000000075e+00 -4.665625000000000000e+01 -1.040655000000000108e+00 -4.656250381469726562e+01 -1.040660000000000140e+00 -4.659375000000000000e+01 -1.040665000000000173e+00 -4.650000000000000000e+01 -1.040669999999999984e+00 -4.662500381469726562e+01 -1.040675000000000017e+00 -4.653125381469726562e+01 -1.040680000000000049e+00 -4.653125381469726562e+01 -1.040685000000000082e+00 -4.653125381469726562e+01 -1.040690000000000115e+00 -4.656250381469726562e+01 -1.040695000000000148e+00 -4.653125381469726562e+01 -1.040700000000000180e+00 -4.653125381469726562e+01 -1.040704999999999991e+00 -4.653125381469726562e+01 -1.040710000000000024e+00 -4.650000000000000000e+01 -1.040715000000000057e+00 -4.650000000000000000e+01 -1.040720000000000089e+00 -4.650000000000000000e+01 -1.040725000000000122e+00 -4.650000000000000000e+01 -1.040730000000000155e+00 -4.656250381469726562e+01 -1.040735000000000188e+00 -4.650000000000000000e+01 -1.040739999999999998e+00 -4.650000000000000000e+01 -1.040745000000000031e+00 -4.650000000000000000e+01 -1.040750000000000064e+00 -4.650000000000000000e+01 -1.040755000000000097e+00 -4.646875381469726562e+01 -1.040760000000000129e+00 -4.650000000000000000e+01 -1.040765000000000162e+00 -4.646875381469726562e+01 -1.040770000000000195e+00 -4.650000000000000000e+01 -1.040775000000000006e+00 -4.643750000000000000e+01 -1.040780000000000038e+00 -4.650000000000000000e+01 -1.040785000000000071e+00 -4.650000000000000000e+01 -1.040790000000000104e+00 -4.643750000000000000e+01 -1.040795000000000137e+00 -4.646875381469726562e+01 -1.040800000000000169e+00 -4.643750000000000000e+01 -1.040804999999999980e+00 -4.643750000000000000e+01 -1.040810000000000013e+00 -4.643750000000000000e+01 -1.040815000000000046e+00 -4.637500381469726562e+01 -1.040820000000000078e+00 -4.637500381469726562e+01 -1.040825000000000111e+00 -4.643750000000000000e+01 -1.040830000000000144e+00 -4.640625000000000000e+01 -1.040835000000000177e+00 -4.640625000000000000e+01 -1.040839999999999987e+00 -4.637500381469726562e+01 -1.040845000000000020e+00 -4.640625000000000000e+01 -1.040850000000000053e+00 -4.637500381469726562e+01 -1.040855000000000086e+00 -4.640625000000000000e+01 -1.040860000000000118e+00 -4.637500381469726562e+01 -1.040865000000000151e+00 -4.637500381469726562e+01 -1.040870000000000184e+00 -4.640625000000000000e+01 -1.040874999999999995e+00 -4.631250381469726562e+01 -1.040880000000000027e+00 -4.634375000000000000e+01 -1.040885000000000060e+00 -4.634375000000000000e+01 -1.040890000000000093e+00 -4.634375000000000000e+01 -1.040895000000000126e+00 -4.634375000000000000e+01 -1.040900000000000158e+00 -4.628125381469726562e+01 -1.040905000000000191e+00 -4.625000000000000000e+01 -1.040910000000000002e+00 -4.621875381469726562e+01 -1.040915000000000035e+00 -4.628125381469726562e+01 -1.040920000000000067e+00 -4.628125381469726562e+01 -1.040925000000000100e+00 -4.621875381469726562e+01 -1.040930000000000133e+00 -4.625000000000000000e+01 -1.040935000000000166e+00 -4.628125381469726562e+01 -1.040939999999999976e+00 -4.628125381469726562e+01 -1.040945000000000009e+00 -4.625000000000000000e+01 -1.040950000000000042e+00 -4.621875381469726562e+01 -1.040955000000000075e+00 -4.621875381469726562e+01 -1.040960000000000107e+00 -4.621875381469726562e+01 -1.040965000000000140e+00 -4.625000000000000000e+01 -1.040970000000000173e+00 -4.628125381469726562e+01 -1.040974999999999984e+00 -4.612500381469726562e+01 -1.040980000000000016e+00 -4.625000000000000000e+01 -1.040985000000000049e+00 -4.615625381469726562e+01 -1.040990000000000082e+00 -4.612500381469726562e+01 -1.040995000000000115e+00 -4.615625381469726562e+01 -1.041000000000000147e+00 -4.615625381469726562e+01 -1.041005000000000180e+00 -4.612500381469726562e+01 -1.041009999999999991e+00 -4.618750000000000000e+01 -1.041015000000000024e+00 -4.612500381469726562e+01 -1.041020000000000056e+00 -4.618750000000000000e+01 -1.041025000000000089e+00 -4.615625381469726562e+01 -1.041030000000000122e+00 -4.621875381469726562e+01 -1.041035000000000155e+00 -4.612500381469726562e+01 -1.041040000000000187e+00 -4.615625381469726562e+01 -1.041044999999999998e+00 -4.615625381469726562e+01 -1.041050000000000031e+00 -4.615625381469726562e+01 -1.041055000000000064e+00 -4.612500381469726562e+01 -1.041060000000000096e+00 -4.612500381469726562e+01 -1.041065000000000129e+00 -4.606250381469726562e+01 -1.041070000000000162e+00 -4.612500381469726562e+01 -1.041075000000000195e+00 -4.609375000000000000e+01 -1.041080000000000005e+00 -4.600000381469726562e+01 -1.041085000000000038e+00 -4.609375000000000000e+01 -1.041090000000000071e+00 -4.606250381469726562e+01 -1.041095000000000104e+00 -4.612500381469726562e+01 -1.041100000000000136e+00 -4.606250381469726562e+01 -1.041105000000000169e+00 -4.606250381469726562e+01 -1.041109999999999980e+00 -4.609375000000000000e+01 -1.041115000000000013e+00 -4.603125000000000000e+01 -1.041120000000000045e+00 -4.609375000000000000e+01 -1.041125000000000078e+00 -4.603125000000000000e+01 -1.041130000000000111e+00 -4.600000381469726562e+01 -1.041135000000000144e+00 -4.606250381469726562e+01 -1.041140000000000176e+00 -4.603125000000000000e+01 -1.041144999999999987e+00 -4.609375000000000000e+01 -1.041150000000000020e+00 -4.603125000000000000e+01 -1.041155000000000053e+00 -4.603125000000000000e+01 -1.041160000000000085e+00 -4.600000381469726562e+01 -1.041165000000000118e+00 -4.600000381469726562e+01 -1.041170000000000151e+00 -4.600000381469726562e+01 -1.041175000000000184e+00 -4.600000381469726562e+01 -1.041179999999999994e+00 -4.593750000000000000e+01 -1.041185000000000027e+00 -4.600000381469726562e+01 -1.041190000000000060e+00 -4.596875381469726562e+01 -1.041195000000000093e+00 -4.587500000000000000e+01 -1.041200000000000125e+00 -4.600000381469726562e+01 -1.041205000000000158e+00 -4.596875381469726562e+01 -1.041210000000000191e+00 -4.603125000000000000e+01 -1.041215000000000002e+00 -4.593750000000000000e+01 -1.041220000000000034e+00 -4.590625381469726562e+01 -1.041225000000000067e+00 -4.593750000000000000e+01 -1.041230000000000100e+00 -4.584375381469726562e+01 -1.041235000000000133e+00 -4.590625381469726562e+01 -1.041240000000000165e+00 -4.590625381469726562e+01 -1.041244999999999976e+00 -4.590625381469726562e+01 -1.041250000000000009e+00 -4.590625381469726562e+01 -1.041255000000000042e+00 -4.593750000000000000e+01 -1.041260000000000074e+00 -4.593750000000000000e+01 -1.041265000000000107e+00 -4.587500000000000000e+01 -1.041270000000000140e+00 -4.584375381469726562e+01 -1.041275000000000173e+00 -4.581250381469726562e+01 -1.041279999999999983e+00 -4.584375381469726562e+01 -1.041285000000000016e+00 -4.581250381469726562e+01 -1.041290000000000049e+00 -4.590625381469726562e+01 -1.041295000000000082e+00 -4.578125000000000000e+01 -1.041300000000000114e+00 -4.584375381469726562e+01 -1.041305000000000147e+00 -4.584375381469726562e+01 -1.041310000000000180e+00 -4.584375381469726562e+01 -1.041314999999999991e+00 -4.584375381469726562e+01 -1.041320000000000023e+00 -4.578125000000000000e+01 -1.041325000000000056e+00 -4.581250381469726562e+01 -1.041330000000000089e+00 -4.578125000000000000e+01 -1.041335000000000122e+00 -4.581250381469726562e+01 -1.041340000000000154e+00 -4.578125000000000000e+01 -1.041345000000000187e+00 -4.581250381469726562e+01 -1.041349999999999998e+00 -4.571875000000000000e+01 -1.041355000000000031e+00 -4.565625381469726562e+01 -1.041360000000000063e+00 -4.571875000000000000e+01 -1.041365000000000096e+00 -4.578125000000000000e+01 -1.041370000000000129e+00 -4.571875000000000000e+01 -1.041375000000000162e+00 -4.575000381469726562e+01 -1.041380000000000194e+00 -4.571875000000000000e+01 -1.041385000000000005e+00 -4.571875000000000000e+01 -1.041390000000000038e+00 -4.575000381469726562e+01 -1.041395000000000071e+00 -4.575000381469726562e+01 -1.041400000000000103e+00 -4.568750000000000000e+01 -1.041405000000000136e+00 -4.565625381469726562e+01 -1.041410000000000169e+00 -4.565625381469726562e+01 -1.041414999999999980e+00 -4.575000381469726562e+01 -1.041420000000000012e+00 -4.568750000000000000e+01 -1.041425000000000045e+00 -4.565625381469726562e+01 -1.041430000000000078e+00 -4.565625381469726562e+01 -1.041435000000000111e+00 -4.565625381469726562e+01 -1.041440000000000143e+00 -4.571875000000000000e+01 -1.041445000000000176e+00 -4.565625381469726562e+01 -1.041449999999999987e+00 -4.559375381469726562e+01 -1.041455000000000020e+00 -4.562500000000000000e+01 -1.041460000000000052e+00 -4.559375381469726562e+01 -1.041465000000000085e+00 -4.559375381469726562e+01 -1.041470000000000118e+00 -4.559375381469726562e+01 -1.041475000000000151e+00 -4.562500000000000000e+01 -1.041480000000000183e+00 -4.556250381469726562e+01 -1.041484999999999994e+00 -4.556250381469726562e+01 -1.041490000000000027e+00 -4.559375381469726562e+01 -1.041495000000000060e+00 -4.568750000000000000e+01 -1.041500000000000092e+00 -4.559375381469726562e+01 -1.041505000000000125e+00 -4.553125000000000000e+01 -1.041510000000000158e+00 -4.559375381469726562e+01 -1.041515000000000191e+00 -4.562500000000000000e+01 -1.041520000000000001e+00 -4.553125000000000000e+01 -1.041525000000000034e+00 -4.556250381469726562e+01 -1.041530000000000067e+00 -4.559375381469726562e+01 -1.041535000000000100e+00 -4.553125000000000000e+01 -1.041540000000000132e+00 -4.559375381469726562e+01 -1.041545000000000165e+00 -4.550000381469726562e+01 -1.041549999999999976e+00 -4.556250381469726562e+01 -1.041555000000000009e+00 -4.553125000000000000e+01 -1.041560000000000041e+00 -4.553125000000000000e+01 -1.041565000000000074e+00 -4.553125000000000000e+01 -1.041570000000000107e+00 -4.550000381469726562e+01 -1.041575000000000140e+00 -4.553125000000000000e+01 -1.041580000000000172e+00 -4.553125000000000000e+01 -1.041584999999999983e+00 -4.550000381469726562e+01 -1.041590000000000016e+00 -4.550000381469726562e+01 -1.041595000000000049e+00 -4.550000381469726562e+01 -1.041600000000000081e+00 -4.546875000000000000e+01 -1.041605000000000114e+00 -4.550000381469726562e+01 -1.041610000000000147e+00 -4.546875000000000000e+01 -1.041615000000000180e+00 -4.546875000000000000e+01 -1.041619999999999990e+00 -4.546875000000000000e+01 -1.041625000000000023e+00 -4.540625381469726562e+01 -1.041630000000000056e+00 -4.543750381469726562e+01 -1.041635000000000089e+00 -4.546875000000000000e+01 -1.041640000000000121e+00 -4.546875000000000000e+01 -1.041645000000000154e+00 -4.540625381469726562e+01 -1.041650000000000187e+00 -4.550000381469726562e+01 -1.041654999999999998e+00 -4.546875000000000000e+01 -1.041660000000000030e+00 -4.543750381469726562e+01 -1.041665000000000063e+00 -4.537500000000000000e+01 -1.041670000000000096e+00 -4.540625381469726562e+01 -1.041675000000000129e+00 -4.540625381469726562e+01 -1.041680000000000161e+00 -4.537500000000000000e+01 -1.041685000000000194e+00 -4.537500000000000000e+01 -1.041690000000000005e+00 -4.540625381469726562e+01 -1.041695000000000038e+00 -4.540625381469726562e+01 -1.041700000000000070e+00 -4.534375381469726562e+01 -1.041705000000000103e+00 -4.537500000000000000e+01 -1.041710000000000136e+00 -4.537500000000000000e+01 -1.041715000000000169e+00 -4.534375381469726562e+01 -1.041719999999999979e+00 -4.534375381469726562e+01 -1.041725000000000012e+00 -4.531250000000000000e+01 -1.041730000000000045e+00 -4.531250000000000000e+01 -1.041735000000000078e+00 -4.528125381469726562e+01 -1.041740000000000110e+00 -4.540625381469726562e+01 -1.041745000000000143e+00 -4.537500000000000000e+01 -1.041750000000000176e+00 -4.540625381469726562e+01 -1.041754999999999987e+00 -4.525000381469726562e+01 -1.041760000000000019e+00 -4.528125381469726562e+01 -1.041765000000000052e+00 -4.528125381469726562e+01 -1.041770000000000085e+00 -4.534375381469726562e+01 -1.041775000000000118e+00 -4.528125381469726562e+01 -1.041780000000000150e+00 -4.528125381469726562e+01 -1.041785000000000183e+00 -4.521875000000000000e+01 -1.041789999999999994e+00 -4.528125381469726562e+01 -1.041795000000000027e+00 -4.534375381469726562e+01 -1.041800000000000059e+00 -4.521875000000000000e+01 -1.041805000000000092e+00 -4.521875000000000000e+01 -1.041810000000000125e+00 -4.534375381469726562e+01 -1.041815000000000158e+00 -4.525000381469726562e+01 -1.041820000000000190e+00 -4.521875000000000000e+01 -1.041825000000000001e+00 -4.521875000000000000e+01 -1.041830000000000034e+00 -4.521875000000000000e+01 -1.041835000000000067e+00 -4.525000381469726562e+01 -1.041840000000000099e+00 -4.518750381469726562e+01 -1.041845000000000132e+00 -4.525000381469726562e+01 -1.041850000000000165e+00 -4.521875000000000000e+01 -1.041854999999999976e+00 -4.518750381469726562e+01 -1.041860000000000008e+00 -4.515625000000000000e+01 -1.041865000000000041e+00 -4.521875000000000000e+01 -1.041870000000000074e+00 -4.515625000000000000e+01 -1.041875000000000107e+00 -4.518750381469726562e+01 -1.041880000000000139e+00 -4.515625000000000000e+01 -1.041885000000000172e+00 -4.512500381469726562e+01 -1.041889999999999983e+00 -4.512500381469726562e+01 -1.041895000000000016e+00 -4.521875000000000000e+01 -1.041900000000000048e+00 -4.521875000000000000e+01 -1.041905000000000081e+00 -4.525000381469726562e+01 -1.041910000000000114e+00 -4.512500381469726562e+01 -1.041915000000000147e+00 -4.506250000000000000e+01 -1.041920000000000179e+00 -4.518750381469726562e+01 -1.041924999999999990e+00 -4.509375381469726562e+01 -1.041930000000000023e+00 -4.518750381469726562e+01 -1.041935000000000056e+00 -4.515625000000000000e+01 -1.041940000000000088e+00 -4.515625000000000000e+01 -1.041945000000000121e+00 -4.515625000000000000e+01 -1.041950000000000154e+00 -4.509375381469726562e+01 -1.041955000000000187e+00 -4.506250000000000000e+01 -1.041959999999999997e+00 -4.512500381469726562e+01 -1.041965000000000030e+00 -4.509375381469726562e+01 -1.041970000000000063e+00 -4.506250000000000000e+01 -1.041975000000000096e+00 -4.509375381469726562e+01 -1.041980000000000128e+00 -4.506250000000000000e+01 -1.041985000000000161e+00 -4.509375381469726562e+01 -1.041990000000000194e+00 -4.506250000000000000e+01 -1.041995000000000005e+00 -4.506250000000000000e+01 -1.042000000000000037e+00 -4.503125381469726562e+01 -1.042005000000000070e+00 -4.506250000000000000e+01 -1.042010000000000103e+00 -4.500000000000000000e+01 -1.042015000000000136e+00 -4.503125381469726562e+01 -1.042020000000000168e+00 -4.503125381469726562e+01 -1.042024999999999979e+00 -4.503125381469726562e+01 -1.042030000000000012e+00 -4.500000000000000000e+01 -1.042035000000000045e+00 -4.506250000000000000e+01 -1.042040000000000077e+00 -4.506250000000000000e+01 -1.042045000000000110e+00 -4.500000000000000000e+01 -1.042050000000000143e+00 -4.500000000000000000e+01 -1.042055000000000176e+00 -4.500000000000000000e+01 -1.042059999999999986e+00 -4.503125381469726562e+01 -1.042065000000000019e+00 -4.493750381469726562e+01 -1.042070000000000052e+00 -4.503125381469726562e+01 -1.042075000000000085e+00 -4.496875000000000000e+01 -1.042080000000000117e+00 -4.500000000000000000e+01 -1.042085000000000150e+00 -4.503125381469726562e+01 -1.042090000000000183e+00 -4.500000000000000000e+01 -1.042094999999999994e+00 -4.503125381469726562e+01 -1.042100000000000026e+00 -4.500000000000000000e+01 -1.042105000000000059e+00 -4.500000000000000000e+01 -1.042110000000000092e+00 -4.493750381469726562e+01 -1.042115000000000125e+00 -4.496875000000000000e+01 -1.042120000000000157e+00 -4.493750381469726562e+01 -1.042125000000000190e+00 -4.493750381469726562e+01 -1.042130000000000001e+00 -4.500000000000000000e+01 -1.042135000000000034e+00 -4.496875000000000000e+01 -1.042140000000000066e+00 -4.493750381469726562e+01 -1.042145000000000099e+00 -4.490625000000000000e+01 -1.042150000000000132e+00 -4.493750381469726562e+01 -1.042155000000000165e+00 -4.490625000000000000e+01 -1.042159999999999975e+00 -4.490625000000000000e+01 -1.042165000000000008e+00 -4.487500381469726562e+01 -1.042170000000000041e+00 -4.493750381469726562e+01 -1.042175000000000074e+00 -4.490625000000000000e+01 -1.042180000000000106e+00 -4.493750381469726562e+01 -1.042185000000000139e+00 -4.493750381469726562e+01 -1.042190000000000172e+00 -4.487500381469726562e+01 -1.042194999999999983e+00 -4.487500381469726562e+01 -1.042200000000000015e+00 -4.490625000000000000e+01 -1.042205000000000048e+00 -4.484375381469726562e+01 -1.042210000000000081e+00 -4.484375381469726562e+01 -1.042215000000000114e+00 -4.487500381469726562e+01 -1.042220000000000146e+00 -4.484375381469726562e+01 -1.042225000000000179e+00 -4.481250000000000000e+01 -1.042229999999999990e+00 -4.484375381469726562e+01 -1.042235000000000023e+00 -4.481250000000000000e+01 -1.042240000000000055e+00 -4.484375381469726562e+01 -1.042245000000000088e+00 -4.478125381469726562e+01 -1.042250000000000121e+00 -4.484375381469726562e+01 -1.042255000000000154e+00 -4.481250000000000000e+01 -1.042260000000000186e+00 -4.471875381469726562e+01 -1.042264999999999997e+00 -4.468750381469726562e+01 -1.042270000000000030e+00 -4.484375381469726562e+01 -1.042275000000000063e+00 -4.478125381469726562e+01 -1.042280000000000095e+00 -4.478125381469726562e+01 -1.042285000000000128e+00 -4.471875381469726562e+01 -1.042290000000000161e+00 -4.478125381469726562e+01 -1.042295000000000194e+00 -4.471875381469726562e+01 -1.042300000000000004e+00 -4.484375381469726562e+01 -1.042305000000000037e+00 -4.478125381469726562e+01 -1.042310000000000070e+00 -4.471875381469726562e+01 -1.042315000000000103e+00 -4.471875381469726562e+01 -1.042320000000000135e+00 -4.484375381469726562e+01 -1.042325000000000168e+00 -4.465625000000000000e+01 -1.042329999999999979e+00 -4.471875381469726562e+01 -1.042335000000000012e+00 -4.471875381469726562e+01 -1.042340000000000044e+00 -4.475000000000000000e+01 -1.042345000000000077e+00 -4.478125381469726562e+01 -1.042350000000000110e+00 -4.465625000000000000e+01 -1.042355000000000143e+00 -4.475000000000000000e+01 -1.042360000000000175e+00 -4.468750381469726562e+01 -1.042364999999999986e+00 -4.468750381469726562e+01 -1.042370000000000019e+00 -4.465625000000000000e+01 -1.042375000000000052e+00 -4.468750381469726562e+01 -1.042380000000000084e+00 -4.468750381469726562e+01 -1.042385000000000117e+00 -4.468750381469726562e+01 -1.042390000000000150e+00 -4.462500381469726562e+01 -1.042395000000000183e+00 -4.465625000000000000e+01 -1.042399999999999993e+00 -4.468750381469726562e+01 -1.042405000000000026e+00 -4.465625000000000000e+01 -1.042410000000000059e+00 -4.465625000000000000e+01 -1.042415000000000092e+00 -4.459375000000000000e+01 -1.042420000000000124e+00 -4.465625000000000000e+01 -1.042425000000000157e+00 -4.465625000000000000e+01 -1.042430000000000190e+00 -4.459375000000000000e+01 -1.042435000000000000e+00 -4.462500381469726562e+01 -1.042440000000000033e+00 -4.456250381469726562e+01 -1.042445000000000066e+00 -4.456250381469726562e+01 -1.042450000000000099e+00 -4.459375000000000000e+01 -1.042455000000000132e+00 -4.459375000000000000e+01 -1.042460000000000164e+00 -4.456250381469726562e+01 -1.042464999999999975e+00 -4.456250381469726562e+01 -1.042470000000000008e+00 -4.450000000000000000e+01 -1.042475000000000041e+00 -4.453125381469726562e+01 -1.042480000000000073e+00 -4.453125381469726562e+01 -1.042485000000000106e+00 -4.456250381469726562e+01 -1.042490000000000139e+00 -4.456250381469726562e+01 -1.042495000000000172e+00 -4.450000000000000000e+01 -1.042499999999999982e+00 -4.450000000000000000e+01 -1.042505000000000015e+00 -4.450000000000000000e+01 -1.042510000000000048e+00 -4.453125381469726562e+01 -1.042515000000000081e+00 -4.446875381469726562e+01 -1.042520000000000113e+00 -4.450000000000000000e+01 -1.042525000000000146e+00 -4.456250381469726562e+01 -1.042530000000000179e+00 -4.450000000000000000e+01 -1.042534999999999989e+00 -4.450000000000000000e+01 -1.042540000000000022e+00 -4.443750000000000000e+01 -1.042545000000000055e+00 -4.446875381469726562e+01 -1.042550000000000088e+00 -4.450000000000000000e+01 -1.042555000000000121e+00 -4.450000000000000000e+01 -1.042560000000000153e+00 -4.450000000000000000e+01 -1.042565000000000186e+00 -4.446875381469726562e+01 -1.042569999999999997e+00 -4.446875381469726562e+01 -1.042575000000000029e+00 -4.440625381469726562e+01 -1.042580000000000062e+00 -4.437500381469726562e+01 -1.042585000000000095e+00 -4.443750000000000000e+01 -1.042590000000000128e+00 -4.446875381469726562e+01 -1.042595000000000161e+00 -4.443750000000000000e+01 -1.042600000000000193e+00 -4.440625381469726562e+01 -1.042605000000000004e+00 -4.440625381469726562e+01 -1.042610000000000037e+00 -4.440625381469726562e+01 -1.042615000000000069e+00 -4.443750000000000000e+01 -1.042620000000000102e+00 -4.440625381469726562e+01 -1.042625000000000135e+00 -4.437500381469726562e+01 -1.042630000000000168e+00 -4.443750000000000000e+01 -1.042634999999999978e+00 -4.437500381469726562e+01 -1.042640000000000011e+00 -4.434375000000000000e+01 -1.042645000000000044e+00 -4.434375000000000000e+01 -1.042650000000000077e+00 -4.440625381469726562e+01 -1.042655000000000109e+00 -4.434375000000000000e+01 -1.042660000000000142e+00 -4.431250381469726562e+01 -1.042665000000000175e+00 -4.440625381469726562e+01 -1.042669999999999986e+00 -4.437500381469726562e+01 -1.042675000000000018e+00 -4.431250381469726562e+01 -1.042680000000000051e+00 -4.425000000000000000e+01 -1.042685000000000084e+00 -4.434375000000000000e+01 -1.042690000000000117e+00 -4.431250381469726562e+01 -1.042695000000000149e+00 -4.431250381469726562e+01 -1.042700000000000182e+00 -4.428125000000000000e+01 -1.042704999999999993e+00 -4.434375000000000000e+01 -1.042710000000000026e+00 -4.434375000000000000e+01 -1.042715000000000058e+00 -4.428125000000000000e+01 -1.042720000000000091e+00 -4.428125000000000000e+01 -1.042725000000000124e+00 -4.428125000000000000e+01 -1.042730000000000157e+00 -4.431250381469726562e+01 -1.042735000000000190e+00 -4.431250381469726562e+01 -1.042740000000000000e+00 -4.428125000000000000e+01 -1.042745000000000033e+00 -4.421875381469726562e+01 -1.042750000000000066e+00 -4.431250381469726562e+01 -1.042755000000000098e+00 -4.421875381469726562e+01 -1.042760000000000131e+00 -4.428125000000000000e+01 -1.042765000000000164e+00 -4.421875381469726562e+01 -1.042769999999999975e+00 -4.418750000000000000e+01 -1.042775000000000007e+00 -4.421875381469726562e+01 -1.042780000000000040e+00 -4.421875381469726562e+01 -1.042785000000000073e+00 -4.421875381469726562e+01 -1.042790000000000106e+00 -4.421875381469726562e+01 -1.042795000000000138e+00 -4.412500000000000000e+01 -1.042800000000000171e+00 -4.425000000000000000e+01 -1.042804999999999982e+00 -4.418750000000000000e+01 -1.042810000000000015e+00 -4.418750000000000000e+01 -1.042815000000000047e+00 -4.418750000000000000e+01 -1.042820000000000080e+00 -4.415625381469726562e+01 -1.042825000000000113e+00 -4.412500000000000000e+01 -1.042830000000000146e+00 -4.415625381469726562e+01 -1.042835000000000178e+00 -4.412500000000000000e+01 -1.042839999999999989e+00 -4.415625381469726562e+01 -1.042845000000000022e+00 -4.412500000000000000e+01 -1.042850000000000055e+00 -4.418750000000000000e+01 -1.042855000000000087e+00 -4.418750000000000000e+01 -1.042860000000000120e+00 -4.418750000000000000e+01 -1.042865000000000153e+00 -4.415625381469726562e+01 -1.042870000000000186e+00 -4.412500000000000000e+01 -1.042874999999999996e+00 -4.406250381469726562e+01 -1.042880000000000029e+00 -4.409375000000000000e+01 -1.042885000000000062e+00 -4.409375000000000000e+01 -1.042890000000000095e+00 -4.409375000000000000e+01 -1.042895000000000127e+00 -4.409375000000000000e+01 -1.042900000000000160e+00 -4.409375000000000000e+01 -1.042905000000000193e+00 -4.418750000000000000e+01 -1.042910000000000004e+00 -4.409375000000000000e+01 -1.042915000000000036e+00 -4.415625381469726562e+01 -1.042920000000000069e+00 -4.403125000000000000e+01 -1.042925000000000102e+00 -4.406250381469726562e+01 -1.042930000000000135e+00 -4.409375000000000000e+01 -1.042935000000000167e+00 -4.406250381469726562e+01 -1.042939999999999978e+00 -4.406250381469726562e+01 -1.042945000000000011e+00 -4.403125000000000000e+01 -1.042950000000000044e+00 -4.403125000000000000e+01 -1.042955000000000076e+00 -4.403125000000000000e+01 -1.042960000000000109e+00 -4.403125000000000000e+01 -1.042965000000000142e+00 -4.403125000000000000e+01 -1.042970000000000175e+00 -4.403125000000000000e+01 -1.042974999999999985e+00 -4.403125000000000000e+01 -1.042980000000000018e+00 -4.400000381469726562e+01 -1.042985000000000051e+00 -4.400000381469726562e+01 -1.042990000000000084e+00 -4.403125000000000000e+01 -1.042995000000000116e+00 -4.403125000000000000e+01 -1.043000000000000149e+00 -4.393750000000000000e+01 -1.043005000000000182e+00 -4.400000381469726562e+01 -1.043009999999999993e+00 -4.396875381469726562e+01 -1.043015000000000025e+00 -4.403125000000000000e+01 -1.043020000000000058e+00 -4.393750000000000000e+01 -1.043025000000000091e+00 -4.390625381469726562e+01 -1.043030000000000124e+00 -4.390625381469726562e+01 -1.043035000000000156e+00 -4.396875381469726562e+01 -1.043040000000000189e+00 -4.396875381469726562e+01 -1.043045000000000000e+00 -4.396875381469726562e+01 -1.043050000000000033e+00 -4.400000381469726562e+01 -1.043055000000000065e+00 -4.396875381469726562e+01 -1.043060000000000098e+00 -4.390625381469726562e+01 -1.043065000000000131e+00 -4.390625381469726562e+01 -1.043070000000000164e+00 -4.390625381469726562e+01 -1.043074999999999974e+00 -4.393750000000000000e+01 -1.043080000000000007e+00 -4.387500000000000000e+01 -1.043085000000000040e+00 -4.393750000000000000e+01 -1.043090000000000073e+00 -4.390625381469726562e+01 -1.043095000000000105e+00 -4.396875381469726562e+01 -1.043100000000000138e+00 -4.390625381469726562e+01 -1.043105000000000171e+00 -4.390625381469726562e+01 -1.043109999999999982e+00 -4.390625381469726562e+01 -1.043115000000000014e+00 -4.393750000000000000e+01 -1.043120000000000047e+00 -4.390625381469726562e+01 -1.043125000000000080e+00 -4.387500000000000000e+01 -1.043130000000000113e+00 -4.387500000000000000e+01 -1.043135000000000145e+00 -4.387500000000000000e+01 -1.043140000000000178e+00 -4.393750000000000000e+01 -1.043144999999999989e+00 -4.390625381469726562e+01 -1.043150000000000022e+00 -4.393750000000000000e+01 -1.043155000000000054e+00 -4.381250381469726562e+01 -1.043160000000000087e+00 -4.384375381469726562e+01 -1.043165000000000120e+00 -4.384375381469726562e+01 -1.043170000000000153e+00 -4.381250381469726562e+01 -1.043175000000000185e+00 -4.384375381469726562e+01 -1.043179999999999996e+00 -4.390625381469726562e+01 -1.043185000000000029e+00 -4.384375381469726562e+01 -1.043190000000000062e+00 -4.384375381469726562e+01 -1.043195000000000094e+00 -4.378125000000000000e+01 -1.043200000000000127e+00 -4.384375381469726562e+01 -1.043205000000000160e+00 -4.381250381469726562e+01 -1.043210000000000193e+00 -4.384375381469726562e+01 -1.043215000000000003e+00 -4.384375381469726562e+01 -1.043220000000000036e+00 -4.381250381469726562e+01 -1.043225000000000069e+00 -4.384375381469726562e+01 -1.043230000000000102e+00 -4.378125000000000000e+01 -1.043235000000000134e+00 -4.381250381469726562e+01 -1.043240000000000167e+00 -4.381250381469726562e+01 -1.043244999999999978e+00 -4.378125000000000000e+01 -1.043250000000000011e+00 -4.378125000000000000e+01 -1.043255000000000043e+00 -4.378125000000000000e+01 -1.043260000000000076e+00 -4.375000381469726562e+01 -1.043265000000000109e+00 -4.371875000000000000e+01 -1.043270000000000142e+00 -4.381250381469726562e+01 -1.043275000000000174e+00 -4.381250381469726562e+01 -1.043279999999999985e+00 -4.378125000000000000e+01 -1.043285000000000018e+00 -4.384375381469726562e+01 -1.043290000000000051e+00 -4.371875000000000000e+01 -1.043295000000000083e+00 -4.368750381469726562e+01 -1.043300000000000116e+00 -4.371875000000000000e+01 -1.043305000000000149e+00 -4.368750381469726562e+01 -1.043310000000000182e+00 -4.368750381469726562e+01 -1.043314999999999992e+00 -4.378125000000000000e+01 -1.043320000000000025e+00 -4.375000381469726562e+01 -1.043325000000000058e+00 -4.368750381469726562e+01 -1.043330000000000091e+00 -4.368750381469726562e+01 -1.043335000000000123e+00 -4.365625381469726562e+01 -1.043340000000000156e+00 -4.368750381469726562e+01 -1.043345000000000189e+00 -4.371875000000000000e+01 -1.043350000000000000e+00 -4.365625381469726562e+01 -1.043355000000000032e+00 -4.365625381469726562e+01 -1.043360000000000065e+00 -4.368750381469726562e+01 -1.043365000000000098e+00 -4.368750381469726562e+01 -1.043370000000000131e+00 -4.368750381469726562e+01 -1.043375000000000163e+00 -4.368750381469726562e+01 -1.043380000000000196e+00 -4.371875000000000000e+01 -1.043385000000000007e+00 -4.371875000000000000e+01 -1.043390000000000040e+00 -4.371875000000000000e+01 -1.043395000000000072e+00 -4.368750381469726562e+01 -1.043400000000000105e+00 -4.365625381469726562e+01 -1.043405000000000138e+00 -4.365625381469726562e+01 -1.043410000000000171e+00 -4.368750381469726562e+01 -1.043414999999999981e+00 -4.362500000000000000e+01 -1.043420000000000014e+00 -4.371875000000000000e+01 -1.043425000000000047e+00 -4.371875000000000000e+01 -1.043430000000000080e+00 -4.362500000000000000e+01 -1.043435000000000112e+00 -4.362500000000000000e+01 -1.043440000000000145e+00 -4.365625381469726562e+01 -1.043445000000000178e+00 -4.365625381469726562e+01 -1.043449999999999989e+00 -4.362500000000000000e+01 -1.043455000000000021e+00 -4.365625381469726562e+01 -1.043460000000000054e+00 -4.362500000000000000e+01 -1.043465000000000087e+00 -4.365625381469726562e+01 -1.043470000000000120e+00 -4.356250000000000000e+01 -1.043475000000000152e+00 -4.356250000000000000e+01 -1.043480000000000185e+00 -4.359375381469726562e+01 -1.043484999999999996e+00 -4.356250000000000000e+01 -1.043490000000000029e+00 -4.356250000000000000e+01 -1.043495000000000061e+00 -4.359375381469726562e+01 -1.043500000000000094e+00 -4.365625381469726562e+01 -1.043505000000000127e+00 -4.359375381469726562e+01 -1.043510000000000160e+00 -4.359375381469726562e+01 -1.043515000000000192e+00 -4.353125000000000000e+01 -1.043520000000000003e+00 -4.356250000000000000e+01 -1.043525000000000036e+00 -4.353125000000000000e+01 -1.043530000000000069e+00 -4.356250000000000000e+01 -1.043535000000000101e+00 -4.359375381469726562e+01 -1.043540000000000134e+00 -4.356250000000000000e+01 -1.043545000000000167e+00 -4.353125000000000000e+01 -1.043549999999999978e+00 -4.350000381469726562e+01 -1.043555000000000010e+00 -4.353125000000000000e+01 -1.043560000000000043e+00 -4.353125000000000000e+01 -1.043565000000000076e+00 -4.350000381469726562e+01 -1.043570000000000109e+00 -4.356250000000000000e+01 -1.043575000000000141e+00 -4.350000381469726562e+01 -1.043580000000000174e+00 -4.356250000000000000e+01 -1.043584999999999985e+00 -4.350000381469726562e+01 -1.043590000000000018e+00 -4.350000381469726562e+01 -1.043595000000000050e+00 -4.353125000000000000e+01 -1.043600000000000083e+00 -4.350000381469726562e+01 -1.043605000000000116e+00 -4.353125000000000000e+01 -1.043610000000000149e+00 -4.350000381469726562e+01 -1.043615000000000181e+00 -4.350000381469726562e+01 -1.043619999999999992e+00 -4.346875000000000000e+01 -1.043625000000000025e+00 -4.353125000000000000e+01 -1.043630000000000058e+00 -4.350000381469726562e+01 -1.043635000000000090e+00 -4.350000381469726562e+01 -1.043640000000000123e+00 -4.350000381469726562e+01 -1.043645000000000156e+00 -4.346875000000000000e+01 -1.043650000000000189e+00 -4.346875000000000000e+01 -1.043654999999999999e+00 -4.350000381469726562e+01 -1.043660000000000032e+00 -4.346875000000000000e+01 -1.043665000000000065e+00 -4.350000381469726562e+01 -1.043670000000000098e+00 -4.346875000000000000e+01 -1.043675000000000130e+00 -4.346875000000000000e+01 -1.043680000000000163e+00 -4.353125000000000000e+01 -1.043685000000000196e+00 -4.340625000000000000e+01 -1.043690000000000007e+00 -4.343750381469726562e+01 -1.043695000000000039e+00 -4.346875000000000000e+01 -1.043700000000000072e+00 -4.346875000000000000e+01 -1.043705000000000105e+00 -4.343750381469726562e+01 -1.043710000000000138e+00 -4.343750381469726562e+01 -1.043715000000000170e+00 -4.340625000000000000e+01 -1.043719999999999981e+00 -4.346875000000000000e+01 -1.043725000000000014e+00 -4.343750381469726562e+01 -1.043730000000000047e+00 -4.337500000000000000e+01 -1.043735000000000079e+00 -4.337500000000000000e+01 -1.043740000000000112e+00 -4.340625000000000000e+01 -1.043745000000000145e+00 -4.343750381469726562e+01 -1.043750000000000178e+00 -4.346875000000000000e+01 -1.043754999999999988e+00 -4.334375381469726562e+01 -1.043760000000000021e+00 -4.340625000000000000e+01 -1.043765000000000054e+00 -4.337500000000000000e+01 -1.043770000000000087e+00 -4.343750381469726562e+01 -1.043775000000000119e+00 -4.340625000000000000e+01 -1.043780000000000152e+00 -4.340625000000000000e+01 -1.043785000000000185e+00 -4.334375381469726562e+01 -1.043789999999999996e+00 -4.340625000000000000e+01 -1.043795000000000028e+00 -4.334375381469726562e+01 -1.043800000000000061e+00 -4.331250000000000000e+01 -1.043805000000000094e+00 -4.331250000000000000e+01 -1.043810000000000127e+00 -4.331250000000000000e+01 -1.043815000000000159e+00 -4.334375381469726562e+01 -1.043820000000000192e+00 -4.340625000000000000e+01 -1.043825000000000003e+00 -4.337500000000000000e+01 -1.043830000000000036e+00 -4.334375381469726562e+01 -1.043835000000000068e+00 -4.331250000000000000e+01 -1.043840000000000101e+00 -4.334375381469726562e+01 -1.043845000000000134e+00 -4.331250000000000000e+01 -1.043850000000000167e+00 -4.325000381469726562e+01 -1.043854999999999977e+00 -4.331250000000000000e+01 -1.043860000000000010e+00 -4.325000381469726562e+01 -1.043865000000000043e+00 -4.334375381469726562e+01 -1.043870000000000076e+00 -4.328125381469726562e+01 -1.043875000000000108e+00 -4.328125381469726562e+01 -1.043880000000000141e+00 -4.328125381469726562e+01 -1.043885000000000174e+00 -4.325000381469726562e+01 -1.043889999999999985e+00 -4.328125381469726562e+01 -1.043895000000000017e+00 -4.328125381469726562e+01 -1.043900000000000050e+00 -4.315625000000000000e+01 -1.043905000000000083e+00 -4.318750381469726562e+01 -1.043910000000000116e+00 -4.328125381469726562e+01 -1.043915000000000148e+00 -4.321875000000000000e+01 -1.043920000000000181e+00 -4.331250000000000000e+01 -1.043924999999999992e+00 -4.321875000000000000e+01 -1.043930000000000025e+00 -4.318750381469726562e+01 -1.043935000000000057e+00 -4.318750381469726562e+01 -1.043940000000000090e+00 -4.325000381469726562e+01 -1.043945000000000123e+00 -4.321875000000000000e+01 -1.043950000000000156e+00 -4.318750381469726562e+01 -1.043955000000000188e+00 -4.321875000000000000e+01 -1.043959999999999999e+00 -4.321875000000000000e+01 -1.043965000000000032e+00 -4.321875000000000000e+01 -1.043970000000000065e+00 -4.321875000000000000e+01 -1.043975000000000097e+00 -4.315625000000000000e+01 -1.043980000000000130e+00 -4.318750381469726562e+01 -1.043985000000000163e+00 -4.318750381469726562e+01 -1.043990000000000196e+00 -4.315625000000000000e+01 -1.043995000000000006e+00 -4.318750381469726562e+01 -1.044000000000000039e+00 -4.315625000000000000e+01 -1.044005000000000072e+00 -4.318750381469726562e+01 -1.044010000000000105e+00 -4.312500381469726562e+01 -1.044015000000000137e+00 -4.309375381469726562e+01 -1.044020000000000170e+00 -4.321875000000000000e+01 -1.044024999999999981e+00 -4.315625000000000000e+01 -1.044030000000000014e+00 -4.315625000000000000e+01 -1.044035000000000046e+00 -4.318750381469726562e+01 -1.044040000000000079e+00 -4.318750381469726562e+01 -1.044045000000000112e+00 -4.312500381469726562e+01 -1.044050000000000145e+00 -4.306250000000000000e+01 -1.044055000000000177e+00 -4.309375381469726562e+01 -1.044059999999999988e+00 -4.315625000000000000e+01 -1.044065000000000021e+00 -4.315625000000000000e+01 -1.044070000000000054e+00 -4.315625000000000000e+01 -1.044075000000000086e+00 -4.312500381469726562e+01 -1.044080000000000119e+00 -4.318750381469726562e+01 -1.044085000000000152e+00 -4.315625000000000000e+01 -1.044090000000000185e+00 -4.303125381469726562e+01 -1.044094999999999995e+00 -4.309375381469726562e+01 -1.044100000000000028e+00 -4.315625000000000000e+01 -1.044105000000000061e+00 -4.315625000000000000e+01 -1.044110000000000094e+00 -4.318750381469726562e+01 -1.044115000000000126e+00 -4.315625000000000000e+01 -1.044120000000000159e+00 -4.312500381469726562e+01 -1.044125000000000192e+00 -4.309375381469726562e+01 -1.044130000000000003e+00 -4.306250000000000000e+01 -1.044135000000000035e+00 -4.312500381469726562e+01 -1.044140000000000068e+00 -4.306250000000000000e+01 -1.044145000000000101e+00 -4.306250000000000000e+01 -1.044150000000000134e+00 -4.296875381469726562e+01 -1.044155000000000166e+00 -4.300000000000000000e+01 -1.044159999999999977e+00 -4.306250000000000000e+01 -1.044165000000000010e+00 -4.306250000000000000e+01 -1.044170000000000043e+00 -4.309375381469726562e+01 -1.044175000000000075e+00 -4.306250000000000000e+01 -1.044180000000000108e+00 -4.306250000000000000e+01 -1.044185000000000141e+00 -4.306250000000000000e+01 -1.044190000000000174e+00 -4.300000000000000000e+01 -1.044194999999999984e+00 -4.303125381469726562e+01 -1.044200000000000017e+00 -4.300000000000000000e+01 -1.044205000000000050e+00 -4.300000000000000000e+01 -1.044210000000000083e+00 -4.293750381469726562e+01 -1.044215000000000115e+00 -4.296875381469726562e+01 -1.044220000000000148e+00 -4.300000000000000000e+01 -1.044225000000000181e+00 -4.300000000000000000e+01 -1.044229999999999992e+00 -4.300000000000000000e+01 -1.044235000000000024e+00 -4.296875381469726562e+01 -1.044240000000000057e+00 -4.300000000000000000e+01 -1.044245000000000090e+00 -4.300000000000000000e+01 -1.044250000000000123e+00 -4.293750381469726562e+01 -1.044255000000000155e+00 -4.290625000000000000e+01 -1.044260000000000188e+00 -4.290625000000000000e+01 -1.044264999999999999e+00 -4.293750381469726562e+01 -1.044270000000000032e+00 -4.290625000000000000e+01 -1.044275000000000064e+00 -4.296875381469726562e+01 -1.044280000000000097e+00 -4.290625000000000000e+01 -1.044285000000000130e+00 -4.290625000000000000e+01 -1.044290000000000163e+00 -4.293750381469726562e+01 -1.044295000000000195e+00 -4.290625000000000000e+01 -1.044300000000000006e+00 -4.290625000000000000e+01 -1.044305000000000039e+00 -4.284375000000000000e+01 -1.044310000000000072e+00 -4.281250381469726562e+01 -1.044315000000000104e+00 -4.290625000000000000e+01 -1.044320000000000137e+00 -4.284375000000000000e+01 -1.044325000000000170e+00 -4.281250381469726562e+01 -1.044329999999999981e+00 -4.284375000000000000e+01 -1.044335000000000013e+00 -4.287500381469726562e+01 -1.044340000000000046e+00 -4.284375000000000000e+01 -1.044345000000000079e+00 -4.287500381469726562e+01 -1.044350000000000112e+00 -4.284375000000000000e+01 -1.044355000000000144e+00 -4.281250381469726562e+01 -1.044360000000000177e+00 -4.287500381469726562e+01 -1.044364999999999988e+00 -4.278125381469726562e+01 -1.044370000000000021e+00 -4.281250381469726562e+01 -1.044375000000000053e+00 -4.281250381469726562e+01 -1.044380000000000086e+00 -4.287500381469726562e+01 -1.044385000000000119e+00 -4.278125381469726562e+01 -1.044390000000000152e+00 -4.284375000000000000e+01 -1.044395000000000184e+00 -4.278125381469726562e+01 -1.044399999999999995e+00 -4.278125381469726562e+01 -1.044405000000000028e+00 -4.278125381469726562e+01 -1.044410000000000061e+00 -4.281250381469726562e+01 -1.044415000000000093e+00 -4.278125381469726562e+01 -1.044420000000000126e+00 -4.278125381469726562e+01 -1.044425000000000159e+00 -4.271875381469726562e+01 -1.044430000000000192e+00 -4.275000000000000000e+01 -1.044435000000000002e+00 -4.271875381469726562e+01 -1.044440000000000035e+00 -4.271875381469726562e+01 -1.044445000000000068e+00 -4.271875381469726562e+01 -1.044450000000000101e+00 -4.265625000000000000e+01 -1.044455000000000133e+00 -4.275000000000000000e+01 -1.044460000000000166e+00 -4.268750000000000000e+01 -1.044464999999999977e+00 -4.262500381469726562e+01 -1.044470000000000010e+00 -4.268750000000000000e+01 -1.044475000000000042e+00 -4.268750000000000000e+01 -1.044480000000000075e+00 -4.271875381469726562e+01 -1.044485000000000108e+00 -4.265625000000000000e+01 -1.044490000000000141e+00 -4.265625000000000000e+01 -1.044495000000000173e+00 -4.268750000000000000e+01 -1.044499999999999984e+00 -4.268750000000000000e+01 -1.044505000000000017e+00 -4.265625000000000000e+01 -1.044510000000000050e+00 -4.262500381469726562e+01 -1.044515000000000082e+00 -4.265625000000000000e+01 -1.044520000000000115e+00 -4.259375000000000000e+01 -1.044525000000000148e+00 -4.268750000000000000e+01 -1.044530000000000181e+00 -4.256250381469726562e+01 -1.044534999999999991e+00 -4.256250381469726562e+01 -1.044540000000000024e+00 -4.259375000000000000e+01 -1.044545000000000057e+00 -4.262500381469726562e+01 -1.044550000000000090e+00 -4.256250381469726562e+01 -1.044555000000000122e+00 -4.259375000000000000e+01 -1.044560000000000155e+00 -4.253125000000000000e+01 -1.044565000000000188e+00 -4.259375000000000000e+01 -1.044569999999999999e+00 -4.259375000000000000e+01 -1.044575000000000031e+00 -4.256250381469726562e+01 -1.044580000000000064e+00 -4.253125000000000000e+01 -1.044585000000000097e+00 -4.256250381469726562e+01 -1.044590000000000130e+00 -4.250000000000000000e+01 -1.044595000000000162e+00 -4.253125000000000000e+01 -1.044600000000000195e+00 -4.253125000000000000e+01 -1.044605000000000006e+00 -4.253125000000000000e+01 -1.044610000000000039e+00 -4.256250381469726562e+01 -1.044615000000000071e+00 -4.256250381469726562e+01 -1.044620000000000104e+00 -4.250000000000000000e+01 -1.044625000000000137e+00 -4.259375000000000000e+01 -1.044630000000000170e+00 -4.256250381469726562e+01 -1.044634999999999980e+00 -4.256250381469726562e+01 -1.044640000000000013e+00 -4.253125000000000000e+01 -1.044645000000000046e+00 -4.253125000000000000e+01 -1.044650000000000079e+00 -4.250000000000000000e+01 -1.044655000000000111e+00 -4.253125000000000000e+01 -1.044660000000000144e+00 -4.253125000000000000e+01 -1.044665000000000177e+00 -4.253125000000000000e+01 -1.044669999999999987e+00 -4.250000000000000000e+01 -1.044675000000000020e+00 -4.250000000000000000e+01 -1.044680000000000053e+00 -4.246875381469726562e+01 -1.044685000000000086e+00 -4.246875381469726562e+01 -1.044690000000000119e+00 -4.246875381469726562e+01 -1.044695000000000151e+00 -4.246875381469726562e+01 -1.044700000000000184e+00 -4.250000000000000000e+01 -1.044704999999999995e+00 -4.243750000000000000e+01 -1.044710000000000027e+00 -4.250000000000000000e+01 -1.044715000000000060e+00 -4.250000000000000000e+01 -1.044720000000000093e+00 -4.250000000000000000e+01 -1.044725000000000126e+00 -4.246875381469726562e+01 -1.044730000000000159e+00 -4.246875381469726562e+01 -1.044735000000000191e+00 -4.246875381469726562e+01 -1.044740000000000002e+00 -4.246875381469726562e+01 -1.044745000000000035e+00 -4.246875381469726562e+01 -1.044750000000000068e+00 -4.250000000000000000e+01 -1.044755000000000100e+00 -4.240625381469726562e+01 -1.044760000000000133e+00 -4.243750000000000000e+01 -1.044765000000000166e+00 -4.246875381469726562e+01 -1.044769999999999976e+00 -4.234375000000000000e+01 -1.044775000000000009e+00 -4.243750000000000000e+01 -1.044780000000000042e+00 -4.243750000000000000e+01 -1.044785000000000075e+00 -4.243750000000000000e+01 -1.044790000000000108e+00 -4.237500381469726562e+01 -1.044795000000000140e+00 -4.234375000000000000e+01 -1.044800000000000173e+00 -4.243750000000000000e+01 -1.044804999999999984e+00 -4.231250381469726562e+01 -1.044810000000000016e+00 -4.240625381469726562e+01 -1.044815000000000049e+00 -4.234375000000000000e+01 -1.044820000000000082e+00 -4.228125000000000000e+01 -1.044825000000000115e+00 -4.237500381469726562e+01 -1.044830000000000148e+00 -4.231250381469726562e+01 -1.044835000000000180e+00 -4.231250381469726562e+01 -1.044839999999999991e+00 -4.228125000000000000e+01 -1.044845000000000024e+00 -4.234375000000000000e+01 -1.044850000000000056e+00 -4.231250381469726562e+01 -1.044855000000000089e+00 -4.225000381469726562e+01 -1.044860000000000122e+00 -4.225000381469726562e+01 -1.044865000000000155e+00 -4.225000381469726562e+01 -1.044870000000000188e+00 -4.231250381469726562e+01 -1.044874999999999998e+00 -4.231250381469726562e+01 -1.044880000000000031e+00 -4.218750000000000000e+01 -1.044885000000000064e+00 -4.228125000000000000e+01 -1.044890000000000096e+00 -4.225000381469726562e+01 -1.044895000000000129e+00 -4.228125000000000000e+01 -1.044900000000000162e+00 -4.221875381469726562e+01 -1.044905000000000195e+00 -4.228125000000000000e+01 -1.044910000000000005e+00 -4.228125000000000000e+01 -1.044915000000000038e+00 -4.218750000000000000e+01 -1.044920000000000071e+00 -4.221875381469726562e+01 -1.044925000000000104e+00 -4.218750000000000000e+01 -1.044930000000000136e+00 -4.218750000000000000e+01 -1.044935000000000169e+00 -4.218750000000000000e+01 -1.044939999999999980e+00 -4.215625381469726562e+01 -1.044945000000000013e+00 -4.215625381469726562e+01 -1.044950000000000045e+00 -4.221875381469726562e+01 -1.044955000000000078e+00 -4.218750000000000000e+01 -1.044960000000000111e+00 -4.215625381469726562e+01 -1.044965000000000144e+00 -4.218750000000000000e+01 -1.044970000000000176e+00 -4.215625381469726562e+01 -1.044974999999999987e+00 -4.215625381469726562e+01 -1.044980000000000020e+00 -4.212500000000000000e+01 -1.044985000000000053e+00 -4.218750000000000000e+01 -1.044990000000000085e+00 -4.209375381469726562e+01 -1.044995000000000118e+00 -4.212500000000000000e+01 -1.045000000000000151e+00 -4.215625381469726562e+01 -1.045005000000000184e+00 -4.215625381469726562e+01 -1.045009999999999994e+00 -4.212500000000000000e+01 -1.045015000000000027e+00 -4.209375381469726562e+01 -1.045020000000000060e+00 -4.209375381469726562e+01 -1.045025000000000093e+00 -4.209375381469726562e+01 -1.045030000000000125e+00 -4.209375381469726562e+01 -1.045035000000000158e+00 -4.203125000000000000e+01 -1.045040000000000191e+00 -4.203125000000000000e+01 -1.045045000000000002e+00 -4.203125000000000000e+01 -1.045050000000000034e+00 -4.206250381469726562e+01 -1.045055000000000067e+00 -4.203125000000000000e+01 -1.045060000000000100e+00 -4.206250381469726562e+01 -1.045065000000000133e+00 -4.196875000000000000e+01 -1.045070000000000165e+00 -4.200000381469726562e+01 -1.045074999999999976e+00 -4.200000381469726562e+01 -1.045080000000000009e+00 -4.193750000000000000e+01 -1.045085000000000042e+00 -4.196875000000000000e+01 -1.045090000000000074e+00 -4.196875000000000000e+01 -1.045095000000000107e+00 -4.193750000000000000e+01 -1.045100000000000140e+00 -4.193750000000000000e+01 -1.045105000000000173e+00 -4.193750000000000000e+01 -1.045109999999999983e+00 -4.190625381469726562e+01 -1.045115000000000016e+00 -4.196875000000000000e+01 -1.045120000000000049e+00 -4.196875000000000000e+01 -1.045125000000000082e+00 -4.196875000000000000e+01 -1.045130000000000114e+00 -4.190625381469726562e+01 -1.045135000000000147e+00 -4.196875000000000000e+01 -1.045140000000000180e+00 -4.190625381469726562e+01 -1.045144999999999991e+00 -4.190625381469726562e+01 -1.045150000000000023e+00 -4.193750000000000000e+01 -1.045155000000000056e+00 -4.187500000000000000e+01 -1.045160000000000089e+00 -4.193750000000000000e+01 -1.045165000000000122e+00 -4.190625381469726562e+01 -1.045170000000000154e+00 -4.184375381469726562e+01 -1.045175000000000187e+00 -4.181250000000000000e+01 -1.045179999999999998e+00 -4.187500000000000000e+01 -1.045185000000000031e+00 -4.187500000000000000e+01 -1.045190000000000063e+00 -4.184375381469726562e+01 -1.045195000000000096e+00 -4.181250000000000000e+01 -1.045200000000000129e+00 -4.181250000000000000e+01 -1.045205000000000162e+00 -4.187500000000000000e+01 -1.045210000000000194e+00 -4.184375381469726562e+01 -1.045215000000000005e+00 -4.184375381469726562e+01 -1.045220000000000038e+00 -4.184375381469726562e+01 -1.045225000000000071e+00 -4.178125000000000000e+01 -1.045230000000000103e+00 -4.181250000000000000e+01 -1.045235000000000136e+00 -4.181250000000000000e+01 -1.045240000000000169e+00 -4.178125000000000000e+01 -1.045244999999999980e+00 -4.184375381469726562e+01 -1.045250000000000012e+00 -4.181250000000000000e+01 -1.045255000000000045e+00 -4.181250000000000000e+01 -1.045260000000000078e+00 -4.178125000000000000e+01 -1.045265000000000111e+00 -4.175000381469726562e+01 -1.045270000000000143e+00 -4.175000381469726562e+01 -1.045275000000000176e+00 -4.181250000000000000e+01 -1.045279999999999987e+00 -4.175000381469726562e+01 -1.045285000000000020e+00 -4.175000381469726562e+01 -1.045290000000000052e+00 -4.171875000000000000e+01 -1.045295000000000085e+00 -4.171875000000000000e+01 -1.045300000000000118e+00 -4.175000381469726562e+01 -1.045305000000000151e+00 -4.168750381469726562e+01 -1.045310000000000183e+00 -4.175000381469726562e+01 -1.045314999999999994e+00 -4.171875000000000000e+01 -1.045320000000000027e+00 -4.165625381469726562e+01 -1.045325000000000060e+00 -4.168750381469726562e+01 -1.045330000000000092e+00 -4.171875000000000000e+01 -1.045335000000000125e+00 -4.165625381469726562e+01 -1.045340000000000158e+00 -4.168750381469726562e+01 -1.045345000000000191e+00 -4.162500000000000000e+01 -1.045350000000000001e+00 -4.168750381469726562e+01 -1.045355000000000034e+00 -4.162500000000000000e+01 -1.045360000000000067e+00 -4.165625381469726562e+01 -1.045365000000000100e+00 -4.165625381469726562e+01 -1.045370000000000132e+00 -4.159375381469726562e+01 -1.045375000000000165e+00 -4.159375381469726562e+01 -1.045379999999999976e+00 -4.159375381469726562e+01 -1.045385000000000009e+00 -4.156250000000000000e+01 -1.045390000000000041e+00 -4.162500000000000000e+01 -1.045395000000000074e+00 -4.168750381469726562e+01 -1.045400000000000107e+00 -4.156250000000000000e+01 -1.045405000000000140e+00 -4.159375381469726562e+01 -1.045410000000000172e+00 -4.156250000000000000e+01 -1.045414999999999983e+00 -4.159375381469726562e+01 -1.045420000000000016e+00 -4.153125381469726562e+01 -1.045425000000000049e+00 -4.156250000000000000e+01 -1.045430000000000081e+00 -4.159375381469726562e+01 -1.045435000000000114e+00 -4.156250000000000000e+01 -1.045440000000000147e+00 -4.150000381469726562e+01 -1.045445000000000180e+00 -4.153125381469726562e+01 -1.045449999999999990e+00 -4.156250000000000000e+01 -1.045455000000000023e+00 -4.153125381469726562e+01 -1.045460000000000056e+00 -4.150000381469726562e+01 -1.045465000000000089e+00 -4.153125381469726562e+01 -1.045470000000000121e+00 -4.146875000000000000e+01 -1.045475000000000154e+00 -4.146875000000000000e+01 -1.045480000000000187e+00 -4.150000381469726562e+01 -1.045484999999999998e+00 -4.146875000000000000e+01 -1.045490000000000030e+00 -4.150000381469726562e+01 -1.045495000000000063e+00 -4.143750381469726562e+01 -1.045500000000000096e+00 -4.146875000000000000e+01 -1.045505000000000129e+00 -4.140625000000000000e+01 -1.045510000000000161e+00 -4.146875000000000000e+01 -1.045515000000000194e+00 -4.146875000000000000e+01 -1.045520000000000005e+00 -4.150000381469726562e+01 -1.045525000000000038e+00 -4.143750381469726562e+01 -1.045530000000000070e+00 -4.146875000000000000e+01 -1.045535000000000103e+00 -4.140625000000000000e+01 -1.045540000000000136e+00 -4.140625000000000000e+01 -1.045545000000000169e+00 -4.134375381469726562e+01 -1.045549999999999979e+00 -4.137500381469726562e+01 -1.045555000000000012e+00 -4.134375381469726562e+01 -1.045560000000000045e+00 -4.131250000000000000e+01 -1.045565000000000078e+00 -4.137500381469726562e+01 -1.045570000000000110e+00 -4.134375381469726562e+01 -1.045575000000000143e+00 -4.131250000000000000e+01 -1.045580000000000176e+00 -4.134375381469726562e+01 -1.045584999999999987e+00 -4.134375381469726562e+01 -1.045590000000000019e+00 -4.137500381469726562e+01 -1.045595000000000052e+00 -4.134375381469726562e+01 -1.045600000000000085e+00 -4.137500381469726562e+01 -1.045605000000000118e+00 -4.134375381469726562e+01 -1.045610000000000150e+00 -4.134375381469726562e+01 -1.045615000000000183e+00 -4.134375381469726562e+01 -1.045619999999999994e+00 -4.128125381469726562e+01 -1.045625000000000027e+00 -4.134375381469726562e+01 -1.045630000000000059e+00 -4.128125381469726562e+01 -1.045635000000000092e+00 -4.128125381469726562e+01 -1.045640000000000125e+00 -4.121875000000000000e+01 -1.045645000000000158e+00 -4.128125381469726562e+01 -1.045650000000000190e+00 -4.121875000000000000e+01 -1.045655000000000001e+00 -4.121875000000000000e+01 -1.045660000000000034e+00 -4.121875000000000000e+01 -1.045665000000000067e+00 -4.118750381469726562e+01 -1.045670000000000099e+00 -4.118750381469726562e+01 -1.045675000000000132e+00 -4.118750381469726562e+01 -1.045680000000000165e+00 -4.118750381469726562e+01 -1.045684999999999976e+00 -4.118750381469726562e+01 -1.045690000000000008e+00 -4.121875000000000000e+01 -1.045695000000000041e+00 -4.112500381469726562e+01 -1.045700000000000074e+00 -4.115625000000000000e+01 -1.045705000000000107e+00 -4.109375000000000000e+01 -1.045710000000000139e+00 -4.115625000000000000e+01 -1.045715000000000172e+00 -4.115625000000000000e+01 -1.045719999999999983e+00 -4.115625000000000000e+01 -1.045725000000000016e+00 -4.103125381469726562e+01 -1.045730000000000048e+00 -4.106250000000000000e+01 -1.045735000000000081e+00 -4.109375000000000000e+01 -1.045740000000000114e+00 -4.103125381469726562e+01 -1.045745000000000147e+00 -4.109375000000000000e+01 -1.045750000000000179e+00 -4.112500381469726562e+01 -1.045754999999999990e+00 -4.103125381469726562e+01 -1.045760000000000023e+00 -4.100000000000000000e+01 -1.045765000000000056e+00 -4.103125381469726562e+01 -1.045770000000000088e+00 -4.096875381469726562e+01 -1.045775000000000121e+00 -4.103125381469726562e+01 -1.045780000000000154e+00 -4.100000000000000000e+01 -1.045785000000000187e+00 -4.103125381469726562e+01 -1.045789999999999997e+00 -4.096875381469726562e+01 -1.045795000000000030e+00 -4.096875381469726562e+01 -1.045800000000000063e+00 -4.103125381469726562e+01 -1.045805000000000096e+00 -4.096875381469726562e+01 -1.045810000000000128e+00 -4.096875381469726562e+01 -1.045815000000000161e+00 -4.096875381469726562e+01 -1.045820000000000194e+00 -4.096875381469726562e+01 -1.045825000000000005e+00 -4.090625000000000000e+01 -1.045830000000000037e+00 -4.087500381469726562e+01 -1.045835000000000070e+00 -4.090625000000000000e+01 -1.045840000000000103e+00 -4.090625000000000000e+01 -1.045845000000000136e+00 -4.090625000000000000e+01 -1.045850000000000168e+00 -4.090625000000000000e+01 -1.045854999999999979e+00 -4.090625000000000000e+01 -1.045860000000000012e+00 -4.084375000000000000e+01 -1.045865000000000045e+00 -4.087500381469726562e+01 -1.045870000000000077e+00 -4.090625000000000000e+01 -1.045875000000000110e+00 -4.090625000000000000e+01 -1.045880000000000143e+00 -4.081250381469726562e+01 -1.045885000000000176e+00 -4.084375000000000000e+01 -1.045889999999999986e+00 -4.081250381469726562e+01 -1.045895000000000019e+00 -4.078125381469726562e+01 -1.045900000000000052e+00 -4.078125381469726562e+01 -1.045905000000000085e+00 -4.084375000000000000e+01 -1.045910000000000117e+00 -4.075000000000000000e+01 -1.045915000000000150e+00 -4.081250381469726562e+01 -1.045920000000000183e+00 -4.081250381469726562e+01 -1.045924999999999994e+00 -4.075000000000000000e+01 -1.045930000000000026e+00 -4.078125381469726562e+01 -1.045935000000000059e+00 -4.068750000000000000e+01 -1.045940000000000092e+00 -4.068750000000000000e+01 -1.045945000000000125e+00 -4.071875381469726562e+01 -1.045950000000000157e+00 -4.075000000000000000e+01 -1.045955000000000190e+00 -4.068750000000000000e+01 -1.045960000000000001e+00 -4.062500381469726562e+01 -1.045965000000000034e+00 -4.078125381469726562e+01 -1.045970000000000066e+00 -4.068750000000000000e+01 -1.045975000000000099e+00 -4.065625381469726562e+01 -1.045980000000000132e+00 -4.062500381469726562e+01 -1.045985000000000165e+00 -4.068750000000000000e+01 -1.045989999999999975e+00 -4.065625381469726562e+01 -1.045995000000000008e+00 -4.059375000000000000e+01 -1.046000000000000041e+00 -4.059375000000000000e+01 -1.046005000000000074e+00 -4.056250381469726562e+01 -1.046010000000000106e+00 -4.065625381469726562e+01 -1.046015000000000139e+00 -4.059375000000000000e+01 -1.046020000000000172e+00 -4.056250381469726562e+01 -1.046024999999999983e+00 -4.056250381469726562e+01 -1.046030000000000015e+00 -4.065625381469726562e+01 -1.046035000000000048e+00 -4.056250381469726562e+01 -1.046040000000000081e+00 -4.050000000000000000e+01 -1.046045000000000114e+00 -4.059375000000000000e+01 -1.046050000000000146e+00 -4.050000000000000000e+01 -1.046055000000000179e+00 -4.056250381469726562e+01 -1.046059999999999990e+00 -4.050000000000000000e+01 -1.046065000000000023e+00 -4.050000000000000000e+01 -1.046070000000000055e+00 -4.050000000000000000e+01 -1.046075000000000088e+00 -4.050000000000000000e+01 -1.046080000000000121e+00 -4.037500000000000000e+01 -1.046085000000000154e+00 -4.046875381469726562e+01 -1.046090000000000186e+00 -4.046875381469726562e+01 -1.046094999999999997e+00 -4.040625381469726562e+01 -1.046100000000000030e+00 -4.043750000000000000e+01 -1.046105000000000063e+00 -4.037500000000000000e+01 -1.046110000000000095e+00 -4.043750000000000000e+01 -1.046115000000000128e+00 -4.043750000000000000e+01 -1.046120000000000161e+00 -4.043750000000000000e+01 -1.046125000000000194e+00 -4.046875381469726562e+01 -1.046130000000000004e+00 -4.040625381469726562e+01 -1.046135000000000037e+00 -4.043750000000000000e+01 -1.046140000000000070e+00 -4.043750000000000000e+01 -1.046145000000000103e+00 -4.043750000000000000e+01 -1.046150000000000135e+00 -4.040625381469726562e+01 -1.046155000000000168e+00 -4.040625381469726562e+01 -1.046159999999999979e+00 -4.037500000000000000e+01 -1.046165000000000012e+00 -4.040625381469726562e+01 -1.046170000000000044e+00 -4.034375000000000000e+01 -1.046175000000000077e+00 -4.037500000000000000e+01 -1.046180000000000110e+00 -4.031250381469726562e+01 -1.046185000000000143e+00 -4.031250381469726562e+01 -1.046190000000000175e+00 -4.028125000000000000e+01 -1.046194999999999986e+00 -4.028125000000000000e+01 -1.046200000000000019e+00 -4.034375000000000000e+01 -1.046205000000000052e+00 -4.031250381469726562e+01 -1.046210000000000084e+00 -4.028125000000000000e+01 -1.046215000000000117e+00 -4.028125000000000000e+01 -1.046220000000000150e+00 -4.028125000000000000e+01 -1.046225000000000183e+00 -4.028125000000000000e+01 -1.046229999999999993e+00 -4.028125000000000000e+01 -1.046235000000000026e+00 -4.028125000000000000e+01 -1.046240000000000059e+00 -4.018750000000000000e+01 -1.046245000000000092e+00 -4.025000381469726562e+01 -1.046250000000000124e+00 -4.028125000000000000e+01 -1.046255000000000157e+00 -4.028125000000000000e+01 -1.046260000000000190e+00 -4.028125000000000000e+01 -1.046265000000000001e+00 -4.021875000000000000e+01 -1.046270000000000033e+00 -4.025000381469726562e+01 -1.046275000000000066e+00 -4.025000381469726562e+01 -1.046280000000000099e+00 -4.018750000000000000e+01 -1.046285000000000132e+00 -4.021875000000000000e+01 -1.046290000000000164e+00 -4.015625381469726562e+01 -1.046294999999999975e+00 -4.015625381469726562e+01 -1.046300000000000008e+00 -4.021875000000000000e+01 -1.046305000000000041e+00 -4.018750000000000000e+01 -1.046310000000000073e+00 -4.025000381469726562e+01 -1.046315000000000106e+00 -4.015625381469726562e+01 -1.046320000000000139e+00 -4.028125000000000000e+01 -1.046325000000000172e+00 -4.018750000000000000e+01 -1.046329999999999982e+00 -4.012500000000000000e+01 -1.046335000000000015e+00 -4.012500000000000000e+01 -1.046340000000000048e+00 -4.009375381469726562e+01 -1.046345000000000081e+00 -4.009375381469726562e+01 -1.046350000000000113e+00 -4.009375381469726562e+01 -1.046355000000000146e+00 -4.012500000000000000e+01 -1.046360000000000179e+00 -4.006250381469726562e+01 -1.046364999999999990e+00 -4.009375381469726562e+01 -1.046370000000000022e+00 -4.006250381469726562e+01 -1.046375000000000055e+00 -4.006250381469726562e+01 -1.046380000000000088e+00 -4.003125000000000000e+01 -1.046385000000000121e+00 -4.009375381469726562e+01 -1.046390000000000153e+00 -4.009375381469726562e+01 -1.046395000000000186e+00 -4.009375381469726562e+01 -1.046399999999999997e+00 -4.006250381469726562e+01 -1.046405000000000030e+00 -4.003125000000000000e+01 -1.046410000000000062e+00 -4.006250381469726562e+01 -1.046415000000000095e+00 -4.003125000000000000e+01 -1.046420000000000128e+00 -4.003125000000000000e+01 -1.046425000000000161e+00 -4.003125000000000000e+01 -1.046430000000000193e+00 -4.003125000000000000e+01 -1.046435000000000004e+00 -4.009375381469726562e+01 -1.046440000000000037e+00 -4.003125000000000000e+01 -1.046445000000000070e+00 -4.006250381469726562e+01 -1.046450000000000102e+00 -4.003125000000000000e+01 -1.046455000000000135e+00 -3.993750381469726562e+01 -1.046460000000000168e+00 -3.987500000000000000e+01 -1.046464999999999979e+00 -3.990625381469726562e+01 -1.046470000000000011e+00 -4.003125000000000000e+01 -1.046475000000000044e+00 -3.996875000000000000e+01 -1.046480000000000077e+00 -3.990625381469726562e+01 -1.046485000000000110e+00 -3.990625381469726562e+01 -1.046490000000000142e+00 -3.987500000000000000e+01 -1.046495000000000175e+00 -3.987500000000000000e+01 -1.046499999999999986e+00 -3.984375381469726562e+01 -1.046505000000000019e+00 -3.984375381469726562e+01 -1.046510000000000051e+00 -3.981250000000000000e+01 -1.046515000000000084e+00 -3.978125000000000000e+01 -1.046520000000000117e+00 -3.981250000000000000e+01 -1.046525000000000150e+00 -3.978125000000000000e+01 -1.046530000000000182e+00 -3.981250000000000000e+01 -1.046534999999999993e+00 -3.968750381469726562e+01 -1.046540000000000026e+00 -3.975000381469726562e+01 -1.046545000000000059e+00 -3.975000381469726562e+01 -1.046550000000000091e+00 -3.975000381469726562e+01 -1.046555000000000124e+00 -3.975000381469726562e+01 -1.046560000000000157e+00 -3.968750381469726562e+01 -1.046565000000000190e+00 -3.965625000000000000e+01 -1.046570000000000000e+00 -3.971875000000000000e+01 -1.046575000000000033e+00 -3.962500000000000000e+01 -1.046580000000000066e+00 -3.965625000000000000e+01 -1.046585000000000099e+00 -3.965625000000000000e+01 -1.046590000000000131e+00 -3.959375381469726562e+01 -1.046595000000000164e+00 -3.962500000000000000e+01 -1.046599999999999975e+00 -3.953125381469726562e+01 -1.046605000000000008e+00 -3.959375381469726562e+01 -1.046610000000000040e+00 -3.959375381469726562e+01 -1.046615000000000073e+00 -3.956250000000000000e+01 -1.046620000000000106e+00 -3.953125381469726562e+01 -1.046625000000000139e+00 -3.950000000000000000e+01 -1.046630000000000171e+00 -3.953125381469726562e+01 -1.046634999999999982e+00 -3.959375381469726562e+01 -1.046640000000000015e+00 -3.956250000000000000e+01 -1.046645000000000048e+00 -3.946875000000000000e+01 -1.046650000000000080e+00 -3.946875000000000000e+01 -1.046655000000000113e+00 -3.950000000000000000e+01 -1.046660000000000146e+00 -3.946875000000000000e+01 -1.046665000000000179e+00 -3.940625000000000000e+01 -1.046669999999999989e+00 -3.943750381469726562e+01 -1.046675000000000022e+00 -3.940625000000000000e+01 -1.046680000000000055e+00 -3.940625000000000000e+01 -1.046685000000000088e+00 -3.937500381469726562e+01 -1.046690000000000120e+00 -3.934375381469726562e+01 -1.046695000000000153e+00 -3.934375381469726562e+01 -1.046700000000000186e+00 -3.934375381469726562e+01 -1.046704999999999997e+00 -3.928125381469726562e+01 -1.046710000000000029e+00 -3.928125381469726562e+01 -1.046715000000000062e+00 -3.928125381469726562e+01 -1.046720000000000095e+00 -3.931250000000000000e+01 -1.046725000000000128e+00 -3.928125381469726562e+01 -1.046730000000000160e+00 -3.928125381469726562e+01 -1.046735000000000193e+00 -3.918750381469726562e+01 -1.046740000000000004e+00 -3.918750381469726562e+01 -1.046745000000000037e+00 -3.918750381469726562e+01 -1.046750000000000069e+00 -3.912500381469726562e+01 -1.046755000000000102e+00 -3.918750381469726562e+01 -1.046760000000000135e+00 -3.921875381469726562e+01 -1.046765000000000168e+00 -3.912500381469726562e+01 -1.046769999999999978e+00 -3.909375000000000000e+01 -1.046775000000000011e+00 -3.909375000000000000e+01 -1.046780000000000044e+00 -3.909375000000000000e+01 -1.046785000000000077e+00 -3.903125381469726562e+01 -1.046790000000000109e+00 -3.912500381469726562e+01 -1.046795000000000142e+00 -3.906250000000000000e+01 -1.046800000000000175e+00 -3.906250000000000000e+01 -1.046804999999999986e+00 -3.906250000000000000e+01 -1.046810000000000018e+00 -3.906250000000000000e+01 -1.046815000000000051e+00 -3.906250000000000000e+01 -1.046820000000000084e+00 -3.900000000000000000e+01 -1.046825000000000117e+00 -3.903125381469726562e+01 -1.046830000000000149e+00 -3.900000000000000000e+01 -1.046835000000000182e+00 -3.903125381469726562e+01 -1.046839999999999993e+00 -3.893750000000000000e+01 -1.046845000000000026e+00 -3.890625000000000000e+01 -1.046850000000000058e+00 -3.890625000000000000e+01 -1.046855000000000091e+00 -3.896875381469726562e+01 -1.046860000000000124e+00 -3.890625000000000000e+01 -1.046865000000000157e+00 -3.884375000000000000e+01 -1.046870000000000189e+00 -3.878125000000000000e+01 -1.046875000000000000e+00 -3.884375000000000000e+01 -1.046880000000000033e+00 -3.881250381469726562e+01 -1.046885000000000066e+00 -3.878125000000000000e+01 -1.046890000000000098e+00 -3.871875381469726562e+01 -1.046895000000000131e+00 -3.871875381469726562e+01 -1.046900000000000164e+00 -3.871875381469726562e+01 -1.046905000000000197e+00 -3.871875381469726562e+01 -1.046910000000000007e+00 -3.868750000000000000e+01 -1.046915000000000040e+00 -3.865625381469726562e+01 -1.046920000000000073e+00 -3.859375000000000000e+01 -1.046925000000000106e+00 -3.850000381469726562e+01 -1.046930000000000138e+00 -3.856250381469726562e+01 -1.046935000000000171e+00 -3.840625381469726562e+01 -1.046939999999999982e+00 -3.834375381469726562e+01 -1.046945000000000014e+00 -3.818750000000000000e+01 -1.046950000000000047e+00 -3.815625381469726562e+01 -1.046955000000000080e+00 -3.793750381469726562e+01 -1.046960000000000113e+00 -3.784375381469726562e+01 -1.046965000000000146e+00 -3.765625000000000000e+01 -1.046970000000000178e+00 -3.740625000000000000e+01 -1.046974999999999989e+00 -3.725000000000000000e+01 -1.046980000000000022e+00 -3.690625381469726562e+01 -1.046985000000000054e+00 -3.665625381469726562e+01 -1.046990000000000087e+00 -3.631250000000000000e+01 -1.046995000000000120e+00 -3.603125000000000000e+01 -1.047000000000000153e+00 -3.565625000000000000e+01 -1.047005000000000186e+00 -3.534375000000000000e+01 -1.047009999999999996e+00 -3.503125000000000000e+01 -1.047015000000000029e+00 -3.459375000000000000e+01 -1.047020000000000062e+00 -3.421875000000000000e+01 -1.047025000000000095e+00 -3.378125381469726562e+01 -1.047030000000000127e+00 -3.340625000000000000e+01 -1.047035000000000160e+00 -3.296875381469726562e+01 -1.047040000000000193e+00 -3.253125000000000000e+01 -1.047045000000000003e+00 -3.215625000000000000e+01 -1.047050000000000036e+00 -3.165625000000000000e+01 -1.047055000000000069e+00 -3.115625190734863281e+01 -1.047060000000000102e+00 -3.071875190734863281e+01 -1.047065000000000135e+00 -3.025000190734863281e+01 -1.047070000000000167e+00 -2.968750190734863281e+01 -1.047074999999999978e+00 -2.918750000000000000e+01 -1.047080000000000011e+00 -2.862500190734863281e+01 -1.047085000000000043e+00 -2.812500190734863281e+01 -1.047090000000000076e+00 -2.753125190734863281e+01 -1.047095000000000109e+00 -2.700000000000000000e+01 -1.047100000000000142e+00 -2.637500190734863281e+01 -1.047105000000000175e+00 -2.578125190734863281e+01 -1.047109999999999985e+00 -2.506250190734863281e+01 -1.047115000000000018e+00 -2.446875190734863281e+01 -1.047120000000000051e+00 -2.375000190734863281e+01 -1.047125000000000083e+00 -2.296875000000000000e+01 -1.047130000000000116e+00 -2.234375190734863281e+01 -1.047135000000000149e+00 -2.146875190734863281e+01 -1.047140000000000182e+00 -2.062500000000000000e+01 -1.047144999999999992e+00 -1.971875190734863281e+01 -1.047150000000000025e+00 -1.884375190734863281e+01 -1.047155000000000058e+00 -1.787500000000000000e+01 -1.047160000000000091e+00 -1.690625000000000000e+01 -1.047165000000000123e+00 -1.578125000000000000e+01 -1.047170000000000156e+00 -1.478125095367431641e+01 -1.047175000000000189e+00 -1.365625000000000000e+01 -1.047180000000000000e+00 -1.256250000000000000e+01 -1.047185000000000032e+00 -1.140625000000000000e+01 -1.047190000000000065e+00 -1.018750000000000000e+01 -1.047195000000000098e+00 -9.000000953674316406e+00 -1.047200000000000131e+00 -7.718750476837158203e+00 -1.047205000000000163e+00 -6.593750476837158203e+00 -1.047210000000000196e+00 -5.375000000000000000e+00 -1.047215000000000007e+00 -4.187500000000000000e+00 -1.047220000000000040e+00 -3.031250000000000000e+00 -1.047225000000000072e+00 -1.812500119209289551e+00 -1.047230000000000105e+00 -7.812500000000000000e-01 -1.047235000000000138e+00 4.062500000000000000e-01 -1.047240000000000171e+00 1.406250000000000000e+00 -1.047244999999999981e+00 2.500000238418579102e+00 -1.047250000000000014e+00 3.531250238418579102e+00 -1.047255000000000047e+00 4.500000476837158203e+00 -1.047260000000000080e+00 5.531250000000000000e+00 -1.047265000000000112e+00 6.437500476837158203e+00 -1.047270000000000145e+00 7.343750476837158203e+00 -1.047275000000000178e+00 8.218750000000000000e+00 -1.047279999999999989e+00 9.093750000000000000e+00 -1.047285000000000021e+00 9.937500953674316406e+00 -1.047290000000000054e+00 1.068750000000000000e+01 -1.047295000000000087e+00 1.140625000000000000e+01 -1.047300000000000120e+00 1.206250000000000000e+01 -1.047305000000000152e+00 1.278125000000000000e+01 -1.047310000000000185e+00 1.331250095367431641e+01 -1.047314999999999996e+00 1.390625095367431641e+01 -1.047320000000000029e+00 1.453125095367431641e+01 -1.047325000000000061e+00 1.500000095367431641e+01 -1.047330000000000094e+00 1.540625095367431641e+01 -1.047335000000000127e+00 1.584375095367431641e+01 -1.047340000000000160e+00 1.625000190734863281e+01 -1.047345000000000192e+00 1.659375000000000000e+01 -1.047350000000000003e+00 1.700000000000000000e+01 -1.047355000000000036e+00 1.718750000000000000e+01 -1.047360000000000069e+00 1.746875000000000000e+01 -1.047365000000000101e+00 1.753125190734863281e+01 -1.047370000000000134e+00 1.784375190734863281e+01 -1.047375000000000167e+00 1.800000190734863281e+01 -1.047379999999999978e+00 1.806250000000000000e+01 -1.047385000000000010e+00 1.809375190734863281e+01 -1.047390000000000043e+00 1.821875000000000000e+01 -1.047395000000000076e+00 1.812500190734863281e+01 -1.047400000000000109e+00 1.815625000000000000e+01 -1.047405000000000141e+00 1.806250000000000000e+01 -1.047410000000000174e+00 1.800000190734863281e+01 -1.047414999999999985e+00 1.787500000000000000e+01 -1.047420000000000018e+00 1.768750190734863281e+01 -1.047425000000000050e+00 1.750000000000000000e+01 -1.047430000000000083e+00 1.734375000000000000e+01 -1.047435000000000116e+00 1.703125000000000000e+01 -1.047440000000000149e+00 1.687500000000000000e+01 -1.047445000000000181e+00 1.656250190734863281e+01 -1.047449999999999992e+00 1.628125000000000000e+01 -1.047455000000000025e+00 1.600000000000000000e+01 -1.047460000000000058e+00 1.565625190734863281e+01 -1.047465000000000090e+00 1.531250000000000000e+01 -1.047470000000000123e+00 1.484375095367431641e+01 -1.047475000000000156e+00 1.446875095367431641e+01 -1.047480000000000189e+00 1.412500095367431641e+01 -1.047484999999999999e+00 1.371875000000000000e+01 -1.047490000000000032e+00 1.328125000000000000e+01 -1.047495000000000065e+00 1.281250095367431641e+01 -1.047500000000000098e+00 1.234375000000000000e+01 -1.047505000000000130e+00 1.187500095367431641e+01 -1.047510000000000163e+00 1.137500095367431641e+01 -1.047515000000000196e+00 1.093750095367431641e+01 -1.047520000000000007e+00 1.037500095367431641e+01 -1.047525000000000039e+00 9.843750953674316406e+00 -1.047530000000000072e+00 9.250000000000000000e+00 -1.047535000000000105e+00 8.812500000000000000e+00 -1.047540000000000138e+00 8.250000000000000000e+00 -1.047545000000000170e+00 7.687500000000000000e+00 -1.047549999999999981e+00 7.125000476837158203e+00 -1.047555000000000014e+00 6.562500476837158203e+00 -1.047560000000000047e+00 6.000000000000000000e+00 -1.047565000000000079e+00 5.375000000000000000e+00 -1.047570000000000112e+00 4.750000476837158203e+00 -1.047575000000000145e+00 4.156250000000000000e+00 -1.047580000000000178e+00 3.562500238418579102e+00 -1.047584999999999988e+00 2.843750238418579102e+00 -1.047590000000000021e+00 2.218750000000000000e+00 -1.047595000000000054e+00 1.625000000000000000e+00 -1.047600000000000087e+00 1.000000000000000000e+00 -1.047605000000000119e+00 3.437500298023223877e-01 -1.047610000000000152e+00 -3.125000298023223877e-01 -1.047615000000000185e+00 -9.375000596046447754e-01 -1.047619999999999996e+00 -1.562500000000000000e+00 -1.047625000000000028e+00 -2.250000238418579102e+00 -1.047630000000000061e+00 -2.875000238418579102e+00 -1.047635000000000094e+00 -3.562500238418579102e+00 -1.047640000000000127e+00 -4.312500476837158203e+00 -1.047645000000000159e+00 -4.906250000000000000e+00 -1.047650000000000192e+00 -5.593750000000000000e+00 -1.047655000000000003e+00 -6.218750476837158203e+00 -1.047660000000000036e+00 -6.937500476837158203e+00 -1.047665000000000068e+00 -7.562500476837158203e+00 -1.047670000000000101e+00 -8.343750953674316406e+00 -1.047675000000000134e+00 -8.968750000000000000e+00 -1.047680000000000167e+00 -9.625000953674316406e+00 -1.047684999999999977e+00 -1.028125095367431641e+01 -1.047690000000000010e+00 -1.093750095367431641e+01 -1.047695000000000043e+00 -1.162500000000000000e+01 -1.047700000000000076e+00 -1.228125000000000000e+01 -1.047705000000000108e+00 -1.293750095367431641e+01 -1.047710000000000141e+00 -1.359375095367431641e+01 -1.047715000000000174e+00 -1.425000095367431641e+01 -1.047719999999999985e+00 -1.490625095367431641e+01 -1.047725000000000017e+00 -1.550000095367431641e+01 -1.047730000000000050e+00 -1.615625000000000000e+01 -1.047735000000000083e+00 -1.678125000000000000e+01 -1.047740000000000116e+00 -1.746875000000000000e+01 -1.047745000000000148e+00 -1.809375190734863281e+01 -1.047750000000000181e+00 -1.871875190734863281e+01 -1.047754999999999992e+00 -1.928125190734863281e+01 -1.047760000000000025e+00 -1.987500190734863281e+01 -1.047765000000000057e+00 -2.046875190734863281e+01 -1.047770000000000090e+00 -2.106250000000000000e+01 -1.047775000000000123e+00 -2.162500190734863281e+01 -1.047780000000000156e+00 -2.225000000000000000e+01 -1.047785000000000188e+00 -2.287500190734863281e+01 -1.047789999999999999e+00 -2.340625000000000000e+01 -1.047795000000000032e+00 -2.396875000000000000e+01 -1.047800000000000065e+00 -2.453125000000000000e+01 -1.047805000000000097e+00 -2.500000000000000000e+01 -1.047810000000000130e+00 -2.553125190734863281e+01 -1.047815000000000163e+00 -2.612500000000000000e+01 -1.047820000000000196e+00 -2.665625190734863281e+01 -1.047825000000000006e+00 -2.718750190734863281e+01 -1.047830000000000039e+00 -2.765625190734863281e+01 -1.047835000000000072e+00 -2.818750190734863281e+01 -1.047840000000000105e+00 -2.865625190734863281e+01 -1.047845000000000137e+00 -2.918750000000000000e+01 -1.047850000000000170e+00 -2.965625190734863281e+01 -1.047854999999999981e+00 -3.009375190734863281e+01 -1.047860000000000014e+00 -3.050000190734863281e+01 -1.047865000000000046e+00 -3.103125000000000000e+01 -1.047870000000000079e+00 -3.143750190734863281e+01 -1.047875000000000112e+00 -3.190625000000000000e+01 -1.047880000000000145e+00 -3.231250000000000000e+01 -1.047885000000000177e+00 -3.271875000000000000e+01 -1.047889999999999988e+00 -3.318750000000000000e+01 -1.047895000000000021e+00 -3.350000000000000000e+01 -1.047900000000000054e+00 -3.396875000000000000e+01 -1.047905000000000086e+00 -3.440625381469726562e+01 -1.047910000000000119e+00 -3.475000381469726562e+01 -1.047915000000000152e+00 -3.515625000000000000e+01 -1.047920000000000185e+00 -3.553125381469726562e+01 -1.047924999999999995e+00 -3.593750381469726562e+01 -1.047930000000000028e+00 -3.631250000000000000e+01 -1.047935000000000061e+00 -3.665625381469726562e+01 -1.047940000000000094e+00 -3.703125381469726562e+01 -1.047945000000000126e+00 -3.740625000000000000e+01 -1.047950000000000159e+00 -3.771875000000000000e+01 -1.047955000000000192e+00 -3.803125000000000000e+01 -1.047960000000000003e+00 -3.846875381469726562e+01 -1.047965000000000035e+00 -3.865625381469726562e+01 -1.047970000000000068e+00 -3.900000000000000000e+01 -1.047975000000000101e+00 -3.934375381469726562e+01 -1.047980000000000134e+00 -3.956250000000000000e+01 -1.047985000000000166e+00 -4.000000381469726562e+01 -1.047989999999999977e+00 -4.021875000000000000e+01 -1.047995000000000010e+00 -4.050000000000000000e+01 -1.048000000000000043e+00 -4.081250381469726562e+01 -1.048005000000000075e+00 -4.103125381469726562e+01 -1.048010000000000108e+00 -4.131250000000000000e+01 -1.048015000000000141e+00 -4.159375381469726562e+01 -1.048020000000000174e+00 -4.190625381469726562e+01 -1.048024999999999984e+00 -4.218750000000000000e+01 -1.048030000000000017e+00 -4.234375000000000000e+01 -1.048035000000000050e+00 -4.262500381469726562e+01 -1.048040000000000083e+00 -4.290625000000000000e+01 -1.048045000000000115e+00 -4.315625000000000000e+01 -1.048050000000000148e+00 -4.340625000000000000e+01 -1.048055000000000181e+00 -4.359375381469726562e+01 -1.048059999999999992e+00 -4.381250381469726562e+01 -1.048065000000000024e+00 -4.406250381469726562e+01 -1.048070000000000057e+00 -4.431250381469726562e+01 -1.048075000000000090e+00 -4.450000000000000000e+01 -1.048080000000000123e+00 -4.471875381469726562e+01 -1.048085000000000155e+00 -4.493750381469726562e+01 -1.048090000000000188e+00 -4.512500381469726562e+01 -1.048094999999999999e+00 -4.531250000000000000e+01 -1.048100000000000032e+00 -4.546875000000000000e+01 -1.048105000000000064e+00 -4.568750000000000000e+01 -1.048110000000000097e+00 -4.593750000000000000e+01 -1.048115000000000130e+00 -4.609375000000000000e+01 -1.048120000000000163e+00 -4.625000000000000000e+01 -1.048125000000000195e+00 -4.643750000000000000e+01 -1.048130000000000006e+00 -4.665625000000000000e+01 -1.048135000000000039e+00 -4.681250000000000000e+01 -1.048140000000000072e+00 -4.696875000000000000e+01 -1.048145000000000104e+00 -4.706250000000000000e+01 -1.048150000000000137e+00 -4.725000381469726562e+01 -1.048155000000000170e+00 -4.743750381469726562e+01 -1.048159999999999981e+00 -4.753125000000000000e+01 -1.048165000000000013e+00 -4.765625381469726562e+01 -1.048170000000000046e+00 -4.790625381469726562e+01 -1.048175000000000079e+00 -4.803125000000000000e+01 -1.048180000000000112e+00 -4.806250381469726562e+01 -1.048185000000000144e+00 -4.828125381469726562e+01 -1.048190000000000177e+00 -4.840625000000000000e+01 -1.048194999999999988e+00 -4.853125381469726562e+01 -1.048200000000000021e+00 -4.868750381469726562e+01 -1.048205000000000053e+00 -4.884375381469726562e+01 -1.048210000000000086e+00 -4.900000381469726562e+01 -1.048215000000000119e+00 -4.900000381469726562e+01 -1.048220000000000152e+00 -4.918750381469726562e+01 -1.048225000000000184e+00 -4.925000381469726562e+01 -1.048229999999999995e+00 -4.934375381469726562e+01 -1.048235000000000028e+00 -4.950000381469726562e+01 -1.048240000000000061e+00 -4.962500000000000000e+01 -1.048245000000000093e+00 -4.978125000000000000e+01 -1.048250000000000126e+00 -4.984375000000000000e+01 -1.048255000000000159e+00 -4.996875381469726562e+01 -1.048260000000000192e+00 -5.003125381469726562e+01 -1.048265000000000002e+00 -5.009375000000000000e+01 -1.048270000000000035e+00 -5.021875381469726562e+01 -1.048275000000000068e+00 -5.031250381469726562e+01 -1.048280000000000101e+00 -5.040625000000000000e+01 -1.048285000000000133e+00 -5.053125381469726562e+01 -1.048290000000000166e+00 -5.053125381469726562e+01 -1.048294999999999977e+00 -5.062500381469726562e+01 -1.048300000000000010e+00 -5.075000381469726562e+01 -1.048305000000000042e+00 -5.078125381469726562e+01 -1.048310000000000075e+00 -5.084375381469726562e+01 -1.048315000000000108e+00 -5.093750381469726562e+01 -1.048320000000000141e+00 -5.103125381469726562e+01 -1.048325000000000173e+00 -5.103125381469726562e+01 -1.048329999999999984e+00 -5.118750381469726562e+01 -1.048335000000000017e+00 -5.118750381469726562e+01 -1.048340000000000050e+00 -5.128125000000000000e+01 -1.048345000000000082e+00 -5.140625381469726562e+01 -1.048350000000000115e+00 -5.143750000000000000e+01 -1.048355000000000148e+00 -5.150000381469726562e+01 -1.048360000000000181e+00 -5.150000381469726562e+01 -1.048364999999999991e+00 -5.168750000000000000e+01 -1.048370000000000024e+00 -5.165625381469726562e+01 -1.048375000000000057e+00 -5.168750000000000000e+01 -1.048380000000000090e+00 -5.178125381469726562e+01 -1.048385000000000122e+00 -5.175000381469726562e+01 -1.048390000000000155e+00 -5.181250381469726562e+01 -1.048395000000000188e+00 -5.193750000000000000e+01 -1.048399999999999999e+00 -5.196875381469726562e+01 -1.048405000000000031e+00 -5.203125381469726562e+01 -1.048410000000000064e+00 -5.209375000000000000e+01 -1.048415000000000097e+00 -5.206250381469726562e+01 -1.048420000000000130e+00 -5.215625000000000000e+01 -1.048425000000000162e+00 -5.215625000000000000e+01 -1.048430000000000195e+00 -5.218750381469726562e+01 -1.048435000000000006e+00 -5.225000000000000000e+01 -1.048440000000000039e+00 -5.221875381469726562e+01 -1.048445000000000071e+00 -5.228125381469726562e+01 -1.048450000000000104e+00 -5.234375381469726562e+01 -1.048455000000000137e+00 -5.234375381469726562e+01 -1.048460000000000170e+00 -5.240625000000000000e+01 -1.048464999999999980e+00 -5.237500381469726562e+01 -1.048470000000000013e+00 -5.246875381469726562e+01 -1.048475000000000046e+00 -5.246875381469726562e+01 -1.048480000000000079e+00 -5.253125381469726562e+01 -1.048485000000000111e+00 -5.253125381469726562e+01 -1.048490000000000144e+00 -5.253125381469726562e+01 -1.048495000000000177e+00 -5.256250000000000000e+01 -1.048499999999999988e+00 -5.253125381469726562e+01 -1.048505000000000020e+00 -5.265625381469726562e+01 -1.048510000000000053e+00 -5.262500381469726562e+01 -1.048515000000000086e+00 -5.265625381469726562e+01 -1.048520000000000119e+00 -5.262500381469726562e+01 -1.048525000000000151e+00 -5.265625381469726562e+01 -1.048530000000000184e+00 -5.271875000000000000e+01 -1.048534999999999995e+00 -5.278125381469726562e+01 -1.048540000000000028e+00 -5.275000381469726562e+01 -1.048545000000000060e+00 -5.271875000000000000e+01 -1.048550000000000093e+00 -5.275000381469726562e+01 -1.048555000000000126e+00 -5.278125381469726562e+01 -1.048560000000000159e+00 -5.284375381469726562e+01 -1.048565000000000191e+00 -5.287500000000000000e+01 -1.048570000000000002e+00 -5.284375381469726562e+01 -1.048575000000000035e+00 -5.281250000000000000e+01 -1.048580000000000068e+00 -5.284375381469726562e+01 -1.048585000000000100e+00 -5.293750381469726562e+01 -1.048590000000000133e+00 -5.290625381469726562e+01 -1.048595000000000166e+00 -5.293750381469726562e+01 -1.048599999999999977e+00 -5.284375381469726562e+01 -1.048605000000000009e+00 -5.293750381469726562e+01 -1.048610000000000042e+00 -5.293750381469726562e+01 -1.048615000000000075e+00 -5.290625381469726562e+01 -1.048620000000000108e+00 -5.293750381469726562e+01 -1.048625000000000140e+00 -5.290625381469726562e+01 -1.048630000000000173e+00 -5.296875000000000000e+01 -1.048634999999999984e+00 -5.293750381469726562e+01 -1.048640000000000017e+00 -5.296875000000000000e+01 -1.048645000000000049e+00 -5.300000381469726562e+01 -1.048650000000000082e+00 -5.296875000000000000e+01 -1.048655000000000115e+00 -5.290625381469726562e+01 -1.048660000000000148e+00 -5.293750381469726562e+01 -1.048665000000000180e+00 -5.296875000000000000e+01 -1.048669999999999991e+00 -5.296875000000000000e+01 -1.048675000000000024e+00 -5.296875000000000000e+01 -1.048680000000000057e+00 -5.296875000000000000e+01 -1.048685000000000089e+00 -5.287500000000000000e+01 -1.048690000000000122e+00 -5.296875000000000000e+01 -1.048695000000000155e+00 -5.300000381469726562e+01 -1.048700000000000188e+00 -5.296875000000000000e+01 -1.048704999999999998e+00 -5.303125000000000000e+01 -1.048710000000000031e+00 -5.300000381469726562e+01 -1.048715000000000064e+00 -5.293750381469726562e+01 -1.048720000000000097e+00 -5.300000381469726562e+01 -1.048725000000000129e+00 -5.296875000000000000e+01 -1.048730000000000162e+00 -5.293750381469726562e+01 -1.048735000000000195e+00 -5.293750381469726562e+01 -1.048740000000000006e+00 -5.296875000000000000e+01 -1.048745000000000038e+00 -5.296875000000000000e+01 -1.048750000000000071e+00 -5.287500000000000000e+01 -1.048755000000000104e+00 -5.290625381469726562e+01 -1.048760000000000137e+00 -5.290625381469726562e+01 -1.048765000000000169e+00 -5.287500000000000000e+01 -1.048769999999999980e+00 -5.284375381469726562e+01 -1.048775000000000013e+00 -5.281250000000000000e+01 -1.048780000000000046e+00 -5.284375381469726562e+01 -1.048785000000000078e+00 -5.287500000000000000e+01 -1.048790000000000111e+00 -5.287500000000000000e+01 -1.048795000000000144e+00 -5.284375381469726562e+01 -1.048800000000000177e+00 -5.284375381469726562e+01 -1.048804999999999987e+00 -5.287500000000000000e+01 -1.048810000000000020e+00 -5.278125381469726562e+01 -1.048815000000000053e+00 -5.284375381469726562e+01 -1.048820000000000086e+00 -5.275000381469726562e+01 -1.048825000000000118e+00 -5.281250000000000000e+01 -1.048830000000000151e+00 -5.271875000000000000e+01 -1.048835000000000184e+00 -5.268750381469726562e+01 -1.048839999999999995e+00 -5.278125381469726562e+01 -1.048845000000000027e+00 -5.271875000000000000e+01 -1.048850000000000060e+00 -5.271875000000000000e+01 -1.048855000000000093e+00 -5.271875000000000000e+01 -1.048860000000000126e+00 -5.265625381469726562e+01 -1.048865000000000158e+00 -5.262500381469726562e+01 -1.048870000000000191e+00 -5.265625381469726562e+01 -1.048875000000000002e+00 -5.265625381469726562e+01 -1.048880000000000035e+00 -5.253125381469726562e+01 -1.048885000000000067e+00 -5.262500381469726562e+01 -1.048890000000000100e+00 -5.259375381469726562e+01 -1.048895000000000133e+00 -5.250000381469726562e+01 -1.048900000000000166e+00 -5.259375381469726562e+01 -1.048904999999999976e+00 -5.256250000000000000e+01 -1.048910000000000009e+00 -5.253125381469726562e+01 -1.048915000000000042e+00 -5.253125381469726562e+01 -1.048920000000000075e+00 -5.250000381469726562e+01 -1.048925000000000107e+00 -5.246875381469726562e+01 -1.048930000000000140e+00 -5.250000381469726562e+01 -1.048935000000000173e+00 -5.243750381469726562e+01 -1.048939999999999984e+00 -5.246875381469726562e+01 -1.048945000000000016e+00 -5.240625000000000000e+01 -1.048950000000000049e+00 -5.243750381469726562e+01 -1.048955000000000082e+00 -5.240625000000000000e+01 -1.048960000000000115e+00 -5.231250000000000000e+01 -1.048965000000000147e+00 -5.234375381469726562e+01 -1.048970000000000180e+00 -5.240625000000000000e+01 -1.048974999999999991e+00 -5.234375381469726562e+01 -1.048980000000000024e+00 -5.228125381469726562e+01 -1.048985000000000056e+00 -5.231250000000000000e+01 -1.048990000000000089e+00 -5.221875381469726562e+01 -1.048995000000000122e+00 -5.228125381469726562e+01 -1.049000000000000155e+00 -5.228125381469726562e+01 -1.049005000000000187e+00 -5.221875381469726562e+01 -1.049009999999999998e+00 -5.218750381469726562e+01 -1.049015000000000031e+00 -5.215625000000000000e+01 -1.049020000000000064e+00 -5.215625000000000000e+01 -1.049025000000000096e+00 -5.218750381469726562e+01 -1.049030000000000129e+00 -5.212500381469726562e+01 -1.049035000000000162e+00 -5.203125381469726562e+01 -1.049040000000000195e+00 -5.209375000000000000e+01 -1.049045000000000005e+00 -5.203125381469726562e+01 -1.049050000000000038e+00 -5.203125381469726562e+01 -1.049055000000000071e+00 -5.203125381469726562e+01 -1.049060000000000104e+00 -5.196875381469726562e+01 -1.049065000000000136e+00 -5.193750000000000000e+01 -1.049070000000000169e+00 -5.193750000000000000e+01 -1.049074999999999980e+00 -5.190625381469726562e+01 -1.049080000000000013e+00 -5.187500381469726562e+01 -1.049085000000000045e+00 -5.187500381469726562e+01 -1.049090000000000078e+00 -5.184375000000000000e+01 -1.049095000000000111e+00 -5.181250381469726562e+01 -1.049100000000000144e+00 -5.178125381469726562e+01 -1.049105000000000176e+00 -5.181250381469726562e+01 -1.049109999999999987e+00 -5.178125381469726562e+01 -1.049115000000000020e+00 -5.171875381469726562e+01 -1.049120000000000053e+00 -5.175000381469726562e+01 -1.049125000000000085e+00 -5.171875381469726562e+01 -1.049130000000000118e+00 -5.168750000000000000e+01 -1.049135000000000151e+00 -5.168750000000000000e+01 -1.049140000000000184e+00 -5.168750000000000000e+01 -1.049144999999999994e+00 -5.165625381469726562e+01 -1.049150000000000027e+00 -5.162500381469726562e+01 -1.049155000000000060e+00 -5.162500381469726562e+01 -1.049160000000000093e+00 -5.150000381469726562e+01 -1.049165000000000125e+00 -5.150000381469726562e+01 -1.049170000000000158e+00 -5.153125000000000000e+01 -1.049175000000000191e+00 -5.146875381469726562e+01 -1.049180000000000001e+00 -5.150000381469726562e+01 -1.049185000000000034e+00 -5.143750000000000000e+01 -1.049190000000000067e+00 -5.146875381469726562e+01 -1.049195000000000100e+00 -5.143750000000000000e+01 -1.049200000000000133e+00 -5.140625381469726562e+01 -1.049205000000000165e+00 -5.140625381469726562e+01 -1.049209999999999976e+00 -5.137500000000000000e+01 -1.049215000000000009e+00 -5.137500000000000000e+01 -1.049220000000000041e+00 -5.131250381469726562e+01 -1.049225000000000074e+00 -5.128125000000000000e+01 -1.049230000000000107e+00 -5.128125000000000000e+01 -1.049235000000000140e+00 -5.128125000000000000e+01 -1.049240000000000173e+00 -5.128125000000000000e+01 -1.049244999999999983e+00 -5.121875000000000000e+01 -1.049250000000000016e+00 -5.128125000000000000e+01 -1.049255000000000049e+00 -5.121875000000000000e+01 -1.049260000000000081e+00 -5.115625381469726562e+01 -1.049265000000000114e+00 -5.121875000000000000e+01 -1.049270000000000147e+00 -5.121875000000000000e+01 -1.049275000000000180e+00 -5.112500000000000000e+01 -1.049279999999999990e+00 -5.115625381469726562e+01 -1.049285000000000023e+00 -5.103125381469726562e+01 -1.049290000000000056e+00 -5.103125381469726562e+01 -1.049295000000000089e+00 -5.109375381469726562e+01 -1.049300000000000122e+00 -5.100000381469726562e+01 -1.049305000000000154e+00 -5.106250381469726562e+01 -1.049310000000000187e+00 -5.096875000000000000e+01 -1.049314999999999998e+00 -5.100000381469726562e+01 -1.049320000000000030e+00 -5.093750381469726562e+01 -1.049325000000000063e+00 -5.100000381469726562e+01 -1.049330000000000096e+00 -5.093750381469726562e+01 -1.049335000000000129e+00 -5.090625381469726562e+01 -1.049340000000000162e+00 -5.090625381469726562e+01 -1.049345000000000194e+00 -5.084375381469726562e+01 -1.049350000000000005e+00 -5.087500000000000000e+01 -1.049355000000000038e+00 -5.081250000000000000e+01 -1.049360000000000070e+00 -5.081250000000000000e+01 -1.049365000000000103e+00 -5.084375381469726562e+01 -1.049370000000000136e+00 -5.081250000000000000e+01 -1.049375000000000169e+00 -5.081250000000000000e+01 -1.049379999999999979e+00 -5.078125381469726562e+01 -1.049385000000000012e+00 -5.071875000000000000e+01 -1.049390000000000045e+00 -5.075000381469726562e+01 -1.049395000000000078e+00 -5.071875000000000000e+01 -1.049400000000000110e+00 -5.071875000000000000e+01 -1.049405000000000143e+00 -5.068750381469726562e+01 -1.049410000000000176e+00 -5.062500381469726562e+01 -1.049414999999999987e+00 -5.059375381469726562e+01 -1.049420000000000019e+00 -5.056250000000000000e+01 -1.049425000000000052e+00 -5.053125381469726562e+01 -1.049430000000000085e+00 -5.050000000000000000e+01 -1.049435000000000118e+00 -5.053125381469726562e+01 -1.049440000000000150e+00 -5.056250000000000000e+01 -1.049445000000000183e+00 -5.050000000000000000e+01 -1.049449999999999994e+00 -5.050000000000000000e+01 -1.049455000000000027e+00 -5.043750381469726562e+01 -1.049460000000000059e+00 -5.040625000000000000e+01 -1.049465000000000092e+00 -5.043750381469726562e+01 -1.049470000000000125e+00 -5.040625000000000000e+01 -1.049475000000000158e+00 -5.040625000000000000e+01 -1.049480000000000190e+00 -5.037500381469726562e+01 -1.049485000000000001e+00 -5.040625000000000000e+01 -1.049490000000000034e+00 -5.031250381469726562e+01 -1.049495000000000067e+00 -5.031250381469726562e+01 -1.049500000000000099e+00 -5.034375000000000000e+01 -1.049505000000000132e+00 -5.025000000000000000e+01 -1.049510000000000165e+00 -5.028125381469726562e+01 -1.049514999999999976e+00 -5.021875381469726562e+01 -1.049520000000000008e+00 -5.021875381469726562e+01 -1.049525000000000041e+00 -5.015625000000000000e+01 -1.049530000000000074e+00 -5.021875381469726562e+01 -1.049535000000000107e+00 -5.015625000000000000e+01 -1.049540000000000139e+00 -5.018750381469726562e+01 -1.049545000000000172e+00 -5.009375000000000000e+01 -1.049549999999999983e+00 -5.009375000000000000e+01 -1.049555000000000016e+00 -5.012500381469726562e+01 -1.049560000000000048e+00 -5.009375000000000000e+01 -1.049565000000000081e+00 -5.006250381469726562e+01 -1.049570000000000114e+00 -5.000000000000000000e+01 -1.049575000000000147e+00 -5.003125381469726562e+01 -1.049580000000000179e+00 -5.000000000000000000e+01 -1.049584999999999990e+00 -4.996875381469726562e+01 -1.049590000000000023e+00 -4.996875381469726562e+01 -1.049595000000000056e+00 -4.990625381469726562e+01 -1.049600000000000088e+00 -4.996875381469726562e+01 -1.049605000000000121e+00 -4.987500381469726562e+01 -1.049610000000000154e+00 -4.984375000000000000e+01 -1.049615000000000187e+00 -4.984375000000000000e+01 -1.049619999999999997e+00 -4.990625381469726562e+01 -1.049625000000000030e+00 -4.978125000000000000e+01 -1.049630000000000063e+00 -4.978125000000000000e+01 -1.049635000000000096e+00 -4.971875381469726562e+01 -1.049640000000000128e+00 -4.978125000000000000e+01 -1.049645000000000161e+00 -4.971875381469726562e+01 -1.049650000000000194e+00 -4.971875381469726562e+01 -1.049655000000000005e+00 -4.971875381469726562e+01 -1.049660000000000037e+00 -4.975000381469726562e+01 -1.049665000000000070e+00 -4.971875381469726562e+01 -1.049670000000000103e+00 -4.962500000000000000e+01 -1.049675000000000136e+00 -4.965625381469726562e+01 -1.049680000000000168e+00 -4.965625381469726562e+01 -1.049684999999999979e+00 -4.953125000000000000e+01 -1.049690000000000012e+00 -4.959375381469726562e+01 -1.049695000000000045e+00 -4.956250381469726562e+01 -1.049700000000000077e+00 -4.965625381469726562e+01 -1.049705000000000110e+00 -4.956250381469726562e+01 -1.049710000000000143e+00 -4.956250381469726562e+01 -1.049715000000000176e+00 -4.946875381469726562e+01 -1.049719999999999986e+00 -4.946875381469726562e+01 -1.049725000000000019e+00 -4.943750000000000000e+01 -1.049730000000000052e+00 -4.953125000000000000e+01 -1.049735000000000085e+00 -4.950000381469726562e+01 -1.049740000000000117e+00 -4.940625381469726562e+01 -1.049745000000000150e+00 -4.937500000000000000e+01 -1.049750000000000183e+00 -4.937500000000000000e+01 -1.049754999999999994e+00 -4.931250381469726562e+01 -1.049760000000000026e+00 -4.937500000000000000e+01 -1.049765000000000059e+00 -4.934375381469726562e+01 -1.049770000000000092e+00 -4.931250381469726562e+01 -1.049775000000000125e+00 -4.931250381469726562e+01 -1.049780000000000157e+00 -4.931250381469726562e+01 -1.049785000000000190e+00 -4.928125000000000000e+01 -1.049790000000000001e+00 -4.928125000000000000e+01 -1.049795000000000034e+00 -4.928125000000000000e+01 -1.049800000000000066e+00 -4.928125000000000000e+01 -1.049805000000000099e+00 -4.921875000000000000e+01 -1.049810000000000132e+00 -4.925000381469726562e+01 -1.049815000000000165e+00 -4.918750381469726562e+01 -1.049819999999999975e+00 -4.915625381469726562e+01 -1.049825000000000008e+00 -4.915625381469726562e+01 -1.049830000000000041e+00 -4.915625381469726562e+01 -1.049835000000000074e+00 -4.915625381469726562e+01 -1.049840000000000106e+00 -4.915625381469726562e+01 -1.049845000000000139e+00 -4.909375381469726562e+01 -1.049850000000000172e+00 -4.903125381469726562e+01 -1.049854999999999983e+00 -4.906250000000000000e+01 -1.049860000000000015e+00 -4.900000381469726562e+01 -1.049865000000000048e+00 -4.903125381469726562e+01 -1.049870000000000081e+00 -4.906250000000000000e+01 -1.049875000000000114e+00 -4.903125381469726562e+01 -1.049880000000000146e+00 -4.893750381469726562e+01 -1.049885000000000179e+00 -4.900000381469726562e+01 -1.049889999999999990e+00 -4.900000381469726562e+01 -1.049895000000000023e+00 -4.893750381469726562e+01 -1.049900000000000055e+00 -4.900000381469726562e+01 -1.049905000000000088e+00 -4.896875000000000000e+01 -1.049910000000000121e+00 -4.900000381469726562e+01 -1.049915000000000154e+00 -4.893750381469726562e+01 -1.049920000000000186e+00 -4.890625000000000000e+01 -1.049924999999999997e+00 -4.881250000000000000e+01 -1.049930000000000030e+00 -4.881250000000000000e+01 -1.049935000000000063e+00 -4.881250000000000000e+01 -1.049940000000000095e+00 -4.878125381469726562e+01 -1.049945000000000128e+00 -4.881250000000000000e+01 -1.049950000000000161e+00 -4.878125381469726562e+01 -1.049955000000000194e+00 -4.884375381469726562e+01 -1.049960000000000004e+00 -4.878125381469726562e+01 -1.049965000000000037e+00 -4.878125381469726562e+01 -1.049970000000000070e+00 -4.875000381469726562e+01 -1.049975000000000103e+00 -4.865625000000000000e+01 -1.049980000000000135e+00 -4.868750381469726562e+01 -1.049985000000000168e+00 -4.865625000000000000e+01 -1.049989999999999979e+00 -4.868750381469726562e+01 -1.049995000000000012e+00 -4.868750381469726562e+01 diff --git a/allensdk/test/ephys/data/spike_test_var_dt.txt b/allensdk/test/ephys/data/spike_test_var_dt.txt deleted file mode 100644 index 4c91125c96..0000000000 --- a/allensdk/test/ephys/data/spike_test_var_dt.txt +++ /dev/null @@ -1,911 +0,0 @@ -9.507079124450683594e-01 -8.851660156250000000e+01 -9.607079029083251953e-01 -8.851660156250000000e+01 -9.707078933715820312e-01 -8.851660156250000000e+01 -9.807078838348388672e-01 -8.851660156250000000e+01 -9.907079339027404785e-01 -8.851660156250000000e+01 -1.000000000000000000e+00 -8.851660156250000000e+01 -1.000000000000000000e+00 -8.851660156250000000e+01 -1.000000715255737305e+00 -8.847460937500000000e+01 -1.000001430511474609e+00 -8.843382263183593750e+01 -1.000002980232238770e+00 -8.835644531250000000e+01 -1.000004410743713379e+00 -8.828247833251953125e+01 -1.000007033348083496e+00 -8.815850067138671875e+01 -1.000009655952453613e+00 -8.804308319091796875e+01 -1.000012278556823730e+00 -8.793473052978515625e+01 -1.000016093254089355e+00 -8.778266143798828125e+01 -1.000020027160644531e+00 -8.764108276367187500e+01 -1.000026583671569824e+00 -8.742492675781250000e+01 -1.000033020973205566e+00 -8.722599792480468750e+01 -1.000039458274841309e+00 -8.704072570800781250e+01 -1.000046014785766602e+00 -8.686701202392578125e+01 -1.000052452087402344e+00 -8.670328521728515625e+01 -1.000062823295593262e+00 -8.645758056640625000e+01 -1.000073313713073730e+00 -8.623004913330078125e+01 -1.000083684921264648e+00 -8.601733398437500000e+01 -1.000094175338745117e+00 -8.581699371337890625e+01 -1.000110149383544922e+00 -8.553079223632812500e+01 -1.000126004219055176e+00 -8.526438140869140625e+01 -1.000141978263854980e+00 -8.501398468017578125e+01 -1.000166058540344238e+00 -8.466117095947265625e+01 -1.000190019607543945e+00 -8.433199310302734375e+01 -1.000214099884033203e+00 -8.402182769775390625e+01 -1.000255942344665527e+00 -8.351735687255859375e+01 -1.000297784805297852e+00 -8.304924011230468750e+01 -1.000339627265930176e+00 -8.261071014404296875e+01 -1.000381469726562500e+00 -8.219656372070312500e+01 -1.000423312187194824e+00 -8.180268096923828125e+01 -1.000465154647827148e+00 -8.142619323730468750e+01 -1.000530481338500977e+00 -8.086806488037109375e+01 -1.000595927238464355e+00 -8.034201049804687500e+01 -1.000661253929138184e+00 -7.984380340576171875e+01 -1.000726580619812012e+00 -7.936975860595703125e+01 -1.000792026519775391e+00 -7.891678619384765625e+01 -1.000895500183105469e+00 -7.823693847656250000e+01 -1.000998973846435547e+00 -7.759634399414062500e+01 -1.001102566719055176e+00 -7.698915100097656250e+01 -1.001206040382385254e+00 -7.641068267822265625e+01 -1.001309514045715332e+00 -7.585710144042968750e+01 -1.001471638679504395e+00 -7.503276824951171875e+01 -1.001633763313293457e+00 -7.425279998779296875e+01 -1.001795887947082520e+00 -7.351052856445312500e+01 -1.001958012580871582e+00 -7.280084228515625000e+01 -1.002120137214660645e+00 -7.211972808837890625e+01 -1.002282261848449707e+00 -7.146398925781250000e+01 -1.002544760704040527e+00 -7.044970703125000000e+01 -1.002807259559631348e+00 -6.948678588867187500e+01 -1.003069758415222168e+00 -6.856851196289062500e+01 -1.003332257270812988e+00 -6.768940734863281250e+01 -1.003594636917114258e+00 -6.684343719482421875e+01 -1.003857135772705078e+00 -6.602583312988281250e+01 -1.004119634628295898e+00 -6.523015594482421875e+01 -1.004382133483886719e+00 -6.445251464843750000e+01 -1.004644632339477539e+00 -6.368165206909179688e+01 -1.004907131195068359e+00 -6.291841888427734375e+01 -1.005169510841369629e+00 -6.214191436767578125e+01 -1.005432009696960449e+00 -6.134373474121093750e+01 -1.005694508552551270e+00 -6.049895095825195312e+01 -1.005957007408142090e+00 -5.958083343505859375e+01 -1.006219506263732910e+00 -5.853412246704101562e+01 -1.006397485733032227e+00 -5.769275283813476562e+01 -1.006575465202331543e+00 -5.667649078369140625e+01 -1.006688714027404785e+00 -5.586159896850585938e+01 -1.006801962852478027e+00 -5.481782913208007812e+01 -1.006875038146972656e+00 -5.392735290527343750e+01 -1.006948113441467285e+00 -5.275650787353515625e+01 -1.006993293762207031e+00 -5.178384017944335938e+01 -1.007038474082946777e+00 -5.047343063354492188e+01 -1.007083535194396973e+00 -4.857724380493164062e+01 -1.007108330726623535e+00 -4.711700820922851562e+01 -1.007133126258850098e+00 -4.513039016723632812e+01 -1.007150053977966309e+00 -4.330335235595703125e+01 -1.007166862487792969e+00 -4.088808441162109375e+01 -1.007183790206909180e+00 -3.754114151000976562e+01 -1.007200598716735840e+00 -3.274333572387695312e+01 -1.007217526435852051e+00 -2.585081863403320312e+01 -1.007225275039672852e+00 -2.190510559082031250e+01 -1.007233023643493652e+00 -1.760979843139648438e+01 -1.007240772247314453e+00 -1.321921443939208984e+01 -1.007248520851135254e+00 -9.143792152404785156e+00 -1.007253289222717285e+00 -6.919788837432861328e+00 -1.007258176803588867e+00 -4.999646663665771484e+00 -1.007262945175170898e+00 -3.409727811813354492e+00 -1.007267713546752930e+00 -2.153257846832275391e+00 -1.007272601127624512e+00 -1.215311050415039062e+00 -1.007277369499206543e+00 -5.670096874237060547e-01 -1.007282257080078125e+00 -1.724269986152648926e-01 -1.007287025451660156e+00 3.154490143060684204e-03 -1.007291913032531738e+00 -1.089370902627706528e-02 -1.007296681404113770e+00 -1.894766688346862793e-01 -1.007301568984985352e+00 -5.093165040016174316e-01 -1.007306337356567383e+00 -9.482851028442382812e-01 -1.007314562797546387e+00 -1.919624567031860352e+00 -1.007322907447814941e+00 -3.099925518035888672e+00 -1.007331132888793945e+00 -4.423087120056152344e+00 -1.007339358329772949e+00 -5.840911388397216797e+00 -1.007347583770751953e+00 -7.316580295562744141e+00 -1.007355809211730957e+00 -8.822293281555175781e+00 -1.007364034652709961e+00 -1.033877563476562500e+01 -1.007372379302978516e+00 -1.185295677185058594e+01 -1.007380604743957520e+00 -1.335607719421386719e+01 -1.007394552230834961e+00 -1.586671257019042969e+01 -1.007408618927001953e+00 -1.831671714782714844e+01 -1.007422566413879395e+00 -2.070552635192871094e+01 -1.007436513900756836e+00 -2.303868675231933594e+01 -1.007450580596923828e+00 -2.532361984252929688e+01 -1.007464528083801270e+00 -2.756879234313964844e+01 -1.007478594779968262e+00 -2.978553581237792969e+01 -1.007492542266845703e+00 -3.198636436462402344e+01 -1.007506489753723145e+00 -3.418122100830078125e+01 -1.007520556449890137e+00 -3.637652206420898438e+01 -1.007534503936767578e+00 -3.857660675048828125e+01 -1.007548570632934570e+00 -4.078340148925781250e+01 -1.007570385932922363e+00 -4.422469329833984375e+01 -1.007592201232910156e+00 -4.761068344116210938e+01 -1.007614016532897949e+00 -5.084682846069335938e+01 -1.007635951042175293e+00 -5.383038711547851562e+01 -1.007657766342163086e+00 -5.649696731567382812e+01 -1.007679581642150879e+00 -5.881449127197265625e+01 -1.007701396942138672e+00 -6.078889083862304688e+01 -1.007723212242126465e+00 -6.244721603393554688e+01 -1.007745146751403809e+00 -6.383298873901367188e+01 -1.007766962051391602e+00 -6.500092315673828125e+01 -1.007788777351379395e+00 -6.600278472900390625e+01 -1.007810592651367188e+00 -6.687615203857421875e+01 -1.007832527160644531e+00 -6.764411926269531250e+01 -1.007854342460632324e+00 -6.832208251953125000e+01 -1.007876157760620117e+00 -6.892327117919921875e+01 -1.007897973060607910e+00 -6.945981597900390625e+01 -1.007919907569885254e+00 -6.994164276123046875e+01 -1.007952690124511719e+00 -7.057957458496093750e+01 -1.007985591888427734e+00 -7.112813568115234375e+01 -1.008018493652343750e+00 -7.160122680664062500e+01 -1.008051395416259766e+00 -7.201017761230468750e+01 -1.008084297180175781e+00 -7.236416625976562500e+01 -1.008117198944091797e+00 -7.267042541503906250e+01 -1.008168101310729980e+00 -7.306375885009765625e+01 -1.008219003677368164e+00 -7.337393951416015625e+01 -1.008269906044006348e+00 -7.361463165283203125e+01 -1.008320808410644531e+00 -7.379674530029296875e+01 -1.008371710777282715e+00 -7.392920684814453125e+01 -1.008422613143920898e+00 -7.401927947998046875e+01 -1.008473515510559082e+00 -7.407292175292968750e+01 -1.008550524711608887e+00 -7.409583282470703125e+01 -1.008627414703369141e+00 -7.406075286865234375e+01 -1.008704304695129395e+00 -7.397821807861328125e+01 -1.008781194686889648e+00 -7.385667419433593750e+01 -1.008858203887939453e+00 -7.370301055908203125e+01 -1.008935093879699707e+00 -7.352278137207031250e+01 -1.009011983871459961e+00 -7.332048034667968750e+01 -1.009142279624938965e+00 -7.293751525878906250e+01 -1.009272575378417969e+00 -7.251565551757812500e+01 -1.009402990341186523e+00 -7.206501007080078125e+01 -1.009533286094665527e+00 -7.159320831298828125e+01 -1.009663581848144531e+00 -7.110652923583984375e+01 -1.009793877601623535e+00 -7.060981750488281250e+01 -1.009924173355102539e+00 -7.010655212402343750e+01 -1.010145783424377441e+00 -6.924359130859375000e+01 -1.010367274284362793e+00 -6.837960052490234375e+01 -1.010588765144348145e+00 -6.752004241943359375e+01 -1.010810375213623047e+00 -6.666783142089843750e+01 -1.011031866073608398e+00 -6.582414245605468750e+01 -1.011253476142883301e+00 -6.498931121826171875e+01 -1.011601924896240234e+00 -6.368210983276367188e+01 -1.011950373649597168e+00 -6.235556411743164062e+01 -1.012298822402954102e+00 -6.096501159667968750e+01 -1.012647271156311035e+00 -5.941593170166015625e+01 -1.012995719909667969e+00 -5.750837326049804688e+01 -1.013082861900329590e+00 -5.690219497680664062e+01 -1.013170003890991211e+00 -5.616603851318359375e+01 -1.013257145881652832e+00 -5.524655532836914062e+01 -1.013344287872314453e+00 -5.411119842529296875e+01 -1.013365983963012695e+00 -5.377533721923828125e+01 -1.013387799263000488e+00 -5.339432144165039062e+01 -1.013409614562988281e+00 -5.297850036621093750e+01 -1.013431310653686523e+00 -5.251800918579101562e+01 -1.013453125953674316e+00 -5.199626159667968750e+01 -1.013474941253662109e+00 -5.139112472534179688e+01 -1.013496756553649902e+00 -5.069021987915039062e+01 -1.013518452644348145e+00 -4.986330795288085938e+01 -1.013540267944335938e+00 -4.886272430419921875e+01 -1.013562083244323730e+00 -4.759924697875976562e+01 -1.013583779335021973e+00 -4.596282958984375000e+01 -1.013605594635009766e+00 -4.373835372924804688e+01 -1.013627409934997559e+00 -4.054758071899414062e+01 -1.013649106025695801e+00 -3.565874099731445312e+01 -1.013670921325683594e+00 -2.786275100708007812e+01 -1.013682246208190918e+00 -2.219725418090820312e+01 -1.013689756393432617e+00 -1.785577201843261719e+01 -1.013697385787963867e+00 -1.337776660919189453e+01 -1.013704895973205566e+00 -9.146274566650390625e+00 -1.013712406158447266e+00 -5.533134937286376953e+00 -1.013720035552978516e+00 -2.767569065093994141e+00 -1.013727545738220215e+00 -8.142220377922058105e-01 -1.013732433319091797e+00 6.675173342227935791e-02 -1.013737440109252930e+00 6.210120320320129395e-01 -1.013742446899414062e+00 8.906840085983276367e-01 -1.013747334480285645e+00 9.491816759109497070e-01 -1.013752341270446777e+00 8.381766080856323242e-01 -1.013757348060607910e+00 5.602663755416870117e-01 -1.013762235641479492e+00 1.291086375713348389e-01 -1.013767242431640625e+00 -4.154306650161743164e-01 -1.013772249221801758e+00 -1.039631724357604980e+00 -1.013777136802673340e+00 -1.734148025512695312e+00 -1.013782143592834473e+00 -2.496266603469848633e+00 -1.013787150382995605e+00 -3.311170339584350586e+00 -1.013792037963867188e+00 -4.158343791961669922e+00 -1.013797044754028320e+00 -5.027078628540039062e+00 -1.013802051544189453e+00 -5.916303157806396484e+00 -1.013806939125061035e+00 -6.822744369506835938e+00 -1.013811945915222168e+00 -7.737337112426757812e+00 -1.013816952705383301e+00 -8.652715682983398438e+00 -1.013821840286254883e+00 -9.567711830139160156e+00 -1.013826847076416016e+00 -1.048278713226318359e+01 -1.013831853866577148e+00 -1.139521598815917969e+01 -1.013836741447448730e+00 -1.230100345611572266e+01 -1.013841748237609863e+00 -1.319893360137939453e+01 -1.013846755027770996e+00 -1.409014511108398438e+01 -1.013851642608642578e+00 -1.497479724884033203e+01 -1.013856649398803711e+00 -1.585130596160888672e+01 -1.013861656188964844e+00 -1.671862220764160156e+01 -1.013866543769836426e+00 -1.757747459411621094e+01 -1.013871550559997559e+00 -1.842894554138183594e+01 -1.013879299163818359e+00 -1.973963546752929688e+01 -1.013887047767639160e+00 -2.103209686279296875e+01 -1.013894677162170410e+00 -2.230721664428710938e+01 -1.013902425765991211e+00 -2.356706047058105469e+01 -1.013917684555053711e+00 -2.601805114746093750e+01 -1.013932943344116211e+00 -2.843140983581542969e+01 -1.013948321342468262e+00 -3.082322692871093750e+01 -1.013963580131530762e+00 -3.320513153076171875e+01 -1.013978838920593262e+00 -3.558768844604492188e+01 -1.013994097709655762e+00 -3.797840499877929688e+01 -1.014009356498718262e+00 -4.038064193725585938e+01 -1.014033079147338867e+00 -4.412617874145507812e+01 -1.014056801795959473e+00 -4.781307983398437500e+01 -1.014080643653869629e+00 -5.132147979736328125e+01 -1.014104366302490234e+00 -5.452622222900390625e+01 -1.014128088951110840e+00 -5.733792877197265625e+01 -1.014151930809020996e+00 -5.974950408935546875e+01 -1.014175653457641602e+00 -6.176091003417968750e+01 -1.014199376106262207e+00 -6.340298461914062500e+01 -1.014223217964172363e+00 -6.476057434082031250e+01 -1.014246940612792969e+00 -6.593183135986328125e+01 -1.014270663261413574e+00 -6.696395111083984375e+01 -1.014294505119323730e+00 -6.785570526123046875e+01 -1.014318227767944336e+00 -6.861429595947265625e+01 -1.014341950416564941e+00 -6.927654266357421875e+01 -1.014365673065185547e+00 -6.987570190429687500e+01 -1.014389514923095703e+00 -7.041738128662109375e+01 -1.014413237571716309e+00 -7.089640045166015625e+01 -1.014436960220336914e+00 -7.131946563720703125e+01 -1.014460802078247070e+00 -7.170162963867187500e+01 -1.014484524726867676e+00 -7.205084228515625000e+01 -1.014508247375488281e+00 -7.236627960205078125e+01 -1.014532089233398438e+00 -7.264776611328125000e+01 -1.014555811882019043e+00 -7.290032958984375000e+01 -1.014579534530639648e+00 -7.312937164306640625e+01 -1.014603376388549805e+00 -7.333665466308593750e+01 -1.014627099037170410e+00 -7.352227783203125000e+01 -1.014650821685791016e+00 -7.368779754638671875e+01 -1.014674544334411621e+00 -7.383587646484375000e+01 -1.014698386192321777e+00 -7.396836090087890625e+01 -1.014722108840942383e+00 -7.408592224121093750e+01 -1.014745831489562988e+00 -7.418928527832031250e+01 -1.014769673347473145e+00 -7.427974700927734375e+01 -1.014806032180786133e+00 -7.439571380615234375e+01 -1.014842510223388672e+00 -7.448694610595703125e+01 -1.014878869056701660e+00 -7.455630493164062500e+01 -1.014915347099304199e+00 -7.460579681396484375e+01 -1.014983415603637695e+00 -7.465161132812500000e+01 -1.015051484107971191e+00 -7.464561462402343750e+01 -1.015119552612304688e+00 -7.459616088867187500e+01 -1.015187621116638184e+00 -7.451063537597656250e+01 -1.015255689620971680e+00 -7.439509582519531250e+01 -1.015323758125305176e+00 -7.425426483154296875e+01 -1.015432000160217285e+00 -7.398750305175781250e+01 -1.015540242195129395e+00 -7.367899322509765625e+01 -1.015648603439331055e+00 -7.333802795410156250e+01 -1.015756845474243164e+00 -7.297196197509765625e+01 -1.015865206718444824e+00 -7.258668518066406250e+01 -1.015973448753356934e+00 -7.218681335449218750e+01 -1.016081690788269043e+00 -7.177598571777343750e+01 -1.016263246536254883e+00 -7.107096099853515625e+01 -1.016444683074951172e+00 -7.035379791259765625e+01 -1.016626119613647461e+00 -6.963174438476562500e+01 -1.016807556152343750e+00 -6.890946197509765625e+01 -1.016988992691040039e+00 -6.819098663330078125e+01 -1.017170429229736328e+00 -6.747808837890625000e+01 -1.017351865768432617e+00 -6.677255249023437500e+01 -1.017533421516418457e+00 -6.607270812988281250e+01 -1.017714858055114746e+00 -6.538097381591796875e+01 -1.017896294593811035e+00 -6.468946838378906250e+01 -1.018077731132507324e+00 -6.399879837036132812e+01 -1.018259167671203613e+00 -6.330052947998046875e+01 -1.018440604209899902e+00 -6.259780502319335938e+01 -1.018622040748596191e+00 -6.188908004760742188e+01 -1.018803596496582031e+00 -6.115329360961914062e+01 -1.018985033035278320e+00 -6.036925506591796875e+01 -1.019166469573974609e+00 -5.951843261718750000e+01 -1.019347906112670898e+00 -5.857019424438476562e+01 -1.019529342651367188e+00 -5.744470977783203125e+01 -1.019710779190063477e+00 -5.603475570678710938e+01 -1.019756197929382324e+00 -5.558567810058593750e+01 -1.019801497459411621e+00 -5.505092239379882812e+01 -1.019846916198730469e+00 -5.444883346557617188e+01 -1.019892215728759766e+00 -5.376362991333007812e+01 -1.019937634468078613e+00 -5.292377090454101562e+01 -1.019982933998107910e+00 -5.184263610839843750e+01 -1.020028352737426758e+00 -5.037401962280273438e+01 -1.020073771476745605e+00 -4.834168624877929688e+01 -1.020078897476196289e+00 -4.804086303710937500e+01 -1.020084142684936523e+00 -4.769799423217773438e+01 -1.020089387893676758e+00 -4.733786010742187500e+01 -1.020094633102416992e+00 -4.696257400512695312e+01 -1.020099878311157227e+00 -4.656223678588867188e+01 -1.020105123519897461e+00 -4.613038635253906250e+01 -1.020110368728637695e+00 -4.566606140136718750e+01 -1.020115613937377930e+00 -4.516764068603515625e+01 -1.020120859146118164e+00 -4.462964248657226562e+01 -1.020126104354858398e+00 -4.404484176635742188e+01 -1.020131349563598633e+00 -4.340686416625976562e+01 -1.020136594772338867e+00 -4.270962524414062500e+01 -1.020141839981079102e+00 -4.194498062133789062e+01 -1.020149827003479004e+00 -4.062490463256835938e+01 -1.020157814025878906e+00 -3.907735824584960938e+01 -1.020165801048278809e+00 -3.724625778198242188e+01 -1.020173788070678711e+00 -3.506322479248046875e+01 -1.020181775093078613e+00 -3.244709014892578125e+01 -1.020194292068481445e+00 -2.725678634643554688e+01 -1.020201921463012695e+00 -2.347482299804687500e+01 -1.020209431648254395e+00 -1.923937034606933594e+01 -1.020216941833496094e+00 -1.475457096099853516e+01 -1.020224452018737793e+00 -1.037910938262939453e+01 -1.020231962203979492e+00 -6.485013008117675781e+00 -1.020237088203430176e+00 -4.248546600341796875e+00 -1.020242333412170410e+00 -2.432409763336181641e+00 -1.020247459411621094e+00 -1.021265745162963867e+00 -1.020252704620361328e+00 1.335068047046661377e-02 -1.020257830619812012e+00 7.032673358917236328e-01 -1.020263075828552246e+00 1.090967655181884766e+00 -1.020268201828002930e+00 1.224498510360717773e+00 -1.020273447036743164e+00 1.145912170410156250e+00 -1.020278573036193848e+00 8.873941898345947266e-01 -1.020283818244934082e+00 4.755212664604187012e-01 -1.020288944244384766e+00 -6.424966454505920410e-02 -1.020294189453125000e+00 -7.074375152587890625e-01 -1.020301938056945801e+00 -1.829130291938781738e+00 -1.020309805870056152e+00 -3.081596136093139648e+00 -1.020317673683166504e+00 -4.421465396881103516e+00 -1.020325422286987305e+00 -5.816086292266845703e+00 -1.020333290100097656e+00 -7.240248680114746094e+00 -1.020341157913208008e+00 -8.675456047058105469e+00 -1.020348906517028809e+00 -1.010928821563720703e+01 -1.020361185073852539e+00 -1.232103443145751953e+01 -1.020373344421386719e+00 -1.449237918853759766e+01 -1.020385503768920898e+00 -1.661767768859863281e+01 -1.020397663116455078e+00 -1.869567108154296875e+01 -1.020409941673278809e+00 -2.072863006591796875e+01 -1.020422101020812988e+00 -2.272123718261718750e+01 -1.020434260368347168e+00 -2.468004226684570312e+01 -1.020446419715881348e+00 -2.661237907409667969e+01 -1.020465850830078125e+00 -2.964683914184570312e+01 -1.020485162734985352e+00 -3.265858840942382812e+01 -1.020504593849182129e+00 -3.567220687866210938e+01 -1.020524024963378906e+00 -3.870489501953125000e+01 -1.020543336868286133e+00 -4.175797653198242188e+01 -1.020562767982482910e+00 -4.480915451049804688e+01 -1.020582079887390137e+00 -4.781171798706054688e+01 -1.020601511001586914e+00 -5.070167160034179688e+01 -1.020620822906494141e+00 -5.341057968139648438e+01 -1.020640254020690918e+00 -5.588055038452148438e+01 -1.020659685134887695e+00 -5.807590103149414062e+01 -1.020678997039794922e+00 -5.998813247680664062e+01 -1.020698428153991699e+00 -6.163462448120117188e+01 -1.020717740058898926e+00 -6.305146789550781250e+01 -1.020737171173095703e+00 -6.428067016601562500e+01 -1.020756483078002930e+00 -6.535713958740234375e+01 -1.020775914192199707e+00 -6.630458068847656250e+01 -1.020795345306396484e+00 -6.714110565185546875e+01 -1.020814657211303711e+00 -6.788460540771484375e+01 -1.020834088325500488e+00 -6.855195617675781250e+01 -1.020853400230407715e+00 -6.915535736083984375e+01 -1.020872831344604492e+00 -6.970240783691406250e+01 -1.020892143249511719e+00 -7.019922637939453125e+01 -1.020911574363708496e+00 -7.065220642089843750e+01 -1.020931005477905273e+00 -7.106713104248046875e+01 -1.020950317382812500e+00 -7.144806671142578125e+01 -1.020969748497009277e+00 -7.179784393310546875e+01 -1.020989060401916504e+00 -7.211915588378906250e+01 -1.021018981933593750e+00 -7.256476593017578125e+01 -1.021048903465270996e+00 -7.295747375488281250e+01 -1.021078705787658691e+00 -7.330381011962890625e+01 -1.021108627319335938e+00 -7.360877227783203125e+01 -1.021159529685974121e+00 -7.404566955566406250e+01 -1.021210432052612305e+00 -7.439353942871093750e+01 -1.021261334419250488e+00 -7.466649627685546875e+01 -1.021312236785888672e+00 -7.487635040283203125e+01 -1.021363139152526855e+00 -7.503279113769531250e+01 -1.021414041519165039e+00 -7.514360809326171875e+01 -1.021464943885803223e+00 -7.521516418457031250e+01 -1.021545886993408203e+00 -7.526108551025390625e+01 -1.021626710891723633e+00 -7.523870086669921875e+01 -1.021707534790039062e+00 -7.516116333007812500e+01 -1.021788358688354492e+00 -7.503882598876953125e+01 -1.021910905838012695e+00 -7.478597259521484375e+01 -1.022033452987670898e+00 -7.447106170654296875e+01 -1.022156000137329102e+00 -7.411038970947265625e+01 -1.022278428077697754e+00 -7.371560668945312500e+01 -1.022400975227355957e+00 -7.329535675048828125e+01 -1.022523522377014160e+00 -7.285634613037109375e+01 -1.022708177566528320e+00 -7.216989135742187500e+01 -1.022892832756042480e+00 -7.146511840820312500e+01 -1.023077607154846191e+00 -7.075263214111328125e+01 -1.023262262344360352e+00 -7.003929901123046875e+01 -1.023446917533874512e+00 -6.932897186279296875e+01 -1.023631572723388672e+00 -6.862397003173828125e+01 -1.023816227912902832e+00 -6.792721557617187500e+01 -1.024001002311706543e+00 -6.723916625976562500e+01 -1.024185657501220703e+00 -6.656011962890625000e+01 -1.024370312690734863e+00 -6.588763427734375000e+01 -1.024554967880249023e+00 -6.522546386718750000e+01 -1.024739623069763184e+00 -6.456358337402343750e+01 -1.024924397468566895e+00 -6.390193939208984375e+01 -1.025109052658081055e+00 -6.323044204711914062e+01 -1.025293707847595215e+00 -6.255639648437500000e+01 -1.025478363037109375e+00 -6.188111877441406250e+01 -1.025663018226623535e+00 -6.117990493774414062e+01 -1.025847792625427246e+00 -6.045443725585937500e+01 -1.025893926620483398e+00 -6.025886154174804688e+01 -1.025940060615539551e+00 -6.005141448974609375e+01 -1.025986313819885254e+00 -5.984492111206054688e+01 -1.026032447814941406e+00 -5.963843917846679688e+01 -1.026078581809997559e+00 -5.942505264282226562e+01 -1.026124835014343262e+00 -5.920819091796875000e+01 -1.026170969009399414e+00 -5.898506164550781250e+01 -1.026217103004455566e+00 -5.874961853027343750e+01 -1.026263236999511719e+00 -5.849142456054687500e+01 -1.026309490203857422e+00 -5.823012161254882812e+01 -1.026355624198913574e+00 -5.796654891967773438e+01 -1.026401758193969727e+00 -5.768784332275390625e+01 -1.026448011398315430e+00 -5.736917877197265625e+01 -1.026494145393371582e+00 -5.703341293334960938e+01 -1.026540279388427734e+00 -5.668022918701171875e+01 -1.026586532592773438e+00 -5.634148406982421875e+01 -1.026619911193847656e+00 -5.606926345825195312e+01 -1.026653289794921875e+00 -5.573027038574218750e+01 -1.026686668395996094e+00 -5.538498306274414062e+01 -1.026709437370300293e+00 -5.515527725219726562e+01 -1.026732087135314941e+00 -5.488626861572265625e+01 -1.026754736900329590e+00 -5.458708953857421875e+01 -1.026777505874633789e+00 -5.427109909057617188e+01 -1.026800155639648438e+00 -5.394044494628906250e+01 -1.026822805404663086e+00 -5.356670379638671875e+01 -1.026845574378967285e+00 -5.313830566406250000e+01 -1.026868224143981934e+00 -5.266225051879882812e+01 -1.026890873908996582e+00 -5.214607238769531250e+01 -1.026913642883300781e+00 -5.155647277832031250e+01 -1.026936292648315430e+00 -5.084555053710937500e+01 -1.026958942413330078e+00 -4.997639465332031250e+01 -1.026981711387634277e+00 -4.893759918212890625e+01 -1.027004361152648926e+00 -4.766393661499023438e+01 -1.027027130126953125e+00 -4.600901031494140625e+01 -1.027049779891967773e+00 -4.367323684692382812e+01 -1.027072429656982422e+00 -4.025855636596679688e+01 -1.027086734771728516e+00 -3.720411682128906250e+01 -1.027097225189208984e+00 -3.420817184448242188e+01 -1.027107715606689453e+00 -3.041830825805664062e+01 -1.027118206024169922e+00 -2.566609764099121094e+01 -1.027125954627990723e+00 -2.154637145996093750e+01 -1.027133703231811523e+00 -1.704385566711425781e+01 -1.027141332626342773e+00 -1.246458148956298828e+01 -1.027149081230163574e+00 -8.242345809936523438e+00 -1.027154564857482910e+00 -5.650176525115966797e+00 -1.027160048484802246e+00 -3.476511001586914062e+00 -1.027165651321411133e+00 -1.737539172172546387e+00 -1.027171134948730469e+00 -4.411928057670593262e-01 -1.027176618576049805e+00 4.288343489170074463e-01 -1.027182102203369141e+00 9.431852698326110840e-01 -1.027187585830688477e+00 1.182316064834594727e+00 -1.027193069458007812e+00 1.183700084686279297e+00 -1.027198553085327148e+00 9.604490399360656738e-01 -1.027204036712646484e+00 5.447914004325866699e-01 -1.027209639549255371e+00 -1.247794181108474731e-02 -1.027215123176574707e+00 -6.740579009056091309e-01 -1.027220606803894043e+00 -1.427010536193847656e+00 -1.027226090431213379e+00 -2.261763811111450195e+00 -1.027231574058532715e+00 -3.156217813491821289e+00 -1.027237057685852051e+00 -4.086537837982177734e+00 -1.027242541313171387e+00 -5.042024135589599609e+00 -1.027248024940490723e+00 -6.020570755004882812e+00 -1.027253627777099609e+00 -7.015780925750732422e+00 -1.027259111404418945e+00 -8.016482353210449219e+00 -1.027264595031738281e+00 -9.015815734863281250e+00 -1.027270078659057617e+00 -1.001357841491699219e+01 -1.027275562286376953e+00 -1.100960636138916016e+01 -1.027281045913696289e+00 -1.199994277954101562e+01 -1.027286529541015625e+00 -1.298067569732666016e+01 -1.027292013168334961e+00 -1.395175552368164062e+01 -1.027297496795654297e+00 -1.491485881805419922e+01 -1.027303099632263184e+00 -1.586963367462158203e+01 -1.027308583259582520e+00 -1.681417274475097656e+01 -1.027314066886901855e+00 -1.774806976318359375e+01 -1.027319550514221191e+00 -1.867289161682128906e+01 -1.027325034141540527e+00 -1.958983421325683594e+01 -1.027330517768859863e+00 -2.049853324890136719e+01 -1.027339220046997070e+00 -2.191117477416992188e+01 -1.027347803115844727e+00 -2.330451583862304688e+01 -1.027356505393981934e+00 -2.468202018737792969e+01 -1.027365088462829590e+00 -2.604794502258300781e+01 -1.027379870414733887e+00 -2.835879516601562500e+01 -1.027394652366638184e+00 -3.065323829650878906e+01 -1.027409434318542480e+00 -3.294109344482421875e+01 -1.027424216270446777e+00 -3.523189163208007812e+01 -1.027438998222351074e+00 -3.753260421752929688e+01 -1.027453780174255371e+00 -3.984650802612304688e+01 -1.027468442916870117e+00 -4.217059707641601562e+01 -1.027483224868774414e+00 -4.449314880371093750e+01 -1.027498006820678711e+00 -4.679349517822265625e+01 -1.027512788772583008e+00 -4.904373550415039062e+01 -1.027527570724487305e+00 -5.121219635009765625e+01 -1.027542352676391602e+00 -5.326796340942382812e+01 -1.027557134628295898e+00 -5.518549728393554688e+01 -1.027571797370910645e+00 -5.694800186157226562e+01 -1.027586579322814941e+00 -5.854865264892578125e+01 -1.027601361274719238e+00 -5.998978805541992188e+01 -1.027616143226623535e+00 -6.128082656860351562e+01 -1.027630925178527832e+00 -6.243565368652343750e+01 -1.027645707130432129e+00 -6.347001647949218750e+01 -1.027667880058288574e+00 -6.482911682128906250e+01 -1.027690052986145020e+00 -6.599630737304687500e+01 -1.027712225914001465e+00 -6.701004028320312500e+01 -1.027734279632568359e+00 -6.790081787109375000e+01 -1.027756452560424805e+00 -6.869051361083984375e+01 -1.027778625488281250e+00 -6.939381408691406250e+01 -1.027800798416137695e+00 -7.002223968505859375e+01 -1.027822971343994141e+00 -7.058698272705078125e+01 -1.027845144271850586e+00 -7.109792327880859375e+01 -1.027867317199707031e+00 -7.156186676025390625e+01 -1.027889490127563477e+00 -7.198320007324218750e+01 -1.027911663055419922e+00 -7.236598205566406250e+01 -1.027933835983276367e+00 -7.271457672119140625e+01 -1.027967691421508789e+00 -7.318981933593750000e+01 -1.028001666069030762e+00 -7.360253143310546875e+01 -1.028035521507263184e+00 -7.396133422851562500e+01 -1.028069496154785156e+00 -7.427278137207031250e+01 -1.028103351593017578e+00 -7.454185485839843750e+01 -1.028158426284790039e+00 -7.490083312988281250e+01 -1.028213500976562500e+00 -7.517836761474609375e+01 -1.028268575668334961e+00 -7.538739776611328125e+01 -1.028323531150817871e+00 -7.553836822509765625e+01 -1.028378605842590332e+00 -7.564025115966796875e+01 -1.028433680534362793e+00 -7.570063018798828125e+01 -1.028488755226135254e+00 -7.572554779052734375e+01 -1.028573989868164062e+00 -7.570544433593750000e+01 -1.028659343719482422e+00 -7.562667846679687500e+01 -1.028744578361511230e+00 -7.550055694580078125e+01 -1.028829932212829590e+00 -7.533621978759765625e+01 -1.028915166854858398e+00 -7.514095306396484375e+01 -1.029000520706176758e+00 -7.492054748535156250e+01 -1.029085874557495117e+00 -7.467963409423828125e+01 -1.029215693473815918e+00 -7.428199005126953125e+01 -1.029345512390136719e+00 -7.385610198974609375e+01 -1.029475450515747070e+00 -7.340965270996093750e+01 -1.029605269432067871e+00 -7.294858551025390625e+01 -1.029735207557678223e+00 -7.247768402099609375e+01 -1.029865026473999023e+00 -7.200066375732421875e+01 -1.029994845390319824e+00 -7.152037048339843750e+01 -1.030218839645385742e+00 -7.069087982177734375e+01 -1.030442833900451660e+00 -6.986647796630859375e+01 -1.030666708946228027e+00 -6.905260467529296875e+01 -1.030890703201293945e+00 -6.825148773193359375e+01 -1.031114697456359863e+00 -6.746551513671875000e+01 -1.031338691711425781e+00 -6.669308471679687500e+01 -1.031562566757202148e+00 -6.593670654296875000e+01 -1.031786561012268066e+00 -6.518679809570312500e+01 -1.032010555267333984e+00 -6.444423675537109375e+01 -1.032234430313110352e+00 -6.371035003662109375e+01 -1.032458424568176270e+00 -6.297325515747070312e+01 -1.032682418823242188e+00 -6.223880767822265625e+01 -1.032906293869018555e+00 -6.146751403808593750e+01 -1.032962322235107422e+00 -6.126530838012695312e+01 -1.033018350601196289e+00 -6.106454086303710938e+01 -1.033074378967285156e+00 -6.085915756225585938e+01 -1.033130288124084473e+00 -6.064901733398437500e+01 -1.033186316490173340e+00 -6.043517684936523438e+01 -1.033242344856262207e+00 -6.021516799926757812e+01 -1.033298254013061523e+00 -5.998792266845703125e+01 -1.033354282379150391e+00 -5.975705337524414062e+01 -1.033410310745239258e+00 -5.952481460571289062e+01 -1.033466219902038574e+00 -5.928257369995117188e+01 -1.033522248268127441e+00 -5.902170562744140625e+01 -1.033578276634216309e+00 -5.874552154541015625e+01 -1.033634185791015625e+00 -5.847120285034179688e+01 -1.033690214157104492e+00 -5.818925476074218750e+01 -1.033746242523193359e+00 -5.787240219116210938e+01 -1.033802151679992676e+00 -5.751039886474609375e+01 -1.033858180046081543e+00 -5.714308547973632812e+01 -1.033899188041687012e+00 -5.687387847900390625e+01 -1.033940076828002930e+00 -5.657421112060546875e+01 -1.033981084823608398e+00 -5.623462677001953125e+01 -1.034022092819213867e+00 -5.586777877807617188e+01 -1.034062981605529785e+00 -5.548962783813476562e+01 -1.034103989601135254e+00 -5.506883239746093750e+01 -1.034144997596740723e+00 -5.457042312622070312e+01 -1.034186005592346191e+00 -5.395161819458007812e+01 -1.034226894378662109e+00 -5.327541732788085938e+01 -1.034253358840942383e+00 -5.278717803955078125e+01 -1.034272909164428711e+00 -5.234416961669921875e+01 -1.034292340278625488e+00 -5.185004043579101562e+01 -1.034311771392822266e+00 -5.130375671386718750e+01 -1.034331202507019043e+00 -5.068784332275390625e+01 -1.034350633621215820e+00 -4.996349716186523438e+01 -1.034370064735412598e+00 -4.910141754150390625e+01 -1.034389495849609375e+00 -4.805704116821289062e+01 -1.034408926963806152e+00 -4.676334762573242188e+01 -1.034428358078002930e+00 -4.508861923217773438e+01 -1.034447789192199707e+00 -4.284345245361328125e+01 -1.034467339515686035e+00 -3.967770004272460938e+01 -1.034486770629882812e+00 -3.503475952148437500e+01 -1.034500479698181152e+00 -3.031393241882324219e+01 -1.034509539604187012e+00 -2.626640701293945312e+01 -1.034518599510192871e+00 -2.148854064941406250e+01 -1.034527659416198730e+00 -1.618760299682617188e+01 -1.034536719322204590e+00 -1.089506912231445312e+01 -1.034542679786682129e+00 -7.734103202819824219e+00 -1.034548759460449219e+00 -5.017329216003417969e+00 -1.034554719924926758e+00 -2.812122583389282227e+00 -1.034560680389404297e+00 -1.130622625350952148e+00 -1.034566760063171387e+00 3.322536498308181763e-02 -1.034572720527648926e+00 7.255477309226989746e-01 -1.034578680992126465e+00 1.047464966773986816e+00 -1.034584760665893555e+00 1.094254016876220703e+00 -1.034590721130371094e+00 9.001009464263916016e-01 -1.034596681594848633e+00 4.726105928421020508e-01 -1.034602761268615723e+00 -1.465684473514556885e-01 -1.034608721733093262e+00 -8.905089497566223145e-01 -1.034614682197570801e+00 -1.719613552093505859e+00 -1.034620761871337891e+00 -2.630845546722412109e+00 -1.034626722335815430e+00 -3.617805719375610352e+00 -1.034632682800292969e+00 -4.650696754455566406e+00 -1.034638762474060059e+00 -5.701207160949707031e+00 -1.034644722938537598e+00 -6.764478683471679688e+00 -1.034650683403015137e+00 -7.845070362091064453e+00 -1.034656763076782227e+00 -8.935457229614257812e+00 -1.034662723541259766e+00 -1.002226352691650391e+01 -1.034668684005737305e+00 -1.109833431243896484e+01 -1.034674763679504395e+00 -1.216734123229980469e+01 -1.034680724143981934e+00 -1.323143196105957031e+01 -1.034686684608459473e+00 -1.428547763824462891e+01 -1.034692764282226562e+00 -1.532542514801025391e+01 -1.034698724746704102e+00 -1.635356521606445312e+01 -1.034704685211181641e+00 -1.737330436706542969e+01 -1.034710764884948730e+00 -1.838376235961914062e+01 -1.034716725349426270e+00 -1.938218498229980469e+01 -1.034722685813903809e+00 -2.036895942687988281e+01 -1.034728765487670898e+00 -2.134724044799804688e+01 -1.034734725952148438e+00 -2.231868171691894531e+01 -1.034740686416625977e+00 -2.328221702575683594e+01 -1.034746766090393066e+00 -2.423716735839843750e+01 -1.034752726554870605e+00 -2.518528556823730469e+01 -1.034758687019348145e+00 -2.612888526916503906e+01 -1.034764647483825684e+00 -2.706851196289062500e+01 -1.034770727157592773e+00 -2.800364685058593750e+01 -1.034776687622070312e+00 -2.893483352661132812e+01 -1.034782648086547852e+00 -2.986384391784667969e+01 -1.034792065620422363e+00 -3.130791282653808594e+01 -1.034801363945007324e+00 -3.275196838378906250e+01 -1.034810662269592285e+00 -3.419738769531250000e+01 -1.034820079803466797e+00 -3.564522171020507812e+01 -1.034836649894714355e+00 -3.822010040283203125e+01 -1.034853100776672363e+00 -4.081180572509765625e+01 -1.034869670867919922e+00 -4.341218185424804688e+01 -1.034886240959167480e+00 -4.599911117553710938e+01 -1.034902811050415039e+00 -4.853630065917968750e+01 -1.034919261932373047e+00 -5.098001098632812500e+01 -1.034935832023620605e+00 -5.328748703002929688e+01 -1.034952402114868164e+00 -5.542396545410156250e+01 -1.034968852996826172e+00 -5.736736679077148438e+01 -1.034985423088073730e+00 -5.910990905761718750e+01 -1.035001993179321289e+00 -6.065696334838867188e+01 -1.035018563270568848e+00 -6.202384567260742188e+01 -1.035035014152526855e+00 -6.323155593872070312e+01 -1.035051584243774414e+00 -6.430252075195312500e+01 -1.035068154335021973e+00 -6.525746917724609375e+01 -1.035084724426269531e+00 -6.611396026611328125e+01 -1.035101175308227539e+00 -6.688639831542968750e+01 -1.035117745399475098e+00 -6.758661651611328125e+01 -1.035143613815307617e+00 -6.855737304687500000e+01 -1.035169363021850586e+00 -6.940422821044921875e+01 -1.035195231437683105e+00 -7.014952850341796875e+01 -1.035220980644226074e+00 -7.081093597412109375e+01 -1.035246849060058594e+00 -7.140131378173828125e+01 -1.035272598266601562e+00 -7.192963409423828125e+01 -1.035312891006469727e+00 -7.264660644531250000e+01 -1.035353064537048340e+00 -7.325357055664062500e+01 -1.035393238067626953e+00 -7.376742553710937500e+01 -1.035433530807495117e+00 -7.420314788818359375e+01 -1.035473704338073730e+00 -7.457257843017578125e+01 -1.035513997077941895e+00 -7.488452148437500000e+01 -1.035575389862060547e+00 -7.526661682128906250e+01 -1.035636901855468750e+00 -7.555323791503906250e+01 -1.035698294639587402e+00 -7.576079559326171875e+01 -1.035759806632995605e+00 -7.590296173095703125e+01 -1.035821199417114258e+00 -7.599070739746093750e+01 -1.035882711410522461e+00 -7.603268432617187500e+01 -1.035944104194641113e+00 -7.603601074218750000e+01 -1.036036968231201172e+00 -7.598049926757812500e+01 -1.036129951477050781e+00 -7.586607360839843750e+01 -1.036222815513610840e+00 -7.570477294921875000e+01 -1.036315679550170898e+00 -7.550607299804687500e+01 -1.036465167999267578e+00 -7.512596893310546875e+01 -1.036614656448364258e+00 -7.469119262695312500e+01 -1.036764144897460938e+00 -7.421954345703125000e+01 -1.036913514137268066e+00 -7.372275543212890625e+01 -1.037063002586364746e+00 -7.320849609375000000e+01 -1.037212491035461426e+00 -7.268313598632812500e+01 -1.037361979484558105e+00 -7.215210723876953125e+01 -1.037511467933654785e+00 -7.161880493164062500e+01 -1.037660837173461914e+00 -7.108586120605468750e+01 -1.037810325622558594e+00 -7.055595397949218750e+01 -1.037959814071655273e+00 -7.003073883056640625e+01 -1.038109302520751953e+00 -6.951049804687500000e+01 -1.038258671760559082e+00 -6.899612426757812500e+01 -1.038408160209655762e+00 -6.848917388916015625e+01 -1.038557648658752441e+00 -6.798980712890625000e+01 -1.038707137107849121e+00 -6.749651336669921875e+01 -1.038856625556945801e+00 -6.700959777832031250e+01 -1.039005994796752930e+00 -6.653038024902343750e+01 -1.039155483245849609e+00 -6.605827331542968750e+01 -1.039304971694946289e+00 -6.558908081054687500e+01 -1.039454460144042969e+00 -6.512375640869140625e+01 -1.039603948593139648e+00 -6.466513824462890625e+01 -1.039753317832946777e+00 -6.421041107177734375e+01 -1.039902806282043457e+00 -6.375017929077148438e+01 -1.040052294731140137e+00 -6.328818893432617188e+01 -1.040201783180236816e+00 -6.282777404785156250e+01 -1.040351271629333496e+00 -6.238013458251953125e+01 -1.040500640869140625e+00 -6.191254425048828125e+01 -1.040611267089843750e+00 -6.154252624511718750e+01 -1.040721893310546875e+00 -6.117369461059570312e+01 -1.040832519531250000e+00 -6.080197525024414062e+01 -1.040943145751953125e+00 -6.040757751464843750e+01 -1.041053771972656250e+00 -5.999265670776367188e+01 -1.041164398193359375e+00 -5.956604385375976562e+01 -1.041275024414062500e+00 -5.911016082763671875e+01 -1.041385650634765625e+00 -5.861387252807617188e+01 -1.041496276855468750e+00 -5.805910491943359375e+01 -1.041606903076171875e+00 -5.744200897216796875e+01 -1.041717529296875000e+00 -5.671152114868164062e+01 -1.041745185852050781e+00 -5.650662612915039062e+01 -1.041772842407226562e+00 -5.629737091064453125e+01 -1.041800498962402344e+00 -5.607124328613281250e+01 -1.041828155517578125e+00 -5.582941818237304688e+01 -1.041855812072753906e+00 -5.557338333129882812e+01 -1.041883468627929688e+00 -5.530241394042968750e+01 -1.041911125183105469e+00 -5.500506210327148438e+01 -1.041938781738281250e+00 -5.467860412597656250e+01 -1.041966438293457031e+00 -5.432251739501953125e+01 -1.041994094848632812e+00 -5.393775939941406250e+01 -1.042021751403808594e+00 -5.350494766235351562e+01 -1.042049407958984375e+00 -5.300724792480468750e+01 -1.042077064514160156e+00 -5.242581176757812500e+01 -1.042104721069335938e+00 -5.176123428344726562e+01 -1.042132377624511719e+00 -5.097561645507812500e+01 -1.042160034179687500e+00 -4.999350357055664062e+01 -1.042187690734863281e+00 -4.871686172485351562e+01 -1.042215347290039062e+00 -4.702680969238281250e+01 -1.042243003845214844e+00 -4.467447280883789062e+01 -1.042270660400390625e+00 -4.114283370971679688e+01 -1.042277574539184570e+00 -3.993592834472656250e+01 -1.042284488677978516e+00 -3.851056289672851562e+01 -1.042291402816772461e+00 -3.686356353759765625e+01 -1.042298316955566406e+00 -3.496628952026367188e+01 -1.042305231094360352e+00 -3.275718688964843750e+01 -1.042312145233154297e+00 -3.016466712951660156e+01 -1.042319059371948242e+00 -2.714208412170410156e+01 -1.042325973510742188e+00 -2.368921279907226562e+01 -1.042332887649536133e+00 -1.986608886718750000e+01 -1.042339801788330078e+00 -1.581947994232177734e+01 -1.042346715927124023e+00 -1.180189037322998047e+01 -1.042353630065917969e+00 -8.123357772827148438e+00 -1.042360544204711914e+00 -5.025801181793212891e+00 -1.042367339134216309e+00 -2.593507766723632812e+00 -1.042374253273010254e+00 -8.099573850631713867e-01 -1.042381167411804199e+00 3.384348750114440918e-01 -1.042388081550598145e+00 8.869864940643310547e-01 -1.042394995689392090e+00 9.698059558868408203e-01 -1.042401909828186035e+00 7.537999153137207031e-01 -1.042408823966979980e+00 3.057900667190551758e-01 -1.042415738105773926e+00 -3.791679441928863525e-01 -1.042422652244567871e+00 -1.272692561149597168e+00 -1.042429566383361816e+00 -2.295782566070556641e+00 -1.042436480522155762e+00 -3.385779857635498047e+00 -1.042443394660949707e+00 -4.539071083068847656e+00 -1.042450308799743652e+00 -5.757670879364013672e+00 -1.042457222938537598e+00 -7.004720687866210938e+00 -1.042464137077331543e+00 -8.243210792541503906e+00 -1.042471051216125488e+00 -9.475334167480468750e+00 -1.042477965354919434e+00 -1.071755409240722656e+01 -1.042484879493713379e+00 -1.196250915527343750e+01 -1.042491793632507324e+00 -1.318759822845458984e+01 -1.042498707771301270e+00 -1.438784313201904297e+01 -1.042505621910095215e+00 -1.557790756225585938e+01 -1.042512536048889160e+00 -1.676459884643554688e+01 -1.042519450187683105e+00 -1.793679046630859375e+01 -1.042526364326477051e+00 -1.908556175231933594e+01 -1.042533278465270996e+00 -2.021842765808105469e+01 -1.042540192604064941e+00 -2.134635543823242188e+01 -1.042547106742858887e+00 -2.246767616271972656e+01 -1.042554020881652832e+00 -2.357580566406250000e+01 -1.042560935020446777e+00 -2.466938209533691406e+01 -1.042567849159240723e+00 -2.575577545166015625e+01 -1.042574763298034668e+00 -2.683971023559570312e+01 -1.042581677436828613e+00 -2.791834259033203125e+01 -1.042588591575622559e+00 -2.898922920227050781e+01 -1.042595505714416504e+00 -3.005588531494140625e+01 -1.042602419853210449e+00 -3.112323951721191406e+01 -1.042609333992004395e+00 -3.219183731079101562e+01 -1.042616248130798340e+00 -3.325936889648437500e+01 -1.042623162269592285e+00 -3.432596969604492188e+01 -1.042630076408386230e+00 -3.539491271972656250e+01 -1.042636990547180176e+00 -3.646834564208984375e+01 -1.042643904685974121e+00 -3.754516220092773438e+01 -1.042650818824768066e+00 -3.862366867065429688e+01 -1.042657732963562012e+00 -3.970429992675781250e+01 -1.042664647102355957e+00 -4.078824234008789062e+01 -1.042671561241149902e+00 -4.187472534179687500e+01 -1.042678475379943848e+00 -4.296115875244140625e+01 -1.042685389518737793e+00 -4.404527664184570312e+01 -1.042692303657531738e+00 -4.512580108642578125e+01 -1.042702794075012207e+00 -4.675100708007812500e+01 -1.042713284492492676e+00 -4.835300827026367188e+01 -1.042723774909973145e+00 -4.991961669921875000e+01 -1.042734265327453613e+00 -5.143838500976562500e+01 -1.042751073837280273e+00 -5.375786972045898438e+01 -1.042768001556396484e+00 -5.589230346679687500e+01 -1.042784810066223145e+00 -5.782252120971679688e+01 -1.042801737785339355e+00 -5.954582977294921875e+01 -1.042818546295166016e+00 -6.107174301147460938e+01 -1.042835474014282227e+00 -6.241766357421875000e+01 -1.042852282524108887e+00 -6.360553741455078125e+01 -1.042869210243225098e+00 -6.465855407714843750e+01 -1.042886018753051758e+00 -6.559799194335937500e+01 -1.042912483215332031e+00 -6.688719940185546875e+01 -1.042939066886901855e+00 -6.798736572265625000e+01 -1.042965531349182129e+00 -6.893688964843750000e+01 -1.042992115020751953e+00 -6.976930236816406250e+01 -1.043018579483032227e+00 -7.050756072998046875e+01 -1.043045163154602051e+00 -7.116272735595703125e+01 -1.043071627616882324e+00 -7.174264526367187500e+01 -1.043098211288452148e+00 -7.225856781005859375e+01 -1.043124675750732422e+00 -7.272208404541015625e+01 -1.043151259422302246e+00 -7.313983154296875000e+01 -1.043177723884582520e+00 -7.351461791992187500e+01 -1.043204307556152344e+00 -7.384999084472656250e+01 -1.043230772018432617e+00 -7.415117645263671875e+01 -1.043257355690002441e+00 -7.442250823974609375e+01 -1.043283820152282715e+00 -7.466629791259765625e+01 -1.043310403823852539e+00 -7.488423919677734375e+01 -1.043336868286132812e+00 -7.507873535156250000e+01 -1.043363451957702637e+00 -7.525235748291015625e+01 -1.043404698371887207e+00 -7.548496246337890625e+01 -1.043445944786071777e+00 -7.567667388916015625e+01 -1.043487191200256348e+00 -7.583235931396484375e+01 -1.043528556823730469e+00 -7.595635223388671875e+01 -1.043600082397460938e+00 -7.610695648193359375e+01 -1.043671607971191406e+00 -7.618920135498046875e+01 -1.043743133544921875e+00 -7.621520233154296875e+01 -1.043814659118652344e+00 -7.619465637207031250e+01 -1.043886303901672363e+00 -7.613552856445312500e+01 -1.043957829475402832e+00 -7.604434967041015625e+01 -1.044029355049133301e+00 -7.592639923095703125e+01 -1.044152021408081055e+00 -7.567406463623046875e+01 -1.044274687767028809e+00 -7.537248992919921875e+01 -1.044397354125976562e+00 -7.503382110595703125e+01 -1.044519901275634766e+00 -7.466733551025390625e+01 -1.044642567634582520e+00 -7.428046417236328125e+01 -1.044765233993530273e+00 -7.387892913818359375e+01 -1.044887900352478027e+00 -7.346696472167968750e+01 -1.045095324516296387e+00 -7.275550079345703125e+01 -1.045302867889404297e+00 -7.203598022460937500e+01 -1.045510411262512207e+00 -7.131629943847656250e+01 -1.045717835426330566e+00 -7.060194396972656250e+01 -1.045925378799438477e+00 -6.989718627929687500e+01 -1.046132802963256836e+00 -6.920484161376953125e+01 -1.046340346336364746e+00 -6.852580261230468750e+01 -1.046547889709472656e+00 -6.786039733886718750e+01 -1.046755313873291016e+00 -6.720888519287109375e+01 -1.047067642211914062e+00 -6.625350952148437500e+01 -1.047379970550537109e+00 -6.532212829589843750e+01 -1.047692298889160156e+00 -6.440673065185546875e+01 -1.048004508018493652e+00 -6.349892807006835938e+01 -1.048316836357116699e+00 -6.258887100219726562e+01 -1.048629164695739746e+00 -6.165032577514648438e+01 -1.048941493034362793e+00 -6.064650344848632812e+01 -1.049253702163696289e+00 -5.952233123779296875e+01 -1.049566030502319336e+00 -5.818599700927734375e+01 -1.049644112586975098e+00 -5.778858184814453125e+01 -1.049722194671630859e+00 -5.734508514404296875e+01 -1.049800276756286621e+00 -5.684922409057617188e+01 -1.049878358840942383e+00 -5.630104827880859375e+01 -1.049956440925598145e+00 -5.564889907836914062e+01 diff --git a/allensdk/test/ephys/test_extractor.py b/allensdk/test/ephys/test_extractor.py deleted file mode 100644 index ae45a53164..0000000000 --- a/allensdk/test/ephys/test_extractor.py +++ /dev/null @@ -1,175 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -import mock - -import pytest -import numpy as np -from allensdk.ephys.ephys_extractor import EphysSweepSetFeatureExtractor, input_resistance -import allensdk.ephys.ephys_extractor as ephys_extractor -import os -path = os.path.dirname(__file__) - - -def test_extractor_no_values(): - ext = EphysSweepSetFeatureExtractor() - - -def test_extractor_wrong_inputs(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - i = np.zeros_like(v) - - with pytest.raises(ValueError): - ext = EphysSweepSetFeatureExtractor(t, v, i) - - with pytest.raises(ValueError): - ext = EphysSweepSetFeatureExtractor([t], v, i) - - with pytest.raises(ValueError): - ext = EphysSweepSetFeatureExtractor([t], [v], i) - - with pytest.raises(ValueError): - ext = EphysSweepSetFeatureExtractor([t, t], [v], [i]) - - with pytest.raises(ValueError): - ext = EphysSweepSetFeatureExtractor([t, t], [v, v], [i]) - - -def test_extractor_on_sample_data(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - - ext = EphysSweepSetFeatureExtractor([t], [v]) - ext.process_spikes() - swp = ext.sweeps()[0] - spikes = swp.spikes() - - keys = swp.spike_feature_keys() - swp_keys = swp.sweep_feature_keys() - result = swp.spike_feature(keys[0]) - result = swp.sweep_feature("first_isi") - result = ext.sweep_features("first_isi") - result = ext.spike_feature_averages(keys[0]) - - with pytest.raises(KeyError): - result = swp.spike_feature("nonexistent_key") - - with pytest.raises(KeyError): - result = swp.sweep_feature("nonexistent_key") - - -def test_extractor_on_sample_data_with_i(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - i = np.zeros_like(v) - - ext = EphysSweepSetFeatureExtractor([t], [v], [i]) - ext.process_spikes() - - -def test_extractor_on_zero_voltage(): - t = np.arange(0, 4000) * 5e-6 - v = np.zeros_like(t) - i = np.zeros_like(t) - - ext = EphysSweepSetFeatureExtractor([t], [v], [i]) - ext.process_spikes() - - -def test_extractor_on_variable_time_step(): - data = np.loadtxt(os.path.join(path, "data/spike_test_var_dt.txt")) - t = data[:, 0] - v = data[:, 1] - - ext = EphysSweepSetFeatureExtractor([t], [v]) - ext.process_spikes() - expected_thresh_ind = np.array([73, 183, 314, 463, 616, 770]) - sweep = ext.sweeps()[0] - assert np.allclose(sweep.spike_feature("threshold_index"), expected_thresh_ind) - - -def test_extractor_with_high_init_dvdt(): - data = np.loadtxt(os.path.join(path, "data/spike_test_high_init_dvdt.txt")) - t = data[:, 0] - v = data[:, 1] - - ext = EphysSweepSetFeatureExtractor([t], [v]) - ext.process_spikes() - expected_thresh_ind = np.array([11222, 16258, 24060]) - sweep = ext.sweeps()[0] - assert np.allclose(sweep.spike_feature("threshold_index"), expected_thresh_ind) - - -def test_extractor_input_resistance(): - t = np.arange(0, 1.0, 5e-6) - v1 = np.ones_like(t) * -5. - v2 = np.ones_like(t) * -10. - i1 = np.ones_like(t) * -50. - i2 = np.ones_like(t) * -100. - - ext = EphysSweepSetFeatureExtractor([t, t], [v1, v2], [i1, i2]) - ri = input_resistance(ext) - assert np.allclose(ri, 100.) - - -def test_fit_fi_slope(): - - nsweeps = 5 - weights = np.array([ 2, 1 ]) - - amps = np.random.rand(nsweeps) - iteramps = iter(amps) - - design = np.array([amps, np.ones_like(amps)]).T - rates = np.dot(design, weights) - build_stim_amps = lambda: lambda sweep: next(iteramps) - - class Ext(object): - def sweeps(self): - return np.zeros([nsweeps]) - def sweep_features(self, key): - return rates - - with mock.patch( - 'allensdk.ephys.ephys_extractor._step_stim_amp', - new_callable=build_stim_amps) as p: - - slope_obt = ephys_extractor.fit_fi_slope(Ext()) - assert(np.allclose(weights[0], slope_obt)) \ No newline at end of file diff --git a/allensdk/test/ephys/test_features.py b/allensdk/test/ephys/test_features.py deleted file mode 100644 index ec1b35f541..0000000000 --- a/allensdk/test/ephys/test_features.py +++ /dev/null @@ -1,268 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import allensdk.ephys.ephys_features as ft -import numpy as np -import os -path = os.path.dirname(__file__) - - -def test_v_and_t_are_arrays(): - v = [0, 1, 2] - t = [0, 1, 2] - with pytest.raises(TypeError): - ft.detect_putative_spikes(v, t) - - with pytest.raises(TypeError): - ft.detect_putative_spikes(np.array(v), t) - - -def test_size_mismatch(): - v = np.array([0, 1, 2]) - t = np.array([0, 1]) - with pytest.raises(ft.FeatureError): - ft.detect_putative_spikes(v, t) - - -def test_find_time_out_of_bounds(): - t = np.array([0, 1, 2]) - t_0 = 4 - - with pytest.raises(ft.FeatureError): - ft.find_time_index(t, t_0) - - -def test_dvdt_no_filter(): - t = np.array([0, 1, 2, 3]) - v = np.array([1, 1, 1, 1]) - - assert np.allclose(ft.calculate_dvdt(v, t), np.diff(v) / np.diff(t)) - - -def test_fixed_dt(): - t = [0, 1, 2, 3] - assert ft.has_fixed_dt(t) == True - - # Change the first time point to make time steps inconsistent - t[0] -= 3. - assert ft.has_fixed_dt(t) == False - - -def test_detect_one_spike(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - expected_spikes = np.array([728]) - - assert np.allclose(ft.detect_putative_spikes(v[:3000], t[:3000]), expected_spikes) - - -def test_detect_two_spikes(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - expected_spikes = np.array([728, 3386]) - - assert np.allclose(ft.detect_putative_spikes(v, t), expected_spikes) - - -def test_detect_no_spikes(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = np.zeros_like(t) - - assert len(ft.detect_putative_spikes(v, t)) == 0 - - -def test_detect_no_spike_peaks(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = np.zeros_like(t) - spikes = np.array([]) - - assert len(ft.find_peak_indexes(v, t, spikes)) == 0 - - -def test_detect_two_spike_peaks(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - spikes = np.array([728, 3386]) - expected_peaks = np.array([812, 3478]) - - assert np.allclose(ft.find_peak_indexes(v, t, spikes), expected_peaks) - - -def test_filter_problem_spikes(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - spikes = np.array([728, 3386]) - peaks = np.array([812, 3478]) - - new_spikes, new_peaks = ft.filter_putative_spikes(v, t, spikes, peaks) - assert np.allclose(spikes, new_spikes) - assert np.allclose(peaks, new_peaks) - - -def test_filter_no_spikes(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = np.zeros_like(t) - spikes = np.array([]) - peaks = np.array([]) - - new_spikes, new_peaks = ft.filter_putative_spikes(v, t, spikes, peaks) - assert len(new_spikes) == len(new_peaks) == 0 - - -def test_upstrokes(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - spikes = np.array([728, 3386]) - peaks = np.array([812, 3478]) - - expected_upstrokes = np.array([778, 3440]) - assert np.allclose(ft.find_upstroke_indexes(v, t, spikes, peaks), expected_upstrokes) - - -def test_thresholds(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - upstrokes = np.array([778, 3440]) - - expected_thresholds = np.array([725, 3382]) - assert np.allclose(ft.refine_threshold_indexes(v, t, upstrokes), expected_thresholds) - - -def test_thresholds_cannot_find_target(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - upstrokes = np.array([778, 3440]) - - expected = np.array([0, 778]) - assert np.allclose(ft.refine_threshold_indexes(v, t, upstrokes, thresh_frac=-5.0), expected) - - -def test_check_spikes_and_peaks(): - t = np.arange(0, 30) * 5e-6 - v = np.zeros_like(t) - spikes = np.array([0, 5]) - peaks = np.array([10, 15]) - upstrokes = np.array([3, 13]) - - new_spikes, new_peaks, new_upstrokes, clipped = ft.check_thresholds_and_peaks(v, t, spikes, peaks, upstrokes) - assert np.allclose(new_spikes, spikes[:-1]) - assert np.allclose(new_peaks, peaks[1:]) - - -def test_troughs(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - spikes = np.array([725, 3382]) - peaks = np.array([812, 3478]) - - expected_troughs = np.array([1089, 3741]) - assert np.allclose(ft.find_trough_indexes(v, t, spikes, peaks), expected_troughs) - - -def test_troughs_with_peak_at_end(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - spikes = np.array([725, 3382]) - peaks = np.array([812, 3478]) - clipped = np.array([False, True]) - - troughs = ft.find_trough_indexes(v[:peaks[-1]], t[:peaks[-1]], - spikes, peaks, clipped=clipped) - assert np.isnan(troughs[-1]) - - -def test_downstrokes(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - peaks = np.array([812, 3478]) - troughs = np.array([1089, 3741]) - - expected_downstrokes = np.array([862, 3532]) - assert np.allclose(ft.find_downstroke_indexes(v, t, peaks, troughs), expected_downstrokes) - - -def test_downstrokes_too_many_troughs(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - peaks = np.array([812, 3478]) - troughs = np.array([1089, 3741, 3999]) - - with pytest.raises(ft.FeatureError): - ft.find_downstroke_indexes(v, t, peaks, troughs) - - -def test_width_calculation(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - spikes = np.array([725, 3382]) - peaks = np.array([812, 3478]) - troughs = np.array([1089, 3741]) - - expected_widths = np.array([0.000545, 0.000585]) - assert np.allclose(ft.find_widths(v, t, spikes, peaks, troughs), expected_widths) - - -def test_width_calculation_too_many_troughs(): - data = np.loadtxt(os.path.join(path, "data/spike_test_pair.txt")) - t = data[:, 0] - v = data[:, 1] - spikes = np.array([725, 3382]) - peaks = np.array([812, 3478]) - troughs = np.array([1089, 3741, 3999]) - - with pytest.raises(ft.FeatureError): - ft.find_widths(v, t, spikes, peaks, troughs) - - -@pytest.mark.skipif(True, reason="not implemented") -def test_width_calculation_with_burst(): - # example sp 487663469, sweep 43 - pass diff --git a/allensdk/test/glif_tests.py b/allensdk/test/glif_tests.py deleted file mode 100644 index e5d940103f..0000000000 --- a/allensdk/test/glif_tests.py +++ /dev/null @@ -1,114 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import matplotlib -matplotlib.use('agg') -import matplotlib.pyplot as plt # noqa: #402 -from allensdk.api.queries.glif_api import GlifApi # noqa: #402 -import allensdk.core.json_utilities as json_utilities # noqa: #402 -from allensdk.model.glif.glif_neuron import GlifNeuron # noqa: #402 -from allensdk.model.glif.simulate_neuron import simulate_neuron # noqa: #402 -import os # noqa: #402 -import shutil # noqa: #402 -import logging # noqa: #402 - - -# NEURONAL_MODEL_ID = 491547163 # level 1 LIF -NEURONAL_MODEL_ID = 491547171 # level 5 GLIF - -OUTPUT_DIR = 'tmp' - - -def test_download(): - if os.path.exists(OUTPUT_DIR): - shutil.rmtree(OUTPUT_DIR) - - os.makedirs(OUTPUT_DIR) - - glif_api = GlifApi() - glif_api.get_neuronal_model(NEURONAL_MODEL_ID) - glif_api.cache_stimulus_file(os.path.join( - OUTPUT_DIR, '%d.nwb' % NEURONAL_MODEL_ID)) - - neuron_config = glif_api.get_neuron_config() - json_utilities.write(os.path.join( - OUTPUT_DIR, '%d_neuron_config.json' % NEURONAL_MODEL_ID), neuron_config) - - ephys_sweeps = glif_api.get_ephys_sweeps() - json_utilities.write(os.path.join( - OUTPUT_DIR, 'ephys_sweeps.json'), ephys_sweeps) - - -def test_run(): - # initialize the neuron - neuron_config = json_utilities.read(os.path.join( - OUTPUT_DIR, '%d_neuron_config.json' % NEURONAL_MODEL_ID)) - neuron = GlifNeuron.from_dict(neuron_config) - - # make a short square pulse. stimulus units should be in Amps. - stimulus = [0.0] * 100 + [10e-9] * 100 + [0.0] * 100 - - # important! set the neuron's dt value for your stimulus in seconds - neuron.dt = 5e-6 - - # simulate the neuron - output = neuron.run(stimulus) - - voltage = output['voltage'] - threshold = output['threshold'] - - plt.plot(voltage) - plt.plot(threshold) - plt.savefig(os.path.join(OUTPUT_DIR, 'plot.png')) - - -def test_simulate(): - logging.getLogger().setLevel(logging.DEBUG) - neuron_config = json_utilities.read(os.path.join( - OUTPUT_DIR, '%d_neuron_config.json' % NEURONAL_MODEL_ID)) - ephys_sweeps = json_utilities.read( - os.path.join(OUTPUT_DIR, 'ephys_sweeps.json')) - ephys_file_name = os.path.join(OUTPUT_DIR, '%d.nwb' % NEURONAL_MODEL_ID) - - neuron = GlifNeuron.from_dict(neuron_config) - - sweep_numbers = [s['sweep_number'] for s in ephys_sweeps] - simulate_neuron(neuron, sweep_numbers, - ephys_file_name, ephys_file_name, 0.05) - -if __name__ == "__main__": - # test_download() - # test_run() - test_simulate() diff --git a/allensdk/test/internal/api/test_api_prerelease.py b/allensdk/test/internal/api/test_api_prerelease.py deleted file mode 100644 index 4f3c06e204..0000000000 --- a/allensdk/test/internal/api/test_api_prerelease.py +++ /dev/null @@ -1,25 +0,0 @@ -import os - -import nrrd -import pytest -import numpy as np - -from allensdk.internal.api.api_prerelease import ApiPrerelease - - -@pytest.fixture -def api(): - return ApiPrerelease() - - -@pytest.mark.prerelease() -def test_retrieve_file_from_storage(api, fn_temp_dir): - eye = np.eye(100) - - target = os.path.join(fn_temp_dir, 'target') - store = os.path.join(fn_temp_dir, 'store') - nrrd.write(store, eye) - - api.retrieve_file_from_storage(store, target) - - assert os.path.exists(target) diff --git a/allensdk/test/internal/api/test_grid_data_api_prerelease.py b/allensdk/test/internal/api/test_grid_data_api_prerelease.py deleted file mode 100644 index c70207e773..0000000000 --- a/allensdk/test/internal/api/test_grid_data_api_prerelease.py +++ /dev/null @@ -1,95 +0,0 @@ -import os - -import nrrd -import mock -import pytest -import numpy as np -from numpy.testing import assert_raises - -from allensdk.config.manifest import Manifest - -from allensdk.internal.api.queries.grid_data_api_prerelease \ - import GridDataApiPrerelease, _get_grid_storage_directories - -@pytest.fixture -def storage_dirs(fn_temp_dir): - return {"111" : os.path.join(fn_temp_dir, "111"), - "222" : os.path.join(fn_temp_dir, "222")} - -@pytest.fixture -def query_result(fn_temp_dir): - return [{b'id' : 111, b'storage_directory' : os.path.join(fn_temp_dir, "111")}, - {b'id' : 222, b'storage_directory' : os.path.join(fn_temp_dir, "222")}] - -@pytest.fixture -def grid_data(storage_dirs, fn_temp_dir): - gda = GridDataApiPrerelease(storage_dirs) - return gda - - -# ---------------------------------------------------------------------------- -# module level functions -# ---------------------------------------------------------------------------- -@pytest.mark.prerelease() -def test_get_grid_storage_directories(storage_dirs, query_result, fn_temp_dir): - # ------------------------------------------------------------------------ - # test dirs only have grid/ subdirectory - with mock.patch('allensdk.internal.core.lims_utilities.query', - new=lambda a: query_result): - obtained = _get_grid_storage_directories(GridDataApiPrerelease.GRID_DATA_DIRECTORY) - - assert not obtained - - # ------------------------------------------------------------------------ - # test returns storage_dirs - for path in storage_dirs.values(): - Manifest.safe_make_parent_dirs(os.path.join(path, 'grid')) - - with mock.patch('allensdk.internal.core.lims_utilities.query', - new=lambda a: query_result): - obtained = _get_grid_storage_directories(GridDataApiPrerelease.GRID_DATA_DIRECTORY) - - for key, value in obtained: - assert storage_dirs[key] == value - - -# ---------------------------------------------------------------------------- -# GridDataApiPrerelease class -# ---------------------------------------------------------------------------- -@pytest.mark.prerelease() -def test_from_file_name(storage_dirs, fn_temp_dir): - file_name = os.path.join(fn_temp_dir, 'storage_dirs.json') - - with mock.patch('allensdk.internal.api.queries.grid_data_api_prerelease.' - '_get_grid_storage_directories', - new=lambda a: storage_dirs): - grid_data = GridDataApiPrerelease.from_file_name(file_name) - - with mock.patch('allensdk.internal.api.queries.grid_data_api_prerelease.' - '_get_grid_storage_directories') as ggsd: - grid_data = GridDataApiPrerelease.from_file_name(file_name) - - ggsd.assert_not_called() - assert os.path.exists(file_name) - - -@pytest.mark.prerelease() -def test_download_projection_grid_data(grid_data, fn_temp_dir): - - eye = np.eye(100) - eid = 111 - target = os.path.join(fn_temp_dir, 'target') - - # test invalid experiment id/no grid - assert_raises(ValueError, grid_data.download_projection_grid_data, target, - 0, 'projection_density_100.nrrd') - assert not os.path.exists(target) - - # test valid - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage', - new=lambda a, b, c: nrrd.write(c, eye)): - - grid_data.download_projection_grid_data(target, 111, 'projection_density_100.nrrd') - - assert os.path.exists(target) diff --git a/allensdk/test/internal/api/test_mouse_connectivity_api_prerelease.py b/allensdk/test/internal/api/test_mouse_connectivity_api_prerelease.py deleted file mode 100644 index 39e7217962..0000000000 --- a/allensdk/test/internal/api/test_mouse_connectivity_api_prerelease.py +++ /dev/null @@ -1,138 +0,0 @@ -import os - -import nrrd -import mock -import pytest -import numpy as np -from numpy.testing import assert_raises - -from allensdk.core import json_utilities - -from allensdk.internal.api.queries.mouse_connectivity_api_prerelease \ - import MouseConnectivityApiPrerelease, _experiment_dict - -@pytest.fixture -def storage_dirs(fn_temp_dir): - return {"111" : os.path.join(fn_temp_dir, "111")} - -@pytest.fixture -def connectivity(storage_dirs, fn_temp_dir): - file_name = os.path.join(fn_temp_dir, 'storage_directories.json') - json_utilities.write(file_name, storage_dirs) - - mca = MouseConnectivityApiPrerelease(file_name) - return mca - -_STRUCTURE_TREE_ROOT_ID = 997 -_STRUCTURE_TREE_ROOT_NAME = "root" -_STRUCTURE_TREE_ROOT_ACRONYM = "root" - -# ---------------------------------------------------------------------------- -# module level functions -# ---------------------------------------------------------------------------- -@pytest.mark.prerelease() -def tests_experiment_dict(): - # ------------------------------------------------------------------------ - # null row - row = {b'id':1, - b'age' : None, - b'gender' : None, - b'project_code' : None, - b'specimen_name' : None, - b'transgenic_line' : None, - b'workflow_state' : None, - b'workflows' : None, - b'structure_id' : None, - b'structure_name' : None, - b'structure_acronym' : None, - b'injection_structures_id' : None, - b'injection_structures_name' : None, - b'injection_structures_acronym' : None} - - exp = _experiment_dict(row) - - assert exp.pop('id') == 1 - - assert exp.get('structure_id') == exp.get('injection_structures')[0].get('id') - assert exp.get('structure_name') == exp.get('injection_structures')[0].get('name') - assert exp.get('structure_abbrev') == exp.get('injection_structures')[0].get('abbreviation') - - assert exp.pop('structure_id') == _STRUCTURE_TREE_ROOT_ID - assert exp.pop('structure_name') == _STRUCTURE_TREE_ROOT_NAME - assert exp.pop('structure_abbrev') == _STRUCTURE_TREE_ROOT_ACRONYM - - assert len(exp.pop('injection_structures')) == 1 - - assert exp.get('workflows')[0] == "" - assert len(exp.pop('workflows')) == 1 - - for value in exp.values(): - assert value == "" - - -# ---------------------------------------------------------------------------- -# MouseConnectivityApiPrerelease class -# ---------------------------------------------------------------------------- -@pytest.mark.prerelease() -def test_get_structure_unionizes(connectivity): - assert_raises(NotImplementedError, connectivity.get_structure_unionizes) - - -@pytest.mark.prerelease() -def test_download_injection_density(connectivity, storage_dirs, fn_temp_dir): - eid = 111 - store = storage_dirs[str(eid)] - source = os.path.join(store, 'grid', 'injection_density_25.nrrd') - target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'injection_density_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage') as gda: - connectivity.download_injection_density(target, eid, 25) - - gda.assert_called_once_with(source, target) - - -@pytest.mark.prerelease() -def test_download_projection_density(connectivity, storage_dirs, fn_temp_dir): - eid = 111 - store = storage_dirs[str(eid)] - source = os.path.join(store, 'grid', 'projection_density_25.nrrd') - target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'projection_density_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage') as gda: - connectivity.download_projection_density(target, eid, 25) - - gda.assert_called_once_with(source, target) - - -@pytest.mark.prerelease() -def test_download_injection_fraction(connectivity, storage_dirs, fn_temp_dir): - eid = 111 - store = storage_dirs[str(eid)] - source = os.path.join(store, 'grid', 'injection_fraction_25.nrrd') - target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'injection_fraction_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage') as gda: - connectivity.download_injection_fraction(target, eid, 25) - - gda.assert_called_once_with(source, target) - - -@pytest.mark.prerelease() -def test_download_data_mask(connectivity, storage_dirs, fn_temp_dir): - eid = 111 - store = storage_dirs[str(eid)] - source = os.path.join(store, 'grid', 'data_mask_25.nrrd') - target = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'data_mask_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage') as gda: - connectivity.download_data_mask(target, eid, 25) - - gda.assert_called_once_with(source, target) diff --git a/allensdk/test/internal/api/test_pre_release.py b/allensdk/test/internal/api/test_pre_release.py deleted file mode 100644 index 3b7a190b77..0000000000 --- a/allensdk/test/internal/api/test_pre_release.py +++ /dev/null @@ -1,168 +0,0 @@ -from allensdk.internal.api.queries.pre_release import BrainObservatoryApiPreRelease -from allensdk.core.brain_observatory_cache import BrainObservatoryCache -from six import integer_types -import pytest -import os -import numpy as np - -@pytest.fixture(scope='function') -def tmpdir(tmpdir_factory): - fn = tmpdir_factory.mktemp('tmpdir') - return fn - - -@pytest.mark.prerelease -def test_pre_release_get_containers(tmpdir): - - # Values from original boc/api: - temp_dir_base = os.path.join(str(tmpdir), 'base-api') - outfile_base = os.path.join(temp_dir_base, 'manifest.json') - boc_base = BrainObservatoryCache(manifest_file=outfile_base) - containers_base = boc_base.get_experiment_containers() - - # # For development: print key/val pairs needed to be populated by adapter: - # for key, val in sorted(containers_base[0].items(), key=lambda x: x[0]): - # print key, val - # raise - - try: - temp_dir_extended = os.path.join(str(tmpdir), 'extended-api') - outfile_extended = os.path.join(temp_dir_extended, 'manifest.json') - boc_extended = BrainObservatoryCache(manifest_file=outfile_extended, api=BrainObservatoryApiPreRelease()) - except TypeError: - import allensdk - raise RuntimeError('Allensdk out-of-date; upgrade with "pip install --force --upgrade allensdk"') - - containers_extended = boc_extended.get_experiment_containers() - - # # For development: print key/val pairs actually populated by adapter: - # for key, val in sorted(containers_extended[0].items(), key=lambda x: x[0]): - # print key, val - # raise - - - assert len(containers_extended) > 0 - check_key_list = ['failed', 'tags', 'specimen_name', 'imaging_depth', 'donor_name', 'reporter_line', 'targeted_structure', 'cre_line', 'id'] - for key in check_key_list: - assert key in containers_extended[0] - assert len(containers_extended[0]) == len(containers_base[0]) - set(containers_extended[0].keys()) == set(containers_base[0].keys()) - - id_container_dict = {} - for c_e in containers_extended: - curr_id = c_e['id'] - id_container_dict[curr_id] = c_e - - for c_b in containers_base: - c_e = id_container_dict[c_b['id']] - for key in c_e: - if not c_e[key] == c_b[key]: - print(key, c_e[key], c_b[key]) - raise Exception() - - -@pytest.mark.prerelease -def test_pre_release_get_experiments(tmpdir): - - # Values from original boc/api: - temp_dir_base = os.path.join(str(tmpdir), 'base-api') - outfile_base = os.path.join(temp_dir_base, 'manifest.json') - boc_base = BrainObservatoryCache(manifest_file=outfile_base) - experiments_base = boc_base.get_ophys_experiments() - - # # For development: print key/val pairs needed to be populated by adapter: - # for key, val in sorted(experiments_base[0].items(), key=lambda x: x[0]): - # print key, val - # raise - - - try: - temp_dir_extended = os.path.join(str(tmpdir), 'extended-api') - outfile_extended = os.path.join(temp_dir_extended, 'manifest.json') - boc_extended = BrainObservatoryCache(manifest_file=outfile_extended, api=BrainObservatoryApiPreRelease()) - except TypeError: - import allensdk - raise RuntimeError('Allensdk out-of-date; upgrade with "pip install --force --upgrade allensdk"') - - experiments_extended = boc_extended.get_ophys_experiments() - - # # For development: print key/val pairs actually populated by adapter: - # for key, val in sorted(containers_extended[0].items(), key=lambda x: x[0]): - # print key, val - # raise - - check_key_list = ['acquisition_age_days', 'cre_line', 'donor_name', 'experiment_container_id', 'fail_eye_tracking', 'id', 'imaging_depth', 'reporter_line', 'session_type', 'specimen_name', 'targeted_structure'] - for key in check_key_list: - assert key in experiments_extended[0] - - assert len(experiments_extended) > 0 - assert set(experiments_base[0].keys()) == set(experiments_extended[0].keys()) - - id_experiment_dict = {} - for c_e in experiments_extended: - curr_id = c_e['id'] - id_experiment_dict[curr_id] = c_e - - for c_b in experiments_base: - c_e = id_experiment_dict[c_b['id']] - for key in c_e: - # assert c_e[key] == c_b[key] - if not c_e[key] == c_b[key]: - print(key, c_e[key], c_b[key]) - raise Exception() - - -@pytest.mark.prerelease -def test_pre_release_get_cell_specimens(tmpdir): - - # Values from original boc/api: Useful debugging code below, commented out - # import warnings - # warnings.warn('hard coding tmpdir while I dev, because query takes a long time') - # temp_dir_base = '/home/nicholasc/tmp/base-api' - temp_dir_base = os.path.join(str(tmpdir), 'base-api') - outfile_base = os.path.join(temp_dir_base, 'manifest.json') - boc_base = BrainObservatoryCache(manifest_file=outfile_base) - - cell_specimens_base = boc_base.get_cell_specimens(include_failed=True) - - # # For development: print key/val pairs needed to be populated by adapter: - # for container in cell_specimens_base: - # if container['all_stim'] == True: - # for key, val in sorted(container.items(), key=lambda x: x[0]): - # print key, val - # raise - - try: - temp_dir_extended = os.path.join(str(tmpdir), 'extended-api') - outfile_extended = os.path.join(temp_dir_extended, 'manifest.json') - boc_extended = BrainObservatoryCache(manifest_file=outfile_extended, api=BrainObservatoryApiPreRelease()) - except TypeError: - import allensdk - raise RuntimeError('Allensdk out-of-date; upgrade with "pip install --force --upgrade allensdk"') - - cell_specimens_extended = boc_extended.get_cell_specimens(include_failed=True) - - - assert len(cell_specimens_extended) > 0 - assert set(cell_specimens_base[0].keys()) == set(cell_specimens_extended[0].keys()) - - id_experiment_dict = {} - for c_b in cell_specimens_base: - curr_id = c_b['cell_specimen_id'] - id_experiment_dict[curr_id] = c_b - - for c_e in cell_specimens_extended: - if c_e['cell_specimen_id'] in id_experiment_dict: - c_b = id_experiment_dict[c_e['cell_specimen_id']] - for key in sorted([key2 for key2 in c_b]): - assert key in c_e - if not c_e[key] == c_b[key] and not key == 'specimen_id': # Failure mode 1: specimen_id changed - - if isinstance(c_b[key], (float, complex) + integer_types) and isinstance(c_e[key], (float, complex) + integer_types): - assert np.isclose(c_e[key], c_b[key], 1e-12) # Failure mode 2: floating-point precision - elif c_b[key] is None and isinstance(c_e[key], (float, complex) + integer_types): - pass - else: - # assert c_b[key] is None and isinstance(c_e[key], (int, long, float, complex)) - print(key, c_e[key], c_b[key]) - raise Exception() diff --git a/allensdk/test/internal/biophysical/conftest.py b/allensdk/test/internal/biophysical/conftest.py deleted file mode 100644 index c467d2d328..0000000000 --- a/allensdk/test/internal/biophysical/conftest.py +++ /dev/null @@ -1,6 +0,0 @@ -import os - -# ignore test_optimize_run.py if don't have neuron installed -collect_ignore = [] -if os.getenv("TEST_NEURON") != 'true': - collect_ignore.append("test_optimize_run.py") diff --git a/allensdk/test/internal/biophysical/test_ephys_utils.py b/allensdk/test/internal/biophysical/test_ephys_utils.py deleted file mode 100644 index 88c9b59d08..0000000000 --- a/allensdk/test/internal/biophysical/test_ephys_utils.py +++ /dev/null @@ -1,28 +0,0 @@ -import pytest -import numpy as np -from mock import Mock -import allensdk.internal.model.biophysical.ephys_utils as ephys_utils - - -@pytest.fixture -def data_set(): - data = { 'stimulus': 1.0 * np.arange(10), - 'response': 1.0 * np.arange(10), - 'sampling_rate': 0.1 - } - - data_set = Mock() - data_set.get_sweep = Mock(name='sweep_data', - return_value=data) - - return data_set - - -def test_passive_preprocess(data_set): - s = { 'sweep_number': 5 } - - v, i, t = ephys_utils.get_sweep_v_i_t_from_set(data_set, - s['sweep_number']) - assert np.array_equal(v, np.arange(10) * 1000.0) - assert np.array_equal(i, np.arange(10) * 1.0e12) - assert np.array_equal(t, np.arange(10) * 10.0) diff --git a/allensdk/test/internal/biophysical/test_optimize_run.py b/allensdk/test/internal/biophysical/test_optimize_run.py deleted file mode 100644 index c6180c56df..0000000000 --- a/allensdk/test/internal/biophysical/test_optimize_run.py +++ /dev/null @@ -1,6869 +0,0 @@ -import pytest -import sys -from mock import patch, mock_open, Mock, MagicMock -from allensdk.model.biophysical.utils import Utils -from allensdk.model.biophys_sim.config import Config -import os -import mock -import shutil -try: - import __builtin__ as builtins -except: - import builtins -from allensdk.model.biophysical import runner -from allensdk.internal.model.biophysical.run_optimize \ - import RunOptimize -from allensdk.internal.api.queries.optimize_config_reader \ - import OptimizeConfigReader -from allensdk.model.biophys_sim.neuron.hoc_utils import HocUtils - -real_import = __import__ - -#import allensdk.eclipse_debug - - -MANIFEST_JSON = ''' -{ - "biophys": [ - { - "model_file": [ - "/local1/tmp/manifest_sdk.json" - ] - } - ], - "runs": [ - { - "specimen_id": 318733871, - "sweeps": [ - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 55, - 56, - 57, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 106 - ] - } - ], - "neuron": [ - { - "hoc": [ - "stdgui.hoc", - "import3d.hoc", - "cell.hoc" - ] - } - ], - "manifest": [ - { - "type": "dir", - "spec": "/local1/tmp", - "key": "BASEDIR" - }, - { - "type": "dir", - "spec": "/projects/mousecelltypes/vol1/prod192/neuronal_model_329322394/work", - "key": "WORKDIR" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/Nr5a1-Cre_Ai14-169248.04.02.01_491253825_m.swc", - "key": "MORPHOLOGY" - }, - { - "type": "dir", - "spec": "modfiles", - "key": "MODFILE_DIR" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", - "key": "MOD_FILE_Kv2like", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", - "key": "MOD_FILE_NaV", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", - "key": "MOD_FILE_Ca_HVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", - "key": "MOD_FILE_Ca_LVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", - "key": "MOD_FILE_CaDynamics", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", - "key": "MOD_FILE_Ih", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", - "key": "MOD_FILE_Im", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", - "key": "MOD_FILE_Im_v2", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", - "key": "MOD_FILE_K_P", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", - "key": "MOD_FILE_K_T", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", - "key": "MOD_FILE_Kd", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", - "key": "MOD_FILE_Kv3_1", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", - "key": "MOD_FILE_Nap", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", - "key": "MOD_FILE_NaTa", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", - "key": "MOD_FILE_NaTs", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", - "key": "MOD_FILE_SK", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", - "key": "MOD_FILE_Kv2like", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", - "key": "MOD_FILE_NaV", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", - "key": "MOD_FILE_Ca_HVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", - "key": "MOD_FILE_Ca_LVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", - "key": "MOD_FILE_CaDynamics", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", - "key": "MOD_FILE_Ih", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", - "key": "MOD_FILE_Im", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", - "key": "MOD_FILE_Im_v2", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", - "key": "MOD_FILE_K_P", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", - "key": "MOD_FILE_K_T", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", - "key": "MOD_FILE_Kd", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", - "key": "MOD_FILE_Kv3_1", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", - "key": "MOD_FILE_Nap", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", - "key": "MOD_FILE_NaTa", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", - "key": "MOD_FILE_NaTs", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", - "key": "MOD_FILE_SK", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", - "key": "MOD_FILE_Kv2like", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", - "key": "MOD_FILE_NaV", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", - "key": "MOD_FILE_Ca_HVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", - "key": "MOD_FILE_Ca_LVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", - "key": "MOD_FILE_CaDynamics", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", - "key": "MOD_FILE_Ih", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", - "key": "MOD_FILE_Im", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", - "key": "MOD_FILE_Im_v2", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", - "key": "MOD_FILE_K_P", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", - "key": "MOD_FILE_K_T", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", - "key": "MOD_FILE_Kd", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", - "key": "MOD_FILE_Kv3_1", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", - "key": "MOD_FILE_Nap", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", - "key": "MOD_FILE_NaTa", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", - "key": "MOD_FILE_NaTs", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", - "key": "MOD_FILE_SK", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/318733869.nwb", - "key": "stimulus_path", - "format": "NWB" - }, - { - "type": "file", - "spec": "/local1/tmp/manifest_sdk.json", - "key": "manifest" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "318733869.nwb", - "key": "output", - "format": "NWB" - }, - { - "type": "file", - "spec": "/local1/tmp/lims_message_optimize.json", - "key": "neuronal_model_data" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "upbase.dat", - "key": "upfile" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "downbase.dat", - "key": "downfile" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "passive_fit_data.json", - "key": "passive_fit_data" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "stage_1_jobs.json", - "key": "stage_1_jobs" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "fit_1_data.json", - "key": "fit_1_file" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "fit_2_data.json", - "key": "fit_2_file" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "fit_3_data.json", - "key": "fit_3_file" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "%s", - "key": "fit_type_path" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "target.json", - "key": "target_path" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "%s/config.json", - "key": "fit_config_json" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "%s/s%d/final_hof_fit.txt", - "key": "final_hof_fit" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "%s/s%d/final_hof.txt", - "key": "final_hof" - }, - { - "type": "file", - "spec": "fit_%s_%s.json", - "key": "output_fit_file" - } - ] -} -''' - -LIMS_MESSAGE = ''' -{ - "created_at": "2015-02-13T16:52:57-08:00", - "id": 329322394, - "name": "Biophysical - perisomatic_Nr5a1-Cre;Ai14-169248.04.02.01", - "neuronal_model_template": { - "created_at": "2015-02-13T11:51:50-08:00", - "id": 329230710, - "name": "Biophysical - perisomatic", - "neuronal_model_template_type": { - "created_at": "2015-02-12T19:46:16-08:00", - "description": "Biophysical Neuronal Model Template", - "id": 328959041, - "name": "BIOPHYS", - "updated_at": "2016-02-12T15:30:27-08:00" - }, - "neuronal_model_template_type_id": 328959041, - "updated_at": "2015-02-13T11:51:50-08:00", - "well_known_files": [ - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-11-13T13:47:51-08:00", - "file_source_id": null, - "filename": "Kv2like.mod", - "id": 491113425, - "published_at": "2016-03-03", - "size": 1433, - "storage_directory": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-11-13T13:47:51-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "audio/x-mod", - "created_at": "2015-03-16T11:07:34-07:00", - "file_source_id": null, - "filename": "NaV.mod", - "id": 464138096, - "published_at": "2015-05-14", - "size": 4061, - "storage_directory": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-03-16T11:08:04-07:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:20-08:00", - "file_source_id": null, - "filename": "Ca_HVA.mod", - "id": 395337003, - "published_at": "2015-05-14", - "size": 1211, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:05-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:30-08:00", - "file_source_id": null, - "filename": "Ca_LVA.mod", - "id": 395337007, - "published_at": "2015-05-14", - "size": 1069, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:13-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:40-08:00", - "file_source_id": null, - "filename": "CaDynamics.mod", - "id": 395337011, - "published_at": "2015-05-14", - "size": 704, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:20-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:48-08:00", - "file_source_id": null, - "filename": "Ih.mod", - "id": 395337015, - "published_at": "2015-05-14", - "size": 1005, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:27-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:57-08:00", - "file_source_id": null, - "filename": "Im.mod", - "id": 395337019, - "published_at": "2015-05-14", - "size": 859, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:34-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:21-08:00", - "file_source_id": null, - "filename": "Im_v2.mod", - "id": 395337042, - "published_at": "2015-05-14", - "size": 761, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:40-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:29-08:00", - "file_source_id": null, - "filename": "K_P.mod", - "id": 395337046, - "published_at": "2015-05-14", - "size": 1161, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:47-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:42-08:00", - "file_source_id": null, - "filename": "K_T.mod", - "id": 395337050, - "published_at": "2015-05-14", - "size": 1031, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:53-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:02-08:00", - "file_source_id": null, - "filename": "Kd.mod", - "id": 395337054, - "published_at": "2015-05-14", - "size": 705, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:59-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:20-08:00", - "file_source_id": null, - "filename": "Kv3_1.mod", - "id": 395337062, - "published_at": "2015-05-14", - "size": 631, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:13-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:29-08:00", - "file_source_id": null, - "filename": "Nap.mod", - "id": 395337066, - "published_at": "2015-05-14", - "size": 1170, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:19-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:38-08:00", - "file_source_id": null, - "filename": "NaTa.mod", - "id": 395337070, - "published_at": "2015-05-14", - "size": 1413, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:29-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:48:22-08:00", - "file_source_id": null, - "filename": "NaTs.mod", - "id": 395337225, - "published_at": "2015-05-14", - "size": 1267, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:36-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:49:02-08:00", - "file_source_id": null, - "filename": "SK.mod", - "id": 395337293, - "published_at": "2015-05-14", - "size": 942, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:48-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-11-13T13:47:51-08:00", - "file_source_id": null, - "filename": "Kv2like.mod", - "id": 491113425, - "published_at": "2016-03-03", - "size": 1433, - "storage_directory": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-11-13T13:47:51-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "audio/x-mod", - "created_at": "2015-03-16T11:07:34-07:00", - "file_source_id": null, - "filename": "NaV.mod", - "id": 464138096, - "published_at": "2015-05-14", - "size": 4061, - "storage_directory": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-03-16T11:08:04-07:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:20-08:00", - "file_source_id": null, - "filename": "Ca_HVA.mod", - "id": 395337003, - "published_at": "2015-05-14", - "size": 1211, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:05-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:30-08:00", - "file_source_id": null, - "filename": "Ca_LVA.mod", - "id": 395337007, - "published_at": "2015-05-14", - "size": 1069, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:13-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:40-08:00", - "file_source_id": null, - "filename": "CaDynamics.mod", - "id": 395337011, - "published_at": "2015-05-14", - "size": 704, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:20-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:48-08:00", - "file_source_id": null, - "filename": "Ih.mod", - "id": 395337015, - "published_at": "2015-05-14", - "size": 1005, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:27-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:57-08:00", - "file_source_id": null, - "filename": "Im.mod", - "id": 395337019, - "published_at": "2015-05-14", - "size": 859, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:34-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:21-08:00", - "file_source_id": null, - "filename": "Im_v2.mod", - "id": 395337042, - "published_at": "2015-05-14", - "size": 761, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:40-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:29-08:00", - "file_source_id": null, - "filename": "K_P.mod", - "id": 395337046, - "published_at": "2015-05-14", - "size": 1161, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:47-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:42-08:00", - "file_source_id": null, - "filename": "K_T.mod", - "id": 395337050, - "published_at": "2015-05-14", - "size": 1031, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:53-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:02-08:00", - "file_source_id": null, - "filename": "Kd.mod", - "id": 395337054, - "published_at": "2015-05-14", - "size": 705, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:59-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:20-08:00", - "file_source_id": null, - "filename": "Kv3_1.mod", - "id": 395337062, - "published_at": "2015-05-14", - "size": 631, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:13-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:29-08:00", - "file_source_id": null, - "filename": "Nap.mod", - "id": 395337066, - "published_at": "2015-05-14", - "size": 1170, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:19-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:38-08:00", - "file_source_id": null, - "filename": "NaTa.mod", - "id": 395337070, - "published_at": "2015-05-14", - "size": 1413, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:29-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:48:22-08:00", - "file_source_id": null, - "filename": "NaTs.mod", - "id": 395337225, - "published_at": "2015-05-14", - "size": 1267, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:36-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:49:02-08:00", - "file_source_id": null, - "filename": "SK.mod", - "id": 395337293, - "published_at": "2015-05-14", - "size": 942, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:48-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-11-13T13:47:51-08:00", - "file_source_id": null, - "filename": "Kv2like.mod", - "id": 491113425, - "published_at": "2016-03-03", - "size": 1433, - "storage_directory": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-11-13T13:47:51-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "audio/x-mod", - "created_at": "2015-03-16T11:07:34-07:00", - "file_source_id": null, - "filename": "NaV.mod", - "id": 464138096, - "published_at": "2015-05-14", - "size": 4061, - "storage_directory": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-03-16T11:08:04-07:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:20-08:00", - "file_source_id": null, - "filename": "Ca_HVA.mod", - "id": 395337003, - "published_at": "2015-05-14", - "size": 1211, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:05-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:30-08:00", - "file_source_id": null, - "filename": "Ca_LVA.mod", - "id": 395337007, - "published_at": "2015-05-14", - "size": 1069, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:13-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:40-08:00", - "file_source_id": null, - "filename": "CaDynamics.mod", - "id": 395337011, - "published_at": "2015-05-14", - "size": 704, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:20-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:48-08:00", - "file_source_id": null, - "filename": "Ih.mod", - "id": 395337015, - "published_at": "2015-05-14", - "size": 1005, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:27-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:42:57-08:00", - "file_source_id": null, - "filename": "Im.mod", - "id": 395337019, - "published_at": "2015-05-14", - "size": 859, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:34-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:21-08:00", - "file_source_id": null, - "filename": "Im_v2.mod", - "id": 395337042, - "published_at": "2015-05-14", - "size": 761, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:40-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:29-08:00", - "file_source_id": null, - "filename": "K_P.mod", - "id": 395337046, - "published_at": "2015-05-14", - "size": 1161, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:47-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:46:42-08:00", - "file_source_id": null, - "filename": "K_T.mod", - "id": 395337050, - "published_at": "2015-05-14", - "size": 1031, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:53-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:02-08:00", - "file_source_id": null, - "filename": "Kd.mod", - "id": 395337054, - "published_at": "2015-05-14", - "size": 705, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:50:59-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:20-08:00", - "file_source_id": null, - "filename": "Kv3_1.mod", - "id": 395337062, - "published_at": "2015-05-14", - "size": 631, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:13-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:29-08:00", - "file_source_id": null, - "filename": "Nap.mod", - "id": 395337066, - "published_at": "2015-05-14", - "size": 1170, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:19-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:47:38-08:00", - "file_source_id": null, - "filename": "NaTa.mod", - "id": 395337070, - "published_at": "2015-05-14", - "size": 1413, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:29-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:48:22-08:00", - "file_source_id": null, - "filename": "NaTs.mod", - "id": 395337225, - "published_at": "2015-05-14", - "size": 1267, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:36-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - }, - { - "ar_association_key_name": "329230710", - "attachable_id": 305094322, - "attachable_type": "Project", - "content_type": "video/mpeg", - "created_at": "2015-02-27T11:49:02-08:00", - "file_source_id": null, - "filename": "SK.mod", - "id": 395337293, - "published_at": "2015-05-14", - "size": 942, - "storage_directory": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/", - "updated_at": "2015-02-27T11:51:48-08:00", - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "workflow_state": null - } - ] - }, - "neuronal_model_template_id": 329230710, - "specimen": { - "alignment3d_id": 473077597, - "barcode": "0318733871", - "biophysical_model_state": "review_required", - "carousel_well_name": null, - "cell_depth": null, - "cell_prep_id": null, - "cell_reporter_id": 491913822, - "created_at": "2015-01-07T12:12:35-08:00", - "created_by": null, - "data": null, - "donor_id": 318293721, - "ephys_cell_plan_id": 308388019, - "ephys_neural_tissue_plan_id": null, - "ephys_roi_result": { - "blowout_mv": 3.63650708459318, - "created_at": "2015-01-07T12:12:34-08:00", - "electrode_0_pa": -2.87437500016974, - "ephys_qc_criteria": { - "access_resistance_mohm_max": 20.0, - "access_resistance_mohm_min": 1.0, - "blowout_mv_max": 10.0, - "blowout_mv_min": -10.0, - "created_at": "2015-01-29T13:51:29-08:00", - "electrode_0_pa_max": 200.0, - "electrode_0_pa_min": -200.0, - "id": 324256702, - "input_vs_access_resistance_min": 0.15, - "leak_pa_max": 100.0, - "leak_pa_min": -100.0, - "name": "Ephys QC Criteria v1.1", - "post_noise_rms_mv_max": 0.07, - "pre_noise_rms_mv_max": 0.07, - "seal_gohm_min": 1.0, - "slow_noise_rms_mv_max": 0.5, - "updated_at": "2015-01-29T13:51:29-08:00", - "vm_delta_mv_max": 1.0 - }, - "ephys_qc_criteria_id": 324256702, - "ephys_specimen_roi_plan_id": 318696412, - "failed_bad_rs": false, - "failed_clogged_pipette": false, - "failed_electrode_0": false, - "failed_no_seal": null, - "failed_other": null, - "id": 318733869, - "initial_access_resistance_mohm": 12.415662, - "input_access_resistance_ratio": 0.0638893902110391, - "input_resistance_mohm": 194.330576, - "notes": null, - "published_at": "2015-05-13T17:00:00-07:00", - "recording_date": "2015-01-07T03:24:48-08:00", - "rig_name": null, - "seal_gohm": 2.35573504, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-07-08T05:57:54-07:00", - "well_known_files": [ - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "application/octet-stream; charset=binary", - "created_at": "2015-01-07T12:14:58-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.pxp", - "id": 318736730, - "published_at": null, - "size": 2641238729, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-01-07T12:14:58-08:00", - "well_known_file_type": { - "created_at": "2014-07-10T19:36:42-07:00", - "id": 305301981, - "name": "IGOR Output", - "updated_at": "2014-07-10T19:36:42-07:00" - }, - "well_known_file_type_id": 305301981, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "image/tiff; charset=binary", - "created_at": "2015-01-07T12:14:58-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.40x.tif", - "id": 318736732, - "published_at": null, - "size": 2895604, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-01-07T12:14:58-08:00", - "well_known_file_type": { - "created_at": "2014-07-10T19:36:43-07:00", - "id": 305301983, - "name": "Cell Image", - "updated_at": "2014-07-10T19:36:43-07:00" - }, - "well_known_file_type_id": 305301983, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "image/tiff; charset=binary", - "created_at": "2015-01-07T12:14:58-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.40x_patched_bf.tif", - "id": 318736734, - "published_at": null, - "size": 2895604, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-01-07T12:14:58-08:00", - "well_known_file_type": { - "created_at": "2014-11-11T19:23:14-08:00", - "id": 310980879, - "name": "Cell Image: BreakIn Contrast", - "updated_at": "2014-11-11T19:23:14-08:00" - }, - "well_known_file_type_id": 310980879, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "image/tiff; charset=binary", - "created_at": "2015-01-07T12:14:58-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.40x_patched_epi.tif", - "id": 318736736, - "published_at": null, - "size": 2895604, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-01-07T12:14:58-08:00", - "well_known_file_type": { - "created_at": "2014-11-11T19:23:15-08:00", - "id": 310980881, - "name": "Cell Image: BreakIn 565nm", - "updated_at": "2014-11-11T19:23:15-08:00" - }, - "well_known_file_type_id": 310980881, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "image/tiff; charset=binary", - "created_at": "2015-01-07T12:14:58-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.4x.tif", - "id": 318736738, - "published_at": null, - "size": 2895604, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-01-07T12:14:58-08:00", - "well_known_file_type": { - "created_at": "2014-08-14T14:53:07-07:00", - "id": 306905520, - "name": "Low Magnification Image", - "updated_at": "2014-08-14T14:53:07-07:00" - }, - "well_known_file_type_id": 306905520, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "application/x-hdf; charset=binary", - "created_at": "2015-01-07T12:14:58-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.h5", - "id": 318736740, - "published_at": null, - "size": 2643186456, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-01-07T12:14:58-08:00", - "well_known_file_type": { - "created_at": "2014-08-14T14:53:09-07:00", - "id": 306905526, - "name": "HDF5", - "updated_at": "2014-08-14T14:53:09-07:00" - }, - "well_known_file_type_id": 306905526, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "application/json", - "created_at": "2015-07-08T06:55:38-07:00", - "file_source_id": null, - "filename": "318733869_ephys_features.json", - "id": 480630908, - "published_at": null, - "size": null, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-07-08T06:55:38-07:00", - "well_known_file_type_id": null, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "image/png; charset=binary", - "created_at": "2015-10-02T11:03:09-07:00", - "file_source_id": null, - "filename": "morphology_summary.png", - "id": 487660096, - "published_at": "2015-05-14", - "size": 988, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-11-30T20:38:38-08:00", - "well_known_file_type": { - "created_at": "2015-07-09T13:57:28-07:00", - "id": 480715721, - "name": "MorphologyThumbnail", - "updated_at": "2015-07-09T13:57:28-07:00" - }, - "well_known_file_type_id": 480715721, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "image/png; charset=binary", - "created_at": "2015-10-01T14:46:12-07:00", - "file_source_id": null, - "filename": "ephys_summary.png", - "id": 487611469, - "published_at": "2015-05-14", - "size": 9227, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2016-01-29T02:02:59-08:00", - "well_known_file_type": { - "created_at": "2015-07-09T13:58:28-07:00", - "id": 480715749, - "name": "EphysSummaryThumbnail", - "updated_at": "2015-07-09T13:58:28-07:00" - }, - "well_known_file_type_id": 480715749, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "image/png; charset=binary", - "created_at": "2015-11-30T21:30:02-08:00", - "file_source_id": null, - "filename": "ephys_inst_threshold.png", - "id": 491381583, - "published_at": "2015-05-14", - "size": 1477, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2016-01-29T02:02:59-08:00", - "well_known_file_type": { - "created_at": "2015-10-14T10:14:10-07:00", - "id": 488673261, - "name": "EphysInstantaneousThresholdThumbnail", - "updated_at": "2015-10-14T10:14:10-07:00" - }, - "well_known_file_type_id": 488673261, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "application/x-hdf; charset=binary", - "created_at": "2015-01-29T22:38:04-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre;Ai14(IVSCC)-169248.04.02.orca", - "id": 324326353, - "published_at": null, - "size": null, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-01-29T22:38:04-08:00", - "well_known_file_type": { - "created_at": "2014-11-20T19:45:24-08:00", - "id": 311813285, - "name": "ORCA", - "updated_at": "2014-11-20T19:45:24-08:00" - }, - "well_known_file_type_id": 311813285, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "application/x-hdf; charset=binary", - "created_at": "2015-04-28T20:08:07-07:00", - "file_source_id": null, - "filename": "318733869.nwb", - "id": 475693115, - "published_at": null, - "size": null, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-04-28T20:08:07-07:00", - "well_known_file_type": { - "created_at": "2015-04-16T14:09:40-07:00", - "id": 475137571, - "name": "NWB", - "updated_at": "2015-04-16T14:09:40-07:00" - }, - "well_known_file_type_id": 475137571, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "application/x-hdf; charset=binary", - "created_at": "2015-11-16T14:00:58-08:00", - "file_source_id": null, - "filename": "318733869_ephys.nwb", - "id": 491198860, - "published_at": "2015-05-14", - "size": null, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-11-16T14:00:58-08:00", - "well_known_file_type": { - "created_at": "2015-07-14T14:11:16-07:00", - "id": 481007198, - "name": "NWBDownload", - "updated_at": "2015-07-14T14:11:16-07:00" - }, - "well_known_file_type_id": 481007198, - "workflow_state": null - }, - { - "attachable_id": 318733869, - "attachable_type": "EphysRoiResult", - "content_type": "application/x-hdf; charset=binary", - "created_at": "2015-11-16T14:00:58-08:00", - "file_source_id": null, - "filename": "318733869_uncompressed.nwb", - "id": 491198863, - "published_at": "2015-05-14", - "size": null, - "storage_directory": "/projects/mousecelltypes/vol1/prod128/Ephys_Specimen_Roi_plan_318733869/", - "updated_at": "2015-11-16T14:00:58-08:00", - "well_known_file_type": { - "created_at": "2015-06-09T15:21:33-07:00", - "id": 478840678, - "name": "NWBUncompressed", - "updated_at": "2015-06-09T15:21:33-07:00" - }, - "well_known_file_type_id": 478840678, - "workflow_state": null - } - ], - "workflow_state": "manual_passed" - }, - "ephys_roi_result_id": 318733869, - "ephys_sweeps": [ - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[7]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338141, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338141, - "ephys_sweep_tags": [], - "id": 396323610, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0356589965522289, - "post_vm_mv": -73.690673828125, - "pre_noise_rms_mv": 0.0380660705268383, - "pre_vm_mv": -73.6825790405273, - "slow_noise_rms_mv": 0.181937232613564, - "slow_vm_mv": -73.6825790405273, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.072995, - "stimulus_interval": 0.035, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 87, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.00809478759765625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[6]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338137, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338137, - "ephys_sweep_tags": [], - "id": 396323608, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0338849276304245, - "post_vm_mv": -73.9566116333008, - "pre_noise_rms_mv": 0.0396845452487469, - "pre_vm_mv": -74.0519638061523, - "slow_noise_rms_mv": 0.18243981897831, - "slow_vm_mv": -74.0519638061523, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.064995, - "stimulus_interval": 0.031, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 86, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0953521728515625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[5]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338131, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338131, - "ephys_sweep_tags": [], - "id": 396323606, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0375229977071285, - "post_vm_mv": -73.8176422119141, - "pre_noise_rms_mv": 0.0395662672817707, - "pre_vm_mv": -73.6396636962891, - "slow_noise_rms_mv": 0.279655814170837, - "slow_vm_mv": -73.6396636962891, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.056995, - "stimulus_interval": 0.027, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 85, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.177978515625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[6]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338137, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338137, - "ephys_sweep_tags": [], - "id": 396323584, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0425188019871712, - "post_vm_mv": -73.2127685546875, - "pre_noise_rms_mv": 0.0361235067248344, - "pre_vm_mv": -73.4286575317383, - "slow_noise_rms_mv": 0.178375139832497, - "slow_vm_mv": -73.4286575317383, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.064995, - "stimulus_interval": 0.031, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 78, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.215888977050781, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[5]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338131, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338131, - "ephys_sweep_tags": [], - "id": 396323582, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0382817052304745, - "post_vm_mv": -73.6458282470703, - "pre_noise_rms_mv": 0.0396089442074299, - "pre_vm_mv": -73.4182739257812, - "slow_noise_rms_mv": 0.228058248758316, - "slow_vm_mv": -73.4182739257812, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.056995, - "stimulus_interval": 0.027, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 77, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.227554321289062, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[4]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338127, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338127, - "ephys_sweep_tags": [], - "id": 396323580, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0367705412209034, - "post_vm_mv": -73.3423385620117, - "pre_noise_rms_mv": 0.0410844683647156, - "pre_vm_mv": -73.2242660522461, - "slow_noise_rms_mv": 0.295760065317154, - "slow_vm_mv": -73.2242660522461, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.048995, - "stimulus_interval": 0.023, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 76, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.118072509765625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[3]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338123, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338123, - "ephys_sweep_tags": [], - "id": 396323577, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0412763878703117, - "post_vm_mv": -73.5490570068359, - "pre_noise_rms_mv": 0.0366058796644211, - "pre_vm_mv": -73.0638885498047, - "slow_noise_rms_mv": 0.171120792627335, - "slow_vm_mv": -73.0638885498047, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.040995, - "stimulus_interval": 0.019, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 75, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.48516845703125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[2]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338119, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338119, - "ephys_sweep_tags": [], - "id": 396323573, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0449937023222446, - "post_vm_mv": -73.4591293334961, - "pre_noise_rms_mv": 0.0359138548374176, - "pre_vm_mv": -73.5854873657227, - "slow_noise_rms_mv": 0.337626546621323, - "slow_vm_mv": -73.5854873657227, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.032995, - "stimulus_interval": 0.015, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 74, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.126358032226562, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[1]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338115, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338115, - "ephys_sweep_tags": [], - "id": 396323570, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0407821051776409, - "post_vm_mv": -73.443000793457, - "pre_noise_rms_mv": 0.050120122730732, - "pre_vm_mv": -73.2168655395508, - "slow_noise_rms_mv": 0.144578456878662, - "slow_vm_mv": -73.2168655395508, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.024995, - "stimulus_interval": 0.011, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 73, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.22613525390625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:15-08:00", - "description": "C2SSTRIPLE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338111, - "updated_at": "2015-01-29T22:53:15-08:00" - }, - "ephys_stimulus_id": 324338111, - "ephys_sweep_tags": [], - "id": 396323568, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0424049384891987, - "post_vm_mv": -73.3690872192383, - "pre_noise_rms_mv": 0.040862325578928, - "pre_vm_mv": -73.4466323852539, - "slow_noise_rms_mv": 0.147407010197639, - "slow_vm_mv": -73.4466323852539, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.016995, - "stimulus_interval": 0.007, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 72, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.077545166015625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[7]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338141, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338141, - "ephys_sweep_tags": [], - "id": 396323566, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0450072474777699, - "post_vm_mv": -73.5418701171875, - "pre_noise_rms_mv": 0.0406083464622498, - "pre_vm_mv": -73.3598327636719, - "slow_noise_rms_mv": 0.273215651512146, - "slow_vm_mv": -73.3598327636719, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.072995, - "stimulus_interval": 0.035, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 71, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.182037353515625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[6]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338137, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338137, - "ephys_sweep_tags": [], - "id": 396323564, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0368791185319424, - "post_vm_mv": -73.338981628418, - "pre_noise_rms_mv": 0.0398431569337845, - "pre_vm_mv": -73.1990432739258, - "slow_noise_rms_mv": 0.220605164766312, - "slow_vm_mv": -73.1990432739258, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.064995, - "stimulus_interval": 0.031, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 70, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.139938354492188, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[5]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338131, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338131, - "ephys_sweep_tags": [], - "id": 396323558, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0424865819513798, - "post_vm_mv": -73.4840774536133, - "pre_noise_rms_mv": 0.0386396385729313, - "pre_vm_mv": -73.3247375488281, - "slow_noise_rms_mv": 0.158759966492653, - "slow_vm_mv": -73.3247375488281, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.056995, - "stimulus_interval": 0.027, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 69, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.159339904785156, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[4]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338127, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338127, - "ephys_sweep_tags": [], - "id": 396323556, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0348531827330589, - "post_vm_mv": -73.8137969970703, - "pre_noise_rms_mv": 0.0357643850147724, - "pre_vm_mv": -73.6382293701172, - "slow_noise_rms_mv": 0.243798926472664, - "slow_vm_mv": -73.6382293701172, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.048995, - "stimulus_interval": 0.023, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 68, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.175567626953125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:18:36-08:00", - "description": "C2NSRMPRHE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305829, - "name": "Ramp to Rheobase", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305829, - "id": 324321519, - "updated_at": "2015-01-29T22:18:36-08:00" - }, - "ephys_stimulus_id": 324321519, - "ephys_sweep_tags": [], - "id": 396323540, - "leak_pa": -12.028151512146, - "num_spikes": 59, - "peak_deflection": null, - "post_noise_rms_mv": 0.0456047654151917, - "post_vm_mv": -74.8246002197266, - "pre_noise_rms_mv": 0.0413780510425568, - "pre_vm_mv": -73.5059814453125, - "slow_noise_rms_mv": 0.223160579800606, - "slow_vm_mv": -73.5059814453125, - "specimen_id": 318733871, - "stimulus_amplitude": 255.750004507505, - "stimulus_duration": 29.999975, - "stimulus_interval": 0.0, - "stimulus_start_time": 2.02002, - "stimulus_units": "Amps", - "sweep_number": 62, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 1.31861877441406, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:18:36-08:00", - "description": "C2NSRMPRHE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305829, - "name": "Ramp to Rheobase", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305829, - "id": 324321519, - "updated_at": "2015-01-29T22:18:36-08:00" - }, - "ephys_stimulus_id": 324321519, - "ephys_sweep_tags": [], - "id": 396323513, - "leak_pa": -14.9712104797363, - "num_spikes": 80, - "peak_deflection": null, - "post_noise_rms_mv": 0.0416221991181374, - "post_vm_mv": -74.8126831054688, - "pre_noise_rms_mv": 0.0385609716176987, - "pre_vm_mv": -72.8345184326172, - "slow_noise_rms_mv": 0.207559898495674, - "slow_vm_mv": -72.8345184326172, - "specimen_id": 318733871, - "stimulus_amplitude": 255.750004507505, - "stimulus_duration": 29.999975, - "stimulus_interval": 0.0, - "stimulus_start_time": 2.02002, - "stimulus_units": "Amps", - "sweep_number": 61, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 1.97816467285156, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.8, - "created_at": "2015-01-29T22:13:02-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324318810, - "updated_at": "2015-01-29T22:13:02-08:00" - }, - "ephys_stimulus_id": 324318810, - "ephys_sweep_tags": [], - "id": 396323510, - "leak_pa": -9.98080635070801, - "num_spikes": 16, - "peak_deflection": null, - "post_noise_rms_mv": 0.0378606133162975, - "post_vm_mv": -73.6508865356445, - "pre_noise_rms_mv": 0.0414417758584023, - "pre_vm_mv": -72.4496307373047, - "slow_noise_rms_mv": 0.236516460776329, - "slow_vm_mv": -72.4496307373047, - "specimen_id": 318733871, - "stimulus_amplitude": 180.000001015479, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 60, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 1.20125579833984, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:09-08:00", - "description": "C1RP25PR1S141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305749, - "name": "Ramp", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305749, - "id": 324305751, - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_id": 324305751, - "ephys_sweep_tags": [], - "id": 396323508, - "leak_pa": 0.0, - "num_spikes": 17, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0400054045021534, - "pre_vm_mv": -72.8523635864258, - "slow_noise_rms_mv": 0.152621924877167, - "slow_vm_mv": -72.8523635864258, - "specimen_id": 318733871, - "stimulus_amplitude": 800.000010681146, - "stimulus_duration": 31.997495, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.0225, - "stimulus_units": "Amps", - "sweep_number": 6, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.8, - "created_at": "2015-01-29T22:13:02-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324318810, - "updated_at": "2015-01-29T22:13:02-08:00" - }, - "ephys_stimulus_id": 324318810, - "ephys_sweep_tags": [], - "id": 396323506, - "leak_pa": -12.028151512146, - "num_spikes": 13, - "peak_deflection": null, - "post_noise_rms_mv": 0.0390940234065056, - "post_vm_mv": -73.9824295043945, - "pre_noise_rms_mv": 0.0369674041867256, - "pre_vm_mv": -73.267463684082, - "slow_noise_rms_mv": 0.177908077836037, - "slow_vm_mv": -73.267463684082, - "specimen_id": 318733871, - "stimulus_amplitude": 180.000001015479, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 59, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.7149658203125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.8, - "created_at": "2015-01-29T22:13:02-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324318810, - "updated_at": "2015-01-29T22:13:02-08:00" - }, - "ephys_stimulus_id": 324318810, - "ephys_sweep_tags": [], - "id": 396323504, - "leak_pa": -14.9712104797363, - "num_spikes": 14, - "peak_deflection": null, - "post_noise_rms_mv": 0.0380340926349163, - "post_vm_mv": -74.5748748779297, - "pre_noise_rms_mv": 0.0393643826246262, - "pre_vm_mv": -73.4411468505859, - "slow_noise_rms_mv": 0.236093729734421, - "slow_vm_mv": -73.4411468505859, - "specimen_id": 318733871, - "stimulus_amplitude": 180.000001015479, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 58, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 1.13372802734375, - "workflow_state": "auto_failed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.4, - "created_at": "2015-01-29T22:13:02-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324318800, - "updated_at": "2015-01-29T22:13:02-08:00" - }, - "ephys_stimulus_id": 324318800, - "ephys_sweep_tags": [], - "id": 396323501, - "leak_pa": -14.9712104797363, - "num_spikes": 7, - "peak_deflection": null, - "post_noise_rms_mv": 0.0387220717966557, - "post_vm_mv": -74.2508087158203, - "pre_noise_rms_mv": 0.0425904989242554, - "pre_vm_mv": -73.5337600708008, - "slow_noise_rms_mv": 0.274801641702652, - "slow_vm_mv": -73.5337600708008, - "specimen_id": 318733871, - "stimulus_amplitude": 139.999997705864, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 57, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.717048645019531, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.4, - "created_at": "2015-01-29T22:13:02-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324318800, - "updated_at": "2015-01-29T22:13:02-08:00" - }, - "ephys_stimulus_id": 324318800, - "ephys_sweep_tags": [], - "id": 396323497, - "leak_pa": -14.9712104797363, - "num_spikes": 7, - "peak_deflection": null, - "post_noise_rms_mv": 0.0402530431747437, - "post_vm_mv": -74.1909713745117, - "pre_noise_rms_mv": 0.0405836701393127, - "pre_vm_mv": -73.9143676757812, - "slow_noise_rms_mv": 0.143637120723724, - "slow_vm_mv": -73.9143676757812, - "specimen_id": 318733871, - "stimulus_amplitude": 139.999997705864, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 56, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.276603698730469, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.4, - "created_at": "2015-01-29T22:13:02-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324318800, - "updated_at": "2015-01-29T22:13:02-08:00" - }, - "ephys_stimulus_id": 324318800, - "ephys_sweep_tags": [], - "id": 396323494, - "leak_pa": -14.9712104797363, - "num_spikes": 6, - "peak_deflection": null, - "post_noise_rms_mv": 0.0446703843772411, - "post_vm_mv": -74.1566619873047, - "pre_noise_rms_mv": 0.0386499427258968, - "pre_vm_mv": -73.4279251098633, - "slow_noise_rms_mv": 0.285361737012863, - "slow_vm_mv": -73.4279251098633, - "specimen_id": 318733871, - "stimulus_amplitude": 139.999997705864, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 55, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.728736877441406, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:13:24-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324320270, - "updated_at": "2015-01-29T22:13:24-08:00" - }, - "ephys_stimulus_id": 324320270, - "ephys_sweep_tags": [], - "id": 396323492, - "leak_pa": -14.9712104797363, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0452239476144314, - "post_vm_mv": -73.4174270629883, - "pre_noise_rms_mv": 0.044888649135828, - "pre_vm_mv": -72.06005859375, - "slow_noise_rms_mv": 0.587946355342865, - "slow_vm_mv": -72.06005859375, - "specimen_id": 318733871, - "stimulus_amplitude": 100.000001335143, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 54, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.35736846923828, - "workflow_state": "auto_failed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:13:24-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324320270, - "updated_at": "2015-01-29T22:13:24-08:00" - }, - "ephys_stimulus_id": 324320270, - "ephys_sweep_tags": [], - "id": 396323490, - "leak_pa": -14.9712104797363, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.039005272090435, - "post_vm_mv": -73.7748794555664, - "pre_noise_rms_mv": 0.0346203036606312, - "pre_vm_mv": -73.50634765625, - "slow_noise_rms_mv": 0.164012134075165, - "slow_vm_mv": -73.50634765625, - "specimen_id": 318733871, - "stimulus_amplitude": 100.000001335143, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 53, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.268531799316406, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:13:24-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324320270, - "updated_at": "2015-01-29T22:13:24-08:00" - }, - "ephys_stimulus_id": 324320270, - "ephys_sweep_tags": [], - "id": 396323488, - "leak_pa": -14.9712104797363, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0385660864412785, - "post_vm_mv": -73.2594223022461, - "pre_noise_rms_mv": 0.0388743877410889, - "pre_vm_mv": -72.9849166870117, - "slow_noise_rms_mv": 0.202888786792755, - "slow_vm_mv": -72.9849166870117, - "specimen_id": 318733871, - "stimulus_amplitude": 100.000001335143, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 52, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.274505615234375, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:09-08:00", - "description": "C1RP25PR1S141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305749, - "name": "Ramp", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305749, - "id": 324305751, - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_id": 324305751, - "ephys_sweep_tags": [], - "id": 396323480, - "leak_pa": 0.0, - "num_spikes": 8, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0415542982518673, - "pre_vm_mv": -73.3303985595703, - "slow_noise_rms_mv": 0.0891085341572762, - "slow_vm_mv": -73.3303985595703, - "specimen_id": 318733871, - "stimulus_amplitude": 800.000010681146, - "stimulus_duration": 31.997495, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.0225, - "stimulus_units": "Amps", - "sweep_number": 5, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:03:09-08:00", - "description": "C1NSSEED_2141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305777, - "name": "Noise 2", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305777, - "id": 324312198, - "updated_at": "2015-01-29T22:03:09-08:00" - }, - "ephys_stimulus_id": 324312198, - "ephys_sweep_tags": [], - "id": 396323475, - "leak_pa": -12.028151512146, - "num_spikes": 23, - "peak_deflection": null, - "post_noise_rms_mv": 0.037276167422533, - "post_vm_mv": -74.3984375, - "pre_noise_rms_mv": 0.0387932918965816, - "pre_vm_mv": -73.5012130737305, - "slow_noise_rms_mv": 0.178911685943604, - "slow_vm_mv": -73.5012130737305, - "specimen_id": 318733871, - "stimulus_amplitude": 212.249995357183, - "stimulus_duration": 18.999995, - "stimulus_interval": 8.0, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 48, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.897224426269531, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:03:09-08:00", - "description": "C1NSSEED_1141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305771, - "name": "Noise 1", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305771, - "id": 324312194, - "updated_at": "2015-01-29T22:03:09-08:00" - }, - "ephys_stimulus_id": 324312194, - "ephys_sweep_tags": [], - "id": 396323471, - "leak_pa": -12.028151512146, - "num_spikes": 26, - "peak_deflection": null, - "post_noise_rms_mv": 0.0358653254806995, - "post_vm_mv": -73.3166122436523, - "pre_noise_rms_mv": 0.0393880866467953, - "pre_vm_mv": -72.8331680297852, - "slow_noise_rms_mv": 0.148469358682632, - "slow_vm_mv": -72.8331680297852, - "specimen_id": 318733871, - "stimulus_amplitude": 208.62500615948, - "stimulus_duration": 18.999995, - "stimulus_interval": 8.0, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 47, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.483444213867188, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:03:09-08:00", - "description": "C1NSSEED_2141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305777, - "name": "Noise 2", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305777, - "id": 324312198, - "updated_at": "2015-01-29T22:03:09-08:00" - }, - "ephys_stimulus_id": 324312198, - "ephys_sweep_tags": [], - "id": 396323468, - "leak_pa": -14.0115156173706, - "num_spikes": 25, - "peak_deflection": null, - "post_noise_rms_mv": 0.040932834148407, - "post_vm_mv": -74.2956924438477, - "pre_noise_rms_mv": 0.0322319604456425, - "pre_vm_mv": -72.9757995605469, - "slow_noise_rms_mv": 0.173675671219826, - "slow_vm_mv": -72.9757995605469, - "specimen_id": 318733871, - "stimulus_amplitude": 212.249995357183, - "stimulus_duration": 18.999995, - "stimulus_interval": 8.0, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 46, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.31989288330078, - "workflow_state": "auto_failed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:03:09-08:00", - "description": "C1NSSEED_1141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305771, - "name": "Noise 1", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305771, - "id": 324312194, - "updated_at": "2015-01-29T22:03:09-08:00" - }, - "ephys_stimulus_id": 324312194, - "ephys_sweep_tags": [], - "id": 396323466, - "leak_pa": -14.0115156173706, - "num_spikes": 23, - "peak_deflection": null, - "post_noise_rms_mv": 0.0391243994235992, - "post_vm_mv": -73.6055221557617, - "pre_noise_rms_mv": 0.0382960624992847, - "pre_vm_mv": -73.330451965332, - "slow_noise_rms_mv": 0.197248265147209, - "slow_vm_mv": -73.330451965332, - "specimen_id": 318733871, - "stimulus_amplitude": 208.62500615948, - "stimulus_duration": 18.999995, - "stimulus_interval": 8.0, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 45, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.275070190429688, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:03:09-08:00", - "description": "C1NSSEED_2141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305777, - "name": "Noise 2", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305777, - "id": 324312198, - "updated_at": "2015-01-29T22:03:09-08:00" - }, - "ephys_stimulus_id": 324312198, - "ephys_sweep_tags": [], - "id": 396323464, - "leak_pa": -14.0115156173706, - "num_spikes": 31, - "peak_deflection": null, - "post_noise_rms_mv": 0.0463137738406658, - "post_vm_mv": -72.9353485107422, - "pre_noise_rms_mv": 0.036839384585619, - "pre_vm_mv": -73.1283111572266, - "slow_noise_rms_mv": 0.166697889566422, - "slow_vm_mv": -73.1283111572266, - "specimen_id": 318733871, - "stimulus_amplitude": 212.249995357183, - "stimulus_duration": 18.999995, - "stimulus_interval": 8.0, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 44, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.192962646484375, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:03:09-08:00", - "description": "C1NSSEED_1141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305771, - "name": "Noise 1", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305771, - "id": 324312194, - "updated_at": "2015-01-29T22:03:09-08:00" - }, - "ephys_stimulus_id": 324312194, - "ephys_sweep_tags": [], - "id": 396323462, - "leak_pa": -14.0115156173706, - "num_spikes": 32, - "peak_deflection": null, - "post_noise_rms_mv": 0.0393371880054474, - "post_vm_mv": -73.7409057617188, - "pre_noise_rms_mv": 0.0401734113693237, - "pre_vm_mv": -73.3647308349609, - "slow_noise_rms_mv": 0.203217536211014, - "slow_vm_mv": -73.3647308349609, - "specimen_id": 318733871, - "stimulus_amplitude": 208.62500615948, - "stimulus_duration": 18.999995, - "stimulus_interval": 8.0, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 43, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.376174926757812, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:18:33-08:00", - "description": "C1LSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324321353, - "updated_at": "2015-01-29T22:18:33-08:00" - }, - "ephys_stimulus_id": 324321353, - "ephys_sweep_tags": [], - "id": 396323459, - "leak_pa": -12.028151512146, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0324449688196182, - "post_vm_mv": -72.5376968383789, - "pre_noise_rms_mv": 0.0383681282401085, - "pre_vm_mv": -72.81201171875, - "slow_noise_rms_mv": 0.204954192042351, - "slow_vm_mv": -72.81201171875, - "specimen_id": 318733871, - "stimulus_amplitude": 90.0000005077395, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 42, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.274314880371094, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:07-08:00", - "description": "C1LSCOARSE141203[13]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310907, - "updated_at": "2015-01-29T21:58:07-08:00" - }, - "ephys_stimulus_id": 324310907, - "ephys_sweep_tags": [], - "id": 396323441, - "leak_pa": -7.99744129180908, - "num_spikes": 18, - "peak_deflection": null, - "post_noise_rms_mv": 0.0342174433171749, - "post_vm_mv": -72.9227523803711, - "pre_noise_rms_mv": 0.0359137654304504, - "pre_vm_mv": -72.2949981689453, - "slow_noise_rms_mv": 0.146864429116249, - "slow_vm_mv": -72.2949981689453, - "specimen_id": 318733871, - "stimulus_amplitude": 149.999998533268, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 35, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.627754211425781, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:07-08:00", - "description": "C1LSCOARSE141203[12]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310903, - "updated_at": "2015-01-29T21:58:07-08:00" - }, - "ephys_stimulus_id": 324310903, - "ephys_sweep_tags": [], - "id": 396323439, - "leak_pa": -7.99744129180908, - "num_spikes": 14, - "peak_deflection": null, - "post_noise_rms_mv": 0.0305392686277628, - "post_vm_mv": -72.4750366210938, - "pre_noise_rms_mv": 0.04054119810462, - "pre_vm_mv": -72.5203247070312, - "slow_noise_rms_mv": 0.177269637584686, - "slow_vm_mv": -72.5203247070312, - "specimen_id": 318733871, - "stimulus_amplitude": 129.99999687846, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 34, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.0452880859375, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[11]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310899, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310899, - "ephys_sweep_tags": [], - "id": 396323437, - "leak_pa": -7.99744129180908, - "num_spikes": 10, - "peak_deflection": null, - "post_noise_rms_mv": 0.0409046038985252, - "post_vm_mv": -72.9968566894531, - "pre_noise_rms_mv": 0.0379738472402096, - "pre_vm_mv": -73.0722732543945, - "slow_noise_rms_mv": 0.136501178145409, - "slow_vm_mv": -73.0722732543945, - "specimen_id": 318733871, - "stimulus_amplitude": 110.000002162547, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 33, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.0754165649414062, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[10]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310891, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310891, - "ephys_sweep_tags": [], - "id": 396323435, - "leak_pa": -7.99744129180908, - "num_spikes": 4, - "peak_deflection": null, - "post_noise_rms_mv": 0.0394844189286232, - "post_vm_mv": -72.8281784057617, - "pre_noise_rms_mv": 0.0399150885641575, - "pre_vm_mv": -72.929557800293, - "slow_noise_rms_mv": 0.221334338188171, - "slow_vm_mv": -72.929557800293, - "specimen_id": 318733871, - "stimulus_amplitude": 90.0000005077395, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 32, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.10137939453125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[9]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310887, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310887, - "ephys_sweep_tags": [], - "id": 396323433, - "leak_pa": -4.990403175354, - "num_spikes": 2, - "peak_deflection": null, - "post_noise_rms_mv": 0.038056381046772, - "post_vm_mv": -71.3184967041016, - "pre_noise_rms_mv": 0.039063710719347, - "pre_vm_mv": -71.836311340332, - "slow_noise_rms_mv": 0.288136333227158, - "slow_vm_mv": -71.836311340332, - "specimen_id": 318733871, - "stimulus_amplitude": 69.9999988529321, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 31, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.517814636230469, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310797, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310797, - "ephys_sweep_tags": [], - "id": 396323380, - "leak_pa": -4.990403175354, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0418095923960209, - "post_vm_mv": -70.9423675537109, - "pre_noise_rms_mv": 0.0406226739287376, - "pre_vm_mv": -72.5032501220703, - "slow_noise_rms_mv": 0.300107926130295, - "slow_vm_mv": -72.5032501220703, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 20, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.56088256835938, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310797, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310797, - "ephys_sweep_tags": [], - "id": 396323375, - "leak_pa": -4.990403175354, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0419786125421524, - "post_vm_mv": -70.9460601806641, - "pre_noise_rms_mv": 0.0391221158206463, - "pre_vm_mv": -72.9047927856445, - "slow_noise_rms_mv": 0.138547375798225, - "slow_vm_mv": -72.9047927856445, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 19, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.95873260498047, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSCOARSE141203[5]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310725, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310725, - "ephys_sweep_tags": [], - "id": 396323356, - "leak_pa": -1.9833652973175, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0374195724725723, - "post_vm_mv": -71.2353363037109, - "pre_noise_rms_mv": 0.0365947894752026, - "pre_vm_mv": -72.5235977172852, - "slow_noise_rms_mv": 0.45252200961113, - "slow_vm_mv": -72.5235977172852, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 12, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.28826141357422, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.6, - "created_at": "2015-01-29T22:39:35-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324331247, - "updated_at": "2015-01-29T22:39:35-08:00" - }, - "ephys_stimulus_id": 324331247, - "ephys_sweep_tags": [], - "id": 396323338, - "leak_pa": -39.9872055053711, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0446453168988228, - "post_vm_mv": -79.0671920776367, - "pre_noise_rms_mv": 0.0347333513200283, - "pre_vm_mv": -80.5915985107422, - "slow_noise_rms_mv": 0.0647063180804253, - "slow_vm_mv": -80.5915985107422, - "specimen_id": 318733871, - "stimulus_amplitude": 659.999999097494, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 101, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.52440643310547, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.6, - "created_at": "2015-01-29T22:39:35-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324331247, - "updated_at": "2015-01-29T22:39:35-08:00" - }, - "ephys_stimulus_id": 324331247, - "ephys_sweep_tags": [], - "id": 396323336, - "leak_pa": -39.9872055053711, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0389018692076206, - "post_vm_mv": -79.1583862304688, - "pre_noise_rms_mv": 0.0407516062259674, - "pre_vm_mv": -80.5845718383789, - "slow_noise_rms_mv": 0.0986397936940193, - "slow_vm_mv": -80.5845718383789, - "specimen_id": 318733871, - "stimulus_amplitude": 659.999999097494, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 100, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.42618560791016, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:03:11-08:00", - "description": "C2SSHM80CS141203[6]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324312332, - "updated_at": "2015-01-29T22:03:11-08:00" - }, - "ephys_stimulus_id": 324312332, - "ephys_sweep_tags": [], - "id": 396323638, - "leak_pa": -38.0038414001465, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0389880537986755, - "post_vm_mv": -78.6123733520508, - "pre_noise_rms_mv": 0.0441122837364674, - "pre_vm_mv": -80.0253067016602, - "slow_noise_rms_mv": 0.094309464097023, - "slow_vm_mv": -80.0253067016602, - "specimen_id": 318733871, - "stimulus_amplitude": 700.000002407108, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 94, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.41293334960938, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:03:11-08:00", - "description": "C2SSHM80CS141203[5]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324312328, - "updated_at": "2015-01-29T22:03:11-08:00" - }, - "ephys_stimulus_id": 324312328, - "ephys_sweep_tags": [], - "id": 396323629, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0430155098438263, - "post_vm_mv": -79.0539321899414, - "pre_noise_rms_mv": 0.0329440385103226, - "pre_vm_mv": -80.0455932617188, - "slow_noise_rms_mv": 0.122686624526978, - "slow_vm_mv": -80.0455932617188, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 93, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.991661071777344, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:03:11-08:00", - "description": "C2SSHM80CS141203[4]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324312324, - "updated_at": "2015-01-29T22:03:11-08:00" - }, - "ephys_stimulus_id": 324312324, - "ephys_sweep_tags": [], - "id": 396323626, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0356684438884258, - "post_vm_mv": -79.3998413085938, - "pre_noise_rms_mv": 0.0402687676250935, - "pre_vm_mv": -80.3027191162109, - "slow_noise_rms_mv": 0.115302167832851, - "slow_vm_mv": -80.3027191162109, - "specimen_id": 318733871, - "stimulus_amplitude": 499.999985859034, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 92, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.902877807617188, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:03:11-08:00", - "description": "C2SSHM80CS141203[3]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324312320, - "updated_at": "2015-01-29T22:03:11-08:00" - }, - "ephys_stimulus_id": 324312320, - "ephys_sweep_tags": [], - "id": 396323622, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0391330868005753, - "post_vm_mv": -79.5965576171875, - "pre_noise_rms_mv": 0.0413624010980129, - "pre_vm_mv": -80.125602722168, - "slow_noise_rms_mv": 0.107317678630352, - "slow_vm_mv": -80.125602722168, - "specimen_id": 318733871, - "stimulus_amplitude": 400.000005340573, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 91, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.529045104980469, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:03:11-08:00", - "description": "C2SSHM80CS141203[2]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324312316, - "updated_at": "2015-01-29T22:03:11-08:00" - }, - "ephys_stimulus_id": 324312316, - "ephys_sweep_tags": [], - "id": 396323620, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0377324000000954, - "post_vm_mv": -79.911735534668, - "pre_noise_rms_mv": 0.0349041931331158, - "pre_vm_mv": -80.4060821533203, - "slow_noise_rms_mv": 0.0945140942931175, - "slow_vm_mv": -80.4060821533203, - "specimen_id": 318733871, - "stimulus_amplitude": 299.999997066536, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 90, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.494346618652344, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:07-08:00", - "description": "C1SSCOARSE141203[2]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310977, - "updated_at": "2015-01-29T21:58:07-08:00" - }, - "ephys_stimulus_id": 324310977, - "ephys_sweep_tags": [], - "id": 396323618, - "leak_pa": -1.9833652973175, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0408011488616467, - "post_vm_mv": -73.0553512573242, - "pre_noise_rms_mv": 0.0391559898853302, - "pre_vm_mv": -74.0001449584961, - "slow_noise_rms_mv": 0.120690539479256, - "slow_vm_mv": -74.0001449584961, - "specimen_id": 318733871, - "stimulus_amplitude": 299.999997066536, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 9, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.944793701171875, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:03:11-08:00", - "description": "C2SSHM80CS141203[1]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324312312, - "updated_at": "2015-01-29T22:03:11-08:00" - }, - "ephys_stimulus_id": 324312312, - "ephys_sweep_tags": [], - "id": 396323616, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0408409088850021, - "post_vm_mv": -80.1303558349609, - "pre_noise_rms_mv": 0.0355650298297405, - "pre_vm_mv": -80.3894729614258, - "slow_noise_rms_mv": 0.11452279984951, - "slow_vm_mv": -80.3894729614258, - "specimen_id": 318733871, - "stimulus_amplitude": 200.000002670286, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 89, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.259117126464844, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:03:11-08:00", - "description": "C2SSHM80CS141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324312308, - "updated_at": "2015-01-29T22:03:11-08:00" - }, - "ephys_stimulus_id": 324312308, - "ephys_sweep_tags": [], - "id": 396323614, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0406179688870907, - "post_vm_mv": -80.2863159179688, - "pre_noise_rms_mv": 0.0393210723996162, - "pre_vm_mv": -80.4844284057617, - "slow_noise_rms_mv": 0.0890119299292564, - "slow_vm_mv": -80.4844284057617, - "specimen_id": 318733871, - "stimulus_amplitude": 100.000001335143, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 88, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.198112487792969, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:07-08:00", - "description": "C1SSCOARSE141203[1]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310939, - "updated_at": "2015-01-29T21:58:07-08:00" - }, - "ephys_stimulus_id": 324310939, - "ephys_sweep_tags": [], - "id": 396323590, - "leak_pa": -1.9833652973175, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0383650623261929, - "post_vm_mv": -73.1851806640625, - "pre_noise_rms_mv": 0.0382653698325157, - "pre_vm_mv": -73.8074264526367, - "slow_noise_rms_mv": 0.151183858513832, - "slow_vm_mv": -73.8074264526367, - "specimen_id": 318733871, - "stimulus_amplitude": 200.000002670286, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 8, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.622245788574219, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1SSCOARSE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310895, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310895, - "ephys_sweep_tags": [], - "id": 396323561, - "leak_pa": -1.9833652973175, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0413788892328739, - "post_vm_mv": -73.5245513916016, - "pre_noise_rms_mv": 0.0370076186954975, - "pre_vm_mv": -73.7009048461914, - "slow_noise_rms_mv": 0.159169092774391, - "slow_vm_mv": -73.7009048461914, - "specimen_id": 318733871, - "stimulus_amplitude": 100.000001335143, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 7, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.176353454589844, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 0.9, - "created_at": "2015-01-29T22:03:10-08:00", - "description": "C2SQRHELNG141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305801, - "name": "Square - 2s Suprathreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305801, - "id": 324312282, - "updated_at": "2015-01-29T22:03:10-08:00" - }, - "ephys_stimulus_id": 324312282, - "ephys_sweep_tags": [], - "id": 396323484, - "leak_pa": -14.9712104797363, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0418485626578331, - "post_vm_mv": -72.9245529174805, - "pre_noise_rms_mv": 0.0361919216811657, - "pre_vm_mv": -73.2862548828125, - "slow_noise_rms_mv": 0.257177621126175, - "slow_vm_mv": -73.2862548828125, - "specimen_id": 318733871, - "stimulus_amplitude": 90.0000005077395, - "stimulus_duration": 1.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 51, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.361701965332031, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:10-08:00", - "description": "C1SQCAPCHK141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305793, - "name": "Square - 0.5ms Subthreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305793, - "id": 324305795, - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_id": 324305795, - "ephys_sweep_tags": [], - "id": 396323482, - "leak_pa": -12.9878444671631, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0411632247269154, - "post_vm_mv": -72.7104568481445, - "pre_noise_rms_mv": 0.0371528267860413, - "pre_vm_mv": -72.659553527832, - "slow_noise_rms_mv": 0.483349621295929, - "slow_vm_mv": -72.659553527832, - "specimen_id": 318733871, - "stimulus_amplitude": -200.000002670286, - "stimulus_duration": 7.218495, - "stimulus_interval": 0.2005, - "stimulus_start_time": 0.8215, - "stimulus_units": "Amps", - "sweep_number": 50, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.0509033203125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:10-08:00", - "description": "C1SQCAPCHK141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305793, - "name": "Square - 0.5ms Subthreshold", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305793, - "id": 324305795, - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_id": 324305795, - "ephys_sweep_tags": [], - "id": 396323478, - "leak_pa": -9.98080635070801, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0388185605406761, - "post_vm_mv": -72.0395355224609, - "pre_noise_rms_mv": 0.0417257361114025, - "pre_vm_mv": -72.4330215454102, - "slow_noise_rms_mv": 0.372666418552399, - "slow_vm_mv": -72.4330215454102, - "specimen_id": 318733871, - "stimulus_amplitude": -200.000002670286, - "stimulus_duration": 7.218495, - "stimulus_interval": 0.2005, - "stimulus_start_time": 0.8215, - "stimulus_units": "Amps", - "sweep_number": 49, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 0.393486022949219, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310797, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310797, - "ephys_sweep_tags": [], - "id": 396323371, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0344671793282032, - "post_vm_mv": -71.8193130493164, - "pre_noise_rms_mv": 0.0410925038158894, - "pre_vm_mv": -73.4055023193359, - "slow_noise_rms_mv": 0.126336947083473, - "slow_vm_mv": -73.4055023193359, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 18, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.58618927001953, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 5.9, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310793, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310793, - "ephys_sweep_tags": [], - "id": 396323364, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0410074442625046, - "post_vm_mv": -71.8181533813477, - "pre_noise_rms_mv": 0.0411656834185123, - "pre_vm_mv": -73.622314453125, - "slow_noise_rms_mv": 0.156922787427902, - "slow_vm_mv": -73.622314453125, - "specimen_id": 318733871, - "stimulus_amplitude": 589.999993305668, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 15, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.80416107177734, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 5.7, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310761, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310761, - "ephys_sweep_tags": [], - "id": 396323362, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0384085476398468, - "post_vm_mv": -72.1192779541016, - "pre_noise_rms_mv": 0.0402040779590607, - "pre_vm_mv": -73.5760116577148, - "slow_noise_rms_mv": 0.155263319611549, - "slow_vm_mv": -73.5760116577148, - "specimen_id": 318733871, - "stimulus_amplitude": 569.99999165086, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 14, - "updated_at": "2015-10-01T14:46:14-07:00", - "vm_delta_mv": 1.45673370361328, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 5.5, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310729, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310729, - "ephys_sweep_tags": [], - "id": 396323359, - "leak_pa": -1.9833652973175, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0412728488445282, - "post_vm_mv": -71.3994064331055, - "pre_noise_rms_mv": 0.0415022782981396, - "pre_vm_mv": -73.0148086547852, - "slow_noise_rms_mv": 0.316595315933228, - "slow_vm_mv": -73.0148086547852, - "specimen_id": 318733871, - "stimulus_amplitude": 549.999989996053, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 13, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.61540222167969, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSCOARSE141203[4]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310721, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310721, - "ephys_sweep_tags": [], - "id": 396323354, - "leak_pa": -1.9833652973175, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.036531925201416, - "post_vm_mv": -72.4496383666992, - "pre_noise_rms_mv": 0.0378439091145992, - "pre_vm_mv": -73.8205032348633, - "slow_noise_rms_mv": 0.171630755066872, - "slow_vm_mv": -73.8205032348633, - "specimen_id": 318733871, - "stimulus_amplitude": 499.999985859034, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 11, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.37086486816406, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 0.0, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:54:26-08:00", - "description": "EXTPBLWOUT141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305553, - "name": "Test", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305553, - "id": 324342566, - "updated_at": "2015-01-29T22:54:26-08:00" - }, - "ephys_stimulus_id": 324342566, - "ephys_sweep_tags": [], - "id": 396323352, - "leak_pa": 0.0, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.040760412812233, - "post_vm_mv": 3.6764862537384, - "pre_noise_rms_mv": 0.0346001163125038, - "pre_vm_mv": 3.61960768699646, - "slow_noise_rms_mv": 0.0639408603310585, - "slow_vm_mv": 3.61960768699646, - "specimen_id": 318733871, - "stimulus_amplitude": 0.0, - "stimulus_duration": 0.0, - "stimulus_interval": 0.0, - "stimulus_start_time": 0.0, - "stimulus_units": "Amps", - "sweep_number": 106, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.0568785667419434, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.6, - "created_at": "2015-01-29T22:39:35-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324331247, - "updated_at": "2015-01-29T22:39:35-08:00" - }, - "ephys_stimulus_id": 324331247, - "ephys_sweep_tags": [], - "id": 396323342, - "leak_pa": -39.9872055053711, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0422713197767735, - "post_vm_mv": -79.9530029296875, - "pre_noise_rms_mv": 0.0398413836956024, - "pre_vm_mv": -81.1040573120117, - "slow_noise_rms_mv": 0.0926332622766495, - "slow_vm_mv": -81.1040573120117, - "specimen_id": 318733871, - "stimulus_amplitude": 659.999999097494, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 103, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.15105438232422, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.6, - "created_at": "2015-01-29T22:39:35-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324331247, - "updated_at": "2015-01-29T22:39:35-08:00" - }, - "ephys_stimulus_id": 324331247, - "ephys_sweep_tags": [], - "id": 396323340, - "leak_pa": -39.9872055053711, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0415031537413597, - "post_vm_mv": -79.8756713867188, - "pre_noise_rms_mv": 0.0380181893706322, - "pre_vm_mv": -80.8639144897461, - "slow_noise_rms_mv": 0.10466530174017, - "slow_vm_mv": -80.8639144897461, - "specimen_id": 318733871, - "stimulus_amplitude": 659.999999097494, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 102, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.988243103027344, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSCOARSE141203[3]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310717, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310717, - "ephys_sweep_tags": [], - "id": 396323332, - "leak_pa": -1.9833652973175, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.039756141602993, - "post_vm_mv": -72.707145690918, - "pre_noise_rms_mv": 0.0399281866848469, - "pre_vm_mv": -73.8104858398438, - "slow_noise_rms_mv": 0.128612071275711, - "slow_vm_mv": -73.8104858398438, - "specimen_id": 318733871, - "stimulus_amplitude": 400.000005340573, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 10, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.10334014892578, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:06-08:00", - "ephys_stimulus": { - "amplitude": 6.6, - "created_at": "2015-01-29T22:39:35-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324331247, - "updated_at": "2015-01-29T22:39:35-08:00" - }, - "ephys_stimulus_id": 324331247, - "ephys_sweep_tags": [], - "id": 396323650, - "leak_pa": -39.9872055053711, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0323205776512623, - "post_vm_mv": -78.8193435668945, - "pre_noise_rms_mv": 0.0379347428679466, - "pre_vm_mv": -80.441047668457, - "slow_noise_rms_mv": 0.107122242450714, - "slow_vm_mv": -80.441047668457, - "specimen_id": 318733871, - "stimulus_amplitude": 659.999999097494, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 99, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.6217041015625, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:06-08:00", - "ephys_stimulus": { - "amplitude": 6.5, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324338195, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338195, - "ephys_sweep_tags": [], - "id": 396323647, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0388760976493359, - "post_vm_mv": -79.2106018066406, - "pre_noise_rms_mv": 0.0425901263952255, - "pre_vm_mv": -80.2001800537109, - "slow_noise_rms_mv": 0.0826516449451447, - "slow_vm_mv": -80.2001800537109, - "specimen_id": 318733871, - "stimulus_amplitude": 649.99999827009, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 98, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.989578247070312, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:06-08:00", - "ephys_stimulus": { - "amplitude": 6.6, - "created_at": "2015-01-29T22:39:35-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324331247, - "updated_at": "2015-01-29T22:39:35-08:00" - }, - "ephys_stimulus_id": 324331247, - "ephys_sweep_tags": [], - "id": 396323644, - "leak_pa": -38.0038414001465, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.044320821762085, - "post_vm_mv": -78.6921768188477, - "pre_noise_rms_mv": 0.041571956127882, - "pre_vm_mv": -80.1463775634766, - "slow_noise_rms_mv": 0.136154472827911, - "slow_vm_mv": -80.1463775634766, - "specimen_id": 318733871, - "stimulus_amplitude": 659.999999097494, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 97, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.45420074462891, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:06-08:00", - "ephys_stimulus": { - "amplitude": 6.7, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324338199, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338199, - "ephys_sweep_tags": [], - "id": 396323642, - "leak_pa": -38.0038414001465, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0409424975514412, - "post_vm_mv": -78.6946182250977, - "pre_noise_rms_mv": 0.0409116707742214, - "pre_vm_mv": -79.6254272460938, - "slow_noise_rms_mv": 0.874026298522949, - "slow_vm_mv": -79.6254272460938, - "specimen_id": 318733871, - "stimulus_amplitude": 669.999999924897, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 96, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.930809020996094, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:06-08:00", - "ephys_stimulus": { - "amplitude": 6.5, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSHM80FN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305569, - "name": "Short Square - Hold -80mV", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305569, - "id": 324338195, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338195, - "ephys_sweep_tags": [], - "id": 396323640, - "leak_pa": -38.0038414001465, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0357376858592033, - "post_vm_mv": -79.0951156616211, - "pre_noise_rms_mv": 0.0444186888635159, - "pre_vm_mv": -80.1246490478516, - "slow_noise_rms_mv": 0.110739670693874, - "slow_vm_mv": -80.1246490478516, - "specimen_id": 318733871, - "stimulus_amplitude": 649.99999827009, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 95, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.02953338623047, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:09-08:00", - "description": "C1RP25PR1S141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:09-08:00", - "id": 324305749, - "name": "Ramp", - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_type_id": 324305749, - "id": 324305751, - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_id": 324305751, - "ephys_sweep_tags": [], - "id": 396323452, - "leak_pa": 0.0, - "num_spikes": 9, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0401654802262783, - "pre_vm_mv": -73.7982177734375, - "slow_noise_rms_mv": 0.220393180847168, - "slow_vm_mv": -73.7982177734375, - "specimen_id": 318733871, - "stimulus_amplitude": 800.000010681146, - "stimulus_duration": 31.997495, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.0225, - "stimulus_units": "Amps", - "sweep_number": 4, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:07-08:00", - "description": "C1LSCOARSE141203[16]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310919, - "updated_at": "2015-01-29T21:58:07-08:00" - }, - "ephys_stimulus_id": 324310919, - "ephys_sweep_tags": [], - "id": 396323447, - "leak_pa": -7.99744129180908, - "num_spikes": 28, - "peak_deflection": null, - "post_noise_rms_mv": 0.0427638366818428, - "post_vm_mv": -73.8689270019531, - "pre_noise_rms_mv": 0.0446272566914558, - "pre_vm_mv": -72.5650634765625, - "slow_noise_rms_mv": 0.176345944404602, - "slow_vm_mv": -72.5650634765625, - "specimen_id": 318733871, - "stimulus_amplitude": 210.00000349769, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 38, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.30386352539062, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:07-08:00", - "description": "C1LSCOARSE141203[15]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310915, - "updated_at": "2015-01-29T21:58:07-08:00" - }, - "ephys_stimulus_id": 324310915, - "ephys_sweep_tags": [], - "id": 396323445, - "leak_pa": -7.99744129180908, - "num_spikes": 22, - "peak_deflection": null, - "post_noise_rms_mv": 0.0413710474967957, - "post_vm_mv": -72.8272399902344, - "pre_noise_rms_mv": 0.0437457673251629, - "pre_vm_mv": -71.9559326171875, - "slow_noise_rms_mv": 0.297846466302872, - "slow_vm_mv": -71.9559326171875, - "specimen_id": 318733871, - "stimulus_amplitude": 190.000001842883, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 37, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.871307373046875, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:07-08:00", - "description": "C1LSCOARSE141203[14]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310911, - "updated_at": "2015-01-29T21:58:07-08:00" - }, - "ephys_stimulus_id": 324310911, - "ephys_sweep_tags": [], - "id": 396323443, - "leak_pa": -7.99744129180908, - "num_spikes": 21, - "peak_deflection": null, - "post_noise_rms_mv": 0.0392543375492096, - "post_vm_mv": -72.5036392211914, - "pre_noise_rms_mv": 0.0393037050962448, - "pre_vm_mv": -72.1030654907227, - "slow_noise_rms_mv": 0.281521439552307, - "slow_vm_mv": -72.1030654907227, - "specimen_id": 318733871, - "stimulus_amplitude": 170.000000188075, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 36, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.40057373046875, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310797, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310797, - "ephys_sweep_tags": [], - "id": 396323368, - "leak_pa": -4.990403175354, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0358530394732952, - "post_vm_mv": -71.6928253173828, - "pre_noise_rms_mv": 0.0396796762943268, - "pre_vm_mv": -73.5050048828125, - "slow_noise_rms_mv": 0.135289296507835, - "slow_vm_mv": -73.5050048828125, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 17, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.81217956542969, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[6]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310837, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310837, - "ephys_sweep_tags": [], - "id": 396323401, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.046930156648159, - "post_vm_mv": -71.696891784668, - "pre_noise_rms_mv": 0.0421544797718525, - "pre_vm_mv": -72.1745986938477, - "slow_noise_rms_mv": 0.144713699817657, - "slow_vm_mv": -72.1745986938477, - "specimen_id": 318733871, - "stimulus_amplitude": 9.99999996004197, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 28, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.477706909179688, - "workflow_state": "manual_failed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[7]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310841, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310841, - "ephys_sweep_tags": [], - "id": 396323404, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0400526039302349, - "post_vm_mv": -71.804801940918, - "pre_noise_rms_mv": 0.036600898951292, - "pre_vm_mv": -71.5464630126953, - "slow_noise_rms_mv": 0.205636784434319, - "slow_vm_mv": -71.5464630126953, - "specimen_id": 318733871, - "stimulus_amplitude": 29.9999990127642, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 29, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.258338928222656, - "workflow_state": "manual_failed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[3]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338123, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338123, - "ephys_sweep_tags": [], - "id": 396323600, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.035027839243412, - "post_vm_mv": -73.2114715576172, - "pre_noise_rms_mv": 0.0415959544479847, - "pre_vm_mv": -73.2385482788086, - "slow_noise_rms_mv": 0.187070429325104, - "slow_vm_mv": -73.2385482788086, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.040995, - "stimulus_interval": 0.019, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 83, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0270767211914062, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[4]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338127, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338127, - "ephys_sweep_tags": [], - "id": 396323604, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0420295111835003, - "post_vm_mv": -74.1104354858398, - "pre_noise_rms_mv": 0.0353056378662586, - "pre_vm_mv": -73.7717056274414, - "slow_noise_rms_mv": 0.246308460831642, - "slow_vm_mv": -73.7717056274414, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.048995, - "stimulus_interval": 0.023, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 84, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.338729858398438, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 0.0, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:07-08:00", - "description": "EXTPSMOKET141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305553, - "name": "Test", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305553, - "id": 324305555, - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_id": 324305555, - "ephys_sweep_tags": [], - "id": 396323328, - "leak_pa": 0.0, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0, - "pre_vm_mv": 0.0, - "slow_noise_rms_mv": 0.0, - "slow_vm_mv": 0.0, - "specimen_id": 318733871, - "stimulus_amplitude": 9.99999977648258, - "stimulus_duration": 0.069995, - "stimulus_interval": 0.05, - "stimulus_start_time": 0.03, - "stimulus_units": "Volts", - "sweep_number": 0, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "unknown" - }, - { - "bridge_balance_mohm": 0.0, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:07-08:00", - "description": "EXTPINBATH141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305553, - "name": "Test", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305553, - "id": 324305559, - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_id": 324305559, - "ephys_sweep_tags": [], - "id": 396323330, - "leak_pa": 0.0, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0, - "pre_vm_mv": 0.0, - "slow_noise_rms_mv": 0.0, - "slow_vm_mv": 0.0, - "specimen_id": 318733871, - "stimulus_amplitude": 9.99999977648258, - "stimulus_duration": 0.069995, - "stimulus_interval": 0.05, - "stimulus_start_time": 0.03, - "stimulus_units": "Volts", - "sweep_number": 1, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "unknown" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:08-08:00", - "description": "EXTPEXPEND141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305553, - "name": "Test", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305553, - "id": 324305637, - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_id": 324305637, - "ephys_sweep_tags": [], - "id": 396323346, - "leak_pa": -39.9872055053711, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0, - "pre_vm_mv": 0.0, - "slow_noise_rms_mv": 0.0, - "slow_vm_mv": 0.0, - "specimen_id": 318733871, - "stimulus_amplitude": 9.99999977648258, - "stimulus_duration": 0.069995, - "stimulus_interval": 0.05, - "stimulus_start_time": 0.03, - "stimulus_units": "Volts", - "sweep_number": 104, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "unknown" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:08-08:00", - "description": "EXTPGGAEND141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305553, - "name": "Test", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305553, - "id": 324305641, - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_id": 324305641, - "ephys_sweep_tags": [], - "id": 396323350, - "leak_pa": -39.9872055053711, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0, - "pre_vm_mv": 0.0, - "slow_noise_rms_mv": 0.0, - "slow_vm_mv": 0.0, - "specimen_id": 318733871, - "stimulus_amplitude": 9.99999977648258, - "stimulus_duration": 0.069995, - "stimulus_interval": 0.05, - "stimulus_start_time": 0.03, - "stimulus_units": "Volts", - "sweep_number": 105, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "unknown" - }, - { - "bridge_balance_mohm": 0.0, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:09-08:00", - "description": "EXTPBREAKN141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305553, - "name": "Test", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305553, - "id": 324305705, - "updated_at": "2015-01-29T21:33:09-08:00" - }, - "ephys_stimulus_id": 324305705, - "ephys_sweep_tags": [], - "id": 396323406, - "leak_pa": 0.0, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0, - "pre_vm_mv": 0.0, - "slow_noise_rms_mv": 0.0, - "slow_vm_mv": 0.0, - "specimen_id": 318733871, - "stimulus_amplitude": 9.99999977648258, - "stimulus_duration": 0.069995, - "stimulus_interval": 0.05, - "stimulus_start_time": 0.03, - "stimulus_units": "Volts", - "sweep_number": 3, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "unknown" - }, - { - "bridge_balance_mohm": 0.0, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:33:08-08:00", - "description": "EXTPCllATT141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305553, - "name": "Test", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305553, - "id": 324305665, - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_id": 324305665, - "ephys_sweep_tags": [], - "id": 396323378, - "leak_pa": 0.0, - "num_spikes": 0, - "peak_deflection": null, - "post_noise_rms_mv": 0.0, - "post_vm_mv": 0.0, - "pre_noise_rms_mv": 0.0, - "pre_vm_mv": 0.0, - "slow_noise_rms_mv": 0.0, - "slow_vm_mv": 0.0, - "specimen_id": 318733871, - "stimulus_amplitude": 9.99999977648258, - "stimulus_duration": 0.069995, - "stimulus_interval": 0.05, - "stimulus_start_time": 0.03, - "stimulus_units": "Volts", - "sweep_number": 2, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0, - "workflow_state": "unknown" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[7]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338141, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338141, - "ephys_sweep_tags": [], - "id": 396323587, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0352929159998894, - "post_vm_mv": -73.169921875, - "pre_noise_rms_mv": 0.0338610708713531, - "pre_vm_mv": -73.5805969238281, - "slow_noise_rms_mv": 0.198360458016396, - "slow_vm_mv": -73.5805969238281, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.072995, - "stimulus_interval": 0.035, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 79, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.410675048828125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:15-08:00", - "description": "C2SSTRIPLE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338111, - "updated_at": "2015-01-29T22:53:15-08:00" - }, - "ephys_stimulus_id": 324338111, - "ephys_sweep_tags": [], - "id": 396323592, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0363268032670021, - "post_vm_mv": -73.3690032958984, - "pre_noise_rms_mv": 0.0389319099485874, - "pre_vm_mv": -73.3859329223633, - "slow_noise_rms_mv": 0.242742508649826, - "slow_vm_mv": -73.3859329223633, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.016995, - "stimulus_interval": 0.007, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 80, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.0169296264648438, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[1]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338115, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338115, - "ephys_sweep_tags": [], - "id": 396323594, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0395385921001434, - "post_vm_mv": -73.3211059570312, - "pre_noise_rms_mv": 0.043050542473793, - "pre_vm_mv": -73.5779342651367, - "slow_noise_rms_mv": 0.205265551805496, - "slow_vm_mv": -73.5779342651367, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.024995, - "stimulus_interval": 0.011, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 81, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.256828308105469, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:05-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[2]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338119, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338119, - "ephys_sweep_tags": [], - "id": 396323597, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0375289209187031, - "post_vm_mv": -73.3284530639648, - "pre_noise_rms_mv": 0.0366559848189354, - "pre_vm_mv": -73.0539169311523, - "slow_noise_rms_mv": 0.326934158802032, - "slow_vm_mv": -73.0539169311523, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.032995, - "stimulus_interval": 0.015, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 82, - "updated_at": "2015-10-01T14:46:15-07:00", - "vm_delta_mv": 0.2745361328125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[5]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310833, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310833, - "ephys_sweep_tags": [], - "id": 396323397, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": -76.34375, - "post_noise_rms_mv": 0.0391541942954063, - "post_vm_mv": -72.0367660522461, - "pre_noise_rms_mv": 0.0414051413536072, - "pre_vm_mv": -71.9976196289062, - "slow_noise_rms_mv": 0.180227696895599, - "slow_vm_mv": -71.9976196289062, - "specimen_id": 318733871, - "stimulus_amplitude": -9.99999996004197, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 27, - "updated_at": "2015-07-08T05:57:52-07:00", - "vm_delta_mv": 0.0391464233398438, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[8]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310847, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310847, - "ephys_sweep_tags": [], - "id": 396323408, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": -48.09375, - "post_noise_rms_mv": 0.043704766780138, - "post_vm_mv": -71.5417327880859, - "pre_noise_rms_mv": 0.0406602211296558, - "pre_vm_mv": -71.6712112426758, - "slow_noise_rms_mv": 0.288515567779541, - "slow_vm_mv": -71.6712112426758, - "specimen_id": 318733871, - "stimulus_amplitude": 50.0000006675716, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 30, - "updated_at": "2015-07-08T05:57:52-07:00", - "vm_delta_mv": 0.129478454589844, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.8, - "created_at": "2015-01-29T22:18:33-08:00", - "description": "C1LSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324321357, - "updated_at": "2015-01-29T22:18:33-08:00" - }, - "ephys_stimulus_id": 324321357, - "ephys_sweep_tags": [], - "id": 396323456, - "leak_pa": -12.028151512146, - "num_spikes": 0, - "peak_deflection": -44.28125, - "post_noise_rms_mv": 0.0415375158190727, - "post_vm_mv": -72.9263229370117, - "pre_noise_rms_mv": 0.0367179661989212, - "pre_vm_mv": -73.3893051147461, - "slow_noise_rms_mv": 0.140569120645523, - "slow_vm_mv": -73.3893051147461, - "specimen_id": 318733871, - "stimulus_amplitude": 79.9999996803358, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 41, - "updated_at": "2015-07-08T05:57:52-07:00", - "vm_delta_mv": 0.462982177734375, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[3]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310825, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310825, - "ephys_sweep_tags": [], - "id": 396323392, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": -89.53125, - "post_noise_rms_mv": 0.0390310399234295, - "post_vm_mv": -73.2279891967773, - "pre_noise_rms_mv": 0.0365938991308212, - "pre_vm_mv": -73.35302734375, - "slow_noise_rms_mv": 0.156366005539894, - "slow_vm_mv": -73.35302734375, - "specimen_id": 318733871, - "stimulus_amplitude": -50.0000006675716, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 25, - "updated_at": "2015-07-08T05:57:54-07:00", - "vm_delta_mv": 0.125038146972656, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.7, - "created_at": "2015-01-29T22:18:33-08:00", - "description": "C1LSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324321349, - "updated_at": "2015-01-29T22:18:33-08:00" - }, - "ephys_stimulus_id": 324321349, - "ephys_sweep_tags": [], - "id": 396323454, - "leak_pa": -12.028151512146, - "num_spikes": 0, - "peak_deflection": -48.90625, - "post_noise_rms_mv": 0.0441768728196621, - "post_vm_mv": -73.1199493408203, - "pre_noise_rms_mv": 0.0386229529976845, - "pre_vm_mv": -72.9328842163086, - "slow_noise_rms_mv": 0.16550201177597, - "slow_vm_mv": -72.9328842163086, - "specimen_id": 318733871, - "stimulus_amplitude": 69.9999988529321, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 40, - "updated_at": "2015-07-08T05:57:54-07:00", - "vm_delta_mv": 0.187065124511719, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[4]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310829, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310829, - "ephys_sweep_tags": [], - "id": 396323394, - "leak_pa": -4.990403175354, - "num_spikes": 0, - "peak_deflection": -83.34375, - "post_noise_rms_mv": 0.0405874624848366, - "post_vm_mv": -72.389518737793, - "pre_noise_rms_mv": 0.0415650308132172, - "pre_vm_mv": -72.2010955810547, - "slow_noise_rms_mv": 0.131545454263687, - "slow_vm_mv": -72.2010955810547, - "specimen_id": 318733871, - "stimulus_amplitude": -29.9999990127642, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 26, - "updated_at": "2015-07-08T05:57:52-07:00", - "vm_delta_mv": 0.188423156738281, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T22:18:36-08:00", - "description": "C2NSRMPRHE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305829, - "name": "Ramp to Rheobase", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305829, - "id": 324321519, - "updated_at": "2015-01-29T22:18:36-08:00" - }, - "ephys_stimulus_id": 324321519, - "ephys_sweep_tags": [], - "id": 396323542, - "leak_pa": -9.98080635070801, - "num_spikes": 57, - "peak_deflection": null, - "post_noise_rms_mv": 0.0380563996732235, - "post_vm_mv": -75.0327987670898, - "pre_noise_rms_mv": 0.0397848822176456, - "pre_vm_mv": -73.5854339599609, - "slow_noise_rms_mv": 0.180791780352592, - "slow_vm_mv": -73.5854339599609, - "specimen_id": 318733871, - "stimulus_amplitude": 255.750004507505, - "stimulus_duration": 29.999975, - "stimulus_interval": 0.0, - "stimulus_start_time": 2.02002, - "stimulus_units": "Amps", - "sweep_number": 63, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.44736480712891, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:15-08:00", - "description": "C2SSTRIPLE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338111, - "updated_at": "2015-01-29T22:53:15-08:00" - }, - "ephys_stimulus_id": 324338111, - "ephys_sweep_tags": [], - "id": 396323544, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.037385605275631, - "post_vm_mv": -73.5233383178711, - "pre_noise_rms_mv": 0.0444515310227871, - "pre_vm_mv": -73.5065689086914, - "slow_noise_rms_mv": 0.173128440976143, - "slow_vm_mv": -73.5065689086914, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.016995, - "stimulus_interval": 0.007, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 64, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.0167694091796875, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[1]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338115, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338115, - "ephys_sweep_tags": [], - "id": 396323548, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0440761931240559, - "post_vm_mv": -73.6457672119141, - "pre_noise_rms_mv": 0.0434141494333744, - "pre_vm_mv": -73.6492462158203, - "slow_noise_rms_mv": 0.180153012275696, - "slow_vm_mv": -73.6492462158203, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.024995, - "stimulus_interval": 0.011, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 65, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.00347900390625, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[2]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338119, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338119, - "ephys_sweep_tags": [], - "id": 396323552, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0393132194876671, - "post_vm_mv": -73.7283935546875, - "pre_noise_rms_mv": 0.0338524095714092, - "pre_vm_mv": -73.6042861938477, - "slow_noise_rms_mv": 0.159617558121681, - "slow_vm_mv": -73.6042861938477, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.032995, - "stimulus_interval": 0.015, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 66, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.124107360839844, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:04-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T22:53:16-08:00", - "description": "C2SSTRIPLE141203[3]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:10-08:00", - "id": 324305839, - "name": "Short Square - Triple", - "updated_at": "2015-01-29T21:33:10-08:00" - }, - "ephys_stimulus_type_id": 324305839, - "id": 324338123, - "updated_at": "2015-01-29T22:53:16-08:00" - }, - "ephys_stimulus_id": 324338123, - "ephys_sweep_tags": [], - "id": 396323554, - "leak_pa": -9.98080635070801, - "num_spikes": 3, - "peak_deflection": null, - "post_noise_rms_mv": 0.0420318059623241, - "post_vm_mv": -73.6357803344727, - "pre_noise_rms_mv": 0.0342406034469604, - "pre_vm_mv": -73.4720077514648, - "slow_noise_rms_mv": 0.228944271802902, - "slow_vm_mv": -73.4720077514648, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.040995, - "stimulus_interval": 0.019, - "stimulus_start_time": 2.02, - "stimulus_units": "Amps", - "sweep_number": 67, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.163772583007812, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310797, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310797, - "ephys_sweep_tags": [], - "id": 396323382, - "leak_pa": -4.990403175354, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0378184206783772, - "post_vm_mv": -70.87744140625, - "pre_noise_rms_mv": 0.0403490774333477, - "pre_vm_mv": -72.5947113037109, - "slow_noise_rms_mv": 0.153314620256424, - "slow_vm_mv": -72.5947113037109, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 21, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.71726989746094, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 6.0, - "created_at": "2015-01-29T21:58:05-08:00", - "description": "C1SSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:07-08:00", - "id": 324305563, - "name": "Short Square", - "updated_at": "2015-01-29T21:33:07-08:00" - }, - "ephys_stimulus_type_id": 324305563, - "id": 324310797, - "updated_at": "2015-01-29T21:58:05-08:00" - }, - "ephys_stimulus_id": 324310797, - "ephys_sweep_tags": [], - "id": 396323366, - "leak_pa": -4.990403175354, - "num_spikes": 1, - "peak_deflection": null, - "post_noise_rms_mv": 0.0432348102331161, - "post_vm_mv": -71.8769836425781, - "pre_noise_rms_mv": 0.0401340462267399, - "pre_vm_mv": -73.5547409057617, - "slow_noise_rms_mv": 0.11938589066267, - "slow_vm_mv": -73.5547409057617, - "specimen_id": 318733871, - "stimulus_amplitude": 599.999994133071, - "stimulus_duration": 0.002995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 16, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 1.67775726318359, - "workflow_state": "manual_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[2]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310821, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310821, - "ephys_sweep_tags": [], - "id": 396323390, - "leak_pa": -6.97376823425293, - "num_spikes": 0, - "peak_deflection": -93.40625, - "post_noise_rms_mv": 0.0433307066559792, - "post_vm_mv": -73.8148193359375, - "pre_noise_rms_mv": 0.0394219271838665, - "pre_vm_mv": -73.3753662109375, - "slow_noise_rms_mv": 0.185792118310928, - "slow_vm_mv": -73.3753662109375, - "specimen_id": 318733871, - "stimulus_amplitude": -69.9999988529321, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 24, - "updated_at": "2015-07-08T05:57:54-07:00", - "vm_delta_mv": 0.439453125, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:03-08:00", - "ephys_stimulus": { - "amplitude": 0.6, - "created_at": "2015-01-29T22:13:04-08:00", - "description": "C1LSFINEST141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324318916, - "updated_at": "2015-01-29T22:13:04-08:00" - }, - "ephys_stimulus_id": 324318916, - "ephys_sweep_tags": [], - "id": 396323449, - "leak_pa": -7.99744129180908, - "num_spikes": 0, - "peak_deflection": -51.7187538146973, - "post_noise_rms_mv": 0.0381619110703468, - "post_vm_mv": -72.2404022216797, - "pre_noise_rms_mv": 0.0412812754511833, - "pre_vm_mv": -72.1742477416992, - "slow_noise_rms_mv": 0.184022128582001, - "slow_vm_mv": -72.1742477416992, - "specimen_id": 318733871, - "stimulus_amplitude": 59.9999980255284, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 39, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.0661544799804688, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[1]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310817, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310817, - "ephys_sweep_tags": [], - "id": 396323388, - "leak_pa": -6.97376823425293, - "num_spikes": 0, - "peak_deflection": -96.9687576293945, - "post_noise_rms_mv": 0.0375870503485203, - "post_vm_mv": -73.6441040039062, - "pre_noise_rms_mv": 0.0391277000308037, - "pre_vm_mv": -73.8342666625977, - "slow_noise_rms_mv": 0.149396568536758, - "slow_vm_mv": -73.8342666625977, - "specimen_id": 318733871, - "stimulus_amplitude": -90.0000005077395, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 23, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.190162658691406, - "workflow_state": "auto_passed" - }, - { - "bridge_balance_mohm": 14.224663734436, - "created_at": "2015-03-02T15:04:02-08:00", - "ephys_stimulus": { - "amplitude": 1.0, - "created_at": "2015-01-29T21:58:06-08:00", - "description": "C1LSCOARSE141203[0]", - "ephys_stimulus_type": { - "created_at": "2015-01-29T21:33:08-08:00", - "id": 324305675, - "name": "Long Square", - "updated_at": "2015-01-29T21:33:08-08:00" - }, - "ephys_stimulus_type_id": 324305675, - "id": 324310813, - "updated_at": "2015-01-29T21:58:06-08:00" - }, - "ephys_stimulus_id": 324310813, - "ephys_sweep_tags": [], - "id": 396323384, - "leak_pa": -6.97376823425293, - "num_spikes": 0, - "peak_deflection": -100.156257629395, - "post_noise_rms_mv": 0.0376262404024601, - "post_vm_mv": -74.3083114624023, - "pre_noise_rms_mv": 0.0403164774179459, - "pre_vm_mv": -73.7102813720703, - "slow_noise_rms_mv": 0.212610512971878, - "slow_vm_mv": -73.7102813720703, - "specimen_id": 318733871, - "stimulus_amplitude": -110.000002162547, - "stimulus_duration": 0.999995, - "stimulus_interval": 0.0, - "stimulus_start_time": 1.02, - "stimulus_units": "Amps", - "sweep_number": 22, - "updated_at": "2015-10-01T14:46:13-07:00", - "vm_delta_mv": 0.598030090332031, - "workflow_state": "auto_passed" - } - ], - "external_specimen_name": null, - "facs_well_id": null, - "frozen_at": null, - "hemisphere_id": 2, - "histology_well_name": null, - "id": 318733871, - "location_id": null, - "name": "Nr5a1-Cre;Ai14-169248.04.02.01", - "neuron_reconstructions": [ - { - "average_bifurcation_angle_local": 82.2651, - "average_bifurcation_angle_remote": 80.9024, - "average_contraction": 0.891136, - "average_diameter": 0.424899, - "average_fragmentation": 38.9318, - "average_parent_daughter_ratio": 0.828312, - "created_at": "2015-02-06T11:08:53-08:00", - "hausdorff_dimension": 1.17512, - "id": 326737179, - "manual": true, - "max_branch_order": 8, - "max_euclidean_distance": 411.175, - "max_path_distance": 482.472, - "nodes_over_branches": 39.955, - "number_bifurcations": 20, - "number_branches": 44, - "number_nodes": 1758, - "number_stems": 6, - "number_tips": 25, - "overall_depth": 103.41, - "overall_height": 463.378, - "overall_width": 246.074, - "scale_factor_x": 0.1144, - "scale_factor_y": 0.1144, - "scale_factor_z": 0.28, - "soma_surface": 610.486, - "specimen_id": 318733871, - "superseded": true, - "total_length": 2159.88, - "total_surface": 2869.99, - "total_volume": 363.123, - "updated_at": "2015-02-12T10:50:05-08:00", - "user_id": 250, - "well_known_files": [ - { - "attachable_id": 326737179, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-02-06T11:08:54-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_326737179_m.swc", - "id": 326737181, - "published_at": null, - "size": 74992, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2015-02-06T11:08:54-08:00", - "well_known_file_type": { - "created_at": "2014-05-16T12:29:39-07:00", - "id": 303941301, - "name": "3DNeuronReconstruction", - "updated_at": "2014-05-16T12:29:39-07:00" - }, - "well_known_file_type_id": 303941301, - "workflow_state": null - } - ] - }, - { - "average_bifurcation_angle_local": 85.3917, - "average_bifurcation_angle_remote": 98.8257, - "average_contraction": 0.73481, - "average_diameter": 0.359785, - "average_fragmentation": 18.9057, - "average_parent_daughter_ratio": 1.06767, - "created_at": "2015-01-29T20:23:08-08:00", - "hausdorff_dimension": 1.21225, - "id": 324291233, - "manual": false, - "max_branch_order": 9, - "max_euclidean_distance": 176.473, - "max_path_distance": 194.904, - "nodes_over_branches": 19.9245283018868, - "number_bifurcations": 25, - "number_branches": 53, - "number_nodes": 1056, - "number_stems": 5, - "number_tips": 29, - "overall_depth": 40.2531, - "overall_height": 153.476, - "overall_width": 206.151, - "scale_factor_x": 0.1144, - "scale_factor_y": 0.1144, - "scale_factor_z": 0.28, - "soma_surface": 332.412, - "specimen_id": 318733871, - "superseded": true, - "total_length": 1363.13, - "total_surface": 1542.32, - "total_volume": 168.265, - "updated_at": "2015-02-06T11:08:48-08:00", - "user_id": null, - "well_known_files": [ - { - "attachable_id": 324291233, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-01-29T20:23:09-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_324291233_m.swc", - "id": 324291238, - "published_at": null, - "size": 44867, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2015-01-29T20:23:09-08:00", - "well_known_file_type": { - "created_at": "2014-05-16T12:29:39-07:00", - "id": 303941301, - "name": "3DNeuronReconstruction", - "updated_at": "2014-05-16T12:29:39-07:00" - }, - "well_known_file_type_id": 303941301, - "workflow_state": null - } - ] - }, - { - "average_bifurcation_angle_local": 0.0, - "average_bifurcation_angle_remote": 0.0, - "average_contraction": 0.993603, - "average_diameter": 0.394682, - "average_fragmentation": 1.0, - "average_parent_daughter_ratio": 0.122453, - "created_at": "2015-02-06T11:08:48-08:00", - "hausdorff_dimension": 1.14685, - "id": 326737168, - "manual": true, - "max_branch_order": 1, - "max_euclidean_distance": 173.051, - "max_path_distance": 7.13842, - "nodes_over_branches": 508.0, - "number_bifurcations": 0, - "number_branches": 1, - "number_nodes": 508, - "number_stems": 1, - "number_tips": 19, - "overall_depth": 40.32, - "overall_height": 187.387, - "overall_width": 136.524, - "scale_factor_x": 0.1144, - "scale_factor_y": 0.1144, - "scale_factor_z": 0.28, - "soma_surface": 610.486, - "specimen_id": 318733871, - "superseded": true, - "total_length": 649.368, - "total_surface": 839.568, - "total_volume": 109.605, - "updated_at": "2015-02-06T11:17:55-08:00", - "user_id": 250, - "well_known_files": [ - { - "attachable_id": 326737168, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-02-06T11:08:48-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_326737168_m.swc", - "id": 326737170, - "published_at": null, - "size": 21450, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2015-02-06T11:08:48-08:00", - "well_known_file_type": { - "created_at": "2014-05-16T12:29:39-07:00", - "id": 303941301, - "name": "3DNeuronReconstruction", - "updated_at": "2014-05-16T12:29:39-07:00" - }, - "well_known_file_type_id": 303941301, - "workflow_state": null - } - ] - }, - { - "average_bifurcation_angle_local": 85.3913, - "average_bifurcation_angle_remote": 98.8256, - "average_contraction": 0.73481, - "average_diameter": 0.359784, - "average_fragmentation": 18.9057, - "average_parent_daughter_ratio": 1.06765, - "created_at": "2015-02-12T10:50:05-08:00", - "hausdorff_dimension": 1.21225, - "id": 328874691, - "manual": true, - "max_branch_order": 9, - "max_euclidean_distance": 176.473, - "max_path_distance": 194.904, - "nodes_over_branches": 19.9245283018868, - "number_bifurcations": 25, - "number_branches": 53, - "number_nodes": 1056, - "number_stems": 5, - "number_tips": 29, - "overall_depth": 40.2531, - "overall_height": 153.476, - "overall_width": 206.151, - "scale_factor_x": 0.1144, - "scale_factor_y": 0.1144, - "scale_factor_z": 0.28, - "soma_surface": 332.412, - "specimen_id": 318733871, - "superseded": true, - "total_length": 1363.12, - "total_surface": 1542.32, - "total_volume": 168.265, - "updated_at": "2015-02-12T11:10:10-08:00", - "user_id": 250, - "well_known_files": [ - { - "attachable_id": 328874691, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-02-12T10:50:06-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_328874691_m.swc", - "id": 328874693, - "published_at": null, - "size": 44831, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2015-02-12T10:50:06-08:00", - "well_known_file_type": { - "created_at": "2014-05-16T12:29:39-07:00", - "id": 303941301, - "name": "3DNeuronReconstruction", - "updated_at": "2014-05-16T12:29:39-07:00" - }, - "well_known_file_type_id": 303941301, - "workflow_state": null - } - ] - }, - { - "average_bifurcation_angle_local": 72.8762, - "average_bifurcation_angle_remote": 79.2273, - "average_contraction": 0.869187, - "average_diameter": 0.383292, - "average_fragmentation": 40.4, - "average_parent_daughter_ratio": 0.995908, - "created_at": "2015-02-12T10:50:17-08:00", - "hausdorff_dimension": 1.13073, - "id": 328874724, - "manual": true, - "max_branch_order": 6, - "max_euclidean_distance": 267.871, - "max_path_distance": 285.128, - "nodes_over_branches": 41.425, - "number_bifurcations": 17, - "number_branches": 40, - "number_nodes": 1657, - "number_stems": 8, - "number_tips": 24, - "overall_depth": 60.5338, - "overall_height": 280.407, - "overall_width": 307.497, - "scale_factor_x": 0.1144, - "scale_factor_y": 0.1144, - "scale_factor_z": 0.28, - "soma_surface": 332.412, - "specimen_id": 318733871, - "superseded": true, - "total_length": 1983.17, - "total_surface": 2399.98, - "total_volume": 270.642, - "updated_at": "2015-03-09T16:36:48-07:00", - "user_id": 250, - "well_known_files": [ - { - "attachable_id": 328874724, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-02-12T10:50:17-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_328874724_m.swc", - "id": 328874726, - "published_at": null, - "size": 70938, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2015-02-12T10:50:17-08:00", - "well_known_file_type": { - "created_at": "2014-05-16T12:29:39-07:00", - "id": 303941301, - "name": "3DNeuronReconstruction", - "updated_at": "2014-05-16T12:29:39-07:00" - }, - "well_known_file_type_id": 303941301, - "workflow_state": null - } - ] - }, - { - "average_bifurcation_angle_local": 72.9421, - "average_bifurcation_angle_remote": 79.422, - "average_contraction": 0.865652, - "average_diameter": 0.386189, - "average_fragmentation": 40.9474, - "average_parent_daughter_ratio": 1.01323, - "created_at": "2015-03-09T16:36:48-07:00", - "hausdorff_dimension": 1.12508, - "id": 403165543, - "manual": true, - "max_branch_order": 6, - "max_euclidean_distance": 267.871, - "max_path_distance": 285.128, - "nodes_over_branches": 41.974, - "number_bifurcations": 16, - "number_branches": 38, - "number_nodes": 1595, - "number_stems": 8, - "number_tips": 23, - "overall_depth": 60.5338, - "overall_height": 280.407, - "overall_width": 307.497, - "scale_factor_x": 0.1144, - "scale_factor_y": 0.1144, - "scale_factor_z": 0.28, - "soma_surface": 332.412, - "specimen_id": 318733871, - "superseded": true, - "total_length": 1911.04, - "total_surface": 2330.19, - "total_volume": 264.918, - "updated_at": "2015-11-20T16:57:05-08:00", - "user_id": 250, - "well_known_files": [ - { - "attachable_id": 403165543, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-03-09T16:36:48-07:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14_IVSCC_-169248.04.02.01_403165543_m.swc", - "id": 403165565, - "published_at": null, - "size": 68212, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2015-03-09T16:36:48-07:00", - "well_known_file_type": { - "created_at": "2014-05-16T12:29:39-07:00", - "id": 303941301, - "name": "3DNeuronReconstruction", - "updated_at": "2014-05-16T12:29:39-07:00" - }, - "well_known_file_type_id": 303941301, - "workflow_state": null - } - ] - }, - { - "average_bifurcation_angle_local": 70.8819434043627, - "average_bifurcation_angle_remote": 78.2563982076947, - "average_contraction": 0.880835021187539, - "average_diameter": 0.311525009419645, - "average_fragmentation": 43.9428571428571, - "average_parent_daughter_ratio": 0.698053892074704, - "created_at": "2015-11-20T16:57:05-08:00", - "hausdorff_dimension": null, - "id": 491253825, - "manual": true, - "max_branch_order": 6, - "max_euclidean_distance": 212.511020927765, - "max_path_distance": 220.853847497628, - "nodes_over_branches": 44.9714285714286, - "number_bifurcations": 15, - "number_branches": 35, - "number_nodes": 1574, - "number_stems": 7, - "number_tips": 21, - "overall_depth": 273.94130015488, - "overall_height": 173.135753853, - "overall_width": 59.117962518888, - "scale_factor_x": 0.1144, - "scale_factor_y": 0.1144, - "scale_factor_z": 0.28, - "soma_surface": 232.051781050739, - "specimen_id": 318733871, - "superseded": false, - "total_length": 1434.15149446666, - "total_surface": 1398.00481682895, - "total_volume": 126.335576025326, - "updated_at": "2016-02-03T16:39:02-08:00", - "user_id": 250, - "well_known_files": [ - { - "attachable_id": 491253825, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2015-11-20T16:57:05-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14-169248.04.02.01_491253825_m.swc", - "id": 491253827, - "published_at": "2015-05-14", - "size": 68572, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2015-11-20T16:57:05-08:00", - "well_known_file_type": { - "created_at": "2014-05-16T12:29:39-07:00", - "id": 303941301, - "name": "3DNeuronReconstruction", - "updated_at": "2014-05-16T12:29:39-07:00" - }, - "well_known_file_type_id": 303941301, - "workflow_state": null - }, - { - "attachable_id": 491253825, - "attachable_type": "NeuronReconstruction", - "content_type": "text/plain; charset=us-ascii", - "created_at": "2016-01-18T18:49:54-08:00", - "file_source_id": null, - "filename": "Nr5a1-Cre_Ai14-169248.04.02.01_491253825_marker_m.swc", - "id": 496607168, - "published_at": "2015-05-14", - "size": 600, - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "updated_at": "2016-01-18T18:49:54-08:00", - "well_known_file_type": { - "created_at": "2015-09-16T15:37:33-07:00", - "id": 486753749, - "name": "3DNeuronMarker", - "updated_at": "2015-09-16T15:37:33-07:00" - }, - "well_known_file_type_id": 486753749, - "workflow_state": null - } - ] - } - ], - "normalization_group_id": null, - "parent_id": 318694179, - "parent_x_coord": 0, - "parent_y_coord": 0, - "parent_z_coord": 1, - "plane_of_section_id": 1, - "postmortem_interval_id": null, - "preparation_method_id": null, - "priority": null, - "project": { - "code": "T301", - "created_at": "2014-07-01T09:52:32-07:00", - "current_directory": 659, - "failed_trigger_dir": "/projects/incoming/mousecelltypes/failed_trigger/", - "file_storage": "/data/aibstemp/josem/WellKnownFiles/", - "id": 305094322, - "incoming_directory": null, - "name": "in vitro Single Cell Characterization", - "non_cached_schema_name": null, - "process_triggers": true, - "subdirectory_count": 337, - "trigger_dir": "/projects/incoming/mousecelltypes/trigger/", - "updated_at": "2016-03-21T11:17:41-07:00" - }, - "project_id": 305094322, - "reference_space_id": 9, - "rna_integrity_number": null, - "specimen_preparation_method_id": null, - "specimen_set_id": null, - "specimen_tags": [ - { - "ar_association_key_name": "318733871", - "created_at": "2015-03-24T12:13:03-07:00", - "description": "neurons with no truncation", - "id": 470927414, - "is_public": true, - "name": "apical - intact", - "updated_at": "2015-03-24T12:13:03-07:00" - }, - { - "ar_association_key_name": "318733871", - "created_at": "2015-03-24T12:15:22-07:00", - "description": "initial high-level dendrite type to support May release search - spiny", - "id": 470928297, - "is_public": true, - "name": "dendrite type - spiny", - "updated_at": "2015-03-24T12:15:22-07:00" - } - ], - "storage_directory": "/projects/mousecelltypes/vol1/prod155/specimen_318733871/", - "structure_id": 721, - "task_flow_id": null, - "tissue_ph": null, - "tissue_processing_id": null, - "updated_at": "2015-12-10T19:52:02-08:00", - "updated_by": null - }, - "specimen_id": 318733871, - "storage_directory": "/projects/mousecelltypes/vol1/prod192/neuronal_model_329322394/", - "updated_at": "2016-01-21T23:24:14-08:00", - "well_known_files": [ - { - "attachable_id": 329322394, - "attachable_type": "NeuronalModel", - "content_type": "application/json", - "created_at": "2016-01-21T23:24:14-08:00", - "file_source_id": null, - "filename": "318733871_fit.json", - "id": 497237577, - "published_at": "2015-05-14", - "size": null, - "storage_directory": "/projects/mousecelltypes/vol1/prod192/neuronal_model_329322394/", - "updated_at": "2016-01-21T23:24:14-08:00", - "well_known_file_type": { - "created_at": "2015-02-13T11:41:41-08:00", - "id": 329230374, - "name": "NeuronalModelParameters", - "updated_at": "2015-02-13T11:41:41-08:00" - }, - "well_known_file_type_id": 329230374, - "workflow_state": null - } - ], - "workflow_state": "has_been_fit" -} -''' - - -def mock_import(mod, *args): - if mod == "neuron": - return MagicMock() - return real_import(mod, *args) - - -def mock_read_lims_file(self, lims_path): - self.lims_path = lims_path - self.read_json_string(LIMS_MESSAGE) - self.lims_update_data = dict(self.lims_data) - - -@pytest.fixture -def run_optimize(): - rs = RunOptimize('manifest_sdk.json', 'out.json') - - mock.patch.object(OptimizeConfigReader, - 'read_lims_file', - mock_read_lims_file) - - return rs - - -def xtest_init(run_optimize): - assert run_optimize.input_json == 'manifest_sdk.json' - assert run_optimize.output_json == 'out.json' - assert run_optimize.app_config == None - assert run_optimize.manifest == None - - -orig_open = open - -def open_configs(n, *args): - (_, fn) = os.path.split(n) - - if fn == 'manifest_sdk.json': - data_string = MANIFEST_JSON - elif fn == 'lims_message_optimize.json': - data_string = LIMS_MESSAGE - else: - return orig_open(n, *args) - - return mock_open(read_data=data_string)(n, *args) - - -@pytest.mark.requires_neuron -@patch("os.path.exists", return_value=True) -@patch("shutil.copy") -@patch("allensdk.model.biophysical.runner.save_nwb") -@patch.object(HocUtils, "__init__") -@patch(builtins.__name__+".__import__", side_effect=mock_import) -@patch("allensdk.core.json_utilities.write") -@patch("allensdk.internal.model.biophysical.fit_stage_2.run_stage_2") -@patch("allensdk.internal.model.biophysical.fit_stage_2.prepare_stage_2") -@patch("allensdk.internal.model.biophysical.fit_stage_1.run_stage_1") -@patch("allensdk.internal.model.biophysical.fit_stage_1.prepare_stage_1") -@patch("allensdk.internal.model.biophysical.run_passive_fit.run_passive_fit") -@patch("allensdk.core.nwb_data_set.NwbDataSet") -def test_start_specimen(nwb_data_set, - passive_fit, - prepare_stage_1, - run_stage_1, - prepare_stage_2, - run_stage_2, - json_utilities_write, - import_mock, - hoc_init, - save_nwb, - shutil_copy, - path_exists, - run_optimize): - with patch(builtins.__name__+".open", open_configs): - fit_description = Config().load('manifest_sdk.json') - Utils.description = fit_description - run_optimize.start_specimen() - - assert True diff --git a/allensdk/test/internal/biophysical/test_simulate_run.py b/allensdk/test/internal/biophysical/test_simulate_run.py deleted file mode 100644 index 2b91040f67..0000000000 --- a/allensdk/test/internal/biophysical/test_simulate_run.py +++ /dev/null @@ -1,753 +0,0 @@ -import pytest -from mock import patch, mock_open, Mock, MagicMock -try: - import __builtin__ as builtins -except: - import builtins -from allensdk.model.biophysical.utils import Utils -from allensdk.model.biophys_sim.config import Config -from allensdk.internal.model.biophysical.run_simulate_lims \ - import RunSimulateLims -from allensdk.model.biophys_sim.neuron.hoc_utils import HocUtils - -MANIFEST_JSON = ''' -{ - "biophys": [ - { - "model_type": "Biophysical - perisomatic", - "model_file": [ - "manifest_sdk.json", - "/projects/mousecelltypes/vol1/prod520/neuronal_model_488462965/487667205_fit.json" - ] - } - ], - "runs": [ - { - "sweeps_by_type": { - "Noise 1": [ - 39, - 41, - 43, - 45 - ], - "Noise 2": [ - 38, - 40, - 42, - 44 - ], - "Ramp": [ - 89, - 90, - 91 - ], - "Unknown": [ - 5 - ], - "Short Square": [ - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88 - ], - "Ramp to Rheobase": [ - 21, - 22, - 23 - ], - "Square - 2s Suprathreshold": [ - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35 - ], - "Long Square": [ - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74 - ], - "Square - 0.5ms Subthreshold": [ - 36, - 37 - ], - "Test": [ - 0, - 1, - 2, - 3, - 4, - 6, - 7, - 20 - ] - }, - "sweeps": [ - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 87, - 91 - ], - "neuronal_model_run_id": 496537307 - } - ], - "neuron": [ - { - "hoc": [ - "stdgui.hoc", - "import3d.hoc", - "cell.hoc" - ] - } - ], - "manifest": [ - { - "type": "dir", - "spec": "/local1/tmp", - "key": "BASEDIR" - }, - { - "type": "dir", - "spec": "/local1/tmp", - "key": "WORKDIR" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod534/specimen_487667205/Pvalb-IRES-Cre_Ai14-212813.03.01.01_496163999_m.swc", - "key": "MORPHOLOGY" - }, - { - "type": "dir", - "spec": "templates", - "key": "CODE_DIR" - }, - { - "type": "dir", - "spec": "modfiles", - "key": "MODFILE_DIR" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", - "key": "MOD_FILE_Kv2like", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", - "key": "MOD_FILE_NaV", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", - "key": "MOD_FILE_Ca_HVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", - "key": "MOD_FILE_Ca_LVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", - "key": "MOD_FILE_CaDynamics", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", - "key": "MOD_FILE_Ih", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", - "key": "MOD_FILE_Im", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", - "key": "MOD_FILE_Im_v2", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", - "key": "MOD_FILE_K_P", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", - "key": "MOD_FILE_K_T", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", - "key": "MOD_FILE_Kd", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", - "key": "MOD_FILE_Kv3_1", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", - "key": "MOD_FILE_Nap", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", - "key": "MOD_FILE_NaTa", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", - "key": "MOD_FILE_NaTs", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", - "key": "MOD_FILE_SK", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", - "key": "MOD_FILE_Kv2like", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", - "key": "MOD_FILE_NaV", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", - "key": "MOD_FILE_Ca_HVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", - "key": "MOD_FILE_Ca_LVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", - "key": "MOD_FILE_CaDynamics", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", - "key": "MOD_FILE_Ih", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", - "key": "MOD_FILE_Im", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", - "key": "MOD_FILE_Im_v2", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", - "key": "MOD_FILE_K_P", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", - "key": "MOD_FILE_K_T", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", - "key": "MOD_FILE_Kd", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", - "key": "MOD_FILE_Kv3_1", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", - "key": "MOD_FILE_Nap", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", - "key": "MOD_FILE_NaTa", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", - "key": "MOD_FILE_NaTs", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", - "key": "MOD_FILE_SK", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod555/project_in vitro Single Cell Characterization_T301/Kv2like.mod", - "key": "MOD_FILE_Kv2like", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod251/project_in vitro Single Cell Characterization_T301/NaV.mod", - "key": "MOD_FILE_NaV", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_HVA.mod", - "key": "MOD_FILE_Ca_HVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ca_LVA.mod", - "key": "MOD_FILE_Ca_LVA", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/CaDynamics.mod", - "key": "MOD_FILE_CaDynamics", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Ih.mod", - "key": "MOD_FILE_Ih", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im.mod", - "key": "MOD_FILE_Im", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Im_v2.mod", - "key": "MOD_FILE_Im_v2", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_P.mod", - "key": "MOD_FILE_K_P", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/K_T.mod", - "key": "MOD_FILE_K_T", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kd.mod", - "key": "MOD_FILE_Kd", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Kv3_1.mod", - "key": "MOD_FILE_Kv3_1", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/Nap.mod", - "key": "MOD_FILE_Nap", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTa.mod", - "key": "MOD_FILE_NaTa", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/NaTs.mod", - "key": "MOD_FILE_NaTs", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod210/project_in vitro Single Cell Characterization_T301/SK.mod", - "key": "MOD_FILE_SK", - "format": "MODFILE" - }, - { - "type": "file", - "spec": "lims_message_simulate.json", - "key": "neuronal_model_run_data" - }, - { - "type": "file", - "spec": "/projects/mousecelltypes/vol1/prod514/Ephys_Roi_Result_487667203/487667203.nwb", - "key": "stimulus_path", - "format": "NWB" - }, - { - "type": "file", - "spec": "/local1/tmp/manifest_sdk.json", - "key": "manifest" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "spec": "496537307_virtual_experiment.nwb", - "key": "output_path", - "format": "NWB" - }, - { - "type": "dir", - "spec": "/projects/mousecelltypes/vol1/prod520/neuronal_model_488462965/487667205_fit.json", - "key": "fit_parameters" - } - ], - "passive": [ - { - "ra": 29.0745151982, - "cm": [ - { - "section": "soma", - "cm": 3.31732779736 - }, - { - "section": "axon", - "cm": 3.31732779736 - }, - { - "section": "dend", - "cm": 3.31732779736 - } - ], - "e_pas": -85.65570068359375 - } - ], - "fitting": [ - { - "junction_potential": -14.0, - "sweeps": [ - 56 - ] - } - ], - "conditions": [ - { - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -85.65570068359375 - } - ], - "genome": [ - { - "section": "soma", - "name": "gbar_Ih", - "value": 0.00090995210221476205, - "mechanism": "Ih" - }, - { - "section": "soma", - "name": "gbar_NaV", - "value": 0.081906946478702058, - "mechanism": "NaV" - }, - { - "section": "soma", - "name": "gbar_Kd", - "value": 2.4740872017758875e-08, - "mechanism": "Kd" - }, - { - "section": "soma", - "name": "gbar_Kv2like", - "value": 0.00160565599090932, - "mechanism": "Kv2like" - }, - { - "section": "soma", - "name": "gbar_Kv3_1", - "value": 2.296430043469444, - "mechanism": "Kv3_1" - }, - { - "section": "soma", - "name": "gbar_K_T", - "value": 0.059053715441415355, - "mechanism": "K_T" - }, - { - "section": "soma", - "name": "gbar_Im_v2", - "value": 3.9951061122506237e-14, - "mechanism": "Im_v2" - }, - { - "section": "soma", - "name": "gbar_SK", - "value": 6.8067829150919579e-10, - "mechanism": "SK" - }, - { - "section": "soma", - "name": "gbar_Ca_HVA", - "value": 0.0001014254260681964, - "mechanism": "Ca_HVA" - }, - { - "section": "soma", - "name": "gbar_Ca_LVA", - "value": 0.0097584217102168799, - "mechanism": "Ca_LVA" - }, - { - "section": "soma", - "name": "gamma_CaDynamics", - "value": 0.0007405691124034076, - "mechanism": "CaDynamics" - }, - { - "section": "soma", - "name": "decay_CaDynamics", - "value": 410.14174188957332, - "mechanism": "CaDynamics" - }, - { - "section": "soma", - "name": "g_pas", - "value": 5.2241645387452482e-05, - "mechanism": "" - }, - { - "section": "axon", - "name": "g_pas", - "value": 2.2719709304318236e-05, - "mechanism": "" - }, - { - "section": "dend", - "name": "g_pas", - "value": 1.0099597920543875e-07, - "mechanism": "" - } - ] -} -''' - -@pytest.fixture -def run_simulate(): - rs = RunSimulateLims('manifest.json', 'out.json') - - return rs - - -def test_init(run_simulate): - assert run_simulate.input_json == 'manifest.json' - assert run_simulate.output_json == 'out.json' - assert run_simulate.app_config == None - assert run_simulate.manifest == None - - -@pytest.mark.xfail -@patch.object(Utils, "h") -@patch.object(HocUtils, "__init__") -def test_simulate(hoc_init, mock_h, run_simulate): - # import allensdk.eclipse_debug - - mock_utils = Mock(name='mock_utils', - h=mock_h) - - with patch('allensdk.internal.api.queries.biophysical_module_reader.BiophysicalModuleReader', - MagicMock(name="bio_mod_reader")) as bio_mod_reader: - with patch('allensdk.model.biophysical.runner.save_nwb', - MagicMock(name="save_nwb")) as save_nwb: - with patch('allensdk.model.biophysical.runner.NwbDataSet', - MagicMock(name='nwb_data_set')) as nwb_data_set: - with patch('allensdk.model.biophysical.runner.copy', - MagicMock(name='shutil_copy')) as cp: - with patch('allensdk.model.biophysical.utils.create_utils', - return_value=mock_utils) as cu: - with patch(builtins.__name__ + ".open", - mock_open( - read_data=MANIFEST_JSON)): - fit_description = Config().load('manifest.json') - Utils.description = fit_description - run_simulate.simulate() diff --git a/allensdk/test/internal/brain_observatory/test_roi_filter_utils.py b/allensdk/test/internal/brain_observatory/test_roi_filter_utils.py deleted file mode 100644 index 835dc0f9fc..0000000000 --- a/allensdk/test/internal/brain_observatory/test_roi_filter_utils.py +++ /dev/null @@ -1,43 +0,0 @@ -import pytest - -from allensdk.internal.brain_observatory.roi_filter_utils import ( - get_indices_by_distance) - - -@pytest.mark.parametrize( - "tree_points, query_points, expected, exception", - [ - ( - [[0, 0], [0, 1], [0, 2], [1, 2], [2, 2]], - [[0, 0], [2, 2]], - [0, 4], - None - ), - ( - [[0, 0], [0, 1], [0, 2], [1, 2], [2, 2]], - [[0, 0.4], [0.1, 0.6]], - [0, 1], - pytest.raises(AssertionError, - match="Max match distance greater than 0") - ), - ( - [], - [], - [], - pytest.raises(ValueError, - match=("number of dimensions is incorrect. " - "Expected 2 got 1")) - ) - ]) -def test_get_indices_by_distance(tree_points, query_points, - expected, exception): - """tests exceptions with simple 2D vectors. Actual code has 5D vectors - for a basic cell-matching to [minx, miny, maxx, maxy, area] - """ - if exception is None: - indices = get_indices_by_distance(query_points, tree_points) - assert all([e == i for e, i in zip(expected, indices)]) - else: - with exception: - indices = get_indices_by_distance(query_points, tree_points) - assert all([e == i for e, i in zip(expected, indices)]) diff --git a/allensdk/test/internal/brain_observatory/test_run_ophys_time_sync.py b/allensdk/test/internal/brain_observatory/test_run_ophys_time_sync.py deleted file mode 100644 index dd01684db5..0000000000 --- a/allensdk/test/internal/brain_observatory/test_run_ophys_time_sync.py +++ /dev/null @@ -1,158 +0,0 @@ -""" Tests for the executable that synchronizes distinct data streams within an -ophys experiment. For tests of the logic used by this executable, see -test_time_sync -""" - -import os -import json -from typing import NamedTuple - -import pytest -import numpy as np -import h5py - -import allensdk -from allensdk.internal.pipeline_modules.run_ophys_time_sync import ( - TimeSyncOutputs, TimeSyncWriter, check_stimulus_delay, run_ophys_time_sync -) - - -@pytest.fixture -def outputs(): - return TimeSyncOutputs( - 100, - 0.35, - 0, - 1, - 2, - 3, - np.linspace(0, 1, 10), - np.linspace(1, 2, 10), - np.linspace(2, 3, 10), - np.linspace(3, 4, 10), - np.arange(10), - np.arange(10, 20), - np.arange(20, 30) - ) - -@pytest.fixture -def writer(tmpdir_factory): - tmpdir_path = str(tmpdir_factory.mktemp("run_ophys_time_sync_tests")) - return TimeSyncWriter( - os.path.join(tmpdir_path, "data.h5"), - os.path.join(tmpdir_path, "output.json") - ) - - -def test_validate_paths_writable(writer): - try: - writer.validate_paths() - except Exception as err: - pytest.fail(f"expected no error. Got: {err.__class__.__name__}(\"{err}\")") - - -@pytest.mark.parametrize("h5_key,expected", [ - ["stimulus_alignment", np.arange(10)], - ["eye_tracking_alignment", np.arange(10, 20)], - ["body_camera_alignment", np.arange(20, 30)], - ["twop_vsync_fall", np.linspace(0, 1, 10)], - ["ophys_delta", 0], - ["stim_delta", 1], - ["stim_delay", 0.35], - ["eye_delta", 2], - ["behavior_delta", 3] -]) -def test_write_output_h5(writer, outputs, h5_key, expected): - - writer.write_output_h5(outputs) - - with h5py.File(writer.output_h5_path, "r") as obtained_file: - obtained = obtained_file[h5_key] - - if isinstance(expected, np.ndarray): - assert np.allclose(obtained, expected) - else: - assert obtained.value == expected - - -@pytest.mark.parametrize("json_key,expected", [ - ["allensdk_version", allensdk.__version__], - ["experiment_id", 100], - ["ophys_delta", 0], - ["stim_delta", 1], - ["stim_delay", 0.35], - ["eye_delta", 2], - ["behavior_delta", 3] -]) -def test_write_output_json(writer, outputs, json_key, expected): - - writer.write_output_json(outputs) - - with open(writer.output_json_path, "r") as jf: - obtained_dict = json.load(jf) - obtained = obtained_dict[json_key] - - assert obtained == expected - - -@pytest.mark.parametrize("obt", np.linspace(0, 1, 4)) -@pytest.mark.parametrize("mn", np.linspace(0, 1, 4)) -@pytest.mark.parametrize("mx", np.linspace(0, 1, 4)) -def test_check_stimulus_delay(obt, mn, mx): - - if obt < mn or obt > mx: - with pytest.raises(ValueError): - check_stimulus_delay(obt, mn, mx) - else: - check_stimulus_delay(obt, mn, mx) - - -def test_run_ophys_time_sync(): - - class Aligner(NamedTuple): - corrected_stim_timestamps: np.ndarray - corrected_ophys_timestamps: np.ndarray - corrected_eye_video_timestamps: np.ndarray - corrected_behavior_video_timestamps: np.ndarray - - aligner = Aligner( - (np.arange(10), 0, 0.5), - (np.arange(10), 1), - (np.arange(10), 2), - (np.arange(10), 3) - ) - - obtained = run_ophys_time_sync(aligner, 100, 0.0, 2.0) - - # store mismatches in an array so we can show every distinct failure - mismatches = [] - for name, expected in [ - ["experiment_id", 100], - ["stimulus_delay", 0.5], - ["ophys_delta", 1], - ["stimulus_delta", 0], - ["eye_delta", 2], - ["behavior_delta", 3], - ["ophys_times", np.arange(10)], - ["stimulus_times", np.arange(10)], - ["eye_times", np.arange(10)], - ["behavior_times", np.arange(10)], - ["stimulus_alignment", np.arange(10)], - ["eye_alignment", np.arange(10)], - ["behavior_alignment", np.arange(10)] - ]: - - current_obt = getattr(obtained, name) - - if isinstance(expected, np.ndarray): - match = np.allclose(expected, current_obt) - else: - match = expected == current_obt - - if not match: - mismatches.append( - f"{name} mismatched: expected {expected}, " - f"obtained {current_obt}" - ) - - assert len(mismatches) == 0, "\n" + "\n".join(mismatches) \ No newline at end of file diff --git a/allensdk/test/internal/brain_observatory/test_time_sync.py b/allensdk/test/internal/brain_observatory/test_time_sync.py deleted file mode 100644 index f332cd0fd1..0000000000 --- a/allensdk/test/internal/brain_observatory/test_time_sync.py +++ /dev/null @@ -1,693 +0,0 @@ -import pytest -import numpy as np -import json -import os -import h5py -from pkg_resources import resource_filename -from mock import patch -from allensdk.internal.brain_observatory import time_sync as ts -from allensdk.internal.pipeline_modules import run_ophys_time_sync -from allensdk.brain_observatory.sync_dataset import Dataset - - -ASSUMED_DELAY = 0.0351 - - -data_file = resource_filename(__name__, "time_sync_test_data.json") -test_data = json.load(open(data_file, "r")) - -data_skip = False -if not os.path.exists(test_data["nikon"]["sync_file"]): - data_skip = True - -# Functions from lims2_modules ophys_time_sync.py for regression testing - -MIN_BOUND = .03 -MAX_BOUND = .04 - - -mock_keys = { - "photodiode": "photodiode", - "2p": "2p_vsync", - "stimulus": "stim_vsync", - "eye_camera": "cam2_exposure", - "behavior_camera": "cam1_exposure", - "acquiring": "2p_acquiring", - "lick_sensor": "lick_1" -} - - -class MockSyncDataset(Dataset): - """ - Mock the Dataset class so it doesn't load an h5 file upon - initialization. - """ - def __init__(self, data, line_labels=None): - self.dfile = data - self.line_labels = line_labels - - -def mock_get_real_photodiode_events(data, key): - return data - - -def mock_get_events_by_line(line, units="seconds"): - return line - - -def calculate_stimulus_alignment(stim_time, valid_twop_vsync_fall): - stimulus_alignment = np.empty(len(stim_time)) - - for index in range(len(stim_time)): - crossings = np.nonzero( - np.ediff1d( - np.sign(valid_twop_vsync_fall - stim_time[index])) > 0) - try: - stimulus_alignment[index] = int(crossings[0][0]) - except: # noqa: E722 - stimulus_alignment[index] = np.NaN - - return stimulus_alignment - - -def calculate_valid_twop_vsync_fall(sync_data, sample_frequency): - twop_vsync_fall = sync_data.get_falling_edges('2p_vsync') /\ - sample_frequency - - if len(twop_vsync_fall) == 0: - raise ValueError('Error: twop_vsync_fall length is 0, possible ' - 'invalid, missing, and/or bad data') - - ophys_start = twop_vsync_fall[0] - valid_twop_vsync_fall = twop_vsync_fall[np.where( - twop_vsync_fall > ophys_start)[0]] - - return valid_twop_vsync_fall - - -def calculate_stim_vsync_fall(sync_data, sample_frequency): - stim_vsync_fall = sync_data.get_falling_edges('stim_vsync')[0:] /\ - sample_frequency - return stim_vsync_fall - - -def find_start(twop_vsync_fall): - start_index = 0 - - in_start_frames = True - found_start = False - - prev_value = None - index = 0 - for value in twop_vsync_fall: - if not found_start: - if prev_value is not None: - diff = value - prev_value - if diff < MIN_BOUND or diff > MAX_BOUND: - if in_start_frames: - in_start_frames = False - elif not in_start_frames: - found_start = True - start_index = index - - prev_value = value - index += 1 - - return start_index - - -def sync_camera_stimulus(sync_data, sample_frequency, camera, - ophys_experiment_id): - twop_vsync_fall = sync_data.get_falling_edges('2p_vsync') /\ - sample_frequency - - if len(twop_vsync_fall) == 0: - raise ValueError('Error: twop_vsync_fall length is 0, ' - 'possible invalid, missing, and/or bad data') - - try: - twop_acquiring = sync_data.get_rising_edges('2p_acquiring') - ophys_start = twop_acquiring / sample_frequency - except: # noqa: E722 - ophys_start = [find_start(twop_vsync_fall)] - - twop_vsync_fall = twop_vsync_fall[np.where( - twop_vsync_fall > ophys_start)[0]] - - cam_fall = None - - if camera == 1: - cam_fall = sync_data.get_falling_edges('cam1_exposure') /\ - sample_frequency - elif camera == 2: - cam_fall = sync_data.get_falling_edges('cam2_exposure') /\ - sample_frequency - else: - raise ValueError(f'Error: camera value {camera} is invalid') - - frames = np.zeros((len(twop_vsync_fall), 1)) - - for i in range(len(frames)): - crossings = np.nonzero( - np.ediff1d(np.sign(cam_fall - twop_vsync_fall[i])) > 0) - try: - frames[i] = crossings[0][0] - except: # noqa: E722 - frames[i] = np.NaN - - return frames - -# End of regression functions - - -@pytest.fixture -def nikon_input(): - input_data = test_data["nikon"].copy() - input_data.pop("ophys_experiment_id") - return input_data - - -@pytest.fixture -def scientifica_input(): - input_data = test_data["scientifica"].copy() - input_data.pop("ophys_experiment_id") - return input_data - - -@pytest.fixture -def input_json(tmpdir_factory): - output_file = str(tmpdir_factory.mktemp("test").join("output.h5")) - input_data = test_data["nikon"].copy() - input_data['output_file'] = output_file - json_file = str(tmpdir_factory.mktemp("test").join("input.json")) - with open(json_file, "w") as f: - json.dump(input_data, f) - - return json_file - - -def test_get_alignment_array(): - bigger = np.linspace(0, 5, 300) - smaller = np.linspace(0.2, 3, 50) - - alignment = ts.get_alignment_array(bigger, smaller) - assert np.all(~np.isnan(alignment)) - assert np.all(bigger[alignment.astype(int)] < smaller) - - alignment = ts.get_alignment_array(smaller, bigger) - assert np.all(np.isnan(alignment[bigger <= 0.2])) - assert np.all(np.isnan(alignment[bigger >= 50])) - big_idx = np.where(~np.isnan(alignment))[0] - small_idx = alignment[big_idx].astype(int) - assert np.all(smaller[small_idx] < bigger[big_idx]) - - -@pytest.mark.skipif(data_skip, reason="No sync or data") -def test_regression_valid_2p_timestamps(nikon_input, scientifica_input): - sync_file = nikon_input.pop("sync_file") - aligner = ts.OphysTimeAligner(sync_file, **nikon_input) - freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] - old_times = calculate_valid_twop_vsync_fall(aligner.dataset, freq) - new_times = aligner.ophys_timestamps - assert np.allclose(new_times[1:], old_times) - - # old scientifica used falling edges as timestamps incorrectly - sync_file = scientifica_input.pop("sync_file") - aligner = ts.OphysTimeAligner(sync_file, **scientifica_input) - freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] - old_times = calculate_valid_twop_vsync_fall(aligner.dataset, freq) - new_times = aligner.ophys_timestamps - assert len(new_times) - len(old_times) == 1 - assert np.all(new_times[1:] < old_times) - assert np.all(new_times[2:] > old_times[:-1]) - - -@pytest.mark.skipif(data_skip, reason="No sync or data") -def test_regression_stim_timestamps(nikon_input, scientifica_input): - for input_data in [nikon_input, scientifica_input]: - sync_file = input_data.pop("sync_file") - aligner = ts.OphysTimeAligner(sync_file, **input_data) - freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] - old_times = calculate_stim_vsync_fall(aligner.dataset, freq) - assert np.allclose(aligner.stim_timestamps, old_times) - - -@pytest.mark.skipif(data_skip, reason="No sync or data") -def test_regression_calculate_stimulus_alignment(nikon_input, - scientifica_input): - for input_data in [nikon_input, scientifica_input]: - sync_file = input_data.pop("sync_file") - aligner = ts.OphysTimeAligner(sync_file, **input_data) - old_align = calculate_stimulus_alignment(aligner.stim_timestamps, - aligner.ophys_timestamps) - new_align = ts.get_alignment_array(aligner.ophys_timestamps, - aligner.stim_timestamps) - - # Old alignment assigned simultaneous stim frames to the previous ophys - # frame. Methods should only differ when ophys and stim are identical. - mismatch = old_align != new_align - mis_o = aligner.ophys_timestamps[new_align[mismatch].astype(int)] - mis_s = aligner.stim_timestamps[mismatch] - assert np.all(mis_o == mis_s) - # Occurence of mismatch should be rare - assert len(mis_o) < 0.005*len(aligner.ophys_timestamps) - - -@pytest.mark.skipif(data_skip, reason="No sync or data") -def test_regression_calculate_camera_alignment(nikon_input, - scientifica_input): - for input_data in [nikon_input, scientifica_input]: - sync_file = input_data.pop("sync_file") - aligner = ts.OphysTimeAligner(sync_file, **input_data) - freq = aligner.dataset.meta_data['ni_daq']['counter_output_freq'] - old_eye_align = sync_camera_stimulus(aligner.dataset, freq, 2, 1) - # old alignment throws out the first ophys timestamp - new_eye_align = ts.get_alignment_array(aligner.eye_video_timestamps, - aligner.ophys_timestamps[1:], - int_method=np.ceil) - mismatch = np.where(old_eye_align[:, 0] != new_eye_align) - mis_e = \ - aligner.eye_video_timestamps[new_eye_align[mismatch].astype(int)] - mis_o = aligner.ophys_timestamps[1:][mismatch] - mis_o_plus = aligner.ophys_timestamps[1:][(mismatch[0]+1,)] - # New method should only disagree when old method was wrong (old method - # set an eye tracking frame to an earlier ophys frame). - assert np.all(mis_o < mis_e) - assert np.all(mis_o_plus >= mis_e) - # Occurence of mismatch should be rare - assert len(mis_o) < 0.005*len(aligner.ophys_timestamps[1:]) - - -@pytest.mark.parametrize("eye_data_length", (None, 5000, 6000)) -def test_get_corrected_eye_times(eye_data_length): - true_times = np.arange(6000) - - with patch.object(ts, "get_keys", return_value=mock_keys): - with patch.object(ts.Dataset, "load"): - aligner = ts.OphysTimeAligner("test") - - aligner.eye_data_length = eye_data_length - with patch.object(ts.Dataset, "get_falling_edges", - return_value=true_times) as mock_falling: - with patch("logging.info") as mock_log: - times, delta = aligner.corrected_eye_video_timestamps - - if eye_data_length != 6000: - mock_log.assert_called_once() - else: - assert mock_log.call_count == 0 - - mock_falling.assert_called_once() - assert np.all(times == true_times) - - if eye_data_length is None: - assert delta == 0 - else: - assert delta == (len(true_times) - eye_data_length) - - -@pytest.mark.parametrize("behavior_data_length", (None, 5000, 6000)) -def test_get_corrected_behavior_times(behavior_data_length): - true_times = np.arange(6000) - - with patch.object(ts, "get_keys", return_value=mock_keys): - with patch.object(ts.Dataset, "load"): - aligner = ts.OphysTimeAligner("test") - - aligner.behavior_data_length = behavior_data_length - with patch.object(ts.Dataset, "get_falling_edges", - return_value=true_times) as mock_falling: - with patch("logging.info") as mock_log: - times, delta = aligner.corrected_behavior_video_timestamps - - if behavior_data_length != 6000: - mock_log.assert_called_once() - else: - assert mock_log.call_count == 0 - - mock_falling.assert_called_once() - assert np.all(times == true_times) - - if behavior_data_length is None: - assert delta == 0 - else: - assert delta == (len(true_times) - behavior_data_length) - - -@pytest.mark.parametrize("stim_data_length,start_delay", [ - (None, False), - (None, True), - (5000, False), - (5000, True), - (6000, False), - (6000, True) - ]) -def test_get_corrected_stim_times(stim_data_length, start_delay): - true_falling = np.arange(0, 60, 0.01) - true_rising = true_falling + 0.005 - if start_delay: - true_falling[0] -= 3 - true_rising[0] -= 3 - - with patch.object(ts, "get_keys", return_value=mock_keys): - with patch.object(ts.Dataset, "load"): - aligner = ts.OphysTimeAligner("test") - - aligner.stim_data_length = stim_data_length - with patch.object(ts, "calculate_monitor_delay", - return_value=ASSUMED_DELAY): - with patch.object(ts.Dataset, "get_falling_edges", - return_value=true_falling): - with patch.object(ts.Dataset, "get_rising_edges", - return_value=true_rising) as mock_rising: - with patch("logging.info") as mock_log: - times, delta, stim_delay = \ - aligner.corrected_stim_timestamps - - if stim_data_length is None: - mock_log.assert_called_once() - assert mock_rising.call_count == 0 - assert delta == 0 - elif stim_data_length != len(true_falling) and start_delay: - mock_rising.assert_called_once() - assert mock_log.call_count == 2 - assert len(times) == len(true_falling) - 1 - assert delta == len(true_falling) - 1 - stim_data_length - assert np.all(times == true_falling[1:] + ASSUMED_DELAY) - elif stim_data_length != len(true_falling): - mock_rising.assert_called_once() - mock_log.assert_called_once() - assert delta == len(true_falling) - stim_data_length - assert np.all(times == true_falling + ASSUMED_DELAY) - else: - assert mock_rising.call_count == 0 - assert np.all(times == true_falling + ASSUMED_DELAY) - assert mock_log.call_count == 0 - assert delta == 0 - - -@pytest.mark.parametrize("ophys_data_length", (None, 5000, 6000, 7000)) -def test_get_corrected_ophys_times_nikon(ophys_data_length): - true_times = np.arange(6000) - - with patch.object(ts, "get_keys", return_value=mock_keys): - with patch.object(ts.Dataset, "load"): - aligner = ts.OphysTimeAligner("test", "NIKONA1RMP") - - aligner.ophys_data_length = ophys_data_length - with patch.object(ts.Dataset, "get_falling_edges", - return_value=true_times): - with patch.object(ts.Dataset, "get_rising_edges", - return_value=[0]): - with patch("logging.info") as mock_log: - if ophys_data_length is not None and \ - ophys_data_length > len(true_times): - with pytest.raises(ValueError): - times, delta = aligner.corrected_ophys_timestamps - else: - times, delta = aligner.corrected_ophys_timestamps - if ophys_data_length is None: - assert np.all(times == true_times) - mock_log.assert_called_once() - assert delta == 0 - elif ophys_data_length != len(true_times): - assert np.all(times == true_times[:-delta]) - mock_log.assert_called_once() - else: - assert mock_log.call_count == 0 - assert np.all(times == true_times) - - aligner.scanner = "bad" - with pytest.raises(ValueError): - aligner.corrected_ophys_timestamps - - -@pytest.mark.skipif(data_skip, reason="No sync or data") -def test_module(input_json): - with patch("sys.argv", ["test_run", input_json]): - with patch("logging.info"): - run_ophys_time_sync.main() - - with open(input_json, "r") as f: - input_data = json.load(f) - - output_file = input_data.pop("output_file") - assert os.path.exists(output_file) - - input_data.pop("ophys_experiment_id") - sync_file = input_data.pop("sync_file") - aligner = ts.OphysTimeAligner(sync_file, **input_data) - with h5py.File(output_file) as f: - t, d = aligner.corrected_ophys_timestamps - assert np.all(t == f['twop_vsync_fall'].value) - assert np.all(d == f['ophys_delta'].value) - st, sd, stim_delay = aligner.corrected_stim_timestamps - align = ts.get_alignment_array(t, st) - assert np.allclose(align, f['stimulus_alignment'].value, - equal_nan=True) - assert np.all(sd == f['stim_delta'].value) - et, ed = aligner.corrected_eye_video_timestamps - align = ts.get_alignment_array(et, t, int_method=np.ceil) - assert np.allclose(align, f['eye_tracking_alignment'].value, - equal_nan=True) - assert np.all(ed == f['eye_delta'].value) - bt, bd = aligner.corrected_behavior_video_timestamps - align = ts.get_alignment_array(bt, t, int_method=np.ceil) - assert np.allclose(align, f['body_camera_alignment'].value, - equal_nan=True) - - -@pytest.mark.parametrize( - "sync_dset,stim_times,transition_interval,expected", - [ - (np.array([1.0, 2.0, 3.0, 4.0, 5.0]), - np.array([0.99, 1.99, 2.99, 3.99, 4.99]), 1, 0.01), - (np.array([1.0, 2.0, 3.0, 4.0]), - np.array([0.95, 2.0, 2.95, 4.0]), 1, 0.025), - (np.array([1.0]), np.array([1.0]), 1, 0.0) - ], -) -def test_monitor_delay(sync_dset, stim_times, transition_interval, expected, - monkeypatch): - monkeypatch.setattr(ts, "get_real_photodiode_events", - mock_get_real_photodiode_events) - pytest.approx(expected, - ts.calculate_monitor_delay(sync_dset, stim_times, "key", - transition_interval)) - - -@pytest.mark.parametrize( - "sync_dset,stim_times,transition_interval", - [ - # Negative - (np.array([1.0, 2.0, 3.0]), np.array([0.9, 1.9, 2.9]), 1,), - # Too big - (np.array([1.0, 2.0, 3.0, 4.0]), np.array([1.1, 2.1, 3.1, 4.1]), 1,), - ], -) -def test_monitor_delay_raises_error( - sync_dset, stim_times, transition_interval, - monkeypatch): - monkeypatch.setattr(ts, "get_real_photodiode_events", - mock_get_real_photodiode_events) - with pytest.raises(ValueError): - ts.calculate_monitor_delay(sync_dset, stim_times, - "key", transition_interval) - - -@pytest.mark.parametrize( - "arr,cond,n,expected", - [ - (np.array([1, 1, 1, 2]), lambda x: x < 2, 3, 0), - (np.array([2, 1, 1, 1]), lambda x: x < 2, 3, 1), - (np.array([1, 2, 2, 1, 1]), lambda x: x >= 1, 2, 0), - (np.array([]), lambda x: x < 1, 1, None), - (np.array([1, 2, 3]), lambda x: x < 3, 4, None), - (np.array([1, 2, 2, 3, 2]), lambda x: x == 2, 3, None), - ] -) -def test_find_n(arr, cond, n, expected): - assert expected == ts._find_n(arr, n, cond) - - -@pytest.mark.parametrize( - "arr,cond,n,expected", - [ - (np.array([1, 1, 1, 2]), lambda x: x < 2, 3, 2), - (np.array([2, 1, 1, 1]), lambda x: x < 2, 3, 3), - (np.array([1, 2, 2, 1, 1]), lambda x: x >= 1, 2, 4), - (np.array([]), lambda x: x < 1, 1, None), - (np.array([1, 2, 3]), lambda x: x < 3, 4, None), - (np.array([1, 2, 2, 3, 2]), lambda x: x == 2, 3, None), - ] -) -def test_find_last_n(arr, cond, n, expected): - assert expected == ts._find_last_n(arr, n, cond) - - -@pytest.mark.parametrize( - "sync_dset,expected", - [ - ([0.25, 0.5, 0.75, 1., 2., 3., 5., 5.75], [1., 2., 3.]), - ([1., 2., 3., 4.], [1., 2., 3., 4.]), - # false alarm start - ([0.25, 1., 2., 2.1, 2.2, 3., 4., 5.], [3., 4., 5.]), - # false alarm end - ([0.25, 1., 2., 3., 4., 4.5, 5.1, 6.1], [1., 2., 3., 4.]), - ], -) -def test_get_photodiode_events(sync_dset, expected, monkeypatch): - ds = MockSyncDataset(sync_dset) - monkeypatch.setattr(ds, "get_events_by_line", mock_get_events_by_line) - np.testing.assert_array_equal( - expected, ts.get_photodiode_events(ds, sync_dset)) - - -@pytest.mark.parametrize( - "sync_dset,", - [ - ([]), - ([0.25, 0.25]), - ([1., 2.]), - ] -) -def test_photodiode_events_error_if_none_found(sync_dset, monkeypatch): - ds = MockSyncDataset(sync_dset) - monkeypatch.setattr(ds, "get_events_by_line", mock_get_events_by_line) - with pytest.raises(ValueError): - ts.get_photodiode_events(ds, sync_dset) - - -@pytest.mark.parametrize("deserialized_pkl,expected", [ - ({"vsynccount": 100}, 100), - ({"items": {"behavior": {"intervalsms": [2, 2, 2, 2, 2]}}}, 6), - ({"vsynccount": 20, "items": {"behavior": {"intervalsms": [3, 3]}}}, 20) -]) -def test_get_stim_data_length(monkeypatch, deserialized_pkl, expected): - def mock_read_pickle(*args, **kwargs): - return deserialized_pkl - - monkeypatch.setattr(ts.pd, "read_pickle", mock_read_pickle) - obtained = ts.get_stim_data_length("dummy_filepath") - - assert obtained == expected - - -@pytest.mark.parametrize( - "sync_dset, line_labels, expected_line_labels, expected_log", - [ - (None, ['2p_vsync', 'stim_vsync', 'stim_photodiode', - 'acq_trigger', '', 'cam1_exposure', - 'cam2_exposure', 'lick_sensor'], - { - "photodiode": "stim_photodiode", - "2p": "2p_vsync", - "stimulus": "stim_vsync", - "eye_camera": "cam2_exposure", - "behavior_camera": "cam1_exposure", - "lick_sensor": "lick_sensor", - "acquiring": "acq_trigger"}, - []), - (None, ['2p_vsync', 'stim_vsync', 'photodiode', - 'acq_trigger', 'behavior_monitoring', - 'eye_tracking', 'lick_1'], - { - "photodiode": "photodiode", - "2p": "2p_vsync", - "stimulus": "stim_vsync", - "eye_camera": "eye_tracking", - "behavior_camera": "behavior_monitoring", - "lick_sensor": "lick_1", - "acquiring": "acq_trigger"}, - []), - (None, ['2p_vsync', 'stim_vsync', 'photodiode', - 'acq_trigger', '', 'behavior_monitoring', - 'lick_1'], - { - "photodiode": "photodiode", - "2p": "2p_vsync", - "stimulus": "stim_vsync", - "behavior_camera": "behavior_monitoring", - "lick_sensor": "lick_1", - "acquiring": "acq_trigger"}, - [('root', 30, 'Could not find valid lines for the ' - 'following data sources'), - ('root', 30, "eye_camera (valid line label(s) = " - "['cam2_exposure', 'eye_tracking', " - "'eye_frame_received']")]), - (None, [], - {}, - [('root', 30, - 'Could not find valid lines for the ' - 'following data sources'), - ('root', 30, - "photodiode (valid line label(s) = " - "['stim_photodiode', 'photodiode']"), - ('root', 30, - "2p (valid line label(s) = ['2p_vsync']"), - ('root', 30, - "stimulus (valid line label(s) = " - "['stim_vsync', 'vsync_stim']"), - ('root', 30, - "eye_camera (valid line label(s) = " - "['cam2_exposure', 'eye_tracking', 'eye_frame_received']"), - ('root', 30, "behavior_camera (valid line label(s) " - "= ['cam1_exposure', " - "'behavior_monitoring', " - "'beh_frame_received']"), - ('root', 30, "acquiring (valid line label(s) = " - "['2p_acquiring', 'acq_trigger']"), - ('root', 30, "lick_sensor (valid line label(s) = " - "['lick_1', 'lick_sensor']")]), - (None, ['', 'stim_vsync', 'photodiode', 'acq_trigger', - 'eye_tracking', 'lick_1', 'acq_trigger', - 'cam1_exposure'], - { - "photodiode": "photodiode", - "stimulus": "stim_vsync", - "eye_camera": "eye_tracking", - "behavior_camera": "cam1_exposure", - "lick_sensor": "lick_1", - "acquiring": "acq_trigger"}, - [('root', 30, 'Could not find valid lines for the ' - 'following data sources'), - ('root', 30, "2p (valid line label(s) = " - "['2p_vsync']")]), - (None, ['barcode_ephys', 'vsync_stim', - 'stim_photodiode', 'stim_running', - 'beh_frame_received', 'eye_frame_received', - 'face_frame_received', 'stim_running_opto', - 'stim_trial_opto', 'face_came_frame_readout', - 'eye_cam_frame_readout', - 'beh_cam_frame_readout', 'face_cam_exposing', - 'eye_cam_exposing', 'beh_cam_exposing', - 'lick_sensor'], - { - "photodiode": "stim_photodiode", - "stimulus": "vsync_stim", - "eye_camera": "eye_frame_received", - "behavior_camera": "beh_frame_received", - "lick_sensor": "lick_sensor"}, - [('root', 30, 'Could not find valid lines for the ' - 'following data sources'), - ('root', 30, "2p (valid line label(s) = " - "['2p_vsync']"), - ('root', 30, "acquiring (valid line label(s) = " - "['2p_acquiring', 'acq_trigger']")]) - ]) -def test_get_keys(sync_dset, line_labels, expected_line_labels, expected_log, - caplog): - """ - Test Cases: - 1) Test Case with V2 keys - 2) Test Case with V1 keys - 3) Test Case with eye camera key missing - 4) Test Case with all keys missing - 5) Test Case with 2p key missing - 6) Test Case with V3 keys - - """ - ds = MockSyncDataset(None, line_labels) - keys = ts.get_keys(ds) - assert keys == expected_line_labels - assert caplog.record_tuples == expected_log diff --git a/allensdk/test/internal/brain_observatory/time_sync_test_data.json b/allensdk/test/internal/brain_observatory/time_sync_test_data.json deleted file mode 100644 index 38260eb667..0000000000 --- a/allensdk/test/internal/brain_observatory/time_sync_test_data.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "nikon": { - "scanner": "NIKONA1RMP", - "sync_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_sync.h5", - "dff_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_dff.h5", - "stimulus_pkl": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_stim.pkl", - "eye_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_video-1.avi", - "behavior_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/501254258_video-0.avi", - "ophys_experiment_id": 501254258 - }, - "scientifica": { - "scanner": "SCIVIVO", - "sync_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_sync.h5", - "dff_file": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_dff.h5", - "stimulus_pkl": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_stim.pkl", - "eye_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_video-1.avi", - "behavior_video": "/allen/aibs/informatics/module_test_data/observatory/time_sync/547573479_video-0.avi", - "ophys_experiment_id": 547573479 - } -} \ No newline at end of file diff --git a/allensdk/test/internal/conftest.py b/allensdk/test/internal/conftest.py deleted file mode 100644 index 94bc19245a..0000000000 --- a/allensdk/test/internal/conftest.py +++ /dev/null @@ -1,9 +0,0 @@ -import os - -import pytest - - -def pytest_ignore_collect(path, config): - ''' These tests (or the code they test) can only run on the local network at the Allen Institute for Brain Science. - ''' - return(os.getenv('TEST_COMPLETE') != 'true') and (os.getenv('TEST_INTERNAL') != 'true') diff --git a/allensdk/test/internal/core/test_mouse_connectivity_cache_prerelease.py b/allensdk/test/internal/core/test_mouse_connectivity_cache_prerelease.py deleted file mode 100644 index 6d978b55ff..0000000000 --- a/allensdk/test/internal/core/test_mouse_connectivity_cache_prerelease.py +++ /dev/null @@ -1,204 +0,0 @@ -import os - -import mock -import pytest -import nrrd -import numpy as np -import pandas as pd - -from allensdk.core import json_utilities - -from allensdk.internal.core.mouse_connectivity_cache_prerelease \ - import MouseConnectivityCachePrerelease - - -@pytest.fixture(scope='function') -def mcc(fn_temp_dir): - storage_dirs = {"111" : os.path.join(fn_temp_dir, "111"), - "222" : os.path.join(fn_temp_dir, "222")} - - file_name = os.path.join(fn_temp_dir, 'storage_directories.json') - json_utilities.write(file_name, storage_dirs) - - manifest_path = os.path.join(fn_temp_dir, 'manifest.json') - return MouseConnectivityCachePrerelease( - manifest_file=manifest_path, storage_directories_file_name=file_name) - -@pytest.fixture -def experiments(): - return [{'id':111, - 'age' : "10 wks", - 'gender' : "M", - 'project_code' : "Connectional Atlas", - 'specimen_name' : "", - 'transgenic_line' : "", - 'workflow_state' : "passed", - 'workflows' : ["2P Serial Imaging"], - 'structure_id' : 184, - 'structure_name' : "Frontal pole, cerebral cortex", - 'structure_abbrev' : "FRP", - 'injection_structures' : [ - {'id' : 184, - 'name' : "Frontal pole, cerebral cortex", - 'abbreviation' : 'FRP'}, - {'id' : 993, - 'name' : "Secondary motor area", - 'abbreviation' : 'MOs'}]}] - -@pytest.mark.prerelease -def test_init(mcc, fn_temp_dir): - manifest_path = os.path.join(fn_temp_dir, 'manifest.json') - assert os.path.exists(manifest_path) - - -@pytest.mark.prerelease -def test_get_projection_density(mcc, fn_temp_dir): - eye = np.eye(100) - eid = 111 - path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'projection_density_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_projection_density(eid) - - with mock.patch.object(mcc.api.grid_data_api.api, - "retrieve_file_from_storage") as mock_rtrv: - mcc.get_projection_density(eid) - - mock_rtrv.assert_not_called() - assert np.allclose(obtained, eye) - assert os.path.exists(path) - - -@pytest.mark.prerelease -def test_get_injection_density(mcc, fn_temp_dir): - eye = np.eye(100) - eid = 111 - path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'injection_density_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_injection_density(eid) - - with mock.patch.object(mcc.api.grid_data_api.api, - "retrieve_file_from_storage") as mock_rtrv: - mcc.get_injection_density(eid) - - mock_rtrv.assert_not_called() - assert np.allclose(obtained, eye) - assert os.path.exists(path) - - -@pytest.mark.prerelease -def test_get_injection_fraction(mcc, fn_temp_dir): - eye = np.eye(100) - eid = 111 - path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'injection_fraction_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_injection_fraction(eid) - - with mock.patch.object(mcc.api.grid_data_api.api, - "retrieve_file_from_storage") as mock_rtrv: - mcc.get_injection_fraction(eid) - - mock_rtrv.assert_not_called() - assert np.allclose(obtained, eye) - assert os.path.exists(path) - - -@pytest.mark.prerelease -def test_get_data_mask(mcc, fn_temp_dir): - eye = np.eye(100) - eid = 111 - path = os.path.join(fn_temp_dir, 'experiment_{0}'.format(eid), - 'data_mask_25.nrrd') - - with mock.patch('allensdk.internal.api.api_prerelease.ApiPrerelease.' - 'retrieve_file_from_storage', - new=lambda a, b, c: nrrd.write(c, eye)): - obtained, _ = mcc.get_data_mask(eid) - - with mock.patch.object(mcc.api.grid_data_api.api, - "retrieve_file_from_storage") as mock_rtrv: - mcc.get_data_mask(eid) - - mock_rtrv.assert_not_called() - assert np.allclose(obtained, eye) - assert os.path.exists(path) - - -@pytest.mark.prerelease -def test_filter_experiments(mcc, experiments): - - # ------------------------------------------------------------------------ - # test cre - cre = mcc.filter_experiments(experiments, cre=True) - wt = mcc.filter_experiments(experiments, cre=False) - - assert not cre - assert len(wt) == 1 - - # ------------------------------------------------------------------------ - # test injection_structure_ids - sid_line = mcc.filter_experiments(experiments, injection_structure_ids=[184, 98]) - - assert len(sid_line) == 1 - - # ------------------------------------------------------------------------ - # test age - pass_age = mcc.filter_experiments(experiments, age=['10 wks', '12 wks']) - fail_age = mcc.filter_experiments(experiments, age=['12 wks']) - - assert len(pass_age) == 1 - assert not fail_age - - # ------------------------------------------------------------------------ - # test gender - pass_gender = mcc.filter_experiments(experiments, gender=['MALE']) - fail_gender = mcc.filter_experiments(experiments, gender=['f']) - - assert len(pass_gender) == 1 - assert not fail_gender - - # ------------------------------------------------------------------------ - # test workflow-sate - pass_ws = mcc.filter_experiments(experiments, workflow_state=['qc', 'passed']) - fail_ws = mcc.filter_experiments(experiments, workflow_state=['failed']) - - assert len(pass_ws) == 1 - assert not fail_ws - - # ------------------------------------------------------------------------ - # test workflows - pass_w = mcc.filter_experiments(experiments, workflows=['2P SERial ImaGing']) - fail_w = mcc.filter_experiments(experiments, workflows=['trans-synaptic']) - - assert len(pass_w) == 1 - assert not fail_w - - # ------------------------------------------------------------------------ - # test project_code - pass_pc = mcc.filter_experiments(experiments, project_code=['ConNECTIOnal Atlas']) - fail_pc = mcc.filter_experiments(experiments, project_code=['not a code']) - - assert len(pass_pc) == 1 - assert not fail_pc - - # ------------------------------------------------------------------------ - # test a bunch - conditions = dict(injection_structure_ids=[184, 98], - age=['10 wKS', '12 wks'], - gender=['maLE'], - workflow_state=['qC', 'pASsed'], - workflows=['2p serial imaging']) - passed = mcc.filter_experiments(experiments, **conditions) - - assert len(passed) == 1 diff --git a/allensdk/test/internal/gbm/test.genes.results b/allensdk/test/internal/gbm/test.genes.results deleted file mode 100644 index 58af74601b..0000000000 --- a/allensdk/test/internal/gbm/test.genes.results +++ /dev/null @@ -1,4 +0,0 @@ -gene_id transcript_id(s) length effective_length expected_count TPM FPKM -1000 NM_001792_3 4367.00 4245.33 10981.94 170.63 108.14 -100008586 NM_001098405_1 354.00 234.96 0.00 0.00 0.00 -124989 NM_001195192_1,NM_152347_4 7082.00 6960.33 848.87 8.04 5.10 \ No newline at end of file diff --git a/allensdk/test/internal/gbm/test.isoforms.results b/allensdk/test/internal/gbm/test.isoforms.results deleted file mode 100644 index 9295e1ba9b..0000000000 --- a/allensdk/test/internal/gbm/test.isoforms.results +++ /dev/null @@ -1,4 +0,0 @@ -transcript_id gene_id length effective_length expected_count TPM FPKM IsoPct -NM_130786_3 1 1766 1705.65 146.00 12.74 7.65 100.00 -NM_000015_2 10 1317 1256.65 0.00 0.00 0.00 10.00 -tRNA-Tyr.100009601.chr14 100 1532 1471.65 21.00 2.13 1.28 100.00 \ No newline at end of file diff --git a/allensdk/test/internal/gbm/test2.genes.results b/allensdk/test/internal/gbm/test2.genes.results deleted file mode 100644 index 9b7a376fef..0000000000 --- a/allensdk/test/internal/gbm/test2.genes.results +++ /dev/null @@ -1,4 +0,0 @@ -gene_id transcript_id(s) length effective_length expected_count TPM FPKM -1000 NM_130786_3 1766.00 1725.76 259.00 16.17 11.05 -100008586 NM_001206729_1,NM_005465_4,NM_181690_2 7082.00 7041.76 1112.80 16.93 11.57 -124989 NM_001144757_1,NM_003020_3 1244.00 1203.76 349.00 31.34 21.41 \ No newline at end of file diff --git a/allensdk/test/internal/gbm/test2.isoforms.results b/allensdk/test/internal/gbm/test2.isoforms.results deleted file mode 100644 index 40306c527f..0000000000 --- a/allensdk/test/internal/gbm/test2.isoforms.results +++ /dev/null @@ -1,4 +0,0 @@ -transcript_id gene_id length effective_length expected_count TPM FPKM IsoPct -NM_130786_3 1 1766 1705.65 146.00 12.74 7.65 100.00 -NM_000015_2 10 1317 1256.65 0.00 0.00 0.00 0.00 -tRNA-Tyr.100009601.chr14 100 1532 1471.65 21.00 2.13 1.28 0.00 \ No newline at end of file diff --git a/allensdk/test/internal/gbm/test_generate_gbm_heatmap.py b/allensdk/test/internal/gbm/test_generate_gbm_heatmap.py deleted file mode 100644 index fe1a82fce9..0000000000 --- a/allensdk/test/internal/gbm/test_generate_gbm_heatmap.py +++ /dev/null @@ -1,112 +0,0 @@ -import pytest -import allensdk.internal.pipeline_modules.gbm.generate_gbm_heatmap as heatmap -import pandas as pd -import os -import numpy as np - - -TEST_DIR = os.path.dirname(__file__) -TEST_GENE_FILE = os.path.join(TEST_DIR, "test.genes.results") -TEST_TRANSCRIPT_FILE = os.path.join(TEST_DIR, "test.isoforms.results") -TEST2_GENE_FILE = os.path.join(TEST_DIR, "test2.genes.results") -TEST2_TRANSCRIPT_FILE = os.path.join(TEST_DIR, "test2.isoforms.results") - - -def test_create_transcripts_for_genes(): - - analysis_run_gene_file = {"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": - TEST_TRANSCRIPT_FILE, "rna_well_id": 300173630} - - data = heatmap.create_transcripts_for_genes(analysis_run_gene_file) - d = [["gene_id", "transcript_id(s)"], - ["1000", "NM_001792_3"], - ["124989", "NM_001195192_1,NM_152347_4"], - ["100008586", "NM_001098405_1"]] - expected_data = pd.DataFrame(data=d) - assert(expected_data.equals(data)) - - -def test_create_genes_for_transcripts(): - - analysis_run_transcript_file = {"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": - TEST_TRANSCRIPT_FILE, "rna_well_id": - 300173630} - - data = heatmap.create_genes_for_transcripts(analysis_run_transcript_file) - d = [["transcript_id", "gene_id"], - ["NM_000015_2", "10"], - ["NM_130786_3", "1"], - ["tRNA-Tyr.100009601.chr14", "100"]] - expected_data = pd.DataFrame(data=d) - assert(expected_data.equals(data)) - - -def test_create_gene_fpkm_table(): - - analysis_run_records = [{"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": - TEST_TRANSCRIPT_FILE, "rna_well_id": 300173630}, - {"analysis_run_gene_path": TEST2_GENE_FILE, "analysis_run_transcript_path": - TEST2_TRANSCRIPT_FILE, "rna_well_id": 300173634}] - - data = heatmap.create_gene_fpkm_table(analysis_run_records) - d = np.column_stack([["108.14", "5.10", "0.00"], ["11.05", "21.41", "11.57"]]) - expected_data = pd.DataFrame(data=d, columns=[300173630, 300173634], index=[1000, 124989, 100008586]) - assert (expected_data.equals(data)) - - -def test_create_transcript_fpkm_table(): - - analysis_run_records = [{"analysis_run_gene_path": TEST_GENE_FILE, "analysis_run_transcript_path": - TEST_TRANSCRIPT_FILE, "rna_well_id": 300173630}, - {"analysis_run_gene_path": TEST2_GENE_FILE, "analysis_run_transcript_path": - TEST2_TRANSCRIPT_FILE, "rna_well_id": 300173634}] - - data = heatmap.create_transcript_fpkm_table(analysis_run_records) - d = np.column_stack([["10.00", "100.00", "100.00"], ["0.00", "100.00", "0.00"]]) - expected_data = pd.DataFrame(data=d, columns=[300173630, 300173634], index=["NM_000015_2", "NM_130786_3", - "tRNA-Tyr.100009601.chr14"]) - assert(expected_data.equals(data)) - - -def test_create_sample_metadata(): - - sample_metadata_records = [ - { - "structure_name": "Microvascular proliferation sampled by reference histology", - "structure_id": 309780906, - "structure_color": "ff330", - "block_id": 703397, - "polygon_id": 298726077, - "specimen_id": 297710593, - "tumor_name": "W1-1-2", - "rna_well_id": 300173634, - "structure_abbreviation": "CTmvp-reference-histology", - "block_name": "W1-1-2-D.2", - "tumor_id": 703393, - "specimen_name": "W1-1-2-D.2.01" - }, - { - "structure_name": "Cellular Tumor sampled by reference histology", - "structure_id": 309780592, - "structure_color": "5d04", - "block_id": 703397, - "polygon_id": 298727153, - "specimen_id": 297710593, - "tumor_name": "W1-1-2", - "rna_well_id": 300173630, - "structure_abbreviation": "CT-reference-histology", - "block_name": "W1-1-2-D.2", - "tumor_id": 703393, - "specimen_name": "W1-1-2-D.2.01" - } - ] - data = heatmap.create_sample_metadata(sample_metadata_records) - d = [[300173630, 703397, "W1-1-2-D.2", 298727153, 297710593, "W1-1-2-D.2.01", "CT-reference-histology", "5d04", - 309780592, "Cellular Tumor sampled by reference histology", 703393, "W1-1-2"], - [300173634, 703397, "W1-1-2-D.2", 298726077, 297710593, "W1-1-2-D.2.01", "CTmvp-reference-histology", "ff330", - 309780906, "Microvascular proliferation sampled by reference histology", 703393, "W1-1-2"]] - - expected_data = pd.DataFrame(data=d, columns=["rna_well_id", "block_id", "block_name", "polygon_id", "specimen_id", - "specimen_name", "structure_abbreviation", "structure_color", - "structure_id", "structure_name", "tumor_id", "tumor_name"]) - pd.testing.assert_frame_equal(expected_data, data, check_like=True) diff --git a/allensdk/test/internal/morphology/test_apply_affine.py b/allensdk/test/internal/morphology/test_apply_affine.py deleted file mode 100644 index 666c9aa6cd..0000000000 --- a/allensdk/test/internal/morphology/test_apply_affine.py +++ /dev/null @@ -1,32 +0,0 @@ -import pytest - -from allensdk.internal.morphology.morphology import Morphology -from allensdk.internal.morphology.node import Node - - -def test_apply_affine(): - node_list = [Node(0, 1, 0, 0, 0, 3, -1), Node(1, 2, 0, 0, 1, 1, 0)] - morph = Morphology(node_list) - - scale = [2, 0, 0, - 0, 2, 0, - 0, 0, 2] - translate = [1, 0, 0] - affine = scale + translate - morph.apply_affine(affine) - - # was at (0, 0, 1) with r = 1 - expected_node1 = {'id': 1, - 'type': 2, - 'x': 1, - 'y': 0, - 'z': 2, - 'radius': 2, - 'parent': 0, - 'children': [], - 'tree_id': 0, - 'compartment_id': 0} - - obtained_node1 = morph.node_list[1] - for key, value in expected_node1.items(): - assert value == pytest.approx(obtained_node1[key]) diff --git a/allensdk/test/internal/mouse_connectivity/test_interval_unionizer.py b/allensdk/test/internal/mouse_connectivity/test_interval_unionizer.py deleted file mode 100644 index 66ac2c6665..0000000000 --- a/allensdk/test/internal/mouse_connectivity/test_interval_unionizer.py +++ /dev/null @@ -1,120 +0,0 @@ -from __future__ import division - -import numpy as np -import pytest -import mock -from six import iteritems - -from allensdk.internal.mouse_connectivity.interval_unionize.interval_unionizer \ - import IntervalUnionizer - - -@pytest.fixture(scope='function') -def annotation(): - - annot = np.zeros((10, 10, 10)) - annot[:, :, 4:] = 1 # 4 off, 6 on, ... - annot[5:8, :, :] = 2 # solid block from 500:800 - - return annot - - -def test_init(): - - iu = IntervalUnionizer([1, 2, 3]) - assert( np.allclose(iu.exclude_structure_ids, [1, 2, 3]) ) - - iu = IntervalUnionizer() - assert( sum(iu.exclude_structure_ids) == 0 ) - - -def test_setup_interval_map(annotation): - - bounds_exp = {1: (280, 700), 2: (700, 1000)} - - iu = IntervalUnionizer() - iu.setup_interval_map(annotation) - - for k, v in iteritems(iu.interval_map): - assert( np.allclose(v, bounds_exp[k]) ) - - -def test_extract_data(): - - iu = IntervalUnionizer() - - with pytest.raises(NotImplementedError): - iu.extract_data('olive', 'reticulated', 'western_woma') - - -def test_propagate_record(): - - with pytest.raises(NotImplementedError): - IntervalUnionizer.propagate_record('olive', 'reticulated') - - -def test_propagate_unionizes(): - - uns = {1: {'a': 1, 'b': 2}, - 2: {'a': 2, 'b': 3}, - 3: {'a': 3, 'b': 4}} - - amap = {1: [1, 2], 2: [2], 3: [3]} - - def dummy_prop(cls, c, a): - return {k: c[k] + a[k] for k in c} - - IntervalUnionizer.propagate_record = classmethod(dummy_prop) - ou = IntervalUnionizer.propagate_unionizes(uns, amap) - - assert( ou[3]['a'] == 3 ) - assert( ou[2]['b'] == 5 ) - assert( ou[1]['a'] == 1 ) - - -def test_postprocess_unionizes(): - - iu = IntervalUnionizer() - with pytest.raises(NotImplementedError): - iu.postprocess_unionizes('foo') - - -def test_sort_data_arrays(): - - data_arrays = {1: np.arange(10), 2: np.arange(10, 20)} - sort = np.array([3, 1, 5, 2, 6, 4, 7, 8, 9, 0]) - - iu = IntervalUnionizer() - iu.sort = sort - - obt = iu.sort_data_arrays(data_arrays) - - assert( np.allclose(obt[1], sort) ) - assert( np.allclose(obt[2], 10 + sort ) ) - - -def test_direct_unionize(): - - data = {'savu': np.arange(1000)} - im = {1: (280, 700), 2: (700, 1000)} - - - with mock.patch('allensdk.internal.mouse_connectivity.interval_unionize.' - 'interval_unionizer.IntervalUnionizer.sort_data_arrays', - new=lambda s, x: x): - - class IU(IntervalUnionizer): - def extract_data(self, d, l, h, **k): - return d['savu'][l:h].sum() - - iu = IU() - - iu.interval_map = im - - obt = iu.direct_unionize(data) - - assert( obt[1] == np.arange(280, 700).sum() ) - assert( obt[2] == np.arange(700, 1000).sum() ) - - - diff --git a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py deleted file mode 100644 index 91515d8f3c..0000000000 --- a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py +++ /dev/null @@ -1,36 +0,0 @@ -import pytest - -import SimpleITK as sitk -import numpy as np - -from allensdk.internal.mouse_connectivity.projection_thumbnail import projection_functions as prf - - -@pytest.fixture -def example_volume(): - array = np.arange(8, dtype=np.float64).reshape([2, 2, 2]) - return sitk.GetImageFromArray(array) - - -def test_convert_axis(): # :) - - obt = prf.convert_axis(2) - assert(obt == 0) - - -def test_max_projection(example_volume): - - max_obt, depth_obt = prf.max_projection(example_volume, 2) - - depth_exp = np.zeros([2, 2]) + 1 - max_exp = np.array([[4, 5], [6, 7]]) - - assert(np.allclose(depth_exp, depth_obt)) - assert(np.allclose(max_exp, max_obt)) - - -def test_template_projection(example_volume): - - obt = prf.template_projection(example_volume, 2, 1, 1) - exp = np.array([[16, 25], [20, 5]]) - diff --git a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py deleted file mode 100644 index d996ef2177..0000000000 --- a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py +++ /dev/null @@ -1,61 +0,0 @@ -import pytest - - -import SimpleITK as sitk -import numpy as np -import matplotlib as mpl - -from allensdk.internal.mouse_connectivity.projection_thumbnail import visualization_utilities as vis - - -@pytest.fixture -def example_volume(): - arr = np.arange(5*6*7, dtype=np.float64).reshape([5, 6, 7]) - return sitk.GetImageFromArray(arr) - - -@pytest.fixture -def discrete_cmap(): - red = np.arange(255) - green = np.arange(255)[::-1] - blue = np.zeros(256) - return [[r, g, b] for r, g, b in zip(red, green, blue)] - - -def test_convert_discrete_colormap(discrete_cmap): - cmap = vis.convert_discrete_colormap(discrete_cmap) - - obt = cmap(0.75) - exp = [3 * 255 / 4.0, 1 * 255 / 4.0, 0.0, 1.0] - - -def test_sitk_safe_ln(example_volume): - - obt = sitk.GetArrayFromImage(vis.sitk_safe_ln(example_volume)) - arr = sitk.GetArrayFromImage(example_volume) - - arr = np.log(arr) - arr[0, 0, 0] = np.log(10**-10) - - print(obt) - print(arr) - - assert(np.allclose(arr, obt)) - - -def test_normalize_intensity(example_volume): - - obt = vis.normalize_intensity(example_volume, 2, 4, 50, 100) - obt = sitk.GetArrayFromImage(obt) - - assert(75 == obt[0, 0, 3]) - - -def test_blend(): - - images = [np.eye(2), np.array([[1, 2], [3, 4]])] - weights = [np.fliplr(np.eye(2)), [[0, 0], [0, 1]]] - - exp = [[1, 0], [0, 4]] - obt = vis.blend(images, weights) - assert(np.allclose(exp, obt)) diff --git a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py deleted file mode 100644 index bd1f560b4f..0000000000 --- a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py +++ /dev/null @@ -1,79 +0,0 @@ -import pytest -import numpy as np -import SimpleITK as sitk - -from allensdk.internal.mouse_connectivity.projection_thumbnail.volume_projector import VolumeProjector - - -@pytest.fixture -def simple_volume(): - arr = np.arange(8 * 9 * 10, dtype=np.float64).reshape([8, 9, 10]) - return sitk.GetImageFromArray(arr) # swaps 0 <=> 2 axes - - -@pytest.fixture -def cube_volume(): - arr = np.arange(1000, dtype=np.float64).reshape([10, 10, 10]) - return sitk.GetImageFromArray(arr) - - -def test_init(simple_volume): - vp = VolumeProjector(simple_volume) - assert(vp.view_volume.GetPixel(3, 5, 3) == simple_volume.GetPixel(3, 5, 3)) - - -def test_build_rotation_transform(simple_volume): - - vp = VolumeProjector(simple_volume) - trans_obt = vp.build_rotation_transform(0, 2, np.pi / 2.0) - - exp = [0, 0, -1, 0, 1, 0, 1, 0, 0] # just hstacked rows - assert(np.allclose(trans_obt.GetMatrix(), exp)) - - -@pytest.mark.parametrize('angle,check', [(2*np.pi, [2, 3, 4]), (np.pi, [7, 3, 3])]) -def test_rotate(simple_volume, angle, check): - - vp = VolumeProjector(simple_volume) - obt = vp.rotate(0, 2, angle) - - assert(np.allclose(simple_volume.GetPixel(2, 3, 4), obt.GetPixel(*check))) - - -def test_extract(): - - arr = np.eye(20) - vp = VolumeProjector(arr) - - obt = vp.extract(np.sum) - exp = 20 - - assert(obt == exp) - - -@pytest.mark.parametrize('angle,exp', [(0.0, 0.0), (2 * np.pi, 0.0)]) -def test_rotate_and_extract(angle, exp, cube_volume): - - cb = lambda x: x.GetPixel(0, 0, 0) - vp = VolumeProjector(cube_volume) - - for obt in vp.rotate_and_extract([0], [2], [angle], cb): - assert(np.allclose(obt, exp)) - - -def test_fixed_factory(simple_volume): - - shape = [5, 6, 7] - vp = VolumeProjector.fixed_factory(simple_volume, shape) - - shape_obt = vp.view_volume.GetSize() - assert(np.allclose(shape, shape_obt)) - - -def test_safe_factory(simple_volume): - - vp = VolumeProjector.safe_factory(simple_volume) - - shape_exp = [16, 17, 16] - assert(np.allclose(shape_exp, vp.view_volume.GetSize())) - assert(vp.view_volume.GetPixel(8, 9, 8) == simple_volume.GetPixel(5, 5, 4)) diff --git a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py deleted file mode 100644 index 97b141b514..0000000000 --- a/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py +++ /dev/null @@ -1,92 +0,0 @@ -import pytest -import numpy as np -import SimpleITK as sitk - -import allensdk.internal.mouse_connectivity.projection_thumbnail.volume_utilities as vol - - -@pytest.fixture -def empty_image(): - img = sitk.Image(2, 3, 4, sitk.sitkFloat64) - return img - - -@pytest.fixture -def even_image(): - arr = np.zeros([12, 14, 16]) - arr[6, 7, 8] = 1 - arr[6, 7, 8] = 1 - img = sitk.GetImageFromArray(arr) - return img - - -def test_sitk_get_image_parameters(empty_image): - - sp, sz, og = vol.sitk_get_image_parameters(empty_image) - - assert(np.allclose(sp, [1, 1, 1])) - assert(np.allclose(sz, [2, 3, 4])) - assert(np.allclose(og, [0, 0, 0])) - - -def test_sitk_get_center_even(even_image): - - center = vol.sitk_get_center(even_image) - assert(np.allclose(center, [7.5, 6.5, 5.5])) - - -def test_sitk_get_center_odd(empty_image): - obt = vol.sitk_get_center(empty_image) - assert(np.allclose(obt, [0.5, 1, 1.5])) - - -@pytest.mark.parametrize('size,exp', [([2, 3], [0, 1]), ([3, 3], [1, 1])]) -def test_sitk_get_size_parity(size, exp): - - image = sitk.Image(size[0], size[1], sitk.sitkUInt8) - obt = vol.sitk_get_size_parity(image) - - assert(np.allclose(exp, obt)) - - -@pytest.mark.parametrize('shape,exp', [([1, 1, 1], np.sqrt(3)), - ([2, 4], np.sqrt(20))]) -def test_sitk_get_diagonal_length(shape, exp): - - img = sitk.GetImageFromArray(np.zeros(shape)) - obt = vol.sitk_get_diagonal_length(img) - - assert(exp == obt) - - -def test_sitk_paste_into_center_even(): - - smaller = sitk.GetImageFromArray(np.eye(2)) - larger = sitk.GetImageFromArray(np.zeros((4, 4))) - - obt = vol.sitk_paste_into_center(smaller, larger) - obt = sitk.GetArrayFromImage(obt) - - exp = np.zeros((4, 4)) - exp[1, 1] = 1 - exp[2, 2] = 1 - - assert(np.allclose(obt, exp)) - - -def test_sitk_paste_into_center_odd(): - - smaller = sitk.GetImageFromArray(np.eye(3, 3)) - larger = sitk.GetImageFromArray(np.zeros((5, 5))) - - obt = vol.sitk_paste_into_center(smaller, larger) - obt = sitk.GetArrayFromImage(obt) - - print(obt) - - exp = np.zeros((5, 5)) - exp[1, 1] = 1 - exp[2, 2] = 1 - exp[3, 3] = 1 - - assert(np.allclose(exp, obt)) diff --git a/allensdk/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py b/allensdk/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py deleted file mode 100644 index 640aea02ee..0000000000 --- a/allensdk/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py +++ /dev/null @@ -1,170 +0,0 @@ -from __future__ import division - -import numpy as np -import pytest -import mock -from six import iteritems -from six.moves import xrange - -from allensdk.internal.mouse_connectivity.interval_unionize\ - .tissuecyte_unionize_record import TissuecyteBaseUnionize, \ - TissuecyteInjectionUnionize,TissuecyteProjectionUnionize - - -@pytest.fixture(scope='function') -def data_arrays(): - - fq = np.ones(100) - fq[25:] = 0 - - lq = np.ones(100) - lq[:75] = 0 - - top = np.ones(100) - top[:70] = 0 - - return {'injection_fraction': fq, - 'aav_exclusion_fraction': top, - 'projection_density': np.arange(100), - 'projection_energy': np.arange(100) * 2, - 'injection_density': np.multiply(np.arange(100), fq), - 'injection_energy': np.multiply(np.arange(100) * 2, fq), - 'sum_pixels': np.ones(100) * 900, - 'sum_pixel_intensities': np.ones(100), - 'injection_sum_pixel_intensities': np.ones(100)[:50] - } - - -def test_base_init(): - - tbu = TissuecyteBaseUnionize() - for item in TissuecyteBaseUnionize.__slots__: - assert( getattr(tbu, item) == 0 ) - - -@pytest.mark.parametrize('anc_mvd', [0, 1]) -def test_base_propagate(anc_mvd): - - an = TissuecyteBaseUnionize() - an.sum_pixels = 12 - an.max_voxel_index = 100 - an.max_voxel_density = anc_mvd - - ch = TissuecyteBaseUnionize() - ch.sum_pixels = 5 - ch.max_voxel_index = 50 - ch.max_voxel_density = 0.5 - - ch.propagate(an) - - assert( an.sum_pixels == 17 ) - - if an.max_voxel_density == 1: - assert( an.max_voxel_index == 100 ) - else: - assert( an.max_voxel_index == 50 ) - - -@pytest.mark.parametrize('spp', [0, 1]) -def test_base_set_max_voxel(spp): - - darr = np.arange(25) / 24 - darr[15:] = 0 - low = 12 - - tbu = TissuecyteBaseUnionize() - tbu.sum_projection_pixels = spp - tbu.set_max_voxel(darr, low) - - if spp == 1: - assert( tbu.max_voxel_index == 26 ) - assert( tbu.max_voxel_density == 14 / 24 ) - else: - assert( tbu.max_voxel_index == 0 ) - assert( tbu.max_voxel_density == 0 ) - - -def test_base_slice_arrays(): - - arrays = {ii: np.arange(10) + ii for ii in xrange(20)} - low = 5 - high = 8 - - tbu = TissuecyteBaseUnionize() - sl = tbu.slice_arrays(low, high, arrays) - - for k, v in iteritems(sl): - assert( len(v) == 3 ) - assert( v.sum() == k * 3 + 18 ) - - -@pytest.mark.parametrize('sum_pixels,sum_projection_pixels', [(0, 2), (0, 2)]) -def test_base_output(sum_pixels, sum_projection_pixels): - - tbu = TissuecyteBaseUnionize() - - tbu.sum_pixels = sum_pixels - tbu.direct_sum_projection_pixels = sum_projection_pixels / 2 - tbu.sum_projection_pixels = sum_projection_pixels - tbu.sum_projection_pixel_intensity = 100 - - tbu.max_voxel_index = 999 - tbu.max_voxel_density = 1 - - out = tbu.output(10, 900, (10, 10, 10), np.arange(1000)) - - assert( out['volume'] == sum_pixels * 900 ) - assert( out['direct_projection_volume'] == sum_projection_pixels * 450 ) - assert( out['projection_volume'] == sum_projection_pixels * 900 ) - - if sum_pixels > 0: - assert( out['projection_density'] == sum_projection_pixels / sum_pixels ) - else: - assert( out['projection_density'] == 0 ) - - if sum_pixels > 0: - assert( out['projection_energy'] == 100 / sum_pixels ) - else: - assert( out['projection_energy'] == 0 ) - - if sum_projection_pixels > 0: - assert( out['projection_intensity'] == 100 / sum_projection_pixels ) - else: - assert( out['projection_intensity'] == 0 ) - - assert( out['max_voxel_x'] == 90 ) - assert( out['max_voxel_y'] == 90 ) - assert( out['max_voxel_z'] == 90 ) - - -def test_injection_calculate(data_arrays): - - tiu = TissuecyteInjectionUnionize() - - tiu.calculate(20, 80, data_arrays) - - assert( tiu.sum_pixels == 4500 ) - assert( tiu.sum_projection_pixels == 900 * np.arange(20, 25).sum() ) - assert( tiu.sum_projection_pixel_intensity == 1800 * np.arange(20, 25).sum() ) - - assert( tiu.max_voxel_index == 24 ) - assert( tiu.max_voxel_density == 24 ) - - -def test_projection_calculate(data_arrays): - - tiu = mock.MagicMock() - tiu.sum_pixels = 1 - tiu.sum_projection_pixels = 2 - tiu.sum_projection_pixel_intensity = 3 - - tpu = TissuecyteProjectionUnionize() - tpu.calculate(20, 80, data_arrays, tiu) - - assert( tpu.sum_pixels == 900 * 50 - 1 ) - assert( tpu.sum_projection_pixels == 900 * np.arange(20, 70).sum() - 2 ) - assert( tpu.sum_projection_pixel_intensity == 1800 * np.arange(20, 70).sum() - 3 ) - - assert( tpu.max_voxel_index == 69 ) - assert( tpu.max_voxel_density == 69 ) - diff --git a/allensdk/test/internal/mouse_connectivity/test_unionize_record.py b/allensdk/test/internal/mouse_connectivity/test_unionize_record.py deleted file mode 100644 index 80131b9ac6..0000000000 --- a/allensdk/test/internal/mouse_connectivity/test_unionize_record.py +++ /dev/null @@ -1,15 +0,0 @@ - - -import pytest -import mock - -from allensdk.internal.mouse_connectivity.interval_unionize.unionize_record import Unionize - - -@pytest.mark.parametrize('method', ['__init__', 'calculate', 'propagate', 'output']) -def test_unionize(method): - - un = object.__new__(Unionize) - - with pytest.raises(NotImplementedError): - getattr(un, method)('foo', 'fish') diff --git a/allensdk/test/internal/test_annotated_region_metrics.py b/allensdk/test/internal/test_annotated_region_metrics.py deleted file mode 100644 index a23fbeee1f..0000000000 --- a/allensdk/test/internal/test_annotated_region_metrics.py +++ /dev/null @@ -1,67 +0,0 @@ -import pytest -import numpy as np -from allensdk.internal.brain_observatory import annotated_region_metrics - -@pytest.fixture -def mask(): - return np.ones((10,10), dtype=bool) - - -def retinotopic_map(return_x=True): - x = np.linspace(-np.pi, np.pi, 640) - y = np.linspace(-np.pi, np.pi, 540) - xx, yy = np.meshgrid(x, y) - if return_x: - return xx - return yy - - -@pytest.fixture -def azimuth_map(): - return retinotopic_map() - - -@pytest.fixture -def altitude_map(): - return retinotopic_map(False) - - -def test_eccentricity(azimuth_map, altitude_map): - ecc = annotated_region_metrics.eccentricity(azimuth_map, altitude_map, - 0.0, 0.0) - assert(ecc.shape == azimuth_map.shape) - - -def test_create_region_mask(mask): - height, width = mask.shape - x = y = 30 - region_mask = annotated_region_metrics.create_region_mask((100,100), - x, y, width, - height, - mask.tolist()) - assert(region_mask.shape == (100,100)) - assert(region_mask.sum() == mask.sum()) - assert(np.all(region_mask[y:y+height,x:x+width] == mask)) - - -def test_retinotopy_metric(azimuth_map, mask): - height, width = mask.shape - x = y = 30 - region_mask = annotated_region_metrics.create_region_mask( - azimuth_map.shape, x, y, width, height, mask.tolist()) - rmin, rmax, rrange, rbias = annotated_region_metrics.retinotopy_metric( - region_mask, azimuth_map) - rmap = np.degrees(azimuth_map[np.where(region_mask > 0)]) - assert(rmin == rmap.min()) - assert(rmax == rmap.max()) - - -def test_get_metrics(altitude_map, azimuth_map, mask): - height, width = mask.shape - x = y = 30 - result = annotated_region_metrics.get_metrics(altitude_map, azimuth_map, - x=x, y=y, width=width, - height=height, - mask=mask.tolist()) - assert(isinstance(result, dict)) - assert('azimuth_min' in result) diff --git a/allensdk/test/internal/test_biophysical_modules.py b/allensdk/test/internal/test_biophysical_modules.py deleted file mode 100644 index 6e5464c398..0000000000 --- a/allensdk/test/internal/test_biophysical_modules.py +++ /dev/null @@ -1,45 +0,0 @@ -from allensdk.internal.api.queries.biophysical_module_api \ - import BiophysicalModuleApi -import pytest -from mock import patch - - -@pytest.fixture -def biophysical_api(): - bma = BiophysicalModuleApi('http://axon:3000') - - return bma - - -def test_get_neuronal_model_runs(biophysical_api): - neuronal_model_run_id = 464137111 - with patch.object(biophysical_api, "json_msg_query") as mock_query: - biophysical_api.get_neuronal_model_runs(neuronal_model_run_id) - expected = ("http://axon:3000/api/v2/data/query.json?q=model::Neuronal" - "ModelRun,rma::criteria,[id$in464137111],rma::include,well_" - "known_files(well_known_file_type),neuronal_model(well_known_" - "files(well_known_file_type),specimen(project,specimen_tags," - "ephys_roi_result(ephys_qc_criteria,well_known_files(well_" - "known_file_type)),neuron_reconstructions(well_known_files" - "(well_known_file_type)),ephys_sweeps(ephys_sweep_tags,ephys_" - "stimulus(ephys_stimulus_type))),neuronal_model_template" - "(neuronal_model_template_type,well_known_files(well_known_" - "file_type))),rma::options[num_rows$eq'all'][count$eqfalse]") - mock_query.assert_called_once_with(expected) - - -def test_get_neuronal_models(biophysical_api): - neuronal_model_id = 329322394 - with patch.object(biophysical_api, "json_msg_query") as mock_query: - biophysical_api.get_neuronal_models(neuronal_model_id) - expected = ("http://axon:3000/api/v2/data/query.json?q=model::Neuronal" - "Model,rma::criteria,[id$in329322394],rma::include," - "well_known_files(well_known_file_type),specimen(project," - "specimen_tags,ephys_roi_result(ephys_qc_criteria,well_known_" - "files(well_known_file_type)),neuron_reconstructions(well_" - "known_files(well_known_file_type)),ephys_sweeps(ephys_sweep_" - "tags,ephys_stimulus(ephys_stimulus_type))),neuronal_model_" - "template(neuronal_model_template_type,well_known_files(well_" - "known_file_type)),rma::options[num_rows$eq'all'][count$" - "eqfalse]") - mock_query.assert_called_once_with(expected) diff --git a/allensdk/test/internal/test_core_feature_extract.py b/allensdk/test/internal/test_core_feature_extract.py deleted file mode 100644 index 87143be6e9..0000000000 --- a/allensdk/test/internal/test_core_feature_extract.py +++ /dev/null @@ -1,106 +0,0 @@ -import pytest -from allensdk.internal.ephys.core_feature_extract import ( find_stim_start, - filter_sweeps, - find_coarse_long_square_amp_delta, - nan_get ) - -def test_find_stim_start(): - a = [0,0,0,1,1,1,0,0,0] - idx = find_stim_start(a) - assert idx == 3 - - idx = find_stim_start(a, 1) - assert idx == 3 - - a = [0,0,0,-1,-1,-1,0,0,0] - idx = find_stim_start(a) - assert idx == 3 - - a = [] - idx = find_stim_start(a) - assert idx == -1 - - a = [0,0,0] - idx = find_stim_start(a) - assert idx == -1 - - a = [0] - idx = find_stim_start(a) - assert idx == -1 - -def test_filter_sweeps(): - a = [ { 'sweep_number': 1 }, { 'sweep_number': 0 } ] - sweeps = filter_sweeps(a, passed_only=False, iclamp_only=False) - assert len(sweeps) == 2 - assert [ s['sweep_number'] for s in sweeps ] == [ 0,1 ] - - a = [ { 'sweep_number': 1, 'workflow_state': 'auto_passed', 'stimulus_units': 'fish' }, - { 'sweep_number': 0, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, - { 'sweep_number': 2, 'workflow_state': 'manual_passed', 'stimulus_units': 'Amps' }, - { 'sweep_number': 3, 'workflow_state': 'manual_failed', 'stimulus_units': 'taco' } ] - sweeps = filter_sweeps(a, passed_only=True, iclamp_only=False) - assert len(sweeps) == 2 - - sweeps = filter_sweeps(a, passed_only=True, iclamp_only=True) - assert len(sweeps) == 1 - - a = [ { 'sweep_number': 1, 'ephys_stimulus': { 'description': 'T1x' } }, - { 'sweep_number': 0, 'ephys_stimulus': { 'description': 'T2x' } }, - { 'sweep_number': 2, 'ephys_stimulus': { 'description': 'T3x' } }, - { 'sweep_number': 3, 'ephys_stimulus': { 'description': 'T1x' } } ] - - sweeps = filter_sweeps(a, passed_only=False, iclamp_only=False, types=['T1', 'T2']) - assert len(sweeps) == 3 - -def test_find_coarse_long_square_amp_delta(): - a = [ { 'stimulus_amplitude': 10, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 10, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSFINE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 10, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 10, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] - - delta = find_coarse_long_square_amp_delta(a) - assert delta == 0 - - a = [ { 'stimulus_amplitude': 10, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 20, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSFINE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 30, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 40, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] - - delta = find_coarse_long_square_amp_delta(a) - assert delta == 10 - - a = [ { 'stimulus_amplitude': 10, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 20, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSFINE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 20, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 30, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] - - delta = find_coarse_long_square_amp_delta(a) - assert delta == 10 - - a = [ { 'stimulus_amplitude': 10, 'sweep_number': 0, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 20, 'sweep_number': 1, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 20, 'sweep_number': 2, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_failed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 30, 'sweep_number': 3, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' }, - { 'stimulus_amplitude': 50, 'sweep_number': 5, 'ephys_stimulus': { 'description': 'C1LSCOARSE' }, 'workflow_state': 'auto_passed', 'stimulus_units': 'pA' } ] - - delta = find_coarse_long_square_amp_delta(a) - assert delta == 10 - -def test_nan_get(): - a = {} - v = nan_get(a, 'fish') - assert v == None - - a = { 'fish': 1 } - v = nan_get(a, 'fish') - assert v == 1 - - a = { 'fish': float("nan") } - v = nan_get(a, 'fish') - assert v == None - - - - - - diff --git a/allensdk/test/internal/test_eye_calibration.py b/allensdk/test/internal/test_eye_calibration.py deleted file mode 100644 index 2df6d2210f..0000000000 --- a/allensdk/test/internal/test_eye_calibration.py +++ /dev/null @@ -1,80 +0,0 @@ -import pytest -import numpy as np -from allensdk.internal.brain_observatory import eye_calibration - -def cr_params(): - x, y = np.meshgrid(np.array([300, 320, 340]), - np.array([220, 240, 260])) - return np.vstack((x.flatten(), y.flatten())).T - -def pupil_params(): - x, y = np.meshgrid(np.array([280, 320, 380]), - np.array([200, 240, 280])) - return np.vstack((x.flatten(), y.flatten())).T - - -@pytest.mark.parametrize("led_position,eye_radius", [ - (np.array([25.89, -6.12, 3.21]), 0.1682), - (np.array([24.6, 9.23, 5.26]), 0.1682), - (np.array([20.0, 20.0, 20.0]), 500), -]) -def test_cr_position_in_mouse_eye_coordinates(led_position, eye_radius): - cr = eye_calibration.EyeCalibration.cr_position_in_mouse_eye_coordinates( - led_position, eye_radius) - tol = 0.000000001 - assert(np.abs(np.linalg.norm(cr) - 0.5*eye_radius) < tol) - err = np.abs(cr/np.linalg.norm(cr) - \ - led_position/np.linalg.norm(led_position)) - assert(np.all(err < tol)) - - -@pytest.mark.parametrize("led_position,camera_rotations", [ - (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, 0.0])), - (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, np.pi/4])) -]) -def test_pupil_position_in_mouse_eye_coordinates_right( - led_position, camera_rotations): - CM_PER_PIXEL = 10.2/10000 - TOL = 0.0000000001 - c = eye_calibration.EyeCalibration( - led_position=led_position, cm_per_pixel=CM_PER_PIXEL, - eye_radius=0.1682, camera_rotations=camera_rotations, - camera_position=np.array([13.0, 0.0, 0.0])) - pupil = pupil_params() - cr = cr_params() - bad = c.pupil_position_in_mouse_eye_coordinates(np.array([[1000, 0], [0, 1000]]), - np.array([[0, 0], [0, 0]])) - assert(np.all(np.isnan(bad))) - pos = c.pupil_position_in_mouse_eye_coordinates(pupil, cr) - x = (pupil.T[0] - cr.T[0])*CM_PER_PIXEL - y = (cr.T[1] - pupil.T[1])*CM_PER_PIXEL - xr = x*np.cos(-camera_rotations[2]) - y*np.sin(-camera_rotations[2]) - yr = x*np.sin(-camera_rotations[2]) + y*np.cos(-camera_rotations[2]) - assert(np.all(np.abs(pos.T[2] - (yr + c.cr[2])) < TOL)) - assert(np.all(np.abs(pos.T[1] - (xr + c.cr[1])) < TOL)) - - -@pytest.mark.parametrize("led_position,camera_rotations", [ - (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, 0.0])), - (np.array([10.0, 0.0, 0.0]),np.array([0.0, 0.0, np.pi/4])) -]) -def test_pupil_position_in_mouse_eye_coordinates_front( - led_position, camera_rotations): - CM_PER_PIXEL = 10.2/10000 - TOL = 0.0000000001 - c = eye_calibration.EyeCalibration( - led_position=led_position, cm_per_pixel=CM_PER_PIXEL, - eye_radius=0.1682, camera_rotations=camera_rotations, - camera_position=np.array([0.0, 13.0, 0.0])) - pupil = pupil_params() - cr = cr_params() - bad = c.pupil_position_in_mouse_eye_coordinates(np.array([[1000, 0], [0, 1000]]), - np.array([[0, 0], [0, 0]])) - assert(np.all(np.isnan(bad))) - pos = c.pupil_position_in_mouse_eye_coordinates(pupil, cr) - x = (pupil.T[0] - cr.T[0])*CM_PER_PIXEL - y = (cr.T[1] - pupil.T[1])*CM_PER_PIXEL - xr = x*np.cos(-camera_rotations[2]) - y*np.sin(-camera_rotations[2]) - yr = x*np.sin(-camera_rotations[2]) + y*np.cos(-camera_rotations[2]) - assert(np.all(np.abs(pos.T[2] - (yr + c.cr[2])) < TOL)) - assert(np.all(np.abs(pos.T[0] + (xr - c.cr[0])) < TOL)) diff --git a/allensdk/test/internal/test_internal.py b/allensdk/test/internal/test_internal.py deleted file mode 100644 index c9e5470493..0000000000 --- a/allensdk/test/internal/test_internal.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -test_internal ----------------------------------- - -Tests for `internal` module. -""" -import pytest - - -@pytest.fixture -def decorated_example(): - """Sample pytest fixture. - See more at: http://doc.pytest.org/en/latest/fixture.html - """ - -def test_example(decorated_example): - """Sample pytest test function with the pytest fixture as an argument. - """ - import allensdk.internal - - - - diff --git a/allensdk/test/internal/test_mtrain_api.py b/allensdk/test/internal/test_mtrain_api.py deleted file mode 100644 index 9e10283522..0000000000 --- a/allensdk/test/internal/test_mtrain_api.py +++ /dev/null @@ -1,117 +0,0 @@ -import pytest - -from allensdk.internal.api.mtrain_api import MtrainApi, MtrainSqlApi - - -@pytest.mark.nightly -@pytest.mark.parametrize('api', [ - pytest.param(MtrainApi()), - pytest.param(MtrainSqlApi()), -]) -def test_get_subjects(api): - subject_list = api.get_subjects() - assert len(subject_list) > 190 and 423746 in subject_list - - -@pytest.mark.nightly -@pytest.mark.parametrize('api', [ - pytest.param(MtrainApi()), - pytest.param(MtrainSqlApi()), -]) -def test_get_behavior_training_df(api): - LabTracks_ID = 423986 - df = api.get_behavior_training_df(LabTracks_ID) - # assert list(df.columns) == [u'stage_name', u'regimen_name', u'date', - # u'behavior_session_id'] - assert len(df) == 24 - - -@pytest.mark.nightly -@pytest.mark.parametrize('LabTracks_ID', [ - pytest.param(423986), -]) -def test_get_current_stage(LabTracks_ID): - api = MtrainApi() - stage = api.get_current_stage(LabTracks_ID) - assert stage == 'OPHYS_6_images_B' - - -@pytest.mark.nightly -@pytest.mark.parametrize('behavior_session_uuid, behavior_session_id', - [pytest.param('394a910e-94c7-4472-9838-5345aff59ed8', - None), - pytest.param(None, 823847007), - pytest.param('394a910e-94c7-4472-9838-5345aff59ed8', - 823847007), - ]) -def test_get_session(behavior_session_uuid, behavior_session_id): - api = MtrainApi() - kwargs = {key: val for key, val in - [('behavior_session_uuid', behavior_session_uuid), - ('behavior_session_id', behavior_session_id)] if - val is not None} - session_dict = api.get_session(**kwargs) - trials_df = session_dict.pop('trials') - assert len(trials_df) == 576 - assert "stages" in session_dict.keys() # Remove stages because it's - # very long - del session_dict["stages"] - assert session_dict == {u'name': u'TRAINING_1_gratings', - u'parameters': {u'auto_reward_delay': 0.15, - u'change_time_scale': 2.0, - u'end_after_response': True, - u'change_flashes_max': None, - u'change_time_dist': - u'exponential', - u'stimulus_window': 6.0, - u'response_window': [0.15, 1.0], - u'change_flashes_min': None, - u'catch_frequency': 0.25, - u'min_no_lick_time': 0.0, - u'timeout_duration': 0.3, - u'free_reward_trials': 10, - u'volume_limit': 5.0, - u'max_task_duration_min': 60.0, - u'reward_volume': 0.01, - u'end_after_response_sec': 3.5, - u'start_stop_padding': 20.0, - u'periodic_flash': None, - u'stage': u'TRAINING_1_gratings', - u'auto_reward_vol': 0.005, - u'task_id': u'DoC', - u'stimulus': { - u'params': {u'phase': 0.25, - u'tex': u'sqr', - u'units': u'deg', - u'sf': 0.04, - u'size': [200, - 150]}, - u'class': u'grating', - u'groups': {u'horizontal': { - u'Ori': [90, 270]}, - u'vertical': { - u'Ori': [0, - 180]}}}, - u'failure_repeats': 5, - u'warm_up_trials': 5, - u'pre_change_time': 2.25}, - u'script': - u'http://stash.corp.alleninstitute.org/' - u'projects/VB/repos/visual_behavior_scripts/' - u'raw/change_detection_with_fingerprint.py?at=' - u'021ec55fbbdbb05aad1681c016e83066fe5aa1dd', - 'behavior_session_uuid': - u'394a910e-94c7-4472-9838-5345aff59ed8', - u'script_md5': u'e0535f3b6f03ccc8eeccaed2118f3c1d', - u'LabTracks_ID': 431151, - u'date': - u'2019-02-15T13:01:23.672000', - 'regimen_name': u'VisualBehavior_Task1A_v1.0.1', - u'default_x': False, - u'regimens': [{u'active': False, - u'default': False, - u'id': 14, - u'name': - u'VisualBehavior_Task1A_v1.0.1' - }], - u'default_y': False} diff --git a/allensdk/test/internal/test_optimize_config_reader.py b/allensdk/test/internal/test_optimize_config_reader.py deleted file mode 100644 index 4bddb9756e..0000000000 --- a/allensdk/test/internal/test_optimize_config_reader.py +++ /dev/null @@ -1,146 +0,0 @@ -from allensdk.internal.api.queries.optimize_config_reader import \ - OptimizeConfigReader -import pytest -from mock import patch, mock_open -try: - import __builtin__ as builtins -except: - import builtins - - -LIMS_MESSAGE_NO_PARAM_FILES = """ -{ - "neuronal_model": {}, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 11111 - } - ] -} -""" - -LIMS_MESSAGE_ONE_PARAM_FILE = """ -{ - "neuronal_model": {}, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 11111 - }, - { - "well_known_file_type": { - "created_at": "2015-02-13T11:41:41-08:00", - "id": 329230374, - "name": "NeuronalModelParameters", - "updated_at": "2015-02-13T11:41:41-08:00" - }, - "well_known_file_type_id": 329230374, - "id": 22222 - } - ] -} -""" - -LIMS_MESSAGE_TWO_PARAM_FILES = """ -{ - "neuronal_model": {}, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 22222 - }, - { - "well_known_file_type": { - "created_at": "2015-02-13T11:41:41-08:00", - "id": 329230374, - "name": "NeuronalModelParameters", - "updated_at": "2015-02-13T11:41:41-08:00" - }, - "well_known_file_type_id": 329230374, - "id": 22222 - } - ] -} -""" - - -@pytest.fixture -def no_param_config(): - ocr = OptimizeConfigReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_NO_PARAM_FILES)): - ocr.read_lims_file(lims_json_path) - - return ocr - - -@pytest.fixture -def one_param_config(): - ocr = OptimizeConfigReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_ONE_PARAM_FILE)): - ocr.read_lims_file(lims_json_path) - - return ocr - - -@pytest.fixture -def two_param_config(): - ocr = OptimizeConfigReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_TWO_PARAM_FILES)): - ocr.read_lims_file(lims_json_path) - - return ocr - - -def test_no_params(no_param_config): - assert no_param_config.lims_data['well_known_files'][0]['well_known_file_type']['id'] != 329230374 - no_param_config.update_well_known_file('/path/to/params_fit.json', - OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) - assert no_param_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 329230374 - - -def test_one_param(one_param_config): - assert one_param_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 329230374 - one_param_config.update_well_known_file('/path/to/params_fit.json', - OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) - assert one_param_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 329230374 - assert one_param_config.lims_update_data['well_known_files'][1]['id'] == 22222 - - -def test_two_params(two_param_config): - assert two_param_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 329230374 - two_param_config.update_well_known_file('/path/to/params_fit.json', - OptimizeConfigReader.NEURONAL_MODEL_PARAMETERS) - assert two_param_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 329230374 - assert two_param_config.lims_update_data['well_known_files'][1]['id'] == 22222 - assert len(two_param_config.lims_update_data['well_known_files']) == 2 diff --git a/allensdk/test/internal/test_optimize_manifest.py b/allensdk/test/internal/test_optimize_manifest.py deleted file mode 100644 index aa9ff5067a..0000000000 --- a/allensdk/test/internal/test_optimize_manifest.py +++ /dev/null @@ -1,203 +0,0 @@ -from allensdk.internal.api.queries.optimize_config_reader import \ - OptimizeConfigReader -import pytest -from mock import patch, mock_open, MagicMock -from six import StringIO -from io import IOBase -import json -try: - import __builtin__ as builtins -except: - import builtins - - -LIMS_MESSAGE_ONE_PARAM_FILE = """ -{ - "storage_directory": "storage directory 11111", - "specimen_id": 98765, - "specimen": { - "neuron_reconstructions": [ - { - "superseded": false, - "manual": true, - "well_known_files": [ - { - "well_known_file_type_id": 303941301, - "storage_directory": "/path/to/morphology", - "filename": "morphology_file.swc" - } - ] - } - ], - "ephys_roi_result": { - "well_known_files": [ - { - "well_known_file_type_id": 475137571, - "storage_directory": "/path/to/stimulus_nwb", - "filename": "stimulus_1234.nwb" - } - ] - }, - "ephys_sweeps": [ - { - "sweep_number": 1, - "workflow_state": "auto_passed" - }, - { - "sweep_number": 2, - "workflow_state": "manual_passed" - }, - { - "sweep_number": 3, - "workflow_state": "failed" - } - ] - }, - "neuronal_model_template": { - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 11111, - "storage_directory": "/path/to/mod_files", - "filename": "mod_file_1.mod" - } - ] - }, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2015-02-13T11:41:41-08:00", - "id": 329230374, - "name": "NeuronalModelParameters", - "updated_at": "2015-02-13T11:41:41-08:00" - }, - "well_known_file_type_id": 329230374, - "id": 22222, - "storage_directory": "/path/to/neuronal_model", - "filename": "existing_well_known.file" - } - ] -} -""" - - -def manifest_as_string(reader): - output = StringIO() - - with patch(builtins.__name__ + ".open", - mock_open(), - create=True) as manifest_f: - manifest_f.return_value = MagicMock(spec=IOBase) - file_handle = manifest_f.return_value.__enter__.return_value - file_handle.write.side_effect = output.write - - reader.to_manifest("test_manifest.json") - - return output.getvalue() - - -@pytest.fixture -def no_param_config(): - json_data = json.loads(LIMS_MESSAGE_ONE_PARAM_FILE) - json_data['well_known_files'] = [] - lims_message_no_param_file = json.dumps(json_data) - ocr = OptimizeConfigReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=lims_message_no_param_file)): - ocr.read_lims_file(lims_json_path) - - return ocr - - -@pytest.fixture -def one_param_config(): - ocr = OptimizeConfigReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_ONE_PARAM_FILE)): - ocr.read_lims_file(lims_json_path) - - return ocr - - -@pytest.fixture -def one_param_manifest_dict(one_param_config): - reader = one_param_config - json_string = manifest_as_string(reader) - the_dict = json.loads(json_string) - - return the_dict - - -def test_to_manifest(one_param_config): - with patch(builtins.__name__ + ".open", - mock_open(), - create=True) as manifest_f: - manifest_f.return_value = MagicMock(spec=IOBase) - file_handle = manifest_f.return_value.__enter__.return_value - one_param_config.to_manifest("test_manifest.json") - manifest_f.assert_called_once_with("test_manifest.json", "wb+") - - -def test_top_level_keys(one_param_manifest_dict): - assert set(one_param_manifest_dict.keys()) == set(['biophys', 'runs', 'neuron', 'manifest']) - - -def test_manifest_hoc(one_param_manifest_dict): - assert set(one_param_manifest_dict['neuron'][0].keys()) == set(['hoc']) - - -def test_specimen_id(one_param_manifest_dict): - assert one_param_manifest_dict['runs'][0]['specimen_id'] == 98765 - - -def test_sweeps(one_param_manifest_dict): - assert set(one_param_manifest_dict['runs'][0]['sweeps']) == set([1, 2]) - - -def test_mod_file_paths(one_param_config): - assert set(one_param_config.mod_file_paths()) == set(['/path/to/mod_files/mod_file_1.mod']) - - -def test_update_well_known_file_not_existing(no_param_config): - fit_file_type = 329230374 - no_param_config.update_well_known_file('/path/to/new_fit.json') - wkf = no_param_config.lims_update_data['well_known_files'][0] - assert 'id' not in wkf - assert wkf['storage_directory'] == '/path/to' - assert wkf['filename'] == 'new_fit.json' - assert wkf['well_known_file_type_id'] == fit_file_type - - -def test_update_well_known_file_existing(one_param_config): - fit_file_type = 329230374 - one_param_config.update_well_known_file('/path/to/new_fit.json') - wkf = one_param_config.lims_update_data['well_known_files'][0] - assert wkf['id'] == 22222 - assert wkf['storage_directory'] == '/path/to' - assert wkf['filename'] == 'new_fit.json' - assert wkf['well_known_file_type_id'] == fit_file_type - - -def test_manifest_keys(one_param_manifest_dict): - expected_keys = set(['BASEDIR', 'WORKDIR', 'MORPHOLOGY', 'MODFILE_DIR', - 'MOD_FILE_mod_file_1', 'stimulus_path', 'manifest', - 'output', 'neuronal_model_data', 'upfile', 'downfile', - 'passive_fit_data', 'stage_1_jobs', 'fit_1_file', - 'fit_2_file', 'fit_3_file', 'fit_type_path', - 'target_path', 'fit_config_json', 'final_hof_fit', - 'final_hof', 'output_fit_file']) - - actual_keys = set([e['key'] for e in one_param_manifest_dict['manifest']]) - assert actual_keys == expected_keys diff --git a/allensdk/test/internal/test_roi_filter.py b/allensdk/test/internal/test_roi_filter.py deleted file mode 100644 index e7d818270b..0000000000 --- a/allensdk/test/internal/test_roi_filter.py +++ /dev/null @@ -1,166 +0,0 @@ -import pytest -import pandas as pd -import numpy as np -from skimage import draw -from allensdk.internal.brain_observatory import roi_filter -from allensdk.internal.brain_observatory import roi_filter_utils -from allensdk.internal.pipeline_modules import run_roi_filter - -OVERLAP_THRESHOLD = 0.9 - - -class TestSegmentation(object): - def __init__(self, stack, n_rois, has_duplicates, has_unions): - self.stack = stack - self.n_rois = n_rois - self.has_duplicates = has_duplicates - self.has_unions = has_unions - - -def create_mask_plane(img_shape, dot_positions, radius=15): - img = np.zeros(img_shape, dtype=np.uint8) - for r, c in dot_positions: - img[draw.circle(r, c, radius, shape=img_shape)] = 1 - return img - - -@pytest.fixture(params=[(False, False), (True, True), - (False, True), (True, False)]) -def segmentation(request): - has_unions, has_duplicates = request.param - plane1 = create_mask_plane((200,200), [(20,20), (130,60), (170,110)]) - plane2 = create_mask_plane((200,200), [(130,85)]) - n_rois = 4 - masks = [plane1, plane2] - - if has_unions: - uplane = create_mask_plane((200,200), [(131,62), (131, 85)]) - masks.append(uplane) - n_rois += 1 - if has_duplicates: - dplane = create_mask_plane((200,200), [(21,20)]) - masks.append(dplane) - n_rois += 1 - - return TestSegmentation(np.array(masks), n_rois, has_duplicates, - has_unions) - - -@pytest.fixture -def object_list(): - columns = ["index", "traceindex", "tempIndex", "cx", "cy", "mask2Frame", - "frame", "object", "minx", "miny", "maxx", "maxy", "area", - "shape0", "shape1", "eXcluded", "meanInt0", "maxInt0", - "meanInt1", "maxInt1", "maxMeanRatio", "snpoffsetmean", - "snpoffsetstdv", "act2", "act3", "OvlpCount", "OvlpAreaPer", - "OvlpObj0", "corcoef0", "OvlpObj1", "corcoef1"] - data = [ - [0, 0, 112, 363, 12, 0, 81, 1, 354, 5, 371, 18, 170, 0.679, 9, 0, 49, - 73, 32, 54, 0.6875, -18.598810, 12.540119, 2778, 995, 1, 82, 85, - -1.000, 0, 0.000], - [1, 1, 12, 224, 13, 0, 2, 1, 218, 8, 230, 18, 106, 0.653, 10, 11, 30, - 62, 12, 23, 0.9167, -34.688274, 16.209919, 2818, 390, 0, 0, 0, - 0.000, 0, 0.000], - [2, 999, 109, 323, 9, 0, 206, 2, 315, 2, 331, 22, 193, 0.454, 16, 2, - 123, 255, 92, 225, 1.4457, 0.000000, 0.000000, 0, 0, 0, 0, 0, 0.000, - 0, 0.000] - ] - return pd.DataFrame(data=data, columns=columns) - - -@pytest.fixture(scope="module") -def xy_data(): - data = ["0.5,1.7","-1.2,2.5"] - return data - - -@pytest.fixture(scope="module") -def old_csv(tmpdir_factory, xy_data): - data = ["0,{},154.086,-14.9831,0,0,1,0.0254625".format(xy_data[0]), - "1,{},-0.78758,-2.39286,0,0,0,0.348251".format(xy_data[1])] - filename = str(tmpdir_factory.mktemp("test").join("old.csv")) - with open(filename, "w") as f: - f.write("\n".join(data)) - return filename - - -@pytest.fixture(scope="module") -def new_csv(tmpdir_factory, xy_data): - data = ["framenumber,x,y,correlation,input_x,input_y,estimate", - "0,{},0.65566,3.00745,-1.75258,PhaseCorrelated".format(xy_data[0]), - "1,{},0.65727,3.15259,-2.8105,PhaseCorrelated".format(xy_data[1])] - filename = str(tmpdir_factory.mktemp("test").join("new.csv")) - with open(filename, "w") as f: - f.write("\n".join(data)) - return filename - - -def model_data(ol, is_valid=True): - training_columns = list(ol.columns) - if is_valid: - training_columns.extend([1, "depth", "driver1", "driver2", "reporter1"]) - else: - training_columns.extend([2, "depth", "driver1", "driver2", "reporter1"]) - data = {"structure_ids": [1], - "drivers": ["driver1", "driver2"], - "reporters": ["reporter1"], - "training_features": pd.DataFrame(columns=training_columns)} - return data - - -def test_calculate_max_border_all_outliers(): - df = pd.DataFrame( - np.ones((100,9)), - columns=["index", "x", "y", "a", "b", "c", "d", "e", "f"]) - with pytest.raises(ValueError): - border = roi_filter_utils.calculate_max_border(df, 0) - - -def test_get_rois(segmentation): - rois = roi_filter_utils.get_rois(segmentation.stack) - assert(len(rois) == segmentation.n_rois) - - -def test_label_unions_and_duplicates(segmentation): - rois = roi_filter_utils.get_rois(segmentation.stack) - rois = roi_filter.label_unions_and_duplicates(rois, OVERLAP_THRESHOLD) - duplicates = False - unions = False - for roi in rois: - if "duplicate" in roi.labels: - duplicates |= 1 - if "union" in roi.labels: - unions |= 1 - assert(duplicates == segmentation.has_duplicates) - assert(unions == segmentation.has_unions) - - -def test_create_feature_array(object_list): - depth = 250 - structure_id = 1 - drivers = ["driver1", "driver2"] - reporters = ["reporter1"] - passing_data = model_data(object_list, True) - failing_data = model_data(object_list, False) - with pytest.raises(KeyError): - roi_filter.create_feature_array(failing_data, object_list, depth, - structure_id, drivers, reporters) - feature_array = roi_filter.create_feature_array(passing_data, object_list, - depth, structure_id, - drivers, reporters) - assert(np.all(feature_array.columns == - passing_data["training_features"].columns)) - - -def test_training_label_classifier(object_list): - classifier = roi_filter_utils.TrainingMultiLabelClassifier() - assert(classifier.labels == sorted(roi_filter_utils.CRITERIA().keys())) - - -def test_read_csv(old_csv, new_csv): - assert(not run_roi_filter.is_deprecated_motion_file(new_csv)) - assert(run_roi_filter.is_deprecated_motion_file(old_csv)) - old_data = run_roi_filter.load_rigid_motion_transform(old_csv) - new_data = run_roi_filter.load_rigid_motion_transform(new_csv) - assert(np.all(np.isclose(old_data["x"], new_data["x"]))) - assert(np.all(np.isclose(old_data["y"], new_data["y"]))) diff --git a/allensdk/test/internal/test_simulate_manifest.py b/allensdk/test/internal/test_simulate_manifest.py deleted file mode 100644 index 0ee7908679..0000000000 --- a/allensdk/test/internal/test_simulate_manifest.py +++ /dev/null @@ -1,266 +0,0 @@ -from allensdk.internal.api.queries.biophysical_module_reader import \ - BiophysicalModuleReader -import pytest -from mock import patch, mock_open, MagicMock -from six import StringIO -from io import IOBase -import json -try: - import __builtin__ as builtins -except: - import builtins - - -LIMS_MESSAGE_ONE_PARAM_FILE = """ -{ - "id": 8888, - "storage_directory": "/neuronal/model/run/storage/directory", - "neuronal_model": { - "storage_directory": "storage directory 11111", - "specimen_id": 98765, - "specimen": { - "neuron_reconstructions": [ - { - "superseded": false, - "manual": true, - "well_known_files": [ - { - "well_known_file_type_id": 303941301, - "storage_directory": "/path/to/morphology", - "filename": "morphology_file.swc" - } - ] - } - ], - "ephys_roi_result": { - "well_known_files": [ - { - "well_known_file_type_id": 475137571, - "storage_directory": "/path/to/stimulus_nwb", - "filename": "stimulus_1234.nwb" - } - ] - }, - "ephys_sweeps": [ - { - "sweep_number": 1, - "workflow_state": "auto_passed", - "ephys_stimulus": { - "ephys_stimulus_type": { - "name": "Test" - } - } - }, - { - "sweep_number": 2, - "workflow_state": "manual_passed", - "ephys_stimulus": { - "ephys_stimulus_type": { - "name": "Unknown" - } - } - }, - { - "sweep_number": 3, - "workflow_state": "failed", - "ephys_stimulus": { - "ephys_stimulus_type": { - "name": "Long Square" - } - } - } - ] - }, - "neuronal_model_template": { - "name": "Biophysical - perisomatic", - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 11111, - "storage_directory": "/path/to/mod_files", - "filename": "mod_file_1.mod" - } - ] - }, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2015-02-13T11:41:41-08:00", - "id": 329230374, - "name": "NeuronalModelParameters", - "updated_at": "2015-02-13T11:41:41-08:00" - }, - "well_known_file_type_id": 329230374, - "id": 22222, - "storage_directory": "/path/to/neuronal_model", - "filename": "existing_well_known.file" - }, - { - "well_known_file_type": { - "id": 475137571, - "name": "NWB" - }, - "well_known_file_type_id": 475137571, - "id": 343434, - "storage_directory": "/path/to/nwb_file/roi_maybe", - "filename": "stimulus_input.nwb" - } - ] - }, - "well_known_files": [ - { - "well_known_file_type": { - "id": 478840678, - "name": "NWB_UNCOMPRESSED" - }, - "well_known_file_type_id": 478840678, - "id": 343434, - "storage_directory": "/neuronal/model/run/dir", - "filename": "pre_existing_output.nwb" - } - ] -} -""" - - -def manifest_as_string(reader): - output = StringIO() - - with patch(builtins.__name__ + ".open", - mock_open(), - create=True) as manifest_f: - manifest_f.return_value = MagicMock(spec=IOBase) - file_handle = manifest_f.return_value.__enter__.return_value - file_handle.write.side_effect = output.write - - reader.to_manifest("test_manifest.json") - - manifest_string = output.getvalue() - print(manifest_string) - - return manifest_string - - -@pytest.fixture -def no_param_config(): - json_data = json.loads(LIMS_MESSAGE_ONE_PARAM_FILE) - json_data['well_known_files'] = [] - lims_message_no_param_file = json.dumps(json_data) - scr = BiophysicalModuleReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=lims_message_no_param_file)): - scr.read_lims_file(lims_json_path) - - return scr - - -@pytest.fixture -def one_param_config(): - scr = BiophysicalModuleReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_ONE_PARAM_FILE)): - scr.read_lims_file(lims_json_path) - - return scr - - -@pytest.fixture -def one_param_manifest_dict(one_param_config): - reader = one_param_config - json_string = manifest_as_string(reader) - the_dict = json.loads(json_string) - - return the_dict - - -def test_to_manifest(one_param_config): - with patch(builtins.__name__ + ".open", - mock_open(), - create=True) as manifest_f: - manifest_f.return_value = MagicMock(spec=IOBase) - file_handle = manifest_f.return_value.__enter__.return_value - one_param_config.to_manifest("test_manifest.json") - manifest_f.assert_called_once_with("test_manifest.json", "wb+") - - -def test_top_level_keys(one_param_manifest_dict): - assert set(one_param_manifest_dict.keys()) == \ - set(['biophys', 'runs', 'neuron', 'manifest']) - - -def test_manifest_hoc(one_param_manifest_dict): - assert set(one_param_manifest_dict['neuron'][0].keys()) == set(['hoc']) - - -def test_neuronal_model_run_id(one_param_manifest_dict): - assert one_param_manifest_dict['runs'][0]['neuronal_model_run_id'] == 8888 - - -def test_sweeps(one_param_manifest_dict): - assert set(one_param_manifest_dict['runs'][0]['sweeps']) == set([1, 2]) - - -def test_sweeps_by_type(one_param_manifest_dict): - sweeps_by_type = one_param_manifest_dict['runs'][0]['sweeps_by_type'] - assert set(sweeps_by_type['Test']) == set([1]) - assert set(sweeps_by_type['Unknown']) == set([2]) - assert set(sweeps_by_type['Long Square']) == set([3]) - assert len(sweeps_by_type.keys()) == 3 - - -def test_mod_file_paths(one_param_config): - assert set(one_param_config.mod_file_paths()) == \ - set(['/path/to/mod_files/mod_file_1.mod']) - - -def test_update_well_known_file_not_existing(no_param_config): - nwb_uncompressed_file_type = 478840678 - no_param_config.update_well_known_file('/path/to/pre_existing_output.nwb') - wkf = no_param_config.lims_update_data['well_known_files'][0] - assert 'id' not in wkf - assert wkf['storage_directory'] == '/path/to' - assert wkf['filename'] == 'pre_existing_output.nwb' - assert wkf['well_known_file_type_id'] == nwb_uncompressed_file_type - - -def test_update_well_known_file_existing(one_param_config): - nwb_uncompressed_file_type = 478840678 - one_param_config.update_well_known_file('/neuronal/model/run/dir/pre_existing_output.nwb') - wkf = one_param_config.lims_update_data['well_known_files'][0] - assert wkf['id'] == 343434 - assert wkf['storage_directory'] == '/neuronal/model/run/dir' - assert wkf['filename'] == 'pre_existing_output.nwb' - assert wkf['well_known_file_type_id'] == nwb_uncompressed_file_type - - -def test_update_well_known_file_existing_name_mismatch(one_param_config): - nwb_uncompressed_file_type = 478840678 - one_param_config.update_well_known_file( - '/neuronal/model/run/dir/8888_virtual_experiment.nwb') - wkf = one_param_config.lims_update_data['well_known_files'][0] - assert 'id' not in wkf - assert wkf['storage_directory'] == '/neuronal/model/run/dir' - assert wkf['filename'] == '8888_virtual_experiment.nwb' - assert wkf['well_known_file_type_id'] == nwb_uncompressed_file_type - - -def test_manifest_keys(one_param_manifest_dict): - expected_keys = set(['BASEDIR', 'WORKDIR', 'MORPHOLOGY', 'CODE_DIR', - 'MODFILE_DIR', 'MOD_FILE_mod_file_1', 'stimulus_path', - 'manifest', 'output_path', 'fit_parameters', - 'neuronal_model_run_data', 'fit_parameters']) - - actual_keys = set([e['key'] for e in one_param_manifest_dict['manifest']]) - assert actual_keys == expected_keys diff --git a/allensdk/test/internal/test_simulate_update_output.py b/allensdk/test/internal/test_simulate_update_output.py deleted file mode 100644 index 74c8970c50..0000000000 --- a/allensdk/test/internal/test_simulate_update_output.py +++ /dev/null @@ -1,162 +0,0 @@ -from allensdk.internal.api.queries.biophysical_module_reader import \ - BiophysicalModuleReader -import pytest -from mock import patch, mock_open -try: - import __builtin__ as builtins -except: - import builtins - - -LIMS_MESSAGE_NO_NWB_FILES = """ -{ - "neuronal_model": {}, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 11111 - } - ] -} -""" - - -LIMS_MESSAGE_ONE_NWB_FILE = """ -{ - "neuronal_model": {}, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 11111 - }, - { - "filename": "496537307_virtual_experiment.nwb", - "id": 22222, - "storage_directory": "/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/", - "well_known_file_type": { - "created_at": "2015-06-09T15:21:33-07:00", - "id": 478840678, - "name": "NWBUncompressed", - "updated_at": "2015-06-09T15:21:33-07:00" - }, - "well_known_file_type_id": 478840678 - } - ] -} -""" - - -LIMS_MESSAGE_TWO_NWB_FILES = """ -{ - "neuronal_model": {}, - "well_known_files": [ - { - "well_known_file_type": { - "created_at": "2013-11-05T16:59:04-08:00", - "id": 292178729, - "name": "BiophysicalModelDescription", - "updated_at": "2013-11-05T16:59:04-08:00" - }, - "well_known_file_type_id": 292178729, - "id": 11111 - }, - { - "filename": "496537307_virtual_experiment.nwb", - "id": 22222, - "storage_directory": "/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/", - "well_known_file_type": { - "created_at": "2015-06-09T15:21:33-07:00", - "id": 478840678, - "name": "NWBUncompressed", - "updated_at": "2015-06-09T15:21:33-07:00" - }, - "well_known_file_type_id": 478840678 - }, - { - "filename": "496537307_virtual_experiment.nwb", - "id": 33333, - "storage_directory": "/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/", - "well_known_file_type": { - "created_at": "2015-06-09T15:21:33-07:00", - "id": 478840678, - "name": "NWBUncompressed", - "updated_at": "2015-06-09T15:21:33-07:00" - }, - "well_known_file_type_id": 478840678 - } - ] -} -""" - - -@pytest.fixture -def no_nwb_config(): - bmr = BiophysicalModuleReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_NO_NWB_FILES)): - bmr.read_lims_file(lims_json_path) - - return bmr - - -@pytest.fixture -def one_nwb_config(): - bmr = BiophysicalModuleReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_ONE_NWB_FILE)): - bmr.read_lims_file(lims_json_path) - - return bmr - - -@pytest.fixture -def two_nwb_config(): - bmr = BiophysicalModuleReader() - - lims_json_path = 'lims_message.json' - - with patch(builtins.__name__ + ".open", - mock_open(read_data=LIMS_MESSAGE_TWO_NWB_FILES)): - bmr.read_lims_file(lims_json_path) - - return bmr - - -def test_no_nwb(no_nwb_config): - assert no_nwb_config.lims_data['well_known_files'][0]['well_known_file_type']['id'] != 478840678 - no_nwb_config.update_well_known_file('/path/to/example.nwb') - assert no_nwb_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 478840678 - - - -def test_one_nwb(one_nwb_config): - assert one_nwb_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 478840678 - one_nwb_config.update_well_known_file('/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/496537307_virtual_experiment.nwb') - assert one_nwb_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 478840678 - assert one_nwb_config.lims_update_data['well_known_files'][1]['id'] == 22222 - - -def test_two_nwb(two_nwb_config): - assert two_nwb_config.lims_data['well_known_files'][1]['well_known_file_type']['id'] == 478840678 - two_nwb_config.update_well_known_file('/projects/mousecelltypes/vol1/prod572/neuronal_model_run_496537307/496537307_virtual_experiment.nwb') - assert two_nwb_config.lims_update_data['well_known_files'][1]['well_known_file_type_id'] == 478840678 - assert two_nwb_config.lims_update_data['well_known_files'][1]['id'] == 22222 - assert len(two_nwb_config.lims_update_data['well_known_files']) == 2 diff --git a/allensdk/test/internal/tissuecyte_stitching/test_stitcher.py b/allensdk/test/internal/tissuecyte_stitching/test_stitcher.py deleted file mode 100644 index 4aef1a1cdc..0000000000 --- a/allensdk/test/internal/tissuecyte_stitching/test_stitcher.py +++ /dev/null @@ -1,150 +0,0 @@ -import operator as op - -import pytest -import mock -import numpy as np - -import allensdk.internal.mouse_connectivity.tissuecyte_stitching.stitcher as stitcher - - -def test_initialize_image(): - - image = stitcher.initialize_image({'row': 40, 'column': 12}, 2, np.float32, 'F') - - assert( np.allclose( image.shape, [40, 12, 2] ) ) - assert( np.sum(image) == 0 ) - assert( image.dtype == np.float32 ) - assert( image.flags.f_contiguous ) - - -def test_initialize_images(): - - a, b, = stitcher.initialize_images({'row': 40, 'column': 12}, 1) - - assert(a.dtype == np.uint16) - assert(b.dtype == np.int8) - assert(len(a.shape) == 3) - - -def test_make_blended_tile(): - - tile = np.arange(25, dtype=float).reshape(5, 5) - current_region = np.ones((5, 5)) * 30 - blend = np.zeros((5, 5)) - blend[-1, :] = 1 - blend[-2, :] = 0.5 - - exp = tile.copy() - exp[-1, :] = 30 - exp[-2, :] = (np.arange(15, 20, dtype=float) + 30) / 2 - - obt = stitcher.make_blended_tile(blend, tile, current_region) - assert(np.allclose(exp, obt)) - - -@pytest.mark.parametrize('lg,axis,point', [(op.lt, 0, 0), (op.gt, 0, 8), (op.lt, 1, 1), (op.gt, 1, 7)]) -def test_get_indicator_bound_point(lg, axis, point): - - indicator = np.zeros((10, 10)) - indicator[9:, :] = 1 - indicator[:, 8:] = 1 - indicator[0, :] = 1 - indicator[:, :2] = 1 - indicator[7:, 7:] = 0 - - obt = stitcher.get_indicator_bound_point(indicator, lg, axis) - - assert( obt == point ) - - -def test_blend_component_from_point(): - - mesh = np.tile(np.arange(20), (10, 1)) - point = 15 # indexed in the diff: 17 -> only last r/c - lg = op.gt - - exp = np.zeros((10, 20)) - exp[:, :18] = 0 - exp[:, -3] = 1.0 / 3.0 - exp[:, -2] = 2.0 / 3.0 - exp[:, -1] = 1 - - obt = stitcher.blend_component_from_point(point, mesh, lg) - assert( np.allclose( obt, exp ) ) - - -def test_blend_component_from_point_divzero(): - - mesh = np.zeros((20, 20)) - point = 0 - - lg = op.gt - obt = stitcher.blend_component_from_point(point, mesh, lg) - - assert( np.allclose(obt, mesh) ) - - -def test_get_blend_component_nopoint(): - - with mock.patch('allensdk.internal.mouse_connectivity.tissuecyte_stitching.stitcher.get_indicator_bound_point', - new=lambda *a, **k: None): - - assert( len(stitcher.get_blend_component(1, 2, 3, 4)) == 0 ) - - -def test_get_blend_component_actual(): - - indicator = np.zeros((20, 10)) - indicator[16:, :] = 1 - - lg = op.gt - axis = 0 - meshes = np.meshgrid(np.arange(20), np.arange(10), indexing='ij') - - exp = np.zeros_like(indicator) - exp[17, :] = 1.0 / 3.0 - exp[18, :] = 2.0 / 3.0 - exp[19, :] = 1.0 - - obt = stitcher.get_blend_component(indicator, lg, axis, meshes) - assert( np.allclose( obt, exp ) ) - - -def test_get_overall_blend(): - - meshes = np.meshgrid(np.arange(20), np.arange(20), indexing='ij') - - indicator = np.zeros((20, 20)) - indicator[16:, :] = 1 - indicator[:, 17:] = 1 - - exp = np.zeros_like(indicator) - exp[17, :] = 1.0 / 3.0 - exp[:, 18] = 1.0 / 2.0 - exp[18, :] = 2.0 / 3.0 - exp[:, -1] = 1 - exp[-1, :] = 1 - - obt = stitcher.get_overall_blend(indicator, meshes) - assert( np.allclose(obt, exp) ) - - -def test_get_blend(): - - indicator = np.zeros((20, 10)) - indicator[16:, :] = 1 - indicator[:, 7:] = 1 - - stup = (20, 10) - cb = np.sqrt - - exp = np.zeros_like(indicator) - exp[17, :] = 1.0 / 3.0 - exp[:, 8] = 1.0 / 2.0 - exp[18, :] = 2.0 / 3.0 - exp[:, -1] = 1 - exp[-1, :] = 1 - exp = np.sqrt(exp) - - obt = stitcher.get_blend(indicator, stup, cb) - assert( np.allclose( obt, exp ) ) diff --git a/allensdk/test/internal/tissuecyte_stitching/test_tile.py b/allensdk/test/internal/tissuecyte_stitching/test_tile.py deleted file mode 100644 index d7dc4662ad..0000000000 --- a/allensdk/test/internal/tissuecyte_stitching/test_tile.py +++ /dev/null @@ -1,106 +0,0 @@ -import pytest -import mock -import numpy as np - -from allensdk.internal.mouse_connectivity.tissuecyte_stitching.tile import Tile - - - -@pytest.fixture(scope='function') -def small_tile(): - - index = 20 - image = np.arange(200).reshape((10, 20)) # columns fast - is_missing = False - bounds = {'row': {'start': 40, 'end': 48}, 'column': {'start': 500, 'end': 516}} - channel = 2 - size = {'row': 8, 'column': 16} - margins = {'row': 1, 'column': 2} - - return Tile(index, image, is_missing, bounds, channel, size, margins) - - -def test_trim_self(small_tile): - - small_tile.trim_self() - - assert( np.allclose( small_tile.image.shape, [8, 16] ) ) - assert( np.amin(small_tile.image) == 22 ) - - - -def test_trim(small_tile): - - image = np.diag(np.arange(20)) - out = small_tile.trim(image) - - assert( np.allclose( out.shape, [8, 16] ) ) - assert( np.amax(out) == 8 ) - - -@pytest.mark.parametrize('rs,cs,yn', [(8, 16, False), (11, 21, True)]) -def test_average_tile_is_untrimmed(small_tile, rs, cs, yn): - - image = np.zeros((rs, cs)) - res = small_tile.average_tile_is_untrimmed(image) - - assert( res == yn ) - - -@pytest.mark.parametrize('avt,do_trim', [(np.ones((8, 16)) * 2, True), - (np.ones((8, 16)) * 2, True), - (np.ones((10, 20)) * 2, True), - (np.ones((10, 20)) * 2, False)]) -def test_apply_average_tile(small_tile, avt, do_trim): - - if do_trim: - small_tile.trim_self() - - res = small_tile.apply_average_tile(avt) - assert( np.allclose(res, small_tile.image * 2) ) - - -def test_no_average_tile(small_tile): - - res = small_tile.apply_average_tile(None) - assert( np.allclose(res, small_tile.image) ) - - -def test_apply_average_tile_to_self(small_tile): - - av = np.ones((10, 20)) * 3 - prev = small_tile.image.copy() - small_tile.apply_average_tile_to_self(av) - - assert( np.allclose( small_tile.image, prev * 3 ) ) - - -def test_get_image_region(small_tile): - - image = np.zeros((1000, 1000, 3)) - image[:, :, 0] += 1 - image[:, :, 1] += 2 - image[:, :, 2] += 3 - image[45, 505, 2] = 4 - - slc = small_tile.get_image_region() - image = image[slc] - - assert( np.allclose( image.shape, [8, 16] ) ) - assert( image.sum() == 8 * 16 * 3 + 1 ) - - -def test_get_missing_path(small_tile): - - obt = small_tile.get_missing_path() - exp = [40, 500, 48, 500, 48, 516, 40, 516] - - assert( np.allclose(obt, exp) ) - - -def test_initialize_image(small_tile): - - exp = np.zeros((8, 16)) - small_tile.initialize_image() - - assert( np.allclose( small_tile.image, exp ) ) diff --git a/allensdk/test/model/aa_model/468193142_fit.json b/allensdk/test/model/aa_model/468193142_fit.json deleted file mode 100644 index 3c1524d29d..0000000000 --- a/allensdk/test/model/aa_model/468193142_fit.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "passive": [ - { - "ra": 100 - } - ], - "fitting": [ - { - "junction_potential": -14.0, - "sweeps": [ - 42 - ] - } - ], - "conditions": [ - { - "celsius": 34, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - }, - { - "ena": 53.0, - "section": "axon", - "ek": -107.0 - }, - { - "ena": 53.0, - "section": "apic", - "ek": -107.0 - }, - { - "ena": 53.0, - "section": "dend", - "ek": -107.0 - } - ], - "v_init": -90 - } - ], - "genome": [ - { - "section": "soma", - "name": "g_pas", - "value": "0.000115204", - "mechanism": "" - }, - { - "section": "soma", - "name": "e_pas", - "value": "-60.8666", - "mechanism": "" - }, - { - "section": "axon", - "name": "g_pas", - "value": "0.00357173", - "mechanism": "" - }, - { - "section": "axon", - "name": "e_pas", - "value": "-89.2642", - "mechanism": "" - }, - { - "section": "apic", - "name": "g_pas", - "value": "0.000734207", - "mechanism": "" - }, - { - "section": "apic", - "name": "e_pas", - "value": "-85.0301", - "mechanism": "" - }, - { - "section": "dend", - "name": "g_pas", - "value": "0.000599527", - "mechanism": "" - }, - { - "section": "dend", - "name": "e_pas", - "value": "-77.8017", - "mechanism": "" - }, - { - "section": "soma", - "name": "cm", - "value": "5.74988", - "mechanism": "" - }, - { - "section": "soma", - "name": "Ra", - "value": "80.4097", - "mechanism": "" - }, - { - "section": "axon", - "name": "cm", - "value": "6.40968", - "mechanism": "" - }, - { - "section": "axon", - "name": "Ra", - "value": "134.494", - "mechanism": "" - }, - { - "section": "apic", - "name": "cm", - "value": "1.661", - "mechanism": "" - }, - { - "section": "apic", - "name": "Ra", - "value": "134.795", - "mechanism": "" - }, - { - "section": "dend", - "name": "cm", - "value": "3.60089", - "mechanism": "" - }, - { - "section": "dend", - "name": "Ra", - "value": "132.962", - "mechanism": "" - }, - { - "section": "axon", - "name": "gbar_NaV", - "value": "0.00858067", - "mechanism": "NaV" - }, - { - "section": "axon", - "name": "gbar_K_T", - "value": "0.00041204", - "mechanism": "K_T" - }, - { - "section": "axon", - "name": "gbar_Kd", - "value": "0.00991589", - "mechanism": "Kd" - }, - { - "section": "axon", - "name": "gbar_Kv2like", - "value": "0.028411", - "mechanism": "Kv2like" - }, - { - "section": "axon", - "name": "gbar_Kv3_1", - "value": "0.470895", - "mechanism": "Kv3_1" - }, - { - "section": "axon", - "name": "gbar_SK", - "value": "0.00666493", - "mechanism": "SK" - }, - { - "section": "axon", - "name": "gbar_Ca_HVA", - "value": "2.26824e-05", - "mechanism": "Ca_HVA" - }, - { - "section": "axon", - "name": "gbar_Ca_LVA", - "value": "0.000777723", - "mechanism": "Ca_LVA" - }, - { - "section": "axon", - "name": "gamma_CaDynamics", - "value": "0.0286496", - "mechanism": "CaDynamics" - }, - { - "section": "axon", - "name": "decay_CaDynamics", - "value": "810.579", - "mechanism": "CaDynamics" - }, - { - "section": "soma", - "name": "gbar_NaV", - "value": "0.0411485", - "mechanism": "NaV" - }, - { - "section": "soma", - "name": "gbar_SK", - "value": "0.00724519", - "mechanism": "SK" - }, - { - "section": "soma", - "name": "gbar_Kv3_1", - "value": "0.552412", - "mechanism": "Kv3_1" - }, - { - "section": "soma", - "name": "gbar_Ca_HVA", - "value": "9.37709e-05", - "mechanism": "Ca_HVA" - }, - { - "section": "soma", - "name": "gbar_Ca_LVA", - "value": "0.00134904", - "mechanism": "Ca_LVA" - }, - { - "section": "soma", - "name": "gamma_CaDynamics", - "value": "0.0107353", - "mechanism": "CaDynamics" - }, - { - "section": "soma", - "name": "decay_CaDynamics", - "value": "376.44", - "mechanism": "CaDynamics" - }, - { - "section": "soma", - "name": "gbar_Ih", - "value": "7.26846e-06", - "mechanism": "Ih" - }, - { - "section": "apic", - "name": "gbar_NaV", - "value": "0.0116712", - "mechanism": "NaV" - }, - { - "section": "apic", - "name": "gbar_Kv3_1", - "value": "0.593147", - "mechanism": "Kv3_1" - }, - { - "section": "apic", - "name": "gbar_Im_v2", - "value": "0.00986108", - "mechanism": "Im_v2" - }, - { - "section": "apic", - "name": "gbar_Ih", - "value": "9.41351e-06", - "mechanism": "Ih" - }, - { - "section": "dend", - "name": "gbar_NaV", - "value": "0.035328", - "mechanism": "NaV" - }, - { - "section": "dend", - "name": "gbar_Kv3_1", - "value": "0.394028", - "mechanism": "Kv3_1" - }, - { - "section": "dend", - "name": "gbar_Im_v2", - "value": "0.00107209", - "mechanism": "Im_v2" - }, - { - "section": "dend", - "name": "gbar_Ih", - "value": "2.18585e-06", - "mechanism": "Ih" - } - ] -} \ No newline at end of file diff --git a/allensdk/test/model/aa_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc b/allensdk/test/model/aa_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc deleted file mode 100644 index ab4001dbb5..0000000000 --- a/allensdk/test/model/aa_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc +++ /dev/null @@ -1,2595 +0,0 @@ -# generated by Vaa3D Plugin sort_neuron_swc -# source file(s): C:/Users/alexh/Desktop/Check then delete/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_488448269_p.swc_Z_T10.swc -# id,type,x,y,z,r,pid -1 1 550.439 522.6341 38.7565 5.1205 -1 -2 3 546.4945 522.8435 34.8855 0.1144 1 -3 3 545.4306 522.8984 33.7747 0.1398 2 -4 3 544.3552 522.9499 33.2744 0.1907 3 -5 3 543.2273 523.0071 32.7732 0.2669 4 -6 3 542.105 523.2027 32.3246 0.3178 5 -7 3 541.0068 523.3034 31.8399 0.3178 6 -8 3 539.9863 523.5138 31.2732 0.2669 7 -9 3 538.9052 523.666 30.7922 0.2034 8 -10 3 537.7933 523.5516 30.4881 0.1907 9 -11 3 536.8048 523.3217 30.1924 0.2161 10 -12 3 535.9228 523.2301 29.7063 0.2415 11 -13 3 534.8921 523.4498 29.1575 0.2161 12 -14 3 533.7904 523.4738 28.73 0.1907 13 -15 3 532.9175 522.951 28.4908 0.1907 14 -16 3 532.7802 521.9694 28.2094 0.2415 15 -17 3 533.1452 521.3723 27.652 0.2542 16 -18 3 532.9827 520.2958 27.1077 0.2415 17 -19 3 531.7346 520.1654 26.5369 0.1907 18 -20 3 530.7725 520.0258 26.1911 0.1398 19 -21 3 529.998 519.233 25.843 0.1398 20 -22 3 529.0371 518.6816 25.5543 0.178 21 -23 3 528.067 518.1382 25.3801 0.2415 22 -24 3 527.193 517.422 25.3059 0.2924 23 -25 3 526.3247 516.7105 25.3418 0.3432 24 -26 3 525.4998 515.9291 25.4183 0.3432 25 -27 3 524.8775 515.0139 25.4821 0.3178 26 -28 3 524.5526 513.9271 25.5306 0.2669 27 -29 3 524.1911 512.8518 25.5433 0.2542 28 -30 3 523.5482 511.9286 25.5061 0.2415 29 -31 3 522.7805 511.1014 25.505 0.2415 30 -32 3 521.9351 510.462 25.6241 0.2288 31 -33 3 521.2121 509.6543 25.6083 0.2161 32 -34 3 520.3244 509.5147 25.357 0.1907 33 -35 3 519.4721 508.8363 25.1901 0.1525 34 -36 3 518.391 508.6178 24.9653 0.1398 35 -37 3 517.3809 508.341 24.7245 0.1652 36 -38 3 516.5709 507.5528 24.5916 0.2288 37 -39 3 515.8147 506.7142 24.5832 0.2796 38 -40 3 514.8492 506.1891 24.5692 0.2796 39 -41 3 513.8608 505.6343 24.5185 0.2415 40 -42 3 512.9536 504.9685 24.3906 0.2034 41 -43 3 512.2809 504.1139 24.345 0.1907 42 -44 3 511.2479 503.6666 24.2214 0.1907 43 -45 3 510.2675 503.0912 24.0083 0.178 44 -46 3 509.414 502.3487 23.7194 0.178 45 -47 3 508.5744 501.7733 23.2639 0.178 46 -48 3 507.9783 501.12 22.6445 0.2034 47 -49 3 507.0723 500.4462 22.1254 0.2161 48 -50 3 506.0507 499.9417 21.7989 0.2288 49 -51 3 505.1412 499.2954 21.6514 0.2288 50 -52 3 504.5395 498.3424 21.6626 0.2288 51 -53 3 503.9617 497.4204 21.7608 0.2161 52 -54 3 503.4046 496.5372 21.7688 0.1907 53 -55 3 503.1484 495.4298 21.765 0.1652 54 -56 3 502.7994 494.3487 21.8078 0.1525 55 -57 3 502.3716 493.3077 21.8473 0.1652 56 -58 3 501.7081 492.5446 21.9327 0.1652 57 -59 3 500.7311 492.1259 22.1296 0.178 58 -60 3 499.6168 491.9726 22.3045 0.178 59 -61 3 498.5152 491.9715 22.3302 0.2161 60 -62 3 497.4959 491.6775 22.197 0.2542 61 -63 3 496.5486 491.0746 22.0414 0.2924 62 -64 3 495.9595 490.1765 21.978 0.3051 63 -65 3 495.6391 489.0989 21.9925 0.2924 64 -66 3 495.0866 488.1254 22.0311 0.2924 65 -67 3 494.3052 487.3429 22.0039 0.2669 66 -68 3 493.3077 487.0397 21.8798 0.2415 67 -69 3 492.3559 486.6427 21.8648 0.2034 68 -70 3 491.5413 485.922 21.9735 0.2034 69 -71 3 490.8126 485.0732 22.1353 0.2288 70 -72 3 490.1159 484.2335 22.2187 0.2288 71 -73 3 489.4055 483.594 22.0897 0.2161 72 -74 3 488.6402 482.7794 22.0038 0.1907 73 -75 3 488.0029 481.8917 22.0453 0.2161 74 -76 3 487.4229 480.9616 22.1693 0.2288 75 -77 3 486.9825 479.9252 22.3233 0.2415 76 -78 3 486.5649 478.9219 22.3934 0.2288 77 -79 3 486.1531 477.9598 22.2626 0.2542 78 -80 3 485.644 476.9668 22.0479 0.2669 79 -81 3 484.9942 476.0253 21.831 0.2542 80 -82 3 484.3845 475.0574 21.6328 0.1907 81 -83 3 483.7827 474.0862 21.4692 0.1398 82 -84 3 483.0174 473.2602 21.3367 0.1271 83 -85 3 482.0873 472.607 21.2002 0.1398 84 -86 3 481.0863 472.1254 21.0176 0.1525 85 -87 3 479.9812 472.0945 20.8404 0.1398 86 -88 3 479.0134 472.575 20.7658 0.1271 87 -89 3 478.0524 473.0509 20.692 0.1271 88 -90 3 476.945 473.1023 20.5434 0.1398 89 -91 3 475.8113 473.1367 20.3846 0.1525 90 -92 3 474.7211 473.4547 20.228 0.1398 91 -93 3 473.6606 473.8791 20.0431 0.1271 92 -94 3 472.6173 474.2921 19.7791 0.1144 93 -95 3 471.5408 474.5552 19.4559 0.1144 94 -96 3 470.43 474.5072 19.1214 0.1398 95 -97 3 469.3203 474.2818 18.802 0.1652 96 -98 3 468.293 473.8116 18.5503 0.1907 97 -99 3 467.3091 473.2282 18.382 0.1652 98 -100 3 466.3733 472.5727 18.2868 0.1398 99 -101 3 465.4558 471.8886 18.2468 0.1144 100 -102 3 464.5258 471.2239 18.2493 0.1144 101 -103 3 463.598 470.5547 18.2661 0.1144 102 -104 3 462.6794 469.8751 18.2748 0.1271 103 -105 3 461.7333 469.2333 18.2842 0.1398 104 -106 3 460.7849 468.595 18.314 0.1525 105 -107 3 459.9246 467.8651 18.4019 0.1398 106 -108 3 459.0506 467.1421 18.523 0.1271 107 -109 3 458.1034 466.506 18.6267 0.1144 108 -110 3 457.1058 465.9535 18.6767 0.1144 109 -111 3 456.0831 465.4627 18.6557 0.1144 110 -112 3 455.1061 464.8781 18.6145 0.1144 111 -113 3 454.1863 464.2032 18.5967 0.1144 112 -114 3 453.2654 463.5351 18.6251 0.1271 113 -115 3 452.3365 462.883 18.7032 0.1525 114 -116 3 451.5734 462.0685 18.7291 0.178 115 -117 3 450.8596 461.1956 18.6917 0.178 116 -118 3 450.0485 460.3994 18.665 0.1525 117 -119 3 449.2294 459.6009 18.6749 0.1271 118 -120 3 448.5864 458.6639 18.7251 0.1144 119 -121 3 447.9378 457.7258 18.8422 0.1144 120 -122 3 447.0443 457.3277 19.1598 0.1271 121 -123 3 445.9976 457.0555 19.5718 0.1525 122 -124 3 445.2116 456.2638 19.9076 0.1907 123 -125 3 444.4188 455.439 20.1542 0.2034 124 -126 3 443.3206 455.1576 20.3189 0.1907 125 -127 3 442.5003 454.3728 20.4095 0.1525 126 -128 3 441.7911 453.4759 20.4381 0.1271 127 -129 3 441.6984 452.3376 20.4401 0.1144 128 -130 3 441.6984 451.1936 20.44 0.1144 129 -131 3 532.6739 519.2788 24.444 0.3432 18 -132 3 532.3272 518.5592 23.3628 0.3178 131 -133 3 531.8364 517.7332 23.0309 0.2796 132 -134 3 531.3697 516.7151 22.7869 0.2796 133 -135 3 530.8743 515.7667 22.4581 0.2924 134 -136 3 530.8721 514.6261 21.9058 0.2924 135 -137 2 548.9804 526.7983 37.3792 0.1144 1 -138 2 548.6132 527.8702 37.231 0.1271 137 -139 2 548.6555 528.9559 37.1815 0.1398 138 -140 2 549.2275 529.9397 37.1465 0.1652 139 -141 2 549.5524 531.0299 37.1204 0.178 140 -142 2 549.6268 532.1671 37.1017 0.2034 141 -143 2 549.4243 533.2699 37.112 0.2161 142 -144 2 548.8912 534.2606 37.1823 0.2415 143 -145 2 548.1991 535.0625 37.1927 0.2415 144 -146 2 547.4738 535.7649 37.0028 0.2415 145 -147 2 546.7096 536.496 36.836 0.2161 146 -148 2 545.8699 537.2213 36.7564 0.2034 147 -149 2 545.2304 538.157 36.6797 0.178 148 -150 2 544.7934 539.2072 36.5784 0.1652 149 -151 2 544.536 540.3043 36.4294 0.1652 150 -152 2 544.1367 541.3397 36.2236 0.1907 151 -153 2 543.6254 542.2571 35.8904 0.2288 152 -154 2 543.0305 543.0545 35.7199 0.2542 153 -155 2 542.8005 544.1562 35.6468 0.2542 154 -156 2 542.7708 545.2922 35.5634 0.2542 155 -157 2 542.7708 546.4316 35.3864 0.2796 156 -158 3 552.107 517.9449 38.7565 0.1271 1 -159 3 552.4731 516.8615 38.7229 0.1398 158 -160 3 552.8208 515.7713 38.7078 0.1525 159 -161 3 553.1686 514.6822 38.6873 0.1525 160 -162 3 553.6571 513.6549 38.6635 0.1525 161 -163 3 554.2291 512.6642 38.6327 0.1652 162 -164 3 554.9201 511.757 38.5944 0.1652 163 -165 3 555.5321 510.8841 38.4208 0.178 164 -166 3 556.3249 510.1668 38.3872 0.1652 165 -167 3 557.1108 509.3626 38.4205 0.1652 166 -168 3 557.7366 508.8672 38.2337 0.2542 167 -169 3 558.7616 508.4634 38.1276 0.2415 168 -170 3 559.7558 507.9131 38.0173 0.2415 169 -171 3 560.7911 507.4487 37.9016 0.2161 170 -172 3 561.8619 507.1535 37.7415 0.1907 171 -173 3 562.8617 507.1924 37.7311 0.178 172 -174 3 563.833 507.1501 37.9708 0.178 173 -175 3 564.9392 507.1192 38.2256 0.2034 174 -176 3 565.9746 507.3034 38.2519 0.2034 175 -177 3 567.0888 507.3011 38.3239 0.2034 176 -178 3 568.1687 507.0688 38.2175 0.1907 177 -179 3 569.2029 506.617 38.0598 0.1907 178 -180 3 570.1216 505.9637 37.8969 0.1907 179 -181 3 571.0997 505.4375 37.6477 0.1907 180 -182 3 572.1018 505.195 37.214 0.2034 181 -183 3 573.0616 504.8541 36.6831 0.2161 182 -184 3 573.9025 504.234 36.136 0.2161 183 -185 3 574.7513 503.9274 35.4497 0.1907 184 -186 3 575.1128 504.1608 34.956 0.1525 185 -187 3 576.1436 504.6173 34.6685 0.178 186 -188 3 577.2601 504.7763 34.5554 0.2161 187 -189 3 578.3641 504.6001 34.5033 0.2669 188 -190 3 579.412 504.1928 34.426 0.2796 189 -191 3 580.3798 503.797 34.491 0.2669 190 -192 3 581.4506 503.606 34.5783 0.2415 191 -193 3 582.55 503.821 34.5842 0.2161 192 -194 3 583.6036 504.1516 34.4484 0.2034 193 -195 3 584.6389 504.5841 34.258 0.2034 194 -196 3 585.6662 505.0886 34.0684 0.2288 195 -197 3 586.6192 505.7144 33.8702 0.2669 196 -198 3 587.6373 506.1308 33.6064 0.2796 197 -199 3 588.6749 505.8631 33.311 0.2669 198 -200 3 589.732 505.4352 33.0571 0.2288 199 -201 3 590.7479 504.9147 32.8434 0.2034 200 -202 3 591.742 504.4056 32.5828 0.2034 201 -203 3 592.854 504.3335 32.3394 0.2288 202 -204 3 593.0324 505.1767 32.368 0.178 203 -205 3 593.1629 506.2063 31.2774 0.1525 204 -206 3 593.0439 507.2382 30.7639 0.1398 205 -207 3 593.2018 508.3067 30.2341 0.1398 206 -208 3 593.7989 509.2161 29.8446 0.1652 207 -209 3 594.7256 509.7653 29.4913 0.1652 208 -210 3 595.8101 509.7161 29.0931 0.178 209 -211 3 596.8912 509.5445 28.6168 0.1652 210 -212 3 597.9882 509.6978 28.1215 0.1652 211 -213 3 599.0201 510.1702 27.626 0.1398 212 -214 3 599.3736 510.9482 26.9294 0.1271 213 -215 3 599.7203 511.7158 26.0427 0.1271 214 -216 3 600.7373 512.0441 25.2477 0.1398 215 -217 3 601.7017 511.5762 24.5451 0.1525 216 -218 3 602.3526 511.1792 23.6453 0.1398 217 -219 3 602.3995 511.8691 22.6032 0.1271 218 -220 3 601.704 511.9331 21.554 0.1271 219 -221 3 601.1468 511.042 20.6665 0.1398 220 -222 3 600.8551 510.1279 19.7738 0.1525 221 -223 3 601.6044 509.4701 18.1933 0.1525 222 -224 3 593.5141 503.7661 32.1107 0.2415 203 -225 3 594.5311 503.2868 31.9127 0.2415 224 -226 3 595.6556 503.225 31.7456 0.2415 225 -227 3 596.779 503.4275 31.6022 0.2415 226 -228 3 597.9093 503.5236 31.4462 0.2288 227 -229 3 599.0384 503.5488 31.2421 0.2288 228 -230 3 600.1676 503.638 31.0064 0.2034 229 -231 3 601.299 503.7856 30.788 0.178 230 -232 3 602.2748 503.2982 30.5978 0.1525 231 -233 3 602.8754 502.3418 30.4312 0.178 232 -234 3 603.7037 501.5822 30.2347 0.1907 233 -235 3 604.6692 501.0125 29.9855 0.2161 234 -236 3 605.5833 500.3341 29.734 0.1907 235 -237 3 606.5316 499.6958 29.5114 0.178 236 -238 3 607.647 499.4807 29.3129 0.1525 237 -239 3 608.7464 499.7267 29.0738 0.1652 238 -240 3 609.8458 499.8582 28.7756 0.178 239 -241 3 610.3412 499.92 28.5421 0.1271 240 -242 3 611.4588 500.1168 28.3248 0.1525 241 -243 3 612.5022 500.0367 28.0708 0.1907 242 -244 3 613.5192 499.6042 27.8741 0.2034 243 -245 3 614.5854 499.6363 27.8046 0.1907 244 -246 3 615.6951 499.7999 27.7604 0.1525 245 -247 3 616.7407 499.4876 27.6347 0.1525 246 -248 3 617.712 498.9384 27.403 0.1652 247 -249 3 618.7816 498.6021 27.134 0.2161 248 -250 3 619.8753 498.593 26.7795 0.2161 249 -251 3 620.9438 498.9007 26.3927 0.2415 250 -252 3 622.0191 499.2896 26.0399 0.2161 251 -253 3 623.1071 499.6443 25.719 0.2415 252 -254 3 624.2259 499.8262 25.393 0.2288 253 -255 3 625.2646 499.5745 24.9766 0.2542 254 -256 3 625.5735 498.6433 24.5461 0.2542 255 -257 3 625.8058 498.045 23.8746 0.2796 256 -258 3 626.7301 498.3973 23.1497 0.2796 257 -259 3 627.8032 498.7897 22.6195 0.2669 258 -260 3 628.4793 498.9201 22.4274 0.2034 259 -261 3 629.4952 498.53 21.603 0.1907 260 -262 3 629.9242 497.5954 21.1885 0.2034 261 -263 3 630.0877 496.5898 20.6347 0.2034 262 -264 3 630.7764 495.8348 20.1053 0.2415 263 -265 3 631.8404 495.4984 19.7111 0.2415 264 -266 3 632.8082 494.9436 19.3447 0.2288 265 -267 3 633.8263 494.5066 18.9905 0.2034 266 -268 3 634.888 494.1222 18.7224 0.1907 267 -269 3 635.9805 493.7801 18.5569 0.2034 268 -270 3 637.0536 493.4129 18.4902 0.2288 269 -271 3 638.1072 493.0171 18.5193 0.2542 270 -272 3 639.1734 492.6716 18.5318 0.2542 271 -273 3 640.2819 492.5343 18.5067 0.2288 272 -274 3 641.3985 492.6728 18.5063 0.2034 273 -275 3 642.2965 493.2779 18.4593 0.2034 274 -276 3 643.0744 493.6898 18.1726 0.2161 275 -277 3 643.627 492.9073 17.7735 0.2288 276 -278 3 644.4198 492.1099 17.4194 0.2288 277 -279 3 645.1851 491.2965 17.2443 0.2161 278 -280 3 645.7125 490.3607 17.2652 0.1907 279 -281 3 646.5076 489.5771 17.2319 0.1525 280 -282 3 647.3885 488.8712 17.0562 0.1271 281 -283 3 628.1635 498.8801 22.3104 0.2288 259 -284 3 629.1039 499.396 22.1775 0.2669 283 -285 3 629.6919 500.309 22.0513 0.2669 284 -286 3 630.0557 501.3614 22.0288 0.2415 285 -287 3 630.6117 502.3258 22.0231 0.1907 286 -288 3 631.3633 503.1724 21.9534 0.1907 287 -289 3 632.2716 503.8416 21.8464 0.2034 288 -290 3 633.1743 504.5097 21.8147 0.2161 289 -291 3 634.0208 505.251 21.8795 0.2034 290 -292 3 634.8148 506.0621 21.9253 0.1907 291 -293 3 635.6098 506.8812 21.9604 0.2034 292 -294 3 636.4209 507.6752 22.0233 0.2034 293 -295 3 636.8408 508.675 22.0006 0.2288 294 -296 3 637.5295 509.5136 21.8594 0.2288 295 -297 3 638.5293 510.0455 21.7031 0.2542 296 -298 3 639.6276 510.351 21.5681 0.2415 297 -299 3 640.7201 510.6404 21.4007 0.2542 298 -300 3 641.6273 511.2708 21.1864 0.2288 299 -301 3 642.674 511.7078 21.0354 0.2034 300 -302 3 643.7414 512.0567 21.0248 0.1525 301 -303 3 644.8602 512.091 21.1093 0.1271 302 -304 3 645.9974 511.988 21.1938 0.1144 303 -305 3 647.1402 511.9686 21.2602 0.1271 304 -306 3 648.2762 512.099 21.2866 0.1525 305 -307 3 649.4122 512.2397 21.2581 0.178 306 -308 3 650.4841 512.631 21.179 0.178 307 -309 3 651.484 513.0657 20.9507 0.1525 308 -310 3 652.604 512.9593 20.6832 0.1398 309 -311 3 653.5249 512.3633 20.3519 0.1398 310 -312 3 654.6323 512.1368 20.1638 0.1525 311 -313 3 655.7385 511.9091 20.0922 0.1525 312 -314 3 656.8184 511.6082 19.9716 0.1525 313 -315 3 657.9007 511.3119 19.8295 0.178 314 -316 3 659.0412 511.3016 19.762 0.1907 315 -317 3 660.183 511.3016 19.7497 0.2034 316 -318 3 661.3224 511.2319 19.7705 0.1652 317 -319 3 662.4389 511.0271 19.8383 0.1525 318 -320 3 663.5623 510.8452 19.9329 0.1525 319 -321 3 664.704 510.8154 19.9741 0.1907 320 -322 3 665.8469 510.8303 19.9437 0.2161 321 -323 3 666.9486 511.0694 19.8096 0.2288 322 -324 3 668.0491 511.3062 19.605 0.2161 323 -325 3 669.1679 511.4515 19.3649 0.1907 324 -326 3 670.2868 511.5934 19.1224 0.1525 325 -327 3 671.385 511.8576 19.0283 0.1271 326 -328 3 672.4775 512.131 19.0638 0.1144 327 -329 3 673.4064 512.7946 19.1335 0.1144 328 -330 3 674.2999 513.5084 19.209 0.1398 329 -331 3 674.8593 514.506 19.3304 0.1652 330 -332 3 610.0197 500.0115 28.8702 0.1652 240 -333 3 610.6947 500.6064 30.8081 0.1652 332 -334 3 611.3708 501.2013 31.6733 0.1652 333 -335 3 612.2528 501.6726 32.6222 0.1525 334 -336 3 613.2984 502.089 33.465 0.1525 335 -337 3 613.9722 502.9939 34.1729 0.1652 336 -338 3 614.4676 503.7455 34.8698 0.178 337 -339 3 615.5555 503.638 35.3816 0.1907 338 -340 3 616.5451 504.0121 35.716 0.178 339 -341 3 617.2509 504.8495 36.0332 0.1652 340 -342 3 617.8572 505.815 36.2869 0.178 341 -343 3 618.5597 506.7142 36.4826 0.2288 342 -344 3 619.3685 507.4967 36.6615 0.2796 343 -345 3 620.2162 508.2403 36.8399 0.2796 344 -346 3 620.9701 509.0937 36.9513 0.2415 345 -347 3 621.629 510.0169 36.9606 0.2161 346 -348 3 622.2262 510.979 36.9026 0.2288 347 -349 3 622.7753 511.9778 36.8376 0.2415 348 -350 3 623.2901 512.9982 36.8082 0.2415 349 -351 3 623.8186 514.0061 36.8497 0.2288 350 -352 3 624.3574 515.0048 36.9743 0.2415 351 -353 3 624.8986 516.0069 37.1468 0.2288 352 -354 3 625.4946 516.9782 37.3276 0.2288 353 -355 3 626.2325 517.8453 37.4867 0.2288 354 -356 3 627.0081 518.6816 37.6244 0.2669 355 -357 3 627.6579 519.6105 37.7717 0.2669 356 -358 3 628.2722 520.568 37.9092 0.2415 357 -359 3 628.9598 521.4707 37.9778 0.2034 358 -360 3 629.7743 522.2337 38.0461 0.1907 359 -361 3 630.6861 522.8892 38.1867 0.178 360 -362 3 631.5704 523.5939 38.3236 0.1525 361 -363 3 632.457 524.3112 38.4096 0.1525 362 -364 3 633.4442 524.8661 38.4689 0.1907 363 -365 3 634.4738 525.358 38.5398 0.2415 364 -366 3 635.4314 525.9654 38.6666 0.2542 365 -367 3 636.4164 526.4997 38.8699 0.2415 366 -368 3 637.4917 526.8074 39.1465 0.2542 367 -369 3 638.5957 527.0133 39.4724 0.2796 368 -370 3 639.7042 527.1907 39.8132 0.2924 369 -371 3 640.8242 527.3611 40.1181 0.2542 370 -372 3 641.9464 527.5396 40.3088 0.2034 371 -373 3 643.0687 527.7192 40.3752 0.1652 372 -374 3 644.199 527.8679 40.3768 0.1525 373 -375 3 645.335 527.996 40.3598 0.178 374 -376 3 646.4286 528.2981 40.3567 0.1907 375 -377 3 647.472 528.7648 40.4023 0.2034 376 -378 3 648.5313 529.1778 40.5367 0.1652 377 -379 3 649.6181 529.5118 40.7641 0.1398 378 -380 3 650.7369 529.7109 41.0567 0.1271 379 -381 3 651.8718 529.8367 41.4025 0.1525 380 -382 3 652.986 530.0346 41.8303 0.178 381 -383 3 654.0786 530.3001 42.3567 0.178 382 -384 3 655.1642 530.4694 42.992 0.1652 383 -385 3 656.1298 530.7325 43.7833 0.1652 384 -386 3 657.101 530.9464 44.6936 0.178 385 -387 3 658.1215 530.9796 45.6599 0.1907 386 -388 3 658.9394 530.4328 46.6262 0.178 387 -389 3 659.0859 529.3643 47.4337 0.1652 388 -390 3 658.8662 528.2489 48.0777 0.1525 389 -391 3 658.9692 527.1884 48.6766 0.1525 390 -392 3 659.7391 526.8795 49.3444 0.1652 391 -393 3 660.7366 526.8314 49.994 0.1652 392 -394 3 661.8143 526.4882 50.3972 0.178 393 -395 3 662.4973 525.9494 50.0312 0.1907 394 -396 3 575.6093 503.9297 34.72 0.1398 185 -397 3 576.3426 503.2548 34.5229 0.1271 396 -398 3 577.2224 502.5752 34.4585 0.1144 397 -399 3 577.4054 501.7092 34.2832 0.1398 398 -400 3 577.6365 500.5938 34.1449 0.178 399 -401 3 577.6845 499.4738 33.9948 0.2161 400 -402 3 577.2796 498.4214 33.8512 0.2034 401 -403 3 576.7899 497.4306 33.7053 0.1652 402 -404 3 576.4936 496.3999 33.3889 0.1398 403 -405 3 576.0864 495.463 32.8835 0.1525 404 -406 3 575.7157 494.4391 32.3649 0.178 405 -407 3 575.7203 493.3706 31.8797 0.178 406 -408 3 576.0315 492.317 31.3233 0.1652 407 -409 3 576.7076 491.5665 30.6718 0.1525 408 -410 3 576.6721 490.5014 30.0572 0.1525 409 -411 3 575.7157 489.9249 29.5557 0.1398 410 -412 3 574.5866 489.7922 29.1015 0.1271 411 -413 3 573.5158 489.6034 28.5908 0.1144 412 -414 3 573.1818 488.5338 28.1646 0.1271 413 -415 3 572.739 487.5522 27.6693 0.1398 414 -416 3 572.3135 486.5684 27.1038 0.1525 415 -417 3 571.8124 485.5674 26.6724 0.1398 416 -418 3 570.9429 484.8398 26.2966 0.1398 417 -419 3 569.9648 484.5984 25.8593 0.1398 418 -420 3 568.9524 484.9542 25.3269 0.1652 419 -421 3 568.2683 484.587 24.6823 0.1652 420 -422 3 567.9731 483.5333 24.0018 0.1652 421 -423 3 567.7455 482.4545 23.3127 0.1398 422 -424 3 567.7237 481.3288 22.671 0.1271 423 -425 3 567.7237 480.2157 22.0704 0.1144 424 -426 3 567.5979 479.1644 21.4256 0.1271 425 -427 3 566.7525 478.9619 20.8048 0.1398 426 -428 3 565.6222 479.098 20.2697 0.1525 427 -429 3 564.612 478.7114 19.8039 0.1398 428 -430 3 563.7895 478.3865 19.2093 0.1271 429 -431 3 563.0917 478.24 18.4252 0.1398 430 -432 3 562.3572 477.5617 17.8013 0.1652 431 -433 3 561.6182 476.754 17.4778 0.1907 432 -434 3 560.5863 476.3273 17.2886 0.178 433 -435 3 559.559 475.8399 17.1859 0.178 434 -436 3 558.5855 475.3789 17.0994 0.2034 435 -437 3 557.4632 475.3503 17.127 0.2288 436 -438 3 556.8168 476.2094 17.3242 0.2288 437 -439 3 556.5903 477.1853 17.7273 0.178 438 -440 3 556.2734 478.2492 18.1906 0.1525 439 -441 3 555.8204 479.2594 19.3304 0.1398 440 -442 3 557.5639 508.317 38.8091 0.178 167 -443 3 557.7526 507.1958 39.6158 0.1652 442 -444 3 557.986 506.1285 39.9734 0.2034 443 -445 3 557.9071 505.1973 40.5216 0.2288 444 -446 3 557.3682 504.321 41.1368 0.2415 445 -447 3 557.0811 503.2502 41.6046 0.2161 446 -448 3 557.4998 502.7422 42.1067 0.2034 447 -449 3 558.0707 501.9678 42.5121 0.1907 448 -450 3 557.954 500.8649 42.8672 0.178 449 -451 3 557.6451 499.8033 43.209 0.1652 450 -452 3 557.4804 498.8012 43.4087 0.1525 451 -453 3 557.0411 497.7807 43.4498 0.178 452 -454 3 556.9598 496.6607 43.4949 0.2034 453 -455 3 556.9587 495.5476 43.5887 0.2161 454 -456 3 557.1612 494.4894 43.745 0.2288 455 -457 3 556.9804 493.0754 43.6892 0.1652 456 -458 3 556.8397 491.9669 43.507 0.178 457 -459 3 556.6761 490.8618 43.2247 0.178 458 -460 3 556.4874 489.7613 42.8593 0.1907 459 -461 3 556.3512 488.6424 42.4732 0.1907 460 -462 3 556.2963 487.5042 42.1341 0.178 461 -463 3 556.2814 486.3613 41.9 0.178 462 -464 3 556.278 485.2184 41.7631 0.178 463 -465 3 556.2139 484.0893 41.641 0.1907 464 -466 3 555.9794 482.9945 41.4739 0.178 465 -467 3 555.833 481.8814 41.3314 0.1525 466 -468 3 555.9131 480.7877 41.3039 0.1271 467 -469 3 555.9726 479.6918 41.249 0.1271 468 -470 3 555.9726 478.5764 41.0827 0.1398 469 -471 3 555.889 477.4713 40.8475 0.1525 470 -472 3 555.5035 476.4108 40.5882 0.1398 471 -473 3 555.1146 475.3549 40.3334 0.1398 472 -474 3 554.9956 474.2189 40.1296 0.1398 473 -475 3 554.9475 473.076 39.9994 0.1652 474 -476 3 554.9933 471.9423 39.9529 0.1652 475 -477 3 555.2084 470.8349 39.9963 0.1652 476 -478 3 555.3628 469.7207 40.0498 0.1398 477 -479 3 555.3628 468.5904 40.0011 0.1398 478 -480 3 555.3742 467.4601 39.8656 0.1398 479 -481 3 555.4234 466.3344 39.6595 0.1652 480 -482 3 555.5024 465.2065 39.4162 0.178 481 -483 3 555.6511 464.0808 39.2196 0.2034 482 -484 3 555.8788 462.9791 39.1373 0.2161 483 -485 3 556.1224 461.8728 39.0908 0.2288 484 -486 3 556.2723 460.762 38.967 0.2161 485 -487 3 556.1979 459.6432 38.7778 0.2034 486 -488 3 555.8387 458.5873 38.5885 0.1907 487 -489 3 555.2152 457.6389 38.3729 0.1907 488 -490 3 554.7062 456.639 38.0878 0.178 489 -491 3 554.2749 455.6003 37.7902 0.1525 490 -492 3 553.9031 454.5181 37.5483 0.1525 491 -493 3 553.7177 453.4152 37.3425 0.1652 492 -494 3 553.8584 452.2793 37.1529 0.2034 493 -495 3 553.9134 451.1593 36.9326 0.1907 494 -496 3 553.6159 450.1091 36.64 0.178 495 -497 3 553.14 449.0875 36.3163 0.1525 496 -498 3 552.9432 447.987 35.9682 0.1525 497 -499 3 552.9021 446.8658 35.6006 0.1525 498 -500 3 552.8357 445.7459 35.2374 0.1398 499 -501 3 552.5989 444.6545 34.9194 0.1271 500 -502 3 552.0841 443.6421 34.6853 0.1271 501 -503 3 551.5087 442.6697 34.5778 0.1525 502 -504 3 551.0328 441.6572 34.6024 0.1907 503 -505 3 551.011 440.583 34.6648 0.2034 504 -506 3 551.4137 439.5237 34.6688 0.1907 505 -507 3 551.6665 438.4414 34.585 0.1525 506 -508 3 551.6997 437.3054 34.4501 0.1271 507 -509 3 551.6951 436.1626 34.2913 0.1144 508 -510 3 551.6208 435.0232 34.1312 0.1144 509 -511 3 551.5007 433.886 33.9886 0.1144 510 -512 3 551.3748 432.7489 33.8604 0.1271 511 -513 3 551.2627 431.6095 33.7336 0.1525 512 -514 3 551.1151 430.4769 33.5818 0.178 513 -515 3 550.645 429.4988 33.3393 0.178 514 -516 3 550.0066 428.6007 32.9963 0.1525 515 -517 3 549.4563 427.6261 32.62 0.1271 516 -518 3 549.0617 426.5633 32.2622 0.1144 517 -519 3 548.9381 425.4376 31.9659 0.1271 518 -520 3 548.8168 424.3016 31.7402 0.1652 519 -521 3 548.4187 423.264 31.5204 0.2288 520 -522 3 547.722 422.3968 31.2892 0.2669 521 -523 3 546.9155 421.5937 31.1058 0.2669 522 -524 3 546.3515 420.6396 31.0344 0.2288 523 -525 3 546.1994 419.5414 31.0436 0.2161 524 -526 3 546.0873 418.4134 31.0072 0.2034 525 -527 3 545.7727 417.4113 30.7992 0.2161 526 -528 3 545.5072 416.3325 30.6012 0.2161 527 -529 3 545.2682 415.2228 30.4349 0.2288 528 -530 3 544.8986 414.1577 30.1941 0.2161 529 -531 3 544.4536 413.1213 29.8609 0.2034 530 -532 3 543.9651 412.1066 29.465 0.2034 531 -533 3 543.1071 411.538 28.9722 0.2161 532 -534 3 542.0512 411.4202 28.3657 0.2161 533 -535 3 541.0731 410.9156 27.7629 0.1907 534 -536 3 540.1442 410.259 27.2133 0.1525 535 -537 3 539.6054 409.298 26.6565 0.1271 536 -538 3 538.6776 408.7352 26.106 0.1144 537 -539 3 537.5439 408.6963 25.6006 0.1144 538 -540 3 536.4113 408.6597 25.1358 0.1144 539 -541 3 535.344 408.654 24.611 0.1144 540 -542 3 534.296 408.654 23.31 0.1271 541 -543 3 557.4094 494.2595 45.4454 0.178 456 -544 3 558.1565 493.5491 46.8247 0.178 543 -545 3 558.9058 492.8295 47.4376 0.2034 544 -546 3 559.6379 492.0333 48.1138 0.2542 545 -547 3 560.2889 491.1078 48.7172 0.2796 546 -548 3 560.9776 490.1983 49.2492 0.2542 547 -549 3 561.7932 489.4375 49.7694 0.2161 548 -550 3 562.5792 488.6825 50.3012 0.178 549 -551 3 563.2095 487.773 50.8194 0.1652 550 -552 3 563.5538 486.7377 51.3467 0.1398 551 -553 3 563.603 485.6131 51.8176 0.1271 552 -554 3 563.531 484.4737 52.1987 0.1271 553 -555 3 563.3411 483.3549 52.5176 0.1525 554 -556 3 563.0894 482.2452 52.7794 0.178 555 -557 3 562.7874 481.1527 52.9178 0.178 556 -558 3 562.9784 480.0796 53.0947 0.1652 557 -559 3 562.8674 478.947 53.2409 0.1525 558 -560 3 562.7336 477.8122 53.3613 0.1652 559 -561 3 562.8686 476.6876 53.4584 0.1652 560 -562 3 563.1248 475.5734 53.5433 0.178 561 -563 3 563.4108 474.466 53.6278 0.178 562 -564 3 563.7186 473.3643 53.7062 0.1907 563 -565 3 563.9657 472.2489 53.814 0.178 564 -566 3 564.0572 471.1255 53.9907 0.1652 565 -567 3 564.1007 469.9987 54.2371 0.1652 566 -568 3 564.4141 468.9245 54.4477 0.178 567 -569 3 564.8294 467.8697 54.6084 0.1907 568 -570 3 565.3637 466.8767 54.831 0.2034 569 -571 3 565.9974 465.9546 55.1583 0.2161 570 -572 3 566.7468 465.1641 55.6074 0.2161 571 -573 3 567.3725 464.2558 56.131 0.178 572 -574 3 567.845 463.2319 56.6846 0.1398 573 -575 3 568.2008 462.1646 57.2625 0.1144 574 -576 3 568.4902 461.0812 57.8544 0.1144 575 -577 3 568.5749 459.9727 58.4623 0.1144 576 -578 3 568.5142 458.8607 59.0862 0.1271 577 -579 3 568.6446 457.7487 59.7055 0.1398 578 -580 3 568.7602 456.8095 60.4629 0.1525 579 -581 3 568.2866 455.844 61.2128 0.1398 580 -582 3 568.2294 454.7526 61.9382 0.1271 581 -583 3 568.9901 454.0822 62.5439 0.1144 582 -584 3 567.9525 453.8442 63.1308 0.1144 583 -585 3 567.3576 453.0046 63.6619 0.1144 584 -586 3 567.2844 451.8846 64.1348 0.1144 585 -587 3 567.472 450.7932 64.6274 0.1271 586 -588 3 567.8324 449.7121 65.1006 0.1398 587 -589 3 568.0669 448.6024 65.5628 0.1525 588 -590 3 568.0887 447.5454 66.1371 0.1398 589 -591 3 568.1802 446.4906 66.8248 0.1271 590 -592 3 568.155 445.4164 67.5797 0.1144 591 -593 3 567.8519 444.3651 68.348 0.1144 592 -594 3 567.5144 443.3172 69.1118 0.1144 593 -595 3 567.1769 442.2693 69.8527 0.1144 594 -596 3 566.8394 441.2214 70.5538 0.1144 595 -597 3 566.4974 440.1712 71.2166 0.1144 596 -598 3 566.0809 439.1095 71.7816 0.1144 597 -599 3 565.6554 438.0479 72.2579 0.1144 598 -600 3 565.6314 436.9336 72.7359 0.1144 599 -601 3 566.1702 436.0219 73.2906 0.1144 600 -602 3 566.7101 435.109 73.8912 0.1271 601 -603 3 567.249 434.1972 75.3234 0.1398 602 -604 3 556.8363 500.8203 44.7846 0.2161 451 -605 3 556.0481 501.6371 45.2312 0.178 604 -606 3 555.1638 502.3453 45.3611 0.1652 605 -607 3 554.8549 503.1587 45.5963 0.1652 606 -608 3 555.1546 504.1951 45.981 0.1907 607 -609 3 555.4452 505.2465 46.4778 0.1907 608 -610 3 554.9327 506.1788 46.8586 0.2161 609 -611 3 554.6764 507.2565 47.3334 0.2415 610 -612 3 554.1559 508.1888 47.9343 0.2415 611 -613 3 553.6102 509.1635 48.5094 0.1907 612 -614 3 553.7566 510.105 49.1456 0.1525 613 -615 3 554.5815 510.4883 49.9929 0.1398 614 -616 3 554.8983 511.3337 50.9891 0.1525 615 -617 3 554.8091 512.4285 51.9672 0.1525 616 -618 3 554.1719 513.0074 52.9211 0.1525 617 -619 3 553.148 512.9376 53.9129 0.1525 618 -620 3 552.2065 512.8277 54.9794 0.1652 619 -621 3 551.2215 513.0508 56.0045 0.178 620 -622 3 550.1485 513.3997 56.896 0.1907 621 -623 3 549.1555 513.6514 57.7948 0.1652 622 -624 3 548.1362 513.7155 58.7093 0.1398 623 -625 3 547.3697 514.1536 59.6702 0.1144 624 -626 3 546.7462 514.9968 60.5626 0.1271 625 -627 3 546.0621 515.9074 61.2629 0.1525 626 -628 3 545.4581 516.8626 61.8397 0.178 627 -629 3 544.5703 517.7447 62.235 0.1398 628 -630 3 543.7741 518.566 62.4949 0.1271 629 -631 3 542.9355 519.3222 62.6895 0.1144 630 -632 3 542.1485 520.0327 62.9633 0.1144 631 -633 3 541.2138 520.6813 63.1467 0.1144 632 -634 3 540.2632 521.2762 63.2954 0.1144 633 -635 3 539.3868 521.9283 63.5286 0.1144 634 -636 3 538.3584 522.4145 63.723 0.1271 635 -637 3 537.2945 522.8046 63.8288 0.1525 636 -638 3 536.1814 523.0471 63.9033 0.178 637 -639 3 535.0843 523.2873 64.041 0.178 638 -640 3 534.0512 523.6683 64.2561 0.1525 639 -641 3 533.1132 524.2597 64.468 0.1271 640 -642 3 532.4656 525.1601 64.5789 0.1144 641 -643 3 531.7575 525.9426 64.601 0.1144 642 -644 3 530.6787 526.2926 64.5837 0.1271 643 -645 3 529.5587 526.4928 64.5098 0.1525 644 -646 3 528.5658 526.9642 64.4305 0.178 645 -647 3 527.8176 527.7798 64.3286 0.178 646 -648 3 527.1804 528.6733 64.3182 0.1525 647 -649 3 526.7285 529.6869 64.4319 0.1271 648 -650 3 525.8202 530.141 64.6299 0.1144 649 -651 3 524.8626 530.6604 64.731 0.1271 650 -652 3 524.0286 531.4372 64.808 0.1398 651 -653 3 523.4223 532.3936 64.9284 0.1652 652 -654 3 522.8629 533.3889 65.1557 0.1907 653 -655 3 546.0232 517.2402 64.064 0.1525 628 -656 3 546.7405 517.6772 66.9514 0.1271 655 -657 3 547.4589 518.1153 68.182 0.1144 656 -658 3 548.1762 518.5523 69.6413 0.1144 657 -659 3 548.8935 518.9893 71.2522 0.1144 658 -660 3 549.4449 519.7547 72.8899 0.1144 659 -661 3 549.954 520.5989 74.4971 0.1144 660 -662 3 550.4642 521.4421 76.0399 0.1144 661 -663 3 550.9733 522.2863 77.5701 0.1144 662 -664 3 551.4835 523.1306 79.0642 0.1144 663 -665 3 552.1138 523.7152 80.5616 0.1144 664 -666 3 552.7556 524.2746 82.0341 0.1144 665 -667 3 553.3974 524.8352 83.4414 0.1271 666 -668 3 554.0392 525.3946 86.2926 0.1398 667 -669 3 553.0679 525.906 40.4029 0.1144 1 -670 3 553.7566 526.8006 40.9788 0.1144 669 -671 3 554.6226 527.5316 41.2023 0.1271 670 -672 3 555.7209 527.67 41.4268 0.1525 671 -673 3 556.826 527.6769 41.7424 0.1907 672 -674 3 557.7114 527.9182 42.2576 0.2161 673 -675 3 558.4722 528.7454 42.6135 0.2288 674 -676 3 559.4492 529.3196 42.9335 0.2161 675 -677 3 560.314 529.982 43.1043 0.1907 676 -678 3 561.1228 530.5163 43.3664 0.2161 677 -679 3 562.0003 530.9773 43.6428 0.178 678 -680 3 563.0711 531.1009 43.773 0.1652 679 -681 3 564.1258 531.2999 44.0331 0.178 680 -682 3 565.1783 531.6934 44.3646 0.178 681 -683 3 566.0466 532.4176 44.697 0.178 682 -684 3 566.5877 533.0594 45.2508 0.178 683 -685 3 567.607 532.9324 45.8436 0.1907 684 -686 3 567.9331 532.7345 46.3263 0.1652 685 -687 3 568.8529 532.1122 46.7107 0.1398 686 -688 3 569.8584 531.8067 46.8717 0.1398 687 -689 3 570.9464 531.7506 46.7956 0.1525 688 -690 3 572.0355 531.5768 46.5522 0.178 689 -691 3 573.0605 531.1855 46.2384 0.2034 690 -692 3 573.8201 530.6147 46.1294 0.2161 691 -693 3 574.7479 530.1147 46.1605 0.2288 692 -694 3 575.8473 529.8322 46.1972 0.2161 693 -695 3 576.973 529.7933 46.1768 0.1907 694 -696 3 578.0987 529.9214 46.1009 0.178 695 -697 3 579.1306 529.7338 45.8702 0.1907 696 -698 3 580.0858 529.1538 45.7472 0.2288 697 -699 3 580.9312 528.9101 45.6963 0.1525 698 -700 3 582.002 529.0474 45.7408 0.1652 699 -701 3 583.1082 529.1252 45.7027 0.178 700 -702 3 584.2442 529.0073 45.6674 0.1907 701 -703 3 585.3734 528.8369 45.656 0.178 702 -704 3 586.5071 528.6927 45.6151 0.1525 703 -705 3 587.6442 528.5749 45.5336 0.1271 704 -706 3 588.771 528.3896 45.432 0.1271 705 -707 3 589.8773 528.1036 45.3253 0.1652 706 -708 3 590.9618 527.7489 45.1772 0.2161 707 -709 3 592.0097 527.3245 44.9632 0.2542 708 -710 3 593.0164 526.8257 44.7009 0.2542 709 -711 3 594.0483 526.3441 44.4884 0.2415 710 -712 3 594.9292 525.8236 44.2005 0.2161 711 -713 3 595.8032 525.2447 43.8332 0.1907 712 -714 3 596.8912 525.0342 43.5274 0.1525 713 -715 3 597.9951 524.8192 43.272 0.1398 714 -716 3 598.9995 524.3307 43.0175 0.1525 715 -717 3 599.9628 523.7426 42.8425 0.178 716 -718 3 600.9123 523.1432 42.828 0.178 717 -719 3 601.8595 522.5357 42.8478 0.1652 718 -720 3 602.785 521.8745 42.842 0.178 719 -721 3 603.5927 521.0851 42.8879 0.2161 720 -722 3 604.3626 520.2477 42.9783 0.2669 721 -723 3 605.1531 519.4229 43.0542 0.2924 722 -724 3 605.9574 518.6084 43.1021 0.3178 723 -725 3 606.7753 517.8087 43.1371 0.3178 724 -726 3 607.6367 517.0571 43.155 0.3051 725 -727 3 608.5577 516.3822 43.1449 0.2542 726 -728 3 609.593 515.9177 43.127 0.2034 727 -729 3 610.6741 515.5425 43.115 0.1525 728 -730 3 611.7037 515.0517 43.1054 0.1271 729 -731 3 612.7001 514.49 43.0956 0.1398 730 -732 3 613.6359 513.8539 43.0422 0.1652 731 -733 3 614.5316 513.1709 42.9335 0.1907 732 -734 3 615.4526 512.5612 42.9156 0.1652 733 -735 3 616.5256 512.2821 42.9696 0.1525 734 -736 3 617.657 512.3576 43.0296 0.1652 735 -737 3 618.7965 512.4559 43.083 0.2288 736 -738 3 619.8913 512.1791 43.1276 0.2669 737 -739 3 620.8065 511.5156 43.1547 0.2669 738 -740 3 621.7972 510.9527 43.1561 0.2288 739 -741 3 622.8416 510.4871 43.1477 0.2034 740 -742 3 623.9273 510.1531 43.1102 0.178 741 -743 3 625.0324 509.9197 43.0326 0.1652 742 -744 3 626.1547 509.7206 42.989 0.1652 743 -745 3 627.2712 509.5468 43.0452 0.2034 744 -746 3 628.3512 509.247 43.1959 0.2415 745 -747 3 629.3464 508.7471 43.4216 0.2669 746 -748 3 630.3726 508.254 43.6218 0.2415 747 -749 3 631.4148 507.8056 43.727 0.2288 748 -750 3 632.4684 507.3743 43.7578 0.2161 749 -751 3 633.5289 506.9533 43.7436 0.2288 750 -752 3 634.5871 506.5243 43.7545 0.2161 751 -753 3 635.6327 506.0907 43.8371 0.2034 752 -754 3 636.6291 505.545 43.9723 0.1907 753 -755 3 637.6278 504.9925 44.1319 0.2034 754 -756 3 638.6712 504.5257 44.2736 0.2034 755 -757 3 639.7065 504.0395 44.3904 0.2034 756 -758 3 640.6228 503.3657 44.5026 0.178 757 -759 3 641.458 502.5912 44.6051 0.1907 758 -760 3 642.2405 501.7618 44.6958 0.2034 759 -761 3 642.8708 500.8112 44.7479 0.2161 760 -762 3 643.4199 499.8102 44.7353 0.178 761 -763 3 643.8981 498.7851 44.6365 0.1652 762 -764 3 644.5857 497.8791 44.5096 0.178 763 -765 3 645.3739 497.0497 44.3876 0.2288 764 -766 3 646.2662 496.3358 44.2739 0.2288 765 -767 3 647.1986 495.6735 44.1692 0.2161 766 -768 3 648.1218 494.9974 44.0698 0.178 767 -769 3 649.037 494.311 43.9662 0.178 768 -770 3 649.9419 493.636 43.7861 0.178 769 -771 3 650.8376 492.9736 43.5204 0.2034 770 -772 3 651.6316 492.1602 43.2541 0.2161 771 -773 3 652.4198 491.3377 43.0021 0.2288 772 -774 3 653.3899 490.8103 42.7221 0.2161 773 -775 3 654.4996 490.5426 42.5345 0.1907 774 -776 3 655.6367 490.4271 42.4388 0.1652 775 -777 3 656.5279 490.9648 42.3702 0.1525 776 -778 3 656.6526 490.0404 42.5253 0.1652 777 -779 3 657.4637 489.2899 42.7224 0.1652 778 -780 3 658.3205 488.536 42.8966 0.178 779 -781 3 659.1408 487.7444 43.0035 0.178 780 -782 3 659.8889 486.8978 43.0293 0.1907 781 -783 3 660.692 486.1062 43.0802 0.178 782 -784 3 661.5214 485.334 43.1771 0.1652 783 -785 3 662.2902 484.4909 43.2972 0.1525 784 -786 3 663.0224 483.6134 43.4403 0.1525 785 -787 3 663.7065 482.7074 43.6422 0.1398 786 -788 3 664.2888 481.7338 43.8808 0.1398 787 -789 3 664.6686 480.6619 44.0975 0.1398 788 -790 3 665.0244 479.5968 44.3456 0.1525 789 -791 3 665.4076 478.5661 44.6578 0.1398 790 -792 3 665.7474 477.4896 44.9296 0.1271 791 -793 3 666.3892 476.5687 45.1158 0.1144 792 -794 3 667.2826 475.864 45.2281 0.1271 793 -795 3 668.3751 475.6237 45.2743 0.1398 794 -796 3 669.5008 475.5093 45.225 0.1652 795 -797 3 670.6139 475.2988 45.1178 0.178 796 -798 3 671.7282 475.0506 45.0274 0.1907 797 -799 3 672.8253 474.784 45.0386 0.1907 798 -800 3 673.9304 474.5381 45.1335 0.178 799 -801 3 675.0595 474.3745 45.2522 0.178 800 -802 3 676.1944 474.2303 45.3757 0.178 801 -803 3 677.3086 473.9752 45.4835 0.2034 802 -804 3 678.4103 473.6675 45.5655 0.2161 803 -805 3 679.4616 473.2328 45.6509 0.2161 804 -806 3 680.4638 472.7855 45.8122 0.1907 805 -807 3 681.53 472.448 45.8553 0.1525 806 -808 3 682.65 472.3267 45.7755 0.1398 807 -809 3 683.5034 471.9057 45.8609 0.1525 808 -810 3 684.2653 471.09 45.8923 0.178 809 -811 3 684.9471 470.43 45.6182 0.1907 810 -812 3 685.8474 470.1039 44.3458 0.178 811 -813 3 581.3476 528.8735 46.6665 0.2669 698 -814 3 582.391 528.5978 47.5129 0.2034 813 -815 3 583.416 528.1951 47.8873 0.178 814 -816 3 584.4788 527.8222 48.2689 0.2034 815 -817 3 585.5919 527.575 48.5834 0.2288 816 -818 3 586.7141 527.3554 48.8233 0.2415 817 -819 3 587.8284 527.0969 49.0118 0.2161 818 -820 3 588.9404 526.8417 49.175 0.2034 819 -821 3 590.0477 526.6175 49.3674 0.178 820 -822 3 591.1609 526.4105 49.5855 0.1525 821 -823 3 592.2888 526.2343 49.7823 0.1398 822 -824 3 593.4203 526.0673 49.94 0.1652 823 -825 3 594.4739 525.684 50.104 0.2288 824 -826 3 595.4795 525.1967 50.2824 0.2669 825 -827 3 596.5651 524.9015 50.3521 0.2796 826 -828 3 597.6759 524.6647 50.3068 0.2415 827 -829 3 598.7822 524.5835 50.1371 0.2415 828 -830 3 599.79 524.1888 49.8585 0.2288 829 -831 3 600.4478 523.3388 49.7017 0.2542 830 -832 3 601.2784 522.5769 49.6034 0.2542 831 -833 3 602.2657 522.0061 49.5054 0.2796 832 -834 3 603.2827 521.5725 49.32 0.2924 833 -835 3 604.1018 520.7957 49.1218 0.2796 834 -836 3 604.7333 519.8439 48.9454 0.2288 835 -837 3 605.3064 518.8543 48.7724 0.178 836 -838 3 605.8727 517.8602 48.6102 0.178 837 -839 3 606.3692 516.8523 48.3969 0.2161 838 -840 3 606.8691 515.8376 48.1608 0.2415 839 -841 3 607.3908 514.8217 47.9718 0.2161 840 -842 3 608.0028 513.8562 47.784 0.178 841 -843 3 608.6629 512.9261 47.5776 0.1525 842 -844 3 609.0107 511.8393 47.376 0.1525 843 -845 3 609.5243 510.8646 47.08 0.1398 844 -846 3 610.4121 510.2892 46.676 0.1271 845 -847 3 611.1751 509.4655 46.3904 0.1144 846 -848 3 611.6465 508.4314 46.1376 0.1144 847 -849 3 612.0812 507.4338 45.8335 0.1144 848 -850 3 612.9129 506.7542 45.5112 0.1144 849 -851 3 613.8189 506.2166 45.274 0.1144 850 -852 3 614.4218 505.2682 45.2012 0.1144 851 -853 3 615.1528 504.4228 45.2029 0.1144 852 -854 3 616.0657 503.7329 45.2203 0.1271 853 -855 3 616.9523 503.0111 45.2424 0.1525 854 -856 3 617.8092 502.2549 45.243 0.178 855 -857 3 618.7496 501.6223 45.1965 0.178 856 -858 3 619.7986 501.1681 45.0932 0.178 857 -859 3 620.8145 500.6499 44.9425 0.178 858 -860 3 621.7915 500.0573 44.7429 0.1907 859 -861 3 622.6872 499.4475 44.4234 0.178 860 -862 3 623.289 498.5975 43.9348 0.178 861 -863 3 623.909 497.6926 43.3868 0.178 862 -864 3 624.8173 497.1458 42.8056 0.1907 863 -865 3 625.8607 496.782 42.2162 0.1907 864 -866 3 626.9269 496.401 41.6945 0.2034 865 -867 3 627.9416 495.9263 41.3375 0.2034 866 -868 3 628.6303 495.1106 41.0203 0.2034 867 -869 3 629.4242 494.4528 40.6118 0.1907 868 -870 3 630.1106 493.6566 40.1478 0.2034 869 -871 3 630.614 492.6762 39.6768 0.2161 870 -872 3 631.2649 491.7576 39.3086 0.2288 871 -873 3 632.0028 490.8858 39.0695 0.2288 872 -874 3 632.8997 490.196 38.9124 0.2288 873 -875 3 633.8412 489.5931 38.7705 0.2288 874 -876 3 634.737 488.9239 38.6316 0.2161 875 -877 3 635.5709 488.2867 38.687 0.2161 876 -878 3 636.239 487.4836 38.913 0.2034 877 -879 3 636.9117 486.5798 39.128 0.2288 878 -880 3 637.5947 485.6623 39.2899 0.2161 879 -881 3 638.2365 484.746 39.34 0.2415 880 -882 3 638.8931 483.8296 39.3064 0.2415 881 -883 3 639.5967 482.9316 39.263 0.2796 882 -884 3 640.2545 481.9958 39.2515 0.2669 883 -885 3 640.6961 480.9502 39.3252 0.2288 884 -886 3 641.5014 480.3324 39.5942 0.178 885 -887 3 641.8584 479.2799 39.9255 0.1652 886 -888 3 642.1993 478.2057 40.269 0.2034 887 -889 3 642.7049 477.1807 40.5185 0.2415 888 -890 3 643.2163 476.158 40.6686 0.2542 889 -891 3 643.7219 475.1455 40.7764 0.2288 890 -892 3 644.2836 474.1548 40.8092 0.1907 891 -893 3 645.0055 473.2842 40.6904 0.1652 892 -894 3 645.7537 472.4411 40.4463 0.1525 893 -895 3 646.5305 471.6334 40.103 0.1525 894 -896 3 647.4045 470.9493 39.6777 0.1525 895 -897 3 648.3288 470.3419 39.1975 0.1652 896 -898 3 649.061 469.4839 38.7433 0.178 897 -899 3 649.7577 468.5916 38.3457 0.1907 898 -900 3 650.4509 467.6855 38.0355 0.178 899 -901 3 651.1511 466.784 37.805 0.1652 900 -902 3 651.8935 465.9123 37.6625 0.178 901 -903 3 652.6692 465.0726 37.5838 0.2034 902 -904 3 653.605 464.4137 37.5441 0.2288 903 -905 3 654.5076 463.7112 37.5281 0.2034 904 -906 3 655.1722 462.78 37.5234 0.178 905 -907 3 567.9251 532.6693 48.9927 0.2034 685 -908 3 568.528 532.4165 51.5194 0.2161 907 -909 3 569.1297 532.1636 52.6394 0.2034 908 -910 3 569.7314 531.9108 53.9342 0.2161 909 -911 3 570.6718 531.8262 55.0164 0.2669 910 -912 3 571.3067 531.8948 58.0194 0.2034 911 -913 3 570.9407 531.857 60.5021 0.2034 912 -914 3 570.7919 530.9968 61.5336 0.178 913 -915 3 571.3491 530.252 62.6783 0.1525 914 -916 3 571.5721 530.5426 63.9587 0.1271 915 -917 3 572.4256 531.0219 65.0832 0.1144 916 -918 3 573.1955 531.8273 66.0402 0.1398 917 -919 3 573.6336 532.8546 66.836 0.178 918 -920 3 573.6851 533.9883 67.4943 0.2288 919 -921 3 573.8842 535.1037 68.0694 0.2288 920 -922 3 574.423 535.9857 68.6199 0.2034 921 -923 3 575.2924 536.083 69.2793 0.1652 922 -924 3 576.2362 536.4662 69.9093 0.1525 923 -925 3 577.2315 536.7842 70.6037 0.1525 924 -926 3 578.3309 536.9902 71.2956 0.1398 925 -927 3 579.4314 536.862 71.9785 0.1271 926 -928 3 580.4473 537.0302 72.7275 0.1144 927 -929 3 581.5421 537.1458 73.458 0.1144 928 -930 3 582.6415 537.2556 74.1754 0.1144 929 -931 3 583.742 537.3654 74.8726 0.1144 930 -932 3 584.8643 537.3906 75.5317 0.1144 931 -933 3 585.9957 537.2247 76.0967 0.1144 932 -934 3 587.126 537.0519 76.6226 0.1144 933 -935 3 588.2311 537.0497 77.224 0.1144 934 -936 3 589.2401 537.1995 77.9573 0.1144 935 -937 3 590.2491 537.3505 78.7727 0.1144 936 -938 3 591.257 537.5015 79.6264 0.1271 937 -939 3 592.266 537.6525 81.5186 0.1652 938 -940 3 571.8135 532.4885 55.8093 0.2034 911 -941 3 572.3501 533.4655 56.4564 0.2034 940 -942 3 572.4954 534.5672 57.008 0.2288 941 -943 3 572.4542 535.6757 57.5165 0.2161 942 -944 3 572.5503 536.7717 57.9858 0.2415 943 -945 3 572.8843 537.8047 58.5511 0.2288 944 -946 3 573.1783 538.8091 59.2312 0.2669 945 -947 3 573.7057 539.7552 59.8788 0.2669 946 -948 3 574.3544 540.659 60.4923 0.2669 947 -949 3 574.8714 541.6348 61.1237 0.2161 948 -950 3 575.4766 542.5683 61.7641 0.1652 949 -951 3 576.0772 543.5304 62.3633 0.1271 950 -952 3 576.2751 544.5474 62.9815 0.1144 951 -953 3 576.4216 545.585 63.7006 0.1144 952 -954 3 576.5691 546.6238 64.4809 0.1144 953 -955 3 576.7156 547.6614 65.2834 0.1144 954 -956 3 576.862 548.699 66.0786 0.1144 955 -957 3 577.2338 549.7034 66.7624 0.1144 956 -958 3 577.8436 550.6713 67.2521 0.1144 957 -959 3 578.4533 551.6391 67.5828 0.1144 958 -960 3 579.0631 552.6069 67.7998 0.1144 959 -961 3 579.6728 553.5747 67.9459 0.1144 960 -962 3 580.262 554.5208 68.1044 0.1271 961 -963 3 580.8397 555.4578 68.3525 0.1525 962 -964 3 581.4735 556.4027 68.581 0.178 963 -965 3 581.8601 557.4243 68.7406 0.178 964 -966 3 581.9173 558.51 68.9391 0.1525 965 -967 3 581.9173 559.5075 69.3739 0.1271 966 -968 3 581.9208 560.4307 70.0288 0.1144 967 -969 3 582.2651 561.3883 70.5944 0.1144 968 -970 3 582.852 562.2909 71.2135 0.1144 969 -971 3 583.4423 563.1923 71.8502 0.1144 970 -972 3 584.1012 564.0629 72.4346 0.1144 971 -973 3 585.1194 564.5766 72.8067 0.1144 972 -974 3 586.1421 565.088 73.022 0.1144 973 -975 3 587.166 565.5959 73.1444 0.1144 974 -976 3 588.1887 566.1061 73.1923 0.1144 975 -977 3 589.2126 566.614 73.2046 0.1144 976 -978 3 590.1988 567.1941 73.2365 0.1144 977 -979 3 590.9618 568.0338 73.3583 0.1144 978 -980 3 591.726 568.8734 73.5437 0.1144 979 -981 3 592.4902 569.7131 73.768 0.1144 980 -982 3 593.2544 570.5528 74.0093 0.1398 981 -983 3 594.0186 571.3925 74.5368 0.1652 982 -984 3 560.1676 531.2095 43.0066 0.2415 677 -985 3 560.5531 532.0275 44.1543 0.2288 984 -986 3 561.5759 532.4737 44.5936 0.2034 985 -987 3 562.7096 532.4931 45.0092 0.1652 986 -988 3 563.8193 532.5892 45.4194 0.1652 987 -989 3 564.9061 532.5835 45.808 0.1907 988 -990 3 565.9654 533.0022 46.0872 0.2161 989 -991 3 567.0305 533.3488 46.1952 0.2288 990 -992 3 568.0338 533.7115 46.1079 0.2161 991 -993 3 569.0714 534.0958 45.9855 0.2034 992 -994 3 569.6994 534.9001 45.953 0.178 993 -995 3 570.0277 535.9629 45.9836 0.178 994 -996 3 570.9029 536.5131 46.1594 0.178 995 -997 3 571.9817 536.8071 46.3966 0.1907 996 -998 3 573.0147 537.2785 46.6346 0.178 997 -999 3 573.7103 537.7921 47.0666 0.178 998 -1000 3 574.2708 538.5986 47.3984 0.2034 999 -1001 3 574.9012 539.4875 47.7582 0.2415 1000 -1002 3 575.718 540.2597 48.0091 0.2542 1001 -1003 3 576.838 540.4828 48.2387 0.2161 1002 -1004 3 577.9797 540.4862 48.466 0.178 1003 -1005 3 579.0859 540.5503 48.7869 0.1398 1004 -1006 3 580.1201 540.6761 49.2758 0.1271 1005 -1007 3 581.2115 540.961 49.7767 0.1271 1006 -1008 3 582.2971 541.3133 50.2317 0.1652 1007 -1009 3 583.3977 541.5124 50.7016 0.2034 1008 -1010 3 584.4616 541.525 51.2406 0.2288 1009 -1011 3 585.5495 541.6577 51.7656 0.2161 1010 -1012 3 586.6329 542.0283 52.18 0.2034 1011 -1013 3 587.7071 542.4173 52.5294 0.178 1012 -1014 3 588.7447 542.9001 52.8399 0.1652 1013 -1015 3 589.7823 543.3497 53.1454 0.1525 1014 -1016 3 590.8199 543.6425 53.5727 0.1652 1015 -1017 3 591.8026 544.0315 54.1036 0.1652 1016 -1018 3 592.6057 544.8106 54.6661 0.1652 1017 -1019 3 593.5358 545.386 55.2577 0.1525 1018 -1020 3 594.6489 545.6011 55.7973 0.1525 1019 -1021 3 595.7346 545.7715 56.3097 0.1525 1020 -1022 3 596.6818 546.3058 56.8313 0.1398 1021 -1023 3 597.6977 546.713 57.3409 0.1398 1022 -1024 3 598.7971 546.9395 57.8001 0.1398 1023 -1025 3 599.9056 547.2038 58.1434 0.1525 1024 -1026 3 601.0027 547.499 58.3464 0.1398 1025 -1027 3 602.0986 547.801 58.4962 0.1271 1026 -1028 3 603.1854 548.0858 58.6642 0.1144 1027 -1029 3 604.3054 548.262 58.8157 0.1271 1028 -1030 3 605.4483 548.3192 58.9215 0.1398 1029 -1031 3 606.59 548.3421 58.9966 0.1525 1030 -1032 3 607.7317 548.2631 59.043 0.1398 1031 -1033 3 608.87 548.159 59.0542 0.1271 1032 -1034 3 610.0014 548.1968 59.036 0.1144 1033 -1035 3 611.1076 548.4885 59.0041 0.1271 1034 -1036 3 612.223 548.7082 58.9537 0.1398 1035 -1037 3 613.3556 548.7791 58.8622 0.1525 1036 -1038 3 614.4882 548.874 58.7583 0.1398 1037 -1039 3 615.6184 549.0296 58.6757 0.1271 1038 -1040 3 616.7384 549.2298 58.6496 0.1271 1039 -1041 3 617.8344 549.5215 58.7345 0.1525 1040 -1042 3 618.8891 549.8968 58.9173 0.178 1041 -1043 3 619.8386 550.4848 59.1914 0.178 1042 -1044 3 620.7584 551.1323 59.4941 0.1525 1043 -1045 3 621.6496 551.845 59.7551 0.1271 1044 -1046 3 622.582 552.5028 59.953 0.1144 1045 -1047 3 623.5635 553.0885 60.0704 0.1144 1046 -1048 3 624.5245 553.6971 60.1073 0.1144 1047 -1049 3 625.4694 554.3172 60.0832 0.1144 1048 -1050 3 626.4624 554.8686 60.109 0.1144 1049 -1051 3 627.4748 555.3571 60.2367 0.1144 1050 -1052 3 628.4987 555.8364 60.4318 0.1144 1051 -1053 3 629.5546 556.2357 60.6584 0.1271 1052 -1054 3 630.6758 556.4393 60.8773 0.1525 1053 -1055 3 631.8118 556.5652 61.063 0.178 1054 -1056 3 632.9477 556.6887 61.192 0.2034 1055 -1057 3 634.086 556.8077 61.2584 0.2034 1056 -1058 3 635.214 556.9804 61.278 0.2161 1057 -1059 3 636.318 557.279 61.2646 0.1907 1058 -1060 3 637.3979 557.6531 61.2237 0.178 1059 -1061 3 638.4367 558.1256 61.1514 0.1525 1060 -1062 3 639.4617 558.6198 61.0464 0.1652 1061 -1063 3 640.5393 558.9778 60.9132 0.1907 1062 -1064 3 641.6513 559.2078 60.7684 0.2034 1063 -1065 3 642.785 559.3142 60.6533 0.2034 1064 -1066 3 643.929 559.3142 60.5962 0.178 1065 -1067 3 645.0684 559.2558 60.6015 0.1907 1066 -1068 3 646.1953 559.0659 60.6746 0.1907 1067 -1069 3 647.3175 558.9184 60.8149 0.2288 1068 -1070 3 648.4512 558.9355 61.0182 0.2161 1069 -1071 3 649.5815 558.9515 61.2654 0.2161 1070 -1072 3 650.7003 558.9573 61.5546 0.1652 1071 -1073 3 651.8215 558.9435 61.8195 0.1525 1072 -1074 3 652.9529 558.9035 61.9581 0.1652 1073 -1075 3 654.082 558.8143 62.0158 0.2161 1074 -1076 3 655.194 558.6026 62.0959 0.2415 1075 -1077 3 656.2796 558.296 62.2009 0.2288 1076 -1078 3 657.3893 558.0512 62.2874 0.1907 1077 -1079 3 658.5184 558.0661 62.4252 0.178 1078 -1080 3 659.6498 558.1015 62.6046 0.1652 1079 -1081 3 660.7893 558.002 62.776 0.1652 1080 -1082 3 661.8612 557.7458 62.9955 0.1398 1081 -1083 3 662.5144 556.9987 63.2862 0.1398 1082 -1084 3 663.3438 556.3329 63.5631 0.1398 1083 -1085 3 664.4512 556.1728 63.7241 0.1525 1084 -1086 3 665.5506 556.1602 63.6644 0.1398 1085 -1087 3 666.571 556.3078 63.3578 0.1271 1086 -1088 3 667.5892 556.7585 62.9812 0.1144 1087 -1089 3 668.6955 556.675 62.6175 0.1271 1088 -1090 3 669.7319 556.2014 62.2947 0.1398 1089 -1091 3 670.7192 555.6431 61.9758 0.1525 1090 -1092 3 671.695 555.1489 61.6084 0.1525 1091 -1093 3 672.6949 554.6478 61.2424 0.1525 1092 -1094 3 673.7073 554.1422 60.8952 0.1525 1093 -1095 3 674.7964 553.8024 60.6124 0.1398 1094 -1096 3 675.9084 553.5347 60.4069 0.1271 1095 -1097 3 676.9792 553.1354 60.2714 0.1271 1096 -1098 3 677.9607 552.5497 60.1905 0.1525 1097 -1099 3 678.8896 551.8828 60.1496 0.178 1098 -1100 3 679.6813 551.0659 60.0944 0.178 1099 -1101 3 680.7017 550.6896 59.9466 0.1652 1100 -1102 3 681.8332 550.5386 59.8399 0.1525 1101 -1103 3 682.9371 550.2514 59.8156 0.1652 1102 -1104 3 684.0159 550.2091 60.265 0.178 1103 -1105 3 546.7691 525.0811 43.0937 0.2034 1 -1106 3 545.6846 525.4266 43.3272 0.2034 1105 -1107 3 544.7602 526.097 43.4095 0.2034 1106 -1108 3 543.638 526.3212 43.4997 0.2034 1107 -1109 3 543.3062 526.1119 43.6803 0.2542 1108 -1110 3 542.3956 525.5227 43.899 0.2924 1109 -1111 3 541.4106 524.9919 44.0118 0.3051 1110 -1112 3 540.3741 524.6087 44.1294 0.3051 1111 -1113 3 539.5047 524.111 44.3946 0.2924 1112 -1114 3 538.5963 523.6466 44.7476 0.2542 1113 -1115 3 537.4787 523.6557 45.059 0.2034 1114 -1116 3 536.3552 523.8708 45.3124 0.1652 1115 -1117 3 535.2364 523.8159 45.5221 0.178 1116 -1118 3 534.1885 523.3857 45.6722 0.2288 1117 -1119 3 533.1726 522.8629 45.7794 0.2924 1118 -1120 3 532.1762 522.3687 45.9472 0.3178 1119 -1121 3 531.126 522.0301 46.1874 0.3051 1120 -1122 3 530.069 521.6365 46.3778 0.2669 1121 -1123 3 529.1275 521.0325 46.4551 0.2288 1122 -1124 3 528.1859 520.4262 46.5587 0.2161 1123 -1125 3 527.1689 519.9514 46.683 0.2288 1124 -1126 3 526.264 519.3382 46.8289 0.2796 1125 -1127 3 525.2447 519.0248 46.9899 0.3178 1126 -1128 3 524.1819 518.7674 46.9322 0.3178 1127 -1129 3 523.118 518.7445 46.6281 0.2669 1128 -1130 3 521.823 518.542 45.9365 0.3686 1129 -1131 3 520.8552 518.5157 45.1847 0.3051 1130 -1132 3 519.7821 518.4837 44.4909 0.2415 1131 -1133 3 518.7537 518.3167 44.0112 0.2288 1132 -1134 3 517.6703 518.0924 43.8421 0.2669 1133 -1135 3 516.7036 517.692 43.9636 0.3178 1134 -1136 3 515.7495 517.1441 44.1294 0.3178 1135 -1137 3 514.6707 516.7986 44.2781 0.2924 1136 -1138 3 513.6366 517.0125 44.2907 0.2669 1137 -1139 3 512.5978 517.4118 44.3808 0.2796 1138 -1140 3 511.4984 517.5902 44.5556 0.2924 1139 -1141 3 510.3762 517.7126 44.7779 0.3178 1140 -1142 3 509.6062 518.4185 45.1366 0.3432 1141 -1143 3 508.5881 518.8806 45.4874 0.3559 1142 -1144 3 507.5184 519.0488 45.6316 0.3559 1143 -1145 3 506.4065 519.1666 45.6506 0.3305 1144 -1146 3 505.3197 519.0877 45.6669 0.3305 1145 -1147 3 504.4113 519.559 45.8604 0.3178 1146 -1148 3 503.4206 520.1185 46.0463 0.2924 1147 -1149 3 502.391 520.5806 46.2927 0.2415 1148 -1150 3 501.4038 520.925 46.5041 0.2161 1149 -1151 3 500.4131 520.7248 46.65 0.2288 1150 -1152 3 499.4944 520.9936 46.9927 0.2542 1151 -1153 3 498.8606 521.656 47.2959 0.2669 1152 -1154 3 497.9237 521.9443 47.488 0.2796 1153 -1155 3 496.8014 521.9832 47.7218 0.2924 1154 -1156 3 495.8107 522.1594 48.1029 0.3178 1155 -1157 3 494.9527 522.7016 48.3412 0.3178 1156 -1158 3 493.8579 522.7439 48.5313 0.3305 1157 -1159 3 492.7734 522.84 48.5741 0.3178 1158 -1160 3 491.9017 523.1363 48.8144 0.3305 1159 -1161 3 490.9499 523.7426 48.9392 0.3178 1160 -1162 3 490.0278 524.4188 49.0412 0.3051 1161 -1163 3 489.2099 525.2035 49.1554 0.2669 1162 -1164 3 488.4983 526.0695 49.3027 0.2415 1163 -1165 3 487.5728 526.6427 49.5653 0.2288 1164 -1166 3 486.5935 527.0557 49.7972 0.2288 1165 -1167 3 485.6154 527.5785 49.9621 0.2415 1166 -1168 3 484.7551 528.2958 50.1813 0.2415 1167 -1169 3 484.19 529.2556 50.4619 0.2288 1168 -1170 3 483.3583 529.9088 50.7979 0.1907 1169 -1171 3 482.2898 530.117 51.1932 0.1652 1170 -1172 3 481.1836 530.2795 51.606 0.1525 1171 -1173 3 480.0704 530.5208 51.9509 0.1652 1172 -1174 3 478.9596 530.7966 52.2035 0.178 1173 -1175 3 477.954 531.3216 52.3821 0.1907 1174 -1176 3 476.9794 531.9188 52.507 0.178 1175 -1177 3 475.9326 532.3512 52.64 0.1652 1176 -1178 3 474.8641 532.7299 52.8007 0.1652 1177 -1179 3 473.7567 532.9896 52.9631 0.1652 1178 -1180 3 472.6367 533.2138 53.1126 0.1652 1179 -1181 3 471.5591 533.5856 53.2291 0.1525 1180 -1182 3 470.5158 534.0535 53.3016 0.1525 1181 -1183 3 469.4656 534.5088 53.3308 0.1652 1182 -1184 3 468.4062 534.9378 53.3254 0.1652 1183 -1185 3 467.3354 535.3417 53.2938 0.178 1184 -1186 3 466.2544 535.7169 53.237 0.1652 1185 -1187 3 465.1744 536.0921 53.1549 0.1652 1186 -1188 3 464.0991 536.4834 53.0457 0.1398 1187 -1189 3 463.0157 536.8517 52.897 0.1271 1188 -1190 3 461.9003 536.8781 52.6487 0.1271 1189 -1191 3 460.7757 536.8117 52.3006 0.1398 1190 -1192 3 459.6672 536.5669 51.919 0.1525 1191 -1193 3 458.5312 536.4834 51.5388 0.1398 1192 -1194 3 458.3447 537.0611 50.9236 0.1271 1193 -1195 3 458.0668 537.7063 50.1553 0.1144 1194 -1196 3 457.0211 538.0861 49.5071 0.1144 1195 -1197 3 455.9 538.3046 49.035 0.1144 1196 -1198 3 455.0397 538.9373 48.7133 0.1144 1197 -1199 3 454.0101 539.2805 48.5237 0.1144 1198 -1200 3 453.0309 539.8296 48.4512 0.1144 1199 -1201 3 452.2278 540.6384 48.44 0.1144 1200 -1202 3 451.6443 541.6154 48.44 0.1144 1201 -1203 3 451.3011 542.7022 48.44 0.1144 1202 -1204 3 451.0918 543.8256 48.44 0.1144 1203 -1205 3 450.4729 544.7625 48.44 0.1144 1204 -1206 3 449.9398 545.7692 48.44 0.1144 1205 -1207 3 449.1413 546.5746 48.44 0.1144 1206 -1208 3 448.5189 547.5321 48.44 0.1144 1207 -1209 3 448.2226 548.6338 48.44 0.1144 1208 -1210 3 447.8428 549.7126 48.44 0.1144 1209 -1211 3 447.1633 550.6324 48.44 0.1398 1210 -1212 3 446.6176 551.6368 48.44 0.1907 1211 -1213 3 522.6844 518.2972 47.2147 0.3178 1129 -1214 3 522.1788 517.5433 48.2154 0.3432 1213 -1215 3 521.6446 516.6853 48.6668 0.3559 1214 -1216 3 520.7454 516.0607 49.0087 0.3432 1215 -1217 3 519.7112 515.6397 49.3531 0.3305 1216 -1218 3 518.6061 515.5596 49.7162 0.3432 1217 -1219 3 517.5994 516.0035 49.9682 0.3305 1218 -1220 3 516.635 516.4199 50.2972 0.3178 1219 -1221 3 515.5127 516.4565 50.6316 0.2542 1220 -1222 3 514.395 516.2472 50.9068 0.2415 1221 -1223 3 513.275 516.0149 51.1487 0.2542 1222 -1224 3 512.1505 516.1808 51.4158 0.2924 1223 -1225 3 511.1495 516.5469 51.8426 0.3178 1224 -1226 3 510.0513 516.6029 52.3471 0.3432 1225 -1227 3 508.9301 516.4302 52.8609 0.3813 1226 -1228 3 507.8902 516.4496 53.4674 0.1525 1227 -1229 3 506.7771 516.4565 54.07 0.1398 1228 -1230 3 505.648 516.4565 54.626 0.1271 1229 -1231 3 504.5212 516.4222 55.1348 0.1144 1230 -1232 3 503.392 516.4222 55.61 0.1144 1231 -1233 3 502.2629 516.4474 56.061 0.1271 1232 -1234 3 501.1326 516.5354 56.478 0.1525 1233 -1235 3 500.0172 516.754 56.8593 0.1907 1234 -1236 3 498.9167 517.0262 57.2303 0.2288 1235 -1237 3 497.8963 517.4037 57.6559 0.2669 1236 -1238 3 496.8392 517.7332 58.093 0.2796 1237 -1239 3 495.7227 517.6943 58.4931 0.2542 1238 -1240 3 494.5947 517.811 58.8154 0.2034 1239 -1241 3 493.4724 517.9963 59.0388 0.178 1240 -1242 3 492.3787 518.2926 59.2693 0.2034 1241 -1243 3 491.2473 518.3201 59.4966 0.2542 1242 -1244 3 490.1274 518.1062 59.738 0.3178 1243 -1245 3 489.0737 518.0261 60.149 0.3432 1244 -1246 3 487.9881 517.8465 60.6659 0.3432 1245 -1247 3 486.907 517.5639 61.2357 0.2924 1246 -1248 3 485.8339 517.6406 61.8677 0.2415 1247 -1249 3 484.786 517.97 62.5198 0.2161 1248 -1250 3 483.7404 518.4013 63.1226 0.2034 1249 -1251 3 482.6914 518.8292 63.6675 0.2034 1250 -1252 3 481.6251 519.2319 64.1606 0.1652 1251 -1253 3 480.5921 519.7123 64.5954 0.1398 1252 -1254 3 479.725 520.3152 65.1109 0.1271 1253 -1255 3 478.7651 520.6847 65.7499 0.1525 1254 -1256 3 477.7344 520.3633 66.3743 0.2034 1255 -1257 3 476.7528 520.0224 67.0986 0.2288 1256 -1258 3 475.7541 519.6986 67.909 0.2288 1257 -1259 3 474.8138 519.7707 68.7924 0.178 1258 -1260 3 473.8768 520.0498 69.6654 0.1398 1259 -1261 3 472.7717 520.2866 70.3934 0.1144 1260 -1262 3 471.7112 520.6699 71.043 0.1144 1261 -1263 3 470.7057 521.0828 71.6887 0.1271 1262 -1264 3 469.66 521.3986 72.3159 0.1398 1263 -1265 3 468.651 521.8608 72.8773 0.1652 1264 -1266 3 467.65 522.0655 73.4546 0.1652 1265 -1267 3 466.585 521.9042 74.0782 0.1652 1266 -1268 3 465.4913 521.998 74.6508 0.1398 1267 -1269 3 464.3713 522.2188 75.1114 0.1271 1268 -1270 3 463.3463 522.2085 75.6064 0.1144 1269 -1271 3 462.287 522.1216 76.125 0.1144 1270 -1272 3 461.1453 522.0438 76.491 0.1144 1271 -1273 3 460.0024 522.0072 76.7346 0.1144 1272 -1274 3 458.8584 522.0072 76.8894 0.1652 1273 -1275 3 457.7144 522.0072 77.0 0.2288 1274 -1276 3 508.0355 515.896 54.9959 0.2288 1227 -1277 3 507.1707 515.4464 55.9359 0.2415 1276 -1278 3 506.1434 515.0151 56.2814 0.2161 1277 -1279 3 505.1835 514.4923 56.6748 0.2034 1278 -1280 3 504.4285 513.9134 56.8686 0.2034 1279 -1281 3 503.5648 513.3139 57.2258 0.2161 1280 -1282 3 502.4814 513.0932 57.6626 0.2288 1281 -1283 3 501.382 512.8117 58.0152 0.2288 1282 -1284 3 500.2495 512.7705 58.3954 0.2161 1283 -1285 3 499.3892 512.5612 59.0489 0.2034 1284 -1286 3 498.5609 512.3221 59.8536 0.1907 1285 -1287 3 497.8093 511.5076 60.5763 0.1907 1286 -1288 3 497.1481 510.7846 61.3544 0.1907 1287 -1289 3 496.2844 510.343 62.0166 0.178 1288 -1290 3 495.1758 510.1393 62.4621 0.1652 1289 -1291 3 494.0558 510.2332 62.811 0.1398 1290 -1292 3 493.0034 510.407 63.2464 0.1398 1291 -1293 3 491.9097 510.3258 63.742 0.1652 1292 -1294 3 490.927 509.8247 64.272 0.2034 1293 -1295 3 489.9214 509.3454 64.8553 0.2288 1294 -1296 3 489.0852 508.6258 65.3212 0.2034 1295 -1297 3 488.0018 508.4474 65.8717 0.1907 1296 -1298 3 487.0511 508.4451 66.5932 0.1907 1297 -1299 3 485.9506 508.325 67.2988 0.2161 1298 -1300 3 485.0377 507.7244 68.0546 0.2288 1299 -1301 3 484.0218 507.4944 68.8201 0.2034 1300 -1302 3 482.9076 507.6271 69.5752 0.178 1301 -1303 3 481.8162 507.4818 70.3391 0.1398 1302 -1304 3 480.9044 507.1077 71.2186 0.1271 1303 -1305 3 480.0132 506.6662 72.2033 0.1144 1304 -1306 3 479.0077 506.3561 73.2127 0.1144 1305 -1307 3 477.9724 506.2612 74.2353 0.1144 1306 -1308 3 476.9954 506.0038 75.2441 0.1144 1307 -1309 3 476.2678 505.7818 76.3017 0.1144 1308 -1310 3 475.443 505.9843 77.226 0.1144 1309 -1311 3 474.3344 506.2658 77.8705 0.1144 1310 -1312 3 473.5439 506.975 78.2916 0.1144 1311 -1313 3 472.7717 507.809 78.5361 0.1144 1312 -1314 3 471.6815 508.119 78.6509 0.1144 1313 -1315 3 470.5558 508.3227 78.68 0.1144 1314 -1316 3 469.493 508.7414 78.68 0.1144 1315 -1317 3 468.3536 508.8478 78.68 0.1144 1316 -1318 3 467.2096 508.8512 78.68 0.1144 1317 -1319 3 466.0656 508.8512 78.68 0.1144 1318 -1320 3 464.9216 508.8512 78.68 0.1271 1319 -1321 3 463.7776 508.8512 78.68 0.1398 1320 -1322 3 543.924 526.1325 43.3835 0.178 1108 -1323 3 544.7156 526.2766 44.2246 0.1652 1322 -1324 3 545.0005 527.3291 44.6102 0.178 1323 -1325 3 544.7648 528.4205 44.9473 0.2034 1324 -1326 3 545.0245 529.5198 45.2525 0.2415 1325 -1327 3 545.5233 530.4087 45.7355 0.2288 1326 -1328 3 546.2772 530.9098 46.4002 0.2161 1327 -1329 3 546.6627 531.9726 46.9678 0.178 1328 -1330 3 546.8103 533.0491 47.4446 0.1907 1329 -1331 3 547.69 533.6817 47.9847 0.2034 1330 -1332 3 548.4302 534.2617 48.5848 0.2288 1331 -1333 3 548.7265 535.3371 49.1761 0.2034 1332 -1334 3 549.2252 536.2546 49.8327 0.178 1333 -1335 3 550.0329 536.9547 50.5372 0.178 1334 -1336 3 551.0431 537.434 51.1896 0.2161 1335 -1337 3 552.0464 537.9271 51.7891 0.2415 1336 -1338 3 552.9101 538.5083 52.4356 0.2288 1337 -1339 3 553.7784 539.1558 53.0376 0.2161 1338 -1340 3 554.6318 539.8833 53.4668 0.2288 1339 -1341 3 555.4806 540.5389 53.9608 0.2542 1340 -1342 3 556.0218 541.4289 54.5241 0.2542 1341 -1343 3 557.0433 541.6932 55.1622 0.2288 1342 -1344 3 558.097 542.0787 55.7687 0.1907 1343 -1345 3 559.1014 542.4917 56.4007 0.1525 1344 -1346 3 559.9891 543.1735 56.9862 0.1271 1345 -1347 3 560.8346 543.8576 57.5089 0.1144 1346 -1348 3 561.5724 544.5577 58.0468 0.1144 1347 -1349 3 562.3446 545.1721 58.4892 0.1525 1348 -1350 3 563.4555 545.1412 58.7653 0.2034 1349 -1351 3 564.4668 545.3482 59.0276 0.2669 1350 -1352 3 565.5238 545.7246 59.2911 0.2669 1351 -1353 3 566.3292 546.1319 59.7484 0.2415 1352 -1354 3 567.3554 546.451 60.1247 0.2034 1353 -1355 3 568.4639 546.721 60.4668 0.1907 1354 -1356 3 569.529 547.094 60.8594 0.1907 1355 -1357 3 570.6055 547.2988 61.308 0.2034 1356 -1358 3 571.6236 547.5012 61.8195 0.2161 1357 -1359 3 572.6978 547.8788 62.2348 0.2415 1358 -1360 3 573.8007 548.135 62.6699 0.2288 1359 -1361 3 574.8749 548.4267 63.17 0.2288 1360 -1362 3 575.9411 548.7745 63.6574 0.2034 1361 -1363 3 576.989 548.9164 64.1508 0.2161 1362 -1364 3 577.9534 548.8237 64.836 0.2161 1363 -1365 3 578.9235 548.5022 65.6155 0.2288 1364 -1366 3 579.9005 548.0195 66.4045 0.2288 1365 -1367 3 581.0079 547.9211 67.111 0.2034 1366 -1368 3 582.1461 547.8994 67.744 0.178 1367 -1369 3 583.2409 547.7312 68.3707 0.1525 1368 -1370 3 584.3277 547.547 68.994 0.1652 1369 -1371 3 585.4283 547.4932 69.6256 0.178 1370 -1372 3 586.5334 547.4715 70.2663 0.178 1371 -1373 3 587.5515 547.4646 70.9836 0.1525 1372 -1374 3 588.6406 547.5642 71.6612 0.1271 1373 -1375 3 589.772 547.6889 72.2154 0.1144 1374 -1376 3 590.9046 547.8136 72.6611 0.1144 1375 -1377 3 592.0372 547.9394 73.0206 0.1144 1376 -1378 3 593.1709 548.0652 73.3135 0.1144 1377 -1379 3 594.3034 548.1899 73.5588 0.1144 1378 -1380 3 595.436 548.3146 73.7867 0.1144 1379 -1381 3 596.5697 548.4405 74.0127 0.1144 1380 -1382 3 597.6107 548.8981 74.228 0.1144 1381 -1383 3 598.3257 549.7881 74.4173 0.1271 1382 -1384 3 599.3633 550.2686 74.6077 0.1398 1383 -1385 3 600.4398 550.6404 74.8278 0.1525 1384 -1386 3 601.5381 550.8921 75.1041 0.1398 1385 -1387 3 602.6363 551.1437 75.4155 0.1271 1386 -1388 3 603.7334 551.3943 75.7436 0.1398 1387 -1389 3 604.8317 551.646 76.4733 0.1652 1388 -1390 3 554.5311 523.4155 33.8556 0.1907 1 -1391 3 555.5195 523.1821 33.2139 0.1907 1390 -1392 3 556.4816 522.5655 33.0028 0.2161 1391 -1393 3 557.2493 522.0804 32.6494 0.2415 1392 -1394 3 557.8487 521.2304 32.3232 0.2669 1393 -1395 3 558.3246 520.2008 32.051 0.2415 1394 -1396 3 558.2034 519.0751 31.9379 0.2161 1395 -1397 3 558.3029 518.3944 32.7558 0.178 1396 -1398 3 558.6221 517.3546 31.2326 0.2034 1397 -1399 3 558.4802 516.8523 30.4298 0.2288 1398 -1400 3 558.4836 515.7701 29.5968 0.2034 1399 -1401 3 559.1094 515.1238 28.4418 0.2288 1400 -1402 3 559.7695 514.6398 27.1417 0.2542 1401 -1403 3 560.5863 514.2795 25.8372 0.2542 1402 -1404 3 560.8666 513.8516 24.5535 0.2924 1403 -1405 3 560.1813 513.195 23.4935 0.3051 1404 -1406 3 559.1563 512.7191 22.7792 0.2924 1405 -1407 3 558.653 511.9938 22.5964 0.2161 1406 -1408 3 558.0684 511.0557 22.6043 0.1652 1407 -1409 3 556.9839 510.7354 22.6632 0.1398 1408 -1410 3 556.0229 510.4963 22.7421 0.178 1409 -1411 3 554.9269 510.1668 22.7757 0.1525 1410 -1412 3 553.7932 510.0558 22.7167 0.1652 1411 -1413 3 552.8163 509.9403 22.7671 0.1652 1412 -1414 3 551.7283 509.8007 22.6735 0.178 1413 -1415 3 551.1083 509.4598 22.2007 0.1652 1414 -1416 3 550.3189 508.6693 21.669 0.178 1415 -1417 3 549.6119 507.8353 21.1109 0.1652 1416 -1418 3 548.8763 507.3972 20.4708 0.178 1417 -1419 3 547.7449 507.5322 19.9428 0.1907 1418 -1420 3 546.6021 507.5322 19.5521 0.2288 1419 -1421 3 545.4661 507.5997 19.2757 0.2542 1420 -1422 3 544.369 507.8616 18.9882 0.2542 1421 -1423 3 543.3382 508.1442 18.5965 0.2415 1422 -1424 3 542.3292 508.3764 18.1 0.2415 1423 -1425 3 541.5845 509.0571 17.5422 0.2415 1424 -1426 3 540.969 509.9746 17.0044 0.2288 1425 -1427 3 540.0721 510.2606 16.7211 0.1907 1426 -1428 3 539.0288 509.9437 16.6231 0.1652 1427 -1429 3 537.958 509.5628 16.6096 0.178 1428 -1430 3 537.5084 509.1338 15.7273 0.1907 1429 -1431 3 557.7801 510.2972 21.6829 0.1652 1409 -1432 3 557.597 509.6165 20.1249 0.1652 1431 -1433 3 557.104 508.7196 19.5466 0.1652 1432 -1434 3 556.8454 508.3776 18.7427 0.1907 1433 -1435 3 556.1545 508.1236 17.9839 0.2161 1434 -1436 3 555.3559 507.5322 17.4124 0.2034 1435 -1437 3 558.4402 514.7863 31.5946 0.2669 1400 -1438 3 558.3772 513.6812 30.8031 0.2288 1437 -1439 3 558.8795 512.8735 30.4175 0.1652 1438 -1440 3 559.8542 512.4285 29.8816 0.1271 1439 -1441 3 560.4662 511.6162 29.2258 0.1144 1440 -1442 3 560.6664 510.693 28.4435 0.1144 1441 -1443 3 561.4111 510.1325 27.7303 0.1271 1442 -1444 3 562.26 510.661 27.2825 0.1398 1443 -1445 3 562.2211 511.6506 26.3992 0.1652 1444 -1446 3 559.2776 519.1403 32.1003 0.1907 1396 -1447 3 559.9983 518.4986 32.4302 0.1907 1446 -1448 3 560.7339 517.7504 32.5088 0.1907 1447 -1449 3 561.3757 517.0491 32.3456 0.2288 1448 -1450 3 561.839 516.0058 32.1504 0.2415 1449 -1451 3 562.4762 515.0723 31.9416 0.2288 1450 -1452 3 563.1878 514.2108 31.6932 0.2161 1451 -1453 3 563.9531 513.4844 31.3026 0.2288 1452 -1454 3 564.3752 512.5543 30.9064 0.2542 1453 -1455 3 564.9724 511.6517 30.5822 0.2542 1454 -1456 3 565.7663 510.836 30.2515 0.2415 1455 -1457 3 566.7319 510.5375 29.7447 0.2161 1456 -1458 3 567.6711 510.693 29.0142 0.2161 1457 -1459 3 568.7224 510.7274 28.1982 0.2288 1458 -1460 3 569.5438 510.1256 27.2978 0.2669 1459 -1461 3 569.1594 509.8694 27.9712 0.1907 1460 -1462 3 569.1686 508.9015 28.1492 0.2034 1461 -1463 3 569.7566 508.031 28.168 0.2415 1462 -1464 3 570.6272 507.3823 27.994 0.2542 1463 -1465 3 571.5081 506.7085 27.713 0.2415 1464 -1466 3 572.6406 506.6055 27.3894 0.2415 1465 -1467 3 573.7183 506.4133 26.9682 0.2542 1466 -1468 3 574.7479 506.093 26.6821 0.2415 1467 -1469 3 575.7844 505.974 26.5146 0.2034 1468 -1470 3 576.6366 506.0381 26.1963 0.1525 1469 -1471 3 576.7659 505.354 25.4658 0.1525 1470 -1472 3 576.894 504.671 24.4202 0.1652 1471 -1473 3 577.029 503.9606 23.1805 0.1907 1472 -1474 3 577.6491 503.1472 22.1266 0.1652 1473 -1475 3 578.6135 502.637 21.1768 0.1398 1474 -1476 3 579.5367 502.1165 20.313 0.1144 1475 -1477 3 580.4587 501.596 19.5544 0.1271 1476 -1478 3 581.2309 500.8546 18.9501 0.1525 1477 -1479 3 581.8578 499.8983 18.5251 0.178 1478 -1480 3 581.7171 498.9956 18.1056 0.178 1479 -1481 3 580.9404 498.1994 17.8605 0.1652 1480 -1482 3 580.4278 497.1961 17.6627 0.178 1481 -1483 3 580.1418 496.0922 17.555 0.2034 1482 -1484 3 579.7803 495.0088 17.4758 0.2288 1483 -1485 3 579.2301 494.0078 17.3999 0.2161 1484 -1486 3 578.7279 492.9805 17.2928 0.2034 1485 -1487 3 578.332 491.9292 17.0856 0.178 1486 -1488 3 578.0117 490.8618 16.7991 0.178 1487 -1489 3 577.7966 489.7876 15.9191 0.178 1488 -1490 3 570.459 510.2778 26.3477 0.2161 1460 -1491 3 570.4705 510.7617 26.1302 0.1907 1490 -1492 3 570.983 511.4172 26.4256 0.2161 1491 -1493 3 572.0686 511.6551 26.4796 0.2288 1492 -1494 3 573.1932 511.7776 26.4406 0.2161 1493 -1495 3 574.2766 512.115 26.3196 0.1907 1494 -1496 3 575.3679 512.3564 26.1365 0.1525 1495 -1497 3 575.9274 513.0131 25.9501 0.1271 1496 -1498 3 575.9823 514.0587 25.5577 0.1398 1497 -1499 3 576.2248 515.1077 25.0383 0.178 1498 -1500 3 577.0908 515.7369 24.5171 0.2288 1499 -1501 3 578.0929 516.0893 23.8838 0.2669 1500 -1502 3 579.0036 516.5435 23.1305 0.2796 1501 -1503 3 579.8456 517.2138 22.3609 0.2924 1502 -1504 3 580.8111 517.6772 21.6161 0.2669 1503 -1505 3 581.9208 517.4724 20.9959 0.2796 1504 -1506 3 582.9023 516.8878 20.5298 0.2669 1505 -1507 3 583.7489 516.1842 20.0882 0.2669 1506 -1508 3 584.5337 515.9898 19.7501 0.2415 1507 -1509 3 585.6628 515.896 19.5107 0.2415 1508 -1510 3 586.7999 515.976 19.3314 0.1907 1509 -1511 3 587.6145 516.5755 19.1427 0.1525 1510 -1512 3 588.0194 517.485 18.8361 0.1398 1511 -1513 3 588.6223 518.3121 18.5705 0.178 1512 -1514 3 589.3739 519.1552 18.4706 0.2161 1513 -1515 3 590.3029 519.7775 18.465 0.2669 1514 -1516 3 591.3428 520.234 18.5498 0.2669 1515 -1517 3 591.925 520.9856 18.831 0.2288 1516 -1518 3 592.3335 522.0118 19.1098 0.178 1517 -1519 3 593.0416 522.8652 19.2081 0.178 1518 -1520 3 593.8847 523.5905 19.2731 0.2034 1519 -1521 3 594.8503 524.1282 19.1541 0.2415 1520 -1522 3 595.8787 524.6121 18.9317 0.2288 1521 -1523 3 596.5136 525.5033 18.5796 0.2161 1522 -1524 3 596.993 526.4928 18.1582 0.1652 1523 -1525 3 597.8944 527.1735 17.7652 0.1525 1524 -1526 3 598.8577 527.7798 17.0562 0.1525 1525 -1527 3 583.9296 515.6992 19.6619 0.178 1507 -1528 3 584.2065 514.5975 19.6309 0.1525 1527 -1529 3 584.3689 513.4661 19.62 0.1271 1528 -1530 3 584.5646 512.3381 19.6116 0.1144 1529 -1531 3 584.9272 511.2708 19.6057 0.1271 1530 -1532 3 585.4042 510.2343 19.6019 0.1398 1531 -1533 3 585.8916 509.2058 19.6001 0.1525 1532 -1534 3 586.4178 508.1923 19.6 0.1398 1533 -1535 3 587.0379 507.2507 19.6 0.1271 1534 -1536 3 587.9863 506.6707 19.6 0.1398 1535 -1537 3 588.8019 505.9489 19.6 0.1652 1536 -1538 3 589.6542 505.2121 19.6 0.1907 1537 -1539 3 590.7296 504.8952 19.6 0.1652 1538 -1540 3 591.8553 504.695 19.6 0.1525 1539 -1541 3 592.4959 503.8473 19.6 0.1398 1540 -1542 3 593.1262 502.8932 19.6 0.1525 1541 -1543 3 593.6925 501.9003 19.6 0.1398 1542 -1544 3 594.6821 501.3363 19.6 0.1525 1543 -1545 3 595.7952 501.072 19.6 0.1907 1544 -1546 3 571.1981 509.2573 25.3975 0.2415 1490 -1547 3 572.0812 508.6544 24.6505 0.2161 1546 -1548 3 573.0674 508.1408 24.2391 0.2034 1547 -1549 3 574.1095 507.7335 24.0326 0.2034 1548 -1550 3 575.2307 507.5207 23.9246 0.2288 1549 -1551 3 576.1459 506.9442 23.859 0.2415 1550 -1552 3 576.7613 506.4225 23.5821 0.2161 1551 -1553 3 577.2761 505.5233 23.2401 0.178 1552 -1554 3 577.847 504.5692 23.0335 0.1525 1553 -1555 3 578.6329 503.908 23.0569 0.178 1554 -1556 3 579.452 503.2193 23.2073 0.2034 1555 -1557 3 580.3134 502.5672 23.2321 0.2415 1556 -1558 3 581.2138 502.0032 23.0722 0.2415 1557 -1559 3 582.1713 501.4369 22.7998 0.2415 1558 -1560 3 583.1471 500.8649 22.4538 0.2161 1559 -1561 3 584.1882 500.4085 22.0923 0.2034 1560 -1562 3 585.259 500.0138 21.762 0.1907 1561 -1563 3 586.3755 499.8582 21.4986 0.2034 1562 -1564 3 587.5172 499.7999 21.2872 0.2161 1563 -1565 3 588.4633 499.2828 21.0862 0.2161 1564 -1566 3 589.057 498.3447 20.8162 0.2034 1565 -1567 3 589.2183 497.2579 20.4586 0.178 1566 -1568 3 589.0822 496.1322 20.0717 0.1652 1567 -1569 3 588.922 495.0832 19.5759 0.1398 1568 -1570 3 589.0662 494.0982 18.9586 0.1271 1569 -1571 3 589.3099 493.0526 18.3427 0.1271 1570 -1572 3 589.9242 492.111 17.8577 0.1525 1571 -1573 3 590.6918 491.3366 17.4301 0.178 1572 -1574 3 591.1494 490.3562 17.2909 0.178 1573 -1575 3 591.774 489.4615 17.3888 0.1525 1574 -1576 3 592.6675 488.782 17.5993 0.1398 1575 -1577 3 593.7303 488.385 17.8328 0.1525 1576 -1578 3 594.769 487.9149 17.9709 0.178 1577 -1579 3 595.8707 487.6517 18.0013 0.1907 1578 -1580 3 596.9953 487.6529 17.9082 0.178 1579 -1581 3 598.129 487.7593 17.7848 0.1652 1580 -1582 3 599.2283 487.9526 17.7804 0.1398 1581 -1583 3 600.3529 487.8668 17.848 0.1398 1582 -1584 3 601.4202 487.4618 17.8911 0.1525 1583 -1585 3 602.5173 487.2456 17.9327 0.1907 1584 -1586 3 603.5836 487.6094 17.9858 0.2161 1585 -1587 3 604.4793 488.3175 18.0136 0.2161 1586 -1588 3 605.3156 489.0932 18.0058 0.2034 1587 -1589 3 606.2685 489.5016 17.9511 0.1907 1588 -1590 3 607.2695 489.0325 17.8152 0.2034 1589 -1591 3 608.1962 488.3908 17.7317 0.2034 1590 -1592 3 608.9832 487.6094 17.7191 0.1907 1591 -1593 3 609.7955 486.8464 17.6776 0.1525 1592 -1594 3 610.8468 486.4391 17.5762 0.1271 1593 -1595 3 611.9359 486.3739 17.3889 0.1144 1594 -1596 3 613.0307 486.4757 17.1487 0.1144 1595 -1597 3 614.1198 486.3361 16.8421 0.1144 1596 -1598 3 615.2375 486.0948 16.6173 0.1144 1597 -1599 3 616.354 485.8476 16.4862 0.1271 1598 -1600 3 617.4797 485.7275 16.4966 0.1525 1599 -1601 3 618.5951 485.668 16.9296 0.178 1600 -1602 4 549.3008 518.1714 38.7442 0.1525 1 -1603 4 549.0182 517.0628 38.7394 0.2034 1602 -1604 4 548.6018 516.0001 38.7327 0.2542 1603 -1605 4 548.1407 514.9522 38.7218 0.2415 1604 -1606 4 547.674 513.9077 38.7069 0.2288 1605 -1607 4 547.4566 512.7911 38.6918 0.2161 1606 -1608 4 547.2942 511.6586 38.6806 0.2288 1607 -1609 4 547.1592 510.5363 38.6212 0.2288 1608 -1610 4 547.1203 509.414 38.5106 0.2415 1609 -1611 4 546.7622 508.3456 38.4978 0.2542 1610 -1612 4 546.2749 508.7528 38.4804 0.178 1611 -1613 4 545.2144 508.4451 39.0102 0.178 1612 -1614 4 544.2649 508.182 39.3375 0.2034 1613 -1615 4 543.3245 507.6294 39.4876 0.2034 1614 -1616 4 542.296 507.1661 39.5654 0.2034 1615 -1617 4 541.2047 506.9098 39.6189 0.178 1616 -1618 4 540.1224 506.8835 39.7964 0.178 1617 -1619 4 539.0574 507.0059 40.0635 0.1652 1618 -1620 4 538.0003 507.3274 40.2478 0.1652 1619 -1621 4 537.0485 507.5345 40.5577 0.1398 1620 -1622 4 536.0166 507.6923 40.9984 0.1398 1621 -1623 4 534.8944 507.761 41.3837 0.1525 1622 -1624 4 533.7698 507.8193 41.6304 0.2034 1623 -1625 4 532.929 508.4142 41.9202 0.2415 1624 -1626 4 531.9623 508.7391 42.3231 0.2669 1625 -1627 4 530.8389 508.6876 42.6936 0.2415 1626 -1628 4 529.6983 508.6762 42.992 0.2161 1627 -1629 4 528.7065 509.0548 43.342 0.2034 1628 -1630 4 527.5831 509.1441 43.5117 0.2415 1629 -1631 4 526.4596 509.3202 43.5554 0.2669 1630 -1632 4 525.3591 509.5456 43.4795 0.2542 1631 -1633 4 524.2186 509.5284 43.3972 0.2161 1632 -1634 4 523.0951 509.4072 43.3882 0.2161 1633 -1635 4 521.9866 509.6085 43.4409 0.2796 1634 -1636 4 520.9524 510.0924 43.5226 0.3432 1635 -1637 4 519.8714 510.4574 43.5929 0.3813 1636 -1638 4 518.7468 510.6496 43.6246 0.3559 1637 -1639 4 517.6097 510.7262 43.6047 0.3432 1638 -1640 4 516.4691 510.7365 43.5621 0.3051 1639 -1641 4 515.364 510.8864 43.5632 0.2796 1640 -1642 4 514.4454 511.2513 43.7063 0.2288 1641 -1643 4 513.5565 511.9366 43.7296 0.2161 1642 -1644 4 512.5589 512.4823 43.6814 0.2288 1643 -1645 4 511.5991 513.0966 43.5988 0.2415 1644 -1646 4 510.6644 513.7098 43.4465 0.2542 1645 -1647 4 509.5891 513.8837 43.2172 0.2542 1646 -1648 4 508.4577 513.7521 43.0013 0.2669 1647 -1649 4 507.3514 513.704 42.8061 0.2542 1648 -1650 4 506.3767 514.0793 42.637 0.2669 1649 -1651 4 505.3826 514.5723 42.5986 0.2796 1650 -1652 4 504.4662 515.1077 42.7619 0.3305 1651 -1653 4 503.5957 515.6111 43.1715 0.3305 1652 -1654 4 502.5363 515.9246 43.6262 0.3559 1653 -1655 4 501.4129 515.9989 44.098 0.3305 1654 -1656 4 500.3547 515.6717 44.5785 0.3432 1655 -1657 4 499.3297 515.6672 45.1119 0.3305 1656 -1658 4 498.2509 515.9143 45.586 0.3686 1657 -1659 4 497.1527 516.2174 45.932 0.4195 1658 -1660 4 496.0292 516.4268 46.1614 0.4576 1659 -1661 4 494.9241 516.6887 46.247 0.4703 1660 -1662 4 493.8362 517.0068 46.2129 0.4322 1661 -1663 4 492.7002 517.0228 46.1574 0.394 1662 -1664 4 491.5619 516.9256 46.0981 0.3432 1663 -1665 4 490.4225 516.9141 46.0401 0.3051 1664 -1666 4 489.2945 516.9427 46.0967 0.2924 1665 -1667 4 488.2478 517.3362 46.128 0.2796 1666 -1668 4 487.336 517.9986 46.2678 0.3051 1667 -1669 4 486.2263 518.073 46.5136 0.2924 1668 -1670 4 485.2345 518.6427 46.7407 0.2796 1669 -1671 4 483.9566 518.0604 47.2928 0.3305 1670 -1672 4 482.9522 517.5399 47.5054 0.3432 1671 -1673 4 481.9809 516.9393 47.5955 0.3305 1672 -1674 4 480.9696 516.421 47.6588 0.3305 1673 -1675 4 479.8886 516.0824 47.6773 0.3178 1674 -1676 4 478.8452 515.6534 47.7036 0.2796 1675 -1677 4 477.8946 515.0345 47.7974 0.2669 1676 -1678 4 476.937 514.4522 47.973 0.2161 1677 -1679 4 475.9429 513.942 48.2272 0.2034 1678 -1680 4 475.0151 513.3094 48.4652 0.1652 1679 -1681 4 474.1251 512.5932 48.6354 0.178 1680 -1682 4 473.1813 511.9572 48.7782 0.178 1681 -1683 4 472.17 511.4412 48.9224 0.2034 1682 -1684 4 471.1141 511.034 49.0778 0.2034 1683 -1685 4 470.1314 510.4848 49.1938 0.2161 1684 -1686 4 469.2596 509.7607 49.2327 0.2034 1685 -1687 4 468.3136 509.1624 49.2831 0.2161 1686 -1688 4 467.2828 508.7025 49.3713 0.1907 1687 -1689 4 466.1834 508.5458 49.3892 0.178 1688 -1690 4 465.0806 508.389 49.4208 0.1525 1689 -1691 4 464.0613 507.9154 49.4449 0.1525 1690 -1692 4 463.2639 507.1569 49.3486 0.1525 1691 -1693 4 462.3327 506.5289 49.1868 0.1398 1692 -1694 4 461.2871 506.077 49.0028 0.1398 1693 -1695 4 460.1568 506.0061 48.837 0.1398 1694 -1696 4 459.1261 505.5656 48.6545 0.1652 1695 -1697 4 458.1995 504.9776 48.4067 0.1652 1696 -1698 4 457.1973 504.4399 48.2286 0.1652 1697 -1699 4 456.122 504.0544 48.1202 0.1398 1698 -1700 4 455.0901 503.5671 48.085 0.1271 1699 -1701 4 454.2092 502.8601 48.1426 0.1144 1700 -1702 4 453.2928 502.1851 48.2552 0.1144 1701 -1703 4 452.333 501.5651 48.3818 0.1271 1702 -1704 4 451.3469 500.9976 48.4411 0.1525 1703 -1705 4 450.355 500.4714 48.41 0.178 1704 -1706 4 449.338 499.9566 48.4123 0.2034 1705 -1707 4 448.3256 499.4498 48.4806 0.2161 1706 -1708 4 447.4344 498.7417 48.5862 0.2288 1707 -1709 4 446.5741 497.9924 48.7206 0.2034 1708 -1710 4 445.898 497.0714 48.8538 0.1907 1709 -1711 4 445.2402 496.1356 48.9782 0.178 1710 -1712 4 444.7094 495.1232 49.0818 0.2034 1711 -1713 4 444.0882 494.1634 49.1742 0.1907 1712 -1714 4 443.1764 493.5159 49.3326 0.1907 1713 -1715 4 442.1228 493.1441 49.5499 0.1652 1714 -1716 4 441.6115 492.8878 49.7162 0.1144 1715 -1717 4 440.5887 492.3765 49.8333 0.1144 1716 -1718 4 439.5648 491.8651 49.9038 0.1144 1717 -1719 4 438.5421 491.3537 49.9324 0.1144 1718 -1720 4 437.54 490.8046 49.9142 0.1144 1719 -1721 4 436.5653 490.2097 49.8588 0.1144 1720 -1722 4 435.53 489.7613 49.7904 0.1144 1721 -1723 4 434.4226 489.4867 49.7199 0.1144 1722 -1724 4 433.3506 489.1206 49.6913 0.1144 1723 -1725 4 432.3279 488.6287 49.74 0.1144 1724 -1726 4 431.3429 488.0624 49.8221 0.1144 1725 -1727 4 430.3854 487.4355 49.8968 0.1144 1726 -1728 4 429.4828 486.7388 49.9576 0.1144 1727 -1729 4 428.6316 485.9735 50.0004 0.1144 1728 -1730 4 427.8366 485.1544 50.0226 0.1144 1729 -1731 4 427.0918 484.2861 50.0273 0.1144 1730 -1732 4 426.4203 483.3629 50.0265 0.1144 1731 -1733 4 425.8185 482.3905 50.0254 0.1144 1732 -1734 4 425.2328 481.4078 50.0223 0.1144 1733 -1735 4 424.6608 480.4171 50.015 0.1144 1734 -1736 4 424.0533 479.4493 50.0021 0.1271 1735 -1737 4 423.3509 478.5718 50.0304 0.1525 1736 -1738 4 422.9391 477.572 50.0181 0.178 1737 -1739 4 422.5639 476.5057 49.9355 0.1907 1738 -1740 4 422.0696 475.4739 49.8243 0.1907 1739 -1741 4 421.5571 474.4511 49.6933 0.2034 1740 -1742 4 420.9485 473.5096 49.4816 0.2034 1741 -1743 4 420.2438 472.6402 49.1873 0.1907 1742 -1744 4 419.3835 471.9069 48.8947 0.1525 1743 -1745 4 418.4569 471.2388 48.6186 0.1271 1744 -1746 4 417.5417 470.5798 48.3098 0.1271 1745 -1747 4 416.6608 469.8717 47.9872 0.1525 1746 -1748 4 415.8417 469.0778 47.7089 0.2034 1747 -1749 4 414.97 468.3456 47.4583 0.2415 1748 -1750 4 413.9964 467.777 47.1915 0.2669 1749 -1751 4 413.111 467.2462 46.8188 0.2542 1750 -1752 4 412.2015 466.6182 46.4864 0.2415 1751 -1753 4 411.2154 466.1434 46.3529 0.2161 1752 -1754 4 410.3414 465.4192 46.2493 0.2288 1753 -1755 4 409.2088 465.2648 46.2 0.2542 1754 -1756 4 441.5451 492.8123 51.24 0.1144 1715 -1757 4 440.8393 491.92 51.3299 0.1144 1756 -1758 4 440.13 491.0654 51.3654 0.1144 1757 -1759 4 439.725 490.0027 51.4167 0.1144 1758 -1760 4 439.2159 488.9845 51.4884 0.1144 1759 -1761 4 438.7046 487.9938 51.585 0.1144 1760 -1762 4 437.9381 487.1484 51.711 0.1144 1761 -1763 4 437.2734 486.2332 51.9058 0.1144 1762 -1764 4 436.4966 485.4827 52.2301 0.1144 1763 -1765 4 435.737 484.6876 52.591 0.1144 1764 -1766 4 435.1387 483.7312 52.9659 0.1144 1765 -1767 4 434.6159 482.7646 53.3971 0.1144 1766 -1768 4 433.6835 482.3047 53.7818 0.1144 1767 -1769 4 432.9914 481.5542 54.1682 0.1144 1768 -1770 4 431.9721 481.1973 54.462 0.1144 1769 -1771 4 430.8533 480.9593 54.6616 0.1144 1770 -1772 4 429.7413 480.6916 54.7848 0.1144 1771 -1773 4 428.603 480.6024 54.8481 0.1144 1772 -1774 4 427.856 479.7936 54.88 0.1144 1773 -1775 4 484.3044 519.6105 47.0798 0.2161 1670 -1776 4 483.364 520.1757 47.4099 0.1907 1775 -1777 4 482.2303 520.2226 47.6694 0.178 1776 -1778 4 481.1103 520.0201 47.805 0.2161 1777 -1779 4 480.027 519.6689 47.8663 0.2415 1778 -1780 4 478.9859 519.1941 47.8993 0.2669 1779 -1781 4 477.93 518.7537 47.9125 0.2796 1780 -1782 4 476.8535 518.367 47.9363 0.2796 1781 -1783 4 475.7541 518.0718 47.9872 0.2796 1782 -1784 4 474.6159 517.9609 48.071 0.2288 1783 -1785 4 473.481 517.8613 48.1936 0.1907 1784 -1786 4 472.3565 517.8007 48.3916 0.1652 1785 -1787 4 471.2319 517.7996 48.6279 0.2034 1786 -1788 4 470.0971 517.9449 48.8261 0.2542 1787 -1789 4 468.9634 518.0844 48.9989 0.3051 1788 -1790 4 467.8342 518.192 49.1856 0.3178 1789 -1791 4 466.7074 518.2743 49.3861 0.2924 1790 -1792 4 465.5737 518.3201 49.525 0.2415 1791 -1793 4 464.4491 518.3121 49.5642 0.1907 1792 -1794 4 463.3131 518.2743 49.6138 0.178 1793 -1795 4 462.1874 518.2137 49.7395 0.178 1794 -1796 4 461.0583 518.2331 49.8974 0.1907 1795 -1797 4 459.9258 518.3979 50.0374 0.178 1796 -1798 4 458.792 518.5226 50.1836 0.1652 1797 -1799 4 457.6595 518.5317 50.3653 0.1525 1798 -1800 4 456.5315 518.4917 50.5618 0.1525 1799 -1801 4 455.3932 518.4722 50.7214 0.1398 1800 -1802 4 454.2492 518.4677 50.8175 0.1525 1801 -1803 4 453.1121 518.4116 50.8452 0.1652 1802 -1804 4 451.9875 518.2629 50.7858 0.1907 1803 -1805 4 450.8596 518.121 50.6792 0.1652 1804 -1806 4 449.7247 517.994 50.5778 0.1398 1805 -1807 4 448.5887 517.8659 50.5098 0.1271 1806 -1808 4 447.4516 517.7607 50.4988 0.1525 1807 -1809 4 446.3156 517.8099 50.5557 0.178 1808 -1810 4 445.2986 518.1759 50.7338 0.178 1809 -1811 4 444.3891 518.709 51.0521 0.1525 1810 -1812 4 443.3378 519.1014 51.38 0.1271 1811 -1813 4 442.2532 519.4538 51.6359 0.1144 1812 -1814 4 441.147 519.7352 51.7784 0.1144 1813 -1815 4 440.0293 519.956 51.8028 0.1271 1814 -1816 4 438.9128 520.1699 51.7194 0.1398 1815 -1817 4 437.7962 520.3781 51.5673 0.1525 1816 -1818 4 436.674 520.5886 51.4186 0.1398 1817 -1819 4 435.5494 520.7957 51.3097 0.1398 1818 -1820 4 434.4157 520.9135 51.2414 0.1398 1819 -1821 4 433.2717 520.9135 51.2075 0.1525 1820 -1822 4 432.1277 520.8884 51.1994 0.1398 1821 -1823 4 430.9951 520.7557 51.207 0.1398 1822 -1824 4 429.8763 520.5189 51.2218 0.1398 1823 -1825 4 428.7666 520.2432 51.2434 0.1525 1824 -1826 4 427.673 519.908 51.2747 0.1398 1825 -1827 4 426.5587 519.6906 51.3173 0.1271 1826 -1828 4 425.4181 519.7158 51.3699 0.1398 1827 -1829 4 424.2799 519.7421 51.4444 0.178 1828 -1830 4 423.1587 519.6231 51.585 0.2288 1829 -1831 4 422.0388 519.5407 51.786 0.2288 1830 -1832 4 420.9154 519.5407 51.9347 0.2161 1831 -1833 4 419.8183 519.6849 51.9893 0.2034 1832 -1834 4 418.7555 519.9835 52.1108 0.2161 1833 -1835 4 417.7202 520.3278 52.365 0.2161 1834 -1836 4 416.6551 520.6538 52.6834 0.178 1835 -1837 4 415.5386 520.8174 53.011 0.1652 1836 -1838 4 414.4014 520.7591 53.3123 0.1652 1837 -1839 4 413.2643 520.6447 53.5749 0.1907 1838 -1840 4 412.1214 520.6092 53.7986 0.1652 1839 -1841 4 410.9774 520.6092 54.0036 0.1652 1840 -1842 4 409.8655 520.7705 54.264 0.178 1841 -1843 4 408.7729 521.0417 54.6014 0.2415 1842 -1844 4 407.6999 521.3952 54.9906 0.2542 1843 -1845 4 406.6268 521.7075 55.4417 0.2415 1844 -1846 4 405.5503 521.9843 55.9434 0.1907 1845 -1847 4 404.4749 522.26 56.4707 0.1652 1846 -1848 4 403.3858 522.5037 56.9926 0.1525 1847 -1849 4 402.259 522.5769 57.4596 0.1398 1848 -1850 4 401.1173 522.5769 57.8659 0.1271 1849 -1851 4 399.9756 522.5769 58.228 0.1271 1850 -1852 4 398.8339 522.5769 58.5651 0.1398 1851 -1853 4 397.7242 522.7302 58.9366 0.1525 1852 -1854 4 396.6362 522.9739 59.3684 0.1525 1853 -1855 4 395.5506 523.2244 59.8522 0.1652 1854 -1856 4 394.4706 523.5001 60.3686 0.1907 1855 -1857 4 393.4182 523.8639 60.8916 0.2034 1856 -1858 4 392.376 524.2655 61.3992 0.1907 1857 -1859 4 391.3338 524.6659 61.8733 0.1652 1858 -1860 4 390.2642 525.0274 62.2782 0.1525 1859 -1861 4 389.1613 525.3156 62.573 0.1652 1860 -1862 4 388.0471 525.5776 62.7637 0.1652 1861 -1863 4 386.934 525.8396 62.876 0.178 1862 -1864 4 385.8197 526.1016 62.9331 0.178 1863 -1865 4 384.8565 525.6909 62.9633 0.1907 1864 -1866 4 383.8051 525.2665 62.9779 0.178 1865 -1867 4 382.8087 524.7139 62.9868 0.1525 1866 -1868 4 381.6967 524.5046 62.9933 0.1271 1867 -1869 4 380.6832 523.9989 62.9975 0.1144 1868 -1870 4 379.6295 523.5573 62.9997 0.1144 1869 -1871 4 378.6262 523.0093 63.0 0.1144 1870 -1872 4 377.8037 522.2223 63.0 0.1144 1871 -1873 4 377.5989 521.1103 63.0 0.1144 1872 -1874 4 376.4904 520.8632 63.0 0.1144 1873 -1875 4 546.5929 507.1444 38.6025 0.2288 1611 -1876 4 546.5357 506.0495 38.7671 0.2161 1875 -1877 4 546.2188 504.9582 38.8699 0.2161 1876 -1878 4 545.9717 503.8519 38.9178 0.1907 1877 -1879 4 545.9145 502.7148 38.9494 0.178 1878 -1880 4 546.0712 501.5914 38.9922 0.1525 1879 -1881 4 545.9122 500.5286 39.0547 0.1525 1880 -1882 4 545.5793 499.459 39.0785 0.178 1881 -1883 4 545.4192 498.3413 39.069 0.2161 1882 -1884 4 545.1743 497.2785 39.1636 0.2796 1883 -1885 4 545.1412 496.2695 39.433 0.3178 1884 -1886 4 545.275 495.1838 39.646 0.3432 1885 -1887 4 545.3276 494.0456 39.8124 0.3305 1886 -1888 4 545.4912 492.9164 39.9515 0.2924 1887 -1889 4 545.4626 491.777 40.0008 0.2415 1888 -1890 4 545.3562 490.641 39.9809 0.2034 1889 -1891 4 545.0943 489.5268 39.9434 0.2161 1890 -1892 4 544.8323 488.4136 39.9202 0.2415 1891 -1893 4 544.7694 488.9525 40.6241 0.2415 1892 -1894 4 544.536 489.7556 42.7512 0.2542 1893 -1895 4 543.9045 489.8894 43.741 0.2288 1894 -1896 4 543.098 490.3459 44.8126 0.2161 1895 -1897 4 542.0455 490.768 45.7159 0.2034 1896 -1898 4 540.9404 491.0231 46.424 0.1907 1897 -1899 4 539.8444 491.0563 47.0406 0.1652 1898 -1900 4 538.713 491.0094 47.4796 0.1525 1899 -1901 4 537.6731 490.6101 47.7898 0.1652 1900 -1902 4 536.933 489.7636 48.0231 0.178 1901 -1903 4 536.4113 488.8232 48.2269 0.2034 1902 -1904 4 535.837 487.892 48.3297 0.2161 1903 -1905 4 534.9241 487.3005 48.449 0.2161 1904 -1906 4 533.8282 487.1667 48.673 0.2034 1905 -1907 4 532.7791 486.9127 49.0358 0.178 1906 -1908 4 531.6877 486.6542 49.4539 0.178 1907 -1909 4 530.5655 486.6656 49.9248 0.178 1908 -1910 4 529.5427 486.2961 50.3642 0.1907 1909 -1911 4 528.8575 485.4964 50.913 0.178 1910 -1912 4 527.8565 485.1338 51.5236 0.178 1911 -1913 4 526.971 484.889 52.3292 0.1907 1912 -1914 4 525.8762 484.8878 53.1482 0.2161 1913 -1915 4 525.0205 485.5742 53.9554 0.2161 1914 -1916 4 524.4382 486.1428 54.9035 0.2161 1915 -1917 4 523.5196 486.6759 55.7673 0.2288 1916 -1918 4 522.5964 487.32 56.4558 0.2415 1917 -1919 4 521.5771 487.7147 56.9895 0.2161 1918 -1920 4 520.4868 487.7581 57.3566 0.1907 1919 -1921 4 519.5842 487.2605 57.7338 0.2161 1920 -1922 4 518.6988 486.8326 57.9751 0.2924 1921 -1923 4 517.827 487.241 58.2274 0.3559 1922 -1924 4 516.9198 487.8233 58.5864 0.3559 1923 -1925 4 515.8548 487.8531 58.7672 0.3178 1924 -1926 4 514.7634 487.821 59.0657 0.2669 1925 -1927 4 513.8082 487.328 59.4507 0.2288 1926 -1928 4 512.6722 487.3429 59.8175 0.2034 1927 -1929 4 511.5785 487.3337 60.1644 0.178 1928 -1930 4 510.6347 487.805 60.4629 0.1652 1929 -1931 4 509.5731 487.8485 60.6707 0.1525 1930 -1932 4 508.5114 488.1345 60.8684 0.1652 1931 -1933 4 507.4075 488.1848 60.9988 0.1907 1932 -1934 4 506.2761 488.0418 61.1148 0.2161 1933 -1935 4 505.1469 488.0018 61.2752 0.2415 1934 -1936 4 504.0224 487.9034 61.4908 0.2415 1935 -1937 4 502.9424 487.5854 61.7515 0.2415 1936 -1938 4 501.8854 487.4092 62.0992 0.2161 1937 -1939 4 500.7837 487.4698 62.5008 0.2034 1938 -1940 4 499.8422 487.1186 62.7514 0.1907 1939 -1941 4 498.7977 486.8406 62.8944 0.1907 1940 -1942 4 497.7738 486.7068 63.1834 0.2161 1941 -1943 4 496.8598 486.0936 63.4928 0.2415 1942 -1944 4 496.2947 485.1796 63.8826 0.2669 1943 -1945 4 495.5819 484.2975 64.2485 0.2542 1944 -1946 4 494.8315 483.4407 64.5882 0.2288 1945 -1947 4 494.1794 482.5152 64.8592 0.1907 1946 -1948 4 493.2196 482.0988 65.1146 0.178 1947 -1949 4 492.2815 482.5655 65.3918 0.1907 1948 -1950 4 491.4567 482.5426 65.5351 0.1144 1949 -1951 4 490.3436 482.4202 65.6001 0.1144 1950 -1952 4 489.2808 482.0175 65.6939 0.1144 1951 -1953 4 488.2306 481.5851 65.8095 0.1144 1952 -1954 4 487.1587 481.1858 65.9008 0.1271 1953 -1955 4 486.0764 480.8152 65.9781 0.1525 1954 -1956 4 484.9702 480.5246 66.0593 0.178 1955 -1957 4 483.864 480.2398 66.143 0.178 1956 -1958 4 482.792 479.8577 66.2497 0.1525 1957 -1959 4 481.7647 479.3738 66.3919 0.1271 1958 -1960 4 480.7454 478.8612 66.514 0.1144 1959 -1961 4 479.7387 478.3327 66.6058 0.1144 1960 -1962 4 478.7262 477.8099 66.745 0.1144 1961 -1963 4 477.7047 477.318 66.9477 0.1144 1962 -1964 4 476.6293 476.9897 67.1924 0.1144 1963 -1965 4 475.5871 476.6899 67.4419 0.1144 1964 -1966 4 474.9533 475.8079 67.7564 0.1144 1965 -1967 4 474.6124 474.7703 68.1514 0.1144 1966 -1968 4 474.045 473.8116 68.5524 0.1144 1967 -1969 4 473.3723 472.9102 68.9352 0.1144 1968 -1970 4 472.631 472.0647 69.2524 0.1144 1969 -1971 4 471.7112 471.3863 69.4756 0.1144 1970 -1972 4 471.0351 470.5272 69.6119 0.1144 1971 -1973 4 470.4242 469.58 69.6819 0.1144 1972 -1974 4 469.7092 468.6888 69.7119 0.1144 1973 -1975 4 468.9908 467.7999 69.7194 0.1144 1974 -1976 4 468.4268 466.8115 69.72 0.1144 1975 -1977 4 467.4773 466.2509 69.72 0.1144 1976 -1978 4 466.6056 465.5176 69.72 0.1398 1977 -1979 4 465.4936 465.2648 69.72 0.1907 1978 -1980 4 491.6489 482.8103 65.8801 0.1398 1949 -1981 4 490.8595 482.3241 65.333 0.1525 1980 -1982 4 490.8069 481.2087 65.1392 0.1907 1981 -1983 4 490.3745 480.1665 64.9544 0.2415 1982 -1984 4 489.727 479.2525 64.7651 0.2415 1983 -1985 4 489.02 478.3544 64.6755 0.2034 1984 -1986 4 488.2786 477.5079 64.7469 0.178 1985 -1987 4 487.5293 476.7906 65.0387 0.178 1986 -1988 4 486.5558 476.2014 65.3324 0.178 1987 -1989 4 485.5536 475.65 65.5827 0.1525 1988 -1990 4 484.5206 475.1593 65.7731 0.1271 1989 -1991 4 483.4807 474.6822 65.9504 0.1144 1990 -1992 4 544.679 487.4184 39.9297 0.1525 1892 -1993 4 544.5051 486.2892 39.9655 0.1398 1992 -1994 4 544.2774 485.1681 40.0092 0.1398 1993 -1995 4 544.0075 484.0573 40.0392 0.1398 1994 -1996 4 543.9159 482.9167 40.0389 0.1652 1995 -1997 4 543.9159 481.775 40.0089 0.1652 1996 -1998 4 543.9159 480.6322 39.9585 0.1652 1997 -1999 4 542.8291 481.5965 39.2384 0.1907 1998 -2000 4 542.0123 481.5096 38.817 0.178 1999 -2001 4 541.1612 480.7568 38.645 0.1652 2000 -2002 4 540.3272 479.9801 38.4796 0.178 2001 -2003 4 539.6385 479.0809 38.2824 0.1652 2002 -2004 4 538.9819 478.16 38.0369 0.1652 2003 -2005 4 538.1994 477.3409 37.774 0.1652 2004 -2006 4 537.3848 476.5401 37.529 0.178 2005 -2007 4 536.5715 475.7381 37.2949 0.1907 2006 -2008 4 535.7375 474.9613 37.0289 0.1652 2007 -2009 4 535.2879 474.0153 36.6621 0.1398 2008 -2010 4 535.217 473.012 36.1438 0.1271 2009 -2011 4 534.8795 471.9995 35.6174 0.1398 2010 -2012 4 534.1874 471.1049 35.1954 0.1525 2011 -2013 4 533.6909 470.0948 34.844 0.1525 2012 -2014 4 533.3042 469.0183 34.5587 0.1652 2013 -2015 4 532.9724 467.9395 34.2583 0.178 2014 -2016 4 532.6361 466.8675 33.9074 0.178 2015 -2017 4 532.1819 465.8437 33.488 0.1525 2016 -2018 4 531.7461 464.8118 33.0019 0.1271 2017 -2019 4 531.4761 463.7307 32.4657 0.1144 2018 -2020 4 531.3033 462.6279 31.8993 0.1144 2019 -2021 4 531.3239 461.5125 31.3309 0.1144 2020 -2022 4 531.404 460.3925 30.7737 0.1144 2021 -2023 4 531.3216 459.284 30.2179 0.1271 2022 -2024 4 530.8332 458.307 29.657 0.1525 2023 -2025 4 530.9155 457.2579 29.0802 0.1907 2024 -2026 4 531.3972 456.2306 28.6152 0.2288 2025 -2027 4 531.9074 455.2159 28.2111 0.2415 2026 -2028 4 531.4429 454.2732 27.785 0.2542 2027 -2029 4 530.3161 454.0788 27.467 0.2288 2028 -2030 4 529.1915 453.8671 27.2276 0.2161 2029 -2031 4 528.0818 453.5903 27.0374 0.178 2030 -2032 4 526.9733 453.3386 26.8599 0.1907 2031 -2033 4 526.1485 452.5778 26.6185 0.2034 2032 -2034 4 525.4701 451.6947 26.3113 0.2288 2033 -2035 4 524.5537 451.0106 26.02 0.2034 2034 -2036 4 523.6031 450.3917 25.7374 0.1907 2035 -2037 4 522.5964 450.0862 25.4466 0.1652 2036 -2038 4 522.681 449.0566 25.0296 0.1907 2037 -2039 4 522.5769 448.5018 24.4814 0.1907 2038 -2040 4 521.6194 448.7454 23.9956 0.2034 2039 -2041 4 520.8369 449.5394 23.5068 0.178 2040 -2042 4 519.8622 449.7053 23.0097 0.178 2041 -2043 4 518.8006 449.3254 22.5536 0.178 2042 -2044 4 517.7538 448.909 22.1317 0.178 2043 -2045 4 516.7883 448.3553 21.7209 0.1525 2044 -2046 4 515.9818 447.5957 21.3039 0.1398 2045 -2047 4 515.2439 446.7354 20.9499 0.1525 2046 -2048 4 514.5254 445.8465 20.6891 0.1907 2047 -2049 4 513.6812 445.0846 20.5045 0.2034 2048 -2050 4 512.9993 444.1855 20.3766 0.2034 2049 -2051 4 512.8335 443.0872 20.2799 0.2034 2050 -2052 4 513.2281 442.0439 20.1846 0.2415 2051 -2053 4 513.8368 441.0761 20.0684 0.2796 2052 -2054 4 514.5678 440.2009 19.9252 0.2796 2053 -2055 4 515.3709 439.3875 19.7489 0.2415 2054 -2056 4 516.1556 438.9402 19.3576 0.1907 2055 -2057 4 516.2071 438.1657 18.7802 0.1652 2056 -2058 4 515.6031 437.2425 18.3919 0.1525 2057 -2059 4 515.9875 436.2312 18.1933 0.1525 2058 -2060 4 543.996 480.1528 39.9204 0.2796 1998 -2061 4 544.1848 479.0248 39.9 0.3051 2060 -2062 4 544.3713 477.8957 39.8997 0.3051 2061 -2063 4 544.2111 476.7643 39.9218 0.3051 2062 -2064 4 544.0464 475.6317 39.9675 0.2924 2063 -2065 4 543.8565 474.5037 40.035 0.2924 2064 -2066 4 543.6448 473.3792 40.1223 0.2924 2065 -2067 4 543.4389 472.2546 40.2427 0.3051 2066 -2068 4 543.2799 471.1472 40.4662 0.2796 2067 -2069 4 543.1792 470.0273 40.7515 0.2542 2068 -2070 4 543.305 468.8913 41.0242 0.2161 2069 -2071 4 543.4309 467.7564 41.2768 0.2161 2070 -2072 4 543.5258 466.6376 41.5582 0.2161 2071 -2073 4 543.6116 465.5268 41.8603 0.2288 2072 -2074 4 544.6218 464.7992 41.3468 0.2034 2073 -2075 4 545.3219 463.9114 40.9335 0.2161 2074 -2076 4 546.2783 463.288 40.7792 0.2161 2075 -2077 4 547.4223 463.2445 40.616 0.2288 2076 -2078 4 548.5652 463.2353 40.423 0.2415 2077 -2079 4 549.6714 463.0523 40.1372 0.2415 2078 -2080 4 550.6392 462.5169 39.7872 0.2288 2079 -2081 4 551.1884 461.5148 39.459 0.2034 2080 -2082 4 551.6986 460.5138 39.0754 0.1907 2081 -2083 4 552.2935 459.7439 38.5563 0.2034 2082 -2084 4 553.3654 459.9692 38.0579 0.1907 2083 -2085 4 554.3069 460.5 37.7087 0.178 2084 -2086 4 554.9258 461.3134 37.2548 0.1525 2085 -2087 4 555.3903 461.9712 36.7094 0.178 2086 -2088 4 556.3043 461.5685 36.1827 0.2161 2087 -2089 4 556.9701 460.6808 35.7064 0.2415 2088 -2090 4 557.8441 460.1099 35.2685 0.2288 2089 -2091 4 558.8989 459.7496 34.858 0.2161 2090 -2092 4 559.9159 459.308 34.6223 0.2288 2091 -2093 4 560.9387 459.3114 34.5657 0.2542 2092 -2094 4 561.8607 459.7919 34.4154 0.2415 2093 -2095 4 562.7164 460.1523 34.0192 0.2161 2094 -2096 4 563.5893 460.7323 33.5689 0.1907 2095 -2097 4 564.6532 460.7712 33.1646 0.2034 2096 -2098 4 565.565 460.134 32.788 0.2161 2097 -2099 4 566.4848 459.4567 32.4402 0.2288 2098 -2100 4 567.5716 459.2199 32.0874 0.2161 2099 -2101 4 568.6298 459.4899 31.675 0.2161 2100 -2102 4 569.7314 459.5814 31.1942 0.2161 2101 -2103 4 570.157 460.3101 30.5046 0.2415 2102 -2104 4 570.4716 461.4095 29.9158 0.2542 2103 -2105 4 570.6009 462.5444 29.4157 0.2669 2104 -2106 4 570.9315 463.5774 29.0993 0.2669 2105 -2107 4 571.0448 464.4915 28.6415 0.2542 2106 -2108 4 571.6579 464.1654 27.932 0.2415 2107 -2109 4 572.5457 463.4905 27.2821 0.2161 2108 -2110 4 573.6291 463.3177 26.6268 0.1907 2109 -2111 4 574.6232 463.5717 25.8588 0.1652 2110 -2112 4 575.4961 464.0281 25.0109 0.1525 2111 -2113 4 576.3323 464.7672 24.2673 0.1525 2112 -2114 4 577.1514 465.5588 23.6494 0.1525 2113 -2115 4 578.0598 466.0702 23.038 0.1525 2114 -2116 4 578.8468 465.5199 22.4687 0.1525 2115 -2117 4 578.5197 464.782 21.9413 0.1398 2116 -2118 4 577.6262 464.6619 21.2945 0.1398 2117 -2119 4 577.7429 464.9937 20.4695 0.1525 2118 -2120 4 578.7393 464.7797 19.8071 0.1907 2119 -2121 4 579.8158 464.6264 19.4548 0.2034 2120 -2122 4 580.8923 464.8816 19.3115 0.2034 2121 -2123 4 581.9963 465.0829 19.3039 0.2034 2122 -2124 4 582.8325 465.8322 19.2672 0.2415 2123 -2125 4 583.6802 466.4031 18.8101 0.1525 2124 -2126 4 584.4696 467.0288 17.7782 0.178 2125 -2127 4 585.1457 467.9154 17.3778 0.178 2126 -2128 4 585.5095 468.992 17.0361 0.1525 2127 -2129 4 586.0163 469.9941 16.6928 0.1525 2128 -2130 4 586.9532 470.5615 15.9191 0.1652 2129 -2131 4 582.9515 465.3563 19.0995 0.1271 2124 -2132 4 583.0911 464.3313 18.7623 0.1398 2131 -2133 4 583.551 463.5248 18.3808 0.1525 2132 -2134 4 584.5462 463.5534 17.9294 0.1398 2133 -2135 4 585.5976 463.8314 17.5842 0.1271 2134 -2136 4 586.5608 463.4504 17.4769 0.1144 2135 -2137 4 587.4943 463.5831 17.6355 0.1144 2136 -2138 4 588.1807 462.9699 17.9929 0.1144 2137 -2139 4 588.4221 461.8671 18.2925 0.1144 2138 -2140 4 589.2309 461.0984 18.4455 0.1144 2139 -2141 4 590.1587 460.492 18.1933 0.1144 2140 -2142 4 543.3417 464.6207 42.0445 0.1144 2073 -2143 4 543.1415 463.5053 42.1478 0.1271 2142 -2144 4 543.1655 462.3648 42.2162 0.1525 2143 -2145 4 543.2547 461.2242 42.2688 0.1907 2144 -2146 4 543.265 460.0825 42.3186 0.2034 2145 -2147 4 543.2009 458.9396 42.385 0.2034 2146 -2148 4 543.1357 457.8025 42.5009 0.1907 2147 -2149 4 543.0705 456.6711 42.681 0.1907 2148 -2150 4 542.9836 455.5408 42.8943 0.1907 2149 -2151 4 542.8486 454.4071 43.0956 0.178 2150 -2152 4 542.6839 453.2745 43.2648 0.178 2151 -2153 4 542.5832 452.1408 43.4283 0.1652 2152 -2154 4 542.5603 451.006 43.6083 0.178 2153 -2155 4 542.7388 449.902 43.764 0.178 2154 -2156 4 543.1609 448.8576 43.9228 0.2034 2155 -2157 4 543.2959 447.7662 44.0877 0.2034 2156 -2158 4 543.1174 446.6382 44.214 0.1907 2157 -2159 4 543.082 445.5079 44.296 0.1652 2158 -2160 4 543.2273 444.3754 44.3346 0.1525 2159 -2161 4 543.3703 443.2417 44.3674 0.1652 2160 -2162 4 543.4343 442.1182 44.4559 0.1652 2161 -2163 4 543.4526 440.9868 44.5802 0.178 2162 -2164 4 543.4583 439.8463 44.6751 0.1652 2163 -2165 4 543.4583 438.7034 44.7224 0.1907 2164 -2166 4 543.4583 437.5606 44.7348 0.1907 2165 -2167 4 543.4583 436.4188 44.7213 0.2288 2166 -2168 4 543.4583 435.2748 44.7042 0.2415 2167 -2169 4 543.4583 434.132 44.7216 0.2796 2168 -2170 4 543.4583 432.9891 44.7871 0.2669 2169 -2171 4 543.4286 431.8497 44.9033 0.2415 2170 -2172 4 543.3725 430.7137 45.0663 0.1907 2171 -2173 4 543.2982 429.5777 45.2519 0.1652 2172 -2174 4 543.1929 428.4394 45.4205 0.1398 2173 -2175 4 543.0728 427.3012 45.5557 0.1271 2174 -2176 4 543.011 426.1663 45.694 0.1144 2175 -2177 4 543.0007 425.036 45.864 0.1144 2176 -2178 4 542.9893 423.8978 46.0242 0.1271 2177 -2179 4 542.844 422.7904 46.0886 0.1652 2178 -2180 4 542.7594 421.6658 46.0984 0.2161 2179 -2181 4 542.9779 420.555 46.1255 0.2415 2180 -2182 4 543.5133 419.8423 46.366 0.2161 2181 -2183 4 543.7615 418.8035 46.5836 0.1652 2182 -2184 4 543.9388 417.6744 46.7365 0.1525 2183 -2185 4 544.1173 416.5453 46.8404 0.1907 2184 -2186 4 544.2946 415.4161 46.8955 0.2542 2185 -2187 4 544.4948 414.2904 46.9092 0.2669 2186 -2188 4 544.8437 413.2036 46.9168 0.2288 2187 -2189 4 545.219 412.1237 46.9622 0.1652 2188 -2190 4 545.5953 411.0438 47.0492 0.1398 2189 -2191 4 545.9706 409.9627 47.1727 0.1398 2190 -2192 4 546.2406 408.8622 47.3654 0.1525 2191 -2193 4 546.4625 407.7571 47.623 0.1398 2192 -2194 4 546.6787 406.652 47.92 0.1398 2193 -2195 4 546.8949 405.5469 48.2334 0.1525 2194 -2196 4 547.0185 404.4154 48.5111 0.178 2195 -2197 4 547.0505 403.2726 48.7144 0.178 2196 -2198 4 547.0688 402.1286 48.8452 0.1525 2197 -2199 4 547.0871 400.9857 48.9199 0.1271 2198 -2200 4 547.1066 399.8417 48.9563 0.1271 2199 -2201 4 547.1329 398.6977 48.9714 0.1525 2200 -2202 4 547.3605 397.58 48.9807 0.178 2201 -2203 4 547.6225 396.4658 48.9927 0.1907 2202 -2204 4 547.8845 395.3527 49.0092 0.1907 2203 -2205 4 548.1465 394.2384 49.0316 0.2161 2204 -2206 4 548.3638 393.1162 49.0641 0.2542 2205 -2207 4 548.4988 391.9802 49.1123 0.2924 2206 -2208 4 548.6201 390.843 49.177 0.3051 2207 -2209 4 548.7425 389.7059 49.2584 0.2924 2208 -2210 4 548.8637 388.5688 49.3562 0.2669 2209 -2211 4 549.0113 387.4362 49.4813 0.2161 2210 -2212 4 549.2069 386.3151 49.6507 0.1652 2211 -2213 4 549.4106 385.1974 49.8534 0.1271 2212 -2214 4 549.6142 384.0797 50.0755 0.1144 2213 -2215 4 549.7629 382.9517 50.2956 0.1271 2214 -2216 4 549.803 381.8123 50.4896 0.1525 2215 -2217 4 549.827 380.6706 50.6484 0.178 2216 -2218 4 549.851 379.5289 50.7693 0.178 2217 -2219 4 549.8728 378.386 50.8452 0.1652 2218 -2220 4 549.875 377.25 50.8306 0.178 2219 -2221 4 549.875 376.114 50.7483 0.2161 2220 -2222 4 549.875 374.9792 50.6293 0.2669 2221 -2223 4 549.875 373.8432 50.4997 0.2669 2222 -2224 4 550.0272 372.7129 50.4333 0.2415 2223 -2225 4 550.3052 371.6135 50.475 0.178 2224 -2226 4 550.5969 370.5176 50.6108 0.1398 2225 -2227 4 550.8898 369.4216 50.8119 0.1144 2226 -2228 4 551.1723 368.3177 51.0322 0.1271 2227 -2229 4 551.4366 367.2057 51.2252 0.1525 2228 -2230 4 551.6986 366.0914 51.3845 0.178 2229 -2231 4 551.9606 364.9783 51.5197 0.1907 2230 -2232 4 552.2225 363.8641 51.6454 0.1907 2231 -2233 4 552.3129 362.7338 51.8199 0.1907 2232 -2234 4 552.3198 361.6058 52.0579 0.1907 2233 -2235 4 552.3198 360.4778 52.344 0.178 2234 -2236 4 552.3198 359.3498 52.6568 0.1652 2235 -2237 4 552.218 358.2196 52.9586 0.1398 2236 -2238 4 551.8931 357.1271 53.1989 0.1271 2237 -2239 4 551.5464 356.0368 53.3758 0.1144 2238 -2240 4 551.1986 354.9466 53.5027 0.1398 2239 -2241 4 550.8509 353.8575 53.5945 0.1652 2240 -2242 4 550.9344 352.7249 53.6606 0.1907 2241 -2243 4 551.0957 351.5924 53.718 0.1652 2242 -2244 4 551.2604 350.461 53.7807 0.1398 2243 -2245 4 551.4252 349.3284 53.8549 0.1144 2244 -2246 4 551.5899 348.197 53.9445 0.1271 2245 -2247 4 551.4114 347.0804 54.0994 0.1398 2246 -2248 4 551.1941 345.9673 54.3096 0.1525 2247 -2249 4 550.9767 344.8554 54.5574 0.1398 2248 -2250 4 550.7582 343.7423 54.826 0.1271 2249 -2251 4 550.5843 342.6154 55.0785 0.1271 2250 -2252 4 550.4276 341.484 55.2997 0.1398 2251 -2253 4 550.272 340.3537 55.4842 0.1652 2252 -2254 4 550.1164 339.2223 55.638 0.178 2253 -2255 4 549.9963 338.0863 55.7617 0.1907 2254 -2256 4 550.0283 336.9435 55.844 0.1907 2255 -2257 4 550.0752 335.8006 55.8958 0.2034 2256 -2258 4 550.121 334.6578 55.9258 0.2161 2257 -2259 4 550.1679 333.5138 55.9404 0.2288 2258 -2260 4 550.137 332.3709 55.9454 0.2161 2259 -2261 4 550.081 331.228 55.9465 0.2161 2260 -2262 4 550.0238 330.0852 55.9474 0.2161 2261 -2263 4 549.9666 328.9435 55.9488 0.2288 2262 -2264 4 549.9094 327.8006 55.9507 0.2415 2263 -2265 4 549.795 326.6623 55.9532 0.2415 2264 -2266 4 549.6131 325.5332 55.9572 0.2415 2265 -2267 4 549.4254 324.4052 55.9622 0.2034 2266 -2268 4 549.2367 323.2761 55.9695 0.1907 2267 -2269 4 549.0491 322.1481 55.9796 0.1907 2268 -2270 4 548.8603 321.019 55.9938 0.2542 2269 -2271 4 548.6727 319.891 56.014 0.2924 2270 -2272 4 548.4839 318.763 56.042 0.3178 2271 -2273 4 548.2963 317.6339 56.0804 0.2924 2272 -2274 4 548.1087 316.5059 56.131 0.2796 2273 -2275 4 547.9291 315.3768 56.212 0.2542 2274 -2276 4 547.7564 314.2476 56.3276 0.2415 2275 -2277 4 547.5825 313.1197 56.4721 0.2542 2276 -2278 4 547.4086 311.9905 56.6401 0.2924 2277 -2279 4 547.2358 310.8614 56.826 0.3051 2278 -2280 4 547.0768 309.7369 57.0441 0.2796 2279 -2281 4 546.9189 308.6123 57.2816 0.2161 2280 -2282 4 546.7622 307.4889 57.5249 0.178 2281 -2283 4 546.6043 306.3643 57.7643 0.1398 2282 -2284 4 546.4316 305.2352 57.9667 0.1271 2283 -2285 4 546.2451 304.1072 58.109 0.1144 2284 -2286 4 546.0564 302.9792 58.1977 0.1144 2285 -2287 4 545.8688 301.8501 58.2462 0.1144 2286 -2288 4 545.6811 300.7221 58.2672 0.1144 2287 -2289 4 545.5324 299.5873 58.2725 0.1144 2288 -2290 4 545.4112 298.4502 58.2719 0.1144 2289 -2291 4 545.2922 297.3119 58.2708 0.1144 2290 -2292 4 545.1721 296.1747 58.2691 0.1144 2291 -2293 4 545.0519 295.0365 58.2669 0.1271 2292 -2294 4 544.8197 293.9176 58.2638 0.1398 2293 -2295 4 544.4868 292.8228 58.259 0.1525 2294 -2296 4 544.1459 291.7314 58.2526 0.1398 2295 -2297 4 543.805 290.6389 58.2442 0.1271 2296 -2298 4 543.4675 289.5464 58.2338 0.1144 2297 -2299 4 543.1918 288.4367 58.2126 0.1144 2298 -2300 4 542.9218 287.3248 58.1846 0.1144 2299 -2301 4 542.6518 286.2139 58.1538 0.1144 2300 -2302 4 542.4734 285.0837 58.1353 0.1144 2301 -2303 4 542.3487 283.9477 58.1347 0.1144 2302 -2304 4 542.2263 282.8105 58.1487 0.1144 2303 -2305 4 542.1038 281.6722 58.1742 0.1144 2304 -2306 4 541.9826 280.5351 58.2058 0.1144 2305 -2307 4 541.9357 279.3923 58.2344 0.1144 2306 -2308 4 541.9322 278.2483 58.2551 0.1144 2307 -2309 4 541.9322 277.1043 58.2683 0.1271 2308 -2310 4 541.9322 275.9603 58.2761 0.1398 2309 -2311 4 541.8842 274.8174 58.2806 0.1652 2310 -2312 4 541.8098 273.6757 58.2837 0.178 2311 -2313 4 541.732 272.5351 58.287 0.1907 2312 -2314 4 541.6554 271.3934 58.2921 0.178 2313 -2315 4 541.5788 270.2517 58.2988 0.1525 2314 -2316 4 541.4678 269.1134 58.308 0.1398 2315 -2317 4 541.3065 267.9809 58.3215 0.1525 2316 -2318 4 541.1417 266.8483 58.3402 0.178 2317 -2319 4 540.977 265.7169 58.3657 0.178 2318 -2320 4 540.8123 264.5843 58.3996 0.1525 2319 -2321 4 540.7162 263.4449 58.4514 0.1271 2320 -2322 4 540.7105 262.3032 58.5298 0.1271 2321 -2323 4 540.7105 261.1603 58.6289 0.1398 2322 -2324 4 540.7105 260.0175 58.7423 0.178 2323 -2325 4 540.7105 258.8758 58.8647 0.1907 2324 -2326 4 540.683 257.7329 58.9904 0.2034 2325 -2327 4 540.4222 256.6209 59.1002 0.1652 2326 -2328 4 540.1442 255.5113 59.1984 0.1398 2327 -2329 4 539.8673 254.4016 59.2931 0.1144 2328 -2330 4 539.7975 253.2644 59.4233 0.1271 2329 -2331 4 539.7941 252.1273 59.5913 0.1525 2330 -2332 4 539.7941 250.9902 59.787 0.178 2331 -2333 4 539.7941 249.853 59.999 0.178 2332 -2334 4 539.7941 248.7159 60.2134 0.1525 2333 -2335 4 539.6534 247.5822 60.3907 0.1271 2334 -2336 4 539.4452 246.4576 60.5161 0.1144 2335 -2337 4 539.2324 245.3331 60.6001 0.1271 2336 -2338 4 539.0208 244.2097 60.6561 0.1525 2337 -2339 4 538.808 243.0851 60.7009 0.178 2338 -2340 4 538.4614 241.996 60.7463 0.1907 2339 -2341 4 538.0804 240.9172 60.7981 0.1907 2340 -2342 4 538.0049 239.7778 60.8555 0.1907 2341 -2343 4 538.26 238.6693 60.9484 0.178 2342 -2344 4 539.0814 238.2288 61.2455 0.1525 2343 -2345 4 538.8309 237.1226 61.3928 0.1271 2344 -2346 4 538.5803 236.0164 61.4146 0.1144 2345 -2347 4 538.3309 234.9112 61.3351 0.1144 2346 -2348 4 538.0804 233.805 61.1783 0.1144 2347 -2349 4 537.8299 232.6965 60.9748 0.1144 2348 -2350 4 537.5885 231.5776 60.7919 0.1144 2349 -2351 4 537.346 230.4599 60.6687 0.1144 2350 -2352 4 537.1046 229.3423 60.5889 0.1271 2351 -2353 4 536.9959 228.2028 60.5357 0.1525 2352 -2354 4 536.9272 227.0611 60.4937 0.178 2353 -2355 4 536.8598 225.9194 60.4486 0.1907 2354 -2356 4 536.7923 224.7777 60.3901 0.178 2355 -2357 4 536.7065 223.6371 60.3061 0.178 2356 -2358 4 536.5577 222.5137 60.1642 0.178 2357 -2359 4 536.4079 221.3903 59.9844 0.2161 2358 -2360 4 536.258 220.2669 59.7867 0.2415 2359 -2361 4 536.0978 219.1389 59.6019 0.2669 2360 -2362 4 535.8851 218.0224 59.5151 0.2669 2361 -2363 4 535.6711 216.9047 59.5045 0.2669 2362 -2364 4 535.4584 215.7881 59.5426 0.2542 2363 -2365 4 535.2433 214.6705 59.6005 0.2288 2364 -2366 4 534.9527 213.5779 59.5529 0.1907 2365 -2367 4 534.6495 212.4946 59.3984 0.1652 2366 -2368 4 534.3475 211.4112 59.1595 0.1398 2367 -2369 4 534.0455 210.3278 58.8728 0.1271 2368 -2370 4 534.0318 209.1861 58.6312 0.1144 2369 -2371 4 534.0787 208.0433 58.4564 0.1144 2370 -2372 4 534.1279 206.8993 58.3506 0.1144 2371 -2373 4 534.1759 205.7564 58.2968 0.1144 2372 -2374 4 534.0878 204.6158 58.277 0.1144 2373 -2375 4 533.9242 203.4844 58.2739 0.1144 2374 -2376 4 533.7595 202.3519 58.2733 0.1398 2375 -2377 4 533.5948 201.2204 58.2728 0.1652 2376 -2378 4 533.43 200.0879 58.2719 0.1907 2377 -2379 4 533.4644 198.945 58.2705 0.1652 2378 -2380 4 533.5833 197.8068 58.2688 0.1398 2379 -2381 4 533.7035 196.6696 58.2663 0.1144 2380 -2382 4 533.8224 195.5313 58.263 0.1398 2381 -2383 4 533.9426 194.3942 58.2582 0.1907 2382 -2384 4 534.1496 193.2685 58.2515 0.2542 2383 -2385 4 534.4116 192.1554 58.242 0.2924 2384 -2386 4 534.6736 191.0411 58.2288 0.2796 2385 -2387 4 534.9355 189.928 58.2103 0.2669 2386 -2388 4 535.1975 188.8138 58.1851 0.2415 2387 -2389 4 535.0568 187.6789 58.1493 0.2669 2388 -2390 4 534.8921 186.5475 58.098 0.2542 2389 -2391 4 534.7273 185.4149 58.0269 0.2415 2390 -2392 4 534.5626 184.2835 57.9314 0.178 2391 -2393 4 534.3979 183.151 57.8091 0.1398 2392 -2394 4 534.7113 181.8949 57.5848 0.1144 2393 -2395 4 534.9859 180.7989 57.293 0.1144 2394 -2396 4 535.2593 179.703 56.9545 0.1144 2395 -2397 4 535.5339 178.6081 56.588 0.1271 2396 -2398 4 535.8084 177.5088 56.2192 0.1398 2397 -2399 4 536.0853 176.4048 55.8779 0.1525 2398 -2400 4 536.3621 175.2963 55.5772 0.1525 2399 -2401 4 536.639 174.1889 55.3008 0.1525 2400 -2402 4 536.9147 173.0815 55.0351 0.1525 2401 -2403 4 537.1709 171.9729 54.754 0.1398 2402 -2404 4 537.4066 170.8633 54.4373 0.1271 2403 -2405 4 537.6434 169.7536 54.0848 0.1144 2404 -2406 4 537.8791 168.6439 53.6992 0.1271 2405 -2407 4 538.1639 167.5525 53.2745 0.1398 2406 -2408 4 538.5151 166.4898 52.8024 0.178 2407 -2409 4 538.8835 165.435 52.295 0.1907 2408 -2410 4 539.253 164.3802 51.7678 0.2034 2409 -2411 4 539.4646 163.2968 51.2341 0.1652 2410 -2412 4 539.4887 162.1814 50.7063 0.1525 2411 -2413 4 539.4887 161.0649 50.197 0.1525 2412 -2414 4 539.5756 159.9461 49.7316 0.178 2413 -2415 4 539.8399 158.841 49.3455 0.178 2414 -2416 4 540.1876 157.7507 49.0364 0.1652 2415 -2417 4 540.5354 156.6616 48.7774 0.1652 2416 -2418 4 540.8901 155.5748 48.5405 0.178 2417 -2419 4 541.3053 154.5269 48.265 0.178 2418 -2420 4 541.7709 153.5145 47.9147 0.1652 2419 -2421 4 542.2366 152.5009 47.5048 0.1652 2420 -2422 4 542.7376 151.4976 47.0686 0.178 2421 -2423 4 543.3222 150.5264 46.6544 0.178 2422 -2424 4 543.9548 149.5769 46.2862 0.1525 2423 -2425 4 544.5875 148.6273 45.9609 0.1271 2424 -2426 4 545.3196 147.7648 45.6593 0.1144 2425 -2427 4 546.2154 147.0784 45.3547 0.1144 2426 -2428 4 547.1729 146.4766 45.0358 0.1144 2427 -2429 4 548.1304 145.8749 44.7028 0.1144 2428 -2430 4 549.0136 145.1702 44.3752 0.1144 2429 -2431 4 549.8098 144.3545 44.07 0.1144 2430 -2432 4 550.59 143.5217 43.7884 0.1144 2431 -2433 4 551.3691 142.6888 43.5271 0.1144 2432 -2434 4 552.1356 141.8514 43.2645 0.1144 2433 -2435 4 552.8929 141.0117 42.9884 0.1144 2434 -2436 4 553.6491 140.1709 42.7062 0.1144 2435 -2437 4 554.3412 139.2751 42.4393 0.1144 2436 -2438 4 554.8606 138.2661 42.2257 0.1398 2437 -2439 4 555.285 137.2034 42.0767 0.1652 2438 -2440 4 555.7106 136.1417 41.9801 0.1907 2439 -2441 4 556.119 135.0732 41.9208 0.1652 2440 -2442 4 556.2906 133.9601 41.8816 0.1398 2441 -2443 4 556.2906 132.8161 41.8471 0.1144 2442 -2444 4 556.3444 131.6744 41.8023 0.1144 2443 -2445 4 556.4668 130.5361 41.7388 0.1144 2444 -2446 4 556.8088 129.4608 41.652 0.1144 2445 -2447 4 557.4781 128.5478 41.5405 0.1144 2446 -2448 4 558.1965 127.6693 41.37 0.1144 2447 -2449 4 558.8257 126.7483 41.1051 0.1144 2448 -2450 4 559.3405 125.7988 40.7369 0.1144 2449 -2451 4 559.8828 124.8218 40.3819 0.1271 2450 -2452 4 560.4639 123.8369 40.1008 0.1398 2451 -2453 4 561.0451 122.8519 39.8916 0.1652 2452 -2454 4 561.5484 121.8268 39.7513 0.1652 2453 -2455 4 561.7223 120.7137 39.6743 0.178 2454 -2456 4 561.7601 119.5709 39.641 0.1652 2455 -2457 4 561.7967 118.4269 39.6248 0.1652 2456 -2458 4 561.8344 117.284 39.6136 0.1398 2457 -2459 4 561.8722 116.1412 39.6046 0.1398 2458 -2460 4 562.1238 115.0349 39.5948 0.1398 2459 -2461 4 562.5265 113.9644 39.5819 0.178 2460 -2462 4 562.951 112.9022 39.5643 0.2034 2461 -2463 4 563.3765 111.8401 39.5394 0.2542 2462 -2464 4 563.8513 110.8001 39.5044 0.2669 2463 -2465 4 564.3993 109.7963 39.4545 0.2796 2464 -2466 4 564.969 108.8047 39.3862 0.2415 2465 -2467 4 565.5398 107.8127 39.2958 0.2161 2466 -2468 4 566.042 106.7886 39.163 0.1907 2467 -2469 4 566.3944 105.7185 38.9556 0.1907 2468 -2470 4 566.6976 104.6354 38.6823 0.178 2469 -2471 4 566.9996 103.5521 38.3698 0.1652 2470 -2472 4 567.3348 102.4715 38.0576 0.1525 2471 -2473 4 567.7432 101.4067 37.7986 0.1525 2472 -2474 4 568.1768 100.3481 37.6071 0.1398 2473 -2475 4 568.6103 99.2897 37.4763 0.1398 2474 -2476 4 569.0496 98.2337 37.3929 0.1652 2475 -2477 4 569.5404 97.2011 37.3472 0.2034 2476 -2478 4 570.0518 96.1781 37.3254 0.2161 2477 -2479 4 570.5643 95.1548 37.3153 0.178 2478 -2480 4 571.0756 94.132 37.3128 0.1525 2479 -2481 4 571.6843 93.1658 37.3159 0.1398 2480 -2482 4 572.3398 92.2279 37.3232 0.178 2481 -2483 4 572.9976 91.2919 37.3335 0.2034 2482 -2484 4 573.6554 90.356 37.3484 0.2288 2483 -2485 4 574.3029 89.413 37.3708 0.2161 2484 -2486 4 574.852 88.4121 37.4021 0.1907 2485 -2487 4 575.3645 87.389 37.4399 0.1652 2486 -2488 4 576.0532 86.4858 37.4833 0.1398 2487 -2489 4 576.5508 85.4777 37.581 0.1398 2488 -2490 4 576.8242 84.3827 37.7454 0.1398 2489 -2491 4 577.2475 83.3284 37.8952 0.1525 2490 -2492 4 578.133 82.8969 37.851 0.1398 2491 -2493 4 579.2392 82.7911 37.9047 0.1271 2492 -2494 4 579.6282 81.9364 38.6604 0.1144 2493 -2495 4 534.3818 182.2655 58.5164 0.1144 2393 -2496 4 534.3624 181.1295 58.7882 0.1525 2495 -2497 4 534.3418 179.9924 58.9095 0.1398 2496 -2498 4 534.3212 178.8552 59.0402 0.1525 2497 -2499 4 534.3029 177.717 59.1517 0.178 2498 -2500 4 534.296 176.5753 59.1895 0.2161 2499 -2501 4 534.296 175.4393 59.1287 0.2161 2500 -2502 4 534.296 174.3044 58.9915 0.1907 2501 -2503 4 534.296 173.1684 58.8073 0.1652 2502 -2504 4 534.2457 172.0347 58.6152 0.1525 2503 -2505 4 534.0707 170.9044 58.4662 0.1525 2504 -2506 4 533.8819 169.7753 58.3674 0.1525 2505 -2507 4 533.6943 168.6473 58.3111 0.1398 2506 -2508 4 533.5067 167.5182 58.2848 0.1398 2507 -2509 4 533.3179 166.3902 58.2767 0.1525 2508 -2510 4 533.1303 165.2622 58.2764 0.1907 2509 -2511 4 532.9416 164.1331 58.277 0.2161 2510 -2512 4 532.7539 163.0051 58.2778 0.2161 2511 -2513 4 532.5686 161.876 58.2789 0.1907 2512 -2514 4 532.4084 160.7434 58.2806 0.1525 2513 -2515 4 532.2883 159.6063 58.2828 0.1271 2514 -2516 4 532.1682 158.468 58.2862 0.1271 2515 -2517 4 532.0481 157.3309 58.2904 0.1398 2516 -2518 4 531.9268 156.1926 58.2966 0.1525 2517 -2519 4 531.785 155.0578 58.3052 0.1398 2518 -2520 4 531.5962 153.9298 58.3173 0.1271 2519 -2521 4 531.4086 152.8018 58.3344 0.1271 2520 -2522 4 531.2198 151.6727 58.3579 0.1398 2521 -2523 4 531.0276 150.5458 58.3901 0.1525 2522 -2524 4 530.8057 149.4236 58.4366 0.1398 2523 -2525 4 530.5392 148.3116 58.5043 0.1271 2524 -2526 4 530.2715 147.1996 58.5942 0.1144 2525 -2527 4 530.0049 146.0865 58.7062 0.1144 2526 -2528 4 529.7864 144.9688 58.8493 0.1144 2527 -2529 4 529.7132 143.8363 59.0464 0.1144 2528 -2530 4 529.7132 142.7048 59.2948 0.1144 2529 -2531 4 529.7132 141.5734 59.5745 0.1144 2530 -2532 4 529.7132 140.442 59.8671 0.1144 2531 -2533 4 529.7246 139.3083 60.1446 0.1144 2532 -2534 4 529.7692 138.1655 60.3638 0.1144 2533 -2535 4 529.8253 137.0237 60.5158 0.1144 2534 -2536 4 529.8825 135.8809 60.6169 0.1144 2535 -2537 4 529.9397 134.738 60.6855 0.1144 2536 -2538 4 530.0095 133.5963 60.739 0.1144 2537 -2539 4 530.1353 132.4603 60.797 0.1144 2538 -2540 4 530.1685 131.3392 60.8748 0.1144 2539 -2541 4 529.791 130.265 60.9787 0.1144 2540 -2542 4 529.3791 129.2079 61.117 0.1144 2541 -2543 4 529.3036 128.0983 61.3248 0.1144 2542 -2544 4 529.839 127.2757 61.6728 0.1144 2543 -2545 4 530.4053 126.436 62.0838 0.1144 2544 -2546 4 530.5895 125.3149 62.4392 0.1144 2545 -2547 4 530.6295 124.1732 62.7164 0.1144 2546 -2548 4 530.6295 123.0292 62.9194 0.1144 2547 -2549 4 530.6295 121.8852 63.061 0.1144 2548 -2550 4 530.6295 120.7412 63.1616 0.1144 2549 -2551 4 530.6295 119.5972 63.2556 0.1144 2550 -2552 4 530.6295 118.4566 63.392 0.1144 2551 -2553 4 530.6295 117.3195 63.5897 0.1144 2552 -2554 4 530.6295 116.1824 63.8378 0.1144 2553 -2555 4 530.6295 115.0452 64.1253 0.1271 2554 -2556 4 530.6295 113.9076 64.4434 0.1525 2555 -2557 4 530.8492 112.8153 64.792 0.178 2556 -2558 4 531.2999 111.7832 65.1636 0.178 2557 -2559 4 531.8834 110.8239 65.5427 0.1525 2558 -2560 4 532.5617 109.9588 65.9526 0.1271 2559 -2561 4 533.3339 109.1839 66.3816 0.1271 2560 -2562 4 534.2732 108.5891 66.6966 0.1525 2561 -2563 4 535.2536 108.1193 66.8105 0.2034 2562 -2564 4 536.1802 107.5147 66.8478 0.2288 2563 -2565 4 537.0165 106.7631 66.9662 0.2415 2564 -2566 4 537.8207 105.9886 67.191 0.2161 2565 -2567 4 538.6009 105.1889 67.5105 0.2161 2566 -2568 4 539.2896 104.3106 67.9098 0.2161 2567 -2569 4 539.944 103.4018 68.3553 0.2542 2568 -2570 4 540.5972 102.4929 68.7977 0.2796 2569 -2571 4 541.1143 101.4904 69.1704 0.2924 2570 -2572 4 541.4941 100.414 69.4431 0.2415 2571 -2573 4 541.8419 99.3245 69.6273 0.2034 2572 -2574 4 542.1896 98.2349 69.7432 0.2034 2573 -2575 4 542.5203 97.1401 69.8074 0.2542 2574 -2576 4 542.8005 96.0314 69.8312 0.2669 2575 -2577 4 543.0625 94.9178 69.8284 0.2288 2576 -2578 4 543.3256 93.8043 69.8076 0.1652 2577 -2579 4 543.5876 92.6909 69.7679 0.1271 2578 -2580 4 543.9571 91.6106 69.7046 0.1144 2579 -2581 4 544.3003 90.5203 69.6133 0.1144 2580 -2582 4 544.6367 89.4269 69.4915 0.1271 2581 -2583 4 545.2819 88.5072 69.34 0.1398 2582 -2584 4 545.7967 87.553 69.0645 0.1652 2583 -2585 4 546.2131 86.5581 68.6664 0.1652 2584 -2586 4 546.6307 85.5639 68.2016 0.178 2585 -2587 4 547.3525 84.7047 67.8031 0.1652 2586 -2588 4 548.1796 83.9195 67.5116 0.1652 2587 -2589 4 548.8523 83.0498 67.2487 0.1398 2588 -2590 4 549.5101 82.1395 67.1989 0.1271 2589 -2591 4 550.2354 81.5507 67.4775 0.1144 2590 -2592 4 551.2421 81.0208 68.2245 0.1144 2591 diff --git a/allensdk/test/model/aa_model/manifest.json b/allensdk/test/model/aa_model/manifest.json deleted file mode 100644 index bb14aec992..0000000000 --- a/allensdk/test/model/aa_model/manifest.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "biophys": [ - { - "model_file": [ - "manifest.json", - "468193142_fit.json" - ], - "model_type": "Biophysical - all active" - } - ], - "runs": [ - { - "sweeps": [ - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 55, - 58, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76 - ] - } - ], - "neuron": [ - { - "hoc": [ - "stdgui.hoc", - "import3d.hoc" - ] - } - ], - "manifest": [ - { - "type": "dir", - "spec": ".", - "key": "BASEDIR" - }, - { - "type": "dir", - "spec": "work", - "key": "WORKDIR", - "parent": "BASEDIR" - }, - { - "type": "file", - "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc", - "key": "MORPHOLOGY" - }, - { - "type": "file", - "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_marker_m.swc", - "key": "MARKER" - }, - { - "type": "dir", - "spec": "modfiles", - "key": "MODFILE_DIR" - }, - { - "type": "file", - "format": "NWB", - "spec": "468193140.nwb", - "key": "stimulus_path" - }, - { - "parent_key": "WORKDIR", - "type": "file", - "format": "NWB", - "spec": "468193140.nwb", - "key": "output_path" - } - ] -} \ No newline at end of file diff --git a/allensdk/test/model/aa_model/modfiles/CaDynamics.mod b/allensdk/test/model/aa_model/modfiles/CaDynamics.mod deleted file mode 100644 index 12af065986..0000000000 --- a/allensdk/test/model/aa_model/modfiles/CaDynamics.mod +++ /dev/null @@ -1,40 +0,0 @@ -: Dynamics that track inside calcium concentration -: modified from Destexhe et al. 1994 - -NEURON { - SUFFIX CaDynamics - USEION ca READ ica WRITE cai - RANGE decay, gamma, minCai, depth -} - -UNITS { - (mV) = (millivolt) - (mA) = (milliamp) - FARADAY = (faraday) (coulombs) - (molar) = (1/liter) - (mM) = (millimolar) - (um) = (micron) -} - -PARAMETER { - gamma = 0.05 : percent of free calcium (not buffered) - decay = 80 (ms) : rate of removal of calcium - depth = 0.1 (um) : depth of shell - minCai = 1e-4 (mM) -} - -ASSIGNED {ica (mA/cm2)} - -INITIAL { - cai = minCai -} - -STATE { - cai (mM) -} - -BREAKPOINT { SOLVE states METHOD cnexp } - -DERIVATIVE states { - cai' = -(10000)*(ica*gamma/(2*FARADAY*depth)) - (cai - minCai)/decay -} diff --git a/allensdk/test/model/aa_model/modfiles/Ca_HVA.mod b/allensdk/test/model/aa_model/modfiles/Ca_HVA.mod deleted file mode 100644 index 84db2d3c91..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Ca_HVA.mod +++ /dev/null @@ -1,82 +0,0 @@ -: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 - -NEURON { - SUFFIX Ca_HVA - USEION ca READ eca WRITE ica - RANGE gbar, g, ica -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - eca (mV) - ica (mA/cm2) - g (S/cm2) - mInf - mTau - mAlpha - mBeta - hInf - hTau - hAlpha - hBeta -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*h - ica = g*(v-eca) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - UNITSOFF - : if((v == -27) ){ - : v = v+0.0001 - : } - :mAlpha = (0.055*(-27-v))/(exp((-27-v)/3.8) - 1) - mAlpha = 0.055 * vtrap(-27 - v, 3.8) - mBeta = (0.94*exp((-75-v)/17)) - mInf = mAlpha/(mAlpha + mBeta) - mTau = 1/(mAlpha + mBeta) - hAlpha = (0.000457*exp((-13-v)/50)) - hBeta = (0.0065/(exp((-v-15)/28)+1)) - hInf = hAlpha/(hAlpha + hBeta) - hTau = 1/(hAlpha + hBeta) - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/aa_model/modfiles/Ca_LVA.mod b/allensdk/test/model/aa_model/modfiles/Ca_LVA.mod deleted file mode 100644 index ab151d0efc..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Ca_LVA.mod +++ /dev/null @@ -1,69 +0,0 @@ -: Comment: LVA ca channel. Note: mtau is an approximation from the plots -: Reference: Avery and Johnston 1996, tau from Randall 1997 -: Comment: shifted by -10 mv to correct for junction potential -: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 - -NEURON { - SUFFIX Ca_LVA - USEION ca READ eca WRITE ica - RANGE gbar, g, ica -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - eca (mV) - ica (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*h - ica = g*(v-eca) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - v = v + 10 - mInf = 1.0000/(1+ exp((v - -30.000)/-6)) - mTau = (5.0000 + 20.0000/(1+exp((v - -25.000)/5)))/qt - hInf = 1.0000/(1+ exp((v - -80.000)/6.4)) - hTau = (20.0000 + 50.0000/(1+exp((v - -40.000)/7)))/qt - v = v - 10 - UNITSON -} diff --git a/allensdk/test/model/aa_model/modfiles/Ih.mod b/allensdk/test/model/aa_model/modfiles/Ih.mod deleted file mode 100644 index 73b97d8465..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Ih.mod +++ /dev/null @@ -1,71 +0,0 @@ -: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 - -NEURON { - SUFFIX Ih - NONSPECIFIC_CURRENT ihcn - RANGE gbar, g, ihcn -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - ehcn = -45.0 (mV) -} - -ASSIGNED { - v (mV) - ihcn (mA/cm2) - g (S/cm2) - mInf - mTau - mAlpha - mBeta -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m - ihcn = g*(v-ehcn) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates(){ - UNITSOFF - : if(v == -154.9){ - : v = v + 0.0001 - : } - :mAlpha = 0.001*6.43*(v+154.9)/(exp((v+154.9)/11.9)-1) - mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) - mBeta = 0.001*193*exp(v/33.1) - mInf = mAlpha/(mAlpha + mBeta) - mTau = 1/(mAlpha + mBeta) - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} diff --git a/allensdk/test/model/aa_model/modfiles/Im.mod b/allensdk/test/model/aa_model/modfiles/Im.mod deleted file mode 100644 index d6112d57af..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Im.mod +++ /dev/null @@ -1,62 +0,0 @@ -: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones -: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 - -NEURON { - SUFFIX Im - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) - mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) - mInf = mAlpha/(mAlpha + mBeta) - mTau = (1/(mAlpha + mBeta))/qt - UNITSON -} diff --git a/allensdk/test/model/aa_model/modfiles/Im_v2.mod b/allensdk/test/model/aa_model/modfiles/Im_v2.mod deleted file mode 100644 index fc219f7161..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Im_v2.mod +++ /dev/null @@ -1,59 +0,0 @@ -: Based on Im model of Vervaeke et al. (2006) - -NEURON { - SUFFIX Im_v2 - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * m - ik = g * (v - ek) -} - -DERIVATIVE states { - rates() - m' = (mInf - m) / mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-30)/10) - mAlpha = 0.007 * exp( (6 * 0.4 * (v - (-48))) / 26.12 ) - mBeta = 0.007 * exp( (-6 * (1 - 0.4) * (v - (-48))) / 26.12 ) - - mInf = mAlpha / (mAlpha + mBeta) - mTau = (15 + 1 / (mAlpha + mBeta)) / qt -} diff --git a/allensdk/test/model/aa_model/modfiles/K_P.mod b/allensdk/test/model/aa_model/modfiles/K_P.mod deleted file mode 100644 index 0a1238f93b..0000000000 --- a/allensdk/test/model/aa_model/modfiles/K_P.mod +++ /dev/null @@ -1,71 +0,0 @@ -: Comment: The persistent component of the K current -: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 - - -NEURON { - SUFFIX K_P - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - vshift = 0 (mV) - tauF = 1 -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*h - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-21)/10) - UNITSOFF - mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) - if (v < -50 + vshift){ - mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt - } else { - mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt - } - hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) - hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt - UNITSON -} diff --git a/allensdk/test/model/aa_model/modfiles/K_T.mod b/allensdk/test/model/aa_model/modfiles/K_T.mod deleted file mode 100644 index c31beaff1b..0000000000 --- a/allensdk/test/model/aa_model/modfiles/K_T.mod +++ /dev/null @@ -1,68 +0,0 @@ -: Comment: The transient component of the K current -: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 - -NEURON { - SUFFIX K_T - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - vshift = 0 (mV) - mTauF = 1.0 - hTauF = 1.0 -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*m*m*h - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - mInf = 1/(1 + exp(-(v - (-47 + vshift)) / 29)) - mTau = (0.34 + mTauF * 0.92*exp(-((v+71-vshift)/59)^2))/qt - hInf = 1/(1 + exp(-(v+66-vshift)/-10)) - hTau = (8 + hTauF * 49*exp(-((v+73-vshift)/23)^2))/qt - UNITSON -} diff --git a/allensdk/test/model/aa_model/modfiles/Kd.mod b/allensdk/test/model/aa_model/modfiles/Kd.mod deleted file mode 100644 index 82cbe59a38..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Kd.mod +++ /dev/null @@ -1,62 +0,0 @@ -: Based on Kd model of Foust et al. (2011) - - -NEURON { - SUFFIX Kd - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * m * h - ik = g * (v - ek) -} - -DERIVATIVE states { - rates() - m' = (mInf - m) / mTau - h' = (hInf - h) / hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-23)/10) - mInf = 1 - 1 / (1 + exp((v - (-43)) / 8)) - mTau = 1 - hInf = 1 / (1 + exp((v - (-67)) / 7.3)) - hTau = 1500 -} diff --git a/allensdk/test/model/aa_model/modfiles/Kv2like.mod b/allensdk/test/model/aa_model/modfiles/Kv2like.mod deleted file mode 100644 index 6b45acd65d..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Kv2like.mod +++ /dev/null @@ -1,89 +0,0 @@ -: Kv2-like channel -: Adapted from model implemented in Keren et al. 2005 -: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 - - -NEURON { - SUFFIX Kv2like - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mAlpha - mBeta - mTau - hInf - h1Tau - h2Tau -} - -STATE { - m - h1 - h2 -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * m * m * (0.5 * h1 + 0.5 * h2) - ik = g * (v - ek) -} - -DERIVATIVE states { - rates() - m' = (mInf - m) / mTau - h1' = (hInf - h1) / h1Tau - h2' = (hInf - h2) / h2Tau -} - -INITIAL{ - rates() - m = mInf - h1 = hInf - h2 = hInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-21)/10) - UNITSOFF - mAlpha = 0.12 * vtrap( -(v - 43), 11.0) - mBeta = 0.02 * exp(-(v + 1.27) / 120) - mInf = mAlpha / (mAlpha + mBeta) - mTau = 2.5 * (1 / (qt * (mAlpha + mBeta))) - - hInf = 1/(1 + exp((v + 58) / 11)) - h1Tau = (360 + (1010 + 23.7 * (v + 54)) * exp(-((v + 75) / 48)^2)) / qt - h2Tau = (2350 + 1380 * exp(-0.011 * v) - 210 * exp(-0.03 * v)) / qt - if (h2Tau < 0) { - h2Tau = 1e-3 - } - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/aa_model/modfiles/Kv3_1.mod b/allensdk/test/model/aa_model/modfiles/Kv3_1.mod deleted file mode 100644 index e244657775..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Kv3_1.mod +++ /dev/null @@ -1,54 +0,0 @@ -: Comment: Kv3-like potassium current - -NEURON { - SUFFIX Kv3_1 - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - vshift = 0 (mV) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - mInf - mTau -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates(){ - UNITSOFF - mInf = 1/(1+exp(((v -(18.700 + vshift))/(-9.700)))) - mTau = 0.2*20.000/(1+exp(((v -(-46.560 + vshift))/(-44.140)))) - UNITSON -} diff --git a/allensdk/test/model/aa_model/modfiles/NaTa.mod b/allensdk/test/model/aa_model/modfiles/NaTa.mod deleted file mode 100644 index fcf7bd39d6..0000000000 --- a/allensdk/test/model/aa_model/modfiles/NaTa.mod +++ /dev/null @@ -1,95 +0,0 @@ -: Reference: Colbert and Pan 2002 - -NEURON { - SUFFIX NaTa - USEION na READ ena WRITE ina - RANGE gbar, g, ina -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - - malphaF = 0.182 - mbetaF = 0.124 - mvhalf = -48 (mV) - mk = 6 (mV) - - halphaF = 0.015 - hbetaF = 0.015 - hvhalf = -69 (mV) - hk = 6 (mV) -} - -ASSIGNED { - v (mV) - ena (mV) - ina (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta - hInf - hTau - hAlpha - hBeta -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*m*h - ina = g*(v-ena) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-23)/10) - - UNITSOFF - mAlpha = malphaF * vtrap(-(v - mvhalf), mk) - mBeta = mbetaF * vtrap((v - mvhalf), mk) - - mInf = mAlpha/(mAlpha + mBeta) - mTau = (1/(mAlpha + mBeta))/qt - - hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model - hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model - - hInf = hAlpha/(hAlpha + hBeta) - hTau = (1/(hAlpha + hBeta))/qt - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/aa_model/modfiles/NaTs.mod b/allensdk/test/model/aa_model/modfiles/NaTs.mod deleted file mode 100644 index f753e71877..0000000000 --- a/allensdk/test/model/aa_model/modfiles/NaTs.mod +++ /dev/null @@ -1,95 +0,0 @@ -: Reference: Colbert and Pan 2002 - -NEURON { - SUFFIX NaTs - USEION na READ ena WRITE ina - RANGE gbar, g, ina -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - - malphaF = 0.182 - mbetaF = 0.124 - mvhalf = -40 (mV) - mk = 6 (mV) - - halphaF = 0.015 - hbetaF = 0.015 - hvhalf = -66 (mV) - hk = 6 (mV) -} - -ASSIGNED { - v (mV) - ena (mV) - ina (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta - hInf - hTau - hAlpha - hBeta -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*m*h - ina = g*(v-ena) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-23)/10) - - UNITSOFF - mAlpha = malphaF * vtrap(-(v - mvhalf), mk) - mBeta = mbetaF * vtrap((v - mvhalf), mk) - - mInf = mAlpha/(mAlpha + mBeta) - mTau = (1/(mAlpha + mBeta))/qt - - hAlpha = halphaF * vtrap(v - hvhalf, hk) - hBeta = hbetaF * vtrap(-(v - hvhalf), hk) - - hInf = hAlpha/(hAlpha + hBeta) - hTau = (1/(hAlpha + hBeta))/qt - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/aa_model/modfiles/NaV.mod b/allensdk/test/model/aa_model/modfiles/NaV.mod deleted file mode 100644 index a70239563b..0000000000 --- a/allensdk/test/model/aa_model/modfiles/NaV.mod +++ /dev/null @@ -1,186 +0,0 @@ -TITLE Mouse sodium current -: Kinetics of Carter et al. (2012) -: Based on 37 degC recordings from mouse hippocampal CA1 pyramids - -NEURON { - SUFFIX NaV - USEION na READ ena WRITE ina - RANGE g, gbar -} - -UNITS { - (mV) = (millivolt) - (S) = (siemens) -} - -PARAMETER { - gbar = .015 (S/cm2) - - : kinetic parameters - Con = 0.01 (/ms) : closed -> inactivated transitions - Coff = 40 (/ms) : inactivated -> closed transitions - Oon = 8 (/ms) : open -> Ineg transition - Ooff = 0.05 (/ms) : Ineg -> open transition - alpha = 400 (/ms) - beta = 12 (/ms) - gamma = 250 (/ms) : opening - delta = 60 (/ms) : closing - - alfac = 2.51 - btfac = 5.32 - - : Vdep - x1 = 24 (mV) : Vdep of activation (alpha) - x2 = -24 (mV) : Vdep of deactivation (beta) -} - -ASSIGNED { - - : rates - f01 (/ms) - f02 (/ms) - f03 (/ms) - f04 (/ms) - f0O (/ms) - f11 (/ms) - f12 (/ms) - f13 (/ms) - f14 (/ms) - f1n (/ms) - fi1 (/ms) - fi2 (/ms) - fi3 (/ms) - fi4 (/ms) - fi5 (/ms) - fin (/ms) - - b01 (/ms) - b02 (/ms) - b03 (/ms) - b04 (/ms) - b0O (/ms) - b11 (/ms) - b12 (/ms) - b13 (/ms) - b14 (/ms) - b1n (/ms) - bi1 (/ms) - bi2 (/ms) - bi3 (/ms) - bi4 (/ms) - bi5 (/ms) - bin (/ms) - - v (mV) - ena (mV) - ina (milliamp/cm2) - g (S/cm2) - celsius (degC) -} - -STATE { - C1 FROM 0 TO 1 - C2 FROM 0 TO 1 - C3 FROM 0 TO 1 - C4 FROM 0 TO 1 - C5 FROM 0 TO 1 - I1 FROM 0 TO 1 - I2 FROM 0 TO 1 - I3 FROM 0 TO 1 - I4 FROM 0 TO 1 - I5 FROM 0 TO 1 - O FROM 0 TO 1 - I6 FROM 0 TO 1 -} - -BREAKPOINT { - SOLVE activation METHOD sparse - g = gbar * O - ina = g * (v - ena) -} - -INITIAL { - rates(v) - SOLVE seqinitial -} - -KINETIC activation -{ - rates(v) - ~ C1 <-> C2 (f01,b01) - ~ C2 <-> C3 (f02,b02) - ~ C3 <-> C4 (f03,b03) - ~ C4 <-> C5 (f04,b04) - ~ C5 <-> O (f0O,b0O) - ~ O <-> I6 (fin,bin) - ~ I1 <-> I2 (f11,b11) - ~ I2 <-> I3 (f12,b12) - ~ I3 <-> I4 (f13,b13) - ~ I4 <-> I5 (f14,b14) - ~ I5 <-> I6 (f1n,b1n) - ~ C1 <-> I1 (fi1,bi1) - ~ C2 <-> I2 (fi2,bi2) - ~ C3 <-> I3 (fi3,bi3) - ~ C4 <-> I4 (fi4,bi4) - ~ C5 <-> I5 (fi5,bi5) - - CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 -} - -LINEAR seqinitial { : sets initial equilibrium - ~ I1*bi1 + C2*b01 - C1*( fi1+f01) = 0 - ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01+fi2+f02) = 0 - ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02+fi3+f03) = 0 - ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03+fi4+f04) = 0 - ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04+fi5+f0O) = 0 - ~ C5*f0O + I6*bin - O*(b0O+fin) = 0 - - ~ C1*fi1 + I2*b11 - I1*( bi1+f11) = 0 - ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11+bi2+f12) = 0 - ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12+bi3+f13) = 0 - ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13+bi4+f14) = 0 - ~ I4*f14 + C5*fi5 + I6*b1n - I5*(b14+bi5+f1n) = 0 - - ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 -} - -PROCEDURE rates(v(mV) ) -{ - LOCAL qt - qt = 2.3^((celsius-37)/10) - - f01 = qt * 4 * alpha * exp(v/x1) - f02 = qt * 3 * alpha * exp(v/x1) - f03 = qt * 2 * alpha * exp(v/x1) - f04 = qt * 1 * alpha * exp(v/x1) - f0O = qt * gamma - f11 = qt * 4 * alpha * alfac * exp(v/x1) - f12 = qt * 3 * alpha * alfac * exp(v/x1) - f13 = qt * 2 * alpha * alfac * exp(v/x1) - f14 = qt * 1 * alpha * alfac * exp(v/x1) - f1n = qt * gamma - fi1 = qt * Con - fi2 = qt * Con * alfac - fi3 = qt * Con * alfac^2 - fi4 = qt * Con * alfac^3 - fi5 = qt * Con * alfac^4 - fin = qt * Oon - - b01 = qt * 1 * beta * exp(v/x2) - b02 = qt * 2 * beta * exp(v/x2) - b03 = qt * 3 * beta * exp(v/x2) - b04 = qt * 4 * beta * exp(v/x2) - b0O = qt * delta - b11 = qt * 1 * beta * exp(v/x2) / btfac - b12 = qt * 2 * beta * exp(v/x2) / btfac - b13 = qt * 3 * beta * exp(v/x2) / btfac - b14 = qt * 4 * beta * exp(v/x2) / btfac - b1n = qt * delta - bi1 = qt * Coff - bi2 = qt * Coff / (btfac) - bi3 = qt * Coff / (btfac^2) - bi4 = qt * Coff / (btfac^3) - bi5 = qt * Coff / (btfac^4) - bin = qt * Ooff -} - diff --git a/allensdk/test/model/aa_model/modfiles/Nap.mod b/allensdk/test/model/aa_model/modfiles/Nap.mod deleted file mode 100644 index ef8021ec1b..0000000000 --- a/allensdk/test/model/aa_model/modfiles/Nap.mod +++ /dev/null @@ -1,77 +0,0 @@ -:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 -:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 - -NEURON { - SUFFIX Nap - USEION na READ ena WRITE ina - RANGE gbar, g, ina -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ena (mV) - ina (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - hInf - hTau - hAlpha - hBeta -} - -STATE { - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - rates() - g = gbar*mInf*h - ina = g*(v-ena) -} - -DERIVATIVE states { - rates() - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso - - hInf = 1.0/(1+exp((v- -48.8)/10)) - hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) - hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) - - hTau = (1/(hAlpha + hBeta))/qt - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/aa_model/modfiles/SK.mod b/allensdk/test/model/aa_model/modfiles/SK.mod deleted file mode 100644 index 8bfa3b727f..0000000000 --- a/allensdk/test/model/aa_model/modfiles/SK.mod +++ /dev/null @@ -1,56 +0,0 @@ -: SK-type calcium-activated potassium current -: Reference : Kohler et al. 1996 - -NEURON { - SUFFIX SK - USEION k READ ek WRITE ik - USEION ca READ cai - RANGE gbar, g, ik -} - -UNITS { - (mV) = (millivolt) - (mA) = (milliamp) - (mM) = (milli/liter) -} - -PARAMETER { - v (mV) - gbar = .000001 (mho/cm2) - zTau = 1 (ms) - ek (mV) - cai (mM) -} - -ASSIGNED { - zInf - ik (mA/cm2) - g (S/cm2) -} - -STATE { - z FROM 0 TO 1 -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * z - ik = g * (v - ek) -} - -DERIVATIVE states { - rates(cai) - z' = (zInf - z) / zTau -} - -PROCEDURE rates(ca(mM)) { - if(ca < 1e-7){ - ca = ca + 1e-07 - } - zInf = 1/(1 + (0.00043 / ca)^4.8) -} - -INITIAL { - rates(cai) - z = zInf -} diff --git a/allensdk/test/model/aa_model/test_biophysical_all_active.py b/allensdk/test/model/aa_model/test_biophysical_all_active.py deleted file mode 100644 index 708db12c64..0000000000 --- a/allensdk/test/model/aa_model/test_biophysical_all_active.py +++ /dev/null @@ -1,85 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import os -import numpy -from allensdk.model.biophys_sim.config import Config -from allensdk.model.biophysical.utils import Utils, AllActiveUtils -from allensdk.api.queries.biophysical_api import BiophysicalApi -from allensdk.core.dat_utilities import DatUtilities -from allensdk.ephys import ephys_features -import subprocess - -@pytest.mark.requires_neuron -def test_biophysical_aa(): - """ - Test for backward compatibility of the legacy all-active models - """ - - subprocess.check_call(['nrnivmodl', 'modfiles/']) - - description = Config().load('manifest.json') - utils = AllActiveUtils(description) - h = utils.h - - manifest = description.manifest - morphology_path = manifest.get_path('MORPHOLOGY') - utils.generate_morphology(morphology_path.encode('ascii', 'ignore').decode("utf-8")) - utils.load_cell_parameters() - - stim = h.IClamp(h.soma[0](0.5)) - stim.amp = 0.33 # Sweep 46 - stim.delay = 1000.0 - stim.dur = 1000.0 - - h.tstop = 3000.0 - - vec = utils.record_values() - - h.finitialize() - h.run() - - junction_potential = description.data['fitting'][0]['junction_potential'] - ms = 1.0e-3 - - output_data = (numpy.array(vec['v']) - junction_potential) # in mV - output_times = numpy.array(vec['t']) * ms # in s - output_path = 'output_voltage.dat' - - DatUtilities.save_voltage(output_path, output_data, output_times) - - num_spikes = len(ephys_features.detect_putative_spikes(output_data, output_times)) - assert num_spikes == 18 # taken from the web app where the legacy model output is shown diff --git a/allensdk/test/model/check_parser.py b/allensdk/test/model/check_parser.py deleted file mode 100644 index 5843fc6c2d..0000000000 --- a/allensdk/test/model/check_parser.py +++ /dev/null @@ -1,8 +0,0 @@ -from allensdk.model.biophysical.runner import sim_parser - -def get_parsed_args(schema): - print(vars(schema)) - -if __name__ == '__main__': - schema = sim_parser.parse_args() - get_parsed_args(schema) diff --git a/allensdk/test/model/peri_model/468193142_fit.json b/allensdk/test/model/peri_model/468193142_fit.json deleted file mode 100644 index 9d72939efc..0000000000 --- a/allensdk/test/model/peri_model/468193142_fit.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "passive": [ - { - "ra": 32.0772432623, - "cm": [ - { - "section": "soma", - "cm": 1.0 - }, - { - "section": "axon", - "cm": 1.0 - }, - { - "section": "dend", - "cm": 3.7002019468166822 - }, - { - "section": "apic", - "cm": 3.7002019468166822 - } - ], - "e_pas": -84.74527740478516 - } - ], - "fitting": [ - { - "junction_potential": -14.0, - "sweeps": [ - 46 - ] - } - ], - "conditions": [ - { - "celsius": 34.0, - "erev": [ - { - "ena": 53.0, - "section": "soma", - "ek": -107.0 - } - ], - "v_init": -84.74527740478516 - } - ], - "genome": [ - { - "section": "soma", - "name": "gbar_Im", - "value": 0.00011215709095308002, - "mechanism": "Im" - }, - { - "section": "soma", - "name": "gbar_Ih", - "value": 0.00045041730360183556, - "mechanism": "Ih" - }, - { - "section": "soma", - "name": "gbar_NaTs", - "value": 1.1281486914123688, - "mechanism": "NaTs" - }, - { - "section": "soma", - "name": "gbar_Nap", - "value": 0.00095782168667023497, - "mechanism": "Nap" - }, - { - "section": "soma", - "name": "gbar_K_P", - "value": 0.096648124440568361, - "mechanism": "K_P" - }, - { - "section": "soma", - "name": "gbar_K_T", - "value": 2.2406204607139379e-05, - "mechanism": "K_T" - }, - { - "section": "soma", - "name": "gbar_SK", - "value": 0.0068601737830082388, - "mechanism": "SK" - }, - { - "section": "soma", - "name": "gbar_Kv3_1", - "value": 0.33043773066721083, - "mechanism": "Kv3_1" - }, - { - "section": "soma", - "name": "gbar_Ca_HVA", - "value": 0.00026836177945335608, - "mechanism": "Ca_HVA" - }, - { - "section": "soma", - "name": "gbar_Ca_LVA", - "value": 0.0077938181828292709, - "mechanism": "Ca_LVA" - }, - { - "section": "soma", - "name": "gamma_CaDynamics", - "value": 0.00044743022380752001, - "mechanism": "CaDynamics" - }, - { - "section": "soma", - "name": "decay_CaDynamics", - "value": 998.99266101400383, - "mechanism": "CaDynamics" - }, - { - "section": "soma", - "name": "g_pas", - "value": 0.00091710033541291013, - "mechanism": "" - }, - { - "section": "axon", - "name": "g_pas", - "value": 0.00074804303211946897, - "mechanism": "" - }, - { - "section": "dend", - "name": "g_pas", - "value": 0.00016449702719528828, - "mechanism": "" - }, - { - "section": "apic", - "name": "g_pas", - "value": 4.4606771501076728e-05, - "mechanism": "" - } - ] -} \ No newline at end of file diff --git a/allensdk/test/model/peri_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc b/allensdk/test/model/peri_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc deleted file mode 100644 index ab4001dbb5..0000000000 --- a/allensdk/test/model/peri_model/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc +++ /dev/null @@ -1,2595 +0,0 @@ -# generated by Vaa3D Plugin sort_neuron_swc -# source file(s): C:/Users/alexh/Desktop/Check then delete/Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_488448269_p.swc_Z_T10.swc -# id,type,x,y,z,r,pid -1 1 550.439 522.6341 38.7565 5.1205 -1 -2 3 546.4945 522.8435 34.8855 0.1144 1 -3 3 545.4306 522.8984 33.7747 0.1398 2 -4 3 544.3552 522.9499 33.2744 0.1907 3 -5 3 543.2273 523.0071 32.7732 0.2669 4 -6 3 542.105 523.2027 32.3246 0.3178 5 -7 3 541.0068 523.3034 31.8399 0.3178 6 -8 3 539.9863 523.5138 31.2732 0.2669 7 -9 3 538.9052 523.666 30.7922 0.2034 8 -10 3 537.7933 523.5516 30.4881 0.1907 9 -11 3 536.8048 523.3217 30.1924 0.2161 10 -12 3 535.9228 523.2301 29.7063 0.2415 11 -13 3 534.8921 523.4498 29.1575 0.2161 12 -14 3 533.7904 523.4738 28.73 0.1907 13 -15 3 532.9175 522.951 28.4908 0.1907 14 -16 3 532.7802 521.9694 28.2094 0.2415 15 -17 3 533.1452 521.3723 27.652 0.2542 16 -18 3 532.9827 520.2958 27.1077 0.2415 17 -19 3 531.7346 520.1654 26.5369 0.1907 18 -20 3 530.7725 520.0258 26.1911 0.1398 19 -21 3 529.998 519.233 25.843 0.1398 20 -22 3 529.0371 518.6816 25.5543 0.178 21 -23 3 528.067 518.1382 25.3801 0.2415 22 -24 3 527.193 517.422 25.3059 0.2924 23 -25 3 526.3247 516.7105 25.3418 0.3432 24 -26 3 525.4998 515.9291 25.4183 0.3432 25 -27 3 524.8775 515.0139 25.4821 0.3178 26 -28 3 524.5526 513.9271 25.5306 0.2669 27 -29 3 524.1911 512.8518 25.5433 0.2542 28 -30 3 523.5482 511.9286 25.5061 0.2415 29 -31 3 522.7805 511.1014 25.505 0.2415 30 -32 3 521.9351 510.462 25.6241 0.2288 31 -33 3 521.2121 509.6543 25.6083 0.2161 32 -34 3 520.3244 509.5147 25.357 0.1907 33 -35 3 519.4721 508.8363 25.1901 0.1525 34 -36 3 518.391 508.6178 24.9653 0.1398 35 -37 3 517.3809 508.341 24.7245 0.1652 36 -38 3 516.5709 507.5528 24.5916 0.2288 37 -39 3 515.8147 506.7142 24.5832 0.2796 38 -40 3 514.8492 506.1891 24.5692 0.2796 39 -41 3 513.8608 505.6343 24.5185 0.2415 40 -42 3 512.9536 504.9685 24.3906 0.2034 41 -43 3 512.2809 504.1139 24.345 0.1907 42 -44 3 511.2479 503.6666 24.2214 0.1907 43 -45 3 510.2675 503.0912 24.0083 0.178 44 -46 3 509.414 502.3487 23.7194 0.178 45 -47 3 508.5744 501.7733 23.2639 0.178 46 -48 3 507.9783 501.12 22.6445 0.2034 47 -49 3 507.0723 500.4462 22.1254 0.2161 48 -50 3 506.0507 499.9417 21.7989 0.2288 49 -51 3 505.1412 499.2954 21.6514 0.2288 50 -52 3 504.5395 498.3424 21.6626 0.2288 51 -53 3 503.9617 497.4204 21.7608 0.2161 52 -54 3 503.4046 496.5372 21.7688 0.1907 53 -55 3 503.1484 495.4298 21.765 0.1652 54 -56 3 502.7994 494.3487 21.8078 0.1525 55 -57 3 502.3716 493.3077 21.8473 0.1652 56 -58 3 501.7081 492.5446 21.9327 0.1652 57 -59 3 500.7311 492.1259 22.1296 0.178 58 -60 3 499.6168 491.9726 22.3045 0.178 59 -61 3 498.5152 491.9715 22.3302 0.2161 60 -62 3 497.4959 491.6775 22.197 0.2542 61 -63 3 496.5486 491.0746 22.0414 0.2924 62 -64 3 495.9595 490.1765 21.978 0.3051 63 -65 3 495.6391 489.0989 21.9925 0.2924 64 -66 3 495.0866 488.1254 22.0311 0.2924 65 -67 3 494.3052 487.3429 22.0039 0.2669 66 -68 3 493.3077 487.0397 21.8798 0.2415 67 -69 3 492.3559 486.6427 21.8648 0.2034 68 -70 3 491.5413 485.922 21.9735 0.2034 69 -71 3 490.8126 485.0732 22.1353 0.2288 70 -72 3 490.1159 484.2335 22.2187 0.2288 71 -73 3 489.4055 483.594 22.0897 0.2161 72 -74 3 488.6402 482.7794 22.0038 0.1907 73 -75 3 488.0029 481.8917 22.0453 0.2161 74 -76 3 487.4229 480.9616 22.1693 0.2288 75 -77 3 486.9825 479.9252 22.3233 0.2415 76 -78 3 486.5649 478.9219 22.3934 0.2288 77 -79 3 486.1531 477.9598 22.2626 0.2542 78 -80 3 485.644 476.9668 22.0479 0.2669 79 -81 3 484.9942 476.0253 21.831 0.2542 80 -82 3 484.3845 475.0574 21.6328 0.1907 81 -83 3 483.7827 474.0862 21.4692 0.1398 82 -84 3 483.0174 473.2602 21.3367 0.1271 83 -85 3 482.0873 472.607 21.2002 0.1398 84 -86 3 481.0863 472.1254 21.0176 0.1525 85 -87 3 479.9812 472.0945 20.8404 0.1398 86 -88 3 479.0134 472.575 20.7658 0.1271 87 -89 3 478.0524 473.0509 20.692 0.1271 88 -90 3 476.945 473.1023 20.5434 0.1398 89 -91 3 475.8113 473.1367 20.3846 0.1525 90 -92 3 474.7211 473.4547 20.228 0.1398 91 -93 3 473.6606 473.8791 20.0431 0.1271 92 -94 3 472.6173 474.2921 19.7791 0.1144 93 -95 3 471.5408 474.5552 19.4559 0.1144 94 -96 3 470.43 474.5072 19.1214 0.1398 95 -97 3 469.3203 474.2818 18.802 0.1652 96 -98 3 468.293 473.8116 18.5503 0.1907 97 -99 3 467.3091 473.2282 18.382 0.1652 98 -100 3 466.3733 472.5727 18.2868 0.1398 99 -101 3 465.4558 471.8886 18.2468 0.1144 100 -102 3 464.5258 471.2239 18.2493 0.1144 101 -103 3 463.598 470.5547 18.2661 0.1144 102 -104 3 462.6794 469.8751 18.2748 0.1271 103 -105 3 461.7333 469.2333 18.2842 0.1398 104 -106 3 460.7849 468.595 18.314 0.1525 105 -107 3 459.9246 467.8651 18.4019 0.1398 106 -108 3 459.0506 467.1421 18.523 0.1271 107 -109 3 458.1034 466.506 18.6267 0.1144 108 -110 3 457.1058 465.9535 18.6767 0.1144 109 -111 3 456.0831 465.4627 18.6557 0.1144 110 -112 3 455.1061 464.8781 18.6145 0.1144 111 -113 3 454.1863 464.2032 18.5967 0.1144 112 -114 3 453.2654 463.5351 18.6251 0.1271 113 -115 3 452.3365 462.883 18.7032 0.1525 114 -116 3 451.5734 462.0685 18.7291 0.178 115 -117 3 450.8596 461.1956 18.6917 0.178 116 -118 3 450.0485 460.3994 18.665 0.1525 117 -119 3 449.2294 459.6009 18.6749 0.1271 118 -120 3 448.5864 458.6639 18.7251 0.1144 119 -121 3 447.9378 457.7258 18.8422 0.1144 120 -122 3 447.0443 457.3277 19.1598 0.1271 121 -123 3 445.9976 457.0555 19.5718 0.1525 122 -124 3 445.2116 456.2638 19.9076 0.1907 123 -125 3 444.4188 455.439 20.1542 0.2034 124 -126 3 443.3206 455.1576 20.3189 0.1907 125 -127 3 442.5003 454.3728 20.4095 0.1525 126 -128 3 441.7911 453.4759 20.4381 0.1271 127 -129 3 441.6984 452.3376 20.4401 0.1144 128 -130 3 441.6984 451.1936 20.44 0.1144 129 -131 3 532.6739 519.2788 24.444 0.3432 18 -132 3 532.3272 518.5592 23.3628 0.3178 131 -133 3 531.8364 517.7332 23.0309 0.2796 132 -134 3 531.3697 516.7151 22.7869 0.2796 133 -135 3 530.8743 515.7667 22.4581 0.2924 134 -136 3 530.8721 514.6261 21.9058 0.2924 135 -137 2 548.9804 526.7983 37.3792 0.1144 1 -138 2 548.6132 527.8702 37.231 0.1271 137 -139 2 548.6555 528.9559 37.1815 0.1398 138 -140 2 549.2275 529.9397 37.1465 0.1652 139 -141 2 549.5524 531.0299 37.1204 0.178 140 -142 2 549.6268 532.1671 37.1017 0.2034 141 -143 2 549.4243 533.2699 37.112 0.2161 142 -144 2 548.8912 534.2606 37.1823 0.2415 143 -145 2 548.1991 535.0625 37.1927 0.2415 144 -146 2 547.4738 535.7649 37.0028 0.2415 145 -147 2 546.7096 536.496 36.836 0.2161 146 -148 2 545.8699 537.2213 36.7564 0.2034 147 -149 2 545.2304 538.157 36.6797 0.178 148 -150 2 544.7934 539.2072 36.5784 0.1652 149 -151 2 544.536 540.3043 36.4294 0.1652 150 -152 2 544.1367 541.3397 36.2236 0.1907 151 -153 2 543.6254 542.2571 35.8904 0.2288 152 -154 2 543.0305 543.0545 35.7199 0.2542 153 -155 2 542.8005 544.1562 35.6468 0.2542 154 -156 2 542.7708 545.2922 35.5634 0.2542 155 -157 2 542.7708 546.4316 35.3864 0.2796 156 -158 3 552.107 517.9449 38.7565 0.1271 1 -159 3 552.4731 516.8615 38.7229 0.1398 158 -160 3 552.8208 515.7713 38.7078 0.1525 159 -161 3 553.1686 514.6822 38.6873 0.1525 160 -162 3 553.6571 513.6549 38.6635 0.1525 161 -163 3 554.2291 512.6642 38.6327 0.1652 162 -164 3 554.9201 511.757 38.5944 0.1652 163 -165 3 555.5321 510.8841 38.4208 0.178 164 -166 3 556.3249 510.1668 38.3872 0.1652 165 -167 3 557.1108 509.3626 38.4205 0.1652 166 -168 3 557.7366 508.8672 38.2337 0.2542 167 -169 3 558.7616 508.4634 38.1276 0.2415 168 -170 3 559.7558 507.9131 38.0173 0.2415 169 -171 3 560.7911 507.4487 37.9016 0.2161 170 -172 3 561.8619 507.1535 37.7415 0.1907 171 -173 3 562.8617 507.1924 37.7311 0.178 172 -174 3 563.833 507.1501 37.9708 0.178 173 -175 3 564.9392 507.1192 38.2256 0.2034 174 -176 3 565.9746 507.3034 38.2519 0.2034 175 -177 3 567.0888 507.3011 38.3239 0.2034 176 -178 3 568.1687 507.0688 38.2175 0.1907 177 -179 3 569.2029 506.617 38.0598 0.1907 178 -180 3 570.1216 505.9637 37.8969 0.1907 179 -181 3 571.0997 505.4375 37.6477 0.1907 180 -182 3 572.1018 505.195 37.214 0.2034 181 -183 3 573.0616 504.8541 36.6831 0.2161 182 -184 3 573.9025 504.234 36.136 0.2161 183 -185 3 574.7513 503.9274 35.4497 0.1907 184 -186 3 575.1128 504.1608 34.956 0.1525 185 -187 3 576.1436 504.6173 34.6685 0.178 186 -188 3 577.2601 504.7763 34.5554 0.2161 187 -189 3 578.3641 504.6001 34.5033 0.2669 188 -190 3 579.412 504.1928 34.426 0.2796 189 -191 3 580.3798 503.797 34.491 0.2669 190 -192 3 581.4506 503.606 34.5783 0.2415 191 -193 3 582.55 503.821 34.5842 0.2161 192 -194 3 583.6036 504.1516 34.4484 0.2034 193 -195 3 584.6389 504.5841 34.258 0.2034 194 -196 3 585.6662 505.0886 34.0684 0.2288 195 -197 3 586.6192 505.7144 33.8702 0.2669 196 -198 3 587.6373 506.1308 33.6064 0.2796 197 -199 3 588.6749 505.8631 33.311 0.2669 198 -200 3 589.732 505.4352 33.0571 0.2288 199 -201 3 590.7479 504.9147 32.8434 0.2034 200 -202 3 591.742 504.4056 32.5828 0.2034 201 -203 3 592.854 504.3335 32.3394 0.2288 202 -204 3 593.0324 505.1767 32.368 0.178 203 -205 3 593.1629 506.2063 31.2774 0.1525 204 -206 3 593.0439 507.2382 30.7639 0.1398 205 -207 3 593.2018 508.3067 30.2341 0.1398 206 -208 3 593.7989 509.2161 29.8446 0.1652 207 -209 3 594.7256 509.7653 29.4913 0.1652 208 -210 3 595.8101 509.7161 29.0931 0.178 209 -211 3 596.8912 509.5445 28.6168 0.1652 210 -212 3 597.9882 509.6978 28.1215 0.1652 211 -213 3 599.0201 510.1702 27.626 0.1398 212 -214 3 599.3736 510.9482 26.9294 0.1271 213 -215 3 599.7203 511.7158 26.0427 0.1271 214 -216 3 600.7373 512.0441 25.2477 0.1398 215 -217 3 601.7017 511.5762 24.5451 0.1525 216 -218 3 602.3526 511.1792 23.6453 0.1398 217 -219 3 602.3995 511.8691 22.6032 0.1271 218 -220 3 601.704 511.9331 21.554 0.1271 219 -221 3 601.1468 511.042 20.6665 0.1398 220 -222 3 600.8551 510.1279 19.7738 0.1525 221 -223 3 601.6044 509.4701 18.1933 0.1525 222 -224 3 593.5141 503.7661 32.1107 0.2415 203 -225 3 594.5311 503.2868 31.9127 0.2415 224 -226 3 595.6556 503.225 31.7456 0.2415 225 -227 3 596.779 503.4275 31.6022 0.2415 226 -228 3 597.9093 503.5236 31.4462 0.2288 227 -229 3 599.0384 503.5488 31.2421 0.2288 228 -230 3 600.1676 503.638 31.0064 0.2034 229 -231 3 601.299 503.7856 30.788 0.178 230 -232 3 602.2748 503.2982 30.5978 0.1525 231 -233 3 602.8754 502.3418 30.4312 0.178 232 -234 3 603.7037 501.5822 30.2347 0.1907 233 -235 3 604.6692 501.0125 29.9855 0.2161 234 -236 3 605.5833 500.3341 29.734 0.1907 235 -237 3 606.5316 499.6958 29.5114 0.178 236 -238 3 607.647 499.4807 29.3129 0.1525 237 -239 3 608.7464 499.7267 29.0738 0.1652 238 -240 3 609.8458 499.8582 28.7756 0.178 239 -241 3 610.3412 499.92 28.5421 0.1271 240 -242 3 611.4588 500.1168 28.3248 0.1525 241 -243 3 612.5022 500.0367 28.0708 0.1907 242 -244 3 613.5192 499.6042 27.8741 0.2034 243 -245 3 614.5854 499.6363 27.8046 0.1907 244 -246 3 615.6951 499.7999 27.7604 0.1525 245 -247 3 616.7407 499.4876 27.6347 0.1525 246 -248 3 617.712 498.9384 27.403 0.1652 247 -249 3 618.7816 498.6021 27.134 0.2161 248 -250 3 619.8753 498.593 26.7795 0.2161 249 -251 3 620.9438 498.9007 26.3927 0.2415 250 -252 3 622.0191 499.2896 26.0399 0.2161 251 -253 3 623.1071 499.6443 25.719 0.2415 252 -254 3 624.2259 499.8262 25.393 0.2288 253 -255 3 625.2646 499.5745 24.9766 0.2542 254 -256 3 625.5735 498.6433 24.5461 0.2542 255 -257 3 625.8058 498.045 23.8746 0.2796 256 -258 3 626.7301 498.3973 23.1497 0.2796 257 -259 3 627.8032 498.7897 22.6195 0.2669 258 -260 3 628.4793 498.9201 22.4274 0.2034 259 -261 3 629.4952 498.53 21.603 0.1907 260 -262 3 629.9242 497.5954 21.1885 0.2034 261 -263 3 630.0877 496.5898 20.6347 0.2034 262 -264 3 630.7764 495.8348 20.1053 0.2415 263 -265 3 631.8404 495.4984 19.7111 0.2415 264 -266 3 632.8082 494.9436 19.3447 0.2288 265 -267 3 633.8263 494.5066 18.9905 0.2034 266 -268 3 634.888 494.1222 18.7224 0.1907 267 -269 3 635.9805 493.7801 18.5569 0.2034 268 -270 3 637.0536 493.4129 18.4902 0.2288 269 -271 3 638.1072 493.0171 18.5193 0.2542 270 -272 3 639.1734 492.6716 18.5318 0.2542 271 -273 3 640.2819 492.5343 18.5067 0.2288 272 -274 3 641.3985 492.6728 18.5063 0.2034 273 -275 3 642.2965 493.2779 18.4593 0.2034 274 -276 3 643.0744 493.6898 18.1726 0.2161 275 -277 3 643.627 492.9073 17.7735 0.2288 276 -278 3 644.4198 492.1099 17.4194 0.2288 277 -279 3 645.1851 491.2965 17.2443 0.2161 278 -280 3 645.7125 490.3607 17.2652 0.1907 279 -281 3 646.5076 489.5771 17.2319 0.1525 280 -282 3 647.3885 488.8712 17.0562 0.1271 281 -283 3 628.1635 498.8801 22.3104 0.2288 259 -284 3 629.1039 499.396 22.1775 0.2669 283 -285 3 629.6919 500.309 22.0513 0.2669 284 -286 3 630.0557 501.3614 22.0288 0.2415 285 -287 3 630.6117 502.3258 22.0231 0.1907 286 -288 3 631.3633 503.1724 21.9534 0.1907 287 -289 3 632.2716 503.8416 21.8464 0.2034 288 -290 3 633.1743 504.5097 21.8147 0.2161 289 -291 3 634.0208 505.251 21.8795 0.2034 290 -292 3 634.8148 506.0621 21.9253 0.1907 291 -293 3 635.6098 506.8812 21.9604 0.2034 292 -294 3 636.4209 507.6752 22.0233 0.2034 293 -295 3 636.8408 508.675 22.0006 0.2288 294 -296 3 637.5295 509.5136 21.8594 0.2288 295 -297 3 638.5293 510.0455 21.7031 0.2542 296 -298 3 639.6276 510.351 21.5681 0.2415 297 -299 3 640.7201 510.6404 21.4007 0.2542 298 -300 3 641.6273 511.2708 21.1864 0.2288 299 -301 3 642.674 511.7078 21.0354 0.2034 300 -302 3 643.7414 512.0567 21.0248 0.1525 301 -303 3 644.8602 512.091 21.1093 0.1271 302 -304 3 645.9974 511.988 21.1938 0.1144 303 -305 3 647.1402 511.9686 21.2602 0.1271 304 -306 3 648.2762 512.099 21.2866 0.1525 305 -307 3 649.4122 512.2397 21.2581 0.178 306 -308 3 650.4841 512.631 21.179 0.178 307 -309 3 651.484 513.0657 20.9507 0.1525 308 -310 3 652.604 512.9593 20.6832 0.1398 309 -311 3 653.5249 512.3633 20.3519 0.1398 310 -312 3 654.6323 512.1368 20.1638 0.1525 311 -313 3 655.7385 511.9091 20.0922 0.1525 312 -314 3 656.8184 511.6082 19.9716 0.1525 313 -315 3 657.9007 511.3119 19.8295 0.178 314 -316 3 659.0412 511.3016 19.762 0.1907 315 -317 3 660.183 511.3016 19.7497 0.2034 316 -318 3 661.3224 511.2319 19.7705 0.1652 317 -319 3 662.4389 511.0271 19.8383 0.1525 318 -320 3 663.5623 510.8452 19.9329 0.1525 319 -321 3 664.704 510.8154 19.9741 0.1907 320 -322 3 665.8469 510.8303 19.9437 0.2161 321 -323 3 666.9486 511.0694 19.8096 0.2288 322 -324 3 668.0491 511.3062 19.605 0.2161 323 -325 3 669.1679 511.4515 19.3649 0.1907 324 -326 3 670.2868 511.5934 19.1224 0.1525 325 -327 3 671.385 511.8576 19.0283 0.1271 326 -328 3 672.4775 512.131 19.0638 0.1144 327 -329 3 673.4064 512.7946 19.1335 0.1144 328 -330 3 674.2999 513.5084 19.209 0.1398 329 -331 3 674.8593 514.506 19.3304 0.1652 330 -332 3 610.0197 500.0115 28.8702 0.1652 240 -333 3 610.6947 500.6064 30.8081 0.1652 332 -334 3 611.3708 501.2013 31.6733 0.1652 333 -335 3 612.2528 501.6726 32.6222 0.1525 334 -336 3 613.2984 502.089 33.465 0.1525 335 -337 3 613.9722 502.9939 34.1729 0.1652 336 -338 3 614.4676 503.7455 34.8698 0.178 337 -339 3 615.5555 503.638 35.3816 0.1907 338 -340 3 616.5451 504.0121 35.716 0.178 339 -341 3 617.2509 504.8495 36.0332 0.1652 340 -342 3 617.8572 505.815 36.2869 0.178 341 -343 3 618.5597 506.7142 36.4826 0.2288 342 -344 3 619.3685 507.4967 36.6615 0.2796 343 -345 3 620.2162 508.2403 36.8399 0.2796 344 -346 3 620.9701 509.0937 36.9513 0.2415 345 -347 3 621.629 510.0169 36.9606 0.2161 346 -348 3 622.2262 510.979 36.9026 0.2288 347 -349 3 622.7753 511.9778 36.8376 0.2415 348 -350 3 623.2901 512.9982 36.8082 0.2415 349 -351 3 623.8186 514.0061 36.8497 0.2288 350 -352 3 624.3574 515.0048 36.9743 0.2415 351 -353 3 624.8986 516.0069 37.1468 0.2288 352 -354 3 625.4946 516.9782 37.3276 0.2288 353 -355 3 626.2325 517.8453 37.4867 0.2288 354 -356 3 627.0081 518.6816 37.6244 0.2669 355 -357 3 627.6579 519.6105 37.7717 0.2669 356 -358 3 628.2722 520.568 37.9092 0.2415 357 -359 3 628.9598 521.4707 37.9778 0.2034 358 -360 3 629.7743 522.2337 38.0461 0.1907 359 -361 3 630.6861 522.8892 38.1867 0.178 360 -362 3 631.5704 523.5939 38.3236 0.1525 361 -363 3 632.457 524.3112 38.4096 0.1525 362 -364 3 633.4442 524.8661 38.4689 0.1907 363 -365 3 634.4738 525.358 38.5398 0.2415 364 -366 3 635.4314 525.9654 38.6666 0.2542 365 -367 3 636.4164 526.4997 38.8699 0.2415 366 -368 3 637.4917 526.8074 39.1465 0.2542 367 -369 3 638.5957 527.0133 39.4724 0.2796 368 -370 3 639.7042 527.1907 39.8132 0.2924 369 -371 3 640.8242 527.3611 40.1181 0.2542 370 -372 3 641.9464 527.5396 40.3088 0.2034 371 -373 3 643.0687 527.7192 40.3752 0.1652 372 -374 3 644.199 527.8679 40.3768 0.1525 373 -375 3 645.335 527.996 40.3598 0.178 374 -376 3 646.4286 528.2981 40.3567 0.1907 375 -377 3 647.472 528.7648 40.4023 0.2034 376 -378 3 648.5313 529.1778 40.5367 0.1652 377 -379 3 649.6181 529.5118 40.7641 0.1398 378 -380 3 650.7369 529.7109 41.0567 0.1271 379 -381 3 651.8718 529.8367 41.4025 0.1525 380 -382 3 652.986 530.0346 41.8303 0.178 381 -383 3 654.0786 530.3001 42.3567 0.178 382 -384 3 655.1642 530.4694 42.992 0.1652 383 -385 3 656.1298 530.7325 43.7833 0.1652 384 -386 3 657.101 530.9464 44.6936 0.178 385 -387 3 658.1215 530.9796 45.6599 0.1907 386 -388 3 658.9394 530.4328 46.6262 0.178 387 -389 3 659.0859 529.3643 47.4337 0.1652 388 -390 3 658.8662 528.2489 48.0777 0.1525 389 -391 3 658.9692 527.1884 48.6766 0.1525 390 -392 3 659.7391 526.8795 49.3444 0.1652 391 -393 3 660.7366 526.8314 49.994 0.1652 392 -394 3 661.8143 526.4882 50.3972 0.178 393 -395 3 662.4973 525.9494 50.0312 0.1907 394 -396 3 575.6093 503.9297 34.72 0.1398 185 -397 3 576.3426 503.2548 34.5229 0.1271 396 -398 3 577.2224 502.5752 34.4585 0.1144 397 -399 3 577.4054 501.7092 34.2832 0.1398 398 -400 3 577.6365 500.5938 34.1449 0.178 399 -401 3 577.6845 499.4738 33.9948 0.2161 400 -402 3 577.2796 498.4214 33.8512 0.2034 401 -403 3 576.7899 497.4306 33.7053 0.1652 402 -404 3 576.4936 496.3999 33.3889 0.1398 403 -405 3 576.0864 495.463 32.8835 0.1525 404 -406 3 575.7157 494.4391 32.3649 0.178 405 -407 3 575.7203 493.3706 31.8797 0.178 406 -408 3 576.0315 492.317 31.3233 0.1652 407 -409 3 576.7076 491.5665 30.6718 0.1525 408 -410 3 576.6721 490.5014 30.0572 0.1525 409 -411 3 575.7157 489.9249 29.5557 0.1398 410 -412 3 574.5866 489.7922 29.1015 0.1271 411 -413 3 573.5158 489.6034 28.5908 0.1144 412 -414 3 573.1818 488.5338 28.1646 0.1271 413 -415 3 572.739 487.5522 27.6693 0.1398 414 -416 3 572.3135 486.5684 27.1038 0.1525 415 -417 3 571.8124 485.5674 26.6724 0.1398 416 -418 3 570.9429 484.8398 26.2966 0.1398 417 -419 3 569.9648 484.5984 25.8593 0.1398 418 -420 3 568.9524 484.9542 25.3269 0.1652 419 -421 3 568.2683 484.587 24.6823 0.1652 420 -422 3 567.9731 483.5333 24.0018 0.1652 421 -423 3 567.7455 482.4545 23.3127 0.1398 422 -424 3 567.7237 481.3288 22.671 0.1271 423 -425 3 567.7237 480.2157 22.0704 0.1144 424 -426 3 567.5979 479.1644 21.4256 0.1271 425 -427 3 566.7525 478.9619 20.8048 0.1398 426 -428 3 565.6222 479.098 20.2697 0.1525 427 -429 3 564.612 478.7114 19.8039 0.1398 428 -430 3 563.7895 478.3865 19.2093 0.1271 429 -431 3 563.0917 478.24 18.4252 0.1398 430 -432 3 562.3572 477.5617 17.8013 0.1652 431 -433 3 561.6182 476.754 17.4778 0.1907 432 -434 3 560.5863 476.3273 17.2886 0.178 433 -435 3 559.559 475.8399 17.1859 0.178 434 -436 3 558.5855 475.3789 17.0994 0.2034 435 -437 3 557.4632 475.3503 17.127 0.2288 436 -438 3 556.8168 476.2094 17.3242 0.2288 437 -439 3 556.5903 477.1853 17.7273 0.178 438 -440 3 556.2734 478.2492 18.1906 0.1525 439 -441 3 555.8204 479.2594 19.3304 0.1398 440 -442 3 557.5639 508.317 38.8091 0.178 167 -443 3 557.7526 507.1958 39.6158 0.1652 442 -444 3 557.986 506.1285 39.9734 0.2034 443 -445 3 557.9071 505.1973 40.5216 0.2288 444 -446 3 557.3682 504.321 41.1368 0.2415 445 -447 3 557.0811 503.2502 41.6046 0.2161 446 -448 3 557.4998 502.7422 42.1067 0.2034 447 -449 3 558.0707 501.9678 42.5121 0.1907 448 -450 3 557.954 500.8649 42.8672 0.178 449 -451 3 557.6451 499.8033 43.209 0.1652 450 -452 3 557.4804 498.8012 43.4087 0.1525 451 -453 3 557.0411 497.7807 43.4498 0.178 452 -454 3 556.9598 496.6607 43.4949 0.2034 453 -455 3 556.9587 495.5476 43.5887 0.2161 454 -456 3 557.1612 494.4894 43.745 0.2288 455 -457 3 556.9804 493.0754 43.6892 0.1652 456 -458 3 556.8397 491.9669 43.507 0.178 457 -459 3 556.6761 490.8618 43.2247 0.178 458 -460 3 556.4874 489.7613 42.8593 0.1907 459 -461 3 556.3512 488.6424 42.4732 0.1907 460 -462 3 556.2963 487.5042 42.1341 0.178 461 -463 3 556.2814 486.3613 41.9 0.178 462 -464 3 556.278 485.2184 41.7631 0.178 463 -465 3 556.2139 484.0893 41.641 0.1907 464 -466 3 555.9794 482.9945 41.4739 0.178 465 -467 3 555.833 481.8814 41.3314 0.1525 466 -468 3 555.9131 480.7877 41.3039 0.1271 467 -469 3 555.9726 479.6918 41.249 0.1271 468 -470 3 555.9726 478.5764 41.0827 0.1398 469 -471 3 555.889 477.4713 40.8475 0.1525 470 -472 3 555.5035 476.4108 40.5882 0.1398 471 -473 3 555.1146 475.3549 40.3334 0.1398 472 -474 3 554.9956 474.2189 40.1296 0.1398 473 -475 3 554.9475 473.076 39.9994 0.1652 474 -476 3 554.9933 471.9423 39.9529 0.1652 475 -477 3 555.2084 470.8349 39.9963 0.1652 476 -478 3 555.3628 469.7207 40.0498 0.1398 477 -479 3 555.3628 468.5904 40.0011 0.1398 478 -480 3 555.3742 467.4601 39.8656 0.1398 479 -481 3 555.4234 466.3344 39.6595 0.1652 480 -482 3 555.5024 465.2065 39.4162 0.178 481 -483 3 555.6511 464.0808 39.2196 0.2034 482 -484 3 555.8788 462.9791 39.1373 0.2161 483 -485 3 556.1224 461.8728 39.0908 0.2288 484 -486 3 556.2723 460.762 38.967 0.2161 485 -487 3 556.1979 459.6432 38.7778 0.2034 486 -488 3 555.8387 458.5873 38.5885 0.1907 487 -489 3 555.2152 457.6389 38.3729 0.1907 488 -490 3 554.7062 456.639 38.0878 0.178 489 -491 3 554.2749 455.6003 37.7902 0.1525 490 -492 3 553.9031 454.5181 37.5483 0.1525 491 -493 3 553.7177 453.4152 37.3425 0.1652 492 -494 3 553.8584 452.2793 37.1529 0.2034 493 -495 3 553.9134 451.1593 36.9326 0.1907 494 -496 3 553.6159 450.1091 36.64 0.178 495 -497 3 553.14 449.0875 36.3163 0.1525 496 -498 3 552.9432 447.987 35.9682 0.1525 497 -499 3 552.9021 446.8658 35.6006 0.1525 498 -500 3 552.8357 445.7459 35.2374 0.1398 499 -501 3 552.5989 444.6545 34.9194 0.1271 500 -502 3 552.0841 443.6421 34.6853 0.1271 501 -503 3 551.5087 442.6697 34.5778 0.1525 502 -504 3 551.0328 441.6572 34.6024 0.1907 503 -505 3 551.011 440.583 34.6648 0.2034 504 -506 3 551.4137 439.5237 34.6688 0.1907 505 -507 3 551.6665 438.4414 34.585 0.1525 506 -508 3 551.6997 437.3054 34.4501 0.1271 507 -509 3 551.6951 436.1626 34.2913 0.1144 508 -510 3 551.6208 435.0232 34.1312 0.1144 509 -511 3 551.5007 433.886 33.9886 0.1144 510 -512 3 551.3748 432.7489 33.8604 0.1271 511 -513 3 551.2627 431.6095 33.7336 0.1525 512 -514 3 551.1151 430.4769 33.5818 0.178 513 -515 3 550.645 429.4988 33.3393 0.178 514 -516 3 550.0066 428.6007 32.9963 0.1525 515 -517 3 549.4563 427.6261 32.62 0.1271 516 -518 3 549.0617 426.5633 32.2622 0.1144 517 -519 3 548.9381 425.4376 31.9659 0.1271 518 -520 3 548.8168 424.3016 31.7402 0.1652 519 -521 3 548.4187 423.264 31.5204 0.2288 520 -522 3 547.722 422.3968 31.2892 0.2669 521 -523 3 546.9155 421.5937 31.1058 0.2669 522 -524 3 546.3515 420.6396 31.0344 0.2288 523 -525 3 546.1994 419.5414 31.0436 0.2161 524 -526 3 546.0873 418.4134 31.0072 0.2034 525 -527 3 545.7727 417.4113 30.7992 0.2161 526 -528 3 545.5072 416.3325 30.6012 0.2161 527 -529 3 545.2682 415.2228 30.4349 0.2288 528 -530 3 544.8986 414.1577 30.1941 0.2161 529 -531 3 544.4536 413.1213 29.8609 0.2034 530 -532 3 543.9651 412.1066 29.465 0.2034 531 -533 3 543.1071 411.538 28.9722 0.2161 532 -534 3 542.0512 411.4202 28.3657 0.2161 533 -535 3 541.0731 410.9156 27.7629 0.1907 534 -536 3 540.1442 410.259 27.2133 0.1525 535 -537 3 539.6054 409.298 26.6565 0.1271 536 -538 3 538.6776 408.7352 26.106 0.1144 537 -539 3 537.5439 408.6963 25.6006 0.1144 538 -540 3 536.4113 408.6597 25.1358 0.1144 539 -541 3 535.344 408.654 24.611 0.1144 540 -542 3 534.296 408.654 23.31 0.1271 541 -543 3 557.4094 494.2595 45.4454 0.178 456 -544 3 558.1565 493.5491 46.8247 0.178 543 -545 3 558.9058 492.8295 47.4376 0.2034 544 -546 3 559.6379 492.0333 48.1138 0.2542 545 -547 3 560.2889 491.1078 48.7172 0.2796 546 -548 3 560.9776 490.1983 49.2492 0.2542 547 -549 3 561.7932 489.4375 49.7694 0.2161 548 -550 3 562.5792 488.6825 50.3012 0.178 549 -551 3 563.2095 487.773 50.8194 0.1652 550 -552 3 563.5538 486.7377 51.3467 0.1398 551 -553 3 563.603 485.6131 51.8176 0.1271 552 -554 3 563.531 484.4737 52.1987 0.1271 553 -555 3 563.3411 483.3549 52.5176 0.1525 554 -556 3 563.0894 482.2452 52.7794 0.178 555 -557 3 562.7874 481.1527 52.9178 0.178 556 -558 3 562.9784 480.0796 53.0947 0.1652 557 -559 3 562.8674 478.947 53.2409 0.1525 558 -560 3 562.7336 477.8122 53.3613 0.1652 559 -561 3 562.8686 476.6876 53.4584 0.1652 560 -562 3 563.1248 475.5734 53.5433 0.178 561 -563 3 563.4108 474.466 53.6278 0.178 562 -564 3 563.7186 473.3643 53.7062 0.1907 563 -565 3 563.9657 472.2489 53.814 0.178 564 -566 3 564.0572 471.1255 53.9907 0.1652 565 -567 3 564.1007 469.9987 54.2371 0.1652 566 -568 3 564.4141 468.9245 54.4477 0.178 567 -569 3 564.8294 467.8697 54.6084 0.1907 568 -570 3 565.3637 466.8767 54.831 0.2034 569 -571 3 565.9974 465.9546 55.1583 0.2161 570 -572 3 566.7468 465.1641 55.6074 0.2161 571 -573 3 567.3725 464.2558 56.131 0.178 572 -574 3 567.845 463.2319 56.6846 0.1398 573 -575 3 568.2008 462.1646 57.2625 0.1144 574 -576 3 568.4902 461.0812 57.8544 0.1144 575 -577 3 568.5749 459.9727 58.4623 0.1144 576 -578 3 568.5142 458.8607 59.0862 0.1271 577 -579 3 568.6446 457.7487 59.7055 0.1398 578 -580 3 568.7602 456.8095 60.4629 0.1525 579 -581 3 568.2866 455.844 61.2128 0.1398 580 -582 3 568.2294 454.7526 61.9382 0.1271 581 -583 3 568.9901 454.0822 62.5439 0.1144 582 -584 3 567.9525 453.8442 63.1308 0.1144 583 -585 3 567.3576 453.0046 63.6619 0.1144 584 -586 3 567.2844 451.8846 64.1348 0.1144 585 -587 3 567.472 450.7932 64.6274 0.1271 586 -588 3 567.8324 449.7121 65.1006 0.1398 587 -589 3 568.0669 448.6024 65.5628 0.1525 588 -590 3 568.0887 447.5454 66.1371 0.1398 589 -591 3 568.1802 446.4906 66.8248 0.1271 590 -592 3 568.155 445.4164 67.5797 0.1144 591 -593 3 567.8519 444.3651 68.348 0.1144 592 -594 3 567.5144 443.3172 69.1118 0.1144 593 -595 3 567.1769 442.2693 69.8527 0.1144 594 -596 3 566.8394 441.2214 70.5538 0.1144 595 -597 3 566.4974 440.1712 71.2166 0.1144 596 -598 3 566.0809 439.1095 71.7816 0.1144 597 -599 3 565.6554 438.0479 72.2579 0.1144 598 -600 3 565.6314 436.9336 72.7359 0.1144 599 -601 3 566.1702 436.0219 73.2906 0.1144 600 -602 3 566.7101 435.109 73.8912 0.1271 601 -603 3 567.249 434.1972 75.3234 0.1398 602 -604 3 556.8363 500.8203 44.7846 0.2161 451 -605 3 556.0481 501.6371 45.2312 0.178 604 -606 3 555.1638 502.3453 45.3611 0.1652 605 -607 3 554.8549 503.1587 45.5963 0.1652 606 -608 3 555.1546 504.1951 45.981 0.1907 607 -609 3 555.4452 505.2465 46.4778 0.1907 608 -610 3 554.9327 506.1788 46.8586 0.2161 609 -611 3 554.6764 507.2565 47.3334 0.2415 610 -612 3 554.1559 508.1888 47.9343 0.2415 611 -613 3 553.6102 509.1635 48.5094 0.1907 612 -614 3 553.7566 510.105 49.1456 0.1525 613 -615 3 554.5815 510.4883 49.9929 0.1398 614 -616 3 554.8983 511.3337 50.9891 0.1525 615 -617 3 554.8091 512.4285 51.9672 0.1525 616 -618 3 554.1719 513.0074 52.9211 0.1525 617 -619 3 553.148 512.9376 53.9129 0.1525 618 -620 3 552.2065 512.8277 54.9794 0.1652 619 -621 3 551.2215 513.0508 56.0045 0.178 620 -622 3 550.1485 513.3997 56.896 0.1907 621 -623 3 549.1555 513.6514 57.7948 0.1652 622 -624 3 548.1362 513.7155 58.7093 0.1398 623 -625 3 547.3697 514.1536 59.6702 0.1144 624 -626 3 546.7462 514.9968 60.5626 0.1271 625 -627 3 546.0621 515.9074 61.2629 0.1525 626 -628 3 545.4581 516.8626 61.8397 0.178 627 -629 3 544.5703 517.7447 62.235 0.1398 628 -630 3 543.7741 518.566 62.4949 0.1271 629 -631 3 542.9355 519.3222 62.6895 0.1144 630 -632 3 542.1485 520.0327 62.9633 0.1144 631 -633 3 541.2138 520.6813 63.1467 0.1144 632 -634 3 540.2632 521.2762 63.2954 0.1144 633 -635 3 539.3868 521.9283 63.5286 0.1144 634 -636 3 538.3584 522.4145 63.723 0.1271 635 -637 3 537.2945 522.8046 63.8288 0.1525 636 -638 3 536.1814 523.0471 63.9033 0.178 637 -639 3 535.0843 523.2873 64.041 0.178 638 -640 3 534.0512 523.6683 64.2561 0.1525 639 -641 3 533.1132 524.2597 64.468 0.1271 640 -642 3 532.4656 525.1601 64.5789 0.1144 641 -643 3 531.7575 525.9426 64.601 0.1144 642 -644 3 530.6787 526.2926 64.5837 0.1271 643 -645 3 529.5587 526.4928 64.5098 0.1525 644 -646 3 528.5658 526.9642 64.4305 0.178 645 -647 3 527.8176 527.7798 64.3286 0.178 646 -648 3 527.1804 528.6733 64.3182 0.1525 647 -649 3 526.7285 529.6869 64.4319 0.1271 648 -650 3 525.8202 530.141 64.6299 0.1144 649 -651 3 524.8626 530.6604 64.731 0.1271 650 -652 3 524.0286 531.4372 64.808 0.1398 651 -653 3 523.4223 532.3936 64.9284 0.1652 652 -654 3 522.8629 533.3889 65.1557 0.1907 653 -655 3 546.0232 517.2402 64.064 0.1525 628 -656 3 546.7405 517.6772 66.9514 0.1271 655 -657 3 547.4589 518.1153 68.182 0.1144 656 -658 3 548.1762 518.5523 69.6413 0.1144 657 -659 3 548.8935 518.9893 71.2522 0.1144 658 -660 3 549.4449 519.7547 72.8899 0.1144 659 -661 3 549.954 520.5989 74.4971 0.1144 660 -662 3 550.4642 521.4421 76.0399 0.1144 661 -663 3 550.9733 522.2863 77.5701 0.1144 662 -664 3 551.4835 523.1306 79.0642 0.1144 663 -665 3 552.1138 523.7152 80.5616 0.1144 664 -666 3 552.7556 524.2746 82.0341 0.1144 665 -667 3 553.3974 524.8352 83.4414 0.1271 666 -668 3 554.0392 525.3946 86.2926 0.1398 667 -669 3 553.0679 525.906 40.4029 0.1144 1 -670 3 553.7566 526.8006 40.9788 0.1144 669 -671 3 554.6226 527.5316 41.2023 0.1271 670 -672 3 555.7209 527.67 41.4268 0.1525 671 -673 3 556.826 527.6769 41.7424 0.1907 672 -674 3 557.7114 527.9182 42.2576 0.2161 673 -675 3 558.4722 528.7454 42.6135 0.2288 674 -676 3 559.4492 529.3196 42.9335 0.2161 675 -677 3 560.314 529.982 43.1043 0.1907 676 -678 3 561.1228 530.5163 43.3664 0.2161 677 -679 3 562.0003 530.9773 43.6428 0.178 678 -680 3 563.0711 531.1009 43.773 0.1652 679 -681 3 564.1258 531.2999 44.0331 0.178 680 -682 3 565.1783 531.6934 44.3646 0.178 681 -683 3 566.0466 532.4176 44.697 0.178 682 -684 3 566.5877 533.0594 45.2508 0.178 683 -685 3 567.607 532.9324 45.8436 0.1907 684 -686 3 567.9331 532.7345 46.3263 0.1652 685 -687 3 568.8529 532.1122 46.7107 0.1398 686 -688 3 569.8584 531.8067 46.8717 0.1398 687 -689 3 570.9464 531.7506 46.7956 0.1525 688 -690 3 572.0355 531.5768 46.5522 0.178 689 -691 3 573.0605 531.1855 46.2384 0.2034 690 -692 3 573.8201 530.6147 46.1294 0.2161 691 -693 3 574.7479 530.1147 46.1605 0.2288 692 -694 3 575.8473 529.8322 46.1972 0.2161 693 -695 3 576.973 529.7933 46.1768 0.1907 694 -696 3 578.0987 529.9214 46.1009 0.178 695 -697 3 579.1306 529.7338 45.8702 0.1907 696 -698 3 580.0858 529.1538 45.7472 0.2288 697 -699 3 580.9312 528.9101 45.6963 0.1525 698 -700 3 582.002 529.0474 45.7408 0.1652 699 -701 3 583.1082 529.1252 45.7027 0.178 700 -702 3 584.2442 529.0073 45.6674 0.1907 701 -703 3 585.3734 528.8369 45.656 0.178 702 -704 3 586.5071 528.6927 45.6151 0.1525 703 -705 3 587.6442 528.5749 45.5336 0.1271 704 -706 3 588.771 528.3896 45.432 0.1271 705 -707 3 589.8773 528.1036 45.3253 0.1652 706 -708 3 590.9618 527.7489 45.1772 0.2161 707 -709 3 592.0097 527.3245 44.9632 0.2542 708 -710 3 593.0164 526.8257 44.7009 0.2542 709 -711 3 594.0483 526.3441 44.4884 0.2415 710 -712 3 594.9292 525.8236 44.2005 0.2161 711 -713 3 595.8032 525.2447 43.8332 0.1907 712 -714 3 596.8912 525.0342 43.5274 0.1525 713 -715 3 597.9951 524.8192 43.272 0.1398 714 -716 3 598.9995 524.3307 43.0175 0.1525 715 -717 3 599.9628 523.7426 42.8425 0.178 716 -718 3 600.9123 523.1432 42.828 0.178 717 -719 3 601.8595 522.5357 42.8478 0.1652 718 -720 3 602.785 521.8745 42.842 0.178 719 -721 3 603.5927 521.0851 42.8879 0.2161 720 -722 3 604.3626 520.2477 42.9783 0.2669 721 -723 3 605.1531 519.4229 43.0542 0.2924 722 -724 3 605.9574 518.6084 43.1021 0.3178 723 -725 3 606.7753 517.8087 43.1371 0.3178 724 -726 3 607.6367 517.0571 43.155 0.3051 725 -727 3 608.5577 516.3822 43.1449 0.2542 726 -728 3 609.593 515.9177 43.127 0.2034 727 -729 3 610.6741 515.5425 43.115 0.1525 728 -730 3 611.7037 515.0517 43.1054 0.1271 729 -731 3 612.7001 514.49 43.0956 0.1398 730 -732 3 613.6359 513.8539 43.0422 0.1652 731 -733 3 614.5316 513.1709 42.9335 0.1907 732 -734 3 615.4526 512.5612 42.9156 0.1652 733 -735 3 616.5256 512.2821 42.9696 0.1525 734 -736 3 617.657 512.3576 43.0296 0.1652 735 -737 3 618.7965 512.4559 43.083 0.2288 736 -738 3 619.8913 512.1791 43.1276 0.2669 737 -739 3 620.8065 511.5156 43.1547 0.2669 738 -740 3 621.7972 510.9527 43.1561 0.2288 739 -741 3 622.8416 510.4871 43.1477 0.2034 740 -742 3 623.9273 510.1531 43.1102 0.178 741 -743 3 625.0324 509.9197 43.0326 0.1652 742 -744 3 626.1547 509.7206 42.989 0.1652 743 -745 3 627.2712 509.5468 43.0452 0.2034 744 -746 3 628.3512 509.247 43.1959 0.2415 745 -747 3 629.3464 508.7471 43.4216 0.2669 746 -748 3 630.3726 508.254 43.6218 0.2415 747 -749 3 631.4148 507.8056 43.727 0.2288 748 -750 3 632.4684 507.3743 43.7578 0.2161 749 -751 3 633.5289 506.9533 43.7436 0.2288 750 -752 3 634.5871 506.5243 43.7545 0.2161 751 -753 3 635.6327 506.0907 43.8371 0.2034 752 -754 3 636.6291 505.545 43.9723 0.1907 753 -755 3 637.6278 504.9925 44.1319 0.2034 754 -756 3 638.6712 504.5257 44.2736 0.2034 755 -757 3 639.7065 504.0395 44.3904 0.2034 756 -758 3 640.6228 503.3657 44.5026 0.178 757 -759 3 641.458 502.5912 44.6051 0.1907 758 -760 3 642.2405 501.7618 44.6958 0.2034 759 -761 3 642.8708 500.8112 44.7479 0.2161 760 -762 3 643.4199 499.8102 44.7353 0.178 761 -763 3 643.8981 498.7851 44.6365 0.1652 762 -764 3 644.5857 497.8791 44.5096 0.178 763 -765 3 645.3739 497.0497 44.3876 0.2288 764 -766 3 646.2662 496.3358 44.2739 0.2288 765 -767 3 647.1986 495.6735 44.1692 0.2161 766 -768 3 648.1218 494.9974 44.0698 0.178 767 -769 3 649.037 494.311 43.9662 0.178 768 -770 3 649.9419 493.636 43.7861 0.178 769 -771 3 650.8376 492.9736 43.5204 0.2034 770 -772 3 651.6316 492.1602 43.2541 0.2161 771 -773 3 652.4198 491.3377 43.0021 0.2288 772 -774 3 653.3899 490.8103 42.7221 0.2161 773 -775 3 654.4996 490.5426 42.5345 0.1907 774 -776 3 655.6367 490.4271 42.4388 0.1652 775 -777 3 656.5279 490.9648 42.3702 0.1525 776 -778 3 656.6526 490.0404 42.5253 0.1652 777 -779 3 657.4637 489.2899 42.7224 0.1652 778 -780 3 658.3205 488.536 42.8966 0.178 779 -781 3 659.1408 487.7444 43.0035 0.178 780 -782 3 659.8889 486.8978 43.0293 0.1907 781 -783 3 660.692 486.1062 43.0802 0.178 782 -784 3 661.5214 485.334 43.1771 0.1652 783 -785 3 662.2902 484.4909 43.2972 0.1525 784 -786 3 663.0224 483.6134 43.4403 0.1525 785 -787 3 663.7065 482.7074 43.6422 0.1398 786 -788 3 664.2888 481.7338 43.8808 0.1398 787 -789 3 664.6686 480.6619 44.0975 0.1398 788 -790 3 665.0244 479.5968 44.3456 0.1525 789 -791 3 665.4076 478.5661 44.6578 0.1398 790 -792 3 665.7474 477.4896 44.9296 0.1271 791 -793 3 666.3892 476.5687 45.1158 0.1144 792 -794 3 667.2826 475.864 45.2281 0.1271 793 -795 3 668.3751 475.6237 45.2743 0.1398 794 -796 3 669.5008 475.5093 45.225 0.1652 795 -797 3 670.6139 475.2988 45.1178 0.178 796 -798 3 671.7282 475.0506 45.0274 0.1907 797 -799 3 672.8253 474.784 45.0386 0.1907 798 -800 3 673.9304 474.5381 45.1335 0.178 799 -801 3 675.0595 474.3745 45.2522 0.178 800 -802 3 676.1944 474.2303 45.3757 0.178 801 -803 3 677.3086 473.9752 45.4835 0.2034 802 -804 3 678.4103 473.6675 45.5655 0.2161 803 -805 3 679.4616 473.2328 45.6509 0.2161 804 -806 3 680.4638 472.7855 45.8122 0.1907 805 -807 3 681.53 472.448 45.8553 0.1525 806 -808 3 682.65 472.3267 45.7755 0.1398 807 -809 3 683.5034 471.9057 45.8609 0.1525 808 -810 3 684.2653 471.09 45.8923 0.178 809 -811 3 684.9471 470.43 45.6182 0.1907 810 -812 3 685.8474 470.1039 44.3458 0.178 811 -813 3 581.3476 528.8735 46.6665 0.2669 698 -814 3 582.391 528.5978 47.5129 0.2034 813 -815 3 583.416 528.1951 47.8873 0.178 814 -816 3 584.4788 527.8222 48.2689 0.2034 815 -817 3 585.5919 527.575 48.5834 0.2288 816 -818 3 586.7141 527.3554 48.8233 0.2415 817 -819 3 587.8284 527.0969 49.0118 0.2161 818 -820 3 588.9404 526.8417 49.175 0.2034 819 -821 3 590.0477 526.6175 49.3674 0.178 820 -822 3 591.1609 526.4105 49.5855 0.1525 821 -823 3 592.2888 526.2343 49.7823 0.1398 822 -824 3 593.4203 526.0673 49.94 0.1652 823 -825 3 594.4739 525.684 50.104 0.2288 824 -826 3 595.4795 525.1967 50.2824 0.2669 825 -827 3 596.5651 524.9015 50.3521 0.2796 826 -828 3 597.6759 524.6647 50.3068 0.2415 827 -829 3 598.7822 524.5835 50.1371 0.2415 828 -830 3 599.79 524.1888 49.8585 0.2288 829 -831 3 600.4478 523.3388 49.7017 0.2542 830 -832 3 601.2784 522.5769 49.6034 0.2542 831 -833 3 602.2657 522.0061 49.5054 0.2796 832 -834 3 603.2827 521.5725 49.32 0.2924 833 -835 3 604.1018 520.7957 49.1218 0.2796 834 -836 3 604.7333 519.8439 48.9454 0.2288 835 -837 3 605.3064 518.8543 48.7724 0.178 836 -838 3 605.8727 517.8602 48.6102 0.178 837 -839 3 606.3692 516.8523 48.3969 0.2161 838 -840 3 606.8691 515.8376 48.1608 0.2415 839 -841 3 607.3908 514.8217 47.9718 0.2161 840 -842 3 608.0028 513.8562 47.784 0.178 841 -843 3 608.6629 512.9261 47.5776 0.1525 842 -844 3 609.0107 511.8393 47.376 0.1525 843 -845 3 609.5243 510.8646 47.08 0.1398 844 -846 3 610.4121 510.2892 46.676 0.1271 845 -847 3 611.1751 509.4655 46.3904 0.1144 846 -848 3 611.6465 508.4314 46.1376 0.1144 847 -849 3 612.0812 507.4338 45.8335 0.1144 848 -850 3 612.9129 506.7542 45.5112 0.1144 849 -851 3 613.8189 506.2166 45.274 0.1144 850 -852 3 614.4218 505.2682 45.2012 0.1144 851 -853 3 615.1528 504.4228 45.2029 0.1144 852 -854 3 616.0657 503.7329 45.2203 0.1271 853 -855 3 616.9523 503.0111 45.2424 0.1525 854 -856 3 617.8092 502.2549 45.243 0.178 855 -857 3 618.7496 501.6223 45.1965 0.178 856 -858 3 619.7986 501.1681 45.0932 0.178 857 -859 3 620.8145 500.6499 44.9425 0.178 858 -860 3 621.7915 500.0573 44.7429 0.1907 859 -861 3 622.6872 499.4475 44.4234 0.178 860 -862 3 623.289 498.5975 43.9348 0.178 861 -863 3 623.909 497.6926 43.3868 0.178 862 -864 3 624.8173 497.1458 42.8056 0.1907 863 -865 3 625.8607 496.782 42.2162 0.1907 864 -866 3 626.9269 496.401 41.6945 0.2034 865 -867 3 627.9416 495.9263 41.3375 0.2034 866 -868 3 628.6303 495.1106 41.0203 0.2034 867 -869 3 629.4242 494.4528 40.6118 0.1907 868 -870 3 630.1106 493.6566 40.1478 0.2034 869 -871 3 630.614 492.6762 39.6768 0.2161 870 -872 3 631.2649 491.7576 39.3086 0.2288 871 -873 3 632.0028 490.8858 39.0695 0.2288 872 -874 3 632.8997 490.196 38.9124 0.2288 873 -875 3 633.8412 489.5931 38.7705 0.2288 874 -876 3 634.737 488.9239 38.6316 0.2161 875 -877 3 635.5709 488.2867 38.687 0.2161 876 -878 3 636.239 487.4836 38.913 0.2034 877 -879 3 636.9117 486.5798 39.128 0.2288 878 -880 3 637.5947 485.6623 39.2899 0.2161 879 -881 3 638.2365 484.746 39.34 0.2415 880 -882 3 638.8931 483.8296 39.3064 0.2415 881 -883 3 639.5967 482.9316 39.263 0.2796 882 -884 3 640.2545 481.9958 39.2515 0.2669 883 -885 3 640.6961 480.9502 39.3252 0.2288 884 -886 3 641.5014 480.3324 39.5942 0.178 885 -887 3 641.8584 479.2799 39.9255 0.1652 886 -888 3 642.1993 478.2057 40.269 0.2034 887 -889 3 642.7049 477.1807 40.5185 0.2415 888 -890 3 643.2163 476.158 40.6686 0.2542 889 -891 3 643.7219 475.1455 40.7764 0.2288 890 -892 3 644.2836 474.1548 40.8092 0.1907 891 -893 3 645.0055 473.2842 40.6904 0.1652 892 -894 3 645.7537 472.4411 40.4463 0.1525 893 -895 3 646.5305 471.6334 40.103 0.1525 894 -896 3 647.4045 470.9493 39.6777 0.1525 895 -897 3 648.3288 470.3419 39.1975 0.1652 896 -898 3 649.061 469.4839 38.7433 0.178 897 -899 3 649.7577 468.5916 38.3457 0.1907 898 -900 3 650.4509 467.6855 38.0355 0.178 899 -901 3 651.1511 466.784 37.805 0.1652 900 -902 3 651.8935 465.9123 37.6625 0.178 901 -903 3 652.6692 465.0726 37.5838 0.2034 902 -904 3 653.605 464.4137 37.5441 0.2288 903 -905 3 654.5076 463.7112 37.5281 0.2034 904 -906 3 655.1722 462.78 37.5234 0.178 905 -907 3 567.9251 532.6693 48.9927 0.2034 685 -908 3 568.528 532.4165 51.5194 0.2161 907 -909 3 569.1297 532.1636 52.6394 0.2034 908 -910 3 569.7314 531.9108 53.9342 0.2161 909 -911 3 570.6718 531.8262 55.0164 0.2669 910 -912 3 571.3067 531.8948 58.0194 0.2034 911 -913 3 570.9407 531.857 60.5021 0.2034 912 -914 3 570.7919 530.9968 61.5336 0.178 913 -915 3 571.3491 530.252 62.6783 0.1525 914 -916 3 571.5721 530.5426 63.9587 0.1271 915 -917 3 572.4256 531.0219 65.0832 0.1144 916 -918 3 573.1955 531.8273 66.0402 0.1398 917 -919 3 573.6336 532.8546 66.836 0.178 918 -920 3 573.6851 533.9883 67.4943 0.2288 919 -921 3 573.8842 535.1037 68.0694 0.2288 920 -922 3 574.423 535.9857 68.6199 0.2034 921 -923 3 575.2924 536.083 69.2793 0.1652 922 -924 3 576.2362 536.4662 69.9093 0.1525 923 -925 3 577.2315 536.7842 70.6037 0.1525 924 -926 3 578.3309 536.9902 71.2956 0.1398 925 -927 3 579.4314 536.862 71.9785 0.1271 926 -928 3 580.4473 537.0302 72.7275 0.1144 927 -929 3 581.5421 537.1458 73.458 0.1144 928 -930 3 582.6415 537.2556 74.1754 0.1144 929 -931 3 583.742 537.3654 74.8726 0.1144 930 -932 3 584.8643 537.3906 75.5317 0.1144 931 -933 3 585.9957 537.2247 76.0967 0.1144 932 -934 3 587.126 537.0519 76.6226 0.1144 933 -935 3 588.2311 537.0497 77.224 0.1144 934 -936 3 589.2401 537.1995 77.9573 0.1144 935 -937 3 590.2491 537.3505 78.7727 0.1144 936 -938 3 591.257 537.5015 79.6264 0.1271 937 -939 3 592.266 537.6525 81.5186 0.1652 938 -940 3 571.8135 532.4885 55.8093 0.2034 911 -941 3 572.3501 533.4655 56.4564 0.2034 940 -942 3 572.4954 534.5672 57.008 0.2288 941 -943 3 572.4542 535.6757 57.5165 0.2161 942 -944 3 572.5503 536.7717 57.9858 0.2415 943 -945 3 572.8843 537.8047 58.5511 0.2288 944 -946 3 573.1783 538.8091 59.2312 0.2669 945 -947 3 573.7057 539.7552 59.8788 0.2669 946 -948 3 574.3544 540.659 60.4923 0.2669 947 -949 3 574.8714 541.6348 61.1237 0.2161 948 -950 3 575.4766 542.5683 61.7641 0.1652 949 -951 3 576.0772 543.5304 62.3633 0.1271 950 -952 3 576.2751 544.5474 62.9815 0.1144 951 -953 3 576.4216 545.585 63.7006 0.1144 952 -954 3 576.5691 546.6238 64.4809 0.1144 953 -955 3 576.7156 547.6614 65.2834 0.1144 954 -956 3 576.862 548.699 66.0786 0.1144 955 -957 3 577.2338 549.7034 66.7624 0.1144 956 -958 3 577.8436 550.6713 67.2521 0.1144 957 -959 3 578.4533 551.6391 67.5828 0.1144 958 -960 3 579.0631 552.6069 67.7998 0.1144 959 -961 3 579.6728 553.5747 67.9459 0.1144 960 -962 3 580.262 554.5208 68.1044 0.1271 961 -963 3 580.8397 555.4578 68.3525 0.1525 962 -964 3 581.4735 556.4027 68.581 0.178 963 -965 3 581.8601 557.4243 68.7406 0.178 964 -966 3 581.9173 558.51 68.9391 0.1525 965 -967 3 581.9173 559.5075 69.3739 0.1271 966 -968 3 581.9208 560.4307 70.0288 0.1144 967 -969 3 582.2651 561.3883 70.5944 0.1144 968 -970 3 582.852 562.2909 71.2135 0.1144 969 -971 3 583.4423 563.1923 71.8502 0.1144 970 -972 3 584.1012 564.0629 72.4346 0.1144 971 -973 3 585.1194 564.5766 72.8067 0.1144 972 -974 3 586.1421 565.088 73.022 0.1144 973 -975 3 587.166 565.5959 73.1444 0.1144 974 -976 3 588.1887 566.1061 73.1923 0.1144 975 -977 3 589.2126 566.614 73.2046 0.1144 976 -978 3 590.1988 567.1941 73.2365 0.1144 977 -979 3 590.9618 568.0338 73.3583 0.1144 978 -980 3 591.726 568.8734 73.5437 0.1144 979 -981 3 592.4902 569.7131 73.768 0.1144 980 -982 3 593.2544 570.5528 74.0093 0.1398 981 -983 3 594.0186 571.3925 74.5368 0.1652 982 -984 3 560.1676 531.2095 43.0066 0.2415 677 -985 3 560.5531 532.0275 44.1543 0.2288 984 -986 3 561.5759 532.4737 44.5936 0.2034 985 -987 3 562.7096 532.4931 45.0092 0.1652 986 -988 3 563.8193 532.5892 45.4194 0.1652 987 -989 3 564.9061 532.5835 45.808 0.1907 988 -990 3 565.9654 533.0022 46.0872 0.2161 989 -991 3 567.0305 533.3488 46.1952 0.2288 990 -992 3 568.0338 533.7115 46.1079 0.2161 991 -993 3 569.0714 534.0958 45.9855 0.2034 992 -994 3 569.6994 534.9001 45.953 0.178 993 -995 3 570.0277 535.9629 45.9836 0.178 994 -996 3 570.9029 536.5131 46.1594 0.178 995 -997 3 571.9817 536.8071 46.3966 0.1907 996 -998 3 573.0147 537.2785 46.6346 0.178 997 -999 3 573.7103 537.7921 47.0666 0.178 998 -1000 3 574.2708 538.5986 47.3984 0.2034 999 -1001 3 574.9012 539.4875 47.7582 0.2415 1000 -1002 3 575.718 540.2597 48.0091 0.2542 1001 -1003 3 576.838 540.4828 48.2387 0.2161 1002 -1004 3 577.9797 540.4862 48.466 0.178 1003 -1005 3 579.0859 540.5503 48.7869 0.1398 1004 -1006 3 580.1201 540.6761 49.2758 0.1271 1005 -1007 3 581.2115 540.961 49.7767 0.1271 1006 -1008 3 582.2971 541.3133 50.2317 0.1652 1007 -1009 3 583.3977 541.5124 50.7016 0.2034 1008 -1010 3 584.4616 541.525 51.2406 0.2288 1009 -1011 3 585.5495 541.6577 51.7656 0.2161 1010 -1012 3 586.6329 542.0283 52.18 0.2034 1011 -1013 3 587.7071 542.4173 52.5294 0.178 1012 -1014 3 588.7447 542.9001 52.8399 0.1652 1013 -1015 3 589.7823 543.3497 53.1454 0.1525 1014 -1016 3 590.8199 543.6425 53.5727 0.1652 1015 -1017 3 591.8026 544.0315 54.1036 0.1652 1016 -1018 3 592.6057 544.8106 54.6661 0.1652 1017 -1019 3 593.5358 545.386 55.2577 0.1525 1018 -1020 3 594.6489 545.6011 55.7973 0.1525 1019 -1021 3 595.7346 545.7715 56.3097 0.1525 1020 -1022 3 596.6818 546.3058 56.8313 0.1398 1021 -1023 3 597.6977 546.713 57.3409 0.1398 1022 -1024 3 598.7971 546.9395 57.8001 0.1398 1023 -1025 3 599.9056 547.2038 58.1434 0.1525 1024 -1026 3 601.0027 547.499 58.3464 0.1398 1025 -1027 3 602.0986 547.801 58.4962 0.1271 1026 -1028 3 603.1854 548.0858 58.6642 0.1144 1027 -1029 3 604.3054 548.262 58.8157 0.1271 1028 -1030 3 605.4483 548.3192 58.9215 0.1398 1029 -1031 3 606.59 548.3421 58.9966 0.1525 1030 -1032 3 607.7317 548.2631 59.043 0.1398 1031 -1033 3 608.87 548.159 59.0542 0.1271 1032 -1034 3 610.0014 548.1968 59.036 0.1144 1033 -1035 3 611.1076 548.4885 59.0041 0.1271 1034 -1036 3 612.223 548.7082 58.9537 0.1398 1035 -1037 3 613.3556 548.7791 58.8622 0.1525 1036 -1038 3 614.4882 548.874 58.7583 0.1398 1037 -1039 3 615.6184 549.0296 58.6757 0.1271 1038 -1040 3 616.7384 549.2298 58.6496 0.1271 1039 -1041 3 617.8344 549.5215 58.7345 0.1525 1040 -1042 3 618.8891 549.8968 58.9173 0.178 1041 -1043 3 619.8386 550.4848 59.1914 0.178 1042 -1044 3 620.7584 551.1323 59.4941 0.1525 1043 -1045 3 621.6496 551.845 59.7551 0.1271 1044 -1046 3 622.582 552.5028 59.953 0.1144 1045 -1047 3 623.5635 553.0885 60.0704 0.1144 1046 -1048 3 624.5245 553.6971 60.1073 0.1144 1047 -1049 3 625.4694 554.3172 60.0832 0.1144 1048 -1050 3 626.4624 554.8686 60.109 0.1144 1049 -1051 3 627.4748 555.3571 60.2367 0.1144 1050 -1052 3 628.4987 555.8364 60.4318 0.1144 1051 -1053 3 629.5546 556.2357 60.6584 0.1271 1052 -1054 3 630.6758 556.4393 60.8773 0.1525 1053 -1055 3 631.8118 556.5652 61.063 0.178 1054 -1056 3 632.9477 556.6887 61.192 0.2034 1055 -1057 3 634.086 556.8077 61.2584 0.2034 1056 -1058 3 635.214 556.9804 61.278 0.2161 1057 -1059 3 636.318 557.279 61.2646 0.1907 1058 -1060 3 637.3979 557.6531 61.2237 0.178 1059 -1061 3 638.4367 558.1256 61.1514 0.1525 1060 -1062 3 639.4617 558.6198 61.0464 0.1652 1061 -1063 3 640.5393 558.9778 60.9132 0.1907 1062 -1064 3 641.6513 559.2078 60.7684 0.2034 1063 -1065 3 642.785 559.3142 60.6533 0.2034 1064 -1066 3 643.929 559.3142 60.5962 0.178 1065 -1067 3 645.0684 559.2558 60.6015 0.1907 1066 -1068 3 646.1953 559.0659 60.6746 0.1907 1067 -1069 3 647.3175 558.9184 60.8149 0.2288 1068 -1070 3 648.4512 558.9355 61.0182 0.2161 1069 -1071 3 649.5815 558.9515 61.2654 0.2161 1070 -1072 3 650.7003 558.9573 61.5546 0.1652 1071 -1073 3 651.8215 558.9435 61.8195 0.1525 1072 -1074 3 652.9529 558.9035 61.9581 0.1652 1073 -1075 3 654.082 558.8143 62.0158 0.2161 1074 -1076 3 655.194 558.6026 62.0959 0.2415 1075 -1077 3 656.2796 558.296 62.2009 0.2288 1076 -1078 3 657.3893 558.0512 62.2874 0.1907 1077 -1079 3 658.5184 558.0661 62.4252 0.178 1078 -1080 3 659.6498 558.1015 62.6046 0.1652 1079 -1081 3 660.7893 558.002 62.776 0.1652 1080 -1082 3 661.8612 557.7458 62.9955 0.1398 1081 -1083 3 662.5144 556.9987 63.2862 0.1398 1082 -1084 3 663.3438 556.3329 63.5631 0.1398 1083 -1085 3 664.4512 556.1728 63.7241 0.1525 1084 -1086 3 665.5506 556.1602 63.6644 0.1398 1085 -1087 3 666.571 556.3078 63.3578 0.1271 1086 -1088 3 667.5892 556.7585 62.9812 0.1144 1087 -1089 3 668.6955 556.675 62.6175 0.1271 1088 -1090 3 669.7319 556.2014 62.2947 0.1398 1089 -1091 3 670.7192 555.6431 61.9758 0.1525 1090 -1092 3 671.695 555.1489 61.6084 0.1525 1091 -1093 3 672.6949 554.6478 61.2424 0.1525 1092 -1094 3 673.7073 554.1422 60.8952 0.1525 1093 -1095 3 674.7964 553.8024 60.6124 0.1398 1094 -1096 3 675.9084 553.5347 60.4069 0.1271 1095 -1097 3 676.9792 553.1354 60.2714 0.1271 1096 -1098 3 677.9607 552.5497 60.1905 0.1525 1097 -1099 3 678.8896 551.8828 60.1496 0.178 1098 -1100 3 679.6813 551.0659 60.0944 0.178 1099 -1101 3 680.7017 550.6896 59.9466 0.1652 1100 -1102 3 681.8332 550.5386 59.8399 0.1525 1101 -1103 3 682.9371 550.2514 59.8156 0.1652 1102 -1104 3 684.0159 550.2091 60.265 0.178 1103 -1105 3 546.7691 525.0811 43.0937 0.2034 1 -1106 3 545.6846 525.4266 43.3272 0.2034 1105 -1107 3 544.7602 526.097 43.4095 0.2034 1106 -1108 3 543.638 526.3212 43.4997 0.2034 1107 -1109 3 543.3062 526.1119 43.6803 0.2542 1108 -1110 3 542.3956 525.5227 43.899 0.2924 1109 -1111 3 541.4106 524.9919 44.0118 0.3051 1110 -1112 3 540.3741 524.6087 44.1294 0.3051 1111 -1113 3 539.5047 524.111 44.3946 0.2924 1112 -1114 3 538.5963 523.6466 44.7476 0.2542 1113 -1115 3 537.4787 523.6557 45.059 0.2034 1114 -1116 3 536.3552 523.8708 45.3124 0.1652 1115 -1117 3 535.2364 523.8159 45.5221 0.178 1116 -1118 3 534.1885 523.3857 45.6722 0.2288 1117 -1119 3 533.1726 522.8629 45.7794 0.2924 1118 -1120 3 532.1762 522.3687 45.9472 0.3178 1119 -1121 3 531.126 522.0301 46.1874 0.3051 1120 -1122 3 530.069 521.6365 46.3778 0.2669 1121 -1123 3 529.1275 521.0325 46.4551 0.2288 1122 -1124 3 528.1859 520.4262 46.5587 0.2161 1123 -1125 3 527.1689 519.9514 46.683 0.2288 1124 -1126 3 526.264 519.3382 46.8289 0.2796 1125 -1127 3 525.2447 519.0248 46.9899 0.3178 1126 -1128 3 524.1819 518.7674 46.9322 0.3178 1127 -1129 3 523.118 518.7445 46.6281 0.2669 1128 -1130 3 521.823 518.542 45.9365 0.3686 1129 -1131 3 520.8552 518.5157 45.1847 0.3051 1130 -1132 3 519.7821 518.4837 44.4909 0.2415 1131 -1133 3 518.7537 518.3167 44.0112 0.2288 1132 -1134 3 517.6703 518.0924 43.8421 0.2669 1133 -1135 3 516.7036 517.692 43.9636 0.3178 1134 -1136 3 515.7495 517.1441 44.1294 0.3178 1135 -1137 3 514.6707 516.7986 44.2781 0.2924 1136 -1138 3 513.6366 517.0125 44.2907 0.2669 1137 -1139 3 512.5978 517.4118 44.3808 0.2796 1138 -1140 3 511.4984 517.5902 44.5556 0.2924 1139 -1141 3 510.3762 517.7126 44.7779 0.3178 1140 -1142 3 509.6062 518.4185 45.1366 0.3432 1141 -1143 3 508.5881 518.8806 45.4874 0.3559 1142 -1144 3 507.5184 519.0488 45.6316 0.3559 1143 -1145 3 506.4065 519.1666 45.6506 0.3305 1144 -1146 3 505.3197 519.0877 45.6669 0.3305 1145 -1147 3 504.4113 519.559 45.8604 0.3178 1146 -1148 3 503.4206 520.1185 46.0463 0.2924 1147 -1149 3 502.391 520.5806 46.2927 0.2415 1148 -1150 3 501.4038 520.925 46.5041 0.2161 1149 -1151 3 500.4131 520.7248 46.65 0.2288 1150 -1152 3 499.4944 520.9936 46.9927 0.2542 1151 -1153 3 498.8606 521.656 47.2959 0.2669 1152 -1154 3 497.9237 521.9443 47.488 0.2796 1153 -1155 3 496.8014 521.9832 47.7218 0.2924 1154 -1156 3 495.8107 522.1594 48.1029 0.3178 1155 -1157 3 494.9527 522.7016 48.3412 0.3178 1156 -1158 3 493.8579 522.7439 48.5313 0.3305 1157 -1159 3 492.7734 522.84 48.5741 0.3178 1158 -1160 3 491.9017 523.1363 48.8144 0.3305 1159 -1161 3 490.9499 523.7426 48.9392 0.3178 1160 -1162 3 490.0278 524.4188 49.0412 0.3051 1161 -1163 3 489.2099 525.2035 49.1554 0.2669 1162 -1164 3 488.4983 526.0695 49.3027 0.2415 1163 -1165 3 487.5728 526.6427 49.5653 0.2288 1164 -1166 3 486.5935 527.0557 49.7972 0.2288 1165 -1167 3 485.6154 527.5785 49.9621 0.2415 1166 -1168 3 484.7551 528.2958 50.1813 0.2415 1167 -1169 3 484.19 529.2556 50.4619 0.2288 1168 -1170 3 483.3583 529.9088 50.7979 0.1907 1169 -1171 3 482.2898 530.117 51.1932 0.1652 1170 -1172 3 481.1836 530.2795 51.606 0.1525 1171 -1173 3 480.0704 530.5208 51.9509 0.1652 1172 -1174 3 478.9596 530.7966 52.2035 0.178 1173 -1175 3 477.954 531.3216 52.3821 0.1907 1174 -1176 3 476.9794 531.9188 52.507 0.178 1175 -1177 3 475.9326 532.3512 52.64 0.1652 1176 -1178 3 474.8641 532.7299 52.8007 0.1652 1177 -1179 3 473.7567 532.9896 52.9631 0.1652 1178 -1180 3 472.6367 533.2138 53.1126 0.1652 1179 -1181 3 471.5591 533.5856 53.2291 0.1525 1180 -1182 3 470.5158 534.0535 53.3016 0.1525 1181 -1183 3 469.4656 534.5088 53.3308 0.1652 1182 -1184 3 468.4062 534.9378 53.3254 0.1652 1183 -1185 3 467.3354 535.3417 53.2938 0.178 1184 -1186 3 466.2544 535.7169 53.237 0.1652 1185 -1187 3 465.1744 536.0921 53.1549 0.1652 1186 -1188 3 464.0991 536.4834 53.0457 0.1398 1187 -1189 3 463.0157 536.8517 52.897 0.1271 1188 -1190 3 461.9003 536.8781 52.6487 0.1271 1189 -1191 3 460.7757 536.8117 52.3006 0.1398 1190 -1192 3 459.6672 536.5669 51.919 0.1525 1191 -1193 3 458.5312 536.4834 51.5388 0.1398 1192 -1194 3 458.3447 537.0611 50.9236 0.1271 1193 -1195 3 458.0668 537.7063 50.1553 0.1144 1194 -1196 3 457.0211 538.0861 49.5071 0.1144 1195 -1197 3 455.9 538.3046 49.035 0.1144 1196 -1198 3 455.0397 538.9373 48.7133 0.1144 1197 -1199 3 454.0101 539.2805 48.5237 0.1144 1198 -1200 3 453.0309 539.8296 48.4512 0.1144 1199 -1201 3 452.2278 540.6384 48.44 0.1144 1200 -1202 3 451.6443 541.6154 48.44 0.1144 1201 -1203 3 451.3011 542.7022 48.44 0.1144 1202 -1204 3 451.0918 543.8256 48.44 0.1144 1203 -1205 3 450.4729 544.7625 48.44 0.1144 1204 -1206 3 449.9398 545.7692 48.44 0.1144 1205 -1207 3 449.1413 546.5746 48.44 0.1144 1206 -1208 3 448.5189 547.5321 48.44 0.1144 1207 -1209 3 448.2226 548.6338 48.44 0.1144 1208 -1210 3 447.8428 549.7126 48.44 0.1144 1209 -1211 3 447.1633 550.6324 48.44 0.1398 1210 -1212 3 446.6176 551.6368 48.44 0.1907 1211 -1213 3 522.6844 518.2972 47.2147 0.3178 1129 -1214 3 522.1788 517.5433 48.2154 0.3432 1213 -1215 3 521.6446 516.6853 48.6668 0.3559 1214 -1216 3 520.7454 516.0607 49.0087 0.3432 1215 -1217 3 519.7112 515.6397 49.3531 0.3305 1216 -1218 3 518.6061 515.5596 49.7162 0.3432 1217 -1219 3 517.5994 516.0035 49.9682 0.3305 1218 -1220 3 516.635 516.4199 50.2972 0.3178 1219 -1221 3 515.5127 516.4565 50.6316 0.2542 1220 -1222 3 514.395 516.2472 50.9068 0.2415 1221 -1223 3 513.275 516.0149 51.1487 0.2542 1222 -1224 3 512.1505 516.1808 51.4158 0.2924 1223 -1225 3 511.1495 516.5469 51.8426 0.3178 1224 -1226 3 510.0513 516.6029 52.3471 0.3432 1225 -1227 3 508.9301 516.4302 52.8609 0.3813 1226 -1228 3 507.8902 516.4496 53.4674 0.1525 1227 -1229 3 506.7771 516.4565 54.07 0.1398 1228 -1230 3 505.648 516.4565 54.626 0.1271 1229 -1231 3 504.5212 516.4222 55.1348 0.1144 1230 -1232 3 503.392 516.4222 55.61 0.1144 1231 -1233 3 502.2629 516.4474 56.061 0.1271 1232 -1234 3 501.1326 516.5354 56.478 0.1525 1233 -1235 3 500.0172 516.754 56.8593 0.1907 1234 -1236 3 498.9167 517.0262 57.2303 0.2288 1235 -1237 3 497.8963 517.4037 57.6559 0.2669 1236 -1238 3 496.8392 517.7332 58.093 0.2796 1237 -1239 3 495.7227 517.6943 58.4931 0.2542 1238 -1240 3 494.5947 517.811 58.8154 0.2034 1239 -1241 3 493.4724 517.9963 59.0388 0.178 1240 -1242 3 492.3787 518.2926 59.2693 0.2034 1241 -1243 3 491.2473 518.3201 59.4966 0.2542 1242 -1244 3 490.1274 518.1062 59.738 0.3178 1243 -1245 3 489.0737 518.0261 60.149 0.3432 1244 -1246 3 487.9881 517.8465 60.6659 0.3432 1245 -1247 3 486.907 517.5639 61.2357 0.2924 1246 -1248 3 485.8339 517.6406 61.8677 0.2415 1247 -1249 3 484.786 517.97 62.5198 0.2161 1248 -1250 3 483.7404 518.4013 63.1226 0.2034 1249 -1251 3 482.6914 518.8292 63.6675 0.2034 1250 -1252 3 481.6251 519.2319 64.1606 0.1652 1251 -1253 3 480.5921 519.7123 64.5954 0.1398 1252 -1254 3 479.725 520.3152 65.1109 0.1271 1253 -1255 3 478.7651 520.6847 65.7499 0.1525 1254 -1256 3 477.7344 520.3633 66.3743 0.2034 1255 -1257 3 476.7528 520.0224 67.0986 0.2288 1256 -1258 3 475.7541 519.6986 67.909 0.2288 1257 -1259 3 474.8138 519.7707 68.7924 0.178 1258 -1260 3 473.8768 520.0498 69.6654 0.1398 1259 -1261 3 472.7717 520.2866 70.3934 0.1144 1260 -1262 3 471.7112 520.6699 71.043 0.1144 1261 -1263 3 470.7057 521.0828 71.6887 0.1271 1262 -1264 3 469.66 521.3986 72.3159 0.1398 1263 -1265 3 468.651 521.8608 72.8773 0.1652 1264 -1266 3 467.65 522.0655 73.4546 0.1652 1265 -1267 3 466.585 521.9042 74.0782 0.1652 1266 -1268 3 465.4913 521.998 74.6508 0.1398 1267 -1269 3 464.3713 522.2188 75.1114 0.1271 1268 -1270 3 463.3463 522.2085 75.6064 0.1144 1269 -1271 3 462.287 522.1216 76.125 0.1144 1270 -1272 3 461.1453 522.0438 76.491 0.1144 1271 -1273 3 460.0024 522.0072 76.7346 0.1144 1272 -1274 3 458.8584 522.0072 76.8894 0.1652 1273 -1275 3 457.7144 522.0072 77.0 0.2288 1274 -1276 3 508.0355 515.896 54.9959 0.2288 1227 -1277 3 507.1707 515.4464 55.9359 0.2415 1276 -1278 3 506.1434 515.0151 56.2814 0.2161 1277 -1279 3 505.1835 514.4923 56.6748 0.2034 1278 -1280 3 504.4285 513.9134 56.8686 0.2034 1279 -1281 3 503.5648 513.3139 57.2258 0.2161 1280 -1282 3 502.4814 513.0932 57.6626 0.2288 1281 -1283 3 501.382 512.8117 58.0152 0.2288 1282 -1284 3 500.2495 512.7705 58.3954 0.2161 1283 -1285 3 499.3892 512.5612 59.0489 0.2034 1284 -1286 3 498.5609 512.3221 59.8536 0.1907 1285 -1287 3 497.8093 511.5076 60.5763 0.1907 1286 -1288 3 497.1481 510.7846 61.3544 0.1907 1287 -1289 3 496.2844 510.343 62.0166 0.178 1288 -1290 3 495.1758 510.1393 62.4621 0.1652 1289 -1291 3 494.0558 510.2332 62.811 0.1398 1290 -1292 3 493.0034 510.407 63.2464 0.1398 1291 -1293 3 491.9097 510.3258 63.742 0.1652 1292 -1294 3 490.927 509.8247 64.272 0.2034 1293 -1295 3 489.9214 509.3454 64.8553 0.2288 1294 -1296 3 489.0852 508.6258 65.3212 0.2034 1295 -1297 3 488.0018 508.4474 65.8717 0.1907 1296 -1298 3 487.0511 508.4451 66.5932 0.1907 1297 -1299 3 485.9506 508.325 67.2988 0.2161 1298 -1300 3 485.0377 507.7244 68.0546 0.2288 1299 -1301 3 484.0218 507.4944 68.8201 0.2034 1300 -1302 3 482.9076 507.6271 69.5752 0.178 1301 -1303 3 481.8162 507.4818 70.3391 0.1398 1302 -1304 3 480.9044 507.1077 71.2186 0.1271 1303 -1305 3 480.0132 506.6662 72.2033 0.1144 1304 -1306 3 479.0077 506.3561 73.2127 0.1144 1305 -1307 3 477.9724 506.2612 74.2353 0.1144 1306 -1308 3 476.9954 506.0038 75.2441 0.1144 1307 -1309 3 476.2678 505.7818 76.3017 0.1144 1308 -1310 3 475.443 505.9843 77.226 0.1144 1309 -1311 3 474.3344 506.2658 77.8705 0.1144 1310 -1312 3 473.5439 506.975 78.2916 0.1144 1311 -1313 3 472.7717 507.809 78.5361 0.1144 1312 -1314 3 471.6815 508.119 78.6509 0.1144 1313 -1315 3 470.5558 508.3227 78.68 0.1144 1314 -1316 3 469.493 508.7414 78.68 0.1144 1315 -1317 3 468.3536 508.8478 78.68 0.1144 1316 -1318 3 467.2096 508.8512 78.68 0.1144 1317 -1319 3 466.0656 508.8512 78.68 0.1144 1318 -1320 3 464.9216 508.8512 78.68 0.1271 1319 -1321 3 463.7776 508.8512 78.68 0.1398 1320 -1322 3 543.924 526.1325 43.3835 0.178 1108 -1323 3 544.7156 526.2766 44.2246 0.1652 1322 -1324 3 545.0005 527.3291 44.6102 0.178 1323 -1325 3 544.7648 528.4205 44.9473 0.2034 1324 -1326 3 545.0245 529.5198 45.2525 0.2415 1325 -1327 3 545.5233 530.4087 45.7355 0.2288 1326 -1328 3 546.2772 530.9098 46.4002 0.2161 1327 -1329 3 546.6627 531.9726 46.9678 0.178 1328 -1330 3 546.8103 533.0491 47.4446 0.1907 1329 -1331 3 547.69 533.6817 47.9847 0.2034 1330 -1332 3 548.4302 534.2617 48.5848 0.2288 1331 -1333 3 548.7265 535.3371 49.1761 0.2034 1332 -1334 3 549.2252 536.2546 49.8327 0.178 1333 -1335 3 550.0329 536.9547 50.5372 0.178 1334 -1336 3 551.0431 537.434 51.1896 0.2161 1335 -1337 3 552.0464 537.9271 51.7891 0.2415 1336 -1338 3 552.9101 538.5083 52.4356 0.2288 1337 -1339 3 553.7784 539.1558 53.0376 0.2161 1338 -1340 3 554.6318 539.8833 53.4668 0.2288 1339 -1341 3 555.4806 540.5389 53.9608 0.2542 1340 -1342 3 556.0218 541.4289 54.5241 0.2542 1341 -1343 3 557.0433 541.6932 55.1622 0.2288 1342 -1344 3 558.097 542.0787 55.7687 0.1907 1343 -1345 3 559.1014 542.4917 56.4007 0.1525 1344 -1346 3 559.9891 543.1735 56.9862 0.1271 1345 -1347 3 560.8346 543.8576 57.5089 0.1144 1346 -1348 3 561.5724 544.5577 58.0468 0.1144 1347 -1349 3 562.3446 545.1721 58.4892 0.1525 1348 -1350 3 563.4555 545.1412 58.7653 0.2034 1349 -1351 3 564.4668 545.3482 59.0276 0.2669 1350 -1352 3 565.5238 545.7246 59.2911 0.2669 1351 -1353 3 566.3292 546.1319 59.7484 0.2415 1352 -1354 3 567.3554 546.451 60.1247 0.2034 1353 -1355 3 568.4639 546.721 60.4668 0.1907 1354 -1356 3 569.529 547.094 60.8594 0.1907 1355 -1357 3 570.6055 547.2988 61.308 0.2034 1356 -1358 3 571.6236 547.5012 61.8195 0.2161 1357 -1359 3 572.6978 547.8788 62.2348 0.2415 1358 -1360 3 573.8007 548.135 62.6699 0.2288 1359 -1361 3 574.8749 548.4267 63.17 0.2288 1360 -1362 3 575.9411 548.7745 63.6574 0.2034 1361 -1363 3 576.989 548.9164 64.1508 0.2161 1362 -1364 3 577.9534 548.8237 64.836 0.2161 1363 -1365 3 578.9235 548.5022 65.6155 0.2288 1364 -1366 3 579.9005 548.0195 66.4045 0.2288 1365 -1367 3 581.0079 547.9211 67.111 0.2034 1366 -1368 3 582.1461 547.8994 67.744 0.178 1367 -1369 3 583.2409 547.7312 68.3707 0.1525 1368 -1370 3 584.3277 547.547 68.994 0.1652 1369 -1371 3 585.4283 547.4932 69.6256 0.178 1370 -1372 3 586.5334 547.4715 70.2663 0.178 1371 -1373 3 587.5515 547.4646 70.9836 0.1525 1372 -1374 3 588.6406 547.5642 71.6612 0.1271 1373 -1375 3 589.772 547.6889 72.2154 0.1144 1374 -1376 3 590.9046 547.8136 72.6611 0.1144 1375 -1377 3 592.0372 547.9394 73.0206 0.1144 1376 -1378 3 593.1709 548.0652 73.3135 0.1144 1377 -1379 3 594.3034 548.1899 73.5588 0.1144 1378 -1380 3 595.436 548.3146 73.7867 0.1144 1379 -1381 3 596.5697 548.4405 74.0127 0.1144 1380 -1382 3 597.6107 548.8981 74.228 0.1144 1381 -1383 3 598.3257 549.7881 74.4173 0.1271 1382 -1384 3 599.3633 550.2686 74.6077 0.1398 1383 -1385 3 600.4398 550.6404 74.8278 0.1525 1384 -1386 3 601.5381 550.8921 75.1041 0.1398 1385 -1387 3 602.6363 551.1437 75.4155 0.1271 1386 -1388 3 603.7334 551.3943 75.7436 0.1398 1387 -1389 3 604.8317 551.646 76.4733 0.1652 1388 -1390 3 554.5311 523.4155 33.8556 0.1907 1 -1391 3 555.5195 523.1821 33.2139 0.1907 1390 -1392 3 556.4816 522.5655 33.0028 0.2161 1391 -1393 3 557.2493 522.0804 32.6494 0.2415 1392 -1394 3 557.8487 521.2304 32.3232 0.2669 1393 -1395 3 558.3246 520.2008 32.051 0.2415 1394 -1396 3 558.2034 519.0751 31.9379 0.2161 1395 -1397 3 558.3029 518.3944 32.7558 0.178 1396 -1398 3 558.6221 517.3546 31.2326 0.2034 1397 -1399 3 558.4802 516.8523 30.4298 0.2288 1398 -1400 3 558.4836 515.7701 29.5968 0.2034 1399 -1401 3 559.1094 515.1238 28.4418 0.2288 1400 -1402 3 559.7695 514.6398 27.1417 0.2542 1401 -1403 3 560.5863 514.2795 25.8372 0.2542 1402 -1404 3 560.8666 513.8516 24.5535 0.2924 1403 -1405 3 560.1813 513.195 23.4935 0.3051 1404 -1406 3 559.1563 512.7191 22.7792 0.2924 1405 -1407 3 558.653 511.9938 22.5964 0.2161 1406 -1408 3 558.0684 511.0557 22.6043 0.1652 1407 -1409 3 556.9839 510.7354 22.6632 0.1398 1408 -1410 3 556.0229 510.4963 22.7421 0.178 1409 -1411 3 554.9269 510.1668 22.7757 0.1525 1410 -1412 3 553.7932 510.0558 22.7167 0.1652 1411 -1413 3 552.8163 509.9403 22.7671 0.1652 1412 -1414 3 551.7283 509.8007 22.6735 0.178 1413 -1415 3 551.1083 509.4598 22.2007 0.1652 1414 -1416 3 550.3189 508.6693 21.669 0.178 1415 -1417 3 549.6119 507.8353 21.1109 0.1652 1416 -1418 3 548.8763 507.3972 20.4708 0.178 1417 -1419 3 547.7449 507.5322 19.9428 0.1907 1418 -1420 3 546.6021 507.5322 19.5521 0.2288 1419 -1421 3 545.4661 507.5997 19.2757 0.2542 1420 -1422 3 544.369 507.8616 18.9882 0.2542 1421 -1423 3 543.3382 508.1442 18.5965 0.2415 1422 -1424 3 542.3292 508.3764 18.1 0.2415 1423 -1425 3 541.5845 509.0571 17.5422 0.2415 1424 -1426 3 540.969 509.9746 17.0044 0.2288 1425 -1427 3 540.0721 510.2606 16.7211 0.1907 1426 -1428 3 539.0288 509.9437 16.6231 0.1652 1427 -1429 3 537.958 509.5628 16.6096 0.178 1428 -1430 3 537.5084 509.1338 15.7273 0.1907 1429 -1431 3 557.7801 510.2972 21.6829 0.1652 1409 -1432 3 557.597 509.6165 20.1249 0.1652 1431 -1433 3 557.104 508.7196 19.5466 0.1652 1432 -1434 3 556.8454 508.3776 18.7427 0.1907 1433 -1435 3 556.1545 508.1236 17.9839 0.2161 1434 -1436 3 555.3559 507.5322 17.4124 0.2034 1435 -1437 3 558.4402 514.7863 31.5946 0.2669 1400 -1438 3 558.3772 513.6812 30.8031 0.2288 1437 -1439 3 558.8795 512.8735 30.4175 0.1652 1438 -1440 3 559.8542 512.4285 29.8816 0.1271 1439 -1441 3 560.4662 511.6162 29.2258 0.1144 1440 -1442 3 560.6664 510.693 28.4435 0.1144 1441 -1443 3 561.4111 510.1325 27.7303 0.1271 1442 -1444 3 562.26 510.661 27.2825 0.1398 1443 -1445 3 562.2211 511.6506 26.3992 0.1652 1444 -1446 3 559.2776 519.1403 32.1003 0.1907 1396 -1447 3 559.9983 518.4986 32.4302 0.1907 1446 -1448 3 560.7339 517.7504 32.5088 0.1907 1447 -1449 3 561.3757 517.0491 32.3456 0.2288 1448 -1450 3 561.839 516.0058 32.1504 0.2415 1449 -1451 3 562.4762 515.0723 31.9416 0.2288 1450 -1452 3 563.1878 514.2108 31.6932 0.2161 1451 -1453 3 563.9531 513.4844 31.3026 0.2288 1452 -1454 3 564.3752 512.5543 30.9064 0.2542 1453 -1455 3 564.9724 511.6517 30.5822 0.2542 1454 -1456 3 565.7663 510.836 30.2515 0.2415 1455 -1457 3 566.7319 510.5375 29.7447 0.2161 1456 -1458 3 567.6711 510.693 29.0142 0.2161 1457 -1459 3 568.7224 510.7274 28.1982 0.2288 1458 -1460 3 569.5438 510.1256 27.2978 0.2669 1459 -1461 3 569.1594 509.8694 27.9712 0.1907 1460 -1462 3 569.1686 508.9015 28.1492 0.2034 1461 -1463 3 569.7566 508.031 28.168 0.2415 1462 -1464 3 570.6272 507.3823 27.994 0.2542 1463 -1465 3 571.5081 506.7085 27.713 0.2415 1464 -1466 3 572.6406 506.6055 27.3894 0.2415 1465 -1467 3 573.7183 506.4133 26.9682 0.2542 1466 -1468 3 574.7479 506.093 26.6821 0.2415 1467 -1469 3 575.7844 505.974 26.5146 0.2034 1468 -1470 3 576.6366 506.0381 26.1963 0.1525 1469 -1471 3 576.7659 505.354 25.4658 0.1525 1470 -1472 3 576.894 504.671 24.4202 0.1652 1471 -1473 3 577.029 503.9606 23.1805 0.1907 1472 -1474 3 577.6491 503.1472 22.1266 0.1652 1473 -1475 3 578.6135 502.637 21.1768 0.1398 1474 -1476 3 579.5367 502.1165 20.313 0.1144 1475 -1477 3 580.4587 501.596 19.5544 0.1271 1476 -1478 3 581.2309 500.8546 18.9501 0.1525 1477 -1479 3 581.8578 499.8983 18.5251 0.178 1478 -1480 3 581.7171 498.9956 18.1056 0.178 1479 -1481 3 580.9404 498.1994 17.8605 0.1652 1480 -1482 3 580.4278 497.1961 17.6627 0.178 1481 -1483 3 580.1418 496.0922 17.555 0.2034 1482 -1484 3 579.7803 495.0088 17.4758 0.2288 1483 -1485 3 579.2301 494.0078 17.3999 0.2161 1484 -1486 3 578.7279 492.9805 17.2928 0.2034 1485 -1487 3 578.332 491.9292 17.0856 0.178 1486 -1488 3 578.0117 490.8618 16.7991 0.178 1487 -1489 3 577.7966 489.7876 15.9191 0.178 1488 -1490 3 570.459 510.2778 26.3477 0.2161 1460 -1491 3 570.4705 510.7617 26.1302 0.1907 1490 -1492 3 570.983 511.4172 26.4256 0.2161 1491 -1493 3 572.0686 511.6551 26.4796 0.2288 1492 -1494 3 573.1932 511.7776 26.4406 0.2161 1493 -1495 3 574.2766 512.115 26.3196 0.1907 1494 -1496 3 575.3679 512.3564 26.1365 0.1525 1495 -1497 3 575.9274 513.0131 25.9501 0.1271 1496 -1498 3 575.9823 514.0587 25.5577 0.1398 1497 -1499 3 576.2248 515.1077 25.0383 0.178 1498 -1500 3 577.0908 515.7369 24.5171 0.2288 1499 -1501 3 578.0929 516.0893 23.8838 0.2669 1500 -1502 3 579.0036 516.5435 23.1305 0.2796 1501 -1503 3 579.8456 517.2138 22.3609 0.2924 1502 -1504 3 580.8111 517.6772 21.6161 0.2669 1503 -1505 3 581.9208 517.4724 20.9959 0.2796 1504 -1506 3 582.9023 516.8878 20.5298 0.2669 1505 -1507 3 583.7489 516.1842 20.0882 0.2669 1506 -1508 3 584.5337 515.9898 19.7501 0.2415 1507 -1509 3 585.6628 515.896 19.5107 0.2415 1508 -1510 3 586.7999 515.976 19.3314 0.1907 1509 -1511 3 587.6145 516.5755 19.1427 0.1525 1510 -1512 3 588.0194 517.485 18.8361 0.1398 1511 -1513 3 588.6223 518.3121 18.5705 0.178 1512 -1514 3 589.3739 519.1552 18.4706 0.2161 1513 -1515 3 590.3029 519.7775 18.465 0.2669 1514 -1516 3 591.3428 520.234 18.5498 0.2669 1515 -1517 3 591.925 520.9856 18.831 0.2288 1516 -1518 3 592.3335 522.0118 19.1098 0.178 1517 -1519 3 593.0416 522.8652 19.2081 0.178 1518 -1520 3 593.8847 523.5905 19.2731 0.2034 1519 -1521 3 594.8503 524.1282 19.1541 0.2415 1520 -1522 3 595.8787 524.6121 18.9317 0.2288 1521 -1523 3 596.5136 525.5033 18.5796 0.2161 1522 -1524 3 596.993 526.4928 18.1582 0.1652 1523 -1525 3 597.8944 527.1735 17.7652 0.1525 1524 -1526 3 598.8577 527.7798 17.0562 0.1525 1525 -1527 3 583.9296 515.6992 19.6619 0.178 1507 -1528 3 584.2065 514.5975 19.6309 0.1525 1527 -1529 3 584.3689 513.4661 19.62 0.1271 1528 -1530 3 584.5646 512.3381 19.6116 0.1144 1529 -1531 3 584.9272 511.2708 19.6057 0.1271 1530 -1532 3 585.4042 510.2343 19.6019 0.1398 1531 -1533 3 585.8916 509.2058 19.6001 0.1525 1532 -1534 3 586.4178 508.1923 19.6 0.1398 1533 -1535 3 587.0379 507.2507 19.6 0.1271 1534 -1536 3 587.9863 506.6707 19.6 0.1398 1535 -1537 3 588.8019 505.9489 19.6 0.1652 1536 -1538 3 589.6542 505.2121 19.6 0.1907 1537 -1539 3 590.7296 504.8952 19.6 0.1652 1538 -1540 3 591.8553 504.695 19.6 0.1525 1539 -1541 3 592.4959 503.8473 19.6 0.1398 1540 -1542 3 593.1262 502.8932 19.6 0.1525 1541 -1543 3 593.6925 501.9003 19.6 0.1398 1542 -1544 3 594.6821 501.3363 19.6 0.1525 1543 -1545 3 595.7952 501.072 19.6 0.1907 1544 -1546 3 571.1981 509.2573 25.3975 0.2415 1490 -1547 3 572.0812 508.6544 24.6505 0.2161 1546 -1548 3 573.0674 508.1408 24.2391 0.2034 1547 -1549 3 574.1095 507.7335 24.0326 0.2034 1548 -1550 3 575.2307 507.5207 23.9246 0.2288 1549 -1551 3 576.1459 506.9442 23.859 0.2415 1550 -1552 3 576.7613 506.4225 23.5821 0.2161 1551 -1553 3 577.2761 505.5233 23.2401 0.178 1552 -1554 3 577.847 504.5692 23.0335 0.1525 1553 -1555 3 578.6329 503.908 23.0569 0.178 1554 -1556 3 579.452 503.2193 23.2073 0.2034 1555 -1557 3 580.3134 502.5672 23.2321 0.2415 1556 -1558 3 581.2138 502.0032 23.0722 0.2415 1557 -1559 3 582.1713 501.4369 22.7998 0.2415 1558 -1560 3 583.1471 500.8649 22.4538 0.2161 1559 -1561 3 584.1882 500.4085 22.0923 0.2034 1560 -1562 3 585.259 500.0138 21.762 0.1907 1561 -1563 3 586.3755 499.8582 21.4986 0.2034 1562 -1564 3 587.5172 499.7999 21.2872 0.2161 1563 -1565 3 588.4633 499.2828 21.0862 0.2161 1564 -1566 3 589.057 498.3447 20.8162 0.2034 1565 -1567 3 589.2183 497.2579 20.4586 0.178 1566 -1568 3 589.0822 496.1322 20.0717 0.1652 1567 -1569 3 588.922 495.0832 19.5759 0.1398 1568 -1570 3 589.0662 494.0982 18.9586 0.1271 1569 -1571 3 589.3099 493.0526 18.3427 0.1271 1570 -1572 3 589.9242 492.111 17.8577 0.1525 1571 -1573 3 590.6918 491.3366 17.4301 0.178 1572 -1574 3 591.1494 490.3562 17.2909 0.178 1573 -1575 3 591.774 489.4615 17.3888 0.1525 1574 -1576 3 592.6675 488.782 17.5993 0.1398 1575 -1577 3 593.7303 488.385 17.8328 0.1525 1576 -1578 3 594.769 487.9149 17.9709 0.178 1577 -1579 3 595.8707 487.6517 18.0013 0.1907 1578 -1580 3 596.9953 487.6529 17.9082 0.178 1579 -1581 3 598.129 487.7593 17.7848 0.1652 1580 -1582 3 599.2283 487.9526 17.7804 0.1398 1581 -1583 3 600.3529 487.8668 17.848 0.1398 1582 -1584 3 601.4202 487.4618 17.8911 0.1525 1583 -1585 3 602.5173 487.2456 17.9327 0.1907 1584 -1586 3 603.5836 487.6094 17.9858 0.2161 1585 -1587 3 604.4793 488.3175 18.0136 0.2161 1586 -1588 3 605.3156 489.0932 18.0058 0.2034 1587 -1589 3 606.2685 489.5016 17.9511 0.1907 1588 -1590 3 607.2695 489.0325 17.8152 0.2034 1589 -1591 3 608.1962 488.3908 17.7317 0.2034 1590 -1592 3 608.9832 487.6094 17.7191 0.1907 1591 -1593 3 609.7955 486.8464 17.6776 0.1525 1592 -1594 3 610.8468 486.4391 17.5762 0.1271 1593 -1595 3 611.9359 486.3739 17.3889 0.1144 1594 -1596 3 613.0307 486.4757 17.1487 0.1144 1595 -1597 3 614.1198 486.3361 16.8421 0.1144 1596 -1598 3 615.2375 486.0948 16.6173 0.1144 1597 -1599 3 616.354 485.8476 16.4862 0.1271 1598 -1600 3 617.4797 485.7275 16.4966 0.1525 1599 -1601 3 618.5951 485.668 16.9296 0.178 1600 -1602 4 549.3008 518.1714 38.7442 0.1525 1 -1603 4 549.0182 517.0628 38.7394 0.2034 1602 -1604 4 548.6018 516.0001 38.7327 0.2542 1603 -1605 4 548.1407 514.9522 38.7218 0.2415 1604 -1606 4 547.674 513.9077 38.7069 0.2288 1605 -1607 4 547.4566 512.7911 38.6918 0.2161 1606 -1608 4 547.2942 511.6586 38.6806 0.2288 1607 -1609 4 547.1592 510.5363 38.6212 0.2288 1608 -1610 4 547.1203 509.414 38.5106 0.2415 1609 -1611 4 546.7622 508.3456 38.4978 0.2542 1610 -1612 4 546.2749 508.7528 38.4804 0.178 1611 -1613 4 545.2144 508.4451 39.0102 0.178 1612 -1614 4 544.2649 508.182 39.3375 0.2034 1613 -1615 4 543.3245 507.6294 39.4876 0.2034 1614 -1616 4 542.296 507.1661 39.5654 0.2034 1615 -1617 4 541.2047 506.9098 39.6189 0.178 1616 -1618 4 540.1224 506.8835 39.7964 0.178 1617 -1619 4 539.0574 507.0059 40.0635 0.1652 1618 -1620 4 538.0003 507.3274 40.2478 0.1652 1619 -1621 4 537.0485 507.5345 40.5577 0.1398 1620 -1622 4 536.0166 507.6923 40.9984 0.1398 1621 -1623 4 534.8944 507.761 41.3837 0.1525 1622 -1624 4 533.7698 507.8193 41.6304 0.2034 1623 -1625 4 532.929 508.4142 41.9202 0.2415 1624 -1626 4 531.9623 508.7391 42.3231 0.2669 1625 -1627 4 530.8389 508.6876 42.6936 0.2415 1626 -1628 4 529.6983 508.6762 42.992 0.2161 1627 -1629 4 528.7065 509.0548 43.342 0.2034 1628 -1630 4 527.5831 509.1441 43.5117 0.2415 1629 -1631 4 526.4596 509.3202 43.5554 0.2669 1630 -1632 4 525.3591 509.5456 43.4795 0.2542 1631 -1633 4 524.2186 509.5284 43.3972 0.2161 1632 -1634 4 523.0951 509.4072 43.3882 0.2161 1633 -1635 4 521.9866 509.6085 43.4409 0.2796 1634 -1636 4 520.9524 510.0924 43.5226 0.3432 1635 -1637 4 519.8714 510.4574 43.5929 0.3813 1636 -1638 4 518.7468 510.6496 43.6246 0.3559 1637 -1639 4 517.6097 510.7262 43.6047 0.3432 1638 -1640 4 516.4691 510.7365 43.5621 0.3051 1639 -1641 4 515.364 510.8864 43.5632 0.2796 1640 -1642 4 514.4454 511.2513 43.7063 0.2288 1641 -1643 4 513.5565 511.9366 43.7296 0.2161 1642 -1644 4 512.5589 512.4823 43.6814 0.2288 1643 -1645 4 511.5991 513.0966 43.5988 0.2415 1644 -1646 4 510.6644 513.7098 43.4465 0.2542 1645 -1647 4 509.5891 513.8837 43.2172 0.2542 1646 -1648 4 508.4577 513.7521 43.0013 0.2669 1647 -1649 4 507.3514 513.704 42.8061 0.2542 1648 -1650 4 506.3767 514.0793 42.637 0.2669 1649 -1651 4 505.3826 514.5723 42.5986 0.2796 1650 -1652 4 504.4662 515.1077 42.7619 0.3305 1651 -1653 4 503.5957 515.6111 43.1715 0.3305 1652 -1654 4 502.5363 515.9246 43.6262 0.3559 1653 -1655 4 501.4129 515.9989 44.098 0.3305 1654 -1656 4 500.3547 515.6717 44.5785 0.3432 1655 -1657 4 499.3297 515.6672 45.1119 0.3305 1656 -1658 4 498.2509 515.9143 45.586 0.3686 1657 -1659 4 497.1527 516.2174 45.932 0.4195 1658 -1660 4 496.0292 516.4268 46.1614 0.4576 1659 -1661 4 494.9241 516.6887 46.247 0.4703 1660 -1662 4 493.8362 517.0068 46.2129 0.4322 1661 -1663 4 492.7002 517.0228 46.1574 0.394 1662 -1664 4 491.5619 516.9256 46.0981 0.3432 1663 -1665 4 490.4225 516.9141 46.0401 0.3051 1664 -1666 4 489.2945 516.9427 46.0967 0.2924 1665 -1667 4 488.2478 517.3362 46.128 0.2796 1666 -1668 4 487.336 517.9986 46.2678 0.3051 1667 -1669 4 486.2263 518.073 46.5136 0.2924 1668 -1670 4 485.2345 518.6427 46.7407 0.2796 1669 -1671 4 483.9566 518.0604 47.2928 0.3305 1670 -1672 4 482.9522 517.5399 47.5054 0.3432 1671 -1673 4 481.9809 516.9393 47.5955 0.3305 1672 -1674 4 480.9696 516.421 47.6588 0.3305 1673 -1675 4 479.8886 516.0824 47.6773 0.3178 1674 -1676 4 478.8452 515.6534 47.7036 0.2796 1675 -1677 4 477.8946 515.0345 47.7974 0.2669 1676 -1678 4 476.937 514.4522 47.973 0.2161 1677 -1679 4 475.9429 513.942 48.2272 0.2034 1678 -1680 4 475.0151 513.3094 48.4652 0.1652 1679 -1681 4 474.1251 512.5932 48.6354 0.178 1680 -1682 4 473.1813 511.9572 48.7782 0.178 1681 -1683 4 472.17 511.4412 48.9224 0.2034 1682 -1684 4 471.1141 511.034 49.0778 0.2034 1683 -1685 4 470.1314 510.4848 49.1938 0.2161 1684 -1686 4 469.2596 509.7607 49.2327 0.2034 1685 -1687 4 468.3136 509.1624 49.2831 0.2161 1686 -1688 4 467.2828 508.7025 49.3713 0.1907 1687 -1689 4 466.1834 508.5458 49.3892 0.178 1688 -1690 4 465.0806 508.389 49.4208 0.1525 1689 -1691 4 464.0613 507.9154 49.4449 0.1525 1690 -1692 4 463.2639 507.1569 49.3486 0.1525 1691 -1693 4 462.3327 506.5289 49.1868 0.1398 1692 -1694 4 461.2871 506.077 49.0028 0.1398 1693 -1695 4 460.1568 506.0061 48.837 0.1398 1694 -1696 4 459.1261 505.5656 48.6545 0.1652 1695 -1697 4 458.1995 504.9776 48.4067 0.1652 1696 -1698 4 457.1973 504.4399 48.2286 0.1652 1697 -1699 4 456.122 504.0544 48.1202 0.1398 1698 -1700 4 455.0901 503.5671 48.085 0.1271 1699 -1701 4 454.2092 502.8601 48.1426 0.1144 1700 -1702 4 453.2928 502.1851 48.2552 0.1144 1701 -1703 4 452.333 501.5651 48.3818 0.1271 1702 -1704 4 451.3469 500.9976 48.4411 0.1525 1703 -1705 4 450.355 500.4714 48.41 0.178 1704 -1706 4 449.338 499.9566 48.4123 0.2034 1705 -1707 4 448.3256 499.4498 48.4806 0.2161 1706 -1708 4 447.4344 498.7417 48.5862 0.2288 1707 -1709 4 446.5741 497.9924 48.7206 0.2034 1708 -1710 4 445.898 497.0714 48.8538 0.1907 1709 -1711 4 445.2402 496.1356 48.9782 0.178 1710 -1712 4 444.7094 495.1232 49.0818 0.2034 1711 -1713 4 444.0882 494.1634 49.1742 0.1907 1712 -1714 4 443.1764 493.5159 49.3326 0.1907 1713 -1715 4 442.1228 493.1441 49.5499 0.1652 1714 -1716 4 441.6115 492.8878 49.7162 0.1144 1715 -1717 4 440.5887 492.3765 49.8333 0.1144 1716 -1718 4 439.5648 491.8651 49.9038 0.1144 1717 -1719 4 438.5421 491.3537 49.9324 0.1144 1718 -1720 4 437.54 490.8046 49.9142 0.1144 1719 -1721 4 436.5653 490.2097 49.8588 0.1144 1720 -1722 4 435.53 489.7613 49.7904 0.1144 1721 -1723 4 434.4226 489.4867 49.7199 0.1144 1722 -1724 4 433.3506 489.1206 49.6913 0.1144 1723 -1725 4 432.3279 488.6287 49.74 0.1144 1724 -1726 4 431.3429 488.0624 49.8221 0.1144 1725 -1727 4 430.3854 487.4355 49.8968 0.1144 1726 -1728 4 429.4828 486.7388 49.9576 0.1144 1727 -1729 4 428.6316 485.9735 50.0004 0.1144 1728 -1730 4 427.8366 485.1544 50.0226 0.1144 1729 -1731 4 427.0918 484.2861 50.0273 0.1144 1730 -1732 4 426.4203 483.3629 50.0265 0.1144 1731 -1733 4 425.8185 482.3905 50.0254 0.1144 1732 -1734 4 425.2328 481.4078 50.0223 0.1144 1733 -1735 4 424.6608 480.4171 50.015 0.1144 1734 -1736 4 424.0533 479.4493 50.0021 0.1271 1735 -1737 4 423.3509 478.5718 50.0304 0.1525 1736 -1738 4 422.9391 477.572 50.0181 0.178 1737 -1739 4 422.5639 476.5057 49.9355 0.1907 1738 -1740 4 422.0696 475.4739 49.8243 0.1907 1739 -1741 4 421.5571 474.4511 49.6933 0.2034 1740 -1742 4 420.9485 473.5096 49.4816 0.2034 1741 -1743 4 420.2438 472.6402 49.1873 0.1907 1742 -1744 4 419.3835 471.9069 48.8947 0.1525 1743 -1745 4 418.4569 471.2388 48.6186 0.1271 1744 -1746 4 417.5417 470.5798 48.3098 0.1271 1745 -1747 4 416.6608 469.8717 47.9872 0.1525 1746 -1748 4 415.8417 469.0778 47.7089 0.2034 1747 -1749 4 414.97 468.3456 47.4583 0.2415 1748 -1750 4 413.9964 467.777 47.1915 0.2669 1749 -1751 4 413.111 467.2462 46.8188 0.2542 1750 -1752 4 412.2015 466.6182 46.4864 0.2415 1751 -1753 4 411.2154 466.1434 46.3529 0.2161 1752 -1754 4 410.3414 465.4192 46.2493 0.2288 1753 -1755 4 409.2088 465.2648 46.2 0.2542 1754 -1756 4 441.5451 492.8123 51.24 0.1144 1715 -1757 4 440.8393 491.92 51.3299 0.1144 1756 -1758 4 440.13 491.0654 51.3654 0.1144 1757 -1759 4 439.725 490.0027 51.4167 0.1144 1758 -1760 4 439.2159 488.9845 51.4884 0.1144 1759 -1761 4 438.7046 487.9938 51.585 0.1144 1760 -1762 4 437.9381 487.1484 51.711 0.1144 1761 -1763 4 437.2734 486.2332 51.9058 0.1144 1762 -1764 4 436.4966 485.4827 52.2301 0.1144 1763 -1765 4 435.737 484.6876 52.591 0.1144 1764 -1766 4 435.1387 483.7312 52.9659 0.1144 1765 -1767 4 434.6159 482.7646 53.3971 0.1144 1766 -1768 4 433.6835 482.3047 53.7818 0.1144 1767 -1769 4 432.9914 481.5542 54.1682 0.1144 1768 -1770 4 431.9721 481.1973 54.462 0.1144 1769 -1771 4 430.8533 480.9593 54.6616 0.1144 1770 -1772 4 429.7413 480.6916 54.7848 0.1144 1771 -1773 4 428.603 480.6024 54.8481 0.1144 1772 -1774 4 427.856 479.7936 54.88 0.1144 1773 -1775 4 484.3044 519.6105 47.0798 0.2161 1670 -1776 4 483.364 520.1757 47.4099 0.1907 1775 -1777 4 482.2303 520.2226 47.6694 0.178 1776 -1778 4 481.1103 520.0201 47.805 0.2161 1777 -1779 4 480.027 519.6689 47.8663 0.2415 1778 -1780 4 478.9859 519.1941 47.8993 0.2669 1779 -1781 4 477.93 518.7537 47.9125 0.2796 1780 -1782 4 476.8535 518.367 47.9363 0.2796 1781 -1783 4 475.7541 518.0718 47.9872 0.2796 1782 -1784 4 474.6159 517.9609 48.071 0.2288 1783 -1785 4 473.481 517.8613 48.1936 0.1907 1784 -1786 4 472.3565 517.8007 48.3916 0.1652 1785 -1787 4 471.2319 517.7996 48.6279 0.2034 1786 -1788 4 470.0971 517.9449 48.8261 0.2542 1787 -1789 4 468.9634 518.0844 48.9989 0.3051 1788 -1790 4 467.8342 518.192 49.1856 0.3178 1789 -1791 4 466.7074 518.2743 49.3861 0.2924 1790 -1792 4 465.5737 518.3201 49.525 0.2415 1791 -1793 4 464.4491 518.3121 49.5642 0.1907 1792 -1794 4 463.3131 518.2743 49.6138 0.178 1793 -1795 4 462.1874 518.2137 49.7395 0.178 1794 -1796 4 461.0583 518.2331 49.8974 0.1907 1795 -1797 4 459.9258 518.3979 50.0374 0.178 1796 -1798 4 458.792 518.5226 50.1836 0.1652 1797 -1799 4 457.6595 518.5317 50.3653 0.1525 1798 -1800 4 456.5315 518.4917 50.5618 0.1525 1799 -1801 4 455.3932 518.4722 50.7214 0.1398 1800 -1802 4 454.2492 518.4677 50.8175 0.1525 1801 -1803 4 453.1121 518.4116 50.8452 0.1652 1802 -1804 4 451.9875 518.2629 50.7858 0.1907 1803 -1805 4 450.8596 518.121 50.6792 0.1652 1804 -1806 4 449.7247 517.994 50.5778 0.1398 1805 -1807 4 448.5887 517.8659 50.5098 0.1271 1806 -1808 4 447.4516 517.7607 50.4988 0.1525 1807 -1809 4 446.3156 517.8099 50.5557 0.178 1808 -1810 4 445.2986 518.1759 50.7338 0.178 1809 -1811 4 444.3891 518.709 51.0521 0.1525 1810 -1812 4 443.3378 519.1014 51.38 0.1271 1811 -1813 4 442.2532 519.4538 51.6359 0.1144 1812 -1814 4 441.147 519.7352 51.7784 0.1144 1813 -1815 4 440.0293 519.956 51.8028 0.1271 1814 -1816 4 438.9128 520.1699 51.7194 0.1398 1815 -1817 4 437.7962 520.3781 51.5673 0.1525 1816 -1818 4 436.674 520.5886 51.4186 0.1398 1817 -1819 4 435.5494 520.7957 51.3097 0.1398 1818 -1820 4 434.4157 520.9135 51.2414 0.1398 1819 -1821 4 433.2717 520.9135 51.2075 0.1525 1820 -1822 4 432.1277 520.8884 51.1994 0.1398 1821 -1823 4 430.9951 520.7557 51.207 0.1398 1822 -1824 4 429.8763 520.5189 51.2218 0.1398 1823 -1825 4 428.7666 520.2432 51.2434 0.1525 1824 -1826 4 427.673 519.908 51.2747 0.1398 1825 -1827 4 426.5587 519.6906 51.3173 0.1271 1826 -1828 4 425.4181 519.7158 51.3699 0.1398 1827 -1829 4 424.2799 519.7421 51.4444 0.178 1828 -1830 4 423.1587 519.6231 51.585 0.2288 1829 -1831 4 422.0388 519.5407 51.786 0.2288 1830 -1832 4 420.9154 519.5407 51.9347 0.2161 1831 -1833 4 419.8183 519.6849 51.9893 0.2034 1832 -1834 4 418.7555 519.9835 52.1108 0.2161 1833 -1835 4 417.7202 520.3278 52.365 0.2161 1834 -1836 4 416.6551 520.6538 52.6834 0.178 1835 -1837 4 415.5386 520.8174 53.011 0.1652 1836 -1838 4 414.4014 520.7591 53.3123 0.1652 1837 -1839 4 413.2643 520.6447 53.5749 0.1907 1838 -1840 4 412.1214 520.6092 53.7986 0.1652 1839 -1841 4 410.9774 520.6092 54.0036 0.1652 1840 -1842 4 409.8655 520.7705 54.264 0.178 1841 -1843 4 408.7729 521.0417 54.6014 0.2415 1842 -1844 4 407.6999 521.3952 54.9906 0.2542 1843 -1845 4 406.6268 521.7075 55.4417 0.2415 1844 -1846 4 405.5503 521.9843 55.9434 0.1907 1845 -1847 4 404.4749 522.26 56.4707 0.1652 1846 -1848 4 403.3858 522.5037 56.9926 0.1525 1847 -1849 4 402.259 522.5769 57.4596 0.1398 1848 -1850 4 401.1173 522.5769 57.8659 0.1271 1849 -1851 4 399.9756 522.5769 58.228 0.1271 1850 -1852 4 398.8339 522.5769 58.5651 0.1398 1851 -1853 4 397.7242 522.7302 58.9366 0.1525 1852 -1854 4 396.6362 522.9739 59.3684 0.1525 1853 -1855 4 395.5506 523.2244 59.8522 0.1652 1854 -1856 4 394.4706 523.5001 60.3686 0.1907 1855 -1857 4 393.4182 523.8639 60.8916 0.2034 1856 -1858 4 392.376 524.2655 61.3992 0.1907 1857 -1859 4 391.3338 524.6659 61.8733 0.1652 1858 -1860 4 390.2642 525.0274 62.2782 0.1525 1859 -1861 4 389.1613 525.3156 62.573 0.1652 1860 -1862 4 388.0471 525.5776 62.7637 0.1652 1861 -1863 4 386.934 525.8396 62.876 0.178 1862 -1864 4 385.8197 526.1016 62.9331 0.178 1863 -1865 4 384.8565 525.6909 62.9633 0.1907 1864 -1866 4 383.8051 525.2665 62.9779 0.178 1865 -1867 4 382.8087 524.7139 62.9868 0.1525 1866 -1868 4 381.6967 524.5046 62.9933 0.1271 1867 -1869 4 380.6832 523.9989 62.9975 0.1144 1868 -1870 4 379.6295 523.5573 62.9997 0.1144 1869 -1871 4 378.6262 523.0093 63.0 0.1144 1870 -1872 4 377.8037 522.2223 63.0 0.1144 1871 -1873 4 377.5989 521.1103 63.0 0.1144 1872 -1874 4 376.4904 520.8632 63.0 0.1144 1873 -1875 4 546.5929 507.1444 38.6025 0.2288 1611 -1876 4 546.5357 506.0495 38.7671 0.2161 1875 -1877 4 546.2188 504.9582 38.8699 0.2161 1876 -1878 4 545.9717 503.8519 38.9178 0.1907 1877 -1879 4 545.9145 502.7148 38.9494 0.178 1878 -1880 4 546.0712 501.5914 38.9922 0.1525 1879 -1881 4 545.9122 500.5286 39.0547 0.1525 1880 -1882 4 545.5793 499.459 39.0785 0.178 1881 -1883 4 545.4192 498.3413 39.069 0.2161 1882 -1884 4 545.1743 497.2785 39.1636 0.2796 1883 -1885 4 545.1412 496.2695 39.433 0.3178 1884 -1886 4 545.275 495.1838 39.646 0.3432 1885 -1887 4 545.3276 494.0456 39.8124 0.3305 1886 -1888 4 545.4912 492.9164 39.9515 0.2924 1887 -1889 4 545.4626 491.777 40.0008 0.2415 1888 -1890 4 545.3562 490.641 39.9809 0.2034 1889 -1891 4 545.0943 489.5268 39.9434 0.2161 1890 -1892 4 544.8323 488.4136 39.9202 0.2415 1891 -1893 4 544.7694 488.9525 40.6241 0.2415 1892 -1894 4 544.536 489.7556 42.7512 0.2542 1893 -1895 4 543.9045 489.8894 43.741 0.2288 1894 -1896 4 543.098 490.3459 44.8126 0.2161 1895 -1897 4 542.0455 490.768 45.7159 0.2034 1896 -1898 4 540.9404 491.0231 46.424 0.1907 1897 -1899 4 539.8444 491.0563 47.0406 0.1652 1898 -1900 4 538.713 491.0094 47.4796 0.1525 1899 -1901 4 537.6731 490.6101 47.7898 0.1652 1900 -1902 4 536.933 489.7636 48.0231 0.178 1901 -1903 4 536.4113 488.8232 48.2269 0.2034 1902 -1904 4 535.837 487.892 48.3297 0.2161 1903 -1905 4 534.9241 487.3005 48.449 0.2161 1904 -1906 4 533.8282 487.1667 48.673 0.2034 1905 -1907 4 532.7791 486.9127 49.0358 0.178 1906 -1908 4 531.6877 486.6542 49.4539 0.178 1907 -1909 4 530.5655 486.6656 49.9248 0.178 1908 -1910 4 529.5427 486.2961 50.3642 0.1907 1909 -1911 4 528.8575 485.4964 50.913 0.178 1910 -1912 4 527.8565 485.1338 51.5236 0.178 1911 -1913 4 526.971 484.889 52.3292 0.1907 1912 -1914 4 525.8762 484.8878 53.1482 0.2161 1913 -1915 4 525.0205 485.5742 53.9554 0.2161 1914 -1916 4 524.4382 486.1428 54.9035 0.2161 1915 -1917 4 523.5196 486.6759 55.7673 0.2288 1916 -1918 4 522.5964 487.32 56.4558 0.2415 1917 -1919 4 521.5771 487.7147 56.9895 0.2161 1918 -1920 4 520.4868 487.7581 57.3566 0.1907 1919 -1921 4 519.5842 487.2605 57.7338 0.2161 1920 -1922 4 518.6988 486.8326 57.9751 0.2924 1921 -1923 4 517.827 487.241 58.2274 0.3559 1922 -1924 4 516.9198 487.8233 58.5864 0.3559 1923 -1925 4 515.8548 487.8531 58.7672 0.3178 1924 -1926 4 514.7634 487.821 59.0657 0.2669 1925 -1927 4 513.8082 487.328 59.4507 0.2288 1926 -1928 4 512.6722 487.3429 59.8175 0.2034 1927 -1929 4 511.5785 487.3337 60.1644 0.178 1928 -1930 4 510.6347 487.805 60.4629 0.1652 1929 -1931 4 509.5731 487.8485 60.6707 0.1525 1930 -1932 4 508.5114 488.1345 60.8684 0.1652 1931 -1933 4 507.4075 488.1848 60.9988 0.1907 1932 -1934 4 506.2761 488.0418 61.1148 0.2161 1933 -1935 4 505.1469 488.0018 61.2752 0.2415 1934 -1936 4 504.0224 487.9034 61.4908 0.2415 1935 -1937 4 502.9424 487.5854 61.7515 0.2415 1936 -1938 4 501.8854 487.4092 62.0992 0.2161 1937 -1939 4 500.7837 487.4698 62.5008 0.2034 1938 -1940 4 499.8422 487.1186 62.7514 0.1907 1939 -1941 4 498.7977 486.8406 62.8944 0.1907 1940 -1942 4 497.7738 486.7068 63.1834 0.2161 1941 -1943 4 496.8598 486.0936 63.4928 0.2415 1942 -1944 4 496.2947 485.1796 63.8826 0.2669 1943 -1945 4 495.5819 484.2975 64.2485 0.2542 1944 -1946 4 494.8315 483.4407 64.5882 0.2288 1945 -1947 4 494.1794 482.5152 64.8592 0.1907 1946 -1948 4 493.2196 482.0988 65.1146 0.178 1947 -1949 4 492.2815 482.5655 65.3918 0.1907 1948 -1950 4 491.4567 482.5426 65.5351 0.1144 1949 -1951 4 490.3436 482.4202 65.6001 0.1144 1950 -1952 4 489.2808 482.0175 65.6939 0.1144 1951 -1953 4 488.2306 481.5851 65.8095 0.1144 1952 -1954 4 487.1587 481.1858 65.9008 0.1271 1953 -1955 4 486.0764 480.8152 65.9781 0.1525 1954 -1956 4 484.9702 480.5246 66.0593 0.178 1955 -1957 4 483.864 480.2398 66.143 0.178 1956 -1958 4 482.792 479.8577 66.2497 0.1525 1957 -1959 4 481.7647 479.3738 66.3919 0.1271 1958 -1960 4 480.7454 478.8612 66.514 0.1144 1959 -1961 4 479.7387 478.3327 66.6058 0.1144 1960 -1962 4 478.7262 477.8099 66.745 0.1144 1961 -1963 4 477.7047 477.318 66.9477 0.1144 1962 -1964 4 476.6293 476.9897 67.1924 0.1144 1963 -1965 4 475.5871 476.6899 67.4419 0.1144 1964 -1966 4 474.9533 475.8079 67.7564 0.1144 1965 -1967 4 474.6124 474.7703 68.1514 0.1144 1966 -1968 4 474.045 473.8116 68.5524 0.1144 1967 -1969 4 473.3723 472.9102 68.9352 0.1144 1968 -1970 4 472.631 472.0647 69.2524 0.1144 1969 -1971 4 471.7112 471.3863 69.4756 0.1144 1970 -1972 4 471.0351 470.5272 69.6119 0.1144 1971 -1973 4 470.4242 469.58 69.6819 0.1144 1972 -1974 4 469.7092 468.6888 69.7119 0.1144 1973 -1975 4 468.9908 467.7999 69.7194 0.1144 1974 -1976 4 468.4268 466.8115 69.72 0.1144 1975 -1977 4 467.4773 466.2509 69.72 0.1144 1976 -1978 4 466.6056 465.5176 69.72 0.1398 1977 -1979 4 465.4936 465.2648 69.72 0.1907 1978 -1980 4 491.6489 482.8103 65.8801 0.1398 1949 -1981 4 490.8595 482.3241 65.333 0.1525 1980 -1982 4 490.8069 481.2087 65.1392 0.1907 1981 -1983 4 490.3745 480.1665 64.9544 0.2415 1982 -1984 4 489.727 479.2525 64.7651 0.2415 1983 -1985 4 489.02 478.3544 64.6755 0.2034 1984 -1986 4 488.2786 477.5079 64.7469 0.178 1985 -1987 4 487.5293 476.7906 65.0387 0.178 1986 -1988 4 486.5558 476.2014 65.3324 0.178 1987 -1989 4 485.5536 475.65 65.5827 0.1525 1988 -1990 4 484.5206 475.1593 65.7731 0.1271 1989 -1991 4 483.4807 474.6822 65.9504 0.1144 1990 -1992 4 544.679 487.4184 39.9297 0.1525 1892 -1993 4 544.5051 486.2892 39.9655 0.1398 1992 -1994 4 544.2774 485.1681 40.0092 0.1398 1993 -1995 4 544.0075 484.0573 40.0392 0.1398 1994 -1996 4 543.9159 482.9167 40.0389 0.1652 1995 -1997 4 543.9159 481.775 40.0089 0.1652 1996 -1998 4 543.9159 480.6322 39.9585 0.1652 1997 -1999 4 542.8291 481.5965 39.2384 0.1907 1998 -2000 4 542.0123 481.5096 38.817 0.178 1999 -2001 4 541.1612 480.7568 38.645 0.1652 2000 -2002 4 540.3272 479.9801 38.4796 0.178 2001 -2003 4 539.6385 479.0809 38.2824 0.1652 2002 -2004 4 538.9819 478.16 38.0369 0.1652 2003 -2005 4 538.1994 477.3409 37.774 0.1652 2004 -2006 4 537.3848 476.5401 37.529 0.178 2005 -2007 4 536.5715 475.7381 37.2949 0.1907 2006 -2008 4 535.7375 474.9613 37.0289 0.1652 2007 -2009 4 535.2879 474.0153 36.6621 0.1398 2008 -2010 4 535.217 473.012 36.1438 0.1271 2009 -2011 4 534.8795 471.9995 35.6174 0.1398 2010 -2012 4 534.1874 471.1049 35.1954 0.1525 2011 -2013 4 533.6909 470.0948 34.844 0.1525 2012 -2014 4 533.3042 469.0183 34.5587 0.1652 2013 -2015 4 532.9724 467.9395 34.2583 0.178 2014 -2016 4 532.6361 466.8675 33.9074 0.178 2015 -2017 4 532.1819 465.8437 33.488 0.1525 2016 -2018 4 531.7461 464.8118 33.0019 0.1271 2017 -2019 4 531.4761 463.7307 32.4657 0.1144 2018 -2020 4 531.3033 462.6279 31.8993 0.1144 2019 -2021 4 531.3239 461.5125 31.3309 0.1144 2020 -2022 4 531.404 460.3925 30.7737 0.1144 2021 -2023 4 531.3216 459.284 30.2179 0.1271 2022 -2024 4 530.8332 458.307 29.657 0.1525 2023 -2025 4 530.9155 457.2579 29.0802 0.1907 2024 -2026 4 531.3972 456.2306 28.6152 0.2288 2025 -2027 4 531.9074 455.2159 28.2111 0.2415 2026 -2028 4 531.4429 454.2732 27.785 0.2542 2027 -2029 4 530.3161 454.0788 27.467 0.2288 2028 -2030 4 529.1915 453.8671 27.2276 0.2161 2029 -2031 4 528.0818 453.5903 27.0374 0.178 2030 -2032 4 526.9733 453.3386 26.8599 0.1907 2031 -2033 4 526.1485 452.5778 26.6185 0.2034 2032 -2034 4 525.4701 451.6947 26.3113 0.2288 2033 -2035 4 524.5537 451.0106 26.02 0.2034 2034 -2036 4 523.6031 450.3917 25.7374 0.1907 2035 -2037 4 522.5964 450.0862 25.4466 0.1652 2036 -2038 4 522.681 449.0566 25.0296 0.1907 2037 -2039 4 522.5769 448.5018 24.4814 0.1907 2038 -2040 4 521.6194 448.7454 23.9956 0.2034 2039 -2041 4 520.8369 449.5394 23.5068 0.178 2040 -2042 4 519.8622 449.7053 23.0097 0.178 2041 -2043 4 518.8006 449.3254 22.5536 0.178 2042 -2044 4 517.7538 448.909 22.1317 0.178 2043 -2045 4 516.7883 448.3553 21.7209 0.1525 2044 -2046 4 515.9818 447.5957 21.3039 0.1398 2045 -2047 4 515.2439 446.7354 20.9499 0.1525 2046 -2048 4 514.5254 445.8465 20.6891 0.1907 2047 -2049 4 513.6812 445.0846 20.5045 0.2034 2048 -2050 4 512.9993 444.1855 20.3766 0.2034 2049 -2051 4 512.8335 443.0872 20.2799 0.2034 2050 -2052 4 513.2281 442.0439 20.1846 0.2415 2051 -2053 4 513.8368 441.0761 20.0684 0.2796 2052 -2054 4 514.5678 440.2009 19.9252 0.2796 2053 -2055 4 515.3709 439.3875 19.7489 0.2415 2054 -2056 4 516.1556 438.9402 19.3576 0.1907 2055 -2057 4 516.2071 438.1657 18.7802 0.1652 2056 -2058 4 515.6031 437.2425 18.3919 0.1525 2057 -2059 4 515.9875 436.2312 18.1933 0.1525 2058 -2060 4 543.996 480.1528 39.9204 0.2796 1998 -2061 4 544.1848 479.0248 39.9 0.3051 2060 -2062 4 544.3713 477.8957 39.8997 0.3051 2061 -2063 4 544.2111 476.7643 39.9218 0.3051 2062 -2064 4 544.0464 475.6317 39.9675 0.2924 2063 -2065 4 543.8565 474.5037 40.035 0.2924 2064 -2066 4 543.6448 473.3792 40.1223 0.2924 2065 -2067 4 543.4389 472.2546 40.2427 0.3051 2066 -2068 4 543.2799 471.1472 40.4662 0.2796 2067 -2069 4 543.1792 470.0273 40.7515 0.2542 2068 -2070 4 543.305 468.8913 41.0242 0.2161 2069 -2071 4 543.4309 467.7564 41.2768 0.2161 2070 -2072 4 543.5258 466.6376 41.5582 0.2161 2071 -2073 4 543.6116 465.5268 41.8603 0.2288 2072 -2074 4 544.6218 464.7992 41.3468 0.2034 2073 -2075 4 545.3219 463.9114 40.9335 0.2161 2074 -2076 4 546.2783 463.288 40.7792 0.2161 2075 -2077 4 547.4223 463.2445 40.616 0.2288 2076 -2078 4 548.5652 463.2353 40.423 0.2415 2077 -2079 4 549.6714 463.0523 40.1372 0.2415 2078 -2080 4 550.6392 462.5169 39.7872 0.2288 2079 -2081 4 551.1884 461.5148 39.459 0.2034 2080 -2082 4 551.6986 460.5138 39.0754 0.1907 2081 -2083 4 552.2935 459.7439 38.5563 0.2034 2082 -2084 4 553.3654 459.9692 38.0579 0.1907 2083 -2085 4 554.3069 460.5 37.7087 0.178 2084 -2086 4 554.9258 461.3134 37.2548 0.1525 2085 -2087 4 555.3903 461.9712 36.7094 0.178 2086 -2088 4 556.3043 461.5685 36.1827 0.2161 2087 -2089 4 556.9701 460.6808 35.7064 0.2415 2088 -2090 4 557.8441 460.1099 35.2685 0.2288 2089 -2091 4 558.8989 459.7496 34.858 0.2161 2090 -2092 4 559.9159 459.308 34.6223 0.2288 2091 -2093 4 560.9387 459.3114 34.5657 0.2542 2092 -2094 4 561.8607 459.7919 34.4154 0.2415 2093 -2095 4 562.7164 460.1523 34.0192 0.2161 2094 -2096 4 563.5893 460.7323 33.5689 0.1907 2095 -2097 4 564.6532 460.7712 33.1646 0.2034 2096 -2098 4 565.565 460.134 32.788 0.2161 2097 -2099 4 566.4848 459.4567 32.4402 0.2288 2098 -2100 4 567.5716 459.2199 32.0874 0.2161 2099 -2101 4 568.6298 459.4899 31.675 0.2161 2100 -2102 4 569.7314 459.5814 31.1942 0.2161 2101 -2103 4 570.157 460.3101 30.5046 0.2415 2102 -2104 4 570.4716 461.4095 29.9158 0.2542 2103 -2105 4 570.6009 462.5444 29.4157 0.2669 2104 -2106 4 570.9315 463.5774 29.0993 0.2669 2105 -2107 4 571.0448 464.4915 28.6415 0.2542 2106 -2108 4 571.6579 464.1654 27.932 0.2415 2107 -2109 4 572.5457 463.4905 27.2821 0.2161 2108 -2110 4 573.6291 463.3177 26.6268 0.1907 2109 -2111 4 574.6232 463.5717 25.8588 0.1652 2110 -2112 4 575.4961 464.0281 25.0109 0.1525 2111 -2113 4 576.3323 464.7672 24.2673 0.1525 2112 -2114 4 577.1514 465.5588 23.6494 0.1525 2113 -2115 4 578.0598 466.0702 23.038 0.1525 2114 -2116 4 578.8468 465.5199 22.4687 0.1525 2115 -2117 4 578.5197 464.782 21.9413 0.1398 2116 -2118 4 577.6262 464.6619 21.2945 0.1398 2117 -2119 4 577.7429 464.9937 20.4695 0.1525 2118 -2120 4 578.7393 464.7797 19.8071 0.1907 2119 -2121 4 579.8158 464.6264 19.4548 0.2034 2120 -2122 4 580.8923 464.8816 19.3115 0.2034 2121 -2123 4 581.9963 465.0829 19.3039 0.2034 2122 -2124 4 582.8325 465.8322 19.2672 0.2415 2123 -2125 4 583.6802 466.4031 18.8101 0.1525 2124 -2126 4 584.4696 467.0288 17.7782 0.178 2125 -2127 4 585.1457 467.9154 17.3778 0.178 2126 -2128 4 585.5095 468.992 17.0361 0.1525 2127 -2129 4 586.0163 469.9941 16.6928 0.1525 2128 -2130 4 586.9532 470.5615 15.9191 0.1652 2129 -2131 4 582.9515 465.3563 19.0995 0.1271 2124 -2132 4 583.0911 464.3313 18.7623 0.1398 2131 -2133 4 583.551 463.5248 18.3808 0.1525 2132 -2134 4 584.5462 463.5534 17.9294 0.1398 2133 -2135 4 585.5976 463.8314 17.5842 0.1271 2134 -2136 4 586.5608 463.4504 17.4769 0.1144 2135 -2137 4 587.4943 463.5831 17.6355 0.1144 2136 -2138 4 588.1807 462.9699 17.9929 0.1144 2137 -2139 4 588.4221 461.8671 18.2925 0.1144 2138 -2140 4 589.2309 461.0984 18.4455 0.1144 2139 -2141 4 590.1587 460.492 18.1933 0.1144 2140 -2142 4 543.3417 464.6207 42.0445 0.1144 2073 -2143 4 543.1415 463.5053 42.1478 0.1271 2142 -2144 4 543.1655 462.3648 42.2162 0.1525 2143 -2145 4 543.2547 461.2242 42.2688 0.1907 2144 -2146 4 543.265 460.0825 42.3186 0.2034 2145 -2147 4 543.2009 458.9396 42.385 0.2034 2146 -2148 4 543.1357 457.8025 42.5009 0.1907 2147 -2149 4 543.0705 456.6711 42.681 0.1907 2148 -2150 4 542.9836 455.5408 42.8943 0.1907 2149 -2151 4 542.8486 454.4071 43.0956 0.178 2150 -2152 4 542.6839 453.2745 43.2648 0.178 2151 -2153 4 542.5832 452.1408 43.4283 0.1652 2152 -2154 4 542.5603 451.006 43.6083 0.178 2153 -2155 4 542.7388 449.902 43.764 0.178 2154 -2156 4 543.1609 448.8576 43.9228 0.2034 2155 -2157 4 543.2959 447.7662 44.0877 0.2034 2156 -2158 4 543.1174 446.6382 44.214 0.1907 2157 -2159 4 543.082 445.5079 44.296 0.1652 2158 -2160 4 543.2273 444.3754 44.3346 0.1525 2159 -2161 4 543.3703 443.2417 44.3674 0.1652 2160 -2162 4 543.4343 442.1182 44.4559 0.1652 2161 -2163 4 543.4526 440.9868 44.5802 0.178 2162 -2164 4 543.4583 439.8463 44.6751 0.1652 2163 -2165 4 543.4583 438.7034 44.7224 0.1907 2164 -2166 4 543.4583 437.5606 44.7348 0.1907 2165 -2167 4 543.4583 436.4188 44.7213 0.2288 2166 -2168 4 543.4583 435.2748 44.7042 0.2415 2167 -2169 4 543.4583 434.132 44.7216 0.2796 2168 -2170 4 543.4583 432.9891 44.7871 0.2669 2169 -2171 4 543.4286 431.8497 44.9033 0.2415 2170 -2172 4 543.3725 430.7137 45.0663 0.1907 2171 -2173 4 543.2982 429.5777 45.2519 0.1652 2172 -2174 4 543.1929 428.4394 45.4205 0.1398 2173 -2175 4 543.0728 427.3012 45.5557 0.1271 2174 -2176 4 543.011 426.1663 45.694 0.1144 2175 -2177 4 543.0007 425.036 45.864 0.1144 2176 -2178 4 542.9893 423.8978 46.0242 0.1271 2177 -2179 4 542.844 422.7904 46.0886 0.1652 2178 -2180 4 542.7594 421.6658 46.0984 0.2161 2179 -2181 4 542.9779 420.555 46.1255 0.2415 2180 -2182 4 543.5133 419.8423 46.366 0.2161 2181 -2183 4 543.7615 418.8035 46.5836 0.1652 2182 -2184 4 543.9388 417.6744 46.7365 0.1525 2183 -2185 4 544.1173 416.5453 46.8404 0.1907 2184 -2186 4 544.2946 415.4161 46.8955 0.2542 2185 -2187 4 544.4948 414.2904 46.9092 0.2669 2186 -2188 4 544.8437 413.2036 46.9168 0.2288 2187 -2189 4 545.219 412.1237 46.9622 0.1652 2188 -2190 4 545.5953 411.0438 47.0492 0.1398 2189 -2191 4 545.9706 409.9627 47.1727 0.1398 2190 -2192 4 546.2406 408.8622 47.3654 0.1525 2191 -2193 4 546.4625 407.7571 47.623 0.1398 2192 -2194 4 546.6787 406.652 47.92 0.1398 2193 -2195 4 546.8949 405.5469 48.2334 0.1525 2194 -2196 4 547.0185 404.4154 48.5111 0.178 2195 -2197 4 547.0505 403.2726 48.7144 0.178 2196 -2198 4 547.0688 402.1286 48.8452 0.1525 2197 -2199 4 547.0871 400.9857 48.9199 0.1271 2198 -2200 4 547.1066 399.8417 48.9563 0.1271 2199 -2201 4 547.1329 398.6977 48.9714 0.1525 2200 -2202 4 547.3605 397.58 48.9807 0.178 2201 -2203 4 547.6225 396.4658 48.9927 0.1907 2202 -2204 4 547.8845 395.3527 49.0092 0.1907 2203 -2205 4 548.1465 394.2384 49.0316 0.2161 2204 -2206 4 548.3638 393.1162 49.0641 0.2542 2205 -2207 4 548.4988 391.9802 49.1123 0.2924 2206 -2208 4 548.6201 390.843 49.177 0.3051 2207 -2209 4 548.7425 389.7059 49.2584 0.2924 2208 -2210 4 548.8637 388.5688 49.3562 0.2669 2209 -2211 4 549.0113 387.4362 49.4813 0.2161 2210 -2212 4 549.2069 386.3151 49.6507 0.1652 2211 -2213 4 549.4106 385.1974 49.8534 0.1271 2212 -2214 4 549.6142 384.0797 50.0755 0.1144 2213 -2215 4 549.7629 382.9517 50.2956 0.1271 2214 -2216 4 549.803 381.8123 50.4896 0.1525 2215 -2217 4 549.827 380.6706 50.6484 0.178 2216 -2218 4 549.851 379.5289 50.7693 0.178 2217 -2219 4 549.8728 378.386 50.8452 0.1652 2218 -2220 4 549.875 377.25 50.8306 0.178 2219 -2221 4 549.875 376.114 50.7483 0.2161 2220 -2222 4 549.875 374.9792 50.6293 0.2669 2221 -2223 4 549.875 373.8432 50.4997 0.2669 2222 -2224 4 550.0272 372.7129 50.4333 0.2415 2223 -2225 4 550.3052 371.6135 50.475 0.178 2224 -2226 4 550.5969 370.5176 50.6108 0.1398 2225 -2227 4 550.8898 369.4216 50.8119 0.1144 2226 -2228 4 551.1723 368.3177 51.0322 0.1271 2227 -2229 4 551.4366 367.2057 51.2252 0.1525 2228 -2230 4 551.6986 366.0914 51.3845 0.178 2229 -2231 4 551.9606 364.9783 51.5197 0.1907 2230 -2232 4 552.2225 363.8641 51.6454 0.1907 2231 -2233 4 552.3129 362.7338 51.8199 0.1907 2232 -2234 4 552.3198 361.6058 52.0579 0.1907 2233 -2235 4 552.3198 360.4778 52.344 0.178 2234 -2236 4 552.3198 359.3498 52.6568 0.1652 2235 -2237 4 552.218 358.2196 52.9586 0.1398 2236 -2238 4 551.8931 357.1271 53.1989 0.1271 2237 -2239 4 551.5464 356.0368 53.3758 0.1144 2238 -2240 4 551.1986 354.9466 53.5027 0.1398 2239 -2241 4 550.8509 353.8575 53.5945 0.1652 2240 -2242 4 550.9344 352.7249 53.6606 0.1907 2241 -2243 4 551.0957 351.5924 53.718 0.1652 2242 -2244 4 551.2604 350.461 53.7807 0.1398 2243 -2245 4 551.4252 349.3284 53.8549 0.1144 2244 -2246 4 551.5899 348.197 53.9445 0.1271 2245 -2247 4 551.4114 347.0804 54.0994 0.1398 2246 -2248 4 551.1941 345.9673 54.3096 0.1525 2247 -2249 4 550.9767 344.8554 54.5574 0.1398 2248 -2250 4 550.7582 343.7423 54.826 0.1271 2249 -2251 4 550.5843 342.6154 55.0785 0.1271 2250 -2252 4 550.4276 341.484 55.2997 0.1398 2251 -2253 4 550.272 340.3537 55.4842 0.1652 2252 -2254 4 550.1164 339.2223 55.638 0.178 2253 -2255 4 549.9963 338.0863 55.7617 0.1907 2254 -2256 4 550.0283 336.9435 55.844 0.1907 2255 -2257 4 550.0752 335.8006 55.8958 0.2034 2256 -2258 4 550.121 334.6578 55.9258 0.2161 2257 -2259 4 550.1679 333.5138 55.9404 0.2288 2258 -2260 4 550.137 332.3709 55.9454 0.2161 2259 -2261 4 550.081 331.228 55.9465 0.2161 2260 -2262 4 550.0238 330.0852 55.9474 0.2161 2261 -2263 4 549.9666 328.9435 55.9488 0.2288 2262 -2264 4 549.9094 327.8006 55.9507 0.2415 2263 -2265 4 549.795 326.6623 55.9532 0.2415 2264 -2266 4 549.6131 325.5332 55.9572 0.2415 2265 -2267 4 549.4254 324.4052 55.9622 0.2034 2266 -2268 4 549.2367 323.2761 55.9695 0.1907 2267 -2269 4 549.0491 322.1481 55.9796 0.1907 2268 -2270 4 548.8603 321.019 55.9938 0.2542 2269 -2271 4 548.6727 319.891 56.014 0.2924 2270 -2272 4 548.4839 318.763 56.042 0.3178 2271 -2273 4 548.2963 317.6339 56.0804 0.2924 2272 -2274 4 548.1087 316.5059 56.131 0.2796 2273 -2275 4 547.9291 315.3768 56.212 0.2542 2274 -2276 4 547.7564 314.2476 56.3276 0.2415 2275 -2277 4 547.5825 313.1197 56.4721 0.2542 2276 -2278 4 547.4086 311.9905 56.6401 0.2924 2277 -2279 4 547.2358 310.8614 56.826 0.3051 2278 -2280 4 547.0768 309.7369 57.0441 0.2796 2279 -2281 4 546.9189 308.6123 57.2816 0.2161 2280 -2282 4 546.7622 307.4889 57.5249 0.178 2281 -2283 4 546.6043 306.3643 57.7643 0.1398 2282 -2284 4 546.4316 305.2352 57.9667 0.1271 2283 -2285 4 546.2451 304.1072 58.109 0.1144 2284 -2286 4 546.0564 302.9792 58.1977 0.1144 2285 -2287 4 545.8688 301.8501 58.2462 0.1144 2286 -2288 4 545.6811 300.7221 58.2672 0.1144 2287 -2289 4 545.5324 299.5873 58.2725 0.1144 2288 -2290 4 545.4112 298.4502 58.2719 0.1144 2289 -2291 4 545.2922 297.3119 58.2708 0.1144 2290 -2292 4 545.1721 296.1747 58.2691 0.1144 2291 -2293 4 545.0519 295.0365 58.2669 0.1271 2292 -2294 4 544.8197 293.9176 58.2638 0.1398 2293 -2295 4 544.4868 292.8228 58.259 0.1525 2294 -2296 4 544.1459 291.7314 58.2526 0.1398 2295 -2297 4 543.805 290.6389 58.2442 0.1271 2296 -2298 4 543.4675 289.5464 58.2338 0.1144 2297 -2299 4 543.1918 288.4367 58.2126 0.1144 2298 -2300 4 542.9218 287.3248 58.1846 0.1144 2299 -2301 4 542.6518 286.2139 58.1538 0.1144 2300 -2302 4 542.4734 285.0837 58.1353 0.1144 2301 -2303 4 542.3487 283.9477 58.1347 0.1144 2302 -2304 4 542.2263 282.8105 58.1487 0.1144 2303 -2305 4 542.1038 281.6722 58.1742 0.1144 2304 -2306 4 541.9826 280.5351 58.2058 0.1144 2305 -2307 4 541.9357 279.3923 58.2344 0.1144 2306 -2308 4 541.9322 278.2483 58.2551 0.1144 2307 -2309 4 541.9322 277.1043 58.2683 0.1271 2308 -2310 4 541.9322 275.9603 58.2761 0.1398 2309 -2311 4 541.8842 274.8174 58.2806 0.1652 2310 -2312 4 541.8098 273.6757 58.2837 0.178 2311 -2313 4 541.732 272.5351 58.287 0.1907 2312 -2314 4 541.6554 271.3934 58.2921 0.178 2313 -2315 4 541.5788 270.2517 58.2988 0.1525 2314 -2316 4 541.4678 269.1134 58.308 0.1398 2315 -2317 4 541.3065 267.9809 58.3215 0.1525 2316 -2318 4 541.1417 266.8483 58.3402 0.178 2317 -2319 4 540.977 265.7169 58.3657 0.178 2318 -2320 4 540.8123 264.5843 58.3996 0.1525 2319 -2321 4 540.7162 263.4449 58.4514 0.1271 2320 -2322 4 540.7105 262.3032 58.5298 0.1271 2321 -2323 4 540.7105 261.1603 58.6289 0.1398 2322 -2324 4 540.7105 260.0175 58.7423 0.178 2323 -2325 4 540.7105 258.8758 58.8647 0.1907 2324 -2326 4 540.683 257.7329 58.9904 0.2034 2325 -2327 4 540.4222 256.6209 59.1002 0.1652 2326 -2328 4 540.1442 255.5113 59.1984 0.1398 2327 -2329 4 539.8673 254.4016 59.2931 0.1144 2328 -2330 4 539.7975 253.2644 59.4233 0.1271 2329 -2331 4 539.7941 252.1273 59.5913 0.1525 2330 -2332 4 539.7941 250.9902 59.787 0.178 2331 -2333 4 539.7941 249.853 59.999 0.178 2332 -2334 4 539.7941 248.7159 60.2134 0.1525 2333 -2335 4 539.6534 247.5822 60.3907 0.1271 2334 -2336 4 539.4452 246.4576 60.5161 0.1144 2335 -2337 4 539.2324 245.3331 60.6001 0.1271 2336 -2338 4 539.0208 244.2097 60.6561 0.1525 2337 -2339 4 538.808 243.0851 60.7009 0.178 2338 -2340 4 538.4614 241.996 60.7463 0.1907 2339 -2341 4 538.0804 240.9172 60.7981 0.1907 2340 -2342 4 538.0049 239.7778 60.8555 0.1907 2341 -2343 4 538.26 238.6693 60.9484 0.178 2342 -2344 4 539.0814 238.2288 61.2455 0.1525 2343 -2345 4 538.8309 237.1226 61.3928 0.1271 2344 -2346 4 538.5803 236.0164 61.4146 0.1144 2345 -2347 4 538.3309 234.9112 61.3351 0.1144 2346 -2348 4 538.0804 233.805 61.1783 0.1144 2347 -2349 4 537.8299 232.6965 60.9748 0.1144 2348 -2350 4 537.5885 231.5776 60.7919 0.1144 2349 -2351 4 537.346 230.4599 60.6687 0.1144 2350 -2352 4 537.1046 229.3423 60.5889 0.1271 2351 -2353 4 536.9959 228.2028 60.5357 0.1525 2352 -2354 4 536.9272 227.0611 60.4937 0.178 2353 -2355 4 536.8598 225.9194 60.4486 0.1907 2354 -2356 4 536.7923 224.7777 60.3901 0.178 2355 -2357 4 536.7065 223.6371 60.3061 0.178 2356 -2358 4 536.5577 222.5137 60.1642 0.178 2357 -2359 4 536.4079 221.3903 59.9844 0.2161 2358 -2360 4 536.258 220.2669 59.7867 0.2415 2359 -2361 4 536.0978 219.1389 59.6019 0.2669 2360 -2362 4 535.8851 218.0224 59.5151 0.2669 2361 -2363 4 535.6711 216.9047 59.5045 0.2669 2362 -2364 4 535.4584 215.7881 59.5426 0.2542 2363 -2365 4 535.2433 214.6705 59.6005 0.2288 2364 -2366 4 534.9527 213.5779 59.5529 0.1907 2365 -2367 4 534.6495 212.4946 59.3984 0.1652 2366 -2368 4 534.3475 211.4112 59.1595 0.1398 2367 -2369 4 534.0455 210.3278 58.8728 0.1271 2368 -2370 4 534.0318 209.1861 58.6312 0.1144 2369 -2371 4 534.0787 208.0433 58.4564 0.1144 2370 -2372 4 534.1279 206.8993 58.3506 0.1144 2371 -2373 4 534.1759 205.7564 58.2968 0.1144 2372 -2374 4 534.0878 204.6158 58.277 0.1144 2373 -2375 4 533.9242 203.4844 58.2739 0.1144 2374 -2376 4 533.7595 202.3519 58.2733 0.1398 2375 -2377 4 533.5948 201.2204 58.2728 0.1652 2376 -2378 4 533.43 200.0879 58.2719 0.1907 2377 -2379 4 533.4644 198.945 58.2705 0.1652 2378 -2380 4 533.5833 197.8068 58.2688 0.1398 2379 -2381 4 533.7035 196.6696 58.2663 0.1144 2380 -2382 4 533.8224 195.5313 58.263 0.1398 2381 -2383 4 533.9426 194.3942 58.2582 0.1907 2382 -2384 4 534.1496 193.2685 58.2515 0.2542 2383 -2385 4 534.4116 192.1554 58.242 0.2924 2384 -2386 4 534.6736 191.0411 58.2288 0.2796 2385 -2387 4 534.9355 189.928 58.2103 0.2669 2386 -2388 4 535.1975 188.8138 58.1851 0.2415 2387 -2389 4 535.0568 187.6789 58.1493 0.2669 2388 -2390 4 534.8921 186.5475 58.098 0.2542 2389 -2391 4 534.7273 185.4149 58.0269 0.2415 2390 -2392 4 534.5626 184.2835 57.9314 0.178 2391 -2393 4 534.3979 183.151 57.8091 0.1398 2392 -2394 4 534.7113 181.8949 57.5848 0.1144 2393 -2395 4 534.9859 180.7989 57.293 0.1144 2394 -2396 4 535.2593 179.703 56.9545 0.1144 2395 -2397 4 535.5339 178.6081 56.588 0.1271 2396 -2398 4 535.8084 177.5088 56.2192 0.1398 2397 -2399 4 536.0853 176.4048 55.8779 0.1525 2398 -2400 4 536.3621 175.2963 55.5772 0.1525 2399 -2401 4 536.639 174.1889 55.3008 0.1525 2400 -2402 4 536.9147 173.0815 55.0351 0.1525 2401 -2403 4 537.1709 171.9729 54.754 0.1398 2402 -2404 4 537.4066 170.8633 54.4373 0.1271 2403 -2405 4 537.6434 169.7536 54.0848 0.1144 2404 -2406 4 537.8791 168.6439 53.6992 0.1271 2405 -2407 4 538.1639 167.5525 53.2745 0.1398 2406 -2408 4 538.5151 166.4898 52.8024 0.178 2407 -2409 4 538.8835 165.435 52.295 0.1907 2408 -2410 4 539.253 164.3802 51.7678 0.2034 2409 -2411 4 539.4646 163.2968 51.2341 0.1652 2410 -2412 4 539.4887 162.1814 50.7063 0.1525 2411 -2413 4 539.4887 161.0649 50.197 0.1525 2412 -2414 4 539.5756 159.9461 49.7316 0.178 2413 -2415 4 539.8399 158.841 49.3455 0.178 2414 -2416 4 540.1876 157.7507 49.0364 0.1652 2415 -2417 4 540.5354 156.6616 48.7774 0.1652 2416 -2418 4 540.8901 155.5748 48.5405 0.178 2417 -2419 4 541.3053 154.5269 48.265 0.178 2418 -2420 4 541.7709 153.5145 47.9147 0.1652 2419 -2421 4 542.2366 152.5009 47.5048 0.1652 2420 -2422 4 542.7376 151.4976 47.0686 0.178 2421 -2423 4 543.3222 150.5264 46.6544 0.178 2422 -2424 4 543.9548 149.5769 46.2862 0.1525 2423 -2425 4 544.5875 148.6273 45.9609 0.1271 2424 -2426 4 545.3196 147.7648 45.6593 0.1144 2425 -2427 4 546.2154 147.0784 45.3547 0.1144 2426 -2428 4 547.1729 146.4766 45.0358 0.1144 2427 -2429 4 548.1304 145.8749 44.7028 0.1144 2428 -2430 4 549.0136 145.1702 44.3752 0.1144 2429 -2431 4 549.8098 144.3545 44.07 0.1144 2430 -2432 4 550.59 143.5217 43.7884 0.1144 2431 -2433 4 551.3691 142.6888 43.5271 0.1144 2432 -2434 4 552.1356 141.8514 43.2645 0.1144 2433 -2435 4 552.8929 141.0117 42.9884 0.1144 2434 -2436 4 553.6491 140.1709 42.7062 0.1144 2435 -2437 4 554.3412 139.2751 42.4393 0.1144 2436 -2438 4 554.8606 138.2661 42.2257 0.1398 2437 -2439 4 555.285 137.2034 42.0767 0.1652 2438 -2440 4 555.7106 136.1417 41.9801 0.1907 2439 -2441 4 556.119 135.0732 41.9208 0.1652 2440 -2442 4 556.2906 133.9601 41.8816 0.1398 2441 -2443 4 556.2906 132.8161 41.8471 0.1144 2442 -2444 4 556.3444 131.6744 41.8023 0.1144 2443 -2445 4 556.4668 130.5361 41.7388 0.1144 2444 -2446 4 556.8088 129.4608 41.652 0.1144 2445 -2447 4 557.4781 128.5478 41.5405 0.1144 2446 -2448 4 558.1965 127.6693 41.37 0.1144 2447 -2449 4 558.8257 126.7483 41.1051 0.1144 2448 -2450 4 559.3405 125.7988 40.7369 0.1144 2449 -2451 4 559.8828 124.8218 40.3819 0.1271 2450 -2452 4 560.4639 123.8369 40.1008 0.1398 2451 -2453 4 561.0451 122.8519 39.8916 0.1652 2452 -2454 4 561.5484 121.8268 39.7513 0.1652 2453 -2455 4 561.7223 120.7137 39.6743 0.178 2454 -2456 4 561.7601 119.5709 39.641 0.1652 2455 -2457 4 561.7967 118.4269 39.6248 0.1652 2456 -2458 4 561.8344 117.284 39.6136 0.1398 2457 -2459 4 561.8722 116.1412 39.6046 0.1398 2458 -2460 4 562.1238 115.0349 39.5948 0.1398 2459 -2461 4 562.5265 113.9644 39.5819 0.178 2460 -2462 4 562.951 112.9022 39.5643 0.2034 2461 -2463 4 563.3765 111.8401 39.5394 0.2542 2462 -2464 4 563.8513 110.8001 39.5044 0.2669 2463 -2465 4 564.3993 109.7963 39.4545 0.2796 2464 -2466 4 564.969 108.8047 39.3862 0.2415 2465 -2467 4 565.5398 107.8127 39.2958 0.2161 2466 -2468 4 566.042 106.7886 39.163 0.1907 2467 -2469 4 566.3944 105.7185 38.9556 0.1907 2468 -2470 4 566.6976 104.6354 38.6823 0.178 2469 -2471 4 566.9996 103.5521 38.3698 0.1652 2470 -2472 4 567.3348 102.4715 38.0576 0.1525 2471 -2473 4 567.7432 101.4067 37.7986 0.1525 2472 -2474 4 568.1768 100.3481 37.6071 0.1398 2473 -2475 4 568.6103 99.2897 37.4763 0.1398 2474 -2476 4 569.0496 98.2337 37.3929 0.1652 2475 -2477 4 569.5404 97.2011 37.3472 0.2034 2476 -2478 4 570.0518 96.1781 37.3254 0.2161 2477 -2479 4 570.5643 95.1548 37.3153 0.178 2478 -2480 4 571.0756 94.132 37.3128 0.1525 2479 -2481 4 571.6843 93.1658 37.3159 0.1398 2480 -2482 4 572.3398 92.2279 37.3232 0.178 2481 -2483 4 572.9976 91.2919 37.3335 0.2034 2482 -2484 4 573.6554 90.356 37.3484 0.2288 2483 -2485 4 574.3029 89.413 37.3708 0.2161 2484 -2486 4 574.852 88.4121 37.4021 0.1907 2485 -2487 4 575.3645 87.389 37.4399 0.1652 2486 -2488 4 576.0532 86.4858 37.4833 0.1398 2487 -2489 4 576.5508 85.4777 37.581 0.1398 2488 -2490 4 576.8242 84.3827 37.7454 0.1398 2489 -2491 4 577.2475 83.3284 37.8952 0.1525 2490 -2492 4 578.133 82.8969 37.851 0.1398 2491 -2493 4 579.2392 82.7911 37.9047 0.1271 2492 -2494 4 579.6282 81.9364 38.6604 0.1144 2493 -2495 4 534.3818 182.2655 58.5164 0.1144 2393 -2496 4 534.3624 181.1295 58.7882 0.1525 2495 -2497 4 534.3418 179.9924 58.9095 0.1398 2496 -2498 4 534.3212 178.8552 59.0402 0.1525 2497 -2499 4 534.3029 177.717 59.1517 0.178 2498 -2500 4 534.296 176.5753 59.1895 0.2161 2499 -2501 4 534.296 175.4393 59.1287 0.2161 2500 -2502 4 534.296 174.3044 58.9915 0.1907 2501 -2503 4 534.296 173.1684 58.8073 0.1652 2502 -2504 4 534.2457 172.0347 58.6152 0.1525 2503 -2505 4 534.0707 170.9044 58.4662 0.1525 2504 -2506 4 533.8819 169.7753 58.3674 0.1525 2505 -2507 4 533.6943 168.6473 58.3111 0.1398 2506 -2508 4 533.5067 167.5182 58.2848 0.1398 2507 -2509 4 533.3179 166.3902 58.2767 0.1525 2508 -2510 4 533.1303 165.2622 58.2764 0.1907 2509 -2511 4 532.9416 164.1331 58.277 0.2161 2510 -2512 4 532.7539 163.0051 58.2778 0.2161 2511 -2513 4 532.5686 161.876 58.2789 0.1907 2512 -2514 4 532.4084 160.7434 58.2806 0.1525 2513 -2515 4 532.2883 159.6063 58.2828 0.1271 2514 -2516 4 532.1682 158.468 58.2862 0.1271 2515 -2517 4 532.0481 157.3309 58.2904 0.1398 2516 -2518 4 531.9268 156.1926 58.2966 0.1525 2517 -2519 4 531.785 155.0578 58.3052 0.1398 2518 -2520 4 531.5962 153.9298 58.3173 0.1271 2519 -2521 4 531.4086 152.8018 58.3344 0.1271 2520 -2522 4 531.2198 151.6727 58.3579 0.1398 2521 -2523 4 531.0276 150.5458 58.3901 0.1525 2522 -2524 4 530.8057 149.4236 58.4366 0.1398 2523 -2525 4 530.5392 148.3116 58.5043 0.1271 2524 -2526 4 530.2715 147.1996 58.5942 0.1144 2525 -2527 4 530.0049 146.0865 58.7062 0.1144 2526 -2528 4 529.7864 144.9688 58.8493 0.1144 2527 -2529 4 529.7132 143.8363 59.0464 0.1144 2528 -2530 4 529.7132 142.7048 59.2948 0.1144 2529 -2531 4 529.7132 141.5734 59.5745 0.1144 2530 -2532 4 529.7132 140.442 59.8671 0.1144 2531 -2533 4 529.7246 139.3083 60.1446 0.1144 2532 -2534 4 529.7692 138.1655 60.3638 0.1144 2533 -2535 4 529.8253 137.0237 60.5158 0.1144 2534 -2536 4 529.8825 135.8809 60.6169 0.1144 2535 -2537 4 529.9397 134.738 60.6855 0.1144 2536 -2538 4 530.0095 133.5963 60.739 0.1144 2537 -2539 4 530.1353 132.4603 60.797 0.1144 2538 -2540 4 530.1685 131.3392 60.8748 0.1144 2539 -2541 4 529.791 130.265 60.9787 0.1144 2540 -2542 4 529.3791 129.2079 61.117 0.1144 2541 -2543 4 529.3036 128.0983 61.3248 0.1144 2542 -2544 4 529.839 127.2757 61.6728 0.1144 2543 -2545 4 530.4053 126.436 62.0838 0.1144 2544 -2546 4 530.5895 125.3149 62.4392 0.1144 2545 -2547 4 530.6295 124.1732 62.7164 0.1144 2546 -2548 4 530.6295 123.0292 62.9194 0.1144 2547 -2549 4 530.6295 121.8852 63.061 0.1144 2548 -2550 4 530.6295 120.7412 63.1616 0.1144 2549 -2551 4 530.6295 119.5972 63.2556 0.1144 2550 -2552 4 530.6295 118.4566 63.392 0.1144 2551 -2553 4 530.6295 117.3195 63.5897 0.1144 2552 -2554 4 530.6295 116.1824 63.8378 0.1144 2553 -2555 4 530.6295 115.0452 64.1253 0.1271 2554 -2556 4 530.6295 113.9076 64.4434 0.1525 2555 -2557 4 530.8492 112.8153 64.792 0.178 2556 -2558 4 531.2999 111.7832 65.1636 0.178 2557 -2559 4 531.8834 110.8239 65.5427 0.1525 2558 -2560 4 532.5617 109.9588 65.9526 0.1271 2559 -2561 4 533.3339 109.1839 66.3816 0.1271 2560 -2562 4 534.2732 108.5891 66.6966 0.1525 2561 -2563 4 535.2536 108.1193 66.8105 0.2034 2562 -2564 4 536.1802 107.5147 66.8478 0.2288 2563 -2565 4 537.0165 106.7631 66.9662 0.2415 2564 -2566 4 537.8207 105.9886 67.191 0.2161 2565 -2567 4 538.6009 105.1889 67.5105 0.2161 2566 -2568 4 539.2896 104.3106 67.9098 0.2161 2567 -2569 4 539.944 103.4018 68.3553 0.2542 2568 -2570 4 540.5972 102.4929 68.7977 0.2796 2569 -2571 4 541.1143 101.4904 69.1704 0.2924 2570 -2572 4 541.4941 100.414 69.4431 0.2415 2571 -2573 4 541.8419 99.3245 69.6273 0.2034 2572 -2574 4 542.1896 98.2349 69.7432 0.2034 2573 -2575 4 542.5203 97.1401 69.8074 0.2542 2574 -2576 4 542.8005 96.0314 69.8312 0.2669 2575 -2577 4 543.0625 94.9178 69.8284 0.2288 2576 -2578 4 543.3256 93.8043 69.8076 0.1652 2577 -2579 4 543.5876 92.6909 69.7679 0.1271 2578 -2580 4 543.9571 91.6106 69.7046 0.1144 2579 -2581 4 544.3003 90.5203 69.6133 0.1144 2580 -2582 4 544.6367 89.4269 69.4915 0.1271 2581 -2583 4 545.2819 88.5072 69.34 0.1398 2582 -2584 4 545.7967 87.553 69.0645 0.1652 2583 -2585 4 546.2131 86.5581 68.6664 0.1652 2584 -2586 4 546.6307 85.5639 68.2016 0.178 2585 -2587 4 547.3525 84.7047 67.8031 0.1652 2586 -2588 4 548.1796 83.9195 67.5116 0.1652 2587 -2589 4 548.8523 83.0498 67.2487 0.1398 2588 -2590 4 549.5101 82.1395 67.1989 0.1271 2589 -2591 4 550.2354 81.5507 67.4775 0.1144 2590 -2592 4 551.2421 81.0208 68.2245 0.1144 2591 diff --git a/allensdk/test/model/peri_model/manifest.json b/allensdk/test/model/peri_model/manifest.json deleted file mode 100644 index 79b3cbd3c6..0000000000 --- a/allensdk/test/model/peri_model/manifest.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "biophys": [ - { - "model_type": "Biophysical - perisomatic", - "model_file": [ - "manifest.json", - "468193142_fit.json" - ] - } - ], - "runs": [ - { - "sweeps": [ - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 55, - 58, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76 - ] - } - ], - "neuron": [ - { - "hoc": [ - "stdgui.hoc", - "import3d.hoc" - ] - } - ], - "manifest": [ - { - "type": "dir", - "spec": ".", - "key": "BASEDIR" - }, - { - "parent": "BASEDIR", - "type": "dir", - "spec": "work", - "key": "WORKDIR" - }, - { - "type": "file", - "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_m.swc", - "key": "MORPHOLOGY" - }, - { - "type": "file", - "spec": "Scnn1a-Tg3-Cre_Ai14-177297.06.01.01_491120155_marker_m.swc", - "key": "MARKER" - }, - { - "type": "dir", - "spec": "modfiles", - "key": "MODFILE_DIR" - }, - { - "type": "file", - "spec": "468193140.nwb", - "key": "stimulus_path", - "format": "NWB" - }, - { - "key": "output_path", - "type": "file", - "spec": "468193140.nwb", - "parent_key": "WORKDIR", - "format": "NWB" - } - ] -} \ No newline at end of file diff --git a/allensdk/test/model/peri_model/modfiles/CaDynamics.mod b/allensdk/test/model/peri_model/modfiles/CaDynamics.mod deleted file mode 100644 index 12af065986..0000000000 --- a/allensdk/test/model/peri_model/modfiles/CaDynamics.mod +++ /dev/null @@ -1,40 +0,0 @@ -: Dynamics that track inside calcium concentration -: modified from Destexhe et al. 1994 - -NEURON { - SUFFIX CaDynamics - USEION ca READ ica WRITE cai - RANGE decay, gamma, minCai, depth -} - -UNITS { - (mV) = (millivolt) - (mA) = (milliamp) - FARADAY = (faraday) (coulombs) - (molar) = (1/liter) - (mM) = (millimolar) - (um) = (micron) -} - -PARAMETER { - gamma = 0.05 : percent of free calcium (not buffered) - decay = 80 (ms) : rate of removal of calcium - depth = 0.1 (um) : depth of shell - minCai = 1e-4 (mM) -} - -ASSIGNED {ica (mA/cm2)} - -INITIAL { - cai = minCai -} - -STATE { - cai (mM) -} - -BREAKPOINT { SOLVE states METHOD cnexp } - -DERIVATIVE states { - cai' = -(10000)*(ica*gamma/(2*FARADAY*depth)) - (cai - minCai)/decay -} diff --git a/allensdk/test/model/peri_model/modfiles/Ca_HVA.mod b/allensdk/test/model/peri_model/modfiles/Ca_HVA.mod deleted file mode 100644 index 84db2d3c91..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Ca_HVA.mod +++ /dev/null @@ -1,82 +0,0 @@ -: Reference: Reuveni, Friedman, Amitai, and Gutnick, J.Neurosci. 1993 - -NEURON { - SUFFIX Ca_HVA - USEION ca READ eca WRITE ica - RANGE gbar, g, ica -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - eca (mV) - ica (mA/cm2) - g (S/cm2) - mInf - mTau - mAlpha - mBeta - hInf - hTau - hAlpha - hBeta -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*h - ica = g*(v-eca) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - UNITSOFF - : if((v == -27) ){ - : v = v+0.0001 - : } - :mAlpha = (0.055*(-27-v))/(exp((-27-v)/3.8) - 1) - mAlpha = 0.055 * vtrap(-27 - v, 3.8) - mBeta = (0.94*exp((-75-v)/17)) - mInf = mAlpha/(mAlpha + mBeta) - mTau = 1/(mAlpha + mBeta) - hAlpha = (0.000457*exp((-13-v)/50)) - hBeta = (0.0065/(exp((-v-15)/28)+1)) - hInf = hAlpha/(hAlpha + hBeta) - hTau = 1/(hAlpha + hBeta) - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/peri_model/modfiles/Ca_LVA.mod b/allensdk/test/model/peri_model/modfiles/Ca_LVA.mod deleted file mode 100644 index ab151d0efc..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Ca_LVA.mod +++ /dev/null @@ -1,69 +0,0 @@ -: Comment: LVA ca channel. Note: mtau is an approximation from the plots -: Reference: Avery and Johnston 1996, tau from Randall 1997 -: Comment: shifted by -10 mv to correct for junction potential -: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 - -NEURON { - SUFFIX Ca_LVA - USEION ca READ eca WRITE ica - RANGE gbar, g, ica -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - eca (mV) - ica (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*h - ica = g*(v-eca) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - v = v + 10 - mInf = 1.0000/(1+ exp((v - -30.000)/-6)) - mTau = (5.0000 + 20.0000/(1+exp((v - -25.000)/5)))/qt - hInf = 1.0000/(1+ exp((v - -80.000)/6.4)) - hTau = (20.0000 + 50.0000/(1+exp((v - -40.000)/7)))/qt - v = v - 10 - UNITSON -} diff --git a/allensdk/test/model/peri_model/modfiles/Ih.mod b/allensdk/test/model/peri_model/modfiles/Ih.mod deleted file mode 100644 index 73b97d8465..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Ih.mod +++ /dev/null @@ -1,71 +0,0 @@ -: Reference: Kole,Hallermann,and Stuart, J. Neurosci. 2006 - -NEURON { - SUFFIX Ih - NONSPECIFIC_CURRENT ihcn - RANGE gbar, g, ihcn -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - ehcn = -45.0 (mV) -} - -ASSIGNED { - v (mV) - ihcn (mA/cm2) - g (S/cm2) - mInf - mTau - mAlpha - mBeta -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m - ihcn = g*(v-ehcn) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates(){ - UNITSOFF - : if(v == -154.9){ - : v = v + 0.0001 - : } - :mAlpha = 0.001*6.43*(v+154.9)/(exp((v+154.9)/11.9)-1) - mAlpha = 0.001 * 6.43 * vtrap(v + 154.9, 11.9) - mBeta = 0.001*193*exp(v/33.1) - mInf = mAlpha/(mAlpha + mBeta) - mTau = 1/(mAlpha + mBeta) - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} diff --git a/allensdk/test/model/peri_model/modfiles/Im.mod b/allensdk/test/model/peri_model/modfiles/Im.mod deleted file mode 100644 index d6112d57af..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Im.mod +++ /dev/null @@ -1,62 +0,0 @@ -: Reference: Adams et al. 1982 - M-currents and other potassium currents in bullfrog sympathetic neurones -: Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 - -NEURON { - SUFFIX Im - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - mAlpha = 3.3e-3*exp(2.5*0.04*(v - -35)) - mBeta = 3.3e-3*exp(-2.5*0.04*(v - -35)) - mInf = mAlpha/(mAlpha + mBeta) - mTau = (1/(mAlpha + mBeta))/qt - UNITSON -} diff --git a/allensdk/test/model/peri_model/modfiles/Im_v2.mod b/allensdk/test/model/peri_model/modfiles/Im_v2.mod deleted file mode 100644 index fc219f7161..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Im_v2.mod +++ /dev/null @@ -1,59 +0,0 @@ -: Based on Im model of Vervaeke et al. (2006) - -NEURON { - SUFFIX Im_v2 - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * m - ik = g * (v - ek) -} - -DERIVATIVE states { - rates() - m' = (mInf - m) / mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-30)/10) - mAlpha = 0.007 * exp( (6 * 0.4 * (v - (-48))) / 26.12 ) - mBeta = 0.007 * exp( (-6 * (1 - 0.4) * (v - (-48))) / 26.12 ) - - mInf = mAlpha / (mAlpha + mBeta) - mTau = (15 + 1 / (mAlpha + mBeta)) / qt -} diff --git a/allensdk/test/model/peri_model/modfiles/K_P.mod b/allensdk/test/model/peri_model/modfiles/K_P.mod deleted file mode 100644 index 0a1238f93b..0000000000 --- a/allensdk/test/model/peri_model/modfiles/K_P.mod +++ /dev/null @@ -1,71 +0,0 @@ -: Comment: The persistent component of the K current -: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 - - -NEURON { - SUFFIX K_P - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - vshift = 0 (mV) - tauF = 1 -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*h - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-21)/10) - UNITSOFF - mInf = 1 / (1 + exp(-(v - (-14.3 + vshift)) / 14.6)) - if (v < -50 + vshift){ - mTau = tauF * (1.25+175.03*exp(-(v - vshift) * -0.026))/qt - } else { - mTau = tauF * (1.25+13*exp(-(v - vshift) * 0.026))/qt - } - hInf = 1/(1 + exp(-(v - (-54 + vshift))/-11)) - hTau = (360+(1010+24*(v - (-55 + vshift)))*exp(-((v - (-75 + vshift))/48)^2))/qt - UNITSON -} diff --git a/allensdk/test/model/peri_model/modfiles/K_T.mod b/allensdk/test/model/peri_model/modfiles/K_T.mod deleted file mode 100644 index c31beaff1b..0000000000 --- a/allensdk/test/model/peri_model/modfiles/K_T.mod +++ /dev/null @@ -1,68 +0,0 @@ -: Comment: The transient component of the K current -: Reference: Voltage-gated K+ channels in layer 5 neocortical pyramidal neurones from young rats:subtypes and gradients,Korngreen and Sakmann, J. Physiology, 2000 - -NEURON { - SUFFIX K_T - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - vshift = 0 (mV) - mTauF = 1.0 - hTauF = 1.0 -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*m*m*h - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - mInf = 1/(1 + exp(-(v - (-47 + vshift)) / 29)) - mTau = (0.34 + mTauF * 0.92*exp(-((v+71-vshift)/59)^2))/qt - hInf = 1/(1 + exp(-(v+66-vshift)/-10)) - hTau = (8 + hTauF * 49*exp(-((v+73-vshift)/23)^2))/qt - UNITSON -} diff --git a/allensdk/test/model/peri_model/modfiles/Kd.mod b/allensdk/test/model/peri_model/modfiles/Kd.mod deleted file mode 100644 index 82cbe59a38..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Kd.mod +++ /dev/null @@ -1,62 +0,0 @@ -: Based on Kd model of Foust et al. (2011) - - -NEURON { - SUFFIX Kd - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - hInf - hTau -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * m * h - ik = g * (v - ek) -} - -DERIVATIVE states { - rates() - m' = (mInf - m) / mTau - h' = (hInf - h) / hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-23)/10) - mInf = 1 - 1 / (1 + exp((v - (-43)) / 8)) - mTau = 1 - hInf = 1 / (1 + exp((v - (-67)) / 7.3)) - hTau = 1500 -} diff --git a/allensdk/test/model/peri_model/modfiles/Kv2like.mod b/allensdk/test/model/peri_model/modfiles/Kv2like.mod deleted file mode 100644 index 6b45acd65d..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Kv2like.mod +++ /dev/null @@ -1,89 +0,0 @@ -: Kv2-like channel -: Adapted from model implemented in Keren et al. 2005 -: Adjusted parameters to be similar to guangxitoxin-sensitive current in mouse CA1 pyramids from Liu and Bean 2014 - - -NEURON { - SUFFIX Kv2like - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mAlpha - mBeta - mTau - hInf - h1Tau - h2Tau -} - -STATE { - m - h1 - h2 -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * m * m * (0.5 * h1 + 0.5 * h2) - ik = g * (v - ek) -} - -DERIVATIVE states { - rates() - m' = (mInf - m) / mTau - h1' = (hInf - h1) / h1Tau - h2' = (hInf - h2) / h2Tau -} - -INITIAL{ - rates() - m = mInf - h1 = hInf - h2 = hInf -} - -PROCEDURE rates() { - LOCAL qt - qt = 2.3^((celsius-21)/10) - UNITSOFF - mAlpha = 0.12 * vtrap( -(v - 43), 11.0) - mBeta = 0.02 * exp(-(v + 1.27) / 120) - mInf = mAlpha / (mAlpha + mBeta) - mTau = 2.5 * (1 / (qt * (mAlpha + mBeta))) - - hInf = 1/(1 + exp((v + 58) / 11)) - h1Tau = (360 + (1010 + 23.7 * (v + 54)) * exp(-((v + 75) / 48)^2)) / qt - h2Tau = (2350 + 1380 * exp(-0.011 * v) - 210 * exp(-0.03 * v)) / qt - if (h2Tau < 0) { - h2Tau = 1e-3 - } - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/peri_model/modfiles/Kv3_1.mod b/allensdk/test/model/peri_model/modfiles/Kv3_1.mod deleted file mode 100644 index e244657775..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Kv3_1.mod +++ /dev/null @@ -1,54 +0,0 @@ -: Comment: Kv3-like potassium current - -NEURON { - SUFFIX Kv3_1 - USEION k READ ek WRITE ik - RANGE gbar, g, ik -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - vshift = 0 (mV) -} - -ASSIGNED { - v (mV) - ek (mV) - ik (mA/cm2) - g (S/cm2) - mInf - mTau -} - -STATE { - m -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m - ik = g*(v-ek) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau -} - -INITIAL{ - rates() - m = mInf -} - -PROCEDURE rates(){ - UNITSOFF - mInf = 1/(1+exp(((v -(18.700 + vshift))/(-9.700)))) - mTau = 0.2*20.000/(1+exp(((v -(-46.560 + vshift))/(-44.140)))) - UNITSON -} diff --git a/allensdk/test/model/peri_model/modfiles/NaTa.mod b/allensdk/test/model/peri_model/modfiles/NaTa.mod deleted file mode 100644 index fcf7bd39d6..0000000000 --- a/allensdk/test/model/peri_model/modfiles/NaTa.mod +++ /dev/null @@ -1,95 +0,0 @@ -: Reference: Colbert and Pan 2002 - -NEURON { - SUFFIX NaTa - USEION na READ ena WRITE ina - RANGE gbar, g, ina -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - - malphaF = 0.182 - mbetaF = 0.124 - mvhalf = -48 (mV) - mk = 6 (mV) - - halphaF = 0.015 - hbetaF = 0.015 - hvhalf = -69 (mV) - hk = 6 (mV) -} - -ASSIGNED { - v (mV) - ena (mV) - ina (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta - hInf - hTau - hAlpha - hBeta -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*m*h - ina = g*(v-ena) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-23)/10) - - UNITSOFF - mAlpha = malphaF * vtrap(-(v - mvhalf), mk) - mBeta = mbetaF * vtrap((v - mvhalf), mk) - - mInf = mAlpha/(mAlpha + mBeta) - mTau = (1/(mAlpha + mBeta))/qt - - hAlpha = halphaF * vtrap(v - hvhalf, hk) : ng - adjusted this to match actual Colbert & Pan values for soma model - hBeta = hbetaF * vtrap(-(v - hvhalf), hk) : ng - adjusted this to match actual Colbert & Pan values for soma model - - hInf = hAlpha/(hAlpha + hBeta) - hTau = (1/(hAlpha + hBeta))/qt - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/peri_model/modfiles/NaTs.mod b/allensdk/test/model/peri_model/modfiles/NaTs.mod deleted file mode 100644 index f753e71877..0000000000 --- a/allensdk/test/model/peri_model/modfiles/NaTs.mod +++ /dev/null @@ -1,95 +0,0 @@ -: Reference: Colbert and Pan 2002 - -NEURON { - SUFFIX NaTs - USEION na READ ena WRITE ina - RANGE gbar, g, ina -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) - - malphaF = 0.182 - mbetaF = 0.124 - mvhalf = -40 (mV) - mk = 6 (mV) - - halphaF = 0.015 - hbetaF = 0.015 - hvhalf = -66 (mV) - hk = 6 (mV) -} - -ASSIGNED { - v (mV) - ena (mV) - ina (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - mTau - mAlpha - mBeta - hInf - hTau - hAlpha - hBeta -} - -STATE { - m - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar*m*m*m*h - ina = g*(v-ena) -} - -DERIVATIVE states { - rates() - m' = (mInf-m)/mTau - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - m = mInf - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-23)/10) - - UNITSOFF - mAlpha = malphaF * vtrap(-(v - mvhalf), mk) - mBeta = mbetaF * vtrap((v - mvhalf), mk) - - mInf = mAlpha/(mAlpha + mBeta) - mTau = (1/(mAlpha + mBeta))/qt - - hAlpha = halphaF * vtrap(v - hvhalf, hk) - hBeta = hbetaF * vtrap(-(v - hvhalf), hk) - - hInf = hAlpha/(hAlpha + hBeta) - hTau = (1/(hAlpha + hBeta))/qt - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/peri_model/modfiles/NaV.mod b/allensdk/test/model/peri_model/modfiles/NaV.mod deleted file mode 100644 index a70239563b..0000000000 --- a/allensdk/test/model/peri_model/modfiles/NaV.mod +++ /dev/null @@ -1,186 +0,0 @@ -TITLE Mouse sodium current -: Kinetics of Carter et al. (2012) -: Based on 37 degC recordings from mouse hippocampal CA1 pyramids - -NEURON { - SUFFIX NaV - USEION na READ ena WRITE ina - RANGE g, gbar -} - -UNITS { - (mV) = (millivolt) - (S) = (siemens) -} - -PARAMETER { - gbar = .015 (S/cm2) - - : kinetic parameters - Con = 0.01 (/ms) : closed -> inactivated transitions - Coff = 40 (/ms) : inactivated -> closed transitions - Oon = 8 (/ms) : open -> Ineg transition - Ooff = 0.05 (/ms) : Ineg -> open transition - alpha = 400 (/ms) - beta = 12 (/ms) - gamma = 250 (/ms) : opening - delta = 60 (/ms) : closing - - alfac = 2.51 - btfac = 5.32 - - : Vdep - x1 = 24 (mV) : Vdep of activation (alpha) - x2 = -24 (mV) : Vdep of deactivation (beta) -} - -ASSIGNED { - - : rates - f01 (/ms) - f02 (/ms) - f03 (/ms) - f04 (/ms) - f0O (/ms) - f11 (/ms) - f12 (/ms) - f13 (/ms) - f14 (/ms) - f1n (/ms) - fi1 (/ms) - fi2 (/ms) - fi3 (/ms) - fi4 (/ms) - fi5 (/ms) - fin (/ms) - - b01 (/ms) - b02 (/ms) - b03 (/ms) - b04 (/ms) - b0O (/ms) - b11 (/ms) - b12 (/ms) - b13 (/ms) - b14 (/ms) - b1n (/ms) - bi1 (/ms) - bi2 (/ms) - bi3 (/ms) - bi4 (/ms) - bi5 (/ms) - bin (/ms) - - v (mV) - ena (mV) - ina (milliamp/cm2) - g (S/cm2) - celsius (degC) -} - -STATE { - C1 FROM 0 TO 1 - C2 FROM 0 TO 1 - C3 FROM 0 TO 1 - C4 FROM 0 TO 1 - C5 FROM 0 TO 1 - I1 FROM 0 TO 1 - I2 FROM 0 TO 1 - I3 FROM 0 TO 1 - I4 FROM 0 TO 1 - I5 FROM 0 TO 1 - O FROM 0 TO 1 - I6 FROM 0 TO 1 -} - -BREAKPOINT { - SOLVE activation METHOD sparse - g = gbar * O - ina = g * (v - ena) -} - -INITIAL { - rates(v) - SOLVE seqinitial -} - -KINETIC activation -{ - rates(v) - ~ C1 <-> C2 (f01,b01) - ~ C2 <-> C3 (f02,b02) - ~ C3 <-> C4 (f03,b03) - ~ C4 <-> C5 (f04,b04) - ~ C5 <-> O (f0O,b0O) - ~ O <-> I6 (fin,bin) - ~ I1 <-> I2 (f11,b11) - ~ I2 <-> I3 (f12,b12) - ~ I3 <-> I4 (f13,b13) - ~ I4 <-> I5 (f14,b14) - ~ I5 <-> I6 (f1n,b1n) - ~ C1 <-> I1 (fi1,bi1) - ~ C2 <-> I2 (fi2,bi2) - ~ C3 <-> I3 (fi3,bi3) - ~ C4 <-> I4 (fi4,bi4) - ~ C5 <-> I5 (fi5,bi5) - - CONSERVE C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 -} - -LINEAR seqinitial { : sets initial equilibrium - ~ I1*bi1 + C2*b01 - C1*( fi1+f01) = 0 - ~ C1*f01 + I2*bi2 + C3*b02 - C2*(b01+fi2+f02) = 0 - ~ C2*f02 + I3*bi3 + C4*b03 - C3*(b02+fi3+f03) = 0 - ~ C3*f03 + I4*bi4 + C5*b04 - C4*(b03+fi4+f04) = 0 - ~ C4*f04 + I5*bi5 + O*b0O - C5*(b04+fi5+f0O) = 0 - ~ C5*f0O + I6*bin - O*(b0O+fin) = 0 - - ~ C1*fi1 + I2*b11 - I1*( bi1+f11) = 0 - ~ I1*f11 + C2*fi2 + I3*b12 - I2*(b11+bi2+f12) = 0 - ~ I2*f12 + C3*fi3 + I4*bi3 - I3*(b12+bi3+f13) = 0 - ~ I3*f13 + C4*fi4 + I5*b14 - I4*(b13+bi4+f14) = 0 - ~ I4*f14 + C5*fi5 + I6*b1n - I5*(b14+bi5+f1n) = 0 - - ~ C1 + C2 + C3 + C4 + C5 + O + I1 + I2 + I3 + I4 + I5 + I6 = 1 -} - -PROCEDURE rates(v(mV) ) -{ - LOCAL qt - qt = 2.3^((celsius-37)/10) - - f01 = qt * 4 * alpha * exp(v/x1) - f02 = qt * 3 * alpha * exp(v/x1) - f03 = qt * 2 * alpha * exp(v/x1) - f04 = qt * 1 * alpha * exp(v/x1) - f0O = qt * gamma - f11 = qt * 4 * alpha * alfac * exp(v/x1) - f12 = qt * 3 * alpha * alfac * exp(v/x1) - f13 = qt * 2 * alpha * alfac * exp(v/x1) - f14 = qt * 1 * alpha * alfac * exp(v/x1) - f1n = qt * gamma - fi1 = qt * Con - fi2 = qt * Con * alfac - fi3 = qt * Con * alfac^2 - fi4 = qt * Con * alfac^3 - fi5 = qt * Con * alfac^4 - fin = qt * Oon - - b01 = qt * 1 * beta * exp(v/x2) - b02 = qt * 2 * beta * exp(v/x2) - b03 = qt * 3 * beta * exp(v/x2) - b04 = qt * 4 * beta * exp(v/x2) - b0O = qt * delta - b11 = qt * 1 * beta * exp(v/x2) / btfac - b12 = qt * 2 * beta * exp(v/x2) / btfac - b13 = qt * 3 * beta * exp(v/x2) / btfac - b14 = qt * 4 * beta * exp(v/x2) / btfac - b1n = qt * delta - bi1 = qt * Coff - bi2 = qt * Coff / (btfac) - bi3 = qt * Coff / (btfac^2) - bi4 = qt * Coff / (btfac^3) - bi5 = qt * Coff / (btfac^4) - bin = qt * Ooff -} - diff --git a/allensdk/test/model/peri_model/modfiles/Nap.mod b/allensdk/test/model/peri_model/modfiles/Nap.mod deleted file mode 100644 index ef8021ec1b..0000000000 --- a/allensdk/test/model/peri_model/modfiles/Nap.mod +++ /dev/null @@ -1,77 +0,0 @@ -:Reference : Modeled according to kinetics derived from Magistretti & Alonso 1999 -:Comment: corrected rates using q10 = 2.3, target temperature 34, orginal 21 - -NEURON { - SUFFIX Nap - USEION na READ ena WRITE ina - RANGE gbar, g, ina -} - -UNITS { - (S) = (siemens) - (mV) = (millivolt) - (mA) = (milliamp) -} - -PARAMETER { - gbar = 0.00001 (S/cm2) -} - -ASSIGNED { - v (mV) - ena (mV) - ina (mA/cm2) - g (S/cm2) - celsius (degC) - mInf - hInf - hTau - hAlpha - hBeta -} - -STATE { - h -} - -BREAKPOINT { - SOLVE states METHOD cnexp - rates() - g = gbar*mInf*h - ina = g*(v-ena) -} - -DERIVATIVE states { - rates() - h' = (hInf-h)/hTau -} - -INITIAL{ - rates() - h = hInf -} - -PROCEDURE rates(){ - LOCAL qt - qt = 2.3^((celsius-21)/10) - - UNITSOFF - mInf = 1.0/(1+exp((v- -52.6)/-4.6)) : assuming instantaneous activation as modeled by Magistretti and Alonso - - hInf = 1.0/(1+exp((v- -48.8)/10)) - hAlpha = 2.88e-6 * vtrap(v + 17, 4.63) - hBeta = 6.94e-6 * vtrap(-(v + 64.4), 2.63) - - hTau = (1/(hAlpha + hBeta))/qt - UNITSON -} - -FUNCTION vtrap(x, y) { : Traps for 0 in denominator of rate equations - UNITSOFF - if (fabs(x / y) < 1e-6) { - vtrap = y * (1 - x / y / 2) - } else { - vtrap = x / (exp(x / y) - 1) - } - UNITSON -} \ No newline at end of file diff --git a/allensdk/test/model/peri_model/modfiles/SK.mod b/allensdk/test/model/peri_model/modfiles/SK.mod deleted file mode 100644 index 8bfa3b727f..0000000000 --- a/allensdk/test/model/peri_model/modfiles/SK.mod +++ /dev/null @@ -1,56 +0,0 @@ -: SK-type calcium-activated potassium current -: Reference : Kohler et al. 1996 - -NEURON { - SUFFIX SK - USEION k READ ek WRITE ik - USEION ca READ cai - RANGE gbar, g, ik -} - -UNITS { - (mV) = (millivolt) - (mA) = (milliamp) - (mM) = (milli/liter) -} - -PARAMETER { - v (mV) - gbar = .000001 (mho/cm2) - zTau = 1 (ms) - ek (mV) - cai (mM) -} - -ASSIGNED { - zInf - ik (mA/cm2) - g (S/cm2) -} - -STATE { - z FROM 0 TO 1 -} - -BREAKPOINT { - SOLVE states METHOD cnexp - g = gbar * z - ik = g * (v - ek) -} - -DERIVATIVE states { - rates(cai) - z' = (zInf - z) / zTau -} - -PROCEDURE rates(ca(mM)) { - if(ca < 1e-7){ - ca = ca + 1e-07 - } - zInf = 1/(1 + (0.00043 / ca)^4.8) -} - -INITIAL { - rates(cai) - z = zInf -} diff --git a/allensdk/test/model/peri_model/test_biophysical_peri.py b/allensdk/test/model/peri_model/test_biophysical_peri.py deleted file mode 100644 index f7891a97e2..0000000000 --- a/allensdk/test/model/peri_model/test_biophysical_peri.py +++ /dev/null @@ -1,85 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import os -import numpy -from allensdk.model.biophys_sim.config import Config -from allensdk.model.biophysical.utils import Utils, AllActiveUtils -from allensdk.api.queries.biophysical_api import BiophysicalApi -from allensdk.core.dat_utilities import DatUtilities -from allensdk.ephys import ephys_features -import subprocess - -@pytest.mark.requires_neuron -def test_biophysical_peri(): - """ - Test for backward compatibility of the perisomatic models - """ - - subprocess.check_call(['nrnivmodl', 'modfiles/']) - - description = Config().load('manifest.json') - utils = Utils(description) - h = utils.h - - manifest = description.manifest - morphology_path = manifest.get_path('MORPHOLOGY') - utils.generate_morphology(morphology_path.encode('ascii', 'ignore').decode("utf-8")) - utils.load_cell_parameters() - - stim = h.IClamp(h.soma[0](0.5)) - stim.amp = 0.35 # Sweep 47 - stim.delay = 1000.0 - stim.dur = 1000.0 - - h.tstop = 3000.0 - - vec = utils.record_values() - - h.finitialize() - h.run() - - junction_potential = description.data['fitting'][0]['junction_potential'] - ms = 1.0e-3 - - output_data = (numpy.array(vec['v']) - junction_potential) # in mV - output_times = numpy.array(vec['t']) * ms # in s - output_path = 'output_voltage.dat' - - DatUtilities.save_voltage(output_path, output_data, output_times) - - num_spikes = len(ephys_features.detect_putative_spikes(output_data, output_times)) - assert num_spikes == 27 # taken from the web app diff --git a/allensdk/test/model/test_biophysical_perisomatic.py b/allensdk/test/model/test_biophysical_perisomatic.py deleted file mode 100644 index c84fd669ff..0000000000 --- a/allensdk/test/model/test_biophysical_perisomatic.py +++ /dev/null @@ -1,90 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -import os -import numpy -from allensdk.model.biophys_sim.config import Config -from allensdk.model.biophysical.utils import Utils -from allensdk.core.dat_utilities import DatUtilities -from allensdk.api.queries.biophysical_api import BiophysicalApi - - -@pytest.mark.skipif(True, - reason="partial testing") -@pytest.mark.xfail -def test_biophysical(): - neuronal_model_id = 472451419 # get this from the web site - - model_directory = '.' - - bp = BiophysicalApi('http://api.brain-map.org') - bp.cache_stimulus = False # don't want to download the large stimulus NWB file - bp.cache_data(neuronal_model_id, working_directory=model_directory) - os.system('nrnivmodl modfiles') - - description = Config().load('manifest.json') - utils = Utils(description) - h = utils.h - - manifest = description.manifest - morphology_path = manifest.get_path('MORPHOLOGY') - utils.generate_morphology(morphology_path.encode('ascii', 'ignore')) - utils.load_cell_parameters() - - stim = h.IClamp(h.soma[0](0.5)) - stim.amp = 0.18 - stim.delay = 1000.0 - stim.dur = 1000.0 - - h.tstop = 3000.0 - - vec = utils.record_values() - - h.finitialize() - h.run() - - output_path = 'output_voltage.dat' - - junction_potential = description.data['fitting'][0]['junction_potential'] - mV = 1.0e-3 - ms = 1.0e-3 - - output_data = (numpy.array(vec['v']) - junction_potential) * mV - output_times = numpy.array(vec['t']) * ms - - DatUtilities.save_voltage(output_path, output_data, output_times) - - assert numpy.count_nonzero(output_data) > 0 diff --git a/allensdk/test/model/test_glif.py b/allensdk/test/model/test_glif.py deleted file mode 100644 index e96dd0d255..0000000000 --- a/allensdk/test/model/test_glif.py +++ /dev/null @@ -1,144 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from allensdk.api.queries.glif_api import GlifApi -import allensdk.core.json_utilities as json_utilities -from allensdk.model.glif.glif_neuron import GlifNeuron -from allensdk.core.nwb_data_set import NwbDataSet -import os - - -@pytest.fixture -def neuron_config_file(fn_temp_dir): - return os.path.join(fn_temp_dir, "neuron_config.json") - - -@pytest.fixture -def ephys_sweeps_file(fn_temp_dir): - return os.path.join(fn_temp_dir, "ephys_sweeps.json") - - -@pytest.fixture -def glif_api(): - endpoint = None - - if 'TEST_API_ENDPOINT' in os.environ: - endpoint = os.environ['TEST_API_ENDPOINT'] - return GlifApi(endpoint) - else: - return GlifApi() - - -@pytest.fixture -def neuronal_model_id(): - neuronal_model_id = 566302806 - - return neuronal_model_id - - -@pytest.fixture -def configured_glif_api(glif_api, neuronal_model_id, neuron_config_file, - ephys_sweeps_file): - glif_api.get_neuronal_model(neuronal_model_id) - - neuron_config = glif_api.get_neuron_config() - json_utilities.write(neuron_config_file, neuron_config) - - ephys_sweeps = glif_api.get_ephys_sweeps() - json_utilities.write(ephys_sweeps_file, ephys_sweeps) - - return glif_api - - -@pytest.fixture -def output(neuron_config_file, ephys_sweeps_file): - neuron_config = json_utilities.read(neuron_config_file) - ephys_sweeps = json_utilities.read(ephys_sweeps_file) - ephys_file_name = 'stimulus.nwb' - - # pull out the stimulus for the first sweep - ephys_sweep = ephys_sweeps[0] - ds = NwbDataSet(ephys_file_name) - data = ds.get_sweep(ephys_sweep['sweep_number']) - stimulus = data['stimulus'] - - # initialize the neuron - # important! update the neuron's dt for your stimulus - neuron = GlifNeuron.from_dict(neuron_config) - neuron.dt = 1.0 / data['sampling_rate'] - - # simulate the neuron - truncate = 56041 - output = neuron.run(stimulus[0:truncate]) - - return output - - -@pytest.fixture -def stimulus(neuron_config_file, ephys_sweeps_file): - ephys_sweeps = json_utilities.read(ephys_sweeps_file) - ephys_file_name = 'stimulus.nwb' - - # pull out the stimulus for the first sweep - ephys_sweep = ephys_sweeps[0] - ds = NwbDataSet(ephys_file_name) - data = ds.get_sweep(ephys_sweep['sweep_number']) - stimulus = data['stimulus'] - - return stimulus - - -def test_run_glifneuron(configured_glif_api, neuron_config_file): - # initialize the neuron - neuron_config = json_utilities.read(neuron_config_file) - neuron = GlifNeuron.from_dict(neuron_config) - - # make a short square pulse. stimulus units should be in Amps. - stimulus = [0.0] * 100 + [10e-9] * 100 + [0.0] * 100 - - # important! set the neuron's dt value for your stimulus in seconds - neuron.dt = 5e-6 - - # simulate the neuron - output = neuron.run(stimulus) - - expected_fields = {"AScurrents", "grid_spike_times", - "interpolated_spike_threshold", - "interpolated_spike_times", - "interpolated_spike_voltage", - "spike_time_steps", "threshold", "voltage"} - - assert expected_fields.difference(output.keys()) == set() diff --git a/allensdk/test/model/test_runner.py b/allensdk/test/model/test_runner.py deleted file mode 100644 index 236f650469..0000000000 --- a/allensdk/test/model/test_runner.py +++ /dev/null @@ -1,14 +0,0 @@ -import pytest -import subprocess - -def test_args(): - """ - Test for legacy and newest biophysical model simulation calls - """ - # Legacy all-active simulation call pattern - args_legacy = subprocess.check_output(['python', '-m', 'allensdk.test.model.check_parser', 'manifest.json']) - assert 'stub' not in args_legacy.decode('utf-8') - - # Current all-active simulation call pattern - args_new = subprocess.check_output(['python', '-m', 'allensdk.test.model.check_parser', 'manifest.json', '--axon_type', 'stub']) - assert 'stub' in args_new.decode('utf-8') diff --git a/allensdk/test/mouse_connectivity/__init__.py b/allensdk/test/mouse_connectivity/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/mouse_connectivity/grid/__init__.py b/allensdk/test/mouse_connectivity/grid/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/allensdk/test/mouse_connectivity/grid/test_base_subimage.py b/allensdk/test/mouse_connectivity/grid/test_base_subimage.py deleted file mode 100644 index 8cff6486a3..0000000000 --- a/allensdk/test/mouse_connectivity/grid/test_base_subimage.py +++ /dev/null @@ -1,231 +0,0 @@ -import sys - -import pytest -import mock - -import numpy as np - -sys.modules['jpeg_twok'] = mock.Mock() -from allensdk.mouse_connectivity.grid.subimage.base_subimage import SubImage, \ - SegmentationSubImage, IntensitySubImage, PolygonSubImage - - -#============================================================================== -#============================================================================== - - -@pytest.fixture(scope='function') -def base_params(): - return {'reduce_level': 4, - 'in_dims': np.array([30000, 40000]), - 'in_spacing': np.array([0.35, 0.35]), - 'coarse_spacing': np.array([16.8, 16.8])} - - -@pytest.fixture(scope='function') -def segmentation_params(): - return {'reduce_level': 4, - 'in_dims': np.array([30000, 40000]), - 'in_spacing': np.array([0.35, 0.35]), - 'coarse_spacing': np.array([16.8, 16.8]), - 'segmentation_paths': {'name_one': 'path_one', - 'name_two': 'path_two'}} - - -@pytest.fixture(scope='function') -def intensity_params(): - return {'reduce_level': 4, - 'in_dims': np.array([30000, 40000]), - 'in_spacing': np.array([0.35, 0.35]), - 'coarse_spacing': np.array([16.8, 16.8]), - 'intensity_paths': {'name_one': {'path': 'path_one', 'channel': 2}}} - - -@pytest.fixture(scope='function') -def polygon_params(): - return {'reduce_level': 4, - 'in_dims': np.array([30000, 40000]), - 'in_spacing': np.array([0.35, 0.35]), - 'coarse_spacing': np.array([16.8, 16.8]), - 'polygon_info': {'hello_am_square': [[(8000, 8000), (16000, 8000), - (16000, 16000), (8000, 16000)]]}} - - -#============================================================================== -#============================================================================== - - -def test_init_base(base_params): - - si = SubImage(**base_params) - - assert(np.allclose( si.coarse_dims, [625, 834] )) - - -def test_binarize(base_params): - - si = SubImage(**base_params) - - si.images['fish'] = np.arange(25).reshape([5, 5]) - si.binarize('fish') - - expected = np.ones([5, 5]) - expected[0, 0] = 0 - - assert( np.allclose(si.images['fish'], expected) ) - - -@pytest.mark.parametrize('positive', [(True), (False)]) -def test_apply_mask(base_params, positive): - - si = SubImage(**base_params) - - si.images['submarine'] = np.arange(25).reshape([5, 5]) - si.images['aquaman'] = np.eye(5).astype(np.uint8) - si.images['aquaman'][3, 3] = 0 - - if positive: - exp = [0, 6, 12, 0, 24] - else: - exp = [0, 0, 0, 18, 0] - - si.apply_mask('submarine', 'aquaman', positive) - assert( np.allclose( np.diag(si.images['submarine']), exp ) ) - - -def test_make_pixel_counter(base_params): - - si = SubImage(**base_params) - reducer = si.make_pixel_counter() - - img = np.zeros([10000, 13334]) - img[::3, :] = 1 - - reduced = reducer(img) - - exp = np.ones([625, 834]) * 48 * 2 - exp[:, -1] = 16 * 2 - - assert(np.allclose(exp, reduced)) - - -#============================================================================== -#============================================================================== - - -def test_init_segmentation(segmentation_params): - si = SegmentationSubImage(**segmentation_params) - assert( si.segmentation_paths['name_one'] == 'path_one' ) - - -def test_extract_signal_from_segmentation(segmentation_params): - - si = SegmentationSubImage(**segmentation_params) - - segmentation_name = 'fish' - signal_name = 'fish_signal' - - si.images[segmentation_name] = np.arange(256) - si.extract_signal_from_segmentation(segmentation_name, signal_name) - - exp = np.array([0] * 128 + [1] * 128) - assert(np.allclose( exp, si.images[signal_name] )) - - -def test_extract_injection_from_segmentation(segmentation_params): - - si = SegmentationSubImage(**segmentation_params) - - - segmentation_name = 'fish' - injection_name = 'fish_injection' - - si.images[segmentation_name] = np.arange(256) - si.extract_injection_from_segmentation(segmentation_name, injection_name) - - exp = np.arange(256) - exp[exp % 32 == 0] = 0 - exp[exp > 0] = 1 - - assert(np.allclose( exp, si.images[injection_name] )) - - - -def test_read_segmentation_image(segmentation_params): - - si = SegmentationSubImage(**segmentation_params) - arr = np.zeros((32, 32)) - arr[:16, :] = 1 - - exp = np.array([[1, 1], [0, 0]]) - - with mock.patch('allensdk.mouse_connectivity.grid.utilities.image_utilities.read_segmentation_image', return_value=arr) as p: - si.read_segmentation_image('name_one') - p.assert_called_once_with('path_one') - - assert(np.allclose( exp, si.images['name_one'] )) - -#============================================================================== -#============================================================================== - - -def test_init_intensity(intensity_params): - - si = IntensitySubImage(**intensity_params) - - assert(si.intensity_paths['name_one']['path'] == 'path_one') - assert(si.intensity_paths['name_one']['channel'] == 2) - - -def test_get_intensity(intensity_params): - - arr = np.eye(1000) - arr[999, 0] = 1 - - si = IntensitySubImage(**intensity_params) - - with mock.patch( - 'allensdk.mouse_connectivity.grid.subimage.base_subimage.IntensitySubImage.required_intensities', - new_callable=mock.PropertyMock - ) as a: - a.return_value = ['name_one'] - - with mock.patch('allensdk.mouse_connectivity.grid.utilities.image_utilities.read_intensity_image', return_value=arr) as p: - si.get_intensity() - - p.assert_called_once_with('path_one', 4, 2) - assert(np.allclose( si.images['name_one'], arr )) - - -#============================================================================== -#============================================================================== - - -def test_init_polygon(polygon_params): - - si = PolygonSubImage(**polygon_params) - - assert(np.allclose( si.polygon_info['hello_am_square'], - np.array([[(8000, 8000), (16000, 8000), (16000, 16000), (8000, 16000)]]) )) - - -def test_get_polygons(polygon_params): - - si = PolygonSubImage(**polygon_params) - - arr = np.zeros([1875, 2500]) - arr[500:1000, 500:1000] = 1 - - with mock.patch( - 'allensdk.mouse_connectivity.grid.subimage.base_subimage.PolygonSubImage.required_polys', - new_callable=mock.PropertyMock - ) as a: - a.return_value = ['hello_am_square'] - - si.get_polygons() - assert(np.allclose( si.images['hello_am_square'], arr )) - - -#============================================================================== -#============================================================================== - diff --git a/allensdk/test/mouse_connectivity/grid/test_cav_subimage.py b/allensdk/test/mouse_connectivity/grid/test_cav_subimage.py deleted file mode 100644 index 456da1cf21..0000000000 --- a/allensdk/test/mouse_connectivity/grid/test_cav_subimage.py +++ /dev/null @@ -1,47 +0,0 @@ -import pytest -import mock - -import numpy as np - -from allensdk.mouse_connectivity.grid.subimage import CavSubImage - - -#============================================================================== -#============================================================================== - - -@pytest.fixture(scope='function') -def cav_params(): - return {'reduce_level': 4, - 'in_dims': np.array([30000, 40000]), - 'in_spacing': np.array([0.35, 0.35]), - 'coarse_spacing': np.array([16.8, 16.8]), - 'polygon_info': {'missing_tile': [[(8000, 8000), (16000, 8000), - (16000, 16000), (8000, 16000)]], - 'cav_tracer': [(4000, 4000), (8000, 4000), - (8000, 8000), (4000, 8000)]}} - - -def test_compute_coarse_planes(cav_params): - - mt = np.ones([1875, 2500]) - mt[:300, :] = 0 - - ct = np.zeros([1875, 2500]) - ct[:, :300] = 1 - - si = CavSubImage(**cav_params) - si.images['cav_tracer'] = ct - si.images['missing_tile'] = mt - - si.compute_coarse_planes() - - cav_tracer_expected = np.zeros([625, 834]) - cav_tracer_expected[:100, :100] = 144 - - sum_pixels_expected = np.zeros([625, 834]) - sum_pixels_expected[:100, :] = 144 - sum_pixels_expected[:100, -1] = 48 - - assert(np.allclose( sum_pixels_expected * 2, si.accumulators['sum_pixels'] )) - assert(np.allclose( cav_tracer_expected * 2, si.accumulators['cav_tracer'] )) diff --git a/allensdk/test/mouse_connectivity/grid/test_classic_subimage.py b/allensdk/test/mouse_connectivity/grid/test_classic_subimage.py deleted file mode 100644 index 43fe74b3c4..0000000000 --- a/allensdk/test/mouse_connectivity/grid/test_classic_subimage.py +++ /dev/null @@ -1,208 +0,0 @@ -import pytest -import mock - -import numpy as np - -from allensdk.mouse_connectivity.grid.subimage import ClassicSubImage - - -#============================================================================== -#============================================================================== - - -@pytest.fixture(scope='function') -def classic_params(): - return {'reduce_level': 4, - 'in_dims': np.array([30000, 40000]), - 'in_spacing': np.array([0.35, 0.35]), - 'coarse_spacing': np.array([16.8, 16.8]), - 'segmentation_paths': {'segmentation': '/path/to_segmentation'}, - 'intensity_paths': {'green': {'path': '/path/to/intensity', 'channel': 1}}, - 'polygon_info': {'missing_tile': [[(8000, 8000), (16000, 8000), - (16000, 16000), (8000, 16000)]], - 'no_signal': [(4000, 4000), (8000, 4000), - (8000, 8000), (4000, 8000)]}} - - -@pytest.fixture(scope='function') -def missing_tile(): - image = np.zeros([1875, 2500], dtype=np.uint8) - image[500:1000, 500:1000] = 1 - return image - - -@pytest.fixture(scope='function') -def no_signal(): - image = np.zeros([1875, 2500], dtype=np.uint8) - image[250:500, 250:500] = 1 - return image - - -@pytest.fixture(scope='function') -def segmentation_image(): - - image = np.zeros([1875, 2500], dtype=np.uint8) - image[:1000, :] += 1 - image[:, :1000] += 128 - image[:20, :20] = 64 - - return image - - -@pytest.fixture(scope='function') -def projection(): - - image = np.zeros([1875, 2500], dtype=np.uint8) - - image[:, :1000] = 1 - image[:20, :20] = 0 - image[500:1000, 500:1000] = 0 - image[250:500, 250:500] = 0 - - return image - - -@pytest.fixture(scope='function') -def injection(): - - image = np.zeros([1875, 2500], dtype=np.uint8) - - image[:1000, :] = 1 - image[:20, :20] = 0 - image[500:1000, 500:1000] = 0 - - return image - - -#============================================================================== -#============================================================================== - - -def test_init_classic(classic_params): - - si = ClassicSubImage(**classic_params) - - assert( hasattr(si, 'intensity_paths') ) - assert( hasattr(si, 'segmentation_paths') ) - assert( hasattr(si, 'polygon_info') ) - - -def test_process_segmentation(classic_params, segmentation_image, - missing_tile, no_signal, projection, injection): - - si = ClassicSubImage(**classic_params) - si.images['segmentation'] = segmentation_image - si.images['missing_tile'] = missing_tile - si.images['no_signal'] = no_signal - - si.process_segmentation() - - assert(np.allclose( projection, si.images['projection'] )) - assert(np.allclose( injection, si.images['injection'] )) - assert( 'segmentation' not in si.images ) - - -def test_compute_intensity(classic_params): - - pr = np.zeros([1875, 2500]) - pr[:600, :] = 1 - - ij = np.zeros([1875, 2500]) - ij[:, :600] = 1 - - si = ClassicSubImage(**classic_params) - si.images['green'] = np.ones([1875, 2500]) * 2 - si.images['projection'] = pr - si.images['injection'] = ij - - si.compute_intensity() - - spi_expected = np.ones([625, 834]) * 144 * 2 - spi_expected[:, -1] = 48 * 2 - - ispi_expected = np.zeros_like(spi_expected) - ispi_expected[:, :200] = spi_expected[:, :200] - - sppi_expected = np.zeros_like(spi_expected) - sppi_expected[:200, :] = spi_expected[:200, :] - - isppi_expected = np.zeros_like(spi_expected) - isppi_expected[:200, :200] = spi_expected[:200, :200] - - assert(np.allclose( spi_expected * 2, si.accumulators['sum_pixel_intensities'] )) - assert(np.allclose( ispi_expected * 2, si.accumulators['injection_sum_pixel_intensities'] )) - assert(np.allclose( sppi_expected * 2, si.accumulators['sum_projecting_pixel_intensities'] )) - assert(np.allclose( isppi_expected * 2, si.accumulators['injectionsum_projecting_pixel_intensities'] )) - assert( 'intensity' not in si.images ) - - -def test_compute_injection(classic_params): - - pr = np.zeros([1875, 2500]) - pr[:600, :] = 1 - - ij = np.zeros([1875, 2500]) - ij[:, :600] = 1 - - si = ClassicSubImage(**classic_params) - si.images['projection'] = pr - si.images['injection'] = ij - - si.compute_injection() - - isp_expected = np.zeros([625, 834]) - isp_expected[:, :200] = 144 - - ispp_expected = np.zeros([625, 834]) - ispp_expected[:200, :200] = 144 - - assert(np.allclose( isp_expected * 2, si.accumulators['injection_sum_pixels'] )) - assert(np.allclose( ispp_expected * 2, si.accumulators['injection_sum_projecting_pixels'] )) - assert( 'injection' not in si.images ) - - -def test_compute_projection(classic_params): - - pr = np.zeros([1875, 2500]) - pr[:600, :] = 1 - - si = ClassicSubImage(**classic_params) - si.images['projection'] = pr - - si.compute_projection() - - spp_expected = np.zeros([625, 834]) - spp_expected[:200, :] = 144 - spp_expected[:200, -1] = 48 - - assert(np.allclose( spp_expected * 2, si.accumulators['sum_projecting_pixels'] )) - assert( 'projection' not in si.images ) - - -def test_compute_sum_pixels_aav(classic_params): - - mt = np.zeros([1875, 2500]) - mt[:300, :300] = 1 - - aav = np.zeros([1875, 2500]) - aav[300:600, :] = 1 - - si = ClassicSubImage(**classic_params) - si.images['missing_tile'] = mt - si.images['aav_exclusion'] = aav - - si.compute_sum_pixels() - - sp_expected = np.zeros([625, 834]) + 144 - sp_expected[:100, :100] = 0 -# sp_expected[100, :101] = 48 -# sp_expected[:101, 100] = 48 - sp_expected[:, -1] = 48 - - aesp_expected = np.zeros([625, 834]) - aesp_expected[100:200, :] = 144 - aesp_expected[100:200, -1] = 48 - - assert(np.allclose( aesp_expected * 2, si.accumulators['aav_exclusion_sum_pixels'] )) - assert(np.allclose( sp_expected * 2, si.accumulators['sum_pixels'] )) - diff --git a/allensdk/test/mouse_connectivity/grid/test_image_series_gridder.py b/allensdk/test/mouse_connectivity/grid/test_image_series_gridder.py deleted file mode 100644 index 351c9aa1b5..0000000000 --- a/allensdk/test/mouse_connectivity/grid/test_image_series_gridder.py +++ /dev/null @@ -1,191 +0,0 @@ -import pytest -import mock -from six.moves import range - -import numpy as np -import SimpleITK as sitk - -from allensdk.mouse_connectivity.grid.image_series_gridder import ImageSeriesGridder - - -def small_gridder(): - - in_dims = [12353, 16471, 140] - in_spacing = [0.85, 0.85, 100.0] - out_dims = [1320, 800, 1140] - out_spacing = [10.0, 10.0, 10.0] - reduce_level = 0 - - subimages = [{'index': 12, - 'segmentation_path': '/path/to/projection_12.jp2', - 'intensity_path': '/path/to/image_12.jp2', - 'polygon_info': {'missing_tile': [], - 'no_signal': [], - 'aav_exclusion': []}}] - - subimage_kwargs = {'cls': dict, 'channel': 1} - - nprocesses = 8 - - affine_params = [2, 0 , 0, 0, 2, 0, 0, 0, 2, 1, 1, 1] - dfmfld_path = '/path/to/deformation_field_header.mhd' - - - return ImageSeriesGridder(in_dims, in_spacing, out_dims, out_spacing, - reduce_level, subimages, subimage_kwargs, - nprocesses, affine_params, dfmfld_path) - - -def large_gridder(): - - in_dims = [30000, 40000, 140] - in_spacing = [0.35, 0.35, 100.0] - out_dims = [1320, 800, 1140] - out_spacing = [10.0, 10.0, 10.0] - reduce_level = 1 - - subimages = [{'index': 12, - 'segmentation_path': '/path/to/projection_12.jp2', - 'intensity_path': '/path/to/image_12.jp2', - 'polygon_info': {'missing_tile': [], - 'no_signal': [], - 'aav_exclusion': []}}] - - subimage_kwargs = {'cls': dict, 'channel': 1} - - nprocesses = 8 - - affine_params = [2, 0 , 0, 0, 2, 0, 0, 0, 2, 1, 1, 1] - dfmfld_path = '/path/to/deformation_field_header.mhd' - - - return ImageSeriesGridder(in_dims, in_spacing, out_dims, out_spacing, - reduce_level, subimages, subimage_kwargs, - nprocesses, affine_params, dfmfld_path) - - -@pytest.mark.parametrize('gridder_fn,cgd,cgs,cgr', [(small_gridder, [951, 1267, 140], [11.05, 11.05, 100], 6), - (large_gridder, [1000, 1334, 140], [10.5, 10.5, 100], 7)]) -def test_set_coarse_grid_parameters(gridder_fn, cgd, cgs, cgr): - - gridder = gridder_fn() - gridder.set_coarse_grid_parameters() - - assert(np.allclose( gridder.coarse_dims, cgd )) - assert(np.allclose( gridder.coarse_spacing, cgs )) - assert(np.allclose( gridder.coarse_grid_radius, cgr )) - - -@pytest.mark.parametrize('gridder_fn,reduce_level', [(small_gridder, 0), (large_gridder, 1)]) -def test_setup_subimages(gridder_fn, reduce_level): - - gridder = gridder_fn() - gridder.setup_subimages() - - for s in gridder.subimages: - assert( s['reduce_level'] == reduce_level ) - gridder = gridder_fn() - - -def test_initialize_coarse_volume(): - - key = 'amethystine' - size = [1, 2, 3] - spacing = [4, 5, 6] - - gridder = small_gridder() - gridder.coarse_dims = size - gridder.coarse_spacing = spacing - - gridder.initialize_coarse_volume(key, sitk.sitkFloat32) - - assert(np.allclose( gridder.volumes[key].GetSize(), size )) - assert(np.allclose( gridder.volumes[key].GetSpacing(), spacing )) - - -def test_paste_slice(): - - key = 'halmahera' - slice_array = np.eye(1000) - index = 12 - - volume = sitk.Image(1000, 1000, 140, sitk.sitkFloat32) - volume.SetSpacing([1, 1, 100]) - - gridder = small_gridder() - gridder.coarse_spacing = [1, 1, 100] - gridder.volumes[key] = volume - - gridder.paste_slice(key, index, slice_array) - - obt = sitk.GetArrayFromImage(gridder.volumes[key]) - assert(np.allclose( obt[12, :, :], slice_array )) - - -def test_paste_subimage(): - - index = 1 - output = {'a': 1, 'b': 2} - - gridder = small_gridder() - gridder.paste_slice = mock.MagicMock() - - gridder.paste_subimage(index, output) - - assert( len(gridder.paste_slice.mock_calls) == 2 ) - assert( output['a'] is None and output['b'] is None ) - - -def test_build_coarse_grids(): - # mp is hard to test - - class Dummy(object): - - def __init__(self, *a, **k): - pass - - def imap_unordered(*a, **k): - for ii in range(20): - yield ii, ii - - with mock.patch('multiprocessing.Pool', new=Dummy) as p: - - gridder = small_gridder() - gridder.paste_subimage = mock.MagicMock() - - gridder.build_coarse_grids() - - for ii in range(20): - assert( mock.call(ii, ii) in gridder.paste_subimage.mock_calls ) - - -def test_resample_volume(): - - def make_dfield(*a , **k): - return - - def make_transform(*a, **k): - return sitk.TranslationTransform(3, [2, 2, 2]) - - key = 'green_tree' - - volume = sitk.Image(10, 10, 10, sitk.sitkFloat32) - volume.SetSpacing([1, 1, 1]) - volume += 1 - - with mock.patch('SimpleITK.ReadImage', new=make_dfield) as p: - with mock.patch( - 'allensdk.mouse_connectivity.grid.utilities.image_utilities.build_composite_transform', - new=make_transform - ) as q: - - gridder = small_gridder() - gridder.out_dims = [10, 10, 10] - gridder.out_spacing = [1, 1, 1] - - gridder.volumes[key] = volume - gridder.resample_volume(key) - - arr = sitk.GetArrayFromImage(gridder.volumes[key]) - assert( arr.sum() == 8**3 ) - diff --git a/allensdk/test/mouse_connectivity/grid/test_image_utilities.py b/allensdk/test/mouse_connectivity/grid/test_image_utilities.py deleted file mode 100644 index 61d8e75ff5..0000000000 --- a/allensdk/test/mouse_connectivity/grid/test_image_utilities.py +++ /dev/null @@ -1,176 +0,0 @@ -import pytest -import mock - -import SimpleITK as sitk -import numpy as np - -from allensdk.mouse_connectivity.grid.utilities import image_utilities as iu - -@pytest.fixture(scope='function') -def dfmfld(): - - disp = sitk.Image(10, 10, 10, sitk.sitkVectorFloat64) - disp.SetSpacing([1, 1, 1]) - - disp += 2 - - return disp - - -@pytest.fixture(scope='function') -def aff_params(): - return [2, 0, 0, 0, 2, 0, 0, 0, 2, 1, 1, 1] - - -def test_set_image_spacing(): - - im = sitk.Image(5, 5, 5, sitk.sitkFloat32) - - iu.set_image_spacing(im, [1, 2, 3]) - - assert( np.allclose(im.GetSpacing(), [1, 2, 3]) ) - assert( np.allclose(im.GetOrigin(), [0.5, 1, 1.5]) ) - - -def test_new_image_3d(): - - im = iu.new_image([300, 200, 100], [1, 2, 3], sitk.sitkFloat32) - - assert( np.allclose(im.GetSize(), [300, 200, 100]) ) - assert( np.allclose(im.GetSpacing(), [1, 2, 3]) ) - assert( np.allclose(im.GetOrigin(), [0.5, 1, 1.5]) ) - - -def test_new_image_2d(): - - im = iu.new_image([300, 200], [1, 2], sitk.sitkFloat32) - - assert( np.allclose(im.GetSize(), [300, 200]) ) - assert( np.allclose(im.GetSpacing(), [1, 2]) ) - assert( np.allclose(im.GetOrigin(), [0.5, 1]) ) - - -@pytest.mark.parametrize("np_type,sitk_type", [(np.float32, sitk.sitkFloat32)]) -def test_np_sitk_convert(np_type, sitk_type): - - arr = np.zeros((100, 100), dtype=np_type) - - sitk_obt = iu.np_sitk_convert(arr.dtype) - np_obt = iu.sitk_np_convert(sitk_obt) - - assert( sitk_obt == sitk_type ) - assert( np_obt == np_type ) - - -def test_compute_coarse_parameters(): - - in_dims = [1000, 2000] - in_spacing = [5, 5] - out_spacing = [100, 100] - reduce_level = 2 - - cgd_exp = [50, 100] - cgs_exp = [100, 100] - cgr_exp = [2, 2] - - cgd_obt, cgs_obt, cgr_obt = iu.compute_coarse_parameters(in_dims, in_spacing, out_spacing, reduce_level) - - assert( np.allclose(cgd_obt, cgd_exp) ) - assert( np.allclose(cgs_obt, cgs_exp) ) - assert( np.allclose(cgr_obt, cgr_exp) ) - - -def test_block_apply(): - - row_blocks = [(ii, jj) for ii, jj in zip(range(0, 10, 2), range(2, 12, 2))] - col_blocks = [(ii, jj) for ii, jj in zip(range(0, 10, 5), range(5, 15, 5))] - blocks = [row_blocks, col_blocks] - - in_image = np.ones((10, 10)) - out_shape = [5, 2] - dtype = np.float32 - - out_image = iu.block_apply(in_image, out_shape, dtype, blocks, np.sum) - - assert( np.allclose(out_image, np.ones([5, 2]) * 10) ) - - -def test_grid_image_blocks(): - - in_shape = [10, 10] - in_spacing = [5, 5] - out_spacing = [20, 20] - - os_exp = [3, 3] - b_exp = [[(0, 4), (4, 8), (8, 10)]] * 2 - - blocks, out_shape = iu.grid_image_blocks(in_shape, in_spacing, out_spacing) - - assert( np.allclose(b_exp, blocks) ) - assert( np.allclose(os_exp, out_shape) ) - - -def test_rasterize_polygons(): - - shape = [10, 10] - scale = [1, 1] - points_list = [ [ (4, 4), (6, 4), (6, 6), (4, 6) ] ] - - exp = np.zeros((10, 10)) - exp[4:6, 4:6] = 1 - - obt = iu.rasterize_polygons(shape, scale, points_list) - assert( np.allclose(obt, exp) ) - - -def test_resample_into_volume(): - - vol = sitk.Image(20, 20, 10, sitk.sitkFloat32) - vol.SetSpacing([10, 10, 10]) - - im = sitk.Image(20, 20, sitk.sitkFloat32) - im.SetSpacing([10, 10]) - im += 5 - - obt = iu.resample_into_volume(im, None, 5, vol) - - arr = sitk.GetArrayFromImage(obt) - - assert( arr[5, :, :].sum() == 2000 ) - assert( arr.sum() == 2000 ) - - -def test_build_affine_transform(aff_params): - - point = (1, 2, 3) - - tf = iu.build_affine_transform(aff_params) - tp = tf.TransformPoint(point) - - assert( np.allclose(tp, [3, 5, 7]) ) - assert( np.allclose(tf.GetParameters(), aff_params) ) - - -def test_build_composite_transform(dfmfld, aff_params): - - point = (5, 5, 5) - exp = (15, 15, 15) - - trans = iu.build_composite_transform(dfmfld, aff_params) - obt = trans.TransformPoint(point) - - assert( np.allclose(exp, obt) ) - - -def test_resample_volume(): - - volume = np.ones((10, 10, 10)).astype(np.float32) - dims = [10, 10, 10] - spacing = [1, 1, 1] - - transform = sitk.TranslationTransform(3, [2, 2, 2]) - - obt = iu.resample_volume(sitk.GetImageFromArray(volume), dims, spacing, transform=transform, interpolator=sitk.sitkNearestNeighbor) # id - obt_arr = sitk.GetArrayFromImage(obt) - - assert( obt_arr.sum() == 8**3 ) diff --git a/allensdk/test/test_argschema_utilities.py b/allensdk/test/test_argschema_utilities.py deleted file mode 100644 index b2455df7cb..0000000000 --- a/allensdk/test/test_argschema_utilities.py +++ /dev/null @@ -1,182 +0,0 @@ -import os -import stat -import platform -from pathlib import Path - -import pytest -from allensdk.brain_observatory.argschema_utilities import ( - InputFile, - OutputFile, - RaisingSchema, - check_write_access, - check_write_access_overwrite) -from marshmallow import Schema, ValidationError - -READ_ONLY = stat.S_IREAD | stat.S_IRGRP | stat.S_IROTH -READ_WRITE = READ_ONLY | stat.S_IWRITE | stat.S_IWGRP | stat.S_IWOTH - - -def write_some_text(path): - with open(path, "w") as fil: - fil.write("some_text") - - -def try_write_bad_permissions(path): - try: - p = os.path.join(path, "check") - open(p, "w") - pytest.skip() - except PermissionError: - pass - - -class WriteAccessTestHarness(object): - def __init__(self, base_path): - self.base_path = base_path - - def setup(self): - raise NotImplementedError() - - def teardown(self): - pass - - -class ExistingFile(WriteAccessTestHarness): - def setup(self): - self.path = os.path.join(self.base_path, "parent", "foo") - os.makedirs(os.path.dirname(self.path)) - write_some_text(self.path) - return self.path - - -class NonexistentFile(WriteAccessTestHarness): - def setup(self): - self.path = os.path.join(self.base_path, "parent", "nonexistent_file.txt") - return self.path - - -class FileInBadPermissionsDir(WriteAccessTestHarness): - def setup(self): - self.first = os.path.join(self.base_path, "no_write") - - os.makedirs(self.first) - os.chmod(self.first, READ_ONLY) - - try_write_bad_permissions(self.first) - - self.path = os.path.join(self.first, "foo.txt") - return self.path - - def teardown(self): - os.chmod(self.first, READ_WRITE) - - -class FileInBadPermissionsMiddleDir(WriteAccessTestHarness): - def setup(self): - self.first = os.path.join(self.base_path, "first") - self.second = os.path.join(self.first, "second") - - os.makedirs(self.first) - os.chmod(self.first, READ_ONLY) - - try_write_bad_permissions(self.first) - - self.path = os.path.join(self.second, "foo.txt") - return self.path - - def teardown(self): - os.chmod(self.first, READ_WRITE) - - -@pytest.mark.parametrize( - "harness_cls,fn,raises", - [ - [ExistingFile, check_write_access, True], - [ExistingFile, check_write_access_overwrite, False], - [NonexistentFile, check_write_access, False], - [NonexistentFile, check_write_access_overwrite, False], - [FileInBadPermissionsDir, check_write_access, True], - [FileInBadPermissionsDir, check_write_access_overwrite, True], - [FileInBadPermissionsMiddleDir, check_write_access, True], - [FileInBadPermissionsMiddleDir, check_write_access_overwrite, True], - ], -) -def test_check_write_access(tmpdir_factory, harness_cls, fn, raises): - - base_dir = str(tmpdir_factory.mktemp("HW")) - - harness = harness_cls(base_dir) - testpath = harness.setup() - - if raises: - with pytest.raises(ValidationError): - fn(testpath) - else: - assert fn(testpath) - - harness.teardown() - - -class GenericInputSchema(Schema): - input_file = InputFile(required=True) - - -class GenericOutputSchema(RaisingSchema): - output_file = OutputFile(required=True) - - -class TestInputFile(object): - - def setup_method(self): - self.parser = GenericInputSchema() - - @pytest.mark.parametrize("input_data", [ - ({"input_file": "/some/invalid_filepath/input.h5"}), - ]) - def test_invalid_input_file(self, input_data): - with pytest.raises(ValidationError, match=r"No such file or directory"): - self.parser.load(input_data) - - def test_valid_input_file(self, tmpdir): - p = tmpdir.mkdir("input_file").join("valid_input.h5") - p.write("stuff") - - path_str = str(p) - obtained = self.parser.load({"input_file": path_str}) - assert obtained["input_file"] == Path(path_str) - - -class TestOutputFile(object): - - def setup_method(self): - self.parser = GenericOutputSchema() - - @pytest.mark.parametrize("output_data", [ - ({"output_file": "////invalid_filepath/output.json"}), - ]) - def test_invalid_output_file(self, output_data): - # Apparently allensdk.brain_observatory.argschema_utilities tests are - # skipped on Windows systems and the `check_write_access_overwrite` - # function itself does not work correctly on Windows systems. - # TODO: This is a stopgap for now - if os.name == 'nt': - pytest.skip() - # This test was failing on Bamboo because it was run in a container - # as root (which means pretty much anything is writable). If this test - # is run as root, skip it as it will always successfully create the - # output file. - if os.getuid() == 0: - pytest.skip() - if platform.system() == "Darwin": - # this should improve when we update to current argschema - pytest.skip() - - with pytest.raises(ValidationError, match="Can't build path to requested location"): - self.parser.load(output_data) - - def test_valid_output_file(self, tmpdir): - p = tmpdir.mkdir("output_file").join("output_file.json") - - path_str = str(p) - obtained = self.parser.load({"output_file": path_str}) - assert obtained["output_file"] == Path(path_str) diff --git a/allensdk/test/test_deprecated.py b/allensdk/test/test_deprecated.py deleted file mode 100644 index e226ae88f6..0000000000 --- a/allensdk/test/test_deprecated.py +++ /dev/null @@ -1,85 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import pytest -from allensdk.deprecated import deprecated, class_deprecated -import warnings - - -@pytest.fixture -def deprecated_method(): - - @deprecated() - def i_am_deprecated(): - pass - - return i_am_deprecated - - -@pytest.fixture -def deprecated_class(): - - @class_deprecated('msg') - class dep_cls(object): - def __init__(self, a): - self.a = a - - return dep_cls - - -def test_deprecated(deprecated_method): - expected = "Function i_am_deprecated is deprecated. " - - with warnings.catch_warnings(record=True) as c: - warnings.simplefilter('always') - deprecated_method() - - print(expected) - print(str(c[-1].message)) - - assert expected == str(c[-1].message) - - -def test_deprecated_class(deprecated_class, deprecated_method): - expected = 'Class dep_cls is deprecated. msg' - - with warnings.catch_warnings(record=True) as c: - warnings.simplefilter('always') - deprecated_method() - - obj = deprecated_class(1) - - assert( expected == str(c[-1].message) ) - assert( obj.a == 1 ) diff --git a/allensdk/test/test_inline_examples.py b/allensdk/test/test_inline_examples.py deleted file mode 100644 index d20a2b11bb..0000000000 --- a/allensdk/test/test_inline_examples.py +++ /dev/null @@ -1,23 +0,0 @@ -import subprocess as sp -import os - -import pytest - - -EXAMPLE_DIR = os.path.join( - os.path.dirname(__file__), - '..', - '..', - 'doc_template', - 'examples_root', - 'examples' -) -EXAMPLES = [filename for filename in os.listdir(EXAMPLE_DIR) if filename.split('.')[-1] == 'py'] - - -@pytest.mark.nightly -@pytest.mark.parametrize('script_name', EXAMPLES) -def test_inline_examples(script_name, tmpdir_factory): - - data_dir = tmpdir_factory.mktemp('inline_examples_data') - sp.check_call(['python', os.path.join(EXAMPLE_DIR, script_name)], cwd=str(data_dir)) \ No newline at end of file diff --git a/allensdk/test/test_temp_dir.py b/allensdk/test/test_temp_dir.py deleted file mode 100644 index 16fe1951fc..0000000000 --- a/allensdk/test/test_temp_dir.py +++ /dev/null @@ -1,39 +0,0 @@ -import pytest -import os -import numpy as np -from mock import patch, MagicMock -from allensdk.test_utilities import temp_dir - - -@pytest.fixture -def mock_request(): - return MagicMock() - - -@pytest.mark.parametrize("ismount,base_path",[ - (True, os.path.normpath(os.path.join('/', 'dev', 'shm'))), - (False, os.path.dirname(temp_dir.__file__)) -]) -@patch("numpy.random.randint", side_effect=([1, 2, 3, 4, 5, 6], - [1, 2, 3, 4, 5, 7])) -@patch("os.listdir", return_value=["allensdk_test_123456"]) -@patch("os.makedirs") -def test_tmp_dir(os_makedirs, os_listdir, randint, - mock_request, ismount, base_path): - with patch("os.path.exists", return_value=True): - with patch("os.path.ismount", return_value=ismount): - path = temp_dir.temp_dir(mock_request) - mock_request.addfinalizer.assert_called_once() - expected_path = os.path.join(base_path, "allensdk_test_123457") - os_makedirs.assert_called_once_with(expected_path) - assert path == expected_path - with patch("shutil.rmtree") as mock_rmtree: - with patch("os.path.exists", return_value=True): - with pytest.warns(UserWarning): - # run the finalizer - mock_request.addfinalizer.call_args[0][0]() - mock_rmtree.assert_called_once_with(expected_path) - mock_rmtree.reset_mock() - with patch("os.path.exists", return_value=False): - mock_request.addfinalizer.call_args[0][0]() - mock_rmtree.assert_called_once_with(expected_path) diff --git a/allensdk/test_utilities/__init__.py b/allensdk/test_utilities/__init__.py deleted file mode 100644 index 92ceaf67c3..0000000000 --- a/allensdk/test_utilities/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# \ No newline at end of file diff --git a/allensdk/test_utilities/custom_comparators.py b/allensdk/test_utilities/custom_comparators.py deleted file mode 100644 index 6db4bf48ac..0000000000 --- a/allensdk/test_utilities/custom_comparators.py +++ /dev/null @@ -1,124 +0,0 @@ -import re -from typing import Union -import difflib -import pandas as pd -import numpy as np - - -class WhitespaceStrippedString(object): - """Comparator class to compare strings that have been stripped of - whitespace. By default removes any unicode whitespace character that - matches the regex \\s, (which includes [ \\t\\n\\r\\f\\v], - and other unicode whitespace characters). - """ - def __init__(self, string: str, whitespace_chars: str = r"\s", - ASCII: bool = False): - self.orig = string - self.whitespace_chars = whitespace_chars - self.flags = re.ASCII if ASCII else 0 - self.differ = difflib.Differ() - self.value = re.sub(self.whitespace_chars, "", string, self.flags) - - def __eq__(self, other: Union[str, "WhitespaceStrippedString"]): - if isinstance(other, str): - other = WhitespaceStrippedString( - other, self.whitespace_chars, self.flags) - self.diff = list(self.differ.compare(self.value, other.value)) - return self.value == other.value - - -def safe_df_comparison(expected: pd.DataFrame, - obtained: pd.DataFrame, - expect_identical_column_order: bool = False): - """ - Compare two dataframes in a way that is agnostic to column order - and datatype of NULL values - - Parameters - ---------- - expected: pd.DataFrame - - obtained: pd.DataFrame - - expect_identical_column_order: bool - If True, raise an error if columns are not - in the same order (default=False) - - Raises - ------ - RuntimeError - If: - - dataframes do not have the same columns - - dataframes do not have identical indexes - - dataframe columns do not have identical contents - - When comparing the contents of dataframe columns, - the function: - - verifies that NULL values (whether None or NaN) are in - the same location - - loops over non-null values, casts arrays into lists, and - compares with == - """ - msg = '' - columns_match = True - if not expect_identical_column_order: - obtained_column_set = set(obtained.columns) - expected_column_set = set(expected.columns) - if obtained_column_set != expected_column_set: - columns_match = False - else: - if not obtained.columns.equals(expected.columns): - columns_match = False - - if not columns_match: - msg += 'column mis-match\n' - msg += 'obtained columns\n' - msg += f'{obtained.columns}\n' - msg += 'expected columns\n' - msg += f'{expected.columns}\n' - - missing_from_obtained = [] - for c in expected.columns: - if c not in obtained.columns: - missing_from_obtained.append(c) - missing_from_expected = [] - for c in obtained.columns: - if c not in expected.columns: - missing_from_expected.append(c) - msg += f'missing from obtained\n{missing_from_obtained}\n' - msg += f'missing from expected\n{missing_from_expected}\n' - raise RuntimeError(msg) - - if not expected.index.equals(obtained.index): - msg += 'index mis-match\n' - msg += 'expected index\n' - msg += f'{expected.index}\n' - msg += 'obtained index\n' - msg += f'{obtained.index}\n' - raise RuntimeError(msg) - - for col in expected.columns: - expected_null = expected[col].isnull() - obtained_null = obtained[col].isnull() - if not expected_null.equals(obtained_null): - msg += f'\n{col} not null at same point in ' - msg += 'obtained and expected\n' - continue - expected_valid = expected[~expected_null] - obtained_valid = obtained[~obtained_null] - if not expected_valid.index.equals(obtained_valid.index): - msg += '\nindex mismatch in non-null when checking ' - msg += f'{col}\n' - for index_val in expected_valid.index.values: - e = expected_valid.at[index_val, col] - o = obtained_valid.at[index_val, col] - if isinstance(e, np.ndarray): - e = list(e) - if isinstance(o, np.ndarray): - o = list(o) - if not e == o: - msg += f'\n{col}\n' - msg += f'expected: {e}\n' - msg += f'obtained: {o}\n' - if msg != '': - raise RuntimeError(msg) diff --git a/allensdk/test_utilities/regression_fixture.py b/allensdk/test_utilities/regression_fixture.py deleted file mode 100644 index 8cd9cdb71a..0000000000 --- a/allensdk/test_utilities/regression_fixture.py +++ /dev/null @@ -1,16 +0,0 @@ -import os -import sys -import logging -import json -from pkg_resources import resource_filename # @UnresolvedImport - -if 'TEST_SESSION_ANALYSIS_REGRESSION_DATA' in os.environ: - data_file = os.environ['TEST_SESSION_ANALYSIS_REGRESSION_DATA'] -else: - data_file = resource_filename(__name__, '../test/brain_observatory/test_session_analysis_regression_data_list.json') - -def get_list_of_path_dict(): - pyversion = sys.version_info[0] - logging.debug("loading " + data_file) - with open(data_file,'r') as f: - return [curr_fixture for curr_fixture in json.load(f) if curr_fixture['version'] == pyversion] diff --git a/allensdk/test_utilities/temp_dir.py b/allensdk/test_utilities/temp_dir.py deleted file mode 100644 index d738a7ff22..0000000000 --- a/allensdk/test_utilities/temp_dir.py +++ /dev/null @@ -1,72 +0,0 @@ -# Allen Institute Software License - This software license is the 2-clause BSD -# license plus a third clause that prohibits redistribution for commercial -# purposes without further permission. -# -# Copyright 2017. Allen Institute. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Redistributions for commercial purposes are not permitted without the -# Allen Institute's written permission. -# For purposes of this license, commercial purposes is the incorporation of the -# Allen Institute's software into anything for which you will charge fees or -# other compensation. Contact terms@alleninstitute.org for commercial licensing -# opportunities. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -import os -import shutil -import warnings - -import numpy as np - - -# Intended as a fixture. Used in conftest.py. -def temp_dir(request): - - tmpfs = os.path.normpath(os.path.join('/', 'dev', 'shm')) - # would like to check mount type, but that requires system calls - if os.path.exists(tmpfs) and os.path.ismount(tmpfs): - - base_path = tmpfs - - else: - - base_path = os.path.dirname(__file__) - - fls = os.listdir(base_path) - while True: - dname = ''.join(map(str, np.random.randint(0, 10, 6))) - if "allensdk_test_{}".format(dname) not in fls: - break - - specific_path = os.path.join(base_path, 'allensdk_test_' + dname) - os.makedirs(specific_path) - - def fin(): - shutil.rmtree(specific_path) - if os.path.exists(specific_path): - warnings.warn('test dir {0} still exists!', UserWarning) - - request.addfinalizer(fin) - - return specific_path diff --git a/brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc b/brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc index 486eacba326fcdfbc33a953a447b0615645c49b0..cbb0b82f0c89da93be1b9282bd0299c203c6fb23 100644 GIT binary patch delta 3007 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 WhXyyK8jhc|=clVDMgjKLaOZ!9B3``! delta 3003 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 VkUcYecEaphHCVnp=y&6X{sYDpRJ8yA diff --git a/brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc b/brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc index 55cdda6b321a9e797ff85ceaebd5a903bd98e9d1..124e056e46281b1425bacf6eda9600eb741fd374 100644 GIT binary patch delta 3050 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 delta 2675 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 CaXb6~ diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc index c8eff3adb80ddb663317e7d6ae33d637d93aebe6..b1869770de6aff5a899f14112362ca8686dc253c 100644 GIT binary patch delta 264 zcmbOrF+qaciI<m)0SK6u&D+Smfr&9^@*XBhpO~bg#LT?-{G{U4qO!!2{G!U3q|}VW zvdsLVn3TklM4(JoYH~?&Om1pPB1j-6zaXQsI6k$aAhjqnH#M&$9xgLkky(T>X0sXd z1s1_uoW-dn@tJuksTH@FbMljKO%~^nW4txljN=BUJkS+IN<d<=C5OUfbIysPw|H|B zlfVYWgX}0$21?$Ve3w&}8?06pq(N;mE7xK%MUV_jN@j9NkqStZ8ANDK-p7^5dyBQ8 gGOs)dEOcwK4!0T8Ezili+y;}UaBBc<-pd^f0H?E5B>(^b delta 264 zcmbOrF+qaciI<m)0SIyzH*VzKz{Kb?c@LAMkA6~7VrE`^eo}F2QCVV1eo>`<QffwG zS!RBbeoA6VB2XqPHMyi%KR2}`5hS3WUyxB*9G_ZIkXn?Po0?Y=50{y&$SlIBzuAoW z0*hc2XK`vtd}dxsYQ-()oc!dd$>JPxj8T)#IBsyt0$oug4<sgAawtqT=bR`S#ha6u z1U4uhWJi$#P%>)rT~1kUuv#UM2Ia}DT#LozfXrJgDVfP7MT#I%W)Pt=c^_9IZxm}m gWnOs_SSV_;4!0Rol;>n!ZiC5FxHW(_@8u2#0E)9tdH?_b diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc index 5110a4be0cff6d9077e751e476bd0d54509c992d..78adccd22d9556b5dd66ad82cf7491f6b17e10e9 100644 GIT binary patch delta 1058 zcmcIi&rcIU6yBN6Zhz3-{@kSnBLNRuO)7Yhn4k#=MT~+0!l6`~ZD)XO=(f&o36Mn( zka+5aF`kG~6FnJ?;Y6bG=*1XsCL8|-6BFabi!&t%|A0H$m$%=0GvBvwz8CplL)w_C zMkM~+eD&0P()Uh#1Hmf$0JFoT3N<ae+^9H&u9<FwZj>ry#ay!*w1iF9<dqt!x=x9< zY}>Mz%TALJTw-eAck%~6kVr*<r6R<j7{FPkqh-*;wou<<7l~p82it%oaHtJ&FG-RV zQAjE)VF}0f5KiLMj=T-FK~X0WVsJFQ2eFQg9mKJ2VsK0#-8i#@ikU|el8V_mDR*lB z6M7H?J}X2Y-o3*$xDo~)+=f7M!87Rb{5jl0ZlH!dgkc+O$*%07n&Qc|AP%(Qmf|V3 z5Jp(;C=39}lRU*kp3Id7I74{aNAnYN^DL>3gu=euq?YZn8CB<`L@gz*and#ZItC9? zC<545b&$P{8m0dvhmLR_p{74fukw_}MG!J*j0ZonL>u*Tqq(x-u$sCs<HwGH@~TyL z+Pv$Z+9*IE1R>C1oJX-X2WAhiceHxHWjU5>HSGNH5$un8&^0dDCPXN(kJ=C)#ZN7> z?8lagTQ-lk(Mcf)HnATb=l&^Bvrc?@%En|p7pA({KPEb~BSY02xV1`(QM_K}QzmrD ztP*;HOzfCs%~(HpxxX6&0F1N8@wse=2DNO<^}8@}s?=%<)wHmixC|!thZAD}TxXlf zE5#dvF4ClpDsdccVHy;GZem<M2Fr&s{G@<8#{VbAj|uF=FXn>utWY(^)YQdDL8M|X z+>og=;61CQst8Qydf1m#Ub!Wzw;4>&>YeKv72k>o!YXu;;q;}`=Xe@QAXx$f3Iy>0 z1W8TH@Jx<^WSqTDpXby5mcF3*O4GEl=}>X3&*FMN^ru+O7-Co-I7$!n0p9*y?}h## cuMI}2Ca5|_$#Wpb?imr@VHp)*vd_lCU#MCjC;$Ke delta 814 zcmY*X%WD%s7~k1!Hjg$BV|F*eg4!M=RP*qlNMm2rLcw~l(!(GulgzYkXf|<n6I<C> ziWLtMFW*(f2Ob0|NWF<3ym<7Uqkn-1QN)WgvC=v)AK(0b^Zn*~%=gNRVsbu_h$~_> zU+$3f*xTfuimt*3HGi>G<HT|8R?TC)OZ*n!D%IF6(sf$AM2SxX(_nSqEAfu&I_|pd zwHc!&NQ8c5J_<pmU_=$HQiMa)0z+FzIp}F8Ck?95%oCL!r`cWYKEft5m@z~QYVK;- zdZ=g$&aEhg{QghvUIbz2j&3h63Qb>mh5{6*&()shtBp{gQPfAhu&)JLBOHVqI#v5> zPY?7)goda_!&L8wkP;|?9%w<BM*1P48@&ealT|Cq(?W9)TjQ;!z2P)Ho)TvaZxT0C zQ^M<t?PY~gVvtXk;Zy3}$h0`|8EIx=CtcabnRVvd!+tof&-fatGhP%tPDz5)Z+9He z@tu~-=L9-X+jJ0H5bay!q{(o2$)#+w5aWiFtjf6LzkW7bw6nqRDBZLVrH{NXBhVat zOIRa==&%O&PVMpjjbjL*X;{syoF2ZYbzH|Ej8Nv)xziqIGAlv{X!Y(nSk`m!HDjWg z{a=}Rgf2rhdkN1=I^O23I`cd+SsoDpHVCEmA!r|@myz)Q_2ZPpj+9=A@H0Y!SK&*x z6rYu@Y$1lIF@aveS)-2f07g+?kkl3UY+O&v0dQR!Ie5MdMe{s51;iYK2j+zM6R*w5 z3f9}irNrYh5Qp1aq62?}hAGE~K(R)|7mmssOHj>K;DR--9=MOJaUr#5oltREaAo*y X#Z_DsZUM@<xZtL8HM9axbE|&<Y&YeH diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc index 54070fe5ce704fe8dc406422821a6158c3618c15..23bcacb47728c6da5539fa156f5a497825dc2950 100644 GIT binary patch delta 1150 zcmY+D&x;&I6vwTe>E4~~jag!LaWtdOZYFChY_gN!#%Okz5H~*%F~4Cl(AIR<%yj6k zZeCYUGP%UFh!E?h<QzPP`4<#H5xjUQ@Q_0e0S`g{0pIIhh!*sx>b+M#UVmTJ!{}k; zo;z@0;T3F;&OLhKb}bg`ZL7J}9{`V}pAK>X6RuL2_6K6jCs7LhkSmUnJ0ehd9||cW zIr8&Nh_FBV#`@V|M&E3_g)AB$vG(jq<0r;e^<6h%Yx<eH?Ht9^pfmFpzpJsf{_)^C zPW|g(+dW49DyUyy8nMmUmrGyRY(qa?USB?m!Je)B36ITO!ta#>-CBv++1XbsSFFxi zT0Ms_Zjj1=D<SbS^&pNi<47)(NSbe(N7=USGz+$;zi+k<b!h%PZ5Kwvp*IJ|^e@dd zhum;s_D}PNxlh({>@j$kT#UxcaD>Km6nKR92wMna-xrYP#?Hq)6VN7CEfx}X_0#t1 zh4;%TcgF$*d_Zd&gj0kK3N<jvph)r}@fM*J<08c_5e^ZmwDjfG$L!kd@6|0UF!eNv zl*h~huJyAtj)E!tC*#lXmv(6B+XRbH=1r+o$5SF+9d3~0CZhLhkOE+7Md(wZjsCi` z%X+ilI!6{-!xZ=kt8M0m4AM|QUP@9XYqWFX&j(fcaG%kzY=?J8XkdG><5~MZfY!eA z_Z?Jr8*S|9@aHu`o$xUN`UtPqvu;Ua4fCEoP}59cw&y9hh%olV&!ds4PkgNIg3^P{ z!w=5TsyE<MiaVHc!d0dBo3!jS;X{hKH}G=b;z0KoHpzXButF$Rx=N#$MOq?rjj%`9 zCG-%+!4xEqd(NOxO5BFt{4k0YeN|ml>dPWARu-DZdDL_dcp{8_NrvK{_gbaBOS{qk znx*?WmO%Jw3?d(=aR@_-kz_`H-d%BylX*hN-81;C9(R8Y3Ur`?-T!sh$+E7)ZR%TQ zF%P0_x>02cF*=RA?^0al<=rqgrkPEvSL9?|hCBy}Q{lA!<K#P+%iG=}yVQu3F||ml i@}^hHkc`GwMHUMvUt}p&scR`!eUPRx6nf{>)qepn-z-`H delta 1150 zcmY+D&u`pB6vr9w+R4T#jY<=-&~2I@ORx&rHf>4Upd_F|)wJ{n0xC@puGgO3HL}On z^X#_UOW}$TQkfeZIaD00{TDz;AS5omSmMwF2P6)N{sX)>PE{DmpP6}Ye!Tg<=LhkF z*nRiFfteSurQd!2$lb8m6}@dWH#=PjV(DkyLcl0c8H_t!F$hL+2AwES0eU_ap(;8s zlrolmzsQA%I+L%gpB%>ZCyk@XVPlIeP98OWWbBx}<ECs$|KV;s%Xk~COuX4|YHU&e zaBvNm{&jH4T_t<v)GyEV+4|(Ox!X27uAj`W&7VLgx0OE%5<Zm%cg;Yz77})L^2Ndp zt9_PsPa#S-%w!lSA@Sq&Fo|>S$UvsC<X<;e**V>A4%xQ;w%IzgLhGmLxG3)RyeU}K zKQ~t#GQ-Z~Y4iK3_u4r27`#R%M&o%nLSwoL)(Ec?P9sYDo`9?<?P3t*0v5?sON4|i z{bXtRqGy)e83+(?iuN=JCke;N)xaRbVOk7RZx)OgyX1R^aEMTarT3N}vdfcymN%`C z*RwQM9^*5(*Uz&g4#)7Hh_B+4&ePVT1dCwerckQuDG;v?ACTcHg1;DM0GL`4`IKm` zzijWaYm;BwM`l{jN}!w;GRz_Yg^|Pr%e8aj_xn})@SJ|nw8Oi7oM8KV$FueyfU|w$ zZ#$^$Ih<ohm;YHK)Cq4R;0D60aqFfmtzN<Ht{Ue8qczT1be8tWFXDb#ANiQw8Kt`? z58vOUU9Z3e@;ki@(m+*uzls((LwJjP?#Ec%Hv^#hg>^DtCM*z)N_#YVo}@XNE)li~ zTZC(f(!mfU)}_-ODkW|KpYFwpqOZz}%6vIYODm6f;{s~>J_M=Y_9YpKyWUHc_AZ@9 z@8xs%3QU3U)c`~>$dU*+`EHR<U*A}8-k|B5I@vgnztzKyU&0U#s9@)R-4&WyAHj9% zTYR<%<9xhcMG8I|xw~&tfhtUGa2vzS$L8_e$paY$1>DA^a7I5qb!=~qhAo28h?FU7 ju~eqgD`iN=(pJMf5n%pEBbCwBNLBA<SpuQnIsM_kq%Izt diff --git a/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py b/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py index 2f640e1586..d3209a786a 100644 --- a/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py +++ b/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py @@ -123,7 +123,7 @@ def from_lims( behavior_session_id: int, ophys_experiment_id: Optional[int] = None, ) -> "RunningAcquisition": - + print("TEST", behavior_session_id) stimulus_file = StimulusFile.from_lims(db, behavior_session_id) stimulus_timestamps = StimulusTimestamps.from_stimulus_file( stimulus_file=stimulus_file @@ -133,6 +133,29 @@ def from_lims( ) running_acq_df.drop("speed", axis=1, inplace=True) + return cls( + running_acquisition=running_acq_df, + stimulus_file=stimulus_file, + stimulus_timestamps=stimulus_timestamps, + ) + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_cache_key) + def from_ophys_lims( + cls, + db: PostgresQueryMixin, + behavior_session_id: int, + ophys_experiment_id: Optional[int] = None, + ) -> "RunningAcquisition": + print("TEST", behavior_session_id) + stimulus_file = StimulusFile.from_lims(db, behavior_session_id) + stimulus_timestamps = StimulusTimestamps.from_ophys_stimulus_file( + stimulus_file=stimulus_file + ) + running_acq_df = get_running_df( + data=stimulus_file.data, time=stimulus_timestamps.value, + ) + running_acq_df.drop("speed", axis=1, inplace=True) + return cls( running_acquisition=running_acq_df, stimulus_file=stimulus_file, diff --git a/brain_observatory/behavior/data_objects/running_speed/running_processing.py b/brain_observatory/behavior/data_objects/running_speed/running_processing.py index 7222cb7d10..97dabebc0d 100644 --- a/brain_observatory/behavior/data_objects/running_speed/running_processing.py +++ b/brain_observatory/behavior/data_objects/running_speed/running_processing.py @@ -351,8 +351,8 @@ def get_running_df( their own corrections and compute running speed from the raw source. """ - v_sig = data["items"]["behavior"]["encoders"][0]["vsig"] - v_in = data["items"]["behavior"]["encoders"][0]["vin"] + v_sig = data["items"]['foraging']["encoders"][0]["vsig"] + v_in = data["items"]['foraging']["encoders"][0]["vin"] if len(v_in) > len(time) + 1: error_string = ("length of v_in ({}) cannot be longer than length of " @@ -372,7 +372,7 @@ def get_running_df( # dx = 'd_theta' = angular change # There are some issues with angular change in the raw data so we # recompute this value - dx_raw = data["items"]["behavior"]["encoders"][0]["dx"] + dx_raw = data["items"]["foraging"]["encoders"][0]["dx"] # Identify "wraps" in the voltage signal that need to be unwrapped # This is where the encoder switches from 0V to 5V or vice versa pos_wraps, neg_wraps = _identify_wraps( diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc index 346c6e0b5629ae6c4e26d69d7d65157a0298a602..940676e58bba7fd5659c81b6fdb32f8cc954d046 100644 GIT binary patch delta 1950 zcmZuyTW=dh6yBL#JHGA4cAUgXnoE<W#Z4WcC{22!rIZG#QXVK0Wo5LiJ(I-A`jXjo zOQN6%8mWCLsLX5o&?m%m`2l_555U{J^#_0izkqYbt{Xxv&6%_3oH_HI%N+kY|LTl$ z!?sff{F+yu`JW9xaf;-hCug30-k5YJiNOq(4yGE@?ldv@49h$v%x2D^<(^~(KFcYe z9W&VAQ_8X|cNlZ$Rt=VCLx%<%;zK;kbKK^G+~H%q_#ow;dQl*!2{Gkm`cYaHHhARS z-{d@yJG7G+1_-|xVod%;SE@n1S_$hBFSq^Lw!gu{iXQ~L8M5t4RrvL$*Q$nG-1DQB z*sWCgrhl*A5*6l0K4`XhEeb19y}`rCZ?wZo2z)2#gx(REd}J=zlW=E9F?b>-<V*AG zsUq--vZ^=%j6l5@>yvT$p;cTt3E$mAmY4><2CM&z_qgzPV7TEDX1J6Q*JLN;57zR* z03<XH=}NNHq4j{c8J^+^Oftwa%+@j+WDdw2kPWh|mJPB=oz6JVLBb7|dur)K$J{*F z7N9J{Yy`?O1ZNANABD3;Hm1)G^8(0FGM;4<U^Md3unc$fj!~L=aXn_!1q?~dBAEkH zA}Z;5wZIQU&+CRij=Fb%EXi*M7RjvqdEmxPmFXw8y&aUO=(_<v2gb_6ij+)&S?&5i zh1}7MmJ_4on*1bj@t~#)0eTab1?yv2A)<;5M)t`AN{k5hEz0O)@-5vr_US%h=3@$h zSZjOEonDz|Zq);RsYJvgoc#|hQ^ne%-i*W$XvDjy?t@ze$#HaGpo;6F)$m&F&E3%J z$GZ+U+y-r!0b*DwLP^S`K=&5pVzPMRE#?3OlPk*dVdB!4DjDuJYhK%rHeVyusiz_j zMk;|9Xk`zdKKeFzj)te5;hDQ~Jh_s_w<O9yYE=Gh7UWLy=C*cE1gao4y)VpeDJC4) zR8o7|3R_LF1mD6&@*Wyk-2!T_c+gE^B0RkBXf4tH0+6blNqvx=!p}Fas4Q!#uMV^j zU)BF0;B7q!LA?=bNL?HnLc9y%nA3jC9*40E-nL<N>l4pVi&!K@<hAr%T<3+z=d>XA z(|?kZ+{%>7XAu(>3$VHARwrtAB9GN;(Q(I@!C+6m%v>jBN$f8!W6MJ<dNWn3Em}1m zhV|x#%Hw#`6A2oQi*>)oyJoR&C|9Jkm&T4f1@HuQ$7XBZuRfBm?C)mKts)^50DD!; zBhfOe)2v70s{GzLzpnB=W5;e%!zg=$#%r`#C*a@+BNSJFxaod3N1>b06$Ptf0jqe_ zLOegp@xiO4DDMuwf1n1M%ooDn75HMieS#gN2ZT!N!O`H+COE^|iStNwOI<_`TSOFq zC=;I|mP%k+1-^N49my>q%I?je8V`cka|qM*DdhVcTIr!Q0~`(}Jtz`sD`t?{I5qQ0 zSSd<iC;3c<I4Q>gE-ui%MAl04VnnWHPunWi>@?cD0$;O|d)bpj$(`J?{3CmgsGo8d zs9KaHSIT0uhi_s<qu*}pIRd%v{WmS@N;myr(Qnsvh(bp^0lvi=68yi=5RRl-x4^jE T&!2S)R>pMVBQXcM)gu1_10}Kp delta 1627 zcmZuxOK%%h6rMXCKVo|(e&k`NP3k12VcIlFLm&wfEo}u7;<2d^VnjO~``!>I<FR#S z+{i*GYKVl`AcZTjDnbYe(Jg^3zkv;#*#Li_KY$hI+;LK5u;k;b^Z3qpzI(3!TKf3~ z>yByWHT-nGf9!o*J+W%+*~!v3>rCSsFZi>aIcJV(;u0@DVcg`_vEelMgqRn)n6GPm z{E5y>ynLK?7Eb=2Ws9dZc7-ur-qLT&ul2p$1R_7xpeA#vE%uJQovLrFHo<ELZnqf< zc;rQ07_2tMuJ@?jg;nlF9!B;=D+*Vmc1MJf*Xf0;az0yS%F16-HS;2(hB~okFeBsC z!@JXXj&<II3wQvEL+#wuDOlZsZpZc8ozQK0tzF^ni$Mbe3624C@>8Q;`4v4va~Rhg zoiiuJXXKB@=3x%S7{gKXyl`xM#+;(a3ln`s^eIu$XYmVST$Dsclu#Iw#u!Rd#@q_Z zSLG8ZUj=Kc7@x%2DL$?6CPWo|<f-vG=1hLB8JaV7PqQz^m3z@Cq{sAY#1`hsETFMj zJm$JB-wQ+6O@^g8VF}HK{2{x-=H>6%J0Cg45QXgf{m||0`?d}Z$|4v%m+>byNOd~} zq+x=;NT(6~DoVd|tev(mZptvXT|^k-1IuXSpV`e1ow0BbwA`K-?Vhz$gmtK3N}Quo z6&$uy)&JMhN?H;a)x0gY^II9(C|H&U`TP5c3_u>64Mj;NOM^wN#uUI_*bQKf%1kmV zlx`%`DlmdU&Zv@VGcq{b!0`L>R^g@6ER{cBuw{8vxPPdev~d5SK;4EEXzdiGgomP# zNhpkfp5N~%jdetOfZwo)M#~g+gBdK(<b&cOTRuH1W*B=>eqq|zZ49ICSMkRwbo)`S zAGy5Uibern!Gw<d!+f1B%ZByAOoQr}S`RxF=X=m?i7;#jA3O5InlM#3op9ciKUpu= zM;0Wf#10OcpL{j`xIyVL3sLCnc!JAhl+Wk~?FhEycjN0jPQ~NgRgb<ML;`lamT)G? z_q@B?>GHlW5Qrv%O*Bs7d<~<}$*G&etdRlZOw@Ie&XL?My~d{HLFvY!lMT2B;0-`0 zFtrb~DeBe41@)RbBHBeTx})T_Ht0lK097<`3aJ9!29Sbaka?BNO*FANe3LEV`)BWx zghFMnX?WM59_c0Y&_fO9(Buk6T4M_t`EGf-KoOh0XJ3X%*)3mLbJ9V-(;L8D^gHR^ z00&B1rpb|4j+Lf||D_pnyd@u2Z27FbtvhSOV>Sb{GLCdB=sim?<!_ZQ-$b!}Uj!lF xUr`qjc>aplYpX#)%{_yq@CF&83PkT;I;$0^%cs?=Rw-3XS(&M{g==ZBe*j!rYcl`< diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc index 6bc2c79adb66c14a1551b8815f0d6d08d8ffbacc..c3a03877c287ce8b440a3b3afa920da2a4fa0392 100644 GIT binary patch delta 637 zcmYjO-D(p-6rPz)Hk)LVG_i&jp|-s#xkyp)LZnKGFCchjS&Wm+G}&hVI5S&WNbtrB zuavU43he`UA$<(rV4lJ!5YGgy88{zj&N+N%zHh#Fer>l$tyY8Jd3W-SSL;{p9hzJn zjUIcldQlhEuS|HN{;_h_lvMiCIcK|M-DzN_DSYg-g!7sVT0cI0W=-Qw<eXoIDVXxW z+21klTxmXC7<Zb-Dvt*aRB@Ln-#8Cxr!1VOAEIy)s8GvchI4!-RluW2CQ2-V3Ggr( zrxPXNlIs+T;2(P+xaQcokW;M!9mW#Z#F+{d=6RH>@kZ@`I?f=SN~OYNcAOPve<pSL zs4^UN@l8`|UBKgDR4`s*s6&J$5p<WVs3zA`uq8cbH}sm_5aB!^E4E~)zH-~8zv%+% zI1ZL*hC#^bms3=1?S-ZVAK|YB(6WWLh0YypVP>}RRpa+_DWeS$d)QGf0_l3RPoa1F zwz9{lDOc|B;2xIGYCH;OiG($$q2o>3@~3<F?8zO)R)aPu^zlAu8&?+@`T-2Drj~I% z#~%S}f~h8XoE6Y0k800fnOY(^058D01wA|9C=F|#jb&>!Ya!lAoQgb>FRUTTYWJzn LJmx#S`@Q}jr*fY5 delta 396 zcmYjN%SyvQ6wM@kWb$ZzQG9?!K_rWktp$}*SBkiCHx$aG8QZj(B+N_-T?&E=K`FBn zcdlKCAK-s<>ks$|PAY<Tak%H6!#QxjH{R;CuIpNw8v1&R+m(536ZGbX-6kM5F>drN zjg-eQG+*=(hSpsPIiYc_dG`DBqke|WfQ;}oN*S`FL=ZN`F{hjX6*nw0wa!z=GZuQ1 zp~{F0JeZ)$Ag4U1p25mWM{;5`fh8Y|qpQm(=<!I9R;GM-NO%v&F-dqh@dJjVq@M=7 zs1PZe`G3WJhy_;4m<$B>MMR0Jp&9q(YH1z#@}P79oR975t`3lF!`7Z#v{rE(4HLo` zRBQqItoXn$*zz9kH=2s`iUMuL0v2F(wRx`mggX$GlbmKVX38&ka*nD=h#A8(<|xa; i;DRm9{}PwkcA=WbG!65ZoE8t_#oYmpZt9M)*7yO7*=0Zg diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py index 2df1042c40..51dc7eef35 100644 --- a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py +++ b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py @@ -21,7 +21,8 @@ JsonWritableInterface, NwbWritableInterface from allensdk.brain_observatory.behavior.data_objects.timestamps\ .stimulus_timestamps.timestamps_processing import ( - get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps) + get_behavior_stimulus_timestamps, get_ophys_stimulus_timestamps, + get_wheel_timestamps) from allensdk.internal.api import PostgresQueryMixin @@ -71,7 +72,19 @@ def from_stimulus_file( timestamps=stimulus_timestamps, stimulus_file=stimulus_file ) + @classmethod + def from_ophys_stimulus_file( + cls, + stimulus_file: StimulusFile) -> "StimulusTimestamps": + print("Stimulus File:", stimulus_file) + stimulus_timestamps = get_wheel_timestamps( + stimulus_pkl=stimulus_file.data + ) + return cls( + timestamps=stimulus_timestamps, + stimulus_file=stimulus_file + ) @classmethod def from_sync_file(cls, sync_file: SyncFile) -> "StimulusTimestamps": stimulus_timestamps = get_ophys_stimulus_timestamps( diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py index b34f9b0e1b..bd99a8ce65 100644 --- a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py +++ b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py @@ -27,6 +27,27 @@ def get_behavior_stimulus_timestamps(stimulus_pkl: dict) -> np.ndarray: stimulus_timestamps = np.hstack((0, vsyncs)).cumsum() / 1000.0 return stimulus_timestamps +def get_wheel_timestamps(stimulus_pkl: dict) -> np.ndarray: + """Obtain visual behavior stimuli timing information from a behavior + stimulus *.pkl file. + + Parameters + ---------- + stimulus_pkl : dict + A dictionary containing stimulus presentation timing information + during a behavior session. Presentation timing info is stored as + an array of times between frames (frame time intervals) in + milliseconds. + + Returns + ------- + np.ndarray + Timestamps (in seconds) for presented stimulus frames during a session. + """ + vsyncs = stimulus_pkl["intervalsms"] + stimulus_timestamps = np.hstack((0, vsyncs)).cumsum() / 1000.0 + return stimulus_timestamps + def get_ophys_stimulus_timestamps(sync_path: Union[str, Path]) -> np.ndarray: """Obtain visual behavior stimuli timing information from a sync *.h5 file. diff --git a/brain_observatory/behavior/ophys_experiment.py b/brain_observatory/behavior/ophys_experiment.py index 5dcb0aafc4..d149d6754b 100644 --- a/brain_observatory/behavior/ophys_experiment.py +++ b/brain_observatory/behavior/ophys_experiment.py @@ -62,7 +62,7 @@ class OphysExperiment(OphysSession): """ def __init__(self, - behavior_session: OphysSession, + ophys_session: OphysSession, projections: Projections, ophys_timestamps: OphysTimestamps, cell_specimens: CellSpecimens, @@ -70,19 +70,19 @@ def __init__(self, motion_correction: MotionCorrection, #eye_tracking_table: Optional[EyeTrackingTable], #eye_tracking_rig_geometry: Optional[EyeTrackingRigGeometry], - date_of_acquisition: DateOfAcquisition): + date_of_acquisition: DateOfAcquisitionOphys): super().__init__( - behavior_session_id=behavior_session._behavior_session_id, - metadata=behavior_session._metadata, - raw_running_speed=behavior_session._raw_running_speed, - running_speed=behavior_session._running_speed, - running_acquisition=behavior_session._running_acquisition, - #stimuli=behavior_session._stimuli, - stimulus_timestamps=behavior_session._stimulus_timestamps, - #task_parameters=behavior_session._task_parameters, - #date_of_acquisition=date_of_acquisition + ophys_session_id=ophys_session._ophys_session_id, + metadata=ophys_session._metadata, + raw_running_speed=ophys_session._raw_running_speed, + running_speed=ophys_session._running_speed, + running_acquisition=ophys_session._running_acquisition, + #stimuli=ophys_session._stimuli, + stimulus_timestamps=ophys_session._stimulus_timestamps, + #task_parameters=ophys_session._task_parameters, + date_of_acquisition=date_of_acquisition ) - + self._ophys_session = ophys_session self._metadata = metadata self._projections = projections self._ophys_timestamps = ophys_timestamps @@ -93,7 +93,7 @@ def __init__(self, def to_nwb(self) -> NWBFile: nwbfile = super().to_nwb(add_metadata=False) - + self._ophys_session.to_nwb() self._metadata.to_nwb(nwbfile=nwbfile) self._projections.to_nwb(nwbfile=nwbfile) self._cell_specimens.to_nwb(nwbfile=nwbfile, @@ -163,7 +163,7 @@ def _get_eye_tracking_table(sync_file: SyncFile): ophys_experiment_id=ophys_experiment_id) stimulus_timestamps = StimulusTimestamps.from_sync_file( sync_file=sync_file) - #behavior_session_id = OphysSessionId.from_lims( + #ophys_session_id = OphysSessionId.from_lims( # lims_db=lims_db, ophys_experiment_id=ophys_experiment_id) is_multiplane_session = _is_multi_plane_session() meta = MultiplaneMetadata.from_lims( @@ -171,9 +171,9 @@ def _get_eye_tracking_table(sync_file: SyncFile): ) date_of_acquisition = DateOfAcquisitionOphys.from_lims( ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) - behavior_session = OphysSession.from_lims( + ophys_session = OphysSession.from_lims( lims_db=lims_db, - behavior_session_id=ophys_experiment_id, + ophys_session_id=ophys_experiment_id, stimulus_timestamps=stimulus_timestamps, date_of_acquisition=date_of_acquisition ) @@ -208,7 +208,7 @@ def _get_eye_tracking_table(sync_file: SyncFile): ophys_experiment_id=ophys_experiment_id, lims_db=lims_db) return OphysExperiment( - behavior_session=behavior_session, + ophys_session=ophys_session, cell_specimens=cell_specimens, ophys_timestamps=ophys_timestamps, metadata=meta, @@ -255,7 +255,7 @@ def _is_multi_plane_session(): return cls._is_multi_plane_session( imaging_plane_group_meta=imaging_plane_group_meta) - behavior_session = OphysSession.from_nwb(nwbfile=nwbfile) + ophys_session = OphysSession.from_nwb(nwbfile=nwbfile) projections = Projections.from_nwb(nwbfile=nwbfile) cell_specimens = CellSpecimens.from_nwb( nwbfile=nwbfile, @@ -283,7 +283,7 @@ def _is_multi_plane_session(): date_of_acquisition = DateOfAcquisitionOphys.from_nwb(nwbfile=nwbfile) return OphysExperiment( - behavior_session=behavior_session, + ophys_session=ophys_session, cell_specimens=cell_specimens, eye_tracking_rig_geometry=eye_tracking_rig_geometry, eye_tracking_table=eye_tracking_table, @@ -352,7 +352,7 @@ def _get_eye_tracking_table(sync_file: SyncFile): dict_repr=session_data, is_multiplane=is_multiplane_session) monitor_delay = calculate_monitor_delay( sync_file=sync_file, equipment=meta.behavior_metadata.equipment) - behavior_session = OphysSession.from_json( + ophys_session = OphysSession.from_json( session_data=session_data, monitor_delay=monitor_delay ) @@ -387,7 +387,7 @@ def _get_eye_tracking_table(sync_file: SyncFile): dict_repr=session_data) return OphysExperiment( - behavior_session=behavior_session, + ophys_session=ophys_session, cell_specimens=cell_specimens, ophys_timestamps=ophys_timestamps, metadata=meta, @@ -395,7 +395,7 @@ def _get_eye_tracking_table(sync_file: SyncFile): motion_correction=motion_correction, eye_tracking_table=eye_tracking_table, eye_tracking_rig_geometry=eye_tracking_rig_geometry, - date_of_acquisition=behavior_session._date_of_acquisition + date_of_acquisition=ophys_session._date_of_acquisition ) # ========================= 'get' methods ========================== diff --git a/brain_observatory/behavior/ophys_session.py b/brain_observatory/behavior/ophys_session.py index d31daa6931..7df2f4e89f 100644 --- a/brain_observatory/behavior/ophys_session.py +++ b/brain_observatory/behavior/ophys_session.py @@ -21,7 +21,7 @@ BehaviorMetadata, get_expt_description from allensdk.brain_observatory.behavior.data_objects.metadata\ .behavior_metadata.date_of_acquisition import \ - DateOfAcquisition + DateOfAcquisitionOphys from allensdk.brain_observatory.behavior.data_objects.rewards import Rewards from allensdk.brain_observatory.behavior.data_objects.stimuli.stimuli import \ Stimuli @@ -54,7 +54,7 @@ class OphysSession(DataObject, LimsReadableInterface, """ def __init__( self, - behavior_session_id: OphysSessionId, + ophys_session_id: OphysSessionId, stimulus_timestamps: StimulusTimestamps, running_acquisition: RunningAcquisition, raw_running_speed: RunningSpeed, @@ -63,11 +63,11 @@ def __init__( #task_parameters: TaskParameters, #trials: TrialTable, metadata: MultiplaneMetadata, - #date_of_acquisition: DateOfAcquisition + date_of_acquisition: DateOfAcquisitionOphys ): - super().__init__(name='behavior_session', value=self) + super().__init__(name='ophys_session', value=self) - self._behavior_session_id = behavior_session_id + self._ophys_session_id = ophys_session_id self._running_acquisition = running_acquisition self._running_speed = running_speed self._raw_running_speed = raw_running_speed @@ -76,7 +76,7 @@ def __init__( #self._task_parameters = task_parameters self._metadata = metadata #self._trials = trials - #self._date_of_acquisition = date_of_acquisition + self._date_of_acquisition = date_of_acquisition # ==================== class and utility methods ====================== @@ -102,7 +102,7 @@ def from_json(cls, `OphysSession` instance """ - behavior_session_id = OphysSessionId.from_json( + ophys_session_id = OphysSessionId.from_json( dict_repr=session_data) stimulus_file = StimulusFile.from_json(dict_repr=session_data) stimulus_timestamps = StimulusTimestamps.from_json( @@ -124,14 +124,14 @@ def from_json(cls, stimulus_timestamps=stimulus_timestamps, trial_monitor_delay=monitor_delay ) - date_of_acquisition = DateOfAcquisition.from_json( + date_of_acquisition = DateOfAcquisitionOphys.from_json( dict_repr=session_data)\ .validate( stimulus_file=stimulus_file, - behavior_session_id=behavior_session_id.value) + behavior_session_id=ophys_session_id.value) return OphysSession( - behavior_session_id=behavior_session_id, + ophys_session_id=ophys_session_id, stimulus_timestamps=stimulus_timestamps, running_acquisition=running_acquisition, raw_running_speed=raw_running_speed, @@ -143,18 +143,18 @@ def from_json(cls, ) @classmethod - def from_lims(cls, behavior_session_id: int, + def from_lims(cls, ophys_session_id: int, lims_db: Optional[PostgresQueryMixin] = None, stimulus_timestamps: Optional[StimulusTimestamps] = None, monitor_delay: Optional[float] = None, - date_of_acquisition: Optional[DateOfAcquisition] = None) \ + date_of_acquisition: Optional[DateOfAcquisitionOphys] = None) \ -> "OphysSession": """ Parameters ---------- - behavior_session_id - Behavior session id + ophys_session_id + ophys session id lims_db Database connection. If not provided will create a new one. stimulus_timestamps @@ -167,10 +167,10 @@ def from_lims(cls, behavior_session_id: int, calculate_monitor_delay date_of_acquisition Date of acquisition. If not provided, will read from - behavior_sessions table. + ophys_sessions table. Returns ------- - `BehaviorSession` instance + `ophysSession` instance """ if lims_db is None: lims_db = db_connection_creator( @@ -178,37 +178,49 @@ def from_lims(cls, behavior_session_id: int, ) metadata = MultiplaneMetadata.from_lims( - ophys_experiment_id=behavior_session_id, lims_db=lims_db + ophys_experiment_id=ophys_session_id, lims_db=lims_db ) - running_acquisition = RunningAcquisition.from_lims( - lims_db, behavior_session_id + sess_id = OphysSessionId.from_lims( + ophys_experiment_id=ophys_session_id, lims_db=lims_db + ) + running_acquisition = RunningAcquisition.from_ophys_lims( + db = lims_db, + behavior_session_id = sess_id.value ) raw_running_speed = RunningSpeed.from_lims( - lims_db, behavior_session_id.value, filtered=False, + db = lims_db, + behavior_session_id =sess_id.value, + filtered=False, stimulus_timestamps=stimulus_timestamps ) running_speed = RunningSpeed.from_lims( - lims_db, behavior_session_id.value, + db = lims_db, + behavior_session_id =sess_id.value, stimulus_timestamps=stimulus_timestamps ) + date_of_acquisition = DateOfAcquisitionOphys.from_lims( + ophys_experiment_id=ophys_session_id, + lims_db=lims_db + ) if monitor_delay is None: monitor_delay = cls._get_monitor_delay() return OphysSession( - behavior_session_id=behavior_session_id, + ophys_session_id=ophys_session_id, stimulus_timestamps=stimulus_timestamps, metadata=metadata, raw_running_speed=raw_running_speed, running_acquisition=running_acquisition, - running_speed=running_speed + running_speed=running_speed, + date_of_acquisition=date_of_acquisition #trials=trials, ) @classmethod def from_nwb(cls, nwbfile: NWBFile, **kwargs) -> "OphysSession": - behavior_session_id = OphysSessionId.from_nwb(nwbfile) + ophys_session_id = OphysSessionId.from_nwb(nwbfile) stimulus_timestamps = StimulusTimestamps.from_nwb(nwbfile) running_acquisition = RunningAcquisition.from_nwb(nwbfile) raw_running_speed = RunningSpeed.from_nwb(nwbfile, filtered=False) @@ -219,7 +231,7 @@ def from_nwb(cls, nwbfile: NWBFile, **kwargs) -> "OphysSession": date_of_acquisition = DateOfAcquisition.from_nwb(nwbfile=nwbfile) return OphysSession( - behavior_session_id=behavior_session_id, + ophys_session_id=ophys_session_id, stimulus_timestamps=stimulus_timestamps, running_acquisition=running_acquisition, raw_running_speed=raw_running_speed, @@ -262,7 +274,7 @@ def to_nwb(self, add_metadata=False) -> NWBFile: nwbfile = NWBFile( session_description='Ophys Session', identifier=self._get_identifier(), - session_start_time=pytz.utc.localize(datetime.datetime.now()), + session_start_time=self._date_of_acquisition.value, file_create_date=pytz.utc.localize(datetime.datetime.now()), institution="Allen Institute for Brain Science", keywords=self._get_keywords(), @@ -270,10 +282,9 @@ def to_nwb(self, add_metadata=False) -> NWBFile: ) self._stimulus_timestamps.to_nwb(nwbfile=nwbfile) - #self._running_acquisition.to_nwb(nwbfile=nwbfile) - #self._raw_running_speed.to_nwb(nwbfile=nwbfile) - #self._running_speed.to_nwb(nwbfile=nwbfile) - + self._running_acquisition.to_nwb(nwbfile=nwbfile) + self._raw_running_speed.to_nwb(nwbfile=nwbfile) + self._running_speed.to_nwb(nwbfile=nwbfile) #self._stimuli.to_nwb(nwbfile=nwbfile) #self._task_parameters.to_nwb(nwbfile=nwbfile) #self._trials.to_nwb(nwbfile=nwbfile) @@ -504,11 +515,11 @@ def get_performance_metrics( # ====================== properties ======================== @property - def behavior_session_id(self) -> int: + def ophys(self) -> int: """Unique identifier for a behavioral session. :rtype: int """ - return self._behavior_session_id.value + return self._ophys_session_id.value @property def licks(self) -> pd.DataFrame: @@ -863,7 +874,7 @@ def _read_data_from_stimulus_file( def _get_identifier(self) -> str: - return str(self._behavior_session_id) + return str(self._ophys_session_id) def _get_session_type(self) -> str: return self._metadata.session_type From ef96cfef6384253e4f42968f21b7fb230f57c5a4 Mon Sep 17 00:00:00 2001 From: Ahad Bawany <ahad.bawany@alleninstitute.org> Date: Wed, 24 Nov 2021 13:01:35 -0800 Subject: [PATCH 03/11] moving files to appropriate locations --- __init__.py => allensdk/__init__.py | 0 {api => allensdk/api}/__init__.py | 0 {api => allensdk/api}/api.py | 0 {api => allensdk/api}/cloud_cache/__init__.py | 0 .../api}/cloud_cache/cloud_cache.py | 0 .../api}/cloud_cache/file_attributes.py | 0 {api => allensdk/api}/cloud_cache/manifest.py | 0 {api => allensdk/api}/cloud_cache/utils.py | 0 {api => allensdk/api}/queries/__init__.py | 0 .../queries/annotated_section_data_sets_api.py | 0 .../api}/queries/biophysical_api.py | 0 .../api}/queries/brain_observatory_api.py | 0 .../api}/queries/cell_types_api.py | 0 .../api}/queries/connected_services.py | 0 {api => allensdk/api}/queries/glif_api.py | 0 {api => allensdk/api}/queries/grid_data_api.py | 0 .../api}/queries/image_download_api.py | 0 .../api}/queries/mouse_atlas_api.py | 0 .../api}/queries/mouse_connectivity_api.py | 0 .../api}/queries/ontologies_api.py | 0 .../api}/queries/reference_space_api.py | 0 {api => allensdk/api}/queries/rma_api.py | 0 {api => allensdk/api}/queries/rma_pager.py | 0 {api => allensdk/api}/queries/rma_template.py | 0 {api => allensdk/api}/queries/svg_api.py | 0 .../api}/queries/synchronization_api.py | 0 .../api}/queries/tree_search_api.py | 0 .../api}/warehouse_cache/__init__.py | 0 {api => allensdk/api}/warehouse_cache/cache.py | 0 .../api}/warehouse_cache/caching_utilities.py | 0 .../brain_observatory}/__init__.py | 0 .../brain_observatory}/argschema_utilities.py | 0 .../brain_observatory}/behavior/__init__.py | 0 .../behavior/behavior_ophys_analysis.py | 0 .../behavior/behavior_ophys_experiment.py | 0 .../behavior/behavior_ophys_session.py | 0 .../behavior_project_cache/__init__.py | 0 .../behavior_project_cache.py | 0 .../external/__init__.py | 0 .../behavior_project_metadata_writer.py | 0 .../project_apis/abcs/__init__.py | 0 .../project_apis/abcs/behavior_project_base.py | 0 .../project_apis/data_io/__init__.py | 0 .../data_io/behavior_project_cloud_api.py | 0 .../data_io/behavior_project_lims_api.py | 0 .../behavior_project_cache/tables/__init__.py | 0 .../tables/experiments_table.py | 0 .../tables/ophys_mixin.py | 0 .../tables/ophys_sessions_table.py | 0 .../tables/project_table.py | 0 .../tables/sessions_table.py | 0 .../tables/util/__init__.py | 0 .../tables/util/experiments_table_utils.py | 0 .../tables/util/prior_exposure_processing.py | 0 .../behavior/behavior_session.py | 0 .../brain_observatory}/behavior/criteria.py | 0 .../behavior/data_files/__init__.py | 0 .../behavior/data_files/_data_file_abc.py | 0 .../behavior/data_files/avg_projection_file.py | 0 .../behavior/data_files/demix_file.py | 0 .../behavior/data_files/dff_file.py | 0 .../data_files/event_detection_file.py | 0 .../behavior/data_files/eye_tracking_file.py | 0 .../behavior/data_files/max_projection_file.py | 0 .../data_files/rigid_motion_transform_file.py | 0 .../behavior/data_files/stimulus_file.py | 0 .../behavior/data_files/sync_file.py | 0 .../behavior/data_objects/__init__.py | 0 .../behavior/data_objects/base/__init__.py | 0 .../data_objects/base/_data_object_abc.py | 0 .../data_objects/base/readable_interfaces.py | 0 .../data_objects/base/writable_interfaces.py | 0 .../data_objects/cell_specimens/__init__.py | 0 .../cell_specimens/cell_specimens.py | 0 .../data_objects/cell_specimens/events.py | 0 .../data_objects/cell_specimens/rois_mixin.py | 0 .../cell_specimens/traces/__init__.py | 0 .../traces/corrected_fluorescence_traces.py | 0 .../cell_specimens/traces/dff_traces.py | 0 .../data_objects/eye_tracking/__init__.py | 0 .../eye_tracking/eye_tracking_table.py | 0 .../data_objects/eye_tracking/rig_geometry.py | 0 .../behavior/data_objects/licks.py | 0 .../behavior/data_objects/metadata/__init__.py | 0 .../metadata/behavior_metadata/__init__.py | 0 .../behavior_metadata/behavior_metadata.py | 0 .../behavior_metadata/behavior_session_id.py | 0 .../behavior_metadata/behavior_session_uuid.py | 0 .../behavior_metadata/date_of_acquisition.py | 0 .../metadata/behavior_metadata/equipment.py | 0 .../metadata/behavior_metadata/foraging_id.py | 0 .../metadata/behavior_metadata/session_type.py | 0 .../behavior_metadata/stimulus_frame_rate.py | 0 .../metadata/behavior_ophys_metadata.py | 0 .../ophys_experiment_metadata/__init__.py | 0 .../experiment_container_id.py | 0 .../field_of_view_shape.py | 0 .../ophys_experiment_metadata/imaging_depth.py | 0 .../ophys_experiment_metadata/imaging_plane.py | 0 .../multi_plane_metadata/__init__.py | 0 .../imaging_plane_group.py | 0 .../multi_plane_metadata.py | 0 .../ophys_experiment_metadata.py | 0 .../ophys_session_id.py | 0 .../ophys_experiment_metadata/project_code.py | 0 .../metadata/subject_metadata/__init__.py | 0 .../metadata/subject_metadata/age.py | 0 .../metadata/subject_metadata/driver_line.py | 0 .../metadata/subject_metadata/full_genotype.py | 0 .../metadata/subject_metadata/mouse_id.py | 0 .../metadata/subject_metadata/reporter_line.py | 0 .../metadata/subject_metadata/sex.py | 0 .../subject_metadata/subject_metadata.py | 0 .../behavior/data_objects/motion_correction.py | 0 .../behavior/data_objects/projections.py | 0 .../behavior/data_objects/rewards.py | 0 .../data_objects/running_speed/__init__.py | 0 .../running_speed/running_acquisition.py | 0 .../running_speed/running_processing.py | 0 .../running_speed/running_speed.py | 0 .../behavior/data_objects/stimuli/__init__.py | 0 .../data_objects/stimuli/presentations.py | 0 .../behavior/data_objects/stimuli/stimuli.py | 0 .../data_objects/stimuli/stimulus_templates.py | 0 .../behavior/data_objects/stimuli/templates.py | 0 .../behavior/data_objects/stimuli/util.py | 0 .../behavior/data_objects/task_parameters.py | 0 .../data_objects/timestamps/__init__.py | 0 .../timestamps/ophys_timestamps.py | 0 .../timestamps/stimulus_timestamps/__init__.py | 0 .../stimulus_timestamps/stimulus_timestamps.py | 0 .../timestamps_processing.py | 0 .../behavior/data_objects/timestamps/util.py | 0 .../behavior/data_objects/trials/__init__.py | 0 .../behavior/data_objects/trials/trial.py | 0 .../data_objects/trials/trial_table.py | 0 .../brain_observatory}/behavior/dprime.py | 0 .../behavior/event_detection.py | 0 .../behavior/eye_tracking_processing.py | 0 .../brain_observatory}/behavior/image_api.py | 0 .../brain_observatory}/behavior/mtrain.py | 0 .../behavior/ophys_experiment.py | 0 .../behavior/ophys_session.py | 0 .../behavior/rewards_processing.py | 0 .../brain_observatory}/behavior/schemas.py | 0 .../behavior/session_metrics.py | 0 .../behavior/stimulus_processing.py | 0 .../behavior/swdb/analysis_tools.py | 0 .../behavior/swdb/behavior_project_cache.py | 0 .../behavior/swdb/create_multi_session_df.py | 0 .../behavior/swdb/run_multi_session_df.py | 0 ..._save_extended_stimulus_presentations_df.py | 0 .../swdb/run_save_flash_response_df.py | 0 .../swdb/run_save_trial_response_df.py | 0 .../behavior/swdb/run_summary_figures.py | 0 .../save_extended_stimulus_presentations_df.py | 0 .../behavior/swdb/save_flash_response_df.py | 0 .../behavior/swdb/save_trial_response_df.py | 0 .../behavior/swdb/summary_figures.py | 0 .../behavior/swdb/utilities.py | 0 .../behavior/sync/__init__.py | 0 .../behavior/sync/process_sync.py | 0 .../brain_observatory}/behavior/trial_masks.py | 0 .../behavior/trials_processing.py | 0 .../behavior/write_behavior_nwb/__init__.py | 0 .../behavior/write_behavior_nwb/__main__.py | 0 .../behavior/write_behavior_nwb/_schemas.py | 0 .../behavior/write_nwb/__init__.py | 0 .../behavior/write_nwb/__main__.py | 0 .../behavior/write_nwb/_schemas.py | 0 .../behavior/write_nwb/extensions/__init__.py | 0 .../extensions/event_detection/__init__.py | 0 .../event_detection/extension_builder.py | 0 ...-aibs-ophys-event-detection.extensions.yaml | 0 ...x-aibs-ophys-event-detection.namespace.yaml | 0 .../event_detection/ndx_ophys_events.py | 0 .../extensions/stimulus_template/__init__.py | 0 .../stimulus_template/extension_builder.py | 0 .../ndx-aibs-stimulus-template.extensions.yaml | 0 .../ndx-aibs-stimulus-template.namespace.yaml | 0 .../stimulus_template/ndx_stimulus_template.py | 0 .../brain_observatory_exceptions.py | 0 .../brain_observatory_plotting.py | 0 .../chisquare_categorical.py | 0 .../brain_observatory}/circle_plots.py | 0 .../brain_observatory}/comparison_utils.py | 0 .../brain_observatory}/demixer.py | 0 .../brain_observatory}/dff.py | 0 .../brain_observatory}/drifting_gratings.py | 0 .../brain_observatory}/ecephys/__init__.py | 0 .../ecephys/align_timestamps/__init__.py | 0 .../ecephys/align_timestamps/__main__.py | 0 .../ecephys/align_timestamps/_schemas.py | 0 .../ecephys/align_timestamps/barcode.py | 0 .../align_timestamps/barcode_sync_dataset.py | 0 .../ecephys/align_timestamps/channel_states.py | 0 .../align_timestamps/probe_synchronizer.py | 0 .../ecephys/copy_utility/__init__.py | 0 .../ecephys/copy_utility/__main__.py | 0 .../ecephys/copy_utility/_schemas.py | 0 .../ecephys/current_source_density/__init__.py | 0 .../ecephys/current_source_density/__main__.py | 0 .../_current_source_density.py | 0 .../current_source_density/_filter_utils.py | 0 .../_interpolation_utils.py | 0 .../ecephys/current_source_density/_schemas.py | 0 .../ecephys/ecephys_project_api/__init__.py | 0 .../ecephys_project_api/ecephys_project_api.py | 0 .../ecephys_project_fixed_api.py | 0 .../ecephys_project_lims_api.py | 0 .../ecephys_project_warehouse_api.py | 0 .../ecephys/ecephys_project_api/http_engine.py | 0 .../ecephys/ecephys_project_api/rma_engine.py | 0 .../ecephys/ecephys_project_api/utilities.py | 0 .../ecephys/ecephys_project_cache.py | 0 .../ecephys/ecephys_session.py | 0 .../ecephys/ecephys_session_api/__init__.py | 0 .../ecephys_nwb1_session_api.py | 0 .../ecephys_nwb_session_api.py | 0 .../ecephys_session_api/ecephys_session_api.py | 0 .../ecephys/file_io/__init__.py | 0 .../ecephys/file_io/continuous_file.py | 0 .../ecephys/file_io/ecephys_sync_dataset.py | 0 .../ecephys/file_io/stim_file.py | 0 .../ecephys/lfp_subsampling/__init__.py | 0 .../ecephys/lfp_subsampling/__main__.py | 0 .../ecephys/lfp_subsampling/_schemas.py | 0 .../ecephys/lfp_subsampling/subsampling.py | 0 .../brain_observatory}/ecephys/nwb/__init__.py | 0 .../nwb/ecephys_nwb_extension_builder.py | 0 .../nwb/ndx-aibs-ecephys.extension.yaml | 0 .../nwb/ndx-aibs-ecephys.namespace.yaml | 0 .../ecephys/optotagging_table/__init__.py | 0 .../ecephys/optotagging_table/__main__.py | 0 .../ecephys/optotagging_table/_schemas.py | 0 .../ecephys/stimulus_analysis/__init__.py | 0 .../ecephys/stimulus_analysis/__main__.py | 0 .../ecephys/stimulus_analysis/_schemas.py | 0 .../ecephys/stimulus_analysis/dot_motion.py | 0 .../stimulus_analysis/drifting_gratings.py | 0 .../ecephys/stimulus_analysis/flashes.py | 0 .../stimulus_analysis/natural_movies.py | 0 .../stimulus_analysis/natural_scenes.py | 0 .../receptive_field_mapping.py | 0 .../stimulus_analysis/static_gratings.py | 0 .../stimulus_analysis/stimulus_analysis.py | 0 .../ecephys/stimulus_sync.py | 0 .../ecephys/stimulus_table/__init__.py | 0 .../ecephys/stimulus_table/__main__.py | 0 .../ecephys/stimulus_table/_schemas.py | 0 .../ecephys/stimulus_table/ephys_pre_spikes.py | 0 .../ecephys/stimulus_table/naming_utilities.py | 0 .../stimulus_table/output_validation.py | 0 .../stimulus_parameter_extraction.py | 0 .../stimulus_table/visualization/__init__.py | 0 .../visualization/view_blocks.py | 0 .../ecephys/visualization/__init__.py | 0 .../ecephys/write_nwb/__init__.py | 0 .../ecephys/write_nwb/__main__.py | 0 .../ecephys/write_nwb/_schemas.py | 0 .../extract_running_speed/__init__.py | 0 .../extract_running_speed/__main__.py | 0 .../extract_running_speed/_schemas.py | 0 .../eye_tracking/__main__.py | 0 .../eye_tracking/_schemas.py | 0 .../brain_observatory}/eye_tracking/build.py | 0 .../eye_tracking/stage_1/DLC_Eye_Tracking.py | 0 .../stage_2/DLC_Ellipse_Fitting.py | 0 .../eye_tracking/stage_3/DLC_Labeled_Video.py | 0 .../eye_tracking/stage_4/DLC_Ellipse_Video.py | 0 .../brain_observatory}/findlevel.py | 0 .../gaze_mapping/__init__.py | 0 .../gaze_mapping/__main__.py | 0 .../gaze_mapping/_filter_utils.py | 0 .../gaze_mapping/_gaze_mapper.py | 0 .../gaze_mapping/_schemas.py | 0 .../brain_observatory}/locally_sparse_noise.py | 0 .../brain_observatory}/natural_movie.py | 0 .../brain_observatory}/natural_scenes.py | 0 .../brain_observatory}/nwb/__init__.py | 0 .../behavior_ophys_nwb_extension_builder.py | 0 .../nwb/eye_tracking/__init__.py | 0 .../nwb/eye_tracking/extension_builder.py | 0 .../ndx-ellipse-eye-tracking.extensions.yaml | 0 .../ndx-ellipse-eye-tracking.namespace.yaml | 0 .../eye_tracking/ndx_ellipse_eye_tracking.py | 0 .../brain_observatory}/nwb/metadata.py | 0 .../nwb/ndx-aibs-behavior-ophys.extension.yaml | 0 .../nwb/ndx-aibs-behavior-ophys.namespace.yaml | 0 .../brain_observatory}/nwb/nwb_api.py | 0 .../brain_observatory}/nwb/nwb_utils.py | 0 .../brain_observatory}/nwb/schemas.py | 0 .../brain_observatory}/observatory_plots.py | 0 .../brain_observatory}/ophys/__init__.py | 0 .../ophys/trace_extraction/__init__.py | 0 .../ophys/trace_extraction/__main__.py | 0 .../ophys/trace_extraction/_schemas.py | 0 .../brain_observatory}/r_neuropil.py | 0 .../receptive_field_analysis/__init__.py | 0 .../receptive_field_analysis/chisquarerf.py | 0 .../receptive_field_analysis/eventdetection.py | 0 .../receptive_field_analysis/fit_parameters.py | 0 .../receptive_field_analysis/fitgaussian2D.py | 0 .../receptive_field_analysis/postprocessing.py | 0 .../receptive_field.py | 0 .../receptive_field_analysis/tools.py | 0 .../receptive_field_analysis/utilities.py | 0 .../receptive_field_analysis/visualization.py | 0 .../brain_observatory}/roi_masks.py | 0 .../brain_observatory}/running_speed.py | 0 .../brain_observatory}/session_analysis.py | 0 .../brain_observatory}/session_api_utils.py | 0 .../brain_observatory}/static_gratings.py | 0 .../brain_observatory}/stimulus_analysis.py | 0 .../brain_observatory}/stimulus_info.py | 0 .../brain_observatory}/sync_dataset.py | 0 .../sync_utilities/__init__.py | 0 .../visualization/__init__.py | 0 {config => allensdk/config}/__init__.py | 0 {config => allensdk/config}/app/__init__.py | 0 .../config}/app/application_config.py | 0 {config => allensdk/config}/app/logging.conf | 0 {config => allensdk/config}/manifest.py | 0 .../config}/manifest_builder.py | 0 {config => allensdk/config}/model/__init__.py | 0 .../config}/model/description.py | 0 .../config}/model/description_parser.py | 0 .../config}/model/formats/__init__.py | 0 .../config}/model/formats/hdf5_util.py | 0 .../model/formats/json_description_parser.py | 0 .../model/formats/pycfg_description_parser.py | 0 {core => allensdk/core}/__init__.py | 0 {core => allensdk/core}/auth_config.py | 0 {core => allensdk/core}/authentication.py | 0 .../core}/brain_observatory_cache.py | 0 .../core}/brain_observatory_nwb_data_set.py | 0 .../core}/cache_method_utilities.py | 0 {core => allensdk/core}/cell_types_cache.py | 0 {core => allensdk/core}/dat_utilities.py | 0 {core => allensdk/core}/exceptions.py | 0 {core => allensdk/core}/h5_utilities.py | 0 {core => allensdk/core}/json_utilities.py | 0 .../core}/lazy_property/__init__.py | 0 .../core}/lazy_property/lazy_property.py | 0 .../core}/lazy_property/lazy_property_mixin.py | 0 .../core}/mouse_connectivity_cache.py | 0 {core => allensdk/core}/nwb_data_set.py | 0 {core => allensdk/core}/obj_utilities.py | 0 {core => allensdk/core}/ontology.py | 0 .../ophys_experiment_session_id_mapping.py | 0 {core => allensdk/core}/reference_space.py | 0 .../core}/reference_space_cache.py | 0 {core => allensdk/core}/simple_tree.py | 0 {core => allensdk/core}/sitk_utilities.py | 0 {core => allensdk/core}/structure_tree.py | 0 {core => allensdk/core}/swc.py | 0 {core => allensdk/core}/typing.py | 0 deprecated.py => allensdk/deprecated.py | 0 {ephys => allensdk/ephys}/__init__.py | 0 {ephys => allensdk/ephys}/ephys_extractor.py | 0 {ephys => allensdk/ephys}/ephys_features.py | 0 .../ephys}/extract_cell_features.py | 0 {ephys => allensdk/ephys}/feature_extractor.py | 0 {internal => allensdk/internal}/__init__.py | 0 .../internal}/api/__init__.py | 0 .../internal}/api/api_prerelease.py | 0 .../internal}/api/lims_api.py | 0 .../internal}/api/mtrain_api.py | 0 .../internal}/api/queries/__init__.py | 0 .../api/queries/biophysical_module_api.py | 0 .../api/queries/biophysical_module_reader.py | 0 .../api/queries/grid_data_api_prerelease.py | 0 .../mouse_connectivity_api_prerelease.py | 0 .../api/queries/optimize_config_reader.py | 0 .../internal}/api/queries/pre_release.py | 0 .../internal}/brain_observatory/__init__.py | 0 .../annotated_region_metrics.py | 0 .../brain_observatory/demix_report.py | 0 .../internal}/brain_observatory/demixer.py | 0 .../brain_observatory/eye_calibration.py | 0 .../internal}/brain_observatory/fit_ellipse.py | 0 .../brain_observatory/frame_stream.py | 0 .../internal}/brain_observatory/itracker.py | 0 .../brain_observatory/itracker_utils.py | 0 .../internal}/brain_observatory/mask_set.py | 0 .../ophys_session_decomposition.py | 0 .../brain_observatory/resources/__init__.py | 0 .../roi_filter_training_criteria.json | 0 .../internal}/brain_observatory/roi_filter.py | 0 .../brain_observatory/roi_filter_utils.py | 0 .../brain_observatory/run_itracker.py | 0 .../internal}/brain_observatory/time_sync.py | 0 .../internal}/core/__init__.py | 0 .../internal}/core/lims_pipeline_module.py | 0 .../internal}/core/lims_utilities.py | 0 .../mouse_connectivity_cache_prerelease.py | 0 .../internal}/core/simpletree.py | 0 {internal => allensdk/internal}/core/swc.py | 0 .../internal}/ephys/__init__.py | 0 .../internal}/ephys/core_feature_extract.py | 0 .../internal}/ephys/plot_qc_figures.py | 0 .../internal}/ephys/plot_qc_figures3.py | 0 {internal => allensdk/internal}/model/AIC.py | 0 {internal => allensdk/internal}/model/GLM.py | 0 .../internal}/model/__init__.py | 0 .../internal}/model/biophysical/__init__.py | 0 .../model/biophysical/biophysical_archiver.py | 0 .../model/biophysical/check_fi_shift.py | 0 .../internal}/model/biophysical/deap_utils.py | 0 .../internal}/model/biophysical/ephys_utils.py | 0 .../internal}/model/biophysical/fit_stage_1.py | 0 .../internal}/model/biophysical/fit_stage_2.py | 0 .../model/biophysical/fits/__init__.py | 0 .../model/biophysical/fits/config_base.json | 0 .../biophysical/fits/fit_styles/__init__.py | 0 .../fits/fit_styles/f12_fit_style.json | 0 .../fits/fit_styles/f12_noapic_fit_style.json | 0 .../fits/fit_styles/f13_fit_style.json | 0 .../fits/fit_styles/f13_noapic_fit_style.json | 0 .../fits/fit_styles/f6_fit_style.json | 0 .../fits/fit_styles/f6_noapic_fit_style.json | 0 .../fits/fit_styles/f9_fit_style.json | 0 .../fits/fit_styles/f9_noapic_fit_style.json | 0 .../model/biophysical/make_deap_fit_json.py | 0 .../model/biophysical/neuron_parallel.py | 0 .../internal}/model/biophysical/optimize.py | 0 .../biophysical/passive_fitting/__init__.py | 0 .../passive_fitting/neuron_passive_fit.py | 0 .../passive_fitting/neuron_passive_fit2.py | 0 .../passive_fitting/neuron_passive_fit_elec.py | 0 .../passive_fitting/neuron_utils.py | 0 .../passive_fitting/output_grabber.py | 0 .../passive_fitting/passive/__init__.py | 0 .../biophysical/passive_fitting/preprocess.py | 0 .../model/biophysical/run_optimize.py | 0 .../model/biophysical/run_optimize_workflow.py | 0 .../model/biophysical/run_passive_fit.py | 0 .../model/biophysical/run_simulate_lims.py | 0 .../model/biophysical/run_simulate_workflow.py | 0 .../internal}/model/data_access.py | 0 .../internal}/model/glif/ASGLM.py | 0 .../internal}/model/glif/MLIN.py | 0 .../internal}/model/glif/__init__.py | 0 .../glif/are_two_lists_of_arrays_the_same.py | 0 .../internal}/model/glif/configure_model.py | 0 .../internal}/model/glif/error_functions.py | 0 .../internal}/model/glif/find_spikes.py | 0 .../internal}/model/glif/find_sweeps.py | 0 .../internal}/model/glif/glif_experiment.py | 0 .../internal}/model/glif/glif_optimizer.py | 0 .../model/glif/glif_optimizer_neuron.py | 0 .../internal}/model/glif/optimize_neuron.py | 0 .../internal}/model/glif/plotting.py | 0 .../internal}/model/glif/preprocess_neuron.py | 0 .../internal}/model/glif/rc.py | 0 .../internal}/model/glif/spike_cutting.py | 0 .../model/glif/threshold_adaptation.py | 0 .../internal}/morphology/__init__.py | 0 .../internal}/morphology/compartment.py | 0 .../internal}/morphology/morphology.py | 0 .../internal}/morphology/morphvis.py | 0 .../internal}/morphology/node.py | 0 .../internal}/morphology/validate_swc.py | 0 .../internal}/mouse_connectivity/__init__.py | 0 .../interval_unionize/__init__.py | 0 .../interval_unionize/cav_unionize.py | 0 .../interval_unionize/cav_unionizer.py | 0 .../interval_unionize/data_utilities.py | 0 .../interval_unionize/interval_unionizer.py | 0 .../run_tissuecyte_unionize_cav.py | 0 .../run_tissuecyte_unionize_classic.py | 0 .../tissuecyte_unionize_record.py | 0 .../interval_unionize/tissuecyte_unionizer.py | 0 .../interval_unionize/unionize_record.py | 0 .../projection_thumbnail/__init__.py | 0 .../generate_projection_strip.py | 0 .../projection_thumbnail/image_sheet.py | 0 .../projection_functions.py | 0 .../visualization_utilities.py | 0 .../projection_thumbnail/volume_projector.py | 0 .../projection_thumbnail/volume_utilities.py | 0 .../tissuecyte_stitching/__init__.py | 0 .../tissuecyte_stitching/stitcher.py | 0 .../tissuecyte_stitching/tile.py | 0 .../IVSCC/ephys_nwb/convert_igor_nwb.py | 0 .../IVSCC/ephys_nwb/extract_nwb_data.py | 0 .../ephys_nwb/feature_extraction_module.py | 0 .../IVSCC/ephys_nwb/lab_notebook_reader.py | 0 .../IVSCC/ephys_nwb/nwb_publish.py | 0 .../pipeline_modules/IVSCC/ephys_nwb/qc.py | 0 .../IVSCC/ephys_nwb/qc_support.py | 0 .../IVSCC/ephys_nwb/resource_file.py | 0 .../internal}/pipeline_modules/__init__.py | 0 .../morphology/calculate_features.py | 0 .../cell_types/morphology/cortical_layers.py | 0 .../morphology/surrogate_strategy.py | 0 .../cell_types/morphology/upright_transform.py | 0 .../internal}/pipeline_modules/gbm/__init__.py | 0 .../gbm/generate_gbm_analysis_run_records.py | 0 .../gbm/generate_gbm_heatmap.py | 0 .../gbm/generate_gbm_sample_metadata.py | 0 .../run_annotated_region_metrics.py | 0 .../internal}/pipeline_modules/run_demixing.py | 0 .../pipeline_modules/run_dff_computation.py | 0 .../pipeline_modules/run_eye_tracking.py | 0 .../run_neuropil_correction.py | 0 .../run_observatory_analysis.py | 0 .../run_observatory_container_thumbnails.py | 0 .../run_observatory_thumbnails.py | 0 .../run_ophys_eye_calibration.py | 0 .../run_ophys_session_decomposition.py | 0 .../pipeline_modules/run_ophys_time_sync.py | 0 .../pipeline_modules/run_roi_filter.py | 0 ...issuecyte_projection_thumbnail_from_json.py | 0 .../run_tissuecyte_stitching_classic.py | 0 .../run_tissuecyte_unionize_cav_from_json.py | 0 ...uecyte_unionize_classic_counts_from_json.py | 0 ...un_tissuecyte_unionize_classic_from_json.py | 0 {model => allensdk/model}/__init__.py | 0 .../model}/biophys_sim/__init__.py | 0 .../model}/biophys_sim/bps_command.py | 0 .../model}/biophys_sim/config.py | 0 .../model}/biophys_sim/logging.conf | 0 .../model}/biophys_sim/manifest_default.json | 0 .../model}/biophys_sim/neuron/__init__.py | 0 .../model}/biophys_sim/neuron/hoc_utils.py | 0 .../model}/biophys_sim/scripts/__init__.py | 0 .../model}/biophys_sim/scripts/bps | 0 .../model}/biophysical/__init__.py | 0 .../model}/biophysical/logging.conf | 0 .../model}/biophysical/run_simulate.py | 0 .../model}/biophysical/runner.py | 0 {model => allensdk/model}/biophysical/utils.py | 0 {model => allensdk/model}/glif/__init__.py | 0 {model => allensdk/model}/glif/glif_neuron.py | 0 .../model}/glif/glif_neuron_methods.py | 0 .../model}/glif/simulate_neuron.py | 0 .../morphology}/__init__.py | 0 .../morphology}/validate_swc.py | 0 .../mouse_connectivity}/__init__.py | 0 .../mouse_connectivity}/grid/__init__.py | 0 .../mouse_connectivity}/grid/__main__.py | 0 .../mouse_connectivity}/grid/_schemas.py | 0 .../grid/image_series_gridder.py | 0 .../grid/subimage/__init__.py | 0 .../grid/subimage/base_subimage.py | 0 .../grid/subimage/cav_subimage.py | 0 .../grid/subimage/classic_subimage.py | 0 .../grid/subimage/count_subimage.py | 0 .../grid/utilities/__init__.py | 0 .../grid/utilities/downsampling_utilities.py | 0 .../grid/utilities/image_utilities.py | 0 .../grid/writers/__init__.py | 0 {test => allensdk/test}/api/__init__.py | 0 .../test}/api/cloud_cache/__init__.py | 0 .../test}/api/cloud_cache/conftest.py | 0 .../test}/api/cloud_cache/test_cache.py | 0 .../test}/api/cloud_cache/test_change_log.py | 0 .../api/cloud_cache/test_file_attributes.py | 0 .../test}/api/cloud_cache/test_full_process.py | 0 .../test}/api/cloud_cache/test_local_cache.py | 0 .../test}/api/cloud_cache/test_manifest.py | 0 .../api/cloud_cache/test_smart_download.py | 0 .../api/cloud_cache/test_static_local_cache.py | 0 .../test}/api/cloud_cache/test_utils.py | 0 .../cloud_cache/test_windows_isilon_paths.py | 0 .../test}/api/cloud_cache/utils.py | 0 .../response_test_data/472451419_response.json | 0 .../api/test_annotated_section_data_set_api.py | 0 {test => allensdk/test}/api/test_api.py | 0 .../test}/api/test_biophysical_api.py | 0 .../test}/api/test_brain_observatory_api.py | 0 {test => allensdk/test}/api/test_cache.py | 0 {test => allensdk/test}/api/test_cacheable.py | 0 .../test}/api/test_caching_utilities.py | 0 .../test}/api/test_cell_types_api.py | 0 .../test}/api/test_file_download.py | 0 {test => allensdk/test}/api/test_glif_api.py | 0 .../test}/api/test_grid_data_api.py | 0 .../test}/api/test_image_download_api.py | 0 .../test}/api/test_mouse_atlas_api.py | 0 .../test}/api/test_mouse_connectivity_api.py | 0 .../test}/api/test_ontologies_api.py | 0 {test => allensdk/test}/api/test_pager.py | 0 .../test}/api/test_reference_space_api.py | 0 .../test}/api/test_rma_template.py | 0 {test => allensdk/test}/api/test_svg_api.py | 0 .../test}/api/test_synchronization_api.py | 0 .../test}/api/test_tree_search_api.py | 0 .../behavior_project_cache/__init__.py | 0 .../behavior_project_cache/conftest.py | 0 .../test_behavior_project_cloud_api.py | 0 .../test_behavior_project_lims_api.py | 0 .../test_experiments_table_utils.py | 0 .../behavior_project_cache/test_from_s3.py | 0 .../behavior/behavior_project_cache/utils.py | 0 .../conftest.py | 0 .../test_behavior_project_cache.py | 0 .../brain_observatory/behavior/conftest.py | 0 .../behavior/data_files/test_stimulus_file.py | 0 .../behavior/data_files/test_sync_file.py | 0 .../data_objects/base/test_data_object.py | 0 .../behavior/data_objects/conftest.py | 0 .../eye_tracking/test_eye_tracking_table.py | 0 .../eye_tracking/test_rig_geometry.py | 0 .../behavior/data_objects/lims_util.py | 0 .../test_behavior_metadata.py | 0 .../metadata/test_behavior_ophys_metadata.py | 0 .../behavior/data_objects/nwb_input_json.py | 0 .../running_speed/test_running_acquisition.py | 0 .../running_speed/test_running_processing.py | 0 .../running_speed/test_running_speed.py | 0 .../test_stimulus_timestamps.py | 0 .../test_timestamps_processing.py | 0 .../data_objects/test_cell_specimens.py | 0 .../test_data/eye_tracking_rig_geometry.json | 0 .../test_data/rigid_motion_transform_file.csv | 0 .../test_data/task_parameters.json | 0 .../data_objects/test_data/test_input.json | 0 .../behavior/data_objects/test_licks.py | 0 .../data_objects/test_motion_correction.py | 0 .../data_objects/test_ophys_timestamps.py | 0 .../behavior/data_objects/test_projections.py | 0 .../behavior/data_objects/test_rewards.py | 0 .../behavior/data_objects/test_stimuli.py | 0 .../data_objects/test_task_parameters.py | 0 .../behavior/data_objects/test_trial_table.py | 0 .../behavior/test_behavior_metadata_legacy.py | 0 .../behavior/test_behavior_ophys_experiment.py | 0 .../behavior/test_behavior_session.py | 0 .../behavior/test_criteria.py | 0 .../brain_observatory/behavior/test_dprime.py | 0 .../behavior/test_event_detection.py | 0 .../behavior/test_eye_tracking_processing.py | 0 .../behavior/test_mtrain_annotate.py | 0 .../test_prior_exposure_count_processing.py | 0 .../behavior/test_rewards_processing.py | 0 .../behavior/test_session_metrics.py | 0 .../behavior/test_stimulus_processing.py | 0 .../behavior/test_sync_processing.py | 0 .../behavior/test_trial_masks.py | 0 .../behavior/test_trials_processing.py | 0 .../behavior/test_write_behavior_nwb.py | 0 .../behavior/test_write_nwb_behavior_ophys.py | 0 .../test}/brain_observatory/conftest.py | 0 .../brain_observatory/ecephys/__init__.py | 0 .../ecephys/align_timestamps/__init__.py | 0 .../test_align_timestamps_module.py | 0 .../ecephys/align_timestamps/test_barcode.py | 0 .../test_barcode_sync_dataset.py | 0 .../align_timestamps/test_channel_states.py | 0 .../test_probe_synchronizer.py | 0 .../brain_observatory/ecephys/conftest.py | 0 .../test_ecephys_nwb1_session_api.py | 0 .../ecephys/stimulus_analysis/__init__.py | 0 .../ecephys/stimulus_analysis/conftest.py | 0 .../stimulus_analysis/test_dot_motion.py | 0 .../test_drifting_gratings.py | 0 .../ecephys/stimulus_analysis/test_flashes.py | 0 .../stimulus_analysis/test_natural_movies.py | 0 .../stimulus_analysis/test_natural_scenes.py | 0 .../test_receptive_field_mapping.py | 0 .../stimulus_analysis/test_static_gratings.py | 0 .../test_stimulus_analysis.py | 0 .../ecephys/stimulus_table/__init__.py | 0 .../stimulus_table/test_ephys_pre_spikes.py | 0 .../stimulus_table/test_naming_utilities.py | 0 .../test_stimulus_parameter_extraction.py | 0 .../test_stimulus_table_module.py | 0 .../ecephys/test_copy_utility.py | 0 .../ecephys/test_current_source_density.py | 0 .../ecephys/test_ecephys_project_cache.py | 0 .../ecephys/test_ecephys_project_fixed_api.py | 0 .../ecephys/test_ecephys_project_lims_api.py | 0 .../test_ecephys_project_warehouse_api.py | 0 .../ecephys/test_ecephys_session.py | 0 .../ecephys/test_ecephys_session_nwb_api.py | 0 .../ecephys/test_ecephys_sync_dataset.py | 0 .../ecephys/test_http_engine.py | 0 .../ecephys/test_lfp_subsampling.py | 0 .../ecephys/test_rma_engine.py | 0 .../ecephys/test_stim_file.py | 0 .../ecephys/test_stimulus_sync.py | 0 .../ecephys/test_visualization.py | 0 .../ecephys/test_write_nwb.py | 0 .../extract_running_speed/__init__.py | 0 .../test_extract_running_speed_module.py | 0 .../brain_observatory/gaze_mapping/__init__.py | 0 .../gaze_mapping/test_gaze_mapping.py | 0 .../gaze_mapping/test_main.py | 0 .../test}/brain_observatory/nwb/__init__.py | 0 .../test}/brain_observatory/nwb/conftest.py | 0 .../test}/brain_observatory/nwb/test_nwb.py | 0 .../brain_observatory/nwb/test_nwb_api.py | 0 .../brain_observatory/nwb/test_nwb_utils.py | 0 .../test_chisquarerf.py | 0 .../test_fitgaussian2D.py | 0 .../sync_utilities/__init__.py | 0 .../sync_utilities/test_sync_utilities.py | 0 .../brain_observatory/test_circle_plots.py | 0 .../test}/brain_observatory/test_demixer.py | 0 .../test}/brain_observatory/test_dff.py | 0 .../test_drifting_gratings.py | 0 .../test_locally_sparse_noise.py | 0 .../brain_observatory/test_natural_movie.py | 0 .../brain_observatory/test_natural_scenes.py | 0 .../test}/brain_observatory/test_notebook.py | 0 .../test_observatory_plots.py | 0 .../test_observatory_plots_data.json | 0 .../test}/brain_observatory/test_roi_masks.py | 0 .../brain_observatory/test_session_analysis.py | 0 .../test_session_analysis_regression.py | 0 .../test_session_analysis_regression_data.json | 0 ..._session_analysis_regression_data_list.json | 0 .../test_session_api_utils.py | 0 .../brain_observatory/test_static_gratings.py | 0 .../test_stimulus_analysis.py | 0 .../brain_observatory/test_stimulus_info.py | 0 .../config/test_config_single_file_json.py | 0 .../test}/config/test_json_comments.py | 0 .../test}/config/test_manifest.py | 0 .../test}/config/test_multi_file_config.py | 0 .../test}/config/test_pyconfig_parser.py | 0 .../test}/core/nwb_ephys_files.txt | 0 {test => allensdk/test}/core/nwb_files.txt | 0 .../test}/core/test_authentication.py | 0 .../test}/core/test_brain_observatory_cache.py | 0 .../test_brain_observatory_nwb_data_set.py | 0 .../test}/core/test_cell_filters.py | 0 .../test}/core/test_cell_types_cache_unit.py | 0 .../test}/core/test_h5_utilities.py | 0 .../test}/core/test_json_utilities.py | 0 .../test}/core/test_lazy_property.py | 0 .../core/test_mouse_connectivity_cache.py | 0 .../core/test_mouse_connectivity_notebook.py | 0 .../test}/core/test_nwb_data_set.py | 0 .../test}/core/test_obj_utilities.py | 0 .../test}/core/test_reference_space.py | 0 .../test}/core/test_reference_space_cache.py | 0 .../core/test_reference_space_notebook.py | 0 .../test}/core/test_simple_tree.py | 0 .../test}/core/test_sitk_utilities.py | 0 .../test}/core/test_structure_tree.py | 0 .../ephys/data/spike_test_high_init_dvdt.txt | 0 .../test}/ephys/data/spike_test_pair.txt | 0 .../test}/ephys/data/spike_test_var_dt.txt | 0 .../test}/ephys/test_extractor.py | 0 {test => allensdk/test}/ephys/test_features.py | 0 {test => allensdk/test}/glif_tests.py | 0 .../test}/internal/api/test_api_prerelease.py | 0 .../api/test_grid_data_api_prerelease.py | 0 .../test_mouse_connectivity_api_prerelease.py | 0 .../test}/internal/api/test_pre_release.py | 0 .../test}/internal/biophysical/conftest.py | 0 .../internal/biophysical/test_ephys_utils.py | 0 .../internal/biophysical/test_optimize_run.py | 0 .../internal/biophysical/test_simulate_run.py | 0 .../brain_observatory/test_roi_filter_utils.py | 0 .../test_run_ophys_time_sync.py | 0 .../brain_observatory/test_time_sync.py | 0 .../brain_observatory/time_sync_test_data.json | 0 {test => allensdk/test}/internal/conftest.py | 0 ...test_mouse_connectivity_cache_prerelease.py | 0 .../internal/gbm/test_generate_gbm_heatmap.py | 0 .../internal/morphology/test_apply_affine.py | 0 .../test_interval_unionizer.py | 0 .../test_projection_functions.py | 0 .../test_visualization_utilities.py | 0 .../test_volume_projector.py | 0 .../test_volume_utilities.py | 0 .../test_tissuecyte_unionize_record.py | 0 .../mouse_connectivity/test_unionize_record.py | 0 .../internal/test_annotated_region_metrics.py | 0 .../test}/internal/test_biophysical_modules.py | 0 .../internal/test_core_feature_extract.py | 0 .../test}/internal/test_eye_calibration.py | 0 .../test}/internal/test_internal.py | 0 .../test}/internal/test_mtrain_api.py | 0 .../internal/test_optimize_config_reader.py | 0 .../test}/internal/test_optimize_manifest.py | 0 .../test}/internal/test_roi_filter.py | 0 .../test}/internal/test_simulate_manifest.py | 0 .../internal/test_simulate_update_output.py | 0 .../tissuecyte_stitching/test_stitcher.py | 0 .../internal/tissuecyte_stitching/test_tile.py | 0 .../test}/model/aa_model/468193142_fit.json | 0 .../test}/model/aa_model/manifest.json | 0 .../aa_model/test_biophysical_all_active.py | 0 {test => allensdk/test}/model/check_parser.py | 0 .../test}/model/peri_model/468193142_fit.json | 0 .../test}/model/peri_model/manifest.json | 0 .../model/peri_model/test_biophysical_peri.py | 0 .../model/test_biophysical_perisomatic.py | 0 {test => allensdk/test}/model/test_glif.py | 0 {test => allensdk/test}/model/test_runner.py | 0 .../test}/mouse_connectivity/__init__.py | 0 .../test}/mouse_connectivity/grid/__init__.py | 0 .../grid/test_base_subimage.py | 0 .../grid/test_cav_subimage.py | 0 .../grid/test_classic_subimage.py | 0 .../grid/test_image_series_gridder.py | 0 .../grid/test_image_utilities.py | 0 .../test}/test_argschema_utilities.py | 0 {test => allensdk/test}/test_deprecated.py | 0 .../test}/test_inline_examples.py | 0 {test => allensdk/test}/test_temp_dir.py | 0 .../test_utilities}/__init__.py | 0 .../test_utilities}/custom_comparators.py | 0 .../test_utilities}/regression_fixture.py | 0 .../test_utilities}/temp_dir.py | 0 api/__pycache__/__init__.cpython-37.pyc | Bin 341 -> 0 bytes api/__pycache__/api.cpython-37.pyc | Bin 13302 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 192 -> 0 bytes .../__pycache__/cloud_cache.cpython-37.pyc | Bin 38354 -> 0 bytes .../__pycache__/file_attributes.cpython-37.pyc | Bin 2509 -> 0 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 7232 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 2626 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 188 -> 0 bytes ...otated_section_data_sets_api.cpython-37.pyc | Bin 7099 -> 0 bytes .../__pycache__/biophysical_api.cpython-37.pyc | Bin 9375 -> 0 bytes .../brain_observatory_api.cpython-37.pyc | Bin 23607 -> 0 bytes .../__pycache__/cell_types_api.cpython-37.pyc | Bin 12059 -> 0 bytes .../connected_services.cpython-37.pyc | Bin 7933 -> 0 bytes .../__pycache__/glif_api.cpython-37.pyc | Bin 6069 -> 0 bytes .../__pycache__/grid_data_api.cpython-37.pyc | Bin 7159 -> 0 bytes .../image_download_api.cpython-37.pyc | Bin 14717 -> 0 bytes .../__pycache__/mouse_atlas_api.cpython-37.pyc | Bin 3855 -> 0 bytes .../mouse_connectivity_api.cpython-37.pyc | Bin 17591 -> 0 bytes .../__pycache__/ontologies_api.cpython-37.pyc | Bin 7575 -> 0 bytes .../reference_space_api.cpython-37.pyc | Bin 7957 -> 0 bytes api/queries/__pycache__/rma_api.cpython-37.pyc | Bin 15835 -> 0 bytes .../__pycache__/rma_pager.cpython-37.pyc | Bin 1543 -> 0 bytes .../__pycache__/rma_template.cpython-37.pyc | Bin 2892 -> 0 bytes api/queries/__pycache__/svg_api.cpython-37.pyc | Bin 1971 -> 0 bytes .../synchronization_api.cpython-37.pyc | Bin 7296 -> 0 bytes .../__pycache__/tree_search_api.cpython-37.pyc | Bin 1864 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 196 -> 0 bytes .../__pycache__/cache.cpython-37.pyc | Bin 17034 -> 0 bytes .../caching_utilities.cpython-37.pyc | Bin 4489 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 1800 -> 0 bytes .../argschema_utilities.cpython-37.pyc | Bin 5607 -> 0 bytes ...brain_observatory_exceptions.cpython-37.pyc | Bin 1079 -> 0 bytes .../brain_observatory_plotting.cpython-37.pyc | Bin 28944 -> 0 bytes .../chisquare_categorical.cpython-37.pyc | Bin 3683 -> 0 bytes .../__pycache__/circle_plots.cpython-37.pyc | Bin 18293 -> 0 bytes .../comparison_utils.cpython-37.pyc | Bin 2151 -> 0 bytes .../__pycache__/demixer.cpython-37.pyc | Bin 10764 -> 0 bytes .../__pycache__/dff.cpython-37.pyc | Bin 9555 -> 0 bytes .../drifting_gratings.cpython-37.pyc | Bin 14806 -> 0 bytes .../__pycache__/findlevel.cpython-37.pyc | Bin 626 -> 0 bytes .../locally_sparse_noise.cpython-37.pyc | Bin 12889 -> 0 bytes .../__pycache__/natural_movie.cpython-37.pyc | Bin 5288 -> 0 bytes .../__pycache__/natural_scenes.cpython-37.pyc | Bin 11787 -> 0 bytes .../observatory_plots.cpython-37.pyc | Bin 14344 -> 0 bytes .../__pycache__/r_neuropil.cpython-37.pyc | Bin 7774 -> 0 bytes .../__pycache__/roi_masks.cpython-37.pyc | Bin 13151 -> 0 bytes .../__pycache__/running_speed.cpython-37.pyc | Bin 944 -> 0 bytes .../session_analysis.cpython-37.pyc | Bin 19801 -> 0 bytes .../session_api_utils.cpython-37.pyc | Bin 7513 -> 0 bytes .../__pycache__/static_gratings.cpython-37.pyc | Bin 17141 -> 0 bytes .../stimulus_analysis.cpython-37.pyc | Bin 17211 -> 0 bytes .../__pycache__/stimulus_info.cpython-37.pyc | Bin 24051 -> 0 bytes .../__pycache__/sync_dataset.cpython-37.pyc | Bin 21327 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 1468 -> 0 bytes .../behavior_ophys_analysis.cpython-37.pyc | Bin 3774 -> 0 bytes .../behavior_ophys_experiment.cpython-37.pyc | Bin 25519 -> 0 bytes .../behavior_ophys_session.cpython-37.pyc | Bin 966 -> 0 bytes .../behavior_session.cpython-37.pyc | Bin 33180 -> 0 bytes .../__pycache__/criteria.cpython-37.pyc | Bin 9121 -> 0 bytes .../behavior/__pycache__/dprime.cpython-37.pyc | Bin 3961 -> 0 bytes .../__pycache__/event_detection.cpython-37.pyc | Bin 1468 -> 0 bytes .../eye_tracking_processing.cpython-37.pyc | Bin 7580 -> 0 bytes .../__pycache__/image_api.cpython-37.pyc | Bin 1803 -> 0 bytes .../behavior/__pycache__/mtrain.cpython-37.pyc | Bin 7912 -> 0 bytes .../ophys_experiment.cpython-37.pyc | Bin 24846 -> 0 bytes .../__pycache__/ophys_session.cpython-37.pyc | Bin 31952 -> 0 bytes .../rewards_processing.cpython-37.pyc | Bin 1444 -> 0 bytes .../__pycache__/schemas.cpython-37.pyc | Bin 8167 -> 0 bytes .../__pycache__/session_metrics.cpython-37.pyc | Bin 1820 -> 0 bytes .../stimulus_processing.cpython-37.pyc | Bin 15607 -> 0 bytes .../__pycache__/trial_masks.cpython-37.pyc | Bin 1800 -> 0 bytes .../trials_processing.cpython-37.pyc | Bin 36163 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 363 -> 0 bytes .../behavior_project_cache.cpython-37.pyc | Bin 21797 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 235 -> 0 bytes ...vior_project_metadata_writer.cpython-37.pyc | Bin 6722 -> 0 bytes .../abcs/__pycache__/__init__.cpython-37.pyc | Bin 386 -> 0 bytes .../behavior_project_base.cpython-37.pyc | Bin 3376 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 553 -> 0 bytes .../behavior_project_cloud_api.cpython-37.pyc | Bin 14644 -> 0 bytes .../behavior_project_lims_api.cpython-37.pyc | Bin 25588 -> 0 bytes .../tables/__pycache__/__init__.cpython-37.pyc | Bin 233 -> 0 bytes .../experiments_table.cpython-37.pyc | Bin 2549 -> 0 bytes .../__pycache__/ophys_mixin.cpython-37.pyc | Bin 823 -> 0 bytes .../ophys_sessions_table.cpython-37.pyc | Bin 2150 -> 0 bytes .../__pycache__/project_table.cpython-37.pyc | Bin 1885 -> 0 bytes .../__pycache__/sessions_table.cpython-37.pyc | Bin 4659 -> 0 bytes .../util/__pycache__/__init__.cpython-37.pyc | Bin 238 -> 0 bytes .../experiments_table_utils.cpython-37.pyc | Bin 2806 -> 0 bytes .../prior_exposure_processing.cpython-37.pyc | Bin 5850 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 494 -> 0 bytes .../__pycache__/_data_file_abc.cpython-37.pyc | Bin 3283 -> 0 bytes .../avg_projection_file.cpython-37.pyc | Bin 225 -> 0 bytes .../__pycache__/demix_file.cpython-37.pyc | Bin 3025 -> 0 bytes .../__pycache__/dff_file.cpython-37.pyc | Bin 3114 -> 0 bytes .../event_detection_file.cpython-37.pyc | Bin 3158 -> 0 bytes .../eye_tracking_file.cpython-37.pyc | Bin 2535 -> 0 bytes .../max_projection_file.cpython-37.pyc | Bin 225 -> 0 bytes .../rigid_motion_transform_file.cpython-37.pyc | Bin 3058 -> 0 bytes .../__pycache__/stimulus_file.cpython-37.pyc | Bin 3032 -> 0 bytes .../__pycache__/sync_file.cpython-37.pyc | Bin 3081 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 977 -> 0 bytes .../__pycache__/licks.cpython-37.pyc | Bin 4047 -> 0 bytes .../motion_correction.cpython-37.pyc | Bin 2440 -> 0 bytes .../__pycache__/projections.cpython-37.pyc | Bin 5111 -> 0 bytes .../__pycache__/rewards.cpython-37.pyc | Bin 2858 -> 0 bytes .../__pycache__/task_parameters.cpython-37.pyc | Bin 7521 -> 0 bytes .../base/__pycache__/__init__.cpython-37.pyc | Bin 221 -> 0 bytes .../_data_object_abc.cpython-37.pyc | Bin 5082 -> 0 bytes .../readable_interfaces.cpython-37.pyc | Bin 4340 -> 0 bytes .../writable_interfaces.cpython-37.pyc | Bin 1739 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 231 -> 0 bytes .../__pycache__/cell_specimens.cpython-37.pyc | Bin 17680 -> 0 bytes .../__pycache__/events.cpython-37.pyc | Bin 4351 -> 0 bytes .../__pycache__/rois_mixin.cpython-37.pyc | Bin 2518 -> 0 bytes .../traces/__pycache__/__init__.cpython-37.pyc | Bin 238 -> 0 bytes ...orrected_fluorescence_traces.cpython-37.pyc | Bin 3024 -> 0 bytes .../__pycache__/dff_traces.cpython-37.pyc | Bin 3485 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 229 -> 0 bytes .../eye_tracking_table.cpython-37.pyc | Bin 5486 -> 0 bytes .../__pycache__/rig_geometry.cpython-37.pyc | Bin 9016 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 225 -> 0 bytes .../behavior_ophys_metadata.cpython-37.pyc | Bin 4910 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 243 -> 0 bytes .../behavior_metadata.cpython-37.pyc | Bin 14599 -> 0 bytes .../behavior_session_id.cpython-37.pyc | Bin 2625 -> 0 bytes .../behavior_session_uuid.cpython-37.pyc | Bin 2296 -> 0 bytes .../date_of_acquisition.cpython-37.pyc | Bin 4289 -> 0 bytes .../__pycache__/equipment.cpython-37.pyc | Bin 3002 -> 0 bytes .../__pycache__/foraging_id.cpython-37.pyc | Bin 1616 -> 0 bytes .../__pycache__/session_type.cpython-37.pyc | Bin 1837 -> 0 bytes .../stimulus_frame_rate.cpython-37.pyc | Bin 1849 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 251 -> 0 bytes .../experiment_container_id.cpython-37.pyc | Bin 2029 -> 0 bytes .../field_of_view_shape.cpython-37.pyc | Bin 2352 -> 0 bytes .../__pycache__/imaging_depth.cpython-37.pyc | Bin 1991 -> 0 bytes .../__pycache__/imaging_plane.cpython-37.pyc | Bin 4108 -> 0 bytes .../ophys_experiment_metadata.cpython-37.pyc | Bin 4840 -> 0 bytes .../ophys_session_id.cpython-37.pyc | Bin 1916 -> 0 bytes .../__pycache__/project_code.cpython-37.pyc | Bin 1525 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 272 -> 0 bytes .../imaging_plane_group.cpython-37.pyc | Bin 3088 -> 0 bytes .../multi_plane_metadata.cpython-37.pyc | Bin 3564 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 242 -> 0 bytes .../__pycache__/age.cpython-37.pyc | Bin 2901 -> 0 bytes .../__pycache__/driver_line.cpython-37.pyc | Bin 2333 -> 0 bytes .../__pycache__/full_genotype.cpython-37.pyc | Bin 2548 -> 0 bytes .../__pycache__/mouse_id.cpython-37.pyc | Bin 2010 -> 0 bytes .../__pycache__/reporter_line.cpython-37.pyc | Bin 3972 -> 0 bytes .../__pycache__/sex.cpython-37.pyc | Bin 2107 -> 0 bytes .../subject_metadata.cpython-37.pyc | Bin 5312 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 230 -> 0 bytes .../running_acquisition.cpython-37.pyc | Bin 6388 -> 0 bytes .../running_processing.cpython-37.pyc | Bin 13457 -> 0 bytes .../__pycache__/running_speed.cpython-37.pyc | Bin 4806 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 224 -> 0 bytes .../__pycache__/presentations.cpython-37.pyc | Bin 7122 -> 0 bytes .../stimuli/__pycache__/stimuli.cpython-37.pyc | Bin 2556 -> 0 bytes .../stimulus_templates.cpython-37.pyc | Bin 11069 -> 0 bytes .../__pycache__/templates.cpython-37.pyc | Bin 4381 -> 0 bytes .../stimuli/__pycache__/util.cpython-37.pyc | Bin 1999 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 227 -> 0 bytes .../ophys_timestamps.cpython-37.pyc | Bin 3833 -> 0 bytes .../timestamps/__pycache__/util.cpython-37.pyc | Bin 438 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 247 -> 0 bytes .../stimulus_timestamps.cpython-37.pyc | Bin 5089 -> 0 bytes .../timestamps_processing.cpython-37.pyc | Bin 2672 -> 0 bytes .../trials/__pycache__/__init__.cpython-37.pyc | Bin 223 -> 0 bytes .../trials/__pycache__/trial.cpython-37.pyc | Bin 12464 -> 0 bytes .../__pycache__/trial_table.cpython-37.pyc | Bin 5263 -> 0 bytes .../__pycache__/analysis_tools.cpython-37.pyc | Bin 2690 -> 0 bytes .../behavior_project_cache.cpython-37.pyc | Bin 17478 -> 0 bytes .../create_multi_session_df.cpython-37.pyc | Bin 1569 -> 0 bytes .../run_multi_session_df.cpython-37.pyc | Bin 954 -> 0 bytes ...ed_stimulus_presentations_df.cpython-37.pyc | Bin 1554 -> 0 bytes .../run_save_flash_response_df.cpython-37.pyc | Bin 1516 -> 0 bytes .../run_save_trial_response_df.cpython-37.pyc | Bin 1515 -> 0 bytes .../run_summary_figures.cpython-37.pyc | Bin 1654 -> 0 bytes ...ed_stimulus_presentations_df.cpython-37.pyc | Bin 5393 -> 0 bytes .../save_flash_response_df.cpython-37.pyc | Bin 11142 -> 0 bytes .../save_trial_response_df.cpython-37.pyc | Bin 8378 -> 0 bytes .../__pycache__/summary_figures.cpython-37.pyc | Bin 18318 -> 0 bytes .../swdb/__pycache__/utilities.cpython-37.pyc | Bin 12743 -> 0 bytes .../sync/__pycache__/__init__.cpython-37.pyc | Bin 8452 -> 0 bytes .../__pycache__/process_sync.cpython-37.pyc | Bin 2609 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 222 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 2493 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 3167 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 213 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 2708 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 5132 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 224 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 240 -> 0 bytes .../extension_builder.cpython-37.pyc | Bin 1454 -> 0 bytes .../ndx_ophys_events.cpython-37.pyc | Bin 542 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 242 -> 0 bytes .../extension_builder.cpython-37.pyc | Bin 1732 -> 0 bytes .../ndx_stimulus_template.cpython-37.pyc | Bin 565 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 676 -> 0 bytes .../ecephys_project_cache.cpython-37.pyc | Bin 28065 -> 0 bytes .../__pycache__/ecephys_session.cpython-37.pyc | Bin 41377 -> 0 bytes .../__pycache__/stimulus_sync.cpython-37.pyc | Bin 4404 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 219 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 2447 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 3702 -> 0 bytes .../__pycache__/barcode.cpython-37.pyc | Bin 7497 -> 0 bytes .../barcode_sync_dataset.cpython-37.pyc | Bin 2267 -> 0 bytes .../__pycache__/channel_states.cpython-37.pyc | Bin 1644 -> 0 bytes .../probe_synchronizer.cpython-37.pyc | Bin 4448 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 215 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 4443 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 2874 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 225 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 4907 -> 0 bytes .../_current_source_density.cpython-37.pyc | Bin 6561 -> 0 bytes .../__pycache__/_filter_utils.cpython-37.pyc | Bin 2531 -> 0 bytes .../_interpolation_utils.cpython-37.pyc | Bin 5345 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 4293 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 532 -> 0 bytes .../ecephys_project_api.cpython-37.pyc | Bin 2689 -> 0 bytes .../ecephys_project_fixed_api.cpython-37.pyc | Bin 2644 -> 0 bytes .../ecephys_project_lims_api.cpython-37.pyc | Bin 23103 -> 0 bytes ...cephys_project_warehouse_api.cpython-37.pyc | Bin 10094 -> 0 bytes .../__pycache__/http_engine.cpython-37.pyc | Bin 7753 -> 0 bytes .../__pycache__/rma_engine.cpython-37.pyc | Bin 4238 -> 0 bytes .../__pycache__/utilities.cpython-37.pyc | Bin 3182 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 414 -> 0 bytes .../ecephys_nwb1_session_api.cpython-37.pyc | Bin 9717 -> 0 bytes .../ecephys_nwb_session_api.cpython-37.pyc | Bin 14887 -> 0 bytes .../ecephys_session_api.cpython-37.pyc | Bin 3770 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 210 -> 0 bytes .../__pycache__/continuous_file.cpython-37.pyc | Bin 4145 -> 0 bytes .../ecephys_sync_dataset.cpython-37.pyc | Bin 3993 -> 0 bytes .../__pycache__/stim_file.cpython-37.pyc | Bin 2699 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 218 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 2705 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 3591 -> 0 bytes .../__pycache__/subsampling.cpython-37.pyc | Bin 5218 -> 0 bytes .../nwb/__pycache__/__init__.cpython-37.pyc | Bin 634 -> 0 bytes ...cephys_nwb_extension_builder.cpython-37.pyc | Bin 3525 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 220 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 1934 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 1900 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 588 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 5042 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 4129 -> 0 bytes .../__pycache__/dot_motion.cpython-37.pyc | Bin 8561 -> 0 bytes .../drifting_gratings.cpython-37.pyc | Bin 20723 -> 0 bytes .../__pycache__/flashes.cpython-37.pyc | Bin 8551 -> 0 bytes .../__pycache__/natural_movies.cpython-37.pyc | Bin 4284 -> 0 bytes .../__pycache__/natural_scenes.cpython-37.pyc | Bin 7499 -> 0 bytes .../receptive_field_mapping.cpython-37.pyc | Bin 18406 -> 0 bytes .../__pycache__/static_gratings.cpython-37.pyc | Bin 16793 -> 0 bytes .../stimulus_analysis.cpython-37.pyc | Bin 25683 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 217 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 2612 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 3793 -> 0 bytes .../ephys_pre_spikes.cpython-37.pyc | Bin 13027 -> 0 bytes .../naming_utilities.cpython-37.pyc | Bin 5305 -> 0 bytes .../output_validation.cpython-37.pyc | Bin 1668 -> 0 bytes ...timulus_parameter_extraction.cpython-37.pyc | Bin 2591 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 231 -> 0 bytes .../__pycache__/view_blocks.cpython-37.pyc | Bin 2851 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 3780 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 212 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 28995 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 7687 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 216 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 3177 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 1753 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 500 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 1721 -> 0 bytes .../__pycache__/build.cpython-37.pyc | Bin 4118 -> 0 bytes .../DLC_Eye_Tracking.cpython-37.pyc | Bin 2092 -> 0 bytes .../DLC_Ellipse_Fitting.cpython-37.pyc | Bin 3992 -> 0 bytes .../DLC_Labeled_Video.cpython-37.pyc | Bin 2227 -> 0 bytes .../DLC_Ellipse_Video.cpython-37.pyc | Bin 3389 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 207 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 9892 -> 0 bytes .../__pycache__/_filter_utils.cpython-37.pyc | Bin 3522 -> 0 bytes .../__pycache__/_gaze_mapper.cpython-37.pyc | Bin 13557 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 3276 -> 0 bytes .../nwb/__pycache__/__init__.cpython-37.pyc | Bin 27883 -> 0 bytes ..._ophys_nwb_extension_builder.cpython-37.pyc | Bin 828 -> 0 bytes .../nwb/__pycache__/metadata.cpython-37.pyc | Bin 3114 -> 0 bytes .../nwb/__pycache__/nwb_api.cpython-37.pyc | Bin 3803 -> 0 bytes .../nwb/__pycache__/nwb_utils.cpython-37.pyc | Bin 2666 -> 0 bytes .../nwb/__pycache__/schemas.cpython-37.pyc | Bin 663 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 211 -> 0 bytes .../extension_builder.cpython-37.pyc | Bin 2324 -> 0 bytes .../ndx_ellipse_eye_tracking.cpython-37.pyc | Bin 546 -> 0 bytes .../ophys/__pycache__/__init__.cpython-37.pyc | Bin 200 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 503 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 5065 -> 0 bytes .../__pycache__/_schemas.cpython-37.pyc | Bin 2909 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 219 -> 0 bytes .../__pycache__/chisquarerf.cpython-37.pyc | Bin 12512 -> 0 bytes .../__pycache__/eventdetection.cpython-37.pyc | Bin 2766 -> 0 bytes .../__pycache__/fit_parameters.cpython-37.pyc | Bin 1864 -> 0 bytes .../__pycache__/fitgaussian2D.cpython-37.pyc | Bin 4093 -> 0 bytes .../__pycache__/postprocessing.cpython-37.pyc | Bin 2934 -> 0 bytes .../__pycache__/receptive_field.cpython-37.pyc | Bin 4920 -> 0 bytes .../__pycache__/tools.cpython-37.pyc | Bin 1344 -> 0 bytes .../__pycache__/utilities.cpython-37.pyc | Bin 7274 -> 0 bytes .../__pycache__/visualization.cpython-37.pyc | Bin 6954 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 2092 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 1180 -> 0 bytes config/__pycache__/__init__.cpython-37.pyc | Bin 826 -> 0 bytes config/__pycache__/manifest.cpython-37.pyc | Bin 9070 -> 0 bytes .../manifest_builder.cpython-37.pyc | Bin 2812 -> 0 bytes config/app/__pycache__/__init__.cpython-37.pyc | Bin 328 -> 0 bytes .../application_config.cpython-37.pyc | Bin 8870 -> 0 bytes .../model/__pycache__/__init__.cpython-37.pyc | Bin 189 -> 0 bytes .../__pycache__/description.cpython-37.pyc | Bin 3205 -> 0 bytes .../description_parser.cpython-37.pyc | Bin 2457 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 197 -> 0 bytes .../__pycache__/hdf5_util.cpython-37.pyc | Bin 1390 -> 0 bytes .../json_description_parser.cpython-37.pyc | Bin 3585 -> 0 bytes .../pycfg_description_parser.cpython-37.pyc | Bin 2924 -> 0 bytes core/__pycache__/__init__.cpython-37.pyc | Bin 181 -> 0 bytes core/__pycache__/auth_config.cpython-37.pyc | Bin 600 -> 0 bytes core/__pycache__/authentication.cpython-37.pyc | Bin 4577 -> 0 bytes .../brain_observatory_cache.cpython-37.pyc | Bin 22270 -> 0 bytes ...ain_observatory_nwb_data_set.cpython-37.pyc | Bin 32463 -> 0 bytes .../cache_method_utilities.cpython-37.pyc | Bin 1025 -> 0 bytes .../cell_types_cache.cpython-37.pyc | Bin 11150 -> 0 bytes core/__pycache__/dat_utilities.cpython-37.pyc | Bin 948 -> 0 bytes core/__pycache__/exceptions.cpython-37.pyc | Bin 1475 -> 0 bytes core/__pycache__/h5_utilities.cpython-37.pyc | Bin 3164 -> 0 bytes core/__pycache__/json_utilities.cpython-37.pyc | Bin 6191 -> 0 bytes .../mouse_connectivity_cache.cpython-37.pyc | Bin 25307 -> 0 bytes core/__pycache__/nwb_data_set.cpython-37.pyc | Bin 9914 -> 0 bytes core/__pycache__/obj_utilities.cpython-37.pyc | Bin 2040 -> 0 bytes core/__pycache__/ontology.cpython-37.pyc | Bin 5036 -> 0 bytes ...xperiment_session_id_mapping.cpython-37.pyc | Bin 21632 -> 0 bytes .../__pycache__/reference_space.cpython-37.pyc | Bin 13332 -> 0 bytes .../reference_space_cache.cpython-37.pyc | Bin 9374 -> 0 bytes core/__pycache__/simple_tree.cpython-37.pyc | Bin 11810 -> 0 bytes core/__pycache__/sitk_utilities.cpython-37.pyc | Bin 3502 -> 0 bytes core/__pycache__/structure_tree.cpython-37.pyc | Bin 14567 -> 0 bytes core/__pycache__/swc.cpython-37.pyc | Bin 25986 -> 0 bytes core/__pycache__/typing.cpython-37.pyc | Bin 709 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 306 -> 0 bytes .../__pycache__/lazy_property.cpython-37.pyc | Bin 1318 -> 0 bytes .../lazy_property_mixin.cpython-37.pyc | Bin 1200 -> 0 bytes ephys/__pycache__/__init__.cpython-37.pyc | Bin 182 -> 0 bytes .../__pycache__/ephys_extractor.cpython-37.pyc | Bin 34738 -> 0 bytes .../__pycache__/ephys_features.cpython-37.pyc | Bin 32573 -> 0 bytes .../extract_cell_features.cpython-37.pyc | Bin 5480 -> 0 bytes .../feature_extractor.cpython-37.pyc | Bin 12307 -> 0 bytes internal/__pycache__/__init__.cpython-37.pyc | Bin 185 -> 0 bytes .../api/__pycache__/__init__.cpython-37.pyc | Bin 4446 -> 0 bytes .../__pycache__/api_prerelease.cpython-37.pyc | Bin 1070 -> 0 bytes .../api/__pycache__/lims_api.cpython-37.pyc | Bin 2355 -> 0 bytes .../api/__pycache__/mtrain_api.cpython-37.pyc | Bin 6437 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 197 -> 0 bytes .../biophysical_module_api.cpython-37.pyc | Bin 3091 -> 0 bytes .../biophysical_module_reader.cpython-37.pyc | Bin 12306 -> 0 bytes .../grid_data_api_prerelease.cpython-37.pyc | Bin 4012 -> 0 bytes ..._connectivity_api_prerelease.cpython-37.pyc | Bin 7052 -> 0 bytes .../optimize_config_reader.cpython-37.pyc | Bin 11155 -> 0 bytes .../__pycache__/pre_release.cpython-37.pyc | Bin 5043 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 203 -> 0 bytes .../annotated_region_metrics.cpython-37.pyc | Bin 3623 -> 0 bytes .../__pycache__/demix_report.cpython-37.pyc | Bin 6793 -> 0 bytes .../__pycache__/demixer.cpython-37.pyc | Bin 10452 -> 0 bytes .../__pycache__/eye_calibration.cpython-37.pyc | Bin 10310 -> 0 bytes .../__pycache__/fit_ellipse.cpython-37.pyc | Bin 6019 -> 0 bytes .../__pycache__/frame_stream.cpython-37.pyc | Bin 10543 -> 0 bytes .../__pycache__/itracker.cpython-37.pyc | Bin 18821 -> 0 bytes .../__pycache__/itracker_utils.cpython-37.pyc | Bin 6910 -> 0 bytes .../__pycache__/mask_set.cpython-37.pyc | Bin 5572 -> 0 bytes .../ophys_session_decomposition.cpython-37.pyc | Bin 2828 -> 0 bytes .../__pycache__/roi_filter.cpython-37.pyc | Bin 10098 -> 0 bytes .../roi_filter_utils.cpython-37.pyc | Bin 9255 -> 0 bytes .../__pycache__/run_itracker.cpython-37.pyc | Bin 5140 -> 0 bytes .../__pycache__/time_sync.cpython-37.pyc | Bin 13290 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 213 -> 0 bytes .../core/__pycache__/__init__.cpython-37.pyc | Bin 190 -> 0 bytes .../lims_pipeline_module.cpython-37.pyc | Bin 3462 -> 0 bytes .../__pycache__/lims_utilities.cpython-37.pyc | Bin 5903 -> 0 bytes ...onnectivity_cache_prerelease.cpython-37.pyc | Bin 7816 -> 0 bytes .../core/__pycache__/simpletree.cpython-37.pyc | Bin 3222 -> 0 bytes internal/core/__pycache__/swc.cpython-37.pyc | Bin 2663 -> 0 bytes .../ephys/__pycache__/__init__.cpython-37.pyc | Bin 191 -> 0 bytes .../core_feature_extract.cpython-37.pyc | Bin 10096 -> 0 bytes .../__pycache__/plot_qc_figures.cpython-37.pyc | Bin 25934 -> 0 bytes .../plot_qc_figures3.cpython-37.pyc | Bin 25343 -> 0 bytes internal/model/__pycache__/AIC.cpython-37.pyc | Bin 1040 -> 0 bytes internal/model/__pycache__/GLM.cpython-37.pyc | Bin 3508 -> 0 bytes .../model/__pycache__/__init__.cpython-37.pyc | Bin 191 -> 0 bytes .../__pycache__/data_access.cpython-37.pyc | Bin 3991 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 203 -> 0 bytes .../biophysical_archiver.cpython-37.pyc | Bin 3571 -> 0 bytes .../__pycache__/check_fi_shift.cpython-37.pyc | Bin 3189 -> 0 bytes .../__pycache__/deap_utils.cpython-37.pyc | Bin 8242 -> 0 bytes .../__pycache__/ephys_utils.cpython-37.pyc | Bin 1680 -> 0 bytes .../__pycache__/fit_stage_1.cpython-37.pyc | Bin 9862 -> 0 bytes .../__pycache__/fit_stage_2.cpython-37.pyc | Bin 3220 -> 0 bytes .../make_deap_fit_json.cpython-37.pyc | Bin 6725 -> 0 bytes .../__pycache__/neuron_parallel.cpython-37.pyc | Bin 1852 -> 0 bytes .../__pycache__/optimize.cpython-37.pyc | Bin 7958 -> 0 bytes .../__pycache__/run_optimize.cpython-37.pyc | Bin 7248 -> 0 bytes .../run_optimize_workflow.cpython-37.pyc | Bin 485 -> 0 bytes .../__pycache__/run_passive_fit.cpython-37.pyc | Bin 3974 -> 0 bytes .../run_simulate_lims.cpython-37.pyc | Bin 4224 -> 0 bytes .../run_simulate_workflow.cpython-37.pyc | Bin 485 -> 0 bytes .../fits/__pycache__/__init__.cpython-37.pyc | Bin 208 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 219 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 219 -> 0 bytes .../neuron_passive_fit.cpython-37.pyc | Bin 3393 -> 0 bytes .../neuron_passive_fit2.cpython-37.pyc | Bin 2699 -> 0 bytes .../neuron_passive_fit_elec.cpython-37.pyc | Bin 2952 -> 0 bytes .../__pycache__/neuron_utils.cpython-37.pyc | Bin 1490 -> 0 bytes .../__pycache__/output_grabber.cpython-37.pyc | Bin 1943 -> 0 bytes .../__pycache__/preprocess.cpython-37.pyc | Bin 2527 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 227 -> 0 bytes .../glif/__pycache__/ASGLM.cpython-37.pyc | Bin 6271 -> 0 bytes .../model/glif/__pycache__/MLIN.cpython-37.pyc | Bin 4321 -> 0 bytes .../glif/__pycache__/__init__.cpython-37.pyc | Bin 196 -> 0 bytes ...two_lists_of_arrays_the_same.cpython-37.pyc | Bin 569 -> 0 bytes .../__pycache__/configure_model.cpython-37.pyc | Bin 10195 -> 0 bytes .../__pycache__/error_functions.cpython-37.pyc | Bin 4111 -> 0 bytes .../__pycache__/find_spikes.cpython-37.pyc | Bin 5826 -> 0 bytes .../__pycache__/find_sweeps.cpython-37.pyc | Bin 6244 -> 0 bytes .../__pycache__/glif_experiment.cpython-37.pyc | Bin 8701 -> 0 bytes .../__pycache__/glif_optimizer.cpython-37.pyc | Bin 5287 -> 0 bytes .../glif_optimizer_neuron.cpython-37.pyc | Bin 16539 -> 0 bytes .../__pycache__/optimize_neuron.cpython-37.pyc | Bin 4278 -> 0 bytes .../glif/__pycache__/plotting.cpython-37.pyc | Bin 4038 -> 0 bytes .../preprocess_neuron.cpython-37.pyc | Bin 12989 -> 0 bytes .../model/glif/__pycache__/rc.cpython-37.pyc | Bin 1703 -> 0 bytes .../__pycache__/spike_cutting.cpython-37.pyc | Bin 6707 -> 0 bytes .../threshold_adaptation.cpython-37.pyc | Bin 15042 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 196 -> 0 bytes .../__pycache__/compartment.cpython-37.pyc | Bin 1027 -> 0 bytes .../__pycache__/morphology.cpython-37.pyc | Bin 24105 -> 0 bytes .../__pycache__/morphvis.cpython-37.pyc | Bin 9996 -> 0 bytes .../morphology/__pycache__/node.cpython-37.pyc | Bin 2942 -> 0 bytes .../__pycache__/validate_swc.cpython-37.pyc | Bin 6270 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 204 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 222 -> 0 bytes .../__pycache__/cav_unionize.cpython-37.pyc | Bin 1416 -> 0 bytes .../__pycache__/cav_unionizer.cpython-37.pyc | Bin 1738 -> 0 bytes .../__pycache__/data_utilities.cpython-37.pyc | Bin 3200 -> 0 bytes .../interval_unionizer.cpython-37.pyc | Bin 7683 -> 0 bytes .../run_tissuecyte_unionize_cav.cpython-37.pyc | Bin 2265 -> 0 bytes ..._tissuecyte_unionize_classic.cpython-37.pyc | Bin 3441 -> 0 bytes .../tissuecyte_unionize_record.cpython-37.pyc | Bin 4877 -> 0 bytes .../tissuecyte_unionizer.cpython-37.pyc | Bin 3094 -> 0 bytes .../__pycache__/unionize_record.cpython-37.pyc | Bin 1747 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 225 -> 0 bytes .../generate_projection_strip.cpython-37.pyc | Bin 3323 -> 0 bytes .../__pycache__/image_sheet.cpython-37.pyc | Bin 1487 -> 0 bytes .../projection_functions.cpython-37.pyc | Bin 1109 -> 0 bytes .../visualization_utilities.cpython-37.pyc | Bin 2766 -> 0 bytes .../volume_projector.cpython-37.pyc | Bin 2678 -> 0 bytes .../volume_utilities.cpython-37.pyc | Bin 1508 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 225 -> 0 bytes .../__pycache__/stitcher.cpython-37.pyc | Bin 3921 -> 0 bytes .../__pycache__/tile.cpython-37.pyc | Bin 2935 -> 0 bytes .../convert_igor_nwb.cpython-37.pyc | Bin 3351 -> 0 bytes .../extract_nwb_data.cpython-37.pyc | Bin 9262 -> 0 bytes .../feature_extraction_module.cpython-37.pyc | Bin 2725 -> 0 bytes .../lab_notebook_reader.cpython-37.pyc | Bin 4037 -> 0 bytes .../__pycache__/nwb_publish.cpython-37.pyc | Bin 13236 -> 0 bytes .../ephys_nwb/__pycache__/qc.cpython-37.pyc | Bin 4872 -> 0 bytes .../__pycache__/qc_support.cpython-37.pyc | Bin 4437 -> 0 bytes .../__pycache__/resource_file.cpython-37.pyc | Bin 6161 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 202 -> 0 bytes ...run_annotated_region_metrics.cpython-37.pyc | Bin 1864 -> 0 bytes .../__pycache__/run_demixing.cpython-37.pyc | Bin 6349 -> 0 bytes .../run_dff_computation.cpython-37.pyc | Bin 1651 -> 0 bytes .../run_eye_tracking.cpython-37.pyc | Bin 2207 -> 0 bytes .../run_neuropil_correction.cpython-37.pyc | Bin 5942 -> 0 bytes .../run_observatory_analysis.cpython-37.pyc | Bin 3230 -> 0 bytes ...rvatory_container_thumbnails.cpython-37.pyc | Bin 2436 -> 0 bytes .../run_observatory_thumbnails.cpython-37.pyc | Bin 16804 -> 0 bytes .../run_ophys_eye_calibration.cpython-37.pyc | Bin 5098 -> 0 bytes ..._ophys_session_decomposition.cpython-37.pyc | Bin 3577 -> 0 bytes .../run_ophys_time_sync.cpython-37.pyc | Bin 7315 -> 0 bytes .../__pycache__/run_roi_filter.cpython-37.pyc | Bin 8723 -> 0 bytes ...ojection_thumbnail_from_json.cpython-37.pyc | Bin 3328 -> 0 bytes ...tissuecyte_stitching_classic.cpython-37.pyc | Bin 3844 -> 0 bytes ...ecyte_unionize_cav_from_json.cpython-37.pyc | Bin 674 -> 0 bytes ...ize_classic_counts_from_json.cpython-37.pyc | Bin 696 -> 0 bytes ...e_unionize_classic_from_json.cpython-37.pyc | Bin 682 -> 0 bytes .../calculate_features.cpython-37.pyc | Bin 2579 -> 0 bytes .../__pycache__/cortical_layers.cpython-37.pyc | Bin 8247 -> 0 bytes .../surrogate_strategy.cpython-37.pyc | Bin 4410 -> 0 bytes .../upright_transform.cpython-37.pyc | Bin 7261 -> 0 bytes .../gbm/__pycache__/__init__.cpython-37.pyc | Bin 206 -> 0 bytes ...ate_gbm_analysis_run_records.cpython-37.pyc | Bin 1716 -> 0 bytes .../generate_gbm_heatmap.cpython-37.pyc | Bin 4151 -> 0 bytes ...generate_gbm_sample_metadata.cpython-37.pyc | Bin 2361 -> 0 bytes model/__pycache__/__init__.cpython-37.pyc | Bin 182 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 194 -> 0 bytes .../__pycache__/bps_command.cpython-37.pyc | Bin 1532 -> 0 bytes .../__pycache__/config.cpython-37.pyc | Bin 3426 -> 0 bytes .../neuron/__pycache__/__init__.cpython-37.pyc | Bin 201 -> 0 bytes .../__pycache__/hoc_utils.cpython-37.pyc | Bin 1575 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 202 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 194 -> 0 bytes .../__pycache__/run_simulate.cpython-37.pyc | Bin 3445 -> 0 bytes .../__pycache__/runner.cpython-37.pyc | Bin 6212 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 11520 -> 0 bytes model/glif/__pycache__/__init__.cpython-37.pyc | Bin 391 -> 0 bytes .../__pycache__/glif_neuron.cpython-37.pyc | Bin 14543 -> 0 bytes .../glif_neuron_methods.cpython-37.pyc | Bin 17142 -> 0 bytes .../__pycache__/simulate_neuron.cpython-37.pyc | Bin 4576 -> 0 bytes morphology/__pycache__/__init__.cpython-37.pyc | Bin 187 -> 0 bytes .../__pycache__/validate_swc.cpython-37.pyc | Bin 2144 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 195 -> 0 bytes .../grid/__pycache__/__init__.cpython-37.pyc | Bin 471 -> 0 bytes .../grid/__pycache__/__main__.cpython-37.pyc | Bin 3891 -> 0 bytes .../grid/__pycache__/_schemas.cpython-37.pyc | Bin 4312 -> 0 bytes .../image_series_gridder.cpython-37.pyc | Bin 4859 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 967 -> 0 bytes .../__pycache__/base_subimage.cpython-37.pyc | Bin 8382 -> 0 bytes .../__pycache__/cav_subimage.cpython-37.pyc | Bin 1171 -> 0 bytes .../classic_subimage.cpython-37.pyc | Bin 3743 -> 0 bytes .../__pycache__/count_subimage.cpython-37.pyc | Bin 2882 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 210 -> 0 bytes .../downsampling_utilities.cpython-37.pyc | Bin 3069 -> 0 bytes .../__pycache__/image_utilities.cpython-37.pyc | Bin 6691 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 3129 -> 0 bytes test/__pycache__/glif_tests.cpython-37.pyc | Bin 2217 -> 0 bytes .../test_argschema_utilities.cpython-37.pyc | Bin 6387 -> 0 bytes .../__pycache__/test_deprecated.cpython-37.pyc | Bin 1730 -> 0 bytes .../test_inline_examples.cpython-37.pyc | Bin 897 -> 0 bytes test/__pycache__/test_temp_dir.cpython-37.pyc | Bin 1539 -> 0 bytes test/api/__pycache__/__init__.cpython-37.pyc | Bin 916 -> 0 bytes ...notated_section_data_set_api.cpython-37.pyc | Bin 2136 -> 0 bytes test/api/__pycache__/test_api.cpython-37.pyc | Bin 4947 -> 0 bytes .../test_biophysical_api.cpython-37.pyc | Bin 3067 -> 0 bytes .../test_brain_observatory_api.cpython-37.pyc | Bin 14379 -> 0 bytes test/api/__pycache__/test_cache.cpython-37.pyc | Bin 5998 -> 0 bytes .../__pycache__/test_cacheable.cpython-37.pyc | Bin 9177 -> 0 bytes .../test_caching_utilities.cpython-37.pyc | Bin 5714 -> 0 bytes .../test_cell_types_api.cpython-37.pyc | Bin 3271 -> 0 bytes .../test_file_download.cpython-37.pyc | Bin 5139 -> 0 bytes .../__pycache__/test_glif_api.cpython-37.pyc | Bin 2830 -> 0 bytes .../test_grid_data_api.cpython-37.pyc | Bin 5104 -> 0 bytes .../test_image_download_api.cpython-37.pyc | Bin 16309 -> 0 bytes .../test_mouse_atlas_api.cpython-37.pyc | Bin 2475 -> 0 bytes .../test_mouse_connectivity_api.cpython-37.pyc | Bin 11535 -> 0 bytes .../test_ontologies_api.cpython-37.pyc | Bin 6820 -> 0 bytes test/api/__pycache__/test_pager.cpython-37.pyc | Bin 6822 -> 0 bytes .../test_reference_space_api.cpython-37.pyc | Bin 5336 -> 0 bytes .../test_rma_template.cpython-37.pyc | Bin 6243 -> 0 bytes .../__pycache__/test_svg_api.cpython-37.pyc | Bin 1889 -> 0 bytes .../test_synchronization_api.cpython-37.pyc | Bin 3605 -> 0 bytes .../test_tree_search_api.cpython-37.pyc | Bin 1770 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 197 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 3553 -> 0 bytes .../__pycache__/test_cache.cpython-37.pyc | Bin 17348 -> 0 bytes .../__pycache__/test_change_log.cpython-37.pyc | Bin 4777 -> 0 bytes .../test_file_attributes.cpython-37.pyc | Bin 1818 -> 0 bytes .../test_full_process.cpython-37.pyc | Bin 5051 -> 0 bytes .../test_local_cache.cpython-37.pyc | Bin 1339 -> 0 bytes .../__pycache__/test_manifest.cpython-37.pyc | Bin 5548 -> 0 bytes .../test_smart_download.cpython-37.pyc | Bin 10124 -> 0 bytes .../test_static_local_cache.cpython-37.pyc | Bin 4163 -> 0 bytes .../__pycache__/test_utils.cpython-37.pyc | Bin 1996 -> 0 bytes .../test_windows_isilon_paths.cpython-37.pyc | Bin 2714 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 3382 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 1429 -> 0 bytes .../test_circle_plots.cpython-37.pyc | Bin 3397 -> 0 bytes .../__pycache__/test_demixer.cpython-37.pyc | Bin 3070 -> 0 bytes .../__pycache__/test_dff.cpython-37.pyc | Bin 3194 -> 0 bytes .../test_drifting_gratings.cpython-37.pyc | Bin 3190 -> 0 bytes .../test_locally_sparse_noise.cpython-37.pyc | Bin 3579 -> 0 bytes .../test_natural_movie.cpython-37.pyc | Bin 2800 -> 0 bytes .../test_natural_scenes.cpython-37.pyc | Bin 3190 -> 0 bytes .../__pycache__/test_notebook.cpython-37.pyc | Bin 6917 -> 0 bytes .../test_observatory_plots.cpython-37.pyc | Bin 9634 -> 0 bytes .../__pycache__/test_roi_masks.cpython-37.pyc | Bin 4778 -> 0 bytes .../test_session_analysis.cpython-37.pyc | Bin 3099 -> 0 bytes ..._session_analysis_regression.cpython-37.pyc | Bin 8982 -> 0 bytes .../test_session_api_utils.cpython-37.pyc | Bin 7520 -> 0 bytes .../test_static_gratings.cpython-37.pyc | Bin 3862 -> 0 bytes .../test_stimulus_analysis.cpython-37.pyc | Bin 2679 -> 0 bytes .../test_stimulus_info.cpython-37.pyc | Bin 11670 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 2286 -> 0 bytes ...est_behavior_metadata_legacy.cpython-37.pyc | Bin 5795 -> 0 bytes ...st_behavior_ophys_experiment.cpython-37.pyc | Bin 11566 -> 0 bytes .../test_behavior_session.cpython-37.pyc | Bin 1240 -> 0 bytes .../__pycache__/test_criteria.cpython-37.pyc | Bin 4993 -> 0 bytes .../__pycache__/test_dprime.cpython-37.pyc | Bin 5443 -> 0 bytes .../test_event_detection.cpython-37.pyc | Bin 880 -> 0 bytes ...test_eye_tracking_processing.cpython-37.pyc | Bin 6857 -> 0 bytes .../test_mtrain_annotate.cpython-37.pyc | Bin 834 -> 0 bytes ...or_exposure_count_processing.cpython-37.pyc | Bin 2859 -> 0 bytes .../test_rewards_processing.cpython-37.pyc | Bin 998 -> 0 bytes .../test_session_metrics.cpython-37.pyc | Bin 1354 -> 0 bytes .../test_stimulus_processing.cpython-37.pyc | Bin 9487 -> 0 bytes .../test_sync_processing.cpython-37.pyc | Bin 3144 -> 0 bytes .../test_trial_masks.cpython-37.pyc | Bin 2144 -> 0 bytes .../test_trials_processing.cpython-37.pyc | Bin 19852 -> 0 bytes .../test_write_behavior_nwb.cpython-37.pyc | Bin 3397 -> 0 bytes ...est_write_nwb_behavior_ophys.cpython-37.pyc | Bin 3504 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 231 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 3644 -> 0 bytes ...t_behavior_project_cloud_api.cpython-37.pyc | Bin 6298 -> 0 bytes ...st_behavior_project_lims_api.cpython-37.pyc | Bin 4087 -> 0 bytes ...test_experiments_table_utils.cpython-37.pyc | Bin 2955 -> 0 bytes .../__pycache__/test_from_s3.cpython-37.pyc | Bin 10172 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 3481 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 17392 -> 0 bytes .../test_behavior_project_cache.cpython-37.pyc | Bin 4714 -> 0 bytes .../test_stimulus_file.cpython-37.pyc | Bin 2508 -> 0 bytes .../__pycache__/test_sync_file.cpython-37.pyc | Bin 3031 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 916 -> 0 bytes .../__pycache__/lims_util.cpython-37.pyc | Bin 1064 -> 0 bytes .../__pycache__/nwb_input_json.cpython-37.pyc | Bin 1129 -> 0 bytes .../test_cell_specimens.cpython-37.pyc | Bin 8247 -> 0 bytes .../__pycache__/test_licks.cpython-37.pyc | Bin 6296 -> 0 bytes .../test_motion_correction.cpython-37.pyc | Bin 4386 -> 0 bytes .../test_ophys_timestamps.cpython-37.pyc | Bin 3945 -> 0 bytes .../test_projections.cpython-37.pyc | Bin 3767 -> 0 bytes .../__pycache__/test_rewards.cpython-37.pyc | Bin 4058 -> 0 bytes .../__pycache__/test_stimuli.cpython-37.pyc | Bin 4180 -> 0 bytes .../test_task_parameters.cpython-37.pyc | Bin 2604 -> 0 bytes .../test_trial_table.cpython-37.pyc | Bin 6745 -> 0 bytes .../test_data_object.cpython-37.pyc | Bin 5322 -> 0 bytes .../test_eye_tracking_table.cpython-37.pyc | Bin 3294 -> 0 bytes .../test_rig_geometry.cpython-37.pyc | Bin 4646 -> 0 bytes ...test_behavior_ophys_metadata.cpython-37.pyc | Bin 6994 -> 0 bytes .../test_behavior_metadata.cpython-37.pyc | Bin 11156 -> 0 bytes .../test_running_acquisition.cpython-37.pyc | Bin 4943 -> 0 bytes .../test_running_processing.cpython-37.pyc | Bin 7601 -> 0 bytes .../test_running_speed.cpython-37.pyc | Bin 5731 -> 0 bytes .../test_stimulus_timestamps.cpython-37.pyc | Bin 6398 -> 0 bytes .../test_timestamps_processing.cpython-37.pyc | Bin 2158 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 207 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 502 -> 0 bytes .../test_copy_utility.cpython-37.pyc | Bin 4858 -> 0 bytes .../test_current_source_density.cpython-37.pyc | Bin 6094 -> 0 bytes .../test_ecephys_project_cache.cpython-37.pyc | Bin 17884 -> 0 bytes ...st_ecephys_project_fixed_api.cpython-37.pyc | Bin 846 -> 0 bytes ...est_ecephys_project_lims_api.cpython-37.pyc | Bin 7847 -> 0 bytes ...cephys_project_warehouse_api.cpython-37.pyc | Bin 2408 -> 0 bytes .../test_ecephys_session.cpython-37.pyc | Bin 21250 -> 0 bytes ...test_ecephys_session_nwb_api.cpython-37.pyc | Bin 1163 -> 0 bytes .../test_ecephys_sync_dataset.cpython-37.pyc | Bin 2811 -> 0 bytes .../test_http_engine.cpython-37.pyc | Bin 4101 -> 0 bytes .../test_lfp_subsampling.cpython-37.pyc | Bin 3603 -> 0 bytes .../__pycache__/test_rma_engine.cpython-37.pyc | Bin 1188 -> 0 bytes .../__pycache__/test_stim_file.cpython-37.pyc | Bin 1808 -> 0 bytes .../test_stimulus_sync.cpython-37.pyc | Bin 5458 -> 0 bytes .../test_visualization.cpython-37.pyc | Bin 912 -> 0 bytes .../__pycache__/test_write_nwb.cpython-37.pyc | Bin 26768 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 224 -> 0 bytes ...test_align_timestamps_module.cpython-37.pyc | Bin 4565 -> 0 bytes .../__pycache__/test_barcode.cpython-37.pyc | Bin 2823 -> 0 bytes .../test_barcode_sync_dataset.cpython-37.pyc | Bin 1680 -> 0 bytes .../test_channel_states.cpython-37.pyc | Bin 917 -> 0 bytes .../test_probe_synchronizer.cpython-37.pyc | Bin 1785 -> 0 bytes ...est_ecephys_nwb1_session_api.cpython-37.pyc | Bin 2148 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 225 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 3220 -> 0 bytes .../__pycache__/test_dot_motion.cpython-37.pyc | Bin 3958 -> 0 bytes .../test_drifting_gratings.cpython-37.pyc | Bin 8458 -> 0 bytes .../__pycache__/test_flashes.cpython-37.pyc | Bin 3450 -> 0 bytes .../test_natural_movies.cpython-37.pyc | Bin 2067 -> 0 bytes .../test_natural_scenes.cpython-37.pyc | Bin 3884 -> 0 bytes ...test_receptive_field_mapping.cpython-37.pyc | Bin 6578 -> 0 bytes .../test_static_gratings.cpython-37.pyc | Bin 5676 -> 0 bytes .../test_stimulus_analysis.cpython-37.pyc | Bin 14012 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 222 -> 0 bytes .../test_ephys_pre_spikes.cpython-37.pyc | Bin 5679 -> 0 bytes .../test_naming_utilities.cpython-37.pyc | Bin 2876 -> 0 bytes ...timulus_parameter_extraction.cpython-37.pyc | Bin 1924 -> 0 bytes .../test_stimulus_table_module.cpython-37.pyc | Bin 5578 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 221 -> 0 bytes ...extract_running_speed_module.cpython-37.pyc | Bin 2380 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 212 -> 0 bytes .../test_gaze_mapping.cpython-37.pyc | Bin 8262 -> 0 bytes .../__pycache__/test_main.cpython-37.pyc | Bin 6422 -> 0 bytes .../nwb/__pycache__/__init__.cpython-37.pyc | Bin 203 -> 0 bytes .../nwb/__pycache__/conftest.cpython-37.pyc | Bin 516 -> 0 bytes .../nwb/__pycache__/test_nwb.cpython-37.pyc | Bin 1714 -> 0 bytes .../__pycache__/test_nwb_api.cpython-37.pyc | Bin 595 -> 0 bytes .../__pycache__/test_nwb_utils.cpython-37.pyc | Bin 1144 -> 0 bytes .../test_chisquarerf.cpython-37.pyc | Bin 7568 -> 0 bytes .../test_fitgaussian2D.cpython-37.pyc | Bin 4721 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 214 -> 0 bytes .../test_sync_utilities.cpython-37.pyc | Bin 3578 -> 0 bytes ...test_config_single_file_json.cpython-37.pyc | Bin 1374 -> 0 bytes .../test_json_comments.cpython-37.pyc | Bin 4488 -> 0 bytes .../__pycache__/test_manifest.cpython-37.pyc | Bin 1930 -> 0 bytes .../test_multi_file_config.cpython-37.pyc | Bin 2472 -> 0 bytes .../test_pyconfig_parser.cpython-37.pyc | Bin 2483 -> 0 bytes .../test_authentication.cpython-37.pyc | Bin 2570 -> 0 bytes ...test_brain_observatory_cache.cpython-37.pyc | Bin 10384 -> 0 bytes ...ain_observatory_nwb_data_set.cpython-37.pyc | Bin 9944 -> 0 bytes .../test_cell_filters.cpython-37.pyc | Bin 7230 -> 0 bytes .../test_cell_types_cache_unit.cpython-37.pyc | Bin 16409 -> 0 bytes .../test_h5_utilities.cpython-37.pyc | Bin 2919 -> 0 bytes .../test_json_utilities.cpython-37.pyc | Bin 2063 -> 0 bytes .../test_lazy_property.cpython-37.pyc | Bin 1697 -> 0 bytes ...est_mouse_connectivity_cache.cpython-37.pyc | Bin 17243 -> 0 bytes ..._mouse_connectivity_notebook.cpython-37.pyc | Bin 4519 -> 0 bytes .../test_nwb_data_set.cpython-37.pyc | Bin 4578 -> 0 bytes .../test_obj_utilities.cpython-37.pyc | Bin 1732 -> 0 bytes .../test_reference_space.cpython-37.pyc | Bin 5902 -> 0 bytes .../test_reference_space_cache.cpython-37.pyc | Bin 5988 -> 0 bytes ...est_reference_space_notebook.cpython-37.pyc | Bin 2761 -> 0 bytes .../test_simple_tree.cpython-37.pyc | Bin 5793 -> 0 bytes .../test_sitk_utilities.cpython-37.pyc | Bin 4477 -> 0 bytes .../test_structure_tree.cpython-37.pyc | Bin 6514 -> 0 bytes .../__pycache__/test_extractor.cpython-37.pyc | Bin 4898 -> 0 bytes .../__pycache__/test_features.cpython-37.pyc | Bin 8468 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 533 -> 0 bytes ...est_annotated_region_metrics.cpython-37.pyc | Bin 2246 -> 0 bytes .../test_biophysical_modules.cpython-37.pyc | Bin 2174 -> 0 bytes .../test_core_feature_extract.cpython-37.pyc | Bin 2578 -> 0 bytes .../test_eye_calibration.cpython-37.pyc | Bin 3197 -> 0 bytes .../__pycache__/test_internal.cpython-37.pyc | Bin 742 -> 0 bytes .../__pycache__/test_mtrain_api.cpython-37.pyc | Bin 3201 -> 0 bytes .../test_optimize_config_reader.cpython-37.pyc | Bin 4213 -> 0 bytes .../test_optimize_manifest.cpython-37.pyc | Bin 6623 -> 0 bytes .../__pycache__/test_roi_filter.cpython-37.pyc | Bin 6063 -> 0 bytes .../test_simulate_manifest.cpython-37.pyc | Bin 8608 -> 0 bytes .../test_simulate_update_output.cpython-37.pyc | Bin 5020 -> 0 bytes .../test_api_prerelease.cpython-37.pyc | Bin 837 -> 0 bytes ...est_grid_data_api_prerelease.cpython-37.pyc | Bin 3098 -> 0 bytes ..._connectivity_api_prerelease.cpython-37.pyc | Bin 4183 -> 0 bytes .../test_pre_release.cpython-37.pyc | Bin 4172 -> 0 bytes .../__pycache__/conftest.cpython-37.pyc | Bin 323 -> 0 bytes .../test_ephys_utils.cpython-37.pyc | Bin 1076 -> 0 bytes .../test_optimize_run.cpython-37.pyc | Bin 256238 -> 0 bytes .../test_simulate_run.cpython-37.pyc | Bin 19472 -> 0 bytes .../test_roi_filter_utils.cpython-37.pyc | Bin 1475 -> 0 bytes .../test_run_ophys_time_sync.cpython-37.pyc | Bin 4295 -> 0 bytes .../__pycache__/test_time_sync.cpython-37.pyc | Bin 17805 -> 0 bytes ...onnectivity_cache_prerelease.cpython-37.pyc | Bin 5712 -> 0 bytes .../test_generate_gbm_heatmap.cpython-37.pyc | Bin 3559 -> 0 bytes .../test_apply_affine.cpython-37.pyc | Bin 934 -> 0 bytes .../test_interval_unionizer.cpython-37.pyc | Bin 4063 -> 0 bytes ...t_tissuecyte_unionize_record.cpython-37.pyc | Bin 4343 -> 0 bytes .../test_unionize_record.cpython-37.pyc | Bin 682 -> 0 bytes .../test_projection_functions.cpython-37.pyc | Bin 1390 -> 0 bytes ...test_visualization_utilities.cpython-37.pyc | Bin 2202 -> 0 bytes .../test_volume_projector.cpython-37.pyc | Bin 2912 -> 0 bytes .../test_volume_utilities.cpython-37.pyc | Bin 3060 -> 0 bytes .../__pycache__/test_stitcher.cpython-37.pyc | Bin 4715 -> 0 bytes .../__pycache__/test_tile.cpython-37.pyc | Bin 3202 -> 0 bytes .../__pycache__/check_parser.cpython-37.pyc | Bin 459 -> 0 bytes ...test_biophysical_perisomatic.cpython-37.pyc | Bin 1690 -> 0 bytes .../model/__pycache__/test_glif.cpython-37.pyc | Bin 2643 -> 0 bytes .../__pycache__/test_runner.cpython-37.pyc | Bin 632 -> 0 bytes .../test_biophysical_all_active.cpython-37.pyc | Bin 1720 -> 0 bytes .../test_biophysical_peri.cpython-37.pyc | Bin 1712 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 200 -> 0 bytes .../grid/__pycache__/__init__.cpython-37.pyc | Bin 205 -> 0 bytes .../test_base_subimage.cpython-37.pyc | Bin 6027 -> 0 bytes .../test_cav_subimage.cpython-37.pyc | Bin 1404 -> 0 bytes .../test_classic_subimage.cpython-37.pyc | Bin 5349 -> 0 bytes .../test_image_series_gridder.cpython-37.pyc | Bin 5402 -> 0 bytes .../test_image_utilities.cpython-37.pyc | Bin 5439 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 191 -> 0 bytes .../custom_comparators.cpython-37.pyc | Bin 3755 -> 0 bytes .../regression_fixture.cpython-37.pyc | Bin 935 -> 0 bytes .../__pycache__/temp_dir.cpython-37.pyc | Bin 1029 -> 0 bytes 1575 files changed, 0 insertions(+), 0 deletions(-) rename __init__.py => allensdk/__init__.py (100%) rename {api => allensdk/api}/__init__.py (100%) rename {api => allensdk/api}/api.py (100%) rename {api => allensdk/api}/cloud_cache/__init__.py (100%) rename {api => allensdk/api}/cloud_cache/cloud_cache.py (100%) rename {api => allensdk/api}/cloud_cache/file_attributes.py (100%) rename {api => allensdk/api}/cloud_cache/manifest.py (100%) rename {api => allensdk/api}/cloud_cache/utils.py (100%) rename {api => allensdk/api}/queries/__init__.py (100%) rename {api => allensdk/api}/queries/annotated_section_data_sets_api.py (100%) rename {api => allensdk/api}/queries/biophysical_api.py (100%) rename {api => allensdk/api}/queries/brain_observatory_api.py (100%) rename {api => allensdk/api}/queries/cell_types_api.py (100%) rename {api => allensdk/api}/queries/connected_services.py (100%) rename {api => allensdk/api}/queries/glif_api.py (100%) rename {api => allensdk/api}/queries/grid_data_api.py (100%) rename {api => allensdk/api}/queries/image_download_api.py (100%) rename {api => allensdk/api}/queries/mouse_atlas_api.py (100%) rename {api => allensdk/api}/queries/mouse_connectivity_api.py (100%) rename {api => allensdk/api}/queries/ontologies_api.py (100%) rename {api => allensdk/api}/queries/reference_space_api.py (100%) rename {api => allensdk/api}/queries/rma_api.py (100%) rename {api => allensdk/api}/queries/rma_pager.py (100%) rename {api => allensdk/api}/queries/rma_template.py (100%) rename {api => allensdk/api}/queries/svg_api.py (100%) rename {api => allensdk/api}/queries/synchronization_api.py (100%) rename {api => allensdk/api}/queries/tree_search_api.py (100%) rename {api => allensdk/api}/warehouse_cache/__init__.py (100%) rename {api => allensdk/api}/warehouse_cache/cache.py (100%) rename {api => allensdk/api}/warehouse_cache/caching_utilities.py (100%) rename {brain_observatory => allensdk/brain_observatory}/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/argschema_utilities.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_ophys_analysis.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_ophys_experiment.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_ophys_session.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/behavior_project_cache.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/external/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/project_apis/abcs/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/project_apis/data_io/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/experiments_table.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/ophys_mixin.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/ophys_sessions_table.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/project_table.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/sessions_table.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/util/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/util/experiments_table_utils.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/behavior_session.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/criteria.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/_data_file_abc.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/avg_projection_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/demix_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/dff_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/event_detection_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/eye_tracking_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/max_projection_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/rigid_motion_transform_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/stimulus_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_files/sync_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/base/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/base/_data_object_abc.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/base/readable_interfaces.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/base/writable_interfaces.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/cell_specimens/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/cell_specimens/cell_specimens.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/cell_specimens/events.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/cell_specimens/rois_mixin.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/cell_specimens/traces/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/cell_specimens/traces/dff_traces.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/eye_tracking/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/eye_tracking/eye_tracking_table.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/eye_tracking/rig_geometry.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/licks.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/equipment.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/foraging_id.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/session_type.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/behavior_ophys_metadata.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/age.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/driver_line.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/full_genotype.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/mouse_id.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/reporter_line.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/sex.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/metadata/subject_metadata/subject_metadata.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/motion_correction.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/projections.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/rewards.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/running_speed/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/running_speed/running_acquisition.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/running_speed/running_processing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/running_speed/running_speed.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/stimuli/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/stimuli/presentations.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/stimuli/stimuli.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/stimuli/stimulus_templates.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/stimuli/templates.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/stimuli/util.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/task_parameters.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/timestamps/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/timestamps/ophys_timestamps.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/timestamps/util.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/trials/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/trials/trial.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/data_objects/trials/trial_table.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/dprime.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/event_detection.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/eye_tracking_processing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/image_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/mtrain.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/ophys_experiment.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/ophys_session.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/rewards_processing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/session_metrics.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/stimulus_processing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/analysis_tools.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/behavior_project_cache.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/create_multi_session_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/run_multi_session_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/run_save_extended_stimulus_presentations_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/run_save_flash_response_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/run_save_trial_response_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/run_summary_figures.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/save_extended_stimulus_presentations_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/save_flash_response_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/save_trial_response_df.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/summary_figures.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/swdb/utilities.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/sync/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/sync/process_sync.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/trial_masks.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/trials_processing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_behavior_nwb/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_behavior_nwb/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_behavior_nwb/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/event_detection/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/event_detection/extension_builder.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/stimulus_template/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/stimulus_template/extension_builder.py (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py (100%) rename {brain_observatory => allensdk/brain_observatory}/brain_observatory_exceptions.py (100%) rename {brain_observatory => allensdk/brain_observatory}/brain_observatory_plotting.py (100%) rename {brain_observatory => allensdk/brain_observatory}/chisquare_categorical.py (100%) rename {brain_observatory => allensdk/brain_observatory}/circle_plots.py (100%) rename {brain_observatory => allensdk/brain_observatory}/comparison_utils.py (100%) rename {brain_observatory => allensdk/brain_observatory}/demixer.py (100%) rename {brain_observatory => allensdk/brain_observatory}/dff.py (100%) rename {brain_observatory => allensdk/brain_observatory}/drifting_gratings.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/align_timestamps/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/align_timestamps/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/align_timestamps/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/align_timestamps/barcode.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/align_timestamps/barcode_sync_dataset.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/align_timestamps/channel_states.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/align_timestamps/probe_synchronizer.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/copy_utility/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/copy_utility/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/copy_utility/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/current_source_density/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/current_source_density/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/current_source_density/_current_source_density.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/current_source_density/_filter_utils.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/current_source_density/_interpolation_utils.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/current_source_density/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/ecephys_project_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/ecephys_project_fixed_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/ecephys_project_lims_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/http_engine.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/rma_engine.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_api/utilities.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_project_cache.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_session.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_session_api/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_session_api/ecephys_nwb_session_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/ecephys_session_api/ecephys_session_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/file_io/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/file_io/continuous_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/file_io/ecephys_sync_dataset.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/file_io/stim_file.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/lfp_subsampling/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/lfp_subsampling/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/lfp_subsampling/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/lfp_subsampling/subsampling.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/nwb/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/nwb/ecephys_nwb_extension_builder.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/nwb/ndx-aibs-ecephys.extension.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/optotagging_table/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/optotagging_table/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/optotagging_table/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/dot_motion.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/drifting_gratings.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/flashes.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/natural_movies.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/natural_scenes.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/receptive_field_mapping.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/static_gratings.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_analysis/stimulus_analysis.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_sync.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/ephys_pre_spikes.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/naming_utilities.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/output_validation.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/stimulus_parameter_extraction.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/visualization/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/stimulus_table/visualization/view_blocks.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/visualization/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/write_nwb/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/write_nwb/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ecephys/write_nwb/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/extract_running_speed/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/extract_running_speed/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/extract_running_speed/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/eye_tracking/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/eye_tracking/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/eye_tracking/build.py (100%) rename {brain_observatory => allensdk/brain_observatory}/eye_tracking/stage_1/DLC_Eye_Tracking.py (100%) rename {brain_observatory => allensdk/brain_observatory}/eye_tracking/stage_2/DLC_Ellipse_Fitting.py (100%) rename {brain_observatory => allensdk/brain_observatory}/eye_tracking/stage_3/DLC_Labeled_Video.py (100%) rename {brain_observatory => allensdk/brain_observatory}/eye_tracking/stage_4/DLC_Ellipse_Video.py (100%) rename {brain_observatory => allensdk/brain_observatory}/findlevel.py (100%) rename {brain_observatory => allensdk/brain_observatory}/gaze_mapping/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/gaze_mapping/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/gaze_mapping/_filter_utils.py (100%) rename {brain_observatory => allensdk/brain_observatory}/gaze_mapping/_gaze_mapper.py (100%) rename {brain_observatory => allensdk/brain_observatory}/gaze_mapping/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/locally_sparse_noise.py (100%) rename {brain_observatory => allensdk/brain_observatory}/natural_movie.py (100%) rename {brain_observatory => allensdk/brain_observatory}/natural_scenes.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/behavior_ophys_nwb_extension_builder.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/eye_tracking/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/eye_tracking/extension_builder.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/eye_tracking/ndx_ellipse_eye_tracking.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/metadata.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/ndx-aibs-behavior-ophys.extension.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/ndx-aibs-behavior-ophys.namespace.yaml (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/nwb_api.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/nwb_utils.py (100%) rename {brain_observatory => allensdk/brain_observatory}/nwb/schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/observatory_plots.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ophys/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ophys/trace_extraction/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ophys/trace_extraction/__main__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/ophys/trace_extraction/_schemas.py (100%) rename {brain_observatory => allensdk/brain_observatory}/r_neuropil.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/chisquarerf.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/eventdetection.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/fit_parameters.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/fitgaussian2D.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/postprocessing.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/receptive_field.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/tools.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/utilities.py (100%) rename {brain_observatory => allensdk/brain_observatory}/receptive_field_analysis/visualization.py (100%) rename {brain_observatory => allensdk/brain_observatory}/roi_masks.py (100%) rename {brain_observatory => allensdk/brain_observatory}/running_speed.py (100%) rename {brain_observatory => allensdk/brain_observatory}/session_analysis.py (100%) rename {brain_observatory => allensdk/brain_observatory}/session_api_utils.py (100%) rename {brain_observatory => allensdk/brain_observatory}/static_gratings.py (100%) rename {brain_observatory => allensdk/brain_observatory}/stimulus_analysis.py (100%) rename {brain_observatory => allensdk/brain_observatory}/stimulus_info.py (100%) rename {brain_observatory => allensdk/brain_observatory}/sync_dataset.py (100%) rename {brain_observatory => allensdk/brain_observatory}/sync_utilities/__init__.py (100%) rename {brain_observatory => allensdk/brain_observatory}/visualization/__init__.py (100%) rename {config => allensdk/config}/__init__.py (100%) rename {config => allensdk/config}/app/__init__.py (100%) rename {config => allensdk/config}/app/application_config.py (100%) rename {config => allensdk/config}/app/logging.conf (100%) rename {config => allensdk/config}/manifest.py (100%) rename {config => allensdk/config}/manifest_builder.py (100%) rename {config => allensdk/config}/model/__init__.py (100%) rename {config => allensdk/config}/model/description.py (100%) rename {config => allensdk/config}/model/description_parser.py (100%) rename {config => allensdk/config}/model/formats/__init__.py (100%) rename {config => allensdk/config}/model/formats/hdf5_util.py (100%) rename {config => allensdk/config}/model/formats/json_description_parser.py (100%) rename {config => allensdk/config}/model/formats/pycfg_description_parser.py (100%) rename {core => allensdk/core}/__init__.py (100%) rename {core => allensdk/core}/auth_config.py (100%) rename {core => allensdk/core}/authentication.py (100%) rename {core => allensdk/core}/brain_observatory_cache.py (100%) rename {core => allensdk/core}/brain_observatory_nwb_data_set.py (100%) rename {core => allensdk/core}/cache_method_utilities.py (100%) rename {core => allensdk/core}/cell_types_cache.py (100%) rename {core => allensdk/core}/dat_utilities.py (100%) rename {core => allensdk/core}/exceptions.py (100%) rename {core => allensdk/core}/h5_utilities.py (100%) rename {core => allensdk/core}/json_utilities.py (100%) rename {core => allensdk/core}/lazy_property/__init__.py (100%) rename {core => allensdk/core}/lazy_property/lazy_property.py (100%) rename {core => allensdk/core}/lazy_property/lazy_property_mixin.py (100%) rename {core => allensdk/core}/mouse_connectivity_cache.py (100%) rename {core => allensdk/core}/nwb_data_set.py (100%) rename {core => allensdk/core}/obj_utilities.py (100%) rename {core => allensdk/core}/ontology.py (100%) rename {core => allensdk/core}/ophys_experiment_session_id_mapping.py (100%) rename {core => allensdk/core}/reference_space.py (100%) rename {core => allensdk/core}/reference_space_cache.py (100%) rename {core => allensdk/core}/simple_tree.py (100%) rename {core => allensdk/core}/sitk_utilities.py (100%) rename {core => allensdk/core}/structure_tree.py (100%) rename {core => allensdk/core}/swc.py (100%) rename {core => allensdk/core}/typing.py (100%) rename deprecated.py => allensdk/deprecated.py (100%) rename {ephys => allensdk/ephys}/__init__.py (100%) rename {ephys => allensdk/ephys}/ephys_extractor.py (100%) rename {ephys => allensdk/ephys}/ephys_features.py (100%) rename {ephys => allensdk/ephys}/extract_cell_features.py (100%) rename {ephys => allensdk/ephys}/feature_extractor.py (100%) rename {internal => allensdk/internal}/__init__.py (100%) rename {internal => allensdk/internal}/api/__init__.py (100%) rename {internal => allensdk/internal}/api/api_prerelease.py (100%) rename {internal => allensdk/internal}/api/lims_api.py (100%) rename {internal => allensdk/internal}/api/mtrain_api.py (100%) rename {internal => allensdk/internal}/api/queries/__init__.py (100%) rename {internal => allensdk/internal}/api/queries/biophysical_module_api.py (100%) rename {internal => allensdk/internal}/api/queries/biophysical_module_reader.py (100%) rename {internal => allensdk/internal}/api/queries/grid_data_api_prerelease.py (100%) rename {internal => allensdk/internal}/api/queries/mouse_connectivity_api_prerelease.py (100%) rename {internal => allensdk/internal}/api/queries/optimize_config_reader.py (100%) rename {internal => allensdk/internal}/api/queries/pre_release.py (100%) rename {internal => allensdk/internal}/brain_observatory/__init__.py (100%) rename {internal => allensdk/internal}/brain_observatory/annotated_region_metrics.py (100%) rename {internal => allensdk/internal}/brain_observatory/demix_report.py (100%) rename {internal => allensdk/internal}/brain_observatory/demixer.py (100%) rename {internal => allensdk/internal}/brain_observatory/eye_calibration.py (100%) rename {internal => allensdk/internal}/brain_observatory/fit_ellipse.py (100%) rename {internal => allensdk/internal}/brain_observatory/frame_stream.py (100%) rename {internal => allensdk/internal}/brain_observatory/itracker.py (100%) rename {internal => allensdk/internal}/brain_observatory/itracker_utils.py (100%) rename {internal => allensdk/internal}/brain_observatory/mask_set.py (100%) rename {internal => allensdk/internal}/brain_observatory/ophys_session_decomposition.py (100%) rename {internal => allensdk/internal}/brain_observatory/resources/__init__.py (100%) rename {internal => allensdk/internal}/brain_observatory/resources/roi_filter_training_criteria.json (100%) rename {internal => allensdk/internal}/brain_observatory/roi_filter.py (100%) rename {internal => allensdk/internal}/brain_observatory/roi_filter_utils.py (100%) rename {internal => allensdk/internal}/brain_observatory/run_itracker.py (100%) rename {internal => allensdk/internal}/brain_observatory/time_sync.py (100%) rename {internal => allensdk/internal}/core/__init__.py (100%) rename {internal => allensdk/internal}/core/lims_pipeline_module.py (100%) rename {internal => allensdk/internal}/core/lims_utilities.py (100%) rename {internal => allensdk/internal}/core/mouse_connectivity_cache_prerelease.py (100%) rename {internal => allensdk/internal}/core/simpletree.py (100%) rename {internal => allensdk/internal}/core/swc.py (100%) rename {internal => allensdk/internal}/ephys/__init__.py (100%) rename {internal => allensdk/internal}/ephys/core_feature_extract.py (100%) rename {internal => allensdk/internal}/ephys/plot_qc_figures.py (100%) rename {internal => allensdk/internal}/ephys/plot_qc_figures3.py (100%) rename {internal => allensdk/internal}/model/AIC.py (100%) rename {internal => allensdk/internal}/model/GLM.py (100%) rename {internal => allensdk/internal}/model/__init__.py (100%) rename {internal => allensdk/internal}/model/biophysical/__init__.py (100%) rename {internal => allensdk/internal}/model/biophysical/biophysical_archiver.py (100%) rename {internal => allensdk/internal}/model/biophysical/check_fi_shift.py (100%) rename {internal => allensdk/internal}/model/biophysical/deap_utils.py (100%) rename {internal => allensdk/internal}/model/biophysical/ephys_utils.py (100%) rename {internal => allensdk/internal}/model/biophysical/fit_stage_1.py (100%) rename {internal => allensdk/internal}/model/biophysical/fit_stage_2.py (100%) rename {internal => allensdk/internal}/model/biophysical/fits/__init__.py (100%) rename {internal => allensdk/internal}/model/biophysical/fits/config_base.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/__init__.py (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f12_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f13_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f6_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f9_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json (100%) rename {internal => allensdk/internal}/model/biophysical/make_deap_fit_json.py (100%) rename {internal => allensdk/internal}/model/biophysical/neuron_parallel.py (100%) rename {internal => allensdk/internal}/model/biophysical/optimize.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/__init__.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/neuron_passive_fit.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/neuron_passive_fit2.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/neuron_passive_fit_elec.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/neuron_utils.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/output_grabber.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/passive/__init__.py (100%) rename {internal => allensdk/internal}/model/biophysical/passive_fitting/preprocess.py (100%) rename {internal => allensdk/internal}/model/biophysical/run_optimize.py (100%) rename {internal => allensdk/internal}/model/biophysical/run_optimize_workflow.py (100%) rename {internal => allensdk/internal}/model/biophysical/run_passive_fit.py (100%) rename {internal => allensdk/internal}/model/biophysical/run_simulate_lims.py (100%) rename {internal => allensdk/internal}/model/biophysical/run_simulate_workflow.py (100%) rename {internal => allensdk/internal}/model/data_access.py (100%) rename {internal => allensdk/internal}/model/glif/ASGLM.py (100%) rename {internal => allensdk/internal}/model/glif/MLIN.py (100%) rename {internal => allensdk/internal}/model/glif/__init__.py (100%) rename {internal => allensdk/internal}/model/glif/are_two_lists_of_arrays_the_same.py (100%) rename {internal => allensdk/internal}/model/glif/configure_model.py (100%) rename {internal => allensdk/internal}/model/glif/error_functions.py (100%) rename {internal => allensdk/internal}/model/glif/find_spikes.py (100%) rename {internal => allensdk/internal}/model/glif/find_sweeps.py (100%) rename {internal => allensdk/internal}/model/glif/glif_experiment.py (100%) rename {internal => allensdk/internal}/model/glif/glif_optimizer.py (100%) rename {internal => allensdk/internal}/model/glif/glif_optimizer_neuron.py (100%) rename {internal => allensdk/internal}/model/glif/optimize_neuron.py (100%) rename {internal => allensdk/internal}/model/glif/plotting.py (100%) rename {internal => allensdk/internal}/model/glif/preprocess_neuron.py (100%) rename {internal => allensdk/internal}/model/glif/rc.py (100%) rename {internal => allensdk/internal}/model/glif/spike_cutting.py (100%) rename {internal => allensdk/internal}/model/glif/threshold_adaptation.py (100%) rename {internal => allensdk/internal}/morphology/__init__.py (100%) rename {internal => allensdk/internal}/morphology/compartment.py (100%) rename {internal => allensdk/internal}/morphology/morphology.py (100%) rename {internal => allensdk/internal}/morphology/morphvis.py (100%) rename {internal => allensdk/internal}/morphology/node.py (100%) rename {internal => allensdk/internal}/morphology/validate_swc.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/__init__.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/__init__.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/cav_unionize.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/cav_unionizer.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/data_utilities.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/interval_unionizer.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/interval_unionize/unionize_record.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/projection_thumbnail/__init__.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/projection_thumbnail/generate_projection_strip.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/projection_thumbnail/image_sheet.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/projection_thumbnail/projection_functions.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/projection_thumbnail/visualization_utilities.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/projection_thumbnail/volume_projector.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/projection_thumbnail/volume_utilities.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/tissuecyte_stitching/__init__.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/tissuecyte_stitching/stitcher.py (100%) rename {internal => allensdk/internal}/mouse_connectivity/tissuecyte_stitching/tile.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/qc.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/qc_support.py (100%) rename {internal => allensdk/internal}/pipeline_modules/IVSCC/ephys_nwb/resource_file.py (100%) rename {internal => allensdk/internal}/pipeline_modules/__init__.py (100%) rename {internal => allensdk/internal}/pipeline_modules/cell_types/morphology/calculate_features.py (100%) rename {internal => allensdk/internal}/pipeline_modules/cell_types/morphology/cortical_layers.py (100%) rename {internal => allensdk/internal}/pipeline_modules/cell_types/morphology/surrogate_strategy.py (100%) rename {internal => allensdk/internal}/pipeline_modules/cell_types/morphology/upright_transform.py (100%) rename {internal => allensdk/internal}/pipeline_modules/gbm/__init__.py (100%) rename {internal => allensdk/internal}/pipeline_modules/gbm/generate_gbm_analysis_run_records.py (100%) rename {internal => allensdk/internal}/pipeline_modules/gbm/generate_gbm_heatmap.py (100%) rename {internal => allensdk/internal}/pipeline_modules/gbm/generate_gbm_sample_metadata.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_annotated_region_metrics.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_demixing.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_dff_computation.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_eye_tracking.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_neuropil_correction.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_observatory_analysis.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_observatory_container_thumbnails.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_observatory_thumbnails.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_ophys_eye_calibration.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_ophys_session_decomposition.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_ophys_time_sync.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_roi_filter.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_tissuecyte_stitching_classic.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py (100%) rename {internal => allensdk/internal}/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py (100%) rename {model => allensdk/model}/__init__.py (100%) rename {model => allensdk/model}/biophys_sim/__init__.py (100%) rename {model => allensdk/model}/biophys_sim/bps_command.py (100%) rename {model => allensdk/model}/biophys_sim/config.py (100%) rename {model => allensdk/model}/biophys_sim/logging.conf (100%) rename {model => allensdk/model}/biophys_sim/manifest_default.json (100%) rename {model => allensdk/model}/biophys_sim/neuron/__init__.py (100%) rename {model => allensdk/model}/biophys_sim/neuron/hoc_utils.py (100%) rename {model => allensdk/model}/biophys_sim/scripts/__init__.py (100%) rename {model => allensdk/model}/biophys_sim/scripts/bps (100%) rename {model => allensdk/model}/biophysical/__init__.py (100%) rename {model => allensdk/model}/biophysical/logging.conf (100%) rename {model => allensdk/model}/biophysical/run_simulate.py (100%) rename {model => allensdk/model}/biophysical/runner.py (100%) rename {model => allensdk/model}/biophysical/utils.py (100%) rename {model => allensdk/model}/glif/__init__.py (100%) rename {model => allensdk/model}/glif/glif_neuron.py (100%) rename {model => allensdk/model}/glif/glif_neuron_methods.py (100%) rename {model => allensdk/model}/glif/simulate_neuron.py (100%) rename {morphology => allensdk/morphology}/__init__.py (100%) rename {morphology => allensdk/morphology}/validate_swc.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/__init__.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/__init__.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/__main__.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/_schemas.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/image_series_gridder.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/subimage/__init__.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/subimage/base_subimage.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/subimage/cav_subimage.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/subimage/classic_subimage.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/subimage/count_subimage.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/utilities/__init__.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/utilities/downsampling_utilities.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/utilities/image_utilities.py (100%) rename {mouse_connectivity => allensdk/mouse_connectivity}/grid/writers/__init__.py (100%) rename {test => allensdk/test}/api/__init__.py (100%) rename {test => allensdk/test}/api/cloud_cache/__init__.py (100%) rename {test => allensdk/test}/api/cloud_cache/conftest.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_cache.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_change_log.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_file_attributes.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_full_process.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_local_cache.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_manifest.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_smart_download.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_static_local_cache.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_utils.py (100%) rename {test => allensdk/test}/api/cloud_cache/test_windows_isilon_paths.py (100%) rename {test => allensdk/test}/api/cloud_cache/utils.py (100%) rename {test => allensdk/test}/api/response_test_data/472451419_response.json (100%) rename {test => allensdk/test}/api/test_annotated_section_data_set_api.py (100%) rename {test => allensdk/test}/api/test_api.py (100%) rename {test => allensdk/test}/api/test_biophysical_api.py (100%) rename {test => allensdk/test}/api/test_brain_observatory_api.py (100%) rename {test => allensdk/test}/api/test_cache.py (100%) rename {test => allensdk/test}/api/test_cacheable.py (100%) rename {test => allensdk/test}/api/test_caching_utilities.py (100%) rename {test => allensdk/test}/api/test_cell_types_api.py (100%) rename {test => allensdk/test}/api/test_file_download.py (100%) rename {test => allensdk/test}/api/test_glif_api.py (100%) rename {test => allensdk/test}/api/test_grid_data_api.py (100%) rename {test => allensdk/test}/api/test_image_download_api.py (100%) rename {test => allensdk/test}/api/test_mouse_atlas_api.py (100%) rename {test => allensdk/test}/api/test_mouse_connectivity_api.py (100%) rename {test => allensdk/test}/api/test_ontologies_api.py (100%) rename {test => allensdk/test}/api/test_pager.py (100%) rename {test => allensdk/test}/api/test_reference_space_api.py (100%) rename {test => allensdk/test}/api/test_rma_template.py (100%) rename {test => allensdk/test}/api/test_svg_api.py (100%) rename {test => allensdk/test}/api/test_synchronization_api.py (100%) rename {test => allensdk/test}/api/test_tree_search_api.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache/test_from_s3.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache/utils.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_files/test_stimulus_file.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_files/test_sync_file.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/base/test_data_object.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/lims_util.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/nwb_input_json.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_cell_specimens.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_data/task_parameters.json (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_data/test_input.json (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_licks.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_motion_correction.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_ophys_timestamps.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_projections.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_rewards.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_stimuli.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_task_parameters.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/data_objects/test_trial_table.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_behavior_metadata_legacy.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_behavior_ophys_experiment.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_behavior_session.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_criteria.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_dprime.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_event_detection.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_eye_tracking_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_mtrain_annotate.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_prior_exposure_count_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_rewards_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_session_metrics.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_stimulus_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_sync_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_trial_masks.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_trials_processing.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_write_behavior_nwb.py (100%) rename {test => allensdk/test}/brain_observatory/behavior/test_write_nwb_behavior_ophys.py (100%) rename {test => allensdk/test}/brain_observatory/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/align_timestamps/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/align_timestamps/test_barcode.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/align_timestamps/test_channel_states.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_flashes.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_table/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_copy_utility.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_current_source_density.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_ecephys_project_cache.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_ecephys_project_fixed_api.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_ecephys_project_lims_api.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_ecephys_session.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_ecephys_session_nwb_api.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_ecephys_sync_dataset.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_http_engine.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_lfp_subsampling.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_rma_engine.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_stim_file.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_stimulus_sync.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_visualization.py (100%) rename {test => allensdk/test}/brain_observatory/ecephys/test_write_nwb.py (100%) rename {test => allensdk/test}/brain_observatory/extract_running_speed/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/extract_running_speed/test_extract_running_speed_module.py (100%) rename {test => allensdk/test}/brain_observatory/gaze_mapping/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/gaze_mapping/test_gaze_mapping.py (100%) rename {test => allensdk/test}/brain_observatory/gaze_mapping/test_main.py (100%) rename {test => allensdk/test}/brain_observatory/nwb/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/nwb/conftest.py (100%) rename {test => allensdk/test}/brain_observatory/nwb/test_nwb.py (100%) rename {test => allensdk/test}/brain_observatory/nwb/test_nwb_api.py (100%) rename {test => allensdk/test}/brain_observatory/nwb/test_nwb_utils.py (100%) rename {test => allensdk/test}/brain_observatory/receptive_field_analysis/test_chisquarerf.py (100%) rename {test => allensdk/test}/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py (100%) rename {test => allensdk/test}/brain_observatory/sync_utilities/__init__.py (100%) rename {test => allensdk/test}/brain_observatory/sync_utilities/test_sync_utilities.py (100%) rename {test => allensdk/test}/brain_observatory/test_circle_plots.py (100%) rename {test => allensdk/test}/brain_observatory/test_demixer.py (100%) rename {test => allensdk/test}/brain_observatory/test_dff.py (100%) rename {test => allensdk/test}/brain_observatory/test_drifting_gratings.py (100%) rename {test => allensdk/test}/brain_observatory/test_locally_sparse_noise.py (100%) rename {test => allensdk/test}/brain_observatory/test_natural_movie.py (100%) rename {test => allensdk/test}/brain_observatory/test_natural_scenes.py (100%) rename {test => allensdk/test}/brain_observatory/test_notebook.py (100%) rename {test => allensdk/test}/brain_observatory/test_observatory_plots.py (100%) rename {test => allensdk/test}/brain_observatory/test_observatory_plots_data.json (100%) rename {test => allensdk/test}/brain_observatory/test_roi_masks.py (100%) rename {test => allensdk/test}/brain_observatory/test_session_analysis.py (100%) rename {test => allensdk/test}/brain_observatory/test_session_analysis_regression.py (100%) rename {test => allensdk/test}/brain_observatory/test_session_analysis_regression_data.json (100%) rename {test => allensdk/test}/brain_observatory/test_session_analysis_regression_data_list.json (100%) rename {test => allensdk/test}/brain_observatory/test_session_api_utils.py (100%) rename {test => allensdk/test}/brain_observatory/test_static_gratings.py (100%) rename {test => allensdk/test}/brain_observatory/test_stimulus_analysis.py (100%) rename {test => allensdk/test}/brain_observatory/test_stimulus_info.py (100%) rename {test => allensdk/test}/config/test_config_single_file_json.py (100%) rename {test => allensdk/test}/config/test_json_comments.py (100%) rename {test => allensdk/test}/config/test_manifest.py (100%) rename {test => allensdk/test}/config/test_multi_file_config.py (100%) rename {test => allensdk/test}/config/test_pyconfig_parser.py (100%) rename {test => allensdk/test}/core/nwb_ephys_files.txt (100%) rename {test => allensdk/test}/core/nwb_files.txt (100%) rename {test => allensdk/test}/core/test_authentication.py (100%) rename {test => allensdk/test}/core/test_brain_observatory_cache.py (100%) rename {test => allensdk/test}/core/test_brain_observatory_nwb_data_set.py (100%) rename {test => allensdk/test}/core/test_cell_filters.py (100%) rename {test => allensdk/test}/core/test_cell_types_cache_unit.py (100%) rename {test => allensdk/test}/core/test_h5_utilities.py (100%) rename {test => allensdk/test}/core/test_json_utilities.py (100%) rename {test => allensdk/test}/core/test_lazy_property.py (100%) rename {test => allensdk/test}/core/test_mouse_connectivity_cache.py (100%) rename {test => allensdk/test}/core/test_mouse_connectivity_notebook.py (100%) rename {test => allensdk/test}/core/test_nwb_data_set.py (100%) rename {test => allensdk/test}/core/test_obj_utilities.py (100%) rename {test => allensdk/test}/core/test_reference_space.py (100%) rename {test => allensdk/test}/core/test_reference_space_cache.py (100%) rename {test => allensdk/test}/core/test_reference_space_notebook.py (100%) rename {test => allensdk/test}/core/test_simple_tree.py (100%) rename {test => allensdk/test}/core/test_sitk_utilities.py (100%) rename {test => allensdk/test}/core/test_structure_tree.py (100%) rename {test => allensdk/test}/ephys/data/spike_test_high_init_dvdt.txt (100%) rename {test => allensdk/test}/ephys/data/spike_test_pair.txt (100%) rename {test => allensdk/test}/ephys/data/spike_test_var_dt.txt (100%) rename {test => allensdk/test}/ephys/test_extractor.py (100%) rename {test => allensdk/test}/ephys/test_features.py (100%) rename {test => allensdk/test}/glif_tests.py (100%) rename {test => allensdk/test}/internal/api/test_api_prerelease.py (100%) rename {test => allensdk/test}/internal/api/test_grid_data_api_prerelease.py (100%) rename {test => allensdk/test}/internal/api/test_mouse_connectivity_api_prerelease.py (100%) rename {test => allensdk/test}/internal/api/test_pre_release.py (100%) rename {test => allensdk/test}/internal/biophysical/conftest.py (100%) rename {test => allensdk/test}/internal/biophysical/test_ephys_utils.py (100%) rename {test => allensdk/test}/internal/biophysical/test_optimize_run.py (100%) rename {test => allensdk/test}/internal/biophysical/test_simulate_run.py (100%) rename {test => allensdk/test}/internal/brain_observatory/test_roi_filter_utils.py (100%) rename {test => allensdk/test}/internal/brain_observatory/test_run_ophys_time_sync.py (100%) rename {test => allensdk/test}/internal/brain_observatory/test_time_sync.py (100%) rename {test => allensdk/test}/internal/brain_observatory/time_sync_test_data.json (100%) rename {test => allensdk/test}/internal/conftest.py (100%) rename {test => allensdk/test}/internal/core/test_mouse_connectivity_cache_prerelease.py (100%) rename {test => allensdk/test}/internal/gbm/test_generate_gbm_heatmap.py (100%) rename {test => allensdk/test}/internal/morphology/test_apply_affine.py (100%) rename {test => allensdk/test}/internal/mouse_connectivity/test_interval_unionizer.py (100%) rename {test => allensdk/test}/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py (100%) rename {test => allensdk/test}/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py (100%) rename {test => allensdk/test}/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py (100%) rename {test => allensdk/test}/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py (100%) rename {test => allensdk/test}/internal/mouse_connectivity/test_tissuecyte_unionize_record.py (100%) rename {test => allensdk/test}/internal/mouse_connectivity/test_unionize_record.py (100%) rename {test => allensdk/test}/internal/test_annotated_region_metrics.py (100%) rename {test => allensdk/test}/internal/test_biophysical_modules.py (100%) rename {test => allensdk/test}/internal/test_core_feature_extract.py (100%) rename {test => allensdk/test}/internal/test_eye_calibration.py (100%) rename {test => allensdk/test}/internal/test_internal.py (100%) rename {test => allensdk/test}/internal/test_mtrain_api.py (100%) rename {test => allensdk/test}/internal/test_optimize_config_reader.py (100%) rename {test => allensdk/test}/internal/test_optimize_manifest.py (100%) rename {test => allensdk/test}/internal/test_roi_filter.py (100%) rename {test => allensdk/test}/internal/test_simulate_manifest.py (100%) rename {test => allensdk/test}/internal/test_simulate_update_output.py (100%) rename {test => allensdk/test}/internal/tissuecyte_stitching/test_stitcher.py (100%) rename {test => allensdk/test}/internal/tissuecyte_stitching/test_tile.py (100%) rename {test => allensdk/test}/model/aa_model/468193142_fit.json (100%) rename {test => allensdk/test}/model/aa_model/manifest.json (100%) rename {test => allensdk/test}/model/aa_model/test_biophysical_all_active.py (100%) rename {test => allensdk/test}/model/check_parser.py (100%) rename {test => allensdk/test}/model/peri_model/468193142_fit.json (100%) rename {test => allensdk/test}/model/peri_model/manifest.json (100%) rename {test => allensdk/test}/model/peri_model/test_biophysical_peri.py (100%) rename {test => allensdk/test}/model/test_biophysical_perisomatic.py (100%) rename {test => allensdk/test}/model/test_glif.py (100%) rename {test => allensdk/test}/model/test_runner.py (100%) rename {test => allensdk/test}/mouse_connectivity/__init__.py (100%) rename {test => allensdk/test}/mouse_connectivity/grid/__init__.py (100%) rename {test => allensdk/test}/mouse_connectivity/grid/test_base_subimage.py (100%) rename {test => allensdk/test}/mouse_connectivity/grid/test_cav_subimage.py (100%) rename {test => allensdk/test}/mouse_connectivity/grid/test_classic_subimage.py (100%) rename {test => allensdk/test}/mouse_connectivity/grid/test_image_series_gridder.py (100%) rename {test => allensdk/test}/mouse_connectivity/grid/test_image_utilities.py (100%) rename {test => allensdk/test}/test_argschema_utilities.py (100%) rename {test => allensdk/test}/test_deprecated.py (100%) rename {test => allensdk/test}/test_inline_examples.py (100%) rename {test => allensdk/test}/test_temp_dir.py (100%) rename {test_utilities => allensdk/test_utilities}/__init__.py (100%) rename {test_utilities => allensdk/test_utilities}/custom_comparators.py (100%) rename {test_utilities => allensdk/test_utilities}/regression_fixture.py (100%) rename {test_utilities => allensdk/test_utilities}/temp_dir.py (100%) delete mode 100644 api/__pycache__/__init__.cpython-37.pyc delete mode 100644 api/__pycache__/api.cpython-37.pyc delete mode 100644 api/cloud_cache/__pycache__/__init__.cpython-37.pyc delete mode 100644 api/cloud_cache/__pycache__/cloud_cache.cpython-37.pyc delete mode 100644 api/cloud_cache/__pycache__/file_attributes.cpython-37.pyc delete mode 100644 api/cloud_cache/__pycache__/manifest.cpython-37.pyc delete mode 100644 api/cloud_cache/__pycache__/utils.cpython-37.pyc delete mode 100644 api/queries/__pycache__/__init__.cpython-37.pyc delete mode 100644 api/queries/__pycache__/annotated_section_data_sets_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/biophysical_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/brain_observatory_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/cell_types_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/connected_services.cpython-37.pyc delete mode 100644 api/queries/__pycache__/glif_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/grid_data_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/image_download_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/mouse_atlas_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/mouse_connectivity_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/ontologies_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/reference_space_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/rma_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/rma_pager.cpython-37.pyc delete mode 100644 api/queries/__pycache__/rma_template.cpython-37.pyc delete mode 100644 api/queries/__pycache__/svg_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/synchronization_api.cpython-37.pyc delete mode 100644 api/queries/__pycache__/tree_search_api.cpython-37.pyc delete mode 100644 api/warehouse_cache/__pycache__/__init__.cpython-37.pyc delete mode 100644 api/warehouse_cache/__pycache__/cache.cpython-37.pyc delete mode 100644 api/warehouse_cache/__pycache__/caching_utilities.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/argschema_utilities.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/brain_observatory_exceptions.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/brain_observatory_plotting.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/chisquare_categorical.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/circle_plots.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/comparison_utils.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/demixer.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/dff.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/drifting_gratings.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/findlevel.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/locally_sparse_noise.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/natural_movie.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/natural_scenes.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/observatory_plots.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/r_neuropil.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/roi_masks.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/running_speed.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/session_analysis.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/session_api_utils.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/static_gratings.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/stimulus_analysis.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/stimulus_info.cpython-37.pyc delete mode 100644 brain_observatory/__pycache__/sync_dataset.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/behavior_ophys_analysis.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/behavior_ophys_experiment.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/behavior_ophys_session.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/behavior_session.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/criteria.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/dprime.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/event_detection.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/eye_tracking_processing.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/image_api.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/mtrain.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/rewards_processing.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/schemas.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/session_metrics.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/stimulus_processing.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/trial_masks.cpython-37.pyc delete mode 100644 brain_observatory/behavior/__pycache__/trials_processing.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/__pycache__/behavior_project_cache.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/external/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/external/__pycache__/behavior_project_metadata_writer.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/behavior_project_base.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_cloud_api.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_lims_api.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/experiments_table.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_mixin.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_sessions_table.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/project_table.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/__pycache__/sessions_table.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/experiments_table_utils.cpython-37.pyc delete mode 100644 brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/prior_exposure_processing.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/_data_file_abc.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/avg_projection_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/demix_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/dff_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/event_detection_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/eye_tracking_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/max_projection_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/rigid_motion_transform_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/stimulus_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_files/__pycache__/sync_file.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/__pycache__/licks.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/__pycache__/motion_correction.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/__pycache__/projections.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/__pycache__/rewards.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/__pycache__/task_parameters.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/_data_object_abc.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/readable_interfaces.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/base/__pycache__/writable_interfaces.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/cell_specimens.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/events.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/cell_specimens/__pycache__/rois_mixin.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/corrected_fluorescence_traces.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/dff_traces.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/eye_tracking/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/eye_tracking/__pycache__/eye_tracking_table.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/eye_tracking/__pycache__/rig_geometry.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/__pycache__/behavior_ophys_metadata.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_metadata.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_id.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_uuid.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/date_of_acquisition.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/equipment.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/foraging_id.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/session_type.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/stimulus_frame_rate.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/experiment_container_id.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/field_of_view_shape.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_depth.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_plane.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_experiment_metadata.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_session_id.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/project_code.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/multi_plane_metadata.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/age.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/driver_line.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/full_genotype.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/mouse_id.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/reporter_line.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/sex.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/subject_metadata.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/running_speed/__pycache__/running_speed.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/presentations.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/stimuli.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/stimulus_templates.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/templates.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/stimuli/__pycache__/util.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/timestamps/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/timestamps/__pycache__/ophys_timestamps.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/timestamps/__pycache__/util.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/trials/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/trials/__pycache__/trial.cpython-37.pyc delete mode 100644 brain_observatory/behavior/data_objects/trials/__pycache__/trial_table.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/analysis_tools.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/behavior_project_cache.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/create_multi_session_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/run_multi_session_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/run_save_extended_stimulus_presentations_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/run_save_flash_response_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/run_save_trial_response_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/run_summary_figures.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/save_extended_stimulus_presentations_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/save_flash_response_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/save_trial_response_df.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/summary_figures.cpython-37.pyc delete mode 100644 brain_observatory/behavior/swdb/__pycache__/utilities.cpython-37.pyc delete mode 100644 brain_observatory/behavior/sync/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/sync/__pycache__/process_sync.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_behavior_nwb/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_behavior_nwb/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_behavior_nwb/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/extensions/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/extension_builder.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/ndx_ophys_events.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/extension_builder.cpython-37.pyc delete mode 100644 brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/ndx_stimulus_template.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/__pycache__/ecephys_project_cache.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/__pycache__/ecephys_session.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/__pycache__/stimulus_sync.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/barcode.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/barcode_sync_dataset.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/channel_states.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/align_timestamps/__pycache__/probe_synchronizer.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/copy_utility/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/copy_utility/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/copy_utility/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_current_source_density.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_filter_utils.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_interpolation_utils.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/current_source_density/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_api.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_fixed_api.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_lims_api.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_warehouse_api.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/http_engine.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/rma_engine.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_project_api/__pycache__/utilities.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb1_session_api.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb_session_api.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_session_api.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/file_io/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/file_io/__pycache__/continuous_file.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/file_io/__pycache__/ecephys_sync_dataset.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/file_io/__pycache__/stim_file.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/lfp_subsampling/__pycache__/subsampling.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/nwb/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/nwb/__pycache__/ecephys_nwb_extension_builder.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/optotagging_table/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/optotagging_table/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/optotagging_table/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/dot_motion.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/drifting_gratings.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/flashes.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_movies.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_scenes.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/receptive_field_mapping.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/static_gratings.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_analysis/__pycache__/stimulus_analysis.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/ephys_pre_spikes.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/naming_utilities.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/output_validation.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/__pycache__/stimulus_parameter_extraction.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/visualization/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/stimulus_table/visualization/__pycache__/view_blocks.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/visualization/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/write_nwb/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/write_nwb/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ecephys/write_nwb/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/extract_running_speed/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/extract_running_speed/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/eye_tracking/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/eye_tracking/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/eye_tracking/__pycache__/build.cpython-37.pyc delete mode 100644 brain_observatory/eye_tracking/stage_1/__pycache__/DLC_Eye_Tracking.cpython-37.pyc delete mode 100644 brain_observatory/eye_tracking/stage_2/__pycache__/DLC_Ellipse_Fitting.cpython-37.pyc delete mode 100644 brain_observatory/eye_tracking/stage_3/__pycache__/DLC_Labeled_Video.cpython-37.pyc delete mode 100644 brain_observatory/eye_tracking/stage_4/__pycache__/DLC_Ellipse_Video.cpython-37.pyc delete mode 100644 brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/gaze_mapping/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/gaze_mapping/__pycache__/_filter_utils.cpython-37.pyc delete mode 100644 brain_observatory/gaze_mapping/__pycache__/_gaze_mapper.cpython-37.pyc delete mode 100644 brain_observatory/gaze_mapping/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/nwb/__pycache__/behavior_ophys_nwb_extension_builder.cpython-37.pyc delete mode 100644 brain_observatory/nwb/__pycache__/metadata.cpython-37.pyc delete mode 100644 brain_observatory/nwb/__pycache__/nwb_api.cpython-37.pyc delete mode 100644 brain_observatory/nwb/__pycache__/nwb_utils.cpython-37.pyc delete mode 100644 brain_observatory/nwb/__pycache__/schemas.cpython-37.pyc delete mode 100644 brain_observatory/nwb/eye_tracking/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/nwb/eye_tracking/__pycache__/extension_builder.cpython-37.pyc delete mode 100644 brain_observatory/nwb/eye_tracking/__pycache__/ndx_ellipse_eye_tracking.cpython-37.pyc delete mode 100644 brain_observatory/ophys/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ophys/trace_extraction/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/ophys/trace_extraction/__pycache__/__main__.cpython-37.pyc delete mode 100644 brain_observatory/ophys/trace_extraction/__pycache__/_schemas.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/chisquarerf.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/eventdetection.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/fit_parameters.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/fitgaussian2D.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/postprocessing.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/receptive_field.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/tools.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/utilities.cpython-37.pyc delete mode 100644 brain_observatory/receptive_field_analysis/__pycache__/visualization.cpython-37.pyc delete mode 100644 brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc delete mode 100644 brain_observatory/visualization/__pycache__/__init__.cpython-37.pyc delete mode 100644 config/__pycache__/__init__.cpython-37.pyc delete mode 100644 config/__pycache__/manifest.cpython-37.pyc delete mode 100644 config/__pycache__/manifest_builder.cpython-37.pyc delete mode 100644 config/app/__pycache__/__init__.cpython-37.pyc delete mode 100644 config/app/__pycache__/application_config.cpython-37.pyc delete mode 100644 config/model/__pycache__/__init__.cpython-37.pyc delete mode 100644 config/model/__pycache__/description.cpython-37.pyc delete mode 100644 config/model/__pycache__/description_parser.cpython-37.pyc delete mode 100644 config/model/formats/__pycache__/__init__.cpython-37.pyc delete mode 100644 config/model/formats/__pycache__/hdf5_util.cpython-37.pyc delete mode 100644 config/model/formats/__pycache__/json_description_parser.cpython-37.pyc delete mode 100644 config/model/formats/__pycache__/pycfg_description_parser.cpython-37.pyc delete mode 100644 core/__pycache__/__init__.cpython-37.pyc delete mode 100644 core/__pycache__/auth_config.cpython-37.pyc delete mode 100644 core/__pycache__/authentication.cpython-37.pyc delete mode 100644 core/__pycache__/brain_observatory_cache.cpython-37.pyc delete mode 100644 core/__pycache__/brain_observatory_nwb_data_set.cpython-37.pyc delete mode 100644 core/__pycache__/cache_method_utilities.cpython-37.pyc delete mode 100644 core/__pycache__/cell_types_cache.cpython-37.pyc delete mode 100644 core/__pycache__/dat_utilities.cpython-37.pyc delete mode 100644 core/__pycache__/exceptions.cpython-37.pyc delete mode 100644 core/__pycache__/h5_utilities.cpython-37.pyc delete mode 100644 core/__pycache__/json_utilities.cpython-37.pyc delete mode 100644 core/__pycache__/mouse_connectivity_cache.cpython-37.pyc delete mode 100644 core/__pycache__/nwb_data_set.cpython-37.pyc delete mode 100644 core/__pycache__/obj_utilities.cpython-37.pyc delete mode 100644 core/__pycache__/ontology.cpython-37.pyc delete mode 100644 core/__pycache__/ophys_experiment_session_id_mapping.cpython-37.pyc delete mode 100644 core/__pycache__/reference_space.cpython-37.pyc delete mode 100644 core/__pycache__/reference_space_cache.cpython-37.pyc delete mode 100644 core/__pycache__/simple_tree.cpython-37.pyc delete mode 100644 core/__pycache__/sitk_utilities.cpython-37.pyc delete mode 100644 core/__pycache__/structure_tree.cpython-37.pyc delete mode 100644 core/__pycache__/swc.cpython-37.pyc delete mode 100644 core/__pycache__/typing.cpython-37.pyc delete mode 100644 core/lazy_property/__pycache__/__init__.cpython-37.pyc delete mode 100644 core/lazy_property/__pycache__/lazy_property.cpython-37.pyc delete mode 100644 core/lazy_property/__pycache__/lazy_property_mixin.cpython-37.pyc delete mode 100644 ephys/__pycache__/__init__.cpython-37.pyc delete mode 100644 ephys/__pycache__/ephys_extractor.cpython-37.pyc delete mode 100644 ephys/__pycache__/ephys_features.cpython-37.pyc delete mode 100644 ephys/__pycache__/extract_cell_features.cpython-37.pyc delete mode 100644 ephys/__pycache__/feature_extractor.cpython-37.pyc delete mode 100644 internal/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/api/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/api/__pycache__/api_prerelease.cpython-37.pyc delete mode 100644 internal/api/__pycache__/lims_api.cpython-37.pyc delete mode 100644 internal/api/__pycache__/mtrain_api.cpython-37.pyc delete mode 100644 internal/api/queries/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/api/queries/__pycache__/biophysical_module_api.cpython-37.pyc delete mode 100644 internal/api/queries/__pycache__/biophysical_module_reader.cpython-37.pyc delete mode 100644 internal/api/queries/__pycache__/grid_data_api_prerelease.cpython-37.pyc delete mode 100644 internal/api/queries/__pycache__/mouse_connectivity_api_prerelease.cpython-37.pyc delete mode 100644 internal/api/queries/__pycache__/optimize_config_reader.cpython-37.pyc delete mode 100644 internal/api/queries/__pycache__/pre_release.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/annotated_region_metrics.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/demix_report.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/demixer.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/eye_calibration.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/fit_ellipse.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/frame_stream.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/itracker.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/itracker_utils.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/mask_set.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/ophys_session_decomposition.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/roi_filter.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/roi_filter_utils.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/run_itracker.cpython-37.pyc delete mode 100644 internal/brain_observatory/__pycache__/time_sync.cpython-37.pyc delete mode 100644 internal/brain_observatory/resources/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/core/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/core/__pycache__/lims_pipeline_module.cpython-37.pyc delete mode 100644 internal/core/__pycache__/lims_utilities.cpython-37.pyc delete mode 100644 internal/core/__pycache__/mouse_connectivity_cache_prerelease.cpython-37.pyc delete mode 100644 internal/core/__pycache__/simpletree.cpython-37.pyc delete mode 100644 internal/core/__pycache__/swc.cpython-37.pyc delete mode 100644 internal/ephys/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/ephys/__pycache__/core_feature_extract.cpython-37.pyc delete mode 100644 internal/ephys/__pycache__/plot_qc_figures.cpython-37.pyc delete mode 100644 internal/ephys/__pycache__/plot_qc_figures3.cpython-37.pyc delete mode 100644 internal/model/__pycache__/AIC.cpython-37.pyc delete mode 100644 internal/model/__pycache__/GLM.cpython-37.pyc delete mode 100644 internal/model/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/model/__pycache__/data_access.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/biophysical_archiver.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/check_fi_shift.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/deap_utils.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/ephys_utils.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/fit_stage_1.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/fit_stage_2.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/make_deap_fit_json.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/neuron_parallel.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/optimize.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/run_optimize.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/run_optimize_workflow.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/run_passive_fit.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/run_simulate_lims.cpython-37.pyc delete mode 100644 internal/model/biophysical/__pycache__/run_simulate_workflow.cpython-37.pyc delete mode 100644 internal/model/biophysical/fits/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/model/biophysical/fits/fit_styles/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit2.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit_elec.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/__pycache__/neuron_utils.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/__pycache__/output_grabber.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/__pycache__/preprocess.cpython-37.pyc delete mode 100644 internal/model/biophysical/passive_fitting/passive/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/ASGLM.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/MLIN.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/are_two_lists_of_arrays_the_same.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/configure_model.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/error_functions.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/find_spikes.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/find_sweeps.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/glif_experiment.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/glif_optimizer.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/glif_optimizer_neuron.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/optimize_neuron.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/plotting.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/preprocess_neuron.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/rc.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/spike_cutting.cpython-37.pyc delete mode 100644 internal/model/glif/__pycache__/threshold_adaptation.cpython-37.pyc delete mode 100644 internal/morphology/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/morphology/__pycache__/compartment.cpython-37.pyc delete mode 100644 internal/morphology/__pycache__/morphology.cpython-37.pyc delete mode 100644 internal/morphology/__pycache__/morphvis.cpython-37.pyc delete mode 100644 internal/morphology/__pycache__/node.cpython-37.pyc delete mode 100644 internal/morphology/__pycache__/validate_swc.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionize.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionizer.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/data_utilities.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/interval_unionizer.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_cav.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_classic.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionize_record.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionizer.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/interval_unionize/__pycache__/unionize_record.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/generate_projection_strip.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/image_sheet.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/projection_functions.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/visualization_utilities.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_projector.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_utilities.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/tissuecyte_stitching/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/tissuecyte_stitching/__pycache__/stitcher.cpython-37.pyc delete mode 100644 internal/mouse_connectivity/tissuecyte_stitching/__pycache__/tile.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/convert_igor_nwb.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/extract_nwb_data.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/feature_extraction_module.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/lab_notebook_reader.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/nwb_publish.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc_support.cpython-37.pyc delete mode 100644 internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/resource_file.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_annotated_region_metrics.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_demixing.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_dff_computation.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_eye_tracking.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_neuropil_correction.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_observatory_analysis.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_observatory_container_thumbnails.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_observatory_thumbnails.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_ophys_eye_calibration.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_ophys_session_decomposition.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_ophys_time_sync.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_roi_filter.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_projection_thumbnail_from_json.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_stitching_classic.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_cav_from_json.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_counts_from_json.cpython-37.pyc delete mode 100644 internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_from_json.cpython-37.pyc delete mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/calculate_features.cpython-37.pyc delete mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/cortical_layers.cpython-37.pyc delete mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/surrogate_strategy.cpython-37.pyc delete mode 100644 internal/pipeline_modules/cell_types/morphology/__pycache__/upright_transform.cpython-37.pyc delete mode 100644 internal/pipeline_modules/gbm/__pycache__/__init__.cpython-37.pyc delete mode 100644 internal/pipeline_modules/gbm/__pycache__/generate_gbm_analysis_run_records.cpython-37.pyc delete mode 100644 internal/pipeline_modules/gbm/__pycache__/generate_gbm_heatmap.cpython-37.pyc delete mode 100644 internal/pipeline_modules/gbm/__pycache__/generate_gbm_sample_metadata.cpython-37.pyc delete mode 100644 model/__pycache__/__init__.cpython-37.pyc delete mode 100644 model/biophys_sim/__pycache__/__init__.cpython-37.pyc delete mode 100644 model/biophys_sim/__pycache__/bps_command.cpython-37.pyc delete mode 100644 model/biophys_sim/__pycache__/config.cpython-37.pyc delete mode 100644 model/biophys_sim/neuron/__pycache__/__init__.cpython-37.pyc delete mode 100644 model/biophys_sim/neuron/__pycache__/hoc_utils.cpython-37.pyc delete mode 100644 model/biophys_sim/scripts/__pycache__/__init__.cpython-37.pyc delete mode 100644 model/biophysical/__pycache__/__init__.cpython-37.pyc delete mode 100644 model/biophysical/__pycache__/run_simulate.cpython-37.pyc delete mode 100644 model/biophysical/__pycache__/runner.cpython-37.pyc delete mode 100644 model/biophysical/__pycache__/utils.cpython-37.pyc delete mode 100644 model/glif/__pycache__/__init__.cpython-37.pyc delete mode 100644 model/glif/__pycache__/glif_neuron.cpython-37.pyc delete mode 100644 model/glif/__pycache__/glif_neuron_methods.cpython-37.pyc delete mode 100644 model/glif/__pycache__/simulate_neuron.cpython-37.pyc delete mode 100644 morphology/__pycache__/__init__.cpython-37.pyc delete mode 100644 morphology/__pycache__/validate_swc.cpython-37.pyc delete mode 100644 mouse_connectivity/__pycache__/__init__.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/__pycache__/__main__.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/__pycache__/_schemas.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/__pycache__/image_series_gridder.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/subimage/__pycache__/__init__.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/subimage/__pycache__/base_subimage.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/subimage/__pycache__/cav_subimage.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/subimage/__pycache__/classic_subimage.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/subimage/__pycache__/count_subimage.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/utilities/__pycache__/__init__.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/utilities/__pycache__/downsampling_utilities.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/utilities/__pycache__/image_utilities.cpython-37.pyc delete mode 100644 mouse_connectivity/grid/writers/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/__pycache__/glif_tests.cpython-37.pyc delete mode 100644 test/__pycache__/test_argschema_utilities.cpython-37.pyc delete mode 100644 test/__pycache__/test_deprecated.cpython-37.pyc delete mode 100644 test/__pycache__/test_inline_examples.cpython-37.pyc delete mode 100644 test/__pycache__/test_temp_dir.cpython-37.pyc delete mode 100644 test/api/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_annotated_section_data_set_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_biophysical_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_brain_observatory_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_cache.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_cacheable.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_caching_utilities.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_cell_types_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_file_download.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_glif_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_grid_data_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_image_download_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_mouse_atlas_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_mouse_connectivity_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_ontologies_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_pager.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_reference_space_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_rma_template.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_svg_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_synchronization_api.cpython-37.pyc delete mode 100644 test/api/__pycache__/test_tree_search_api.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_cache.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_change_log.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_file_attributes.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_full_process.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_local_cache.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_manifest.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_smart_download.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_static_local_cache.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_utils.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/test_windows_isilon_paths.cpython-37.pyc delete mode 100644 test/api/cloud_cache/__pycache__/utils.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_circle_plots.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_demixer.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_dff.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_drifting_gratings.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_locally_sparse_noise.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_natural_movie.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_natural_scenes.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_notebook.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_observatory_plots.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_roi_masks.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_session_analysis.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_session_analysis_regression.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_session_api_utils.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_static_gratings.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_stimulus_analysis.cpython-37.pyc delete mode 100644 test/brain_observatory/__pycache__/test_stimulus_info.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_behavior_metadata_legacy.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_behavior_ophys_experiment.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_behavior_session.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_criteria.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_dprime.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_event_detection.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_eye_tracking_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_mtrain_annotate.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_prior_exposure_count_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_rewards_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_session_metrics.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_stimulus_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_sync_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_trial_masks.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_trials_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_write_behavior_nwb.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/__pycache__/test_write_nwb_behavior_ophys.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_cloud_api.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_lims_api.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_experiments_table_utils.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_from_s3.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache/__pycache__/utils.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/test_behavior_project_cache.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_files/__pycache__/test_stimulus_file.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_files/__pycache__/test_sync_file.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/lims_util.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/nwb_input_json.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_cell_specimens.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_licks.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_motion_correction.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_ophys_timestamps.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_projections.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_rewards.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_stimuli.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_task_parameters.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/__pycache__/test_trial_table.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/base/__pycache__/test_data_object.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_eye_tracking_table.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_rig_geometry.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/metadata/__pycache__/test_behavior_ophys_metadata.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/test_behavior_metadata.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_acquisition.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_speed.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_stimulus_timestamps.cpython-37.pyc delete mode 100644 test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_timestamps_processing.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_copy_utility.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_current_source_density.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_cache.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_fixed_api.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_lims_api.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_project_warehouse_api.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_session.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_session_nwb_api.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_ecephys_sync_dataset.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_http_engine.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_lfp_subsampling.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_rma_engine.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_stim_file.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_stimulus_sync.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_visualization.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/__pycache__/test_write_nwb.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_align_timestamps_module.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode_sync_dataset.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_channel_states.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/align_timestamps/__pycache__/test_probe_synchronizer.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/ecephys_session_api/__pycache__/test_ecephys_nwb1_session_api.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_dot_motion.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_drifting_gratings.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_flashes.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_movies.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_scenes.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_receptive_field_mapping.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_static_gratings.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_stimulus_analysis.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_ephys_pre_spikes.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_naming_utilities.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_parameter_extraction.cpython-37.pyc delete mode 100644 test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_table_module.cpython-37.pyc delete mode 100644 test/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/extract_running_speed/__pycache__/test_extract_running_speed_module.cpython-37.pyc delete mode 100644 test/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/gaze_mapping/__pycache__/test_gaze_mapping.cpython-37.pyc delete mode 100644 test/brain_observatory/gaze_mapping/__pycache__/test_main.cpython-37.pyc delete mode 100644 test/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/nwb/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/brain_observatory/nwb/__pycache__/test_nwb.cpython-37.pyc delete mode 100644 test/brain_observatory/nwb/__pycache__/test_nwb_api.cpython-37.pyc delete mode 100644 test/brain_observatory/nwb/__pycache__/test_nwb_utils.cpython-37.pyc delete mode 100644 test/brain_observatory/receptive_field_analysis/__pycache__/test_chisquarerf.cpython-37.pyc delete mode 100644 test/brain_observatory/receptive_field_analysis/__pycache__/test_fitgaussian2D.cpython-37.pyc delete mode 100644 test/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/brain_observatory/sync_utilities/__pycache__/test_sync_utilities.cpython-37.pyc delete mode 100644 test/config/__pycache__/test_config_single_file_json.cpython-37.pyc delete mode 100644 test/config/__pycache__/test_json_comments.cpython-37.pyc delete mode 100644 test/config/__pycache__/test_manifest.cpython-37.pyc delete mode 100644 test/config/__pycache__/test_multi_file_config.cpython-37.pyc delete mode 100644 test/config/__pycache__/test_pyconfig_parser.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_authentication.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_brain_observatory_cache.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_brain_observatory_nwb_data_set.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_cell_filters.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_cell_types_cache_unit.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_h5_utilities.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_json_utilities.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_lazy_property.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_mouse_connectivity_cache.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_mouse_connectivity_notebook.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_nwb_data_set.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_obj_utilities.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_reference_space.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_reference_space_cache.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_reference_space_notebook.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_simple_tree.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_sitk_utilities.cpython-37.pyc delete mode 100644 test/core/__pycache__/test_structure_tree.cpython-37.pyc delete mode 100644 test/ephys/__pycache__/test_extractor.cpython-37.pyc delete mode 100644 test/ephys/__pycache__/test_features.cpython-37.pyc delete mode 100644 test/internal/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_annotated_region_metrics.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_biophysical_modules.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_core_feature_extract.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_eye_calibration.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_internal.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_mtrain_api.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_optimize_config_reader.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_optimize_manifest.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_roi_filter.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_simulate_manifest.cpython-37.pyc delete mode 100644 test/internal/__pycache__/test_simulate_update_output.cpython-37.pyc delete mode 100644 test/internal/api/__pycache__/test_api_prerelease.cpython-37.pyc delete mode 100644 test/internal/api/__pycache__/test_grid_data_api_prerelease.cpython-37.pyc delete mode 100644 test/internal/api/__pycache__/test_mouse_connectivity_api_prerelease.cpython-37.pyc delete mode 100644 test/internal/api/__pycache__/test_pre_release.cpython-37.pyc delete mode 100644 test/internal/biophysical/__pycache__/conftest.cpython-37.pyc delete mode 100644 test/internal/biophysical/__pycache__/test_ephys_utils.cpython-37.pyc delete mode 100644 test/internal/biophysical/__pycache__/test_optimize_run.cpython-37.pyc delete mode 100644 test/internal/biophysical/__pycache__/test_simulate_run.cpython-37.pyc delete mode 100644 test/internal/brain_observatory/__pycache__/test_roi_filter_utils.cpython-37.pyc delete mode 100644 test/internal/brain_observatory/__pycache__/test_run_ophys_time_sync.cpython-37.pyc delete mode 100644 test/internal/brain_observatory/__pycache__/test_time_sync.cpython-37.pyc delete mode 100644 test/internal/core/__pycache__/test_mouse_connectivity_cache_prerelease.cpython-37.pyc delete mode 100644 test/internal/gbm/__pycache__/test_generate_gbm_heatmap.cpython-37.pyc delete mode 100644 test/internal/morphology/__pycache__/test_apply_affine.cpython-37.pyc delete mode 100644 test/internal/mouse_connectivity/__pycache__/test_interval_unionizer.cpython-37.pyc delete mode 100644 test/internal/mouse_connectivity/__pycache__/test_tissuecyte_unionize_record.cpython-37.pyc delete mode 100644 test/internal/mouse_connectivity/__pycache__/test_unionize_record.cpython-37.pyc delete mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_projection_functions.cpython-37.pyc delete mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_visualization_utilities.cpython-37.pyc delete mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_projector.cpython-37.pyc delete mode 100644 test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_utilities.cpython-37.pyc delete mode 100644 test/internal/tissuecyte_stitching/__pycache__/test_stitcher.cpython-37.pyc delete mode 100644 test/internal/tissuecyte_stitching/__pycache__/test_tile.cpython-37.pyc delete mode 100644 test/model/__pycache__/check_parser.cpython-37.pyc delete mode 100644 test/model/__pycache__/test_biophysical_perisomatic.cpython-37.pyc delete mode 100644 test/model/__pycache__/test_glif.cpython-37.pyc delete mode 100644 test/model/__pycache__/test_runner.cpython-37.pyc delete mode 100644 test/model/aa_model/__pycache__/test_biophysical_all_active.cpython-37.pyc delete mode 100644 test/model/peri_model/__pycache__/test_biophysical_peri.cpython-37.pyc delete mode 100644 test/mouse_connectivity/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc delete mode 100644 test/mouse_connectivity/grid/__pycache__/test_base_subimage.cpython-37.pyc delete mode 100644 test/mouse_connectivity/grid/__pycache__/test_cav_subimage.cpython-37.pyc delete mode 100644 test/mouse_connectivity/grid/__pycache__/test_classic_subimage.cpython-37.pyc delete mode 100644 test/mouse_connectivity/grid/__pycache__/test_image_series_gridder.cpython-37.pyc delete mode 100644 test/mouse_connectivity/grid/__pycache__/test_image_utilities.cpython-37.pyc delete mode 100644 test_utilities/__pycache__/__init__.cpython-37.pyc delete mode 100644 test_utilities/__pycache__/custom_comparators.cpython-37.pyc delete mode 100644 test_utilities/__pycache__/regression_fixture.cpython-37.pyc delete mode 100644 test_utilities/__pycache__/temp_dir.cpython-37.pyc diff --git a/__init__.py b/allensdk/__init__.py similarity index 100% rename from __init__.py rename to allensdk/__init__.py diff --git a/api/__init__.py b/allensdk/api/__init__.py similarity index 100% rename from api/__init__.py rename to allensdk/api/__init__.py diff --git a/api/api.py b/allensdk/api/api.py similarity index 100% rename from api/api.py rename to allensdk/api/api.py diff --git a/api/cloud_cache/__init__.py b/allensdk/api/cloud_cache/__init__.py similarity index 100% rename from api/cloud_cache/__init__.py rename to allensdk/api/cloud_cache/__init__.py diff --git a/api/cloud_cache/cloud_cache.py b/allensdk/api/cloud_cache/cloud_cache.py similarity index 100% rename from api/cloud_cache/cloud_cache.py rename to allensdk/api/cloud_cache/cloud_cache.py diff --git a/api/cloud_cache/file_attributes.py b/allensdk/api/cloud_cache/file_attributes.py similarity index 100% rename from api/cloud_cache/file_attributes.py rename to allensdk/api/cloud_cache/file_attributes.py diff --git a/api/cloud_cache/manifest.py b/allensdk/api/cloud_cache/manifest.py similarity index 100% rename from api/cloud_cache/manifest.py rename to allensdk/api/cloud_cache/manifest.py diff --git a/api/cloud_cache/utils.py b/allensdk/api/cloud_cache/utils.py similarity index 100% rename from api/cloud_cache/utils.py rename to allensdk/api/cloud_cache/utils.py diff --git a/api/queries/__init__.py b/allensdk/api/queries/__init__.py similarity index 100% rename from api/queries/__init__.py rename to allensdk/api/queries/__init__.py diff --git a/api/queries/annotated_section_data_sets_api.py b/allensdk/api/queries/annotated_section_data_sets_api.py similarity index 100% rename from api/queries/annotated_section_data_sets_api.py rename to allensdk/api/queries/annotated_section_data_sets_api.py diff --git a/api/queries/biophysical_api.py b/allensdk/api/queries/biophysical_api.py similarity index 100% rename from api/queries/biophysical_api.py rename to allensdk/api/queries/biophysical_api.py diff --git a/api/queries/brain_observatory_api.py b/allensdk/api/queries/brain_observatory_api.py similarity index 100% rename from api/queries/brain_observatory_api.py rename to allensdk/api/queries/brain_observatory_api.py diff --git a/api/queries/cell_types_api.py b/allensdk/api/queries/cell_types_api.py similarity index 100% rename from api/queries/cell_types_api.py rename to allensdk/api/queries/cell_types_api.py diff --git a/api/queries/connected_services.py b/allensdk/api/queries/connected_services.py similarity index 100% rename from api/queries/connected_services.py rename to allensdk/api/queries/connected_services.py diff --git a/api/queries/glif_api.py b/allensdk/api/queries/glif_api.py similarity index 100% rename from api/queries/glif_api.py rename to allensdk/api/queries/glif_api.py diff --git a/api/queries/grid_data_api.py b/allensdk/api/queries/grid_data_api.py similarity index 100% rename from api/queries/grid_data_api.py rename to allensdk/api/queries/grid_data_api.py diff --git a/api/queries/image_download_api.py b/allensdk/api/queries/image_download_api.py similarity index 100% rename from api/queries/image_download_api.py rename to allensdk/api/queries/image_download_api.py diff --git a/api/queries/mouse_atlas_api.py b/allensdk/api/queries/mouse_atlas_api.py similarity index 100% rename from api/queries/mouse_atlas_api.py rename to allensdk/api/queries/mouse_atlas_api.py diff --git a/api/queries/mouse_connectivity_api.py b/allensdk/api/queries/mouse_connectivity_api.py similarity index 100% rename from api/queries/mouse_connectivity_api.py rename to allensdk/api/queries/mouse_connectivity_api.py diff --git a/api/queries/ontologies_api.py b/allensdk/api/queries/ontologies_api.py similarity index 100% rename from api/queries/ontologies_api.py rename to allensdk/api/queries/ontologies_api.py diff --git a/api/queries/reference_space_api.py b/allensdk/api/queries/reference_space_api.py similarity index 100% rename from api/queries/reference_space_api.py rename to allensdk/api/queries/reference_space_api.py diff --git a/api/queries/rma_api.py b/allensdk/api/queries/rma_api.py similarity index 100% rename from api/queries/rma_api.py rename to allensdk/api/queries/rma_api.py diff --git a/api/queries/rma_pager.py b/allensdk/api/queries/rma_pager.py similarity index 100% rename from api/queries/rma_pager.py rename to allensdk/api/queries/rma_pager.py diff --git a/api/queries/rma_template.py b/allensdk/api/queries/rma_template.py similarity index 100% rename from api/queries/rma_template.py rename to allensdk/api/queries/rma_template.py diff --git a/api/queries/svg_api.py b/allensdk/api/queries/svg_api.py similarity index 100% rename from api/queries/svg_api.py rename to allensdk/api/queries/svg_api.py diff --git a/api/queries/synchronization_api.py b/allensdk/api/queries/synchronization_api.py similarity index 100% rename from api/queries/synchronization_api.py rename to allensdk/api/queries/synchronization_api.py diff --git a/api/queries/tree_search_api.py b/allensdk/api/queries/tree_search_api.py similarity index 100% rename from api/queries/tree_search_api.py rename to allensdk/api/queries/tree_search_api.py diff --git a/api/warehouse_cache/__init__.py b/allensdk/api/warehouse_cache/__init__.py similarity index 100% rename from api/warehouse_cache/__init__.py rename to allensdk/api/warehouse_cache/__init__.py diff --git a/api/warehouse_cache/cache.py b/allensdk/api/warehouse_cache/cache.py similarity index 100% rename from api/warehouse_cache/cache.py rename to allensdk/api/warehouse_cache/cache.py diff --git a/api/warehouse_cache/caching_utilities.py b/allensdk/api/warehouse_cache/caching_utilities.py similarity index 100% rename from api/warehouse_cache/caching_utilities.py rename to allensdk/api/warehouse_cache/caching_utilities.py diff --git a/brain_observatory/__init__.py b/allensdk/brain_observatory/__init__.py similarity index 100% rename from brain_observatory/__init__.py rename to allensdk/brain_observatory/__init__.py diff --git a/brain_observatory/argschema_utilities.py b/allensdk/brain_observatory/argschema_utilities.py similarity index 100% rename from brain_observatory/argschema_utilities.py rename to allensdk/brain_observatory/argschema_utilities.py diff --git a/brain_observatory/behavior/__init__.py b/allensdk/brain_observatory/behavior/__init__.py similarity index 100% rename from brain_observatory/behavior/__init__.py rename to allensdk/brain_observatory/behavior/__init__.py diff --git a/brain_observatory/behavior/behavior_ophys_analysis.py b/allensdk/brain_observatory/behavior/behavior_ophys_analysis.py similarity index 100% rename from brain_observatory/behavior/behavior_ophys_analysis.py rename to allensdk/brain_observatory/behavior/behavior_ophys_analysis.py diff --git a/brain_observatory/behavior/behavior_ophys_experiment.py b/allensdk/brain_observatory/behavior/behavior_ophys_experiment.py similarity index 100% rename from brain_observatory/behavior/behavior_ophys_experiment.py rename to allensdk/brain_observatory/behavior/behavior_ophys_experiment.py diff --git a/brain_observatory/behavior/behavior_ophys_session.py b/allensdk/brain_observatory/behavior/behavior_ophys_session.py similarity index 100% rename from brain_observatory/behavior/behavior_ophys_session.py rename to allensdk/brain_observatory/behavior/behavior_ophys_session.py diff --git a/brain_observatory/behavior/behavior_project_cache/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/__init__.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/__init__.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/__init__.py diff --git a/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py b/allensdk/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/behavior_project_cache.py diff --git a/brain_observatory/behavior/behavior_project_cache/external/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/external/__init__.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/external/__init__.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/external/__init__.py diff --git a/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py b/allensdk/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/external/behavior_project_metadata_writer.py diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__init__.py diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/behavior_project_base.py diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__init__.py diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_cloud_api.py diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py b/allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/behavior_project_lims_api.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/__init__.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/__init__.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/__init__.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/experiments_table.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_mixin.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/ophys_sessions_table.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/project_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/project_table.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/project_table.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/project_table.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/sessions_table.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/__init__.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/experiments_table_utils.py diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py b/allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py similarity index 100% rename from brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py rename to allensdk/brain_observatory/behavior/behavior_project_cache/tables/util/prior_exposure_processing.py diff --git a/brain_observatory/behavior/behavior_session.py b/allensdk/brain_observatory/behavior/behavior_session.py similarity index 100% rename from brain_observatory/behavior/behavior_session.py rename to allensdk/brain_observatory/behavior/behavior_session.py diff --git a/brain_observatory/behavior/criteria.py b/allensdk/brain_observatory/behavior/criteria.py similarity index 100% rename from brain_observatory/behavior/criteria.py rename to allensdk/brain_observatory/behavior/criteria.py diff --git a/brain_observatory/behavior/data_files/__init__.py b/allensdk/brain_observatory/behavior/data_files/__init__.py similarity index 100% rename from brain_observatory/behavior/data_files/__init__.py rename to allensdk/brain_observatory/behavior/data_files/__init__.py diff --git a/brain_observatory/behavior/data_files/_data_file_abc.py b/allensdk/brain_observatory/behavior/data_files/_data_file_abc.py similarity index 100% rename from brain_observatory/behavior/data_files/_data_file_abc.py rename to allensdk/brain_observatory/behavior/data_files/_data_file_abc.py diff --git a/brain_observatory/behavior/data_files/avg_projection_file.py b/allensdk/brain_observatory/behavior/data_files/avg_projection_file.py similarity index 100% rename from brain_observatory/behavior/data_files/avg_projection_file.py rename to allensdk/brain_observatory/behavior/data_files/avg_projection_file.py diff --git a/brain_observatory/behavior/data_files/demix_file.py b/allensdk/brain_observatory/behavior/data_files/demix_file.py similarity index 100% rename from brain_observatory/behavior/data_files/demix_file.py rename to allensdk/brain_observatory/behavior/data_files/demix_file.py diff --git a/brain_observatory/behavior/data_files/dff_file.py b/allensdk/brain_observatory/behavior/data_files/dff_file.py similarity index 100% rename from brain_observatory/behavior/data_files/dff_file.py rename to allensdk/brain_observatory/behavior/data_files/dff_file.py diff --git a/brain_observatory/behavior/data_files/event_detection_file.py b/allensdk/brain_observatory/behavior/data_files/event_detection_file.py similarity index 100% rename from brain_observatory/behavior/data_files/event_detection_file.py rename to allensdk/brain_observatory/behavior/data_files/event_detection_file.py diff --git a/brain_observatory/behavior/data_files/eye_tracking_file.py b/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py similarity index 100% rename from brain_observatory/behavior/data_files/eye_tracking_file.py rename to allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py diff --git a/brain_observatory/behavior/data_files/max_projection_file.py b/allensdk/brain_observatory/behavior/data_files/max_projection_file.py similarity index 100% rename from brain_observatory/behavior/data_files/max_projection_file.py rename to allensdk/brain_observatory/behavior/data_files/max_projection_file.py diff --git a/brain_observatory/behavior/data_files/rigid_motion_transform_file.py b/allensdk/brain_observatory/behavior/data_files/rigid_motion_transform_file.py similarity index 100% rename from brain_observatory/behavior/data_files/rigid_motion_transform_file.py rename to allensdk/brain_observatory/behavior/data_files/rigid_motion_transform_file.py diff --git a/brain_observatory/behavior/data_files/stimulus_file.py b/allensdk/brain_observatory/behavior/data_files/stimulus_file.py similarity index 100% rename from brain_observatory/behavior/data_files/stimulus_file.py rename to allensdk/brain_observatory/behavior/data_files/stimulus_file.py diff --git a/brain_observatory/behavior/data_files/sync_file.py b/allensdk/brain_observatory/behavior/data_files/sync_file.py similarity index 100% rename from brain_observatory/behavior/data_files/sync_file.py rename to allensdk/brain_observatory/behavior/data_files/sync_file.py diff --git a/brain_observatory/behavior/data_objects/__init__.py b/allensdk/brain_observatory/behavior/data_objects/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/__init__.py diff --git a/brain_observatory/behavior/data_objects/base/__init__.py b/allensdk/brain_observatory/behavior/data_objects/base/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/base/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/base/__init__.py diff --git a/brain_observatory/behavior/data_objects/base/_data_object_abc.py b/allensdk/brain_observatory/behavior/data_objects/base/_data_object_abc.py similarity index 100% rename from brain_observatory/behavior/data_objects/base/_data_object_abc.py rename to allensdk/brain_observatory/behavior/data_objects/base/_data_object_abc.py diff --git a/brain_observatory/behavior/data_objects/base/readable_interfaces.py b/allensdk/brain_observatory/behavior/data_objects/base/readable_interfaces.py similarity index 100% rename from brain_observatory/behavior/data_objects/base/readable_interfaces.py rename to allensdk/brain_observatory/behavior/data_objects/base/readable_interfaces.py diff --git a/brain_observatory/behavior/data_objects/base/writable_interfaces.py b/allensdk/brain_observatory/behavior/data_objects/base/writable_interfaces.py similarity index 100% rename from brain_observatory/behavior/data_objects/base/writable_interfaces.py rename to allensdk/brain_observatory/behavior/data_objects/base/writable_interfaces.py diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__init__.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/cell_specimens/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/cell_specimens/__init__.py diff --git a/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py similarity index 100% rename from brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py rename to allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py diff --git a/brain_observatory/behavior/data_objects/cell_specimens/events.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/events.py similarity index 100% rename from brain_observatory/behavior/data_objects/cell_specimens/events.py rename to allensdk/brain_observatory/behavior/data_objects/cell_specimens/events.py diff --git a/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py similarity index 100% rename from brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py rename to allensdk/brain_observatory/behavior/data_objects/cell_specimens/rois_mixin.py diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/__init__.py diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py similarity index 100% rename from brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py rename to allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/corrected_fluorescence_traces.py diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py similarity index 100% rename from brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py rename to allensdk/brain_observatory/behavior/data_objects/cell_specimens/traces/dff_traces.py diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__init__.py b/allensdk/brain_observatory/behavior/data_objects/eye_tracking/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/eye_tracking/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/eye_tracking/__init__.py diff --git a/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py b/allensdk/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py similarity index 100% rename from brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py rename to allensdk/brain_observatory/behavior/data_objects/eye_tracking/eye_tracking_table.py diff --git a/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py b/allensdk/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py similarity index 100% rename from brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py rename to allensdk/brain_observatory/behavior/data_objects/eye_tracking/rig_geometry.py diff --git a/brain_observatory/behavior/data_objects/licks.py b/allensdk/brain_observatory/behavior/data_objects/licks.py similarity index 100% rename from brain_observatory/behavior/data_objects/licks.py rename to allensdk/brain_observatory/behavior/data_objects/licks.py diff --git a/brain_observatory/behavior/data_objects/metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/__init__.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__init__.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_metadata.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_id.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/behavior_session_uuid.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/date_of_acquisition.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/equipment.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/foraging_id.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/session_type.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_metadata/stimulus_frame_rate.py diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/behavior_ophys_metadata.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__init__.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/experiment_container_id.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/field_of_view_shape.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_depth.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/imaging_plane.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__init__.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/imaging_plane_group.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/multi_plane_metadata.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_experiment_metadata.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/ophys_session_id.py diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py b/allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/project_code.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/__init__.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/age.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/driver_line.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/full_genotype.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/mouse_id.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/reporter_line.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/sex.py diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py b/allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py similarity index 100% rename from brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py rename to allensdk/brain_observatory/behavior/data_objects/metadata/subject_metadata/subject_metadata.py diff --git a/brain_observatory/behavior/data_objects/motion_correction.py b/allensdk/brain_observatory/behavior/data_objects/motion_correction.py similarity index 100% rename from brain_observatory/behavior/data_objects/motion_correction.py rename to allensdk/brain_observatory/behavior/data_objects/motion_correction.py diff --git a/brain_observatory/behavior/data_objects/projections.py b/allensdk/brain_observatory/behavior/data_objects/projections.py similarity index 100% rename from brain_observatory/behavior/data_objects/projections.py rename to allensdk/brain_observatory/behavior/data_objects/projections.py diff --git a/brain_observatory/behavior/data_objects/rewards.py b/allensdk/brain_observatory/behavior/data_objects/rewards.py similarity index 100% rename from brain_observatory/behavior/data_objects/rewards.py rename to allensdk/brain_observatory/behavior/data_objects/rewards.py diff --git a/brain_observatory/behavior/data_objects/running_speed/__init__.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/running_speed/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/running_speed/__init__.py diff --git a/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py similarity index 100% rename from brain_observatory/behavior/data_objects/running_speed/running_acquisition.py rename to allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py diff --git a/brain_observatory/behavior/data_objects/running_speed/running_processing.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py similarity index 100% rename from brain_observatory/behavior/data_objects/running_speed/running_processing.py rename to allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py diff --git a/brain_observatory/behavior/data_objects/running_speed/running_speed.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_speed.py similarity index 100% rename from brain_observatory/behavior/data_objects/running_speed/running_speed.py rename to allensdk/brain_observatory/behavior/data_objects/running_speed/running_speed.py diff --git a/brain_observatory/behavior/data_objects/stimuli/__init__.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/stimuli/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/stimuli/__init__.py diff --git a/brain_observatory/behavior/data_objects/stimuli/presentations.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py similarity index 100% rename from brain_observatory/behavior/data_objects/stimuli/presentations.py rename to allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py diff --git a/brain_observatory/behavior/data_objects/stimuli/stimuli.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/stimuli.py similarity index 100% rename from brain_observatory/behavior/data_objects/stimuli/stimuli.py rename to allensdk/brain_observatory/behavior/data_objects/stimuli/stimuli.py diff --git a/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py similarity index 100% rename from brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py rename to allensdk/brain_observatory/behavior/data_objects/stimuli/stimulus_templates.py diff --git a/brain_observatory/behavior/data_objects/stimuli/templates.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/templates.py similarity index 100% rename from brain_observatory/behavior/data_objects/stimuli/templates.py rename to allensdk/brain_observatory/behavior/data_objects/stimuli/templates.py diff --git a/brain_observatory/behavior/data_objects/stimuli/util.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/util.py similarity index 100% rename from brain_observatory/behavior/data_objects/stimuli/util.py rename to allensdk/brain_observatory/behavior/data_objects/stimuli/util.py diff --git a/brain_observatory/behavior/data_objects/task_parameters.py b/allensdk/brain_observatory/behavior/data_objects/task_parameters.py similarity index 100% rename from brain_observatory/behavior/data_objects/task_parameters.py rename to allensdk/brain_observatory/behavior/data_objects/task_parameters.py diff --git a/brain_observatory/behavior/data_objects/timestamps/__init__.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/timestamps/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/timestamps/__init__.py diff --git a/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py similarity index 100% rename from brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py rename to allensdk/brain_observatory/behavior/data_objects/timestamps/ophys_timestamps.py diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__init__.py diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py similarity index 100% rename from brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py rename to allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/stimulus_timestamps.py diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py similarity index 100% rename from brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py rename to allensdk/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/timestamps_processing.py diff --git a/brain_observatory/behavior/data_objects/timestamps/util.py b/allensdk/brain_observatory/behavior/data_objects/timestamps/util.py similarity index 100% rename from brain_observatory/behavior/data_objects/timestamps/util.py rename to allensdk/brain_observatory/behavior/data_objects/timestamps/util.py diff --git a/brain_observatory/behavior/data_objects/trials/__init__.py b/allensdk/brain_observatory/behavior/data_objects/trials/__init__.py similarity index 100% rename from brain_observatory/behavior/data_objects/trials/__init__.py rename to allensdk/brain_observatory/behavior/data_objects/trials/__init__.py diff --git a/brain_observatory/behavior/data_objects/trials/trial.py b/allensdk/brain_observatory/behavior/data_objects/trials/trial.py similarity index 100% rename from brain_observatory/behavior/data_objects/trials/trial.py rename to allensdk/brain_observatory/behavior/data_objects/trials/trial.py diff --git a/brain_observatory/behavior/data_objects/trials/trial_table.py b/allensdk/brain_observatory/behavior/data_objects/trials/trial_table.py similarity index 100% rename from brain_observatory/behavior/data_objects/trials/trial_table.py rename to allensdk/brain_observatory/behavior/data_objects/trials/trial_table.py diff --git a/brain_observatory/behavior/dprime.py b/allensdk/brain_observatory/behavior/dprime.py similarity index 100% rename from brain_observatory/behavior/dprime.py rename to allensdk/brain_observatory/behavior/dprime.py diff --git a/brain_observatory/behavior/event_detection.py b/allensdk/brain_observatory/behavior/event_detection.py similarity index 100% rename from brain_observatory/behavior/event_detection.py rename to allensdk/brain_observatory/behavior/event_detection.py diff --git a/brain_observatory/behavior/eye_tracking_processing.py b/allensdk/brain_observatory/behavior/eye_tracking_processing.py similarity index 100% rename from brain_observatory/behavior/eye_tracking_processing.py rename to allensdk/brain_observatory/behavior/eye_tracking_processing.py diff --git a/brain_observatory/behavior/image_api.py b/allensdk/brain_observatory/behavior/image_api.py similarity index 100% rename from brain_observatory/behavior/image_api.py rename to allensdk/brain_observatory/behavior/image_api.py diff --git a/brain_observatory/behavior/mtrain.py b/allensdk/brain_observatory/behavior/mtrain.py similarity index 100% rename from brain_observatory/behavior/mtrain.py rename to allensdk/brain_observatory/behavior/mtrain.py diff --git a/brain_observatory/behavior/ophys_experiment.py b/allensdk/brain_observatory/behavior/ophys_experiment.py similarity index 100% rename from brain_observatory/behavior/ophys_experiment.py rename to allensdk/brain_observatory/behavior/ophys_experiment.py diff --git a/brain_observatory/behavior/ophys_session.py b/allensdk/brain_observatory/behavior/ophys_session.py similarity index 100% rename from brain_observatory/behavior/ophys_session.py rename to allensdk/brain_observatory/behavior/ophys_session.py diff --git a/brain_observatory/behavior/rewards_processing.py b/allensdk/brain_observatory/behavior/rewards_processing.py similarity index 100% rename from brain_observatory/behavior/rewards_processing.py rename to allensdk/brain_observatory/behavior/rewards_processing.py diff --git a/brain_observatory/behavior/schemas.py b/allensdk/brain_observatory/behavior/schemas.py similarity index 100% rename from brain_observatory/behavior/schemas.py rename to allensdk/brain_observatory/behavior/schemas.py diff --git a/brain_observatory/behavior/session_metrics.py b/allensdk/brain_observatory/behavior/session_metrics.py similarity index 100% rename from brain_observatory/behavior/session_metrics.py rename to allensdk/brain_observatory/behavior/session_metrics.py diff --git a/brain_observatory/behavior/stimulus_processing.py b/allensdk/brain_observatory/behavior/stimulus_processing.py similarity index 100% rename from brain_observatory/behavior/stimulus_processing.py rename to allensdk/brain_observatory/behavior/stimulus_processing.py diff --git a/brain_observatory/behavior/swdb/analysis_tools.py b/allensdk/brain_observatory/behavior/swdb/analysis_tools.py similarity index 100% rename from brain_observatory/behavior/swdb/analysis_tools.py rename to allensdk/brain_observatory/behavior/swdb/analysis_tools.py diff --git a/brain_observatory/behavior/swdb/behavior_project_cache.py b/allensdk/brain_observatory/behavior/swdb/behavior_project_cache.py similarity index 100% rename from brain_observatory/behavior/swdb/behavior_project_cache.py rename to allensdk/brain_observatory/behavior/swdb/behavior_project_cache.py diff --git a/brain_observatory/behavior/swdb/create_multi_session_df.py b/allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py similarity index 100% rename from brain_observatory/behavior/swdb/create_multi_session_df.py rename to allensdk/brain_observatory/behavior/swdb/create_multi_session_df.py diff --git a/brain_observatory/behavior/swdb/run_multi_session_df.py b/allensdk/brain_observatory/behavior/swdb/run_multi_session_df.py similarity index 100% rename from brain_observatory/behavior/swdb/run_multi_session_df.py rename to allensdk/brain_observatory/behavior/swdb/run_multi_session_df.py diff --git a/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py b/allensdk/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py similarity index 100% rename from brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py rename to allensdk/brain_observatory/behavior/swdb/run_save_extended_stimulus_presentations_df.py diff --git a/brain_observatory/behavior/swdb/run_save_flash_response_df.py b/allensdk/brain_observatory/behavior/swdb/run_save_flash_response_df.py similarity index 100% rename from brain_observatory/behavior/swdb/run_save_flash_response_df.py rename to allensdk/brain_observatory/behavior/swdb/run_save_flash_response_df.py diff --git a/brain_observatory/behavior/swdb/run_save_trial_response_df.py b/allensdk/brain_observatory/behavior/swdb/run_save_trial_response_df.py similarity index 100% rename from brain_observatory/behavior/swdb/run_save_trial_response_df.py rename to allensdk/brain_observatory/behavior/swdb/run_save_trial_response_df.py diff --git a/brain_observatory/behavior/swdb/run_summary_figures.py b/allensdk/brain_observatory/behavior/swdb/run_summary_figures.py similarity index 100% rename from brain_observatory/behavior/swdb/run_summary_figures.py rename to allensdk/brain_observatory/behavior/swdb/run_summary_figures.py diff --git a/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py b/allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py similarity index 100% rename from brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py rename to allensdk/brain_observatory/behavior/swdb/save_extended_stimulus_presentations_df.py diff --git a/brain_observatory/behavior/swdb/save_flash_response_df.py b/allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py similarity index 100% rename from brain_observatory/behavior/swdb/save_flash_response_df.py rename to allensdk/brain_observatory/behavior/swdb/save_flash_response_df.py diff --git a/brain_observatory/behavior/swdb/save_trial_response_df.py b/allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py similarity index 100% rename from brain_observatory/behavior/swdb/save_trial_response_df.py rename to allensdk/brain_observatory/behavior/swdb/save_trial_response_df.py diff --git a/brain_observatory/behavior/swdb/summary_figures.py b/allensdk/brain_observatory/behavior/swdb/summary_figures.py similarity index 100% rename from brain_observatory/behavior/swdb/summary_figures.py rename to allensdk/brain_observatory/behavior/swdb/summary_figures.py diff --git a/brain_observatory/behavior/swdb/utilities.py b/allensdk/brain_observatory/behavior/swdb/utilities.py similarity index 100% rename from brain_observatory/behavior/swdb/utilities.py rename to allensdk/brain_observatory/behavior/swdb/utilities.py diff --git a/brain_observatory/behavior/sync/__init__.py b/allensdk/brain_observatory/behavior/sync/__init__.py similarity index 100% rename from brain_observatory/behavior/sync/__init__.py rename to allensdk/brain_observatory/behavior/sync/__init__.py diff --git a/brain_observatory/behavior/sync/process_sync.py b/allensdk/brain_observatory/behavior/sync/process_sync.py similarity index 100% rename from brain_observatory/behavior/sync/process_sync.py rename to allensdk/brain_observatory/behavior/sync/process_sync.py diff --git a/brain_observatory/behavior/trial_masks.py b/allensdk/brain_observatory/behavior/trial_masks.py similarity index 100% rename from brain_observatory/behavior/trial_masks.py rename to allensdk/brain_observatory/behavior/trial_masks.py diff --git a/brain_observatory/behavior/trials_processing.py b/allensdk/brain_observatory/behavior/trials_processing.py similarity index 100% rename from brain_observatory/behavior/trials_processing.py rename to allensdk/brain_observatory/behavior/trials_processing.py diff --git a/brain_observatory/behavior/write_behavior_nwb/__init__.py b/allensdk/brain_observatory/behavior/write_behavior_nwb/__init__.py similarity index 100% rename from brain_observatory/behavior/write_behavior_nwb/__init__.py rename to allensdk/brain_observatory/behavior/write_behavior_nwb/__init__.py diff --git a/brain_observatory/behavior/write_behavior_nwb/__main__.py b/allensdk/brain_observatory/behavior/write_behavior_nwb/__main__.py similarity index 100% rename from brain_observatory/behavior/write_behavior_nwb/__main__.py rename to allensdk/brain_observatory/behavior/write_behavior_nwb/__main__.py diff --git a/brain_observatory/behavior/write_behavior_nwb/_schemas.py b/allensdk/brain_observatory/behavior/write_behavior_nwb/_schemas.py similarity index 100% rename from brain_observatory/behavior/write_behavior_nwb/_schemas.py rename to allensdk/brain_observatory/behavior/write_behavior_nwb/_schemas.py diff --git a/brain_observatory/behavior/write_nwb/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/__init__.py similarity index 100% rename from brain_observatory/behavior/write_nwb/__init__.py rename to allensdk/brain_observatory/behavior/write_nwb/__init__.py diff --git a/brain_observatory/behavior/write_nwb/__main__.py b/allensdk/brain_observatory/behavior/write_nwb/__main__.py similarity index 100% rename from brain_observatory/behavior/write_nwb/__main__.py rename to allensdk/brain_observatory/behavior/write_nwb/__main__.py diff --git a/brain_observatory/behavior/write_nwb/_schemas.py b/allensdk/brain_observatory/behavior/write_nwb/_schemas.py similarity index 100% rename from brain_observatory/behavior/write_nwb/_schemas.py rename to allensdk/brain_observatory/behavior/write_nwb/_schemas.py diff --git a/brain_observatory/behavior/write_nwb/extensions/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/__init__.py similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/__init__.py rename to allensdk/brain_observatory/behavior/write_nwb/extensions/__init__.py diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py rename to allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/__init__.py diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py rename to allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/extension_builder.py diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml rename to allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.extensions.yaml diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml rename to allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx-aibs-ophys-event-detection.namespace.yaml diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py rename to allensdk/brain_observatory/behavior/write_nwb/extensions/event_detection/ndx_ophys_events.py diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py rename to allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__init__.py diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py rename to allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/extension_builder.py diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml rename to allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.extensions.yaml diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml rename to allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx-aibs-stimulus-template.namespace.yaml diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py b/allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py similarity index 100% rename from brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py rename to allensdk/brain_observatory/behavior/write_nwb/extensions/stimulus_template/ndx_stimulus_template.py diff --git a/brain_observatory/brain_observatory_exceptions.py b/allensdk/brain_observatory/brain_observatory_exceptions.py similarity index 100% rename from brain_observatory/brain_observatory_exceptions.py rename to allensdk/brain_observatory/brain_observatory_exceptions.py diff --git a/brain_observatory/brain_observatory_plotting.py b/allensdk/brain_observatory/brain_observatory_plotting.py similarity index 100% rename from brain_observatory/brain_observatory_plotting.py rename to allensdk/brain_observatory/brain_observatory_plotting.py diff --git a/brain_observatory/chisquare_categorical.py b/allensdk/brain_observatory/chisquare_categorical.py similarity index 100% rename from brain_observatory/chisquare_categorical.py rename to allensdk/brain_observatory/chisquare_categorical.py diff --git a/brain_observatory/circle_plots.py b/allensdk/brain_observatory/circle_plots.py similarity index 100% rename from brain_observatory/circle_plots.py rename to allensdk/brain_observatory/circle_plots.py diff --git a/brain_observatory/comparison_utils.py b/allensdk/brain_observatory/comparison_utils.py similarity index 100% rename from brain_observatory/comparison_utils.py rename to allensdk/brain_observatory/comparison_utils.py diff --git a/brain_observatory/demixer.py b/allensdk/brain_observatory/demixer.py similarity index 100% rename from brain_observatory/demixer.py rename to allensdk/brain_observatory/demixer.py diff --git a/brain_observatory/dff.py b/allensdk/brain_observatory/dff.py similarity index 100% rename from brain_observatory/dff.py rename to allensdk/brain_observatory/dff.py diff --git a/brain_observatory/drifting_gratings.py b/allensdk/brain_observatory/drifting_gratings.py similarity index 100% rename from brain_observatory/drifting_gratings.py rename to allensdk/brain_observatory/drifting_gratings.py diff --git a/brain_observatory/ecephys/__init__.py b/allensdk/brain_observatory/ecephys/__init__.py similarity index 100% rename from brain_observatory/ecephys/__init__.py rename to allensdk/brain_observatory/ecephys/__init__.py diff --git a/brain_observatory/ecephys/align_timestamps/__init__.py b/allensdk/brain_observatory/ecephys/align_timestamps/__init__.py similarity index 100% rename from brain_observatory/ecephys/align_timestamps/__init__.py rename to allensdk/brain_observatory/ecephys/align_timestamps/__init__.py diff --git a/brain_observatory/ecephys/align_timestamps/__main__.py b/allensdk/brain_observatory/ecephys/align_timestamps/__main__.py similarity index 100% rename from brain_observatory/ecephys/align_timestamps/__main__.py rename to allensdk/brain_observatory/ecephys/align_timestamps/__main__.py diff --git a/brain_observatory/ecephys/align_timestamps/_schemas.py b/allensdk/brain_observatory/ecephys/align_timestamps/_schemas.py similarity index 100% rename from brain_observatory/ecephys/align_timestamps/_schemas.py rename to allensdk/brain_observatory/ecephys/align_timestamps/_schemas.py diff --git a/brain_observatory/ecephys/align_timestamps/barcode.py b/allensdk/brain_observatory/ecephys/align_timestamps/barcode.py similarity index 100% rename from brain_observatory/ecephys/align_timestamps/barcode.py rename to allensdk/brain_observatory/ecephys/align_timestamps/barcode.py diff --git a/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py b/allensdk/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py similarity index 100% rename from brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py rename to allensdk/brain_observatory/ecephys/align_timestamps/barcode_sync_dataset.py diff --git a/brain_observatory/ecephys/align_timestamps/channel_states.py b/allensdk/brain_observatory/ecephys/align_timestamps/channel_states.py similarity index 100% rename from brain_observatory/ecephys/align_timestamps/channel_states.py rename to allensdk/brain_observatory/ecephys/align_timestamps/channel_states.py diff --git a/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py b/allensdk/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py similarity index 100% rename from brain_observatory/ecephys/align_timestamps/probe_synchronizer.py rename to allensdk/brain_observatory/ecephys/align_timestamps/probe_synchronizer.py diff --git a/brain_observatory/ecephys/copy_utility/__init__.py b/allensdk/brain_observatory/ecephys/copy_utility/__init__.py similarity index 100% rename from brain_observatory/ecephys/copy_utility/__init__.py rename to allensdk/brain_observatory/ecephys/copy_utility/__init__.py diff --git a/brain_observatory/ecephys/copy_utility/__main__.py b/allensdk/brain_observatory/ecephys/copy_utility/__main__.py similarity index 100% rename from brain_observatory/ecephys/copy_utility/__main__.py rename to allensdk/brain_observatory/ecephys/copy_utility/__main__.py diff --git a/brain_observatory/ecephys/copy_utility/_schemas.py b/allensdk/brain_observatory/ecephys/copy_utility/_schemas.py similarity index 100% rename from brain_observatory/ecephys/copy_utility/_schemas.py rename to allensdk/brain_observatory/ecephys/copy_utility/_schemas.py diff --git a/brain_observatory/ecephys/current_source_density/__init__.py b/allensdk/brain_observatory/ecephys/current_source_density/__init__.py similarity index 100% rename from brain_observatory/ecephys/current_source_density/__init__.py rename to allensdk/brain_observatory/ecephys/current_source_density/__init__.py diff --git a/brain_observatory/ecephys/current_source_density/__main__.py b/allensdk/brain_observatory/ecephys/current_source_density/__main__.py similarity index 100% rename from brain_observatory/ecephys/current_source_density/__main__.py rename to allensdk/brain_observatory/ecephys/current_source_density/__main__.py diff --git a/brain_observatory/ecephys/current_source_density/_current_source_density.py b/allensdk/brain_observatory/ecephys/current_source_density/_current_source_density.py similarity index 100% rename from brain_observatory/ecephys/current_source_density/_current_source_density.py rename to allensdk/brain_observatory/ecephys/current_source_density/_current_source_density.py diff --git a/brain_observatory/ecephys/current_source_density/_filter_utils.py b/allensdk/brain_observatory/ecephys/current_source_density/_filter_utils.py similarity index 100% rename from brain_observatory/ecephys/current_source_density/_filter_utils.py rename to allensdk/brain_observatory/ecephys/current_source_density/_filter_utils.py diff --git a/brain_observatory/ecephys/current_source_density/_interpolation_utils.py b/allensdk/brain_observatory/ecephys/current_source_density/_interpolation_utils.py similarity index 100% rename from brain_observatory/ecephys/current_source_density/_interpolation_utils.py rename to allensdk/brain_observatory/ecephys/current_source_density/_interpolation_utils.py diff --git a/brain_observatory/ecephys/current_source_density/_schemas.py b/allensdk/brain_observatory/ecephys/current_source_density/_schemas.py similarity index 100% rename from brain_observatory/ecephys/current_source_density/_schemas.py rename to allensdk/brain_observatory/ecephys/current_source_density/_schemas.py diff --git a/brain_observatory/ecephys/ecephys_project_api/__init__.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/__init__.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/__init__.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/__init__.py diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_api.py diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_fixed_api.py diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_lims_api.py diff --git a/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/ecephys_project_warehouse_api.py diff --git a/brain_observatory/ecephys/ecephys_project_api/http_engine.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/http_engine.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/http_engine.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/http_engine.py diff --git a/brain_observatory/ecephys/ecephys_project_api/rma_engine.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/rma_engine.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/rma_engine.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/rma_engine.py diff --git a/brain_observatory/ecephys/ecephys_project_api/utilities.py b/allensdk/brain_observatory/ecephys/ecephys_project_api/utilities.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_api/utilities.py rename to allensdk/brain_observatory/ecephys/ecephys_project_api/utilities.py diff --git a/brain_observatory/ecephys/ecephys_project_cache.py b/allensdk/brain_observatory/ecephys/ecephys_project_cache.py similarity index 100% rename from brain_observatory/ecephys/ecephys_project_cache.py rename to allensdk/brain_observatory/ecephys/ecephys_project_cache.py diff --git a/brain_observatory/ecephys/ecephys_session.py b/allensdk/brain_observatory/ecephys/ecephys_session.py similarity index 100% rename from brain_observatory/ecephys/ecephys_session.py rename to allensdk/brain_observatory/ecephys/ecephys_session.py diff --git a/brain_observatory/ecephys/ecephys_session_api/__init__.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/__init__.py similarity index 100% rename from brain_observatory/ecephys/ecephys_session_api/__init__.py rename to allensdk/brain_observatory/ecephys/ecephys_session_api/__init__.py diff --git a/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py similarity index 100% rename from brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py rename to allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb1_session_api.py diff --git a/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py similarity index 100% rename from brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py rename to allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_nwb_session_api.py diff --git a/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py b/allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py similarity index 100% rename from brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py rename to allensdk/brain_observatory/ecephys/ecephys_session_api/ecephys_session_api.py diff --git a/brain_observatory/ecephys/file_io/__init__.py b/allensdk/brain_observatory/ecephys/file_io/__init__.py similarity index 100% rename from brain_observatory/ecephys/file_io/__init__.py rename to allensdk/brain_observatory/ecephys/file_io/__init__.py diff --git a/brain_observatory/ecephys/file_io/continuous_file.py b/allensdk/brain_observatory/ecephys/file_io/continuous_file.py similarity index 100% rename from brain_observatory/ecephys/file_io/continuous_file.py rename to allensdk/brain_observatory/ecephys/file_io/continuous_file.py diff --git a/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py b/allensdk/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py similarity index 100% rename from brain_observatory/ecephys/file_io/ecephys_sync_dataset.py rename to allensdk/brain_observatory/ecephys/file_io/ecephys_sync_dataset.py diff --git a/brain_observatory/ecephys/file_io/stim_file.py b/allensdk/brain_observatory/ecephys/file_io/stim_file.py similarity index 100% rename from brain_observatory/ecephys/file_io/stim_file.py rename to allensdk/brain_observatory/ecephys/file_io/stim_file.py diff --git a/brain_observatory/ecephys/lfp_subsampling/__init__.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/__init__.py similarity index 100% rename from brain_observatory/ecephys/lfp_subsampling/__init__.py rename to allensdk/brain_observatory/ecephys/lfp_subsampling/__init__.py diff --git a/brain_observatory/ecephys/lfp_subsampling/__main__.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/__main__.py similarity index 100% rename from brain_observatory/ecephys/lfp_subsampling/__main__.py rename to allensdk/brain_observatory/ecephys/lfp_subsampling/__main__.py diff --git a/brain_observatory/ecephys/lfp_subsampling/_schemas.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/_schemas.py similarity index 100% rename from brain_observatory/ecephys/lfp_subsampling/_schemas.py rename to allensdk/brain_observatory/ecephys/lfp_subsampling/_schemas.py diff --git a/brain_observatory/ecephys/lfp_subsampling/subsampling.py b/allensdk/brain_observatory/ecephys/lfp_subsampling/subsampling.py similarity index 100% rename from brain_observatory/ecephys/lfp_subsampling/subsampling.py rename to allensdk/brain_observatory/ecephys/lfp_subsampling/subsampling.py diff --git a/brain_observatory/ecephys/nwb/__init__.py b/allensdk/brain_observatory/ecephys/nwb/__init__.py similarity index 100% rename from brain_observatory/ecephys/nwb/__init__.py rename to allensdk/brain_observatory/ecephys/nwb/__init__.py diff --git a/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py b/allensdk/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py similarity index 100% rename from brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py rename to allensdk/brain_observatory/ecephys/nwb/ecephys_nwb_extension_builder.py diff --git a/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml b/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml similarity index 100% rename from brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml rename to allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.extension.yaml diff --git a/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml b/allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml similarity index 100% rename from brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml rename to allensdk/brain_observatory/ecephys/nwb/ndx-aibs-ecephys.namespace.yaml diff --git a/brain_observatory/ecephys/optotagging_table/__init__.py b/allensdk/brain_observatory/ecephys/optotagging_table/__init__.py similarity index 100% rename from brain_observatory/ecephys/optotagging_table/__init__.py rename to allensdk/brain_observatory/ecephys/optotagging_table/__init__.py diff --git a/brain_observatory/ecephys/optotagging_table/__main__.py b/allensdk/brain_observatory/ecephys/optotagging_table/__main__.py similarity index 100% rename from brain_observatory/ecephys/optotagging_table/__main__.py rename to allensdk/brain_observatory/ecephys/optotagging_table/__main__.py diff --git a/brain_observatory/ecephys/optotagging_table/_schemas.py b/allensdk/brain_observatory/ecephys/optotagging_table/_schemas.py similarity index 100% rename from brain_observatory/ecephys/optotagging_table/_schemas.py rename to allensdk/brain_observatory/ecephys/optotagging_table/_schemas.py diff --git a/brain_observatory/ecephys/stimulus_analysis/__init__.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/__init__.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/__init__.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/__init__.py diff --git a/brain_observatory/ecephys/stimulus_analysis/__main__.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/__main__.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/__main__.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/__main__.py diff --git a/brain_observatory/ecephys/stimulus_analysis/_schemas.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/_schemas.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/_schemas.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/_schemas.py diff --git a/brain_observatory/ecephys/stimulus_analysis/dot_motion.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/dot_motion.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/dot_motion.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/dot_motion.py diff --git a/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/drifting_gratings.py diff --git a/brain_observatory/ecephys/stimulus_analysis/flashes.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/flashes.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/flashes.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/flashes.py diff --git a/brain_observatory/ecephys/stimulus_analysis/natural_movies.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_movies.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/natural_movies.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/natural_movies.py diff --git a/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/natural_scenes.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/natural_scenes.py diff --git a/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/receptive_field_mapping.py diff --git a/brain_observatory/ecephys/stimulus_analysis/static_gratings.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/static_gratings.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/static_gratings.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/static_gratings.py diff --git a/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py b/allensdk/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py similarity index 100% rename from brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py rename to allensdk/brain_observatory/ecephys/stimulus_analysis/stimulus_analysis.py diff --git a/brain_observatory/ecephys/stimulus_sync.py b/allensdk/brain_observatory/ecephys/stimulus_sync.py similarity index 100% rename from brain_observatory/ecephys/stimulus_sync.py rename to allensdk/brain_observatory/ecephys/stimulus_sync.py diff --git a/brain_observatory/ecephys/stimulus_table/__init__.py b/allensdk/brain_observatory/ecephys/stimulus_table/__init__.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/__init__.py rename to allensdk/brain_observatory/ecephys/stimulus_table/__init__.py diff --git a/brain_observatory/ecephys/stimulus_table/__main__.py b/allensdk/brain_observatory/ecephys/stimulus_table/__main__.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/__main__.py rename to allensdk/brain_observatory/ecephys/stimulus_table/__main__.py diff --git a/brain_observatory/ecephys/stimulus_table/_schemas.py b/allensdk/brain_observatory/ecephys/stimulus_table/_schemas.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/_schemas.py rename to allensdk/brain_observatory/ecephys/stimulus_table/_schemas.py diff --git a/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py b/allensdk/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py rename to allensdk/brain_observatory/ecephys/stimulus_table/ephys_pre_spikes.py diff --git a/brain_observatory/ecephys/stimulus_table/naming_utilities.py b/allensdk/brain_observatory/ecephys/stimulus_table/naming_utilities.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/naming_utilities.py rename to allensdk/brain_observatory/ecephys/stimulus_table/naming_utilities.py diff --git a/brain_observatory/ecephys/stimulus_table/output_validation.py b/allensdk/brain_observatory/ecephys/stimulus_table/output_validation.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/output_validation.py rename to allensdk/brain_observatory/ecephys/stimulus_table/output_validation.py diff --git a/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py b/allensdk/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py rename to allensdk/brain_observatory/ecephys/stimulus_table/stimulus_parameter_extraction.py diff --git a/brain_observatory/ecephys/stimulus_table/visualization/__init__.py b/allensdk/brain_observatory/ecephys/stimulus_table/visualization/__init__.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/visualization/__init__.py rename to allensdk/brain_observatory/ecephys/stimulus_table/visualization/__init__.py diff --git a/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py b/allensdk/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py similarity index 100% rename from brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py rename to allensdk/brain_observatory/ecephys/stimulus_table/visualization/view_blocks.py diff --git a/brain_observatory/ecephys/visualization/__init__.py b/allensdk/brain_observatory/ecephys/visualization/__init__.py similarity index 100% rename from brain_observatory/ecephys/visualization/__init__.py rename to allensdk/brain_observatory/ecephys/visualization/__init__.py diff --git a/brain_observatory/ecephys/write_nwb/__init__.py b/allensdk/brain_observatory/ecephys/write_nwb/__init__.py similarity index 100% rename from brain_observatory/ecephys/write_nwb/__init__.py rename to allensdk/brain_observatory/ecephys/write_nwb/__init__.py diff --git a/brain_observatory/ecephys/write_nwb/__main__.py b/allensdk/brain_observatory/ecephys/write_nwb/__main__.py similarity index 100% rename from brain_observatory/ecephys/write_nwb/__main__.py rename to allensdk/brain_observatory/ecephys/write_nwb/__main__.py diff --git a/brain_observatory/ecephys/write_nwb/_schemas.py b/allensdk/brain_observatory/ecephys/write_nwb/_schemas.py similarity index 100% rename from brain_observatory/ecephys/write_nwb/_schemas.py rename to allensdk/brain_observatory/ecephys/write_nwb/_schemas.py diff --git a/brain_observatory/extract_running_speed/__init__.py b/allensdk/brain_observatory/extract_running_speed/__init__.py similarity index 100% rename from brain_observatory/extract_running_speed/__init__.py rename to allensdk/brain_observatory/extract_running_speed/__init__.py diff --git a/brain_observatory/extract_running_speed/__main__.py b/allensdk/brain_observatory/extract_running_speed/__main__.py similarity index 100% rename from brain_observatory/extract_running_speed/__main__.py rename to allensdk/brain_observatory/extract_running_speed/__main__.py diff --git a/brain_observatory/extract_running_speed/_schemas.py b/allensdk/brain_observatory/extract_running_speed/_schemas.py similarity index 100% rename from brain_observatory/extract_running_speed/_schemas.py rename to allensdk/brain_observatory/extract_running_speed/_schemas.py diff --git a/brain_observatory/eye_tracking/__main__.py b/allensdk/brain_observatory/eye_tracking/__main__.py similarity index 100% rename from brain_observatory/eye_tracking/__main__.py rename to allensdk/brain_observatory/eye_tracking/__main__.py diff --git a/brain_observatory/eye_tracking/_schemas.py b/allensdk/brain_observatory/eye_tracking/_schemas.py similarity index 100% rename from brain_observatory/eye_tracking/_schemas.py rename to allensdk/brain_observatory/eye_tracking/_schemas.py diff --git a/brain_observatory/eye_tracking/build.py b/allensdk/brain_observatory/eye_tracking/build.py similarity index 100% rename from brain_observatory/eye_tracking/build.py rename to allensdk/brain_observatory/eye_tracking/build.py diff --git a/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py b/allensdk/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py similarity index 100% rename from brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py rename to allensdk/brain_observatory/eye_tracking/stage_1/DLC_Eye_Tracking.py diff --git a/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py b/allensdk/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py similarity index 100% rename from brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py rename to allensdk/brain_observatory/eye_tracking/stage_2/DLC_Ellipse_Fitting.py diff --git a/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py b/allensdk/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py similarity index 100% rename from brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py rename to allensdk/brain_observatory/eye_tracking/stage_3/DLC_Labeled_Video.py diff --git a/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py b/allensdk/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py similarity index 100% rename from brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py rename to allensdk/brain_observatory/eye_tracking/stage_4/DLC_Ellipse_Video.py diff --git a/brain_observatory/findlevel.py b/allensdk/brain_observatory/findlevel.py similarity index 100% rename from brain_observatory/findlevel.py rename to allensdk/brain_observatory/findlevel.py diff --git a/brain_observatory/gaze_mapping/__init__.py b/allensdk/brain_observatory/gaze_mapping/__init__.py similarity index 100% rename from brain_observatory/gaze_mapping/__init__.py rename to allensdk/brain_observatory/gaze_mapping/__init__.py diff --git a/brain_observatory/gaze_mapping/__main__.py b/allensdk/brain_observatory/gaze_mapping/__main__.py similarity index 100% rename from brain_observatory/gaze_mapping/__main__.py rename to allensdk/brain_observatory/gaze_mapping/__main__.py diff --git a/brain_observatory/gaze_mapping/_filter_utils.py b/allensdk/brain_observatory/gaze_mapping/_filter_utils.py similarity index 100% rename from brain_observatory/gaze_mapping/_filter_utils.py rename to allensdk/brain_observatory/gaze_mapping/_filter_utils.py diff --git a/brain_observatory/gaze_mapping/_gaze_mapper.py b/allensdk/brain_observatory/gaze_mapping/_gaze_mapper.py similarity index 100% rename from brain_observatory/gaze_mapping/_gaze_mapper.py rename to allensdk/brain_observatory/gaze_mapping/_gaze_mapper.py diff --git a/brain_observatory/gaze_mapping/_schemas.py b/allensdk/brain_observatory/gaze_mapping/_schemas.py similarity index 100% rename from brain_observatory/gaze_mapping/_schemas.py rename to allensdk/brain_observatory/gaze_mapping/_schemas.py diff --git a/brain_observatory/locally_sparse_noise.py b/allensdk/brain_observatory/locally_sparse_noise.py similarity index 100% rename from brain_observatory/locally_sparse_noise.py rename to allensdk/brain_observatory/locally_sparse_noise.py diff --git a/brain_observatory/natural_movie.py b/allensdk/brain_observatory/natural_movie.py similarity index 100% rename from brain_observatory/natural_movie.py rename to allensdk/brain_observatory/natural_movie.py diff --git a/brain_observatory/natural_scenes.py b/allensdk/brain_observatory/natural_scenes.py similarity index 100% rename from brain_observatory/natural_scenes.py rename to allensdk/brain_observatory/natural_scenes.py diff --git a/brain_observatory/nwb/__init__.py b/allensdk/brain_observatory/nwb/__init__.py similarity index 100% rename from brain_observatory/nwb/__init__.py rename to allensdk/brain_observatory/nwb/__init__.py diff --git a/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py b/allensdk/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py similarity index 100% rename from brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py rename to allensdk/brain_observatory/nwb/behavior_ophys_nwb_extension_builder.py diff --git a/brain_observatory/nwb/eye_tracking/__init__.py b/allensdk/brain_observatory/nwb/eye_tracking/__init__.py similarity index 100% rename from brain_observatory/nwb/eye_tracking/__init__.py rename to allensdk/brain_observatory/nwb/eye_tracking/__init__.py diff --git a/brain_observatory/nwb/eye_tracking/extension_builder.py b/allensdk/brain_observatory/nwb/eye_tracking/extension_builder.py similarity index 100% rename from brain_observatory/nwb/eye_tracking/extension_builder.py rename to allensdk/brain_observatory/nwb/eye_tracking/extension_builder.py diff --git a/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml b/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml similarity index 100% rename from brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml rename to allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.extensions.yaml diff --git a/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml b/allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml similarity index 100% rename from brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml rename to allensdk/brain_observatory/nwb/eye_tracking/ndx-ellipse-eye-tracking.namespace.yaml diff --git a/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py b/allensdk/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py similarity index 100% rename from brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py rename to allensdk/brain_observatory/nwb/eye_tracking/ndx_ellipse_eye_tracking.py diff --git a/brain_observatory/nwb/metadata.py b/allensdk/brain_observatory/nwb/metadata.py similarity index 100% rename from brain_observatory/nwb/metadata.py rename to allensdk/brain_observatory/nwb/metadata.py diff --git a/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml b/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml similarity index 100% rename from brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml rename to allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.extension.yaml diff --git a/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml b/allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml similarity index 100% rename from brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml rename to allensdk/brain_observatory/nwb/ndx-aibs-behavior-ophys.namespace.yaml diff --git a/brain_observatory/nwb/nwb_api.py b/allensdk/brain_observatory/nwb/nwb_api.py similarity index 100% rename from brain_observatory/nwb/nwb_api.py rename to allensdk/brain_observatory/nwb/nwb_api.py diff --git a/brain_observatory/nwb/nwb_utils.py b/allensdk/brain_observatory/nwb/nwb_utils.py similarity index 100% rename from brain_observatory/nwb/nwb_utils.py rename to allensdk/brain_observatory/nwb/nwb_utils.py diff --git a/brain_observatory/nwb/schemas.py b/allensdk/brain_observatory/nwb/schemas.py similarity index 100% rename from brain_observatory/nwb/schemas.py rename to allensdk/brain_observatory/nwb/schemas.py diff --git a/brain_observatory/observatory_plots.py b/allensdk/brain_observatory/observatory_plots.py similarity index 100% rename from brain_observatory/observatory_plots.py rename to allensdk/brain_observatory/observatory_plots.py diff --git a/brain_observatory/ophys/__init__.py b/allensdk/brain_observatory/ophys/__init__.py similarity index 100% rename from brain_observatory/ophys/__init__.py rename to allensdk/brain_observatory/ophys/__init__.py diff --git a/brain_observatory/ophys/trace_extraction/__init__.py b/allensdk/brain_observatory/ophys/trace_extraction/__init__.py similarity index 100% rename from brain_observatory/ophys/trace_extraction/__init__.py rename to allensdk/brain_observatory/ophys/trace_extraction/__init__.py diff --git a/brain_observatory/ophys/trace_extraction/__main__.py b/allensdk/brain_observatory/ophys/trace_extraction/__main__.py similarity index 100% rename from brain_observatory/ophys/trace_extraction/__main__.py rename to allensdk/brain_observatory/ophys/trace_extraction/__main__.py diff --git a/brain_observatory/ophys/trace_extraction/_schemas.py b/allensdk/brain_observatory/ophys/trace_extraction/_schemas.py similarity index 100% rename from brain_observatory/ophys/trace_extraction/_schemas.py rename to allensdk/brain_observatory/ophys/trace_extraction/_schemas.py diff --git a/brain_observatory/r_neuropil.py b/allensdk/brain_observatory/r_neuropil.py similarity index 100% rename from brain_observatory/r_neuropil.py rename to allensdk/brain_observatory/r_neuropil.py diff --git a/brain_observatory/receptive_field_analysis/__init__.py b/allensdk/brain_observatory/receptive_field_analysis/__init__.py similarity index 100% rename from brain_observatory/receptive_field_analysis/__init__.py rename to allensdk/brain_observatory/receptive_field_analysis/__init__.py diff --git a/brain_observatory/receptive_field_analysis/chisquarerf.py b/allensdk/brain_observatory/receptive_field_analysis/chisquarerf.py similarity index 100% rename from brain_observatory/receptive_field_analysis/chisquarerf.py rename to allensdk/brain_observatory/receptive_field_analysis/chisquarerf.py diff --git a/brain_observatory/receptive_field_analysis/eventdetection.py b/allensdk/brain_observatory/receptive_field_analysis/eventdetection.py similarity index 100% rename from brain_observatory/receptive_field_analysis/eventdetection.py rename to allensdk/brain_observatory/receptive_field_analysis/eventdetection.py diff --git a/brain_observatory/receptive_field_analysis/fit_parameters.py b/allensdk/brain_observatory/receptive_field_analysis/fit_parameters.py similarity index 100% rename from brain_observatory/receptive_field_analysis/fit_parameters.py rename to allensdk/brain_observatory/receptive_field_analysis/fit_parameters.py diff --git a/brain_observatory/receptive_field_analysis/fitgaussian2D.py b/allensdk/brain_observatory/receptive_field_analysis/fitgaussian2D.py similarity index 100% rename from brain_observatory/receptive_field_analysis/fitgaussian2D.py rename to allensdk/brain_observatory/receptive_field_analysis/fitgaussian2D.py diff --git a/brain_observatory/receptive_field_analysis/postprocessing.py b/allensdk/brain_observatory/receptive_field_analysis/postprocessing.py similarity index 100% rename from brain_observatory/receptive_field_analysis/postprocessing.py rename to allensdk/brain_observatory/receptive_field_analysis/postprocessing.py diff --git a/brain_observatory/receptive_field_analysis/receptive_field.py b/allensdk/brain_observatory/receptive_field_analysis/receptive_field.py similarity index 100% rename from brain_observatory/receptive_field_analysis/receptive_field.py rename to allensdk/brain_observatory/receptive_field_analysis/receptive_field.py diff --git a/brain_observatory/receptive_field_analysis/tools.py b/allensdk/brain_observatory/receptive_field_analysis/tools.py similarity index 100% rename from brain_observatory/receptive_field_analysis/tools.py rename to allensdk/brain_observatory/receptive_field_analysis/tools.py diff --git a/brain_observatory/receptive_field_analysis/utilities.py b/allensdk/brain_observatory/receptive_field_analysis/utilities.py similarity index 100% rename from brain_observatory/receptive_field_analysis/utilities.py rename to allensdk/brain_observatory/receptive_field_analysis/utilities.py diff --git a/brain_observatory/receptive_field_analysis/visualization.py b/allensdk/brain_observatory/receptive_field_analysis/visualization.py similarity index 100% rename from brain_observatory/receptive_field_analysis/visualization.py rename to allensdk/brain_observatory/receptive_field_analysis/visualization.py diff --git a/brain_observatory/roi_masks.py b/allensdk/brain_observatory/roi_masks.py similarity index 100% rename from brain_observatory/roi_masks.py rename to allensdk/brain_observatory/roi_masks.py diff --git a/brain_observatory/running_speed.py b/allensdk/brain_observatory/running_speed.py similarity index 100% rename from brain_observatory/running_speed.py rename to allensdk/brain_observatory/running_speed.py diff --git a/brain_observatory/session_analysis.py b/allensdk/brain_observatory/session_analysis.py similarity index 100% rename from brain_observatory/session_analysis.py rename to allensdk/brain_observatory/session_analysis.py diff --git a/brain_observatory/session_api_utils.py b/allensdk/brain_observatory/session_api_utils.py similarity index 100% rename from brain_observatory/session_api_utils.py rename to allensdk/brain_observatory/session_api_utils.py diff --git a/brain_observatory/static_gratings.py b/allensdk/brain_observatory/static_gratings.py similarity index 100% rename from brain_observatory/static_gratings.py rename to allensdk/brain_observatory/static_gratings.py diff --git a/brain_observatory/stimulus_analysis.py b/allensdk/brain_observatory/stimulus_analysis.py similarity index 100% rename from brain_observatory/stimulus_analysis.py rename to allensdk/brain_observatory/stimulus_analysis.py diff --git a/brain_observatory/stimulus_info.py b/allensdk/brain_observatory/stimulus_info.py similarity index 100% rename from brain_observatory/stimulus_info.py rename to allensdk/brain_observatory/stimulus_info.py diff --git a/brain_observatory/sync_dataset.py b/allensdk/brain_observatory/sync_dataset.py similarity index 100% rename from brain_observatory/sync_dataset.py rename to allensdk/brain_observatory/sync_dataset.py diff --git a/brain_observatory/sync_utilities/__init__.py b/allensdk/brain_observatory/sync_utilities/__init__.py similarity index 100% rename from brain_observatory/sync_utilities/__init__.py rename to allensdk/brain_observatory/sync_utilities/__init__.py diff --git a/brain_observatory/visualization/__init__.py b/allensdk/brain_observatory/visualization/__init__.py similarity index 100% rename from brain_observatory/visualization/__init__.py rename to allensdk/brain_observatory/visualization/__init__.py diff --git a/config/__init__.py b/allensdk/config/__init__.py similarity index 100% rename from config/__init__.py rename to allensdk/config/__init__.py diff --git a/config/app/__init__.py b/allensdk/config/app/__init__.py similarity index 100% rename from config/app/__init__.py rename to allensdk/config/app/__init__.py diff --git a/config/app/application_config.py b/allensdk/config/app/application_config.py similarity index 100% rename from config/app/application_config.py rename to allensdk/config/app/application_config.py diff --git a/config/app/logging.conf b/allensdk/config/app/logging.conf similarity index 100% rename from config/app/logging.conf rename to allensdk/config/app/logging.conf diff --git a/config/manifest.py b/allensdk/config/manifest.py similarity index 100% rename from config/manifest.py rename to allensdk/config/manifest.py diff --git a/config/manifest_builder.py b/allensdk/config/manifest_builder.py similarity index 100% rename from config/manifest_builder.py rename to allensdk/config/manifest_builder.py diff --git a/config/model/__init__.py b/allensdk/config/model/__init__.py similarity index 100% rename from config/model/__init__.py rename to allensdk/config/model/__init__.py diff --git a/config/model/description.py b/allensdk/config/model/description.py similarity index 100% rename from config/model/description.py rename to allensdk/config/model/description.py diff --git a/config/model/description_parser.py b/allensdk/config/model/description_parser.py similarity index 100% rename from config/model/description_parser.py rename to allensdk/config/model/description_parser.py diff --git a/config/model/formats/__init__.py b/allensdk/config/model/formats/__init__.py similarity index 100% rename from config/model/formats/__init__.py rename to allensdk/config/model/formats/__init__.py diff --git a/config/model/formats/hdf5_util.py b/allensdk/config/model/formats/hdf5_util.py similarity index 100% rename from config/model/formats/hdf5_util.py rename to allensdk/config/model/formats/hdf5_util.py diff --git a/config/model/formats/json_description_parser.py b/allensdk/config/model/formats/json_description_parser.py similarity index 100% rename from config/model/formats/json_description_parser.py rename to allensdk/config/model/formats/json_description_parser.py diff --git a/config/model/formats/pycfg_description_parser.py b/allensdk/config/model/formats/pycfg_description_parser.py similarity index 100% rename from config/model/formats/pycfg_description_parser.py rename to allensdk/config/model/formats/pycfg_description_parser.py diff --git a/core/__init__.py b/allensdk/core/__init__.py similarity index 100% rename from core/__init__.py rename to allensdk/core/__init__.py diff --git a/core/auth_config.py b/allensdk/core/auth_config.py similarity index 100% rename from core/auth_config.py rename to allensdk/core/auth_config.py diff --git a/core/authentication.py b/allensdk/core/authentication.py similarity index 100% rename from core/authentication.py rename to allensdk/core/authentication.py diff --git a/core/brain_observatory_cache.py b/allensdk/core/brain_observatory_cache.py similarity index 100% rename from core/brain_observatory_cache.py rename to allensdk/core/brain_observatory_cache.py diff --git a/core/brain_observatory_nwb_data_set.py b/allensdk/core/brain_observatory_nwb_data_set.py similarity index 100% rename from core/brain_observatory_nwb_data_set.py rename to allensdk/core/brain_observatory_nwb_data_set.py diff --git a/core/cache_method_utilities.py b/allensdk/core/cache_method_utilities.py similarity index 100% rename from core/cache_method_utilities.py rename to allensdk/core/cache_method_utilities.py diff --git a/core/cell_types_cache.py b/allensdk/core/cell_types_cache.py similarity index 100% rename from core/cell_types_cache.py rename to allensdk/core/cell_types_cache.py diff --git a/core/dat_utilities.py b/allensdk/core/dat_utilities.py similarity index 100% rename from core/dat_utilities.py rename to allensdk/core/dat_utilities.py diff --git a/core/exceptions.py b/allensdk/core/exceptions.py similarity index 100% rename from core/exceptions.py rename to allensdk/core/exceptions.py diff --git a/core/h5_utilities.py b/allensdk/core/h5_utilities.py similarity index 100% rename from core/h5_utilities.py rename to allensdk/core/h5_utilities.py diff --git a/core/json_utilities.py b/allensdk/core/json_utilities.py similarity index 100% rename from core/json_utilities.py rename to allensdk/core/json_utilities.py diff --git a/core/lazy_property/__init__.py b/allensdk/core/lazy_property/__init__.py similarity index 100% rename from core/lazy_property/__init__.py rename to allensdk/core/lazy_property/__init__.py diff --git a/core/lazy_property/lazy_property.py b/allensdk/core/lazy_property/lazy_property.py similarity index 100% rename from core/lazy_property/lazy_property.py rename to allensdk/core/lazy_property/lazy_property.py diff --git a/core/lazy_property/lazy_property_mixin.py b/allensdk/core/lazy_property/lazy_property_mixin.py similarity index 100% rename from core/lazy_property/lazy_property_mixin.py rename to allensdk/core/lazy_property/lazy_property_mixin.py diff --git a/core/mouse_connectivity_cache.py b/allensdk/core/mouse_connectivity_cache.py similarity index 100% rename from core/mouse_connectivity_cache.py rename to allensdk/core/mouse_connectivity_cache.py diff --git a/core/nwb_data_set.py b/allensdk/core/nwb_data_set.py similarity index 100% rename from core/nwb_data_set.py rename to allensdk/core/nwb_data_set.py diff --git a/core/obj_utilities.py b/allensdk/core/obj_utilities.py similarity index 100% rename from core/obj_utilities.py rename to allensdk/core/obj_utilities.py diff --git a/core/ontology.py b/allensdk/core/ontology.py similarity index 100% rename from core/ontology.py rename to allensdk/core/ontology.py diff --git a/core/ophys_experiment_session_id_mapping.py b/allensdk/core/ophys_experiment_session_id_mapping.py similarity index 100% rename from core/ophys_experiment_session_id_mapping.py rename to allensdk/core/ophys_experiment_session_id_mapping.py diff --git a/core/reference_space.py b/allensdk/core/reference_space.py similarity index 100% rename from core/reference_space.py rename to allensdk/core/reference_space.py diff --git a/core/reference_space_cache.py b/allensdk/core/reference_space_cache.py similarity index 100% rename from core/reference_space_cache.py rename to allensdk/core/reference_space_cache.py diff --git a/core/simple_tree.py b/allensdk/core/simple_tree.py similarity index 100% rename from core/simple_tree.py rename to allensdk/core/simple_tree.py diff --git a/core/sitk_utilities.py b/allensdk/core/sitk_utilities.py similarity index 100% rename from core/sitk_utilities.py rename to allensdk/core/sitk_utilities.py diff --git a/core/structure_tree.py b/allensdk/core/structure_tree.py similarity index 100% rename from core/structure_tree.py rename to allensdk/core/structure_tree.py diff --git a/core/swc.py b/allensdk/core/swc.py similarity index 100% rename from core/swc.py rename to allensdk/core/swc.py diff --git a/core/typing.py b/allensdk/core/typing.py similarity index 100% rename from core/typing.py rename to allensdk/core/typing.py diff --git a/deprecated.py b/allensdk/deprecated.py similarity index 100% rename from deprecated.py rename to allensdk/deprecated.py diff --git a/ephys/__init__.py b/allensdk/ephys/__init__.py similarity index 100% rename from ephys/__init__.py rename to allensdk/ephys/__init__.py diff --git a/ephys/ephys_extractor.py b/allensdk/ephys/ephys_extractor.py similarity index 100% rename from ephys/ephys_extractor.py rename to allensdk/ephys/ephys_extractor.py diff --git a/ephys/ephys_features.py b/allensdk/ephys/ephys_features.py similarity index 100% rename from ephys/ephys_features.py rename to allensdk/ephys/ephys_features.py diff --git a/ephys/extract_cell_features.py b/allensdk/ephys/extract_cell_features.py similarity index 100% rename from ephys/extract_cell_features.py rename to allensdk/ephys/extract_cell_features.py diff --git a/ephys/feature_extractor.py b/allensdk/ephys/feature_extractor.py similarity index 100% rename from ephys/feature_extractor.py rename to allensdk/ephys/feature_extractor.py diff --git a/internal/__init__.py b/allensdk/internal/__init__.py similarity index 100% rename from internal/__init__.py rename to allensdk/internal/__init__.py diff --git a/internal/api/__init__.py b/allensdk/internal/api/__init__.py similarity index 100% rename from internal/api/__init__.py rename to allensdk/internal/api/__init__.py diff --git a/internal/api/api_prerelease.py b/allensdk/internal/api/api_prerelease.py similarity index 100% rename from internal/api/api_prerelease.py rename to allensdk/internal/api/api_prerelease.py diff --git a/internal/api/lims_api.py b/allensdk/internal/api/lims_api.py similarity index 100% rename from internal/api/lims_api.py rename to allensdk/internal/api/lims_api.py diff --git a/internal/api/mtrain_api.py b/allensdk/internal/api/mtrain_api.py similarity index 100% rename from internal/api/mtrain_api.py rename to allensdk/internal/api/mtrain_api.py diff --git a/internal/api/queries/__init__.py b/allensdk/internal/api/queries/__init__.py similarity index 100% rename from internal/api/queries/__init__.py rename to allensdk/internal/api/queries/__init__.py diff --git a/internal/api/queries/biophysical_module_api.py b/allensdk/internal/api/queries/biophysical_module_api.py similarity index 100% rename from internal/api/queries/biophysical_module_api.py rename to allensdk/internal/api/queries/biophysical_module_api.py diff --git a/internal/api/queries/biophysical_module_reader.py b/allensdk/internal/api/queries/biophysical_module_reader.py similarity index 100% rename from internal/api/queries/biophysical_module_reader.py rename to allensdk/internal/api/queries/biophysical_module_reader.py diff --git a/internal/api/queries/grid_data_api_prerelease.py b/allensdk/internal/api/queries/grid_data_api_prerelease.py similarity index 100% rename from internal/api/queries/grid_data_api_prerelease.py rename to allensdk/internal/api/queries/grid_data_api_prerelease.py diff --git a/internal/api/queries/mouse_connectivity_api_prerelease.py b/allensdk/internal/api/queries/mouse_connectivity_api_prerelease.py similarity index 100% rename from internal/api/queries/mouse_connectivity_api_prerelease.py rename to allensdk/internal/api/queries/mouse_connectivity_api_prerelease.py diff --git a/internal/api/queries/optimize_config_reader.py b/allensdk/internal/api/queries/optimize_config_reader.py similarity index 100% rename from internal/api/queries/optimize_config_reader.py rename to allensdk/internal/api/queries/optimize_config_reader.py diff --git a/internal/api/queries/pre_release.py b/allensdk/internal/api/queries/pre_release.py similarity index 100% rename from internal/api/queries/pre_release.py rename to allensdk/internal/api/queries/pre_release.py diff --git a/internal/brain_observatory/__init__.py b/allensdk/internal/brain_observatory/__init__.py similarity index 100% rename from internal/brain_observatory/__init__.py rename to allensdk/internal/brain_observatory/__init__.py diff --git a/internal/brain_observatory/annotated_region_metrics.py b/allensdk/internal/brain_observatory/annotated_region_metrics.py similarity index 100% rename from internal/brain_observatory/annotated_region_metrics.py rename to allensdk/internal/brain_observatory/annotated_region_metrics.py diff --git a/internal/brain_observatory/demix_report.py b/allensdk/internal/brain_observatory/demix_report.py similarity index 100% rename from internal/brain_observatory/demix_report.py rename to allensdk/internal/brain_observatory/demix_report.py diff --git a/internal/brain_observatory/demixer.py b/allensdk/internal/brain_observatory/demixer.py similarity index 100% rename from internal/brain_observatory/demixer.py rename to allensdk/internal/brain_observatory/demixer.py diff --git a/internal/brain_observatory/eye_calibration.py b/allensdk/internal/brain_observatory/eye_calibration.py similarity index 100% rename from internal/brain_observatory/eye_calibration.py rename to allensdk/internal/brain_observatory/eye_calibration.py diff --git a/internal/brain_observatory/fit_ellipse.py b/allensdk/internal/brain_observatory/fit_ellipse.py similarity index 100% rename from internal/brain_observatory/fit_ellipse.py rename to allensdk/internal/brain_observatory/fit_ellipse.py diff --git a/internal/brain_observatory/frame_stream.py b/allensdk/internal/brain_observatory/frame_stream.py similarity index 100% rename from internal/brain_observatory/frame_stream.py rename to allensdk/internal/brain_observatory/frame_stream.py diff --git a/internal/brain_observatory/itracker.py b/allensdk/internal/brain_observatory/itracker.py similarity index 100% rename from internal/brain_observatory/itracker.py rename to allensdk/internal/brain_observatory/itracker.py diff --git a/internal/brain_observatory/itracker_utils.py b/allensdk/internal/brain_observatory/itracker_utils.py similarity index 100% rename from internal/brain_observatory/itracker_utils.py rename to allensdk/internal/brain_observatory/itracker_utils.py diff --git a/internal/brain_observatory/mask_set.py b/allensdk/internal/brain_observatory/mask_set.py similarity index 100% rename from internal/brain_observatory/mask_set.py rename to allensdk/internal/brain_observatory/mask_set.py diff --git a/internal/brain_observatory/ophys_session_decomposition.py b/allensdk/internal/brain_observatory/ophys_session_decomposition.py similarity index 100% rename from internal/brain_observatory/ophys_session_decomposition.py rename to allensdk/internal/brain_observatory/ophys_session_decomposition.py diff --git a/internal/brain_observatory/resources/__init__.py b/allensdk/internal/brain_observatory/resources/__init__.py similarity index 100% rename from internal/brain_observatory/resources/__init__.py rename to allensdk/internal/brain_observatory/resources/__init__.py diff --git a/internal/brain_observatory/resources/roi_filter_training_criteria.json b/allensdk/internal/brain_observatory/resources/roi_filter_training_criteria.json similarity index 100% rename from internal/brain_observatory/resources/roi_filter_training_criteria.json rename to allensdk/internal/brain_observatory/resources/roi_filter_training_criteria.json diff --git a/internal/brain_observatory/roi_filter.py b/allensdk/internal/brain_observatory/roi_filter.py similarity index 100% rename from internal/brain_observatory/roi_filter.py rename to allensdk/internal/brain_observatory/roi_filter.py diff --git a/internal/brain_observatory/roi_filter_utils.py b/allensdk/internal/brain_observatory/roi_filter_utils.py similarity index 100% rename from internal/brain_observatory/roi_filter_utils.py rename to allensdk/internal/brain_observatory/roi_filter_utils.py diff --git a/internal/brain_observatory/run_itracker.py b/allensdk/internal/brain_observatory/run_itracker.py similarity index 100% rename from internal/brain_observatory/run_itracker.py rename to allensdk/internal/brain_observatory/run_itracker.py diff --git a/internal/brain_observatory/time_sync.py b/allensdk/internal/brain_observatory/time_sync.py similarity index 100% rename from internal/brain_observatory/time_sync.py rename to allensdk/internal/brain_observatory/time_sync.py diff --git a/internal/core/__init__.py b/allensdk/internal/core/__init__.py similarity index 100% rename from internal/core/__init__.py rename to allensdk/internal/core/__init__.py diff --git a/internal/core/lims_pipeline_module.py b/allensdk/internal/core/lims_pipeline_module.py similarity index 100% rename from internal/core/lims_pipeline_module.py rename to allensdk/internal/core/lims_pipeline_module.py diff --git a/internal/core/lims_utilities.py b/allensdk/internal/core/lims_utilities.py similarity index 100% rename from internal/core/lims_utilities.py rename to allensdk/internal/core/lims_utilities.py diff --git a/internal/core/mouse_connectivity_cache_prerelease.py b/allensdk/internal/core/mouse_connectivity_cache_prerelease.py similarity index 100% rename from internal/core/mouse_connectivity_cache_prerelease.py rename to allensdk/internal/core/mouse_connectivity_cache_prerelease.py diff --git a/internal/core/simpletree.py b/allensdk/internal/core/simpletree.py similarity index 100% rename from internal/core/simpletree.py rename to allensdk/internal/core/simpletree.py diff --git a/internal/core/swc.py b/allensdk/internal/core/swc.py similarity index 100% rename from internal/core/swc.py rename to allensdk/internal/core/swc.py diff --git a/internal/ephys/__init__.py b/allensdk/internal/ephys/__init__.py similarity index 100% rename from internal/ephys/__init__.py rename to allensdk/internal/ephys/__init__.py diff --git a/internal/ephys/core_feature_extract.py b/allensdk/internal/ephys/core_feature_extract.py similarity index 100% rename from internal/ephys/core_feature_extract.py rename to allensdk/internal/ephys/core_feature_extract.py diff --git a/internal/ephys/plot_qc_figures.py b/allensdk/internal/ephys/plot_qc_figures.py similarity index 100% rename from internal/ephys/plot_qc_figures.py rename to allensdk/internal/ephys/plot_qc_figures.py diff --git a/internal/ephys/plot_qc_figures3.py b/allensdk/internal/ephys/plot_qc_figures3.py similarity index 100% rename from internal/ephys/plot_qc_figures3.py rename to allensdk/internal/ephys/plot_qc_figures3.py diff --git a/internal/model/AIC.py b/allensdk/internal/model/AIC.py similarity index 100% rename from internal/model/AIC.py rename to allensdk/internal/model/AIC.py diff --git a/internal/model/GLM.py b/allensdk/internal/model/GLM.py similarity index 100% rename from internal/model/GLM.py rename to allensdk/internal/model/GLM.py diff --git a/internal/model/__init__.py b/allensdk/internal/model/__init__.py similarity index 100% rename from internal/model/__init__.py rename to allensdk/internal/model/__init__.py diff --git a/internal/model/biophysical/__init__.py b/allensdk/internal/model/biophysical/__init__.py similarity index 100% rename from internal/model/biophysical/__init__.py rename to allensdk/internal/model/biophysical/__init__.py diff --git a/internal/model/biophysical/biophysical_archiver.py b/allensdk/internal/model/biophysical/biophysical_archiver.py similarity index 100% rename from internal/model/biophysical/biophysical_archiver.py rename to allensdk/internal/model/biophysical/biophysical_archiver.py diff --git a/internal/model/biophysical/check_fi_shift.py b/allensdk/internal/model/biophysical/check_fi_shift.py similarity index 100% rename from internal/model/biophysical/check_fi_shift.py rename to allensdk/internal/model/biophysical/check_fi_shift.py diff --git a/internal/model/biophysical/deap_utils.py b/allensdk/internal/model/biophysical/deap_utils.py similarity index 100% rename from internal/model/biophysical/deap_utils.py rename to allensdk/internal/model/biophysical/deap_utils.py diff --git a/internal/model/biophysical/ephys_utils.py b/allensdk/internal/model/biophysical/ephys_utils.py similarity index 100% rename from internal/model/biophysical/ephys_utils.py rename to allensdk/internal/model/biophysical/ephys_utils.py diff --git a/internal/model/biophysical/fit_stage_1.py b/allensdk/internal/model/biophysical/fit_stage_1.py similarity index 100% rename from internal/model/biophysical/fit_stage_1.py rename to allensdk/internal/model/biophysical/fit_stage_1.py diff --git a/internal/model/biophysical/fit_stage_2.py b/allensdk/internal/model/biophysical/fit_stage_2.py similarity index 100% rename from internal/model/biophysical/fit_stage_2.py rename to allensdk/internal/model/biophysical/fit_stage_2.py diff --git a/internal/model/biophysical/fits/__init__.py b/allensdk/internal/model/biophysical/fits/__init__.py similarity index 100% rename from internal/model/biophysical/fits/__init__.py rename to allensdk/internal/model/biophysical/fits/__init__.py diff --git a/internal/model/biophysical/fits/config_base.json b/allensdk/internal/model/biophysical/fits/config_base.json similarity index 100% rename from internal/model/biophysical/fits/config_base.json rename to allensdk/internal/model/biophysical/fits/config_base.json diff --git a/internal/model/biophysical/fits/fit_styles/__init__.py b/allensdk/internal/model/biophysical/fits/fit_styles/__init__.py similarity index 100% rename from internal/model/biophysical/fits/fit_styles/__init__.py rename to allensdk/internal/model/biophysical/fits/fit_styles/__init__.py diff --git a/internal/model/biophysical/fits/fit_styles/f12_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f12_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f12_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f12_fit_style.json diff --git a/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f12_noapic_fit_style.json diff --git a/internal/model/biophysical/fits/fit_styles/f13_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f13_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f13_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f13_fit_style.json diff --git a/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f13_noapic_fit_style.json diff --git a/internal/model/biophysical/fits/fit_styles/f6_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f6_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f6_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f6_fit_style.json diff --git a/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f6_noapic_fit_style.json diff --git a/internal/model/biophysical/fits/fit_styles/f9_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f9_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f9_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f9_fit_style.json diff --git a/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json b/allensdk/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json similarity index 100% rename from internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json rename to allensdk/internal/model/biophysical/fits/fit_styles/f9_noapic_fit_style.json diff --git a/internal/model/biophysical/make_deap_fit_json.py b/allensdk/internal/model/biophysical/make_deap_fit_json.py similarity index 100% rename from internal/model/biophysical/make_deap_fit_json.py rename to allensdk/internal/model/biophysical/make_deap_fit_json.py diff --git a/internal/model/biophysical/neuron_parallel.py b/allensdk/internal/model/biophysical/neuron_parallel.py similarity index 100% rename from internal/model/biophysical/neuron_parallel.py rename to allensdk/internal/model/biophysical/neuron_parallel.py diff --git a/internal/model/biophysical/optimize.py b/allensdk/internal/model/biophysical/optimize.py similarity index 100% rename from internal/model/biophysical/optimize.py rename to allensdk/internal/model/biophysical/optimize.py diff --git a/internal/model/biophysical/passive_fitting/__init__.py b/allensdk/internal/model/biophysical/passive_fitting/__init__.py similarity index 100% rename from internal/model/biophysical/passive_fitting/__init__.py rename to allensdk/internal/model/biophysical/passive_fitting/__init__.py diff --git a/internal/model/biophysical/passive_fitting/neuron_passive_fit.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit.py similarity index 100% rename from internal/model/biophysical/passive_fitting/neuron_passive_fit.py rename to allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit.py diff --git a/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py similarity index 100% rename from internal/model/biophysical/passive_fitting/neuron_passive_fit2.py rename to allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit2.py diff --git a/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py similarity index 100% rename from internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py rename to allensdk/internal/model/biophysical/passive_fitting/neuron_passive_fit_elec.py diff --git a/internal/model/biophysical/passive_fitting/neuron_utils.py b/allensdk/internal/model/biophysical/passive_fitting/neuron_utils.py similarity index 100% rename from internal/model/biophysical/passive_fitting/neuron_utils.py rename to allensdk/internal/model/biophysical/passive_fitting/neuron_utils.py diff --git a/internal/model/biophysical/passive_fitting/output_grabber.py b/allensdk/internal/model/biophysical/passive_fitting/output_grabber.py similarity index 100% rename from internal/model/biophysical/passive_fitting/output_grabber.py rename to allensdk/internal/model/biophysical/passive_fitting/output_grabber.py diff --git a/internal/model/biophysical/passive_fitting/passive/__init__.py b/allensdk/internal/model/biophysical/passive_fitting/passive/__init__.py similarity index 100% rename from internal/model/biophysical/passive_fitting/passive/__init__.py rename to allensdk/internal/model/biophysical/passive_fitting/passive/__init__.py diff --git a/internal/model/biophysical/passive_fitting/preprocess.py b/allensdk/internal/model/biophysical/passive_fitting/preprocess.py similarity index 100% rename from internal/model/biophysical/passive_fitting/preprocess.py rename to allensdk/internal/model/biophysical/passive_fitting/preprocess.py diff --git a/internal/model/biophysical/run_optimize.py b/allensdk/internal/model/biophysical/run_optimize.py similarity index 100% rename from internal/model/biophysical/run_optimize.py rename to allensdk/internal/model/biophysical/run_optimize.py diff --git a/internal/model/biophysical/run_optimize_workflow.py b/allensdk/internal/model/biophysical/run_optimize_workflow.py similarity index 100% rename from internal/model/biophysical/run_optimize_workflow.py rename to allensdk/internal/model/biophysical/run_optimize_workflow.py diff --git a/internal/model/biophysical/run_passive_fit.py b/allensdk/internal/model/biophysical/run_passive_fit.py similarity index 100% rename from internal/model/biophysical/run_passive_fit.py rename to allensdk/internal/model/biophysical/run_passive_fit.py diff --git a/internal/model/biophysical/run_simulate_lims.py b/allensdk/internal/model/biophysical/run_simulate_lims.py similarity index 100% rename from internal/model/biophysical/run_simulate_lims.py rename to allensdk/internal/model/biophysical/run_simulate_lims.py diff --git a/internal/model/biophysical/run_simulate_workflow.py b/allensdk/internal/model/biophysical/run_simulate_workflow.py similarity index 100% rename from internal/model/biophysical/run_simulate_workflow.py rename to allensdk/internal/model/biophysical/run_simulate_workflow.py diff --git a/internal/model/data_access.py b/allensdk/internal/model/data_access.py similarity index 100% rename from internal/model/data_access.py rename to allensdk/internal/model/data_access.py diff --git a/internal/model/glif/ASGLM.py b/allensdk/internal/model/glif/ASGLM.py similarity index 100% rename from internal/model/glif/ASGLM.py rename to allensdk/internal/model/glif/ASGLM.py diff --git a/internal/model/glif/MLIN.py b/allensdk/internal/model/glif/MLIN.py similarity index 100% rename from internal/model/glif/MLIN.py rename to allensdk/internal/model/glif/MLIN.py diff --git a/internal/model/glif/__init__.py b/allensdk/internal/model/glif/__init__.py similarity index 100% rename from internal/model/glif/__init__.py rename to allensdk/internal/model/glif/__init__.py diff --git a/internal/model/glif/are_two_lists_of_arrays_the_same.py b/allensdk/internal/model/glif/are_two_lists_of_arrays_the_same.py similarity index 100% rename from internal/model/glif/are_two_lists_of_arrays_the_same.py rename to allensdk/internal/model/glif/are_two_lists_of_arrays_the_same.py diff --git a/internal/model/glif/configure_model.py b/allensdk/internal/model/glif/configure_model.py similarity index 100% rename from internal/model/glif/configure_model.py rename to allensdk/internal/model/glif/configure_model.py diff --git a/internal/model/glif/error_functions.py b/allensdk/internal/model/glif/error_functions.py similarity index 100% rename from internal/model/glif/error_functions.py rename to allensdk/internal/model/glif/error_functions.py diff --git a/internal/model/glif/find_spikes.py b/allensdk/internal/model/glif/find_spikes.py similarity index 100% rename from internal/model/glif/find_spikes.py rename to allensdk/internal/model/glif/find_spikes.py diff --git a/internal/model/glif/find_sweeps.py b/allensdk/internal/model/glif/find_sweeps.py similarity index 100% rename from internal/model/glif/find_sweeps.py rename to allensdk/internal/model/glif/find_sweeps.py diff --git a/internal/model/glif/glif_experiment.py b/allensdk/internal/model/glif/glif_experiment.py similarity index 100% rename from internal/model/glif/glif_experiment.py rename to allensdk/internal/model/glif/glif_experiment.py diff --git a/internal/model/glif/glif_optimizer.py b/allensdk/internal/model/glif/glif_optimizer.py similarity index 100% rename from internal/model/glif/glif_optimizer.py rename to allensdk/internal/model/glif/glif_optimizer.py diff --git a/internal/model/glif/glif_optimizer_neuron.py b/allensdk/internal/model/glif/glif_optimizer_neuron.py similarity index 100% rename from internal/model/glif/glif_optimizer_neuron.py rename to allensdk/internal/model/glif/glif_optimizer_neuron.py diff --git a/internal/model/glif/optimize_neuron.py b/allensdk/internal/model/glif/optimize_neuron.py similarity index 100% rename from internal/model/glif/optimize_neuron.py rename to allensdk/internal/model/glif/optimize_neuron.py diff --git a/internal/model/glif/plotting.py b/allensdk/internal/model/glif/plotting.py similarity index 100% rename from internal/model/glif/plotting.py rename to allensdk/internal/model/glif/plotting.py diff --git a/internal/model/glif/preprocess_neuron.py b/allensdk/internal/model/glif/preprocess_neuron.py similarity index 100% rename from internal/model/glif/preprocess_neuron.py rename to allensdk/internal/model/glif/preprocess_neuron.py diff --git a/internal/model/glif/rc.py b/allensdk/internal/model/glif/rc.py similarity index 100% rename from internal/model/glif/rc.py rename to allensdk/internal/model/glif/rc.py diff --git a/internal/model/glif/spike_cutting.py b/allensdk/internal/model/glif/spike_cutting.py similarity index 100% rename from internal/model/glif/spike_cutting.py rename to allensdk/internal/model/glif/spike_cutting.py diff --git a/internal/model/glif/threshold_adaptation.py b/allensdk/internal/model/glif/threshold_adaptation.py similarity index 100% rename from internal/model/glif/threshold_adaptation.py rename to allensdk/internal/model/glif/threshold_adaptation.py diff --git a/internal/morphology/__init__.py b/allensdk/internal/morphology/__init__.py similarity index 100% rename from internal/morphology/__init__.py rename to allensdk/internal/morphology/__init__.py diff --git a/internal/morphology/compartment.py b/allensdk/internal/morphology/compartment.py similarity index 100% rename from internal/morphology/compartment.py rename to allensdk/internal/morphology/compartment.py diff --git a/internal/morphology/morphology.py b/allensdk/internal/morphology/morphology.py similarity index 100% rename from internal/morphology/morphology.py rename to allensdk/internal/morphology/morphology.py diff --git a/internal/morphology/morphvis.py b/allensdk/internal/morphology/morphvis.py similarity index 100% rename from internal/morphology/morphvis.py rename to allensdk/internal/morphology/morphvis.py diff --git a/internal/morphology/node.py b/allensdk/internal/morphology/node.py similarity index 100% rename from internal/morphology/node.py rename to allensdk/internal/morphology/node.py diff --git a/internal/morphology/validate_swc.py b/allensdk/internal/morphology/validate_swc.py similarity index 100% rename from internal/morphology/validate_swc.py rename to allensdk/internal/morphology/validate_swc.py diff --git a/internal/mouse_connectivity/__init__.py b/allensdk/internal/mouse_connectivity/__init__.py similarity index 100% rename from internal/mouse_connectivity/__init__.py rename to allensdk/internal/mouse_connectivity/__init__.py diff --git a/internal/mouse_connectivity/interval_unionize/__init__.py b/allensdk/internal/mouse_connectivity/interval_unionize/__init__.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/__init__.py rename to allensdk/internal/mouse_connectivity/interval_unionize/__init__.py diff --git a/internal/mouse_connectivity/interval_unionize/cav_unionize.py b/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionize.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/cav_unionize.py rename to allensdk/internal/mouse_connectivity/interval_unionize/cav_unionize.py diff --git a/internal/mouse_connectivity/interval_unionize/cav_unionizer.py b/allensdk/internal/mouse_connectivity/interval_unionize/cav_unionizer.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/cav_unionizer.py rename to allensdk/internal/mouse_connectivity/interval_unionize/cav_unionizer.py diff --git a/internal/mouse_connectivity/interval_unionize/data_utilities.py b/allensdk/internal/mouse_connectivity/interval_unionize/data_utilities.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/data_utilities.py rename to allensdk/internal/mouse_connectivity/interval_unionize/data_utilities.py diff --git a/internal/mouse_connectivity/interval_unionize/interval_unionizer.py b/allensdk/internal/mouse_connectivity/interval_unionize/interval_unionizer.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/interval_unionizer.py rename to allensdk/internal/mouse_connectivity/interval_unionize/interval_unionizer.py diff --git a/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py b/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py rename to allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_cav.py diff --git a/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py b/allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py rename to allensdk/internal/mouse_connectivity/interval_unionize/run_tissuecyte_unionize_classic.py diff --git a/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py b/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py rename to allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionize_record.py diff --git a/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py b/allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py rename to allensdk/internal/mouse_connectivity/interval_unionize/tissuecyte_unionizer.py diff --git a/internal/mouse_connectivity/interval_unionize/unionize_record.py b/allensdk/internal/mouse_connectivity/interval_unionize/unionize_record.py similarity index 100% rename from internal/mouse_connectivity/interval_unionize/unionize_record.py rename to allensdk/internal/mouse_connectivity/interval_unionize/unionize_record.py diff --git a/internal/mouse_connectivity/projection_thumbnail/__init__.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/__init__.py similarity index 100% rename from internal/mouse_connectivity/projection_thumbnail/__init__.py rename to allensdk/internal/mouse_connectivity/projection_thumbnail/__init__.py diff --git a/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py similarity index 100% rename from internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py rename to allensdk/internal/mouse_connectivity/projection_thumbnail/generate_projection_strip.py diff --git a/internal/mouse_connectivity/projection_thumbnail/image_sheet.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/image_sheet.py similarity index 100% rename from internal/mouse_connectivity/projection_thumbnail/image_sheet.py rename to allensdk/internal/mouse_connectivity/projection_thumbnail/image_sheet.py diff --git a/internal/mouse_connectivity/projection_thumbnail/projection_functions.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/projection_functions.py similarity index 100% rename from internal/mouse_connectivity/projection_thumbnail/projection_functions.py rename to allensdk/internal/mouse_connectivity/projection_thumbnail/projection_functions.py diff --git a/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py similarity index 100% rename from internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py rename to allensdk/internal/mouse_connectivity/projection_thumbnail/visualization_utilities.py diff --git a/internal/mouse_connectivity/projection_thumbnail/volume_projector.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_projector.py similarity index 100% rename from internal/mouse_connectivity/projection_thumbnail/volume_projector.py rename to allensdk/internal/mouse_connectivity/projection_thumbnail/volume_projector.py diff --git a/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py b/allensdk/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py similarity index 100% rename from internal/mouse_connectivity/projection_thumbnail/volume_utilities.py rename to allensdk/internal/mouse_connectivity/projection_thumbnail/volume_utilities.py diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__init__.py b/allensdk/internal/mouse_connectivity/tissuecyte_stitching/__init__.py similarity index 100% rename from internal/mouse_connectivity/tissuecyte_stitching/__init__.py rename to allensdk/internal/mouse_connectivity/tissuecyte_stitching/__init__.py diff --git a/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py b/allensdk/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py similarity index 100% rename from internal/mouse_connectivity/tissuecyte_stitching/stitcher.py rename to allensdk/internal/mouse_connectivity/tissuecyte_stitching/stitcher.py diff --git a/internal/mouse_connectivity/tissuecyte_stitching/tile.py b/allensdk/internal/mouse_connectivity/tissuecyte_stitching/tile.py similarity index 100% rename from internal/mouse_connectivity/tissuecyte_stitching/tile.py rename to allensdk/internal/mouse_connectivity/tissuecyte_stitching/tile.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/convert_igor_nwb.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/extract_nwb_data.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/feature_extraction_module.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/lab_notebook_reader.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/nwb_publish.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/qc.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/qc_support.py diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py b/allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py similarity index 100% rename from internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py rename to allensdk/internal/pipeline_modules/IVSCC/ephys_nwb/resource_file.py diff --git a/internal/pipeline_modules/__init__.py b/allensdk/internal/pipeline_modules/__init__.py similarity index 100% rename from internal/pipeline_modules/__init__.py rename to allensdk/internal/pipeline_modules/__init__.py diff --git a/internal/pipeline_modules/cell_types/morphology/calculate_features.py b/allensdk/internal/pipeline_modules/cell_types/morphology/calculate_features.py similarity index 100% rename from internal/pipeline_modules/cell_types/morphology/calculate_features.py rename to allensdk/internal/pipeline_modules/cell_types/morphology/calculate_features.py diff --git a/internal/pipeline_modules/cell_types/morphology/cortical_layers.py b/allensdk/internal/pipeline_modules/cell_types/morphology/cortical_layers.py similarity index 100% rename from internal/pipeline_modules/cell_types/morphology/cortical_layers.py rename to allensdk/internal/pipeline_modules/cell_types/morphology/cortical_layers.py diff --git a/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py b/allensdk/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py similarity index 100% rename from internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py rename to allensdk/internal/pipeline_modules/cell_types/morphology/surrogate_strategy.py diff --git a/internal/pipeline_modules/cell_types/morphology/upright_transform.py b/allensdk/internal/pipeline_modules/cell_types/morphology/upright_transform.py similarity index 100% rename from internal/pipeline_modules/cell_types/morphology/upright_transform.py rename to allensdk/internal/pipeline_modules/cell_types/morphology/upright_transform.py diff --git a/internal/pipeline_modules/gbm/__init__.py b/allensdk/internal/pipeline_modules/gbm/__init__.py similarity index 100% rename from internal/pipeline_modules/gbm/__init__.py rename to allensdk/internal/pipeline_modules/gbm/__init__.py diff --git a/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py b/allensdk/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py similarity index 100% rename from internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py rename to allensdk/internal/pipeline_modules/gbm/generate_gbm_analysis_run_records.py diff --git a/internal/pipeline_modules/gbm/generate_gbm_heatmap.py b/allensdk/internal/pipeline_modules/gbm/generate_gbm_heatmap.py similarity index 100% rename from internal/pipeline_modules/gbm/generate_gbm_heatmap.py rename to allensdk/internal/pipeline_modules/gbm/generate_gbm_heatmap.py diff --git a/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py b/allensdk/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py similarity index 100% rename from internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py rename to allensdk/internal/pipeline_modules/gbm/generate_gbm_sample_metadata.py diff --git a/internal/pipeline_modules/run_annotated_region_metrics.py b/allensdk/internal/pipeline_modules/run_annotated_region_metrics.py similarity index 100% rename from internal/pipeline_modules/run_annotated_region_metrics.py rename to allensdk/internal/pipeline_modules/run_annotated_region_metrics.py diff --git a/internal/pipeline_modules/run_demixing.py b/allensdk/internal/pipeline_modules/run_demixing.py similarity index 100% rename from internal/pipeline_modules/run_demixing.py rename to allensdk/internal/pipeline_modules/run_demixing.py diff --git a/internal/pipeline_modules/run_dff_computation.py b/allensdk/internal/pipeline_modules/run_dff_computation.py similarity index 100% rename from internal/pipeline_modules/run_dff_computation.py rename to allensdk/internal/pipeline_modules/run_dff_computation.py diff --git a/internal/pipeline_modules/run_eye_tracking.py b/allensdk/internal/pipeline_modules/run_eye_tracking.py similarity index 100% rename from internal/pipeline_modules/run_eye_tracking.py rename to allensdk/internal/pipeline_modules/run_eye_tracking.py diff --git a/internal/pipeline_modules/run_neuropil_correction.py b/allensdk/internal/pipeline_modules/run_neuropil_correction.py similarity index 100% rename from internal/pipeline_modules/run_neuropil_correction.py rename to allensdk/internal/pipeline_modules/run_neuropil_correction.py diff --git a/internal/pipeline_modules/run_observatory_analysis.py b/allensdk/internal/pipeline_modules/run_observatory_analysis.py similarity index 100% rename from internal/pipeline_modules/run_observatory_analysis.py rename to allensdk/internal/pipeline_modules/run_observatory_analysis.py diff --git a/internal/pipeline_modules/run_observatory_container_thumbnails.py b/allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py similarity index 100% rename from internal/pipeline_modules/run_observatory_container_thumbnails.py rename to allensdk/internal/pipeline_modules/run_observatory_container_thumbnails.py diff --git a/internal/pipeline_modules/run_observatory_thumbnails.py b/allensdk/internal/pipeline_modules/run_observatory_thumbnails.py similarity index 100% rename from internal/pipeline_modules/run_observatory_thumbnails.py rename to allensdk/internal/pipeline_modules/run_observatory_thumbnails.py diff --git a/internal/pipeline_modules/run_ophys_eye_calibration.py b/allensdk/internal/pipeline_modules/run_ophys_eye_calibration.py similarity index 100% rename from internal/pipeline_modules/run_ophys_eye_calibration.py rename to allensdk/internal/pipeline_modules/run_ophys_eye_calibration.py diff --git a/internal/pipeline_modules/run_ophys_session_decomposition.py b/allensdk/internal/pipeline_modules/run_ophys_session_decomposition.py similarity index 100% rename from internal/pipeline_modules/run_ophys_session_decomposition.py rename to allensdk/internal/pipeline_modules/run_ophys_session_decomposition.py diff --git a/internal/pipeline_modules/run_ophys_time_sync.py b/allensdk/internal/pipeline_modules/run_ophys_time_sync.py similarity index 100% rename from internal/pipeline_modules/run_ophys_time_sync.py rename to allensdk/internal/pipeline_modules/run_ophys_time_sync.py diff --git a/internal/pipeline_modules/run_roi_filter.py b/allensdk/internal/pipeline_modules/run_roi_filter.py similarity index 100% rename from internal/pipeline_modules/run_roi_filter.py rename to allensdk/internal/pipeline_modules/run_roi_filter.py diff --git a/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py similarity index 100% rename from internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py rename to allensdk/internal/pipeline_modules/run_tissuecyte_projection_thumbnail_from_json.py diff --git a/internal/pipeline_modules/run_tissuecyte_stitching_classic.py b/allensdk/internal/pipeline_modules/run_tissuecyte_stitching_classic.py similarity index 100% rename from internal/pipeline_modules/run_tissuecyte_stitching_classic.py rename to allensdk/internal/pipeline_modules/run_tissuecyte_stitching_classic.py diff --git a/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py similarity index 100% rename from internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py rename to allensdk/internal/pipeline_modules/run_tissuecyte_unionize_cav_from_json.py diff --git a/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py similarity index 100% rename from internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py rename to allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_counts_from_json.py diff --git a/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py b/allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py similarity index 100% rename from internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py rename to allensdk/internal/pipeline_modules/run_tissuecyte_unionize_classic_from_json.py diff --git a/model/__init__.py b/allensdk/model/__init__.py similarity index 100% rename from model/__init__.py rename to allensdk/model/__init__.py diff --git a/model/biophys_sim/__init__.py b/allensdk/model/biophys_sim/__init__.py similarity index 100% rename from model/biophys_sim/__init__.py rename to allensdk/model/biophys_sim/__init__.py diff --git a/model/biophys_sim/bps_command.py b/allensdk/model/biophys_sim/bps_command.py similarity index 100% rename from model/biophys_sim/bps_command.py rename to allensdk/model/biophys_sim/bps_command.py diff --git a/model/biophys_sim/config.py b/allensdk/model/biophys_sim/config.py similarity index 100% rename from model/biophys_sim/config.py rename to allensdk/model/biophys_sim/config.py diff --git a/model/biophys_sim/logging.conf b/allensdk/model/biophys_sim/logging.conf similarity index 100% rename from model/biophys_sim/logging.conf rename to allensdk/model/biophys_sim/logging.conf diff --git a/model/biophys_sim/manifest_default.json b/allensdk/model/biophys_sim/manifest_default.json similarity index 100% rename from model/biophys_sim/manifest_default.json rename to allensdk/model/biophys_sim/manifest_default.json diff --git a/model/biophys_sim/neuron/__init__.py b/allensdk/model/biophys_sim/neuron/__init__.py similarity index 100% rename from model/biophys_sim/neuron/__init__.py rename to allensdk/model/biophys_sim/neuron/__init__.py diff --git a/model/biophys_sim/neuron/hoc_utils.py b/allensdk/model/biophys_sim/neuron/hoc_utils.py similarity index 100% rename from model/biophys_sim/neuron/hoc_utils.py rename to allensdk/model/biophys_sim/neuron/hoc_utils.py diff --git a/model/biophys_sim/scripts/__init__.py b/allensdk/model/biophys_sim/scripts/__init__.py similarity index 100% rename from model/biophys_sim/scripts/__init__.py rename to allensdk/model/biophys_sim/scripts/__init__.py diff --git a/model/biophys_sim/scripts/bps b/allensdk/model/biophys_sim/scripts/bps similarity index 100% rename from model/biophys_sim/scripts/bps rename to allensdk/model/biophys_sim/scripts/bps diff --git a/model/biophysical/__init__.py b/allensdk/model/biophysical/__init__.py similarity index 100% rename from model/biophysical/__init__.py rename to allensdk/model/biophysical/__init__.py diff --git a/model/biophysical/logging.conf b/allensdk/model/biophysical/logging.conf similarity index 100% rename from model/biophysical/logging.conf rename to allensdk/model/biophysical/logging.conf diff --git a/model/biophysical/run_simulate.py b/allensdk/model/biophysical/run_simulate.py similarity index 100% rename from model/biophysical/run_simulate.py rename to allensdk/model/biophysical/run_simulate.py diff --git a/model/biophysical/runner.py b/allensdk/model/biophysical/runner.py similarity index 100% rename from model/biophysical/runner.py rename to allensdk/model/biophysical/runner.py diff --git a/model/biophysical/utils.py b/allensdk/model/biophysical/utils.py similarity index 100% rename from model/biophysical/utils.py rename to allensdk/model/biophysical/utils.py diff --git a/model/glif/__init__.py b/allensdk/model/glif/__init__.py similarity index 100% rename from model/glif/__init__.py rename to allensdk/model/glif/__init__.py diff --git a/model/glif/glif_neuron.py b/allensdk/model/glif/glif_neuron.py similarity index 100% rename from model/glif/glif_neuron.py rename to allensdk/model/glif/glif_neuron.py diff --git a/model/glif/glif_neuron_methods.py b/allensdk/model/glif/glif_neuron_methods.py similarity index 100% rename from model/glif/glif_neuron_methods.py rename to allensdk/model/glif/glif_neuron_methods.py diff --git a/model/glif/simulate_neuron.py b/allensdk/model/glif/simulate_neuron.py similarity index 100% rename from model/glif/simulate_neuron.py rename to allensdk/model/glif/simulate_neuron.py diff --git a/morphology/__init__.py b/allensdk/morphology/__init__.py similarity index 100% rename from morphology/__init__.py rename to allensdk/morphology/__init__.py diff --git a/morphology/validate_swc.py b/allensdk/morphology/validate_swc.py similarity index 100% rename from morphology/validate_swc.py rename to allensdk/morphology/validate_swc.py diff --git a/mouse_connectivity/__init__.py b/allensdk/mouse_connectivity/__init__.py similarity index 100% rename from mouse_connectivity/__init__.py rename to allensdk/mouse_connectivity/__init__.py diff --git a/mouse_connectivity/grid/__init__.py b/allensdk/mouse_connectivity/grid/__init__.py similarity index 100% rename from mouse_connectivity/grid/__init__.py rename to allensdk/mouse_connectivity/grid/__init__.py diff --git a/mouse_connectivity/grid/__main__.py b/allensdk/mouse_connectivity/grid/__main__.py similarity index 100% rename from mouse_connectivity/grid/__main__.py rename to allensdk/mouse_connectivity/grid/__main__.py diff --git a/mouse_connectivity/grid/_schemas.py b/allensdk/mouse_connectivity/grid/_schemas.py similarity index 100% rename from mouse_connectivity/grid/_schemas.py rename to allensdk/mouse_connectivity/grid/_schemas.py diff --git a/mouse_connectivity/grid/image_series_gridder.py b/allensdk/mouse_connectivity/grid/image_series_gridder.py similarity index 100% rename from mouse_connectivity/grid/image_series_gridder.py rename to allensdk/mouse_connectivity/grid/image_series_gridder.py diff --git a/mouse_connectivity/grid/subimage/__init__.py b/allensdk/mouse_connectivity/grid/subimage/__init__.py similarity index 100% rename from mouse_connectivity/grid/subimage/__init__.py rename to allensdk/mouse_connectivity/grid/subimage/__init__.py diff --git a/mouse_connectivity/grid/subimage/base_subimage.py b/allensdk/mouse_connectivity/grid/subimage/base_subimage.py similarity index 100% rename from mouse_connectivity/grid/subimage/base_subimage.py rename to allensdk/mouse_connectivity/grid/subimage/base_subimage.py diff --git a/mouse_connectivity/grid/subimage/cav_subimage.py b/allensdk/mouse_connectivity/grid/subimage/cav_subimage.py similarity index 100% rename from mouse_connectivity/grid/subimage/cav_subimage.py rename to allensdk/mouse_connectivity/grid/subimage/cav_subimage.py diff --git a/mouse_connectivity/grid/subimage/classic_subimage.py b/allensdk/mouse_connectivity/grid/subimage/classic_subimage.py similarity index 100% rename from mouse_connectivity/grid/subimage/classic_subimage.py rename to allensdk/mouse_connectivity/grid/subimage/classic_subimage.py diff --git a/mouse_connectivity/grid/subimage/count_subimage.py b/allensdk/mouse_connectivity/grid/subimage/count_subimage.py similarity index 100% rename from mouse_connectivity/grid/subimage/count_subimage.py rename to allensdk/mouse_connectivity/grid/subimage/count_subimage.py diff --git a/mouse_connectivity/grid/utilities/__init__.py b/allensdk/mouse_connectivity/grid/utilities/__init__.py similarity index 100% rename from mouse_connectivity/grid/utilities/__init__.py rename to allensdk/mouse_connectivity/grid/utilities/__init__.py diff --git a/mouse_connectivity/grid/utilities/downsampling_utilities.py b/allensdk/mouse_connectivity/grid/utilities/downsampling_utilities.py similarity index 100% rename from mouse_connectivity/grid/utilities/downsampling_utilities.py rename to allensdk/mouse_connectivity/grid/utilities/downsampling_utilities.py diff --git a/mouse_connectivity/grid/utilities/image_utilities.py b/allensdk/mouse_connectivity/grid/utilities/image_utilities.py similarity index 100% rename from mouse_connectivity/grid/utilities/image_utilities.py rename to allensdk/mouse_connectivity/grid/utilities/image_utilities.py diff --git a/mouse_connectivity/grid/writers/__init__.py b/allensdk/mouse_connectivity/grid/writers/__init__.py similarity index 100% rename from mouse_connectivity/grid/writers/__init__.py rename to allensdk/mouse_connectivity/grid/writers/__init__.py diff --git a/test/api/__init__.py b/allensdk/test/api/__init__.py similarity index 100% rename from test/api/__init__.py rename to allensdk/test/api/__init__.py diff --git a/test/api/cloud_cache/__init__.py b/allensdk/test/api/cloud_cache/__init__.py similarity index 100% rename from test/api/cloud_cache/__init__.py rename to allensdk/test/api/cloud_cache/__init__.py diff --git a/test/api/cloud_cache/conftest.py b/allensdk/test/api/cloud_cache/conftest.py similarity index 100% rename from test/api/cloud_cache/conftest.py rename to allensdk/test/api/cloud_cache/conftest.py diff --git a/test/api/cloud_cache/test_cache.py b/allensdk/test/api/cloud_cache/test_cache.py similarity index 100% rename from test/api/cloud_cache/test_cache.py rename to allensdk/test/api/cloud_cache/test_cache.py diff --git a/test/api/cloud_cache/test_change_log.py b/allensdk/test/api/cloud_cache/test_change_log.py similarity index 100% rename from test/api/cloud_cache/test_change_log.py rename to allensdk/test/api/cloud_cache/test_change_log.py diff --git a/test/api/cloud_cache/test_file_attributes.py b/allensdk/test/api/cloud_cache/test_file_attributes.py similarity index 100% rename from test/api/cloud_cache/test_file_attributes.py rename to allensdk/test/api/cloud_cache/test_file_attributes.py diff --git a/test/api/cloud_cache/test_full_process.py b/allensdk/test/api/cloud_cache/test_full_process.py similarity index 100% rename from test/api/cloud_cache/test_full_process.py rename to allensdk/test/api/cloud_cache/test_full_process.py diff --git a/test/api/cloud_cache/test_local_cache.py b/allensdk/test/api/cloud_cache/test_local_cache.py similarity index 100% rename from test/api/cloud_cache/test_local_cache.py rename to allensdk/test/api/cloud_cache/test_local_cache.py diff --git a/test/api/cloud_cache/test_manifest.py b/allensdk/test/api/cloud_cache/test_manifest.py similarity index 100% rename from test/api/cloud_cache/test_manifest.py rename to allensdk/test/api/cloud_cache/test_manifest.py diff --git a/test/api/cloud_cache/test_smart_download.py b/allensdk/test/api/cloud_cache/test_smart_download.py similarity index 100% rename from test/api/cloud_cache/test_smart_download.py rename to allensdk/test/api/cloud_cache/test_smart_download.py diff --git a/test/api/cloud_cache/test_static_local_cache.py b/allensdk/test/api/cloud_cache/test_static_local_cache.py similarity index 100% rename from test/api/cloud_cache/test_static_local_cache.py rename to allensdk/test/api/cloud_cache/test_static_local_cache.py diff --git a/test/api/cloud_cache/test_utils.py b/allensdk/test/api/cloud_cache/test_utils.py similarity index 100% rename from test/api/cloud_cache/test_utils.py rename to allensdk/test/api/cloud_cache/test_utils.py diff --git a/test/api/cloud_cache/test_windows_isilon_paths.py b/allensdk/test/api/cloud_cache/test_windows_isilon_paths.py similarity index 100% rename from test/api/cloud_cache/test_windows_isilon_paths.py rename to allensdk/test/api/cloud_cache/test_windows_isilon_paths.py diff --git a/test/api/cloud_cache/utils.py b/allensdk/test/api/cloud_cache/utils.py similarity index 100% rename from test/api/cloud_cache/utils.py rename to allensdk/test/api/cloud_cache/utils.py diff --git a/test/api/response_test_data/472451419_response.json b/allensdk/test/api/response_test_data/472451419_response.json similarity index 100% rename from test/api/response_test_data/472451419_response.json rename to allensdk/test/api/response_test_data/472451419_response.json diff --git a/test/api/test_annotated_section_data_set_api.py b/allensdk/test/api/test_annotated_section_data_set_api.py similarity index 100% rename from test/api/test_annotated_section_data_set_api.py rename to allensdk/test/api/test_annotated_section_data_set_api.py diff --git a/test/api/test_api.py b/allensdk/test/api/test_api.py similarity index 100% rename from test/api/test_api.py rename to allensdk/test/api/test_api.py diff --git a/test/api/test_biophysical_api.py b/allensdk/test/api/test_biophysical_api.py similarity index 100% rename from test/api/test_biophysical_api.py rename to allensdk/test/api/test_biophysical_api.py diff --git a/test/api/test_brain_observatory_api.py b/allensdk/test/api/test_brain_observatory_api.py similarity index 100% rename from test/api/test_brain_observatory_api.py rename to allensdk/test/api/test_brain_observatory_api.py diff --git a/test/api/test_cache.py b/allensdk/test/api/test_cache.py similarity index 100% rename from test/api/test_cache.py rename to allensdk/test/api/test_cache.py diff --git a/test/api/test_cacheable.py b/allensdk/test/api/test_cacheable.py similarity index 100% rename from test/api/test_cacheable.py rename to allensdk/test/api/test_cacheable.py diff --git a/test/api/test_caching_utilities.py b/allensdk/test/api/test_caching_utilities.py similarity index 100% rename from test/api/test_caching_utilities.py rename to allensdk/test/api/test_caching_utilities.py diff --git a/test/api/test_cell_types_api.py b/allensdk/test/api/test_cell_types_api.py similarity index 100% rename from test/api/test_cell_types_api.py rename to allensdk/test/api/test_cell_types_api.py diff --git a/test/api/test_file_download.py b/allensdk/test/api/test_file_download.py similarity index 100% rename from test/api/test_file_download.py rename to allensdk/test/api/test_file_download.py diff --git a/test/api/test_glif_api.py b/allensdk/test/api/test_glif_api.py similarity index 100% rename from test/api/test_glif_api.py rename to allensdk/test/api/test_glif_api.py diff --git a/test/api/test_grid_data_api.py b/allensdk/test/api/test_grid_data_api.py similarity index 100% rename from test/api/test_grid_data_api.py rename to allensdk/test/api/test_grid_data_api.py diff --git a/test/api/test_image_download_api.py b/allensdk/test/api/test_image_download_api.py similarity index 100% rename from test/api/test_image_download_api.py rename to allensdk/test/api/test_image_download_api.py diff --git a/test/api/test_mouse_atlas_api.py b/allensdk/test/api/test_mouse_atlas_api.py similarity index 100% rename from test/api/test_mouse_atlas_api.py rename to allensdk/test/api/test_mouse_atlas_api.py diff --git a/test/api/test_mouse_connectivity_api.py b/allensdk/test/api/test_mouse_connectivity_api.py similarity index 100% rename from test/api/test_mouse_connectivity_api.py rename to allensdk/test/api/test_mouse_connectivity_api.py diff --git a/test/api/test_ontologies_api.py b/allensdk/test/api/test_ontologies_api.py similarity index 100% rename from test/api/test_ontologies_api.py rename to allensdk/test/api/test_ontologies_api.py diff --git a/test/api/test_pager.py b/allensdk/test/api/test_pager.py similarity index 100% rename from test/api/test_pager.py rename to allensdk/test/api/test_pager.py diff --git a/test/api/test_reference_space_api.py b/allensdk/test/api/test_reference_space_api.py similarity index 100% rename from test/api/test_reference_space_api.py rename to allensdk/test/api/test_reference_space_api.py diff --git a/test/api/test_rma_template.py b/allensdk/test/api/test_rma_template.py similarity index 100% rename from test/api/test_rma_template.py rename to allensdk/test/api/test_rma_template.py diff --git a/test/api/test_svg_api.py b/allensdk/test/api/test_svg_api.py similarity index 100% rename from test/api/test_svg_api.py rename to allensdk/test/api/test_svg_api.py diff --git a/test/api/test_synchronization_api.py b/allensdk/test/api/test_synchronization_api.py similarity index 100% rename from test/api/test_synchronization_api.py rename to allensdk/test/api/test_synchronization_api.py diff --git a/test/api/test_tree_search_api.py b/allensdk/test/api/test_tree_search_api.py similarity index 100% rename from test/api/test_tree_search_api.py rename to allensdk/test/api/test_tree_search_api.py diff --git a/test/brain_observatory/behavior/behavior_project_cache/__init__.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/__init__.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache/__init__.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache/__init__.py diff --git a/test/brain_observatory/behavior/behavior_project_cache/conftest.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/conftest.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache/conftest.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache/conftest.py diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_cloud_api.py diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache/test_behavior_project_lims_api.py diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache/test_experiments_table_utils.py diff --git a/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache/test_from_s3.py diff --git a/test/brain_observatory/behavior/behavior_project_cache/utils.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache/utils.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache/utils.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache/utils.py diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/conftest.py diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py b/allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py similarity index 100% rename from test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py rename to allensdk/test/brain_observatory/behavior/behavior_project_cache_data_model/test_behavior_project_cache.py diff --git a/test/brain_observatory/behavior/conftest.py b/allensdk/test/brain_observatory/behavior/conftest.py similarity index 100% rename from test/brain_observatory/behavior/conftest.py rename to allensdk/test/brain_observatory/behavior/conftest.py diff --git a/test/brain_observatory/behavior/data_files/test_stimulus_file.py b/allensdk/test/brain_observatory/behavior/data_files/test_stimulus_file.py similarity index 100% rename from test/brain_observatory/behavior/data_files/test_stimulus_file.py rename to allensdk/test/brain_observatory/behavior/data_files/test_stimulus_file.py diff --git a/test/brain_observatory/behavior/data_files/test_sync_file.py b/allensdk/test/brain_observatory/behavior/data_files/test_sync_file.py similarity index 100% rename from test/brain_observatory/behavior/data_files/test_sync_file.py rename to allensdk/test/brain_observatory/behavior/data_files/test_sync_file.py diff --git a/test/brain_observatory/behavior/data_objects/base/test_data_object.py b/allensdk/test/brain_observatory/behavior/data_objects/base/test_data_object.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/base/test_data_object.py rename to allensdk/test/brain_observatory/behavior/data_objects/base/test_data_object.py diff --git a/test/brain_observatory/behavior/data_objects/conftest.py b/allensdk/test/brain_observatory/behavior/data_objects/conftest.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/conftest.py rename to allensdk/test/brain_observatory/behavior/data_objects/conftest.py diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py b/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py rename to allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_eye_tracking_table.py diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py b/allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py rename to allensdk/test/brain_observatory/behavior/data_objects/eye_tracking/test_rig_geometry.py diff --git a/test/brain_observatory/behavior/data_objects/lims_util.py b/allensdk/test/brain_observatory/behavior/data_objects/lims_util.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/lims_util.py rename to allensdk/test/brain_observatory/behavior/data_objects/lims_util.py diff --git a/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py b/allensdk/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py rename to allensdk/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/test_behavior_metadata.py diff --git a/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py b/allensdk/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py rename to allensdk/test/brain_observatory/behavior/data_objects/metadata/test_behavior_ophys_metadata.py diff --git a/test/brain_observatory/behavior/data_objects/nwb_input_json.py b/allensdk/test/brain_observatory/behavior/data_objects/nwb_input_json.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/nwb_input_json.py rename to allensdk/test/brain_observatory/behavior/data_objects/nwb_input_json.py diff --git a/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py b/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py rename to allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_acquisition.py diff --git a/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py b/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py rename to allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_processing.py diff --git a/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py b/allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py rename to allensdk/test/brain_observatory/behavior/data_objects/running_speed/test_running_speed.py diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py b/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py rename to allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_stimulus_timestamps.py diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py b/allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py rename to allensdk/test/brain_observatory/behavior/data_objects/stimulus_timestamps/test_timestamps_processing.py diff --git a/test/brain_observatory/behavior/data_objects/test_cell_specimens.py b/allensdk/test/brain_observatory/behavior/data_objects/test_cell_specimens.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_cell_specimens.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_cell_specimens.py diff --git a/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json b/allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json rename to allensdk/test/brain_observatory/behavior/data_objects/test_data/eye_tracking_rig_geometry.json diff --git a/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv b/allensdk/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv rename to allensdk/test/brain_observatory/behavior/data_objects/test_data/rigid_motion_transform_file.csv diff --git a/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json b/allensdk/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_data/task_parameters.json rename to allensdk/test/brain_observatory/behavior/data_objects/test_data/task_parameters.json diff --git a/test/brain_observatory/behavior/data_objects/test_data/test_input.json b/allensdk/test/brain_observatory/behavior/data_objects/test_data/test_input.json similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_data/test_input.json rename to allensdk/test/brain_observatory/behavior/data_objects/test_data/test_input.json diff --git a/test/brain_observatory/behavior/data_objects/test_licks.py b/allensdk/test/brain_observatory/behavior/data_objects/test_licks.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_licks.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_licks.py diff --git a/test/brain_observatory/behavior/data_objects/test_motion_correction.py b/allensdk/test/brain_observatory/behavior/data_objects/test_motion_correction.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_motion_correction.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_motion_correction.py diff --git a/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py b/allensdk/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_ophys_timestamps.py diff --git a/test/brain_observatory/behavior/data_objects/test_projections.py b/allensdk/test/brain_observatory/behavior/data_objects/test_projections.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_projections.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_projections.py diff --git a/test/brain_observatory/behavior/data_objects/test_rewards.py b/allensdk/test/brain_observatory/behavior/data_objects/test_rewards.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_rewards.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_rewards.py diff --git a/test/brain_observatory/behavior/data_objects/test_stimuli.py b/allensdk/test/brain_observatory/behavior/data_objects/test_stimuli.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_stimuli.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_stimuli.py diff --git a/test/brain_observatory/behavior/data_objects/test_task_parameters.py b/allensdk/test/brain_observatory/behavior/data_objects/test_task_parameters.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_task_parameters.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_task_parameters.py diff --git a/test/brain_observatory/behavior/data_objects/test_trial_table.py b/allensdk/test/brain_observatory/behavior/data_objects/test_trial_table.py similarity index 100% rename from test/brain_observatory/behavior/data_objects/test_trial_table.py rename to allensdk/test/brain_observatory/behavior/data_objects/test_trial_table.py diff --git a/test/brain_observatory/behavior/test_behavior_metadata_legacy.py b/allensdk/test/brain_observatory/behavior/test_behavior_metadata_legacy.py similarity index 100% rename from test/brain_observatory/behavior/test_behavior_metadata_legacy.py rename to allensdk/test/brain_observatory/behavior/test_behavior_metadata_legacy.py diff --git a/test/brain_observatory/behavior/test_behavior_ophys_experiment.py b/allensdk/test/brain_observatory/behavior/test_behavior_ophys_experiment.py similarity index 100% rename from test/brain_observatory/behavior/test_behavior_ophys_experiment.py rename to allensdk/test/brain_observatory/behavior/test_behavior_ophys_experiment.py diff --git a/test/brain_observatory/behavior/test_behavior_session.py b/allensdk/test/brain_observatory/behavior/test_behavior_session.py similarity index 100% rename from test/brain_observatory/behavior/test_behavior_session.py rename to allensdk/test/brain_observatory/behavior/test_behavior_session.py diff --git a/test/brain_observatory/behavior/test_criteria.py b/allensdk/test/brain_observatory/behavior/test_criteria.py similarity index 100% rename from test/brain_observatory/behavior/test_criteria.py rename to allensdk/test/brain_observatory/behavior/test_criteria.py diff --git a/test/brain_observatory/behavior/test_dprime.py b/allensdk/test/brain_observatory/behavior/test_dprime.py similarity index 100% rename from test/brain_observatory/behavior/test_dprime.py rename to allensdk/test/brain_observatory/behavior/test_dprime.py diff --git a/test/brain_observatory/behavior/test_event_detection.py b/allensdk/test/brain_observatory/behavior/test_event_detection.py similarity index 100% rename from test/brain_observatory/behavior/test_event_detection.py rename to allensdk/test/brain_observatory/behavior/test_event_detection.py diff --git a/test/brain_observatory/behavior/test_eye_tracking_processing.py b/allensdk/test/brain_observatory/behavior/test_eye_tracking_processing.py similarity index 100% rename from test/brain_observatory/behavior/test_eye_tracking_processing.py rename to allensdk/test/brain_observatory/behavior/test_eye_tracking_processing.py diff --git a/test/brain_observatory/behavior/test_mtrain_annotate.py b/allensdk/test/brain_observatory/behavior/test_mtrain_annotate.py similarity index 100% rename from test/brain_observatory/behavior/test_mtrain_annotate.py rename to allensdk/test/brain_observatory/behavior/test_mtrain_annotate.py diff --git a/test/brain_observatory/behavior/test_prior_exposure_count_processing.py b/allensdk/test/brain_observatory/behavior/test_prior_exposure_count_processing.py similarity index 100% rename from test/brain_observatory/behavior/test_prior_exposure_count_processing.py rename to allensdk/test/brain_observatory/behavior/test_prior_exposure_count_processing.py diff --git a/test/brain_observatory/behavior/test_rewards_processing.py b/allensdk/test/brain_observatory/behavior/test_rewards_processing.py similarity index 100% rename from test/brain_observatory/behavior/test_rewards_processing.py rename to allensdk/test/brain_observatory/behavior/test_rewards_processing.py diff --git a/test/brain_observatory/behavior/test_session_metrics.py b/allensdk/test/brain_observatory/behavior/test_session_metrics.py similarity index 100% rename from test/brain_observatory/behavior/test_session_metrics.py rename to allensdk/test/brain_observatory/behavior/test_session_metrics.py diff --git a/test/brain_observatory/behavior/test_stimulus_processing.py b/allensdk/test/brain_observatory/behavior/test_stimulus_processing.py similarity index 100% rename from test/brain_observatory/behavior/test_stimulus_processing.py rename to allensdk/test/brain_observatory/behavior/test_stimulus_processing.py diff --git a/test/brain_observatory/behavior/test_sync_processing.py b/allensdk/test/brain_observatory/behavior/test_sync_processing.py similarity index 100% rename from test/brain_observatory/behavior/test_sync_processing.py rename to allensdk/test/brain_observatory/behavior/test_sync_processing.py diff --git a/test/brain_observatory/behavior/test_trial_masks.py b/allensdk/test/brain_observatory/behavior/test_trial_masks.py similarity index 100% rename from test/brain_observatory/behavior/test_trial_masks.py rename to allensdk/test/brain_observatory/behavior/test_trial_masks.py diff --git a/test/brain_observatory/behavior/test_trials_processing.py b/allensdk/test/brain_observatory/behavior/test_trials_processing.py similarity index 100% rename from test/brain_observatory/behavior/test_trials_processing.py rename to allensdk/test/brain_observatory/behavior/test_trials_processing.py diff --git a/test/brain_observatory/behavior/test_write_behavior_nwb.py b/allensdk/test/brain_observatory/behavior/test_write_behavior_nwb.py similarity index 100% rename from test/brain_observatory/behavior/test_write_behavior_nwb.py rename to allensdk/test/brain_observatory/behavior/test_write_behavior_nwb.py diff --git a/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py b/allensdk/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py similarity index 100% rename from test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py rename to allensdk/test/brain_observatory/behavior/test_write_nwb_behavior_ophys.py diff --git a/test/brain_observatory/conftest.py b/allensdk/test/brain_observatory/conftest.py similarity index 100% rename from test/brain_observatory/conftest.py rename to allensdk/test/brain_observatory/conftest.py diff --git a/test/brain_observatory/ecephys/__init__.py b/allensdk/test/brain_observatory/ecephys/__init__.py similarity index 100% rename from test/brain_observatory/ecephys/__init__.py rename to allensdk/test/brain_observatory/ecephys/__init__.py diff --git a/test/brain_observatory/ecephys/align_timestamps/__init__.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/__init__.py similarity index 100% rename from test/brain_observatory/ecephys/align_timestamps/__init__.py rename to allensdk/test/brain_observatory/ecephys/align_timestamps/__init__.py diff --git a/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py similarity index 100% rename from test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py rename to allensdk/test/brain_observatory/ecephys/align_timestamps/test_align_timestamps_module.py diff --git a/test/brain_observatory/ecephys/align_timestamps/test_barcode.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode.py similarity index 100% rename from test/brain_observatory/ecephys/align_timestamps/test_barcode.py rename to allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode.py diff --git a/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py similarity index 100% rename from test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py rename to allensdk/test/brain_observatory/ecephys/align_timestamps/test_barcode_sync_dataset.py diff --git a/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py similarity index 100% rename from test/brain_observatory/ecephys/align_timestamps/test_channel_states.py rename to allensdk/test/brain_observatory/ecephys/align_timestamps/test_channel_states.py diff --git a/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py b/allensdk/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py similarity index 100% rename from test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py rename to allensdk/test/brain_observatory/ecephys/align_timestamps/test_probe_synchronizer.py diff --git a/test/brain_observatory/ecephys/conftest.py b/allensdk/test/brain_observatory/ecephys/conftest.py similarity index 100% rename from test/brain_observatory/ecephys/conftest.py rename to allensdk/test/brain_observatory/ecephys/conftest.py diff --git a/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py b/allensdk/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py similarity index 100% rename from test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py rename to allensdk/test/brain_observatory/ecephys/ecephys_session_api/test_ecephys_nwb1_session_api.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__init__.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/__init__.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/__init__.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/__init__.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/conftest.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/conftest.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/conftest.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/conftest.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_dot_motion.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_drifting_gratings.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_flashes.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_movies.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_natural_scenes.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_receptive_field_mapping.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_static_gratings.py diff --git a/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py b/allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py rename to allensdk/test/brain_observatory/ecephys/stimulus_analysis/test_stimulus_analysis.py diff --git a/test/brain_observatory/ecephys/stimulus_table/__init__.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/__init__.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_table/__init__.py rename to allensdk/test/brain_observatory/ecephys/stimulus_table/__init__.py diff --git a/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py rename to allensdk/test/brain_observatory/ecephys/stimulus_table/test_ephys_pre_spikes.py diff --git a/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py rename to allensdk/test/brain_observatory/ecephys/stimulus_table/test_naming_utilities.py diff --git a/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py rename to allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_parameter_extraction.py diff --git a/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py b/allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py similarity index 100% rename from test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py rename to allensdk/test/brain_observatory/ecephys/stimulus_table/test_stimulus_table_module.py diff --git a/test/brain_observatory/ecephys/test_copy_utility.py b/allensdk/test/brain_observatory/ecephys/test_copy_utility.py similarity index 100% rename from test/brain_observatory/ecephys/test_copy_utility.py rename to allensdk/test/brain_observatory/ecephys/test_copy_utility.py diff --git a/test/brain_observatory/ecephys/test_current_source_density.py b/allensdk/test/brain_observatory/ecephys/test_current_source_density.py similarity index 100% rename from test/brain_observatory/ecephys/test_current_source_density.py rename to allensdk/test/brain_observatory/ecephys/test_current_source_density.py diff --git a/test/brain_observatory/ecephys/test_ecephys_project_cache.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_cache.py similarity index 100% rename from test/brain_observatory/ecephys/test_ecephys_project_cache.py rename to allensdk/test/brain_observatory/ecephys/test_ecephys_project_cache.py diff --git a/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py similarity index 100% rename from test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py rename to allensdk/test/brain_observatory/ecephys/test_ecephys_project_fixed_api.py diff --git a/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py similarity index 100% rename from test/brain_observatory/ecephys/test_ecephys_project_lims_api.py rename to allensdk/test/brain_observatory/ecephys/test_ecephys_project_lims_api.py diff --git a/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py similarity index 100% rename from test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py rename to allensdk/test/brain_observatory/ecephys/test_ecephys_project_warehouse_api.py diff --git a/test/brain_observatory/ecephys/test_ecephys_session.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_session.py similarity index 100% rename from test/brain_observatory/ecephys/test_ecephys_session.py rename to allensdk/test/brain_observatory/ecephys/test_ecephys_session.py diff --git a/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py similarity index 100% rename from test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py rename to allensdk/test/brain_observatory/ecephys/test_ecephys_session_nwb_api.py diff --git a/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py b/allensdk/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py similarity index 100% rename from test/brain_observatory/ecephys/test_ecephys_sync_dataset.py rename to allensdk/test/brain_observatory/ecephys/test_ecephys_sync_dataset.py diff --git a/test/brain_observatory/ecephys/test_http_engine.py b/allensdk/test/brain_observatory/ecephys/test_http_engine.py similarity index 100% rename from test/brain_observatory/ecephys/test_http_engine.py rename to allensdk/test/brain_observatory/ecephys/test_http_engine.py diff --git a/test/brain_observatory/ecephys/test_lfp_subsampling.py b/allensdk/test/brain_observatory/ecephys/test_lfp_subsampling.py similarity index 100% rename from test/brain_observatory/ecephys/test_lfp_subsampling.py rename to allensdk/test/brain_observatory/ecephys/test_lfp_subsampling.py diff --git a/test/brain_observatory/ecephys/test_rma_engine.py b/allensdk/test/brain_observatory/ecephys/test_rma_engine.py similarity index 100% rename from test/brain_observatory/ecephys/test_rma_engine.py rename to allensdk/test/brain_observatory/ecephys/test_rma_engine.py diff --git a/test/brain_observatory/ecephys/test_stim_file.py b/allensdk/test/brain_observatory/ecephys/test_stim_file.py similarity index 100% rename from test/brain_observatory/ecephys/test_stim_file.py rename to allensdk/test/brain_observatory/ecephys/test_stim_file.py diff --git a/test/brain_observatory/ecephys/test_stimulus_sync.py b/allensdk/test/brain_observatory/ecephys/test_stimulus_sync.py similarity index 100% rename from test/brain_observatory/ecephys/test_stimulus_sync.py rename to allensdk/test/brain_observatory/ecephys/test_stimulus_sync.py diff --git a/test/brain_observatory/ecephys/test_visualization.py b/allensdk/test/brain_observatory/ecephys/test_visualization.py similarity index 100% rename from test/brain_observatory/ecephys/test_visualization.py rename to allensdk/test/brain_observatory/ecephys/test_visualization.py diff --git a/test/brain_observatory/ecephys/test_write_nwb.py b/allensdk/test/brain_observatory/ecephys/test_write_nwb.py similarity index 100% rename from test/brain_observatory/ecephys/test_write_nwb.py rename to allensdk/test/brain_observatory/ecephys/test_write_nwb.py diff --git a/test/brain_observatory/extract_running_speed/__init__.py b/allensdk/test/brain_observatory/extract_running_speed/__init__.py similarity index 100% rename from test/brain_observatory/extract_running_speed/__init__.py rename to allensdk/test/brain_observatory/extract_running_speed/__init__.py diff --git a/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py b/allensdk/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py similarity index 100% rename from test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py rename to allensdk/test/brain_observatory/extract_running_speed/test_extract_running_speed_module.py diff --git a/test/brain_observatory/gaze_mapping/__init__.py b/allensdk/test/brain_observatory/gaze_mapping/__init__.py similarity index 100% rename from test/brain_observatory/gaze_mapping/__init__.py rename to allensdk/test/brain_observatory/gaze_mapping/__init__.py diff --git a/test/brain_observatory/gaze_mapping/test_gaze_mapping.py b/allensdk/test/brain_observatory/gaze_mapping/test_gaze_mapping.py similarity index 100% rename from test/brain_observatory/gaze_mapping/test_gaze_mapping.py rename to allensdk/test/brain_observatory/gaze_mapping/test_gaze_mapping.py diff --git a/test/brain_observatory/gaze_mapping/test_main.py b/allensdk/test/brain_observatory/gaze_mapping/test_main.py similarity index 100% rename from test/brain_observatory/gaze_mapping/test_main.py rename to allensdk/test/brain_observatory/gaze_mapping/test_main.py diff --git a/test/brain_observatory/nwb/__init__.py b/allensdk/test/brain_observatory/nwb/__init__.py similarity index 100% rename from test/brain_observatory/nwb/__init__.py rename to allensdk/test/brain_observatory/nwb/__init__.py diff --git a/test/brain_observatory/nwb/conftest.py b/allensdk/test/brain_observatory/nwb/conftest.py similarity index 100% rename from test/brain_observatory/nwb/conftest.py rename to allensdk/test/brain_observatory/nwb/conftest.py diff --git a/test/brain_observatory/nwb/test_nwb.py b/allensdk/test/brain_observatory/nwb/test_nwb.py similarity index 100% rename from test/brain_observatory/nwb/test_nwb.py rename to allensdk/test/brain_observatory/nwb/test_nwb.py diff --git a/test/brain_observatory/nwb/test_nwb_api.py b/allensdk/test/brain_observatory/nwb/test_nwb_api.py similarity index 100% rename from test/brain_observatory/nwb/test_nwb_api.py rename to allensdk/test/brain_observatory/nwb/test_nwb_api.py diff --git a/test/brain_observatory/nwb/test_nwb_utils.py b/allensdk/test/brain_observatory/nwb/test_nwb_utils.py similarity index 100% rename from test/brain_observatory/nwb/test_nwb_utils.py rename to allensdk/test/brain_observatory/nwb/test_nwb_utils.py diff --git a/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py b/allensdk/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py similarity index 100% rename from test/brain_observatory/receptive_field_analysis/test_chisquarerf.py rename to allensdk/test/brain_observatory/receptive_field_analysis/test_chisquarerf.py diff --git a/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py b/allensdk/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py similarity index 100% rename from test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py rename to allensdk/test/brain_observatory/receptive_field_analysis/test_fitgaussian2D.py diff --git a/test/brain_observatory/sync_utilities/__init__.py b/allensdk/test/brain_observatory/sync_utilities/__init__.py similarity index 100% rename from test/brain_observatory/sync_utilities/__init__.py rename to allensdk/test/brain_observatory/sync_utilities/__init__.py diff --git a/test/brain_observatory/sync_utilities/test_sync_utilities.py b/allensdk/test/brain_observatory/sync_utilities/test_sync_utilities.py similarity index 100% rename from test/brain_observatory/sync_utilities/test_sync_utilities.py rename to allensdk/test/brain_observatory/sync_utilities/test_sync_utilities.py diff --git a/test/brain_observatory/test_circle_plots.py b/allensdk/test/brain_observatory/test_circle_plots.py similarity index 100% rename from test/brain_observatory/test_circle_plots.py rename to allensdk/test/brain_observatory/test_circle_plots.py diff --git a/test/brain_observatory/test_demixer.py b/allensdk/test/brain_observatory/test_demixer.py similarity index 100% rename from test/brain_observatory/test_demixer.py rename to allensdk/test/brain_observatory/test_demixer.py diff --git a/test/brain_observatory/test_dff.py b/allensdk/test/brain_observatory/test_dff.py similarity index 100% rename from test/brain_observatory/test_dff.py rename to allensdk/test/brain_observatory/test_dff.py diff --git a/test/brain_observatory/test_drifting_gratings.py b/allensdk/test/brain_observatory/test_drifting_gratings.py similarity index 100% rename from test/brain_observatory/test_drifting_gratings.py rename to allensdk/test/brain_observatory/test_drifting_gratings.py diff --git a/test/brain_observatory/test_locally_sparse_noise.py b/allensdk/test/brain_observatory/test_locally_sparse_noise.py similarity index 100% rename from test/brain_observatory/test_locally_sparse_noise.py rename to allensdk/test/brain_observatory/test_locally_sparse_noise.py diff --git a/test/brain_observatory/test_natural_movie.py b/allensdk/test/brain_observatory/test_natural_movie.py similarity index 100% rename from test/brain_observatory/test_natural_movie.py rename to allensdk/test/brain_observatory/test_natural_movie.py diff --git a/test/brain_observatory/test_natural_scenes.py b/allensdk/test/brain_observatory/test_natural_scenes.py similarity index 100% rename from test/brain_observatory/test_natural_scenes.py rename to allensdk/test/brain_observatory/test_natural_scenes.py diff --git a/test/brain_observatory/test_notebook.py b/allensdk/test/brain_observatory/test_notebook.py similarity index 100% rename from test/brain_observatory/test_notebook.py rename to allensdk/test/brain_observatory/test_notebook.py diff --git a/test/brain_observatory/test_observatory_plots.py b/allensdk/test/brain_observatory/test_observatory_plots.py similarity index 100% rename from test/brain_observatory/test_observatory_plots.py rename to allensdk/test/brain_observatory/test_observatory_plots.py diff --git a/test/brain_observatory/test_observatory_plots_data.json b/allensdk/test/brain_observatory/test_observatory_plots_data.json similarity index 100% rename from test/brain_observatory/test_observatory_plots_data.json rename to allensdk/test/brain_observatory/test_observatory_plots_data.json diff --git a/test/brain_observatory/test_roi_masks.py b/allensdk/test/brain_observatory/test_roi_masks.py similarity index 100% rename from test/brain_observatory/test_roi_masks.py rename to allensdk/test/brain_observatory/test_roi_masks.py diff --git a/test/brain_observatory/test_session_analysis.py b/allensdk/test/brain_observatory/test_session_analysis.py similarity index 100% rename from test/brain_observatory/test_session_analysis.py rename to allensdk/test/brain_observatory/test_session_analysis.py diff --git a/test/brain_observatory/test_session_analysis_regression.py b/allensdk/test/brain_observatory/test_session_analysis_regression.py similarity index 100% rename from test/brain_observatory/test_session_analysis_regression.py rename to allensdk/test/brain_observatory/test_session_analysis_regression.py diff --git a/test/brain_observatory/test_session_analysis_regression_data.json b/allensdk/test/brain_observatory/test_session_analysis_regression_data.json similarity index 100% rename from test/brain_observatory/test_session_analysis_regression_data.json rename to allensdk/test/brain_observatory/test_session_analysis_regression_data.json diff --git a/test/brain_observatory/test_session_analysis_regression_data_list.json b/allensdk/test/brain_observatory/test_session_analysis_regression_data_list.json similarity index 100% rename from test/brain_observatory/test_session_analysis_regression_data_list.json rename to allensdk/test/brain_observatory/test_session_analysis_regression_data_list.json diff --git a/test/brain_observatory/test_session_api_utils.py b/allensdk/test/brain_observatory/test_session_api_utils.py similarity index 100% rename from test/brain_observatory/test_session_api_utils.py rename to allensdk/test/brain_observatory/test_session_api_utils.py diff --git a/test/brain_observatory/test_static_gratings.py b/allensdk/test/brain_observatory/test_static_gratings.py similarity index 100% rename from test/brain_observatory/test_static_gratings.py rename to allensdk/test/brain_observatory/test_static_gratings.py diff --git a/test/brain_observatory/test_stimulus_analysis.py b/allensdk/test/brain_observatory/test_stimulus_analysis.py similarity index 100% rename from test/brain_observatory/test_stimulus_analysis.py rename to allensdk/test/brain_observatory/test_stimulus_analysis.py diff --git a/test/brain_observatory/test_stimulus_info.py b/allensdk/test/brain_observatory/test_stimulus_info.py similarity index 100% rename from test/brain_observatory/test_stimulus_info.py rename to allensdk/test/brain_observatory/test_stimulus_info.py diff --git a/test/config/test_config_single_file_json.py b/allensdk/test/config/test_config_single_file_json.py similarity index 100% rename from test/config/test_config_single_file_json.py rename to allensdk/test/config/test_config_single_file_json.py diff --git a/test/config/test_json_comments.py b/allensdk/test/config/test_json_comments.py similarity index 100% rename from test/config/test_json_comments.py rename to allensdk/test/config/test_json_comments.py diff --git a/test/config/test_manifest.py b/allensdk/test/config/test_manifest.py similarity index 100% rename from test/config/test_manifest.py rename to allensdk/test/config/test_manifest.py diff --git a/test/config/test_multi_file_config.py b/allensdk/test/config/test_multi_file_config.py similarity index 100% rename from test/config/test_multi_file_config.py rename to allensdk/test/config/test_multi_file_config.py diff --git a/test/config/test_pyconfig_parser.py b/allensdk/test/config/test_pyconfig_parser.py similarity index 100% rename from test/config/test_pyconfig_parser.py rename to allensdk/test/config/test_pyconfig_parser.py diff --git a/test/core/nwb_ephys_files.txt b/allensdk/test/core/nwb_ephys_files.txt similarity index 100% rename from test/core/nwb_ephys_files.txt rename to allensdk/test/core/nwb_ephys_files.txt diff --git a/test/core/nwb_files.txt b/allensdk/test/core/nwb_files.txt similarity index 100% rename from test/core/nwb_files.txt rename to allensdk/test/core/nwb_files.txt diff --git a/test/core/test_authentication.py b/allensdk/test/core/test_authentication.py similarity index 100% rename from test/core/test_authentication.py rename to allensdk/test/core/test_authentication.py diff --git a/test/core/test_brain_observatory_cache.py b/allensdk/test/core/test_brain_observatory_cache.py similarity index 100% rename from test/core/test_brain_observatory_cache.py rename to allensdk/test/core/test_brain_observatory_cache.py diff --git a/test/core/test_brain_observatory_nwb_data_set.py b/allensdk/test/core/test_brain_observatory_nwb_data_set.py similarity index 100% rename from test/core/test_brain_observatory_nwb_data_set.py rename to allensdk/test/core/test_brain_observatory_nwb_data_set.py diff --git a/test/core/test_cell_filters.py b/allensdk/test/core/test_cell_filters.py similarity index 100% rename from test/core/test_cell_filters.py rename to allensdk/test/core/test_cell_filters.py diff --git a/test/core/test_cell_types_cache_unit.py b/allensdk/test/core/test_cell_types_cache_unit.py similarity index 100% rename from test/core/test_cell_types_cache_unit.py rename to allensdk/test/core/test_cell_types_cache_unit.py diff --git a/test/core/test_h5_utilities.py b/allensdk/test/core/test_h5_utilities.py similarity index 100% rename from test/core/test_h5_utilities.py rename to allensdk/test/core/test_h5_utilities.py diff --git a/test/core/test_json_utilities.py b/allensdk/test/core/test_json_utilities.py similarity index 100% rename from test/core/test_json_utilities.py rename to allensdk/test/core/test_json_utilities.py diff --git a/test/core/test_lazy_property.py b/allensdk/test/core/test_lazy_property.py similarity index 100% rename from test/core/test_lazy_property.py rename to allensdk/test/core/test_lazy_property.py diff --git a/test/core/test_mouse_connectivity_cache.py b/allensdk/test/core/test_mouse_connectivity_cache.py similarity index 100% rename from test/core/test_mouse_connectivity_cache.py rename to allensdk/test/core/test_mouse_connectivity_cache.py diff --git a/test/core/test_mouse_connectivity_notebook.py b/allensdk/test/core/test_mouse_connectivity_notebook.py similarity index 100% rename from test/core/test_mouse_connectivity_notebook.py rename to allensdk/test/core/test_mouse_connectivity_notebook.py diff --git a/test/core/test_nwb_data_set.py b/allensdk/test/core/test_nwb_data_set.py similarity index 100% rename from test/core/test_nwb_data_set.py rename to allensdk/test/core/test_nwb_data_set.py diff --git a/test/core/test_obj_utilities.py b/allensdk/test/core/test_obj_utilities.py similarity index 100% rename from test/core/test_obj_utilities.py rename to allensdk/test/core/test_obj_utilities.py diff --git a/test/core/test_reference_space.py b/allensdk/test/core/test_reference_space.py similarity index 100% rename from test/core/test_reference_space.py rename to allensdk/test/core/test_reference_space.py diff --git a/test/core/test_reference_space_cache.py b/allensdk/test/core/test_reference_space_cache.py similarity index 100% rename from test/core/test_reference_space_cache.py rename to allensdk/test/core/test_reference_space_cache.py diff --git a/test/core/test_reference_space_notebook.py b/allensdk/test/core/test_reference_space_notebook.py similarity index 100% rename from test/core/test_reference_space_notebook.py rename to allensdk/test/core/test_reference_space_notebook.py diff --git a/test/core/test_simple_tree.py b/allensdk/test/core/test_simple_tree.py similarity index 100% rename from test/core/test_simple_tree.py rename to allensdk/test/core/test_simple_tree.py diff --git a/test/core/test_sitk_utilities.py b/allensdk/test/core/test_sitk_utilities.py similarity index 100% rename from test/core/test_sitk_utilities.py rename to allensdk/test/core/test_sitk_utilities.py diff --git a/test/core/test_structure_tree.py b/allensdk/test/core/test_structure_tree.py similarity index 100% rename from test/core/test_structure_tree.py rename to allensdk/test/core/test_structure_tree.py diff --git a/test/ephys/data/spike_test_high_init_dvdt.txt b/allensdk/test/ephys/data/spike_test_high_init_dvdt.txt similarity index 100% rename from test/ephys/data/spike_test_high_init_dvdt.txt rename to allensdk/test/ephys/data/spike_test_high_init_dvdt.txt diff --git a/test/ephys/data/spike_test_pair.txt b/allensdk/test/ephys/data/spike_test_pair.txt similarity index 100% rename from test/ephys/data/spike_test_pair.txt rename to allensdk/test/ephys/data/spike_test_pair.txt diff --git a/test/ephys/data/spike_test_var_dt.txt b/allensdk/test/ephys/data/spike_test_var_dt.txt similarity index 100% rename from test/ephys/data/spike_test_var_dt.txt rename to allensdk/test/ephys/data/spike_test_var_dt.txt diff --git a/test/ephys/test_extractor.py b/allensdk/test/ephys/test_extractor.py similarity index 100% rename from test/ephys/test_extractor.py rename to allensdk/test/ephys/test_extractor.py diff --git a/test/ephys/test_features.py b/allensdk/test/ephys/test_features.py similarity index 100% rename from test/ephys/test_features.py rename to allensdk/test/ephys/test_features.py diff --git a/test/glif_tests.py b/allensdk/test/glif_tests.py similarity index 100% rename from test/glif_tests.py rename to allensdk/test/glif_tests.py diff --git a/test/internal/api/test_api_prerelease.py b/allensdk/test/internal/api/test_api_prerelease.py similarity index 100% rename from test/internal/api/test_api_prerelease.py rename to allensdk/test/internal/api/test_api_prerelease.py diff --git a/test/internal/api/test_grid_data_api_prerelease.py b/allensdk/test/internal/api/test_grid_data_api_prerelease.py similarity index 100% rename from test/internal/api/test_grid_data_api_prerelease.py rename to allensdk/test/internal/api/test_grid_data_api_prerelease.py diff --git a/test/internal/api/test_mouse_connectivity_api_prerelease.py b/allensdk/test/internal/api/test_mouse_connectivity_api_prerelease.py similarity index 100% rename from test/internal/api/test_mouse_connectivity_api_prerelease.py rename to allensdk/test/internal/api/test_mouse_connectivity_api_prerelease.py diff --git a/test/internal/api/test_pre_release.py b/allensdk/test/internal/api/test_pre_release.py similarity index 100% rename from test/internal/api/test_pre_release.py rename to allensdk/test/internal/api/test_pre_release.py diff --git a/test/internal/biophysical/conftest.py b/allensdk/test/internal/biophysical/conftest.py similarity index 100% rename from test/internal/biophysical/conftest.py rename to allensdk/test/internal/biophysical/conftest.py diff --git a/test/internal/biophysical/test_ephys_utils.py b/allensdk/test/internal/biophysical/test_ephys_utils.py similarity index 100% rename from test/internal/biophysical/test_ephys_utils.py rename to allensdk/test/internal/biophysical/test_ephys_utils.py diff --git a/test/internal/biophysical/test_optimize_run.py b/allensdk/test/internal/biophysical/test_optimize_run.py similarity index 100% rename from test/internal/biophysical/test_optimize_run.py rename to allensdk/test/internal/biophysical/test_optimize_run.py diff --git a/test/internal/biophysical/test_simulate_run.py b/allensdk/test/internal/biophysical/test_simulate_run.py similarity index 100% rename from test/internal/biophysical/test_simulate_run.py rename to allensdk/test/internal/biophysical/test_simulate_run.py diff --git a/test/internal/brain_observatory/test_roi_filter_utils.py b/allensdk/test/internal/brain_observatory/test_roi_filter_utils.py similarity index 100% rename from test/internal/brain_observatory/test_roi_filter_utils.py rename to allensdk/test/internal/brain_observatory/test_roi_filter_utils.py diff --git a/test/internal/brain_observatory/test_run_ophys_time_sync.py b/allensdk/test/internal/brain_observatory/test_run_ophys_time_sync.py similarity index 100% rename from test/internal/brain_observatory/test_run_ophys_time_sync.py rename to allensdk/test/internal/brain_observatory/test_run_ophys_time_sync.py diff --git a/test/internal/brain_observatory/test_time_sync.py b/allensdk/test/internal/brain_observatory/test_time_sync.py similarity index 100% rename from test/internal/brain_observatory/test_time_sync.py rename to allensdk/test/internal/brain_observatory/test_time_sync.py diff --git a/test/internal/brain_observatory/time_sync_test_data.json b/allensdk/test/internal/brain_observatory/time_sync_test_data.json similarity index 100% rename from test/internal/brain_observatory/time_sync_test_data.json rename to allensdk/test/internal/brain_observatory/time_sync_test_data.json diff --git a/test/internal/conftest.py b/allensdk/test/internal/conftest.py similarity index 100% rename from test/internal/conftest.py rename to allensdk/test/internal/conftest.py diff --git a/test/internal/core/test_mouse_connectivity_cache_prerelease.py b/allensdk/test/internal/core/test_mouse_connectivity_cache_prerelease.py similarity index 100% rename from test/internal/core/test_mouse_connectivity_cache_prerelease.py rename to allensdk/test/internal/core/test_mouse_connectivity_cache_prerelease.py diff --git a/test/internal/gbm/test_generate_gbm_heatmap.py b/allensdk/test/internal/gbm/test_generate_gbm_heatmap.py similarity index 100% rename from test/internal/gbm/test_generate_gbm_heatmap.py rename to allensdk/test/internal/gbm/test_generate_gbm_heatmap.py diff --git a/test/internal/morphology/test_apply_affine.py b/allensdk/test/internal/morphology/test_apply_affine.py similarity index 100% rename from test/internal/morphology/test_apply_affine.py rename to allensdk/test/internal/morphology/test_apply_affine.py diff --git a/test/internal/mouse_connectivity/test_interval_unionizer.py b/allensdk/test/internal/mouse_connectivity/test_interval_unionizer.py similarity index 100% rename from test/internal/mouse_connectivity/test_interval_unionizer.py rename to allensdk/test/internal/mouse_connectivity/test_interval_unionizer.py diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py similarity index 100% rename from test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py rename to allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_projection_functions.py diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py similarity index 100% rename from test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py rename to allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_visualization_utilities.py diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py similarity index 100% rename from test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py rename to allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_projector.py diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py b/allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py similarity index 100% rename from test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py rename to allensdk/test/internal/mouse_connectivity/test_projection_thumbnail/test_volume_utilities.py diff --git a/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py b/allensdk/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py similarity index 100% rename from test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py rename to allensdk/test/internal/mouse_connectivity/test_tissuecyte_unionize_record.py diff --git a/test/internal/mouse_connectivity/test_unionize_record.py b/allensdk/test/internal/mouse_connectivity/test_unionize_record.py similarity index 100% rename from test/internal/mouse_connectivity/test_unionize_record.py rename to allensdk/test/internal/mouse_connectivity/test_unionize_record.py diff --git a/test/internal/test_annotated_region_metrics.py b/allensdk/test/internal/test_annotated_region_metrics.py similarity index 100% rename from test/internal/test_annotated_region_metrics.py rename to allensdk/test/internal/test_annotated_region_metrics.py diff --git a/test/internal/test_biophysical_modules.py b/allensdk/test/internal/test_biophysical_modules.py similarity index 100% rename from test/internal/test_biophysical_modules.py rename to allensdk/test/internal/test_biophysical_modules.py diff --git a/test/internal/test_core_feature_extract.py b/allensdk/test/internal/test_core_feature_extract.py similarity index 100% rename from test/internal/test_core_feature_extract.py rename to allensdk/test/internal/test_core_feature_extract.py diff --git a/test/internal/test_eye_calibration.py b/allensdk/test/internal/test_eye_calibration.py similarity index 100% rename from test/internal/test_eye_calibration.py rename to allensdk/test/internal/test_eye_calibration.py diff --git a/test/internal/test_internal.py b/allensdk/test/internal/test_internal.py similarity index 100% rename from test/internal/test_internal.py rename to allensdk/test/internal/test_internal.py diff --git a/test/internal/test_mtrain_api.py b/allensdk/test/internal/test_mtrain_api.py similarity index 100% rename from test/internal/test_mtrain_api.py rename to allensdk/test/internal/test_mtrain_api.py diff --git a/test/internal/test_optimize_config_reader.py b/allensdk/test/internal/test_optimize_config_reader.py similarity index 100% rename from test/internal/test_optimize_config_reader.py rename to allensdk/test/internal/test_optimize_config_reader.py diff --git a/test/internal/test_optimize_manifest.py b/allensdk/test/internal/test_optimize_manifest.py similarity index 100% rename from test/internal/test_optimize_manifest.py rename to allensdk/test/internal/test_optimize_manifest.py diff --git a/test/internal/test_roi_filter.py b/allensdk/test/internal/test_roi_filter.py similarity index 100% rename from test/internal/test_roi_filter.py rename to allensdk/test/internal/test_roi_filter.py diff --git a/test/internal/test_simulate_manifest.py b/allensdk/test/internal/test_simulate_manifest.py similarity index 100% rename from test/internal/test_simulate_manifest.py rename to allensdk/test/internal/test_simulate_manifest.py diff --git a/test/internal/test_simulate_update_output.py b/allensdk/test/internal/test_simulate_update_output.py similarity index 100% rename from test/internal/test_simulate_update_output.py rename to allensdk/test/internal/test_simulate_update_output.py diff --git a/test/internal/tissuecyte_stitching/test_stitcher.py b/allensdk/test/internal/tissuecyte_stitching/test_stitcher.py similarity index 100% rename from test/internal/tissuecyte_stitching/test_stitcher.py rename to allensdk/test/internal/tissuecyte_stitching/test_stitcher.py diff --git a/test/internal/tissuecyte_stitching/test_tile.py b/allensdk/test/internal/tissuecyte_stitching/test_tile.py similarity index 100% rename from test/internal/tissuecyte_stitching/test_tile.py rename to allensdk/test/internal/tissuecyte_stitching/test_tile.py diff --git a/test/model/aa_model/468193142_fit.json b/allensdk/test/model/aa_model/468193142_fit.json similarity index 100% rename from test/model/aa_model/468193142_fit.json rename to allensdk/test/model/aa_model/468193142_fit.json diff --git a/test/model/aa_model/manifest.json b/allensdk/test/model/aa_model/manifest.json similarity index 100% rename from test/model/aa_model/manifest.json rename to allensdk/test/model/aa_model/manifest.json diff --git a/test/model/aa_model/test_biophysical_all_active.py b/allensdk/test/model/aa_model/test_biophysical_all_active.py similarity index 100% rename from test/model/aa_model/test_biophysical_all_active.py rename to allensdk/test/model/aa_model/test_biophysical_all_active.py diff --git a/test/model/check_parser.py b/allensdk/test/model/check_parser.py similarity index 100% rename from test/model/check_parser.py rename to allensdk/test/model/check_parser.py diff --git a/test/model/peri_model/468193142_fit.json b/allensdk/test/model/peri_model/468193142_fit.json similarity index 100% rename from test/model/peri_model/468193142_fit.json rename to allensdk/test/model/peri_model/468193142_fit.json diff --git a/test/model/peri_model/manifest.json b/allensdk/test/model/peri_model/manifest.json similarity index 100% rename from test/model/peri_model/manifest.json rename to allensdk/test/model/peri_model/manifest.json diff --git a/test/model/peri_model/test_biophysical_peri.py b/allensdk/test/model/peri_model/test_biophysical_peri.py similarity index 100% rename from test/model/peri_model/test_biophysical_peri.py rename to allensdk/test/model/peri_model/test_biophysical_peri.py diff --git a/test/model/test_biophysical_perisomatic.py b/allensdk/test/model/test_biophysical_perisomatic.py similarity index 100% rename from test/model/test_biophysical_perisomatic.py rename to allensdk/test/model/test_biophysical_perisomatic.py diff --git a/test/model/test_glif.py b/allensdk/test/model/test_glif.py similarity index 100% rename from test/model/test_glif.py rename to allensdk/test/model/test_glif.py diff --git a/test/model/test_runner.py b/allensdk/test/model/test_runner.py similarity index 100% rename from test/model/test_runner.py rename to allensdk/test/model/test_runner.py diff --git a/test/mouse_connectivity/__init__.py b/allensdk/test/mouse_connectivity/__init__.py similarity index 100% rename from test/mouse_connectivity/__init__.py rename to allensdk/test/mouse_connectivity/__init__.py diff --git a/test/mouse_connectivity/grid/__init__.py b/allensdk/test/mouse_connectivity/grid/__init__.py similarity index 100% rename from test/mouse_connectivity/grid/__init__.py rename to allensdk/test/mouse_connectivity/grid/__init__.py diff --git a/test/mouse_connectivity/grid/test_base_subimage.py b/allensdk/test/mouse_connectivity/grid/test_base_subimage.py similarity index 100% rename from test/mouse_connectivity/grid/test_base_subimage.py rename to allensdk/test/mouse_connectivity/grid/test_base_subimage.py diff --git a/test/mouse_connectivity/grid/test_cav_subimage.py b/allensdk/test/mouse_connectivity/grid/test_cav_subimage.py similarity index 100% rename from test/mouse_connectivity/grid/test_cav_subimage.py rename to allensdk/test/mouse_connectivity/grid/test_cav_subimage.py diff --git a/test/mouse_connectivity/grid/test_classic_subimage.py b/allensdk/test/mouse_connectivity/grid/test_classic_subimage.py similarity index 100% rename from test/mouse_connectivity/grid/test_classic_subimage.py rename to allensdk/test/mouse_connectivity/grid/test_classic_subimage.py diff --git a/test/mouse_connectivity/grid/test_image_series_gridder.py b/allensdk/test/mouse_connectivity/grid/test_image_series_gridder.py similarity index 100% rename from test/mouse_connectivity/grid/test_image_series_gridder.py rename to allensdk/test/mouse_connectivity/grid/test_image_series_gridder.py diff --git a/test/mouse_connectivity/grid/test_image_utilities.py b/allensdk/test/mouse_connectivity/grid/test_image_utilities.py similarity index 100% rename from test/mouse_connectivity/grid/test_image_utilities.py rename to allensdk/test/mouse_connectivity/grid/test_image_utilities.py diff --git a/test/test_argschema_utilities.py b/allensdk/test/test_argschema_utilities.py similarity index 100% rename from test/test_argschema_utilities.py rename to allensdk/test/test_argschema_utilities.py diff --git a/test/test_deprecated.py b/allensdk/test/test_deprecated.py similarity index 100% rename from test/test_deprecated.py rename to allensdk/test/test_deprecated.py diff --git a/test/test_inline_examples.py b/allensdk/test/test_inline_examples.py similarity index 100% rename from test/test_inline_examples.py rename to allensdk/test/test_inline_examples.py diff --git a/test/test_temp_dir.py b/allensdk/test/test_temp_dir.py similarity index 100% rename from test/test_temp_dir.py rename to allensdk/test/test_temp_dir.py diff --git a/test_utilities/__init__.py b/allensdk/test_utilities/__init__.py similarity index 100% rename from test_utilities/__init__.py rename to allensdk/test_utilities/__init__.py diff --git a/test_utilities/custom_comparators.py b/allensdk/test_utilities/custom_comparators.py similarity index 100% rename from test_utilities/custom_comparators.py rename to allensdk/test_utilities/custom_comparators.py diff --git a/test_utilities/regression_fixture.py b/allensdk/test_utilities/regression_fixture.py similarity index 100% rename from test_utilities/regression_fixture.py rename to allensdk/test_utilities/regression_fixture.py diff --git a/test_utilities/temp_dir.py b/allensdk/test_utilities/temp_dir.py similarity index 100% rename from test_utilities/temp_dir.py rename to allensdk/test_utilities/temp_dir.py diff --git a/api/__pycache__/__init__.cpython-37.pyc b/api/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f3177edbe0387fcde39e6332ac2ad0a4f150a7d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmXv}u}%Xq3{6=mmHH2vkUBIsuvJyX6-I=RDi#!!`VzMnHJ5}-%275xf-hj=m%8!^ zY)rTnSbCN%`}z6Jhr<D*Xg=QHtk2ljq4|#<6_<oW17_F*Gra{HoxHyD#kSH8Qo_W; zii30Lli3J}_J}fCo&&c{bl9NJJVn%YWi@}=Vrz*-(_G_VSsti--h%bK%yg1pLk4~q z+6<0Q>zw1HD7vl_)nRAcKop@}7o=2JZ}3IbxpA|l5`)`OZ-1(k30kR7)}GMM$Mo}f zHIerT+a#d|BP!^??_}vg2XEj)qJK^@M6#eMhgk2Dys?!`Hsd&g-oP4(`)Beft(5gP VD<$G?-=8+YY#q+dN%5P&egT)eYvcd` diff --git a/api/__pycache__/api.cpython-37.pyc b/api/__pycache__/api.cpython-37.pyc deleted file mode 100644 index ed0afb71917e9dbcaffe4919bc2cf740e79075e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13302 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 EPkubWlK=n! diff --git a/api/cloud_cache/__pycache__/__init__.cpython-37.pyc b/api/cloud_cache/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index dd1a7e31dbb0c542feb563847a14ae01d634e082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmZ?b<>g`kg51T8iM&AiF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j)7dH}v^ce> zI3_V8F-0#au{<%aGR844F*!dkCDAx0HLt8VCchvxuQ(Y<<`-mC7RUHxCdCwImZa(y zBqnDkrl$h+=HviXq-5(S7G&xt=j4~B#3v^vXQb-K$7kkcmc+;F6;$5hu*uC&Da}c> L13BR{5HkP(<99Y0 diff --git a/api/cloud_cache/__pycache__/cloud_cache.cpython-37.pyc b/api/cloud_cache/__pycache__/cloud_cache.cpython-37.pyc deleted file mode 100644 index b27a9122fe13dba9f3ae8fa4425b7270fd87c1b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38354 zcmeHwYj7M_c3#g+&jW+OU<iWmSCf(mf&xKO)UMZDT9E{bYuZ{!mMBpkNgfTR8^i$f z0J~>Ea(0llE!n${t$25B?>hF%2II98=i$VujT4t0JFyeTNn9yc%K4FwtKv9SsqBxW zQmG_Awo;XR-?`nldj<oN+Hlt?ML<nIZr^+RKF<4`d;8gmiM)Zo<}ds}_22xeVf+W) zgnuS3p2p9+mM{$4uoDfVnJ6ck$#SxpDyN!e*=(lE=>(r88<}RdoNeaHIk`_Y#+vzZ zUarl?czGOo%*I%GOwNV!gq(}zqMRqolX5PVOLE>--X-U$@|2u+mv`fwZcI1#l=n!T zna1AczVbe~&NlWp50nqcb*^!+d8m9yuE!dOn@7q=<T~Ft+B{Z1CfDP*w#t@V7jS*N zd^}-%!muao;yZ?2bWXgTDnEkzNxOvmlH5Ov`(5@F?x&nAo<D~B-S#x@r=7=ee-ih5 z?7g_(>zu^>4DR>Y`*FWt?oZ+VfPE162POZkZN6;G9{L)`dN%Ew&)2<<pT5>zZ#cer zxnAq|xfj+u^>(Y;@YAofa50<oQ_noR;1{b)UdOH0I!&ju(za(4zWHLcv$BYb+$)PO zU;V`5bC+?QS!lPG>o;&!@~X>D#k=EmoMvSmS()>b)mDAk@jAHPy-=;KI9KWo=b28& ztuJ*uj>qI>q*PX_-b!WJZR?WLOWoR<)2XzoO-DWGx(#IC>pG2Ur@rCHEA*2ZI~e`} zj1)i>aN!u`gl&|Qb^-&D^!L5c?by|hV}~ufUUggb){Vv4l%K1p*H!#{rP6HMT{NuX z7b=yT-D*P`Qu$@W-HS@)@b$*R#W!B@9M^lJx>B|0m#Vj_tvhc#)2i0mExUT*4X3r? zz0qEGT3!vu_WH^l?~Ui{OK*7fj&o+cT3f5$a8S0<Kn{EDY<0bUw$^BO?MjU!6~CTe zzvE8fz5DR<k~riNa{s{HKJ>}D=b@X=w`<kL_O83T*{NwB_VA$lsIK^0cRvn?@C)D1 z`+@hTk?=G#yoL#ghP|A!&pM`)b~4M!0|w4nCw;)MQ(sQmrk#E#UCudUcE--WW4xUx z=bbUfw3AMndF|Yn6ZV*$f5*g=aXd*&%D7#Sl!8tnMlsKXP9aV)rKnSgRZN*gN=fP= zUNL2tP9bJ7WlEPKZZT!IGaZy7b}?m7aDT`?{Ek`P>+EB%(842MPTEK9V@TU?pF?jC zI0x<H=<5ml5%l#Cay*J&J!YRoj>FCo=YTzf5~u80+#f~$WA<s>KW@+A-ohQn;EX+w zyW@5eAbj4Re75S<Yci99Qq@+<F!C1up0R3;s^?jqwzX1i*$v0)tT<MqU9~aw7E-Kg zt>y?ISXFD?ZLd1D&WvXPA*y^Vl>pzXl0bAswgy4Q5|Fg)x{DHR_s+a^x$St?;tSWT zdaKsx+78O!v1Ytx)$PnkJ<CqD({+)lQD1W|O49jx>$@FiosA)BS+m;978=}<COWp& z45)=<eq!DNZ2=AH);cWV-Dx)Jtu@bDZoAe-wNbZKyQP`yuCq~ZcU4zBr(<mZEkVsZ zsp`VK6`(oa*bXRwew~+>Tvt#pNS)_cy6LAlX3e(i%vzqKMstA}D&vl6aMXaS@-J3h z5UUPeEY+RSe{w4WSit~Zw9qFD?;?$C)R*Q-RwWCkkT;w^PMjWX>(+|n;y#!rOHWZ1 zsUGG7W7lr6jIKw`nxe+4dBJoGiIX<yynGkQ8wZEiK~7xPy<p;T;dR&7F*r6`r@(05 zy2c#0>Wzl3Ye|ig+irJa?dOz%&RL}Os7bZBE-khcp`TZc?A9v+!a*xT-t;<#>`ncS z#aLSvz;{W7Esh2l7KnA@j@2c(V_OMS>s>Gnwydt^h9kY)Z2_>z`RbiJ)+tmWU0ZJl znOB^~`f|5nIj)P=H-R=J*R#?Ja*HuNqkbViw*JIGCu$UL_{TGU3;202;?OZx6a9pp zu#@j56GlH}8*4fD(N3}tLb#gh8x^ya>C4$RaF>>2rk}udwvSwuT;JFlyUS;J+W=`u zEnXwfb#8;nSK4c{<9@R3`MG9w%>gKRzS+66?g**(_f$A!m3j-{x?HU}YSjI)N{E7f zQD4ejfF(x#ou~|Scz312H)7az8PA{A*A?OL1Tb&b^i9ucEV~EMf0x|EJ<LPIZ^&xM zi0iF-r&9TL+<9btMy6=y62)XDnMtT$Z~qV(oDU1t$p87rGk-GT8C>*@RgO~vLX3MH z_c)!xY54WYZv7=B3!^iVy{X|Bb?X@BjO&2BweJ72-t4s@{Hk?b*J*VCq$JHTx`*~W zvU9UaK{-9Juj)pode(3whciDwL!TUOXhaCAogr$V8423_*p6+MDSkcH%)`UYj04g@ z6Dj4$#8HUj#QiKZgZIb*lfC0Fw9bGRkWx9z_1nS`LcmotrZ;{zOz_U4i3GJBW_vQs z2%u(dZy~Fi`c&`OaC3+94zyT<S}thuDn-sj?|BYut=&*G7F17@Z$%D6%F}JtZ+0C( zMcoE;)R*rB{EakI)4tiHdji$_MM0`MWW{!)+iZ>Qn>&xJj_!}yJ38E-!CD@uJCCzF z0ecNO200VC?l5GBt<47ccWCBWG;vKgGu7KS+{~c(1GVpC)N$Cbfnk=x2aE8$cCAkN zA8d=9mJBRtec0IDVZk`z8c8YKb7=H>tl^IgH+)1@qdO5NPrdJax$UxvB&*VsKrRy4 zet@1t(2{Ux(7e&Z?(f#n98u`5?v2^o-kYEuv4I)rO$vo$IJ-r>P23eMsD2FSv0imO z@c(vzz159sy-{6)m>M=D5D+LXcuo_uPFV?jTz81_m?FH8ash{A>l~w2B>9lP%!d`m zTB^hY&+9f7qlcst$UAslQ@>&65(HU*MeD{>m5ocP6&1ANsrgl}-I`Hi3gw5Fg#JgE z8HjtjB9zhB%+Ka>oJG>QC35CKA1y%Q4qbxYx(hvN*%j4a>6Lqa=b4=j@(m2br}Weo zdXEkR>Zk$(bE~Nv4LKd-ZQ}<ax(GFH>29hav7j>qfJ>P#9AtDo0No%ZY+M{GbyeH2 zQ$L{vV)tUZbF~R0MiZ3Mv7e)eHX6v?lW6Xb>Yit|1N8{uMR%M`NXu-byOh@6LHD;H zg{>y<CN4u(+k_OimAVU2qt5|J_1e0v_ZpC}`vJ^%R={IdsvC~A<T%lg+U;AdKuRE1 z#OalO%RqBUNM2@tDOlYA2EIAHnP7t<J|^xaU9+F~eDWr(LW$n={An#rR5s>M3y1^Q zlCI;ALH2DltDV{k6XwtPiQ7YR(%18sIM20qbN#8G<{LRu86%nKJ+lqEkWb{ps5|<_ z-uxv|R=lTh5!N?rx<^r)pJfV!SNBognI7mO$TWpEKLb5(z1taTlz)UJc6`@Qprpqk zGSYjKxkT^G`)VmhLh)VVu)vM`II5}<O!!9&hz6G@aHGJbufQZ}rwBa#qySB-pV~4y ziGJ#BP{>WpO5Z#{;neK?ke=9UklbU~MC#!Q4v{siIT0=T)Ka6pv{~8sRKO@VWhSHN z5!n<H19BO%KTSe|lKR~PK*f#;P;nXrs16I%8@6#5WZ;0Y1=B39QU{CxxXfN!+TfCI zl#`W>ul;ZQ0d>>fIutHU;<w>}pYVp}&!x!!i};BMmPzzJGCV`u2;nIB8QprCtfciN zqQq)qD+!bc&_UV(wJxKGvOoT+vLIY-Ew}x&a4y~GjZuyME4tCNGp0eUo!fq@S-m}* zR$9hW$WTsifG<EP3x?Y(n{{Lvu8*+u9_tgUc`lQH?t}l{@%s+O6?9=DBrQsF+Y12` z91K>|n%3KhQUbbU+596;jNvEjdjl8LGgpnZENBj9xSxRd4V{x>_<Jya{a~V>bT4(1 ztEnv$scHN&b_%0uZl+qLSUO0~W~!5gc5A+!{PDe;W(Qg;@|*pnoqjj9nZ9n=neQ=P zGF~(KX@GyW`klZa4TaA`K@!82V){Uauy2;wed6>mFd>lF4w+(@q^&V$bmd`HBTOPJ zK{;2L^$@?JQGq0R-uh%0vIpddYRhsIFM>5pSI;_j5=L~U(Q|XrT57i=qY7)fzT&hj zo93k^bYqw{ZjoV#z#s-XT9e3YtB{YHZ5TUXdTV#xS|k{;mQ!Lw5_?8y<pWWHb!(;F zZP@6`oK*SAP~cSNl>rM6tAQb*4yzz^m6{7PABj`|(2%V{t<mc)MHZ|s(1GmBfnmlO z6pWC611gVgy;Y;#n>Mny^!P}lo%tK{*7Au@>F1kgKNVLTH_v=Z&t=e#%@fK}!}9#2 z(W=pC-;yT4j^)*t>SFl8kTtuFP94HT1Y2VF<510p{fgwgpf*f96}NfoYRjrQZl?;x zt_CH@n-khhlU*w?Ld8w3-i5&6HPAyfP8iOrk^yx`)pUd-8V#qwWy^7FG4?JEPO`#v z>(qUR?Zhk$qiiR2H;m9Vx9iLeG>j8A0vOnJ%z5yl?af17A*c>EO_?PLtICc$1gjqG z%Fc2X^CA7ZQf+un46W}ca)&L|UFc1PNg>i&r+P2WQq*q2KuJCrAh$9ohfov<s>2f3 zy!EQsojLkmX!yRE_s7C=o}X}MQ)1mJ=czBijzt;eyFgGEXU9Zj_w%Tv>xj&%gdCIO z;hU@NdQ0RSu~zsdJxA^YO3r2!1G$Q8sVYX{rD$TgT$GX3Le&sMfi;g5OF#bWsL7)Z z&N!M+BootVGm%M5rAo;H?o9lqQrm3>gH=G>W_z^kLm4QA-vWLf?RhXxQsSh!66^!V zzy;U)cY1mhb&t^QgF(_^9Cj%ziJ?Xr^pwad12#M}69W_TCmcPBkVd|c=p7km_XBw$ zWlW0VUe*58L2;DRp{InV3Olh0iDwncz+J<gldI%i!#mXh=N1E7^1UQ^yPZNln%d0j zJmyu;*C*h2ZCO=oVY??6`0mx<)g@=Dib^v_V+*Y2q=X<Nbb08Ch<u{(u>F=8tl=jj zA8Xu+;roNJ@u4xeII4O2&7|I!rK#ff4$)uQA$+~PMss2$I^U1xY-7|UqE=mbQsUjC z3=X;@gy!RxkT$E$fw@)pVxs&@Roq70M#L7~`j@&e3^o<*(24BQ)nys;N(2h?iXezs z5DYL}?jhw<Q#3zVN5{GqNC6gnBMqnOS}Os^6owQ^3842iupSUVOd`5Owii`(rFTBB zUN{F<H}uAj=esQrUO`oHo3a9{x(3HUK5DR^Q5E>vx+k^{zYy;^@Jr10uK=X|ahZOV ze;Bt4Qn;cX{%7R&XiPTtn8|!1pD3ATvbW739WO#TewoC65U(gJYc+2UH<XKE5uhRm z85vpybfL{uAJQ=tI}<(}kiIWN))fgiS?$MhDlid{(aHdbTTsN6K?5ex2>>M4F2$B2 z#>x?Z7gxIJv>@^6X?;KhViyNpf`qAS!}70o3=?UAER=l3pX}JtEANLdHiAx~+<ear zVRS~^h*IT%W7Jv)R}}v*UdTZTI?J)5_im^vHP!LTh@TDwbm(IcS*4~Ja_W&{LsVgc zHN;tA^b~Mn!zry5c#H6ChA4Gkk{Gsp;C*-zeajS;U<i$RGKvI5T1y-g2C4%M2www~ zY>~!dh9ZlL&J6sa>&U&%1Ca>UmJ>Mn`v=X{Q72vcaHLQui@Xt*RkcWcmzYM@uMXnM zo6uEqmW!|kctzwe4i$ib8Auw*L@v3V(G8T+GRFTc;(h-EBAzHooab*Q(xLiF-By7S z1T6j$<&+yJbOP1MIAat05YaB8w{d*oG=)(KA0l61HqfZ^O+>zFLY?A1_dq;9EA*#s z3*z1f`NpJ5&gc_6Al`vt2~(F4FZq?(6GNe4ezsDv+qFu?B{KRcShHN(ja-@t-C3sP zz|;|E(7EHDW*Ql!a`m6#6<v}p9e%z^ORc!jL@#nL@CkjVVzYO@gI7RU!=*LMH%Z7v z9a6&eH9jFJ5!&RN<SXv?@xIDKM26&ww8%Yx!!i84i#X)=n;C0Q!AvIh<5voQ>7naM z+-HmV>0Oyb@qBTjbiDMa)Kfzh`j3s~pZ5}mc_8vFSvKwY<-PscrL}v2xmm*$WX} zjCV8387GVT9OAts%8ik5Na6D^#x1X+MG@C3QKIF7Gl3ktkYmc;Epcc?q)Z|fZ5p+N z@oT$+JQBTzXtqhbh0i5+4Y6!teigemt?!T6N71T1&fe91(u!lYh5P-8*kj6Z)W9e< zvwQ$42UibC%A@vUNMR(~QRf)avy9wB?A}S_p0Q8inZ;D+IDP{;B*JeNk#VQ($C2xV z<jUGinX}Iz<&n=o$|^q!HRP;c91OdvE`*ePbjVxC^h6th*rcNsNK1vf!w9tj5jKc% zldwxca>gbh&Ii$EjAK<ic}R*HvLuRV{15`WXk;V99*E}(WWsoB0&B|%qb0e&7={9d z5#$VoblBD?t9%&86^rB2(OINnBw;C{@d=<YU7U>1LZns7PQ0697&na=oxtKPP8)=( z9%5>yZ`vuj%0d^&ZsqP8pG$a0`{ve|Z6asdPH$#zKiW@UHr_nEneAt{^3cFvvornd z>Nsrdui4qn%!|g&*RC7=%;ysBQ9HMp>*wsTZ!_ea56<K2jCT}Zk1xEJ4ALipb1^ti z2Io?6-W8mug7fa+Jgv^132AlluJJbQ{Cjl0dxL!Yc<xMYmHN5PuDgg<lX$cJv~&zc za`pCU8xwrhaKwp?v~#=D+XJ={x-u(7L2(cD%+sgOp1uO(7mQ`sdJup_pCqV8#?I>c zI&@L72=-1Owpwhhg2m*8Fu01EN$)AmdR7mn?^@eMNaS*8B$uF0=4BATyw!X3d)r;B zS--IYmABdw+b8PvV1;%qx7(t9J)iF#nP;K|pu+YA<Am<psaZUJ9I{w-qm4LJ8e&no z2Lo={Nm3pgVfNHH@Y>$#knl*8fs!!Z+bjwxy@p_2kenr_a|^Ctt2ZlsL!i4ud-6P^ zY@fRrwo73%<YNToBdbsi*SXn6WG)AQfeV%cBX}%&$hw2x_GZMn97X7aEd>>%W?2hW z|K46HO*;b;p{>K;a05n}-sx*$e?{xRr2^-b6##l!m(jj+Fy_H$*&7!npS?uEB!2Ul zSN7FLuNc}AcD9ZI#ta}Nhtax9)J0Z5Eo60e3jV?_gb5{C?AH^ZfQwCV>`J@kX9KZS z$s+Vp`n!iR6A}^k7<F5qP?iyh80DKc;6!y_V_8#_ei2{D=>066DUA)s&jr0kFeR@f zC?0lQF-HtyLOBC(8ze6{(kbav)+vu+f<(geT<TBo4tiWUF;)qJUMrE}Bpq&0YI_<v z4Jb=FGm|Ws`Aj}T)yZUvoDmR-yPW)&g0s5galfSW_6_n+9V-bduDAj5BKf1gk)&_| zKkpB5s2g;ZzHMwKJ9L*Ct0^&UfC$<&cbK<7+BZSe=4ss6N`t7KgqtwEngLNe*{54D zyOzRLaw~`D2v)tDNEkOyUN<`V)qFqM8Slg3NZIJ!)Q`^ziOeVx*(vn12(17S>?c5; zvRgu&E*UpF*A2J~)5>MonZz4Pb_TA+!<%FMv8`R5sny*Gs?FLUp6{ZqiCAu%4#s@% zGg_Ko2+>;<XG)L?F`LzOPeZ6oA2Ew)qKjg63<B@q`HGA-^VZ7@->3^Y5y#(1VAEA7 z+UM3W%Dv(#MHl!U$DXC(snhOYQH}|9u(RkVZheiS@HITh(6ij?_+t!)sH{16yxD2U z;ZDbGB1eP(E(6m9oZXweYT@9gs<!RAyfQmC?WUhXJd!)f#{%cMuv_knOlvb^`j(6J zD$-0pZFigNh=CS>_cM)ld#$@(o{+XzI&E3TQ%=_?4XM-$i&i011!zFL^3C<7sw>un za%#m}@pFje5VVL%?P5IGzZ3oac_PLMw9XLE1rb7_Lq0LZ2;oE?7QS5KXc9j2nIX{M zsZMzJud>qv5gil<C>97l{2nd<Z!n{;jkyPLrCj7m_aGyo)O`hRavIO=6j&zDW^hgi z=ZrctH(lz&YMCz^JkROpNjx7D$9w+0u$J+lT;aX2ezJa+C+p{#te<DHexAwtmC%yx zq=j`eNNK9KsNwKB2w4dCYPFWgmZ7PbQe_Zk7rME?_JYVgUCE+Q`7<<N=v)K~;XMq@ zr|W{eDc}RFwKvyn!-3vir!f&cZ@8#_iv;-g&J8&GAu1sMK>2uZ0AJmU+9@@}%d;I| zOJ~8;!j&C%eR&znEMP#5kRQ#2r!(x4H`hx;JV3c=hz8Ad^h+}t@6=2$H8W>@Ju%ZW zXDA<hG^jfk1Q%8m#C(lp#=RquaM~O<cR>1|qXd9zPYP+dXOxqOCl_E3B;#LYkU}Ws za2ABv4b5m+`4Lq)eT732fvgk8zXnl6G<D&Q9&bB5OyLk3<^_*7m>Q|!g3t#m<eHWC zawS}ZqsQ;piPEgoF!PB*!c69pAy>;K6kpq$n2PZ?_{V04P<!Xv2jYRW?fxX*MmObM zGC9clU`2_wq`RLBt;CKm&m@2~RsA>`h#7}OriDC;P9Y{}APMG{M*4yHPK_#*wp<lF z8lQ>}cnqrqg82jyG3@*Rp@W8<Ae_%-;PEiH91CDDCbNYYB>duE6K2HtQpgcz6218$ zh`3J$8Z1cTwcIn0YC&hkP3r9>ATYR-G#-vp(*GpnjiLm=nE;(6<dH-W!i3N!I)0Fg z63`dmNQDE)Mz9lTd0J>T@5uvrMpzWmb2^>sp4ox=*f%?4q}B0v(~Y#2f^uk~c1TuO z^aBYB<;UMsZz)J^6S_8X1ipnF0cVsNNA8l8*(Dr>Pp72RZe5BhVU&B1Jl(5u2Q4cE zEt{a5OO4CyzTV%^@GX7_kk<uzi9vZh36z1WPc6}F+(Cp)M20||!a3D7P*jh37f}tu zY-j{Wt)dqwRgY>8#59Ssacotqu7eC_h{#1g%0>5iOn6V0GK6mrBYgtxk+=<?G*>4| zb9z%c8bmeW%o(ef;^B0_(n6<^u22`CJ_i8}is!-S12z~mEr?cvnc3=@a?DX9au8kC zD^W>}vrcdw>lx)Tit)_e!LX9R>=V3AY8&S<@N4xRZ@0K=X5NZ1J*9gNFg&Ys3rh5n zpw>VqgFdc0p*Y133@|w}*GpPtgpjl6@EV!uDil8k0E}*DP+<uU>sW*exM^}`cD5*D ztJ2S=B}0JG;UJ5k>YIo{vlUxnRJ^O%l0W_mEPa%4AbTk0C47tA%B2Z82+oA3xg{i} zoP`+67eTtE=H78f@v*6(DKKz^4f&6xMIS?rMuwuN3DFaxD8x`xxEDECLDKoOpg9`T z_u@W};Lc&%#qkg$O85><uE@c(So+s+L$U;d1fh~bUq1n*>t~<_$r%cn5;jvH6bL&O zk(6hOq&SO+nG!*isU%K3Qy}G;0x8cVPCVx&KZuUHN8Kbs1xcL{LXi?1SxSkUAYmE4 zUq}T5oQsR@kD<lez&r0J^1U;+R_e7C5fYtS02x>i)GASt^kCP4=A-F_)q7lvm}1<B zNQ@#2x7zL+Wlk<8$oI})m0$!F{6`NqZ7^ONW)6aOz_yi<L<}-8ugryJ3MB^;F(hwj zo0)@wiR~3DOz$)hzNREz2ym`*CgfXq6)jM)*YrMeYNYU|v_PpY@ZYw9HPpa5PHT3) zx0|>N4F-N}M46~HuD#4XQ7G%ai{ai;W>Z*Tibhx76<}A`aL0DPz``SN!2OGOFaf31 zvv6TR=VFvH<CLQ#uSx>my+=j^H!)13(5R3yV3kt7^0*jScJl8vslOZ;7Ol7fz{Tt2 z0Rh>Hyz4{Od<%a=7JVj#C^y2)&d1kKbKKM(W)H&*A4+U6m#IF9Zigb0h}A<9^^~?T z=wUp@Nx{!B3fpMP_S~qPApnDFFH7$@^3^Zku^#+|6$cCX>kK>=WDJ;%m_-oGMZOJ- zh|S#s0MT<=c4lhaprRyV2|=B=f}oh8ASoCjIrjW}ut{WtVj)ov8X2~Pwi0xtKfvS= z8=}|WFUaNoL17e&!g?M1ea3@5crXYpkc3IWgmCi)M&v;w*Ik7Cf-H1B!G0B)xH!%d zeIt)aC?SA>nhM?2GLJUX$7bhVUUE!(Se7gQ@M5o9<E9i`Zxq?jqt;cIVM5Xq&qkd; z2jHPuNpJAL)M0E9s2;+WVg&!3+%p<e4)%@=5vakOIs}EBS1SsnjrUzAL9PtJ-F*_A zkSin-38Q1KriCkJaSwBm+~+7xdu8N;(TBNk1zsxwwBs;`8mkj_3W`UGTzIRf@<8=4 z1J#2ewv)2mPx=ENV*9O$>vnsX-^JOI3QzbXZWI^&QC@L*n!Cuu3p~)}AY!WfQ@nba zhZ8)AA(ggQ_iY{?!2#h`;xG_;{yj|nEDwXQDt!4W0hFtjjJ%4|hMhB2qPUnWq>71Y z#4iqk?SK%ip_Z{48fw3Sn=lI4D+Z>^q{IYY5(PIY3T}yTxs@hVZl)p?w`Ia5km_I` z3Mj}~dJIKfOs!?y708lU#D*t1SW#A_W?VD%l2V;v78O%Hodsin`aI-GYyxCww5dK& zq*)egfu_KOH0r;y4qmRvmNL34`b;Tq4ZF&KN`-sM@Bv9Uo`^gbZVIBS5~VRBzobG~ z``^IcHeh2d=T?jmK@VhgG3xdZd5><;{TRw(+&Z*~1)56&oG#b&!YSbPadtOxm>rMB z_R)T?0I-fL1l&NQ5JSIm0VvNDT@DI1-(mS+t$|R_&m#d_rVaXSeL4x0+iV2b`Ufgq znJ2ZZ7M8xSxVK7Rwos)pnNKnVx0u+AGX=(CO5F>PCwixbfO^L&HGpSPs|N7DiW`ti zWxo*s=cX!w-G*RI7k&uVDMdbMsk!}RKLzj89DG@+K6Y~gAg2My7dx4)Y(GtJ7aaO< z?Ym2G)n8<Zn-}4*hwC33w`>I9KDL_Q8i!RV)6Wp4yr1k8wkG-+A?S(KF%WK(&qW<F z0p#iG;}{nW2uhqHYt|wq)cRq77WfTBte6-9IMx->svSvXvYeVxu(GuTH*^w@Rv;PB ze+)r90Ch30R2x*O@964=Fea4iP|IAj1}xa3iRdH(hXx$!fUXN@$;X3lMF6vOh!V>j zd;%KR<Kqy*QcOybp;2*~aS<|-)t<u|BD{;6wWz53=+Q&OWJ)06-?dP7yoCU12wL<w zF|>ffQ`iGsNA0*D_78}YSKKcFzOmKMr1<9)(-AI1BzJ$Bhrh%_<PM}yTgZZ+Sx19f zh}mO`urLP1`T1bx;KQ5ED&`a;0NTc_eAnfIEDML@opa^>3@RuWWbTk4wGVPKkOWxp zYHJm!$B1~v>$!Fi8<(u#`8-JiS*NiFh7yp1X&C)U81iYFP;ywJZDLIl9No#%2(qwK zwVEuXP&0oE_<3A^Yrn4*Fy2MTU|5<B)Q43C$ZA&YII@0A*274221I5Rk$$Q^4+9?1 zPEg3Xy$+r=gbjk)@YaOj_)UWH4_DDZR#2irIMO`B$n<BoiY6Un{(|)13z&C*4u{Y+ zCum(}>L8Lz6z%U49ZPs<?2VSl03nmTL&F@I9S;`PXl$cJQe)dW+yHyPL>2aMmjGxk zTqna260lPDH0}^xC#*5GngV_$tG^eQ_!M0fNLLbHsLoa+TUumMP`as7+cofm1-4){ z#O7`8oo@&wzI7q`>|7XmuiH<MB0rIy$JVfHSK$ZZMhD8Pv5Uu$ves|*Dibj)LDi`O z5Zo{F@UuL;ibJ>~!dtk;zOfAOikWGopkIWAM9Yq_Lk@zgKM^w03JrY!iGW)`ZR8^= zED8qoVclq;2!!T0kbltb^)Mj#_a6{~!zC_4L$*P&o<JfR1-Wk=ifO0(R;}*(fWq+i z5mH9OumI7|^SO}LEnW@5>Mjj<;hdWwliT6d8X~gWifKwqDyu2&G;ShFD`9$2Za_^F z)lsmB-3VZJg#d9Gh;xNomNM!xY}xy!k>4P6Q5B8ebw2@k-JaL2jY=(In+s1P%HT@b zYxEV<Vu>hOai@r^DCS0`7*PZ9AU)NW>(G0`?h7&o4pUvT(9cn}Y}OHfM>t`^u|zbm z;C|HgsLeovRg@w;pPFThxU<&?o2(+}x->ZWU&c)P$#uJ&qjFZMc^e^H7bqlY9frNa z4Q!&Vdq=P{k;~W(@;J=X<2ey$SYih_yJ2A8AgP={Ei@}F;O8+=^#<e2!0u%`AZWfY z45j2A>p`dqi=ik5hHrxXr#mUclxA*2i-yMi#AddR!1sRkl7S%kL_d4LK<a*p{zNJ@ zaXID=7>EFU@jA5c>&ET>*=IQYf7#60CSpGkC(1X&4D~y5jkn6Rr1nvA6UI~<sd7Eu z&-ce+l>LYO9GsWw_mZ1qtsjf(K$OLlsxK&+?`K$cjlucQ?4_PO>MTh4OdsL+aITKE z@^YV*`YuK7K&dMOZy!e;Y;6`#7Nty1%H%qxJto`hVBr9w3^x!tn?^lj%Rp&F&Thco zKt&{9eFSr<VdELBv~SX!&ag0|^ES6WJeQ#&9c*_@8Q{THgE$~uMC3Xa@v?&OZx~iy zKldih{E*WaREv08+4Na>8EX=cg51#z5kq3u$FPa8t=72+-R0R3Oul~pA-(5(^q%_> zqvtWkugezt+?IHbTNJ(-ZBEQqGRLS{h<YVToxVLEvo79?s4a+JS{5-_9q!?;gEKH@ z(H4fMWX-xXOiT{Z&J0}6FAoC%v14i?cZ-Pz;nWP}s<X@I=dpMLVU6)ySW`HOYX9xC z%O8;}(RMpw(I*Cr%550`kN6M{6#v5P7Y4J-ZD3lmM`V9;FuUA_y^3X*u(Pj$Jkg8F zllx0JEcS9?-rkt*4ibaq349C^3(dNBIM^DgCDBGmgu7n?kr+w?Yw4dyb-u|kY(I@y z?RLw(!M9NH@-tky(z0hKlu6|m`QQ=`<z(v|e&@?Y#D<DdMcm9@xkPjzy$$ineU4>F z-4T23G&<FCa^;+#TsiM2m(LH=`pF76-Klk8ZsCFw@1rF5e4lZQK`13Ca)^wkxixWE z0#o+GlR)cA0V(Ro9bkfMvA#?tdq;<)lA)Jizp-cs-E-29Si*TpP@Ds;k-uFy=I~p< z&)bVR!5RWAv$}zO@!mX5o*^5vVWk07!zAM2cn@_E&aphi9N1=s66Qe(8CpX1647wD zqD42;$%3zBZ~s;&hfT}Ut7HAlDrhIJK*3k@%SpKg^<5p8s{*bHOnsYt=!f4(ZRR$| zHuF-;`0XW|Z7OdTz@5hX1#qY5`(yoraHpp?C%{8+-JbwwD`Jg8akYr6Nt--watmi{ zhzIA!4}ou>Ws`VbVl5~!2`=_kaIv40KJ4m`<9VrH>Sy~oJozkAv!L;r>d#}yG@dM| zfMbcy3MmIRQBrXZptZzT2{H?`W<`5-aR!ZGkE&2f4jF|O4H%WmDntSboF@v7B9Cw^ z8YWm8NdzXvx~OmhJHB9h)u43P$jUj!{-JI>&}ru_v1CQfi;*_A4b&z4(g#H(UG7|r zVm%o5ii*Z!IrMw=Qw6C?Pts5C#|p442zymsv@V0oy*`pJ3^E3l|8*gzA(qa(DO?+o zjlmG0yU|4Grf{Ug;^Cy-tBNp>n$L)^f5=}rxM!Ci5`Uqf91e9j9e#nY2=C&2=j(~H zivP?`J%|IDoWxJ{>g%#fzO48BhA9~S8uv{+b}KxPr1~j*A;*21w_^VPo4A_Yr8v*8 zF!gWoaFqx8obgemD!34j=ee0Z0lA!4XRazL7s!KPuUAXg#<?c}0wcNL#}!6)mNmVF zgP&?It-3$Vt84(n!<=avWC33WsrT@q0U={`Ecfh@J$($tj7N)LPGCG>N@P(<I03jJ z8RP%ed9P+%jFjAukTR|j*cMba>Mga9?a(|#`;M@k64;K?nZY)=LnW+|6v(jxAPJY> zIl0Gfrr|x~D&Y4vZ(AxK*upfIyxDXUnmB{VgLFT2ow+iS3#A8gWppkZ-t-Jt0ZYsz zlm$dm;!YwhnJNo^R4N>o8SX6%#)74ATP6e1Zy)XFQ1f0WJy|GCV+RbVFhMOhe+x_N zpkf7O^8LInlb15%C}Z}=2g>}nfZ^n;e}rMt6z2oRa3T`;XU{jFGU#C@VSk271X*(k z!Mu*G8wy#&4Qz&VLwNo`am~ce4e-kII+OdW0DL9>{%u@woizd};yR%?D!Ggpw1o~r zO3A(53js@tz1RIoK1spT%oSg-<o<nD{R2EWJa8La_v1Ls7KUlh-$N?CycW?$tP{kh z9gJTtPY)4M^=N~SGEG_K=qH-xj2&EVvj^|mwjS%ZNnYrMF!nPxmGZ9%!U7*7h>G$w zO6Y;|FG`duEysHky<t1twyL=|%40(tqqs|W6FwFe`)--6;dOrm=_=?#;)ZPAzRSZ; z@W3cqwdu)E@v6wfG7n;HWQ4jho70D*c43O#x_6mIn~?hpIF!dOV`Rmk=YEBWqK71T zMH1+eAGkFBs2TeWT=^5h%Hx^?JtSCtOyea2Pj4~jJ|0$ZxDLXgwoTcEK};4e6c3gT zV{4RBZYDRCOqL4RGV)OIL^4r4iQl=>W2M7Who|-(zRV4tPAu>!_0&+8{u4_S?mU`T z2ewTq#kNer9t&lBJd9C7@`<plle4p5PH=%QHVGMXunY!wvSA875{3;@?1?X9Iix*_ zr$yO9WD>&kF2C^dg-DaB{ssm{(BmO&AR_f3xZ>ptXO<v>+p>kn|J$30#GrK0H9+Hw zbGypD_2=kzP#LXPUb;$q&Wv~A;@Pv!J1TWX3H>6CgnI+VwxXTU`4s8>|9RsQ7;9AQ z+Qa$)RgIzy|9Iw)I4(<~Wt$RM2@wvO=p?a;34%@;f){RL0%S;T-?$^#0?z$SRO7Dk zFpERzsN>cK{&);%)P_!nnI#|<BpZreu;4gw+oO_ia5*;Qy562R`sw`#^okbJDbj-l z{A3xZ1Z=4<Vxb#oJifEgNv(n!z>u1Hm)(N|C*N~25&B!+<<)Pr<co8aV4YDp>0Q9? z3K?j={6b|KpRn>SV5fyT`P(?&<8n=bpI&Nr+82;b9za?@h1BvGvr55XSyrA%-aYIj z>o6#|g2$kndk4Cy--l6p9Qky2Gq}+<kOpp4yqfH(fQ6{5=pH`-#_qn00AbkHQ@1bm zX^nVt6Y*w!6SnPBw@)(mOvKECj9J@Ct4K8)L6~<Dcqw)gh@>}9LBLCK_XPwM)6Jgl zwX|rUtp%Y)ASQN*g;v>XgSBO$qyZbG{*sQaYUgiulqXqx1$qL^Q(k4`38+n(XXOi@ ze&$8_>{2<m01E}C#`9C(?cBj01OFJqQl6k!V!e8!j=62S<y>&-C_p`fEbcG!5OKwu zycGdNg))}MqT-X-lN>e@y(@vT#${Bh`)e#Ia2x^iNu(X&JTu8ibCD?mB2sGmjUsj! zz(*uN_#@6TuL2)w*wcfB*}sa?+I^SB%@}?H?Bw>G{eEH}JSeydXP-b%)nqVOoEzu^ zDiB6{ax)E8AVmn^+yXX=h&oIoXk4NVZ(fm|GJ^2%ATa!czi0*s{7*2V?mxxBPu^Pc z&1c*8okhgO3a}8U{5*k50i%MWqb#w=Lln&YB6E&&p#e1cE<QXdL9$_Z9OsjPaKVNN zP?&u<<-B!-`eBzCA`V^Q?n|sBE#-$Hi}K!iLKbB{qaZt2Bx!%0O7xBmLR9Ei)DVSE zinm#43P~sbO860~gcJM$1U5SecB6W`g{apKwxV4XRrPHwb%)K-jM9S?1a_}NL6jX? zu>Kf#IV?w@?e&dLzHcgD8U0h(xh1h$fLfY{<x^e3E4G=1Vhc~)YVk*)l0rc>wkBzz z_5K8KU0U7MPooVPDAhSYc3y-$?tGW)=WVE@{4NR=>CJKM;xg5TNC(K?ZBM|CT7;U7 zJ@EM5Si8h8B)^;99J~ETVg1-_>#MS9HQzEFzU8y{b}~LOk+-M&dGXx6*1>vadk=8u zqnm}>^LXnt-mq72=P2yCg{^&kybV-xY-@k#04=+``&{DYoZwP6Txx;X;)96sEp`s| z#pc^bFINxC>g>OOD`V@3`Wz6hj>=Wm=2lu%?sIFV`=_Y?7}Gm>d!HBq_P>Yk!2Dq1 z=AVL6kJ;I^G57_4Kg=Z_zXK0#*_Ec((MALxF1vb=ZMZ*Nb~R$z)fF)-;KQTt5zwCA z?mX0l7B>2#`yu#P@Yg6KErx{o_i&@-piu1Fjl_X3Rzb+aE|Q-$V2ncmZurG2f9%!Z zt31j8fI7boCH(}y$e9o1KG-Z3trhL{+wpvpWEMa5b*i&F5LXiIQQs0O=Yp4d!c^S9 zgNocg$Jd%K!=gzw8y~*@@u$nlPd>|UtjkXLw~<!HX6N{dsfTE1r(BS0yS@R_r|aIq zW5jM~PUZd~65M~r!|(I(OE|#%B73rNG(!%M?;XfrZCUu-$!!s0He)N{W-S%{8HqwP zd8&<_us<3jv%M(hTi6{wQ{-Wq#9Qf-f4E=eVHXeoiig*EAkQpM$0WE=!uH(n=kup| z_~$&l$iu(j;cXoJj0)pd)*%TwpX4(!PhVFVxFf+DIAjA0q_NV9vUe<y>Q&s9$5d=N z+xgqP&w_J{g*t=JYk)nM@r7G88t!LU{12FET(Nh2e*+rrXPNvjaZq11lhB*;gseT5 zupn671Y!Wh(rW>nFCzaZ2sn(EH4d0q%)j59GQ~TZqM;g+Akvg1Sb$Y2BR{pHbrDix z4k<Zk2IT1Z#8H%?r<EnSE;^T(W(q=U?*Wc9G?hjfnv`kjAE9Bc%>$=M+21IzDs$5) zgVI0XQ;M=-e{b<x`ukhB`tOh(L>|fQF;m4XV()XsJ;gmPpVjcwe;60}^C&b8m~LQl zSq^u*#aG{DAK7TPTm40M+3OZuAEuguJpohAxR`1R&`u`({PWyxae@1XRM$Wvp4s+Y z^X(hD2CKcGn5dO2Y6pN2Z-Nkc9m(}FKW6RXD>K`_{S#1;z_nVnZpcS3XtktwRhcq| zEXYIa$7^i(hdaUswxeLk20n^?(Rx^4_I~(=l@PRf)`k_L%%~k<cQB?TV<wbfu_sL^ z_p_S(UA$Ap=h2j~JHi5OFB!HYK*~4BLl^K9dkdXfce%|5C`UrJTEa=Fs>XVS?xYjH z&iApnk?0+bzfEZUJylqi;>+d5<nO`W4EohiA`R?WUQJ~wqB`pRq)xvXd;gL6`$M$7 zx5D$j+93MU&=`CXZTRh28xD+Y1LXn^=fuv0*kK31Vaoe&QTi)v2FEd1f_K6!riv+- z>7%KxjVA+Ccj_KgSJ7Z)F3;Max$hXHzIFj-^9j2M+MCC|<74(DXfbrF0b0D<FTE^Z z4va>o`lZypDKbeVEW@(+_JPQ;1jDH>;%b?Z4zX^HTgvk3Sy-im02Y|nIUy<t4x*80 zGvPWYy1%fGfpVA07E<__FSek<J`|U^1I6MC*Wh9k(!ZVZOHC2=$16t@|L2r>92-=@ zT*dF!VSgz322S)XhXvpcJat;rdbRF#tBq$JtVXW4-51tZ?szY{Z5qRb$;~s0C)i?G zn8ztp8Gf=+626096^df!qSYVrG!nH{&}FlY?*yS?FJG|MyGz)Ec#sr-$h`u^L_$qz z?^F;Ktf0YXSs2)@tlb}SFQMQM!oB{OBn&?=25_$f!*pXu9tLs}MUqq4jzs{{0-m^= z3O?7G7F!b5W6PFS+&fQf<T#t}rRBqA;v~e^j=8Z$LcX&Liz@chLu}v;*;1hQYZ@uP znU?Q)>k8-x!Dx6G@X<l+F5s&5$a0Nbx=m{TB^~Y-?O5l2HwLD6{JCJkr&JAxn)-02 z5CICD_`2Z}v!H>p>jB@s+~!9wRb;^uZm<d&d%f|iTzdQQi&igxHZ){<1DbgT@8nJv z1Dg5!`<Ar(5tMg7ibJ5QyNvi576z!K|JM+F<P*{#8y>e&cJ)!(I(Fk8Wz9Xrw_fMr zdwICX!xK0J3n*fyT<Vz&njLN<+54Zcjbg9O;Cmpj)#B?R>FHGO(FbX*9@={dZM`pP zP`DR(hSL=gE;?-`CRuAK3@YK@PEg42io#GMD`Nx*!8HjlJHj8NNDjab!sK`0(f{Ds zh%lM%&2JkIEm4M|9hQ%Wy@-I0BSUhqfS)Wxr8rBM2+gpvCrGmQ?K|}enjbhlw-Fe< z$L%~#P!dsb0oCu&69#4cFWr-5?~(02*|seos-lFe-8&ovRH1r7%BkEt{1~|SE%{Xm zeh!naIP(L)R}W2t--SVVU!TR4d7}CyN{x}{H%YM!`RM4`2muN6`zv^pL^|rYKf)7d zL|}>*u?`?fm<4r}<YMogYXJOe@Ht=*Pk|p)c}J7saOX-0orsdAxJO)hYg=5<soA%} z^<beDRBsQgaC8JekWVZh#~_g~h3mO=H-@RuZy-~N<3a#4Fe<$h+s0&DyB=73As(x^ zq#CaTS@=fx9(JQY#`E7L#*i-N_8~aPgv}_MGm9mc&t^~i8GbJs`)_g@R4@`-uRa+? z9)oS^mufD(qAC<BvS5;wm$7LD7c5GYllwc&^(+tH&x5d+I<Gt&$~ijo@$nDr7{=Sl z@OD1t_AfsMk<V#)_S!r}c(+w;U^j1k7o<^ddX;X6--WItyq2(1KCbgt*XyXI-Nm{) z+IQwdpp$P>l~3)MkFsTabu)*le00a`e7~o*<QIdi*kV72GP1+Ad~iZOKqcW+Vwe*> zQHDAOETZYsuIJ}2HQRQ#;XFm+>Rra+uteJ`BV_!@#UQc&RLR8ur;Se=7v;#SPa7w2 JeZF+;{{Vg>=rI5Q diff --git a/api/cloud_cache/__pycache__/file_attributes.cpython-37.pyc b/api/cloud_cache/__pycache__/file_attributes.cpython-37.pyc deleted file mode 100644 index 4c8bba1911a88eb1fe5cabd270f26e57ab9cd5f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2509 zcma)8Pj4JG6t`z)H=E6$rYQ(e1M&ex=g{O3Bv6Z>Ap$NXs%Xk#wUXr>JK5RH&J4Dv z=|<ZFBv<+c2q#W_C0{x9D{$gHZ+3PQZKQhT=dqvte($fn->t2+3AEwgzlk?3LjJ|c zv_<go1iJYYh$NC`q%#?5hyF-pAj1nHLlvBdolw%}B#z#~PI8bSowf#iJb`Xr0a2tw zCFul`c0v{TUt`de!DS>v8C^u3CDl@qY+O>=luH-UIqfXhD=oR~SK9STTdw$(6<9$z zcy3j$`L$KKF7I5B&YIi+&F;E;`y%P9AJR<iS*z1tWt9<CKuDWGJM5>1C7CdWou*mF zk|MVv&6({hChGmHIAVfnH7u;kM$FhkE6I*PrWaxg*e@&|8nHy=ObL_1K9NflXi{TU zZegLPSP4*YR_LMvZco`$rE)I?A&1KL3u)L;oTT|Nt4goP1lZ$&c(BGx9*R6YQpQfy zSElWyJQG@g6s3)yKCGLcRyunG>T5rl*ss`81%|))`6*h7O3cCeeJ?>+TI4*H*U#>u zBvjLsDoKw<_=)GQ_D{v3o7jU=7d_DfA0#46s!UiVYbAOk_Ix+?Q{2q^!t}309fH^g zef3I6KpKiHo;U+H&ck>SSpg8d6c%J4&C=fXGZ<?)6ow3DF>Z?C0SgAQ)4tNmFQFQr z8_&U<C?V$kqRKE}SJAJf%~@6qOUN$RH1a}zx)z{`eR1SM2!d<Roa&Zqqg{KZe1Zjp z4M!}=edy*55KG3?((}M<StuwQj_Eo5ll&E&)88rZ0?+#jcmeQWb&eN$-XZWp;Dy(C zk&Olokg9<j0T+sJdU8z1gg3_l(4}z*v^9=^E=vL>);KtOA53Dy3Ubl=M?YrAg=J@3 zGb0yp@7HE8V171pM9rNK<^&;byLM{Q+*pw(%7u`RuKkP1D)qhAg?5o0mC7w$9dr?< zfr~f>V1>_=b8TMh0*o1S+;EXm*^v&x?HYriF&erF<R79pVfe4yf7E?pphUW&FXVPl zoQizZ-OB}3z7)G%mA^FIqExwoJW@s3ADQmcwAVGMRS!#%oQPuuXR{1;$desWraMVi zRFeBj-|>pgZldjS<XW7kd1^WT2=L8^KuEJqH|bRmR_SKgr1(4AT5$PoPmjmcHMO#p z&J&74py7z!=Nei$CIgHyJ&37ZgE<U$VeqC;$UU5*e|Df7xK{}Y&OTU#3vPcmpmmUO z3lPR&7y1<FlSM$Y$i5rio!jv+++WV&eY^;-PM&vz+qfMLUH*6uZlQUz{H*cN?Wn4c z+ZXVGaf1$ZJHT6j44|4Ny^LN{3lHX);v+7jKf>2kHpafrA<E5zI9inIZ&CbV9Jpqh zOL)oLvMIFXCu(Fmv*&g8^2AFwrNCc|N!7S$V2a!|WHl^J9Qb5%&7!h!bKXcQx5POV zH0R&KVY3Q^(8&MR=>|Q!zbFz{Cl2CutdbmFLe8PO`LK``JS^O;a{g;2vMUZC$Rgof zd;L~WNyO3b0dXyOvPz}x=%z6kB)x?MFMv7XOJN!cgF9NAQ5aDCZEQk^?`hu*HSPq5 jV-;(}20!!$DzTn1C)T5&Y}fjFV#qgGqXuiCMO)$j6J&yV diff --git a/api/cloud_cache/__pycache__/manifest.cpython-37.pyc b/api/cloud_cache/__pycache__/manifest.cpython-37.pyc deleted file mode 100644 index 044a9ffe6988ddf385ce2a6044124621a522f43f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7232 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 HtB-#HD}&h4 diff --git a/api/cloud_cache/__pycache__/utils.cpython-37.pyc b/api/cloud_cache/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index f7acabcb6333108bdf8f8080573c5c77f64b47d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcma)7TW=gS81-ECl1+LMO-qA#unH(F+6y8Q5&@w$r2<41N|F+^-74~qy_sp|R@<BH zMq3F~c;*Kbq(nUNi;(6O38{a9CyqUvTalo%8n5lKznjlFUb}FiLGUEM{lGTo2>H_t zjvo)5n|RgtXgJ|cOcJN(ByP`j%-D^+#P9jG@5Pl~1#@0p?N#l6EvfhBX5SjUhL{(Q zm|r5?|Hb7MUj5PUEnsfmj%&P*@de>x#vi&%1oLxP*WmM*zsS8!(p-3fC`i*S>R;zN z%2E~=mHR0=O{ehhF&(bsn>UhiQI$fEWEwbT1D?w4y^Vi0M5D=}!<{4NsiWOPZ%WW} zr|u*FsW){FD^m|+f9i90uP#5+)x+A<d5+Ac<T?2j-;k5LNv7V^Kdc`Sv~x$~C&Y|B zuyNSHPX7oiniaO?64Ib}HU#4|N-3lFH||oFa$3enbtq`c5<#<}?cdtoq?;>rFbejB zrje$37NuHIosF5~s?)IM?lFlyT1aJw?UTn2;bN64E$zT~zeRUNDr6KG?=7lEk!FKf z&|xM`95NF7QM!w;jO%RhNCcYhM+_4uCcfC(x<^01vxW7KM?&dYARD&Q=c2G%&UsJi z`K(O79lD-ru}Y&MT~;d{maqdH=~#7wELo;J6N;vprdbe-Bno#DhpCrMLWhx}s6m)< zI*#J_xS;D<Dr|v8g6c7fvZY9F7O!z?ZP|+19;_*vGo=Jam2n8Cc2$^-VorlBMWvGR ztDrYhF}^`n5DFX{Q<Mu8$Y>zAH5Uq5dI+`7)oQnEk}A_PxpfC|wyVr!x14ONm39vF zwz<fq2$+F(JC9k~MyhRzQn$0A?JJ$hN!L0#c&p!0D-Zge7Hc20-fw@@>bD=h*FRsz z^@G>{T}TRo(1JAQ3s;JwhKTYg7R4N<cXB3`DC+2zy=p3SoCQTy2_}QEsLyJt3g7gK ziqcH#!V@VkYEmHRKr}1T(5=@{E3l^l(X?pHjI%`b79<<*z^Ki$SI4S^=^*@_$VF`X zdw6@be_sLDeHJp_8L%-+C;eL~!x?b4(iiEz>Swt~Re(0j!-?wOjRt)cX@N2Zdu&%= zZyaL<-|MnG>IQK(;yVGud38rRid83{6pJOnb_^7EhB8Zb5F_-DsMpYtYYnI2RGo%f zcNQJrU3BC%%$^7eSWS#LT0yyvju8|qBhJ)$<Z_3*Mi3wY9{U3-WY6qW0^sUp36LU2 zMfL@NsKa9|D4F;wjEBYZjNbxHjGLLN%s4#`Gc|KD$wr_?s!QwtLE}{$e5qmo6Qd#5 z87Z(Ex6aV1lspAeLLR6@rb2>mkR4|8j-x@x2ss^q2P0L|2qXp}F|zF3g(w;cIMu1I z#DtmygbgscL%$qiF$izH8*9dDSykg_J4$&rR#Z)t7D>w*TkbBG5@M}OmMTN{8K0rP z8C_m(SrxFB;k;w5zc3ffdef8U3YGI{3g38Yx|Rd-ikUXBE}N@n!L{R)HtYybpx44T z<)a~28;)GUKQ6PmA*gBB$tq?};Ahqutlq|}zC~l;cSOu>HpMOd%>DU8bDtf0+{I1i zJ$YOEQ}3C>y**#99p7*cIbHFXZj)`?%-@g=@*Tm7>X89&<=`)yXNeA5s!%*(Tm(_V zVrrtJAyc8fN0=SI3Rq9FTBY{>egHJIs5z>K)}6tcJunphtkqWnsR90JVDGNQY)^bJ z_?Vsvym`zDv(9>i77n7DYnO;DPqbFlOkO}vQ5%#N3g4(s;Y(cPg$H>ls-v7U4e5kw z9zk|=)0c1HG<sFDS;(Rmr8~w)Q3=9Py7w{^uGm7DwIvKp&Ueg_UPMDK)|~~2&_%r0 z9r+GsnwN^Ip5(x`Gy)_&G)2wqLZH%sLYkejZsr%j{u22{(<@fcOPs!GK6|LS)ijGW kYyM1l7PA(v^-q$Fk7DtuDU7;|<}$*n<A>H;eCzVkKT&zwu>b%7 diff --git a/api/queries/__pycache__/__init__.cpython-37.pyc b/api/queries/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 01ce98964f367205127caefaac2141f26b27e733..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmZ?b<>g`kg51T8i8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU#ZSkF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>Kd~TFzpym5C^NNKKR!M)FS8^*Uaz3?7Kcr4eoARhsvXGs I&p^xo082|X4*&oF diff --git a/api/queries/__pycache__/annotated_section_data_sets_api.cpython-37.pyc b/api/queries/__pycache__/annotated_section_data_sets_api.cpython-37.pyc deleted file mode 100644 index 958376e6b378b5171b4471878d79a7a9bb0a3cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7099 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 Ykl*j2^tgDnzq<MJa3@gzidxbC1G?}bm;e9( diff --git a/api/queries/__pycache__/biophysical_api.cpython-37.pyc b/api/queries/__pycache__/biophysical_api.cpython-37.pyc deleted file mode 100644 index f0ab412291024cdc64ddc458d787fc447165acea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9375 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 diff --git a/api/queries/__pycache__/brain_observatory_api.cpython-37.pyc b/api/queries/__pycache__/brain_observatory_api.cpython-37.pyc deleted file mode 100644 index 6d3503aaa5fc930d1f578733f6464a5e9a762198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23607 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 diff --git a/api/queries/__pycache__/cell_types_api.cpython-37.pyc b/api/queries/__pycache__/cell_types_api.cpython-37.pyc deleted file mode 100644 index 11f5c7415ed955aafb4b47ecea2b3a4a4787cfb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12059 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 diff --git a/api/queries/__pycache__/connected_services.cpython-37.pyc b/api/queries/__pycache__/connected_services.cpython-37.pyc deleted file mode 100644 index f2852d1501f62eb1ede536c9908e72cf27da1f1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7933 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 diff --git a/api/queries/__pycache__/glif_api.cpython-37.pyc b/api/queries/__pycache__/glif_api.cpython-37.pyc deleted file mode 100644 index 5029b41a45fe2a0d077a4bcf6b717987732c746e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6069 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 E26eS^vj6}9 diff --git a/api/queries/__pycache__/grid_data_api.cpython-37.pyc b/api/queries/__pycache__/grid_data_api.cpython-37.pyc deleted file mode 100644 index 85a7bc0b086527bb49f7f1f6691aeae0e1bfcb05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7159 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 diff --git a/api/queries/__pycache__/image_download_api.cpython-37.pyc b/api/queries/__pycache__/image_download_api.cpython-37.pyc deleted file mode 100644 index bbea4a542db527936cf6eb88059d24b110bd3f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14717 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 IggRONKck5mT>t<8 diff --git a/api/queries/__pycache__/mouse_atlas_api.cpython-37.pyc b/api/queries/__pycache__/mouse_atlas_api.cpython-37.pyc deleted file mode 100644 index bf249a0bd96d7933fd146d504bf767365ec8da8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3855 zcmbtXPj4H?72khcE-8_=BwJ3LrX4tGtwj|YXb%C5qKIOts@sSTL_0v%Di))iA-U52 z>&!ALS-C)A13jhat(P8b^wclW&(QPUik$ova_W1t<WjWgq)v9RZ)a!Tym|AR_kJ_` zajVtT;EMnGXWDs7)4sxw*;RwWNASqcKroHzkrwNou4CDVjM((d*zzp+HklRGV%xJ- zxfa!9$8%KKjv8^(YwFs*#_G&@rZI=x+<9twE3DDe+~!NLt+{&9mSKMCkMb}I^N>r| zC~Eg;Fyuuez!yD^_)EQ1T|4A`E_f2~UPc4HlZDWKWnYABm*%wmbTT?nodUE!yXsK* z2p;)w5M1+grg;X_J(C%p#Z0fpEYF5=9X!-{gVmVL>R%e{E!JSoXZlmPz2+-zZ?hG) zI&E9w4r}q%lNN8ETw!f?g<XZ-YhRjdoozhRp!e0+YFuO2mB!j@H8$A|rLoQ&K<;MI zI!H&7@8l7cFzLww*-g)qD5Xpi)j~cNG)#z6AOnDhFu-S<h#7q3i!>U=Ty7JZFcR~e zqC%%h;Bs|=>+k9>&GKcyEBp^2SeP`5T*GscQS6KKOnS{c&1s~{-2m0`vf**y`7JzB zfH()FPaUzIYv<YtAo;{##&d(2&&}M*Yv;yO<Awf0e`1~Mpw|$;Ik%W~p<OTAKh!|O zd~V~~4D=VqlNwm7_aVAK-#M?b#y_C_@5Wzsj4pZ#ZdbSvN}^EaB<&N)gFH+Vg$R7) zl5FumWL$(XPjcy!zDQ$|5BWtT6)uQPiD)L$6R^^0R`s7!K><ZBWL5P+byZaZo^U^e zMY>yg6DIjKNi+0_MwKEC^{X%fd$4436oHe+RB}eZZ*&a}Npdz!B`4rK=t!K>8I>d$ zf-3>^3@4z!U=bpMLq=hb>2y0}m-i{yC!r*;wq*d|=rBb#3i9vjZJq++a&!#%BIZ+T za$&qzFfOsZfaxL6M<TfdXf>tTg0e8k0nw@+-QQF5j5w~Tn%kvi2VjF#ux)Y{=0m`h zlT?s66(zWf)=E`L0Q4L{1suz8>X3N^bSG=GSw0Tg`(g6OC%^kz-=19AR*O~D6*U-@ zi-~nRWVgL`uZ%{duO836no@SHq86u&M}-rJ5Z96x^)Lyd5%g?BLb*<1;q;4Z2M-?g z_WYfPpX~JfPY)mLKDzg?SJ?ej#56CglQc{UGp1Q#%3Ks?mS)9@vh4qU#KqXP3rq5- z?>V#3^j0pcd|{uSQ8AF>DvYTH{+A|x0OhZvdv}i>NeK5NI;5;~OwVXCKH5oWkS2`& z{D>!C$fGpli3~ud*>Eh6J_(PHfa>`NK;5Un(a<-FK!cs$p;>qb9Rm8l6C<_x6uHfZ z`c5`3t`B(bPxIDCqJocHeh7}pO%U3qqc`<U!_jXVZIA}swmx}pfh0RiZF~b~As1cb zEPa8qrkn(fgxq$Sv!<N(hMe_Z*yomUmWqmbto?s%lZpXNLK(kl4y(ZkWN@zdg=QJ2 zB1{Gt_mHzdIWx=ie3q!MR*r1_%$?InFa$PDWg5RR@4eQGk^;etx$Rf{P()VI!JE*? z-Ky7e5<#aHiG$8aVeZXTfo#!8A`K!x0VI{_?qvP(3_)0%k}5<C;&^g>`|;e)ybV)+ zN*LBYxZpMCTCOFoKy#U*Ygj4?Laal%XqWu(;BbGZd%t%euA#zp6qq>T1`0U*Y2s}V zt}SlD%UiwRo%GuCu`rUvJE&d}f}(>`ybBFQ1Jg{c-4T42>AA5qJ#So2Pt~um1Hmbf z9v(spE2H@kjvVX#Fyej!o2;Luz#_2Sd8^pwpYrh;P^xQs4saZF9E=MaEC5v&P1NXz z36!f$H^D5LzK8xH9_QL~IHBbFiE*yKF!78F=Lfy(n#C<PJyxk1`SYFD$1{~;B7p}> zufDt2?cIO)xoau}#Vx2TTJwDtfO{3FcPiT#%rc<EFdzR3U9&)FHA|nki$Hxtzwa<d z@naaJoP@pC-8<Z0n1lEUwj$$SSmK+@Jb<VagYjQLbME-ow>w^T`+j~m?sp$vhJUH+ z?=Ev4j$kG1e_QbWr{C^<)zdY)UG;1fj$cNpUo?Fmw%QSdtzWGAu;J23#jjt~eV?U) z?~4r>(Yvv`_t~;-T>J=I+rNHvu+#Oc492h!c)AupL_tvC0o~ignD=4#6@rd^Jk|L4 zV<j-&#rr63qu4^>qL?qMDq;GH28a$k5`|+}hNY_;-c7yzo{|J>Z2g+O_*Q+p?yA?C zZR;I4VDZwqTU8xy>2RpvL$%GTKfI2TrK31KZ=?E8@g@G};W<FyUxnAI5>M5s<ZHlL j$H$*OQR0GgST?!B`9--Nzr>iA`1iZ2Uo}>BxUK&IS%nr- diff --git a/api/queries/__pycache__/mouse_connectivity_api.cpython-37.pyc b/api/queries/__pycache__/mouse_connectivity_api.cpython-37.pyc deleted file mode 100644 index 31d501bcf6fbbb503a1972b2e812fc65dbf204e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17591 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 I!C&!z0PhS3>;M1& diff --git a/api/queries/__pycache__/ontologies_api.cpython-37.pyc b/api/queries/__pycache__/ontologies_api.cpython-37.pyc deleted file mode 100644 index 831ed16b0cb9f99c2d0d10d0aff8dc5ad4b28512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7575 zcmd5BU31&U5g@@&QS?V-J4zfIac#$pWy<+zn^6?SvfN}kNtKMHzR*hH6YfaD0s-a@ zw1za*nbzv0eQ>Akvmff|Q-47JM1MdZ@X(h&<+0N@zofed-~dvx9oJ2#;P8msz1!Q{ z-P_$;UZ0(<YVh>_^b7L4w>0e^*hwA(UarAcyax@{sP1Y#y`}3K&C$G@>*ZT{`EIyI zuh1&!+Q%9#(Bi&Ei%h?tZxv~2Lu-`3)?s=>4`*)n$R_LcT@tXb0fexMP3$fs+b)C7 z>_)%`b}-;<lQU-HkmNZTzldK0F{ZV2s<m=dZ{?8{YT&Z8)X`~~R%jJ|XC9VmO~Pjt zydJ}kNcd3&KNiD}OZZC)J{QAJ0Q{t+eClC=z6`y2)q4ecud3c@*?Wzip=YT{U#I8j z_vm?gfnKC<bSiSxC7{`OSfOvi$O64Q#q|PUu1NY#IT|@zd|2vK9ld4H>tAVYoxVli z-mkO@tax9eSL08-^LB~8L*L!k@9V9S#3%4P{XYGHgqP_L>3jQHt0M7hbcwz%;Z@mR zrXTEUFndP!R_KSaSChRP^cr22V`sn846RiM)&3}){mct|*Y7w?toEJJuxi4y!Pt^{ zdo^&0FmG_O>v$bu5|5hcU^#BN8wCBO#l<dj`^{}m9Pdhx^qW5KEK)~+oeURA-&vG| zE+>R81EI?)p_SW~q!k|ZBTk0amjlLupYW7O%t=_=L#x9{ziT;EjLL#B(<40=R+Pn! zPTxufoOir?_spax%)PxYMkiBR%?RUj%6OP3uKQ6~QG*-h(2$g8C=)h!`hnwnVWH<! z=7wbe1i%{!3(@SdH|Sa1-xXoO_6J@N9!W-6eZomkg!AdT=^k(aF}f-jy`=_38x&2% zX15?m<0itHh)oFyPpFAfI)VjKHs>+~BUnT$#!EV-xHBzb1V_AGRKzU+id!j9YK){* zQQZtb@kT7y5doN4qQs9;e~kjKfh*v%*wnE(hRtzk!j~o&jpo<X{0$a_HG)RTM1(6y z%L-=`V1RyTv~%x*>9kD=M3I<|Fez(09;4=ky;}~A1d`%Gv<vqxFpoOz3wtRKQrMRg zt86UDzGK7g{6XJx$u@JvsQH}Zt1+)lhmMlXNR5w<D@>1cm=z5BY&09M4yOSp9LaQ1 zBcqJOBzJODY8Y9I8l5_ff22BpC<5t+6(yubWm<1XP-P{@v)ut@q2YV(Fx4f039)lZ zIKtX>g08fsR$W15{~+bFXc0)BAH_x)$TU$o9ZwZ(VovE5EfTd3T5XgLV|t3<x}Aen z@WEdUnR)n%SD*>BKp$)Ob9ZuMJ<#vuss11b0aF9dnOkq@tvY(Dq17Xv(`F)Q7-2yS z`i%1;Ob*MI<#<kDS>Y`25i5uzr)cCtLom19DsO`+TLbQ39JMSPEL&LCpS8z3YfD={ z6^x55(j~OHO?HVl+*<XB?R%8Gv&Fo-V$1I{PuS4<{q9g~ed=s)3Ghx=`o!J=1A@7( z3nS=`^ue)DT}&;=0@vK^5BYiE^|!cV+`6XM^wG)BvN55VY{M?&0C+Ir!1qt!D}D*h zSf~0<g_~pTj!Z4a`nWJIj!V>dP~59{KN~}&2mG}dUl`|Nd{N?8#vob1-;VL6aX!YE zCH~CVkocd+_{!Lb@m0i+E1-`V@)uCsO%_1pxXVmR0%DSFe-J?2B7xs?Y~q^A@I<pJ zgAN9}&(TpcaO*;WuBb<W)YRxqNef#t9WO9_Zla?z{Wf;Rg6YecL0mN#S3!nQ-R2G( z3N!G{4g=QQEKe}qgs2fX_P`}PieD*D(+o&IZ7$)SAUtQeh#*g5B;i#adKp9|J09T> z$IPJ1Olj1L`E=dnV0{PMCfSX{I!{>rMfVJppS<IyT2#h%5N#r=SfC1z`b=;)f3ga) zhfKnR<2!)JWVXQ|gb!-;I%-CeCIC^e5d}s<U649BkfF($4TPjJcx=Y0k%D0lxR+W( zY@mt~b?iy9s7Np-0Wt56@I9a|`o0JD2QDOlL=A059+Ecqds6MIpZ_>rZ`}{r)M{$2 z&%o20zQ@qwaTz!~T^|^SuIuz1+<0n7rs(<umzvwm1nE$S$|f-br^ixpuk#Z45RM+D zVelDzpYr>25$ePtD7;s|tW$@eUXD=n2T|Z}>xny-+2*iO<riUGHU*If1kZVEI-o{5 zQh4mZ(P(AjF`gD_uTz@|i#xl7cSLBQ`1vK|PBsl(zYcD}Qgp>104A28(ax9kqMnOC zRsGxc%DK_$NpC*6fL%c1@L<GJJ{^TBeXUL*@`1O`g9pw(D1x6g$lu`tcf;THT%XX4 zM+Il*gW@sFOYOt{r7iDv9a}<%U;{YhJ9E9tK=D{fBW<$))>h(FM=Y^<I1W<F5Dst- zKL0;w-&8#PuMdB89$yC|IQ%>|bp9qHi}K9y%kVyB<opW4rfmD=Nz+R+!oR^_fySqu zD1(I?`sm`*Y&M;!GB-?J@Vf?Iu>cKbB=g!IWj3;}J<|7bcwgVw#<?4CKi<oOMeDS< ztVIP5@;=z~n(y6Z9Nm+EM67#7FucMA;Iotgfj5AA9T<4qVc^psiW3<KUcjW$3A8Z* zfzWUR-ao>3rFpbSwffWi^|MT59sKnK)m77DyATZALC?br5}_1!3OhoNo-&n*7Kk98 z4S8;y@uY{Qm2ri!h-{FkeDD`lvjJam8X5{t1r&kG$v@IjEx*dmYp51*FU55=G0Dc| zM2r9(nDj+$PY*!5_x0cBzBD!>8v}Qqhp-BHb*_0e)Tf>5<LWX-YuoSjSH3|mkaAHQ z-JCSCfrpuM>U{BbVI><D&1Khz6jH3f3+ZiBf-ee^kbkT%a@_FO-@pTG6`%;>1n{D> z>C;e7=pak~g0D7Oc`=3#mmJ<>q~wn8LCuZoAbK5z9m%heo0ye{!BXBBfaR?6o<7dX zT5h9}<8Q-&Q1_;G#oq<64iZRY{K<d1r9`42<>WQHbZbUw#(E|b*Itx~R$4upunM>X zh6U2^yF+l4m_K9_0Ck936~${7uYglB49`5>68{P72<a_n%X&3e&y5zIXMdYEDj6R< zl^FKd;47{|Bd=*?{z`n!LKkT~$nWL7;~5APY9AQrK;g8O$Zy~*eF_RPSEIU&N$wH{ zN+T`<M*?+{PLvE_Zi&7OADJP*P1m;_>0Nzw*_0*5)ZHbaS<U=*H#JqVh>~sAf!uuZ zj)tHoU5~JgVZ!a4*?}qg%y!z29hH(Y`S3PeGTT6Y+xJ~YyeC}wHu->=m!R@Q25!)R z<O42N0+J%R1g3^^zYdL}N%l(mEN_n4J}fVHis?5&Tl;p&`(_uMy}aR}*T)+v1%}Y; zD>2`eWi(9ZQ)MRV{V!E~)6fB>X2=|c5B26XtbZ&;mSiRiVUc30vh3SYMY-7xdTvra zM$6ia5|`J&lp#eq13&BFsqmMZ5lp5n(NUG~Rza$gH*w5Vx^fKD6)9pUH%gJfA0(Q< zN~Lx(%D=0*C?|(3`|RWyJTO<e*(4syQ-`Hc83`dKKFYy~%Ey->43tTlrAKMj6nit7 zCEh^B@HlJ0&}jaNtUM<Z7&@NL#N0$m7nd6sCb&6wkQ;Tx;|VH_!@!Ie5-FQFjnj6@ zd@d`a_+pZW(j24#=%F^El3XE{-K#)>pNn|Mdm-2W>OC|tl0XL?HAm{x8b3a{8@$21 zg?m9QX?aw6Q7U|t`5y%SG-)23*3iN7);ICz2-X4dv_l=RYFY3{!obD%ngusc;>MVg zWl`U@EPes`I*$$NlP_X}zL|f3%?dUjVsj0f>(GR=apllvt_uW|nSkcrz(IJglm$r? zg7_;mWy8oPS4m8_@x7c&AkW(`s+otqB~;VjY5E5_z_E3sZWxL(&Z#dO!0XZZ@|>a9 zUauGG1w)tnT5ptEwQPlzqaC%*CH2oH`VhEtGpIyBz17A)ESs{GGH#t#1EB!JG6nqr h{>0>Hk8+t*veBEoua}o2g|48=1V+=EUdz?;{{~`j9Yg>C diff --git a/api/queries/__pycache__/reference_space_api.cpython-37.pyc b/api/queries/__pycache__/reference_space_api.cpython-37.pyc deleted file mode 100644 index ebac91f9ff742b580b4e21f710deef82821de80f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7957 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 diff --git a/api/queries/__pycache__/rma_api.cpython-37.pyc b/api/queries/__pycache__/rma_api.cpython-37.pyc deleted file mode 100644 index 2f5909bcfbf5ac8533ffd7862b160ca0cc02f8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15835 zcmeHO%WoV<dhhOeayX<Yijpl^w%f8KisD1I{8*bSKPZa!awAa;N!gpRh;ehONw(P2 zJ*w^@#lh&1*ub7P@FB=qLQX+~<UiO`kXsG`a!KEk0KxjYM<GD+`>LvI9-<`5a1bXE zrLO5m^;fUo_tp36t3yL21Aq0u_+#hoWyAP4x=8=BIQbMubO8l3nCTmJvtpVCvslKr zD%R%)%d*_J2FtnTH<?O?Wmb)e{Pz~BPnbz&uHk);Q)8({W%@@{=`XTO!*Gp?$&8A{ zOuTJXvMf`{v1}#Ja+LzhSBk7q8DPaqi49Z+S*cQHgOwpxt_-uG$`LkP8DU2%N7+ba zlpU=cW22QZcC2!oja5#t<CT}#iOS3D=f5^KP4+T7`RzdEB)h_1VW+<}E2r42?6q%= z$}8-3X5;rX`-r{4&fv+b>`itScV1)X*m?ZE&c@jV{Mu}SUBvGj>|-{`rcm<?`-Dxi z8JxYzF0r@p>@0hmUB>S@_6~a&zvtO|?0x)>vrpO2*axV2fz7cG*(}Z`er;rp%0<lA z)g-@CcQ9A2sAS`B)pcj>uU8gU*EXBJeIsP9Z_m|gZWP%UR&LBq*jKjWxG{U_(zfe2 zW;VFv1=Dq>F%$BwOU#QJzO#SHX?T|ug-JnSQc{>acliU*ICuHOkH4;p)>?%+wJ<x| z$~U}*i{F9B<-1;uPKS8inVqe1FLt@-w94Yr3u=Cox#}ux#9kOgNiO8f<w-GU)~h_+ zi;|4v`^i8QJ3OWvNv;+)gE+~Cfxn;R-Fr2+5hpqP;-?Th8%^KgNshT2&8?)+;O?&H z?j_lnH{B$+>G+Y`%AEBg6z<)n8X=7S=r^N|XbdN@5u0t}8|#79HXjmF4a~5)G?7Vi zQM2K4PUuUD)v6bGakV;OCE3XJH!H;rCvvMz?g6(0)oRUmqNrN^OXCrnpS^txGZNi) zwjDOJ;p{oV{_VNIsf7V^-ns1tyV32i;RaC+W!Tu>k8WT0Hf~3lv+0IY+i|vByzBd@ z!FI&L+-+hu-RKf#vx<e9Y3%c3=+#vmkr<fSIwBD<llC*o-igAXMnk1P8pHsOc^uJY z6tU4ZzcFKTXMm5k%`Nl3$xKXvaR*G*2D7rPoRF>DL-T&7O>CNTJ_Y~HhxH9FaP5!| zZr4NZ+5m`6ecZRPdg#6F1#xIQcH{+He%Irfl0Xn)cG=-h-33Y{gz46_{?oMtIhxyM z1gf*P??tg4ZlW0u(w$f7^{Ba_=1IT4S OtUP5);5oj2OmERF*%z3*=`{U#V#>Z( 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 bw%F;6JQLps7O%)9`S>jLCySztaLj)J8msUF diff --git a/api/queries/__pycache__/rma_pager.cpython-37.pyc b/api/queries/__pycache__/rma_pager.cpython-37.pyc deleted file mode 100644 index 3bff305d98d3e4e7d330bb843b26811bd875808e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1543 zcmZ`&UyCC}5U=i@nasxAva7-^{y`B@2Qj-K_#ojp?__<EaGZJzAu{w%Pj<7J%*=LA zF1KOwAiJ;;#Al!64xjuEegvO<>{p-s3O-rYL$Zgb9ja1YRsHLls$bu`b*l}yroVhA z54QpSq|JJHXxv3H@1atlSOx?50u)!`3Y19Mr5JD(C{OuUY#<c-3Zm9um<#=c^m++2 z?xL8tQKc|o3h*3L{0asl^^{QF6<o4`uY5!ZZ1`|0AIOtbCkzkJqJNV6D2B>XfSIiS zD=O=mG#hEU#HqhW_dgweV^VE~@>Htsv7F2NV)$7ulOk90<6)XVHp8M!bCaMh%F_!o z{BnFeG~+7$sFcYBug0@kh8b$IFU#@%`7G7r)a>i2j7zGlTVB{Oj>q}9isKKcDvk=+ zVs~A8cOBh)#1<w{?FEYY169qRVpA17<4b`yHpJOpEtHsWy-?oLuf1hZ^Cee)jjis% zlb`CK_AvUmCQqveHPo!;KeA;DJ>G3t`W3HRmuwk4dAV+V4&SzyVI4lg{+*AG;QW&# z$iH^T&!gVMvtk1J_ZLyuXc!3y{RPzD5cP+nW+Y+XwyUC&S*(k>v0*-&HkQDCY8v68 z^^;<jS9Z%(Qdbm>gcW5`T5*zAR$$wsEz3u_^`t&AHki!mU$^kE4oSU)YS7WCnPpYn zfO$$*(lUKR1MOp$_1&~SMAICg0<Xh5JY=5xg}lu|*2X<*wj;>veB?)On=Q6C<8(lM zVrLxZa+=1mZO8GnP_vBeP8^@lWY$D<KzDcW1FLZ|O{>#F=~vP9Ty>7FRH7#0ypQ5| zjim_ZNgSWhP5+ckVhH3KuGuvo;d8?W6n+mYdJ3Yyp&1<@n!Q2?h?*<0Vlk{ZYF6>5 zVg=6_LcpkbgCSCd)%11|1k>GG-}n~p%ps~3oPpj`m^f+aJ=)bwu^#!EK2Y5G4`_#e z-h+yt;k6@H!_OE)cJi9LE1D6~FeC5AcHiuJ6bZe9LA{I02F;KoZhe&|g|^;kmM2Xc z-F(^n5#|{>0b&~`hT`TMu*EwxGI^Y(-CkBCGBbC&4&-J##}YQQvRi~*6-8#OKi9G} z5!bIHu6_d*mh~Fhj)1Ou)&$)QDfAG<P#9Ri0>0N--2R^eT>S{Xxw>)u`-X<W;Tq%t x;nQG&@9b(COvL+r{DL>pv_WxvmL^rxM+*KI*KF8p2z%#U%rL~#Q0zp&{sD7AOq&1z diff --git a/api/queries/__pycache__/rma_template.cpython-37.pyc b/api/queries/__pycache__/rma_template.cpython-37.pyc deleted file mode 100644 index 8b5a04c07695203dc35c99353928b381769e217c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2892 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 diff --git a/api/queries/__pycache__/svg_api.cpython-37.pyc b/api/queries/__pycache__/svg_api.cpython-37.pyc deleted file mode 100644 index a76c33ea3d5af256ffc7bd4ee8e418da43940563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1971 zcmZuyPjA~c6elTJmR;u$wj~|99fV=sV4!sh>{evi+6K*GK{hn$MQ}mTB5f;?C6$z& z*^m!I0`xQt`vwVi+E>zbr+$T;_MU7jK{f(>dLkbm-|xrw$d_wtO#*H7*KgurosfU< zXVq*_euQp35Ryn5krDMNB?m+@X<ZU&DSBb~Oxnk!UHizutW68+MH&X6Rt^1NGrJ%Z z@u?)R=D`Qjr=_2UZ^@RdN#~OKwp^2S>4H|1>#`x6pgA9iP5e6Su~9h3lL7cY3UD)Q z__dbZd<IHJGMbYMcExgf4Z%tR3+YkYDr#n&Dy`AFa5)d-Fyp+<3frit@4G!=6d&sl zAT&4+B4G^Yf0G;e>UsCAQQCCHP{>YCoQrtceG!WwiKY0itKy02CaH=|05VC3Q`0>R zdtDP|>S-#1Gci!GHj2PPp6!S<+<8A%I#g!IOa>hOJLy!{AgVTWQv##2jRnxoD$duz zipDxvInZCB^(lzllJv~gn>jfpb31n6OXqgZB!khf24v21rVlfa7gSnjwmy`$tX)~s zk@ZWGvwd;_Og$v?T5L;qUX$*XmD{qB**U$Sd2L`{)47v7z++SVK?!*|4kPJhL*>1F za|mCNdFNpid3}`yLvN%q;Yk6apXk!cq$&vep^~1-^f<`IT6LODZ`pnkTEH40xEgv| zwQ9(yAPbY2ha;eqhthlQg>j|^N>?W6?<Y0&l76{s(mRDUUY2-0<!O}x;}a!2mH9v? z<J5p3p|vPiEgjy*vGizGF3TleBzh_`=(rz75cdM(WZ-4fRKYm%A#}OtSjV_!wdWfJ z;N#m3mN={Vv5p`hU@43T)gVT30%SwJE%*Z>f%t0v<me-00hzf!EFgV<L!Sh2Ol8A# z!pu2_Ue?Ee<m6pzPBVh1`zL!3#j9PI#nJ`;P!O#1te}H(a3LBnebd~HLX!o_DBasf zXXx1>vu~D(+QX#anAy|LZj=NfGJBw`mK5ZM?zC(E7UsN6&f_Q%lB-yz3DEAhaCr4s zSWqj4eF`(Wg^|@YCVa7ZKM4wFfw*v29({M^#BTzbJjLWPg$4ROJjH`M5kEmdk3f(O zm%7YhF16VveZ*|$P(~dXn|<<MpjAy`^<pn;@);<rnv`%0ZIii$wV6|>NlV(lTTq?k zisp81T{F0$C|;klt^Fk{RX#y_siT?mSayJ&lQz}c;JMB8=kW0#u2Pz#8BZok^I?{y z?OI8e#=B5&fhZcKK`OFgQAe8phl|#VKMn>z!y<zjL25|GCY^n{gnrj5z<U%MW*7Dn zJ4OiDO03rmaRW~48WGaj)`5b0giMA_JedUJk&3g<3ea{1=+{wn2akOZkH&Mlf0*@w z$}n~x<_tzd>=v7?FXLWL;xoXGUPC`Z)x}pJhP#LJqRIIvkz*i|7cCBHETY9sc`=ua z>o0KMFF_P*%l9ErQN;OeEO114J8P_$@}2n>6oW6U%hs*tV?vwFavYx{3vPamMO2R5 VI$3DwqHuQ?LG68we$cjM{R=M;>=yt4 diff --git a/api/queries/__pycache__/synchronization_api.cpython-37.pyc b/api/queries/__pycache__/synchronization_api.cpython-37.pyc deleted file mode 100644 index 919dd4417e1eb4dbc5469713fa6f5c455e64756b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7296 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 Y=_g}RNlhnYE8EGGcfW(uu<eTdZ<I&Q{r~^~ diff --git a/api/queries/__pycache__/tree_search_api.cpython-37.pyc b/api/queries/__pycache__/tree_search_api.cpython-37.pyc deleted file mode 100644 index 4e130f95696af80e4ecaf5a951a28a1c425b838b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmbVMPj4GV6rb6DUOP@GsA?}9_JA;k#uh?cqEcup1tFmb;c!`5nvQqI_9pAuWoAre z%Q>J#>X+b<iW6UHublc7a^k&lvUPz2;#o6(`+I-q&71dZf4@V37Qg?>)d3-Y;>R5Y zz<dMCB(Mo0Xh9Y<rIdV2geUwfB78|N{nQh|i1foZ9;o$c?LV#Z4A_Ry50ZHVn<Oa} z1Z-&Pi`FYLrNS4%RXYttEJ6`o(KLKT0+L4Hvt93>YAHvO>ue5g*RMOB1ZX5>@?wkT zYL@V1RLLw~NR^a28Cku|>{81FZIj1yYpbK-a4w5#Fws0$hYMZ}N<ABj+*Ac$4SAIh zzgzH`JhbJZV?G<LR5sV8%GccHrF!y$xxiEK&xObl<3%FMYza}V(-}C8lMKs%g#Z5S zGWUV8#L^A9^sc=PeGO$41dd2g`hFdnWhJ#n?K);GSGi@Z@6~~k#Wam4+(@?6ITW|e zSXOXj82f|V6wi;wKN+dbn9sQwO!!N#R^z9NXQdMSi?LL{m~mN2Wir^yYQ8e#@AJvn z<W?S5JUfRYgKbfOhB$X+_<1RHF3r$F>6meKXHcF&wbCJEH-Kf_0qOd|J6AKfOFKh7 zq!?Bk)^k|qH`r$6A{6u@+W5jdkM)O}@ETeOE1^CBEC6iaun@6L;Iy7OB)ZiKoYtws zT8KeK!%HgS^FUXkEjmzJuzpA`A{AgPK>;CWzS!GPv1fyg2io0DGz064)`nb%8{ps` z_W74^u48Gld9sj}CxXL<_ig7gG1y<zT#Cdr-31~CLjw%9ZJ7Z5z%>VZxD?k82pu-m zK<Bv<$q_n({%ufH?ltY(!)ET?b#|}O5)+oAajvYKN!{RReG0jPu$*qQ{<mBcTPE9! z-8L+mag|A9OKrgIq$~@`)uW`Wwq5>CfR}R#^?;(35I-xHLhcyn%7xX^RHZU9`9#Pm zUl!J&`Y|tz>^IJYG?|1hRUrKzL3hpnOV}pvj}k_M`p4xoa*=1Y`M}y#TpPIeGgGRh zIT<!bqg9jB^+8j@ub}Aic>Ug6V2USS-`h#q>8#)1MV!(bcqQb9etknfzM;c)IKZg= zsE&9AuUOPRywo~4D|40J-+iGVs{pjM4;_^rpcPw~8N=7S>c=_)w{?I`mxiu=(sq+x zy0?=?9l>$=!la$0F4&f@ec&~|=Iw@Wx{hbkGECuf_%ffuMji$<@M7AfG3_+}U3$+$ z)N{WG_SpOT<hXN%v(P&^>9=qODtJYV)g8tbrC1iocNrXr7q^lYV=#Uhb8|^Qz@+wX zhhrv-0t8LUeX3g^*O<8*vOQo7isLZw4kAJwij&xfVW)AxIpnR2-J?I=X7uDE^n$uw F|1aaS0sQ~~ diff --git a/api/warehouse_cache/__pycache__/__init__.cpython-37.pyc b/api/warehouse_cache/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b924ea7a6f09ad708fb12d1ff04c13869a66dad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmZ?b<>g`kg51T8i5x)sF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j*V!s2v^ce> zI3_V8F-0#au{<%aGR844F*!dkCDAx0HLt8VCchvxuQ(Y<<`-mC7RUHxCdCwImZa(y zBqnDkrl$h+=HviXq-5(S7G&y|Cl;k<<d+tw#wRBxXQb-K$7kkcmc+;F6;$5hu*uC& PDa}c>13BX}5HkP((2+OP diff --git a/api/warehouse_cache/__pycache__/cache.cpython-37.pyc b/api/warehouse_cache/__pycache__/cache.cpython-37.pyc deleted file mode 100644 index da2035cd936e4a85e0b032934cdef18714bf37e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17034 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 Y>eo1G_?Ig^HT6}C|FqHmSXN&CUo_qNWdHyG diff --git a/api/warehouse_cache/__pycache__/caching_utilities.cpython-37.pyc b/api/warehouse_cache/__pycache__/caching_utilities.cpython-37.pyc deleted file mode 100644 index 9ec255adf5e94b81511346294698e8ee333bbeb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4489 zcmbVPOOG4J5uP3n$>EUu)UF-~5Of^G5EF?CkQ@ZT5UdDV#D=ooSZiA$7FaZ=o6E`0 zgXkIVio|SyWCh5VB)(e#B>3b@PWb`;2|466ha8+-{1<%6S3P{J?3FEL22<0os;;W8 zSO02h$+Pf8pZ!tnY*^NRs55(7XuORt{Wr5LX-O7ZUHaQ0i|nq=%CSnfV&<H#WB%1{ z75_?Di|XBa<aXVt(QQOt*Nd9nX4LAo44xA%Ma$h~W~r8}p0e%={x$qpm8WdA*0--% z-E~!$>&iW_)GGCrt5y$~WMvzpE2h;f$ICTXh5i9}r8)F2s13EIR;2f|A)B)GnD*KP z-3#Z_m5lIdpYNh4nW48dqbE1cr&jV(@>z2BeUyQ*a>X*#mx+3JQ*Npkb+8T^_EZbR z>pFNfns}`pR-SrtRjy%&i;_LC+84i~Q{Qg0!r2kopj|86<Vfi-5wdXaiZB$tP!*Ls z@wljd5C=(IxbF=!{6$#QcgI8Zq0m5fe<R|cuhOhwI|cjg?pLrJtFYRQqS{xPKPall zI>=PvXa&NJp;r6lK-~|Oh)2W13B_bwG~!XTpXorQ#Y$fU;Rp*Om8RlA6*aB0k&b<r zIL1SN+U734)B!L8*^{5}yCPNmc%Zc6g42#l^C0Czog4*HNsr^%{@iN2dKqYXg}^F- zH3I7dE)alYSbCGdr5X78=<cn(4^pMmJuwin(-X%c9`D_Wg`dPy{9;eVN9kTNRB`G9 zCd0uv-Mb(3_ELy{eJK1xhyvU�q(MLkxo($3m+?GD_9HFZ_YJK`@99_D5L|1{rkG z8IFsV4;-@qQ^aCw16VD61@L=yvU64^adM7Q_*HXID&-=U+#F7NjrT?w){@#&9w!;G z)h^X%RPz65P+tbahU*`pF_mI20L7jqeCAMZ<9IXc8GQdaJ8{R|ys9tfwzLmj{ci3) zvt{KuV^(gRS|^RXg7JpFnOE}0DMO#;9W&2p1nUU1p?hYgYG&+H>w)!=75~ezvdW?N z3DY;3b>cB=@{i2Py{vj_>%W-wHCi8YGg`yw-?Mt|oibTJM0>F!cg!AN<kj?x+&P7P z<~8Z&)yvjR>!gNu<B;k9=5_sL=00oWb)xzw_<dgc)RN7=RZg0D9b7nh9sO3`{M0gI z)lXQuVKAD6k$Jh5v)qQPj$F!Xd0j65*?oWred7JWduaX6itUH!!M|6;Gq?u7<NNR; zE=4A;@u_|BB!+v02@H#;SpsM2Cz|(1IBociL4fIb=D2r+7Lm$e_NIG%{+O<@9Dd8R zIi9Ui>{E<@4+j2#4@Y5G?#=r;iHuK1Nv3Y7N8~5Lk>Y7G(!S~#3dZ*ME&eichSw>* zU@pRqAU;Em#3`wf`@arrMjtODHji89Q53^r7%0iJgeSdBfFEfT&P5-J<3>sFpVFy% z3d%;1LR7?9$?7x|o=4l9Oz;Rxp*;$Wplt|txau5q_$Us8_^_NF3Y`TA7UP8mWpW%- zNGB}dcKE$VzA|Av<yr(O#(QHv+aKYGoSkO_6{RXXLQI&S#Q@O(o0~pG>@&>1)91T- zq^@z1Whxp1zl<|Pr&NSFed@hL$%}2K>Y3?`2U&-M{+0++YyfTeK@S3!hBqfW=TfV0 z+SkG$<{9P;>%UHpd4xD#5`?^9eI~_}m8)8{NmWM2F;_DMcKDqs8}r?fYNkgN^i8BC z91>frbQB_>lEx{{o}prpzmf6IFt}5uE+9z>i=p((k#I8gDC6(}BCd{9objZ;Fp$}) z<G7;$XCfE+MRJTOu<J2+!--MIry&>@rE9}Kg@MHPM;f~t3pRO~lXc8RRgVT@l!9~_ zCf+Yog_)j)2-DtO2oDA+laWfuHA_5`4z?#(wrF#jqCiy!i}ENZn;(^)QqJIbOsbq* zdLJ}iL?|aVwx>&s!NX!kvFuDP-$TUlNfSx$_h@hgydx2gl%~9+shXIq&eSqh#ns6g zFC_;n@M`SV{+jWvcJ-y@Lc3Yi!{p!qON+*V%I>4Bbm0VXKPeh>-zz*ar!*6>uZp!T zIOcYeZ4syUv`%#4eMqd8?Mj;I!bPP(`=^CNEu*z|>s5=GqDDLsAEe!asqT^ybyi?4 zikwA?{y8*~?f_Un^K6^7n8#|&#p^NGCg`zsd@UOv{aMX!VcbF6w$WqDc8w9{i|@rs z+bf(Q3eHz$US9+ceuFr{)5J&jmkPf0A;1%>k19dhkKL0-hFi!}_QZOEyMT0L^>ORO zLv>I??*C=Ro*`>~Y(2M6DtQ%Su6{djoK&+4@+ns3PF|&an!B=28MW<B{s{*^TYJG^ zbRghrWq~;lXVV-C=NFu!M2LK9V(kMpb(j~ZP(=5WXc!`^a+&y}2<|J$wO=XalJ3st zNGjeDvZfiAm@+PO9E2h7A-_`mn>w2hea#;#qN&zRuL6vhsoH{eP-CDf+CWugAA0%? zhB}7LstQz0ZMNO66n2spwKDM(^>^Mgc3M`2OcS-zo~YU@nyKik{c`PRv>R<}!6=sT zPJWuiYM*q4@^(?<cHS~sBE8)?gWP8NO<?-usr1mFjKGLMTP+0m7=oZQG}qOVWm}W| zbT<vXNF1ttq)KRgUj{mzQf}KN@8(Wms(vGYXK+kq@;PXj>xKm*pR`|vcZ0Y6T>-<< zWYR^WPnA=WglSQqrt#9rn<ZDTdR@5&V){A(65$1zj5wR;a{X7VO@9brZM13|jtjSj zD}T#*H3fxsb$ffajG9!gw`<$4*T1AYKqD!$K^XKjU1s!;3A73PfF^6%cnC+*bikS} zc)CiUMxaiBtf+e#He>Em9VEnlaL_>_H&;<}+M2?IQLcW2R@ZTpC0{9=9@Jb^f;cl8 zHbR|=fQzGd--;4B3Kd;Otn@wr6k}qbYje9*K{N!ktHwv*CtGZ_YCE%@#cs1zchP&7 Kt#=o_9riyVv2oY{ diff --git a/brain_observatory/__pycache__/__init__.cpython-37.pyc b/brain_observatory/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8896a64c40aab79cd89cf6006b7ef7423c9d15a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1800 zcmZuxUvJws5GN_gmK7%rx^#chK`2nH2D)^^fDI^uqHDVq9SZj$C<+KJ1X`pM#WLlP zbQ%}(!;pM|eFF#E%f1p{_tdY@r`^#@Y80bzNAh?l9)I`e(dK4CU`+n}o!{Cd<R9Ez zjt~|PflLET5J4-FQ9rYcNp=(nHYWNGNP;SyL|H_M>iS)4wez~|tnKGGi~ZcmI(|;F zL?j{<(K*dFo)Xa#?Q<g9vVGJ&3$m_=MdzGkn}Y6>-o`udfb@IpT>!IYz<Sih&#csZ zSjhqfINCrF&|@I;7qEs3I*#>rLzd)%Ea(AQFd*=J5uVzHJ|VBGMPzA1n&=B+;Y~Ii zu`{M0tt5-q)ma2mAp#MelhxT1az+;|m8^CLux>)zYFcOXC$b2eVA*cM3rb1DVAaCa z@vT>I$1-l%1zoTvXxNCs>!P>I^l5n_RmxLQ7PhPv*YlJs0hHESNG)Nh_1$zhD=S#0 zMXd^MrQ)cZ)}z!O$~D_>OnSnrnKYL_DV30?sgS17<*-x-Nebhzegk&ge)P8jE*;8r zrl!0YOW{@fngW^yG8~9EMq(exYy&$0OkT$e+R#7Pakx+ZCK|J+#~j=J&e2o9^X&cj z@%_O|BefauLoRlQ{0&$0!Ox1rn*{%1Ak~Q()KjTU0lc0b&duO?IUJbM%5TvnejvfN zsz5`G?+rCCRbCI_k0;#LdVVj@OI6xD-<{6iCwo<CY*A094<4bf=y;2~?IFy$tw9rT zks=3h`FwY;staD32e7!b>UCT=mUH8h(v-?rt_taxnr3Zq7L8npx*E}N0r=!vd<xEs zY~w?WWUuX*C|u-Y=|aIRcagu_wTpVDAdg)D*SJ`oLR5tm9{|&s)b7Urdi*`UDFsHN zn8qxm@UevL(3oz~9awc~Lbq5#^{1dypyK5~Bpw2p9bnQIcE$u142mug0i<Q<Hh$ZG z(f>siHDusbjiDjN_Awg&2+Ts2S$agFK6V<qWEYSYUKSjMAiHCuhMqwc+tyJVav!uW zFzac**U{K~Tnu<fTTZ0wl%^ildcv&>XR}hc@a4;APh0>1yYR@=N`Hn1Z6QZ|R#`}| z(8y}!X#Ejh`fJd80c3o8qg_A*>Fp<LPul(OH+^_&oac&9WS+Yu&nLB*Rk-fv`SFZb zs}ujvwR;c*9~|#gA1^~}V(Rx-wSt*(h1YY~oc_A%M$mii57+`b0d^^-?*fW!30>g= z`w`tE#|fM;I7w`{jMnAH$t$QhKr!fN*W~F`YJgAK9Ffd!4CNs|DQle@X$&-o9I@=R zAmyx_m=)eLTUM?$<r)gdMXUKs@J@dPtQTY*ggeKq)0iPH@(pF}`93Yf!@3^7f^)M4 zjL_?VG14~VqV9nN!@QM6YBrh9^#%wam{3jK6KDYFS*b>~gHnNV_KnZ1D(TvqWS0*M veG^Qz_wRFD-A0Bv?XmVZt+{p;85i%ZV)+0K3>rY4_?p0M@L!PJyx#d2m2t#e diff --git a/brain_observatory/__pycache__/argschema_utilities.cpython-37.pyc b/brain_observatory/__pycache__/argschema_utilities.cpython-37.pyc deleted file mode 100644 index 3daeadc52038626d50701baeb53150a7571f4a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5607 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 diff --git a/brain_observatory/__pycache__/brain_observatory_exceptions.cpython-37.pyc b/brain_observatory/__pycache__/brain_observatory_exceptions.cpython-37.pyc deleted file mode 100644 index ae2be117b7dec7acc212547cbac31d6aa1ec4a85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcma)5y^hmB5Z+zeiE~N>H0TPNLkJNBp`b$u9S0E&gd)&HmR1|@UShJb&8~fiQ6z-! zr0aMF5EV~Dzb$V;#f(F8Iew&!HRJj0_56N5=yY}n$o%U^@jWEu2ZELO;Ov9ir(m8D zNhCc5Rpi7QQNT=kfV~<sz`hIs2Q~HpH)IoVv&Oy*hoswzA<|kXc>AEX4Mvd>m1M*u zg>%g99T<_MFUMAyBT;0gdYlSf*~IqW#VRk7EFE+`7jmA8x#HaIa6ZpusnKt9{<ai) z`Q{rj0fev3&ks)?M6V&Fjl@*Q-dG%qw2B~foTXCSk5qbOqbygcjlpL5w6f9jWE|O~ zP<L|?&%{K*w_3vqIlDK;8hLhJ<lj%YTGeZNd1bKW8`v@f6OtNlJ(JxRiM2^O85YUB z)a8Xy7z}7UG`P0&o|j$&pEbeU1YIRZymj)cgREbvR|bXvC2VeCo76xpa%&?s;tQ#< zauj<F%!&(V<d8}#*=acP&WKM&K5)ZxyZt<ir$dzsBajK}VqzRG3PwY{1ZuB?S+LK* z+%I%NI4xM=EyxLb<1grfeWDbYjhq{}Kq_5`Zs5E;%MJb*F0f^;jA@|{Y)jIl;2di3 zt<s0i7iMBzV|I-9E_E%=V=b)Zd}Hh#`1TH{#l;ZTX7Bg@*FbNbA^3Bu7{zsd$B&iP zs~pJgE;U!+X6iL#t+zp!Yi4!r18AzXo>NV`nhpjRQJ?r1V_f)f`BOcrIg8ORGrWEQ D9P97I diff --git a/brain_observatory/__pycache__/brain_observatory_plotting.cpython-37.pyc b/brain_observatory/__pycache__/brain_observatory_plotting.cpython-37.pyc deleted file mode 100644 index f9ee61d6e5052926ad5d7219cb7155e0f5a0c0e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28944 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 V$;flDlacTD9f^IvZ#RB#{6A9Z(menG diff --git a/brain_observatory/__pycache__/chisquare_categorical.cpython-37.pyc b/brain_observatory/__pycache__/chisquare_categorical.cpython-37.pyc deleted file mode 100644 index 86a544586ffabd5b38907ab037bf925404b318b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3683 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 aM&Cr`!ma|J@vt6#5Izjnf@Tl~_5T7pID@wU diff --git a/brain_observatory/__pycache__/circle_plots.cpython-37.pyc b/brain_observatory/__pycache__/circle_plots.cpython-37.pyc deleted file mode 100644 index a246f6e65edf14205fd7f1dbe958a6c1846b42d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18293 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 E1E+Z%iU0rr diff --git a/brain_observatory/__pycache__/comparison_utils.cpython-37.pyc b/brain_observatory/__pycache__/comparison_utils.cpython-37.pyc deleted file mode 100644 index 3577798de3f598d57ff9343b695ce665e860388f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2151 zcmZuy&2Jnv6t_Jy`<3rBv`Jgqp$F(nZK{@AsSu$b&{9gJ1QkY$w%#3Yc6MhxQ`_6_ zRuc)bTr2IpASFUV;>wW|e?b2N3!zG!%AdfAXU`@Lq8|C#@A>)nKK#c1cy6wSpd~+j zM?a_{^p{}{S_vi}L6;ej5QR8KK{4V015aX-IDwP6ftz@Nhl{mRP`0|2plZijFk{Er zU=Btno=+Bn1<<W92R@g1Y;g^(q0sxm2}@!5doNfD@g}NQUx8J0ukL7PgO7COi%dl+ zr?GZ6nW|&GOr>N(H9LYPtjQh?U<rXX8D55dMbAXrJQb|jXCv8m4Hh&A5mlgHhb|uy zgmNdu{fd}ZXpD9og>$4x&lwYOf3&RJ9OXD9q4Uha=mFwqT%^2yP29oAe5#a_F~(>Y zeT_Kz3QY)~wFu>21rUTP_o}^`!N^JI8jK0%e_M^2-YjTL)J(6sH)k~ViCukRSLfA2 zhrs$vwV0zZ28zeHPvoy^X%`RAtK~vI#y8M6t2?eb1_<t&u>&;po&naQ-yaxjxy4)Q zz16{EGQq;n(cbZW&@{9U5?NDACW>8%JO>*SA{z%1*niFLKhZk@Sy?qc0miph2E66& z0OHy{+Cd=2M$1Ycf(0YBsH<r2B+NZ^D)+`XEcGE%#>y_{e^{*3Q}14?xA)HEXdi=L zKifGrbMfM}JpJuJzEjFep!es2w|x2k5lrJhYw?M=GmI4ifBk*P>fSpr$Hjc#Wb*1x zIWOl<zceA@^n^UBg}^_DLe0r@^rO2|v3V}rJR4e>o+)TTZM?yHQO0x+BlIbYGba4b zfVWK*`zrO@X_8UF{HWurC#m0wSR6|KJXK0Wt$|{)Uh|<D6<ge9Ps*83d8)chtk>-F zeQL^IF(EB`@vvETc-g<|!{1{WgSORWU`a?-*ejH-yg|v@IHJUaXeM$SG^G+3{B-&= z{s$OzQsE~|O1jOAyI~}=n2ruYoJJfT#2ThP#8O0e2y`UG3w~?lhpa;fvGUKIgWPbR zC7Bu-A0ob8B<RR*eh6|4{0JkPYAQz4R7W!97yLrqhZIWYo4dhoy0=xwL9N|o?S3<k z`V8)u@-*Z+5oNe7gt<0eT?6v;)aQ{*sA_lpCtb#Uy9?YgX#P{O?$^(0M>3^rk&L)h zl((5CSr}ArP(^Q<^AaB5=<3a3o7qHaFN1)TCOiwuJfuR<QBZ~&P=Fh(O>a6YZqhhO zrJ7!NWGD*Q4ZCIGKr@cpaVnX1<47v)sX-Pq?Zk}h`3-w*LJ{6H$E7_%`8Lz@)5B>N zb*Nn#sea(yPT(km@+VAfMo*cpgj6vVB}`YhfI@6Z7R;%%nT-xtfK@bZO4d$!D78ad zQhS{^rAoVywXXIe$tl;aIUwztBhcP}gG2S|>r4ytED3X6Ya9hNW3w5uSka);g4%2v z1PAs8GeDZtqxuDjcVWjr^7_@rm+&~q2JO;ty+xl;K5A@mYFwi4HyD2`8)?S4Yy(ZR z?npN7My&?K%r0iM-G`uIZw&d8VgFJ~(1<tF79c*RDixzkMY2pmH3uq+<$5*}t6+H+ zy1WYnEmd%d%wmF<@jR~JS@@1aH{1%)(|8e|1j&kBwHn0CS3$ODXFjfB7qre0iwsq0 zp5uG<WpNTlaTbU!sZj<6BH$fE!ZF0Wb3t`8O5nV2Z+#}#4Dazl0uC;jc`2ii0x9M# zGqfcomJM^PSXnm#txrp@s8a`iH|vDW?h*1H?9-KNNg57f_90wzNE)aL1iV5FHQ%g* F@V~eMT|fW; diff --git a/brain_observatory/__pycache__/demixer.cpython-37.pyc b/brain_observatory/__pycache__/demixer.cpython-37.pyc deleted file mode 100644 index 5677e98c6d49c0cc62df7c303d2fecb1795b3211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10764 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 diff --git a/brain_observatory/__pycache__/dff.cpython-37.pyc b/brain_observatory/__pycache__/dff.cpython-37.pyc deleted file mode 100644 index 7b1055ef6a3713493a9bf0161216b0ff35edfaa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9555 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 diff --git a/brain_observatory/__pycache__/drifting_gratings.cpython-37.pyc b/brain_observatory/__pycache__/drifting_gratings.cpython-37.pyc deleted file mode 100644 index 304fe6203124c84569568449b9999cb7f8b0cfa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14806 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 diff --git a/brain_observatory/__pycache__/findlevel.cpython-37.pyc b/brain_observatory/__pycache__/findlevel.cpython-37.pyc deleted file mode 100644 index 05ef614283dd1751718ddc92e4296adb5a064ee9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmZ`$J#Q2-5cStyZh@nq;3J}-KtfxP2q94*gn%>@C{09TtrU58e7ENI?3KNDr$d_p zLCYVYK#8c}C%L7{U!Y=q0Ym{Ky*HkDGvl%RVlufz&=z0bDU%cOJq5pw<KY=1Tt@-| zv?Y>41{}l(DjCotQjE?~BZpB`u5aqpkt{=u5C@3x4QU_)y-7~^z)o?_83lHO_(wfG zWj%ev(Tjm&7AJpXz~|zOo(TJLTb=!?hW}QRZT0TI^`!OLAl~EjISZfC8Tc)75&O?T zj>ttOWz&leC0lmq6u0(?3M$9FJFfK1SSi4*Z83^sYAi%%JGo<>eXG5bI~vS%`T(K` zW@aOAwJkC^GIp(2I_7=jb!c1*F$d#y-5Y14==GwLdF@>Y#?Hc5;xFTsKiY%G<?En* zC{?3iuTpDeH|2AyYG*+`EVW&Q(skN~8rgNtCX}yCRR+`R`<<%iYNoNb#T^37_bacA zJ$4mNT&dpq&3;<H)hpfZb(@&~iSFU$;TjU5V|ta|NnpF|HWkcIFk4X1lH)S7%SE^G d>7%#GcJIIF3JP)jWZ_`h>Zf-x3aN9<e*#Epq0;~W diff --git a/brain_observatory/__pycache__/locally_sparse_noise.cpython-37.pyc b/brain_observatory/__pycache__/locally_sparse_noise.cpython-37.pyc deleted file mode 100644 index e35be8d82c27a0bb42bf4d676f385781f4e39c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12889 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 ZAvrHh6CJ+0(X&+ILF8qizY3+5{|7abI*kAT diff --git a/brain_observatory/__pycache__/natural_movie.cpython-37.pyc b/brain_observatory/__pycache__/natural_movie.cpython-37.pyc deleted file mode 100644 index 8d90f9322e8d295f4b9b481799344198a0d5b950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5288 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 I`>AI92ZfGu8~^|S diff --git a/brain_observatory/__pycache__/natural_scenes.cpython-37.pyc b/brain_observatory/__pycache__/natural_scenes.cpython-37.pyc deleted file mode 100644 index 88cfc506b9bdb2302817b14f49330fbe19687dd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11787 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 diff --git a/brain_observatory/__pycache__/observatory_plots.cpython-37.pyc b/brain_observatory/__pycache__/observatory_plots.cpython-37.pyc deleted file mode 100644 index dc6d446c6191080c4d29f4696df921628a23c519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14344 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 RHq&Wm1^{1&8G69h{}vcOz%2j( diff --git a/brain_observatory/__pycache__/r_neuropil.cpython-37.pyc b/brain_observatory/__pycache__/r_neuropil.cpython-37.pyc deleted file mode 100644 index 479568217b184a7eb966fff89a76a758111b7535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7774 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 D^O8As diff --git a/brain_observatory/__pycache__/roi_masks.cpython-37.pyc b/brain_observatory/__pycache__/roi_masks.cpython-37.pyc deleted file mode 100644 index e76ad122e8511fdcb8e044e1daacc8692c6fb4a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13151 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 E0qkCbS^xk5 diff --git a/brain_observatory/__pycache__/running_speed.cpython-37.pyc b/brain_observatory/__pycache__/running_speed.cpython-37.pyc deleted file mode 100644 index d582328d081a69f8447a20f5589b81bde6551beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmZ`%KX2496t|t^?v!2yQon#F)Ch4M*s2N@io}9$pzRVxvYgoTa!s6IJJ+T<21Gvy zh>5S{m5Gg+iRau^y@hA_>HV>P@9&%a{TKn&Kfdti1fgGEd7u!4Q@G|3m_PzosKzPA zUM3YugLg;-BD_Z;l=y3qhJu`<B>D}nQG#7O=d~0UU0ca{;cX8TfN%=e%z#OhVu4a} z3HWIs!(}8#f}EhO6r2FMi0)B379&6(yXl8csZw2?w^E9`KlH6Mg)Vbxs9i{^xs{Y# zdb22t1?7s$+g9qbmdf&qnl4|;!on*>MW+FUa%!Y8Wus<sOo3Ls>HzDQs&=LX*P8c( z-TU+=GBrLlJuK=YllWkgLoCB<sFb!%sqFB>LR4eH`X96lNY}r4Om`ROh8tQmRR!t# zSSH!#=i*0PH`-)dz~lz<6Z7{B?l3irzTq`mk~LnE@8mPt>H+8h=)sya&(;C-70;8< z5!I%9L&;2j>UgC+mX3gdGc>aL=%NO?tR3bK=Rc9&1K;2F>^QqLQk#q~xR~YqhO0h% zt$5Ku2VZ7VtxVRmQkepH(=K|Gy)X03lvciId2!9JB>aV1l@ZrRx#p!}O%8}FZX4Yn zZTrrKzR%j;jTj`z*nux|1PtM)aPAIvS7Ww$GfyUN!kB_xWX#2k)s5&XFHafsMQ%M~ z#za#vrafLd-j3cqVT>!)SZ-lO47m5fJ(Rt}rrzea+W$2ZVDTg*F^<V#O(Hk4eGA*B j{h-oFb#>bhfd>B$lJBSXaBgz4N%R#4&G<n~$t3s(%ryW> diff --git a/brain_observatory/__pycache__/session_analysis.cpython-37.pyc b/brain_observatory/__pycache__/session_analysis.cpython-37.pyc deleted file mode 100644 index b58b560dcefb5ea502510a242565e955ed202643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19801 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 YnNOjsN;#{}*1jjv|JO>ZwP{uUU;3<T;{X5v diff --git a/brain_observatory/__pycache__/session_api_utils.cpython-37.pyc b/brain_observatory/__pycache__/session_api_utils.cpython-37.pyc deleted file mode 100644 index 88919a17f1bb94a333f1db926ffe95e8be2de453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7513 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 diff --git a/brain_observatory/__pycache__/static_gratings.cpython-37.pyc b/brain_observatory/__pycache__/static_gratings.cpython-37.pyc deleted file mode 100644 index c407682d5128664c3217cd0c4c9ffb9564e7b08b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17141 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 diff --git a/brain_observatory/__pycache__/stimulus_analysis.cpython-37.pyc b/brain_observatory/__pycache__/stimulus_analysis.cpython-37.pyc deleted file mode 100644 index 5273a1214fc4c7065c1b500f7119795acc87e629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17211 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 diff --git a/brain_observatory/__pycache__/stimulus_info.cpython-37.pyc b/brain_observatory/__pycache__/stimulus_info.cpython-37.pyc deleted file mode 100644 index c5dcc5f19c7517d6a3bea45cd1f81b0701c67048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24051 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 diff --git a/brain_observatory/__pycache__/sync_dataset.cpython-37.pyc b/brain_observatory/__pycache__/sync_dataset.cpython-37.pyc deleted file mode 100644 index 5dae25ed6ba34192a27572c24d8eb8475b245a2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21327 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 VV8Ax5Jb*Mg_0z`S@8NRp{{lV;MP>j1 diff --git a/brain_observatory/behavior/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a9b0c04889d2302f66ebc335705b05bdc3038278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 zcmc&!%TC-d6m=dGMyT{ZW<fkNP*AI?>Oe<;G_aX=gCbc@Y-Ow@c4Rw2$*x7M%0IAZ z#fo3bwtvx8olq)7i(t9{TR!qb$2!;d`s}Q&tpd}si;sBN1K>xyxNa+E^41JBGe7{b zh)o>gk{<ESy<<Qv3QjG9HU;0D?`D2#xxfL5Eq8wJx>vi2t@gQX0p0s#k(D_Z^y{w> z;xwfk=2FBGX9|WAGp<W`B4iRvQRE8pXkFxsO2K!ch~ZqbtVj!mb_Jo3WjLmYut+n( zv1C-iBdiOFQ*_WCDKslGbcl7dpadzZQFj&ELgV3R+aGTGqfI|g()#T2mFPB9#^c*k zzAPoBWU4UHhID~TCggv-$Xz-<KeCQHGV?St_S>wy^oK9}@m5zLPa|XRmW+W{kCra* zdVCM%9~Dq<F3&;ZdgC6}-#Ip<hedQVBM+q9e7&QAcf5LVIN6(``Sks~ag6OWj&X#> zO=zVWuf%CVRr7qJ6qT)=Or;d^5=hVZUI#z*?yKN~IaL8(VB&}P1oJAGa2yFv@J2v+ zsREHxt|Eh7tig<hfnu7j=Qv7QM+!Q}QzW_aIwV4KV~Mqp75wvy5i-`G5%Tk@>A%hd SDN_2zZe9490o%InefJknyaN6J diff --git a/brain_observatory/behavior/__pycache__/behavior_ophys_analysis.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_ophys_analysis.cpython-37.pyc deleted file mode 100644 index dc711f6c727e0a5639aeed457dafa44e2bb0852b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3774 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 H$!Grsb-dp| diff --git a/brain_observatory/behavior/__pycache__/behavior_ophys_experiment.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_ophys_experiment.cpython-37.pyc deleted file mode 100644 index 06218e1cb21adc37de722ac331af721941e0d221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25519 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 diff --git a/brain_observatory/behavior/__pycache__/behavior_ophys_session.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_ophys_session.cpython-37.pyc deleted file mode 100644 index de23bc69d8475d61e5db50ada59198d2912d3b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 966 zcmbVLF>ezw6t?f2>KYo55E2VW5fe9X9oP^c2vjVn9V&!$I>~a*PI8UoJNzywsaT+u zI>Db{Vq@j6cxCEeVB$HsBr0@)C%t!{W&3;YeSX*LblL=M^7W(m9uV@=FIL77JVS^3 z7$lKYlhl6$O(#JbQu2z(P_i>3nF>$Clu3F>;?@P8Ci^jUw|i<NW<_Zas?i+w-dD;N z6J_e$A6Qw~0Jwudk(5f32IpizC6&Qhl!oVok(42E=x$viJX8QhX>!^yVELqlehnS& zVW`OwvebbLWcV4&t;17t#0KO8{X!`=f}Cvs<cH8&8Ia?oZ$)8v*#~83qAu+`={F6m z0WW<k9G0n*tLo_%(3PsPDi^hqNp}jW`yVOPTCU4kHZmp`UOUve4YkO}TFsP>TP`{l z))Zz4j(Oy6zHEv?t==xTTnnc77%t+xFh$LI95@C_58T!m?+gJ+w>i(X0O0%^`St0= zqwEdJ0+|>Ine@f6F!SuW5qW8(c$g_OgRHDj#vJ29qwICj&!DK)g9?iiLxp!6p?Cih zdUqxC8vG%2HMf3Fy~AQ)DWd@kXhcu$UiApcx-%4nb0a2-bJym4Qp&0Jc!%?MQ=ykT z3v$<KTF#Z$oZIV|Y!PB=J09Qg!E3&a4u0Gsx>(08yM?Rt$*RMD7^TfSThEw=y@S04 Z=_daY`Rp!wylmj9AA0aVXcX*h{RX(GAeI0C diff --git a/brain_observatory/behavior/__pycache__/behavior_session.cpython-37.pyc b/brain_observatory/behavior/__pycache__/behavior_session.cpython-37.pyc deleted file mode 100644 index 6646f9eee659b4b9b3283178fa47ff53758d45c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33180 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 I(=c-X4`TX>AOHXW diff --git a/brain_observatory/behavior/__pycache__/criteria.cpython-37.pyc b/brain_observatory/behavior/__pycache__/criteria.cpython-37.pyc deleted file mode 100644 index da88027d2c5aa908ad07bcfc16d216a1866a8fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9121 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 diff --git a/brain_observatory/behavior/__pycache__/dprime.cpython-37.pyc b/brain_observatory/behavior/__pycache__/dprime.cpython-37.pyc deleted file mode 100644 index e56d31fb993b573a37f29b5f90b67e21b3f0448a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3961 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 CZk8he diff --git a/brain_observatory/behavior/__pycache__/event_detection.cpython-37.pyc b/brain_observatory/behavior/__pycache__/event_detection.cpython-37.pyc deleted file mode 100644 index 371a112c4a3ce75fdc748af442112929a70de642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 zcmZ`(O>g8h7`BtiOghZ=u)vCsi;s-hw(4?$(Fy@&Z%|fzO3|Q^Cw|j$o7lm2(oRVa zP&o1n_|R6I_)EER>R;f*YtL@CNQ<R7ejWSq`#kUCe01l|m|&~^{DF@WLjLx_vo^%R z2l&_r*a;$NNivG>sEn#OizyK)(BlClF!XPc{5B9nG5RUVMuL7prd!vzj~q^EpIFD8 zy^b)veg(VfppUsRIG^(p`iWXNS;4|OsBJ$q;2NXy*zd+R!pEm_fRFtHJ4ZTlOfRXR zCy}}5A`xBEA88k1Ow4_Z<1YG@{2pdqjEN08Dw1EKCy5(A8FkSWy`mR!7h{xm@fCfO zT=?;pN5wCLvv=LNBbW4J^6mY3bdg*P@#{++>5|t8u8+jfXW*kt`g4SHgD!bUzB~Q~ zM@W0b-$SBfhV4MBR+lX>x5CHp92nB(Yj!H#igC6tSk4>EOSa-=v2%oDE4gBYEFG8t z;WV?A*0@|cR%pXoX&YY3bMB;8<FMu{3l`BlhSH{DLRx3!vhgbzx9k+;(aKqdSU!=b z=wa)pTF63zV1>~YlS(>?*~qFcp#p_f^AO85JCykedyI6zxXq!Dx#1OHnl=FK+_VrP z%^6emt`dQ8nDdH!8APZ!=6A+)fvMs#)*qra0$Fy3!@^^4fP+P5tSB{iH!#)-CZLs@ z{1E4b+{5zQ-kKr9=OC)7mSB7q-hC{%&ui3J)CiUKTIHdF8zprO=9cQ82b;c-{d3~8 zo0LCmT-~^E+W+Eug{~=D{QT`lXEo#w3&Yt1?1F2sqRc=JvJLa-o-lvDf14w#8td2+ zoyIDxXVp~x%zgHs&Bh-xjrzFMx$&3la5}*N6kf>{uc04*&C3QJ8KaHy*EUO^DV)W% zDEdg%*$^F|j-ZciQ}xL?7;XD4Kvlg=kfj^#T9}Ru{#r;l$N1Zv4ZH=j$;OBv7D%I~ zvQNSl`HL9;kND^NgV`LNZS0({xY%9tQ?AzY4;4pT!QYvKYV90rqHK=6u2*Y2|3oh5 zRyx?Jd49r=0QZ*2%8HY{rQuR7^b!$U?zCC&En&r5sm&g=X!V6aGw0s#yY;$%d6U~B ze6l`4zV;-nPmR2`P17i)+wmK8n@;Fm`W7|!aDEz@7++@K$7z<J7WLX}W0c{qPU1Ld pIeL04`XsozkI|K3e;|IVdlh%~>BCBkriAx>&8#n0N+&U){{nzEt{?ya diff --git a/brain_observatory/behavior/__pycache__/eye_tracking_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/eye_tracking_processing.cpython-37.pyc deleted file mode 100644 index 5837b70f8ded6f2fbfe614a8684358f909305420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7580 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 YCXQNnPL@{QDBCONSI(}S6~eOr4f_Cd*Z=?k diff --git a/brain_observatory/behavior/__pycache__/image_api.cpython-37.pyc b/brain_observatory/behavior/__pycache__/image_api.cpython-37.pyc deleted file mode 100644 index 0f9b4656301993646522293a273a581adba5681f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1803 zcmZuxOK&7K5N^94)6+9cvde-52xz1|>>NnY!f6$)5)!dm0TEJmFRhVUp0+pBNx!gr z0u#+1P;%uzB;v$h>MJLH02fYt<#_-Bw_L7v*;W3^U-`>>_aX<a{N*Qc;yKQ5^s{dG zclOcEGYIKORyYZ>BTrn6yzojt@tO17k*@Tv9qB3m%1r|N`!c|PaK)3JWGBw3_d9$z z$0OE7$D&m7<*X@GMsw@tLfJ<*B$SPm@K=bMxXL^8RUrAEqk0(KJw!@E)ramw4`lD! zNg^4_KE{EJ5O2`=FG_K$F8_#+l*x2HQ6?7glcU&9M^TI>MJwW`an<ZpQfMvac9tx5 z(bC@3dDR+gF^$Ob>J(dAI{s$$$!cD1BDGT$H`BSvGf~7Qzf^JkI#wc^#!ddCD(uc# zmA7zZTD@`f-Fl0)VGH?LM}3^lv{qGH%;T)CuubHZl5tzd6BXyCZgt({*~mKUJi^xX zR(m^MmYqjVGmh+1^U>*o57EsR5Uq2=7S0)8urq$k-*D(IboZRUaiM$AJ?P$o*H0EM zx`#Bg<B{L-s!0Ymf2sO@CJIe{H3iT;2(0joDqeSf4LG`EqGOYeWxqQ5EtvnD9X=hu zGD@4Vm<qWw5kH7(K0c@fP)hOnSXCEhTsNvR8Dvdq9e<Ng#wKsor^x&{t{Hoa0xRVC z?u7D^))RQV5N)mJyAw4P7kRCBb7Dj)ntZ33cR`BNrs+F4f(aoUw#|n4E{FE=cb4Xi zkqM1PqNvT+5Xw4Vw?uE`!PVrY^KBw*3Pw!#F=bIM#TKpTr|B|T=?C~V_Cna@);j9S zc03w(VVYJbmNf06G%ag6D@Y%vDP?(O>7}Wxvoy8QlirHR-4=pWRo#j<2UoDmx0JOP z(zzgy-ln5H`1kqfJ~SOt6Vw3R5Y(ve@rZ?N$iu)|GE8n7E!{^qk092Ct6a$>zjm%z z;z76119V^d$X3vW7VQD}O1r5MXDHwyy7>%ZncrIm_PIB_b%}wHzGOf1TgDvB;z?M5 ztE9uLi`NAK+Igdvyz7B?d3&DRf38{^?<-xG2UO=tbfVf-)!M}A`-s>DvYt%}l?-70 zR<+^?H8k?>(7AK-^7KD<3by5<K%sv^=eK-9%HAbDJy>Ji*(}<yicnLxs2@Ywphhj; z@LPxK@CLc0JhaHbf-l@FLd%a=#ifZw7Ndnm7;V5L0_+vWWB`4Q$lf4eeTaQ`u-%0< zz>Bs9MyJ~V3t7Z2A8vsCW7+X2&~KCHha{-Fx}hN&W~FMUwbUQc{Kq6L+x`}ockjbM zMnhQ%`LL&HW)vp<lf1;6`{L!-OTd0LE1UVU<^tR~-epatWYO78|L4C8_m*|^jOy9K L35nS5_IrN;{ARAk diff --git a/brain_observatory/behavior/__pycache__/mtrain.cpython-37.pyc b/brain_observatory/behavior/__pycache__/mtrain.cpython-37.pyc deleted file mode 100644 index b700346d8cc508f9e925afc954ebb427be0ea57d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7912 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 JTXYxQ{{p(ZMLqxk diff --git a/brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc b/brain_observatory/behavior/__pycache__/ophys_experiment.cpython-37.pyc deleted file mode 100644 index cbb0b82f0c89da93be1b9282bd0299c203c6fb23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24846 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 VNsBW6k>>e7M`d`zxi0+Y{vS<+)K&lh diff --git a/brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc b/brain_observatory/behavior/__pycache__/ophys_session.cpython-37.pyc deleted file mode 100644 index 124e056e46281b1425bacf6eda9600eb741fd374..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31952 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 diff --git a/brain_observatory/behavior/__pycache__/rewards_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/rewards_processing.cpython-37.pyc deleted file mode 100644 index 16c51772308d986f27d4e4f0da65ac63a2b1b56c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1444 zcmZux&2Aev5GMCeD_KT=4o1`yuL2SoL4Y2NplD*FrywZW6a_YNTxv;4w0Fr3$(15N z3J@TV;e(By`bvAvDX-8|hg>O9;!+?*a%R4n`G&Jk4-b0?M)~(U`d5t52Y1+w2sS^% zG(W<^5W@v3afY$m2St#D{y)lMj(K>Q@c6RB!t0PlEPfwlDGPo_!{j5_q9JagGm+cp z!?1}MwY2G3QF3ExS(zr$+}2v=fm4Oig_*!Sg=wx~vFHY`!T$jK!VCxK7H@(Xaz7Sb zhnw)t<vO?tZqXS!e>Dy^(I#HUEFPduvQG5<b;yzdx(U|_>wrDXTgU=#Q-6!M_uT>7 zN@CUny#uiCfL7mYb)3!X`+v64gb+cxP9eiXdJcj22#ixDjn#E-36+erSrJMqI8j5+ zAn#u^Ejh`Rv{XnTXP~sCni0ndnJP`}To{jKxG_S>o<ICbot@>nl|9%EFLbsi#L?@I zE)YUq%sF9j1%T9o7gHD3kf~NB94K?HEvOhMLtWH{R3g7BIGKuq@1am*R4%CHj4Xwn zw<i06eXimOk<|$D)S9kdK4j;6C~ZXK36XVKt%z44YDzvElmB(JjqNVd)UjcRke)8G zrE0VX_)>^-B8(3>FI0ZzWp|NW6hMP;$$8XKOZad8MSj7yH?G*|QyK4~?bX$x`l5cF zSzB;JW@5qRE`_^LUzERzh2^Em(g~l_g-|-{S}kaCQK%VoRI*S-U2^UEwdvE^s@4f- zO=s&)cR;4GTb$NM*J@e61*zQQGTDJMylC}x3i4sp1Qlz#pAybe2t#YNgqEdM#U&ed zb-2UK(iV<Qv;NlWg?oWbDA=1U_CoDiJL|TdmYQV&oBo6JH*ov!+tZWr9|oTIn9eC1 zP3V%!)%b~|z$&AU##}DUSb<lQ!>X$J%8Z|h$=E<p4=S2p(HRHZq5utcbv)6~VHauw zhzkmgtd4i&9q*#6w94IMma|c{Y7S=HZqqmJ>tl{!LHCYuAAgV2Ai_uZ2e%J;f&LC8 z!)}w<RRz}Cvl;u>-2}4AlD6aZ0jOo2ZBytzoV=yacW?O?1Wo$5RID!ePp(MD@!!WO IPQw8I2fN0RmH+?% diff --git a/brain_observatory/behavior/__pycache__/schemas.cpython-37.pyc b/brain_observatory/behavior/__pycache__/schemas.cpython-37.pyc deleted file mode 100644 index 6e619b4b29d9e849768b2093c00530eba33e4f95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8167 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 I<C8}He^1K?ga7~l diff --git a/brain_observatory/behavior/__pycache__/session_metrics.cpython-37.pyc b/brain_observatory/behavior/__pycache__/session_metrics.cpython-37.pyc deleted file mode 100644 index d2cf19a846ddce2172e055af131866ee718d2ed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1820 zcmah~L2uhO6sBZ5N!_N00V~#G2g18VL#uSyE$E7MDFzf63aslcf&qsTX`2W|dL-q* zSaulDACjP_{v};^8u|}*+Iy4~%geA4&?99&e){;{_nyByJRB1k<@?{+#}Ofa;7d0K zu=o}p_azukc%(=c!5pi&9Av|Y@B=>Nqjym@;(L7m9m)21^b<+${0aW#brRKgy_HPO zO6Jbphq#UxrXCf{7s~>%aSYq%6lV817*DREOL7@s$G;6=9y}zM(L-_-UlTx%*k^EX zOktcdRaA<3LH$xtE8NOxCulC2qjO^^qpr%G@YKv{U_t$6C1B5*5;k+OWNT?GQvuCe zCbiTH%9&?#%Sw@k-(T2;I|(cNX25auXvH*VE`15U-=lAGLUA3=(ZXoof(8F4O00#V zQUj}!d1>?w9%A0&17B&6JK-F-r}T~ZrIJ=~z*beMdyEia(gYc=H+f9YxbULzGjKg? z?tnhqAL)_v76`uv-WZz(vd=m<MhT|r4o!%tu1aBL0j?Y(1z~u4{8bWSeX$gf1WVD$ z_>hp&RFI7&;}Gi|pe|EeZd>|*DZQ{PSK=A4d=4~UweNj`u!X4#=bEhUe8C%9EJbl1 zsNE7rO5dU;UC>2P1X7l|P!)#=OAYj;+X3u2(F>^*D2K|0Hjs{#z7%s-DgVvUWMLro zlc4QM5>CGnzOs5Np0~GTdW14v!+jTmu9>PrK9F!fhYc9!5LF%S?2zSISk8i|+e9aW zdK5~ntGlq74NJ&oGR*dx!`XN%2D=XxR}b;f2V(EQ%U{2qo=kss!n!Gg?4>!oV0trs zp&96!v#+N@uiezFgmwj3vs!N4^aq(w9YpELiWTQ@8#t>Jc<}S%9K}2{P>FWUys?|( zuJVpsdCy7##0r<LHuYhrjv3Z5_J&}{C-)+I7v72p3=W)e`xGAc0L&${CukGUocLf7 zUq@F_Xc$BGBe?eR;et9r$~o$FPBC#5%DKy3FTxDgyOkJl{<A}LcWU$WZ=HhCf3^>( zPFGl&qo{9$*M(_IqQQI&D)h^6i?$Bh3huXo8<ZY03JV2s(-4~qY-Ea+r#-fX|BFn3 z&c=aEP@ly-SorTCNn8)5le!+bs!XEn{%$maz8Zu7IrXQI1!z;+!@Y&}v*vz}V9Ui| z$k^Ton?!bi(|$Grf6z#*SJ@YxzS3LzO1r>W1hIQ)P&xsuM*+od1CN7erQwwl&rwtk M4;)1I;_-vO0niK^hX4Qo diff --git a/brain_observatory/behavior/__pycache__/stimulus_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/stimulus_processing.cpython-37.pyc deleted file mode 100644 index 8a32069964586a28e1b7291f2ce97d6f0e00a1ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15607 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 diff --git a/brain_observatory/behavior/__pycache__/trial_masks.cpython-37.pyc b/brain_observatory/behavior/__pycache__/trial_masks.cpython-37.pyc deleted file mode 100644 index 3b0dd6fd5ebee6c281dc38311aaeb1b2e6dbd8c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1800 zcmcIkO>Z1E81~H0ZZ?~yO$92dxL7?@j7T>X+@cD#4T2s}K~1@gR*Jl1Z^l`#J+i%- zE?N#Kz4kwVIPr71&Xoh=2XKHBk3HE0xW|(1vB&TC^SsY@cSi(c@$(Pt&psi)g~Mj_ z@bMJWjj?dT6Ge(7?rG8EDet`{MaDDU$KL1Le2Wj?CdGg!$0Q&90U7eLOv8o|cIYQZ znC=CZb;6VRwte97b&>FNp4kU$!h840kI6du2|9dw*7Mm}A1}y7GE4k`XYXKjP0qG> z|6T7G9>LOp-AM?cMynN-x>QRpsJD_SN6n0u!g?lkcSHTE7H%}67~e3<7Qzeb;_=bd zh{sC>hqPvzGe<vXo_!Gn;@=?8aWe}y!Akf1TJj_sqK8yT=c%#O_)1tRVUBrYN1Y3= zgkM_yANx_og1I?lFHIi{D@BZDYK#(0yM4sT#T&t?H=9te9gHeoTI7Tjqv%-lCQneK z;8vctnTFqOKWfQ`ZBGf^X3|OBrZq1Hoy9iQb&(k@T$=^UHoyVGgD%*1=UTV>h1ebZ z{ku6joP6t$(+R5>A5U4s^lI`<v(g}qpH756cN0?!?Mkesu2ydHm7Go-GV`cr<(!=g z$SOGG`21jMQMwZ|g~s!cx7EQ^RP0<Dd(asVnR4TLWdn#aOgF?r_TEo!r}vV0TZTl0 z5%v&5L|}LyaK)306c|ds`;~tAHGN2rp1nSLvB_zG)Xjk<*69Wzkf%j@YKnfzd|BmP zGO%qU@>r~HxrJkU7v=F%p9<|yy6S$2YZtk@Yj^SeJ7yS9uLvDd86L!R?%^XO^FGKt z&%RIBF{$jYK+IU9O-dWk0Q9T`wW48`Q}991k7|%(A@$OWoJvQhLYam-19JJw3RfA$ z$6X~}SNIQx&sYiYn}zglqZ=%5Dp^)hJ=1c*6m7s=Z9I5b&JiG;fs5je7vK-4uqqAj z_=o$;Ba{gAi%P6$6P(?Mf-TaOR>DuFy;@y5bYp!a297o`Q-=9{YHBZyW-7uaG@z@@ z&?Ta=o7lU~*GQ#e;8U?_ihLh=o3W+xhxC*2;~Q^5?M_$XlThLaw!9b7R}4DW+blri ze^|740Hu#HU7$00?^Y6T0NmR+=37NyFBc&E7EZ;WYms(<LnM2|Y83dF+R&M7#QE^a W!tkXMpM_o!Tg5OLro#`0d;b8gf9jn8 diff --git a/brain_observatory/behavior/__pycache__/trials_processing.cpython-37.pyc b/brain_observatory/behavior/__pycache__/trials_processing.cpython-37.pyc deleted file mode 100644 index 5d66ca5b24cb0f323a6eb9a567be17a755f8cf05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36163 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 Mj=o&~mW2I(023w&82|tP diff --git a/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 2beec5b6d8cb71153e45744291d63631b0c5e800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmZ{eJxc>Y5QcXzjR*n%LFy~KE9^wXB(3;?Xb~2c*$=!md%Mf-<>X3hD}RHPe<`h1 zYCEgUX%dj&z`XO$z&kvX;qZ`P)$cFxhV!#uww0l|z)nXfiYRJHO=px6mEDniu)-_J z>2ma7(gN&6SI`<CuS3<Po9LgkY^ES9eU)dkTd-EUq~?W)U>x@%>DWT!V^@exaA$b< zO>^1D|2fB=?t{bujvx7cou0CLe47|lpb7!c;5s&TAiYy?!nA7>^8qm=s_!w`r4cNd sMjr=|b9mI4-GG*Rpyd{HXa0hgoEv8v&Wq4356)_@7FM5A<om)VYwas`iU0rr diff --git a/brain_observatory/behavior/behavior_project_cache/__pycache__/behavior_project_cache.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/__pycache__/behavior_project_cache.cpython-37.pyc deleted file mode 100644 index f15aefbeb78b670d67e86b27ea2affd7545962f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21797 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 S&7|b_*v#)H)ZdZ(?*9YW^~ah3 diff --git a/brain_observatory/behavior/behavior_project_cache/external/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/external/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a73aa76203e7e6f055f5416804f5b140b9b8da57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmYL@JqiLb5QQUHh~PmibPGEX@uw9Vu?vJrGPrTqBqVWlOYh(fth|z~N3gSUwoo6u zZyv+UFpFNV%SeaY1)BP7@KuY#j2znp%{HvxTHje{+JC&S%Q4?Z43R?)dMM!pw&rsS z%2^E~j<$;2d9+axozLsYS4Q$^5)M450(MBdWl0md$YcOxg_Cr#g5*M-Nz9=#F8qS< m!R=8cp+M!B;W=TjP-a3HYmyK{Uq3pNgVV<nr_Hx7GW!51BuB^q diff --git a/brain_observatory/behavior/behavior_project_cache/external/__pycache__/behavior_project_metadata_writer.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/external/__pycache__/behavior_project_metadata_writer.cpython-37.pyc deleted file mode 100644 index 7994b3fa0fcf8e654161541f70f0b90e19002330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6722 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 aVIyi~3--pQWRW^!ORV~Dv^i(q(f<o?)I*v8 diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b70703aaf2f411e1b9050af8dead894572a3a746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmZXOze)r#5XO_eMuY>wr`W=zuoDqoTM<EQjzF0F!Hu_@gk)XW(x<SpvhtO#wX(Le za`wDElpC0DzDe?tUp1fa6Rh^_8D4OHjLTF7nse-YfMSTD4Qc6uQeui*QqDf{l$3OJ zSlJqS7t&1%4_0>-WP4o}3k6MMeKt#`5;!k|$~N`Tg)}g=iENFGzhS9C*OpBiM3)&T zop&E9{3eZv?<CD|tmXUl@<iO>MHWzlVG5qW58}du4&K1Au)fbCMC8(_A=X0{S5ArS xI(rmBFX7%|c0<m0$oWLRHUG)^UvfT@b19v7os=vNtG&}Un8(JRQ6&DtCO;+de_#Lr diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/behavior_project_base.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/abcs/__pycache__/behavior_project_base.cpython-37.pyc deleted file mode 100644 index e83227e6140b8b3aef883ae6db080bc812af111e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3376 zcmb_e&2Hm15SHXW*>V0C4YI%jJjU48X|X*SZP6s#76poQ(R43@0f7?fNW1zgNhh^$ z#qP1_6YQ<0_F4J_y7tsp=&3_Wq8&$0Qeb6^qNw2v=bLXhJl)*v8F0nF|APPO8phx9 zrMjBX`4Vpa0vcivGcsb+F=NZIO!;m_jkxJFRlgCn;<nRP{btmOZO2yqR@8NR-x#D# zI&Tfqq2`;0vq4%H#=!muv>F2|Z=9T-<y+X}f?;38R0Js*n7RF}pbUEvh5o@Q4e(W% zvhTBC#=rVGqb!VRBH+_@_346g9;V5;FV$9;cHvhTp@w4;!?9?CHff8P?<``G#@pr_ z(`mz4=ao&G?@ZDnZ8g?aay`-kIh%CV*v67vk8G&1zLMLdTZabegX|{RQsdhz<J)9M zjqi|MaDOk~uU7torLU+jPBEtd$9^h(bg6dI4N2Z+R7_doTcu<2X~KO5H<wNl6Lebm z5C(rxq8wpV8CXFLrJl5hM1TeI(?sAf;iv$f_fUC>6yXF%vpEG#JWMVlio7xmPt_U` zFCZW4Iin0S9HSZ!MkpkeLB=T0(u8oNY!u>X;qXG8m}PX0wnQw%n3Nl>b63lq{~_tt z<TRQv8!%&%`l|W&&$H3^C8vy!ae&Ft!`C>OjZYE`@DTiLOp_}<PBWTtA6n(#_`A>> z^H9)_GVH&`mlWnk5lE2N#~uSn-P8k(S6HNMc3dH+J8o7)-Sx2_(BtY2XCXhvp3iR! zdccoiHp`z}QsGwm+*Pdmk`am~-T5aK0hSmxymR)zWUvbuzT}p?<g<on^Opt5fEgJX zKF0!2Anp_inXl+N6afM(%E*;00U84*6M`6x=oMayA21IS&@nt$!GJYvfZ0WKnDi+> zkP9!otu!ig2k^0QxH*5i&f%JQGSxJSmBx@1{@<5pumRTO*+r2LcjgyxUK4U{eyz={ zngy@VES;{EI&FBQ602U>QeZ|aiB<Zi)s*qFig<0;1ntocwv{M9(Gly;kJd$Ob#eDn z^0&plS90>}I!;!4D@+tEVIL9!)qYJOZ%Y;v5(=m)IFkEg!BQ<&!Lw{mf4q~+kLzG@ z6`hYXIPLlHq2Lr#fzj<`8heyIjKq6DV)Q({PNEbONM%9eEW(1KNy;Q1D8W#4r0eNb zND&udJdLJ&h<*%0j^MwH8I<m+7FCty8gs-0P>;xzLH$rF8TC^}<XcIGTg9XBK(ZPN zd^iaq6vcYLAoppq2vfmgEq{Z!MGYLGlLWyQt<Di>7Sc$W#tBNY8JdK!S-~Q`nV^fh zcazk6HKbP2E3t7EHf{yo$2xlU`sme9y|=b=2-icRr9gUEw89wb7Q_Y40q-GNla*){ zv^h#rpp>#9O5OneVIn@%xgt*-98xevkQa(36`m^eD|iKr0vUsJ8WEIX&e5}h*7Oic z)bIfT(I)SQ4+?$Fhmqz(_kKRyoO(Xk&286Bpsu=Z-gALzWE#nS-*tb2Tr0k?2AIej zfG2B7u5QX#D<e)<mSwdCvMu?cEt?(L?8-(S8uON-KHHZAk7T1yL`6>)Ue<v|7G(Yy z8r!tsx6`%Ey_RL|$!EthKY*u_8}#!AoL-o$pT)}BP--CEl|AS4>V!1BbwV0e8?)}* xI@%})olpOlj&he#-aG9K&L5bwL%BNXR-M1O{aJzZ7xLi4B_ca!-;zJO@gK!l(~<xH diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 2f9e67847083e860c45d1da086b921b242897fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmcJNu};G<5Qgn01449#g%{{RGO!_pXv<h3B*YR~vM#no+&Z>pr$rfg6C@^HsVft& zz{I7b70?+=KL4jX-}ydyG8`TfT=nZS+)zT^J7>EFD6VnGQ#6uDYDi5BN;^F;gE}b^ z)X6;=r5~6<Ms$5VQ5CGT3wOcIm1t(Vj$^Mea`GoKHEt;}bUR854aO)N<svHsXv<w0 zRaimeLYtL+!JXj#yEGRdDwS<L@H%D^8sOUP=Nfzm$CS{`RLuXqpXjFBG)%DJ8wn{M z8}s=xy<iVGUt~~$%u09y+p@6*;jDynrtB&*=aGj%>wMKlHq#}Gx>08y!~z}_-tCFy qd&KfBv7Pu$EdNO??}_D{YpWa1GvBTcE^8;3MqS~DAh9EMM85#mL%ZYv diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_cloud_api.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_cloud_api.cpython-37.pyc deleted file mode 100644 index 8618cf2437a9a6e7766fe530a1df91d9b844b7f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14644 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 Xj~|@#TPoK|jY>s-ae+4ft@-}}{8j^- diff --git a/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_lims_api.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/project_apis/data_io/__pycache__/behavior_project_lims_api.cpython-37.pyc deleted file mode 100644 index 0f73e2af81cdd03e34056aa2d5cab2335f92f2e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25588 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 a8vB59R}!YGd5cOJzG%ijUg2b0Ed4V#(QP3B diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3c6abad52b3cea2622934254212d0a59d243e50f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmYL@JqiLb5QVc~A%X|7aJR4%5r0~-5xYQ`B!e4WlaR!fExm$Qu<}Z_9>LDa*+PBr zzIhBY!z}v!9wQxZ7ijCV#a9`H898<cnr+x1Ti;n|+kd>T%Q4?Z43R?#I+t(;+wi#s z<*bGgM_WhkJld#;&X-N(D<gR{35Ook0d`2cRYeo}P{;tr3Mc7e4atS3kXS-(T=)gy kgWID@LV+r=NFXbWg%HM?Bt-6;M|W~``c&bx{q;p=AC1ID-T(jq diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/experiments_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/experiments_table.cpython-37.pyc deleted file mode 100644 index 94061e4bfbcd6e46ff4ee4b7fbe99221bc8a15a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2549 zcmbtWPj4JG6t`#g&t$U+DHNn~K&}u<7Bw5B-Xe;CLQzqhRwBJjw;1o(+nsb~Jhi<^ zca;ljuY3YHwBp2f;FHXi6JLQ7?|FA8NfYJLiN<4lp5MIpd%ySFe7m;RA#mk?{wktX zLjJ+U@@m55Yq)I;gCvq>B&RXWgE*kL4ze(Az%$I6c`I)Dy++o~qd4;OX10=d;!eIA zujbvjOUVyJwq*Mik!=;J*2_k`CWD_yFZvh!lU`6o4@#HnLS$9rUTWQ5k5-)r<#=lE zr!Ue1R^5k2AE?Cbi(#gEVYMZs<myGKOsa}R@k|}6j61#9%T?jHL)+?ev@C_S>7nAI zOgu#^jlR#@UPs$B7f%(p3LKnwmterltA^<g>?jgbN#a1#IFxIuanMvP1?gTR*N9q? zjXy%!l&x3IxFg##dPU+@xgtC8?8;Tyh36cS^=jjLpBAQIeY&$>Zf6ib8)?I=(<UvR zGEqpDiy|#2nQ*vK&hgpyKrkts=rFj1V{WY2P>sc5s?D}foXvs5FEDSvw-1m8a#Tfj zQkF(pTdg8wN^)If)1<M;7@wH*ZMf|X7>>hZ!il2?!7(|e$B_JQAtf$+4eK|Ql4J6^ z@rD2=u-c(`L<#X>VQ3G95xH{8*m`TbzUnPG+GVBee+LQOLHqgzy4b%gwYQ<b1IzSw z*^+RNk#CQ!Gf$qJah>RFk{6aa&7{#K8yTH5&nUJf)ksV-cWX}<s#l*n1=ubdYMs?@ z@XPG(i0zw+y1@`pW|W(l;#46lI~r?yHa&O^{PtWv(&pJH(?{Go;S@`)cUFI)7Z~hj z1C31fdd;fq8NVo>!ID)G=V_5T&J9+v+8CwKZX9TnK)HcIy++lrDjS_RGF>qIi<m3$ z`0w}IyMsp-iZu{pA^SsdB#P<an?fYIkmBY*6^C}9OI6qeMo+WBy>vLRsZ-mfNS;Ac z!PzVW3;AqkXhd3YJp_-30ysV0SyHr~U~Jg(JQ2xQ?Rf0%&IxtxyuthB)T~2<AHr=T z7|42yZqN>$U3<Hc`b!8B;Gw_piMJ;-;vy*!HJJTfBYW2|k+=y2K1I|^4Pb$+_-4e; zvcO4pPEJx;I{*UZqC_6$+9>EoQ2+%L1Kb>7pv(<sH9JyF>SEI|fE8L+*T+?s=1?i9 zxtx?)n)vD$zyeS`%k;>%cUnmGqCT?cE7qfC0}}G{`S3n0s}0D&Evn9k!m2IUwE+yI zHM@QevA3-+L5=`&^wMvCblMw8Z93QdFX{;BZ1d6xPR^W(BLoM&f<MB<f#@92mlTAF zI*_4y4pOz8!>nQM;QDn_(l_3Au?prZiP?mEvrkX>#?SWPty`P(j^CVpR@d?Zo5?Us z?O4gpUdyx~zBuG^WZEz@$X2rkL)CmfQD%B^$;^9TaT9Kf{Ycij6#jx1U8fh+>s(g{ zpzZ6}`~?t|^QyynuH_`dd6)C&!0g4FHs?|&upN{#Ua1AwAU6y`T!kQ$RRg8XcbxeE z-(1B3Lp;SaR1AZ3Gb=FQ#K#^5jeyWku0&B3`Zo|+%S}sApOde|trC9Rgf$<-vH1Q{ zG5Y5eqrX&)dU94V`g6tT&zm#He<Zy0#Sh-y=Te&dC%nGKKfk-ziA%Ho3E>t3$8p<w h?wq0x0(%kSRrKY&zF(oPS^QPl2%?}HcEhXf{{bz+)fE5$ diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_mixin.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_mixin.cpython-37.pyc deleted file mode 100644 index 23a3d8897993d9cf71bc324a797c02f7b821a49c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823 zcmZuvJ8u&~5Z>K8JH|>7N<bnK#T7IzunRgAA%_$+;1q~vb<(i6vyRU`-(GIdCXQ$j zX({;yRQ#oDsi^6wm_0w_A|rh>v-8}U-8V-^T}Cwj`Be=A#(w+5mgvle1b0mAEklO< zj_^%LhT;S31)A(T5~K|Y?kO?DBu6F%av7k&;Eu@<L&|B@-OFOKa_`fdG{1d*9?iWH z=}b8njcplO?~RJmPK~Z2RF%@43VQM~BwP?25<~ulP1&qnenPR;yhL%z8X255a>|jT zxDps*>pMll+S}el9qghy*xrvqMmK&ilF#TG2J9G=zFwp*tx}sqVkT;t+ESk0=WWK2 zC-=Di_%V81hUzAD^4J;Ye7R~>Pzyi2Jlwa*C;O*e*Pf68;Fz{r+M>tn(3x!fi<N#q z|9)J&ia$D2x>!vV_7nA4<*WESSK8*NUdAS0y4V&bcba(9G=7&RF->M(6iUz3m7&}$ zqX?W0l2WBP*n}!BRb|W7U_1Lxfz5+~R(fIvl}a+>22EvXUbtVZ>JC7frxk$zSne?~ zCc3;EKH_aI_`{97J-OU{kp4DfL?4IJb2T>rbr)c6agllb5a4>DvW@2e0Idcn+f=++ n#vW^Vo8P{N^PB4MkT;f5Z!Pzty}$G+b?0o|?X}PQOJM&2=)K@~ diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_sessions_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/ophys_sessions_table.cpython-37.pyc deleted file mode 100644 index 7b457da35d01b9fc93d265a3cf9134783513afef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2150 zcmbtVPj4eN6t`z4nMs;1T^1@8BxGq<sz%zTAULhi3bqIY>ZU8Ta2N%7ow3tQI{&aI z*(S;bu~$9;f0T+7UumwK_zGO$*^^8gXir%3v*+1<e(&e^d-H62yN#eFzkSbK7ok7& z$GSCO@(Fa+1Hlo;F$(l(#W=A7E3pF`S9&LCfZmRqi5s{^=fqyp3R)O_fp~*AUnAZW zE#dy)1Z|E_k?;NqHc`*FO7A2uqAX=`=^RI@@NwBb$wxEwJi3fh`0Bin*;s_d85_hR z)Th?1_U|cZ1PU-mfyHrP^DW_w8=@&(;q9S4Bs}i?Y#TosL5sWGdyT-47H`A2#Vzos zQ@-;|jMy~Fq`Cc6C<R_AbL;%uqnIg0hM6R)$YhkB6P9w4ur$giF)OqpuiQL{#Z<(E zvx2n=G**yeB*<W8{2<e@5mlKdW^=FHF<QFP(un(ZY4Ks{sY#wo*jsj@l#5FmX7MCR zLuUnn9yJO_(A7sE3be!vG`7a}6^ztb*dQB4bL=kA0xtlaAK}dkZwcR57+y-pZqNTV zu4;E*Fv${82&rn-LEUN<AJ$WS=<Ln_|BZ&;y^d+aL=~7KMMk*Hax#=zLJIxl^|qS` z)JkpeR0zU_3T0$6i9{(`zvU`-j#xMn-E&dY5O13HE$IPzvIU~&w@Nq8&d=dd%NCqD zhPjYsi_%bM0i~r!X$mO8%%yrKtZvhr?n(V9dRvr61*KBIlkb#{67lf*CaJ0SJCYAz z`0LlBC;hJ#;NE8=#=8Udilwvurzs1wl(P@}BAu#!mWxz{AWgpXkE20fMTI!XS$M(D z1)Pmz*ugIj2a-i8%?4m`${=NDhwBWiCv=suG}P!E8bs9LMkXq1wB39r?}L*&(3J)X z-P^%Uyo2Wt*Fc}>wB8_1cO89*^$BQtw4j@8?Z9M#mgox996=W19+3SJz1twA;xdmj zE_^KCgwqDMO1uT1<!+v-0%8h*FO+c}Rb}NNtSNmhvgRM$ZM}Q@=?&*=s(l64fM!q< zFD%(fpP0D?^Y>wfm(~?p+T6OrOGitfAWnB-rLk;sAmkYRgt+qyP;?b~qbH&EqToRV zK7=V`l!&x|N-*F1GM%zG;soSGm>TqQFnjr!?9ZqBk4X+GDY)j%t+AQRKhr$wl5dQe zaFj&=QEiAYDaigUH}9Jow_3R_P5WKnl{ymwoAP0>1?35NWwJkTS1%N_YMp!owwCTI zCQ~5P?N1i~w^k?jVYkxO5pH7(dK(h0Z8h=y(XH`Sq1DHItAf(+$b0(UHl<0%C$Z*g zhtlsREUuYLc@~1&%6ZWG49fNAy7Eb#Dbm(wZB<B<_HtM2-qu1>^@h-SCz~L)p({;i z&vGn;-@ETQM(=OQEzp+DVwOYr*Vcn(4u24)<h!sOJYVy+`ybwR2dh6vJ=x@Kx8iNL wdcZ{gG)=h)PX52mb%8Kfn3`sSx&eT}!?4f$xB~jAW_bk#-myHZV|Sc?0JMQ($^ZZW diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/project_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/project_table.cpython-37.pyc deleted file mode 100644 index 4b6750525d0b518f5b007157aa2ce48b9bc09599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1885 zcmZ`)OK&7K5VqZq>3Jj>7Fg{{3u*}=F-S>-5Erx{vf-hX&=84mX^qr!x1CH+-0jBh z3Cw6XKyu{@7Y<o*;xF};6MumdRXvYPP-4k;b@@^C)mP<yv9r@5(DFZj<_8`jf8)ox zxgdN7-9Cpw5J45mX+(1tF^b<zIk_9TxfglOx1;>1^%W7W@UDsQB)f8=Kseu$f&UNO zKnASd<%z8fPpe#3V=Zdu=*2OpgKx?z(*;*`@UoJICrS=eJhE=!+R~L%5G0AHAQ2NZ za>TB5C!X|WO9oHLQzD!{SmS^fwPi>6qIFHKXw(&fXkU}4Cpw}F^N!pVJ+afQ?Fj}h z?$x~$qbD-0PSO1QqhrOb4bQX*ZKX|CoQJ#+Va|)JoGM<SqFf%>SMpM-Q1FTm0Spso zbzrAuX{5EOvx0y#gMJL%z6ZmCE=Wukfa0QU9#?e1uINu}!9WZB#(6~`s1!V7^WQq* zs-1AdA#~E%jcR|>HY#zp5%JvVSl;96X3N^ujRMc4T21r9hLsM5(PemMbRJe1na*b4 zaNyQX3}{`I*{W{G>znFssci+(Ng)CQr*^GWXQl<9O#s7R#O%WK@9)PSkG`{jWyHr^ z93=b)Ud%>E1y6M$_=h7|T-uQ?Wnohobvd5d(brirvRNhfOP*fva|vgaf*s=GFflwU zVx7Q^mmDaY9VT+jFEed6LcC%uPI)?(hYcQkxK=iw2j#2|;y5d^DvsOWrfmwO>$89c z)MxWIPqxzJV7)V?uoWB5*c+aG5Ef)YfJHhSP=oiuv;$KUg5|IWpS9Ome+Ht(G$CyM z=#HUg`HmILsK(0MAfOfO6MDm5kv*sc%plCLRStb{a!U#3E)dJhQq3Acse2Lx=xrRX zy{r)O$EYKwrOHxXNm0AN$m{_m{Vnq2gj*Sce@jr#{H;5n{=f4MKCJl$-$8@#hG0cN zWzgk3Vdi~6>`Yu3p^5|(&aV#Cj0@5B=KU?aq0+iMt^Mr0&_+T+wpQsKwX&jAJe9RC zjnT#q2cCHY%+-&#UE@Mz%lFB2VX=uy<YHai9|F^ZUGG9)<_=~K^J$OHpFD*A4)9I- zVCGfiiu^)XBz|(V@g&@G5c#xYJyjx1WT-CzOD2RY!ekcOX_Deg29*dISie5h)yuq8 zGM5Dq`30hW0K^lpj-g*u_s&Dk$G7ppH1A{m6!1*NaovgIT#KnfxfjRZPq|vHwBlIk z6x6H~QTuavJHN!I&EQYRAoaBae+tt_DJUV-(o{3^8m=NiO^6Lvia|fOstKPKgC%9K z`tZ@QNJl_j_Uuv54ZNV;tPI+<!;^G*2i8*USF;jAdFw*tm+<CuYp}waL-*OKgXc?( OpCWM<t@df31<rqQ1K%(J diff --git a/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/sessions_table.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/__pycache__/sessions_table.cpython-37.pyc deleted file mode 100644 index 5de75c8eb490ad8e5609fdca59c565c21a0ab744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4659 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 I9j8<K516J_82|tP diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 5ab4f78784d5b01e495eb703556bb2c5238a1d53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmYL@v5EpQ5QZaMA%YKbg`2`oL{4qRM(hG%k_@-en1m#|vZYVq16cV=wm!mjS2<hU z`NRLs&oDF0YCIk>(&=`AzCL^WX+YtNoIePL?bzpFduOR{zwvur&%{1s$^vRIm4Y+) zPAom>;0;U#`ZkLY(PvEzvF@_iSS7M8IEkQ-@Qt+V98H)bR|%|_LD9t)N=O}7SVL<= q`VTUua6nz823;dBpd4o26zjN@*4rXw6}!i9ehQ{>xac4LA+r|-A4t#u diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/experiments_table_utils.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/experiments_table_utils.cpython-37.pyc deleted file mode 100644 index 641cfa5ef826f0322c49717e7c71e5663f840f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2806 zcmd5;OOM<{5VqSM&m*&wO$d*b_Fx237_`|XFC?O6m6sw8Xaxi=)<mXfx_8F2o^I3K zv&pVz4=7wYaOaQ+fy9jizs6Ti^A|W#)gF5viIxb2gr%<OZdaANtG@bb?k+909C#)_ zeM^7uIL;rqC?5|dw_)f{Krn~7sS~-}9TOak{79I`{O|n8JF!<|0qprF_Ufzwdo|`h zbh^zscyqS9B)`C)WLzZ^E{u*1?Wa5s6gN{P1}^Hr(}YojaSw+64aCeD!$BDN-aT}f zH*=W3iF@ud!r;TKKJ=cuhwjXoxhu}t8~cZZHQ;@1Mwq`t3SHLRC5K=;4p<9jK4^P0 z|F*NRsIha_qIP5f-kYq=maO++Vd)*#!7`ZDE6WD!Sj$Ff3D-SOe}>DnLU<@+I;7!1 zrqhWCjSOWr+Sl<>6pA2(W<(8W2}2Ws2HL1Z46Tbquw+0DEW^hmZbn?;d#-gNML41? z1ZPrD6%SLs$J0>mgb(N>NfWBptb=Wd+gH~@slsBu1&cn_oQ2?`bS0*fKKd5ST4gGc z3J+?1$417<gbsPExoKI2�mkZn)BRd8K;n^5}+(Jl_g4wtk-)`T)%e7hl-SpRj** z<85j9F;i=JUveD^385TOG2{?d9ws82ny~sZtgmD#9dK*#W!KGp#(9?e+fwjoxi~i$ z10LIO&JmV#g2Dq4HOkn|eOM}ddr)6Qc#g202e{QJ1Kq9X{y=8?d1n#lxQKJ^Cpr;% z4YJFh<iQ?Ir(EZRnrQW8<RN^=Lf>sFJWF)0^mg^y^=Nr#k?+`Ih3lwUzP=H44!DwW z<uh6m2!~3ua&+V7htUNg#VPfRh5FFMS4*2;9d!}T@aHf0ZuP#>kpCV97_Rr}V=DH0 zcLW6-GkU$p#h&iTj0+6`;1>A3Pm_L6Cx&0i=wKJ%1h#1k8f<r?uK@e8?1RTWYNXoV z=<^ZX0~A&hxP~0_fr$rnFyb4QKlH}bB<aQrc#CmcuS4YDgCbm1+)-XJsz)|O6=Fv9 zyC9sEw$~sR-8SivmfIr4C2rg6z)lNh#avwiy^6FD8)$wHhQ12|NZ}098j=?%3kd8u zWdV)U>7##3BX^}tITaS_XY$Bns>6%|r|fa02`r)01Yw;N;Qjv)fISp4kDdIJ@>iI) z2T^@-dsT;}!Uow5R2%0@D4<U|>O6{N6c<2ry`mIbWvyMi8J%BvDNDr`N+DhYll*;z zVyUx}(jmg|<t^c3(ARhX=dCtrkY%^+c8Gc%))nZGd@9hb!Qv$7pi$dCIVR6M<3D%r zJ5K>*tcD#C;1$r%OL*Nm(WNd|M1L7O7INt6N?8jTGXEqI&_gUxZ2X~{SjNRh0e!`U zX`&5iB*lIiD6^mOvL!AWoi+b&I!XbJqZ^#jkIrl<G=&?#Qb)0ns<MQ9jahmK!?Mc| z;{Ry%&^7Rn<*Cb@U0<!v;CIClgt<SEZ+yrOnIqZ`yzPxU(4suxNci_e)<4MG$D?=( zUw^hXG2#O`$+iygbNKCm9Na|MRat!*^{sEFazInP1(VW4)T~UpwW1bQz@M#vD4-hC zn0t`Gu4^md)M4_s|Msh2;~5(uoHyHE;Jx9hRhV~!D9GS%2!(!_v8Y+KZcDkg1gze% d?_obuw!#{l6UnA2-@@Y1*ozzfrH?MX^A{L66I=iQ diff --git a/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/prior_exposure_processing.cpython-37.pyc b/brain_observatory/behavior/behavior_project_cache/tables/util/__pycache__/prior_exposure_processing.cpython-37.pyc deleted file mode 100644 index 22fa6e0c984d3242f9dca80417c870e718b37309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5850 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 E2PjHhkpKVy diff --git a/brain_observatory/behavior/data_files/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 0b97a06fee2390688b6117b0241f591224c5fbfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmb7BJx{|h5Ve~GRVe)*WFSFeL8u_U#DrKXmdKKIi4C#p*pZzSWkUQGCjL@aCjJ5w zm(X@$>PbGoll-3UJ>Se`hXkwsc!v{8$k#AzYl7ekk3YgDh@hI(G^cdH6FsSeJQ#7H z!#c_%#NmP@(Ko&(30+U`poM#-CE|F|s=Cvi-^|lRZ^{8bCI|TiXf2Hw%d~Ky47Y`s zZUwD%eOky0R?50mpcsEfhEMqpb0|tTteMaE)bN{qMoAY85@-8LpoKqri1bh5BD}`- z^LBgAp3sD6P=QDbcm>n5YXhY<0#2DUE6;3$rc3O$sd~>IRKdJz<#7Y$5?&;7H?d^@ kV#&6#WV<MQ#<?=8<veZr^>kia(P?>!e@gtYUrb~A3vRoemjD0& diff --git a/brain_observatory/behavior/data_files/__pycache__/_data_file_abc.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/_data_file_abc.cpython-37.pyc deleted file mode 100644 index 65e41c12bdf3bb73c62d9ed2e927593beeda0956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3283 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 T$V2)W)uSeRn{L-_d+o}<2x(Lj diff --git a/brain_observatory/behavior/data_files/__pycache__/avg_projection_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/avg_projection_file.cpython-37.pyc deleted file mode 100644 index d2e48f70fbf5f66489c245a69e3e4ccaf5a96e89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYL@zY4-Y492hEAVMF+K|8pKh<{db5x0Yq>qUFEUXHt3>FDZfIQdGhK7yN*sUUvv z{SrQskVPE#1nYRaKwF<Jeu}u6u|tQU#YXg_^<DTj{^NaJj^#F>4-#_FLj`BBjhtJ^ z$Z8l#v~`f=(1wgjE^mTd86|_MaNr;-V2`|8mOP=0M0qeaCB+wOsK_^o!W?QtKG9G? ix-%t)1nPb2JRLBr4B2lubj_nXIg&n=IBkD?vBd{S%|qw_ diff --git a/brain_observatory/behavior/data_files/__pycache__/demix_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/demix_file.cpython-37.pyc deleted file mode 100644 index 34996076a5ff7f9339b497d463b65131147e4b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3025 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 Tw@|fUj;=eaUEsp&`91%C0hi<X diff --git a/brain_observatory/behavior/data_files/__pycache__/dff_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/dff_file.cpython-37.pyc deleted file mode 100644 index 65e88b6bf4c097956b8a7d9f375feeafbbf43daf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3114 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 diff --git a/brain_observatory/behavior/data_files/__pycache__/event_detection_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/event_detection_file.cpython-37.pyc deleted file mode 100644 index f3ae95227206851a4dda1576b403c3db08ace7b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3158 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 K*I9Cx-2VgBxDh7+ diff --git a/brain_observatory/behavior/data_files/__pycache__/eye_tracking_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/eye_tracking_file.cpython-37.pyc deleted file mode 100644 index 181501caf88568d3a804c30e3282b740f52d756d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2535 zcmaJ?OK%%D5GJ{+rzKf&;v^2*Vh=3>9V#DsYuci2qV$2pPGbiF76J%rNkwb#Lm}63 zWXOlY2GUDzz12PS)IZW6vDcpZ7kcUpSF#f+2?bH3;c)oP$C=@G&1Rjzi2wXWJgE@! z5B`}C7ld!&Yeq0hB56co>eHC{jN*S5IkD@zR(7J2Uk05URpP2&wYpMNi|c;f%H?P! zZuku=SE6Rz@>`UAPh?fr&WNn3)~VyKN@tgJ>i@!Nq{DLeUKnI~=}8i%Nr&d{Baw}^ zL0FGcA-S3;o@o&rgvm2Ll0#Tndz6~&nO5fKL!~DV!<QlMYa20C+)PZSVm<~RpsU^! znYbTDD!{YmqcjuDZy+e*Q%QU#sqZLPl~j4iHX!D6`icyxbfkOM@GGjSY7lkloXN7R zoVlmeud5ZXE?Mj9Ih8e8KXd&CST?~=Yqmn<%DE#OvT66Ms`lj>>dO9_Y=OsB*|w`! zUlEu1*MOTV`D$;X_GV#Y0LM?aym>I*(I^Z?UXUi42ovMQDjTKJc*9hCA_$Z*z?CNw z=^=w4*F6|Oq&FwhlfX;Ys*$B39Ds}kY{m@!I<v1?10f@)WS>r{q^~L7EnsADM;em~ zuCQbd$4ci_&ch_kILBKxDjF8+G_P?UM8X)(|04hWdiTrz6Qi{0i;<AsfjAP$q`#F2 z2uO-A`YL&0`sr9DCV)8|k0z%7ARP2fn5oalkO|_Mg1u1$7V=<opn(LQ4#49Jk)?XF zIZz|<B24urM#(Wav-wsUp{hHc=mwz2=!}h<9^YIbz57NyH3?bDwHoWZtW|cXlMA-y zOx;CS=nr|?ASY}}rcAQe6xedM^YtYRMV4BU^eXJ@IJpx<MqdH>QfrrV8+3VXsMDD5 zn>1O6zXl7Juqr*?SOk7y2X};s0*a<E@E7q~tSt~E&Bzq)_LPQ*lWps(poI%`Or~e| zr<<TEU?9u_OC?J!l3Spe6L@10$IJ!-V{(vRwU^1&OGuV5R!PP~S-?X`IIuJ^DhuyZ z5G0+l-=Q4;a88^l-6vBAOY${4ae-V{mMppDZSgk*X7d?SeLi-34|;d^yrY9**Fa`K z-f$Ue6=0Tl)2Us+Tu4N$yscd<k;`6#3rimFKi+xhEk<FyblLJj@BW_m)6S3E-jRwT zevqU`Ns)_qthWPtfF-g_1S2ts6j0%P4UW2ncY{@&CZJuy@Ghr3n~aq~m)YF)!m-w( zI0UV_?{NI|hu-7fA}n+az;5qg9qtyWZZBa%#<#ZbSpZ#2Cv15m8N6N;g<}Zn{aYb) zOTqElohA2s(51?dk5Gd1rbGSeP-Vd=O;o3(uR*Hln>cO2l$W04%kY5`io)1@43?%0 z6KOVR>wQIpmK|2OdVeM13f2+!#}ks#DLE~w34qrylQ@zBe&FpT8nb*B$6{60?4xJf zGZ@V(yv~*@{KBrYj(r#1bDq~Zk5hRF=kdJ3`SU{&%~mR$%QWCzW2x!uIANjL9+<D# z?p(Yhxr?1nV}sGy7xfLCkf+=UlT3evQp02-3xnAXHkN+PzD^oo=ugn1Icxa=W<S3S z6XM3UV|$3MfrP!qAfBq@vRe+LYwmT2F-GgO-DK3-blQ0t5)q!V0usiMSFn9X;lRe> zm&fqn38Qbrl7DCZI&_y_hwl7!=)P6$W1Y?(PJ284`h^FGS?NSXT`>+V4gP1#YeA}2 z7gL2FW?>X&p)&TW{qBYB2asI8Q@RT9ZOE656_V}$)vt=%{RZ2(K_1(*!K$pm8WcXx E|B(xmTmS$7 diff --git a/brain_observatory/behavior/data_files/__pycache__/max_projection_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/max_projection_file.cpython-37.pyc deleted file mode 100644 index 3477f1c01ccfc5fed3e0f5a294632c27d88666c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYL@zY4-Y48~7z5Wxp=&<<`Q;-6Jq#O<KudeNS3FUMW2c69YMoO~r$AHmJZR1iP- zehD8*$fDQl3RZEuKvSO$erj<uV}~|Fi;d{F)_38X_>cE>IhNaiK1fJG4;7ri)^ctk zA**2|(N;l{LmLt%xwH;)Wt0r2#DRk(gFW(Yp7VsxBIUu@m=s^Epd?>M3R9>I`A9<v i@y_HJq5{sb^K`(ZG-SWw(AAI5q#%9FaoYU&Vv7$-2t)7y diff --git a/brain_observatory/behavior/data_files/__pycache__/rigid_motion_transform_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/rigid_motion_transform_file.cpython-37.pyc deleted file mode 100644 index b70731204a35a748ba4a9b122286c703ed6c4453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3058 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 S5xiEh@h;jG0+&;DtM1=Kd<7Q( diff --git a/brain_observatory/behavior/data_files/__pycache__/stimulus_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/stimulus_file.cpython-37.pyc deleted file mode 100644 index b0fdee1ea585c3db6f29300db1de7dc10ac31d21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3032 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 diff --git a/brain_observatory/behavior/data_files/__pycache__/sync_file.cpython-37.pyc b/brain_observatory/behavior/data_files/__pycache__/sync_file.cpython-37.pyc deleted file mode 100644 index 63906e75b4282408e468afc8960a2bad7d91f789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3081 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 diff --git a/brain_observatory/behavior/data_objects/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 5aa4cea3f7fa0746a4422654588462117a5abcc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 977 zcmb_b&2H2%5O(&z+ifNK7JFze+$w}<K}bkdD|O*wS+XXv)it%9;BglA$Sd@~JMc=q za^e*@G0vuRQ6;2Bbrk2Dar}MG%$Ku+gDInNc>4{G`;7fa!TsnFcttm!)1;WnEOQyp zvV?oK=lZ<g;=UcYAs@DQU`KAu$1NV(iQD6QEgspa+vod)#|t)}{3J#;&+evgAi`zw zQJ0aTXJ>i|D^rDqMl_Xwrzm-NSufYPojF=W;~LxGd*d`la5d6<v#Z8?<F6OB)@k2S z7oV1&8iOVh-^F~!--5N;qq@n90LIIzKpj>PtFX?CPCi$3Dq2a$!n^>~x!g)gD9VtE z!{yFoPDe;of3)P|3~s(&8WpG|jH~}wsZ#Bv{!;5ewes;nZL_i^HAqtB&QjEht_L}G zZIS=Zg<(=U-&rYa`YSOtIR7gOqeOZ2M3nI0m@p>d?<`E{(N4d<zCIBj$TBEk35v|| z8T?wDdMGQe;JMI#g`%p-VkOOOm4!8hAP4H>8p<2E*0i@Xp?G9Mac@Gg<v0{l8gHVM adA+`yyl|CjtbUo%sWAP&vuxIDuk1J3s8GoO diff --git a/brain_observatory/behavior/data_objects/__pycache__/licks.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/licks.cpython-37.pyc deleted file mode 100644 index 7ebb656f59958ef326eb6c2c1b3945b1d15ab1df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4047 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 diff --git a/brain_observatory/behavior/data_objects/__pycache__/motion_correction.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/motion_correction.cpython-37.pyc deleted file mode 100644 index 66fe38a1f11db71ad3e2eeb928182149e013e730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2440 zcmbVOOOG2x5T5RNcszb&vsscg0b*VUBjF`*TOkBl1Oz1;DG7=+vedMv+q<)whtoaY zU9Y?cltqz{@(*%I#EHK&S5Eu|PE@rY`*1+ONK>w^>aMQ->gyWcYBT~1p7htB_?@a{ z{f>kAQvu~mc=Z5;umnl0kiaiZXljRc>VytKyPdeH7kWl_l1l1_zR}&Jng(Hz*20<@ zdr3WQgbiYSYl({RPb}d}Uk0)!8&AEkDaZq>Q~d+>vbH<4tZYBJ^-Y|}GI$uL@_|&b z)E!c;-;Z}<aW^mGJbS2krU$u7aUS@BuX(}m_4i~{K!6sG&~smM!TX84ofT3IcqGfU z?SuZ36#}6Bk&26Rvm?xC{x~y5{|JgSc!X4t(3Z}gE9eXI%o-433+JRBda@#Yz{h<- zg(oT}&QlUr!4`nc2U}GH##RFi0%NI(`iT?PpIMF-HUN!AxiUTJR<0DB3eJ4Ao|?0_ zqlKxRkBZ@_fc!5{eeBd1(OJUyi^<#Y>NOCB_0-xUf=q~@&nXnhh7FygCqaAmY!12N zX?rQ;Vgk<F%9Bx=>CJOSbR2HB2T9J0CCB)pLm>m9UQWhSS-Sf?8A&97t4BkrN}sVf ziwnkZik8V>I-itP#-fC4&Dd|&pTBHv_I}V(=^o$ZqTA;OJRA4E%6OD#f`8VN*}m@O zLz(FaWIo&->)xHX-_vm+KOXYvG2fA}Hc4QHc)Zb9JkD6&hlu;U$klkGFL(KVoU081 ztO5^`Om8fK(;bdg6V7u5VK&%Tj#_t3#ZGJ3J#(b%3i-@tfr>e!*#N2UDOrqEwkRSN z58o|}z5-%G_N-$%u_nO5=XihUc8AOXaxm47UD{Ei6(&?tF;JI5nTl03H3uqBnK=}0 z`4-r;A-Us`qZ><^pPvmSsbmLzT&R#!i$q-*U=)++cc5URg0wJM`VtuTitJIi2G-BC z1<8ZOK5G%q3wmr9_Dg31_G1SQ=m^&w(AzFuQ@*lge&)!XQl1_Dy=x2^lf#mX=P0>l zFjRRYwT`o$a&<=*Q!L_nuTXD5_9Y#PvTFJXTnX86)m5;n7P{*5G{h*8;ngKZn0V?M z&c6V?Z@>in-Up{f)>t&K9nvHYS+fK38sf}XEP(c45xxd!0m^HEwp-So4S+fVpoBi< z!q}VG*p;3;#}3$iW3QgGyHJ?Q#Cb&smZ&mujfN}>w$+=kS7?jDAoPH=0HC@K7WFoo zy<vPP6WwuC4Q&R&pnxu}3!V;j>5Sk)E2Nrw2SmqLH&Abb2(PF-W=iT|o@vS8{z2PU zAEMhvQ3p|arbp;-l?!p9Tpdqc!g*L4g}8<*)B2p*o)$MtT6}u39A1$#D8@}#q}w1Y z5<nrEloARWCBA*C1tg$H*OqR_G(x9|O$)mjV`adAp-2tT>x?}a@nq(yFedVdG4(F& zrQSn<94Kq1tEIBo&4t2Cq}EYjGf^L)_y|PVn03EMCJDq?Pz#8SjX~k%R`5l)aAbOg zPk~ld3g=mIC|PY7Z|4$Ji$jalCXLV?jsb(|W(aur{k$i3mwIA%-V?iv_MyA~(9X<Z z!cYEnz*&=3*i6FP|8*IB1GMa_*|#6QA+wLaR(M|&{<-<TK@Vns5zYqnF(~4FT8gP= bx~%{ClmuT8m|?EEPgZE%u9FqJ?l#F^|GbyQ diff --git a/brain_observatory/behavior/data_objects/__pycache__/projections.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/projections.cpython-37.pyc deleted file mode 100644 index 85dc2ceee54b2786e3d79829c3de102192448c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5111 zcmbVQOOG4J5uP_6%jHu0&@&Gvupu$AD8~*GK#>i}vYg0}C`ao+z+jQVaJsoW(md$y z;jXyh9s(^OUxZw9&_O~@0rHCm@F}PKg`DzL51+e~BAdYUboW$McU65=UCqx{SF0L+ z@jw3R|9MN({!N3)uZ+%3Jo4{on8x%-i*?t~sc%GPY`K=|n~@zmuA}-^REo=PIj*>s zxawBboE@#iHMgevPP7`=-Fm#{uBmY;YQ$&UGx55+uEynPBi?j3RlgE##b@2Ky7qgG zRoTk1##Xq)tGvuBy!Nc*o@2Fbt+o0e>`rUxxgEy-E=Q--dGy&AVMN{P=YHlt=sxB_ z)-v<0FJ+oM<UaGe5x<*cT=e{a=bN2_?&;aBdtoe3O+zM;KN4ZKAf#pF<-4^0t$vu> zs)wn{F3&u*t-RqgR&>2A^^$`wB&~my%4}C~`Nshl!~5aWFu`m?`aSN+q0D&f_5Exw zAO$Bsd)$%#LWgUv&NSEHCO4V>(s-`*bY?K~xaL~i#+>z1XEt+=t!KLHOlL~0tY%8e zlvTL1^3qf$Cb|{O)-YFlX|PpRSCp%~hB=y9V~u0Wt%GI_G-oig&NdWHgP-B+d;_a) zLfRHPt7bQ!YnJA2!BOY(m9Ioft_aga!aDWXf9mz8Q+eIr-<=x==2%sFTX^U#n`koa znf6#``Up6D0X&Y-^Nf*!)?^x%GCS_dOfaowC4S6vd*6=+yk+IK9Q3)!%bph|Vdi=H zns;I|Yu@5+03S>8s3#iOfH;E&uBv!m5cyJi-aobf9^byc^C!uL-0}B(*6#WTelpy- zmH0uLF#qEnp6tt=w9gY6piTRGL%DM=?C!`g<5&BB@C4`qZxn%oJ-OBuewcV^7ZUgV zEEU6RUB2h<hpD*60BU?8Q_5>|dbayRfgslCkq#P7Z|IJGxH)I{_C#fD-w`|;h$PU7 z6hC^?a~qH1A8C)toO-9Fi?f)->pWiK;<UL$Ju(SRNdt{$9A2DXZ_%#rw$?d_dBa*{ z`Jdofy4ER|Z74H){3*O0#ymkZvb+=_vOU%nKZ2Yo%2qI#qU;!h=h}0<XD|fRarwv` zj}THAStIkAc4Ut%w9d#L+04G6G3SYK0S03w^vf5tqY})gk4htlRbCiJ<tbhD1YJeZ zRmODH%ovqN$agOcn7-Btuod+q<5CE0;E^AoVfriWTm7|uq<u>ZQ84I7`bcNy1?`oQ znXgs<2Eqe^td4&k+|}li-}aq*cW!^Z^b=7ZJn6M15D0vFEEGT;(AXS})Q27tEyY&z z)^?Nnl(0T{o2aa<$bCud$x_NM9zM9=Jn1>vO!-pkFCX0PjHv@2MV{ol<Y}MMj3)*O z7y~JmvOWMKzO_%T1(Y;D!FuhGE#*^79?)V>lJp?)NO7f46B5Z>ewO*c9-R<lQMAhU z5awmWejzbix`ASu3?i{lTJXeX6hD?;%KYdLcOKp;6b}YMz*Z1)IlH`+_*UohlN!<9 zh~ojJu-mZ0_MF8Z4wAPD8oM7ZyHW_a??1&+tWM0!Zw5|5duyK)3hC%hkT!?2JX7$u z-l&4|B{uz+qu(v1K{m9%p;I_7Pf(0w!s(?V_OskU<_GL^+wb?Ip{OJHT88*3Ub%_m z8+}Si;>Xme+(>CLuX}X-PsGXhF(;{}(i&C0rmyRVS7-Z|?Vd<uk1|vHMwAAABtLC0 z@=p^1rD)1jDiKgVKAi}dsj`RFIs9&^x<$k{Wzfd<(`Z1kvXt-#grW?5#GDK$7O;RS ze*nc#;DRE~`bfpT7>=u<w}X^I@GWlpnocp9i4gUjA$|s1xaA(tg1t0B`KLVe2Is6P z<MzX+92p}#<k!I~$*P)D)eqb6;+Yw<Yf&z98!95^04>N>qKO8(pjTd<V|q`K{~t_) zaaM7dt`!0tK$b$w1X^N^R#?f+Ad&?L6&wk0;xaYwQF8@Nes1wNo}yDNlAl{VKxbd+ z)K$n{u%<$JWeVJ%gGdtmHM71|uQ<A6UPSp(HaF4Yty}ux)>6ZwKr5jnCVh%SSrrlx zL=K^f_ck6$3S>CV=tu^@%_BpNtntXqbd-Q5vlaB6j#A0B73Nx|XoFj<qsg5(WrK+4 ztA3GA3Lq{R+7MI@6n3@5FQ~8hr>;0r0wHTq_(F$m(8?Mb%^;P>YA;k^6VhO!CB3Iw zlCMZFDhf!`7p6WLL+fHZKGBtiW7XVh5olB!PWp7viVq<VG_)mE!wFSf8ATzdlu{XM zmbRSYezF4wNtsTA-z?=lw8r83ya&fu8QgRjLeLYuFBTnG0zWxXIq)Vr<UZ6!2HvQa zj?AK5K}Chi3GTC)g<8p0BXc}*;8+{g(ZsRt#u5;_m#5yGoDOq$iE*wWfVt=8K;8Si zkNVy$8ofb0j!_jTC(zKs&I>e@3N(C76ThT}Dlx?}i_??fC_>~hE}uORO9G*0l#MdX zIfs$cp+OvQT@&QR3aVh8pa#{PMn%3d?XS_vv{yh4>OmtjUYRf^Onpfi{F1h7Fyl2v zjPckSQS^XnWKdmrI4g~=_kH2V(=u-1K%ly=nWasIvgwyG$IOh=FH|_H=_X~@W|%Yw z@$};^c8mWO{&q7r;utC14CCFFo!fCA9oGqCflIomfF`ft{uBBUWVkDgPX`NT`3(q9 z*j$juGCWfKzfq<Ww~lA=ZnBt0TW9G)NI`=OVb$}BG=YB2^S&AQQSn8PKy}T^%YA{H zoXCbV*XJwhLKyRGFJ;gx$;2wrU!{gTCVoZDM`&`3Vn&eX@|vW2HJGsBM9b}7l=_*{ zBVQfgGgW=-%~Zt^cY(yITNoVz8+aro|FW@Z8+yYm9z$QhhNs-9qFps~1?5ibyjw+e z(~r_D3cG@EC4P&>wfjS4GPPaz!^wrTed<Emo?J-V^A}P<;qKo3zHGQJOO9%!_;Uu= z^6|ejQcz|T1av{k<cCT=82@84FPVxl_v*Xsw8*V~KUAPp5OA-&g%Rd!<MB{f;Ye0z z2_;~6Ys#Y(O#G-#LJ1=7`=`GJso-sOTO~nZ7ILYIPvyTE42qsQjmtL*)P72phulO{ S(`!ae-?VCGLvNr*@BaZFausR- diff --git a/brain_observatory/behavior/data_objects/__pycache__/rewards.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/rewards.cpython-37.pyc deleted file mode 100644 index 09d09f20f0f4e94a8608917e5621e98b50e8ae4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2858 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 QgKW$~y2@6q&{?H_0|b=hg#Z8m diff --git a/brain_observatory/behavior/data_objects/__pycache__/task_parameters.cpython-37.pyc b/brain_observatory/behavior/data_objects/__pycache__/task_parameters.cpython-37.pyc deleted file mode 100644 index 9c166f109c226b3c09e280eba6726856590570d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7521 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 XWH6&;5#%7G(X%>QdLe<okyrl<c6cJ| diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 90539147b37184f188ec62eb38754f2921aa9296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmYL@I|>3Z5QZaIh~PmiG=-gr_-MsO>;hr38Qi#QvSi}QmNs6*$}8D=1UoBd3-O2l zn_*teYB1;v*6DtQHojW?)Zt{orY^&Zofvku4-wn)AD`QLs`iAD6y#vX1}@+mwe*k$ zZ(*X)*Q7#)o-$^r@`lvL8AUGPsDiA31M+TJ@`Np<iQv2rhA-BTLTseL9BLP$w2**1 eN6ZpQ1B6m*=UvizTs6<$>=f*|#CiMQn=QT}OhMcL diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/_data_object_abc.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/_data_object_abc.cpython-37.pyc deleted file mode 100644 index 36d3cbc91f03dd965b68862d3fefe61e6c9ba7c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5082 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 diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/readable_interfaces.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/readable_interfaces.cpython-37.pyc deleted file mode 100644 index 2f47e6482dc570ac2e8dc0d5d52bd4c545c314f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4340 zcmdUy%Wm676oyIaE=#^8X`8mLr#q`i<e*s;2#O%K+XN0AC5T!S5LD1Z&e)>Oi#kKe zm3FQ30^MiVRUe>>zCs^?%XZaQ=&I)oNnI?(k+X6Ma5Op`&gGo%{4?CGR?8Y(-mgE= zFDjb$H~vYlEL0xBEnh>yG^V>+3x5q)_l%aIV?E<$ylgA0>RC7E<y(1Od!n%%%fHfC zo@*zC^GvG<mI5n+rI=VsU@5UOSjvf|43;HU0ZS#ZEP<uUmcg=|SSnyyVXI(SO)OQW zH?`W@KQKeBQPZPB<GbC*j?1B1X@-v1b9*xRU;c`Q^tpAy?a;>N>6L@ZBe>;fP;jlK zGp%JXy_Mlvo;%6&0y9|VwZXD1_bPj?pX;q6%fq0B=+;vi_%AtS)N=X0A98U-Z9c3$ zqvBK&N*D}C0yQF`l8B@wITC?KPT*aEF0L6-i8*#?3f>h_UhuFdeA|F0c;T-O_a595 zV-;%W+RwULwlVzcMbPcJG~_rOt`FB5_fN^w=JN)z1FuU%2PQ~x5VGYur`#QoE)|k9 zVhze9xu`gnc87bkRvy`2s>#UF|GV)u`agE*gOLrp+wqCx%aHn^1CwKFYO(9dS;w(E zqyzpq^r^=W3H2E{>{GV~^{xoIT!aoE4~bE|(FnqQuj_J;gO}OYLIeWbma$za^5B!- zG=Z-9_m{l~?QbO)vQ0ab)h&8P{Xu)jr*_~odcV#6zHGw?zO<nXx}AY+A2?Q9Iw8N? zrS>U3=J2lTLJM}fZ3*i5W?(^&eHsR0ux;@U?K^?k#?ZnOgh_5&RPyaKx~7wYAnV;h zRKj4J80;mCpbG2KaC0s>^-<eKtrQha6CGrlQQ0)Tfc0FgS4{JV9(9u^1=D1K4dx}= zrBZr4>;x>zP|J>%sU<@}?JzNBG5i8@Joc4xSX|)51ZF`AXIO-ysAqKpZe^XHEL+fQ zHd$1v=o6_@NK@s&@#MRv%EA7#W}GUzD8RTjCInt-ay)_hY;ydWCP$JR34kj5C;|!z z>r+>yDTZ*A8#vyzO9Fv`sTl%;6lF14FN82b%>_q)g#J*dRfd~$Js+cnZ5y?ss6u<O zjKvBTt5~dIv5v(JEZ)ZglWd|;;M@Y+ZMdhwLF;^QuB@^*8)w!mIa>>fEbIoU#uofD z>j=~_CP+C4=9m(+hby=!uk=2Eb{RyZJAe@gcAMyYeXN}?sDShZ#>QHf$S3@a)H0dX zw0wTk0TCZ}O19EnjRZ#kb9Vr5DQqPVRl|v4uZLt$(kc*-3)n<OrFF25JLq{8j+Nm? zV@{}JRG}q^;v%GCU*f~*Ar-g^*AL(UA~=mJTIb_>MV-5yZo;#~nhO!zr@{$(GCn&X z1M&{>gAn%dJ{RK+oB!y@(D9FB6~kkPd<TX6{SvrCU=VjX#n+hXYlzo-)3L@dN6QK? zwM(NDcQE1#vhr~2jUkFj8@;rkGJZTg{1`P<;fFY|+ER^VOGWE^)DX+rE%lP~=f>m- zcNVzM7Xl72Qm14U=Tt1Ksnta9T|qL3f4l{$wBzfK)h7^+i>kG*uu9jUobv)BoS=2D zIq}Ic6Ob6Msh1a&v<yyVb9z2w&Nkpd181Q)OOI}7ozK}-C9OH|?Z<$@%z}pX#R!A< zC+ND;8SZTgCDXqDrwWDhR~VTXz*M2$=<x)h^rZzA>Qm@@g5)td1Ri{k15c5I*4nZ< z`?YfFtRZk>t$O-lRG;}Us;3`D^^tl?fz-C{E&NjQHKimd%Ixg!sjm-#CrN?(vq0q( ph_xVCsAY@`CHuuM;}4~W_=O<x^jb73Mn$h=)>qfp)^9?&@*jZ2GB^ML diff --git a/brain_observatory/behavior/data_objects/base/__pycache__/writable_interfaces.cpython-37.pyc b/brain_observatory/behavior/data_objects/base/__pycache__/writable_interfaces.cpython-37.pyc deleted file mode 100644 index 5e924d9d3b5da99cdbb5ea7e11485f7676361079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1739 zcmbVMPj3`A6!*-|{%J@kgcea%NIq1EmCEj+w<tm+DIie0RL}}(wbJlr?Cnf4GahVj zR-0QJz5sV_ocKy}<-}Lu)b~7_*`RFIf_MFFKfihJ+3)xB{?^t8!<N7O3#I{M?`d(? zaLw*vH@heV6JEx~H2RsB`(xi@51D9*;1v^rWQVQO);K^-TXay<S!&wCd&c_R59oo7 z`d-x?J>P$jW-=zlS!)9QfEvlho?v5Nc;l7~4%@OL{5PHp6r6hFu4tpfPWA0$ql)J` zwGd_UQDLQ?LM%^i{R;ZXaNq(ga1|ZO*m5v@zO>|4aZCX->1b(Zx`@4H7Bo^nz;5VL zEIVa?doF(;zQe7D>9H(0;6Kw6#DbTqoMm98;6G!uCob5Jy!Oj&BDqL0x=p}t@MW7P z=wfE@lX+?rXY^vKRURJVac=it@Hhiwa%mHVCTf-mUTP&~v2?Zua@qJ=1>I<LPu-zR zv%XWeW=$FGG%HH#cg*wgvnL~dJ1y#jr%LC2m-d<rRzU}i8!GIzk+P5SGLyN)Vu<@% zD~;;F$ZYzK=`LRA$JYltlRu2qW&#O_K?HLs7L&aKVpRzEX(EebGf|~1OpH>M$-+#2 zNu!BLt-Mo0d<1_={5H$bLL3bv4QUao2t6KyReCXuWCF*j(nG2~?ojp3FajfoX8;J( zGpv|Fxv08UxvTF{)qND~(#g%W&>Ac)NBv&a3&R2{5r)-980J`>jOLqR_;Lo>a;F=H zLdB?VK@?Y)Au?7&Z0pii0Tn`jh4I|goD-CZZlUO4HzayqfIp{OPn%n4bdffWIQ|9V zd^4IyU(Or9>K5~8iVW7o+SpwgPH6mh_DnyUJ;<_hfkfpLYRTgUZ^S5$2y%S|$eQyY zgcO4nBYp#orNZ~&0x6Ihjmzbs_zt}e^guN`#F4#%)Su+i?Ee?z{-3{^ZVA3rbS{D~ zr)R;D{@e-O;hNBt8op<#{e+6TjkW0enxLb%Nf7yJLEx%7h-5tP4V>4IzjE^ZI#3Ye z(GCHx={?k!NNkeWB5|3-*CeR;`WlH<BsX(dzKR>yv7g5>>G~b#V%#nl7{xiMT6_Bk Z4(OUJ*14;CyEWnN65MK^{$^|Y%0CMRypjL_ diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index c7524c9416663ab193eebc76ead558c451bdc92e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmYL@F>XRJ42FZmP$6*;2FSoxA=J{f>VnuJMNVS%rQ{`193FZjH{cFTT&XKZVCz)B z0r5-zY}x)TZ>H0UV6~SM4EZ+Tp%E8v95iM)u@$q?*Hx6E{lwq-<5lel3n^&8EesqX z_Ub)?P0_(pVeCkyjFBue<)$a~>5U>^ah}2M;Tzc-0&lpzGzEOr$?(MvYAU@n*g)q~ pkq#>G<OgjfX)y#%8Le;GD7E&{SFIPh|9x4t$sGc&hfnVu;ve;QMiBr2 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/cell_specimens.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/cell_specimens.cpython-37.pyc deleted file mode 100644 index fcdd678e1c9022c7020be6310a6a992b733a2680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17680 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 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/events.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/events.cpython-37.pyc deleted file mode 100644 index 125cd3958c2f54b759e946df78f27bf0f61f7e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4351 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 K36a?{yY&AS0)@x` diff --git a/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/rois_mixin.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/__pycache__/rois_mixin.cpython-37.pyc deleted file mode 100644 index 36ede10d36d8dae3e129969df0a4c26146defba5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2518 zcma)8&u<(x6t-t(XD6GMmb68xfHD_;ENV9gE(k?cN=s1%1eCU_GzuDd$KK6sW@onc zB+W(}2}q=tLoZwbDG?|Bi5~bf=E{kGffL{JZYD_^Rg7e>{cJzK_kHg@@8{>ww-~<R zA3uujImZ5`$<gOxu#9FtMkkr%8H=XBJaX*Zjl3_Jbfmk_q`T)t4ax7bw)YSAvz3JU zqtC-&8O?OiDHd_bBIhA=My~P(4dqK`iOE1U2Z8i{<FX<B{YEq=o6t8`&8-%x`6k^? z^PT&*!XXX9UZFz~CPkL1q)dxEEPA2Fw$PM?Rx%U@%Tko0r^QgULVO=};w_PFst~(Q zthFnDDu2-CRTDbmRGP$vq4YJ;XiUxgh3+YP%AYztS90m>2fOYwXTS!0;Ou&{k-OWl zBkyN6@ua&E=uf4$>tWp3aP=y!9W)NvfiD|}{FxIoD``&niCJ*S26NJv&F6gApZEuJ zhfM!4arYP}ouuc*v7U){d~(1KS`({xz+#TQ-iD)J$eEQfxB{YqxD9u{)lzA5j8Q0( zq|h?W`(asxX+GL42~k3$WAP&lAEj9qip&&YFU?A&PaMagq{vGFa*8|~Pub|FTPhE` zc6M6RL!*eq>tU)wwVh;}_U1GPMX9uhTlKBq2_g~KnObzC{%X<8*m_R(-nCXPY6Z_= z?JNLbYPqgpz{^LpNR5iqUW^434^v|R$0>!6))kIwg2-+r+ttWMVA><CT7?3Q6aYk$ zoW}B$w!A2hHXX-my<?>))oVSrY;=oq{fG^b1G<^7wL-FWU2Lh)0K{+#1kwYR)i=Gw zb}hem(j}WbXFCODqO^XW<<a$8AMUh}OrZ}ETHzCls4hV2=hMW63nF|XbWV|Yw3-$D zzLK5ekXR+AUJK6ZW?rU4^@Y|b72xJfZbL%sn6*<lgz%-d98}hT*1`n!z<v(;2HGVw zvyV>l5_!GH2mDu5$lu*v_KfRmr88lB{3l+z2i}Aoa!$G582Hka-gBx2jqST6xx>C+ z+T|0}L1gdB<7JXf_*FJ&K4bKY{I6vP!Bj>yfOajh$IFjUr;+FW%FeZWHjihCX(%i$ z>NA=u-q9T9qVjoSJ2h1!&86B#&GpLhNL4``=LniOuFjo=vkGSXn98G(rs^2^QWv9K zR1Im*`ohp}+o{~4=~p~yyVZq4r~Nb+S#0;1>dKj{RGv{;?@#vcFSkEiL!r=SO{@#q z>53;JAFtiY1ssy%lQorZnYCi1a+9DhM(bm<_I27_Gij-Aj6|{_`U+?9NaRLtEOv2Q z9v59`+!A;v#*1Br%t#BpNaSK=fY-z<CMwHfGg1lSCpU|;Vt{9-Ga6U#uOntMH7yZP zXJaM?pcut<jC@Fua2Xxr3y#MF-f}N`=bV5$&Sk#y)#}lU)|uAP7&_xw=605{B0-J4 z+4)~Lt!R3qqIqjHOhuWUajJbRwC625c2ngMoBBNM_ooa*^BRSaYzObr-0`rf)l}xC z2Bf+GUcW*5nwp|q)03_jsCx@tbg5?6p0Z){ijd+VYM`>_LK8M^SHD@Sv0ATSS}nYa z3I3cg^8q^c_QlIB-U6Tj_W)<h3EVfF1t)NPG@32&z}b1{bpWrl`Ga;#&(U42I35;q z6MQ1Z<M{EW$Yv4WjAL0O5IZ9o&D}wK+@)8jx)6gb&@HIw8(PmtQ4`^)wHWKGP-=ZU z(UDV{N(2#Qh?EvWqUBmy+t>4uM2&oNI2!BsXzY&=4#MbnF|nIYC?njog(+B?T7Hu< L*s2WxNZ|elmgdP) diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index af9d047f347219d25e0d760f3aa09fc5580270ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmYL@v1$V`42FG>Ar$UGGBh5tl@Quy4OvPygOP2~bK|p(<zBckPtga+lvnE7N9fk6 zx*_BTeG-y>q1U#35Ul=khAIC{xT)ddnS*8wC*H)O*<VGO+IReYZJ*SEu#kcd+|s}a z;;3FC*c2VC6vly6${5KqQ|?AmJ8u;EijNuW5#Eu#A@GJfN>ji`oeW<bpr$fPgB=V$ u73rV?Pd?CAk`_bIl+pU0jj|T7NK$JbebsuI$M5;NPwq3|W_tLSL;M2)NJz;5 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/corrected_fluorescence_traces.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/corrected_fluorescence_traces.cpython-37.pyc deleted file mode 100644 index 6813fcf849a1f7036d28646633cc72fd984b2116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3024 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 diff --git a/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/dff_traces.cpython-37.pyc b/brain_observatory/behavior/data_objects/cell_specimens/traces/__pycache__/dff_traces.cpython-37.pyc deleted file mode 100644 index 9eaa61c9ac2a92bd20cb2519f635ae5c838513d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3485 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 diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 0d127419c0f2976f76d3563f5fe57ee9ccc9de37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmYL@zX}2|490ulAi_O}gLZHe5&x{>B5s9}UV~TfY>&2{bo2#$2`694)kko1GB=1H z<d=}-3t8p)fRRr3D|GqQ;irs>1x4r)G~2OZwtX<)wg33s)>E+$=!1X~^jN_KY!XWg zg|iwa0&N?FYtV**=$bMGu`x;n6LHi)QNaPpTi3LqE3P~kE1jZ?Ekx%NS6D)8oaY)M l(Bz0k3>*{6=*e#EflFzuiBgW6^z6@0PM>R>cYnSq*cW1FMLqxk diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/eye_tracking_table.cpython-37.pyc b/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/eye_tracking_table.cpython-37.pyc deleted file mode 100644 index 29ff8601b7c79247c73f337b6404e9a8a1c2e47f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5486 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 diff --git a/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/rig_geometry.cpython-37.pyc b/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/rig_geometry.cpython-37.pyc deleted file mode 100644 index 76085e3e4a9dfc2c122957f9833ccd5a1d38d0b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9016 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 Kp|{!#>i+?`BIE}E diff --git a/brain_observatory/behavior/data_objects/metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 1ed241ec6cea4010cdda0a6f4b10c8d48405d95f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYL@I|>3Z5Qej0A;KQSLQ~j@h>uom#4Zpfo579lCQA}mwzTycR$j^0BiLCvDa3*Q zo8g}av&!=Uqp0s!NcolUi;Ri|Df9@M?btBeKA2DTAD`QLD)s?=5Kw|1E4YB|#L`0H ztcHm|+Xmqpw4ornrtE^)7$t&<IBK9c!2xNvs%S!=xbk4Ebc!yv5S{P1!V+5JJl7C` hI!7#G;59}_2A9%U6QvwC-LpTdojzAMPd~m%><c}QLxunV diff --git a/brain_observatory/behavior/data_objects/metadata/__pycache__/behavior_ophys_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/__pycache__/behavior_ophys_metadata.cpython-37.pyc deleted file mode 100644 index 83808a0861e79e1d27b135ef5681068b8cc23e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4910 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 L8fL?8;l%t0!u~+r diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b9516c7d7b03b97016390e9c9577ed26cd3b61f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmYLDJqyAx5RKp<LVt*Zc5o9BKUQ%Ow?McwhmCEMlEg|!|A(8Cf63LK;O69Ius(S2 zj`!}4TPMko5vuzYVtqyVp-0V<==&s!?b)cedoUO6zkF_+89#V*o<k05BH;q2<tqc3 zH43I2P2;(((fEwi)_LpsR!i=6z;O*(0Y{|WvZM)Bq|$*l!b-Z>K(MY&CFam*>rw>) kC^=ykd|F|EXmqjY93iyPL5NA+J_qy4s&k2p`1PB}zJSw8w*UYD diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_metadata.cpython-37.pyc deleted file mode 100644 index 453131db697ee323ecd2ad297e65918fc4b5c44b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14599 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 NdSkwE`#`!@`){96LQwz! diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_id.cpython-37.pyc deleted file mode 100644 index bcb1188958aa4b8ea2e1af09d853d081a1647fc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2625 zcmbVO-ESL35Z~Q9+h^zOIA1_p5Ed#R3)MmD8()Hk6jG&5Nn1raSvsw6H}$3W;qIQ3 zI!Yx_B2_}lUqE=`0r4;0D^L9wcw%P#kvIkkvC{4B?aa;nX684ucduHl5E$`qKk=GF z$e;Ky8SqTLhD-kplOTddB&HsvxMmTHEzgQ=&o<9iREUdS(X8#L6g!?1m%Vaa@hWDo z5G};6=bCjfs>U_1X4a)>F|K=cO5~DoE~qGr%9-sge@DcEaL<TvWnGq~BP-H9EqN=V z`j|9pZvYQz(!A8(yLUf~WRvB^fCoJ(a%X$@=>{%Q+~d0UTn?L7zV<+;$*$yrcO$u# zWK!+(K;~=PVXWu3SKCM3xm_@5tn8^Uo3R3d<wvQ`o++t+7)UjI7`_Y>*sXlaGrrS3 zkU<7dD`~$s)V_S#mnw{9lKG(sEc65h-WgmQaA}NtMo!o%1!rlyNmT)MzzZvgbk0Oq zx$yi4QHyZ<>-UY%I#0D!y2E>1w7UF=C&SJ+2@ldl@VgzE9O_Qmmx&HwHXu6NVYj2h zOy249;5mOL;oT?#4e@-vt9Y3BX%{RW@+?)u^{(vk!!T9r0^9)!`lHulnL#u&J{9}( zJ6dWTrU^LO>JRgkeU-+31QGX5vV2HQ9X!zJIH76@<^Y$IQ5-MykFb!$qk?!$T7q8C z*JPgxCag2pvt>aRfsytF69rK`vrnm4f}Iku$q{8>lLH!MSrHYna84!g>YPaz>=04C zutZHP;ydtG74&MbTL()^V%b<)d`)cP)gcip`O>{{Bp#3a+7g)7NqGEAZv*2IfX2HG z7p7OQ!jzFyazF(=0rck#D*!B8ZM6b2V6mO>SmuR89u1Jx1w8<=<c{x$NtpRQYG@hl zkJM>i_WdB@TKm4Cg2HI3w_$n*u5nn8Z_c4^U9nddVUYPs_Ela~G8?F520Q{coUFm( zgaB-M1B(9~nK^+?4IG1@$y5~-)lHm`otL=svPu5|)Zr}<jL@;;Tl46qdO&<s4Jb@F z@IEaPY+DdVazH`^!^SbBY7GSNCWhcTgi@CJ2;hB?O~P|y9>7@Z4SoVLT#ETi9Uhy6 z7~<xZX(|e1VoGrY6Jvz~ixrb@;&vMr0F(U!QTx?;Wu4Fia$*Tf*yrq(4H30P!9=sz z=C{GYO5@6Syt%!(@ubn!tx(Je?(gnAY+Uarx{=Bmtvh!b@(}vboMuD!(m^B|P}j1- zld*iv-x(7RcDCBHV)%+~?7*gMjR0KIzVRi<u0u5zuGfeLpNtVyhu6Tv>&9ka?0vtv zyNRDP+Q*g8r_v{oprXzcuo#kV%7}W-zRZGNn#g8h#K&o-^1=)3(3gyzBPjN#4<KpU zbf2nAYxG}9in>sfrR1o)5694m29w%HI^bn!@D?mE^;kZy7^Iy+7nqb$?o3+e#0BP6 zBi=O~)yF0~a?Bbz^C8$$AK`SZ!W>gM0Ol?THBykU3jL=BFi~tSVRONz<NJBV_v2Iy zB3!$^|6;(SvBV0K%=DFf!Sow|+e<}mWA9M!B9ixTLT?p**0gek<)e`Q3PYkkhAFR( zJ60g0XwtRN3vm1fDwz(p3@dDw8l&de%NC={Rt@GlV-(gdqY8D}%~h|^AA-Z?3tq)k zXO^aszQp1!UhcM_ZnZf~y{*ZC*P1)<S`)Umt{!-Buxi;-<6j79$m4$qt&k|HgcBaz z|JU--__yM!<uck^n<6#eOnB7d{m?|$`*bS%k6x$+#Q6zMc-)#WUZIg86y_jzz8G=g aD{Q(Z5iYA!m#tc^<x<zG*)>Q7qkjWnOrw(k diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_uuid.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/behavior_session_uuid.cpython-37.pyc deleted file mode 100644 index 63c141a124d84e84d4f037b22652f8db374d9873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2296 zcmb7GOK&4Z5bo}ou_u0Hm+S)jgb_lJLBc^GaabY5J^-zRvJzp1G_usRr`z#3^YC`J z6WMYOu#xt}jT=E)#A*N1TsiR<I8ikoo3IHIj5RgY-PP6g)vJB4+iekevfsWJizXqz z<6!kPfcXqw^BoXLBuz<#UzXC0MT{cvq)z5WZpFK)mo=hB#d~Qp^CQ3F8|g;YidtDa zYE$whkxl8J5a}ylwN>k>7j-1vBjLs$a0=NCY3V<j*rdos3Vd_-+k0OmsRFjMXOnE2 zPE9>-JrGtr8jMwJLsnkhJsNzigcO5RJ<P4rLlLX;_Srq>mSa3|^>{U7M!+Z%QAr{u zY2+wZdE>@)z<o-eks+0ibWb`_6YSpr4|u0cHe~a}eM+MiVuCpz<~C%jn(L@8{7|xe z>dKDnp19HGGvboy5}@8JuiR53ahMc(PZ<NSA3uKhV7_ffDwyWUq0&aA=?wWNQxzmq z<u(~6N(b907=mA39n=cAS!&?ZX(D4*<H4^BuLG~S3dEA9WK1PpP|1F*q6l_4yLtoG zz>#h)GF5tqBAqH2dS*INy7W0u^2BnE5=N!Nr8q4&IFD0d4CgP%pD*s;=|47Lb6<>v z><z?`$Y=e#xrmEgijVp#KQ#SfqH+@hEheLx>3@|B`X;gJ{fUSV#J+;PX$lhZU}vC3 zlJjB!8V`jn^lWDZbw@(%VFiP4b~0rl@K&ss`T3c%zUfV7x(jG8qf5{?g!*)T>w-Y^ z&cN=PI{)|(60&S)Wv4n{`x*U<?|pd9+dvj{OrC?Ef2GH4!SoHwo;wRxjmUz5?=kD0 z-KcZcw2&?x>y|DeDxH00OBVxLx>dlP(uq@}x8Q)1B~l}XC3yv>wuZXM_&+Sgm>VAm zaXQqcEjoYaBBbXxLa3Yh(E!ovE3kbHb(KyP)Bsixs-)M+F|+hJfE_yk(^-&(vxZsv ztC*}IM%`2ls!(yns$T<5`gJ5#D!Td_@;8y(LUJ9+OL+atY_Jj~40bHSTD0>o(Oe0K zZh2*uO6#ft7q^Fn7W+xQ&%v|k;wA1XMPP(20v%c5{umf2A~GgFLu*(#V+vmgFi>{^ z{4f5oi>nKEz|4o1EucaC0P+xYZ~jv&sGmInWi<=pk%|ujTLh5#Q>_9!5;m9|qyc(A zK=%ZhupniE=_EKx>}ah4Tg3`YQ0LNeKd!8GjD!I(l?PC)MVtt$WTmIKRy4o)%|)s( z?Sk$3yJ3*zp!e)ybwLF0_14F1&%-c~1=v}Uys%5dtDP(N2DQ#>VE|L-tiKb4j&6g0 zOCRA+gdLTecMY@wyca&#y3nDgH$gzZf#gjj7_Mj&z=0H3TJy~8pUW2LY6&<~y#>O{ zZ1Dqci(Op%E8*}mwm)o(oR=-mvqDZ&<U5={nToVtX>u-$m~)LC_e?TlrzzW2lY|l& z6;fk9=^IF}Vd&c^;3T=#Xja*+J8G=b6tt}q9_r>2iesH?OhZ&`5Vp@;dd+2QtHJ1& z$0(!Kdf2V3C>wS*ft;@FioD4Ts--$O>a99$?_8(ttum^IxmR^OQ`sGT@Siu;?O9{l zL=XS(Hn=^E>goDQhuf#V(~ZU|*YIa$>4m=?wB)Kb=zp>d(x()}3}%W?I}Co%8ZLXA F^e_8Ac!~f3 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/date_of_acquisition.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/date_of_acquisition.cpython-37.pyc deleted file mode 100644 index a5a941955082bf932e1c7a12fc937243cf8da450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4289 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 RE&#~!E&Y<&GCR7n^)CVchc5sC diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/equipment.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/equipment.cpython-37.pyc deleted file mode 100644 index b2720cd9bfd78db7137db45eac12d8e7191223dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 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 diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/foraging_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/foraging_id.cpython-37.pyc deleted file mode 100644 index 9c918717dde3b482237f13ea198c440ef20d5ec0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1616 zcmb7EOK;mo5Z>jI6h%pH>IYKv<f{&)1LW2h+B#07!f{$BMgc;=V#QrqRQOPKDJK%- zLtz6s`4_}RTlCbw#A{Fe3q5s)dQ_@&=>j{PotYiZd^5A(v|2uamHz&dcwiIqCmxo| z1?DT*<_Qo<Buz+&Un`-h6<QQ|max<g?bHdK>TD-&S_^BGd`qMw-D@IUWhqD5S5D|j z`kb_De}Ol0(x#>VNEG5(Z>XZ8ZIyf9nLImHLW*9ZI$5D~Uqq_hJC0LxM+~>Ozt2r^ zu9f*=tn}n*{3gyK^t@cof-$GSC=yahLQB$+DSPNh>z2MHeJYu>ubZK(YRZFboLft} zvUY7>(Xb9OUo}AL-7;C1ekE<bB{m6LkVm8RALm+}$Ju#DP8&;pKb8<&qrXt`SVq<& z68r+jguynuKnik2hE&oSmDWv#C-`M2x&}Hx#Lh&jO6Ni(V+BXYj7LhB9_Miu7o4Mo zQAvMpPRlyyQ6h}t{15W?FNdFY&y3QhD+WRaJ@Hy(lkV4<i1JK|hh3Fjm~K8&nTder zqrt><kK<m~#D)4~B%+t%T*2KW0So!^pr=Kg@w^8fFGP{+$w5yI#6_Iz0|`Y04OY<{ zq^f`d7GkC5E6Exn!DylzkYf{psL-L)oh5)B8LVYkmvK~Ztwy?ZwJOFs+klgThePy& zxJm->(G$G|Jb=TZ#OQm#SAseD0FGt7uk(}-q22H}55Su4t_83%XtQ!>nJG8Qm^ja% zq-8CEuH>?(KLigE78Dn@90pQF6aa&zeFp>cGrMFnYe;4c8}7!sv<v#HHM4)Cm-dXz zZ0X$KXt*cSTYrCTJwG}=I()GqLhTxq8@k7*&z^1w(D=XMn+=N}pB$YYZAjjGCy3?# z7yDEHvz6%!=yKN-8p_kA^A=>G*H=X}$TL;i<1xTwpPh9cwH>_;SZM5cy$7UpUg5}A zm)>6+M0W=)jR%DIO}a&WdbdJo*51O2z)9h}^f^y+IZlvoa{g*8l7*(mxy&QZ^?h)t zKSF{XST?GWfhHZ~5H2>G#vhj~&I*n7)F0!qwV16)B?&me4yy>H-a;N5N#lEouc<+` zM{T;xEV>QbqLr>)ul^oBSdLY2XRLx{wSx7r(l{ew=l@=VsW&RnizgLcjm4X4G&Zcp rP7U`~PAhdLl0b~&dFGhUzp2i-YJj}Y=O}-P<5$(lvzqiCYqEa;1E-~) diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/session_type.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/session_type.cpython-37.pyc deleted file mode 100644 index 7c2008438f26cfb70574ab068ec5493e9795f10a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1837 zcmb7F&u<$=6rP#gwKt9(N)##*erS6k7zqc7TZK?*ps1oUQd3mAbu}9AjO&eOcg@T= zk)!kgiBvBA3n&tT6aUg)Iq@%W;=Q#uahnUQwc|H$-ps!5d*965?sQrNp6rhw#qR+j ze_^M78erUl*WQCh5=k}5XiO>EOtZ|3y~_5qp9OJH*}iUM&A6F`aY)J6L<X{PPGmy` zDpbw0AYPNr1JVuuh80Pdmd*ad+jml}z-%A5G@I#}UG`gF3MalD9;(E3S-I6e9^O|% zilJ6_bEnKmB&vLGb<UOH1V2(g{?f30FcgWYBr%gT_LMK#OZuFQsPv?N-i`y+P)&ds zykxQ=o9F%+jYIIQfiDE#nrv0R)^p;Mcpc!Zm+J@0+O)_Y%%|$)EjLz?U80Gsa?#8x zi4g4~iaQ8P*fJyh$Lu_K?G`kSoRLE+=_!@$1w&fl8(!apFa}ikxyV!*90@&B&<*Tt zs!SPjp603J93!mKqeVC^*EmnKu$J>b$v?mC-yD2rm9Yac7P2=K$0DB(zQ{#V<WhV( zQ2CJ^6jPPk1lnRcp4-8_bU3i7Qy))7G7(P|%+(qq<YaGXM4Izr2rC{5SD5+UP>sb= zT9`cv)q@c%pWVxpgVH&1G0ZPKtCaMnbJGTp9b}@Shn{S$Fxy+f*r^HTBhXLTFv`tL zenBddiG1zjQmEhg&M7?v4R3>X;q~D4x5+d1kmMiu#L-F1+@b`3j>!OGy<b4Lzj|l% zC;Euw?0a%bPMK`Jps3$|82}@hjl&vnyq0J_6-IzFunu@SxwBu)w2bn?Ma9qoQx~G( zSi-$3DoXQFVKU)BJ<-S%S%m8Os5hPH2$4k}p8VX6Af)owUjtQDdW&2US#hKyVI$Z| zH=+kHc~od!9H;qHh%%|NQ89{gWu21IM9pm^(?wFpg_+!p9`9C2cAq@ntyf3;0u6Sm zOn0Aj=|WU~>0>p^@EbM%%9z5G?fbJF1g{po5EGvYH|~0+muPF=gaX8u6+`sq4e%|R zYhaa|h@HPuRP<Za1MwN#p&OLZ>y4B5R|Ro(63D-q9}h7Dvk6mQQ3R@@Qp9yIYCSw- zSXtO`tg5ZoFT+}$HDDHZv=~;R<%oPigJ<4`Wy}sX?_l#9q_D~klDPqcwmN`V>orB! zA>B6aU?hg~vc-8;$eBjF&G`>Ap_d~~&SjB++q2G8d!<~jb~j`^E~G(#W*ZyaKIUC$ z%FgltNR-x`UnU9QHZTZjHce>oCaCxhnNK%8=51~;T8;F(tvHy@0ZO%Q+^bK3-jx%e zSBt1uod8$|Tcs6$@}DOyj}3#A#drVjG&t3)>Y3$b0jJ{fwy*{+IAZWtt3X{cu_D9p Vvjy{?QzQc!X|pzM(`&&7{TGLJ25|rY diff --git a/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/stimulus_frame_rate.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/stimulus_frame_rate.cpython-37.pyc deleted file mode 100644 index e06669c56ac7c7bffe9d2aee076bfdfa14f25f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1849 zcmbtVPmA0(6qjUs?D2Xw$!z*3g_clqnM1vW-byKHQc?nC3Q0>r3<%lMbiI-7spQ#Z zmf1tQ3pwpK$gPLcujFe_{R%zxNn_7!*w8=Jpf^uX($jmt_j{U0qfw0DD}VWk{~RFn zyPfpk0F;L?i~u2!zzUU^Vr+GyNa<0}>7Me-fCf(Y)u0S%SVlB*^FR&Dn8r>YsJ$|w z2}WNb5sK&%iAV-AlHo-_M`HLKP2xY`CN#lqIQ{<7lR`;QljluQF4fX>^Y}~N@NcqX znKu*C-kqLi&m<Q-Q}SumNImDdY~R0r=EgEO9rqi)ElOz`UM>t+Z{=L&Y_54JndXhm zZ8ZJocZ!*UA`!&`Q6ez)q%X)T{1VNv@PvPv&_E7k2p9#gh!}|Q(!ano0^1O55!i+z zcDDE>@)6yGy!YBWeLzp_?a$!yvxDAr-$iuaMg&0~m=2HYfs!sb`)dRBV3@lg8gzk< zvA}CA$Q7|=fa|=ewp9oC{0eSsgA=Zn5~hJ!E~IWF#)_(F7_&Q!RP)Vt+zuJb6*q>l z-_W1GKK^v}osrti_z@Rr#!q>*ntf66ysiZQWG1T<GpiS}GC9b4akMhCuZwJEibj64 z;Q0&wgM_n6!4C1_Fw?xKSe=2#6W-K%b(qN`ep1x>P(a0D#g^P0ma>6zH+;Lyww5;_ zlP*?zA95XAKpaZ=?7be?E!OF^ghx9sK)`mOWwX>(-Xq+j``9}C5JUs`0=oDLpOc2H z$*~7W<8yC~)}HXLFyQS^Cs-fA-U+5LRBy|;4X(ZpVXYm{bzQR8Zr2ek=)|7%TQ66} zd7(QB?3~ef$6I~J9&^Ixt=|G+hq3OE@8bw3`0T+=7;Z)Y3<#^!Yz|Op%cm_4mSJ`{ z9Nq?HjgR4pxQEUOWKMu{fP&*%8}$VO6gIr0BgHdUH)cz@v3lCN(eGICt`)Cm(MB#h z2<8J=G_D;<{Kjhb8z+gSvZXj<ZOm9%i>0!9!q|^XuDX?wF;VAW4(6)njpIwZ=ZFrG zAJszJL>-FS(m>w>(T=)a$fZ(@?Sh3QZ`(}{`5|bxU>IA&i1>Ky5pO&oSlgB9WS<6$ z6{O_+(zI`e^hPtJeKVx48Eid_3yXgIuMc${q%Cyx>3=;24Q^zrySEk|i0-j98vZws zwtp5B-p@@p|6>AOEa{HG>6ZC_Z*$E;AO4@4mQA5Ht!1mQE8VVT+UT<lSw6?G!`K%j PAqjNNZ7=Z>e;@w^PDu=! diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 73ccc9a9defc648266520723b0f4ddd40e389e5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmYLDv5EpQ5RG7Q2!4pgnZi!wP_I2~#4Zpfo579lCLxKdTly{9_)E5af}NEU;q<}0 z8Qz<D%)H<4F+zPhLhiRr|LD*#rHWl5&6aG?SzK7i@`oPh-?3Ol3{gM{dZ=IzwiPoA zg|iw)0&Nq8^Jrs1?0nfq@n@8XCgHb-Vhd}e+p3}sz2z!^vC=6@Y#_PNa)l){#s#h+ t0XZ8iQsgxz$O3;QN<4TBrbe6O+mX^(lcXH__WCuco!(XWlfS=Hu_qF&PC@_x diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/experiment_container_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/experiment_container_id.cpython-37.pyc deleted file mode 100644 index 3ccc6f1a779a70e4efb646f310ff0adebd91258c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2029 zcmb7FOK%)S5bo}I?t0gNV-w6HS>?6|)=1oV31Ze@<T&7fB8^sR^-TB1<IH2zJ!@yp z`haXHC;tN<K%6-9JNN^0<-}j$MAhuWn{0@nrLL{1s;T|zId_}QI)Rh^`jc333HcKr zX2%2ObGYUJh$NCGB&7kR$g_l{R$x`UmDs5hIH?=BsTX*a%uf8Y7St&DibzMg7eu<s zQm%58ckTvt={+EA|1a=M+O+icAKu-G69sJjOHqjX;gO1pwpDI?WAf}k2`R!v?Pi72 zeG#d0V=qq4vUq*}BwUh$&$VxJQ#{hjd^c2jbT57yXA%DM>^M`#NMIBRs3ZZCG_aH{ z*%f_8`czudzGwsvL|`iq;&-kr=}PayKBs{X(i+J8D<*5QUdiepTLIY$$QrU)$r{gy zO@bywzFKZ{pAM9cQ<W9lc~*!xQ+ijPzI8{<<*jI@XvGr3xOuJOa}|$e#HRT1*M@7s zHS0hMa!!t@q+=@CCBwSFe_Q*y2D&yY?M$SqbdE(bRPgASAwVj9&f_dDI7bVklK#Y; zmNm|!L>R;QZ{+Xaw?FFrV3amJaVTUb6el7Z^}fgiAd}+5p306*FCVDPL_qVw;mGv% z;;?7pLcKo_(PQyQ!MjNU7V_~{s38M955eQHC~`g83e}-Fj&r>wp&>wn9bvXoRX{To zVyp7V7cw%}EXWqK)ESI)6XM2eFiV8`^z>GDp6=~gws&P`o&u}9vGh-|EWHF8kjt=i zwJL@>i!kMQu$9pHHe7QDh@?N0G5v*}Sz~rY$ChN$x@2een2c>{Us5QDvw!+Wz4gL* z(B129f8RQe%}^wKmW;)K7lT`Redpl*z1EA!4gW9h%#yQ*Uw03>OWvUKTA#LlJo|Xb zeg~S>HHD60hUu)?+<vZ8Q3QTp713dyskT#EQDXEOWJ%uuQaVp?KFh{pWcqbfSL6+} zsr7Z9a!fxy8dzC`cy+o;PjA1xlyiG%=b8jaT&scBI3CXp4py+L+A1(m9T=NUSaVf{ zU}QEyIt`{m(`Nc6i1a&1UW)MuR@b|rHPv{sSK>okz~^NrVITJ3^XL%S9NnAnFs4V) zSDWOF0Z!<uIm*(XO~E|xK{F8{M={5_nN-7?V1Ey>-$L?20DhG;0Mi2HWLQ}JUx#I8 z3|kF$2ksQk%R1+2E{6&74bGoH7f&@F=Q58#Y{gkojbyn}?G*rdm`jac9sM?t(#CRW z%%R2{>f0!6PPb5`l7#bX<Ph;|XoPK{eIWQ<GuT`{v+0`6D5GmNxE7<8e!smEID-*H zS$PjWm@T8u(lYAI=C8B3j5HP{*!{n+!LBr_qo*G=*tOHIn$fs8G;R=$Z5?dPJy$lF lNIGH=Px6BSUdKM+s`>CgnWX(Q3Kj-)&|nR^ZZ)h``VZ7GD0Tn< diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/field_of_view_shape.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/field_of_view_shape.cpython-37.pyc deleted file mode 100644 index 45b52d143e03c15bccefb96f27ca400f98f13bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 zcmb7GOK%%D5GJ`VNnSgSV<&a`h;D^|MlR4>Ur3WWZHh!`owflM0tjkJMeFQCA=h?f zD2E~ja>}Wf0!>dn_0<2f*Pi+pdg=`Iuxuqjy8>rthqE)B*SEU4y4oOcWxxL<e(?$U z3m;}z0L%?oW)FxYlBOi15v9nplx0rjSl&t9%!|CtkNhl%0xNUVT2_zhlzc^`C;by5 zedQ=$1<HHwM-3S~Ag$WpV3)LL6?7inyq%;9*v6Nl6!&}kDlS`2we^iD@;xP_=%wmT zUMk%ev8uN2CYf0lZ+4D)OH#18@oizsM_QTh4wN3<OP(fqjGkwgH)YH*Fp5M}l8C`+ z9Z6rY7o<-mlg>#PxyqBS^iIfg8u`HcGO&E0YM@<*tkhmPvMw7ZE@(7Bx&pG5S4@U- z)yhJUt%7U~WEbSRm94!XE{QHcJ}y@4w-c4h`~4pib@X5$hN{IXf1r{_gR=6D5?Kyn zXL?w?yRh(Xnm|hOoa|Fc$55P?jFK^MoQ)Y!M-njabfQarw9kt^KLiilOkKFS$W-MW ziu6FW+{!ZtL#3-4=SiNFoL2##p26q#5KtM{sI;%^;8$Y<L6+;B$Eh%e^FPQxf8P4I z`-4&1bj3i(c269MeAN9S7jcnG@ljXhho)N$Rc>OS#c(h(-MdMzYm!o3ABy;~c%<On zGzAU$c&DdDlJlYm77s;P=+RD34a8wm=p70D0z23+W+zi6^hzmqtVOP#LL5n^@{-SY zUXy|LaHQ8Dh!B>6As~dVGoK!BpRY!HmXVmE7F>A8bqkh#bxig#*R<23`T_{yb`fs+ z(wuA}hl$&OWf%~`j;}1anq>UHIa&uBZ*YXgxeROO=<<@ISw$}`<t&j^kiw*K*{gi5 z$^)Ix+Yhk;+s_7m0~lyL`YW{FZ_YDk%=XFHk<Lr{%pJSXl<qd5z&3g2&7XXD^2cQC zjbVyjGDL&U@z0Isx$D91-Q8Q?Hw)Fy3TW9$`!$7W+EagUx-m%??o7BPOSkv#-)o)^ z(SU&^&4*v_?(L%GL^eNb9&dcIqygRTJwYtdSo?)3V2ga^!;C;%MsAW8aVw~tI5m0; z-@uCKw}3=UE=<w6E~)B$U1S_fa20foMd~1=Azg#t@zteL&eZ`ng8Zo02Tavh;MLf+ z889={uw_G|W4aHegJJ+qK-nlPhWKIeqN>ftrnMNE6RoDAXGe<Tv_+f!Gq5tLz<IEl z_L)Yn`W+<iA~`!4Rn5i#XMZ0yC&S1Z^tHn{(}ZB_GKovB)li=e7sH-+DGnY42@tuB zltE8AHc+<{g_HK0o_uAY*%l+WhXsKR;o56XKPlKge6+6P@zFJ5wKtXu6<g~Fv<Sce zv<=R)LLQ{Zhnzn-5b1QsN%GQyR8<>lfJ|MEPJ69dvB(R>8Wd9FXzI6-VEFnyAeD;= z(oJMnr#Ky}H0As>{{SF}NZR644LEE!gHJWK>4$FUGRo-23M`LNjT)WSO5_bkP%Y~! z`fvu=?Ipl&&j7o<2-q6?F}m}AUxV+7QEff_UjSdJ=^q25G2<G)=NfT5+L~LoI=M*O jVwg-agaMpJKjARis`lxm2A|__+o20tNH?9(S)=~~W<XFc diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_depth.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_depth.cpython-37.pyc deleted file mode 100644 index d8d47121f37673e9eca861705f2655434402d90a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1991 zcmb7FOK%%D5GMDbmnAoK>=f<`LT@^BRiL-N(8jS_2aeo2E&?nBu-qkOt+Nk>T-i}7 z9|{}D$^XEI6g}lH?X{==g`PUYm6XWJr35%4XNIG1o_oL5Y7kh-Uw`mdE+K#8WxlF# z_#U=C0wRc@F-fRTDW0v^N^IXYXFGNh*LRbOUrDNd)$p9Smel<^B|j43ipmuc6=}<g ztV;K?;x|O~G3nI)0lTC_i)!!5{k<rbaBMu_IX?_eWteyDV(X#K(j&<Q4`R8W=28uK zD2uIwDAB9z&E9#i!UdZfKW92WQBwahmTK}SdLE@A{_}i+-)8CG;71al3gTPR7W9U` zBm*ieVP7?UN4n?%`0m`;#wX{J`rwbO0k3*viJGWiA+HX+2JjldTN6#gTYE_y;y1zT zR?*x~_(_zWJdmS&2>4o2d1nF{p;e+G`0K#7Ve3sGIk_aKRM06vy0$RPV9xHTI><U! z;iNo~g?q;1v4pFu$0MnV8e>r!<&2?*mhqrer$wEyFy>k__L}_rdgrVDuUabI=R+>M zfS>bp(*GglVU`O1WnZRex}S|?szadJXgJaRgDB|hD3_m)c=(i`NO&8^pdp@i1I441 zWdT?`<9Vhg-9QfcS(K@+fc%046Rf+5%ptcq?;49tJ_p26BGa5LBulaJMibQnZ<`nr z6DRs&>+NWI3vcb>?uyY!6xA3?hl!x5D4CB{8e(*DVG&@ocVO$!fC&1EOzEHW!k${E zbZTQ6Tw52;luRArTvLd>+vDq$kVgB~dc1qEyK~%*gl96kBHueYeAK>;PPa3;qWSP} zzc<s=QtK#7K~1+0fhoPx!i>)%(f$@>UL;nm9PI8Lw~eW#Xlg)+rT}O8Sb9rxFu7vt z$xpjSyZGnk#qSqiuV@@YMOSpLBIsZ`ug%IJQwh)g+Cb*vFiT~}E$lGXY6Bvz?gA;? zXV{(Qfx3fSL*7SGeW0?0Vdmb0tF8bc^#)z1FYYZRf1w7oUKap>DLGOKduOSuFy|)E z>u`X4LQieONHaOLd;WUP)rridC>wI-g~8LY)CcfJeTd|pC{JNxeGJmFJgs*jL=`|- zP0xb?Ouc1%h;4!I9$cpM6l!ssTv&h<Dsh3csLh*X5of;@^T6~D!?r4;Z<mk}l==k8 zE!;H|HUQHGp~fB{R^xVG&2?aW!9>AH!&uQ^EXl+;#&eUgXJa1EBzBbMrc;YGGh_hi zFcS*DC~6x>;b3~yM|j6RR-YoXH5*BxjAO>$-~|6L@d}GU)qvnPOQRb#Ys0pvMK{)9 z!^uc{oi*PbO~4~#+y7!dm%Np^<jv=j_x4;;m;itO|2~7Usimi8pDP%<v+tEw7*vH5 vMq%yxTMNrZC*`rnM^PCabnlJl<;gTb?VB>z-@(Ko8Y9rOnsn1{+IQ%GZaW9t diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_plane.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/imaging_plane.cpython-37.pyc deleted file mode 100644 index 515bdaf5d5b86e29594a3dfdcb0b51620f3fa9cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4108 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 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_experiment_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_experiment_metadata.cpython-37.pyc deleted file mode 100644 index 0ffe45577cb37f27d8b97088ac5805dea478d2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4840 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 diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_session_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/ophys_session_id.cpython-37.pyc deleted file mode 100644 index 87eebfb5aefa34a1dbb093e3290a56675349c590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1916 zcmb7F&2Jk;6yKTI^{yQ|v}poFe3{;igoVV7FF`{BL9GJ`RmIBEXm)4ZY`P!r%sQ!q zb4pN8xpK+@j!67H9OlZ2e}NP4t?h)`y>z5`o_X)h^Y4A`y;iH?z<T)Cui_`qasI~3 zeED$r61Ld~A{|LmCnF&tc%~`MSjeg~OWn*1y{s12GC%Yyo|^_)J**Sw8%KJwcHzjH zVydP*<)7EWhV&1dPVf)dbvnfQy+`+Ul2pO5@wF($UUa15vcv4gcc#eqm5?Gz)oxxY zJrJ?78~2mUEVI{pC(#lYY_5G@nDVh!=7*8e;|IyJB#-f*=L`I<mXYwIoRCN-q>_Y8 zxsqOy=gxpgCf$o>=z#~W^1*-aipiSvFWhqy2EeTYFSw$zE*llE0lXF9tpKknTNSVQ z+;N?-1)i_k)xF{2*c>Qhk|N)gr?>A`jJBC_+KI$q%x*l9F`a?LUl%rmZPtO5&bf0$ zB$*INFDV8e{($v#9b_G9-CShKddDIiDY$xOG*sFKoF{owa*i5CrGu$Dv31VlR2akg zAI`sjZhg{!Xp}a6aVTUr5+@=b_rJ<TT;x)G+*kRr=@&zln;2+;9`(~C>YJog9}Y$Q zL_AjTHcdf8KIunVBsni4uy`!WLXZ2AIuyrAq5BfD4iZee>1V2hjF$pTgGH{M0pcW6 zdC3<fH{t0H$GQa$<2D!`hXmyGjTeL5y>^<}J4?0`Y5f%Hip$8>v?@nBk1@!&utL!4 z7HsnY5J`S>CggW=#!50_=g<=qdPFBoQpqmqnLBYNu5>R6q{8c+{?ceKtb^_Q+gm@j z3)P+Cxbb93b!UI?L3<Icfu~EFkG|dB--gO*f8PH2?9(Oj4pdallsbXdBGY^`TN@NQ z6Q%WrI>}2L3{)8(7P;zpmc^;jYv8QD1H^hyv3sg_`WA94avMeUfi5zR!NaQwfH-~w zGO$Wc-(1MSwJKCzT>=)a)lh4!<QHljLtlk^6%G(isPIh~J5@+o&)!;$+svg3Rfp<L zc%|P)@=~lvFjw9Isj1qEz8obg0ZKnVi3Tv8Uc`v_t}(t2mkBw7ve<OaD4?a#k=Iy* zdD+gxPHig{QB}<x3tc0W4x56056-%cWC3|lg$}^H55j4Y)5da<&$VF4K$m0pb8Z`) zXN4T4cy4n3bR^Q5#OGWVF|Zlrzv>~oQcVB=eOO419|8Rq5bI*L^t*V+sOh`NY|Z9H ztkRV88_3}5Yp8?;p|K$FGh?ut0_u`Aml8_W8n789mAuzkfg&7(dzE$j(R^%lm&QhS zJ~q1l9~&C8VRv8k8B8^!x_b7FfvGtA$QX?cud(xW4J~h6Tds6+k#@x}nZ^elyzzZ{ ZsyZY1Y#R122xu6LL6bJgI%~33@*mjx`*#2U diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/project_code.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/__pycache__/project_code.cpython-37.pyc deleted file mode 100644 index de67c68e30777f7cbc7607e7d33c077a568a3744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1525 zcmb7EOK;mo5Z>jIvaHZ)k;dp%haRd!siL_QK@&7_-PVO;r*?`0gn-40JBrrfL)oRA z$WRW24dmos(Dc+x^Otzdsehq|qBGRPl6~p|JKW_w_|4<v<E^b0!<GH{oBCHU_JJ;o z72x4p-0nUK%`{J0#$(Ru?4@2NVo{$(>SsY5aP|Y!z78&!4uFF=_v40c9J9{G-{{Xe zylQ=?N_E&jfuzLS_P)v75h$(tDeUDX*nvs_6?dK%u6%C6{X7Ocd179hJfR4SMYw3W zuTcPtxn{8kLi2b0EgNv{X>k$8J_OK!4aDld6FSh13;&$Q&9}^F@g||FZauXHVc97( zeKs7;t}?-U;?<vEjGjJjEDm#bQIzbQop8;k_@PUW3V^}Hfo-6!<5hmHGN^)6m5u?g zfg6v&R!u2QZb~W1!a+Kine%E>$|P0JN%@}r^ViP(-Y*WU>#3pAQD41M`K0$KS4oj; zb*~5csp}OZ$X$Z67!4<`w{QAAXG-{Dq>>lvIiPQvqJ@6Z?OSDXS@bdDsVWOQ>Gol$ zPEBFE8XJKc%HDM|D6t8p>edk@yhg+(gS?bW&1z|)(ZtfwY*Iz)GV!y!E2WH<xr*wO z8zGIZHd1W7)cvYqp&Z*hq1w`-#!{_!aJ$b?P?dkjVf#b85mWDkO@$WPzx3YtQ#Qp> zyX08=#)0~ZGuCRatmEDN-JNIcIcyhEOWTi*7cc4-uQ_~wboit_1M9#!Q{-+<|I^{# z!NS|M53kOV(d`G<JflUqj9v@!>yNufyVq@N|IgR#D3N&v1w?D8<h77wx`O?xcdlK) zji7S?Fav$|>6$@jd3%OzXt>fE;^}-+<K_U$WLV_T2`Z7K&VGaqvLB<Uf|o?p+R$#% z+gjWv)#kt!nWTn?cy&Y)7KZ#bKigg%nWa^yMO+~cNm;d|%nChD=^RS=a;(z1Mj*O+ z2&-E)eQ;2Rg|39jOG^`Ew^3AEb8;n+rcz!(!=wm}C4`oSu8G@`X!1M4;~uZy9&|S1 zFBfczZm=m@uqj$)lO;yPd;ixB$?hPs^S>efEatyMXNer~_A*|r$yFMuk(s4R30&p2 UQv2pNv+6xWcFam2@=%20KSzP0LjV8( diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a9814f62a3c7bf20aabe1ac2c13f2a0055267bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmYLEF-}7<3{545s!|Wa&}Lvm2mxKIE>*Wkk@I8m(<V-oq`&;JXJO(9T!ob*urc8v zL7(Jj>plBPewxo`f)QTN(E4YiKTLRd;3`*4R&2%fWb-C+lP~oBzPeSrg1IQ@!7dG) zfJXI5&_%LvqmYK8VnQk%b4>kM)Y=(UT*XC#?f}oox8C!HJxG(mk&cEF2dFWR(qIpR zi&<Kzz|J1KT4cZqO_0Bd8ebA-7m%v{cf!$Er;`W5i>S3DSG8WI@nd=yqCI-NZ!dju Fi61OAR=@xN diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/imaging_plane_group.cpython-37.pyc deleted file mode 100644 index b1869770de6aff5a899f14112362ca8686dc253c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3088 zcmb6bU2hvjaQ8m!^GDJoO(<!pINE}+L@gxV5Jj{lEvbrA5>O?};<Ub9JLle4ch6}Z zIlMGdpZW_ZsC_}=nZLlV*jJwT3p_EqXJ70%t>8|(J3Bi&voo_hGq;wOst7*gw_nL? zfc{dG=~o8eD`?_J=qRE%L=kRdtY9NFBC~C3*bJ@6Zrd8R!ctUjmm{a`M3r_$<Ls~+ z)!H?T?jl;E<zqz4%w`TNv&yqlyH1@w)TsOoGEf6cXD7{qBqkxi<<`SncY=@sSpAx0 zWT!h|e%3JM#yye5yNpoM4cT^_G2SCSlN<MgNGzh)TTi+RSm3$#AQ4%gGx6P!@zJ-z z(;)WMDW;!20mM%LFx18rwGC!6lj4`gbJWAspyqMCZ84i#)ILVfaJvMs))C+`=xDME zt5URysPodK6<R&EV5J5tb+BUXr9ta-N#m9Pw+y&tz@4Kj8h7qFvQT>k?6WFYw<FRI z;{Jn>#Oy9lhH1l)wN%Z#zM9I_nTh8o!#MNJi3)18ps7)~&}HZu8eodY;K~;UMq_|H zV{AZgQUn6c7FRa|WLPnYn6wW_IAje=+G3b8E*;Mc;vn-pS@&k-%C*^9ehP4yC0N+g z40%m)#j@ggen^Dyyx-A3f8PGQ^MhbqbjUuT%`SOD;!)>jO#CFK<g*To4@4(PSuA|$ zlXQP1I$_Z5h#+IvQ{q1&eFl5O5Gd%QPM4D)_L44eJRn)ZN1ZO)CkH{oI~1-Ftf+e= zIuXm@3S|UX14oZN1;v7h#hF*EM8hx(CMp%kAos+qrp<K3&w*yk&_oG3gjaA0A6{JW zT61bRA1gBW)Tr8RXnOA$4U`LTtAY6nAYoX8fv*?chJuuT&O;LhbjUcoyeMnNGyhH8 zDsXy(IOVtt(5B+9zExb|`tu9M4X7-K@KQb6l_k!yA&-lTs$!11sM;300KgT+Kf@*c z#XK^{#sG~?YQDfn*4P?geuY|lXl%VQsQo&}nPW^#J!2Cc*<*{AHqk5VH99Jd(byit zyL@4QT^#~(3014^<a<Ck+;9jYqCj0Qz5;cI8pYZ~n-iA1TB`+q#fAmbxj`&468p>z zdhTgaZa+9+vD+OL`_;)$Q+WY(1L3BGXKvDSiL0IO>ex_hWT9YgD~Z|3S;-&D8dGDa zac}GX*6r`zgf)RB5obyI#7+B6&Du*iW!$~Fm&?mz(Hy%wyF1@59v9fMIkI~@+pUQx z!GwS$03^cQ0VHeY%1-b~(;Kh`$6MquVG%68QLs&aj$Y{s>_L;9;Z)2SdqL#f)`#D0 z?QZ2qfTMgow>EFW(<fgb)#f?v%mwQxrW2vsEjQf53v;X*#SEgW{aB^67Jmm`&?Jt} zL|<E$ARa>qls1dfY$Pj!Wf0COdn(N^@ntz4#sRQsl%?s1B4?xCKHr2+8gwR>pNdMd z(&I_wsTXkxXoU(~=yDy`AsSk^ikAVh@ZqI}7tk#BLC&erz|TC+QqJFn{l1QH0I1MV zgopQF0?!@8V>e(_kKTlbZs-u99=g?%=g;tEo`Q@MgJ=~R7JnZY@++!Sp;eQet=$01 zk6S<@9O#hYVCQW*DQeKE96#yypqiQ2NM+<gql+*Z;{gOctrO@nz|ahpqjgS}&NK-% zX3h@@b}1xXowYob(D+qgBsb5{eHxZ?T|Wde{*mhDQ;T%8GvL76u$bpFqxyz?HYJ4` z1&RVyEI?6E^}Hyd!%)F>&wD&1;bg@O;!LMX>7*R8InPEX=9V>G6o8WZ3FXSVT)Ccq z0G+hdrQp}pTv?4b6mn@&NBArZJ?}&hNMb5Ca-AtF0M(%h^&T8!-L6}8%fRYizh>aI zl7YFRX*HH)DI29wW@)+7PDfw_Elz$qtuLAj^+j`9Uo>ay3$FYsxBu@pD1QWN@=0|I z&vH`U3a$!Lu8Iq;(xludIBOcHnVTdHa;qtAPK=R5$`sQ1BKOOes^SpJD0KsVyl&Rb GW&AI-WhmGH diff --git a/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/multi_plane_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/ophys_experiment_metadata/multi_plane_metadata/__pycache__/multi_plane_metadata.cpython-37.pyc deleted file mode 100644 index 97d435b4588454f819899c3e5208d7c039cd975c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3564 zcmcImOOG2x5T5QC+vC@+?cL3T1PHI7L0}|uiy}l4NW>wVpa_sgM$LG-y*rzEnC|f= zUO5s{R>~<?#9{vcKZGNHps$?x3!JFx@r#Xj1qY8+H8s^eUFEM{bEny?S#bSv<JaJ` zEz9~7A7+;W!WTg5XJFjoB(@Ub6M{00X=3}fk?q(?N`A@6PFzkZe#OY8*iEW_)yU<z zmel>akt=Z{Y5GkgyYWV{>2Dgj8n=?R-zL_5i`RJl*y43je_{I_-gs<z&A-44%Okq7 z`~97JQ7k~*`RdtF$S4tMem6_=AWDV&n!`ftUL<1vaPVCuo<80WhPb)$brS4F>E4%O znD4`Ld;0t+4pMPnW}_h}FFqXZkJaMX2O<x6kO#1|VU`{XrJ^h~R_c#rb|6Bq&Cx*T zQKs@eDbzP3A;%A*XHgoW&$FvC71S>v2+Jqj@~N<eBTAwyD#GRDr2Ntv5Kg&$-0-WS z2CH>I+c~j$iI<O^7sPLXwh6k*2{n6NUOjGregpKIps!8!b>1-gmS_u`H%|!P;G5=z z&Ro;tZKK(GX*rg^4JdbX=fNn>qalJa|MO+Nl_4%n%<*Os*R4XS3P@11H9*{1HeiQ< zJW~k0Zbk+0j3e@TYxZbtusuXxH--h2ECejW8B%yhvVqh!V7c|eIv^7=p%Z)JOv;?R zg1noQCKjXI0{`i*SCS3bDVxYPkZmGs1M_TMQX|M1?J^dnQO=m&W-HwBD%w#Z9;`g6 zH9wB%Dq~?BD8<-s*5AM1z1jO#38{L)e!#o^;AxPKd$-dd%u*iQ=!x`D^|GNzRS4W* z*NdZmPer--WEg}`f;|E6#xd;RPkMa``OLCDoOl@InH=}}Vm~;HGTFn7gcZy^)k~%+ z3P+y`(R?Mrkg@{rbCuoUSV9}H-ULzzp5>MaC6odYmmXbtJvq8FC_UT2r7LliD8~D` zEJZ$&X^7Fos|4f%-33xNf#uU!LKNw9JEuit&66{+Cia01<N%d`%0QKg!|AIs#M$2U zXc3*uaFADC87Yjp#Bh18#5B^?fy@$y{>d_~VWQ|Zdo7K(*{VF=n5RmS$W6AKv|dTu zVXPKT>C0yZ#5g4{q6>yyLg@;yPl410V3y;M8bPAK9SQ`$qpK_MpZ_P1>MD=IoJld1 z@(nm7q<9ou*vhLwrjTxdFe@Ygn>?ol^hUM;cnZK%0G<Ny6o97yJUwtHHh^C#z$fxu zIK`_haMu@?nge8f(T$-goGQX1AXV9c_oo3lP+7VNh`fp`mzI0YzmCJ)ly4z>8<^+F zYbc{T@*QL*;6x&dOX$82kGFx;HZY5BkVb*5!S#G>(LKPnl0NMZVD79P+3VooGP3eL zP@IRNYf=E*I|ZWr0AE~<7aBPauMc7UA<)@)t?C6cM?6xXMBoIx@Q!3kAA7*WI)LJb zTq0P=7!zGzng{Uy4(Lvo2!{3tAZ7BJ9$jBi4lCMu_<!7JFS!BJXq4uwoza(9SSnr! z<}Q|wKK^emPA%==WJ-fXz+|d1mSlVsqugNZr%@13SL`UwC88*?t|j)>BJx<`rhn_Y z8B5UX_cJc>6VJ34?O=b9SPK#%lo)00LK}mjn2(FL^bzWs)4>*sIA&}S2f)G<mg!h^ z*onoeu=re@5oS(M(y61=*`(w`v!IquiNyW8-j*&6$C#|>f&XMS@4BzeyY6h>b(iN| zcQ(MfXSUbwS)B;mpTD;bi!0`Z363AE!`dwK%p5ZD*OPVFNmhI}bZ5qw>cnK9PS)YV znL#clI$xj7#b>RlHUGzTm|FgVkXXKYXKn_nT*x$tyTLFjY8VS>QHzV|rrldbtN0u{ Qox;)Dpbgvnoax>E2N%NCR{#J2 diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e36a9bc94359679a37a94e42ef5ee62799989371..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmYL@zls7e5XK`|$bk=Hp((Bt5$|l}n!_#-CY!;H?j}nnu55YFaix{7Wa}f?Sve8Z zf$y8)H-DJ#;qXIn)W<)_`I7A!JuVh3>a$t#D@MJalZY9=?e@Q%sx@IG1tr*tfdlwX zeR(K?xA3XZx1>UYo(lHRlpU#+Gm2coaRbE;HpshG#S?ZXO$6t4FnqCv6k;b0me9Ho prG*6C*<z7M)|emzN&5%UFQB#aE@?e!y7ORG2fMFuo}a$5#2qvIN>%^> diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/age.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/age.cpython-37.pyc deleted file mode 100644 index 0c8b5f18174f271f2f24a56f63bc28805a4732be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901 zcmb7GOOM<{5O(`9ubtU!Hd!DjfC&OJKxPAx5aJQBSrSN;>@Eo?k~PBWarb1r@z_JR zXTy$W4=6#LkT`K6NQpS{BlsH}eC5Pn;KWxwGfp-^NLX^YTwPsVUHw&6Uud-&7M|g+ z-}0nxS%1>c;;Dl97_Ux2ge6#F1+y;;82;_V9y)=;NaiH&&<i}nyGdnO4XTFslG?By z)Q63rF<c6kjI5G0hpnK+tWPab6}5YosL86V%Z6OKTM3p0yJ5BKe_>5)tIdkq_9&0D zlqcY;TQ@IUiW3R8@d?lQc5hckdD|)0uIMbiF1g^nL|#sFsro#U#oE<)sGk-e-@4O# zN(!5+JDJXJDXBjnOSOM3{w7W%a%1s$b4LFNMp_hvz!ofUq$}+E?0c)vgd^O0&A^it zSw&d9`?jcv>OJ=^3u=(LvJPqOz9Z_QVWbU6mmph$W>d6`tSMVFi(*+EF_LB36368c zxgy;YmN*LCRdMW|2dhWFw_Gb&Mab3)XXBQfJPYDyeV?cCkSG4>IQ0eJ*KO?2;kRUD z&o@C|7q5d?9|y^;yVfofY|4cFgH0y|qs~^agjr#nhQ^9rxG5jX!rSA?ShnrL)8mm; zMJ<F%oQEMqu9it(5w5UiJq)9SYaNEaS%3eu`F{6HEtT%_0T-Pfzr)l0?ncU^EEW7* zSEhTqn~h|uBhYL#*w@{waj&c6T%H;6=r&xz+$4d9xV_#}9DZdzSlr`zruNr+a=`cE zOsxx`10w_vy*`vVkdgCsJvNfC6u@3*w6B)o>rsk>2@abyHz0p(M|BZLd8p(_6%{4( zu}aG@QuyfIr0Fk$AbjkEbzo1eU2AG1l#KWpX97Bp%pyQXLyB*d2^r?uEXYpbM2S|% zV9jVL@@+;|!4>ts%7)=CAW!F}D<GC#V@)<`k>lkk664q+BB7RABagyZ6x9T25sIFo z=@EHP522d?VRmvB3_;;%r1>w-fitzS8;8*SgMHv)Z*1xc4|@YY<FL2N*5vnw|JZZm z;?;|rU--O3nDIAm_}J<pg-h4BulY~9sQsQkq;+Nc@|G{MG*j9a{x<kdEc}n4)-h7- z>1ll|rF~A?e5Nfr6zC^ZZ+>?1`b9Ei3{Dy!l!m?lcq=+rIQcf49hM!``ZA9OSt`{U z0@U`@Gx(_Ih@1c^ysxQp{KuhD<e!J8u7OzfCR;vyY&4D(s-|~(eH6Oc2`y5VPKsW0 zLS)5YjP0^rRG|`Q;BXc;YUj*r$M{-Q=ipxmjpr}G$iI49Ga!N&r=g(<7M8s-PmIM- z#7K;XzNKFjj46u8?V4&*DHlLLP~`mLz$<qP^<$hQ1=}guCkE1UH=o3K1IZBU?7er- zzI_H3OOU&4vP>X<G<>OT&$eLDyol8yG=F7$dH_T}WcuWkspoR`0J-^)q0GUr+<D*% zAo-z<T(yM*-!DMxywUO&T2uRh_t5Iv2hM?;SActG>V9XRu<la4E0aGqvvg0YT>JSz z64HH2YClf%%;$bO9!g-z)MB41iPSR9IkmP%iMbuFkSOS0kMMt{d`c~tE_q6}#Zqti zvGjM|e&<{{dWWmD{2|qw0}1Dp50|oWJ{spfsl@3mKkoY@t~9ZI9w(0+P%k5RldGHA zI1zrD<wi}G`=P}N5TzIX>4iT?S)?FM(K%OGD$WP~shv~pt%=hWZ%(%Vhs`uAS2UeR z`~7U33PiVDxZSQ64YQJ_m5SPYYr1fWD{Li^(2}cYfEG34Y2n~(ki*oe)N3GxH{?if z^fdCfaAYc;fTc;Lb5PZkKGsr$xvXKkb`#}y&auhb26Yca;c!)Fm)gguPf{%m!=e#} z!%U15;+tXk^_VB~k!l!<EDA&Q29_|rsaP^S6wnxCqHw7jsb^`Bs)#yCgz`_l1X48N zeI7?MW%UY)9MmyInK3H`t$9z5WRhT+vb!J^S4fGPjKXcuqP}R#Rn2zUs$;WN&t{-a zysphw@MrYeN7U;y=T(rRlJAcIBeP!MjrLJQjCaA=MdR)~)wny09?*HbaVx4j!R7xu z4fhHyJ8FI##JyyG9n^}7f}(b*=x!UVm6nYT?wB1uif2Kk?LUglj5E!*_TlW<&QsOX S6t5aX?*#;!?6}i(R@grsF5Ywi diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/driver_line.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/driver_line.cpython-37.pyc deleted file mode 100644 index 266eb716844ce235dfbf2a64145c2bc02cff6046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2333 zcmb7GTW=dh6rS0Oy}q@fNeV?EEfOfWDh?7)6pDIFp;hWY3aYfSG}_%6+nemgof)Tf z<UT+u^{Kyr7J+!;FYPN&{R@5KoUxra1caDqj%UuCIWy<m@0`iaR;x~+WxxLzeqJTy zPn;|o%*l1=Dgwa?rzy#3Kq-!`)XMC@He)+=GB<F|*hwo{HK=A@;AOR-W^`^^&l*7^ zYX(h9z9ziFtIr6p3RifdDr!fSpvAohq+NRr=a4ono$W+v_^oyy-n^5f0*3Y5p$>PV zJrV1+U9R6#MZPOS9!9CSn`<HaVJyn^?IcrY)ob0y(HU*qDldFnC_RuueK!_zazA;J z<mG!ix!95S3n_Mm8mD^e$q0@Vd`rqg#(2L)bLRs!gn=Ld<s`5;4Q$~E_YxrVl0GMW z%5CmEYX%jF)C1hymzIg&Iif)gbal}Ht@qOAHC}&)+9qgQplg6-lediS+;ifP;5=Y- z4v>(^fsortE)Fm2q3{PHFZ5(2{5;IW$ExiYeINDQ*!d|Kf)+4r%rp!&u{FOw{yNZY z=xPmwCP!qCayq5ldST%Qgk$ZlY`_|T=HMx%dl05$0aI6vM?#h!V@aN9#?V5Ev_CVa zWsR{o4V7Z-5Ax=hTUUEOC?QoZ9EQ9Tg^$C0(z}s|agp=zv!2KgRIeC`T*V-Z(Qu-A z+ey?@i58!X!gxO%2-usZV8Qn{BN-++D<bfC5b8osHX|_%50XM|a$pOrAYIgECNwZb zhns3_H0)Th1W0Ezk>?@A6~w`SLl0L^pzbUMSmQ~onG_>gR;18lnV&)vk-UXo&ViT` zz>y*yUeF~Rsli8H01H6Oj#DKOd!v|%RhX8wzAQ4f2V}?T>{{00+S0X-4InF47vVD{ zluC-6CA_SrkQ0nYaveOxcsFd7c{lgmg$aJ|pW&9T?5FnB`jt%W-{@0k>Tt5}smq#9 zftuXjC-S<sIOxIFo!THPuiPX06V*0aJar*nmsd@!UN=lAA$5PLJ=ogby7j$3=pc*y z8xQ6rHIzJMcxQL#zW?`llpm>6R`+)9c70ytg;YNGce=3NF;j^A8t)|h->lgpX<**~ zH}b)MZ9LgwHVnY~HQ2RK!-;1PJ6^>6RQ^DpGC^G6=z&I8OP<ge-1#@Uw{g)xb<N+H zk#*ygi-+HA?QUVz;Nh_T#qru}0G=Fvw5VQwkqf_&eg<{ziXV-&FGVb%jPR@e#^L!5 zA8F)2!ZLWZzVU``v}XiuJAv01IvzsKl{TcEtbyOMq6!H$v0afDVJhE2aS0b(;{vk+ zYv&2a&rljk`8Mn@IYOFETBmE&qHC5%&(a%>Axo<H<ERg>!Hmg^`h|?fZkYTo3^W0@ z(miX>KBB-#3m6Gy*)Y=T9>*o$2h-9?;h`z3^SUsrS@tZb4`BTt1Mp1B!CkI^g~HNF ztd-NXVqwu<!NQ2&kFm1OSXS_HisL3@kH%p-U#T+2i<mKqF_pH`(o~|dVJasSt6{-Q z2aAqG%t|}Swe(;leH0kI{18Ohnitzxq$#+=>S6>${T7a~h)8_zThJ9QdzM2l+7`V4 z9ptJ-&3YH!nF`P_$p_|AfjgQ&#OA2r(?tR9oGHMaMaFiP3$R3xg1i5B8@vxnbmaV% zhxcXv%qxjcuf!52@n4i+{n)dy$-}f0j*=Nd$X6562^vde^uC;ZlCLmbR1-wgf<L-u IuQ)68FXSp|*Z=?k diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/full_genotype.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/full_genotype.cpython-37.pyc deleted file mode 100644 index a06179cb6ad889e82c144b68be42a7e38b59ac4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2548 zcmb7GQEwYX5Z=8z+h@m4)3hm|7I7+w%A#?Qka(bgpdl%#ic^x7N+(OF_3b)7_k4HV zJtwv0KA=YGQ-1+LO2iWn{Gog0iNDY%X4XC@t}7(Yy7lbr?9S}WH#2v)R;v(r`hWb& z{wfjjH%{^g=HxqgRR;!6I1P!5|3*mrhHFry&Cu*yuBB-!EcA<RQPYL6)VE!`Uv|s= zid)gVVz|_=x>ZW<5nkf<G2yl-in6dp<z>;Wak@|H<$pjIY1V0G?<Q#wM=S)o)O>Px zI|v1kl^<BjcH2GSr*$)1yRYJCPcY8fq1cI1Av??$+1i7kuNK)?n@8;hE}XggFjnb- z6zb=Jki(yX=RxG78TnI~66!e+g1D3u*WlDOg~g2%`igWYH@S6ObqjEz61b&sV(=m_ z9a}G{JGo>9xb}(3%e<nwOCVVV-V#Vwc}??bd{rz9>jT0solw5QFCQ1&ORtDU+!b)m zm8`lw2*Z0Kiql~tMmN*0a3a<hPTX;jRs-#pTgo|@%D~-f9oXaL4Bwbu1^+F0O?cH+ z7*g_*^eCre%8l1LwxH5%N`yz<$ShQp6%JWA5HKyMK_X;kdtML)spp}D5@BZ|PP4M- z`5{xv^Zq1nPB*`5Jyt@h7V9$JXtN_04O`zw%#S0^zG#W)P_^PjM9POTPP#+YdJwc* zDoDk8!u+S~K)~KG1PT6hqb*qwd2t&~JY;DshZ}9tWrsm5H#lGeRuCL&qc2jxManj& ze(`3EIhQn&p<ISbuAnEhd+2EGqN5uZE?MS*pL$XxGAl}v4rDavQS{~}o`VOD3HXvi zFpbxU?A(`B`$%2}3GkZfhe}=nS~DiYDonF-N5*}x2k^$#iDAa*+MHoC5y*rqxf47k zl!C<Z0-lvZ$ODhJB}Ujs>+nH1W9+r1p8$bT{|)T?-F#t=jUE}B2<O+v3k&XG@q)I$ z*c_czoVT9+tp{71j~w2ZbLoQE_TKJK&f5kmr>zzw@9*w39Ue!qR1SA`fo=r+o3?6b z9^7eR$CDqo_O{?ClygR_cNPR5K^7EMDj{<9iSz4_lpT@!-8d5Uf?NX^$oFt~ABL>( z468t9=Q;E4$e?F&k1E1I>?&QR?}`qJL6}R?QM&^LY!ZlzNw@%+o=!vUas%pMo`9t( zisf}sS2rd`e+cy3=Ght*pzmW?%yBah=v-nOj@QV@4MJmP$oLW_W6~oppwx|xrzPo( zsl1WWQ-d346e_y8PsYZn$>|y8P_#|~DZF@Q0M<*aL<yNi;vthzJ)k(B$9sMD%%qN( zjAj$W*^{n-vL>B0cH%*r3{nS0g6O~rI!?l*LbAhxP*rC8_H<JIrygGlFAO3v+k?7# z1C{C`x+#T&tG6A|IA}P(1j+i&-q!v)@NYY@beez})DK12Nn*$}Xgpxy++k?j`SEY) zozZ8HBkWLk6}{->MmQJ?XD)l15`0HS=EhN)5rAhEW|=*`y2>o1pa3UfkY*()MIm&& zx+yP#n8cW$*Ov?BWLc~Aa<#WWPT|3%R-`tyXa(NU^||UYzoSmK>zA?MV<Ygqtm1k7 zm=8jvtDg64z{2TD$@6&Z1KWh8)1@_A(#-%M(2aR!VGWhnKzC*aQ7Ubq<P97Ue)1z6 z5Rmdy7_!>5llTJKn0F3#fG$>SiN#WuVW`2YJDF`*bk#KU3u6T-Em2>VH$f;XLi+^h zXeDkT8A7gT)$Zqck7+FQm_}Z`8W($v#AI=I{_i$ufl4&w^s@z8==8fqNi5A0D~iOA tFL!NrvX+65p$1EWiO2BH=kB-=YWwR+V7^5d=}u(RssTTG)vTH;^k24fkOu$& diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/mouse_id.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/mouse_id.cpython-37.pyc deleted file mode 100644 index 4fa5298757429dd3201e5e9a6771c1aee3001ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2010 zcmb7FOK;mo5a#kBQnHjfj-5VH@E9E`7wD}oG_jplflRlyf&heo#ge;<sPLieQg&p> zhr$Me9`Xy~o_gvZ>Vemu`WJfY3?(Xd+!QE*9Svt^NArC<Gknl$H8gmV-+pGl)HLl+ ze5oEAl<#1vLl9i!B-Rq*6N0)P>xtnTrEbJ#V)<55^J|Ii+ojEnouuy9iT1t5End6O zcug3hCM;o}*Zc;zkF>V)7sS=tq_Djw4<1Ib0JX8pa&{1mMVPmZV(XF0(nG;G3u4ht zb0LQ;6vb9AO4LpBrgswDutLm@A2XFdl|ubA6>_#8y@=8f|G9dsrJ^_}Lh}jNe4P{D z5GL0z$xCfWxWUbfrf&fP8_-*qI<Im2!aOIw12$9C!RlNZyv`e?wE@;Ou&se-lebD+ z^QC5LehZM_D(wAiszjHcuID4+_E^xDEPSTi?k*(kB)CZ<9_q`~@YjT8z*3taa_w9j z6HexY>#uaA9Ksr&tixVgFU*uBqOguxJQeV2sp&+>!l5)uqnuLoP$C{K+(}WVG>n;2 zl>V;${d(ui!DA()8n6-Loq(ONbT+u3vM@_I`(hx{V>QSoB2^*CY%-duK`#mhD$2!Y z6F|Y93OF0b;K8452a-i8%>syc%<@dmwgWL@$5AG?Iovhu;AN}rMC5SKIonp#(n42; zijB@>CR>0HmnxYdr|U}|J6E99c@*YUiis?0Qsh&au6RWLaP44-k3ax_<U{RD&$YRJ zPR{f>`~st-WYfPZUO>&IET(EA!YC0bMPl2eBF>0XtWzV5mE3@ErCqM0R*Ku874@Oa z5;}%bMw@~*(=^>74mrJDWxw)(V0S8hs1iy=Sqg<v*fEqm<$=5dheL#b4^}R&63#tP zupnMTcm8Ue83<`i<_6a8D+Ff(IFnl?xSDtRN5j4H9PRb?cKYsa_o(0XcKY|!r1K8& z*N#0rJlJ>NPFT5ty5{xhpzFCjOEall?jCrs-zi@K+Bdut@tfWi;mTDLJOTN<`^1wU z_73+jD1<xRy%y}gw~J^09gEvNa=nAT>pkxEzPfg-4{caexr9opZd;ewc)l|fc{s{a z(YE9k807mXJ^)cz&vC%~M-AX5-UZJ^4cuyyjkjw6J)k@7^duO<L|k0=)hV#5UM#mc z%z-%>lQCQ`C*{TJUX`y==3Cgye)1btV@15JFH-*mQ-7;kow63;|FNDHZKl6zvuYDY z7)%pv21<(trAfx8G3rf9pHEr5+_5R;Sx9M_O4+={S~+Q;xkni<Ol(z<}#A$d6GV zT=^-8qP3h$p@?G$vdR=7zK2fOUeW=9A2EfDIJ!wT44rIPIsv(^lXBl{uld$w2B^yD z{^!+r>f9JlovNBUSI3h?-u>?XJqFWLiH=-;!C?9>KVeGZG?&=B66b-xwTfK&z{u&a hNwgpZ0lvY0Ww1D3FKGXkfQLd3ntGFL8ck!J`~&JX3oHNt diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/reporter_line.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/reporter_line.cpython-37.pyc deleted file mode 100644 index 90cd0e3a2aaf0af8f49081e8e8c0c5ae65fdb562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3972 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 SHH3%Sp^kvEVlO#M=Klb78Yc$; diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/sex.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/sex.cpython-37.pyc deleted file mode 100644 index 1e160953083c243ecca38b4ea221c72dd19e6ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2107 zcmbVNOK&4Z5T2fg$M0mb3Cki7b3g(g)<)vSOYDXOvPv9C7DXCa>TOTA?eWgT+dWR= zD0@JOw5J@na3P#H@jLhzbLGTe;6zp1-q^{BZEJekRn^tiUwu{cq*f~%FycRcX1_Rw z@i+dNk0LC-fk!=ui5r|mMofG{aBW6rZ26X6Tag_*z7rSxLhSmkmf2A;F8L+BcA|1z z@himm&fo>^UK-pLmM92ExT197`c+;$G#aIU;1r`la<_f-WIK!mEX&`rjO}-aBFGw6 zzVTG0$$?;;btAEpWJ2~>Ao7jfFjjZP>+O^79Vz(KUXEm#EqMXO+7GG9`ckML$3jl_ z!qYGbFr@hac=S*bUc&GRH++*5-x4-AugPnpN4Ul9%c}3d<y-*Cxi<BM?F-@;K~lUX zyu{0wwqF8^vZ#Pf<=Wy^Ub{q_DoAS}tHZt(zN%&Q*M@EQD*({F+&UDeXAhJ(_0pb~ z4TQ&%FlLeW$zE%_0XMKf6_~Ry@omFn!K2n;%8UzRNH{qs+`KX|GvL%}OC&(U%<Y85 zB6p5iG#2pJQR9)2d6CjE2{TI3LW!t1H79wA(ja0=QTnIx@2{JmcYabrsty}4-t4jy zmP|U26BeWiXP<RMa;!S(NF*wNIUNlqs<Rt*J1We?qY(>Uu)cu3Q3MwJMXM`Wn9#Hf z9*<d;%1Ns$2JARYWs3tLK!c1>typA0hK#k;SWD=QK%6#56Iq9=t>XPPDCDdP05%tH zRN`TfQ7J|;FG!J%WwHbxLbr+A(a*U7z>$YQ{VTEn9MOQtdtd<&SwW=aeOPP3bXtSI zd8sGUm=1x!sGY`Rp4Bj(H<|{Kn5Tfigah9gxDElc1i3SYMu^9ov%C>m1qJL}f!FOr z-7M8dJ^<Yuf(jlvlS572pCe0^P%2Cl8uHwYprR=6PQyVIa3KGYP&%BCV1ZQn4e<Eg zdS#uPL*v{+{$H7|Y{1Iqj>f6bKKrZeEsVph-L1`MUcZTa^By01K-wjP?SuV2?{-+q z>#8NIr~5l?kEcm0mB+pPHt3uBFI>R;%Hz$D-?i_Hgab>xK5poPiME_dVc*h*qwlv4 zw$Q7#I;(%Nq<seER#2G){s8#8grLTIA`1p-A{vg|0D$DXI6Z_ZcV1#sx#7wkY9QqA zfu$<IWR$9;P8R5aTA-JkoOFB88mEa_taMD0PRyLDLtX1S1!j95B6ygU$~0ti8s-PE z`8IconwD_h$Do|^RoBm4(OAXqfLWw8FH;()d>rArO6kini)I>^Ql17Nwg4_&k$FXT z4k*?^%5xiQP`-m9AWw5EOfrd|9{D~_cuDyoDr&Qi6No6H^d?@o9M-tRI+G=sYVhce zS2S(1W|{ERVTO0bB-*0gsQJ!l0=Lut{ZHqur+KIKH0MlgF18+tc>6p5cN=s@C7N>f z34_i$`-Ulrg(b1VB<BBZJ)g`zYm1&;^tbUQQhjE^q9z-KQ<xF58#EV)S^RRE(yy@* QDeN;<vr5*jD*RT-f875S<^TWy diff --git a/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/subject_metadata.cpython-37.pyc b/brain_observatory/behavior/data_objects/metadata/subject_metadata/__pycache__/subject_metadata.cpython-37.pyc deleted file mode 100644 index e1f3db82d4df7e04806a156bc323e6cb1d6dae3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5312 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 Z7fm2_t)kVndA+Vz@?U&Q(Cbi&d=CsnCXN6A diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a6268a64b0428d82ecbb3f09b235a01ad5903514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmYL@zls7e5XK`|9D)yGp(*U-I8LuUt`WOHm}~|&x=unSu59TO_z+h2O4s@bc2+lA zh#!2v8Rj3e8jnXxbhw_OkGCFA4J7##^HAW`T1^H&zbg0T7ao_dh1oD>Hc*3~IXD4z zW=T**@-R0@Et{B-xDv)xcWl0cGaL#|6I6THqU<(}O!&Qa83Nhp<YEgY=1x1Tp$#!> o4+W&N!>X{(N1{Mm%L&nIYXgO1?JRYFZ|{fbj}3nGkKV=VAFql<y8r+H diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_acquisition.cpython-37.pyc deleted file mode 100644 index 78adccd22d9556b5dd66ad82cf7491f6b17e10e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6388 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 VW!<csRp?#StU9&QVyT9(_Foqk#5Di_ diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_processing.cpython-37.pyc deleted file mode 100644 index 23bcacb47728c6da5539fa156f5a497825dc2950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13457 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 Hc=rDQN)<sD diff --git a/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_speed.cpython-37.pyc b/brain_observatory/behavior/data_objects/running_speed/__pycache__/running_speed.cpython-37.pyc deleted file mode 100644 index fe52b97bdc3313ca10cb75758ec55a0b768a46c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4806 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 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 22598fe538fa8c718e0a187e7667835684936cda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmYL@y$ZrG5XVz+5Wxp=uo>J$#E(^6#4QjmO|Y?TQgUgfqodE^<SV)Q2yRYZ2k{U8 z-yQeGZN}pfBUSe+^zqf>r-YIf83zQ-4s4R_A1w6cKR&nZTpZB^6p({X6<ok|V(lRF zPQy$X*P`&XahMT(op&g9RtdDxOl!yrI2qb4OPbIHR{^Y(UeU!Cq7NNcCWqGgz%@jm i&e>!UIYwJGrR7puXQPy9-93kk%Il^y%l^eTnSBBLUPDU& diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/presentations.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/presentations.cpython-37.pyc deleted file mode 100644 index 62a41c3eb892a96fd908271f368d6340d18e4eec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7122 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 Rf{b>|rnzZ!jHcPve*>Xl2T}k4 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimuli.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimuli.cpython-37.pyc deleted file mode 100644 index f95dbe5a2f6c5ced381ffe72ecf76d8ebe2abbe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2556 zcmbVOTW=dh6rP#gwb%CAah$Z!(n7fi$p{=Io<Imeii#>#E}})1MwV7<&!pLOcfHK4 z6FEvAP$G(u@(=RH6Mt!5dEzhd#5uEGI~O6fU2D#qIXiQ%-<<V!yWJ%4q<{VzISoSo z#zpnif%z7O{tbvAf+i%ToTiL3iffiQsmoo<JBgRpc+K)|Qcr#Erw!h)YcFZ0E#684 z9@up)X{R0Dv3xyQOS`;lc|TcCd%Q=<4@5LX^OT6D^kqv1vU5`78>01u^n-uE7t&|O zf1DTbG>a1BK8khGr=~u9w*4SZB(TAgB2H(?Oxrax&F`ZkdOY5flfv|>cTeL~>LN;W z4eIVzQatgKj6^g}<io6xYA2dVvpGB%Uz36%ls{8(acMWm+dnF)WmZJ!qXt3asZ8@E zDx{uZ0M&yj#z+4FL=sK~;Y>Qx74)3FBs)|v;hYBClQroG_nZn()K1+K%IhF;t)wn| zEAeGRHlZwyb0(UiWo0ed5Ism>TXy8yEi795+!Y<McIttSu57{y+}{=Jr!HTANnFBv zkme0jFB1|&Zrb_9U`(S}hT>S~3BlQgfwR5`q#!3`j|zGOC^-YP903=yBL>tF1PnMs zUe~rrXu-{*R2pwTN@lX}8c)x1sf-_naTXV0Xgc9#7n<SHhrVN6Et4J90kdii2xdDB zCrPAr82&~6{r&z|qo1`@dKB$OVla*lqHI3;E{i79OhjLdWVWwI(_ChH0(6@1&h_X~ zJRa$|ke}tz<VEyc!r3H&9pc5-SVeIbPRF2eKPskbzBQJ+(SAHtTLMr9ZxCjBYY|;F z5AwO%0Po(0p=&@0>(UxM>@M;=sDcIeYf2U~l}#vag9m3E_hHzxM`RC^NQZr@HbDr} zO_&raFUc+BFeUH8&<qG+hc_x)m$Lb4W^RCn|1pC}{{Tj1X1y}ADiSmG>|neDcT3%d zofGR2FbEnPHnNX^DF8M{0Gu;=%nG*Tox%a|I0z;S9`NKH*xhFr%I>Nbh>X9ZrfCS) zQ~*oW#%-=~CW*F349yKKu4d{E?D`nSqA~#uE>xycI0QZIvaB;5VlZZ7xdbdPx`|m! z;uK(8Ov5-u?35v6nD}7rJs39RPk<>yw&Bq;=h!X7E`vSxAaM7{6OIks9rhh{56-Cf zkzmpx1y-=&SGQo1j-K^?>835gDls*67Zq6zOO*;SquxVu1yCP?>{A#T%@EI}41PYq z*r$iLtEyi&xGXo8{ZhFR$XH~U85ErzTh5l90R-SpS#D-)$8Rp<xP;&e4UR&Tni^yt z>u+xcD{ls(<!UsDw=ZF69|(ac0@`7Rohpt}3tqAfY(?0jpcOU4FrA87f_xB$zs#bf zd}Gm9Vh-=Q@pA?3L>2QDL`}<frBoKXQ=u>s3W28(4hla73KOIpB$#T29-8)|nN4Jp zgyAX(i25zuWUo5H99w`!;xk5j9;02S9KgGG8uls-`<sxTc^+raSH`%P&oN=>5g$~Y zZg8#B4XREzu$>OEq^<M(^H)B!Xpai7fsL6zeBHCq!nGWz#YY;x5sR<1R#->{e`Cm- zDm_?y%P%U$KS=z+Ydcv&H6C0-ss#z(eq&|Jj=E}YD?pSS!om1ommvKHKO4FSq{{*p N&@Ssb0sg!W{SS)$i4p(+ diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimulus_templates.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/stimulus_templates.cpython-37.pyc deleted file mode 100644 index 937bbb64700ec1bff770e25eb86ec4658de4bc25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11069 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 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/templates.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/templates.cpython-37.pyc deleted file mode 100644 index 67296f6bc2582b35d2df155d580098afd4fd1cf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4381 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 diff --git a/brain_observatory/behavior/data_objects/stimuli/__pycache__/util.cpython-37.pyc b/brain_observatory/behavior/data_objects/stimuli/__pycache__/util.cpython-37.pyc deleted file mode 100644 index 4e21b81538e233c33713e2908b296e3fee6d2a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1999 zcma)7O^n+_6!zGT<2cDSE#*%jVO8P~iDsdtLMn)5yDF#>-Ii`ki-}}SGL!7=`X|hc zca_KiL0gFnM-b2=we-XpPF#B6L@#gzAL#*c<c9Xdn@OB@fddm|=K1-(@BPm6sb<qN zV8wSn#Lu{fabG=@%Ld{#_=^E-#2_d#0(F`Zip{`8inbyvwgX$!c2tR-z|nLis>W{M z0_~9MH6y4|k9x$tX_6Z8uGvAI+SH*9Qom`D25ADPNzjJTUit%U8S8CS*ypj_gwx#^ zC;iu1M1iiIelKIAm?jb)TIWWaV{wtibTwkbgz`R8y0Fx#oL_^#Xuy^mx4?a3-ZsI6 zwH~+^FRY$fKePTu;7X2J!jd5XRyiF-xDSSc`Tz_jIHn;>zA<<eF!rvmo$Ou`l#4Fj z#H7>1yEqwlR}<V%6M~O-X|f}_>4+wx4|}Sd>%Pf)UBM(hI>P;JJfxr-0k9z3%ROZ{ zOnZR1gJsIc%RRb@cUa1o36>b%Y|*|H%R;g^i`a4|S=1Sg3m?qwP%cB|;s|mS_OYNW z5dh01+o5$8wF#Sncn$WpSuC*_jE92CP-zqnr!wQozJw_aoiNo95>j>*ZK;Z&$qCPg zwIMkh314nfUq~AJ1D?kEX@TvRNz?LelPk!=R?=<66|7F=Y=dSqibF&2XrUjfgdYI@ z%zK+Rfo@wxO+W|eaElr(8-S}Y`#MY@RGi9y4&Y}XQ~+Cupij`$9DBLBWlpWjM)I9) zNNd~U_mDA#rk#A2qb++{A?DP{9b&y?=+n;a8wRO-RX#g&el@QE-<|PQBa^ynUa~|E z+;pb!Hm`11`RBPab#s@rwDdtO?aE5-UPT|F9HgE!rWRN`lv{xI$P7(7x2m~w8zJMe zK@O9{Q~Q1Uit&z-m{*M4f-*ch`Ed<L{Vc+g3O`O020h~w8sV{@320znWl5Ky<DVHo zWw7)Im__0_KT6YW;b$XVm;I``irY!LoA^68$^d!*u!}5rJgsv9GeLzWkIvVOpC!<p z^fc!w*9_GtV4NkROg=#I8CXxW6)gqbumm-l9637+V?2+eKM#<liFTb5f704za?^iX z`8G2%sVE~y_Rx{Zv!04f#lAnNY&7pq+>59`si}}S8=my{kU#t@{`k)?FMql+G!OoE z@7I^_tPH=u`pXxmeg{tTt?Mg4+yLVK`MdRZzXbw4@zbr_AAG&ib|%%e)w9RWcU~xo zV<mCCBwj3u6BFm`>5X$B+wvBv)ZOh*4*N+eAwjw*;HXqSPFzn{@}xg;eL>Yg5$kQ2 zS0GD;TVC{_IS(_`!iD!BD@8?DuV`F&s3L{Ci@BO@qOcX!uIaRMb;W`zo(;{SG6ORy z4VLyh8`S6eVJwD0L(7FK<JqXNfc4MY{CHVE8t!xSF|a3|ht2RBrinb%LXK%87f$$B zOjQ0{(?z!Cs&`MD{3+0BFL4D>RMq5)SWi!tpi|D#&cEhpr<|i5Jx5jc1h)Vpxb(l3 z=EJuWQ;8MI0yA827P;c;QxhCrV6#M0p5W*|JX4n?RQFU@R!`@`5|ZmlS5yX3ilq+v lq138x57*PueI-sw7SUJL_f525b5X-=poZ13T)R~@(ci{hKz0BC diff --git a/brain_observatory/behavior/data_objects/timestamps/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index ce722a8303952a9d7fa5eedcbd376f1c54d03bcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmYL@y@~=c5XZA%AqV>)7MkKZ5%HrH8@VnJCY!;H?j|7<_t^6KdkZUH$@U)MIxA-j z@elvs4D-co%JM_7+UpMt@o&IO1t%*ujTlxO#H85YL>kI(Jbt%x^+lLSK@E0h;2V6e z)*h<hEqp5U9jOq}Q^gFi?n&*OQRFgCBUEQNBJVa0PuR0G37pr#@Wl>tNWC;zL+3)0 m7BX<>gjFV)U5k{VjU=^p-es+4vA>TOZLpUHm&2F;Z1DuuFGP+2 diff --git a/brain_observatory/behavior/data_objects/timestamps/__pycache__/ophys_timestamps.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/__pycache__/ophys_timestamps.cpython-37.pyc deleted file mode 100644 index 10d542d8e262bd9c5e64586d0dcc822d01c84564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3833 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 diff --git a/brain_observatory/behavior/data_objects/timestamps/__pycache__/util.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/__pycache__/util.cpython-37.pyc deleted file mode 100644 index 2598dd89ec5cf01c100a9985154a55d0c6c4c55c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmYjNu};G<5Vez(R+TC~0Dd3?&A^5b0=l9uh$XUAU2-l>o7j=<6h*KgG4K%#R80I* zR;K;}6X!?>PI~Wbzq_Y9Ur#1uMp1n{!z1M{fBB7&4wnRbOoR-1$x<%)I>6wKV~Ej9 zl!nM}Sv=TN1)Imb8@r;C)<IR<ocl)#pGSllq4#p^og*g>2;mdk@f|;680-S_3g>&@ zU_8Z97pS@$7~LpLqe_BGBP^E7n45s~Pi77%eZS7m#GRGK3RnS7Gk5^iiYo=VRtTp; zs;w2emdfVDx?Z(b+!UFxg_9>W<Quq`)LWKRftw^VP^g8@$Z-o!n>NYh3butd34#Ms z)-rcC`P(&VTv1NzwmZzB%oj@om0TEbGNSRUAC+<A{~(UifoiI{HC{=FG@dcg_FBKo VKN?a+H#)C0Hl@7q|Is^*!XH)eargiL diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index ec387fde1785c115f82d69707fad481407311e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmYjLJ&OV{5RGt!2>y^OG=-groZ5<w*agC5Gu%dZlaR@-Z0SD{to%#1{)FqUa<(|m z2k*_}%?Gm{k4J)0-!9PCXD@#ku=!%r2a6SZ@j2MtMe5^!`MqxD>Oh!CK?!zh;0(S~ zD-T8R7G?^4ODaV4RIr9vcBHn>C~_Gm5sDLhBkxufPuP<*37pr#@WmE#NS!oTLhC}3 s7BX<>h(#uuU5%8XjwFeFQ#GXDGOe9=S?g)+9>YZ)Y*XQ~|NMt3Ufq#Q{Qv*} diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/stimulus_timestamps.cpython-37.pyc deleted file mode 100644 index 940676e58bba7fd5659c81b6fdb32f8cc954d046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5089 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 diff --git a/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc b/brain_observatory/behavior/data_objects/timestamps/stimulus_timestamps/__pycache__/timestamps_processing.cpython-37.pyc deleted file mode 100644 index c3a03877c287ce8b440a3b3afa920da2a4fa0392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2672 zcmeHJ&5q+l5O&-7n@qCI&ceV5fm)o_%Zx9;Wwk;(?42FK?j;zRj@?N-({5Yc?Tjo< zZd?&B0MhP}1FymZ_{xb#fD=`n*pvC;fRMO=rS9}^)mPP3_2skic<8|Q&66KlcgJyl z#YyvdFn9`0OXw0OA;QVXgb*CN!p*#iXUCrCOuDev5xuNG=@W+!c=v24>Hgp*y`=wb zXENMc86-Qfvdak{ac|}xI`-@k&h927*cm6@mySRF4Rks_sk<*_noAgTPMKMJ4uiet z#iG(L(u|*obS}B_-Fl==nw6r|QE@Knp5mrdGA1YkJ~X5Q?HM%v2)au!<`9g4<{dgK zVw_hb>0FYT`<lFRUpq<nU1#N9x&Wldeg`qnr-r4HE>m4HL8pAdmT9i&T5C!{c`D~L zm9t!B%m83IQ+Y;Ndvr+QYe3RR0l=iQRPbPEcTSmN88=*MJ3Vf{YxmGN`j{qZZ0tJ9 zJh4;I$W%q+Tp~`y(&{P{*Bq8Ds@p(YK}o6b-W6o3xz->!pr?N!f~Feu<ccSht$`yV zCMi>jRWzTWW4Hz<m<!I)Ct#$e5ACnr1DAo(OD41r!xl@H3Xy6K<|KOKp)c%{UUQE< zE{i}WR$qJj1u8WxD?k-I+D48~;c@838-TcV&<0g&e`B_lS9epxGhGjwH?MbF$eC6c zVRLAZDBnNzz1o#U-CKb2_`L4LWv0u__f!}5>)ujVGS>BjMsZ}FV{!iEs5juuA3r~P z9KO^L1tD9oB$%=bCads7GV}!dDCBaf!@S^9$I$1P2cbx(p$3r01t?{64tIrs6Uliv zRS*nOJ_U(O2JcjbjTK?S41=9B9vdBA0SWH_x3wJ=DvvQL<UA;<n$Ee28j;Z*SD~Uf zx(A(ee~%mxbst7|XXOX5v(Cy*Ho9Bc=(X9{`9B-~%h{+fpl&9eLIzX2*o~mu<eM7f z!aeLTwbtDpjOsTrYA+U?i>(ZNA9gm8I>1QXhdJ=d4(4oB0P`pe<2H7YO^{VAqr3wH zW25&wvLct{jD+sWU3r#2T=vU9;Sbagbg}s4Z?HuJ8K}aN=U3XOBZ~C-^;L~raEfM8 zlS9eBu7#QfGYyw$Iv4pANDqp{4UTJtv1wi!3jAx*LU4+;1<I@9EQ1QngL%->;1RV& z>xlA-M@B)#0-1g*=ynaZTmM?^Z-F#LjefWW+;X8k0e?c)fq@L}y9%RW@^&oJqTq?G zgIkg1chm#i@3Zy46&sT^iEf7Fdl;71J9kymk3qybKKF)XNYnw${d;xKR0ViYxiGE! z_@F=s3L~@b$}%e|n;etlh7tlxUXqF67B>XQ0ue@nwWsdj-;BDyAy-?vZC2DCJgwEg hWr0mGn_Yt^S)P=Fe~Q$oF(F4}<PO}CxBu4u!JoBl7ODUM diff --git a/brain_observatory/behavior/data_objects/trials/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/data_objects/trials/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index cb7b657663b70220edef669e0306a2159b485ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmYL@y$ZrG5XVz+5TOs^U^BRhh##xCh+80BnqXtwq~v0yqnq#H<SV)Q2yRYZ2k{U8 z-yQeGt<!YGNcH^+eSG!!DWPOZ#sNXIJsT&x2Mc}qkI!v069+T_1r(q&1s8CgSUJeO z(=ZjrwJ3aJ9Ogvd6dj7KRRV1^lLqn<j)r!tiY9c)RRHUxS9Gz3=tIYqDWJ7Ja19Zt gb252E9)pDnxs=w~C}q}k&*8lG`dpbs|KXd=zOx8I(f|Me diff --git a/brain_observatory/behavior/data_objects/trials/__pycache__/trial.cpython-37.pyc b/brain_observatory/behavior/data_objects/trials/__pycache__/trial.cpython-37.pyc deleted file mode 100644 index 29a8201443166f7bb3f801fe41c9e9344111fa9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12464 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 PRl){}6^)#c^soOfcMcv? diff --git a/brain_observatory/behavior/data_objects/trials/__pycache__/trial_table.cpython-37.pyc b/brain_observatory/behavior/data_objects/trials/__pycache__/trial_table.cpython-37.pyc deleted file mode 100644 index aa51285f2c24230dbbf3678285953d51f078cc4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5263 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 E0owhSnE(I) diff --git a/brain_observatory/behavior/swdb/__pycache__/analysis_tools.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/analysis_tools.cpython-37.pyc deleted file mode 100644 index eb0a7e0a5f94d3e2671e1b5743fa5aad50fa7c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2690 zcmai0&2Jk;6rY*3osAPa&PQ9)9+(q~QJYAO#G#@nrGnCeIPh^<j8<dM*xqKnyP6rt zwX_kT1&K@V920Tke}R8sk3~YtnHwC+o0(lF5g^9d`JOlL{oe1r%=@iY6G55$^erPT zgnl!Fs;oih06z6QR2*>}qrkN|z;;Xm&$hLoZreuC;DmeMp<s#EcpX}wH~12?%c9Bs zLn2=Z@97F(7OTAZk_4?QqqbP$E28~^1Z&V+wY`pLi?waUTZcsbpx2*c7<XXYhVhSP z%-48lM1l?Bi<UVpHuyT<cv<g}U^Cbf-sv^53H5cp$+!45ex2XoE#BsD@NIr`)I7t7 z<P57<RucXkb#I-6t?1JMF%1+Cz8ZWF;Zq%`G&;pO&e0h;COLr<m_32bO$z0a&{U5F zO$3udX*!f_BB+igFkq964pT{4GPg4{OQS?L?YS?;k)rT-7$uz1Bn2sQDt4)zmqJfv zqO4$87tbiubT*C#V>(Z#be2wIZly$t64EJPuC(&0PALdrQDV=l6gH%i3rW+Vorxo* zZ&Q`hXlTS)K~n`vgBk9&)EzY&?V-vV<*tw7n6h}r=8BF=^VNjKv9aGuTbOT50M)_H zn8^{S0K>!xk#JKs1<fnbbjM&|rCLP>ajHOG*P-=5j?_IX+F*WR>dr7uneN^L*c|8% z0SgjKK;9*P7*|{oVI8FCjx$rzB->?DvUztQt=s{)2?p3(-#Udpa~`_Tsq}y7{J#T! zF10EVb<ii`Sw#`!9x&c&)FnluA1N`=#fodgSPXU7E0!0w7R?1#DrjA~?q?($K+`|J zd3dk)B@jaO*qHI%KAQpadJhsdNP%SgJ&_!#UYdzS4WLf5@m%#jiTXViX>liGgF`kF za26byD1Nxtm%yPg?SsT4rc*iJ>x(fvic-0!X1u@05*E)@q(YshvD(e%#X8U-yrSBY zi6IkAsI!Wt5AC3CMo>%=GJP9n5;{40igNN4L6~<mevWhRxULBV9(h5I8+k)}d7a~J zl-IV<3w#3|FO_rT(wwhrr}Z4=OS%6&%%9<7WM{~wnPpgC9-2V**sUs%okuPAj#xYu ziZYo_6Am0&_<&ATl#F0z23}2Pl#5}M2o7AP;5-0X{VQE18wlWcMX!>rcGg{Wg_e%O z|H151CzlH#&{>wnkX(TMPNgf7DuQ3Wc@b|HI@=s&3GS{g6NfemF624!p}Rj^AQF~# zmr*o}^q2yD?%%)Ly@(AHvtQl0dz<cm?ebxTpG^*+rPPYvtsta*0g>v`(c&J+p)TVY zS*8d8o9-{pu%Q-m*JU5GY{M{=Oat(jbA$^|JHJS&20d%6$y0+A=s(bc?^@F(24bF@ zs@o{)YRocGv>zywb)z)-K+05FRu>*bd_j_|sJk4}Eb3OKG~}0t=f#`<gJIFU(7I^2 z&B3Od14J%B4_4xICZx+X!OAqt76Y3ktQ(ch39d3xSll$hX?6OC7jMG4{ZEJ1I;4i1 zcnf|T@ROUcGVq`>#aLlP*@%4yIypW?XXx0|_>|-b;?uM7Nlbj&k%>$@Dr2#h*G$xX zYGIYjAfj6<YLJcQ5?&(kgh*I25iF6bW~naCb0jF)5?UXZ7Fg0$<df^LO>UUIHGA4* z!%LQL7|YE<2>Hz6x(_>)*@m!>-^TJ9^a?)=Cnn{E=NyJz3@;o#&%|iols`T?82$PS zl-0)vBXba;s&n%A;QX)GuV0@VfSgs>>g4vFd{`ZLRCZ3P4g#T8)JfGrPpX-!gFZg! z-Y7gZR|QE`P*0|l3a&;5VZmTN<I=odEETQK76v8o90|jq!6ZvYqNv+ou(&!>Vpib3 zTrr2uQzvNX5OR_VYQPm$c<|3aw$0)Nq_$^hQ26goQa+8vdnP{ATTuCcru`9r)8F>% UK5pYSY2qg7;0`e>1h1060m%*d7ytkO diff --git a/brain_observatory/behavior/swdb/__pycache__/behavior_project_cache.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/behavior_project_cache.cpython-37.pyc deleted file mode 100644 index 1d9761e02d824dec7dd23c464a92eea2cf04ab5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17478 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 diff --git a/brain_observatory/behavior/swdb/__pycache__/create_multi_session_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/create_multi_session_df.cpython-37.pyc deleted file mode 100644 index 50e84dce3abff0876e8a40d6b562165e08bf4301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1569 zcmcIkPjAym6!$o8>ZVDX{-Fg4i5#f}G3<(!KnOvB8v-O)tu%@>8hc*iN$s(BW|ENH z5Em}}1{_*(+Ap*RUpes=IPvT>(4ZcRt-P7ZoA>Yce$R)kR>Q$3{rsN)Rd<{(<zeyQ z*?EjV^FIpV2$DE-z7k5RvrB8Zx`~&r&^jq~HQcXKANQVE5p}UD{7)WTgZfDW)=mjs zhxK8THlaCeoot*sbQ9WQ?E@hW_`@w&hfUEC>jPIbk85;WwCE0O4|l;CUOCx=9kFrh zicQfzcJY2&Y%SSsqvZ}-?jCz|zp~svXL)7Ga<8-$<c)K%{}pR<ULKHQFNBznWu{rK zvmr#5MLdcDHESa)6KN%w*&yIa0xG~O1I<$tgqllb$H64iM+2RWaucZNc9zFe6O5%9 z@q{h>25<g(cF6v?bNBwQ8YZ~qEagh}!PstO#<N$K6G%-$)|Uxp{`PVla>bLWk><>6 z_&dC^6f7?x=?+b%4m{dgK*MrwW7;gM3b_F$q^A4JDg9Jj|3$IzS~;0r8-N1MtyF_f z3Ioopme{OR^l3YSBw;3pNT#5e6m%<!xf%eIDMzVzTGFBsWlA6|GG%7ZF9nC$jdYY) z$qX2SZV?Br=6M+=`rY^*bwwW|*N$L1I}n+I&P3X{Q>AWhbs`Pt3hF1^#AQKmY2#et zE?uoOV6=zSpLH&Xd3IqQbhiC7Ql;o%5?2d1Gt`Uk<x^VExf0wIZZ7D}YCeoO>Q<A% zve1AYbDQaDcQFWEGZCS7F*vP-d8BK&E8LN#jcVdp*>$>mcs7o&=hOJK9L8d$x>5KG zLeQOR)EK<WL6_aK*sh{JQu5ys(2b?PO|g<|99DY0!U@;~g=6<Omf2AFhL7h=tJ{pl zqF;C=3kz?UNp*Jn2h{&Lx{cLT;@iik4|;!N`KHHXF1jI~a5e2cQM@D$|FZ{bY<gJ^ z%0wuuLV7P`*fY|??VLwPNH(-BKR5{J{8Mut&|m>*Py!lUSQXMHpBDbZG!vr)9uZ8= g+(hA%@@<l4%_ZgQ*BYcw8m>=viAS!YZm(Lu14i)?m;e9( diff --git a/brain_observatory/behavior/swdb/__pycache__/run_multi_session_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_multi_session_df.cpython-37.pyc deleted file mode 100644 index 52508de6fe5ed14503fb9afafdf8ac6f740e09e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 954 zcmbVKy^hmB5cWED;^cC`H9P`Rin|R*cOb;^R{%mtCz@3xYwevlo7lT%cb(vL6qL}? zTmhouQFsNnRQC#0jFa3+APU6JdUp25^UZuS5BK*69**McJN~`nc|Y3C<>;aD06(ix z2~UvRW80N50%Y!g?g;-2A?;Zw4~me58=K@^))N7XM9BK0D|#Xledvq9dB_G3LNp~} zPY{%$*gp?o@X7y3=6m9rxc;H_M$Wv^jSIx|Uap@|p68%wX>?|IVQFHxRBlOE+AK1o ztI|@H9_n&dqaoA9QK{7ujHA}1v`nniI=3Uz^k3C(rqwf@tQno@0%*aFR6L`nEx_61 z=UXHz7FCl<_-J8f#3z>F`YHq@>}LQ@0WL0nY1ld%PBrB<<+9+mYv{_l9xys{2V zJV#u*ls1W5tk_ls23p5cnN<cX>+J|&!R_%lTlbDn#$%ip1nC-uP57pQ3RtIrf<-Ij z&dCC|WvQAjdKS{G@BW@XS3K29@M8*Uxk0XY9$zLLZ}^Z{fDL`@;LoJ(C}<A0modDB zv~oPjf$i;%xXCQ*ZvbNS&w3by;srb%5!Mx^HkBF;8(-U|V{6+4C3mx?%gYj!V9{m$ zjE~u|n^!?$H_Rb*amv#fW|x%d72s6nV8ZtK5TUR-&PkP_dqn!?nIYb6)X(>iPA0Fh z!gj)ETpT5Q#Z^5y-LY|J(y}qp7>7+!ZyId!LM9U{9UPWCUGNO>-?n-FrDqWSZw=E# k_X;hl9PYOTw6{=2BqBqUC<y$(_sLeGj!%M}-NhHb0G{|apa1{> diff --git a/brain_observatory/behavior/swdb/__pycache__/run_save_extended_stimulus_presentations_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_save_extended_stimulus_presentations_df.cpython-37.pyc deleted file mode 100644 index 8cac9846cf7a39dfc9b456616fc412a0de4ecfac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1554 zcmb_c-EQMV6!ye%;-pEp*%nqjLL|0MTachai0u|G0KrNXsx%53jXfucQ+vicGj=vc zT<`#Ji;#NJ3T}89Uck3p?JID_aegY61&N>a$j9UH@pr!Y&N*||?{^)%(jUL!zj%)G zYyGmlIym_NZ}Srx;RupAbp0fh0GT&#T+z5Cq+WBAX6jLIH77}nwndZr!lND05^dp& z4s=BK+M`{uBYL7QcCTH!1MQn0?A#LChyHw5+<U{B-=lla-h#bz=gT+g06g#~MC`#p z5HYy94})7G?q4^d`+eg(GT#^b;^141|1`Tqb{Ed@wdcsx`K<gf;7I~9$h4Yjo|+)k zJeIZy7D``DwaPOS$mpTUW=ovJ(bZw5WC7X+Mn^#w8mm-dhNS8|S=yPBAFHtZ;eTO1 zs`*@;f3gNK;%ZHasnCEfxK(-?gfQbptaM-&A`A>KfWb2hQh;E_#%Z49hGiNINXu=k zq+w!mm@P~GpQ%L%X+g6&@(7McNAHf_IXYo4ho<d~g48{Fds?<frzfM+(daorxrbim zJ<TBp>ZXuVe}UQ~TYSwjS+x*a#JZgR8;(V6a-Og|K`t)O&sa?__|q3AxaBP6GM<33 zhmk4D&tFX-xd_=LPQa9xuLclPsrecbt>nqjrTr~)mT^0yy*g;f4KP%UKH%uIG_l$I zboXI@Rkv6h8EDj5S{94)IGCvvUMyw=h?ErkBmh~M%{Iaq`(jnq<%5^YOH9~TUk{tr zVC{lIAj&Nd6QDbrC9bE2c2>X)acLVfEO`na4GC=tz0|oJ9#jowD%UJc)vUKxwRo0c zB~yRfT)Kg!Lto#f80%WiA+jvu(F{u`%%Z!1bs97tP7dv1C}zOgSR#k+%9qWJlJwwg z(>zbsIFD<X%3FC<{#NFyRq!MSLw8>g&)@;{M=`6`MCp{<%Ei6>?C3p=y)wUDKRz9Q zfgNkce8$CL$QN8L$B(u;k87RB3U_KEw5vRgKaIn&i7h<Lcyz_5fdAHq!9O_zF#KOM w<KLYFmH%F<M4rI=bz7QaG(Pc34~O4q;%Jcd@ZI|9yWK{w(ZyMFvyOh`cMK>Kn*aa+ diff --git a/brain_observatory/behavior/swdb/__pycache__/run_save_flash_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_save_flash_response_df.cpython-37.pyc deleted file mode 100644 index e940f1867b3a4846d0e3882ea8f7ca13b96a127c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1516 zcmb_c%Z}qj6m`XM;-r(F&U6Ff6CyF~beIJ*8X=~qVF3sRwa`eVpi<d&lQ?Zxd8*1z z$A|?xBm`SFz33Kf_yfMhTUPT6thml&V0cJ8#$}i5<#TSGy2q#ee%HY({r*e-ljk@; z*PY$f!NxoIm>;kbjv$FcH*Z1-kVWI#6^$E0>M=KIrXKayZIZNTTQsRJJlYX0(H6ew zKu2`1JlYj|q9^)d|H`F%(7x`$-VLFB=r8ugt=FB!EqZWy7Y@#x&)%Q|@W7uEaR38B z#Nhfi3~q?Hebt2Sca3k!;!qrlqi>M^Y4!x8J9mb!Ji|zxkIHugo+KcHOskpZsR=^O zV`+<Esr1E6t2{G-jP9sxzQRTvT^wgh7NBilbQENvu}URoNUF}`m7Od3z6#5){uk!M zI-c{h4>ll1Tx>#ODm0)AZk1jIA<TIZD;=1n2m`|lVAF(~In!V;J_AflkF!+?|2dK< z$&Cfg7DyY6M<@42Z=H<TUo+A6Ry694@6Jm9WPE=#!uuIPiHBb0J<TBp>ZXuVe~EhA zIK^(3$*P6;BG%>X-vnC3Cg%xzF2ebfvr|^b82n*|32r${xs0b^>~Um@^5d67B$pwZ z#tE46la~Vsmsax)<j|%4UCb=wc20XWUC8TWjWvCZOP;JuY&Oe(n>bu&DTB)lG%74D zi$ysO<|>63Qx^duB?W&o09lyr2ErI!u+HJ~=ugSSKL29atOlETWPm8QJWPP@ZHKs? z8QNK+G6bb<JXpz7cyCB(OX!u(<?yI#C{wv+WvXVqud2nf45Xm`&PTd|8AD&)oh(CF zE+Dcj;?W#4Cd{Jegtht_|3eP#Ar&)VZ7eZ{?s_d-7$xb^>DDKYH#m=Kn95tPsQjJA zRjc4h4u<Z(pq#;f&F_`0T2rM{ZYvk}@}r{<kb7PI^7W(plTXo{X2R!O9EW_#<!bV9 zC-S5gd7^NqCc=7sNRtoaaAIN$cQPJb@EPE@weSCl-I4xpjEI)6{0FHLc>-_O<}+ig geBzTH7QfNN(jc4SyY<_5yNzC>i>>B%9M_Rw0W&!Q(f|Me diff --git a/brain_observatory/behavior/swdb/__pycache__/run_save_trial_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_save_trial_response_df.cpython-37.pyc deleted file mode 100644 index 58741d661fc978be7b8e906f60da59bf2b6ea9dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1515 zcmb_cO^@R=7>=8!O*`%EbY}qZ6DqNj&g>$wqZMLj2M&N>(Fm<%6<JRFwoNCov$m5? zgE(+QLU83WhZ(_zU%-FKmDBzOPQ2;I!tx>Uv9aPfw(~si`}low+V6KAywdN#<Ue_i z^K<>Oy*fB}2XFHOcES-Pap?L<C;>8WT)U!iLr6X6Ce75N-fB#e7Hx|r^@T?}q9xkG z7aiz`?v+QoVn_5uU+iAFbO+kkJ=nP+v=9CHuDJEOGrvXmF7LtKne*8jbO0Xs6C(Ct zAcz=T--f{r5x1|J(EYCQEt&6&eR1#&@;}X<V07os@Res6sq<0!ZorcSWRPh!)jTyp zsCg`H5iFFxm}-@0CXmq`mCcqoh@*?cOvwVY4UCS0EHqZB#0*K*dAzhUCEr(J`PKiz zd|1bGe)ho{#E6S^NKAzWbiu9C%OHdqFJh$wvk+lmcmd4nm?unw!T1a?F*(eZCH&_| zq9ivKG@B!Ba6CG?KYHtE#QvIzwl|_t_vp=O*&dzT9i5Cu&j>0!^eXRZ4mnUag_QaW zl-tHBzGj)MS_m&<T~7Z^oJDMMO!c`2=TFW~Ssh~VhZQEc<t*hgo`A83ktxcLUk;I6 zglrNgV9HNk4j^1w&DW4am-e?Yvy9sr?bUQ4uTM4B^ffMdvNW+-Z~tv!e^sOmE;G=m zu(T`|<#8}mDZE&@2oNbL_}u_xVKxbbF`8gi!sWrAYKeXR#jsfo*6YXsQEqvd0NvS4 zaXmG(vqEJEO51p_lBe+AkkFRUOP$N%LDf*Ea?R3I%{s5D#j^~gp#IiIx`7o#U)`Q8 zLsQNnvMl1!3@awgqUVIQ`Wk;j4(%ZoGhl5jF^2AHFPj@B>A~s7CXd%Rk7}68TkWX) zt;SWW;7JaK?!KU$!C%eqm8@D5rBiMz7jya1(R;|f>VEn9(aHEz^rji}85f5kUvRk` zKirBuu0<Xz%+y5KuMTPaVH}Q4Y~fDEqYFL-{I<6JKXE(K|BVmP@s<A|RU%K|?b>|i h7(1W%q=(IKG_f_vy7_MX^xbZw*XZJ?xtYg(<X2lz0@wfm diff --git a/brain_observatory/behavior/swdb/__pycache__/run_summary_figures.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/run_summary_figures.cpython-37.pyc deleted file mode 100644 index c63cc0d3c511446e3ec89061982ce1f87c9e5b13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654 zcmcgs&u`l{6c%mSmK{5do2<it{R0M8%V}C*ON(JmvmUx(C>9I_2yX->KHG96QXwfj z_OQc%UAOBlIV31hp#PGtJM~}KX-~4<H92hqIuYUzk$T_vKEC&kI-Qn-PxA6-{<`5f ze-w+&)5OUa_?lPP2}h9Fp{tQl0%TgbtcuDNA;q_9>?So@E9WGx(}r-VCu+1Q>Y^b$ z(S)XGUDRkxY>Bq$h;4D}!lhf#xNO7L6`>vIOt;0(N6z#X-8sJxJIBuVpU^JUz#9?h zimo8y_T_EpUJ<c-;X>>8%5P-4EB3?(zaoP({Q~)&IK4Y>kgM~}@=Kq`F-SkvYOHx; z{6O<a+L=FB`gE*SmKtA%cU3xB;3Nu9`>B#M(AGCP^wYptrDD?~dGq<gPLzD6g5|gV zL?z%STt||R{l^8s$?;b!BqL5&7)%8Q^o(1j7k&T}K8uw0&0GY&$rAi|!A8+I(_s4P zV#)q9&oIu61<j_2=g%S&umXeKz@Uw_<FvZ}V7zP$4i5&0gTWhuD)nl4?JR=~Xf=U^ zdUKS_MhPy{ROWRwEF!&}{TqhJBjYi9>-Ncu<0E!&u>YAK@^Av>bnxl^K|%Q4gG_MC zS;A#B0%QB3nJs^KFSv3Zp!_kIW%yp~bIId{iOd@0?0*1Z30Pj}*Pj|CdoJy4bYv;F z6WT6(4!8k^*GWIT&hYPzk8f;jtgejgmYKrfJOzy*A}x!=^5OM_Km(zYg5UE&&dQj) zcEx3eM3|CgLM`{Kjxba(4>0ozawGQRPso02wa>U7o4mVTz&V7O<v|RzSz<7RpbZRB z$rE_mBeX8`LT9qKmsga@t7c(xw{SnN^E3r1sJBUKUBTF=cQ!G~utZEDw5*I!S`E_h zEr%jfbgekvMkr>$+DMKKZLOlY(3|cZt#kbO%FdG_(DPb(BKI~|k=JKD&cM*^YZ4kP zeD6w{*GEbx+~!sE<+Y=C5WDRD{N>5v@H;FlX2>U8^aDQUaxr|omi%B?NIq2PsR^+! zZ)^B<6bwyd;cm*qQ$7a#x2ReFq*NjN%~FEpD)$~GN@Ov7UephBA3KkDq>asU-Ktxu VkX7@lo3T}CS6cYhUGLyY@)yArGJ^mB diff --git a/brain_observatory/behavior/swdb/__pycache__/save_extended_stimulus_presentations_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/save_extended_stimulus_presentations_df.cpython-37.pyc deleted file mode 100644 index 30e062be17010c5789f9639154c2e219d2ca6aa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5393 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 T-mHu^&uXCC%!Y3)!{7ZMnhC~| diff --git a/brain_observatory/behavior/swdb/__pycache__/save_flash_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/save_flash_response_df.cpython-37.pyc deleted file mode 100644 index 6d69ed5f1a72ef18e44777f782428dd4396306bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11142 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 B%x?ey diff --git a/brain_observatory/behavior/swdb/__pycache__/save_trial_response_df.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/save_trial_response_df.cpython-37.pyc deleted file mode 100644 index 2eaf695e5f7b5ceece1c981bf296bd40e8090ea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8378 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 JuK&CK{{l{Yc<}%L diff --git a/brain_observatory/behavior/swdb/__pycache__/summary_figures.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/summary_figures.cpython-37.pyc deleted file mode 100644 index 593d523c6969f475e7dc1726ee5271bffd43d453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18318 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 WemcchI+;!dmJFJnRfbj1+5ZPfq%92q diff --git a/brain_observatory/behavior/swdb/__pycache__/utilities.cpython-37.pyc b/brain_observatory/behavior/swdb/__pycache__/utilities.cpython-37.pyc deleted file mode 100644 index e6f93e248f0365beafb960d12a6e44630be53653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12743 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 CjxjX= diff --git a/brain_observatory/behavior/sync/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/sync/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b3aebc4bffb9df66bb01f83865f9787029d6030b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8452 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 Ho6P(lGQziR diff --git a/brain_observatory/behavior/sync/__pycache__/process_sync.cpython-37.pyc b/brain_observatory/behavior/sync/__pycache__/process_sync.cpython-37.pyc deleted file mode 100644 index e462a68c92c919c3535749ffde4b9c85f7b60ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2609 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 I)vm7mA6?J}iU0rr diff --git a/brain_observatory/behavior/write_behavior_nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_behavior_nwb/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4947da5440feda3ff8c032a4a094662bd428b480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmYL@y$ZrG5XVz+5TOs^U^}>ph##xCh+80BnqWigB_y?_qmvKf<SV)Q2yRYZhT<RY zcOTsUxNVwF7zrOYi1{5cD4}9a5k>^Xj%=D7p3KMbAK&|K!B0W^z@Y?{N$3E3zCkD~ zDwuPPZQ#~v3<c4;vJZT3BoC(1GY3TlXHDL^rVUl)(t|-^C0%TxvA)lxE}=En=ba~u d7+Qgy%!M#$8X+>*zsAdpRo7at;)5Rw_5*n!La_h< diff --git a/brain_observatory/behavior/write_behavior_nwb/__pycache__/__main__.cpython-37.pyc b/brain_observatory/behavior/write_behavior_nwb/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 18216fc6ad24975362b0bcbcd17cca1010b9eb57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2493 zcmb_dTW{P%6rLG-y<XeNCfh0{B~+`b6<w*_NL)mPDxghUQB+bO^uj2}a@LcL6JNG7 zvq^X5twh5`LaN}Ir$jvQH~0xW`VpS`7kJ{#c%8OXYI(qx=bX8mGc)I$@AH+J83)0W z{`yU@>>~7+>QoN_<s<mSkI;lD#4)0!#1!j3p+rlA8d{pv1WDprVo?jLwMJY|Y-(%W zj2nqVoy4WC?$=^3nV~aUx8m8PNt>Y8L;G7q=fXzlfShNo(A^>Ydp5t1U>2{Tj`sx4 zgH}7ZXsq77^6}N{@7}lto#qv`73@YCUt>Z<S=u3mdm|kT<yvoxB|+ic8p@*{tY6sU zkz{_x{Q-|s>1TRcz)VY&9)uro=Ck|5AnvJPsK<j(g=_^rv4j!IafnZ#2?0q!8V}Cp zBsX&0H?E?uPfkpUw($YU%|pzWBswsZhSB|{yJ+-_G!JSyI>ZxbLt_z5EEutJ3r6a) zeqe`st!(7AydKs<>#-rEbROZne&8OWi7maHg!O&$)7+$yHx6cUTlu~Vf&UzRf$kyg zLyv*q*_?o1M|*Ro-hNl!;8aaGGd?5`;6{!k2(pRf+>Y}z<_j22AYJ3r`X2Mj2aJ-b zjiGFE_YqcmhOqLXdk=kuQgRP^kSb?&>~^Dcz_UJwn2xP3<2>WVv5jf2{AsBDC>-Be z$&x_;x#+ip_P>(Z?r|1K7PdEemb5=vyS3Whi{#d;7T&z^>Drf&(K=^5hy*L}-uU+a zzYUaO;g<E|4+6Q>X%!?Bg{kzyVh<uAMPYH4WV?(TP&q|I-NWA&SxQSajuKJS<E-C@ z`xj=EZf3l$R?c1)f^i82eNBaqS~By~y$!AkvZ(1ArZd_bjOyLhPHB*^qH*m(j}4S* zVMSsyidn}iyei^hAOq?tBQ>LrN>4o7^PlF8ww{|Pb7(6wwGZ{wJ*rG{8xBT2b)Ra8 z*1=q@rp?NauMf_ts|KbgDlq#E@z=rp?;lp)U%w647VE)Q5Oz0$y&xT}UrvKwmWILG z>nz<B>)C*%q6cj@*cyrTo6*L)07PFH1ihW0&%ic@1B!5Gc>|K4`q>6}+zn*LN6S_H zEte!vbyZ}SeLqpl{qA5?v|gN_hXabYph3jOwqas|9qi#*0un|X;*b_d4<853!7bup z8@KQ*jPN(Ws;5lVW5RbtC4WLkK`aCsc?=+yWZMXVRlg%Z3utson%h7U(vtPid~8e< zXzj38!acnNaBXZm+wP9TB>)ycIX($1yb!1ae9h!!A7oCBfJz<$L`$HK&dAvuZ#TpG zB9IwKdlBuEiJ^CBOn10g5(59@Iq%M^y~}w;hWm<I6d|~)<M+;<3q(&w3G0aVh4$HV zzz#hihiNZnyDU~^HSH%b1=;K<VzvMjNg$s9?V^rRm;vt#>I%*8z8no0ZB0@5%-DEQ z{{`A&*i+kV4&!*#2A&Zt95+7$sR(B?h~goT#B1Q0!;cV+7q3IXK5sPTpz%E5y{!wQ zvg@?CDvQG12t?Fd$<ocJUl?Kp8~|tBEgI^i`k1tNnfJ>-lG+=fq{@KTRMXNf5*Xe} zpmwvp!eJGH1#R95;s`)nF+ou)aahy8FI`%^t=ufA#)76}>Vd-2x8;Qa28C5dNaL(* zmSAaNs+zwDnm7*)A||%UER?n?Z=&_%Q06vXP-U*l9nVesTp1L0g__PWuKtla9{jY@ z&Zy=rG_*Dt0l+kM(RV6zc3(hew}Ru5Qc;8^Px|41F?|uZUB66$cp7rreTl21ocTi; z#gUAd&|#(LUt(0TYcPnknb0g=W~U02s&3zZCIgD|xK4w8DapcN%sx;hE>1!N95a1A Q;*mM{Ji~s|K4s&705^Zm%m4rY diff --git a/brain_observatory/behavior/write_behavior_nwb/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/behavior/write_behavior_nwb/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 10819da4ef9a1af225f8e2b35929eb5764abc3af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3167 zcmbVOTW=f372X@k<xQe2+qE0FT{m!T1}O!!fPn@^VatvKAqrDOO43f0E{2>Tx#nKz znWbbA4$#&C+L!)<qJWJ)^*{8N>}#L$7y8ui%xWdUQu@#(W_Zq->$!brw!7Vyg)jZb zANhlI%lbDl)#rhDh^GI5PFTW@t;A-wO|%m`iObx?V_s5YwWQAKNrN@am>c`7i8*fE zVr~3;aVP1rZnDPKl6AIjTOV1XChFf>qAu58xvU4iA$;(@w83wHZ;BT9mKnby+&!z` z{tmaW`gYNLq^5i0nM`=UR`|QwbXOkAxTx>tDoUq?yOZWceJFJ<Md9s6Iv@7kVgn1t z^H51HLOvc#t&3Zw=txDmJduUjp;SgtbU)*f#(w2VV>-L~Y9Jn>>3^Y<7PE!L9O(*M zIKus_!#r67?HRf*8-}ZabD4j_)eYA)BMmdJWoX~fZ9_K=-7)*N4BaKUToY~4!CvcT zR@aR5483OP4MVRR`ih}@hTfD{pIs9h;>x$yE1O*xo3QECVsl&0_+gZ(J(wiQ(kDFU z`>V&Fr_uAJ3?d=ZJeovO1(Qq#`Ai0*llg%z7X*107>fl_3Uc`6Hcd@<-ggRL$>+;R z!4GXA^;kuV97n9~?PDKI;#1f+jKufuy}JF8Ol2O81EC^#CWxa{-qZacn*@3}dM3yD z>fLIJl8a2`mruI!bQ#CNRHj*eypZRY-yibC2;_@}R8azbc^s%{8Z5Q^A2<6I3}x2w zF;vtMDMtIgZJzgGmOz`xJh98_on1cKSA0Cz!Ojy}LuReidH**&pPk<*)OnOF<E0M9 zJRv%GZ?Krh!6b@h-&GxiVBsI~I1;#!>VjQe+beAokjU&6seHC-S7I$+oH2YVSHGx? zaC+84NexrL0%A#7bwRJOgOli^Wbn~GM$<96m-cHw#Tz8W+*h;Qe(k(OV%)Ue*x$Iv zH(t8Jy$MJ_tD)6zTHknITIqY9mAmtn`n_$@FZW*8M5A2yH^9Q*-8c51?B7|b^IPks z2f6(K=OBQa!=hVVI!xip;(FzQQ^SR1s-lK0Pc-wZVb&bS;esm|mDO}kW_bEITgD<l zkObK%=f-iR?akI(W)}Qe#y2^9qO!!e@60E`z13g(-y6}CEt((7fNM&X+d-KMahx5I zl{G?8YI0d>@GF?hV;u;j2wmzZQ}YjkukIR6?tcB%-AWgtPqiV&-1P3({d(a}WnMT7 z!P*A;7SVVPWB4D-;}4a}RN*8ETmPaAA82HRfK^Y+cv5%>AYRnxM_f%ca}jn5HNyI* zrEcQyKYxDw!NKRavOeH5E(Rlh#M9%0M=2j?so=jnkm;d5$QClyWAxc#cB~I}qtOAf zMgDw&1c1@8HjXhv%(q4gCJ(a_c0A;HrjEBN{kBSsuGla=8f}HzlmI<g92Xl}=4bAv zFc?rYUO{I$YxbJ$*f-F7_Kmu4ukLJLguKCp9ftiM6n<zNABIIM43kVOV+pzwhR>Hg zrenfTQT(&b)2p4JB2Z0H`DE>LIHwv$Qes(1SjM^)YMrnX;8a-Q6!U>Y<_2t&QaQ{f zs8gqK!>-F0Ncoh<p<c)_VV9Y#C>>Rg&gxdnMuY&&MdmXXRyS@`*Jz55R1f2f3-t~y zBgdZWen@N^9la9teRMv|=(}i+2eT4a_C^kw87rku$EF|2%pR8)(QRy66;Tv^U<C@l z^U7haL<vP1t)ZmWBnqjh(=)-8(I%b_EqWw?Yl}9Jpi{JW(#0~rq+Z)N;USs{i0UZm zKJysrDV92`-npfNPh`%A{kpn^CF)1i{g^sqt=eagcJ@9j8q0K^W=H8cOButFxeAXq zcmzrlM*6n8ZKONHr=J4*vnf@*Af`7<1^#7dp<p(IobY9w8yw$X-Fbri3s9E`jA#|m zgI|E+zGJFDiT$^$`jIVjSYz-^1E#QSBu$mhWqMLH)EaJO)(rcdw{@i(E0?a_jI(KI zF01M!q*!2`D#{5TOq{DGO>UQm0#@_cWu{R-!K{a9#uL81M)7hQL5^+4FOQO+V%3@J zq=zRAVgk>hhIw@1X(c?kvQ~6HHHw#Eu)q4h?9qJN9!7P#JnKaiWM$!y$Uc3hzPf`6 zm#Y0U419v7DKq^Ol@&?*o2*ITYOqXEys+LWKfuE)7TP$XJchug^g{_H30HcS070{( zGCu1I4(QctlXe<Z&^ovPt%K7;!et)Cc)mzo;s!ZVQMMab8;_WqUZz;#KPW@@*OX$K SBC2EGf_}bp)$85wb^i;^<!o>O diff --git a/brain_observatory/behavior/write_nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 982eefcf79d854e0f67cb6d7aea0b394672d81d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmYL@zY4-I5XMt*5Wxp=uo>J$#6PRJh+80BnqWigB_y>ai{P_3`AV)nf}4}qLHywR z-ErJ^+-5u;F%sTy(AQUwpE7Dz<TxN`c3_ii|6rjX|M9tQ=i(SmhyqH`xq=Qbi8Vsu zP{T|ZY@=}AU@VBvmnn*!RU+EPOg$78oD5~_nl^OBRRD|9DZ1D~<3i%fl+aoico!%l au~S@1i?)$6_vtxYoSnYZX4(JsCbKULfj;>F diff --git a/brain_observatory/behavior/write_nwb/__pycache__/__main__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 419105db80b2cc908189dc872611c71d1925d741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2708 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 diff --git a/brain_observatory/behavior/write_nwb/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/behavior/write_nwb/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 2095c3f6a76bc2a7044dd4f244af0f2a2c909f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5132 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 diff --git a/brain_observatory/behavior/write_nwb/extensions/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 38923dbfc63049c15be8956fdeee66d219517ae3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmYL@zY4-I5XMt*5TOs^U^BRhh<{db5w}3NG{J_}OG#>LMn|8+$yajq5!{@-4&uT0 zyW{x2<JM_9VpMp)Lf>CKewEO$B!vM%vppLpy9e|A`j5|TGZTkkd=OB8&J=WjQLGSh zhZ?5BU>k(14ThZP>LLcQwMqorm`M$J2}eWOsv?Ijx$<C9Iz<;-Xq=B+nF3ntJnuY3 iBzB6MOG9q!FmNd?+D6K(j?dxz<n*~Ri~hwoiG2YE;zNS~ diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 7d9740e8bb723249a43ac40af58aedba4ac2a6ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmYLDy9xp^5R70Uf*)d`DeOeVM=LgB7YLin;swvmk;FT%^fRoj{3TmI!OqIPLL8Xc zWtdrZH5l{-gYH*o=c|<;I=n2HvCCq`P7FKShX}3xm(OiIRr`n`D#*c(4b(u5S`uWQ zEKC$q6_qcMV#eyryoqY#jEXMdsD$hY2jp&1aKav?3E)V3!xt+^J~Yx`4wdsk)`2UU pY9sNIIPE+|i4{`P787QP4XL#wm$V+2&9gT<d3!E!-oE^1iZ8L1N&)}? diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/extension_builder.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/extension_builder.cpython-37.pyc deleted file mode 100644 index 8f2ef6e5b27dab2600beacc439049916a760eaf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1454 zcmZWpNpBlB6rNQh$-CV)3D9M76avX9dI^FcjW-kqTBop56d(i)IKwB2_J|yi9LW;w zLy=tl3wr5tD$rjv*Pi+pdg|jSR+4rEKJjth`n`{HxUtc8@DacNMBg+V=P#?=Jsxge z;L^`gFo(IhLtOm#a&O`je-e;j5|VJzAPv`HK8aYs!Z!|SLW?ynJ@pituN{2j_MJ}j zH^y+zIzhE}_T%9hoq#TA28Sij8K`Ovt_rD4q6^5Xb+q_K$+GBMZ4<R)YN!Td^~L9c zU3Do>bypVSx$eRggy}LckQpvTX7ku5z_pI+2$%j7g~3XU`!m+hd|T;lc;j3<7anV{ zh&69Lcd4~L(ApnpYj>LQ**f}duuT)NEw;^e*e=_<4N&_CwU3wD$YY;i7Wdj6xi_8( zFB-o@wQSb1W!k^G_IKl(wQJ|vyY^rEh?j$S-8)-+eO&hhEUsJB@leT0EDOUkn#Z<x zE^|4W$LB9k<6&M(1v&$fL2ML4s~6$p-j}_{i-!k!4kA7k+Hg}Eh=)?ehl+9$_cLxC z77u20E@1Y8T1$Rs*pq712`it;tO^8<tcs?fFsrB<v@~O>swk7f(9DpXbIH$frc!9= zgW{m8Aj66}Zq>4`^|Z<E@f;PNy`pIj=P<%hr2UFd-nx+Ox3fMK2GkInAbT%uqbGL8 zOE|2{Rt-q9n)%|hzOmgefr?k>u`Eqd8WQDnk}|5RaF|PK77r1?tjwuFY!!@fr}%<e z_QW&bqp{H)7pbZuWDN<KnHQk&ayV6}$Fu;_7Lsd7v|)Pj#e1>p;~0;zgek8B>P|>@ z1(ZrM<Zxm`Vco<3opF)X>FPYBX^oNay0fnAEv#B+2j89azdtxSA?s+GmkjDy%CcOA z*2I$tc|py%ifD>(<0iO}TvQR`s-9jmNrpU!BvC#(bOP){C+YGAlAZcCB}=N+_mFHN zC6ZOyx@s@sOfcRbj=G02{`u|b>EH*Aq!`dKWxbTnsF)891Vvsj`qco$R1ahULT4!J z6oYShI?&ue7e4@(bOh*YX{Xucerj2n$P^<^DUNi$pTd|<xm5czg)WJhrTcJY&>DxO z_y5C#cdzc+>J{@Um|)NrR;!<&a6HfT+yIy7HvLVv{?%vp#9QqetKDYU@IQ6c1N5yB zLK`hfI_)Zwx@Tcl+xUjGi#Zn8vmdZ}WHrX`#-p~-Xcfbb1IJ(?d{5l3Gd!C}R_5^B SMNQj}bJM%;2Y&NW)B6{oK(=uJ diff --git a/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/ndx_ophys_events.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/event_detection/__pycache__/ndx_ophys_events.cpython-37.pyc deleted file mode 100644 index 7ac4465f7b2f03eeea0d6af110eebc63786cc696..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 542 zcmaJ;F>c&25F{zxSw6r{fK+bMU!hZxE(ikKvAe)7f;55vVkK^Tv?)>`l{?E_;E&|s z%3ttP*rv)CQe`E;E>dIx4oPrkI9#3{94r`>efR-SoUvcy=DB9HIHnQK2ozJ?uyUM* z;jJh|o0JJ>$gb0$vkB+8x8o|=i84ch**&MzM5StWFUozzzp&-}H#xD3rHHSL10^lA z7&>S$#QiJmWn&<OyWFbV9CRIW*R6+;;|6V?E9|l9wX>@i)oOsb2C>wF}gJ#+5f z{@-J{h{A<()(v)BdqJUmLJ-pq`gKgNowjjLX+K^SGbz7mgHo19<SM67atak>=&%_z zJ|+1h^J6zB__O=;zWN%_hYHr9RyAzF4%LZ;##sgLDzuwWxeje;2q)9(v#zV4d(5dP zH*kfdHHH}Krl>t=D_u>F8|a-MiW=9j(aslJPZCKFDe$%@HuWeJQ$G39wBq07t8R$d bht{d@20zlzvv5d|@z=?mFZevol9c}io6xMw diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/__init__.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 084a39ee90523a1a3781714e12556e9ab64c8a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmYL@v1$V`42B)Z5DIya42g$srIfZ=Lzd9ZVC1vtnfPR5`R;mSpQB@@yi(UbLbp!U z4W)wrlMw$e^t@i*C@H$U!`#1S{MAB+M-eXtUY*otalEQBumAD$vA;7fjD-!f;CBv2 zpvgQDG>JUi8l-_u%1GP@Q*I|Vhu{o{irWm$8D3GcF^a>VwJQ+FCMOpMsHsfaVGBb@ wMUO=ymPV)Xt%^G&V$C&leeBs*>~e&P+S)*&TD!~B=jy&ozK{4YKm9FIzgJaD1poj5 diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/extension_builder.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/extension_builder.cpython-37.pyc deleted file mode 100644 index 2746e3f0b8f9fb23949e782257640680253633e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1732 zcmb_cOK&7K5bo!^@?=+9b`b}297JXoaf{GulMtauFd$73QfpAl-L9E-(rveF_e^G# z99GK-Df|I0Ah^I!>MJMy0w>CynPky&q+51(+2yLQzAD%8&Q8z4NBsJV{?K-uKdrEN zJp6fyL%+a@In2$S$i=UhdxanQMGyr=7==YEYPk;cqc#gz_`MT#pvzj9o;rliYX^7S zvD0t=g*Kc~Kd2v%zC9k%0(41JIIeikK-F7tRZ3-IT|!!KqsHe-R^`}AyC{7|4b@<* zyn0Wts{_gteV`35s=U$%28uGL22$(8J^>CJ*9i{&BTfcU822Z{&U}mVHoS4JoePh( zSetcjJ@-!P{!8j@B;&I!)Z8`!+hMzGkL|N}ZiAW29^D2v?zKB}Z#)xTw0>?kbElcR zruU0$-y7d-T|3v_wg1{jHXLN*@o2R-UZW?xpfk{`@cH25!SmGzM|lo{oC%E1R0haY zDsrqS7i64r5GkylE$C9f;w813e4{v!YSs^HpUJci1QJ}g=b$u~qHfX3WKz}bR0=~= z6K$PYpJPxQbRDEpLEo*r_E3|RsCUkb^>(zs=Ko9>P*coVw7-FVzUH0&;bLy3fy29C zNMng0Wb07LJZ7L%#Y=-|2vtB7OhMUT7)h37lgMGIKm$T-^bAdMAXJkD<hlKFi(pQ3 zO?sy^&DOqjCKrMjNlb>?0@*|bj;E+9(L8R@G?kSw4U>#(L(wm4G6G8=rPRD}rvOWc z&tYS#kb)bj2IM?LYXq(g2+Jm-MZR?7ZtdePgSbKsg2nLu1Jj#<P(doOKD*8lky8Q> zK_PXEjAM+H6jWc548u<V>w=bL&M_=q;b!AdihS9CDfty(=yR@lL);YEYFOZ6){xFc znpX^1)Y*8i!)Y$5S$+4F;xjI2zUFknO?Kz_|M1uMM<cxX3j2!_h0H8VP%ZqgL!HqQ z`a$$aK&2$ZTOQk8ESKq9Ylyx%6?Lp0b_3ntR<=de-O<sPr{k}WPEMokb&QP}W!r!X zt%@hH&P!^tx=j<Tar_A`Bo}p?an)RwP8?5p4son}Jb;*bLdVHndy1ZHDm31-nx<1l zyLb)bd)T_}$;y<KiP7lqj(Qgj{r%g?;p7{Q7jZ%}$_5EtP_djG35r*P(N88I=6WJa ztgRGhS!PQ;`GO}CtV%e*7I|r#!=$<Dnq3YP+X-Tspv5`GLR=0L$mpC)HC!k>5{pGL zysuR~d<*!)<|ev9xvYZ%&2|y5{tzd}^IXpjaCmOV-*xeAR#5KQHGI9@u;st+s%NNO zBX{<E9QS*5Tk3)3SMB3Y)GL<=XkgoVldFc@hrFmgRJyle^ML$Y+TNI+HXc4LB&%|G UfsMw|wzYS>r+(mfKI(Y?0FVA800000 diff --git a/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/ndx_stimulus_template.cpython-37.pyc b/brain_observatory/behavior/write_nwb/extensions/stimulus_template/__pycache__/ndx_stimulus_template.cpython-37.pyc deleted file mode 100644 index 0a23c4f3bfc52d4381e134b7516ea695888a5ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmZ`%J#Q2-5VgH~m%Wn$X`x7e#oZQk2q8W@L=$LMD_OJaA?L(vuRMEq*>os>gop-y z2!CQ*s{92iW}_TMfRX&hmfxFsWBJwL;aqU|ub<(E6yoQ2*vEu7FL==#1|y7gq8PJs zvQdR<k|L1;#aa4ga*I<uxRxflRz-#ivn$EBiAl}mN)<CBPsCz+!<EGQg&H2Z07iRg zkXopbhS@20x^_Txx$x#<3AUmob+*~K4J|utS_d7j{wP*GG_E*0xnq2|BV0cIzj!ep zRG?zg_I_7I#ZF?vFr+PX>mfZ0)(;29#<9ncY5mDM)Vet4ihA!v@11CBu^xrRqx&A- zUUcZm2LD~e+1O=-U*BFoEk6=QDq#&~RlyE?U%vEE2XEj>iGE9EXjxe^hIZXk`Oa1) z*$$WdM(1#ftaXkV<~*+=Sg%9H6}QlZ*yk0lVQWLocabHUXUuW$gz~=z$p1Oks_lpD aSrg30;dA~Ff*vqr@+g_gxtyk1lFHv6bGQ}& diff --git a/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 010bc6d7150bbf003b19bd51412290d073e20bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmZ8f&2G~`5Z)iVq)FOSS`psB2bu#nR1sQeq(YPfbuN~r)yBI?m)N`3t{sTv9*}qg zPM{t@oOlFY#U~_ATzCLZj9rQlBh9CoZ@(Gu%=&b1uZzI+=QsQvLFjvv+?o%;V{ms2 zAdtW*im)IOza)ZQ6X7*c54ExXm)*Ih5fxq05xZ}3<OzI%g5D44fM%-??;HC%4oK~9 zcv{N(PNtkwdbL`%_H(>yln8wr2Q<3NvpiKrDI`nE!Yr38<F8d#X3=48rIR|5%<@7R zmMMM1E2r2-nY3ZGyVZvYy=jY@nHql%?w$cu*xsw?M^vE#S7-=R4$&ua<>>*i<bSsE z1X_3Oq#}0mM^A?6%Bwt>lFlrw5ZUHi0j+6n@_I0zori34J`K-au%~B}lle5fsOd@; zfnU?L+*%LRQQyiu<uHymTGl(xls1uVw=c-<g5sBZ@-Ut|X<f`Oxj0(zS6px76U`H& z1%D7ry>YS0rFIFR$uGAqo~lLcR3Y!@JX!OVgxWL(g;<XkmMhK70y=JZVeED!6WJ7v z7=v9Fj2-3M`T*|9$|hZ^w2+pyk9Gj}aeV-UJ$y(8q>uZ=_8<>P7zTdi>oS9CqVt+6 ny|m53+w*pmf1vsI>dtXyM48G*7&5mH(AgolLkaGJ@B6<27_YYI diff --git a/brain_observatory/ecephys/__pycache__/ecephys_project_cache.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/ecephys_project_cache.cpython-37.pyc deleted file mode 100644 index 442230e8ee0c87cbec1fa415ab22a18a13609b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28065 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 Z=Xf`soBHWY^zZrVcy(e5%24$0{{kjLQPltd diff --git a/brain_observatory/ecephys/__pycache__/ecephys_session.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/ecephys_session.cpython-37.pyc deleted file mode 100644 index e6649e0fde67f8d5d89f53650ca391b54a9407eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41377 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%0DCyUC@RW7<i)JN%BDZInoie#9ztmF@sB#<3R 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 diff --git a/brain_observatory/ecephys/__pycache__/stimulus_sync.cpython-37.pyc b/brain_observatory/ecephys/__pycache__/stimulus_sync.cpython-37.pyc deleted file mode 100644 index 60482e34fd934a5c68b4502cce6c9abead12844c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4404 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 Ys(Gs5drr^_eE%@m3ceAzzUOcK7hAn6S^xk5 diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 2df64801a246282deb25a622c3025391db66f295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmYL@JqiLr424Iq5W$03=oWS&;!i6!VmB~kcY+SPn;ABvvZdfnth|z~N3gRpQ-}}V zmk{zoR)axbiRgZXR9^`{b);E{xht@0r-q&FLp5pq$LF@5>OEt_8jfJcIb48Ry(B0+ zS(s>~Gix7^xDfhqY*}wyuGvK#1t>~5pk%8`Hf)*Y4LCABmy2hJzG*WoFoiOx+<{DV dHFAVHaAu4n7mXQ*_Su`&-kvI)r|;fk^#!M-L4W`N diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 5e0300d2e2f1516e9eb9971b1b1e4afc6067c9dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2447 zcmZWrOK%%D5GHq5tJP|?*2{LBrh$P11yrCm&_@nNP&5w|2vDQ}j3Nc0bU|q;Ywdl7 zq!Y<l9SY|fz`vld(NnMe1wHjg?6s%#C-l@IS90W3#*)LC;c#a7&Cm~9Ef>Kr{p}aJ z>m&5HTC9Es5Z}TlI1C{Qaf}Ft*@%tABxYg}3!~5st+<xh#7^p@uGh8LNgAY~X*+h4 zCTS)f@$|YLw-TTDKs#aM4I&$%8#ZBXvrg!p7(8X|a|BX+hz6~9a4vc}Fv{KoesnmV zvV=aPTrmDDJ{9HGYaU4!WIV`ul*%AGmHDX@?=WnFJsVF_Sb{!Hm}Fd(?H{zld(Hrt z-G`KqvydIm)A3^}sbCVe-eEJz=~xD%N-Ba0&yqk$Dw!y6ucRW6BY8sx7CX;)Hq!Q{ zJWHc9#>dJb_1l841>Yn1#6Q55=n@wY>khiY3tZq!;|dLpg|RS?(89XFvp+#<?4ZZ! z0>AiUQIlp-3(XyLjxmbR!j{%$4LFwGUtg|jdgVyFs22`MZO}KtYGdKb`Z{mXlxA30 zw!m&v&2XwWJC=@GJw`8nhFz_NUo?x>4q9v!E!j|#(7A=+rv8%FvAbxeo|1>oHUgct zY+ibWQJ6)eaEpzi4d*v@Q02vyv*;AwWvl31!C5bVeXe5Y&MrXesu*9qS@d)ay|B5A z!MgMd=L%nLgdSw5KRYNq(E9@Hbc+5ta3F$~Y!{v5&N<%Jc>#{EIo%cK0>8ZX9D%pJ zq8Dy}H~p|3cHWv8E!SO`A*=Tx%P;-s%G)kzb&mUewAfU(3p?!HSDY?TeV{gB-h^4L zw_w({0<;OV1rgdh!q1+gaJ#S~h2>jMi6;PL!Sw4Or*cZ{T;W8NRtoqeA1#p<jHfhB zS-iwrrMkTm$|zv~!Xy`!pe2Bgqx2}?fXp-RPyupRYaMV4P)3@d&Sem#A)Ap~3C(jl zidk@ND40Ys6U2>FtyD(qlQ^UD-dAT`nMoRJbGu?1P2|Du*%nmADKJ+D@2Z0jc1g1; zK5gN<0VW=e<Lq^iN8^*2m7RE!2dgdG*RrjRYexcYyu5uBXCoRzF+*N%YLmM+WdE~9 zytU&6X;mhc{a~=k>yV1FJ^|k|K8IHGL3Nik-9Sns%}Wb{54i&ycth=Ku=F%xD$3G~ zSxU?&>4dA6N$TS)fuyn0hODwQEUj^t&xuWioadk|B<HHyIkZ(&T7te}q<13;ff&=6 z4Yo>)@*}atM_6?s;%c<$i(1mEPYKdl4-PJNk`ZtpQbxAqGy-7g^eywD#HD`|Q^dW# zeL;Ga`VD{){|58=NZsx#=#ZB3Zq?vKX-44;yj1Yh3dBjGbVbowMQQx6_7G2jk%dbD z`qw^b2I<l`I!Zx&%@^E*JpPXO9hm-o^XOpsBRm9RNT)R18`0M^oev+RbeyFj{c_0C zS7MmKwFtNrmgUpA7=9m(h5}xU&vQCHp+^k%#&D$~JlP*{3jSszu=t89knFQDQ=9g+ zA8TIh2SK8AgS~uSwm+1r`xY?_2>aMGEZoH&whSNphJm~A`KE&%!!o*tW3+)%I>y?c zja}0Rxet5VhKn7LwY9u&TCj4!M&I-;*K`e7!5O~6@4|Uwb*TEOM_ZM?eq=rcLL!N! z5#qPTLN$7HY(eA1vR0_4$9QYNV~e0cnefg+yU>qppb$*DOAxK`;BB-NKubH<@9@Cp z>O5XkgRKVT3*S+L2?OYxNfwrNWlG;&HGB-x(o(5pKnYcF2;y`N*WjNhnX^jtpi62{ zgZZ3yfKT>Tm$vu6OWRXrR0VJ<Bfw(BMCG6Ig*Z@e>R$-)-d)mPAzxS9vi5Yp;J0DV z`$j;zRZ*<tUiX12;+4y)nFqmIoC>X62kYF2Oq|B-8};vi=)wRHFxvo-w&9u1Pfo+Z F{{dx^#C!k% diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index ea29563f66133b05142d1bec7d9903de2c478401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3702 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 H?$G-$K@|z= diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/barcode.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/barcode.cpython-37.pyc deleted file mode 100644 index 98b6f0bb5d279929b856911e0bd3717f835d56c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7497 zcmeHM%Wot{8SlruJ@$_6Wp_<N(n<pBS-jpvAc&Tb=duWiI3ZaS)Hn?7shV-)neK6Q z&-$UB12`ZgKw3qDW0VyqE=X{S_$xT~l>=HKAx<3N0Kf06?)HrBbvAH9qSxKikE-ug zU;Vyc)xJ7E-!O0lzy6{3yQdA~PxO!<CEUD>GkP8uVF+_zxTaVX6;XZ9bS<$Y>Y{-= zTg-{(dxl#Q^I`$NWpP2Y@LLh)+eUl&0eTx74@l3SKYHTFfBDu&AH4Ly!qWo>mu>|Y zIxga*Hm~7~64NkZ<3lqs?wgYe?yRJeSUaWrrZ88GNi{K&s<18_xUcn%N&TL=e=D|= z+L3w7xM#lmrA=$nn9L<4!@^lY`?(#yCZ)^9j&a}8lF+}Im_;j-Tj6@D)qFC~nitTv zoRoVe?7Fc3eheRz@{x7Rc=x?Yi{vEDWTCKgk>AWuy;({Ye^3?XPD%Y0Ef+~9Y*-9x z&<TGgi^-Dye$P~`WIkESS}YYUAR$@WftTu<u#yW&>jfiONbD~glZD;izJpPkEbm{N zvg`3lD_N#?D@I%scG5bsE*faPe9zpy{f?2;KddLq_f6B-eI8G>q~5bIY9;RyhW{<; z31`bw-B8HL>8Wt&#Qso5u{Rt^;V3`ygTCVh!s&T~0o_Z{m(hBo;ox}FQ{GU<QbqiD zy*T(W3_2{!x#<Ms;pkvJ5S~)r0e__KcXCaU6ZUdlEZ+$OC*GF1Wezk;Ewk7AL_%k* zeyCJGfDfH43>|*D>kYKsQu*CACmh9o7<hxi_SgNuAC3b@jFm^9$OH1$*^=>|ltFGf zLPf4ZcBg2{@py>bR~%>_OD7um{q1;g;6&S@f^`Uor(+`bN3t7Za0+=)ExqnGDan=5 zcoqsfUFq}KouSw%Ji3E;550YOHJlOcIg|r~VlcQvu;s@Q0)$wd5gZbQ2G@lg#oH8_ z+&nT%r_Nh49;;v`Z)R*q2CBFi>VY4{BnNp!aVu=T9V#tbAPYGt*&wcQ`tX2wv9q`B zBRq&;oDYk`@}-#8N&e)D;Mb!n(c?wKKP}&jFl#70vM*IOT{gm4PI=4<{C*HBntHy1 zixeMpaz-i?&T6=`=4_2)CkSJf6bLEWXY@k$jmCpWI;*6QS~=HYjUPGq3#6nMap?F$ z2C?5e(1v<NDA0(bfl+Sj!BGHb;{jb1m56pDwSp1Q-|zL(^4_*oGObG<3on-G+#u}x zU2o6<Or+&Qslq5ND=+BFv=sS=GPOtHURv=+BiPoy=+<&zaO+_{o!v`h`sq37Hm7Hf zdnFs*Q>mSnIV0V9oi~0U{H}~r({q>eE>juh*0Psq;iqQoR>FWn?^a<D-_*Ker3jzW z5@mX7<LXudxgWm~xK;k`_1tPE<~N4AggE`<=(U@h-;Mx>o8Go3*0;PpFF4qICGff- zu<r|-GPoOUh6qE{#WfslA4Hqq^tU!6KbF@=UU$a>wr&Dw(L(Ip*ixP!biyr2yz9lG zI=CUbk~-b+fDReD5>iJuGDFr!2kB!lQhD7t$FrzIu&$>Pjb`*RF2>b{xnwr2l6A?l z%#wM<tmVIU&1zaLYsp-)8s>t9C%!h&0`2XV`M9-UsVk6?mN}+fn*`#h;w<Cj0)G!T zC{?zwCZ)s@_Ku}KElQKJC{HRuO;m7KnN;?_li1N=Y@o!Nv6+}h=8mBbW9vg31s#QV z#n_=jUP1{i;d|-G6xAIg`d(c65w)l1G9-^gZDQ{}la!MR3SW8m85BBO{WK||kfYd% zI!-Ej4ew{*C13aN0-%9wl0hZU1*Zozp{g_VB0}8mAnfjN?W32Nl3P;0Tf=NcMZ{Y@ z8FjJ|K6&UHcekldLim~^eKb<V^vVh>p`+~kK|t*?otPRdjB!LV4n0zl)wUL6O*LzD zs?cU0>e7N@s|!iyCe_w;=Zyd^!qluO+rlpYN1}DG9xj>lcL+G@#0Mh@qoY_M7_61b z<yB6ss}!88h|JaVYsPF0P``!T*R`n-SPYB)NF$xOUyT0hMu-^rC^CTCUN{C;osPnz z3fBQRS2hd3y`fexQ5bL)5#<N}!ojF}r)_O)w9BdOZ2^A(35w>Is^O9@yb=Kvh<AKV zsZh16>4n)KMCrop=%ov@F;5%p;_H;I?#0>8+DUhLMuL8s)`hQ7X`z`RPhT#RP0KVX zI(eXVa}OV)XK*ntm&}q?1JYD1y1RsH6Zb8kONDR+=%SuRyDmW#9Zj4CnEU|`00}d( zg(<9G*kJ#FlB5J!sjD?W1px%s4+I#KD&VDr7L`dg20X+T!Ng_b$TSVCAZ$QJ1?>D+ znLMmASYB;XPwFi1=jc^KuX^4K@@tUWfc!ds=XO63_N0MxF4KgSNL<3Ip_<I~0atuq zNg8y|T)Xc5)6QWhlDlIWpg0j;oS2xzvsZyS-k_~%I89YAgC3eqj79`93{adw^!gZ( zGzT4psHQy6nRsa+>xK$MV}wdXume6osHSNL=^a2O$fl=27Fcj*TZTg4Abx|wf0e|7 zmeO3ANpjFYdVef5&jdD!Eh0LinD<HXNx+S09Fem#kd1L7k5v)R$XWHe@ORqNEM^>w zHpP`J&0cDtVy_8(PGF&C@Uv6oA?BPI&$G0g5Y9^VM0-RxPrIhaA@^)53YmWW{d^~< z>?ly{%!r@uqV_<mIO!paei+}^9hv-PORm%9>up*KaO$HL91pf0K;RcLwh(Y?+_eG@ z&dfj-J<jy<zfw7!Y8jy>kZ+sH!OsTa`r*ab^&Hj-%vI^8!?>T?@bYl+P39ZqaQ3lX zVSr4_Bb3TGwNWzF<B-Q?AuaRLy4_5hS)y__sVC4NozpSUZ=S>(cPVSc+B3Lc)UBpp z)#J{v!!KOij<VZU))}^CT`%aa$1keX5sxlzMs#zsSS&C)6x`yMFe-Wq7vnRQ*|KY9 z&1_h;atk$L300%T&r~~5C9a`Wmv)!vplU(qYdE9t<C5_Hk+4t~*7ZHE_KI=ENI*wd z=*mxz851igfsk7I4fnXC+a}gyMZ1ZOR@TG@_S=l*W$*V;ej9@VWR3vU8k9k~gJ__) z0`zi|>uu!3d!h5303GZT--&cSoWF6R<4X(%G}PM~XqrjL^rq)4svEsQ=mFq`M9pP1 zKgO~=uR-aQ0HFisewT+3Y%~z>>N&vU^+^@zP9H1(-07|Zc2hgREy=C7IgC9lT0*t% zpwztRJh%R=Uc+mxx`a{v7;D<xqjJ>^ha)anSv4yJW)al0o&>(|u>zw(xTk|NJ(MRc zW!uiMj3W#j+LEA_a=Nx0+wh`;j$RLAdd_}86b|m9*cG0vX0CkRnKG;GT+34LtGWnt zb0W28CM17lcDcbsvyXX#<8LqVtZbLuidNzRTCm7*%Pb|Go6>l4{ys@ik3B7J0>wkU z$jp-?`Xl5=3#4VGX+DKzX43@av(y^i6dS_xcqk~|CLTb^h~#0a9Tfx)q^fdcfzD}y zW@2K$igjM?A`!Au(!fNXOX|to6>Rhdt=JM45j~KzCXqC3!8Vd=&*lx!p8zTD&>kID z`Ly=Sx9X;|h06>WZblwBAkn&W8?nVA{w|SjuqU0A1gJ!$ru*v@;)p-WBrkTj{?BcQ z<NeQZ8$vIyyQ?dsu7)R8o)PwEP$RgA6Ljm;L7y@9)_Lccv4d$1rw#M}4mayyZ<$ud z4EOwz^bzmj&*0+NR09A8VD6-bQj@xH)AQHNaTsIAjxx9tZTr3Wlop;SQ+ua5-OrJ3 z$^)PpmZSI+#H(lQoS7OLh-c6<mj)~u_^4LJE_c?E86`_RCm?sG0x}baS;M9XKZ7!h z)q04cWQ(RVs_rc+v&c>opa+W<Oz1MpMWchDdrU-Ux&N_3*1B={EH;B7A{_U5-<~!d zqxJQ5z!C$@j2nb8&oXkiZKgjAqw2Fj%=Wxm#Sim5)uub<cNb3Nq}w`~Rqioo(~i4S zv@Uzopj_&3F>vQNRWxwAjpM;^7mig?6Ss9Tvrd+dPxU28Ar%^(ep=?=VS7ZIipDA! zAoe1g%mQl`cp!ESP&%&TTf3x)`6;ZX_13ha`T=6i{JQFv`9GTUMhOXH#yk}=k}+iu lZQ3f{yr{h}48?dLU!+a%sD(?dVwm)=@lNB5wXf7Z_isMbs=xpM diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/barcode_sync_dataset.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/barcode_sync_dataset.cpython-37.pyc deleted file mode 100644 index 762c78a73c52baf98d375c180367e0904c7b0b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2267 zcmaJ?&2Jk;6yMn|Z(XNN14XJT!61-YN3C<<0E#MT(o_h60%}Vutt_p^J7asB^{hKH zPHW3KKyt3QaO04O6aUg)IrU%Q#C!YU#7@<*cJ}%0oA>#9Z+6$#nieei_it<?u&jUa zPrY0q9>Sv^z{V|3QY$RqB(%BBozxk*p-YhGrryX8ePVrYagX~a7WajJ?1T+Yo?7k3 zJJ4Y5zay}>N#5u&6=z%kx$!s_<Ka|4oyvHR8K#AaQMO(V5D($ecVQD&NVpZ+!r_G5 zC)P0uUG8xA#0tIAYUuL@*bDNF-O|KGy=Wa5zESTZc=R{0aWc1FS_i)R1mCBGlQZy| z+ZFd-#kG-ZAns%GJK-+a@n$>p=bmASq-H2+BDr`&vwrcXijk&?6ttfyU?!UKGR97` zNvoyMl{~1#_3Wn1=*roN<oj(Wyo#!#l=VcabFVO#H=na~A|5N1DafX)McV(zQdraf z{&=+A{Z$L4yKKmKr^jA1IqmL97H5*Puew4W>TWg`Qpd1oScUFSNw2FDBkqq`e82_* z&Za3y@Pn<Mf-s}32O1BV$<%a9l%?BZX)=(JNk&2&HX7@#%Kb<~QKLHI@icGMA25&> zX1@TR-y|&pk3IWr_fpls?*c0ko{8%c0#u6<{)kHUU^5mJi5!z7ESi1f%&k*r?wpY$ z7bv%&ytzBKZ(B$H+$-J<<Gu9f{=Ct*=j1KIl(4s8fIbn7*Co)DNsjeQpnw=5?W=6G zRLeWM7A|Uip|rm+#YVzF2^Q79zgP>_=4Kt@!E2@lnr_p@H^j(`Bu!~g&@t0mfG-)X zbJ7uSjAF5gDg`=1=gLZ)1MG<~6D9Sz(#nN}kut7rD#slFhEi<0_=NVK0kWa6%2Wve zd<zy2DTl~n10Ge@JBw4;+Ze_N6dodMHTKGTb)9?PZscA+&6o+-HGnG>5TkfC5i*`C zgiyFX5GGQIPUIjG93UIsKu#ZkyI>VP7T*3qy4r!d0^0Ix%e4qUx?nWo$sjQ-4X@Wi z@sLR=((p<qBXKCC(P1;|_iH);c9C2V0B%7Ry;*Ko(ct>3Q@4Pt*I~16G>LCFNz)EU zV7p}Y#qQ<qSUtVy5FFkfJVl3W0%2gV8T%AQ=NbG6_KVxM5cysE2s_4^!%+XrhCXm+ zf6^TaV*)}-Ak%^Ziia65#uy~mKw|5vSD?TyDa#JCkWrq*CdnjI(+lmepBb^z2@A+P z!{Jz2!7(YuO2iD%^*KGq!YnDo`V(1br%QsAX*z)sA+!dw^e%d&Q&ds7t;8q;(6u}C z2dNEo_&ur<z|)jYw4keL?6mFNE8@w$qHJw151>0GM6Poesoa+1@YZtxUN04UmA?@4 zi&9Emhn%<F0#)i7(BWE*ni2;-@K(W4Aa^0gK=IcgRZhvkB`yivbu#<%JvczfFCE;6 z#tEWG!T^e*yctEKj8C9@qP!JFuO=+5z64_h(_fjgn+mVh&1KhcNGk-ZLO>y*(fNS1 z)`Cw99(2zJa6(T`M&qga80g$8o9?^%0_j}3Kswb0(&;DQSd!KMm+lRPKrW12NY=um WJa|yX^)22E8n1=G4(t|bdH(~ZI)R4( diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/channel_states.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/channel_states.cpython-37.pyc deleted file mode 100644 index 23e3c3f8b5ce84335b85e17bbf5c6a79cae3b333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1644 zcmeHHPjAyO6px*_?Mhb-af0n&aiWN|nvgh52r)P^0b=74MT*?mX+u+|vb{f*vI80? z4txd>C%#fH960SOaDiuc4J(2(7cBWD&whUY{QLRI`g+@gAwR!mUy0{^v&wQ{_<0Od z-vPlrj&d(V9CJU%Q$O^P#{*8@d11gCya`{z(Sg@%U4XUs`~rdOp{hA#Dk-=~e7g*z z1v7y845r=(VZ4v11n(3437rL(8g?2fQ5oFy3@-6G+VsvEppz?l)A(<KvQaiuT>2ku zbf3*3@Qa~gnWUGYHBD79r6!vSZP;`sI8~X><Y<txJcln8d?a+g-KH>JGR3CC2&J96 zT@R-wV<x4@V{l}Irn^)gO=t7I<V-0xcP7@!E9ajw$>~ardz1@V7|3A9ZEo+lBXw$j z_jmw_=YnREi&I*pRIp@B#j%j4?_6lR54FS!5?kaYRF>2kEzWB?pjsq_<Zk2c-OCom zlM|*!HhO(vkMqoAg=9IM)h&Vab)vGNZJHU2y2H>rcTic(T>OC1BNdjjikysv5*11F zf*EBo5N?W7qgZ0%<@Ln&dScguUaRV^wzz8lYEHGjQf1X$%|2W!Wb9g^!*-FT%m3go zE@VhRrs)??bs&lF@1O2QuQgn9#Kw&GhwOyOd9){)?G3vh33;reVkV?cKo+y{Tu1xa zFw&V3+cTC-7$7DB_<#kU42BBu78gVCc+5<p<^z!kduYJ&Y$O-OS?uY-YI*(HyxRJ6 zLlzKgK(^X(^hOtT@dnz!stap1pR7U6r(IB1`Scrui1ABujx5{M1F#G@8X@2vDG9I# z|7XuXWsiF^iGqjNQ}$j}6GY_$$SUF<m|jEK_fxG|VNs#3fe1SqxNnwtZyv@@cSv7| zb+D>#Epg^{^@4T_l--8?CCcyy?w}4<*I}*K2#I^)Tuzne80_%pwy#96tWqva>*2KE RN4a=ptI@WM7Vh}1t)E2j*9HIp diff --git a/brain_observatory/ecephys/align_timestamps/__pycache__/probe_synchronizer.cpython-37.pyc b/brain_observatory/ecephys/align_timestamps/__pycache__/probe_synchronizer.cpython-37.pyc deleted file mode 100644 index e579b563d0d9994e57b0094a11e155048aabd0fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4448 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 b9iH=0X^u?-bN9pIpdaDC9wdtIny&SKnU?XJ diff --git a/brain_observatory/ecephys/copy_utility/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/copy_utility/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 65071403fa5b409e594947360cb6b9a63ed2b507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NHbFz<B{XRzn?8$^ujJ|@xH)+l#1FpT z9mjpgt@C`uNO-?Ns;`8fGHRA&KOji9XX9-5U~L-z@wskh{NPpVIh;Ti6<h!#Um?^M zB}}=(-gD~|`kH9nDSE!u756%*iG#X<qoS-av>}_aYC)s06<zEh*fy4`Rw-0cJc=%8 aqeCo((5QnDg^SPO{A^`s)FOTMCbKV@kU#kV diff --git a/brain_observatory/ecephys/copy_utility/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/copy_utility/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 959fd2e538090b3ed09748bc79befb9ebb407c42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4443 zcmbtX&2t<_6`$_;*xAu)CEJQE`6F2zoOoTa><Ux`Qo`g5iVq_Ub}%)iFg4olmByN# z*>sO=Yikw)Qk9*mI21P^l`08N{3%>H&WS3x_{=RQey?YxwUwM;cBj9)r{C+}`@Pri z%+3ZDp6su`jsJeqvi?Pt!^cJ8Exh{QNQ5O=YK3*qLT>7IXq( h1AEhn%O4fgk#; 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 diff --git a/brain_observatory/ecephys/copy_utility/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/copy_utility/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 2b5d38c3ea6794895b34f0f2a74b1850d2e6535c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2874 zcmai0%Wm676eT4}q+Yh{Jeu@@GH6g(Kx_w1n?+CrPSUy!5GVocYzPCyh%>SnksM`) zlq;c&6zMj9&|O#kg?<XRU3J}ES3P%V$4;xZ6lOGcIInx|xo7yW*K1pNvY&rouR50X z8yRO$1C2ct{VOVNaXYaB`mZH+S_^76wd+Yebpj`C1dX&AG*dTlQ!nt+R?te@LEDUR zl1|zUy0#^(7d@0UZu7=Z^<e!Qi#NIZqs3j(eq9gxusz;_-4b2c8?f8F1G{7FP1s%D zgWWUsCD?0x9rn7YiA%4Y;4*spd;>ijX2cb4A6SFU-*J9xIIzps19f~5O+?BDZs|Rd z$4|suBxUm;S8;Y+)*oki*&GU;3tqYprA!3NO6N(e^Ro3gn-%$foCvJb`$~*ik>saq z)k{xL*q!jRFYcC2wD3QSXwS39Mq>{}cTou|u(=h~%-L#Xo7VjLJM5u{1FRH=8B0YN zmhCW1B`*?ccf;^y!IJ9DFP7TCI;Q&b)uVey&$Uqch)o#Z8L<<VEsh>!ERq>#caB6h z*GF<DG996ov&ljqJ&8w0I?l!Rj73v+EHF1oFoI8aM~cN+C`VXv&T^?1yCM=aX&2KM zVUfp4oG*4mZBW!ZvxVy6EbHW44V7mb`yKBc^zYGt+o;aG7j>|p#_Mltfg>7dJEq+< z?S^T)you<!6+(yd5e{&;T%&XNV<l66B9s`^N>7QGMXV6A4i`F7@hp#Jw%j%Yb7_Y8 zTjL^0{29w9xBN`z{)<BAKF6$xoV+nu1}8BFj0DDLEx4aglq`-XJ{FKgj?n8{K2VY; zAd1g?ii9tfKaDetl{69aWE3-S$3Ka4%$&s9A0xQKfv48sx+0WRpQ;urP(>Ch5{mFK zXV2q|(b>!TR4mS8T(vf7-X&C2G_B&<HT=$M$2M<QBmXUi|1a_`Zy+BjBA#f8HY^wI z&V_cDdx%J@Y$F!2;Kba+WgkGpxEK?48T+X#s7$=*?P(zPmz$>mn-Ip7RC-{W3By5e z6;A3ZEk-O;?@>i?scTeuRFO)RoeIiu!t^BQg9c|%nx2(VUdOzTQA|#HcGvtIz^UlX zJ1{oUu}4Fnq52mX9Rd%+V{?~#Z=9fM2;QoQY})NJXn6-RMliQ|4{)xP8$+29md}_1 zt#Tyu;c`^*9KG5vG?7l}MHcxA6c!5PVwtZel#l+FVH(Ir#7^R=NEQV5iBwZR9{USf z_)H036<J2>fWcgz=o<s%j>{_{GqF;nP7!GpJ@ii*{Rl-9(%)OTHKmNSNlG`^oW%(n zL7oV7oEe=ponOG37+ZQ@CM+Fsc7GSvA1K!H{eQT-b2ex>)FMGnBEx7^e_Uh{Wd!*X z$rNNk*3IGnh-q>6^KFqul7n3{CANKrRGdkjSD8<lrw5Mu(41n<l9(em%eG14Fq4_6 z2zn0?o$f|EFcoX;H->Y_cv68AEbI%VknLM@y@SCgOc9cU<?T@sC)`hCZ6bupB0HCr z7@-?u)&)AoZXE#ZU+6Ikq5Um7Je1pylrR!ft)&qy$kK$(1<oQg<Vh&Aoy>4ubpD<% zE}RWog%+V<i^-LsT?HtFs07!c?|2)J!*gdt<807R*;Itpz9FPhSE<#ACb)(!gw@<V zMvXqeZd)jtveC1VJdR^GNt5bmQ>j6fXjFvq_IaC5G<S76i6-s?lTt_}m%Ct{S6(|1 zz*%O`XNhFo+{e`gTsn`3`%jmjXps|2ej<;LiRlU5?!FwG&gw25)C?g^=nt2hh9sx@ zUC9`(U?)W&&LwPxd?Scf*}^uV*+P*=Mt#eMS#c#=H!)}r#UztKi^PU{SEEC3&e0Lh zYddI&I*_sPqnneEaez#ty#5X{PtAQ*L36n5p2@Sxhr0R{%l@Zx#u*A)&^Pi-lsJ_o zBaMo}w$j4^UVMY1X$cSB!9VI7TrFMVU=ojl7E{O7$Acnu3HopCopCG@t`&h>i9AVr zg)Q;Al6$&2gN^e^rynAUK4TTWU@fC!>LY5IJA<yv>fGd$!P^{al?PC(iYE6-{Z47! VwQttCAU4sv@ASL<R{z?j`xl>B&sqQg diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index fbb92d7853a3692738ef63338b85e0c25f372c96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYL@zX}2|48|)sh~R@b=nZZn;-6Jq#H~<rZP0ROdbB;IqpPps<SV)Q2yRZMgBbXJ z3E}%fR)axbaMAq=xxX@g)!|{m3SEW~J2C8RAHwJLAD`QLD)#|>kZ=SuF5v={<dQ%; zGBA-y=OA5!6g1N{#}wqomNM9gqXu*Z2jpyBv%^$H>A{k6C0{&4bUqcRF^3A>dXE%U gaIM#<4Et?Ng;JJmRBGI$XK!|Lrmb<Fe|)pV7g+&BCjbBd diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 11fb91e157783ec5a989090e772aaf03b6ad2a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4907 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 S&?+`BwA_-GXt$hd)%-8g&rXj3 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_current_source_density.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_current_source_density.cpython-37.pyc deleted file mode 100644 index f35cecbefb22c1aebae02904aed7d0378303ee57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6561 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 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_filter_utils.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_filter_utils.cpython-37.pyc deleted file mode 100644 index fa7ea5dde65e9ea185730b7d2f5213faf4871ee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2531 zcmb_e%WfMt6dle>Bik`j$9*{6u-OS|>_xi@il9k~u8cNt+Ra48fErTPI3tcgQg#H4 z7X`Wv`U6?i=&FCxZ<uX?0{(@rddShpa#I&YQ39kyioCq{+;b20<kqbX4^963J^Quq zdB537*J6D699@?fxW`H9O-V|oe(DoD_sbv+@fnoSG)`mUiSVQ+h)DK4(HFj(VP)*^ zc|3d*@`%Sjgz1J`?_*yd`w~0jy*Ck0cptxRa{swE*to=v-oS6d!$O-T`er^W#a9E; z#JV_^tQ>?*P>yHKjuK;`gv>>jPneXV)Xn>{D)ge8XJ(>=o>V1oVkOL6$vm*O(Gv6? z`crflqVawr=zfh*FMRG__~!xUK^@fo%kYA51acl?#rCKs7o-ly{slRYFptrD9A{4w z9_)D+ejVXFR!`#Et0Nxp@O5zBt9x}kwjoCBci;1l#I!mUbQK2e!k|p@tBIK~LzxoP zR26mc(Xpzg6c|v>4BOw>plHvSVpCy+(r)@-)!fu>en{nfI$P{Z&Xi&cw{A}!e)-H9 zqJ^YpBIvkMQ(BE5Qlko1YWnKRmsivjQ$aPGA}8%dEB8CpH7>H5dr?U9-RhE~E?J#1 z+{TMsXnP&5Ei|2}Y9#jEi5t=g%j2?QW@YuTIuqK^sbG?71K612l#A1XnWD1M0J^-A z+7xDPa2KQZ@)DcxxuBPLxA+}7f?Na7UE}EY!krR41CAfl<ErA>(*3Il*S6e*bcgoY z1jJoSyv=u;*%bvQ4AdA2A+gQUgtx$03$}fM#3SOOEN#|q%ouX_R>JJ@^$7mS*~gYB z;KEx;Tai+V0-RB6!ARuO1=D(b38s6BV7Rmc>NsSt3O(pIzMQ3@O<fvj!<)#Vl5Qej zIWt0{H<4p%6LV35+Gz}q%VR9-37d&Qq9SYCN|mz3oZeo-mz^?D7s`-sUt^L^`=-iT zK+~;t5OA&KMVsMYJoOID{qf_|hr@3*Dr(3kjPH-w8Iz0QW69tmXP*p(Jk`T$CZx_W zR<p@M4-bpcP!~o#n6dmNI~F)wme|2x9*h(#WLAw}@sycLEe=F3?4g5vt{`M4)74x- z&N%iLW^s^>ixLH$&5>ulKU*}r8aU)8bDnopv61U74BiL3WXInncZ1u$x`X*3asV~A zT)h_ZI8zqX&869VZgjJ?oK%VnrK~LGp|ypEC&9DWI*ojUFE!!h!&U`J4ehH#%p&7E zm5iX7!4Rr<-ZTD5SjSL1Xekd~hv!M1K=nfQDY)<iWS=pOx_7}j8C!<(Kg*e^P(aIT z1plkLtu*9csoXUL-;$x{Ru6$MwfH(g>%`gJvW9o3jZVg{v;#WkM1N8oPbl)@Y>ciW zwQkB~3$`G!t2n;48T{LWZp%&j);iY`|0XH0FNCZ33Dd18b-n@D&H!a)1qkd5(!LMW z*7=oeJ@3@&KfE!PifPhaIv{Ej3!t~9z1p^eC2bmy<^~0mCe|n02mMwecI}pT?eL!6 z=by=RyY)K*+SPch8!~DLOPA%)!r@e)9d>Z6xwAZi<gOmO`}je-zfpS$*+%{C_-YSp zgRLeuiy26voB-NC9%<wrVCQuj>AaXNTEBbCC%Flb&?a)^a24!Kt+`=kNjYDV&!!ch bm*SBXRc+(DO%i`A2uVzQa`&SUV@&=8lz`-9 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_interpolation_utils.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_interpolation_utils.cpython-37.pyc deleted file mode 100644 index fb13c77df07fa1dc7a2dcf539a10a738cbe387db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5345 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 KpM4ki`o961J*UV3 diff --git a/brain_observatory/ecephys/current_source_density/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/current_source_density/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index c009cf29cdcdc10ad185f85eca7a832eee038fae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4293 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 A+W-In diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index cad0cff067bfbb399871bc524e8fda477a9bf69f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmZ9JPfNov6u{GV-KIEDL{Y&Hu!Gydi-?F*=V^){B9uaTZQ~Y~CL!rId-UW7@#I(P z)stVrlP{eEw}iaByx;qm<g(RTCpg5%8~6?(U-qyVE-Dwe%n6E=qz)&U6F835UG8RH z;8nWEYndNlINEExo;89-)(o0>_8&;Q{*8G_+bOsD300%Q+-vzllf0)G8h4hB1D2UN zI9LWxpy^0X47JoPcbDl6d!;Foa`ToM!^H3!a_DO<^<8@{*rxNsk(yVIKrwAE7woMP zj`b_-S$w#PXNxW>pPKdAU-fymy;R&suIng1iEdckil6tZ)9}$yZ9*79+KFKXq6m8e z5-CzR4yl-$P%0`+f>PQS3kNI?4a@0~f@BOsim{xdM>_7t8kmS=j2WkpOI>vT8d~iC eZ{3X|CRiRt9aWUgvrMKFPS5TC7~AKDW9Ki%Yo?I^ diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_api.cpython-37.pyc deleted file mode 100644 index 927ca21fc363c447bcc6df087ec16e67e4e6a5a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2689 zcmbVOOK%%D5avF$dRn%Whiu1j(iav@odUfSZ4tyx(;`Kn6iC~{LcoGrGWOc5)s|d2 zm2R#53wqYAr~ZTf7G8VmU+AebT+4RUtsR(xhU9W)_M30W;eOd{)(Eup_h0Cr9wC3> zWYJt0Jchsg76c>ANXW<tjFB0bBP*~Bd}bzg;OO2BD%@li_qcOV<&}dPuOB->;~T<k z=A01b9GgLtnJ<a&{tf<!Zz=CZmdE3iCaUuNG~+)~p}c1~7j&5LzN+pDL8s5-Lmr|2 zqE%q<82*wNgm4lVj07gz;ug1i1f<ggRC7SW>=P$&d4+q-fw{{nCw5R}9;=>^pvLZ= zSrm2`CHkn%9ad)z@KI;mrMjrqoZGC$RzR!4?k#EIdV6lMRkjA}O^u`jNV@C>AZY=v zn{$KRVz*(oaysj=b(po;{Uu+BZuMY|ZNU3B*&XoLVFqydj#_;h@oax8zZ2sF9_71P z-1kjYmt0EVHjJ56jchVZV!6**Nb|@#WfFU!kUT*$aTny|nEVQKf?K2S8>-VE=g&r2 z!bd#KIeRL^SU}cn$&*(C(;#5SkUxm1L-)^bPd*#`Ai0nOx=-28kiMqrbg-M!Xq+<o z$$+Ovaxl(#DkG3%ggkg24+k>N`9~Rz4(T2T+av)EcKC28Xq<-QA$UBZ`B+RJ@*>Vf zA7(|sA<g2lXFJ(cHTHNOo-!fZfKr+uh%?*z4{19WRe`|TIf2R*JfDa((#Bwq{bkIF zDk%7-KvG2u1u|5K28>ku!plNNb9xJ&7TAp0{Y$ZF^$6dNZIQzlFfPksfyB~ClugB+ zRPNzx?3W>R5K=7TkpG-<5o5~bI(pSX8?*PyQ7u{cj`AjH44z=y)uVlyraaM;Dx_=3 zad^IUBCIgju)ms6w;;3&%Hjr!n<&mU;&Mb)j0nNVJD^v@;mtP6<IsA(UFJ7(z#JR) zSEF<aly3o0@6J<><Okrqz*zae-MLWpt)<8#8{t92{%VAFf$(znYRI0>nfw^M7SP<; zW;uO@A{-lUk!G<1R@XZ*xb2pcxpoF8OkQRB5PW(D%b2};39K^%-?%;~<))L-kc(wp z>xe6*P#$O!j>bnZ4|5JRlji*M3-}(C<10739&4K=ti6FwMm#-7_vr1>y=e%C1W%yq z@S+|s>Z?BG%|+GB;XaoI-PhWj`jFqnkhW1Q)z9AIXonQO9;Pyu;fUuVj^r+AFZSw( z<)rKSv~1^_{l4$?vH7-^77n%ODldc_k9ZiWS_oNYlLW_&F#KsklVU|+ofKFilqGW^ zntBwcxxn}ZUOu9O0!zKPjiQHQ0|gc+u?0ez84Idk!Hw{>fES8;xNsi49^nlluwvo~ zlRF?hix}&6+wvSZ{rdO7E&BI$zYS|GtEE@FhPL%v%7q-o>0SXGFA|M3aA2du)oG?# z;ARxAZYi)fDI2~Z@}L3_@Utv%U&1ZHrE>BKd?Dz-wc|3h%KM@q?GY9yiC+y}(=$A; GYyAsT_He8K diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_fixed_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_fixed_api.cpython-37.pyc deleted file mode 100644 index 9d1429e52bc48284dc0372a5642ca7570d0de385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2644 zcmcImOK;Oa5cVTU-87-;gCY<TDF~rZ5kN>B5JKgBfdE2qh$2}V&o(u6)@Ii!wBo|! zM<5|iocK$=a^f#=VrE^ZPTEEkDQkIV*E>7@zL|a9t5(Yf7V+aFdr>ruU)0D-0W0hH zs%t2~05dT9X4^E4#|Btne=)%3)@QqIW4i!FY!|tS?E;iu8jYFXILc_4$-+aAN1Hq9 zxeVWMFTNZ39`$6!#L7Cps)B+WZ4->P1txm1lG;;WDPQy+u$VoRGL)@`oj9&5Sf9IY zQg+>b2!nv?71w<`U_sjR(~vXhO^ZKY@89aYQe3JI+how}vUg1EbnXh~g#y@(4j0?1 z6GmJp4`oPDJ5T&>NBJ?o5;1R!^*D|V0<?gwt6j-_;f7uGxXt2F?p)<5zf8MPO4MbM zf8g7O|DFT&G@~79BSs3cvQRjtZjZ!<zOR!(2gQDD!1`jeZLpz$8Y2%S)J2#92XzT% zp^SP4=AeSwfhwFpJqz<tLtTaiSVTPsOR$W(0w*!nE6K`enjR5Q$`xUtLO|(#hOb&i z5#x;bV1C27@ZJ7we!{$=AG@`?0GO@%MkwowWA;K(-<_+AFvd><0jrIaXQPl56c0Aq z<vlCchorz{PbH<Tcck}IC>{J=QtR>9&5Y?EG;?+640HF=;pm&=V~$T}DcFeWLrR$2 zE<b{hBtUIPn;;uGhfPVddYs83p-Rorxl7KgIWCO}Tt-KEw0Nk{Ork{T<j^lEIm4t_ zt=;(tl$3*6ur=tTp;mGMR5f&*1^mJUkb6l|(}%ZA@M4@TJjP`uc@L+XTFSv(n*eis z-1Olt5nNySE`J|!>G!#a)k+TS<q2rVhD{&rEP)*eKUSx65bF~lYUAkx({s|>WJ2&j zoy}pJG$%9r>BB2i-1ItC=W^gyCj>6F9@(2{MeEhPh?Q)s{ch#g^qOGtK(e6T54U|@ zk9j`|Sj_iVx!#1+&f%`B*LzYDgMOFGqu2czBC+Qm4_Wl@X8zCTNL`;m>hRJ3O;UMW z97!_m93?4FBG7+isK*Z(UOXnl(b26&RnkEz@jhk95((Pf<p~n=BxoO%3nVDHlJ+Y} zC#s~qK%OEoyuPG0IsoM?3aaSS*RdRX{LvPzMzMV}yR9@2+*X=Ay{%+Ae_N4sge2wH fEEsTo-O@J_?e#D~iE}%>e%+yCND=3XT`T+rnjn5c diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_lims_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_lims_api.cpython-37.pyc deleted file mode 100644 index 474a6440bab51ae440381adc1f9f6715c8b6253c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23103 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 OB1?Z+QUCsYss4X;0pV`| diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_warehouse_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/ecephys_project_warehouse_api.cpython-37.pyc deleted file mode 100644 index 6797ffdfe84f91e69a75ab54c5a421759cfc494e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10094 zcmcgy%X8dDdIvC=8O(4<krXA1T1Uoer4>g@jjh<baTLXC$&wOhy^Lb5S6N633Y_jC zL1F-?8zXY4;Z`M5RW=8uQaPlOS|>$SPPzD!ROOKWB1c?vNcoUcZktPfUjrD<gL<s( zWTwz)^yBNt_x`%C&(790{K9|yQ*Zw_HSIs>qxhM~e27PGB4HZS1I@|ax}&Ra!!gvm z<e2JRb}GzZrJ&li9IIP%YPyDRGpKiGoEeob2aWEmGuxeW=5+1%G*)5Nry8sBnI|RZ z7}M`)P3udHrmcOcBW)UK?bEJzGu-e)p3Ys9{jfd!ZtCg6%{GrW`|`Gkws<?a7W?Q? z7hTWodTkNObYZ>c2h8<C=JH+M?j^iU(2L)2g$F3%8m-DPc<I1o`g7eWtDJ#ch1twx z<)^w+&1URa%wn~tnp0zSHiLJa&#(rYeX2dtod)|hJI3bGdX_D)Mbyr*v+OuqLdh}q z9d?49L~fp)V{foi$Stt*Y?+-#ZjpVLeT%(`+;P6dF0eD~t*1I5o?s>H%u0HCe7$!) z!8fCx<XHHg-MSchNl$oz+l?Oi++F$M?W<w0`@wzoy=E(n`+G~Ri*Jt=CVr>0);99p zpf_#EM|k8JBm->6wk4Jlpq|kB%-Gil`apA0j_H_dskxaX@!o<L`>l21`QfFm7q=p@ z0W4Hxdy{uLnnW^b8lnV%8EUw~CYqR%2OZHs#Xo6c4zFK*{?V2DpGhv{eQ(oat#xn5 z3;Xx4g<d-fnfLB}9zK%yqnL-XjWi<E-~Ys4zc2lSUy8l<wzt92Hwe&zZNIJN<VNd& z_{d8l(SMs~^isUtI3pYvE0`+VDR!4?TX8?NT-Oi%#B~=jS6M-#>6YHm_rCLDw6uyo z!)-338$Cb5BiE47_71cyeapax8_!Dnr9o+{#7fH=Gq+3Py#$mu(0>VD8I*ph{k{1_ z|1%ve%Bn?mS=%?M_d#V~K3Dv+w)b~!fejJ9_q*MQ@!-mpyF3Vf6h=GYEkEF^;EyX; ziYBW&sB^ce((RzuP5Lpv7kXWOjz7GRFKlgR{lbHLUXpn2O>aGKG*W+uOX)}9cpIOg z#pA~^t8;y}zyE*;Bg21MKdcbM>w@TSZ-wv1;AGBhzU#G<pl@Hc!<}`Tre=2{VduT< zz1k|idm+1Gr?U*R4<e7bfgf%+tD;Kqh_KRQ8$5AIASB*;FYrWKmYZJ8)A~=npvP|t z5sB3FgQyLHO$7J4&9a!K-h|_{vJE2Gkm>xyCP{Ie+7QiV$uVj@Ph%CUVqW6Cfl^70 zG~F<a@?2?7Uoz(Oz3;t*UM67->4sR7=ti;UZDfFT^)P)Ith#N05{!Yd1sVe7lt4K@ zNFaL^<&+1;ka7&r7PY9LeF-qkgYuxHD5tuXHZsuxv9Zp@2wL8sLQ52KJC`@M>SQOp z8wXy(?Hxbav@;O)o|U7?R$JDrq>D1~yS<<%-J*jOC$JoGk`mf7g*kBwxu&U*kyi2v zou=BOw*EA2+qn2Eps%2hR7y@?(sKlS{}l*08q)tWDrB37-2F9Cp*p=LD#UNlcD`co z1!)5DdK;h3xY+o2zQ)FnLu!+JpdY<SktiOZIVIo#rav*{(m*@VpX19lK+^`)ld+bb za;IqxA_DrTlvX!A34tcih)RxVDb8Ymrk;s|aaLD5_dcpKEnw93y1sYmB}6qnk1v=1 z?emL6imCw?DHOG^FOZp13dRQ56_2_5^MP?tdam8j9*FzKetEx=GjW9!!gGDUith@T zy7;yRRp{}W5QEY|HK8wa8D`3JUDpQY0qQ9C@Z7*st<F&yT3I8l(64B9R~wWD1}k4h zU%V@L(`HxK_WrieC|_IY+{p#RxH=)dL@Eci9_zJ}@ycA+@JzjvTBkOJ&JhdP(R6XT zHZ@}}*-T4dGGU{QcoRvpcBntZ67{r5n~G>hrdCFnf~V!Km$WxiD-)O~sCY396PA|z zFaZdqM7~Qf74O)TBj~B_rX|2~W-?F;j5CvgQ6Cd(MVv#g5AaCJWSXR+TP0IB^+kPN zpEoSL8!DYcYUz9LzJwBAMD0UT9Mdy@fDxxj5nASG`(#whlo{D3q+!T5$ux}hO_E8z z$WJ=)tIQLS%sM}kU_dDAe4I?IqHIL{U7S*Xm+en(-L}{6UO%)<RKHQX1XiyyY)D~^ z8YPOT4&`oIg84D3?!;wuc(KS`Bwd$HGU&uE85;M|Vam{Wg-Du)(k9f?kA$6tM@gfz zSObwjqCX*X1E_}&U<_bHJgdO;G`CDvBIoFtp=*#&Wjqx;RXo=2KR}w4m8|+}$g0|Y zeNYB5)XDfD@?aL88c8k4qRLoJJuf|MI|Fi>8O$i3<ZoC5`6_zMP+vB?-`G6|xO2-S z7f<ca4rbXgz@Epmux*Ghn7QA0_ywewg+2`>@vh^mJTTcJWEhNRR>!-F_i?-}yqEAc zx5(i;!R9t-jVEc1D6`0M^Yz0LNWkSaFUC$iK5zToI1-6{;m{4eV0+RQUHkn0NOk6+ zsw%3Pl%6?t-^r}!$B#v~6~zgRZ1{KZh7x#Na^-^0F02+7r_W?_A0zl38@kQqec18> zK9L`8*uJ#GD8Uo*^ZWNYo*#_WD?`28f(5)n%_h4yTS2tL#R|Ybczhm0&hKC;FPPF$ z)sYW@*%j6veah9Jh#m)+%m?wqcF<#dRl?-=yF6TBQ5cC8IC0J9q+cReCTwu!s5G19 z)Li%A;3*M5GqM-y{Nysyx$()QhR=S2C_>c_VYs%rV-*u|%4#M~2~$Z;=JjP-l6=>h z?eyR*ZE$Q7v{7p8B)1fwI!i}QE;VV*PCZ8@q*OWsfN&zgv;b)h0g*A{!p(6OrceWq zsoIW$UN@BDx51On?ARilMzLg?QK7oXl*p`TrN3$t62lJ}-xW=&xr7AE5>cF11gA+h z=Q4%$eX9NeCBH>&EWu?Qh1gzFK;m~O`5`4AB7vr3yMnB|)YwRzW9^;*u*5CaQrg+> zOz5(-G2-6HF1ktrtdv^K)GNAyzg3zuNV(x}Eb6EAlg2!hnyJ@OItPVk>6w~?sxy}K zMPsk<Qg3I@{Ag69H9B6KOh@{WoFf-e$+xS>Ovty)5icu8d_=k_ryBt)#rc+!1r(O4 zt?m8m2w#6AY>%a^^A~X#F?}ZgbC!PrC-U4HDkx-HSirw}56f4~BMA3tZ3tM9eGB%; zsIGx1lUt}8r$IO_zM$r=5fGxzW+k(o#tBedr}`UIpE-2mV=7R@c9U}B)^%DR>Lz)B zYDvDhqLE5QBbG4-%Gf)fGuDgnu9hN?#`;A-d|j*q$CWkjfBp}o`$wBz81mp{h(^GL zn!rX;()|^vF0eOFAQRFy5wMMWA`b**T1DQ=10-Z(7lf0KEn7ZYEy{`!R$;V26)CBb zQ{!eN{5?`lfg48%$w67=HIKMRd}=-{_d*I#MS@E5T)W+YW{U*#;ePW~772+Sk04Sg zra4g?@DAcS{>El9Spy}OEsv&6ino~gumXDtwKQx+k>ar5J-TULdEvnrs}T97Gb5-O zV-|#vQ~>G-CMf8if`1tk97X?1N*0^{&uA*=kthy0o^t>~Nw1W91%x(*jp#=<9eJ96 zh)1@NOmKinzMTp}R^dffM=iTSHRFO`jdQ{488M$BYDyBaWA`Y23Q`_5NMQVoha~U8 zoAblRkGrjQ)J5n{@_41_n3*89vO#its$-8J;^lw~QaJ1|HPB%d@f*yYiLna$fB6!I z?2?09DMnV^k6PdmE{)op8un0zf1QDc)5yUcHIb2#)Ko_20`WesFESb?YEG>JMX${Z zR%Ubj7`??ILnt+*d#S!Hj^d3P=>{4~{yS0eP&HKR%6Q1khrM$*#}0<3OacX9=<iUZ znD~P119<}!KEW5@iNfC@4`=tCfe9~TWxtY8@DzRvgL|tYFO>uEjq+y72iBmX{ETyV zwWM|c&j&5agYwo4c}uLK?1%DJgH`dRtcl(0sGSAm_y0ocpFw`^&$W)uaK!Y~VmMxU zW(>-|(5`BCwTC}9wdB}#UHprVn3%5p3?+Yz2P4fBjID)(#pj6e>|1PhU~O0aN*5op zxgwVwKUf-++3d2mwLo4{a(wH=b9iTYIee(BeCs4?-at)#P$LL~x=K~ggHzAR8!MB? zMR|e;e@T_#U52!n_j=e+`$is{w>`KneF;yb%M;<ZrG3ec1&3B>BQQ@9f5s)eAm!vp zJIaK`jxV`gSfSERBKwgqdtP8?R<K7(rd6-o`R}$TV9i3I$YIf?;cr+}P^x{!_Jr{I zmjZvA(})P&tlEW}HEd3>KMVbbJ#PC9>d5c-7(ksy<ZP|vnrzu0cWl{<<G|+(a6+73 z6ekm7z={o^^NeJZV}*(yTf;_$v>4&VZ*HzR(62UKHBlQ5Nsyh=u%00QGF!zE@^B%= z0?0X$Q%isne!+IHk+Vn`$pP33K+EQ>jh20O>Rivg+`4?$j>K?WLfP3)FKi!r%poT1 zKk}3Q*{_7B7c9J3GR-yH1U1t`iu{zr)C#A_aX8bMwQeASbBpNKzA`MP1zfXXli}D4 zpeK1}6{HGx4otJ&FO=#C8+iZqRn_#56>nb0xmv(~9hF^BENv4M{FGYF%a7Kn1(m$Y zFc@l8f;QA;N2=IiZ4UdjG~KAG%NAeEETi9%D9V)4@^$7m=Fv}W-Pjyf?L30=pxGRq zE^N*T%}i=FogM2;p^U_Hj!ht|aPpMm9`)wN&Rxieq)4Vxxd~2N5}dUBLd%X4Anx@w zoT`*OnWT+?;^nZ}`6Dkt;3N_7A}LNlu@;C93OHmgpE@?Rt_EIrop~QDgJ}O7&9uE+ zH(#y3aj7HICvGlITUV7!B0oST1E`Lao4R9qyS_~8v5WcixGOqNBMMz88_q*~sVHr8 zdBSLSlod|iJe?1v=9Y}Yv`nYW2nNLzI_bsOPM$?mjF>sKAtPrFFNGJBYn+yGHW2jH z2`2@TlC+{`BGXC|Dd<KRJ9S^m-Z~>vLrg1*0z{$c!?8LTHG!B-O<a5EHyej`6Yhyj zIr&oj5e-bnQ(B37N!-KifswBGw3v`nj~}_dbk!(}hkJn{HJ11pwIr_`nENT^6{eO8 z+iPm?{}XNG6(rglIO)#abh5<|wn50Ij*tx=qzzbUXOOFx=W!N(N<Uq0;06VPI>z36 zUj^y6hUXSUpA^_p_bSM_$u6yYZcrHK0LN6yEYroCi5?n>LANFbW(UVve~BA5pkH%M zkPUd`Z5Bc2$6^Lavm_o+o<>r4S`dINwFBuiJi45;30D#qavXIBDZ4!2%&7YZ`A0pw z{ota@WYnX|c*pAn$va>JNv@hk=Ze^|y|XXbnY<IRpDxa$Q?s<TwuaNs>@o2H#-v2Q z)jUaeScv^xH?6z4C&YTV%;BaD*L?`1Dz7ncngu@X#<+7KR%xLWEfM5{if>W!7A4<C zlG0&G4ClU|oh6^6igzjbeM;!`NPI%cZAvzgz-taXDZ#Rv5ffWfd>H&uIifT{%b&#~ zZ6uc3hkDssu<&bC>SwHl`n&bx^|$IL>K_}rYTcX{A=(Ouk~>J8N{nk?o)mvVA7vcz z#eLDHS~B+)?i3aeSqN*PTV!<IM-VkRwO-;wmib%?<;yFto~CxxoKx#+wx1sWf0@Tl PhjA7i$svLXA}{?fFfU-_ diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/http_engine.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/http_engine.cpython-37.pyc deleted file mode 100644 index 322e45d8d6e85450a293643e12ff4f0ae68ba26f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7753 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 diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/rma_engine.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/rma_engine.cpython-37.pyc deleted file mode 100644 index 9cb2f4aaebb83fcb19fdf53463f12519de0058be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4238 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 LJ@3pvSUC4DQhO0v diff --git a/brain_observatory/ecephys/ecephys_project_api/__pycache__/utilities.cpython-37.pyc b/brain_observatory/ecephys/ecephys_project_api/__pycache__/utilities.cpython-37.pyc deleted file mode 100644 index fc5c8ac5b91712beb8259156ce6bd0c97b9a9a45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3182 zcmcImPjBNy6!+MU<2uQ<T{yr2$*Kr#P}54l0j;(x*yYcGDi;<GA;_9|rdc=k*qxbl z8{#0L?tu$?<-(yWPJ97AjIW%y@BujSX56%Cno6wHj_jH7%zMxCd+*JA?{TBy8PM48 zKjCW4F#b{>vu45M6L`h9&=G^6*yth{&Dcz=u9etbJE?Rl$RHN6Ul?77REPs(l~jof zqf1uF3h`c`?h08WHByI}N7hM$+=E$-ps$VA{l7uB(P>#l?Q?b<@suT$$-;Y#1>H|E zp}g=ui$Yn>Lq$AmCQP2dD_rOZB4(rnTAjj4aL7}E|3rr2`Eza3Z2Nl857Q*UfuPwI z!4hx#N265Iy)SSqXv=Rmr&rjN1jTxgav#V?i61dF!AmJiYCk$Cg*K;~lO|;ZzL&|> z)Dtardi}4nKhK2uTAE*qTXM?Ff3sBjahhg3F%}ZowkOS-*%UaCsqihH@qDY)+Oo}Z zM@YVPa)ah3ZU4mo(cjqc+Y1nH6#j?79Wd%;_wUb79`wEul#3pIhRIGJKgVp``;_4@ zWdwiNqwHAp(u^_@LZ4>O#-g_$^?M?cw4LE_hzAsS;}|H&aJSEK#DcUB5|6P=`FNLx zR58uQAmiyF4P}6{Xm=!|IFb<+JK305;9%--!iLT;&AMK>;+g8=XwO`O2|?00g-i1` zT$A5S@KC#hKL*|_E(X?#k}T!Y-z=SX)5pS3z;KIXrM}ZlMk&K_0PrP15nDq#-qudJ z;LHmWE<Hp$a3p-?DJ*65n&}m(YM2p!G6DJ1sdD_S$t2lXdVgBeY3s^y757bkSFV?6 z7S0G;3n=N)2(D&{@fgP=xTFg_=f8rBqWAsR1-1teHRpnh-Wmi@bHGM%JO^U$DZc|G zfP4a1Zc`g}Q^lcDBXIeAb%49EP)z55-MV!i-nn@OcY6Luw|IUXZdzusnx#SxI2Az| zG0JtMhs(fO&Z-cHxJr|6!CMBdcTA*LUMq0@@Xr<Rxx1*fm}$yu*jC<rEp9cZ-<^l2 zcO$kWIO*IDvFZDZP_!uh#ym9Bwa1}a_@8QC0Tn;EP;(X3tX4vm6I4^_LuHPy;1%yd zCm}=RMuc*xV16;DwnVv2(1A&;94eaJ`qg}?>KeP#tp<TivLI-o!tO(TR5+9kB1XX( z*88I<CIMu@ixO&`p3rb4X&`Bm#aL3(suY!@5#?j9YCaC-o>4f%=a>&fVFBx$*C>aX z35EC{oXh$WmP_|RYlyGISE#Bm)zql4>Ad$5OaPBDbosr=m?Gv$;|vhKLR09^%-nc| zkRdH;=jaqc?WV9>x_WyGrJxh*%CFmqp{|IspdY8<P;_hXk(_@37BkEWmr$BP#vd2X zC<D)+T%Cg}1-H!Z+6;Q2<gkG#fnSyu`d-w5cpqM&D`Dg!$Mj4OakU=mBo7lssZ6NN z_C8E<OT()JJS#WO04{*5<ds8oVC42oG<9+_cTSb*PzTOZA5eK=io)SgZ&BW=7PWbs z*$gLC8>ZVRZ5x#K;j8e=!kytM+>)P?1)K2((5Z6$0*nn%>ZV?AnVpV03_SJ1R$Ak4 z0BP4bjMyRmpj4d#sr6R|5*0MG18Zw*ooHEe|JCZ$4&y#dQZkC^BPhHLaSuAzeA9C8 LyBlu9t9agj^n3eE diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 7139e883d9f1af436fb9cbc92a55cfebf1d3431c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmY*VO-lnY5Z&yDh_r$z=udDDb}8OO#46sTm*Qm!gk%$JXf_F(waXqo`8%X1|5C4> z{0p9(v|a2DWaj0)nc*c5!{Jc?p;zzp6Y96WbP)o$hvP0G@qi;0lqg5Y<4}cVlt&vJ zsklt?1aLeH(&Pt0dy3X4Pld4a*3E=-(&&kmK%VW$X~TN_@jpL?&S`p(pNj1~aoYui zT3LBd`FW@4hV|6Qs~3CfxF^RTe+5+nWs`nC9&hlA6P3esPWgz@hUykiG%bwg^coAj zbl6y-T>;tn*WhQ#u#>g8vb0#xR{^t1K?h%CtfEpA!(ii*)~0H+ot3WcyU7TVTGoV& WY`Z?ZEe(HD;?Dn_^F9Y?fc^mS6MrQD diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb1_session_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb1_session_api.cpython-37.pyc deleted file mode 100644 index 434432b9245c8ccf6d6b1207097c1039c45dd91d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9717 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 wK6Xo0r<L9la*?JvO$j+g zdBgKW-1j{GI{-Op^tu-Siy#pPQk4i0$H*U2GGX^Wq2f;{ArmbL>*gj<8cP&>f4o|T zIh5PfNLX8rDY-|<4ifw$Vt`lK!yw&=h1{d+i527=9Z{Y|Lhz3N24v3zY@F&?9m}@t zmU8gR)Hdf{o|~V0b*a77ntN`p*0p$SZ!WLHJtoLYI|Qhrm);4V!>u94GTKur;5@BH z!PguXU($b)68F^c%fvr#B(u+@@^3rKkNs`u=xYZ_7MJlVzfa;lopjLLzNY@D@jCG> Rb4Q0^6@x2?Xvds8{r~DTupj^c diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb_session_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_nwb_session_api.cpython-37.pyc deleted file mode 100644 index 60cf71c59617d7e13f994a3ec5f22c04c036dff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14887 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 diff --git a/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_session_api.cpython-37.pyc b/brain_observatory/ecephys/ecephys_session_api/__pycache__/ecephys_session_api.cpython-37.pyc deleted file mode 100644 index bdbd379f584a39bb50e40b218b2ed1ee6be379e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3770 zcmb_fOK;mo5avry%eMS}#_u{&5<5VP0!14bag#VGP&h!0TnGW%wRSBtrk3n3<wUu) z@h|8(x1Rc!c<sr5p_g`MY00!r0YO0$9PSKfcD|ii4u?OEj#dpg#Gk*>y^>-4jZFWr zVekwt^#%wtnCTlG(=|JmYnjMfzTL51TaRtuaSI@`{i0ja_p)1I4lDT8&WJl=8m|mi zWTgv(l|ET+joC*=qkIYT8VxIUUU;o2F24>VFA&skm~olWh(}(BA6_B~kksCEh44iC zDCC^A(6E0vFn9)+`o%O1Zn!2hT<a~sb#3mnjZdaq;0`Y`>nXrv&V}KYc$pPGn;MYg zR(Mr&WmdUx+!0>WT$POgH_FG}jcdNfMuD#n_%SvP{KSB-vkBlQ2mB<P0)C25^BF$- zZtlcdF!VgrYzE}>cjU8d4&)01`+2qi{34&xR*P&2xFwit`Q1IX{Mlmn*a}Ei2KuXP z4fxeN^RBZEkgxG|zHx<MlWl=ylkI>ER(B=cX7?`&?$!<21J(e|uh>KO2%@&l9z)W0 z<B69o9-j8p5myTGwI6zy|H2Vh2vL3zDMDJ12z_AgaQqrBg?VBIOkp1WWi;&AQQSX? z9V*)@E}p%|yTr|?$v=NQ|GxQFajBa0l(OAp`ksnjb6?O_AQ=6o$;G*91|b)!1vEfF z&7ZyFrt%`b6VlchZF8{oeb8WMPmU$^1PP8|#&a44viF21tLWc}N|r-t=w-=v!(Ln_ z#1mdb$ONv(0%DjS7w?2)x331<wkUbjm0}PPj0RrM;ZkKFk?}ihSREBmpE?YppE{w> zJ6uGZy_7PL4O5PQ;&p7~7_hMuaTQJDG*>`o?*c)UFLW(&O+#GGws|y&kBX>_2)>(h zDd!LFI?p!B0nP-@ER%9T6xM^q6q3zsBscVP0I{f-2Vv;?T}4946=aNJ0aN!<XdY*y zQJIE0z|yht#5wgnrjw-BQfP+6=7xR_AgUOfPzJ|bZKk|0XU8H@%)xC9-L_7t5ZqVW zDaR|>j{B-PxSmAU9Zm&#PtW;DAUmp&0<e`0;HE(iFvj(!481d+<o<CA!+JIbb*-HP zfC>WWLXA{UQm&V>U2DA@oa*w#lX5;NQy%*|g<wc|x@!d8NLg=4;xSo=8Ctr!!T|5X zD|b>pt)x<80k~bROBfmdB>Wbh^(*#5c3eO!ho~%}!yt@;HW$!JwMbHPbcy;d1!5-~ z#1P9IfK6X-QVO3sFX}R`en=tO&PJ5%)N7L*pwtnH^xE+1Mig33x|f2nkqslQe(*nb zhdbkmmJe$tC!Qa1$r(Y<xA#jDrIzGekT(6uwbFhH-moa$GRYxIV;H5d8+yJ5@gfCc zEjvcn$~m~#Wxb!ES1IR1%6eb*uwfoF?qky?XonLLR|)9^tn1^rM#!&S>L*X!YQOmt zG%iG4=)YtI9L3{=z}F<W`mPfq$5HAW2Z1jqVJNYul~YKHNU$A?t&q8u7m(5e34Y}a zKA1&<{gRwVg0&>JJrTv02;CAiv{KTZT)=18%g7}p%cy02kjZTOT4e<vtRh)Mf(>@; zF!+6v>&R~)!EdhILNaKllM(if68`cG>?hSjAXUq;>Q>nv(`VgI&Ut$tMq~CQ(0QP< z_Oz|-8l!PB>V@zdrk9}I>lnBN(d~pixdU^$#gM{^lzgO_56Rkgkr}<wg(WdVJXt{F X^3x<+dsuZ<4M^RrS!EMWt7iWP?iyq^ diff --git a/brain_observatory/ecephys/file_io/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a8bb53ba06bb421395253f907fe3b4134651735a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmYL@zY4-Y492hEAc7C#U^}>ph<{db5x0XQy^Ho}&6T@aDNa6%ldt6JBe*%48^jO3 zUqZ+ivKkHtf<^Zm#QKW(DdA?p4n2kuJ26VO58>nZkI!{ImHU7`NGQOhIb47`xg^kz z3``_a8>Fj|f@Zq9=z`qXTn5|VxCULq5jk5`ykW{L_h3o6oG-S}INxQcF@~~(tx#E) YDP_qvN~Lx8?9WcloGYBir`~Mw1wgtzod5s; diff --git a/brain_observatory/ecephys/file_io/__pycache__/continuous_file.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/continuous_file.cpython-37.pyc deleted file mode 100644 index abb9ba01aff2fa694a9a4ec9a8818f0b55783ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4145 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 SD)%xi?_(Y+%;pM0U*W$8vVj5s diff --git a/brain_observatory/ecephys/file_io/__pycache__/ecephys_sync_dataset.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/ecephys_sync_dataset.cpython-37.pyc deleted file mode 100644 index 287284e74a1039bb75d4c75300f314bb04a5944c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3993 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 R=$cKyY}0I7&;miO{a>{8S=Rsn diff --git a/brain_observatory/ecephys/file_io/__pycache__/stim_file.cpython-37.pyc b/brain_observatory/ecephys/file_io/__pycache__/stim_file.cpython-37.pyc deleted file mode 100644 index 322c4e5f327492298151874bd43d57244b11d575..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2699 zcma)8&5s*36t`z4$u#@X584%r+R8{RYWUcdKmrL6DpW0?mIYA|5Jeg}V<(wr;u&lw zZKCu5?U{c7Ar*1rU-Fd`SB{)`&yz&E%VxD6*?u#Aw%_}`ulZzat4W}#KYrr>)Cu_u zUzRNb;x=@10|r3^%}Ja3IcSHU5)p{-IT4|Zo`vn2pbtqa`WraOL5kzDg+SbfZsssZ ze?mKup`apoPM*<r1av4OPuGC1iMprjKsQ9}=?2i}MAOqT&>LdY)8~NR65F0`iu2;a zbJE@r7sVx*H|3UiNnG}8+u{mHx8q*E!$%KoHu_S@ud;NQOMJPP<uaup95$Q-=y#wS zgl0}2f#$me_6M^s9%RO{qQ^v*+N@AqXVS2=P?l#ZQ+<}HUZF=E*BI{>V+&tIHp#@8 z=gh!m<2-A!MRSeCmlk!A;FjZTWZwIeXs`wOcYf#n&bLNt)8PXy_PYErSJTeNio=b9 zztfRwVmd`Bl}TYN%E8oh9%S8)$*g><<mr(2CG5>};1I+8t_CTSq6;TZxGnT_U#1c_ z?e_qJBrEn&o&;a^%Be=f#Rvo9L82L32j1R7jWdGy#y!nPQgbU2$!hP|uu@AS0Z7Dd z1yMWfm8L~Cx*|+9m^?Jq(12HWv4_W*q?9@_5|KF%pO-?vzE<e}Z9Aj*?|zewB)er= ztSiCT5-gnAY-Qecnz$`cFzM!84N=Tfb<*cRgPlWKytY=0BZr=>!6qDpUJRXHMn9&r zKD+zGYMxqV2a=5>2X9sVan3cH$h=51J4M^zq8=;n*^dWO=IoY`eJ#P~_Za{H>NCmH z0bAM2gSxkRZ3P-V$n7jnPy8u~E-EvxvFI`Gr9{_OfYfIDYXLcW({k?-WYDn>#rF${ z@82<d1+&kN;9^0{oGpbt84!qbkH9g-+ktoj(Y%w$3g=`2W5TuO)06eqm~L*al#I@- z<Wj;jDtYtkg-J~*rC=uOD^PP%<QCG!%5*N8zzRr;?z2YVEm(T<kigg0S_RKKn|KE< zoMh_sd$-}vw^#QDv#aax%~a~s7jUE5k-m>ReQKw3l0ad@kT`%FeUb^QB!jf84<B>g zH^(zhoFo|YN%9_^<d3JbSJ%q0<US(E25j{{I00gMeOYBhunQFxdbCUCP<5UL-x2j7 zB9_{q7Yv*F5rq;($#mOC^pfKSa=@ynRxK5^IsKK0`fuSg`ZN83sNj22jW&D{%>(c6 zjRRMMN-;9+7$TYXp@6wqs<aSLax_-L*`=}K-CQzTu!SeH*(<E4ixDJ;%pA(zzMQsd z9z+-4m(#mi7uq#HS3*9i=s=aORs}$XvI~cD>gtgA$GJU*viG|W5a0_i5E{_y^b(BQ z@LUZ}iH(y(ZUsIX7Cpgx0p?gsUeGxtfT!V{%)=g?2ftu40FMY<P>S}3mRuxdrC;R2 zG&e3PxgBV%GhW|gqPs>9QY+Ngd%$4uLJ~CTDfM%~e$YDaz_%2Xvm|lNBpDTA423yy zn@RE`{6Q>M;!;Do*S0FrKEwKoq0y;)7SR})8pA{*dLB!+k>=c(k+g$C=&Se{e=-gY zSWY#%GnQF%8HPCAZ1^XJvA$W0qj<w}wCe48$>Ar&=w0Az*VK3fzYJG^cJ-qBNT$~F X9Xj1#<|}smVWrqd=wcq9n8x9M&bXP> diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index eb9b7b517221bd08b08c31b8372f39090bdede71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmYL@zX}2|48|)6ir|AdcsIC-h<{db5w}7~uk|eU(sH>|ZWJHI$yajq5!{^24dMsi zk0j&^Sq+B+!NU6$ik=X!w)v^U#ez*;h7mh4>TDmPY{!3mZtJPslPyWY5lo`t0@%nU zLKe`#L|QzP4ACNG%n*+a$&J&JTxG`*vJ>Q%v)=QDIi<P;hbm~kc!nyJO=>gShEjis fifT<zMDH+9m2&7RrIOe@`?DgL+S_^i+?y@FzyLvr diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 9276f90c3614bb7520e794015a303b7094d8d412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2705 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 diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index ca429e3d4fae771337dc00b793a493def1a4c185..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3591 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 diff --git a/brain_observatory/ecephys/lfp_subsampling/__pycache__/subsampling.cpython-37.pyc b/brain_observatory/ecephys/lfp_subsampling/__pycache__/subsampling.cpython-37.pyc deleted file mode 100644 index 81df8c03f442fc5fc000fdae03ce40998af712d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5218 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 F{SUKC<(L2f diff --git a/brain_observatory/ecephys/nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/nwb/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8644577555c128b46b353c4de809e752a3dafb2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmZ9Jy^a$x5XbFJ_9J1FTmub4)G3k_bO<4i<3t1KM4(x%WX-OJ#Kf^z_Fi&(9l95} zh>BNoOT{Zt;oZw!!ASn=Hy^gg<F}*Hka$x+f50Ii<ag`bTi?SQzwDJ4PB@ihOEXGa z4rGu8NU?WAzxT5cL*9EzZleRqVhnB*9AJDy55CrWL*D1%A;=ze9Ce&_9CtkGIO%xY z@u1@g50+#){NryYQ|kH`P_I8-KUe%}2BNStEU{WQcCKKHwt^Dp4Q!=L&+p<FMi+Q} z@_)H|e9WIqENi1VzBl@^a+70tSz#%*sNA#rx(2@(C^tf_K8w{ytbs!fZg@<eE#FN~ zTwM9)q$rFZBFVz4QTxIrjC~Ul8FNtu234IUozI1Fu|ccl4&C^neb%0lO{50S9)i~O zY;Cf^3TswMu-5ea4W|7Y6Sfky5_|bY%(&%N{_f9S=3gxuo5LFTynsEZCO=hBYQ^D2 zj%sIfU7@n2SKZDr{~(IoiW+BrmK#{1-z%lB;G0EZKq#gQf8q{mZJGt%4SC_;xnN8v jQ8PBL8kfA<YJMs4HT7-SCtlJZ=?!U0$3YrIG&<@(8*RW) diff --git a/brain_observatory/ecephys/nwb/__pycache__/ecephys_nwb_extension_builder.cpython-37.pyc b/brain_observatory/ecephys/nwb/__pycache__/ecephys_nwb_extension_builder.cpython-37.pyc deleted file mode 100644 index 0bde23ee1dd141b9170cdbc387c2fb0eafa6a157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3525 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 TifKNV?Q;#wr<l$BM{$1wG;wRQ diff --git a/brain_observatory/ecephys/optotagging_table/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/optotagging_table/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index de2f296d62e001825da3f87ed349a94b491c0323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmYL@zX}2|490ulAi_O}gWljKBK}#$McfJ{y@s>gnU-r+ZglWToO~r$AHmJZbPzxI zehDF8$SThVf<^Z$r20zuDdT3r4n2kuJ2A|*57DOaAD`QLD)#}~AmIRJtl<LG$t6MQ z$iPG*or829DU?j-4_%NOt7WheM;^)=D&%a_@P?@i-GU|MG+#VJbZu8)i78Y#A6<m1 evQ()Ey1_yzOExMs_T95TJ34b}aGu_Kv&9$e>_OT9 diff --git a/brain_observatory/ecephys/optotagging_table/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/optotagging_table/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 364f6f0e1628ea50e2b0629daf92fcbecb456288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1934 zcmaJ?&2Jk;6rcU@dcAfW$4x^G5(KG2_<(~1NC-uR(hmt#m5PWWja;q9J5y(y_3n0N zoW|7}2~v(da0aAQoVfGX?3Gjh0S-O!n{m=cMPjY_cyHdkd0)ThFW1&0f-nE$NA^#X zkiQLa_PN-6fuZhV;)FXHp$=9zb7vm)W<K>D!}qerET94QK5t~rSxCcKi?%=qy!nLC zh=;s|wJkb4I&kH;qJ2zo>g<tW`#E%z+e5d$a8*wCl6^5_cbHT{-pS^w-g+ccE#gAP zrA%`j7js?CwHi8g|3)Ip{e{|F<jHlWnG*WB169zp{#6bkXkjy<g;aI#8++{)Coz)d z>tF;J*D%yAa5Xt`DwsAP&zz;B-4hR#Ybm#KPyA<O>2Z(yPe|qP#(-QW$IjBnJ{XW? zLpLh_*umU5b`D(itqy)NlxKN3Iq>BVy2+d8d6&qqgonRF2D0QNth~yv8oc$J2MdBK zc+lbzZ}ZMmcNt8{vWXF5_(ylE;3Rqm3+{bAc9*SX1WVTjq>6ZVKwwR~YM!(~Mc}ph z`hdIvpBz$!;I?_s_yo$g6mA&m;a}gAs#yhmV;6E*`&fOfU98|jQ(*L6GV8kGJ?P-o z3j@M8`NgL$l6ql9rzW{uw`s2^brF|oa*&C*WO|==6fzd?e`2YZi7>V1W9*qkY+{;{ zirniU1qk%9^Nah?-y?q#B;He6BFXOP!`eq}%wz~@JH7b%+GpeMP&#VN_8A{d*dvxN z##eKe6gg)fjYWQ_#ziS|m0&JR`HXL+ld*!H4@#CCu&Kb^EQ16;*qKO{=5aBB#zUqH zx!4h_n%gl>X*Qjv`83vSl8K!-o*ChIR4!gbyIHDqQq0OL8^#^uTR<LPp3KvX$2K7L z(r7m;5|*he*qmLU>-O9joa(g56>VEaCJsfW9!Gj#NU_Z@9>2XUj<jUk=Zx7lvEA0` zOsIE<UL7gTq>c?;w_d8O8&;X@nz*eXL*2=O`s^rGb@WnB$#qE7A)iZTOsV}GfTAs> zi_+?(YYM98z-eqxwpQpo=b_E<O(d<6=3E>N*J`)qv@HeWr!^r>((C4ZmY4w34eL^( z<4kb-hN?YeqwZc+$bzxrhLnY@qq{7d3%jQ+1OJ-_?6j>4_<Ly16b+G82tQJFz)B>Y z(*UKIsKa5W_L-b2+Ona&pJv7@Q<Zkxeibz(O#*4Kiay;q7wT2sDMEZ24OKTx6jbe| zY3<=%8@^Z7DNV1bd#@LP;i^wD5vS{P-O%Yfp}Xny9M^f%^D(<l<aS-(F~2_eTafER z4nKF(?K|=v+)a!E^PS<yHnjJ^&_tt+aR=>#Xf(42XhT3%qcUyIwU7nqh8|il!e{$$ ztQV!A{nKoo;{kR)N3iRlv@LoVNb{aF9aQ4qgIHVSTW05Bg1k2?cpa=%y&enSK;~n} zDFa~w|3dgGFJoVaXMh^6QM?BDDtQqHbaV#K(SP7MGD%%|FxP1Y{0Ox&&=^BM|DT(u zz#f?bh|^+pO2@V;jLZ0Yv877Gc=d#O-Rm>6O%cTLIbUsmvdIs35si5!t{BuQgTK)2 Oc^$9kh3|)9===-#gBvOU diff --git a/brain_observatory/ecephys/optotagging_table/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/optotagging_table/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index eb7708ef0c564e63ebfc1da0195cb6a25e77fa53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmZuyOK%%D5Z={3w0gyB$9B>pEqF+QZi`rXz?IcFi0EJq>?u8Jrpq7-h@V-J) zHmshCq(}dQ+<NLIKZv)Yr`~$*r5$qhu$@TYXlD4D`Q{tyS+Cc&;8XnmEBVi}tiQCe z{4_y1gdyI6pcb_=E4Q(oH*mw&b|Z6g7rRDxGB5YBpEq$c4{(sTa4T=)cHY4qn0Kj1 zecF8M(15mR+i0DY=F%?h8Q-n9F7Cdt=mrhnSTtnrYX|qh-lSV#Z!sI}TVUU&+hA{- z`3<ml=q}j1Yy;*)dgs`R?*0uiTTw%`p7P0YGG#eY8!PoE!Uf}zt$IgnOlFy^S46(@ z2TVvtRq(Q?X7VWI%0HGoEhftQE-Q&t?opaZ<-9E9MBiXp{~X}Xm<SnHvrI5C-+jEd zk8*)(6A_6XJw)HnBS!^v#)(YJLb(OWnQA3vK~wFR{IdP-#h-I|fIYKqzC)0JOEZSV zs~O>}K5en=%>nLlk_txSq=aQ`es4;$@q>!-w4|sUBZBG)bWYA#<SP52vL7k?v9g~e zb=0+V;O7vA_yPp8uuU!8U=Fou<I=`1^A?)F(wfu(bY0bYzKs0@U<^2WHA^|8gD6lz z9P9MrSheFgFX=4PdN+<CldPWM0o=zsT4<8-t`<EIe^~sE*0uQex949Ee}+1VA(;}o zHzMbxxEMYyh{laP8M5L`49kiYA^}-e(+e^DAsr1xD%pdIB&TG;U~iVe3VPZf0cJ&9 zj^M;IB1?YJX9?4r`eh|cNhT9OJeFjXv3@KJWyD@}!M7lmPhkijL}0h!Ykb#`gx;x< zd<M#OB&l=R04z1CuF*ZCdq($JlQ}G4t=BedQ~%Pz9ohth1GQlo2uuYmC4g`;?^i@l zku1?T1!4dQ5)y)#(Utg7T8vAc8=6H8ejB1u?v!QKe1Exny8qq*;-W}+S)_Bb@9G)z zujG_nyFkb^pJnwz0~R_@vkZ+GI_IgBtUy!78IYn$>)skfUA_%*@Et97wa`V!p$<E) z(&Q8fqJzU-9Y;LfH<sEhXA*iaHp|RS#?M>&1dX?;f(lQI^1OgfSoD&>?X|vUQ?1?A z+dcwuABNB@4D7D?8t;co`Y|k9mz24>DWG@`_NWV`@>KUn6KVa3%s)4UL)EHsNJCgR z0yLyRd{zKva(V*KQ-?B<@U+sefT`9X@^7MLa@9fOFx9UTz_2962lLZp{St;~fCy}^ z?Q5C2;5dXKG#u;97I^_#7kPzsUROEz*^)(9IrknV7R=)sxk2RJOvv>7J(&Ao_y{KY zFqYwKdk}5n7U7e+ExAsN>&FXkuAF;|mgPD-9IpN2lx0-ZjL|JzKRM<FGE~xkfcz6J ubf+607|1x%=IS|G6G#Q$)Ybgfh803nDFhB7uVFWA-?=HfUg(F-(ET5=e(WOv diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index fb833a3b508426a0cfe46bf85cd76a633d48eac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmY*WyG|o96rIUyG9eS7Sn&-hAO+oOh1dl_Lnt;vLe@yu&DcpS{219z(3BK>$yWPI zv{d{871s_3@W^M5&wU-se~My|;L`sdV4Nn&b2xmg7Lrrk?iPV1ER~5$Nty=Uk}cIH z?a14*qq?LUc}MnCMzYAevafQIN8XbIwL^9y&*V@Qq(I)ECFA@B=O*LyX*BcTMRjQr z_0pkIT!UX*kh6+w9)!JfD;6R8B`Ld*;8ro5pBq0lUKstQcxpBxMt}U}6|cS6@C(5u zn?hY<r|a>E?7BFaF5gGnaC0)!+v(KB@wOerefI9)Gr1G=Y_WA=yWuoo##0rY*xt8Z zD!Q>*5D)B!A-V{TsM=bxeT@E3Y>vMOua9Rx%Nxh7D`5rfXb$(FoAS4Y%4i11CD$8Q znwo1@A)0#CxbjNOOD8-(tf9JtCC6GRF@xPr<`#seW{w><;Eio2!3Y*joEK^>*N%b) g**M`QlnO08rAKx1)c>UnTT6ZtUd#;<hUw?`2I;@9YXATM diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 8b6bc4059f85fdbd35efe2afcbb23e70421966ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5042 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 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index d2b97f215e195654f8a7798d29bdc704d962c5d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4129 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 AEC2ui diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/dot_motion.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/dot_motion.cpython-37.pyc deleted file mode 100644 index 8d36803ac334adbcc8bfa3d0f0cbd04da0c02791..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8561 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 GGye_E;5wlI diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/drifting_gratings.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/drifting_gratings.cpython-37.pyc deleted file mode 100644 index 592154387c97e38acc3282a459ea63d3a8051578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20723 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 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/flashes.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/flashes.cpython-37.pyc deleted file mode 100644 index 21b5d1e20cf601c6de255198270b7a73aa3aa88b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8551 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 Sxt{-3U{98iiEf%T^M3$-S(};w diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_movies.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_movies.cpython-37.pyc deleted file mode 100644 index 2920478ddabdea76fbf128b6c81b143404513202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4284 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 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_scenes.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/natural_scenes.cpython-37.pyc deleted file mode 100644 index 12072e3961becdda0e245c37e32e0170a0ebafea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7499 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%0D05rv$+3GIiZ1eSNs+}F zP+C%$ezd1x)WgJxFcZiuAV<ce#cp2%2#5m>;q(JV`f$MkUiD3@>aUFr-h&892-*{@ zEYh3$27T#CWYF|i(ae{4%1PHUufic5DAV!^>3S2x^etYHWt0hYhE?@H;{9)NbNp?& ztM=h*=aBgeYeB8i*=Ta2v90e=wL+O0ino!OX#|Dlp>{I}K1Kqpd{YYonYM#~^9Xsp zObH&aGU4!%ZM=S&W*1bvLIrJEZ&E=abUw?u5$J~9RO+{=n^=Z7lh2izleU6&3{Lk8 zm=y9C97YZbu_7li>dT%pztZ%Y^=7SEL0LyR+kC0%)oYw`D!7V;7vIpgWEzOe%svXZ zGZYY6W_gIT+McD?GMhpp__i+jwx}VdM=p|P?w+IHB*BA!TOo^j<e?Y*H+0tE(LHai zSQo9M%7nLDA#eAnDk}(4?BnVXV!mRnQ4m=T9|6)22Vs&$9pqF60^Tu$DiI>>ir6bE za_4-4=8D(}4f2jirT%abA;XJOr`=Fc<}%*6BHp-m?VB6omS9ezVEP)TFzN3GQ>1B; z)Z}@KM42=!90sQ@l2r6CP9q@<zUS;G$;^iMXqWQRQIQc%)Bp+8BF}p|M+&$_Qoqzf zQO3)0R(Utvr|nEcQH1QexGLV*+!B|sZ(QSq@RsPNpaK%fuuiQqpZ^2O$|;~K;9nhI zJpHL48gT>p<1*pHVN>yez;%mUtuDw$!%4(PNkU$XfN3H>Wr~W_1N~Vs(hS9Zd9|^i zV=d@K?xXp)#;J>J7gO)1u`CY2(0>t<cC<5y&^cNc*>@zQqaFMi0#aU<suRL%rg7J= zT>~-rpNryv`yukCWvci?g$#BwMTmk5oUkvH+6}>*A7eX1^z!tG#=KP?_k<*)i<_^p z>7rgrp|DR$dYuD-<s*dJ#|Qz2_MSH#!8oN&A>CQ}O}UMLC7+!*r$V6FOpu%Z2i&8G z<*Q#%Q|Cr2gsWA9>52|jv7(!VN$&O{D#C{_UP#Zw&3T^(>JLyAderM+jE^#WnA`XL zYH?h?tF!wI3o3>OGrD*1+3#?h6%^LevQzaqrgl6yEi1^6Y8ru0zE9PHUjcg{y-H@) zulDf|M`&`VFY_AtT;RIAj@&T$bjDvA+2ry6M%u+^dDBGne@gM6Mn3o50sUj~QSnti z16Tb$cHi_J4A$SEf^-?<IMtJ<1kUR>*?m-RlfPuh11z%wPSc%t8}8!ItfjvIMH`1D diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/receptive_field_mapping.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/receptive_field_mapping.cpython-37.pyc deleted file mode 100644 index b119500c55906ad4515282591244b8970555c35b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18406 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 diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/static_gratings.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/static_gratings.cpython-37.pyc deleted file mode 100644 index 0870fdc1b0ec1fd49aac41f2ccef364017e54c32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16793 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 XEWpkx={bG&%gUFP&CDlrrHt{vOnGj| diff --git a/brain_observatory/ecephys/stimulus_analysis/__pycache__/stimulus_analysis.cpython-37.pyc b/brain_observatory/ecephys/stimulus_analysis/__pycache__/stimulus_analysis.cpython-37.pyc deleted file mode 100644 index 32d87579a4baa582d2bd2c6c213d8258ddfd666c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25683 zcmeHvdyE~|dEY$lYwzA&E_YYtQlz9YEsI>4T*{Q9*t9}Pq#l+mtp$;m>}xr<v-iv{ z@9y1uug=Vp+}pcOY^t!*L}?yP(%5yoo1|@=wm@67M$%W1x<%TgMT<Ca(y7~`X#qq3 zv@RN;KoB7P{k}6Z_qnuO^p6(kF7BB#GiT28dw<_KS7v6)7XDhl_<7%Y$Flx2Z_>X! zGEd<b{vi@&DZ6QH+g00U-f22jSFX8gUap1hVzrdKo7yf{r;~i8TETm_IkP=mot0;~ z=G69)>JjAgs?eO<K3Y90&x_6Z?S<+>|GS{Fxu{CPJ!<M5$F`ogR9Q{GWvS`l*d4ce zTs@>_)a+Y!bx9pjb8lJI6Y8j%$Ms&dpcZjGsm`b+bpj<$sk7={brQMz)G2iz-rcY6 zR}bL&fb!J)aP`z_^?qF6ryf)v!1c6pu35{=?_%WEvK?2#NH<y=wP?2!gsXTkRo~G! zgW7r{!p)Hle<utZehc@_DA4aZ=BwFf>p|znZg?%g+ja{j7n3Kex7Lz}Pj?z|p|R0w z>tNZ53w}L9$+%SaqhO=0ckApx`sX6^6n^1P*p?MoRa;qAN4=~Z<zi@VkW)F8f6KaK zSM$ghR8jH;<V$Kw@<rrj5>cjvd_~R3^C{$K)e*^;k)KmXB|oj^)dHrYf@h2B9(gu{ z{4sT0^0UZuirMB7<T=UA&mk`pjr>vMWwMc<M_wiz`32-<(ve?8UM3#-dys!fosoKu zA%9jaOa3_W533JKehK+=>b&GnAitt6Nd8{+i24xvds1CgkK%etJ*K`7*Zb7t>icoM zU#+T-s7siw2h>N^6L{jOA5fQZeV=+#J%#IO^|ZQz>-*JJ^$e~Ls%O=6xPCxAuRezB zL+S<fBCcnGv+CpOC24h8*#MSL#B<l8#`aEgCw#i)H+REExLW6u@sGHa!|&txg+K!< zvU+x8-*NPO&+b_@r}e5laq;9*&)v@{TR8{LUM{jX^C*#1?mLc@dsxa9Q0~>p?%68$ zj`@B*Dyn=`>e+YfFI!)6?$}?jRRLd2No_?{IN<kXxho}i(^8@$>5Qbak{*$CPST^2 z&P%!=>7vvzmDF*MJUb@oaY>gXJt3t4Y|`$%atCmeyOTZk<y6B$dY>v_@@Bi$vX}f_ z>iF8<_5y=Ewa{SCCC_hp27MCL@!D&fK|S)?+Uxky4KHf*8?SY1%>y0=D_Mo{G@jLN z2AWu?xfDRP9KX>O-q^A0cN*P~JkxHSiM*{=`<8bDKh(GFZv~$3g~__23ua-{rq^|Q z8}C=+g2DW_Abk(3AQ%P|YFoi>^++d-Zq#%TwwpV|?~OnH>VN;8m)Bl-vU*S0X}2Q3 z6|{H48u}B2H`-0LfnMS7(@!nmAD0_pqZOh^J<tU_jOS`2GowjvVs|5msx$0RjiZ&( z75QT7I*8V@TDNtaBmIh}YCEk)RBNa(u9$4n`69l;%!l!`d0cPrv?APaEVamAYX<R& zTD{#;4G!W~BMk7$j~aMi593p{4!R#;G?U&gO?caBYz1MwFj6JwDqfUEiA(*rVO*?* z=9}XKeZsSB3gemncbNEiwx)MlEmH2V69lSSs%;0L<ml~8ZLQg^Z*c%R;zXpk?M{d( z9$B#X*kCLDg^G{VP@UhbsU0oDM#nJ=>w(sR>i2v(ALqiLxgH-GS-N<3<nzMTEnjbh z0+(O4^a>X6kAD2>r8hnq0(#%@Z}@6u&A;WhcHaPv;ZpdIz7e!;hHtbxK`X2yZIk1? z@ls>$jj#~~=R1CV%ijp_ZL^6IYU{$9_8YBQdkr<-^ds<?3rVLgWH6h8`S_ES&Td?) z)fxn#+5&nPUP5B!%XY~w+ZB7>E<3Z%yi>4e@n0DH$1^@H<nWJl)}3_=Zui8s5t_M@ z)?Npdls{hiyNX{(6zEx-7HEbIMy%&?kITcj$ZVP90&hQv<OTdf;)msQy|Jc7RwHYX zB!Ue|i+_L&TU7Q|Nq-ADd(+voBNw?`l#dEgakCUnZI;(_pvfQZ*_+dRbHduQTW=+$ zDtPk`6=>dOZhz*$+A3(3mQ&6NOUiyqxqHs-7p2VXf%S~_*(cs`_FQlPx5swS%DRJk z_CY)Co_oUDKhnz`*e_dq&YMyCte4wz%#+u_UwWu}k30fB4}S|S>KYj;b7a1McQG z7eIg0+01t@y&6P2x)p+;HG$J!d)*_U@LqT(^wvRSZ{29rh06M!PIK3bZh$nVj4m!F zH064C`D%Nosk~M@0vT>8sl!x|Ot+U%^p)jBeGHQ;3sudtf>0mjgX2iz96J%`qn!@u zj??N?i-2~m{oUB<sA}O_pc|kbF0eSxsYX4DbHMm8&I9T}!g3^=aX#4YM7#0Sv$w%a zM6$}GOTq29aMN$@1mSXCAg5ZA#%pRl&TaeQR_xZ>&Dcem5txdlAW7%T=wf&piRBXZ zmjLw@8<3yN*^Bm^z3433B|IxRWoH76CzBOs5J&hXm<q%#Ap<zD!g+9bYZJVDV4dvl z((^$iv)|g;UJG=(PT|V3t54ul%t_GFSCE^G7;#ye7wW!^Qi4;KTLAiYPmbY8zwA(F zCn99`UeCagbT1_*Ud!JOR+jB*rMBHxJI$cR2Z!`6$9EBX#p$rz?mc5YVu_)?P_UAT zJBJJ>PFVo>MakJ)mVPLLFvYtsLlOCkE8veikdWMJ!fGw6JNrTl3*JzkfQHxg1n7k$ z1`z7K)5E0t^vbfM&!R!Sh-C6;G&{75pP6E35tOm}z}SF>D;^q}i;wvWpF#3Ahej%N z897j)w}HKp%cpm2q`9q}zWhaN9fO5JP~!9bJShp^*5qprxqG3H=foSZa$oPJPz2ca z&R_O~&z=Wq4#JhytViq#CtC==hYTgS&n|&Z*?XW$Y!S3AM{4xb&YQVwh9qNd1Q^}e zS$QP3w_^L|&~%Yl|55n~_NCt5?p*#6+{@}0tnLTLCd)_wD^CFL{bqQ1rT^V>L9<Un zPU2}PSCbKF0*B@d>W?59Y&^}g4{^cN{dwd=QHyhBFts`7UZ;EfkbY!SLue)2U{hfa zNeYMhCUVf!uxyu*b2eR&WNSayvk!>YMDXNolvfbmL7Gu&A8dthq7q2{b>=qgR*qNs zN^0Mn(l_x9Av+WKktbZctKC~8WEezSw;K=(gG`(iJoG>{1=69>YDjO{TaUuxiuX!0 z@I!pl3F?jYU2g|ubz=y<Dd9o@hu}ywS?PXgq~S1O@SgG`-@Da-q<%Vm#&1u1%Vm8p zW=x-ELatpsmK7M3DZ_Xk8g@$!$$0t+d=Sq=`t3g!S=F!-u8aOC5@0KZgz7Y_hOA9- zc9go8`Odt8F~kbVok-tF;VVo*B=2`i_FR4fq3nNKXQTWht`KJgD6Swwt?n&ZynWkX zCV2i?aA@*#N4Wmto(o;cJ+OKXaOrf<y=J|6`gKbIoA_JKcRSa~`KX?3fQ2CgMqF=W z@t_N3^TtJ4!@?=A-I5ZV{gra26D3Mkztflcue8Vk{Rcxp&M{rXFC^L9ApTb<W9(Z8 z)=v)Ne4KB#Zv`6D{u~PG=b2EP?F(qYd9rxH`Cq}C6z9MHS^_Z;aYc<@8DI4Q{LkvB z&Saw}i&$OGLDi|%n|>J9YViW~x>g@XFhOBl0C#(HC(xfj^UFCSMXn-WoiU|ZsMf4k zrvzLGts`U5FQN1=vGYPO3X70{D}a;k``^PLvUwfi{w35#IN6{D%3TG(_Vt_U;=oOf z#-f{z$n+_tWW#eDA4`VauY;oq{|>t>VCr<wjCFPLH<P=|al<458gz$N5WD-3cfB3? zO|O*-CqpRgUGRk6g#Zj8%be~*`o0jcq9MgG{94v=xBK8&$0vL+xz}^3rjLwdkuup? zVNT5<kgg!F8%RgDxpD#$37p4veH21oL6LuiUkctA$9kRUq(Y9vNsvt&<IB%pfAxi{ z*J@Wk@zN(>UcGk6l+6s)^$*f!q5a%{_hz$^55eO9p=o+|bei;Q>AdyHf#yX0M%rWW z{znh(u@XD%<eAd1ql!ajXEvQ3Q^BvNjbVDmrLy6&L-WJo2u&xhMiwk>sXiJnthS>U zwxP0YgO>(M>@JggBOU$vKo`dK(~&jL`atM((>`28hHPIX!*fK$eToF`flay$-U2NU z_mB>G&GbFDd$lhIhAEF0I%k-4y9Fih%mBSPlW`Yla7}QVK&`CCrPTBRUFv=4iZF0Z z^+;c5at2Aldo^)=1U+J5^@isT+E{)QMMF+6Z40xIoF|Ye_ImuwY?io6*-9BQb!Tv` z^k-0D^4i3+t(|7GZ@~EmN~Yv;98!kMX6+AI5lFYPRr*_8CHx#n>|R7`uX6yu3ZCRQ zA^7c=6s-#)*c~tj>w;JnDzNrae6%-b_*CUjSevlnzC-ET*`HOg05>2Y?m5wsp2N3y z>^(O+f*R*~&gM~5{s4q}FV}-rVaw5fQ7o}mYZ2eitNekzxd5+BNo>l}Uy#Kq{~-X| zbFcseu%SW(q*1_!W}iaM`OGE=IRv&!y(3zM=X<YQyZ$jxU~0u{K$xVcVpI#!K4EG= zO<v&Bt^i%*d;>TGt5h?SMF3osH~p-wbDob*z@i1g1{n`#t%RXagOU2d`=vNLV@#C; za?i7DOS*Ndfls9yGMJ=V)4edM-1O=eWKP(F{m@esakm>Sw7$0MiD=OmeZ4coirkrO z6vlGWPyu=iu`J+t8rzMguM=exRkQ0UDsd<>Dd`M*XB#ab9S0OHuXxu{7CQb0MCr7o zOy63gm9^Oz?JXM^>+y)4^UQEVeQ_}%6<O`)&0lt(O|@8sS*v$jj5RCIK<<2+W}B=m z&HPWdyhoogkb#i{3Q$1=yQG;1Ss$95`T%z!YvG(BPaMvAy9pta08($awQ97W-GoE! zu&whM@bnQHYVL$`oJ5%En=s|Vxfiwj(jve*h$eg?){%j_R=cles*rbjWOh$`m&dFK z=LUe0CNlsB^t4W(0Vs7HU_fd`q>N=Zp2GUp0tIVsd?JO6A?b*QDbcm#d$RZ0yx}F} zh^6espjd`?dQGSyyt<8T80PNBoqmW3Z5VM0W@*~dVOV3%=-BrSR$<%$G|yv};Wr5N zWBjlH#jv#z7}Ea(tnV_DD@dv{kj&xwM0qS8gmI{!z+EF2QpKnik~hT--QMY}?ZP@2 z_^rff7Z<70U|C{E`PHdZv~N_)tPxrwCu2k!p3i0@gVWzbLm@|N&C`HghKe^wV|ISg zo^>nsF_`g6WIy8q{dip&=_lKv_;?k+kVYbqYr~*VBbPAf%^X~N)~0dHrNq|pLwtNy zRvu)+@M9pkP)z_bKocui4+rQVNwHWp4OQyn3})cmWY`DMYUlx~_`RWbzZaLhjuH%i zj_UsqempJu{yLuz_AWt~A^y=v%ajZdrHuhcU<soTz~bts`7qc%H`Jgh5=Lsc?m-we zkcsYqwrq>Prtc(NT`uaASSe$GxPN$Y)4J2yp9Ic_ND@mUHDxQ9!#W!Yr(A|-1eU?& zYal>_{^OOyzMTwc4-W#`g9J2@A>0(ulp{Xm6x3Y*IzcVv*tGi_a6_x4#lm>WUO{O= z6oZ>StwXX9B$T1ofqTxd+@#;5#7I_RlthxQv&s$7STHr#_dP)3;BpR-9Mhq@fa41^ z`x^x558+(GW!Z;8&=XckiwdP*uoVE~dl_K{j;j!O{}f?~WDan3AM-S9#i#Dp|Mw16 zx`oOX2|!|Ym?i+hMCEqRkAcwL8qC0m3PonU)VRs$Rnvfx5mJ%QZ$MPVwXg|?6s}VU zOmO$h2NXmReF9+=#$cF(DpF<!qH1vyf++;m(g{o9XVemTf242A6ftuh1M2G}8R_F{ z$eKaUBxC8*w7%d8-~|;-oV_RwXRjDF4KX}y^|A#!Cqgag<@ZV$$7eUg@4Eow%R9}e zArR?ZN?Y!aY7~pIUQ(F3iV%Wrh)I_cOibxx3ZEIp5aK`N{r39eT;J^hpHU6#-3QnB z0pikKq@e2vp2&k51WoweAgUM}h>uE^=kzJoMM&2H6A=OOA_$5cF$uz}6$n~n<-#kf z(+na&bb`3)a+~c&OFxdPss(8hj{Bi8C7LBffb~&cfATJCbB3rx*RfS0!=DB6%!2iM z&@{W}-UA9{i#&uu8OQ%HDhB);j(-t3QNn591#Un!-=rm9$nt)Het;3h{I@3{L7xDR zt#tUkkk0{j?e#6Zgsc=EGh`VArNdw_>CAu<B&L}GNYertMg0Kg#4JBWJ3|c@#@h<D z2#Jg;NY=JG+wTZ%y(8<aZ=vWFuBVW~3akYnhKrM|gA-cI)(;hk%iqN{q$TQYJ6XRM zzi6i}wI8t%j^*Hutewh<vkf#4&bH(kEr|_V72kmeN0kojw{1AyP?ONNG8(y>vRiQ5 z4CwnBO{UyVAZ65CvmqGZ78wSZ-k)y+I@xlK>S;sBGfbg|p+VIByR=9}5gc_nWt&D2 z80$W$M7s_XbzjcPx^{?L@nf8O;0_HW3|~MVJ~KreK_J5kYb!tW1jel`>nQ|5n5PVR z5NAs6fODSfKKHSp32n+--)R}61jP?Hiz1P3Zf>l2Nf+r-;X6MOOok^ohHD6cLgG)1 zr^2Y+k!-b;4iHL-Shq;43;~RoYam&65dbz28in<$miVBi+qd+SEHN0sBCf~^{aI<< zKA~G|VTdu9w~sm9$F3!am$^uW7PfC09jr#PM;XAA<&$77;5X#Uc^eab#~$$I2*Lpw z>Bouf20GhC&Y&SXD~8)G_K|hMa64|{KBRYj{|~As-h-on5g1jpsNc`ZzmJcnp21_$ zF-AB@40b`KvF6`ygoD$F3Z<8niM8~SqkoOPoJGch%v~u}Y{$OeF3nFcjt})Xn>2hr z(WFT4fzy4lPq#Y|M_|;+x}6!PQi5q@OE^{&GqaIah;WpbR~XuK7xQE>`RZ?{vyMQC zr7@UD3T3??lJe*_jRea!oygjkaHa!b809xSN6;z4wyi(oJYhwU^<YSb1V;s89}?dI z$D2bR<GfhX(OIF|A3~jQ=924+&(-+cf0(zl%ExZYZ^?q{JwCg_<a0<;N<S^(IyECN zjHvDl=3Q!)7wPb896kfJEO&{ld)y&3;iGIi4qMFBmVdVem>G0QHhw)@273Z14HX^o z4U=PC#V_n2ktw#eih6zb7)1u7yU|I7C2?N2TIX_Bgh;S;XREAVvaLPWwz_4O<Xhz; ze$4%x`zh<wR?GPmyvLgmEkF!m_1`bTn+%fLv!6(=CpgA@_r^1+J=4g~b-*7z%MiFh zpAf|eDLUggeJ%_!Idd&jB{!ld<Z_8)Ct;;UoSea!U&9ssX$&yIam~T5f}mz9{c=e! z<C$hKl75rP4<d=nB9Vv(MV2Cw0~_l0wtqYI))M6O4vV`8x*U-W;-wl1pc%_hMCRAI zVnPVqvg^RgvuH25OOsUa!)mCLc=C_%SH#c7Pr`J*XhC9d#JgDPxs(X@ASry&!7~@` z|57g}&+-wZ3Ak$VNZlSx?_1EU?jWFhOWgc@_L!orP->dw#Or>)utuytndRHU9=E{! zC}a-MZix4kj|_1wL~ROCSO=1FO-`F&UM#M2V>UzR+X!v{W(wW~yZg)-m8k({5J(Hd zMbv=bOJ=)o(V6Ja%utX+%b3uFp<!5%0|>^D1^Pn+y?KkBcMZr0&lOH<Mm8uhLQ0{l zS=fNUijb9zZT)_KXa+`e#{5VURxKeE_tp(yK{e+S<O&1TFi5F7CjnyvgRRadcKyL; zNhlIA#TX>fZ|M)~(9$X4`44=TnfwO(N|Is0F3Ertgc&^Yy)MVM`MqU*=gACy3A<ba zAw)FJ3aJq71u~aIpyC=Zs0@TChph-8DF}hhBS#06vsXZfYQ9(Kxpxq(vRvq1c^(0Z z2?O;c<WJ;OVR3!hLgJE<2=d2N@*)EitwH7nYfXZIEjU6i65BGFIY_`wzHx4cVpNXj zQ>NW-6ULWp>Ene7gdm>EqV5s@wS%bWNdFjXolPqfW5Spv`MA)9v`oLj|HwtEpaRRu z!H`^b7(LWIJHAXLOyi#qv4?C`I0UYWaT=y90VLiP+(7WqW)6<NJXSzBbNBJ92&CJA zGX#;m>j7jAT2OqA=zInYVXjm0!^phtRv==>7@219NoLUp{0~!TA;@Ox7t(g%!%f>6 zC(%<`vy%z+gi07XkVH?;BNT6fjZ_w5!k5|J8xm&JVgQ`fnqm(C74hSakySpAhbdAD zKK?m8813SmS@EFR@Yfnm=rrG9*GR#veD{5aEO5Vc)*af}vXy-VH+RK11cN2`CV}9x zzWG&y9>P=&dI-!W2%#CfW|n1o-EXyP>j)HT>%?th2#yT!Cs~fbK6$7E-~LYyRY*?; z)rSpv;HzxNoOFIIBxVhn-NzDeMvS_MoERqLoh0&Y%Q3`;0~ZpL+si@zISctG583Ap z$Ub?>J`_y(23y?<d->1hGuej>wAlU3vv2Mo4heB`BsziwfPCgb%wcHXMtr(>m$7vt zNCouN4J<B5_$3daSAZM=6d!}R4ifbyuDZ<xGi9wpqG{q9y9kts^TI=77p=;wNW|g* z;0>}Bu1hsXzhQN%6Zl(3;k3sh6^{xqa!hnnvLwUD6T;&-bM}KEK9FZlPln6E4>OWO zz@(NbtMvDg;TlO)$-W3GFj+B{MB)qVee6uz&og>pv!L8XYYTf3xL$b5z}1q<FIgKf zZLLG70ckSjiz>%wlfP8?<Cc^*#<8g$SD(xWGOk3exSQC^hG&K3*>prBGkeJ$7c-l) zLJW)VkO`H#k9$v>K!M>^X3PNB6wx^iZQ=yzae+_BL>{c_+ZefQ5;KNPBAMPr0tYN& zM^hs}NQ*#X1qk(ve1Akg$g(0jU`N9Gy6CFaX)rl%=cIF5f0-rDF`<=Re-cSG*MN=0 zK*k4fA1^Sl0g(dG8)VZd!PA%&q#3hiLBJ2;fLVuNF*PFyt4GspEub3|5>Ry^dt|=g z!%?g^!t#X1rwLk%=$hq}U4%nJT%NT(>~L6g!P~~YRsx$7>d7FDw16~0Anh4sxQ+;R zcJ^WDL7wq2R7epGL)DWm2E??Kde{j8SOOH>vEL}{<@WM>g}vflX>Y1m!kXv0AHM20 z>pO7YCrS(kjTsCZb;14+0ppArppD0HdLligjZl_)<4Zp;e@}uH4BNz^(+=CT^*TB| z$)X*fMkA&Rg1R+@Xo6kY3kG)*0}HUbw}@@SwcvIK)jrI6t}xj|5+BiF-Fyf4q;A}f z?I^Z)<NPin5mapZvW{j*QcQ+4DVQ!kPWd7mf4}hkTuY<)7`r#z+faTcNGOL?kS(H% z4yV764)j62he`=mSkZJKIm+@}Lohi)9DLAU4o>6{KLpe!+k<HR=u3oW+X!<`b`yr) zZ4cXeI&I*Ex2^-k?6&H#*unfrddokIOJGX0B<`RQEoqKg(mpibx9tOGP%pCM=?*$m z)6xNu^XKqMHOJ=fqAr~0?3tFjm&Zt}RG1AwypyK-zCEsQ@md9xWvZEA|DXgC+ciPY zp}t%|7vmF$w(`NWa|maA_`P>7<I-GA&gND8gxN>dgm^ilyI=!+s@)q#C~8$-xBBa- z<3iRSyL)PKf6Vk`Ysl6o^}v|d{wX#=8n2#eV5=jDBuxz@=3~+CGzn%K8&bVuv<oBx zCLro8I5eyn;EJ;26amtil^S7G49fwwHXAf#BMK`*1lF}1vdK+Lq&y&+dNtv>zq5f| zIE^~lNqA`JVc}oju!l`%%~2YxU&RbOn$25&f<<dW7`xdC`J?!B`C;zP6oY6jF4xli zRyFKztx*^<Z#1RO7$#`O86kXJXxkM$GxoY?nG+uMapqQ;yu{=>6S6G*DJE4WwCm~5 zGNH{zq#mOsw0KMX%s@F6HvL0PzQE)TlP@y)vrK-P$<H$RIVL~P<S#M#1t!13<Zm(| zSjE$_XfOocXe*hp0Y=t`z-bhvhcA2)3F3JkujDFTrC7<s>|3cEFU{gUk01Xl_?@rJ zRTe5ID~pxSRPv>%Qm!;ts+7y6BL1gJ)1`&d44&mQ>+LJi#2NnaDdi`@oj*i|A@O%$ zNTn@(%jFideMq{D@{Hg-;%^=C{oJFumEVJ01qVCSw*xx|nu;xJub3~Dv&6gq(n7FE z>nC~^<sYcvr~{5el*U~i`673MQVmBAhNQhBl<}g}<mjJLF5*0YL29TBwT&`}KmApf zU9x(Glh$6THK%ete7$5XTD>BlL?uXFxn5pe`!05RP3@I?<sSB;UK<*TDpKn5YnYJd zC9uN>rpP`O%G}%|O}iol>PD;H+)<FnfwzNReR1HQO&v(fsr}%*sNd&2)do*TovG(F zi4o=I5nne#ZgOd(MZ_A3h!4^37VPiXDD6=agAE7!=h3!lG8G9CmkEg=(ZZzz=83c- z+u{<}>Z{;55EoHlguqL%4DVt(DDwqJvyDCcXd@h|FuK*o##vC8p%P;aypryp3WZW6 zZaZA$c0dWI=U?pOq&Dl#wjYT;A2zyyx7sH&*VEYrZDh<u-@PDfA+@H~2V>w!tG#=j z>0Avs&Cb@hFMtuFJ0^~oYi&9r756vGUo!p8NFn=(SX$A<G9!$1)Wpkj#(ca6%df-8 zjL1mvoDfm8v>c@!Ije$oAErm|Lo1IgXR9Uqm<MN4@|~L5+L?5O2S=>>t$u&bLvD<` z&UsU6Er@Of$-<?rnW$%x;<#thz_l4Hijdr5d1MAhD}ObKDjfvJw1q=z7t{KHikfhd z?$blyFc9}*4mk+D?HvpQ(<N{s;K8X3$rHmHJ~s7<okwKecmD)`&tY%w6d)XXZEpH{ z6=EsLn65KXOddlLyQ}^x6xy9_oLAEV^Tpu#*a;(SkK)Wx(^#H128Ex(tLl*v0N_~` zsm&{PF>0KO0DP{NWbR-dt-`bFM>wMa*<v!G`fsomyE8!KDF^8vNAgi}%G1bL$6#u+ zD^AIM2;%H4jc(2oEu_fLx!j5^<ugG8-&s@mah%~BNDR4#vTN&8LaHSopX3tT?p*U0 z<PfR|j%@*{76J@aSmh2#x=DHw%gMU~`y`0x629u$OV&wowD|NpW+pi<MryAbG|N#l zNiA`ZFhI*b(S*g$d&qme(Ikbt_{bw4PC)$b^dd8}jT4Iu+7W@B(Gg#?pflkxL8gQy zWNR=iJvH-Z<PZBfK~_^4E7{s_;t>*e=olWRgEzK9F-cCM4Qa8%=1A%lQ0_k0AF&yf zpa94P;~4uyo5UECyp6+_OyE6uQX9l2(b!ft015c}&XeYlnBpWn(4R+%IN#ysM*XYE zLqz`>T&nqcJAlqF5=dVR`SW<yBAAwuv1Td&%>ummn$L&8(ZvG+$A^%CLl$~4I5`dP za17}s*euC$#Zil}IRF{>t<(LJ1gfAy5v*u@Lqc<(cNVyOfvB{c8QzEaZC$rv3<ggf z;nVL4#D-{4!aFk9x=wPF1XT+6@yFY`n5~4NqIU<G0jpw4Va@VWU4Y$_6iVokSsonS zz@4W*hNsoJfvyT^8C{~kfKqR9i6q1V0YoJ%k>=A(HKM&XGg$O+V<-YrBi?z#;vE-? z#tH@RiGGCIuh0i9=@J)}HeCml<_F~~Y{kL31o^K(oHN2<QW_CNvPYa(e8n$&t}J`O z|N1CB*=V-cs2UF&GzZsKW&u80LuKUrjyA*<;dP+|AOTYdLrGjN4NDY>WSVK}GB%X= z1{|4HYDipJO$3$<PM#isy;S@1<RBgjdT5_^%FsKT?tIDmV(b}%)NQQp>+)$PdW}>M z!<dn@3~-osQV}SVtOh!oDtKlZWfoJKM+?$-f!@9$ZwPw3PslKn(HP+(wJF|>i<`Ya z#%Kj#l)vtAVx4S&?e8O^4BVZ<EK^&@0U?J|G$Ca;wkq&-{YKc<*mnZ7`pc+V?=ztm zRV|zSwVbU{Bs#$RpCb}2B4ZsTI|iL|at>lEop~Y@OT0@v(YOEAzvN%(sc##D+pqO~ zk;Jh~jbf8HDFG&B;EYA%U?fLNEJCru6C9BS#RM3*$TCoX5UIj#ZMYXRVIFvcdmN&c z@8wA>eOhl|Lm<sdPwb;ec{4ecOLzfpA=(Hc$Wog#FlZib<1=!U#>Nf={RGv{i|@ct z(D#NKB#RkV^Z{&u8%w(x=-+6pV=Y9xF(?^%k1We~IR3>zP84)-N*b4V2)bx)5K8Q0 zKPpWnso~66H$q6aom#SuY$E@~4zn9#)gW0grVjK(7_4-_92-`<)lkumNfjjf=BNOY zt|W&fGU5rE`~M!sa7<4_dTIeqp&I)2v_sTClCeyfmxqT2n{+7LZnx1fn3Vcd6C#js z!$hVR4_mQXfX2s@)AAzP8*w<_4ZuHR7m$ItCe_g75pa=y9G7@uLLY!!12Z0124^qz zv%>F<Q;VGSu|Sprt+DI+*N9;iv|ufi5edk%1|UoPHty?09sbSXN0+|H68{w$vZ@HS zbvZriG#HVbEyz<SXq+W#5s8jlKrsroU^cK@NGjeK9z+8D|Bka)yse{>d2`3c`BZDL z4ou-&1oguYg!m&^>8EbLI8^4+URlbN2g*!G<^Ad2R1cd1deck~9M}~qdo#TXY!Rhi zdEI%!db9Vs_2#Eur;VXv+T`{E1R%_!3{EM;x3ly&t;0jKcLY73>0vto(7f3F(IH7& zq>J-W`@CehktOxtCPW+tJpzv`j?t4-!d?%WO#`OMX&I#SHB-<;%O=k|zTz&C<e9+~ zb2B93k+NOGPtFw)^YkoZ?I7x583v8hiCda3B1kdM;S$@UM^Q=C<+lhA_(3@7J}@w} zNd{-s^v_XJ{|hDp*tR*9Lqw=qb6m<rzI>F4NL1{BiR2?V#rY6MP@sX?(nqk<^b^9A z2y}#oq7lol8#`14Q4Z(zA>L0U(7EdLz}&^fWWxF#s+JA0sI3JXSsqN9-ZQOh#$iyM zTGya9+>ERLG~0F8btASntGI5)w$}d`58+M&tBdnH9T+!9xD=yBv*rI?&K>tFSjAbK z*Hwa7%it973gLt}s|kJ){Y|{jTpmR6j6JR6#)yHG(8E(EkJN~S=SI~?Y>LTa0|0hv zi$(5=Q7%QDEWqjprSSl)3;r!y@qmd36!@G(fxL*$4uSQ6a|9%dyYb~H5JEE86ad%k z5>9m+xSjZlba?PfZW0!iGdtA>2hqad0&9{H{OS!&Zx;6{!>&Uc+S#iO{TifevmH9D z>&6;LC}hW1fdOlD;XqBjXwc^FS}Hn1gAAEr9cH{{aJ#ROCZv2dW00O~+%}e({wM~9 zl?r%<az_9+aJ<wQlWDqR^^R0KXn>U6Ul5U#dE=x~l|<ZrVo?O$=)0&A?thrh+YTFP zZ?Z8#1z$an?Y20Vk%w@hcJ7nT+8dvGy8C1;aCRM{EnA-U6;{Pq-#9Co8l3PiqIUNj zdMWcv0n<zjL?EcZ7+8NOW@f@f1vbZ);p^=0Da1682#lD8MBftO5doODJ2**oEyTe) z#iY%+U>c0e=2{c`QT-;O7Dg>Pv5PtSZ$wJ6Fl+9Vh>#`G#^!DP@A2&a0z~{KrgR7q z!TE`Nz^_BlkcONg+&JgG26N`e+EBkVkmW;<{eNVER5!R&<^OeL`OcHy4O#T>5tV)) z3AC(#%Y4k_-!b_XlVLMb?5eOa?WVYKWCS<<1HQ;44dOgS0wQZTiv)H_`y^P^CfJJ@ zjV^jujhaI;0E%<I$^Ea579s|rBj7}16>R7LS_*WYgu=Z0cTo`}2ucMwe-oQPsxH1A z?Pd{QUc@InFvNt$x%xlhldN-;T{G#FbsDY-F^KW*uyvVecWfJ#Ek8-*5aNs|sUmzD z8xrUN!>Ow*FG1GtFsxdh<787PdprkQ6(HZzYgOdY=kMepUm{YZSKtPsy%MhUqfOxo zxfBwrjjgOBb%A>$&V<I?y=m42Nwox-wY<*Ls;5^)_r@gTxbH-ysU&*j-M%uLN(&<L z-HWk;*F)HY+6u0o^8229Toz?je+?y)85ZaOVEk1)(qBaq+iMe}JW5YA{p~g7Uw#Y| z{y$LA>Yhk~O9n+iQ)bzH_m5%iH?d6=02|hCed(jiPSxo=QY|1lZ9TYY44-9zOd|sR z8#bR8zk!K*AzX>FqtPbzWkSYda7r$GQ%B1c{a5%9GFYTzH`?yRcFPRoukkYx&|Dt| zSdL2n0h8C5{4$eanAg9AXCEXW9Ye;VT_0BcWA-VW$4IVFLI{$S83L}%s{gzA#)K8g zo=b<@B&huGaLS&&j-`bFmZ!jV`<JO;@R(I7HD3a#Ag~DcaHS$N5umYGxcvouIR)^9 zJNAI3I#7l-<ylcV$FZ;n4xYXypk)yldqpZH05Ee0cj*ZTco6(@dsCwR6sQ21GRVn$ zQG?0=HyqLqkSpS;3q`196rndS;z(bKqhSbv1Rrt@4Iow|_7H0T!OgrQqUwLf<nu`4 zsQ?-&qRJ3#^Cdo{4bv<q1$h0hkznmMajE88IA$coff_I`P-qX$lBOr$-i~v8O6LwO z88z4wrI<+M`WviadZXP|=3wkla~)*eN0;{(@#6B}@|K)qIA~)Qab?F4zUbNaI+|rL z+P}w(tAB%4{Szi%=YzaFH&6LMrebyZ{cut>Zp)$Q7|YIfXIB8Zilf=NCrkDpLEo-7 zI=d@$H$hjBi>NX<Lr`8of!W3(Lp*a>GWs{!KpjbS)|6=DJmGClx63!gbrVNHJ-qrj z!uRB~?Uk|9wpRjku6=q<&$qAP2zpJ@h)DMarQzgI_SsiqL5Ga^x;cO)E|^pAB@RKH zTH;C&bG4Y*#2O%Ki-=5`yg_KN;EK%Xz)A?pNnBCs2?=5kE|Y(Rk0YV`jN1%wg~y_T kO$TtW(V_N3mia$lezbH9ff1+6C(9>Gr%ESF`O?Dw0=Wz*;Q#;t diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 00ea8f869983972013d3955328ec675ae5711228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmYL@zX}2|490ulAc7C#pf|XQh<{db5w}7~uR+Vz_PF#;Zq!$C@|9eD1UDzsLHywR zC4_t->)~)9SpI&6R9^`{W!x;;)MFU27o%+V5Oo^=@wshg@<3RVgcF#Fh70&kt~?aM z8<<M;Ey+-!r-B)(Q%7=ZwImyHTtQL75jpD|Z<sRIHCV5L=8G-FP<J^Nm_j*4dv07q cDuQ;HD`mZnN=>Tn*`J?-X&f%nZ*R8v0wDcBx&QzG diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 1d49c378c92098dcb7af0f68412459b0aa6eafae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2612 zcmb7GOOG2x5T2LE<M(4X+1>CE5<=iZya(WdqCf~lfKU=?;nG^sYEQS<v!0i_+un6F zJ^+z;NSj~4VON~^E&PMIa>`%efT)_Wy)h9;j5R$~)zw|qUp?9%w_0@rp7_^q+3zjG z_yd{sV*&9Iyy_VY+~8(tkn(F13wSHEBZoLqg;Y$G+o2m(NwuJz(2HuM26TnHVLfV) zMnPABZjxp}dqB5HtDtLPJL-^5)FoZu>%8&QAU)pXE%^4u4sTB_`LpPMZ@{d1WDGjb z!6)P4z{+>-$&(|0A|m#fNhRdtaHjH`XEM-&CX%Kyh&4@SI-O}XF!TPWzDOqvb+m~6 zPnc#(XprvTXVH-kqDQfK9Qe~vAoCyy#d8zPfI_!e1iJ~U(qJlZt8UDqAU>fp9fW}n z3R$nTMCU9FIMYEAgNvQdW3UeHu}EkkRo;A5_*1&=H}NR&?7-{7+kjX71%oy&&CIwm ze=@WMlzC+?TUqPW&Ma<Tn9KGL#@OT*x1V~;PG<jToI0-<OIue?U0pr(vQFk?74BR( z%kD~6%WPh`u$Dbty{v<NBkN|pD|^`ozM1v2HtxaQD+eU4(>6#Nyn11ohHhPUfOD^q z?q2q?KKRlHs=uLjHq`Ehx&dpdS5~2U6KD_Vtbe+f)wsuN#m@Vu2U$I917E+eO(Uyi z5dB{)h;j4bz$Bj1l4)_W@G%nj;May1;ZiqYSi=O)TYCnK_O1cT&4&Xgx8gLfFe%xB zv@m$1ki}D~grE1u7!E~KA(2mF4k4|U6h^nEAO+|ca^N@P&+qPkaQrnSmpWz>#)l(z z#^S~Cy_n%T_U^HW=ju2~MXY=n6HKt<FN4vsf-Jn9GJncW1gs51(BRX<kz_$klM(DV zXF8FKLs4esAsU@Q22;&Op*W;8LQOhM7kO{x8`TLdeIFnK4h)9XHlG}hW<kj5_71~4 zVdAq;-5tKX+Lj1m{<=5^h<#1rEK1W9(^P?lB%)HJGVgJjq+62^mOh_BSRlQro=Bl4 zNyxtf@vSinLJHDYoWS&4(6yd=0GL*Sn2U4JYXTI>8BL2?8(5^VDw~w)NxrvYibGNW z1fv8KgIltK4p+zEEr2HR=wxT@{tN1|je525EC$6SRCyInr2`hqDlXaIM(Qk3qQslL z5wR&&coJ(Civ;2Trh<8(7o~zCJzomQ#{%ZnqG}0wKzb}q!$ldK(r;NS?5(<ipdwBD z$u%bA?afTY&bRDtYf2CI>H0|+vJ|`pViv^;!ho?6Q3?*OWd{m;=S=e8iJ(z34+M>8 z(Fl^4yvjIVF_=YaG8>OW!AmXDk63!0KG58RB3+b~JJV9)!a`roC3dacQEV;-JEXVC zx^x;A!6Hos9hOesFS(uT=zxi`qRCs(J|W$st%Gj>UuTZo1xxY<0&p8pDi(<IRQMV^ zUxjKbQtO2;c!jP*DW#<I!dVKztyQvZ4p0<c;k4XCn+N}z(z!c5WAa3;jtcD_ZxhnE zKB_7zjC8g)m!yGim)RrB*^;5-Ss2P5m>rn1i^uN6kne8iYpIK<sLx<9I(4gVI;Lke z-MZ}nWx>z0kn(_U0@a3Zp<~yJuM2bddX{Ut&^)@9Wy;rJFCRC=2QPoDulw+-cVN(l zHnjy8kF_+kJvK79DxR53Q&%#$q_~C6oMYd$;Z}wd7FROWi&T*Q8slpj+=>nYmb*}y z&;|#tM2iytjYzxz3vY4<@s-%^VSybbJa@~z3Xsa7fXKl<`3>kPtP}$Ps9Q}-z6o^h zt-I)8R~~?XRG=QxMUlZ|xNgeBmzwerjh8NOuK3bRbclTTA1hbwe2CWv4U*xCr$tSy z5~XZk@BNQmFpY{EsqBMB(ann1Q1%&*mhP&5z_@{-C<FQec9?2qj(K+g-B~E^;`OTb WVel-^>e@~GnfUA4-WOiYGyet^Zyx^u diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index f47b324c34bfb32b2753dfd68009f0d2ea322c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3793 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 B!2JLK diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/ephys_pre_spikes.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/ephys_pre_spikes.cpython-37.pyc deleted file mode 100644 index 48bcaae63b828d24bb09064da0cea99ae541b9a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13027 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 E9~pAPiU0rr diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/naming_utilities.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/naming_utilities.cpython-37.pyc deleted file mode 100644 index 29d651231ad9e4a383ad643f98ac6ad68488e4c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5305 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 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/output_validation.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/output_validation.cpython-37.pyc deleted file mode 100644 index c4be6ada016a81dedc2c4dcdf4d4f4cad98875c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 zcma)6&2Jnv6t_JeJDZPf8d8)1hq>@E2NKc3fht5Tr9GhtsX(RCqQyIQb|;zjEVehv zMzaUnN+9tkRF$&g)PHHNoH%np>WTL}>?W!>;FX`>`q|I#<M*2{*Vk7F4E6iZ{O^E} zKk(0D_@LZ_X>NlMM9_ky)U7OKVqF9xd`?qObVMZDp!wp4SQTra1%f^%$;O{>j~v#) zW6QOzy@yIX%Fro}2xbWL0ZgMnRHR}%DCrK_CNsbCFUg$Dg37Og9Wo26P|y>m?^$}u z1gnA<M0i#Bg1q#tH)oVMJJH7i&Vwy@>CIY|r+>75)p|ysQoL8S=9EGz5L|euDZF~| zi5*HU<J`nt#d2I`!#G#59m0mO`Djv1Ol*0-knu;k67u|Re6g9tXSp55VxqatOBH_+ z|CbwgM#%x3Ih9w37j9nDBni?m7w4l~)zKN(Dpvzj`>55c-x;Z&G<)^R_q>?Mhgz39 ziR!?GQ@0IPwRa+?bxSINO8U+b&x>BEdW&a!ix^GaUaILPytuUVTw3Yc^}X5~nZYZf zJ5Zt5zdg9y#b`{I54qUw^E0ld-TR7Xr4sy3SE^IfEyq%s3}iVTPEGggyx%psl^>6J zcESe|?iK}{5GQ+m&EfU34<1jsE%kIyW)d&$E$ZEK3GS5>JD%9yDKB#2>byIi*4zL7 zl|9$1Wflg&OUyP1LN{ncBNkDgc4!Fe8fX#K8(@3IG=oKZATrc&ASCg+gW{*4obOij zEAqn!GiJ#pZGd^q=5*%4f3Nc96rkvv(E3m5PvMgWP^<w|64XqMfeZQ3Q5{0G6KPVP zV~;!c4J3_-X<F&)HawQL0cH~0XVPe)reQYZY9L()8gT>8)?06+Uuq%s+h8%sB|=vq zd3_5{c9zw2{mq;m49Gi77%O1D1yM0UP9nYa3ps+c1bZIMSj8&xj3Vcdd&j`7%EuLW z*;??Zf)eO&tas@H4=M1F*#LRy*ySH)$SxeXVs+nwX*NMrq^at!WQWXw>_A3(m@tjD zI>?RUDxt1439Z{MdaTa1Dn$DQAN2)4cpt9(1(RHSzAVg$pZCnTRF*4QPRtuP+1)S7 zj2Gqrl*Y%!XIEc<_}ayoXF%NCPOqq2l-LsZIKZbO2{mTqqQ?I6bB$SQtg~)`NTQ~_ zYZ%aid+Du#w2SbT(HV`v)%YdWt02<NYjHFQ7`=v8BqS8a9e05E@PFq09$YlY01^Qq zSj4tir=i8W=+e8Q#Ut>46ZiZ>hpa105~hKgjK))!bdxT+bb!<7=NeowQtd*F_D7|d V6!HL(U~nJk>8;#cX#+Ok_Ye0Fx<&v1 diff --git a/brain_observatory/ecephys/stimulus_table/__pycache__/stimulus_parameter_extraction.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/__pycache__/stimulus_parameter_extraction.cpython-37.pyc deleted file mode 100644 index 8cc367978635301ccd59b446b0680bea0eb85016..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2591 zcma)8&2Jnv6t`z~_A4I^rBp2{!W2|x+h&Ud92%NJNCHBHbhRm@-E6w@j=kCG?#@hY zPtu8IE543!g#$uL#EE}tuAKN6dg9r$J4vaK>S(-v_OsvbJ-_#JKAW4XB53}f-_z<0 zLVs&v+6plE6h8SFI))e?qE_~cTbQF`i&-2!woj~9!ASN*a*R|s!L1^5S|wiM1zu#u zUV)WZ`6t{ebEk({g;il((Q7@6&9GUJstj+V+T1^24{aS?T->EgNAEA)-n+4~`)FnF zMs4?IyS8`q&ZEUo8h6|wm9pd05x<+O)!K{o>+RZmM{iLfXxv^jih-}VujJkKE-dcV z+O=9CE$EG{5{*=_8SJ;pday3&VQL?G{^zcv5kM=!r^jpX$vSijB`C2Ho8e#VvGerJ z1h1pL^W$PtOq@YcTu7XxxPqQs*g=T{u2}RoMu;>yWkmHkkxF>}J`p?=TmmSnyuc?x zk5CfI*zE^l3_9K@8b*>(pAr643F@lT$&d;_uDFo(YL!51<P%0*%9|1OVI6IbENkOt zj)@@bm~$k|swf<CGq2Sq^RNY$1g|%!0$aXWH!*!_B}38VDiXdldJ_bhEf2si6EoIm zM>LdEr#K_IH$>luBq|^WbQp1&om#Wf`4>^8<td69PT!qGr{e~`R8#0Z5sW&y-?dU& z$%WR;8Q+D@Z=r9u^@gCH<ek9pM84o|u<v_EoV8}m#w=2hn|av&LZS@Yp8vMC-2O(w zRkUfJvU-;uQa^65`V{am`azrf2eKW6+?Ou&LD-LFd(-Q-rKk8(NZkS5=dgD;1PwO0 z)dduOC+Nb72UG<jzQtXxH{H@WbV_s-?GE{=n1`=3i3DU*J&e<HumJw#e!m82<t%jQ zl7(mODlX%yC3NMxmY#)XPd=0B*Fi||G35FQ9$SgU(4Zo&F`QV(_yj?oUxPV(8Epd{ z=q%q#tEc4%m*$M9a{FmzUj$LeAO&i+(52LxGq;)P3NADx6UwZsfS6vHUaCQ#shTU* zTR#E~S%ePZD!zclJd9ioT{pcQI4mpHUt!>(vHkStsUuLR&&GwMaEuu~!EI~oK-oHp zJt&Fqz%eT+g0rQh#4K=j9e(Z0Xk3ivm3>?=YsDSpUo9Zz45~t5G%jOwRM<fbcyL^P zR(^mUBHwy|fC}uyxr3f8s3I#Q&hO|C>qq<pezE|hU_-bZ`XNAW<aJ99`<~k;6l%^7 zpwzh{R1$f}d0wWTKcSBaHAq)@p(2Zsj39kt(&a9VB-cuDevm1;11dZyG!_}+(H!Ik z5hRBu9m7amO30d8zAK1S7%2i4sZThS9vnZSZr}6yk^mml8Ay78fGe((`+ZN6UgW!m z$BaQu7^6^`TGq96z=bw6BHdV*yVU$=44+bAj%AYOuf%McP4WZ>ikY&Tp4aU@xT;fT zdbmqRTK$wsgYIMQf)CqJZV;g;Bq0||TF0>OnUIsva|c6S&spq6PI{RsGX#WeWb6%8 zuE5)Fq=4e!YOk(bU6LHEQ3ZyxHzA`=y>Uu#uW;<plgc;=mjJ9s{AdIZh&dpeo<#Eh z*!hefU`-cl?xGeTFQ|xh01eRqT0sUp&R(XBr_XS?L6F@ngjpY5Cp&!(SsezDV~{pC z&BaeP>U0O5g!Irs$nC-l;KQqUz)2%keRv#I9P;T~_Z+WmrDfP<9`vJg4Bjr!1zZ}| zG6AkH^*o^7;V^Y1EGfe<sZFIyXF-IB4?7$Hq}6ZrGqWK?Aky+zJT{|R#jw<whhgSS zgtD{nAjJnM9;G%H;y>IaG&6k+pS%Jcx>T?h@Vr&FG~bpj3(w;PeBP?s=PjdIn@KGo z!Ph}GExExc^oBgGe)+}Lz2?T+>h?x!zPZt8b{ebA)vvcZ&5hQak=Hg?w~bg{Z8ldQ z>V=v0=Do&5(a^dfMq}g*MEzz7!?EQ%qku(2ei!~ZLGmJW0MMQXfK|Itv9SJ|eS5a_ EFUA1u-T(jq diff --git a/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3741c9d2fbf629410136d4d0baf08a92660418b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmYL@v1$V`42B)ZPy%_742g$qrIaLHOPA8kVC1t%L>&1z`L0~Iyg}ZfQ(viT9wA$& z%0uZ7|0f~z3+?9fnNjiQ8EU;&{Ar@iMlDlCG_PhcdHFJ39slF!@^tUs1UqqXfVc|q z4m`RoLz6ke+940(a*HgDGPj3O+%p9yRB+isbA&x=HYMGNM;kgI_BrUq0ZQ&hiw)M0 ql|rXJ_2LVJgmxh5A<+jE%51$SrsDmo9l!4$PC51oAM2+#wfO}OQ$~pZ diff --git a/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/view_blocks.cpython-37.pyc b/brain_observatory/ecephys/stimulus_table/visualization/__pycache__/view_blocks.cpython-37.pyc deleted file mode 100644 index c2139ebda2b91fa7375b3abaec04c5723ef449d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 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 diff --git a/brain_observatory/ecephys/visualization/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/visualization/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 6525c0429fab112579b4fe85ef3f11a7996ffe20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3780 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 XAqA+Sbk##7xR(3A!3^eIU)}m2fV0X( diff --git a/brain_observatory/ecephys/write_nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ecephys/write_nwb/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a49024fac1a069f48340a77a906333ed01866d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmYL@JqiLb5QVc~A;KQS!cAc(BL1{uBX)r>`9Z_3lO<Vq*}}rJSa~H|k6>rzq!1sx zZ-!ysFzY-YF%sTykm@Vpr;M5<ISvSh?b$fnJy=NNKR(yZOdO&OQNRgIp`Zio#R@@t zG%ytw+bDc(F>0c(Pkj_yr$ls(oz$R9I9ke96>XT3s{jtAS9Gz3#)qC;ZBvMMff5os Z#iexU8Yzpqe-7toZ!VQxq_^H=_65r=KA8Xj diff --git a/brain_observatory/ecephys/write_nwb/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ecephys/write_nwb/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 52a85aa1f6586dbca03ced4c32efbd2cc7a3479a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28995 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 diff --git a/brain_observatory/ecephys/write_nwb/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ecephys/write_nwb/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 32cfc5d39889e208f4a141a1c47f015990af4c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7687 zcma)BTW=)Cb>`e}<ZyT=_ac|FinODws1<A(wj>Cv+u94S>4le8fW{`BW>*cT#lDQH zddQuD@{q_6K@2_RHHdBa$?%JRPXm7PC2){m;3t3QRQF7i%h=gP7f;=*&h@J^AFi!+ zSMV?X#lLv}`8O*ozokm?uMXk?KJ&jQ<ch3>D^7*~R-GFDR>OMKa2gfrtA)*|<+P%< z(~de$C+a%gsOR*eRcAF?bJn81)8}#Za6KA0gJ{Fqh&G+g%F1_EWJ5N8yds-w^UIpE zg?dZ2QEzj78}*LtqTc2D4(dI*iux+ocTr!HeboD0-$Q*}4p1L(eINA=xrzFwYGC~X z)VJg|>f79Z1N9xbi~26tZ_3KkmEqnWapRSvVI}K)piiIrV-<PBcGiBJoIY0PD$MF1 z2Y#A0pQbv9PqW&iIL+E0d#O4OB9%3dlu4D$S|27!sJu99JPZ>r9oDi9tmL1$T6xm- zd|w%pZQ7;_9i*ygTl=9G7%Xfz_USCezXpg0_{^_SD3*s)RkhFRvLdTLUiq@(G*na8 zWc{m((^^n%)ydnsi?-f^T3t|UOx0xLtE$si>-n64+5pwWikk~+Ye8*;YN5X^J73kD z9n5O+?z=eEp6tpVpK4#W!PnKS_0iaiV-@;UoS**H^6z{2Ywn}?qVhAS+RveAXKlSJ zt6x-P<vrV4%UkcsI$CSgibWeoS!Wc4sUlg--~Ql<IPqfnj(Ge2eevD77zd~0HzuAj z?~2C{i@vw++s-h#;J$1>^5Ur%x+c|AKb>llg-+sGl&wGuYNv|CS2rpgWp(MLUe-Lj z@bszq<%-_Lq5t&HAHDPJM@DJ$%o}_1@Wi|D;@PtgV$V-v>3#i~iqFlnWTIl@qf92_ znR)g&IC*9ucAUUJ^G+4!h9O4Cvo}w)7sPIIf)&rbG|{s+m9J>hn^sZci<389!+L2B zC$ntRsMH+=DwM8NBX1g}=71Q=#$D}K+VoZCH*)SDzBv3C*KBL``83c<4y&4`XI&g9 zxp3noR>O+Efu@H?!y5N-Eo<ewT`$gCm~cs)`)TE~g+L*?Dnu7V6D3vbD=fT8n^xmV zR*StD^)1x(HWfQm5T|Xi2P)g4TP&s*7bhJuO%yAQex+NP-!9+zh0()<tnIq77b(}x zx~>}~avBo7>bjppA@ZJT6glk)v;u}K^*$EYv_)18B(*0e$_=FMpvmc;dtm@EkdpMm z#D`J^u~g5UJv;7P=`^6$Ndn;qN$echj&Y)cc@n4PuB{i;65Egu&;u$+yw1yBOuC<F zS}~`5f8_c}qGb@nD>=7iq7BwPS8=NG_e%Fcs79%)VJPX9E=?lT>$FXWR=4;68Z|D3 z!4yeE_fZgGUP1w#>vSQ3;{WP`f?TRR_L6H`gqsg5W!FZI4X&rIYB|+lid<aPX)@hl zx~1Crh>q&!RFA0&oLALZU9_$(sQ!XlFO3|O=#3J+S)#W}^md8fDbc$ndap$9m*|5M zeWOI*EYY`0^z9P;Qi=Xri59X2<7#L1AH_im!)Ak>i;Ex~2k{%MZGv@DBqM<~Bc>R5 zSXh01tis9smCM6nqG<pRqc6?Lr?4|P8osOr<gQ<)0${@0h<*i>vp!MYnd@8UPqy;6 z)Y|pKDXA<qkXAb_vbi9gS<UW^0`lpuCLOMsSUY{hMfW^NLXRxRIDOcpA?HD3g2Wkk z(FF6SQn~&#O-3VUGcfsRR|Y2aFxF{>`S6x>CmJE!>BX@-4qyYc(<&-aV2rJGBJa5? zbudbufj^C=wDq|vT1*g*lc`D(yy4lkayBl!b2UnI<jN_ZDRwp&O=B+{T?8^6JMAaO z`5Csgn&5=6eZG@xLIen>ua%#`Rm}2wXK^v7X>e&zI(-0<#0Rrn?*v0j^%HblTx+1O zg30gTGw-8lvq4rXRfGpylBpJEx(ezq{nxbC^#)8kEU}5Ks5(rz3S<Hk&S^H>oNifz zhLN{rodSARdpw#P7wXt%hYG>uihMNeT-7u7h&}A;tOxOAnzHwGCmtBRV;fRP8Pbm? z#x`%+=3F6dW7bQiDb1#d*Rt;}w)jVUrj4SVvqw|wB}Pzac!1CR4n>&}xhHGn-l?fT zDS#(1r(L2uCAzD6Y8B%v@NqR~4YmHFwvO5W@R@p>U)7zBd|rhhH0qmbi@>w&Vf}5; zv<|>B!?Z2H<cb_{ZC5pL3czHH+hcl*>3ycRnLc28hv^$wYgg{^x;N!MM0Suho=_Al zoK4{uhG4+3n$;1;X6%I?BC6j*;}S#6-y?R5G!f&s1#p}afJ`ai4=i6GPWohVN(z6f zHGGgT$yEDFz#k!e&W3fn5^cm@NWTW^6yM6q<KH}(9~m|rEJda*?tXWEPedO19O1)y z&W6HE#l<-A#~5%SC~AufrIqk}3xz}yTNlZ06Zg7_l}nra+b<r>U%R{soGKwrUhDGg znw?ERs<Z@@W&V+wo-9@wc|I_o@FwtOxH(u8jwW_Jc$U&}#9czE#t2gH;anD+j3=`f zSZTmZC0<-Q9V>Abgo#OXDpCdiNsO8ryRmu>z~HAsdEk(l1ZN5?U}h7am$GBQ0c67= z!Ht34%LyEJg!kem^S>|7yAXTevDm#>+>MX(vzX!YyYW*JqhgYRnt|N3_GT1}UO2p& zfAPJm7cv;HNYJT@l{^%WVgYmnEdX<ISMXFtf|yHeqVw}z#lq`?#fdmifUEC8KSZo7 zd$fw+dTDmPHm08b_v^p9^Xk2Se}Dc@i|M@Vg8NW#MuDuA7gsj<lr}jOA6pnt#z13@ z80jPuC%C$J<9#vxl*&(!hPSS|Lh?Nvayg)8bpo)OUE_eS<gzEsouF;WgRsE^B2>;+ zgeR+8ge>bBHTgS6Y)-pyne6|a1|bK-F3_n#OVMu-RLOxdI9)50+6L1N3~?_v-6Wk$ z2$hyhz_ohn?AQ}7_?Ua|?ffc*hS=-$3+>HE-42L#M!8n(5RDsoc(FgX!*>^}B6Pzx z@;$G0{C|i0D}3fX6gF<!*x0Z1D}zcMF%(f00fFk}h<cUQw9=(uQA5K6d>oShTCm^% zQU<yO<n78D+;BZxeH3%J{A7~&<H8#s4SRo0P14y!WsT4SbYQ_{T|`TrvbJPx6-%bB z<;@`u{}Z|Z3Ec9AaD=Az>u>rDJ%9101=P35fZ%_dF#=JY1=U?pHbheITF!^{r%0{< zB7R?`9y#JAEBaSi!N7CPOq35N8uME)ho5+p<Lw48F*DBEXc~s@sfrU~6+jsLVh{tB z;$^pHU{q5;S)S~)cr9i4i3m)S#CV$l;a>M*`Z`$gANUNt=a$T~ZzfH>msq$!7Joob z!9t|4IQb*1Um`IFP=&V<r*J40)I?+_G*ANzJF-c508t*O0(6gQO8+#~8qfiaLfQwI z0xgUb2ve-9O|Gv4E7YAW8V%e)t8C{pH+bfb+C|SM_w408Timmc+BW)-Xu}Q%ILDsc z=M&zb9_)R<<8ETFTNt-3Z^)b2>$bcFrM{i@9ucU!CL4x_qO~1L92D%JY?uR3gsIi} zpfvT6l;LRDys7|qFxhGR@PkKBKgn9t_$*E?;_HN!)oFpBVzjBEXjk+%@h7W4I(qnn z`5h!9I1Yr#=_v(}kP?OVv804eE0od0@qC9<Il^L2jxS>Xk0QOYjIpo7#eP0jB3M4b z7APRk3JGJiy?|XDo4-X-3Azs~69Ys*xy4;PhQ9U9`)`#{4-Lv^3pRNr=QoSET<En( zy%Pcth!699JXid&u~8i!ma-j;O)eojKEb!?5u>FkxPUija2`lJ@dTqOygLbIEN}CC zf<y+4Fr9zG=*drz5c3KB;fXV~{MFN#F~W%&dw2=v?@=YxV)AQ7Ae4NDiSwU4$+0C6 z1>og!%<|5&*tb~e?(2sJmEoZ{rYA9D60Hag839?wMGTg~Xaqq4iZVvDNgR?ey<7tf z22w!63|vpZT#c7DGyiaY{CyxgQjHS84Px9LQ3<XpzhfZ`q+`UXN+Ol&*^*Ccro^c? zhep}84(I=x!)BIQX=Q@5Dhz`O(9MWo16VGnK6rUD1G-QX@z^^NA5GB%5S24bVEuby zGMxnBJysjYFIJG3RwI%GJ-P)RwseanGat@B{yz?}IPU*PT7~K_;PD?RHqPITr_l-c zh*SFGAe3|wN}Yq#1xmG+#5#2m;JyTxNq%Pj4=hGtd`@$ed1N4%tGp*;NG53lH?NSS zgF%pA&!v;2@%;9@-ux}(34Czbi&ZkcyrNXb*TD&KipLfvTC>j-%CGVp;Ar^LRfj}w zMbq804!nuWp2TMTR;lN8Dku^--F#7sE-h+69+<-(^4LZ6w%~88FlCob*&;MXbrhzN zSFwidTH|Jv;xw(1I-9x4xrl4Zf;(qpu@Owhu15JgIQN-y>B(@0i&IJwA=BzGei}fR z41G7(${eL}GpRJd8JmYiXGk|DfP}$ZIlCm1)MK|=K0ZZ9XHXmjhQg8lI?t`Yfua9} z&x}#DEB#s(DM-R*Huqs^n*}MdAw}PE)Uv0@mz4X8-sLL1>!t8bGJQbD5Ga=Mio!Rr zOP!wYOyL(Ci{_rtqxuJ&l`u;P)4HlK1Yxo^eiX2hSiS+SgB+Bd`8_^E0wc(wspZl+ zX}t&d%&RCapOcdnI4J^mk(6l322R_|R_#G;oIaj!6;Z@SI5x;UKxI8^9TRdWMbM(O zz|pXM-QD!N=(CRyI;*qBn(5kw&9xFIp#DGj@>{M}G_?$G;WtT7n{mXyZ0I|*S_2Md zGSjz-?$D1q{JV;#7>|TvQ9tCLR}9;wCe~StWL}f)+2eJH;+M~1@ng>63qR%@E*5pC zX<(xUo2h2|UZXWAmCjErep|6YGNNWo$eP7s<6B+FfUNzV1s(4bNHXM8+sN~+R_^w; VTZ21;R|c)YtAqBSH~7w=@n<RJ6_o%0 diff --git a/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc b/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b1c82427b31aa23d87554a39cce09b8260ddba0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmYL@zX}2|48|)sh~R@bcsIC-h<{db5w}7~uR+V5X=!_>H~K72zLKkt;O1m*5I^{S z2_av|dNdje7Ts^q)mMj~dfY78vClAKFUGyyLxgVp$LF@0$wR~tC7i%y8ZJPsToDwG z3``|b6Q%P=v0yrXYNOm*Eu&31@lcd-M9x+fZ<sRI0W2w}`C<dfg*L})3Q!~!Y9dQV b6+NQKm9k`$Qkid`gZbH+y23^G+M6xD<Pt!4 diff --git a/brain_observatory/extract_running_speed/__pycache__/__main__.cpython-37.pyc b/brain_observatory/extract_running_speed/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 390d1bc7ed136692df25802d6242b5196d940050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3177 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 diff --git a/brain_observatory/extract_running_speed/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/extract_running_speed/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index afd821a2d9fe304aa3a5fcba5076c08a8986d988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1753 zcmZuy&5q+l5VjpBasFm9%nm|;L`!g(NXyKwU^yTJ`!fQqgaXpcURsf?9(N^f#%_DN z+Y^%80^){v2u?f)Z{aKAzyomMM0GpK%m9vDsp_sy)mL9t=jmwF_wbRwykhs-p7*;o zwoi!4V|=wi!9DJ0UhY#r4`|?9JIGpjNJFQ$vUc8~oxDrCc|@bUM|*jn_VWQ9<U>02 zy)Qf-^7aoNZ-f7Ri;mFl@Gjb22+`g{JK{aGd$5Q0KJTA<lfj=D*_#A)?}=KRCn@Bt z-ruQTGo?XI{Cac-b5>=h@tAb$&J?r(UPsSmS(!7T>dv`QLN4m|=UKr_9iEBA)UD^z z)ZM2=kpYv54YhrC&@XTWJnD0g2GHU@4|waRfQC*Fo!)kO+vy$XT39?np9u9H?>oH* zeLOpG`hX7++Nj=l$sq`qg8`*4)<;Vv43MHSn6)ORASoz7_>qE_l~9N%Od%`RAC}Cd zcE7yJ$XsMVl0q6LBtj&LEr~WFud+%LA?Jn4nGuCtf3!W7KKjogy^=|)3Mtmk_x8EP zZ+{)ne*TU;UcaLl7nQz`yCli)lVVO(C0)>E3Xox@UEWZk_ONh^7w-Avvvn+O7MWNB zCtPTQ<wl%yVp1Twy8H$bL*}Z;-9iEq>#^Ow6M-B*BtjD<F!}?lHNKPek8@i_g0PW! zmY13^Wg{4nSf_%>Lg<yPSfzn5tStuSAd6f`W(s8y*`;g9ibR+dNm!OtnXAPKdB!9< zU`H|T&RfqMxWMHmEU#4KI-LybD2^rO632Bvj`M<7nbn7J{IX(Mv!l9LoqEs^9a~!H z!IrWZIc=7PmXtVs<SZ585ju2rjvF56cvHH#EVQr`tATYoM2vBhU%buiS5Mu;JtzKt z_3Y!>3mhFiV=3b&mu$)8YW74j>>|!Sn1Q_3v!Vp46O=`nuJr6naXG^v@P5gXE4BbU zn`P+1uTC!&c3xau;xAs?Vy;f%TccQF;thAPE&=#ytlb3blX9hom`n#>{WgloANm1) zqM(ttE$4Y>Hu0KjuBA6oxtUD}H`CdoZ64x;wd>(mZjzd7VSVi8jg-5AbBs3xktOy7 zW=odBq!-x70}eV-qI6XqVW8=xqsI8H4y<_13Y&;akB)`CXOO4uEZ-En(T=R^>nPsB zS6eD0hdA)v>K%N$yXOsbyTNyJ_iWIO8+5lXki+eSH=X6Cd=e;|zZ=Nur2TIYwiDH% z6}$epm9kCYU3_(bBJ!2Br;{=5F|}yeRCY(TP|$<j;>m_-WwFrl&H7wG#&uIUOTQZg q*V?LQP5Wo$n%LFV)yBpAzvSxZlZL!ceLSV@(J?mCd#&-&IQj>RH{(qJ diff --git a/brain_observatory/eye_tracking/__pycache__/__main__.cpython-37.pyc b/brain_observatory/eye_tracking/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 472c5c29a142e0663b504c79d1b5e03053b248f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 500 zcmZ8eJ8#=C5GEzZR%9C}&;nVrdPqEED~h5IbO;c{gOP<0AW$MB3E@NFQL)u6=}*bj zzr?ju|3apmWF$k5;P>&4_auKTmnlIpPY-<aiI9JT@+uJ?zTpOeAc&xfume*@M?GTE z$T5pYp0LTtN9<_iDVvTwW3!PHmLNy!Sf?!2b2g_$E=2r?K2kxqWHtGZmB{rf3iC_T zc79vdQuDCbbpB2Ied6RTFTHh*sZJYn+B#b~39wp*$U;b=E6`M;B}}32e4|2ITI1#3 ztELDuWvdE9*<5o6wdP9MU5KFvcFbJ`hmw=7YXnR3g9>hV3l}4VkJr{;>Q+fDF{k+D zoOOSRTMP~ZJnw&g&Tc?D$au}gdBJzw^x1dAu?fL1GHLE1v#m5xBHFg@A-igd3>q)b zT3+7qN@A>1=ppXbh2xFMZGjo@IZoZLWiNB@&=IFt=eZv4^YgY3$ro)!r{q_PeE@zZ LN$9&3eTZHF5FnI% diff --git a/brain_observatory/eye_tracking/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/eye_tracking/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 8fb80774314a6e981b8416a2d22827870f5c2caa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1721 zcmZ`)OK&4Z5T2Lq@!NSVS+s}|oGgKJ;D!()OA-_*WYH#YXjvL{rYm+U)6?GWv4ed> zi@2@Cf8fMl>MJMy0w=0_Y-h79V@;{Pepc1@)%bb0+w$-!{`iGXYo7O)1)C>A=No+W z?`W9E{M-{h@kKxa-{K$-MMNU!hj~rZNnJEZL&PK&P0|!C(h_ab79G+NUD6dj(sOI0 zye|f1Aa=-(!?k=@?2$dOPxi$DIq<#jJXU9oUp>|U|8+>7AdXoRaT5*@f52K--mv{Q zM&%6y(>zv_t85B_n*P@PfhrAZ=$q~d+|qeoRx5^06JN;51uP&p^{Z0xVq(JcqBQXd zE#aCAF!f8&B{0)?E@ck1FtxK>($Yj1T%$eVS&6sSULK!cotpknH0O+#To$KFNi_`3 z4#tw*r3xrZX_kT3=2<m#uXqXTu~aTVxdGFCNx8;Ast_}q*5*M<Dhhr>2R!04j|5l_ zp9NTs;B`Pkh*-!XR(lhW8q{s!Sd4xH{U*e$#oBK|(p;mCL#;LHI@ETk!+H*N5j9|g zdXG?_^|9~+(>^a|^L0fZh3jv^9lRATgd}1<ZVXm~w>FNxhmu|nYbH+9f(l4e(@Ikz z**v#?Crw|?X<p5!9-e0!^Wv_M_r;%{Iz;TuKR<u_<@iUWT94_Jve6B_r^Rx7T+mDw zjD9hOVxh-!28GVh%Gq?O#~1u&tdWY(XEeK`6TrQBjw{&R(T$?KNaYQlxS*v}%OhAq zS}I(K3>~G~2~Ce?OB2}yniz-<(8Rv_&;}WuU!J{KeX5~M$|)qdoJ??Il3T?k^41Mj zNur1vtP-bbGtimhGpi#Ls(EoX4Ae7wUaa8NoGW10tNjz1-GRF0IV87IC0t<a!%%(f z)-5U_g8B&IYM1a?vR#Q6LcZEPT|%-+B@uGLVRhgnn8<mFjOwJ6$rKb^4hL!<k5LEK zJh8?mr>q=J6LU&kKB|tGL<$*GmT}Tz+X%7$?WHyZGFWg1GUZk^sU1-}cJ(3TIiG1r ztJ_m-BkHEf(|2a7{qC&8ndC*OH+vpt9yC#TPw@)1hbG2X?^?(21s%WR_qIPb|46~x zZ=O}yrr{v84aY)ktB6IY<eKTca22as_WFOyh#XpO93!aocT4K3*Ip+-qviCyDSUz_ zSS~gyv-om&NSahlDm5yrKNX@OJKMq0TB*urL<SGzw;Xb&9hHth)v&v5k(3p)vi}FF zZB56TE*kuX<L7iLuuJ5<>qXVK!=p{xjQ-O$qwR(1yyQ7AIcTR5N4>IixZ*3D&inE< Z@mE!wd~H7}+Qu?K?mqJe!G194{0pSk&Q$;a diff --git a/brain_observatory/eye_tracking/__pycache__/build.cpython-37.pyc b/brain_observatory/eye_tracking/__pycache__/build.cpython-37.pyc deleted file mode 100644 index 861375f680024997c327fc587d48221cf22d1548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4118 zcmb_e&2JmW72nxieu$)Kiu(R?*f@?w+mtMltz*|ttx$3zM72{TP6|TBV#yg%E3I}n zvqRb1kcT=w)~U`#4<rf%Y5$5Idg!6Zspw&^1q!6-U!X(VH?!o5l;rkOF8DrX-f!m3 zn|W{Mz0uKx1V8JyKiB^}D@lLjO8++p!Xx;*RU}DR!pM}W0Y_CNbh#=Eu2dDl)v8L+ zexwr>G)CfG)J4@1p(V%&ma)=Rs>x7Sg`Nuah|otvJu38csLMD8_$xS$M}8qyGh_@W z4&)O=KYfuSNs?;F>(b9As##$_PO@F(e#0hSqR+qiOd?WevMW`m$khHcPT~|E#c6y6 zXYd%#;&D8IC-D@X#xr;p&*6EzfEV#q{07e9@8LJ`wZ=4l3txYwB1z!i#y7|eUV5eU z^gO;9>a%33GuM^AMAdolYQD38lU)RUWvh!MLl$=tng0qQ=>&cL=rf4v$5Q^*cRb=x z{Fux12GLfliFLbvK<KVvl73^cFO>R1*&98yF)_K-vS&DT*d*~w0ZqdHL-@OYRV1ke z(;Ue3Hj_Gt$zAlT43e1AQCXx5j(`)=Po!<>r_zaHeGRrU*#4=7Iz0HOEw^O%gem*6 zPMq7jzr-qzm?MXYHY^@T+bWK=BP`O6wv<k?E45>-SSQs|0U2+_JEJYYv`1PaopdY8 zX9G()7_9}KxE*%oC1RP*7~fKyz{&kA-<nq_*c>*F#~LFX2fii1w=DSf&(J;%8<$}d zc%l&#HnR11u$dG`B0FF;1y+-II<)!&Sj`BlZwJ?Tg51{GN<n+^|6D7K_mx=fRA;&s z#9)Ta!f{J=m97ktxjYJU;QJh&?L|ShRPcTNAbKLxr53`<EbQJv9LD|!A6u+u0U{2u z>dfQCF2Yx5rFOD6cJDZMvaJO4TmueAvmy571X;g_k>3&{*Dgh0?<4TrJtXWhKggB? z$QuIroBx4aI*0rLAoBwG?WM?@;aqSQ#aw*-w*=x}uR-+Z5D4opV1FC-TA@X@fbX>s zPd<?Dhtdy2=|Lb_9l#U>W*00UhW+n`(vL#vQ4eDRrYJDK2FzO6|6V9nLTSB+c?U3e z1?G={*$Dd|htm5!%QRcW??CLNF8UI^gyIWj<AW!Dq;3-3IvuSw4HMrN<)g6bkA!uB z@|uuGykyuEYKu3G&3b_xlLDi9{lKsq1!3!Yx0{x6M5wEq8gy%6w?i1AW}$dz^<Lr5 z-NNb}UTUgQEDDq#5fgjKLO}=xoi@D5A3t5+*m}IVwej$a(2@4JVwFcU4z77}fq66M zed;d+dUvS|X2T0Cz7|oWQ0>lHmtSjLrjZNQC8~0_UguINFMCPav_cODl%k(GGBB|< z!*ZHT<7N32-T&_2@beYGc$q>07&8vZLklbo9o9#@@lQ9`H=b&nPd<9~i55hy?Tudu z$rtUs>LuZRIGg%RDGv6O29>g}fSI?{be9`-x@_1hx>0irj$ztt<+4c>F9U!Aw+d%E z-%`9_Q}QaoiC7lH>y#P0dL7Q(@p9d!&a!Tr#4;?G8LY|3vP~P8POf?>r|Is66Ax;| zp}x|PR`ykn%PZa(=fmD#XewT`DxHo5DFlw5#&}@4Fc|JZr8uaR29@$@Tr7a22c2IX z(uzY`X-I<&1F)Cbw2pMsz&YA9$^9JcKB6%=nZWqf4s0}F{IUmaDqzzAn+X`a=Xl?I zz!n0w7_h4Wn+Vus!1#kNf7MUaZHti?%rt6#+-*7zC9dm_J%$tg#Ac7}riC{swW%-L zt{<i3&^{vmc$oHDWv%kThPL&z;wufpU~hD`=SRs4!)0zY)v)abyjbd{-NbYRW~@dl zra>%LO@OslYr@k9KsD2@RVT3h+%jz)Ys?lIW$A~+Pp`Qyfg@&Hfg1_8S#zje=Uyi2 zd!&A#)gg#}bl0YbI`gyZPb(j8Z1d#OKK^9w{S9sPlD6U{ZDl{|?lqZV`tiE$9E%5; zx^EknKU#UVy)E)pTi@Ki1X}VVu45X^k3-UHd>j4Lc98zU>wL;rMQilnIh0LT)WaYi zW3Jt#b<zt3Uvl+IuZepQG%x@`xcUu#v>pU88U&E$A+j{h!y6Iz!tW&d0JPI)<^Iky z2%o#7@9B8Cra#xM<DE52hfT+NX@^)x?vCvc%Y_va+u1vIceae$j%zSdaNyE_YXq=7 zp<R5iQlq+IX?6`pJkoi>uMA!vD<Z3wonv|z=FY(1{ThfQ$K@27k>g4NsUW3f6~QOR zQ9^tw%7C0g6F}oY69EP5sGPpUI?Klr_6d}Q5z?T^XaR6(^yUDa6Y>nu;7k1%DWwRX z{kWzb@+E5Y9ysnLw_zu9%!b6Yyy1KI+|6)So>#r0S}+WQ+6_bXO5RW*AFg=CVc1ZW zAFhU_Vau{NP{+zcu9Pnn^3@A1msHEuiv_euqdYoiRn+TOQ7^2B^bIgMMYr;bukI1k z@niKp+kmX~BNop9{)`A84Bq_uRwXCY9K1Mk{G8`ZyRP%J&&%`?jODBB*dboFP&j|_ zdTDV9=lT~B6ty@^;pi03={11TTb$%LS>@yg5I=?uDhf<YueqXV!RGUcVe`w}s>I1M zCo7zMpOZVBT<3%zaeiF*5Sr%4`>9Enc<)W#n_i=h<{{L&kAx?FH1Nnz=@@I^py=}z zmr-9m0uw(W40xC8tAZ+y?TDi&(s_V96w^O|kiiLkmp}Ym?ljLJ@hKB1)Blt>ODJiP RUm56)!UuWAdm$S$=s$|fvgQB) diff --git a/brain_observatory/eye_tracking/stage_1/__pycache__/DLC_Eye_Tracking.cpython-37.pyc b/brain_observatory/eye_tracking/stage_1/__pycache__/DLC_Eye_Tracking.cpython-37.pyc deleted file mode 100644 index 1943cca8111803455a5b63eaf570705fe1e86c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2092 zcmZWqUr!rH5WlkzV~hbq_!A(dZkn_}VjBWU6H1z-BvDhLv{I-ltx!*E@7P}0yS?77 zLB1#teW=uze1}7Q>Q}ngKIJR4Rnyr!L!9PLw=+Bcc6RnRdtXmXlq`Jw-+!Thk6G5A zW^(=%ka>uo`q#EBW-(h>!~!d}&Mac5^Bl>i)FBSbfpav%^1GR3ffP{Vh*7UdigqR& z^Gakq<wr!>n;;V@Ul5ZAnSP2?(rD9UI;At@Qc7pZY)a?ITuSH3d`cI{0xZOrF`GrC zOKkMaCd;rGUxDQ_+qO{l5i6o>1y<sZVd1EnN>}1fV9{`F3|8E$Fdu)45w5|tqwA~$ zpRsXPW)rU+^f!`8l#H>dAxY(ZN&Go_ufpol8d-;RX0z#EbBh+6S+K|rb}7CIH!y=5 z<~u9uUV}6+ZX@16pH0||Z?QSlZl&Bja@(*K--dPM?!cY+3&UZa3*>HAb+9j6<lf)} zcAyY{33p+=W1r<PYI-iPgBH869p6dUy$|<~zJeON{MyuGC4RsbF{68D_Mj3E*b>fn zhvv&T&m!SknVi`#thFm|3@V-{&Oz7%QhdC>CwQl;*X(5Ui4Z(cfb6svh&J!ITDpF~ zJ=!rsdp+8|zDiX~a}U;3wN|~p>eCBWzzK+<xd%!aM-^3=Xw{$(H67B{G50%9qnTRm zgfoyX_k*5x+g!jwv=UI=t!i0KRaGOrS@nYLstl|2gs<fjNB09riXr^m;~}ub>4FHN z<ysB0)Lq%rCSDfX1c(;*LZBL|1B;>9(Ne7zNbYO(q1&5(-oAYsJ$MWd>|wkRln?s$ zhTHS`351FY7x&|y@8{c|*xXRvUb`(|)7{+I+Q6sYy&a7=PGxw^c-VOP%2Zfs8DdSM zE6tE{zb2as!V`+Zep;V2Z53VpQ2YN1MoSlwJ;^{cTGGb@tM{oVaG|2vx;cwz;hE1h zr-DaRbLm$P@a%S~FJDD-c=FXpJ{5h%)jRRbfz(t~f22Z~V>YI153%mZCpo=AN*a76 z!?uv8IBzF8sghCfPk1POQes#yL7T0fCNmz@fsk78W*yJ9)ddyi5qV^KSkX5oq!45@ z9|%nrJ$b?*=-1O~)VZuTxz7+aDs+th<hdRg$I6irzvl)0B<BaocuNWah)?M&3`%`Q zRgw!>l2?6XLWB+tI{^(9B%?xhIv6#Xc%cy?-ZyA1AWU+tZZh^%hM1+s=~(-MEi2GN ziVo;~41qQU6AEb&4fahJB+j$vPrpk_l(F-$V?ihb+Cd~HlaInq&jVk7ZxTWGG@&pl zqq&Rur8-Pmhe;__8KFuXGm=UM?RRZMrrv?wH4Q{&o4wXCXqQn<-KLOD1B9fIZG=<? zEs|;tOh~ySWk*20C1j6<<}X4Dcqw3lNuiZeQo_x;Sy)n1Ve5j|oeOy}wZY|xV;04$ zUY`0wQf6+Eb3BrYNzu*Fno7wf{vJYI12r;*fOqKtoi5^TGMz+_wYI_^%X<dKXT&Uf zi_G>AQ@Cn7l-|X<iNpQ2{KE=w;`Y+vuiy4|4u8P<t3%qQtlp%j)bAf+M__V{ZXF`1 z)u9X!?kyZ;(Cw?kecn7&Tth9uiwqkXeGzcJV#kfNXWgNWZVcZL4W-fC-E3gjxli!w zI2c@ob%btl7kjuT;4Az)Tk0nqigxyv>|(BLoA+EYp!uR*O5ZY$g<R2|N#A0wU{~xC U`kd=aIma=xNxPgc;a5TZe}z7zlK=n! diff --git a/brain_observatory/eye_tracking/stage_2/__pycache__/DLC_Ellipse_Fitting.cpython-37.pyc b/brain_observatory/eye_tracking/stage_2/__pycache__/DLC_Ellipse_Fitting.cpython-37.pyc deleted file mode 100644 index eb558c34b1a54e39f9c8b81db295e40a011a81c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3992 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 diff --git a/brain_observatory/eye_tracking/stage_3/__pycache__/DLC_Labeled_Video.cpython-37.pyc b/brain_observatory/eye_tracking/stage_3/__pycache__/DLC_Labeled_Video.cpython-37.pyc deleted file mode 100644 index 8b7652bd479a81e0acd0e077dabe3e91605b59f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2227 zcmZV<O-~y~bk{b<7z2jz5g?&%o3ub;8v;p_lzft=Nk!92p{+DRT8%x=W?^<`J2M7( zqa1qZp@;kjqn`S2dfsbK{R>s4^v$eIoW?89`+oc8eeL6kiK2tQ@b_Qnp9RPH%MgQK z9+8LmR~s3}VGeV-LmY5=&Y448OJ_*d!W_x54CIbRSav7X%#%Dya(px>kb;}?#)2Xl zxA+Jz1rub#;(0!~pUS65*?OBM(-zK<3l`3jSqtaLoQ3mb-ogd401Lf~7|kNWB{q8I zl4V%zU4rE^*L9G0nH7+?0xP|bVBx4@xhuVoVbNf03|72PV7~V$dbk2tj;^vIe8$FE ziA}u8p}pZuB4><E4ROlvb9$en^(w3$t&w$DXD*xmHM8ijnFWVjV;6eY;TlFz#dv3V zEvS<^`mOgi&}I`hdpFn|O1CUFkJvVB^=`sCVz=N{?+b%roD1Z3nssn5I^<5j0(T+b z`x0)$dfPqApjTTLxQiM)eT{plasLC2d#LdMwtKg1WDnut(Icp`i*HQER(g-wBF22@ z%<bpuF<U}<XNX=#`oR!=3F-9R7+uO|?n`Iw^53S9UL?7F*#S~`vbW3q_Mu*LlhLm@ z_ag;}P6rWh`E5@NFO2+vwhhx=kGHR`Qq|Oc0BfpJtz2CV={d^b1o#jgfKtX##bw5u zRp>%hOWHj4!}im7rdmDm83@l0qmK4kK8O8yC8GMUqD94uDu#Kz5=7e-AuII6U&|&r z-HjkANcg$qOJGUv5O@?XSF4bQ?um{z{!-t@LA<ytfoiDqHHLi0OVw&5{7|b8&Hn!P z?c2BUvnK%2F8Y(8LeMuiyiVw!fK-%wcpq<YpKm&Rb3+|=S}hKn-sZ;E2L3!w8^D3p z@CNaC{Zz<f=F9r4*Cy3U3yH~zFEu3f!>VW~kS7$GU7IKyzlvu};`(mVe5rWp+*2SJ z@Oo2(SgBf<1{@t1%$-dU;)Um-uYJn>m}*~ym3=JQ-O8)i@f?=C@+hRdt9<p2ec7<T z6(>GazJ?Iw|Ey;Ag{Hjn6Xo2L-*{Tv#d;u~Wb_6pY6z8(EiO)xZY3F^l2Hgxd?`Xw zWSB?1N3)~JOh9$Sh30;vhV^b9f|6P6NHRSv=o%H0k5ZV8xF(B%2`=i^Y;tP8s5ShM zVK*t6Gxn1MIWQj+Nk+m>5OtGG7$xIP!8u^xicq0b8ZxSqOvI9`>LMbsrKoI2R4PbD zxoEf1YclatW9J0VP@98HGR?ze?5U6#rABhBb&i%4=pjKH^d7oEoxE{{uz(7CW;&AG z^A}IQONx}Sf!nc2iiozcLzBrzvfT+F)Zd#x(A)+jlM<?X7@w74$XX^vD>6)#<jhIR zY0JMGCo=VJ2s|@bWVX?19)tE6)zoWn(J+0I<kO3ga({HJ)N~OkwS{PNs5QChFloL= zB#+Ai15ENw3rP_#>!of<QOV{xuG{DQg4My-k(_xcel)~s$OUC)yA0Zulud|U+RT<q zF8J>?uxDD0OyNX$wBNiQ_T8i<Vn|0`;V0@n1!Ge(EZZE$V76)Z!C*R5J2E+>V{ArD zs5i)L2m25sZAlTF$C~8)uqFO*<aJDmJ^uM^_wK<DSTl7%4=JlP=qU}m2RLMSAx5_j za1hjih;T%jc#7z-s}A=3#)0xRR3lu9xC_u0n>1AHxNet%H?$P$!`r5=G^%@Bb(~ml zFI_U;k7k?Ju-^+ixEDGc?z<SBYT;3E)2HYbG9}kM15O`i3vSUqB|P()f;(fMLMHE) a-6Gly<V82<mQX%9ICDj}lr5uH+5Ha;K+Q1# diff --git a/brain_observatory/eye_tracking/stage_4/__pycache__/DLC_Ellipse_Video.cpython-37.pyc b/brain_observatory/eye_tracking/stage_4/__pycache__/DLC_Ellipse_Video.cpython-37.pyc deleted file mode 100644 index 08948e53c151ecfa7a396d4e214965def231739e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3389 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 Ac>n+a diff --git a/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 6b4385e18103d1663ecaf619e6abd3713c930833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG@*vJmypzI+<X=%U&+-+aC7oHh#!2v zJC6H~Tc_!Wk??+lzP@_=lu)xIhXFycJsT&x2lM^-kI!W@<A<Pq;BW+$NjL*WzCtK0 zDwuMOUEtPf3<c4;V+?$2BoC(569+{FrKW6M(}t>Y>A|3|k}h`8S|9Tgu39wUoWU{| X!k}q|$Xt95=Z#gTS}*#K-emR#gq%E; diff --git a/brain_observatory/gaze_mapping/__pycache__/__main__.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index e29bb7d5b971033c2adfc370e963c6ddc62495bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9892 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 V_-E+dfuYZ?lZQ3`e*H>A|8E@-JlFsL diff --git a/brain_observatory/gaze_mapping/__pycache__/_filter_utils.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/_filter_utils.cpython-37.pyc deleted file mode 100644 index f9ca25549a4a873bff6e7c8e6242057e88c9a2c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3522 zcma)8&2JmW72gjozeJI;qQ-U-6w@SaOhA!qCoO72Xlu*$p=gZ2aZq5ZU@_zjr4^UE zo0+933d=(g_f+&h$U#C+z4lb}ALyayUiR8Up}(L&PyM}FawR1;5E47{=IhOSZ{GX8 z_jrB1ZQ&RH`S<)^J<Iwx4OYJzh+pE<PtXWU*pcOzz3n@qD_l`~Y5T6|iMnWjs)?p( zy|jE!Y)I#*E*oO)Ye#g%`b*Dm3i~swf8zq2tY;T4+Mz=<ehqwee0%uxU(w{&5iYxJ zEu7pI&Rf>P&FnLWX3y<KEyr5!3iqb<2M2pRtkHTc_s;EeTm3q-kG#Al>|HDFV!lrE z<@n@9)(~#)eC0f`zIeK*=T=_N-CL%;X}y-?*CofizH5CcE;*Lt-&%PMiq%dhFAhV^ zCQ^hvW}`65q+&{DQx$9WLCoV1*z8co@)*-Rp0i^fO(hFsmK{nqmMZ2En}s4fY%~18 zsXW7DVRkI}CfKcJp_a;qoi50N7ew`&g{KdBDhnr03-45_L>DgZDZEhQ^1?;q*Gn#i zr+9oI`;EdrDc0z283j5#m4*GH@Pv#q?t3QzHv9Ei7>i_9*x6q!bpsduZ?X4q|8v~0 z_xT|gI|Dw$E&GpRK1^c4KiZe^vEENo8S5e1Bt4w#{ojOxeH~`<!;}xl{6OMt6k&%L z-yJ9(#z8Uw$77x)YJT^CpUPmu(=?0^?gphHgJ~8<dMBM1T}VZ9!EmaxWa2?2{T3R_ zZQD(!V{hQ!ak}n?eaj(g(@}3=^*{Z8Zv5l#fBWw*DyJjUweT6I`#y-=&a5-~;AlkU zaJF0c&h0G=4{Y;4!q9s>8crjg$*YgT2RezSm=p3i<XM=+EEzG*rg3=86=tx)Gp=Q} z(>AaBDOY?V;UL-!KdgRc$k{^{PbcYo2L@G&&&@1(#b<nyMkTWyGYOmPP-ik8&I6(| z9%nc`iV~hxr}kD0S;8iKT#Ek5qbHECI-fDAvv5K$K(dohrb$YgLYs;c@rOv_ilTS! z?R@;R`#)tP9ONuc)C7JkAd?CQc(f$$FLi!ihJxX>)Ys70W&NZKpI2Lyq#{F>y7yg0 zpi#8o*-O86ajx$aHutwG&8}F+IB?l)(#hN9v0!yuP`w}dgEsKAp>Ba5QjF1$LZE`G z9J85q1W!3~2(E<lwzWmz<p_5*TG*MJ+h5s$GDp<Lj(VEa&O8A~vdPQpIs9wkfNBs0 zU~{&tn*cn+r3QEd+<{-+0G)Nz%xgKoZ(Q4@o13{;jame8qVXqZQO{brx1<~3+{U+- z*U6Iwacov|jcTrixemavd7B`XPIU4{-ZG;#jMl5Qjv1}i){PW(%yqG&P4NO9I$KsH zAxY2$ueIgc`fBa0M>1ixmqU)n)}mYT%DYS58YOkM0nUvB=iEMW7QMW?*vNbN#>hcT zHu>jxB!j!NFp2=TX~c(;eK{p>PGUYlv>2e(E3e*r&Q5^8g3aOJz$6ORS-3=91G!6o zrFgs7X9xu)^<feTCZi}!wPajL&IWV#;6ZlCQmKYA20AV0ueyE}H}}D(^tDxDm};OK zD>3Z)Qg!Gf98z+U9ACi|%|<GjP<+9^voM|}Q_YTm6}ki#68Z(Aq|6;l&7*KEqd6G| znm|?tv>i^B6m0Lg-ey{Y7owVWj3PNClj!YAjEPhLY-1w>3$NO~%@F;^p`I>dKT(DW z6UcB`Qn8}=ogqmg<In*i0UCfDx^MM7axT9ML=IJu5{By6A?2NCCqL=qrGTEqI-RCr z#LN)`yX<!-+iboKM>vQix|2}fE4%w&l<1-;`jw03f~p{sZciV-9-fe}f4n_HTBCOz zAk9H>_HDe}QN*opt99yblnCaeq3Y5l1T{q?N)8UdrD)8!ib42wAe_#G`X23}YR#my z!b3fwWYG-uD2$O^{n|t#$-A`mP1;52&95Iris86_!*5kqD{AD!g$ukZT9t$Q&69w9 zSt`GYbW&2C)to5@I;(jzT1Sn*^%yzYT)#fQHbk+(<KTpf4)k;1gIpMzZtnLaf=;Rc zs+m(zQqF>*@_Pd=f;0)^Oq+#of_4vKn+2&#hEi)BxCbTm$7rn0cipDlwA)VG-o)2- zyLQ*@pa$5ow`!mr8oy(|gE3Z}4X5U)cX94whz4oHBcte|yA0`|G)z@6(8E>Gzl{N) z3($`i1;aVu9{}zE=B?Zr*HE!qM*#8M-9<t$<pW2ycv_Z)r8^=7;O-@yP+B8QDG`i( zD4Awahzg;MJecXb#D&oSF_C_&bhz^jxCcCYgpi<!xC&-K6_Uj~h!F`RBch4i>*jcf zlJ&B*`1BI};O><tF`n(PCvwE6QAVZgg9oMXud4xGUG4m8F7K9>GHR8EsLZm&dU0tV z0>6IEgp}XD#AQXv+=LAl-zWNq)cgRA-&?W^Q00bjsBb#k<~3(CVkn%`O*B^TP4YHd z{RlK7ng9dcR@uErT}!=<&i9OdMlch(CeDrP`Hf|XSGX{%;dDg=DmIj<RGPb!L`)<3 TbE-o$K>$46ZQpLc(R}oOgj3T^ diff --git a/brain_observatory/gaze_mapping/__pycache__/_gaze_mapper.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/_gaze_mapper.cpython-37.pyc deleted file mode 100644 index 98e9fbbdc61c4eef320a243f6a2947fcf7f4e56f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13557 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 MWm|jQLdE5O04U}UtN;K2 diff --git a/brain_observatory/gaze_mapping/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/gaze_mapping/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 2c91454ba87893f5900c7890e2b491ce664c3985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3276 zcmb_fOOG5i5bmD$bF-U$<h4m0gvbtr2@)U>k0hIrMUj>b$_6QEjnsJBo}MP|N9^v| zOy5wDIC0{@kprh(IPwqp6D@J##2?_miE{P!Y_dB+T41EMK9}usxm;hl=4Q9sGT;~d z^fmo?)i8e7o#Iyka05Q|B{a-nrZ9ZdGEI$3qU4vYvR|<(e$}e_HLK>=tvZgCMZ<4e zO}}Ne{I=CLjZY0$VbyO8R^{f?vekipjn$!F=WXbBS!37eHUEHJjGmb_H>JDljJZ#H z)vUTDLK<g{?a<xk6E3paZY;gP&FVM9P;eS#wH>Zv&U)pnc_)aHc*_$!Yu!!a0(b9G zPr;I0r=xc%ezOz4ZyE+SERz{liI<tlO04`{$*Lf(Ag=Nn$g7C!yaBj|xQV!qxP`cZ zxQ)1pxP!QbxQn=rcmZ(-@d?CT#EXa*5HBG<f%qiiMa0X9mk_TYK8bi0@iO8y#4CtT z@zY@QD&jMU*ASn@GoC_x4(6X`XV_Ud`#RurY#s4=eu1557Z6|M1oT`)e2Edbxl36a zJ)b-He!9IGkny`@1Q$V^Fo>xafcps-!iyAFFc3o%O2Vi73W<`)6ITcg7)+J{r-Dd6 z65NTsFi`zoDQignIPoNBS(|a?NH5YushGb_?D-H7)Q=R2L!zdEGnQfCrCe`EVo9Ax z+M0>Sct}Q)!fdkV#bel2#UvaN9*w7pfT0R@ArN#ytorHgtwac-=!BDq!fcorVvNm> z8jooVnqbxt&Mi5Gs3gNFiN~HIe#jER`{|9(z?K-!?toe@$paFF%G2i|UO+CpA{<h2 z89Wh6<^`ZakqsYo!l7Wg>K)ba@IPy?j;-N*af$~-hA}P7XWW&Xt8_N}@SlgRxx?3P z!JSC@Z#|SAT7O*s9A1B1@1*Pd_RsfCF*@Hh#pry`yt94#lVe9rimQ(81zdIPvv1|u zndCejBJF{@kq^-hl!}vxBnoH&%%l#IdJZdrZR?wQbe|XuXrNh56sG=ux`A9o8iFE8 z_fW|`qjlEVc)d?2Ua#-I@#hb}egEyR*VB!AlzEBLw8azvHb6SqP(4jM&Bc9!>3maX zd_)rw%PzbV?vL-SK6~qz&#$Mi-I`4!5l}bso^YWP+yscJ2`n`c`dQ`9&eq-Z)m<I~ z^*Irt>uNs;{e0p6AS}|s{W~LaUnY<SW0?dF927Gac`k|Vjd=h|B}sxrB~*wh5mdUI zxHN+75IRmGKO~>zCV#Az?et#B8nzt(jchw>*>=7g;EruS1{L{;Y{2oXmZu+0TPJI4 zX+P=NI%}dxHuao#p6PN)SxZ*^JdN2!_OhSYzCTAioi9$cc&$)U<PcB-DP)d(`Vx7H z@)ZXY#vxmdNYRudQnX}sU&A3oj)-$Rj)-$JmIP;qY<N+G2D~WJyUVKfXj8v&$P;T> z2fQ7QY@|p|0&4-n)y5Fd@2ac&5`)@ye5>R5HUy=OK`C`zlQkjoY>YZt(>p8|A!Z*$ z*E2(|z!)}vJ-PM4;0p!8JfLIB`a`-$gXv&1pb+DXzCGZ<L=D1-2g-pq)X(H#+ZztR zLjGn1?<#dUtQ7)gut!&i5*~g#9D>FPg(q)%)uk!7eHul;hpV>28c+43sceG{`cq#) z(<qh9lG&(WTg`FBY?Pn-Ou)tWGI<H+JpbwWl^12W@BD(0fFTD3A+J0&t-Jut3&T3A zK;cu(I(eO0R6hStk<cs24s4I<XQ$VYi@LL<o0Gb!>qdLaTFki{QC-F8@*t<{GSo<% z2Zg6|+Rm;yzi_Da4Y>x53!l>Q(a<g}p=_tOU^OAf<ToTsFlsH%`u&l|1yfQd0*o{a zV2m-e&FU8+&_5Ca{h1a!i9G>@4_BCn&~mB&i{R1FjDyfTusLgdlxMSRP_Y|Ir?8H> KURtRy4*mw?f&z;G diff --git a/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc b/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f5be6464f2ea0fd41b044a43143a80c6f36f8513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27883 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 D?P*_~ diff --git a/brain_observatory/nwb/__pycache__/behavior_ophys_nwb_extension_builder.cpython-37.pyc b/brain_observatory/nwb/__pycache__/behavior_ophys_nwb_extension_builder.cpython-37.pyc deleted file mode 100644 index 32df5cb3c4b9897c6a53929de6cdb930765a99f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 828 zcmaJ;O>fgc6!iKlCT-eM6*$mCsvb~;k{q}pgi0!IP!K6XT3K4Hy)Vf&_S)KY(xf-U z5%C|WIPsT!<-}j$#M_V{6$C4Jy!P&!H#2Y0YBe2P>dSk6;yKPY`>|O8Zcgwq3k2Z^ zk~!4A-HhZeb#sq;xljE(pg|tekk~UXYvd7)hy%BTKXr8_0@?&00&u~Da2(Jra4xn# zw^q0VyVvBJ&^?G?3!1Pe!cQL7-WH7y1o_C&=|tbLyK~kF>bnD&@VPAXOQ^Wu6(6P( z$a#JLRXJIje;gie{-1L*ea$t`p#p8zrFVw2<O0&_55}Vv<MSn)Yo1P}8o!a_n^!ud zK2A083Rt;RmkEPK1<J@mv5_uvW>(Tn9Wj=3sTjMur^KSmWn#L?+D5mqx{)a|d=5-V zeRX_lIgzDZjM``K2JPRp?X<|t47DG1_G`B=^dZkO>?o$aMB5HUVnEM%Rp@1J)1kMP zp<Rqn<9r?MTd<SWAp(8y9~QLL!?adW>jvJoZWIQ{SRIxcMsh(L8>4>7t4ZD9iTSlb zH}<M68OaPwXq3*hwl3?S)KXPn9ldXLSorbr^l|(a4VaiuxacMPlB;F>O!2f(f<KBu z%}rdCXgEb&1sA`NNo-^V-4chy$AGo#Ncw+8(nmA>O)P9x&u)$_naNCm?v=|rdXg7n cmcdhk(#!!u<Q|6Ge&qSCPka)(2V{r*1W$zwD*ylh diff --git a/brain_observatory/nwb/__pycache__/metadata.cpython-37.pyc b/brain_observatory/nwb/__pycache__/metadata.cpython-37.pyc deleted file mode 100644 index 8c3c2ad9c50bc68f442aec3b3c4ff3806bd52348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3114 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 AdH?_b diff --git a/brain_observatory/nwb/__pycache__/nwb_api.cpython-37.pyc b/brain_observatory/nwb/__pycache__/nwb_api.cpython-37.pyc deleted file mode 100644 index 7c0146459674dfe7b737439b8fb5227005201857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3803 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 diff --git a/brain_observatory/nwb/__pycache__/nwb_utils.cpython-37.pyc b/brain_observatory/nwb/__pycache__/nwb_utils.cpython-37.pyc deleted file mode 100644 index abe5717931d5dff9b862bc8807104ac6a2db2713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2666 zcmZWqUvDEt5}%$KkH=#t8<y}V!0F~z2%Uk=BJlu<5Mo&!2pty?><MXP$v1X);@Qj} ztGm5fhw%gKz48eTq~z}Dz5$<QUU}NDfOHbSs<FM<V<K0&tE;Q3e^veKk9T$=2VeQ0 z@6tc_9p@LCY`zW#AK_;#gmk3HokAp{a1&S1+|9khPkbJGd8Y`HfX9B`Ey5%$dPz?> zDpGwlkewer8OZKG{bWZ8HNam_hClkUCnM-~q3gk_537OPf#!zX{n{Dcc!J2z&~3WM z-+cT@maAs(OI=NsF<E)~w@NN@H55(oS&^P9gVFA%I$fG+nk!aeW5|QM^Q`H#DzAxb zI?2^|TIHtMomcQh(=siTX#%b6LYGsQ;^OnyzkB#^-iNSG?K~DM*NWP`bZc=XF!QWe zdyj<_XRdk2`qHhve>p$7kHz<*_M~^<;3$6j2AoDQzWcMx#3ze#YO|`0+lVGkV`Q`_ z%9t{FJ3h@GsuD_0Ha^enEMAmnWp!S%k88HrT1r?NW#j53-kj*VI}@MJvgs^NwTjiF zxtdxf57)V<b%<*o*EuN}n_0EUWjuk=OvP21FF8H<E^V5Xu*lkcX!+L0^{uB#FsyB; zqj{>+qK(GrAF<Q+fNgXW+Y0AMHF7<vG_P;ZL#`Nzb;z~9&3aqG)+a~B?$jbvI)HkV z8N1%hUS(=GfExzlsI5c0|0L5eSEbcUf|L%Il~!p3<fvv7WzQALLkpYu3{2~bip(Ds zhHTn=)}A&;T~Ce8ibcM_(WxytmnQ<9cJbbQQf%u5^jk-p!e-?&Nxcok7NtCjHSHdD z8V?Q8_&E;V46bM2c)2Q@@ULq57p*Hj^mT|0x(AU&ZE|C5O$O^RC;wkZKL>+f=l70A ze>Xs4l+IFlI7!dbayhzNrsxQnzB^LoLo=%8sx(u`YCc<<(dXG@WHPI6&(rA{-PBQ< zBLySR?o2egXk1O;@nLE!y}VPNPv|#Z*eo}P^JR16R9R{lTn#QUSjsU>T05cG6$7#B z>gS;w`b`%bPlzRa%DD*&W(ZBjQxAeZIx7*|J^aiuMD09qYWKjo#QnVzwK#BAxXlmT zl@IByI(0|7`%WuQ-Bn=y%TDdrf%LAtRoD6tg1RgHAH=F#cX7`<$4!tiA3dSCjaw8T zCNC>ahutQcZ`mukN#~+A9CL9_(kb$$c@t@6a9-*(9gvS6;K|ZFyHH7As_kSL>U}Kh z7f8Gakq`i5gwn5(>JJc2*8p{}rGAA}RKr%>q{SZPz}d!_nq3G-?27<@doE$CNk8;B zP7|>u=e!vc&Rb}yGL$bv`!fa-)F|Ccz<VVCrx*dwRREv>-hl(@A2?^O{s3eefId4k z2ABb8^dsvMd7?PpSy%tVq8PIK*j<IS1Ng%$A)GRz)f%2wp$%%c?zDbo_^MOmW%<Eh z;dQCQ2VHphw+&?^`zRAMm%Tb-4`B^0_D6Me8Pz?~$pMPEbMZgEh<Bwlaf?sO$CG6{ zWe{3cCJ5F_9)iKvZ5XkSFNyUOkq1w2Z$F-HOk2K)H(QAZQwesZPQrw3pTf^m+H#+m ziEXHJu31qkTdU95f>o^hiXXXW@?rfkD24|~hi~ph{OxM(9!xsV9;w{inHG2+w*5(5 zqp9#u=*iRv5En0fLDxQh+UxQ9BEF2(q1*N)HS$zvbMEq&XhCoz9}oLY0PZhRt8YNv z?A|r#crs(U(yv0P={6@X0HN{IDC2b$y4^%%?F*%irbj%vNyg7!x1>iphHuz!uhO5$ z`7Ma1-+E)p(XW%5@6;b@&0mz6O?r$GMQu9lMAI?;|BCHxV~lMzM!DaDk$D5cdCnJ+ z8@V^di*6)*+_?c}zHmh(LTDn)L!sY<<?(PY>CBhdtr=!Me#8n;FyP@M_FF}p3!`v* zL$rs#Bih4>nxzl3N*}WQIGtxqHoA*=dWXaS0<VbG%&$xZoXxc(GM_M&gdenkeMqS= Rlk9;%2JW8cioN~){%<+d>b(E} diff --git a/brain_observatory/nwb/__pycache__/schemas.cpython-37.pyc b/brain_observatory/nwb/__pycache__/schemas.cpython-37.pyc deleted file mode 100644 index 72ca37c2082ae15aa5a4abbbdba3e10f5c3bf93b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmZWnJCD>b5VrFoI_*kuLZYI(CI#67DufV^f(9XUd)HWztVulVTAMgIJK5Ei2wHvx z6@Mu$6@P*1#)<X-F_K50zwvzYkl!qqXN=5z{|v|(`{^$yiwL};<DQXIO!1mETyXAj zPzOyY!X^??6N{L$cT9yU`pQ&<@t05}DqgcJ`9+y5<72Y!tu~u193NC$taj2OC<#@C z&W-0Yb+Ed}6Suqs?I>eSu?8wHbF#a(E{H)UxMCu}P;rb@@GTJWUpP@AwGoYvE(c@0 zT!*MWLcevh@KqL!sl}T?TU2AZhgvJ>@k4fROr<o?pp@g8lufIK+T(?kHv`mj#0J!X z4atdfI~S17SCAc*5Rd=mdflMwq3PTd{=w|Rr+fF?ynS9=JG8EVEvUSN1DIp++CbGB z1y2h!dsnm_8ds5TyY0~x?{!%?TG^8hsvT^Qa_gF2sNJfxpp9%xQrtt|+T+R`%9WdT z>GJMq6DsPD^UF;6f=>*ME$)Ne%n$QV8f)dIAw_=D&i~WS?=s}j>st33-Lw?z#ck}J Zuk~l#87+w$(--q<U()BByIBMe!&|F&yhi{4 diff --git a/brain_observatory/nwb/eye_tracking/__pycache__/__init__.cpython-37.pyc b/brain_observatory/nwb/eye_tracking/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9887b169aed8039142de6e55f905c8132e84d517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG@%Wxmypz!fQ!%K<SV)Q2yRYZ2l0dN zcgOMFaoaSVFcRKxFx1z8pAu@;<S-&Ac4X7!@L+xz|M9u*7W@>n4;(5`nS>rN@(n^^ zQNf&R>;kt=V<?E$RWb0rkvy1I&m0srl$v&%h7zjIr3Zt;O1juVYkkbIm${Bww4TBS Z%UlS9rWGP{@i|_et-3UNHGK6ZvoC|>J`w-` diff --git a/brain_observatory/nwb/eye_tracking/__pycache__/extension_builder.cpython-37.pyc b/brain_observatory/nwb/eye_tracking/__pycache__/extension_builder.cpython-37.pyc deleted file mode 100644 index dc3d73a86f27ef876de52b1709be46e943b27ee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2324 zcma)8OK%%D5Z<RG%a8bxHqN6Bo2F?tjpd{PdI$nHacl%ZQ=@=Wv{<-UaF>)sdw01d zDa%^ehr%h^9(3rrmjpfaFY($_{z6V2t}NL>a_BDj7?L|P{N|gH)@Ns%7Ciaizu+gc zmi4a@#*YJ&htT92bi^WdYK1n8PU>WC=w@E%Wq#;qwXkMe#0~4jBmN63Y|trE+jGQy z+Bmjg$KJMr`fJc(Z3UiQ+WKLA3ujaoIHBu3mJ%xTG(9M|P?0QXqG#a56Ty4MwvpyQ z+Q14+s*GGN=j338rYS2VU7-WIq6AL%Sl&sD1@m~&&Ovjb$(C(d3VcxZU*NfNl&id5 zpSUk;#Cv5QJID59%|BfuwV{7x9a_6}QYQ^EHFWHe)O<^t9!si0X5i$knj&-L9GNEz zWRWZleUQ(S56Fk)0$Cn<AYBCM(nPup(v^wy5lA0Tq^lsIk<_V?Plnzf7FfAPnh=2| z`SdrdZIkQdvlk6=W5a@5G{`jhoZKYA(Cye4EOKjDJF<Vb4(*O}<f!KE^vjv5pRM{i zb?%jI-XmAdA6kdbp?mB?tSpGt7hC05+lmW{RF|R(YQ++qB0w9B(MG(dik?EejW#GP zp5gd$PnG_i*4@^fa(bQSXoDqPMa3KYb~zuDk?=5$(^iM?2flU*Pqdc<6Lfu_3dwk` zYq+PnT<ChjbA=NX&Tbc2F`RBw!Kl<;0$v5So-&_R1PZ4&2lV*~1H$HWmeJAKaCURV zk&#%gJk8r&WT1`b2*=<(!ujZOlA?_71A`C;N00&?+9N<YUC(<NSWe0(&jE>>2e;86 zKndr9upBEY&Fu|F3C-cAW9fvP2rEQ!(ybJtg0oz;0w<gTosqF2ORrMsY`r#_7Wkq8 zgZ7CU6jan<9(sgjQv0%t3vdYwinZTPIacMpi4j=5jrvS=Q4SZ{$7v7zVmV6L9!&=* zPFcQJxgY}@@~<)?7C?JtLM$3P4Wl{|xL<zxKD`_X+QEV##owb=`+Y`Kx16sA1Hy?8 zUF%ZT>8f&JG@jWCeVlhvTHdGzz|dediWg!M39bNMg5m+XS#((dWn(d?J;6;>B7;vv zX#1TtmM0_J8s;1n3>hwNj<lX(N%?g}Zixt0n5AImEnc%TJUQWbTkz}*%M&Om)nmdo z1#JnMyartdio{Qsj%;O_#5=TKnsRBsa)>i@|8#!#Ah}#^M{jHtxMCST7)8UxI&g%k zTe>c2kwRq*9PPC3X!`)@zH|ajB&#&2s^mY`n_nN_-}xSv<PPp)(u#2(=YyR`Ifm>Z z_}&i9_vH>RXf6}zdC?unoo6iGkxbDQsJ?r+L*d&rg%f0NH5QoV5syLRK8ExktmgfA z6|jlMIloE|6r6<&isDh>ZWV(!%?BxyD&bkN_6^)X8dPdtxtxKz)`OHo<&bMI86OJV zaOSMmaIWYTES*>hFGH5+6sM7(?UW`aV^23{M!b$HUYBc6bEquFTSKmXmqIo|217?t zA4`N$A$W}Al%6C4)BxB9inRrlkawd{6Boe!)7a=4AR6waDl#RfVwbLU%#V`{7KFK~ zp4xi!?dJA(j~;Jo&s<Ww87{Odm4M7uf)y|nDO2GL@H6cZz|$nSiMH^K0*6CogF4sM zbsR%ggNe5b<wDm96IFq1L{S@<8b!kVrUhQu%;h));l(jK&VpKTB%I4>Kbqu>)Xfp0 zBhV|Z8cnwN*tmh9)1C>Kp|jkF&T<^vu{~(#?Mv>Q4R5sqtK$*&YLof@oz3}1@5$>l zz43SRwT64e7I%#&a9!g|6a`IP=dxuW5w~C`Y!(9`Wy}0csKBrAIE7MNheHz`20DPu gT=YzbK-7%~87IAzu9;Mp<}XmgS#~|Q@nggJ4_7RxSpWb4 diff --git a/brain_observatory/nwb/eye_tracking/__pycache__/ndx_ellipse_eye_tracking.cpython-37.pyc b/brain_observatory/nwb/eye_tracking/__pycache__/ndx_ellipse_eye_tracking.cpython-37.pyc deleted file mode 100644 index 99ce772079731af98a7a26f395aa10e1390f06da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmZ`#v2NQi5G5(eRvfr3I(6;TdayloD~h5`kuAuQbP)s)C-G`CrbvNQlPFt|H6M|n zQ-6tTru;&to>Hgi5(0dD1mC@TyuImk!f4rFm+)RNb~jv}Rz~Ct?Qlq-nBs;N!zm1J zL?N1_NH{}wlHO#GIKuHQSIMm?auk?fae7Tus<JCl><}A0vWenHY&O0pPj)yH@uhK~ zq=g1U3pIwgv%*f+212-aXVv)}jnQquIrcd3Jk%R)SBro8MGuXM)BV4qBlH@>#hd5q z;_Iz&zsKXP*K9Wm7mBRy?OEk%2+Su0F>Rq+$MnQ$8^=ofp=Hda{Gkm>S-hnla+^(3 zHu;oIh8F9g)~AElFvZ`@?+$!`hwE=2%kKewC}9n1QNbD5zWi#Tc2>cM676XyU5hr< zgsxrpp*+x48FYtp8qo$;NVUe0LT#3n2W_RR$ng|9=ldmnWBGre<#S0FZ6EVbjZ;4j We&&=dydcQ=t8~OCe3a$Mg#Q7M#i|Sd diff --git a/brain_observatory/ophys/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ophys/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e4d5c3404a8a17234d011473cc53ff678fde87d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VFY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh|aS5;ODS^OJxkmL-<t7gg$mwdlvkXXa&=#K-FuRNmsS$<0qG O%}KQbIps4DGXMb1>N(E< diff --git a/brain_observatory/ophys/trace_extraction/__pycache__/__init__.cpython-37.pyc b/brain_observatory/ophys/trace_extraction/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a2266d6fb325be13a249eb325a5cc68d470e353a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503 zcmZ8ey>8nu5T@iG2nMob&cM|}qyXN6qG-}AMT0DE&>|2ZP~yd6LLUY4EJxYey-$%T z&yY9K+R3lbDQCMufgHh)N8S&=yE{KPm<Sep`l)_ILj2iY-ekneC*I+RK?@yOaU($7 zMLLF95A^W&AmZ1#n2t8=A+8=@$g2tpc-Wp~9Ln1j?i6JWb+T4LmH;T1t_3Y`y<5sN zYXRpMUnMzN6E)#9%NB;}Rhd?9neEJ9Fp!}YLFSse3k8rZ8q<I^2tlUbYIygNK}od< z|C2YWx>pO3Yhx`_kRJ9F*s-0ZC%iT>moSa{q*4S6=evFqh@&jDV5fsVSu2kQ7oi_+ zwf^t|8V~HuWq#kAo`p|1$qxSh`h1#S2k;?RwbE&+)(X4)3{~Y&t62`%hTJuPp<>+C zm0y}N4~F3QA6<^!b|>ijtn|uY;Y!ZfDq?#3R%Guxo)v{bLq(A`U7vhdI=!;+kw+`S Lm?4SB!#H{cpm3#D diff --git a/brain_observatory/ophys/trace_extraction/__pycache__/__main__.cpython-37.pyc b/brain_observatory/ophys/trace_extraction/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 1e643ddf9ca93b951128ad4833fbb7694a6e9900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5065 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 Nj<e#NbDnY7e*sQfhS>lB diff --git a/brain_observatory/ophys/trace_extraction/__pycache__/_schemas.cpython-37.pyc b/brain_observatory/ophys/trace_extraction/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 7ea5340030b0414d4dd0fb7003c4b6bfd82781e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2909 zcma)8TW=dh6!zZiUEkuSr65$HMGY;kXwnKHP*u^is6~-dS8Bq`DAH=}nb@oB#hqCv zw%?$<_8;)Z6Mt!6dFo%_1->(DI~QDmqn(_YIp@r|eCNzOYqjbX{L<fl4!vfj@+VD} zKO4j@KJ^<0Ug1VuNepHfM4PdhSj<XnW+x7Fk}9hvHC9Vp<|ZEVG>;Y6lLl*O+K!t^ zi?xi(j}`9l>aP`E6|J`xYhzyHF6OSDZ(#26I_7mf?_l2GP0X9Z0RJ`2TfB{VTkmi3 zje|<J^Bxvfx<=tWmBWL<NF-smR=E4wa9^B?xTqfFGD?R<wI@_Acu{+nWw8j;!g&#A zVP4q#k;;qOUYd)ckkI42e!6$?97OAN7%7OBN(Xez^0x}lW2}e@GkArW!r}%ux%JLu z_66FxKvyr&HEzRvr)a*+@+eE6Ws(ayT%J%=x@J-1;y9eddC}lP4P-PX#$MMg+#pE9 zL<B)m4}v7)lbGmc5WJa$ak(RFP{qvYgTkCXWabS2XAl3V$d9nBhrfRL;nC4gN=S7S zjzYfO56{AMcJwq22U*I)ua87}s*bX;NYwyiHXhB?(SFoFQc*7MkHf)9I24eLV{q`3 zoxTjCG|2kUcpB!Job70lom_?k5r`@MC;N8-rL&~A$1@4sRXlu(py(R5;hIgOY3TJ! z5qGe^ON<i3dBlY!?6<}u?iO=I6|}8$P}8)dX;;%#O?#TIX}T_K@VneY&Ki2XuGgEO z0X@Cm;w|K<U0AQP=y2YUAz&o^BvdEJkSoQTNhAfA8?bABZ|09P#0PHrUyh@xh*j6m zjy3mP<@d8m%7G{l)A_yW|L5I0i+Da-sr-P(J0lSdNBN5FLnnW>r~G^rDIXsBCuw$; z`g!K}g?}2x5r5J(WgE_v9^ILw(VL0zqq08yh>J9jjw6KNIFl<i@BhY6wjkE)wq=LJ zuhFncgG)mdLt#_cBqh8sW`!{=9PL<9EiGq`wxBR0&OBlb#=zJ)WJ~HMsrwiMDOa~J zxW*<y=hD|)%rxgEC|Qu$B~c&4Ig|)Q?~G;Xf&z4qc)MsnpAO=QLQeO?zK9RIhWrGQ zy>9iYqtq5yRc28D2X2U^SP+w(uGqD{kR4n26v?|r-H^0$$>tUOkFm3~8T}A8qaT`Y zO@>0?7NG9{$|wU-<5lXe?=0pD53~o`WOYr~H4VUvCUyXHaJBSKOYgLK8=h|zjlFa{ z$=CEh16J(fQ<UkYIl^M7CJ37I&IQ5kmm&{)UFT}BsN##-B-H?17ni~&$$NB+iNQ7G zZ4$BfdM{qhZ!3`leZr5k;gCuyrfyG&r^T`*UIg;te7CPVtgjKL{QG`cpMEyU6;Q3^ z7A&C@KAIpcqqKp24NIt_yq9%xYof4&vLQR50&(&=8o_`%-~8Kgh;qg5=o|kyinX>J z?U4*kbi0RsN!+A90myxoqod9rsIeHJyapll5Jmn(Xc?ywM`QP;7@n`93*kmX4?<C; zv(l=q<++y+p?0*eaiC6n-HofcpukG1i^4-Z1073AnA44zwMunC86K%&eoets7#^&= zW;YjXE7t<;l&(N#qbwA2Nd1F#*_NN<xGp~RDF)YQTU60iTnLNGHcMLbt*?zo5IhGX zT?~s0p}dsK3!%ImTwEL;st4~8V8705fUR3JU+F}afIpl+Tt;&dyEVy7#YAS~DE9R& zr!GO{tN#{9Ocs*!??R+^oJpYR*vI<)vq%YlEVF(r66JG|muTS=dd~Rg_bJZ&0*-3{ z^tz3!snuDe*s@MU)r^)Z@pJ%sRGG-@OCN&rrY5|yHZ`&Hxo$|TbETuHwRyaYv!38n zH!!%!p@~1&)FUX{ki^mJUT0n?hvi#9Qh~G1YQBvNCgw^*Qd?Pqk?s)vt|_k+x<^<e z38fk(c!p$Wl6nf;UOq{-|Meu<UY!t3@+ihdEtG7KR(gnNplVk&$h4j7TrAwjWrO*i W`k?NCO=HV!noX<Ybv8Rr=jK1@f$Dt# diff --git a/brain_observatory/receptive_field_analysis/__pycache__/__init__.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4038af98f265a93efa7c9b800564df22c540c4c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmYL@v1$V`42FGBNGRNcbjaP1EtJwWYseC^8I10%Hs)N}SeFYP19_87d8Mp*glw6r z8%lrpKO~`F=(8-Jm59zq@DrtOWAmp%igz(T39Q<vmtuWUX&nFKaau0)mNBu09oVXY z15nl<1Z^M-bB#2x4iSl4VTilTdgU6;uE$w~wu5h!toO2EySho>$b?2N4$y~`>x3=F k-VJEJ9C~Yjz-M+`8{^3J##Aw1r>{T3?mfPZ-`&OP7YgY@4*&oF diff --git a/brain_observatory/receptive_field_analysis/__pycache__/chisquarerf.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/chisquarerf.cpython-37.pyc deleted file mode 100644 index 816c5b35a46eb95040a75dc60617cd1995e662a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12512 zcmeHNO^n<|cIHq2PtUJL|5}^2waT=2G?KNp*XszjY-yD!(T*0Dyxwr-bU0n?8P0T* zts;A-+hHFP*~ldZ93Yo0a?oIb1@;o;5Fk0_w8%N992g*%AlUe}w*a{$-+M)}e`X}h z0TLuYX3#}eu~_x0_<p|kUcEm*U(@jC|MU->b9XiEpQ)1lnYg)uU--8ugeLTkX6t-4 zx~5&wRa>!JGBjQ5mhDQ~Qtj648tx5yPH1*rn4<8hX3vY4MM;!D)$IjQ5mmG-idV#( zsH0^`Tom(S0e8z{Q7qxviuk5DAy(0HLYx$*(6TB{i!->M6lcXbTu+Jf;sUOx-8r}3 zHrl%QhIj$}&xjYf#T1r!3H7r=zppheeTg+_n_vD1%9cU*_*=oRir-EA!uNGei?k<t ztR3n?KdX(5yk?+ga!toGsul8@iCQr-V*Rl`Dn(|j$Hrr0RF1UWLR=OFQT*H(Ria|7 z#bvZt2OmVG*nF(t(muXDsts;LC827skLIFsT#akkVC^$QmGNA=a8`S)AJ=|ed-Tai z+M~`#M0F)L<3e0)n}_<SKG??`1)gJfG(Qli6}k4K(E|Ebsi!chZ(NG!<Auo?X}%{l z?qM97tJ-KWnu`}Pf90|H&=@U^mgA+ko>GT*+a~DvC(!ZtA8BzN8(rFz*huY5E@-2_ zBsOa3Nx>O-VWXZHelID8J5J9{7Pj4}DZH@N>^k9In5=B|y^d%`(sMd!!gY|CVZWQK zQb%{+^`o%ab7iyV4ctyrl#ajcCbh5|1kq0O{)6|D;wP>Q!lV%RZkUv%tL8b?+VPs< zqrM~E=7AUOcs@_qSV>B1(4>C%{$?|ByS<JRVMM>*RaAsYmF`<^rxPYcx*e*^AgN6d zUY{a)iEERTE*+s=_mfiKH-mONS)8D5TY4hVhlxH&7TiIr(+@rLqTNYKz2?3HDvW0H z=bHQ`Huc~C=;qrGKMY+NK6G{*v9aYGIR5bAd%n{OeBpfiq3iF54}+fThb@#rZ)X@j zyz6Z}486#`+;duc&bEtpJ00{8dsnukgPjSsFyg)w1#);rx-GXCdHZg&?Ya0ej_-7a zp%-2O$!b4kd!si@mM505<@t^rZh*e<A_{G3LFfNMrC2L06lx~b-ZGcC^_sq<pEKmI zq2Dim@@Mq-^LJasF!Z;IA898R&%c-zPbH8ftYd+sS|*SX8zqpqPKo1_VpM{dR3HlF z7(#%01@&rHAJqiJXH|=f_*Kqpqq%KuRL5`r3w`iHR8`{ph5qr<XhD#Ys0jmtG%ZG; z;*1v09U5mKLh<|)2+^Uglc?6?#V7NJ8jGuOXegmVdm&yF<voMevsd^+m#<P^{1(uE z@lZ>jDdnKIvF4c(mLQnRk7>M>(FuqwYTT<9FI?ARlz79~(=hTtR3OmQS_fTa>Ul&3 z6rsSdD@607Kc;@Dm*es-t46+pf;Lva3tj#>sHT2U0Z?F2DfM;%s-UJ+fu!##3n&@} zUu2Q)by>n?8$bO0>fQ84(;h%q6h$=bxs7F6#xq$#k<4%2z1xg}W)DKpcO|K9IY$pl zPDq`TV!IPSWh_!#VJiqaa-MFBz2Lx==+%Q9h-AL+OK0EhG(BIq1H0tN?XKr16<iN? zT<Ip|HdH|5`pJAJXh9h?yRPsYzp-kcm|${}(<UgA#G^^k>GXCSc?$RPG!<v4c#(>; zDD1PWuarU{Ssv>!dpY#BeXs4c96wTO#x8BSVbtu|udu-P-DWG05X6WyLEC9TFelzW z$DPNjLb}`3uj7T0eIb3(70qlYM@nbNPvtj=vh&%4iLRM`l@=}FB@{`e1=Wl8VSYDY z4Wx=o)a4|p=$`BBHODJzxdM;Et0=TZRsu%Ftmvx{{+hmI6!e0=VqVf~#u;<f*w7aY zQVJD)&3M(2-@!Y%p{5T_tiYP!XSjh}=rOo+Y@|mpy==A%F^~!w<-s5_$RIz)Kg{jU zs08C&A}N4OmSK?T-o$+cl0<FQxXASyOJi9WCm{b+o`zoGwko$l-c{S4Ca<Y6N0^ny z8x<d2gA^3wLfe1@n5hIX^B0+$?UG_B#hoTpZ&C;!$*3_m-fz2zKFxu;4CR|xuzUkW zqI<R>2KWu_f@q-!mBX1&A-|2Te~w>x4uxjau-O&8Vyx(O{L|e!%DTb*eo0+4?c$Am zugPZTdrc$oUSm)90CI3|5I~yK4o$4j*xaVK>91k(@{*zwqhcr6e(h?*uq!Etg?72? z3|MB!c1>{3yb@^=Zb;N$;$g@DO_%TBeu^$?XC5H4fSuRov=bWW&^LKJOjp1Vp<Ti3 z%`FFpY<e#FD&G4m{IVISp3gvo5~uMDe}@~ja%ki+9LxaV7!J}if`dkE5C{XXDu6GG zgHOSG3fc`urGZ3EL9+I!JovrHOkv*xwnGKtB52|Y0At}ZgFqN&<$Ga}7ANbpOCYkE z_CT932wVcnaX<Bby8t-01vvHqzuUx#*qxH|3vArItqA7bax4X`td8gJdH%LV*rwlc zqy@Cp3;fUxtthZqV_DEP-o6(NH)=Hte?M@f({-T;LatuU|G1jJ-}HOd+m_$k00<#{ z!%yk`TV5AP1Nten0L82|{{bPraNY8662NL~Snoq`yN++Mk`FB?X=ujCwR#xb^;_;0 z2j~RXe8`}U6=gG90j+Nvc*VCEgKcoXNpSX@g#FGB2w@UsKg#ZYKk(Nr;I$DN72QYa z&B@9Mk9M30G^y=8a6*uH1%oI`dyb5}7H@t^E)Vd58}+3>wa45(3nHI$ExflN`dMqj zQhrEwHMH7+v|OjPW94fh23c1tShpNsWJ?Gm`ZDw(qaD`*Ovmn6ibfuVmrgH(jR4BS z@rXd2>idKiYYQG=yhY$r8Zq4|o+f2L1trL}U?8!Xf`~?G3=|juuyU2JQ9lysM$N8g zJQ9LCC8@PpbA5r@EGo$4$rn&0r8Y5qIIBhKc=k8=g=GD;lghHKD445X(%&>B^+;9g zzrOqB4b*Z}OS+W+&`tcp_fbG^XuE8)&XJo5tp>eeK&Kc_$f?s04LF!^*|-<szO*-b z6=2g!WM`ZWNcesBgYbzguM1>vZ4E6r0{cOyPuRgC&xgdr>4zZ@jkV`W-|ak)WW%#M zp4aa9y?&%-V|L-On_(oVd%x>SuLYTb2NA$=$QkN>1TJzU{Bw8TbC@=84t??&+BU3@ zJg~|ZxUARfc&;GLME&xi`n}MB(}pL!<aH|ytiJC>O2O=VVc+Rsnr-R2;f8g~Z9DxA z2o9~Q8{c_@M~Q+6&Su&LWP5&e9Le4%E*@FaBND?CIo^01ET<DdsS*X`iekstWN^^1 z$oW;;h!i25HeO5UMm#{+ayqW1z#Yp@zjs9h2R<(jN;+l#rzr+}pQdtxG3>FLSFuL6 zO}ub+(^;SzMFp`Juy$AW0`h^IAKXp~ZLbsAi`hqk57@!;WJ$Qw9UEoa1POLE|NQp+ z)V3yb*k1)&{m5P-awkR*_SxB%d^L7`a&5D6xB%(-M-n5l+}i2_fKHv<NovonI(Z7@ zX|TNg3OC1Cb+Wc(Wyz|;jtl(^fIzITYQj7Z`4sx;aZNuoQ+sdD^h157AH1kz#)FT_ zqoSk{Xr9x!qaVgD@jJ6)t9O7Jj(w*bneZQ3M_`0XTp=_79fCV(hr%cS@?k0`xpGJ) zh%aAZ*4v0bJjI~T%KyY?9&3PfD$APWa;0{j#?X`8aXdq33rYoFakPoAtJr!1a4X)1 zqsPG_BlPTw8vdGSRFjhA<;m~i)uc3N_7Gx9N<+TdsJDVZ+NjetSr|<5ZL%<&s@wHR zx@Vb{RQ<o<7gE%bqawx{T%FhT*9|bPA?bOG=%znn=$vT@5;M~Rh%#fEU`zunWO51C zO_>7i6O5!{lo>NmzhgY*9b#Cp8seD%s|b!Lc2q5hA#w}3P88WBph`jmCd(kGf~s*9 zOjmUN1a|sXro^DaQ?v9u21k9A<G=hYAeBYZv-;YR3D=T630(>FZ2G-G}x!ax$ zBWtY%8`<@hmS$E`4DeqZ^oZi;A-{%fkcpr_e(z~Ak{Z6|aBw`C<E=j`BgAGbD4VI< zCT~;ATPPYe`I~fqhl<~#f<#09HWf$^AZkB=wVYsddvQ3^P|ZoRYx(VLz(C%@V5h($ zA!%#vG|9n=zJd_IlEKe%z(iOocSyfLg=K+MHo0E2VL%GVndG8AhFrj@C+I}3qVX8K zOfKV-BEog-s2w86_oNh+;jSUH6_+>^P!T5F{u07|<Z>ZU2HvI^K7xW#b+?9qSuHMd zSZ^+#i>vJBmz|T?(OcvhA(#X_&}OeHOdS(J?n@iNB|n0@(-{(qNx?0HUh;DQ%qTKs zA>iw8^LKYF#G9^J5rRPk9JuY-ntB`s;-QWO0!Li1ukZ@)01|Aw5)`s02Iqhrggcuz z?|yjy&b>`*?WM*TjX}_ISBJyw3~p!z<Y=nUlmbEjy{=3~bm~R&){#7suafxzfX2`b zA%kS{QO4f{ssJHuIGGk)H+F^iD^2*46QTX5$lk1@`<%O+5=?aFM5lBT)MRftb(yk_ z29{O4^c5J9!!Y3#x#KzR`R-+r(d@w6!)%C5Z3Dh4*L=geP0`iNFDC+fmuI(^ID?ex z&aemI>mpBpD!aeRC1+o72R^WauaG7dpn;KCVBaKl`|^e7?97s(wjUxfwS>I$5x)L< zUhf(Qk0)4}R;V%@f>_2A<VY~rW{e{c84*C#@Uq-N5Aj*tPj*lQk5RUYfScoJ__1N| zMt$tcCMMLZ3UXiI1XwyvmI>Q}m7*|(T!vDV-=bn2g<S&oQr4_Uu5)M?NRQZNOSCcg z%hZcq-Sc#pN2`%=RbCQOQq4BpB@uM(<!oWiY$|(MrH2rn95-eAlQ$(MrnJi_nxI3z zLNm<-;s^wNm$W~-(C6Von=2;3JHo?tx;G^C$ZY_5@wpB72`bOD0cmhpg@K{*fp#*D zKLVVes>At?4dgjXWF>G#stEQ238E*3s0hn|G|{e^WpdNDD&<3AA!>lxH2{2A6#6H7 z!r`{>ns7Iq4n=klA;~t8JmM{=Qpi>sB|$1v#Z{gM6XoK->A>fdg6Gsb|F7Nuk8AgF zu+@6|IGwnr)c99N0gtHpd^A=y2VUrA3UJKFIfn!Iq^wQ)lWu`_kSB-b+Ui3==7T}k zGe$`xgUYgfEsZ%9^J4`_I%2E^kxzM=uH(p`Jx>HckEyxys-oYns{ls&a8=dRGg5P8 z%ItI5y0aDzaqug%>TVOXd8F<rN2r}v5krEyl#W@_S8<ipCs%j`dh??xl+4K#-a~VQ z_yb_AwhJc>st0+nb^-YW10c0D=mGAkJcB@<;dd!+$l0$CMwP)`978d<b^}@B>WK1O zP<sM7vd;|4KD3dwj%%EQMx+6UP>{s}#GVsHm0f_^!+{iJ815pw@D6@gkzt_tW6Ak3 zsXPSsBiU~uz?P#$P5`K=@-*a~`SQ#e&xW^?M>L*O{XNL?3rF-I0^WCXoR<QbTpf>r z5rw<?gKk(4fNVkv0}>L;UB?_XfuDyIsYE7)@G^jpiel555yeFlqsnarN8y>SK@JXf zJVe`DNLB&Jk#mrbJ@IPT@mdJZAEe>XKH`THU<I<p)B8b0B!pc$(jk>NO$@@p&0GX& zJ!6ZMlDO7!+tKCSJ`g*A8Rh^i=0iE-Ps$%tjjax_G{=DXZ9r@!d@gsqJ@=R>DovR> z$8N{v9bk-zU7P+Ew8t61MTWq~&a6*tjB0AP6%~Z+)5xw0`~LXa8*i*zS3mv=M9fQu zF^!&+nU3(#y7fPj6QcDg@TkiMG=a(~KWLQ4NKqv{F5{s}D_327Syuvma1sQ#k6@NO ziNao*{c4HcoWOzAd|SrJ5ZgfXixVP6PKeBEH;PtKv?pA`jdpfPKZTIi0-X6Z{emIs zDP!F{x<$m~%IzQUVy4^}v8lLK7LrvVRK&XW5XpjHp9M%uILtyVrEv?TsOhjFwZx@e zQxrw%^9;ukuEVh&O3mY(9HnS0IL>n$XYN>C;yBM+qbgdiqJ>o^T3%)qiD0TIi!xLs z4!4ks6vaKfui8XWsYr}og_4|0Te&~=&8UdWNaN6Po*EsdnL7S6k7GoIxK1bW+QxM) zUWhpqe3}jpEykD&M|Lj7Mbz*FF$x^?0R?oB=ej7OHlO!jj+f&C_y1vBz)3wkLI0I_ zCGFoq{}s?cbm(#YkPc9sz|1T0GFG<~FRF-Md}6u<G@U?5na(Eix>U)A;7?%${*X@~ z8i)ddRzyoEYN!Iw73UW)3t8eB@xR<Gu<;N3Qo;!r6daiFvsu$}2Pg+8^}^Nxqj4OL z`=&t?r8rri5!z@4oUJA;idZA`DCvHc^dgnorQ~<&$p5c5HcX&&gx4pJ9bVv+)~16E z3O;4_z_GT10W3*?2k=#4DQHKoS+82@Am6fH!!W5&pDXXN)_q#ui!?S{$IR-DUm<TF zTdfSoRBjFGm+3{Gd&)Lo9ZxX|&zb_s@?++>iW#1rLm&>Cj(6mncqCYGjA}ocE(c_w z?NA}(Yh!DkLx2#O#;^sbt1{xuY*t$a-PFb_Hbjt*&H=Q7E^?=?P=j`Gh;2OLHH(g5 zBK|}H6c+$GKQ@tK4<#Lx<mDdS(CzF~g7f>lX8QK(6y|uy6o=9KI4oyzxMN*O2XO`m z_ec&soX-%j-B+!kAJMI1mT}Z#n^gSNfjtg!q?!25#{7g;x{i(<zZk>vne=>8QehN% z6<yV7JZB)uj5Jo+X4xgh!FHWawPh&5o}c2a3G-DWl&BVOSMiEsoutUzFk#Ua)q^G= zQ*#@T#jZ%_fIVwIX~k!*?BW0|IEICb=i9}hs^NlKtwje_)EhIg4Ki(iP3Dl+ubt!A zhK|@aq8cdizouWpk+-^0N5ZmzvshG4+!vPgi-u(&20|lYXV=u_*C#H9yn&j0kDAWe zbTYX&<ekTf!j{(?Za~<wT&_JgQIWraSL~Cj6TUk!(T2+G;)qt-fK!m1>kZ{i>OH4= zb2v%fqn7%;&F0+?zkg@*z0I57v*+*KzCEt;X<k0R$0yAA6c-=7;!_cvoaJPfqznLu zdD!()IDu9?0WWxGFQF}|T<->=-*Ml$h+0SmMT&5y&BQT6v+`E$&B|)6P%Bhksa>eN OSb3##wesrH#s37JGcZ{I diff --git a/brain_observatory/receptive_field_analysis/__pycache__/eventdetection.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/eventdetection.cpython-37.pyc deleted file mode 100644 index cd02af35a0512b84991c51ca37f91910614635fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2766 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 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/fit_parameters.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/fit_parameters.cpython-37.pyc deleted file mode 100644 index 7d1707ed7bb577024fb2b21a72c67248f25b76b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmZWp&yO256t+Dx$!xOOU3DYT6+gO2AQ2(D6>z8!g3=bazzV5AVH9a_#!fQbiD$5# z-OXxN0<|X&J@E%*#i>{R3eFto$|*;#hy(9AlWe<qG=9&|&-U~8KEJ!2PK!WOzx~XA z-y-BM9IP4x<qrJj2j~P5G$RudkqM3Hghh-J!GxE2k?&*>HJoflO((-BbaErw5WWbW zkf<dZq6xAsLa_mIQ?x`IWJh=pNN;mN;h3IRb%v=O@u@K>SMT1hc0RB5&r<uT*14`) zm$M64LJkv*6dTGW{P*BDe?V74)O%!3N-EeMxu6s+UTyK$mY}vY)|O^%3D=g5+R|EE z+O=h~won1yf*ghB37iLhsOw+h#1482cfPu{8e95^iLEZNbnbz_J83;~r*z#4K>(fY z!>Tcs>1b?q0QZW*L@FzFJkyBUdU(1(2%_dmD(pC(ExhMOrwiY?>fCah=4yc(RX*2} zk3fUQ?)3bs!HYsFQ886itVk=54@{3$yO5Q*;F?b)oNHo{Cbpu*Gor7-%71>j_d)*~ z0~38d=HljnpKvwnf1-GjE5YCEOLc7eIc#ha=<{McGyN~pLEofSzEkkzh>s+!%`)&1 zM+XDVQx)d}*zuU#T+a@)Ok`oxV;K)qnTePyp3O{Z4qlAwW-+T?=R(9b2gm<K9Gg^) zGWj-yY%p%ZuF=cyI^AKq3)VHE5U~(`N2s4bnccQPp~v)`Sz6MPJ%(psS;?Lf>&^X= zJPI!8Q*w?8MdCF|4@vissJlL~&7+n+qXa)2&Nl?ZIowB(5fxsS;BKpxuwSbL0-(?L zM6vIHKtKflu<`}B{OrxE?_&S0T<x3bz~R%|PxutrvS>iiy|zYLxT|TrlI}oPHB$vy zl%@*Im={uS;tVpT3QxFJfRw3x)S}jz)VYbX^hg3jm>%jKaEpQhF|M{S9@MN9ajqO8 zmfbFHc4H)Myn3=ODa$0p$(So8v)kZQCxg+DwrCepvITO7>Q`ZIoeaDRa@Hl|TTn{U zXXgyT2I-#%C3COuR_WE!uVvs~;`<1oC39N(CA$ulVV9Ia=`FRF0O|)zh}ogWBGO|^ zn0)i2w!KEQQ9rpH@K~wCVbremQ@HwiFvG#-<qY_(MldxTUd3o9$tT6sN_bYra+S#Y z5P)%|nT0fD`_yOp2H4hMU>Xq+2gcW+xQoH1j$Apu@PMIsRp8;;;#stLB?DHnxqksX zhB3f~`o&TQ7Ng!JFE80P`uEx2e||am>SI@ET=D5OmcRrjW2t2o46~fuDx6F+n-<xu z^2~IiUxSc(zJ3KnwEY4>0E<Sh;z6pSCP0D8RXDa+aOB5QXS_IsT@2pVy;r8+0Ij#R zBsCJ&kva<0bW+S*Y*C}&P<ISeFj2LW9O_DfHP1kBGo$x#4L)>7FbAyL^SL;%I%vn= a@WV+irkVT*Pjy7?0!{0Wg`IFSZ2bq*jLqx- diff --git a/brain_observatory/receptive_field_analysis/__pycache__/fitgaussian2D.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/fitgaussian2D.cpython-37.pyc deleted file mode 100644 index fe492ee0d8d7cba7b7e53b14821d2f2aae5815fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4093 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 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/postprocessing.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/postprocessing.cpython-37.pyc deleted file mode 100644 index be7f2819e72ecc7eb36f80b7dbe3b994f613ec9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2934 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 diff --git a/brain_observatory/receptive_field_analysis/__pycache__/receptive_field.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/receptive_field.cpython-37.pyc deleted file mode 100644 index c90ccce81f4771d6f03f6de7e090206f7a6e01dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4920 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 CU<f|| diff --git a/brain_observatory/receptive_field_analysis/__pycache__/tools.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/tools.cpython-37.pyc deleted file mode 100644 index eed651db4d45894c56ea3aab2114f2dffd226c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344 zcma)5&2JMs5FdLtAukXpyz)^F6$dCpf)u?Efl#RUI-*_>REid@+_jr7+3qH`o0mK} z2WS!H214Qt;sj^@n!R%3U*N=yQ>yj=!mF9}&dhIS=jZXAMxze6@()kNwZi~k=;Ox< zaB~aA%%hSZ**0`Q9+H6!w^@hDimalAOa1_wwS-|1EqW7@#GFO-0@j#hl5f{`Kn8R0 z4&K8(*kXtZmk+=y82u-~&Y?=d!Q(S8r*JA>+hGLTfj4{*BAD-CIfjQQ9y^PhE@6*M zn8WBfc<tjqf~H?<@{+f%mSJkuMw696PmR6(+ta%@qK8Il6Nz;pTdU$fk&mO>xk!p! zioYY34^33`Rc;d0MSp#4qWkG;WH8f}zDRnas}P%I7$JL$t6HRaT&!Zop|FJ>FKU&j zzD<WJUQ1ObW08w&Y*Mpmiy||v{`gzHou$Sm#YTVW0{*I@zN+y5O|r(tS}fDVn%EY8 zLk4n~Ry!*ak(s4dn*ux>Z9g(iyJnh_VZ)6B$(l?PahjON@_YFG<^MW>_^t9^F&z~P zkzIo|4p9xy{_dXYmGi$&d>&&w1;8|pCM+k^0<G$<B=|O;Q8}h(9K#WX=X?%w-h~OX zI0Ke#as6rZ%E3EML-*K4e8MLI`U3BZM(Z|kfn$z$*=g9~7*n5wE_{S@Jh;CCgG)X( z#5`|DZ5N>b{G>9PM^xn}sAq`E2uXeybopuU*)FX>UUhyi0q2)3H!Ed5HEC|F$P-nD zM1NVK$u#9r`iQ$KSDMDB42i5}wNp)V9~Shr@@H38h9cWkC6gr^dXlG#DAvbNT_l#y zpaMS2>g)u{DRu-ky=V9=_fdP7iS8}U#9b8AL6z>3`GjrZJ?@42oaGMa3n}Mq82#gj z+RGE}xD0w+-*MpZ7@l}q+b~$L;nYG1hls(#3Lcri|N0NCP*#Ms+8_bK3M3`KJETvd zLpMmBppb@ELdNU=#$8=(_M1V;x}C#X*-f4M>oA>Tnz4QDQ`gr~%nT}EAv=msoz<po klb22*@Z;rK&}7?3qR;1twbtG!<YuOp{8$n}wV;0dJJp#vb^rhX diff --git a/brain_observatory/receptive_field_analysis/__pycache__/utilities.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/utilities.cpython-37.pyc deleted file mode 100644 index a375e3af7a05eecd0d1a0ee6a8259d6422e6fbd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7274 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 L%D2i}#b5d#Pn%?z diff --git a/brain_observatory/receptive_field_analysis/__pycache__/visualization.cpython-37.pyc b/brain_observatory/receptive_field_analysis/__pycache__/visualization.cpython-37.pyc deleted file mode 100644 index 106b36177bbb0522179c4ac804b7c4f61cd63243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6954 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 diff --git a/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc b/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 39c204575deb1c47b5c41911a1eadc8851d78e57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2092 zcma)7&u<(x6duoy-DI<A+E8eVK=O^Q)J_hSI8=ZrMM6kbRgrKR77d>9+l(8JXKH&B zwwfGJ%8@e%I8broUz#hY{tKLV_HH(z1qn;@=GpW7-uwJMzxix?dlcYMzyH8~*$9F^ z-Q;`>Q27)eQ=s4hCo-r>Mu^ix8P-u2c|DSGmf%_>2iXwcvD~OPvrYWA%?Et=f@C9p z1qej2#W!c+tpLU_e7em?zs7uvk6$F&6&~#elbu%>Czy~ve!^^p@8n?KN_dRg@N;IF z0sD%hMHxCf94^5apNIGui^2xKkuG>iPMsEdEkrHqLR^cws3X^d(->FcF6`o?_$A@w zR&bi&O45Z+e@WcBe!|Hi!Sz9xoT1H8sK4ui{h&kWUE=I`cq8}`p<vq4V@)vjD<>wy zK2&X=Fs<1li@BK1vOx`8Fx4j~6=>)qR+v7LpeBPpv7!dkZ`w+OsT#?%O`$C4V<t^D z#(nwuG}}Gb@(bgwL)M}N7bTcK0(}J&`0M$@`_r!tXftIM<7vT8m|9F9C{{L#vwKre z$7b5JpiGIfX{&{qJ`%;$2n%;xRvxiKz`YU^H2i3<&`hYjDbV9FvyEQtnT0CzxfN1a z0cJ191cc4=v|aQ!trm681-e#N9L}4$$vr~HF>@V7Kt^N~j>ty18|{)oI3{tZuj2Ya zI*I#h28<Dn%6*KPkkDWEsuT)x$qJD95iCr9)dylTJgVHZ;t2YI20PcPj9d^L$?Eac z_z)*Hut<$Fa^{Kf6pP&v9`fj?=oHDIZ`-Jg&xk@=AVFfJ1Cj%a8?&F$<riQneBT1X z17(?{GtFwC9vkXSO_{o6Kvy`ZOP)F$>1af8JYjAhW^MfR?t1v?8|dkM++i#Kak<@A z)HXhtE8M@uadvJTRB#cVx`JRK4b{R3b+|Xf0^^$k$7-(-P|lv=7Gt5NCzU8K;(CfP zi<U@XMN81m8HHm!3`3i;oNId9G}KnGpd}tf0aSy;9URkLrw^>GXoE(2k}d%|D!o=) z#O!bVH^%BaG)>cQ*ZUtK3#exSbu4fvafpRkRiV)--3OqhWX4ctks`(1<=o8H9?of< zzCr8M^NcUMOuFhebk=Cfs1(M!!@A_CZIGyi1fR$f%<GgyAVt$i`Y}Dwb6BVF<;>6T z&=Vmg9u|uKx;3;>?np0_ZSAH2%*~y$W4%ib4Qq7j>b7*vk!Phvt}Lj(B8FngoI3|{ z?T0CjPU_|us7nPTIEEu75V<pU*jHZ51}X3Fod4pTu6X^GPvak?_7Pg1?&GC_<rhcG z2a5XMh=;i<oTrq(PZv>PftO2TGjhmEyfT{66KtN8mCxov1799_HdxZR9~yA&%}hv^ z%&{Gr$w0dwLmwfFvQ1=3?wRgeO&_+rA1w2lB>EcK>0Kw@LXnLx6CvC3i7lI$@2^X- z<9xs8+&b$@H%dImW_`){eY7zC*ZS@_jLA5;8tPlPHX+)zrU^Ni?DWGHZ?_bMc0aU! zU>7ao)vkqQiJI5#LJyrjXt7Gn=o@bG!T;p2$M5m#cbxawkx}17)#q^ujQee9k7(ng Zy5VyPpSWL{8KW4JakzoqdK``3{u?wgX5|0? diff --git a/brain_observatory/visualization/__pycache__/__init__.cpython-37.pyc b/brain_observatory/visualization/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 796d7b5e2e5ada5a61a1abc04a5453e9eff84b27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1180 zcmZ`3O>fgM)K1bg?KT*&1LI_IT98<!aT^E$yTXL{xI~pICw5y?$BAsWTdM4Ufa87v zLINQn@t1n#w7;+u&uQ5h5-;-0`~GzDY-6K~0Mz&Q^j?6_FUS0W5Qrym%pE`sF)UGz z6AvTSW-S(e#EH-FYZOOkpht&i81VU)o+>5Oh?tUdMs~8iXX5k7iky=j6K9dL1#oHG za1P*@AAo8IHi`76MK$_>l~?;Ge%)?lkC|7a+S^9V{~WLYXrHxiqZJ>1X`Qq!e&<11 z(JAhGC(%jA;;+8*sr@?m<Zq)IU((;8g}U=Ds9UVVx~EI7Rfm6ZA!J@#>L5~^t$)Md z6G5{Z^da;~UeF0Alo*khl9N&vmJ~w}T<zX!n(=Oz0KBA{=G<~^8utDLG^`tsu{19Y z*(Yk6m({LfRBKu_Y8T**Ga=NHqp`@w|0FWtDnWh3H78jiCC@Bpjqi-gDQNx|_SKbj zt&DfliZDK;Q)%~!6pB+#vYhk?WDs^t6dzG5W}K|-g<>KD39LP(+2n|7W=LMlc+QoL zFIs4b!}+bNLmKKLC-Y!$cW*ckh%Jcr;5y7BVt7_4W@7KmT^ij26yu~l6eA<%{A_c{ zN5ewdMz95fq-DiuY~yI*ORg4vDQyy&Y3ep)lEA%^uHkl2Nt$xGq>meV(Q$GstmH{R zkA;c5N%wLwi*VU&vIdLNb^tx|WAL{{xuh3?vAj&eRpf9L6$)|@eJDHe=<!dauR)#X z)xm!Mt%2*%r(?=?Q+h;I)qkp}>zO|2b2T&lqU6eCfQxcmnf`N;_KmRoehEXSBM!c> zX=T`?muf21phzL&jM_q1y_qmmD#aYuQmEblY7}-b*e$EYO*e(XY6*kpJN2O?a~lx4 zxrHNq*W1JaUdNmMHSC_Qr<-Yq+I{1P&4RS^(eTeehjEbH$f<Q<rAQ$~Gv;vl)*WZ( d+?&S#Lf1jIh#utyn@axJMK*5H>jA><`3)(dOQ`?= diff --git a/config/__pycache__/__init__.cpython-37.pyc b/config/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 2d1e9b7d491f6e8c2fae0e0e7f55948c220b299b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmZ8f&5qMB5VqZRHybEIJb@1!DB30~5E80ZE7<ZYtqM}Lmnc%|#wN)&wWHYGRi$!3 z;z7FN#4F{>2_AtH<1`J3k!Cy|kH7IZp7Va+MIiFq7xwE2p&xd$mku~DK=orV9C4hZ zV7KA`3$!HyUv+MA(B)lDc;_n)dK^#Dp!XB<(Im!p0U@9kYYeKNgE44}Iljf8@dk0S za7wztTVjw!!$`Vzw?WniuWNeN;{=d9%mdI^$xm6bDg|YEE~MrQnyVzqWI~OiYGsO* zv7Si<g<P$2;khnt<RdHDQW#O{HZ*Ld4dvom<a9(cY1)_t*caNJpA4U!&__+odp~*e z;dr0ny?T9q`SzF!6MF;txBNsI@n7Y(z*LA4on16s#!4;bp!75~rqCnb=PK4-u{Noa zo+=aniJz()qx|Lp!??NOrDmC*&7vAOaQ0oA3=XQpCbv3Dgt3)GSveY9%eU&)kFH$C z`8y_g4u|)nriD?uiwsEBtJw!GbUw0pqWq3Zm>%?dHXenS8hRVDlyPs)ZkSw$FC_yI z&Yp%sUh7a5@M$qvRitYjUS#u7XGRPQ7B5&L;BND+{_dy!D9U7Jq6oNG4}@g%T(qx( z`U5*x^%(bE;^2G4CFLE64KOe+?etY0z1CHKYD&SDdu9jPa2S^I5EAPAn!-QELRQY{ TQt?$T&K|-}AAoVNL++A4LXzSh diff --git a/config/__pycache__/manifest.cpython-37.pyc b/config/__pycache__/manifest.cpython-37.pyc deleted file mode 100644 index 6493b2d7992d1ded447bf30aa1310e1f51ebea4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9070 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 Z%)NKi{~Ub%b#x}7MCV=QU&EZ6{eM=&&n5r> diff --git a/config/__pycache__/manifest_builder.cpython-37.pyc b/config/__pycache__/manifest_builder.cpython-37.pyc deleted file mode 100644 index c3b08a057a9d25bbd5d3b4a849c0460475bb6999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2812 zcmZ`*TW=Fb6rS0e*N)?GD+CCjR!FS{gi7=#6t$GAT2WU83UuXawehTzb?mj7Srcrn zA1df$)jz;PqCWL6&1;|f7y8ui%-T*cu-2TN9iN#w=R4myGdGu)D-2Ki*Kg5ig|UC= zWA-@c+(1*`LkK2#m-V>CIO|z~&5IEyaPW`Sb$edmO~*=sZ?wxn`5qIta9%Ot#FdwJ zuq60HR(Jo!daP0B+W#R+lXk4K7LCjv7o8huDuswyzy%8|!G%R@33tm4Y~hL0D~7#& zQO4U9=R{R3zv6)>YGMT=C2?LH6~{2*i{s)1M#|y?aT4!}I3-r`UJ|Fp8N93FtXRW) zSuDY}3wmW{)6HSh6|vOzPCU|;K_ufe3#sp@LEO?#HX6j*YxiX@%32(z(nD_>?G~C^ zgUHw(&#Zl(v(VmRkWNC<6%4!aM%~k;ZhvblNw;))E6(ntk3Ib`Oru^LhS~}7w=NH& zY&%TSc3=A{Ze>Y7Rlv_taku?9lSi=8f7`dNH-A>KRLy8R66>4MZj_Fi-=<NkpNi;O zGftnYW`7W;ss-5}Y>!m)ezMtANfuujM6I1@E5_Vz7aC&cDrU8lt*gChgu=}Nj`hKa ztV_})3&VBt(t}{U$~`__UBGUArr5Gb2@ky~z6PIFbaK`)2zBh73;r5N5sQG0)u>yt z1P$#zkGjLS?#N~O@}dEJ5Rz8XrN?(3JpArQQU!aNJWhhpD8y0HSyFKpJ_jxU?HUG@ zv4xM%E*g7CPun7qjh1l@Q^*X;24nRGIyukn9GrY@PrMwl+$qbo+|4~<ZLk~}f$z(? zgKrz(#>3p3d*(Fiwxs2Zdy+PhJ_!N_o{*dJ1ocaWS4NlAv`?fXW*A*FOS|Bu94&h7 zM?!?enlCU<5hTpDxW#?TpSHK7HJj2R2Gc`tYR2yxI=MyO<b0!u5%|j`jl&_rUpr)* z_Q9PDR;fj!mS~45fA2y6y`eaycXw_LAy7s$*0j+Pd_qyMc6@n6*yyu8w$CO`#wk88 ztv|0%+)*ue_pIC@^q;WwqQf$Kry?J7q$+3hU*;fU&P&6*Us!5Ag`QwPu?OsF;icQq z*6!w`vAw%_Y3vTO_LZ;du0FaekvL&T_0v#gk`maV?9#6JLzf>RRClE8OYLrsvRKu< zDMl0(UG9UDg{IT%i#S+1yb^COLbq~gyLQrzsV1vq5R5wrDVkM9cx(8LFDx>9VeY(I zQEcbDzKjonI@MtbpYRuJ=<z*kpWSA^)+ScY_kcB_`0V5pFu-J}_Gjf`nw^FW+A|5O zv^N}xD2r$0DD6thU8ze`3M~3qK>-Yly7LsqC`t;(EBpwrS>rQ{P8}%E{h{hh*=-m? z2U|wj$6u1Q;HqVchRHAR))b6|T2ZA%XFi2kV8+n3ckMn?obOM26Q*W=3eJ>~JOh$B z-=ErHODde&>I{Qw5t@QP(<-LD0)qv3<ONLHL{k(p#(h5iaM7wmfi9Mun?}&gLrtb- z00!V#ncZ;&|HCRuF4v`2zdP*VcyYBg5JCBNltp(Xl^j!-$UR*VZN#Zidk>J23K9FL zO*1K14~%{b%EPMjgMwmD%|O{e#~hpN#mxfBj*Tk@`yI*Kaog5uw$DM+i%oB0P3(y? zaVOrS1n)eQX_RG@;u3sxLEeujxeH%yNe7Vjilf~WQ&e1Y$k-}*q07i`%JH7kcDLV> z<huNf#2JXXZy1D|Nn7(!^Bv6xnk&sS`7!A%Fss&<{oVm29jHuCPS3i`$LAL#`KCHj z=oDr&P;c+nYjO#FT?s=Jj$xN>3Dq!sHjKK(ouROiVk}RRAZz705}%MD?#Zhph*0u# z65o(Gu-NqI@H9SOLPyaeKJw6aeTPbCrRLjcCExZP-!XdiYOprDKCHL;GF~?&ZI~t9 zBuiqY9U2U3Z;r}OX&<WV!Rn#ebop4HC78+E0D;0qMoBuv<(ClJ>u+{&8!9664)e9Y UQ9$(dMW`#P2*;2&RW#rJA9x6u{{R30 diff --git a/config/app/__pycache__/__init__.cpython-37.pyc b/config/app/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index aef4c2ed1c875b4e62d10961c25e0e4229d4cdd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmXv}yJ`b55Y)M`5%?ce#t`2X=}ZWDv>{DM69i%{>FySvC2=dqTsnVCs{E4Md_qW* zDjPo*X4r+9-P!x;R0^)}v4fwn5MTepxe9J>88l&X;#IifS<FW7I|*Iq1G!acW2mty zAti;RKqas%XuQfTWCcV>nG^<j)NOhUjbd?!7Ba@5DAsuky}x9!iYZ0%PUR?FTmyzV zC2z4ttIqy|tCUZ(Vm~&<MQhBb=trFIK)>!`p<l@Nq@e{@E@2B{(02iNfrBgU!yD<C xIJ{+!sU1i^;!+c4KR<<M@9Dkjc(&ril`$AF8&jrXKe=8<x9R-N1t0!qh(BD#Y4rdA diff --git a/config/app/__pycache__/application_config.cpython-37.pyc b/config/app/__pycache__/application_config.cpython-37.pyc deleted file mode 100644 index 4f01785fdcc136a25e0f321b288d36cd8c2752c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8870 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 diff --git a/config/model/__pycache__/__init__.cpython-37.pyc b/config/model/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4dbbb392f852ff5bba23c57c9fa178c47e9f7d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUun)(F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>AE+xWGhIJ7KP5FsKR!M)FS8^*Uaz3?7KaT`tTZRp4rKpl HAZ7pnf?_pb diff --git a/config/model/__pycache__/description.cpython-37.pyc b/config/model/__pycache__/description.cpython-37.pyc deleted file mode 100644 index e587b2199fc8f62d39ce1bd33ece9036cedbc6e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3205 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 CcSJ(~ diff --git a/config/model/__pycache__/description_parser.cpython-37.pyc b/config/model/__pycache__/description_parser.cpython-37.pyc deleted file mode 100644 index 9f21f0f2b441fec53b4bdc3c88c4bc1790f4da6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2457 zcmb_eL2u(k6!wfA$4%2kyX+RJV#OdKM8vKuKyX+g)ZH#1K^0Z35Rw(intCRQTgNst zPP?_-1GEQD{DxMXIPrgc<;0CMC*B(;X|}0ANQ^Y&$;^9i-hA(SZ}Mzoqhmo!fBAv` z_L^n=jz8wjfyoYZ{T>X$5+tz#{L+L>Xh4ber6p|PTv)=9_PHH6g1oSLtv^88>i0;! z{#@!v#d#5DX@raOX2WC$x_$<Ov;rcmfJ*z)k=7LnT7n3AVFj+}3P-dqNYEA=!WC_p zdBPKGu(u{UVjaF6VZ)Jk>bpxv?Q^B2iU`=ohF|Qv&^2C3SfE1szrs*ES|&q<t7iBs z-+eOp7PR$%kGb#<_z6!>2TxNTWvSpF4P<((2U#vt9l@C8<5NA@iw_1mF685!M@M`l zK{rW2LL6;_)-WDzPck8sZE=l8m>VDc{IvGMFiztl4BtopC=3=Uw^pv>&&B!?dW)?E z9p_&|*B`=AQ9+J8b*He-tutC#m!u+Bq_RSoAJRj+A{DLdp<OvY69Uoz1LY3^8-o}V zyx=UAQb@sunPQyjcrr~mhR^SG*sOstpU46*S}Z+Yw8hfWW!V!Z;;2|`p`Bd=%v2fU zY^bscLrCIu#BwE%<7}$gFixcQ7iwBY=m}WUg#y7xEHljF$wCAze>dg@YjB^NpKBHw zQ<4i77c5TUM?7T3SekQ~$fRazRxq8*C?1|(pWE*_3d2(0Z-N#AHlci3K!m}a+C`I6 z)ee4pErn63*U)zeaxt#gmyoF2GgoT&=!C10zGj|sK~G^W`p~sW%8o}|+9mgCxw*;* zJTAh+u;CYdG#u~3q=0NaCqF_WL6Gh8gMW{369kC40oN~CAHawwc_Jq=Eu?tFrdlE= zrUxuaxYn5AYoEW2q=~}p=D|9$C~S-<^h9mIP`hJ;(vADp>v)Tq^bW{1{HNu^+wVJ* zjBF6ahU~{~uDt~l;Jk&LKeH<v*<aBsC{v~^(ekGk{8*ZZze11yOl^#93MsH);w${? z<4(53EFjv6g7UD;D5^a0wr-gX;FlqdH#cl>t6j6HZa}8)f#P%Mrj%J;hn8=wf@M@A zQ%pb<ts`UxrahQoflaIlIWyo0JE0T%%m$#GGp8b#P;{?|@+%5u#7VcziVG_{m2FnM zq9xkMuF3&+dF7wG<1Cw#!*Byo#w_G%lW-=>GBx4F{|ojPP^HlJA{&>?e<O>jN>^&s zB33J)Eq1VqJk4{J<tpZdM8=y-T?bI%djj--@RiQe6+^JGxqliBM=Lx1vgIFwO6fx7 z2Z8dfD4Qn2)E$8(brPqudIUuV;Oe=-$MeU;Z&>S_$HZ^;wJ{fpm6t_501tyt{#n=f zaGUZbDA%4$g+7Ukv4Z~v@T?n>s@Gv|j4LDLHZ}1kNs-<A&^5Bvy3-|H>d+4H2z2Vv z^4%3^{M(9akM{dLyAQ)UzLS`AVOV#<5HOfRfeq_!7=AzH$!w>cWTO#04fWbc7JD#< zx@^OmYJ(T1xT?E2L$6E*F8Pghq$$FfD)^5_WBCG?sb_cYbsVp&a0h^R6F$M)w`02$ gissdDvx7r;xs2{@$JO4a&22t=2hT(|JkquQ2Bb@iS^xk5 diff --git a/config/model/formats/__pycache__/__init__.cpython-37.pyc b/config/model/formats/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 5498742df72ea28a3dbe3e8c61a6aee0346f95a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUwO_}F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>AE+xWGhIJ7KP5FsKP|r~H?gExKR!M)FS8^*Uaz3?7KaT` Pt~4jr4&;u{K+FIDR;@Ub diff --git a/config/model/formats/__pycache__/hdf5_util.cpython-37.pyc b/config/model/formats/__pycache__/hdf5_util.cpython-37.pyc deleted file mode 100644 index c10a96dac0861c310eb8725646cb91e7428e3240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1390 zcma)6UyB<z5SLck^`7rflX4A7`(jG}IkYxSI0#1xNiIzT4F}B;a$O9IZYA66TWhzH z+=~w<(B@uCzrr1T>Q~ZhpZXR0)R|rETp*MRG#brlB+c(P(u2*-Hi4%9_(hzr6Y>{M zmW_jQ54ybrLJ~;}k~AYt0+<H{oAQLy#ug^wcSJJD&xqtIdd-rSqz9xM{teM&ze{~P zvnHJiXYv;r+LkQ<<sNkV2?#|JDhcdQWpG9k*6f&Y8OjLep=`mPv5z0i;m$Lc7a4^h zY&bILd(iC_5RRNv7hKQ<Ntq-NMfbbhw~BH!%Js;vjg)%=x-vdaQ!S<{O+5oI+>~2Y z4F4o%4Yv8G+}j;Iv&z_k7z^1u5+_2>2luteN-f3hfzm(QL0KtnGmvF9p4-8b{Agfv zr@pF0b}U8;Vv7P+$m2dl4f9cdT1r*)hou2PY<~>dq%%mTSIzM{xz1gheu=3dI)t8H zT_)UHdb8RCPRtr_T4z21WqucPUr<Reg5SS*8Mt5($lwOBbAy1!S6bL;L-rb&`hh$p zhvYfYpK;>Yaob1=pi;6R6MhcpFX%OLK`Hr_{77_g2&@C9t$k08=TbP)^Q~OVJX6+3 zpj6JBe!W-D3aLML9ixQo+(!%!9)90>{P59EXYb%?rvYPTgv(34+xgUXBhSY>00MuM z7s_CYe(l>AnW}JwY2iFn#+0VZOk8`1urRHJ8+!%?R&&+}tZdKm<UVNjeGr5Obc=4# zHvJIB2*%UR6|lH6Lol&n@vlHVgUS5x5~vSevIUy}sEc629G`@e{l)+)v~jRSU~65n zg<y-{*q#G;Z^69=aKBo?-9BIc54cavCS0c*)B`*SH?Nf00+V?U#ObXS<|hU!@PC26 zVerA2t00oC3~+ENMM|x5^(j8kRT9o}?e5ekB@ybkZ`CIn1h!#@p9rJ7ye7tMgW1!m z`2gJr<t0|a`fj^myhO`3-KHNeY1vxQQZL=_Mkc}y+i40<X9kp~ej`nPnu(%$y9T~5 zVy>b12*sNdYYmIRAh|c8TihxRVivF0wr*Slkc4_Rt>)%Bc#{pA<<-1rD`DXAV<8%> g2_Kb56P39-?p=rY_?zZ}ckw&3SfeqGq2^-tFRZpdwEzGB diff --git a/config/model/formats/__pycache__/json_description_parser.cpython-37.pyc b/config/model/formats/__pycache__/json_description_parser.cpython-37.pyc deleted file mode 100644 index 29513ce37904313b1d3230d1d91d851ed8d34b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3585 zcmeGfOK;pncxG(xdLIdW&?4GWxe=5uv>PEfMF;@_AxgC^Ev3bZWKBG?Stnk5neh^K z*&HB|daAha0}^rKFZs%;SB{+czVSZXHc$`};?Rlw`P=c#_kQKWrKLK7mHhlYe{`CV zU-8Fm*?_zckG=&!5J6+&<D12_&wSRme2e05E4KTN?-<;UEB&fpHMkSI{hD8+<P#z) zqIy6?RXY2YUl;TaX}OPpD(SRXZi``mkUI!<i{>Xkk~&n;AdAxE7FSv-*ld(G;b-%@ zPLuVt-<L_ILnJg?))dj#0g=R~g7{2Yhqfd~)OQ|`E)`U;1J|#Jrm%%`K>ey%G6GWH z6|Sfq5Wgnsq5<#v17Z`u0pc#_XOL$}j6$}MP8s4Gnd75R0mw*3CuE-;vLk}_03x*0 zvT{cc2U4jj9Le1vh>|D^0?^6UGVa2=76f6;wGM(`$nSgWYa4gL1bTz_xM*+kU7n0K zK1g_&CW61cA(L<PMmms*4gscv-bioUh&DHLl*wxY9`5ih33uZdPKcdVxYdoeR{N=t z@oG0!eV*ynZO|(a3!?`EWA*l6q-r2!8x>*z2pwNM)&}jF7M&1d23G|h#6N>aUjZ;- zg6_C#IV1aIk7e|bP3RHbb0+N2nm7~dh*3BLHe&oPFf+#WxEH4VK`b-rrOE@bvWUm9 zhe`|;#|UZH>)v$19o~ntO3$~h&DVU(Xsa_7C0pK_S0M9`Na@pLFwDFxMSfbg=if>e zf{Ud<xay@QSb01@i*)Ywq>_dXlIzKWo_Ioh;Mes!X(B<{MDBWsMcNCM<e3x;?plVZ z?p)-5!_?c2vR;%Jp-NhnOnF;oLzO&b$GLtb?dN-_^B16IWb9X>YuFvDy~l+>CFeBm zOtl0Hq)9yT^gxDDH<H4GVD(luxsoehy15O<G>FeL4|dSTn_xerg*f+S#^Orx(ZYtE zmaQC!MTOCs*TBRg=ti;3E5ihHrBzW_4f7gqLKbAbyiw94uTJUam7QI#wlq{Oo^jPg zk_If{Z5!#n1(-Ia^|VVXtWKM3eD3(<!Q;>K2BW7~&+}&5{QjqT(=d5c6i)R5#Q7|3 z8l}>zPGVAE8&oh>5cML0#}h@Jg}oc_l=Fl^o?QC#JP8W6AvRfD*kZ6pt;3_g1TcCd zBNOQG`|QWFdloccw#_D%V8VI`!^%A(?9a(<av!kdvQ08;r><^MXwT4m$hLjx2xmgi z!lXdS59BM7u={WWno?!_(>(<(^~sW1l$+~!ZgxDZ8Kp}0_nJ|ux;)-f<`ofh;-)Eh z$ZHpcSQNCJ?moiK3{yiTN(2l;o$=N6bQp`|^{hDT&3eCw-tkHd*SyzstCHI|Jt(AN zoRrr-{x+1RpXFAZZsj(Vx&#WRsf;danLw8{{>^Fk37_VUk+6sEI01mTj5g^-woEIu zPF*%Wf4pzat<Ve^a0$KZ!ehL;2FU0XdUe}OZV%ZW!$ASO$H05<%)JLQp0J+soHPFI zS)MCm>c8^c+_TT>u}_aCCeC0Ogdr#zo9V|(yCx(}&t1fYdKrw?qUs#H{#ihDT8={V z7YTa-u~!gW1kkcf5EQBX67D{p(0S9iahjvw!2!JtfGjcazDsSo46!g?`HKjcUTv`s z{9gc169;4rw;;&tK>%ax5E^rkH-q5oA&;kDst~4IFwW(*Et%Z_9Hwg{G*$+61_72D zbqT==fP85>Vuv!0gJ7Wsn5=<^u#cMo{Y^kLYU$ECYg+a5^$YH4^QF~LmtjA*F|CU9 zLA&`^X8G1G#?-c%wcDk<n~v8CYnOlNna9n<;$JA8Q?iXrgJBlMQ5H#U<{2Z^LX`qD Y1Bv@?VYv5R1&*fJy7UCN0{*N&01Jb_1^@s6 diff --git a/config/model/formats/__pycache__/pycfg_description_parser.cpython-37.pyc b/config/model/formats/__pycache__/pycfg_description_parser.cpython-37.pyc deleted file mode 100644 index e312b02d5b2695e744e1dbe65bf1b38e824431d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2924 zcmcguUys{F5Z_%pj+4tB{l`%#v~HoauDBc$FX#jadPPW3Mb}o)Vns5pca!+evBR#z zHIah^cT%4!zQUb&;sfwy_LZl81)i9(lU&+f3q^vJcD-xwcxGpQ`<uDGyj&;Hl3#xc z)=v`h2QFsKgvqDS)eRUp;WQ>5K3Por)T4doF^X#=Hu|P#7IQPM^exY#<O{+p+}bDH z64svKRXM#w-0EZa6KT0jTZ4g&l1x_zomBRN%%ytihESo523eFQuspf2+zO-;GDP87 zGo};uB}@eIC?_5h#(^owA@wQ`Nr!UE*}m;ryunRg*{5K{GPigYW;VBZZJ&5GUgt~j ztUn|s@s_~E6}`GO3On6rwbQ9ae4=*j>J$ta$!JdY*a15v=mhu+ZMlZ7sNq0JX~7n4 z`+k%}neW5NOeNwDJZrum#(`44{~P)9$IXrQ*KkPH4tfD^-Vb(zWYqpF3Bokt!3S-T z{Gi(DKqM-JF&*?qs(mxM-&Rp3)&@bi6Lba0#xd;RJL@3TiMs3kl#6)1bg^0=;K6); z<Ys?RIJP+$NgJ$O!xJ$W2pwNI-V4pyIa(pY16vh(4f<Em)rT<T<^h0(vqLtifM+N- z_Si3HCst0jS#BK|ha_jYkyp6+$h<>tk=x`RfCao}1>iq&TLjz*9PmXH#L-xAXTf5p zBhx;7-5O=RG;ywi>2N03=|r(;*6Yr+0bqi@$iSWRS8MY&e}zH`>~l68l>r>P^Dp?D z7Jf-PPSz7nspe@dw?#IT$ulbEe_6oL{2l&zvk1;m1_*U0y}vEOtU2EScSDL!^gt6$ zCBVe$fkT9Bxu!O{BGV?KKrcyn>z8J06Blk(Vi>$v$}r>MAih~oFD>{_R~0A&wc6U* z4P;lz6Ck5$M=rs$92z(~1H=2!6~dP+H&}y?&pihdsC^Cxv;m<}z~LTDa>nV7EmtzK zM<xuw0np$Ef`glRC8r&>N+vWS6Dwl?7GRA%V^YnGyqa5kz%V&n+1JU$&e?&P+c`+W zI|gvEgLD5DE~VdI8Zd(bbyKe&kD4hkO9jqul=YsA<puTs4U$?#aODaFVf@x*Rj<$J zVUYuzkDbd(TQeky2O{*&9JkS}NQ|q5G(mJVO#1^sn0y0Q)-XW|a%&|5m!I&Hd=;fu zad-`f0&px*+6;l6w8?`kcp81DVdHh^3dP8ZO)b`7jMkY+8?;Vs+F;{LFF@loL?LoC zHZ&Z8xd~l;1H<TAMgVLSm}zxl08268CIf-_$e`pd;bzH8cS-WDNit)nF1IMK6F`q_ zn+FvRz+Ht*L&?wNTaqwfFyJ!R8Xw-3z{mw@EL=M$OaFh;LIyy^yJ*n@ztG*sNb*Q6 zQNl%%wZ_fObQtsGN>*-mX7P8*NG>w)2EfI&BqlzIzmXSU(6!GWgrZ2@+KAJxHi29c z*DUa$?HSRQP&kWHPtuL96h?jrUlihl*bD-Fo~=*|!_CHTJ}20PSXksNkiu|dsEaU{ zsX3?HMIrEr0rwzl7~|hx5F()7EE}yA#R+7dCvNk?ef?+oWf1@y&dX$jW5Omc!ogfB zFX4kpJZj;3*C?D^xYlcw++SYir+wTgoHe}~3gi{~ir6b`{Pv67JC$%*3o1A04XkD` zZ~DHj`##hdLr68gZutK9!yul1sR9hTkW+OHlGaU_Ln-tQ8jY1kkzOR;a(M-Zt1#&0 zX+0E*IQIP`>*3H?q{<>MVLG}7UE#_GMrauIQ}y%q>7veZZTTK<Er5wG@-EJx+$>9? vW>FF~7eZ68ns@bY_f3l>SwRJ8#*u~P3@y_3N2NbL!Luqnt4&V;mK(-jCOh@P diff --git a/core/__pycache__/__init__.cpython-37.pyc b/core/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e607e3f5b29820233e6ca590f4cc6f656db96ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUvbV>F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KRLfBRX;vHGcU6wK3=b&@)n0pZhlH>PO2Tq-p@eH007FC BGD`pe diff --git a/core/__pycache__/auth_config.cpython-37.pyc b/core/__pycache__/auth_config.cpython-37.pyc deleted file mode 100644 index a2438cd65202c24ca3878647b10cc237461738d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600 zcmZ9I%}&BV6orS<LIG?2gZKm{EX0KyV~DXp6Nykr3o$lL$iS_%0orB;BrJUocdmRA z-=SOI!j&_G0%4l@(lhtmlbKsnlssZ9`1-&<0z$uBB#T!b*``$nK#&3f(jbBa8OVYR zxpCe`kcR>sfda>%eoA%<PT&;I;2bX2T7aU3%B8Xp7h27>HE7fft*skO=hnJ!>E=#7 zb*$b_bvtIyzbhid+{)VB)hz3!V>Y-)Y4=R6Y3wByHYZ7DqLb7_@8_zUo^3KovBwfN z3PjQz5{Jl8mh21+13YtMaY0=Yi(W|Qu^eGammz^zj6yOe8Sc+=$Q*ozB*$Qs)3#bS z^@eWrnp$h{tiM`zX)}|-UZJgZ?aS@k4l3V>s63J557+OVKD!BZu!o^C#7i8k94)}3 zFaUh(xWPMh!pIHih%t=36?Izv(4qd^y^io`g2yiFolcnpCO4yyxHot)_Xe#0%^z2y bRV-I$AuOiu1D^%GVh~b?Uq(t!<n7--ew3J@ diff --git a/core/__pycache__/authentication.cpython-37.pyc b/core/__pycache__/authentication.cpython-37.pyc deleted file mode 100644 index 39e27f2b8d862e05325fba3059bb1ff077eaecf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4577 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 diff --git a/core/__pycache__/brain_observatory_cache.cpython-37.pyc b/core/__pycache__/brain_observatory_cache.cpython-37.pyc deleted file mode 100644 index 10f8172714a4797da87eed44cdd6cb67034571bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22270 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 a-yHU227k&-ZUP>#>A#XP^8?BMyZt}=a=*_2 diff --git a/core/__pycache__/brain_observatory_nwb_data_set.cpython-37.pyc b/core/__pycache__/brain_observatory_nwb_data_set.cpython-37.pyc deleted file mode 100644 index d5946a060074d662f272a7bc5e9c0ec26d3286fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32463 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 AWB>pF diff --git a/core/__pycache__/cache_method_utilities.cpython-37.pyc b/core/__pycache__/cache_method_utilities.cpython-37.pyc deleted file mode 100644 index ebe5b7126047c6ed977764de7a624dbff8b30a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmZ`&&2AGh5Vm*IkcJc?!~rA@z92OR(gQbCp_cHYN;DThg=k^dSvy^~j-A@xrm5Nk z&<AP7iC5YyCtiUQ<K1k?1xp@}$1~qIGxEIH*k~hI>c?05EkNj(ztpP%$_{M%2n0h6 zOEg4p5DQp%g;>b(_iz|6{0?;+zrh0yQZMTTXjSxmP&gW5hP*cmuFx=Kp^qva_Gy}N zwx_J4D&_m!Wt#1aGoezvzzN~>DfVI8*C5Vz9J<CA$f2X)CU}WH_oCnuUk3BeMQ|P7 zAdC*s$=wEW4YxK9j@xD%gAJokVEqXD015%}fPMjrHd(AbmC}+V_4&l9<kTc&Ql>++ zBJfB?I#+CAvqUK3GU3lE^(D~eEaQfgQz`}P_Lk;7<+x&;5vNHBPtuaHBxGbJTn2!g zBojW-;+!Xh@l+e?wD|`z(2j!_brttaKw4DV8gZPf)CsL@9Sd|Na3W0}mrMzviY=2$ z<alYX3rZ!mmTYPRo^zrhCqruB1=?zpmRQs|BSyL7D@6~w&EghxXv$Mpv=6z1;zr!q zq9ttA+~W2MSaD~!26<(SHpTk;`IMJxH!K>K%W;9@qFIIhM5Y7Z;g9S;i#}LDjc7($ zZ$xL1c(ki%suiP8Bd$(uq^Dfj6r`SJa~r)CqsR)!pG;|bOb<E4N(mn9cng}&x2mKn zo;Y_x3MaVjP3NWwlxzMgmSeO200+2(@8R>u{r~;s-b#f7`17qeR&>JSxM;`mM6+Ca zy%WbLIhEB*$x>FgA~t~4_@VM+X}!|I<-HpkKO{v{kB*?xrEMk7H_7<mqP1PoJ@>O! HA%uScDP<k= diff --git a/core/__pycache__/cell_types_cache.cpython-37.pyc b/core/__pycache__/cell_types_cache.cpython-37.pyc deleted file mode 100644 index c65df2b0dd822ebcfd15907b41f41df0e7491c50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11150 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 LF8xgUndJO0)(RfE diff --git a/core/__pycache__/dat_utilities.cpython-37.pyc b/core/__pycache__/dat_utilities.cpython-37.pyc deleted file mode 100644 index 44c83815795a0f2940dd5e52409414a36b5aad33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmaJ<J8u**5Vm*sj^rLfLKGlTxIjWz<WfKtAruG_4T^vefmSQ6d~08B$)3H~vzr{c z6e#KW1xTEz_)Bi7_zP5w@3Fdyk!Cy|fAjRb==VDWN&WoFzwZ+A+g~;mp>l|9AD|FK z(1OI|6%m05Z-@vby$<6*&=WF<{vd)JXI^e7MCB0K-a{ctOa+Mp844<b8*)wKNQB<g z^<Hu~g}lfimp1b`J++as9&&_i4^RO4L6L)bI1k3bf-dM)1mT<tdL4YbbJfDPXx^Gf zi-3|3SmRsrj(o%ubA<c}CFF$Hl5u8pbyi4L>jL<hWV(W~0%oMG3ShYcy~IpQ#DKg6 zHr8g!Vc6-gHNBrSUgI25xn)`*nANQ0xnZR=tjLwza(TlIpGuI%Hc|E(YD}wA(vri3 z9WV<9D{UTq@?|=Ok$h3>${Rq9KB}6QGscbKv&QZn*UdII_zxEHsce9bUK|fvuC)vt z?}FjVmfFg=U0dMUxr=luRea0hY~d0HZ5L*Rjk{Z|I9fXjE)pELqvK!1bn!R;W=99f zsl|yTe8R<W#4os-CC?Slv=aPrB2{e@AKYdrbvc>Y<aItuYz}g-#MJnC=vx$s5a;`u zHgX?Rq}67VhULuld|m0f`+?sizgFb-UD~5x?r-nia2x4c-bqtG=`?knG@WWu6<+V9 z>F0_U>z8g;aBJ~nCt8?3241$dC3@Z#pm>CAy|NQ5?}O0zMR#pI`Xn=0+P3`sgp7A~ PJ5N`+pFPCeDnj@V5i<Kw diff --git a/core/__pycache__/exceptions.cpython-37.pyc b/core/__pycache__/exceptions.cpython-37.pyc deleted file mode 100644 index a90846595ca37231ba2cf791f5e04f19dd3a0154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1475 zcmd5+KW`H;6u0j#ZJH(}Edv5ESPV!RNC%iIgbJk~M4P38A&O+&vy+^1v4efrHf=JX zR_emQM`+cFuXHQlf{FJoZK6O2Cd8Bclb`MP_xJ8zRVpO{qOZP)E1!@bsN6^Zn@w2m z8Ngd2iKJ(+6gl;q6m(Dep!>P*fgZ>L=mq7&eIOV1NNq6$%c-D06!!=~ktUU-=}Fr3 zW#OE(sq|%Vw$u#HNkEzfuwKYkUyDS%v7)cutKqh_#vXs&HCC|$W%rF!tgn);k*sYj z6Je;Fi*$!Y`ar~yWY!!y1~;LJ)4q1B#6Tj=1e4&ljc)5~uWQm+vVFx;rzAV<DtypW zLxtg3<XF-LN1B;=!`xXT^z(`cq&!)uyT<?{&#p;&K}K}sU3z0*2O~Q66M9N6ypexN zDfAO+^cu(aPR6Azk#@QX+dc}_Ac>6LU?=06pDjRPeUW4ZmkyN8ikwF}N;t0tS>ROM z&iuaXWYsXY=IX{eE9c2`mssdWjb=-nhp}*u^Y7&6r>%|F2dAuSiLQ|KeQ_xCu=P@l z&}b>1wv;|_Ei+Ksg@9(z9lF*|wBK@3qMi&y*b^NEws8zEWN$qLKGvt9U41aL*o*=; zq6k1}Kv%qg9zXbl%=)w*+5onpJPn+1o|QQ78=1zqFLVAm74h}WBInYCoaZsJ%5`0# zieos#QO==8?Go;n5h&&W%VAnYKcM+Z2+CCO2IcQ3^X{~mcUr2W$!vc67qh8hgdrmP z59ZT)&@+o8pVLtbEV6DF5Ec=T{~IoHa&khj+pDnV$K&BG9i1N#TSlK1gcXE42<XgK z5pHK61EI-`eLR_CABSTTpP>KQe+j?NthyWJKNU<aC%IAcf6rqYc#=Y1;~KcSk3O+Q xMQTxR)C$@1jxoJ-kh{v~&|*4S>7$5KH95tnvtnjGv*Po~NAY4h&DC<X{0k7EX%qke diff --git a/core/__pycache__/h5_utilities.cpython-37.pyc b/core/__pycache__/h5_utilities.cpython-37.pyc deleted file mode 100644 index ec247c5829d29b0c66404b56006a5583106a4573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3164 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 G(fl10&<e-^ diff --git a/core/__pycache__/json_utilities.cpython-37.pyc b/core/__pycache__/json_utilities.cpython-37.pyc deleted file mode 100644 index 5e440bb3db6aa4a507b8cc9fca9a120e2ee64e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6191 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 diff --git a/core/__pycache__/mouse_connectivity_cache.cpython-37.pyc b/core/__pycache__/mouse_connectivity_cache.cpython-37.pyc deleted file mode 100644 index 66838176aea375e41b25db17bfff600edc945aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25307 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 E2cMZ6X#fBK diff --git a/core/__pycache__/nwb_data_set.cpython-37.pyc b/core/__pycache__/nwb_data_set.cpython-37.pyc deleted file mode 100644 index d75938068182fbb2af84a8fb08765434dabdca61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9914 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 Y6(RVS4Ukzk<dSZZ5swWNFvI%)0^NH{mH+?% diff --git a/core/__pycache__/obj_utilities.cpython-37.pyc b/core/__pycache__/obj_utilities.cpython-37.pyc deleted file mode 100644 index 8c78056c01f64b187b14d4c487953d26fe8556ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2040 zcmcIlO>Z1E7`A6-H=89XRTWi5Dv}Qfb)|Mw)LR9JCgp$>MUX&?R*NEM#+!9BYfo*@ zCL2u-sBq>lWCa%_e$iYx<uCNaWA8^22@pNtmA!u7vEPs9eQa;7ueS-B`t?VC@;)Jd zdSTHbOuj(3_c3H7qdDo(EXv}aNH5BgtbzYHqx+=Oyu=E!n^OOWmY}bqZ=>7C7#yjv z|4sDE{c~E;3pyniQ5H?<dF0|MdPC3Sm+<fn*(2YRDu%^)x2C41?M_lBx)7>PjNn<_ zuthFiy;^W%#eqJ2<-Zr)4SOvJ2LqXlx{*sIY~9qQD@yk}G4COOx9RrN{&!Xw+vh`` zbr1OoSCjrT#Z#>^{-iI|*!I0An_|?(aANyA^005E6ORg>9`hrCy?Krm+3{wojo9=q zOD7SL6t-JT>Xr{Ogyj=&VIXvk-lBJ?S;u^dPZPoldcfxnP&*>$6g@(Z(Ua3ZD)OBC z@Y{K#YGlCt=ja2H#mAA^0(zuscmz=a>h)7f$?LmeT_db(V%@7M`j>Sxdn;IneW*k$ zTb)MNZNhKt_rtgM9?!f~NzlRXmG1T3m&C;vNkymhqT!mTDGf5JJC{*oe2;^?GNoB^ z4_O9Xazh6jRaC`QGDyIHHs1t|zV?M?oSpEo7#OV_1L(}xnMvg|zBnU`TtGiyV_}?3 zg?-4BHY1*6!d1ow9J(%RGqi7q(z3uF!!WajNaaAL45k)_EjtoQ814kN8a-mVG_a$z z<4$VD#yT%Y!nT7w#K%X%fmcC%v}{2POk_`4E^P?VIurChk{!=dAGK7V>C*em?4EF? zQ8#Rcjf)InQx#nh*BCxontU!tU?*a<j2poosC_;HHXe^{txYBslCqyY>2%qSPD3^p z?wK13X2d`kp;7@%fY;LIHCUGsh|_~P!0!|X!uT>52+_@Acp*}!jhz?Emtc`zH@Nb3 zJ6Ndxn<pC*hNBmADuiVB7P-xEIg(?ceBM%Jo-Q+H_?kR;{0KU6ipmdx#zS_9%6zia z&7tz_>s;p>0OXF1__1JR!30l-fpgcgcqh1)N$k#8{J-ZQP8SE}A2SIB+0~#=m<5`L z+20)~p35^ph=O`%U7f1{lUF_S*C_i+StniT1RH3>whRZp`>6~h47L~N&|aNGeWDmn zQJLa=;9gjsN;?C4_tHOFXVI8l`nTvZ_EJ1n>?|6fZ*IP&tkbHSyueML8GjGgD@GJK zs8&a+s2kx#^_tweNrAUykZbPh7<WylY5bGcYb_YryX9wBXQ8)#gRs4|AkHgaC;l!7 zPtj~xgDvCV0RKGNk1&uA6B>R|JGxEpE&E28-=-UMBMLh@Nw1;GQ86(a*cD!upuc9_ aKY7Nxs9T?obXMl#^N%4}|1h`W*2-VT$wg-X diff --git a/core/__pycache__/ontology.cpython-37.pyc b/core/__pycache__/ontology.cpython-37.pyc deleted file mode 100644 index 8dc9c30c5756743561cd1ffeab31c9e4c4fef3f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5036 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 diff --git a/core/__pycache__/ophys_experiment_session_id_mapping.cpython-37.pyc b/core/__pycache__/ophys_experiment_session_id_mapping.cpython-37.pyc deleted file mode 100644 index dbee602d68fb27c1123212e3f9ff5c742beff1be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21632 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 diff --git a/core/__pycache__/reference_space.cpython-37.pyc b/core/__pycache__/reference_space.cpython-37.pyc deleted file mode 100644 index b2d118e86806fa7a6361e89542d2cfae37048bda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13332 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 diff --git a/core/__pycache__/reference_space_cache.cpython-37.pyc b/core/__pycache__/reference_space_cache.cpython-37.pyc deleted file mode 100644 index 86b5191a08151db595216afd393f0231924b6bda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9374 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 b&04DPTe_J^z}s|aDvw@)7O6i=-R*w?TP!_C diff --git a/core/__pycache__/simple_tree.cpython-37.pyc b/core/__pycache__/simple_tree.cpython-37.pyc deleted file mode 100644 index 401d220aaefcc2dabaa90fc45d641e686a22751e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11810 zcmd5?%WvGq8Ru(PtCcLv@*{ELIE<ZG-o)NGZBZny?Z%e!aO)^W>@<NQVN2~$60Kcw zJ><&PW`&}$i#R|oMNhp+EqZ8+UV7}M|3QIXc`A@o&b{T*{=OM<NUk1Mjnwf1<nl4| z%{TMCe&08|vTt8i!_WWyFP*Pm)wHkZCjD8scoRqXE>28idP|#?|N5+fd!uExtyxQ_ zXJ)I^F3*<5wbdGGS7s}^_KwC%tbAW%Wq0_VIa_7=4XrlxHK=JbH9a0-?xNFeMa*kP zxE=N)m*Z%MxT!L?!`-G6xvWX;)1Tt$uXy5WvpUnji_VPu+N{Y;X5rtGqt2GtB&)FD z`}%B|RoMvM47n9HdQWHj*w}sTo<2Lw_Oo$3ud)Md0{<iIAUlNrQFfRe!T&zAe+unS zv!~h7`#O4zu^M}ZJqw!q@$MMjJ;#m<TI1|_W~0vm_5wSB{|R=Iy@>yV>?L*z|A*KR zX8&?rz2UVxE%zpO-6qY3eq|hVZQ=+&!|8KvQ5UnS^z~_Q+SeM|=Q^I5m}w=#{VhCA z-WbfH`O~xHiFx-N?u=<|{?xifSAFZKwqEL&SZQULzl$ekzjRdFu=>`fu4}j7{YZO& z{*BTD8mY`m;I!=g87y74BQR=*5$`smE_bVT@>3Vr9qzPUh%Qu*&Z?h!<Oj?R?elia z3nM#Nv`OabC6Ro~X)cSWwinutP3>*Zx1(iOa8S2z;%dcR3#m6fB?`8Wp~YQ+R)+^2 zmq#8(Od1Pvj?e6HIq0^Sz2Mr-zz@NU>qoZJ<UtsUF~ho|M12|_Ycv<Y_hQ#?Mqc3C zeaV^_{p_WLPo_H2RHmF(%k!7SyMzEbCUc^WpyTj0JLoPgM|Kq0;FooqE}C?G?{?R< z3*<Zo9=%1+<@RF0F<S@orsX+(2eZIfc!V{hHKE6oq3yAnT(4-YGe9iA9v-8$?skZU zwV->(Ug$zLDO1}nQGqcU4YI<jw!4rjIxIWkva`@~vqkJU9Nh1;j194j7cbeeS;l{1 zoXb))l8EGzyHG}7P8!q5%?i_(#4;X8CW_!p5V-@Is@`3VXhB>jToY1ppc4+L`OFFJ zX(w{tCQY|-ldg4Gw|_!Y?}h_f7zJ`_FpT9u@y9@8QP604D=@0yyc(K#B->~Ni^-yp zNO(hasV5{)Pr@w*oK4mWeMMtosu%6d!JN*MJY(1E^{m%a;IERAKvA87SqkkW+kska zGkr48Rv6gmyp}C1Et=H1Y@x`)gx`SHvH%3VNN6y4El#{RQ~P4F=5<A?Fpq2sv}hR% zO&yMteg=*bj)OSDBRF~RZS!O6dS8c^gBSmeaof6~{ZZrOcWXv$)X&AbPf;hcdGYQW zXX^aihar61oU`n(`hs)E@z>@q`wr&DobS)M{%SY}XXA%WoP*BtS~z#jTbK(G$If<~ z=8CiAqHn8(7Hs8J2+n;q6#l<K!m4-HzNuayBWMQg&ZVCc!^C}A>rG}-tT!5-??sJ9 z{X#2%!H1XXSsyiP6a6TLh*>{_3o+}7Ib&U4H!yDlQ6!nUn46ru$%oK1Hhqur3a+pS zqj{T^O$j6L5uC2!NH|mj6T>v{4SF|$lNh+Vt}kJ+<x=McG{k^>6z#I7Tn+FZ5s^zU zQyYrQ4dG-sO)eg3D9*yT+Gs9&Ee59$#$~4i5imYXMEBuTE5}yowie@(?5<vjabvTC z*-F`GeFP72C0*;Y#0bqsJAO!iMxQW7^{QUc4;f{>cW@ioG>K{Y(LZV56pru^PLYOq zO%dDJFgLY(kOQKt?%amDzP}JT2y&VINte3lwGdBTgsC++3Amgl;UW&hR5q_JuJ0-Q zDgrx&GWg(yAZRJFWLfX~tu^72Lt(aemOX^%jFR%f91-h|hd6`?ARoGH2k-lV^xJBf z1SqKcJUp<APU0#dLmS~l20s-?g{PvJ*nz*snvrjo3z+es=+~^+qA}vKY{JJNpt!v1 zw7PCsGdKx69#(T4(9n2P_L55ZF$q{meShz%oJQo^G)ZykM^;9M(2DE0@U(UF?%U7` zZA0G#ZkvA{NKNls_jKSi;5Gc0`=!3QQs!?)K)4%bzuXt7Z4(;wnJ(`xXt&2d()uPe z%5c5}GnqyO!OB^R?G%q8mX?#a`i|pq3Yes7ggjEDlz<?$R6-Tiox0eYzAf^g-B|Q@ z(Y6#S*kbJ!dD6R^14u9EMjap%CGj<-ZGo^KX()t*D3}#UrF;N?xdbq2Qg!==0)Y~5 zWr~6zyB*gGr)<xxRG$=uB<w20n3~2znU#YVSS?IO-8{^S1ga`p&wEZMgDt7p*KA~9 zo-fxgT`ENV6y9X*)X*fKTqntL5kIT8y(=kAU<N+`Op@rf(A=I1Ah(d9^@1DSab4g3 z^xV2Ym7l)0UawigMETP&nRxVrE|75BeT(ye!-NCgcB0ylwA!I$u(%|cnl)D2u|@KZ zO{5KRNeF4spohiNM%(G!!T{3WAGY*yc>0P_(aZXnK5Fz1<*ZwEm{Hjqd3%+;QLfxK znZ8ot<IG^@eb{+~?CPE#o)TG|g=dv@%eNkAl$&k9=KJQR@r5q(JIa?UeS`8i*z}Nd z5;pygD*=B<@xZaej@zVkfGP1*)spYcI<X$GOl5(9XQ{F(La7}l4q}ZUE)!v(1;^6u zY-2?B)kScZQaU4zv_KH?!Sh#x6;Rq<%M(MAX=0)44Y%bY--Emn_F?6?Z6mQjWP+y= z3Y+kydJUTL89V5R%&QpWriBGa+mMzUq9w&-IL5QWNiH}@6zeuxQnf<hVj1SPxEnH@ zJIetau5dKqMX~cRn-!7oeAb=>p!j)Bti14Go=?6|EL1&{`;0<k1cK=hXpFS7kIR}q zBk_(N>vsojpmL$*v=^9j>33-TZyZ{$o>O?5N!VCeYow}>L!n8>!r&AU1qLNJ*@xyI zEik}O;&DyqHvS|h0{gv)+dt5wmvB<_h!)L3&?77bNU6<_t_vK0RQt8S@!5P3zy+E$ zR#!2?3AE2f0M4c*7C8G)c$0w4-nqR_HSLUip+d2S;;I;<RuT?K&WQXJKTfCT(&53C zP1k}SnrwVv%bI?P$01=6?XdJbV}=F9**mrycWRkP-n3LxI6@jB!ZO`LqC=AJ{Wie_ z%Bur1Q>;<}F<)m<`l>GWrnss(>8&zOh1O_D)kIxjWhgxp9v%WC@RbQO!Q-@41oHnv zbE8RW)dK!b-}g=+Ps^pg^(<Gw{7~mX`c}Z`CP=9TgC9n+vMCmfN|V*BcY+G}%V<By z-LPu*H@ubX6~l#Uuw`r-Uj&@NS|5aFIv-})0m&^9S>U@iymcFCr0_7|WK!(NDjI5W zukR@_NS6=sKzJbNMH&|rB@$_dz7tl23X`+Ls>?}+RIz~950|NO09=tv0u-%1X;Y2~ z@TK~0%ZK!bf*Z9Mq|hjlxI6=Piik2A(k10vNDYN=L6zVEFnM1uco!(=ezZvZi%231 z`bsv(Cvo}*4xt9f;A=VCRca9Cy=UrDgj#LUvvdSO{1p)XdrDl}-#ff5@&8fDmiDS- zBGpDAPpzW5c#K+>GO>%Ak%lPN_Nr=wdcU*EQA^=E3rd&rB?_;(`f-7oM^(FV$o%1I z_peklpmwKonju&t@A+t2hfFxFvHUX~0lJrm!>WN&Jwn4O)BPE4mb7)_?ls!Sn4exZ z`{t6qZrwfAw-{`U8Q70F-?!j>1rnxbOYp;DSK<gVTVn&cFmSZ~E90mpo>u9p@R4u8 zgmbZNXCLYKO*f2!+zy3OlE<jOii=$oSn>6^lvgn|Nik*{f4N(|{2gx<=^Di+DrRO0 z=Vco^BUk7&r6y$m9JkZiZDyx8(O<Daz+_5Pc|MssV_!LAU!Ip`<wA?gvPJq%Q7tr@ zmW`%~hH9ZMzWxt>Gc_|VyLYh(#5j3aegLNw&r!gSO<-_YG#qMnIqhW(Vt~<fP_nbH z&`099r!BpTTHzRKhewP;eJI~vSq)hX6<7r#S-^#`nvVhG0OMde*HFhbkuO@Xo|3c` zvJ<iw)QQUcdcU+`MCOJSm2Q=zp{Rm3!~OE6e$Uu6$ZlXs)qY7>&{$$YhV$%REeI(< z6N}^^<5DZAE*_%|<@k7#tSHCUcWXyEM#z#9JAoO&n5Gj;8fcSP+x#}R&ndB}jl{#Q z-)*}boAI2=;v63eph_w-ebkIme@Cqv`<Jm1bYjzCEH+V45zsy!%SI#nkOn3zHWE>v zBU*;%$sK{$=&q7R)B#iDZ{RIHF-Yn(Pg$tSm-TUj>NVrWnBF^@3w_0Ld&dT{0|{S~ z#6Vdg%t7qI@01sCN<_B+HOZ!cY0u;RE5spD(v05z97i<dmXSmjZ~|@nuw|+lJwPV1 zsjcfGE1>#O@&y1Qo+YvZss?S72P}3`fLA3_DvGC-5tMtkckPeGZjlP)w*}HFirD3E zwKAnEpryS=KUwI^LJ1McG8HLf?749_>|no+$~Cm7$(OpQKo!;`tDlhIR9Zk)36T~Y zlbeUPG?e3yr3r#>u%rZm`U=oG<?j#2YL`>>09Jc(Ks~m_X`oD@Xp7nv@&i)Lb3~c8 zwX`uRBJ{=wsrQZ#SV2eZ&SPU%CdgZ~b0<59hmxLKn96J+F3UF4>3m@h2XY+Aw}l}I zItqiJDhe6GU}`K9bklhcBnxJMos2>TDDPB&QWw`Be@>iM{}+R9J|X@;sCyz3^80(# ze6=o*nw{(|DgHRs0BHQFEgG<s&Ts2#3p#%RT5>g|jl5)HEA4`Mk!c8xrfgsA%F>rn z8g|xzq}0Cb{LacH;?fhKTWNe$`(WROa;0hT?mktez`3=+r&N1zu}aynr6a0-uR{tV zpbAj2iznefLd#Ebg3j;1r)%*DlD@UGq%-vJ1c*ChCj2fXp0Tl4|59*rTg6UrZWpoB z_n|85Xy?R#BxmQjCXb*2Y-bHfv$Q8b{wXWpsq|AOz9rdz?;)}uPR9#>k&}GB@}wFF z@CE!eQ#(wb@6acqjRw9CYP9iHWs9yy8;#ptrzPL;!{m4911V0po7d<>0E-js<7en3 zY5^kEAwEUk!3o++cXg4jDEJ7+#4pj+kLg4KCU+7U0bv@V84{KREPJIgQ8`h4p|Wqh zgsX|l$;wM*eblNRO715(^{9>TAK)*p(B~NrN>}`cbUV_-W;ymjv0EN;LaMPDdUwUw wQL_irugvP%r_*9eaXDDHg-(KSjy=IG@fcSw$fdeOJcjfLjOwG<`W`j^3lMW#egFUf diff --git a/core/__pycache__/sitk_utilities.cpython-37.pyc b/core/__pycache__/sitk_utilities.cpython-37.pyc deleted file mode 100644 index 6edc394b8d1eb508c4d1129575cadd091e80fc42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3502 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 L_>JVv`1Zd5X7an4 diff --git a/core/__pycache__/structure_tree.cpython-37.pyc b/core/__pycache__/structure_tree.cpython-37.pyc deleted file mode 100644 index f71db43aa19fbc6b60b29a97f969316f67c9a3de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14567 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 diff --git a/core/__pycache__/swc.cpython-37.pyc b/core/__pycache__/swc.cpython-37.pyc deleted file mode 100644 index 232a223a6f2e23c66e927ca7feea128be44a3721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25986 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 P@~O!`VI=?Fot*mLXqr58 diff --git a/core/__pycache__/typing.cpython-37.pyc b/core/__pycache__/typing.cpython-37.pyc deleted file mode 100644 index ab1a13c4bf7c44770e0e910fade8843b19cfe686..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmZuv&59H;5Khv+J3Bip`T~s?nS-+jFCrqVgNPu5Fo@bTgiMm%877^yNk-|t$?ju# z^W-b#>d9B|WTj^o_h2>kb^UZzeO2_!lamnw(LcVi3yjdO=-f&P#yO~~0R$3Qp&Iq4 zU=f8|QWK0mAYG+MCfkvHf>C@Rn?N>=*-uE5k1>*}tj+5jqt{4eBELZ*m*hIB3xStt zTKtCoXfeg1d}oa}+$gY*=pARmR?b_-eJlOi2p$V=B?aRg)I9)@sKx@-MBqA+smuiV zjzuEUoAesjxyWE#9*&p0t~1uVrMFiP=ZZNeUFFxzS8ksHM^===OiHW$OrVro>33Fh zIMg8V9d!=sA`O9{KVJL<2&t3m!WIx6;7>Du+Prttx`wTpn621Xru*iFX547O9yd~d zagFJub{x=j>)thQH><{NynNI#zGasZYL$X7#P*CEE6;r2ZS>`=>qBuMJBd^X03uiS z@2ojH<QLN-l$2`LN=n0s($<KbiuRb&&pW0L8R#brr_{!^LIQ`d@kjZ$&)zzUu?%1g z>T-Y*r<mX&HZ7sBcOl=?w2@Xge$&R&zp~a?o5V=MR(u#U6#Z{PD4*?VK9ARSaaM^5 LImHulkBpPQ9$l_< diff --git a/core/lazy_property/__pycache__/__init__.cpython-37.pyc b/core/lazy_property/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 1916b79b1e606b06d16cd24abde9127230cfd501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmY*Uu};G<5VeyG2sHy@?GI$28M;*n0bN^!gjgb1)-|@MRmZmMv|u*Ag^6G4%ET{p z>KPS@o^<ctv!C_O_horbu*~NNEO34&@mCp=TkJ4I5JXT-I@(a0c&4*1Z*t`M6RC<H zik6D*1~Yh%kKQ`z`-uADzn-f%Wge=cDK)ydJKB88X)aIBc$d6B$D1$W3mm_&*V74m z4$=n(D-fe4yn>1B&OmF8fH9M18yKdW&>~v5ih<44k_FYvD+lcwUL?NN8XaO?x7N%0 cB)H~W8P#(>a&dQd-C42G@+SQ*q%{Zh03pv>FaQ7m diff --git a/core/lazy_property/__pycache__/lazy_property.cpython-37.pyc b/core/lazy_property/__pycache__/lazy_property.cpython-37.pyc deleted file mode 100644 index 72d829cf9e73e3b821201e96c0fb579d61e95b7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1318 zcmZuw%We}f6tz8%Owyzj0R<r;vOqv2+Ai23gj&KwNL4^W2x$~#Ib%0X<IJS?q$SaG z0nM5(U;$!*_@&vh;ulzP?<9e?)T4WB&s^K*9-nz!t5pcJ_}d5Z-67;BP8Q9D!6t;g z1t5u}nha=22P|ZiJSUP#XG)}_oMR_+rTdyRykC$>8Y~Z*LTk~{Di2<y%HSx%PmAWk zU=zY3C=yahLIxYbAv;XD%2U2%pB?E)cj|>DS(UylO=%d&K$fQ@EX#^qg1#a>IJTBo zx5Z@q$|OT&(($u~lUKyB#|J9iO=KP%8Zm?~HV>>y(}E1vhRugy5HBI@U4V>cgp-T` z(#!#5nG5J-9-u1;peG3&N?Q%zU>yecFeQN86{c%*zkgWt-ht2~)$nuID!p?i*95q# z4Df@PDs;d1n-AJ=EYNI=T_M*y;!won_Es#SB$ncSTg3;q4Hd>V0!)UxW82>Db=tO< zs<okr`l72~t=5ns`x{YW)P@FG_;9Yv>Dl^loClou;$F%*)?twaaeTUXCRa|Xy1vM5 zMPQVoVUOZ9A?$5{4DPWXm}&+BWn>Rb1G9QYzR<5IT=8xu9W&^=yc`J~jkHKr!!b+v z#z{JRVF@4|!<8YW8PxD&iSw=kx))$#3**v&x~xJgbaMF&*&^|Ls@GvT(lg7mdya#Y zNqS5_0)3#zT9cbi5#LGcV3)e68ztmg66<kYq^aq3Mg?2E@L3VdTZ`9EjY-VB60@>M zIHwBOnDeVx1)7I|<N^Dyf+8uRm;epM#wf(T2Lr4C0{ptiKG7rkeicT}6Y{Ql#Go#y z=ZNlKdkdE`liZy-@UQO*-!5eLjj|)1=B4?+a)z@(#cx1ZTu$f;t->=|J*D}-yM%vZ z3C$IYf#N)`a6U-nNaMK5`Tj`g`4=x84Ye|8B7?={ZYN2!S;qNAgi8o`_z6OVDbNoF z|6*KLcp+deT`gCFz%Smn8eZ;$iF$GO#Qr`wOGRmsao(1B@Nh=;5$bM{*b4gthQ%vv diff --git a/core/lazy_property/__pycache__/lazy_property_mixin.cpython-37.pyc b/core/lazy_property/__pycache__/lazy_property_mixin.cpython-37.pyc deleted file mode 100644 index aed0f1e287e1b8eddc093ea6629087dbf445b294..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1200 zcmZvb!EO^V5Qc5<Zn902DxhAe5Vssi5A=jk1@r(yr9!IUuv*D-)^59WvkA7-l4v=g zRO)NA;>0WY%86It#EdryDPYOY%<S0y=Nso`r_&-Z%5PuAc1Xw%be02r@*Jjl2#X|= z7Gy{hO35oCnGCLo3>2FONg%^x(u;mlNb6D8J`}U*J3SgJZKoN;RwGzgW)BQS5-Lf; zR3NEjS7c6;@S2=Z3CCT<N#yNFHo$INlaM4$xTNXst)Koj|D2Z@-irf&aUQ@lDBcp- zLXUb>Gw?uKXjF0Xo#+VMUzZ0@)AvSclZrDT`vY+)%4zzd6xpbh;z_E?3zI?>rO99& zjnAegJ<JEG$*p=k7TLKtRj{`xAVZ$-W+Sb33n-nB7q#E@_z=bR$5St+ff`X2VY8io zO6spiGM@&SSP~+{X<ox(iKP{pvl}MqE&am&_!atr4XU7GbEfyI;3lksTY9{<2Xl_0 zufT{M)r2A!nF;hw;}x#U`KhwPTAdFjR&nlHxyegoMVTqr^j|seg&KvquoOe(TAn~w z2xHtvHqn~nen7v$xsP)0>1za_V_5M08UF}bmv(83w%F{^di}o1{lB$jC=mzta!JM% z;8;?Tiq4tYvD7lpC#Yz}ZW$%zn^i1aFk0q>o?&PsU={+i55TN}{QSQAt9`4p?vQJ` z=9w^9t8RjZ8sH}9rUnRAW374v79<B@AQyRZdJ}`ug(xOUcQC6B3q0B_w6VMzRu`;o zm<HnnKy5F8ZL!&d{{dUw-HTn!Iray8$oX(2Ck5JV&Oc2=vG@`%AFh84wP3u|br!wL zR8cJZhq{&;eJ`;e*aw4N%-UhQ<tZHX!ldJ0#hv3_V>I}vGV62dDt)P|dR_di*13=W KY5!ko2fqQ)g(RN< diff --git a/ephys/__pycache__/__init__.cpython-37.pyc b/ephys/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9555d6555def0e2bd9bafb0d786b435039afa4b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU-8aXF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KNX}vKR!M)FS8^*Uaz3?7Kcr4eoARhsvXGU&p^xo00bg3 A%m4rY diff --git a/ephys/__pycache__/ephys_extractor.cpython-37.pyc b/ephys/__pycache__/ephys_extractor.cpython-37.pyc deleted file mode 100644 index 4f6acd5e23c0d2b843fa8273f3bbe0b3421f1891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34738 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 W5nsq2$mX)eY$pEz_T3L=Q~wA41?GPM diff --git a/ephys/__pycache__/ephys_features.cpython-37.pyc b/ephys/__pycache__/ephys_features.cpython-37.pyc deleted file mode 100644 index b2b115b133955463d4be3b7e1971146eb576d2cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32573 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 J9AaDN{~z#eN0$Hq diff --git a/ephys/__pycache__/extract_cell_features.cpython-37.pyc b/ephys/__pycache__/extract_cell_features.cpython-37.pyc deleted file mode 100644 index e50058fff5e57df2183346f4e153f6711ce11fd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5480 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 ThGv6b)2&zS*R7JhXxaY(J>Z%} diff --git a/ephys/__pycache__/feature_extractor.cpython-37.pyc b/ephys/__pycache__/feature_extractor.cpython-37.pyc deleted file mode 100644 index 86194e852e8a2a9857522d89328e476426ebd361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12307 zcmcgyYm6M(RjzkeKW5w>&!gvIyFDI{-F}R{e%o<u@2=O`4a;EdZtSJ;s?+XUGt)CY z-95Kz#_dj360#veQ38X+j}Ya@O!z~B6e6S`kkD#{B7{~5A+!=wi9Zkt#R8%PAwUrl zeCJg4Yt{}RA!by!&pr3tbI(2Zo^#JVRWA(<r4;<tfBToq)yInR1FCfX3;?(Bxc5*9 zMW{8U82ze6mFrqj=U-#pEShT6W)-bZC_)qZ7Zss9iFfs)jk+OB)J?7@h5Dvau%3de zvRI+A^QQs0jmMos;V3jpQ4^}rzNla%T^RTUCt=~&6bW##!=YE2D^J|JPTAX(j$0uX z^k?HS@w|-3y$Wnq@s(0kstjvf>b?rRL4#D)0Al;fswRvZimw5}kT)Q<utY-G-_QeH zB)L6>cB0e;AdzNVri%lFK0{(y>_Z<zWVwAm+70dlh<T1MPg5M=_R;Q`fW#Q%#(^`r z4<IqYxLg+pNK7(rs*3|8rWrTW#Q_or8F#3Q10)V(UL%-U{u@SMi6cxg3kqw;+=aF< zJJiHc#?KAlQ4`0QVs26q^QawXsuKfLsEGpOPY&Qw6Q>w|dH|1_IK%jb0X%BrEaT4& z;87DVF#h}i9<^Ay^RaXnnCjvH6>7W+mv|Kt;xf}*0ZjssE&vGyTkPs$sIOGL(5f!i z8`5cK7dO`*IWpf^%Dc_#n&XCcy%a;H>j`HoG%Jm|>q!-Rub@jEKcTT+bzPYN*v`Hv z%1y8ARU7quwJw}iXqE}n&b?J#ck*5%zf_g37je&@Sa%CyqE_~tdgV!&TzAU#()wo2 zdrCV!<}PWs%QP{!UVHPkGcVr{P5i!m|LJHn;FcrH%T6A+m|xYcmdabp?d+Y#=A)Y9 z^)-nI(;m88h7d2ldJkRh7sAw1X$go@d8OGNdb8GeJkaC<v8TzyWWs$*rA||c5bd#- z%C1wZ)}8!TqvnxN%-wnfbZINJn~r2%77W%~G&53Ln0D8y%~FkIsJHjONvhAUIMwA9 zFJ`e+YC7e$b~b7fPSab7TI{8gCmWl~D^F=f<T&YM>>g<In@ucJ1B@WVSyHs!!L)Pt z*J+7~<p3Ep(V;1AwI`U3XgsF%?q`(h;o4Juta|83woDHJcH?iYz=^FiYGP15Nw0%% z&qULETossJ*~_n#YfER=%Pp{j{3heumtS5f*P+{LJukM-3NPQl4v4qarTqH+e3RC; z%d|WFbc8C&@_O^>PkHa$t;%YBIWMsR^Cw<y7ea%;f`uK8ttc&88hg3caNV+e5+>YA zgXlw}UdHkpl}7UkoV0;8Uy}2nEoLG!DiNVmOvg2{j$(>8chr!9t*w`9G1+iuTXeed z9*HX7Qe**)f4cJW^@pEwv3(wvSIT1HQTcJX{^a3{^)if6lrKDV>Rax^M$@TdfTq)+ zQ{&<5)khEAs^^?(mMd%6jObgdfkLdEb%@~XQgp7AoR%lc6|W%|nomNzRI1jiUa52* z<GQOT6wOjC-AY-SW!P#;O&J*~dr+_5!FPTW!+@e^Snoi4f4SWxp6&60^KPLdN`<yI z{gJon9(-R%#ly)Bho(*_@2aZO`VzUh9er21qrB4!R671vjWtV72|Dl$U!7FOm4IN4 zV4<uf<=cLIFh;Fc&|bHJGYDc1COCW<eavp3FQc7~F2;;2MCsvBB^frR9z?FyT5Jz@ zPVW4YY^>+oiDMVex%rRh+uE_^wtXi4YbWxj&YsC1TgJXKo7i9;Zzg#Z^9zkN=ZPyR zWZ>NhpLl}M>RPD5C~0p*#Yw^@xp%3t>HQk2F8N0V>d*2b46CD>t>)AbwLLMY=5DWU zfI)hu2<c@!?sXKci@v&}uwGBFRy1f28iWp1U&FD25*R$JTVOU)u^#kAo=HdiGvGFW zp!pP2%`(igB&ropE)d0@nVFSZqwahIEiM@)%?k54FgOpUS%em`hsi=qr7%@0tvAGG zjo?hFw6R&PMJ@6ajdG5P7pUls#}KJg(ji2RJfyAK5A9*bRe<aM5z%ct?&~Q2`>;;f z2=6SB6e;{BL|SC<Yg0Uh-=x?lviMDj{WzOP!m<AOz0$GLt~HQV(D1xU<oK7N{ZdpS zx&*B8A+IhL^f1%0_FC2T!r@NMZEVVl1J|~>z78K(P<em#se?5^%K9drNckE(f!03s zOyPPqOUE|-eGE?$4@)_kA)EEpch$i5%^-;Y(3((!l&9`!2q2Sd=B`Tnik=`HV^agz z41(9RpZOK+wO|Mox^M8lLzp|M<PewV6!0+C6!{&r8hA|K*j0fu8E5SzqL6o2f2ak+ z!9LGgwf$j#pFe~^Ir&v1$a0_Tt{UvGlVqkpM6ka<;?)@)98;spv=WSnbZ|gqg3)Cq z7z2$)ba;~fh<{*L+evw89$#D2qS*!Gpqyyk_cH$YyDEIuCm~5LnDlc(UDLKzdCs5M z8S*E0;ZN!(!D$$r#?h+f6j<0K%^j4OCum1{wA<>&$OFZn@YC=}6X^F`-JsuJpnZ>a z82fzv&~4?}`oX+<`swLqTW<|xjuSM;ZT%euvz!X1t4c8APkH+YPcvFmwlz5iso|w3 zFu&kn-S9KPLDbbX18ujXHkx~I2yN-$5M<9{A58lPNf*1SKaE{<*gx#gh#`0*%|8r1 z&4^*ZdJOLaY{YODaK8i^M)@{+A7pvB23`Iu_#ei4Xz~xK#$%2Uu5ZjdRwmD5;o<{| z{TOvWNwlrY*Zn-rC^*t0dG~|zNZgY3j|dHGbYxrG_!q3$5%d~?OiV!>0Bb}I_yAx% zhH-hq93uSK4W)kC&&NHrSc-@`k|?5%U{KQzg&Z12IppVQ4*n>OHK~j$Yh)j=pI{d2 zGE3`%Rng_|`}yE#J>$=caZn$^T#ouj(Px6?JIeCWl}+;_c#>s}V7j&$F@75GjL0(m zG+8NXbcGwR++Z$VH|92hYaMLsm^c*7x1=}XAN3AEHk`45(&Df`H;pqN=f3u?1`ApY za{m0b;ckIP4&xkKGq(-7CGx?%p9_xHPg1LVtJ|t@&0t!?KOW0;<c4w&EgNrPO`^TR zGk{l_#ZENj`@Acn-NjO(<tQ{|$gtNU<{0yjj2VL+&yXEc?SX<Bj6u7!uT43R)fg4W z#QYZ(f9wusv#aim;c_}UsstxsJ1@a@K+U#uk!>fk8{!bzjVV9vk9F)uOnk(4O!@h! zooq)8eZ+pSlF(JhhPd{>wIj?Siyakl>R3jH)AOyvlB>_L4ofa{t;1q}_WxoXdo1I` zGcCfB-~T_f2(qN(eO7{$0!x9N75NxZ=$w2(0XwG<@0^6Z?-$5g{i73PNk};$VkK^r ziZJMR66=lMQ+*sGi=Pp&4sm)y>2f{^&L_K^-}g^;I0vV&uBX5UwinyS8H_ZFI{B0V zEaV;s1|Br_jfb(1PWz`J1Eo7O|1`^U7O)<}l<qKM_yxctF^mKUxRD=4f&+fkl;{1^ z&-9}<V)u?8wKs0SW;^~9Jhsh^^AC^`3(oj-9#eFItQt-mgQ3H8?%W3dNri3BUL6w` zAjOzZ5Yi{UvNPe2;apqr7wDd_ZDZ{hxb+ewWIGPd`ezw)8Q%4Ze|A*yQ+_gsn1HcY znM)2lQ@a{tu626CzZ%;~xgf6lV-&rJ6VT5XX`Y}QJTlXNtV>TGBPBm*ebDg<@4Uw` z!;GJceM;mJlCp{M5Gl|}D&W`Z8qU&ln9Za=gLObe;Gf$?J`?&K<~6xN<B6k?c}4)n zy1fwZLhMea`1qv4r^O3vh@<$FIFB*U$9pCz?}`+-p64@y`_R~op*`Bg@T_LUO{`6F z<1TIososozvpeTo&}FBEc3-dMHd@r+0-lSlhu(-#do$-V;4aPp%pG2CW>5#1|HVEG z>ze2yU0+dxi~a>Zk1uSeHr~cQ!WgXY_pv?~u@)EN6@3x=KZVGe_6T6?u1l@k-bf?| zM{?(aT<b(6#m>|&-9vN1W&g5&X)S^E`w>Atb_>S&(E}>~=7G}sd;d~Q8wQs#yDNCE zw(bn@y@<J8j`)I8T7Ggny>ZdM>P<&D|MDcx56tAMe??ru?-gptOu!2fOj@>4pYqXq z5H#R_t@Y{v|EqiWe;f3_xtD)V39kFs{OkVpQM&V9BO07(Gdl-?y)q4J3a()cXouzq zoV|L8XN$2Ri?Vtcr=d-!A>ce<oOqO3$7ScGMb0S7N!%2cf3os}U;W;{e|U5G)!+N$ zumAI3w{I?g^`E}C^KXCp-J4J8R=WK4-=e=ix)tik%oWt4QEpY;WwhWb_UpIhaF6C& zw<zmYUMp2aOHKe^M7}ISbRkbpp&`t4GhakIO|-paShWxKp8hBP!l7=4iJ2dw4snVJ zDX!91f2G=A@rp@VMM98Lh7$K7<?ix-eCsEF_4AMJ-FmCIpHg0>DD_w3d{^A~>08kR zF~u0T`F{5%NVh=J%$s=l+D|vZcQTX#5wOMI&^8R{SmlZG-L9a8+QPX|cbjW_?s`8> z-Jly{rLo?;c@;NImv~!B`}(u5drjG>IIfGFk?WP~6=&f_tx+l0+?xP8Y>K8wDhgGv z`ghP=G0D|Z{lYnF!Ov65>Bu~aaJVmJNb7JA$YOsUu{u!m<P3GCOh;&O-prLlgdvWx zo_>5w&Jv0)q17MifU;E0p$Jn^?vz*XFkw?Dis?8bO|r>-z!Z+~#Xr>QO=KZg9O;C5 z`H>syTV;utHr1sijE-zyxmL6uK^;yFyQ^CB=qU~@OC;JHS#l`-P_&Spe9{C1BznT6 zQ{TicKyzr7o5<e@Fs?tr#&+tUl*>qdhGx~Rm+PS^DeW2R>s7#IDa%iy6cLjV4tej& zR+!~{J7?grDwKiGVnHgKG^aRKEGY>SnoG4t*+Z(c?5!Y)xgkBy(a6iBhbuJek44D< zN^OSf780JDQp%T5E1Gx*;COg%wJD297dx2~E@2{0D};DgP?q5BdW|L#ph7w>+JuOp ztrD=yju)zrLbZ&R^+v;6f!%0g3p(8ruoJOWs%(0VrKMsjPTn?=AbN!)81kI;CSFaj zX}jniL!nv?4QeZzgsK-4af`f7)3EEvc18j;rL)BgPZ<h%gP10fLV{(Iq}e4XuN038 zgez|ng>~<hH(vXNJH<5HW{L9rZgHP<knj~q4M!$hG|=H(G28PH(Nv2WN>yW1(FjNh zH*1@2=~8LSsTB8j<`<#RF7L3su}0mZMXxm~TfDQ2HV8^Im12q=2DS+_H%jbFJw!AN zb*$7qX5clv&~`T|<LpG4wope~FCiD|*v)%fLYUoa<-ZHj+;39;NwqCQwNvBjxSCPV zBPlncX0((#r5P&y&*K?E`Z1&C^{i^^m%9`r`nYCjBkC|pWP~*XbsKc}*YoI=QVEkm z^3q11VU*kk$_|yG&Z1_4rqh-|iZiQ@^0-u5fJar^99IpEo?+m!`mj2K8YJbBQ5uIj zJOTZz5vTT!r(<LtSn#sJ8S+5Nacxu|?~|!B1B|4e#=N3`%A}JN!!!&0&f}S3__8_` z>n{f`Sv8OL6lRvvNtdL}QJx9aXhx$d<<_wZcsdyRO{rPTrak{ZbKKqBFXip%Ea80J zp8<&Sb%-P2IO(hwTA(3+rMK>SYTSmL8%ICq1LW9otJgXDG!VU^hBylkVh0oPr-`@$ zQ7GbZWcrXTKZ&>ixpeT+-&IEyL?;^fTdmW~8#v}W1HK%)GM|KR;WcK0V-RcO3*cZy z{n6V3H^kQR`<}jI_!crl+BC^bF^0AH6y9Iy1sd$jx~D|Jl=rCl4JsC?C{poDC<=Du z3EA`5WQg=O2VNRE_zK$L%-yQ|B#~FC;2bg+oIbq|+=q0Q(mAAHi$umTj*Vzzp|aQ* zFdHm&1{-QvZBIXY$;ghkDl`T9OW>hgIIq(m0C>ha>CmNtwK7}RKeATy(3OdGP<?A) zy{yi9@%k(vKE20%O~m`1b-sbVI^KXFdmHs7D89Gs!A;;cgf*v3q>f)>V-@R#8rDkp zbzT*D4bne%RrEcpQb_c#1)n`QHj8>$ROJdWTBm|mW$!XP0PY`X8R+QmErS6&oQID% zhb6F|YcG3G)e66d03UiY-CYMC>=AR}-UAImziXyE;VC;R-akPvOWHVMWJJGakf@J) zcvFR44XXIgOqp=(YxLI<J!^h~>?i(QBZ5ufjTmnM)?+xqcv?Ao0u&-SiTl0$nuohC zRxJhFv+IX29x~y=1_w~a8GtnU;6XMX`FQmC6Ub&mCVNeje@PkoJ~{0^Ig^kNqd-3T zG^7Jl?p2TRlzT-+pJ^!fO8hCeJ?|%jRF^BTF;_?)q`)b~Jt#wKFwD{-V~G1ZTH+e+ zV=8A!BN~;mr)=W~79}0$?Q3*6MqeQ0PaG44{3B-x?_{G_-W(Q1=uT)vuYsdjP~Js< zjt+}<935_TA+HNnmp?Q5olpF2+q)${P95mt67AvrfQp&k7X>(&`)deb``SD?LLCpp zeR|&$;5AmF)>vMq_sxmNWmyLxKS8vgqJllutAGk=HU~sp^wEHPNR97ML2;UNsNnd9 zW>ritRkxhdI>L2|#rTs4hIm+tIrccNx6w)0U@=z#D4Gp-HKJNt_oRly!s(+Og4;6C zMlI1PO))@Jn|rQBbyVMpO1mcz2JF4pqJSJe3h%Xeeeo_!l_X6;<9Qd;b?0#@etWe? z{4mqpbXPi!FVH-QwW79XpY34#$-B}}{NJ_j55WL;S4ae#;Zty1YrW^uduDAFC(bUP zgWK9Wzk?HtK8Vs*>Fx0>Ll&Qf)DxZ)r<5k&*qGhc>LaM>Y#S#dK12uqLA?_U!z<v8 zmf?Qhv%i27)yG)i`X2o<PkN8ttp&E1Bnzf9*-s#cp2T^JycBt!`U?6)a=@BkZz*9x zjvspI4xVfdZ|Bl@w~!JEmMVqwbx%7o)M;cw>}}N@C7IBkrd~V}-gZ&GyM7(>N`iwX zi$8l_;8N_L8N9@g`sYS<VPIZ(_eY<lv4ojEostI|!aM4?6&ae0Ka}IF6*4eW!LUy{ z875u%7U=~i5oF)^F3uu5qQ!YcK5(zTRy%qTefq+TruJ&2Ph*<A@iR20xp$wfG1jN% z3T{n$LlhCgduI^M%zBWWzAnHo?Fy?822~fIh+(adhTskj!Av7;cb3N4n5EMgr|{5X z^hpv$e$h3MqWj(#O8f!VT{%Wbih}q<BMP1Jr5)|1!alw=;u74Do+H>mqdNt^?w_L$ z$EYAf3Ws0B4O!ABVy{Tqkn%NZ;ehKG2_n~q%*5upJPin}Pv8gFI0w0c&2`*D%Q)^W z{*uP!j|D;--xW3KM%sUm*(%rQj$OewJ!p+)ViJFPQ!blS40^k8Kl3bgUyVE7b@CZ? zkSd6#4aDWq?Z84U@^d+gvf%~keliL;2fv394kfkYrh#7c0mcmX#cctRJL2~)Wd@Nu z-49}~8UMDAKifZjM82+*A}>h+AqRtBgVYEH@o5I9Xf=tWU+~8%6cq0&DkUy8gzpq~ zGZhEf7ZH%5=Ibyfqc!Int9TX6Da>(lSg6}@I<EslFoO>~UVoraiXF*Bt98%UV%j?h zHgE3Xe7eVZ)q-OLueF5y3Z&9~a~$S~kjUZ>Zmf;3fNKkz(xMcs{Bv^p?EaIj8Q+M< z$Oa~V_LGDwBS|QU+TJtfN^eZe=6>I7UhT~Wj%A8kD74@tKh>30=4)~iJ8HXvFOLvl z&?i61)f9~h=Yf<aN(Ez|@8doP?tL5tT}@cWbh#le=!5ySzO+YPZ$REheH`B!koSW< z@_x`64XZ}MV>}xQ`8v|_OyJz;!W2vJ0n1MA53+H%YP3GxH|86CV`}ndhb!xd>aiX$ zX3|d%&M`=O>75K6HytX>S=+ctW5LlRqC{`|3fq4E%$a;0--O0rIOiWDwU$TZM&F}3 zVj=%#^jS*2y57V`cvXDO*)GH#JDu{!kGaRegrdDXzHrNnvRBT-Tewj&nXH%o$XVg< z$F~YYQS`)lE^;w&Hc#Bpa9UL_y8Imll5=FyhgTGCL_V>1AxuS=5N;yQeBmf+ORdNw z=?*ew%%)0>kEz(>ZIV&YQf)h*B`-sFMEa}=-x(pJLLP!X+sd;47=>RTA3>hN&@K3o ztQJv_U&$foG1sk=*O`O=A)k{$w3bubho9q3ShpB|5iulv?I$l#aghrCI%<_5l1tLf zNxn_R1{G~8K1)S!P7LvF_YxX*@o*v<(@EN&Q$DAhvM21Ey@1*sNfd>Y{0wm*l@?7n z_U01~Z;KhXQf)q2h|;O@=ZJ<paA-9itvbm5L0JlOc-G*deIxqb>n5E!E@jst0V~f= HW}E*72VQ<| diff --git a/internal/__pycache__/__init__.cpython-37.pyc b/internal/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9dd50f4c0967cf313063e651643f36f1304ffc63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r>Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9z9<1_OzOXB183My}L*yQG?l;)(`f$aVa#0&sj C3Nw%Z diff --git a/internal/api/__pycache__/__init__.cpython-37.pyc b/internal/api/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 5fa0c096adc1a7601d4a99c7609a07fd162f05ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4446 zcmaJ_OLN@D5yk*mEC@a&*-FV)63B8&-b7xdtdvtx6qPK=a#9to97%c9nl98VW|jnr z1y+MuiDWGg33YT1$vFqIa>`%A)hGW2pYru!-&z_=3<iUFbbtMIPY)lguLl;c?7x5K z-)vgexAZc;YN*`DU3`N=Sc0WikF^=2x}Dl>+dQ4o({0!A?xbF?-mdrjwr~2m=}IqX z2ffwyDzm<@L``^aEaAzu6Q{i{>cW3xwKvedA_BAraue-aVnZ?+T(MAIK)EGW|Ko@? zvHqskz9{VHR%7!!NMtow=|Ao3B+q!-YS^WdXR^HfG?UL{F-Z022Ynf9DLz*!SNOdC zsPj-sAv2xuv?wpdlb0yT_Ruv~F-<$Z7%KO17i%b_)n>wistn89<yEZmR6WVnvb9<b zr}U#J<2@NgWe`QZTntjGuSL<z0Z*$h|FhI8W;Vt5-G_I!|6E8_Z1Y_%njQX{XNTLL zWjxL^!EbNN>{YRy_hnYZDD(dAVX^(kq_bTlT7KN;@jl;?7@MZ(A@*-2nU)H$+~WP@ zRs{VL9YxLlp{ip=TD7oI_{_Y=9_n<h;P!Dp#9jOag|_zC&>lKNHgtzIyxDt>VE^=v zy`gvNo>|BBqsznkX>DkofflHFX!HLHf}mbMv(V;M&%asPKV2F6X9mAk!z<n0ywIiF z&y_Ac(IHGqcK`@Vzt4-}b*@BvBOa(CS5cRfbq*T=z7>Z+VCR#v4rDS|t@Px9R=j9$ zJd-?ql*Ia>8B}`J;Ib|cWIWKa^t)2WyTGWd#c5v1((a4)$|J7%V};clD`oBFK&r#i z7ijBn$g&O))CP*uC(%eqb%9=k(dr<dde?kcvgqd-I!%nKh&biuSmLOVDddHhS;b`( zmhCc+xopk$ZJP!3WPz=IiZ63KbkJ}gckz1^QyvN%uHy(txOlpiW5ES42w$wcVQo)b z6oFVpt!`Y$YWreCY@+Xq*aC+yl^4H+0d^qvpGfH^$w89E#CdXiVgxb7FyRAKzyK?< zzy&K};DZ&}V1yMpL)boYg@qYet5H*=o!X+pKu1^^{K(+Yzk6<nMcCj#6>G0!ioygb z+XG(oJ9__Z(VOG`MhA=m`DSz=Qw*(B>&!Z3XCrCta$`s8Xu*;Vrmms$qCA1=YMAv4 zd^Y}Lv7;X^k!0F)P8M=KgXd3BF`fl~8d`fma}QYV0m(fN-c_Rr^MhE{)kTu<5*6nH zzEllGXf|;d#^>1@^V!k0^K_^j3>1G6I~YTki<<~y6nTt_wlt`5Y7f~NJ9Pjr!omqV zVaLu8!E)bM_jGOOoG@YUJH?$L2zv$L!L)n-0F~$+3cIZr-;u!-6^**0^-4EQ5F)(F zZ_2vPBLVj=y;nRP$f9%*>=X&qa4VC&M}xdVEA&!?@}d!|2!L(kHa-><>MZsi3*m%I zDP`gXde3Q3k{Ru<qC%7+&5scl$svc%9^11Y0Riabv?lf^Um{7L<1XGov4f#suN^au z;V0~0_DlD9B`xSjD`1bYo4+jC!Ga3k2X_gSIPdlE{gx)9nLX?1))E_z!(H=kn#b7k z?x8Xs+i=tkj8qL2ZMU0pJqw~DiZ4S@{Rkg^gS#MYEJUsIfkU8;NjkddIoVk%{!>K3 z?y}$mw7ZP?|2_syBd{X8P4I1aCP-G)pG4>?>QKOG*i$+zz-N^H9r_d$)GcP?=Z=0y zSC(K{ac`mrnPx(OkMJ@kz$p_%16$ie+mPK>AHo3)xs!_ErKe<!T}}NA<0_tyj6f5q zpQC_POzbg4c4-${kiQHnfg-T-3k(=>c&l>cWx;6Lztvzb=r2%Y2}PT|qPVI)pyER+ zu2XT73bJ#>kWZ*K-P25sqNxf|&`<-V&wSr^{951zt{<3h$bwd<IaX1=(*+|sNL8ZQ zR)C@hDw{)i5-A^G`XK~_mn`Q>?byz)4w?E?d*nx&LXU+uU)KfffB-}3qQn0Ux+3}G zT82Cnop2iS!$FZ`JK>B-&F~N1+4qnu8D_Z-LR@{7ze<D@q284l#>#N4)!dMeUhgLH zZpgKky}k~09%6A3c2(Xp(-gZhO+zGgiORDcQqu4hR|)T=vS>5|)1{Sbc_(}_DD-&I z5JnI4ZYUEhuEHBLGT#VuG>k==1^7nO%m$S@xrRj0Wvs)^g(+SqkV*4>>LFvwlw&y( z=1Wc)5^~DI%=Yo*GOsg&gm=PmO8(VczWw#hFdyaWW(<Kz32#^+OHaB9Af1`!X4p9l zh3s<V@nH*kn=#Au!-BLaOy+z%BH8S0gugKrK*Azilf{8y_~^kb6OxP?Co{!J0MWoT zjK6@?Jc<jVjvylimkMKGo?!;kg#}6`SvQ|@g(ms|zRWE5JnzX+9`IftJTgpKMzBh! zF_yD9O;oR#pbqDV8^$~fJ0N^M$V3RRfV4SnG!fNglMnPR<x<^bXC%@y<JohJF)O?s zW+w}O_LfNs%|XMk@+XpDl+A~fswYqrwyjJ#nPkc+SZ0P)<RfFXXI*40E>8+ME3KLE z*#PIoo-~KZ$qMkMY^fJ!=el9|TF$s$<&<yd%d{(*J?`kMInN(0c8)T0O2RPMWZ+l; z#*qE3kaw-&n*hC-J5Cl?lpL08v#Mifx=phE3I$FS9g{WBYzyY7^X{k}ryL}W1Tn|4 zt%V`gf#<r5?G`%)b}Ksi1UUA1j`}seBjIh~NaE?kK73PAx?pnL_T==`9G&vKKF5K$ zP*+G0e@sD>GnrhleRbS6r6nEtV|YEzYLvSg_0*?Sqn*Yi6Q!4T=zjnPn9`+?Vg#E} jakBH3{@v<Ce~*$?qZ*yv@Uyqrmb2yhm$q(NY=iwD-4$ZB diff --git a/internal/api/__pycache__/api_prerelease.cpython-37.pyc b/internal/api/__pycache__/api_prerelease.cpython-37.pyc deleted file mode 100644 index 170c0fe62703858e41b73b447fe150a6c80b8df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 zcmah|&x;c=6wdtEwRV3X;z2y+BHM!7J$PG0tW^||rQmuQ210g{w&SMBn54V5^djyb zvf{~qX-<MC{{=ztz3Fte7x6(dd6~TLeedPV^S!+`0n^_;^B*B0KharR42x$lTn8pW zM4(85-%th9FbM<liik+WS46}z{1PRR2;PzI)-O0sPP#!E^@}`1XKj#R1$ZA8k|cp3 zNhksc3`KNBl32tDQ0_tC&`K+n<W4T$y!_;)7LIbIq;}%G$BP^X^@e7qnA1_Nq@xGQ zWN>7DKu6Y0she;s1$Ew7K9;>U1<RtE3x2V_0SxyDrX~46t^*M)gRf9o<%J?#hUod| zI$j2=wTOUXy!bP~yn=haN>*?`K|08UX+DK~RYFWU<Q6u(w657YY^>R;d9n)W7--vE zkDI@UvzdeDdR?H%t<0dvIqg)<aAsyR*=<4{zmTlqMgI>ir1QDvJ~z6C^xTf6zkyub zdtolMGF$*hI_#gmKBf=dV&~K}&PjJGxw}d$>a$FlaT(`&WXdfe&t~It+f8OZS7i%{ zBgJl1#!jkHvb))iWdEiHY{GY9Z^M=SR)gd8y@S4{e8NTVj9+p+Py3o@MhpHpmHNV^ zrU1<VzBI*T?$WpUS?Y2x4-1~1gDxPpR@G6i;f^#{M<6X6tY|dYE9T_`E8$M$x|ygk zR<p!6<hEfV?fqasT6FrG0`C1g5V};hSS1+7$~I$DBW9o=R_-$PamE!&3A|g336n8q zcOXYq{KkaYEeaYLI8=2jjKgZD8(Z8=?yQSkKOKv2u{yE=giW=GR<@q3h&&Czt08xz EzoW(~O8@`> diff --git a/internal/api/__pycache__/lims_api.cpython-37.pyc b/internal/api/__pycache__/lims_api.cpython-37.pyc deleted file mode 100644 index 33d1b18f987b47c39163ebccbd9410c8b34782ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2355 zcmd^A&2B3-6t-t3$)ru&^p{&eA{P}(5Tpw>2mzu$0V=h<m$q=FQIO@tPUChmGqtBp zQ<ViuS4i*#ELySRL3oMTvbwLpigVnwx3m@aiY*@bjK@Bn^Z7eJUKtx3A<&}Ve&l}? z2>BB~uA2vgFQA)WKnNmeNCFCPCv>`Q;8L7(L$8|)a(3*6`EDU7*l{lOyTzbr$N6xi zI~t63OF@Z}uZSoJ|C|Va-~?lGToex+{gWIUkYM6uL6*hHfUc469|e<gN={r%Uy}V9 zIXO@EX9tv$!{`~{*df)?=YWZ9RcYowNm3O@JcRMo)7YeYTAFW;r0#F36BWU1+3>bx zrf*W&WeHC^FgLfczPZEJR@mxxeXYK=yS}`^HkY4Poou?LrI1moc*s<=FI#D>v$3`2 z>dmxiq3!E-!_vnvBP~OLBSxhwy?Nm3S1MfLodZWAC-Ubc$X}g5D2SpMfp6cQr<4^o zRM#vg3eQvyVa#3tF)e3k4&UG>vI^ax#WSiGQjq%;x&z&X?m^E9`g87#uzXZb3#mV# zDH+fK!5Kk-L1(L)%krWb@vh9gBO`U@b%4IiPq;C?Sc}X{Vx3lt+66lr<3x|5D4`fb zF%BXtSg@k0^Ej0Q0W5k(hHYJhkKc)&gx6o~)lVAVf)&%?9WH83-s4ffu^jPM90~qW zLq^A@5hpS-Es$~2>6^xeYBr2Y<%bDx9q>H~d&3Yk#KDq^QmMh~OFU6a76A-uNk8)$ zxJ{*uAxwh^3H7K$eR#&*JUuNBiLPBMwkRq=!#8$IE}rI$>?2had;+n0l1Qz(5E@L0 zD%E9But&QRQ}CHh?#Yz>L-943Hr9LebpG1%J*^uEsEHI>2y-wH^at?V1$Y<0I2Z0E zxpb`e_`3jgq;jY2)Hmv@yOrKSyJjG8fiotQwn5yloSoT)wgL{p>y_o5isn7mlpTJo zV$D(wG^=Qj9V;PYhI*JTA5?gn@>Yj8L&?&9A}jaIe!2Z*v(l4c$PS{o7ul@_ja8m~ zUEi)-vv-#5pMc5A`c~z=A#C`1=ucMF41Z;je^y!C=Dn36@ZBNq?-2H4^&YyampO^Z zd@Z?P<}lO~Kx{USUVz|>fE_3xRmXZX%N=6vxa-(ORDKyzOtfEzKN~Cw#PjIs(rt&o z!tVbP29N*uVNmbOmq&n}1)pflDC>QVc{y~seuT4Fq;6&M+cro05bzHt1^D_g?0Dhp z_iy`J{_938C`Bw(7|V=hBaC%paRk}LvJzv5M?Ab*(O3>N)_XmTVg|)L3XHQ`kS%zu zK-vd^rP|=YcV<R?*Du&vG}z@TV(hss(sMyR;ZS;wr6$WmW<%~<lfmqDovmHh*&38r zdl3Zh++S<OTGm3mvyM^~s#Hm%F$seC8(piykJ1jNTwCqgiz0aQ{yJX0Eshy^b)neP z<6-n0ATk$lWI4^FJ()QQhKUA<mXFL0<5sZnDkbe9>N5Y+D=&PGcYr~zeOhu#6rZv? L{+93L={Wrx0)~UI diff --git a/internal/api/__pycache__/mtrain_api.cpython-37.pyc b/internal/api/__pycache__/mtrain_api.cpython-37.pyc deleted file mode 100644 index ede6468b1861c8ec68ebdefb117e4f282a8509af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6437 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 AVE_OC diff --git a/internal/api/queries/__pycache__/__init__.cpython-37.pyc b/internal/api/queries/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 1815d411b93f42927488f248810f9f207df6fcca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r^Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9wu3o`W!OH+$7Q;YTE<1_OzOXB183My}L*yQG? Ol;)(`f!y&Kh#3F}pExoA diff --git a/internal/api/queries/__pycache__/biophysical_module_api.cpython-37.pyc b/internal/api/queries/__pycache__/biophysical_module_api.cpython-37.pyc deleted file mode 100644 index fccde8259b127acd49b1f0c701bbb7844ce02c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3091 zcmeHJO>Z1E7`A73lgY;>QIaNUE5sl;WYBhV;1(f7TNMOK7nIV=biwkDy&ET9&(xmD zYSZL^8mXuL18y7;cYe)WIq?@b@p>{dNj8ZH2qX?nGX8k&_ubczA3vT)&E_nENB#Ic z{bd=UUu~y+>d^QUUgJT*5W^A;aey)U95IL0P7$kd{JIu6to{u7jo)Av@^Ln|JEY(6 zVJvCFLu)IaxuRkAp}|pr83JD%)NC|XXAL&RrkTrT*z5qaxgT6M57s7IV2inR>C8HC z1P<zK;|=O#w#-&eXMzU1%U0Q)QyfgOdu)xZLu>jCs-wV#%<gBak3<yjjg1JYd>XM- z@`tg=P`1%Kw-YIbhP+I<7Tjd_6i;=es3gOPaY=Nl4C#%DVCKj*oO_B6d9c(eW<gLc zcT;ur{tLlA5bD({?`i<+?46u^OMk)$jkuKLKt&@(`a*KEIbk5lIOcxqa+JwQH+h+u zhhoUpW~`%q9wx2QKoUAIEpD+OIub;4lgecC%<wWKp%w`MKwA^p-0(wXeh?>&lu2|N zCIT9_%+oJ2F(b}nQ)H2MF6L<xF-&DzjThZBfc!FrYNwKddYhM_Bc(m}yY2e?tVX5$ zEL)oh26V8y>AP9o5+R#o+yHj5U47QbDU-P+nAx;Yp-dSMT$K(1_mRmOVU(&QSS;s| zm})vSlRs2)E@*ZxGVSQyn`l;2EWSO(N^bm5mh<EOx5$z$Pp||wqZ2xX>e<>VY7Jg< z4~hgO_!zx*_MKy#;QboIZygLe3yS4*d>kxTEgF*{Rie*L;@7i=Nn@_HjgYy72qh9i zvZfx=irvO{vby22AGkegI7zhtNuD7jl++kPen!6^Ki=*>H(Z-8-J`7Cqa&)u-G_?8 z5oYwGE?0-98^v6i5XxLPyE~%SH6RTSVj3RM0S8|xVFo+c5(*RpklUiM*ec|6>!Pm0 zX#l|`Fx-yE8ZH_1#6n=PKzJS>y>p#7x69>K_}NuA;C&3QS%u;l?ZchK06kWFTRU-% z9YC&54}tkR!X#dKV!T|Oz1`F(j~-GXX-{%5+0#)v*z<P2c=~MCE1r=^_B_BT3I$wV z%oC~~fsk_s?IiNx)Pu?EJbAwRRi|BfRgJIh8Rh_osZ0;5r!q~Dq>vJC8$u_1z_k}? zPuc}U{nBJwUX*JKl~ov<a-`(ggWU#+_wr-h7vVJ*kGUq-U7n;`T}iYG&jiHWu7Y{F zrsW903Mr!rEkUbXwA~&(1%;2bn^)OFb&_&6`!#L1E+5V6Hi}-e{k&L*R<=Ii3AqZ9 z`4R?=4T_pm*uk!I)Vh{8H@N?08uhQIk@+uD$cp~IM4x|-I)6f&Mc7%O&C*%5VXJ~G z)}-&+VuC6wSNGa{2lFn|Wb>9ZF+K*>&Hrbty4rgk)OD8FFF-3`B%3GjeMn_7GEE4J zLPGS4&CTkXwz978Ly<KL#SQIe9y!k(mUzcbvRu!F-1?ahp>T1%<^Z#czXe;nPStPP y)<R>UF}s@kb^KcJUMa$DE3Sq1wl7`>+TJ?({PPqp95(mkv$cI<F*bJYyz>WB=(`XA diff --git a/internal/api/queries/__pycache__/biophysical_module_reader.cpython-37.pyc b/internal/api/queries/__pycache__/biophysical_module_reader.cpython-37.pyc deleted file mode 100644 index 174e2831f385e3aba6eb7047f616e05e45250c70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12306 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 G%>Mz`I{w`N diff --git a/internal/api/queries/__pycache__/grid_data_api_prerelease.cpython-37.pyc b/internal/api/queries/__pycache__/grid_data_api_prerelease.cpython-37.pyc deleted file mode 100644 index 99e79e95a93862d689292e9f28c5d42dd8503b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4012 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 diff --git a/internal/api/queries/__pycache__/mouse_connectivity_api_prerelease.cpython-37.pyc b/internal/api/queries/__pycache__/mouse_connectivity_api_prerelease.cpython-37.pyc deleted file mode 100644 index c2a0f65c2bd937caaaafa387953c8acedf4770d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7052 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 VK_`?Ys@bV>hm!Dn+t6y?{~w{f;OPJW diff --git a/internal/api/queries/__pycache__/optimize_config_reader.cpython-37.pyc b/internal/api/queries/__pycache__/optimize_config_reader.cpython-37.pyc deleted file mode 100644 index de869d3a173e1e83f85314bd75424208b526935c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11155 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 A=l}o! diff --git a/internal/api/queries/__pycache__/pre_release.cpython-37.pyc b/internal/api/queries/__pycache__/pre_release.cpython-37.pyc deleted file mode 100644 index f893b63b3d0bc96c8168f305ef868ba118c1acfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5043 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 Fe*k1IiW~p{ diff --git a/internal/brain_observatory/__pycache__/__init__.cpython-37.pyc b/internal/brain_observatory/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 93efaa4f16d24aeb86bec96a41cc01d1c4c7fa5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmYL@JqiLb5QVc~A;KQS!rj77MEq&RM(hG%vI!bCPC^n_QhF9EuVm{H?5vzE#0T%2 zVVF0}x-3VGg!dct_0{92f|?~c4hV|v*|^v}Sm?)pe9~sd4^fB6;RLFZa0SeKh0r)u zFy$J%$eq_18=~{49QoEr9!=5{4^0b4O<8McL$$TRqyvJjWdMW1Njlv@av|437&J+U S%ID{Bes=0&^`iggO=e$&_&WRm diff --git a/internal/brain_observatory/__pycache__/annotated_region_metrics.cpython-37.pyc b/internal/brain_observatory/__pycache__/annotated_region_metrics.cpython-37.pyc deleted file mode 100644 index 7c108b03b7566f91892268e927395f7e1d332e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3623 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 Oy^p*-@5her=>G?xpzi4a diff --git a/internal/brain_observatory/__pycache__/demix_report.cpython-37.pyc b/internal/brain_observatory/__pycache__/demix_report.cpython-37.pyc deleted file mode 100644 index 2271ae8a7b7b5185cf606d3727ad34c604f5e879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6793 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 Bl-~dV diff --git a/internal/brain_observatory/__pycache__/demixer.cpython-37.pyc b/internal/brain_observatory/__pycache__/demixer.cpython-37.pyc deleted file mode 100644 index 739d61cdf8c85d9594a3ef0e7252e94c667ce8db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10452 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 diff --git a/internal/brain_observatory/__pycache__/eye_calibration.cpython-37.pyc b/internal/brain_observatory/__pycache__/eye_calibration.cpython-37.pyc deleted file mode 100644 index 0c13e8cd3ecbf18117083e8227c386c2c19748a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10310 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 diff --git a/internal/brain_observatory/__pycache__/fit_ellipse.cpython-37.pyc b/internal/brain_observatory/__pycache__/fit_ellipse.cpython-37.pyc deleted file mode 100644 index 2833d01991e90bb5e36e60820905f9173f08c4e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6019 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 Q>semKoAhSTddlPf0k;$eg#Z8m diff --git a/internal/brain_observatory/__pycache__/frame_stream.cpython-37.pyc b/internal/brain_observatory/__pycache__/frame_stream.cpython-37.pyc deleted file mode 100644 index 774c48c12244c1681d59e50eaf9464e2ac3b4cc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10543 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 diff --git a/internal/brain_observatory/__pycache__/itracker.cpython-37.pyc b/internal/brain_observatory/__pycache__/itracker.cpython-37.pyc deleted file mode 100644 index 021ff22af1f6dd537f7b9e07ef83b07f644fcd9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18821 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 Q6BQ3757*ksdo#}e2Jw$TbpQYW diff --git a/internal/brain_observatory/__pycache__/itracker_utils.cpython-37.pyc b/internal/brain_observatory/__pycache__/itracker_utils.cpython-37.pyc deleted file mode 100644 index 87c5fc1bbc71af069fc7ff9379d1fd45553540c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6910 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 diff --git a/internal/brain_observatory/__pycache__/mask_set.cpython-37.pyc b/internal/brain_observatory/__pycache__/mask_set.cpython-37.pyc deleted file mode 100644 index 6b6044043f4d940ba1f67a5e3128c51a457ea28c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5572 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 diff --git a/internal/brain_observatory/__pycache__/ophys_session_decomposition.cpython-37.pyc b/internal/brain_observatory/__pycache__/ophys_session_decomposition.cpython-37.pyc deleted file mode 100644 index c3868c19dd5a5e7f1a486b19bffd3d46a5399b7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2828 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 QwRzib^Q|AWZ^bYC2gFJ7H2?qr diff --git a/internal/brain_observatory/__pycache__/roi_filter.cpython-37.pyc b/internal/brain_observatory/__pycache__/roi_filter.cpython-37.pyc deleted file mode 100644 index 3cc832737d52126e743812a5a9c50c9b05fb3746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10098 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 N`_>!QRcqBU{~Oz;gS7wv diff --git a/internal/brain_observatory/__pycache__/roi_filter_utils.cpython-37.pyc b/internal/brain_observatory/__pycache__/roi_filter_utils.cpython-37.pyc deleted file mode 100644 index 25cb45c61a456dc3e86ae1d14bb7223f43e719c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9255 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 XYZqXUI62a7d*$*<U|+GXH!lA#vpuzM diff --git a/internal/brain_observatory/__pycache__/run_itracker.cpython-37.pyc b/internal/brain_observatory/__pycache__/run_itracker.cpython-37.pyc deleted file mode 100644 index e60427baaca28d53e83ad97c9d72c065455fc438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5140 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 RtSbIA`kvc<-8yG0{{_%AgXaJM diff --git a/internal/brain_observatory/__pycache__/time_sync.cpython-37.pyc b/internal/brain_observatory/__pycache__/time_sync.cpython-37.pyc deleted file mode 100644 index b9929690a1b5db3f197b27679bd6c01ae5e973a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13290 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 Hi<AEivt0a) diff --git a/internal/brain_observatory/resources/__pycache__/__init__.cpython-37.pyc b/internal/brain_observatory/resources/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a05e920bf4a92ce1c2a10d1606bfe8d54a556590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsq+6#KL=E|k5bP;?OCtu0cM{sj89mEg5 zUqZ+ivX0}C64CtzeSP)#DUxO>=7GSfy&6ZmhYJ1pkI!{8(+9@D8ctx73@$*OUJ>M; zEKD_0%i32+oC|$*>R4}GrrFgvsUR=lh>|T!*|0_GsK!80rda?-#%FT6h1!QM4amL; aIdW=@BUc-fRNZqpKYQDhxaj|Si`5qnB|i`V diff --git a/internal/core/__pycache__/__init__.cpython-37.pyc b/internal/core/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 25d3fa39f5c40d0b7f5935732d2607cf2d12a791..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}s0Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9yE^NUjT<Kr{)GE3s)^$IF)aoFVMr<CTT+JPMK H8HgDGa0xYS diff --git a/internal/core/__pycache__/lims_pipeline_module.cpython-37.pyc b/internal/core/__pycache__/lims_pipeline_module.cpython-37.pyc deleted file mode 100644 index 3b80a22e95e2cd27de05554e0290e303db88a451..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3462 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 diff --git a/internal/core/__pycache__/lims_utilities.cpython-37.pyc b/internal/core/__pycache__/lims_utilities.cpython-37.pyc deleted file mode 100644 index 58f9426c61ff86b0c832e97c4d3aa05c5f5b7e5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5903 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 diff --git a/internal/core/__pycache__/mouse_connectivity_cache_prerelease.cpython-37.pyc b/internal/core/__pycache__/mouse_connectivity_cache_prerelease.cpython-37.pyc deleted file mode 100644 index 23bad0e26a7ceada64c8e0c95b4bcce86051f6fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7816 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 diff --git a/internal/core/__pycache__/simpletree.cpython-37.pyc b/internal/core/__pycache__/simpletree.cpython-37.pyc deleted file mode 100644 index 2ecd152904cda3908b00ad892de49826c132790b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3222 zcmb_e%Wm676rCX{nWE)K9LI^%)^$?1g^ENe&;kL1Ajqp|fd<+*ZCXJAL38MYu}sP{ zOlt|$qP2l^-yg8iRey=wuKEjE_1vLEQG%Of5fby@yzV{cK8E)f7955r`s+9E*k<e> z`WQbJI(JdjCMv-M@3MW~=A3=YgdxmhCd|M%GTWxGwppX{FIKSz&uU>3NR)l$)5!QS z(YcGFB2)oubHUn%;KDd&I00v%wM0c!(N@Hqu+dgUO*m-h#Js4ZwZ(#1L|YS=#j-ee z%-fDw5$7>7FIL3`v~{s2E}~r!m&7{SMX?0kKFFNyaKG0L9?Kx`2^T$86zY>^>JU}R zQ|7W)Y?o`j?36!bM>NJ?ag3SJ)lQ6*z2HaV8R$(2Xl%6BI=qH2^C5eBb!bs9wbt3N zl2&93UshUKXD5}^It7mhttU({;;!X$$fw6Zsi2%kQER9|9R751$W#6Y6g=X88V8{J zZzf6ghLIV~FEbv2cPENP;D*BWcl6xr@WHLl4=RwV<30C8bI1GDi~5~=k>|&e@V@E< z(J!hK_ku|IsN>%AzUn**cRC8jyWaEsJ?~k7z1=QWh`k$O1iMCF_l6(K;D*wCCg8K# z>%Vqxi_lN}c)xdNo)jk(RW|s1!g|wn!zfH#w|To8`(9VwX-@VO=*bj>OQXMxjz+)I zF@}6-0KWlqj2O@ua}rERjAdpN3Q0x<8TFnggD5G{A>rOk)=<?^Mj94^NnsMaO>--# zv|wk*pMmt8@{&M93zQT(lhKKQ1v(_Bpiyntv|YNPO0ud;eI;own|BKxRpz+<^RO$R zuga=k4@MD<YG$dRyPH+=O>-oT*wu0~vj?=f56H<Bfz0eN*F=k2M#ZeEvC1#=6{F4_ zZt=nSGb~e(LB2>TK0r|f5{}DG_$j$6Z#4`_3})6|&{qvE>HHZMGJE8UYL$+lv)HuE z@w~6+FikBfuVsFXPTwJ^DPM<FizR%|kxkC%O%R?4L&U-w!t;0jGmDI$@<1|LgDVf> zmtC<L#mVMw7>UiC<jvh!VoU^^pQ?r_$wHa^ebE0#%2;NmN+e)uBxe{ks}+{Ih>eQ$ zWZVFgi+r$JVzO9Pz#@mH<vxn~4po2S@X{C<a)dK9QsYN}I#_(dp0H?Z1oi&AK>cI} zs&*l`{S4Seh?SH|Bxw)y1<tnVkDMqsAZeP_3Qzn9pW6Neb{Sx2;1&y~;F2?HxDV0k zUriCYfNaQ(9B9f;5XYw&J+L+858nmq)(liH@&lE`Qq5q!1es@Jl@!&pep(-&LxH!2 z1&YWbxE8PCT|pUKELpg`ehPJA<Tm!F{2B1|zc}0i?rW)W!cG}wa58j?3*-d-Q+|_y z1E(;%0S|vX;sO_AV*a0pe>TGfGK!CU;YG<b8y0dz+>`52=xj<d6R2k?S)3e4q+G}D zJcWP?1I0#JBTrZ_(K5ZKAclgPiVo^=BFRIV5((Fd<V}HRQOMpT6?C59gQb#CnrjuZ zDAFh$YS(L`lj09!&z8&Na6~_x5O?&`Wkehq04}KGZf$f2>%?{e`{V|yQIxbT+$rkJ zM1KyeZlR2_fz55h;e+KF{ZyeJ0ib-Wxu6KtfiQA~Q$9|uBwUggzloM=o@nl2*_fDf zCBgY@A(@yV$(k8*^23d3*;9FFrOXF`)DBe68k(S4x3R~`hoWAQAsF0b>Yf>|cyEeP zetN57^Aq3H33#I0T8XmKqW7jA{lC0bz1ldVs7F{nQLcQg6iX;*mgstqy#2s+@z>z) z$Kqv|`gPYmc<FWX8A(4-QhT$`h&l(5K9V@g4XADVF@0`Qb%m;{RFUyY6=gO_K1Ab+ zj)Si+*`{5!=j@v8*rqdwFUz*{s#XJeM}>#^Pfj)7c@g-Do++KFMd;hczMUhuLq8qb Hnd|0%<rRlz diff --git a/internal/core/__pycache__/swc.cpython-37.pyc b/internal/core/__pycache__/swc.cpython-37.pyc deleted file mode 100644 index 4d295a0a7243923d2a9bebf904b01877adb31fa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2663 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 N@#C*<*r&$#{{wr+ms0=$ diff --git a/internal/ephys/__pycache__/__init__.cpython-37.pyc b/internal/ephys/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 6bd085402ec06cf45974c06d72d7dfd49fb64729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r;Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9xZK`Qm*<1_OzOXB183My}L*yQG?l;)(`fn4wz Gh#3H^u{G`h diff --git a/internal/ephys/__pycache__/core_feature_extract.cpython-37.pyc b/internal/ephys/__pycache__/core_feature_extract.cpython-37.pyc deleted file mode 100644 index 34051e3b9dd14064a5f4d5f62d4ac36e0c4a18dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10096 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 diff --git a/internal/ephys/__pycache__/plot_qc_figures.cpython-37.pyc b/internal/ephys/__pycache__/plot_qc_figures.cpython-37.pyc deleted file mode 100644 index 6efc4f5f58743a5d7f20b18751a84be109ce0c10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25934 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̄Lpb=cljH6-ja_@_z^*;iV{+Ov3)dgL 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 J%pAxW{|~ZYW$*w1 diff --git a/internal/ephys/__pycache__/plot_qc_figures3.cpython-37.pyc b/internal/ephys/__pycache__/plot_qc_figures3.cpython-37.pyc deleted file mode 100644 index 6a4c01acfb21d0401fc846c68b96cbf1dbae24a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25343 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 T5WYW<K9)U@-jA<?*@yoRp}e++ diff --git a/internal/model/__pycache__/AIC.cpython-37.pyc b/internal/model/__pycache__/AIC.cpython-37.pyc deleted file mode 100644 index 6ee00c653a05371b7e8338d18ef45665ae4e8beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcmZuv!D<vi5bd6xO(xNZpb#-4eeg1eB!UM)f+SfG0^-3%gfN%h>E7L8X1d4fnS@=& zgXo7Sp8N<8{>EHA<rh3zHS1~;EU4=0?yBypdhd8^Ym=eauOHNpfU%#nSqbjhA*z3b zMl;O|cFJ|2#V2+e=ui)E6?#pt;~Hu{VsUhVk?d6}Xh8{4*HDM3{vjI8TYi_dLCrq% z7S|p21^3(Ry=VpI2aE5U5@qPhs;P~a^~}hlTxGeDCwAhXRCVU8970wbKyPnT_6eBt zdNkSv<1^i;Li(nZZX*4=M&TK`^wK1&>&#B20dU|kcPY7)yV5r0*Z@URl+m(Mph|<^ z{0p>K1KrpgIO{9=6LUc$i-Rt(RVNBJjl)i0T^-LmZaZ;wGW^D117m)r!)M7GO!tYJ zDZMvV=gQ8LBdbzpwR(~md*%~Y8S7KDuA0q#@-iDI9vk1SRGO=)!Q7(22%Ya|77Mki z*e{(n#Xf$tSIr^9pGZC7z@q!SKe>Vq-Sp@jqEj=(gtx&*fp`QhzlV6C2DyNPR%p>< z$2H$(gyHIbhdo{47cL(E!4JTsG)1aJ5^znS<OEzP-)4DM8J(%+{4Y3u3}mLLB!}^` z&NzetZh;5{>u9<)F!h-#`Ux%#k+%!+lk^UHo|<LhO@5n84qNE|?Ufiwul2o3bgpx- z<vk~ZB_ENCd@=2NIaYIIm9jFsM8I@KK<Pk^(%HF!dh!2=Wt%T9kKp|32;u;!JRmG$ zajog=&5Glb;R6ixL^U>mTa+|79Uy-Z@%|l}Lf?IVdFcUS9`qxN4v;8KVV=|AJxw@T Jk8VU8zX2DY?rH!4 diff --git a/internal/model/__pycache__/GLM.cpython-37.pyc b/internal/model/__pycache__/GLM.cpython-37.pyc deleted file mode 100644 index c34c3b0b1fd8d35d02357d48d2295be3a76eb53e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3508 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 C5A~`5 diff --git a/internal/model/__pycache__/__init__.cpython-37.pyc b/internal/model/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4af36fcdadb67425dbed2abbbb313e0fb51dff4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r;Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^yA|*^D;}~<Mj$EZ*kZF#Y%Hh?LaR0 H48#losj@ZJ diff --git a/internal/model/__pycache__/data_access.cpython-37.pyc b/internal/model/__pycache__/data_access.cpython-37.pyc deleted file mode 100644 index d804a4691d8a58ae2cde87526518d9a5c61e7a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3991 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 IkNR(a4d5a92LJ#7 diff --git a/internal/model/biophysical/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 10061f040c41febf954d22be9ed846247b40ac3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{V9Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iBJuH=d6^~g@p=W7w>WHo P@})Vcb|BY$24V&Pc!WBr diff --git a/internal/model/biophysical/__pycache__/biophysical_archiver.cpython-37.pyc b/internal/model/biophysical/__pycache__/biophysical_archiver.cpython-37.pyc deleted file mode 100644 index a4c5dffc7e53f254c049998fb5fc7c8924f66091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3571 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 TL537A!Yc5FLZG6nbcOyO-<qOJ diff --git a/internal/model/biophysical/__pycache__/check_fi_shift.cpython-37.pyc b/internal/model/biophysical/__pycache__/check_fi_shift.cpython-37.pyc deleted file mode 100644 index 9a4153adced8355268a3cf0f661ed0226ad8053e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3189 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 M;AxBAF`OU#3!mCHg8%>k diff --git a/internal/model/biophysical/__pycache__/deap_utils.cpython-37.pyc b/internal/model/biophysical/__pycache__/deap_utils.cpython-37.pyc deleted file mode 100644 index e1969fa990986b476884a4b58889d8d4e85c94f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8242 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 b&rRgbIJJB1>zVRyP#6`FtFLy4W^4Zonm4+V diff --git a/internal/model/biophysical/__pycache__/ephys_utils.cpython-37.pyc b/internal/model/biophysical/__pycache__/ephys_utils.cpython-37.pyc deleted file mode 100644 index 2dba1aca35136729cf5c46e879901933085cd24a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmb7E&u=3&6t?GACTUuBOC{0;E(jszur1PF099q#<%oJIa2N%Rreh}^GVu(y)6msK z0(B+0Ate5Q7EVa~H5}*4sW;Ah;(JaT%5p%=$o6~B&-U|spT8%Yn>~h4{qk-0TgccS zq}+ZUgvV&+ZFGVOUb2J>Px#MS;)y_n7=00m4#q(6V>XPh;mMA2T1j6A4ZE_ZXy#LN z4ZCCwzv4@;@dV#xOCO_$F=%|@zfXD~0*nFdA?%^$m!60$>=*pX6P+e}o$at?)L=yu zjeR=xD2a_NX7h4x+E`0dSIWo<j{Eti2eT(6;37XfZZ}OftII-7Qk_|;In1j`_UDJg zAn8t|P0d2ey7g3@M48UiM7Dk@)v%MqBC}a)q;31oCsp&=iPTANrO|B5i<X~hAN#i4 z{>n7v_Qm4q2cyr7)Mk{OW@7IoTV(2d^pVQ)N{Q^zNUAe4s%oiBj=ri-&&}wQ;$&nB zD<9TbKFuZ)YfFS-#B{$<2wi36{;U$R+&?MYiXw+a(%N)xi_+}X=j~v9pY$v(Qk#x- zHKQ9)faV@L#(O+o{{yc3u&t{XKp|J>{vL$y*q93-;CbBekJ$xZa^XWmMV&^N_*?TE z-gu4gDij{&lx+G48U%?~(ac-uCIH1350<>)g6#riyMV~|?27B4;Xis`1t_qWY^|=g zuJVSECf7x6i%Jc7+cP%P)+`EpI`mp^@7<OgXQpDN_Pmy^6nX>az33g3g|T@xs}Hv* z2#P3T&)!*Q%cRxVE!sOME9BK2LbzS>kBd--j%kk_bnYVk+l$<U&UJ(-clyxNuaHcM zUxh>Pa53p^NHlp9%>O+k*;-V3Ixee4icA0>wDW(RM{(SoxAG74eVCHS0oo*+cVTYm ziDh<fq**z0=j@_yxBs2GP1-z0$M`ni;#;1kg0G=P@vVvBcPN%!@&;93dXOABOao~C zTBErDG~izVfKz4;SCl}q{@k)JgO}SlJZ3~Hy9|_q9)91fbm6}SVp&<89I3$_Exh9u z*$^-W5drKSCr8-NSq5Z_VPiM*-KNvTO}7a_OE`NN965%$CVX8J{D+Yyz<?`@@i^HS zmzh<SdM0(HDHpA;GS!BtVrGXuP28!w<nM_hiRN`$h_Asy)j~O`>oD)cj#R=4cn1Yu zI6a0HC8lDoZzNFPOQ>t#bak_MB5qxN3dYNU9$>x59j4722!MG#Dxp8%1MeR1qnLg4 veZGUH2bdp*NeDKq&)xkTiMVpR$vcOx@!rM<V6S;84=FE(o=EJ)y}0uiyrY5@ diff --git a/internal/model/biophysical/__pycache__/fit_stage_1.cpython-37.pyc b/internal/model/biophysical/__pycache__/fit_stage_1.cpython-37.pyc deleted file mode 100644 index 94423b856b684328bc485032127f7b8e97e87523..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9862 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 diff --git a/internal/model/biophysical/__pycache__/fit_stage_2.cpython-37.pyc b/internal/model/biophysical/__pycache__/fit_stage_2.cpython-37.pyc deleted file mode 100644 index baacc61ed6670b52c64d00958e02af193acdf9e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3220 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 M;y!R|ZrR2E1u?O9YybcN diff --git a/internal/model/biophysical/__pycache__/make_deap_fit_json.cpython-37.pyc b/internal/model/biophysical/__pycache__/make_deap_fit_json.cpython-37.pyc deleted file mode 100644 index 6f1322084cb5d73e7ebd01a796b2ccf4a9968bde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6725 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 KR;r*?{eJ+No9+bw diff --git a/internal/model/biophysical/__pycache__/neuron_parallel.cpython-37.pyc b/internal/model/biophysical/__pycache__/neuron_parallel.cpython-37.pyc deleted file mode 100644 index eba6f75eb7eec451a9626e87fb03123eb4b8560f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1852 zcmb7F-D=}T6rLH$vg|nCB~8;5TIv>3>Ok!!3%d}qX*b!M!Zs8_yCA$6Su=6e$dWQM zUdLYfqGX{z7YluXV$-X>NuObEdzDwnRnL(UH(7Gi5p!lnnmKd6@BC<QdAUlU#ee?f ze`6E!4=%2o1(UC#D-Q%GoJM3oJxX!TBIYr{W)`>R)UyShmFC2AxXnv%h*#zgFT?0^ zmsen{@G4(|vC3<F8O9}E=l5W&adt?W_b)&{X;MRv4<?&_6p2{zlhz>NB5L)*Bt0Ih zFz};REQT_PyQwd6Qxs4<2hD}<KrcgAzk$%?oJ?7tOf62Q_Sv4M8GTEhk(ZCACC<3@ zhGeB@<eW|&&3?2pJ0nLdbN*m&2_=~|vom`RFf*ImkIB?NU4KDzNjv9o;@3iVS(j%n zFX>8F&e%G<Un6+pXL3Yy=x%1AegNklT>K3dEo^15Kw=g4H4qtjS)Wo(GI~ybfcsAw zCvc7)03mi1D&1s;wH_Gi|3xGsynMaC-T7V#sXG3#&s#lz<j3RA)7TG^nEMYqB7UVh zNeV0mAanXU&%<6vg<5=>`oW3c7jX89=XMxtA!9#k=Y+R!5Z-==@K!p$tnBnfEY4E7 zyNn1Bj!h<O13zu;L<x9F?Y0(MF3>}hrEmSTp_AmKv7v7900BqdLoKTy`p86WN`C<+ zJ|w@hQ~R*Mn}cpLS%OW*83OQ-12<(U)G*R2|12>CE~`7pSC9<SUDTKx=a9(<w~bru zX;w`+4Z1oU2xCpc)L7j#Fpe7b2B9{Np8|#4*gOohDUT9)62^VA+I@$VZj|&*iHqK_ zZ!D!{(>3<dFb+%w=$3vj63SGS_NC5m^2!AQC6^G7?aRLMN+`FC3-{%l3dmH}U`r0o zSbzaBs&x>AI@E@z4$lg$(i(J!u2K0hd<$>`w(Cg47wQ3svrSEAbWY@^W-znnm;n&a zGkZ>^Gy~p`SP_9QAjOLqEXn(DQX-wkf=J1&_Dbnk3JA;sg9Y=#3mBfcz4-x*ZiPmZ z+(wt?Zx{CA2efe?x<aIdby!}CyIFp>smNiB><fA0lK*aMz{!tL1?nPHHbDOGJ8YiB z;!gFSg1S$jU#rLU-Rco(0pXVUHpbVTs_Sszvm2^$y-<yrgAt#z(}Kx0J7*0IWp|F% zY!$r6ICu^{xCY*Y>aha8!=h?U4yp}khe9--Mk?8E9BZAb?RI-K8eLV=*4U3kOYmVk zJx=%b+OI+}(n%TyEm(hb^knOE{bcLmqsO_T$?ArB4Ha2v(N!YQVG@7QoE|ib2=OZY zkavSf_)?-HJO}CvY%_N34+NyE1&bRjAX#P=QdsEggo?tR^yPR1z9_8b#CBPoN?bRW zJ*P;!T)8Pj&h;@HD}AA#!yIDcec0#S`|j%Bu%AFxJJUt<Vp`;}mj{PL7fK{M*L}mN fMNk=c2a4e^61(UIwF06>T~=i-bL+0-TKN16!jzy& diff --git a/internal/model/biophysical/__pycache__/optimize.cpython-37.pyc b/internal/model/biophysical/__pycache__/optimize.cpython-37.pyc deleted file mode 100644 index ea2c189232bcd48e08d0bb566f5da87b91748501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7958 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 QS;(1&nKA!RDHYWJ0nbqXJOBUy diff --git a/internal/model/biophysical/__pycache__/run_optimize.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_optimize.cpython-37.pyc deleted file mode 100644 index ca345f8b74ef5f9e4a1411b3b43738d1bae6fd8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7248 zcmcIp+ix4!nV%bn!{J4gEGto(Cga$-Fm-6hX^X63c<XDL)}gy{y4f8losM{p<e`Q$ z^qHY;5hQjCrD$G??Y0H_O0{T#KDU2E|At~7_GO;}^r1lC0u<TbcZM8Ns<PRAD1|xq z>vz8I_g!?eUbhweqF?>M|J@6U^50aM{|pqqfiG#Rioz78hKif#s;kPn=4vw6U0voz zzvP-~KBnBaG(}bV71x$6T3GGZ+?p)wVZGmQ8?tPKEB&V1l;u*m+Fx_mWZ4YQ^w-^W zSuTfX`y1|tEUV!&{b%LMo9=V6#R|XFf8KpwRo+oph1nk|%;sM{)ZG_YmDN5{+!wjS z>igPHRPnkz<vI5pKi7MSHJJKCZByCS-Sh4R_htS<@0IDRY=xiSP>xhpnbn*8!m;`) ze|c7ak)P)m_{)cSF?NmSG4+AcI`aupvC~pByYpn{wx9YBc#7Jp;7L3bUGD7$A&>k% zN8|eaK^pXf5x*5jyTRTT_Zb&xH}g7`w)h|xw7~k!ARatCNP?~(z8AA$$Zre+8X-6v zc6pb!o&R(czJV|KJ`%3bqq!Q_rv_7xRJX)5rh_~tGgt|EnVGDN++r51AO|T~6}ipM zvN~&gq`FnM!kTEQu~oK)yw1+Bb>t0J!<9F(>eeutUuAUJ4{^bS?YDy{<s$OKc0Xo3 zZ0{^C&=$kUi)WYb(sAiWxrXl+zT_n&V|A=}%2-2+D<B2eAqCGNHJF0U)lRFF*+DcI zrd}_JqpTVa)1qSggMrtT#LcX}9|gNSNi&P#S-b@AqGv|J!(BnLAgV}ytB5ADPoLhp zy8YdRi)7n>=(F~Y|HO|Dwr@l}7GwTf+dO)lY{vuKvx`(d%=W!tXFCZ}{>H%X?)!Tj zb7z#eG^fNRNr_8Kl(@7^iT2<ivpg?|g4FZYagIa^scx$I-)Mb_(CzuaE~HfcC@0yK z^t+5gsvIg)(6FZ+5hZn$^qxVqOG_vlQ<E6tkowA!np(%LCt%58I83~OpFV6^qJ)Jq zBaD5Plc|Qfs8d33m05c{l|w}X)s`w&sEdf0C#y85PSd^l0|0N7#6+T~P1ROMo6EO4 zHuChV(fm~DsZ))PuPUkJY^Lqungk4B3%!$7A`u0TLGW;7w~6p1cuA`yDwv)bUKsCX zCB}D#dzqaKcLpNv@+8R&$X9s!HN*yHUci?Sl@+z7jm|C~z1Xlzl%XGSbnznBP@xx@ zXk!hpk{=zsO>e@~O@#rIn7*kT(v_&ag!eJ%eQ>D~E@h7Tj^OD~M2_zysR*JyCw=Ir zsO|X4LnrBqV30apKXQf%x1HH9jh)>fVi?MuC$ZS4X)F-Do5tecqQlc}+rgM_$Z6uB zT};djFlQo&t+Hw|;N76lBQIcC`R0uWcW%GC)oGOlT`y}0K$jN={Y1iBRvO@NsUTL# z43f5-VTh$$y5x|oAxD$QO76+@xGPSwjS)n<@#~nBSV$DZRBi29b<|uYIt?k<gm{%0 zi|C&G9?8ebR5^k+`nX`1iJF4m(-P4?c^#}{<}WcD0T!BQvk@pK_v8r4SU*yBRi-oJ zBa6oN%2Vq|xsBJF=ua<>_1nsa7bZqp>DkjND~*k@x~t{-BCSp9R6o*G<x%*7LiMzf zuJoGBJk)0UmXBmVv+&N9(LwPBoj6^*<Qw=EJ$GY)cLht&ctG&z)zpbNXPh~^=nP}9 zvLiWs4{v^vn8JA?fKY`bIzg1Ac)G=#yVdvZ-@g0qy*nP>H!FW|f9u;Q6a*&15|Pgk zfeB*v0L34^wyjM-Ho&sBZwh0K5?EQ?*Mx!V5d?wQ|EWDPa5*hAak##py5-qUEp3@Q zGOc|%)A#v-IFIFz2_iwsr}nilNYZZHA6&mnhamnl6;m6%zRVRs<pW4K2++PJv*bDo z^NFJ-^^+XD4C=*5M^=}IVf!JN@XJ`R(^?g0kuMIGX)&;YATcxfQ!JEZrT#v|$gNN# zFnc%7N}z2&kpLr}q3O>e$;{;8FbzT=3pN!*!K{Xj<nht~DhrTL27%`RoCrPL>I|(s zte@F4g+_Z>a~R7iyCUvOVUt2Lr;|imdvW`(VY!6xQZX&9rqv)oHI-6ZZQ@&(siBTG zPA6WcE0GS<Nf8ln-olqWM#5C4g~|lT#q?0^Ym*WI@mPmEm}7HF{H{*QX$g2|jV(x7 z8CV7hNRhMBq4ponq%y8dt+COoppWnmW(c!>tP_ZT05tq3WlQ-N1#|6j4(ytgjR%DU ze7<bl2i6J50wKCD4rX%V3-0(~5=$XSd9>hqiE(7K=`gBBs}h>}G<T1;rB$ImdH)jv zb+B(GfkEbhL6gh`tnw&rRWpM|xy`x4Z~KFQK0)*sWhCwy(vuM%iWnA=hj-**BEi#z zX*dVZ*`Ap}rbSkg!U`od><^Nxn#P6Pw(OiyR*x@8*j%4$SqZCd8K>}uA{1BYBy=2C z-|73pp(@!}nYw!tcF*qdhzoxSCp-x376vD4NR)~N)n|c;Oyo87f;Kw0%s!{iE{r^4 zD3SrmNVz5li-2+FDiI|pNU6!mpw>ozj|cBS4be#ioj_bi(lT<(<s3EqBPB$glcd@B z+shHN^e{BHXe`oEqnG}7deD>tQb}JCq)LMP7YdLlB~<#V^mR0u>M}JZWC>7j>6Bh` z0_l>y<x_gCiLL^wrxntMV-@nL^lWJrR;7MYdX4D{1KH7DB{_wS(xfqY9Twv1(m2Q{ z+E-`e)?^uHLr$x}W|<gx#xr9ol~7tAm*j(zX;$jw7DaR5CrR*_9HP`C8zHMDDFn`Y z)9b}MiMRk#w9dM36*4t9qCdx-SX$1t=3@cUBxzZ7$>h#f1iX*s;g|j|d(bgw2h6HV z75D!+`^xg{E4iAHHZ?IoruBw`48?`!aaRU{4}e|s-NkM6yH&cx>^vujTv_hD(lT?- zeutL*CMECE0?mb9$xT6bM*k~0{ZE+i4eSNno11}8u|%#|)EDSav-F16P%WKs0l7p5 z*!IsYOTzIb3JD;`tB`;{p#naYRvWk(M*SqWy1=#4+9JzX?P;t;8UtT>6Y%kLi+Vr& z7WfYKG#p*%l_Th+wA3@FW#T^Zc52bgv2mzL4V6m*jFqW<q`+)>8(OP+MBb)xO?mV- z*=e(=f{Z3$Ts^n<4mFrNWoWg0r}|hQmyh&GC2au6?6Eyvne{Ya(~(rzz2+Fby;ZjI zW0EX;x|W_P<e}MdwcUSk_1!n$Dkws#hT!P|K8d*jnOQa{0V@0~H>A`~uK6|b3PxoX zv1EEM;3psp1``Xqxxw@cT8`E>mC<X<57YPer5r99OT{GdB}|YaE1pNmt<N`-3Z`&% zXj#H_d1SJC#sH&D9GB94MXZm}HI|6p`Gj1G+37RY&(xh0ht8~Pq2J$O{`FsD<X`Y9 zqgTG*z_SU*Xh;W2=p&d11ve%zMQ6roMQCI7pMi#t;6{?75giOVPE<8Gaj;J-*GL0A z9f<3{p>^|z8ol}jXPeJ)S7t&-G$iBQJ##{X6A-pk_n9X!N4@<heiF%X@@1jkTkA`J z;ot-doDeOllD8zjLJ8>=ceT)0^BpsTOc%GYgGh*k-p778<boV5@dhQtcUeW+B+{ta z7!GhK?wvT1yV<$(-L3nb8}~fe@ptZd-?_1M<GnlY-`RSQ*}0cN7nD(zRy8+QDs$FJ z+?C_|Cz7|sJvwu3K1!Ouh;LB@%&iv_h{@f0KOoAao;?0iucYdlwBUvV8BECIKPMiN z!a+ID{}g*B7m+BcrCC}-TZduXfL%i|7vLC7WJ`S(B~3M9@vPwkt{scS%$K5Q)QWf$ zOJ%l4HXfpMo|n};@6pf?a~nS^Bk(}}SXO~Wcn@VRa%X{TtNe8-&LG_%@l`6_pyVbc z-=^eWDOsSiERo$W{SGQ5<YyBOTefB5uWC8=S*u|^Cr1>P7(p&QwlqBcj6w?e9BY6_ zovA4x7NF=*P7*vZqV-g#$RYZTv5~i5Q&MuJq2^(F0D9r^eFy5^BqJmGIox1sVQ4Am zPImO~%#>{-v{|$pnGjKrm1XNs&{`>4-v@}({9mFK5RGv+Sw*(|9xZ@sv|MH|P%!2X zXsO8-1b=1AAJGE9#+VvnMP!!L=#*)b)n!1X0g+$vzXv38?jTfg;0$6I4bpMWA8z3t zT!r@a`wo0g*w*Z-gODLKrnAEz`j3NHTy%=Sj{~<mq3{_5rf^fP62mUd&I31&<19wx z8%U-_TnCf)4rDa*szc5txu_(H(v5L)1aZj!b7;oWIps#Dt&#_ePTdc2=|LPN{B!rq zBTk4Z;1r*`--%V0_H)bk?!V*Ry8F)Pxx&hlHraAKcvPDSMVo|G#@TZIFIYco9FJV& zl2ORR$c_-f${z?3r#Rx|!jr=)VKFNsU>m^o%H3}*>}ECr#Vr{cK5akoJ(?@Uuh>M2 zX;y-~#zMS^euSROvrQKv<V=lS8`qh|otGq4I_E~;52D{;azcwMwgFVJVJ#sCu0Upy z66#ngSyA*+z4+k7i(Sm4paHGqd7u3Cv(G*oRSWJ!Fry*k;gV;rQgCCYb&7_poD93< z8@FD|wMH8&icLzkY3;`HYXp0lIfGCio$m9+Gj?N<yT=~IH-a?a6h1|x+aPvbw2E)h z#Krr|iP4iCY4%efJ`W|=2m5>8{Qo40d@A>=#cp$xUi#LLpt7)Cd;UL!8L=^&{)LkJ z)#r+-$N0^IfJ!zC_GE0^{dzI3*y7j(`j1OnLOkRCKq?)&Uanxj;CxGN$6Oy!SU^Su z7WDX=?Zh2=i@TIuCel@s;3?dm$2^gWIy2*)9v~=ZaAJpC>F5c95{57K9t%c|6ts~F zcoB_SV#h*pz}mtIpsTI}4fC*`1)ih7n!1K>@rRn;{5R#i^%Za=G-VSJ{3dwve*h7} BXLA4m diff --git a/internal/model/biophysical/__pycache__/run_optimize_workflow.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_optimize_workflow.cpython-37.pyc deleted file mode 100644 index 83855733189c613550d98892ea2268c9dcec0bcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmYjN!EV$r5Vf7`CJno-khpN;x(7A~ZU`ZuSHuNzi6R*%o^ITA?8uYtvU{s4{-YHq ze#uu({e?<MOe$4kB)>P~nKz@EPs?S&$lR}M^_Te16g=6CoDcNyJAr1JTUJdhEbm1n z_~a)x>C-CZ3{sfs^hQ*3J%jm1R2gKqIk3wUJ=grFc**WKRTVnBeFoVbznLNd*~FTE zWvl$2rm!z79@AD?OZ+?l`dw&2UKk5b^>923J16}xn%*2?jotC2Y>X=#h21?T`2&Bo zTEqko7z^ArL+~vi20^K~9JU+z)DlB7{pC_leWk35u>*;1FvA#=w%2hEKSppmrYdZ% z;%o@UjWNCS#{FjDjKq)daDD!^{)P~+R-Mx8M(ve5)E}K{z0>MV4eknSKY+uQ&=1`K z>(8dC(TwnVQ0-Q2fV7qtM7=F(2n45W*?SF^mU~nfx=8u|>T>VH_QLx8dN{=V9To2^ Vyq_+Brvy1)@P#Nu&R>XA@ehM}kca>P diff --git a/internal/model/biophysical/__pycache__/run_passive_fit.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_passive_fit.cpython-37.pyc deleted file mode 100644 index 2f9b6911c798ef36e829a5b1a57d59b73106a51b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3974 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 diff --git a/internal/model/biophysical/__pycache__/run_simulate_lims.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_simulate_lims.cpython-37.pyc deleted file mode 100644 index 8ee4e45e1cf646c061e5daa7d683542ec6062727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4224 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 diff --git a/internal/model/biophysical/__pycache__/run_simulate_workflow.cpython-37.pyc b/internal/model/biophysical/__pycache__/run_simulate_workflow.cpython-37.pyc deleted file mode 100644 index 94429c8d8e97d93bd93e49ab35b196f7fe5f1520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmYjNv1;5v5ZztrPO@@mV@TsJ?G-r{=|Tue+=etJjS#F?+VN?9tCiT1d^vZ<<Uedu z<(IZi<zFxuJTe$Eu<y<6%$s56+j5yPGWX|3JrVz#f>)c7^MxLs6KJNnWyQq8@>Udr zPkv;hHZEe$AcmQaZ$&ZJGnj8gkw9{n0=qoWbIpH?6L!z3D$~i`8%XZ??Gy<}Cf59n zt<ndY!hWoHh-+mn@v#T&Mqh)xFczF@;rhsrPNHc?s|HwObA6Ck#^sg5=7E#^k-u9l zLWFw^8ID!&yBZL^pj24)+l_o}i9VYCQYojtQWn|JfW+FHeh5+B>M)0212`RG<u_Mh z)_dcI5MOr2{bl}$#4qr8bNaFTiQutRjneB%?UdV>U!AHur`3lN+!dBx4-RX>u5b2O zem7N#W`Os-s<&zbq_wml>TOO#z&mC0w$or~xfg|@i{$^WE_a>ZUf6E8?)M@6M8%_p V&(j6)kRas?z7Uy6`CD-)o&j;%kZu3~ diff --git a/internal/model/biophysical/fits/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/fits/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 86a12a4eb5c70459d41eddffc6374747bc14e906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VGY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iB59c=#rpB_nR%Hd@$q^E UmA5!-fQm|UQtd!a`V7Pj0I~Euk^lez diff --git a/internal/model/biophysical/fits/fit_styles/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/fits/fit_styles/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index edf44671971b0e277c2f347f893d317367cb87af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmYL@Jqp4=5QR5jA%X|7Fe&Ur#Gh7d#BL!>vZGnDPC{l?QVQP0$}8D=1UoBd1@Xar z^TT^Ei+;bSM0C4A=+A(kA{k~<+z}YHQG;lGS4}wo@xCs{ddt|bh5}5S!5OI4bAr4g z10#)eVqMipoC~YEXj!jprrCNN){vL5N69)T4pSzUJT?R_IaCH+lG$&<=5pCt&jBg> Z)*&ZpYDu;<uG>d<BL1VpY549Xr9O}xK@tD} diff --git a/internal/model/biophysical/passive_fitting/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index cb1b2cce99cf52bebdc30fb2b0bb0ff8da2edd66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg80?qY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iA_a-X#hGQP@oAYQC7F5Y f`tk9Zd6^~g@p=W7w>WHo>PvG{?Le;k48#lomcc<b diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit.cpython-37.pyc deleted file mode 100644 index 8a0a6ba1ba46cbd7cd809274df5ec81da919d8f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3393 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 UGp|x|cbazlq1W(g-l}K*A98-3ApigX diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit2.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit2.cpython-37.pyc deleted file mode 100644 index 481fabf2620b3b310652e8a7eb3987d55e64da0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2699 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 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit_elec.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_passive_fit_elec.cpython-37.pyc deleted file mode 100644 index 11c4e0a76f15ddf11d5294992c6d1b83e0c81642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2952 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 diff --git a/internal/model/biophysical/passive_fitting/__pycache__/neuron_utils.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/neuron_utils.cpython-37.pyc deleted file mode 100644 index 23add99f3b0cd667b599aa037aede33fdbb9bf99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 zcmZuxO>Z1U5bf&u@OV8jMv3?m5(aVEAnZdf2w73Uh$s>=hbS_P7Oi@>dw0j4of&uc z+SzD)07oJxe#2Uv_)C4|<iEg)*S(1qA$ru+Gu2f!)vsRlw|DOJ7)Jf)uj03uvA_Mt zo5At&2-AEIA(^C?tYDHWHY6EIUh#s5H7X(*%cP3uNs$nfsoa2NDl@r>bwl>#7S>Gi zr>vik5i1OW^nW<SG@n6Oc0!V!a{aL+AAL@jj93T#ko+FJqoW%bvOYPQ^&^)|l^xEs zk5Z(yTIi<kQ~3OgX`F`r^Xl;H!84<@8HkyXdn0in>gC{@T8x`oiU$K#pPNC`s@jYp zn|8J|gCEM#z?4>f*^2S0m@4>I6)fcGepy?kYf<gb8>y=OQ5ihSF*L0(raV`}Noj3a zPxsg93>UVn%wD_H5z_I~WDtyclv7GUd!#)SH(uaicYa*hc3~fDF&Zg7_F6yuY5WXm zJ;IA+SL~8HTG2JT<Q-pe8+Gi8t_hgYD(<+XYknDZ!1BuLqE*t-N$U3{3s{E#zSwF; zCt6K*?W{EYjgV3C?vr`jX!}48pB^6$wGz@LWsS64WUMao+wI5Co)lYUZLFwmDXemF z2ot+(QUWtESL^CT=3-nV<-FB46lN_FoWs3SH9`*Ojc#X6)l8S$P?{Wq0icYw0aQlX zD{jH?ejAtp42_o(P&}V?Yz2~D(|7EbB0z$pUz6TF+W|ZbFh!Pk(G|!GlI?UL?T2g? zK_4%38+Y*)UB<_(&Iz<5_A{&bPppeOf@QL{JYZ)#$AA~`rALl>MN*$FguL+#)TtMt ziit~1Tb0)J0F1WgqO>y?0T1Y{E?bvOaA@04ie3|{J%rkAx7zbdf<mg2#>G`xdqA60 z<LLaqu-$EiHfs2qX6rETBLnjh1f!VmfMXoc<#>2tTgvZo{Q-7wf%JLb5_1P1zq1MX z?t7VeZUvT%p$@~N?u|deG+#jk3VP~+g2Y~-RXh5FKsk`nYd}bT5>O4~ivu+y1f`>X zs(k@H9stP2#x`w8t;olswF|AJRnM(U7p(-X`iYB$o*I{)UWApVF2;t?_YehL6HgZP z_$^Y!XvyjepQxu3<DN-9%6N}@{Ke;<&~K1KzXE*;0QU~625#ozo_7wx`dshAU4QC@ zZ$DfwK@phy-v7tB4?E+H8Rfb5H(P%*v{h&YbkNc`-k4(hb?v9?Ru6y#o(CX;<6A}d d0d@Foc7WSwQK^T%7@<?LG)1{{o^57#{{=^+U$_7O diff --git a/internal/model/biophysical/passive_fitting/__pycache__/output_grabber.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/output_grabber.cpython-37.pyc deleted file mode 100644 index 492e4216279d71ea82d7c363a9f6d06405ebe24c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1943 zcmb7F&u<(x6t+D-cCx!kOIwv9N;Rs4#2!ebQUL-)3q|b(ZBa{AX|>XHcI{+mvzeLN z-lSQ=0g)3D|HDR{xbO%0hB)<K=!x%n@~c%j;K<K!?DxF(_kGX#c6GJQ(8@o4$-@=K z{-KYP7Q(rUZf?U!Ci#pFnvoB<{}uz`$6ydVU{c87kjX%WzXpRy^2e+fzC<SLkIA02 z0M1=>^C^sCv=esWgFuQwC|6}9<3o=8mP`)WAeJk#jj<&=vWqd10rp*Us}JY4p4$gH zAB~h=+-aw1_hz{<>D(xp+A7_`T54=w%3RB|^6_b<)4Z(gL}@H(mG7+k%vU_=-yhS_ zsL@FM9=iDs=71ltj2#GAcvFC|o#-1@OaniUnPqsy;N#k`v287rBQ~V?74)`bIJD?H z*6X--rHifRw_Rc<ID=Hu1!mv4*jR~kx_Gmgsj_n2v(QcHy5qdIbFHLRFRT-labaE5 z$|Yno%4>PAD0_hmjhb!JhIB_A;|_l^eF?*>-|l@ed}5R~!+es<^-;c;m;1wS%6wb_ zsZWNg+%?0hR;3xkR`q1x48Jc%LsMAwah;F1^DTwk8BS>A_C`@!rOSM_u~SJk+ZYu- zqZnhR1{=k$$~FsYi*jqDp&%n(z}b4e?~*Jl%ED$Dq{qw}4C68W+C1T19*f1*hv#Wt zKM5am3Pq!lWa^oE1jpmgEMEfqX>derg!qc^75f>%!PB&*`!<<^n`v8$-zlmCzq9Nf zVN1KZT$9M<OoresTHNv)A%#7*xwdIT1g?}qNXI%#Wp49EOcbc;R6XuuBy1_W_0yHV z9{jyHywmSp&>bx4E{qH0yw+5JE@_wo%^~J)=?fG?w7Hc=BltBJ|LEo7+9a9=8Q0yb z^tRH+D-rartqX0jqg-TWO4U8CFVbd2eq%0^_W{fm^ak}X7Hi@n5WmRVVsZI()cu}s zhkS?~032I#0?vEKz#o5|%!m3mR-<K1ab<GAmMsr;vh*Yn*fv=b30?HnBhchu5V3f2 z4*aVAZ|qUmGBx?G@}y9Wq(zxNJ6|-<&iLu~)^vo!yJ&MZHxn1_Y3SQ^ltF^Z#*<uo z`1N%P3a3?3>i6L`yhY<#g%Tpc>T6`)B|}8M9c`4Ot?Cc4ZiovOx5XMn9tT~Kh^|;% zdK2)fKE+!g{#4?h<Kx9G3%r36Ud<!%GkL)Q-;VY5AMj9_o3Kcjh6nsJCLsUk;wj!{ z2sv0xPO*Fh1-+@>^rNa&>1f}oG`DG<l8Abz8UG93msFVjUev%9l3p9MZerdSKu>sC zLhh)WH^oUve~I3RGZLK85<Em-Tzeg>vr@nVd%w3rZ%Uc(s4R2sEW@KTpON3qvgh-B zcD&NcGFgqYO#9<d8Tfk8#85-?S+#i2mkcpM{}v3@ZW4q%6zxv(PI6V#N-y@8)h+n? hJu)|7TwIN&YHWSTxoe*8>XNUTLw-$=8QLio{{n0z;u!z{ diff --git a/internal/model/biophysical/passive_fitting/__pycache__/preprocess.cpython-37.pyc b/internal/model/biophysical/passive_fitting/__pycache__/preprocess.cpython-37.pyc deleted file mode 100644 index 81bd772d977f2a8865e0e622211c31e34a5083db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2527 zcmai0&2J;O6(>2P(dheQy=%$4-7H!Jhz^yD7P$n*CQZ`z68N$$3JkOzj73VG)o4a0 zM_$|E90Di36>x!GTJ&JIy|jlO@)z_}p#MM)b1QoCzmP*VKaMP~?JQ6V<nTSd_xQf4 z4;zgt!HEC*S@4e<A^$VLdRW+efT><!;e^wO%qb(3%vrHo#cF#tU7eP^QbFZ-<>Kpl z6;V2`a&|$z8n?LpIq~Ye#2tJayv$vEo1(=lGbSgZc?!v#J|lzbCGI1;C+`MPBx1#9 z!+F9*G~5f5#s0Ah$3Zk)1WJX6!k>g`8phM%LW+e<#zLtvGu#-DFkQ@#Fx9_+<&?9} zi6$SDQ<|}qoKp?e&e;XYtkgQUxpiLB)&;$wP{hvcGkWx8>S$1ZOwQ=@zl~T{%AB-( z?rN$XUh0zzHnOsE=4KTQlV`4+9PFeO?VeK5R<oL}ai>qPmiwefvN|tkjiay9YFg9P zQ)=Ws|995ZO<slzzS3n~)y+QPZVx=bI-8_VzF>WlwQvT^)mcGR;M)g((9M-J?)1ov zol*H%8|rIGykaOfjg0o2rQpoSxy5z+{{PSYYoc2#J#?c-zE|9K3vO%pQ+<hBS|;>H zC*yf|r31a%cW_-^&Fq66-T5v(bm{2scX@#C9_&Dm4(>(FpabZx_g!8?#Or`Nr-<+d z$tr*wx}rN1WI=ZC3hEZn25#<dLe@i)-A|k6t+e@~t?%m!um6tm#s$kB@Mg9No(^!W zS?PkB7-v0$!R+b>FYf6cFQRur_2$gR+JlaLXwW~U+?kOxCjSDcVj%coD|U6ikg^4> zwjk}HzNa_zLv8W)pKTOIXLn4I%x0J*w=th#stqhtB=+-qMm6O~n%}bn!$7@zdotux z;qL`e5RZjFPxj}3Cj*wV;g52vq>)oBU;p-__eQ@`LaI@)AMoK`@G^*xM?Z~&aT4?3 zCnFIbs!_5)L5{H&l{oq&+#9Jd6+c`A<5@5j;Jqr@?J!P-jDu*qsNL-wwYz<%cDG;G z?r?GZb#*5SRXR@Qi>IbFDWjo7PTrY{)W5;$^B@g|J5hpepq^s0W;*GtOnwp^PM>`G z-tfnh?B`xxy%b{M$IJPike9}Z(k$T_*2`~Ry?XV_>8Bh2{KbDy()R~6FNHA|N0%HF z(?9*ujQ_kp1%T21U|{F&R0c8kmy5i*+VSLNoV!AegN5+Zyn5wyXfW8wS-i+gft10q zXU|0t=j~f|M9DNSak00Y=FTLM^B~PD0*VS5q#~~g)AIaf8b-?N86T`HIrKw6^(Qi! z`%0wweRG1_{qepS&wS_~q8H{R=s6X+g*NIrK>>L6aS|=(v9D6ZEN2Vu)nyVzXrjK+ z&U2m#8G^SqiGnmv;u9g0+zR$o?i>cuQmDZrul@R}LLKF~CLBf;uXQ`)lx)InUM-Bn zGz_BfMDW}S`H?i)o72ObhB-~W@^aw=tGtTw<!akmZ($FT3AcMyH49;6vW(N5zJN`K zQ-r~D&DT&%ykSJv&5ez9kcv$4TCXFuLaaj<P9|Q{@Lv%C&MWD@6ly<-xL1RpWNJJr zj__KoLR>&XdG(vHY?!;R3rd!Zfg5j1+X_z9Z?F*B#IMb4`hYsLO<l@powcb=yVyUX zTln_qWA=nT!D$;b8~8b_hqF2;yA1rS4sOHoeIt#z)U_DoFe-n58?HNs@wZW_cn&|r z25pLJg4Rc|W9S>yG^yfYTtVi{(u^~_=Ijd#51EBm{Axd8=r8teQAU@A(PhXSSh9tW zXLGnwZW)X%-!d4+L(f?S8Od@L<2&Ax4?y`dOl96}!m5Qq1$Jx@>tRZ_FvHly(E|r` z_lBrDA+YB`81I6zXeETox3SM%-#2*QAGE#gb=MlMyVe{2aoj9KcTJa<iuUH!ZuB>K z-^eecuBRv}uY_7&9IxEsEYLRsCHsb=g4Fl~L_*3A;38Uut=9_1!Cd(MUCWBRa(8g? aG7?XXFNz1?F){`}<dVbO9k=2#mwXF8$DCLI diff --git a/internal/model/biophysical/passive_fitting/passive/__pycache__/__init__.cpython-37.pyc b/internal/model/biophysical/passive_fitting/passive/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3ad35115f1b9faab7fb875645e2156eca1dc3165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg80?rY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^pi5dIx>@iA_a-X#hGQP@oAYQC7F5Y hFus0#d}dx|NqoFsLFFwD8=$_@oK!oID?bA<0|3gZL}&m2 diff --git a/internal/model/glif/__pycache__/ASGLM.cpython-37.pyc b/internal/model/glif/__pycache__/ASGLM.cpython-37.pyc deleted file mode 100644 index ba6e63ac77777bf24151def6aa7a368ae78eb2b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6271 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 diff --git a/internal/model/glif/__pycache__/MLIN.cpython-37.pyc b/internal/model/glif/__pycache__/MLIN.cpython-37.pyc deleted file mode 100644 index 0687a131d63e97b57267f88ea636a0c7aaa498f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4321 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 diff --git a/internal/model/glif/__pycache__/__init__.cpython-37.pyc b/internal/model/glif/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index c4a0a954fcd32a0f3f2ea7670884396e7c0190fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r|Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^HWlD^wV=P)AZxxGxIV_;^XxSDsOSv03}Lu MQtd#__zc7h0LV%=tN;K2 diff --git a/internal/model/glif/__pycache__/are_two_lists_of_arrays_the_same.cpython-37.pyc b/internal/model/glif/__pycache__/are_two_lists_of_arrays_the_same.cpython-37.pyc deleted file mode 100644 index d1d5c82cb3d5d8d408d0101bd9f86f9cf66b35e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmaJ<%}yIJ5cbbT3J9tma_Y%Pav)LLTUAvpRGbi(QXxfKEt9pESaIyF?Im3l4i)Wt zfO_JU_R5J@;M8#<q@Fs`d^4UOk3WqMc6YZ4iv9Bw7L<^Oba)nq&PUWRK#)XILnc%* z$$yavlk^K2W{;R5CuOQklA-oc4^hJbLL@74LlNl>opV1(T|f3BU8M;7OuoI!*)_Z7 zk=^nYTk$!+qh6${@8XO|hBNrpxmU6AHi#oIK?z-n=!DTB2H`3J-a{MEC?R!KDX(lC zZ3`3^XUZ=%wxA=b#+Fe#E1qvV^^MvT9-R)ejvHk=ex>V<*}CIk+hI28Nr>=zW8QQW zIy${4zK_hFejmQezXs()4l|IWDJ-!i|74+bR>Ip{*~^f-TG>z{x_Z`z{8&%(prhKa zp`62o!d`=8gPf1Gjmldv<AsyTj4zC?#>lCNOINJ97OpBbTnnUA1X!q1-FAuie~Wn9 z#SQ}Ly`&i(&=<7NeA@buPkOdl)U8i@TZh)v{(&t_bp7}ErpBlb_(4cWyY92UkF%X$ diff --git a/internal/model/glif/__pycache__/configure_model.cpython-37.pyc b/internal/model/glif/__pycache__/configure_model.cpython-37.pyc deleted file mode 100644 index be182c285de015cb8bd6bbecf19d49d434869c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10195 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 LmG72k%gX-&(LZFP diff --git a/internal/model/glif/__pycache__/error_functions.cpython-37.pyc b/internal/model/glif/__pycache__/error_functions.cpython-37.pyc deleted file mode 100644 index 8f6d889da165e71bcc7f60a171795a2619a7cac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4111 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 diff --git a/internal/model/glif/__pycache__/find_spikes.cpython-37.pyc b/internal/model/glif/__pycache__/find_spikes.cpython-37.pyc deleted file mode 100644 index 6969511eabb113f7630d6d1a1762cba05aa5233c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5826 zcmcgw&5zs073T~|iPB11t*rG|VwY{)z)I6~TlWJn4BK1Bt^>py#B0L^u?9<vl$L8r zl!x388&uI^9oPk$7CknnT@)yg{~-MbjGlWWdh03Zsn?)~{@#$%O1s*4-3FDw;mmMm z-kbOFoA>6Y<#JKMulJ{4JAbYz%0H+v{As9M!xL_ya21zz6pP`_JG`q}DogvcuFe&v zbaPfd>oKyPf>mUS$9861)z#X3msurOcXQ7atL)}o1MiAkux8z&JA-=FExBd9=iI7W zac7?~tLCz0r7`yfs4GhimdxMiuRaNHdQP-1yc=7QaGFsd+W-FSUw^y(@E2FxpP&8s zpC5hxyQ@u3Gw{pdp-o)J6JA5nRt6l8y0s81?<o)79%zvgYcbpAD}102w3zR(Sl?w# ziB;4zsy(jUS7IKkEe>YbQiCV6Ex+g5Vc&n`g?7+!lbqA<dp)<2OG+C-Cvw`J-SNXH z;ck@VgZ0Sv-K|8Y%0|LA5*5wQ6fpyazU*JWv~n->M7ZLtI_|<lXVd9DSy}8k&7kKx z7gxOAMz|7S^{|ODAOWm=;6Gdm{mA=n-)TMqG0g3BFv5Lw!S6+$=sBGW-N5xa7up@a zbzzL#h5nPIKGv3O(iRMoPz8m;G^X()t1vuVl+iO1X8{cosfs83B?_0h{Fy?c+-3v* zTxl_Anm;qL9%y~+J4C(4Vils)U_<&R+CY!>9li_OadUE<zN7A@Yvo`cv~o_a3|kp% z8F4-~q%sOiO$ILLM;a$hFXIX8DB57_L21BZ<|=jN5B#x4+H2zrZ2I@tr0}6izVJOk z+mh|HD53df@iHl}8Fc$sXtj{m&nZvO?U&uc<xbFaI^h*mh7%^3%46a&TERpinL0UO zk+K7}A`Zi2yZpr%gMv2HP!rzk!>WYSYkP?b-8Q%&?MPl5Opq4#xD~T#&g040oM3>4 zN~xSiMKVxJ8OX@9R5qzVR8hsKM1SguAQZp@Wt{LnAxW~wF(xAm56!jw4h(RDfkV`? zqwHpCNl9aJ>QNcRgoV@S(JsDnn<fTK%GqVGBu19Bn{BqiCpgqGMT+R;aBh`EM5c2J zvxdf#%toui3s>PTHUPle!iH5i+)zX$ifJsriT<GhjXR@szG((DW=mK*)rcd6^JGYg zbo~lS6B``afQgB(DV#&pN1_=CW@b+?8>u!kb3IHXXa0AQh*MbORRS5K)6f#lYk6DA z8F`8<Z+c#T*^Bm{CP}3)f~FUS8NS0RX=K<a2r?7td5OMZhhCKEQTp=bOZB#*q$EdY za|JoSAZSg6lKCwGOj6yCBoZXZ;}l?T4cJ>_2CMN3q3}8Mwm<zN{r+;bNgAOaogcKg zgyY|$G6Bch0XWtt;5Zj45#V^657daSsj-f8Fh}Q{1n1l!ALn<pF>ucB=ovU088{mf zoC_H^r>$aKh>KqnIPW3eG+QT`487|7xG=-;@u8kI;T8WKG)sRJbD(|zAEyKJxAz#G zAU|@-qXV-bBRN2JnsnaYBZ||c;BMH>^(bhylFU`@7J?^1N81EXhdBEItQLeone!#g zo5sO~Jq{*FjJ9oJz-waB5rJBqAnuqTI3FU!VMz3Sj2W8I#iN?hL4ZCI8jaEV+C*}Q z#>U}Ukb$KL^a@!1!T(VhW3&)At6gU+d2{*Jhj;GU%OBlaymQ08z4&wc?yWmFmT%cN z?<`&yZ_qC2EER<6;w*~B%pNEU@-snpFTO#ANyRs*_!bp!QSlXcJP{QSA%rG{B)uUf z7ZDkA{Ea<qeg|Ji5i-Fs8R>OA;jd7{0Oh(eP-Mi%5pq!!g18TT9DRs}*N|iYg7q~5 zU!)zb`iY7}MBB*|_~LEsDgzy33xIDOk&K>3G6MiO`f?L}0Bx6@Q2^e#I4@y1ztjdB zY0R6&mMoHCWWxLjD?EZFS>?Th9y!dBZ0ZJx4;}2SaR);fH7)pgU7n6^-8c6*X%zRt zxJ1@O4_BSOCoRo7y%#3zj}cM>ltGvbLX0$pAY>EYq2gT>7H@4?rB<4(+O88hl=p=R z-#8H0(gFTsJTh@nU|Mxn(yC-+xjL(Jg9{olI`;|PM(6&gP%4auJu*ZoLS~EXR>Pyy z+3xaF$Xwrm$^C}OwmNDf`Pji&m|hN}^P`p#X)r=A^Wnmvxb^o)k8<c?aba8CMiBkr zugH{V2Bo;Pq7KS~%3v0Ak&s13JWHlMz<W@YeL0kcte?Gr$>VG8x$>N~xHM%WuF42v zZcD^-Sb1$wi;8h=8%gCOO}va|sE+w%^r$D5M~ZkEm*bk;Rn5g-KF0nA$KuL?zB;*2 zd`#x?I%;)U%cC|UGy0eJmB*d?N>p-lv9Zk=NdpNd%5rS%(k|xlEg#R*H^et^yQmV+ zN3$4XpjYy<4eBHjq`t>7x)2|y(TJjSINx!&pN@>P_%t!^uKJ<bTJJR@Kj@iG$8YyS zGg|e`G~Y3!zzl<~XEp_Ldf_{!({oMX;gSR69J9GDgx8B?Z+5$2($$A&1}(E_;)nNW zIWySs1ZG7(R@_9I5^OG*=3*xdMoUt12Vy}O`n~qML~P{M>3V(-V_P1mf(W>y#U<OG zoAJCL=`P7^^$UWP39lstl;JF)wLIeMl!(7zCt*l0loLvek0qVsC_?#^i?n=B=2y1U zf<V$>I;o{y54~0(ytFS3J1Cr%spu*yL!>z``L(e*3VgD7d>Y&&)$ASzes4>$CR*fm z`x6_Q3XPN?4wJ)l4-*kb!hJtwkm7VP;&OA0%Xc7Yu$Kw-lDX+@cxh^B2Q9nhi*U%g z*{CMf#Sh;9*^+(z-d+3t`%CYAcwYuMDUcBk$uuD;c)j(mC!7cu2T%RJAl_xjXlX&u z3vtr=J#ikLiQX5;Uaeeny&JA~6HQ)O>GIB@aY7!fRw*++8BojI$0|vA*{Nv_TM{=z zt1=v(wdXRcN###F8%>Z&mG~j}uqx?__$tXH%(nR2nssJ)m6j?|I)PNE9B$>a&q+Qb zYRzvVHTO~_j!`U2Cc1DT$v~=a8@FSAm;5bEm}||XEJ*!Z<>4-5Q~Zc{Jbk!ohW1MV zjkrh!={l)Tv%uT<5?(@~=mxIYaMi}D_!sdm@(MqVvWni*Y8^Eb=K$XL*EBqMpF^)$ z#B92UJZ9<8bpMGo01FP9UI8w6bVs-_Ja~|lrq`r`uCT1L`-aKE_Gpl$%MNRHUw?We zo|!s1qXg}zlZNetw;~x9i=Tk9yh)T6DjL+Jut^?kazA5^GV+$hxQt88^^SLi07jmT U1}i}hNQ${JV^lP595YV*2Sefe4gdfE diff --git a/internal/model/glif/__pycache__/find_sweeps.cpython-37.pyc b/internal/model/glif/__pycache__/find_sweeps.cpython-37.pyc deleted file mode 100644 index 3ffa27cd8a7792125df02ef3cdc0bf83aef5b34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6244 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 SIs6yxY5S~w+CE{IZ0$c<4#k}S diff --git a/internal/model/glif/__pycache__/glif_experiment.cpython-37.pyc b/internal/model/glif/__pycache__/glif_experiment.cpython-37.pyc deleted file mode 100644 index 46e08010702ecef44da5850b0515775169e1a95c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8701 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 Rn^MYK=-(V?KYEUl{2xFya-0AF diff --git a/internal/model/glif/__pycache__/glif_optimizer.cpython-37.pyc b/internal/model/glif/__pycache__/glif_optimizer.cpython-37.pyc deleted file mode 100644 index 42c2cd5c9e7f93ee9d19de3d2a79aab5d041656a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5287 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 diff --git a/internal/model/glif/__pycache__/glif_optimizer_neuron.cpython-37.pyc b/internal/model/glif/__pycache__/glif_optimizer_neuron.cpython-37.pyc deleted file mode 100644 index 07a81edfc035222381bac3d94a8a50c79ec0d97e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16539 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 diff --git a/internal/model/glif/__pycache__/optimize_neuron.cpython-37.pyc b/internal/model/glif/__pycache__/optimize_neuron.cpython-37.pyc deleted file mode 100644 index 33c3e4f918eac92173565c5d865979d67474546a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4278 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 VK(C<(VP*x0GplU>##*t+e*ntmg@6D6 diff --git a/internal/model/glif/__pycache__/plotting.cpython-37.pyc b/internal/model/glif/__pycache__/plotting.cpython-37.pyc deleted file mode 100644 index a424fbeafdc4d888ca22ba7a0b59fd0601618270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4038 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 big-8XcM+~KgbIT~UM05fdhR**qFwtp{u0v~ diff --git a/internal/model/glif/__pycache__/preprocess_neuron.cpython-37.pyc b/internal/model/glif/__pycache__/preprocess_neuron.cpython-37.pyc deleted file mode 100644 index 4ddf614e17d9a176158bb7dff7d38a1d92ac6290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12989 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 diff --git a/internal/model/glif/__pycache__/rc.cpython-37.pyc b/internal/model/glif/__pycache__/rc.cpython-37.pyc deleted file mode 100644 index edd5e31c7aba2e0d43de1acbca9cef3d029626d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1703 zcmbtUPmdcl6t`z4Gif&4(h8LgNR<y9h(xmoIISuK-Eu<}DndwB(8xP>Chj_(S=-s& zRFgy1_IvD#6CZ&u0r!X-r@eFH#IuuZvjNcqw(NO+&+on8ygz=tyW2r9^iMC@Zz)25 z_``ZcKzs?yehwQ)94ka|_(n8>Z=~W$LKEy|v1(0HngX5h)@wvFj=w|w^a?c5(>`9j zH<Fs?wwA}j=1N)zyuDJm+&VeQi!n2-aKeB<7Pg4J8jM|78LUHC_D|SKG>>5=uv+K8 zJJg^CzlxrqAAcQ2^K_m$d=a_0Nnc@(_W<E2y2SH#lk)g2_f6D8O&f3~Zz3L#qDQF7 zf;?Ml-H>B1cldd7(Q3RM?6rF65;S{geyfR^TO9Y$M`+$zQacE~AoKo#y91|I4{dR~ zO?;6yJC_)vCIPAws1{INPo3=jfSR~Tn${@xQDnbBDh`<{riwX1jIa<VrVH^YDOk-4 z84iSL?qyEulGK$G+DWF!(Tvo>j4Ctn{0@Pk1hbCVlPQDiq|&6A8UxpZh0{toR*FHm z8MbdBITHcdvElgedW7TZen{#8@u?-%h%jT=%r4z|m#bSIUtMVnZUGUo;#3&GXwQVG zK~@XqmQGfP-eGl(Tk7Yca1so^!z_0PWTYzQ0(1`y%1;pMz`d0(1d;k0st@PdfrIiC zOJqUwnQ&91Z^R?;%@*L`YkAE(6Ra4MQ>LbZ6cvQr$AVkpD&oeQc?}U<MkSan{?+W; z=>E6e%^LBk*)S~B|FZngYTL5!fBFhT<6ileHlBKV<=>TlwuoQIdJ*ZGCY2U;5i6l- zs-$MBq%CEgJz1ozu7&3PUE19&GuquOk43~CO_!0U=`vI_Tm2c$R*H*kr9;yRb4H%i zJIbEqy3#opCO7Pi-UZ!l7MR^)-TNA1c9ZurGXACdt2{gyes7^qhHT9E;E0_uJsW<d zSpjKgpACgRwZjVj$QH0y^>}87-^in(l}<c_K0b!N16>7?u>5#mYUnu#$Nr?^LhYAI zj`mG4sAr1@p@Z{P2j|ZY0aF3*L++sc1#bfw`v5ldL4y5!AK%9W=7(_?sQb7B^LAwJ zz>R*Jw)AvT&y3evWU4Alcqr&6YZ!wyj6r}g@Gu4&uetH*q#s{j7yh>f;@r24%L}1Y nK7zKMLamrk1m0_i*T#0+`))r14^t(+@MU5>oHlMpU6_9Z)qV86 diff --git a/internal/model/glif/__pycache__/spike_cutting.cpython-37.pyc b/internal/model/glif/__pycache__/spike_cutting.cpython-37.pyc deleted file mode 100644 index 2ef0eecf27ac852fc8d598781a06e7ef6af3da14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6707 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 diff --git a/internal/model/glif/__pycache__/threshold_adaptation.cpython-37.pyc b/internal/model/glif/__pycache__/threshold_adaptation.cpython-37.pyc deleted file mode 100644 index eee9b03d722451b83a7eeecabb355ca690a05a16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15042 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 diff --git a/internal/morphology/__pycache__/__init__.cpython-37.pyc b/internal/morphology/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f12ac12cabd8d7f1e76adb5464661e76c5131010..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r|Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9x(^NR{H@^kXjEA`{!GxIV_;^XxSDsOSv<mRW8 N=A_zzobefm835O<I2r%| diff --git a/internal/morphology/__pycache__/compartment.cpython-37.pyc b/internal/morphology/__pycache__/compartment.cpython-37.pyc deleted file mode 100644 index 16624885f8a68a5eb73e5250fc29d36d9faba17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmY*XPjAyO6t|r}OS=uhHnB-?2!|aiK_}P&gb*4`h|A~&xI~pKFZSAOi5=_|)T$g{ z`yiV*@s)Dr#8=?NdkNi&Bmewf-e13;U$3us2`v5No9G0D{6b~1d=L&`yN3XhNSc#^ zGD1ng8uSv6lD9-M>0J=%DgWF{0!iPKp8p#n$RI^rEC#{>Y<C|(k%UT;Fi9o5Ac-eE z>BH&E0HVWs_0SZhuvMXSm3rWh3r}q65Vku4sK}gF^pu@5y8|+7WfxbTr04WI*e?A! zowF-8Cp-Wxyw+AgB0QR-r6UOxWrNxNyNRn}Hz~_}8V`(Au{l0fX$2Wgywp*g8tp1O zNh@P}-MX8(40NGWRr?ykY9E8^&WCBK-dJmFvY{qvo=GJ%m)SqpFjsn1jgzRzWN9*8 z)nN+PRkjW=$>a8T((`KHsr<xt;Kmlo`bq2>9DmBg=fjUqSvM48A^XSTi_p{ID=nZs zDfWj-e|AGtD(zB0Q;w%@c$6IvT~?__rAW`jNI`54eK>ix2OTJ@MZQ-UTaHa`M$^6Y zhK7DQts~AeomHG~LVbr#5V}JndJDdg&bF3j)L*!!6y0DU|JU?A14U9Gjhq5ifb4|b zC12?r-UDdfrGG`X;bm>3N6>0d8#_?t4Q9cvi+4|EtlNRt;sF^pf{b<r0SA?=xv{Yo z2TP_$&DeU(u7ahet{Gno>-cAdqaWw@Kye`ep<6Vjv(5kS)A$T}0gge7LUCSqIWLTy z<S4Ik{%Ioe)?#l#7JCN)$Fu}k(c&yNU^^U0M5Czr(+iUa3p)A>I{G(s^zmIJ(ZZ5+ gZ%h^w)nWTyn`BERn+}?rMlafSU*5*z*u@U}3xRY7CIA2c diff --git a/internal/morphology/__pycache__/morphology.cpython-37.pyc b/internal/morphology/__pycache__/morphology.cpython-37.pyc deleted file mode 100644 index 83cc39064989b3d6c86d6c410f1df4da468ccfe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24105 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 TOYdlqd6(-P(GO-ATkd}Y$2dUy diff --git a/internal/morphology/__pycache__/morphvis.cpython-37.pyc b/internal/morphology/__pycache__/morphvis.cpython-37.pyc deleted file mode 100644 index 5ab04179637b64a3ce7820d7af9817e9aca78ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9996 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 BouU8$ diff --git a/internal/morphology/__pycache__/node.cpython-37.pyc b/internal/morphology/__pycache__/node.cpython-37.pyc deleted file mode 100644 index d3e6c4846178f1213150038a2be8a0a09419418c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2942 zcma)8&2QT_6elIwmL2D#UDh_;2eglFHPECV+bI~frg5+Z%iJRA&{oJmC?ajkl_ix_ z+St$zLwnsHFkpukJMCZ6X~0gs@3hPI9;G;m+Z3hE$0zcUeDB8}pLA<>wn3mofBfS8 zGfT+d_;6S(P;Nq1_d#&NX-M3nr7q<LH=hyL;1;hyYko_3mDipTUK7?+)2(pZt@65C z;|<s5Gj5$X-3Fg^XZW1k<n!(<UvTF*-65?rFJX1k@eORCRLZ&zt-1vwBLkAr0l7ea zHbAGKQ_xM&4bTnHt<-#OWkzN!lFZD^MRJ~GR%T)Q0{5VuRwbtgIUVJ6oLfUL?dO(y zBva_FL@^iFi{=Kza{zS&b^Irhb=dyjV10G>M<t}%_4*!P+4G)w(P(!q^87gB-WR(f zdaQQiL`2F587KXb+T9BFc2$sy<;3$JdOZPi!w@X^!>d7*3K@Cf)nP1?ejLWV(N%O| zB^l*s#l9Z~TzC=Vfl9r|7w;epHV8tS`X^^VKY^AB9U84wP!7>L59hUb46*Wgf?D~E zsF|77GXW)|(}M+|{Pj)Clz1KzmzKzbRz=oOM^9WMImnF!KuX3MqCy~%a(fu?B!(C- z!c*z@0>z&MdJ!M$q~PK=p{h0rL4Z@pC+eCdx2%#|6;Um?^^^jiY+eVx*}TDLpaov> zS!f%44kDP(tqwprzSeM{Y>Pw+C8AV02(S}G&d$Ac=LmPF8-zle`Wj(y15X?y{~oHk z2_mBzVFXYji~>@G8Ne*U%&Y>^%BmnMSq)^h2iUV3M|)e#Iyb;4)BBAQqIW^3?s(E0 z3ZQ_RbS+QHq$^qlZ&T3|@~8_#*laf@9qB1H=_nD-<(=C<tX*-|?%(cQac-^ctZlLO zMyI{Kd3VE!rL%TtbNyIX>uA-3Ri_)qUOL(4z)51Dau7#O+|@uH8IPuoM{h75PaBWl zU@WJNrN@JP^{NZWYoOX}qg~=jIQ!!0FE3wr0`$J@ZB4>^`5%-{tC7<vr|A^y^J=ke zUM&{OZNDFc9M;WisT6_*JfHL9A&jO&*bJUqb;v9t?8*fok356o<W0({gv%4<)rU_! z*;B7vAjX0yNE!PKrm95{<YJW``x&5{<5}eS%Au_f4ATW$%nv#ptbn4^0VYjMmSlj} zALu&(@(zHy10e3ehFa(J_Xehb@pWfCjvfn{I%!`V-kUUbJO@%>;Dy21+Y5!m10N~j z$&mxt8GwU@yqk(uo&^^qrZ9<-$ahhk1JP=niqGkDs63DJ@roYHIJGo}Wa+0J=q~Uw zEjs-hH#J_R=_GsN$>4Gtt{b3aaNjvyLTPAeYH4X%(Xy&#ZHaLE*BU@p@5uLIru+cK z$)i3BrBypU-U~Q!2?e^+GIG-oRZjVIp!KedhdR`sz)m5*h+!P31|84oFeip50!80+ zpiNLR@|?VYFqa5~0Ix?XKZM?vp&`yKcy$e@_n%>`CsG^%+JUjc1qmH5lvJDyo?zo- zSIn@*uEma4-c<cqrc9+Wh<dp-P;r!3`2H|ag)^s|H^Ui>h3Eplnh3RNdA{Y)2?y}C zq{F@j3g%__nmFY`r20BMMVorJeh#5A##@drg_jDa@Y8t`r2WHt(Tyd1OJHh*cZ=Hh z{UGwwE6yajC<rVR%V7`+2W_44$CtQ+|CKMhuL$T?F!)w?BR9dFqe}(n_nNyQKZTGJ zs0B{uhje^KAJ%c;JFS`AW-NlY5@UITv0=>jL)4p$J=*uea-_x>kA24Ed$6EBpnS#; zJ*D7n){nXT2)jQ)@i_|I`WS=srNyI=b0E-Gp<<hsVPCfAn@!uaEj{)Yx2eb@m{D5u z@)9%>KN|Iik^aiatMT4I_^Dpct#xj<H`r#|t!w4(gF72;Rjc>Q_CeXYWxHL@xzll* u#hmR8y~3=1TK{fytG&I^d0lw9{Z)bA*LXh_eg)aoHtd>RTevr!mHr2>J9NJQ diff --git a/internal/morphology/__pycache__/validate_swc.cpython-37.pyc b/internal/morphology/__pycache__/validate_swc.cpython-37.pyc deleted file mode 100644 index a09bd46bb73cc2861b69e1c5820ce41f6f17e572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6270 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 QSThqxtRHHxS(BFb9~+P}%>V!Z diff --git a/internal/mouse_connectivity/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e9005dd399340f16a91a1cddd4a57c37887277de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsqdKdI)n>%{fN=Ki?$yajq5!{?i2l0dN zmk{!WY}0fiSaiR^P+tRnO1N3G!-!$TQB0G=Lo~zqk59W>$Wy>3NVtH>3b+FGazmgU z8JJ6?E=cE*f@V5@>4V(cLIxXg=0TTmM$T3hZ<sQ-6tN+w^4hfl6(1qg(RMcWxl)#F UR4ViRbG)pbX)9a}@4VUK3&;FBc>n+a diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4c537114e84af0dcfd2d63aea683a23f12344fe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmYL@I|>3p42DOr5W$03=oWS&;-eKCu^SlTPSCJpX4#otSvxBaV&#==J%XK;Sw#Hd z{}S>di(ap*M0~qI6Q2!!YDqE^hql0~jq117cU3gyKi=2nSZ@OsLBj#;a0e&gTF)6$ z&lW}+xeD6n$RQQ_{7?tIqMZ&Dagalr!5(GTIhn9oLL9MRaLLh^0gW7COe0kk>u;|D eXG$i|bjHLOVv5EL^ZL=59K9_aPMZf`V)X%ok3#PN diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionize.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionize.cpython-37.pyc deleted file mode 100644 index 350e1aa6ba00a1a71e3c13e937b66eca2f4a79ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 zcmZWpPmkO*6u0AKCOey*Zcz)AN{9oOIk0=6DpG||=^}AK!vR%D(ICr>-Pv@UKee6N zomF~3?X6#d!>%~-m2&08SK!2ZPO=&mM}B|o_xyhE`8m&yj%EZ#`RDKAZb-=AsEh-2 z@)V|h1Vj=^H7RIHDawHkQU;vqu!z!#k{^i-W%Q27NJVd1I+4LIWHI>%JjsG~vCOx* z&8u>W%JUMW{7PlGJB|Q^r!ajqMN%qB8b~UGHAZ4Gd`D7<ASb{hIh8T+i9C=q;8S@B z(UR`)Ol-%)yP0hYUgwue+is3>Cbol~(IG0P7{UA*1AhVJ^0St_B0rGdj^8jxThcN~ z-!e*G$G<|_5F}U{bY2AA0q0g%&T`&Ot#ZOSvk1G;D*dtxg<0Efvbpe_ZPe~BVvfM? z-}h%vR?n?6b|ub*Jb585M7djiUy7_MrTBWK%B@{hwJL1}w5rc{cJ)*KVr6ruzN$sG z5o-m$T7!k$oaUudrWE?Ls2Zy{98#*xL9yMg-`fh!o1xyPSb<SFsdrt>d0ys@^8}z- zEC!(oy}Gwo#*@(`^V?uC*6a*@o&agdHEC%ZwCskxVOX&T<eJ{VIu9JX4*M0L!2@y= z3_FppCR-XTe|m_>B%}nm7n3xxI?ogr#)zHm7+jt=>w>cG;-b+mul3GMz;h9r17ID~ z)kPPc=j-$IPzomoUtjZ{%+c&16FO_OaOy6o7Ed5_9?a?0{r#M8tupLN9LO0=pY)d? zv^0c9!DjgeHhHf@!@Qzir!9qMq02?!k@r{wk2Q@&nJMck^FMU8scNwXbe}?m0o^e@ z{s7&rRfdRgAjfO*=pKWBxLSITw82A^0nM!p?|2iM6Tb>p4@v1?*&ht>!gcuOX6dnY zrpa7m6yH|5DO7r7^EEWusLls<ytMs1S)XUpdvXiqROze`m&5b>Fz-p#xVmwl1Mnf~ z1l#bV{VVBBmWvphwiJbeXE)=#sAQv2PB?$v2;J|PDI8_)Ai0m^V<ev-!8f=^uqg~y zE{19GR~QHIMe#JA`1QpUqr7Z<CAh&hNTaeT>Yc$3O7D!%i5rzwMjE^d@3|Mn2lf3I Rf7=884$JIwO(0&v{sWI1Sn2=( diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionizer.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/cav_unionizer.cpython-37.pyc deleted file mode 100644 index ee873277b2e5972edc7512520a5010870d05b83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1738 zcmZuxOKT)I5SG-B>F()S?;3XVAPY{&We#f}0(%Hc$i`tqAS{8f1jK|!ZfRyZRzFr! zk3FX65bR@qgiTKQOS<NizmQW(J&%k{)Tl}&RhR0kD%CfmQG#GpfBeQofY4t~*bW~S zU&GXMARKWlQHd$WZcQYiq~{*>fP2y}0~+*az6{F&9c=U>8pC-YlX6Ih{az^3azsZM zeTVpfM>mK^VtDP*N1XhG#_`{98yaI9@nTWvqORV8Fyvy&T4{KZ8xZ5d2nDm$AUyfL z0%^hIy9%_6E1}#Er);s6b7yfocBo#$jzAQ1M2YY?=Hv!lW9q|t$bBB%V2}bH^1%(F zA&+<re83a%F}3NQd6nahamU>}g{eaz23;f2#{fY&865L+ssBVO2I-&QPrsbJ(?aP9 zn=^iV#x7X3oV>1BURRubF%i{5PwGZgItN-e^QE5rP@GLPK!4G&{G81M{3|7B@bi<x z#i3&Iq^w&lGB8q!+&~n~a(xCd%GynkPI9)`3F^36+E|IaRy@nk9y|XD5Jaw??IS(j zsl3TuAl-1>gV}?2)zslz)R8;90dC_))eW05BgVdpK!K+DypTLw8>0uT%7r$y+HORE zc9{XJK1yri4BN*$OB>avu)B5i`8`J;YVO>HDo1Yi?tTJ`4*iO5@f}+EoqtO@(s>=e z^Dyds2jJ@PwLWT?5|v4gHe>ABILmU$w9Ya$1RFHYnao@1Fb3AwLQd(BGs7~b6kBTR z$@;?j^I|rq(KZ7Q(WT<jD3+Vd{rE9h?Mn#x34TPbKDvi)Uo&@T+;Ab<A!|UGp;cf2 z8^?F>YA+{-bWqdZqF;WTkX5)EbRj3_NF8%;6;(d>SCR3$@EWheZgA^E9Q-@7io39j zdGHE#5%3T=0X_g8+y-6jEWiKoXOJLT(c7y}XTq4GnjKARRWf4)Kic9ws$0{vM!6Sa zeJQ5K1_~l#XsV5BbJHr372GCsQ5L$H3nlD9Q9_Mp@J0%u;cy(<fvjgUxWW2G1(&$; zvmQIsHeB1cA#32t@NuFJ;EawGyVw=FR?pmCx~OGaf?Y_Pph?Ltv!=KdQqy?rt)`wX zI3;bRT$Nc5tUt`y)27x2Dh<k4|98dbpsrp15b;TZ4@rbW;^T;<IC39>bbfX(o&ReF zdd8b^WTPyr7`U3*B+JU0x6-ZCEPLNFxj7m3wO9%>uX$gOY6Q2dLr0!F;=0Wqah0M5 zK%AO(Qskup!Koi5{r>pC-8OCelw``a0`&n98&BIRH+3zw9p*JO9_TN1rIl*{76NwJ z=Ys}STS7-6RYMQ^uC(8IlyX%HO<=zPx$f9sz2|1{b^q|AS8L>7x!TdLJ*{Jz;*_|! Grry7pqtEXE diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/data_utilities.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/data_utilities.cpython-37.pyc deleted file mode 100644 index 7c274e431fae9850d4d6acb65af4a367b2b888e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3200 zcmbVOUvC>l5Wl@YwsT37CQZ|{h314n$P%=u1qrGOK`S1RP!O#U<rK-<c-PJ)=RIrp zTx#PyAj)GAAD|DZc;YMF11~)FEARrp*|U94Vgcgp+uNO;otd5a&FtR4a3OT?s9%5J zzppyZA2gUg9y*`kHILB<N3hh1%P)(W9lNn7T;V-)VqaVoz6hSNI1n{a2c;$&VhP{6 z2*onK4Y49F;JYN&#j02XXDHYsr@8S8(w*HlqYobX26!LfHJfO1=Y-|%i8pp$GQqB* z#VU7K6JygaT-A@)xoKxAPr8F_V7S(NSolh7QTSSN(PV|+=lQ{Jj;>+NpU)rM-TT@| zZT9#97dQ9$cU%qkK2;nt1i!N<)f2Oq^`(N)zRdauL$miqvcG4NT)x}q?IYfmSevHc z5J$HXl}oL7daDQJvIQYZw)5mkk`K$dCp>KpRFbJ=ByS0x^VT3w(j-r$x!E6TA2v}C zjElx$cHFjo49OF9yw)45*fM!Tu$PQExjS}#WXG<hxR&Cac)~mJ^Wda528Dji8M`O- zJUDE;EO{4jSPA}2LSQ8<RTA<L5|_vB;fknTbwuqtVgSwF*cEkA|7q5ay`S8U2ad)j zv@V*vNA`Q-oQ5$I^`oU<m=3KiOV$>5Oj>+P35g<L11z~PhOPIY0XSG0J$r}{N95M1 zlcdr_Ms|A=U{KvCKai1@9jT>i%g7*hGD5gA5W9$niLy?F=p-TvBRpIQOqT=__znqB zQD>m>)e-Mykh!mUq9T*)K|3F4Y3$0;Mpx!mC08oTc@F8L^)@%98ChhKu99N3-Q!Q8 z#<EC3x(D)Z^!<CsqirR-SOx{D?Bvmb>?NiTtrBaXZ_%1p1d`oXf8mMOC;D3!Up;P) zMjO1}PlqJYI)`Xw&a4*oH0yRTQ}~JMWEOEnAmsj_ThuV_@m!Pa*ypgfs9_t!zKjF7 z?#^u@CaUl-C<2`glqdpoz%joJsYx4P$M%{*yjHoQMd=r>&TO;eBCHtVTB=*UM4&oQ zepp*6S8c*-N`PW5&A4b)OV&U%Z=i94kTu-U+hQwh%MIBU+h*_Eo~5%@S6>3xsRBc# z&8E~AIu>9yRfJn6RYE1k+pVH%2EA54c`8#AhgHAnX-ZtZObw-Rlf`S*wB2R71G^Wy zja3AyRq@=!Dnm;h7BWrcZkGBKftj7JVNlswT8S13BHS002(b3`DFz`vvepvVQKW3C zX}a;{ncmjiM7)!zL#kMrstlWFIKNFdzP3<Q8Rs|uMczWcTs`HNdG&X&bwds$7uA@) zjNbnV=B257+Wbi*tXqchG6t>5;QT&Wd~t4mq1|g__Z-tlWbG`V1g|y)ksjIu%~;^w zN9Sxnk3CB%Yx#Wj^CtDsMLi70-q;@p!hhi*?7`>*TmR^^o76u#2~nab@n?as^@pdn z5|jn&+SD5}o>oV5i-OVH=jUv=b!Ks*x|3WOZJ%e9O6u;g=@lF21sCfTZQ}FdVnv!R zJ)2au_)5hzHL`@-Ry8pZSkf<7^ipaWyDM<I-lpa%HD@Xe)o=iBnhR8kJ_eiFKr<;a zRA}(J%w_r-sHb8}wZO*q1v>vFw!_<&>r`|FVvFboM?Oxt;LywcLwloo?j8r<IO;>+ z$!mE%Z*;t)Q2)$uUBXR(?gTjB(en?N#@=B#S+(@sI}W~el>6A3peD4aSsvZ~2h?=a zY#&&mBWp2a`V$~zYMMtQN?&_=&CQjbAKjQvapawR+D-=sr6!sN@)h0V?7>v92e_&Q znHExycFa-I?-Pg@FGD#C1RYEIb*v}6Rhp*>U98X1N^6QOh-=NPm|?!Td<JzIw_&F| z1%v%8OIt<#^DjTsI@3k{%SUBr<>3JLjGin<!AR=N=yfs&keyR~3YuGU6LZ*%uP-*N z1nvzoW`~-Hnlr$q%GR0_OUV5Se1?`)$aPUa8#p94-A(kal_-7-98I=M|A`BzT*ZMJ z^l&$&GsvE7_6W7-ldZp+3Y*OUO#<c&vZmRSu5quIi9sqqrU2U{YIqIS2pU1SgSLiu F^Ka}VaUK8w diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/interval_unionizer.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/interval_unionizer.cpython-37.pyc deleted file mode 100644 index 6a2d15c632f697c387dd5c14310f8db3b4eeae94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7683 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 LbledtHmv^wo9`zs diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_cav.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_cav.cpython-37.pyc deleted file mode 100644 index 7a4df7dd81add57b382ada58ab7df85a76174a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2265 zcmZ`)OOG2x5S|&2U*qTQW;eSefw>VMa1d~cA_OEy6d{rbsbw_kxZB>z&MVzL&f1KT z&~lB$nUf>9@Q=`3xsbnrIPmq@V>=MM>e=qEs;ld(s;>T`({T*^qF;WXUt{)%UX(uz zlg}_D!-pBn42;kurm5#vU=a)dD?uf+iM_$9qz23m>S2R43alD5Lx(tFi?oV$Eog@w z(%I;DNsrZ8<41$^nf1sRG+*N+V_@bD=FfcT$I(M9n!e%!Ba~P;kNhwR_+!EOz{-!N zTzNDabE#tC`OFJxlJ_+@i-R=eo*dJFV_W+^ojr+Q&|h#dHuW+1busD~_c7$}K$WpF znfVGFm6d_znQ>(<%>u1x6qtQxu<8wi)sBp%RY>ZqN@l%U@6!7lSR1T)X6#{3fno0+ z)+(^}7PD7X?CYHAQ@S{%2Z^<;sM?jWv@?5E&k7&DuPA%f*y!~2?qxNru9`rd4SKM( z*;4IQC#$jo0he0g@gYvGtv$K?M0K<3mHEK<_V&nH)|ZV!;|Ln{wMN!>*30Z?I4P@U z^?SzizrR_>=~@vH``H2PAG4E}*0Ndby<WtxwmQt3nF$7K^mKzBWlebOsB5r!3=M-J z0-2T7*x5@P9=0|T&E-u=`_j$Y@bh%pVee!ecH^FrwN@utM_c~MeE#dkubZoix}LSJ zkdeZ}7Aou3!^KHRFZ^igmgVC5%+=-MNF~y-N(GmTTjMxPQl-__1>_b5<WA@q1x5}8 zpK!rZZ=Ou(7;65X6~lOqVJyzxvctXWe)r*WalGB<%5$3VHB5S2*el@0^)29T?3V`o zkWO(Z?g5vm^EI6J{sogBjiOjlg+lids?Lcs6}T08DoK-3MR7yq1!;}x%ws%~zM2z9 zrlFVkmpqV*(~w@e>$#h7fhYh5iRI!z#-a!e2)R@UI$wOWi&nb1Thg6~ICPmW_*eyV z1iSEuv$ZApcwiDI5ugHVoGso@M4ZqmJVwa1f3Avm8QROtTNR)B0Yz`1fxA6_P!YPL z<?a0jkUOANQmoyM;)oB3bIwCwCg(_KnRmFU*_Fmzkcb77gVVeo#M3E!%xyoK#G<N? zs9_RPm0K(&y&$Fxov4hy&~1erO0Lqx^CLJpqk-;Dq^G;nUikA`nt(VbT`kz9BCk$h z6V{`I*cAQ?U1h|cfO2l@@S%AYVfIRY$x#_izQrUt*?}tdwjs;yz?X^~C$Ut}Kns<- zO?izb36EG_33xQ<6335lEj*ndU1M+bThY?NaCY2Dvvf$1j`XJym=^^jMO&+y7r8kj z9YJ604kXR3W28Th;|tFAge9`oK^pKL{AP%oF!<Nc_wSCL;BLqfJ*RB=l)j+ReDrxl z$8p5y$0Hui<R}IoImS0m&gXLUrT=t<>gONe9$(;YVQ&Dgl3m;>(gmmQgmEgl2O|-R z84r@0uVp%wCB-`;jXdQ`ney>m?c%OeJWS?!1#<n&$gl7*EXQnP^v%9?&BUK|YSm1~ zw5&t(6r-;PP{-_UG#$t-Q;)q_#W5R&1@SIy4i0k1^Cqe8V4f%Rt1UYC<Q3^}il!Q+ zVKNs-K*?FjbBNmJLs>khp2B-7Y%PE9e+dOtN`G9`zNl%{2U}BR$cFz7*>GF^WyprQ z`pbn_-;{3Ao6va!U!lc`KI|9liVW|4Zb6VY?u9W+1OBOg$fee8BO-09VYRKkiFxH8 D!$Y(0 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_classic.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/run_tissuecyte_unionize_classic.cpython-37.pyc deleted file mode 100644 index e7a6ef0133898a02081013ac6b0e159aa1851bf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3441 zcmbVP%Wot{8SmG;dLFjNkF}HCWD+UBAmK%c6rsqnfWQgl%Wf2@WYnsiDvx{J)7@Lu z<JdzF5^^Nq5Gfa~$QCF54gLrYedWTQxpCt6)lBz{cdZC9R##Vl^{ek)Uw!_0x9eN@ z#ee-h|NDkz{gXb*pM%Ly@o0uYSi+7hMsFvwCk}ILn!AxZ@t9}kc2t|x9m}>R4Kp^) z*kV3bJyHAGVr@|u4ZJ&|DOz}Uh5gJL`me#?IvLu9|16xOk$kSC#Mk!oQ0u82U1#!( zI85SjCe_F$EPgJY`tofQ%&Z(L3g>GmMdOY8C+m;atqsxm`h#_5iyCIlJ7;cR{UCF4 z`^Nr-^_$0YCv%||Fu9#O2i6T%a;I$_S+73*5;Q2-IH|;vcoO{#kM3Yth{ZMnIwyq_ z3aIXeafX+pv%guY0oZ^3^7&_{UudcHDL?1p@CE;h$JeJni}@&t1^?t!#+UjuNoA}@ z7?bq;TA%(pd~vG7O#Ue4qYFNk*c(Mah>NG-FICK=r;}u=WdJ6z9A)8Um|ZW{E_oD8 zmtK3Srg4x}&aCLcDB@a&qr>#NXdXp;@<Q<AF0}nO9&7f|SY`o_M^a~r3PKS~czSpg zB_kf`V@wwKd#<6BF|KK1Lh(4jC)~oeQ?6v31v*pHQ8rZ){ETCUwxTea`C_20s)eCP z6H3qjNrdtUPQLyQmPqjjSklgIJbDKMa%QRd*uFzP84KK#1$zqr&}N-Aujr*XgxkxI zxNjJ-i5+hnL41s#$oAZ7lb7t1rS^q=wO~TVsLCDvlGD&r<Y(4GjHi;KQg~6Qv%<x6 z=oWtEWL<2mX=;%6Md_n<$-UTqAkY*5P0CxYXV+~Xe?9y?b`<F`A_eG2Z+bq*W8f6@ zZPbVz9Gx99%RPBbfbpOI@x6bw54VmN;+<kMoFJtGC3O-_GaPT$zD%xU6bPAS=WjTm z*d!G%ft<)dBLU?j5@@ur)h^~$j!^!R@<yYd0FhA<KqzeshaQ^IS)JR4>KdvGs&_y^ zuhH>GL7*M=TQ7I+7W?SCfp1GR53Ds>%h0fEjpiF#yQ0-@>)6*Z{JRI1=wZc~yIJGL zntQo-+sus?zjL$NZ3{@kY*gsYYPN-a?!1=QZhauzOJu)V->zmmge1$B*v=BWTk5o= zcbD|NYUd-;jdosr3QX_LLV^6@sWY$78^$O5u&utZHE+D!$i0`OUoEd6S>M{Pj=x;^ z`oPHcUT)<z@s4=+8)x1$yB`~GH*WiRGq>S`1@+02x}7)g?0GBO0oPq1ECC;4gm-g_ z8$3_)#CzY=5kG&4BaeL-u6;Gg+puDP-VyKT9Wgkva{qQO?~v4Qombvc=MQeZ>{0ID zAl^oMADR2%$!u@JFT!{{C{NKK6aySGMRjEMWRy%&q%PJMnK>|-IXL4Z6ih|Mgl#E# zCQ<oDNLy5KU}pypfCrxqe*5G3Y_~!W^f^!Eg3LB5a$v}_M-^eP<XSRV94g#1q0}g` z3v#jX2AQEO#7V~K*aa!i&Y3?}DDX7ZtR;BHQ7rTY>xc16x>o=@Q!tB;>DG!Sa2eso zVVf(GjHMc1vwo_Qa%YL!TB9vtdz@be@@f=K^*tHBo=$=^L^;rGx0(lZ>ybnl$KGGb zd=N0((up#`foBI?DSkcsconhoZq$P_l}rXARIoF;Mx>2nq(Dqb{Bx9hKgE4T+@zR& zA4a5n4A&v-<fuWGtkPpuc^?M82qTV*n@596{;;O@C{y~$G($F(X%d7wDLU&Fk99Jx zs0^AMC_GZ=HT5E_doCxTPS25Oh<TZpFo7&D1r1<eqJ$pq7mX+xkD-6zh4EQp3c9JG zMIB!go)wOmvW+O=0@r_;C(4NGYne?`69`2u1`Y%3lTxc_kW-5KG{svobG59+ofcWo zSh0%m!M*SGC>J%fKNHQoGx$yIld&6%P*qI~T8m{wWJS|#Z$-?KpmMvS+kx$-iOv8( zXQNkpiaJlxe~H3Hk2UNvKa43Jq_Hx$I9)k~zw!ucmA+N1tHUwcvB2b+R$BzMFIiXd zuT~ORt5Sq*j*{d;inYa(QehAt82{!?=%Sf>7wombU^%|s!PB=logEv0&b~vJwd3^6 zh26)vY44kLVC+3$dwA-09itDdLvu5B+<RYGZyK)ZBgh%{)H`^wgR%oXL^8=kZTj`V z^gVPLvtL!~WruqBc87Xs*48`J!w0%kwaB<%{+}EvZUL%uv?v$NQXkfTTOq1xIF{=g tvEF?K>IuwS9Tnr0wa`?p8XD<IBBqf%rXJ7yi_mmBPRD-FZT6bpe*ppOta|_e diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionize_record.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionize_record.cpython-37.pyc deleted file mode 100644 index 1517d7803b17df272d4763b3c8225fd304680836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4877 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 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionizer.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/tissuecyte_unionizer.cpython-37.pyc deleted file mode 100644 index 4ea9d4cb39d7191e29cf5e8cf369244ffd183c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3094 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 diff --git a/internal/mouse_connectivity/interval_unionize/__pycache__/unionize_record.cpython-37.pyc b/internal/mouse_connectivity/interval_unionize/__pycache__/unionize_record.cpython-37.pyc deleted file mode 100644 index 2924428d582160aab4c99f0b3d9d6402a603c7ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1747 zcmb_cPmdcl6t`z4*-195(v~8)pt+%u+F2wns9LRBXoZl_f&{%pL6&1X*=d|{YJ0Mq zXnUZ$ReR#XN8rSV;S0=_6JMbx-kaG>wy;zjc#)r9=K1~m`8|KJx7Q~?#jii{-$O$F zz&{&`KzIPlCBP(+RFgR!QcAueGLYc~k)aCC!(k|+?@8ME6HbwoR=wOS3v2EKe%Vj} z!UI_Db6|=LsU*WdQn0Rl4I>%J&IK8EWLNIM-j%WJ!M-E=au@bk4j{^26+bC*Q{-#4 z&K{1Pw_NyS%$-Vv=FTM(W0UgoL}HaNR=TX800|0#k)Te3^0%-YmhZ_qc>(!=e|iKJ z+&(h?>-j>fxhlMpkF7N}4Xem0J*gsYr>^SGPH_K?*ccqV`T5KHqbE*TH{!=!W@CQB zi`D31!G$R#|7@g+r5l-rDx3gr7RM_$`X(Qb9N=_s!NrVE71(MGC**8Dhp@KbdVg+8 zrx-XXl<@g7_p3&?<eF`&+}{YSDK}fJs+h67$US42okQpeUEkawmu<BF84`=VkcPGc zo9!aoL5AKN)&r^P39dz{xmN@Dy9s-%4cn>(UI7yNd)HMoaXWR~VayAmoHuqD1BxpK zaJ?g!g*6L4g<Rf)82`+rRsYWzbWQ0OrGNiQ&>JlPjZPq#NVp>sxZH=pUXfRH0z)B# zi`bL1@SHv(=M>s9<UasRk58L+=ZVv~P|3uadE(SkS*{bV^J$@E!mZ^iS9d&ieJgy& zEuSmstF7){OYJFbPLlfx^k4f0ojA{}Pt2r=dl&RVmo8tb_SA7cJ-)_J74nLiI{mwu z<esx8W3ZOFcsuS)tsE4jk|npf^0{*84UIDRq)YgZT4yYb>D^=kt>+bj(B_5N<N1Gu z<*n<-cD#+3@iDNRoRJ?t7zNMi^WZFaO<$9j!AInb{t`Tc_io$!@G=D1rxl%5beRTK zgiur=0J)uvH~j;wO_=%O@Ducp6WJx}wC#-gLNAfX4zz($afjK~Dy0@}(x@51TOiw; zz=pe5AglwXL9MX$k$Nl#SDj;<HPdioedpTnM`;h=j{>@dv8vD5+{jX+JYeiu$@QgX zhcRgcV-}xKyNe9R-tHm8{@+5hMZ#jQW8XVG8wXJkN6oL+9Hmhey8N^*w(6SkQ+W4k T&2`SI_@K${5Z{oxszLY{m%yC0 diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 0e463c44b5d34456eff2e3a5de537fcf54c0ae7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYL@I|>3Z5QZaIh~PmibPGEX@zIKn*agDuW^kj~N!VnSEp5Gql~=O$2zFLZ3h{^k zn+G$)tOkR=VA1^wDZUbZ>Tt4Phb}{lofvku4^gM~AD`QLD)#~FAfW_3&fx;o$|XVJ zNW(-Tor829DHKfS%Qnc3$z?DRM;?k39FTXd<q3Vt3`ML7Y*x7@pyDHhMKos<+sxPQ hm<mTKmQ9rt7@H|&$V8>azJ2y)mD7#IdHV6q7GGGsL>&MC diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/generate_projection_strip.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/generate_projection_strip.cpython-37.pyc deleted file mode 100644 index 20b21289591ad7634b7b94f3bb0ecae8d847eb42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3323 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 No{P8bHN6e5@qdqGJSqSH diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/image_sheet.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/image_sheet.cpython-37.pyc deleted file mode 100644 index e7bd83f702ca35c543390dcaf3abba6072449825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1487 zcmZ8hO^@S55bY1!aWb>J!?G(OkWdZ?$p>bT;DA;L0ee75C>&N?tVmYJ-AO!Sw~f2K zLxSgkGS}tK1<i;Pf2psW_zRq<YR^Y@I_m1SU4DM=Rdv37^k_n0=)Zmwe{e$n!He4w zz~*b1=5q*=NLrF~SZT`qHBY%;gEah(NGACukz7SPo{l7aMUvoOc$3U>jJE^6GN66| z8%0to37}EQE(xG<8NeFIP)4wZawKC|BQ=s^Ik_Y|n#S?~kPqGD`%0|TtF=-#XE)%u zBK}L5<|7D}^uT+^%(I@ZXiqY#4|{S-uUJp7DFrov#bz!l5X>apjn={lYugraTqK%C zX_+t=7*#IQSgZ3aS7rG(X-AOo-<y{&=06$Lnz>jDdAtzkLT~2ZXpz@iiqGaszc%w4 zFiZ}yZq^$!|DjmSO<~n1jmXdNvvX0FkRi`b3T;)ZMR`)yolzNpXqDUIbzwIrO<SMh zMXfWt?y7|rMS0?RX9it3ZZ>TQoDN``2m)afI$_&)?u|Mg<lOm%6-J#u!o2b8l=gH< zd-f;m`S0|CT5t*+<2wfKLAAjzI!gjKUUoXSbzK@aYD8-bQ953U#`~58EfR2Ssa+u2 zm2uJ8Ij-KcA;g#v0-<vAE`A=l5c-sEkKX26ZgPr`V7yh{_uz&lI|3B3oIvp!sAs&# z#zTrNraP85E|y9);QwYI$2_@ojJ5R6J!BPNF5(Y1(uh8$+b4Up@cEsIXdwFTo9<)S zSZFZd1I9`EhFvhruL8-g!k(Q**S_s~1|0b;q2SIhh1pJ_(7CWm!<19cX$pNfHN{rF znEv|dMKW?sH|fD%-q4_<vR<tUy>daJm$i$Qbz2GRLbDc)O1M|rqQ5SxJKJ>jq1MSt z*=%_9A*9_XKEgsg-&1^_m7`u9sQFGezH7-9=!SM-*ZhK82DJ%#-Um>V;I<~uAP?9z zWnq1NhKhtPEbst2sy$hMHw6*U)(;6EExMwV*|M#x%)f-^++a5m{+LBHV%rb)h(FAp zC1V$7nHH7GGB?Sxs+L`e`@<~zxfA8^#Gj=034pdwF}x4K9U3cakypyDYuTdYJ#zSW z&>{`53pWP;T4Nr^aTrH&<nJeOJH{LjdW5^@5YkY06||>!C#n~C&Ifxu>V5EsCjN5Z P{1u)HuRNykV=@09AQxaJ diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/projection_functions.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/projection_functions.cpython-37.pyc deleted file mode 100644 index 5a4ca1753b941e405896adb797eb8f6895d9c743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1109 zcmZuwO>fjN5VgJe?zVv1Lo4_Li$r_ifP@NaDJrT!%b_5oXi?;@z1wsXC)m!ii?RpQ zUb%8^#fiU^E2sViPRwLMR0vBmelxZw^PZh&tE&-#p}u|QI~_uPVDM)^O!mOcAvi$< z%}7pTN)fY+#T}SCnUlM*`#a~wzHo$lLE=Do!iPB&T@i_u3mQj)9h2VbHPj+K+5{q< zrY0>^9|CWtxf;tM#YGr6Gq3|N6Mz%6CYuD#v;H+Me8&<FpQT2-5Vr2;*MrA{w?=9+ z;HO+{pYV@d%?JC64+|yu!+}&&Gbl=_%n*E0p3cqSReCZosg(~(KAiBegtJ)&JH%us zRaR=nvz@%Cj7*@2l0yq!+xbqZi!%%gmDtlNKT$l*ZYD>SYFEv6Id8gfbSkw?uwP_j zkOH9^@vy}J95Cea8qC}WXUQe7zM>0aSxwLBg4)idQ<IurF+lDTjZjtE?|F>_JSNSZ z7t-!)&F6=@$d7WM)PAO6s*D|;^I7b1J%+jGG~Tqxs$6OhzSdCQ(8*slwU5a)*qHn! z+r{2+H=z*?n7#!_W8>F&V?#tZ@JZqEmdXWy|52&QnFFM}+N<dkV%;-9))({(TlllS z4RF1tTjZQRC+~L`5MPFMfaDjUbuXjZuRC?PN$SpB0y!UI*5<=HykZ+|{t;RDANJmn z+HapukH)UB^HTO!bO>!}Y;-A)lcmNst~uqU)GLr~+)q*$rg2AE!L7!BA$BaE$R^0E z%%){F??oB~Y2}NZF;7+OfL>F*irF<h(Jd-lRyJwtHr_I7SeiEeu+my8`>*2bR_0~K zt-K-oI+QXS;FhvS)T3)`gLc90F}(%(9&4{b-$uOBL`gELY^7zAXnbFBc$`92dGzLG zOFRxuI@`{RsWeMwuB!5K-V$&1Sl%pFzR_R%r?t-_*v$)3W%4OryFn4UETCN)bOI;v Fe*to*3zq-@ diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/visualization_utilities.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/visualization_utilities.cpython-37.pyc deleted file mode 100644 index 8b099061ff2d4db197d0b1075dac0943833dd6fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2766 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 M(y04p+C}UA7jRX~H~;_u diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_projector.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_projector.cpython-37.pyc deleted file mode 100644 index 986e0546bec49dce763892298037e7b293633932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 zcmZ`*TaVL56rS<ej&oUdp+J`w)D+Q6q;{dSq7_0Fmz641v_e2ZvbM6k@g!^3vBQkB zWP|fi!7u19NYtnPCBOEG*FN^C-x+VRG;JOE_}Fvia=!D;H@UmE)?m2O-+l@I^ceet zUKW=P=QeJ=4HL15C(N&&+_&&<C1POvHm|-pz8i_iPHF?suXFYTi=4=P!y;EUUJJh& z@yD!FdyA3SPKTH7ScPd{zU6qw>&9W0j0Q3o<#7_{vD94(TwDUqZQObXMlzpA3=80q z^@jO^CdJdPrt_U>Bl4p98;<2Pq9$5u(u-Qr+8g$o`*rxIqIKgpq8gTTx?F#1=6<NM z=dzn;s%v2uy68z$-@~oX!sKkmBR=Px6}(^pFu(xT&g4>@V$op|PvW%Su2N|a7vptA zSxd5hA8n-_r@gFf9>(%zP{nnu($+HRDWK1OXNt=4*RS_(?*62u(!1e)7;Wu^FT?a` z_f8sivos37-j(U0-pz(G)m_+ZxPPQ~AH;jRI?m;n!?1f0_9glz2_m9{t8to3m4?aH zK{nDdz#u6yjSu7e=<4w@<17vG{n21A4ddkMaW$4HYz>b}F9;~jAZQUB#0|z9e6qQM z-qs?lYeEp^;C68v7$3knfibscBC_UuY8Up*&YhWCu;;ZopLug;V76!V!UEW+@*G5? zo``HLS^>YkGdYKZbgo873Gk~d4|AmRmP+@e(^NFKs=)y0I6v^$@AP_cDxZLWx|gYe zUw<s~dy+6J1v2;7DJ<yAJm{LQrZlCSXGyGc-+e?A$g&m$m^27Fj;hn(^`6QGK{$?e zS<AD^alr9Jmi2rwmnm;$n$&4?Zxkm{uvl}j3_OiiO-KV|tHICn4eJ!2e7*|y|8-x2 zPstOr4ET59RN&7DRI3nkVPIx6v3Q@_xjl1G2DgCsycSvHn}Rq~r*Htd*qPj@Rt&f) z>o#TGesyiy&a-3xt7&`hsQv2t&Ffp&d(*ZGqZn}au>f;*>hF}rr7DEEI*%rG3dZ*y zNgWP`i8Rpr4Jyb3)GSnG;|G~PjK?y$zuj>S^6CurdyfolQgsfdteFMMXccg``hF2H z$MAZ*1!(cJCg)e-t%7&DL?ycDNw-0>4d;Z)1=QfcQ=34`ni_Oplj1=g&dD*#T9NZ) zw{^q`0wzm*Fg&uld!-8+LJn6KUppS@Gt8{1szeTtyVm6W)s-Jdc4_m`MMD!8y14Z% znDLFAR16$=Ew<UupYDpOGj*r6g0`4bxJ7L)rXJp`!Y;hI^^|e;;?y%}J+k6E5H&H0 zhw1|ir7ppsqBMuU*alMj)i!|Rnr)!fhZG=s;n){>IIgO7fd(MaduLaisc;X%GzyLr zxrPW$2{3DucEaV=g#X=TSv3+O+W)3%x8YFLatjsX7jP&T&sutdyn@dJM8=*9vl}2l zb89LJ2DGTE_Ku>1OA!~|(lG%l8sa+l2aw)UKylS3MXba4=Z&BYL!C=#D8!-Cm5yDC zZlV>Dk+f-2(R~$-wI1jm1wBwGQ%Bz+xB^0a0p?CFtpf3n=;c{P&=D6524grzN^zD= zEfV1ZB1{52=Y5=TXBoaSh%vPbwAX-@1qAHzH@OFF>T_TO)?9%ih{CzRz!BI3p|-&& z$6*&(B)-K~xy4>=KVx7~gSa-gD(u!UziN{q03p!^rOl=6LM!?i&Z_|DS3ln`t#nx0 zT^T1}lFpBYQhkhm{@G;*!Y&ww3I|##23e%2CVmT2u^kU^2I4qSS7<6%UB<&8?l%VE znCJzK_w7UUF6{)?w?NGmLbi0+lZy)6!3cT-h6xBW#JOdi;T!y{HMzK2i+8)xrfJeC znuhqJ6O@f0z)D96`K=&$F$$BaMUm`RVz}I0>LYwBo82VTdLZ+Cq)7Rw4w;k18jlVZ zMYX0kO|<kZ&+(dGvr+fFR^7C9T1I|w_Qj;L_n-V&5xB17@zx+al)A#uNk@a>k@^Iq nluXf1GQ}$0Y>)menX&$B0i}1V%I<sGD4LdnRqz(~td{s2g?gfO diff --git a/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_utilities.cpython-37.pyc b/internal/mouse_connectivity/projection_thumbnail/__pycache__/volume_utilities.cpython-37.pyc deleted file mode 100644 index a9e23b25ee28abd822fa8ea27e3749c91d49b461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1508 zcmah|&2HQ_5EiMQ)vkB#GzeO!1&Td(fy7SGLxG?u+T>6aE!+TZFTw%>z2wS_B~l<M z8=FXnB7K59!3yoAucT{FeubVoBRT#l(3S!@GvsLa@tc|Fv)ROhp?>>?{T_JUpJ==v z6qK)F+Ly3!kCWUhNJ0qeG^YverJn@743miaJowd1Mm*#Z$e53K406oJd;)U9clZ?K z4yVW7Vs;5py#?uFF3+WvS{<zjZoxnq!F&PJeg=#4wxss9wDnqYrTe$^0QI#GQOVIF z?5HZckQu`^$>dw%j!U+ZD(gn5%hw_qgYu)1nN)CnbguKN5Px`P1Q-4F?!~j^&sG?_ zWT%WDoUjX~Hp_1mTWQ7F=S!i^?NXOQ*%hq1Jl)vk5AtMbr4x_gqBE8W_&3kNgP$Er z<%CfzKP+@*MG8TbSUGsG+Z>igzd}Q+)SXtviDEK89MGhdleu(K*n@J@J%r$AX(n7M z3kaW<%&<a0U^_;FkSUK$;WKDov*?3?vuE*RP@GqLZ^_bcNJAS^Q%?3Flb?9Nn}2kP zq+epr7ekzdZ!mI4(k`$-ThGt1#JInAjcO(Em3y#hp@sm<E-||x?;ydGe?j8NmLi%K z>w+Gc9dL!)@i7J;(D{YtS8&V}cW1a@zHZ@paE%AiB1u5<1Ms;4bq}mNp#Fm%M_$pb zU(=QhWfk1uNupdrPO~IX+7$l_Z2uY<mn_rpXA0GkxzmStz<q$=kbfNbHe|VH%z!fF zuAv~wThjOgXSLr_d*J+Sz{xhODcUV`sEaVuO#l+TL+~EeVIAy4pKN0{hIP_<P2_gA z(;7MpdTZ7~E#Q~=b<~D^O}zf1XA#P9&gFV7%%iyxw#wc7Lgx8gX*WL+^CA6$&!5fT zJZT=y-#l#$7Sm$aAmM!qlNefJm1`@yQLZy+y{ro^m{DD{1`e6)3nqz}(UsyLt=p8M z^Pzvb$mv{KhgIm#lJF&*2@~Q4qhw?Y>@@=^VI~84?`mVnKOj%`hLf9(-S;j7@ML!7 zFqmDW*J~@>Kg;XGK8qz@o&qYJ4(^`<4vWw9XiQ@0!TTubJ~5cx#k8BG>AG^25ou~L zyXHPD$@o|nWiGz^>3j1L+M%k7a??{a)EV~AKp)mcAM6&QzV!PpjK755sB-ZYGTsB3 N(ikE5aTJI6{SD^YZd3pO diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/__init__.cpython-37.pyc b/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4b50abdcddd5455c299f9d27763522872fbd00de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYL@v1$TA5QbN<5Wxqr&@1dh5H)SE33dz1xI1`*=j?GaXV}u#*RaYfrOhLxOO?4I z<cI&8VVHlI-E1~>CVt#ts9yvAG_q!6ma!qZH#Z;cKU_DA|M7EwdGZIrPCV3*mPdF8 zE`G}pGbdPi<g57HB1<&pwl3md>F9+N7cImyoY1mOV;kvQ5i52KO?An=V6Y>MQRzxr lDkYH~V^IvEq_HMGRUr_QhOlhQ=j8d4Q{Uiv`0?B9egR$eL^}Wg diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/stitcher.cpython-37.pyc b/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/stitcher.cpython-37.pyc deleted file mode 100644 index 378a414a879436a5388834fc381f05edd662e86f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3921 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 DVEURi diff --git a/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/tile.cpython-37.pyc b/internal/mouse_connectivity/tissuecyte_stitching/__pycache__/tile.cpython-37.pyc deleted file mode 100644 index 0ea0be1e87e31df762155755f470f268a82b45f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2935 zcmb7G&yUkq5cc!0ctdtcVPOTO;L@rklmb<y9uPtlr1nD71N0I_wY+{WiFX}4ea~UL z-sDh0dn<p#qMrIM`Pviro_gvx&xtp?ER|}>^L}{zJm1VWGk&zb-ZXHffBX{uea0~U zqQ&yEF?onveGI`3&Jv?njjU&WYjBfWFAZ)9>xI>`IeTh!>^IOfx)I6cWn%IWw|WL4 zj2`1g&*Y4oFO8nXEpB79xx-zI4sUP|qs!NL6Jvv);Vq0FU*{Vb*Z5i9#@OWV@pBl@ z@bmcUW@$f*6A^j%09}NL=HKI1KSIpd%m|E`3CU&_q&c%8t(gO9&s<1n)_`>L#-YdA z&f3h_vAB5&=q?$0Zr5{K!`|QR*Nnj%_`cgMzRF>Me-Ni!{5<!w)Q?7Cnu^3fSWM== z%0rneKg|6b2Y2VU{DUv%ozjxoUg_vZr5k0*bewj~($VLXjm5j2rgVV<+v9L3%4V#B zajaCF4oi1Co2FdJ20gb`T!^wU4&^XTRoO_gAtuApj?+O_x`RxP!@Sdko=67zNJ(yz zYb3~N`WOis7_tRX+Biv-?(QCqe;V>UHvjqU@xA^JN=VfYM<Ktx9qxtce*fz<jIxx6 zU-m`%T=lbwNL2)xO-B2w|0Le-t2h^*Pr_&y81QbAK!fkziPK!jG)(S{v#AmR4oO9n z$Is(@|4t5+QxWawB2ampM<bxYW+HA+_De4a;xx{KfH0_w5QgPiE~{^IleL)5ighB# z?WK0aND~*07VgKm)fI@`IAokrRA<H^xUyrtCf-;&#%8xz&t*Iw!vvp9=-6@{FUbvv z(xyk+nH?tEv`wz6#3m`MkwQRzzlNov%raP$6&u>N`e8)LLKlq`b8Q?YPG#JVInZ=` zRhbF%Dw?j0Hqmy=_*Da_>08m*rZqhqK!?(`TYOrB+Kcm%zu*oi3StsTD^AWkl3XPn zh>mjvT%M&};)-TX$E?6>Rvq_%qySMJQ3T6io90zktkvj`0k5NS3z{>wgUX|`a53Ap zCpYyjKma)HVzz4okkyqG);A<5kJKofh$=3XX=N*XE+iNjPz+B->C)=M0BJT&wR;5r z3<oZvc99iVwcYPjJ_d$drlYux$qdDB*OS*zjV8*<Q=*<TLv-astz$0e=+fSt={@T> z3#eql4K_5)DyHA0nZGbjQ`H|(k${xdQb$^snE$L;#f6$1tEUy;g_B9LPkAs%!h8^m zg!@q@C8aGYU!MK1uXNT<(1{Y8#}N{{s!s32Z<;-&nNCV?JWcW#-(Pa=GCe-dwep;{ zFjx)HU8pI_OvCipCUeau(yxgUQEXMgBuvNNI2Og4l5_-Ogh=Y*fOx{^tP5)>u~(@k zPqXau+m;1+rVGOZysvcrv*Ox2Y+CBpMU3pK8FpXWR;A0FYJ*OUxtTNYjw%4-Xk#yE zjn<8|S*@XI4lUqtx<_d)sYaESNO{N7%>mhz#F5ZF0$aMu(dSDGHR5Ch+Cz~Cx?KfQ z3_*)W&{X<YgFJ7xS(_CXG|H2jH8wJUT9eM6J|-FwO2I0&1+of{#<#$>oC9&KgZa># zTRA&4xwB)<tXGE4FT(Dg#4bO?CyVQgPFr!h?&0@Vnm9UvZk}~J&{Yw;wTt9OII6TK zVLm$5QHyT`r0@i)3!;*vTIgXd)`r7Y+_kD-yNhaGO@*6SR7HjW=H?;(dhpj$RZQIm z1}H7`-=hhPMsS6iX&feTvFvcZjvwXo-6L9b+?90wfM7X=keRCf8mREUqXV|<^F>9B z9(0cyVa0`$I^9l-%0U{AMG%zDAQ)$Sn$Wxz1V2r~q<SJR;4HaCg4&GKB}3<<PfKb$ z@)Hs_NE{UlJ){0Cm;F|q!^$(gEzj{9xHml8YkC{{`J(aloOC*#>`M*a&9-+?_w@7A S4lcd>mB|k%JQ^-exBdm<W1(pP diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/convert_igor_nwb.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/convert_igor_nwb.cpython-37.pyc deleted file mode 100644 index 6b0bd09039e76ac6ad212ad9b39cccf1461c8293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3351 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 Si*OgkaSL0f^Gj56(7yp!p@feB diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/extract_nwb_data.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/extract_nwb_data.cpython-37.pyc deleted file mode 100644 index a44a3b3b5aabe7b1d3ef5c45595468c4dbab6f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9262 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 E3vK49cK`qY diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/feature_extraction_module.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/feature_extraction_module.cpython-37.pyc deleted file mode 100644 index 543557ab2a32f03b6809ffa1e08169f0fe863fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2725 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 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/lab_notebook_reader.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/lab_notebook_reader.cpython-37.pyc deleted file mode 100644 index f954d347d0d07fa334b7ab9f5ef73fb4d7c133eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4037 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 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/nwb_publish.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/nwb_publish.cpython-37.pyc deleted file mode 100644 index 36071e7ac1574d9a5ba765eebec08a076fd8b2c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13236 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 XH@*=6YWxqBLj21JKTHCwp*sE-8MCUU diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc.cpython-37.pyc deleted file mode 100644 index b539732c2a9498ecf5003e1fec4b31a435f439f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4872 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 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc_support.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/qc_support.cpython-37.pyc deleted file mode 100644 index e9022df8712faeae6c26d779d954df2d1d458f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4437 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 diff --git a/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/resource_file.cpython-37.pyc b/internal/pipeline_modules/IVSCC/ephys_nwb/__pycache__/resource_file.cpython-37.pyc deleted file mode 100644 index 8c31d607e2b12cbab6b8750356456ea651144ee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6161 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 Wo+mc-*0RgwtE4Pr*@zMrNB;rK$d%dv diff --git a/internal/pipeline_modules/__pycache__/__init__.cpython-37.pyc b/internal/pipeline_modules/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index ad4e4181223b4c754a3ce8f65947425be7794cb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VJY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9wmG7D03GV@a7bMsS5b5e`-<Kr{)GE3s)^$IF) Pao9ja?LdzC48#loL`^z= diff --git a/internal/pipeline_modules/__pycache__/run_annotated_region_metrics.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_annotated_region_metrics.cpython-37.pyc deleted file mode 100644 index 1a683605a9b5f79785f289d2c02da07e7f31fd18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmbUiO^+Kj)b`9|CLf#4wnESf!E&HdKqLj!OI1*ptq=&hT6T*-RwT<AdlPTxOSaRJ zFhPPX;#BwxyW+%Onk%RN1x`FqlCo-rgz&`nd-i+J?>nDtZM6`L?Drq}TOmS!I%G2f z0PeyxKfxjpMFI<wV2bOVP*U$6^<eiBKMiPr9gUwf(vXHV93)ZNq|LNNTYxucTZFVD zBGHs>*%7UiK(s~Y38q_OOLU(g+7;WP2m7|{iJgZ;{~))|5O9)X)W5RmAI-8|o@Ke^ zR*GFMCo0c&Q)#t|&2G$-c$RPrXXY8Gj1Ky^>Q1C(Dl2A|otiv@leRlq^Yls8JyeBE zR3`7|VwT9NrDqvSYk2X_P;kqKDm%$_3W8%Z+~2!DR7PzC40)2s%!r4J^uN<SX9CGq z>WnADVy(pbWixbIJhzmsEZsahDCP??7(SpuqEhog+;GOiaG`W_AEr5kMc`#akY#95 ziOR5Sl);(5j4VDS=U$1eU!pU7L6%J$lzthN&C;_C;R*jdEYSrPfoMGSN+QCi4F~~( z5JU&`jlGTkk81bdUwQx7YKX~XPPbpUf98WCi|!?#vG13Q@cr92Z^EzdQU6gYQyQJ- zW0vt$(&#bx)T&hWy($9FvVz+w^@_2nf+U9^_ajX}W<_#S`R=mvPji)3p0QfHq^*3R zVp}y<QR}y8bL~GR=#H_u<`c<;(lQ2kt|MU4ko<_YO{`U6S1&f5bJ;XEmUcmMZ5@jf zZVc_@<5OT>W37MEi-z*M!ioL^>1~ks*Dw3GM_(JM&4^FA7>xO2p3O&l8ISW!@DE2a zdt^p=0Vx#2nitc#8GWh7BcrT*ui)`RP!)LBN%sHqr3!=`&n8{a$y|p85g+?F!VP={ zc2a*UT<^ebj2#UO7rZ9SI;HLcV9_})A+avVZ#R~>gpP0xQbVAhVP6u!y-T?F4cvT% zj?lNLB&B!as@OlMu%=hFv<m7tFXoIxwCzktdgb!rLZvf1g#z`bw~Be?f2tDM_p5Mv zi=6;i;ghPn;bg^>8(D4f71Ii>1F%|ppm^0zaxNIxn$OLfa9~{A5$@t1zK-=ZfMa*y zhASu!W^MI704zE~ODLjqe1U4Kv9s2alAPfYS$az!EXN-q>y=*VpMW2J#mfNb{W7?~ z>*65?v{UFjmc~fIrnmZmcJ8I?{Bf<ORztg|>CR&fIl%Inb-l}7_8XN4jR~^bQN991 z`c=2Q=E&QZ2w$|^Pr1r&0F`m^M-cRgM7V<+q)YVca8gB#IU2_LJ5|V-$YaK;Fv%wq zl})ru0DTn}`t~Lh2b<0{h;uCmb*ap(N|aU7)a6O<yi7aR?vZ>91@VZx+8g{^i(C2N z-IqoD^V|z9v-V|O{xmwi_XRuLd+-@;AMYQ1e)yn9>cn0-cw@8cH;i3!m#bM_XG?Tv d^&jxDs|4d1TzR;!17FXB@`2gwMPby5(BD@@6iNU9 diff --git a/internal/pipeline_modules/__pycache__/run_demixing.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_demixing.cpython-37.pyc deleted file mode 100644 index 2135c0b0a7ea81e345d2f077fc41eac552b591f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6349 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 diff --git a/internal/pipeline_modules/__pycache__/run_dff_computation.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_dff_computation.cpython-37.pyc deleted file mode 100644 index a850f65f189cb7e37482df353a3049077a854347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1651 zcma)6Pj4eN6t_Jyi6{S>mStC!mL)=hDiTQ#u$R>ev0HW#sOqk?S_zFJ4er=UCY{U# z+tbo$f&_&l-ysnvzLKw;_zD~l&ogakIpL9?-(UN^@$dP0yWK!A(%*h$MGc`ptZ*|3 zFrULz-vZ%?;{*lOiUVBABp~JL1P-huapzv(;mW5ruM>pPoCZE<9Pa*%f(G|^4c4Y; z@%kB&BhkD9ACBLkKK&C;K_`7|+7U~lJYiadd_0b@)x&ULx-gGms&9Z4XbqtpZO952 zu%1!*P-9N6@K0EinX`5ayus>I&^ZOZkF36oamyG|K=Kgt8th(a!vz@=NTqgS8gaVF zbvTX_u^g6s@9Q_OPI~iLsW_eVr1&n6rQp4BEE3*3_}Bel`Ka=@u|1v%)k`zo6W_;5 zt0%n=m1$<V-fn*QKQ_PRf6(`gGZEU<zk2mT%1j!PDdR4fo|;;9M&B_mXPQa-!=(LV zza!a%<*y%(o{ZiqA=QXY86Tdq3zlAvo~10xQqDdZiS%5JvV}-h1T<SrFV*NcJ{_r8 zi@}0LXKW%MHc7yPpF!qY$do0Ai+CZDI2GYM<9Q;~q0Cczbzzjvp-`sdEFCT`O>@Dd z5@A`f4+*I~APBbz#T2(-Ejc3FppC4_4x9P*+W!VYqcz^3mA!t#;ev6+k&2rU?r3M` za`#taEg%EtZb@}cZ%ICH+(>H=cE#FR*EVQfFYt`o9ksu10N>o;716B%z%?Q(XXWbl zx>Gp33E=Yz4?K4E(X6|wmHh6$?E&-)*+;8-;jQ;JfO7p#QM<w`T1L9O1(AM13m;<d zJw-*m<aUAcEB_d+8gTl%V8359Hc$;m0M7OnoHLcBTQFH+*&Ga#Y!W8oTqMv)buPv% zPxNwUFsJ}(aiN3`$jc+^EVCFO4gfa3Wm7g6YS|qOt^s%LE$tIwur&Ch|G-ctC*?hw z&NDg5=OWdw?X^nNVw{IyEp?_2nM|NnjQ7Qh=Wo9>jq38ju8a=|J_a)cQAp?5=4<?I z>W0j6<4VD}?7-0_9*jGE3=nc(LRSUtJJlHPoF%yk${MP2yeP>aCHsN}ox9Z-??M8e z<qp{TO;an=lE$@(1=nqVw|xRy9XEX()U;%gP;%F9>;S|A|9W>Y-t=`DZDCt>oooST z+&PQWec;r`KoH=)0bdt)%8!yR0sK2K@gAmx0%z@%xI}(r<7pV$9m25RmUU3bdzQR! z$paw4qnoZAo=WSNokIENOlR_P2x(S-;^EdQ%A^=t$b`9$lUT<B9ucbyI(N15J$r<0 l$ZZ}LC1F_A_Ma;0)9MBI%)Z%WciYacx_i%|UHSn<{{VGV%pU*% diff --git a/internal/pipeline_modules/__pycache__/run_eye_tracking.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_eye_tracking.cpython-37.pyc deleted file mode 100644 index 67111eb12e503152072db2c753468a7d73876372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207 zcmb7FTW=dh6rS0Oy<T79xTQ1*q@n`CsuBlyK&m1{NE)@!rcvU&j4Z9jJ7asDy=iuw z*2YFc>1+56j(Fk^@vyHv^)K+mnc296!UOes&d$u9nLXz_^L_hWz3w9T#lQYc&!G2* z8mxXMbiRd_{RD;~hC@UUM@!6%D~yX7gBbdWNi2Q0iLLJ?Qi8h~mLrEaQH4~rzZJSs zl~kh|sYP{Cj~b)_^Ho-2<yV-jF^5%NA=2dQ%sn&2j5jY3JjW-fU3(2NphIHP;jnGw zjiVstVG#3Y37dpGcf}<3BHeFWc}<N1DX4$OMSj~)qI4p;*H0!f3*sSkUgmfAA06zT zKJ9wl$H$LO9zTD&?;Y&!b)O&Sw}xDL{AJ2T5b;=gK|Dwfd`rC_ehMzt_Ml|~48seH z84H`4i;_fRyfo&PH0S67Um1(Cv{Y~5%*%6!SvzQm7L_?>=&T~XpI4X-p7;U}jjv%| z+Vj#}dD^n1Aeo~(NI`OG&Q0)jFUtx<0Hb<1yWe3{(vFHvL{tWT*4f*A*5Om`>AWG$ z&g{YeaH3(z<BXln`tRV}S*?NqBo{FaJLz>nuB(uBR1I#1vz1QsW-^gb3XcVX`!W&J zS#5JOo<!b2(1>TRmw@N2QdG|Sl+BzkwjXY*e;dx%dBh{)jFY|>gEMhnKoAm2)V7EN z33w@$BVwlgEVskNr(s@CQW+!=oJYklYnO8)$#P4%<<>X};@r%n5M_9$P)9wtSm4XH zOX@d^&vN(g0Q06C37(CTka+{DG7#!45cm0M_vp0i?LRpt&dL4{-qCLNF{z&H9X~nh z7K6r(O(Ff<(xt1y>feyK4Yxmk+<VwN&A7;VbVS)!pT3~+w6_~mKZzOrs>kE=te2!v zEgx)>j;2}fY0&Rwf#jPhoOL?nu=cv1?^qd|@&07kfH<;Gz#wd?%V-%6b_@$UxCz$K zmxW7k8Ccu_KVLbkpAAiAqj~W=bR@b!3p58tj17jR336auns_y1N=w?SnPuq;EwC&D zGpr2+*4DP9?9x$87+1#bm7(ud;DiIaAz(&jVQ3GRp({hYk~LWCZUE!v2CMEAt84n% zQa`I*KdbK`Ss$Re@e5v<vawua4JBz1fjMqMTZh(SYnSE%_`AF{w+g`n?llkpd1gV3 zEICbiUS@niC!w6RHaFisCAk|V=K=Qy0cce{;*u)%>Y;D|E71beZCAvG8hoJ4n`yBQ z!`z}1nUI!G{SgO6QY0!kLz=~?4`=?&%YqpvA78VK#&II4<P12e-hRWSmQK<j^ip7f z%!u0uMfCI(+3*t)bKs2NgAhmx1X{V3wVN+y8-pMYvJq$ZfaEbq&ApY_w$0ovwpOW< z_y1!vjlo*PX<THWQE1;5hDx)PQUMgmYm_m?+KE!&+=M7|dk`j6iW0aHx5!z6D4J@W z37QQU0nIg(8Z)7eq)@t@m&0T@ggEt)6(6cC%DyP@|45D2UkG54w~{B=w{7Ppd{96X z)JyK`U9P_<q<X_obGI<>DJLtULHrr?vM<3PU`h)s78#l~CEU>5QA~2o8g61}h6|UW z8RwefbG3`(d1@ceYnz9M2kjPdLFCggkzvp$<^&*8EG0Hb6UeF&r=q5onb|ZW4^|Se zwG!toC<EULgDCUfl4*^)RzI@+?`3_VVo3V%x^t@Jdh6zgRYO~Vtcp?ysnUcuDJY%x lyc-B9of8@+XQ%jDe}iEvQ}YgXmDm6rO?=mO?>hG#^cVNzeXjrj diff --git a/internal/pipeline_modules/__pycache__/run_neuropil_correction.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_neuropil_correction.cpython-37.pyc deleted file mode 100644 index 685c654109e497aeb9b2a1d77291ade1afac950c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5942 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 V7*R>D>Lt50XRTU4(UvUje*uelV}Sqw diff --git a/internal/pipeline_modules/__pycache__/run_observatory_analysis.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_observatory_analysis.cpython-37.pyc deleted file mode 100644 index eeb8160a1c6505fd39f7c028683f4007d8343b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3230 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 VfkKb)YF>4c-Yr^R^nT`%e*<V0g%tn* diff --git a/internal/pipeline_modules/__pycache__/run_observatory_container_thumbnails.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_observatory_container_thumbnails.cpython-37.pyc deleted file mode 100644 index a31a51ae844a34616a5d3127861f2239bd9f06de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2436 zcmbtW&2t+y6qokHme(IiQ_`lTfH`D}Y3r2X)}ag~p+lifGfg@jG-h_zmYl4!AFd=f zwOJpS_L||=11Ebp@h|WP@JH;GQ~!mYc#@sO?E#o!ZGAjFJxTlC@AtG{SF0X^C;9E? z;HMHoe`(?5v7z%76!|Mu3^5!bI%_e-Mz*MBTASLYb*O9FLR_>EMlmsUiF#PuSy4Hz z&`MmTRU_l5HlMLXm(7SBor_oK3iKW3zC`pqtFR&?FEM?Om6!)3tNa2hA6nuSUwr{P zFuaQz)z@%7wB4|BPYe=2PT3&hd2J``^C(RC10y$ZP96kF*yU1nur`3lg5p5ggd$g< zQfPu1&d>!k#bcc5)vfJO=t&;&j;eoJ?}{|8r~QMW^!f8X7h%j3CF?2ojt;os^|L|0 zlO`&F{e>U0`tABU^MZuI%;r%l4!co$<VzJOUjO)Z{c1M|BhIdR@D5fq$la#{E`}gf z78l8F!R7BrK%CH<Up8;G9!oA{D>w*PvmG1-$*^@N3BZB{pSO7OOt#WKPh<ybbK=(h zu-%fO;y3z1=P=mkU>ij+gB@;!iQ*y&qK*FCYjZcs4eipj4LdyxR4RrGucZzKaXW#N z%VvL=uk3TRpbV34TGnnYK!vd5cvxupZb!pPKU&hoIR8)RFg&)IHFlUib`|R3iIus^ z&d>`ywZ?^gG%h~xDo4v(=tnvx%AFK4!kkMwSf#l|iMf{$D}aTU6(>bSGVd)-acVJg zY)vsnsx<L3&-BWZO6FyysfE$g>rarXW_DK03Ynvb2A&24E3?Y6o#D(9f3Pa6!RcU? zi)bGwngmP7MGav9%<}d~Y_LED;M8s^;y{HRxv_cY!A1ZM9?DQ|oVxwA^S}K+`sBav zIcogN%u~$C+zMH~oDNifpnMhz-~d2i<b??gG<z~lM&+5-2%3RL<!e<wR~g}T9RfV^ zItDY+UuPro+09!w^}k_L=UL2SN_uJAPlA|Jas-Z1z^xIvaYGIJT;6_zuQwb@0IPmK zPzTiRw`J}|X(xziHSMb~1?T#K*q4o3ZlyAJ^t9aRrD2lWQVD~;ydVI}U|!Q`ot;&O zDlY_m;0ntf7Iu`-If1Uqpv(O@IOMRS0GewLfJ=J7&m#de5;}b}%AyF3(Ak5!{U}wE z7Irru-P_rtWOwU(f9KBLx72(1cyH(Np1*bP5v`v3S1)+tF>?wV(g!6_`9`ei-kC!U z@n@Az+PTYkd$4~Vy7D?yKr;QaRxAhC;J1Pc*urbJhnHc*GCv2#^r-j<=6AG_e)MVt ziecg_=qU68jZp?1>{$#mYho*>=T0%RkAWfcaY)f8@}w|DkS<ZL*dvn?173`+=l3(s z)2*?c*{pC0jU8x<(7MW-lrsnB6qEzJD@<|A9v8<1IP6TSz&nzaGRv%1o4UZr@1D$< zMYc!9IUdA0I40!uBIDg)5UEiK6bFI_Oup996E$5e=}AjMXPmqML4+)pR|3W~P6j%2 zi&Z`CB2?7dx&Ls_-}_<bn_Y258#o$FxohB;yRsjJN?bMyy$vm!^=9Fr@3#kG#1^gu z|13G?#reS+UT(wX1Q-LviFLE-EV^CD{^CPDu%tsiC!8h`UBG}gqa-<M`+7dDo}?2a ziYl1Dix4M<3+N^&<Qh~6Lca!JAh>3Em|$Xg)-v?OHPGe62dsyQ?>DTw+l`CB9N1oH zbOC*aGWX=5-4|(xOGz)kdnuf~?aZ0$CyA|jlGvJ^RPbgL#?l|C5PTVONy&*eceI+; z-qs5jcBj|=X{~pzD?>>WZ+hj_%<Qb+W?|>r+p-BPU0X0oy5W8^o_{cygkTbgA<n78 qbh7gO1+VL?Sr~GXFJ|8%U+QlS<Njsia-u^3+^krHcps4S1pN(Vq{9jT diff --git a/internal/pipeline_modules/__pycache__/run_observatory_thumbnails.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_observatory_thumbnails.cpython-37.pyc deleted file mode 100644 index ef4eba2dba8aaee37e46294833cbfd31b0e16d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16804 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 diff --git a/internal/pipeline_modules/__pycache__/run_ophys_eye_calibration.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_ophys_eye_calibration.cpython-37.pyc deleted file mode 100644 index 8a98c1fdf183ef9b77641f4798f66c6519f7b565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5098 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 HZ7Tl;=DwAf diff --git a/internal/pipeline_modules/__pycache__/run_ophys_session_decomposition.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_ophys_session_decomposition.cpython-37.pyc deleted file mode 100644 index c3f53a68c699a7fad93da44c2616492c12433f32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3577 zcmbtXTTdI=9iN-W;|s=s10-ZyYpb;Dt^#SJRMje4H371rO}r=&MLl9W8hnn;faj7k z#|e06R%+R&mGTYp0P0KoCHA3@{Rs2gC%!_T`a5TALef>Ms$<Um_P_l87aq>cR5g6z zpa1BY^P2V#IhcMWbbf=9{0$Y=s6Nz)Y>lBF7{mxnV(P`b6_gB3*8-cACo@h^Q8UGS zmDJR{IjjdWq@nuOa5iX?=4AgInWH6Y4-7I-%VdE%q(v*_8m*E=s<Q>wV%OMWzeH=a z{;f`y=n`$vS@f1^lg@psk?VAxE}*?ZTl5;*6?T&@9vS?5wsH!}sJ^3hmM_4E*6kR1 zW806}&=1+uh>nIVukumo2CCoD^OYz*I7!@uC5az}E@izah@-?87-8Akj-p|1QBQcJ z6#Hx(`I@0=7kEayKu5c<QT595F?<UsGbrmQNgaCzT2>a?nV#zB`k|3IsX?_Phu;)t zW~5G9O3jv*S}kow%PMIlwO2G@rN*g_arOA`qLkXF`iAz^_gO8iWp$w)+Gphy9G*F8 z?OZ=MvKhS4IQ~vl<SFd@X3xlGvu0|_ThkIst+)}r*(I%|Wph{7?AGKxteR?fX<%ma zY2&P#&ZV=|SklraHH+7%g|>9A0~IBTeQ7ndQWNbwwck4Dx~{#9UubC=XJ^uS+MwmP zrkZ^uXQ30PJFdk;FJ$i5+3LZ)3&=+sJJXr5_4(-QjLXT6lh^i71aqT)KVc#-_YS-; zWJ9tr=|E3OkNdII5}E6BFJSLYm8dw08JV4Ga(YoIIq+hZmlMH#T+uN}EgFe<B;39a zXw0zVm~lT~p>TbgH;Rh`COip%PAxa0B)1abfuuyZi9cp}V`KB-^Do@>#}B&Q%_lp# zIb>m8;$AplxfOfjAh!-9Kg{iZ!~-0xuy7PG?g^ILUL3QKb{6t79(JkEbBBAcU3rQ) z6IPSF^xCJm#y(*F;6UV#FIXU-CQj%o;U&2<r4iIkRut_CX%?*uzKYF&u~Y${g`D#; zxR;!h>N{3*-RE^I@|vs~sQ#+)TWJ3I-TG&H&lARzJ@3GytNY$-FFe_M5PH2Rq~6^< z7QRaMBCwS7P%FdQd*bi!!J63Z*y|m61BSChNGPF4Yknvg553`9JTcITRVHiFLjQwZ zuEr;MtH&8+==QxM=1#e9g39FAs5H~k>$;;`dK13}+7`;ZUPW2d?a9x;j^fwAjDdap zXE^()XUZ$^RZyhMROWn$4%IW08kt4StOR4!&y3U*W~!Y^Q?!+FSNMGx9Qvn5R!)ty zOs%&t{Lm3Fnp6Exy0BsP4t7|gOl=BtUeu^VD{stHr`0#MbdoTZT6g^MnuHzXR6xh? zC2Q*so~{*=DLmEq)BnC_Z7T8c%l~2X<*ENmPw>BW326zk5LU{iipDp(Q5)(Tw%M^4 z#6y;#<0qnh!o<ay+%S8UNB0&TJ9mHe*_}K1gUMR20u~VGFxq$JmBe`s1_i7ZYYu=_ z*pC_S!*qsG&l`3eK8IWRlB||d<t7|}(sjPjjl`CuK^i@yo190SOZ~&?`#sUAC_~{t zmq$NBMVene-`#$`>uzj4+g#uM^4af+v$OF#cl*KaV`A^DKik^g<u~Q|MOeiv7)udW z`hKWlN|IOoP&yo`T4h#6^;3DIMA`mm@C$U4k5OsBEPm#^;Q+aYUNs!ULMwlk!Z5#s zT|MbC<tIatEDEj<(UFnjx|Zo^4YUSY6D<HsEwmQe5?Vl6Mks(4G2q<N5s_rSZvuvP zcS^AG6HQ6Bd&OsxYu@PCANn3YxjJ1)O)47*Fr$Q$7F=A!;b@h!7Lj{E`}aCFx%Pu% z;-BCsStwv2cU~fhEWLa1y@hvAekj(N;)%)Izs1doq)fXs|H29IyO_Haro@1SqJ$~6 z17Rs)9xtad&^DDgAy!zud0%_kK#-G(hc*7>N#xNsFxgg`ZcCB1`#cKT;($%&4wEQc zRmPw=<x=O0?2gH$3i&Fk+>);TLvCuZ#}nqNyPsoM;-JzLM4CFkhkj2^$WQvNOF;Yu z0|6dR^$ffmA|0WiT$t3Nr8iRP+L?6@upsG>djOV0`w$-L$l|-gnT*PB-~m(ftRkwZ z0iS1uZ6qMp@r~4gOy;vvYMs@v22ZC#{~umxzLwd??bO2h@}8NMGY6@TlUAtn)_@l* zLw4UlcG_7zwdEP*{VLt@+QuXoV{HY4_9RDx1Vx03`mcOCf)goX;Of}8Eyk7Gx5WWm z3r#Mh@&G<dW&(Mcvc5MO3NA&`(McudQ4cvEasY!=C*B5nB8_+Gl6vdRaGB-hwh}te z>mH@9#|H@Ep~y{;!q>2_#GYGNNb>T804`JN+zh-}0gJC-NakL1=yYl+>V+!yM6|f3 z(0VL$PP;HNQU&D`-*K6&$aBPGKAn=TZ1W1~a{M7~tibcbuRuidBUBRnEr7-`>WF&{ z_!Y!P)J^!7ropB6$Q{>}XI!^qJnD8n%FDxOFz~|x`E(jlR;Mw1wHI-=I`o6Y{UDkv z`6-V|ZeAW!yQK}dBLU|je1^PAPLjs^v&1+Ykz1GNe&D&w3y3paB@IQ$yA@+NB0u@} zOZK_sF4{**^U4zuKj9KH{FjpV*#KzqCny2WN}EL(X<?nzinQ;=)&~53y%;>+-1_42 zE}3M6Tf3W2cecppbli2fpFHSp?x?t<9Cv{WX|b2`mI2Lmuc%HYUR=7L+__);)AG4= l_lfk64m35dFC)`It^-}FXrWt%j1G+-SFbxY$8i=N?O(`o;h+Ej diff --git a/internal/pipeline_modules/__pycache__/run_ophys_time_sync.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_ophys_time_sync.cpython-37.pyc deleted file mode 100644 index 370a96b0ba3037d2bdb4c07d3d732df1e73ed93d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7315 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 WUac8(7wXRZqLKOc`Ze=8Q~3|-%j$#x diff --git a/internal/pipeline_modules/__pycache__/run_roi_filter.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_roi_filter.cpython-37.pyc deleted file mode 100644 index d3ef196e23d344af9a84aed9fca6627034b6688c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8723 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 ITqvsl3FC-H!T<mO diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_projection_thumbnail_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_projection_thumbnail_from_json.cpython-37.pyc deleted file mode 100644 index 2a10bb33f4c8c50f6a883c28b85224a25b0dad90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3328 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 diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_stitching_classic.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_stitching_classic.cpython-37.pyc deleted file mode 100644 index 88d4f34fc03e391260fb9f826083dd8d77ce94fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3844 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 P?JQInaiW;Qt}6R4Xj0}t diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_cav_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_cav_from_json.cpython-37.pyc deleted file mode 100644 index ee064bbad40afe977bbb3633810dd3e89342c34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmaJ<&2H2%5VoCcHZ3g@@4zLhnmr(Ks1O2rg$jYVM3F2vF<Z0FII^9sf_4vR`v5!w z6(?RPS5CY_PaS8wRRt0wd44@J-;Dj{@Nl0X!Ow5viW2fW7&~I9yu#y7kkzE7niN4Y zO&eA)8uUm<O<csN$Mxij6cd@$$%5JEa<U=lr5{N){e$`BEThBY_o|gzfqZA`PD}Je zwu35!14Vb|6s3EL%##gSlNI?vugRKvwxS!lW@tw%c1;5SEKkp}*aob_zJj*%ycS;A zP^)-yX_c4Ubbja0q9JL<<~9yD9zBTtA~r$a&G*xj@{^O+mEuCw`MJ0h(3h`4R0eAC ztdy{HrD-L&3b|=7dRM+x=cU75$E~OqVlFXPYrIh}W(vHtAoQ%g8=h|gxEapQy>hOT zRgW+`PzKaj$t$tspRH;57iS=E`yp<Gf<46MQe=cBETt*6!5C7`LzMGuI!v{h&lSvz zqh0rW*FCR{mAO`p<A328cUOG)H={9~LofzFR$eWY@3+;KLf>P}|1-n*2KOLAG?Mdi c!w=YW9O1=wBQNm>5*I#X$`0tkB;8BtEkg0a=Kufz diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_counts_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_counts_from_json.cpython-37.pyc deleted file mode 100644 index e456d4b2d6b1e6ddcb8f9c9e9965e4d3e6fd1fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 696 zcma)4&2H2%5VoCcHk1~Lci<8svIis%6+%F-P$3~MQIO?2W^2|NN4B$7s@(%xj=TXE zDo(souAF!UPK<ZERRtGD^5^;SjK3NC<<ZdrL4og|#1~4)&uHw0q4FG;KSpRsLk+3o z&J1l?#c0$MleB4-qMkOB&!n2DtjQM4JyDYlK`(tvis>)RC#MA+@4eBTG8)ut+w?}E zCviQ<7><%$uM^z;1B5^}WKCA&8@(cH8rX_%=$fIOtk@Ne1h70kEm9Y`jt3gLKJZ2a z;bN`o{)N*)aodNzzevWc-Cpj}c;fD@*bm||^!@&Na$LXj%K2KHi>5pi7XpU*1qf-O z5szyHOJCbgftQH3J0E=gN}tsp?|Re;xe#-OxyIm$W--$clmlUA-F5SPN5IdpcOJC& zy^;gc>_J=5mx@axyw{RT+e7gDgR?FF=q;4pFs7~0Fh!a^M<6U?InAky#+Y*+qnsDh zacb;*u3=t1+!HDHL`rF$DvfSE|BKRgjMe*pGg{kw<YfVr40@@<u&cHd=7x6pf9-5v k=7ukbR&l<a`z?t5jrr5voSxyoBtCxAoE_4`B)^l>Kd=7GM*si- diff --git a/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_from_json.cpython-37.pyc b/internal/pipeline_modules/__pycache__/run_tissuecyte_unionize_classic_from_json.cpython-37.pyc deleted file mode 100644 index 7e17940141bccd07ae6de044185e5348ce0ff432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmah{&2H2%5VoCcHZ3g@@4zKOWDiIjDujSup+Z9KA&O+ViP@TU#*yu86|{Rm%Yg^r z0jPTFE9J_GSK!1r+pQ`%Fp@vdk7xYN*l!LG_X!GIe-Ym(AwPq$6NbtwT<!>=CN<Th z2s_iXVFjZ>k95?;MT~k}Prj03B9l5<F#B9iHUz!&1IebpFrS=cba?n)wNfjP?@Zlk ziJr)IP=#=i=yo0B?j9p}vLS1-B0uOASyRtebVJt+?P$fWXdr;)=}8vbz;)PH&~~2J z!V4Q}6^|~h@{*g*@BCRbB+Yoajl+ot_hL81Cg}V9{rIRnb<(<0T!=b97ncJ1@->Lc zKrNn?5|*wstprygn)af1<y&=LI=t&?E2@Q<OU%_8Pt=Q<0xvBHJ!@~9=UW19hP`vI zoa<!OBh3z!0rgq(N(<*y#Xnlp@K4S_-u6S>2nBn{&!q^2B`l>WwZRxt&O?;*Y&uM} zna>r>izhn<`Hn$e87p(G8pr?QGS06!`!}O8okKzfKvrHYmG8IJmO|h0&HvNK_!f6W hK{S%{anko-I=1m*JDHdG6Nw8SGi3+#V3O{o^ba)<#zO!A diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/calculate_features.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/calculate_features.cpython-37.pyc deleted file mode 100644 index 46d749b33c9cb7640a01143754eebc2d72fb9423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2579 zcma);PjeeJ6u`CXU3=r$&cD{JOG{0m(DYB7w$KC9VfcTdoeoT=pb4XqSF*k7u68S} zlQ`oXARM{z1(M;!C*Zs6l~cb0C!Vyn62o)`+bg}F^rZLnq_^_t&1N0JNBsU1{j-VC zUmE703J9OVqXtkg#GDx6vUU;|yG|)r63;~rN_^~_7B{XYHCzL^!n|J)4)_xDU%Il- zYsU!JdHrPh6yXLBc;nc?P2d)9o;slKe1|rxufZ02y6F_HXHmxENbn~q8^=6!bO(Hv z;i<y&1w86k7oo}3DU9u)BL`|1Y8UDX)Rh-Vv>ouxK{;aHG1&MS{eXn~J({#~=fs^l zr_PbLpye-UJsP4T|KLVmVbx>jOY~#=s5<peys67-(`p-akoNo4?h7>aPW-8_X<@ct zVYX*^^`tiSrj=9os1~84U|QP^rU6@ej6hlfscxh?NXtfA2B~4B21rdKH9=}UUbM4v z-VV&X1do}egV<^ZP3vq8#=@+?>xS1YZy4UNe8KQV%WcDL%a;saw%jq?v3$kw70YiK zzH0fJ;kPYcH{7-Sj^P`Y-!=T6<(r1zxBP+OTb4Hs-?n_m@LkLI3~yQP8SYu$HoR^5 zzTx|p9~gcJT%Rtn524mO_mS?0^ZV#&5vcu;45FChW)@MBODfbLl?mREJf?ZH$B9Z4 zN*K@b(c$*(+ui4a_G8}7)9xS=tSkAeaipT01M--uZY1EBjq~oVO2uIZMtmh@DnXI5 zNDRAR5L9FSx&b+H8034B+}wV^4sTdZnq~1stI`3O08?|P3XdM70{dZ{j#&{fE|>(% zMXOI0jlstmuh1+C&o?w^923FET3a37vX($89P4F*u_Tq*D2>zMq&wg=A4{(Ak{BmM z<vdY%1;jp=Bpu8e+6g@%d>qCR<5Un9sho<C<2Bu$(R^f^3g1KzH`6^XwI?Mu@-zo0 z_tJQraC{}vvt(3qkrPJ8!%+^_B>0x%Yg7*$@;7v^&bwJe6Ar_Q+0-!?!+eC>^OY0r z0O><G!x5}*L!^wW#m2(lj~I-xzLsbLVbsqDqHMU-j|O8IYEK2BVi<E0rx00ueeTzr z6jpV3&vhzr)kb-teceQ706|C~KE@QjIG=v8Ina~lQKoR~Y%;^kVJhG(h1yZPF&}-t z@$xyNv!zI$q&dgkxw_FP=UCKen8nOvyMAWd#=BW=xEjj=g@dxH4@%idQpvc)4U=lK z{-QeK5u5_tnjf2zi@+Ywm9sMoM<%D6t-{Y_B=VvHS%w3has;Hp2e*d2s6u8zj^KvL zFjA&hu{N8J@B<T_RO0m~HW|L2<%0AfU2$C}ATjwT^}Qx*x(IZ!1jXiZQQ3`z)R!^# z5A=&f>MI*pgcP^}1`8*WEodn`?J#x|hCOZn4<s)^^WVRH@$t@c#iiPzBg(e=bf1dJ z&S!$cHZl5ehl@S6lfo)g2xXd$CTi!KsK2A%K=(2lzJxS^u`wKd#a{Lx7F-G%_p;gj zOcHZJt6s<<5%WpLRqrf{z4;4)lX;N0vPt13G!l9pY7YwJxK04yhEvsb)pc5><hqUr za(m8o7j!(QZof0ViU+N$|NmP7E3WK-<su+N`$EX(3hePj;fp%AVN1@|umu|~S3w!y z{coRL)l4|sbF(XQLyx;N58u{2d|P2E`Boeyiu@~(68_U5>zjc04<SXh3^J~pi@+RB zc|p(Y?WW@#ukGviFaZ&+iLzJky*U77aT%}(9+%U6qW?^(btnS2;jB9iKlnB%BkueI DE3)q_ diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/cortical_layers.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/cortical_layers.cpython-37.pyc deleted file mode 100644 index 936156dbc921a9bfc8ede44b531be51cfdaa2c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8247 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 Nm9Ld#1{y=U^1seKoQVJc diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/surrogate_strategy.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/surrogate_strategy.cpython-37.pyc deleted file mode 100644 index fa4972592d0e89f49ec475d1301729e0dd92f48b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4410 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 F`5!$6GP3{x diff --git a/internal/pipeline_modules/cell_types/morphology/__pycache__/upright_transform.cpython-37.pyc b/internal/pipeline_modules/cell_types/morphology/__pycache__/upright_transform.cpython-37.pyc deleted file mode 100644 index 2c7b1996e3cedf87ace09499611edc016303e450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7261 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 diff --git a/internal/pipeline_modules/gbm/__pycache__/__init__.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4acf240a850442996c21f0df0b09eed08a36b6e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VLY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_3bN>YpR5_9wmG7D03GV@a7bMsS5b5e`-)01-b<Kr{)GE3s) T^$IF)ao9j)>_86s48#loIjuYA diff --git a/internal/pipeline_modules/gbm/__pycache__/generate_gbm_analysis_run_records.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/generate_gbm_analysis_run_records.cpython-37.pyc deleted file mode 100644 index eb69979ec4710fda1cc0face0e0c535c19ab31c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 zcmb7F&2Jk;6rcU@?%GZy6w*Q@ROV7uMy-PqsVz_tP>!e)AXH=-jmDmdJ;{1@J2M-{ zXnjCM+z{o?ArUA3rMYs-zrcz2)=8SAxv<v$=FQCe{LQ@em+R{t0+0UdXZ~wS$Uita ze_&2Nhu8iDAczQZGFXklAZX^{AQYj9ej$TM#v(ol&7lnUTcWi^21z3&Af=6zf|NB< z22#6`+8}irsRL41MlzA9%w$`3WcOtfK+Nw*uX_sd$+K~S13c^Sw&8sWuYCpJ$bL`< zby!DrT(?B<TWgur$#Hl>mT8?HM<P540s>MDE18HUL<P(C(N3LxMSlEX*{M4s-XegI zHz4FJ(m$hRw{DAQiyXJ=F516%@|?J&CL((o{=TtXbLnwbx9hc&Fd)x?mv6|o<Odib z<My*&%g58gIv<yXaf3vRG@nTyS5_LImE78SVFdppgc4*f$BqhRozfr}&HGAFZc$=$ zndeN2`*b38-@3x^iDW_<Fe%J})^)S7r*eq_?o(&Dwl^!Tw$4@Qo+)M&-8X^gexWoq zmbq#qEp@ce)b%Z&mAQoY^waaaR(g<`l`oh)Dy2~~shy<~O=SPf#mdHEC08uC=J~=Z z%S@#KZt%m+PU8y4{+kLb$MV8)L(qXP=9*z?7Wu$TkT32WA5Zz{yo4(*FK2>IxfYGl zHHXYC$}<Lb9zNQA{Ncmhk5(mJQv}kG`-ZsY5dL@c)d5{|dqe!kbUu|vHrbZdC|7nW z1>=q?OLgI>uJZh%oHy@`%GH6S_wH^_Mzig^_b6OMY3OKicEX?d%`4QvRRaxc0_e2U z2H?_?UNq=lx}SsFS8RZM$x7~~gZHkiHx-VJDqXYdgL$tF?O+$<qMYpbbX;f+H`^!U z%GkpAR36E3<>VmSlMYTY&wawnQflGj0tO%N+X7Hjv$D7D@4ODSN}Ay|%Zo903iMJj zVog_~fQ{L#G@XenO>?$!3;Pp7U^+g6Tp$8>+~60;$I8i>Pgb<}w5S~3yT6IK1H1pe zdiwG3duVby<WnyCBR=PPG5kVv@Fn=}Q0hZF#MCX6EQ@lwu*0v_XlTLfgOZOApufR3 zhkmx=U|VS?f#!U>RHe)nusSP51=qYeJfzuhCmEb1dtG~_+1a7>%Y~0;T<I?4W;X#y zxEW+YC(RIpcY}>!Eie?;ea0ASGG_3@Z!&<>2q8vjAz=NzHG_W{<}Cmp*@eBZMjjdS xF*lP#vw=EqBVbf>3*k1xI|xYCC3qjEK6|n%?K6yGQ5SQ}qHHq@JCN)7??1CI7#aWo diff --git a/internal/pipeline_modules/gbm/__pycache__/generate_gbm_heatmap.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/generate_gbm_heatmap.cpython-37.pyc deleted file mode 100644 index 10c6addea937a93517261180bf3861765d72cade..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4151 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 GYkvY5|2q}{ diff --git a/internal/pipeline_modules/gbm/__pycache__/generate_gbm_sample_metadata.cpython-37.pyc b/internal/pipeline_modules/gbm/__pycache__/generate_gbm_sample_metadata.cpython-37.pyc deleted file mode 100644 index 049f36b0c341f9d68cc4df3af029f82945f890c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2361 zcmaJ@Pj4eN6rV{Z$s|p;0+xRZNONl=byH~<?Exr)El0Exix8_2WO>GJ;$+4iY){)r z=>ZmTK^0$t6(_#ZTsieCaN<4BOj=4yqCEe`e(yK$kNupd+uH*VKJt$r=~F;|;Y0K3 z0r(7l<`)pmV}9yQs?neL?zuH-!PrXMSuhEFkF{Cwvp4DRF6%5?`X}C6^jP;@ZxTAx z1JrjY1T=7{4`|Dw0idBnTY$EChljk+2YibU`S!~$u=`(oqv0j^;yoMr<-O;ereBD} z9u?Xsopf;lKK=T41fzKY!g>pT?XO$w_BvR1n19hZ@2<OxmTj}vg@4{#_kIsp`<3r| zwzKwF@Ur#WgY(dK7q}9>^41~iu<k|M_r8Vbzw(}YFJJ^;de26kGMFo4%OF?UPP#0X zG~;DZ7_Q4Or^cKr%|`y@UgDf2$274@ujoYwoZ~4^Y{Z1ILITi|js=UTK}1e@ni9eG zBU@xj*9#6`o8@PggK|nt&J&SwN$~whQEB4SeiWxFS=I~=JBDiZZiY&;Vla7azIhLN z2D5jYZ!{~0Ovt@lr7PeWp?`>HN;*%BZP=|Y5?g5AOw&XwxysPMY}RNTYknfA6-q*S z6q)n0J>bwBsMqUjGc(P(yfGK21$Q1?5hf~C8p5&TCVN+FZsu64EW(1g(nJd-WF#^= z;{@s~xQQ~6nMg@DVl0PMF|VmWM3r5W7l<fFlPa}`m1(nhi?%BV8dP<2F9F+}YA)?9 z`fdZD{$~Fi)}}X1=*f&^0uoKNrYmB3mZ#KWP}YS6#kmnj?Q9bf63jHs=OQ60UcjEN z%8S-@$sr+`9h*7Lv9xs}nu20&QMcL#hn3A$1sZ*Ah%I993uP5p%*Td;yN<NZdCiVT z$nYNsKg*#+a5BItz-R}<xF$nq4jmy@&DFIrq;RZOMi`<C3E~zysvp&i6&n9nsp7{M zHuV3Zji^S4s5{<=Fe2fG=DO-8YpyLUr8<@5Sfr4R<9wMR365iGEluV$ZZc9apU%1F zZbxpiMIgUI&Z1N-p<T#TwCAcHeYgAg$&-hKklp=g_rn@~59dX)>J51jr^3uRBh*I1 zL{iyE7HJyIv?}r_UTyYU)46VM5m#NQL3io71M)x3X1{Kn?f|>CWXE;i*qmtuO>1$d zJ%YB(HM$E$gW`N#`lpvIxGdme=?ckUzl{3O!ObdB`Rq~IOO%wbv&(MP$TjMgJ$}ZM z!a~DWIhSRyFbX6qvV0OAa|@M7Q=s{vPJ6~JWz<rFdIXxXYhh)N#l&4A2=E?pGuU_> zaCb=`m+(4aWq_`fZSbS)slwte_|wx5z@NW=J^E<+4YVXPrE|*0F+GLSPCu6vOc;GU z<?_T#(NzOcah1<kX8NUwr$$)*FsI29S{m4<DQK|efsobha*&Ihr$Ta)DOSLyJDA1U z!Hi3;p-~WcAU7f$=c_WvsE|W&%ea3St^5AaAM6Z${XV8HBm~z9x%A;thafK7C;}94 zJ9?LRp^xrqwAMQy%C=dV$xc%fyn8e?t`Zwg%o-tOK=tfIzlN5tqj&?weH3q^cnbw) g?3#EF9?S5PD#B0k-R2z-p^x8TJA6BA4g9O`Kg19Un*aa+ diff --git a/model/__pycache__/__init__.cpython-37.pyc b/model/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index d097cd2cc19371f1180b5bbf5545c65226a27c0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU-8aXF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=_J~J<~BtBlRpz;=n4N$B!C)EyQ@n;}r0003a BGPD2y diff --git a/model/biophys_sim/__pycache__/__init__.cpython-37.pyc b/model/biophys_sim/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b40b6963f966edf7b192e55f209b95ce1d9035f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU)j!9F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra@4I5Ss2K0Y%qvm`!Vub}c4hYe7^G$+*# K<cQBe%m4tZ%r}() diff --git a/model/biophys_sim/__pycache__/bps_command.cpython-37.pyc b/model/biophys_sim/__pycache__/bps_command.cpython-37.pyc deleted file mode 100644 index 78ce62f15d163f61259e82946290ec0764147302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1532 zcmYjR&2A($5Vqa!p6;HXWCObp{uEdiF^EhK+*Sy&WD{wnC@X;w&>GS5v^|ra^tc<_ zNj6dE0JAs5JIn|!TsZOwJOKyfE2q4|UZC8Qtm09XtIE|?uCL1TMYkIxSn}5&+0Q+M z{&mXD3PAWANdE(jBaRD{tahA`M)wkr6Ydps<|jTz{0{ed@Ej)rZ}IRsN?Ic1(J@hf zH{MYaah${=nzoa+=!o_lb8<}8GtuT~6Y&^4C2uF)A8N3WO_X#cb^5h$2Ymm4lkO&3 z^muQH^=~h=wI#keOJe!fc~79}8efMP@i$0zFmk`|kR;zC5s0pc=LGJHze4?uE2s_~ zUSZ&UY=hlWj`N9)N0m->KC23m5$6G`1>`{41=4>3GiZT1UgAqqlLg_VM)%MXV^m}H zq4B14;n(gI*NA&i+`b7+YmTPjBI0xcCv)(XHJtiz`n`!4Z3p0lxEPXyy#@9^-8YwB z?JYV@G-|pKxyQqrPS+OeJX+!<6a(5F9s`VRpbkK^!MjU5B$xhWU|y+d?bpHFgSZ{@ zD(|_Q&hbx}BY<G-@Ztkj6hdl#JeZYS6oXM-R!8Rz0t1IcR?cQj@{2W4wyu?jTMx9Q zN1~`Mg6(a$Cy`V#KZOuQ5&|FRh0r!uC-NFf<)BQ$-KUTD(#KD}v=olCa?o2kW4U~R z?_X@3$YWWa$(uBgrGMA9igGf^<-|r4VGckR%F<kpOG`?)Ma9gKZLyJV1iw<bG|F?y zBBmx4QyTo^W>3MOEzy;w8B}d)Q8I2leXebgOYk!`gj(~l&>%s!w24VMGtBzBDsr<b z2?{(ZgpKx|Wuh{9Df=zky2i#v8O%}Y0I(ihJ&9RW0gBCRwYkul%A0R&dle>?Y$j}X zd?GU!s!@MO>OPe4Lhe2sehnAXLw3aYV8qUtJRd%i4B~P2$xz5sJuEBeUk1Es-0&bD z4RvnBcEz$|HWBdcb%%E#p(u84b$I7ihX>WU-N=s0Qj7GK`6IZ8-U5bjOnQXk4hiu+ z9O8AL0LLIx{5tLt^#FV_hrC-p5Cv*p%=;i1cpEjDz^nO%TzUrAUQOoYlEQq#Ji?Q7 z^GFWiA%<gB&Wc={KCy9{!b>cbNmJW`jxb|X-&b1@P`&Hed%!H7S?cg>KwB}FQoRZ6 z5s-Fo7vUaM(AaF4rf%rcH1V6cRnFncjp)^XurB<8YZz=(UCJcdeR{Z`?ms!$>l5XQ zI_$5jF6=heC!<Q0nb2BofI+$cR2!_i-ArMF%FCp#)oH5kI@focD}|9fg*g#Yz3uc+ zNUqOvH`37CT$S=xO>QKVE6j$Uu4d;mr|FM@h0u)<cf9zuFm@8f0qNil@R(5YMpHWh H9)RV4gSDc5 diff --git a/model/biophys_sim/__pycache__/config.cpython-37.pyc b/model/biophys_sim/__pycache__/config.cpython-37.pyc deleted file mode 100644 index 9ce0a577c7279d12055bea1ebd08b89335d8c3f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3426 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 R?|n3|MpvkVvD(GY{Vyv`yqW+2 diff --git a/model/biophys_sim/neuron/__pycache__/__init__.cpython-37.pyc b/model/biophys_sim/neuron/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4dcfda384a9c69fc953ed6cc73ed031c0b251bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUq#MVF`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra@4I5Ss2FSWENKTkhCJ~J<~BtBlRpz;=n R4NzHWPO2TqEuVpy0RU6kI${6- diff --git a/model/biophys_sim/neuron/__pycache__/hoc_utils.cpython-37.pyc b/model/biophys_sim/neuron/__pycache__/hoc_utils.cpython-37.pyc deleted file mode 100644 index 52a1bc78fcb7968dc9c6fcabe1b5eff99dbcc86d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1575 zcmaJ>&5qkP5GEyAmTd24(`*|ADGD7@v_8apC{PrO{$!ID-9z92Nf!kK2P`epw!E^W zkaW^D<U_G}fIh+oJ++5E5U)KHz4hEvXQ<tvErL>*;c#X&9DXz8{hgg2fl>bS1Mln* z@*6I$MgYP+ApI^dK?E&GO1>t-6aGsgd`Zv!)D!dx83uoV2N`F`uZ9o8Js|xtFiBD> z2zsZ!3@$p7yrO9+ytE4x0mZ@>!Ap|%L`Q@$_k{;>yEZzmvJ;aRdh`2HvXDhBRgx84 z>tt4eRF#J3WnRt`C1+B}GLt$nRWknS<k92tsMkwi92ukX>Dox`mUmwdw_GHLNi|){ z%(x}~@XbPEgvXD@$)d_Gts`eHRr$aE^_f{z<-dQCYXz#qWL1fEA>Xu1YiV~FXC45C z1Mx@s0gz6C3Ba%*TR;(Jy7e1x={1CTjc0sD8Xq`q$P!mx0}=}wy6nK*ff>-g1rdP! zTLg67hFnCi2!+aG1;>iQ4mK=Zwy6&XAI1ucXni=er3;0**uIcDQ+aLjs<hFHm-$R; zV*|krw=w+1W_cmC-G#E4oEP~<GK>}2K+9sLLI~o*Dm>oLL=9m2OFuZAoM@@^gfF-l zP5BF6o=uKQ4iy&sqlqk^>q%A1QfI)cdU2*F5A*3n=SJSGd3MU@68<d;@DQg5fTt`D zrnz%uI$s^M$2!3L*4R#?`pia*VUmn}0x9TyV1!0A@**0-7kNng-sbx8Webk3{4<0K z2OgmV<SO(l2!KA>Vh!jLssvaA=3DRk5or7`$<sSq-vrCfMJW8ne+TXWC9ozJT@y9_ zImPv}_r4_!6~Q^kqSJV%q57`zL<ed{Su8@QQJ@K(rYE{i^CM`wPSY0=RJ(s0{Rbj; z)?dIHJL?YEfY`3+LDl=4oA<fSvqVd?uHBVt`+k)65P7IzRchB6n;S*N1>Q8kFu@up z@9WLm+Hhq|zLLpjiIeq<4~Mp!$wKFAZNujdV(SSr2Y6uo`GxHmZK`@ayrvMlwj&~x zVq~t%0#;OW8|3AzN@LvEb(QtCQR*6c?IF7kEFEYgYt7(cU@NWOLRGBR<rCQA$P5G3 zM^D_yhBa4wrPBzz08ik0uVwJ|5rt3TF_2Dx5vc#3H=uiT-@~5hT@f9iL^n5I_r-r& zeSn=+@|9%F_84m~H^>9Vo~?OtY3VX1AP;7{aMU>fYvZ{z4?&hn-GKdDbg;$R`?8A? zrudJv@$x8_JHqw>kVdztA3%lyeqOZaARYSZHdt)fzI9Ibra(6Ov`zT)I~WbaM*iO) CZG%Dp diff --git a/model/biophys_sim/scripts/__pycache__/__init__.cpython-37.pyc b/model/biophys_sim/scripts/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 70bd5315972b2c562c60ef06b7249612f1af6a11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU&YQ=F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra@4I5StjIJqdZprlwoK0Y%qvm`!Vub}c4 ShYe6&X-=vg$T6RRm;nHji#pT* diff --git a/model/biophysical/__pycache__/__init__.cpython-37.pyc b/model/biophysical/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 0e38967ce2080cbe0b2a873360c209e79df427f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CU)j!9F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KQ})mHAg=w6Ra>ZIWb2+K0Y%qvm`!Vub}c4hYe7^G$+*# K<cQBe%m4tX;x~o> diff --git a/model/biophysical/__pycache__/run_simulate.cpython-37.pyc b/model/biophysical/__pycache__/run_simulate.cpython-37.pyc deleted file mode 100644 index 4a3a26a17255af4bc4e9edfb4794c334bea28174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3445 zcma)9TW{RP6`movTrT%wNtWf<Rs$AjE?YQj^bQC?;979q2S+X(1W6bH1jU(Mam6K> z8B)?N)(?r2|FJ@!`j_Uh?L+++3bgJyL+)xV$UrIV+|QYFzB%Wc(UWf1CGe$x{XTql zhme0@XZhjGWBAE`LBR;437JsepoAIBOibU@wdGs7Zukvd+rF*qrr*@HGimuQ$XKkA zv?m?Eqvh?SJL&m7N}dtcWX_L-IsDdz>2I(WbAKfMCf{Q16GQxyH^#SFhnYVa_sF5? zZ~J%ro#`&$<lFoX-?=a;;Tz+-i}zUfl2Y;&N%t(m@13~f@09rWDVgo+`3Kxy>|PRF z!+*xeg<i`{X8QNPz5g}&hNQ;VgqdHEe(yB}cl%V?qD)gRUPF%@yf*5={VW~EBbeS4 zTxO++crc6;o`w@1;mYM_LgO*~<nN*2#HWn-1~(TLqnEUT3f#027O0!dW=*Ia=CBsj z00NlOR_&K%`b9h`ld#~kkHQ2tlI&zK$rw)tM{$-PPh}j1$pCB(WW6xLz45~u?cRr< z+=XIJ=OiF=14^(5N<)_>Bd{Ai=v&H-)4VK#vCLA{&dOrdal<?hBJI3#CSe*6xh(po zvLsK2!U5%?1;yWp=tA}HY=7_YOUZ>i439%LI110gbb9#5Gz1ka{LLXxPvv2jgF6wF z+K<EM@zJ4-3;szSMknEjgKX{aBkk~`HHROqJ3Ppz$_auvjf)`oHEb`@9%9-Q|7P23 zAP$zxB0OdM5FiVF8YDcdf?SXV05vu)5iS#2=GcN3934h9vqsh{oHrMZIUFX$Gs4$6 z@SAxkWqitK?eIKHgGnax<A=VBF2_ZjrP6N><D!VuQQsB~*h*PR7P1OG%r?=6!rvOk z=Rui<Vj4&uX~DiBIylwAspX(Xx+;38tc%Km<=O1PP=y2Cpf2su*}Zif-dei?13_7V z@ji44GNuayW0sOaM=vu*08H()d7xUUNaIsDpk(F_@SrdqWWOPrXp<Er*+?}QKPpGc zmE}<`vWQEmEQs2qPqkau91&X}`51l@O(C>n%<in4zS?kQwhhbhr_b=e(7=;Iwt5AI z&dI{KB$P}&eP$LjFX=0zXpHSelUZ|PN3#Mj$2Nsk;HJYG7xV{Oal%T<1}U?aYR=6Y zq?{Y1S|DZBQtsTkL8^TvRkRi^*w{vR=k$WSYRnspPHlDPQXc}0bm!m!tY|EH73)Fk z7OdJ>9ZT;(VD1A;-F<RJ5}#+RO!!M4GA>kC7DyMR4Dzrzo^39>9(MP<59I83`&pSV zFU<;1fQ+Y^!Fy|+Hx${Vo~XEC;4fK2tGx{*Stf;d@YNF!<3cO`<eK7&X7t84DRe)7 z@$xT!e)0Upvu|d%bxvgvQ`0L$e|1gYwKX^Cyqoe;WNDZ{k^+?m$R;c-Lf^&|=B&Tz z|6xf!gE%d?fVG1#j|bnCT*O?ilP~H3U;{*n3vm~a7n@jMHY;bu3yrZ(2yq+7tT-KJ zs`d0d;yLEGYD*vmP!aJYQ6^X;kPcJ}RcbQ!cgh?L<iQ!N2u{-MEY<gpza>HaStd?~ zNp=><0@f(^OaP7Qc}>c|Hpm{8W$!`DcK~y3lz;0At!iK^i6=5Bb4?J{p<c^R<t%TS zr=Uyz779pG(=iNSnQdTPs8{XYs)eH+!=@JP0Ux>7czLPvpzk7=<9!+g$_<v_2C5ST z-<4rf&om(hMgW>>0lv?n4ag(5;uaPfexwoMVS!iDT7hh-Pva3ZBqHrl*Ki!ib}HIh z-JnR)D?U7hPJwr*abW-z)XX?1RZ`b|V@}`dn@fTz;Nk#cF@O#%xHv4G!d79A;qLzw z9zk;g&z<qyTsTNpsROMRwwME#ODpt&n!TrKAt3NGh)8dk39kygf$P=ZULJ~Y;zij6 zZUMIE!QBiOh<C(~!_znu54{z2dLX@o{7Sr-=6p@M5CHJiY^7X>hb#mH+Gwg{bFWI> zBJ=Rsp!3|Tb6WEQO03zaH@Qg*D1Fy{KqEQapZuNs30{;U<;(*s-nrj3Eo=MD+AGX} z`F2nPFkR)N_DU1iwjQri<7)K(eU{BSb;u4dtNbPqTCo48XZp5-sK25Iu?>MH@IF&U z5-AsnbH93d8JSc~css>FURqGccfX;Uwf%mTzDwIH?x@Dz@?IH2`Ysq$zv-@Jhq5Li zJg2|}iF`p?7PXBHct~s*(8BaJFlEF;G!oJkR|moC|GatgMm1#_;T7M1UlD<?E3u2k zFR=I+*PC)GRSVFK_z}GH1pMDYRBs)ec%<x_dOn0nf2)4^;S*P*7mup<Q#U^u0q<51 zaamzzXGdd*`U+1pQ2ZP>utG696~Dy(>a|)ihKBnAuAy8tfJZU`pl4zd76Ctxl*P~E pVhte8Ci=zYd|GATXXu>7qC=h4UkB*0V{Ys@4;;F!X;33b{|AA;r`-Sm diff --git a/model/biophysical/__pycache__/runner.cpython-37.pyc b/model/biophysical/__pycache__/runner.cpython-37.pyc deleted file mode 100644 index 8e2fe8938c8f594ad34360b7c5f3b1c6cb0d1822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6212 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 NDApkA&^Zd}{{WnE!MFeb diff --git a/model/biophysical/__pycache__/utils.cpython-37.pyc b/model/biophysical/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 99d500266e0dabc2855f88d779afa299c45032f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11520 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 Mm{oi7J6h|10Jh$T+yDRo diff --git a/model/glif/__pycache__/__init__.cpython-37.pyc b/model/glif/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3f942a80d22d5e038ed63b4f05a34dce334911dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmXv}!A=4}3>~;gNce}|l!MDbPsA8k5(o+Lf?mufL)j_Igt4=kSuo4ZZ}H?`_#IsR z1aF?~f;MT>_Pw^R_q|?MiShdzUU!uGYKnhrNpdG11yDvkE7O{*etZ83DNKkdptE~2 zFtbb;V9FI00V@Jz17jNqE+(_-xDQO*;2B=LA!oUO67vlflysjWLAACKa)F@o5VkB0 zf@bc-kAOS04wsI=p1{;OVi=Kg@K~1=A*~$7q&p{qq4D`}Q8>HO$8&K3D<5Q)s4-N@ zCLuobTZc2Pg{t+33T=7s7=FxXn2DwkGhCxdmiUTXXDMUu+2B=1yo;GHiDNF&m+Lxa tGrP>9t?2UaE17NdMY9<k6$~0N1FbFFO6#Po51ktUwvKMk<?y$-`UUZgd@KL} diff --git a/model/glif/__pycache__/glif_neuron.cpython-37.pyc b/model/glif/__pycache__/glif_neuron.cpython-37.pyc deleted file mode 100644 index de5e7147b3d489552075037350160aec88aa59f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14543 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 a$XdjaW$4Q|(pHRmvHlZ{{w|e^^!MMdFw|rK diff --git a/model/glif/__pycache__/glif_neuron_methods.cpython-37.pyc b/model/glif/__pycache__/glif_neuron_methods.cpython-37.pyc deleted file mode 100644 index fe5d3de5af6ec0e662d47ae01b838f36294f7b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17142 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 A8vp<R diff --git a/model/glif/__pycache__/simulate_neuron.cpython-37.pyc b/model/glif/__pycache__/simulate_neuron.cpython-37.pyc deleted file mode 100644 index b84077ae06195ec2a7a91df07812a9120df19536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4576 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 a&F*EhLAT{tUdvnZ8eY>|^=jVtJ>!2BVCA_0 diff --git a/morphology/__pycache__/__init__.cpython-37.pyc b/morphology/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 7168fb372b6804553917a5bf469eba7484cf04eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUn$O3F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>KR3UqAR|8~KfO{vK0Y%qvm`!Vub}c4hfQvNN@-529mw|2 HK+FIDA4fF! diff --git a/morphology/__pycache__/validate_swc.cpython-37.pyc b/morphology/__pycache__/validate_swc.cpython-37.pyc deleted file mode 100644 index 3cd2866438fa7b7b80817543ccdc21e26bab2bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 zcmY*a-EI>{6rR~#uh*M6gfwas=*6gNL|lPWK;j}o5j3F^QVCUorrie2+Ox42?~gMx zCbqS%)CQ^T9eo36ulg#z=mYF+uefL*fGfUPJ8@WP=jY6K&YU^tn=@Zjt1iKp{P~mr z&mtlJ>dDDxV{i+<e1e7(P9x$?dKw!Bp(HjvlaiqmSd{FMWQ9UTHNuEWvE@PfJxPr3 z2sgR)f_OGBaT|R(aCo_E2rnofYdn2GYR((%L3V32w+F&c+ChtI0lq5!5`GiE+<{b) zXY`rz8~RsfMqbk~Rn{-$fO5)>7fwc>m3GK6J*HzLGq~9`#g?+Ul^GvG`ZL9Pd2D7T zFLfR95G%Hp4z?gEuaX_|_}bV4#>uQzGA^k~R?>1<vojmkEb#<7Sk3H%sl~%5dqla% zWLzFRo$UVj+p(kOGKW_R%}Q3u%3WLh4NZ3<o%m8<<_e4pjN2vRe_-bI_{4fveuepK zO3C3L*r%G6;mh1$Q!Q{4-p%2p2E1M$&u4Sl{3_8cH&@6iSwY;p=1VG;VY8}F`H~(k z?-9O$c%K{n=Q4Z`Q`QVvD~)@;3Y$^DjzZO8yLTRabAR_Td$7074#FsqEbdFiI{x#3 zsZPKS(kM!g!lcc5BJBl2g@N2G>}i`<Ys_a7t1u_hRIw!GQ^P%91c_pIci5#XS1+Av zT&pn|9QLsk`cX7wVbT(TuT5xZ(vO>gkf-SDH5SHkz(Zfb^-dUZ7-i`};hIcipSAoX z!M;r}snsd;PU&P!>GXl7)5mDqBqNWPK_Ze-j<6lmUrE>a-8i%mCYoDn*bC5`VWMhA zZqz@|X$$kR-l!4szsTFp_U8U02@m)Ej?e2&|Hw~<`?nLnl_uQ3z8@sd<vzlc$QIhP z*BQ$FufpcO3{`NY=eN3kJAiH!0l~W)aVmP9G)mjUjpu$8a-6auk6QKK@U43@3Z>H7 z+Pb0r*N3s`h`ooq8Ko^hl3Vo|_>I0yqpLcdvqVlaGzpj{fKV|qP-pDRw4d-zw#Iiy z7w?^VgY-+Ja+cEEISKw~V_T;|=b%XV`kJg2aGXUm#z%URX|CA%8n5L>$VY5@wyVzb znq;BgL9u=kf(`ZDp73RK<1A9^7sf%dSVv80Wo)8Ys3e<GOru7hoYlL#BN^ydY%pWn z!`ivrM0h=Sc2duJaR1(I&jAOy4m|+<*jv<bp9ZO+^N?5W3|c`?g=vyo`rO|6vyd?1 z!5}x0Rp<vwSja(c`kd#sOoa-#(CMpHa|c^A^fmL`S?;|B(7sWSOkW=<mH_sudYeWO zc5u&gXH#!U<J(|7pRD6fcx8kKIO)xuam+KrkmqJk>rWifker6X(f&|TMkgw0^7*sG zx(tcDg@%+J>KgNOo;uXP$VTrN3)C$n7F~p7vT99xgD%ho)1k}s0!HEjY_zl?{pq@{ z-=J;$@&L{7GgNj|b5wR*%~u9DboIl?d`)z%*ERMS61+G!ETZhLE1ps^HYgdbsIqc0 zLsx%FRE3)p99|@>|A?1p`W_KnZEJV5esVkpf}Yem6gR>8^1VtZK7wCj4o%I?9bdG; z0~zECw?(_J@66YFD)M<Gw}I6{mb(Q=&t-AqiIMX#l9ze{<pi`)BDaD;sA^`xb#27b z3ONmmY)qOW7gp?t$q&$$nh6Avx2TPnJBa8a;w;v*Wv9{5xJIK^5f>rw&Y#qkdJA{4 zuGwtqkvNCdf`MMO=Sx*@_QObp$<)^qV~HOJjm8;YG)E@naBjva??=Jbrw|oRIdlnb OIdE&qbT%B<q3-~~A4u>3 diff --git a/mouse_connectivity/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 914470fe1a5098208709aa2776b7522c73215a89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7}r=Y!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh{QGON&$EfqL^&lS?woGD|A;<Kr{)GE3s)^$IF)aoFVMr<CTT L+JRj08HgDGqyabN diff --git a/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b8f3b51c0aa313b25274af737a17c9a742da0b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmX|-yH3L}6hQrGl0Ilz`V$#w2R4KdkO_oXDi$kJ<k(hgHFkoXq{_%gu(2`mOIext z1t#o1xY9lMq5HD$r_(WTqCem0I|Sg{2PX-fbL-STI&i>Y0Td)qA%YYp82TJ41}Y$d z3Q4FU5<wuKh&cX00*P>Mu?W27gAYuGJXnD^{BfH=jQbfYsI`)1J0ojh`ZHEGx;{l? zM%$zBY9|S8S55w)=vwsC#25aD=gDEtDG{SSJdPaNCYQb^#w0qf>x2Csg584WctoN@ ztu@G<Ww6J<W8~pK!Gs=>0|^+l!hQiW@hOkr*W@aFvBKDtZYW>mbVqfU-f7B8&FN(- zbZgVH652Ayvf6YueUf=<-J35e%C_!0*IN{>f^V0qY^=y!uNJJ9t*pD{+DN|4GO1;q bWs9oohu5m)O(Aal#dhW}hw}iz5FhjpKFEfE diff --git a/mouse_connectivity/grid/__pycache__/__main__.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 712ecddbf721b338828a9657def15929d0a58e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3891 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 diff --git a/mouse_connectivity/grid/__pycache__/_schemas.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/_schemas.cpython-37.pyc deleted file mode 100644 index 4d9bd17701573030aed1ec14df319b187f26b9eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4312 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 diff --git a/mouse_connectivity/grid/__pycache__/image_series_gridder.cpython-37.pyc b/mouse_connectivity/grid/__pycache__/image_series_gridder.cpython-37.pyc deleted file mode 100644 index c29022a3fff699e160d7048517b7f26e65fabe9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4859 zcmZ`--ILo^71yUN*<O3I*|ga-1Sd@g)TRlcr9jv)X$xdBFoq%Nl+i4xTHm`H?drq1 zSKeeDyEBmVfd^)I<E6u_hbR6ez4DZQffx9lD_iSz9C>tfbU&nff9IUvIr3*~YYh!Y z`maBS|J>BH|Ip3+u%O(-DIY^Hjp?!G>*{Lw2ChbICYEpMWuNWWRA1e9n8~czO&Wd! zeI~QxX43N4lwOP5NyqOb>;Af~-Pc&1IWINl@N+Lre}m}{HP3y8w`o03FWe~S0%sy$ z>1aYrOAOOM4tJv@+~>IOC?y!?Q5@wFm!46q?Z#REFbI#hz?h=_G)h_abbjBbXU`84 z$~~NN0KwJXe1n@zXU0qIh3;FlkC&QnGn>_Lt(B|w>&#^h+&iqvTDZDwjkR%Yunt?t zwaL!04P0C7Jln)|ja^`G;o4?zvx~TP*cSGAsn~cx+jxjQa(Q1wjB(MYjnZM@B>X?e zDSrr&Yhzg8g&}X``iYU7W9`6tp-=URp4%t2v5x!t)EH}l^EK%X-eB~KMv#jzm3x^; zJh!Mn4rQ3<qOfF?ANua^dC1fn3R9xB$@Y@Hm<59{e_R;R(BIk}M!4^1$sofFe)_Ot zE!^9SQjW1AOr&tJLV#~c9`6As^_+ie;vAa)JNf+1&KHskxf4DP+0EVXX_y}Ge42*+ zEM?(GJ3Kv-JK2DzvJaUJ9v{n{-$c7R^u`YdVgC>yVQw5_1UtNyWJAfZrZnaKJUWW< z<6HXx?^fvwcn{DFs0DD|92^&Jg}?@3sodRc=<E0y#_00vHn>?$=r=Kg4!V-JC~N!) zO0J#gW1tVb4W%1OH<fNG-BP-xbbD-LWNqv~*2gYcY21KxBUm+PjBAk1aUHV7G+0jW zd25A{4hlOIB0MhYQ5vu)kwpWF1SV0sUpUz?FI$_W&6`_-vtgeHF+bvQ(MSg(>vJi& z6df#FtU(m@qbwdKTo&#;m}JqJtHI&ZQ0z;uDb{JiTO{5lagoFpiAyBDL*fdFcSuxE zS5_|tAznB^5T#Kb1T;a?<21LWw+uRK^wUc@dS`_#=5wpSpa5}jo;8Jb0M|cIK>-p% zpnPL)0ont5YVDvE&=c?kJ4P~H_0^cZO=A%7>b^d^cbGx<ful@e_FnxDhfoaUiZ)*D zZ&5@H5fA+=6mUir1RP`~7tpGJDw?xl%7X3L&D>lYvwQN`K!hwBN>4A5r|4P0@si~E z{Ece#>1%(Ak+KD$nJvAoZyMy?qYqc$`Q~R-2$Q4Na4Lk4pj6beF^1buHJwmX3E&%r z6c9u*nCaGnZZGIHW`1i=5Hu&S!+|r^b?w<jXznkxKei{v*g!i1O4puz^(8EbAh3Gk zUA+AjQK4rqAbS-J;u;C^L$4tyrp0v<r_OqIP*EEWSO^O#e<ersOa*dbuzq34XxV8y z0BSg>a*g~Yrbr}6Fmpq9$amGRq5ODsZ8g%159kxDbP%go@csce#1jmhPTMB{a`VIj zFkp;>+Sp*ml<ok|ww9CoLfg_#+$l2D#AN0eIZC;4+1?m~eJCRXK)W}3mm)6;<7foN z=sy3!q+7aMmmH{DvcMzd+u}Ve#cLMzINRSRda<H(FDq)4I>Nm4dpG4zgNTxrIED8z z<`q^P$=rAE^Zd6W!gSw#I9ENZ1lm00$A!)E;{h*fnHseW`o(IsRcMt<`~vSNnHzq6 z$=J{xee}T!%-=M>PoUF5z}Imq-%g>Z#Hk(D#WhN+WAgy;O#nDdppUJo0dpX|!aVgc z83;6w7X8G*NYMB}gBi>u&u7-uoY?4Tj%@~SMjxKNr77b<+eU<tNk(p?J3B^q1eakl zh{-f?&ak^DvZRZ8g+EiKiqbsmKEJ)nW<6!DM_x-1{H1j|Df|_AopK|ppIqFcuG=Ku zC-DJ^8xa1wvSC243(5qeKT-kZZ_bv)LD_j0l<0f4l8<g;ZegqS`Ar!|NHS`+@2c05 zW#{dslPnQfa}Y|9rkY7fv}7y`F@z}E&@btuD=TceFsX_m8?&nzqUz|``yeUfg$^>g zvSUn4WkP*yDkGYR2OTCcx3wpYFSW0c0ALDZboW7uav_)9K^&%`=!X6NFd4>So(Tyv z0Q}d3MONnPd4?cr5+6f=pH#B^2s*rbm?J$1!b@Bru>?eWwx?Mkdx#;Da++psfW2GB z=<1tsn9Zr!`V16b;TgGhKm{N+`8O1Y;9E0SbTTz2MqWFqGXvg>{*r8--547H?Rp8C z>Nm-|%U;BR3lLQtJo&idWl#6rs;n4YS5+c8@d8}3`~ByWZZ*goeIj_DM@O8^N6kP# zb^Lk#(GBy{An+Q6kqmt6cUcyzI>T?nw+6v5%>)WO&IE;aS&N+Ya`6c|W_Bs80p|NP z%p7nb$V%czB$f=bF)w&kS|^T_lmJUdHQIU`ZrVn29lf{0K(Ej3lYh`b*NS$2f}1yT z{;V{Cf$EIXtTUxNU@HP4PB(g^3k$SCj6MrecPYvhDHNS5pvz$;Uz}EQ=dl<#vT|PK zuV)bvchLVAoTY!Ns=21G%y&yKs$!M$9yzI^T#A+Dy~D{6r$nrZHbJ~w$Ze{~fPS~k zW!U#7cufwIc_N!_+g{!_tyt}Hmf=+x7Dj(}+1RMW=y`m`a(~6VYL^Yf;mRmHJ7@JK zKf{x-DX@OEDa2v9soXe0y-C@nj4;YBFtF;UPX*GDD`uuftSBl!yXP*L313e1W#HA7 zg-WX~`9FQM_~($4Kc$hs0@*94U4%vajKDf;@?vv=2LmL5beIf||9*-NVS^C(-ii=d zHM7dSX9}NfJWqWffr$tk>>ODW`I0iHqH0jK(za-vIoGH2Olpp<hLX(JMH$RfusE$V z+KV`=C|VUZJrp3Dcw13p_*w*KsDj0gWE!Tk+QhG8Zh-m(pY}XeiYvlA%1B*?=UfsV za#ZTnUHafZ2pd&lSXcDX^%c0hHl^pS(|1uC!u<k#r3XpIhB4`_Ab2ti<5`ab1_fi~ z$ASV?e3!&^5*~@$Bq*d5*9rOxDBXe36?aM8BXMeArO{WJpnOA7FNq6K&^DdRPRm($ zTxZQ`LaWnHjq=VH9i+uPnz1>YQT&)5LH>q+4x(o&52ECYP|WZLkA5wb>)Fb26!yL| zCwE2HzFYlcBZwNx`lVYn-o!sP>AW;L{dY%D$`{0=NU^&I`21JvTeZEy*)9?NIeoWD P+Nh(-_ENU=_1gadm)yhH diff --git a/mouse_connectivity/grid/subimage/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 70b188830a3fa8ba3c992c092612fcdd16d5b945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 967 zcmYjQ&u`N(6t<nTO}h-HX&XOIy-ZpUTZcG+5JEr&(xhn|CbSV%id@_6vL#MrCuQwg zBoJ3P@dvcx#J^;Yoc1qp;yI(+EcxYo?|aYw{Or75UTz>5^5<vzn;`VZI*S25dI?iM z1;Y`?F$xeT+=+2Q0)j1eV<&L~x5SmWl2n5#;3}_uML~_@L)7vvp&A`rVz4c2mOE)7 z^TVRIm(YQLz*2_}Z@G6nG1WR^ix9JQc2r<mtsR(p1|~<Rm}5@9VGMW%y5@N1K-8T> zWP)ZD4rq!?Q~^XFtIDgh+Ju~X6Fetn9_d5wcRY1QYZGTypChPsW)1s2LUPwd`O;ZK z{lI7nryQ@s8vf*J2lop;vV8&OlY5LlAW4qV1W%mP<vxLv*AB){Hn*r|d6bBjZf-X> zw=$J7q4j?+7DEwBdd((4*{*2lOSPY>gyseX>pBw*mXKi{X<djgl3bh{hsApQ;DkyZ zM{>}-*qt_M-YmK1#iMEKj;Y1zU;vz1>QQKECzbtZVCn;r?*k!}@iaiI!MJ+|Z{Haw zOEcp}61J{Fhm9A8R$UkdK4cbI7}-nH!8%KmtjI;kQmV8FvzSVuP5sR|6ImXm($vKQ z20mr1NQ#)|snV@V(1;||hMeZqR7$zZvzrke8AmAf3#kq8|BgG)y6?46x=T+e-|5kh zRF1l@BxR}O^l?|nq3))ckeY!_vy+kT?nk|@j&iY`QFdmfc4-_#20v>jX#q;1RtmU~ zVU&;B0~PVME_&su+9C8c%ENFc8yQ~}GF&iLoqh-gIX+$`4cx$Mq(KPwu#Z>3+aT&b zuq{v3;S=0p_K9DYE5`<XMu#^c*M?Tu)l<I-+c#b=Rd(Q(xd(*to+l|UV)4TM656Wr Jhz}Bc=O5}S5=;O9 diff --git a/mouse_connectivity/grid/subimage/__pycache__/base_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/base_subimage.cpython-37.pyc deleted file mode 100644 index 1e4bd31ab53eaa6ac6c66737db80a97e022777e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8382 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 diff --git a/mouse_connectivity/grid/subimage/__pycache__/cav_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/cav_subimage.cpython-37.pyc deleted file mode 100644 index 3c357de1d8fdddb118c56112d6207d1c30a59f57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1171 zcmZuwO>fjZ5VoD{HoMJs+wvhHxNs~I+XFWQuYev95~`3YF4juH8@r3aAHh!gHfX8z z>g9)kIPsTq<%IYLoR~>js05BYGak>EpP4+GOvVJ3`}CjqmJsp<59^hJ@Bnr^1tN*0 zhFHoeMVT4KS<e%m^gQKh&j)-6JTV(K<5_Q;nvoszaW4<drp@^T<e}U!TXxE)cAIb8 z9lk@!V<Iy-dQap?P5)2$u4G4KZ~PUqlResHQlIFky*q?M`qq03e57j?VA}|XskUON zil){^*ILD|6g`t}`plbl>D^JYc!Cz)<s-GU%GIKVaKE%WPh72B)OEX7m6&?H7zhtw z#~VNt;ZzcUfJ(Mx06`+t_XHpqK*_^y^FW-egLJvoF>1Fgpf1&oOL0=vL6j<#SRXDx zo*>!>u;U?+ntY%u@(RLVBOmFzpYnaOA|DdTR`esIXp{Cf$u)wSckB%8;67O~ygy?r z@&bAU1*L~!6Qc5QY-~~KQ)ObvL9sXJn5+1v@k?C_Q#fDqVGm;Dmqb;W_T0KCeFNBp zF0+lPHRu7=G%9n<$IiQ-@8etewBP5?By2;H?`H>h=g*@GaV}m8Ia`Q-g=^;zohZGN z;?7*TlQ{PkKwkp&)yp={pX$XNI-zb?qI?Z417BmnLcZR&zKIGda!!>sj6~h;FN2o* zv03z`?_(9~!>nq%E2XzpQ=^Xv;942sRJ;nMMXZmoZJM#1?NUZ_%GleR7n(QwtM4HI zmlcH*Rux4zE(+^qV^GeE;!PvW`3>I+>P@4Al0^j*7{e}P>oK`Nc2I{uAqo+vAY)n5 zYxXW-?Bk|x0>lnDfZYc4Y6-*CC9#d&=(urZ?Y)V7;2K-CVFE_{dMtI-&YbK4nQ81D zRM3xmz+nS#eHt(szqJN-_9w721a|i8e+mP1WxC;$g#aMeAcqamhYZOG3BKmS3lZdi cuj{gV=Ro~~gC7x%oM!m344}_hPA?CC0FhiruK)l5 diff --git a/mouse_connectivity/grid/subimage/__pycache__/classic_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/classic_subimage.cpython-37.pyc deleted file mode 100644 index 9caad5f28298eedd405a497bb97bd029728dd885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3743 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 diff --git a/mouse_connectivity/grid/subimage/__pycache__/count_subimage.cpython-37.pyc b/mouse_connectivity/grid/subimage/__pycache__/count_subimage.cpython-37.pyc deleted file mode 100644 index 4b199478afaddf0e1bd0ca3408595fdb51a62c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2882 zcma)8-*4PR5caNpcRt5=Nz=5X6zG)#;*hvV@P^t7S^+{r5mE(0t4NFE-CW%GS9k3+ zcREl}EA<Ipc|j-@Py9=M<*EMyPt2^(ce%7wSn|%UcV~BIzHeuIr`Pi=c+x+A4i48W z>u(%1PYXJq!mE#=5tbmal@LY<_GwHRHPU9bkq&c=Y_T>-JMJVdbIn>O?j|1dOurSc zB|hsxzb!g(KUrt%$p+gX)|ZxWMfZs%x^hFVKX%v!LGM{Z?>U@p4N2vS=s40*mhQs9 znPyo6vKtjr!JB9ptVc;Omb@&YI4UBkpA*!i)%rJCJQ-){y>kC6Tv2V^ljB6DMNq(Y z&DRjmX&z_Z(ceKwT8sz_yd{DPdyM`%V*=i8KD7=A`thX8TDA4yyC>G3Sga#_(F5s< zzE}s@6&vCLNbjlTSZobEyIA$^W@TD522_3$X&t3w4i3nwn`T@`<1~n?UJx8}c@oAY z`d|6_jQN#^lZ6UGsX}*dHbRQvt;4H7f~K$vGP54j`*cQTbY{<-183&`L1(R5Tae%B ztos}N6@Z;}W)=rH!92PPq4V=PbUaEAvTF0}!8{L&Lp^k=mM(LtR2Pn^Tn;Ovg7fN9 zl-`#i2ADT{9LdShs~j!k1Li9!%24uH9?O_@qLhm$(aeL6&Vvx5!1`epC@q_@LTA(l zHW%?ICs1QuwT~X6L@IC|#(~zH|7HF2=<X+b-)gD!UT_$Q(SGnSNGE%rr9qgbBKUYu zrpJ0O%VnxVXtVrqqW8Xz_V+Y!=|edG2xtPjaSSWO(N2<;U<l}@=+bdiOm@a95<9xw zH=NrE5lG$)NBKl;f{kdWHkjBO#Id)?^zsVgqb6D*G8G?`2;5zG^&@Cz)+yXO<lQqH z;IZx#;fU5R2o=saz`kaNiuNsBVZ%$0+Uk3hIKF~ksp#A^vaoMisSDc9GdRx75Y#(u z3Fle8Z%cHrXK3K=svg*(kWyb%Uaqn^tV6=qYJT!GNTh<~VZnWDP#?CL7vy<7;Ypy6 z*g&2jM<GUr()>VW2|r7xs%;{v4Y=$^vwX4NiyF+`kJ3OzQ#mAR3vJw9G*{4=Eig8e zz=*TwyahA*GBg(LQ=j&UOMS9QJnBNvBh$B65qjAc3$!TgvOsGW28DG>1er&X3KM++ z@qb2%RXC?DL<7f0I{5uZxR$3>v}Od?`~)LhajTAfdv`hrvm}R%mW~IDPz-`FER!-0 zicD#?wfGMFOL!ig$XKhZV2yem8g}j6{2V|?GxgG8yXwT*cnn8Wj=AO+YuwB<kRF%~ z*ZU3FtD<RMt-<0b3}POnVn|Kk+12G44M7(BpGW0F?U95;F=rAcDD6XI0SudToA`v% z>9tiLUeH>guySYKhh1KU!b*Id-RbpZd>hNNbTz=2Ojyr{%>;MoDCCp6hRpyQ4AXzm zakFt@dC+ZGt=rHT&&hP~a-Ww9D^7Pn&m@XF&^hmPVV^qSY|GHkkV}{`B!=5_%Hgab z;ryzv(ha;G7z(UL!#hJV%n1sCW7{hg>I@Nw?eh`3j_VgBO0(jB#cX-%=b&FFRbb0D zUfKVM+EQgDYItc))CSOjNLY0mJSB5UYxzT61<5X8d;?ahcd&UEn^$0bslj+&yYe_l zrN-1yn~Yfo^33$c%Yk0e0vh!}ap+@J#S{xw)#E(LL>Xh>=lnq##Ptm8EBT;|psJd3 ztJ&qn_-yvmrY@;B(T#Iny$9c_-n@v0GLAW4UR|)|HPpepYAQWirm+}f(rnv(&)sr; zx8rur>~Iq;Jt&J(fu#yVZfH>1dZMfDL79d{mc^R2(lUW!X*h9JhfzKmrSKyF)przO z+JRpO^OL4**aEbp6NSHK?1QE>k6tXzBP`9M#b2Pp3|-NvWWD_We<$WOTjBLlSe=c@ gOJD1rsUYsnI@-4}$7n3+KH>)mx{#!Ns2m&izhmYJUH||9 diff --git a/mouse_connectivity/grid/utilities/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/utilities/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 2c6828e9aeff5087cbb4958aa0c97f21c31bc822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmYL@Jqp4=5QR5jAwmvfp(*S{#Gh7d#BO1kWQRDo?uN`p309uP$}8D=1UoAyh4|oo zZy4smtkQI#ME-t*E?*sfN@Q4wxhJq{r-sS)q3Uk^$LG49>OEu48V+E`Ib6WEdg-AE z-oiwqKeG-MdM<>aI<%}elxwDlqY8>6lqg;2<iZ}aQ)n2CbUhZ4&J^3MtjT6gBu9~u YGh@h8G-h12&;INbY~yg=J@po=FG^ZH(*OVf diff --git a/mouse_connectivity/grid/utilities/__pycache__/downsampling_utilities.cpython-37.pyc b/mouse_connectivity/grid/utilities/__pycache__/downsampling_utilities.cpython-37.pyc deleted file mode 100644 index 214412abcba3157f08c11f5d9d9d347da633faa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3069 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 Tz&ep=p+@UPx1umw#~b_)>Bg$I diff --git a/mouse_connectivity/grid/utilities/__pycache__/image_utilities.cpython-37.pyc b/mouse_connectivity/grid/utilities/__pycache__/image_utilities.cpython-37.pyc deleted file mode 100644 index 3c16894fb092d3829114c1e6be31c026acfed288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6691 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�xdMLjL9l&!Qf@C(V6jI9)^CB3c6EeU&I%8e0!!> zsE<^Fb9qjZG<ib~$=H9h+hkY5MuRm=6ZTl>nwVbVn`|3H-#_&Y3hN^vgeE_N@e&3P zj2hQCe)KN)ndB=FvXOp-qR!6E!(9$Jxw=_LZdWs1w;>vCtzMg{)x3&V^BUfq_mp>X ew(iwxr)qQj{|%zH<hl5>J=^qXy^Uv{-+uydRTt_2 diff --git a/mouse_connectivity/grid/writers/__pycache__/__init__.cpython-37.pyc b/mouse_connectivity/grid/writers/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3e9241827390a3dea1119e9d8c2000d411b4434d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3129 zcma)8OK%)S5T5tUK5cKDkWGLX0wjxs9Rw%jpg=evfqVf38W|0p>G68(c`V(twpXkV zC|vU&Y;ofMaGEP8{{ar1_^M~TyLL8$k*21*y81EIUwu`dcREcCPxkw-?3bIG_7`<7 z9|Mgic;yceT;qD8`PEnV4Q_BVF;mO8Qrow64Sg$dQrCCUwz>10=6l@b9=;9U;7xp+ zyv5u2ws?nk@ojVc8*Q+1fz`F03)*d9l<i{?7g2DOC*w3KSL2ioqhL?uX~2YFlYw6L zcz&EomX4ArU`LUFL1@t$cwD^nLto*Qe?knkQ@hX(^upl!)R@}bcwwD7Q|-(|-#IsQ zt+1vVM~_<=*QX|I>=$0Gcc6Ed=soBgOY}|XTUYf{?ZD=GUn`t5_p*Ji-_=yRy<L6v z$92E2oq6Z8v7&*qwQ(k0oeFNA+HhHCr)<h`8jRwTD3JrRv@!-~IU^D6#V4gbV#U5J zZz>a!A4FjhXT#dM?2T$wo&`M0WL&_hq5)r(_u@<$V`TZ<wYfn(wOpU8=0_@fbM2mB z*gwz8+l(Cr(Mgz$CA!rP>IceOS4U<u8k`j@NSQnwG|R@`I17tBPh{zim?&bF2$N2| z&cbk<juTeoA}I188>gd5xh5EP4Oqs5(L}H`=A~PKN|r`8DlL{WxJu;XjF;Vg*a1$p z<-jf7p@=z;MA@Q7P<ytwxK*uNDVP{WMIc8kgqvmQ93Dd>E0-GKvp+QPHqQCa<mo57 z-^obGUAE8o<}-H8vdQje84L4_vyXP8>`3nBBV0)cnUD4-a`)@_*)DD<`T&a`0_d2V zB(UIzTWLO)QGmG_-R}{uaf^<+rQ%1(tsscAxCnwxIHMinH;bSeqN|o05SnfoJ-ux- z_3o8-L-+J`y=RDbU=xy$>2c~;h1TEbAhfK7(6Ur$*($UUL@KnZz@xxg9JQ-aSXu}? zaK*WaaKp?4hdX@&zx&*%dfQr2xB40aQLolP7${p6G!C~BT;3T%1@qCagUjKb3NGks zI}gFtRKcaj>K&n7*b#H;9idktu1-!n{^U$81YdK<?}R{d0bEBS`0&xd6hu41BSFsf zoAYtMGmi?`3i6`gqVYO_{O&@BEP7<oo*|z$Xo(xN_Bsi=4gsdt%C(doMnMJh3fY2a zP`pNit$aL#q_|D$K8ZUJ14q10?KeogNn(Qpom{*{g3wxt`)HNwZz||ezk-fYL5JYe z)o<&!bkC?@Lv70t4`8{Rm7nPUi<K+rn1IeAXPY%=&w(``wZPyNqXSBSmBpPI6T6Dh zN$){FXYRSa3H_Y8=lVAEoh9pZp<h{|Uxj|{s$K!p0!ZC6@3K7uX|D#URfDt#kTz<N zVytN5%)L4TxGyd<z>OWhqIV)t1bU%}JdThIu7mM9sb8O=ASozmiWWqj3q+d~9SDD8 zSuR-I(_dRiDNz=Q;lv-z62O1XUY(f+)nw77y;n%Al2{`_VewKRAb9c&8(h{4Dlo(? zvZpAx27Gas)^M+*{~lRxka%SXbi;&68HY84Zo^nUg3uPiU>TEMGV6>{A7V~u(@Z=> z81z2HE5C&RI8bHvQL>zDPmM3MA3r{I3LRP$CSWOh>O413-NHo4;!d5R&W&{qOi4ux zxQUwtkDph+r*)uxj9LwRW$g$=oOVIP0d&xYeou~~Fy5O4B9bVyC_Ss6AK2nOj0-wp z<w2UIXl3A)W-N!Lc^FNEav7~u@tqge$<OzS%T{Y%rSWTwqV6HYY)K%~kb9cQL#vc= z=!QaCm>#+g;!EY9FVU#74P}9;%XJiT2&XeDjy%dXluyt$rY7YR_`oI~6e#wTf9$FI zoa$8aiLvuioB$U~NLIXyZ7WYG@HE8xP?RQW4BrHUmnL|&B2h)B$}z8kkpgCp`BK%~ zD))AgYn6V`QTzM0Dqj?G{XT9ci3^1FW>p8z`c)bry7xC`%FUU}soa~XtJ|bpu2@+- rq!#^66)1DISFQUPD8218=i?;$l#nAS2tC6yR`s^&-SPU~1F!ur0q^ne diff --git a/test/__pycache__/glif_tests.cpython-37.pyc b/test/__pycache__/glif_tests.cpython-37.pyc deleted file mode 100644 index 7f2d2bc56973a42fce33b8d02a48662a48c5c1fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2217 zcmaJ@y>A;g6esUar_)&<w&RbcXwnpEfNH1`pg@PfaGS(NkivC}Bwh#=*Rx2UPQDL? zr0m*|hQb*-1O+-aLm{D4{($}`oj5jA#%@KXKJp~R36fH{$H&LVN4~Egbh}pb5sd7Q zpTdnLgkI>yY}mkj4WIZO2t^bph#-c>m|7Ez3yGE5#4)^`lv0<tQ+YY{EQC>7Ar&KW z5<gua3x+Qx)wD)xQ_VW58`}-iF!Lf=q%K*aWwJ~?T6u!V1?tlUm{(|()?i*`YqWl7 z@n>xH4DO)#A!;^W!W+>pvBM~8VpYDI#0R(fF|fX7ciDjF8LS#2P6tUSS&$h~e6_c8 zN!c>(ceDXLwA*F)?!YIW0+FbP$Ck7wn6F7^T+$o{>DZle<uf!wLp1heMehLTn==d2 zrdU?i(8L4`<kblpVObm3=lfQ%Kg1KuoNR!G^@fH$v4)o3r3f5#c2C`Fw3Qw2pRQh` zQ!j!}o*l$dt0(g8bcyx5Cn6BXjP->PH5ZkY3+41f*;Ow4F&0uN|Nh>i@Ae)ATlXF) zS9Aw5PL#`2$r)2#8XhtlbHOd}pDagAPHzg6Ak8UD)Y9(u-h=zQw|0VW?{97I1oyVc zg-+P%vOq{3;(-Vb;)E%um&X}ddTn9)R#n%J4fM6KjG0iSV;)OJ7PaPi51KadB1mBn z_G48mvNp3(J+Js2@eA<US3lgj+1?Y3i+0!zX=^_`4zrW?tt^Bf(eR5l%Z@}l@3TyF zfaW?_?VWhPE#Ugk`(fuWj2N6v640QB*CiA3x_N-+M5}+IYMKjZew-zFNWau|@*xm} ztJt@E%f&wY>Xrv|(NMk$yYm8bVewXhjj^<P_SlgnC>XaWm=TiYu{T5$Jc5pkFtt|@ zb&7c%%_QqkF0?enL1l=?J`@Tb*+ZMU7tzRpxeRkjE{v-~#}uvRN>i>jztbxU)D&1{ z_dSIbX&3c)Nr6N+pWgWUmy_+y=%4P3pa1;#uT51x$`c8}Qx)0eOmy>vo_hTxm#uyl zHS4?q$CSfaNVyIH*D>IAO)8qyG||ncDhE7I0~&XvvZz!xA7skzCz3eY8YzqLh(WnG zT@H|ilv@-9@n)5$+<YMW1IgF5$qzKql~IrteZ(^v1iRnBN~{4v7NiXO_GR0(eMp)I zYajC~urp6w2^RCjox%bz08bEL1L_r+pwYqYLE2;m66wzqd0q~^tW!GIvkN`wdYv4d zZksx^^aKs@7COTtN7jb+&=~>>Q1`4f#ewqs()5o0pCLvE!<+TcUG2d45I&&;5&>v^ zUmf8grsyL2)q3mz)L>FIAQEJQbf0k(zNV$D)(wTlTM>QbZzKRKojmPt9%`%l3KyMz zVgfw_-PT5ucfv$$0yEQ&p8clB^RJq9RZj9KinB;n00nk{XIyy#Sat-EQ`*|Ty?57? z5x)rL|G$d3Zb`1aY?e%&@MYjhqks&JO+gl>j9=E$+IdIc_HEklGbchgV1kD5qV99- zz`P87U&k)ypTVy3f*=j!EC`zG#7{%1%QlJki9HaEEWH*0n3#%oi<w{2Z@Dyso)#cp z>+yhbfXCJh0t-a`Xs*-AIWr)C4oV#@G;tyy&lL@98#9HiqG?RSk*n|0n)y3LeiO<f z<oYiI|5Ovxv!;7B!kKQFM?gn62+q}s>A|A?HsCdbgl%dg;tCLrl~wpH8w%}*J;$*e M+gtJ0y}D=r2UH43BLDyZ diff --git a/test/__pycache__/test_argschema_utilities.cpython-37.pyc b/test/__pycache__/test_argschema_utilities.cpython-37.pyc deleted file mode 100644 index d83e4b95f63568a186eb26101f034a33d18cb445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6387 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 H|H6L&Ii_+$ diff --git a/test/__pycache__/test_deprecated.cpython-37.pyc b/test/__pycache__/test_deprecated.cpython-37.pyc deleted file mode 100644 index 37b892d17a91dc02063151695950b94853c17efa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1730 zcmZvc&u<(x6vyrH?CfNdY|@q%m0#LQ92nFthe`;cDoPts4xkmZAga+y!({9vlg!R8 zwnMtn?tyNuh<^dZi9dsXW3HU?FK~hH^Rhn}u;gbykNxKP^WO85?d=vrD}VhV{e6?M zKS)_Lfyq9)`2s>R$qN?K=oNh6#oj=~g3s6e*jMbdA%*m>*o?=4(;6~xT2nS<c*WvS zZpaqK4auLgX!9CYSugUcmQ*9HveYVB?Pf)4OtM<ZXcsk(P97bgo0|}p&ES*t=pR!y zVX!HB%k9|Ujy$LBK7^zVy!RW^q^-oC>fq!4*G6g6Pft?WJxnjsa@>DhrrEHR>BGJ% zzc>BiNR=jo9F9)LrvG_<*f+UV4@PNrmL4mdEeh<AXCGK)tP^XO=#IwKPM)NLwYB@? zm<PeU%lB9JO$N%I3}yFGG0f7!>~(9$BChEWh5*Cr8oB|sy73=F5tiNknP~gE32ljp zh|(!X^es#*c+U8zh_Dn_ObW|qV#(I;RbpU{m#49xkth4;<~0b#VlG+i&0`V^DFEER zytn3(3-0P__>yFW$s7e(ppm+Z8Rg}KPgt^uT*ND$B3*o=iX**&&-L4fNs^bjO_GoB zan6?ii|zmazq>fri~I^U%5<QTq-rI}U?|TEnr|h^cjsv_|DsVS>;HE7<nTBDxzUG< z|A(I5!94P`z)%Il!&8-61dmqh?(fz~JtQ*}W+rxd=<6GpWfV1PWRM`Z=zWWc<Wp|h zDJnvWANfyDr=Dd$d(!`fb5zF+)nLU0@ukuF6HhkoqGo4qWy052&OGzX2Cw)xK>sCs z#$L=r5cDqJdwO1GHXoLqT3U8;(^<LS?R<r31t{vFmQ|1z7wOns|AiJctMDS#WnLbe zs*Re@PLid*W%9wOP)B)Tm982iotL%}#_Fm$P{yFns`g`pQY8;Q(R!#O;ZnK^)yomU z;sN1V9qSHN<XYkFft6`PFz$P8-r|85@|&K12P?}|q;M|j_Mw0-crNKanTj>Koaj!N z1kEYPg0qkT==w7bmixBxickF0KsKQDNUM=;_AWaI^zacwDv3Hy6ds6bdiL}!h-=CM zO;r~)^=+EpA@MqiyCmKq@g@nnMbvP)<5+2`bp19&C6JDFTDNPo;0^rx4BP9>ygOXq zBjc?&7>(&zd~5Lvc2~LJo-3FB&e6Del)tp+TFsrIly>BusWoR-MHN1pm*L*K<ir+4 O$WacW-D+=!+kXQH4Uy6S diff --git a/test/__pycache__/test_inline_examples.cpython-37.pyc b/test/__pycache__/test_inline_examples.cpython-37.pyc deleted file mode 100644 index 0f700b698ea2f2008bdfd0d4f04602c335a319db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 897 zcmZ8fOK%e~5VpOW&34nY0wVD^a?62$)ElZQO4|ccsSp(svKFme+f6pvhp}DCR_Ot? zR}TDxM4b3bzH;hc=mo}0E1`}xpC7Z{`Q{tH?)MV}R{i|OHV8t${pQwUSiAx^1%N;T z7l`6^CX}>uKm$pp;iA)GB)dy22#i34qO*)>EF#gpM3O94WW2<?=mOJ32Gibj)#IWs zVwo(7SP{u3#2~sR@F5!Zt{@{iI3uGGT@^LYtSnW*tfYPUmBCV)OxLxg@$Hsle*+AP zKppTMaPt&kjOOUmlXE=B3n&5z;>Spk8PVY!{~(`3NEbLfy7~j=h-!w|b&M)<J0y;b zUby%;FJ#3^`3q^U$n|vRW%|KLZBjO2Vsyk#S=FT572|a!*hVU=FD9*(tPBUN)ub`$ zetwji+{$N)@fjOSxLd$qjhH>R(%2TVyejfaX167cRCAqd7P+y!F4fk$FUVIHA?<tS zdWP#<+01j}KHx0?kHFjVN3dwi#!GxoES^GdY~cH4qd8iVF|pk_xxga$PB4fAQiKO| zaEC`Gm}M?fjh)mLs1xv0F^pYQ&U{xKG0G);BKa)iP?RIJaiL;%;=*a2SFX4Bar^DN z{k?4W&3hLZtA~N^0WrE}OC@rh9W!og-MHB2$>5}w`5&ynhi>2{x~tB8h?o!ng$dRV zVIHo##GD){U2|!S_Il}i0Mt{5KWKkNKLBuD$l_&lahCb^W|<ze=U#1y(fEe+p$ki< zXS7@8<B2UA+EYx!MXU2O*=GHZtbZN4WgKsowKyr{mVcGz5kQP%5(g1ZFu55K8NmK8 DX_fRS diff --git a/test/__pycache__/test_temp_dir.cpython-37.pyc b/test/__pycache__/test_temp_dir.cpython-37.pyc deleted file mode 100644 index 8d61f61e001fdbb5b5c8c694d5bf647c36bc35b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1539 zcmah}OOG2x5bmDwJp9~UuSqr`LYxqmz!8Lpgb*S`<V02if)ceXje4is_So~HyS=-% zyazBxqWufDIPpLD6?5g}zmOAE<MlccNVL_}T|L#+^;Lc4Z<@^-fsy|43wK>Y{zhdt z>ah75rv3|rAcDq(ZCA=@sawp3)ru>L!<@urF2(P5>?J<)DUoDc6&2z9MwXP-K&!7B z!WEvR<L0VW$^+qxs;I5)H62)@UY;FFe|&`c&{|v45e?B4EpZ?Y#gS+a-8Z!3p$oS< zuh8l(ac4-y-Ex1jq~e~qkMC}OtS#t|r2F;;kdV`^RX8~};i#xS<HIO?mW7ipEqo)B zJP?rz(P}p+Y@Wc>kRD>ll7Jt2+NH_{{ZFDCSW59aeDX#ACoPrk^AQ)lGk(F-S^sg$ z!z>m2QD3I#x}W7T)gj0%AI)_CyXdU1BO^b|c{t%i33uZdEX3rYk=m3Z*u~Y$XGJ4{ zU;`z8p2BAz<FY^yOL-vYN0CmlX=*+=<5~uQarFE(eOTB+o-<pIlBe@dI!*FfPw`Y_ zNx4L+*&xUbI@%zrO$7x4+aTx-y6#d|*O8Ec91LV==Cw@s;z%1v7wha|hDfyuKKl64 zC!c->32i88rYa52c|4W#I^0P3M8XXnqF)?Un8>qjh9L|CJQJ3%Us>1hQ`9PpN~s-! zMptwJOu2Gj0MEWBKaiJXzgyU2Yh|wq*j2{P%3V0ZSzA}$f~>rSx2BXV+=Vx>^vL+X zQt<39>Gkhd{u?j$;BIwQGxasSJ^_31IBp2<9>KW;&->T*yM=%2-(NM$_Ys3%M*Tlt z_ILOG1Tw68I&VR~u!22#33=AffpSNXsrkX~{HE6bnf}k`O+A{LDDJ7mC@B?I_-VJL zu*eGQ%NksWL6q`1noGsnTmyAY5MnJwkfot4tV|ab456ruvnXYE|7{aoMDV%wxV#)? z>9<N{s&MleGJ!c4T&23GV^_R@ZIlj+D!veKHPo!8q?RT?Mt7?W_z~>*!GK=D4ZR8v z$qFnjDPDLtu#4&~$JH_7Y0AqSm<hpS$gI9?lr8$(CRIqhqEYhHY`eV)C;D9wq}HM> z`VOsutkFifHmvtx_2J|JRS&?Xd#vujqS_#sQ#Mm!r8%qMbKC4<3qh`K`nXrVg{6p0 zB=t7;-XOY!){t9Bm4vGatLI$tL>h(lKtzR~W-382s)MQros)t^;RnGWie(U#5$*qh mw!0Fc|7DViX)M3Oy6Y1VKA`aFA#K<#$EWvc$7<6Kp!^5U<(B~f diff --git a/test/api/__pycache__/__init__.cpython-37.pyc b/test/api/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 62ac6ce471080036ae92da55da2f3b4b2d6620a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmZuvQEwA53{LKDYgHIRh#!zgPGVQ2Atn$^8xukxD2ReIs*|GhlJ!D+NtUE5tp*a> z{s~X~5Pkt~_sUP;jVGMz3PWJYcI?=({W%XeHaZAMeg4G0VuZd2V?{9>c7feB5RVZ@ z9G?N7Mgzp7K1$;P{J$xJ(=M<hAOsp<js_9OgP2D=K0||qCwvX`8efOpR(+|@4#iWa z)pIvmd?R~CIKqfwBf-hhRM<JO!WpfcAct00gc+F)Et6`qVkXmel#vcOr|=Z<noJ>h zCVfd>&V31~Wak0d%C^akSt*N>$jVGaC6p&d7;=02?oHyR;P)l-r0=zP;)P{iYDI*# z+BzcDpCTin!fkLfD@dW$v9KPxg~G3<>b0!Iqb4iOn#PKNNT8qt?*qFlAUrz3r}zX> zzzDFwy)>#53AO8lGtYwM#N^P11$;qv4b;!!{=NK-6V~OdWIP+P8B_CoPci6&v#ngH zW0z|qlq*1LQ_fxfOb&Ag?`|4ai~(54olGEtkGozt-vvm!lu9K%rJ0%6?Um6Aoi^>` z#q|q&%2ojd{FR0hkl_ct0Csmk%sVh0dI$6MQG$Fl?$}!xeTXqyv^gFj34RXt$M^uf zMJhS~3owX!bzHeo8rO*u?|n0Rz46yh(!_>pHD)y)*D-9UL1rn|!wvLbz=V{Bj$9iA z!V&J^tN%=~4C|%qAxE)FP+E5=tu&ub!uc|#M^iRAziCm*bwQ~OxY)443zfrmY$$I7 fCV^eB+DQ_%<HpxZaijm2RJZRhi|&NXAHe7rMVshJ diff --git a/test/api/__pycache__/test_annotated_section_data_set_api.cpython-37.pyc b/test/api/__pycache__/test_annotated_section_data_set_api.cpython-37.pyc deleted file mode 100644 index e33a7378396c642b11662a3b5c6114c850cda6b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2136 zcmds2Pj4GV6rY)0Z`O|EhW|()VTsCSp>^bjx+uaxT0jUjIS_GKT&*TM%X*Ui$ILjv zQF=h_wcnrzP)~dVz5(JZ?3EK=fCDGq+az|A;?N5h#@aXkpWl1G_kMGGWu-x&Wlw(K ze_kQvcbuFx3kILSr@sUth@c5csZS}6S;Bk<y_Hz0?c0<@Y_BG4QF}-pP~Q=bSb9kO zCE<!X^sZ=#W$5dI?GUf|2k0XnE#KJ8vfOYJiJd4kGS5EchVMj1Zx(VJ_Ul_bmf=<& z?uU2-8-)+;x&xnn6@(!V$bDj{pn^T3$0T6K1pdR?E?av#&w^CP!FQ8LO+lZX@ig)* z#o(SoEy@PrQNPBu(EMkj9GL%g|IWtfYaJ;);$tp)yZn%6)6r(e!#opweH3K}dXyJY zrbCc<F`nwtUAa5b(nQw_9`5rvg1boqC&d1miL_bcg{%evKXW<ICq4%PoQ8=B;7qTW zmi5_@cflHsCK2YaCQ~kqLW}@5?3duHA~Ar$G1&u*Vu*vVgdJPh$4t~<1<-(z`>00o z6#bEj`cD;(5UIwteDldKPHBH3<8f)-%@0dwD-v>&miFh9Bsr>m*6;Uj9@+i%-c7Go zHndTb&`eaM%T<{fa8jCSaKMuZthB_1dBKf|RCcyshu8!NgFgCoY)rAShN0>0DlW6@ zDKC1timPB9+*q5%;h9kB9%B3P+>&9xf8*9*eQ;~gxoFa`i;i`#b-^=`C$4on=j}Xq zsB_-tVHd;D?aVA6cB_bhG7L%Av&y$(gl{3Ty2`WiHLfA6Ob}vfh#=3xC^(d6?9mF@ zD)~+X;#$6qi4$C|c^wYwRS<;Q@N=mHvdJ8(UWT>*Dpyn;lq)0-wTz+(;zF9J72If{ z09qjmZB#FS_#eTpUPPymLextj7QlFI24k3~MLx;IC7E&?^!ziPufWbZJdqcw+Q&Nv zD*u%KfCHhvEvR~6W2kzl{l}JYVUA2tf6QWrwO{doB^omxSl&KmLsbKX6(`JbE?KUC zIA@@ib|SNV*#YA4*nIiuw|}eY=ZL{+aaW{0{AOO`?W;0t&+5Fr(Y{#e)q$t0{a!m) z?FAY>7%bF)L~+lv=P!i+4p!mwn0{Fzyf;gP#Y_<#NFJz^e+3X|OfLewkCp9ImEFS1 zejQf5hX4NA1JgqS#c0V$_ZF+x_`Xz6pYIe?w8ghmcv>qr{iSc^_sHodOoZg2FypE} kdy1Ga=~Tr|?uThECQ0<sRanx<08Qr7rq!yuSKQUV0c{sbivR!s diff --git a/test/api/__pycache__/test_api.cpython-37.pyc b/test/api/__pycache__/test_api.cpython-37.pyc deleted file mode 100644 index 3f7dd42a75f5e9acbb1d6f48fda9008ae9d38154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4947 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 L*J>sFxo-JiE{4JL diff --git a/test/api/__pycache__/test_biophysical_api.cpython-37.pyc b/test/api/__pycache__/test_biophysical_api.cpython-37.pyc deleted file mode 100644 index 6d613a4923a54e69bfb7d069b75115a250819d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3067 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 diff --git a/test/api/__pycache__/test_brain_observatory_api.cpython-37.pyc b/test/api/__pycache__/test_brain_observatory_api.cpython-37.pyc deleted file mode 100644 index b1d76f968393c05612951f132bebfecf22fe35f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14379 zcmdU0OKcoRdhXXeIDCsEiPX!qELj?v=0g%COO|Cxlx)kkM)pd!ye%p1=2Vkxa$c%x zN+y@gB9?(<55n##Ss*${$p%P}T=tT~B8LFE>@80$;6?&$5F~(ry#x#7U<63Mzj~&p zr)P!_$r~Ufrn<YTy1MIszxq;dZ$`mi`Hz3cUbv|!|3(+}za&mB;3xh;Qxv8!wWyfE zQ8iUuYelW3n|jGGjZ(r)s5GV*lckiIlILnMZKly@6uU|pGgIm|yGuQ0PpQ}JE%ljw zn3G`1Vt;AC9Kd<X9As(M<*M_lGniG(9V}xGv2JIF>={B&)=?LCvL4p^mGV$EcRA{l zolh0k$NJ^<ZaF%@2IbYTyxPHr<kg70%CepEYLBBo+3RH3uBRH?&4y*)zDVB)+avq- zNBZ`%eX{RBq;EevAp2g5^u5GJW#4F|?`3vS_PreGdxag6eFr0bhuN#L@0Cd35q4De z9g6hj*fH66IMVkT8<TynM*3c7<FfBaq;G;v%D$s)iXHz-F>~w$JBi~lHqB1q_!>LS z-oSB;ondEje4V|?&fz%D-eTu*oM3OW3ph@)i|i7PQ*4G^#_>42!rsC0MD1DcKGht3 zQ9_x$$F33%+53-l_5u5lo)7$;++^l8maom6-el%=_EBx-DfTh@4&LH4yTNYa_y+rg zeTw55c8h(6<5~7yX5#oJQ*S7_+s}y7^Eus5RBf-Y;CEfK=iS1!N@2-23U;xWQ~lIT zWx4D*JeTl?E^*r}U!N5Yzi)dLzH+hZ`a^SWnOTKO*~6H_Ezh18{w~=ms!qWzIc2NB z9jk~@e{XX?cd8YRwS&Qz<e>9K)!}rPXW4~&%dT)ew^Fw3dFPpmm&F@(->~PL_eG_A zP0YK0mr@in{b0fNocj*H`7D7szFrdZ1=?Eu5A3VV;3v{(JjDa}v3)h4(|8Yh{Dg%& zrvFUg1GtjSH{Q(IJD*^u;*Pywv+-H`fn8p?bFpk=tIR%e$0^?zcPdq<EDC5V)rA#t z=R<e)4&K*!y=oVh@W!~eSi}srG~qeIo3N{{Jh5g8kXEGuNee^c)fK->U~lqePSNYq zdn+2>fi~O^K_T4FC@z@lDU0e-l4t42)DfkuF>PJ(v^5YK_NnL1!JAiZ+_Wx!bk(|& zzx>hltNEL&!wa5QJv%YsJ+Qg6P+1nv>$7<6<toTQs|Y`Z9lE?y<|GAks+o4mtXgr) zUIR#c5JP@)wnDFe7U#l1qiDk_--%<>D|ewoqF@#$Ol6v@GMyPD0a=QrA8Yffi+|Sj zSjT7vXWeqNr_E?DM*HMwKO1PicV1st))Z`dFz=`A0^Wb6<m)q+ZaianuAg9)a)tW? z9=FS4-YL5UNqfRi+*okSD}Iu37j%@<e4}ia9DgJ>(ehTRjzvR&(hkq&^N!~*OL%;_ z;4O2<?{!OHq4K=NoT|6rr|Uf6>lZK0Jo|lmhqQdu3?}P&^!=Rr^vjj9pRV(RgfJ*Q z6S9?v1HHclCT*~txPVo}9yE%PR5dNB4(QFttig|Av<WAq`6N!hzzN}m>40pA6Ovg0 zPFUt~0{GBa55{|IIO_|?2@8W58Du*ir#6{4gn2_WFT_+f&%5z_zKfdO)C^NILJjSR z@26%j8nfS9;ErPnM+g!MmmrjOM+8O)F3V;7CAw>rnwQb|y~1-#%f)3OvG<HPh##ir zRcel)iLXB6C+BRp=&*NkDgGMGYF?6$(M{QQ&o>9@PRm(wED%s(2?TMoj@0hP4J}yR zC9x`ni4~c47Y`ESXcS#jfmZzYsY$JIPG|A!jKL>yM-#${l_kOt;Uqx#W37&GFdobg zmSL&KdWf9vylZ^DcEJ6^zyHMnNJ|2PKTvRrMXOHPfVKNyH07Uu`HKVZ<n#bkQ<!M( z4d55qN`qqE1l{v9EE__mtG;9lT>2zj!r|Y>;(~;tga_b&{mV9^^Aq&ozD1}95~J3= zWrwd6q#VTn9Z5t<80^Ezn)*a}s;CedPt-MaQDf?E<*7=>8$^hfU%ew`_Wk1%%=YXF zx!5?Z{r0`LN)_f5&z`+1+$*8V8sjDV?Ac0{RF=41UM^X@@<1GN?j3<5ICA%PfpjS@ z=j@_z?&fqeTXcnILCHm6B>dgBfadWmQo)cem2$zc9=H%EDacuCnHM3Sh9pRu_bH`r zTvCjX>VcGNea?>n06`?7Xld0@`DvVmpwe*>g6beHn7XbJxYjfRPzW$B0x&)Aeyu16 zR{!RCpjP0}oZPj?ZoBM|Tb`agaboJ!sWYeV20(Soh2k=E#u{wVprxZN95dD`nseJm z&Jcuq95?(VK*6WcfYM1vOPHI3%_t=K6Pgl%mK>I7XtUyvv52%w6wOdGgoiiK^P+gL zfAy>VtN*hp9<Gz!5~tr5OdOv)b?W%(6I;N<*aH#`OXbRgvNZ?UDUQZEqyo*gLC;v7 zyN^m0eH7-?SWNkf-1c#}lOWzg9v!ea6rb1zk1vOKj87I|R0ntbqy?d8z6FF9((4CS zA8m@zi&b~VE;TSZQ#Z`7IUaWl0T09xJT)~vH3<yY5WEffHA>)Z$C6e_K2NlVw6A-u z9CA2>>_!Xzv<13vehbk3SAy=ZH-&B+xNZQ^)6;R5X(5@hX1Nh(0`fJa|0Bja@I$Md z+qRe+>4d`$$m3+`$Hm)$4Us4Qss(H3I%18?R8lldeJWMXqPhlu=24(@pn?{4rbm>H z0q+J>e{<G_4PD^@ox^zUBVAc2LX}F3Z}ks0#V+wqrMO%wUv}V%O1Q_d+q@<z_LfH< z*)A6uX3xFliU+e699o_?cM(1c@<rf9)Ze5NGTv%~jJ+W;T9+Yrqo!^$Y7eQK^HEG} z+d}%@^Mkc6XDa35inNiM5C(H;3kK9dY1p)EGlKXi;IxLyjuY?^3A4>t`$vLb#Atf^ zg`mf_1U<WSqvpI^v#V9m$aZ<$mufKdfJ(tCTZBwQ<Fzbcl`Bwq;$LDgxfq2>lOcHs zBY`2g2tzXD>cIAH=IUqtm<vA6#-B=0TwQw+z{T|6)bw^)R_7P+a-DP=-Y-sF8^JKJ z8vX+dhGwAT%PZ(<Zw4O42zhVw8kyu0l6p-(29Pu&@-dO;moWbsxo$a?lk2nk{cja| zV<+o+uFlb$Gwuce<d^Y^aR43+MOvI3gylVuRQR8`tp>q#AlcqUPYA&#$u^1+kF<>X z6frXC&IFnz=KuX*i-4Me*&DU6+5qDC<mBYt+X4#PBd-tw50@3r98R(??ozipi-vEI zbn*wJdLT2q)x_FBzU>PEC?8e3x5mK#O`r>enk2pVqkwB-;DGejH3D8;F*gCQnTdnA zf$9&&_a|2W@;O1<VBYwe<TXy6K5^#c8ygYi3*&*m2k7vt)U<U5+uBF_+k-#geSy?b zopcR#fRyrwQ4AQkpdazBpr})w`9my#{U569I=u3LjGG03#De=r6v9#Y2e^OruYaS! zAFH8Zda|=%{mr1kh$wgxBfid^7Gc~07d0`0R9qbw=>QjbEEI|nN-$6?o47)h(Rjed z8ies9?T4SOBZA5dh-KYV*OWzVO=k(h3<(&Rt;yZW4;0V%U1d(CsP<PuxUHKqdaQ3g z`A}Oo*0jY0?lm5&OPcuHOMa=|LNMxM<vYq}K~SncznZIO6~+q{?#OtQwd}b?Sgej1 z=Z?)NMr1)wAZ*_)T;^EL+?-SJTIt~H7o~&4)0Z}4!v-ZBp1#~<wcy5xmLO`t40J{X z<oDKtzPgk=eEf9$Vdx6xG=<jCRR9|0A03H#hVT=8XguZjDB6cOUn2`d6A<pLAbtm+ z`D%fp@3XdWf&gNmjRt8_`dra2%`*G^VJ!S>^eC&-?Rk3+nFPpaAt)0xey&(SI8U6% zNpL@>7nAub_X$iLw~ElWdjTP4cL337gq%rXMPv=doRHbFt7ad?1uf(rgbeHXeHUf8 z5HZIqoL7*k3*vwjAT|3Jm#rv8Nabqwk%wKN%mpnKFbG7$$Mi(G%U8CrrM=jI1gL^& zG+0H?7(MC^jem+&LUtiGp`R382XF!r1=T^G9mrgJh<p_YeUGPoiG;e0xjv)m$gb=| z{D^Xc?ScWq*O6D_pU9cPZpmxpIcj2ow=ubujTR#%7>tY8Xir283PN$*#Ib27G$MC$ z2q$1^?1WKb7t9~-N5_6f!~Ga}nav=7v?((rWX=OI#Luu2|1LFK+RgapyOEiv+J+`+ zKT@$HLx3IK!Gm6WN0g+&j)q!;56`=;6Ps@<%(02u-cHfp(s&gLoNBbY--_>!b}sRS z%8n*{0cSdX#v>!dTLO4HN_dOn6?2mKrDF3w3h|rH^H;HUkV>K~5>R@ZIw)roq_4Vh zX6lG)Mu*J4da^G_KyIHBwg589xeJSgMUA}A6Uef79|ajg1OFL~@`S+|x6t37I2cBv zU};D0wQ&RBin0TN^+E)!0XQ4%LgSxD!AXfe=&i1L(SVSGk`u>Co-y^y*Yglolp5SV z)Q)dXXz{4?bpjd*6#`lSFlq-h{yF-Z07jxq(%Y6K9e*9uA?b!|!l@-X*eVw$aR;BE zCMM;MM)%dSP(;F!UTjFXSuEAGgRMw7lGqIirw8d<$b;c_qME#Qpvk6pZV_`Gw{vXc z?L-s33$&q#h$C9v_Lky8+w6xO;-NZVp5suS7of;g;CZ@r$-T`j1>x;Zs7COQ($j7^ zwi~D8ZVqCk&XY|XM|(LCa+Hz3iFeO(2emXP!-=M(pK~Ld;3oP65#3E%<#W;95YEV& zmJIVtoHXxd4W0~kvd2?NBtNMe4Vp9>Xpbj@5mLfX!^Q}z=|&V1*it$L^HP|1N6tf< zdxX?ATJ%+^&(j|&>-ra?YwBg??l5d`ea&F$5xf-EN}Yz?a!$FocB^(5jjShvcU(*0 zIbDtC;7&Xn>;AmWv;LX-q;Zpxxag~;GOZvxE~P*q<E8)vNVdy3NZiO&Iywr}Z<sr4 z#M5L03u!k5tVPhwB?Ehi^5Fb98dEQnJs(>(4U}WG<R$k+Ijwo+6~f*qmLLPKN6V-K zP_$Y2L|GDq>aa$!f*$nn1$xeIPAMOhVUf0RtP1LAEUGawdl}M!#R}XK(D%~n-~_yr z2^5?yOn8+EnhOH$!OhFOY~8nu%T9shDE*N%3JZrm!UZ{757i&;gR84OfudphQw`3Q z{sicyv~<H+lCH1@rz;V}!Vv2r=Sn(Z!Cew1sr>3##GNY7x%1;CyX?*(X+D0feiBq= zEiso%ykHB_*Qauz)pWgU^(UM9RJRbl`G9hy?_l#SDF)B83k&uvK!`-Rb8qTyJgF*k zsJH2<7|!3ibe)p8ojvWgwFm96kdQ8ixkuQ*VO)n;Q~}Wlc=$V-YZRzFAs2Yx{ytfn z(198xb^3{t1ZGT$y(DR|^W%R+1WETO3FI!cEXc7ZVZis`MfCmurkbDrpHfYvi1W&Q z)LIIn#BYy;M%&{MvH@kC&4k2Vpsq$ad=ck?_*$Z~7<mL5bhD-Zq$81(o|i~u#Y-E} zQj4;Mq6MOcX(W)OXi4T*`>QsJMQbscg1FyCa0CM7&tDAtTM-meO3Xm=+^Ci1US+jx z(zl2AePL|6Ud;g+X4TS74dKxq=Vpom6@XG4?~UY1lYWXU{j-iZrwARXPx(g?mC)k& z3tR*xaPtaPIl3xJW?_RMj;bOw0X4%6Xmsfk2J@)yv0n4oVfLre?t)@+<(h3*T&>SR ztT4e+8?2bd^Zzuo<ht^*l2H~$np7HED-8&2hyB=&nekj9pg&hU$28_#u~0YhQW%Yx z-x?=n>Kjz79fx*Ms3dE#8)i05{96Jtm1Zj1fQ<L-l5J0T&Z`(}5A4SnkwNPiSYVJT zOKEr$WFkp@PSuF@V&De&YV+QU%u9Bdm#mw2a=jGFi#x5Si64ii8T|MWykp?8@533& zn(Z?FQS?a8oGe21yMjK{?s7_mV2t7qLF7jBRfMJBwZ;J&WaA}3L$0VhxBuRNDZ#Nv z&&FE5j0d!bsfUplgeeht1Ey4n-3eAGWNr^Df&;&YCJHD{5ac}QB?GPoA};8hUOWz@ z(V7{GZwW#mHAP6iAxKe3Q-RqDNNEj7@%!ivVMI1#$mHY<x=ITj4bxscZBcuoKUI)J z)o^YQEFY=Ea0$Fb;AAiZXZpjS2pW)SS|<q5*G>Cm=mi_hUJ(J4_CnRclA5z-T@Ld| z!{<D;j>xAClBr>}XYi^LOn#bX!5u__IE+NUi%wB%>e;@IAXv`ubvW9lj<B++vE%qn z#i4nq0nLa{9(gEzPtgT&7(f(eJVBHU{3ML~w8qy7q9iWqPsfi0$P9jhk|BXRHV^81 zs@LOZfye|s9VCGj%pm(*@-xNSB6At>==-5yOXWFvKGNIyMtw^b93w1}m~)*X!?y@k zKOx<MnlLl_$%2^UuzzdO`IfkXbbhYUnlTe1D*+R`f0zJ46UomZ--Zf`(<mwCU!pH} zjt}8rCaaLD!o#OtsJst?^8^@9^yYV?0;Nb97S#Q6qCWlw-E%B-El@Z#PUXXtp=tZ| zhy2WfOF1oNisTxi315-lsF;JYme|7AG4-T^Z%~P|*=tcErJiWuR5oFz=G-sndj$FE zNF+c$Nv}rG@spL=MZB;q`jr)@{0xmzF&#fg&3S65x`kh)<_b0MQu97Fl%M283o_g< zBjqx<EMu@Tk|?8Ne3qsV7jlOh3IIrNQCjSrEHX|iTB;5y>m)Nv`jgO)AW))m5R;LE zLGkr+(K&wzSAteg17BJAqG@$sqDMD?NBp!tV<6eLzwhO~9oclYC)=CtM%$guWV_II j2W@&Fok%Cs>GWVaE6?a^cSaq})_>_;>7D8RbpQVXrD3+# diff --git a/test/api/__pycache__/test_cache.cpython-37.pyc b/test/api/__pycache__/test_cache.cpython-37.pyc deleted file mode 100644 index 839285ef88639d9c246756d318cdcd0a63679bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5998 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 diff --git a/test/api/__pycache__/test_cacheable.cpython-37.pyc b/test/api/__pycache__/test_cacheable.cpython-37.pyc deleted file mode 100644 index c25e81502813de7a6211f1eadb43436ea5bbf123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9177 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 G#{3^v>cz(Z diff --git a/test/api/__pycache__/test_caching_utilities.cpython-37.pyc b/test/api/__pycache__/test_caching_utilities.cpython-37.pyc deleted file mode 100644 index 21350a6fa06f45a23adfe7947c9c1197a154663d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5714 zcmb_g&2JmW72jPh$t6Wnq+~mh?Zisre9)DZ)M=YEbptz29i&aw=Bq9i0v4;CkwlSP zva?IuB36fn268f56uq?tB=ppOX%D^hQsvrPfdc*gW=Tq<<)%ox#Lm3gdGp?z_cd?$ zUbR{_@PvQ<wSVpz!}uEqljm6gx9~=`Wf;N`X2<B7u4xjsI+kncKIi6iZ@aec^KJos zu2bwfZV9-y$UidNvM7im`UT;L68efLiv{%64-8Qe)klV?jx4u^QB5pjv?yz%oV$o| zT{JLm=y4t6C9#b0GO!yMofGFVI*-wkxFDVZ#bs&lojW`)o<)B_tjML2AuF;jE{;sO zEE^+3ToRYXb8-RDWnqZt#g)g^8Qkg^Zw0d_c&ks~)x`_5G{uXccv-wOhq)-O0&ha~ zl6ZMc^{RM9y!y4cuZgB0=CwJ@**&drPh<YynqpoW@4hOmQ#&tX=lrb^Z>M-<iR)th zkufseXU4jF9XeXsu`u(7__m&TR#=}J%^Sz`ji#9v`@V`>erE%4Bk+UWR=DF0;#Q{> zw`3F$Yw{EU+`${IqKS<|Q<%aMIbrX>Gw2n<0aW^<b!37=dE?jw-Z4DRIL@)L(WJH* z1ntym`{9nSdcCyp!0)I*l-jK=`LJoFrk|Qy=&im;OYi%!e^>ck`4>agv069(?B983 z^YcimXw%>I#rl^2zz_E~Z-;)+3x)sYrVQ^#o4vjaqX2EMzq=o8e$?99j9Rh0-uHvH zzaz1>(*cHPzaGmde%<f4G~hj<g7yA>>g>qa6A)$rLPXq$VcMozLjON$NRgDvvnjBl zhLyvn#D)Q_$g*jvD&a~7*9b4NnJOiN8u*r0q6dDzFNGGEUrq#G#wegc_^_v4v`I-h zF%zVQn{X(Y&)R^guwzY__7H(O2c%OhHMi;m1+{u{&l9a6M&dCd&A?O_00(pdKJ58j zGvf})Y9(WILbqwE^O&3GQB%?v-nQy>HIqv~nJ^*4855AnEh1b-BMsLS2GScG6$vFr zXGITp#SRN;{lgGm4oBF(>%-y0of+Ls#if#|8xJC*1x2kN#XUhY<!BHD68iSzG#~T^ zVT_M<Bs<$`1sL<2aXhaDww||&$+2k)=5S?Rmh}nVj8Id9tzmUy*v1}&dJC%cFxum5 zw)1K=F-H(GwuCh@zsLm6ZD?;B+S|R}3(cImNZBZ0TK<LK8OR?g)l+aZYB#mE!!zU# zpeoP13WSIzG|ZY+F$>n2vS+v(&3uXthX`TMOUs_u?TJB$aK-a}HSjyxjH0pB6*gyh zwBqr_Nv$o%bZq@)#_ZG!pBb}%X>98p^~iB^UqV-|4a4Qq3-hYJM;BJXga&(tBYRCR zHewilWF1;@F1Fzc)+l$RPfyS@xyO7o=u4$u!isDgbRHc6&@?rg`85LwdA8(vLC23G z&&#&UK+?<B0gOF+c;##<;TD-{n=muiy};&0HdIks9n%gZZFQnfgx1SM(!40=b-bFF zV`{krjHeH`&gUDc^AkiX)JYZaVb2stnh}%2ygEnOfk8zoI+uEtjrInuM#lKqF|`^e zThXpE)!m!GdaCX+k-kQE>J{>xI^cwj=0K5dOgKPe9M5QslHMZ1f01{V?;w!wFjFAs z-04U^9Q4o5lso}+(wQXXEa{j!dLf{8t*OMBaVfytl!PJ~=J4_v+|EueJdN&f<@0Ff zl8cGs9%bT@#iEg6l%*4$yI~w=lQh@w^-mk>M3<RlH0cjWpNx<_o+{fkdCa@`f6f!H zf$Ccm`p6SG#V_C3OpViuyDQ^h_y238+Z1(dq>E4RIx!K?89wY8MA}45C9@`qb<W4Z zt@HfYCb~v>ilfjR@8dl&$C*-mLt|V6<y#Z#+8F#Y)gbph-3-l?7>CA@ae$tM!2xR# zYekQ4W|fJBe(ZUyR&+&#WNM?x+sAIHkTe%}`*U80qZswjhnS5RO@;|s%nDw`3^=?m zAGRXK;o3GWyr#>UH5MFeeI>nY7-TWJ*71k?YvG{l#R|po+BT|&0g$>ficnLo$%lOz z#8ONFPtyeEWCnR(M|*TvSACypQ>DgmA!>E|9l09#k;I;?mKZKckW{O>xQHS>ql?5e zul!adhYbp|Iu=1sA9H`l)Xg!=$KiP;`_hLzGgw1s%NMJme1Mw!fv>`0g)J1IX-wFj zri*W59j&q=)OZ2e@L>&1zS=3T!bMxgK_xLzf>=p~Wypvb14pK=o=lHNDP~62K^0I= zLp4Bo4K2oIZ0+T6#8#79Vke79At@%#sB}=r!CQ*+BTM~0DG95MJ}w*<W9P{HO~o{l z`UvrH54q`M;}heTxV9#hb}{;0T>8QcJJYpaVXcj|Utw)IUclNL2aRlPTsf?YeB%7U z5cxml;(XFLtQ{G9iz5@4C!<}8{z_UW9Ks86eXp^%l$5wWyZ$`3AxSwg_l&mnTQjP2 zMY53O$KzFwb@nW6=tQpGfabFD_d9@w*7~*2?y{r|c4g4^I<2-$7cyAH`+eD5&dN3h zPih4Nx1xhH$gXW^xfQj-DE7lZrnx9qX`#Q*+l^b$E)%KexUP0P!sRJ$^+H|pxp~?@ zN*8#gx|g{^YAKoKyFLO!HMyoZc5%h4M_MFNcucy4A_k;TnzO)@Ea;j`sWWkxG_U<X z&Fd&iZAO(_nub+c97ls|)0flIG_u^qxzHlbEVkVG1eyew+n9ctM3*iTTt~C@wnMi_ z&IHP148V$qTv{AE|9sMDaEn=`HP-IOK#$%*V;tDH{Gsqg>037Ovn-6QnO`Bd1dKY4 zIQ9kehIPTJo9f3{t=>a3Esl8O<Ez8xK7bfWjyLNgb7US^42DBHK^=c&9l$9M?8F`! z2l>QQx8PQVL|<thGsJKMe+1Fu;+})BvT+;782{0*Es65u{6Qfu?UnZy5JW~&5DT~r zRp_wVA*&l{4i|%AamydB2hshz$U^y6DCENcLQNkYL7(E)M~2`vAIHs4@ZpsHX3LS( zx!Li%Tf%?$UqJf@USqhXmD>xYx81^J;It2~-|X}-j@|{3Et{%}PS3(Y^QRv&&Ujh~ z>oNb*$ZbGq^${i@djS_xY=bwkz8~-63b=hrL|xMT6qrz)p*8?a&!x#BtGO_-@sEzg z(0^&5LbY@RxQ=!xGBDN8fpiw_+=RAH^+5aph@XMNce&tuXqpxEeROG|+m2<opIW_0 zQ%mi=UMti`xB3~8S=6}a&s3O}N8KXUZ8XiITf-SBTFTq@gSe;mwZFNA>|;j0fWI?v z;n9i5b$VN|-wLIe+e3Qs=~ki{b)jomHCzI1M1l=pchE8p5E(4KKBqh@X=!^9LXuu5 zQZ%9ZA)8OwFq+&#-^af;QKr|+lYeE_@rTShVpHz+1`%BZSx~WF(7MP}v&<nc6pA+l zeJ9LrU@Xpc>8Gv{;yIt%U0=1`1^nBERE6Vvhy<qxSx{2eQwq>NOfP}^W>?mC=@`-9 z(Xe)KEWVYTQ^3!5>{_j!ujgx}TFG$=rls{jT>zfuhOus@bJWx%Z_Lk~UYBJSYMA(( VdD^<!x!HBIvdqstN%P#>{{~P%v#J09 diff --git a/test/api/__pycache__/test_cell_types_api.cpython-37.pyc b/test/api/__pycache__/test_cell_types_api.cpython-37.pyc deleted file mode 100644 index 4c174d89c5267b0fc41f893c88f333ca7b522aaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3271 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 diff --git a/test/api/__pycache__/test_file_download.cpython-37.pyc b/test/api/__pycache__/test_file_download.cpython-37.pyc deleted file mode 100644 index c7a5526b59f7fb7ce6e911446739296995f72c46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5139 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 diff --git a/test/api/__pycache__/test_glif_api.cpython-37.pyc b/test/api/__pycache__/test_glif_api.cpython-37.pyc deleted file mode 100644 index 1335c44335d0667e9fa87e399087cb2a0793d025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 diff --git a/test/api/__pycache__/test_grid_data_api.cpython-37.pyc b/test/api/__pycache__/test_grid_data_api.cpython-37.pyc deleted file mode 100644 index 3e5ca691d26ab9275bb55923627f7cb89d5a3b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5104 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 diff --git a/test/api/__pycache__/test_image_download_api.cpython-37.pyc b/test/api/__pycache__/test_image_download_api.cpython-37.pyc deleted file mode 100644 index 715e75cd7bac9e5511449193bc727f63ff16b685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16309 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 diff --git a/test/api/__pycache__/test_mouse_atlas_api.cpython-37.pyc b/test/api/__pycache__/test_mouse_atlas_api.cpython-37.pyc deleted file mode 100644 index 792113e4af243398c21b8e75f3b15f5b883c852d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2475 zcmd5-Ur%F26rZ{GwzQ=!tg<n#8jZnhny@X~)dw3_wu13xA#sVWxs+UoJ3~8g|1mQK zO5nk;@B0-XKKUtp@LTlNC%=MEo--{3DrkZ}>?AXD=G-~wp81`BUsWn40wekPC-&|v zA;06{Vt7D2gQ@pn;e^wO#MGy;<2w}3PUQM7>~7@6IX_Q{aCfG-$8)d9DfJ7&IV*}h z&!0PdiWe-ebcI*sCCi)U)4cqO_+?(<RoE+hhR?!Y<<2^(-TMRnO=`}txXQXRTusB> zVJ>4P?5)-4u(F!=wP>4&>2@YVyo!U4=Q8XX-)G1vIU&ac6jGFPSKI9x_1&1UUx>=X zjX#s+R_8k{l<u$|<Ml0ez>-0yov<)XID66&$-eHSnMia9Ynt^2y7OFab+k0%QO3eu z))gQdMR0@fHjL1w!7^!yAVxC-hIR(PtY?E^&Yl*~Ld2Okd8!Jq`_&ztCPA#b!Cqge zLFnLD7<kKtX&*HY1g9s?;p{OzBj;p=Y<ef|UiBqB@{Ark=M+5z&vn+0e(f2PwHjzm zeM>Q!Jc?OXPgU32x8H1VW>~}itd9R)+It$OTtuzbHzE-WDrT)#sNk7OvV{$hV~Nyp zAo;vZnwz8VG6|zT7YkuerE#j$cr2G@My840NcwT0(gQs&_L_@}i<=wTFlCSh95|+m z3kBpu$scZRglRu9aN1^(7MnH4FLs3qx?qhSzQZ(l$pj%n&4V-vMQ|WZujUO)F+|4* zH4EjiAPzGT8o`HoC3HVB*43kB3J@Gt(M_Outh@<4jZPr0=T)ias0z^k-2=bf*#qlf zJ^;7^9$FV>!WWrJc|SCI!@A<}gexpuBZ>dX3-=KyJ+dgkpn-$Yst6d>JcW5?VOP^g zm2tt$x&rruOSu20WeILxhrSA&5HlGECISAy2LB2W2EzZ8zHXjSL(d%Jp3~RwQw)BO zJKQ~o0tJbY;~pl$OGt%p$qVws70M<@ZtZB{B4g{A9yr@Dl`u+*eGzQSNCfG=PyxE| zsEFr!!eSvmUnJzHeXC=;N^*-)gQo{clrr9U+<fxsXG`NudCH+qNHeJA6(;pCpA8Tk z2vjCDgn9V|q=1aY*Gi?zfA2y`01*wLtRW_Xv4#=;&M4yDE@zXde`Hbr2My1`09z&r zEzvS9J04YU1Mf{ofBEj{%fwv6U(LXK6*NGi?!n@Ja1&gYLRTSIZ=ujcpnrTT<d-_W z2eC=e=YaR7gZ}L9phNvu-HV8yMEt=`h>s-x748pjg?psn#~ZM|54_rp?_tkSSYB)% zTC4o|YefM&qZGP6(Zm%tWR-)(pW2p(rmw^(2lMIH4irh-I}}zin@kFwtMIQ^g2jf7 i?L>typy&1@@#QCQLt`M$(t=a=s`<IfT%}Mdl>P!D+oS0K diff --git a/test/api/__pycache__/test_mouse_connectivity_api.cpython-37.pyc b/test/api/__pycache__/test_mouse_connectivity_api.cpython-37.pyc deleted file mode 100644 index a573ef0f09a819d4bb1506671d82dd08134b7e7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11535 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 diff --git a/test/api/__pycache__/test_ontologies_api.cpython-37.pyc b/test/api/__pycache__/test_ontologies_api.cpython-37.pyc deleted file mode 100644 index 844e6c4056138b1e45783c5797fd571dda537ba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6820 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 diff --git a/test/api/__pycache__/test_pager.cpython-37.pyc b/test/api/__pycache__/test_pager.cpython-37.pyc deleted file mode 100644 index a2369f09eedc1180af097f92968e0163b339803f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6822 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 Y*N2fQYtn)vgxC{mjl4{0N@du80jDsfiU0rr diff --git a/test/api/__pycache__/test_reference_space_api.cpython-37.pyc b/test/api/__pycache__/test_reference_space_api.cpython-37.pyc deleted file mode 100644 index 38ed8a0dfe42321fd129cf9ffb69b2ab78506b55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5336 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 diff --git a/test/api/__pycache__/test_rma_template.cpython-37.pyc b/test/api/__pycache__/test_rma_template.cpython-37.pyc deleted file mode 100644 index 1aeaf19d7539c2a950372fbbdad3d14472b345f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6243 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 YFX&5ftWe9<%#}I%)>h`>TZM1!KWC=#bpQYW diff --git a/test/api/__pycache__/test_svg_api.cpython-37.pyc b/test/api/__pycache__/test_svg_api.cpython-37.pyc deleted file mode 100644 index 0b6a2f17423ba3de23b3e23251d69c275306686f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1889 zcmbtVPjBNy6rUM8j+46C?uuP5dqD!E2%4m+1l@l?S;2|Tf!)1W5!Tc*b=*3(nQ_u4 zN)G!+;>1@#TXEuxaNr~O%Bf$06Youv5LH{$1zUde#{RwW^KX9d`RmQiI)Nko^##9i zlaN1gvOFwszJg2pU<45~Aw%j@iatx2&&+7~7K~P64=a9U@yziZ$&RYR7M0iJ74=== zi0W(N*Muu-FxEv~Y{0l7*i+K<&S8Dhq^0w89PQ_E58T=l9>w94EIbbJAs%#bJ%&+Z z)&+S*=43`-2?{Za!956Nn*T;r1txzTKEB_7uBFm_KH#Etz)yHO>F=jJ%u>O3`!XHt zewNErhhVdOFwy<*;)A}93%Q;1@R&yuVv__A;<#N%U9@=~8z<1?D1b>TpOhB(pI}-x z7{VN?sxXF_F&>x;UMBNDz!7v#1(`F!=GKh7Av0^nX7tRO+cR5O$4q}*(3jMp?1)~0 zs{pR|4^B7{y8>AS<f%cr|MK1%pnh4Q>Q}yZ18~0^95V0qp2aVo6Ef`%iXy+?Mt)ic zipS~pkms#TMTW6)w~c&>>?BPxF52Cly}f(qNYM1by9a(5sce+%M?2@Z=hH|3V}(z< z-%gv?h+kxU7vHygZTvFP?p~Am8waB}5y6imsU~G(UxP4<I7`1#DpSphkxc0>87iHN zZ!EX83=tN@Lr`N73*S?+7^zf>V5AZw^b6xaZsit=G+2962kz=F7{Y9dXM=i{O`VnJ zuDr`n)eVSRsTj4rQt=*43ed4&KhqfrsIV5wB1X}mW>B<sW>KimBl^a|R&d6!J%DDM zUim(JgNo%?28VGXgKR8SfUH9O+9@B(|E#HL%}A>SYHQjGTbSAc<9kbDv2M#-+^`>n zSlc2viHiZCv1nBT%_f+#W>U*}F}O_fO+)hfiq9ZGdteCl49hlaQ1u?nSNvfv$f4;1 z--Giu{-7He?vSe`b7$Cck>3i|<XaGqK_Ii$UU_H5?CCIBCssj!C-DbA+0JzPIs)G5 zbnboD>Fn+*Y_`+S-zjEI_={b*4U72INEWyO>K4qJ)+NR-)9e|V7a>1DgvKyn81!p1 z??T5gsyn!v=igm+>J~O3tg~2ZR08&C^Ly}}e1eOX_L0s~-yXsb#)zb3nf9xP@hMc6 syhsbhZ+6fuzm^*ofilJBJ{)FZl*lhWf?FDO=1~_;u&hyWKXmJV10vDg3jhEB diff --git a/test/api/__pycache__/test_synchronization_api.cpython-37.pyc b/test/api/__pycache__/test_synchronization_api.cpython-37.pyc deleted file mode 100644 index 90904016ded8f26e9d99b73c04e95757ec678ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3605 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 Sh)FRitt!eTB?)&zS^f_ka-ZD* diff --git a/test/api/__pycache__/test_tree_search_api.cpython-37.pyc b/test/api/__pycache__/test_tree_search_api.cpython-37.pyc deleted file mode 100644 index c9d6d9115786fdf17c4d3291649ad92933d15bfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1770 zcmb`IK~EDw6o6-Tx9t{ML=PA*p3tNwv?-_%A_|glFv7v&Wz%FGc7}FoySvV8!8Yx| zz`=|E0piJ@;Mt46VXvP23!Z#$pt_AfFfyBYGdug{&Aj)%zCJG&CkV9Q(|h)Hnvn1K zGHNDFR-vmGAUNT)O*+(}6z4|Ua11?~jtQgLwmKOnLy0i<vfSdCBXUTc9MAIH5pis8 z^E`}sZq!I=;s@9xC7Kksr4Tj2q}N=F{4H3?Z?cB(ZH8XULmg}sI^JX*x|#tIlS48j zG3AsSAL)R&#(;oTb1RwJQ(@qCRKtDS6|x8Rtblby$&?1{lW0X+AWGCRW5qrbnT5BX z!TNIjwGvX*S(EYd4m)5$uf7&AFAO+asEc4<)x$^x$^#ij&7P{i^mppYkHuWXycTN+ z*xPP{25(hjq2daQd_8evaM4xTM;8{$Q7@THtv!GXD7*zRvb11G8)hE5j4cBlziHP$ zz=YEwI6XADIfS4OtpPbE13EAU=D<3!C>fAFdTem(1e283&0MIP9n;N#UGqZSoYuu) z+gpxZi-hNQMBv~3@-4gFf7OiRXt{!(mv<!dgSifi%AsuNSnSVNQeIa^dn?uI!cui{ zY3XqpbN7q|9z-vcY9*FkvC-$(Z}dJF$`g>-AXY28tgXa#pQ4S99fQu4%*1YpSOcLc zOl~m+)Wxoc=y3PIkDH~8CLpm|e!!Cq-*J7O<bOvcnM_??!+R=nz(z8I;JJ8&I?Iec zs|w%LEC^y)^z@mg1@rv5ya9Sw<nLlm#`(LPsd4_urCg`^OY${{suy>q@J;Y>yZ`2& zSQ%}uROcT(Ts)7yzcRSdXV-Yd`IPim|Mv)}c6msmMoeOHKVwQx;%Wg!5ycb=tS%{p zZvR1O6d%nH{sCN_p_`yxns8=E6|syZ0V}dER5?`zupa8l>|~=Jo}5@%1RSda^<P(O tC%5ar!xZaZg@#k2_0+w!2bzETNhjppws?9EZ;Or=s0~lSn9A9AegUe%+?fCX diff --git a/test/api/cloud_cache/__pycache__/__init__.cpython-37.pyc b/test/api/cloud_cache/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8e0311ef40b9a4dce4009fa363be87c7984bc3b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmZ?b<>g`kg1p6zi5x)sF^B^Lj6jA15Erumi4=xl22Do4l?+87VFd9j&)F&_v^ce> zI3_V8F-0#au{<%aGR844F*!dkCDAx0HLt8VCchvxuQ(Y<<`-mC7RUHxCdCwImZa(y zBqnDkrl$h+=HviXq-5)tq!yRxCl+MtC+Fmsro<;FCTFDT$H!;pWtPOp>lIYq;;_lh QPbtkwwF9~1GY~TX00mn(2><{9 diff --git a/test/api/cloud_cache/__pycache__/conftest.cpython-37.pyc b/test/api/cloud_cache/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 6a9de02d5ad75055bc676aaff780a1afac2277ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3553 zcmb7G&2HO95ayDStjM<flQylJHer7gp@?i*vYoVs(ZuMXKpPZjauEa=EACoiERigi zvMs_s6zx+KIXLL4eUrX|u08b?dg{!Olt@}GPzu`R4EOtXc6VlHo-Hp|G<clfe&WAw zXxd*WB#!|vU%_7;KqEB423kAnS({1il`eE){G$EL+6GAlQ6#BAQb{b3R21w7tycaU zIJD;$w)p7qNB%?jt3RNzwM+an!I1T}e!)axUlT=9ilqgR%HmcmRra+DcA<&I{Rp-6 zzfj9DDmzy-GuO(sxmICL4c4;8pEFIXnD9I`g>40<FFju>=>)dZGr42Rb3XJ2(iA-4 zN(N@o=YeT)hcI1fj+7MUvFn?GRD=oo(mWivBXP(rc;%j5uh8HZAf3pu=^g_K5aMjM zqIZW6CF&(W%wu~X>r=!jAB?2RfVdx_m1#TXS>Lw$G#VH20KrGLcwjy{Fo)a&dY5L1 z^^v)t6H-~e4fdlc_;E&oD<wQPyJK9Hk6V%17X(?Z6Tmi2O`DRa1@M8!cC)p!yEkEt znm#EY<zykYAuJs?>cM$H<8aX9CtDM?4eD)Dml57*Y&V*X)`T@d-$Z>_Y}B{vTZH0W zOUUD1SllKRBF@JlY1J(d`u3}n!O(HNu-L>AziTzUU5<}X`RJ`aT1m}6&fyoGmrDAo z!~0y+yZnqh<IYou!x9B=cBFHvI<6-jWkKtD{jutNYj-=!4&)<`TPM6H0XrDL2ywEB zTeb<uzG<Ns99ifFn?QApAL`zCvKsr;QDRULOi?Xpw8a7|Fr6(;|7ATR>(^xF<AUc0 z;|utL!8i>>Efa{ENC%=OAP^~R7a?GmAVim;uR^~9Jp~N(Yp-<(oAvM|`ODY2;5f5` z{xo8SGT^vEiVg@9^wu~?2%HL%r{8}=Dj)9>Re%Qlr>6V(O2?HrjZb@pYILx~XZ%uv zLvKnvMxi!xm9UyvbJVC?>Xf{w7r9C5+xGMu_|A{M3R2&i_zg@#=b4lfI`W`c>*M`9 z^D7_Sa&or|*T%qhB%SsV?$A*J-hu&Y9U84vU{(CVX_x8eFM`&ByNMoLFV1@if7J&G z&&h^sQ!qR;==FUq(5~PbeZwyG3tg}c`nsVB1Fkx_-bscQ<^0GiT@>ChhT~?qVh#uL zeB7lWN*4wq#R6RR#39Orp0VA^v4K2e6BV(T!h-K*EP*RNvjUJ)*ir_YpBMZ$g9Ukp zjb=$!FIL2A%8Ip|73(=BkZ)p|@-D$?7~=M|-FYj={dSHU<eRv~ZE+`MWuEDs923ZM zm?FF8o*MAK`yc!pIew5c{NQ1*pYL7srn@;D$n$ZR#)T1`n0TKsGavdO#{u$;L)?o| z_j4#ShXQ#HDnHkUITXk<)bxClsEJm6A5Z&6>p#jdf;@+DZOVc11l|ni@p1M%#3$m@ zl;*R9H`@1W7DTo^h)-l{X)f9yCM<ZDz|1IPu~!TKq?`G>(IBv~4myQAX}b=k{hP|8 zo(mOA(D&U@FDgwSH=3TSl-&h};V9q%Q9R^AKy9%p<UmsGgcXAN5^4=7h_L90WHP|& zbEk(od2UCA7JaPE$u3mW%*!r#h0-M**Ahwki0g<6%cq=HRCrJg5#<=X(_5{bo!#BN zy(G_s#TFJBVQ~k$D2HL{Ij09kQMnTqck%OtVb<D-i1$#VFr|(035$<Of#5TG!r~Lu zq|y+jsIb%kZARb1^aT2-NJ2^~!BR*{U@(GeCg^EZ(39~B7uMy`Z^CvJ<}ydxy*@Qy z@-CU2%cB6NMc0f;0g9vXq%5TL=*{q4uU4Qu)?SD!o+x=5?m*<z<h^`Nl+BdSz#4T0 zjaH@%saM!4TQw?>Gn4*K{I;I!t1QuAhD}DLwRch@61Jt7CEp_l=?Xaa5+K*9$J`BA z-M<Ys)=KS?7nRN{Ahx0MJr72{q*9G`godT|fQnJ77s~rXSBwVo0CPW`3KRrJ_4Dfb Ezp}|HPyhe` diff --git a/test/api/cloud_cache/__pycache__/test_cache.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_cache.cpython-37.pyc deleted file mode 100644 index 7ef447b679c3bb00f783a586b35221bbf756aff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17348 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 JpG5g{{|oCG7n}e9 diff --git a/test/api/cloud_cache/__pycache__/test_change_log.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_change_log.cpython-37.pyc deleted file mode 100644 index 213f3c35bf03bb0657059a0490489c93ec21cf76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4777 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 BbKn2~ diff --git a/test/api/cloud_cache/__pycache__/test_file_attributes.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_file_attributes.cpython-37.pyc deleted file mode 100644 index d2f136443d7ad7f478b4b27c991c5af738d1736b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1818 zcmah~-ESi`5V!X$A5E$g7b-X*w2DsZ1w<m+Lqg?LS}G6^r|N*?KvAT~iJj~=o86V| zv}9=?K)fP&MB=3tPy9<OUJy_G3p_F7e6&e>I$IvkjAzE<_58e_RI6nIE&k&N_BU|< zps;8bFb6Qyhd?;tG$QTUOxx7RR@;KvitMq|b|~RCcYY#mm%H49+2iyp(kT23-sHGJ z^ZQ4vABfMwNE~V{!`?&-)yG9_HjEOCBN%Ex3DK}2x45n8rNx~q%H5xx3vy0QY)(g( zdZ?WrDM&82K-!s09=Aa{m`jC)FX*15P8Tmrx_m`{dFz5geD8MrZ{UDmkT1!%gcmNX zb9%CIQsKon$vN)w+Z{1V5M?dL8!^haV*GVy42ye<TxaLJ5o2RL#;;V>SE6j0)0FTu z+_~jnxx>GQ{+z(|RFAW2pmn;}YK^C@iHvfOG1lw#a`*k6-Nzqfo2ZYHK8so@(?P?@ zZL}(%3aP>*?uI-s4d70@0aHO<HkMtq9KuaPs~uzy!NDI-l=geVS6Y7L4-@S_=|@Z{ ze|r!mOmFW?xO0+iuH@3n-o4)Dl@YRcmU+C|cIP_Lr7>n5g}vr8m{)Uzq__7QRf&+u z3v;{NK||@HZu3wnAvJuEPo+$x^gt;KNQ$`ZrBf(&-S#94l~8&41&b!anC9*&^0~w0 zP&I6r0UUXupTt^xr*nI(hJO-yAENx19qo0#hHX@b1&lX)?2N_J&SA{Jn6urEh)-1~ zNky#sK$A3>s?O7}*HNJs@1?9iVnYGGQ3Muz)WVEfEDc-zD4FnXAJJ))UGp6=j~Pgt z=`??U)-#*+Wjv<(90;KfwV-cWn-qJ^t;{uVSPrdOFPFBKYp;Q&d>vvfUk3c<xP^Hc zB4A$jGW<?1DEH3k$WxEB4fS0x{A0rx4S!(xlHs2suboTxid=eEgqKIQ4ETmw3yfU_ z@sWL8_Mtt8<NG==^&7@RUy4);C1TC+(*0!MFJHH3OtP`ia8Jf_4PO#pI_Utp4J}hk zYqgWr?g;#SR;w?Iy}swy4OZ*fRvn;*@(PSle~lwto<Y3cE}VriPtH{KcKsR;Xs`<U z`f;ORYG2|LE%BEjH-O~DG-7&?$Z_tesnTMcyHRo`WW$p8aGfesxieBT9;S`}PkSJ# zEg-~MRE<X~^L~%Y2e1OWqJ^v=!L8em7S-E?!foCt+~!)%&eFv~GLdeifl!jOT%L>* TK8eIWK0OLgRixM}c5(NAQK{fR diff --git a/test/api/cloud_cache/__pycache__/test_full_process.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_full_process.cpython-37.pyc deleted file mode 100644 index 57953fd6f3ceb4b8415f594b68a58ca66f7c783f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5051 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 GhW-oPsgCdf diff --git a/test/api/cloud_cache/__pycache__/test_local_cache.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_local_cache.cpython-37.pyc deleted file mode 100644 index f7e6788898f9038a5876002241f477da477e6b51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1339 zcmZux&8izW6qe@SWBXE)Zc0O$MK*@Ux2ZR!2_cCIWD!CjbR!IdJkqV_dS*08^8I66 z(%e44-DH15R(*j!MW0}{Sq1t8UG+%5o(v@#Bz^kkoKJ^yBt0FEV+5`G@H>4MAoS5J z_RR(G7`l26149fKh?v<aaOn^SBjz%%a7&MPfD!WxzYIuVaR4|ZAx7L`A&dS%mzYEh zzebb6Cs0E#C%6quk*!lT`-Fjj^*EE9YMw4P*_vx0Mz3e{LTuQaW-AWs_=U)5VON=B zRG>xBJ?L}jDgh;iw~j`Q)8I=8QR8c;LGLkhzC~MCyN%m8%)NBCUgKSR%zKY90^~El zL%|L5SlDrqLBDxAXk74iw!RJ<|2VqD+n@;;SgxG4qu%JjTip1au74dH-EG)}Z14?I z*Ej!T26}r|{?)Ot^PW|IcUrqB{;%~<=hf4?!piITp4t_bcMQ*BD8TUIDo&uyZMGAd zWG1~25++WoLQs|{QS$GT<whr!&<QPyL>wi0#gn7F;L7@*=6aR%tMec^;W9ru2Ro{h zQx2k4LbHr3^(EKOg|u?yR$(fe+DLBd-}-iSF{q_D=9#{CcJW;Y(~?&C5m!1rxj+2@ zzGEe-7T<62?8{cOp4E?Sz|V4})yv6HnzPe}HPx#kU$)*W0MZAJj7=`OeaLv9o|I8d zCEOL%x{7OZy9>pnC#`77ReSJ6DK2#`s%KIPNe0F#HM>kA66msKxg=llGg{W*V}62^ zBE#L$w<7Iemknb%%*-{|rH2fAxgw)(cMxbjs<r$R$y*TJzbEsb7r#IhYC%_&O_%hP zR_BW+70pD&=xo8O6SWXEuT%!3s8{D|@giR?RId5Gnr3VID+k}A01LK0)R65%TIYwo zSS*?L;+fXx?Hyy;CsUi4-C;1-Rs945iaZ?S13YqKm}4_Kj$>x;h8qEIyR|Ur0J{7d zd?y1rf{A#g&_bH0p!GL8FO)4Oxw{W~3h_>R@%FK;vaO?)v^nbyw~c7@uoP@l@JHr_ NQs$+MASC;_{{clxc7Ff> diff --git a/test/api/cloud_cache/__pycache__/test_manifest.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_manifest.cpython-37.pyc deleted file mode 100644 index a77ea3005020b9c83b2d7f6254f6b2ad4fb67e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5548 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 diff --git a/test/api/cloud_cache/__pycache__/test_smart_download.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_smart_download.cpython-37.pyc deleted file mode 100644 index 61b1bbfd370d3f00aa22cfa1c85e40aed4f02ba5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10124 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 U+*ZN*hV@nJH?23U->~ld7eRjO5dZ)H diff --git a/test/api/cloud_cache/__pycache__/test_static_local_cache.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_static_local_cache.cpython-37.pyc deleted file mode 100644 index c72fd1c569403a16c2d6c675e4cbbf2f300e2058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4163 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 diff --git a/test/api/cloud_cache/__pycache__/test_utils.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_utils.cpython-37.pyc deleted file mode 100644 index dd0fb34fced414647625c2ca95e41817b96eccea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 zcmbVM&2Jnv6u0MlKN1R!s*pktg#&xYu9Q|BqViD+2SgQ#RFE=Sw0Or(X0r1Y+mp?% zW)Bb!Tu?6@IBvuV{u&OPeC3pXffLVOnr=#jBE0f@Z|vuv-#)+h`)FmQiD2Zvd`rIZ z5&BbqJRcSqAHo!mK~O|-io%7)AvWJuXdCThu7xnlJR|+k$B0_g{vL$^b*KxvK|Sh& zZc_XNb%Jw1L_3j|dgz-PFdxAbKZBrnh9sKf8lB-8t}(Snme`QicbM8Q?KrS=-|V=s zW6vGwp5bRV@Y4A`i28H1i=HAtLZd)X<L_PD|0m;*AaZ|a`dKVxDYkn(T4mW}Fsz~x zlU;GIOENMoaxxa(sK|QqL=N_oly$-Q;Fxid6#1w0y}O5_l#qQ&7-!?VVS5>5`sG#7 zTY$Y;iOn$+a`XS)va)>3)^z)-YpxgYbwYf4k%+IZorsR7+)5^?2-g+~9pofqgMD6P zgNmnW^`Q`qOUU6ToEKbq<wQb0LU&AfE>!Ca*xds&$qzb~vf)VBS_1kNaj0(eSNUkW zuU$o-#DsQ-WK8l&|6xv|BB$hDpXJA*Uz98t5y+y9C!+s28TLgY*=9+i5jkLRHci2U zj(R$T9x0Pvlok~oL?nutSsa-E(k&<Ib?x&{kzD>yIw0`|2xK|9iQ5;ljn{D7cCgl5 zx5cGCv0=gV$sI8Mqfd0T+B?(TtKRzG)tXIuG~w5*fty!&cWkb^IK0JKN@Q}(1|^a4 z#RGC3cE{o#D7A9Q$Gpr!1bX+j$=D^A3z#>-L1+wwb<TJTtO)CG7@EoSG}-wB42cf$ z+@e@>h_tD7if2}hsC^sFZ0XcCbxy5k4`$BEed$v76n~7qerM*^&fKHk+^_LrP+Qcc z{*TrfU|?i+0&N{_?V%T}A{+DO8Jc+pvjLdz&ivY+w`db?4o=>d?K(Kcv^8@0Z?!jH zsSU;pkE0(hp{>qescksfs2kvY;|u}A{Vrbx?$dAD-bs!inQDU!Bg*y<;sh8a%Zu`e z3t1hHPbSmpYD`2tFio%NN8$0gPK-hwtQ?U{nZiwF@!`3yL9X-Hc}-b)sXR_{T4Z5s z*XSpbNT!@L5mGt2EtCrm2TZwR4jrMK!y?I*7sW*qG3D!9(`2apVM<19Yp5K~2vs(8 zi}I?H0@$KRZfas2m>^Au>rzpTn4QoB`b#c~r5SoME1@ct&GQ2lkhF}+kV)n4Yi>|M zQ7sr&SxFLl8jW$~C%K_r<wkLpk3yT|;^hikHx+h83~xaugzhV3wQ&HyHeSUWc-_)g z6YM6~P<9=iu@-kgaoxe8n^##m;cMEy^PC>Kzzp3bX6PDHP&O=wt)+F76VvFXo(=j^ e$mWeqX9N$jf>tSeU%!}WgU~Ssc-;<e1>WDfE=D2% diff --git a/test/api/cloud_cache/__pycache__/test_windows_isilon_paths.cpython-37.pyc b/test/api/cloud_cache/__pycache__/test_windows_isilon_paths.cpython-37.pyc deleted file mode 100644 index 42bea6375729a5343717253f0573db83eb84cbda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2714 zcmbtWTaVjB6!zGO<2aY@rIg;NTv1RXwTYIZN?lb|w+mDVSOG06G68qiGpW7nTW2Os z6FDH*KJWtN2lOE;p7=|C<%t)508gBmTy~dI1Z5)69MAE5=lEPc=T@U(YcP_Zzs28! z^sBs?4;_S?aB(>iji5+#rz>(1-0P7Z8?J%mo)MMevRhViDKg`VTLHOD%qN;_5p+ju zRel2$ZL5Wf(#Kc?ur@cNv`;p%AJAKvQ`oUS!b#YpT=>$q98I{ShnsNmb4b&KmZLp1 z)(IjyF-S?;AQfUgGf0)#q^6|$Go3U@6Ew%<eTc}?GjnX@h%BGc#wCIB5?R^PpRSC{ zLZ2A9k(c*%q}|iV>L=Q#+UFWMPF{JUjZIOSl*x&GG_K^8iAi1s$;vIVx?ANxipqB= z*Cy7!_Vnv<^|nS%l2cDKa!OS9jIo_pCw6X=)49115z6gcCujEbaZS{69ju@ILC<Sm zJ+Dm~<TXI81AbE+%j<h+9|69_e^>am$r5RRzA@7`=K7xyUy@H8@_7}ad=7&(&30hi z4MOe+2&Mz;P9N5o;zT$ibskX`_J&THIQPPYqyz43zVCzy7dY`LSEogQ#U&@~IoQb{ zUGkI&sB^!AqlhM*`wkB<qr~Zj5p}po8I@-G9JcTj!Iz2kNXRa!lXDb#fIEXQiX1<U zsgw4FJl5++&c(1z+n^GG+{DRHdBU?k3)4RMxZZIxMl+faWd%HTHl#Oq-uVEG^FDQ6 zU%PhoZFQ<ZYi>o_@<LM7vIzS$NFzeo$c~4XGnVd9UyRNNLS*Zm&R{TT@AQ-1Hn`N0 zo_0jq!EK*Ea!YG4+%n$w32hmL(PxosLjZZ0CV=f$m5~7RV03PV#^L3LN1(Q+P;bF- z&EA6`+}UmEqq4FvDo?d0!2)}0qc{J~C#jn{CMAVdjp8KD9x^Ukrn?l+I>(#2=AMnI zzzT8}1<y~Tew=s-j;Y&Fnk>v{6ehH&&jO;9Mf1o}Uf2s5K5EPjwRd=$6lk!u=vCRX zP<+}Q*{da(RNw1ccYo1ZdQsvu>J=zvb<n8kk8d{DyPt6gWfupSw72m9a^BrYu%9Lb zU+L215$~puZ|=jKX2FnmKMc3KJQVbDhW%aqfWlc>0-Wr2WUY5_7Iu8eE1s%9wdoC} zRqln58OWMUFmGqWVwv>gc<8AB(Z?Yd{0-^5A|EumDghT~<sna`GmQ52DD`o~Z?vC- z7+GI^v2oe`vb#Q7h8M)$nf0zj@Bx1@q@9~^@e43fO_Hjshz&^7kmLrdA~;yfqyp`2 zjjsGFr|yF12khz_fG>w!k7fvx)k0e;9W8@3K+h!Q7AQT)6FVk%njR2E5~Y}^cwK?L zd7y5+gir0GaR1#!wk(}p6w}nnl>^jyonAfU=zIUq(K)0qV<?AQUmQ;~jptunT=gO- zG!LrQo8$3ofHM!~?U(ZLdCaYrSy-NGXwNHb&x=#i2RihMy5~LY<4E#==dl&A%~s`f zTuukxDruVfqvf<Fy)|L7bjz>|b`nIlez=R=lH`*Xa&1WxUYKNkF=M;dGLvOrlw@BQ zB}F17=%K9887(TnzZsBrVRDL@9~8|E4g?{9Yu{xoW%7YU(8q$wQZ6bSI8F%0B-^;v zML^xgg280d73CNU05iB?Zgt9hu-$69wKz?7=@1_B1J@LB2A`{<y7+Rr_B=)28eq;T zR$-zZTas2+x1l5E1OpmDSu*V*!xxWLaEh`*bj?^%k82XO9*VUJ^O=9hd=*To|6!VC z={h?2nM$@%3D%}=p*lLDTV>m@QC+vuQcdbjkeYCvKsI6*0jX7GXJKKdVJa%}b)s-v z<;A@)r_(ktY5Ne99+p+~-SaPebRH>{7iIC#yB^e)b$wcsH)IcS`8Ur(@CJGv)r~&^ D(-8=K diff --git a/test/api/cloud_cache/__pycache__/utils.cpython-37.pyc b/test/api/cloud_cache/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 8882cea07ced0db72fe0622eab52c41beada197e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3382 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 QksEqtw$Nc;wR?a1Z#l-kjQ{`u diff --git a/test/brain_observatory/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index da302f13270f0d1b163d756120c66e6059eb8218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1429 zcmaJ>OOG2x5bo}Ic<l9BAsZ21M<kd-ya$v^6on;05g=qlA{5lJG-^-xcxQKB>Ta)b zG(Mn2f=j|*u*HeLG*?c0<IIVwwzFCuqOGo;s_L%CS5<y^csL-is$YK;uRTJ3N9N4} zo}9oor$8i;v><$UQci(q1uGe6bSLw;=kEACP~<F>p7dXm7nJuL7s$|Yk>h$Ya$MhW zeK~O4K+>lqKDY#LWD?UZlENyRmnuaGE($w<{Rp=C5QwA@1u5woR4qZDGMIZZl;8o* z{woF+2NR7C!Q$}AqN?(0{<Kj_&Orw2k5Bg><YfO5om~2$xI|BvA&{8y0mfmhC>zs- z7ou1w1JaL0QK-tu^YKiJyh`esQTjsITCc`>=PEJiOCy#sb;oZ+N5K8rJi0gi4(^+& zI2Cd{6H8I8rk_<Jtt%-$nX2l-OzQ^hr$FoGbY-Sr=d-EFt-8~Q^jyppyxm7|Y$3ek ze}!=j#xhimn^kxCx0o;pgM_dlWi+B1Tj2_8R9s<w3m8kzDB^9|#@hncuROrkpYTW+ zWlUaIJP=u4sMzC2dr2adNp;>>&~}4ds><eBt~9^-<^n*fZGzy&eit;WYB}S*$+L%# z!H{O)wezZa=>WS%`l#r^UG(=BF#9}w$b(Tm0!fM`$Av}^eca{-ke^8A@^~4oX^S1_ zO;Wss3#*OB--m6!0%FO}WCPc?^aWjemYsPUzx5>BvbAr6P1yR<+p=G7tb;b#^jfl| zlstoh_?A2&-;<WMenwmN8r=X?M-XzN>qR9kppsx+%=3eN9%DE=x{RaFGgfzDd2UtN zbgVX=-w1o!`Db-r=^;eL`vB1wpFh6)<u_fh)X)%d=(6TL(d0>57(T#{^QF*p!$Vs( zGS@sp_h^bo?opE0FchPmHpxVajk|-{AxyIm5C``UK}U4NM)VeYe)}qcM(OeWqE1C& z9*i^hFlPE~c%yG4!RCUdcLHZ{c>U>nXd4F&`Y+P&!1>?3hc&aV2$D%}?rnEq{?GWv ztYcNv1ww1F&j&-fmf4YkmRl4H<63Vw*B`+Z;~If!tbcsK!)Apw(l_xns&?oH)uL=x x`dtw4UY7r07h1XDaW!zMI14+6|8O1MFKf9d)B|i#*N_p+-Vk==jr#CA{0k*AP!j+E diff --git a/test/brain_observatory/__pycache__/test_circle_plots.cpython-37.pyc b/test/brain_observatory/__pycache__/test_circle_plots.cpython-37.pyc deleted file mode 100644 index b4d311c96861b9d2a088707b67bfbc47d881d168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3397 zcma)8%WoS+7~k24y^bGooRFp{f>KI~L8PeMP=P+ws;#OtQiDL2h1qzvj+4!<nb|%p zg#(XkZ~Os?IKi0%2QK^@d*$Q{LL8BJ{Jz;ocGnfEt(_TvJKuPI^ZU*Beb<}K1q~nn z`>&i|mo)7+`jLKg46fplkI`_AGfz8Yy2i9ay=So4V)iVqbK_gBSK%hN&{uhdSJB(t z<~8&+zQF6~7kGm=(bsv4FQRYoHeW*D<Q=|@zQtGgOXwH*DnEn1&DjI3yEemrYg<EV z>BI0;@Z7*7Ihs&AW}J-}*H82>wIgj`=j^P;jRRet3yrUtvKX+Kuv{if>=By#)=1|T zd4=Y2<p@4lN5}5bj<A~ioMv+kyQppn`r{EE^_kJH8J$mJ`s1V7zxZ^kQDr#sf>8GA zlfZMtAPfdir;#Q1oQWH?u1V>Na2)tIg$P8X`;$nYj3e9eyrCCJx62~Nf6zn&EB`gU z@qYhf%$I#<&*7W9&J)L<_OJQQFz~taUf=Z}%YHC%eK|xMO!lU-e{a0om*dcVXW|SG zoRJG(&%+FUa4B?UcxhKSV}B6rV%f(|7>KDd4~Ang^xT2k`Q~IAwQ2Gohu|VMB$ZNF zi*;B>@93fhTY;Av42qXOF$lGN@Iu-kUEo`JR>4W@#|BOscARvTT6NNwLz8%kJwkoo zf)D9u-bd%P#OGn=W8z;-@><cLwXz@H;=eEhZ9N&+v4#nTf6UfsU`7+lEbkO{<=sHL zn2Z-OR`wCpBY&qgluFuLf+V4&GW&@}2AZ9&-m_hwPlB-@Mpf>PgzHLS;?=EF_0Z4R zKakLje8zha*vul^-z2MwpmDDiGvbYX34UE+!zhRqQKg2?zsp3O#-yOQX<`&D=Lk*R z-^B~rMx(J+wyv+?S!ZwRt4yrIR$!KPr<mQqAih6z7AK4tJ<^Vi6YU#tiW_!5I}Ibg zGwKYwRt%siCu8AwgHVhePeul$8P!HEq~?TsQlY>VFo%KXl@W9lf`b1C*o>sDX{@D- zm(dqCorQ@Vyh%4rq2k0SY@0&Gg-i$}SqdkREoio$nR9cuGl-R~jKE}oL(e1tB$eRd zL+OSo{N=*-<NGDfV0U7T8X^(=ouzS!zqNVvvHNvQmZSrXwb=?t6zdol&Vi(($lJmo z3zxuIItQXJIR^@<O6>Eq=(O%;CtxNdE6@hkPodTwe}sqvtwHN$h>;cBOCaN@lXJX- z1#{p!OuPci3xETKC2*_+&QQ0yJZlbIMrJ|Ab>VObc;JZPJh+~z%+JM^^V^=o_G%eh zcI$58O-fwp&JnJ2v3OI`N;8Po>ltCVm2+IRl5NFVU>?!`M3kcEC#RSi5Mzspb7f4K z81LpV#ko5dNeGpSBq?fK%CcN(&aF9Il$cWucCv8kCK>Jpv7ISK%gp;TES~7G1$=EL zUMu6HJFG6-Jq%8R4)$-HScOnR``^fzqa0RNBULQ7GlW(yyNE@sUXbL%6PJ(Nff)Ov zx$E{^{uUL+Q!f`QCfGVLcjsX#+_g-PZ{@J5`bj(1Pf(hL26DKGOhET&BeasdXr6}2 zTy%_cT4e9JPZ9oy2T@D7h?Rr%w}KHhZ{PfMuzml*ot-=Pw;rS!!k7fI93tZsS6ss* zP?QHW)?hXh7cnY8%5uanctdn47=T0ZFDWPuPURzAqnIu$DHahzkV|xVMUe<Az*qMT z5Q)qI`%XeGvIs}90rGR6C^N~Q<{g#%tBL=2Ie$C#PyVBp%=ww-sN!Scd55edlBTAs z0tLP{BZbZ=W6YM(bZwQH#RZJT>(tPZ#P!5!dGQ9#WMYF}l>%E+=_n=b3(Sx!Xf$T) z4OEJ&Yz_UoYQ@{Icb9q>)0%X1t{mOWSE9Y8x%a(BenMPSSpK8K$uus8s3ukAiz)|H zE>t-~P;gbzNL^V$+E!{%d&*%_=v2vMUpWl;BhUSijz&^~?f{crvzxYMS94$MKhIRx A{Qv*} diff --git a/test/brain_observatory/__pycache__/test_demixer.cpython-37.pyc b/test/brain_observatory/__pycache__/test_demixer.cpython-37.pyc deleted file mode 100644 index 554da15b87b45002b06354c7b150f50ef28b571c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3070 zcmc&$OOG2x5bo}I*z5Iry$|wGLNI|G9BmvFZc!8xA|8>@N+f}xktM5lx_5SV=SBB; zV_W7x;EM7WcHzX8pEFl3?2R)ApsL6AI-3v(0%b<7?&_|t?)tu}9>2e|R3q>tKYY!< zUm@gYRHhH;<QDw&Pc|Wf2pSQOnwELYv{r0;HZA8I&oN_eTw#QgxauuXBH3>3U{Nqh z59-1)uN~NjbgBmo`u4$+(Q!Szfh`<(O%LZM){bzEHF_dtf7_Y(setEszm=EwE9gsm zGpEJ#K6Ofh8hQ(?Lnf+X;al<z^%`?XEQ^|nsVUrl5&bf*0`C;OFN(VHzB2J%;%Eto zAF&SD3^Ah_lwho!n`$!~z#QffceDWxjx`fgiME*+ZfOOPHpFtkw%IXyQ~xu+|Ha;} zVfxkV-F$_6ul%#UA^XefsszCLq+(uxyRb1kN(pRRvl@GG2FzFh_ASf-Y)x)J7C;_Y zm<NFanYk*~OlGc5GIQO;@qcCJYumP|hg0IT*>z3O`=ov52ye2@(G8vUl`nhSipO#z z=6bJ}EAC6Zu^sWehXZ;e3kNdNy-X@IuptMT^m8c!^a0PUN$1!1jwq-{48(Mf_zs%D z<4%5epw$;a<m7;k$(WAW*gCYoa&oq79oS=MY#%bbIN_Ldv+Wd?hzCWzCuAHBdRZDK zdBKvbsN_=TVG<N|uC-KoPk!0wQQIx*^Dz~Rb3qlg<EV<|6JZtAX<UV?r0z%gk3=oQ zIe*LVT<?AcTj(y|;i9v}AMs?^y`6ABO$2|pE0cZQO*5HjA7q;C40ZRDaI34sTwckz zzsCa!YoiD(#NJgr_th=M!=#sPf!lqar)p@1%OIudWW%C~cJom$AaIBxIbWkLRrn1$ zg3k}}%^-9t@IxyDv4GAAh~2Ssz;bIBzA{hVp=9jrI)a`hyRKk+Okc|@kLhfzigqyi zF^)b2IzA=$$QLAEz^~TW9=kJ=tWAZqk2?2(jef*cE9SWh2OF)vhLKhzxz1Y}*a28u zdD_xxv@bjDy28UN%nz>$$rj0d85NZ%4FaUK^6>V(&AXc)6%{4@R0&;Ju?~vHZNqk$ zCLbu3DzL|8NvaS8g$SrBh;~IG5(+=zY7s>p#S#e5^?3%ns0NN8!=-3KuedUYI#8sg z?mglvfdlonQ`N(OFhnQ>4Dm87(dd{gAtepE&RSHR1%1>}{L!?QbPh>is!M|$^tPhZ z-veJGIjf})AB4YHz~>+EJilaag4Yv#&PoPZ9NQ?7m9Zn3(Ln-(*K_AF{5OGenlPoX zK-;c?zgREpDi31`$(EHRe*#Q(+AJt)$1xR-394|+6;U*v4$I*DTzt>Y;rsNSw_uMl zy)QTEDXLnak1ieWxbfF09{rA}VK(7|?W_tqpyXti=1fq*zGF{LQIg{|GrM>wInM40 zN~3dklYJhA0y23J#{IZu7;7P8m)jJB&ix&@n%r!N@px{TDn;#c9`&V3%rd#p!S-!i zorgxfj^YA}H&C2Nyf^273CrDqi}_qhVU;#P)|*sa0<FF7IY~dxh9zHb!H`$iewYnA zI^#;q!Yy01hEo@(S5W7f+oxl)Kq_zLnJKR_nJe?fj=9?N7QsDyF`x!UvT(RkeCXAD zJ*^9KHx<rEs#JS+nn-Pm!f<L%J{P^g!PH*$Mx2U%ByZw%qDLUAv`Xu=%2q9xGOG#w pi|}jAdiJchx(F5w?a|`QGTN`xx8Y^<!r%1H&}+u-8v2;n{s|E|`mF!} diff --git a/test/brain_observatory/__pycache__/test_dff.cpython-37.pyc b/test/brain_observatory/__pycache__/test_dff.cpython-37.pyc deleted file mode 100644 index f2d9323fd2f8ef64b7c68952249a73761fa94da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3194 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 diff --git a/test/brain_observatory/__pycache__/test_drifting_gratings.cpython-37.pyc b/test/brain_observatory/__pycache__/test_drifting_gratings.cpython-37.pyc deleted file mode 100644 index 23dc401762aeb326c0e9c0d435d0264a750a51a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3190 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 Yuqr{L13qk7jU~6?dJYt82OgyV0$k!PI{*Lx diff --git a/test/brain_observatory/__pycache__/test_locally_sparse_noise.cpython-37.pyc b/test/brain_observatory/__pycache__/test_locally_sparse_noise.cpython-37.pyc deleted file mode 100644 index de509e0484dc4db28e258fb21f7051920289475a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3579 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 C9<oFL diff --git a/test/brain_observatory/__pycache__/test_natural_movie.cpython-37.pyc b/test/brain_observatory/__pycache__/test_natural_movie.cpython-37.pyc deleted file mode 100644 index 4fd2e092301361496b90544b154f7da0e916f98d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2800 zcmai0OOM<{5cX?49?x@UlWYhO^5Bu-u?d0`LJ@f(B$5FU5W-qy^|*UxJv(EY?w-x= zYW4t|6H+A3D2H7*!SCQFaOx{ua^uX2s&?;eCP-k*<$86yy6Wp{-)uHR3$E<vZ^_*? z%lZR_<EskH2k?lWfKZFt6KiTmwvD_qai(tMYTliAkq0_&QknXZKdnYpqYt7Q^Tr{q zQ2(KIU`KT=RcWB52CdQXp%pc0oi^azV*X*9xwOfe2iB2mq!w#w$s2bLS7@7d=*q}B za%h*X;w*SaUFzPqdZ(U1oL0|PjXsexPA2#A?UaGsxi8b{Y%&u!GBVi}sp$6{RVj!} zHdXB&8Kud+JlRTc^zjt{a|<4E1&Fi`ZHl);-N&wedzy2o2Wtb}$UU+l0>95~@PC4& z=c>w(lPOabAqkht6EZKJIB0j#?kK0AQSCO7<U{oP#o|rSYx4Krt@k#*5R8irvPtOr zfIJ}C?gqr4<QXOJY_M!wY~%&YL;^G~Hh0Cw-E^=aQpw&bNU}vn48~3-;6b;pN+#sh z0Vin|=L48_o5-B+YIU5I$%?0#t@UD8wS-AmEXiQP-hiM4=EHJ4JA|9JflqLacp*wW zcyzWN10w+`)Olp@+rYV+bAa<S=K@!mJ9BsFQ2&uLw`26Gq78WT3k;8*H9f`yE~M7n zTZ}<XUE3<aH8ke~*PK`8{=y4wt+{2s<Ik}|?Y^o~$hcq<fZ=6WpAeP{`61Ins4!uZ ziR2_<LR}m&87DdCERl@H!^te?Oe8EzSX{dF9KHf8Rt?Soa9O-fCNrk$IF9FOoKm4q z>q%hJSQIRQ4`ry1YIHa>pJ|~7h-OaZ(Vb+fe7b{SsTDohEX&etgi|o8x~N*NQLoA? z5C}ho<O~wn%oab3<as1700Aeg9Pc3MB3T6zg(u(U&!P4lk_8lb3q>6BE<EBA5X%W2 z00O|FWjEjsZR8Ld_y&+T+JCX3Ff@dThR8?2Kw(OVAXh>JVNgN@K~T{pMF{u{2vq0R z+(zgC5Gpiy<Ul!VebpGGSq9~yJCL59T^6KmlvqsxdeuDf+D?V)EZI>L6pU=ee3q$> zPA_IUmNQJdsWLwek;4aYHN6Ud5nlW}l9!NNKyneua^}>^6naZpIWynK;3cp~md+XG z4Rh(3n_mXYB6ltb_(h$&YrsHG{wH^3o`x<0A97Uf!;XHySP=tyi#!w163Z;DP8rGK zWt;K}K(WEt@~9H*OKEWV%McQO1<9*Oo>}~Ax%j1dz5+jipfbxhOXt{WIl_y-21HdQ zPe&uhdu|jW*vn?5zXvfwvA|H*u|tm=$;~p7*I{UaJr*y_+ah;kXjs(V2XsMxoC9ay zox5XOI%9V$5a*@$oegru$m>S-jeOn6RU`LN-Z?k7Z(Cn?_dOZN8shT6Ie_Ewo6o<r z7IW9c-qPGP@%_@=HSy!p+%@s5maTDkSU<9CoT(u#h_WVrGoDQ&|8C@#k^eL!+v5)Z z%h*=5E%?C}j<I&f9gsT4zPhkqGWJtw=huw=^um7AXwED&pBv5ELNi1SwE%Taf3J<F z>IHoWU+6=l?VaUVnW(Otm#HV>I||}YKf81HlN+~H>xO{iNv3&rhx43AjS`+^iKF&2 zV2vs<A_2~Fo@P>2VdoMlxo(5e8qrh537 &arJjNaZGc|D@rAaMJPNYuRi%U|hEi z-A9#Q4v(s)qwB^B0iz3aa@}I15c_x8&LJf1-{4<1aOf1e-}Z2wp*~~b#D&K0WK-qo zXrI|L4Lq#lO~NxK1oi=e+umwoU+viXhVI)v=H1Zf8lY>Lr)%@KVN7o|x^nyvu>P;( ze|_oXFKhGWf4DD>9AbW>xGtVw>|(@`hkKpluYhimkzWw_RS~=any5NVci@O*Pn|%Q z(Gxel^7FwM&RFG53Ezt91;O7T*#3J=ui~kuqEm&vLj~_ob2^)_>)3z<5<H0l$VK3` TYOS@P6@)%?R3GkR>e&AP#bV20 diff --git a/test/brain_observatory/__pycache__/test_natural_scenes.cpython-37.pyc b/test/brain_observatory/__pycache__/test_natural_scenes.cpython-37.pyc deleted file mode 100644 index cc70ed6039d16ea97cd84b279daf2b9a1f603762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3190 zcmai0-EZ7P5VzMppU?M^OVT#|{x0GWO%X^4A%q%Ar9QMNqCx`eB+KXByZFv$pLTs| z0@nvfANo=$kEjo*6%vB~0Pz<f{sLt2hJ>0I{(wF)v%7Jcw57H@p84(0e$347%qPvJ zXTX#G_-**lal`l<h26&i<|=&R0T60XGcm@dZ<@%Hgp4iUlDw7Jz73e2RK||)jH`at zG?+bfX@xrXjV;r!(JFQC8@@+t)PsMWIgcC6qIKqN8BZ)NHCSCr_OSW5MVqwsgwQ$K z#u4!K=cskZ=*;iHYK)FqG*`oX%ERPN#8M^zXy3`>@idu=l{8E?MJ!f3q^L~7JX$Mi zx57aj-O8d-gzEU<_H6jB!6$wIlEW4$d1&54&XSx7oGm#5TxDj?NS{#WA(<HgwpFnW zcx-hwZvkJEI>>p{m|3Nc4M<(KA=i*x1-RzSo>j_Th_rHJ%g{49GXpk0w^~$bn1_Pp zuvt3|$E@&R$4unmcp?ffVo8$oFk+%OH(+@XWt_7pXEf+1(~L6#hKg9Ax^xJy!k&u; zXJExNSPzpaE9$7nvp9&UC=Sa(V9-EJSOgQL2!k{GeLYPJdw{6NENr?FjSGiv;IfK& zIoLE!<8**SFj_1iB($4?JnSW`Q{@#{2*)_&4J1t@EhO_u7Jzgdj_%?vk{S>QrE*$6 zhiDtfF9u(P-?MM7ec1g%FfO{`T1c0B;oUIZ>_S*XSxUqAx-4B6-E6{A5dqC6Yn!5b zGwyXooU_Z5FdBse2D(WCJ?Q944ko_R<6)czSr3L?5A%#~N;pVW5C&*mCYC3ga-na* zD#Upp2Jwhzdc-zcW&>W&L=F)7x6KBT{mY<4Q=ngDP~HFrLg6(*S%#WZ23B=uV5rWl zncc5Y_aTAssjU``UYw>74s-+D(J@s3%xMs#M*v<l_j;|zqG<1HN5q}5a1`)qTC}A* z(X&B5MK|lH;&oU#On|%TRQO@|@gqo<kQ_yF3<)|*kwd^0^J6%lDpK@#D*y}BG^EYY zZfHxQUw#5wO50f=;Ed9C?*Q|9+bKKsEj(yoqv~qW5_cJ!1aMj=St{7Bl@`Y=OoRPx zg*|~&qhor%mO5Pf%wX}8uq1v8$!R19HovGgzi*t|&`;n=(A(Er=Vt-oa9tbx43MIl z^LQ{|yi?gRLEa%q&>A~<zwMw+BE;}P7<p-=^C0EM3@+GvWJZQ&PKMUV6-RUXI|!d) zMayq$+0pU`TCQsOhL&9|f2rk~me;iGX?a7-buB;8azo4CYq_cApQUV4b42)`c?(y% z1!+ifb0ya<xq0MfaBN0o+vE+|Z=q~`rAGP)bS$ZJRq8C3I)_T`z$|GWbZn`UOP#}I z&sWd$F6dOG&QDV3NU8J6c}nlpwoUP?wvX};B7bN^c?gleG@^Wj$iEs<UaD;qVQ578 z36TYjC{H1BQ6tJ%h`g^6<t;>Z{jdCmh%fsX!==YZpBUf^GCY<W5L*_st!w?`C9>=P z6D9IU>z^E++9q82pA1jSb{EF@O}C%HcJaF&@od>%==O6`|EX?2U$#Hf$OVm9qM?zC zC2|@Oika70<#?C#3rH>^xrF2mAe~DbPm^DlSxsd$j%UnwgU>#{e)IOqr$uW;K+?$L zEWOTo#{E{1PRBjQb<Xe`>Ry3lGsxFKiqo9&QeqpBY_&9Z;0E#!1uwam{7N7%rdoN6 zAp&<c6hj;amlsjt?p|@ejctB&|Dx*hu2b{MOUti6zpnao%aW<vUkc?eg9y_m4Kge> z?#8g8dazfdfUsAkz*g0qGWE#ZUpPwLuj(p976V{Q>;lz?EDL-OYYtU{z|OGdfc~oJ z=vb;yI0r5$NGcBAvJK4T!CJ^6S&OfrlgNP>u1nhH3omi^vX163gRA#toJSVS7hcO# z7-^Xc<+ot+%P?=J?RR#|jO7<9jOG2sg^IMd|EGUhS%ta+R-x!jHgVg&jVXp>PLP?| zulC~&DE^o-8Rk-%SqdlX4WV!>>~Y9Peti;hs5K$Se9h#dpR=jVVKR5SAB{6QP1whH ZJ_P0_EO%V9ZMBx%mg_l?vK@Gl{s&H2FB$*< diff --git a/test/brain_observatory/__pycache__/test_notebook.cpython-37.pyc b/test/brain_observatory/__pycache__/test_notebook.cpython-37.pyc deleted file mode 100644 index 9cda6ed4440bec8b2d80e4c1d5f36e9bdf1e0150..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6917 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 S|8SzbS+kTWpDgF`AO3$*Dz2FT diff --git a/test/brain_observatory/__pycache__/test_observatory_plots.cpython-37.pyc b/test/brain_observatory/__pycache__/test_observatory_plots.cpython-37.pyc deleted file mode 100644 index 6fb3a9f5d5efcc72b2158fa2c5ee83ad1fb64400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9634 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 NwBK6a%y)s+`yVd!hF|~y diff --git a/test/brain_observatory/__pycache__/test_roi_masks.cpython-37.pyc b/test/brain_observatory/__pycache__/test_roi_masks.cpython-37.pyc deleted file mode 100644 index 47fa26ed945a2c0f5575ae347fdc6961e6778b4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4778 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 bFV<{-&9C|^{*!*A?$@3AdVRI-`>X#2U3oEu diff --git a/test/brain_observatory/__pycache__/test_session_analysis.cpython-37.pyc b/test/brain_observatory/__pycache__/test_session_analysis.cpython-37.pyc deleted file mode 100644 index 18f2b7c580c548cb667d2f4115033960b8b5c4f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3099 zcmdT`NpIvt6t1$}Thg6$_GK6*?3jVhGGv$_gh&FMP*?&2S&gi+%jvk|wwtO-GTkHx zGIQa8_zQ_R@t1t%G=E`E^Ir9mrNbalBs6Z-^LwwBe(UGjD3yi?Jn<jDu=Y41f1%KO zGQfNSLlQ~|C!9va!M737hT#|#c{4H_mSbt&iZYF?lhr(pa!xL=>UpQYGd%m4I70!c z5Az()KPHc;Q`Ay{4{52SrD0yw(g;YS^)k}aF<#;$HF{?7QC`Mb*gJmh{1_ka&QDxB zKfx!v^OK!<KE<c?|4nt}89uA!>8?D-=e0b;={B)%J;Ata*)+{GneummncomBjKB0` zAP$&HL~HBN`;;lR9VnO`-43J-lXyL5QA>u>H}C*>Oc+@hn=s^?KomJ5NA!_#Y#bS< zlv57xy1~sk!mSx{W>RuwfCZT?0f``~8N}Q+I($YdCe#y5qHU(LZX&{(TMLvcRoK{% z_NA+s7X@iSg6@Dt`$1|(iEo>Z#X*%?F>3@VReusuf-{~TZ+=+)4*Zc-w##_MV}~qm zRlx;6i8;Gh4dMe?O`1V0eV|Emw<W7zgkDvKDtNES{5@6+U~d$`3ck0f0;v`~jFOw2 zhe@kl*$I!!y78$rTj@k2@%OISUIDvg9tfdBG*8Qh7zN%(1wI(fA`BhP_kmHQPEQR@ zO^hWsxrH@|wRe_3qsN37j;XTFV-B$$+ImVC(~LGewOHuMbU2K66478P^krIZBz!*# zTy)6gkmGdtf<tLu>*GVOJ(lb%cXfH`-rCaI@=66%j`gtBW_Bhu5}8_1JG*I)c~Uc0 zJqcrBfz^<`{7wjA!+aDZI|y98!jMd7rb9+xCFW8WmdoygDA9Rh6d^c8!!m{p@iNFa z9v)GKQ^gn(zzHHIkW3<(LNX1cU0Pkbzw*I@)wKtGzdbu6W^lnQk~t*vNIEWyTgbnJ z<Tes4!Rs9LbaDqAy#vet7e{+ZURhaQURmxt>)(j8{#W4EU{)7En--c;qTHQ`)jsdT z3BpPNhK><7ivp-t04KlC18|VKaRg298wFT4<$^L#==T8JUz2ah5AcT4x3=0&uVE{G zB7(|5!@5w$y6T~6RpswduQG@{HWjacP2bv<Ktpx!>IzLq)+GRq0)+fbh(rLQVd3i4 zR|{c8w^zUHe}r`%L@+HtgrXr{1I>#Z5UgbJDiDZ*<}qf^kAhc&C6}Y{I%r<xC@i4U z-6&}OpQGUa1bZ$=;SJFE_@TrHYYvBQ4n!Vk2y#l#$T5YspnHa#R>ld{jbLm!qiR<K zLI2aV4ybHG?Wbj3*j?CFt!B_O6H7KN_9|1)TmiA$mumOwIX}aGiC{<&xovpgkm(z? zDe!I~-a>M*wBAO=6(jFF*GShpfj#GDz5~(?nYnqLnG0y)e=yVk^^%!)L9%C^Y_o;l zITqe6GzdBG{u{g#CY<Bk?Qa=C$4W2#y_<~wy6MlJGd_rj0`D>!2c6tb_)zVOpo4t6 z@fTn+wHi$9Ik`Bj?W(Bd3^$p8Yk?ABJJ3)ku+s$=x-J=k2@&Y-g}mwv>-$3fqt4~! dW85W?0A}i6-prc${74CZSvp_njdHG>dj_wi;;#Sz diff --git a/test/brain_observatory/__pycache__/test_session_analysis_regression.cpython-37.pyc b/test/brain_observatory/__pycache__/test_session_analysis_regression.cpython-37.pyc deleted file mode 100644 index df9d429f799bf58abd3f7000cb675adce51c81cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8982 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 diff --git a/test/brain_observatory/__pycache__/test_session_api_utils.cpython-37.pyc b/test/brain_observatory/__pycache__/test_session_api_utils.cpython-37.pyc deleted file mode 100644 index 4dee177261a38f3f644807b4b850a5bed1bf7241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7520 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 M$+86LIjR4D0g<M<FaQ7m diff --git a/test/brain_observatory/__pycache__/test_static_gratings.cpython-37.pyc b/test/brain_observatory/__pycache__/test_static_gratings.cpython-37.pyc deleted file mode 100644 index 84889d2f359571b7ea4ccce3533759ca29fd0d40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3862 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 VY{osaX*YIx4bOL>p>*Lw`5zt4(G36q diff --git a/test/brain_observatory/__pycache__/test_stimulus_analysis.cpython-37.pyc b/test/brain_observatory/__pycache__/test_stimulus_analysis.cpython-37.pyc deleted file mode 100644 index 897766bd3ed664cfe27f8988765337dde78ec5af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2679 zcmb7G&2QX96t~CruGjmKO`3jxLqW9!>46KX3Zj%sJ+uK@5S6u(HStWc-Vb}3@uo@T zB0+lKl9ChRgj&Ic3*t{e`~%#5;KHT(7kc8o@vOH=kr1~0=6%iAdo#c158G|efG7Fs zYx?JL!}uG8*<%Cq0etc^Ak1Lq$QYY}X(CTXBp}dQBWr92_Sgv=)8J%KV>WXh8#`uD zXEj!TYy>W78&5svvc@yQJl0g!CL{L@zqJn|8@^d|?`83LI-1Js2_0?ASg!h{a3(a1 z`bFao-H4+*X*7(`8=o3{xVjtg$tOTESREs~<|E`R#hJj_iX*@|xtWu7!fLxDH$t@4 z(FQzPUCmp-H&h?wJZ9up)yD=6tQzJ(uBA8!xOQ&mPUYp~2JEY|TGScMsN@-J&Q9o< z7ar`8%Z!dEvhX548fAh;ToxBMcos&f5Io8_3)e@}RB##bB;sM|;uC=zE?R<TQ;~$5 zbTs8f6Z?rY4r3;ZqiPTsG?Wt_!9<BtH`w~Ro~DByAnGv-n{7qoqQ<sxS;e9nY?>r- zvVlWz=GO#9STv9{k+hI>kSqcLyMufki3=p~=A(-R)OLaVVu&SZUVL@qYVUK&h3wHj zWh-m+0Zq1hknJc<7=5S5lTF!6Cp?i6&~(z@mc85YT2ICqe|tisA>H86cQgVIHoTHS zB(JOq8Yf}82E%UBEEU^I9ZG$aLaNWw%4A!u)rW=1b3hE@5zq99ZFbBSyq<|1XjH3w ztD}aS#67B`b_*Ct`F|X>>HyWM<5JHJJb<~C+v^T<ck%EyR*TkJoFtHRwgo}=%`(jk zT8U>wg1%_ay*6W6bPw23<4!mohGLo&UCg7(UzklXnfmMqyyY+frqp-DGBn~Sl4D5V z;v3=w63kUejsRCIj^WlF81Fq$OYCH*cwx*ijzquW6n3j;BHq~G!guyfkoO4^3klA@ zk0FgvhYxD-jH&qk3R;YBX6_g}WRHCJ{UegWh21e9S-CZ^GBU7-L|)FEZ%mMDT7Fl{ zbuHi0va99$T5f2$uVqimTUu^v`CBcwwETmTA?rgTe$U!4b7u!&P;m<t*F`S*IX9UF ze$SP4v9c~z+!5uMgCFc=&lF3_bGfq5M?9)L?}DeJJg+IwW0mK8%;U=QGI-XMCsUsP zw#pM#?~@gGs^U%~mm7mKPtQIxfSbj<v1iI3byUizqvkiQDdUcsKa|E8oU8hmIY8TA z+IGIOmH9y13vIhl*~;8B_J};DXDPFTnpytK{GjHl@*#t>0PF59?!g*dRM|u8EdQ@n znt>kk^-7a#&8157L~GutG*40U1(d%}jl0HuXw@x#xH^NSl~)jH<y9~`T<KO0Us-Vm zu7fy>1i?z2M{)s3d;#u|50w=FK*kTb|E9o8rS6=-`xG?8d65a+@RPeYZ-0FKqoQ+N z0!C(Wn%op372r0nKS3)@rsFj(6x;-LT~eSoDxiu49+r)=iUbZoRWt@KT{oPGh?A@= z0t)jLvS2w-=&vv)=+fxRX$(jX3kU_xxI&$v`O>^|2nuRtO$+LJe$mF!5F&!(RP7^- zFyJgqu|z(Iv;Lv_6tu%RV#-O-or!9T0B1pGrUBpu01Xyra_NDpMmPgi-!3cNX<Wxi zAO(^1FjBU#B87b_5-#O!aFTr>hHXQ6aY@%a@Df*nCs=f=U{n<%<gg&A7mF0Yt7k6Z zi*5Cx+$!}z#U+@_Zv}7tpOaV~nc8F<mkz&h0QKd0LP!qk>+u%+ZSZpM3fAp06~mx8 rp#uJA0OB8VHSbHIP~}5a4)@wPWz!LVA6F*v*8z9iwK~i0f@}T*J1eP+ diff --git a/test/brain_observatory/__pycache__/test_stimulus_info.cpython-37.pyc b/test/brain_observatory/__pycache__/test_stimulus_info.cpython-37.pyc deleted file mode 100644 index 1d24ced51eef4454d722e84f23a3ae7d79536cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11670 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 diff --git a/test/brain_observatory/behavior/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 5574359af8633551cd7c9a5c67d03834b8840782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2286 zcmaJCU2oh((7U$p!?{b_G;Na77MB8&E4Wmu=tI?_LQxS21*8TcStnV(+dbbVcedHx zOL`|C5^8?{?-VH!PrUR8nJ2_kB>n(AF|%h^RgthYvpYMpv-7pHpLV;R1z-B>kMUnH z`xA-!vtjZOKz##<S&U4qa5a*U7@CF@Mmn*lPUsMe+01!vg)Vbh1I7kxvKEX@PET5= z7Hc!_x%G^MZAPA0!P*&Uwe|v1ZhtoxnyWk>@+Vq~Jm(C@G#R1<egwb)cm$xX0Mgb0 zIicD<CCk;^DZsu{3VP{Y*_K>oGdbica7&u0(#c~zE}KlqG@kOZ6-6U4;ZamN2bo9% z5_SfB93P2HMj-Q>CEIYuKl4ZT`rj%pRX-lbtT%{{<8<EtB#nnz%HlhHo*t=wmh)5% z0cZJmuKHhzL0^G4AA&cBal&EmWC9ZGa2H(Ey8{`EG|C2`_9)hwobT2r?}FA5%JlMi zc_HCCdgTQgg%&A{fkiq*uE97o6inO-Omw~kLR$sZ<QbKZ3&O}DjId&xm3IsKfG(ZX zDeR@gXh9F?&ycsm0qp$ZFgLMb&EB$}K&By@jlBhZ@L=)5qimYTm=j-_)F}U0=&^tN zDsyHXQ`hqsj(_8UUy|O!{Y;ET_X4N%gc7OJaXRFZf`z4%Ns)vO13u)afxe3ba+R0P zgpYLT0(-2(t{I}CIh~sztPoahxs%T^U{S0foLcf+){^VMRvkbV*&rTiQHM|>F9JQp z<MG20!9;BXCRkGtElaL5s3T^B_s$~s_s87-Pu6;T$T8o(nhmBIn@zYsQ(SpId|=c# zOZ_{&yZ(sBdIo9q^*Gl4G@kouru_jZgz7ksB~!j}O^d;V-!QuadS-($XAMC6j{{oT zYOc!85tO0G(nzGEET9roF3%ytx_B)lm#UD6B+Vp;a6t79^)?78)M&XLafn2Eh?fdK zj8zN31fmD4g>_(^KqweZ;7Tn?MZ@Jz2owlmjZJF{%B7weDOyRvl{d6q(e3};1=rS` z<*~KI5_p<ht#nuys76Jt8>(4R=h%7RwJPd@q1u{0vzA^#p!Dqn=fo{Mw!tp4%~OY6 zdSNfu3MlfTQ8d}*7tXT7w%E3?3YYD?pn?dp>=vz`h&*4c6<xNqW3g?3D*$iZw~97! zZWWz3I9Gwwg(A7O&?a;HW1;+!c#0YKr(!CGhnRRscGX*a{xs)OOnIu|wutF$B77F> z*q>yH^5c{lHPA1zW97qbgI1+Mei3WPyg$mMkJS!$(8!hRVu}qWQqU?uL*Rt&7q}9- zVtV`TN6F3K|Ni0N{?<c@i7wAo(oDw3C~j8IkR>+_Kap@wn!KjY{#uH&5SYo!&;M9# zzU)-0&ex)~u5v4z3avSdMw3{LqY;{phlK4~^mf^;r};Qme6QT8X=waf#1q)Xzn}4R zI4?brh*tLQmupB=vf+hQ+-54$e40;U%}ZCL`Ajc1OeZj#(1l)pI0@{sSp}zT)wYJ- zN(Ntqz>)7^0N%#{xW=xKsu8FJ?J8{5iGy3%tP&>Q#ti|Wu(7f*Y*xkv4bXvED{biB zrbSC^(W}dfH!N5$o5o4#p*zUIr%YZ&bRCh=?c?kQqIVG81O#oce$enKs9nI?2|INd zkt!X;Z}x<1wI5OCM1)fC1e#LCQ`BQXR-;AmzfJ)I;ONnHSZM%WrwyAz6Kw%d;yH+c zs>Y7nAe$6H_CQnMtvtUB^RTgMN#U*fCG440&9s;ZEx76pXG&+&s&(U|sLUI&iXirE n)33s2Ww1HnH6Kj}H19#{{;C&$jAgA%Uqer5$8NbTujTy<E*5O1 diff --git a/test/brain_observatory/behavior/__pycache__/test_behavior_metadata_legacy.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_behavior_metadata_legacy.cpython-37.pyc deleted file mode 100644 index 302c1eb35a000157de46bf53341dff8be84109b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5795 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 VP3I2f;8eBsjcrvjk;76Y{|3>GRV)Ai diff --git a/test/brain_observatory/behavior/__pycache__/test_behavior_ophys_experiment.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_behavior_ophys_experiment.cpython-37.pyc deleted file mode 100644 index b0928221a3911094721cef1c4c03ffa1d3ad8d14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11566 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 awG)Le7lsgPMJ#oHHnQUi%Z158-~R)+0#UO7 diff --git a/test/brain_observatory/behavior/__pycache__/test_behavior_session.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_behavior_session.cpython-37.pyc deleted file mode 100644 index 9a183a5a4c2139d0e9ffbba94e6726bbabfbcb7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1240 zcmbVLO>Yx15VdzVA5Ghowg?cX6(@2aIe<8zs-msnfKVkU2xLXFoE^7WW!Jm1owlix z1GM7GUueaNGyi6<ocIfz7;l?~79k`Y&B$xdyv)3L-dtR45M1iZ2l34(<h%QrE)O?P z(aarmK!7GBrHoPn9{4AOc@XT7R^<oYk`^tNHf3Mz$C=)d#>AP5sJp;bMQfsMp&5$~ zD0nAiLdWEkoRQD>Cf?XPr4~`g^vtKkddFnqkNs2sj7)-e1cF!OHF-~<0#&F%9p<0` z^RNJm(1azp0n4z`Z%!&U7*}j%930aPa!g@$P&c`)exzlcH;<w>(%8`Ug$+Si5o(zT zD<Mp!?Pp**!de~ohE|$RuCrWf8%q=JX1WpLy4GDNv_u3u)CwWa<C9VQvT4`6vmMuT z;F`v5i*A2)R0T#RyBhf>rTh75>q+;mk=k@cUqHJj4ul$YH<XAn1>#{>s(sVNij;}a zXL)~Qx-a8i*Thyn$VD^|dlGY#1S4S3!47Pvr$wxI)<f8RVKY7I^e*O8-t*}fH|OJO z=cA$l!!#Z7SjBeE)$J5O=+O%Y_(uXyVmx(B@)>hnDBu@_w%3v@5{X%F&tQu>FX1`g zW~<jr;4!e<d(v{`9%)a7ilhV6ab(z%yU_ALXy6*>#_pB}S(3zR?@9*jvPu$115?y7 zS-1+>vK9wi50!GkCYKUe?HtUo#jEGHjE&P_GBiBb(nw{6MKv3?a(QlLnmg$jwmLhD zQzS{GIaX?g8Sq?afq#!fWmW6|d3fHc6*Ziwm4~*d87vJ2rya*E{1=ynkBTUKOe&fi z250JOdZu-zTU9onW@;cuxv)`RyVq9ukv%NDo?(90vqfDV<}yO5&m^ZSF6{CD4c6tF z`{+ne_ZzfHt8~Tp=-+--UoT_qcFSjvrW$SkA<y<y4VRm#GE0g|h~MfjA5YmteJ#yk On8<ba+)BwV1it{uA%aN& diff --git a/test/brain_observatory/behavior/__pycache__/test_criteria.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_criteria.cpython-37.pyc deleted file mode 100644 index 410c5945c21fc19bcf0bd13bec4af30129cbe7a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4993 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 VcjimDZ^#j{JElsO)HsQg{{W!WdRYJf diff --git a/test/brain_observatory/behavior/__pycache__/test_dprime.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_dprime.cpython-37.pyc deleted file mode 100644 index b6612b22a9c1d097526bfd0fbe32cfb807f09be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5443 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 P-3opa?j(Ldjeh?HkTLP} diff --git a/test/brain_observatory/behavior/__pycache__/test_event_detection.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_event_detection.cpython-37.pyc deleted file mode 100644 index ce22674e861f3e563a603caeb79250a5e32ad577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 zcmZuvON$dh5bo}IWD>Hg_<#r=_8{UMOb$6Ivg^8dlNA*o3<E<?x}D5sGBb2{q6683 zq9+OZ6B4{Ac<>_r1Hroond^eE2hV~ht0%_YRcoj!y84@{ud4dm%1Q%)q_3aQj|8DT zeOL;d(N$1+0SrS7C&<H<CmsP$5@Tq3CPvI)<}>734BtVnwGU{t?c(y}!#Gh~1boa> zB?Br1EqeM=ivd~(-2#<g!6-Dtip=rLvluBunKMWSABl`PX2uj_bRS6ELbuU_1MJ%0 z*a!pKWY&}%!5_+|5xY=f0<@=i7f;ZR&CD}sf){>3<SSKsx`^Aq<KQ9wM#uj!t3^hY zi$KJg;0b9VsO=2UtUgEbi^ehp1F3IE&|W1`x01aLn2rJS5E#NP5qcP2GYwQc<bhN? zm;3rA`u6VTrSmU7Z$#7YA7(#3y<c}5rJWawOXb;u#*)jjagQb=eqD%62)(hAq<Lvo z!!9k^r#UZIH>Ko4#aUXxpmZp~B#CP*N}pbAinAlTDjohf=RL*QTO?K?_0Q*9m;Jkt zO8T@<Sv#bUXj=H2DeYw`qg|h;W9er(Ph}5mmiG(k--ttB#)@CeX>ULy4*w<zAlRUz z`{;zwM;c@yq#aY0iJ}woJ{`xIsO}ex0>%|EfezYvQMUAt!GB(t10>}sFbFsC8foHl z<OFWu7H)wT$06?8o|TS<c_C_W5*8S*yCl^9hf90OrCmMZ0~*z+tBloT4w+++vUIKt SGd4>2x?ZES!8q6<P4gF`{PI-* diff --git a/test/brain_observatory/behavior/__pycache__/test_eye_tracking_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_eye_tracking_processing.cpython-37.pyc deleted file mode 100644 index 6ec6c7bd0f6ca7d3f7e733ab2e0a7d6b9c7a92b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6857 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 D18%=u diff --git a/test/brain_observatory/behavior/__pycache__/test_mtrain_annotate.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_mtrain_annotate.cpython-37.pyc deleted file mode 100644 index 71b4e1b75a46b6c5015a668e6e08f96c3d341984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmZXSKX27A5WsEcFHf`!5)xuzU<nfM4M+?KC{WZ1b!l0wNYTC6<fYAXg6&s`)CEyS zz5zokCcaWuCN^d!&Q1eGoOI_q<<7bLonLHi%?OJ6`T?FWLcY6Tk^r4&sOBLWK?H3G zA5Y2|#;gg}ArC2$<R}t>2+znz%3~3U_>AyG&;ybsKd_eUXLPs;O0^cOEXozAN)|#| zS=!QlpCmzN7uDQBW63!cR4}Jii1*_kM2KGWg<ZJ2<9*JmmPaMna#djk%Fmrkhmef% znbkEkh3z{zq*|J;RYqoPV4dLCUV?=^4Qu(0=m<-_`Soe{QU2OUZE{$Fm@nZSs6KzL zplp?Z2f0)yCT}~bOo_JbR=vqz)yv$}R^IQRJcdeQZPQ?eI9^z3>|&{*Rz<tSYfr$o zx?e2i3Qp=)`|rit`h*G4yz7V9cWxXI6T87!NM}^LxTG#dac7F^i5;S2$tiAt5=)QR zd2oswyXE{483s;~9TnkccEPUXM1OKzmdlBz96?6P@wl<WJzQg`kk}B9%gZ8-kA~<F z4Nu&xwW|0HFgU3#(A3ft^6ds19v}E98)x_nT)XLp+pe~l0Q~zxwlU$7K}zpZ?H+8F z^0@0=5uSjHF=G$+Ch+tBn9nEX^AWf2oF{MU_jaSDC+n}i(wcu2zQ6SGx)qy7K6T8E MgPziqT@SXC-z6#1Pyhe` diff --git a/test/brain_observatory/behavior/__pycache__/test_prior_exposure_count_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_prior_exposure_count_processing.cpython-37.pyc deleted file mode 100644 index 9afde5e36707fb424b36a6c1987f160e8d847f10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2859 zcmbuBPmkL~6u|v2j+4!9v&~Wpv|!W&_&}<*5&~2ewu@RSL5kS+fE8(&cqWN=9owCm zY@5~Y0kzj&5F9`~6mja6kK-$+{R*6TZ=9srZMG6%%WuXrZ=Pq~{N_F1TwSdjaHW6z zNSiB$@fW_#E(<DOz#~yGgPDmDn!2<?8%is2MwPHKazl4i4XdWXZ00;MLXTCL3uTQ} znFnQ^ncGHCI|3_4C$Ni41FlFe;!F_!D9_|ra7k1~B$qPIQlcg~FZ@%K;t?HiP*taD zWTRNykr93nFB={Yo-KIfPau@BV=}xgc<e!iIn%qM>o9$ox&w9ZnGL!Y^p<TkXsff8 zrxt5GwGPpa?o;-T17l#stVLTmu5GHyfx%Xvnuiu>xzDQy=7IIQ1#YvzJ!|`0_qbHj zPct#1iQnTxx(6=usq`Q6B*8MGlKT&bTyTHtD<6I3$I{npP6vg#*(uDM!h}U0X@Q$~ zgbo15H;#GO8)ak3Nz95Cql%NPPiXXD9Lre2E*v>9rfAKkG2fh+1!m!-bi|>o#3|#C zpklFp;1yQRirSY{(OUxg3wN7~n9IUS^TJMPDsV1ERlzc2m}-kk$%O*Ts73gLF--zn ztfP_#VDLzBR(M%Y(KzMog(2R7uD^fT`mB2&#>g%mQr7O#hcumZH&YsADWliAJl&Js zEa$0=KxX-HBD-J5y)G<^f0WZ`7x;m(Ndg*d_cG4ra!<e~NY(?hdsJm&a(T9H-G2gB z5@q8Q3C<!UHXXF{NpT4com4ylH6As&0m85xvjKP0ykMRM*)Z#-xCrgbk^LEZ0GSe4 zIAaVkb*Fb#*WskG8gmiPDYA$#wyi*01F*B$+7wwE;Z)8J;Ehs4tJ{|7o5}@f&rG4M zKKJI(HUZl8{rmq1+B8!>P3t~f`d9<iN)sKn?tQm;r*o%sn_MBfOOnmv{M~QA`hJ^S zowtx25Q_JBX!o-$Y?j^E=H0>tzv-hOs#wDiAZj3hGTaIQ0nZQ(6ssuKKm?{ZQx?s# zKpZ<kO`L^Nv_KS<I|#kNeH3q?IEMm{n0OP#c@R^M#ar0$HVS076c?aY_^0494{vBi zqGiK&Ovm)5v~0|1@u6o<O9ftVVO#LXKS3;|r3yqKEhQHa#-`+GQjn5ojt*Zla_Z2w ziqydVm%*;21jz$CuhBJc8?4FJpBQZYv2|!2SdWcETR8{Dfz8f>E&NX9xeF{gIsmqS zrH%a;r?8YV?X6?+ub)skBoONLIqcD1oWyFPQA#;y(pMRTP(R7CUC#V*?)M>-4na+g zDTcRM0B!qs(`4db@w2|KhI~;)8=FQ<2_4d(XO<ajFX0sLg4e@ViQpBo@TFPf)n$#> z78{qLs>wXU{SBO#(1t6p96Er|1L3<Q_*Ho4biiO^p34ziuJd?^$<KoPY%?4D@9ckk z3X}6?x34EzL=$<V{Y@6_-r_16Zsu`>w(-Iev&J?&5|2*|{|wBEO(^YW`Wv0_-140p z{PrteFFuEpgCv(H@_nq~$qB5&kv!>#jfI8FlZWae{xi%XH<1ee6mp8WNI|~%6zoV0 z35I2vuDO5jzb&`@+K+Ssr|<~D{76VqCuEedaf0;*A(-LH9&rh#u`qod9dux5EV}j+ zoHDxAGsOo`1Xh_IYkl-Rp?Ta1sxL#6cn_`Wz=Zp-5RNK(Tp5ngkoXYAzX?op2ymoC z+6@N-6W+5_*2LgstyNuU5dmlfD`6!akMfBQl%bnbNYPSHIQ(Ijg4?fT-}Y<|=M_x0 zJMcq5A{q^OThU&^WqYjRq<#EHav>}0-;FXZYj0qF6+Q}_+EV9x*URm?fxk`?bA)Gl L)`sh?dCh+St}_6E diff --git a/test/brain_observatory/behavior/__pycache__/test_rewards_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_rewards_processing.cpython-37.pyc deleted file mode 100644 index 180fa95ba5e5059938a7d74ffba4b74efa5d039e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 998 zcmZWo&1(}u6rY*hO}6={Z5s7I5EnE>1O=%!w$hXKqF#o;GTE7Kw%spxCaHlG6g_wm z^qxaYy%hXwycG88X^)-+5%kR_sRiF--hAwPzxR7@X1AKn8Ul$=-?Fxa(09FA2!TZx zhP(-eBaTBvaXAxez)V6jvZ#d-H@Nv8(F(`Ukz*C$jdmTJ*L|VfOdPU|OHUtaF<|JF z+c4x549A>k03UM;w8E=XgWFTWm&%hGuP;t~RC+Wn_C|oU9wCK}F>mr^pYSVu1+2wu zU{|Nc2|mKSrO3X)*ObZIA4wY>f!Boas~d=~z<g~3;`goN$^@(G1Wm|0azdae1jSt6 z&8<L*NK(5m25b~08C_CYz(O}ne8=#|#f>}m*U6^;C4E>s|M{s~+=rTW3g{(r3~G5y zc>`K!LzT>1LF?Xt#lCP=5DACS>byg=F~dz+#v%#Ozt4Vrd)9xm>7Snhw*9$VYys$t zq5`%s!Td{p;R>f9x4Qmp(djxyUKu6fFcP$;6H3LRRMLhfG)pXa@du>f5aM8JaWzgw zrtveK$+2^ia=P?{DYgU5L{8$Ann^5VZtaB$Q?#l8Hi&)NVp57sxqI5r6|aUY%=9Ay z5+;ZE+!n7>;VA)lGcqETXDC|*pI;xgAM{>Axa_e3<DEV`WbwH7IA&fFb9T2U;*snn zsfeWqHc1C#*?SuFdlK&FcFMd1<_m}oL-61S>zdPgKVw1cCVhY%F(`PvzPQEm`{HrB zX_k0GN~ocej`I~A>t1@iRp3|t1c(p}N=#zn+T6kpw@njQK$l4i+o0K+uDVJqDFf~@ zYrvLT@i0oqSyQj?EqHeRqu5zc?93m=C3a;uOYpL1mrM&#b9*C7_%IZYFzlqhJs?9G F#$RlP8t(uA diff --git a/test/brain_observatory/behavior/__pycache__/test_session_metrics.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_session_metrics.cpython-37.pyc deleted file mode 100644 index 549b6fe61362492756cabd6d2962d65d77519591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1354 zcma)5OK%e~5VpOKByEzG&=%;a0xm1{ao~m!r4)KVs29q`iWE6(*WG5byRzNVRJrgv z@&iB|T5;kp?Fk7X(Z9fnv6Hmraj32FjAzE4nQ!dJjm8v$k$rj1epC?pZa0(B1mO{o zPBB6pahxJ*IZ1J!P!ErEJ`J2Lq!oeot0y(?iQr_4`!EBTp$vG1SAk%HT>DH;F}L<W z5<b1_U(H)$UcZ{JM7(h|Pu`SRRQ4eU>7Nol!)M>2x0u$)bzF0qwJukZV95RYF1cj! zrRTJB=h{GGr<tE<ByxK++4GPuNHWpM0Ak<ZH(l%o$1hNH>&*6GJHq9R7Fs8H*69nQ zl2{){z*wr6m$)z@Hk~+6mzSKbV+Mr)gE%U{AUGv5r$Nk2yhkgnn=8=mY(=D;x^OSU z(KX74c+v(%=;!)a__i)TeYE3jod$xbbP!uNJ1h@?Hi7hASPVMBLo~!ga_Skf?+rbU zIr%_(L@yct4dw{S^0s#(Ov8+2oxB$XWo29xZ789OJkz4nO_(mjVqk<eG-O4g@}si3 zp|wy3V0fxjt|Gq-M<~##3l!+|MOnJ6PEh!Ylzrj9-f!M-zl2+Ko9!{a+GVd;HfV2T zEY35|?zKgBsM~oVG9AO37kdNUex7vOIx%9UU~!L00cX<`Ja})-=C{^WEP+zGaP1*8 zxf-l>#U49Ma^>uuzk0V?49b>0*!iPe_;yG;U~kv4s>AMhc2wR)FO>)CGwXEbB>0es z`dKdXn1E=9<<{m}vH-%UC8v0Zp$RQR#!bN6k*93$=zMn2hxe12B$FaDol#I_^NEP6 z0#h}+So}uIG)U#5E8)LqSHP}aLW^n^<fy4aVD!!ex7B|jTb)3r?72~5VZop$x+Dds z0R#fvNLG}7pQ#?5E|_BO;T#KEd%_Icvis75XXVgykuN3f(s!9xAM|s6kcx*EKK%@q oDz4)yu6iLR-Yjlmf<x?&CI4I^=aP@-YSwoFG%cVeP~BO714xfwaR2}S diff --git a/test/brain_observatory/behavior/__pycache__/test_stimulus_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_stimulus_processing.cpython-37.pyc deleted file mode 100644 index e69f74d15664cc1019fc0dea6e1156c9590b79e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9487 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 K!f3(d`@aDI4j1qM diff --git a/test/brain_observatory/behavior/__pycache__/test_sync_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_sync_processing.cpython-37.pyc deleted file mode 100644 index 2f9d94c952f3e7fd2ac9d6ee51aca43b69625876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3144 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 ADF6Tf diff --git a/test/brain_observatory/behavior/__pycache__/test_trial_masks.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_trial_masks.cpython-37.pyc deleted file mode 100644 index bbd2dde7951ed9335d7ed4e054236ebf0109b0a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2144 zcmb7FOK;;g5GJXIWjjus-K^J1z3KLWq6XTeKyO9SZg-2Eid?qsK`<cDA|or7C6$zu zb&$)Vz2+bE;Gn1ehXVZ{y7rXYo_p$$viwTAO(}>R4rhil-^@tQ8;u%*5&!m@wl)#^ zOKr*ld-M!m`3FIWA%-L5s+B}|L|g+GJkz!GneA3MI(4R1W^ij-V<tQnJa%BQ3UlCv z2k7dr<Ql89fN<-yUhtI!oYh$Uik#d>-wv?WcEGZFl;wMC2WaKy|E0?|)^1+&J3s+i zj}bUC-vaBJum;=w1^tZOjeFs>bthg<V1iA=nrxdr0Q%vTabg4*tnaW#+InMVz4hPO zSV3bE59DWBTg0QJ=8=$qz+I17Ti>-gyK7h9wa4CJ9rlFn2WE&N*Y7Ud2VeJ=vb-+a z(Xu+Dkkhxz?$2dGejyte;Mr65p7v~u;g_iU{*9{X<1WtYnFwj*ji?;Tizj*`KY3a( zvq{Qf!(XM`&p2~QkhqplGk@S#Xg?9a`~Ij)^4dZ?w;9hsS{Ps-%$qSCao6HhL=#`} z)KIGh?+bY4K1>-p#it}QrsgHOgq&Rxh8eli9R=PR$4AOjf582r$COuHD<>(-D;bwr z7zg=7DkT@02UEzU$A22rD7SP_WrRAIu94eCjG_+r=1v*g??|Zb{`>WdFM2<K71^T$ z$`1PUoW_&hH!<~-n9<LBJU)}XB;~R6VNTM)ME1T5`#l+E{L_^BLmF_<jUtd>!$alY zVPDWN_L4rBJ)>D7CWn1Kpl4ws^to4{r=2}WCwWsT&6wKhih{|634Lf|(S)^2G`@Ky zjQwcL_zirI(2auiM#;gkf;YFqnDJLDu-m}buzv)^3heMX+eN!2{Dc{E_|0Rn4bqSU zq13yUP#y_KO;t6iFQ&$`Ylw}K77axyP>X2`sQlyg*u3*Z45fD-W&=--0ip<sCrskc zKw7HXP{YPMShRq;XcnnkRHU!sRzt1xit4~-IkanhiEr1_TVipyA=|31csxsl1W0vc zcLmkbLETb$4sH}_YeL!{!|tM829ON|mxDzhd0p^xDwro|#sd)5V@ACBy5u~Y5l%_G z`Sb4V?t#97V7k&&*F^oIprP>bza+5@db1?DcH!imc`Ryl$>$$IQR-|w61&Ps)3wuy z0>=HI?1qC|jc`ylf>5fujzEn<r%7F7t`(0*&=Mq0b8|$+(5<Ibz!wE@yx?y2Tbj`$ zwRi28y7P5+=wi`;Ygd+PP*<ZaMCZ#<!p0H*3M<D?U~=#VcCcgEm>5m`0Nc2&S97+K frM(T3Hty6GvQ4}{-?hPpgF97qx`PRBEzSP`oQd#v diff --git a/test/brain_observatory/behavior/__pycache__/test_trials_processing.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_trials_processing.cpython-37.pyc deleted file mode 100644 index 6175ce08b3cef0d6353705f39b69de1c36ecb8b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19852 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 S<PCsod5}t;=pPXsBL6QPX?=45 diff --git a/test/brain_observatory/behavior/__pycache__/test_write_behavior_nwb.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_write_behavior_nwb.cpython-37.pyc deleted file mode 100644 index 6f0ce83b2b6ef47ddd1c78c559905aefce60867d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3397 zcmeHJJ&)W(7#@2+?`{)803o1Y5E9Z#hf`32qJ$8LgoI8&4h5}FvS#h^?&Q24Yi7Kg zJtYN@f+k8$mxziV!Ec~<OT}NH;(5orzRMjE9R<QGkG*5R&%7Vw=XpQ5bZM92D1QD< z{4`?hclxtELfm|e(_X`nvNXuqgsx#8EW$|`G;^Iv2XmdgyXZ}NnCqs!M{Lqh`{@AJ zK^oj)<KZ7bU<c!%?tUrU9M>x=qnwPVaxRuio48m_6MAQR?BM1WPWv7P$DRf*d=@;p z5-`_EgEUM#kFow;`1BR~nth8aR_TggJB;n}&2czamS<IwIHe1Ydnc_^#f-bT<e5-8 zPjrzg|5Rsw_M%fQ+CsXyP9uH@<AqQ~i!5^G*8GJ4yfNfDNh)JoH~<Ll%$iSgogD9T zQKTGm<XR%E#Eo#6<nn$Z%WVKgC@WKX$w&m$f^CCrT-m@hmJL34nkRFa9CMWcb<Im* zoDw<Ll`AXP0?GTzI=k^E<5qJc3$fU^lc^kcnxkYA-bd0HZMdznOx@>GnQ0?iByx3| z>(WTnxU%^g$tWlo1knZ-?Y2g~VpJunmiKoH;d8R`ar?|X?>|qqw7k&g0*UzNlu^Q> zl&&O4{qvl!MB&;vDC63wnJSQu)~VJdBVA?4Un-DTYK4*CMj{ThyR9os`YfCcLUUQz z3KjC6VpYT}4OMM}-`1QjMP6a~j2|E;6m%&pD%`G)lzKZWtwq}6R5-zfnN^fW+KVt* zQAmlX5TW3Q>r#H^%YtMTEzZS#jlHLkGgQ-7Q=1r7A|(X36h?_@E+c*yfQVvShZc;& z+UIg9DY?3u&5`+Y8w!Co8>!9tOg8u}%BiQ#u8#bZgPM)QdUQ74dIWBWY44Rp9o@QL zu4#|deQ#*%ofgV;Ko-9+LzL!+KYzUS(a|?n8ha$>B8{d3wO=3IEChY};)5euEbWml zQLqG~F6V1|^o5!pS&-BFrAUs&Ou{zL@kV-lmDasF#kxhTr+{4wr_K86mc{(@_+ql7 za$Ubowtw?1F0>Dh2+s~NuvbPwh@Sx+vm~Gy926Oabql9`gu$@~?1vx?-eL~}$6W9r zz`yWy%smaCG4OCF?LJ};L)W<nMt%^c{m0>xPr;wPr+qg7mqxfBrh|>;kodI4+3`3# z&zQ~K?)L$BcF^$b>0LSi<L-*zy8koombm|`j4RH6-ChWYbK9@kfA9Yy-|q8i1%1q+ zP>rrNddUm9YJKuvu9Ta53VmL!8h-jOvi70o4cDG(@j0>dc>(eJ9PE2pRErYgoERw_ zsR;FGTu<-GgnE!uIZ8l;O){OXlKG~!Ih#dN5HH}qG$3qL$2Tlo+sMd;M(40;h~Po0 zNwnt>`HhyH>1hg?K=cH4NU~8k63~m>x`p%G0R0{m6BOTW0v{xG5lyG#WxVmja^*H% z3pZ6!kQd(UWR!_xNgZi~^JFhlMQQZRz@3(kiI(ZSLv#!ZL@NwB3=X{NpuG*V@>GS) z9$u&~FVN`4+Q!ZDH^`DYY!;k+_#$nf-RspMx`s9pIlUe|k8-lp=5-uQMpmUVmRW|v z*@JOtdVn{53@80&|Bv?!tyy=hGj-2bvF;LN-SfpV1F|3)G9*Y|Q0sp4wbYkyqB%j| zs0-g>j60LQTa>9Xlf7-mV#Ix!3|k3qf`8{9BYYQD_6i2}#wd6-9Clv{8XX+<%xjn( z56#QC)C1}Qay9jFcy}i^w)z}hkmhJB&C$i36U8w#@^S2=^m6N0I^(;K!dGv2ZK2aD Tm)EK4mga}>Zy1ic!#Do|;yfB9 diff --git a/test/brain_observatory/behavior/__pycache__/test_write_nwb_behavior_ophys.cpython-37.pyc b/test/brain_observatory/behavior/__pycache__/test_write_nwb_behavior_ophys.cpython-37.pyc deleted file mode 100644 index cbada29cc4056f8203b99740fc9306ea4762179c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 zcmeHKO^@6}5Vbv@yE_RVS^)wMeL-QQ#fgN(0j&Zd5D5vbfGi3cjb!!M?U~Mc+*Wsc zCbQZcfQVbjUr5A>Uxef<r~Cy@ylT&QHVZ*;;Q)B$wx{i`u6k8|ulA!$mv%iI`H$c5 zYnMFl7y7X|0^EFv(;Q+*yu{DE5nY4Kp9iDBujg8$7Uo)6d)^s!FxO5x54=$~=_Wl~ zdx?MB8}^^Vf_F6ZtM=#I&TxHgsihUsM9la?Djlg}wlYz^oW%6z=Gei_O`PU!4Ay(> z+u(`+Xy5m2EAf*cX(jE4E#JEX-@fp^^uERwyLI@_EzjF!>*IJP4NJ>Bwo>H`_f{Ay z^C`14!BQ?W7OOmw?x{*?wpsc-C)r%snMy)-3=?xM^Ts~Uq+PMUXNIXbF12AW!<p49 zHpx_ca=>_=(A;^4Vr~Q`xWz*z?!}_m1f{t&BB7VHpddE^*ACTY)+?Iu+&;`I7SBX{ z!ek1oD^_rACC`{DZBbgRk;a;}Hz_lUX_51J?M7oNl^JFfLplYb2!+;4GgGFiyvHUY zRq%>j+~8hlfxMR{TQw%;BBx*wL=#xJ+dOqyq|8xp&fkqGhsn~#?U1?Pf1-q8xw4HV z7f{GPC1lAKLAn$SHIZd($#dJp0Wg`;aw>Dc(Kyu@(!!RS{G~+kg_0QAEdX((>@8Jd z(xGrZ2*pHhN?_qU#jc21Xv*5!ev^B);8}_7Q+5PQDCmM4WVqQKkh*n77z5a%gj>$I zo|c3oRVJ1!DWsT}h>)}6RUtlcX#rSyW9PXwZnXq*$f+qOCf2e5Fl2PWwd9jbgzOH? z>h0HZE-Ty~FtHE>u_~uC;Qzd`YLK6bZHnAJTYu}?4xP(Km3KUBRfF?kR|617L?u{& zU8<MNi7X<q5|PzBK0%!f+f}z%QT0?^XUtSPjd|Syx%}kmJzU)I>kl{IAAe<pHe){H zNjTxCiq-f=&WR}ayJL|r%vcpjWsK2L*Z4Cz85>aAI|a7nQ-QTvhBuOvtF-Uc3HHq+ zHG$a$w@R<BZn)1qkLol~9Gm%?6T@Ovy+sz*Z#?^y7&FS1i=F&8j?MQ6e&GHzDBX*F z40KSO^!z4H^F0RZoq6B+iT{Ro-?yIi&wTs}Ud7zw;E4w=2fse>?gzGY7p#63B;AL> zqg!C#&f~7_fr+o-zMu5gEBna~v2kN**IC+m;+fp;e(Qs!do@dM?~)$)dXGPC|IgQJ zf%;GJHNVITPDY5a8+!Vu+4_J@AbLE5&ef_|t1ZjLvhm4zxs-P12>4m8tL5_F%lXHO zfvG9*2967Y>(GI0I3y07w90vrtyruDx1>bW12Q$aD`M(nwvrZuGHXb!D&yIv%le}x zz$FN5j~uzChba?kF<0n5>fVfmD^Vo;GYG(159PM5auGu~Idxm2R!9=z3t|X%-I#O5 zfVK*%3o&S7cR^AovhJ3s6{!6{KWCfHr_6Km!Yw-;r2Iq>bB8!j_d=N$T1_?FX{eeg zo6g%r)gVW-+8|2*$mtW>=O8V%dZh<=p}IUr(-<ie)!TneE2)F`{L>HqTtBFioq~ji zXgq=J_3&9+r#lV0Lw__dG7*tTQ>4!vL5y_=yXY<rJq)Ma`imIuY1+SP8LO*~%V^am z!&S#6PWNdAwfLG;$;oilt-qh@@(naQ=tEWRT9#pJ)V1>>k$SYZK`#OZFVMn9xN9J; z{KaUmV6EB5;JrTZ_k(`>MZea~uHWzIS1>>9>z8q<del~Aa^m7~ZjavEsC)Q3VGlPF v9X6UCMiKp&5JfIXr^;@FbFRA}Tq662bCr~txK0J&1ikMMf_`hz?!WmP_p&~s diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 298591968bc8ac0b44da19b1c81fe84e66f86075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmYLDI|>3Z5Y2*x2p+`3-NH^p{Ip^tc7ZTS1~<AUA&DzndIRrZ<&|tbf}NGKh5F#V zc{98jX3_8W7{T5y(53opn=djlGh*zJXtrU4Y<*{;9slKhU5@!SVu&0{(7A*&*oMz7 zC}%Z{INCaL=g~$*>U`NmzA}<WlW^!k9bkvFTUC_MhazE2g$!V<aFWi}kX&dAi6zv= jg`W{VxIL;Q6sQslA&fOih}<`i?&Rq7slsXd>5Ird|E)$U diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 517d612d242d5b2124debf6cdaf50e567adc489f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3644 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 diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_cloud_api.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_cloud_api.cpython-37.pyc deleted file mode 100644 index 772fd3dd0418c0485be08fc924802138c3055d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6298 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 Q`^=o@={JD`W2jaC2`WZViU0rr diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_lims_api.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_behavior_project_lims_api.cpython-37.pyc deleted file mode 100644 index ffb3d6bfe6471e5f433f1d890634857a731987c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4087 zcmeHK&2!sC6xT|!qd1AvmNcZHX;oTq-8wE!I01pWB@KntZj*L8)nrB^YZXO}EV;W% z+IZXpq%)j2b7R_Jh8g}5j@-ED2&ddQbK<>~<*$Seg&9sL@oGQbd%OF7?@QMwCUO!y z!S`QU-{vLhHyotTD0HsDkN*k{l_>Eg1K+Yw8nPi1>?^*~Pz{wxD-u;{=D9>O`?8U7 zq(@nrr6bR!ePWEjNP96#H9AUjbc~L>3Z0<&O_fg4WAwNy(-ZU!7){ZWE}_%(P3X_K z>PwlPqO(Fmt|Q?sN*tA*-Y1(foug-58AfMu<jO#;({qA)jJ{3JKbMU04%Y?x4$!?T zxC+p_*ySkFOM+v9l69$g`2g-IRf{B^zV2*UyI#odu<(&%N2^|gSDGHI%sklgB8N9E z+gXp8*K9fz-+^l*Z~Dm4xduO8g2s^yLM20{gvxL#g(_5qH)xAy;hmu)RD*Yxj=~vo z@#O8$-oCrzu)XEL^#aExAOjy1iv2I($5m*k1PrA5qg0e*l{@}soZWt6F_*IptcvE3 zA8vfGai2SkZ&+IvE!V9lR<O5G2`oDdsI|D^1iO4AY&rqAp$(f`dwgTnt8Z|)<viSS z+j1S?^?jhA+gIS~(Um&0yub|WAa>V^Lbi9M-ceV#V>T1TnYLwbIfBhhiMne(Xw|fu zUb(p!Yo_T1USyhRbR4fLk=D$RD#|I5EeL=n)yWOyLY=e`NKzG-FUl+nQ*q`oYO|*l zrr~TBGzQR)BWGv7>EZnnlGoaep+61prENNqy#-pF?Az_o?NXxG+RxCOfHp%fh=w=K z@`yQB<3!(<hc75ds>KlmAg~&aX~sFzY=m^j$Nso!KHjnXWQ8F%Yz!OJ8k@kTYidak zRm%_v>~L%}qAB<%W(T|k$pmnC#7K(Be)qSp2p9oDghsF)wNpHch#l>$)4(W9LXvZY z9fwg%w?n_QYxy2EeUC>auy}?BTymZ^!4w?Y%7nb^(F1g|1KjyQfhNv8_-uJ?xiu|b zx**YSRrQNkOADpNqM>+np`{e80yOnPtW>I>wx*!bVP4R|QVCWB<)RA`;racOSgx(L zCTnXzwwQ=3zgH}(DDM3#I|($gWTSfV!8aPS(AO+<+Dcn}A+^Ea+wx0gTjtXd`3mAp zM{mZQS>N$|3SK4dY9^)}GQbm@A<kDgxNqcz!7^hZD`sK^lw;(2+KIJPJ+YSRN2sw6 z2;oTQFetoox6^Q5j;EJKWug)`2ffx@Hy&_@b2y0UQQkx1>zv;AtS_%F-?*o5hRlMP z=mP1$^3Ao{ZGBiCA0SDv>l2{gTGy+!dwTW$>goXHhXbQlrr^=51@T%aw7wfy{4bA{ z7*t|Uc%l-VYoSmaJgtrPiVyl$*T00l$j=n86$NePB{^&_1=DpRvrj+V++<;+7qvSm zu~Q%!taNHv-3T8;q=k{hS_3>2qx-PATo&f?_cpr(;u6D|Qc0GuvoP-FL%bgPsBno3 z(21Z#*(c9PTY4t9<rn0olw27ut4DIjIpk{Vmm@G7m_ozj5oW$JMn2u*dTOK5UehTZ zBCcc9&@1b&X`p(2&_+M6K~zaL)@x}GB`*PG85SaE*z$Yu7Zrx!8>a-2J#_FMW@OcU zrvqK$!~&@^zz}CGJAxQLjMH2fr=w&ErHj&$$Rk;BYK^dSAgwjwL(S54<5*)(Gh`9O z*`Fb(&d=-cUw6QVb+CX4Tv<;EbY#@g=5!hcA>&9oKR=-Bj=xpb)+!Ip%F2p<(G>_4 zQTM4Jh<9)TopvA*!iLo*0!C+>!BDcgeDj_zfJl}>n?Z=EbDg?~3U$k=$R*rk;D9~u z9-H8DfpQ60)9K*@9cDC>P2C7LbtB~OW5>l|8A*r(QZ(A7LaL9#zzJ8@YWMHx*B=V~ z46G#JKsE7qp@EW>dAk7ZPk#Yzviz@sO~m{UYXWPcjeid6D?vFre_*U=ck;(0$RCt^ zgBfI|TXD$v(WIi^6=maerxw6rl0y=INviN9eX#Q&vX?E4kw(3FRI<?fYKtS~-32*G zl{X881!jR_-pDrhkk6>4-!0`spDg7xsC7Ht&l2&;Qcgc$AcOHTwIa)e&p}K##-*-Q zak!nx^S#J}Tw(9<2r{M}Hky{GE4hfsqIxw(Hod3O4s(+1s5UINZHysZ!-4O|mLrNH zk>Ere6<6sC$)d~_<(BqQQk{PcPABmNXf%18jH~&4KAR;nIY#nioE#g)KKx~}kT~Vc NR8Gs|j0*GW=$|#N88rX^ diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_experiments_table_utils.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_experiments_table_utils.cpython-37.pyc deleted file mode 100644 index 996f8c9877125f6fcced1d012ea454cbb12d29ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2955 zcmcguO>Y}T7~Yxvb{Z4<0ck1F7F1!RI;s#C6jg+loKP+WgjQBpW6vbnWWShMn>ca~ z5Do|=)HAA3EPCNT@C!Kb1NO?v62E{G@4IW8q}i2fB)ZZ(^ZCxav-7;q%ty=14Gq5d zm#^9JWlj4NE3=P6;X_CYfoq(Enpft;qfn=z9vPkynVuP0o<%gSbK_ghv$@GF$Q^ET z2XdE_hg!>>z%1HUOV8h7ocrP+6*3TUPxzr2h|tfHX<H=X%+FXi6#2V2GG$5y1L1Fn zYzIdr>F!XSAA1wW1`*p4z7jCO`RRJ-0DcxE6ViQ1Y7e%#qa9%)oN$Vpc%mQCk#?eG z<b;msn2ZT*&Kyy0t!pFlOgqJGE@)$Omp2x)altcEW3yD_n+~4U*<7fxarpAWHcjx& zuJP@qnsrvdH@cwB%ix>4pv^_zthK562bq3ijI=R1(u)$D|B;cIBmI~h0iIYRb4(sn zxt`hIkjxqBd+ssjCg%J4W2!#Ko{<S74IHVqvCcIJgG*bI0PQ9P7*K+MpaIXDN&wB1 z*pK^BS4i)ADuYBK%@fs^LLs5&?Dm{Z76oCzq_^^HAWblACrIy!4iNkWY(KQO5{R)I zcXMMaiNyp1U}6ItI%UVbyAuc7Tm)2vRwK7qnu?g`MlVT+xx<A>ixN$F?ml1{+mtL4 z5|_&@@nxTdDsOHmC1eKs_*lwB=6WdN-0me|KZ;e$${RtP_A{S@b-s+A_cFoDstJw# zD0ikKw)3Tb`?qs9>1T!I_OF_}2}}O{^!^8(&tNgtVY`gCyX-3#4?7z%>m@N~?{!2x zP@M#JpulTUh(_m=pxaSFChnxHw+~7Iwjp?^`2JcZRJPWYEQtN23)2o*mdN2+SM0I@ z9K^ifr!v_CxBVXL?TW(elor7;p>X;AEC^K_e%n=?*RK-1CD?@e4nU&@F(@UJIAjIW z3oSQDqgeMEk#B)7)f)LTu=T7)KA{x~X+Wf#6$)vAHs}jkfYR1jI5lgy5aZQr)LAr8 z>lgCMUUVN-Is*D(7OFtx7nue6Vb68NEOdp)v}ixCD@1*dJ)kSo8Prc$FLY(8)D?*l z+@cbLTVhCm>e<r^RH7zG4DL;d<ddiZt%kga<x2?g0MO(WgjWz=MOZ~ZA(2-Rt^u?x z`5Kn5BfO6A2Ev;NHxMvBOSlE4{K`BAPG9AZpi4afDEZ%*a{u{r97%}<2;6-e=BeiH zAJFr^aJPn6m1l0iiRoh^f2=xj`Lz1H)o-UyTm3#iYqvaWZ?$|1y<c7o%0HOBm8Jyn zF3c{KY?z9i9C+^h3Mts&+0z*g^{usy=i>t2S^u32x941#ds6jO`vDeFNS-=!G)NO< zt4UUgybYtkb!4z-r3}Ph6(sf^&BVQZPS@KrU7r`u>Uz77an(j0Z<jYLK1<KYdvWuX rp;7!3l+S{Pg-54?pa_Q|5}frY;r&qD13lFghN43pdf9d!I(Pm7036M~ diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_from_s3.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/test_from_s3.cpython-37.pyc deleted file mode 100644 index 9fcef37603e779555233170ea0baa57180a980f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10172 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 Yb754CqHVcE?o964++|HY(a5d*24l?UH2?qr diff --git a/test/brain_observatory/behavior/behavior_project_cache/__pycache__/utils.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 329aed68bc0f610242587602c294197649f3215a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3481 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 diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 7df7b2eb70235d363c022d8a479015b1d64d9401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17392 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 diff --git a/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/test_behavior_project_cache.cpython-37.pyc b/test/brain_observatory/behavior/behavior_project_cache_data_model/__pycache__/test_behavior_project_cache.cpython-37.pyc deleted file mode 100644 index 5c04e63c4f48a35314a55d80bb289a38459ea75a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4714 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 NwHjN^t>$Z&{sly)=Uo5* diff --git a/test/brain_observatory/behavior/data_files/__pycache__/test_stimulus_file.cpython-37.pyc b/test/brain_observatory/behavior/data_files/__pycache__/test_stimulus_file.cpython-37.pyc deleted file mode 100644 index b782ed338f5f9e8d6134abd270df28a9cb23d713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2508 zcmb7FNpIUm6y^*U(Xu2v-r^)~n-tv?q;i|wf}m&`I6wf$aAF&62>}Gf8A+75bvSY& zgF3Xy)$Je1K}JvgOT6}^Q|~?Xy^$=(Ne?XnJ`87hGxIHv-&Lz+4W9V-pS`~pHSJIQ zIDZzP@h!aB7SS}OF%oJKaR|XS4QZr1x@zm8;TX_ogl1$p)~v7Ol%UTH?P$SSP<>Wd zjuxFo)h>mVsOnUS#!I~#CtT-CZF)^(_8Y<$SoyW_ia5(KcBQw%%50HUSe4b@(11XD zi7m4$Y=y0MjDQ5BLs_{)*xISi*4f5u4OXtsR$jfda<fg}U(K$y>024Dvl}YI+I;UV z_5tj=#Xh{W(?{&4nzzpM1Fe2*f|%7wVIB_BkVC`R_hfeu8cV+5p5(4KkV%$uAG%id zlT3C5&z=pq7(NYN1~K$j4rCAw!a?>pP#Lxk4xc<d+C4gOA3xdMai1OSJpa)>+<Cgc z`|xlF=39cxfrx#ITf<X=7a4m5Z{|Q?gi)q5<BdL|xz^Lhgqb-#qa%IxWw8=`89B*~ z8`{Xs%`s*68ToBxWJ!H&<a%zMQKEehd_U8kYd>hYnd@x|_g&bVfF!gD?mf{V)b)aR z1!)z;FYL4*y3CVaVYlHbu@~`^4aqa<X0sc**x!I@1%1(~n}wNr!ix&M!)0M4DUS;) z4g7w{3xf@!v|cJog8wvt6pk&U)J*|fXPxo3HwdR$-T9tX++_agT$z8KpQX5%fq4qj z{zDTt;0}NP`sjZ1DB~h)dR>n-THXsU9yTAwo}a|byVvCLan{7+Wj@3t?GCf%ZqRCG zf#hGNp5OO69M*<#=Zy8Y@ygpR;RUgqv>@%VClfK;Zt<>n93)~JAyP<WYU;b_42$(k zc)`?{KsaB5qh>V-8m*8TsZpC$$OaW3K##z|$!!cMhdLD%?5#p@*0V6^bY(bnqeO7m zPa;t2OM#LRSOWyuUz->Z>cp{wm<59S(np^0vEW6fmAv+$k!wvlA|uL()N=9)j5yLI z8Pi-pBOofHr{}a!vpdrGh2&&xo@qpzkAv7|<GVP{G!PZtD>lx-xeP|#D)dYWfoCWd z+9HYEUY5k54pdp~VFu{RAc=Q`NJL=`;xLH&b!!UAHCQAzAvjAxoDQT~>axI>Qzf9~ z6b;VWWxRdQ?{cQ3F%4U|{nq<RcIPL;8B=adTd$BZsp&RE@dfms+`gQCM(3TI7kB1a z2DfknHbL4ZHiWso@dL?G_~+12_=A}xpo&&M1uILM(^p{Up6(jb99ub<8!V1!mvSB0 zxG!yBgN_#z8y7RI+?vg3;tW~tE#`#jr({&ZY`scef<25=C<lrwbMFvJ5U3=RUhHGR zTm6@7V3h*i0P1>G;NgXd;bRDn-R9EoCNXy^(?aGRdm+?A<k*>V90pM)KEV~AV)zUL z%DS-HiHJPuT=f+5u8*E$ZUQH9Uj(vSx2M$K!4(($SE9u4yQ~G;k7MyU3_455304Nk zfovBhlo>Jn&!poK8;~g5fS{Q+tpM#{O9M?=qXw~c@fD1SWe6v0bL}X>xnE-qJXux8 z!h@)?br(D5wnM<?wBLn~bK9Zm7y*LxTpyD&4K2qg2tZj8sBTDoW-J~5L#h^I!4tP2 zOWl~7sU#ES2gQkkxo*B=n<-Fs(waKwU1+Y)?=&}(J4^ZmHp)=92uzvSMBKxzHwsG* z(;)5${CyN9JX9F81XdTZ4#BAo;y_~F2128h<5=ksdz|(2`q~I$$wlmi4KEFpu$;zx z?7gzvIG1PRqU=t!_Tc|5YFu)$(xX$Fc^L{4XkFn~7?CIX&Z7FWaqz$iS5;uD2E^el zAo1@bRCTc*L<t*&{2MI085VMs6Nrg|w4hZn4YFB5ajlV+C7UdhO|r6S6AR}21ACLI AGXMYp diff --git a/test/brain_observatory/behavior/data_files/__pycache__/test_sync_file.cpython-37.pyc b/test/brain_observatory/behavior/data_files/__pycache__/test_sync_file.cpython-37.pyc deleted file mode 100644 index 9cd97d3fb9f885ea472c98201758750217aa8358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3031 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 Y-DtYDOPA=%x=UB+8eMtKr8ao|4Iy|PdH?_b diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index d94248f416fb072183c9a9dd0a8873b5d7264727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmaJ=&2G~`5Z>`m>_Q6#MO+F(a3TkiL&XJE6%>R(LP3B~(aMsw@va*uj&1F38&cT^ z)CxGkD<tB?Yw#Gpa^e*@F`EWzabT?dW<5LeeY5NJ-p0lSf|h-K&%RrP{4g(n%*M$B z9O^a#Cmd2j&pc2NFtWJC?Nf3B)aLM-bex}<NBR*MhlYH_aG0Ss5k8U_IB@IKub?y) zc0V#n#@1G23%$|^pHOg%RCa04$$|hWZEoSaqhW4oyL3)~+Y9T<X62Ud+$qTdfb3&? zFUc$NmNc>)%(`B+%GTUnkjg7z)GECgO6xOJ{&_{|V?%DA-sDWPFdvLWq{D1F2xWel zaV?V~)Iw=>e5;vozKE%Dl8P?+8m2YKj#s;rF;8Ue7Bh^}wf_Fz)5lNlJ$q5xN@I8` z6D?{-3dX4)%Y0(=I&0KhanZ|7sVG(S+CPDCJZ17g)t;UdAxcpnOT&WcA@!H+VUknN z2$)IxZ?}cuM$0rz+fB|SQ<`Ow=s@ioPDAyL{QB_de(**KsRA}+ygOi1md%2P8H@6a zv+Y1+M=Hn*k*NqVFNQM}JWmFJ!VTUnSTtq_0&CM0Gx)e?4zf3pEXnYok@kq`T+Vs} zF=R(cE_;oRR1YO$Q_wADHN>8|A8iBzzIm*x(8l3g4z%s#JB`Z5hl`VU`cR7QPMSw7 zRlD6-UPOkDCC%-Z8wQpEI18*}puX{6E*DdjgFvkHEAkThjw4Nwwu+f)mwGGJ<>HdQ W0ZRpcXOi>7RP35RW=Vz{vVQ|Ri~<n= diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/lims_util.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/lims_util.cpython-37.pyc deleted file mode 100644 index ab6603aebebac716573f8027ed8c7c2653b04605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1064 zcmZuwO>Yx15VgIVG=#KBh$6W88U!0uBo3&m=oe6_tq?7jRgmSion)Kc_11P;rAj4G zD{<n$Z{WmV+AAmiLQjm7hW5~rJenPk=RME!ZY(Y~5m@o-8~;iW`r|+57C`V8mVE|J zB8fAU;}~NflZ@m+9ANYw$v}peNQM_A4rT2Cwd;SO9<_1xcz0*-fNgEC%}?7~+xv$* z>$_}k{Uhuw%Y+GC6iT>M7fcw%oi@Usn;Wp1p+A8@p%_aP6N%$M5*b_~zzPAYRyB6h z+#V|H&ddjumC8_&acgN$8|omP7Jce@MD!hG6c>YO`Z*N?C5D!s4wM@x)1+Vt&l9a_ zYN=7jqtqx#c_C@qqgGR^oTa0Za(csDc$VJ$tU_3uu<UDa4o$EG&KJQsnGmxwV?7~T z=mMV;8BWNsZdM$2MAm-b31Wdnes=qDvmATgIX6Rrp_4Zc;~@@U*@xizXo9{p&+!Bw zp`YX!M)BKEJS=#w+N2`U%L?bF29;BH^?mbA_p?>TcKLwIDB-8P7<bnT4tJ6KRaX@! zwyR53SOH#_gR$-Irb*YPPQ56(81lY?vsnfea@g?%JBi_G!E^#`PrQ8NPND|<B-N%P zx#O^N1p3-e1_H5>OS7mPUo}^=)H<Q_a_zpqjK5hOowesGMlj}4$#M`y%V;&zf@gLO zg88ZV!L>G)&E#t1_)!m-CBV|ZB&iCQ!l8CpE%cS+&KcupXFOC~mx-6J9aN!JS+A<k zkm8!3x4oH|xd+u%>o%JPWNZr@!Yv%)rJ#WcK3l$%`M!UdjCna2tD21ET8=Uww-`Gf z@$7nMfibBCV`d53-a?-$=P4Nfs{EJrL4$;Nnt}fD)43dx&_+dk<Ocqy>ZSeJRhR$o gr-f6d;911WbT$j$>@K*fu{vYA=AYgavxQs1KRKQsuK)l5 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/nwb_input_json.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/nwb_input_json.cpython-37.pyc deleted file mode 100644 index f3d253c61c3c186a343efe2443835e709f148cac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1129 zcmZuwOK%e~5Vm)nWRoVeAX)*va6-y~<WO-z6#{ywKq%rN1X@M1ylaPSy74ZylaeSo zp!A5uol`4L{3TyG@fSET-aII%Ud`B_XZ+31c>J`{s392g`)79SBlOdO^#F_>gXnvp zIN~@(p_{!F553UC=ooRIlQYE0!V7(l-=Jpc7x<!16I=3<nSSihdTjXa!j3>8<|y<y z=H3|!eL<F73mles37E>Z-Z_n)$$Vs<>rBRYMN@*g3UUOZzkxEy-~}Fd=l%tn;~D07 zAI&{OW*+zU(E@+nnfs=6UY_|Ecuw9y2CvX-^d8M1;%zi1rUIVCdBRTV5EZz*!j%;c zR=D~fuC4Ia%3ePN-Wj3+N039K6IPAThH_@ubh}t4E~C}}QVQ!@Xq{woX|Cvrj9dK& zVbv{YFG<DpP9*wloMeh>lMF}cNEiF9{3H$cuC`4ZTnv*>OFv)>c&}H0u=dw5t%|Xb zM!RrZ%VpuytSS#mY6Dt8N^Lo33OsE^37w^5VM&$?X^Bg~k~Cx7`r0U4qdbWXRU%i- zk|kQCJ?ryCg^f)Cz(ZNwv(=5~52SV=-0v?(54&%*P`b<djJG0o%H*W`M6x)OoE>z9 z9P6%&t7Fhv-k<31izMpm#EAPji%-}G0cX<`Jori5MQlfkC6Z<l(2kkO)TF(xSKHkN zSOy|Cx-Cy5THFbBDYf#6OFof_p|tE;>=r15ui*gXCg>eZa2+&!-gNhJi?-J1HofY4 z)=AN;j%|hpt}ie=5VZvuraDYT6_)C{gWI5XLA1LJ<W2Yf39~6*2ObIhtYkw0H&vr_ znDJ5S)^$ohj##?1s2f0HgIq!Fl$jLlmm<0wP(@hxK;84w1XO^7ZRK{FL<KO}N)8V? YO`@Vh3d>a_HaJ}V#Uq#aimC4Z0j_u{P5=M^ diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_cell_specimens.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_cell_specimens.cpython-37.pyc deleted file mode 100644 index 610e5b562f0fe8c05e7cf4889021a911280a6ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8247 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 G!T$idKw(_~ diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_licks.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_licks.cpython-37.pyc deleted file mode 100644 index 42d51f41748073442c1db22df3ea7bb3aa8f5856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6296 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 I_9t5D|67|O9smFU diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_motion_correction.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_motion_correction.cpython-37.pyc deleted file mode 100644 index 44e2c2455d0cdf681b21c2844887028f8124f49a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4386 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 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_ophys_timestamps.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_ophys_timestamps.cpython-37.pyc deleted file mode 100644 index e17e35f5cda08019b37792be3c5c24e4221d9970..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3945 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 U&OX8@)#a~j0E7m(h*`G&1wZcvcK`qY diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_projections.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_projections.cpython-37.pyc deleted file mode 100644 index 2f6e5e12104020aec0e58e42581b0778b584120a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3767 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 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_rewards.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_rewards.cpython-37.pyc deleted file mode 100644 index 05bd0fbb02fccff6bb319959792ac76fb8a4fcf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4058 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 diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_stimuli.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_stimuli.cpython-37.pyc deleted file mode 100644 index f8427281f611f75f71a468c228603a73936c3d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4180 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 bhQLOPwVk$&*IjwN(+`;U(qHqXzQ_Ixa$jJ) diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_task_parameters.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_task_parameters.cpython-37.pyc deleted file mode 100644 index 2fb89317b5b3110176b933a651c3a599ba02aebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2604 zcma)8TW=gS6drpnJ9|ykgce8(6(Gclb^|R>fFNx}d8t;=78Q*mjb_(QGn?6&t?f;k zXoCdlYeC`{B;tub!jG6&9uR+lC%)soG;LGCtbE4y93T5!zR!EJ*{nHu^51?;{s<lC zPa4c051kD({R4z>1k0R=-aKPN7BNPBH{(M$a&4bwUgTT7APVfe5>@c_vT#_9s#eF( zYQuU|xBVb%44YAtIbS=XBElz*2xargjanF2MGfQH5s#JxyXUm)f8z{Jx6R5>Bu1Ka zDAD)6Nz69hjeD3FXJdUk&1k-LKhZniBq|w7BbBCAchaH0FSY5Do%!RUvw@~RfRIka zgcEV;3MTjy=ZHm~^asJ9B3$9waVUJ8B`8<P(rr}?Pw(4jFhY-yRz<sorn?Y=O`O;< z%<v;NaF4wc=a5aX$C`7<jX&YSUBhm_EFZciIIc|G6L#o5Ky<%#?mFK)Cfsr+-p^#C zDje+Zb<;Qgy75_AH8@3#a3lw-1`fxgg~y$NF7kG*T<OW}WH&8Ttfkgzk;kb}<aHUw z@fLy=$7O(JGB;&KNnK>Svh<3P%uA0<lwMXOLXk&hC?Ahx-$>E+OShlt(iN#Hn~Oul zG-O*PH>2MjbskIp`SsSPo8M_<U^CfHM5mYRCHem5jXdcWxk#>W%6wOE(r&sBS&X*# z_2!+lx2aPjua1)bPV!J<ZI(ep?5xvP>phjEd0g~hb~iDF+FzghxK5$KmjO<xt#bTg zSVsG0T}v|_#r-VNdKrh*4G4z^yv0JaRd#Ustn7A9En8%oB1tH*nf?eJ;|!3e0Y^g> zJ>`eYcmtnu{gfT@3C#yPTwgJjpHOSarQ2<DMa5Eb(L<d!^{kR@cG{sL^HFsRwH9Y6 zVXF&t^$@|_<|R63KR&lkkz-}+hDMMKvi_A)g=)K{r)9RK-o!`s8VO3$R9v717i=zH zHn)b48ti~Dd91}6?BL3oA$rB~Zo5k5mII9_w^|$z3o*8(*NEds<0PAXsoR_YvfG7F zuhW5o(LUKMy<wtuq9r9CjZ;)<+)IYNqEMHhbIJ$n4LPDJ5KCy9q8GA8-OlteSUdrG z8)%xu9Qsq>N3KNDjst?d@E`IMJ{t$~@szHP7$~A5sz_t4tWZR{4{r83?9uZa3-mBS zwLu#ge(aurIiI>fv}b%1fE6moAy@$wBD^(+kZx+Im8$R;%uqjWyu=L61v9j4H3i)$ zOlC-rypOM4|D^3kD|6@zsrxD&Q9+coQ~>koRw`9=ZmytBqD)NOswms9V3noPAMNLR zy{H0riEtIUT)KI&S5`1jv|>3%(bb~rBnV?_g+!A?iv%TT$}CGSz_jhFi}+XuvsySu znyVzvs@ldBnN!{OpruLQVIJf7wcHk~@nyobWo?{!2Ic93@?xsv1$e|*B@`dfWgi8b z-@jc}RWZ(mLE!pSP4rM|sc&I_7oCZ#T65^fNb7(PJV+lDfNOHX)HMrzq#8uP552r) zaIMTW4!sF!a}Yz<gwKe9DY}-x5A?!4_>A4aUK*g{`3PZ8a@8h<^Jlve1*V9R7Heh7 z7@>tY%@ML^(N<T<$feV}EIbDpJvL({)fLili=H_JJ4+oa7W+yjBHmMAZ`$!1l&87y zJ<0*dgCi?7-r@&qGq`llSl0#Zy@j>vZ4#GBd`RLQ67NDp_1R6Q(gUf8cTXMX84FM? zkh&(Uhb(L@GevXl<!J%hvaO8p7a~i0wqhec9}h?Sssk<cJ_*`0>dbGT&P$h1XMXu~ zY~ZN&^^~(W{`aEUjn#Pp1=C!8xiCYK`p*N*ZP8s3k4>5>a^BLP_5G|smEq@8M*f2S V!Ds>+I1@j_40j@Wyx}dc{tIMYwBrB( diff --git a/test/brain_observatory/behavior/data_objects/__pycache__/test_trial_table.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/__pycache__/test_trial_table.cpython-37.pyc deleted file mode 100644 index 777002533a472719ca87ac98e32c5b0a54a87d63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6745 zcmc&(ON<;>6|G-aRe$C`j_r({H2DxZ*lqkt2yx=^KSDSY|AI|1s8rprW~OGUKY3MS zdpbQr#EyhOCJU5BLKZX0hU}0K5@N#wi3J<Bq{NCWA_Oe53Sz~%x4LV3#_eFQ=uy3T z_3FJ>@7;Uuz31IIJu*^I@N0hbBkzkx73EWU=>H5<PU4FGib5zt4V8xCC@R&pP;F?A z#&tc^8-`<W-3W7ziT6fmITqh-$HqMu<{Jg4&?q`Z?q`Oj#)vb*bt@cgj5%Xmx5M$q zgfqeQd^p*da;CUm2&WsnoLyWmhL1FMJG;4F3imYjI(xZ35<c3Pab{HI6-A7Su{(+w z^Ji}B&OSVkiwQhW+}51^c$ySbc$&h~W5T$iRHpxq9V!(yv4t1=anSHlH!gbd61Bb7 zj)PXy3+F0YQo4e-tKn*NJ_!B9zOvS=Qw`lF`){sdcoch$c7)d4g`mDdmHfFkR)coK zZ^n4AF8en<DX4vS-3#lhAwKIiTFoGCNmuxxw}w}Rt1|Gyt6q)gAAhaAv=-6ir@~;d z=}YvmF9eO~D!x{y_4j|7-p-=MR~%I+j^^t^71|x;w(1yuZrNP6gf0wzwna{ucN8Zt zihjW_?p1{SfhzK%a3|-Kga!GOl4<(NdD&|8cS*ahtG!Rs7jwAI;EL$0LhULpP=Zp8 zwOGHcE*l%UO=Vr}szRSp*0tE&uwuKb31bFp+Emx|IN#Mp?k<fi2nAm?=YqYTojM-; z{LM4RlYEQ?xKNMRDa0g~sM=l$Ap<jgsuYu{n!n`T2q3}8k0Pkd4MZ~4BC)ytt+p>A zyJn0=sbh(W?YaxtgzF||+mm>cSkjML;SE30+9D}R-xF>d>Vu;7D3-FsqiCjj?2C$# z==Cs4bP>p8BwL+}M+r+(K33#oxc%p6XI`9tJ@REV?=5+vTJvst&9(VcO|RZ+3h(H= z-@Fmcx7vO)s-xu9&R+;>^HC7{2isnK#ar|-HVn~2tQ?{b9jZw$Xu7Q$roG_-GHZwW zTR%h+!kcBRG2+fH%g2ogM%DIOQjGj~we8kJFN$Wcz=*b`Xr^jvqpGb<s-5yMT~`N& zWqQwJq=k$1zJN+s*-$o>d1GB&*VgrQBUYDzfn^<+A=JCtdM?g!i%G3QLyH+(-CWlc zI_f~ga=xo}wXWVZx|T5R=GN`5jlP8yEvm)Ew}53JBS)sFiJF|kH!GT)#Lcln7=tTn zc$JS}m#p0+?`L+GOGcue^``HpvPU#Su4J=GE+mU3EU<|tBiqfgl<aaB{diESj7n)@ z4M~0hCgRdU5>wQm;U+IplAw5%vPd;X(j@oImOxl!;3T7`A}E%8&N(StvXW1X$PX9f zQ#ABxD!xj^GgLf5#gkNgjfx2>2zF`lIBLmm#^${rqe-HDC=`8MHPq4GW#g{({%oyt zU?>>wGi3%00!0Rl%Xo;DScMbNmbDGN=LXanI0$wH2Hb#t7cKyb&cO*7cU3?L@LA6R z9&l9z2a#i#n0IsJ>;VF6F3FR@uFAR}b$0u=pgx#$U!de3s*4@+k|f$TJ9C!d;txN0 zdF}cy-<_@G24u?e%LH4o*-6N0tX=M+;t?vy$;k>8q(XTBMa7a;s*@z0iT>9aVD!y_ zFJzPN)X<*$i1Wy|FlR(dP}Fg?q!zU40p)ZKK8$LP%vDrgOI@S+@T0wu<7VTXLj|r` zU9sh(v9b&&oEk2hs2Us43mi9e1jkKva@;UjJ+=m(jK1kEP*BZv4okQi*^J8Ml**DU zQTn1Bx5_~i*4B&zguSv?-imXu>(orXg7x$kjHV3vPz$TzS-eg=ew}IrHCBeSsYa9r zx@EOwLkEmzyMeGiU%`-Q4+=#m10Z8a4WVClo*gRfp}wG^&Q(SzzBIiC#g~GM*e+H% z)|6cLja4t~y(zLAZus$1OUN?5j##utXh@8PCs&-Yp3ow<<~3@qmOO+$@(2~Ax&b_H z?TKq-`Em>eg`$Y0VymU%_>?`yt#veHKOMD`xS|(O4C4zaQ*d%Uo?r?~*x(Bma|8wa zt_XFPl5vvIt0{>&OB^P12gDOHcR*4mE<&@?jKcZ=(Ex0LjM|=C{CDHWpTB?Y-PuKL z;%|TY<oHLki@&@5m-kM8hL({_Z_obW7pQ!C@%P2={~8r_&!0CofB4~S#q3yTPQ7~M zV)bypa-?55+OHhzSDx#bub#W|TJ<oz!@jW9T0ubM0LeUoqPu&;3s-#*G)XaXhrzO@ zzK8ZScIth1si~cPJ7usfZVs9r;h0VD0xEs?$j(uNaltvlxWJiW6Alq>k~xwQTl@?L zbz3Dj3Ax$eO_1X@-XzB{=O9n&SQHVfOV43Lhw%<K3Kf;&P%pO|uOz8S?xn({f&&dZ zJsy}^S7P>{OU_U3r(#$HDy7^Z?JLkL;zI|ljQGa1+Sz{}sih+_k3|ciNXlY!P>C5x z<dss0B7&$J>ZbC}^Xo>}*Z}cF)X+C|Rf!FbEt)WygqYo&u=bD;?G+`u5L<7l*8spv z%4Owx3dH<eA1nlt(Tqi~O>YA>f%^)sh%8d50I@c=_|HqfeeCUjd_K#_fwb8dZP_RX z=Au|_G}cnO-=YZ^9%|=>d!!M=u(lr$sxO5toE)MP)qzQpNp?ru35&MH5wcY+-u>5a zHoo}duTH?9l0Xv+R3-LrfdWHSUJSB3g65R0kmeKJt3~o4Y88|Bk`(ck6@LvOuD+BK zkQ3am9^Xo|hS*^-$>hCT2+=<x=B6O9*?K`W!8$-g;dnbwK7a@^SdeGQU?K64o^;kV zfB|guo$G*wzJYUy(7PIe;nrz@LEkVom9xqZj?HUCG~yhr2o?p-O5D_9n<92<cL5fL ziV3J3i1Tl$ZydO$?0}0kw+$1dNyY?O459S43hJr>8+zxNg%%h~xu>NvpZ3cAQy@qm z#m5CN2s;z;k{6dnAj-{FT)x?oD~RDq;k)FSQf4?5SCSO*Cax4uT4(kFgz2VUa44+g zEG7enU#8n2oH7&@<Vn1fr>J1yyog$o!wIGlrQDZkFZ+<w)QOSQBTi(^yk>cpYEM!@ zQA?hqVu#J_y%$HlrFYOfB9f-4w$TTZrcSB_z^bIC@p~{jRqs1hhAi^Y<f_==%%idc zS*Ld*3l4{UF;K+5dsBU98qUW8qHG`v&PN?U&i@NTlGx60r^Jf*DPH%%^Wt#utTtC# zH=C{u7TF=*A2*H>wY|m=^i=XYK|?kyzlp*zalXYFJ}F&Z1xakAXy5WieQq}lIXmz& z%}U;}+Mm$=QqQvml>$Iws-34FXuoq<{ZU%(F)E&;;(02{RJ=sRc`Ck5#doOKS{B!s zo)Nphj*Fuq(KFk&N9}P*?R8w)k6?HbS43v@WdzN~S!sjQIl@}hHZ@_3Jg0b&%z^JI zCKl~(?%L_hSy9Z&m<aK|ZA^r+HN-@;9uv_rCIaFQUV;MwF%V{M#@s!u16pUYkbe-C zvBfQnlyiM4r(j9HPck8HtMpSBQ@#BSWnJWyv%Qjsp@R-tbj*iR>;?x=*XZrWvAtdz z$uSNeIeM(3J5&9<lJKLt3^*;A6as<VQLqsB(wXdc!0ARJM*!$na!Ibe*1TDBEXbX* zW|G#C=*`y6#6mkAPT^IVARNb=0jMxa2u&a2N;ld&|8+PYhY5QdO^FiD!>!e(K*Fbe z^?Y5&Ao`Jt>0&2Fu!J+}o$!#7QB|D#<Woqw;KT>_MJXA*InI5EGl7co$(+vS3X(9V z<6JKZqtl7<BId*D>E?_L<erdUia-@e{f-&8Tx^s(@wwTtIU7N390-hb_m`;i{=rGI z?cg|l3r9)c(Ob26hlG+TwsB6^-IRzq^s$dIS2T(O$qkJX8U{$lxYn8J17ygUxk}-G z7&SR3Nmk+%kut>L4x;Y(@-j6Kv+xUe@gA;-m@6#Ywk=6*mB&*MSd<|MgIb!9G~=~) z&|Kt`or9bt(u0v?E<T4bsb{SA6M@xxa)8x-4zS81BwR)50g=A$eB*&f_Oge3s&<}# z*kM)9pYcK5dHtaWL!=%pKiiC(wPX~W8HMx0L(kpI=y7_$dHJD-r>UKwx*7)|$0Fy< zL(jpv*r>|4^u(DO#KCN)06bjcpAAFwOYX#_a~yLlXEqx{SRT@UJ05ykg?f-B<voyj wa5jJ=4g+%-iWB>#G<$J^PCC&OC`yQxCCvs?w_#NLq*Dw2)RHlNV)WF10j?ja+yDRo diff --git a/test/brain_observatory/behavior/data_objects/base/__pycache__/test_data_object.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/base/__pycache__/test_data_object.cpython-37.pyc deleted file mode 100644 index 496e0692cfbc8819650093410e213493a26bae2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5322 zcmcIo&2Q936!(nnjT3f5N}_(ymL@<cOUniVtyBt#Bt=zGwWy_4t5qb+>v5V*y!Lj+ zNt;zTlth9aq8{2K2T)J_mwe@f`X6xWd(Ug{I_#2U0k1qWUVCQV$M5~-%`B8kV;Wq+ zKfgQwS(^3)AJR*Q#tpdD87PD%n6K5a=00ok8fV&9n$U%@qX}c1*L1<|Xl3&$e5+N< zEFSyPiJaT@RnLuF{4c#YG;YAHu0r8yH72wg7fkRS4aT7HYKAaH0iI1UA}pv2VpNPl zJtB^XBGi^B!Cd3<`1hWQdgfs;Bwi@F0rw)@ssaT_N;3!^Y1{f;w#Bx!yL^j3Vvk9O z23zCmT*U8zG^j;2Co&F)mwFG1ROI{GGNVDQntmT<s~ONyZ_njLsze~69fh`NxRI?I z&6e*~uKJ<t`09G)4n4c6*jS_3lQ`ED6d<g&O0x)k7Yt6q8P&Lu4D=K`lzD6fPScCc z4aZ;i;L%j;El<XlZ8w5OWZU2jLwWu()T6fT`i@ez{jc`yuf;1%KPXSCC1=GEmAdn* z6KpQc2aX#C!nw5M1siH9Y<Yolp$uCqn`-HsMtw;&BJX_5ao3!mJ?QKE@P$~LMNMbx z(rE;CSchRZoG6r=vvqI9*=U4vRsbI04FW>V)*a<h54-2@N^4V&f=YNR#EHh*UmV_^ zl}vFHjey3n?Rd<#o1s|uv0b$7U)CKzc|%jirH*A>&-ZOx7GZKK%1j=?b_t5OkT?ti zC6Ui!@)*8Er%4lvvMy2Xc%<X;czj-gDWXOg+>|nu@E+rhdc{n2r%A@2?1PpO_+AyD z(Ab1tVC|Fp8zci10vE-?T2-OQ$H5=)Ofbf%vxJex#sh$zFn3uNAq9*>G5U~GoZQOd zWNi32IsYOx0)Ubyx^c3QX>{NaVfANhrpzT;PNEH=jea9<gHzEBsc*^I=wNy|0gV)W zpB+ld9^lDw9PTI<I35iw-@sOXWU&SOmZk+zy#wtW10lfhQdgiz8R&0dhKGzC$c4UB ztm&R1fI4@yZB{d(4Q``$f%s_z_{nM?%I@=Ep|@a0mx2)*SZ54%93E1J+Ja>P8ET7d zX*MUG(yK9ZavspT9*DVJhj$bVI75F|AO|YaolUUzp`0<FIU|Q1#LpcZ6>+hpts>hq zSgz!|@C+3Rl({I0O0y-y*2TB67ukWgFC7LJ^A+mfUkp@^7EWG$#%`pHGf;{-T!CIf zin+4Y51FxrA_7lsN}NERz#>B{m<0iux`>#N&C?=<R<zhLqiD$K<P&tJL}W-bn0z1q z<pd%cwL_2+drNe0%81kW2lYeicc$#eiU~Jhcqxo$U`1o9SlovflTMina=aM8AbWU` z0WUIG-g|g4<4Vj-EK%rk<pani#K<laRu5xBzJj^RLoP~Uyu+KT8E+mPo;NSQ2znx1 zufqbjmp&IW#Sc!OZd;$38IC|tqi-luSo_*A;%1>+Hv6Hqi_A1$x+^qWJeAH4Jc{kt z#G}LbVF6%$5=A28Km+T8(<w#K3kcOs2^Hr^qcy*_orO1DLLJ6A3z>6rpc=@l2nLX) z52F#)e1ZazIe7cZ5Lj6_Ai1{r%uI@wezG9rU3ew344_!~0gOI?T@j|KzbFksy8Q^H z>EYMcm=g?x<(Etii0TJnIa!SN%?>_A3t{-c8ZaEwyt*WTJo`Bc^b%k`Xr@4`>V9ax z_DX~q0?m7K1<DLAqclBeo`&ZR8$y*O4YcTBtO7KU#ga^9*d&5e-a@NDl1UtodUxZw z)e>h@NS2gPl%`6@5LD#@Q⪻It+oJT!dR8-$r!yfE)O`jM@gZIi$*bO;@KQmYq7p zTwP4|kv$uim|X;GAgpo;(;4^!zMmr;Bn4$=M@h#ZjBF40xaua#ftJ@;5q|9x{Z#6H zp3?*Oj-&_DbVm=i0(sFcoS}4dF+s0H7p~4`x)iDs1xz=^I6v*eYLnh?uD>okds&9f zj))SuE=L9f^p$AOy$UCr=5*LZ>09t!N9hSvy6>hr-z8HVmohwoAjK=th_pv6;*Z&% z$C(zvF_(bd)-D$uj*O-w;~x7F&Sk#UzSDk6&u41-au`16$Fdn0TAS#dS^-W;l&9j! zY8ZWuM?y_6fDJDl5%hSv@3I*u`npblPIJR%%aPt~)Hk8RLE7d!RLi4#Q>!;&3^{|v zhgg)cIETe~EGUoY7PL$u)X}pPHx{!-tSRf1Wm=}hH)TV93{~wydO}or?r^A*9u8G{ bPJvWn0UV;=tg&@9Imfw<jv}QkUex~wH$`gs diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_eye_tracking_table.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_eye_tracking_table.cpython-37.pyc deleted file mode 100644 index 81052854befa81731e5dba304cdaa295e7cc917d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3294 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 ZC-hLZxYTyrECe3mV{Q68)LQrYzX5r8PE-H@ diff --git a/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_rig_geometry.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/eye_tracking/__pycache__/test_rig_geometry.cpython-37.pyc deleted file mode 100644 index 1be1fb9b471b7732d6ce4e86eda632bf678076bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4646 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 V$A&v7q)wgFyW!To#ygFd{tI{Pj8^~v diff --git a/test/brain_observatory/behavior/data_objects/metadata/__pycache__/test_behavior_ophys_metadata.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/metadata/__pycache__/test_behavior_ophys_metadata.cpython-37.pyc deleted file mode 100644 index 7beb14b32dca6d8f991406eb0cac4815a7497faf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6994 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 JYO}SI{{e4pVs-!k diff --git a/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/test_behavior_metadata.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/metadata/behavior_metadata/__pycache__/test_behavior_metadata.cpython-37.pyc deleted file mode 100644 index eee04bb119ae0177b1962d5c1a9f99057819989b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11156 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 diff --git a/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_acquisition.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_acquisition.cpython-37.pyc deleted file mode 100644 index e2e25ce3cbd6bce8d5491f993872fb1a0a02ed36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4943 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 diff --git a/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_processing.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_processing.cpython-37.pyc deleted file mode 100644 index dbbf26f4b8f50c0bd7ad0712213e4c5e98929d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7601 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 diff --git a/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_speed.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/running_speed/__pycache__/test_running_speed.cpython-37.pyc deleted file mode 100644 index 06d0a6441f839b221de6e96a739aab4831393c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5731 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 diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_stimulus_timestamps.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_stimulus_timestamps.cpython-37.pyc deleted file mode 100644 index dcd9274a99bf425bf4c24c080fc537154e530830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6398 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 diff --git a/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_timestamps_processing.cpython-37.pyc b/test/brain_observatory/behavior/data_objects/stimulus_timestamps/__pycache__/test_timestamps_processing.cpython-37.pyc deleted file mode 100644 index c09ddb162fc1561c72686adc937693bd3d560bf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2158 zcmcgtO^g&p6z=Mop6U79U6);0RzN^dMqviQHA>W3ASRk9_!~@Tw5{zbdYb7!t7{f! z(`$klWl8uk8oih}6HF8}B&ZxT@c_nyH@x`M2@qp2u0ld$OhgX&s%LkZ;3nRzNxgbi z@4c$2_kHzxOQDdJpt(o)Vg%aHVlvwnfHDd__zMJ)2(l#yX~>Z^8Hu@UC$wZdDw+ag z!cIA9E$yh98rze0#>r|~BvEBou9YVWNs%;BX|h!y8ImPAk|zbyW2V~3ihr@Cm-LaF zNIzLX2FRe9Zlj%YSKLCfhzya%WSHDcmXM`n8M(#G-Vnc>tRO4Ntz;EhO>QH%lQpDh z=EOdx+?L55<jz;5eMsw>`B!VnI#MEKvffO92Lg|~$cEUXm&i{^#f{T&d#NZ#y#}M0 zQyn+B7x>hO@{cpmr;Ilr^Njj7@K|nAu8+|g9=ANE2i$TRb|cVXqyfi{A4E%qhv(Ot z!F=W-iu$$-<I@na*|toVvWb4bZtDbdymmR=1IKboBE{m=2{d)~EG=iboU(Cj2Tox9 znvf)GT8Q6-_+5yLLR<o2ira`bqg<|-BhP>FNM4pk&DL=F?5dPHtMrYU+3%0~4`c^M z&BLevTvP2G8a3a(cI2h22iA|8TVA+uX5~kq;MSYxUi=W0+IPiMAAAN%=1R-_RIE(B z`c84vC!jq1)5O5>_d$96Qdk)|4$3|IuVredLHXuF<-PM_<%a_o?|b+1k&1c5KY45r zwJYZMx9z2Sr;b(3%egBj-pHM(n2XQ;vLV`jvSJ>ZI`>E6t<NjwYpcuQp&!4jm}gcD z)}QM=1wOU?eCqD6D(3lttNzH2uPcV!xv>P-my*!8LJyXJ;8F-wn3Oqc$)Owq_`wiQ zyo`thz@u%&BopqD?D~<4ZQHQDfJQx=g8)#sJoh2SJXTC->MTT&ItNk08{@|$R)F}w zKi;~j`V7PbRb0cQG=_I$w^`lnV#9L@-dLsXcu)l@xq$&PrbqQrYpfao%<Ft?)Uin+ z*0#Ze)XN;$R32m4a&>PEwjIaZW6km`8OnkzVA%y+3Ci=ZFy5exmAcP7g9d@+nkBy( ztrq+1|3&4z$f3xNv_?g&7siQYLDMyKAM@IEs&*YSv9Qb?zwE$c(PPh@mQ72wk!b|M z(*h&GS;-JWG!=RVdW_aMC|u$Q&`N}fUGij-CqkKs;vgSHlS-)YWSHECbS0EpskU@@ zcrq2HT4@5_Z75e<4Ml8v2NbR+q$j0kCD<hsB9c6akQ6GdY+C{^C{tlNgfbB@UYOy5 zvQ6uUr|2<CbVhlDxjH;Fc&qvAvj&}jwGKX|e?e24g{IUEP3d}FD9wXXm$@6D8|y<6 zX_>if7JHb;BTES($~P0qjFP<RQ*Du9TfPsM5QlZ)5~YELobKUKI-neL&X@vGT0f3? zt{dWFMBi=k+Kp?TYfvU|Vge{8J|#s}%Q>D~r%fP&QJeX5f)v_<*~ig!xV9+fL#HH) zgy^_a_q4&-Ff-FF7b+;6rWJs!anaR<Jwgr>OpM=INA$onS~<tz&d&4X_g?S|hCxUv z6{V1j@^V(rq9l?NDY;+HBcSyVSc`pHq2XFw>{t?Kc2X=7t0`{7@tbi5w3OczE*kw` zcn}w+4o>Ul4vaqnF1F`kV4PaPlb9P((!s2*<$TPrLpif1Xry4qa5H|%@x8lJDvB73 x^QzwOc%)&|2gREW)`IAhRiw&&iF`s;WXNI)ElefRK)R!=urdJiJX)4f(LcEZsLcQX diff --git a/test/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f18b8914c599a879a1e9e02efe8133a34410a038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG=~kXNl9WgqtD{xE4lgzZcbhX@q_Po z$8q0r>pUMZlDXd?)mOq#88u6?9}pDVvvIb2Fqg)Ee6E`rKX`PWLk+5sZ~+tf%0Oj} zf+<JSdu}^4z9QPLj-GF|<X#7ybWk;LM9Q`;ZK$RU=tC(TXd|qovpodsVu=-|WGRF; VItWp8@j0BItU9;2NFTk)><fRtJc9rL diff --git a/test/brain_observatory/ecephys/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 249d45a517c8dc7f1caec8c2ae1a29cdf068a80e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmZWmJx{|h5OqFOm5MST*v*)MWT?b|5aL5(LM$yy6)AFTw+T({$mg_#4T*ok#9zwF z)IY$$#JPZk#7XyjzI$iCv#*B30YOu*&+G%&cenX9AA<{YI6x3Ycomrv;fvsfOg-U^ zNfd6dLhiU@I&-V@YjoI0u;c-m3u5+!KPDn@Jx>*#6q4qKl`7LYNV8&An>LnQ)<p{x zntZ86Q%Tx@1X{PY(29=Y6FQU3HU@LHV3safOO>`X$HN$3teFu&xn9=HmU$(Q1{5vw zHvtOS^bjUDk>3T-Lbtn;21>26Qq43bL+mNK9@lDC&fkdXBm495`ZT>qd62S#i8yC# zrrPvUF{BALN~Kyss%xo$BWkBTy)E+;N-K|RRK(^Id#ef=Vv$%0Hu*Po@-ubf?sk;8 zZo5OA8N;lcD{W-PHJ-t3h@!yFLBfF-ddB@+<QtdX##_~YU<V6b|LprM&pq6M`<#C8 E1u4*s82|tP diff --git a/test/brain_observatory/ecephys/__pycache__/test_copy_utility.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_copy_utility.cpython-37.pyc deleted file mode 100644 index b2868d5ec8f80d93ec3e1841b256bcfa719a51e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4858 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 diff --git a/test/brain_observatory/ecephys/__pycache__/test_current_source_density.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_current_source_density.cpython-37.pyc deleted file mode 100644 index b3e3fb7a5fe4a2e40853776404f1c4b8ee49cbf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6094 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 YA6IHs8`V~|4cBczstSK$l-~XQ2WPpMaR2}S diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_cache.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_cache.cpython-37.pyc deleted file mode 100644 index 56bf8f03a7da98e2327a7b302c491edb2d564f1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17884 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 AXaE2J diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_fixed_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_fixed_api.cpython-37.pyc deleted file mode 100644 index fb68f7bab6152a2bde9c99f5ea158e4d8873e216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmZvb&5qMB5XWbdCjC%%RSxhB1VIZdtOP=cvb&t1;zI}&MT*?mwArRfWSfOby9Ykb z@CvOs@k%~$;lwL&Vw`MIRj}k4JN8We^PA-1&Q1qt<ljE99|-W%Zq~!0#RHn^Dj5zO zGYGABGMqc1Gj~H5fxEo%8NvqlxKG~W_yU6FFN%Os;FwECi72NF^;8zeBGHf1_ks`0 z)byUDN~QVakZE=#Wg!zAVTXNdo8|#cb(xHYPjChrmyUK<_;vRTPhr_u0m3U%^9-KD zYx49~90i`V;l?i)S}1LN$x<bhbm?K(od_M%PNhYzNSez?hbyG~4zfiTet$W*8@*IQ zs)$V)?~mC#mM@}V&XOYMY%db|iHeF+<SHRs*s`L>={QoU7S~Fa%-BRwY?jdtJ{wpC zgE1+{<6=x{Pna&`VjyZD)p2~jiOU*K{KoQ$Nm##Jm<u*Tys6qJnaUbKAG;`R@BR<& zkWRM1U8%uwTp@z?mOgh@xNM%{achMfW^J{v+aGZYsyj;WTqk<ojhlP7ZU>zTuxwCz z=~+{u?QMvRIknU{QkZ5^%*!+r##e&LWNMmoqEC>_?obgBO^v8}A2`w$C7agRR@BCR z1?J*5gerfRj+DJwgXo~_(K_%eVd4I|2mOEW_s@y1{a^CLye`caRDrEhZpf*GRhnA& U<^_M7iTm`&)ct5VJ-6lm0mn<;Gynhq diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_lims_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_lims_api.cpython-37.pyc deleted file mode 100644 index 0c33c01d313305083d210f19b8c689bf95d88f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7847 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 G<MRJo<>i0? diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_warehouse_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_project_warehouse_api.cpython-37.pyc deleted file mode 100644 index 8d54175e2df59d6d59a889a9b9f4399416f8364d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2408 zcmcIl&2Jk;6yMq1*shZ}p&w96TT%$5D_noY_S#X2npS}eM2ONNZEUT^p0P9Wde@y< zx3x(tK`Mcef)EEzJy4+@K;qxvhB$Fqi4y{;5)u;P#ECa+JBib#aAB=^^Wpd2{NBgB zcX@g`uE6Jh{UQDVR=>#2=$nPbB^cs+AVeX^Q7k#D4r;5Gh7_u7>YEcpBRZMbQRVKd z2#Js=Q%J0-ktjJr;$*U^GDN1reYgYu>H8{4jGfGo*``XKxv!C<aDI#&CnsS4EO`#- zN#K4SPEU~+nuwf+aR$a&;C&HJ=SUoO=U}`9<7F80_jU40Q)@;asN_|$a8KDr+sKL% zbX76VKLT5nH3J1_Xq|R8dcy8-Z<E%2`xfSO!|Mua;|_bTKUw2mi@I|@6+W;>IK{$q z`*UsTZ+IkG_gun!=D8wCZ+AeR68lD%@}4!-q`obv5c1Fd**a%F<qW^x_6T*BmR1MX zUL7z5lS59M5yAdwevo26{dVa>|Ba`MC3zb!Esc2A8JTCUX_iZi<-D0qnuT&MSITD1 zs-bcn><wl&u&`;5+CIni7IT|@JQ98~uK#+$dIK|OO!GXw(ZG(NRZDAlUZB-5H?$B1 zp8zOULinuRb-KcKahr<%-TxiP`q+)&sRaPGkX!&{3soyF!v#4|qk>KRx|3$#eVb0P zpI_56Z2tUmdgQ?)A&ZPs-#rBJJ5tG$99PN|3TD~NLuAUiVkTECW~%F>^xKQSjA7X< z<w}bMGijRnl36I_veiLC)i<!~Qb#ax{dST)`uzF@_Sf$Zb0gPAWt1m}Od-lI4?%fl zpy-J>^JQ}}U(W19H?mq{D`tv$vz%S5j>{%TmV~^A*p)A4AUO+#s&z#AyX!Jvu-=c$ zX?FM1hdFk42TaiiSt3p0F_|hc$rc*(=OM;i1BP)lgSSuuOR|}KF?Rs#F1kHWfn}0A zQ!bYC2e@}F8*-l?w{-C8AfovKD5x6aK%OqVt7;hj15dbW7<CO?AioF<`H1CS<bk}Y ze5^DOK}5Y5BkHz#NAs0Uw54q;MB71kbYI=lx0G$Qp=_bg(47gQK;hHZ>L9xNjg*U% za6}ag5yevX)LI(Rq)`8yEPsQ-mb&P8b$Hp!skgm)>)ke9b(_qkb#<sz&T<@sA?ASi z$|q2I5zJdqfD!DrP)il3ee@A(N=#_YP=kpMXRaS4R)nBj7SvVFJq~~9f;x>L#;Hpv zrvz$nV!YCRqx}8Fm8HrxkP{WWfk~={Z(+ArS#hx}&v>yy-J7D~b*L-qKs{OSD{rw{ zML<oy(1B8jn-pXn2RKM8EsagrIA*Tx)j;h{?0dYI9)>;q+uoN0kGG9frx(n~1c&-; z`?%J1FuyGQA@f;5G5AfPe)eCTnmV9k&Cr9G9ac=+4&t^A&7|v4SWnpy9qh<jYTI14 zY@PsOAU-`>^BGtL(_>Lvfg>TK6+`?uOa`*z5;F~BYG{E@JGZcPYIV@9ptMP2-ygNe zl@1G{fD!vXHzGk~&=jrsURNAkFI5K`^wS{9spvYs7(*8Vi|=_uHV7f}UAcHPnn3&% ztc;iy>GULzRU8E>^;nEj!?29z-L4LIb7?0(0VL4dn76EmXt54!Sd$&h!EZiieHz{s tg4;(ze6foIXD=hrAaX!r>Xe#55u|D=QdM17Q9PtmAw3$>*?si5`VZl4;wu0E diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_session.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_session.cpython-37.pyc deleted file mode 100644 index de421d00d964f610ef2d0cef5c8644f9e276b835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21250 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 D2?OCs diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_session_nwb_api.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_session_nwb_api.cpython-37.pyc deleted file mode 100644 index cd0bb60afbab5c417c55a2e21861a563acad1ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcma)4J#W)M7`_iXandGjib^Gh4v3+aN;)7Ggb+}~gt`FB$&z*UT^%Qm?cTX9sltF@ zr2n8pD<=MuSEl@hPQ2&Dr5_-1r+eOezaPKn*PTuq!AgI8;g=MlUq-1{2QDw+=q-$p zKmsR-%_U~I(g`D#q|B<MJ#G+$(YRTmQ(=p>F_L7sbiOQzw9Y$%3QO1#y^@VHa)EDn zn!*t+h-ix?u?(_vM*k;5bVWC^Z&a##-R)6({@vrR5zu2LB6E!Fh+Gh{Dth10SIoKs zzen!c%*=1^<WVB`i)|H0gJN5L%4Jwcv2ARAmd?#^nZabyj2M9FBbStzmpGVN#$p?2 z7-$-B4731Ts*Fn+SBb+vN@&bx8IL);aP$^HfrfaBrg%!HRNzzVvt5uO9a>W|wFMFM zlwx>UU~laKhvtH2=~VQA=LZ+Fb~upX$WP*tbnViTspf1oOtK)5Do!JREL9{+k_*-> zq%Oe3*0|PE75={BW9iF-L!P*e(lX^syQ*C}^=woZc&Zfu=43&^<5Y^DNUek6^84;H z?;}*w9v^Vg5BM=pC*G@+hgmB46Hlf`+RJjF6ar@XV4}Tuap38=kdJd7j(8*?H%TBu zjCKsYoj^egKMSDj5ic?|*^!|%nU&jLD880j$64y9$AQoDxSvnTb(8Pk{_<rYs?EEh z-WpaLAl;SHIp!*bNoZybp5_zQ$R{QlBnRSJ^&pJx)x`RDIQ17aYI#M+P^l>zYBf!; zv)-LDthtC~_v)nU2^+QXRwcCx^h#^Y)rc+S+&p5T;uFbQZ+OAq8om0^>XEL&eUs)q hA7|n)kuS`Ttv3N2;$YZhlRD%9eh8aji_UKi{2O2VLni<L diff --git a/test/brain_observatory/ecephys/__pycache__/test_ecephys_sync_dataset.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_ecephys_sync_dataset.cpython-37.pyc deleted file mode 100644 index 7def96a890b05c05ca78f324321c93a3c2d04279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2811 zcmbtVOK%%D5GJ_~tz|j!D~atIXq!G2xXPi)rAYI3b14k8Nt<F}bU`g?d9Bs%noBv6 zARn3pNO}nJ7bNu5TmMC`J@2V#FY#aKsWX&h*>w=4Ef*Zl@-^hlHy>}#%#;a~<fk9_ zuTzBli9h2q4a#+>`5zzz5i}+(>Qjn3i<!?%Yx%Zm9p8c0irrSpFHs`dj@O?Owr~V% zumKaUC_N#Msb3zAcw$PFrQM%~8PlTDum-eYiJ6mqX7wp?+N`dOR?ou988Ij3#lpZE z>5Jmbz!GPry>qI6TAUluMY2Rh<>+X`ZcsSOl2|so&59NA))V5-33iuMR}bKxq)H3B zm4?j?Q0CV|nQeFSyPYJw%{9-ZE<E`#lcAR4fWqt$1r`R?f_e*TejS7+kI6n2G$Il0 z(SY^{NY<k}tVfzGe_vaVpdbF|4$N8xmo8)f73>!Tj$>{3ZW0B8@A?a2+D^1oLE6?? zTL)W8?pAGu_WY@q)Es7MUd-mamBrEww`CG`ic>f8Tq+%<$+}XhsxoE6nxcf$;W9rH z1wki&{dnuM&2M00zR9<_sMYxco^&>EBs@$L!9U%U$zHyhW-`e`kSV%k^UJ8dnMYcF zlJT&~8xq#WG0YIni(2OTVqNhl3DP=jyT^5^Iv3^8nPxZ`{RBC<)|?)WQ_DKV8C)Fv z^CAe++#r>?v<&qWRS3`SQd4%;;wX_p%<D4F*J3GxJs#(UwUwq2LhsA<+s4QNM(6-t zre;8ds9`BV#hp#yo`GTlXZ2{$3Lr2bnYMOp!Fo(s&)JLb_igiUYp3t_*npbe+P>4X z`lTKj(0vy}-E`HrJ*V#pX8;+KltG^oF6#Fof4(ALlkW)ZQ10O#Ebr>+M|3h`08rY9 zUcxE6pN}0|JK@vXG53uiT5Cuhz?wiuEtyxTUr|!GRf2wL%kH)RvRysWLAcEmh_gb- zAIyWORtyA-=_3J9E(|F2b>U=OhuZ~9GJh&fWFEv(Q~GoAp;kQ90Y=K4&_BlwN`nwj zCW15xW$+-<+r|9x0n_Kfq%ckaRv5WzsjvV7Y7TVY8wX!`XrE>U-7UPdt^tWs7^n{g z#=AIckaprUi!hd>Ag)W{W3%)uK+dBTw#d{9^mjkZwo{#oC>3&egS9=3L%tSv!dR}2 z38I0U5VClEq}&@TFRu-Ie!n~J`EArgez_K10RM)VrdaSIn4*Z*{2quq<SBVdx0s-U zJ@Ev4%m9x_HI4={5mwI@HlXx8pwQW|0JF|>x?j?E-|3Zl79i~l?VdoIyAi_HhXsvc z$?>+5_`pX#J8IUqgar&`cds7v;g;g9kw<`o(pE6>Q|(HeLU{A5wR;H4`-*3oREJ53 z77;TGXmu3?Bp!nlsyqWG#MA?Q=@|um#Ej+1)`e^A<|edNtFUt!ZxwFTNKz#W8_<zg zSus0VFpOE@4uf_C5nf;*7zCH`80dOJJ!(Vk-uZtQt&MlysM-aXNzhS2Q4WGuD%wEV zK~V{U-8PShBkEnSJ-iT8Z=?RsxI-E6R*t&y5{%{OK98yopy?h`@hcc(M7*`F2+T%l z?Uh8le&XFTq#_06KN3nJ9~f8hdMx4psB=vYR7-{#3=b%z3je)vqP+$r3d66?pfI`Z zO|D)zW?%DsnLC;kSLbl<G73x*c-|(yGH&|#O~ZBpmJc78@?y!Qv$R6hN6>ee7wBHJ zaSJEbKxop3=V3r!tn3rb`j&vFU>{!jK0Fo2X?}#+?xlZAym88fs(`JkGx6k*a!Xr4 zq420GWGc9~aRefE2xmO$2q?w_quDp1J4b>htU}9FRY9xH`(8VVG|n?td^hXhkMAVy zR@N~=@$K!)S;v3f)A1&_8lK&5an<yvGmdnjRn(Q{EiW9d6z>>{^<5Z*$EI+h5oyb} tu{9Afhdy%4$yL28!(_UO50qh%3eYxutYWQ{J-SHGFM>{2DWj_ke*@&q{(Jxc diff --git a/test/brain_observatory/ecephys/__pycache__/test_http_engine.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_http_engine.cpython-37.pyc deleted file mode 100644 index c8f493e374b5855be204155d5ba14a5b3f7712a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4101 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 Bm<<2` diff --git a/test/brain_observatory/ecephys/__pycache__/test_lfp_subsampling.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_lfp_subsampling.cpython-37.pyc deleted file mode 100644 index e65817f8857d906a45a7b5a067c09f1c966c44d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3603 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 E4|)8evj6}9 diff --git a/test/brain_observatory/ecephys/__pycache__/test_rma_engine.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_rma_engine.cpython-37.pyc deleted file mode 100644 index 482f55fef32d950d1215bfca7d464fec2906644a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1188 zcmZ`&OK%e~5VpO$$tG<B6a=k6oVY~5mX|o7s-h4$p>jY7$x0PDYbR{8FKoB4RU*Vg z0&YlLIV9o)Kgm~4{DqzvZxUKm@XFte*E8dp&*OVbOLYVz{q}}^b`bh$7xQ6v?!r_* z065|}MszAMCFR<oZYjN_LJ&qtwM4(f8m(a@&`y24z=<H^MecBydwqvjtOm0Bl}xa3 z$4lIw$=U?lzx}y={U7#?(&LY1pG*i};EV6kJ4{b-`~)?ZenGxyYk!3^&3ck0;)-~c zi%<*R(M2wl!PgDGVen0ZS(8W)tPSo`FG}_8TLwSgcWwl?LSm!9u-g@wKo3$mfJS3H zL=*f8eLy|TF(>c+k7$RqAcYap&Jd5?3Fx4asWu?$j`rT-SJz;#GC?i0eW^`G&dAl( zu|IStxRhk*tU_F{ZdvOWt!F?t6y$7$7|ylBCgs9B4O6WEL}-Y%Pmb_MG{mcD2k;Ad z;XXm%Q4<@F+j^VCkl-4vhFP2f8SvlFx|&6);L?W>2e0qnX+Kp$sy2Jhc+h1pSz5F= zQx;|^XE)m--Bax>7pV#Xv;29X+K-}cTSZ!2%~?2LeF4643>JK_riIdLT?q$tvMz+( zV>*+?nh1sUEVnx{VI7h7A%`F@4(jVX3U!zz`Nnx$n60vc_AlE=oha=I*@5JDlXQB2 z!Frs9ELI!Ap<lCR>W4w;@^LR?34j>NI7(>a4n(0$V^cwfI?B=qQfAV4P*S1{Npo3) zB$^(r{pljw_`8j0V@~6&tsDqxyge50ijvqSmJ1L>E&`Zy|0%}afGQv1avh%`7sxV} z=j_oZX(cbL6G#U409oandg*SG7xD~P(9JpJ!7;Xj8QXK&$z`?!PoTr{C^*8?sbikB zI&-C`XUb7u*|4>^36lf5kTd(Zw2bxzt+n8>J+$kRIOFx=jOntHl8Yly(&4Ws8Q+b? XhVAUKlYI;yx#;-B1+78OI#c-@Pv=mW diff --git a/test/brain_observatory/ecephys/__pycache__/test_stim_file.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_stim_file.cpython-37.pyc deleted file mode 100644 index 94df914279acf424949e13fe242ead3053f0b16a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1808 zcmZWp&2A$_5bo|7+haR+es)Q+yC9*xATNt^K;i%hu|(_%g`X7yjVz7YQ*CGL@yu-Z zIEf<%39?tj3+%xWC*EKmfg|U>av`t4iK=$u&4wOLbyxpXSAF$Wf6;0+7`E*9pXHxb z#{MSdy3xw#_?uTKfB{cgxa@f-obH95>;2GoeI=}7FVfm12m{W*1OEjJ>rjCz_6_Ba znyRiELjkp4IRsFD!OnTOM)S~srqf!ewHNEK1}$hSG1?e<unrqnqfOX?J8*aCsp@DG zSKfj)Y{SmAKJ+gH?7}@~X$$x>*13O)-m`-aw{=q{lW35nDyFIHR>#3U{-%opI0$k( z;Y*3GqVrG#pWGdK2_NzVKWM!4(RlM9`Nw1I@-7~=TwZeOgF&w4Fv*5CP+6RV(#8rn zxfHl~iMv_Hx89&IwpC~q^;4ORBcozlBmbspVk=3hCgu;O*KzY}@$XOjANRgDXs#y@ zC3O4pSZ1@{lT5~W2J*w6%8pDgFH~k?lzDMDGrg~pe$Sx24+<HN<xt_-G{qe--Yb<U z_xf5US(NwD?2#;UJ=;^UqLXepT0zz=X13+DVw^@GOSy*584^qgE_j=y(3_~g0dEZ_ z9K4Tka1Ae1Fn3izIG2(b0l|<tXzMR42yJ5tttP;9g#;x^6DhS%0_n;$S?^SIlg8wW z4oI{}v`M^);8NYd1$*y}SfVm7Qgx&-vXggk`9@rUi%f6fEOMw?NG&HOrd(1Z$5sS- zib~1mY{7wF@N<49N-^>l{#<~#5NBRlnS0=!i{G}-{Ia^J&G{m@U~}XwXFp(NeapUM zKeD-p(fbEsV}-pr4QSj&<gGaFck0$NrMA_{7<p1yksIq5vOKi@C{Hr$69v%IBp#>A z`Y^>k73X)S61K}p0f~+VGNx?XnpV%JNQAJuT(EU2kciBM0i~MM8!$TXHdf%}Sp<n0 zzmJg{_mYS<;<d)_3;iz6#Z(Z~sHaRiCQzbEHsT90XBSkX{Gj7$f;8OSmy>50>(`n3 z#`#amQ*^=Bt~~B=XZf~E4`NIU?#(lF-kp5S-H*_+aTyc(A&yUX3Y`~GCMW8#Iw@3K zDtH{{lOo(4V0M*>3Z<zev8-HuFR4ZThubn6PE)C)<3ojX(RnG$B+qU!^!7GnRvsti zEcpuwo4i80#>8Q2#Gn;2Z=*sCn)7pU=Fh!3a_3x_-ID*pfh~~|wl-9FD>9({#9-ah z{a<RGYb*o`FRZV^!x!i(KI^*xgS=m2!7I3p-#Wbp5gjCh%6x)`jPtS9;QBq(I(PH~ z>})_==&3;B6?%s*tQIpm9#%5s+RTcq2p?TPGu{8aFx{&crt6rN<Sz5>;c!(J)&|K* zIn`>JXNt)B6RF2x(~($}IyqHVsOMpTm&9p~7?6WELULvAs2Y4a$zhtR&xnDB@C`VA Ug8nr>*bLgc&2}Z=4g5Cve-DSrQvd(} diff --git a/test/brain_observatory/ecephys/__pycache__/test_stimulus_sync.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_stimulus_sync.cpython-37.pyc deleted file mode 100644 index ff198387fe467c87403e18a0f0c9eb6ec6c896be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5458 zcmb_gO^_Q$6`mf=NF%MZ-d)SP+8;X`$0Syw*ohs-`EhLJpPyh7f)f}P#H@ODEL)mU z^~^fnWmE-matvI!02ixrqNw5wC#pDc2vs?7pymX{1r;2)z=5I)zSljY)$VG^h1pWi z>(~8$`@Pq1_N7Xtq~Y;D{=T!arfGksN%ous(8MqNk*R51<E*Ron9Uf$dRMn~`Oet} z-np*X%iDRTx%#cbeTy5ealgn-p67*Oj$6FQOI!!81l$a_hB*nBd4*t4_wty}U~QHk z<8z)dWT2Vn3zCNLWqurMRel2Ni+sr|4w<AlfCnvB_VHWfbG+u6lH>B2<H`g_@WY-t zzRK6U@*%zxtKft6ecYk#BzLLPNq&kyz}NYM{4{@vpW&b55A#R(Szh-lDfda~(w-xw zPpnRrzRDlnvu&#MR5pL?Na@mY#eIrT(^behZ2RhG*sd)9U$&FySC8=gF?lX>b*k-4 zIIr=!PPKi~_p?X%UY+mil#?glr>iP5=;Xb^Q0EQ)_y^iOW|z}wKj$JEZ&hy1^7Hp} z{)DIRn?DIU9aI<iMM-rmrFx2A;!h(YFLTo~`7;E0Ife0Z_+y}XmOm$H=2DvHA*aNz zxbyslk96e7RpLDjCna9vO-a3wQooo=oJTem__9}k>`VBgjHdS`uK*2R;xF@8_^bRi z{yP6W_LL6qk=(z)zbLsMPq}|da#0pZ37!SoH@JzjDe+}w4nfuNt}jFSb^aCPIkfR+ z)GmI0NZw-n%`xS9qLdQf;$M{#Poxsx9`m})zs7Iyclf(rQQD!r_jUdaxqmU;Z}0Qe zH~A&fN6OuR#BX`XZOAgD=fBNcl6EPj{f_bw#-}q#$}&kVyr!h*<k|u%)(z-F*mwCn z&Qgajq=zv=uKGKI-a#Y~{S8Skxf8wgz$R}?t!i9<TdVUC)#^G+3VlaJ9jAL8a3zd7 zz3uLH*a~<2_HMI(Gl&A-3Ao$Bf*Urrgwu0dd|NnCC-58ocCRH-VWYj%?z)XTL>D&P zyM4DExqO7`uX!X$)2=p0GkB%5Pp^$QW+S>nMyK}hCz@(Q^J)rcOBt||0VkWIB9Z0x z$QHA;S_Uj<z-k7pWx#rKRNf=4X6REH@Icf1$&cwdo&ngSFi=kc5U2pCrvOM+03<5_ z3M&9AC;%!b;A93ssKP)fbkel%tv9{jeS+tW^=3OSQJO|xD&Y4reqoFu#>IKNDApn^ zVz=}tci)I{@!iu0c|Q+~Ily>7A8Rp-^*9&jhvr6ZP#9Q)BK8*I0!AxFzz+5B&8YZ3 zlUOS@Ia}6%<6~SAI9=lI5{_#Ko!oW7pu>oUdP(Sb2|9~p-syIOwiCIn&7GDEg+%xJ zxa2!qTgj{wh8@puMM10Ugpqx`9rXI!*sEen##ds2L%SP<ZjyI|<9lv0`(hZn2++WP zRfs^;OZMEss7z+}hoxQGi_656fobPeWF}S?nu*@tv}c0NsMYa#r|pJGi6&u$YzPyJ zVAtp2&or?N)Bg4T%g=4xfFj|BbJOAHHl6nze`n)G-)RRvcP?(Y{+)0m=(~Q{#u)T( z?t~j}bT&7_PUJq`ciOid&joF_iyi#-`N$2U^P9ry_^n_QZ0|TxAa>5XZI>wJGE|w! z#dH0gq()S&DQ=_i2xl>9&swai=k*#}WK||sf!RIQ7Xi!*8~t|F>AGR(FF32ZE(|P= zS{Um3=y8HCV`$T1(nH+F5%&j7BJDnlwR_r-4RpXdMb97yC?_E!W)wREL<^wYvR2au z`Phu}OWL4-cVSf<AmVNraiNM9a20J|T%dPN!%8tS!6_dXW2*`Y_t>D6VX)7tX(@IF zy9zPMx8f4Yu2CbstaygtCC$r8?TWWbh<e7&kMs?FP##p`a-6%Zhrf+x-e++oHUR&g zU>VJM70rTjO;BA>4x+-S99Az2@<w8WfrxCQ=Q_Tf3nLChXV*<~9Y3-Wt--d>lNp2q zC4i4#V(z*k2xV&6l}L1YJ(p8}MWI*#!}=^lsIw6dNCDi59J?5aZMP+*SQ3ONyV4Eb zb49DyK@RzzUD@vUC#O*mIo<Ipr2|wC{FbD$XDA&q()o!=y1ox3IomS+r49v^6<nr) z8dgZz1sRO{thx?-cp8J2FS8OW=@u(9i&^>#TVRX2!F0?Qatj#6BiOaO+UM!LawklI z^(;T-QH&@YM--{5CVukoYi+7D^bnSQvL>zrKqMeSW7IUnrH;6y$kfBN$Vg9`U9X$! zG!{tj)@C3$yx8CFhHfa&Sj>TsIvgXhGVN?DQ%{`0x-1UJT=$Sqmc~BW&$|n%kaX1y znBKs9cV^QG-G;lhg?n;T1*XnylSey!S6u_zr@tQOB2m&sDlN4E#M*srs11;VXkzej z^<mD`mSH(n>dRVAyP{zww{Ha*sa9|=WVuVXh8E}Gqjw@R^^tL1oP`8g;N=n2^NE3y zwxb-k*ban%$}I#}u(j1v2263DLH5~swQgIT9%>*O0`V9zr;0ieN~>vIo5nf9)=++D z7A&^HR&pgKo&aulEjyit&)qwFEk~>8gtxu#R)6vOpLYL#Ee#v3>HY1kU!MB#uZ8q- z{p7*yvOm-GF3RWOruWaY8$bNbKOSlRUt;XUR@d=b+kO_%Etlg8I22~$QCO3h(g?dU z-b_~5737`_G-=d9x2;IGO_lNic})f!GErP0f1N$xFV(O0oV#?6p&RY>Y*(;7ZAy+c zy)F67Wqw=8`juZ@Yg0_pLzR<$GCt1$$TE?7kD)OzWj31VQ1ozpN;X!vI(I+QQF-Yo z@g&#_$``w|r@KtcsiC#3d^Cms55PmYs5r;OQ<&{8ja{UilO0CtgKBd`R*vXe99bBq zhY9`_GIju!A}T|;aB7jhSB7#bo0f2&cY4$>?QdYx3ZyJ1V~;j)O&WLvpPzzsukJj9 z*>0VhnuBe82bt$>cOB7*cE)j#)}cRM8yyFsntktLvn|6481e;qL7qC*G&*&vN2=@O z+AxpXcklG6&YV4b`r;T!4`u~w4(TaKa#EgDPgP*n5;Y<_P)LqTXYB7YKgPb)2Q?;M zz-;#wlyhoH8|eJpyA9RyH9pfZ`-5WiA3SYx06kQp=$k}3<23-2DG(df2n`Ex2Q}by zHCbqWRI7cCTq1ErYKUa3{nFS?X{)U&vAVoO1?&$xtYjBbqY_hEW#^Sy;yKz)eiYBs zuoq2BG@a(fMdihVt^CiiKcqv~%oS=bn}F)eNpWl2Z%0AU4dsV`o$v1uy=|h;z^y@@ zlYKhtd(RzedC#RSuS|%<=sDuHJ%cY&d}iW~-gRxO+wntO9<G=NtHgAKaCT&8o8<9@ zz=NJ`&|7vC@@`Gct#05%@|uvfPdo%lnc{+SKn8(Se<FTlB+16cy3z~ycGta1pEu!6 z3}rMjmR>e2y{ebloKZtVbIMrJ*V!4P#!escJ_G!Pd5g`lQ)?D$;QFev)3X*k!!B4B Ss2*i`Rs(bvD^KCqWd8-*7n;EU diff --git a/test/brain_observatory/ecephys/__pycache__/test_visualization.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_visualization.cpython-37.pyc deleted file mode 100644 index fce25338024bce968f32778174c7b452b2b25841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 zcmZuuzi-qq6t<n*UGA>e7Kx!<IwCS~m0$uPj#7RI2~`5bVnvF4u}R&_Il=aoUTFu~ zGFB{%2(@BjVeZVIkqt3bEL~U-1J7wIS`|m{^RwUk^1b(buhVHESnBgz_6H;M!yQf+ z0p~85xemY)#~B)8f-oAA3cU(_TEoZDI&E;my&XgYj-R8@KLj3HN*uc7fi=Ju!At>Q z(F*1mI5_oShYxm-`@9Bw{i6qQ!W%r`P2Pf=_AcQQyJQntZ_nRA`*;&?;Jw;D;+<Kv zNo;)s@yS`V*Vsqf7*1p**v125GTYq396?1>ONXwhL+BKxZ!Uj*^nHD&cjA2Lr3Z8G zem*_;)C;|`F;ddTlG7Pu<#3dZOk8MTgtE-aT)D^<2#DB7l>q)XDOW~V+A@V4h}dPP zVf6mnud7GB^jW0^&T$n-y^xf?Vnb2-oLLs)vL+Q5Yuc5neSol4l7iFbeF#6)kV$Kg zT}J7xN<-V487p*LWVxk5Ds0TwgekpDsIm^dyc&tJo#a_25?8+|Cl`zn+W8N(&UNU~ z_P;s}^<K)961MgQ=}8d(y|s8NdI1Czv1P`)efFBEakQXVk}J+`L_)2aC@+LE31D6< zk4^MM_9G*$xK^-az)}HR&{u{J=B+SxzOR{7ao&gDt}>hJ@w`ZcV^-l9+8VJ;u2%!^ z7UOc-vEnn0y0MsP0EB%Uz&C+sNDEI8?JmP6y?H9wy`a@S(dwR;iDT&=KBkv0Flgh1 vLObU;WpGN;O^~Jag270P4&YD~Qcds-OhKRwZVz)l%ETS_z{YhlhXe8#%E1;@ diff --git a/test/brain_observatory/ecephys/__pycache__/test_write_nwb.cpython-37.pyc b/test/brain_observatory/ecephys/__pycache__/test_write_nwb.cpython-37.pyc deleted file mode 100644 index ff49b2adcfc0ffd978ddcc48d3200b4a3b020a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26768 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 diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 09082a1f913ea05c225d9e115d2eaf48bc6438f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmYL@G0Fl#424Iq5W$03=oEG$;{V%<jo1wg*`1(+yP07#DqC854lA!@>k;g%%oJka zeF@>ckpID;ucYX9f!v=N-|EP)5OG)F)J6?E>$__5`iJ**IW=3xh7Ih&jSDyfwdRkY z4CG*9kWOquMB-8y;=X0G@`Yiaa1^0Dzz!u_RpM|5osg3*8t`O8A!kpJLepw2F()-t gen&R>T5M29*4BFR$=Y#jAH7)}+_A!We(@zz9|3PebN~PV diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_align_timestamps_module.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_align_timestamps_module.cpython-37.pyc deleted file mode 100644 index d621208dd9d0d44e09b89bc28725a3565a0bc6f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4565 zcmb7H&2Jn@74NS8nD6n#aT0qs3IkG>oh%+FS%v+;isHluA|fknvLrM{t)8j&xb2zl zNp*W;TRli@vdU?-7dRjVG}fNDfy5DM_sE4iYH5YUp7y{$5CP)%s(U_cFR;w0tE*nU zs($s}?|szGN~Nga=YRZj=Xdjp@;MDgzY;n(@PvOv!xgS}6)SzKmMX{0(&SsWbon+c z(^a=~!#rnr7luWyah)67<T;){G!L0oa!Z>kFYw}1)hfICuyUyI5-&eho~Twe8&`N$ zj%QqbyTWI9?L(EH;<J)g1MSrIEI-ZX<oI+pKEuz-@mw}O$LHnv3|H?djfF380%hGg zvvzCk?)QIu&%S&6?%JK(>udJv%KeoW>XKzR-LC6fy5qG%tK|8cf#^Ar*AA^(FW|df z*N)sUvbhsER?cm^{jL45t<$df<?$5o+`<$71x=*HP}dXoQEi|{>X60yp*k=gD4hLJ zc}IDuMB27KG-53_xVE4iGI}p7dk1*y3(BhUQ-5HNc}#9d9=w+)D@|@@R1+(gW2jiJ zygbN_S3>EM2k-Gp7Uy^&qZXExM+Xm-M>igj#40aB;#n!N85@w9smerV&Y;NB!DscA z`flWPy=cD<CDk3iy&FcJ->FAiZr$_yyHR~R4E%Z+fZ{}N7wg&YN;8}8JJD8H-}HQ5 zZ#(TRm)A+Hn3P+{KKI0U-PLA2*o|o4bm3#+MQ%L`>P|iEyKQgN!w!+#>)WGM_aR9t z7iOkJdhB((^_E+w9U>Q>gNWI>W>J1GQN_Ad4)^`Gy>-o|?<Hnm1T8nTUT!&}9dOrf zZ#lm2cI_~7fQgjp+-NfLdccX(>!%aee9!6kofhF|G-GdiUF=tsg30ApDLr7im-@Jo zOZ1@c`iV}OO!RKx@Pq|nqDzVN?Z5+-@AmqQyj7tibRkN*dM4eL7N&&!=!i+4R7*;- zrkO~ZBLw0~40&p6W-N6m#r~}#W`XY)zrOYM#=D^_!VPE3;mwxw*zxx_R(z)&_}qDY z!}Z?_H|Pjq8*M<|vT?_2ZG<r0V&7@+I2{*j$>&18vqZkN)Dn*8+d&K4zUM@N*k8*0 zY{}_*9e<+0Q1aWysdnn9&HjF}0Ht^L?I~4^lr%#wT1TT4%jz66)tXkNHtnftZ(b{_ zVh%iQVjTSpbfkyBgbr6Zqu};j%fcJ=^3Taf3hSLu-}-&$5AT2eNoVQVv*myO;IkW@ zuUXcs|9bZEjfR%gq9Ag*@;G+5<!wgEOPy}e0!ixJ4uPI79Lg3jYI5PoTz9j7biVT` zf46Y;&wu-*^U+`bzW9PZRs7{|F8qT&#WL)!Wbd2OcE_93I8Actgfic_{Ovd2xc1iN zE4I4_FN<6bI0>g0UITwvMx*FVWvZ!BD@Z3tw8cP>+M?h{+Ip%$H`;nz#h8BdHu2oU z6JAFXDcck(!F<TZeRc>nKc9>dl*V&LI>$|^_T2ix;zVev%9Ru&5IyXBJ5w$gHvRto z!E67Kozy%*J~20#bxLj$PEA<Vql_m6xcUDHFkwHsZz_O5epbW+nuaDQYYR%yf=tm+ zMUDF8n`tAhnqTfZy%u+_e-HGKI27RA#8cGM_rZ6*is5CzYA$z!w$lx-qm%AB^|@mo zZhYlk*GMwLio(Qsw27H|aYMBX89T;!A*@ism7t2yiIpK?MIB_W*wF?oQn%SqLn;F{ z2HJRp%449%Y^d{GtaaF-sw#4nkM(qvaz=(+XGE0#u*(xoRU%X~ak@g6&TXAPaX8P9 z+z!0eL$Egc`_We5AF##V!Rw;{*E|v1nptdX9^dTX;slk)=hA@Iq}YD&%70-?vq{QV zUR<1n!Gp@;VwP%XlSTpR-l5QV3{Q#a?jb?)Bv18`y?Xl{84eQ`_LCwqc6-ML6uJ%5 zsz$v&GK#(Fv?*jKg_aX$nW*UQx$WJElAox;URG`D(=s<%^ApifUrnX4DQHO~Ul6<g z$$&pr!B4P#covPqifWNnRrv?b^Q_E@OuT}bwnP~^1f+4b_A?Bosx<%zAqeIkXsCRY zv|8JH7;Bu#>go<)q{cc`Z41i4Nb5C>QMK)`a6QuAS3yI)1{zw>S{V)18fa)iyF|1{ zm*@+CRBl~pkRqw1;XhRpa=q{LTyX|7f=(vRp=szMM}3N^g3gdsS3=}VLf)DXfoPcW ztTG%YNAyiTe3U|YUYw#$@}m%cT<w=+(R%`hG7-2D(!V`6L4b`y3ImEkiM6Vh8Ku{% zW~yQl)Uo<0XpPnX3k?33`eQZHo~Q$TZ*y!0Yhdi%r=od58R~~rFt2W~fjP*<dTJ6V z8>$}UBV(Jzc}meAvOz(Pa@nXD8ACHJ#Kl7vu0}Z+WEG|G)uToc--LixIRmb&KgFvc zeYc?|Wq3gF*zSAnovz!+AG3`3I@l5e^-eELnBPzGU~hK=SgV1VMkzHE#XNC|n%B_a z3N%W#GUiJ2STot@iDd7%`(sCv1QN=cJ+dx!uF9B3mbNNED?)*VWGD@PEMi~$a!X4o zCPw}MGENyeuU6SvwT8CJ#8u3VgLMUiv5{wy>ZgpXN*|-Z%_ctPDFbcqe9SUG!@UWn z)KX8wEv5ND>A>Icn1BHze<S~b;eSM&1O$2S!A*;NjINt7cpf|8Rz&xmK_TlG(J#iv zP>=I*@nt10%qub-m_t2+KR<z7s`BU|ZbTa3VM5AMT;io2J^T}aWN$SBsECi3=W%I; z1eXV8@D`9V%J`NNmp(wOpb;;hLzEa%0JB8GEXg2NN&Q|zOoGa)rQvYmUV;*ypu!V? z6HOXS0s<9KUr^I19>?BgP!khHFvV~!z1a3VUm`CtgyVNyafMb^QWQ=ASWAP@ln4|d ztT`D2fSu7jM?z|0G#b}RHon!t?Jhk}c{DE(H<sKgLY9m(VV-w9>RkD9ERHsFI>L2( zt{+Ws`76j6ehZC)%6*RMi2pUTx;m@o)mc_XU2kfjvRUMZGB8UV;!W^3&ZfbX>Zzm{ z?zV9Lwi|}x8z5Me%yBib3?Fx`eIeDF!`;Rc$n;vrjV2|S^mmyht=y)!7wrmHMqydi zNG&IN&k;M;jBp?AdIC4c7Rsm~kkL_kj}&N18PY|wLN2X}u9LY#iWzwvEYI*DzA|;* RC||7AYG>!>YG-S6{|0e~*S-J% diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode.cpython-37.pyc deleted file mode 100644 index 1574065271220c4ad693c1b1ba93c944ab447314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2823 zcmbVO&2Jk;6rY*>@VDbOZkjY94YX9aq6wm?hk{z#Qp5q}z=x1VM%H>~?QCQ3Zf7QK zQmqfP<p%r>iMW)%f-8T+o{%{C#)$(Gg!g7`$D{}(cC|mhH?wc%?eBez@78K%0$23? zSKc=jLViJIdeuO9A0G7?B}5QG2ZZOplry7S+%~_?&}D>@VZmV0V2PI~3CM%8V8VJ% zo>5*gnk^ioRfQ`G&k3)=X#H?O6h)~|kJv;ji^`l<6=Y7UiTa$jAR4HNGvX|+JH2^h zw(g>6iiS8Rmc)6n47SC&U8ZwnHd}(VR>XyTEq><zuQIU&|HNva!K!QGm8pmPte~Hg z*7_K^-u4mka^We!a}OT%5r8I#R8VA40B?Qgh>r3x;0_rRWiv)aWyC~vWQp3y7WI*n zl9Z+_wNg8EdM@m=usw$Gl5rhj9bp6EH3W?Fcmd%e!m9|E5HL0R@WA!!?J+twwgFl! zV^NYho|N7}%jLy5>gaG7C|-(ty@_ar-H=zip6rM{>FF?zcynIs_(3=bqkiT@-B7C^ zh&&5R|Nia0o9)k4AXVGj@x*4=d+bFA?K_d@$C2=^w}a@BYR5?sDIYLSb`Dhg<FMOS zp$@Jkp1<q$1F#(o;0>|6r30n6y3z}yPTYlMA9*^K2U~$3pyie~2>TP?wKq(ZdA|d0 z`mqQ$lY^|PAIDQ&6~RG;1QM%Bo6M%>X0iz*vk)>+@I@2CcR=`i2!-2sXF;5VP*g<K zj8Y6+k3qO<+p-F_;}rmjoR42ecoX3o0#qa!<6dJ6K$@^RsA3AWn8a|(hLN-C&{H~) zd0?`Ii8lF4Wq8kF5#G<1PtA8!@Nh4P{9p-Y6)sP#CA!4q21q{offw$Lewxp|1%f6I z;B&qsZ8oBio3u|MI~ky@*`Wp5X&o_jRohRg(OGJPeiL;;fB<XTe70PJrCLr_n0U)q zgMBSMU(bTl>B)GQf13H|tO&vP2eAsW`W*!!$JDzoWh`5ci4-p@?Mba5Av7;xpmT9L z9PB64VGvKVvw<1a`4=a!gp}#2tj=8OvIdoxVJu_HpVd;vv>g9&e0-eQDvU(tBv2xO z33*nC664eurjLEYH<)99XKD2lD5(R?x}!qs3X<AivlU34^CTrrGAgEp>DZ`*>6f}` zAuXmQ><CBhsGODsU4ecMHqf1Cl9fx7anvSrJ=V9t3Ofo(ttMF|%ditlusg2ernX?q zWQCYFEBjY8ODk#l8T){IxeR_*M>TC7+G#bdL6l!;=P7;o;tM!SAky}>#3Yg?)h~e5 zawWDPey$(rP9o!OV8Yvh-l77XSx>?wPj75q@)BCqC6<T0g75}H3*jol1_CxbiIK@F zCkv{qo-5Nz;1;ArW?=%j0G(jKT^NDi(^=3oS%Cgw-<x=b+bJv(QYg|UtwMunup4%r zx^xK|hI|WV!rvgM<39l=x$yIkQ{nar13uO?Uf6PHRrMh#(`Ewa3Dgtx_i4=Ys)Bxh z#DH&S<U)L$U8ZheMM30Tknhe{*9qOuNwdg_zX*LffW{4l7O7q=hk1>K5v1rNZ=iC{ z3v--rfNR{%8wZDEhL~|z`KH8NE%Em>g_jM5|FP43ST`>wps~sttV-qEFeX<4d}IbM zJlL>KOz#<hkXpcj4X2<z<Ht31!mv)DW*n%GTrQgWfKw7H<j4lQ5@dSGWOWJi-(<R} zm%LV%p~8U69nDTUmEjVTxMk%G)`y<<cV;~*C#*6@*gvGE#J<iK=JK=S?`gS-qjm!1 zb9)GQn#V=M<KOrD1Z?ty3No>Zx5-6$9bH`HZgPM|+==#v$$^PJjCpXrs*ELqzdJoX zH(xqAHzz0O=IN6YPHJ;#@-r{l@WRB1H%?pSY!!OpzTT68Y0r7VnvQ7?J-N#(i6^~b zpk??ZFg28C0Dj9H7x?EvE&^o5_lB|98w9s7APRd#k;2W^t$Mv)Dpu+=zc<dW(W})p Ix(@aE7dG&)KmY&$ diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode_sync_dataset.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_barcode_sync_dataset.cpython-37.pyc deleted file mode 100644 index 4281a198171c166e17b33f0c946982181107e47c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmbVM&2J+$6t_JenIzM0nr%TVp@kD7sHD<zLx9@-K)VvE*j>IfiZpV@-sv<G&tN-c zQ%#WAg(K>X1E*Gd;y>WLe*{Q#<y3Lz!ii@mZPOwlgd;z{XFtFBJ-^?}?Uj`lf+1df zOMmqd`rR03qYcV7O!X23Lk#C=j3bPVPI3|vyE>5ztCM?UKk_l+WWRA7Fqe5LW+)}h zpRXz0NlEIQ5Y}M9cj!5enhW11YjO9u#o8=nE8u~xwaTusj<Hw>5!PUKQ~y7DUQhj$ zz?at9hW%2Tk;ka_$|>Z5dboDSMKan2rF)yoq+tB<R3vw)ri$ys^*j?i&gqcnYLh=L zd7?S18^gJ06f6{#5EBiC3$qFH4or0)ghtQNj8v#1F|ObdMuEJg$+4r|6MPh6*x&bN z&KK~E578s^B@*5FPUTd1MATjFKZ9EU81MEP(t(I|dkIwSms8D^j(kZo#Z}$<oaPgL zPs&0@;R0T4F4U_#N^z;PLfF%uD?Jk}xJZl5vyOsds3}}wKO<@C{?|`;-Wz-dm(_so zQPv;Quc??0b_7id!RWgKE)LY7D7jDx$fDevs=>$EaG)~H-zjM_qA7>Fc@7?Iv}FKq z4FRx-iy?$Ppt_LLEuL_5bBpF#Dq@|D!HtefW&Pu`TojZiULft4(|XNBJ3lp<8pvuD z1oC|BlK_Xf>-bo%z|P@41tD`DKau>a2^Yz9Q)Vg?Y0Md5+<XEcFD#28h6ma-#86h# zbeQu~46#mc8gUCm+WPH9`9bT!_UY@!`u>lHzufd5Y^O&r|9oq34Yp0)KKe9)rn18@ z#I%}a$&a8|miWLDKgJBF7*?X4eU}m7jPnCI+Q-P+Zbhv92{6Z#k1GGzJ3%wA@|br6 z%^I-!um&Q86aNGa$gD97G&Et=sG!}H(9LJq+Ck-l{f)6N*mt2>&NX(WA@t$)S?T)! zs9OJ0Jr;e_Pq~hl-?fLMP;xzyB0ezuJly#|5ib>|_H1=(&z7dwn)gQMYI!ZmrD@OF zE2&QQqBR5Vj7_$hQHMX(k|yWdswSe00>GH$1rRiV>%FGjfCchc;!Cu02~*TOXH3*Q zrwkx9oROyD^12c0Mi`pTMF?8GVR?KN$ZK$<-T;Bxz-1f|7Zco?OUK0l{8}U=9V~Bv zPcMvuiO94GWpkE>agiq`<8mrrHTwO3dH6*G_OCV|G`#(1jF)RYe{Xk8<tS>GRMIim wGCSn9&1#QINv9UnQld6xn{Dv^xL}i<e`p#>bwPyCr~wI~W#8=hn2@*e-!ZP^G5`Po diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_channel_states.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_channel_states.cpython-37.pyc deleted file mode 100644 index 6038d3045827e5945d234206231f566dcaf29982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmZ`&J8#rL5Z+xs;(H}WloAC&#Yy2#BoYMzln_xwLXi-nu`F48-o-Izug&h>5l5GT zS53nYxKk<`YHI!jl3S`1H4P2SIthXxX0_kWjCRJ~&W!JOI!y#3PF~WF1fj3SIF}A6 z+pyIHfFXuclwluZqmz{Qq&_X*hSN%&%=MQr;^dh(YcQKR+@3X=Q!kgnirqP`eM`(^ z4c25W);2!o#h7(s96K?d6SmA&-k{gmZ!z*1^|}lAHtONZ&hluq56W_MK!xCGs5I4F z9o<wkD^ealmHhdbi>Tb-6E3vc&`HM6Fyx2DMwBzIjJCj#a`6*nv2L_YfVlbPq`2GM z+g@BT*4uB7KCL@@+wr^4->(NN;I_aWIRHjn*hb%lt!@EmG{aLoB~vuF0&+}_9ZhBy z*w&n=YubK=YulOHU~d|mA$T3$?>QBTlz*8YYDps<4yiol`BdiF*%K=w3g4q?8l}17 z)$)!~T<Rnj52Vax&-J?(OHjF|HK?4r2!5kJ%-j9O?=n<Qt$skV3orQbe)o3p1QM%& z9#GaF(ic>e!H%F&E*RYkxR|IQFSt+<U|t-QDtMR-1C?lgqoC1<#vEeP6mGE509vC5 zLrD`6=0iw3p*ol4fJfX!4rrRhBCKg?=%1?Zhkv)WUzF8VlLv_Zzd8-m1Je-HT_s&C zS3&EweQzuhZGt6?HS*n}G=}epaaNSFWqe!bWc&Z{?4R-MU*svx97yxez(i6x@>>O! xG~-$(N4#>Vl(eiV)J6RRE}0PTPL{KA%I}#8RBHfj;$e@pEf*7u;5Aq_{ssRU6yE>< diff --git a/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_probe_synchronizer.cpython-37.pyc b/test/brain_observatory/ecephys/align_timestamps/__pycache__/test_probe_synchronizer.cpython-37.pyc deleted file mode 100644 index 451154877a4815fa2933f5b125bd80fbddf0d4f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1785 zcmZuxOK%%D5GJ_~t!-Jh<VOs+=nF-G1yVUcfF6pXaT>JfAu!sekAM&$aF?{a*1kYe zsTJ%Vn&cYv+M|u0`cL{B_7tEe|An49q$F2z%Ej_E!{N;L&G5_3&2<DV|KnG--9qSZ zvsknZm>k2e{(_Dpj#HFjim{oKlu%+vhq^F2sh9cG2bs&gSBSO*IS;tcTd&YdOxIww ze!0N|;hwko8eiuduL*CjtTqo3?;N0!v$DIjvf4hpE$^<#Z)}X5E5dtx$KJllcljRp z)Zyd_3iq!e8WiHj&5C$@0+a5yvWUc!X&#@+B2S(R85<ST{Q3U~M)d=98eL+JIpNNg zQ=1imm3u{Mye#3~F5><jRFfqQhvVAir1mOQ;fhpF<yPLQ4=%M%BnI2p@0!l=ac!U< z!4K`tgKHxUordHk4bmi6C5uJlGs*Ii2z|PnF{OnZMoh*97ek$7LeZ_&T}5|F6Xq?g z&dR20f-K3c0hqB1JNpyKHaPIl?~gtk{HTOf19rxEKVrYId^&iTv$)7PyFU>5Gc_nm zk*gT`qCA_b!Q&(vs6>lTz~wO;2{@akpuxvSS}1)KNe1^75tx0(bRnllA{OT45lfTN z%oC+qRw}DMoO!F3sOp!~raKaPXzVS5Q^sL+039M7+$Q_*yV!LIUVO3xvKyM$U}12# zG=B;cpbB!_kopo0{F>BG?bcrH*DZ}N$%4GfuUbGQx(e!`3V=xGWKP=lv1K%L>^;%} zle85VSvk=nT%$W_5wmotATZ!_G?YvW+MNfdnbgB1=i-7oS)?11Mbs%HO-UI^<E1p& z(fCrRNvbV3vu@LDx0k{B0Cp@E$bs-l4?x&;WEXayzh^HO>aNir8VVDg6!~3oQHod# zE<Iz-J539wLrgucrzIraEUD&EqT_2~wXEkip;KS6G%NDh1)*uil!4g7`xqt_RL$6z zAI~a*lh>qnP5nScK;f!yG<kvZ54CgYYVQjF*2CyOO^kkq2k1NWJ$eeG1wABk2dv6H z=%AiEt09HH3_w5wNWC~MlxR8+6(pPq_bVw2+4$wuWDoTr8<kMa`cEvK2rCOc3m0w8 z;gb7cstFb-(V&Plq%h!RQf`TdHJgvXa(WL0%D%F_0P?Wsw6Q#dz1WnsX=XGyT6lUe zsn9uO;Fze6#xJl9k}NXo&4ZB8ot4ZPD!4|-J8&|@*4^9A99U=m=a3;onY$5@@0jyj zG??UxHu}=+OH)MD%O_bmox%9^qJsNx6>ooDy#3q7+kd-mZB5wfpsmy7LQkZyuEVp; z<d|-h@VsS0OY<C?+_8{ZAD4o&nA@}uKF<n1NyQfiOl2O@HVJUxw7p=jv*lv~s1v+T K-X~`KX!~E$i^J9c diff --git a/test/brain_observatory/ecephys/ecephys_session_api/__pycache__/test_ecephys_nwb1_session_api.cpython-37.pyc b/test/brain_observatory/ecephys/ecephys_session_api/__pycache__/test_ecephys_nwb1_session_api.cpython-37.pyc deleted file mode 100644 index 0f94c87ab706f342b405b308de08289de7b75511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2148 zcmZuyOK%%R9N(E;JC0vT(=?B^w0p!z*o|p<R8Ub$D-fuP)N&bFTFrVU_SpMkX6(dK zA^|S9R_Xz9b_ADx0}gxyj-2*}I7Q;X0deSw|EwRlf?e&-?C<}6&3;s=6fL--AHJra ztXkIZ=3{=9Ve=t8iouIn3<Xw*2tsC$159wX+QiA$9Ld9K2P<KL6p+PnZ?#u6?@5U{ z9I+hBvlUigtE|XM<CP9N!>r6IPpmN-BT{DgkyWdngC(nmQfHs)?nBsA@3(o<9jQlL zDG^6$Av*NE1c)zDgXCxs@Q656_$swSs)_R%<pC-4sgTF0rpH@hJW%}RUh|#znst?k zK38?n(niJ>Tse3gc<#ZYn%J^Vtci7IsdbGe_{>6<wtJ4woq(eZG5idlBAq`$y%k;P zt&Xv}sf*trT`~x8*nO-XWJnp1${5m>aaU*D{(`#-+zxQ-IWk#eIY<kngXIB#x`dl_ z8N2}ak4yOK3@-xy^AcW~;bp*oUBW9fybAaqOZeIhU+?4RNadF(7iN@=jN&d)F3u>M z8RfR2K*a043+&Ra#kMkZf6m|Am|Q$F8HD_Rh3*31d<Fk1!!PMA(6l+(HWFiWiXnqo z@AP)ZMs^W@?=tAy&h-7X(02u}oecZMU?*sD^~^f8L4!T5z;h)3glgHqcd74yzQ3k? zz1P5IwRf$z&34)4Z!yGh<rzA4K+>5>V)+J0Ix|VE>PC|7LgQXNeo=JcdfXMt)m&-! zkSf=wiZeHkT;1jFfe5(U$U3%R8nyxb+E{MX#{c(e-F+Opa$uCqbteG_&2BqRMw!)E zx^2m+<}P&u5%paiyF$BSCc}i}Z5_)|J>xz%jbFp5W5$S-%s>sfG}9#>!7PZsH;{F_ z{*dZ{q=EZsNIP74x5S-o%OV$<6bD*F9j_y)S(VomLzo#-IS8ogdd*umLgnq9e-Adu zW{3K*^qMz3#yd084e>!0NZZj=zZb?s!M!-*p6*J{#r^}J?z~FPDBeLlkYe%_$R(A; zk){!c!9HIzmM$m_?zI2)>TQvLztV&%o_v?H&huvX8+iKg{B_vY5ZP5)go9w9yhL)v zL7|2mc!H_g^)%0qgwiU_CnHnN)KPtrNZZ(|9LPBI=I2mqD=pKaP$B{!qBbYFK_oyD zCycCq3<uByNkg7i?<&Qmv2b6?Sf)0dTxl+mBGRO~@FW6OMYa~-%bqE+(c#)#&@}Y} zPAbqEktv8uIA>{2b!oy)hTxp@AV98Cr_V=<R6|Z9?~o4pK`cW+BYp&N3C(4iAJSj| zocKsieZDIt9g%z@V;}q}w7WElc%aDDWrq%h;$U`Rh+J#O5fdiHB~n%yaJsG1oQN1d zs^z3PZqpStJ=00qRDbRmu@j|<-A>vsEO`z1UY^~%-TDG@r&_d2S>30HG#a(;M$}lN zZ?$+dRINDSk%EEXvH4rHJ{NvVL1=F#wB0ui+{y+|v3|ppv*AlBA}{tq?U0($m`~z- z^=8g_G!dDIHy>3f{N6IPo{Z9UqjZ`IWjbTe{8ZJu@Un^pRB$#B+_;F%y0f@1Be?Mv z-oZN=eG_fs0&=l~wy<<TwpK}3%#a4cm(aPEgvqg>Diq>YawGdVqNY^xiuq{HgRK82 zzWU7l`8tmvYw6SpsqB+A$-f-HS)n|ihJGBAQbJAdYAKF+=1^9UrPp<^nik#<V>Sr* S9W!joxLAfT;KpS;59>eAc#P2i diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b9e555410291aa7358dd17d7ff2e2806a99d706d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYL@v5Epg42DOzLIfY=3Z24EMDEU3Y{YJ0$nJ!5aLg>5S!GIFU&G2*vh@+{tjrYR z5C4}C@`wBlhXW;|%Lz)o7rfPz=10t50;ksMySKWkwv0b`o)=TIVQksJ7TmakBTzQK z1a%|_6N7YM6B{J1g|XRYHcMX__6bJ~)I0b`$%Y^sZl@D+(p3wdY^>z$0a9$U#u`gf ibMpHxbZmhjWcIAB_2iSa<0jwwvwd`3z<K%cAyzL@r9=$? diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 0312bd2eef46223703f4e77940e1353a33aa7ff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3220 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 NBC*C#Cw!|}`5WOa7_R^T diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_dot_motion.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_dot_motion.cpython-37.pyc deleted file mode 100644 index aa080163a8150fbee46361c62c144578151eed39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3958 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 XJOk^fKy|CN&~)6o+jQsW9oPCF$0+Xr diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_drifting_gratings.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_drifting_gratings.cpython-37.pyc deleted file mode 100644 index c3fcdcb60d31692874039a255e3e8c6b0c99beb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8458 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 Zo6?oj@@e^$d`5l}`N(N1$qT8B@;`MtIf?)P diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_flashes.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_flashes.cpython-37.pyc deleted file mode 100644 index fd409f527cc1cb7d5e92fe277835cbb1c170b0b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3450 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 Vm}}ON%<ERW)3n{XTXV0w)<+1!YBT@< diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_movies.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_movies.cpython-37.pyc deleted file mode 100644 index 79d27e4a34b460d2912ac3c6b626cd8b0553d67d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2067 zcma)7&2QsG6rZtU$8kRTwN$Wts0)Zy7HulQ1)&vcDGNf{=Ca~qMY5)uN!N)zHZzm5 zsmg&(kL-~fhm|<-FZs%;{{ko88z*T~7O}QG^WJ>CnfH6Y_xyFc9TIrtAHT5s0U>{( zvV3YF9KfevLBk2BDT%6{Mvm3psKy=cre5YpKE=6OTF-(gu(FpnvM>rM`Hpa(*DndL z3xDoLO+m&j9`ME`nbW8ZT4%h$L*9Hzd5gF0=;qpJhi}-?t+mljzGX+ZIekjH+gET) z(!Zk6c4^r;&WDqyLhB@#heZM-?LIS8#nR*aED;))JRXYT*-S514RQbSaX>hLPv3z? zkce^uK2z>olE~#QoL4J1@reHM^&vw%8z1cPJAzLmz=q7p3$OwEXdjN=>F4JAtVl&B zq!IkFQn`ZRnilEkPof&I<?r8)z8w6Zh0+7|jPc$H`-#cf;83z*E;;*rAmo`I<b{xW z2yKp@44xz>1DzQ0uwcUpI~A}uO<@I}>>HuY{)u9VjPnyPd&W$zX8WSTU|*Xgo2FA8 zGs)7KPPE++%L=nNv!L~gS$X$Vn0U3iP(p(X%mB=~iS8nDgr0wT8=T&M@9P7YK@4YQ zB96;2hST^oMY$EnKTcU%%_y{QvANM8y2^(J1$%fvt-cn{RWNWR24fKjyYhxL1YV(~ zvbg{zW<|2GG))|Z^7+SWRN9ld*&9vMbhejV$Fv9W^p#*bmn&Yluo<(;^5OslLoOh% zUecebp%=g|kemx=3^_G%^oPcMK}`*GZw|fjd2LST6lNabjAfIDY;xg_&}}TQtSj1| zcNW*&t0;ek&Ufp|gHGW!${GS&b`CZ00V8O6Sh`x6D45E`#0l4>r<gnyUDvu^))&T0 zM`kyGvzRrIV{w`@j#;Cjo)F@MG^8D>?t;9A17cxucmTrda4?93Yii)VqdzhJ!ebXa zR$H(Kx^3)kIus^4k=igh6j6vIjSV|VMd=j0Y<$BE`&NO+>Mh(?Ii%hOS-pde4gNI) z+SZ#T)9=9wjR002sSiMUy+5yD=FR*ub@XsfZM45Y4^bZn;|8ytVw|5?uRS{&PJBJE zy1&v>t6M8$oWHPou$uqX>W!8DyVa5W;Vl%^4%|AbFM=M`M@;6i%%aXHQHeZ_6*B_$ z-82~qz*WS$U<y(nsD|TBHI;F3#!^&5R3L{z?l!OKrrxz@WWuOqsMUL*srRwLaFj08 zsnSa%7tc!%d8y0#Fi)qM)c+f*mJQXy@I$a>%XSs1ZMseGIGeP3)kiSf-HH5ShI=AU zPBSQKjx1n^L0zrx6$MaaN4P>EPotw{8SVY6g7y|!*IP1WRY7~}#nYx-^w}F&x|PQj zg2+9HOY$6kVxr2$TE^4_ej1acu=!<4X+6Bb<!eF*kE*)*6;?xwP(a~zS`=P))9ZM< H?cLTt_{k07 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_scenes.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_natural_scenes.cpython-37.pyc deleted file mode 100644 index 620ef215a2a92c482f1028a10a2fae90c97ba320..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3884 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 Cq~k*X diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_receptive_field_mapping.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_receptive_field_mapping.cpython-37.pyc deleted file mode 100644 index fa67fee8e148def6758ac1585f73092204c7c03d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6578 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 diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_static_gratings.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_static_gratings.cpython-37.pyc deleted file mode 100644 index 3735d7906a255fea7cb8b8c174aa0cf8c3ea6a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5676 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 M^r(AN*<?!nFC#6;W&i*H diff --git a/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_stimulus_analysis.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_analysis/__pycache__/test_stimulus_analysis.cpython-37.pyc deleted file mode 100644 index a8ede68b3e22a3233f4b2a7993d7a0e2e78432f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14012 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 I4e#}T0mKw%k^lez diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4b00cd213c6b69df8a36f53a1e2f24d40fd2f6e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmYL@zX}2|48|)sh~R@bXa_eD@y{wQ;#Mf>HE6lo9+#eSqmvKf<SV)Q2yRZMgZRPs zO9=TwR)axbu)_TcxxO-f>Tt7QQ<q`IP7FKShp6-TkI!vAReQpk6db{h4O}3!Y8jx2 z!NNpgIFpJM1}d1bI<}-X&M0yTM->z$9FVi#^M);DLQ2xq;DU~Z&z>R0x|LX9PD)Dd f)cA&U0^?C??Se~MkE{0Co1LO<JkIljZ?^aXcE>`l diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_ephys_pre_spikes.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_ephys_pre_spikes.cpython-37.pyc deleted file mode 100644 index 2dcdc13769ffad0e2bae6e0852c74882d3377be8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5679 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 X=rhbw?u!!-Nwyqh;ofgNvzz}vr1d*J diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_naming_utilities.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_naming_utilities.cpython-37.pyc deleted file mode 100644 index 77d45d52b0ea30e4a7187132885432edf052d036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2876 zcmb_dOK;mo5a#YuvMkH8tk|(*yNR9jrJ%J@w7nEX5hq1}0)Y>0dLaZ5EA5)5O_A&_ z<yMAsDB4qj+<G($2R-#K@!C`VLJvh}mZU67PJ=#3>~d#!W_ISA2Olmj)-8C#U%%&n zu3FabNEFW^EFQqnHnS{Y2@+UN_9YHAG;?hD(x5V^I&;L5)^Y7}UNA{7>%tZlQ5AC@ z^T`V`u~W--JbJa~(K1g)k2&T=eM%4REEIY?_JWFrSp3oYfjA3OHq=G4q`fMZ3hf>N zxt3Tqa*bTBom+K7tYmy*RooP77lpMz<?@A>z$xwH#mpMRy)JHD6sIV?o?FU13O8<u zO><+jWa*Z8L)`WlYAS}u#GMP8W4A4G4n!(PCf^YR-+#otQ{tY~Gd}UC!S$}VXRKYC zwl?z_XSf|K7jM4K))|Sn#u9H|@7;vNj=AGX0&Kqi^a`8lbEI(?P48T=9NFA^b24!Y z_-{kB-W46=e@l?Btj_(HSQ`f&lD0xV@I%iXCVt>2zSL*Ug!cmZp8PJB{X`09Q78Uj z7!0)wtkSs?@?@xZ;0~fwU%H3UP{C43SIJoNL_6(S2IppZPah2r4+GG>S>89w#)n(w z!;i|>EKQv{>r)$Up{P&MS$LrOtqP1sF!VM|iFHZNtrz4OP3SQ@w$I5qg)E@Y8G-%) zII)ALfKk1FB>N|B;Gf7&C8goe+2TUD;c(EC%1xs2O&KOBjYT?_NWd-h(l*yxs>D51 zfSxPA8S<dR(ux5&traMzwWybHKa}D(OD%wDfBgLDlkV3bsk{7$i`^domWQM6e#rY# zDENn68J_BH6w6TeVUFUXk?ub6dtL1(^8J|iPq-&RHVA-2oa~`Fdp!kLxKR((p7JD8 zqdnP|D7iO|v9Zf=W4KG1u^W%l9n|Cgo%b~a*M`Y@P$vpouQL_MkIR9aPALCWmKgqP z_!Ne{Q&DJ>b4w>2;8Vgs!&@+evoLCfnW3sU&7lBO=!u%g34bjnD%sQkGQDk(c%`~0 zz>~pn17K(Zb+(oj7FLlv;PJS^&YA~VNo{{Iz@Vke5aL8}09r{MN1>KZvq)~;m!Z_o zhEV<?=9lX!j$iE-LLEA-P%Xjr&H}0e?`1U99d<3xK_9Wg2f-Sb%3UC`QaOiT%`=u4 z3q5DE#Zp4M4Q{&Q)I!H+V73j+POU)Y)qt-Vz-Kk~!MY6TdkvymK)ob5Vb#Ahv8O5F zDe0*d+(FO&*OY1t6~(R`#K{O^5DW+5jFYd+rOdTiJwJi1nQLuGqBWp8)OeAS{SHl8 zkE@hD<VxMbBW6Bo1J(|Exc_CzOHAxXF!WV0XZxOD&+WYP*#}P_!)1t{vyk;ak&I$! zfLS56z}0}qTK-#~S4}u4wfKPCC7Ot~T3dBeC2A8^on@yQkB}X{SiKp(P6a9#S`rOo z=Yyip?as8g-Mq!^j`Przp~CbquB7&Ws}pA-=GdVV1)af}|C}fMG18`knfgsx$U~D~ zCKAT9iKc)}Tba&K`*aYAVIV)lG}OPqR3q@x2CEXvY)T2fHM>~VtJ$j9Dd<U_^@fop u4Vv+0bPIG<sZE-;O<D}K0+s8}IJU_O+c4w)JZiWN>uhX;C3R9KZT1&V1lN%O diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_parameter_extraction.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_parameter_extraction.cpython-37.pyc deleted file mode 100644 index 40540beeb2ea7ef180f6da102c522c0e5e5f3434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1924 zcma)6&2Jk;6rY*($J&XLLIbo2P!LGXR>A4VB|<o*w3GvtrIH}3#l;$XCXUH^cl&1C z#K<|&^v)U7LnBW7OMB(iThE+$Z~R$PwajYX%<R5>Gw=6)zxk?CDKl*GpTEi%dB*;x z#iV&S`4YR?L!+4D5esP)5$}o6<4m)kbIMb>C+w7mdAG`|f?E|-QTb0;SX3od#?e<x zY8l6ps;Ctl%Zl%^VD&jhX7zw)9~#^3^`pLNrV?aNTMbQpY(chdH;LQiHfbCux3HTW z8W%>?e>wUFr0vF?T@14!`!=}^@~C!4Mn-S0)B0}GsqH}@SM4N9pe6z2VB^QD)y?%$ ze-Mm6?WVG=YnPzYx<qecJcO~eE7k4Ib){2#P`k3Z9^(;f`$-b~#eiU%nSai1ect%q zXfO?VAXT*`k7PV(+>9lLQu2C3$B#@SNp)=6Xp{6{U>bM3t%m7Z{TXh3C_5VejUx0= zhg((~yVU~Ojhjge!#<KWfx(t;Yx;9*3Y(R!NIUQ5^xdnVtfqskL>^7hDfon=K*I!J z`PrL+zWgSj9q@#7Fau?7Mn%gis-L=Jx<gd()#MNbIs{di8Xc^J-BtTjoLKgZTXDvJ zJI9&zp5=z@jGyoykd*h>ckDinNGe_r@>wAr5OQGwku%z4{<nJYH9!KHXHuPgGUiqj zi(>4EbEdfuNpE(nKmeU4^OKfE__bQh;yUdxVd?84H8I_&+m`76Hb!*BWqg^#GOniC z5;9Z|m+enDQCta>7d{;nnL=risGb&2IN{)O7gh}UDPl4dr~FWuZR<Ve$Lm9Jn?1O2 z;tl!GyU2!uEPmaguMc+!FT|--zq8lDZLqz#k$K4X&L6*1dwv6`0-;9)FNXd^PGNB@ zq%7|=l$G7!^pg1#rDS=hk}O9W335OM1iEB04=J6k+%(8y616J_IuP$NUmvHsZ4u-p z=X$6Ii*RrJU%21H2<BZh%oAL2AG;g9vRLC~4)lGBI;oesL;WM1C}h+OUqnzKa_?L5 zm^;)&JzScTK;XFq!w)8ea?)x?(v0auDuXqQi=LDzyhDbPT+Hv|m-2g6oXhx^Ax<)p z<7ELCa5hbZ=tCR0MDF7R>4Ohahe(9<d77I~Y=Jn}UP~NDtB2cT;uPvr+5l<yW!hjx zSMVjQk~v4_Ei_{ygsXTb89fsjoF@;5&xi?g_)rNKL0WSlEd;rSj)t~kVpME@QtFHN zE?9yh4&l|wom&0Rby^)?r`74z>8?|t3usi|;(qto_Cb$oNHuWcbzE|F0NQHqw8SZJ dm!1DbFH!wS?~terVdIPC{0csP-aqgA{{l<1<b41D diff --git a/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_table_module.cpython-37.pyc b/test/brain_observatory/ecephys/stimulus_table/__pycache__/test_stimulus_table_module.cpython-37.pyc deleted file mode 100644 index 16044aa7249800e5189bccf1b02620671f0daa80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5578 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 diff --git a/test/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/extract_running_speed/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 093ba8e2157a37aacd2fe1302600b0706e4ee482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmYL@JqiLr424Iq5W$03=oWS&;!i6!VmB~kcY+SPW`@c5v!#s}vGPi`9>LDaY#}~) zUqZ+WS@e2cC8GNkn)+(+Q%jnenA-xYHmcuRKU8eSe|&DsvEDL9*02XV%;5}F>p4N; z$-+n@oml&T#D&m@ea(91a?LK`AV5*V4kcSvvSG_CA*U>l;K=w~&YmFoSZ8=i5sGBu fk;u``a6q(~F^*g^W*F*cXL9iNSmCt!?=4neH}XPj diff --git a/test/brain_observatory/extract_running_speed/__pycache__/test_extract_running_speed_module.cpython-37.pyc b/test/brain_observatory/extract_running_speed/__pycache__/test_extract_running_speed_module.cpython-37.pyc deleted file mode 100644 index d107e319662525353329c96b4e4fb8d3732a45b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2380 zcmb6b%WfMtkmRm*S5Lp<G%utH(2IarPSOMoQX`1#2(5uaaGV%T7X}uqC2g-Q?QTgb zu?6YSIzW5tt=CHEslU<B;I*gzLQWlWC0j|ILkV!m8P0<<oSEIPs?`#Lk^J#vc(a1g z-x`??z|m8f;x_;kQQSekUP%XciBE7&vwX{(*?z&Sj_;V&^*!bs7O6$;x9Al6C58^m zqY5p+S{>D>LtX08A}!G}t&H6<@#koj*4`q29^@7d7d0F$(K$L#7wF=?wU5VyF40R` z8|b@4@e5R6{s-=cT6L`Ktxz6BSfelqOlva5JZyeOdzfNM-g-kk(2`awa)7SK9Lyrj zC79wb022LzM!+@(LqkWBLu+IY(147|(4An8!Mrofg0rG53|xv&$*=Rnl5|GypftwA z@^=uZ=V%+fLW9Df40@bXYgh(ej}qWr99DqWgOkb_f_ly^i=&bb-@vAt*BKP|-7&@p zB#RR(Rb!<JR%+*RgBrN!wiM<Hzfn$hA`jA}Pgc79%F0TdWIY)i3ZPV1R??oFqV=+} zgyhQU9!b{C6iJ1$Gl;3O57RhNcA7DOT2k4aG^EO=J<TUFRf-N+bQDBkr&FI(9t~v} z(3txbtqC?k5_XxIKerw18Op+p{RzqGrnJ{#eu*>9!h@)-JgvqkoSRXh@8&Nh>`m|? zaeh{<VJn@ps97EQrhe^x9e#O6T)n4DvqP%YWbV~o7|E2M{E6QEzVUc>M=&mS!-J4E z+ToipIoVxL!YEB>`1vkNUW;8FKoJ2<vx5_{`)%Cb6|rP1Sr{FK`wV0|9pIoxtC9)1 z+U8-L1Zf-8z7DmWRdy^nm<)I?N#bNb5E*0CFb5YN1$itR*@+^1Nm*z2EdYqrNDadz z6?}<Q0A40GcCd|0mZtQt^aKm0F>kDOQg~SLq_LOqs~}w`{0c1mx(0@TbHX(ssLHIY zE-GOIK%{bm-+<L$Zf-QUzWM$|u(i3>{C2a|44$pOTz`jG{ep4dx5KzC{BoS^rMw%; zI1>JR?gv~+$iO_A%Oa+O=r3RBc%;i;54~#p8!*LX01`>4>r)I6+Q=cf4iKsZx9S$x z?SN|uW$V-fKlT0nl1`5-gnX37-5eNaJ<jrjyTB-nQOrMuegDpR!sUs5XC|p86n32D zyZ)nTP@1n^Zm(~=47PV#t<Bcg!HcbC^I7nGr@7M%zIgE9{{2Vy?%vDuy<uwj%l{?W z5kY>9T=@FA%J))AG!7m{=Gnj%cQQ=~*8nkH6b+#vN<^&z9uVE4PMu*vLO@5BL<8Ln z9fR2eXN<)oS@;Q41c5HJBHfntn6~E^uosU3fFLNpir{^S-mT>naz-H&iUkztoWNtP zfefg%TYg2HBvEki5S|M9!h(=-x7X>3AUo>hq-j~}^LqYF@aQ@z_<{z@8t8nUd0=<a zg`NUgcmNPy#EWE+^zWNwyfFKwWp`FM6D9t&kIVG$PK&?spSo{cXr=BbPnS;cY;&9I ztC?)&`g5)vb{q>SRBc^A_mFX#G&xUs-8D7H7d5y3*!jh?9OSn&@e@s~0+B_MQ4_Zh zLvs7$PD~ts07``Zc|aA<BiO?pv>W~z;Pqv5Q|0P6=)`SPZCtaelIXQFo<>XvuD{2= z{%%3N!x};h6^dlkclY9B+2hQ(p<L*yF^A8Qwa?_a_xv`9n<`XxH{?hD9A`iDV$MX+ z4!i9%^~+GSP~eiseP-@8<D*G{ytvo$w(~^)Q;3@YJX|r}7>{l{nBZ%+XFK2@f&ITe Cv6o%| diff --git a/test/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/gaze_mapping/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 29164494feece7ce6cd42d29525a78f2e7db747c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmYL@zY4-I5XMt*5TOs^U^}>ph<{db5w}3NG@*vJmypCt1qYwS$yajq5!{@-4&n#j z?~dcX<JM_9VkErZps%kUKPA*G$zecHY|qBY?!kON{^N7q%=jT_A2=LAWfIPS9bX|7 z78Ojn#x`*4G=_p`-LVUNYa|aQ>WPD*f>Kkqu4zM6dDJ21(t|-^C7o>{THoa*T(oGw bIfG>`gh3O9$Xxdv&Ks*vwO;gZy~*qg#;iVx diff --git a/test/brain_observatory/gaze_mapping/__pycache__/test_gaze_mapping.cpython-37.pyc b/test/brain_observatory/gaze_mapping/__pycache__/test_gaze_mapping.cpython-37.pyc deleted file mode 100644 index 4996182cdbc832de50c1915d8bf6b26600634bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8262 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 diff --git a/test/brain_observatory/gaze_mapping/__pycache__/test_main.cpython-37.pyc b/test/brain_observatory/gaze_mapping/__pycache__/test_main.cpython-37.pyc deleted file mode 100644 index a9c6f04bae0c9dd0752dd0c3030b2db5807646c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6422 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 T$I7Nqy5olIk&zURd1&N+rhK&c diff --git a/test/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 44fa8dd7297816fe70c0b5a2de5d75355f0f93aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmYL@zY4-I5XMt*5TOs^U^BRhh<{db5w}3NG{J_}OG#o&N1w&XS90|c+?>1&;s@XF zj^n=Lws}5bB)s1s)mOq#88vHi7!fo(vT1gBFrUVMeBy2)PQmyfpaNYe=m7_@K`0$+ zm<xkl5Uw>CN}_A4A&9+IBG_nVEtEB!4P~2#HgwIS36U!g7Nt{kwu9*Wz_C|cN{cp1 TS+v7*yu3JlZOkft^Cq(|fDt;? diff --git a/test/brain_observatory/nwb/__pycache__/conftest.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 76bc29b2b28edd153c93a1cb8bc9e3408ef049af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmZWmJx{|h5Ve!2DiviwVq-9429lu?144)oi3zc^EK#J$iQOhNwIiR?Dr`vn6DIyr zR;K<1CeE#pkT~hy+2{A{XZvnE9uW-n@x}v6$d{Y^hKGY2OgKdlM9`Wf`$`ikJmJ5S z#1nK%!eEOG@>Dp53s+s<W5O|lB`;LaB{4_Bn-bwW&1=nOrDVC`mCAGu(yY1Fri)}D zo3aB2ZNAc?ttD$g0&6;3YQ-ke1)EE5TZ27Ya?4h{V@g|=<7T{AZnzP^3cYH$t@2u) zjTlDgZGAMd9U#meLa+CsgZ^+W4OCiXm6~g82B<0fL7~;WT6_{SME1A6zf7Oe9;CeF zBFg!Ot1i7&9BG12QmNLE>P9Lk5ViB3K2~`Om6hiWI^qk7+PX%DSjJX@jsM*`R+~I_ z=ep&n>G~7AFAlS6p|p`%p;2F0XCEApU_=9I-0y|H39uxCy<*qfIsXF(Na%-G`}e%Y MpC;fmLvQH+0I}+hEC2ui diff --git a/test/brain_observatory/nwb/__pycache__/test_nwb.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/test_nwb.cpython-37.pyc deleted file mode 100644 index 9669c1aa71fff29ed8aeb256e1174e0341188f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1714 zcmaJ>&2QsG6rUN}vGdVTvfHvOQ2Dls)J>}{NDEpa+QObt`Rc03ieybZlf;QX(wRxy zM6R?@uGLCh5mGBo{2TlkzH-_tM=tQjb+%Qh7|Ub--n@BV^Lw+iv{XYdlHY!ye>n*K zslj3_!Ov&#%0FOYh~Wr%S6}Sm0uztGmqbQvdL~Akj4Wm_^CxtMy$T?E<S>g>7!EPB znZv5g>1$joah){^yj0?5iQg*ma*6E%HyAGQ+qZD*CLY+#9AI|u++g?FN)bzy;qOp; z^)=*y_S!gK35Glv`^j;yA4c3i;zEXL5)i!(!-BU8?=HOZXP7cPLKhg^lS^_+GQ^Dc z(5a!wg^@wJm*iFN)Xbn1<Ejt}{w^$LUE(v$Dq|$}GjjwbV0K1+LBA5_oD+-=U*6KQ z#LJ9;rp@p(lr)PyRaU#wK7g`+gT6)IBjseqnNFs@m)9ZwMeK8Hs{_ycL79u6Cedt> zU<VX)e4OJ>+sN@&jyHu3S<TJ8gPq4v4wF$uy)~J}Tn)oy;0I|uiMZlmVwwmZQN@`@ zKHO?ob8A8cjdNqbRc;PHn#^+ZIn*$>)D*VlmYhVP@|uC*u*uhkC1_eyDIs%1D$%w) zN5vC=Le((01wWi}kQxwA-dG$+v4;D<BXJ+(f2-Y3x-TRgQkM=X>-6X`O=jKgga&EC z=#wr_j$}8T@I(eMr<37KcE1dJT^TC=ctV3Q9dOtiMWDgP8wwn5^aKqPKkb3pBdSs{ z+W_aqlCD|@@_PTSQu_VyL`?;UUO`d^hm0n1a1%R53$KzEZjc8=tb%<0)&K2ZcVlqR zxC{kni$h#@kEuxH)yI$JVBHOqBN~NF$5hm)Jm>v+?Eq9=&~dltmCeq_oz38eZ0EVC z=oqfGcIW0+XR~)h^7)mmr*q>;XS0nxCrlVb6R1G*Uk`2KO&??c6dDy>aE@QComvWA z5N2FrjFgc<kLX@FH!!+pYevK{GsV};0=7frzl%oJ86H<;UsZm@hbNhFOMar|$+EID z&|~(P$U?#pFy7hQ2d-8i!c?%lLZf3klWjw^ATaNpMJb`IVLXi&CH3mMq?*%Es`=A| zhib@$OWj9M(S_0@w;%F|xk)PAlCf@(PC?S+Za<wS?Dan|1O`uSCwEGdGH(V{1w;Q0 zZpctK4qPgV3!$$Qu?$mg$6QJvVcy)9KsW`L%@;zXA~%4N?MlHH@7^7Z@GNaxdWB1! zf>*!E2vd8|EWDalw6BMn-u|5z+y}5OH8)YSiEG5f1h=pW4<W0Xwl1u+YvLh%L>(rt zGMQ;>-rAyfI{#@KeYX^udUn|wMK-w^Q!)1H#cjcr2<K3BZTC9b;;#tVc^0Q^8u3qc Vfu(luV0cKwXs$S98DBpw{4ZuW<&ppZ diff --git a/test/brain_observatory/nwb/__pycache__/test_nwb_api.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/test_nwb_api.cpython-37.pyc deleted file mode 100644 index 8ff2434501392735cd841c5ed7426d8849bf6054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmZWm&2H2%5VoCcHd}TP+{z1}=Fr^(H&h`?)f-v_6{3nFMNaJPx|`URZMvi?2LyLs zVON}ZC0{x53Y-|Ht<<U`&5t$T%r`TBGnwol5c%sH-Ngv~36EPL5WEJpdtex1xIy`~ z$2o>KX-FI85k@Rx@eh>844<HE@E6c%o?)NN*VUmGHT3Nz^c#U5f!YHw4xQr-anTjp zK<yTP$Bb;rSL_Cx#0|Ij=M#)vx*1(T4x>-N{T_Wlr{IAnn&;2tx+<v_Wh<-|@~m8l zhL?_8cR5@rHHCDx<B769*3>P1e6ED_k#)u=?aJ|1`$TsEpC^V2%dH>2J2^H+854%} zqlHmz8EP|<KX$EV!jubIJ7qc(1L8L_kHG!=a`dwJXt}WkT~ao!=$gu|IFz(jlF=6h zmlw8BnoC=QReIUk;;pC(D;(d~v|iCO4z*1K2)3Gqk!BT)BuiC6+Y1^PXRuG7DsT3l z>drq6*n0;^VIZ4;L3kIBv6(=W4NL^igk1jomS_5aBAhH}xN3ibzPjJ>ju}H2pB}V| ReQx-x@Vz}>N>Vb8{sVFkqvZeq diff --git a/test/brain_observatory/nwb/__pycache__/test_nwb_utils.cpython-37.pyc b/test/brain_observatory/nwb/__pycache__/test_nwb_utils.cpython-37.pyc deleted file mode 100644 index 49800b73d961ca7ae4c967a4332b23f45b91111d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1144 zcmaJ=%Wl*#6t(l7CofTT0Ts)R1T#YH03k|&4X6?z1d4(pPwb}Y<c00DGoy4t%bqRE zR;>7?Y+3OOthi2QrYayjihZ5jdwh=1ohQ9s8^K7weIgG`gnp>aa<m|L43GE<6Garq z$W^Nr<3w{cj2PP2PYtS5gPPQ$c4$zC+It$ccbD&+)jMZb54AImwrKk^I>D~FsO~h? zq2APnXjN-dCo~s`fE#KHgf8vX2o}X}(4hYl*rA;Pu3G8g*e_%hi}~Fs%?s%VSuAef z$}=INam@UbBn<X!nzKMM>PM+$TtFOUY30y@6BW5FmQsJ0L$ce65)v{<q-^T8n~g$o zdqPG@5f`Ec4Rpl;hOv0IVHG!ElIRqdsKjU5kzVShHqpeo)Q&MlKppQ4bgn^Gbtz;u z+agJ8z^cC`1mlX%GtM(UFsk;sq^f^Wl6(E1lH3mHUm|`-+<}vR&A0D+Zvk3(WRK9{ zm>iOH=53`U$Wlt~c`Q8;UY4^|1Tbg$-b{Eeqp>F<$?oJNn81BNZ5%@eos1+Cax~^7 zO8smMum?nDd^Q3n>QDa4l3_lpZmMiwNxg7;$|j%*?T3WAK;(2WS8X{ToooJ&jcgjQ zy!LwKgThknTl?@F0_B6$&hVG3N4kWjZ9Ku~9W?YS^cuZK(~VMliax9z8Koi3Qs1{u z@Wc|E(muu?H&tHam{VE#ObKx<kS&;~oEL0XyHtD0m4r$cl2_&di3`RRnSseIShx+7 zdu?UcIrYk9%4oO0`qmUH(`x6q(o=2z_X_<QPj!vB0@*?pqjnds;Wp-%As*Pg1B<({ zG;sKrcSEqOX-Xp@eByR;qW%h!M{`!YQUf)V{vhW(Ofp);>=A}D#5zn4?&=O4u72x| LgZtRPU2NgsE8;`w diff --git a/test/brain_observatory/receptive_field_analysis/__pycache__/test_chisquarerf.cpython-37.pyc b/test/brain_observatory/receptive_field_analysis/__pycache__/test_chisquarerf.cpython-37.pyc deleted file mode 100644 index 711b8a799ab5779e89831c0dfc043a170b850450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7568 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 YTs%>nEtb$O6wf_hx>>$3cj4rJ0N_|UnE(I) diff --git a/test/brain_observatory/receptive_field_analysis/__pycache__/test_fitgaussian2D.cpython-37.pyc b/test/brain_observatory/receptive_field_analysis/__pycache__/test_fitgaussian2D.cpython-37.pyc deleted file mode 100644 index 60d50f4f5784f50c617d41c40dff0cffc03649c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4721 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 D(sW4! diff --git a/test/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc b/test/brain_observatory/sync_utilities/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 97e3d95db91ccd1a3f14d01210c55f93163365b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsq+B@{<nJdk;a+CNhPQH?>kKpEHI*1>9 zzl4x4WSyoX!NU6u`ugheQ^L)XO#_A&dofOS57G4FKR(yZOdiNIB;f=)E8qec<qDzn zs9`D%b|igmkV>YnPm$!-7Lsf*lN!njj)t?&@rJJQU?}880~VDp_-qHkH!-J(rD}t9 bHdsTsQWkAcDy!pjI6r&cI<x2>d$YwCRY5<I diff --git a/test/brain_observatory/sync_utilities/__pycache__/test_sync_utilities.cpython-37.pyc b/test/brain_observatory/sync_utilities/__pycache__/test_sync_utilities.cpython-37.pyc deleted file mode 100644 index ea77fcae02c180f48c024b37b1b2eeadce36c04c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3578 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 Fe*r(OX21Xd diff --git a/test/config/__pycache__/test_config_single_file_json.cpython-37.pyc b/test/config/__pycache__/test_config_single_file_json.cpython-37.pyc deleted file mode 100644 index 54ab89cf56469a9955564020c4424b0d5cd09940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1374 zcmaJ>&2H2%5VoCcHv0>d3JM3bL|h`l_P_;I2(`4JR?tNhP$AtaN@KT8H-EBIU`zJ^ z?G^C~AWl39?~p4eUV#%c$+obf!Yhx*p0Vfi=Wlbr)v6O{@z?jB-5}%#PEMKu&OCIL zg5iYIkT^K9kVed5k>+R==US*o6{kYUuvugoPIaBc)0E(^SgAVIS0rXHi6DC>*Lmfb z98ssn4PHGaPMw>)24jQQc>~5Kr_YGp{0UV_&t`cg^)i1quSJPJaFbNTHqDL2B;F2o ze9Xbdpx2-;LRWXda5^Fx$><*A>@vx;L%{iw9<fh=E7On2=L+KZ!bWr*Fg_(~<Rv-8 zx<>Ed`@4E)+^oopgKeQQYp%0#x{ASf9V;8A0@f`aNbBZAu+y<rDtrvCK3RO^E<Jhv zZ^l3jG2#Bgvj<BnYu3a8qs>1DT3bPq?hchTH<7Xd2zC>!u>sXGzOx^6alY9ZZ5D~6 zgGzTyS4|3!yWGpXgN9!)*WFV|{LnTeGMAfM`$3omvC2)?jlD>?uGAnPb&Tp^;&FHg z^Ms7tC=dBYB#4Im8ZOTDUnn6}-`n+gcguU@#l!wW>_Hm$Zudp}TJ;f%^1&9D=|2v( z`YOo8t<>`e-j0C1VF(#~Fq;A2vt@<CcT3+@LA(<RcRK)s@Vn_SZ>b<kVP2-(0yL^n zbX{k4+NLv1wqVVtV6fqcH!gHyfpbXqKr2^3)zG!^s1KOBmeCKC6Hr8@=Tyf}AaTE= z0nG>XKa>MCI&z!07Zk9N1xfrs%0$|<C|+<>nkH<|XYhUtzAuzoPW*>(8?_QI!Tx!O zDnv)9JP-D4)Kd`Q6mbu#s(p%*^(6iQY$n?<$aCnQUH>xHUmfduMfH-bEWZR>PRd^Z zf1*69p&;!NIAwXHY+$IVQwUlKp&-d-PD=`4<FzP-_di5eClJMJ<9*1<@?W6v=61_5 z(jn$MI(`re{T5nvuAc~~8zo$X-SL}&Y@%){k5bMJ*B#3pRE{4xr@9@y&Gw}zp9`s% rNPxtGf4v@RT^3Jh-h~qTp}2Pgmee#Dlb)wd%Agyxt+g+jx~cyL4Wl}= diff --git a/test/config/__pycache__/test_json_comments.cpython-37.pyc b/test/config/__pycache__/test_json_comments.cpython-37.pyc deleted file mode 100644 index dacbf0d26171aa8295872cbde0411779a28b410d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4488 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 diff --git a/test/config/__pycache__/test_manifest.cpython-37.pyc b/test/config/__pycache__/test_manifest.cpython-37.pyc deleted file mode 100644 index 7fc18849d0a46781d1e86eb8607b42f8d85e5982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1930 zcmZ{l-HsbI6vu7PWM-00vP(-_J_=L_BvOe4!3|WX>h87(1Z<(DYBh?8oY>iX&Wvn_ zZmL8Awzs^)MqKeq=8~&@1+F;9lMHELCz@lQGalRLH~-@t)M^z1SMvKW{LdO8f1$Iv zJm}nkTX(?-BIty~c}rsoKAW(q7kd<A-o&4l;u0m2i~`|{(sOc3<4^=5d`{v>M4}9B zSyaRhv=vbmHE4H4UF<?z74#u#?483p<fuXI?zcP{_N6ulv*AQY1)*pY>fs=~DBM2W zhj8nwU<^4WOR^wmR8YZIj6xr#^^R<Ku>bJh-LD=zyV@G0Q`wqnsS*wydBUgJL^haW zFoBJ@5S@&h0W3(ne-ITy^zYH(t@a~$L$~>Wi)NQU<;lFgpYUFq2>wZ1CO_$Rn#n}> zz^2(?uG`-XyKOx*^23bx#{5{qyORlw5aX7Cyjt*Te|YTro#{H+W;VBBH_!McCKZ4o zETC1U%Fyd!#&}`Y_;Fn3P3S<*WJQ+L&=EWH1YOZ3ThKEfDA1+1U<+@|^i5Ox6+W9I zauEoHQ#S%zJ(i}}mu0E8K4P&U?`qeHaDeO8_cgFF!!)_4RH_=j+pCQ>S=mUQWU^<Z zumSIx8J{?+xrtyodku+fKJQ_gXrpF5ld6y5p~ew}Mzl&RR9%Mt3lvHaa1?GsXF*0F zQo)2L{NF&9s02rajXYpcT2m=GJ{u~xOt7XBfKDFYfABTv#QINDHO^sBTgkYRiRp~x z{MnoTFQ68VZ-ff>qp+gX4w@<&C@Z4sXm-J@`KUb%yn^Nu8Wh?Vl1tl2zH`fe1|u|1 zLuf!55Lq+129bgZs<>eCGdLG95hc(ETaj^~KQJB;2nzpG=ZA&=rSqf0f8zXd;SZc& zF@7F7rJ%Kii=ozbj?}BL4|N5NQx{cOtkwgZ);IG^T3>@e@@UXc)s&laOrlY8JZ+Wh zj^Kv(6_l*?;XUn8S`R7;N*8M*uB;2EBl<7HyuJ-{eWKij`M$vUoO*DF1y;64H$Qa) z;ssnRxdQGJa4v$IgIF?v4CUw`e`I_IdE?)4erVPs9JC)?4539AKvS>7s_G3e=lG=? z!It3O!bfkTL7Ay{@VV#MIIYF(zhJIxgDHr74{vIe=b8uusW~R<U5NGY0bY0*ArS}g zI&=&ffuz8CP-w*XXQc&MQT%s+jOY<;_Qjg8o|c)yDdLLeec73g#SoABGBj{tq-y^1 zm%RM%xQ<Fw(}9sc!UP(HMQEL>_n~dn;vk!2Zf?c+#^&g4=BI9Rb2N3<nsJAJ{Mtps z@;!$A;fa|knIpxMNMY$Yi8wND?X4ZVl6D7N^!YRuvx&U@9=xEj-t+3Mdi5v@qe@hd GYX1ORHM|f2 diff --git a/test/config/__pycache__/test_multi_file_config.cpython-37.pyc b/test/config/__pycache__/test_multi_file_config.cpython-37.pyc deleted file mode 100644 index 7255796f9cc2dd8499b3401fb7d167491049e45e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2472 zcmb_ePmkL~6rZsj=YP5_tF#Lesv-_VqN%!-3aTo^?!pa4r4?#%gDl50NgO*)G~+Ez z*&NvI74Zc)bj68}!_`+#`xQ9x-i+<+uEGi`Ci47w?>BGW`+44T_M6QbffoPvlUIL_ zkUw#eHyb8jz$0Hl#|Wblad0#uIx`$&W;!OtwHaBnl2f8&*-$9kDL*6eHYNB|lCo3& zj>N`u!pXG4ELM6$PN-95HY>j&PK{Mq6~;QNu{w+m)?iH-n~Xjs-PReLPWoLVEiJsn zpQP2<+z;LPg2!E&UjLFyUj&OJn8%MjA-V7oj?IFn3eN#NGJ=lL6*#}52{|DvBcX{g zHJN#nB-RmO*3b0B_+^WdBjas}l}_o(d<M>cL!OZ5<N}sv*c%zvJ~B@YO4jHj6WlKM zy%{Cs$J%XZ9m#$4(B11iy!}FnK&o}9ht^q$`NH);-+AdpF!>~ht+m5kJM84jRRP;z z&Cl`vCTlF$vb8m3_Iqu!aC#qrS2@jdLwwUQqg*>$A9Iz{;~YQUWNngbCu?ik>DsFH z`VURQzxF)Htp%ITn&#T+<+CmkbO6As2nusU;ihAvTpL|J216?KvYTEN++!~D67O|g zWx&1ORL<jUv8xtcTi~r126Sm<co;-U5X-dUy0JIot}9GbSZJwhIrb=sxO*=fcT;<z z5-6>+bx!?GL>>10B@Z4BzJ=_P18?H7-q8EOi<g7F*z@Nx^X?CL{8A3kQ|UuLUrd&A z@O3a8$ROc&7M>q^V-9<x2oNm1n{b)jg{`Attmf|Q5L|VYLt5NhEYrG@>h&G)LT*Dx z4C|J)Wg9ixqT8x(8=?tvAJR=V95GOp_>W-1=n<Kc&=wyuqnMd`COZi|hEjm5x8^C- zC1!<&{0yaxKq8m=X|+h-^>lwdJvhVDx>jo8+euq{5{SZd|4N9tNKJ@2wL-p>U8)>a zjOwld8`Czju@^;8b&-&d1(!Td80cgLIznskYf;gL`GqL)WveKkz$76M17&mvV=y3w zc48c3<VwcO9Vl|F#Oz;Dw|hZX1|8I3R#Un@>QwCYzG#8vGrUg%X?04fIO$>7H5^-) zt!x~gtwFv9u>$00Al5YnzDRKcJNW33f8eEoykw;8g@BXj454k>pa$@Pz1RWCW=>+z z{J)$OT-Jdv_(rjo;%i#)b*(S1!Kvapc55oQreai3!80mG;uavacC3d<0UBqZiMUyS z0u7oLpdbTH--XouLolq9>H?`5weN#=Gqn#u^WUjeSE}3>Td-RNevYD02No59g;`+H zy99P{jDhLg(YHl>0FrJCj4tt3ITn^sRVP(VbUw~YQ!gt&vpM5Y?_4Exb#+t)Hm$pE zR$ZZ};{PP4JPKYVhl1-2$4pgMQy_`z@N-#@6;-IzuRMZt4kP~gM<9~8t3tQb#coiW Ow#?S2m2#z4Y5om^`7iPS diff --git a/test/config/__pycache__/test_pyconfig_parser.cpython-37.pyc b/test/config/__pycache__/test_pyconfig_parser.cpython-37.pyc deleted file mode 100644 index 1f244167b42887217e47662c7f1876b83d20253a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2483 zcmb_e&2Jk;6rY)0uh*YVOO!N#P-StzQtPUzgrKSrN#KU8(h9XKMyvJC*j{_RHZz;H zF7bgTSHwTSp%Ewk9Ikuilz)K}@6CQViA)3)W9`iB`@MM|KhJyiexp$(Frwdn^6tMw z$e;L<4+}P*!=qlp#0jS%ad2fJoic|_4acDPZiMEv<di5`)U}r7l%JAllM?)BN!clX zOCt7+2r{<0$xA2Xm^u}1@$w0As@&!kSZln>Yp~XNoi|`@aQcL_n`hviblWT`&Ar$k zC6(#SpSZKRh}tx{{)JG!4CZk#iynDW3F)Ic4ilaVJO}V72@|JF2!2Up64No`#x{wK zBf`y}=`s6di;~zpCQEk2-jsOhlrD{@5d7EVF?mKVoS@l>n-@-4N5(0mWOe4qfZ)qr zZ%PUIv3d(eO9>z2boW{hZhfakAWbpEVYKFQHg`S1ThF}^Hn(%N7240yek%u;h1wcx zey;DYv&M6judHda-={W<p!Y%Xs-Q(~NUU=+$kD;d%~e4UbN%5uYoi<;t*oU%SC`dS zf21V*>&S!LTCmR7I7i2qeO)5x02HqxXp$S6taB6QXn5HTrc~-=_q`&8$6fBl-mAK< zgL|F%!XFH?x83xuZAk_fKC%0UK^O;-N^IASys2<qX#gOxHWCwUwN1ww1fg*6W$SKY z&2=FqHNL8?--)cjnZJHGc+mR>s!a8~k;glI?}ZmFdV7)Q&m!*K?}_NS>S3(Phj}(1 zEmZHTpx;wLEbh!bf8q@VoDD<J;FG(tQ1M+jItYe(??N*A%}rx~bP_w4-GKnq`!Eq^ zZkrob%4nThbd%*fi*7L40NjU~(*svbSoeU3u;KKGjLF23A8=OepbMZ(wPO03##;Wy zIE5C)%?VSVpp+A+=2ADQ6g9ls?yt57XXveMCMJGGNpnvDS6K63N;#8>0cj`ZL@ZRB z>OeKA=~Rb<$rci_7lu#LPN5!2p+po908=(hgjV6xq;d=P7qY}}RA>1ZHZg&WD5pD^ z1A`p4V)hy{*D`MGK-c3XZvBeb?ggw27_?(v)mRrXoqMe-n_&42@0CPaos#ZQ>C$gA z$4Yxww)W3fN`9)u3nf2O;%!52qQM(D!S4_G2VUyPOGe7x6!a7ZL+BRV00w;EEO$V% zo|6cW|Cf`3%Np<nKUch|`5G5|UF*tg;8kA7X+?!dsTdSgh>VJXya}2qI!u>Qp)|~t zMsmAQ3R0zUp%i3F<F_Go{{<LU_+4BiHKX=jkguoqV?h2pwfahxyK)0g>%`AdG)WT+ zi^L{bV&U5)c5nhNvf4>+i+m3x?Isvq;H`2@?4!D0>fY#lly|32+KM{U85d#aTr<p? zQ`$vquA6mPXs-B|$te$lm+_$#X@z5@>Z>V{MD6@s)nikYy7cXb;O8(DpM3}-g{N$~ Sp)WQzxu((l)GpgqyYV-ce=van diff --git a/test/core/__pycache__/test_authentication.cpython-37.pyc b/test/core/__pycache__/test_authentication.cpython-37.pyc deleted file mode 100644 index fd48ee80e7a897a72e08b4e737c8db85851bacea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2570 zcmb_eUvC>l5Z~RqIOl(9o2E%XJmdkPTBHtXsf4N$HH07##gv$;$g*_W+^&<W?Yq<N zIjJM(0i0LF7wAJPp7=`l$`fCKCuY`nj$Le#R$R2ZbL-i;+4;@<CSR1x1p-g-`_KF^ zPspG6l0AzcJc6MUm;@2DLmIfU4(+lA>sk$~Yd364BzeB@Dkm(-ge?|C?j;*iu_zpo zf5}9lWgXGiOcX`wf(&V6ai+E{7JVx0RJSaajINXFUYljP#f;tS;)c=9UqN?S+%&oc zu_A6=kVa9^I;pJw1@|Mhij~~j4^H-!6f%f?-g%<J6JJP`-1NqKt{*&?UL2}qP0QGw z_#sNQ&o(k?bK=)7k2d9t2#!jT*gXwa?d`kwKCQ4M|M;8l>h9C}{y|bU;*;Ha{n_^i zUn&GZIWSe2T7V^SBChpms6@J<a<J=JFyUjvKzR>_{tzZX1-l^UR!jzTK!$8!4e5{! zSexmMnEpZqf!kX(4^#=87<G^}es=%|TMU$F?T^d}1!+PQW{sKt4)z{2pTd1~lOJ<Y zJ>;i6=r?x*?uCKi_nI;|(akWDf%aeyqvO7AKK2ir+K=U(h<j~*B;jnQ0~(^e6-ym& zd7+X<a(OR4Ml?Jg`(aRx`boYUdTqDW3%u*-Ci+e2*~fTp5{?X~>cdXx@s8f9j?Y2x zFigqPt_Hu+?!Ho?s@M?U4DzLE>=GvfPnF>4<@Hq&Ev?V{IwGhM7m{}@bpzJ_2Q3Pg zvSHA|ZwwGlS~Jd7sL7Z&95v2wfNB=Duje`LhC!#FCcAd!3tz{6aOAd6xjNGGW2(wv zyke^*SkyI~5TuzgyZ=s~UIlZbfEFO2%kXx#mVx$0y?G`zKm)<Xq&0PM7lgDfSWI5g zn7yXItx^(OX^jAP4I#GAfa!i92jnMM|6L^*`*GZjLKgS5QkgiM75gnXm&N|us|5g< zBa&hwwP%LkPI6Hn4K{L$`&#NG|6@OrCb3PnSF8z8X65i_@9NG+cqb$x$Z=Mp3L%<` zJ?5r~{U!*|7m$_cIYj?5;=;nt@hcNK;HKMSZgOhI5CVxtaG0p0|Hw@PptP1fk@a?B zLxOH6Ig_Z{qZ*hdEK{*2BR>Z#85nzWZyzZMEO8>W;T&WOcTNqcH87~wVS?&2i+#B@ zas|T#C7LqOs9OFDm`~o;wflH4q;KLBEQbOl?}6;$20mC0I1D5^Af)9$VuCREbV$#k z6${Hpkmvy3p*+|C3Im!56o;?@qzAE;Hjsr;1Ig%Usx+=hNne2%84{1?UiZ|GkKL@; z-CiVkEN4*BsBL1u1R}!JQJ6QT2(o~i{J-R=aWfmS`JK1&U>|)q|3pzte+T~5`}pya zT7jkULDt%;*ww1j4Q=EfqG6m&>@HXBMls@wcV(>nGijQJAv#l721;Xpf?kaOrV%+0 iyP@cH<PM^sZ^PuU6+1_n@oc#;l5%vpIFi=0we$~4Eni^( diff --git a/test/core/__pycache__/test_brain_observatory_cache.cpython-37.pyc b/test/core/__pycache__/test_brain_observatory_cache.cpython-37.pyc deleted file mode 100644 index 7adde843b5eb166fa409954e3bdf2c1c1a4c9c31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10384 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 diff --git a/test/core/__pycache__/test_brain_observatory_nwb_data_set.cpython-37.pyc b/test/core/__pycache__/test_brain_observatory_nwb_data_set.cpython-37.pyc deleted file mode 100644 index 3184ff381fedc4f79bdbe585eeb2462047dde421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9944 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 Yyf}gXan6tM^Hi~d(sXeQrE;<KKjs&ciU0rr diff --git a/test/core/__pycache__/test_cell_filters.cpython-37.pyc b/test/core/__pycache__/test_cell_filters.cpython-37.pyc deleted file mode 100644 index 12dbec71c51b610c2c205511d11424e9c6d06d95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7230 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 diff --git a/test/core/__pycache__/test_cell_types_cache_unit.cpython-37.pyc b/test/core/__pycache__/test_cell_types_cache_unit.cpython-37.pyc deleted file mode 100644 index 0cbd9a7fa7664798acbeacb32b0fa0367a54f894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16409 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 diff --git a/test/core/__pycache__/test_h5_utilities.cpython-37.pyc b/test/core/__pycache__/test_h5_utilities.cpython-37.pyc deleted file mode 100644 index 807d6031479271f12ea337cd0f669209ee3cf62b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2919 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 QR(%ow1<&)U-hx;A4-*faqW}N^ diff --git a/test/core/__pycache__/test_json_utilities.cpython-37.pyc b/test/core/__pycache__/test_json_utilities.cpython-37.pyc deleted file mode 100644 index dff5dd1bdbc429d9f79cdf8c5974eee7649885d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2063 zcmb_dOOF#r5bo}o@s6MS2oMNMG_s;djuK;nB5eRg5X2!;*bB;KVq~?ad+k}zOWo}d zJN6+7KO+ZLocJ%~56qR*{sm4{_t@S+OAbNXqpqrcSAAc1&5zAy4M9m>{z+dq5qhH= z>tca%AF9kiFvM_#VoVT5G4U;2^w_=)BP4R-ieHJh{H@sa-PKstuW|dh&Mam>M}K3# z!5mh3j{GLuVlL<wtFjvCZB}Ou&^xTjTA+6seu6sNr*JAd>{z*zQ5B5y>SH<zgU4ww z$?bqfQJ}|laiF?TA3~LfAQXCmp%R8qHu{A0$r3H`0>7}7eS#Uej+SJBm^HDN;Nb%7 zg{3{z-i>Tl{l{6_3mZJC9i9@{b@cCRU3TsZ46S)xaj871M3{_nTa81RlTe=OvD}VA zsX9(xSq;~ZqLiuu6@t$4YM89e+AvL{qFYp9AuJ(D=DRVM<B<rNU!j5~BMw@sS;lk6 zY}9c?Lmz`@q7GUBaVW2(!($$(S4iwZ^KJ6*PX8Clh3wNYW!)itMw40pK|+HxVf1#N zC%?&ln(;&iAk%C-ll`B=VPA%df0NN*LPs3dMiI<llbbr&n?WkLu?EL7O$JjHMxhG1 z>}IpvWnrKO;KNsNy3{TpvX5KXB?K4W4i=Z7H_!;_qOX^x&d~NH7@9VQff9TTg+SdB zNCJxRf=q~PEAkg+2<Wg5P4x38f7Cp$y#cd*$NLpJyp{C4-q)t-dAE#yS~QC}=SN}A z)7lbl8#$iljb{R27_8W9J&*vT3e)6~5UJ=`CXU>egD}Y*IY_6<U|xt%Ad>v5#%oaQ z0v_@a7X{4+Fe)n`5Z-IpM0^I;MIfT@!F*{DDc!a6m~=O&^t!zd;?n*0_CfFa@6P1G z8pq!Gp<;(McH%O4A+BigDTozN;;QbrriH#1C6um|P%3%-6U-`ObRF6kfsxL1^BV@E zf?0s4U3$fB&Hw+6VYd`Rv8!Kl-vWyFFUWoU%I8Dl{#n{M$M6x2BwsV8#FT%C<o}rT zu{>TbVQ}W!u!KXy#^S~W;h+=c{I0=4r`ZhxZJmSLMd<B~b!*jOrhaUI+ob^YMxqp& z3!!}u?arRRzfPB3ohiHTCrS8eL8sq(zt>zhzmm=L3BDb}-%aSBjnLUq*dTl-na0^n zw6wi-6#lNJf}0Fvl84Z*!`v|guyLjI&diH5DapMTr)(PWAHIMECPD9E7hl4z)oQuB I@VV~JJKuuDQUCw| diff --git a/test/core/__pycache__/test_lazy_property.cpython-37.pyc b/test/core/__pycache__/test_lazy_property.cpython-37.pyc deleted file mode 100644 index aaa5c27c042d5e56e8201bcd736d8342fb6f07f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1697 zcmZ`(&5k2A5VqYv>C7bA%xGDV_)!kaLJnlL>~cW}%@7cmA>u~})QZ${+TLs@o$ki= z0EsdOcIJwBg&A?;8F&+4IqfTOqRPD;vMaFU>Z-1?{nb}xf70z95E#YpzwkeOLjFRd z86hYqF!ePEK?Kc7Tz_fIz-GC(@?(D$!~rFr6X6N}iU?nZmtNcgI}jn*p$x!|Bw4ht z4@65uqMcDe=XB0)m^cuJSLBk$hdX~qbe-1&Z%^EE-p+q|`{KxXA^saOJbnf!$z;fE z=ZtUGU#hZ_%B=0tzV$`+b5^7n*bD~B2~2$(gd{N)1d^kIU6I%m9&GH}*0`+Jr&X3> zFb@2BFvl=85@^UZ-O?MxK@kE=E9<AQ3Upt~{ITtpDw}5o&lAB7|AVMDEc<&k{&4!O zmP$|g6D~$G{u3|O)6;^dWg+;(sVsifQ%I!Hu$e5YCu==D%VtxZ8Tnqt(<PrvSexe% zA(r=z)aHI#D(SQ&2Og5@IT533ZKJs~?)(UWyKLyD|2(@<<D5XsQIZsVC6mM+B+052 z=Q-+~B>CZ-=e0*2!X_?_J%MB>Xe82VPKc<pUmzX1JHdcEAa<ntf(h@60`16SVB4Pp zQ{$X#JxOr|4*cTwW0?98h%I#DGEzN5E=j?*Y)cZT1W3>p9!$FMK|)D?MPDEY?9C=a zs*r<W=)hTzSDE{vkQA4h^|4SxPhlptua6qmtrnOo5|tI1Ns=B|8m|nYw`s^W$2;_+ zCIoxKR~-mZT@<)P9i#YnQ>Qr=Z-E12U7aGP&~`X1<(AG;3N{WzjMGu_E+~d<;YwWq z4GSP*$@Cq=o;Frn-$l#O0C2o|+ap+Jd#4&&(PU-unNp=1vih_Lc}U9HVh^QD{TSOV zd7LSbX}PM-jeG_6sYzfF?NRkA*v}BCr4M$1v3@(icfr^Pe8CX*g$I@NmXRL(4_JjK z0hw4tg<WI=2gHV2;@x=}YsX>Dw7U~;K)lA4ghec*AyxQihYx!U%dqRQ2A`qV%y>8S zx7RM9pSCoCj@`0lsPCEJDg6%K#;?fN<a_u+k9m_gc<}ziM;~kkV_v*t23nc{zC~vx z7krk>0XIfvGhhw65Q}TWYK<`CQ1MJl4Fzc;TtO68sZQM6OWc!6y`1imOSdRZ0;d{0 z?QK}w<V-u5^8o$~d+JTx6#G^MAmZ1X$7F=>$moS9q`n+Tj}4(8WNO^)slodzu9op( t#TC38kl04L>N{%PS$i0FO>U!)>c{0{Y!ZzZBBBxNd;Or_9<<(S{{zKnaQ6TJ diff --git a/test/core/__pycache__/test_mouse_connectivity_cache.cpython-37.pyc b/test/core/__pycache__/test_mouse_connectivity_cache.cpython-37.pyc deleted file mode 100644 index 5d9e512d61ec8b221324b727ec25c0c3c46fe4a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17243 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 J+%}jQ{$E~8%8&p6 diff --git a/test/core/__pycache__/test_mouse_connectivity_notebook.cpython-37.pyc b/test/core/__pycache__/test_mouse_connectivity_notebook.cpython-37.pyc deleted file mode 100644 index db75e01558f440c26baf57ad6f01c80c6f770d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4519 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 P>M!{JTzp<`&{FyjXKga0 diff --git a/test/core/__pycache__/test_nwb_data_set.cpython-37.pyc b/test/core/__pycache__/test_nwb_data_set.cpython-37.pyc deleted file mode 100644 index 681a3f9c9c052ba03a2baf8bd915a7a35129f5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4578 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 A<NyEw diff --git a/test/core/__pycache__/test_obj_utilities.cpython-37.pyc b/test/core/__pycache__/test_obj_utilities.cpython-37.pyc deleted file mode 100644 index 1e0e8ee4110180be8f590d2641f68c4354b51444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1732 zcmaJBO^@4D(9a)<<K3(lgep*_%H^Xdi1oLfxB|4LLITmQ#AlHe5jnOuaX0>u?d*1| z<N$3CAXOm21rBJdUf{qDP;bkP13v)CoKR0I4oDo~!puvvOF8f?&zm=2Z)V=iyxeX} z46O9-2foo}nEQBGE)I}Q_{(<zgiJ^#j7R9sdMxbhgiCmjPXtd$8eW5-3^!>eq9-OT zuSJ-My()!#DBNUj5N{=Hgw30bw;GCJ3-)$M-eNk^5!hz7I$Yhl?2qE$au)2=tpwm8 z%cHawa=!}39kv#W$PWkE@M_)4{i2Kz4N!Nv2p|{XFL?meHoN8D2dX6P%00W=lWnVK zDXt^ihS62*E+uQOVju$u7BI}NqAeJXrI?@svWjk^il$gPsyL>uxInSouF?Zt!{{ld zNsZ}1K^@CbTpO)ficL9=ZYu^{Y&)i6P#sILdXn^%96y`Lz8qvp5~bBya5a@TG(|J4 zuIA{7nzqpeRlr=+wlr{oN*HkHxk%PsO@rG|z&3TwUYh9jG}EMtnh9|^T`J<*wo7e* zBBVj10*2=HTzZ@9xUOqGFkxC|7jmE}hTe4{e|Uv%TDpULaI$NgXaFoZreRTb4=AQ2 zy(X9AY&r?$VRRDR^YU<7$$lcIStUu^vaYJSY^bUso2qKcK(SQST9B6%x>FfjRc(}U zRMlB1EGUu;>l>zM!mFQvzmkjR`|p%dQTF|@A1XtC&rkRJ7g9gS($F{iQMz09vBJs# zV3v>f%l@T!*e~NM+Q|K2#~($YJDGq)xT984S*bx*L=?l?8%(Qs5?66lD*1lh-t%{( z?IKGn<ZWOXvH+OVMGIhnwTTN$6A83VUj-y2b5cPkRb&RebDLnd+~z(xH)kt$MsAQf zH)9XD83`MASi;P>klAUK=PUk0as|5W4dzYeJ=md-np@YgRmNwp%S)#f^jCS<RgAbp z>K1LL(69Wr;nWD=SVc7{IzoXi790WrfcL0hLKdq*fL6o7UR;gqwF{IMXXz_Nkrf@D z23hlXe@$|a%ZAm-QxqcDsoR*r!Lo;62U1A~56g3>h)7mRu@1E3L^a@mKTXu<fXtW! zNY))p7s15z`8hl1=KNf!FhTrGxWksuVPY2N5C;@<i`{0Qfb@o3$d5RXxO6Omv=a#d zhZB`Zk0rQ=Y{1Y8B`WbLO3<XQY}G_M!iPS>7e2z=jlTQ>)>l7nj()kDzxZ+X{pRT2 znOna<GW~9IWdHr=z4t%*;c)bGbL*#XKRY-aU3vQ4*T4Px$6-gPg))bFDlqDrO><9# zj0ckpvJZ2a=`<Ee7AA2Tm7cf@j}ixftsxd&8>Cs0_><CWZ~H+sIA*WX;{)b@A7za` z%JDeGF<-6%U|5N)v+LwZ_=?Bz_BBsPr%AqFoPv|r$oEkbMnBBy0^?s)494%B{-64z zHAO@8n%nWUYFb1zEc*ELrhmCeJDL`c_(GC}(@FHwGjIX*P-I2&7`x7`oe@|50ivm> A*8l(j diff --git a/test/core/__pycache__/test_reference_space.cpython-37.pyc b/test/core/__pycache__/test_reference_space.cpython-37.pyc deleted file mode 100644 index 6883a8f270b9d247849e4c6f65f96441961be6b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5902 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 diff --git a/test/core/__pycache__/test_reference_space_cache.cpython-37.pyc b/test/core/__pycache__/test_reference_space_cache.cpython-37.pyc deleted file mode 100644 index 81f4cafe69e064eea8e7f95d408a2761fbb7f3c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5988 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 Tgfs6fIj1UOUMy6X#aZ!Rn-5~f diff --git a/test/core/__pycache__/test_reference_space_notebook.cpython-37.pyc b/test/core/__pycache__/test_reference_space_notebook.cpython-37.pyc deleted file mode 100644 index 966d850ad7250918e19ffb2c73d29f6c4624233f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2761 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 diff --git a/test/core/__pycache__/test_simple_tree.cpython-37.pyc b/test/core/__pycache__/test_simple_tree.cpython-37.pyc deleted file mode 100644 index ee1642dc97c55a1377e14af24d69155a4ec27179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5793 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 diff --git a/test/core/__pycache__/test_sitk_utilities.cpython-37.pyc b/test/core/__pycache__/test_sitk_utilities.cpython-37.pyc deleted file mode 100644 index db8390b908c8111d6781db07df11267a18f53607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4477 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 Yt+-1oe$AgdCzfzoxj65){CR)wziU3lmjD0& diff --git a/test/core/__pycache__/test_structure_tree.cpython-37.pyc b/test/core/__pycache__/test_structure_tree.cpython-37.pyc deleted file mode 100644 index ee0843e7468064e20b0268a81eefe494085a40c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6514 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 Uei-Y9@V}a+7Cl2^1m$q{e;Jfg{{R30 diff --git a/test/ephys/__pycache__/test_extractor.cpython-37.pyc b/test/ephys/__pycache__/test_extractor.cpython-37.pyc deleted file mode 100644 index ebdac55d561b0cee755b13929624a4ca141351b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4898 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 SF_ve03*Mqv@ycG6{{9CxxPwRl diff --git a/test/ephys/__pycache__/test_features.cpython-37.pyc b/test/ephys/__pycache__/test_features.cpython-37.pyc deleted file mode 100644 index 9628fb2f665027639f9c6b513b1881a8ec9533c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8468 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 M+0iJU)tuV@0D;02L;wH) diff --git a/test/internal/__pycache__/conftest.cpython-37.pyc b/test/internal/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index 06f230a4c1b6a9864dfad04c1d8d1e5937e27990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 533 zcmYjOJx{|h5OtEOlu8|05Q9fL&<<<}A=;`#rBV<LOBAVc?Q0S>*pcmk!iK~T0WtBH zvNG`(m^h~(angM~y=R}#<6f^z(B%6wqaGojuK6<`i%WEKgh3GD<s{l=FY<&hf)^6` z!dsGl>kAoV!JWdH%K`cXy-{28>Iv@+Rog%vHeImmocgJxVG0JQ1!E08R+`!rC|3fZ z6siXAQ_dt+GOwsEUD0rI#aT`z*hi(el-ULx<vB<?lg4JYv_Lm_;8?Rv(k0J8au{?e zTGR`t%WyThzPg!D!)e{Jx`bbFwg{)Ui_yIA*S<1!I{^#w0lQYgY+ARulAA2~AbJm< z_?=A7;yVM{#4KfEux5`;R`EzOqzQH!qtwKz0BJZzRiu@P=h-?onT3;r@hwXLwQg)9 zwnMjuVJ0nT$?~DQ${~ZIst=0Fm8&d~O2djPlyKX2Yi@QQ=zXmFfp*)E+B<fGHG}>O X9VFD9^Lr)A94_$diD_Zz_?_Sf-no-L diff --git a/test/internal/__pycache__/test_annotated_region_metrics.cpython-37.pyc b/test/internal/__pycache__/test_annotated_region_metrics.cpython-37.pyc deleted file mode 100644 index a9b30a9f12609530754262fc3ce090e32e03a68e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2246 zcmaJ?&yO256t+D-H_4{E{aq-isBoAA+XEK_6>2FU4%J>-E~7}%Z0shpo6JPE(<ar7 z1l@Ar!2hrjC;p|ma_YapiSId^Y}$&>#Bcmw>}S8v-+TUkcelmx6o37e{Sh<v4=L-% zL+1gSu@I6;K4$6a%TobejJ=7U`kX0t97s?4uh}V2LwQw(GJ4I^$k}7L<Lt51TC(l5 z9odn)uUXoXU3m%Lw%n8Z_;%!Fc?I8H$)B*~+8eCQ4inzo%!;D4nN_l{)i5uM{zO@w z56pl@tREkpM`)%CVc9X4+zKiF6!7I8CgKeRt0}I8r-8JKsY<*?6w}l%3uPMrs4T~S zGab?}68~0@zUlp9ls3I=l*xmm>_t{AdJl_iP!=-#s;7$QrdLi?VFr-pbhI$N$N5pu z<W_w-%?2mgP+{(Pj1ltWo>j))%L}V?k&T_!|G&Tvri;d(WacEmK8%21LgR?o(*Y+1 z5B)>Uh5Q3LmYs2gE!q^kkbLRY(BHBN*aU1|#VfHCJyCnLUoril@}98DcR=O8V!8Y_ zMB;10G>yl3VGxdL#57Oii87<1&Ses$u~v4bi~hXf_$^W~pEqK$xPVYcaL`=BupB2? zPV+&3l1=F#Ob3GTt9bXgk5}(Pf9pUgQWqT^hGnM=`{Uq)8@aWHJ21CUJA0W=W_Co2 zT*0I@a>R(YToa<sHDPMO?o(o%IQ;2D-aFaY=5{6(xxcyP{t~%&hlGxYMmuuuKSzho zpkfv1h%@nPQHf(w;e<|vxnsRoTvA-(aEPJq0qo=}?Wn;(6~y!0E}FoMvZ-pi4-E)u zkpn+!UFyWs6q}|Uq#h=0!Qv3vC(`w|J$-_qhBnA}j8|VqZ$m1w@1VKOzeEQcWuOVK zK`5UQT`WICR#jf*R{}HwnU-uB)<G2<qbeY%udV-zSHW4Z#B7qVJtmtC&!Q^8Jip>M z*ze@Ss|59)iCY+ZB9`1dr;!d4@9@p1*Z~q(;-jxpKh}HHCw!XA1FcXKHYEYs(uB4g z=f>)N8sM4P#4)(>kb_C+5~vABDj$w)6THZ!9cfn-+BCeqt}Sr%E{r!EjPEaa7ZVL3 z$ao82hIj>fU9ei;hIPXVV*3Wz3QENtu*g6MtX~HNEWr(U0s^Mu=g@}u$FIVQA!GeI zs^fa6ZrR`r7Raay0lUBCx7d=`?JBC;XR!l)WOr~7G4z(x=cJ!Qt0_G+WmwX_z*Ju& z>vf29f0MI|^J=?-GLmYj70PAsVx+Wcyh&c1!#&C7NoU1JN-KSf#787HAnT9Gx34jY zWHwJjt+QgN(m)^OnQ_MHyXaqc=)bq2d+@adzR$0tjO_87X!<k!H=tCchjz08|1lJ# zAh8;3cHjp!Af}`Qp928x6Z`}|ZjY#rtY1YoI2Go;4FRB6MJJ*8+4U)P{X++45^RO( zqIU7q+UZ4I%8Mkrz&mXZm0e$E4)>;&8&q4H6)3m9%m*tjgZPx<9|pGxwKB7@eHXqx z2jA98-@=ulL|U<ycq@1Ztkqw@mhh)ZHw~u?nwAE|Y%*P}E`q!3tL$KXiya*4EHC=y z5sK3D%$9nws$J2ue2$wzxs+Sg>rI_<6~|?VJ0-W~)|M}-d3=9T%Gp?bM>I8*|5UI# Rq8qe!x<NOH!?+W7{sX7c>45+M diff --git a/test/internal/__pycache__/test_biophysical_modules.cpython-37.pyc b/test/internal/__pycache__/test_biophysical_modules.cpython-37.pyc deleted file mode 100644 index a524d8307e1a19284e81d4a6de91fc97197d3682..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2174 zcmeHI&2Jk;6rWjdY$qgXs}>arBrcVj6~<2DsHGNPO|B4$A_Uqv8jW{e;z?#_H#4(! zjGO~%?;MdhCE^5sk|j=@_!l_wW*rCP5~(fX#z^z^=Ii&~yx)7<D=SL`i~i|5{%f6( z-~41+DmeHQtKG&%5J445X-ugf2P%jI>?^90hH*#<1V;-Z6bsMEGa6S#Rn(r7xF+gi z5&OCbz9iAo?|2W1==jdI%<}%w%7m-WGf^mboXcHYSjf3c`ibA>3&k2>-N9;?v2h6E z89gH-g4YGR-`?yymv>q%ewyh{dwqR9qQ)PHXk6)~{AXf9oc%G_>2$xcU~HH7xoGzI zfa_uRvF1sp1#fpjKegQ~2W=B<OK9ECWUp(bgZFcu9P>lKvr6F(aoloXT}x^QMsrop zSnn@|SXydioB42jV^+>{S@Vi`NF=BSriy*yb@atc7qOPQet-i(&!{8kbcDvf2)@60 z7L3SwFrpXu0bk=6d_kU&Z}0=oDx=`MGOBpF@OBAz<qz-u^7eT3$Yz?Q_K=+vV1|4L zEi-Sg7J_O$-E0Z&c&psj^rt>K`3SWD)#>a)VKP(`zX{ZnLN`pxJDtR!WsKyFJt^)< zz4c&gqy2DWV`G1^EOnv^0gVAD#g270(Ck1euxoPy=7u>$4So5Bw;ZVXP1l{WIV3U# zy_TEo2ol$r3Yg=EwgKM3n8_qFU<>8eCW4cMU4frNbIn6je0UGKi*=?*oW#LP;*2hl z*a1LpFHw|}S)A6%v{1#>`sH+DplAw#tBHx2gEUv%!P?(VcO@^+y`=f^_VQ1&yi{vX z7b%);VDG`neRTQz`+G@NXou4St}N_Fq49xXT+Mpk?D5@0aBL2TDYPBm<rX>T7?NCp zV3|&U4W#Si1>W=HH(xx&q!=%yS#msa*>N3C@s}NllE;%~!9V_v=ODZ0<yG8a%dkd6 zx=QcRaLM@S@!xRm#~T;7jVCr={MQ8gM|QP0AGJ3(+mE(hk6lw*{Ld2%V{`m@C7!$% zO$;Vg65oE&Q?2pQe#(Vgb6k+Zcn3Cb_{OJ(8Q*{F8sE3?;=XymUqM;47;jCJS96-T zni%<;KH^KT&Dk_HNnZ??%TyXy^Pzt*4m~eR>c_PMdFl!SC67yL8UM}<&=PXV)cS{$ U3qSUWu0*#S)ai0%wN}6NCuc9ZVgLXD diff --git a/test/internal/__pycache__/test_core_feature_extract.cpython-37.pyc b/test/internal/__pycache__/test_core_feature_extract.cpython-37.pyc deleted file mode 100644 index 5d3f6f19c6186d2f0f14ce3906ac7cbc41650723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2578 zcma)8&2QX96!(nn&1S!nZqhVO%U3~&MP*A{BoL~qhO`w(Rgg$HU@e&Gj<YfG+U|_E zNl<&B;aUkea6mmEapK0A1LE)Sl~ewOUf}m;y-Rkte0Vg^&-32AH#6`3-uS(Gy<*{s zfBH(ib=tE2ppVhR!Q4RCH$kK&S!8+i<`L_2kN0iQ?mM2-cRiO`(w5HGmRFLlEa5#T z=VTf0vYeL{yyqp`vRc(+Sh6--PQI`c#?seW*as0R%j-K~lm*Jy`$3TE{3RprCPL}J zkCM3O>w5#C0$=n~Uj|Vo^0`>VelN(nWRo6R?>zbjy8aDBGSj%EX87LxLo2f$SV!z3 zd%&c<$Mx$Od&Fo=@*_STy+NbJd`D9Ir}<xyX3v_i>%i`#zb*9a8R?HhX^+iFel-#c zr{!)chFu&RViWf#o)%ZM(Y&#)b)d2^iEk;Ds20ze$n8)b{A{Tj6rLVzyxaL0D!L<f zg>2sy`yxK<tjD68#8O=C1o3^{Nzx$JUC<=mJ=C2$;oXi7v*3+XboWFrz}zT;hTOZ9 z1v<MF#)wfYBJ<^U69i-@5ZM6l;2=|?o3+!!e3^9psR++uP5J_e#a39E)p!Mc$T`I~ zjh4Wx2DB!^N|Q}k8#oMvf`=3iJ7hgRJU|m7_p$wuWeDsMlO=?popA)wB;o^h6G2Ck z@*aoeeIwzNoU;1F#&}KE4Ofy4xnQ_Oc}g~k>p6vwC3u<k@f}$*>9Zu4CZy!&m%`7o zJdG8vJmK)PEYB2t3H)loFM=<0#{MYn&dRkOm**Zk<DD(;@o$)}7|WC<=Qs13L5&{| z`ga4RN;oW&Ik%A%)l?u)q@TpmVO|Zp5dnxkjwy?}lw0)Bhl9R_u9rc2K*Xmtg9q!Z z^)0{Wz!g&q5SjFXY2JP_XWD!XNgcwcm1|L`vu@H)ufI&j$a2a0^3@_IPJq09ElRo~ z($~R^rsP#I$P$0J=-k-}^=`{HUh~F&qV{&8WS=TV7UT`89)oD0{XraNx|q2m!YGhA zPuIPAU&I3u6~;Vgy`O4DnKYIRl|3f|Cbsjc40Kn8DPhX9w=W+6YP8?H5fC^`wIY9z zT{!@`df@Tx%jj3I#6>8oQ>5)?hiRZOM3BvGz(-M4f-x$!UTIk2rj9Ld&YsT;P}i@3 zSZt9s(AR(&Y7P40)N72|B41|eMd(dnhP)Zf{7_&9x#u9;P@v`96Bqa?V`P3}q*CZq z$2zsiS)<%63TPQQ{&`X8D7R1Aug}<T0Bu8^k^KeWZerGyeFpo#|8M*C8T*a@wht^_ zC_K=4OzvQIPt!Y?@gS*gOxWqU6Ga|-g3s^AWxlz2OraXW_B=SRvT^y&*2ahHA8p-I zD<nDx(sI4#IO750D9i>j7y|M+Qd%W)mI#5`E0dAiA8g)IO&VJxLdkzj=std)$ZJHd z5OG0}pi}`)CTs4Rt9Ck9M_9%U{%<$*+pwm|yv3TPt#GRF&*mG&c$1NqqNPn_Gl9uu z^Jief;<}ZrxUwze$=WDS!s1dLOQ{mSGn8hC=n<RIp!wc7BF?5d11}~bxsBfpfSFFn z98K<`28pbIbI$HhpH9snx%fHx1k*GHz+w)NTf^Rn)<D%ojJ7IXDLtea-o?>X+aBGr zZBuvJ&$?#KKY*z)!=Rbv(Y0ynfH^*6|HR_xr$AAO&db;Oi5x`1bxIUX$ya8pZg~~$ F!e5nFUCRIf diff --git a/test/internal/__pycache__/test_eye_calibration.cpython-37.pyc b/test/internal/__pycache__/test_eye_calibration.cpython-37.pyc deleted file mode 100644 index b5f2d908146ba164eb2b065357f657e214fb711d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 zcmeHJ&2Jk;6rY*>@cJW3n>vl#&{Epc#%-FSQVEJ^>k>r>se}rOge*&D<JoLBS?^l2 zn-YihfwmGS1QJ3BF4!uUUV7{WAt59r{sJln5TIU~8wb<_C*B)7agu_XRvg*YzM1#t z&D)vxe(%k^G%%1M@B}yBv#$>jau=DkCkvete9;6YgcDAEQtr02%z$UUR@ciqC0yhB zby7CC!A)pQhb*Mp7Ed{>o#qx#^Ng!?D9_F@CCTvtKDbFT#Nkzv9dis?#&`1J>*N|O zXL`1FshN2`!bea~anSE_J-ZK#I&2}!caIUA0d^VK9pwdOH}@ag-NW}Py91oQL5gFm z=);*Jl|xR`sn%@Yn-zBKg+UDm@L}*-@J+!Nm4L*gP2ppla>g}Wvf^}fDsmlGVJ*@^ zsg{to-XRG^I>$P6!GNEpW;_g(S3+_b$m-8vcJ&V+9t4RLP050WwCYYY?+TAg!xqAB zO7lt-+qFfRn)B^Ab^=K+7n!8Xk~VJ=0iYm%MN=<S-i#a(RqT12PtMx!*g>;$A+T#< z!0l%%PH-ivgbgQ%YCyxrd^4(C^kyrO7ds~!VBB^cnCttX!52@)P86T?g4hv(?JKUj z#Z8lqrcBpFwP6dp9vQHP$OJ;@Fx^eX5cD3)k#t**G-tfRx+4>G<oEDHp#v$J0v982 zF(QQoV<^%{Fp-K(VAhBn5_Dac3_?%l8cPk&?`;W{H*RSs@GGOf!>f%Dyaq^_K$i%c zdrOh~W#eq-&fPO5_uc%hmw#U=eB)x1zm+bz$M1jo%g673ci#Q{Gkl&ex%bB_AAY-Z zu;ga$+<<u_B^PYNbGqdH37e@Q^6<fp;1(1D8_<c#0&TMdaMfWgz+p>^wYDB>3r5>a z0A-vdG*1eoLlbS0M5p7_Rf-x3>+6h>g!DMj8&ldXu+g>>9cOiD<l{U}0I}MP`^gVS z?qw%;p6jjgxAVoczy->|>83N)&ztgLL_^OtRWGR4!==dS!X^v__W~PGrGg_hdp0VY zK8Sp`tOuc}%fSl~z!%**Ekr0l#rKPb%x!eI%=A4jSxuC+IP|6F2(dMiMFenlI}6$Y zTZu6G#5Aczb$SpGoTp+hNLKc3{QE@Bt~<i6iZE7%BI<eM@LKo)hKRuR@FBVoMJjw8 z0t*3SoI%haj1WX9A_<LI8)`F@5Cf6V%?}I+hJKB-jMxBbCVJacIw@|s3~F`C#X8xY zXZ2(-f-(R_3Uu+ak`(YXT8`6KDcVSk#DsAxF%~l1+Cvhv+ZJFQdD2QNJ`Hjlhqfor zBx$ggO(@UoAz1)No+KHN<TgqQq?J{Ao1{u_)67xQ%JtSakXY~^u$kl%ePIxLqwB!! z(2r<z3Rk{K8&{WA+R)pg{WfYV$Yy8UFP<B@`ONK0=iRTqzVqX+$xmndISAo^=U6{v zMMLZciOkjN)rJEI_Ld!AjG}1A)_}{Qo@5Q?-aQQp2t<~wDuQ`Y98&2ahN0grMVP_@ z%ZDn9@@TKhJTz5CV2U)nD6j*O$LR<rsnx<rYLOR+T_`I6DGsPTh<!Mon|if+Y5Mi* zrB~jXz9_ZJuU(Y1CJpsdr7g8tn@bJ$(65A&Eepw-59HA)l}FoLa8-EjeEcLVB03C& zm^!3W_svri-U7UNnp5pK9jB92oB+MYOc?$DgjuWf|B^76=G}yWUI9|3doC#LM@tw& zdd2Qosh2R~35cA^69qf5AJ~362t<K60OVomAf7@^gt|D0WF6?@5V8oQe+IgE8i$S` zIf`T)31)*RA~}Ynf6^aEb^^(kGyl;LJ}1H;J_Ba9kMK#*E)JH>MiX<XYy?a7MpG4r z@}af+*5uk%YZ5M@aCC;Va28&%<4`oa#RTtDs)R_rZi~foR$aTCSa>T=_m+d_m1GT1 xWt705ZrG{Xv%2C~FV;i8<U8lEUPTx~3r@Wpvkc3$;N%;o2XYqOPfrz){tXfG{^0-s diff --git a/test/internal/__pycache__/test_internal.cpython-37.pyc b/test/internal/__pycache__/test_internal.cpython-37.pyc deleted file mode 100644 index eb635edb24820aae15dda584b993a98e764ef506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 742 zcmah{y>8nu5GE!0r$SsH=nHTv;33kG%?OI5SvnL(0H;F*0SY5BmKvHANV<s)WC)Ts z>C}hFi+JtSSLoCuRW@yx9>4=B@w@N7@A!5yNfCtna!;QyLf_mWL=2l_Smre(h6=<m ziv%t($Dbk=v*Zyy;38%NHhe@y!lDJ5j<#p1<;GU6v|LLn(u4m-nw|r~kSnFhMZjH< zm11kbv-CT#qj~Le2<Q}@!ZHaYhJiQQeq7L1CphUgj-On$w|1=oP9PSXLpjX}wKLLK z+s*QvsXFWLW=bz}E^|R0G7recu7pR=zakw0(R2DCPG{u@!?h`CLs@o7Z>ZdqCz94m zGJ05Y`Pr1J<I>cSRo84x`M$j@O>6l<N9$|4<bV|dZm{dz^9JSq^xHq^aktNStu%DU zDt_x#PMmnx6H2u6pmvV9aNpeW?(D(F&kWtc<iMqP`|fX-daKs5wyl!nrnL>R&A%QJ zY6z8t>g9UHrR^=%j&VN4#ePtc1p(8@_f(9-pJ(H=dsDkTM;oNPf-k+4SPx)79qdL` p1=FdjV%QI;82y@wuj_C9QPPjb*Bu}AZ|2PlS91s{!Q=Sl@F%S}!VCZa diff --git a/test/internal/__pycache__/test_mtrain_api.cpython-37.pyc b/test/internal/__pycache__/test_mtrain_api.cpython-37.pyc deleted file mode 100644 index aa2b9b4684b8a12a2ef5d0350a484cfb4a054cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3201 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 diff --git a/test/internal/__pycache__/test_optimize_config_reader.cpython-37.pyc b/test/internal/__pycache__/test_optimize_config_reader.cpython-37.pyc deleted file mode 100644 index 29b034456ede50cce67d288dcf74bd29ca985ee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4213 zcmeHKOLH4V5T04RR<bS2v5E5{C3K)lRalm62PZ0u!f_NTlr0C_!C?_KY&4sA?bWWB zS;yFk58xb0apeXnF7Olh13B^o_R1-LffL=cT45{lqbfzg!6Qx2&d#&Dzkck^p`i?c z;{Nij`TGbVe_|&pNqG1Os{9cMC!9K@MGZ>vS#vZ)gEr>GT5%)ZN*D=Bb_Uf*(nzfl zcZ?GJsW&Mj^*M31`-I00ohOVmPZ}9Z+Zf;}u0JFD)EHE~G|#Bskm?QaLDkFhA)b9k zjA1^^bI|7a2tNny2-j9far713judGyw$%3Rmc47ud+tN~(XwT7OVo>6kZ7BJb3I76 zyyhnJ+LmiRr-WplWb#l7uC*mR*K}CR<CasX=AZ1n7mjROj>9%xZ`)-LZO4)@_JtbB z=fkzQ9(L%N$NZhPh5K~oc4jq&W%?FprVnF<sd8m{qEeYCUt6ubU%hstTArCGU$2(S zh4Aoj5o~UAm_Bu5sxo_hcIrmYpli19q{2<xYp?G}yJ<R$$i*#7HiZr1@Z8@0w%Ytu z*En$bjy#U!l^u1*@bVQb5kFzu*?dp6UuO0)W}uyE<OE>6fkygDKLXb=`ibE750p;> z_QGpWzcx{xny5^#Rw~sQ{P%%+h?QwT`gD1Eb|yMmfi8l1y<@5h<9AH~==Uul4?(=} z8o-Y@yerPr!Mo4RI<`3lB@%E1>;o`Y@P2s)@00vqS0DNO=`_;EDITMd2vBEG&c6|q zn;31e0HR46>O53g1>%!^vIkkh9`&iOZN#`XPW-r^;IZd)U;80P$y4%k@+o~mDOrQO z;8U_p?!!BX;qm(Jh-0@TYgtm7kF3&$^xWM<34=96_B4b}&LD1?#gxEvMGQ!wKiIMz z-*#o7Glo8bF%ids%L{iFSJ+~0Wo7Q;8mlj{yK~EPi|qEDh1yDxRhy~PFseg-5c8TM z$f`GZE`xMo{Wl^8VXMD(=c|o-5}ZuKTsL{?fw^tEJB>NlY<ey?ryG|0ST^vQvI$g0 z;l_gfpdoGFnrNHNP2dLBIu6X>o0GmJ{Yl#euLT*0>On#hW-SbMgtUd>^(;|p?*zlH z2X_H4*BSZ@E+p|*L`!OMEkm<(OcPn?{|8DD2{`wlIs~SRB88-n5|-+<16mLWoT4T$ z_Y?z2kgbpm!Bdd)T<Z|;$l>d}=iu%Ck@qWy0Jyq#2!SUv?{6Pge7i66=a6|wWL3cy z#Xb*Jegfnv*#KL-2$?$67}Pk_#AZxh_33vMEK%c0KeiEnp`l%FB-Gp#%+b|6P2R?N z9IZ254{|*@t`vA+FxK;0rM`h?bNk(2e;VDrFo~u#>3h%uj3uPezB27sYV~-()sRdU zlR;WpBU*fros(dHn9A0K@I-Jv4DhUHvGNPS#d_`D@=|?nfh{iGsx5?&tF6|SSAv|{ zva?wE5~^&c7kXK=Q5Kn=+(UutKnT4`lT@eTZFuf4cMc;*$Xz>D?x-V_ePXjC_pU~8 z1U09_$X5q6B1YjXaURJSlDB}IAapT~bN&D?QcQ{qxacC1OGuPcy^K#+fE1}f%jz$g zu4O)hDN=nsb|iC&imULhzif74<lmN!pN!<TPk9<7_P8stO#O`{_6h|A-tJhj1u^jQ zAUib7UfB&RRCNtoeh+g(f7TTqi0>Ud<(x4S#fwrDDoSSCE`7aa3EPqo75haDr9&gx z-ocaLiyS_7RhSID@c?6;XbC}5d1}P87)Ao${lrK;w7>DUgcaI^QorH@(XQ00E_Z+} r<*}8s)<1wx=Pk$j5UpAw1O_#o=BP#o!D6zb@hk9)Wry&mr*!>q@dMJa diff --git a/test/internal/__pycache__/test_optimize_manifest.cpython-37.pyc b/test/internal/__pycache__/test_optimize_manifest.cpython-37.pyc deleted file mode 100644 index c76d6f508a3508df5a94448112f6454a3aeeaf8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6623 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 ISI8Cq2clX;e*gdg diff --git a/test/internal/__pycache__/test_roi_filter.cpython-37.pyc b/test/internal/__pycache__/test_roi_filter.cpython-37.pyc deleted file mode 100644 index cfd4cd73ffd62d39360da9f2a020dca18fab2326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6063 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 NIF99vJI5UBe*qH_(nbIP diff --git a/test/internal/__pycache__/test_simulate_manifest.cpython-37.pyc b/test/internal/__pycache__/test_simulate_manifest.cpython-37.pyc deleted file mode 100644 index 5df914cd5e85e312691d26795ce52d4da6d9101c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8608 zcmc&)O>EoN9Ve-8$yS_C$4=U+YTDIpEnBt|J6@XAPTV$FY-e`5w45`J)}w9O6s0~= zaqY>6Edd4;D2iQnPB37=&b#ce^DaB=u)_decGxbt>^u}Z?Dv19C`y*nG#FaRdVG)X zga7yYe?NM0a4;+3WB>LS`lDAR>7UeSeUhlWhoAFb6ii~WB~@irmZ`2-imKomvtre_ z8m}hQL^Y`<MPJ-XRnux()Du>wnpLyGoSd3F7!b1u)WLg_eMXk(EA9-cgP%yY^0CB{ zYM!N7`jMobFqGXPmSNdP(nDE2DOx!;AX=wHYmntd>ohyThA`s{JIPMrdX}ALXK+2o z&a!j34zpo)9@q11gpJ}l!Y;6jxQ?=y*vq(HV6U(Ot{2&>tcdGN>@{`?*O!^HE{(nZ z6bMLTvNybF*6KS4j#<&I<r-^P#+sosgRhLmyhL4hD?47MTC417wYp(@nPq+3tSqCA zsp)l>oA&mtRn(KWRu^^0(3b`!Df{zmp-?ngalSBz&pXs|+#1)n4UL)HsGxp;&f<h^ zG<eO{t%+)l8P)`E*b~9PiS|G-zco@5BQcqt(Qn;gjY7Cap-i75tweL`M#ZcewkAlt zIyZaea#v5dz8LR6TLa-W+i`iL;+m*n%umF6G^P;H<JVCZokrc@j=>CqVN16h!+%D5 zL{+yNx`kdWd8~8auq<uQuI<~}mT4K?PZO*75QGc*m15US%{{0a{!XVSr?1YGrzgu@ zlmrudvj`%vGvU_2Azt69S+(th0LJd;5}CGMHL#&#d$6Fs<m^|95v;`2qs|-mBh7Z# z{WhsZgTz$hH4~h08kUO(bs^Bb_x}rOGqab=)3cXnUkEkFHLDG);b`{$=5yc{4lhql z&y;9R1eG4BwLv>N29&dJ81>@_bU}tii(;f^H>#Tk2dF(ZTHLSky)CP@uQ{&n3Kr`P zx2Dx~2O{2MV*#^T`#H|4Kzh2y31RI!nC28)B6ins++*m7Rol`NJfzThCju1>_<BI5 z+Ss;M>;Z_c&fg^@AKAiSd`qZIKNl)nI?Td%BO$kI_I6?Y(}vEC7lb5KK3~rQ!6|n7 zBF#0bb<5X^wk(Bm8gZ|M@dA8;>C~#aYgQs!^L2Ksy{s>P-Q)YKO|ilakj6Bf%w=(E zvOGOrE{{)MzFWRBfBEYC<jnZw-2CKZgqTpog?F5~I#r&Xo1MDagWD}tjBF7Rgkjw@ zoC-JV<RyEp+o-eWA}K`Qr>IM9dt%`Gxjr=e5s8QdIyciNIB9!67Wm+<X`LR=AEcE_ zh)|;P);2z!Qq<+Aqn5hO@1DEtGLXl4e0h9wYP>vsw_Ki|p}!tH_Q9A2REP>@XQDd` zMRz5L&ID8M=p4@7MNHGd)8a91_IY^7%?KZR?k<Q`j#K87JVl>2xnIM(PF0OiUW_u& z_{@Z-vbVK1PfFC^Vq-}1H)9OEmC&I+5kwp3dyB0n6$;_AFuP5T5Wq+%*JH_mqchX^ zK0iMDn_}q+3ahI6!KTp<qn0bzOuOE2qp^uE;3V9F_HL?QT(H~t&CShBUYQk{M9Vxy zLV=Zgi`qvkH&&PLtSzmtFWvm+U>;ll8-dvpvPc$#%%dNWb#7>(z||UV4>a#*kFph+ z5;S}g_+{|BfuFO5!j&FMN3tus%5IFw!;%|+i0qZczKDJK-jU)a+$4*CAvYB*)l_y< zyXoE3QLHKNW}30xjFxRmk8>>XM3$wd{CMDrbQE_7oAHO#j;~8UlGY^Ts}eHA<jP^9 zL`mOWO7DC>f?Axir^8b&!Y>GnZEm4b+I4F7Se{dQ&0{FM^k&1fpi+*P)->`Hn#SYQ zOS|DI8Zy8Qx4~`gfo?SnFQaLO4eO$5USgk{uA$}}lL4u%E#!+{4#8&YX<mBUaQ#_{ zIucNKEa4^L=8&{{Ngq%z+ZwEGc{x&LZAZ76WvC~@4rFpr`QJ<Y9H{xKabtetBL~)P zL*LO^X;a_V?SqX4TSv~v^yv-5e&B2n8cqeJ$e1^7o0}UBNFA^1l|3Z4m}?;ia@gJk z!7~BU3{Kgt0L!6F0FE!*N2z|`oeIg(9mLi|(Ib%K5KWStRI+kh&dLM$WtFUwmeUG9 zkDdy3(}yq(h2zI)xYA<?#uNES+LoF);J8M2VoeEmWD=Akg(*id5|Z5%i$QqOO_{{y zq4MPrL_m2AF(Ki&2O;o<p-IODi4||C%NjX{CoQw;XjQ{;uz4W^fy6*eGQ<!Kj$R+j zdU28uFJaYm=6Dxw-&$VRmZ7N&A1rCBD@)p)g|&rc?fqM~m%IdPRO=2`uoEFjoX&E1 zjtbhUmlw;5=Mq=P;%bK077tQKqx5Jtr6=%N!oGPigd|>G3=k8@xeLzw#V{>?BAf!I zZ<*V_!A<8B3JH8jg9k|^j#^$mqwpf`hFl<WLoUptAygFThia;jnz{)nX$xuTak43Q zAx&x*UwIa;d=#sXrTPNIUqU~Bg$60SKy@5}`63?K=upiz0&x7D{tknj0ThxF+2d<y zhh~W2C)K`zpF>nM$q2!SJd|N{<i|>rq%PKsVGlA6kA$4^3mC{Rq8N*FT8<N(YEH1g z7k4%7?$EJN#qDOtaGT0dOK995u!NIFAt`ZUi^4CV9ui7KhRj$)!<AflR}q#n7Fx<F zQU@@EETyc06}wP~-Q<x1`<M>xV}>PI@`(~v2Vomi5!=X#lrfppGke*^!`S}j+hf^Y z;@q}|oWSQeJCpbc6zVV~*4))_D2Mb(tJxJp+c(`E;3{A|LnF^pL6#!QT48G<*78s2 zck(DC2ykdjWd1ttgqV@9A>%EWOK5_zFeFcKM(IL~$-A)lHoU~1;uKuvm$E=1v7)9n z{nJA)j<Y+*OZu+ROSc$?L&TV4xL$nEIB>lDg4h-Ef+fyt9H7y&y0>sT*g{>ij0Xlz z!7%mD80U}((k}QrxOUJ^JQuXTfeO*i<PrG9k@g;9+YnSxUks^_uki0-G^f3*v7K54 z*pAVSx2Sj<MIZW33i?_*)G+fe80?S{kYqlNvV%6dFK8n*Xj8^wpfC=K&bv~GCnx%S ziq5v83jf4Y1HOoi%|F8MfUakdH!8^MIs30zy+vmU^$t1-T|wuYs6;U&N`)N6Sz=oe zC|+{qfac^%gyy7w=Jb>xeM<X=5fYF-gWQ}T*Pr+|Oli?qMm?mD)(Uz20F6!@eM7|J z0iB6}*KZM(WTIFy=t%`VH^ZKE(31&zekytt#6~faewG1;c(~haWVc@4CtBM)5P`WG zzYC|&CqSK-3XWp<BwB~L$VtRg+6Iha2#Xg($RK16U<q}Y!ie5F(fPo?W1J)2b;v{V zsQB_LxEG>EYzR?%8I4Y@4t6{mYJ{?K`0B*5te2u%Km8D?ZJ;G;KD<pcoR&nshR5_K zzH|IPFs`l8vuK566Uiaj8)%Rpg*k#ki?CJNm3`$Ip=c)2RQ6KNo3x3hLX2i9uxu`9 zgS~=<9|rC02*d&XABUUHt(aTC`uyTyA>4VN0G*G36rr1*VlwaKvE%Z?bZZGO-O4Tx zhx@GN4R?i8t>g|C^PHbkN3u~rh8Ys!OVCN7l@EGM1S8%kj*GR1U8z;^NII7FnMTL| zUTlAFtD7rt3dQUFC<IS#n56s*`wlz^`Hwup(II^Kd$`}5X+J~HvzP`(CBT>@81YWP zm=xM+w66v24BA<=ZwKvMz_^W&aRUM4CVIU^LjE<;2l+N1`5fppKYuqN@vEpE4)<A! zQ%KjBll=SWg;rd{g}+OMuy%o?zD_rOKt-3MzVs~kTlwL?F|h-B0v^yW;C^rDzcqcC z?gQ2Yz4Fr@nB2w7Eyxg^c;a1~I5Fsg{&`Tp@T}!t4Ed?&LEcYVtEPjq+RDy<hz~<3 zB!p0LIoVc%#cobe40i)R=Y16I;E4iBdIe0cep!xXw+9e6Q*brF1|N|-gQdC&heOeH z6YdA1zZklmJOZu71)OZ$T2oW^R@Z(=mF)8B+MN$qZ?AsviJHE#dUHvmySe4no0Lh3 z#%VM}UPUoPV8hkH@FYj%K;-S!oS!x$CvbPv{FdqZ*?~CjQ-^!R5@dZs0VMBC(Zf1^ z4n?Mvdfp#^(MFs&BK=zV6ekPF31f)lgc^(~o>H3hWTQ(dzRF&+a1uu*?0N>?OT+?6 z>F^D~u`uGIfUtDUsv$UbuA|bL(h+UMgfmqKNdhZ$0#38koL&)fNsX?Dd!1(*VtkB< z5P1=0fB0sVb29$`TO4~uoo!|NrB<R}((7jF(*`8oa7saBOz+hRe!N)6drLZ`5XqaG ztRK*>@Q(&~neHbCgrP_Y5Hp*fiPIFgnwmH+5t)>i)3o4V1?MRuH5U0E9SNwZE%P%R zsNfYIEhGG}2q!4e7ZI}vO*zGVoPsM6D{%6>!jcP{!bzOP{vzNA!zB{r^fiAY*D11a rC{7u`nZy}5gaIUC3QB0kgLo``DnFDT%xBWsbRr!W-!y7jd~^Q;{V^|j diff --git a/test/internal/__pycache__/test_simulate_update_output.cpython-37.pyc b/test/internal/__pycache__/test_simulate_update_output.cpython-37.pyc deleted file mode 100644 index 1823f992a5bb061305e2d5bbdfafb277abbd211d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5020 zcmeHL-ESL35Z^t2JBjPGp`oFaC~p?TA8`^V76O`*BBVAIO-qU~S}xvAbIJMc*gYq8 z+6d89LPA1)L%bk?c;cVo54cyJ`X|5>GkbP$Tw6tmmI`H0J9m4tpEL8@ncbDKu{43? z{QQ;q`#C~>!$LR3;p08X>U$uZaB7n#tx<~KhHcagct`9=Gg^x_W3?D1?NQB%*Ag4V znV<w8{U=dNd_o-K4&l*SlE-Q(9<QZ^u`|LGJo$(m(b}jkrFdGG#&l_fkLpr}kMYbS zQai)X@GQKue4L+!_c%A!N$%Vem>tQ{U~<KBz3sNL8m4{S<t<y>6ebsPEoTHV&-5GH zL8|FCcA4u5$NZ8KlD?mwhBV`dmUJD{W=)q1d!{;l|M0DlvoCC$?K<wh!?rA2DByjn zIn&c&TWk+K^wnd2+Y{JNr*5ZKLkiOuoS8oGX6A~e@@%OzTU@wRTC6TCSBvwr#ieSo zI1>&YHiFJA4%O$D=Sr2O%G`1v(=nSk(#*-l3;TVc8q)H7%XRwuYkB-{O`~V>9eE60 zD;qY)aPlQgo$e0x`?K_6+Po7v)xk4N;W_D`Yec;UI)fJ8HK+OI#f5UET&%D?OZqLq zhPdYmX*Gr8=bin{6E@Yc&^bumj<uyI-<9TF!MG(w1HRj6s0B~DJ5W@GrrT1Y0SH61 zsKTCWmypR9DszRCkYuvuu;VEeP7eMLv9~Z=T%0W~-zqIs=StObdA3*?hQ0a9($ai! zv9i>=I@~up*jw9Jx$QLErYD6`f}fZkRC@|<Lxvu#>mj>Kh`8gKJq@mRW2fMHvEb@% z*j-(8t>qMC|1*$155<--bvr)YJ-b+XvAbtDs>Uw{C=HA(F&U6kkgq^iRUke&B8LzW zA5x$C#!iGAlf;kuF&_Dr9vP3blsq6m#vjn1C?y*Z1Ajzrk~{DZ;??Nd!MJTT6>EaC z0PmRJQLb|k%VSguQEUogM9v^UGjj=v<4OpUNRZrYS+;LEDo8Sheups`MaG3|A6{Q) z*H_oqFMqJg)^0FxM(pZ`*H+hqjP6R0g{~dK;K*iE1{wVaM`aKdZ~sE%D0KA4!If(L zwh~g+&25wCH_d(1Y1c11X2W&3S*{CbPt|dfssU6-+VyMJW?fmnnDxxYF02LG+7Lr1 zzFY8x@(Y&Z3kiX>E-_^_TQ)?VEOdy>ZTViy&wK4)%yAh66%2;jvhHrfbQI2s7;z(N zq-lmu7%~Ip|3D!U+$iZ)g~Vf#OduJcfE#O|gpLLznoQ1+c*2q+NN`ah8H2AN<2s^e z-7Wa{^t!X~_hnr7)Ct48wb5gF&tAB{->dM40~dZ47Y?U1o$!r7xB^*S1@eIG0RAq( zNfdGfaujlGH=-{2^dSZG89a{YgL)BNF9H0du4AYbtiutFskI>67eFeBg9Q_PzxA0e zFf49uef`bFgNXuyr{KE<anEdew!o<PiEcSLs3pW}xoD8m*h6#&nadC>N<5#fO6khr zd<PYMjf1Ri(qZa-fod%D8`B6Pj)g#aj8Z~7CG-+aQ+W}-28;4@;0zI^F;tW&aujE5 zw<F49AtMJBkpxb?N5~TH7Kl8LWCF=6Ktee-{)O|v@yTGwVMR{jaKC;GXpG8Nar_HN zrjWb_Bu6EptY4y|TB03{eg_p)5=bc0DJoxw@4-Ud1J3glsvqqN{D|@th*}<tI=%L? zi24aSuUu@9yn_fh2@pCWe6Y|v`@;`VLFo%BZO2m-#6FGPo~>27o+jUQGI`Up@?W&z zkSbJu^RK%gyw!orAco#hNbOT=aj%Wag^Me=5Yiqt+{{N9>o{8QuX>|LmCG|o#(~rl zTh=|lB}E89Z8droh%jvtdVW2N(p$dX?UQeZ6L|+W33Um`sF9>uYS2*{r<rrnH==Jw MBbhOLl8I#EPpRI=&Hw-a diff --git a/test/internal/api/__pycache__/test_api_prerelease.cpython-37.pyc b/test/internal/api/__pycache__/test_api_prerelease.cpython-37.pyc deleted file mode 100644 index d3821f35f77c84eecbfafefbe9d7ef5083377423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 837 zcmZ`%JC74F5VpOKY@SGzG&D3RND4ZH5aDzkicTP!)k-U0>|8e4^{&Rw-K~@>;P@el zsQ626sZRU@D#k_$*WlHB^H_U4GoRlNhdqKzegDFLQ9^z?=ePni-l6CV1VIEXN%~jQ zlzN|~%<CWxQL{3t;xwj2vUNuUBK$_~X_}zd-S-YeL?ZT)zM!ATxbuKn$$U)haMlzT zAVHRrYq@aY<HC~28H$b(47n$Gkm4C&=>H(#O7!si`s{V~Sxe9vUvV+H<TqTk*-Y_8 ztptCSNp-EWx{*pR5bI{u>g+>tnd!pFmknQR_?5)7Wr;h)W@@B1(?S^uikDN~6h4xp zkvFGOCrxVu47m|%R}o<lAuha)hI2v`-@->U4B1mb5A=>1whs2;jtX{QcfrXE&<jnp zk9Xk?|4_0c`wrR|r^N3{(58BBx?hn497i~R5SZD<hQpOKHqxdBIqq4e8XL$~T2^Zt zHr%XixULIjLj@pgbOYFW`V6FjLSD;!S(FG+SGmi8<FK*3Ews^gG}Aa)Q`G7lpoVee zyG;8_l^a<#xhMeK44~s6ad09AT>tjDn`i$2tDfK{JwPC=$3}ES2W-ILDf;69^ijbG zA&r~XB}yZ;t(q3PF81Qc+2lyq1SxUyh$;VG($2EDHCv?5@nXY@!zS(hqtoB_sB+(f aFF$!x)nZ%9x9&aqIun*q{MaBEMSlPTeAy)c diff --git a/test/internal/api/__pycache__/test_grid_data_api_prerelease.cpython-37.pyc b/test/internal/api/__pycache__/test_grid_data_api_prerelease.cpython-37.pyc deleted file mode 100644 index 5fc6060227e8c71f7b05aef2d200a13ff0e9f3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3098 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 diff --git a/test/internal/api/__pycache__/test_mouse_connectivity_api_prerelease.cpython-37.pyc b/test/internal/api/__pycache__/test_mouse_connectivity_api_prerelease.cpython-37.pyc deleted file mode 100644 index 35edcb7fe67f0b7b003be2b17e10924ecd232a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4183 zcmd5<OLN>r5Y~*e+Fg5h?W~>HPEsL+SC)`<oD>|W6kr@5Qk6KwaSBiwgsd6cvR9AH z%-XTpr2uo`M1BB=HJrHf8~6>Bt`t?|!Vlm?_v~7JYz)PtQjton(KoH0p6;IRnRm<O z0Ryh+`!BrCh++JKAA6Sxjd$RYzX4$eBMrmpzKKKhH+86fn~tg9mXm`wZP;Pn$rI!? z8-=jw6m{Eb41|NuU|4cW#Ng&yndO-Mm9aydivG&8g8mv}MQ4}|I49t#LeEHNbk|^m ztfYHSW=NS;G;%6KhS;!1#xmptt7>FCLq^!BMkX@kBs-;%(~R6RYGaRKw#HnIq-9S^ zE|e?0KynE{WlhGB+f+d#Pyrw`J$E~9N<I@u5%*QF5vZ-{BzRA7!5iF@JRNrV!-R_< z<dJe&;47b?bhz-HgJ%XFSp~v~GS*0kwxG3315}01Ip);VRLx9jEK@7-)M{$2#X$tR z3@%5m;$Z?(#Sex+FaGiM%$tk%L1nq<t$M7!<ZXJ<*5Y*J`EkU&Yl}SEkc)A`Bk2Q; zlhrM`cq>?1l!4-x6VG4wRyh3IXaEOWpHy6`$skf(L|$XkO9G9!Ax_x^k=dMG=yQ{7 z*7am7ElCv%5Qpl?3eJ%NF{mg3^>rH>R`1b9co{x=CLm~nHdSWFYJov^DKS*8MR!Qs zY?<0H+v5iY0Ncj`98yRB)NEmcB#}o_K!S0c<~9Y)Qs9U+OKTyDh!>ZG26rPb<c=Bo zo;GBc3}Scb;5^Yy5=9!cLQ1qi#1OQDUtxgM5^=12?86I(#J(AL<PGpO!v%BPO~0+Q zVd^bd3T@IN9m33AFu^*N*A@K|5tCWF-FFUp><I%9-~o=0Gmd;8M?rIZo^cfWI0iJw zcRdb*qbLic{+J;kRpkKrDMLVtvH|%S5tY~af>t|Sjeqa)nQXADDJ!khM?~5OxS^-Z z4fr|4AD#y(g<a!@@zH3TwrKC4i`e&wJh=EiSPtA?o_mbTrdH9x6flWq#+XHiukeUL z=wo~(B3^@-fEZ<5mI06n_i+tsKTC9s5?&<Xm%w)$LBw^4ZpLDLxe;%=Qh5;j7#@3& z)N-W~O<y$ycVTQD)ER&QBv0T_8RYpQj<!NM251nWLIGrttY4y#iR1dTytBvk_C%*N zU=FObeXX3)CygY~YEEUJ5v8Y=4*KDJ)LU8-e8VYq-+_nvI>pQcsZlEmOj)U!#7SD2 z*4YtwW`&4FYOZjVj=A?1=I_re+@GIy7v^VY-T6Cr7TlXR(upT_%uU~(P0v2DYkFq> z&fJH$QxlR=YHxUrCL~-lHATFcnvhh}oW_o>*OQpE<k77AJZLT70Ag5_9CsIJfmZ1S z0ynJ^xalc6PR3!Wi}Ud3q0Eher`Pr{G?bx8%UGj3kfwB;lDV2GFvq1MbFsP^CJl}S zfHQ3=XACU09|vwT0viU~SYdQNIXb1YI3@R(e{R7jd#UvTw0+bJFHBPy!CK2TXfRBk zP-9x=4w*38mLhAkW40_tA(NQxT<@DQ3z9D8A4F}H>(~rd_cx>Me9P$MTXxH2_O3|` zT$6W=dE*14mG2Z<xt5J-TF*Z}_c(?TQ)@*8Y<prqBpDPIsFCi~*XxlGY`b!xI(~Yk zy?uMH_SE;vP8~`MJ_pOo^uZEa7hFN^-{7uJ<jW!s!M3{gJjT^kE2bud_>r2B+RL#B zJ(XHv?60ReD6RggbDG7QQ6u)4+oy6m*4qsDs3LRY$mi~6pjK;zuG28@bSsL<1D57c z2cFt8ZVDgX$`iOg%oWyGVxH6fJ$~rBAX)Da3~G@Q8HU@Y0}#gJR9u0+XT;^=1+>76 zK(<f!5-{ewr|WX@5{wUN3ilF6TrOTg>>`pH5a�@qTT^tH9CcS#b$}ehtZGBy}W{ zNO1RcVAF8^ut)ple**l+xpWHpo<W!HuZU&gbxYaPS;ha#rTyCezb@^Uj|uNMmtK7) zU3!9f%5y_cu0N%G{0}@?%@${-<bQPF*x@yqiT&&^{B{lcYG-sFaV#uYI(;~HvW3E& zT+|HVs6(T~DeGn(;UHSkwcjac#mt9Npid#r+ZlGKz&&Wf84=Dee|xmj=NG*RbMni< zL)?pY&oa2D72`;-=!w%nptgBp-5J<FnCX3tz-@vq90F5~z~B@((*s#d=QDl&DO?X@ l)@<;%a0@9hyTdk#bng-^(P6V<RSFh?J6F9_%~gl+{u9tGQF;IX diff --git a/test/internal/api/__pycache__/test_pre_release.cpython-37.pyc b/test/internal/api/__pycache__/test_pre_release.cpython-37.pyc deleted file mode 100644 index dc304fcf673e58f453c7cf3c9f422e8333d99443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4172 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 diff --git a/test/internal/biophysical/__pycache__/conftest.cpython-37.pyc b/test/internal/biophysical/__pycache__/conftest.cpython-37.pyc deleted file mode 100644 index a5283d0afeec0798798117f7ce0dc3a1f20f491e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmXv|y-ve05Vn&LRiJj_5g6z|Gq53q_)#|$B-$>KrO2_5)JkecwgXBx-lP>155UW0 zW#Sc>xK!e#`|eKneRtpeczjGS^v65@!umZ7{}Ezyi|Ni0B$2cx87WCdf$Rbq?5PZ^ z(4GO^g)-Vxii`!B9{nJjq}j=GzF6kzeD(a4_K~+OY)?HnpPR<3joLzPTRm&KY19YC zWfNiQ8idbPsf~p`F2RF-?PK0FpyemAF`hlZuY0&+D+kswzUFdP@HehIcBi>8TJlSV zI>!vkoIo_qx^wJN70f9Q7Y!E`F9EgqPdiy9gR4Yo4_5O!Dbzur1on9EW!R$4essMt RvaR8Uq7OHi8HEv@&_6oTVXpuH diff --git a/test/internal/biophysical/__pycache__/test_ephys_utils.cpython-37.pyc b/test/internal/biophysical/__pycache__/test_ephys_utils.cpython-37.pyc deleted file mode 100644 index a8c23d1f99c4031f4bc08fdbd5bd47d192742dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1076 zcmY*YJ8u**5VpOK+j~Vw1OX|iXtv<4potJ7mqc`sf=6SmwDPT;%aVOzdoP^0D<EkR z4GoAQfr_8NU)h!_9W@nW9~T|7npxYQKktmc*}Z<hgTRXK?^x&{^vg_E26Hq5S1%xN z#Bqk`@{K8hImw*dr7m8sdAUyzMtRG|z{WOhV<gb44tKbFhE6f<a*z9Gi1s*sj>6U@ zoQw`a+_+E6<Tx=iV+7m--v?LQ5IEN89CLDkH~$~QxnG?H(&Q8^uqND_Bkq47a~wN! z`-OuE(7}H1T$)NJUp^cAxf41xP&&=)tX54Rg{sOz3EEdIud=k5#FA-2JL*J;D&|bH zkTh<=azT4i=vo%>lx4LD-G&rZ<1@*MiI667+MWm<TcY6@ZWEXoE1`cNY0~)fcK<>2 zQVFRdcEtE#%uZM_i*^f^lm%z^BT-CMR92!;3B<BGnyKhXI*wGT#l4Cp$7~{in`N+r z9}l%qdYBek$bx0VacT)^0%L>3!tmo-r<od5Gueg=THtB}0wO)!!-3;t7k7xo5^UDN zj0Qfq)uDm`2MtmTHw|jc(HwJp8(omdS&)UZa5Xu1<^-b4oeRv}O~BN)_TGasfH+r( zXOU-Dh+!@{zC|*FaAZ2<fcBOe6m>op^3tRvO=m839eo^`!M9Ia`QAUJ?~X#h>8_Pb zZ(RuzPvbP!@u4hpqlPra(Jqsc&0_JoW|=hi(roN1&_<_a@mR`IhMv8a2CD{78=N*+ zTNRg~YZy1}Jy%SrbSmOXib|G=Q0fMNss{n#fcW?t-hxM7hk4kiel;^R>OpNFi%rJO z;YV2Z(Qqa2V5RIJFS*DDYx)k>>kL-=8qaQ|-L;*v4<Dti!}JYwudoH#Jk}~PohfZO Y!9zHp&cq|r3CgSoIDj^}<7{mF1)#JUTmS$7 diff --git a/test/internal/biophysical/__pycache__/test_optimize_run.cpython-37.pyc b/test/internal/biophysical/__pycache__/test_optimize_run.cpython-37.pyc deleted file mode 100644 index 568676adde56afef1a31be6ade0b43fde814d8ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256238 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 GpZ_1pq=7vE diff --git a/test/internal/biophysical/__pycache__/test_simulate_run.cpython-37.pyc b/test/internal/biophysical/__pycache__/test_simulate_run.cpython-37.pyc deleted file mode 100644 index 604c519f12589ed5e771057c35f58d707b6fd2b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19472 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 G0{AbXU~)_V diff --git a/test/internal/brain_observatory/__pycache__/test_roi_filter_utils.cpython-37.pyc b/test/internal/brain_observatory/__pycache__/test_roi_filter_utils.cpython-37.pyc deleted file mode 100644 index 2fd476c6c21b9cc5c54a5722d46d0008a431fd17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1475 zcmb7E&2QX96rUM;9cS}VBo1&u)xZU<NS)9C2NWfwA2+B35g#(HtXa>jce?i2otaH{ zSDOP(g}5NZ5l$dZ{0T_>Bly}=j$C`<jk}wKR-pFT^YeVXnfKoBz448WjV=OFzkS30 z?jZEo4VJPFosXcIKLI%6xInS{k^+|`CKw5H&-=ya9?YSf0QxO<0DbPT<1p_m)}M}? zUI1%&;J?7W70?X%Dx9)7A8d9+z`K0ydou8I<eqkJg|9E>yk805;G2)oDUL&qk5KQ* z8AO2Y^l<Z9E^I0lmzgkWf0}Y>EK`}7MOF)u)|FJ&Y|;B;p{M5~F{wpn1>d4#l8M^N zN}XXi@QgU{0rH=Ja`M-~qVvZ=zT3*<gV~#(un8@h&4zSojpkY~D>Su3rsxj%)oB%G zyJ}qaVZIuGZYh)jQ-(@-RaR*YUPScv!W(*>=9Q)IX3ha8kUz8v?ItvH4`A+bJPP%W zMRPnyr{u)9m=o?jLYB<Q+&?9^fTL4v2G)Cs)dzF$hb@f$r48AAPCIehUqU^6iatYM z!50|r%)Yb2SaZRUp%0`TQX|W{5cK*jdJNuI+C=m)vtw4!tm1+WnW68WuXQQNpwg7l zJ~J|-nJ9{DEj3c*)K>KCQmV-o1)Ku1iR-fo^cgUEx7~jybGdQiL389BK{Kxd<Y<oW zzLJm=d_sT{G9o{c`~DI79qAQV?s*M~b{Z@iEZd0|o_u@r!{l=#v`N^I@u<%pFf~mM z70W8c*={1#u}P{LvXuc=^>AvEk7YkG(u!*}%SJ30u(v2cgO9cyPuoytLMv8m_cfC$ zt@?2OF#~?4?Ru&!nGR$DO6l0j!bJ7-Nq4V+YR#&$-hbOg<f<<~vmJL}`X6;2?G;tV z3bPNL<>r^?=You$r$aESU7cz7>$q6bYi{U%8t*_`c-Ql_bF=Xv{KlKfy4gH55UaaG zx3#WxuM@9bx_a^Y<*V0(%d6L{o?pFYWpRI>G2OiJe?++a8s{9k8saX#N&-OrDvW!p zaZpd)-uS&`lA>jPqUZ7xJ)4@R0s1A=qj;@mnw7$8ITLXJsWrmrD`2GQe!+^dXhUwT sUUJ^K){@tRdu7GPh1ho$Y~BJ0$+{n4;!(Vb1MDxp0S-Na-4oz{03Y0vq5uE@ diff --git a/test/internal/brain_observatory/__pycache__/test_run_ophys_time_sync.cpython-37.pyc b/test/internal/brain_observatory/__pycache__/test_run_ophys_time_sync.cpython-37.pyc deleted file mode 100644 index f9b3386ff3fe6d8b743625ffaede26069182416d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4295 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 diff --git a/test/internal/brain_observatory/__pycache__/test_time_sync.cpython-37.pyc b/test/internal/brain_observatory/__pycache__/test_time_sync.cpython-37.pyc deleted file mode 100644 index c232dca799380b90cee0d7033c543073e37c7755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17805 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 YG>F30yh2MH2>~1YH`G0Z#d9<M2h_E5rT_o{ diff --git a/test/internal/core/__pycache__/test_mouse_connectivity_cache_prerelease.cpython-37.pyc b/test/internal/core/__pycache__/test_mouse_connectivity_cache_prerelease.cpython-37.pyc deleted file mode 100644 index e6ec820b93d104b4460e71a6a733bb270e9eefb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5712 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 K)$RJ+;Qw#G$fL#p diff --git a/test/internal/gbm/__pycache__/test_generate_gbm_heatmap.cpython-37.pyc b/test/internal/gbm/__pycache__/test_generate_gbm_heatmap.cpython-37.pyc deleted file mode 100644 index 582a5b42d157680541d04773333a5a1e04c8d5f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3559 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 diff --git a/test/internal/morphology/__pycache__/test_apply_affine.cpython-37.pyc b/test/internal/morphology/__pycache__/test_apply_affine.cpython-37.pyc deleted file mode 100644 index 3816b49ca0f84550614b3dba1a92ca4f14db8a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 934 zcmaJ<y>1jS5cYU~ZwZG&K}dr{1sB0Zhz=n{2y~DJA*9u!le2d2mfJsUC)~nr0pS7i z02GO+5Iqm$mg-)C2F8~}929so;~CG)H{-D%UA!0(T;-P!?3+W#4{Mw+ipoP|bqfV2 z9C8xdo#s%`n1a=v+$r4HMcw7zClY%co|Az;#|*MF024i{WId_!YTTgZ?o?c))@N4_ z`2zAbvigofV+~G`Ejiph4Df_<#6+Uja~O<iM>MqL5IQ*XEbZf7w}|5~b~>k}t+Pft zw}oTcx+j2LS~Oe1v$<ni54it1>bw?SJDjeQ&Yx|x-m!Z^9+Ows650h_*oN9W_FKOV z*2xJ>sXEfZM|gAe5+{JS4R$18_w$9oA(HtoTys0VL1bvgjjNkl7?>Go47`hd$#}M} zj9)V;N^Qb)lI0xLIM7mvQO4tbS{3Nk1^Uq*gwg^_iy5!5y3U&s+uO@ZVR|Lbbd+aG z8!ywMu&|95O2<CN$!cc$TS^J3v#NX|WhDnadC9_fg?*aXQz^?4MoU(zoN0l13*@*j zX0=GQ;3He&PTa3{HN%o;wsEGSG2Q{o_r+HtuOQ~n_uKc97g$UsY{K|(m%U|WlWdhN ztxC@BCZar0NmYwdr6{X<(x~KVwwoyI{C3UKDH{vS&2x<4(@lGg&8*ZymMq^~^t<>< z3&&`A48yuHt2X?v(*S!?8z>0egpm5+LxdDU<WTsRLK?wkkXJE!;LBCq;v46k49}Yw t{%K-KJ$;w!|BbdYJbgr4VKJ^Hv4&?RykAs&KNk<|Pf|XLkgmXr^Bc-e0^tAv diff --git a/test/internal/mouse_connectivity/__pycache__/test_interval_unionizer.cpython-37.pyc b/test/internal/mouse_connectivity/__pycache__/test_interval_unionizer.cpython-37.pyc deleted file mode 100644 index f6a8d8b0583d0394bc28149efa21172d847bc887..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4063 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 diff --git a/test/internal/mouse_connectivity/__pycache__/test_tissuecyte_unionize_record.cpython-37.pyc b/test/internal/mouse_connectivity/__pycache__/test_tissuecyte_unionize_record.cpython-37.pyc deleted file mode 100644 index c91814b309e80cfdee7f47fa44f36662a5c1923f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4343 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 diff --git a/test/internal/mouse_connectivity/__pycache__/test_unionize_record.cpython-37.pyc b/test/internal/mouse_connectivity/__pycache__/test_unionize_record.cpython-37.pyc deleted file mode 100644 index 4585b9edd2ad32ebc4337b41557e9d5913352d17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmZWmO^?$s5Vf5&NlVKGiT}_8?Ey{*t$-CPA)!iuRv;^q<;LFDo5YT6r>mgd!>WiY zf1wp8{!*@-_zRqvq;!Q~q<J2H%)F=Pmy^i|LFjL{JjV$A=r+fQp?D7IP5=ZFxIpx< zVv1o;3Q`6%z(}IYa5oTv2*p4|B3^}iA`&tDjJB9Y0>4Mo(NCCx7E|0N=UN%9KFKyJ zrC%G-CX6YqJY#g2@gl1W?qxfytf}~_D<f0;s`eS^>w^FeAx|OQ69A8P*pofJ!9Li9 zez3=1A7bRAYkZBiL|{R-1fvh2{VjTjKEeu$f&~pOjG^I$a_eafEXzxo`8H-u%PYog zN7F`C<E8U7vRpao+6N2cUzb%OOR2pSudFq;jaSlh@9mV>0GcSN^><{)Q2zRI`ZPUv z(z=wdxtJ~a71vGrLi5aM!5^nmZ(M3Bsa*zWs&(ViH)@$W<>jM_XE|R<=q(C(A@X^r zWv+nPYF^AsQ#;9Ek_O>wqkPjpVD%q|nU$HbVpcWnr0cx9=-hJ=018HAjO~4>rm^jg zX;_*pr)NjX*^zDbKilDM!;8DYvwx@$CWa-qIlWhL%i+r{{C&^ZJM<S!fWA$hl}6Ns OJn5Y5H6}PA<KQ>!S;kHP diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_projection_functions.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_projection_functions.cpython-37.pyc deleted file mode 100644 index 0f44eda3ad2641b3cadf72ea69028c51dba28a3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1390 zcmZuxOK%e~5VpO~zCsJ7JP(|Zf<$@%A%PI0R6HtBFMx!sl_EEGlWq4U+bIc34m_^> zhen74e`&9r@)tNU<Fr)^^~z(9Ju{y9W@eu)EzJ`c#gEUT=@If9nd1RGc?#2P1Cd11 zjPTh?Idi<neOOr*<ROnJQDiTcp7g(wuawWpK!)E4pO=x0VO@}Oavs)2N#By@!W3+h z?Ix{PD_!oXj!ny=z1uI`#&qx&2Zb5H+=OXv1F>X}N(z)o_MIJi@E&|!Z$ih!`iH@Y zOwhi+J&i%SNqHdcuu@ZoTv)TB;-S!@=qeuVW~HzX?(;}1(-W1deUsXKzVcGptz2}~ z3ti?LT8kmL83^3`A{x#9`MLQhd2f_9iRcO0+7TZ`F-$fJ(J2cl?j@=?FiBad!gPR^ zRc~mLH|b6S_SM}=boRkI=w=y6$o+Mzj9pI)t8^i<^}OsG)doui!g7$>p%ZAI0?PLK z`A#9y?7y262wT;#Zm5CCt4y^I%B-KOIdI+hKnS}@H75QH&X{k9^L5x*atJshsw2qo zJ~L~UeW8*7w%)czBN}tl^lGotyL=JcJy6=V#UM3xW5WPAn9}E3mm1*n${p*Vn-TP+ zUcs<2&J)E8aD3$8Jk<^0I`{|<EP|6lNPs~H!8JNz2^-Tfvset^a+gi0WLL=8gA*Ui zvCFU&y9{r}KAZ+4Z^S0dyt3gJ>Ue(ycFYIlU5L>v#3{Z$#bBrS_B2Ei0cl2h0T$lK z#o$z4G)mRMC#6fHQI5xu<4#rr8jGkFIMjKBYJdndiK=Yx^i~b3+FiruU%)Ooz|KB- z8O$2j!)%#dq-$)M>NPk!0S>c@e!I-xfz2^+5;|z&j}ZXup|dbSe?z8^V9=PC=`xaQ zNLGR96(CK21_L+-WhSip7YheM({oYlCD5q7bK<({;yTC1Ezmfs2MFs1zPQB0YKZcD z?rn;-z4h+3#`t(p^z&-yQotV`w^r-8t6KkeRqMQl()gp8MHTI)1KZbX<~>%UL)Q6m iDmC~+(5|54$9XCHnR<d{V^ASxF^$=x*9hY<Uib@waat7s diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_visualization_utilities.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_visualization_utilities.cpython-37.pyc deleted file mode 100644 index e6130ee6be9ca5ef16577955e7afbd6fa490146c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2202 zcmZ`)&2Jnv6!*u>>|~p48>oPYQo^@Zlx+p55-6lC<wI3bkO*)XEn3a4oyj!bnZfp^ z-Dp<=T8<p}4-#>KzX9=2a6y;@NL;!%&b^fPJV}~{;+3DDJ#U}=e*V4ZcNZ3#1X}UK z*XdUwA%ElKpm9(xLpKV9Ac88A)FVxppYtT}W0*uRGSwKy$s8q;+-M3ef;;3kO-}e( zC?Y?b7Yz~LA<2T66HORf;)Ixo@uXM~Ef`M;x=z|BXRsq#Yg6~+c5X(g%6C$mmql-6 zbCug%ngJSMqtM~t<SKOYG6+j<P(eX5!M<a=91kMGjPKDYvB7RQA$zz*v^M({tlKmR zg&kLNhE8S?iUzJnjun-QQk@o=Od1=iOzp)tlZKXNGp(cxOm4T5#Sf*uHcT`5fi8zv zv`)uxW}a&O6VWHY&AlJ5zTN%INNu|5W-2=U^k!O&yH|>IP!=M6qbrMT(=97mm;uPL z+8mqiM|r;s-sNjmI@ki=@L#3CLTsJ4(%AEPVWloob$(cmjO>A@LJn-co!hZD=vBJB zfhz!*-5d@3MVhPn%m1L+sm87)Z>7UZ$=-IUMnj3GHvtI3&QQGo<00h8i$lm)VPeTH zK<)wF*MJSchi~~3nZi}<GJ)_jyofu*@(G#H3A@eT1Af$3aUZ<Q?n9g5g%0pivElx> z(>io>21G_C<crf?J_T=6j$S4_<KMF{gY_D4k9s?BtaHIp?P%s`->=nT9(>$uuBhDD zK{>2epFqb9L_~I;6S)~^X#vq;T6I=bIY^aR1?9lH9cbi+jzPF^N9xizzLQsN?zoo1 zg_)MJa6w;<<grcN!b9E{abI*pSd*TnO{$*;{h_!qc2DZ(K|zF(xKla-q;DgZfT<^T zFy#UO0zzkC2<`5rTDhBDu9d$&-dEt`zRf?E+RSlaL$U<)*_PV&9-OaKr3M5bT0B$| zARLaDee1ZqRUHrPEOHV__-HRn;KE>95!z%i)z5-<80SMw`W(JsoEDN6W5s9><7Pf} z8L|j9WZMKVSRpo=03H-a=Eq>S0j!{V%zR?wZ>YzHuVp{~^4sr!PX2hO%{8*?foRX^ zIaqL*%07cJm3>ZYWLz?jiQY5mhU}@r-@oIk%v@M$NJJMyZVpswq-$L<km#6o?`vIZ z*a)*mKZ62`>~Y{0J#a_8FN2k7fgtP@pw*-;KrCkZC0IGc4B6U%?zwRRlo}&JYewva zfEps`@e?8NC0Zg|%$&2qJ{pa+89JFE!)C9e5GbyLIEu~;Z>JsBC_G*uC!h|?9+sa1 zjy?9c>1D9eFQO?s5-^sJ2Px;C^07X`M+fX`da%bJWPJ|i1L(ft0g*aB)Cv>~6|Wvf zOaPksB*<6>#K;)bce2Y5Z1$)Kq3$z~@Ew0sgs5H#{JbU=6r(*TCh$L?(1ZhVlx^%o z6|HG}Q)ZqruY#suL4nhD?8%UDIhHPjlAn%~XhY?d(lumZABwinFW?_MK0y-Y_*NL# zxGD2&(;9siKYE571FY!*^ByjOjq$HETc*pvjCrc@-rI{wRE^OtnOo1XbYJ`Qy1$bo zEJnj>T%WHwOl_q~tMY!r!76#{;5F$SJS3g}J|vw-y&)QDQwP`B$Zy$^mi3imo$#6M rsp>D$AMps~eSBDcUA!_Z#Yo9jMA4iE5p$q95PhDvqE;L?Vi5lVnnn_k diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_projector.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_projector.cpython-37.pyc deleted file mode 100644 index 8ea74a265ff59fb8e4817f59786769aa418f11fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2912 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 R<(y+Xh0TIfd}qli{0pi^i2DEl diff --git a/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_utilities.cpython-37.pyc b/test/internal/mouse_connectivity/test_projection_thumbnail/__pycache__/test_volume_utilities.cpython-37.pyc deleted file mode 100644 index 71a159831c0b86751bddbca3facd38cccf64b1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3060 zcmb_eOK;mo5aupPiIQzuaU92XTE{4gv}_ZlNQ0m#f;<{DMf%X8X?h?8sI+z?GZr6R zuH49w4sCMi&ydhl{}N9Hda3?F(NkxJ5^XC^dMOFca`rj%&Fr`P*~&`QfG7IxXa85n zF#bek{(x@WgD?FHgfIl_8D3s8kCSeC7L|5b;s!IqGD(MI#j7$y8qbyl7v@Xj1@o3k zvxH6BiYSTlOT()PM^vC(6;-hWWgU8*8?T9Fu_9_+TxYe*pK?(nZ8g`re8NRtoTHh} z&qk~XXoYrD^6|Q;O&E+?5$C&{^mWu}+y${g<1UDcViQ)}5L;p!%8P<MHrz{7@YZN{ zP~yYjE5Y{wzH|eGHpWaa^hz7g_{16+Lj%TH%_)c0sfoe@;hLG12KpegABBEbdP}H0 z?8Uymb<<^;8HC;64TT{8GkNf7>q#nA+Vb~((b)5U@}oiPe&l!JNcbPOWOSIe;zUMi z2V|V=57O4x!Cnhyl-Cl!a{%+h*j^8Mh=c1|ruupiX{jQ=cRh^zscgeck?iQ;Fwg_) z&`wnR3~S=3t@r!kUgQV8yyY<N^+Vb2>!26tK&FjkkS)nD(Svq?uAt2+x@hn<rZ9mD zv=9OtK0>PjKgVcw%?TSB!WtUFzFm}>kIkV0Eo_MBmzvXM7&Wb-sG~sqU2}>dn3hrC z>aLaXD9P+2sp3@Og4ww*q$Z#rsyMu_ls|B}XZlJh97Q<iqJq7v@=!*(H@H+vyMWi3 z18<e73sBd=mGMDOiwyW46!ZygZkZ!C;v<uMz?^^=yyWQ>ZT-TimSdg>i)wEdwWhG~ zrP^<?R$vB|nhI@Eh@rwXQn<1r0PM_!sCZkLL+!5Ax#{i1SAHlV(5YI3zL^6#(CNjg z%xd>jNGOc%=Ss!OwJ1&*PZRi#JRWx!A=$ySX}@-Xi!gtR*c-ggH`oSKm*Bqu35_m5 zdKZ*ANTVEx*_I)fcMF%TW*54`vvY6uvpxUWxaZmm_gl7F*wm4j)a0r{d(<Wfms7a1 z(ySG2JQ3-w({AOR+8F*_=r~Jb2>A|Z|Ccv^+@(m)T>AU&%oFt%nudWoWj*FzX2yGZ zF(R91njQ;r1xDnSW3ujocI2eNk-RFOCnwSev#EoD!3T4x*qOIL$pa+V7VwwgTc87* znIo>vu{GqdBTa3OOG7rqjJ~1Evn(~6l#%41>(Jg)7<jLOVS4f?(w|V+y!9e%Xd0#} zP|u?G7INf~%uKL6vx!~QWteRdiiIeinDImCouUDTxyh<rVeTDO(tSV4;XuEq>mbfX z;sa<wB<4H>esgV&?HmF0{s8xLY34m^y5-zwoHF<3JpN&(dYgsIBJjI0ux}eExvTf{ zM71)T>{9RG2%@F4e0}?L*cYa{31f4AtvdSq9_R)Ao(i&nmbq(!P2e5PbxS~ik#s4< z#*j@oxNVHf<TeK|sK>|@<`C!$=o(9)ZD?_ZoKoTkT{$K$%re-BxPC4$_n?9ZZT63S zC_CNi0)!C$fm8*K*#_a5_^Fm{ILG34zH5o&iQ19liR@2oBr7YYA)bLMEA@QU1)?By z3G4+@*gb~$l~srv?trZ+o<G2Ltj?DK=_(!$TwQ~@Q+OAwcL*)Vcmv|NiRLx`g*c%4 zf-%JRHONy0N)&<0(1bYgRO#w00_7$h7%rdU7FP`vZ;SxX4;VaU+@*zRsP}Pr5e?;{ ziu)w969wToiMhh<r>>%SE!dae1U9hQH!wQI?S$8f9BU^>8}a@K>fKGRlnihh&yM<G zlGBJ+c^rgEPd@tYEAqhma()A9%r8HUS1&(}v+g~O#Ve2J%%||yUY)~RKWh@NzBo(H z3gxH4bKO^xPGCB#=;)*qhsZm#LSG$tOS98l0U;8N0XP1rH0^LoJHp}wGg4C1b;h|J k#-iVockr^1ZiB#!jKg=#TB%lXDo)9<Z&bF~PQ_XM7aIPyAOHXW diff --git a/test/internal/tissuecyte_stitching/__pycache__/test_stitcher.cpython-37.pyc b/test/internal/tissuecyte_stitching/__pycache__/test_stitcher.cpython-37.pyc deleted file mode 100644 index d45c93f4089dcd748ed9f5c3043e72071cfb8a9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4715 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 WlI1nLy4Sq5;5EG&&-0eN<^KWknn9WX diff --git a/test/internal/tissuecyte_stitching/__pycache__/test_tile.cpython-37.pyc b/test/internal/tissuecyte_stitching/__pycache__/test_tile.cpython-37.pyc deleted file mode 100644 index 498ca75f3f1fb3cd43645c560b9693b57f348b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202 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 diff --git a/test/model/__pycache__/check_parser.cpython-37.pyc b/test/model/__pycache__/check_parser.cpython-37.pyc deleted file mode 100644 index 0fac5a126202dbca154b3656e77ad4074273f4b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 459 zcmYjN!Ait15KYo;EsKl(g2#e(1#cpv?p3^qmr@9`&9E(P(~@*o7QD#%A&Mve#V_d9 zlfU4}Np;16d6UWHy_w9_WHM%C`t=dsDSo(QYl03J<o1|AF~uuZ^MrGzgz}zPBG6N# zQkX;J&!ZQX_$bidxVnGKqTrKQEaLsx7PV}_STq@TcVsSl<TG-+PtdWBKd=oS=#1$6 zCKA2hnnHK|Xhm#N3T&2R4R6c@MES~Rr|BK3+7xn7@f_|!uhUBnS)&!4q^MUmZCcbe zBW&7yZPV*wp4y_rqZYCf7D(Kxq8F;1c4)h4-6*W4)Fvx`XO7!-zqi2dCsh*6!n)C| zTMy$VB<w>eYbdmoH&KurY$fACEuI%c?;?XLHcPG17{~o%YN%1lemv}G&^NxTyHEau XouSbgX)Y@~cN?^>_pS)Nkca#mtG;;; diff --git a/test/model/__pycache__/test_biophysical_perisomatic.cpython-37.pyc b/test/model/__pycache__/test_biophysical_perisomatic.cpython-37.pyc deleted file mode 100644 index f3e206b10d3f7af00a9b910ba623749f5504fcc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1690 zcmZux&2Jnv6d%vdOeXu8Y}1m^Qc~2*9=bVji-4vLpHjaB6bZA^$QgTgy_vBG+q3Pi zW)Bdq75oXi>H+mH;m!qVPDq?Mazz|?o=rjz*z)sx&+pm(z4z?<tybNECSHC=RxQW* z!wMJ81Lg>ZPJmE{qQt@L8DUh(E_PvdlUnLw581U^;->))D&9*r(h!Fg?<bpS9oLb= zoJnKSqygQa;S0BtT6B}ve{jyw8NzLfzHoYtKjB2@Q4f{Du@pl-0?vPGc%p%6en^bv zx#7&p?fYD2<C*3$N$zF*%Xudw%5akG8>S5x);Um&Xena5t!-N{0vN|I^g9UPp#=b0 zAOjH2(88r&;YO%%CvM>si25&F<e1vhqrnOR=bt%CfUrV~n%O9<hgW!$aN!rV$>t&` zf@PhCu)0xr%SN%WY+8sb*ZP8{wQ^wgm+iuzbZBGGq0KV{)*)>bVYEftK({N}rJcf$ zu7J<Z%2{lJ&((9^Yj&nvi#nY62Hl1|>^|K+XVIWn7EKr}v%B0YHtEiuvqD8<*D0Di z&Z2#;y;^Bopy`-5m)DDW(Jnfx8erR9-YD8DL>s5xPe|W1Z+#ERhNN73#J}0>-6&Ci zzB@K1J3Kfb8SkGc!o{7GWPPbdANLU6ekRo^ggv5MvDip8n|Fm0e40v{>;oC{gz0%J zC4vtjL;VS42G<`x{`|?Oj~_h#<m=KWI_A6#_(({_6r{%)!GQMr-BJCwm)ZOEU+%6o zM?W5|ne6AIc~|Bp%S|+ui6JA_r^MimAvd-N%I+i=vEfognKVq;0vY}D>aSlPo;<l* zqG^dt@22wM4BU=MJZ2HpPMRmVF6(O<b|a-Lbs6ZHHY`;x7?)lm2~{=AqH!5sfGWcg zGf_s&7+)DN!4xqpN~OxiGLfTM888t`%J7bLk7AZ2V5~^W3{x5hpB*P8&9J9sO3E6r zrB7KxX1GRkg?*!q%y0|BD;15VB*~e^jUgBCCP>2PtgNYAlwNgZU*u^vgP<x!X39Ql z+|*>sF2aOcvCM^ugcNh8WZAx_HG>Bv#Yaj>)!V|`g5^pIk^lm@M#L%Zthvh+WA`L0 z8<go-@yz;`es15Z+J^H~*B%Nk7x34C@oa=~ZOUTYIM197n6f_-cGIs)Hw9GZD;5fF zo(tf|^eacb4VHgDKRz5hg&XSu857z+A<u}I4ekjNOF_xI116?=ATuU(47B<x1`qhj zKy$<HWF$U?QUTv20SkJ1U_Xt63SGrUC;$B}QN|RvDKR|mLrAx*?dt}2;6C~gh~s&# z=Y}XiZB%!g2sk%Db<{<ny8~M2Zs3Ms5rSP8dB}6Gp|0C@)h+Pub#Rc)?Cz=!qS^z3 zZ(UrmU)`>Mez8dNv=30>m#iuh@BhD@{T}=4oY-o`*DuYWh^n^|+12V-U02ENOAGtX zzs&(W(-+6u?IO@uPp0%zqE2z3PkF|N*nd7GJgJaWDSD0U!_j5<9w5jQ_Q7qCv@H&Z M1N7#)*KFMW1;s=3J^%m! diff --git a/test/model/__pycache__/test_glif.cpython-37.pyc b/test/model/__pycache__/test_glif.cpython-37.pyc deleted file mode 100644 index ef896384219039afdf1543203ca786c6b92acd28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 zcmb7FOK%)S5bmDG&g|@Z{S2}5260&g4hRXM2n9@HK_s+9a>!w1X*AyMU5`CGGj#XH zaWs1X2Z;mXH`wCD9d2Cs51i&mPPxGiaiXfmUO$uzv+AC%>YCc>ufD4ObY>=C@MJ%I z6aTiz*b5X+9vc>)z|g<IB$(hS3-N8Gd}M_duXXmwu^49~H*`s3r;U*pdbD;@f7A?{ z$Cg1DNVd}wu4p`G2Rv+(<O!do8IqbJAgM!AOSDOvC22-<NSY&QR?Lw!Ptv?tAZbA? zilyf)ToinRbuYby$XTz;EAO*38LSlvECXEj<XGhyO1-_U`>}~Pr0H|Ch6mpcjC(M2 z2PVUI_@Pw-1V<LQwR+DMGI9|0^K6g|S9dfxvnwmtl~crKyK;8&1l_j=S!Cp>h(w}( zW~vF!{+0LcY<{Js(wp&iELOMTy*S(7T+3o`CgS%uW%fjG=7r33ALhK+-q)L7BwL$0 zG4h=v?(fD!3E!qEScu)*Mrw0=lna^CG8)41R*U`We2CE?N#)ykAPXjDsTR!t=fv|8 z1BvvWl!ZP%uyVnPYT)F-)aA;@HJ-AbkX+TdFDZ`qKz$NN8`gao^dRyWA0hu1ECibX z>WKetL*2r+;47drkc|UKv9S)=23S#6!udz*8;_#3hYzCl-u;JPKIlE_+7x5u0jLRN zT%q?a4}F=50#aly2J0hyQCuV+fT5=1upBGk0rxG1TsRji#!Io{xdorFvW_Hqy!`v? z<Qh0IUvni+Bg#^ghzozJX5s5K7#dl};QvU|CkYe?@RW}jSIG`p$&Wb46+dDV$5@AU zX_d|qlqKjK(7B|uOSjemLcG^?!-b(V(fNqN`BU97qpJ>5IvSfKO-v$n<?bn<UpR-B zXPMA#5GoWfaY|uAtC@54QMJ#0a^dvVVqHXIB?XZe(f=HrX!OMF!18&UhFSu-PyB@i z?jrvP{{j{UuqfFPpIEd4d?q&J#3^lI0cQY@(mCLhM%e(YTw$-Etyg-&fnDD?hi++s zrYT&|HCEVFRyL!C@FqdoJoHLmSY_}XcmkVN*#bQM-m|tg$!MI8^=h`arH~F)n@S|g z#-lB%D*wb_2z&7S^>H|(<57_&*)USEk;%&n80o7y*sL5SW1%qDRTGgWSIQ=Npz;y4 zk-n)cVJcgVvu^toakT(O3R*a;W^1sq;G--a$*Oe*efSu9lz@(>UPI$Xov6w;;II$z zRE>OWit)w5P;Y?sV;FiFCPo$E*gp4phx<;zJGR3YEV7zr2#aFM+YdpQ=EZ`%0ADFD zz}?b@ytt(cd2x>O0$HNGKz;ye_f<%%OW=}D(RBzubr}`-j|zhXP_fAoAqg3E4aMs? z-N5N4PKd$<Mv^WAJvDzk>-3}+?M+XJT@O!598|D4Jz-suH3x@WSW8UU_4_h(ij&pE z5x~y~2C&ZoYZtFa0hgkHt5CoNxa|{T8-R{?1l%+J0o%27W}4q}>U%T2V`?$>Qa}j9 zJ3qYp=a2jAcZYv(zxe*wfBv`|25TGru~ITK8Y);NBGN^&D<j~p)ZsN~gHjcF3fZ6T zY%8g^^HhY(uiB;WuDoLBNuC<Gp2E4)KZvw}8>4EPsY~zJsvDe18<JeD;B*D2t1wl8 zNCpE5arb5A?8<#z*;<;av!>ztG)bPVE0wFRM~$IQHkH9G^gxM4)`qk4X(9V~xIrRQ zp)aJnTEr_f0{&C`sSBcn4>h_Vs@pg01~ejvTl5Po)rFnzQrIZ=@#FCN$#uL6&1?1R zu~g7BS5NK|x^=>9Q=5LSBwe9r8mxm#!XvynHKYrJ+|<76*r*|dSEg3v4*E}oWgP)R zbq!#1481|})Ie)JQwn&C)%_a#DV1yu7M|%0Hgt{C4eoygfs9jm_f4?Sm>+1#d;vzA R`*z2LU#sJFI-TWC=Rfh3cp3lz diff --git a/test/model/__pycache__/test_runner.cpython-37.pyc b/test/model/__pycache__/test_runner.cpython-37.pyc deleted file mode 100644 index 411aa28bed319585f683f44c07d67739f72a897c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 632 zcmYjOv5wR*5Ve!+Zg!8QxPpoz1<e+lD`*fxz;Qw}rxOy;M3ExL_GZIo?a1TYk%%im ze8`=s_@%T|`~nqY?;+htGxm(%JkPV=ESC#{rha~7uL44TyX3!NPF|zKV+?`_+K}w9 z(u|5ggg;0Y2>OAnqCbcr7u-c>t}{kILx=YmEV-e=_lT&9Zs|1<ldt3^5Yt<_o52$s zey8^_VkRaPo?TPK(L3A}&K*v~c;kF{w@A=FO0daBo1~Ey<9))ENR+&C)w0&@wuhRt zCfREtn*{28*Dzaam0+;}&oEBg-fp!Tg7tn#uq+jbU22gc^=&ENO1>*vW<Z)@xo4{0 zxWmt&RThEm%3;#k&HCAJv|h6>S{1f$<;5x*7toch(Od$I4-PE4vu$U`sgN8;8Xukl zlDdiB8l%lB$c~t)pg5?>VxOR%U&PGt8UI#i&+|{%0Xf?;k(TU=sXjkdjB6#>(_E@c z$aRYnI7Y8OKd;LiYAe?*<2zPK?7b6t;zXW!k$zj4PAO^9wjby2sBqUu?hoB(lF2bW n4j)l7$NehI+`A#jgqZr8AMsvrO=J85`MXBGq?mcKn8v|BVA!)= diff --git a/test/model/aa_model/__pycache__/test_biophysical_all_active.cpython-37.pyc b/test/model/aa_model/__pycache__/test_biophysical_all_active.cpython-37.pyc deleted file mode 100644 index 898e30ae716379f4a3786dee7a13b2153e2b01c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1720 zcmY)uO^+Kj)SgTxlh57FZcDd?l0q+g*entkgb>~Bf}m2r_~-#E(#RP*iL;)M+MZNd zO(dXjE<Yg=2h@MS??B=*CnQc4C$5MC&y#FRZTZ>n`Mu}&<#)T?ZXg)(&)?B!ZG`@` z$i=9@;TV=S02pFeBC_5w!6ohx2X;qRBA2+>-c@8Z@`xAJNUg+O=|^=^FV9ukh?=BX zo;}%$+N52cvFwlzN7Jq8HmfoJ2lNz^9frR`2lW^5GP-|&3-2_EM`C>76xByYNL_SJ zq&x|YnDG(^md<UFq?5T8A(bbo07~l<YV55rf@{mc?R_xf)MSe5&?>hB97i6kQ&_rz z5i)3r8D`GdSz(Nf^As&Btg^xjWZWFgTi_f|s|zPbQ*TkpE6W;l;nvOZ($C#xomH8) za+VENTVbmK=*<;^-C4GBXWC}|K4SH!aJQ(kMqUj%tO;<dgxd^wf*p|QuF%2*nca=- zUb&;`CDsOctE01z7B#lD@Xh7r8@b1}_t6UHwJT^*-%xf+iob^z4c1*W&6VYT-puQH zV^smqu9|DhH%rU`uUdJF?VdS5VeOf>zQ=42QgG?~PNN6oYpzXil&Id2hG$QxV!bel zQfkD|#&_OJMm;m(J;}#3ocE}dhqTO2FG?7fy3|4Hv5LhEDDu1xa3mzxN9XN`#$p8e z`%|67q;c=Tmk&RGaQDGy-xO7<Lm>)JjN?S{^J->BhaV`&5E{dR@yD(4+duyG#jn?Y zzqO_uKRaF@(qE2AZ6u5l@wn(tvlz@t;vh{7kBy*m{O|L>f4et)c&os(0-N)0l9@C! z!7P!6j(ML^^P&qc+&{QpG;}shRT6Toi$*x%;aLDhCY1yCg)0-vlxvT8Qur6n6#kf- z03tLYyJH@6MGX(4M5U8NCgXYG@i>Ig6dvPtCwo>+5OOI&NYRKJt~BxPoJty{#MMbe ziwYczD#Vk{Nrh#KRE;)CO4<r^C>G49%(y1ak%*z@sTAkDsHiM1T=0e#)i{gNIRsTH zI#;&hNlViizwo)JNFJ-2rC(<7ehBtw267B6Iu&Q!emkwXvXT5$sYD&Lizb7gq(o|I z1tbVQr`iD($_9^Yz4CY+3s)Nvk;;sR%66W@iNM}X=&g~YwLyT*y0XE_I5xokjUmsG zx&h+<e0%!g;1O7)2XsPNe@LIucs@9ZX_&-}zCYmcOb?Qj$2tU9_J_e;F&t=N_+bjA z45<cL365)ac4VLmkIITYq7<?Pp)P5`@KtXKfIC<hcORm;Yh_-)r+qL@zXt$$9jAqT z>^UB8;49d7_ONHC<2k<L1K!0hEDJl%HdgO~%t4oU>D;O<oJ6auKq5CTOzf9N^*8ne zT10(t6<T9ijKu!D(v{cwY)|a3b7Q-DS*_&eOJ16a{^N`*Xp<M3twaEHRkhDwd&vrQ zR{o8^YAYM-x{x|AIm#wmR*~v}Y~e;!osliYA7=u(ZV>ZKC2{F#nZy5qcPzjE5xAI1 V{_#z~w5=kD6U-LghGnPk{0E%!0!{z` diff --git a/test/model/peri_model/__pycache__/test_biophysical_peri.cpython-37.pyc b/test/model/peri_model/__pycache__/test_biophysical_peri.cpython-37.pyc deleted file mode 100644 index 875d19a7fedd8d322f58aafa7a4309b3cefac15c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1712 zcmZt`OOG2h*q%%#ljrWH+tO_TrO?YBnnmJ*5Td(X5Fqs>pa)E(ku!D@XFZSFo>W;) z4p8p!6B2Pi{W}~u_=Lo%N3MtipJ%fz5_sg#{+{!_{N3wzTL@PA^LO;yE<%4e<Z{*E zatvD=01PoK5xF=q!4>Wi4^B_k5})|k@oKW31SCirq*39%43j2lR`<GWC2i8K?t$zi zUDB=YSoTPdqxsH!mo-@U1A30h9>ZUu!{$r)GkSQ4ZE%{U6EQvXZ2gH5Qrq5%lqazf z3tr(M(z_?Je74jgrt%~gK<Ru!jpGU<xONiU@uLZ+rchkR&bV6;I0|5&!qzQ}kU?wA zF!QF~24iHr=V)DHwGCb&<Coyx3YU0ZUwI{(2di3HTQ`^wT))KYu=LkWR%gM+Tenza zgPjGSw>Jn*Z`~=qd6$I;h&7)BZ&hclvL5wV8{kd_cNxe;d!W<bpj7}mSGKzQ)rsa; zSr_!3jotxTHQ3H7G}qQ|lmXj4KpR{(uA^0ROWCU^;XYcmSbx<v*VhMSyKI)NO${Qu zVQ#M9tS}Fv>XaRJ<;?pD>%hGAJ!bn*f~)7JtpTjBxi*7IrUqjgpFN|B4dN`xsS#tB z-{l~i49tuVa;}8V5}?O}Bx79aN}DuOm5K#W<ara|L`bfW&btXs#RM!5=Q>MC>%pTh zAAkPn{-e*nv306rA#5O~X{Pvjy)ctIA1J5|n!<+l``ziJTEE@Bpd9~rd~wNtIVO#X zFh-<P+n*OHv`Lmmd1iQO1eMdjU;O#&gYo0L7B4I|=l!fOd10bOCJmkPA*1HyP58sZ z!?$fq7vo%IG1uC*;u(+6B4{tEJm6bjW|S%SOe~(+@G=-1PPvI7H#2f&%2TeW;Zc&Q ze3r><y0igLV@Qn+7<VVxcV?oPO9@JfCfsnPN$|y~q)ASEmrh%QtF1#m>5|k~p-A0m zljWqVz=mScg35wx(w>MEx}8dK&TUN<sr4ZmYU^o{<V#4ZQgo?Yual0Z3w{~1tx2A$ zhNE9&@c$V6FAP)>M076BxO;F~bLBGmsZyCb?AkViH>5=FXch_t&r<Dy3DtLYc3ww( zkqciNk&xPg$I8td>m}gtHucU)(%B*)=0e$GRUTX5|JIQgNZkVUzsl1OM^C^bJ)$$p zhGY7SrpwVuO5-eL^!*V}7kZTCJk>G4YBG%Oi}6Sc!|&wK#87I`l@PdQXGaFQ@Tlt8 zBiF-FFGzMpjmEF%O5}J$$mCTg|6dL`rr!gAf}YpGAr8C%xA1iwdiywVpBH$c7XseL zK5Pej-Y!<}g3e)|1o_e#wqB;y4Iq(QmktgqhlX2UA}x|31PUXuYDF^me>pb`hZmJ` zZK`}{^Y$xQnv3Dn0z%^Y(z4TtfUfFJ^yVv3=(6f%M9x|@P%ql3_e!D~u2m1I9_U&> zq3Vq6DE_n%Fm0oh7b;7uNUI9|3%ujx!;c`uLh_Gq1EyUML7w32;9c163%!2;l&Jq( diff --git a/test/mouse_connectivity/__pycache__/__init__.cpython-37.pyc b/test/mouse_connectivity/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f67dae59181a3987632c9d6bc44c1ad2b90019ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmZ?b<>g`kg1p6zi6Hthh=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{VFY!wq)oLW>I zlbDg1qL-9do|sn|<CvG2oS&DHXdIK8S5_R8UyzztoD3xM3o<H;V|+4`Vu~|MQgsUw zld}`kQ-OMOa)2sQvh_<+i%ax#^Gl0U<ADa`r6!kTmSvVy>c_`t=4F<|$LkeT-r}&y R%}*)KNwotx<ued7007QqIoJRI diff --git a/test/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 572b0f95127d1634c3e5ea52bf174fd7d5a98468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmYL@zY4-Y492hEAVMF+!FF&H5&x{>B5nsq+6(Q`_O3M7%8fpYldt6JBe*%44&n#j zFCpX$*~jrru<ZQ?V||VIDdJ|!rU^rfvzSMxhv>%fAD`i{k{7~`B$S|&46a~<+*!z- z)v%Ok2a>KuOF7fEWgvMpnIz+J(L!E9ft;;t-q2O*k$l>?o>1`ti@7(0@gXfbqf@1f VHD0Nt4bSPiak{T@Gyd~ti!TAsJF)-( diff --git a/test/mouse_connectivity/grid/__pycache__/test_base_subimage.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_base_subimage.cpython-37.pyc deleted file mode 100644 index 65938ae740d5d4710b9221c68452ac78669506d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6027 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 diff --git a/test/mouse_connectivity/grid/__pycache__/test_cav_subimage.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_cav_subimage.cpython-37.pyc deleted file mode 100644 index 3e513e172f0f82f5d9373ef705d209b811d6e106..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmZuxzi%T&6rLIHuGfz3M7kh!S3tcIIFaa3bmT4^5)w)i(TprvlYQg8N%j{ryCz0H z-ND_JApU?9iKzHLD50T1Xj>|`6cjY@X6$tk@T~dv&3kX(ynXK*KOPSI1SS9OOYyT$ z$ZvMjN(Yr=T;@XrAV5>X*H6l++cVz5CriD|=RPHpTm;Yo?`sM^1h2?T%Dd2o@D<@9 z&@&SCR+x#LMzq;E5%aV9{Nqd{vI%E(9#^W!Bg%af7p07CTq`|PPH>rz5P(+Xh6005 z!fw~P2i{iq!M8dD_FU*CUP7S{JGdVt9t^J;jIMpGWcPICVK#MGBOG57lFXd^@<H;` zk5&$kBc_huwq69(Up)MmZVheBM!(s`7z?d^qdWULPcz7rF)B}{l}csPkHvgiX%R~u z`Fx-y)UlkVaxPQeRrwTDW_TYJQ;Hbh;-k0_+Q{vGP!{PTDe|exXGO#smY0n$v=)o+ ziME|{@aOZB_a~nksm(+@6)-**pNo7kd6bK|$U(d}k@?(Au<^NTe^EYNn8_#Vd}353 z-^HUZaZdPdnqmZ89#qm)2U$^LA($YSIK8>576*w|;G9$YU8X))cEICuvHs9fXpxzr zo#h?^VT=yk&!ZvrsNO+aOsxkcz=f1tkNyu-+~9HacEHalbe5Kc-fM<PUb7iHvJnj0 z2nPOg<6FnMh|Y{G$v5;_XUUeG3lD-LvZPMyqSm?bZwX!JvGlPgdC*^am|@4Agt$Ga zjqowT-$ra|fx*@`+`JK>Wwei{Ty$agKDlM)*DCzVk~qK<T2J6SzgrIwr0U+OI_n~@ ze!yvJ+Z^={;>v2;_DI_%sm~a~W4yAfZ*jW<3x^i|LRq1c@V=?DX{oMcYNDRTl!SXl zE=}WqA$4K23kuxC41Xgova+u1d>!A)RA49%kpgjA7|91Bj_a&WMOA3ij2;<em%YPJ zv@UcMxLGzVs~Q&LGK$~3qxw`{;T^9e@OyVPZH;%d)%MS+d0^Rwb^K2~_t9_OLLh8J z_ucAK{IRgz(>?Zp>NhbW>hYjl*j(JpiujWId7YJubt9sd+T;JSdTd!eZpplEQ+KAW ls#;6;nJ)c5s&?1Tl^z~t1=Oj0Xs2bYDWoA5H|XvU{sz(IZo~ip diff --git a/test/mouse_connectivity/grid/__pycache__/test_classic_subimage.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_classic_subimage.cpython-37.pyc deleted file mode 100644 index acc31f0cd0dc85695e772e7b79bec8d8ffb34a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5349 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 G-S{t1O0FjW diff --git a/test/mouse_connectivity/grid/__pycache__/test_image_series_gridder.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_image_series_gridder.cpython-37.pyc deleted file mode 100644 index 9be59dece446cede63fb0b35acea5417e0df1ace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5402 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 SPqDMrC#vp(d&I4~$NvL6jU>AO diff --git a/test/mouse_connectivity/grid/__pycache__/test_image_utilities.cpython-37.pyc b/test/mouse_connectivity/grid/__pycache__/test_image_utilities.cpython-37.pyc deleted file mode 100644 index d1d2c198c3b06a36d4af588688d01ebc87050c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5439 zcmbtYOOM;u6(%nqqNI6S9?#g0<G5~G1@73jQ>PEtj_t-tkYZ|dlAs`_RXMtp%o#~k zE-5=>NCj%UOQR^zMUh1@gQAQ6hyH*rv*xNmH`PBVvg&uvr8pXSvS}sozAt(Co$q}2 zT;7|XuNe6C{_@-4@5_eqFRDy_4hrw$O1?xQ4QX}^U+1Q8a$Wcq=eF-47ag}-@;%cC zjoq@er2W#Aj&xrb&rQEF)mD-ow^e0XR$dtXoUF<@<nwY~E+AjP*u{e-xfnXT%b~Tq z(h_a+P{<{@%=1pk6?qEdYO*FzBR?%y<r(Cwa!sxyKO@h|bI8}^dHEXhb$LO)j{K~= zDBnPSPMTXr{n8k3Wo*{XY%%Hv?XWROqfV4YVUl^RL9dxcaj$OrPST9~VUxzv&&1{8 zx{oW_K$02<rsRKW?21EsWDJc1OA7k8twYm9U0UxL)Q+dxn_~ieO!pZJBy~HplPKNG zoDXRg{xVfQ4V!7K9(3X$z4>-l*$UIGe$b41Z7j%^QPTgLq3AYWJ-h$I?N5?WCELNH zKyK^=PlDe5_T664jC(S;u^sjvC)-$mkKZEhKiW^We;Vy<<00X9aLYYB5_3BpjF5X* z(=bV|cH==3HgJO;RuMgp(*3J#6-n-F%s{o#-_Kmx>b5$vjP)cQ62n?CmxL$O9Lfc7 z)Ikjl+<6oL8iO>ITOf_qo@1C4p{xidMLgu!olUCf$SOgr)#wK*=q5GP69Ux`Y949v z@MBinM$fBOORWPNmJ-BU*iD#5>KwSRW$AFLHMyO7&&<51j2;IwTpFMJf_fy`xU@Ou zC38ZrF}9GjapCvRJ9*(hcj^^YLW?5MvMSk~Eq>#ACZYj|5T-fYi8g*Fdi~6Uv6`JY z3A4)k1ue3Ly9ro8lzmUBSY>7O{Y*ve2o%QMx>Lw8XscxD#w$-)$4ayf#R~psO|^!W zlVR+kCx;QBwE-JBd)rFIu61aQjMP4G0G|tx$kG@AkZz_Wz^8jW^yG8U^Khz%fGwfV z<2k$3!@!m|qbo4w_#b%mSR&EXV5TghdLqP7H6ttc!Y3L`4fzsHUZLa^b(aXr=xL}< zQxnlhts<$L>I{|1)pWw(Ei-t<9UC{~H!vW_?L1HeZm*%`7;Z#{`!tN!J;AN5=_XFb ztSx}cwJBT(F`_56e=yaqiD+^AuM4zXjg} syNg1oja$>KrA^!{eYRa?<||kn8da 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 W#VdQ|i*w$Jw}}6|x9nBD>VE<H6~*cR diff --git a/test_utilities/__pycache__/__init__.cpython-37.pyc b/test_utilities/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8b36722a9e59e253f9402e4427d46779a26e582b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmZ?b<>g`kg1p6zi8<^H439w^7+?f49Dul(1xTbY1T$zd`mJOr0tq9CUm4C;F`>n& zMa40R8Hp)+Nr~l&d6hAad5OvSc`1p;F{ycF#WDE>sd>f8Kr+7|qp~>0Co?IgII|>G zw;(Y&J25>Ks5d7Es3Ij>za+J|B)+sHGbghoGqqShK0Y%qvm`!Vub}c4hfQvNN@-52 L9moZrftUdR2g^36 diff --git a/test_utilities/__pycache__/custom_comparators.cpython-37.pyc b/test_utilities/__pycache__/custom_comparators.cpython-37.pyc deleted file mode 100644 index 2f3fd665dd64c21aa8b1dcbef944a699093086d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3755 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 diff --git a/test_utilities/__pycache__/regression_fixture.cpython-37.pyc b/test_utilities/__pycache__/regression_fixture.cpython-37.pyc deleted file mode 100644 index 69a43689692eb4c90784455667575f3c361ac468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmZuw&2AGh5VrRxyNOZ+0)&b<aN&>xDH1nSRiw0_N>va|k;*E_a@Njvn~lBLPGPI` zfLaMSA>N>f6R+eeCtjf^#+y{?fmzMi9^2#jzM0)zS!p2<@#{0?9zuWI;!1p&JO|YW zU>IV!K*?gn39i>(;?<*{_%M1!Fb$IsBj$5-)R;8XrW={RijqjQc*tWGoOwyaLe@A( zNt59L>O_AbI_h_@y`{L8GnH~O&I>N+lqZk&w+H)Vuss;;yzY};zqk8turnZg+pqSP zzOCMV?_{UjT{B#pwUMH^AabO+I;KXds&*62wa%p=RM4W*xh9Hd@L26*)KF67+H{Y! z6sb$b2?lL~Iui6tFa{lAhF8%yWV{QXc_z4reqxMFXaeS+dEf7!qAzHSS-`^c*fcJp zIqYwtGXVJp?V$sp4&XNW%7s3O3rSfnvWFI{)Onmh1yBHb8&p34lc70!f9Dj>f$vrH z6-_)9%<&KJLja+$jgGl;Abz8cXT9!|q@B)`0{T9gnc{GuSysy<Dui&C>cz9+TOdad z=^<s^5&cL-HS7tRO2O#UAs5GbC`&GM3Raefl^*WqqoK|Xe_YaZLNg9`3n-6flLfgm zlNY(kxn8@*>N16HSzWf)9lNQVmK!%6E(fxKPC6MkHSa`@NlDEiVR>r0>xE2dp*LW1 zb*mFwUsu|;mrzJ9#?nTG%rYR*hK!G9nQhjEbe&@ZhrkA|o;Gki0~2^$Gtj{*g7;Mn z#@_vJ3T>C9+ef&CZ{Rjot{k0~^`utrZ&B`qa#-w2Imw`z7HzAQgJvTjF;`Nk8*UX7 k;yRg-I!c|xHB+Y%uTLeL6@0_Bfp&3Yy!hH)3xj(904R+A6aWAK diff --git a/test_utilities/__pycache__/temp_dir.cpython-37.pyc b/test_utilities/__pycache__/temp_dir.cpython-37.pyc deleted file mode 100644 index 5ada1c73a596da37ae9a7e7e2a504fd780aca617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1029 zcmY*YTWb?R6rRiOW}Bv05k>nDiwFU23xW?)iq%&Mf=FQrglT5dY_dDMotgBKZXU#f z^<Ql8$#;Lvy!zC?&=)<ku|;P&XU=^4ojK=x$-Z4$sv}tP`)BqWqF?TCy9fkt!1Qx) z9C4hWXujhJS7#EDYNwIM38$AR@;Uy9THZBepmq<t4ORfQ07k*|PjCheaY-sqId-`- zI>S?3Azp!JSiP!Ze;yZjN@Sx#0#gGf<d$JUAfjhG+$*VBFm<yyY?Mpf=K-(H=ok0a z<6*g6cr#qkQBAc!pyT$zygDriUnsl>XhyyPQm$N~8OG=<>SJE#i<jZlFHpH!_zt~7 zFjb>{gSRc^;v}MakXoeNeAiCEYd7I!l_iOgnvc3hXw$uzM$7*rJz(7}52AZu`WZNA z0M8pRWJpWT#cI>|Wxz2EOfU!!Es*x)k-NLeW7WLanKreFlcXumVr}%3R%in~7z1Pj zl^P|4C7HHf&dk6DbCL~DnUb+Q0^CJ*@sk$nV2=GjEo_%`E_!i4?sZ+BT7m9v2Jc>X z98Y)Hfbp$EcFN>=XJ4{jCOLcA5%NTLvK)r*fzR^6x$eA=4?8+G;ziDSBX%Sp_pdzL zl{~J`*u+A^G0nR$(N=zLX+M_xP8Fvp!gbuhllyms-6ZR=MDJ|@tF@-we@Z$1Z74I9 zR&#p8ES74~fwfqt*;pD|gUcmLg$=view>JI*VYn{3}8!BmRqWgvP9;f8<RXsZO!d5 zqy~Msm>C<UY$SlMqXy#~%CjV%2-OOJDvrnSn?$}z^S-tVhfIq~yNLD^4WEQ7t=3(y zPRtfot1e!1Erz$Fxo=EwfJ5XVJb~9BbxiOEUd91g$92;1>qKqB`&KZYy9TjpfQx)N iPV;m1*a41FmHEfbEA6HkA17k(DKK;hF2wMV(E9@xh!=_g From 02c93af1045d6d0bf904db766ceb19691618c370 Mon Sep 17 00:00:00 2001 From: Ahad-Allen <87045911+Ahad-Allen@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:11:41 -0800 Subject: [PATCH 04/11] Update ophys_experiment.py Updating doc strings --- allensdk/brain_observatory/behavior/ophys_experiment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allensdk/brain_observatory/behavior/ophys_experiment.py b/allensdk/brain_observatory/behavior/ophys_experiment.py index d149d6754b..81b131dc14 100644 --- a/allensdk/brain_observatory/behavior/ophys_experiment.py +++ b/allensdk/brain_observatory/behavior/ophys_experiment.py @@ -57,7 +57,7 @@ class OphysExperiment(OphysSession): - """Represents data from a single Visual Behavior Ophys imaging session. + """Represents data from a single Ophys imaging session. Initialize by using class methods `from_lims` or `from_nwb_path`. """ From 1329886555cbe10eb3b882e3f475c1adc5e7f284 Mon Sep 17 00:00:00 2001 From: Ahad-Allen <87045911+Ahad-Allen@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:12:16 -0800 Subject: [PATCH 05/11] Update documentation --- .../behavior/ophys_session.py | 313 +----------------- 1 file changed, 4 insertions(+), 309 deletions(-) diff --git a/allensdk/brain_observatory/behavior/ophys_session.py b/allensdk/brain_observatory/behavior/ophys_session.py index 7df2f4e89f..9703b25416 100644 --- a/allensdk/brain_observatory/behavior/ophys_session.py +++ b/allensdk/brain_observatory/behavior/ophys_session.py @@ -295,9 +295,6 @@ def list_data_attributes_and_methods(self) -> List[str]: """Convenience method for end-users to list attributes and methods that can be called to access data for a BehaviorSession. - NOTE: Because BehaviorOphysExperiment inherits from BehaviorSession, - this method will also be available there. - Returns ------- List[str] @@ -337,186 +334,13 @@ def get_reward_rate(self) -> np.ndarray: self.trials, self.task_parameters['response_window_sec'][0]) - def get_rolling_performance_df(self) -> pd.DataFrame: - """Return a DataFrame containing trial by trial behavior response - performance metrics. - - Returns - ------- - pd.DataFrame - A pandas DataFrame containing: - trials_id [index]: (int) - Index of the trial. All trials, including aborted trials, - are assigned an index starting at 0 for the first trial. - reward_rate: (float) - Rewards earned in the previous 25 trials, normalized by - the elapsed time of the same 25 trials. Units are - rewards/minute. - hit_rate_raw: (float) - Fraction of go trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - hit_rate: (float) - Fraction of go trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. With trial count correction applied. - false_alarm_rate_raw: (float) - Fraction of catch trials where the mouse licked in the - response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - false_alarm_rate: (float) - Fraction of catch trials where the mouse licked in - the response window, calculated over the previous 100 - non-aborted trials. Without trial count correction applied. - rolling_dprime: (float) - d prime calculated using the rolling hit_rate and - rolling false_alarm _rate. - - """ - return construct_rolling_performance_df( - self.trials, - self.task_parameters['response_window_sec'][0], - self.task_parameters["session_type"]) - - def get_performance_metrics( - self, - engaged_trial_reward_rate_threshold: float = 2.0 - ) -> dict: - """Get a dictionary containing a subject's behavior response - summary data. - - Parameters - ---------- - engaged_trial_reward_rate_threshold : float, optional - The number of rewards per minute that needs to be attained - before a subject is considered 'engaged', by default 2.0 - - Returns - ------- - dict - Returns a dict of performance metrics with the following fields: - trial_count: (int) - The length of the trial dataframe - (including all 'go', 'catch', and 'aborted' trials) - go_trial_count: (int) - Number of 'go' trials in a behavior session - catch_trial_count: (int) - Number of 'catch' trial types during a behavior session - hit_trial_count: (int) - Number of trials with a hit behavior response - type in a behavior session - miss_trial_count: (int) - Number of trials with a miss behavior response - type in a behavior session - false_alarm_trial_count: (int) - Number of trials where the mouse had a false alarm - behavior response - correct_reject_trial_count: (int) - Number of trials with a correct reject behavior - response during a behavior session - auto_reward_count: - Number of trials where the mouse received an auto - reward of water. - earned_reward_count: - Number of trials where the mouse was eligible to receive a - water reward ('go' trials) and did receive an earned - water reward - total_reward_count: - Number of trials where the mouse received a - water reward (earned or auto rewarded) - total_reward_volume: (float) - Volume of all water rewards received during a - behavior session (earned and auto rewarded) - maximum_reward_rate: (float) - The peak of the rolling reward rate (rewards/minute) - engaged_trial_count: (int) - Number of trials where the mouse is engaged - (reward rate > 2 rewards/minute) - mean_hit_rate: (float) - The mean of the rolling hit_rate - mean_hit_rate_uncorrected: - The mean of the rolling hit_rate_raw - mean_hit_rate_engaged: (float) - The mean of the rolling hit_rate, excluding epochs - when the rolling reward rate was below 2 rewards/minute - mean_false_alarm_rate: (float) - The mean of the rolling false_alarm_rate, excluding - epochs when the rolling reward rate was below 2 - rewards/minute - mean_false_alarm_rate_uncorrected: (float) - The mean of the rolling false_alarm_rate_raw - mean_false_alarm_rate_engaged: (float) - The mean of the rolling false_alarm_rate, - excluding epochs when the rolling reward rate - was below 2 rewards/minute - mean_dprime: (float) - The mean of the rolling d_prime - mean_dprime_engaged: (float) - The mean of the rolling d_prime, excluding - epochs when the rolling reward rate was - below 2 rewards/minute - max_dprime: (float) - The peak of the rolling d_prime - max_dprime_engaged: (float) - The peak of the rolling d_prime, excluding epochs - when the rolling reward rate was below 2 rewards/minute - """ - performance_metrics = {} - performance_metrics['trial_count'] = len(self.trials) - performance_metrics['go_trial_count'] = self.trials.go.sum() - performance_metrics['catch_trial_count'] = self.trials.catch.sum() - performance_metrics['hit_trial_count'] = self.trials.hit.sum() - performance_metrics['miss_trial_count'] = self.trials.miss.sum() - performance_metrics['false_alarm_trial_count'] = \ - self.trials.false_alarm.sum() - performance_metrics['correct_reject_trial_count'] = \ - self.trials.correct_reject.sum() - performance_metrics['auto_reward_count'] = \ - self.trials.auto_rewarded.sum() - # Although 'earned_reward_count' will currently have the same value as - # 'hit_trial_count', in the future there may be variants of the - # task where rewards are withheld. In that case the - # 'earned_reward_count' will be smaller than (and different from) - # the 'hit_trial_count'. - performance_metrics['earned_reward_count'] = self.trials.hit.sum() - performance_metrics['total_reward_count'] = len(self.rewards) - performance_metrics['total_reward_volume'] = self.rewards.volume.sum() - - rpdf = self.get_rolling_performance_df() - engaged_trial_mask = ( - rpdf['reward_rate'] > - engaged_trial_reward_rate_threshold) - performance_metrics['maximum_reward_rate'] = \ - np.nanmax(rpdf['reward_rate'].values) - performance_metrics['engaged_trial_count'] = (engaged_trial_mask).sum() - performance_metrics['mean_hit_rate'] = \ - rpdf['hit_rate'].mean() - performance_metrics['mean_hit_rate_uncorrected'] = \ - rpdf['hit_rate_raw'].mean() - performance_metrics['mean_hit_rate_engaged'] = \ - rpdf['hit_rate'][engaged_trial_mask].mean() - performance_metrics['mean_false_alarm_rate'] = \ - rpdf['false_alarm_rate'].mean() - performance_metrics['mean_false_alarm_rate_uncorrected'] = \ - rpdf['false_alarm_rate_raw'].mean() - performance_metrics['mean_false_alarm_rate_engaged'] = \ - rpdf['false_alarm_rate'][engaged_trial_mask].mean() - performance_metrics['mean_dprime'] = \ - rpdf['rolling_dprime'].mean() - performance_metrics['mean_dprime_engaged'] = \ - rpdf['rolling_dprime'][engaged_trial_mask].mean() - performance_metrics['max_dprime'] = \ - rpdf['rolling_dprime'].max() - performance_metrics['max_dprime_engaged'] = \ - rpdf['rolling_dprime'][engaged_trial_mask].max() - - return performance_metrics + # ====================== properties ======================== @property def ophys(self) -> int: - """Unique identifier for a behavioral session. + """Unique identifier for a ophys session. :rtype: int """ return self._ophys_session_id.value @@ -580,10 +404,6 @@ def running_speed(self) -> pd.DataFrame: applies a 10Hz low pass filter to the data. To get the running speed without the filter, use `raw_running_speed`. - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. Returns ------- @@ -601,10 +421,6 @@ def running_speed(self) -> pd.DataFrame: def raw_running_speed(self) -> pd.DataFrame: """Get unfiltered running speed data. Sampled at 60Hz. - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. Returns ------- @@ -685,12 +501,7 @@ def stimulus_templates(self) -> pd.DataFrame: def stimulus_timestamps(self) -> np.ndarray: """Timestamps associated with the stimulus presetntation on the monitor retrieveddata file saved at the end of the - behavior session. Sampled at 60Hz. - - NOTE: For BehaviorSessions, returned timestamps are not - aligned to external 'synchronization' reference timestamps. - Synchronized timestamps are only available for - BehaviorOphysExperiments. + ophys session. Sampled at 60Hz. Returns ------- @@ -699,123 +510,7 @@ def stimulus_timestamps(self) -> np.ndarray: """ return self._stimulus_timestamps.value - @property - def task_parameters(self) -> dict: - """Get task parameters from data file saved at the end of - the behavior session file. - - Returns - ------- - dict - A dictionary containing parameters used to define the task runtime - behavior. - auto_reward_volume: (float) - Volume of auto rewards in ml. - blank_duration_sec : (list of floats) - Duration in seconds of inter stimulus interval. - Inter-stimulus interval chosen as a uniform random value. - between the range defined by the two values. - Values are ignored if `stimulus_duration_sec` is null. - response_window_sec: (list of floats) - Range of period following an image change, in seconds, - where mouse response influences trial outcome. - First value represents response window start. - Second value represents response window end. - Values represent time before display lag is - accounted for and applied. - n_stimulus_frames: (int) - Total number of visual stimulus frames presented during - a behavior session. - task: (string) - Type of visual stimulus task. - session_type: (string) - Visual stimulus type run during behavior session. - omitted_flash_fraction: (float) - Probability that a stimulus image presentations is omitted. - Change stimuli, and the stimulus immediately preceding the - change, are never omitted. - stimulus_distribution: (string) - Distribution for drawing change times. - Either 'exponential' or 'geometric'. - stimulus_duration_sec: (float) - Duration in seconds of each stimulus image presentation - reward_volume: (float) - Volume of earned water reward in ml. - stimulus: (string) - Stimulus type ('gratings' or 'images'). - - """ - return self._task_parameters.to_dict()['task_parameters'] - - @property - def trials(self) -> pd.DataFrame: - """Get trials from data file saved at the end of the - behavior session. - - Returns - ------- - pd.DataFrame - A dataframe containing trial and behavioral response data, - by cell specimen id - - dataframe columns: - trials_id: (int) - trial identifier - lick_times: (array of float) - array of lick times in seconds during that trial. - Empty array if no licks occured during the trial. - reward_time: (NaN or float) - Time the reward is delivered following a correct - response or on auto rewarded trials. - reward_volume: (float) - volume of reward in ml. 0.005 for auto reward - 0.007 for earned reward - hit: (bool) - Behavior response type. On catch trial mouse licks - within reward window. - false_alarm: (bool) - Behavior response type. On catch trial mouse licks - within reward window. - miss: (bool) - Behavior response type. On a go trial, mouse either - does not lick at all, or licks after reward window - stimulus_change: (bool) - True if an image change occurs during the trial - (if the trial was both a 'go' trial and the trial - was not aborted) - aborted: (bool) - Behavior response type. True if the mouse licks - before the scheduled change time. - go: (bool) - Trial type. True if there was a change in stimulus - image identity on this trial - catch: (bool) - Trial type. True if there was not a change in stimulus - identity on this trial - auto_rewarded: (bool) - True if free reward was delivered for that trial. - Occurs during the first 5 trials of a session and - throughout as needed. - correct_reject: (bool) - Behavior response type. On a catch trial, mouse - either does not lick at all or licks after reward - window - start_time: (float) - start time of the trial in seconds - stop_time: (float) - end time of the trial in seconds - trial_length: (float) - duration of trial in seconds (stop_time -start_time) - response_time: (float) - time of first lick in trial in seconds and NaN if - trial aborted - initial_image_name: (string) - name of image presented at start of trial - change_image_name: (string) - name of image that is changed to at the change time, - on go trials - """ - return self._trials.value + @property def metadata(self) -> Dict[str, Any]: From 114d7148076238b33ee5da9ea565d127823e7702 Mon Sep 17 00:00:00 2001 From: Ahad-Allen <87045911+Ahad-Allen@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:13:49 -0800 Subject: [PATCH 06/11] Updates for ophys language --- .../behavior/data_objects/running_speed/running_acquisition.py | 1 - 1 file changed, 1 deletion(-) diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py index d3209a786a..b8dc19bc9a 100644 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py +++ b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py @@ -146,7 +146,6 @@ def from_ophys_lims( behavior_session_id: int, ophys_experiment_id: Optional[int] = None, ) -> "RunningAcquisition": - print("TEST", behavior_session_id) stimulus_file = StimulusFile.from_lims(db, behavior_session_id) stimulus_timestamps = StimulusTimestamps.from_ophys_stimulus_file( stimulus_file=stimulus_file From ade3bad3a8cc7da693c074eb793c1e54ba266675 Mon Sep 17 00:00:00 2001 From: Ahad-Allen <87045911+Ahad-Allen@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:21:10 -0800 Subject: [PATCH 07/11] Removing unsupported parameters for generation --- .../behavior/ophys_experiment.py | 178 +----------------- 1 file changed, 1 insertion(+), 177 deletions(-) diff --git a/allensdk/brain_observatory/behavior/ophys_experiment.py b/allensdk/brain_observatory/behavior/ophys_experiment.py index 81b131dc14..4570ae1c9f 100644 --- a/allensdk/brain_observatory/behavior/ophys_experiment.py +++ b/allensdk/brain_observatory/behavior/ophys_experiment.py @@ -219,185 +219,9 @@ def _get_eye_tracking_table(sync_file: SyncFile): date_of_acquisition=date_of_acquisition ) - @classmethod - def from_nwb(cls, nwbfile: NWBFile, - eye_tracking_z_threshold: float = 3.0, - eye_tracking_dilation_frames: int = 2, - events_filter_scale: float = 2.0, - events_filter_n_time_steps: int = 20, - exclude_invalid_rois=True - ) -> "OphysExperiment": - """ - - Parameters - ---------- - nwbfile - eye_tracking_z_threshold : float, optional - The z-threshold when determining which frames likely contain - outliers for eye or pupil areas. Influences which frames - are considered 'likely blinks'. By default 3.0 - eye_tracking_dilation_frames : int, optional - Determines the number of adjacent frames that will be marked - as 'likely_blink' when performing blink detection for - `eye_tracking` data, by default 2 - events_filter_scale : float, optional - Stdev of halfnorm distribution used to convolve ophys events with - a 1d causal half-gaussian filter to smooth it for visualization, - by default 2.0 - events_filter_n_time_steps : int, optional - Number of time steps to use for convolution of ophys events - exclude_invalid_rois - Whether to exclude invalid rois - """ - def _is_multi_plane_session(): - imaging_plane_group_meta = ImagingPlaneGroup.from_nwb( - nwbfile=nwbfile) - return cls._is_multi_plane_session( - imaging_plane_group_meta=imaging_plane_group_meta) - ophys_session = OphysSession.from_nwb(nwbfile=nwbfile) - projections = Projections.from_nwb(nwbfile=nwbfile) - cell_specimens = CellSpecimens.from_nwb( - nwbfile=nwbfile, - segmentation_mask_image_spacing=projections.max_projection.spacing, - events_params=EventsParams( - filter_scale=events_filter_scale, - filter_n_time_steps=events_filter_n_time_steps - ), - exclude_invalid_rois=exclude_invalid_rois - ) - eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_nwb( - nwbfile=nwbfile) - eye_tracking_table = EyeTrackingTable.from_nwb( - nwbfile=nwbfile, z_threshold=eye_tracking_z_threshold, - dilation_frames=eye_tracking_dilation_frames) - motion_correction = MotionCorrection.from_nwb(nwbfile=nwbfile) - is_multiplane_session = _is_multi_plane_session() - metadata = BehaviorOphysMetadata.from_nwb( - nwbfile=nwbfile, is_multiplane=is_multiplane_session) - if is_multiplane_session: - ophys_timestamps = OphysTimestampsMultiplane.from_nwb( - nwbfile=nwbfile) - else: - ophys_timestamps = OphysTimestamps.from_nwb(nwbfile=nwbfile) - date_of_acquisition = DateOfAcquisitionOphys.from_nwb(nwbfile=nwbfile) - - return OphysExperiment( - ophys_session=ophys_session, - cell_specimens=cell_specimens, - eye_tracking_rig_geometry=eye_tracking_rig_geometry, - eye_tracking_table=eye_tracking_table, - motion_correction=motion_correction, - metadata=metadata, - ophys_timestamps=ophys_timestamps, - projections=projections, - date_of_acquisition=date_of_acquisition - ) - - @classmethod - def from_json(cls, - session_data: dict, - eye_tracking_z_threshold: float = 3.0, - eye_tracking_dilation_frames: int = 2, - events_filter_scale: float = 2.0, - events_filter_n_time_steps: int = 20, - exclude_invalid_rois=True, - skip_eye_tracking=False) -> \ - "OphysExperiment": - """ - - Parameters - ---------- - session_data - eye_tracking_z_threshold - See `OphysExperiment.from_nwb` - eye_tracking_dilation_frames - See `OphysExperiment.from_nwb` - events_filter_scale - See `OphysExperiment.from_nwb` - events_filter_n_time_steps - See `OphysExperiment.from_nwb` - exclude_invalid_rois - Whether to exclude invalid rois - skip_eye_tracking - Used to skip returning eye tracking data - - """ - def _is_multi_plane_session(): - imaging_plane_group_meta = ImagingPlaneGroup.from_json( - dict_repr=session_data) - return cls._is_multi_plane_session( - imaging_plane_group_meta=imaging_plane_group_meta) - - def _get_motion_correction(): - rigid_motion_transform_file = RigidMotionTransformFile.from_json( - dict_repr=session_data) - return MotionCorrection.from_data_file( - rigid_motion_transform_file=rigid_motion_transform_file) - - def _get_eye_tracking_table(sync_file: SyncFile): - eye_tracking_file = EyeTrackingFile.from_json( - dict_repr=session_data) - eye_tracking_table = EyeTrackingTable.from_data_file( - data_file=eye_tracking_file, - sync_file=sync_file, - z_threshold=eye_tracking_z_threshold, - dilation_frames=eye_tracking_dilation_frames - ) - return eye_tracking_table - - sync_file = SyncFile.from_json(dict_repr=session_data) - is_multiplane_session = _is_multi_plane_session() - meta = BehaviorOphysMetadata.from_json( - dict_repr=session_data, is_multiplane=is_multiplane_session) - monitor_delay = calculate_monitor_delay( - sync_file=sync_file, equipment=meta.behavior_metadata.equipment) - ophys_session = OphysSession.from_json( - session_data=session_data, - monitor_delay=monitor_delay - ) - - if is_multiplane_session: - ophys_timestamps = OphysTimestampsMultiplane.from_sync_file( - sync_file=sync_file, - group_count=meta.ophys_metadata.imaging_plane_group_count, - plane_group=meta.ophys_metadata.imaging_plane_group - ) - else: - ophys_timestamps = OphysTimestamps.from_sync_file( - sync_file=sync_file) - - projections = Projections.from_json(dict_repr=session_data) - cell_specimens = CellSpecimens.from_json( - dict_repr=session_data, - ophys_timestamps=ophys_timestamps, - segmentation_mask_image_spacing=projections.max_projection.spacing, - events_params=EventsParams( - filter_scale=events_filter_scale, - filter_n_time_steps=events_filter_n_time_steps), - exclude_invalid_rois=exclude_invalid_rois - ) - motion_correction = _get_motion_correction() - if skip_eye_tracking: - eye_tracking_table = None - eye_tracking_rig_geometry = None - else: - eye_tracking_table = _get_eye_tracking_table(sync_file=sync_file) - eye_tracking_rig_geometry = EyeTrackingRigGeometry.from_json( - dict_repr=session_data) - - return OphysExperiment( - ophys_session=ophys_session, - cell_specimens=cell_specimens, - ophys_timestamps=ophys_timestamps, - metadata=meta, - projections=projections, - motion_correction=motion_correction, - eye_tracking_table=eye_tracking_table, - eye_tracking_rig_geometry=eye_tracking_rig_geometry, - date_of_acquisition=ophys_session._date_of_acquisition - ) + # ========================= 'get' methods ========================== def get_segmentation_mask_image(self) -> Image: From 483b5bbfea8ee92290cdc035863401761b03eaa2 Mon Sep 17 00:00:00 2001 From: Ahad-Allen <87045911+Ahad-Allen@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:21:39 -0800 Subject: [PATCH 08/11] Update to from_lims support only --- .../behavior/ophys_session.py | 105 +----------------- 1 file changed, 1 insertion(+), 104 deletions(-) diff --git a/allensdk/brain_observatory/behavior/ophys_session.py b/allensdk/brain_observatory/behavior/ophys_session.py index 9703b25416..dacf095206 100644 --- a/allensdk/brain_observatory/behavior/ophys_session.py +++ b/allensdk/brain_observatory/behavior/ophys_session.py @@ -80,67 +80,6 @@ def __init__( # ==================== class and utility methods ====================== - @classmethod - def from_json(cls, - session_data: dict, - monitor_delay: Optional[float] = None) \ - -> "OphysSession": - """ - - Parameters - ---------- - session_data - Dict of input data necessary to construct a session - monitor_delay - Monitor delay. If not provided, will use an estimate. - To provide this value, see for example - allensdk.brain_observatory.behavior.data_objects.stimuli.util. - calculate_monitor_delay - - Returns - ------- - `OphysSession` instance - - """ - ophys_session_id = OphysSessionId.from_json( - dict_repr=session_data) - stimulus_file = StimulusFile.from_json(dict_repr=session_data) - stimulus_timestamps = StimulusTimestamps.from_json( - dict_repr=session_data) - running_acquisition = RunningAcquisition.from_json( - dict_repr=session_data) - raw_running_speed = RunningSpeed.from_json( - dict_repr=session_data, filtered=False - ) - running_speed = RunningSpeed.from_json(dict_repr=session_data) - metadata = MultiplaneMetadata.from_json(dict_repr=session_data) - - if monitor_delay is None: - monitor_delay = cls._get_monitor_delay() - - stimuli, task_parameters = \ - cls._read_data_from_stimulus_file( - stimulus_file=stimulus_file, - stimulus_timestamps=stimulus_timestamps, - trial_monitor_delay=monitor_delay - ) - date_of_acquisition = DateOfAcquisitionOphys.from_json( - dict_repr=session_data)\ - .validate( - stimulus_file=stimulus_file, - behavior_session_id=ophys_session_id.value) - - return OphysSession( - ophys_session_id=ophys_session_id, - stimulus_timestamps=stimulus_timestamps, - running_acquisition=running_acquisition, - raw_running_speed=raw_running_speed, - running_speed=running_speed, - stimuli=stimuli, - task_parameters=task_parameters, - #trials=trials, - date_of_acquisition=date_of_acquisition - ) @classmethod def from_lims(cls, ophys_session_id: int, @@ -218,48 +157,6 @@ def from_lims(cls, ophys_session_id: int, #trials=trials, ) - @classmethod - def from_nwb(cls, nwbfile: NWBFile, **kwargs) -> "OphysSession": - ophys_session_id = OphysSessionId.from_nwb(nwbfile) - stimulus_timestamps = StimulusTimestamps.from_nwb(nwbfile) - running_acquisition = RunningAcquisition.from_nwb(nwbfile) - raw_running_speed = RunningSpeed.from_nwb(nwbfile, filtered=False) - running_speed = RunningSpeed.from_nwb(nwbfile) - stimuli = Stimuli.from_nwb(nwbfile=nwbfile) - task_parameters = TaskParameters.from_nwb(nwbfile=nwbfile) - #trials = TrialTable.from_nwb(nwbfile=nwbfile) - date_of_acquisition = DateOfAcquisition.from_nwb(nwbfile=nwbfile) - - return OphysSession( - ophys_session_id=ophys_session_id, - stimulus_timestamps=stimulus_timestamps, - running_acquisition=running_acquisition, - raw_running_speed=raw_running_speed, - running_speed=running_speed, - stimuli=stimuli, - task_parameters=task_parameters, - #trials=trials, - date_of_acquisition=date_of_acquisition - ) - - @classmethod - def from_nwb_path(cls, nwb_path: str, **kwargs) -> "OphysSession": - """ - - Parameters - ---------- - nwb_path - Path to nwb file - kwargs - Kwargs to be passed to `from_nwb` - - Returns - ------- - An instantiation of a `OphysSession` - """ - with pynwb.NWBHDF5IO(str(nwb_path), 'r') as read_io: - nwbfile = read_io.read() - return cls.from_nwb(nwbfile=nwbfile, **kwargs) def to_nwb(self, add_metadata=False) -> NWBFile: """ @@ -270,7 +167,7 @@ def to_nwb(self, add_metadata=False) -> NWBFile: Set this to False to prevent adding metadata to the nwb instance. """ - #TODO: Updates session description, start time, and experiment description + #TODO: Updates session description and experiment description nwbfile = NWBFile( session_description='Ophys Session', identifier=self._get_identifier(), From 243ed1b4ffdc40ee61ed233a455df1a15925a1e4 Mon Sep 17 00:00:00 2001 From: Ahad-Allen <87045911+Ahad-Allen@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:26:36 -0800 Subject: [PATCH 09/11] Update to support both normal and behavior ophys --- .../data_objects/running_speed/running_acquisition.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py index b8dc19bc9a..4e2761a22d 100644 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py +++ b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py @@ -24,7 +24,7 @@ StimulusFile ) from allensdk.brain_observatory.behavior.data_objects.running_speed.running_processing import ( # noqa: E501 - get_running_df + get_running_df, get_running_ophys_df ) @@ -150,7 +150,7 @@ def from_ophys_lims( stimulus_timestamps = StimulusTimestamps.from_ophys_stimulus_file( stimulus_file=stimulus_file ) - running_acq_df = get_running_df( + running_acq_df = get_running_ophys_df( data=stimulus_file.data, time=stimulus_timestamps.value, ) running_acq_df.drop("speed", axis=1, inplace=True) From d35ff3f94a83dcc0e16158928c2ced4bd3931b90 Mon Sep 17 00:00:00 2001 From: Ahad-Allen <87045911+Ahad-Allen@users.noreply.github.com> Date: Wed, 24 Nov 2021 13:27:20 -0800 Subject: [PATCH 10/11] Prevent breaking compatability with behavior ophys --- .../running_speed/running_processing.py | 111 +++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py index 97dabebc0d..74d0af411b 100644 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py +++ b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py @@ -351,8 +351,115 @@ def get_running_df( their own corrections and compute running speed from the raw source. """ - v_sig = data["items"]['foraging']["encoders"][0]["vsig"] - v_in = data["items"]['foraging']["encoders"][0]["vin"] + v_sig = data["items"]['behavior']["encoders"][0]["vsig"] + v_in = data["items"]['behavior']["encoders"][0]["vin"] + + if len(v_in) > len(time) + 1: + error_string = ("length of v_in ({}) cannot be longer than length of " + "time ({}) + 1, they are off by {}").format( + len(v_in), + len(time), + abs(len(v_in) - len(time)) + ) + raise ValueError(error_string) + if len(v_in) == len(time) + 1: + warnings.warn( + "Time array is 1 value shorter than encoder array. Last encoder " + "value removed\n", UserWarning, stacklevel=1) + v_in = v_in[:-1] + v_sig = v_sig[:-1] + + # dx = 'd_theta' = angular change + # There are some issues with angular change in the raw data so we + # recompute this value + dx_raw = data["items"]["behavior"]["encoders"][0]["dx"] + # Identify "wraps" in the voltage signal that need to be unwrapped + # This is where the encoder switches from 0V to 5V or vice versa + pos_wraps, neg_wraps = _identify_wraps( + v_sig, min_threshold=1.5, max_threshold=3.5) + # Unwrap the voltage signal and apply correction for transient spikes + unwrapped_vsig = _unwrap_voltage_signal( + v_sig, pos_wraps, neg_wraps, max_threshold=5.1, max_diff=1.0) + angular_change_point = _angular_change(unwrapped_vsig, v_in) + angular_change = np.nancumsum(angular_change_point) + # Add the nans back in (get turned to 0 in nancumsum) + angular_change[np.isnan(angular_change_point)] = np.nan + angular_speed = calc_deriv(angular_change, time) # speed in radians/s + linear_speed = deg_to_dist(angular_speed) + # Artifact correction to speed data + wrap_corrected_linear_speed = _clip_speed_wraps( + linear_speed, time, np.concatenate([pos_wraps, neg_wraps]), + t_span=0.25) + outlier_corrected_linear_speed = _zscore_threshold_1d( + wrap_corrected_linear_speed, threshold=zscore_threshold) + + # Final filtering (optional) for smoothing out the speed data + if lowpass: + b, a = signal.butter(3, Wn=4, fs=60, btype="lowpass") + outlier_corrected_linear_speed = signal.filtfilt( + b, a, np.nan_to_num(outlier_corrected_linear_speed)) + + return pd.DataFrame({ + 'speed': outlier_corrected_linear_speed[:len(time)], + 'dx': dx_raw[:len(time)], + 'v_sig': v_sig[:len(time)], + 'v_in': v_in[:len(time)], + }, index=pd.Index(time, name='timestamps')) + +def get_running_ophys_df( + data, time: np.ndarray, lowpass: bool = True, zscore_threshold=10.0 +): + """ + Given the data from the 'pkl' file object and a 1d + array of timestamps, compute the running speed. Returns a + dataframe with the raw voltage data as well as the computed speed + at each timestamp. By default, the running speed is filtered with + a 10 Hz Butterworth lowpass filter to remove artifacts caused by + the rotary encoder. + + Parameters + ---------- + data + Deserialized 'behavior pkl' file data + time: np.ndarray (1d) + Timestamps for running data measurements + lowpass: bool (default=True) + Whether to apply a 10Hz low-pass filter to the running speed + data. + zscore_threshold: float + The threshold to use for removing outlier running speeds which might + be noise and not true signal. + + Returns + ------- + pd.DataFrame + Dataframe with an index of timestamps and the following + columns: + "speed": computed running speed + "dx": angular change, computed during data collection + "v_sig": voltage signal from the encoder + "v_in": the theoretical maximum voltage that the encoder + will reach prior to "wrapping". This should + theoretically be 5V (after crossing 5V goes to 0V, or + vice versa). In practice the encoder does not always + reach this value before wrapping, which can cause + transient spikes in speed at the voltage "wraps". + The raw data are provided so that the user may compute their + own speed from source, if desired. + + Notes + ----- + Though the angular change is available in the raw data + (key="dx"), this method recomputes the angular change from the + voltage signal (key="vsig") due to very specific, low-level + artifacts in the data caused by the encoder. See method + docstrings for more detailed information. The raw data is + included in the final output in case the end user wants to apply + their own corrections and compute running speed from the raw + source. + """ + v_sig = data["items"]["foraging"]["encoders"][0]["vsig"] + v_in = data["items"]["foraging"]["encoders"][0]["vin"] if len(v_in) > len(time) + 1: error_string = ("length of v_in ({}) cannot be longer than length of " From 92f7b079dd3a941213058280282d4650b582d55a Mon Sep 17 00:00:00 2001 From: Ahad Bawany <ahad.bawany@ibs-ahadb-vm1.corp.alleninstitute.org> Date: Wed, 1 Mar 2023 09:56:17 -0800 Subject: [PATCH 11/11] Adding changes to allow for nwb fields to generate --- .../behavior/data_files/demix_file.py | 4 +- .../behavior/data_files/dff_file.py | 5 +- .../behavior/data_files/eye_tracking_file.py | 13 +-- .../behavior/data_files/stimulus_file.py | 35 ++++++- .../cell_specimens/cell_specimens.py | 6 +- .../running_speed/running_acquisition.py | 1 - .../running_speed/running_processing.py | 7 +- .../data_objects/stimuli/presentations.py | 64 ++++++++++++- .../behavior/eye_tracking_processing.py | 35 +++---- .../behavior/ophys_session.py | 29 +++++- .../behavior/stimulus_processing.py | 30 ++++-- .../ecephys/stimulus_sync.py | 53 +++++++++++ allensdk/brain_observatory/nwb/__init__.py | 16 ++++ allensdk/brain_observatory/sync_dataset.py | 80 ++++------------ allensdk/core/auth_config.py | 8 +- allensdk/core/authentication.py | 1 + allensdk/internal/core/__init__.py | 6 ++ allensdk/internal/core/_data_file.py | 95 +++++++++++++++++++ requirements.txt | 2 +- 19 files changed, 367 insertions(+), 123 deletions(-) create mode 100644 allensdk/internal/core/_data_file.py diff --git a/allensdk/brain_observatory/behavior/data_files/demix_file.py b/allensdk/brain_observatory/behavior/data_files/demix_file.py index 69aa81958d..f9a30f20ef 100644 --- a/allensdk/brain_observatory/behavior/data_files/demix_file.py +++ b/allensdk/brain_observatory/behavior/data_files/demix_file.py @@ -61,6 +61,8 @@ def load_data(filepath: Union[str, Path]) -> pd.DataFrame: with h5py.File(filepath, 'r') as in_file: traces = in_file['data'][()] roi_id = in_file['roi_names'][()] - idx = pd.Index(roi_id, name='cell_roi_id', dtype=int) + roi_id = roi_id.astype(str) + roi_id = roi_id.astype(int) + idx = pd.Index(roi_id, name='cell_roi_id') return pd.DataFrame({'corrected_fluorescence': list(traces)}, index=idx) diff --git a/allensdk/brain_observatory/behavior/data_files/dff_file.py b/allensdk/brain_observatory/behavior/data_files/dff_file.py index f36f3962af..00d7cf4848 100644 --- a/allensdk/brain_observatory/behavior/data_files/dff_file.py +++ b/allensdk/brain_observatory/behavior/data_files/dff_file.py @@ -54,6 +54,7 @@ def from_lims( AND oe.id = {}; """.format(ophys_experiment_id) filepath = db.fetchone(query, strict=True) + print(filepath) return cls(filepath=filepath) @staticmethod @@ -61,5 +62,7 @@ def load_data(filepath: Union[str, Path]) -> pd.DataFrame: with h5py.File(filepath, 'r') as raw_file: traces = np.asarray(raw_file['data'], dtype=np.float64) roi_names = np.asarray(raw_file['roi_names']) - idx = pd.Index(roi_names, name='cell_roi_id', dtype=int) + roi_names = roi_names.astype(str) + roi_names = roi_names.astype(int) + idx = pd.Index(roi_names, name='cell_roi_id') return pd.DataFrame({'dff': [x for x in traces]}, index=idx) diff --git a/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py b/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py index e8a281b786..191f1c00f0 100644 --- a/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py +++ b/allensdk/brain_observatory/behavior/data_files/eye_tracking_file.py @@ -7,7 +7,7 @@ load_eye_tracking_hdf from allensdk.internal.api import PostgresQueryMixin from allensdk.internal.core.lims_utilities import safe_system_path -from allensdk.brain_observatory.behavior.data_files import DataFile +from allensdk.internal.core import DataFile class EyeTrackingFile(DataFile): @@ -29,16 +29,17 @@ def to_json(self) -> Dict[str, str]: @classmethod def from_lims( cls, db: PostgresQueryMixin, - ophys_experiment_id: Union[int, str] + behavior_session_id: Union[int, str] ) -> "EyeTrackingFile": query = f""" SELECT wkf.storage_directory || wkf.filename AS eye_tracking_file - FROM ophys_experiments oe - LEFT JOIN well_known_files wkf ON wkf.attachable_id = oe.ophys_session_id + FROM behavior_sessions bs + JOIN ophys_sessions os ON os.id = bs.ophys_session_id + LEFT JOIN well_known_files wkf ON wkf.attachable_id = os.id JOIN well_known_file_types wkft ON wkf.well_known_file_type_id = wkft.id WHERE wkf.attachable_type = 'OphysSession' AND wkft.name = 'EyeTracking Ellipses' - AND oe.id = {ophys_experiment_id}; + AND bs.id = {behavior_session_id}; """ # noqa E501 filepath = db.fetchone(query, strict=True) return cls(filepath=filepath) @@ -47,4 +48,4 @@ def from_lims( def load_data(filepath: Union[str, Path]) -> pd.DataFrame: filepath = safe_system_path(file_name=filepath) # TODO move the contents of this function here - return load_eye_tracking_hdf(filepath) + return load_eye_tracking_hdf(filepath) \ No newline at end of file diff --git a/allensdk/brain_observatory/behavior/data_files/stimulus_file.py b/allensdk/brain_observatory/behavior/data_files/stimulus_file.py index aa818d8654..f424fdec2a 100644 --- a/allensdk/brain_observatory/behavior/data_files/stimulus_file.py +++ b/allensdk/brain_observatory/behavior/data_files/stimulus_file.py @@ -12,7 +12,22 @@ from allensdk.brain_observatory.behavior.data_files import DataFile # Query returns path to StimulusPickle file for given behavior session -STIMULUS_FILE_QUERY_TEMPLATE = """ +BEHAVIOR_STIMULUS_FILE_QUERY_TEMPLATE = """ + SELECT + wkf.storage_directory || wkf.filename AS stim_file + FROM + well_known_files wkf + WHERE + wkf.attachable_id = {behavior_session_id} + AND wkf.attachable_type = 'BehaviorSession' + AND wkf.well_known_file_type_id IN ( + SELECT id + FROM well_known_file_types + WHERE name = 'StimulusPickle'); +""" + + +NO_BEHAVIOR_STIMULUS_FILE_QUERY_TEMPLATE = """ SELECT wkf.storage_directory || wkf.filename AS stim_file FROM @@ -26,6 +41,7 @@ """ + def from_json_cache_key(cls, dict_repr: dict): return hashkey(json.dumps(dict_repr)) @@ -33,6 +49,9 @@ def from_json_cache_key(cls, dict_repr: dict): def from_lims_cache_key(cls, db, behavior_session_id: int): return hashkey(behavior_session_id) +def from_lims_nb_cache_key(cls, db, ophys_experiment_id: int): + return hashkey(ophys_experiment_id) + class StimulusFile(DataFile): """A DataFile which contains methods for accessing and loading visual @@ -61,11 +80,23 @@ def from_lims( cls, db: PostgresQueryMixin, behavior_session_id: Union[int, str] ) -> "StimulusFile": - query = STIMULUS_FILE_QUERY_TEMPLATE.format( + query = NO_BEHAVIOR_STIMULUS_FILE_QUERY_TEMPLATE.format( behavior_session_id=behavior_session_id ) filepath = db.fetchone(query, strict=True) return cls(filepath=filepath) + + @classmethod + @cached(cache=LRUCache(maxsize=10), key=from_lims_nb_cache_key) + def no_behavior_from_lims( + cls, db: PostgresQueryMixin, + ophys_experiment_id: Union[int, str] + ) -> "StimulusFile": + query = NO_BEHAVIOR_STIMULUS_FILE_QUERY_TEMPLATE.format( + experiment_id = ophys_experiment_id + ) + filepath = db.fetchone(query, strict=True) + return cls(filepath=filepath) @staticmethod def load_data(filepath: Union[str, Path]) -> dict: diff --git a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py index a626083a9f..039576db15 100644 --- a/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py +++ b/allensdk/brain_observatory/behavior/data_objects/cell_specimens/cell_specimens.py @@ -185,6 +185,7 @@ def __init__(self, roi_ids=cell_specimen_table['cell_roi_id'].values, raise_if_rois_missing=False) + self._meta = meta self._cell_specimen_table = cell_specimen_table self._dff_traces = dff_traces @@ -299,6 +300,7 @@ def _get_events(): corrected_fluorescence_traces = _get_corrected_fluorescence_traces() events = _get_events() + return CellSpecimens( cell_specimen_table=cell_specimen_table, meta=meta, dff_traces=dff_traces, @@ -525,7 +527,6 @@ def _get_segmentation_mask_image(self, spacing: tuple) -> Image: metadata """ mask_data = np.sum(self.roi_masks['roi_mask']).astype(int) - mask_image = Image( data=mask_data, spacing=spacing, @@ -578,6 +579,9 @@ def _validate_traces( for traces in (dff_traces, corrected_fluorescence_traces): # validate traces contain expected roi ids if not np.in1d(traces.value.index, cell_roi_ids).all(): +# print(traces.value.index) +# print("roi table") +# print(cell_roi_ids) raise RuntimeError(f"{traces.name} contains ROI IDs that " f"are not in " f"cell_specimen_table.cell_roi_id") diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py index 4e2761a22d..1996437fbf 100644 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py +++ b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_acquisition.py @@ -123,7 +123,6 @@ def from_lims( behavior_session_id: int, ophys_experiment_id: Optional[int] = None, ) -> "RunningAcquisition": - print("TEST", behavior_session_id) stimulus_file = StimulusFile.from_lims(db, behavior_session_id) stimulus_timestamps = StimulusTimestamps.from_stimulus_file( stimulus_file=stimulus_file diff --git a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py index 74d0af411b..20620f89b2 100644 --- a/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py +++ b/allensdk/brain_observatory/behavior/data_objects/running_speed/running_processing.py @@ -351,8 +351,9 @@ def get_running_df( their own corrections and compute running speed from the raw source. """ - v_sig = data["items"]['behavior']["encoders"][0]["vsig"] - v_in = data["items"]['behavior']["encoders"][0]["vin"] + # foraging instead of behavior? + v_sig = data["items"]['foraging']["encoders"][0]["vsig"] + v_in = data["items"]['foraging']["encoders"][0]["vin"] if len(v_in) > len(time) + 1: error_string = ("length of v_in ({}) cannot be longer than length of " @@ -372,7 +373,7 @@ def get_running_df( # dx = 'd_theta' = angular change # There are some issues with angular change in the raw data so we # recompute this value - dx_raw = data["items"]["behavior"]["encoders"][0]["dx"] + dx_raw = data["items"]["foraging"]["encoders"][0]["dx"] # Identify "wraps" in the voltage signal that need to be unwrapped # This is where the encoder switches from 0V to 5V or vice versa pos_wraps, neg_wraps = _identify_wraps( diff --git a/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py b/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py index 7797bf7631..dd5a50c230 100644 --- a/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py +++ b/allensdk/brain_observatory/behavior/data_objects/stimuli/presentations.py @@ -2,7 +2,8 @@ import pandas as pd from pynwb import NWBFile - +from pathlib import Path +from typing import Optional, List, Dict, Union from allensdk.brain_observatory.behavior.data_files import StimulusFile from allensdk.brain_observatory.behavior.data_objects import DataObject, \ StimulusTimestamps @@ -22,7 +23,30 @@ class Presentations(DataObject, StimulusFileReadableInterface, NwbReadableInterface, NwbWritableInterface): """Stimulus presentations""" - def __init__(self, presentations: pd.DataFrame): + def __init__(self, presentations: pd.DataFrame, + columns_to_rename: Optional[Dict[str, str]] = None, + column_list: Optional[List[str]] = None, + sort_columns: bool = True): + """ + Parameters + ---------- + presentations: The stimulus presentations table + columns_to_rename: Optional dict mapping + old column name -> new column name + column_list: Optional list of columns to include. + This will reorder the columns. + sort_columns: Whether to sort the columns by name + """ + if columns_to_rename is not None: + presentations = presentations.rename(columns=columns_to_rename) + if column_list is not None: + presentations = presentations[column_list] + if sort_columns: + presentations = presentations[sorted(presentations.columns)] + presentations = presentations.reset_index(drop=True) + presentations.index = pd.Index( + range(presentations.shape[0]), name='stimulus_presentations_id', + dtype='int') super().__init__(name='presentations', value=presentations) def to_nwb(self, nwbfile: NWBFile) -> NWBFile: @@ -42,6 +66,7 @@ def to_nwb(self, nwbfile: NWBFile) -> NWBFile: stimulus_name_column] == stim_name] # noqa: E501 # Drop columns where all values in column are NaN cleaned_table = specific_stimulus_table.dropna(axis=1, how='all') + # For columns with mixed strings and NaNs, fill NaNs with 'N/A' for colname, series in cleaned_table.items(): types = set(series.map(type)) @@ -60,13 +85,14 @@ def to_nwb(self, nwbfile: NWBFile) -> NWBFile: description=interval_description, columns_to_add=cleaned_table.columns ) - + for row in cleaned_table.itertuples(index=False): row = row._asdict() + presentation_interval.add_interval( **row, tags='stimulus_time_interval', timeseries=ts) - + nwbfile.add_time_intervals(presentation_interval) return nwbfile @@ -155,6 +181,36 @@ def from_stimulus_file( stim_pres_df = cls._postprocess(presentations=stim_pres_df) return Presentations(presentations=stim_pres_df) + + @classmethod + def from_path(cls, + path: Union[str, Path], + exclude_columns: Optional[List[str]] = None, + columns_to_rename: Optional[Dict[str, str]] = None, + sort_columns: bool = True + ) -> "Presentations": + """ + Reads the table directly from a precomputed csv + Parameters + ----------- + path: Path to load table from + exclude_columns: Columns to exclude + columns_to_rename: Optional d ict mapping + old column name -> new column name + sort_columns: Whether to sort the columns by name + Returns + ------- + Presentations instance + """ + path = Path(path) + df = pd.read_csv(path) + exclude_columns = exclude_columns if exclude_columns else [] + df = df[[c for c in df if c not in exclude_columns]] + return Presentations(presentations=df, + columns_to_rename=columns_to_rename, + sort_columns=sort_columns) + + @classmethod def _postprocess(cls, presentations: pd.DataFrame, fill_omitted_values=True, diff --git a/allensdk/brain_observatory/behavior/eye_tracking_processing.py b/allensdk/brain_observatory/behavior/eye_tracking_processing.py index 7333487794..3ff22a3945 100644 --- a/allensdk/brain_observatory/behavior/eye_tracking_processing.py +++ b/allensdk/brain_observatory/behavior/eye_tracking_processing.py @@ -6,14 +6,16 @@ from scipy import ndimage, stats +class EyeTrackingError(Exception): + pass + + def load_eye_tracking_hdf(eye_tracking_file: Path) -> pd.DataFrame: """Load a DeepLabCut hdf5 file containing eye tracking data into a dataframe. - Note: The eye tracking hdf5 file contains 3 separate dataframes. One for corneal reflection (cr), eye, and pupil ellipse fits. This function loads and returns this data as a single dataframe. - Parameters ---------- eye_tracking_file : Path @@ -21,7 +23,6 @@ def load_eye_tracking_hdf(eye_tracking_file: Path) -> pd.DataFrame: The hdf5 file will contain the following keys: "cr", "eye", "pupil". Each key has an associated dataframe with the following columns: "center_x", "center_y", "height", "width", "phi". - Returns ------- pd.DataFrame @@ -54,7 +55,6 @@ def determine_outliers(data_df: pd.DataFrame, """Given a dataframe and some z-score threshold return a pandas boolean Series where each entry indicates whether a given row contains at least one outlier (where outliers are calculated along columns). - Parameters ---------- data_df : pd.DataFrame @@ -62,7 +62,6 @@ def determine_outliers(data_df: pd.DataFrame, desired. (e.g. "cr_area", "eye_area", "pupil_area") z_threshold : float z-score values higher than the z_threshold will be considered outliers. - Returns ------- pd.Series @@ -78,17 +77,14 @@ def determine_outliers(data_df: pd.DataFrame, def compute_circular_area(df_row: pd.Series) -> float: """Calculate the area of the pupil as a circle using the max of the height/width as radius. - Note: This calculation assumes that the pupil is a perfect circle and any eccentricity is a result of the angle at which the pupil is being viewed. - Parameters ---------- df_row : pd.Series A row from an eye tracking dataframe containing only "pupil_width" and "pupil_height". - Returns ------- float @@ -101,7 +97,6 @@ def compute_circular_area(df_row: pd.Series) -> float: def compute_elliptical_area(df_row: pd.Series) -> float: """Calculate the area of corneal reflection (cr) or eye ellipse fits using the ellipse formula. - Parameters ---------- df_row : pd.Series @@ -109,7 +104,6 @@ def compute_elliptical_area(df_row: pd.Series) -> float: "cr_width", "cr_height" or "eye_width", "eye_height" - Returns ------- float @@ -123,7 +117,6 @@ def determine_likely_blinks(eye_areas: pd.Series, outliers: pd.Series, dilation_frames: int = 2) -> pd.Series: """Determine eye tracking frames which contain likely blinks or outliers - Parameters ---------- eye_areas : pd.Series @@ -135,7 +128,6 @@ def determine_likely_blinks(eye_areas: pd.Series, dilation_frames : int, optional Determines the number of additional adjacent frames to mark as 'likely_blink', by default 2. - Returns ------- pd.Series @@ -148,7 +140,7 @@ def determine_likely_blinks(eye_areas: pd.Series, iterations=dilation_frames) else: likely_blinks = blinks - return pd.Series(likely_blinks) + return pd.Series(likely_blinks, index=eye_areas.index) def process_eye_tracking_data(eye_data: pd.DataFrame, @@ -157,7 +149,6 @@ def process_eye_tracking_data(eye_data: pd.DataFrame, dilation_frames: int = 2) -> pd.DataFrame: """Processes and refines raw eye tracking data by adding additional computed feature columns. - Parameters ---------- eye_data : pd.DataFrame @@ -171,17 +162,15 @@ def process_eye_tracking_data(eye_data: pd.DataFrame, dilation_frames : int, optional Determines the number of additional adjacent frames to mark as 'likely_blink', by default 2. - Returns ------- pd.DataFrame A refined eye tracking dataframe that contains additional information about frame times, eye areas, pupil areas, and frames with likely blinks/outliers. - Raises ------ - RuntimeError + EyeTrackingError If the number of sync file frame times does not match the number of eye tracking frames. """ @@ -196,15 +185,15 @@ def process_eye_tracking_data(eye_data: pd.DataFrame, # This solution was discussed in # https://github.com/AllenInstitute/AllenSDK/issues/1545 - if n_sync > n_eye_frames and n_sync <= n_eye_frames+15: + if n_eye_frames < n_sync <= n_eye_frames + 15: frame_times = frame_times[:n_eye_frames] n_sync = len(frame_times) if n_sync != n_eye_frames: - raise RuntimeError(f"Error! The number of sync file frame times " - f"({len(frame_times)}) does not match the " - f"number of eye tracking frames " - f"({len(eye_data.index)})!") + raise EyeTrackingError(f"Error! The number of sync file frame times " + f"({len(frame_times)}) does not match the " + f"number of eye tracking frames " + f"({len(eye_data.index)})!") cr_areas = (eye_data[["cr_width", "cr_height"]] .apply(compute_elliptical_area, axis=1)) @@ -240,4 +229,4 @@ def process_eye_tracking_data(eye_data: pd.DataFrame, eye_data.insert(6, "cr_area_raw", cr_areas_raw) eye_data.insert(7, "eye_area_raw", eye_areas_raw) - return eye_data + return eye_data \ No newline at end of file diff --git a/allensdk/brain_observatory/behavior/ophys_session.py b/allensdk/brain_observatory/behavior/ophys_session.py index dacf095206..92d9445c7d 100644 --- a/allensdk/brain_observatory/behavior/ophys_session.py +++ b/allensdk/brain_observatory/behavior/ophys_session.py @@ -7,7 +7,8 @@ from pynwb import NWBFile -from allensdk.brain_observatory.behavior.data_files import StimulusFile +from allensdk.brain_observatory.behavior.data_files import \ + StimulusFile, SyncFile from allensdk.brain_observatory.behavior.data_objects.base \ .readable_interfaces import \ JsonReadableInterface, NwbReadableInterface, \ @@ -34,6 +35,7 @@ .ophys_experiment_metadata.multi_plane_metadata.multi_plane_metadata \ import \ MultiplaneMetadata + from allensdk.brain_observatory.behavior.trials_processing import ( construct_rolling_performance_df, calculate_reward_rate_fix_nans) from allensdk.brain_observatory.behavior.data_objects import ( @@ -84,6 +86,7 @@ def __init__( @classmethod def from_lims(cls, ophys_session_id: int, lims_db: Optional[PostgresQueryMixin] = None, + sync_file: Optional[SyncFile] = None, stimulus_timestamps: Optional[StimulusTimestamps] = None, monitor_delay: Optional[float] = None, date_of_acquisition: Optional[DateOfAcquisitionOphys] = None) \ @@ -122,6 +125,7 @@ def from_lims(cls, ophys_session_id: int, sess_id = OphysSessionId.from_lims( ophys_experiment_id=ophys_session_id, lims_db=lims_db ) + print(sess_id.value) running_acquisition = RunningAcquisition.from_ophys_lims( db = lims_db, behavior_session_id = sess_id.value @@ -141,6 +145,16 @@ def from_lims(cls, ophys_session_id: int, ophys_experiment_id=ophys_session_id, lims_db=lims_db ) + stimulus_file = StimulusFile.from_lims( + behavior_session_id=sess_id.value, db=lims_db + ) + print(stimulus_file.filepath) + ''' + stimuli, task_parameters, trials = cls._read_data_from_stimulus_file( + stimulus_file = stimulus_file, + stimulus_timestamps = stimulus_timestamps + ) + ''' if monitor_delay is None: monitor_delay = cls._get_monitor_delay() @@ -153,9 +167,17 @@ def from_lims(cls, ophys_session_id: int, raw_running_speed=raw_running_speed, running_acquisition=running_acquisition, running_speed=running_speed, - date_of_acquisition=date_of_acquisition + date_of_acquisition=date_of_acquisition, #trials=trials, + #stimuli= stimuli, + #task_parameters=task_parameters ) + + def from_json(): + return 0 + + def from_nwb(): + return 1 def to_nwb(self, add_metadata=False) -> NWBFile: @@ -453,8 +475,7 @@ def metadata(self) -> Dict[str, Any]: @classmethod def _read_data_from_stimulus_file( cls, stimulus_file: StimulusFile, - stimulus_timestamps: StimulusTimestamps, - trial_monitor_delay: float): + stimulus_timestamps: StimulusTimestamps): """Helper method to read data from stimulus file""" stimuli = Stimuli.from_stimulus_file( stimulus_file=stimulus_file, diff --git a/allensdk/brain_observatory/behavior/stimulus_processing.py b/allensdk/brain_observatory/behavior/stimulus_processing.py index a95b048656..9c1bfa8ee8 100644 --- a/allensdk/brain_observatory/behavior/stimulus_processing.py +++ b/allensdk/brain_observatory/behavior/stimulus_processing.py @@ -73,7 +73,7 @@ def get_images_dict(pkl) -> Dict: """ # Sometimes the source is a zipped pickle: - pkl_stimuli = pkl["items"]["behavior"]["stimuli"] + pkl_stimuli = pkl["stimuli"] metadata = {'image_set': pkl_stimuli["images"]["image_path"]} # Get image file name; @@ -195,8 +195,7 @@ def get_stimulus_templates( the experiment """ - - pkl_stimuli = pkl['items']['behavior']['stimuli'] + pkl_stimuli = pkl['stimuli'] if 'images' in pkl_stimuli: images = get_images_dict(pkl) image_set_filepath = images['metadata']['image_set'] @@ -271,7 +270,7 @@ def get_stimulus_metadata(pkl) -> pd.DataFrame: orientation, and image index. """ - stimuli = pkl['items']['behavior']['stimuli'] + stimuli = pkl['stimuli'] if 'images' in stimuli: images = get_images_dict(pkl) stimulus_index_df = pd.DataFrame(images['image_attributes']) @@ -404,6 +403,12 @@ def unpack_change_log(change): to_name=to_name, ) + #/allen/programs/mindscope/workgroups/np-exp/1181330601_625554_20220601/1181330601_625554_20220601.areaClassifications.csv + # 625554 + # /allen/programs/mindscope/workgroups/openscope/OPT_ILLUSION/AlignToPhysiology/625554/images/final_ccf_coordinates.csv + # /allen/programs/mindscope/workgroups/openscope/OPT_ILLUSION/AlignToPhysiology/625554/images +# Session id: 1181330601 + def get_visual_stimuli_df(data, time) -> pd.DataFrame: """ @@ -420,18 +425,23 @@ def get_visual_stimuli_df(data, time) -> pd.DataFrame: that were displayed with their frame, end_frame, start_time, and duration """ - - stimuli = data['items']['behavior']['stimuli'] + stimuli = data['stimuli'] + pd.set_option('display.max_columns', None) + print('stimuli') + # print(data) + # print(stimuli) n_frames = len(time) + print(time) visual_stimuli_data = [] - for stimuli_group_name, stim_dict in stimuli.items(): + for stim_dict in stimuli: + print(stim_dict) for idx, (attr_name, attr_value, _time, frame,) in \ - enumerate(stim_dict["set_log"]): + enumerate(stim_dict["stim"]): orientation = attr_value if attr_name.lower() == "ori" else np.nan image_name = attr_value if attr_name.lower() == "image" else np.nan stimulus_epoch = _get_stimulus_epoch( - stim_dict["set_log"], + stim_dict["stim"], idx, frame, n_frames, @@ -461,7 +471,7 @@ def get_visual_stimuli_df(data, time) -> pd.DataFrame: }) visual_stimuli_df = pd.DataFrame(data=visual_stimuli_data) - + print(visual_stimuli_df) # Add omitted flash info: try: omitted_flash_frame_log = \ diff --git a/allensdk/brain_observatory/ecephys/stimulus_sync.py b/allensdk/brain_observatory/ecephys/stimulus_sync.py index ddcd15d007..307a20a1ce 100644 --- a/allensdk/brain_observatory/ecephys/stimulus_sync.py +++ b/allensdk/brain_observatory/ecephys/stimulus_sync.py @@ -56,6 +56,7 @@ def flag_unexpected_edges(pd_times, ndevs=10): expected_duration_mask = np.ones(pd_diff.size) expected_duration_mask[np.logical_or( pd_diff < diff_mean - ndevs * diff_std, + #pd_diff < diff_mean + ndevs * diff_std pd_diff > diff_mean + ndevs * diff_std )] = 0 expected_duration_mask[1:] = np.logical_and(expected_duration_mask[:-1], expected_duration_mask[1:]) @@ -63,6 +64,22 @@ def flag_unexpected_edges(pd_times, ndevs=10): return expected_duration_mask +def flag_unexpected_edges_no_long(pd_times, ndevs=10): + pd_diff = np.diff(pd_times) + diff_mean, diff_std = trimmed_stats(pd_diff) + + expected_duration_mask = np.ones(pd_diff.size) + expected_duration_mask[np.logical_or( + pd_diff < diff_mean - ndevs * diff_std, + pd_diff < diff_mean + ndevs * diff_std + )] = 0 + expected_duration_mask[1:] = np.logical_and(expected_duration_mask[:-1], expected_duration_mask[1:]) + expected_duration_mask = np.concatenate([expected_duration_mask, [expected_duration_mask[-1]]]) + + return expected_duration_mask + + + def fix_unexpected_edges(pd_times, ndevs=10, cycle=60, max_frame_offset=4): pd_times = np.array(pd_times) @@ -101,6 +118,42 @@ def fix_unexpected_edges(pd_times, ndevs=10, cycle=60, max_frame_offset=4): return np.sort(np.concatenate([output_edges, pd_times[expected_duration_mask > 0]])) +def fix_unexpected_edges_no_long(pd_times, ndevs=10, cycle=60, max_frame_offset=4): + pd_times = np.array(pd_times) + expected_duration_mask = flag_unexpected_edges_no_long(pd_times, ndevs=ndevs) + diff_mean, diff_std = trimmed_stats(np.diff(pd_times)) + frame_interval = diff_mean / cycle + + bad_edges = np.where(expected_duration_mask == 0)[0] + bad_blocks = np.sort(np.unique(np.concatenate([ + [0], + np.where(np.diff(bad_edges) > 1)[0] + 1, + [len(bad_edges)] + ]))) + + output_edges = [] + for low, high in zip(bad_blocks[:-1], bad_blocks[1:]): + current_bad_edge_indices = bad_edges[low: high-1] + current_bad_edges = pd_times[current_bad_edge_indices] + low_bound = pd_times[current_bad_edge_indices[0]] + high_bound = pd_times[current_bad_edge_indices[-1] + 1] + + edges_missing = int(np.around((high_bound - low_bound) / diff_mean)) + expected = np.linspace(low_bound, high_bound, edges_missing + 1) + + distances = distance.cdist(current_bad_edges[:, None], expected[:, None]) + distances = np.around(distances / frame_interval).astype(int) + + min_offsets = np.amin(distances, axis=0) + min_offset_indices = np.argmin(distances, axis=0) + output_edges = np.concatenate([ + output_edges, + expected[min_offsets > max_frame_offset], + current_bad_edges[min_offset_indices[min_offsets <= max_frame_offset]] + ]) + + return np.sort(np.concatenate([output_edges, pd_times[expected_duration_mask > 0]])) + def estimate_frame_duration(pd_times, cycle=60): return trimmed_stats(np.diff(pd_times))[0] / cycle diff --git a/allensdk/brain_observatory/nwb/__init__.py b/allensdk/brain_observatory/nwb/__init__.py index 30e4fc8471..55541a6bba 100644 --- a/allensdk/brain_observatory/nwb/__init__.py +++ b/allensdk/brain_observatory/nwb/__init__.py @@ -667,6 +667,22 @@ def add_stimulus_timestamps(nwbfile, stimulus_timestamps, return nwbfile +def add_stimulus_ophys_timestamps(nwbfile, stimulus_timestamps, + module_name='stimulus_ophys'): + stimulus_ts = TimeSeries( + data=stimulus_timestamps, + name='timestamps', + timestamps=stimulus_timestamps, + unit='s' + ) + + stim_mod = ProcessingModule(module_name, 'Stimulus Times processing') + + nwbfile.add_processing_module(stim_mod) + stim_mod.add_data_interface(stimulus_ts) + + return nwbfile + def add_trials(nwbfile, trials, description_dict={}): order = list(trials.index) diff --git a/allensdk/brain_observatory/sync_dataset.py b/allensdk/brain_observatory/sync_dataset.py index 24b6faaab3..cbbf4aa275 100644 --- a/allensdk/brain_observatory/sync_dataset.py +++ b/allensdk/brain_observatory/sync_dataset.py @@ -1,18 +1,13 @@ """ dataset.py - Dataset object for loading and unpacking an HDF5 dataset generated by sync.py - @author: derricw - Allen Institute for Brain Science - Dependencies ------------ numpy http://www.numpy.org/ h5py http://www.h5py.org/ - """ import collections from typing import Union, Sequence, Optional @@ -30,14 +25,11 @@ def unpack_uint32(uint32_array, endian='L'): """ Unpacks an array of 32-bit unsigned integers into bits. - Default is least significant bit first. - *Not currently used by sync dataset because get_bit is better and does basically the same thing. I'm just leaving it in because it could potentially account for endianness and possibly have other uses in the future. - """ if not uint32_array.dtype == np.uint32: raise TypeError("Must be uint32 ndarray.") @@ -53,15 +45,15 @@ def unpack_uint32(uint32_array, endian='L'): def get_bit(uint_array, bit): """ Returns a bool array for a specific bit in a uint ndarray. - Parameters ---------- uint_array : (numpy.ndarray) The array to extract bits from. bit : (int) The bit to extract. - """ + print('uint array') + print(uint_array) return np.bitwise_and(uint_array, 2 ** bit).astype(bool).astype(np.uint8) @@ -69,31 +61,25 @@ class Dataset(object): """ A sync dataset. Contains methods for loading and parsing the binary data. - Parameters ---------- path : str Path to HDF5 file. - Examples -------- >>> dset = Dataset('my_h5_file.h5') >>> logger.info(dset.meta_data) >>> dset.stats() >>> dset.close() - >>> with Dataset('my_h5_file.h5') as d: ... logger.info(dset.meta_data) ... dset.stats() - The sync file documentation from MPE can be found at sharepoint > Instrumentation > Shared Documents > Sync_line_labels_discussion_2020-01-27-.xlsx # NOQA E501 Direct link: https://alleninstitute.sharepoint.com/:x:/s/Instrumentation/ES2bi1xJ3E9NupX-zQeXTlYBS2mVVySycfbCQhsD_jPMUw?e=Z9jCwH - - """ - FRAME_KEYS = ('frames', 'stim_vsync') + FRAME_KEYS = ('frames', 'stim_vsync', 'vsync_stim') PHOTODIODE_KEYS = ('photodiode', 'stim_photodiode') OPTOGENETIC_STIMULATION_KEYS = ("LED_sync", "opto_trial") EYE_TRACKING_KEYS = ("eye_frame_received", # Expected eye tracking @@ -103,6 +89,7 @@ class Dataset(object): # previous line label for eye tracking # (prior to ~ Oct. 2018) "eyetracking", + "eye_cam_exposing", "eye_tracking") # An undocumented, but possible eye tracking line label # NOQA E114 BEHAVIOR_TRACKING_KEYS = ("beh_frame_received", # Expected behavior line label after 3/27/2020 # NOQA E127 # clocks behavior tracking frame # NOQA E127 @@ -113,12 +100,13 @@ class Dataset(object): DEPRECATED_KEYS = set() def __init__(self, path): - print(path) self.dfile = self.load(path) self._check_line_labels() def _check_line_labels(self): if hasattr(self, "line_labels"): + print('labels') + print(self.line_labels) deprecated_keys = set(self.line_labels) & self.DEPRECATED_KEYS if deprecated_keys: warnings.warn((f"The loaded sync file contains the " @@ -133,7 +121,6 @@ def _process_times(self): """ Preprocesses the time array to account for rollovers. This is only relevant for event-based sampling. - """ times = self.get_all_events()[:, 0:1].astype(np.int64) @@ -148,12 +135,10 @@ def _process_times(self): def load(self, path): """ Loads an hdf5 sync dataset. - Parameters ---------- path : str Path to hdf5 file. - """ self.dfile = h5.File( path, 'r') # MG edit 3/15 removed 'r' because some sync files were unable to load # NOQA E501 @@ -172,23 +157,21 @@ def sample_freq(self): def get_bit(self, bit): """ Returns the values for a specific bit. - Parameters ---------- bit : int Bit to return. """ + print("bit", str(bit)) return get_bit(self.get_all_bits(), bit) def get_line(self, line): """ Returns the values for a specific line. - Parameters ---------- line : str Line to return. - """ bit = self._line_to_bit(line) return self.get_bit(bit) @@ -197,26 +180,26 @@ def get_bit_changes(self, bit): """ Returns the first derivative of a specific bit. Data points are 1 on rising edges and 255 on falling edges. - Parameters ---------- bit : int Bit for which to return changes. - """ bit_array = self.get_bit(bit) + print("bit") + print(bit) + print("bit array") + print(bit_array) return np.ediff1d(bit_array, to_begin=0) def get_line_changes(self, line): """ Returns the first derivative of a specific line. Data points are 1 on rising edges and 255 on falling edges. - Parameters ---------- line : (str) Line name for which to return changes. - """ bit = self._line_to_bit(line) return self.get_bit_changes(bit) @@ -224,19 +207,18 @@ def get_line_changes(self, line): def get_all_bits(self): """ Returns the data for all bits. - """ + print('get all bits)') + print(self.dfile['data'][()][:, -1]) return self.dfile['data'][()][:, -1] def get_all_times(self, units='samples'): """ Returns all counter values. - Parameters ---------- units : str Return times in 'samples' or 'seconds' - """ if self.meta_data['ni_daq']['counter_bits'] == 32: times = self.get_all_events()[:, 0] @@ -261,12 +243,10 @@ def get_events_by_bit(self, bit, units='samples'): """ Returns all counter values for transitions (both rising and falling) for a specific bit. - Parameters ---------- bit : int Bit for which to return events. - """ changes = self.get_bit_changes(bit) return self.get_all_times(units)[np.where(changes != 0)] @@ -275,12 +255,10 @@ def get_events_by_line(self, line, units='samples'): """ Returns all counter values for transitions (both rising and falling) for a specific line. - Parameters ---------- line : str Line for which to return events. - """ line = self._line_to_bit(line) return self.get_events_by_bit(line, units) @@ -289,12 +267,10 @@ def _line_to_bit(self, line): """ Returns the bit for a specified line. Either line name and number is accepted. - Parameters ---------- line : str Line name for which to return corresponding bit. - """ if type(line) is int: return line @@ -306,7 +282,6 @@ def _line_to_bit(self, line): def _bit_to_line(self, bit): """ Returns the line name for a specified bit. - Parameters ---------- bit : int @@ -318,15 +293,17 @@ def get_rising_edges(self, line, units='samples'): """ Returns the counter values for the rizing edges for a specific bit or line. - Parameters ---------- line : str Line for which to return edges. - """ + print('rising line:') + print(line) bit = self._line_to_bit(line) changes = self.get_bit_changes(bit) + print("changes") + print(changes) return self.get_all_times(units)[np.where(changes == 1)] def get_edges( @@ -337,7 +314,6 @@ def get_edges( permissive: bool = False ) -> Optional[np.ndarray]: """ Utility function for extracting edge times from a line - Parameters ---------- kind : One of "rising", "falling", or "all". Should this method return @@ -349,17 +325,14 @@ def get_edges( "time"stamps will be given in these units. raise_missing : If True and no matching line is found, a KeyError will be raised - Returns ------- An array of edge times. If raise_missing is False and none of the keys were found, returns None. - Raises ------ KeyError : none of the provided keys were found among this dataset's line labels - """ if kind == 'falling': fn = self.get_falling_edges @@ -388,12 +361,10 @@ def get_falling_edges(self, line, units='samples'): """ Returns the counter values for the falling edges for a specific bit or line. - Parameters ---------- line : str Line for which to return edges. - """ bit = self._line_to_bit(line) changes = self.get_bit_changes(bit) @@ -410,9 +381,7 @@ def get_nearest(self, """ For all values of the source line, finds the nearest edge from the target line. - By default, returns the indices of the target edges. - Args: source (str, int): desired source line target (str, int): desired target line @@ -421,7 +390,6 @@ def get_nearest(self, direction (str): "previous" or "next". Whether to prefer the previous edge or the following edge. units (str): "indices" - """ source_edges = getattr(self, "get_{}_edges".format(source_edge.lower()))(source.lower(), units="samples") # NOQA E501 @@ -450,19 +418,15 @@ def get_analog_channel(self, """ Returns the data from the specified analog channel between the timepoints. - Args: channel (int, str): desired channel index or label start_time (Optional[float]): start time in seconds stop_time (Optional[float]): stop time in seconds downsample (Optional[int]): downsample factor - Returns: ndarray: slice of data for specified channel - Raises: KeyError: no analog data present - """ if isinstance(channel, str): channel_index = self.analog_meta_data['analog_labels'].index( @@ -499,9 +463,7 @@ def analog_meta_data(self): def line_stats(self, line, print_results=True): """ Quick-and-dirty analysis of a bit. - ##TODO: Split this up into smaller functions. - """ # convert to bit bit = self._line_to_bit(line) @@ -632,9 +594,7 @@ def frequency(self, line, edge="rising"): def duty_cycle(self, line): """ Doesn't work right now. Freezes python for some reason. - Returns the duty cycle of a line. - """ return "fix me" bit = self._line_to_bit(line) @@ -693,9 +653,7 @@ def plot_all(self, ): """ Plot all active bits. - Yikes. Come up with a better way to show this. - """ import matplotlib.pyplot as plt for bit in range(32): @@ -834,12 +792,10 @@ def close(self): def __enter__(self): """ So we can use context manager (with...as) like any other open file. - Examples -------- >>> with Dataset('my_data.h5') as d: ... d.stats() - """ return self @@ -851,4 +807,4 @@ def __exit__(self, type, value, traceback): if __name__ == '__main__': - pass + pass \ No newline at end of file diff --git a/allensdk/core/auth_config.py b/allensdk/core/auth_config.py index 845090065d..fee35d70c0 100644 --- a/allensdk/core/auth_config.py +++ b/allensdk/core/auth_config.py @@ -1,10 +1,10 @@ CREDENTIAL_KEYS = [ # key, default value - ("LIMS_DBNAME", None), - ("LIMS_USER", None), - ("LIMS_HOST", None), + ("LIMS_DBNAME", "lims2"), + ("LIMS_USER", "limsreader"), + ("LIMS_HOST", "limsdb2"), ("LIMS_PORT", 5432), - ("LIMS_PASSWORD", None), + ("LIMS_PASSWORD", "limsro"), ("MTRAIN_DBNAME", None), ("MTRAIN_USER", None), ("MTRAIN_HOST", None), diff --git a/allensdk/core/authentication.py b/allensdk/core/authentication.py index 48867c2eab..bf966170f5 100644 --- a/allensdk/core/authentication.py +++ b/allensdk/core/authentication.py @@ -94,6 +94,7 @@ def credential_injector(credential_map: Dict[str, Any], def injector_decorator(func): @wraps(func) def wrapper(*args, **kwargs): + for kw, credential in credential_map.items(): if kw not in kwargs.keys(): logger.info(f"No explicit value provided for {kw}. " diff --git a/allensdk/internal/core/__init__.py b/allensdk/internal/core/__init__.py index e69de29bb2..75ceeada05 100644 --- a/allensdk/internal/core/__init__.py +++ b/allensdk/internal/core/__init__.py @@ -0,0 +1,6 @@ +""" +``allensdk.internal.core`` provides general modules for interacting +with on-prem resources +""" + +from ._data_file import DataFile # noqa F401 \ No newline at end of file diff --git a/allensdk/internal/core/_data_file.py b/allensdk/internal/core/_data_file.py new file mode 100644 index 0000000000..6742f721e7 --- /dev/null +++ b/allensdk/internal/core/_data_file.py @@ -0,0 +1,95 @@ +import abc +from pathlib import Path +from typing import Union, Any + +from allensdk.internal.core.lims_utilities import safe_system_path + + +class DataFile(abc.ABC): + """An abstract class that prototypes methods for accessing internal + data files. + These data files contain information necessary to successfully instantiate + one or many `DataObject`(s). + External users should ignore this class (and subclasses) as as they + will only ever be using `from_nwb()` and `to_nwb()` `DataObject` methods. + Attributes + ---------- + filepath : str or pathlib.Path + Path to file. + """ + + def __init__(self, + filepath: Union[str, Path], + **kwargs): # pragma: no cover + self._filepath: str = safe_system_path(str(filepath)) + self._data = self.load_data(filepath=self._filepath, **kwargs) + + @property + def data(self) -> Any: # pragma: no cover + return self._data + + @property + def filepath(self) -> str: # pragma: no cover + return self._filepath + + @classmethod + @abc.abstractmethod + def from_json(cls, + dict_repr: dict) -> "DataFile": # pragma: no cover + """Populates a DataFile from a JSON compatible dict (likely parsed by + argschema) + Returns + ------- + DataFile: + An instantiated DataFile which has `data` and `filepath` properties + """ + # Example: + # filepath = dict_repr["my_data_file_path"] + # return cls.instantiate(filepath=filepath) + raise NotImplementedError() + + @abc.abstractmethod + def to_json(self) -> dict: # pragma: no cover + """Given an already populated DataFile, return the dict that + when used with the `from_json()` classmethod would produce the same + DataFile + Returns + ------- + dict: + The JSON (in dict form) that would produce the DataFile. + """ + raise NotImplementedError() + + @classmethod + @abc.abstractmethod + def from_lims(cls) -> "DataFile": # pragma: no cover + """Populate a DataFile from an internal database (likely LIMS) + Returns + ------- + DataFile: + An instantiated DataFile which has `data` and `filepath` properties + """ + # Example: + # query = """SELECT my_file FROM some_lims_table""" + # filepath = dbconn.fetchone(query, strict=True) + # return cls.instantiate(filepath=filepath) + raise NotImplementedError() + + @staticmethod + @abc.abstractmethod + def load_data(filepath: Union[str, Path], + **kwargs) -> Any: # pragma: no cover + """Given a filepath (that is meant to by read by the DataFile type), + load the contents of the file into a Python type. + (dict, DataFrame, list, etc...) + Parameters + ---------- + filepath : Union[str, Path] + The filepath that the DataFile class should load. + Returns + ------- + Any + A Python data type that has been parsed/loaded from the provided + filepath. + """ + raise NotImplementedError() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 294a8ea24b..c9ab928717 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ hdmf<2.5.0 h5py>=2.8,<3.0.0 matplotlib>=1.4.3,<3.4.3 numpy>=1.15.4,<1.19.0 -pandas>=0.25.1,<=0.25.3 +pandas jinja2>=2.7.3,<2.12.0 scipy>=1.4.0,<2.0.0 six>=1.9.0,<2.0.0